diff --git a/.dockerignore b/.dockerignore index d280741c6062..0c013d18b13f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,7 +1,3 @@ -**/.git -.git -!.git/HEAD -!.git/refs/heads **/*_test.go build/_workspace diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0a09baef7d24..6286617d054b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -2,31 +2,22 @@ # Each line is a file pattern followed by one or more owners. accounts/usbwallet @karalabe +accounts/scwallet @gballet +accounts/abi @gballet +cmd/clef @holiman +cmd/puppeth @karalabe consensus @karalabe -core/ @karalabe @holiman -eth/ @karalabe -les/ @zsfelfoldi -light/ @zsfelfoldi -mobile/ @karalabe +core/ @karalabe @holiman @rjl493456442 +dashboard/ @kurkomisi +eth/ @karalabe @holiman @rjl493456442 +graphql/ @gballet +les/ @zsfelfoldi @rjl493456442 +light/ @zsfelfoldi @rjl493456442 +mobile/ @karalabe @ligi p2p/ @fjl @zsfelfoldi -swarm/bmt @zelig -swarm/dev @lmars -swarm/fuse @jmozah @holisticode -swarm/grafana_dashboards @nonsense -swarm/metrics @nonsense @holisticode -swarm/multihash @nolash -swarm/network/bitvector @zelig @janos @gbalint -swarm/network/priorityqueue @zelig @janos @gbalint -swarm/network/simulations @zelig -swarm/network/stream @janos @zelig @gbalint @holisticode @justelad -swarm/network/stream/intervals @janos -swarm/network/stream/testing @zelig -swarm/pot @zelig -swarm/pss @nolash @zelig @nonsense -swarm/services @zelig -swarm/state @justelad -swarm/storage/encryption @gbalint @zelig @nagydani -swarm/storage/mock @janos -swarm/storage/mru @nolash -swarm/testutil @lmars +rpc/ @fjl @holiman +p2p/simulations @zelig @nonsense @janos @justelad +p2p/protocols @zelig @nonsense @janos @justelad +p2p/testing @zelig @nonsense @janos @justelad +signer/ @holiman whisper/ @gballet @gluk256 diff --git a/.github/no-response.yml b/.github/no-response.yml index b6e96efdc6c7..903d4ce85f35 100644 --- a/.github/no-response.yml +++ b/.github/no-response.yml @@ -1,7 +1,7 @@ # Number of days of inactivity before an Issue is closed for lack of response daysUntilClose: 30 # Label requiring a response -responseRequiredLabel: more-information-needed +responseRequiredLabel: "need:more-information" # Comment to post when closing an Issue for lack of response. Set to `false` to disable closeComment: > This issue has been automatically closed because there has been no response diff --git a/.github/stale.yml b/.github/stale.yml index c621939c3f63..6d921cc795ff 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -7,7 +7,7 @@ exemptLabels: - pinned - security # Label to use when marking an issue as stale -staleLabel: stale +staleLabel: "status:inactive" # Comment to post when marking an issue as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had diff --git a/.gitignore b/.gitignore index 3e0009e167f9..3016facee0a3 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ profile.cov /dashboard/assets/node_modules /dashboard/assets/stats.json /dashboard/assets/bundle.js +/dashboard/assets/bundle.js.map /dashboard/assets/package-lock.json **/yarn-error.log diff --git a/.travis.yml b/.travis.yml index 76cc133dbb0e..36defe308be0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,39 +4,46 @@ sudo: false matrix: include: - os: linux - dist: trusty - sudo: required + dist: xenial go: 1.10.x script: - - sudo modprobe fuse - - sudo chmod 666 /dev/fuse - - sudo chown root:$USER /etc/fuse.conf - go run build/ci.go install - go run build/ci.go test -coverage $TEST_PACKAGES - # These are the latest Go versions. - os: linux - dist: trusty - sudo: required + dist: xenial go: 1.11.x script: - - sudo modprobe fuse - - sudo chmod 666 /dev/fuse - - sudo chown root:$USER /etc/fuse.conf + - go run build/ci.go install + - go run build/ci.go test -coverage $TEST_PACKAGES + + # These are the latest Go versions. + - os: linux + dist: xenial + go: 1.12.x + script: - go run build/ci.go install - go run build/ci.go test -coverage $TEST_PACKAGES - os: osx - go: 1.11.x + go: 1.12.x script: + - echo "Increase the maximum number of open file descriptors on macOS" + - NOFILE=20480 + - sudo sysctl -w kern.maxfiles=$NOFILE + - sudo sysctl -w kern.maxfilesperproc=$NOFILE + - sudo launchctl limit maxfiles $NOFILE $NOFILE + - sudo launchctl limit maxfiles + - ulimit -S -n $NOFILE + - ulimit -n - unset -f cd # workaround for https://github.com/travis-ci/travis-ci/issues/8703 - go run build/ci.go install - go run build/ci.go test -coverage $TEST_PACKAGES # This builder only tests code linters on latest version of Go - os: linux - dist: trusty - go: 1.11.x + dist: xenial + go: 1.12.x env: - lint git: @@ -45,9 +52,10 @@ matrix: - go run build/ci.go lint # This builder does the Ubuntu PPA upload - - os: linux - dist: trusty - go: 1.11.x + - if: type = push + os: linux + dist: xenial + go: 1.12.x env: - ubuntu-ppa git: @@ -59,14 +67,18 @@ matrix: - debhelper - dput - fakeroot + - python-bzrlib + - python-paramiko script: - - go run build/ci.go debsrc -signer "Go Ethereum Linux Builder " -upload ppa:ethereum/ethereum + - echo '|1|7SiYPr9xl3uctzovOTj4gMwAC1M=|t6ReES75Bo/PxlOPJ6/GsGbTrM0= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0aKz5UTUndYgIGG7dQBV+HaeuEZJ2xPHo2DS2iSKvUL4xNMSAY4UguNW+pX56nAQmZKIZZ8MaEvSj6zMEDiq6HFfn5JcTlM80UwlnyKe8B8p7Nk06PPQLrnmQt5fh0HmEcZx+JU9TZsfCHPnX7MNz4ELfZE6cFsclClrKim3BHUIGq//t93DllB+h4O9LHjEUsQ1Sr63irDLSutkLJD6RXchjROXkNirlcNVHH/jwLWR5RcYilNX7S5bIkK8NlWPjsn/8Ua5O7I9/YoE97PpO6i73DTGLh5H9JN/SITwCKBkgSDWUt61uPK3Y11Gty7o2lWsBjhBUm2Y38CBsoGmBw==' >> ~/.ssh/known_hosts + - go run build/ci.go debsrc -upload ethereum/ethereum -sftp-user geth-ci -signer "Go Ethereum Linux Builder " # This builder does the Linux Azure uploads - - os: linux - dist: trusty + - if: type = push + os: linux + dist: xenial sudo: required - go: 1.11.x + go: 1.12.x env: - azure-linux git: @@ -96,11 +108,12 @@ matrix: - go run build/ci.go archive -arch arm64 -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds # This builder does the Linux Azure MIPS xgo uploads - - os: linux - dist: trusty + - if: type = push + os: linux + dist: xenial services: - docker - go: 1.11.x + go: 1.12.x env: - azure-linux-mips git: @@ -123,8 +136,9 @@ matrix: - go run build/ci.go archive -arch mips64le -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds # This builder does the Android Maven and Azure uploads - - os: linux - dist: trusty + - if: type = push + os: linux + dist: xenial addons: apt: packages: @@ -144,24 +158,24 @@ matrix: git: submodules: false # avoid cloning ethereum/tests before_install: - - curl https://storage.googleapis.com/golang/go1.11.linux-amd64.tar.gz | tar -xz + - curl https://dl.google.com/go/go1.12.linux-amd64.tar.gz | tar -xz - export PATH=`pwd`/go/bin:$PATH - export GOROOT=`pwd`/go - export GOPATH=$HOME/go script: # Build the Android archive and upload it to Maven Central and Azure - - curl https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip -o android-ndk-r17b.zip - - unzip -q android-ndk-r17b.zip && rm android-ndk-r17b.zip - - mv android-ndk-r17b $HOME - - export ANDROID_NDK=$HOME/android-ndk-r17b + - curl https://dl.google.com/android/repository/android-ndk-r19b-linux-x86_64.zip -o android-ndk-r19b.zip + - unzip -q android-ndk-r19b.zip && rm android-ndk-r19b.zip + - mv android-ndk-r19b $ANDROID_HOME/ndk-bundle - mkdir -p $GOPATH/src/github.com/ethereum - - ln -s `pwd` $GOPATH/src/github.com/ethereum + - ln -s `pwd` $GOPATH/src/github.com/ethereum/go-ethereum - go run build/ci.go aar -signer ANDROID_SIGNING_KEY -deploy https://oss.sonatype.org -upload gethstore/builds # This builder does the OSX Azure, iOS CocoaPods and iOS Azure uploads - - os: osx - go: 1.11.x + - if: type = push + os: osx + go: 1.12.x env: - azure-osx - azure-ios @@ -188,19 +202,13 @@ matrix: - go run build/ci.go xcode -signer IOS_SIGNING_KEY -deploy trunk -upload gethstore/builds # This builder does the Azure archive purges to avoid accumulating junk - - os: linux - dist: trusty - go: 1.11.x + - if: type = cron + os: linux + dist: xenial + go: 1.12.x env: - azure-purge git: submodules: false # avoid cloning ethereum/tests script: - go run build/ci.go purge -store gethstore/builds -days 14 - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/e09ccdce1048c5e03445 - on_success: change - on_failure: always diff --git a/AUTHORS b/AUTHORS index 609dc48c726b..526ea35c2f83 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,5 +1,11 @@ # This is the official list of go-ethereum authors for copyright purposes. +a e r t h +Abel Nieto +Abel Nieto +Adam Babik +Aditya +Adrià Cidre Afri Schoedon <5chdn@users.noreply.github.com> Agustin Armellini Fischer Airead @@ -10,165 +16,354 @@ Alex Leverington Alex Wu Alexandre Van de Sande Ali Hajimirza +am2rican5 +Andrea Franz +Andrey Petrov +Andrey Petrov +ANOTHEL +Antoine Rondelet Anton Evangelatov +Antonio Salazar Cardozo Arba Sasmoyo Armani Ferrante Armin Braun Aron Fischer +atsushi-ishibashi +ayeowch +b00ris +bailantaotao +baizhenxuan +Balint Gabor Bas van Kervel Benjamin Brent +benma Benoit Verkindt +bloonfield Bo Bo Ye Bob Glickstein +Brent Brian Schroeder +Bruno Škvorc +C. Brown +Caesar Chad Casey Detrio +CDsigma +changhong Chase Wright +Chen Quan +chenyufeng +Christian Muehlhaeuser Christoph Jentzsch +cong +Corey Lin <514971757@qq.com> +cpusoft +Crispin Flowerday +croath +cui <523516579@qq.com> +Dan Kinsley Daniel A. Nagy Daniel Sloof Darrel Herbst Dave Appleton +Dave McGregor +David Huie +Derek Gottfrid Diego Siqueira +Diep Pham +dipingxian2 <39109351+dipingxian2@users.noreply.github.com> +dm4 +Dmitrij Koniajev Dmitry Shulyak +Domino Valdano +Domino Valdano +Dragan Milic +dragonvslinux <35779158+dragononcrypto@users.noreply.github.com> Egon Elbre +Elad +Eli Elias Naur Elliot Shepherd +Emil +emile Enrique Fynn +Enrique Fynn +EOS Classic +Erichin Ernesto del Toro Ethan Buchman +ethersphere Eugene Valeyev Evangelos Pappas +Evgeny Evgeny Danilenko <6655321@bk.ru> +evgk Fabian Vogelsteller Fabio Barone Fabio Berger FaceHo Felix Lange +Ferenc Szabo +ferhat elmas Fiisio +Frank Szendzielarz <33515470+FrankSzendzielarz@users.noreply.github.com> Frank Wang +Franklin Furkan KAMACI +GagziW Gary Rong George Ornbo Gregg Dourgarian +Guilherme Salgado Guillaume Ballet Guillaume Nicolas +GuiltyMorishita +Gus Gustav Simonsson +Gísli Kristjánsson +Ha ĐANG +HackyMiner +hadv Hao Bryan Cheng +HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com> Henning Diedrich +holisticode +Hongbin Mao +Hsien-Tang Kao +Husam Ibrahim <39692071+HusamIbrahim@users.noreply.github.com> +hydai +Hyung-Kyu Hqueue Choi +Ian Macalinao +Ian Norden Isidoro Ghezzi +Iskander (Alex) Sharipov Ivan Daniluk +Ivo Georgiev Jae Kwon Jamie Pitts +Janos Guljas Janoš Guljaš Jason Carver +Javier Peletier +Javier Peletier +Javier Sagredo +Jay Jay Guo +Jaynti Kanani +Jeff Prestes Jeff R. Allen +Jeffery Robert Walsh Jeffrey Wilcke Jens Agerberg +Jeremy McNevin +Jeremy Schlatter +Jerzy Lasyk Jia Chenhui Jim McDonald +jkcomment Joel Burget +John C. Vernaleo +Johns Beharry +Jonas Jonathan Brown +JoranHonig +Jordan Krage Joseph Chow +jtakalai +JU HYEONG PARK Justin Clark-Casey Justin Drake +jwasinger +ken10100147 Kenji Siu +Kenso Trabing +Kenso Trabing +Kevin +kevin.xu +kiel barry +kimmylin <30611210+kimmylin@users.noreply.github.com> +Kitten King <53072918+kittenking@users.noreply.github.com> +knarfeh Kobi Gurkan Konrad Feldmeier +Kris Shinn Kurkó Mihály +Kushagra Sharma +Kwuaint <34888408+kwuaint@users.noreply.github.com> Kyuntae Ethan Kim +ledgerwatch Lefteris Karapetsas Leif Jurvetson Leo Shklovskii +LeoLiao Lewis Marshall +lhendre +Liang Ma +Liang Ma +Liang ZOU +libotony +ligi Lio李欧 +Lorenzo Manacorda Louis Holbrook Luca Zeug Magicking +manlio Maran Hidskes Marek Kotewicz +Marius van der Wijden Mark +Mark Rushakoff +mark.lin +Martin Alex Philip Dawson Martin Holst Swende +Martin Klepsch +Mats Julian Olsen +Matt K <1036969+mkrump@users.noreply.github.com> Matthew Di Ferrante +Matthew Halpern +Matthew Halpern Matthew Wampler-Doty +Max Sistemich Maximilian Meister Micah Zoltu Michael Ruminer Miguel Mota Miya Chen +Mohanson +mr_franklin +Mymskmkt <1847234666@qq.com> +Nalin Bhardwaj Nchinda Nchinda +necaremus +needkane <604476380@qq.com> +Nguyen Kien Trung +Nguyen Sy Thanh Son Nick Dodson Nick Johnson Nicolas Guillaume +Nilesh Trivedi +Nimrod Gutman +njupt-moon <1015041018@njupt.edu.cn> +nkbai +nobody Noman +Oleg Kovalov Oli Bye +Osuke +Paul Berg Paul Litvak Paulo L F Casaretto Paweł Bylica +Pedro Pombeiro +Peter Broadhurst Peter Pratscher Petr Mikusek +Philip Schlump +Pierre Neter +PilkyuJung +protolambda Péter Szilágyi -RJ Catalano +qd-ethan <31876119+qdgogogo@users.noreply.github.com> +Raghav Sood +Ralph Caraveo +Ralph Caraveo III Ramesh Nair +reinerRubin +rhaps107 Ricardo Catalinas Jiménez Ricardo Domingos Richard Hart +RJ Catalano Rob +Rob Mulholand Robert Zaremba +Roc Yu +Runchao Han Russ Cox +Ryan Schneider Rémy Roy S. Matthew English +salanfe +Samuel Marks +Sarlor +Sasuke1964 +Saulius Grigaitis +Sean +Sheldon <11510383@mail.sustc.edu.cn> +Sheldon <374662347@qq.com> Shintaro Kaneko +Shuai Qi +Shunsuke Watanabe +silence +Simon Jentzsch +slumber1122 +Smilenator Sorin Neacsu Stein Dekker +Steve Gattuso +Steve Ruckdashel Steve Waldman Steven Roose +stompesi +stormpang +sunxiaojun2014 +tamirms Taylor Gerring +TColl <38299499+TColl@users.noreply.github.com> +terasum Thomas Bocek +thomasmodeneis +thumb8432 Ti Zhou Tosh Camille +tsarpaul +tzapu +ult-bobonovski Valentin Wüstholz +Vedhavyas Singareddi Victor Farazdagi Victor Tran +Vie Viktor Trón Ville Sundell +vim88 Vincent G +Vincent Serpoul Vitalik Buterin +Vitaly Bogdanov Vitaly V Vivek Anand +Vlad +Vlad Bokov Vlad Gluhovsky +weimumu <934657014@qq.com> +Wenbiao Zheng +William Setzer +williambannas +Wuxiang +xiekeyang +xincaosu +yahtoo +YaoZengzeng +YH-Zhou Yohann Léon Yoichi Hirai Yondon Fu +YOSHIDA Masanori +yoza +Yusup Zach +zah Zahoor Mohamed +Zak Cole +zer0to0ne <36526113+zer0to0ne@users.noreply.github.com> +Zhenguo Niu Zoe Nolan Zsolt Felföldi -am2rican5 -ayeowch -b00ris -bailantaotao -baizhenxuan -bloonfield -changhong -evgk -ferhat elmas -holisticode -jtakalai -ken10100147 -ligi -mark.lin -necaremus -njupt-moon <1015041018@njupt.edu.cn> -nkbai -rhaps107 -slumber1122 -sunxiaojun2014 -terasum -tsarpaul -xiekeyang -yoza +Łukasz Kurowski ΞTHΞЯSPHΞЯΞ <{viktor.tron,nagydani,zsfelfoldi}@gmail.com> Максим Чусовлянов -Ralph Caraveo +大彬 +贺鹏飞 +유용환 <33824408+eric-yoo@users.noreply.github.com> diff --git a/Dockerfile b/Dockerfile index e87dd35d3215..c766576a8f18 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # Build Geth in a stock Go builder container -FROM golang:1.11-alpine as builder +FROM golang:1.12-alpine as builder -RUN apk add --no-cache make gcc musl-dev linux-headers +RUN apk add --no-cache make gcc musl-dev linux-headers git ADD . /go-ethereum RUN cd /go-ethereum && make geth diff --git a/Dockerfile.alltools b/Dockerfile.alltools index e984a1b092bf..a4adba9d5b99 100644 --- a/Dockerfile.alltools +++ b/Dockerfile.alltools @@ -1,7 +1,7 @@ # Build Geth in a stock Go builder container -FROM golang:1.11-alpine as builder +FROM golang:1.12-alpine as builder -RUN apk add --no-cache make gcc musl-dev linux-headers +RUN apk add --no-cache make gcc musl-dev linux-headers git ADD . /go-ethereum RUN cd /go-ethereum && make all diff --git a/Makefile b/Makefile index 966bf9cbbaaa..4bf52f5c9626 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # with Go source code. If you know what GOPATH is then you probably # don't need to bother with make. -.PHONY: geth android ios geth-cross swarm evm all test clean +.PHONY: geth android ios geth-cross evm all test clean .PHONY: geth-linux geth-linux-386 geth-linux-amd64 geth-linux-mips64 geth-linux-mips64le .PHONY: geth-linux-arm geth-linux-arm-5 geth-linux-arm-6 geth-linux-arm-7 geth-linux-arm64 .PHONY: geth-darwin geth-darwin-386 geth-darwin-amd64 @@ -16,11 +16,6 @@ geth: @echo "Done building." @echo "Run \"$(GOBIN)/geth\" to launch geth." -swarm: - build/env.sh go run build/ci.go install ./cmd/swarm - @echo "Done building." - @echo "Run \"$(GOBIN)/swarm\" to launch swarm." - all: build/env.sh go run build/ci.go install @@ -57,9 +52,6 @@ devtools: @type "solc" 2> /dev/null || echo 'Please install solc' @type "protoc" 2> /dev/null || echo 'Please install protoc' -swarm-devtools: - env GOBIN= go install ./cmd/swarm/mimegen - # Cross Compilation Targets (xgo) geth-cross: geth-linux geth-darwin geth-windows geth-android geth-ios diff --git a/README.md b/README.md index f308fb101152..fd25941543b9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## Go Ethereum -Official golang implementation of the Ethereum protocol. +Official Golang implementation of the Ethereum protocol. [![API Reference]( https://camo.githubusercontent.com/915b7be44ada53c290eb157634330494ebe3e30a/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f676f6c616e672f6764646f3f7374617475732e737667 @@ -9,303 +9,336 @@ https://camo.githubusercontent.com/915b7be44ada53c290eb157634330494ebe3e30a/6874 [![Travis](https://travis-ci.org/ethereum/go-ethereum.svg?branch=master)](https://travis-ci.org/ethereum/go-ethereum) [![Discord](https://img.shields.io/badge/discord-join%20chat-blue.svg)](https://discord.gg/nthXNEv) -Automated builds are available for stable releases and the unstable master branch. -Binary archives are published at https://geth.ethereum.org/downloads/. +Automated builds are available for stable releases and the unstable master branch. Binary +archives are published at https://geth.ethereum.org/downloads/. ## Building the source -For prerequisites and detailed build instructions please read the -[Installation Instructions](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum) -on the wiki. +For prerequisites and detailed build instructions please read the [Installation Instructions](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum) on the wiki. -Building geth requires both a Go (version 1.7 or later) and a C compiler. -You can install them using your favourite package manager. -Once the dependencies are installed, run +Building `geth` requires both a Go (version 1.10 or later) and a C compiler. You can install +them using your favourite package manager. Once the dependencies are installed, run - make geth +```shell +make geth +``` or, to build the full suite of utilities: - make all +```shell +make all +``` ## Executables -The go-ethereum project comes with several wrappers/executables found in the `cmd` directory. +The go-ethereum project comes with several wrappers/executables found in the `cmd` +directory. -| Command | Description | -|:----------:|-------------| -| **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default), archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | -| `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | -| `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow isolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | -| `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | -| `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | -| `swarm` | Swarm daemon and tools. This is the entrypoint for the Swarm network. `swarm --help` for command line options and subcommands. See [Swarm README](https://github.com/ethereum/go-ethereum/tree/master/swarm) for more information. | -| `puppeth` | a CLI wizard that aids in creating a new Ethereum network. | +| Command | Description | +| :-----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default), archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | +| `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However, it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | +| `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | +| `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow isolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | +| `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | +| `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user-friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | +| `puppeth` | a CLI wizard that aids in creating a new Ethereum network. | -## Running geth +## Running `geth` Going through all the possible command line flags is out of scope here (please consult our -[CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options)), but we've -enumerated a few common parameter combos to get you up to speed quickly on how you can run your -own Geth instance. +[CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options)), +but we've enumerated a few common parameter combos to get you up to speed quickly +on how you can run your own `geth` instance. ### Full node on the main Ethereum network -By far the most common scenario is people wanting to simply interact with the Ethereum network: -create accounts; transfer funds; deploy and interact with contracts. For this particular use-case -the user doesn't care about years-old historical data, so we can fast-sync quickly to the current -state of the network. To do so: +By far the most common scenario is people wanting to simply interact with the Ethereum +network: create accounts; transfer funds; deploy and interact with contracts. For this +particular use-case the user doesn't care about years-old historical data, so we can +fast-sync quickly to the current state of the network. To do so: -``` +```shell $ geth console ``` This command will: - - * Start geth in fast sync mode (default, can be changed with the `--syncmode` flag), causing it to - download more data in exchange for avoiding processing the entire history of the Ethereum network, - which is very CPU intensive. - * Start up Geth's built-in interactive [JavaScript console](https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console), + * Start `geth` in fast sync mode (default, can be changed with the `--syncmode` flag), + causing it to download more data in exchange for avoiding processing the entire history + of the Ethereum network, which is very CPU intensive. + * Start up `geth`'s built-in interactive [JavaScript console](https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console), (via the trailing `console` subcommand) through which you can invoke all official [`web3` methods](https://github.com/ethereum/wiki/wiki/JavaScript-API) - as well as Geth's own [management APIs](https://github.com/ethereum/go-ethereum/wiki/Management-APIs). - This tool is optional and if you leave it out you can always attach to an already running Geth instance - with `geth attach`. + as well as `geth`'s own [management APIs](https://github.com/ethereum/go-ethereum/wiki/Management-APIs). + This tool is optional and if you leave it out you can always attach to an already running + `geth` instance with `geth attach`. -### Full node on the Ethereum test network +### A Full node on the Ethereum test network -Transitioning towards developers, if you'd like to play around with creating Ethereum contracts, you -almost certainly would like to do that without any real money involved until you get the hang of the -entire system. In other words, instead of attaching to the main network, you want to join the **test** -network with your node, which is fully equivalent to the main network, but with play-Ether only. +Transitioning towards developers, if you'd like to play around with creating Ethereum +contracts, you almost certainly would like to do that without any real money involved until +you get the hang of the entire system. In other words, instead of attaching to the main +network, you want to join the **test** network with your node, which is fully equivalent to +the main network, but with play-Ether only. -``` +```shell $ geth --testnet console ``` -The `console` subcommand have the exact same meaning as above and they are equally useful on the -testnet too. Please see above for their explanations if you've skipped to here. +The `console` subcommand has the exact same meaning as above and they are equally +useful on the testnet too. Please see above for their explanations if you've skipped here. -Specifying the `--testnet` flag however will reconfigure your Geth instance a bit: +Specifying the `--testnet` flag, however, will reconfigure your `geth` instance a bit: - * Instead of using the default data directory (`~/.ethereum` on Linux for example), Geth will nest - itself one level deeper into a `testnet` subfolder (`~/.ethereum/testnet` on Linux). Note, on OSX - and Linux this also means that attaching to a running testnet node requires the use of a custom - endpoint since `geth attach` will try to attach to a production node endpoint by default. E.g. - `geth attach /testnet/geth.ipc`. Windows users are not affected by this. - * Instead of connecting the main Ethereum network, the client will connect to the test network, - which uses different P2P bootnodes, different network IDs and genesis states. + * Instead of using the default data directory (`~/.ethereum` on Linux for example), `geth` + will nest itself one level deeper into a `testnet` subfolder (`~/.ethereum/testnet` on + Linux). Note, on OSX and Linux this also means that attaching to a running testnet node + requires the use of a custom endpoint since `geth attach` will try to attach to a + production node endpoint by default. E.g. + `geth attach /testnet/geth.ipc`. Windows users are not affected by + this. + * Instead of connecting the main Ethereum network, the client will connect to the test + network, which uses different P2P bootnodes, different network IDs and genesis states. -*Note: Although there are some internal protective measures to prevent transactions from crossing -over between the main network and test network, you should make sure to always use separate accounts -for play-money and real-money. Unless you manually move accounts, Geth will by default correctly -separate the two networks and will not make any accounts available between them.* +*Note: Although there are some internal protective measures to prevent transactions from +crossing over between the main network and test network, you should make sure to always +use separate accounts for play-money and real-money. Unless you manually move +accounts, `geth` will by default correctly separate the two networks and will not make any +accounts available between them.* ### Full node on the Rinkeby test network -The above test network is a cross client one based on the ethash proof-of-work consensus algorithm. As such, it has certain extra overhead and is more susceptible to reorganization attacks due to the network's low difficulty / security. Go Ethereum also supports connecting to a proof-of-authority based test network called [*Rinkeby*](https://www.rinkeby.io) (operated by members of the community). This network is lighter, more secure, but is only supported by go-ethereum. +The above test network is a cross-client one based on the ethash proof-of-work consensus +algorithm. As such, it has certain extra overhead and is more susceptible to reorganization +attacks due to the network's low difficulty/security. Go Ethereum also supports connecting +to a proof-of-authority based test network called [*Rinkeby*](https://www.rinkeby.io) +(operated by members of the community). This network is lighter, more secure, but is only +supported by go-ethereum. -``` +```shell $ geth --rinkeby console ``` ### Configuration -As an alternative to passing the numerous flags to the `geth` binary, you can also pass a configuration file via: +As an alternative to passing the numerous flags to the `geth` binary, you can also pass a +configuration file via: -``` +```shell $ geth --config /path/to/your_config.toml ``` -To get an idea how the file should look like you can use the `dumpconfig` subcommand to export your existing configuration: +To get an idea how the file should look like you can use the `dumpconfig` subcommand to +export your existing configuration: -``` +```shell $ geth --your-favourite-flags dumpconfig ``` -*Note: This works only with geth v1.6.0 and above.* +*Note: This works only with `geth` v1.6.0 and above.* #### Docker quick start -One of the quickest ways to get Ethereum up and running on your machine is by using Docker: +One of the quickest ways to get Ethereum up and running on your machine is by using +Docker: -``` +```shell docker run -d --name ethereum-node -v /Users/alice/ethereum:/root \ -p 8545:8545 -p 30303:30303 \ ethereum/client-go ``` -This will start geth in fast-sync mode with a DB memory allowance of 1GB just as the above command does. It will also create a persistent volume in your home directory for saving your blockchain as well as map the default ports. There is also an `alpine` tag available for a slim version of the image. +This will start `geth` in fast-sync mode with a DB memory allowance of 1GB just as the +above command does. It will also create a persistent volume in your home directory for +saving your blockchain as well as map the default ports. There is also an `alpine` tag +available for a slim version of the image. -Do not forget `--rpcaddr 0.0.0.0`, if you want to access RPC from other containers and/or hosts. By default, `geth` binds to the local interface and RPC endpoints is not accessible from the outside. +Do not forget `--rpcaddr 0.0.0.0`, if you want to access RPC from other containers +and/or hosts. By default, `geth` binds to the local interface and RPC endpoints is not +accessible from the outside. -### Programatically interfacing Geth nodes +### Programmatically interfacing `geth` nodes -As a developer, sooner rather than later you'll want to start interacting with Geth and the Ethereum -network via your own programs and not manually through the console. To aid this, Geth has built-in -support for a JSON-RPC based APIs ([standard APIs](https://github.com/ethereum/wiki/wiki/JSON-RPC) and -[Geth specific APIs](https://github.com/ethereum/go-ethereum/wiki/Management-APIs)). These can be -exposed via HTTP, WebSockets and IPC (unix sockets on unix based platforms, and named pipes on Windows). +As a developer, sooner rather than later you'll want to start interacting with `geth` and the +Ethereum network via your own programs and not manually through the console. To aid +this, `geth` has built-in support for a JSON-RPC based APIs ([standard APIs](https://github.com/ethereum/wiki/wiki/JSON-RPC) +and [`geth` specific APIs](https://github.com/ethereum/go-ethereum/wiki/Management-APIs)). +These can be exposed via HTTP, WebSockets and IPC (UNIX sockets on UNIX based +platforms, and named pipes on Windows). -The IPC interface is enabled by default and exposes all the APIs supported by Geth, whereas the HTTP -and WS interfaces need to manually be enabled and only expose a subset of APIs due to security reasons. -These can be turned on/off and configured as you'd expect. +The IPC interface is enabled by default and exposes all the APIs supported by `geth`, +whereas the HTTP and WS interfaces need to manually be enabled and only expose a +subset of APIs due to security reasons. These can be turned on/off and configured as +you'd expect. HTTP based JSON-RPC API options: * `--rpc` Enable the HTTP-RPC server - * `--rpcaddr` HTTP-RPC server listening interface (default: "localhost") - * `--rpcport` HTTP-RPC server listening port (default: 8545) - * `--rpcapi` API's offered over the HTTP-RPC interface (default: "eth,net,web3") + * `--rpcaddr` HTTP-RPC server listening interface (default: `localhost`) + * `--rpcport` HTTP-RPC server listening port (default: `8545`) + * `--rpcapi` API's offered over the HTTP-RPC interface (default: `eth,net,web3`) * `--rpccorsdomain` Comma separated list of domains from which to accept cross origin requests (browser enforced) * `--ws` Enable the WS-RPC server - * `--wsaddr` WS-RPC server listening interface (default: "localhost") - * `--wsport` WS-RPC server listening port (default: 8546) - * `--wsapi` API's offered over the WS-RPC interface (default: "eth,net,web3") + * `--wsaddr` WS-RPC server listening interface (default: `localhost`) + * `--wsport` WS-RPC server listening port (default: `8546`) + * `--wsapi` API's offered over the WS-RPC interface (default: `eth,net,web3`) * `--wsorigins` Origins from which to accept websockets requests * `--ipcdisable` Disable the IPC-RPC server - * `--ipcapi` API's offered over the IPC-RPC interface (default: "admin,debug,eth,miner,net,personal,shh,txpool,web3") + * `--ipcapi` API's offered over the IPC-RPC interface (default: `admin,debug,eth,miner,net,personal,shh,txpool,web3`) * `--ipcpath` Filename for IPC socket/pipe within the datadir (explicit paths escape it) -You'll need to use your own programming environments' capabilities (libraries, tools, etc) to connect -via HTTP, WS or IPC to a Geth node configured with the above flags and you'll need to speak [JSON-RPC](http://www.jsonrpc.org/specification) -on all transports. You can reuse the same connection for multiple requests! +You'll need to use your own programming environments' capabilities (libraries, tools, etc) to +connect via HTTP, WS or IPC to a `geth` node configured with the above flags and you'll +need to speak [JSON-RPC](https://www.jsonrpc.org/specification) on all transports. You +can reuse the same connection for multiple requests! -**Note: Please understand the security implications of opening up an HTTP/WS based transport before -doing so! Hackers on the internet are actively trying to subvert Ethereum nodes with exposed APIs! -Further, all browser tabs can access locally running webservers, so malicious webpages could try to -subvert locally available APIs!** +**Note: Please understand the security implications of opening up an HTTP/WS based +transport before doing so! Hackers on the internet are actively trying to subvert +Ethereum nodes with exposed APIs! Further, all browser tabs can access locally +running web servers, so malicious web pages could try to subvert locally available +APIs!** ### Operating a private network -Maintaining your own private network is more involved as a lot of configurations taken for granted in -the official networks need to be manually set up. +Maintaining your own private network is more involved as a lot of configurations taken for +granted in the official networks need to be manually set up. #### Defining the private genesis state -First, you'll need to create the genesis state of your networks, which all nodes need to be aware of -and agree upon. This consists of a small JSON file (e.g. call it `genesis.json`): +First, you'll need to create the genesis state of your networks, which all nodes need to be +aware of and agree upon. This consists of a small JSON file (e.g. call it `genesis.json`): ```json { "config": { - "chainId": 0, - "homesteadBlock": 0, - "eip155Block": 0, - "eip158Block": 0 - }, - "alloc" : {}, - "coinbase" : "0x0000000000000000000000000000000000000000", - "difficulty" : "0x20000", - "extraData" : "", - "gasLimit" : "0x2fefd8", - "nonce" : "0x0000000000000042", - "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp" : "0x00" + "chainId": 0, + "homesteadBlock": 0, + "eip155Block": 0, + "eip158Block": 0 + }, + "alloc": {}, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x20000", + "extraData": "", + "gasLimit": "0x2fefd8", + "nonce": "0x0000000000000042", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" } ``` -The above fields should be fine for most purposes, although we'd recommend changing the `nonce` to -some random value so you prevent unknown remote nodes from being able to connect to you. If you'd -like to pre-fund some accounts for easier testing, you can populate the `alloc` field with account -configs: +The above fields should be fine for most purposes, although we'd recommend changing +the `nonce` to some random value so you prevent unknown remote nodes from being able +to connect to you. If you'd like to pre-fund some accounts for easier testing, you can +populate the `alloc` field with account configs: ```json "alloc": { - "0x0000000000000000000000000000000000000001": {"balance": "111111111"}, - "0x0000000000000000000000000000000000000002": {"balance": "222222222"} + "0x0000000000000000000000000000000000000001": { + "balance": "111111111" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "222222222" + } } ``` -With the genesis state defined in the above JSON file, you'll need to initialize **every** Geth node -with it prior to starting it up to ensure all blockchain parameters are correctly set: +With the genesis state defined in the above JSON file, you'll need to initialize **every** +`geth` node with it prior to starting it up to ensure all blockchain parameters are correctly +set: -``` +```shell $ geth init path/to/genesis.json ``` #### Creating the rendezvous point -With all nodes that you want to run initialized to the desired genesis state, you'll need to start a -bootstrap node that others can use to find each other in your network and/or over the internet. The -clean way is to configure and run a dedicated bootnode: +With all nodes that you want to run initialized to the desired genesis state, you'll need to +start a bootstrap node that others can use to find each other in your network and/or over +the internet. The clean way is to configure and run a dedicated bootnode: -``` +```shell $ bootnode --genkey=boot.key $ bootnode --nodekey=boot.key ``` With the bootnode online, it will display an [`enode` URL](https://github.com/ethereum/wiki/wiki/enode-url-format) -that other nodes can use to connect to it and exchange peer information. Make sure to replace the -displayed IP address information (most probably `[::]`) with your externally accessible IP to get the -actual `enode` URL. +that other nodes can use to connect to it and exchange peer information. Make sure to +replace the displayed IP address information (most probably `[::]`) with your externally +accessible IP to get the actual `enode` URL. -*Note: You could also use a full fledged Geth node as a bootnode, but it's the less recommended way.* +*Note: You could also use a full-fledged `geth` node as a bootnode, but it's the less +recommended way.* #### Starting up your member nodes -With the bootnode operational and externally reachable (you can try `telnet ` to ensure -it's indeed reachable), start every subsequent Geth node pointed to the bootnode for peer discovery -via the `--bootnodes` flag. It will probably also be desirable to keep the data directory of your -private network separated, so do also specify a custom `--datadir` flag. +With the bootnode operational and externally reachable (you can try +`telnet ` to ensure it's indeed reachable), start every subsequent `geth` +node pointed to the bootnode for peer discovery via the `--bootnodes` flag. It will +probably also be desirable to keep the data directory of your private network separated, so +do also specify a custom `--datadir` flag. -``` +```shell $ geth --datadir=path/to/custom/data/folder --bootnodes= ``` -*Note: Since your network will be completely cut off from the main and test networks, you'll also -need to configure a miner to process transactions and create new blocks for you.* +*Note: Since your network will be completely cut off from the main and test networks, you'll +also need to configure a miner to process transactions and create new blocks for you.* #### Running a private miner -Mining on the public Ethereum network is a complex task as it's only feasible using GPUs, requiring -an OpenCL or CUDA enabled `ethminer` instance. For information on such a setup, please consult the -[EtherMining subreddit](https://www.reddit.com/r/EtherMining/) and the [Genoil miner](https://github.com/Genoil/cpp-ethereum) -repository. +Mining on the public Ethereum network is a complex task as it's only feasible using GPUs, +requiring an OpenCL or CUDA enabled `ethminer` instance. For information on such a +setup, please consult the [EtherMining subreddit](https://www.reddit.com/r/EtherMining/) +and the [Genoil miner](https://github.com/Genoil/cpp-ethereum) repository. -In a private network setting however, a single CPU miner instance is more than enough for practical -purposes as it can produce a stable stream of blocks at the correct intervals without needing heavy -resources (consider running on a single thread, no need for multiple ones either). To start a Geth -instance for mining, run it with all your usual flags, extended by: +In a private network setting, however a single CPU miner instance is more than enough for +practical purposes as it can produce a stable stream of blocks at the correct intervals +without needing heavy resources (consider running on a single thread, no need for multiple +ones either). To start a `geth` instance for mining, run it with all your usual flags, extended +by: -``` +```shell $ geth --mine --minerthreads=1 --etherbase=0x0000000000000000000000000000000000000000 ``` -Which will start mining blocks and transactions on a single CPU thread, crediting all proceedings to -the account specified by `--etherbase`. You can further tune the mining by changing the default gas -limit blocks converge to (`--targetgaslimit`) and the price transactions are accepted at (`--gasprice`). +Which will start mining blocks and transactions on a single CPU thread, crediting all +proceedings to the account specified by `--etherbase`. You can further tune the mining +by changing the default gas limit blocks converge to (`--targetgaslimit`) and the price +transactions are accepted at (`--gasprice`). ## Contribution -Thank you for considering to help out with the source code! We welcome contributions from -anyone on the internet, and are grateful for even the smallest of fixes! +Thank you for considering to help out with the source code! We welcome contributions +from anyone on the internet, and are grateful for even the smallest of fixes! If you'd like to contribute to go-ethereum, please fork, fix, commit and send a pull request -for the maintainers to review and merge into the main code base. If you wish to submit more -complex changes though, please check up with the core devs first on [our gitter channel](https://gitter.im/ethereum/go-ethereum) -to ensure those changes are in line with the general philosophy of the project and/or get some -early feedback which can make both your efforts much lighter as well as our review and merge -procedures quick and simple. +for the maintainers to review and merge into the main code base. If you wish to submit +more complex changes though, please check up with the core devs first on [our gitter channel](https://gitter.im/ethereum/go-ethereum) +to ensure those changes are in line with the general philosophy of the project and/or get +some early feedback which can make both your efforts much lighter as well as our review +and merge procedures quick and simple. Please make sure your contributions adhere to our coding guidelines: - * Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). - * Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines. + * Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) + guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). + * Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) + guidelines. * Pull requests need to be based on and opened against the `master` branch. * Commit messages should be prefixed with the package(s) they modify. * E.g. "eth, rpc: make trace configs optional" Please see the [Developers' Guide](https://github.com/ethereum/go-ethereum/wiki/Developers'-Guide) -for more details on configuring your environment, managing project dependencies and testing procedures. +for more details on configuring your environment, managing project dependencies, and +testing procedures. ## License The go-ethereum library (i.e. all code outside of the `cmd` directory) is licensed under the -[GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html), also -included in our repository in the `COPYING.LESSER` file. +[GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html), +also included in our repository in the `COPYING.LESSER` file. The go-ethereum binaries (i.e. all code inside of the `cmd` directory) is licensed under the -[GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html), also included -in our repository in the `COPYING` file. +[GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html), also +included in our repository in the `COPYING` file. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000000..bc54ede42fac --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,120 @@ +# Security Policy + +## Supported Versions + +Please see Releases. We recommend to use the most recent released version. + +## Audit reports + +Audit reports are published in the `docs` folder: https://github.com/ethereum/go-ethereum/tree/master/docs/audits + + +| Scope | Date | Report Link | +| ------- | ------- | ----------- | +| `geth` | 20170425 | [pdf](https://github.com/ethereum/go-ethereum/blob/master/docs/audits/2017-04-25_Geth-audit_Truesec.pdf) | +| `clef` | 20180914 | [pdf](https://github.com/ethereum/go-ethereum/blob/master/docs/audits/2018-09-14_Clef-audit_NCC.pdf) | + + + +## Reporting a Vulnerability + +**Please do not file a public ticket** mentioning the vulnerability. + +To find out how to disclose a vulnerability in Ethereum visit [https://bounty.ethereum.org](https://bounty.ethereum.org) or email bounty@ethereum.org. + +The following key may be used to communicate sensitive information to developers. + +Fingerprint: `AE96 ED96 9E47 9B00 84F3 E17F E88D 3334 FA5F 6A0A` + + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQINBFgl3tgBEAC8A1tUBkD9YV+eLrOmtgy+/JS/H9RoZvkg3K1WZ8IYfj6iIRaY +neAk3Bp182GUPVz/zhKr2g0tMXIScDR3EnaDsY+Qg+JqQl8NOG+Cikr1nnkG2on9 +L8c8yiqry1ZTCmYMqCa2acTFqnyuXJ482aZNtB4QG2BpzfhW4k8YThpegk/EoRUi +m+y7buJDtoNf7YILlhDQXN8qlHB02DWOVUihph9tUIFsPK6BvTr9SIr/eG6j6k0b +fUo9pexOn7LS4SojoJmsm/5dp6AoKlac48cZU5zwR9AYcq/nvkrfmf2WkObg/xRd +EvKZzn05jRopmAIwmoC3CiLmqCHPmT5a29vEob/yPFE335k+ujjZCPOu7OwjzDk7 +M0zMSfnNfDq8bXh16nn+ueBxJ0NzgD1oC6c2PhM+XRQCXChoyI8vbfp4dGvCvYqv +QAE1bWjqnumZ/7vUPgZN6gDfiAzG2mUxC2SeFBhacgzDvtQls+uuvm+FnQOUgg2H +h8x2zgoZ7kqV29wjaUPFREuew7e+Th5BxielnzOfVycVXeSuvvIn6cd3g/s8mX1c +2kLSXJR7+KdWDrIrR5Az0kwAqFZt6B6QTlDrPswu3mxsm5TzMbny0PsbL/HBM+GZ +EZCjMXxB8bqV2eSaktjnSlUNX1VXxyOxXA+ZG2jwpr51egi57riVRXokrQARAQAB +tDlFdGhlcmV1bSBGb3VuZGF0aW9uIFNlY3VyaXR5IFRlYW0gPHNlY3VyaXR5QGV0 +aGVyZXVtLm9yZz6JAj4EEwECACgCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA +BQJaCWH6BQkFo2BYAAoJEOiNMzT6X2oK+DEP/3H6dxkm0hvHZKoHLVuuxcu3EHYo +k5sd3MMWPrZSN8qzZnY7ayEDMxnarWOizc+2jfOxfJlzX/g8lR1/fsHdWPFPhPoV +Qk8ygrHn1H8U8+rpw/U03BqmqHpYCDzJ+CIis9UWROniqXw1nuqu/FtWOsdWxNKh +jUo6k/0EsaXsxRPzgJv7fEUcVcQ7as/C3x9sy3muc2gvgA4/BKoGPb1/U0GuA8lV +fDIDshAggmnSUAg+TuYSAAdoFQ1sKwFMPigcLJF2eyKuK3iUyixJrec/c4LSf3wA +cGghbeuqI8INP0Y2zvXDQN2cByxsFAuoZG+m0cyKGaDH2MVUvOKKYqn/03qvrf15 +AWAsW0l0yQwOTCo3FbsNzemClm5Bj/xH0E4XuwXwChcMCMOWJrFoxyvCEI+keoQc +c08/a8/MtS7vBAABXwOziSmm6CNqmzpWrh/fDrjlJlba9U3MxzvqU3IFlTdMratv +6V+SgX+L25lCzW4NxxUavoB8fAlvo8lxpHKo24FP+RcLQ8XqkU3RiUsgRjQRFOqQ +TaJcsp8mimmiYyf24mNu6b48pi+a5c/eQR9w59emeEUZqsJU+nqv8BWIIp7o4Agh +NYnKjkhPlY5e1fLVfAHIADZFynWwRPkPMJSrBiP5EtcOFxQGHGjRxU/KjXkvE0hV +xYb1PB8pWMTu/beeiQI+BBMBAgAoBQJYJd7YAhsDBQkB4TOABgsJCAcDAgYVCAIJ +CgsEFgIDAQIeAQIXgAAKCRDojTM0+l9qCplDD/9IZ2i+m1cnqQKtiyHbyFGx32oL +fzqPylX2bOG5DPsSTorSUdJMGVfT04oVxXc4S/2DVnNvi7RAbSiLapCWSplgtBOj +j1xlblOoXxT3m7s1XHGCX5tENxI9fVSSPVKJn+fQaWpPB2MhBA+1lUI6GJ+11T7K +J8LrP/fiw1/nOb7rW61HW44Gtyox23sA/d1+DsFVaF8hxJlNj5coPKr8xWzQ8pQl +juzdjHDukjevuw4rRmRq9vozvj9keEU9XJ5dldyEVXFmdDk7KT0p0Rla9nxYhzf/ +r/Bv8Bzy0HCWRb2D31BjXXGG05oVnYmNGxGFxYja4MwgrMmne3ilEVjfUJsapsqi +w41BAyQgIdfREulYN7ahsF5PrjVAqBd9IGtE8ULelF2SQxEBQBngEkP0ahP6tRAL +i7/CBjPKOyKijtqVny7qrGOnU2ygcA88/WDibexDhrjz0Gx8WmErU7rIWZiZ5u4Y +vJYVRo0+6rBCXRPeSJfiP5h1p17Anr2l42boAYslfcrzquB8MHtrNcyn650OLtHG +nbxgIdniKrpuzGN6Opw+O2id2JhD1/1p4SOemwAmthplr1MIyOHNP3q93rEj2J7h +5zPS/AJuKkMDFUpslPNLQjCOwPXtdzL7/kUZGBSyez1T3TaW1uY6l9XaJJRaSn+v +1zPgfp4GJ3lPs4AlAbQ0RXRoZXJldW0gRm91bmRhdGlvbiBCdWcgQm91bnR5IDxi +b3VudHlAZXRoZXJldW0ub3JnPokCPgQTAQIAKAIbAwYLCQgHAwIGFQgCCQoLBBYC +AwECHgECF4AFAloJYfoFCQWjYFgACgkQ6I0zNPpfagoENg/+LnSaVeMxiGVtcjWl +b7Xd73yrEy4uxiESS1AalW9mMf7oZzfI05f7QIQlaLAkNac74vZDJbPKjtb7tpMO +RFhRZMCveq6CPKU6pd1SI8IUVUKwpEe6AJP3lHdVP57dquieFE2HlYKm6uHbCGWU +0cjyTA+uu2KbgCHGmofsPY/xOcZLGEHTHqa5w60JJAQm+BSDKnw8wTyrxGvA3EK/ +ePSvOZMYa+iw6vYuZeBIMbdiXR/A2keBi3GuvqB8tDMj7P22TrH5mVDm3zNqGYD6 +amDPeiWp4cztY3aZyLcgYotqXPpDceZzDn+HopBPzAb/llCdE7bVswKRhphVMw4b +bhL0R/TQY7Sf6TK2LKSBrjv0DWOSijikE71SJcBnJvHU7EpKrQQ0lMGclm3ynyji +Nf0YTPXQt4I+fwTmOew2GFeK3UytNWbWI7oXX7Nm4bj9bhf3IJ0kmZb/Gs73+xII +e7Rz52Mby436tWyQIQiF9ITYNGvNf53TwBBZMn0pKPiTyr3Ur7FHEotkEOFNh1// +4zQY10XxuBdLrYGyZ4V8xHJM+oKre8Eg2R9qHXVbjvErHE+7CvgnV7YUip0criPr +BlKRvuoJaSliH2JFhSjWVrkPmFGrWN0BAx10yIqMnEplfKeHf4P9Elek3oInS8WP +G1zJG6s/t5+hQK0X37+TB+6rd3GJAj4EEwECACgFAlgl4TsCGwMFCQHhM4AGCwkI +BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEOiNMzT6X2oKzf8P/iIKd77WHTbp4pMN +8h52HyZJtDJmjA1DPZrbGl1TesW/Z9uTd12txlgqZnbG2GfN9+LSP6EOPzR6v2xC +OVhR+RdWhZDJJuQCVS7lJIqQrZgmeTZG0TyQPZdLjVFBOrrhVwYX+HXbu429IzHr +URf5InyR1QgqOXyElDYS6e28HFqvaoA0DWTWDDqOLPVl+U5fuceIE2XXdv3AGLeP +Yf8J5MPobjPiZtBqI6S6iENY2Yn35qLX+axeC/iYSCHVtFuCCIdb/QYR1ZZV8Ps/ +aI9DwC7LU+YfPw7iqCIoqxSeA3o1PORkdSigEg3jtfRv5UqVo9a0oBb9jdoADsat +F/gW0E7mto3XGOiaR0eB9SSdsM3x7Bz4A0HIGNaxpZo1RWqlO91leP4c13Px7ISv +5OGXfLg+M8qb+qxbGd1HpitGi9s1y1aVfEj1kOtZ0tN8eu+Upg5WKwPNBDX3ar7J +9NCULgVSL+E79FG+zXw62gxiQrLfKzm4wU/9L5wVkwQnm29hLJ0tokrSBZFnc/1l +7OC+GM63tYicKkY4rqmoWUeYx7IwFH9mtDtvR1RxO85RbQhZizwpZpdpRkH0DqZu +ZJRmRa5r7rPqmfa7d+VIFhz2Xs8pJMLVqxTsLKcLglmjw7aOrYG0SWeH7YraXWGD +N3SlvSBiVwcK7QUKzLLvpadLwxfsuQINBFgl3tgBEACbgq6HTN5gEBi0lkD/MafI +nmNi+59U5gRGYqk46WlfRjhHudXjDpgD0lolGb4hYontkMaKRlCg2Rvgjvk3Zve0 +PKWjKw7gr8YBa9fMFY8BhAXI32OdyI9rFhxEZFfWAfwKVmT19BdeAQRFvcfd+8w8 +f1XVc+zddULMJFBTr+xKDlIRWwTkdLPQeWbjo0eHl/g4tuLiLrTxVbnj26bf+2+1 +DbM/w5VavzPrkviHqvKe/QP/gay4QDViWvFgLb90idfAHIdsPgflp0VDS5rVHFL6 +D73rSRdIRo3I8c8mYoNjSR4XDuvgOkAKW9LR3pvouFHHjp6Fr0GesRbrbb2EG66i +PsR99MQ7FqIL9VMHPm2mtR+XvbnKkH2rYyEqaMbSdk29jGapkAWle4sIhSKk749A +4tGkHl08KZ2N9o6GrfUehP/V2eJLaph2DioFL1HxRryrKy80QQKLMJRekxigq8gr +eW8xB4zuf9Mkuou+RHNmo8PebHjFstLigiD6/zP2e+4tUmrT0/JTGOShoGMl8Rt0 +VRxdPImKun+4LOXbfOxArOSkY6i35+gsgkkSy1gTJE0BY3S9auT6+YrglY/TWPQ9 +IJxWVOKlT+3WIp5wJu2bBKQ420VLqDYzkoWytel/bM1ACUtipMiIVeUs2uFiRjpz +A1Wy0QHKPTdSuGlJPRrfcQARAQABiQIlBBgBAgAPAhsMBQJaCWIIBQkFo2BYAAoJ +EOiNMzT6X2oKgSwQAKKs7BGF8TyZeIEO2EUK7R2bdQDCdSGZY06tqLFg3IHMGxDM +b/7FVoa2AEsFgv6xpoebxBB5zkhUk7lslgxvKiSLYjxfNjTBltfiFJ+eQnf+OTs8 +KeR51lLa66rvIH2qUzkNDCCTF45H4wIDpV05AXhBjKYkrDCrtey1rQyFp5fxI+0I +Q1UKKXvzZK4GdxhxDbOUSd38MYy93nqcmclGSGK/gF8XiyuVjeifDCM6+T1NQTX0 +K9lneidcqtBDvlggJTLJtQPO33o5EHzXSiud+dKth1uUhZOFEaYRZoye1YE3yB0T +NOOE8fXlvu8iuIAMBSDL9ep6sEIaXYwoD60I2gHdWD0lkP0DOjGQpi4ouXM3Edsd +5MTi0MDRNTij431kn8T/D0LCgmoUmYYMBgbwFhXr67axPZlKjrqR0z3F/Elv0ZPP +cVg1tNznsALYQ9Ovl6b5M3cJ5GapbbvNWC7yEE1qScl9HiMxjt/H6aPastH63/7w +cN0TslW+zRBy05VNJvpWGStQXcngsSUeJtI1Gd992YNjUJq4/Lih6Z1TlwcFVap+ +cTcDptoUvXYGg/9mRNNPZwErSfIJ0Ibnx9wPVuRN6NiCLOt2mtKp2F1pM6AOQPpZ +85vEh6I8i6OaO0w/Z0UHBwvpY6jDUliaROsWUQsqz78Z34CVj4cy6vPW2EF4 +=r6KK +-----END PGP PUBLIC KEY BLOCK----- +``` diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index 535e5d78b27a..97a3a98bd33d 100644 --- a/accounts/abi/abi.go +++ b/accounts/abi/abi.go @@ -21,6 +21,8 @@ import ( "encoding/json" "fmt" "io" + + "github.com/ethereum/go-ethereum/common" ) // The ABI holds information about a contract's context and available @@ -58,13 +60,11 @@ func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) { return nil, err } return arguments, nil - } method, exist := abi.Methods[name] if !exist { return nil, fmt.Errorf("method '%s' not found", name) } - arguments, err := method.Inputs.Pack(args...) if err != nil { return nil, err @@ -74,19 +74,39 @@ func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) { } // Unpack output in v according to the abi specification -func (abi ABI) Unpack(v interface{}, name string, output []byte) (err error) { - if len(output) == 0 { +func (abi ABI) Unpack(v interface{}, name string, data []byte) (err error) { + if len(data) == 0 { return fmt.Errorf("abi: unmarshalling empty output") } // since there can't be naming collisions with contracts and events, // we need to decide whether we're calling a method or an event if method, ok := abi.Methods[name]; ok { - if len(output)%32 != 0 { + if len(data)%32 != 0 { + return fmt.Errorf("abi: improperly formatted output: %s - Bytes: [%+v]", string(data), data) + } + return method.Outputs.Unpack(v, data) + } + if event, ok := abi.Events[name]; ok { + return event.Inputs.Unpack(v, data) + } + return fmt.Errorf("abi: could not locate named method or event") +} + +// UnpackIntoMap unpacks a log into the provided map[string]interface{} +func (abi ABI) UnpackIntoMap(v map[string]interface{}, name string, data []byte) (err error) { + if len(data) == 0 { + return fmt.Errorf("abi: unmarshalling empty output") + } + // since there can't be naming collisions with contracts and events, + // we need to decide whether we're calling a method or an event + if method, ok := abi.Methods[name]; ok { + if len(data)%32 != 0 { return fmt.Errorf("abi: improperly formatted output") } - return method.Outputs.Unpack(v, output) - } else if event, ok := abi.Events[name]; ok { - return event.Inputs.Unpack(v, output) + return method.Outputs.UnpackIntoMap(v, data) + } + if event, ok := abi.Events[name]; ok { + return event.Inputs.UnpackIntoMap(v, data) } return fmt.Errorf("abi: could not locate named method or event") } @@ -116,15 +136,27 @@ func (abi *ABI) UnmarshalJSON(data []byte) error { } // empty defaults to function according to the abi spec case "function", "": - abi.Methods[field.Name] = Method{ - Name: field.Name, + name := field.Name + _, ok := abi.Methods[name] + for idx := 0; ok; idx++ { + name = fmt.Sprintf("%s%d", field.Name, idx) + _, ok = abi.Methods[name] + } + abi.Methods[name] = Method{ + Name: name, Const: field.Constant, Inputs: field.Inputs, Outputs: field.Outputs, } case "event": - abi.Events[field.Name] = Event{ - Name: field.Name, + name := field.Name + _, ok := abi.Events[name] + for idx := 0; ok; idx++ { + name = fmt.Sprintf("%s%d", field.Name, idx) + _, ok = abi.Events[name] + } + abi.Events[name] = Event{ + Name: name, Anonymous: field.Anonymous, Inputs: field.Inputs, } @@ -138,7 +170,7 @@ func (abi *ABI) UnmarshalJSON(data []byte) error { // returns nil if none found func (abi *ABI) MethodById(sigdata []byte) (*Method, error) { if len(sigdata) < 4 { - return nil, fmt.Errorf("data too short (% bytes) for abi method lookup", len(sigdata)) + return nil, fmt.Errorf("data too short (%d bytes) for abi method lookup", len(sigdata)) } for _, method := range abi.Methods { if bytes.Equal(method.Id(), sigdata[:4]) { @@ -147,3 +179,14 @@ func (abi *ABI) MethodById(sigdata []byte) (*Method, error) { } return nil, fmt.Errorf("no method with id: %#x", sigdata[:4]) } + +// EventByID looks an event up by its topic hash in the +// ABI and returns nil if none found. +func (abi *ABI) EventByID(topic common.Hash) (*Event, error) { + for _, event := range abi.Events { + if bytes.Equal(event.Id().Bytes(), topic.Bytes()) { + return &event, nil + } + } + return nil, fmt.Errorf("no event with id: %#x", topic.Hex()) +} diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go index 59ba79cb6d3b..09d3c94a0486 100644 --- a/accounts/abi/abi_test.go +++ b/accounts/abi/abi_test.go @@ -20,13 +20,11 @@ import ( "bytes" "encoding/hex" "fmt" - "log" "math/big" + "reflect" "strings" "testing" - "reflect" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" ) @@ -52,11 +50,14 @@ const jsondata2 = ` { "type" : "function", "name" : "slice", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "uint32[2]" } ] }, { "type" : "function", "name" : "slice256", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "uint256[2]" } ] }, { "type" : "function", "name" : "sliceAddress", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "address[]" } ] }, - { "type" : "function", "name" : "sliceMultiAddress", "constant" : false, "inputs" : [ { "name" : "a", "type" : "address[]" }, { "name" : "b", "type" : "address[]" } ] } + { "type" : "function", "name" : "sliceMultiAddress", "constant" : false, "inputs" : [ { "name" : "a", "type" : "address[]" }, { "name" : "b", "type" : "address[]" } ] }, + { "type" : "function", "name" : "nestedArray", "constant" : false, "inputs" : [ { "name" : "a", "type" : "uint256[2][2]" }, { "name" : "b", "type" : "address[]" } ] }, + { "type" : "function", "name" : "nestedArray2", "constant" : false, "inputs" : [ { "name" : "a", "type" : "uint8[][2]" } ] }, + { "type" : "function", "name" : "nestedSlice", "constant" : false, "inputs" : [ { "name" : "a", "type" : "uint8[][]" } ] } ]` func TestReader(t *testing.T) { - Uint256, _ := NewType("uint256") + Uint256, _ := NewType("uint256", nil) exp := ABI{ Methods: map[string]Method{ "balance": { @@ -100,8 +101,7 @@ func TestReader(t *testing.T) { func TestTestNumbers(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } if _, err := abi.Pack("balance"); err != nil { @@ -138,8 +138,7 @@ func TestTestNumbers(t *testing.T) { func TestTestString(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } if _, err := abi.Pack("string", "hello world"); err != nil { @@ -150,8 +149,7 @@ func TestTestString(t *testing.T) { func TestTestBool(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } if _, err := abi.Pack("bool", true); err != nil { @@ -162,8 +160,7 @@ func TestTestBool(t *testing.T) { func TestTestSlice(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } slice := make([]uint64, 2) @@ -177,7 +174,7 @@ func TestTestSlice(t *testing.T) { } func TestMethodSignature(t *testing.T) { - String, _ := NewType("string") + String, _ := NewType("string", nil) m := Method{"foo", false, []Argument{{"bar", String, false}, {"baz", String, false}}, nil} exp := "foo(string,string)" if m.Sig() != exp { @@ -189,19 +186,37 @@ func TestMethodSignature(t *testing.T) { t.Errorf("expected ids to match %x != %x", m.Id(), idexp) } - uintt, _ := NewType("uint256") + uintt, _ := NewType("uint256", nil) m = Method{"foo", false, []Argument{{"bar", uintt, false}}, nil} exp = "foo(uint256)" if m.Sig() != exp { t.Error("signature mismatch", exp, "!=", m.Sig()) } + + // Method with tuple arguments + s, _ := NewType("tuple", []ArgumentMarshaling{ + {Name: "a", Type: "int256"}, + {Name: "b", Type: "int256[]"}, + {Name: "c", Type: "tuple[]", Components: []ArgumentMarshaling{ + {Name: "x", Type: "int256"}, + {Name: "y", Type: "int256"}, + }}, + {Name: "d", Type: "tuple[2]", Components: []ArgumentMarshaling{ + {Name: "x", Type: "int256"}, + {Name: "y", Type: "int256"}, + }}, + }) + m = Method{"foo", false, []Argument{{"s", s, false}, {"bar", String, false}}, nil} + exp = "foo((int256,int256[],(int256,int256)[],(int256,int256)[2]),string)" + if m.Sig() != exp { + t.Error("signature mismatch", exp, "!=", m.Sig()) + } } func TestMultiPack(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } sig := crypto.Keccak256([]byte("bar(uint32,uint16)"))[:4] @@ -211,10 +226,8 @@ func TestMultiPack(t *testing.T) { packed, err := abi.Pack("bar", uint32(10), uint16(11)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } - if !bytes.Equal(packed, sig) { t.Errorf("expected %x got %x", sig, packed) } @@ -225,11 +238,11 @@ func ExampleJSON() { abi, err := JSON(strings.NewReader(definition)) if err != nil { - log.Fatalln(err) + panic(err) } out, err := abi.Pack("isBar", common.HexToAddress("01")) if err != nil { - log.Fatalln(err) + panic(err) } fmt.Printf("%x\n", out) @@ -564,11 +577,13 @@ func TestBareEvents(t *testing.T) { const definition = `[ { "type" : "event", "name" : "balance" }, { "type" : "event", "name" : "anon", "anonymous" : true}, - { "type" : "event", "name" : "args", "inputs" : [{ "indexed":false, "name":"arg0", "type":"uint256" }, { "indexed":true, "name":"arg1", "type":"address" }] } + { "type" : "event", "name" : "args", "inputs" : [{ "indexed":false, "name":"arg0", "type":"uint256" }, { "indexed":true, "name":"arg1", "type":"address" }] }, + { "type" : "event", "name" : "tuple", "inputs" : [{ "indexed":false, "name":"t", "type":"tuple", "components":[{"name":"a", "type":"uint256"}] }, { "indexed":true, "name":"arg1", "type":"address" }] } ]` - arg0, _ := NewType("uint256") - arg1, _ := NewType("address") + arg0, _ := NewType("uint256", nil) + arg1, _ := NewType("address", nil) + tuple, _ := NewType("tuple", []ArgumentMarshaling{{Name: "a", Type: "uint256"}}) expectedEvents := map[string]struct { Anonymous bool @@ -580,6 +595,10 @@ func TestBareEvents(t *testing.T) { {Name: "arg0", Type: arg0, Indexed: false}, {Name: "arg1", Type: arg1, Indexed: true}, }}, + "tuple": {false, []Argument{ + {Name: "t", Type: tuple, Indexed: false}, + {Name: "arg1", Type: arg1, Indexed: true}, + }}, } abi, err := JSON(strings.NewReader(definition)) @@ -646,28 +665,207 @@ func TestUnpackEvent(t *testing.T) { } type ReceivedEvent struct { - Address common.Address - Amount *big.Int - Memo []byte + Sender common.Address + Amount *big.Int + Memo []byte } var ev ReceivedEvent err = abi.Unpack(&ev, "received", data) if err != nil { t.Error(err) - } else { - t.Logf("len(data): %d; received event: %+v", len(data), ev) } type ReceivedAddrEvent struct { - Address common.Address + Sender common.Address } var receivedAddrEv ReceivedAddrEvent err = abi.Unpack(&receivedAddrEv, "receivedAddr", data) if err != nil { t.Error(err) - } else { - t.Logf("len(data): %d; received event: %+v", len(data), receivedAddrEv) + } +} + +func TestUnpackEventIntoMap(t *testing.T) { + const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]` + abi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + + const hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158` + data, err := hex.DecodeString(hexdata) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + + receivedMap := map[string]interface{}{} + expectedReceivedMap := map[string]interface{}{ + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := abi.UnpackIntoMap(receivedMap, "received", data); err != nil { + t.Error(err) + } + if len(receivedMap) != 3 { + t.Error("unpacked `received` map expected to have length 3") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked `received` map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked `received` map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked `received` map does not match expected map") + } + + receivedAddrMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(receivedAddrMap, "receivedAddr", data); err != nil { + t.Error(err) + } + if len(receivedAddrMap) != 1 { + t.Error("unpacked `receivedAddr` map expected to have length 1") + } + if receivedAddrMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked `receivedAddr` map does not match expected map") + } +} + +func TestUnpackMethodIntoMap(t *testing.T) { + const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]` + abi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + const hexdata = `00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000015800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000158000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000015800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000158` + data, err := hex.DecodeString(hexdata) + if err != nil { + t.Fatal(err) + } + if len(data)%32 != 0 { + t.Errorf("len(data) is %d, want a multiple of 32", len(data)) + } + + // Tests a method with no outputs + receiveMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(receiveMap, "receive", data); err != nil { + t.Error(err) + } + if len(receiveMap) > 0 { + t.Error("unpacked `receive` map expected to have length 0") + } + + // Tests a method with only outputs + sendMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(sendMap, "send", data); err != nil { + t.Error(err) + } + if len(sendMap) != 1 { + t.Error("unpacked `send` map expected to have length 1") + } + if sendMap["amount"].(*big.Int).Cmp(big.NewInt(1)) != 0 { + t.Error("unpacked `send` map expected `amount` value of 1") + } + + // Tests a method with outputs and inputs + getMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(getMap, "get", data); err != nil { + t.Error(err) + } + if len(getMap) != 1 { + t.Error("unpacked `get` map expected to have length 1") + } + expectedBytes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 88, 0} + if !bytes.Equal(getMap["hash"].([]byte), expectedBytes) { + t.Errorf("unpacked `get` map expected `hash` value of %v", expectedBytes) + } +} + +func TestUnpackIntoMapNamingConflict(t *testing.T) { + // Two methods have the same name + var abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"get","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]` + abi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + var hexdata = `00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158` + data, err := hex.DecodeString(hexdata) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + getMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(getMap, "get", data); err == nil { + t.Error("naming conflict between two methods; error expected") + } + + // Two events have the same name + abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"received","type":"event"}]` + abi, err = JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158` + data, err = hex.DecodeString(hexdata) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + receivedMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(receivedMap, "received", data); err != nil { + t.Error("naming conflict between two events; no error expected") + } + + // Method and event have the same name + abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"received","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]` + abi, err = JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + if err = abi.UnpackIntoMap(receivedMap, "received", data); err == nil { + t.Error("naming conflict between an event and a method; error expected") + } + + // Conflict is case sensitive + abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"received","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]` + abi, err = JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + expectedReceivedMap := map[string]interface{}{ + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err = abi.UnpackIntoMap(receivedMap, "Received", data); err != nil { + t.Error(err) + } + if len(receivedMap) != 3 { + t.Error("unpacked `received` map expected to have length 3") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked `received` map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked `received` map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked `received` map does not match expected map") } } @@ -722,3 +920,113 @@ func TestABI_MethodById(t *testing.T) { t.Errorf("Expected error, nil is short to decode data") } } + +func TestABI_EventById(t *testing.T) { + tests := []struct { + name string + json string + event string + }{ + { + name: "", + json: `[ + {"type":"event","name":"received","anonymous":false,"inputs":[ + {"indexed":false,"name":"sender","type":"address"}, + {"indexed":false,"name":"amount","type":"uint256"}, + {"indexed":false,"name":"memo","type":"bytes"} + ] + }]`, + event: "received(address,uint256,bytes)", + }, { + name: "", + json: `[ + { "constant": true, "inputs": [], "name": "name", "outputs": [ { "name": "", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": false, "inputs": [ { "name": "_spender", "type": "address" }, { "name": "_value", "type": "uint256" } ], "name": "approve", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, + { "constant": true, "inputs": [], "name": "totalSupply", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": false, "inputs": [ { "name": "_from", "type": "address" }, { "name": "_to", "type": "address" }, { "name": "_value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, + { "constant": true, "inputs": [], "name": "decimals", "outputs": [ { "name": "", "type": "uint8" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": true, "inputs": [ { "name": "_owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "name": "balance", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": true, "inputs": [], "name": "symbol", "outputs": [ { "name": "", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": false, "inputs": [ { "name": "_to", "type": "address" }, { "name": "_value", "type": "uint256" } ], "name": "transfer", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, + { "constant": true, "inputs": [ { "name": "_owner", "type": "address" }, { "name": "_spender", "type": "address" } ], "name": "allowance", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { "anonymous": false, "inputs": [ { "indexed": true, "name": "owner", "type": "address" }, { "indexed": true, "name": "spender", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, + { "anonymous": false, "inputs": [ { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" } + ]`, + event: "Transfer(address,address,uint256)", + }, + } + + for testnum, test := range tests { + abi, err := JSON(strings.NewReader(test.json)) + if err != nil { + t.Error(err) + } + + topic := test.event + topicID := crypto.Keccak256Hash([]byte(topic)) + + event, err := abi.EventByID(topicID) + if err != nil { + t.Fatalf("Failed to look up ABI method: %v, test #%d", err, testnum) + } + if event == nil { + t.Errorf("We should find a event for topic %s, test #%d", topicID.Hex(), testnum) + } + + if event.Id() != topicID { + t.Errorf("Event id %s does not match topic %s, test #%d", event.Id().Hex(), topicID.Hex(), testnum) + } + + unknowntopicID := crypto.Keccak256Hash([]byte("unknownEvent")) + unknownEvent, err := abi.EventByID(unknowntopicID) + if err == nil { + t.Errorf("EventByID should return an error if a topic is not found, test #%d", testnum) + } + if unknownEvent != nil { + t.Errorf("We should not find any event for topic %s, test #%d", unknowntopicID.Hex(), testnum) + } + } +} + +func TestDuplicateMethodNames(t *testing.T) { + abiJSON := `[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"},{"name":"customFallback","type":"string"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]` + contractAbi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + if _, ok := contractAbi.Methods["transfer"]; !ok { + t.Fatalf("Could not find original method") + } + if _, ok := contractAbi.Methods["transfer0"]; !ok { + t.Fatalf("Could not find duplicate method") + } + if _, ok := contractAbi.Methods["transfer1"]; !ok { + t.Fatalf("Could not find duplicate method") + } + if _, ok := contractAbi.Methods["transfer2"]; ok { + t.Fatalf("Should not have found extra method") + } +} + +// TestDoubleDuplicateMethodNames checks that if transfer0 already exists, there won't be a name +// conflict and that the second transfer method will be renamed transfer1. +func TestDoubleDuplicateMethodNames(t *testing.T) { + abiJSON := `[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transfer0","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"},{"name":"customFallback","type":"string"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]` + contractAbi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + if _, ok := contractAbi.Methods["transfer"]; !ok { + t.Fatalf("Could not find original method") + } + if _, ok := contractAbi.Methods["transfer0"]; !ok { + t.Fatalf("Could not find duplicate method") + } + if _, ok := contractAbi.Methods["transfer1"]; !ok { + t.Fatalf("Could not find duplicate method") + } + if _, ok := contractAbi.Methods["transfer2"]; ok { + t.Fatalf("Should not have found extra method") + } +} diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go index 93b513c346df..4dae586535fd 100644 --- a/accounts/abi/argument.go +++ b/accounts/abi/argument.go @@ -33,24 +33,27 @@ type Argument struct { type Arguments []Argument +type ArgumentMarshaling struct { + Name string + Type string + Components []ArgumentMarshaling + Indexed bool +} + // UnmarshalJSON implements json.Unmarshaler interface func (argument *Argument) UnmarshalJSON(data []byte) error { - var extarg struct { - Name string - Type string - Indexed bool - } - err := json.Unmarshal(data, &extarg) + var arg ArgumentMarshaling + err := json.Unmarshal(data, &arg) if err != nil { return fmt.Errorf("argument json err: %v", err) } - argument.Type, err = NewType(extarg.Type) + argument.Type, err = NewType(arg.Type, arg.Components) if err != nil { return err } - argument.Name = extarg.Name - argument.Indexed = extarg.Indexed + argument.Name = arg.Name + argument.Indexed = arg.Indexed return nil } @@ -85,7 +88,6 @@ func (arguments Arguments) isTuple() bool { // Unpack performs the operation hexdata -> Go format func (arguments Arguments) Unpack(v interface{}, data []byte) error { - // make sure the passed value is arguments pointer if reflect.Ptr != reflect.ValueOf(v).Kind() { return fmt.Errorf("abi: Unpack(non-pointer %T)", v) @@ -97,52 +99,168 @@ func (arguments Arguments) Unpack(v interface{}, data []byte) error { if arguments.isTuple() { return arguments.unpackTuple(v, marshalledValues) } - return arguments.unpackAtomic(v, marshalledValues) + return arguments.unpackAtomic(v, marshalledValues[0]) } -func (arguments Arguments) unpackTuple(v interface{}, marshalledValues []interface{}) error { +// UnpackIntoMap performs the operation hexdata -> mapping of argument name to argument value +func (arguments Arguments) UnpackIntoMap(v map[string]interface{}, data []byte) error { + marshalledValues, err := arguments.UnpackValues(data) + if err != nil { + return err + } + return arguments.unpackIntoMap(v, marshalledValues) +} + +// unpack sets the unmarshalled value to go format. +// Note the dst here must be settable. +func unpack(t *Type, dst interface{}, src interface{}) error { + var ( + dstVal = reflect.ValueOf(dst).Elem() + srcVal = reflect.ValueOf(src) + ) + tuple, typ := false, t + for { + if typ.T == SliceTy || typ.T == ArrayTy { + typ = typ.Elem + continue + } + tuple = typ.T == TupleTy + break + } + if !tuple { + return set(dstVal, srcVal) + } + + // Dereferences interface or pointer wrapper + dstVal = indirectInterfaceOrPtr(dstVal) + + switch t.T { + case TupleTy: + if dstVal.Kind() != reflect.Struct { + return fmt.Errorf("abi: invalid dst value for unpack, want struct, got %s", dstVal.Kind()) + } + fieldmap, err := mapArgNamesToStructFields(t.TupleRawNames, dstVal) + if err != nil { + return err + } + for i, elem := range t.TupleElems { + fname := fieldmap[t.TupleRawNames[i]] + field := dstVal.FieldByName(fname) + if !field.IsValid() { + return fmt.Errorf("abi: field %s can't found in the given value", t.TupleRawNames[i]) + } + if err := unpack(elem, field.Addr().Interface(), srcVal.Field(i).Interface()); err != nil { + return err + } + } + return nil + case SliceTy: + if dstVal.Kind() != reflect.Slice { + return fmt.Errorf("abi: invalid dst value for unpack, want slice, got %s", dstVal.Kind()) + } + slice := reflect.MakeSlice(dstVal.Type(), srcVal.Len(), srcVal.Len()) + for i := 0; i < slice.Len(); i++ { + if err := unpack(t.Elem, slice.Index(i).Addr().Interface(), srcVal.Index(i).Interface()); err != nil { + return err + } + } + dstVal.Set(slice) + case ArrayTy: + if dstVal.Kind() != reflect.Array { + return fmt.Errorf("abi: invalid dst value for unpack, want array, got %s", dstVal.Kind()) + } + array := reflect.New(dstVal.Type()).Elem() + for i := 0; i < array.Len(); i++ { + if err := unpack(t.Elem, array.Index(i).Addr().Interface(), srcVal.Index(i).Interface()); err != nil { + return err + } + } + dstVal.Set(array) + } + return nil +} + +// unpackIntoMap unpacks marshalledValues into the provided map[string]interface{} +func (arguments Arguments) unpackIntoMap(v map[string]interface{}, marshalledValues []interface{}) error { + // Make sure map is not nil + if v == nil { + return fmt.Errorf("abi: cannot unpack into a nil map") + } + + for i, arg := range arguments.NonIndexed() { + v[arg.Name] = marshalledValues[i] + } + return nil +} + +// unpackAtomic unpacks ( hexdata -> go ) a single value +func (arguments Arguments) unpackAtomic(v interface{}, marshalledValues interface{}) error { + if arguments.LengthNonIndexed() == 0 { + return nil + } + argument := arguments.NonIndexed()[0] + elem := reflect.ValueOf(v).Elem() + + if elem.Kind() == reflect.Struct && argument.Type.T != TupleTy { + fieldmap, err := mapArgNamesToStructFields([]string{argument.Name}, elem) + if err != nil { + return err + } + field := elem.FieldByName(fieldmap[argument.Name]) + if !field.IsValid() { + return fmt.Errorf("abi: field %s can't be found in the given value", argument.Name) + } + return unpack(&argument.Type, field.Addr().Interface(), marshalledValues) + } + return unpack(&argument.Type, elem.Addr().Interface(), marshalledValues) +} + +// unpackTuple unpacks ( hexdata -> go ) a batch of values. +func (arguments Arguments) unpackTuple(v interface{}, marshalledValues []interface{}) error { var ( value = reflect.ValueOf(v).Elem() typ = value.Type() kind = value.Kind() ) - if err := requireUnpackKind(value, typ, kind, arguments); err != nil { return err } // If the interface is a struct, get of abi->struct_field mapping - var abi2struct map[string]string if kind == reflect.Struct { - var err error - abi2struct, err = mapAbiToStructFields(arguments, value) + var ( + argNames []string + err error + ) + for _, arg := range arguments.NonIndexed() { + argNames = append(argNames, arg.Name) + } + abi2struct, err = mapArgNamesToStructFields(argNames, value) if err != nil { return err } } for i, arg := range arguments.NonIndexed() { - - reflectValue := reflect.ValueOf(marshalledValues[i]) - switch kind { case reflect.Struct: - if structField, ok := abi2struct[arg.Name]; ok { - if err := set(value.FieldByName(structField), reflectValue, arg); err != nil { - return err - } + field := value.FieldByName(abi2struct[arg.Name]) + if !field.IsValid() { + return fmt.Errorf("abi: field %s can't be found in the given value", arg.Name) + } + if err := unpack(&arg.Type, field.Addr().Interface(), marshalledValues[i]); err != nil { + return err } case reflect.Slice, reflect.Array: if value.Len() < i { return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", len(arguments), value.Len()) } v := value.Index(i) - if err := requireAssignable(v, reflectValue); err != nil { + if err := requireAssignable(v, reflect.ValueOf(marshalledValues[i])); err != nil { return err } - - if err := set(v.Elem(), reflectValue, arg); err != nil { + if err := unpack(&arg.Type, v.Addr().Interface(), marshalledValues[i]); err != nil { return err } default: @@ -150,50 +268,9 @@ func (arguments Arguments) unpackTuple(v interface{}, marshalledValues []interfa } } return nil -} - -// unpackAtomic unpacks ( hexdata -> go ) a single value -func (arguments Arguments) unpackAtomic(v interface{}, marshalledValues []interface{}) error { - if len(marshalledValues) != 1 { - return fmt.Errorf("abi: wrong length, expected single value, got %d", len(marshalledValues)) - } - - elem := reflect.ValueOf(v).Elem() - kind := elem.Kind() - reflectValue := reflect.ValueOf(marshalledValues[0]) - - var abi2struct map[string]string - if kind == reflect.Struct { - var err error - if abi2struct, err = mapAbiToStructFields(arguments, elem); err != nil { - return err - } - arg := arguments.NonIndexed()[0] - if structField, ok := abi2struct[arg.Name]; ok { - return set(elem.FieldByName(structField), reflectValue, arg) - } - return nil - } - - return set(elem, reflectValue, arguments.NonIndexed()[0]) } -// Computes the full size of an array; -// i.e. counting nested arrays, which count towards size for unpacking. -func getArraySize(arr *Type) int { - size := arr.Size - // Arrays can be nested, with each element being the same size - arr = arr.Elem - for arr.T == ArrayTy { - // Keep multiplying by elem.Size while the elem is an array. - size *= arr.Size - arr = arr.Elem - } - // Now we have the full array size, including its children. - return size -} - // UnpackValues can be used to unpack ABI-encoded hexdata according to the ABI-specification, // without supplying a struct to unpack into. Instead, this method returns a list containing the // values. An atomic argument will be a list with one element. @@ -202,7 +279,7 @@ func (arguments Arguments) UnpackValues(data []byte) ([]interface{}, error) { virtualArgs := 0 for index, arg := range arguments.NonIndexed() { marshalledValue, err := toGoType((index+virtualArgs)*32, arg.Type, data) - if arg.Type.T == ArrayTy { + if arg.Type.T == ArrayTy && !isDynamicType(arg.Type) { // If we have a static array, like [3]uint256, these are coded as // just like uint256,uint256,uint256. // This means that we need to add two 'virtual' arguments when @@ -213,7 +290,11 @@ func (arguments Arguments) UnpackValues(data []byte) ([]interface{}, error) { // // Calculate the full array size to get the correct offset for the next argument. // Decrement it by 1, as the normal index increment is still applied. - virtualArgs += getArraySize(&arg.Type) - 1 + virtualArgs += getTypeSize(arg.Type)/32 - 1 + } else if arg.Type.T == TupleTy && !isDynamicType(arg.Type) { + // If we have a static tuple, like (uint256, bool, uint256), these are + // coded as just like uint256,bool,uint256 + virtualArgs += getTypeSize(arg.Type)/32 - 1 } if err != nil { return nil, err @@ -243,11 +324,7 @@ func (arguments Arguments) Pack(args ...interface{}) ([]byte, error) { // input offset is the bytes offset for packed output inputOffset := 0 for _, abiArg := range abiArgs { - if abiArg.Type.T == ArrayTy { - inputOffset += 32 * abiArg.Type.Size - } else { - inputOffset += 32 - } + inputOffset += getTypeSize(abiArg.Type) } var ret []byte for i, a := range args { @@ -257,14 +334,13 @@ func (arguments Arguments) Pack(args ...interface{}) ([]byte, error) { if err != nil { return nil, err } - // check for a slice type (string, bytes, slice) - if input.Type.requiresLengthPrefix() { - // calculate the offset - offset := inputOffset + len(variableInput) + // check for dynamic types + if isDynamicType(input.Type) { // set the offset - ret = append(ret, packNum(reflect.ValueOf(offset))...) - // Append the packed output to the variable input. The variable input - // will be appended at the end of the input. + ret = append(ret, packNum(reflect.ValueOf(inputOffset))...) + // calculate next offset + inputOffset += len(packed) + // append to variable input variableInput = append(variableInput, packed...) } else { // append the packed value to the input @@ -277,14 +353,13 @@ func (arguments Arguments) Pack(args ...interface{}) ([]byte, error) { return ret, nil } -// capitalise makes the first character of a string upper case, also removing any -// prefixing underscores from the variable names. -func capitalise(input string) string { - for len(input) > 0 && input[0] == '_' { - input = input[1:] - } - if len(input) == 0 { - return "" +// ToCamelCase converts an under-score string to a camel-case string +func ToCamelCase(input string) string { + parts := strings.Split(input, "_") + for i, s := range parts { + if len(s) > 0 { + parts[i] = strings.ToUpper(s[:1]) + s[1:] + } } - return strings.ToUpper(input[:1]) + input[1:] + return strings.Join(parts, "") } diff --git a/accounts/abi/bind/auth.go b/accounts/abi/bind/auth.go index e6bb0c3b5286..e51f0bd8ead5 100644 --- a/accounts/abi/bind/auth.go +++ b/accounts/abi/bind/auth.go @@ -22,6 +22,8 @@ import ( "io" "io/ioutil" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/external" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -42,6 +44,24 @@ func NewTransactor(keyin io.Reader, passphrase string) (*TransactOpts, error) { return NewKeyedTransactor(key.PrivateKey), nil } +// NewKeyStoreTransactor is a utility method to easily create a transaction signer from +// an decrypted key from a keystore +func NewKeyStoreTransactor(keystore *keystore.KeyStore, account accounts.Account) (*TransactOpts, error) { + return &TransactOpts{ + From: account.Address, + Signer: func(signer types.Signer, address common.Address, tx *types.Transaction) (*types.Transaction, error) { + if address != account.Address { + return nil, errors.New("not authorized to sign this account") + } + signature, err := keystore.SignHash(account, signer.Hash(tx).Bytes()) + if err != nil { + return nil, err + } + return tx.WithSignature(signer, signature) + }, + }, nil +} + // NewKeyedTransactor is a utility method to easily create a transaction signer // from a single private key. func NewKeyedTransactor(key *ecdsa.PrivateKey) *TransactOpts { @@ -60,3 +80,17 @@ func NewKeyedTransactor(key *ecdsa.PrivateKey) *TransactOpts { }, } } + +// NewClefTransactor is a utility method to easily create a transaction signer +// with a clef backend. +func NewClefTransactor(clef *external.ExternalSigner, account accounts.Account) *TransactOpts { + return &TransactOpts{ + From: account.Address, + Signer: func(signer types.Signer, address common.Address, transaction *types.Transaction) (*types.Transaction, error) { + if address != account.Address { + return nil, errors.New("not authorized to sign this account") + } + return clef.SignTx(account, transaction, nil) // Clef enforces its own chain id + }, + } +} diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 6f46fc1495ab..6c59092b795d 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -45,8 +45,10 @@ import ( // This nil assignment ensures compile time that SimulatedBackend implements bind.ContractBackend. var _ bind.ContractBackend = (*SimulatedBackend)(nil) -var errBlockNumberUnsupported = errors.New("SimulatedBackend cannot access blocks other than the latest block") -var errGasEstimationFailed = errors.New("gas required exceeds allowance or always failing transaction") +var ( + errBlockNumberUnsupported = errors.New("simulatedBackend cannot access blocks other than the latest block") + errGasEstimationFailed = errors.New("gas required exceeds allowance or always failing transaction") +) // SimulatedBackend implements bind.ContractBackend, simulating a blockchain in // the background. Its main purpose is to allow easily testing contract bindings. @@ -63,10 +65,9 @@ type SimulatedBackend struct { config *params.ChainConfig } -// NewSimulatedBackend creates a new binding backend using a simulated blockchain -// for testing purposes. -func NewSimulatedBackend(alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBackend { - database := ethdb.NewMemDatabase() +// NewSimulatedBackendWithDatabase creates a new binding backend based on the given database +// and uses a simulated blockchain for testing purposes. +func NewSimulatedBackendWithDatabase(database ethdb.Database, alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBackend { genesis := core.Genesis{Config: params.AllEthashProtocolChanges, GasLimit: gasLimit, Alloc: alloc} genesis.MustCommit(database) blockchain, _ := core.NewBlockChain(database, nil, genesis.Config, ethash.NewFaker(), vm.Config{}, nil) @@ -81,6 +82,12 @@ func NewSimulatedBackend(alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBac return backend } +// NewSimulatedBackend creates a new binding backend using a simulated blockchain +// for testing purposes. +func NewSimulatedBackend(alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBackend { + return NewSimulatedBackendWithDatabase(rawdb.NewMemoryDatabase(), alloc, gasLimit) +} + // Commit imports all the pending transactions as a single block and starts a // fresh new state. func (b *SimulatedBackend) Commit() { @@ -160,10 +167,29 @@ func (b *SimulatedBackend) StorageAt(ctx context.Context, contract common.Addres // TransactionReceipt returns the receipt of a transaction. func (b *SimulatedBackend) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { - receipt, _, _, _ := rawdb.ReadReceipt(b.database, txHash) + receipt, _, _, _ := rawdb.ReadReceipt(b.database, txHash, b.config) return receipt, nil } +// TransactionByHash checks the pool of pending transactions in addition to the +// blockchain. The isPending return value indicates whether the transaction has been +// mined yet. Note that the transaction may not be part of the canonical chain even if +// it's not pending. +func (b *SimulatedBackend) TransactionByHash(ctx context.Context, txHash common.Hash) (*types.Transaction, bool, error) { + b.mu.Lock() + defer b.mu.Unlock() + + tx := b.pendingBlock.Transaction(txHash) + if tx != nil { + return tx, true, nil + } + tx, _, _, _ = rawdb.ReadTransaction(b.database, txHash) + if tx != nil { + return tx, false, nil + } + return nil, false, ethereum.NotFound +} + // PendingCodeAt returns the code associated with an account in the pending state. func (b *SimulatedBackend) PendingCodeAt(ctx context.Context, contract common.Address) ([]byte, error) { b.mu.Lock() @@ -297,7 +323,7 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx *types.Transa b.mu.Lock() defer b.mu.Unlock() - sender, err := types.Sender(types.HomesteadSigner{}, tx) + sender, err := types.Sender(types.NewEIP155Signer(b.config.ChainID), tx) if err != nil { panic(fmt.Errorf("invalid transaction: %v", err)) } @@ -405,6 +431,11 @@ func (b *SimulatedBackend) AdjustTime(adjustment time.Duration) error { return nil } +// Blockchain returns the underlying blockchain. +func (b *SimulatedBackend) Blockchain() *core.BlockChain { + return b.blockchain +} + // callmsg implements core.Message to allow passing it as a transaction simulator. type callmsg struct { ethereum.CallMsg @@ -445,7 +476,7 @@ func (fb *filterBackend) GetReceipts(ctx context.Context, hash common.Hash) (typ if number == nil { return nil, nil } - return rawdb.ReadReceipts(fb.db, hash, *number), nil + return rawdb.ReadReceipts(fb.db, hash, *number, fb.bc.Config()), nil } func (fb *filterBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*types.Log, error) { @@ -453,7 +484,7 @@ func (fb *filterBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*ty if number == nil { return nil, nil } - receipts := rawdb.ReadReceipts(fb.db, hash, *number) + receipts := rawdb.ReadReceipts(fb.db, hash, *number, fb.bc.Config()) if receipts == nil { return nil, nil } diff --git a/accounts/abi/bind/backends/simulated_test.go b/accounts/abi/bind/backends/simulated_test.go new file mode 100644 index 000000000000..bd75807d7513 --- /dev/null +++ b/accounts/abi/bind/backends/simulated_test.go @@ -0,0 +1,82 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package backends_test + +import ( + "context" + "math/big" + "testing" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +func TestSimulatedBackend(t *testing.T) { + var gasLimit uint64 = 8000029 + key, _ := crypto.GenerateKey() // nolint: gosec + auth := bind.NewKeyedTransactor(key) + genAlloc := make(core.GenesisAlloc) + genAlloc[auth.From] = core.GenesisAccount{Balance: big.NewInt(9223372036854775807)} + + sim := backends.NewSimulatedBackend(genAlloc, gasLimit) + + // should return an error if the tx is not found + txHash := common.HexToHash("2") + _, isPending, err := sim.TransactionByHash(context.Background(), txHash) + + if isPending { + t.Fatal("transaction should not be pending") + } + if err != ethereum.NotFound { + t.Fatalf("err should be `ethereum.NotFound` but received %v", err) + } + + // generate a transaction and confirm you can retrieve it + code := `6060604052600a8060106000396000f360606040526008565b00` + var gas uint64 = 3000000 + tx := types.NewContractCreation(0, big.NewInt(0), gas, big.NewInt(1), common.FromHex(code)) + tx, _ = types.SignTx(tx, types.HomesteadSigner{}, key) + + err = sim.SendTransaction(context.Background(), tx) + if err != nil { + t.Fatal("error sending transaction") + } + + txHash = tx.Hash() + _, isPending, err = sim.TransactionByHash(context.Background(), txHash) + if err != nil { + t.Fatalf("error getting transaction with hash: %v", txHash.String()) + } + if !isPending { + t.Fatal("transaction should have pending status") + } + + sim.Commit() + tx, isPending, err = sim.TransactionByHash(context.Background(), txHash) + if err != nil { + t.Fatalf("error getting transaction with hash: %v", txHash.String()) + } + if isPending { + t.Fatal("transaction should not have pending status") + } + +} diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index 09776c6b4700..df0db3247960 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -36,10 +36,10 @@ type SignerFn func(types.Signer, common.Address, *types.Transaction) (*types.Tra // CallOpts is the collection of options to fine tune a contract call request. type CallOpts struct { - Pending bool // Whether to operate on the pending state or the last known one - From common.Address // Optional the sender address, otherwise the first account is used - - Context context.Context // Network context to support cancellation and timeouts (nil = no timeout) + Pending bool // Whether to operate on the pending state or the last known one + From common.Address // Optional the sender address, otherwise the first account is used + BlockNumber *big.Int // Optional the block number on which the call should be performed + Context context.Context // Network context to support cancellation and timeouts (nil = no timeout) } // TransactOpts is the collection of authorization data required to create a @@ -148,10 +148,10 @@ func (c *BoundContract) Call(opts *CallOpts, result interface{}, method string, } } } else { - output, err = c.caller.CallContract(ctx, msg, nil) + output, err = c.caller.CallContract(ctx, msg, opts.BlockNumber) if err == nil && len(output) == 0 { // Make sure we have a contract to operate on, and bail out otherwise. - if code, err = c.caller.CodeAt(ctx, c.address, nil); err != nil { + if code, err = c.caller.CodeAt(ctx, c.address, opts.BlockNumber); err != nil { return err } else if len(code) == 0 { return ErrNoCode @@ -397,6 +397,22 @@ func (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log) return parseTopics(out, indexed, log.Topics[1:]) } +// UnpackLogIntoMap unpacks a retrieved log into the provided map. +func (c *BoundContract) UnpackLogIntoMap(out map[string]interface{}, event string, log types.Log) error { + if len(log.Data) > 0 { + if err := c.abi.UnpackIntoMap(out, event, log.Data); err != nil { + return err + } + } + var indexed abi.Arguments + for _, arg := range c.abi.Events[event].Inputs { + if arg.Indexed { + indexed = append(indexed, arg) + } + } + return parseTopicsIntoMap(out, indexed, log.Topics[1:]) +} + // ensureContext is a helper method to ensure a context is not nil, even if the // user specified it as such. func ensureContext(ctx context.Context) context.Context { diff --git a/accounts/abi/bind/base_test.go b/accounts/abi/bind/base_test.go new file mode 100644 index 000000000000..3ae685e00f0a --- /dev/null +++ b/accounts/abi/bind/base_test.go @@ -0,0 +1,347 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package bind_test + +import ( + "bytes" + "context" + "math/big" + "strings" + "testing" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" +) + +type mockCaller struct { + codeAtBlockNumber *big.Int + callContractBlockNumber *big.Int +} + +func (mc *mockCaller) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { + mc.codeAtBlockNumber = blockNumber + return []byte{1, 2, 3}, nil +} + +func (mc *mockCaller) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + mc.callContractBlockNumber = blockNumber + return nil, nil +} +func TestPassingBlockNumber(t *testing.T) { + + mc := &mockCaller{} + + bc := bind.NewBoundContract(common.HexToAddress("0x0"), abi.ABI{ + Methods: map[string]abi.Method{ + "something": { + Name: "something", + Outputs: abi.Arguments{}, + }, + }, + }, mc, nil, nil) + var ret string + + blockNumber := big.NewInt(42) + + bc.Call(&bind.CallOpts{BlockNumber: blockNumber}, &ret, "something") + + if mc.callContractBlockNumber != blockNumber { + t.Fatalf("CallContract() was not passed the block number") + } + + if mc.codeAtBlockNumber != blockNumber { + t.Fatalf("CodeAt() was not passed the block number") + } + + bc.Call(&bind.CallOpts{}, &ret, "something") + + if mc.callContractBlockNumber != nil { + t.Fatalf("CallContract() was passed a block number when it should not have been") + } + + if mc.codeAtBlockNumber != nil { + t.Fatalf("CodeAt() was passed a block number when it should not have been") + } +} + +const hexData = "0x000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158" + +func TestUnpackIndexedStringTyLogIntoMap(t *testing.T) { + hash := crypto.Keccak256Hash([]byte("testName")) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x0"), + hash, + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x0"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "name": hash, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["name"] != expectedReceivedMap["name"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} + +func TestUnpackIndexedSliceTyLogIntoMap(t *testing.T) { + sliceBytes, err := rlp.EncodeToBytes([]string{"name1", "name2", "name3", "name4"}) + if err != nil { + t.Fatal(err) + } + hash := crypto.Keccak256Hash(sliceBytes) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x0"), + hash, + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x0"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"names","type":"string[]"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "names": hash, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["names"] != expectedReceivedMap["names"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} + +func TestUnpackIndexedArrayTyLogIntoMap(t *testing.T) { + arrBytes, err := rlp.EncodeToBytes([2]common.Address{common.HexToAddress("0x0"), common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2")}) + if err != nil { + t.Fatal(err) + } + hash := crypto.Keccak256Hash(arrBytes) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x0"), + hash, + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x0"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"addresses","type":"address[2]"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "addresses": hash, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["addresses"] != expectedReceivedMap["addresses"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} + +func TestUnpackIndexedFuncTyLogIntoMap(t *testing.T) { + mockAddress := common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2") + addrBytes := mockAddress.Bytes() + hash := crypto.Keccak256Hash([]byte("mockFunction(address,uint)")) + functionSelector := hash[:4] + functionTyBytes := append(addrBytes, functionSelector...) + var functionTy [24]byte + copy(functionTy[:], functionTyBytes[0:24]) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x99b5620489b6ef926d4518936cfec15d305452712b88bd59da2d9c10fb0953e8"), + common.BytesToHash(functionTyBytes), + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x5c698f13940a2153440c6d19660878bc90219d9298fdcf37365aa8d88d40fc42"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"function","type":"function"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "function": functionTy, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["function"] != expectedReceivedMap["function"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} + +func TestUnpackIndexedBytesTyLogIntoMap(t *testing.T) { + byts := []byte{1, 2, 3, 4, 5} + hash := crypto.Keccak256Hash(byts) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x99b5620489b6ef926d4518936cfec15d305452712b88bd59da2d9c10fb0953e8"), + hash, + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x5c698f13940a2153440c6d19660878bc90219d9298fdcf37365aa8d88d40fc42"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"content","type":"bytes"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "content": hash, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["content"] != expectedReceivedMap["content"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go index 172bed8fa03f..cd8c942b5735 100644 --- a/accounts/abi/bind/bind.go +++ b/accounts/abi/bind/bind.go @@ -22,14 +22,16 @@ package bind import ( "bytes" + "errors" "fmt" + "go/format" "regexp" "strings" "text/template" "unicode" "github.com/ethereum/go-ethereum/accounts/abi" - "golang.org/x/tools/imports" + "github.com/ethereum/go-ethereum/log" ) // Lang is a target programming language selector to generate bindings for. @@ -45,10 +47,13 @@ const ( // to be used as is in client code, but rather as an intermediate struct which // enforces compile time type safety and naming convention opposed to having to // manually maintain hard coded strings that break on runtime. -func Bind(types []string, abis []string, bytecodes []string, pkg string, lang Lang) (string, error) { +func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]string, pkg string, lang Lang, libs map[string]string) (string, error) { // Process each individual contract requested binding contracts := make(map[string]*tmplContract) + // Map used to flag each encountered library as such + isLib := make(map[string]struct{}) + for i := 0; i < len(types); i++ { // Parse the actual ABI to generate the binding for evmABI, err := abi.JSON(strings.NewReader(abis[i])) @@ -63,11 +68,12 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La return r }, abis[i]) - // Extract the call and transact methods; events; and sort them alphabetically + // Extract the call and transact methods; events, struct definitions; and sort them alphabetically var ( calls = make(map[string]*tmplMethod) transacts = make(map[string]*tmplMethod) events = make(map[string]*tmplEvent) + structs = make(map[string]*tmplStruct) ) for _, original := range evmABI.Methods { // Normalize the method for capital cases and non-anonymous inputs/outputs @@ -80,6 +86,9 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La if input.Name == "" { normalized.Inputs[j].Name = fmt.Sprintf("arg%d", j) } + if _, exist := structs[input.Type.String()]; input.Type.T == abi.TupleTy && !exist { + bindStructType[lang](input.Type, structs) + } } normalized.Outputs = make([]abi.Argument, len(original.Outputs)) copy(normalized.Outputs, original.Outputs) @@ -87,6 +96,9 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La if output.Name != "" { normalized.Outputs[j].Name = capitalise(output.Name) } + if _, exist := structs[output.Type.String()]; output.Type.T == abi.TupleTy && !exist { + bindStructType[lang](output.Type, structs) + } } // Append the methods to the call or transact lists if original.Const { @@ -112,25 +124,61 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La if input.Name == "" { normalized.Inputs[j].Name = fmt.Sprintf("arg%d", j) } + if _, exist := structs[input.Type.String()]; input.Type.T == abi.TupleTy && !exist { + bindStructType[lang](input.Type, structs) + } } } // Append the event to the accumulator list events[original.Name] = &tmplEvent{Original: original, Normalized: normalized} } + + // There is no easy way to pass arbitrary java objects to the Go side. + if len(structs) > 0 && lang == LangJava { + return "", errors.New("java binding for tuple arguments is not supported yet") + } + contracts[types[i]] = &tmplContract{ Type: capitalise(types[i]), InputABI: strings.Replace(strippedABI, "\"", "\\\"", -1), - InputBin: strings.TrimSpace(bytecodes[i]), + InputBin: strings.TrimPrefix(strings.TrimSpace(bytecodes[i]), "0x"), Constructor: evmABI.Constructor, Calls: calls, Transacts: transacts, Events: events, + Libraries: make(map[string]string), + Structs: structs, } + // Function 4-byte signatures are stored in the same sequence + // as types, if available. + if len(fsigs) > i { + contracts[types[i]].FuncSigs = fsigs[i] + } + // Parse library references. + for pattern, name := range libs { + matched, err := regexp.Match("__\\$"+pattern+"\\$__", []byte(contracts[types[i]].InputBin)) + if err != nil { + log.Error("Could not search for pattern", "pattern", pattern, "contract", contracts[types[i]], "err", err) + } + if matched { + contracts[types[i]].Libraries[pattern] = name + // keep track that this type is a library + if _, ok := isLib[name]; !ok { + isLib[name] = struct{}{} + } + } + } + } + // Check if that type has already been identified as a library + for i := 0; i < len(types); i++ { + _, ok := isLib[types[i]] + contracts[types[i]].Library = ok } // Generate the contract template data content and render it data := &tmplData{ Package: pkg, Contracts: contracts, + Libraries: libs, } buffer := new(bytes.Buffer) @@ -138,6 +186,8 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La "bindtype": bindType[lang], "bindtopictype": bindTopicType[lang], "namedtype": namedType[lang], + "formatmethod": formatMethod, + "formatevent": formatEvent, "capitalise": capitalise, "decapitalise": decapitalise, } @@ -145,9 +195,9 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La if err := tmpl.Execute(buffer, data); err != nil { return "", err } - // For Go bindings pass the code through goimports to clean it up and double check + // For Go bindings pass the code through gofmt to clean it up if lang == LangGo { - code, err := imports.Process(".", buffer.Bytes(), nil) + code, err := format.Source(buffer.Bytes()) if err != nil { return "", fmt.Errorf("%v\n%s", err, buffer) } @@ -159,129 +209,67 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La // bindType is a set of type binders that convert Solidity types to some supported // programming language types. -var bindType = map[Lang]func(kind abi.Type) string{ +var bindType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{ LangGo: bindTypeGo, LangJava: bindTypeJava, } -// Helper function for the binding generators. -// It reads the unmatched characters after the inner type-match, -// (since the inner type is a prefix of the total type declaration), -// looks for valid arrays (possibly a dynamic one) wrapping the inner type, -// and returns the sizes of these arrays. -// -// Returned array sizes are in the same order as solidity signatures; inner array size first. -// Array sizes may also be "", indicating a dynamic array. -func wrapArray(stringKind string, innerLen int, innerMapping string) (string, []string) { - remainder := stringKind[innerLen:] - //find all the sizes - matches := regexp.MustCompile(`\[(\d*)\]`).FindAllStringSubmatch(remainder, -1) - parts := make([]string, 0, len(matches)) - for _, match := range matches { - //get group 1 from the regex match - parts = append(parts, match[1]) - } - return innerMapping, parts -} - -// Translates the array sizes to a Go-lang declaration of a (nested) array of the inner type. -// Simply returns the inner type if arraySizes is empty. -func arrayBindingGo(inner string, arraySizes []string) string { - out := "" - //prepend all array sizes, from outer (end arraySizes) to inner (start arraySizes) - for i := len(arraySizes) - 1; i >= 0; i-- { - out += "[" + arraySizes[i] + "]" - } - out += inner - return out -} - -// bindTypeGo converts a Solidity type to a Go one. Since there is no clear mapping -// from all Solidity types to Go ones (e.g. uint17), those that cannot be exactly -// mapped will use an upscaled type (e.g. *big.Int). -func bindTypeGo(kind abi.Type) string { - stringKind := kind.String() - innerLen, innerMapping := bindUnnestedTypeGo(stringKind) - return arrayBindingGo(wrapArray(stringKind, innerLen, innerMapping)) -} - -// The inner function of bindTypeGo, this finds the inner type of stringKind. -// (Or just the type itself if it is not an array or slice) -// The length of the matched part is returned, with the translated type. -func bindUnnestedTypeGo(stringKind string) (int, string) { - - switch { - case strings.HasPrefix(stringKind, "address"): - return len("address"), "common.Address" - - case strings.HasPrefix(stringKind, "bytes"): - parts := regexp.MustCompile(`bytes([0-9]*)`).FindStringSubmatch(stringKind) - return len(parts[0]), fmt.Sprintf("[%s]byte", parts[1]) - - case strings.HasPrefix(stringKind, "int") || strings.HasPrefix(stringKind, "uint"): - parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(stringKind) +// bindBasicTypeGo converts basic solidity types(except array, slice and tuple) to Go one. +func bindBasicTypeGo(kind abi.Type) string { + switch kind.T { + case abi.AddressTy: + return "common.Address" + case abi.IntTy, abi.UintTy: + parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(kind.String()) switch parts[2] { case "8", "16", "32", "64": - return len(parts[0]), fmt.Sprintf("%sint%s", parts[1], parts[2]) + return fmt.Sprintf("%sint%s", parts[1], parts[2]) } - return len(parts[0]), "*big.Int" - - case strings.HasPrefix(stringKind, "bool"): - return len("bool"), "bool" - - case strings.HasPrefix(stringKind, "string"): - return len("string"), "string" - + return "*big.Int" + case abi.FixedBytesTy: + return fmt.Sprintf("[%d]byte", kind.Size) + case abi.BytesTy: + return "[]byte" + case abi.FunctionTy: + return "[24]byte" default: - return len(stringKind), stringKind + // string, bool types + return kind.String() } } -// Translates the array sizes to a Java declaration of a (nested) array of the inner type. -// Simply returns the inner type if arraySizes is empty. -func arrayBindingJava(inner string, arraySizes []string) string { - // Java array type declarations do not include the length. - return inner + strings.Repeat("[]", len(arraySizes)) -} - -// bindTypeJava converts a Solidity type to a Java one. Since there is no clear mapping -// from all Solidity types to Java ones (e.g. uint17), those that cannot be exactly +// bindTypeGo converts solidity types to Go ones. Since there is no clear mapping +// from all Solidity types to Go ones (e.g. uint17), those that cannot be exactly // mapped will use an upscaled type (e.g. BigDecimal). -func bindTypeJava(kind abi.Type) string { - stringKind := kind.String() - innerLen, innerMapping := bindUnnestedTypeJava(stringKind) - return arrayBindingJava(wrapArray(stringKind, innerLen, innerMapping)) +func bindTypeGo(kind abi.Type, structs map[string]*tmplStruct) string { + switch kind.T { + case abi.TupleTy: + return structs[kind.String()].Name + case abi.ArrayTy: + return fmt.Sprintf("[%d]", kind.Size) + bindTypeGo(*kind.Elem, structs) + case abi.SliceTy: + return "[]" + bindTypeGo(*kind.Elem, structs) + default: + return bindBasicTypeGo(kind) + } } -// The inner function of bindTypeJava, this finds the inner type of stringKind. -// (Or just the type itself if it is not an array or slice) -// The length of the matched part is returned, with the translated type. -func bindUnnestedTypeJava(stringKind string) (int, string) { - - switch { - case strings.HasPrefix(stringKind, "address"): - parts := regexp.MustCompile(`address(\[[0-9]*\])?`).FindStringSubmatch(stringKind) - if len(parts) != 2 { - return len(stringKind), stringKind - } - if parts[1] == "" { - return len("address"), "Address" - } - return len(parts[0]), "Addresses" - - case strings.HasPrefix(stringKind, "bytes"): - parts := regexp.MustCompile(`bytes([0-9]*)`).FindStringSubmatch(stringKind) - if len(parts) != 2 { - return len(stringKind), stringKind - } - return len(parts[0]), "byte[]" - - case strings.HasPrefix(stringKind, "int") || strings.HasPrefix(stringKind, "uint"): - //Note that uint and int (without digits) are also matched, +// bindBasicTypeJava converts basic solidity types(except array, slice and tuple) to Java one. +func bindBasicTypeJava(kind abi.Type) string { + switch kind.T { + case abi.AddressTy: + return "Address" + case abi.IntTy, abi.UintTy: + // Note that uint and int (without digits) are also matched, // these are size 256, and will translate to BigInt (the default). - parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(stringKind) + parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(kind.String()) if len(parts) != 3 { - return len(stringKind), stringKind + return kind.String() + } + // All unsigned integers should be translated to BigInt since gomobile doesn't + // support them. + if parts[1] == "u" { + return "BigInt" } namedSize := map[string]string{ @@ -291,50 +279,146 @@ func bindUnnestedTypeJava(stringKind string) (int, string) { "64": "long", }[parts[2]] - //default to BigInt + // default to BigInt if namedSize == "" { namedSize = "BigInt" } - return len(parts[0]), namedSize - - case strings.HasPrefix(stringKind, "bool"): - return len("bool"), "boolean" + return namedSize + case abi.FixedBytesTy, abi.BytesTy: + return "byte[]" + case abi.BoolTy: + return "boolean" + case abi.StringTy: + return "String" + case abi.FunctionTy: + return "byte[24]" + default: + return kind.String() + } +} - case strings.HasPrefix(stringKind, "string"): - return len("string"), "String" +// pluralizeJavaType explicitly converts multidimensional types to predefined +// type in go side. +func pluralizeJavaType(typ string) string { + switch typ { + case "boolean": + return "Bools" + case "String": + return "Strings" + case "Address": + return "Addresses" + case "byte[]": + return "Binaries" + case "BigInt": + return "BigInts" + } + return typ + "[]" +} +// bindTypeJava converts a Solidity type to a Java one. Since there is no clear mapping +// from all Solidity types to Java ones (e.g. uint17), those that cannot be exactly +// mapped will use an upscaled type (e.g. BigDecimal). +func bindTypeJava(kind abi.Type, structs map[string]*tmplStruct) string { + switch kind.T { + case abi.TupleTy: + return structs[kind.String()].Name + case abi.ArrayTy, abi.SliceTy: + return pluralizeJavaType(bindTypeJava(*kind.Elem, structs)) default: - return len(stringKind), stringKind + return bindBasicTypeJava(kind) } } // bindTopicType is a set of type binders that convert Solidity types to some // supported programming language topic types. -var bindTopicType = map[Lang]func(kind abi.Type) string{ +var bindTopicType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{ LangGo: bindTopicTypeGo, LangJava: bindTopicTypeJava, } -// bindTypeGo converts a Solidity topic type to a Go one. It is almost the same +// bindTopicTypeGo converts a Solidity topic type to a Go one. It is almost the same // funcionality as for simple types, but dynamic types get converted to hashes. -func bindTopicTypeGo(kind abi.Type) string { - bound := bindTypeGo(kind) +func bindTopicTypeGo(kind abi.Type, structs map[string]*tmplStruct) string { + bound := bindTypeGo(kind, structs) if bound == "string" || bound == "[]byte" { bound = "common.Hash" } return bound } -// bindTypeGo converts a Solidity topic type to a Java one. It is almost the same +// bindTopicTypeJava converts a Solidity topic type to a Java one. It is almost the same // funcionality as for simple types, but dynamic types get converted to hashes. -func bindTopicTypeJava(kind abi.Type) string { - bound := bindTypeJava(kind) - if bound == "String" || bound == "Bytes" { +func bindTopicTypeJava(kind abi.Type, structs map[string]*tmplStruct) string { + bound := bindTypeJava(kind, structs) + if bound == "String" || bound == "byte[]" { bound = "Hash" } return bound } +// bindStructType is a set of type binders that convert Solidity tuple types to some supported +// programming language struct definition. +var bindStructType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{ + LangGo: bindStructTypeGo, + LangJava: bindStructTypeJava, +} + +// bindStructTypeGo converts a Solidity tuple type to a Go one and records the mapping +// in the given map. +// Notably, this function will resolve and record nested struct recursively. +func bindStructTypeGo(kind abi.Type, structs map[string]*tmplStruct) string { + switch kind.T { + case abi.TupleTy: + if s, exist := structs[kind.String()]; exist { + return s.Name + } + var fields []*tmplField + for i, elem := range kind.TupleElems { + field := bindStructTypeGo(*elem, structs) + fields = append(fields, &tmplField{Type: field, Name: capitalise(kind.TupleRawNames[i]), SolKind: *elem}) + } + name := fmt.Sprintf("Struct%d", len(structs)) + structs[kind.String()] = &tmplStruct{ + Name: name, + Fields: fields, + } + return name + case abi.ArrayTy: + return fmt.Sprintf("[%d]", kind.Size) + bindStructTypeGo(*kind.Elem, structs) + case abi.SliceTy: + return "[]" + bindStructTypeGo(*kind.Elem, structs) + default: + return bindBasicTypeGo(kind) + } +} + +// bindStructTypeJava converts a Solidity tuple type to a Java one and records the mapping +// in the given map. +// Notably, this function will resolve and record nested struct recursively. +func bindStructTypeJava(kind abi.Type, structs map[string]*tmplStruct) string { + switch kind.T { + case abi.TupleTy: + if s, exist := structs[kind.String()]; exist { + return s.Name + } + var fields []*tmplField + for i, elem := range kind.TupleElems { + field := bindStructTypeJava(*elem, structs) + fields = append(fields, &tmplField{Type: field, Name: decapitalise(kind.TupleRawNames[i]), SolKind: *elem}) + } + name := fmt.Sprintf("Class%d", len(structs)) + structs[kind.String()] = &tmplStruct{ + Name: name, + Fields: fields, + } + return name + case abi.ArrayTy, abi.SliceTy: + return pluralizeJavaType(bindStructTypeJava(*kind.Elem, structs)) + default: + return bindBasicTypeJava(kind) + } +} + // namedType is a set of functions that transform language specific types to // named versions that my be used inside method names. var namedType = map[Lang]func(string, abi.Type) string{ @@ -348,18 +432,8 @@ func namedTypeJava(javaKind string, solKind abi.Type) string { switch javaKind { case "byte[]": return "Binary" - case "byte[][]": - return "Binaries" - case "string": - return "String" - case "string[]": - return "Strings" case "boolean": return "Bool" - case "boolean[]": - return "Bools" - case "BigInt[]": - return "BigInts" default: parts := regexp.MustCompile(`(u)?int([0-9]*)(\[[0-9]*\])?`).FindStringSubmatch(solKind.String()) if len(parts) != 4 { @@ -381,54 +455,23 @@ func namedTypeJava(javaKind string, solKind abi.Type) string { // methodNormalizer is a name transformer that modifies Solidity method names to // conform to target language naming concentions. var methodNormalizer = map[Lang]func(string) string{ - LangGo: capitalise, + LangGo: abi.ToCamelCase, LangJava: decapitalise, } // capitalise makes a camel-case string which starts with an upper case character. func capitalise(input string) string { - for len(input) > 0 && input[0] == '_' { - input = input[1:] - } - if len(input) == 0 { - return "" - } - return toCamelCase(strings.ToUpper(input[:1]) + input[1:]) + return abi.ToCamelCase(input) } // decapitalise makes a camel-case string which starts with a lower case character. func decapitalise(input string) string { - for len(input) > 0 && input[0] == '_' { - input = input[1:] - } if len(input) == 0 { - return "" + return input } - return toCamelCase(strings.ToLower(input[:1]) + input[1:]) -} - -// toCamelCase converts an under-score string to a camel-case string -func toCamelCase(input string) string { - toupper := false - - result := "" - for k, v := range input { - switch { - case k == 0: - result = strings.ToUpper(string(input[0])) - - case toupper: - result += strings.ToUpper(string(v)) - toupper = false - case v == '_': - toupper = true - - default: - result += string(v) - } - } - return result + goForm := abi.ToCamelCase(input) + return strings.ToLower(goForm[:1]) + goForm[1:] } // structured checks whether a list of ABI data types has enough information to @@ -453,3 +496,63 @@ func structured(args abi.Arguments) bool { } return true } + +// resolveArgName converts a raw argument representation into a user friendly format. +func resolveArgName(arg abi.Argument, structs map[string]*tmplStruct) string { + var ( + prefix string + embedded string + typ = &arg.Type + ) +loop: + for { + switch typ.T { + case abi.SliceTy: + prefix += "[]" + case abi.ArrayTy: + prefix += fmt.Sprintf("[%d]", typ.Size) + default: + embedded = typ.String() + break loop + } + typ = typ.Elem + } + if s, exist := structs[embedded]; exist { + return prefix + s.Name + } else { + return arg.Type.String() + } +} + +// formatMethod transforms raw method representation into a user friendly one. +func formatMethod(method abi.Method, structs map[string]*tmplStruct) string { + inputs := make([]string, len(method.Inputs)) + for i, input := range method.Inputs { + inputs[i] = fmt.Sprintf("%v %v", resolveArgName(input, structs), input.Name) + } + outputs := make([]string, len(method.Outputs)) + for i, output := range method.Outputs { + outputs[i] = resolveArgName(output, structs) + if len(output.Name) > 0 { + outputs[i] += fmt.Sprintf(" %v", output.Name) + } + } + constant := "" + if method.Const { + constant = "constant " + } + return fmt.Sprintf("function %v(%v) %sreturns(%v)", method.Name, strings.Join(inputs, ", "), constant, strings.Join(outputs, ", ")) +} + +// formatEvent transforms raw event representation into a user friendly one. +func formatEvent(event abi.Event, structs map[string]*tmplStruct) string { + inputs := make([]string, len(event.Inputs)) + for i, input := range event.Inputs { + if input.Indexed { + inputs[i] = fmt.Sprintf("%v indexed %v", resolveArgName(input, structs), input.Name) + } else { + inputs[i] = fmt.Sprintf("%v %v", resolveArgName(input, structs), input.Name) + } + } + return fmt.Sprintf("event %v(%v)", event.Name, strings.Join(inputs, ", ")) +} diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index 0e5b1c1616f1..f11966c8124e 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -27,22 +27,26 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - "golang.org/x/tools/imports" ) var bindTests = []struct { name string contract string - bytecode string - abi string + bytecode []string + abi []string + imports string tester string + fsigs []map[string]string + libs map[string]string + types []string }{ // Test that the binding is available in combined and separate forms too { `Empty`, `contract NilContract {}`, - `606060405260068060106000396000f3606060405200`, - `[]`, + []string{`606060405260068060106000396000f3606060405200`}, + []string{`[]`}, + `"github.com/ethereum/go-ethereum/common"`, ` if b, err := NewEmpty(common.Address{}, nil); b == nil || err != nil { t.Fatalf("combined binding (%v) nil or error (%v) not nil", b, nil) @@ -54,45 +58,60 @@ var bindTests = []struct { t.Fatalf("transactor binding (%v) nil or error (%v) not nil", b, nil) } `, + nil, + nil, + nil, }, // Test that all the official sample contracts bind correctly { `Token`, `https://ethereum.org/token`, - `60606040526040516107fd3803806107fd83398101604052805160805160a05160c051929391820192909101600160a060020a0333166000908152600360209081526040822086905581548551838052601f6002600019610100600186161502019093169290920482018390047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390810193919290918801908390106100e857805160ff19168380011785555b506101189291505b8082111561017157600081556001016100b4565b50506002805460ff19168317905550505050610658806101a56000396000f35b828001600101855582156100ac579182015b828111156100ac5782518260005055916020019190600101906100fa565b50508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017557805160ff19168380011785555b506100c89291506100b4565b5090565b82800160010185558215610165579182015b8281111561016557825182600050559160200191906001019061018756606060405236156100775760e060020a600035046306fdde03811461007f57806323b872dd146100dc578063313ce5671461010e57806370a082311461011a57806395d89b4114610132578063a9059cbb1461018e578063cae9ca51146101bd578063dc3080f21461031c578063dd62ed3e14610341575b610365610002565b61036760008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b6103d5600435602435604435600160a060020a038316600090815260036020526040812054829010156104f357610002565b6103e760025460ff1681565b6103d560043560036020526000908152604090205481565b610367600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b610365600435602435600160a060020a033316600090815260036020526040902054819010156103f157610002565b60806020604435600481810135601f8101849004909302840160405260608381526103d5948235946024803595606494939101919081908382808284375094965050505050505060006000836004600050600033600160a060020a03168152602001908152602001600020600050600087600160a060020a031681526020019081526020016000206000508190555084905080600160a060020a0316638f4ffcb1338630876040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b50955050505050506000604051808303816000876161da5a03f11561000257505050509392505050565b6005602090815260043560009081526040808220909252602435815220546103d59081565b60046020818152903560009081526040808220909252602435815220546103d59081565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b6060908152602090f35b600160a060020a03821660009081526040902054808201101561041357610002565b806003600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806003600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b820191906000526020600020905b8154815290600101906020018083116104ce57829003601f168201915b505050505081565b600160a060020a03831681526040812054808301101561051257610002565b600160a060020a0380851680835260046020908152604080852033949094168086529382528085205492855260058252808520938552929052908220548301111561055c57610002565b816003600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816003600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816005600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054019250508190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3939250505056`, - `[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"spentAllowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"inputs":[{"name":"initialSupply","type":"uint256"},{"name":"tokenName","type":"string"},{"name":"decimalUnits","type":"uint8"},{"name":"tokenSymbol","type":"string"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]`, + []string{`60606040526040516107fd3803806107fd83398101604052805160805160a05160c051929391820192909101600160a060020a0333166000908152600360209081526040822086905581548551838052601f6002600019610100600186161502019093169290920482018390047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390810193919290918801908390106100e857805160ff19168380011785555b506101189291505b8082111561017157600081556001016100b4565b50506002805460ff19168317905550505050610658806101a56000396000f35b828001600101855582156100ac579182015b828111156100ac5782518260005055916020019190600101906100fa565b50508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017557805160ff19168380011785555b506100c89291506100b4565b5090565b82800160010185558215610165579182015b8281111561016557825182600050559160200191906001019061018756606060405236156100775760e060020a600035046306fdde03811461007f57806323b872dd146100dc578063313ce5671461010e57806370a082311461011a57806395d89b4114610132578063a9059cbb1461018e578063cae9ca51146101bd578063dc3080f21461031c578063dd62ed3e14610341575b610365610002565b61036760008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b6103d5600435602435604435600160a060020a038316600090815260036020526040812054829010156104f357610002565b6103e760025460ff1681565b6103d560043560036020526000908152604090205481565b610367600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b610365600435602435600160a060020a033316600090815260036020526040902054819010156103f157610002565b60806020604435600481810135601f8101849004909302840160405260608381526103d5948235946024803595606494939101919081908382808284375094965050505050505060006000836004600050600033600160a060020a03168152602001908152602001600020600050600087600160a060020a031681526020019081526020016000206000508190555084905080600160a060020a0316638f4ffcb1338630876040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b50955050505050506000604051808303816000876161da5a03f11561000257505050509392505050565b6005602090815260043560009081526040808220909252602435815220546103d59081565b60046020818152903560009081526040808220909252602435815220546103d59081565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b6060908152602090f35b600160a060020a03821660009081526040902054808201101561041357610002565b806003600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806003600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b820191906000526020600020905b8154815290600101906020018083116104ce57829003601f168201915b505050505081565b600160a060020a03831681526040812054808301101561051257610002565b600160a060020a0380851680835260046020908152604080852033949094168086529382528085205492855260058252808520938552929052908220548301111561055c57610002565b816003600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816003600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816005600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054019250508190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3939250505056`}, + []string{`[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"spentAllowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"inputs":[{"name":"initialSupply","type":"uint256"},{"name":"tokenName","type":"string"},{"name":"decimalUnits","type":"uint8"},{"name":"tokenSymbol","type":"string"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]`}, + `"github.com/ethereum/go-ethereum/common"`, ` if b, err := NewToken(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) } `, + nil, + nil, + nil, }, { `Crowdsale`, `https://ethereum.org/crowdsale`, - `606060408190526007805460ff1916905560a0806105a883396101006040529051608051915160c05160e05160008054600160a060020a03199081169095178155670de0b6b3a7640000958602600155603c9093024201600355930260045560058054909216909217905561052f90819061007990396000f36060604052361561006c5760e060020a600035046301cb3b20811461008257806329dcb0cf1461014457806338af3eed1461014d5780636e66f6e91461015f5780637a3a0e84146101715780637b3e5e7b1461017a578063a035b1fe14610183578063dc0d3dff1461018c575b61020060075460009060ff161561032357610002565b61020060035460009042106103205760025460015490106103cb576002548154600160a060020a0316908290606082818181858883f150915460025460408051600160a060020a039390931683526020830191909152818101869052517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6945090819003909201919050a15b60405160008054600160a060020a039081169230909116319082818181858883f150506007805460ff1916600117905550505050565b6103a160035481565b6103ab600054600160a060020a031681565b6103ab600554600160a060020a031681565b6103a160015481565b6103a160025481565b6103a160045481565b6103be60043560068054829081101561000257506000526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f8101547ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d409190910154600160a060020a03919091169082565b005b505050815481101561000257906000526020600020906002020160005060008201518160000160006101000a815481600160a060020a030219169083021790555060208201518160010160005055905050806002600082828250540192505081905550600560009054906101000a9004600160a060020a0316600160a060020a031663a9059cbb3360046000505484046040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505060408051600160a060020a03331681526020810184905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf692509081900360600190a15b50565b5060a0604052336060908152346080819052600680546001810180835592939282908280158290116102025760020281600202836000526020600020918201910161020291905b8082111561039d57805473ffffffffffffffffffffffffffffffffffffffff19168155600060019190910190815561036a565b5090565b6060908152602090f35b600160a060020a03166060908152602090f35b6060918252608052604090f35b5b60065481101561010e576006805482908110156100025760009182526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600680549254600160a060020a0316928490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460405190915082818181858883f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf660066000508281548110156100025760008290526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01548154600160a060020a039190911691908490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460408051600160a060020a0394909416845260208401919091526000838201525191829003606001919050a16001016103cc56`, - `[{"constant":false,"inputs":[],"name":"checkGoalReached","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"deadline","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"tokenReward","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"fundingGoal","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"amountRaised","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"funders","outputs":[{"name":"addr","type":"address"},{"name":"amount","type":"uint256"}],"type":"function"},{"inputs":[{"name":"ifSuccessfulSendTo","type":"address"},{"name":"fundingGoalInEthers","type":"uint256"},{"name":"durationInMinutes","type":"uint256"},{"name":"etherCostOfEachToken","type":"uint256"},{"name":"addressOfTokenUsedAsReward","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"backer","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"isContribution","type":"bool"}],"name":"FundTransfer","type":"event"}]`, + []string{`606060408190526007805460ff1916905560a0806105a883396101006040529051608051915160c05160e05160008054600160a060020a03199081169095178155670de0b6b3a7640000958602600155603c9093024201600355930260045560058054909216909217905561052f90819061007990396000f36060604052361561006c5760e060020a600035046301cb3b20811461008257806329dcb0cf1461014457806338af3eed1461014d5780636e66f6e91461015f5780637a3a0e84146101715780637b3e5e7b1461017a578063a035b1fe14610183578063dc0d3dff1461018c575b61020060075460009060ff161561032357610002565b61020060035460009042106103205760025460015490106103cb576002548154600160a060020a0316908290606082818181858883f150915460025460408051600160a060020a039390931683526020830191909152818101869052517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6945090819003909201919050a15b60405160008054600160a060020a039081169230909116319082818181858883f150506007805460ff1916600117905550505050565b6103a160035481565b6103ab600054600160a060020a031681565b6103ab600554600160a060020a031681565b6103a160015481565b6103a160025481565b6103a160045481565b6103be60043560068054829081101561000257506000526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f8101547ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d409190910154600160a060020a03919091169082565b005b505050815481101561000257906000526020600020906002020160005060008201518160000160006101000a815481600160a060020a030219169083021790555060208201518160010160005055905050806002600082828250540192505081905550600560009054906101000a9004600160a060020a0316600160a060020a031663a9059cbb3360046000505484046040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505060408051600160a060020a03331681526020810184905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf692509081900360600190a15b50565b5060a0604052336060908152346080819052600680546001810180835592939282908280158290116102025760020281600202836000526020600020918201910161020291905b8082111561039d57805473ffffffffffffffffffffffffffffffffffffffff19168155600060019190910190815561036a565b5090565b6060908152602090f35b600160a060020a03166060908152602090f35b6060918252608052604090f35b5b60065481101561010e576006805482908110156100025760009182526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600680549254600160a060020a0316928490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460405190915082818181858883f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf660066000508281548110156100025760008290526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01548154600160a060020a039190911691908490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460408051600160a060020a0394909416845260208401919091526000838201525191829003606001919050a16001016103cc56`}, + []string{`[{"constant":false,"inputs":[],"name":"checkGoalReached","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"deadline","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"tokenReward","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"fundingGoal","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"amountRaised","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"funders","outputs":[{"name":"addr","type":"address"},{"name":"amount","type":"uint256"}],"type":"function"},{"inputs":[{"name":"ifSuccessfulSendTo","type":"address"},{"name":"fundingGoalInEthers","type":"uint256"},{"name":"durationInMinutes","type":"uint256"},{"name":"etherCostOfEachToken","type":"uint256"},{"name":"addressOfTokenUsedAsReward","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"backer","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"isContribution","type":"bool"}],"name":"FundTransfer","type":"event"}]`}, + `"github.com/ethereum/go-ethereum/common"`, ` if b, err := NewCrowdsale(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) } `, + nil, + nil, + nil, }, { `DAO`, `https://ethereum.org/dao`, - `606060405260405160808061145f833960e06040529051905160a05160c05160008054600160a060020a03191633179055600184815560028490556003839055600780549182018082558280158290116100b8576003028160030283600052602060002091820191016100b891906101c8565b50506060919091015160029190910155600160a060020a0381166000146100a65760008054600160a060020a031916821790555b505050506111f18061026e6000396000f35b505060408051608081018252600080825260208281018290528351908101845281815292820192909252426060820152600780549194509250811015610002579081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889050815181546020848101517401000000000000000000000000000000000000000002600160a060020a03199290921690921760a060020a60ff021916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f9081018390048201949192919091019083901061023e57805160ff19168380011785555b50610072929150610226565b5050600060028201556001015b8082111561023a578054600160a860020a031916815560018181018054600080835592600290821615610100026000190190911604601f81901061020c57506101bb565b601f0160209004906000526020600020908101906101bb91905b8082111561023a5760008155600101610226565b5090565b828001600101855582156101af579182015b828111156101af57825182600050559160200191906001019061025056606060405236156100b95760e060020a6000350463013cf08b81146100bb578063237e9492146101285780633910682114610281578063400e3949146102995780635daf08ca146102a257806369bd34361461032f5780638160f0b5146103385780638da5cb5b146103415780639644fcbd14610353578063aa02a90f146103be578063b1050da5146103c7578063bcca1fd3146104b5578063d3c0715b146104dc578063eceb29451461058d578063f2fde38b1461067b575b005b61069c6004356004805482908110156100025790600052602060002090600a02016000506005810154815460018301546003840154600485015460068601546007870154600160a060020a03959095169750929560020194919360ff828116946101009093041692919089565b60408051602060248035600481810135601f81018590048502860185019096528585526107759581359591946044949293909201918190840183828082843750949650505050505050600060006004600050848154811015610002575090527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e600a8402908101547f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101904210806101e65750600481015460ff165b8061026757508060000160009054906101000a9004600160a060020a03168160010160005054846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f15090500193505050506040518091039020816007016000505414155b8061027757506001546005820154105b1561109257610002565b61077560043560066020526000908152604090205481565b61077560055481565b61078760043560078054829081101561000257506000526003026000805160206111d18339815191528101547fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a820154600160a060020a0382169260a060020a90920460ff16917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689019084565b61077560025481565b61077560015481565b610830600054600160a060020a031681565b604080516020604435600481810135601f81018490048402850184019095528484526100b9948135946024803595939460649492939101918190840183828082843750949650505050505050600080548190600160a060020a03908116339091161461084d57610002565b61077560035481565b604080516020604435600481810135601f8101849004840285018401909552848452610775948135946024803595939460649492939101918190840183828082843750506040805160209735808a0135601f81018a90048a0283018a019093528282529698976084979196506024909101945090925082915084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806104ab5750604081205460078054909190811015610002579082526003026000805160206111d1833981519152015460a060020a900460ff16155b15610ce557610002565b6100b960043560243560443560005433600160a060020a03908116911614610b1857610002565b604080516020604435600481810135601f810184900484028501840190955284845261077594813594602480359593946064949293910191819084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806105835750604081205460078054909190811015610002579082526003026000805160206111d18339815191520181505460a060020a900460ff16155b15610f1d57610002565b604080516020606435600481810135601f81018490048402850184019095528484526107759481359460248035956044359560849492019190819084018382808284375094965050505050505060006000600460005086815481101561000257908252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01815090508484846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005054149150610cdc565b6100b960043560005433600160a060020a03908116911614610f0857610002565b604051808a600160a060020a031681526020018981526020018060200188815260200187815260200186815260200185815260200184815260200183815260200182810382528981815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b50509a505050505050505050505060405180910390f35b60408051918252519081900360200190f35b60408051600160a060020a038616815260208101859052606081018390526080918101828152845460026001821615610100026000190190911604928201839052909160a08301908590801561081e5780601f106107f35761010080835404028352916020019161081e565b820191906000526020600020905b81548152906001019060200180831161080157829003601f168201915b50509550505050505060405180910390f35b60408051600160a060020a03929092168252519081900360200190f35b600160a060020a03851660009081526006602052604081205414156108a957604060002060078054918290556001820180825582801582901161095c5760030281600302836000526020600020918201910161095c9190610a4f565b600160a060020a03851660009081526006602052604090205460078054919350908390811015610002575060005250600381026000805160206111d183398151915201805474ff0000000000000000000000000000000000000000191660a060020a85021781555b60408051600160a060020a03871681526020810186905281517f27b022af4a8347100c7a041ce5ccf8e14d644ff05de696315196faae8cd50c9b929181900390910190a15050505050565b505050915081506080604051908101604052808681526020018581526020018481526020014281526020015060076000508381548110156100025790600052602060002090600302016000508151815460208481015160a060020a02600160a060020a03199290921690921774ff00000000000000000000000000000000000000001916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f90810183900482019491929190910190839010610ad357805160ff19168380011785555b50610b03929150610abb565b5050600060028201556001015b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610aa15750610a42565b601f016020900490600052602060002090810190610a4291905b80821115610acf5760008155600101610abb565b5090565b82800160010185558215610a36579182015b82811115610a36578251826000505591602001919060010190610ae5565b50506060919091015160029190910155610911565b600183905560028290556003819055604080518481526020810184905280820183905290517fa439d3fa452be5e0e1e24a8145e715f4fd8b9c08c96a42fd82a855a85e5d57de9181900360600190a1505050565b50508585846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005081905550600260005054603c024201816003016000508190555060008160040160006101000a81548160ff0219169083021790555060008160040160016101000a81548160ff02191690830217905550600081600501600050819055507f646fec02522b41e7125cfc859a64fd4f4cefd5dc3b6237ca0abe251ded1fa881828787876040518085815260200184600160a060020a03168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015610cc45780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1600182016005555b50949350505050565b6004805460018101808355909190828015829011610d1c57600a0281600a028360005260206000209182019101610d1c9190610db8565b505060048054929450918491508110156100025790600052602060002090600a02016000508054600160a060020a031916871781556001818101879055855160028381018054600082815260209081902096975091959481161561010002600019011691909104601f90810182900484019391890190839010610ed857805160ff19168380011785555b50610b6c929150610abb565b50506001015b80821115610acf578054600160a060020a03191681556000600182810182905560028381018054848255909281161561010002600019011604601f819010610e9c57505b5060006003830181905560048301805461ffff191690556005830181905560068301819055600783018190556008830180548282559082526020909120610db2916002028101905b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610eba57505b5050600101610e44565b601f016020900490600052602060002090810190610dfc9190610abb565b601f016020900490600052602060002090810190610e929190610abb565b82800160010185558215610da6579182015b82811115610da6578251826000505591602001919060010190610eea565b60008054600160a060020a0319168217905550565b600480548690811015610002576000918252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01905033600160a060020a0316600090815260098201602052604090205490915060ff1660011415610f8457610002565b33600160a060020a031660009081526009820160205260409020805460ff1916600190811790915560058201805490910190558315610fcd576006810180546001019055610fda565b6006810180546000190190555b7fc34f869b7ff431b034b7b9aea9822dac189a685e0b015c7d1be3add3f89128e8858533866040518085815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561107a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1509392505050565b6006810154600354901315611158578060000160009054906101000a9004600160a060020a0316600160a060020a03168160010160005054670de0b6b3a76400000284604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156111225780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f15050505060048101805460ff191660011761ff00191661010017905561116d565b60048101805460ff191660011761ff00191690555b60068101546005820154600483015460408051888152602081019490945283810192909252610100900460ff166060830152517fd220b7272a8b6d0d7d6bcdace67b936a8f175e6d5c1b3ee438b72256b32ab3af9181900360800190a1509291505056a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688`, - `[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"proposals","outputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"description","type":"string"},{"name":"votingDeadline","type":"uint256"},{"name":"executed","type":"bool"},{"name":"proposalPassed","type":"bool"},{"name":"numberOfVotes","type":"uint256"},{"name":"currentResult","type":"int256"},{"name":"proposalHash","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"executeProposal","outputs":[{"name":"result","type":"int256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"memberId","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"numProposals","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"members","outputs":[{"name":"member","type":"address"},{"name":"canVote","type":"bool"},{"name":"name","type":"string"},{"name":"memberSince","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"debatingPeriodInMinutes","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"minimumQuorum","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"targetMember","type":"address"},{"name":"canVote","type":"bool"},{"name":"memberName","type":"string"}],"name":"changeMembership","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"majorityMargin","outputs":[{"name":"","type":"int256"}],"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"JobDescription","type":"string"},{"name":"transactionBytecode","type":"bytes"}],"name":"newProposal","outputs":[{"name":"proposalID","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"}],"name":"changeVotingRules","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"supportsProposal","type":"bool"},{"name":"justificationText","type":"string"}],"name":"vote","outputs":[{"name":"voteID","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"checkProposalCode","outputs":[{"name":"codeChecksOut","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"type":"function"},{"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"},{"name":"congressLeader","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"description","type":"string"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"position","type":"bool"},{"indexed":false,"name":"voter","type":"address"},{"indexed":false,"name":"justification","type":"string"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"result","type":"int256"},{"indexed":false,"name":"quorum","type":"uint256"},{"indexed":false,"name":"active","type":"bool"}],"name":"ProposalTallied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"member","type":"address"},{"indexed":false,"name":"isMember","type":"bool"}],"name":"MembershipChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"minimumQuorum","type":"uint256"},{"indexed":false,"name":"debatingPeriodInMinutes","type":"uint256"},{"indexed":false,"name":"majorityMargin","type":"int256"}],"name":"ChangeOfRules","type":"event"}]`, + []string{`606060405260405160808061145f833960e06040529051905160a05160c05160008054600160a060020a03191633179055600184815560028490556003839055600780549182018082558280158290116100b8576003028160030283600052602060002091820191016100b891906101c8565b50506060919091015160029190910155600160a060020a0381166000146100a65760008054600160a060020a031916821790555b505050506111f18061026e6000396000f35b505060408051608081018252600080825260208281018290528351908101845281815292820192909252426060820152600780549194509250811015610002579081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889050815181546020848101517401000000000000000000000000000000000000000002600160a060020a03199290921690921760a060020a60ff021916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f9081018390048201949192919091019083901061023e57805160ff19168380011785555b50610072929150610226565b5050600060028201556001015b8082111561023a578054600160a860020a031916815560018181018054600080835592600290821615610100026000190190911604601f81901061020c57506101bb565b601f0160209004906000526020600020908101906101bb91905b8082111561023a5760008155600101610226565b5090565b828001600101855582156101af579182015b828111156101af57825182600050559160200191906001019061025056606060405236156100b95760e060020a6000350463013cf08b81146100bb578063237e9492146101285780633910682114610281578063400e3949146102995780635daf08ca146102a257806369bd34361461032f5780638160f0b5146103385780638da5cb5b146103415780639644fcbd14610353578063aa02a90f146103be578063b1050da5146103c7578063bcca1fd3146104b5578063d3c0715b146104dc578063eceb29451461058d578063f2fde38b1461067b575b005b61069c6004356004805482908110156100025790600052602060002090600a02016000506005810154815460018301546003840154600485015460068601546007870154600160a060020a03959095169750929560020194919360ff828116946101009093041692919089565b60408051602060248035600481810135601f81018590048502860185019096528585526107759581359591946044949293909201918190840183828082843750949650505050505050600060006004600050848154811015610002575090527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e600a8402908101547f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101904210806101e65750600481015460ff165b8061026757508060000160009054906101000a9004600160a060020a03168160010160005054846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f15090500193505050506040518091039020816007016000505414155b8061027757506001546005820154105b1561109257610002565b61077560043560066020526000908152604090205481565b61077560055481565b61078760043560078054829081101561000257506000526003026000805160206111d18339815191528101547fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a820154600160a060020a0382169260a060020a90920460ff16917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689019084565b61077560025481565b61077560015481565b610830600054600160a060020a031681565b604080516020604435600481810135601f81018490048402850184019095528484526100b9948135946024803595939460649492939101918190840183828082843750949650505050505050600080548190600160a060020a03908116339091161461084d57610002565b61077560035481565b604080516020604435600481810135601f8101849004840285018401909552848452610775948135946024803595939460649492939101918190840183828082843750506040805160209735808a0135601f81018a90048a0283018a019093528282529698976084979196506024909101945090925082915084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806104ab5750604081205460078054909190811015610002579082526003026000805160206111d1833981519152015460a060020a900460ff16155b15610ce557610002565b6100b960043560243560443560005433600160a060020a03908116911614610b1857610002565b604080516020604435600481810135601f810184900484028501840190955284845261077594813594602480359593946064949293910191819084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806105835750604081205460078054909190811015610002579082526003026000805160206111d18339815191520181505460a060020a900460ff16155b15610f1d57610002565b604080516020606435600481810135601f81018490048402850184019095528484526107759481359460248035956044359560849492019190819084018382808284375094965050505050505060006000600460005086815481101561000257908252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01815090508484846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005054149150610cdc565b6100b960043560005433600160a060020a03908116911614610f0857610002565b604051808a600160a060020a031681526020018981526020018060200188815260200187815260200186815260200185815260200184815260200183815260200182810382528981815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b50509a505050505050505050505060405180910390f35b60408051918252519081900360200190f35b60408051600160a060020a038616815260208101859052606081018390526080918101828152845460026001821615610100026000190190911604928201839052909160a08301908590801561081e5780601f106107f35761010080835404028352916020019161081e565b820191906000526020600020905b81548152906001019060200180831161080157829003601f168201915b50509550505050505060405180910390f35b60408051600160a060020a03929092168252519081900360200190f35b600160a060020a03851660009081526006602052604081205414156108a957604060002060078054918290556001820180825582801582901161095c5760030281600302836000526020600020918201910161095c9190610a4f565b600160a060020a03851660009081526006602052604090205460078054919350908390811015610002575060005250600381026000805160206111d183398151915201805474ff0000000000000000000000000000000000000000191660a060020a85021781555b60408051600160a060020a03871681526020810186905281517f27b022af4a8347100c7a041ce5ccf8e14d644ff05de696315196faae8cd50c9b929181900390910190a15050505050565b505050915081506080604051908101604052808681526020018581526020018481526020014281526020015060076000508381548110156100025790600052602060002090600302016000508151815460208481015160a060020a02600160a060020a03199290921690921774ff00000000000000000000000000000000000000001916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f90810183900482019491929190910190839010610ad357805160ff19168380011785555b50610b03929150610abb565b5050600060028201556001015b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610aa15750610a42565b601f016020900490600052602060002090810190610a4291905b80821115610acf5760008155600101610abb565b5090565b82800160010185558215610a36579182015b82811115610a36578251826000505591602001919060010190610ae5565b50506060919091015160029190910155610911565b600183905560028290556003819055604080518481526020810184905280820183905290517fa439d3fa452be5e0e1e24a8145e715f4fd8b9c08c96a42fd82a855a85e5d57de9181900360600190a1505050565b50508585846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005081905550600260005054603c024201816003016000508190555060008160040160006101000a81548160ff0219169083021790555060008160040160016101000a81548160ff02191690830217905550600081600501600050819055507f646fec02522b41e7125cfc859a64fd4f4cefd5dc3b6237ca0abe251ded1fa881828787876040518085815260200184600160a060020a03168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015610cc45780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1600182016005555b50949350505050565b6004805460018101808355909190828015829011610d1c57600a0281600a028360005260206000209182019101610d1c9190610db8565b505060048054929450918491508110156100025790600052602060002090600a02016000508054600160a060020a031916871781556001818101879055855160028381018054600082815260209081902096975091959481161561010002600019011691909104601f90810182900484019391890190839010610ed857805160ff19168380011785555b50610b6c929150610abb565b50506001015b80821115610acf578054600160a060020a03191681556000600182810182905560028381018054848255909281161561010002600019011604601f819010610e9c57505b5060006003830181905560048301805461ffff191690556005830181905560068301819055600783018190556008830180548282559082526020909120610db2916002028101905b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610eba57505b5050600101610e44565b601f016020900490600052602060002090810190610dfc9190610abb565b601f016020900490600052602060002090810190610e929190610abb565b82800160010185558215610da6579182015b82811115610da6578251826000505591602001919060010190610eea565b60008054600160a060020a0319168217905550565b600480548690811015610002576000918252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01905033600160a060020a0316600090815260098201602052604090205490915060ff1660011415610f8457610002565b33600160a060020a031660009081526009820160205260409020805460ff1916600190811790915560058201805490910190558315610fcd576006810180546001019055610fda565b6006810180546000190190555b7fc34f869b7ff431b034b7b9aea9822dac189a685e0b015c7d1be3add3f89128e8858533866040518085815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561107a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1509392505050565b6006810154600354901315611158578060000160009054906101000a9004600160a060020a0316600160a060020a03168160010160005054670de0b6b3a76400000284604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156111225780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f15050505060048101805460ff191660011761ff00191661010017905561116d565b60048101805460ff191660011761ff00191690555b60068101546005820154600483015460408051888152602081019490945283810192909252610100900460ff166060830152517fd220b7272a8b6d0d7d6bcdace67b936a8f175e6d5c1b3ee438b72256b32ab3af9181900360800190a1509291505056a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688`}, + []string{`[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"proposals","outputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"description","type":"string"},{"name":"votingDeadline","type":"uint256"},{"name":"executed","type":"bool"},{"name":"proposalPassed","type":"bool"},{"name":"numberOfVotes","type":"uint256"},{"name":"currentResult","type":"int256"},{"name":"proposalHash","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"executeProposal","outputs":[{"name":"result","type":"int256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"memberId","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"numProposals","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"members","outputs":[{"name":"member","type":"address"},{"name":"canVote","type":"bool"},{"name":"name","type":"string"},{"name":"memberSince","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"debatingPeriodInMinutes","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"minimumQuorum","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"targetMember","type":"address"},{"name":"canVote","type":"bool"},{"name":"memberName","type":"string"}],"name":"changeMembership","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"majorityMargin","outputs":[{"name":"","type":"int256"}],"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"JobDescription","type":"string"},{"name":"transactionBytecode","type":"bytes"}],"name":"newProposal","outputs":[{"name":"proposalID","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"}],"name":"changeVotingRules","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"supportsProposal","type":"bool"},{"name":"justificationText","type":"string"}],"name":"vote","outputs":[{"name":"voteID","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"checkProposalCode","outputs":[{"name":"codeChecksOut","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"type":"function"},{"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"},{"name":"congressLeader","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"description","type":"string"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"position","type":"bool"},{"indexed":false,"name":"voter","type":"address"},{"indexed":false,"name":"justification","type":"string"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"result","type":"int256"},{"indexed":false,"name":"quorum","type":"uint256"},{"indexed":false,"name":"active","type":"bool"}],"name":"ProposalTallied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"member","type":"address"},{"indexed":false,"name":"isMember","type":"bool"}],"name":"MembershipChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"minimumQuorum","type":"uint256"},{"indexed":false,"name":"debatingPeriodInMinutes","type":"uint256"},{"indexed":false,"name":"majorityMargin","type":"int256"}],"name":"ChangeOfRules","type":"event"}]`}, + `"github.com/ethereum/go-ethereum/common"`, ` if b, err := NewDAO(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) } `, + nil, + nil, + nil, }, // Test that named and anonymous inputs are handled correctly { - `InputChecker`, ``, ``, - ` + `InputChecker`, ``, []string{``}, + []string{` [ {"type":"function","name":"noInput","constant":true,"inputs":[],"outputs":[]}, {"type":"function","name":"namedInput","constant":true,"inputs":[{"name":"str","type":"string"}],"outputs":[]}, @@ -101,6 +120,11 @@ var bindTests = []struct { {"type":"function","name":"anonInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"outputs":[]}, {"type":"function","name":"mixedInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"str","type":"string"}],"outputs":[]} ] + `}, + ` + "fmt" + + "github.com/ethereum/go-ethereum/common" `, `if b, err := NewInputChecker(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) @@ -116,11 +140,14 @@ var bindTests = []struct { fmt.Println(err) }`, + nil, + nil, + nil, }, // Test that named and anonymous outputs are handled correctly { - `OutputChecker`, ``, ``, - ` + `OutputChecker`, ``, []string{``}, + []string{` [ {"type":"function","name":"noOutput","constant":true,"inputs":[],"outputs":[]}, {"type":"function","name":"namedOutput","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"}]}, @@ -130,6 +157,11 @@ var bindTests = []struct { {"type":"function","name":"anonOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"","type":"string"}]}, {"type":"function","name":"mixedOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"str","type":"string"}]} ] + `}, + ` + "fmt" + + "github.com/ethereum/go-ethereum/common" `, `if b, err := NewOutputChecker(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) @@ -147,11 +179,14 @@ var bindTests = []struct { fmt.Println(str1, str2, res.Str1, res.Str2, err) }`, + nil, + nil, + nil, }, // Tests that named, anonymous and indexed events are handled correctly { - `EventChecker`, ``, ``, - ` + `EventChecker`, ``, []string{``}, + []string{` [ {"type":"event","name":"empty","inputs":[]}, {"type":"event","name":"indexed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256","indexed":true}]}, @@ -159,6 +194,13 @@ var bindTests = []struct { {"type":"event","name":"anonymous","anonymous":true,"inputs":[]}, {"type":"event","name":"dynamic","inputs":[{"name":"idxStr","type":"string","indexed":true},{"name":"idxDat","type":"bytes","indexed":true},{"name":"str","type":"string"},{"name":"dat","type":"bytes"}]} ] + `}, + ` + "fmt" + "math/big" + "reflect" + + "github.com/ethereum/go-ethereum/common" `, `if e, err := NewEventChecker(common.Address{}, nil); e == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", e, nil) @@ -205,6 +247,9 @@ var bindTests = []struct { if _, ok := reflect.TypeOf(&EventChecker{}).MethodByName("FilterAnonymous"); ok { t.Errorf("binding has disallowed method (FilterAnonymous)") }`, + nil, + nil, + nil, }, // Test that contract interactions (deploy, transact and call) generate working code { @@ -223,8 +268,16 @@ var bindTests = []struct { } } `, - `6060604052604051610328380380610328833981016040528051018060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10608d57805160ff19168380011785555b50607c9291505b8082111560ba57838155600101606b565b50505061026a806100be6000396000f35b828001600101855582156064579182015b828111156064578251826000505591602001919060010190609e565b509056606060405260e060020a60003504630d86a0e181146100315780636874e8091461008d578063d736c513146100ea575b005b610190600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b61019060008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b60206004803580820135601f81018490049093026080908101604052606084815261002f946024939192918401918190838280828437509496505050505050508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023157805160ff19168380011785555b506102619291505b808211156102665760008155830161017d565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b820191906000526020600020905b81548152906001019060200180831161020c57829003601f168201915b505050505081565b82800160010185558215610175579182015b82811115610175578251826000505591602001919060010190610243565b505050565b509056`, - `[{"constant":true,"inputs":[],"name":"transactString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":true,"inputs":[],"name":"deployString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"str","type":"string"}],"name":"transact","outputs":[],"type":"function"},{"inputs":[{"name":"str","type":"string"}],"type":"constructor"}]`, + []string{`6060604052604051610328380380610328833981016040528051018060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10608d57805160ff19168380011785555b50607c9291505b8082111560ba57838155600101606b565b50505061026a806100be6000396000f35b828001600101855582156064579182015b828111156064578251826000505591602001919060010190609e565b509056606060405260e060020a60003504630d86a0e181146100315780636874e8091461008d578063d736c513146100ea575b005b610190600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b61019060008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b60206004803580820135601f81018490049093026080908101604052606084815261002f946024939192918401918190838280828437509496505050505050508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023157805160ff19168380011785555b506102619291505b808211156102665760008155830161017d565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b820191906000526020600020905b81548152906001019060200180831161020c57829003601f168201915b505050505081565b82800160010185558215610175579182015b82811115610175578251826000505591602001919060010190610243565b505050565b509056`}, + []string{`[{"constant":true,"inputs":[],"name":"transactString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":true,"inputs":[],"name":"deployString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"str","type":"string"}],"name":"transact","outputs":[],"type":"function"},{"inputs":[{"name":"str","type":"string"}],"type":"constructor"}]`}, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -253,6 +306,9 @@ var bindTests = []struct { t.Fatalf("Transact string mismatch: have '%s', want 'Transact string'", str) } `, + nil, + nil, + nil, }, // Tests that plain values can be properly returned and deserialized { @@ -264,8 +320,16 @@ var bindTests = []struct { } } `, - `606060405260dc8060106000396000f3606060405260e060020a6000350463993a04b78114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`, - `[{"constant":true,"inputs":[],"name":"getter","outputs":[{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"bytes32"}],"type":"function"}]`, + []string{`606060405260dc8060106000396000f3606060405260e060020a6000350463993a04b78114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`}, + []string{`[{"constant":true,"inputs":[],"name":"getter","outputs":[{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"bytes32"}],"type":"function"}]`}, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -285,6 +349,9 @@ var bindTests = []struct { t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", str, num, "Hi", 1) } `, + nil, + nil, + nil, }, // Tests that tuples can be properly returned and deserialized { @@ -296,8 +363,16 @@ var bindTests = []struct { } } `, - `606060405260dc8060106000396000f3606060405260e060020a60003504633175aae28114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`, - `[{"constant":true,"inputs":[],"name":"tuple","outputs":[{"name":"a","type":"string"},{"name":"b","type":"int256"},{"name":"c","type":"bytes32"}],"type":"function"}]`, + []string{`606060405260dc8060106000396000f3606060405260e060020a60003504633175aae28114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`}, + []string{`[{"constant":true,"inputs":[],"name":"tuple","outputs":[{"name":"a","type":"string"},{"name":"b","type":"int256"},{"name":"c","type":"bytes32"}],"type":"function"}]`}, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -317,6 +392,9 @@ var bindTests = []struct { t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", res.A, res.B, "Hi", 1) } `, + nil, + nil, + nil, }, // Tests that arrays/slices can be properly returned and deserialized. // Only addresses are tested, remainder just compiled to keep the test small. @@ -338,8 +416,18 @@ var bindTests = []struct { } } `, - `606060405261015c806100126000396000f3606060405260e060020a6000350463be1127a3811461003c578063d88becc014610092578063e15a3db71461003c578063f637e5891461003c575b005b604080516020600480358082013583810285810185019096528085526100ee959294602494909392850192829185019084908082843750949650505050505050604080516020810190915260009052805b919050565b604080516102e0818101909252610138916004916102e491839060179083908390808284375090955050505050506102e0604051908101604052806017905b60008152602001906001900390816100d15790505081905061008d565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b60405180826102e0808381846000600461015cf15090500191505060405180910390f3`, - `[{"constant":true,"inputs":[{"name":"input","type":"address[]"}],"name":"echoAddresses","outputs":[{"name":"output","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"uint24[23]"}],"name":"echoFancyInts","outputs":[{"name":"output","type":"uint24[23]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"int256[]"}],"name":"echoInts","outputs":[{"name":"output","type":"int256[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"bool[]"}],"name":"echoBools","outputs":[{"name":"output","type":"bool[]"}],"type":"function"}]`, + []string{`606060405261015c806100126000396000f3606060405260e060020a6000350463be1127a3811461003c578063d88becc014610092578063e15a3db71461003c578063f637e5891461003c575b005b604080516020600480358082013583810285810185019096528085526100ee959294602494909392850192829185019084908082843750949650505050505050604080516020810190915260009052805b919050565b604080516102e0818101909252610138916004916102e491839060179083908390808284375090955050505050506102e0604051908101604052806017905b60008152602001906001900390816100d15790505081905061008d565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b60405180826102e0808381846000600461015cf15090500191505060405180910390f3`}, + []string{`[{"constant":true,"inputs":[{"name":"input","type":"address[]"}],"name":"echoAddresses","outputs":[{"name":"output","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"uint24[23]"}],"name":"echoFancyInts","outputs":[{"name":"output","type":"uint24[23]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"int256[]"}],"name":"echoInts","outputs":[{"name":"output","type":"int256[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"bool[]"}],"name":"echoBools","outputs":[{"name":"output","type":"bool[]"}],"type":"function"}]`}, + ` + "math/big" + "reflect" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -359,6 +447,9 @@ var bindTests = []struct { t.Fatalf("Slice return mismatch: have %v, want %v", out, []common.Address{auth.From, common.Address{}}) } `, + nil, + nil, + nil, }, // Tests that anonymous default methods can be correctly invoked { @@ -372,8 +463,16 @@ var bindTests = []struct { } } `, - `6060604052606a8060106000396000f360606040523615601d5760e060020a6000350463fc9c8d3981146040575b605e6000805473ffffffffffffffffffffffffffffffffffffffff191633179055565b606060005473ffffffffffffffffffffffffffffffffffffffff1681565b005b6060908152602090f3`, - `[{"constant":true,"inputs":[],"name":"caller","outputs":[{"name":"","type":"address"}],"type":"function"}]`, + []string{`6060604052606a8060106000396000f360606040523615601d5760e060020a6000350463fc9c8d3981146040575b605e6000805473ffffffffffffffffffffffffffffffffffffffff191633179055565b606060005473ffffffffffffffffffffffffffffffffffffffff1681565b005b6060908152602090f3`}, + []string{`[{"constant":true,"inputs":[],"name":"caller","outputs":[{"name":"","type":"address"}],"type":"function"}]`}, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -396,6 +495,9 @@ var bindTests = []struct { t.Fatalf("Address mismatch: have %v, want %v", caller, auth.From) } `, + nil, + nil, + nil, }, // Tests that non-existent contracts are reported as such (though only simulator test) { @@ -407,11 +509,17 @@ var bindTests = []struct { } } `, - `6060604052609f8060106000396000f3606060405260e060020a6000350463f97a60058114601a575b005b600060605260c0604052600d60809081527f4920646f6e27742065786973740000000000000000000000000000000000000060a052602060c0908152600d60e081905281906101009060a09080838184600060046012f15050815172ffffffffffffffffffffffffffffffffffffff1916909152505060405161012081900392509050f3`, - `[{"constant":true,"inputs":[],"name":"String","outputs":[{"name":"","type":"string"}],"type":"function"}]`, + []string{`6060604052609f8060106000396000f3606060405260e060020a6000350463f97a60058114601a575b005b600060605260c0604052600d60809081527f4920646f6e27742065786973740000000000000000000000000000000000000060a052602060c0908152600d60e081905281906101009060a09080838184600060046012f15050815172ffffffffffffffffffffffffffffffffffffff1916909152505060405161012081900392509050f3`}, + []string{`[{"constant":true,"inputs":[],"name":"String","outputs":[{"name":"","type":"string"}],"type":"function"}]`}, + ` + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + `, ` // Create a simulator and wrap a non-deployed contract - sim := backends.NewSimulatedBackend(nil, uint64(10000000000)) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000)) nonexistent, err := NewNonExistent(common.Address{}, sim) if err != nil { @@ -424,6 +532,9 @@ var bindTests = []struct { t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode) } `, + nil, + nil, + nil, }, // Tests that gas estimation works for contracts with weird gas mechanics too. { @@ -441,8 +552,16 @@ var bindTests = []struct { } } `, - `606060405261021c806100126000396000f3606060405260e060020a600035046323fcf32a81146100265780634f28bf0e1461007b575b005b6040805160206004803580820135601f8101849004840285018401909552848452610024949193602493909291840191908190840183828082843750949650505050505050620186a05a101561014e57610002565b6100db60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529291908301828280156102145780601f106101e957610100808354040283529160200191610214565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b505050565b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106101b557805160ff19168380011785555b506101499291505b808211156101e557600081556001016101a1565b82800160010185558215610199579182015b828111156101995782518260005055916020019190600101906101c7565b5090565b820191906000526020600020905b8154815290600101906020018083116101f757829003601f168201915b50505050508156`, - `[{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"SetField","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"field","outputs":[{"name":"","type":"string"}],"type":"function"}]`, + []string{`606060405261021c806100126000396000f3606060405260e060020a600035046323fcf32a81146100265780634f28bf0e1461007b575b005b6040805160206004803580820135601f8101849004840285018401909552848452610024949193602493909291840191908190840183828082843750949650505050505050620186a05a101561014e57610002565b6100db60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529291908301828280156102145780601f106101e957610100808354040283529160200191610214565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b505050565b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106101b557805160ff19168380011785555b506101499291505b808211156101e557600081556001016101a1565b82800160010185558215610199579182015b828111156101995782518260005055916020019190600101906101c7565b5090565b820191906000526020600020905b8154815290600101906020018083116101f757829003601f168201915b50505050508156`}, + []string{`[{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"SetField","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"field","outputs":[{"name":"","type":"string"}],"type":"function"}]`}, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -466,6 +585,9 @@ var bindTests = []struct { t.Fatalf("Field mismatch: have %v, want %v", field, "automatic") } `, + nil, + nil, + nil, }, // Test that constant functions can be called from an (optional) specified address { @@ -476,8 +598,17 @@ var bindTests = []struct { return msg.sender; } } - `, `6060604052346000575b6086806100176000396000f300606060405263ffffffff60e060020a60003504166349f8e98281146022575b6000565b34600057602c6055565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b335b905600a165627a7a72305820aef6b7685c0fa24ba6027e4870404a57df701473fe4107741805c19f5138417c0029`, - `[{"constant":true,"inputs":[],"name":"callFrom","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"}]`, + `, []string{`6060604052346000575b6086806100176000396000f300606060405263ffffffff60e060020a60003504166349f8e98281146022575b6000565b34600057602c6055565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b335b905600a165627a7a72305820aef6b7685c0fa24ba6027e4870404a57df701473fe4107741805c19f5138417c0029`}, + []string{`[{"constant":true,"inputs":[],"name":"callFrom","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"}]`}, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -505,6 +636,9 @@ var bindTests = []struct { } } `, + nil, + nil, + nil, }, // Tests that methods and returns with underscores inside work correctly. { @@ -536,8 +670,17 @@ var bindTests = []struct { return 0; } } - `, `6060604052341561000f57600080fd5b6103858061001e6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461009357806346546dbe146100c357806367e6633d146100ec5780639df4848514610181578063af7486ab146101b1578063b564b34d146101e1578063e02ab24d14610211578063e409ca4514610241575b600080fd5b341561009e57600080fd5b6100a6610271565b604051808381526020018281526020019250505060405180910390f35b34156100ce57600080fd5b6100d6610286565b6040518082815260200191505060405180910390f35b34156100f757600080fd5b6100ff61028e565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014557808201518184015260208101905061012a565b50505050905090810190601f1680156101725780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561018c57600080fd5b6101946102dc565b604051808381526020018281526020019250505060405180910390f35b34156101bc57600080fd5b6101c46102f1565b604051808381526020018281526020019250505060405180910390f35b34156101ec57600080fd5b6101f4610306565b604051808381526020018281526020019250505060405180910390f35b341561021c57600080fd5b61022461031b565b604051808381526020018281526020019250505060405180910390f35b341561024c57600080fd5b610254610330565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600080905090565b6000610298610345565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820d1a53d9de9d1e3d55cb3dc591900b63c4f1ded79114f7b79b332684840e186a40029`, - `[{"constant":true,"inputs":[],"name":"LowerUpperCollision","outputs":[{"name":"_res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_under_scored_func","outputs":[{"name":"_int","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UnderscoredOutput","outputs":[{"name":"_int","type":"int256"},{"name":"_string","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperLowerCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"AllPurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"__","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperUpperCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LowerLowerCollision","outputs":[{"name":"_res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"}]`, + `, []string{`6060604052341561000f57600080fd5b6103858061001e6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461009357806346546dbe146100c357806367e6633d146100ec5780639df4848514610181578063af7486ab146101b1578063b564b34d146101e1578063e02ab24d14610211578063e409ca4514610241575b600080fd5b341561009e57600080fd5b6100a6610271565b604051808381526020018281526020019250505060405180910390f35b34156100ce57600080fd5b6100d6610286565b6040518082815260200191505060405180910390f35b34156100f757600080fd5b6100ff61028e565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014557808201518184015260208101905061012a565b50505050905090810190601f1680156101725780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561018c57600080fd5b6101946102dc565b604051808381526020018281526020019250505060405180910390f35b34156101bc57600080fd5b6101c46102f1565b604051808381526020018281526020019250505060405180910390f35b34156101ec57600080fd5b6101f4610306565b604051808381526020018281526020019250505060405180910390f35b341561021c57600080fd5b61022461031b565b604051808381526020018281526020019250505060405180910390f35b341561024c57600080fd5b610254610330565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600080905090565b6000610298610345565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820d1a53d9de9d1e3d55cb3dc591900b63c4f1ded79114f7b79b332684840e186a40029`}, + []string{`[{"constant":true,"inputs":[],"name":"LowerUpperCollision","outputs":[{"name":"_res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_under_scored_func","outputs":[{"name":"_int","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UnderscoredOutput","outputs":[{"name":"_int","type":"int256"},{"name":"_string","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperLowerCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"AllPurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"__","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperUpperCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LowerLowerCollision","outputs":[{"name":"_res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"}]`}, + ` + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -570,13 +713,16 @@ var bindTests = []struct { fmt.Println(a, b, err) `, + nil, + nil, + nil, }, // Tests that logs can be successfully filtered and decoded. { `Eventer`, ` contract Eventer { - event SimpleEvent ( + event SimpleEvent ( address indexed Addr, bytes32 indexed Id, bool indexed Flag, @@ -604,10 +750,28 @@ var bindTests = []struct { function raiseDynamicEvent(string str, bytes blob) { DynamicEvent(str, blob, str, blob); } + + event FixedBytesEvent ( + bytes24 indexed IndexedBytes, + bytes24 NonIndexedBytes + ); + function raiseFixedBytesEvent(bytes24 blob) { + FixedBytesEvent(blob, blob); + } } `, - `6060604052341561000f57600080fd5b61042c8061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063528300ff1461005c578063630c31e2146100fc578063c7d116dd14610156575b600080fd5b341561006757600080fd5b6100fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610194565b005b341561010757600080fd5b610154600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080351515906020019091908035906020019091905050610367565b005b341561016157600080fd5b610192600480803590602001909190803560010b90602001909190803563ffffffff169060200190919050506103c3565b005b806040518082805190602001908083835b6020831015156101ca57805182526020820191506020810190506020830392506101a5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020826040518082805190602001908083835b60208310151561022d5780518252602082019150602081019050602083039250610208565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f3281fd4f5e152dd3385df49104a3f633706e21c9e80672e88d3bcddf33101f008484604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156102c15780820151818401526020810190506102a6565b50505050905090810190601f1680156102ee5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561032757808201518184015260208101905061030c565b50505050905090810190601f1680156103545780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a35050565b81151583600019168573ffffffffffffffffffffffffffffffffffffffff167f1f097de4289df643bd9c11011cc61367aa12983405c021056e706eb5ba1250c8846040518082815260200191505060405180910390a450505050565b8063ffffffff168260010b847f3ca7f3a77e5e6e15e781850bc82e32adfa378a2a609370db24b4d0fae10da2c960405160405180910390a45050505600a165627a7a72305820d1f8a8bbddbc5bb29f285891d6ae1eef8420c52afdc05e1573f6114d8e1714710029`, - `[{"constant":false,"inputs":[{"name":"str","type":"string"},{"name":"blob","type":"bytes"}],"name":"raiseDynamicEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"id","type":"bytes32"},{"name":"flag","type":"bool"},{"name":"value","type":"uint256"}],"name":"raiseSimpleEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint256"},{"name":"short","type":"int16"},{"name":"long","type":"uint32"}],"name":"raiseNodataEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Addr","type":"address"},{"indexed":true,"name":"Id","type":"bytes32"},{"indexed":true,"name":"Flag","type":"bool"},{"indexed":false,"name":"Value","type":"uint256"}],"name":"SimpleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Number","type":"uint256"},{"indexed":true,"name":"Short","type":"int16"},{"indexed":true,"name":"Long","type":"uint32"}],"name":"NodataEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedString","type":"string"},{"indexed":true,"name":"IndexedBytes","type":"bytes"},{"indexed":false,"name":"NonIndexedString","type":"string"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes"}],"name":"DynamicEvent","type":"event"}]`, + []string{`608060405234801561001057600080fd5b5061043f806100206000396000f3006080604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663528300ff8114610066578063630c31e2146100ff5780636cc6b94014610138578063c7d116dd1461015b575b600080fd5b34801561007257600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100fd94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506101829650505050505050565b005b34801561010b57600080fd5b506100fd73ffffffffffffffffffffffffffffffffffffffff60043516602435604435151560643561033c565b34801561014457600080fd5b506100fd67ffffffffffffffff1960043516610394565b34801561016757600080fd5b506100fd60043560243560010b63ffffffff604435166103d6565b806040518082805190602001908083835b602083106101b25780518252601f199092019160209182019101610193565b51815160209384036101000a6000190180199092169116179052604051919093018190038120875190955087945090928392508401908083835b6020831061020b5780518252601f1990920191602091820191016101ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f3281fd4f5e152dd3385df49104a3f633706e21c9e80672e88d3bcddf33101f008484604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561029c578181015183820152602001610284565b50505050905090810190601f1680156102c95780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156102fc5781810151838201526020016102e4565b50505050905090810190601f1680156103295780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a35050565b60408051828152905183151591859173ffffffffffffffffffffffffffffffffffffffff8816917f1f097de4289df643bd9c11011cc61367aa12983405c021056e706eb5ba1250c8919081900360200190a450505050565b6040805167ffffffffffffffff19831680825291517fcdc4c1b1aed5524ffb4198d7a5839a34712baef5fa06884fac7559f4a5854e0a9181900360200190a250565b8063ffffffff168260010b847f3ca7f3a77e5e6e15e781850bc82e32adfa378a2a609370db24b4d0fae10da2c960405160405180910390a45050505600a165627a7a72305820468b5843bf653145bd924b323c64ef035d3dd922c170644b44d61aa666ea6eee0029`}, + []string{`[{"constant":false,"inputs":[{"name":"str","type":"string"},{"name":"blob","type":"bytes"}],"name":"raiseDynamicEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"id","type":"bytes32"},{"name":"flag","type":"bool"},{"name":"value","type":"uint256"}],"name":"raiseSimpleEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"blob","type":"bytes24"}],"name":"raiseFixedBytesEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint256"},{"name":"short","type":"int16"},{"name":"long","type":"uint32"}],"name":"raiseNodataEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Addr","type":"address"},{"indexed":true,"name":"Id","type":"bytes32"},{"indexed":true,"name":"Flag","type":"bool"},{"indexed":false,"name":"Value","type":"uint256"}],"name":"SimpleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Number","type":"uint256"},{"indexed":true,"name":"Short","type":"int16"},{"indexed":true,"name":"Long","type":"uint32"}],"name":"NodataEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedString","type":"string"},{"indexed":true,"name":"IndexedBytes","type":"bytes"},{"indexed":false,"name":"NonIndexedString","type":"string"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes"}],"name":"DynamicEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedBytes","type":"bytes24"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes24"}],"name":"FixedBytesEvent","type":"event"}]`}, + ` + "math/big" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -708,6 +872,33 @@ var bindTests = []struct { if err = dit.Error(); err != nil { t.Fatalf("dynamic event iteration failed: %v", err) } + // Test raising and filtering for events with fixed bytes components + var fblob [24]byte + copy(fblob[:], []byte("Fixed Bytes")) + + if _, err := eventer.RaiseFixedBytesEvent(auth, fblob); err != nil { + t.Fatalf("failed to raise fixed bytes event: %v", err) + } + sim.Commit() + + fit, err := eventer.FilterFixedBytesEvent(nil, [][24]byte{fblob}) + if err != nil { + t.Fatalf("failed to filter for fixed bytes events: %v", err) + } + defer fit.Close() + + if !fit.Next() { + t.Fatalf("fixed bytes log not found: %v", fit.Error()) + } + if fit.Event.NonIndexedBytes != fblob || fit.Event.IndexedBytes != fblob { + t.Errorf("fixed bytes log content mismatch: have %v, want {'%x', '%x'}", fit.Event, fblob, fblob) + } + if fit.Next() { + t.Errorf("unexpected fixed bytes event found: %+v", fit.Event) + } + if err = fit.Error(); err != nil { + t.Fatalf("fixed bytes event iteration failed: %v", err) + } // Test subscribing to an event and raising it afterwards ch := make(chan *EventerSimpleEvent, 16) sub, err := eventer.WatchSimpleEvent(nil, ch, nil, nil, nil) @@ -741,6 +932,9 @@ var bindTests = []struct { case <-time.After(250 * time.Millisecond): } `, + nil, + nil, + nil, }, { `DeeplyNestedArray`, @@ -755,8 +949,16 @@ var bindTests = []struct { } } `, - `6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029`, - `[{"constant":false,"inputs":[{"name":"arr","type":"uint64[3][4][5]"}],"name":"storeDeepUintArray","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"retrieveDeepArray","outputs":[{"name":"","type":"uint64[3][4][5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"deepUint64Array","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"}]`, + []string{`6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029`}, + []string{`[{"constant":false,"inputs":[{"name":"arr","type":"uint64[3][4][5]"}],"name":"storeDeepUintArray","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"retrieveDeepArray","outputs":[{"name":"","type":"uint64[3][4][5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"deepUint64Array","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"}]`}, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() @@ -808,26 +1010,261 @@ var bindTests = []struct { t.Fatalf("Retrieved value does not match expected value! got: %d, expected: %d. %v", retrievedArr[4][3][2], testArr[4][3][2], err) } `, + nil, + nil, + nil, + }, + { + `CallbackParam`, + ` + contract FunctionPointerTest { + function test(function(uint256) external callback) external { + callback(1); + } + } + `, + []string{`608060405234801561001057600080fd5b5061015e806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063d7a5aba214610040575b600080fd5b34801561004c57600080fd5b506100be6004803603602081101561006357600080fd5b810190808035806c0100000000000000000000000090049068010000000000000000900463ffffffff1677ffffffffffffffffffffffffffffffffffffffffffffffff169091602001919093929190939291905050506100c0565b005b818160016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561011657600080fd5b505af115801561012a573d6000803e3d6000fd5b50505050505056fea165627a7a7230582062f87455ff84be90896dbb0c4e4ddb505c600d23089f8e80a512548440d7e2580029`}, + []string{`[ + { + "constant": false, + "inputs": [ + { + "name": "callback", + "type": "function" + } + ], + "name": "test", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ]`}, ` + "strings" + `, + ` + if strings.Compare("test(function)", CallbackParamFuncSigs["d7a5aba2"]) != 0 { + t.Fatalf("") + } + `, + []map[string]string{ + { + "test(function)": "d7a5aba2", + }, + }, + nil, + nil, + }, { + `Tuple`, + ` + pragma solidity >=0.4.19 <0.6.0; + pragma experimental ABIEncoderV2; + + contract Tuple { + struct S { uint a; uint[] b; T[] c; } + struct T { uint x; uint y; } + event TupleEvent(S a, T[2][] b, T[][2] c, S[] d, uint[] e); + + function func1(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public pure returns (S memory, T[2][] memory, T[][2] memory, S[] memory, uint[] memory) { + return (a, b, c, d, e); + } + function func2(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public { + emit TupleEvent(a, b, c, d, e); + } + } + + `, + []string{`608060405234801561001057600080fd5b50610eb2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063443c79b41461003b578063d0062cdd1461006f575b600080fd5b61005560048036036100509190810190610624565b61008b565b604051610066959493929190610b28565b60405180910390f35b61008960048036036100849190810190610624565b6100bc565b005b610093610102565b606061009d610123565b6060808989898989945094509450945094509550955095509550959050565b7f18d6e66efa53739ca6d13626f35ebc700b31cced3eddb50c70bbe9c082c6cd0085858585856040516100f3959493929190610b28565b60405180910390a15050505050565b60405180606001604052806000815260200160608152602001606081525090565b60405180604001604052806002905b60608152602001906001900390816101325790505090565b600082601f83011261015b57600080fd5b813561016e61016982610bcb565b610b9e565b9150818183526020840193506020810190508385608084028201111561019357600080fd5b60005b838110156101c357816101a988826102a6565b845260208401935060808301925050600181019050610196565b5050505092915050565b600082601f8301126101de57600080fd5b60026101f16101ec82610bf3565b610b9e565b9150818360005b83811015610228578135860161020e888261031a565b8452602084019350602083019250506001810190506101f8565b5050505092915050565b600082601f83011261024357600080fd5b813561025661025182610c15565b610b9e565b9150818183526020840193506020810190508360005b8381101561029c578135860161028288826104a3565b84526020840193506020830192505060018101905061026c565b5050505092915050565b600082601f8301126102b757600080fd5b60026102ca6102c582610c3d565b610b9e565b915081838560408402820111156102e057600080fd5b60005b8381101561031057816102f688826105c3565b8452602084019350604083019250506001810190506102e3565b5050505092915050565b600082601f83011261032b57600080fd5b813561033e61033982610c5f565b610b9e565b9150818183526020840193506020810190508385604084028201111561036357600080fd5b60005b83811015610393578161037988826105c3565b845260208401935060408301925050600181019050610366565b5050505092915050565b600082601f8301126103ae57600080fd5b81356103c16103bc82610c87565b610b9e565b915081818352602084019350602081019050838560208402820111156103e657600080fd5b60005b8381101561041657816103fc888261060f565b8452602084019350602083019250506001810190506103e9565b5050505092915050565b600082601f83011261043157600080fd5b813561044461043f82610caf565b610b9e565b9150818183526020840193506020810190508385602084028201111561046957600080fd5b60005b83811015610499578161047f888261060f565b84526020840193506020830192505060018101905061046c565b5050505092915050565b6000606082840312156104b557600080fd5b6104bf6060610b9e565b905060006104cf8482850161060f565b600083015250602082013567ffffffffffffffff8111156104ef57600080fd5b6104fb8482850161039d565b602083015250604082013567ffffffffffffffff81111561051b57600080fd5b6105278482850161031a565b60408301525092915050565b60006060828403121561054557600080fd5b61054f6060610b9e565b9050600061055f8482850161060f565b600083015250602082013567ffffffffffffffff81111561057f57600080fd5b61058b8482850161039d565b602083015250604082013567ffffffffffffffff8111156105ab57600080fd5b6105b78482850161031a565b60408301525092915050565b6000604082840312156105d557600080fd5b6105df6040610b9e565b905060006105ef8482850161060f565b60008301525060206106038482850161060f565b60208301525092915050565b60008135905061061e81610e58565b92915050565b600080600080600060a0868803121561063c57600080fd5b600086013567ffffffffffffffff81111561065657600080fd5b61066288828901610533565b955050602086013567ffffffffffffffff81111561067f57600080fd5b61068b8882890161014a565b945050604086013567ffffffffffffffff8111156106a857600080fd5b6106b4888289016101cd565b935050606086013567ffffffffffffffff8111156106d157600080fd5b6106dd88828901610232565b925050608086013567ffffffffffffffff8111156106fa57600080fd5b61070688828901610420565b9150509295509295909350565b600061071f83836108cb565b60808301905092915050565b60006107378383610922565b905092915050565b600061074b8383610a93565b905092915050565b600061075f8383610aea565b60408301905092915050565b60006107778383610b19565b60208301905092915050565b600061078e82610d3b565b6107988185610de3565b93506107a383610cd7565b8060005b838110156107d45781516107bb8882610713565b97506107c683610d88565b9250506001810190506107a7565b5085935050505092915050565b60006107ec82610d46565b6107f68185610df4565b93508360208202850161080885610ce7565b8060005b858110156108445784840389528151610825858261072b565b945061083083610d95565b925060208a0199505060018101905061080c565b50829750879550505050505092915050565b600061086182610d51565b61086b8185610dff565b93508360208202850161087d85610cf1565b8060005b858110156108b9578484038952815161089a858261073f565b94506108a583610da2565b925060208a01995050600181019050610881565b50829750879550505050505092915050565b6108d481610d5c565b6108de8184610e10565b92506108e982610d01565b8060005b8381101561091a5781516109018782610753565b965061090c83610daf565b9250506001810190506108ed565b505050505050565b600061092d82610d67565b6109378185610e1b565b935061094283610d0b565b8060005b8381101561097357815161095a8882610753565b975061096583610dbc565b925050600181019050610946565b5085935050505092915050565b600061098b82610d7d565b6109958185610e3d565b93506109a083610d2b565b8060005b838110156109d15781516109b8888261076b565b97506109c383610dd6565b9250506001810190506109a4565b5085935050505092915050565b60006109e982610d72565b6109f38185610e2c565b93506109fe83610d1b565b8060005b83811015610a2f578151610a16888261076b565b9750610a2183610dc9565b925050600181019050610a02565b5085935050505092915050565b6000606083016000830151610a546000860182610b19565b5060208301518482036020860152610a6c82826109de565b91505060408301518482036040860152610a868282610922565b9150508091505092915050565b6000606083016000830151610aab6000860182610b19565b5060208301518482036020860152610ac382826109de565b91505060408301518482036040860152610add8282610922565b9150508091505092915050565b604082016000820151610b006000850182610b19565b506020820151610b136020850182610b19565b50505050565b610b2281610e4e565b82525050565b600060a0820190508181036000830152610b428188610a3c565b90508181036020830152610b568187610783565b90508181036040830152610b6a81866107e1565b90508181036060830152610b7e8185610856565b90508181036080830152610b928184610980565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff82111715610bc157600080fd5b8060405250919050565b600067ffffffffffffffff821115610be257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610c0a57600080fd5b602082029050919050565b600067ffffffffffffffff821115610c2c57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610c5457600080fd5b602082029050919050565b600067ffffffffffffffff821115610c7657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610c9e57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610cc657600080fd5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000819050919050565b610e6181610e4e565b8114610e6c57600080fd5b5056fea365627a7a72305820405a6336d8c302cee779de6788527018e5a2393892328fbf12b96065df2de00a6c6578706572696d656e74616cf564736f6c634300050a0040`}, + []string{` + [{"constant":true,"inputs":[{"components":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256[]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[]"}],"name":"a","type":"tuple"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"b","type":"tuple[2][]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[][2]"},{"components":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256[]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[]"}],"name":"d","type":"tuple[]"},{"name":"e","type":"uint256[]"}],"name":"func1","outputs":[{"components":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256[]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[]"}],"name":"","type":"tuple"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"","type":"tuple[2][]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"","type":"tuple[][2]"},{"components":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256[]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[]"}],"name":"","type":"tuple[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"components":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256[]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[]"}],"name":"a","type":"tuple"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"b","type":"tuple[2][]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[][2]"},{"components":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256[]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[]"}],"name":"d","type":"tuple[]"},{"name":"e","type":"uint256[]"}],"name":"func2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"components":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256[]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[]"}],"indexed":false,"name":"a","type":"tuple"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"indexed":false,"name":"b","type":"tuple[2][]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"indexed":false,"name":"c","type":"tuple[][2]"},{"components":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256[]"},{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"c","type":"tuple[]"}],"indexed":false,"name":"d","type":"tuple[]"},{"indexed":false,"name":"e","type":"uint256[]"}],"name":"TupleEvent","type":"event"}] + `}, + ` + "math/big" + "reflect" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, + + ` + key, _ := crypto.GenerateKey() + auth := bind.NewKeyedTransactor(key) + backend := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + + _, _, contract, err := DeployTuple(auth, backend) + if err != nil { + t.Fatalf("deploy contract failed %v", err) + } + backend.Commit() + + check := func(a, b interface{}, errMsg string) { + if !reflect.DeepEqual(a, b) { + t.Fatal(errMsg) + } + } + + a := Struct1{ + A: big.NewInt(1), + B: []*big.Int{big.NewInt(2), big.NewInt(3)}, + C: []Struct0{ + { + X: big.NewInt(4), + Y: big.NewInt(5), + }, + { + X: big.NewInt(6), + Y: big.NewInt(7), + }, + }, + } + + b := [][2]Struct0{ + { + { + X: big.NewInt(8), + Y: big.NewInt(9), + }, + { + X: big.NewInt(10), + Y: big.NewInt(11), + }, + }, + } + + c := [2][]Struct0{ + { + { + X: big.NewInt(12), + Y: big.NewInt(13), + }, + { + X: big.NewInt(14), + Y: big.NewInt(15), + }, + }, + { + { + X: big.NewInt(16), + Y: big.NewInt(17), + }, + }, + } + + d := []Struct1{a} + + e := []*big.Int{big.NewInt(18), big.NewInt(19)} + ret1, ret2, ret3, ret4, ret5, err := contract.Func1(nil, a, b, c, d, e) + if err != nil { + t.Fatalf("invoke contract failed, err %v", err) + } + check(ret1, a, "ret1 mismatch") + check(ret2, b, "ret2 mismatch") + check(ret3, c, "ret3 mismatch") + check(ret4, d, "ret4 mismatch") + check(ret5, e, "ret5 mismatch") + + _, err = contract.Func2(auth, a, b, c, d, e) + if err != nil { + t.Fatalf("invoke contract failed, err %v", err) + } + backend.Commit() + + iter, err := contract.FilterTupleEvent(nil) + if err != nil { + t.Fatalf("failed to create event filter, err %v", err) + } + defer iter.Close() + + iter.Next() + check(iter.Event.A, a, "field1 mismatch") + check(iter.Event.B, b, "field2 mismatch") + check(iter.Event.C, c, "field3 mismatch") + check(iter.Event.D, d, "field4 mismatch") + check(iter.Event.E, e, "field5 mismatch") + `, + nil, + nil, + nil, + }, + { + `UseLibrary`, + ` + library Math { + function add(uint a, uint b) public view returns(uint) { + return a + b; + } + } + + contract UseLibrary { + function add (uint c, uint d) public view returns(uint) { + return Math.add(c,d); + } + } + `, + []string{ + // Bytecode for the UseLibrary contract + `608060405234801561001057600080fd5b5061011d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063771602f714602d575b600080fd5b604d60048036036040811015604157600080fd5b5080359060200135605f565b60408051918252519081900360200190f35b600073__$b98c933f0a6ececcd167bd4f9d3299b1a0$__63771602f784846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801560b757600080fd5b505af415801560ca573d6000803e3d6000fd5b505050506040513d602081101560df57600080fd5b5051939250505056fea265627a7a72305820eb5c38f42445604cfa43d85e3aa5ecc48b0a646456c902dd48420ae7241d06f664736f6c63430005090032`, + // Bytecode for the Math contract + `60a3610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063771602f7146038575b600080fd5b605860048036036040811015604c57600080fd5b5080359060200135606a565b60408051918252519081900360200190f35b019056fea265627a7a723058206fc6c05f3078327f9c763edffdb5ab5f8bd212e293a1306c7d0ad05af3ad35f464736f6c63430005090032`, + }, + []string{ + `[{"constant":true,"inputs":[{"name":"c","type":"uint256"},{"name":"d","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`, + `[{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`, + }, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, + ` + // Generate a new random account and a funded simulator + key, _ := crypto.GenerateKey() + auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + + //deploy the test contract + _, _, testContract, err := DeployUseLibrary(auth, sim) + if err != nil { + t.Fatalf("Failed to deploy test contract: %v", err) + } + + // Finish deploy. + sim.Commit() + + // Check that the library contract has been deployed + // by calling the contract's add function. + res, err := testContract.Add(&bind.CallOpts{ + From: auth.From, + Pending: false, + }, big.NewInt(1), big.NewInt(2)) + if err != nil { + t.Fatalf("Failed to call linked contract: %v", err) + } + if res.Cmp(big.NewInt(3)) != 0 { + t.Fatalf("Add did not return the correct result: %d != %d", res, 3) + } + `, + nil, + map[string]string{ + "b98c933f0a6ececcd167bd4f9d3299b1a0": "Math", + }, + []string{"UseLibrary", "Math"}, }, } // Tests that packages generated by the binder can be successfully compiled and // the requested tester run against it. -func TestBindings(t *testing.T) { +func TestGolangBindings(t *testing.T) { // Skip the test if no Go command can be found gocmd := runtime.GOROOT() + "/bin/go" if !common.FileExist(gocmd) { t.Skip("go sdk not found for testing") } - // Skip the test if the go-ethereum sources are symlinked (https://github.com/golang/go/issues/14845) - linkTestCode := fmt.Sprintf("package linktest\nfunc CheckSymlinks(){\nfmt.Println(backends.NewSimulatedBackend(nil,uint64(10000000000)))\n}") - linkTestDeps, err := imports.Process(os.TempDir(), []byte(linkTestCode), nil) - if err != nil { - t.Fatalf("failed check for goimports symlink bug: %v", err) - } - if !strings.Contains(string(linkTestDeps), "go-ethereum") { - t.Skip("symlinked environment doesn't support bind (https://github.com/golang/go/issues/14845)") - } // Create a temporary workspace for the test suite ws, err := ioutil.TempDir("", "") if err != nil { @@ -841,8 +1278,14 @@ func TestBindings(t *testing.T) { } // Generate the test suite for all the contracts for i, tt := range bindTests { + var types []string + if tt.types != nil { + types = tt.types + } else { + types = []string{tt.name} + } // Generate the binding and create a Go source file in the workspace - bind, err := Bind([]string{tt.name}, []string{tt.abi}, []string{tt.bytecode}, "bindtest", LangGo) + bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs) if err != nil { t.Fatalf("test %d: failed to generate binding: %v", i, err) } @@ -850,12 +1293,19 @@ func TestBindings(t *testing.T) { t.Fatalf("test %d: failed to write binding: %v", i, err) } // Generate the test file with the injected test code - code := fmt.Sprintf("package bindtest\nimport \"testing\"\nfunc Test%s(t *testing.T){\n%s\n}", tt.name, tt.tester) - blob, err := imports.Process("", []byte(code), nil) - if err != nil { - t.Fatalf("test %d: failed to generate tests: %v", i, err) - } - if err := ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), blob, 0600); err != nil { + code := fmt.Sprintf(` + package bindtest + + import ( + "testing" + %s + ) + + func Test%s(t *testing.T) { + %s + } + `, tt.imports, tt.name, tt.tester) + if err := ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil { t.Fatalf("test %d: failed to write tests: %v", i, err) } } @@ -866,3 +1316,404 @@ func TestBindings(t *testing.T) { t.Fatalf("failed to run binding test: %v\n%s", err, out) } } + +// Tests that java binding generated by the binder is exactly matched. +func TestJavaBindings(t *testing.T) { + var cases = []struct { + name string + contract string + abi string + bytecode string + expected string + }{ + { + "test", + ` + pragma experimental ABIEncoderV2; + pragma solidity ^0.5.2; + + contract test { + function setAddress(address a) public returns(address){} + function setAddressList(address[] memory a_l) public returns(address[] memory){} + function setAddressArray(address[2] memory a_a) public returns(address[2] memory){} + + function setUint8(uint8 u8) public returns(uint8){} + function setUint16(uint16 u16) public returns(uint16){} + function setUint32(uint32 u32) public returns(uint32){} + function setUint64(uint64 u64) public returns(uint64){} + function setUint256(uint256 u256) public returns(uint256){} + function setUint256List(uint256[] memory u256_l) public returns(uint256[] memory){} + function setUint256Array(uint256[2] memory u256_a) public returns(uint256[2] memory){} + + function setInt8(int8 i8) public returns(int8){} + function setInt16(int16 i16) public returns(int16){} + function setInt32(int32 i32) public returns(int32){} + function setInt64(int64 i64) public returns(int64){} + function setInt256(int256 i256) public returns(int256){} + function setInt256List(int256[] memory i256_l) public returns(int256[] memory){} + function setInt256Array(int256[2] memory i256_a) public returns(int256[2] memory){} + + function setBytes1(bytes1 b1) public returns(bytes1) {} + function setBytes32(bytes32 b32) public returns(bytes32) {} + function setBytes(bytes memory bs) public returns(bytes memory) {} + function setBytesList(bytes[] memory bs_l) public returns(bytes[] memory) {} + function setBytesArray(bytes[2] memory bs_a) public returns(bytes[2] memory) {} + + function setString(string memory s) public returns(string memory) {} + function setStringList(string[] memory s_l) public returns(string[] memory) {} + function setStringArray(string[2] memory s_a) public returns(string[2] memory) {} + + function setBool(bool b) public returns(bool) {} + function setBoolList(bool[] memory b_l) public returns(bool[] memory) {} + function setBoolArray(bool[2] memory b_a) public returns(bool[2] memory) {} + }`, + `[{"constant":false,"inputs":[{"name":"u16","type":"uint16"}],"name":"setUint16","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b_a","type":"bool[2]"}],"name":"setBoolArray","outputs":[{"name":"","type":"bool[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a_a","type":"address[2]"}],"name":"setAddressArray","outputs":[{"name":"","type":"address[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bs_l","type":"bytes[]"}],"name":"setBytesList","outputs":[{"name":"","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u8","type":"uint8"}],"name":"setUint8","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u32","type":"uint32"}],"name":"setUint32","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b","type":"bool"}],"name":"setBool","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i256_l","type":"int256[]"}],"name":"setInt256List","outputs":[{"name":"","type":"int256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u256_a","type":"uint256[2]"}],"name":"setUint256Array","outputs":[{"name":"","type":"uint256[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b_l","type":"bool[]"}],"name":"setBoolList","outputs":[{"name":"","type":"bool[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bs_a","type":"bytes[2]"}],"name":"setBytesArray","outputs":[{"name":"","type":"bytes[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a_l","type":"address[]"}],"name":"setAddressList","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i256_a","type":"int256[2]"}],"name":"setInt256Array","outputs":[{"name":"","type":"int256[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"s_a","type":"string[2]"}],"name":"setStringArray","outputs":[{"name":"","type":"string[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"s","type":"string"}],"name":"setString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u64","type":"uint64"}],"name":"setUint64","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i16","type":"int16"}],"name":"setInt16","outputs":[{"name":"","type":"int16"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i8","type":"int8"}],"name":"setInt8","outputs":[{"name":"","type":"int8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u256_l","type":"uint256[]"}],"name":"setUint256List","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i256","type":"int256"}],"name":"setInt256","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i32","type":"int32"}],"name":"setInt32","outputs":[{"name":"","type":"int32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b32","type":"bytes32"}],"name":"setBytes32","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"s_l","type":"string[]"}],"name":"setStringList","outputs":[{"name":"","type":"string[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u256","type":"uint256"}],"name":"setUint256","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bs","type":"bytes"}],"name":"setBytes","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"address"}],"name":"setAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i64","type":"int64"}],"name":"setInt64","outputs":[{"name":"","type":"int64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b1","type":"bytes1"}],"name":"setBytes1","outputs":[{"name":"","type":"bytes1"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]`, + `608060405234801561001057600080fd5b5061265a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637fcaf66611610116578063c2b12a73116100b4578063da359dc81161008e578063da359dc814610666578063e30081a014610696578063e673eb32146106c6578063fba1a1c3146106f6576101e1565b8063c2b12a73146105d6578063c577796114610606578063d2282dc514610636576101e1565b80639a19a953116100f05780639a19a95314610516578063a0709e1914610546578063a53b1c1e14610576578063b7d5df31146105a6576101e1565b80637fcaf66614610486578063822cba69146104b657806386114cea146104e6576101e1565b806322722302116101835780635119655d1161015d5780635119655d146103c65780635be6b37e146103f65780636aa482fc146104265780637173b69514610456576101e1565b806322722302146103365780632766a755146103665780634d5ee6da14610396576101e1565b806316c105e2116101bf57806316c105e2146102765780631774e646146102a65780631c9352e2146102d65780631e26fd3314610306576101e1565b80630477988a146101e6578063118a971814610216578063151f547114610246575b600080fd5b61020060048036036101fb9190810190611599565b610726565b60405161020d9190611f01565b60405180910390f35b610230600480360361022b919081019061118d565b61072d565b60405161023d9190611ca6565b60405180910390f35b610260600480360361025b9190810190611123565b61073a565b60405161026d9190611c69565b60405180910390f35b610290600480360361028b9190810190611238565b610747565b60405161029d9190611d05565b60405180910390f35b6102c060048036036102bb919081019061163d565b61074e565b6040516102cd9190611f6d565b60405180910390f35b6102f060048036036102eb91908101906115eb565b610755565b6040516102fd9190611f37565b60405180910390f35b610320600480360361031b91908101906113cf565b61075c565b60405161032d9190611de5565b60405180910390f35b610350600480360361034b91908101906112a2565b610763565b60405161035d9190611d42565b60405180910390f35b610380600480360361037b9190810190611365565b61076a565b60405161038d9190611da8565b60405180910390f35b6103b060048036036103ab91908101906111b6565b610777565b6040516103bd9190611cc1565b60405180910390f35b6103e060048036036103db91908101906111f7565b61077e565b6040516103ed9190611ce3565b60405180910390f35b610410600480360361040b919081019061114c565b61078b565b60405161041d9190611c84565b60405180910390f35b610440600480360361043b9190810190611279565b610792565b60405161044d9190611d27565b60405180910390f35b610470600480360361046b91908101906112e3565b61079f565b60405161047d9190611d64565b60405180910390f35b6104a0600480360361049b9190810190611558565b6107ac565b6040516104ad9190611edf565b60405180910390f35b6104d060048036036104cb9190810190611614565b6107b3565b6040516104dd9190611f52565b60405180910390f35b61050060048036036104fb919081019061148b565b6107ba565b60405161050d9190611e58565b60405180910390f35b610530600480360361052b919081019061152f565b6107c1565b60405161053d9190611ec4565b60405180910390f35b610560600480360361055b919081019061138e565b6107c8565b60405161056d9190611dc3565b60405180910390f35b610590600480360361058b91908101906114b4565b6107cf565b60405161059d9190611e73565b60405180910390f35b6105c060048036036105bb91908101906114dd565b6107d6565b6040516105cd9190611e8e565b60405180910390f35b6105f060048036036105eb9190810190611421565b6107dd565b6040516105fd9190611e1b565b60405180910390f35b610620600480360361061b9190810190611324565b6107e4565b60405161062d9190611d86565b60405180910390f35b610650600480360361064b91908101906115c2565b6107eb565b60405161065d9190611f1c565b60405180910390f35b610680600480360361067b919081019061144a565b6107f2565b60405161068d9190611e36565b60405180910390f35b6106b060048036036106ab91908101906110fa565b6107f9565b6040516106bd9190611c4e565b60405180910390f35b6106e060048036036106db9190810190611506565b610800565b6040516106ed9190611ea9565b60405180910390f35b610710600480360361070b91908101906113f8565b610807565b60405161071d9190611e00565b60405180910390f35b6000919050565b61073561080e565b919050565b610742610830565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b610772610852565b919050565b6060919050565b610786610874565b919050565b6060919050565b61079a61089b565b919050565b6107a76108bd565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108835790505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108cc5790505090565b60006108f082356124f2565b905092915050565b600082601f830112151561090b57600080fd5b600261091e61091982611fb5565b611f88565b9150818385602084028201111561093457600080fd5b60005b83811015610964578161094a88826108e4565b845260208401935060208301925050600181019050610937565b5050505092915050565b600082601f830112151561098157600080fd5b813561099461098f82611fd7565b611f88565b915081818352602084019350602081019050838560208402820111156109b957600080fd5b60005b838110156109e957816109cf88826108e4565b8452602084019350602083019250506001810190506109bc565b5050505092915050565b600082601f8301121515610a0657600080fd5b6002610a19610a1482611fff565b611f88565b91508183856020840282011115610a2f57600080fd5b60005b83811015610a5f5781610a458882610e9e565b845260208401935060208301925050600181019050610a32565b5050505092915050565b600082601f8301121515610a7c57600080fd5b8135610a8f610a8a82612021565b611f88565b91508181835260208401935060208101905083856020840282011115610ab457600080fd5b60005b83811015610ae45781610aca8882610e9e565b845260208401935060208301925050600181019050610ab7565b5050505092915050565b600082601f8301121515610b0157600080fd5b6002610b14610b0f82612049565b611f88565b9150818360005b83811015610b4b5781358601610b318882610eda565b845260208401935060208301925050600181019050610b1b565b5050505092915050565b600082601f8301121515610b6857600080fd5b8135610b7b610b768261206b565b611f88565b9150818183526020840193506020810190508360005b83811015610bc15781358601610ba78882610eda565b845260208401935060208301925050600181019050610b91565b5050505092915050565b600082601f8301121515610bde57600080fd5b6002610bf1610bec82612093565b611f88565b91508183856020840282011115610c0757600080fd5b60005b83811015610c375781610c1d8882610f9a565b845260208401935060208301925050600181019050610c0a565b5050505092915050565b600082601f8301121515610c5457600080fd5b8135610c67610c62826120b5565b611f88565b91508181835260208401935060208101905083856020840282011115610c8c57600080fd5b60005b83811015610cbc5781610ca28882610f9a565b845260208401935060208301925050600181019050610c8f565b5050505092915050565b600082601f8301121515610cd957600080fd5b6002610cec610ce7826120dd565b611f88565b9150818360005b83811015610d235781358601610d098882610fea565b845260208401935060208301925050600181019050610cf3565b5050505092915050565b600082601f8301121515610d4057600080fd5b8135610d53610d4e826120ff565b611f88565b9150818183526020840193506020810190508360005b83811015610d995781358601610d7f8882610fea565b845260208401935060208301925050600181019050610d69565b5050505092915050565b600082601f8301121515610db657600080fd5b6002610dc9610dc482612127565b611f88565b91508183856020840282011115610ddf57600080fd5b60005b83811015610e0f5781610df588826110aa565b845260208401935060208301925050600181019050610de2565b5050505092915050565b600082601f8301121515610e2c57600080fd5b8135610e3f610e3a82612149565b611f88565b91508181835260208401935060208101905083856020840282011115610e6457600080fd5b60005b83811015610e945781610e7a88826110aa565b845260208401935060208301925050600181019050610e67565b5050505092915050565b6000610eaa8235612504565b905092915050565b6000610ebe8235612510565b905092915050565b6000610ed2823561253c565b905092915050565b600082601f8301121515610eed57600080fd5b8135610f00610efb82612171565b611f88565b91508082526020830160208301858383011115610f1c57600080fd5b610f278382846125cd565b50505092915050565b600082601f8301121515610f4357600080fd5b8135610f56610f518261219d565b611f88565b91508082526020830160208301858383011115610f7257600080fd5b610f7d8382846125cd565b50505092915050565b6000610f928235612546565b905092915050565b6000610fa68235612553565b905092915050565b6000610fba823561255d565b905092915050565b6000610fce823561256a565b905092915050565b6000610fe28235612577565b905092915050565b600082601f8301121515610ffd57600080fd5b813561101061100b826121c9565b611f88565b9150808252602083016020830185838301111561102c57600080fd5b6110378382846125cd565b50505092915050565b600082601f830112151561105357600080fd5b8135611066611061826121f5565b611f88565b9150808252602083016020830185838301111561108257600080fd5b61108d8382846125cd565b50505092915050565b60006110a28235612584565b905092915050565b60006110b68235612592565b905092915050565b60006110ca823561259c565b905092915050565b60006110de82356125ac565b905092915050565b60006110f282356125c0565b905092915050565b60006020828403121561110c57600080fd5b600061111a848285016108e4565b91505092915050565b60006040828403121561113557600080fd5b6000611143848285016108f8565b91505092915050565b60006020828403121561115e57600080fd5b600082013567ffffffffffffffff81111561117857600080fd5b6111848482850161096e565b91505092915050565b60006040828403121561119f57600080fd5b60006111ad848285016109f3565b91505092915050565b6000602082840312156111c857600080fd5b600082013567ffffffffffffffff8111156111e257600080fd5b6111ee84828501610a69565b91505092915050565b60006020828403121561120957600080fd5b600082013567ffffffffffffffff81111561122357600080fd5b61122f84828501610aee565b91505092915050565b60006020828403121561124a57600080fd5b600082013567ffffffffffffffff81111561126457600080fd5b61127084828501610b55565b91505092915050565b60006040828403121561128b57600080fd5b600061129984828501610bcb565b91505092915050565b6000602082840312156112b457600080fd5b600082013567ffffffffffffffff8111156112ce57600080fd5b6112da84828501610c41565b91505092915050565b6000602082840312156112f557600080fd5b600082013567ffffffffffffffff81111561130f57600080fd5b61131b84828501610cc6565b91505092915050565b60006020828403121561133657600080fd5b600082013567ffffffffffffffff81111561135057600080fd5b61135c84828501610d2d565b91505092915050565b60006040828403121561137757600080fd5b600061138584828501610da3565b91505092915050565b6000602082840312156113a057600080fd5b600082013567ffffffffffffffff8111156113ba57600080fd5b6113c684828501610e19565b91505092915050565b6000602082840312156113e157600080fd5b60006113ef84828501610e9e565b91505092915050565b60006020828403121561140a57600080fd5b600061141884828501610eb2565b91505092915050565b60006020828403121561143357600080fd5b600061144184828501610ec6565b91505092915050565b60006020828403121561145c57600080fd5b600082013567ffffffffffffffff81111561147657600080fd5b61148284828501610f30565b91505092915050565b60006020828403121561149d57600080fd5b60006114ab84828501610f86565b91505092915050565b6000602082840312156114c657600080fd5b60006114d484828501610f9a565b91505092915050565b6000602082840312156114ef57600080fd5b60006114fd84828501610fae565b91505092915050565b60006020828403121561151857600080fd5b600061152684828501610fc2565b91505092915050565b60006020828403121561154157600080fd5b600061154f84828501610fd6565b91505092915050565b60006020828403121561156a57600080fd5b600082013567ffffffffffffffff81111561158457600080fd5b61159084828501611040565b91505092915050565b6000602082840312156115ab57600080fd5b60006115b984828501611096565b91505092915050565b6000602082840312156115d457600080fd5b60006115e2848285016110aa565b91505092915050565b6000602082840312156115fd57600080fd5b600061160b848285016110be565b91505092915050565b60006020828403121561162657600080fd5b6000611634848285016110d2565b91505092915050565b60006020828403121561164f57600080fd5b600061165d848285016110e6565b91505092915050565b61166f816123f7565b82525050565b61167e816122ab565b61168782612221565b60005b828110156116b95761169d858351611666565b6116a68261235b565b915060208501945060018101905061168a565b5050505050565b60006116cb826122b6565b8084526020840193506116dd8361222b565b60005b8281101561170f576116f3868351611666565b6116fc82612368565b91506020860195506001810190506116e0565b50849250505092915050565b611724816122c1565b61172d82612238565b60005b8281101561175f57611743858351611ab3565b61174c82612375565b9150602085019450600181019050611730565b5050505050565b6000611771826122cc565b80845260208401935061178383612242565b60005b828110156117b557611799868351611ab3565b6117a282612382565b9150602086019550600181019050611786565b50849250505092915050565b60006117cc826122d7565b836020820285016117dc8561224f565b60005b848110156118155783830388526117f7838351611b16565b92506118028261238f565b91506020880197506001810190506117df565b508196508694505050505092915050565b6000611831826122e2565b8084526020840193508360208202850161184a85612259565b60005b84811015611883578383038852611865838351611b16565b92506118708261239c565b915060208801975060018101905061184d565b508196508694505050505092915050565b61189d816122ed565b6118a682612266565b60005b828110156118d8576118bc858351611b5b565b6118c5826123a9565b91506020850194506001810190506118a9565b5050505050565b60006118ea826122f8565b8084526020840193506118fc83612270565b60005b8281101561192e57611912868351611b5b565b61191b826123b6565b91506020860195506001810190506118ff565b50849250505092915050565b600061194582612303565b836020820285016119558561227d565b60005b8481101561198e578383038852611970838351611bcd565b925061197b826123c3565b9150602088019750600181019050611958565b508196508694505050505092915050565b60006119aa8261230e565b808452602084019350836020820285016119c385612287565b60005b848110156119fc5783830388526119de838351611bcd565b92506119e9826123d0565b91506020880197506001810190506119c6565b508196508694505050505092915050565b611a1681612319565b611a1f82612294565b60005b82811015611a5157611a35858351611c12565b611a3e826123dd565b9150602085019450600181019050611a22565b5050505050565b6000611a6382612324565b808452602084019350611a758361229e565b60005b82811015611aa757611a8b868351611c12565b611a94826123ea565b9150602086019550600181019050611a78565b50849250505092915050565b611abc81612409565b82525050565b611acb81612415565b82525050565b611ada81612441565b82525050565b6000611aeb8261233a565b808452611aff8160208601602086016125dc565b611b088161260f565b602085010191505092915050565b6000611b218261232f565b808452611b358160208601602086016125dc565b611b3e8161260f565b602085010191505092915050565b611b558161244b565b82525050565b611b6481612458565b82525050565b611b7381612462565b82525050565b611b828161246f565b82525050565b611b918161247c565b82525050565b6000611ba282612350565b808452611bb68160208601602086016125dc565b611bbf8161260f565b602085010191505092915050565b6000611bd882612345565b808452611bec8160208601602086016125dc565b611bf58161260f565b602085010191505092915050565b611c0c81612489565b82525050565b611c1b816124b7565b82525050565b611c2a816124c1565b82525050565b611c39816124d1565b82525050565b611c48816124e5565b82525050565b6000602082019050611c636000830184611666565b92915050565b6000604082019050611c7e6000830184611675565b92915050565b60006020820190508181036000830152611c9e81846116c0565b905092915050565b6000604082019050611cbb600083018461171b565b92915050565b60006020820190508181036000830152611cdb8184611766565b905092915050565b60006020820190508181036000830152611cfd81846117c1565b905092915050565b60006020820190508181036000830152611d1f8184611826565b905092915050565b6000604082019050611d3c6000830184611894565b92915050565b60006020820190508181036000830152611d5c81846118df565b905092915050565b60006020820190508181036000830152611d7e818461193a565b905092915050565b60006020820190508181036000830152611da0818461199f565b905092915050565b6000604082019050611dbd6000830184611a0d565b92915050565b60006020820190508181036000830152611ddd8184611a58565b905092915050565b6000602082019050611dfa6000830184611ab3565b92915050565b6000602082019050611e156000830184611ac2565b92915050565b6000602082019050611e306000830184611ad1565b92915050565b60006020820190508181036000830152611e508184611ae0565b905092915050565b6000602082019050611e6d6000830184611b4c565b92915050565b6000602082019050611e886000830184611b5b565b92915050565b6000602082019050611ea36000830184611b6a565b92915050565b6000602082019050611ebe6000830184611b79565b92915050565b6000602082019050611ed96000830184611b88565b92915050565b60006020820190508181036000830152611ef98184611b97565b905092915050565b6000602082019050611f166000830184611c03565b92915050565b6000602082019050611f316000830184611c12565b92915050565b6000602082019050611f4c6000830184611c21565b92915050565b6000602082019050611f676000830184611c30565b92915050565b6000602082019050611f826000830184611c3f565b92915050565b6000604051905081810181811067ffffffffffffffff82111715611fab57600080fd5b8060405250919050565b600067ffffffffffffffff821115611fcc57600080fd5b602082029050919050565b600067ffffffffffffffff821115611fee57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561201657600080fd5b602082029050919050565b600067ffffffffffffffff82111561203857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561206057600080fd5b602082029050919050565b600067ffffffffffffffff82111561208257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120aa57600080fd5b602082029050919050565b600067ffffffffffffffff8211156120cc57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120f457600080fd5b602082029050919050565b600067ffffffffffffffff82111561211657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561213e57600080fd5b602082029050919050565b600067ffffffffffffffff82111561216057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561218857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121b457600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121e057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561220c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600061240282612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006124fd82612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156125fa5780820151818401526020810190506125df565b83811115612609576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a723058206fe37171cf1b10ebd291cfdca61d67e7fc3c208795e999c833c42a14d86cf00d6c6578706572696d656e74616cf50037`, + ` +// This file is an automatically generated Java binding. Do not modify as any +// change will likely be lost upon the next re-generation! + +package bindtest; + +import org.ethereum.geth.*; +import java.util.*; + + + +public class Test { + // ABI is the input ABI used to generate the binding from. + public final static String ABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"u16\",\"type\":\"uint16\"}],\"name\":\"setUint16\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b_a\",\"type\":\"bool[2]\"}],\"name\":\"setBoolArray\",\"outputs\":[{\"name\":\"\",\"type\":\"bool[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a_a\",\"type\":\"address[2]\"}],\"name\":\"setAddressArray\",\"outputs\":[{\"name\":\"\",\"type\":\"address[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs_l\",\"type\":\"bytes[]\"}],\"name\":\"setBytesList\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u8\",\"type\":\"uint8\"}],\"name\":\"setUint8\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u32\",\"type\":\"uint32\"}],\"name\":\"setUint32\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256_l\",\"type\":\"int256[]\"}],\"name\":\"setInt256List\",\"outputs\":[{\"name\":\"\",\"type\":\"int256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256_a\",\"type\":\"uint256[2]\"}],\"name\":\"setUint256Array\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b_l\",\"type\":\"bool[]\"}],\"name\":\"setBoolList\",\"outputs\":[{\"name\":\"\",\"type\":\"bool[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs_a\",\"type\":\"bytes[2]\"}],\"name\":\"setBytesArray\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a_l\",\"type\":\"address[]\"}],\"name\":\"setAddressList\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256_a\",\"type\":\"int256[2]\"}],\"name\":\"setInt256Array\",\"outputs\":[{\"name\":\"\",\"type\":\"int256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s_a\",\"type\":\"string[2]\"}],\"name\":\"setStringArray\",\"outputs\":[{\"name\":\"\",\"type\":\"string[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s\",\"type\":\"string\"}],\"name\":\"setString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u64\",\"type\":\"uint64\"}],\"name\":\"setUint64\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i16\",\"type\":\"int16\"}],\"name\":\"setInt16\",\"outputs\":[{\"name\":\"\",\"type\":\"int16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i8\",\"type\":\"int8\"}],\"name\":\"setInt8\",\"outputs\":[{\"name\":\"\",\"type\":\"int8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256_l\",\"type\":\"uint256[]\"}],\"name\":\"setUint256List\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256\",\"type\":\"int256\"}],\"name\":\"setInt256\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i32\",\"type\":\"int32\"}],\"name\":\"setInt32\",\"outputs\":[{\"name\":\"\",\"type\":\"int32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b32\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s_l\",\"type\":\"string[]\"}],\"name\":\"setStringList\",\"outputs\":[{\"name\":\"\",\"type\":\"string[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256\",\"type\":\"uint256\"}],\"name\":\"setUint256\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i64\",\"type\":\"int64\"}],\"name\":\"setInt64\",\"outputs\":[{\"name\":\"\",\"type\":\"int64\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b1\",\"type\":\"bytes1\"}],\"name\":\"setBytes1\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes1\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"; + + + // BYTECODE is the compiled bytecode used for deploying new contracts. + public final static String BYTECODE = "0x608060405234801561001057600080fd5b5061265a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637fcaf66611610116578063c2b12a73116100b4578063da359dc81161008e578063da359dc814610666578063e30081a014610696578063e673eb32146106c6578063fba1a1c3146106f6576101e1565b8063c2b12a73146105d6578063c577796114610606578063d2282dc514610636576101e1565b80639a19a953116100f05780639a19a95314610516578063a0709e1914610546578063a53b1c1e14610576578063b7d5df31146105a6576101e1565b80637fcaf66614610486578063822cba69146104b657806386114cea146104e6576101e1565b806322722302116101835780635119655d1161015d5780635119655d146103c65780635be6b37e146103f65780636aa482fc146104265780637173b69514610456576101e1565b806322722302146103365780632766a755146103665780634d5ee6da14610396576101e1565b806316c105e2116101bf57806316c105e2146102765780631774e646146102a65780631c9352e2146102d65780631e26fd3314610306576101e1565b80630477988a146101e6578063118a971814610216578063151f547114610246575b600080fd5b61020060048036036101fb9190810190611599565b610726565b60405161020d9190611f01565b60405180910390f35b610230600480360361022b919081019061118d565b61072d565b60405161023d9190611ca6565b60405180910390f35b610260600480360361025b9190810190611123565b61073a565b60405161026d9190611c69565b60405180910390f35b610290600480360361028b9190810190611238565b610747565b60405161029d9190611d05565b60405180910390f35b6102c060048036036102bb919081019061163d565b61074e565b6040516102cd9190611f6d565b60405180910390f35b6102f060048036036102eb91908101906115eb565b610755565b6040516102fd9190611f37565b60405180910390f35b610320600480360361031b91908101906113cf565b61075c565b60405161032d9190611de5565b60405180910390f35b610350600480360361034b91908101906112a2565b610763565b60405161035d9190611d42565b60405180910390f35b610380600480360361037b9190810190611365565b61076a565b60405161038d9190611da8565b60405180910390f35b6103b060048036036103ab91908101906111b6565b610777565b6040516103bd9190611cc1565b60405180910390f35b6103e060048036036103db91908101906111f7565b61077e565b6040516103ed9190611ce3565b60405180910390f35b610410600480360361040b919081019061114c565b61078b565b60405161041d9190611c84565b60405180910390f35b610440600480360361043b9190810190611279565b610792565b60405161044d9190611d27565b60405180910390f35b610470600480360361046b91908101906112e3565b61079f565b60405161047d9190611d64565b60405180910390f35b6104a0600480360361049b9190810190611558565b6107ac565b6040516104ad9190611edf565b60405180910390f35b6104d060048036036104cb9190810190611614565b6107b3565b6040516104dd9190611f52565b60405180910390f35b61050060048036036104fb919081019061148b565b6107ba565b60405161050d9190611e58565b60405180910390f35b610530600480360361052b919081019061152f565b6107c1565b60405161053d9190611ec4565b60405180910390f35b610560600480360361055b919081019061138e565b6107c8565b60405161056d9190611dc3565b60405180910390f35b610590600480360361058b91908101906114b4565b6107cf565b60405161059d9190611e73565b60405180910390f35b6105c060048036036105bb91908101906114dd565b6107d6565b6040516105cd9190611e8e565b60405180910390f35b6105f060048036036105eb9190810190611421565b6107dd565b6040516105fd9190611e1b565b60405180910390f35b610620600480360361061b9190810190611324565b6107e4565b60405161062d9190611d86565b60405180910390f35b610650600480360361064b91908101906115c2565b6107eb565b60405161065d9190611f1c565b60405180910390f35b610680600480360361067b919081019061144a565b6107f2565b60405161068d9190611e36565b60405180910390f35b6106b060048036036106ab91908101906110fa565b6107f9565b6040516106bd9190611c4e565b60405180910390f35b6106e060048036036106db9190810190611506565b610800565b6040516106ed9190611ea9565b60405180910390f35b610710600480360361070b91908101906113f8565b610807565b60405161071d9190611e00565b60405180910390f35b6000919050565b61073561080e565b919050565b610742610830565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b610772610852565b919050565b6060919050565b610786610874565b919050565b6060919050565b61079a61089b565b919050565b6107a76108bd565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108835790505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108cc5790505090565b60006108f082356124f2565b905092915050565b600082601f830112151561090b57600080fd5b600261091e61091982611fb5565b611f88565b9150818385602084028201111561093457600080fd5b60005b83811015610964578161094a88826108e4565b845260208401935060208301925050600181019050610937565b5050505092915050565b600082601f830112151561098157600080fd5b813561099461098f82611fd7565b611f88565b915081818352602084019350602081019050838560208402820111156109b957600080fd5b60005b838110156109e957816109cf88826108e4565b8452602084019350602083019250506001810190506109bc565b5050505092915050565b600082601f8301121515610a0657600080fd5b6002610a19610a1482611fff565b611f88565b91508183856020840282011115610a2f57600080fd5b60005b83811015610a5f5781610a458882610e9e565b845260208401935060208301925050600181019050610a32565b5050505092915050565b600082601f8301121515610a7c57600080fd5b8135610a8f610a8a82612021565b611f88565b91508181835260208401935060208101905083856020840282011115610ab457600080fd5b60005b83811015610ae45781610aca8882610e9e565b845260208401935060208301925050600181019050610ab7565b5050505092915050565b600082601f8301121515610b0157600080fd5b6002610b14610b0f82612049565b611f88565b9150818360005b83811015610b4b5781358601610b318882610eda565b845260208401935060208301925050600181019050610b1b565b5050505092915050565b600082601f8301121515610b6857600080fd5b8135610b7b610b768261206b565b611f88565b9150818183526020840193506020810190508360005b83811015610bc15781358601610ba78882610eda565b845260208401935060208301925050600181019050610b91565b5050505092915050565b600082601f8301121515610bde57600080fd5b6002610bf1610bec82612093565b611f88565b91508183856020840282011115610c0757600080fd5b60005b83811015610c375781610c1d8882610f9a565b845260208401935060208301925050600181019050610c0a565b5050505092915050565b600082601f8301121515610c5457600080fd5b8135610c67610c62826120b5565b611f88565b91508181835260208401935060208101905083856020840282011115610c8c57600080fd5b60005b83811015610cbc5781610ca28882610f9a565b845260208401935060208301925050600181019050610c8f565b5050505092915050565b600082601f8301121515610cd957600080fd5b6002610cec610ce7826120dd565b611f88565b9150818360005b83811015610d235781358601610d098882610fea565b845260208401935060208301925050600181019050610cf3565b5050505092915050565b600082601f8301121515610d4057600080fd5b8135610d53610d4e826120ff565b611f88565b9150818183526020840193506020810190508360005b83811015610d995781358601610d7f8882610fea565b845260208401935060208301925050600181019050610d69565b5050505092915050565b600082601f8301121515610db657600080fd5b6002610dc9610dc482612127565b611f88565b91508183856020840282011115610ddf57600080fd5b60005b83811015610e0f5781610df588826110aa565b845260208401935060208301925050600181019050610de2565b5050505092915050565b600082601f8301121515610e2c57600080fd5b8135610e3f610e3a82612149565b611f88565b91508181835260208401935060208101905083856020840282011115610e6457600080fd5b60005b83811015610e945781610e7a88826110aa565b845260208401935060208301925050600181019050610e67565b5050505092915050565b6000610eaa8235612504565b905092915050565b6000610ebe8235612510565b905092915050565b6000610ed2823561253c565b905092915050565b600082601f8301121515610eed57600080fd5b8135610f00610efb82612171565b611f88565b91508082526020830160208301858383011115610f1c57600080fd5b610f278382846125cd565b50505092915050565b600082601f8301121515610f4357600080fd5b8135610f56610f518261219d565b611f88565b91508082526020830160208301858383011115610f7257600080fd5b610f7d8382846125cd565b50505092915050565b6000610f928235612546565b905092915050565b6000610fa68235612553565b905092915050565b6000610fba823561255d565b905092915050565b6000610fce823561256a565b905092915050565b6000610fe28235612577565b905092915050565b600082601f8301121515610ffd57600080fd5b813561101061100b826121c9565b611f88565b9150808252602083016020830185838301111561102c57600080fd5b6110378382846125cd565b50505092915050565b600082601f830112151561105357600080fd5b8135611066611061826121f5565b611f88565b9150808252602083016020830185838301111561108257600080fd5b61108d8382846125cd565b50505092915050565b60006110a28235612584565b905092915050565b60006110b68235612592565b905092915050565b60006110ca823561259c565b905092915050565b60006110de82356125ac565b905092915050565b60006110f282356125c0565b905092915050565b60006020828403121561110c57600080fd5b600061111a848285016108e4565b91505092915050565b60006040828403121561113557600080fd5b6000611143848285016108f8565b91505092915050565b60006020828403121561115e57600080fd5b600082013567ffffffffffffffff81111561117857600080fd5b6111848482850161096e565b91505092915050565b60006040828403121561119f57600080fd5b60006111ad848285016109f3565b91505092915050565b6000602082840312156111c857600080fd5b600082013567ffffffffffffffff8111156111e257600080fd5b6111ee84828501610a69565b91505092915050565b60006020828403121561120957600080fd5b600082013567ffffffffffffffff81111561122357600080fd5b61122f84828501610aee565b91505092915050565b60006020828403121561124a57600080fd5b600082013567ffffffffffffffff81111561126457600080fd5b61127084828501610b55565b91505092915050565b60006040828403121561128b57600080fd5b600061129984828501610bcb565b91505092915050565b6000602082840312156112b457600080fd5b600082013567ffffffffffffffff8111156112ce57600080fd5b6112da84828501610c41565b91505092915050565b6000602082840312156112f557600080fd5b600082013567ffffffffffffffff81111561130f57600080fd5b61131b84828501610cc6565b91505092915050565b60006020828403121561133657600080fd5b600082013567ffffffffffffffff81111561135057600080fd5b61135c84828501610d2d565b91505092915050565b60006040828403121561137757600080fd5b600061138584828501610da3565b91505092915050565b6000602082840312156113a057600080fd5b600082013567ffffffffffffffff8111156113ba57600080fd5b6113c684828501610e19565b91505092915050565b6000602082840312156113e157600080fd5b60006113ef84828501610e9e565b91505092915050565b60006020828403121561140a57600080fd5b600061141884828501610eb2565b91505092915050565b60006020828403121561143357600080fd5b600061144184828501610ec6565b91505092915050565b60006020828403121561145c57600080fd5b600082013567ffffffffffffffff81111561147657600080fd5b61148284828501610f30565b91505092915050565b60006020828403121561149d57600080fd5b60006114ab84828501610f86565b91505092915050565b6000602082840312156114c657600080fd5b60006114d484828501610f9a565b91505092915050565b6000602082840312156114ef57600080fd5b60006114fd84828501610fae565b91505092915050565b60006020828403121561151857600080fd5b600061152684828501610fc2565b91505092915050565b60006020828403121561154157600080fd5b600061154f84828501610fd6565b91505092915050565b60006020828403121561156a57600080fd5b600082013567ffffffffffffffff81111561158457600080fd5b61159084828501611040565b91505092915050565b6000602082840312156115ab57600080fd5b60006115b984828501611096565b91505092915050565b6000602082840312156115d457600080fd5b60006115e2848285016110aa565b91505092915050565b6000602082840312156115fd57600080fd5b600061160b848285016110be565b91505092915050565b60006020828403121561162657600080fd5b6000611634848285016110d2565b91505092915050565b60006020828403121561164f57600080fd5b600061165d848285016110e6565b91505092915050565b61166f816123f7565b82525050565b61167e816122ab565b61168782612221565b60005b828110156116b95761169d858351611666565b6116a68261235b565b915060208501945060018101905061168a565b5050505050565b60006116cb826122b6565b8084526020840193506116dd8361222b565b60005b8281101561170f576116f3868351611666565b6116fc82612368565b91506020860195506001810190506116e0565b50849250505092915050565b611724816122c1565b61172d82612238565b60005b8281101561175f57611743858351611ab3565b61174c82612375565b9150602085019450600181019050611730565b5050505050565b6000611771826122cc565b80845260208401935061178383612242565b60005b828110156117b557611799868351611ab3565b6117a282612382565b9150602086019550600181019050611786565b50849250505092915050565b60006117cc826122d7565b836020820285016117dc8561224f565b60005b848110156118155783830388526117f7838351611b16565b92506118028261238f565b91506020880197506001810190506117df565b508196508694505050505092915050565b6000611831826122e2565b8084526020840193508360208202850161184a85612259565b60005b84811015611883578383038852611865838351611b16565b92506118708261239c565b915060208801975060018101905061184d565b508196508694505050505092915050565b61189d816122ed565b6118a682612266565b60005b828110156118d8576118bc858351611b5b565b6118c5826123a9565b91506020850194506001810190506118a9565b5050505050565b60006118ea826122f8565b8084526020840193506118fc83612270565b60005b8281101561192e57611912868351611b5b565b61191b826123b6565b91506020860195506001810190506118ff565b50849250505092915050565b600061194582612303565b836020820285016119558561227d565b60005b8481101561198e578383038852611970838351611bcd565b925061197b826123c3565b9150602088019750600181019050611958565b508196508694505050505092915050565b60006119aa8261230e565b808452602084019350836020820285016119c385612287565b60005b848110156119fc5783830388526119de838351611bcd565b92506119e9826123d0565b91506020880197506001810190506119c6565b508196508694505050505092915050565b611a1681612319565b611a1f82612294565b60005b82811015611a5157611a35858351611c12565b611a3e826123dd565b9150602085019450600181019050611a22565b5050505050565b6000611a6382612324565b808452602084019350611a758361229e565b60005b82811015611aa757611a8b868351611c12565b611a94826123ea565b9150602086019550600181019050611a78565b50849250505092915050565b611abc81612409565b82525050565b611acb81612415565b82525050565b611ada81612441565b82525050565b6000611aeb8261233a565b808452611aff8160208601602086016125dc565b611b088161260f565b602085010191505092915050565b6000611b218261232f565b808452611b358160208601602086016125dc565b611b3e8161260f565b602085010191505092915050565b611b558161244b565b82525050565b611b6481612458565b82525050565b611b7381612462565b82525050565b611b828161246f565b82525050565b611b918161247c565b82525050565b6000611ba282612350565b808452611bb68160208601602086016125dc565b611bbf8161260f565b602085010191505092915050565b6000611bd882612345565b808452611bec8160208601602086016125dc565b611bf58161260f565b602085010191505092915050565b611c0c81612489565b82525050565b611c1b816124b7565b82525050565b611c2a816124c1565b82525050565b611c39816124d1565b82525050565b611c48816124e5565b82525050565b6000602082019050611c636000830184611666565b92915050565b6000604082019050611c7e6000830184611675565b92915050565b60006020820190508181036000830152611c9e81846116c0565b905092915050565b6000604082019050611cbb600083018461171b565b92915050565b60006020820190508181036000830152611cdb8184611766565b905092915050565b60006020820190508181036000830152611cfd81846117c1565b905092915050565b60006020820190508181036000830152611d1f8184611826565b905092915050565b6000604082019050611d3c6000830184611894565b92915050565b60006020820190508181036000830152611d5c81846118df565b905092915050565b60006020820190508181036000830152611d7e818461193a565b905092915050565b60006020820190508181036000830152611da0818461199f565b905092915050565b6000604082019050611dbd6000830184611a0d565b92915050565b60006020820190508181036000830152611ddd8184611a58565b905092915050565b6000602082019050611dfa6000830184611ab3565b92915050565b6000602082019050611e156000830184611ac2565b92915050565b6000602082019050611e306000830184611ad1565b92915050565b60006020820190508181036000830152611e508184611ae0565b905092915050565b6000602082019050611e6d6000830184611b4c565b92915050565b6000602082019050611e886000830184611b5b565b92915050565b6000602082019050611ea36000830184611b6a565b92915050565b6000602082019050611ebe6000830184611b79565b92915050565b6000602082019050611ed96000830184611b88565b92915050565b60006020820190508181036000830152611ef98184611b97565b905092915050565b6000602082019050611f166000830184611c03565b92915050565b6000602082019050611f316000830184611c12565b92915050565b6000602082019050611f4c6000830184611c21565b92915050565b6000602082019050611f676000830184611c30565b92915050565b6000602082019050611f826000830184611c3f565b92915050565b6000604051905081810181811067ffffffffffffffff82111715611fab57600080fd5b8060405250919050565b600067ffffffffffffffff821115611fcc57600080fd5b602082029050919050565b600067ffffffffffffffff821115611fee57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561201657600080fd5b602082029050919050565b600067ffffffffffffffff82111561203857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561206057600080fd5b602082029050919050565b600067ffffffffffffffff82111561208257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120aa57600080fd5b602082029050919050565b600067ffffffffffffffff8211156120cc57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120f457600080fd5b602082029050919050565b600067ffffffffffffffff82111561211657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561213e57600080fd5b602082029050919050565b600067ffffffffffffffff82111561216057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561218857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121b457600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121e057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561220c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600061240282612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006124fd82612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156125fa5780820151818401526020810190506125df565b83811115612609576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a723058206fe37171cf1b10ebd291cfdca61d67e7fc3c208795e999c833c42a14d86cf00d6c6578706572696d656e74616cf50037"; + + // deploy deploys a new Ethereum contract, binding an instance of Test to it. + public static Test deploy(TransactOpts auth, EthereumClient client) throws Exception { + Interfaces args = Geth.newInterfaces(0); + String bytecode = BYTECODE; + + + return new Test(Geth.deployContract(auth, ABI, Geth.decodeFromHex(bytecode), client, args)); + } + + // Internal constructor used by contract deployment. + private Test(BoundContract deployment) { + this.Address = deployment.getAddress(); + this.Deployer = deployment.getDeployer(); + this.Contract = deployment; + } + + + // Ethereum address where this contract is located at. + public final Address Address; + + // Ethereum transaction in which this contract was deployed (if known!). + public final Transaction Deployer; + + // Contract instance bound to a blockchain address. + private final BoundContract Contract; + + // Creates a new instance of Test, bound to a specific deployed contract. + public Test(Address address, EthereumClient client) throws Exception { + this(Geth.bindContract(address, ABI, client)); + } + + + + + // setAddress is a paid mutator transaction binding the contract method 0xe30081a0. + // + // Solidity: function setAddress(address a) returns(address) + public Transaction setAddress(TransactOpts opts, Address a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setAddress(a);args.set(0,arg0); + + return this.Contract.transact(opts, "setAddress" , args); + } + + // setAddressArray is a paid mutator transaction binding the contract method 0x151f5471. + // + // Solidity: function setAddressArray(address[2] a_a) returns(address[2]) + public Transaction setAddressArray(TransactOpts opts, Addresses a_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setAddresses(a_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setAddressArray" , args); + } + + // setAddressList is a paid mutator transaction binding the contract method 0x5be6b37e. + // + // Solidity: function setAddressList(address[] a_l) returns(address[]) + public Transaction setAddressList(TransactOpts opts, Addresses a_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setAddresses(a_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setAddressList" , args); + } + + // setBool is a paid mutator transaction binding the contract method 0x1e26fd33. + // + // Solidity: function setBool(bool b) returns(bool) + public Transaction setBool(TransactOpts opts, boolean b) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBool(b);args.set(0,arg0); + + return this.Contract.transact(opts, "setBool" , args); + } + + // setBoolArray is a paid mutator transaction binding the contract method 0x118a9718. + // + // Solidity: function setBoolArray(bool[2] b_a) returns(bool[2]) + public Transaction setBoolArray(TransactOpts opts, Bools b_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBools(b_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setBoolArray" , args); + } + + // setBoolList is a paid mutator transaction binding the contract method 0x4d5ee6da. + // + // Solidity: function setBoolList(bool[] b_l) returns(bool[]) + public Transaction setBoolList(TransactOpts opts, Bools b_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBools(b_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setBoolList" , args); + } + + // setBytes is a paid mutator transaction binding the contract method 0xda359dc8. + // + // Solidity: function setBytes(bytes bs) returns(bytes) + public Transaction setBytes(TransactOpts opts, byte[] bs) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinary(bs);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytes" , args); + } + + // setBytes1 is a paid mutator transaction binding the contract method 0xfba1a1c3. + // + // Solidity: function setBytes1(bytes1 b1) returns(bytes1) + public Transaction setBytes1(TransactOpts opts, byte[] b1) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinary(b1);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytes1" , args); + } + + // setBytes32 is a paid mutator transaction binding the contract method 0xc2b12a73. + // + // Solidity: function setBytes32(bytes32 b32) returns(bytes32) + public Transaction setBytes32(TransactOpts opts, byte[] b32) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinary(b32);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytes32" , args); + } + + // setBytesArray is a paid mutator transaction binding the contract method 0x5119655d. + // + // Solidity: function setBytesArray(bytes[2] bs_a) returns(bytes[2]) + public Transaction setBytesArray(TransactOpts opts, Binaries bs_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytesArray" , args); + } + + // setBytesList is a paid mutator transaction binding the contract method 0x16c105e2. + // + // Solidity: function setBytesList(bytes[] bs_l) returns(bytes[]) + public Transaction setBytesList(TransactOpts opts, Binaries bs_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytesList" , args); + } + + // setInt16 is a paid mutator transaction binding the contract method 0x86114cea. + // + // Solidity: function setInt16(int16 i16) returns(int16) + public Transaction setInt16(TransactOpts opts, short i16) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setInt16(i16);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt16" , args); + } + + // setInt256 is a paid mutator transaction binding the contract method 0xa53b1c1e. + // + // Solidity: function setInt256(int256 i256) returns(int256) + public Transaction setInt256(TransactOpts opts, BigInt i256) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInt(i256);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt256" , args); + } + + // setInt256Array is a paid mutator transaction binding the contract method 0x6aa482fc. + // + // Solidity: function setInt256Array(int256[2] i256_a) returns(int256[2]) + public Transaction setInt256Array(TransactOpts opts, BigInts i256_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt256Array" , args); + } + + // setInt256List is a paid mutator transaction binding the contract method 0x22722302. + // + // Solidity: function setInt256List(int256[] i256_l) returns(int256[]) + public Transaction setInt256List(TransactOpts opts, BigInts i256_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt256List" , args); + } + + // setInt32 is a paid mutator transaction binding the contract method 0xb7d5df31. + // + // Solidity: function setInt32(int32 i32) returns(int32) + public Transaction setInt32(TransactOpts opts, int i32) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setInt32(i32);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt32" , args); + } + + // setInt64 is a paid mutator transaction binding the contract method 0xe673eb32. + // + // Solidity: function setInt64(int64 i64) returns(int64) + public Transaction setInt64(TransactOpts opts, long i64) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setInt64(i64);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt64" , args); + } + + // setInt8 is a paid mutator transaction binding the contract method 0x9a19a953. + // + // Solidity: function setInt8(int8 i8) returns(int8) + public Transaction setInt8(TransactOpts opts, byte i8) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setInt8(i8);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt8" , args); + } + + // setString is a paid mutator transaction binding the contract method 0x7fcaf666. + // + // Solidity: function setString(string s) returns(string) + public Transaction setString(TransactOpts opts, String s) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setString(s);args.set(0,arg0); + + return this.Contract.transact(opts, "setString" , args); + } + + // setStringArray is a paid mutator transaction binding the contract method 0x7173b695. + // + // Solidity: function setStringArray(string[2] s_a) returns(string[2]) + public Transaction setStringArray(TransactOpts opts, Strings s_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setStrings(s_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setStringArray" , args); + } + + // setStringList is a paid mutator transaction binding the contract method 0xc5777961. + // + // Solidity: function setStringList(string[] s_l) returns(string[]) + public Transaction setStringList(TransactOpts opts, Strings s_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setStrings(s_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setStringList" , args); + } + + // setUint16 is a paid mutator transaction binding the contract method 0x0477988a. + // + // Solidity: function setUint16(uint16 u16) returns(uint16) + public Transaction setUint16(TransactOpts opts, BigInt u16) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setUint16(u16);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint16" , args); + } + + // setUint256 is a paid mutator transaction binding the contract method 0xd2282dc5. + // + // Solidity: function setUint256(uint256 u256) returns(uint256) + public Transaction setUint256(TransactOpts opts, BigInt u256) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInt(u256);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint256" , args); + } + + // setUint256Array is a paid mutator transaction binding the contract method 0x2766a755. + // + // Solidity: function setUint256Array(uint256[2] u256_a) returns(uint256[2]) + public Transaction setUint256Array(TransactOpts opts, BigInts u256_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint256Array" , args); + } + + // setUint256List is a paid mutator transaction binding the contract method 0xa0709e19. + // + // Solidity: function setUint256List(uint256[] u256_l) returns(uint256[]) + public Transaction setUint256List(TransactOpts opts, BigInts u256_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint256List" , args); + } + + // setUint32 is a paid mutator transaction binding the contract method 0x1c9352e2. + // + // Solidity: function setUint32(uint32 u32) returns(uint32) + public Transaction setUint32(TransactOpts opts, BigInt u32) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setUint32(u32);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint32" , args); + } + + // setUint64 is a paid mutator transaction binding the contract method 0x822cba69. + // + // Solidity: function setUint64(uint64 u64) returns(uint64) + public Transaction setUint64(TransactOpts opts, BigInt u64) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setUint64(u64);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint64" , args); + } + + // setUint8 is a paid mutator transaction binding the contract method 0x1774e646. + // + // Solidity: function setUint8(uint8 u8) returns(uint8) + public Transaction setUint8(TransactOpts opts, BigInt u8) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setUint8(u8);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint8" , args); + } + +} + +`, + }, + } + for i, c := range cases { + binding, err := Bind([]string{c.name}, []string{c.abi}, []string{c.bytecode}, nil, "bindtest", LangJava, nil) + if err != nil { + t.Fatalf("test %d: failed to generate binding: %v", i, err) + } + if binding != c.expected { + t.Fatalf("test %d: generated binding mismatch, has %s, want %s", i, binding, c.expected) + } + } +} diff --git a/accounts/abi/bind/template.go b/accounts/abi/bind/template.go index 7202ee67a101..3683a1eb4fdc 100644 --- a/accounts/abi/bind/template.go +++ b/accounts/abi/bind/template.go @@ -22,6 +22,7 @@ import "github.com/ethereum/go-ethereum/accounts/abi" type tmplData struct { Package string // Name of the package to place the generated file in Contracts map[string]*tmplContract // List of contracts to generate into this file + Libraries map[string]string // Map the bytecode's link pattern to the library name } // tmplContract contains the data needed to generate an individual contract binding. @@ -29,10 +30,14 @@ type tmplContract struct { Type string // Type name of the main contract binding InputABI string // JSON ABI used as the input to generate the binding from InputBin string // Optional EVM bytecode used to denetare deploy code from + FuncSigs map[string]string // Optional map: string signature -> 4-byte signature Constructor abi.Method // Contract constructor for deploy parametrization Calls map[string]*tmplMethod // Contract calls that only read state data Transacts map[string]*tmplMethod // Contract calls that write state data Events map[string]*tmplEvent // Contract events accessors + Libraries map[string]string // Same as tmplData, but filtered to only keep what the contract needs + Structs map[string]*tmplStruct // Contract struct type definitions + Library bool } // tmplMethod is a wrapper around an abi.Method that contains a few preprocessed @@ -49,6 +54,21 @@ type tmplEvent struct { Normalized abi.Event // Normalized version of the parsed fields } +// tmplField is a wrapper around a struct field with binding language +// struct type definition and relative filed name. +type tmplField struct { + Type string // Field type representation depends on target binding language + Name string // Field name converted from the raw user-defined field name + SolKind abi.Type // Raw abi type information +} + +// tmplStruct is a wrapper around an abi.tuple contains a auto-generated +// struct name. +type tmplStruct struct { + Name string // Auto-generated struct name(We can't obtain the raw struct name through abi) + Fields []*tmplField // Struct fields definition depends on the binding language. +} + // tmplSource is language to template mapping containing all the supported // programming languages the package can generate to. var tmplSource = map[Lang]string{ @@ -64,20 +84,57 @@ const tmplSourceGo = ` package {{.Package}} +import ( + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = abi.U256 + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + {{range $contract := .Contracts}} + {{$structs := $contract.Structs}} // {{.Type}}ABI is the input ABI used to generate the binding from. const {{.Type}}ABI = "{{.InputABI}}" + {{if $contract.FuncSigs}} + // {{.Type}}FuncSigs maps the 4-byte function signature to its string representation. + var {{.Type}}FuncSigs = map[string]string{ + {{range $strsig, $binsig := .FuncSigs}}"{{$binsig}}": "{{$strsig}}", + {{end}} + } + {{end}} + {{if .InputBin}} // {{.Type}}Bin is the compiled bytecode used for deploying new contracts. - const {{.Type}}Bin = ` + "`" + `{{.InputBin}}` + "`" + ` + var {{.Type}}Bin = "0x{{.InputBin}}" // Deploy{{.Type}} deploys a new Ethereum contract, binding an instance of {{.Type}} to it. - func Deploy{{.Type}}(auth *bind.TransactOpts, backend bind.ContractBackend {{range .Constructor.Inputs}}, {{.Name}} {{bindtype .Type}}{{end}}) (common.Address, *types.Transaction, *{{.Type}}, error) { + func Deploy{{.Type}}(auth *bind.TransactOpts, backend bind.ContractBackend {{range .Constructor.Inputs}}, {{.Name}} {{bindtype .Type $structs}}{{end}}) (common.Address, *types.Transaction, *{{.Type}}, error) { parsed, err := abi.JSON(strings.NewReader({{.Type}}ABI)) if err != nil { return common.Address{}, nil, nil, err } + {{range $pattern, $name := .Libraries}} + {{decapitalise $name}}Addr, _, _, _ := Deploy{{capitalise $name}}(auth, backend) + {{$contract.Type}}Bin = strings.Replace({{$contract.Type}}Bin, "__${{$pattern}}$__", {{decapitalise $name}}Addr.String()[2:], -1) + {{end}} address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex({{.Type}}Bin), backend {{range .Constructor.Inputs}}, {{.Name}}{{end}}) if err != nil { return common.Address{}, nil, nil, err @@ -90,7 +147,7 @@ package {{.Package}} type {{.Type}} struct { {{.Type}}Caller // Read-only binding to the contract {{.Type}}Transactor // Write-only binding to the contract - {{.Type}}Filterer // Log filterer for contract events + {{.Type}}Filterer // Log filterer for contract events } // {{.Type}}Caller is an auto generated read-only Go binding around an Ethereum contract. @@ -228,16 +285,24 @@ package {{.Package}} return _{{$contract.Type}}.Contract.contract.Transact(opts, method, params...) } + {{range .Structs}} + // {{.Name}} is an auto generated low-level Go binding around an user-defined struct. + type {{.Name}} struct { + {{range $field := .Fields}} + {{$field.Name}} {{$field.Type}}{{end}} + } + {{end}} + {{range .Calls}} // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Caller) {{.Normalized.Name}}(opts *bind.CallOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type}};{{end}} },{{else}}{{range .Normalized.Outputs}}{{bindtype .Type}},{{end}}{{end}} error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Caller) {{.Normalized.Name}}(opts *bind.CallOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type $structs}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs}};{{end}} },{{else}}{{range .Normalized.Outputs}}{{bindtype .Type $structs}},{{end}}{{end}} error) { {{if .Structured}}ret := new(struct{ - {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type}} + {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs}} {{end}} }){{else}}var ( - {{range $i, $_ := .Normalized.Outputs}}ret{{$i}} = new({{bindtype .Type}}) + {{range $i, $_ := .Normalized.Outputs}}ret{{$i}} = new({{bindtype .Type $structs}}) {{end}} ){{end}} out := {{if .Structured}}ret{{else}}{{if eq (len .Normalized.Outputs) 1}}ret0{{else}}&[]interface{}{ @@ -250,15 +315,15 @@ package {{.Package}} // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type}},{{end}} {{end}} error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type $structs}},{{end}} {{end}} error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.CallOpts {{range .Normalized.Inputs}}, {{.Name}}{{end}}) } // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}CallerSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type}},{{end}} {{end}} error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}CallerSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type $structs}},{{end}} {{end}} error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.CallOpts {{range .Normalized.Inputs}}, {{.Name}}{{end}}) } {{end}} @@ -266,22 +331,22 @@ package {{.Package}} {{range .Transacts}} // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Transactor) {{.Normalized.Name}}(opts *bind.TransactOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type}} {{end}}) (*types.Transaction, error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Transactor) {{.Normalized.Name}}(opts *bind.TransactOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type $structs}} {{end}}) (*types.Transaction, error) { return _{{$contract.Type}}.contract.Transact(opts, "{{.Original.Name}}" {{range .Normalized.Inputs}}, {{.Name}}{{end}}) } // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type}} {{end}}) (*types.Transaction, error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs}} {{end}}) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.TransactOpts {{range $i, $_ := .Normalized.Inputs}}, {{.Name}}{{end}}) } // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type}} {{end}}) (*types.Transaction, error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs}} {{end}}) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.TransactOpts {{range $i, $_ := .Normalized.Inputs}}, {{.Name}}{{end}}) } {{end}} @@ -353,14 +418,14 @@ package {{.Package}} // {{$contract.Type}}{{.Normalized.Name}} represents a {{.Normalized.Name}} event raised by the {{$contract.Type}} contract. type {{$contract.Type}}{{.Normalized.Name}} struct { {{range .Normalized.Inputs}} - {{capitalise .Name}} {{if .Indexed}}{{bindtopictype .Type}}{{else}}{{bindtype .Type}}{{end}}; {{end}} + {{capitalise .Name}} {{if .Indexed}}{{bindtopictype .Type $structs}}{{else}}{{bindtype .Type $structs}}{{end}}; {{end}} Raw types.Log // Blockchain specific contextual infos } // Filter{{.Normalized.Name}} is a free log retrieval operation binding the contract event 0x{{printf "%x" .Original.Id}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Filter{{.Normalized.Name}}(opts *bind.FilterOpts{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type}}{{end}}{{end}}) (*{{$contract.Type}}{{.Normalized.Name}}Iterator, error) { + // Solidity: {{formatevent .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Filter{{.Normalized.Name}}(opts *bind.FilterOpts{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type $structs}}{{end}}{{end}}) (*{{$contract.Type}}{{.Normalized.Name}}Iterator, error) { {{range .Normalized.Inputs}} {{if .Indexed}}var {{.Name}}Rule []interface{} for _, {{.Name}}Item := range {{.Name}} { @@ -376,8 +441,8 @@ package {{.Package}} // Watch{{.Normalized.Name}} is a free log subscription operation binding the contract event 0x{{printf "%x" .Original.Id}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Watch{{.Normalized.Name}}(opts *bind.WatchOpts, sink chan<- *{{$contract.Type}}{{.Normalized.Name}}{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type}}{{end}}{{end}}) (event.Subscription, error) { + // Solidity: {{formatevent .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Watch{{.Normalized.Name}}(opts *bind.WatchOpts, sink chan<- *{{$contract.Type}}{{.Normalized.Name}}{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type $structs}}{{end}}{{end}}) (event.Subscription, error) { {{range .Normalized.Inputs}} {{if .Indexed}}var {{.Name}}Rule []interface{} for _, {{.Name}}Item := range {{.Name}} { @@ -415,6 +480,18 @@ package {{.Package}} } }), nil } + + // Parse{{.Normalized.Name}} is a log parse operation binding the contract event 0x{{printf "%x" .Original.Id}}. + // + // Solidity: {{.Original.String}} + func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Parse{{.Normalized.Name}}(log types.Log) (*{{$contract.Type}}{{.Normalized.Name}}, error) { + event := new({{$contract.Type}}{{.Normalized.Name}}) + if err := _{{$contract.Type}}.contract.UnpackLog(event, "{{.Original.Name}}", log); err != nil { + return nil, err + } + return event, nil + } + {{end}} {{end}} ` @@ -428,95 +505,112 @@ const tmplSourceJava = ` package {{.Package}}; import org.ethereum.geth.*; -import org.ethereum.geth.internal.*; +import java.util.*; {{range $contract := .Contracts}} - public class {{.Type}} { - // ABI is the input ABI used to generate the binding from. - public final static String ABI = "{{.InputABI}}"; - - {{if .InputBin}} - // BYTECODE is the compiled bytecode used for deploying new contracts. - public final static byte[] BYTECODE = "{{.InputBin}}".getBytes(); - - // deploy deploys a new Ethereum contract, binding an instance of {{.Type}} to it. - public static {{.Type}} deploy(TransactOpts auth, EthereumClient client{{range .Constructor.Inputs}}, {{bindtype .Type}} {{.Name}}{{end}}) throws Exception { - Interfaces args = Geth.newInterfaces({{(len .Constructor.Inputs)}}); - {{range $index, $element := .Constructor.Inputs}} - args.set({{$index}}, Geth.newInterface()); args.get({{$index}}).set{{namedtype (bindtype .Type) .Type}}({{.Name}}); - {{end}} - return new {{.Type}}(Geth.deployContract(auth, ABI, BYTECODE, client, args)); - } - - // Internal constructor used by contract deployment. - private {{.Type}}(BoundContract deployment) { - this.Address = deployment.getAddress(); - this.Deployer = deployment.getDeployer(); - this.Contract = deployment; - } +{{$structs := $contract.Structs}} +{{if not .Library}}public {{end}}class {{.Type}} { + // ABI is the input ABI used to generate the binding from. + public final static String ABI = "{{.InputABI}}"; + {{if $contract.FuncSigs}} + // {{.Type}}FuncSigs maps the 4-byte function signature to its string representation. + public final static Map {{.Type}}FuncSigs; + static { + Hashtable temp = new Hashtable(); + {{range $strsig, $binsig := .FuncSigs}}temp.put("{{$binsig}}", "{{$strsig}}"); + {{end}} + {{.Type}}FuncSigs = Collections.unmodifiableMap(temp); + } + {{end}} + {{if .InputBin}} + // BYTECODE is the compiled bytecode used for deploying new contracts. + public final static String BYTECODE = "0x{{.InputBin}}"; + + // deploy deploys a new Ethereum contract, binding an instance of {{.Type}} to it. + public static {{.Type}} deploy(TransactOpts auth, EthereumClient client{{range .Constructor.Inputs}}, {{bindtype .Type $structs}} {{.Name}}{{end}}) throws Exception { + Interfaces args = Geth.newInterfaces({{(len .Constructor.Inputs)}}); + String bytecode = BYTECODE; + {{if .Libraries}} + + // "link" contract to dependent libraries by deploying them first. + {{range $pattern, $name := .Libraries}} + {{capitalise $name}} {{decapitalise $name}}Inst = {{capitalise $name}}.deploy(auth, client); + bytecode = bytecode.replace("__${{$pattern}}$__", {{decapitalise $name}}Inst.Address.getHex().substring(2)); + {{end}} + {{end}} + {{range $index, $element := .Constructor.Inputs}}Interface arg{{$index}} = Geth.newInterface();arg{{$index}}.set{{namedtype (bindtype .Type $structs) .Type}}({{.Name}});args.set({{$index}},arg{{$index}}); {{end}} + return new {{.Type}}(Geth.deployContract(auth, ABI, Geth.decodeFromHex(bytecode), client, args)); + } - // Ethereum address where this contract is located at. - public final Address Address; + // Internal constructor used by contract deployment. + private {{.Type}}(BoundContract deployment) { + this.Address = deployment.getAddress(); + this.Deployer = deployment.getDeployer(); + this.Contract = deployment; + } + {{end}} - // Ethereum transaction in which this contract was deployed (if known!). - public final Transaction Deployer; + // Ethereum address where this contract is located at. + public final Address Address; - // Contract instance bound to a blockchain address. - private final BoundContract Contract; + // Ethereum transaction in which this contract was deployed (if known!). + public final Transaction Deployer; - // Creates a new instance of {{.Type}}, bound to a specific deployed contract. - public {{.Type}}(Address address, EthereumClient client) throws Exception { - this(Geth.bindContract(address, ABI, client)); - } + // Contract instance bound to a blockchain address. + private final BoundContract Contract; - {{range .Calls}} - {{if gt (len .Normalized.Outputs) 1}} - // {{capitalise .Normalized.Name}}Results is the output of a call to {{.Normalized.Name}}. - public class {{capitalise .Normalized.Name}}Results { - {{range $index, $item := .Normalized.Outputs}}public {{bindtype .Type}} {{if ne .Name ""}}{{.Name}}{{else}}Return{{$index}}{{end}}; - {{end}} - } - {{end}} + // Creates a new instance of {{.Type}}, bound to a specific deployed contract. + public {{.Type}}(Address address, EthereumClient client) throws Exception { + this(Geth.bindContract(address, ABI, client)); + } - // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}. - // - // Solidity: {{.Original.String}} - public {{if gt (len .Normalized.Outputs) 1}}{{capitalise .Normalized.Name}}Results{{else}}{{range .Normalized.Outputs}}{{bindtype .Type}}{{end}}{{end}} {{.Normalized.Name}}(CallOpts opts{{range .Normalized.Inputs}}, {{bindtype .Type}} {{.Name}}{{end}}) throws Exception { - Interfaces args = Geth.newInterfaces({{(len .Normalized.Inputs)}}); - {{range $index, $item := .Normalized.Inputs}}args.set({{$index}}, Geth.newInterface()); args.get({{$index}}).set{{namedtype (bindtype .Type) .Type}}({{.Name}}); - {{end}} + {{range .Calls}} + {{if gt (len .Normalized.Outputs) 1}} + // {{capitalise .Normalized.Name}}Results is the output of a call to {{.Normalized.Name}}. + public class {{capitalise .Normalized.Name}}Results { + {{range $index, $item := .Normalized.Outputs}}public {{bindtype .Type $structs}} {{if ne .Name ""}}{{.Name}}{{else}}Return{{$index}}{{end}}; + {{end}} + } + {{end}} - Interfaces results = Geth.newInterfaces({{(len .Normalized.Outputs)}}); - {{range $index, $item := .Normalized.Outputs}}Interface result{{$index}} = Geth.newInterface(); result{{$index}}.setDefault{{namedtype (bindtype .Type) .Type}}(); results.set({{$index}}, result{{$index}}); - {{end}} + // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}. + // + // Solidity: {{.Original.String}} + public {{if gt (len .Normalized.Outputs) 1}}{{capitalise .Normalized.Name}}Results{{else}}{{range .Normalized.Outputs}}{{bindtype .Type $structs}}{{end}}{{end}} {{.Normalized.Name}}(CallOpts opts{{range .Normalized.Inputs}}, {{bindtype .Type $structs}} {{.Name}}{{end}}) throws Exception { + Interfaces args = Geth.newInterfaces({{(len .Normalized.Inputs)}}); + {{range $index, $item := .Normalized.Inputs}}Interface arg{{$index}} = Geth.newInterface();arg{{$index}}.set{{namedtype (bindtype .Type $structs) .Type}}({{.Name}});args.set({{$index}},arg{{$index}}); + {{end}} - if (opts == null) { - opts = Geth.newCallOpts(); - } - this.Contract.call(opts, results, "{{.Original.Name}}", args); - {{if gt (len .Normalized.Outputs) 1}} - {{capitalise .Normalized.Name}}Results result = new {{capitalise .Normalized.Name}}Results(); - {{range $index, $item := .Normalized.Outputs}}result.{{if ne .Name ""}}{{.Name}}{{else}}Return{{$index}}{{end}} = results.get({{$index}}).get{{namedtype (bindtype .Type) .Type}}(); - {{end}} - return result; - {{else}}{{range .Normalized.Outputs}}return results.get(0).get{{namedtype (bindtype .Type) .Type}}();{{end}} - {{end}} - } + Interfaces results = Geth.newInterfaces({{(len .Normalized.Outputs)}}); + {{range $index, $item := .Normalized.Outputs}}Interface result{{$index}} = Geth.newInterface(); result{{$index}}.setDefault{{namedtype (bindtype .Type $structs) .Type}}(); results.set({{$index}}, result{{$index}}); {{end}} - {{range .Transacts}} - // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}. - // - // Solidity: {{.Original.String}} - public Transaction {{.Normalized.Name}}(TransactOpts opts{{range .Normalized.Inputs}}, {{bindtype .Type}} {{.Name}}{{end}}) throws Exception { - Interfaces args = Geth.newInterfaces({{(len .Normalized.Inputs)}}); - {{range $index, $item := .Normalized.Inputs}}args.set({{$index}}, Geth.newInterface()); args.get({{$index}}).set{{namedtype (bindtype .Type) .Type}}({{.Name}}); - {{end}} + if (opts == null) { + opts = Geth.newCallOpts(); + } + this.Contract.call(opts, results, "{{.Original.Name}}", args); + {{if gt (len .Normalized.Outputs) 1}} + {{capitalise .Normalized.Name}}Results result = new {{capitalise .Normalized.Name}}Results(); + {{range $index, $item := .Normalized.Outputs}}result.{{if ne .Name ""}}{{.Name}}{{else}}Return{{$index}}{{end}} = results.get({{$index}}).get{{namedtype (bindtype .Type $structs) .Type}}(); + {{end}} + return result; + {{else}}{{range .Normalized.Outputs}}return results.get(0).get{{namedtype (bindtype .Type $structs) .Type}}();{{end}} + {{end}} + } + {{end}} - return this.Contract.transact(opts, "{{.Original.Name}}" , args); - } + {{range .Transacts}} + // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}. + // + // Solidity: {{.Original.String}} + public Transaction {{.Normalized.Name}}(TransactOpts opts{{range .Normalized.Inputs}}, {{bindtype .Type $structs}} {{.Name}}{{end}}) throws Exception { + Interfaces args = Geth.newInterfaces({{(len .Normalized.Inputs)}}); + {{range $index, $item := .Normalized.Inputs}}Interface arg{{$index}} = Geth.newInterface();arg{{$index}}.set{{namedtype (bindtype .Type $structs) .Type}}({{.Name}});args.set({{$index}},arg{{$index}}); {{end}} + return this.Contract.transact(opts, "{{.Original.Name}}" , args); } + {{end}} +} {{end}} ` diff --git a/accounts/abi/bind/topics.go b/accounts/abi/bind/topics.go index 600dfcda9739..c7657b4a41a2 100644 --- a/accounts/abi/bind/topics.go +++ b/accounts/abi/bind/topics.go @@ -17,6 +17,7 @@ package bind import ( + "encoding/binary" "errors" "fmt" "math/big" @@ -83,8 +84,10 @@ func makeTopics(query ...[]interface{}) ([][]common.Hash, error) { val := reflect.ValueOf(rule) switch { + + // static byte array case val.Kind() == reflect.Array && reflect.TypeOf(rule).Elem().Kind() == reflect.Uint8: - reflect.Copy(reflect.ValueOf(topic[common.HashLength-val.Len():]), val) + reflect.Copy(reflect.ValueOf(topic[:val.Len()]), val) default: return nil, fmt.Errorf("unsupported indexed type: %T", rule) @@ -175,8 +178,10 @@ func parseTopics(out interface{}, fields abi.Arguments, topics []common.Hash) er default: // Ran out of custom types, try the crazies switch { + + // static byte array case arg.Type.T == abi.FixedBytesTy: - reflect.Copy(field, reflect.ValueOf(topics[0][common.HashLength-arg.Type.Size:])) + reflect.Copy(field, reflect.ValueOf(topics[0][:arg.Type.Size])) default: return fmt.Errorf("unsupported indexed type: %v", arg.Type) @@ -187,3 +192,50 @@ func parseTopics(out interface{}, fields abi.Arguments, topics []common.Hash) er } return nil } + +// parseTopicsIntoMap converts the indexed topic field-value pairs into map key-value pairs +func parseTopicsIntoMap(out map[string]interface{}, fields abi.Arguments, topics []common.Hash) error { + // Sanity check that the fields and topics match up + if len(fields) != len(topics) { + return errors.New("topic/field count mismatch") + } + // Iterate over all the fields and reconstruct them from topics + for _, arg := range fields { + if !arg.Indexed { + return errors.New("non-indexed field in topic reconstruction") + } + + switch arg.Type.T { + case abi.BoolTy: + out[arg.Name] = topics[0][common.HashLength-1] == 1 + case abi.IntTy, abi.UintTy: + num := new(big.Int).SetBytes(topics[0][:]) + out[arg.Name] = num + case abi.AddressTy: + var addr common.Address + copy(addr[:], topics[0][common.HashLength-common.AddressLength:]) + out[arg.Name] = addr + case abi.HashTy: + out[arg.Name] = topics[0] + case abi.FixedBytesTy: + out[arg.Name] = topics[0][:] + case abi.StringTy, abi.BytesTy, abi.SliceTy, abi.ArrayTy: + // Array types (including strings and bytes) have their keccak256 hashes stored in the topic- not a hash + // whose bytes can be decoded to the actual value- so the best we can do is retrieve that hash + out[arg.Name] = topics[0] + case abi.FunctionTy: + if garbage := binary.BigEndian.Uint64(topics[0][0:8]); garbage != 0 { + return fmt.Errorf("bind: got improperly encoded function type, got %v", topics[0].Bytes()) + } + var tmp [24]byte + copy(tmp[:], topics[0][8:32]) + out[arg.Name] = tmp + default: // Not handling tuples + return fmt.Errorf("unsupported indexed type: %v", arg.Type) + } + + topics = topics[1:] + } + + return nil +} diff --git a/accounts/abi/bind/topics_test.go b/accounts/abi/bind/topics_test.go new file mode 100644 index 000000000000..ac865e5b4de8 --- /dev/null +++ b/accounts/abi/bind/topics_test.go @@ -0,0 +1,103 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package bind + +import ( + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" +) + +func TestMakeTopics(t *testing.T) { + type args struct { + query [][]interface{} + } + tests := []struct { + name string + args args + want [][]common.Hash + wantErr bool + }{ + { + "support fixed byte types, right padded to 32 bytes", + args{[][]interface{}{{[5]byte{1, 2, 3, 4, 5}}}}, + [][]common.Hash{{common.Hash{1, 2, 3, 4, 5}}}, + false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := makeTopics(tt.args.query...) + if (err != nil) != tt.wantErr { + t.Errorf("makeTopics() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("makeTopics() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestParseTopics(t *testing.T) { + type bytesStruct struct { + StaticBytes [5]byte + } + bytesType, _ := abi.NewType("bytes5", nil) + type args struct { + createObj func() interface{} + resultObj func() interface{} + fields abi.Arguments + topics []common.Hash + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "support fixed byte types, right padded to 32 bytes", + args: args{ + createObj: func() interface{} { return &bytesStruct{} }, + resultObj: func() interface{} { return &bytesStruct{StaticBytes: [5]byte{1, 2, 3, 4, 5}} }, + fields: abi.Arguments{abi.Argument{ + Name: "staticBytes", + Type: bytesType, + Indexed: true, + }}, + topics: []common.Hash{ + {1, 2, 3, 4, 5}, + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + createObj := tt.args.createObj() + if err := parseTopics(createObj, tt.args.fields, tt.args.topics); (err != nil) != tt.wantErr { + t.Errorf("parseTopics() error = %v, wantErr %v", err, tt.wantErr) + } + resultObj := tt.args.resultObj() + if !reflect.DeepEqual(createObj, resultObj) { + t.Errorf("parseTopics() = %v, want %v", createObj, resultObj) + } + }) + } +} diff --git a/accounts/abi/bind/util_test.go b/accounts/abi/bind/util_test.go index 8f4092971f2f..87bc29822b3e 100644 --- a/accounts/abi/bind/util_test.go +++ b/accounts/abi/bind/util_test.go @@ -56,7 +56,8 @@ func TestWaitDeployed(t *testing.T) { backend := backends.NewSimulatedBackend( core.GenesisAlloc{ crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000)}, - }, 10000000, + }, + 10000000, ) // Create the transaction. diff --git a/accounts/abi/event.go b/accounts/abi/event.go index a3f6be97323e..9392c1990c3e 100644 --- a/accounts/abi/event.go +++ b/accounts/abi/event.go @@ -36,12 +36,12 @@ type Event struct { func (e Event) String() string { inputs := make([]string, len(e.Inputs)) for i, input := range e.Inputs { - inputs[i] = fmt.Sprintf("%v %v", input.Name, input.Type) + inputs[i] = fmt.Sprintf("%v %v", input.Type, input.Name) if input.Indexed { - inputs[i] = fmt.Sprintf("%v indexed %v", input.Name, input.Type) + inputs[i] = fmt.Sprintf("%v indexed %v", input.Type, input.Name) } } - return fmt.Sprintf("e %v(%v)", e.Name, strings.Join(inputs, ", ")) + return fmt.Sprintf("event %v(%v)", e.Name, strings.Join(inputs, ", ")) } // Id returns the canonical representation of the event's signature used by the diff --git a/accounts/abi/event_test.go b/accounts/abi/event_test.go index 3bfdd7c0abd5..e735cceb8884 100644 --- a/accounts/abi/event_test.go +++ b/accounts/abi/event_test.go @@ -87,12 +87,12 @@ func TestEventId(t *testing.T) { }{ { definition: `[ - { "type" : "event", "name" : "balance", "inputs": [{ "name" : "in", "type": "uint256" }] }, - { "type" : "event", "name" : "check", "inputs": [{ "name" : "t", "type": "address" }, { "name": "b", "type": "uint256" }] } + { "type" : "event", "name" : "Balance", "inputs": [{ "name" : "in", "type": "uint256" }] }, + { "type" : "event", "name" : "Check", "inputs": [{ "name" : "t", "type": "address" }, { "name": "b", "type": "uint256" }] } ]`, expectations: map[string]common.Hash{ - "balance": crypto.Keccak256Hash([]byte("balance(uint256)")), - "check": crypto.Keccak256Hash([]byte("check(address,uint256)")), + "Balance": crypto.Keccak256Hash([]byte("Balance(uint256)")), + "Check": crypto.Keccak256Hash([]byte("Check(address,uint256)")), }, }, } @@ -111,6 +111,39 @@ func TestEventId(t *testing.T) { } } +func TestEventString(t *testing.T) { + var table = []struct { + definition string + expectations map[string]string + }{ + { + definition: `[ + { "type" : "event", "name" : "Balance", "inputs": [{ "name" : "in", "type": "uint256" }] }, + { "type" : "event", "name" : "Check", "inputs": [{ "name" : "t", "type": "address" }, { "name": "b", "type": "uint256" }] }, + { "type" : "event", "name" : "Transfer", "inputs": [{ "name": "from", "type": "address", "indexed": true }, { "name": "to", "type": "address", "indexed": true }, { "name": "value", "type": "uint256" }] } + ]`, + expectations: map[string]string{ + "Balance": "event Balance(uint256 in)", + "Check": "event Check(address t, uint256 b)", + "Transfer": "event Transfer(address indexed from, address indexed to, uint256 value)", + }, + }, + } + + for _, test := range table { + abi, err := JSON(strings.NewReader(test.definition)) + if err != nil { + t.Fatal(err) + } + + for name, event := range abi.Events { + if event.String() != test.expectations[name] { + t.Errorf("expected string to be %s, got %s", test.expectations[name], event.String()) + } + } + } +} + // TestEventMultiValueWithArrayUnpack verifies that array fields will be counted after parsing array. func TestEventMultiValueWithArrayUnpack(t *testing.T) { definition := `[{"name": "test", "type": "event", "inputs": [{"indexed": false, "name":"value1", "type":"uint8[2]"},{"indexed": false, "name":"value2", "type":"uint8"}]}]` diff --git a/accounts/abi/method.go b/accounts/abi/method.go index 5831057652b6..d3c02599f20f 100644 --- a/accounts/abi/method.go +++ b/accounts/abi/method.go @@ -27,9 +27,9 @@ import ( // If the method is `Const` no transaction needs to be created for this // particular Method call. It can easily be simulated using a local VM. // For example a `Balance()` method only needs to retrieve something -// from the storage and therefor requires no Tx to be send to the +// from the storage and therefore requires no Tx to be send to the // network. A method such as `Transact` does require a Tx and thus will -// be flagged `true`. +// be flagged `false`. // Input specifies the required input parameters for this gives method. type Method struct { Name string @@ -56,14 +56,14 @@ func (method Method) Sig() string { func (method Method) String() string { inputs := make([]string, len(method.Inputs)) for i, input := range method.Inputs { - inputs[i] = fmt.Sprintf("%v %v", input.Name, input.Type) + inputs[i] = fmt.Sprintf("%v %v", input.Type, input.Name) } outputs := make([]string, len(method.Outputs)) for i, output := range method.Outputs { + outputs[i] = output.Type.String() if len(output.Name) > 0 { - outputs[i] = fmt.Sprintf("%v ", output.Name) + outputs[i] += fmt.Sprintf(" %v", output.Name) } - outputs[i] += output.Type.String() } constant := "" if method.Const { diff --git a/accounts/abi/method_test.go b/accounts/abi/method_test.go new file mode 100644 index 000000000000..3ffdb702b35b --- /dev/null +++ b/accounts/abi/method_test.go @@ -0,0 +1,128 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package abi + +import ( + "strings" + "testing" +) + +const methoddata = ` +[ + {"type": "function", "name": "balance", "constant": true }, + {"type": "function", "name": "send", "constant": false, "inputs": [{ "name": "amount", "type": "uint256" }]}, + {"type": "function", "name": "transfer", "constant": false, "inputs": [{"name": "from", "type": "address"}, {"name": "to", "type": "address"}, {"name": "value", "type": "uint256"}], "outputs": [{"name": "success", "type": "bool"}]}, + {"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple"}],"name":"tuple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}, + {"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple[]"}],"name":"tupleSlice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}, + {"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple[5]"}],"name":"tupleArray","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}, + {"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple[5][]"}],"name":"complexTuple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"} +]` + +func TestMethodString(t *testing.T) { + var table = []struct { + method string + expectation string + }{ + { + method: "balance", + expectation: "function balance() constant returns()", + }, + { + method: "send", + expectation: "function send(uint256 amount) returns()", + }, + { + method: "transfer", + expectation: "function transfer(address from, address to, uint256 value) returns(bool success)", + }, + { + method: "tuple", + expectation: "function tuple((uint256,uint256) a) returns()", + }, + { + method: "tupleArray", + expectation: "function tupleArray((uint256,uint256)[5] a) returns()", + }, + { + method: "tupleSlice", + expectation: "function tupleSlice((uint256,uint256)[] a) returns()", + }, + { + method: "complexTuple", + expectation: "function complexTuple((uint256,uint256)[5][] a) returns()", + }, + } + + abi, err := JSON(strings.NewReader(methoddata)) + if err != nil { + t.Fatal(err) + } + + for _, test := range table { + got := abi.Methods[test.method].String() + if got != test.expectation { + t.Errorf("expected string to be %s, got %s", test.expectation, got) + } + } +} + +func TestMethodSig(t *testing.T) { + var cases = []struct { + method string + expect string + }{ + { + method: "balance", + expect: "balance()", + }, + { + method: "send", + expect: "send(uint256)", + }, + { + method: "transfer", + expect: "transfer(address,address,uint256)", + }, + { + method: "tuple", + expect: "tuple((uint256,uint256))", + }, + { + method: "tupleArray", + expect: "tupleArray((uint256,uint256)[5])", + }, + { + method: "tupleSlice", + expect: "tupleSlice((uint256,uint256)[])", + }, + { + method: "complexTuple", + expect: "complexTuple((uint256,uint256)[5][])", + }, + } + abi, err := JSON(strings.NewReader(methoddata)) + if err != nil { + t.Fatal(err) + } + + for _, test := range cases { + got := abi.Methods[test.method].Sig() + if got != test.expect { + t.Errorf("expected string to be %s, got %s", test.expect, got) + } + } +} diff --git a/accounts/abi/pack_test.go b/accounts/abi/pack_test.go index 58a5b7a581e2..10cd3a396274 100644 --- a/accounts/abi/pack_test.go +++ b/accounts/abi/pack_test.go @@ -29,314 +29,601 @@ import ( func TestPack(t *testing.T) { for i, test := range []struct { - typ string - - input interface{} - output []byte + typ string + components []ArgumentMarshaling + input interface{} + output []byte }{ { "uint8", + nil, uint8(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "uint8[]", + nil, []uint8{1, 2}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "uint16", + nil, uint16(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "uint16[]", + nil, []uint16{1, 2}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "uint32", + nil, uint32(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "uint32[]", + nil, []uint32{1, 2}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "uint64", + nil, uint64(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "uint64[]", + nil, []uint64{1, 2}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "uint256", + nil, big.NewInt(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "uint256[]", + nil, []*big.Int{big.NewInt(1), big.NewInt(2)}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "int8", + nil, int8(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "int8[]", + nil, []int8{1, 2}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "int16", + nil, int16(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "int16[]", + nil, []int16{1, 2}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "int32", + nil, int32(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "int32[]", + nil, []int32{1, 2}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "int64", + nil, int64(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "int64[]", + nil, []int64{1, 2}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "int256", + nil, big.NewInt(2), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"), }, { "int256[]", + nil, []*big.Int{big.NewInt(1), big.NewInt(2)}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"), }, { "bytes1", + nil, [1]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes2", + nil, [2]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes3", + nil, [3]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes4", + nil, [4]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes5", + nil, [5]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes6", + nil, [6]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes7", + nil, [7]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes8", + nil, [8]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes9", + nil, [9]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes10", + nil, [10]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes11", + nil, [11]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes12", + nil, [12]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes13", + nil, [13]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes14", + nil, [14]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes15", + nil, [15]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes16", + nil, [16]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes17", + nil, [17]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes18", + nil, [18]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes19", + nil, [19]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes20", + nil, [20]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes21", + nil, [21]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes22", + nil, [22]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes23", + nil, [23]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes24", - [24]byte{1}, - common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), - }, - { - "bytes24", + nil, [24]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes25", + nil, [25]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes26", + nil, [26]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes27", + nil, [27]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes28", + nil, [28]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes29", + nil, [29]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes30", + nil, [30]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes31", + nil, [31]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "bytes32", + nil, [32]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "uint32[2][3][4]", + nil, [4][3][2]uint32{{{1, 2}, {3, 4}, {5, 6}}, {{7, 8}, {9, 10}, {11, 12}}, {{13, 14}, {15, 16}, {17, 18}}, {{19, 20}, {21, 22}, {23, 24}}}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000018"), }, { "address[]", + nil, []common.Address{{1}, {2}}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000"), }, { "bytes32[]", + nil, []common.Hash{{1}, {2}}, common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000201000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000"), }, { "function", + nil, [24]byte{1}, common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), }, { "string", + nil, "foobar", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000006666f6f6261720000000000000000000000000000000000000000000000000000"), }, + { + "string[]", + nil, + []string{"hello", "foobar"}, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002" + // len(array) = 2 + "0000000000000000000000000000000000000000000000000000000000000040" + // offset 64 to i = 0 + "0000000000000000000000000000000000000000000000000000000000000080" + // offset 128 to i = 1 + "0000000000000000000000000000000000000000000000000000000000000005" + // len(str[0]) = 5 + "68656c6c6f000000000000000000000000000000000000000000000000000000" + // str[0] + "0000000000000000000000000000000000000000000000000000000000000006" + // len(str[1]) = 6 + "666f6f6261720000000000000000000000000000000000000000000000000000"), // str[1] + }, + { + "string[2]", + nil, + []string{"hello", "foobar"}, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + // offset to i = 0 + "0000000000000000000000000000000000000000000000000000000000000080" + // offset to i = 1 + "0000000000000000000000000000000000000000000000000000000000000005" + // len(str[0]) = 5 + "68656c6c6f000000000000000000000000000000000000000000000000000000" + // str[0] + "0000000000000000000000000000000000000000000000000000000000000006" + // len(str[1]) = 6 + "666f6f6261720000000000000000000000000000000000000000000000000000"), // str[1] + }, + { + "bytes32[][]", + nil, + [][]common.Hash{{{1}, {2}}, {{3}, {4}, {5}}}, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002" + // len(array) = 2 + "0000000000000000000000000000000000000000000000000000000000000040" + // offset 64 to i = 0 + "00000000000000000000000000000000000000000000000000000000000000a0" + // offset 160 to i = 1 + "0000000000000000000000000000000000000000000000000000000000000002" + // len(array[0]) = 2 + "0100000000000000000000000000000000000000000000000000000000000000" + // array[0][0] + "0200000000000000000000000000000000000000000000000000000000000000" + // array[0][1] + "0000000000000000000000000000000000000000000000000000000000000003" + // len(array[1]) = 3 + "0300000000000000000000000000000000000000000000000000000000000000" + // array[1][0] + "0400000000000000000000000000000000000000000000000000000000000000" + // array[1][1] + "0500000000000000000000000000000000000000000000000000000000000000"), // array[1][2] + }, + + { + "bytes32[][2]", + nil, + [][]common.Hash{{{1}, {2}}, {{3}, {4}, {5}}}, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + // offset 64 to i = 0 + "00000000000000000000000000000000000000000000000000000000000000a0" + // offset 160 to i = 1 + "0000000000000000000000000000000000000000000000000000000000000002" + // len(array[0]) = 2 + "0100000000000000000000000000000000000000000000000000000000000000" + // array[0][0] + "0200000000000000000000000000000000000000000000000000000000000000" + // array[0][1] + "0000000000000000000000000000000000000000000000000000000000000003" + // len(array[1]) = 3 + "0300000000000000000000000000000000000000000000000000000000000000" + // array[1][0] + "0400000000000000000000000000000000000000000000000000000000000000" + // array[1][1] + "0500000000000000000000000000000000000000000000000000000000000000"), // array[1][2] + }, + + { + "bytes32[3][2]", + nil, + [][]common.Hash{{{1}, {2}, {3}}, {{3}, {4}, {5}}}, + common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000" + // array[0][0] + "0200000000000000000000000000000000000000000000000000000000000000" + // array[0][1] + "0300000000000000000000000000000000000000000000000000000000000000" + // array[0][2] + "0300000000000000000000000000000000000000000000000000000000000000" + // array[1][0] + "0400000000000000000000000000000000000000000000000000000000000000" + // array[1][1] + "0500000000000000000000000000000000000000000000000000000000000000"), // array[1][2] + }, + { + // static tuple + "tuple", + []ArgumentMarshaling{ + {Name: "a", Type: "int64"}, + {Name: "b", Type: "int256"}, + {Name: "c", Type: "int256"}, + {Name: "d", Type: "bool"}, + {Name: "e", Type: "bytes32[3][2]"}, + }, + struct { + A int64 + B *big.Int + C *big.Int + D bool + E [][]common.Hash + }{1, big.NewInt(1), big.NewInt(-1), true, [][]common.Hash{{{1}, {2}, {3}}, {{3}, {4}, {5}}}}, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001" + // struct[a] + "0000000000000000000000000000000000000000000000000000000000000001" + // struct[b] + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // struct[c] + "0000000000000000000000000000000000000000000000000000000000000001" + // struct[d] + "0100000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[0][0] + "0200000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[0][1] + "0300000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[0][2] + "0300000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[1][0] + "0400000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[1][1] + "0500000000000000000000000000000000000000000000000000000000000000"), // struct[e] array[1][2] + }, + { + // dynamic tuple + "tuple", + []ArgumentMarshaling{ + {Name: "a", Type: "string"}, + {Name: "b", Type: "int64"}, + {Name: "c", Type: "bytes"}, + {Name: "d", Type: "string[]"}, + {Name: "e", Type: "int256[]"}, + {Name: "f", Type: "address[]"}, + }, + struct { + FieldA string `abi:"a"` // Test whether abi tag works + FieldB int64 `abi:"b"` + C []byte + D []string + E []*big.Int + F []common.Address + }{"foobar", 1, []byte{1}, []string{"foo", "bar"}, []*big.Int{big.NewInt(1), big.NewInt(-1)}, []common.Address{{1}, {2}}}, + common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000000000c0" + // struct[a] offset + "0000000000000000000000000000000000000000000000000000000000000001" + // struct[b] + "0000000000000000000000000000000000000000000000000000000000000100" + // struct[c] offset + "0000000000000000000000000000000000000000000000000000000000000140" + // struct[d] offset + "0000000000000000000000000000000000000000000000000000000000000220" + // struct[e] offset + "0000000000000000000000000000000000000000000000000000000000000280" + // struct[f] offset + "0000000000000000000000000000000000000000000000000000000000000006" + // struct[a] length + "666f6f6261720000000000000000000000000000000000000000000000000000" + // struct[a] "foobar" + "0000000000000000000000000000000000000000000000000000000000000001" + // struct[c] length + "0100000000000000000000000000000000000000000000000000000000000000" + // []byte{1} + "0000000000000000000000000000000000000000000000000000000000000002" + // struct[d] length + "0000000000000000000000000000000000000000000000000000000000000040" + // foo offset + "0000000000000000000000000000000000000000000000000000000000000080" + // bar offset + "0000000000000000000000000000000000000000000000000000000000000003" + // foo length + "666f6f0000000000000000000000000000000000000000000000000000000000" + // foo + "0000000000000000000000000000000000000000000000000000000000000003" + // bar offset + "6261720000000000000000000000000000000000000000000000000000000000" + // bar + "0000000000000000000000000000000000000000000000000000000000000002" + // struct[e] length + "0000000000000000000000000000000000000000000000000000000000000001" + // 1 + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // -1 + "0000000000000000000000000000000000000000000000000000000000000002" + // struct[f] length + "0000000000000000000000000100000000000000000000000000000000000000" + // common.Address{1} + "0000000000000000000000000200000000000000000000000000000000000000"), // common.Address{2} + }, + { + // nested tuple + "tuple", + []ArgumentMarshaling{ + {Name: "a", Type: "tuple", Components: []ArgumentMarshaling{{Name: "a", Type: "uint256"}, {Name: "b", Type: "uint256[]"}}}, + {Name: "b", Type: "int256[]"}, + }, + struct { + A struct { + FieldA *big.Int `abi:"a"` + B []*big.Int + } + B []*big.Int + }{ + A: struct { + FieldA *big.Int `abi:"a"` // Test whether abi tag works for nested tuple + B []*big.Int + }{big.NewInt(1), []*big.Int{big.NewInt(1), big.NewInt(0)}}, + B: []*big.Int{big.NewInt(1), big.NewInt(0)}}, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + // a offset + "00000000000000000000000000000000000000000000000000000000000000e0" + // b offset + "0000000000000000000000000000000000000000000000000000000000000001" + // a.a value + "0000000000000000000000000000000000000000000000000000000000000040" + // a.b offset + "0000000000000000000000000000000000000000000000000000000000000002" + // a.b length + "0000000000000000000000000000000000000000000000000000000000000001" + // a.b[0] value + "0000000000000000000000000000000000000000000000000000000000000000" + // a.b[1] value + "0000000000000000000000000000000000000000000000000000000000000002" + // b length + "0000000000000000000000000000000000000000000000000000000000000001" + // b[0] value + "0000000000000000000000000000000000000000000000000000000000000000"), // b[1] value + }, + { + // tuple slice + "tuple[]", + []ArgumentMarshaling{ + {Name: "a", Type: "int256"}, + {Name: "b", Type: "int256[]"}, + }, + []struct { + A *big.Int + B []*big.Int + }{ + {big.NewInt(-1), []*big.Int{big.NewInt(1), big.NewInt(0)}}, + {big.NewInt(1), []*big.Int{big.NewInt(2), big.NewInt(-1)}}, + }, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002" + // tuple length + "0000000000000000000000000000000000000000000000000000000000000040" + // tuple[0] offset + "00000000000000000000000000000000000000000000000000000000000000e0" + // tuple[1] offset + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // tuple[0].A + "0000000000000000000000000000000000000000000000000000000000000040" + // tuple[0].B offset + "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[0].B length + "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[0].B[0] value + "0000000000000000000000000000000000000000000000000000000000000000" + // tuple[0].B[1] value + "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[1].A + "0000000000000000000000000000000000000000000000000000000000000040" + // tuple[1].B offset + "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[1].B length + "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[1].B[0] value + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), // tuple[1].B[1] value + }, + { + // static tuple array + "tuple[2]", + []ArgumentMarshaling{ + {Name: "a", Type: "int256"}, + {Name: "b", Type: "int256"}, + }, + [2]struct { + A *big.Int + B *big.Int + }{ + {big.NewInt(-1), big.NewInt(1)}, + {big.NewInt(1), big.NewInt(-1)}, + }, + common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // tuple[0].a + "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[0].b + "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[1].a + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), // tuple[1].b + }, + { + // dynamic tuple array + "tuple[2]", + []ArgumentMarshaling{ + {Name: "a", Type: "int256[]"}, + }, + [2]struct { + A []*big.Int + }{ + {[]*big.Int{big.NewInt(-1), big.NewInt(1)}}, + {[]*big.Int{big.NewInt(1), big.NewInt(-1)}}, + }, + common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + // tuple[0] offset + "00000000000000000000000000000000000000000000000000000000000000c0" + // tuple[1] offset + "0000000000000000000000000000000000000000000000000000000000000020" + // tuple[0].A offset + "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[0].A length + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // tuple[0].A[0] + "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[0].A[1] + "0000000000000000000000000000000000000000000000000000000000000020" + // tuple[1].A offset + "0000000000000000000000000000000000000000000000000000000000000002" + // tuple[1].A length + "0000000000000000000000000000000000000000000000000000000000000001" + // tuple[1].A[0] + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), // tuple[1].A[1] + }, } { - typ, err := NewType(test.typ) + typ, err := NewType(test.typ, test.components) if err != nil { t.Fatalf("%v failed. Unexpected parse error: %v", i, err) } - output, err := typ.pack(reflect.ValueOf(test.input)) if err != nil { t.Fatalf("%v failed. Unexpected pack error: %v", i, err) } if !bytes.Equal(output, test.output) { - t.Errorf("%d failed. Expected bytes: '%x' Got: '%x'", i, test.output, output) + t.Errorf("input %d for typ: %v failed. Expected bytes: '%x' Got: '%x'", i, typ.String(), test.output, output) } } } @@ -406,6 +693,59 @@ func TestMethodPack(t *testing.T) { if !bytes.Equal(packed, sig) { t.Errorf("expected %x got %x", sig, packed) } + + a := [2][2]*big.Int{{big.NewInt(1), big.NewInt(1)}, {big.NewInt(2), big.NewInt(0)}} + sig = abi.Methods["nestedArray"].Id() + sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{0}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{0xa0}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) + sig = append(sig, common.LeftPadBytes(addrC[:], 32)...) + sig = append(sig, common.LeftPadBytes(addrD[:], 32)...) + packed, err = abi.Pack("nestedArray", a, []common.Address{addrC, addrD}) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(packed, sig) { + t.Errorf("expected %x got %x", sig, packed) + } + + sig = abi.Methods["nestedArray2"].Id() + sig = append(sig, common.LeftPadBytes([]byte{0x20}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{0x40}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{0x80}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) + packed, err = abi.Pack("nestedArray2", [2][]uint8{{1}, {1}}) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(packed, sig) { + t.Errorf("expected %x got %x", sig, packed) + } + + sig = abi.Methods["nestedSlice"].Id() + sig = append(sig, common.LeftPadBytes([]byte{0x20}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{0x02}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{0x40}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{0xa0}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) + sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) + packed, err = abi.Pack("nestedSlice", [][]uint8{{1, 2}, {1, 2}}) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(packed, sig) { + t.Errorf("expected %x got %x", sig, packed) + } } func TestPackNumber(t *testing.T) { diff --git a/accounts/abi/reflect.go b/accounts/abi/reflect.go index 0193517a424f..73ca8fa2bd7d 100644 --- a/accounts/abi/reflect.go +++ b/accounts/abi/reflect.go @@ -31,6 +31,14 @@ func indirect(v reflect.Value) reflect.Value { return v } +// indirectInterfaceOrPtr recursively dereferences the value until value is not interface. +func indirectInterfaceOrPtr(v reflect.Value) reflect.Value { + if (v.Kind() == reflect.Interface || v.Kind() == reflect.Ptr) && v.Elem().IsValid() { + return indirect(v.Elem()) + } + return v +} + // reflectIntKind returns the reflect using the given size and // unsignedness. func reflectIntKindAndType(unsigned bool, size int) (reflect.Kind, reflect.Type) { @@ -71,22 +79,36 @@ func mustArrayToByteSlice(value reflect.Value) reflect.Value { // // set is a bit more lenient when it comes to assignment and doesn't force an as // strict ruleset as bare `reflect` does. -func set(dst, src reflect.Value, output Argument) error { - dstType := dst.Type() - srcType := src.Type() +func set(dst, src reflect.Value) error { + dstType, srcType := dst.Type(), src.Type() switch { - case dstType.AssignableTo(srcType): + case dstType.Kind() == reflect.Interface && dst.Elem().IsValid(): + return set(dst.Elem(), src) + case dstType.Kind() == reflect.Ptr && dstType.Elem() != derefbigT: + return set(dst.Elem(), src) + case srcType.AssignableTo(dstType) && dst.CanSet(): dst.Set(src) - case dstType.Kind() == reflect.Interface: - dst.Set(src) - case dstType.Kind() == reflect.Ptr: - return set(dst.Elem(), src, output) + case dstType.Kind() == reflect.Slice && srcType.Kind() == reflect.Slice: + return setSlice(dst, src) default: return fmt.Errorf("abi: cannot unmarshal %v in to %v", src.Type(), dst.Type()) } return nil } +// setSlice attempts to assign src to dst when slices are not assignable by default +// e.g. src: [][]byte -> dst: [][15]byte +func setSlice(dst, src reflect.Value) error { + slice := reflect.MakeSlice(dst.Type(), src.Len(), src.Len()) + for i := 0; i < src.Len(); i++ { + v := src.Index(i) + reflect.Copy(slice.Index(i), v) + } + + dst.Set(slice) + return nil +} + // requireAssignable assures that `dest` is a pointer and it's not an interface. func requireAssignable(dst, src reflect.Value) error { if dst.Kind() != reflect.Ptr && dst.Kind() != reflect.Interface { @@ -112,14 +134,14 @@ func requireUnpackKind(v reflect.Value, t reflect.Type, k reflect.Kind, return nil } -// mapAbiToStringField maps abi to struct fields. +// mapArgNamesToStructFields maps a slice of argument names to struct fields. // first round: for each Exportable field that contains a `abi:""` tag -// and this field name exists in the arguments, pair them together. -// second round: for each argument field that has not been already linked, +// and this field name exists in the given argument name list, pair them together. +// second round: for each argument name that has not been already linked, // find what variable is expected to be mapped into, if it exists and has not been // used, pair them. -func mapAbiToStructFields(args Arguments, value reflect.Value) (map[string]string, error) { - +// Note this function assumes the given value is a struct value. +func mapArgNamesToStructFields(argNames []string, value reflect.Value) (map[string]string, error) { typ := value.Type() abi2struct := make(map[string]string) @@ -133,45 +155,39 @@ func mapAbiToStructFields(args Arguments, value reflect.Value) (map[string]strin if structFieldName[:1] != strings.ToUpper(structFieldName[:1]) { continue } - // skip fields that have no abi:"" tag. var ok bool var tagName string if tagName, ok = typ.Field(i).Tag.Lookup("abi"); !ok { continue } - // check if tag is empty. if tagName == "" { return nil, fmt.Errorf("struct: abi tag in '%s' is empty", structFieldName) } - // check which argument field matches with the abi tag. found := false - for _, abiField := range args.NonIndexed() { - if abiField.Name == tagName { - if abi2struct[abiField.Name] != "" { + for _, arg := range argNames { + if arg == tagName { + if abi2struct[arg] != "" { return nil, fmt.Errorf("struct: abi tag in '%s' already mapped", structFieldName) } // pair them - abi2struct[abiField.Name] = structFieldName - struct2abi[structFieldName] = abiField.Name + abi2struct[arg] = structFieldName + struct2abi[structFieldName] = arg found = true } } - // check if this tag has been mapped. if !found { return nil, fmt.Errorf("struct: abi tag '%s' defined but not found in abi", tagName) } - } // second round ~~~ - for _, arg := range args { + for _, argName := range argNames { - abiFieldName := arg.Name - structFieldName := capitalise(abiFieldName) + structFieldName := ToCamelCase(argName) if structFieldName == "" { return nil, fmt.Errorf("abi: purely underscored output cannot unpack to struct") @@ -181,11 +197,11 @@ func mapAbiToStructFields(args Arguments, value reflect.Value) (map[string]strin // struct field with the same field name. If so, raise an error: // abi: [ { "name": "value" } ] // struct { Value *big.Int , Value1 *big.Int `abi:"value"`} - if abi2struct[abiFieldName] != "" { - if abi2struct[abiFieldName] != structFieldName && + if abi2struct[argName] != "" { + if abi2struct[argName] != structFieldName && struct2abi[structFieldName] == "" && value.FieldByName(structFieldName).IsValid() { - return nil, fmt.Errorf("abi: multiple variables maps to the same abi field '%s'", abiFieldName) + return nil, fmt.Errorf("abi: multiple variables maps to the same abi field '%s'", argName) } continue } @@ -197,16 +213,14 @@ func mapAbiToStructFields(args Arguments, value reflect.Value) (map[string]strin if value.FieldByName(structFieldName).IsValid() { // pair them - abi2struct[abiFieldName] = structFieldName - struct2abi[structFieldName] = abiFieldName + abi2struct[argName] = structFieldName + struct2abi[structFieldName] = argName } else { // not paired, but annotate as used, to detect cases like // abi : [ { "name": "value" }, { "name": "_value" } ] // struct { Value *big.Int } - struct2abi[structFieldName] = abiFieldName + struct2abi[structFieldName] = argName } - } - return abi2struct, nil } diff --git a/accounts/abi/reflect_test.go b/accounts/abi/reflect_test.go new file mode 100644 index 000000000000..c425e6e54bff --- /dev/null +++ b/accounts/abi/reflect_test.go @@ -0,0 +1,191 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package abi + +import ( + "reflect" + "testing" +) + +type reflectTest struct { + name string + args []string + struc interface{} + want map[string]string + err string +} + +var reflectTests = []reflectTest{ + { + name: "OneToOneCorrespondance", + args: []string{"fieldA"}, + struc: struct { + FieldA int `abi:"fieldA"` + }{}, + want: map[string]string{ + "fieldA": "FieldA", + }, + }, + { + name: "MissingFieldsInStruct", + args: []string{"fieldA", "fieldB"}, + struc: struct { + FieldA int `abi:"fieldA"` + }{}, + want: map[string]string{ + "fieldA": "FieldA", + }, + }, + { + name: "MoreFieldsInStructThanArgs", + args: []string{"fieldA"}, + struc: struct { + FieldA int `abi:"fieldA"` + FieldB int + }{}, + want: map[string]string{ + "fieldA": "FieldA", + }, + }, + { + name: "MissingFieldInArgs", + args: []string{"fieldA"}, + struc: struct { + FieldA int `abi:"fieldA"` + FieldB int `abi:"fieldB"` + }{}, + err: "struct: abi tag 'fieldB' defined but not found in abi", + }, + { + name: "NoAbiDescriptor", + args: []string{"fieldA"}, + struc: struct { + FieldA int + }{}, + want: map[string]string{ + "fieldA": "FieldA", + }, + }, + { + name: "NoArgs", + args: []string{}, + struc: struct { + FieldA int `abi:"fieldA"` + }{}, + err: "struct: abi tag 'fieldA' defined but not found in abi", + }, + { + name: "DifferentName", + args: []string{"fieldB"}, + struc: struct { + FieldA int `abi:"fieldB"` + }{}, + want: map[string]string{ + "fieldB": "FieldA", + }, + }, + { + name: "DifferentName", + args: []string{"fieldB"}, + struc: struct { + FieldA int `abi:"fieldB"` + }{}, + want: map[string]string{ + "fieldB": "FieldA", + }, + }, + { + name: "MultipleFields", + args: []string{"fieldA", "fieldB"}, + struc: struct { + FieldA int `abi:"fieldA"` + FieldB int `abi:"fieldB"` + }{}, + want: map[string]string{ + "fieldA": "FieldA", + "fieldB": "FieldB", + }, + }, + { + name: "MultipleFieldsABIMissing", + args: []string{"fieldA", "fieldB"}, + struc: struct { + FieldA int `abi:"fieldA"` + FieldB int + }{}, + want: map[string]string{ + "fieldA": "FieldA", + "fieldB": "FieldB", + }, + }, + { + name: "NameConflict", + args: []string{"fieldB"}, + struc: struct { + FieldA int `abi:"fieldB"` + FieldB int + }{}, + err: "abi: multiple variables maps to the same abi field 'fieldB'", + }, + { + name: "Underscored", + args: []string{"_"}, + struc: struct { + FieldA int + }{}, + err: "abi: purely underscored output cannot unpack to struct", + }, + { + name: "DoubleMapping", + args: []string{"fieldB", "fieldC", "fieldA"}, + struc: struct { + FieldA int `abi:"fieldC"` + FieldB int + }{}, + err: "abi: multiple outputs mapping to the same struct field 'FieldA'", + }, + { + name: "AlreadyMapped", + args: []string{"fieldB", "fieldB"}, + struc: struct { + FieldB int `abi:"fieldB"` + }{}, + err: "struct: abi tag in 'FieldB' already mapped", + }, +} + +func TestReflectNameToStruct(t *testing.T) { + for _, test := range reflectTests { + t.Run(test.name, func(t *testing.T) { + m, err := mapArgNamesToStructFields(test.args, reflect.ValueOf(test.struc)) + if len(test.err) > 0 { + if err == nil || err.Error() != test.err { + t.Fatalf("Invalid error: expected %v, got %v", test.err, err) + } + } else { + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + for fname := range test.want { + if m[fname] != test.want[fname] { + t.Fatalf("Incorrect value for field %s: expected %v, got %v", fname, test.want[fname], m[fname]) + } + } + } + }) + } +} diff --git a/accounts/abi/type.go b/accounts/abi/type.go index dce89d2b4ee4..597d314392e5 100644 --- a/accounts/abi/type.go +++ b/accounts/abi/type.go @@ -17,6 +17,7 @@ package abi import ( + "errors" "fmt" "reflect" "regexp" @@ -32,6 +33,7 @@ const ( StringTy SliceTy ArrayTy + TupleTy AddressTy FixedBytesTy BytesTy @@ -43,13 +45,16 @@ const ( // Type is the reflection of the supported argument type type Type struct { Elem *Type - Kind reflect.Kind Type reflect.Type Size int T byte // Our own type checking stringKind string // holds the unparsed string for deriving signatures + + // Tuple relative fields + TupleElems []*Type // Type information of all tuple fields + TupleRawNames []string // Raw field name of all tuple fields } var ( @@ -58,12 +63,11 @@ var ( ) // NewType creates a new reflection type of abi type given in t. -func NewType(t string) (typ Type, err error) { +func NewType(t string, components []ArgumentMarshaling) (typ Type, err error) { // check that array brackets are equal if they exist if strings.Count(t, "[") != strings.Count(t, "]") { return Type{}, fmt.Errorf("invalid arg type in abi") } - typ.stringKind = t // if there are brackets, get ready to go into slice/array mode and @@ -71,7 +75,7 @@ func NewType(t string) (typ Type, err error) { if strings.Count(t, "[") != 0 { i := strings.LastIndex(t, "[") // recursively embed the type - embeddedType, err := NewType(t[:i]) + embeddedType, err := NewType(t[:i], components) if err != nil { return Type{}, err } @@ -87,6 +91,7 @@ func NewType(t string) (typ Type, err error) { typ.Kind = reflect.Slice typ.Elem = &embeddedType typ.Type = reflect.SliceOf(embeddedType.Type) + typ.stringKind = embeddedType.stringKind + sliced } else if len(intz) == 1 { // is a array typ.T = ArrayTy @@ -97,6 +102,7 @@ func NewType(t string) (typ Type, err error) { return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err) } typ.Type = reflect.ArrayOf(typ.Size, embeddedType.Type) + typ.stringKind = embeddedType.stringKind + sliced } else { return Type{}, fmt.Errorf("invalid formatting of array type") } @@ -158,6 +164,41 @@ func NewType(t string) (typ Type, err error) { typ.Size = varSize typ.Type = reflect.ArrayOf(varSize, reflect.TypeOf(byte(0))) } + case "tuple": + var ( + fields []reflect.StructField + elems []*Type + names []string + expression string // canonical parameter expression + ) + expression += "(" + for idx, c := range components { + cType, err := NewType(c.Type, c.Components) + if err != nil { + return Type{}, err + } + if ToCamelCase(c.Name) == "" { + return Type{}, errors.New("abi: purely anonymous or underscored field is not supported") + } + fields = append(fields, reflect.StructField{ + Name: ToCamelCase(c.Name), // reflect.StructOf will panic for any exported field. + Type: cType.Type, + Tag: reflect.StructTag("json:\"" + c.Name + "\""), + }) + elems = append(elems, &cType) + names = append(names, c.Name) + expression += cType.stringKind + if idx != len(components)-1 { + expression += "," + } + } + expression += ")" + typ.Kind = reflect.Struct + typ.Type = reflect.StructOf(fields) + typ.TupleElems = elems + typ.TupleRawNames = names + typ.T = TupleTy + typ.stringKind = expression case "function": typ.Kind = reflect.Array typ.T = FunctionTy @@ -178,28 +219,82 @@ func (t Type) String() (out string) { func (t Type) pack(v reflect.Value) ([]byte, error) { // dereference pointer first if it's a pointer v = indirect(v) - if err := typeCheck(t, v); err != nil { return nil, err } - if t.T == SliceTy || t.T == ArrayTy { - var packed []byte + switch t.T { + case SliceTy, ArrayTy: + var ret []byte + if t.requiresLengthPrefix() { + // append length + ret = append(ret, packNum(reflect.ValueOf(v.Len()))...) + } + + // calculate offset if any + offset := 0 + offsetReq := isDynamicType(*t.Elem) + if offsetReq { + offset = getTypeSize(*t.Elem) * v.Len() + } + var tail []byte for i := 0; i < v.Len(); i++ { val, err := t.Elem.pack(v.Index(i)) if err != nil { return nil, err } - packed = append(packed, val...) + if !offsetReq { + ret = append(ret, val...) + continue + } + ret = append(ret, packNum(reflect.ValueOf(offset))...) + offset += len(val) + tail = append(tail, val...) } - if t.T == SliceTy { - return packBytesSlice(packed, v.Len()), nil - } else if t.T == ArrayTy { - return packed, nil + return append(ret, tail...), nil + case TupleTy: + // (T1,...,Tk) for k >= 0 and any types T1, …, Tk + // enc(X) = head(X(1)) ... head(X(k)) tail(X(1)) ... tail(X(k)) + // where X = (X(1), ..., X(k)) and head and tail are defined for Ti being a static + // type as + // head(X(i)) = enc(X(i)) and tail(X(i)) = "" (the empty string) + // and as + // head(X(i)) = enc(len(head(X(1)) ... head(X(k)) tail(X(1)) ... tail(X(i-1)))) + // tail(X(i)) = enc(X(i)) + // otherwise, i.e. if Ti is a dynamic type. + fieldmap, err := mapArgNamesToStructFields(t.TupleRawNames, v) + if err != nil { + return nil, err + } + // Calculate prefix occupied size. + offset := 0 + for _, elem := range t.TupleElems { + offset += getTypeSize(*elem) } + var ret, tail []byte + for i, elem := range t.TupleElems { + field := v.FieldByName(fieldmap[t.TupleRawNames[i]]) + if !field.IsValid() { + return nil, fmt.Errorf("field %s for tuple not found in the given struct", t.TupleRawNames[i]) + } + val, err := elem.pack(field) + if err != nil { + return nil, err + } + if isDynamicType(*elem) { + ret = append(ret, packNum(reflect.ValueOf(offset))...) + tail = append(tail, val...) + offset += len(val) + } else { + ret = append(ret, val...) + } + } + return append(ret, tail...), nil + + default: + return packElement(t, v), nil } - return packElement(t, v), nil } // requireLengthPrefix returns whether the type requires any sort of length @@ -207,3 +302,47 @@ func (t Type) pack(v reflect.Value) ([]byte, error) { func (t Type) requiresLengthPrefix() bool { return t.T == StringTy || t.T == BytesTy || t.T == SliceTy } + +// isDynamicType returns true if the type is dynamic. +// The following types are called “dynamic”: +// * bytes +// * string +// * T[] for any T +// * T[k] for any dynamic T and any k >= 0 +// * (T1,...,Tk) if Ti is dynamic for some 1 <= i <= k +func isDynamicType(t Type) bool { + if t.T == TupleTy { + for _, elem := range t.TupleElems { + if isDynamicType(*elem) { + return true + } + } + return false + } + return t.T == StringTy || t.T == BytesTy || t.T == SliceTy || (t.T == ArrayTy && isDynamicType(*t.Elem)) +} + +// getTypeSize returns the size that this type needs to occupy. +// We distinguish static and dynamic types. Static types are encoded in-place +// and dynamic types are encoded at a separately allocated location after the +// current block. +// So for a static variable, the size returned represents the size that the +// variable actually occupies. +// For a dynamic variable, the returned size is fixed 32 bytes, which is used +// to store the location reference for actual value storage. +func getTypeSize(t Type) int { + if t.T == ArrayTy && !isDynamicType(*t.Elem) { + // Recursively calculate type size if it is a nested array + if t.Elem.T == ArrayTy { + return t.Size * getTypeSize(*t.Elem) + } + return t.Size * 32 + } else if t.T == TupleTy && !isDynamicType(t) { + total := 0 + for _, elem := range t.TupleElems { + total += getTypeSize(*elem) + } + return total + } + return 32 +} diff --git a/accounts/abi/type_test.go b/accounts/abi/type_test.go index f6b36f18fd54..5023456aec1b 100644 --- a/accounts/abi/type_test.go +++ b/accounts/abi/type_test.go @@ -32,72 +32,81 @@ type typeWithoutStringer Type // Tests that all allowed types get recognized by the type parser. func TestTypeRegexp(t *testing.T) { tests := []struct { - blob string - kind Type + blob string + components []ArgumentMarshaling + kind Type }{ - {"bool", Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}}, - {"bool[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]bool(nil)), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}}, - {"bool[2]", Type{Size: 2, Kind: reflect.Array, T: ArrayTy, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}}, - {"bool[2][]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][]"}}, - {"bool[][]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([][]bool{}), Elem: &Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][]"}}, - {"bool[][2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][]bool{}), Elem: &Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][2]"}}, - {"bool[2][2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][2]"}}, - {"bool[2][][2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][][2]bool{}), Elem: &Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][]"}, stringKind: "bool[2][][2]"}}, - {"bool[2][2][2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][2][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][2]"}, stringKind: "bool[2][2][2]"}}, - {"bool[][][]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][][]bool{}), Elem: &Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][]bool{}), Elem: &Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][]"}, stringKind: "bool[][][]"}}, - {"bool[][2][]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][2][]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][]bool{}), Elem: &Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][2]"}, stringKind: "bool[][2][]"}}, - {"int8", Type{Kind: reflect.Int8, Type: int8T, Size: 8, T: IntTy, stringKind: "int8"}}, - {"int16", Type{Kind: reflect.Int16, Type: int16T, Size: 16, T: IntTy, stringKind: "int16"}}, - {"int32", Type{Kind: reflect.Int32, Type: int32T, Size: 32, T: IntTy, stringKind: "int32"}}, - {"int64", Type{Kind: reflect.Int64, Type: int64T, Size: 64, T: IntTy, stringKind: "int64"}}, - {"int256", Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: IntTy, stringKind: "int256"}}, - {"int8[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int8{}), Elem: &Type{Kind: reflect.Int8, Type: int8T, Size: 8, T: IntTy, stringKind: "int8"}, stringKind: "int8[]"}}, - {"int8[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]int8{}), Elem: &Type{Kind: reflect.Int8, Type: int8T, Size: 8, T: IntTy, stringKind: "int8"}, stringKind: "int8[2]"}}, - {"int16[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int16{}), Elem: &Type{Kind: reflect.Int16, Type: int16T, Size: 16, T: IntTy, stringKind: "int16"}, stringKind: "int16[]"}}, - {"int16[2]", Type{Size: 2, Kind: reflect.Array, T: ArrayTy, Type: reflect.TypeOf([2]int16{}), Elem: &Type{Kind: reflect.Int16, Type: int16T, Size: 16, T: IntTy, stringKind: "int16"}, stringKind: "int16[2]"}}, - {"int32[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int32{}), Elem: &Type{Kind: reflect.Int32, Type: int32T, Size: 32, T: IntTy, stringKind: "int32"}, stringKind: "int32[]"}}, - {"int32[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]int32{}), Elem: &Type{Kind: reflect.Int32, Type: int32T, Size: 32, T: IntTy, stringKind: "int32"}, stringKind: "int32[2]"}}, - {"int64[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int64{}), Elem: &Type{Kind: reflect.Int64, Type: int64T, Size: 64, T: IntTy, stringKind: "int64"}, stringKind: "int64[]"}}, - {"int64[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]int64{}), Elem: &Type{Kind: reflect.Int64, Type: int64T, Size: 64, T: IntTy, stringKind: "int64"}, stringKind: "int64[2]"}}, - {"int256[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]*big.Int{}), Elem: &Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: IntTy, stringKind: "int256"}, stringKind: "int256[]"}}, - {"int256[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]*big.Int{}), Elem: &Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: IntTy, stringKind: "int256"}, stringKind: "int256[2]"}}, - {"uint8", Type{Kind: reflect.Uint8, Type: uint8T, Size: 8, T: UintTy, stringKind: "uint8"}}, - {"uint16", Type{Kind: reflect.Uint16, Type: uint16T, Size: 16, T: UintTy, stringKind: "uint16"}}, - {"uint32", Type{Kind: reflect.Uint32, Type: uint32T, Size: 32, T: UintTy, stringKind: "uint32"}}, - {"uint64", Type{Kind: reflect.Uint64, Type: uint64T, Size: 64, T: UintTy, stringKind: "uint64"}}, - {"uint256", Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: UintTy, stringKind: "uint256"}}, - {"uint8[]", Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]uint8{}), Elem: &Type{Kind: reflect.Uint8, Type: uint8T, Size: 8, T: UintTy, stringKind: "uint8"}, stringKind: "uint8[]"}}, - {"uint8[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint8{}), Elem: &Type{Kind: reflect.Uint8, Type: uint8T, Size: 8, T: UintTy, stringKind: "uint8"}, stringKind: "uint8[2]"}}, - {"uint16[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]uint16{}), Elem: &Type{Kind: reflect.Uint16, Type: uint16T, Size: 16, T: UintTy, stringKind: "uint16"}, stringKind: "uint16[]"}}, - {"uint16[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint16{}), Elem: &Type{Kind: reflect.Uint16, Type: uint16T, Size: 16, T: UintTy, stringKind: "uint16"}, stringKind: "uint16[2]"}}, - {"uint32[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]uint32{}), Elem: &Type{Kind: reflect.Uint32, Type: uint32T, Size: 32, T: UintTy, stringKind: "uint32"}, stringKind: "uint32[]"}}, - {"uint32[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint32{}), Elem: &Type{Kind: reflect.Uint32, Type: uint32T, Size: 32, T: UintTy, stringKind: "uint32"}, stringKind: "uint32[2]"}}, - {"uint64[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]uint64{}), Elem: &Type{Kind: reflect.Uint64, Type: uint64T, Size: 64, T: UintTy, stringKind: "uint64"}, stringKind: "uint64[]"}}, - {"uint64[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint64{}), Elem: &Type{Kind: reflect.Uint64, Type: uint64T, Size: 64, T: UintTy, stringKind: "uint64"}, stringKind: "uint64[2]"}}, - {"uint256[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]*big.Int{}), Elem: &Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: UintTy, stringKind: "uint256"}, stringKind: "uint256[]"}}, - {"uint256[2]", Type{Kind: reflect.Array, T: ArrayTy, Type: reflect.TypeOf([2]*big.Int{}), Size: 2, Elem: &Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: UintTy, stringKind: "uint256"}, stringKind: "uint256[2]"}}, - {"bytes32", Type{Kind: reflect.Array, T: FixedBytesTy, Size: 32, Type: reflect.TypeOf([32]byte{}), stringKind: "bytes32"}}, - {"bytes[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][]byte{}), Elem: &Type{Kind: reflect.Slice, Type: reflect.TypeOf([]byte{}), T: BytesTy, stringKind: "bytes"}, stringKind: "bytes[]"}}, - {"bytes[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][]byte{}), Elem: &Type{T: BytesTy, Type: reflect.TypeOf([]byte{}), Kind: reflect.Slice, stringKind: "bytes"}, stringKind: "bytes[2]"}}, - {"bytes32[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][32]byte{}), Elem: &Type{Kind: reflect.Array, Type: reflect.TypeOf([32]byte{}), T: FixedBytesTy, Size: 32, stringKind: "bytes32"}, stringKind: "bytes32[]"}}, - {"bytes32[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][32]byte{}), Elem: &Type{Kind: reflect.Array, T: FixedBytesTy, Size: 32, Type: reflect.TypeOf([32]byte{}), stringKind: "bytes32"}, stringKind: "bytes32[2]"}}, - {"string", Type{Kind: reflect.String, T: StringTy, Type: reflect.TypeOf(""), stringKind: "string"}}, - {"string[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]string{}), Elem: &Type{Kind: reflect.String, Type: reflect.TypeOf(""), T: StringTy, stringKind: "string"}, stringKind: "string[]"}}, - {"string[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]string{}), Elem: &Type{Kind: reflect.String, T: StringTy, Type: reflect.TypeOf(""), stringKind: "string"}, stringKind: "string[2]"}}, - {"address", Type{Kind: reflect.Array, Type: addressT, Size: 20, T: AddressTy, stringKind: "address"}}, - {"address[]", Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]common.Address{}), Elem: &Type{Kind: reflect.Array, Type: addressT, Size: 20, T: AddressTy, stringKind: "address"}, stringKind: "address[]"}}, - {"address[2]", Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]common.Address{}), Elem: &Type{Kind: reflect.Array, Type: addressT, Size: 20, T: AddressTy, stringKind: "address"}, stringKind: "address[2]"}}, + {"bool", nil, Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}}, + {"bool[]", nil, Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]bool(nil)), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}}, + {"bool[2]", nil, Type{Size: 2, Kind: reflect.Array, T: ArrayTy, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}}, + {"bool[2][]", nil, Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][]"}}, + {"bool[][]", nil, Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([][]bool{}), Elem: &Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][]"}}, + {"bool[][2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][]bool{}), Elem: &Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][2]"}}, + {"bool[2][2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][2]"}}, + {"bool[2][][2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][][2]bool{}), Elem: &Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][]"}, stringKind: "bool[2][][2]"}}, + {"bool[2][2][2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][2][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][2]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[2]"}, stringKind: "bool[2][2]"}, stringKind: "bool[2][2][2]"}}, + {"bool[][][]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][][]bool{}), Elem: &Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][]bool{}), Elem: &Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][]"}, stringKind: "bool[][][]"}}, + {"bool[][2][]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][2][]bool{}), Elem: &Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][]bool{}), Elem: &Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]bool{}), Elem: &Type{Kind: reflect.Bool, T: BoolTy, Type: reflect.TypeOf(bool(false)), stringKind: "bool"}, stringKind: "bool[]"}, stringKind: "bool[][2]"}, stringKind: "bool[][2][]"}}, + {"int8", nil, Type{Kind: reflect.Int8, Type: int8T, Size: 8, T: IntTy, stringKind: "int8"}}, + {"int16", nil, Type{Kind: reflect.Int16, Type: int16T, Size: 16, T: IntTy, stringKind: "int16"}}, + {"int32", nil, Type{Kind: reflect.Int32, Type: int32T, Size: 32, T: IntTy, stringKind: "int32"}}, + {"int64", nil, Type{Kind: reflect.Int64, Type: int64T, Size: 64, T: IntTy, stringKind: "int64"}}, + {"int256", nil, Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: IntTy, stringKind: "int256"}}, + {"int8[]", nil, Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int8{}), Elem: &Type{Kind: reflect.Int8, Type: int8T, Size: 8, T: IntTy, stringKind: "int8"}, stringKind: "int8[]"}}, + {"int8[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]int8{}), Elem: &Type{Kind: reflect.Int8, Type: int8T, Size: 8, T: IntTy, stringKind: "int8"}, stringKind: "int8[2]"}}, + {"int16[]", nil, Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int16{}), Elem: &Type{Kind: reflect.Int16, Type: int16T, Size: 16, T: IntTy, stringKind: "int16"}, stringKind: "int16[]"}}, + {"int16[2]", nil, Type{Size: 2, Kind: reflect.Array, T: ArrayTy, Type: reflect.TypeOf([2]int16{}), Elem: &Type{Kind: reflect.Int16, Type: int16T, Size: 16, T: IntTy, stringKind: "int16"}, stringKind: "int16[2]"}}, + {"int32[]", nil, Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int32{}), Elem: &Type{Kind: reflect.Int32, Type: int32T, Size: 32, T: IntTy, stringKind: "int32"}, stringKind: "int32[]"}}, + {"int32[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]int32{}), Elem: &Type{Kind: reflect.Int32, Type: int32T, Size: 32, T: IntTy, stringKind: "int32"}, stringKind: "int32[2]"}}, + {"int64[]", nil, Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]int64{}), Elem: &Type{Kind: reflect.Int64, Type: int64T, Size: 64, T: IntTy, stringKind: "int64"}, stringKind: "int64[]"}}, + {"int64[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]int64{}), Elem: &Type{Kind: reflect.Int64, Type: int64T, Size: 64, T: IntTy, stringKind: "int64"}, stringKind: "int64[2]"}}, + {"int256[]", nil, Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]*big.Int{}), Elem: &Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: IntTy, stringKind: "int256"}, stringKind: "int256[]"}}, + {"int256[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]*big.Int{}), Elem: &Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: IntTy, stringKind: "int256"}, stringKind: "int256[2]"}}, + {"uint8", nil, Type{Kind: reflect.Uint8, Type: uint8T, Size: 8, T: UintTy, stringKind: "uint8"}}, + {"uint16", nil, Type{Kind: reflect.Uint16, Type: uint16T, Size: 16, T: UintTy, stringKind: "uint16"}}, + {"uint32", nil, Type{Kind: reflect.Uint32, Type: uint32T, Size: 32, T: UintTy, stringKind: "uint32"}}, + {"uint64", nil, Type{Kind: reflect.Uint64, Type: uint64T, Size: 64, T: UintTy, stringKind: "uint64"}}, + {"uint256", nil, Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: UintTy, stringKind: "uint256"}}, + {"uint8[]", nil, Type{Kind: reflect.Slice, T: SliceTy, Type: reflect.TypeOf([]uint8{}), Elem: &Type{Kind: reflect.Uint8, Type: uint8T, Size: 8, T: UintTy, stringKind: "uint8"}, stringKind: "uint8[]"}}, + {"uint8[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint8{}), Elem: &Type{Kind: reflect.Uint8, Type: uint8T, Size: 8, T: UintTy, stringKind: "uint8"}, stringKind: "uint8[2]"}}, + {"uint16[]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]uint16{}), Elem: &Type{Kind: reflect.Uint16, Type: uint16T, Size: 16, T: UintTy, stringKind: "uint16"}, stringKind: "uint16[]"}}, + {"uint16[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint16{}), Elem: &Type{Kind: reflect.Uint16, Type: uint16T, Size: 16, T: UintTy, stringKind: "uint16"}, stringKind: "uint16[2]"}}, + {"uint32[]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]uint32{}), Elem: &Type{Kind: reflect.Uint32, Type: uint32T, Size: 32, T: UintTy, stringKind: "uint32"}, stringKind: "uint32[]"}}, + {"uint32[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint32{}), Elem: &Type{Kind: reflect.Uint32, Type: uint32T, Size: 32, T: UintTy, stringKind: "uint32"}, stringKind: "uint32[2]"}}, + {"uint64[]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]uint64{}), Elem: &Type{Kind: reflect.Uint64, Type: uint64T, Size: 64, T: UintTy, stringKind: "uint64"}, stringKind: "uint64[]"}}, + {"uint64[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]uint64{}), Elem: &Type{Kind: reflect.Uint64, Type: uint64T, Size: 64, T: UintTy, stringKind: "uint64"}, stringKind: "uint64[2]"}}, + {"uint256[]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]*big.Int{}), Elem: &Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: UintTy, stringKind: "uint256"}, stringKind: "uint256[]"}}, + {"uint256[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Type: reflect.TypeOf([2]*big.Int{}), Size: 2, Elem: &Type{Kind: reflect.Ptr, Type: bigT, Size: 256, T: UintTy, stringKind: "uint256"}, stringKind: "uint256[2]"}}, + {"bytes32", nil, Type{Kind: reflect.Array, T: FixedBytesTy, Size: 32, Type: reflect.TypeOf([32]byte{}), stringKind: "bytes32"}}, + {"bytes[]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][]byte{}), Elem: &Type{Kind: reflect.Slice, Type: reflect.TypeOf([]byte{}), T: BytesTy, stringKind: "bytes"}, stringKind: "bytes[]"}}, + {"bytes[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][]byte{}), Elem: &Type{T: BytesTy, Type: reflect.TypeOf([]byte{}), Kind: reflect.Slice, stringKind: "bytes"}, stringKind: "bytes[2]"}}, + {"bytes32[]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([][32]byte{}), Elem: &Type{Kind: reflect.Array, Type: reflect.TypeOf([32]byte{}), T: FixedBytesTy, Size: 32, stringKind: "bytes32"}, stringKind: "bytes32[]"}}, + {"bytes32[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2][32]byte{}), Elem: &Type{Kind: reflect.Array, T: FixedBytesTy, Size: 32, Type: reflect.TypeOf([32]byte{}), stringKind: "bytes32"}, stringKind: "bytes32[2]"}}, + {"string", nil, Type{Kind: reflect.String, T: StringTy, Type: reflect.TypeOf(""), stringKind: "string"}}, + {"string[]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]string{}), Elem: &Type{Kind: reflect.String, Type: reflect.TypeOf(""), T: StringTy, stringKind: "string"}, stringKind: "string[]"}}, + {"string[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]string{}), Elem: &Type{Kind: reflect.String, T: StringTy, Type: reflect.TypeOf(""), stringKind: "string"}, stringKind: "string[2]"}}, + {"address", nil, Type{Kind: reflect.Array, Type: addressT, Size: 20, T: AddressTy, stringKind: "address"}}, + {"address[]", nil, Type{T: SliceTy, Kind: reflect.Slice, Type: reflect.TypeOf([]common.Address{}), Elem: &Type{Kind: reflect.Array, Type: addressT, Size: 20, T: AddressTy, stringKind: "address"}, stringKind: "address[]"}}, + {"address[2]", nil, Type{Kind: reflect.Array, T: ArrayTy, Size: 2, Type: reflect.TypeOf([2]common.Address{}), Elem: &Type{Kind: reflect.Array, Type: addressT, Size: 20, T: AddressTy, stringKind: "address"}, stringKind: "address[2]"}}, // TODO when fixed types are implemented properly - // {"fixed", Type{}}, - // {"fixed128x128", Type{}}, - // {"fixed[]", Type{}}, - // {"fixed[2]", Type{}}, - // {"fixed128x128[]", Type{}}, - // {"fixed128x128[2]", Type{}}, + // {"fixed", nil, Type{}}, + // {"fixed128x128", nil, Type{}}, + // {"fixed[]", nil, Type{}}, + // {"fixed[2]", nil, Type{}}, + // {"fixed128x128[]", nil, Type{}}, + // {"fixed128x128[2]", nil, Type{}}, + {"tuple", []ArgumentMarshaling{{Name: "a", Type: "int64"}}, Type{Kind: reflect.Struct, T: TupleTy, Type: reflect.TypeOf(struct { + A int64 `json:"a"` + }{}), stringKind: "(int64)", + TupleElems: []*Type{{Kind: reflect.Int64, T: IntTy, Type: reflect.TypeOf(int64(0)), Size: 64, stringKind: "int64"}}, TupleRawNames: []string{"a"}}}, + {"tuple with long name", []ArgumentMarshaling{{Name: "aTypicalParamName", Type: "int64"}}, Type{Kind: reflect.Struct, T: TupleTy, Type: reflect.TypeOf(struct { + ATypicalParamName int64 `json:"aTypicalParamName"` + }{}), stringKind: "(int64)", + TupleElems: []*Type{{Kind: reflect.Int64, T: IntTy, Type: reflect.TypeOf(int64(0)), Size: 64, stringKind: "int64"}}, TupleRawNames: []string{"aTypicalParamName"}}}, } for _, tt := range tests { - typ, err := NewType(tt.blob) + typ, err := NewType(tt.blob, tt.components) if err != nil { t.Errorf("type %q: failed to parse type string: %v", tt.blob, err) } @@ -109,154 +118,170 @@ func TestTypeRegexp(t *testing.T) { func TestTypeCheck(t *testing.T) { for i, test := range []struct { - typ string - input interface{} - err string + typ string + components []ArgumentMarshaling + input interface{} + err string }{ - {"uint", big.NewInt(1), "unsupported arg type: uint"}, - {"int", big.NewInt(1), "unsupported arg type: int"}, - {"uint256", big.NewInt(1), ""}, - {"uint256[][3][]", [][3][]*big.Int{{{}}}, ""}, - {"uint256[][][3]", [3][][]*big.Int{{{}}}, ""}, - {"uint256[3][][]", [][][3]*big.Int{{{}}}, ""}, - {"uint256[3][3][3]", [3][3][3]*big.Int{{{}}}, ""}, - {"uint8[][]", [][]uint8{}, ""}, - {"int256", big.NewInt(1), ""}, - {"uint8", uint8(1), ""}, - {"uint16", uint16(1), ""}, - {"uint32", uint32(1), ""}, - {"uint64", uint64(1), ""}, - {"int8", int8(1), ""}, - {"int16", int16(1), ""}, - {"int32", int32(1), ""}, - {"int64", int64(1), ""}, - {"uint24", big.NewInt(1), ""}, - {"uint40", big.NewInt(1), ""}, - {"uint48", big.NewInt(1), ""}, - {"uint56", big.NewInt(1), ""}, - {"uint72", big.NewInt(1), ""}, - {"uint80", big.NewInt(1), ""}, - {"uint88", big.NewInt(1), ""}, - {"uint96", big.NewInt(1), ""}, - {"uint104", big.NewInt(1), ""}, - {"uint112", big.NewInt(1), ""}, - {"uint120", big.NewInt(1), ""}, - {"uint128", big.NewInt(1), ""}, - {"uint136", big.NewInt(1), ""}, - {"uint144", big.NewInt(1), ""}, - {"uint152", big.NewInt(1), ""}, - {"uint160", big.NewInt(1), ""}, - {"uint168", big.NewInt(1), ""}, - {"uint176", big.NewInt(1), ""}, - {"uint184", big.NewInt(1), ""}, - {"uint192", big.NewInt(1), ""}, - {"uint200", big.NewInt(1), ""}, - {"uint208", big.NewInt(1), ""}, - {"uint216", big.NewInt(1), ""}, - {"uint224", big.NewInt(1), ""}, - {"uint232", big.NewInt(1), ""}, - {"uint240", big.NewInt(1), ""}, - {"uint248", big.NewInt(1), ""}, - {"int24", big.NewInt(1), ""}, - {"int40", big.NewInt(1), ""}, - {"int48", big.NewInt(1), ""}, - {"int56", big.NewInt(1), ""}, - {"int72", big.NewInt(1), ""}, - {"int80", big.NewInt(1), ""}, - {"int88", big.NewInt(1), ""}, - {"int96", big.NewInt(1), ""}, - {"int104", big.NewInt(1), ""}, - {"int112", big.NewInt(1), ""}, - {"int120", big.NewInt(1), ""}, - {"int128", big.NewInt(1), ""}, - {"int136", big.NewInt(1), ""}, - {"int144", big.NewInt(1), ""}, - {"int152", big.NewInt(1), ""}, - {"int160", big.NewInt(1), ""}, - {"int168", big.NewInt(1), ""}, - {"int176", big.NewInt(1), ""}, - {"int184", big.NewInt(1), ""}, - {"int192", big.NewInt(1), ""}, - {"int200", big.NewInt(1), ""}, - {"int208", big.NewInt(1), ""}, - {"int216", big.NewInt(1), ""}, - {"int224", big.NewInt(1), ""}, - {"int232", big.NewInt(1), ""}, - {"int240", big.NewInt(1), ""}, - {"int248", big.NewInt(1), ""}, - {"uint30", uint8(1), "abi: cannot use uint8 as type ptr as argument"}, - {"uint8", uint16(1), "abi: cannot use uint16 as type uint8 as argument"}, - {"uint8", uint32(1), "abi: cannot use uint32 as type uint8 as argument"}, - {"uint8", uint64(1), "abi: cannot use uint64 as type uint8 as argument"}, - {"uint8", int8(1), "abi: cannot use int8 as type uint8 as argument"}, - {"uint8", int16(1), "abi: cannot use int16 as type uint8 as argument"}, - {"uint8", int32(1), "abi: cannot use int32 as type uint8 as argument"}, - {"uint8", int64(1), "abi: cannot use int64 as type uint8 as argument"}, - {"uint16", uint16(1), ""}, - {"uint16", uint8(1), "abi: cannot use uint8 as type uint16 as argument"}, - {"uint16[]", []uint16{1, 2, 3}, ""}, - {"uint16[]", [3]uint16{1, 2, 3}, ""}, - {"uint16[]", []uint32{1, 2, 3}, "abi: cannot use []uint32 as type [0]uint16 as argument"}, - {"uint16[3]", [3]uint32{1, 2, 3}, "abi: cannot use [3]uint32 as type [3]uint16 as argument"}, - {"uint16[3]", [4]uint16{1, 2, 3}, "abi: cannot use [4]uint16 as type [3]uint16 as argument"}, - {"uint16[3]", []uint16{1, 2, 3}, ""}, - {"uint16[3]", []uint16{1, 2, 3, 4}, "abi: cannot use [4]uint16 as type [3]uint16 as argument"}, - {"address[]", []common.Address{{1}}, ""}, - {"address[1]", []common.Address{{1}}, ""}, - {"address[1]", [1]common.Address{{1}}, ""}, - {"address[2]", [1]common.Address{{1}}, "abi: cannot use [1]array as type [2]array as argument"}, - {"bytes32", [32]byte{}, ""}, - {"bytes31", [31]byte{}, ""}, - {"bytes30", [30]byte{}, ""}, - {"bytes29", [29]byte{}, ""}, - {"bytes28", [28]byte{}, ""}, - {"bytes27", [27]byte{}, ""}, - {"bytes26", [26]byte{}, ""}, - {"bytes25", [25]byte{}, ""}, - {"bytes24", [24]byte{}, ""}, - {"bytes23", [23]byte{}, ""}, - {"bytes22", [22]byte{}, ""}, - {"bytes21", [21]byte{}, ""}, - {"bytes20", [20]byte{}, ""}, - {"bytes19", [19]byte{}, ""}, - {"bytes18", [18]byte{}, ""}, - {"bytes17", [17]byte{}, ""}, - {"bytes16", [16]byte{}, ""}, - {"bytes15", [15]byte{}, ""}, - {"bytes14", [14]byte{}, ""}, - {"bytes13", [13]byte{}, ""}, - {"bytes12", [12]byte{}, ""}, - {"bytes11", [11]byte{}, ""}, - {"bytes10", [10]byte{}, ""}, - {"bytes9", [9]byte{}, ""}, - {"bytes8", [8]byte{}, ""}, - {"bytes7", [7]byte{}, ""}, - {"bytes6", [6]byte{}, ""}, - {"bytes5", [5]byte{}, ""}, - {"bytes4", [4]byte{}, ""}, - {"bytes3", [3]byte{}, ""}, - {"bytes2", [2]byte{}, ""}, - {"bytes1", [1]byte{}, ""}, - {"bytes32", [33]byte{}, "abi: cannot use [33]uint8 as type [32]uint8 as argument"}, - {"bytes32", common.Hash{1}, ""}, - {"bytes31", common.Hash{1}, "abi: cannot use common.Hash as type [31]uint8 as argument"}, - {"bytes31", [32]byte{}, "abi: cannot use [32]uint8 as type [31]uint8 as argument"}, - {"bytes", []byte{0, 1}, ""}, - {"bytes", [2]byte{0, 1}, "abi: cannot use array as type slice as argument"}, - {"bytes", common.Hash{1}, "abi: cannot use array as type slice as argument"}, - {"string", "hello world", ""}, - {"string", string(""), ""}, - {"string", []byte{}, "abi: cannot use slice as type string as argument"}, - {"bytes32[]", [][32]byte{{}}, ""}, - {"function", [24]byte{}, ""}, - {"bytes20", common.Address{}, ""}, - {"address", [20]byte{}, ""}, - {"address", common.Address{}, ""}, - {"bytes32[]]", "", "invalid arg type in abi"}, - {"invalidType", "", "unsupported arg type: invalidType"}, - {"invalidSlice[]", "", "unsupported arg type: invalidSlice"}, + {"uint", nil, big.NewInt(1), "unsupported arg type: uint"}, + {"int", nil, big.NewInt(1), "unsupported arg type: int"}, + {"uint256", nil, big.NewInt(1), ""}, + {"uint256[][3][]", nil, [][3][]*big.Int{{{}}}, ""}, + {"uint256[][][3]", nil, [3][][]*big.Int{{{}}}, ""}, + {"uint256[3][][]", nil, [][][3]*big.Int{{{}}}, ""}, + {"uint256[3][3][3]", nil, [3][3][3]*big.Int{{{}}}, ""}, + {"uint8[][]", nil, [][]uint8{}, ""}, + {"int256", nil, big.NewInt(1), ""}, + {"uint8", nil, uint8(1), ""}, + {"uint16", nil, uint16(1), ""}, + {"uint32", nil, uint32(1), ""}, + {"uint64", nil, uint64(1), ""}, + {"int8", nil, int8(1), ""}, + {"int16", nil, int16(1), ""}, + {"int32", nil, int32(1), ""}, + {"int64", nil, int64(1), ""}, + {"uint24", nil, big.NewInt(1), ""}, + {"uint40", nil, big.NewInt(1), ""}, + {"uint48", nil, big.NewInt(1), ""}, + {"uint56", nil, big.NewInt(1), ""}, + {"uint72", nil, big.NewInt(1), ""}, + {"uint80", nil, big.NewInt(1), ""}, + {"uint88", nil, big.NewInt(1), ""}, + {"uint96", nil, big.NewInt(1), ""}, + {"uint104", nil, big.NewInt(1), ""}, + {"uint112", nil, big.NewInt(1), ""}, + {"uint120", nil, big.NewInt(1), ""}, + {"uint128", nil, big.NewInt(1), ""}, + {"uint136", nil, big.NewInt(1), ""}, + {"uint144", nil, big.NewInt(1), ""}, + {"uint152", nil, big.NewInt(1), ""}, + {"uint160", nil, big.NewInt(1), ""}, + {"uint168", nil, big.NewInt(1), ""}, + {"uint176", nil, big.NewInt(1), ""}, + {"uint184", nil, big.NewInt(1), ""}, + {"uint192", nil, big.NewInt(1), ""}, + {"uint200", nil, big.NewInt(1), ""}, + {"uint208", nil, big.NewInt(1), ""}, + {"uint216", nil, big.NewInt(1), ""}, + {"uint224", nil, big.NewInt(1), ""}, + {"uint232", nil, big.NewInt(1), ""}, + {"uint240", nil, big.NewInt(1), ""}, + {"uint248", nil, big.NewInt(1), ""}, + {"int24", nil, big.NewInt(1), ""}, + {"int40", nil, big.NewInt(1), ""}, + {"int48", nil, big.NewInt(1), ""}, + {"int56", nil, big.NewInt(1), ""}, + {"int72", nil, big.NewInt(1), ""}, + {"int80", nil, big.NewInt(1), ""}, + {"int88", nil, big.NewInt(1), ""}, + {"int96", nil, big.NewInt(1), ""}, + {"int104", nil, big.NewInt(1), ""}, + {"int112", nil, big.NewInt(1), ""}, + {"int120", nil, big.NewInt(1), ""}, + {"int128", nil, big.NewInt(1), ""}, + {"int136", nil, big.NewInt(1), ""}, + {"int144", nil, big.NewInt(1), ""}, + {"int152", nil, big.NewInt(1), ""}, + {"int160", nil, big.NewInt(1), ""}, + {"int168", nil, big.NewInt(1), ""}, + {"int176", nil, big.NewInt(1), ""}, + {"int184", nil, big.NewInt(1), ""}, + {"int192", nil, big.NewInt(1), ""}, + {"int200", nil, big.NewInt(1), ""}, + {"int208", nil, big.NewInt(1), ""}, + {"int216", nil, big.NewInt(1), ""}, + {"int224", nil, big.NewInt(1), ""}, + {"int232", nil, big.NewInt(1), ""}, + {"int240", nil, big.NewInt(1), ""}, + {"int248", nil, big.NewInt(1), ""}, + {"uint30", nil, uint8(1), "abi: cannot use uint8 as type ptr as argument"}, + {"uint8", nil, uint16(1), "abi: cannot use uint16 as type uint8 as argument"}, + {"uint8", nil, uint32(1), "abi: cannot use uint32 as type uint8 as argument"}, + {"uint8", nil, uint64(1), "abi: cannot use uint64 as type uint8 as argument"}, + {"uint8", nil, int8(1), "abi: cannot use int8 as type uint8 as argument"}, + {"uint8", nil, int16(1), "abi: cannot use int16 as type uint8 as argument"}, + {"uint8", nil, int32(1), "abi: cannot use int32 as type uint8 as argument"}, + {"uint8", nil, int64(1), "abi: cannot use int64 as type uint8 as argument"}, + {"uint16", nil, uint16(1), ""}, + {"uint16", nil, uint8(1), "abi: cannot use uint8 as type uint16 as argument"}, + {"uint16[]", nil, []uint16{1, 2, 3}, ""}, + {"uint16[]", nil, [3]uint16{1, 2, 3}, ""}, + {"uint16[]", nil, []uint32{1, 2, 3}, "abi: cannot use []uint32 as type [0]uint16 as argument"}, + {"uint16[3]", nil, [3]uint32{1, 2, 3}, "abi: cannot use [3]uint32 as type [3]uint16 as argument"}, + {"uint16[3]", nil, [4]uint16{1, 2, 3}, "abi: cannot use [4]uint16 as type [3]uint16 as argument"}, + {"uint16[3]", nil, []uint16{1, 2, 3}, ""}, + {"uint16[3]", nil, []uint16{1, 2, 3, 4}, "abi: cannot use [4]uint16 as type [3]uint16 as argument"}, + {"address[]", nil, []common.Address{{1}}, ""}, + {"address[1]", nil, []common.Address{{1}}, ""}, + {"address[1]", nil, [1]common.Address{{1}}, ""}, + {"address[2]", nil, [1]common.Address{{1}}, "abi: cannot use [1]array as type [2]array as argument"}, + {"bytes32", nil, [32]byte{}, ""}, + {"bytes31", nil, [31]byte{}, ""}, + {"bytes30", nil, [30]byte{}, ""}, + {"bytes29", nil, [29]byte{}, ""}, + {"bytes28", nil, [28]byte{}, ""}, + {"bytes27", nil, [27]byte{}, ""}, + {"bytes26", nil, [26]byte{}, ""}, + {"bytes25", nil, [25]byte{}, ""}, + {"bytes24", nil, [24]byte{}, ""}, + {"bytes23", nil, [23]byte{}, ""}, + {"bytes22", nil, [22]byte{}, ""}, + {"bytes21", nil, [21]byte{}, ""}, + {"bytes20", nil, [20]byte{}, ""}, + {"bytes19", nil, [19]byte{}, ""}, + {"bytes18", nil, [18]byte{}, ""}, + {"bytes17", nil, [17]byte{}, ""}, + {"bytes16", nil, [16]byte{}, ""}, + {"bytes15", nil, [15]byte{}, ""}, + {"bytes14", nil, [14]byte{}, ""}, + {"bytes13", nil, [13]byte{}, ""}, + {"bytes12", nil, [12]byte{}, ""}, + {"bytes11", nil, [11]byte{}, ""}, + {"bytes10", nil, [10]byte{}, ""}, + {"bytes9", nil, [9]byte{}, ""}, + {"bytes8", nil, [8]byte{}, ""}, + {"bytes7", nil, [7]byte{}, ""}, + {"bytes6", nil, [6]byte{}, ""}, + {"bytes5", nil, [5]byte{}, ""}, + {"bytes4", nil, [4]byte{}, ""}, + {"bytes3", nil, [3]byte{}, ""}, + {"bytes2", nil, [2]byte{}, ""}, + {"bytes1", nil, [1]byte{}, ""}, + {"bytes32", nil, [33]byte{}, "abi: cannot use [33]uint8 as type [32]uint8 as argument"}, + {"bytes32", nil, common.Hash{1}, ""}, + {"bytes31", nil, common.Hash{1}, "abi: cannot use common.Hash as type [31]uint8 as argument"}, + {"bytes31", nil, [32]byte{}, "abi: cannot use [32]uint8 as type [31]uint8 as argument"}, + {"bytes", nil, []byte{0, 1}, ""}, + {"bytes", nil, [2]byte{0, 1}, "abi: cannot use array as type slice as argument"}, + {"bytes", nil, common.Hash{1}, "abi: cannot use array as type slice as argument"}, + {"string", nil, "hello world", ""}, + {"string", nil, string(""), ""}, + {"string", nil, []byte{}, "abi: cannot use slice as type string as argument"}, + {"bytes32[]", nil, [][32]byte{{}}, ""}, + {"function", nil, [24]byte{}, ""}, + {"bytes20", nil, common.Address{}, ""}, + {"address", nil, [20]byte{}, ""}, + {"address", nil, common.Address{}, ""}, + {"bytes32[]]", nil, "", "invalid arg type in abi"}, + {"invalidType", nil, "", "unsupported arg type: invalidType"}, + {"invalidSlice[]", nil, "", "unsupported arg type: invalidSlice"}, + // simple tuple + {"tuple", []ArgumentMarshaling{{Name: "a", Type: "uint256"}, {Name: "b", Type: "uint256"}}, struct { + A *big.Int + B *big.Int + }{}, ""}, + // tuple slice + {"tuple[]", []ArgumentMarshaling{{Name: "a", Type: "uint256"}, {Name: "b", Type: "uint256"}}, []struct { + A *big.Int + B *big.Int + }{}, ""}, + // tuple array + {"tuple[2]", []ArgumentMarshaling{{Name: "a", Type: "uint256"}, {Name: "b", Type: "uint256"}}, []struct { + A *big.Int + B *big.Int + }{{big.NewInt(0), big.NewInt(0)}, {big.NewInt(0), big.NewInt(0)}}, ""}, } { - typ, err := NewType(test.typ) + typ, err := NewType(test.typ, test.components) if err != nil && len(test.err) == 0 { t.Fatal("unexpected parse error:", err) } else if err != nil && len(test.err) != 0 { diff --git a/accounts/abi/unpack.go b/accounts/abi/unpack.go index d5875140ccf7..b2e61d06c416 100644 --- a/accounts/abi/unpack.go +++ b/accounts/abi/unpack.go @@ -115,17 +115,6 @@ func readFixedBytes(t Type, word []byte) (interface{}, error) { } -func getFullElemSize(elem *Type) int { - //all other should be counted as 32 (slices have pointers to respective elements) - size := 32 - //arrays wrap it, each element being the same size - for elem.T == ArrayTy { - size *= elem.Size - elem = elem.Elem - } - return size -} - // iteratively unpack elements func forEachUnpack(t Type, output []byte, start, size int) (interface{}, error) { if size < 0 { @@ -150,13 +139,9 @@ func forEachUnpack(t Type, output []byte, start, size int) (interface{}, error) // Arrays have packed elements, resulting in longer unpack steps. // Slices have just 32 bytes per element (pointing to the contents). - elemSize := 32 - if t.T == ArrayTy { - elemSize = getFullElemSize(t.Elem) - } + elemSize := getTypeSize(*t.Elem) for i, j := start, 0; j < size; i, j = i+elemSize, j+1 { - inter, err := toGoType(i, *t.Elem, output) if err != nil { return nil, err @@ -170,6 +155,36 @@ func forEachUnpack(t Type, output []byte, start, size int) (interface{}, error) return refSlice.Interface(), nil } +func forTupleUnpack(t Type, output []byte) (interface{}, error) { + retval := reflect.New(t.Type).Elem() + virtualArgs := 0 + for index, elem := range t.TupleElems { + marshalledValue, err := toGoType((index+virtualArgs)*32, *elem, output) + if elem.T == ArrayTy && !isDynamicType(*elem) { + // If we have a static array, like [3]uint256, these are coded as + // just like uint256,uint256,uint256. + // This means that we need to add two 'virtual' arguments when + // we count the index from now on. + // + // Array values nested multiple levels deep are also encoded inline: + // [2][3]uint256: uint256,uint256,uint256,uint256,uint256,uint256 + // + // Calculate the full array size to get the correct offset for the next argument. + // Decrement it by 1, as the normal index increment is still applied. + virtualArgs += getTypeSize(*elem)/32 - 1 + } else if elem.T == TupleTy && !isDynamicType(*elem) { + // If we have a static tuple, like (uint256, bool, uint256), these are + // coded as just like uint256,bool,uint256 + virtualArgs += getTypeSize(*elem)/32 - 1 + } + if err != nil { + return nil, err + } + retval.Field(index).Set(reflect.ValueOf(marshalledValue)) + } + return retval.Interface(), nil +} + // toGoType parses the output bytes and recursively assigns the value of these bytes // into a go type with accordance with the ABI spec. func toGoType(index int, t Type, output []byte) (interface{}, error) { @@ -178,14 +193,14 @@ func toGoType(index int, t Type, output []byte) (interface{}, error) { } var ( - returnOutput []byte - begin, end int - err error + returnOutput []byte + begin, length int + err error ) // if we require a length prefix, find the beginning word and size returned. if t.requiresLengthPrefix() { - begin, end, err = lengthPrefixPointsTo(index, output) + begin, length, err = lengthPrefixPointsTo(index, output) if err != nil { return nil, err } @@ -194,12 +209,26 @@ func toGoType(index int, t Type, output []byte) (interface{}, error) { } switch t.T { + case TupleTy: + if isDynamicType(t) { + begin, err := tuplePointsTo(index, output) + if err != nil { + return nil, err + } + return forTupleUnpack(t, output[begin:]) + } else { + return forTupleUnpack(t, output[index:]) + } case SliceTy: - return forEachUnpack(t, output, begin, end) + return forEachUnpack(t, output[begin:], 0, length) case ArrayTy: - return forEachUnpack(t, output, index, t.Size) + if isDynamicType(*t.Elem) { + offset := int64(binary.BigEndian.Uint64(returnOutput[len(returnOutput)-8:])) + return forEachUnpack(t, output[offset:], 0, t.Size) + } + return forEachUnpack(t, output[index:], 0, t.Size) case StringTy: // variable arrays are written at the end of the return bytes - return string(output[begin : begin+end]), nil + return string(output[begin : begin+length]), nil case IntTy, UintTy: return readInteger(t.T, t.Kind, returnOutput), nil case BoolTy: @@ -209,7 +238,7 @@ func toGoType(index int, t Type, output []byte) (interface{}, error) { case HashTy: return common.BytesToHash(returnOutput), nil case BytesTy: - return output[begin : begin+end], nil + return output[begin : begin+length], nil case FixedBytesTy: return readFixedBytes(t, returnOutput) case FunctionTy: @@ -240,7 +269,7 @@ func lengthPrefixPointsTo(index int, output []byte) (start int, length int, err totalSize.Add(totalSize, bigOffsetEnd) totalSize.Add(totalSize, lengthBig) if totalSize.BitLen() > 63 { - return 0, 0, fmt.Errorf("abi length larger than int64: %v", totalSize) + return 0, 0, fmt.Errorf("abi: length larger than int64: %v", totalSize) } if totalSize.Cmp(outputLength) > 0 { @@ -250,3 +279,17 @@ func lengthPrefixPointsTo(index int, output []byte) (start int, length int, err length = int(lengthBig.Uint64()) return } + +// tuplePointsTo resolves the location reference for dynamic tuple. +func tuplePointsTo(index int, output []byte) (start int, err error) { + offset := big.NewInt(0).SetBytes(output[index : index+32]) + outputLen := big.NewInt(int64(len(output))) + + if offset.Cmp(big.NewInt(int64(len(output)))) > 0 { + return 0, fmt.Errorf("abi: cannot marshal in to go slice: offset %v would go over slice boundary (len=%v)", offset, outputLen) + } + if offset.BitLen() > 63 { + return 0, fmt.Errorf("abi offset larger than int64: %v", offset) + } + return int(offset.Uint64()), nil +} diff --git a/accounts/abi/unpack_test.go b/accounts/abi/unpack_test.go index 97552b90cff0..c85b86d8c004 100644 --- a/accounts/abi/unpack_test.go +++ b/accounts/abi/unpack_test.go @@ -173,9 +173,14 @@ var unpackTests = []unpackTest{ // multi dimensional, if these pass, all types that don't require length prefix should pass { def: `[{"type": "uint8[][]"}]`, - enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", want: [][]uint8{{1, 2}, {1, 2}}, }, + { + def: `[{"type": "uint8[][]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", + want: [][]uint8{{1, 2}, {1, 2, 3}}, + }, { def: `[{"type": "uint8[2][2]"}]`, enc: "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", @@ -183,7 +188,7 @@ var unpackTests = []unpackTest{ }, { def: `[{"type": "uint8[][2]"}]`, - enc: "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", want: [2][]uint8{{1}, {1}}, }, { @@ -191,6 +196,11 @@ var unpackTests = []unpackTest{ enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", want: [][2]uint8{{1, 2}}, }, + { + def: `[{"type": "uint8[2][]"}]`, + enc: "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: [][2]uint8{{1, 2}, {1, 2}}, + }, { def: `[{"type": "uint16[]"}]`, enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", @@ -236,6 +246,26 @@ var unpackTests = []unpackTest{ enc: "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", want: [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, }, + { + def: `[{"type": "string[4]"}]`, + enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005576f726c64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b476f2d657468657265756d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008457468657265756d000000000000000000000000000000000000000000000000", + want: [4]string{"Hello", "World", "Go-ethereum", "Ethereum"}, + }, + { + def: `[{"type": "string[]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008457468657265756d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b676f2d657468657265756d000000000000000000000000000000000000000000", + want: []string{"Ethereum", "go-ethereum"}, + }, + { + def: `[{"type": "bytes[]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003f0f0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f0f0f00000000000000000000000000000000000000000000000000000000000", + want: [][]byte{{0xf0, 0xf0, 0xf0}, {0xf0, 0xf0, 0xf0}}, + }, + { + def: `[{"type": "uint256[2][][]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003e8", + want: [][][2]*big.Int{{{big.NewInt(1), big.NewInt(200)}, {big.NewInt(1), big.NewInt(1000)}}, {{big.NewInt(1), big.NewInt(200)}, {big.NewInt(1), big.NewInt(1000)}}}, + }, { def: `[{"type": "int8[]"}]`, enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", @@ -295,6 +325,53 @@ var unpackTests = []unpackTest{ Int2 *big.Int }{big.NewInt(1), big.NewInt(2)}, }, + { + def: `[{"name":"int_one","type":"int256"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: struct { + IntOne *big.Int + }{big.NewInt(1)}, + }, + { + def: `[{"name":"int__one","type":"int256"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: struct { + IntOne *big.Int + }{big.NewInt(1)}, + }, + { + def: `[{"name":"int_one_","type":"int256"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: struct { + IntOne *big.Int + }{big.NewInt(1)}, + }, + { + def: `[{"name":"int_one","type":"int256"}, {"name":"intone","type":"int256"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: struct { + IntOne *big.Int + Intone *big.Int + }{big.NewInt(1), big.NewInt(2)}, + }, + { + def: `[{"name":"___","type":"int256"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: struct { + IntOne *big.Int + Intone *big.Int + }{}, + err: "abi: purely underscored output cannot unpack to struct", + }, + { + def: `[{"name":"int_one","type":"int256"},{"name":"IntOne","type":"int256"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", + want: struct { + Int1 *big.Int + Int2 *big.Int + }{}, + err: "abi: multiple outputs mapping to the same struct field 'IntOne'", + }, { def: `[{"name":"int","type":"int256"},{"name":"Int","type":"int256"}]`, enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", @@ -359,6 +436,55 @@ func TestUnpack(t *testing.T) { } } +func TestUnpackSetDynamicArrayOutput(t *testing.T) { + abi, err := JSON(strings.NewReader(`[{"constant":true,"inputs":[],"name":"testDynamicFixedBytes15","outputs":[{"name":"","type":"bytes15[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"testDynamicFixedBytes32","outputs":[{"name":"","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"}]`)) + if err != nil { + t.Fatal(err) + } + + var ( + marshalledReturn32 = common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000230783132333435363738393000000000000000000000000000000000000000003078303938373635343332310000000000000000000000000000000000000000") + marshalledReturn15 = common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000230783031323334350000000000000000000000000000000000000000000000003078393837363534000000000000000000000000000000000000000000000000") + + out32 [][32]byte + out15 [][15]byte + ) + + // test 32 + err = abi.Unpack(&out32, "testDynamicFixedBytes32", marshalledReturn32) + if err != nil { + t.Fatal(err) + } + if len(out32) != 2 { + t.Fatalf("expected array with 2 values, got %d", len(out32)) + } + expected := common.Hex2Bytes("3078313233343536373839300000000000000000000000000000000000000000") + if !bytes.Equal(out32[0][:], expected) { + t.Errorf("expected %x, got %x\n", expected, out32[0]) + } + expected = common.Hex2Bytes("3078303938373635343332310000000000000000000000000000000000000000") + if !bytes.Equal(out32[1][:], expected) { + t.Errorf("expected %x, got %x\n", expected, out32[1]) + } + + // test 15 + err = abi.Unpack(&out15, "testDynamicFixedBytes32", marshalledReturn15) + if err != nil { + t.Fatal(err) + } + if len(out15) != 2 { + t.Fatalf("expected array with 2 values, got %d", len(out15)) + } + expected = common.Hex2Bytes("307830313233343500000000000000") + if !bytes.Equal(out15[0][:], expected) { + t.Errorf("expected %x, got %x\n", expected, out15[0]) + } + expected = common.Hex2Bytes("307839383736353400000000000000") + if !bytes.Equal(out15[1][:], expected) { + t.Errorf("expected %x, got %x\n", expected, out15[1]) + } +} + type methodMultiOutput struct { Int *big.Int String string @@ -386,6 +512,11 @@ func TestMethodMultiReturn(t *testing.T) { Int *big.Int } + newInterfaceSlice := func(len int) interface{} { + slice := make([]interface{}, len) + return &slice + } + abi, data, expected := methodMultiReturn(require.New(t)) bigint := new(big.Int) var testCases = []struct { @@ -413,6 +544,16 @@ func TestMethodMultiReturn(t *testing.T) { &[2]interface{}{&expected.Int, &expected.String}, "", "Can unpack into an array", + }, { + &[2]interface{}{}, + &[2]interface{}{expected.Int, expected.String}, + "", + "Can unpack into interface array", + }, { + newInterfaceSlice(2), + &[]interface{}{expected.Int, expected.String}, + "", + "Can unpack into interface slice", }, { &[]interface{}{new(int), new(int)}, &[]interface{}{&expected.Int, &expected.String}, @@ -462,6 +603,68 @@ func TestMultiReturnWithArray(t *testing.T) { } } +func TestMultiReturnWithStringArray(t *testing.T) { + const definition = `[{"name" : "multi", "outputs": [{"name": "","type": "uint256[3]"},{"name": "","type": "address"},{"name": "","type": "string[2]"},{"name": "","type": "bool"}]}]` + abi, err := JSON(strings.NewReader(definition)) + if err != nil { + t.Fatal(err) + } + buff := new(bytes.Buffer) + buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000005c1b78ea0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000001a055690d9db80000000000000000000000000000ab1257528b3782fb40d7ed5f72e624b744dffb2f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008457468657265756d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001048656c6c6f2c20457468657265756d2100000000000000000000000000000000")) + temp, _ := big.NewInt(0).SetString("30000000000000000000", 10) + ret1, ret1Exp := new([3]*big.Int), [3]*big.Int{big.NewInt(1545304298), big.NewInt(6), temp} + ret2, ret2Exp := new(common.Address), common.HexToAddress("ab1257528b3782fb40d7ed5f72e624b744dffb2f") + ret3, ret3Exp := new([2]string), [2]string{"Ethereum", "Hello, Ethereum!"} + ret4, ret4Exp := new(bool), false + if err := abi.Unpack(&[]interface{}{ret1, ret2, ret3, ret4}, "multi", buff.Bytes()); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(*ret1, ret1Exp) { + t.Error("big.Int array result", *ret1, "!= Expected", ret1Exp) + } + if !reflect.DeepEqual(*ret2, ret2Exp) { + t.Error("address result", *ret2, "!= Expected", ret2Exp) + } + if !reflect.DeepEqual(*ret3, ret3Exp) { + t.Error("string array result", *ret3, "!= Expected", ret3Exp) + } + if !reflect.DeepEqual(*ret4, ret4Exp) { + t.Error("bool result", *ret4, "!= Expected", ret4Exp) + } +} + +func TestMultiReturnWithStringSlice(t *testing.T) { + const definition = `[{"name" : "multi", "outputs": [{"name": "","type": "string[]"},{"name": "","type": "uint256[]"}]}]` + abi, err := JSON(strings.NewReader(definition)) + if err != nil { + t.Fatal(err) + } + buff := new(bytes.Buffer) + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) // output[0] offset + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000120")) // output[1] offset + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // output[0] length + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) // output[0][0] offset + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000080")) // output[0][1] offset + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000008")) // output[0][0] length + buff.Write(common.Hex2Bytes("657468657265756d000000000000000000000000000000000000000000000000")) // output[0][0] value + buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000b")) // output[0][1] length + buff.Write(common.Hex2Bytes("676f2d657468657265756d000000000000000000000000000000000000000000")) // output[0][1] value + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // output[1] length + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000064")) // output[1][0] value + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000065")) // output[1][1] value + ret1, ret1Exp := new([]string), []string{"ethereum", "go-ethereum"} + ret2, ret2Exp := new([]*big.Int), []*big.Int{big.NewInt(100), big.NewInt(101)} + if err := abi.Unpack(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(*ret1, ret1Exp) { + t.Error("string slice result", *ret1, "!= Expected", ret1Exp) + } + if !reflect.DeepEqual(*ret2, ret2Exp) { + t.Error("uint256 slice result", *ret2, "!= Expected", ret2Exp) + } +} + func TestMultiReturnWithDeeplyNestedArray(t *testing.T) { // Similar to TestMultiReturnWithArray, but with a special case in mind: // values of nested static arrays count towards the size as well, and any element following @@ -751,6 +954,104 @@ func TestUnmarshal(t *testing.T) { } } +func TestUnpackTuple(t *testing.T) { + const simpleTuple = `[{"name":"tuple","constant":false,"outputs":[{"type":"tuple","name":"ret","components":[{"type":"int256","name":"a"},{"type":"int256","name":"b"}]}]}]` + abi, err := JSON(strings.NewReader(simpleTuple)) + if err != nil { + t.Fatal(err) + } + buff := new(bytes.Buffer) + + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // ret[a] = 1 + buff.Write(common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")) // ret[b] = -1 + + // If the result is single tuple, use struct as return value container directly. + v := struct { + A *big.Int + B *big.Int + }{new(big.Int), new(big.Int)} + + err = abi.Unpack(&v, "tuple", buff.Bytes()) + if err != nil { + t.Error(err) + } else { + if v.A.Cmp(big.NewInt(1)) != 0 { + t.Errorf("unexpected value unpacked: want %x, got %x", 1, v.A) + } + if v.B.Cmp(big.NewInt(-1)) != 0 { + t.Errorf("unexpected value unpacked: want %x, got %x", v.B, -1) + } + } + + // Test nested tuple + const nestedTuple = `[{"name":"tuple","constant":false,"outputs":[ + {"type":"tuple","name":"s","components":[{"type":"uint256","name":"a"},{"type":"uint256[]","name":"b"},{"type":"tuple[]","name":"c","components":[{"name":"x", "type":"uint256"},{"name":"y","type":"uint256"}]}]}, + {"type":"tuple","name":"t","components":[{"name":"x", "type":"uint256"},{"name":"y","type":"uint256"}]}, + {"type":"uint256","name":"a"} + ]}]` + + abi, err = JSON(strings.NewReader(nestedTuple)) + if err != nil { + t.Fatal(err) + } + buff.Reset() + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000080")) // s offset + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000")) // t.X = 0 + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // t.Y = 1 + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // a = 1 + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // s.A = 1 + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000060")) // s.B offset + buff.Write(common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000000000c0")) // s.C offset + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.B length + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // s.B[0] = 1 + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.B[0] = 2 + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.C length + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // s.C[0].X + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.C[0].Y + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.C[1].X + buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // s.C[1].Y + + type T struct { + X *big.Int `abi:"x"` + Z *big.Int `abi:"y"` // Test whether the abi tag works. + } + + type S struct { + A *big.Int + B []*big.Int + C []T + } + + type Ret struct { + FieldS S `abi:"s"` + FieldT T `abi:"t"` + A *big.Int + } + var ret Ret + var expected = Ret{ + FieldS: S{ + A: big.NewInt(1), + B: []*big.Int{big.NewInt(1), big.NewInt(2)}, + C: []T{ + {big.NewInt(1), big.NewInt(2)}, + {big.NewInt(2), big.NewInt(1)}, + }, + }, + FieldT: T{ + big.NewInt(0), big.NewInt(1), + }, + A: big.NewInt(1), + } + + err = abi.Unpack(&ret, "tuple", buff.Bytes()) + if err != nil { + t.Error(err) + } + if reflect.DeepEqual(ret, expected) { + t.Error("unexpected unpack value") + } +} + func TestOOMMaliciousInput(t *testing.T) { oomTests := []unpackTest{ { diff --git a/accounts/accounts.go b/accounts/accounts.go index cb1eae281587..bf5190ad98f7 100644 --- a/accounts/accounts.go +++ b/accounts/accounts.go @@ -18,12 +18,14 @@ package accounts import ( + "fmt" "math/big" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "golang.org/x/crypto/sha3" ) // Account represents an Ethereum account located at a specific location defined @@ -33,6 +35,13 @@ type Account struct { URL URL `json:"url"` // Optional resource locator within a backend } +const ( + MimetypeDataWithValidator = "data/validator" + MimetypeTypedData = "data/typed" + MimetypeClique = "application/x-clique-header" + MimetypeTextPlain = "text/plain" +) + // Wallet represents a software or hardware wallet that might contain one or more // accounts (derived from the same seed). type Wallet interface { @@ -83,12 +92,34 @@ type Wallet interface { // opposed to decending into a child path to allow discovering accounts starting // from non zero components. // + // Some hardware wallets switched derivation paths through their evolution, so + // this method supports providing multiple bases to discover old user accounts + // too. Only the last base will be used to derive the next empty account. + // // You can disable automatic account discovery by calling SelfDerive with a nil // chain state reader. - SelfDerive(base DerivationPath, chain ethereum.ChainStateReader) + SelfDerive(bases []DerivationPath, chain ethereum.ChainStateReader) - // SignHash requests the wallet to sign the given hash. + // SignData requests the wallet to sign the hash of the given data + // It looks up the account specified either solely via its address contained within, + // or optionally with the aid of any location metadata from the embedded URL field. // + // If the wallet requires additional authentication to sign the request (e.g. + // a password to decrypt the account, or a PIN code o verify the transaction), + // an AuthNeededError instance will be returned, containing infos for the user + // about which fields or actions are needed. The user may retry by providing + // the needed details via SignDataWithPassphrase, or by other means (e.g. unlock + // the account in a keystore). + SignData(account Account, mimeType string, data []byte) ([]byte, error) + + // SignDataWithPassphrase is identical to SignData, but also takes a password + // NOTE: there's an chance that an erroneous call might mistake the two strings, and + // supply password in the mimetype field, or vice versa. Thus, an implementation + // should never echo the mimetype or return the mimetype in the error-response + SignDataWithPassphrase(account Account, passphrase, mimeType string, data []byte) ([]byte, error) + + // SignText requests the wallet to sign the hash of a given piece of data, prefixed + // by the Ethereum prefix scheme // It looks up the account specified either solely via its address contained within, // or optionally with the aid of any location metadata from the embedded URL field. // @@ -98,7 +129,10 @@ type Wallet interface { // about which fields or actions are needed. The user may retry by providing // the needed details via SignHashWithPassphrase, or by other means (e.g. unlock // the account in a keystore). - SignHash(account Account, hash []byte) ([]byte, error) + SignText(account Account, text []byte) ([]byte, error) + + // SignTextWithPassphrase is identical to Signtext, but also takes a password + SignTextWithPassphrase(account Account, passphrase string, hash []byte) ([]byte, error) // SignTx requests the wallet to sign the given transaction. // @@ -113,18 +147,7 @@ type Wallet interface { // the account in a keystore). SignTx(account Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) - // SignHashWithPassphrase requests the wallet to sign the given hash with the - // given passphrase as extra authentication information. - // - // It looks up the account specified either solely via its address contained within, - // or optionally with the aid of any location metadata from the embedded URL field. - SignHashWithPassphrase(account Account, passphrase string, hash []byte) ([]byte, error) - - // SignTxWithPassphrase requests the wallet to sign the given transaction, with the - // given passphrase as extra authentication information. - // - // It looks up the account specified either solely via its address contained within, - // or optionally with the aid of any location metadata from the embedded URL field. + // SignTxWithPassphrase is identical to SignTx, but also takes a password SignTxWithPassphrase(account Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) } @@ -148,6 +171,32 @@ type Backend interface { Subscribe(sink chan<- WalletEvent) event.Subscription } +// TextHash is a helper function that calculates a hash for the given message that can be +// safely used to calculate a signature from. +// +// The hash is calulcated as +// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). +// +// This gives context to the signed message and prevents signing of transactions. +func TextHash(data []byte) []byte { + hash, _ := TextAndHash(data) + return hash +} + +// TextAndHash is a helper function that calculates a hash for the given message that can be +// safely used to calculate a signature from. +// +// The hash is calulcated as +// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). +// +// This gives context to the signed message and prevents signing of transactions. +func TextAndHash(data []byte) ([]byte, string) { + msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), string(data)) + hasher := sha3.NewLegacyKeccak256() + hasher.Write([]byte(msg)) + return hasher.Sum(nil), msg +} + // WalletEventType represents the different event types that can be fired by // the wallet subscription subsystem. type WalletEventType int diff --git a/accounts/accounts_test.go b/accounts/accounts_test.go new file mode 100644 index 000000000000..e8274f9f0408 --- /dev/null +++ b/accounts/accounts_test.go @@ -0,0 +1,32 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package accounts + +import ( + "bytes" + "testing" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +func TestTextHash(t *testing.T) { + hash := TextHash([]byte("Hello Joe")) + want := hexutil.MustDecode("0xa080337ae51c4e064c189e113edd0ba391df9206e2f49db658bb32cf2911730b") + if !bytes.Equal(hash, want) { + t.Fatalf("wrong hash: %x", hash) + } +} diff --git a/accounts/external/backend.go b/accounts/external/backend.go new file mode 100644 index 000000000000..371273762f52 --- /dev/null +++ b/accounts/external/backend.go @@ -0,0 +1,231 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package external + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/signer/core" +) + +type ExternalBackend struct { + signers []accounts.Wallet +} + +func (eb *ExternalBackend) Wallets() []accounts.Wallet { + return eb.signers +} + +func NewExternalBackend(endpoint string) (*ExternalBackend, error) { + signer, err := NewExternalSigner(endpoint) + if err != nil { + return nil, err + } + return &ExternalBackend{ + signers: []accounts.Wallet{signer}, + }, nil +} + +func (eb *ExternalBackend) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription { + return event.NewSubscription(func(quit <-chan struct{}) error { + <-quit + return nil + }) +} + +// ExternalSigner provides an API to interact with an external signer (clef) +// It proxies request to the external signer while forwarding relevant +// request headers +type ExternalSigner struct { + client *rpc.Client + endpoint string + status string + cacheMu sync.RWMutex + cache []accounts.Account +} + +func NewExternalSigner(endpoint string) (*ExternalSigner, error) { + client, err := rpc.Dial(endpoint) + if err != nil { + return nil, err + } + extsigner := &ExternalSigner{ + client: client, + endpoint: endpoint, + } + // Check if reachable + version, err := extsigner.pingVersion() + if err != nil { + return nil, err + } + extsigner.status = fmt.Sprintf("ok [version=%v]", version) + return extsigner, nil +} + +func (api *ExternalSigner) URL() accounts.URL { + return accounts.URL{ + Scheme: "extapi", + Path: api.endpoint, + } +} + +func (api *ExternalSigner) Status() (string, error) { + return api.status, nil +} + +func (api *ExternalSigner) Open(passphrase string) error { + return fmt.Errorf("operation not supported on external signers") +} + +func (api *ExternalSigner) Close() error { + return fmt.Errorf("operation not supported on external signers") +} + +func (api *ExternalSigner) Accounts() []accounts.Account { + var accnts []accounts.Account + res, err := api.listAccounts() + if err != nil { + log.Error("account listing failed", "error", err) + return accnts + } + for _, addr := range res { + accnts = append(accnts, accounts.Account{ + URL: accounts.URL{ + Scheme: "extapi", + Path: api.endpoint, + }, + Address: addr, + }) + } + api.cacheMu.Lock() + api.cache = accnts + api.cacheMu.Unlock() + return accnts +} + +func (api *ExternalSigner) Contains(account accounts.Account) bool { + api.cacheMu.RLock() + defer api.cacheMu.RUnlock() + for _, a := range api.cache { + if a.Address == account.Address && (account.URL == (accounts.URL{}) || account.URL == api.URL()) { + return true + } + } + return false +} + +func (api *ExternalSigner) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { + return accounts.Account{}, fmt.Errorf("operation not supported on external signers") +} + +func (api *ExternalSigner) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) { + log.Error("operation SelfDerive not supported on external signers") +} + +func (api *ExternalSigner) signHash(account accounts.Account, hash []byte) ([]byte, error) { + return []byte{}, fmt.Errorf("operation not supported on external signers") +} + +// SignData signs keccak256(data). The mimetype parameter describes the type of data being signed +func (api *ExternalSigner) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) { + var res hexutil.Bytes + var signAddress = common.NewMixedcaseAddress(account.Address) + if err := api.client.Call(&res, "account_signData", + mimeType, + &signAddress, // Need to use the pointer here, because of how MarshalJSON is defined + hexutil.Encode(data)); err != nil { + return nil, err + } + // If V is on 27/28-form, convert to to 0/1 for Clique + if mimeType == accounts.MimetypeClique && (res[64] == 27 || res[64] == 28) { + res[64] -= 27 // Transform V from 27/28 to 0/1 for Clique use + } + return res, nil +} + +func (api *ExternalSigner) SignText(account accounts.Account, text []byte) ([]byte, error) { + var res hexutil.Bytes + var signAddress = common.NewMixedcaseAddress(account.Address) + if err := api.client.Call(&res, "account_signData", + accounts.MimetypeTextPlain, + &signAddress, // Need to use the pointer here, because of how MarshalJSON is defined + hexutil.Encode(text)); err != nil { + return nil, err + } + return res, nil +} + +func (api *ExternalSigner) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + res := ethapi.SignTransactionResult{} + data := hexutil.Bytes(tx.Data()) + var to *common.MixedcaseAddress + if tx.To() != nil { + t := common.NewMixedcaseAddress(*tx.To()) + to = &t + } + args := &core.SendTxArgs{ + Data: &data, + Nonce: hexutil.Uint64(tx.Nonce()), + Value: hexutil.Big(*tx.Value()), + Gas: hexutil.Uint64(tx.Gas()), + GasPrice: hexutil.Big(*tx.GasPrice()), + To: to, + From: common.NewMixedcaseAddress(account.Address), + } + if err := api.client.Call(&res, "account_signTransaction", args); err != nil { + return nil, err + } + return res.Tx, nil +} + +func (api *ExternalSigner) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error) { + return []byte{}, fmt.Errorf("passphrase-operations not supported on external signers") +} + +func (api *ExternalSigner) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + return nil, fmt.Errorf("passphrase-operations not supported on external signers") +} +func (api *ExternalSigner) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) { + return nil, fmt.Errorf("passphrase-operations not supported on external signers") +} + +func (api *ExternalSigner) listAccounts() ([]common.Address, error) { + var res []common.Address + if err := api.client.Call(&res, "account_list"); err != nil { + return nil, err + } + return res, nil +} + +func (api *ExternalSigner) pingVersion() (string, error) { + var v string + if err := api.client.Call(&v, "account_version"); err != nil { + return "", err + } + return v, nil +} diff --git a/accounts/hd.go b/accounts/hd.go index 277f688e48e7..75c47611061c 100644 --- a/accounts/hd.go +++ b/accounts/hd.go @@ -17,6 +17,7 @@ package accounts import ( + "encoding/json" "errors" "fmt" "math" @@ -30,14 +31,14 @@ import ( var DefaultRootDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} // DefaultBaseDerivationPath is the base path from which custom derivation endpoints -// are incremented. As such, the first account will be at m/44'/60'/0'/0, the second -// at m/44'/60'/0'/1, etc. +// are incremented. As such, the first account will be at m/44'/60'/0'/0/0, the second +// at m/44'/60'/0'/0/1, etc. var DefaultBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0} -// DefaultLedgerBaseDerivationPath is the base path from which custom derivation endpoints -// are incremented. As such, the first account will be at m/44'/60'/0'/0, the second -// at m/44'/60'/0'/1, etc. -var DefaultLedgerBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} +// LegacyLedgerBaseDerivationPath is the legacy base path from which custom derivation +// endpoints are incremented. As such, the first account will be at m/44'/60'/0'/0, the +// second at m/44'/60'/0'/1, etc. +var LegacyLedgerBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} // DerivationPath represents the computer friendly version of a hierarchical // deterministic wallet account derivaion path. @@ -133,3 +134,19 @@ func (path DerivationPath) String() string { } return result } + +// MarshalJSON turns a derivation path into its json-serialized string +func (path DerivationPath) MarshalJSON() ([]byte, error) { + return json.Marshal(path.String()) +} + +// UnmarshalJSON a json-serialized string back into a derivation path +func (path *DerivationPath) UnmarshalJSON(b []byte) error { + var dp string + var err error + if err = json.Unmarshal(b, &dp); err != nil { + return err + } + *path, err = ParseDerivationPath(dp) + return err +} diff --git a/accounts/keystore/account_cache.go b/accounts/keystore/account_cache.go index da3a46eb8090..8f660e282f57 100644 --- a/accounts/keystore/account_cache.go +++ b/accounts/keystore/account_cache.go @@ -265,7 +265,10 @@ func (ac *accountCache) scanAccounts() error { case (addr == common.Address{}): log.Debug("Failed to decode keystore key", "path", path, "err", "missing or zero address") default: - return &accounts.Account{Address: addr, URL: accounts.URL{Scheme: KeyStoreScheme, Path: path}} + return &accounts.Account{ + Address: addr, + URL: accounts.URL{Scheme: KeyStoreScheme, Path: path}, + } } return nil } diff --git a/accounts/keystore/key.go b/accounts/keystore/key.go index 9e3e4856c496..84d8df0c5aab 100644 --- a/accounts/keystore/key.go +++ b/accounts/keystore/key.go @@ -66,19 +66,19 @@ type plainKeyJSON struct { type encryptedKeyJSONV3 struct { Address string `json:"address"` - Crypto cryptoJSON `json:"crypto"` + Crypto CryptoJSON `json:"crypto"` Id string `json:"id"` Version int `json:"version"` } type encryptedKeyJSONV1 struct { Address string `json:"address"` - Crypto cryptoJSON `json:"crypto"` + Crypto CryptoJSON `json:"crypto"` Id string `json:"id"` Version string `json:"version"` } -type cryptoJSON struct { +type CryptoJSON struct { Cipher string `json:"cipher"` CipherText string `json:"ciphertext"` CipherParams cipherparamsJSON `json:"cipherparams"` @@ -171,7 +171,10 @@ func storeNewKey(ks keyStore, rand io.Reader, auth string) (*Key, accounts.Accou if err != nil { return nil, accounts.Account{}, err } - a := accounts.Account{Address: key.Address, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.JoinPath(keyFileName(key.Address))}} + a := accounts.Account{ + Address: key.Address, + URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.JoinPath(keyFileName(key.Address))}, + } if err := ks.StoreKey(a.URL.Path, key, auth); err != nil { zeroKey(key.PrivateKey) return nil, a, err @@ -224,5 +227,6 @@ func toISO8601(t time.Time) string { } else { tz = fmt.Sprintf("%03d00", offset/3600) } - return fmt.Sprintf("%04d-%02d-%02dT%02d-%02d-%02d.%09d%s", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), tz) + return fmt.Sprintf("%04d-%02d-%02dT%02d-%02d-%02d.%09d%s", + t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), tz) } diff --git a/accounts/keystore/keystore.go b/accounts/keystore/keystore.go index 2918047ccd4b..434e035048b3 100644 --- a/accounts/keystore/keystore.go +++ b/accounts/keystore/keystore.go @@ -137,8 +137,10 @@ func (ks *KeyStore) refreshWallets() { accs := ks.cache.accounts() // Transform the current list of wallets into the new one - wallets := make([]accounts.Wallet, 0, len(accs)) - events := []accounts.WalletEvent{} + var ( + wallets = make([]accounts.Wallet, 0, len(accs)) + events []accounts.WalletEvent + ) for _, account := range accs { // Drop wallets while they were in front of the next account diff --git a/accounts/keystore/keystore_passphrase.go b/accounts/keystore/keystore_passphrase.go deleted file mode 100644 index 5aa3a6bbd84b..000000000000 --- a/accounts/keystore/keystore_passphrase.go +++ /dev/null @@ -1,342 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -/* - -This key store behaves as KeyStorePlain with the difference that -the private key is encrypted and on disk uses another JSON encoding. - -The crypto is documented at https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition - -*/ - -package keystore - -import ( - "bytes" - "crypto/aes" - "crypto/rand" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/crypto" - "github.com/pborman/uuid" - "golang.org/x/crypto/pbkdf2" - "golang.org/x/crypto/scrypt" -) - -const ( - keyHeaderKDF = "scrypt" - - // StandardScryptN is the N parameter of Scrypt encryption algorithm, using 256MB - // memory and taking approximately 1s CPU time on a modern processor. - StandardScryptN = 1 << 18 - - // StandardScryptP is the P parameter of Scrypt encryption algorithm, using 256MB - // memory and taking approximately 1s CPU time on a modern processor. - StandardScryptP = 1 - - // LightScryptN is the N parameter of Scrypt encryption algorithm, using 4MB - // memory and taking approximately 100ms CPU time on a modern processor. - LightScryptN = 1 << 12 - - // LightScryptP is the P parameter of Scrypt encryption algorithm, using 4MB - // memory and taking approximately 100ms CPU time on a modern processor. - LightScryptP = 6 - - scryptR = 8 - scryptDKLen = 32 -) - -type keyStorePassphrase struct { - keysDirPath string - scryptN int - scryptP int - // skipKeyFileVerification disables the security-feature which does - // reads and decrypts any newly created keyfiles. This should be 'false' in all - // cases except tests -- setting this to 'true' is not recommended. - skipKeyFileVerification bool -} - -func (ks keyStorePassphrase) GetKey(addr common.Address, filename, auth string) (*Key, error) { - // Load the key from the keystore and decrypt its contents - keyjson, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - key, err := DecryptKey(keyjson, auth) - if err != nil { - return nil, err - } - // Make sure we're really operating on the requested key (no swap attacks) - if key.Address != addr { - return nil, fmt.Errorf("key content mismatch: have account %x, want %x", key.Address, addr) - } - return key, nil -} - -// StoreKey generates a key, encrypts with 'auth' and stores in the given directory -func StoreKey(dir, auth string, scryptN, scryptP int) (common.Address, error) { - _, a, err := storeNewKey(&keyStorePassphrase{dir, scryptN, scryptP, false}, rand.Reader, auth) - return a.Address, err -} - -func (ks keyStorePassphrase) StoreKey(filename string, key *Key, auth string) error { - keyjson, err := EncryptKey(key, auth, ks.scryptN, ks.scryptP) - if err != nil { - return err - } - // Write into temporary file - tmpName, err := writeTemporaryKeyFile(filename, keyjson) - if err != nil { - return err - } - if !ks.skipKeyFileVerification { - // Verify that we can decrypt the file with the given password. - _, err = ks.GetKey(key.Address, tmpName, auth) - if err != nil { - msg := "An error was encountered when saving and verifying the keystore file. \n" + - "This indicates that the keystore is corrupted. \n" + - "The corrupted file is stored at \n%v\n" + - "Please file a ticket at:\n\n" + - "https://github.com/ethereum/go-ethereum/issues." + - "The error was : %s" - return fmt.Errorf(msg, tmpName, err) - } - } - return os.Rename(tmpName, filename) -} - -func (ks keyStorePassphrase) JoinPath(filename string) string { - if filepath.IsAbs(filename) { - return filename - } - return filepath.Join(ks.keysDirPath, filename) -} - -// EncryptKey encrypts a key using the specified scrypt parameters into a json -// blob that can be decrypted later on. -func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) { - authArray := []byte(auth) - - salt := make([]byte, 32) - if _, err := io.ReadFull(rand.Reader, salt); err != nil { - panic("reading from crypto/rand failed: " + err.Error()) - } - derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen) - if err != nil { - return nil, err - } - encryptKey := derivedKey[:16] - keyBytes := math.PaddedBigBytes(key.PrivateKey.D, 32) - - iv := make([]byte, aes.BlockSize) // 16 - if _, err := io.ReadFull(rand.Reader, iv); err != nil { - panic("reading from crypto/rand failed: " + err.Error()) - } - cipherText, err := aesCTRXOR(encryptKey, keyBytes, iv) - if err != nil { - return nil, err - } - mac := crypto.Keccak256(derivedKey[16:32], cipherText) - - scryptParamsJSON := make(map[string]interface{}, 5) - scryptParamsJSON["n"] = scryptN - scryptParamsJSON["r"] = scryptR - scryptParamsJSON["p"] = scryptP - scryptParamsJSON["dklen"] = scryptDKLen - scryptParamsJSON["salt"] = hex.EncodeToString(salt) - - cipherParamsJSON := cipherparamsJSON{ - IV: hex.EncodeToString(iv), - } - - cryptoStruct := cryptoJSON{ - Cipher: "aes-128-ctr", - CipherText: hex.EncodeToString(cipherText), - CipherParams: cipherParamsJSON, - KDF: keyHeaderKDF, - KDFParams: scryptParamsJSON, - MAC: hex.EncodeToString(mac), - } - encryptedKeyJSONV3 := encryptedKeyJSONV3{ - hex.EncodeToString(key.Address[:]), - cryptoStruct, - key.Id.String(), - version, - } - return json.Marshal(encryptedKeyJSONV3) -} - -// DecryptKey decrypts a key from a json blob, returning the private key itself. -func DecryptKey(keyjson []byte, auth string) (*Key, error) { - // Parse the json into a simple map to fetch the key version - m := make(map[string]interface{}) - if err := json.Unmarshal(keyjson, &m); err != nil { - return nil, err - } - // Depending on the version try to parse one way or another - var ( - keyBytes, keyId []byte - err error - ) - if version, ok := m["version"].(string); ok && version == "1" { - k := new(encryptedKeyJSONV1) - if err := json.Unmarshal(keyjson, k); err != nil { - return nil, err - } - keyBytes, keyId, err = decryptKeyV1(k, auth) - } else { - k := new(encryptedKeyJSONV3) - if err := json.Unmarshal(keyjson, k); err != nil { - return nil, err - } - keyBytes, keyId, err = decryptKeyV3(k, auth) - } - // Handle any decryption errors and return the key - if err != nil { - return nil, err - } - key := crypto.ToECDSAUnsafe(keyBytes) - - return &Key{ - Id: uuid.UUID(keyId), - Address: crypto.PubkeyToAddress(key.PublicKey), - PrivateKey: key, - }, nil -} - -func decryptKeyV3(keyProtected *encryptedKeyJSONV3, auth string) (keyBytes []byte, keyId []byte, err error) { - if keyProtected.Version != version { - return nil, nil, fmt.Errorf("Version not supported: %v", keyProtected.Version) - } - - if keyProtected.Crypto.Cipher != "aes-128-ctr" { - return nil, nil, fmt.Errorf("Cipher not supported: %v", keyProtected.Crypto.Cipher) - } - - keyId = uuid.Parse(keyProtected.Id) - mac, err := hex.DecodeString(keyProtected.Crypto.MAC) - if err != nil { - return nil, nil, err - } - - iv, err := hex.DecodeString(keyProtected.Crypto.CipherParams.IV) - if err != nil { - return nil, nil, err - } - - cipherText, err := hex.DecodeString(keyProtected.Crypto.CipherText) - if err != nil { - return nil, nil, err - } - - derivedKey, err := getKDFKey(keyProtected.Crypto, auth) - if err != nil { - return nil, nil, err - } - - calculatedMAC := crypto.Keccak256(derivedKey[16:32], cipherText) - if !bytes.Equal(calculatedMAC, mac) { - return nil, nil, ErrDecrypt - } - - plainText, err := aesCTRXOR(derivedKey[:16], cipherText, iv) - if err != nil { - return nil, nil, err - } - return plainText, keyId, err -} - -func decryptKeyV1(keyProtected *encryptedKeyJSONV1, auth string) (keyBytes []byte, keyId []byte, err error) { - keyId = uuid.Parse(keyProtected.Id) - mac, err := hex.DecodeString(keyProtected.Crypto.MAC) - if err != nil { - return nil, nil, err - } - - iv, err := hex.DecodeString(keyProtected.Crypto.CipherParams.IV) - if err != nil { - return nil, nil, err - } - - cipherText, err := hex.DecodeString(keyProtected.Crypto.CipherText) - if err != nil { - return nil, nil, err - } - - derivedKey, err := getKDFKey(keyProtected.Crypto, auth) - if err != nil { - return nil, nil, err - } - - calculatedMAC := crypto.Keccak256(derivedKey[16:32], cipherText) - if !bytes.Equal(calculatedMAC, mac) { - return nil, nil, ErrDecrypt - } - - plainText, err := aesCBCDecrypt(crypto.Keccak256(derivedKey[:16])[:16], cipherText, iv) - if err != nil { - return nil, nil, err - } - return plainText, keyId, err -} - -func getKDFKey(cryptoJSON cryptoJSON, auth string) ([]byte, error) { - authArray := []byte(auth) - salt, err := hex.DecodeString(cryptoJSON.KDFParams["salt"].(string)) - if err != nil { - return nil, err - } - dkLen := ensureInt(cryptoJSON.KDFParams["dklen"]) - - if cryptoJSON.KDF == keyHeaderKDF { - n := ensureInt(cryptoJSON.KDFParams["n"]) - r := ensureInt(cryptoJSON.KDFParams["r"]) - p := ensureInt(cryptoJSON.KDFParams["p"]) - return scrypt.Key(authArray, salt, n, r, p, dkLen) - - } else if cryptoJSON.KDF == "pbkdf2" { - c := ensureInt(cryptoJSON.KDFParams["c"]) - prf := cryptoJSON.KDFParams["prf"].(string) - if prf != "hmac-sha256" { - return nil, fmt.Errorf("Unsupported PBKDF2 PRF: %s", prf) - } - key := pbkdf2.Key(authArray, salt, c, dkLen, sha256.New) - return key, nil - } - - return nil, fmt.Errorf("Unsupported KDF: %s", cryptoJSON.KDF) -} - -// TODO: can we do without this when unmarshalling dynamic JSON? -// why do integers in KDF params end up as float64 and not int after -// unmarshal? -func ensureInt(x interface{}) int { - res, ok := x.(int) - if !ok { - res = int(x.(float64)) - } - return res -} diff --git a/accounts/keystore/keystore_test.go b/accounts/keystore/keystore_test.go index 6fb0a7808870..a691c5062706 100644 --- a/accounts/keystore/keystore_test.go +++ b/accounts/keystore/keystore_test.go @@ -379,9 +379,9 @@ func tmpKeyStore(t *testing.T, encrypted bool) (string, *KeyStore) { if err != nil { t.Fatal(err) } - new := NewPlaintextKeyStore + newKs := NewPlaintextKeyStore if encrypted { - new = func(kd string) *KeyStore { return NewKeyStore(kd, veryLightScryptN, veryLightScryptP) } + newKs = func(kd string) *KeyStore { return NewKeyStore(kd, veryLightScryptN, veryLightScryptP) } } - return d, new(d) + return d, newKs(d) } diff --git a/accounts/keystore/keystore_wallet.go b/accounts/keystore/keystore_wallet.go deleted file mode 100644 index 758fdfe36438..000000000000 --- a/accounts/keystore/keystore_wallet.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package keystore - -import ( - "math/big" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/core/types" -) - -// keystoreWallet implements the accounts.Wallet interface for the original -// keystore. -type keystoreWallet struct { - account accounts.Account // Single account contained in this wallet - keystore *KeyStore // Keystore where the account originates from -} - -// URL implements accounts.Wallet, returning the URL of the account within. -func (w *keystoreWallet) URL() accounts.URL { - return w.account.URL -} - -// Status implements accounts.Wallet, returning whether the account held by the -// keystore wallet is unlocked or not. -func (w *keystoreWallet) Status() (string, error) { - w.keystore.mu.RLock() - defer w.keystore.mu.RUnlock() - - if _, ok := w.keystore.unlocked[w.account.Address]; ok { - return "Unlocked", nil - } - return "Locked", nil -} - -// Open implements accounts.Wallet, but is a noop for plain wallets since there -// is no connection or decryption step necessary to access the list of accounts. -func (w *keystoreWallet) Open(passphrase string) error { return nil } - -// Close implements accounts.Wallet, but is a noop for plain wallets since is no -// meaningful open operation. -func (w *keystoreWallet) Close() error { return nil } - -// Accounts implements accounts.Wallet, returning an account list consisting of -// a single account that the plain kestore wallet contains. -func (w *keystoreWallet) Accounts() []accounts.Account { - return []accounts.Account{w.account} -} - -// Contains implements accounts.Wallet, returning whether a particular account is -// or is not wrapped by this wallet instance. -func (w *keystoreWallet) Contains(account accounts.Account) bool { - return account.Address == w.account.Address && (account.URL == (accounts.URL{}) || account.URL == w.account.URL) -} - -// Derive implements accounts.Wallet, but is a noop for plain wallets since there -// is no notion of hierarchical account derivation for plain keystore accounts. -func (w *keystoreWallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { - return accounts.Account{}, accounts.ErrNotSupported -} - -// SelfDerive implements accounts.Wallet, but is a noop for plain wallets since -// there is no notion of hierarchical account derivation for plain keystore accounts. -func (w *keystoreWallet) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainStateReader) {} - -// SignHash implements accounts.Wallet, attempting to sign the given hash with -// the given account. If the wallet does not wrap this particular account, an -// error is returned to avoid account leakage (even though in theory we may be -// able to sign via our shared keystore backend). -func (w *keystoreWallet) SignHash(account accounts.Account, hash []byte) ([]byte, error) { - // Make sure the requested account is contained within - if account.Address != w.account.Address { - return nil, accounts.ErrUnknownAccount - } - if account.URL != (accounts.URL{}) && account.URL != w.account.URL { - return nil, accounts.ErrUnknownAccount - } - // Account seems valid, request the keystore to sign - return w.keystore.SignHash(account, hash) -} - -// SignTx implements accounts.Wallet, attempting to sign the given transaction -// with the given account. If the wallet does not wrap this particular account, -// an error is returned to avoid account leakage (even though in theory we may -// be able to sign via our shared keystore backend). -func (w *keystoreWallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { - // Make sure the requested account is contained within - if account.Address != w.account.Address { - return nil, accounts.ErrUnknownAccount - } - if account.URL != (accounts.URL{}) && account.URL != w.account.URL { - return nil, accounts.ErrUnknownAccount - } - // Account seems valid, request the keystore to sign - return w.keystore.SignTx(account, tx, chainID) -} - -// SignHashWithPassphrase implements accounts.Wallet, attempting to sign the -// given hash with the given account using passphrase as extra authentication. -func (w *keystoreWallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { - // Make sure the requested account is contained within - if account.Address != w.account.Address { - return nil, accounts.ErrUnknownAccount - } - if account.URL != (accounts.URL{}) && account.URL != w.account.URL { - return nil, accounts.ErrUnknownAccount - } - // Account seems valid, request the keystore to sign - return w.keystore.SignHashWithPassphrase(account, passphrase, hash) -} - -// SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given -// transaction with the given account using passphrase as extra authentication. -func (w *keystoreWallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { - // Make sure the requested account is contained within - if account.Address != w.account.Address { - return nil, accounts.ErrUnknownAccount - } - if account.URL != (accounts.URL{}) && account.URL != w.account.URL { - return nil, accounts.ErrUnknownAccount - } - // Account seems valid, request the keystore to sign - return w.keystore.SignTxWithPassphrase(account, passphrase, tx, chainID) -} diff --git a/accounts/keystore/passphrase.go b/accounts/keystore/passphrase.go new file mode 100644 index 000000000000..1ced41e9975b --- /dev/null +++ b/accounts/keystore/passphrase.go @@ -0,0 +1,356 @@ +// Copyright 2014 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +/* + +This key store behaves as KeyStorePlain with the difference that +the private key is encrypted and on disk uses another JSON encoding. + +The crypto is documented at https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition + +*/ + +package keystore + +import ( + "bytes" + "crypto/aes" + "crypto/rand" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/pborman/uuid" + "golang.org/x/crypto/pbkdf2" + "golang.org/x/crypto/scrypt" +) + +const ( + keyHeaderKDF = "scrypt" + + // StandardScryptN is the N parameter of Scrypt encryption algorithm, using 256MB + // memory and taking approximately 1s CPU time on a modern processor. + StandardScryptN = 1 << 18 + + // StandardScryptP is the P parameter of Scrypt encryption algorithm, using 256MB + // memory and taking approximately 1s CPU time on a modern processor. + StandardScryptP = 1 + + // LightScryptN is the N parameter of Scrypt encryption algorithm, using 4MB + // memory and taking approximately 100ms CPU time on a modern processor. + LightScryptN = 1 << 12 + + // LightScryptP is the P parameter of Scrypt encryption algorithm, using 4MB + // memory and taking approximately 100ms CPU time on a modern processor. + LightScryptP = 6 + + scryptR = 8 + scryptDKLen = 32 +) + +type keyStorePassphrase struct { + keysDirPath string + scryptN int + scryptP int + // skipKeyFileVerification disables the security-feature which does + // reads and decrypts any newly created keyfiles. This should be 'false' in all + // cases except tests -- setting this to 'true' is not recommended. + skipKeyFileVerification bool +} + +func (ks keyStorePassphrase) GetKey(addr common.Address, filename, auth string) (*Key, error) { + // Load the key from the keystore and decrypt its contents + keyjson, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + key, err := DecryptKey(keyjson, auth) + if err != nil { + return nil, err + } + // Make sure we're really operating on the requested key (no swap attacks) + if key.Address != addr { + return nil, fmt.Errorf("key content mismatch: have account %x, want %x", key.Address, addr) + } + return key, nil +} + +// StoreKey generates a key, encrypts with 'auth' and stores in the given directory +func StoreKey(dir, auth string, scryptN, scryptP int) (accounts.Account, error) { + _, a, err := storeNewKey(&keyStorePassphrase{dir, scryptN, scryptP, false}, rand.Reader, auth) + return a, err +} + +func (ks keyStorePassphrase) StoreKey(filename string, key *Key, auth string) error { + keyjson, err := EncryptKey(key, auth, ks.scryptN, ks.scryptP) + if err != nil { + return err + } + // Write into temporary file + tmpName, err := writeTemporaryKeyFile(filename, keyjson) + if err != nil { + return err + } + if !ks.skipKeyFileVerification { + // Verify that we can decrypt the file with the given password. + _, err = ks.GetKey(key.Address, tmpName, auth) + if err != nil { + msg := "An error was encountered when saving and verifying the keystore file. \n" + + "This indicates that the keystore is corrupted. \n" + + "The corrupted file is stored at \n%v\n" + + "Please file a ticket at:\n\n" + + "https://github.com/ethereum/go-ethereum/issues." + + "The error was : %s" + return fmt.Errorf(msg, tmpName, err) + } + } + return os.Rename(tmpName, filename) +} + +func (ks keyStorePassphrase) JoinPath(filename string) string { + if filepath.IsAbs(filename) { + return filename + } + return filepath.Join(ks.keysDirPath, filename) +} + +// Encryptdata encrypts the data given as 'data' with the password 'auth'. +func EncryptDataV3(data, auth []byte, scryptN, scryptP int) (CryptoJSON, error) { + + salt := make([]byte, 32) + if _, err := io.ReadFull(rand.Reader, salt); err != nil { + panic("reading from crypto/rand failed: " + err.Error()) + } + derivedKey, err := scrypt.Key(auth, salt, scryptN, scryptR, scryptP, scryptDKLen) + if err != nil { + return CryptoJSON{}, err + } + encryptKey := derivedKey[:16] + + iv := make([]byte, aes.BlockSize) // 16 + if _, err := io.ReadFull(rand.Reader, iv); err != nil { + panic("reading from crypto/rand failed: " + err.Error()) + } + cipherText, err := aesCTRXOR(encryptKey, data, iv) + if err != nil { + return CryptoJSON{}, err + } + mac := crypto.Keccak256(derivedKey[16:32], cipherText) + + scryptParamsJSON := make(map[string]interface{}, 5) + scryptParamsJSON["n"] = scryptN + scryptParamsJSON["r"] = scryptR + scryptParamsJSON["p"] = scryptP + scryptParamsJSON["dklen"] = scryptDKLen + scryptParamsJSON["salt"] = hex.EncodeToString(salt) + cipherParamsJSON := cipherparamsJSON{ + IV: hex.EncodeToString(iv), + } + + cryptoStruct := CryptoJSON{ + Cipher: "aes-128-ctr", + CipherText: hex.EncodeToString(cipherText), + CipherParams: cipherParamsJSON, + KDF: keyHeaderKDF, + KDFParams: scryptParamsJSON, + MAC: hex.EncodeToString(mac), + } + return cryptoStruct, nil +} + +// EncryptKey encrypts a key using the specified scrypt parameters into a json +// blob that can be decrypted later on. +func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) { + keyBytes := math.PaddedBigBytes(key.PrivateKey.D, 32) + cryptoStruct, err := EncryptDataV3(keyBytes, []byte(auth), scryptN, scryptP) + if err != nil { + return nil, err + } + encryptedKeyJSONV3 := encryptedKeyJSONV3{ + hex.EncodeToString(key.Address[:]), + cryptoStruct, + key.Id.String(), + version, + } + return json.Marshal(encryptedKeyJSONV3) +} + +// DecryptKey decrypts a key from a json blob, returning the private key itself. +func DecryptKey(keyjson []byte, auth string) (*Key, error) { + // Parse the json into a simple map to fetch the key version + m := make(map[string]interface{}) + if err := json.Unmarshal(keyjson, &m); err != nil { + return nil, err + } + // Depending on the version try to parse one way or another + var ( + keyBytes, keyId []byte + err error + ) + if version, ok := m["version"].(string); ok && version == "1" { + k := new(encryptedKeyJSONV1) + if err := json.Unmarshal(keyjson, k); err != nil { + return nil, err + } + keyBytes, keyId, err = decryptKeyV1(k, auth) + } else { + k := new(encryptedKeyJSONV3) + if err := json.Unmarshal(keyjson, k); err != nil { + return nil, err + } + keyBytes, keyId, err = decryptKeyV3(k, auth) + } + // Handle any decryption errors and return the key + if err != nil { + return nil, err + } + key := crypto.ToECDSAUnsafe(keyBytes) + + return &Key{ + Id: uuid.UUID(keyId), + Address: crypto.PubkeyToAddress(key.PublicKey), + PrivateKey: key, + }, nil +} + +func DecryptDataV3(cryptoJson CryptoJSON, auth string) ([]byte, error) { + if cryptoJson.Cipher != "aes-128-ctr" { + return nil, fmt.Errorf("Cipher not supported: %v", cryptoJson.Cipher) + } + mac, err := hex.DecodeString(cryptoJson.MAC) + if err != nil { + return nil, err + } + + iv, err := hex.DecodeString(cryptoJson.CipherParams.IV) + if err != nil { + return nil, err + } + + cipherText, err := hex.DecodeString(cryptoJson.CipherText) + if err != nil { + return nil, err + } + + derivedKey, err := getKDFKey(cryptoJson, auth) + if err != nil { + return nil, err + } + + calculatedMAC := crypto.Keccak256(derivedKey[16:32], cipherText) + if !bytes.Equal(calculatedMAC, mac) { + return nil, ErrDecrypt + } + + plainText, err := aesCTRXOR(derivedKey[:16], cipherText, iv) + if err != nil { + return nil, err + } + return plainText, err +} + +func decryptKeyV3(keyProtected *encryptedKeyJSONV3, auth string) (keyBytes []byte, keyId []byte, err error) { + if keyProtected.Version != version { + return nil, nil, fmt.Errorf("Version not supported: %v", keyProtected.Version) + } + keyId = uuid.Parse(keyProtected.Id) + plainText, err := DecryptDataV3(keyProtected.Crypto, auth) + if err != nil { + return nil, nil, err + } + return plainText, keyId, err +} + +func decryptKeyV1(keyProtected *encryptedKeyJSONV1, auth string) (keyBytes []byte, keyId []byte, err error) { + keyId = uuid.Parse(keyProtected.Id) + mac, err := hex.DecodeString(keyProtected.Crypto.MAC) + if err != nil { + return nil, nil, err + } + + iv, err := hex.DecodeString(keyProtected.Crypto.CipherParams.IV) + if err != nil { + return nil, nil, err + } + + cipherText, err := hex.DecodeString(keyProtected.Crypto.CipherText) + if err != nil { + return nil, nil, err + } + + derivedKey, err := getKDFKey(keyProtected.Crypto, auth) + if err != nil { + return nil, nil, err + } + + calculatedMAC := crypto.Keccak256(derivedKey[16:32], cipherText) + if !bytes.Equal(calculatedMAC, mac) { + return nil, nil, ErrDecrypt + } + + plainText, err := aesCBCDecrypt(crypto.Keccak256(derivedKey[:16])[:16], cipherText, iv) + if err != nil { + return nil, nil, err + } + return plainText, keyId, err +} + +func getKDFKey(cryptoJSON CryptoJSON, auth string) ([]byte, error) { + authArray := []byte(auth) + salt, err := hex.DecodeString(cryptoJSON.KDFParams["salt"].(string)) + if err != nil { + return nil, err + } + dkLen := ensureInt(cryptoJSON.KDFParams["dklen"]) + + if cryptoJSON.KDF == keyHeaderKDF { + n := ensureInt(cryptoJSON.KDFParams["n"]) + r := ensureInt(cryptoJSON.KDFParams["r"]) + p := ensureInt(cryptoJSON.KDFParams["p"]) + return scrypt.Key(authArray, salt, n, r, p, dkLen) + + } else if cryptoJSON.KDF == "pbkdf2" { + c := ensureInt(cryptoJSON.KDFParams["c"]) + prf := cryptoJSON.KDFParams["prf"].(string) + if prf != "hmac-sha256" { + return nil, fmt.Errorf("Unsupported PBKDF2 PRF: %s", prf) + } + key := pbkdf2.Key(authArray, salt, c, dkLen, sha256.New) + return key, nil + } + + return nil, fmt.Errorf("Unsupported KDF: %s", cryptoJSON.KDF) +} + +// TODO: can we do without this when unmarshalling dynamic JSON? +// why do integers in KDF params end up as float64 and not int after +// unmarshal? +func ensureInt(x interface{}) int { + res, ok := x.(int) + if !ok { + res = int(x.(float64)) + } + return res +} diff --git a/accounts/keystore/keystore_passphrase_test.go b/accounts/keystore/passphrase_test.go similarity index 100% rename from accounts/keystore/keystore_passphrase_test.go rename to accounts/keystore/passphrase_test.go diff --git a/accounts/keystore/keystore_plain.go b/accounts/keystore/plain.go similarity index 100% rename from accounts/keystore/keystore_plain.go rename to accounts/keystore/plain.go diff --git a/accounts/keystore/keystore_plain_test.go b/accounts/keystore/plain_test.go similarity index 100% rename from accounts/keystore/keystore_plain_test.go rename to accounts/keystore/plain_test.go diff --git a/accounts/keystore/presale.go b/accounts/keystore/presale.go index 1554294e14e1..03055245f5e7 100644 --- a/accounts/keystore/presale.go +++ b/accounts/keystore/presale.go @@ -38,7 +38,13 @@ func importPreSaleKey(keyStore keyStore, keyJSON []byte, password string) (accou return accounts.Account{}, nil, err } key.Id = uuid.NewRandom() - a := accounts.Account{Address: key.Address, URL: accounts.URL{Scheme: KeyStoreScheme, Path: keyStore.JoinPath(keyFileName(key.Address))}} + a := accounts.Account{ + Address: key.Address, + URL: accounts.URL{ + Scheme: KeyStoreScheme, + Path: keyStore.JoinPath(keyFileName(key.Address)), + }, + } err = keyStore.StoreKey(a.URL.Path, key, password) return a, key, err } diff --git a/accounts/keystore/wallet.go b/accounts/keystore/wallet.go new file mode 100644 index 000000000000..498067d49730 --- /dev/null +++ b/accounts/keystore/wallet.go @@ -0,0 +1,148 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package keystore + +import ( + "math/big" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +// keystoreWallet implements the accounts.Wallet interface for the original +// keystore. +type keystoreWallet struct { + account accounts.Account // Single account contained in this wallet + keystore *KeyStore // Keystore where the account originates from +} + +// URL implements accounts.Wallet, returning the URL of the account within. +func (w *keystoreWallet) URL() accounts.URL { + return w.account.URL +} + +// Status implements accounts.Wallet, returning whether the account held by the +// keystore wallet is unlocked or not. +func (w *keystoreWallet) Status() (string, error) { + w.keystore.mu.RLock() + defer w.keystore.mu.RUnlock() + + if _, ok := w.keystore.unlocked[w.account.Address]; ok { + return "Unlocked", nil + } + return "Locked", nil +} + +// Open implements accounts.Wallet, but is a noop for plain wallets since there +// is no connection or decryption step necessary to access the list of accounts. +func (w *keystoreWallet) Open(passphrase string) error { return nil } + +// Close implements accounts.Wallet, but is a noop for plain wallets since there +// is no meaningful open operation. +func (w *keystoreWallet) Close() error { return nil } + +// Accounts implements accounts.Wallet, returning an account list consisting of +// a single account that the plain kestore wallet contains. +func (w *keystoreWallet) Accounts() []accounts.Account { + return []accounts.Account{w.account} +} + +// Contains implements accounts.Wallet, returning whether a particular account is +// or is not wrapped by this wallet instance. +func (w *keystoreWallet) Contains(account accounts.Account) bool { + return account.Address == w.account.Address && (account.URL == (accounts.URL{}) || account.URL == w.account.URL) +} + +// Derive implements accounts.Wallet, but is a noop for plain wallets since there +// is no notion of hierarchical account derivation for plain keystore accounts. +func (w *keystoreWallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { + return accounts.Account{}, accounts.ErrNotSupported +} + +// SelfDerive implements accounts.Wallet, but is a noop for plain wallets since +// there is no notion of hierarchical account derivation for plain keystore accounts. +func (w *keystoreWallet) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) { +} + +// signHash attempts to sign the given hash with +// the given account. If the wallet does not wrap this particular account, an +// error is returned to avoid account leakage (even though in theory we may be +// able to sign via our shared keystore backend). +func (w *keystoreWallet) signHash(account accounts.Account, hash []byte) ([]byte, error) { + // Make sure the requested account is contained within + if !w.Contains(account) { + return nil, accounts.ErrUnknownAccount + } + // Account seems valid, request the keystore to sign + return w.keystore.SignHash(account, hash) +} + +// SignData signs keccak256(data). The mimetype parameter describes the type of data being signed +func (w *keystoreWallet) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) { + return w.signHash(account, crypto.Keccak256(data)) +} + +// SignDataWithPassphrase signs keccak256(data). The mimetype parameter describes the type of data being signed +func (w *keystoreWallet) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) { + // Make sure the requested account is contained within + if !w.Contains(account) { + return nil, accounts.ErrUnknownAccount + } + // Account seems valid, request the keystore to sign + return w.keystore.SignHashWithPassphrase(account, passphrase, crypto.Keccak256(data)) +} + +func (w *keystoreWallet) SignText(account accounts.Account, text []byte) ([]byte, error) { + return w.signHash(account, accounts.TextHash(text)) +} + +// SignTextWithPassphrase implements accounts.Wallet, attempting to sign the +// given hash with the given account using passphrase as extra authentication. +func (w *keystoreWallet) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error) { + // Make sure the requested account is contained within + if !w.Contains(account) { + return nil, accounts.ErrUnknownAccount + } + // Account seems valid, request the keystore to sign + return w.keystore.SignHashWithPassphrase(account, passphrase, accounts.TextHash(text)) +} + +// SignTx implements accounts.Wallet, attempting to sign the given transaction +// with the given account. If the wallet does not wrap this particular account, +// an error is returned to avoid account leakage (even though in theory we may +// be able to sign via our shared keystore backend). +func (w *keystoreWallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + // Make sure the requested account is contained within + if !w.Contains(account) { + return nil, accounts.ErrUnknownAccount + } + // Account seems valid, request the keystore to sign + return w.keystore.SignTx(account, tx, chainID) +} + +// SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given +// transaction with the given account using passphrase as extra authentication. +func (w *keystoreWallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + // Make sure the requested account is contained within + if !w.Contains(account) { + return nil, accounts.ErrUnknownAccount + } + // Account seems valid, request the keystore to sign + return w.keystore.SignTxWithPassphrase(account, passphrase, tx, chainID) +} diff --git a/accounts/keystore/watch.go b/accounts/keystore/watch.go index bbcfb99257ad..d6ef53327d43 100644 --- a/accounts/keystore/watch.go +++ b/accounts/keystore/watch.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build darwin,!ios freebsd linux,!arm64 netbsd solaris +// +build darwin,!ios,cgo freebsd linux,!arm64 netbsd solaris package keystore diff --git a/accounts/keystore/watch_fallback.go b/accounts/keystore/watch_fallback.go index 7c5e9cb2e214..de0e87f8a5a7 100644 --- a/accounts/keystore/watch_fallback.go +++ b/accounts/keystore/watch_fallback.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build ios linux,arm64 windows !darwin,!freebsd,!linux,!netbsd,!solaris +// +build darwin,!cgo ios linux,arm64 windows !darwin,!freebsd,!linux,!netbsd,!solaris // This is the fallback implementation of directory watching. // It is used on unsupported platforms. diff --git a/accounts/manager.go b/accounts/manager.go index 96ca298fc5df..3cf3422e7718 100644 --- a/accounts/manager.go +++ b/accounts/manager.go @@ -24,9 +24,18 @@ import ( "github.com/ethereum/go-ethereum/event" ) +// Config contains the settings of the global account manager. +// +// TODO(rjl493456442, karalabe, holiman): Get rid of this when account management +// is removed in favor of Clef. +type Config struct { + InsecureUnlockAllowed bool // Whether account unlocking in insecure environment is allowed +} + // Manager is an overarching account manager that can communicate with various // backends for signing transactions. type Manager struct { + config *Config // Global account manager configurations backends map[reflect.Type][]Backend // Index of backends currently registered updaters []event.Subscription // Wallet update subscriptions for all backends updates chan WalletEvent // Subscription sink for backend wallet changes @@ -40,7 +49,7 @@ type Manager struct { // NewManager creates a generic account manager to sign transaction via various // supported backends. -func NewManager(backends ...Backend) *Manager { +func NewManager(config *Config, backends ...Backend) *Manager { // Retrieve the initial list of wallets from the backends and sort by URL var wallets []Wallet for _, backend := range backends { @@ -55,6 +64,7 @@ func NewManager(backends ...Backend) *Manager { } // Assemble the account manager and return am := &Manager{ + config: config, backends: make(map[reflect.Type][]Backend), updaters: subs, updates: updates, @@ -77,6 +87,11 @@ func (am *Manager) Close() error { return <-errc } +// Config returns the configuration of account manager. +func (am *Manager) Config() *Config { + return am.config +} + // update is the wallet event loop listening for notifications from the backends // and updating the cache of wallets. func (am *Manager) update() { diff --git a/accounts/scwallet/README.md b/accounts/scwallet/README.md new file mode 100644 index 000000000000..cfca916b3ae8 --- /dev/null +++ b/accounts/scwallet/README.md @@ -0,0 +1,102 @@ +# Using the smartcard wallet + +## Requirements + + * A USB smartcard reader + * A keycard that supports the status app + * PCSCD version 4.3 running on your system **Only version 4.3 is currently supported** + +## Preparing the smartcard + + **WARNING: FOILLOWING THESE INSTRUCTIONS WILL DESTROY THE MASTER KEY ON YOUR CARD. ONLY PROCEED IF NO FUNDS ARE ASSOCIATED WITH THESE ACCOUNTS** + + You can use status' [keycard-cli](https://github.com/status-im/keycard-cli) and you should get _at least_ version 2.1.1 of their [smartcard application](https://github.com/status-im/status-keycard/releases/download/2.2.1/keycard_v2.2.1.cap) + + You also need to make sure that the PCSC daemon is running on your system. + + Then, you can install the application to the card by typing: + + ``` + keycard install -a keycard_v2.2.1.cap && keycard init + ``` + + At the end of this process, you will be provided with a PIN, a PUK and a pairing password. Write them down, you'll need them shortly. + + Start `geth` with the `console` command. You will notice the following warning: + + ``` + WARN [04-09|16:58:38.898] Failed to open wallet url=keycard://044def09 err="smartcard: pairing password needed" + ``` + + Write down the URL (`keycard://044def09` in this example). Then ask `geth` to open the wallet: + + ``` + > personal.openWallet("keycard://044def09") + Please enter the pairing password: + ``` + + Enter the pairing password that you have received during card initialization. Same with the PIN that you will subsequently be + asked for. + + If everything goes well, you should see your new account when typing `personal` on the console: + + ``` + > personal + WARN [04-09|17:02:07.330] Smartcard wallet account derivation failed url=keycard://044def09 err="Unexpected response status Cla=0x80, Ins=0xd1, Sw=0x6985" + { + listAccounts: [], + listWallets: [{ + status: "Empty, waiting for initialization", + url: "keycard://044def09" + }], + ... + } + ``` + + So the communication with the card is working, but there is no key associated with this wallet. Let's create it: + + ``` + > personal.initializeWallet("keycard://044def09") + "tilt ... impact" + ``` + + You should get a list of words, this is your seed so write them down. Your wallet should now be initialized: + + ``` + > personal.listWallets + [{ + accounts: [{ + address: "0x678b7cd55c61917defb23546a41803c5bfefbc7a", + url: "keycard://044d/m/44'/60'/0'/0/0" + }], + status: "Online", + url: "keycard://044def09" + }] + ``` + + You're all set! + +## Usage + + 1. Start `geth` with the `console` command + 2. Check the card's URL by checking `personal.listWallets`: + +``` + listWallets: [{ + status: "Online, can derive public keys", + url: "keycard://a4d73015" + }] +``` + + 3. Open the wallet, you will be prompted for your pairing password, then PIN: + +``` +personal.openWallet("keycard://a4d73015") +``` + + 4. Check that creation was successful by typing e.g. `personal`. Then use it like a regular wallet. + +## Known issues + + * Starting geth with a valid card seems to make firefox crash. + * PCSC version 4.4 should work, but is currently untested diff --git a/accounts/scwallet/apdu.go b/accounts/scwallet/apdu.go new file mode 100644 index 000000000000..bd3660604e1f --- /dev/null +++ b/accounts/scwallet/apdu.go @@ -0,0 +1,87 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package scwallet + +import ( + "bytes" + "encoding/binary" + "fmt" +) + +// commandAPDU represents an application data unit sent to a smartcard. +type commandAPDU struct { + Cla, Ins, P1, P2 uint8 // Class, Instruction, Parameter 1, Parameter 2 + Data []byte // Command data + Le uint8 // Command data length +} + +// serialize serializes a command APDU. +func (ca commandAPDU) serialize() ([]byte, error) { + buf := new(bytes.Buffer) + + if err := binary.Write(buf, binary.BigEndian, ca.Cla); err != nil { + return nil, err + } + if err := binary.Write(buf, binary.BigEndian, ca.Ins); err != nil { + return nil, err + } + if err := binary.Write(buf, binary.BigEndian, ca.P1); err != nil { + return nil, err + } + if err := binary.Write(buf, binary.BigEndian, ca.P2); err != nil { + return nil, err + } + if len(ca.Data) > 0 { + if err := binary.Write(buf, binary.BigEndian, uint8(len(ca.Data))); err != nil { + return nil, err + } + if err := binary.Write(buf, binary.BigEndian, ca.Data); err != nil { + return nil, err + } + } + if err := binary.Write(buf, binary.BigEndian, ca.Le); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// responseAPDU represents an application data unit received from a smart card. +type responseAPDU struct { + Data []byte // response data + Sw1, Sw2 uint8 // status words 1 and 2 +} + +// deserialize deserializes a response APDU. +func (ra *responseAPDU) deserialize(data []byte) error { + if len(data) < 2 { + return fmt.Errorf("can not deserialize data: payload too short (%d < 2)", len(data)) + } + + ra.Data = make([]byte, len(data)-2) + + buf := bytes.NewReader(data) + if err := binary.Read(buf, binary.BigEndian, &ra.Data); err != nil { + return err + } + if err := binary.Read(buf, binary.BigEndian, &ra.Sw1); err != nil { + return err + } + if err := binary.Read(buf, binary.BigEndian, &ra.Sw2); err != nil { + return err + } + return nil +} diff --git a/accounts/scwallet/hub.go b/accounts/scwallet/hub.go new file mode 100644 index 000000000000..5f939c658627 --- /dev/null +++ b/accounts/scwallet/hub.go @@ -0,0 +1,302 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// This package implements support for smartcard-based hardware wallets such as +// the one written by Status: https://github.com/status-im/hardware-wallet +// +// This implementation of smartcard wallets have a different interaction process +// to other types of hardware wallet. The process works like this: +// +// 1. (First use with a given client) Establish a pairing between hardware +// wallet and client. This requires a secret value called a 'pairing password'. +// You can pair with an unpaired wallet with `personal.openWallet(URI, pairing password)`. +// 2. (First use only) Initialize the wallet, which generates a keypair, stores +// it on the wallet, and returns it so the user can back it up. You can +// initialize a wallet with `personal.initializeWallet(URI)`. +// 3. Connect to the wallet using the pairing information established in step 1. +// You can connect to a paired wallet with `personal.openWallet(URI, PIN)`. +// 4. Interact with the wallet as normal. + +package scwallet + +import ( + "encoding/json" + "io/ioutil" + "os" + "path/filepath" + "sort" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + pcsc "github.com/gballet/go-libpcsclite" +) + +// Scheme is the URI prefix for smartcard wallets. +const Scheme = "keycard" + +// refreshCycle is the maximum time between wallet refreshes (if USB hotplug +// notifications don't work). +const refreshCycle = time.Second + +// refreshThrottling is the minimum time between wallet refreshes to avoid thrashing. +const refreshThrottling = 500 * time.Millisecond + +// smartcardPairing contains information about a smart card we have paired with +// or might pair with the hub. +type smartcardPairing struct { + PublicKey []byte `json:"publicKey"` + PairingIndex uint8 `json:"pairingIndex"` + PairingKey []byte `json:"pairingKey"` + Accounts map[common.Address]accounts.DerivationPath `json:"accounts"` +} + +// Hub is a accounts.Backend that can find and handle generic PC/SC hardware wallets. +type Hub struct { + scheme string // Protocol scheme prefixing account and wallet URLs. + + context *pcsc.Client + datadir string + pairings map[string]smartcardPairing + + refreshed time.Time // Time instance when the list of wallets was last refreshed + wallets map[string]*Wallet // Mapping from reader names to wallet instances + updateFeed event.Feed // Event feed to notify wallet additions/removals + updateScope event.SubscriptionScope // Subscription scope tracking current live listeners + updating bool // Whether the event notification loop is running + + quit chan chan error + + stateLock sync.RWMutex // Protects the internals of the hub from racey access +} + +func (hub *Hub) readPairings() error { + hub.pairings = make(map[string]smartcardPairing) + pairingFile, err := os.Open(filepath.Join(hub.datadir, "smartcards.json")) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + + pairingData, err := ioutil.ReadAll(pairingFile) + if err != nil { + return err + } + var pairings []smartcardPairing + if err := json.Unmarshal(pairingData, &pairings); err != nil { + return err + } + + for _, pairing := range pairings { + hub.pairings[string(pairing.PublicKey)] = pairing + } + return nil +} + +func (hub *Hub) writePairings() error { + pairingFile, err := os.OpenFile(filepath.Join(hub.datadir, "smartcards.json"), os.O_RDWR|os.O_CREATE, 0755) + if err != nil { + return err + } + defer pairingFile.Close() + + pairings := make([]smartcardPairing, 0, len(hub.pairings)) + for _, pairing := range hub.pairings { + pairings = append(pairings, pairing) + } + + pairingData, err := json.Marshal(pairings) + if err != nil { + return err + } + + if _, err := pairingFile.Write(pairingData); err != nil { + return err + } + + return nil +} + +func (hub *Hub) pairing(wallet *Wallet) *smartcardPairing { + if pairing, ok := hub.pairings[string(wallet.PublicKey)]; ok { + return &pairing + } + return nil +} + +func (hub *Hub) setPairing(wallet *Wallet, pairing *smartcardPairing) error { + if pairing == nil { + delete(hub.pairings, string(wallet.PublicKey)) + } else { + hub.pairings[string(wallet.PublicKey)] = *pairing + } + return hub.writePairings() +} + +// NewHub creates a new hardware wallet manager for smartcards. +func NewHub(daemonPath string, scheme string, datadir string) (*Hub, error) { + context, err := pcsc.EstablishContext(daemonPath, pcsc.ScopeSystem) + if err != nil { + return nil, err + } + hub := &Hub{ + scheme: scheme, + context: context, + datadir: datadir, + wallets: make(map[string]*Wallet), + quit: make(chan chan error), + } + if err := hub.readPairings(); err != nil { + return nil, err + } + hub.refreshWallets() + return hub, nil +} + +// Wallets implements accounts.Backend, returning all the currently tracked smart +// cards that appear to be hardware wallets. +func (hub *Hub) Wallets() []accounts.Wallet { + // Make sure the list of wallets is up to date + hub.refreshWallets() + + hub.stateLock.RLock() + defer hub.stateLock.RUnlock() + + cpy := make([]accounts.Wallet, 0, len(hub.wallets)) + for _, wallet := range hub.wallets { + cpy = append(cpy, wallet) + } + sort.Sort(accounts.WalletsByURL(cpy)) + return cpy +} + +// refreshWallets scans the devices attached to the machine and updates the +// list of wallets based on the found devices. +func (hub *Hub) refreshWallets() { + // Don't scan the USB like crazy it the user fetches wallets in a loop + hub.stateLock.RLock() + elapsed := time.Since(hub.refreshed) + hub.stateLock.RUnlock() + + if elapsed < refreshThrottling { + return + } + // Retrieve all the smart card reader to check for cards + readers, err := hub.context.ListReaders() + if err != nil { + // This is a perverted hack, the scard library returns an error if no card + // readers are present instead of simply returning an empty list. We don't + // want to fill the user's log with errors, so filter those out. + if err.Error() != "scard: Cannot find a smart card reader." { + log.Error("Failed to enumerate smart card readers", "err", err) + return + } + } + // Transform the current list of wallets into the new one + hub.stateLock.Lock() + + events := []accounts.WalletEvent{} + seen := make(map[string]struct{}) + + for _, reader := range readers { + // Mark the reader as present + seen[reader] = struct{}{} + + // If we alreay know about this card, skip to the next reader, otherwise clean up + if wallet, ok := hub.wallets[reader]; ok { + if err := wallet.ping(); err == nil { + continue + } + wallet.Close() + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped}) + delete(hub.wallets, reader) + } + // New card detected, try to connect to it + card, err := hub.context.Connect(reader, pcsc.ShareShared, pcsc.ProtocolAny) + if err != nil { + log.Debug("Failed to open smart card", "reader", reader, "err", err) + continue + } + wallet := NewWallet(hub, card) + if err = wallet.connect(); err != nil { + log.Debug("Failed to connect to smart card", "reader", reader, "err", err) + card.Disconnect(pcsc.LeaveCard) + continue + } + // Card connected, start tracking in amongs the wallets + hub.wallets[reader] = wallet + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived}) + } + // Remove any wallets no longer present + for reader, wallet := range hub.wallets { + if _, ok := seen[reader]; !ok { + wallet.Close() + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped}) + delete(hub.wallets, reader) + } + } + hub.refreshed = time.Now() + hub.stateLock.Unlock() + + for _, event := range events { + hub.updateFeed.Send(event) + } +} + +// Subscribe implements accounts.Backend, creating an async subscription to +// receive notifications on the addition or removal of smart card wallets. +func (hub *Hub) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription { + // We need the mutex to reliably start/stop the update loop + hub.stateLock.Lock() + defer hub.stateLock.Unlock() + + // Subscribe the caller and track the subscriber count + sub := hub.updateScope.Track(hub.updateFeed.Subscribe(sink)) + + // Subscribers require an active notification loop, start it + if !hub.updating { + hub.updating = true + go hub.updater() + } + return sub +} + +// updater is responsible for maintaining an up-to-date list of wallets managed +// by the smart card hub, and for firing wallet addition/removal events. +func (hub *Hub) updater() { + for { + // TODO: Wait for a USB hotplug event (not supported yet) or a refresh timeout + // <-hub.changes + time.Sleep(refreshCycle) + + // Run the wallet refresher + hub.refreshWallets() + + // If all our subscribers left, stop the updater + hub.stateLock.Lock() + if hub.updateScope.Count() == 0 { + hub.updating = false + hub.stateLock.Unlock() + return + } + hub.stateLock.Unlock() + } +} diff --git a/accounts/scwallet/securechannel.go b/accounts/scwallet/securechannel.go new file mode 100644 index 000000000000..fad876a019c0 --- /dev/null +++ b/accounts/scwallet/securechannel.go @@ -0,0 +1,346 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package scwallet + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "crypto/sha256" + "crypto/sha512" + "fmt" + + "github.com/ethereum/go-ethereum/crypto" + pcsc "github.com/gballet/go-libpcsclite" + "github.com/wsddn/go-ecdh" + "golang.org/x/crypto/pbkdf2" + "golang.org/x/text/unicode/norm" +) + +const ( + maxPayloadSize = 223 + pairP1FirstStep = 0 + pairP1LastStep = 1 + + scSecretLength = 32 + scBlockSize = 16 + + insOpenSecureChannel = 0x10 + insMutuallyAuthenticate = 0x11 + insPair = 0x12 + insUnpair = 0x13 + + pairingSalt = "Keycard Pairing Password Salt" +) + +// SecureChannelSession enables secure communication with a hardware wallet. +type SecureChannelSession struct { + card *pcsc.Card // A handle to the smartcard for communication + secret []byte // A shared secret generated from our ECDSA keys + publicKey []byte // Our own ephemeral public key + PairingKey []byte // A permanent shared secret for a pairing, if present + sessionEncKey []byte // The current session encryption key + sessionMacKey []byte // The current session MAC key + iv []byte // The current IV + PairingIndex uint8 // The pairing index +} + +// NewSecureChannelSession creates a new secure channel for the given card and public key. +func NewSecureChannelSession(card *pcsc.Card, keyData []byte) (*SecureChannelSession, error) { + // Generate an ECDSA keypair for ourselves + gen := ecdh.NewEllipticECDH(crypto.S256()) + private, public, err := gen.GenerateKey(rand.Reader) + if err != nil { + return nil, err + } + + cardPublic, ok := gen.Unmarshal(keyData) + if !ok { + return nil, fmt.Errorf("Could not unmarshal public key from card") + } + + secret, err := gen.GenerateSharedSecret(private, cardPublic) + if err != nil { + return nil, err + } + + return &SecureChannelSession{ + card: card, + secret: secret, + publicKey: gen.Marshal(public), + }, nil +} + +// Pair establishes a new pairing with the smartcard. +func (s *SecureChannelSession) Pair(pairingPassword []byte) error { + secretHash := pbkdf2.Key(norm.NFKD.Bytes(pairingPassword), norm.NFKD.Bytes([]byte(pairingSalt)), 50000, 32, sha256.New) + + challenge := make([]byte, 32) + if _, err := rand.Read(challenge); err != nil { + return err + } + + response, err := s.pair(pairP1FirstStep, challenge) + if err != nil { + return err + } + + md := sha256.New() + md.Write(secretHash[:]) + md.Write(challenge) + + expectedCryptogram := md.Sum(nil) + cardCryptogram := response.Data[:32] + cardChallenge := response.Data[32:64] + + if !bytes.Equal(expectedCryptogram, cardCryptogram) { + return fmt.Errorf("Invalid card cryptogram %v != %v", expectedCryptogram, cardCryptogram) + } + + md.Reset() + md.Write(secretHash[:]) + md.Write(cardChallenge) + response, err = s.pair(pairP1LastStep, md.Sum(nil)) + if err != nil { + return err + } + + md.Reset() + md.Write(secretHash[:]) + md.Write(response.Data[1:]) + s.PairingKey = md.Sum(nil) + s.PairingIndex = response.Data[0] + + return nil +} + +// Unpair disestablishes an existing pairing. +func (s *SecureChannelSession) Unpair() error { + if s.PairingKey == nil { + return fmt.Errorf("Cannot unpair: not paired") + } + + _, err := s.transmitEncrypted(claSCWallet, insUnpair, s.PairingIndex, 0, []byte{}) + if err != nil { + return err + } + s.PairingKey = nil + // Close channel + s.iv = nil + return nil +} + +// Open initializes the secure channel. +func (s *SecureChannelSession) Open() error { + if s.iv != nil { + return fmt.Errorf("Session already opened") + } + + response, err := s.open() + if err != nil { + return err + } + + // Generate the encryption/mac key by hashing our shared secret, + // pairing key, and the first bytes returned from the Open APDU. + md := sha512.New() + md.Write(s.secret) + md.Write(s.PairingKey) + md.Write(response.Data[:scSecretLength]) + keyData := md.Sum(nil) + s.sessionEncKey = keyData[:scSecretLength] + s.sessionMacKey = keyData[scSecretLength : scSecretLength*2] + + // The IV is the last bytes returned from the Open APDU. + s.iv = response.Data[scSecretLength:] + + return s.mutuallyAuthenticate() +} + +// mutuallyAuthenticate is an internal method to authenticate both ends of the +// connection. +func (s *SecureChannelSession) mutuallyAuthenticate() error { + data := make([]byte, scSecretLength) + if _, err := rand.Read(data); err != nil { + return err + } + + response, err := s.transmitEncrypted(claSCWallet, insMutuallyAuthenticate, 0, 0, data) + if err != nil { + return err + } + if response.Sw1 != 0x90 || response.Sw2 != 0x00 { + return fmt.Errorf("Got unexpected response from MUTUALLY_AUTHENTICATE: 0x%x%x", response.Sw1, response.Sw2) + } + + if len(response.Data) != scSecretLength { + return fmt.Errorf("Response from MUTUALLY_AUTHENTICATE was %d bytes, expected %d", len(response.Data), scSecretLength) + } + + return nil +} + +// open is an internal method that sends an open APDU. +func (s *SecureChannelSession) open() (*responseAPDU, error) { + return transmit(s.card, &commandAPDU{ + Cla: claSCWallet, + Ins: insOpenSecureChannel, + P1: s.PairingIndex, + P2: 0, + Data: s.publicKey, + Le: 0, + }) +} + +// pair is an internal method that sends a pair APDU. +func (s *SecureChannelSession) pair(p1 uint8, data []byte) (*responseAPDU, error) { + return transmit(s.card, &commandAPDU{ + Cla: claSCWallet, + Ins: insPair, + P1: p1, + P2: 0, + Data: data, + Le: 0, + }) +} + +// transmitEncrypted sends an encrypted message, and decrypts and returns the response. +func (s *SecureChannelSession) transmitEncrypted(cla, ins, p1, p2 byte, data []byte) (*responseAPDU, error) { + if s.iv == nil { + return nil, fmt.Errorf("Channel not open") + } + + data, err := s.encryptAPDU(data) + if err != nil { + return nil, err + } + meta := [16]byte{cla, ins, p1, p2, byte(len(data) + scBlockSize)} + if err = s.updateIV(meta[:], data); err != nil { + return nil, err + } + + fulldata := make([]byte, len(s.iv)+len(data)) + copy(fulldata, s.iv) + copy(fulldata[len(s.iv):], data) + + response, err := transmit(s.card, &commandAPDU{ + Cla: cla, + Ins: ins, + P1: p1, + P2: p2, + Data: fulldata, + }) + if err != nil { + return nil, err + } + + rmeta := [16]byte{byte(len(response.Data))} + rmac := response.Data[:len(s.iv)] + rdata := response.Data[len(s.iv):] + plainData, err := s.decryptAPDU(rdata) + if err != nil { + return nil, err + } + + if err = s.updateIV(rmeta[:], rdata); err != nil { + return nil, err + } + if !bytes.Equal(s.iv, rmac) { + return nil, fmt.Errorf("Invalid MAC in response") + } + + rapdu := &responseAPDU{} + rapdu.deserialize(plainData) + + if rapdu.Sw1 != sw1Ok { + return nil, fmt.Errorf("Unexpected response status Cla=0x%x, Ins=0x%x, Sw=0x%x%x", cla, ins, rapdu.Sw1, rapdu.Sw2) + } + + return rapdu, nil +} + +// encryptAPDU is an internal method that serializes and encrypts an APDU. +func (s *SecureChannelSession) encryptAPDU(data []byte) ([]byte, error) { + if len(data) > maxPayloadSize { + return nil, fmt.Errorf("Payload of %d bytes exceeds maximum of %d", len(data), maxPayloadSize) + } + data = pad(data, 0x80) + + ret := make([]byte, len(data)) + + a, err := aes.NewCipher(s.sessionEncKey) + if err != nil { + return nil, err + } + crypter := cipher.NewCBCEncrypter(a, s.iv) + crypter.CryptBlocks(ret, data) + return ret, nil +} + +// pad applies message padding to a 16 byte boundary. +func pad(data []byte, terminator byte) []byte { + padded := make([]byte, (len(data)/16+1)*16) + copy(padded, data) + padded[len(data)] = terminator + return padded +} + +// decryptAPDU is an internal method that decrypts and deserializes an APDU. +func (s *SecureChannelSession) decryptAPDU(data []byte) ([]byte, error) { + a, err := aes.NewCipher(s.sessionEncKey) + if err != nil { + return nil, err + } + + ret := make([]byte, len(data)) + + crypter := cipher.NewCBCDecrypter(a, s.iv) + crypter.CryptBlocks(ret, data) + return unpad(ret, 0x80) +} + +// unpad strips padding from a message. +func unpad(data []byte, terminator byte) ([]byte, error) { + for i := 1; i <= 16; i++ { + switch data[len(data)-i] { + case 0: + continue + case terminator: + return data[:len(data)-i], nil + default: + return nil, fmt.Errorf("Expected end of padding, got %d", data[len(data)-i]) + } + } + return nil, fmt.Errorf("Expected end of padding, got 0") +} + +// updateIV is an internal method that updates the initialization vector after +// each message exchanged. +func (s *SecureChannelSession) updateIV(meta, data []byte) error { + data = pad(data, 0) + a, err := aes.NewCipher(s.sessionMacKey) + if err != nil { + return err + } + crypter := cipher.NewCBCEncrypter(a, make([]byte, 16)) + crypter.CryptBlocks(meta, meta) + crypter.CryptBlocks(data, data) + // The first 16 bytes of the last block is the MAC + s.iv = data[len(data)-32 : len(data)-16] + return nil +} diff --git a/accounts/scwallet/wallet.go b/accounts/scwallet/wallet.go new file mode 100644 index 000000000000..57b597706254 --- /dev/null +++ b/accounts/scwallet/wallet.go @@ -0,0 +1,1082 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package scwallet + +import ( + "bytes" + "context" + "crypto/hmac" + "crypto/sha256" + "crypto/sha512" + "encoding/asn1" + "encoding/binary" + "errors" + "fmt" + "math/big" + "regexp" + "sort" + "strings" + "sync" + "time" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + pcsc "github.com/gballet/go-libpcsclite" + "github.com/status-im/keycard-go/derivationpath" +) + +// ErrPairingPasswordNeeded is returned if opening the smart card requires pairing with a pairing +// password. In this case, the calling application should request user input to enter +// the pairing password and send it back. +var ErrPairingPasswordNeeded = errors.New("smartcard: pairing password needed") + +// ErrPINNeeded is returned if opening the smart card requires a PIN code. In +// this case, the calling application should request user input to enter the PIN +// and send it back. +var ErrPINNeeded = errors.New("smartcard: pin needed") + +// ErrPINUnblockNeeded is returned if opening the smart card requires a PIN code, +// but all PIN attempts have already been exhausted. In this case the calling +// application should request user input for the PUK and a new PIN code to set +// fo the card. +var ErrPINUnblockNeeded = errors.New("smartcard: pin unblock needed") + +// ErrAlreadyOpen is returned if the smart card is attempted to be opened, but +// there is already a paired and unlocked session. +var ErrAlreadyOpen = errors.New("smartcard: already open") + +// ErrPubkeyMismatch is returned if the public key recovered from a signature +// does not match the one expected by the user. +var ErrPubkeyMismatch = errors.New("smartcard: recovered public key mismatch") + +var ( + appletAID = []byte{0xA0, 0x00, 0x00, 0x08, 0x04, 0x00, 0x01, 0x01, 0x01} + // DerivationSignatureHash is used to derive the public key from the signature of this hash + DerivationSignatureHash = sha256.Sum256(common.Hash{}.Bytes()) +) + +// List of APDU command-related constants +const ( + claISO7816 = 0 + claSCWallet = 0x80 + + insSelect = 0xA4 + insGetResponse = 0xC0 + sw1GetResponse = 0x61 + sw1Ok = 0x90 + + insVerifyPin = 0x20 + insUnblockPin = 0x22 + insExportKey = 0xC2 + insSign = 0xC0 + insLoadKey = 0xD0 + insDeriveKey = 0xD1 + insStatus = 0xF2 +) + +// List of ADPU command parameters +const ( + P1DeriveKeyFromMaster = uint8(0x00) + P1DeriveKeyFromParent = uint8(0x01) + P1DeriveKeyFromCurrent = uint8(0x10) + statusP1WalletStatus = uint8(0x00) + statusP1Path = uint8(0x01) + signP1PrecomputedHash = uint8(0x01) + signP2OnlyBlock = uint8(0x81) + exportP1Any = uint8(0x00) + exportP2Pubkey = uint8(0x01) +) + +// Minimum time to wait between self derivation attempts, even it the user is +// requesting accounts like crazy. +const selfDeriveThrottling = time.Second + +// Wallet represents a smartcard wallet instance. +type Wallet struct { + Hub *Hub // A handle to the Hub that instantiated this wallet. + PublicKey []byte // The wallet's public key (used for communication and identification, not signing!) + + lock sync.Mutex // Lock that gates access to struct fields and communication with the card + card *pcsc.Card // A handle to the smartcard interface for the wallet. + session *Session // The secure communication session with the card + log log.Logger // Contextual logger to tag the base with its id + + deriveNextPaths []accounts.DerivationPath // Next derivation paths for account auto-discovery (multiple bases supported) + deriveNextAddrs []common.Address // Next derived account addresses for auto-discovery (multiple bases supported) + deriveChain ethereum.ChainStateReader // Blockchain state reader to discover used account with + deriveReq chan chan struct{} // Channel to request a self-derivation on + deriveQuit chan chan error // Channel to terminate the self-deriver with +} + +// NewWallet constructs and returns a new Wallet instance. +func NewWallet(hub *Hub, card *pcsc.Card) *Wallet { + wallet := &Wallet{ + Hub: hub, + card: card, + } + return wallet +} + +// transmit sends an APDU to the smartcard and receives and decodes the response. +// It automatically handles requests by the card to fetch the return data separately, +// and returns an error if the response status code is not success. +func transmit(card *pcsc.Card, command *commandAPDU) (*responseAPDU, error) { + data, err := command.serialize() + if err != nil { + return nil, err + } + + responseData, _, err := card.Transmit(data) + if err != nil { + return nil, err + } + + response := new(responseAPDU) + if err = response.deserialize(responseData); err != nil { + return nil, err + } + + // Are we being asked to fetch the response separately? + if response.Sw1 == sw1GetResponse && (command.Cla != claISO7816 || command.Ins != insGetResponse) { + return transmit(card, &commandAPDU{ + Cla: claISO7816, + Ins: insGetResponse, + P1: 0, + P2: 0, + Data: nil, + Le: response.Sw2, + }) + } + + if response.Sw1 != sw1Ok { + return nil, fmt.Errorf("Unexpected insecure response status Cla=0x%x, Ins=0x%x, Sw=0x%x%x", command.Cla, command.Ins, response.Sw1, response.Sw2) + } + + return response, nil +} + +// applicationInfo encodes information about the smartcard application - its +// instance UID and public key. +type applicationInfo struct { + InstanceUID []byte `asn1:"tag:15"` + PublicKey []byte `asn1:"tag:0"` +} + +// connect connects to the wallet application and establishes a secure channel with it. +// must be called before any other interaction with the wallet. +func (w *Wallet) connect() error { + w.lock.Lock() + defer w.lock.Unlock() + + appinfo, err := w.doselect() + if err != nil { + return err + } + + channel, err := NewSecureChannelSession(w.card, appinfo.PublicKey) + if err != nil { + return err + } + + w.PublicKey = appinfo.PublicKey + w.log = log.New("url", w.URL()) + w.session = &Session{ + Wallet: w, + Channel: channel, + } + return nil +} + +// doselect is an internal (unlocked) function to send a SELECT APDU to the card. +func (w *Wallet) doselect() (*applicationInfo, error) { + response, err := transmit(w.card, &commandAPDU{ + Cla: claISO7816, + Ins: insSelect, + P1: 4, + P2: 0, + Data: appletAID, + }) + if err != nil { + return nil, err + } + + appinfo := new(applicationInfo) + if _, err := asn1.UnmarshalWithParams(response.Data, appinfo, "tag:4"); err != nil { + return nil, err + } + return appinfo, nil +} + +// ping checks the card's status and returns an error if unsuccessful. +func (w *Wallet) ping() error { + w.lock.Lock() + defer w.lock.Unlock() + + // We can't ping if not paired + if !w.session.paired() { + return nil + } + if _, err := w.session.walletStatus(); err != nil { + return err + } + return nil +} + +// release releases any resources held by an open wallet instance. +func (w *Wallet) release() error { + if w.session != nil { + return w.session.release() + } + return nil +} + +// pair is an internal (unlocked) function for establishing a new pairing +// with the wallet. +func (w *Wallet) pair(puk []byte) error { + if w.session.paired() { + return fmt.Errorf("Wallet already paired") + } + pairing, err := w.session.pair(puk) + if err != nil { + return err + } + if err = w.Hub.setPairing(w, &pairing); err != nil { + return err + } + return w.session.authenticate(pairing) +} + +// Unpair deletes an existing wallet pairing. +func (w *Wallet) Unpair(pin []byte) error { + w.lock.Lock() + defer w.lock.Unlock() + + if !w.session.paired() { + return fmt.Errorf("wallet %x not paired", w.PublicKey) + } + if err := w.session.verifyPin(pin); err != nil { + return fmt.Errorf("failed to verify pin: %s", err) + } + if err := w.session.unpair(); err != nil { + return fmt.Errorf("failed to unpair: %s", err) + } + if err := w.Hub.setPairing(w, nil); err != nil { + return err + } + return nil +} + +// URL retrieves the canonical path under which this wallet is reachable. It is +// user by upper layers to define a sorting order over all wallets from multiple +// backends. +func (w *Wallet) URL() accounts.URL { + return accounts.URL{ + Scheme: w.Hub.scheme, + Path: fmt.Sprintf("%x", w.PublicKey[1:5]), // Byte #0 isn't unique; 1:5 covers << 64K cards, bump to 1:9 for << 4M + } +} + +// Status returns a textual status to aid the user in the current state of the +// wallet. It also returns an error indicating any failure the wallet might have +// encountered. +func (w *Wallet) Status() (string, error) { + w.lock.Lock() + defer w.lock.Unlock() + + // If the card is not paired, we can only wait + if !w.session.paired() { + return "Unpaired, waiting for pairing password", nil + } + // Yay, we have an encrypted session, retrieve the actual status + status, err := w.session.walletStatus() + if err != nil { + return fmt.Sprintf("Failed: %v", err), err + } + switch { + case !w.session.verified && status.PinRetryCount == 0 && status.PukRetryCount == 0: + return fmt.Sprintf("Bricked, waiting for full wipe"), nil + case !w.session.verified && status.PinRetryCount == 0: + return fmt.Sprintf("Blocked, waiting for PUK (%d attempts left) and new PIN", status.PukRetryCount), nil + case !w.session.verified: + return fmt.Sprintf("Locked, waiting for PIN (%d attempts left)", status.PinRetryCount), nil + case !status.Initialized: + return fmt.Sprintf("Empty, waiting for initialization"), nil + default: + return fmt.Sprintf("Online"), nil + } +} + +// Open initializes access to a wallet instance. It is not meant to unlock or +// decrypt account keys, rather simply to establish a connection to hardware +// wallets and/or to access derivation seeds. +// +// The passphrase parameter may or may not be used by the implementation of a +// particular wallet instance. The reason there is no passwordless open method +// is to strive towards a uniform wallet handling, oblivious to the different +// backend providers. +// +// Please note, if you open a wallet, you must close it to release any allocated +// resources (especially important when working with hardware wallets). +func (w *Wallet) Open(passphrase string) error { + w.lock.Lock() + defer w.lock.Unlock() + + // If the session is already open, bail out + if w.session.verified { + return ErrAlreadyOpen + } + // If the smart card is not yet paired, attempt to do so either from a previous + // pairing key or form the supplied PUK code. + if !w.session.paired() { + // If a previous pairing exists, only ever try to use that + if pairing := w.Hub.pairing(w); pairing != nil { + if err := w.session.authenticate(*pairing); err != nil { + return fmt.Errorf("failed to authenticate card %x: %s", w.PublicKey[:4], err) + } + // Pairing still ok, fall through to PIN checks + } else { + // If no passphrase was supplied, request the PUK from the user + if passphrase == "" { + return ErrPairingPasswordNeeded + } + // Attempt to pair the smart card with the user supplied PUK + if err := w.pair([]byte(passphrase)); err != nil { + return err + } + // Pairing succeeded, fall through to PIN checks. This will of course fail, + // but we can't return ErrPINNeeded directly here becase we don't know whether + // a PIN check or a PIN reset is needed. + passphrase = "" + } + } + // The smart card was successfully paired, retrieve its status to check whether + // PIN verification or unblocking is needed. + status, err := w.session.walletStatus() + if err != nil { + return err + } + // Request the appropriate next authentication data, or use the one supplied + switch { + case passphrase == "" && status.PinRetryCount > 0: + return ErrPINNeeded + case passphrase == "": + return ErrPINUnblockNeeded + case status.PinRetryCount > 0: + if !regexp.MustCompile(`^[0-9]{6,}$`).MatchString(passphrase) { + w.log.Error("PIN needs to be at least 6 digits") + return ErrPINNeeded + } + if err := w.session.verifyPin([]byte(passphrase)); err != nil { + return err + } + default: + if !regexp.MustCompile(`^[0-9]{12,}$`).MatchString(passphrase) { + w.log.Error("PUK needs to be at least 12 digits") + return ErrPINUnblockNeeded + } + if err := w.session.unblockPin([]byte(passphrase)); err != nil { + return err + } + } + // Smart card paired and unlocked, initialize and register + w.deriveReq = make(chan chan struct{}) + w.deriveQuit = make(chan chan error) + + go w.selfDerive() + + // Notify anyone listening for wallet events that a new device is accessible + go w.Hub.updateFeed.Send(accounts.WalletEvent{Wallet: w, Kind: accounts.WalletOpened}) + + return nil +} + +// Close stops and closes the wallet, freeing any resources. +func (w *Wallet) Close() error { + // Ensure the wallet was opened + w.lock.Lock() + dQuit := w.deriveQuit + w.lock.Unlock() + + // Terminate the self-derivations + var derr error + if dQuit != nil { + errc := make(chan error) + dQuit <- errc + derr = <-errc // Save for later, we *must* close the USB + } + // Terminate the device connection + w.lock.Lock() + defer w.lock.Unlock() + + w.deriveQuit = nil + w.deriveReq = nil + + if err := w.release(); err != nil { + return err + } + return derr +} + +// selfDerive is an account derivation loop that upon request attempts to find +// new non-zero accounts. +func (w *Wallet) selfDerive() { + w.log.Debug("Smart card wallet self-derivation started") + defer w.log.Debug("Smart card wallet self-derivation stopped") + + // Execute self-derivations until termination or error + var ( + reqc chan struct{} + errc chan error + err error + ) + for errc == nil && err == nil { + // Wait until either derivation or termination is requested + select { + case errc = <-w.deriveQuit: + // Termination requested + continue + case reqc = <-w.deriveReq: + // Account discovery requested + } + // Derivation needs a chain and device access, skip if either unavailable + w.lock.Lock() + if w.session == nil || w.deriveChain == nil { + w.lock.Unlock() + reqc <- struct{}{} + continue + } + pairing := w.Hub.pairing(w) + + // Device lock obtained, derive the next batch of accounts + var ( + paths []accounts.DerivationPath + nextAcc accounts.Account + + nextPaths = append([]accounts.DerivationPath{}, w.deriveNextPaths...) + nextAddrs = append([]common.Address{}, w.deriveNextAddrs...) + + context = context.Background() + ) + for i := 0; i < len(nextAddrs); i++ { + for empty := false; !empty; { + // Retrieve the next derived Ethereum account + if nextAddrs[i] == (common.Address{}) { + if nextAcc, err = w.session.derive(nextPaths[i]); err != nil { + w.log.Warn("Smartcard wallet account derivation failed", "err", err) + break + } + nextAddrs[i] = nextAcc.Address + } + // Check the account's status against the current chain state + var ( + balance *big.Int + nonce uint64 + ) + balance, err = w.deriveChain.BalanceAt(context, nextAddrs[i], nil) + if err != nil { + w.log.Warn("Smartcard wallet balance retrieval failed", "err", err) + break + } + nonce, err = w.deriveChain.NonceAt(context, nextAddrs[i], nil) + if err != nil { + w.log.Warn("Smartcard wallet nonce retrieval failed", "err", err) + break + } + // If the next account is empty, stop self-derivation, but add for the last base path + if balance.Sign() == 0 && nonce == 0 { + empty = true + if i < len(nextAddrs)-1 { + break + } + } + // We've just self-derived a new account, start tracking it locally + path := make(accounts.DerivationPath, len(nextPaths[i])) + copy(path[:], nextPaths[i][:]) + paths = append(paths, path) + + // Display a log message to the user for new (or previously empty accounts) + if _, known := pairing.Accounts[nextAddrs[i]]; !known || !empty || nextAddrs[i] != w.deriveNextAddrs[i] { + w.log.Info("Smartcard wallet discovered new account", "address", nextAddrs[i], "path", path, "balance", balance, "nonce", nonce) + } + pairing.Accounts[nextAddrs[i]] = path + + // Fetch the next potential account + if !empty { + nextAddrs[i] = common.Address{} + nextPaths[i][len(nextPaths[i])-1]++ + } + } + } + // If there are new accounts, write them out + if len(paths) > 0 { + err = w.Hub.setPairing(w, pairing) + } + // Shift the self-derivation forward + w.deriveNextAddrs = nextAddrs + w.deriveNextPaths = nextPaths + + // Self derivation complete, release device lock + w.lock.Unlock() + + // Notify the user of termination and loop after a bit of time (to avoid trashing) + reqc <- struct{}{} + if err == nil { + select { + case errc = <-w.deriveQuit: + // Termination requested, abort + case <-time.After(selfDeriveThrottling): + // Waited enough, willing to self-derive again + } + } + } + // In case of error, wait for termination + if err != nil { + w.log.Debug("Smartcard wallet self-derivation failed", "err", err) + errc = <-w.deriveQuit + } + errc <- err +} + +// Accounts retrieves the list of signing accounts the wallet is currently aware +// of. For hierarchical deterministic wallets, the list will not be exhaustive, +// rather only contain the accounts explicitly pinned during account derivation. +func (w *Wallet) Accounts() []accounts.Account { + // Attempt self-derivation if it's running + reqc := make(chan struct{}, 1) + select { + case w.deriveReq <- reqc: + // Self-derivation request accepted, wait for it + <-reqc + default: + // Self-derivation offline, throttled or busy, skip + } + + w.lock.Lock() + defer w.lock.Unlock() + + if pairing := w.Hub.pairing(w); pairing != nil { + ret := make([]accounts.Account, 0, len(pairing.Accounts)) + for address, path := range pairing.Accounts { + ret = append(ret, w.makeAccount(address, path)) + } + sort.Sort(accounts.AccountsByURL(ret)) + return ret + } + return nil +} + +func (w *Wallet) makeAccount(address common.Address, path accounts.DerivationPath) accounts.Account { + return accounts.Account{ + Address: address, + URL: accounts.URL{ + Scheme: w.Hub.scheme, + Path: fmt.Sprintf("%x/%s", w.PublicKey[1:3], path.String()), + }, + } +} + +// Contains returns whether an account is part of this particular wallet or not. +func (w *Wallet) Contains(account accounts.Account) bool { + if pairing := w.Hub.pairing(w); pairing != nil { + _, ok := pairing.Accounts[account.Address] + return ok + } + return false +} + +// Initialize installs a keypair generated from the provided key into the wallet. +func (w *Wallet) Initialize(seed []byte) error { + go w.selfDerive() + // DO NOT lock at this stage, as the initialize + // function relies on Status() + return w.session.initialize(seed) +} + +// Derive attempts to explicitly derive a hierarchical deterministic account at +// the specified derivation path. If requested, the derived account will be added +// to the wallet's tracked account list. +func (w *Wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { + w.lock.Lock() + defer w.lock.Unlock() + + account, err := w.session.derive(path) + if err != nil { + return accounts.Account{}, err + } + + if pin { + pairing := w.Hub.pairing(w) + pairing.Accounts[account.Address] = path + if err := w.Hub.setPairing(w, pairing); err != nil { + return accounts.Account{}, err + } + } + + return account, nil +} + +// SelfDerive sets a base account derivation path from which the wallet attempts +// to discover non zero accounts and automatically add them to list of tracked +// accounts. +// +// Note, self derivaton will increment the last component of the specified path +// opposed to decending into a child path to allow discovering accounts starting +// from non zero components. +// +// Some hardware wallets switched derivation paths through their evolution, so +// this method supports providing multiple bases to discover old user accounts +// too. Only the last base will be used to derive the next empty account. +// +// You can disable automatic account discovery by calling SelfDerive with a nil +// chain state reader. +func (w *Wallet) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) { + w.lock.Lock() + defer w.lock.Unlock() + + w.deriveNextPaths = make([]accounts.DerivationPath, len(bases)) + for i, base := range bases { + w.deriveNextPaths[i] = make(accounts.DerivationPath, len(base)) + copy(w.deriveNextPaths[i][:], base[:]) + } + w.deriveNextAddrs = make([]common.Address, len(bases)) + w.deriveChain = chain +} + +// SignData requests the wallet to sign the hash of the given data. +// +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +// +// If the wallet requires additional authentication to sign the request (e.g. +// a password to decrypt the account, or a PIN code o verify the transaction), +// an AuthNeededError instance will be returned, containing infos for the user +// about which fields or actions are needed. The user may retry by providing +// the needed details via SignDataWithPassphrase, or by other means (e.g. unlock +// the account in a keystore). +func (w *Wallet) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) { + return w.signHash(account, crypto.Keccak256(data)) +} + +func (w *Wallet) signHash(account accounts.Account, hash []byte) ([]byte, error) { + w.lock.Lock() + defer w.lock.Unlock() + + path, err := w.findAccountPath(account) + if err != nil { + return nil, err + } + + return w.session.sign(path, hash) +} + +// SignTx requests the wallet to sign the given transaction. +// +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +// +// If the wallet requires additional authentication to sign the request (e.g. +// a password to decrypt the account, or a PIN code o verify the transaction), +// an AuthNeededError instance will be returned, containing infos for the user +// about which fields or actions are needed. The user may retry by providing +// the needed details via SignTxWithPassphrase, or by other means (e.g. unlock +// the account in a keystore). +func (w *Wallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + signer := types.NewEIP155Signer(chainID) + hash := signer.Hash(tx) + sig, err := w.signHash(account, hash[:]) + if err != nil { + return nil, err + } + return tx.WithSignature(signer, sig) +} + +// SignDataWithPassphrase requests the wallet to sign the given hash with the +// given passphrase as extra authentication information. +// +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +func (w *Wallet) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) { + return w.signHashWithPassphrase(account, passphrase, crypto.Keccak256(data)) +} + +func (w *Wallet) signHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { + if !w.session.verified { + if err := w.Open(passphrase); err != nil { + return nil, err + } + } + + return w.signHash(account, hash) +} + +// SignText requests the wallet to sign the hash of a given piece of data, prefixed +// by the Ethereum prefix scheme +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +// +// If the wallet requires additional authentication to sign the request (e.g. +// a password to decrypt the account, or a PIN code o verify the transaction), +// an AuthNeededError instance will be returned, containing infos for the user +// about which fields or actions are needed. The user may retry by providing +// the needed details via SignHashWithPassphrase, or by other means (e.g. unlock +// the account in a keystore). +func (w *Wallet) SignText(account accounts.Account, text []byte) ([]byte, error) { + return w.signHash(account, accounts.TextHash(text)) +} + +// SignTextWithPassphrase implements accounts.Wallet, attempting to sign the +// given hash with the given account using passphrase as extra authentication +func (w *Wallet) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error) { + return w.signHashWithPassphrase(account, passphrase, crypto.Keccak256(accounts.TextHash(text))) +} + +// SignTxWithPassphrase requests the wallet to sign the given transaction, with the +// given passphrase as extra authentication information. +// +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +func (w *Wallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + if !w.session.verified { + if err := w.Open(passphrase); err != nil { + return nil, err + } + } + return w.SignTx(account, tx, chainID) +} + +// findAccountPath returns the derivation path for the provided account. +// It first checks for the address in the list of pinned accounts, and if it is +// not found, attempts to parse the derivation path from the account's URL. +func (w *Wallet) findAccountPath(account accounts.Account) (accounts.DerivationPath, error) { + pairing := w.Hub.pairing(w) + if path, ok := pairing.Accounts[account.Address]; ok { + return path, nil + } + + // Look for the path in the URL + if account.URL.Scheme != w.Hub.scheme { + return nil, fmt.Errorf("Scheme %s does not match wallet scheme %s", account.URL.Scheme, w.Hub.scheme) + } + + parts := strings.SplitN(account.URL.Path, "/", 2) + if len(parts) != 2 { + return nil, fmt.Errorf("Invalid URL format: %s", account.URL) + } + + if parts[0] != fmt.Sprintf("%x", w.PublicKey[1:3]) { + return nil, fmt.Errorf("URL %s is not for this wallet", account.URL) + } + + return accounts.ParseDerivationPath(parts[1]) +} + +// Session represents a secured communication session with the wallet. +type Session struct { + Wallet *Wallet // A handle to the wallet that opened the session + Channel *SecureChannelSession // A secure channel for encrypted messages + verified bool // Whether the pin has been verified in this session. +} + +// pair establishes a new pairing over this channel, using the provided secret. +func (s *Session) pair(secret []byte) (smartcardPairing, error) { + err := s.Channel.Pair(secret) + if err != nil { + return smartcardPairing{}, err + } + + return smartcardPairing{ + PublicKey: s.Wallet.PublicKey, + PairingIndex: s.Channel.PairingIndex, + PairingKey: s.Channel.PairingKey, + Accounts: make(map[common.Address]accounts.DerivationPath), + }, nil +} + +// unpair deletes an existing pairing. +func (s *Session) unpair() error { + if !s.verified { + return fmt.Errorf("Unpair requires that the PIN be verified") + } + return s.Channel.Unpair() +} + +// verifyPin unlocks a wallet with the provided pin. +func (s *Session) verifyPin(pin []byte) error { + if _, err := s.Channel.transmitEncrypted(claSCWallet, insVerifyPin, 0, 0, pin); err != nil { + return err + } + s.verified = true + return nil +} + +// unblockPin unblocks a wallet with the provided puk and resets the pin to the +// new one specified. +func (s *Session) unblockPin(pukpin []byte) error { + if _, err := s.Channel.transmitEncrypted(claSCWallet, insUnblockPin, 0, 0, pukpin); err != nil { + return err + } + s.verified = true + return nil +} + +// release releases resources associated with the channel. +func (s *Session) release() error { + return s.Wallet.card.Disconnect(pcsc.LeaveCard) +} + +// paired returns true if a valid pairing exists. +func (s *Session) paired() bool { + return s.Channel.PairingKey != nil +} + +// authenticate uses an existing pairing to establish a secure channel. +func (s *Session) authenticate(pairing smartcardPairing) error { + if !bytes.Equal(s.Wallet.PublicKey, pairing.PublicKey) { + return fmt.Errorf("Cannot pair using another wallet's pairing; %x != %x", s.Wallet.PublicKey, pairing.PublicKey) + } + s.Channel.PairingKey = pairing.PairingKey + s.Channel.PairingIndex = pairing.PairingIndex + return s.Channel.Open() +} + +// walletStatus describes a smartcard wallet's status information. +type walletStatus struct { + PinRetryCount int // Number of remaining PIN retries + PukRetryCount int // Number of remaining PUK retries + Initialized bool // Whether the card has been initialized with a private key +} + +// walletStatus fetches the wallet's status from the card. +func (s *Session) walletStatus() (*walletStatus, error) { + response, err := s.Channel.transmitEncrypted(claSCWallet, insStatus, statusP1WalletStatus, 0, nil) + if err != nil { + return nil, err + } + + status := new(walletStatus) + if _, err := asn1.UnmarshalWithParams(response.Data, status, "tag:3"); err != nil { + return nil, err + } + return status, nil +} + +// derivationPath fetches the wallet's current derivation path from the card. +func (s *Session) derivationPath() (accounts.DerivationPath, error) { + response, err := s.Channel.transmitEncrypted(claSCWallet, insStatus, statusP1Path, 0, nil) + if err != nil { + return nil, err + } + buf := bytes.NewReader(response.Data) + path := make(accounts.DerivationPath, len(response.Data)/4) + return path, binary.Read(buf, binary.BigEndian, &path) +} + +// initializeData contains data needed to initialize the smartcard wallet. +type initializeData struct { + PublicKey []byte `asn1:"tag:0"` + PrivateKey []byte `asn1:"tag:1"` + ChainCode []byte `asn1:"tag:2"` +} + +// initialize initializes the card with new key data. +func (s *Session) initialize(seed []byte) error { + // Check that the wallet isn't currently initialized, + // otherwise the key would be overwritten. + status, err := s.Wallet.Status() + if err != nil { + return err + } + if status == "Online" { + return fmt.Errorf("card is already initialized, cowardly refusing to proceed") + } + + s.Wallet.lock.Lock() + defer s.Wallet.lock.Unlock() + + // HMAC the seed to produce the private key and chain code + mac := hmac.New(sha512.New, []byte("Bitcoin seed")) + mac.Write(seed) + seed = mac.Sum(nil) + + key, err := crypto.ToECDSA(seed[:32]) + if err != nil { + return err + } + + id := initializeData{} + id.PublicKey = crypto.FromECDSAPub(&key.PublicKey) + id.PrivateKey = seed[:32] + id.ChainCode = seed[32:] + data, err := asn1.Marshal(id) + if err != nil { + return err + } + + // Nasty hack to force the top-level struct tag to be context-specific + data[0] = 0xA1 + + _, err = s.Channel.transmitEncrypted(claSCWallet, insLoadKey, 0x02, 0, data) + return err +} + +// derive derives a new HD key path on the card. +func (s *Session) derive(path accounts.DerivationPath) (accounts.Account, error) { + startingPoint, path, err := derivationpath.Decode(path.String()) + if err != nil { + return accounts.Account{}, err + } + + var p1 uint8 + switch startingPoint { + case derivationpath.StartingPointMaster: + p1 = P1DeriveKeyFromMaster + case derivationpath.StartingPointParent: + p1 = P1DeriveKeyFromParent + case derivationpath.StartingPointCurrent: + p1 = P1DeriveKeyFromCurrent + default: + return accounts.Account{}, fmt.Errorf("invalid startingPoint %d", startingPoint) + } + + data := new(bytes.Buffer) + for _, segment := range path { + if err := binary.Write(data, binary.BigEndian, segment); err != nil { + return accounts.Account{}, err + } + } + + _, err = s.Channel.transmitEncrypted(claSCWallet, insDeriveKey, p1, 0, data.Bytes()) + if err != nil { + return accounts.Account{}, err + } + + response, err := s.Channel.transmitEncrypted(claSCWallet, insSign, 0, 0, DerivationSignatureHash[:]) + if err != nil { + return accounts.Account{}, err + } + + sigdata := new(signatureData) + if _, err := asn1.UnmarshalWithParams(response.Data, sigdata, "tag:0"); err != nil { + return accounts.Account{}, err + } + rbytes, sbytes := sigdata.Signature.R.Bytes(), sigdata.Signature.S.Bytes() + sig := make([]byte, 65) + copy(sig[32-len(rbytes):32], rbytes) + copy(sig[64-len(sbytes):64], sbytes) + + if err := confirmPublicKey(sig, sigdata.PublicKey); err != nil { + return accounts.Account{}, err + } + pub, err := crypto.UnmarshalPubkey(sigdata.PublicKey) + if err != nil { + return accounts.Account{}, err + } + return s.Wallet.makeAccount(crypto.PubkeyToAddress(*pub), path), nil +} + +// keyExport contains information on an exported keypair. +type keyExport struct { + PublicKey []byte `asn1:"tag:0"` + PrivateKey []byte `asn1:"tag:1,optional"` +} + +// publicKey returns the public key for the current derivation path. +func (s *Session) publicKey() ([]byte, error) { + response, err := s.Channel.transmitEncrypted(claSCWallet, insExportKey, exportP1Any, exportP2Pubkey, nil) + if err != nil { + return nil, err + } + keys := new(keyExport) + if _, err := asn1.UnmarshalWithParams(response.Data, keys, "tag:1"); err != nil { + return nil, err + } + return keys.PublicKey, nil +} + +// signatureData contains information on a signature - the signature itself and +// the corresponding public key. +type signatureData struct { + PublicKey []byte `asn1:"tag:0"` + Signature struct { + R *big.Int + S *big.Int + } +} + +// sign asks the card to sign a message, and returns a valid signature after +// recovering the v value. +func (s *Session) sign(path accounts.DerivationPath, hash []byte) ([]byte, error) { + startTime := time.Now() + _, err := s.derive(path) + if err != nil { + return nil, err + } + deriveTime := time.Now() + + response, err := s.Channel.transmitEncrypted(claSCWallet, insSign, signP1PrecomputedHash, signP2OnlyBlock, hash) + if err != nil { + return nil, err + } + sigdata := new(signatureData) + if _, err := asn1.UnmarshalWithParams(response.Data, sigdata, "tag:0"); err != nil { + return nil, err + } + // Serialize the signature + rbytes, sbytes := sigdata.Signature.R.Bytes(), sigdata.Signature.S.Bytes() + sig := make([]byte, 65) + copy(sig[32-len(rbytes):32], rbytes) + copy(sig[64-len(sbytes):64], sbytes) + + // Recover the V value. + sig, err = makeRecoverableSignature(hash, sig, sigdata.PublicKey) + if err != nil { + return nil, err + } + log.Debug("Signed using smartcard", "deriveTime", deriveTime.Sub(startTime), "signingTime", time.Since(deriveTime)) + + return sig, nil +} + +// confirmPublicKey confirms that the given signature belongs to the specified key. +func confirmPublicKey(sig, pubkey []byte) error { + _, err := makeRecoverableSignature(DerivationSignatureHash[:], sig, pubkey) + return err +} + +// makeRecoverableSignature uses a signature and an expected public key to +// recover the v value and produce a recoverable signature. +func makeRecoverableSignature(hash, sig, expectedPubkey []byte) ([]byte, error) { + var libraryError error + for v := 0; v < 2; v++ { + sig[64] = byte(v) + if pubkey, err := crypto.Ecrecover(hash, sig); err == nil { + if bytes.Equal(pubkey, expectedPubkey) { + return sig, nil + } + } else { + libraryError = err + } + } + if libraryError != nil { + return nil, libraryError + } + return nil, ErrPubkeyMismatch +} diff --git a/accounts/sort.go b/accounts/sort.go new file mode 100644 index 000000000000..f46762114af4 --- /dev/null +++ b/accounts/sort.go @@ -0,0 +1,31 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package accounts + +// AccountsByURL implements sort.Interface for []Account based on the URL field. +type AccountsByURL []Account + +func (a AccountsByURL) Len() int { return len(a) } +func (a AccountsByURL) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a AccountsByURL) Less(i, j int) bool { return a[i].URL.Cmp(a[j].URL) < 0 } + +// WalletsByURL implements sort.Interface for []Wallet based on the URL field. +type WalletsByURL []Wallet + +func (w WalletsByURL) Len() int { return len(w) } +func (w WalletsByURL) Swap(i, j int) { w[i], w[j] = w[j], w[i] } +func (w WalletsByURL) Less(i, j int) bool { return w[i].URL().Cmp(w[j].URL()) < 0 } diff --git a/accounts/url_test.go b/accounts/url_test.go index 802772871947..bd6f35fa2a0e 100644 --- a/accounts/url_test.go +++ b/accounts/url_test.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify diff --git a/accounts/usbwallet/hub.go b/accounts/usbwallet/hub.go index 640320bc9143..23be98a08483 100644 --- a/accounts/usbwallet/hub.go +++ b/accounts/usbwallet/hub.go @@ -20,12 +20,13 @@ import ( "errors" "runtime" "sync" + "sync/atomic" "time" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" - "github.com/karalabe/hid" + "github.com/karalabe/usb" ) // LedgerScheme is the protocol scheme prefixing account and wallet URLs. @@ -64,21 +65,41 @@ type Hub struct { // TODO(karalabe): remove if hotplug lands on Windows commsPend int // Number of operations blocking enumeration commsLock sync.Mutex // Lock protecting the pending counter and enumeration + enumFails uint32 // Number of times enumeration has failed } // NewLedgerHub creates a new hardware wallet manager for Ledger devices. func NewLedgerHub() (*Hub, error) { - return newHub(LedgerScheme, 0x2c97, []uint16{0x0000 /* Ledger Blue */, 0x0001 /* Ledger Nano S */}, 0xffa0, 0, newLedgerDriver) + return newHub(LedgerScheme, 0x2c97, []uint16{ + // Original product IDs + 0x0000, /* Ledger Blue */ + 0x0001, /* Ledger Nano S */ + 0x0004, /* Ledger Nano X */ + + // Upcoming product IDs: https://www.ledger.com/2019/05/17/windows-10-update-sunsetting-u2f-tunnel-transport-for-ledger-devices/ + 0x0015, /* HID + U2F + WebUSB Ledger Blue */ + 0x1015, /* HID + U2F + WebUSB Ledger Nano S */ + 0x4015, /* HID + U2F + WebUSB Ledger Nano X */ + 0x0011, /* HID + WebUSB Ledger Blue */ + 0x1011, /* HID + WebUSB Ledger Nano S */ + 0x4011, /* HID + WebUSB Ledger Nano X */ + }, 0xffa0, 0, newLedgerDriver) } -// NewTrezorHub creates a new hardware wallet manager for Trezor devices. -func NewTrezorHub() (*Hub, error) { - return newHub(TrezorScheme, 0x534c, []uint16{0x0001 /* Trezor 1 */}, 0xff00, 0, newTrezorDriver) +// NewTrezorHubWithHID creates a new hardware wallet manager for Trezor devices. +func NewTrezorHubWithHID() (*Hub, error) { + return newHub(TrezorScheme, 0x534c, []uint16{0x0001 /* Trezor HID */}, 0xff00, 0, newTrezorDriver) +} + +// NewTrezorHubWithWebUSB creates a new hardware wallet manager for Trezor devices with +// firmware version > 1.8.0 +func NewTrezorHubWithWebUSB() (*Hub, error) { + return newHub(TrezorScheme, 0x1209, []uint16{0x53c1 /* Trezor WebUSB */}, 0xffff /* No usage id on webusb, don't match unset (0) */, 0, newTrezorDriver) } // newHub creates a new hardware wallet manager for generic USB devices. func newHub(scheme string, vendorID uint16, productIDs []uint16, usageID uint16, endpointID int, makeDriver func(log.Logger) driver) (*Hub, error) { - if !hid.Supported() { + if !usb.Supported() { return nil, errors.New("unsupported platform") } hub := &Hub{ @@ -119,8 +140,12 @@ func (hub *Hub) refreshWallets() { if elapsed < refreshThrottling { return } + // If USB enumeration is continually failing, don't keep trying indefinitely + if atomic.LoadUint32(&hub.enumFails) > 2 { + return + } // Retrieve the current list of USB wallet devices - var devices []hid.DeviceInfo + var devices []usb.DeviceInfo if runtime.GOOS == "linux" { // hidapi on Linux opens the device during enumeration to retrieve some infos, @@ -135,8 +160,22 @@ func (hub *Hub) refreshWallets() { return } } - for _, info := range hid.Enumerate(hub.vendorID, 0) { + infos, err := usb.Enumerate(hub.vendorID, 0) + if err != nil { + failcount := atomic.AddUint32(&hub.enumFails, 1) + if runtime.GOOS == "linux" { + // See rationale before the enumeration why this is needed and only on Linux. + hub.commsLock.Unlock() + } + log.Error("Failed to enumerate USB devices", "hub", hub.scheme, + "vendor", hub.vendorID, "failcount", failcount, "err", err) + return + } + atomic.StoreUint32(&hub.enumFails, 0) + + for _, info := range infos { for _, id := range hub.productIDs { + // Windows and Macos use UsageID matching, Linux uses Interface matching if info.ProductID == id && (info.UsagePage == hub.usageID || info.Interface == hub.endpointID) { devices = append(devices, info) break @@ -150,8 +189,10 @@ func (hub *Hub) refreshWallets() { // Transform the current list of wallets into the new one hub.stateLock.Lock() - wallets := make([]accounts.Wallet, 0, len(devices)) - events := []accounts.WalletEvent{} + var ( + wallets = make([]accounts.Wallet, 0, len(devices)) + events []accounts.WalletEvent + ) for _, device := range devices { url := accounts.URL{Scheme: hub.scheme, Path: device.Path} diff --git a/accounts/usbwallet/internal/trezor/messages.pb.go b/accounts/usbwallet/internal/trezor/messages.pb.go deleted file mode 100644 index 15bb6fb73bc7..000000000000 --- a/accounts/usbwallet/internal/trezor/messages.pb.go +++ /dev/null @@ -1,3081 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: messages.proto - -package trezor - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// * -// Mapping between Trezor wire identifier (uint) and a protobuf message -type MessageType int32 - -const ( - MessageType_MessageType_Initialize MessageType = 0 - MessageType_MessageType_Ping MessageType = 1 - MessageType_MessageType_Success MessageType = 2 - MessageType_MessageType_Failure MessageType = 3 - MessageType_MessageType_ChangePin MessageType = 4 - MessageType_MessageType_WipeDevice MessageType = 5 - MessageType_MessageType_FirmwareErase MessageType = 6 - MessageType_MessageType_FirmwareUpload MessageType = 7 - MessageType_MessageType_FirmwareRequest MessageType = 8 - MessageType_MessageType_GetEntropy MessageType = 9 - MessageType_MessageType_Entropy MessageType = 10 - MessageType_MessageType_GetPublicKey MessageType = 11 - MessageType_MessageType_PublicKey MessageType = 12 - MessageType_MessageType_LoadDevice MessageType = 13 - MessageType_MessageType_ResetDevice MessageType = 14 - MessageType_MessageType_SignTx MessageType = 15 - MessageType_MessageType_SimpleSignTx MessageType = 16 - MessageType_MessageType_Features MessageType = 17 - MessageType_MessageType_PinMatrixRequest MessageType = 18 - MessageType_MessageType_PinMatrixAck MessageType = 19 - MessageType_MessageType_Cancel MessageType = 20 - MessageType_MessageType_TxRequest MessageType = 21 - MessageType_MessageType_TxAck MessageType = 22 - MessageType_MessageType_CipherKeyValue MessageType = 23 - MessageType_MessageType_ClearSession MessageType = 24 - MessageType_MessageType_ApplySettings MessageType = 25 - MessageType_MessageType_ButtonRequest MessageType = 26 - MessageType_MessageType_ButtonAck MessageType = 27 - MessageType_MessageType_ApplyFlags MessageType = 28 - MessageType_MessageType_GetAddress MessageType = 29 - MessageType_MessageType_Address MessageType = 30 - MessageType_MessageType_SelfTest MessageType = 32 - MessageType_MessageType_BackupDevice MessageType = 34 - MessageType_MessageType_EntropyRequest MessageType = 35 - MessageType_MessageType_EntropyAck MessageType = 36 - MessageType_MessageType_SignMessage MessageType = 38 - MessageType_MessageType_VerifyMessage MessageType = 39 - MessageType_MessageType_MessageSignature MessageType = 40 - MessageType_MessageType_PassphraseRequest MessageType = 41 - MessageType_MessageType_PassphraseAck MessageType = 42 - MessageType_MessageType_EstimateTxSize MessageType = 43 - MessageType_MessageType_TxSize MessageType = 44 - MessageType_MessageType_RecoveryDevice MessageType = 45 - MessageType_MessageType_WordRequest MessageType = 46 - MessageType_MessageType_WordAck MessageType = 47 - MessageType_MessageType_CipheredKeyValue MessageType = 48 - MessageType_MessageType_EncryptMessage MessageType = 49 - MessageType_MessageType_EncryptedMessage MessageType = 50 - MessageType_MessageType_DecryptMessage MessageType = 51 - MessageType_MessageType_DecryptedMessage MessageType = 52 - MessageType_MessageType_SignIdentity MessageType = 53 - MessageType_MessageType_SignedIdentity MessageType = 54 - MessageType_MessageType_GetFeatures MessageType = 55 - MessageType_MessageType_EthereumGetAddress MessageType = 56 - MessageType_MessageType_EthereumAddress MessageType = 57 - MessageType_MessageType_EthereumSignTx MessageType = 58 - MessageType_MessageType_EthereumTxRequest MessageType = 59 - MessageType_MessageType_EthereumTxAck MessageType = 60 - MessageType_MessageType_GetECDHSessionKey MessageType = 61 - MessageType_MessageType_ECDHSessionKey MessageType = 62 - MessageType_MessageType_SetU2FCounter MessageType = 63 - MessageType_MessageType_EthereumSignMessage MessageType = 64 - MessageType_MessageType_EthereumVerifyMessage MessageType = 65 - MessageType_MessageType_EthereumMessageSignature MessageType = 66 - MessageType_MessageType_DebugLinkDecision MessageType = 100 - MessageType_MessageType_DebugLinkGetState MessageType = 101 - MessageType_MessageType_DebugLinkState MessageType = 102 - MessageType_MessageType_DebugLinkStop MessageType = 103 - MessageType_MessageType_DebugLinkLog MessageType = 104 - MessageType_MessageType_DebugLinkMemoryRead MessageType = 110 - MessageType_MessageType_DebugLinkMemory MessageType = 111 - MessageType_MessageType_DebugLinkMemoryWrite MessageType = 112 - MessageType_MessageType_DebugLinkFlashErase MessageType = 113 -) - -var MessageType_name = map[int32]string{ - 0: "MessageType_Initialize", - 1: "MessageType_Ping", - 2: "MessageType_Success", - 3: "MessageType_Failure", - 4: "MessageType_ChangePin", - 5: "MessageType_WipeDevice", - 6: "MessageType_FirmwareErase", - 7: "MessageType_FirmwareUpload", - 8: "MessageType_FirmwareRequest", - 9: "MessageType_GetEntropy", - 10: "MessageType_Entropy", - 11: "MessageType_GetPublicKey", - 12: "MessageType_PublicKey", - 13: "MessageType_LoadDevice", - 14: "MessageType_ResetDevice", - 15: "MessageType_SignTx", - 16: "MessageType_SimpleSignTx", - 17: "MessageType_Features", - 18: "MessageType_PinMatrixRequest", - 19: "MessageType_PinMatrixAck", - 20: "MessageType_Cancel", - 21: "MessageType_TxRequest", - 22: "MessageType_TxAck", - 23: "MessageType_CipherKeyValue", - 24: "MessageType_ClearSession", - 25: "MessageType_ApplySettings", - 26: "MessageType_ButtonRequest", - 27: "MessageType_ButtonAck", - 28: "MessageType_ApplyFlags", - 29: "MessageType_GetAddress", - 30: "MessageType_Address", - 32: "MessageType_SelfTest", - 34: "MessageType_BackupDevice", - 35: "MessageType_EntropyRequest", - 36: "MessageType_EntropyAck", - 38: "MessageType_SignMessage", - 39: "MessageType_VerifyMessage", - 40: "MessageType_MessageSignature", - 41: "MessageType_PassphraseRequest", - 42: "MessageType_PassphraseAck", - 43: "MessageType_EstimateTxSize", - 44: "MessageType_TxSize", - 45: "MessageType_RecoveryDevice", - 46: "MessageType_WordRequest", - 47: "MessageType_WordAck", - 48: "MessageType_CipheredKeyValue", - 49: "MessageType_EncryptMessage", - 50: "MessageType_EncryptedMessage", - 51: "MessageType_DecryptMessage", - 52: "MessageType_DecryptedMessage", - 53: "MessageType_SignIdentity", - 54: "MessageType_SignedIdentity", - 55: "MessageType_GetFeatures", - 56: "MessageType_EthereumGetAddress", - 57: "MessageType_EthereumAddress", - 58: "MessageType_EthereumSignTx", - 59: "MessageType_EthereumTxRequest", - 60: "MessageType_EthereumTxAck", - 61: "MessageType_GetECDHSessionKey", - 62: "MessageType_ECDHSessionKey", - 63: "MessageType_SetU2FCounter", - 64: "MessageType_EthereumSignMessage", - 65: "MessageType_EthereumVerifyMessage", - 66: "MessageType_EthereumMessageSignature", - 100: "MessageType_DebugLinkDecision", - 101: "MessageType_DebugLinkGetState", - 102: "MessageType_DebugLinkState", - 103: "MessageType_DebugLinkStop", - 104: "MessageType_DebugLinkLog", - 110: "MessageType_DebugLinkMemoryRead", - 111: "MessageType_DebugLinkMemory", - 112: "MessageType_DebugLinkMemoryWrite", - 113: "MessageType_DebugLinkFlashErase", -} -var MessageType_value = map[string]int32{ - "MessageType_Initialize": 0, - "MessageType_Ping": 1, - "MessageType_Success": 2, - "MessageType_Failure": 3, - "MessageType_ChangePin": 4, - "MessageType_WipeDevice": 5, - "MessageType_FirmwareErase": 6, - "MessageType_FirmwareUpload": 7, - "MessageType_FirmwareRequest": 8, - "MessageType_GetEntropy": 9, - "MessageType_Entropy": 10, - "MessageType_GetPublicKey": 11, - "MessageType_PublicKey": 12, - "MessageType_LoadDevice": 13, - "MessageType_ResetDevice": 14, - "MessageType_SignTx": 15, - "MessageType_SimpleSignTx": 16, - "MessageType_Features": 17, - "MessageType_PinMatrixRequest": 18, - "MessageType_PinMatrixAck": 19, - "MessageType_Cancel": 20, - "MessageType_TxRequest": 21, - "MessageType_TxAck": 22, - "MessageType_CipherKeyValue": 23, - "MessageType_ClearSession": 24, - "MessageType_ApplySettings": 25, - "MessageType_ButtonRequest": 26, - "MessageType_ButtonAck": 27, - "MessageType_ApplyFlags": 28, - "MessageType_GetAddress": 29, - "MessageType_Address": 30, - "MessageType_SelfTest": 32, - "MessageType_BackupDevice": 34, - "MessageType_EntropyRequest": 35, - "MessageType_EntropyAck": 36, - "MessageType_SignMessage": 38, - "MessageType_VerifyMessage": 39, - "MessageType_MessageSignature": 40, - "MessageType_PassphraseRequest": 41, - "MessageType_PassphraseAck": 42, - "MessageType_EstimateTxSize": 43, - "MessageType_TxSize": 44, - "MessageType_RecoveryDevice": 45, - "MessageType_WordRequest": 46, - "MessageType_WordAck": 47, - "MessageType_CipheredKeyValue": 48, - "MessageType_EncryptMessage": 49, - "MessageType_EncryptedMessage": 50, - "MessageType_DecryptMessage": 51, - "MessageType_DecryptedMessage": 52, - "MessageType_SignIdentity": 53, - "MessageType_SignedIdentity": 54, - "MessageType_GetFeatures": 55, - "MessageType_EthereumGetAddress": 56, - "MessageType_EthereumAddress": 57, - "MessageType_EthereumSignTx": 58, - "MessageType_EthereumTxRequest": 59, - "MessageType_EthereumTxAck": 60, - "MessageType_GetECDHSessionKey": 61, - "MessageType_ECDHSessionKey": 62, - "MessageType_SetU2FCounter": 63, - "MessageType_EthereumSignMessage": 64, - "MessageType_EthereumVerifyMessage": 65, - "MessageType_EthereumMessageSignature": 66, - "MessageType_DebugLinkDecision": 100, - "MessageType_DebugLinkGetState": 101, - "MessageType_DebugLinkState": 102, - "MessageType_DebugLinkStop": 103, - "MessageType_DebugLinkLog": 104, - "MessageType_DebugLinkMemoryRead": 110, - "MessageType_DebugLinkMemory": 111, - "MessageType_DebugLinkMemoryWrite": 112, - "MessageType_DebugLinkFlashErase": 113, -} - -func (x MessageType) Enum() *MessageType { - p := new(MessageType) - *p = x - return p -} -func (x MessageType) String() string { - return proto.EnumName(MessageType_name, int32(x)) -} -func (x *MessageType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MessageType_value, data, "MessageType") - if err != nil { - return err - } - *x = MessageType(value) - return nil -} -func (MessageType) EnumDescriptor() ([]byte, []int) { return fileDescriptor1, []int{0} } - -// * -// Request: Reset device to default state and ask for device details -// @next Features -type Initialize struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *Initialize) Reset() { *m = Initialize{} } -func (m *Initialize) String() string { return proto.CompactTextString(m) } -func (*Initialize) ProtoMessage() {} -func (*Initialize) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} } - -// * -// Request: Ask for device details (no device reset) -// @next Features -type GetFeatures struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *GetFeatures) Reset() { *m = GetFeatures{} } -func (m *GetFeatures) String() string { return proto.CompactTextString(m) } -func (*GetFeatures) ProtoMessage() {} -func (*GetFeatures) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{1} } - -// * -// Response: Reports various information about the device -// @prev Initialize -// @prev GetFeatures -type Features struct { - Vendor *string `protobuf:"bytes,1,opt,name=vendor" json:"vendor,omitempty"` - MajorVersion *uint32 `protobuf:"varint,2,opt,name=major_version,json=majorVersion" json:"major_version,omitempty"` - MinorVersion *uint32 `protobuf:"varint,3,opt,name=minor_version,json=minorVersion" json:"minor_version,omitempty"` - PatchVersion *uint32 `protobuf:"varint,4,opt,name=patch_version,json=patchVersion" json:"patch_version,omitempty"` - BootloaderMode *bool `protobuf:"varint,5,opt,name=bootloader_mode,json=bootloaderMode" json:"bootloader_mode,omitempty"` - DeviceId *string `protobuf:"bytes,6,opt,name=device_id,json=deviceId" json:"device_id,omitempty"` - PinProtection *bool `protobuf:"varint,7,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` - PassphraseProtection *bool `protobuf:"varint,8,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` - Language *string `protobuf:"bytes,9,opt,name=language" json:"language,omitempty"` - Label *string `protobuf:"bytes,10,opt,name=label" json:"label,omitempty"` - Coins []*CoinType `protobuf:"bytes,11,rep,name=coins" json:"coins,omitempty"` - Initialized *bool `protobuf:"varint,12,opt,name=initialized" json:"initialized,omitempty"` - Revision []byte `protobuf:"bytes,13,opt,name=revision" json:"revision,omitempty"` - BootloaderHash []byte `protobuf:"bytes,14,opt,name=bootloader_hash,json=bootloaderHash" json:"bootloader_hash,omitempty"` - Imported *bool `protobuf:"varint,15,opt,name=imported" json:"imported,omitempty"` - PinCached *bool `protobuf:"varint,16,opt,name=pin_cached,json=pinCached" json:"pin_cached,omitempty"` - PassphraseCached *bool `protobuf:"varint,17,opt,name=passphrase_cached,json=passphraseCached" json:"passphrase_cached,omitempty"` - FirmwarePresent *bool `protobuf:"varint,18,opt,name=firmware_present,json=firmwarePresent" json:"firmware_present,omitempty"` - NeedsBackup *bool `protobuf:"varint,19,opt,name=needs_backup,json=needsBackup" json:"needs_backup,omitempty"` - Flags *uint32 `protobuf:"varint,20,opt,name=flags" json:"flags,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Features) Reset() { *m = Features{} } -func (m *Features) String() string { return proto.CompactTextString(m) } -func (*Features) ProtoMessage() {} -func (*Features) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{2} } - -func (m *Features) GetVendor() string { - if m != nil && m.Vendor != nil { - return *m.Vendor - } - return "" -} - -func (m *Features) GetMajorVersion() uint32 { - if m != nil && m.MajorVersion != nil { - return *m.MajorVersion - } - return 0 -} - -func (m *Features) GetMinorVersion() uint32 { - if m != nil && m.MinorVersion != nil { - return *m.MinorVersion - } - return 0 -} - -func (m *Features) GetPatchVersion() uint32 { - if m != nil && m.PatchVersion != nil { - return *m.PatchVersion - } - return 0 -} - -func (m *Features) GetBootloaderMode() bool { - if m != nil && m.BootloaderMode != nil { - return *m.BootloaderMode - } - return false -} - -func (m *Features) GetDeviceId() string { - if m != nil && m.DeviceId != nil { - return *m.DeviceId - } - return "" -} - -func (m *Features) GetPinProtection() bool { - if m != nil && m.PinProtection != nil { - return *m.PinProtection - } - return false -} - -func (m *Features) GetPassphraseProtection() bool { - if m != nil && m.PassphraseProtection != nil { - return *m.PassphraseProtection - } - return false -} - -func (m *Features) GetLanguage() string { - if m != nil && m.Language != nil { - return *m.Language - } - return "" -} - -func (m *Features) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *Features) GetCoins() []*CoinType { - if m != nil { - return m.Coins - } - return nil -} - -func (m *Features) GetInitialized() bool { - if m != nil && m.Initialized != nil { - return *m.Initialized - } - return false -} - -func (m *Features) GetRevision() []byte { - if m != nil { - return m.Revision - } - return nil -} - -func (m *Features) GetBootloaderHash() []byte { - if m != nil { - return m.BootloaderHash - } - return nil -} - -func (m *Features) GetImported() bool { - if m != nil && m.Imported != nil { - return *m.Imported - } - return false -} - -func (m *Features) GetPinCached() bool { - if m != nil && m.PinCached != nil { - return *m.PinCached - } - return false -} - -func (m *Features) GetPassphraseCached() bool { - if m != nil && m.PassphraseCached != nil { - return *m.PassphraseCached - } - return false -} - -func (m *Features) GetFirmwarePresent() bool { - if m != nil && m.FirmwarePresent != nil { - return *m.FirmwarePresent - } - return false -} - -func (m *Features) GetNeedsBackup() bool { - if m != nil && m.NeedsBackup != nil { - return *m.NeedsBackup - } - return false -} - -func (m *Features) GetFlags() uint32 { - if m != nil && m.Flags != nil { - return *m.Flags - } - return 0 -} - -// * -// Request: clear session (removes cached PIN, passphrase, etc). -// @next Success -type ClearSession struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *ClearSession) Reset() { *m = ClearSession{} } -func (m *ClearSession) String() string { return proto.CompactTextString(m) } -func (*ClearSession) ProtoMessage() {} -func (*ClearSession) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{3} } - -// * -// Request: change language and/or label of the device -// @next Success -// @next Failure -// @next ButtonRequest -// @next PinMatrixRequest -type ApplySettings struct { - Language *string `protobuf:"bytes,1,opt,name=language" json:"language,omitempty"` - Label *string `protobuf:"bytes,2,opt,name=label" json:"label,omitempty"` - UsePassphrase *bool `protobuf:"varint,3,opt,name=use_passphrase,json=usePassphrase" json:"use_passphrase,omitempty"` - Homescreen []byte `protobuf:"bytes,4,opt,name=homescreen" json:"homescreen,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *ApplySettings) Reset() { *m = ApplySettings{} } -func (m *ApplySettings) String() string { return proto.CompactTextString(m) } -func (*ApplySettings) ProtoMessage() {} -func (*ApplySettings) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{4} } - -func (m *ApplySettings) GetLanguage() string { - if m != nil && m.Language != nil { - return *m.Language - } - return "" -} - -func (m *ApplySettings) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *ApplySettings) GetUsePassphrase() bool { - if m != nil && m.UsePassphrase != nil { - return *m.UsePassphrase - } - return false -} - -func (m *ApplySettings) GetHomescreen() []byte { - if m != nil { - return m.Homescreen - } - return nil -} - -// * -// Request: set flags of the device -// @next Success -// @next Failure -type ApplyFlags struct { - Flags *uint32 `protobuf:"varint,1,opt,name=flags" json:"flags,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *ApplyFlags) Reset() { *m = ApplyFlags{} } -func (m *ApplyFlags) String() string { return proto.CompactTextString(m) } -func (*ApplyFlags) ProtoMessage() {} -func (*ApplyFlags) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{5} } - -func (m *ApplyFlags) GetFlags() uint32 { - if m != nil && m.Flags != nil { - return *m.Flags - } - return 0 -} - -// * -// Request: Starts workflow for setting/changing/removing the PIN -// @next ButtonRequest -// @next PinMatrixRequest -type ChangePin struct { - Remove *bool `protobuf:"varint,1,opt,name=remove" json:"remove,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *ChangePin) Reset() { *m = ChangePin{} } -func (m *ChangePin) String() string { return proto.CompactTextString(m) } -func (*ChangePin) ProtoMessage() {} -func (*ChangePin) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{6} } - -func (m *ChangePin) GetRemove() bool { - if m != nil && m.Remove != nil { - return *m.Remove - } - return false -} - -// * -// Request: Test if the device is alive, device sends back the message in Success response -// @next Success -type Ping struct { - Message *string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` - ButtonProtection *bool `protobuf:"varint,2,opt,name=button_protection,json=buttonProtection" json:"button_protection,omitempty"` - PinProtection *bool `protobuf:"varint,3,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` - PassphraseProtection *bool `protobuf:"varint,4,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Ping) Reset() { *m = Ping{} } -func (m *Ping) String() string { return proto.CompactTextString(m) } -func (*Ping) ProtoMessage() {} -func (*Ping) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} } - -func (m *Ping) GetMessage() string { - if m != nil && m.Message != nil { - return *m.Message - } - return "" -} - -func (m *Ping) GetButtonProtection() bool { - if m != nil && m.ButtonProtection != nil { - return *m.ButtonProtection - } - return false -} - -func (m *Ping) GetPinProtection() bool { - if m != nil && m.PinProtection != nil { - return *m.PinProtection - } - return false -} - -func (m *Ping) GetPassphraseProtection() bool { - if m != nil && m.PassphraseProtection != nil { - return *m.PassphraseProtection - } - return false -} - -// * -// Response: Success of the previous request -type Success struct { - Message *string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Success) Reset() { *m = Success{} } -func (m *Success) String() string { return proto.CompactTextString(m) } -func (*Success) ProtoMessage() {} -func (*Success) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{8} } - -func (m *Success) GetMessage() string { - if m != nil && m.Message != nil { - return *m.Message - } - return "" -} - -// * -// Response: Failure of the previous request -type Failure struct { - Code *FailureType `protobuf:"varint,1,opt,name=code,enum=FailureType" json:"code,omitempty"` - Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Failure) Reset() { *m = Failure{} } -func (m *Failure) String() string { return proto.CompactTextString(m) } -func (*Failure) ProtoMessage() {} -func (*Failure) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{9} } - -func (m *Failure) GetCode() FailureType { - if m != nil && m.Code != nil { - return *m.Code - } - return FailureType_Failure_UnexpectedMessage -} - -func (m *Failure) GetMessage() string { - if m != nil && m.Message != nil { - return *m.Message - } - return "" -} - -// * -// Response: Device is waiting for HW button press. -// @next ButtonAck -// @next Cancel -type ButtonRequest struct { - Code *ButtonRequestType `protobuf:"varint,1,opt,name=code,enum=ButtonRequestType" json:"code,omitempty"` - Data *string `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *ButtonRequest) Reset() { *m = ButtonRequest{} } -func (m *ButtonRequest) String() string { return proto.CompactTextString(m) } -func (*ButtonRequest) ProtoMessage() {} -func (*ButtonRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{10} } - -func (m *ButtonRequest) GetCode() ButtonRequestType { - if m != nil && m.Code != nil { - return *m.Code - } - return ButtonRequestType_ButtonRequest_Other -} - -func (m *ButtonRequest) GetData() string { - if m != nil && m.Data != nil { - return *m.Data - } - return "" -} - -// * -// Request: Computer agrees to wait for HW button press -// @prev ButtonRequest -type ButtonAck struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *ButtonAck) Reset() { *m = ButtonAck{} } -func (m *ButtonAck) String() string { return proto.CompactTextString(m) } -func (*ButtonAck) ProtoMessage() {} -func (*ButtonAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{11} } - -// * -// Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme -// @next PinMatrixAck -// @next Cancel -type PinMatrixRequest struct { - Type *PinMatrixRequestType `protobuf:"varint,1,opt,name=type,enum=PinMatrixRequestType" json:"type,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PinMatrixRequest) Reset() { *m = PinMatrixRequest{} } -func (m *PinMatrixRequest) String() string { return proto.CompactTextString(m) } -func (*PinMatrixRequest) ProtoMessage() {} -func (*PinMatrixRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{12} } - -func (m *PinMatrixRequest) GetType() PinMatrixRequestType { - if m != nil && m.Type != nil { - return *m.Type - } - return PinMatrixRequestType_PinMatrixRequestType_Current -} - -// * -// Request: Computer responds with encoded PIN -// @prev PinMatrixRequest -type PinMatrixAck struct { - Pin *string `protobuf:"bytes,1,req,name=pin" json:"pin,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PinMatrixAck) Reset() { *m = PinMatrixAck{} } -func (m *PinMatrixAck) String() string { return proto.CompactTextString(m) } -func (*PinMatrixAck) ProtoMessage() {} -func (*PinMatrixAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{13} } - -func (m *PinMatrixAck) GetPin() string { - if m != nil && m.Pin != nil { - return *m.Pin - } - return "" -} - -// * -// Request: Abort last operation that required user interaction -// @prev ButtonRequest -// @prev PinMatrixRequest -// @prev PassphraseRequest -type Cancel struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *Cancel) Reset() { *m = Cancel{} } -func (m *Cancel) String() string { return proto.CompactTextString(m) } -func (*Cancel) ProtoMessage() {} -func (*Cancel) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{14} } - -// * -// Response: Device awaits encryption passphrase -// @next PassphraseAck -// @next Cancel -type PassphraseRequest struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *PassphraseRequest) Reset() { *m = PassphraseRequest{} } -func (m *PassphraseRequest) String() string { return proto.CompactTextString(m) } -func (*PassphraseRequest) ProtoMessage() {} -func (*PassphraseRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{15} } - -// * -// Request: Send passphrase back -// @prev PassphraseRequest -type PassphraseAck struct { - Passphrase *string `protobuf:"bytes,1,req,name=passphrase" json:"passphrase,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PassphraseAck) Reset() { *m = PassphraseAck{} } -func (m *PassphraseAck) String() string { return proto.CompactTextString(m) } -func (*PassphraseAck) ProtoMessage() {} -func (*PassphraseAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{16} } - -func (m *PassphraseAck) GetPassphrase() string { - if m != nil && m.Passphrase != nil { - return *m.Passphrase - } - return "" -} - -// * -// Request: Request a sample of random data generated by hardware RNG. May be used for testing. -// @next ButtonRequest -// @next Entropy -// @next Failure -type GetEntropy struct { - Size *uint32 `protobuf:"varint,1,req,name=size" json:"size,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GetEntropy) Reset() { *m = GetEntropy{} } -func (m *GetEntropy) String() string { return proto.CompactTextString(m) } -func (*GetEntropy) ProtoMessage() {} -func (*GetEntropy) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{17} } - -func (m *GetEntropy) GetSize() uint32 { - if m != nil && m.Size != nil { - return *m.Size - } - return 0 -} - -// * -// Response: Reply with random data generated by internal RNG -// @prev GetEntropy -type Entropy struct { - Entropy []byte `protobuf:"bytes,1,req,name=entropy" json:"entropy,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Entropy) Reset() { *m = Entropy{} } -func (m *Entropy) String() string { return proto.CompactTextString(m) } -func (*Entropy) ProtoMessage() {} -func (*Entropy) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{18} } - -func (m *Entropy) GetEntropy() []byte { - if m != nil { - return m.Entropy - } - return nil -} - -// * -// Request: Ask device for public key corresponding to address_n path -// @next PassphraseRequest -// @next PublicKey -// @next Failure -type GetPublicKey struct { - AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - EcdsaCurveName *string `protobuf:"bytes,2,opt,name=ecdsa_curve_name,json=ecdsaCurveName" json:"ecdsa_curve_name,omitempty"` - ShowDisplay *bool `protobuf:"varint,3,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` - CoinName *string `protobuf:"bytes,4,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GetPublicKey) Reset() { *m = GetPublicKey{} } -func (m *GetPublicKey) String() string { return proto.CompactTextString(m) } -func (*GetPublicKey) ProtoMessage() {} -func (*GetPublicKey) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{19} } - -const Default_GetPublicKey_CoinName string = "Bitcoin" - -func (m *GetPublicKey) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *GetPublicKey) GetEcdsaCurveName() string { - if m != nil && m.EcdsaCurveName != nil { - return *m.EcdsaCurveName - } - return "" -} - -func (m *GetPublicKey) GetShowDisplay() bool { - if m != nil && m.ShowDisplay != nil { - return *m.ShowDisplay - } - return false -} - -func (m *GetPublicKey) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return Default_GetPublicKey_CoinName -} - -// * -// Response: Contains public key derived from device private seed -// @prev GetPublicKey -type PublicKey struct { - Node *HDNodeType `protobuf:"bytes,1,req,name=node" json:"node,omitempty"` - Xpub *string `protobuf:"bytes,2,opt,name=xpub" json:"xpub,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PublicKey) Reset() { *m = PublicKey{} } -func (m *PublicKey) String() string { return proto.CompactTextString(m) } -func (*PublicKey) ProtoMessage() {} -func (*PublicKey) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{20} } - -func (m *PublicKey) GetNode() *HDNodeType { - if m != nil { - return m.Node - } - return nil -} - -func (m *PublicKey) GetXpub() string { - if m != nil && m.Xpub != nil { - return *m.Xpub - } - return "" -} - -// * -// Request: Ask device for address corresponding to address_n path -// @next PassphraseRequest -// @next Address -// @next Failure -type GetAddress struct { - AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - CoinName *string `protobuf:"bytes,2,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` - ShowDisplay *bool `protobuf:"varint,3,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` - Multisig *MultisigRedeemScriptType `protobuf:"bytes,4,opt,name=multisig" json:"multisig,omitempty"` - ScriptType *InputScriptType `protobuf:"varint,5,opt,name=script_type,json=scriptType,enum=InputScriptType,def=0" json:"script_type,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GetAddress) Reset() { *m = GetAddress{} } -func (m *GetAddress) String() string { return proto.CompactTextString(m) } -func (*GetAddress) ProtoMessage() {} -func (*GetAddress) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{21} } - -const Default_GetAddress_CoinName string = "Bitcoin" -const Default_GetAddress_ScriptType InputScriptType = InputScriptType_SPENDADDRESS - -func (m *GetAddress) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *GetAddress) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return Default_GetAddress_CoinName -} - -func (m *GetAddress) GetShowDisplay() bool { - if m != nil && m.ShowDisplay != nil { - return *m.ShowDisplay - } - return false -} - -func (m *GetAddress) GetMultisig() *MultisigRedeemScriptType { - if m != nil { - return m.Multisig - } - return nil -} - -func (m *GetAddress) GetScriptType() InputScriptType { - if m != nil && m.ScriptType != nil { - return *m.ScriptType - } - return Default_GetAddress_ScriptType -} - -// * -// Request: Ask device for Ethereum address corresponding to address_n path -// @next PassphraseRequest -// @next EthereumAddress -// @next Failure -type EthereumGetAddress struct { - AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - ShowDisplay *bool `protobuf:"varint,2,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EthereumGetAddress) Reset() { *m = EthereumGetAddress{} } -func (m *EthereumGetAddress) String() string { return proto.CompactTextString(m) } -func (*EthereumGetAddress) ProtoMessage() {} -func (*EthereumGetAddress) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{22} } - -func (m *EthereumGetAddress) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *EthereumGetAddress) GetShowDisplay() bool { - if m != nil && m.ShowDisplay != nil { - return *m.ShowDisplay - } - return false -} - -// * -// Response: Contains address derived from device private seed -// @prev GetAddress -type Address struct { - Address *string `protobuf:"bytes,1,req,name=address" json:"address,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Address) Reset() { *m = Address{} } -func (m *Address) String() string { return proto.CompactTextString(m) } -func (*Address) ProtoMessage() {} -func (*Address) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{23} } - -func (m *Address) GetAddress() string { - if m != nil && m.Address != nil { - return *m.Address - } - return "" -} - -// * -// Response: Contains an Ethereum address derived from device private seed -// @prev EthereumGetAddress -type EthereumAddress struct { - Address []byte `protobuf:"bytes,1,req,name=address" json:"address,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EthereumAddress) Reset() { *m = EthereumAddress{} } -func (m *EthereumAddress) String() string { return proto.CompactTextString(m) } -func (*EthereumAddress) ProtoMessage() {} -func (*EthereumAddress) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{24} } - -func (m *EthereumAddress) GetAddress() []byte { - if m != nil { - return m.Address - } - return nil -} - -// * -// Request: Request device to wipe all sensitive data and settings -// @next ButtonRequest -type WipeDevice struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *WipeDevice) Reset() { *m = WipeDevice{} } -func (m *WipeDevice) String() string { return proto.CompactTextString(m) } -func (*WipeDevice) ProtoMessage() {} -func (*WipeDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{25} } - -// * -// Request: Load seed and related internal settings from the computer -// @next ButtonRequest -// @next Success -// @next Failure -type LoadDevice struct { - Mnemonic *string `protobuf:"bytes,1,opt,name=mnemonic" json:"mnemonic,omitempty"` - Node *HDNodeType `protobuf:"bytes,2,opt,name=node" json:"node,omitempty"` - Pin *string `protobuf:"bytes,3,opt,name=pin" json:"pin,omitempty"` - PassphraseProtection *bool `protobuf:"varint,4,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` - Language *string `protobuf:"bytes,5,opt,name=language,def=english" json:"language,omitempty"` - Label *string `protobuf:"bytes,6,opt,name=label" json:"label,omitempty"` - SkipChecksum *bool `protobuf:"varint,7,opt,name=skip_checksum,json=skipChecksum" json:"skip_checksum,omitempty"` - U2FCounter *uint32 `protobuf:"varint,8,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *LoadDevice) Reset() { *m = LoadDevice{} } -func (m *LoadDevice) String() string { return proto.CompactTextString(m) } -func (*LoadDevice) ProtoMessage() {} -func (*LoadDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{26} } - -const Default_LoadDevice_Language string = "english" - -func (m *LoadDevice) GetMnemonic() string { - if m != nil && m.Mnemonic != nil { - return *m.Mnemonic - } - return "" -} - -func (m *LoadDevice) GetNode() *HDNodeType { - if m != nil { - return m.Node - } - return nil -} - -func (m *LoadDevice) GetPin() string { - if m != nil && m.Pin != nil { - return *m.Pin - } - return "" -} - -func (m *LoadDevice) GetPassphraseProtection() bool { - if m != nil && m.PassphraseProtection != nil { - return *m.PassphraseProtection - } - return false -} - -func (m *LoadDevice) GetLanguage() string { - if m != nil && m.Language != nil { - return *m.Language - } - return Default_LoadDevice_Language -} - -func (m *LoadDevice) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *LoadDevice) GetSkipChecksum() bool { - if m != nil && m.SkipChecksum != nil { - return *m.SkipChecksum - } - return false -} - -func (m *LoadDevice) GetU2FCounter() uint32 { - if m != nil && m.U2FCounter != nil { - return *m.U2FCounter - } - return 0 -} - -// * -// Request: Ask device to do initialization involving user interaction -// @next EntropyRequest -// @next Failure -type ResetDevice struct { - DisplayRandom *bool `protobuf:"varint,1,opt,name=display_random,json=displayRandom" json:"display_random,omitempty"` - Strength *uint32 `protobuf:"varint,2,opt,name=strength,def=256" json:"strength,omitempty"` - PassphraseProtection *bool `protobuf:"varint,3,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` - PinProtection *bool `protobuf:"varint,4,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` - Language *string `protobuf:"bytes,5,opt,name=language,def=english" json:"language,omitempty"` - Label *string `protobuf:"bytes,6,opt,name=label" json:"label,omitempty"` - U2FCounter *uint32 `protobuf:"varint,7,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` - SkipBackup *bool `protobuf:"varint,8,opt,name=skip_backup,json=skipBackup" json:"skip_backup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *ResetDevice) Reset() { *m = ResetDevice{} } -func (m *ResetDevice) String() string { return proto.CompactTextString(m) } -func (*ResetDevice) ProtoMessage() {} -func (*ResetDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{27} } - -const Default_ResetDevice_Strength uint32 = 256 -const Default_ResetDevice_Language string = "english" - -func (m *ResetDevice) GetDisplayRandom() bool { - if m != nil && m.DisplayRandom != nil { - return *m.DisplayRandom - } - return false -} - -func (m *ResetDevice) GetStrength() uint32 { - if m != nil && m.Strength != nil { - return *m.Strength - } - return Default_ResetDevice_Strength -} - -func (m *ResetDevice) GetPassphraseProtection() bool { - if m != nil && m.PassphraseProtection != nil { - return *m.PassphraseProtection - } - return false -} - -func (m *ResetDevice) GetPinProtection() bool { - if m != nil && m.PinProtection != nil { - return *m.PinProtection - } - return false -} - -func (m *ResetDevice) GetLanguage() string { - if m != nil && m.Language != nil { - return *m.Language - } - return Default_ResetDevice_Language -} - -func (m *ResetDevice) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *ResetDevice) GetU2FCounter() uint32 { - if m != nil && m.U2FCounter != nil { - return *m.U2FCounter - } - return 0 -} - -func (m *ResetDevice) GetSkipBackup() bool { - if m != nil && m.SkipBackup != nil { - return *m.SkipBackup - } - return false -} - -// * -// Request: Perform backup of the device seed if not backed up using ResetDevice -// @next ButtonRequest -type BackupDevice struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *BackupDevice) Reset() { *m = BackupDevice{} } -func (m *BackupDevice) String() string { return proto.CompactTextString(m) } -func (*BackupDevice) ProtoMessage() {} -func (*BackupDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{28} } - -// * -// Response: Ask for additional entropy from host computer -// @prev ResetDevice -// @next EntropyAck -type EntropyRequest struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *EntropyRequest) Reset() { *m = EntropyRequest{} } -func (m *EntropyRequest) String() string { return proto.CompactTextString(m) } -func (*EntropyRequest) ProtoMessage() {} -func (*EntropyRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{29} } - -// * -// Request: Provide additional entropy for seed generation function -// @prev EntropyRequest -// @next ButtonRequest -type EntropyAck struct { - Entropy []byte `protobuf:"bytes,1,opt,name=entropy" json:"entropy,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EntropyAck) Reset() { *m = EntropyAck{} } -func (m *EntropyAck) String() string { return proto.CompactTextString(m) } -func (*EntropyAck) ProtoMessage() {} -func (*EntropyAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{30} } - -func (m *EntropyAck) GetEntropy() []byte { - if m != nil { - return m.Entropy - } - return nil -} - -// * -// Request: Start recovery workflow asking user for specific words of mnemonic -// Used to recovery device safely even on untrusted computer. -// @next WordRequest -type RecoveryDevice struct { - WordCount *uint32 `protobuf:"varint,1,opt,name=word_count,json=wordCount" json:"word_count,omitempty"` - PassphraseProtection *bool `protobuf:"varint,2,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` - PinProtection *bool `protobuf:"varint,3,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` - Language *string `protobuf:"bytes,4,opt,name=language,def=english" json:"language,omitempty"` - Label *string `protobuf:"bytes,5,opt,name=label" json:"label,omitempty"` - EnforceWordlist *bool `protobuf:"varint,6,opt,name=enforce_wordlist,json=enforceWordlist" json:"enforce_wordlist,omitempty"` - // 7 reserved for unused recovery method - Type *uint32 `protobuf:"varint,8,opt,name=type" json:"type,omitempty"` - U2FCounter *uint32 `protobuf:"varint,9,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` - DryRun *bool `protobuf:"varint,10,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *RecoveryDevice) Reset() { *m = RecoveryDevice{} } -func (m *RecoveryDevice) String() string { return proto.CompactTextString(m) } -func (*RecoveryDevice) ProtoMessage() {} -func (*RecoveryDevice) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{31} } - -const Default_RecoveryDevice_Language string = "english" - -func (m *RecoveryDevice) GetWordCount() uint32 { - if m != nil && m.WordCount != nil { - return *m.WordCount - } - return 0 -} - -func (m *RecoveryDevice) GetPassphraseProtection() bool { - if m != nil && m.PassphraseProtection != nil { - return *m.PassphraseProtection - } - return false -} - -func (m *RecoveryDevice) GetPinProtection() bool { - if m != nil && m.PinProtection != nil { - return *m.PinProtection - } - return false -} - -func (m *RecoveryDevice) GetLanguage() string { - if m != nil && m.Language != nil { - return *m.Language - } - return Default_RecoveryDevice_Language -} - -func (m *RecoveryDevice) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *RecoveryDevice) GetEnforceWordlist() bool { - if m != nil && m.EnforceWordlist != nil { - return *m.EnforceWordlist - } - return false -} - -func (m *RecoveryDevice) GetType() uint32 { - if m != nil && m.Type != nil { - return *m.Type - } - return 0 -} - -func (m *RecoveryDevice) GetU2FCounter() uint32 { - if m != nil && m.U2FCounter != nil { - return *m.U2FCounter - } - return 0 -} - -func (m *RecoveryDevice) GetDryRun() bool { - if m != nil && m.DryRun != nil { - return *m.DryRun - } - return false -} - -// * -// Response: Device is waiting for user to enter word of the mnemonic -// Its position is shown only on device's internal display. -// @prev RecoveryDevice -// @prev WordAck -type WordRequest struct { - Type *WordRequestType `protobuf:"varint,1,opt,name=type,enum=WordRequestType" json:"type,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *WordRequest) Reset() { *m = WordRequest{} } -func (m *WordRequest) String() string { return proto.CompactTextString(m) } -func (*WordRequest) ProtoMessage() {} -func (*WordRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{32} } - -func (m *WordRequest) GetType() WordRequestType { - if m != nil && m.Type != nil { - return *m.Type - } - return WordRequestType_WordRequestType_Plain -} - -// * -// Request: Computer replies with word from the mnemonic -// @prev WordRequest -// @next WordRequest -// @next Success -// @next Failure -type WordAck struct { - Word *string `protobuf:"bytes,1,req,name=word" json:"word,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *WordAck) Reset() { *m = WordAck{} } -func (m *WordAck) String() string { return proto.CompactTextString(m) } -func (*WordAck) ProtoMessage() {} -func (*WordAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{33} } - -func (m *WordAck) GetWord() string { - if m != nil && m.Word != nil { - return *m.Word - } - return "" -} - -// * -// Request: Ask device to sign message -// @next MessageSignature -// @next Failure -type SignMessage struct { - AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - Message []byte `protobuf:"bytes,2,req,name=message" json:"message,omitempty"` - CoinName *string `protobuf:"bytes,3,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` - ScriptType *InputScriptType `protobuf:"varint,4,opt,name=script_type,json=scriptType,enum=InputScriptType,def=0" json:"script_type,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SignMessage) Reset() { *m = SignMessage{} } -func (m *SignMessage) String() string { return proto.CompactTextString(m) } -func (*SignMessage) ProtoMessage() {} -func (*SignMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{34} } - -const Default_SignMessage_CoinName string = "Bitcoin" -const Default_SignMessage_ScriptType InputScriptType = InputScriptType_SPENDADDRESS - -func (m *SignMessage) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *SignMessage) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -func (m *SignMessage) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return Default_SignMessage_CoinName -} - -func (m *SignMessage) GetScriptType() InputScriptType { - if m != nil && m.ScriptType != nil { - return *m.ScriptType - } - return Default_SignMessage_ScriptType -} - -// * -// Request: Ask device to verify message -// @next Success -// @next Failure -type VerifyMessage struct { - Address *string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` - Message []byte `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` - CoinName *string `protobuf:"bytes,4,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *VerifyMessage) Reset() { *m = VerifyMessage{} } -func (m *VerifyMessage) String() string { return proto.CompactTextString(m) } -func (*VerifyMessage) ProtoMessage() {} -func (*VerifyMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{35} } - -const Default_VerifyMessage_CoinName string = "Bitcoin" - -func (m *VerifyMessage) GetAddress() string { - if m != nil && m.Address != nil { - return *m.Address - } - return "" -} - -func (m *VerifyMessage) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -func (m *VerifyMessage) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -func (m *VerifyMessage) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return Default_VerifyMessage_CoinName -} - -// * -// Response: Signed message -// @prev SignMessage -type MessageSignature struct { - Address *string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageSignature) Reset() { *m = MessageSignature{} } -func (m *MessageSignature) String() string { return proto.CompactTextString(m) } -func (*MessageSignature) ProtoMessage() {} -func (*MessageSignature) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{36} } - -func (m *MessageSignature) GetAddress() string { - if m != nil && m.Address != nil { - return *m.Address - } - return "" -} - -func (m *MessageSignature) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -// * -// Request: Ask device to encrypt message -// @next EncryptedMessage -// @next Failure -type EncryptMessage struct { - Pubkey []byte `protobuf:"bytes,1,opt,name=pubkey" json:"pubkey,omitempty"` - Message []byte `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` - DisplayOnly *bool `protobuf:"varint,3,opt,name=display_only,json=displayOnly" json:"display_only,omitempty"` - AddressN []uint32 `protobuf:"varint,4,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - CoinName *string `protobuf:"bytes,5,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EncryptMessage) Reset() { *m = EncryptMessage{} } -func (m *EncryptMessage) String() string { return proto.CompactTextString(m) } -func (*EncryptMessage) ProtoMessage() {} -func (*EncryptMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{37} } - -const Default_EncryptMessage_CoinName string = "Bitcoin" - -func (m *EncryptMessage) GetPubkey() []byte { - if m != nil { - return m.Pubkey - } - return nil -} - -func (m *EncryptMessage) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -func (m *EncryptMessage) GetDisplayOnly() bool { - if m != nil && m.DisplayOnly != nil { - return *m.DisplayOnly - } - return false -} - -func (m *EncryptMessage) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *EncryptMessage) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return Default_EncryptMessage_CoinName -} - -// * -// Response: Encrypted message -// @prev EncryptMessage -type EncryptedMessage struct { - Nonce []byte `protobuf:"bytes,1,opt,name=nonce" json:"nonce,omitempty"` - Message []byte `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` - Hmac []byte `protobuf:"bytes,3,opt,name=hmac" json:"hmac,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EncryptedMessage) Reset() { *m = EncryptedMessage{} } -func (m *EncryptedMessage) String() string { return proto.CompactTextString(m) } -func (*EncryptedMessage) ProtoMessage() {} -func (*EncryptedMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{38} } - -func (m *EncryptedMessage) GetNonce() []byte { - if m != nil { - return m.Nonce - } - return nil -} - -func (m *EncryptedMessage) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -func (m *EncryptedMessage) GetHmac() []byte { - if m != nil { - return m.Hmac - } - return nil -} - -// * -// Request: Ask device to decrypt message -// @next Success -// @next Failure -type DecryptMessage struct { - AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - Nonce []byte `protobuf:"bytes,2,opt,name=nonce" json:"nonce,omitempty"` - Message []byte `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` - Hmac []byte `protobuf:"bytes,4,opt,name=hmac" json:"hmac,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DecryptMessage) Reset() { *m = DecryptMessage{} } -func (m *DecryptMessage) String() string { return proto.CompactTextString(m) } -func (*DecryptMessage) ProtoMessage() {} -func (*DecryptMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{39} } - -func (m *DecryptMessage) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *DecryptMessage) GetNonce() []byte { - if m != nil { - return m.Nonce - } - return nil -} - -func (m *DecryptMessage) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -func (m *DecryptMessage) GetHmac() []byte { - if m != nil { - return m.Hmac - } - return nil -} - -// * -// Response: Decrypted message -// @prev DecryptedMessage -type DecryptedMessage struct { - Message []byte `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` - Address *string `protobuf:"bytes,2,opt,name=address" json:"address,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DecryptedMessage) Reset() { *m = DecryptedMessage{} } -func (m *DecryptedMessage) String() string { return proto.CompactTextString(m) } -func (*DecryptedMessage) ProtoMessage() {} -func (*DecryptedMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{40} } - -func (m *DecryptedMessage) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -func (m *DecryptedMessage) GetAddress() string { - if m != nil && m.Address != nil { - return *m.Address - } - return "" -} - -// * -// Request: Ask device to encrypt or decrypt value of given key -// @next CipheredKeyValue -// @next Failure -type CipherKeyValue struct { - AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` - Encrypt *bool `protobuf:"varint,4,opt,name=encrypt" json:"encrypt,omitempty"` - AskOnEncrypt *bool `protobuf:"varint,5,opt,name=ask_on_encrypt,json=askOnEncrypt" json:"ask_on_encrypt,omitempty"` - AskOnDecrypt *bool `protobuf:"varint,6,opt,name=ask_on_decrypt,json=askOnDecrypt" json:"ask_on_decrypt,omitempty"` - Iv []byte `protobuf:"bytes,7,opt,name=iv" json:"iv,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *CipherKeyValue) Reset() { *m = CipherKeyValue{} } -func (m *CipherKeyValue) String() string { return proto.CompactTextString(m) } -func (*CipherKeyValue) ProtoMessage() {} -func (*CipherKeyValue) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{41} } - -func (m *CipherKeyValue) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *CipherKeyValue) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *CipherKeyValue) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *CipherKeyValue) GetEncrypt() bool { - if m != nil && m.Encrypt != nil { - return *m.Encrypt - } - return false -} - -func (m *CipherKeyValue) GetAskOnEncrypt() bool { - if m != nil && m.AskOnEncrypt != nil { - return *m.AskOnEncrypt - } - return false -} - -func (m *CipherKeyValue) GetAskOnDecrypt() bool { - if m != nil && m.AskOnDecrypt != nil { - return *m.AskOnDecrypt - } - return false -} - -func (m *CipherKeyValue) GetIv() []byte { - if m != nil { - return m.Iv - } - return nil -} - -// * -// Response: Return ciphered/deciphered value -// @prev CipherKeyValue -type CipheredKeyValue struct { - Value []byte `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *CipheredKeyValue) Reset() { *m = CipheredKeyValue{} } -func (m *CipheredKeyValue) String() string { return proto.CompactTextString(m) } -func (*CipheredKeyValue) ProtoMessage() {} -func (*CipheredKeyValue) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{42} } - -func (m *CipheredKeyValue) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -// * -// Request: Estimated size of the transaction -// This behaves exactly like SignTx, which means that it can ask using TxRequest -// This call is non-blocking (except possible PassphraseRequest to unlock the seed) -// @next TxSize -// @next Failure -type EstimateTxSize struct { - OutputsCount *uint32 `protobuf:"varint,1,req,name=outputs_count,json=outputsCount" json:"outputs_count,omitempty"` - InputsCount *uint32 `protobuf:"varint,2,req,name=inputs_count,json=inputsCount" json:"inputs_count,omitempty"` - CoinName *string `protobuf:"bytes,3,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EstimateTxSize) Reset() { *m = EstimateTxSize{} } -func (m *EstimateTxSize) String() string { return proto.CompactTextString(m) } -func (*EstimateTxSize) ProtoMessage() {} -func (*EstimateTxSize) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{43} } - -const Default_EstimateTxSize_CoinName string = "Bitcoin" - -func (m *EstimateTxSize) GetOutputsCount() uint32 { - if m != nil && m.OutputsCount != nil { - return *m.OutputsCount - } - return 0 -} - -func (m *EstimateTxSize) GetInputsCount() uint32 { - if m != nil && m.InputsCount != nil { - return *m.InputsCount - } - return 0 -} - -func (m *EstimateTxSize) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return Default_EstimateTxSize_CoinName -} - -// * -// Response: Estimated size of the transaction -// @prev EstimateTxSize -type TxSize struct { - TxSize *uint32 `protobuf:"varint,1,opt,name=tx_size,json=txSize" json:"tx_size,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *TxSize) Reset() { *m = TxSize{} } -func (m *TxSize) String() string { return proto.CompactTextString(m) } -func (*TxSize) ProtoMessage() {} -func (*TxSize) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{44} } - -func (m *TxSize) GetTxSize() uint32 { - if m != nil && m.TxSize != nil { - return *m.TxSize - } - return 0 -} - -// * -// Request: Ask device to sign transaction -// @next PassphraseRequest -// @next PinMatrixRequest -// @next TxRequest -// @next Failure -type SignTx struct { - OutputsCount *uint32 `protobuf:"varint,1,req,name=outputs_count,json=outputsCount" json:"outputs_count,omitempty"` - InputsCount *uint32 `protobuf:"varint,2,req,name=inputs_count,json=inputsCount" json:"inputs_count,omitempty"` - CoinName *string `protobuf:"bytes,3,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` - Version *uint32 `protobuf:"varint,4,opt,name=version,def=1" json:"version,omitempty"` - LockTime *uint32 `protobuf:"varint,5,opt,name=lock_time,json=lockTime,def=0" json:"lock_time,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SignTx) Reset() { *m = SignTx{} } -func (m *SignTx) String() string { return proto.CompactTextString(m) } -func (*SignTx) ProtoMessage() {} -func (*SignTx) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{45} } - -const Default_SignTx_CoinName string = "Bitcoin" -const Default_SignTx_Version uint32 = 1 -const Default_SignTx_LockTime uint32 = 0 - -func (m *SignTx) GetOutputsCount() uint32 { - if m != nil && m.OutputsCount != nil { - return *m.OutputsCount - } - return 0 -} - -func (m *SignTx) GetInputsCount() uint32 { - if m != nil && m.InputsCount != nil { - return *m.InputsCount - } - return 0 -} - -func (m *SignTx) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return Default_SignTx_CoinName -} - -func (m *SignTx) GetVersion() uint32 { - if m != nil && m.Version != nil { - return *m.Version - } - return Default_SignTx_Version -} - -func (m *SignTx) GetLockTime() uint32 { - if m != nil && m.LockTime != nil { - return *m.LockTime - } - return Default_SignTx_LockTime -} - -// * -// Request: Simplified transaction signing -// This method doesn't support streaming, so there are hardware limits in number of inputs and outputs. -// In case of success, the result is returned using TxRequest message. -// @next PassphraseRequest -// @next PinMatrixRequest -// @next TxRequest -// @next Failure -type SimpleSignTx struct { - Inputs []*TxInputType `protobuf:"bytes,1,rep,name=inputs" json:"inputs,omitempty"` - Outputs []*TxOutputType `protobuf:"bytes,2,rep,name=outputs" json:"outputs,omitempty"` - Transactions []*TransactionType `protobuf:"bytes,3,rep,name=transactions" json:"transactions,omitempty"` - CoinName *string `protobuf:"bytes,4,opt,name=coin_name,json=coinName,def=Bitcoin" json:"coin_name,omitempty"` - Version *uint32 `protobuf:"varint,5,opt,name=version,def=1" json:"version,omitempty"` - LockTime *uint32 `protobuf:"varint,6,opt,name=lock_time,json=lockTime,def=0" json:"lock_time,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SimpleSignTx) Reset() { *m = SimpleSignTx{} } -func (m *SimpleSignTx) String() string { return proto.CompactTextString(m) } -func (*SimpleSignTx) ProtoMessage() {} -func (*SimpleSignTx) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{46} } - -const Default_SimpleSignTx_CoinName string = "Bitcoin" -const Default_SimpleSignTx_Version uint32 = 1 -const Default_SimpleSignTx_LockTime uint32 = 0 - -func (m *SimpleSignTx) GetInputs() []*TxInputType { - if m != nil { - return m.Inputs - } - return nil -} - -func (m *SimpleSignTx) GetOutputs() []*TxOutputType { - if m != nil { - return m.Outputs - } - return nil -} - -func (m *SimpleSignTx) GetTransactions() []*TransactionType { - if m != nil { - return m.Transactions - } - return nil -} - -func (m *SimpleSignTx) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return Default_SimpleSignTx_CoinName -} - -func (m *SimpleSignTx) GetVersion() uint32 { - if m != nil && m.Version != nil { - return *m.Version - } - return Default_SimpleSignTx_Version -} - -func (m *SimpleSignTx) GetLockTime() uint32 { - if m != nil && m.LockTime != nil { - return *m.LockTime - } - return Default_SimpleSignTx_LockTime -} - -// * -// Response: Device asks for information for signing transaction or returns the last result -// If request_index is set, device awaits TxAck message (with fields filled in according to request_type) -// If signature_index is set, 'signature' contains signed input of signature_index's input -// @prev SignTx -// @prev SimpleSignTx -// @prev TxAck -type TxRequest struct { - RequestType *RequestType `protobuf:"varint,1,opt,name=request_type,json=requestType,enum=RequestType" json:"request_type,omitempty"` - Details *TxRequestDetailsType `protobuf:"bytes,2,opt,name=details" json:"details,omitempty"` - Serialized *TxRequestSerializedType `protobuf:"bytes,3,opt,name=serialized" json:"serialized,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *TxRequest) Reset() { *m = TxRequest{} } -func (m *TxRequest) String() string { return proto.CompactTextString(m) } -func (*TxRequest) ProtoMessage() {} -func (*TxRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{47} } - -func (m *TxRequest) GetRequestType() RequestType { - if m != nil && m.RequestType != nil { - return *m.RequestType - } - return RequestType_TXINPUT -} - -func (m *TxRequest) GetDetails() *TxRequestDetailsType { - if m != nil { - return m.Details - } - return nil -} - -func (m *TxRequest) GetSerialized() *TxRequestSerializedType { - if m != nil { - return m.Serialized - } - return nil -} - -// * -// Request: Reported transaction data -// @prev TxRequest -// @next TxRequest -type TxAck struct { - Tx *TransactionType `protobuf:"bytes,1,opt,name=tx" json:"tx,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *TxAck) Reset() { *m = TxAck{} } -func (m *TxAck) String() string { return proto.CompactTextString(m) } -func (*TxAck) ProtoMessage() {} -func (*TxAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{48} } - -func (m *TxAck) GetTx() *TransactionType { - if m != nil { - return m.Tx - } - return nil -} - -// * -// Request: Ask device to sign transaction -// All fields are optional from the protocol's point of view. Each field defaults to value `0` if missing. -// Note: the first at most 1024 bytes of data MUST be transmitted as part of this message. -// @next PassphraseRequest -// @next PinMatrixRequest -// @next EthereumTxRequest -// @next Failure -type EthereumSignTx struct { - AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - Nonce []byte `protobuf:"bytes,2,opt,name=nonce" json:"nonce,omitempty"` - GasPrice []byte `protobuf:"bytes,3,opt,name=gas_price,json=gasPrice" json:"gas_price,omitempty"` - GasLimit []byte `protobuf:"bytes,4,opt,name=gas_limit,json=gasLimit" json:"gas_limit,omitempty"` - To []byte `protobuf:"bytes,5,opt,name=to" json:"to,omitempty"` - Value []byte `protobuf:"bytes,6,opt,name=value" json:"value,omitempty"` - DataInitialChunk []byte `protobuf:"bytes,7,opt,name=data_initial_chunk,json=dataInitialChunk" json:"data_initial_chunk,omitempty"` - DataLength *uint32 `protobuf:"varint,8,opt,name=data_length,json=dataLength" json:"data_length,omitempty"` - ChainId *uint32 `protobuf:"varint,9,opt,name=chain_id,json=chainId" json:"chain_id,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EthereumSignTx) Reset() { *m = EthereumSignTx{} } -func (m *EthereumSignTx) String() string { return proto.CompactTextString(m) } -func (*EthereumSignTx) ProtoMessage() {} -func (*EthereumSignTx) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{49} } - -func (m *EthereumSignTx) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *EthereumSignTx) GetNonce() []byte { - if m != nil { - return m.Nonce - } - return nil -} - -func (m *EthereumSignTx) GetGasPrice() []byte { - if m != nil { - return m.GasPrice - } - return nil -} - -func (m *EthereumSignTx) GetGasLimit() []byte { - if m != nil { - return m.GasLimit - } - return nil -} - -func (m *EthereumSignTx) GetTo() []byte { - if m != nil { - return m.To - } - return nil -} - -func (m *EthereumSignTx) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *EthereumSignTx) GetDataInitialChunk() []byte { - if m != nil { - return m.DataInitialChunk - } - return nil -} - -func (m *EthereumSignTx) GetDataLength() uint32 { - if m != nil && m.DataLength != nil { - return *m.DataLength - } - return 0 -} - -func (m *EthereumSignTx) GetChainId() uint32 { - if m != nil && m.ChainId != nil { - return *m.ChainId - } - return 0 -} - -// * -// Response: Device asks for more data from transaction payload, or returns the signature. -// If data_length is set, device awaits that many more bytes of payload. -// Otherwise, the signature_* fields contain the computed transaction signature. All three fields will be present. -// @prev EthereumSignTx -// @next EthereumTxAck -type EthereumTxRequest struct { - DataLength *uint32 `protobuf:"varint,1,opt,name=data_length,json=dataLength" json:"data_length,omitempty"` - SignatureV *uint32 `protobuf:"varint,2,opt,name=signature_v,json=signatureV" json:"signature_v,omitempty"` - SignatureR []byte `protobuf:"bytes,3,opt,name=signature_r,json=signatureR" json:"signature_r,omitempty"` - SignatureS []byte `protobuf:"bytes,4,opt,name=signature_s,json=signatureS" json:"signature_s,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EthereumTxRequest) Reset() { *m = EthereumTxRequest{} } -func (m *EthereumTxRequest) String() string { return proto.CompactTextString(m) } -func (*EthereumTxRequest) ProtoMessage() {} -func (*EthereumTxRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{50} } - -func (m *EthereumTxRequest) GetDataLength() uint32 { - if m != nil && m.DataLength != nil { - return *m.DataLength - } - return 0 -} - -func (m *EthereumTxRequest) GetSignatureV() uint32 { - if m != nil && m.SignatureV != nil { - return *m.SignatureV - } - return 0 -} - -func (m *EthereumTxRequest) GetSignatureR() []byte { - if m != nil { - return m.SignatureR - } - return nil -} - -func (m *EthereumTxRequest) GetSignatureS() []byte { - if m != nil { - return m.SignatureS - } - return nil -} - -// * -// Request: Transaction payload data. -// @prev EthereumTxRequest -// @next EthereumTxRequest -type EthereumTxAck struct { - DataChunk []byte `protobuf:"bytes,1,opt,name=data_chunk,json=dataChunk" json:"data_chunk,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EthereumTxAck) Reset() { *m = EthereumTxAck{} } -func (m *EthereumTxAck) String() string { return proto.CompactTextString(m) } -func (*EthereumTxAck) ProtoMessage() {} -func (*EthereumTxAck) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{51} } - -func (m *EthereumTxAck) GetDataChunk() []byte { - if m != nil { - return m.DataChunk - } - return nil -} - -// * -// Request: Ask device to sign message -// @next EthereumMessageSignature -// @next Failure -type EthereumSignMessage struct { - AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - Message []byte `protobuf:"bytes,2,req,name=message" json:"message,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EthereumSignMessage) Reset() { *m = EthereumSignMessage{} } -func (m *EthereumSignMessage) String() string { return proto.CompactTextString(m) } -func (*EthereumSignMessage) ProtoMessage() {} -func (*EthereumSignMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{52} } - -func (m *EthereumSignMessage) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *EthereumSignMessage) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -// * -// Request: Ask device to verify message -// @next Success -// @next Failure -type EthereumVerifyMessage struct { - Address []byte `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` - Message []byte `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EthereumVerifyMessage) Reset() { *m = EthereumVerifyMessage{} } -func (m *EthereumVerifyMessage) String() string { return proto.CompactTextString(m) } -func (*EthereumVerifyMessage) ProtoMessage() {} -func (*EthereumVerifyMessage) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{53} } - -func (m *EthereumVerifyMessage) GetAddress() []byte { - if m != nil { - return m.Address - } - return nil -} - -func (m *EthereumVerifyMessage) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -func (m *EthereumVerifyMessage) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -// * -// Response: Signed message -// @prev EthereumSignMessage -type EthereumMessageSignature struct { - Address []byte `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EthereumMessageSignature) Reset() { *m = EthereumMessageSignature{} } -func (m *EthereumMessageSignature) String() string { return proto.CompactTextString(m) } -func (*EthereumMessageSignature) ProtoMessage() {} -func (*EthereumMessageSignature) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{54} } - -func (m *EthereumMessageSignature) GetAddress() []byte { - if m != nil { - return m.Address - } - return nil -} - -func (m *EthereumMessageSignature) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -// * -// Request: Ask device to sign identity -// @next SignedIdentity -// @next Failure -type SignIdentity struct { - Identity *IdentityType `protobuf:"bytes,1,opt,name=identity" json:"identity,omitempty"` - ChallengeHidden []byte `protobuf:"bytes,2,opt,name=challenge_hidden,json=challengeHidden" json:"challenge_hidden,omitempty"` - ChallengeVisual *string `protobuf:"bytes,3,opt,name=challenge_visual,json=challengeVisual" json:"challenge_visual,omitempty"` - EcdsaCurveName *string `protobuf:"bytes,4,opt,name=ecdsa_curve_name,json=ecdsaCurveName" json:"ecdsa_curve_name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SignIdentity) Reset() { *m = SignIdentity{} } -func (m *SignIdentity) String() string { return proto.CompactTextString(m) } -func (*SignIdentity) ProtoMessage() {} -func (*SignIdentity) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{55} } - -func (m *SignIdentity) GetIdentity() *IdentityType { - if m != nil { - return m.Identity - } - return nil -} - -func (m *SignIdentity) GetChallengeHidden() []byte { - if m != nil { - return m.ChallengeHidden - } - return nil -} - -func (m *SignIdentity) GetChallengeVisual() string { - if m != nil && m.ChallengeVisual != nil { - return *m.ChallengeVisual - } - return "" -} - -func (m *SignIdentity) GetEcdsaCurveName() string { - if m != nil && m.EcdsaCurveName != nil { - return *m.EcdsaCurveName - } - return "" -} - -// * -// Response: Device provides signed identity -// @prev SignIdentity -type SignedIdentity struct { - Address *string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` - PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey" json:"public_key,omitempty"` - Signature []byte `protobuf:"bytes,3,opt,name=signature" json:"signature,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SignedIdentity) Reset() { *m = SignedIdentity{} } -func (m *SignedIdentity) String() string { return proto.CompactTextString(m) } -func (*SignedIdentity) ProtoMessage() {} -func (*SignedIdentity) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{56} } - -func (m *SignedIdentity) GetAddress() string { - if m != nil && m.Address != nil { - return *m.Address - } - return "" -} - -func (m *SignedIdentity) GetPublicKey() []byte { - if m != nil { - return m.PublicKey - } - return nil -} - -func (m *SignedIdentity) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -// * -// Request: Ask device to generate ECDH session key -// @next ECDHSessionKey -// @next Failure -type GetECDHSessionKey struct { - Identity *IdentityType `protobuf:"bytes,1,opt,name=identity" json:"identity,omitempty"` - PeerPublicKey []byte `protobuf:"bytes,2,opt,name=peer_public_key,json=peerPublicKey" json:"peer_public_key,omitempty"` - EcdsaCurveName *string `protobuf:"bytes,3,opt,name=ecdsa_curve_name,json=ecdsaCurveName" json:"ecdsa_curve_name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GetECDHSessionKey) Reset() { *m = GetECDHSessionKey{} } -func (m *GetECDHSessionKey) String() string { return proto.CompactTextString(m) } -func (*GetECDHSessionKey) ProtoMessage() {} -func (*GetECDHSessionKey) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{57} } - -func (m *GetECDHSessionKey) GetIdentity() *IdentityType { - if m != nil { - return m.Identity - } - return nil -} - -func (m *GetECDHSessionKey) GetPeerPublicKey() []byte { - if m != nil { - return m.PeerPublicKey - } - return nil -} - -func (m *GetECDHSessionKey) GetEcdsaCurveName() string { - if m != nil && m.EcdsaCurveName != nil { - return *m.EcdsaCurveName - } - return "" -} - -// * -// Response: Device provides ECDH session key -// @prev GetECDHSessionKey -type ECDHSessionKey struct { - SessionKey []byte `protobuf:"bytes,1,opt,name=session_key,json=sessionKey" json:"session_key,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *ECDHSessionKey) Reset() { *m = ECDHSessionKey{} } -func (m *ECDHSessionKey) String() string { return proto.CompactTextString(m) } -func (*ECDHSessionKey) ProtoMessage() {} -func (*ECDHSessionKey) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{58} } - -func (m *ECDHSessionKey) GetSessionKey() []byte { - if m != nil { - return m.SessionKey - } - return nil -} - -// * -// Request: Set U2F counter -// @next Success -type SetU2FCounter struct { - U2FCounter *uint32 `protobuf:"varint,1,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SetU2FCounter) Reset() { *m = SetU2FCounter{} } -func (m *SetU2FCounter) String() string { return proto.CompactTextString(m) } -func (*SetU2FCounter) ProtoMessage() {} -func (*SetU2FCounter) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{59} } - -func (m *SetU2FCounter) GetU2FCounter() uint32 { - if m != nil && m.U2FCounter != nil { - return *m.U2FCounter - } - return 0 -} - -// * -// Request: Ask device to erase its firmware (so it can be replaced via FirmwareUpload) -// @next Success -// @next FirmwareRequest -// @next Failure -type FirmwareErase struct { - Length *uint32 `protobuf:"varint,1,opt,name=length" json:"length,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *FirmwareErase) Reset() { *m = FirmwareErase{} } -func (m *FirmwareErase) String() string { return proto.CompactTextString(m) } -func (*FirmwareErase) ProtoMessage() {} -func (*FirmwareErase) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{60} } - -func (m *FirmwareErase) GetLength() uint32 { - if m != nil && m.Length != nil { - return *m.Length - } - return 0 -} - -// * -// Response: Ask for firmware chunk -// @next FirmwareUpload -type FirmwareRequest struct { - Offset *uint32 `protobuf:"varint,1,opt,name=offset" json:"offset,omitempty"` - Length *uint32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *FirmwareRequest) Reset() { *m = FirmwareRequest{} } -func (m *FirmwareRequest) String() string { return proto.CompactTextString(m) } -func (*FirmwareRequest) ProtoMessage() {} -func (*FirmwareRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{61} } - -func (m *FirmwareRequest) GetOffset() uint32 { - if m != nil && m.Offset != nil { - return *m.Offset - } - return 0 -} - -func (m *FirmwareRequest) GetLength() uint32 { - if m != nil && m.Length != nil { - return *m.Length - } - return 0 -} - -// * -// Request: Send firmware in binary form to the device -// @next Success -// @next Failure -type FirmwareUpload struct { - Payload []byte `protobuf:"bytes,1,req,name=payload" json:"payload,omitempty"` - Hash []byte `protobuf:"bytes,2,opt,name=hash" json:"hash,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *FirmwareUpload) Reset() { *m = FirmwareUpload{} } -func (m *FirmwareUpload) String() string { return proto.CompactTextString(m) } -func (*FirmwareUpload) ProtoMessage() {} -func (*FirmwareUpload) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{62} } - -func (m *FirmwareUpload) GetPayload() []byte { - if m != nil { - return m.Payload - } - return nil -} - -func (m *FirmwareUpload) GetHash() []byte { - if m != nil { - return m.Hash - } - return nil -} - -// * -// Request: Perform a device self-test -// @next Success -// @next Failure -type SelfTest struct { - Payload []byte `protobuf:"bytes,1,opt,name=payload" json:"payload,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SelfTest) Reset() { *m = SelfTest{} } -func (m *SelfTest) String() string { return proto.CompactTextString(m) } -func (*SelfTest) ProtoMessage() {} -func (*SelfTest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{63} } - -func (m *SelfTest) GetPayload() []byte { - if m != nil { - return m.Payload - } - return nil -} - -// * -// Request: "Press" the button on the device -// @next Success -type DebugLinkDecision struct { - YesNo *bool `protobuf:"varint,1,req,name=yes_no,json=yesNo" json:"yes_no,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DebugLinkDecision) Reset() { *m = DebugLinkDecision{} } -func (m *DebugLinkDecision) String() string { return proto.CompactTextString(m) } -func (*DebugLinkDecision) ProtoMessage() {} -func (*DebugLinkDecision) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{64} } - -func (m *DebugLinkDecision) GetYesNo() bool { - if m != nil && m.YesNo != nil { - return *m.YesNo - } - return false -} - -// * -// Request: Computer asks for device state -// @next DebugLinkState -type DebugLinkGetState struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *DebugLinkGetState) Reset() { *m = DebugLinkGetState{} } -func (m *DebugLinkGetState) String() string { return proto.CompactTextString(m) } -func (*DebugLinkGetState) ProtoMessage() {} -func (*DebugLinkGetState) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{65} } - -// * -// Response: Device current state -// @prev DebugLinkGetState -type DebugLinkState struct { - Layout []byte `protobuf:"bytes,1,opt,name=layout" json:"layout,omitempty"` - Pin *string `protobuf:"bytes,2,opt,name=pin" json:"pin,omitempty"` - Matrix *string `protobuf:"bytes,3,opt,name=matrix" json:"matrix,omitempty"` - Mnemonic *string `protobuf:"bytes,4,opt,name=mnemonic" json:"mnemonic,omitempty"` - Node *HDNodeType `protobuf:"bytes,5,opt,name=node" json:"node,omitempty"` - PassphraseProtection *bool `protobuf:"varint,6,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` - ResetWord *string `protobuf:"bytes,7,opt,name=reset_word,json=resetWord" json:"reset_word,omitempty"` - ResetEntropy []byte `protobuf:"bytes,8,opt,name=reset_entropy,json=resetEntropy" json:"reset_entropy,omitempty"` - RecoveryFakeWord *string `protobuf:"bytes,9,opt,name=recovery_fake_word,json=recoveryFakeWord" json:"recovery_fake_word,omitempty"` - RecoveryWordPos *uint32 `protobuf:"varint,10,opt,name=recovery_word_pos,json=recoveryWordPos" json:"recovery_word_pos,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DebugLinkState) Reset() { *m = DebugLinkState{} } -func (m *DebugLinkState) String() string { return proto.CompactTextString(m) } -func (*DebugLinkState) ProtoMessage() {} -func (*DebugLinkState) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{66} } - -func (m *DebugLinkState) GetLayout() []byte { - if m != nil { - return m.Layout - } - return nil -} - -func (m *DebugLinkState) GetPin() string { - if m != nil && m.Pin != nil { - return *m.Pin - } - return "" -} - -func (m *DebugLinkState) GetMatrix() string { - if m != nil && m.Matrix != nil { - return *m.Matrix - } - return "" -} - -func (m *DebugLinkState) GetMnemonic() string { - if m != nil && m.Mnemonic != nil { - return *m.Mnemonic - } - return "" -} - -func (m *DebugLinkState) GetNode() *HDNodeType { - if m != nil { - return m.Node - } - return nil -} - -func (m *DebugLinkState) GetPassphraseProtection() bool { - if m != nil && m.PassphraseProtection != nil { - return *m.PassphraseProtection - } - return false -} - -func (m *DebugLinkState) GetResetWord() string { - if m != nil && m.ResetWord != nil { - return *m.ResetWord - } - return "" -} - -func (m *DebugLinkState) GetResetEntropy() []byte { - if m != nil { - return m.ResetEntropy - } - return nil -} - -func (m *DebugLinkState) GetRecoveryFakeWord() string { - if m != nil && m.RecoveryFakeWord != nil { - return *m.RecoveryFakeWord - } - return "" -} - -func (m *DebugLinkState) GetRecoveryWordPos() uint32 { - if m != nil && m.RecoveryWordPos != nil { - return *m.RecoveryWordPos - } - return 0 -} - -// * -// Request: Ask device to restart -type DebugLinkStop struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *DebugLinkStop) Reset() { *m = DebugLinkStop{} } -func (m *DebugLinkStop) String() string { return proto.CompactTextString(m) } -func (*DebugLinkStop) ProtoMessage() {} -func (*DebugLinkStop) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{67} } - -// * -// Response: Device wants host to log event -type DebugLinkLog struct { - Level *uint32 `protobuf:"varint,1,opt,name=level" json:"level,omitempty"` - Bucket *string `protobuf:"bytes,2,opt,name=bucket" json:"bucket,omitempty"` - Text *string `protobuf:"bytes,3,opt,name=text" json:"text,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DebugLinkLog) Reset() { *m = DebugLinkLog{} } -func (m *DebugLinkLog) String() string { return proto.CompactTextString(m) } -func (*DebugLinkLog) ProtoMessage() {} -func (*DebugLinkLog) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{68} } - -func (m *DebugLinkLog) GetLevel() uint32 { - if m != nil && m.Level != nil { - return *m.Level - } - return 0 -} - -func (m *DebugLinkLog) GetBucket() string { - if m != nil && m.Bucket != nil { - return *m.Bucket - } - return "" -} - -func (m *DebugLinkLog) GetText() string { - if m != nil && m.Text != nil { - return *m.Text - } - return "" -} - -// * -// Request: Read memory from device -// @next DebugLinkMemory -type DebugLinkMemoryRead struct { - Address *uint32 `protobuf:"varint,1,opt,name=address" json:"address,omitempty"` - Length *uint32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DebugLinkMemoryRead) Reset() { *m = DebugLinkMemoryRead{} } -func (m *DebugLinkMemoryRead) String() string { return proto.CompactTextString(m) } -func (*DebugLinkMemoryRead) ProtoMessage() {} -func (*DebugLinkMemoryRead) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{69} } - -func (m *DebugLinkMemoryRead) GetAddress() uint32 { - if m != nil && m.Address != nil { - return *m.Address - } - return 0 -} - -func (m *DebugLinkMemoryRead) GetLength() uint32 { - if m != nil && m.Length != nil { - return *m.Length - } - return 0 -} - -// * -// Response: Device sends memory back -// @prev DebugLinkMemoryRead -type DebugLinkMemory struct { - Memory []byte `protobuf:"bytes,1,opt,name=memory" json:"memory,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DebugLinkMemory) Reset() { *m = DebugLinkMemory{} } -func (m *DebugLinkMemory) String() string { return proto.CompactTextString(m) } -func (*DebugLinkMemory) ProtoMessage() {} -func (*DebugLinkMemory) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{70} } - -func (m *DebugLinkMemory) GetMemory() []byte { - if m != nil { - return m.Memory - } - return nil -} - -// * -// Request: Write memory to device. -// WARNING: Writing to the wrong location can irreparably break the device. -type DebugLinkMemoryWrite struct { - Address *uint32 `protobuf:"varint,1,opt,name=address" json:"address,omitempty"` - Memory []byte `protobuf:"bytes,2,opt,name=memory" json:"memory,omitempty"` - Flash *bool `protobuf:"varint,3,opt,name=flash" json:"flash,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DebugLinkMemoryWrite) Reset() { *m = DebugLinkMemoryWrite{} } -func (m *DebugLinkMemoryWrite) String() string { return proto.CompactTextString(m) } -func (*DebugLinkMemoryWrite) ProtoMessage() {} -func (*DebugLinkMemoryWrite) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{71} } - -func (m *DebugLinkMemoryWrite) GetAddress() uint32 { - if m != nil && m.Address != nil { - return *m.Address - } - return 0 -} - -func (m *DebugLinkMemoryWrite) GetMemory() []byte { - if m != nil { - return m.Memory - } - return nil -} - -func (m *DebugLinkMemoryWrite) GetFlash() bool { - if m != nil && m.Flash != nil { - return *m.Flash - } - return false -} - -// * -// Request: Erase block of flash on device -// WARNING: Writing to the wrong location can irreparably break the device. -type DebugLinkFlashErase struct { - Sector *uint32 `protobuf:"varint,1,opt,name=sector" json:"sector,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DebugLinkFlashErase) Reset() { *m = DebugLinkFlashErase{} } -func (m *DebugLinkFlashErase) String() string { return proto.CompactTextString(m) } -func (*DebugLinkFlashErase) ProtoMessage() {} -func (*DebugLinkFlashErase) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{72} } - -func (m *DebugLinkFlashErase) GetSector() uint32 { - if m != nil && m.Sector != nil { - return *m.Sector - } - return 0 -} - -func init() { - proto.RegisterType((*Initialize)(nil), "Initialize") - proto.RegisterType((*GetFeatures)(nil), "GetFeatures") - proto.RegisterType((*Features)(nil), "Features") - proto.RegisterType((*ClearSession)(nil), "ClearSession") - proto.RegisterType((*ApplySettings)(nil), "ApplySettings") - proto.RegisterType((*ApplyFlags)(nil), "ApplyFlags") - proto.RegisterType((*ChangePin)(nil), "ChangePin") - proto.RegisterType((*Ping)(nil), "Ping") - proto.RegisterType((*Success)(nil), "Success") - proto.RegisterType((*Failure)(nil), "Failure") - proto.RegisterType((*ButtonRequest)(nil), "ButtonRequest") - proto.RegisterType((*ButtonAck)(nil), "ButtonAck") - proto.RegisterType((*PinMatrixRequest)(nil), "PinMatrixRequest") - proto.RegisterType((*PinMatrixAck)(nil), "PinMatrixAck") - proto.RegisterType((*Cancel)(nil), "Cancel") - proto.RegisterType((*PassphraseRequest)(nil), "PassphraseRequest") - proto.RegisterType((*PassphraseAck)(nil), "PassphraseAck") - proto.RegisterType((*GetEntropy)(nil), "GetEntropy") - proto.RegisterType((*Entropy)(nil), "Entropy") - proto.RegisterType((*GetPublicKey)(nil), "GetPublicKey") - proto.RegisterType((*PublicKey)(nil), "PublicKey") - proto.RegisterType((*GetAddress)(nil), "GetAddress") - proto.RegisterType((*EthereumGetAddress)(nil), "EthereumGetAddress") - proto.RegisterType((*Address)(nil), "Address") - proto.RegisterType((*EthereumAddress)(nil), "EthereumAddress") - proto.RegisterType((*WipeDevice)(nil), "WipeDevice") - proto.RegisterType((*LoadDevice)(nil), "LoadDevice") - proto.RegisterType((*ResetDevice)(nil), "ResetDevice") - proto.RegisterType((*BackupDevice)(nil), "BackupDevice") - proto.RegisterType((*EntropyRequest)(nil), "EntropyRequest") - proto.RegisterType((*EntropyAck)(nil), "EntropyAck") - proto.RegisterType((*RecoveryDevice)(nil), "RecoveryDevice") - proto.RegisterType((*WordRequest)(nil), "WordRequest") - proto.RegisterType((*WordAck)(nil), "WordAck") - proto.RegisterType((*SignMessage)(nil), "SignMessage") - proto.RegisterType((*VerifyMessage)(nil), "VerifyMessage") - proto.RegisterType((*MessageSignature)(nil), "MessageSignature") - proto.RegisterType((*EncryptMessage)(nil), "EncryptMessage") - proto.RegisterType((*EncryptedMessage)(nil), "EncryptedMessage") - proto.RegisterType((*DecryptMessage)(nil), "DecryptMessage") - proto.RegisterType((*DecryptedMessage)(nil), "DecryptedMessage") - proto.RegisterType((*CipherKeyValue)(nil), "CipherKeyValue") - proto.RegisterType((*CipheredKeyValue)(nil), "CipheredKeyValue") - proto.RegisterType((*EstimateTxSize)(nil), "EstimateTxSize") - proto.RegisterType((*TxSize)(nil), "TxSize") - proto.RegisterType((*SignTx)(nil), "SignTx") - proto.RegisterType((*SimpleSignTx)(nil), "SimpleSignTx") - proto.RegisterType((*TxRequest)(nil), "TxRequest") - proto.RegisterType((*TxAck)(nil), "TxAck") - proto.RegisterType((*EthereumSignTx)(nil), "EthereumSignTx") - proto.RegisterType((*EthereumTxRequest)(nil), "EthereumTxRequest") - proto.RegisterType((*EthereumTxAck)(nil), "EthereumTxAck") - proto.RegisterType((*EthereumSignMessage)(nil), "EthereumSignMessage") - proto.RegisterType((*EthereumVerifyMessage)(nil), "EthereumVerifyMessage") - proto.RegisterType((*EthereumMessageSignature)(nil), "EthereumMessageSignature") - proto.RegisterType((*SignIdentity)(nil), "SignIdentity") - proto.RegisterType((*SignedIdentity)(nil), "SignedIdentity") - proto.RegisterType((*GetECDHSessionKey)(nil), "GetECDHSessionKey") - proto.RegisterType((*ECDHSessionKey)(nil), "ECDHSessionKey") - proto.RegisterType((*SetU2FCounter)(nil), "SetU2FCounter") - proto.RegisterType((*FirmwareErase)(nil), "FirmwareErase") - proto.RegisterType((*FirmwareRequest)(nil), "FirmwareRequest") - proto.RegisterType((*FirmwareUpload)(nil), "FirmwareUpload") - proto.RegisterType((*SelfTest)(nil), "SelfTest") - proto.RegisterType((*DebugLinkDecision)(nil), "DebugLinkDecision") - proto.RegisterType((*DebugLinkGetState)(nil), "DebugLinkGetState") - proto.RegisterType((*DebugLinkState)(nil), "DebugLinkState") - proto.RegisterType((*DebugLinkStop)(nil), "DebugLinkStop") - proto.RegisterType((*DebugLinkLog)(nil), "DebugLinkLog") - proto.RegisterType((*DebugLinkMemoryRead)(nil), "DebugLinkMemoryRead") - proto.RegisterType((*DebugLinkMemory)(nil), "DebugLinkMemory") - proto.RegisterType((*DebugLinkMemoryWrite)(nil), "DebugLinkMemoryWrite") - proto.RegisterType((*DebugLinkFlashErase)(nil), "DebugLinkFlashErase") - proto.RegisterEnum("MessageType", MessageType_name, MessageType_value) -} - -func init() { proto.RegisterFile("messages.proto", fileDescriptor1) } - -var fileDescriptor1 = []byte{ - // 3424 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5a, 0xcb, 0x6f, 0xdc, 0x46, - 0x9a, 0x5f, 0x76, 0xb7, 0xfa, 0xf1, 0x35, 0xbb, 0x55, 0xa2, 0x2d, 0xbb, 0x2d, 0x5b, 0xb6, 0x4c, - 0xc9, 0xb6, 0x64, 0x27, 0xed, 0x44, 0x79, 0x6c, 0xd6, 0xbb, 0x79, 0xc8, 0x7a, 0xd8, 0xde, 0xd8, - 0x8e, 0xc0, 0x56, 0x9c, 0xdb, 0x12, 0x14, 0x59, 0xea, 0xae, 0x55, 0x37, 0xc9, 0xf0, 0xa1, 0xa8, - 0x7d, 0xd8, 0xeb, 0xee, 0x65, 0x81, 0xec, 0x69, 0x73, 0x1a, 0xe4, 0x36, 0x19, 0x04, 0x18, 0x0c, - 0x30, 0x18, 0x60, 0x72, 0x9a, 0x3f, 0x60, 0xfe, 0x8b, 0x39, 0xce, 0x1f, 0x30, 0xe7, 0x41, 0x3d, - 0x48, 0x16, 0x29, 0xb6, 0x6c, 0x27, 0xc0, 0x5c, 0x04, 0xd6, 0x57, 0xbf, 0xfe, 0xea, 0x7b, 0xd5, - 0x57, 0x5f, 0x7d, 0x25, 0xe8, 0x4e, 0x70, 0x18, 0x5a, 0x43, 0x1c, 0xf6, 0xfd, 0xc0, 0x8b, 0xbc, - 0xa5, 0x76, 0x34, 0xf5, 0x93, 0x81, 0xae, 0x02, 0x3c, 0x71, 0x49, 0x44, 0xac, 0x31, 0x79, 0x89, - 0xf5, 0x0e, 0xb4, 0x1f, 0xe1, 0x68, 0x0f, 0x5b, 0x51, 0x1c, 0xe0, 0x50, 0xff, 0x69, 0x0e, 0x9a, - 0xc9, 0x40, 0xbb, 0x04, 0xf5, 0x13, 0xec, 0x3a, 0x5e, 0xd0, 0x53, 0x56, 0x94, 0xf5, 0x96, 0x21, - 0x46, 0xda, 0x2a, 0x74, 0x26, 0xd6, 0x7f, 0x7a, 0x81, 0x79, 0x82, 0x83, 0x90, 0x78, 0x6e, 0xaf, - 0xb2, 0xa2, 0xac, 0x77, 0x0c, 0x95, 0x11, 0x5f, 0x70, 0x1a, 0x03, 0x11, 0x57, 0x02, 0x55, 0x05, - 0x88, 0x12, 0x25, 0x90, 0x6f, 0x45, 0xf6, 0x28, 0x05, 0xd5, 0x38, 0x88, 0x11, 0x13, 0xd0, 0x1d, - 0x98, 0x3f, 0xf4, 0xbc, 0x68, 0xec, 0x59, 0x0e, 0x0e, 0xcc, 0x89, 0xe7, 0xe0, 0xde, 0xdc, 0x8a, - 0xb2, 0xde, 0x34, 0xba, 0x19, 0xf9, 0x99, 0xe7, 0x60, 0xed, 0x2a, 0xb4, 0x1c, 0x7c, 0x42, 0x6c, - 0x6c, 0x12, 0xa7, 0x57, 0x67, 0x22, 0x37, 0x39, 0xe1, 0x89, 0xa3, 0xdd, 0x82, 0xae, 0x4f, 0x5c, - 0x93, 0xda, 0x00, 0xdb, 0x11, 0x5d, 0xab, 0xc1, 0x98, 0x74, 0x7c, 0xe2, 0xee, 0xa7, 0x44, 0xed, - 0x3d, 0x58, 0xf4, 0xad, 0x30, 0xf4, 0x47, 0x81, 0x15, 0x62, 0x19, 0xdd, 0x64, 0xe8, 0x8b, 0xd9, - 0xa4, 0xf4, 0xa3, 0x25, 0x68, 0x8e, 0x2d, 0x77, 0x18, 0x5b, 0x43, 0xdc, 0x6b, 0xf1, 0x75, 0x93, - 0xb1, 0x76, 0x11, 0xe6, 0xc6, 0xd6, 0x21, 0x1e, 0xf7, 0x80, 0x4d, 0xf0, 0x81, 0x76, 0x03, 0xe6, - 0x6c, 0x8f, 0xb8, 0x61, 0xaf, 0xbd, 0x52, 0x5d, 0x6f, 0x6f, 0xb6, 0xfa, 0xdb, 0x1e, 0x71, 0x0f, - 0xa6, 0x3e, 0x36, 0x38, 0x5d, 0x5b, 0x81, 0x36, 0x49, 0xbd, 0xe4, 0xf4, 0x54, 0xb6, 0xba, 0x4c, - 0xa2, 0x8b, 0x06, 0xf8, 0x84, 0x30, 0xb3, 0x75, 0x56, 0x94, 0x75, 0xd5, 0x48, 0xc7, 0x05, 0x93, - 0x8d, 0xac, 0x70, 0xd4, 0xeb, 0x32, 0x88, 0x64, 0xb2, 0xc7, 0x56, 0x38, 0xa2, 0x4c, 0xc8, 0xc4, - 0xf7, 0x82, 0x08, 0x3b, 0xbd, 0x79, 0xb6, 0x46, 0x3a, 0xd6, 0x96, 0x01, 0xa8, 0xc5, 0x6c, 0xcb, - 0x1e, 0x61, 0xa7, 0x87, 0xd8, 0x6c, 0xcb, 0x27, 0xee, 0x36, 0x23, 0x68, 0xf7, 0x60, 0x41, 0xb2, - 0x94, 0x40, 0x2d, 0x30, 0x14, 0xca, 0x26, 0x04, 0x78, 0x03, 0xd0, 0x11, 0x09, 0x26, 0xdf, 0x58, - 0x01, 0x35, 0x2a, 0x0e, 0xb1, 0x1b, 0xf5, 0x34, 0x86, 0x9d, 0x4f, 0xe8, 0xfb, 0x9c, 0xac, 0xdd, - 0x04, 0xd5, 0xc5, 0xd8, 0x09, 0xcd, 0x43, 0xcb, 0x3e, 0x8e, 0xfd, 0xde, 0x05, 0xae, 0x3a, 0xa3, - 0x3d, 0x64, 0x24, 0x6a, 0xd3, 0xa3, 0xb1, 0x35, 0x0c, 0x7b, 0x17, 0x59, 0xb8, 0xf0, 0x81, 0xde, - 0x05, 0x75, 0x7b, 0x8c, 0xad, 0x60, 0x80, 0x43, 0x6a, 0x04, 0xfd, 0x7f, 0x14, 0xe8, 0x6c, 0xf9, - 0xfe, 0x78, 0x3a, 0xc0, 0x51, 0x44, 0xdc, 0x61, 0x98, 0xf3, 0x93, 0x32, 0xcb, 0x4f, 0x15, 0xd9, - 0x4f, 0xb7, 0xa0, 0x1b, 0xd3, 0x38, 0x48, 0xf5, 0x61, 0x61, 0xdc, 0x34, 0x3a, 0x71, 0x88, 0xf7, - 0x53, 0xa2, 0x76, 0x1d, 0x60, 0xe4, 0x4d, 0x70, 0x68, 0x07, 0x18, 0xf3, 0x20, 0x56, 0x0d, 0x89, - 0xa2, 0xeb, 0x00, 0x4c, 0x92, 0x3d, 0x2a, 0x68, 0x26, 0xbe, 0x22, 0x8b, 0xbf, 0x0a, 0xad, 0xed, - 0x91, 0xe5, 0x0e, 0xf1, 0x3e, 0x71, 0xe9, 0xd6, 0x0b, 0xf0, 0xc4, 0x3b, 0xe1, 0x72, 0x36, 0x0d, - 0x31, 0xd2, 0x7f, 0xa3, 0x40, 0x6d, 0x9f, 0xb8, 0x43, 0xad, 0x07, 0x0d, 0xb1, 0xc9, 0x85, 0x26, - 0xc9, 0x90, 0xfa, 0xe5, 0x30, 0x8e, 0x22, 0x2f, 0x17, 0xeb, 0x15, 0xee, 0x17, 0x3e, 0x21, 0x45, - 0xee, 0xd9, 0x5d, 0x51, 0x7d, 0xa3, 0x5d, 0x51, 0x9b, 0xbd, 0x2b, 0xf4, 0x55, 0x68, 0x0c, 0x62, - 0xdb, 0xc6, 0x61, 0x38, 0x5b, 0x5a, 0x7d, 0x17, 0x1a, 0x7b, 0x16, 0x19, 0xc7, 0x01, 0xd6, 0x56, - 0xa0, 0x66, 0xd3, 0xcd, 0x4d, 0x11, 0xdd, 0x4d, 0xb5, 0x2f, 0xe8, 0x6c, 0x57, 0xb0, 0x19, 0x99, - 0x4d, 0x25, 0xcf, 0xe6, 0x73, 0xe8, 0x3c, 0x64, 0xba, 0x19, 0xf8, 0xeb, 0x18, 0x87, 0x91, 0x76, - 0x3b, 0xc7, 0x4c, 0xeb, 0xe7, 0x66, 0x25, 0x96, 0x1a, 0xd4, 0x1c, 0x2b, 0xb2, 0x04, 0x3f, 0xf6, - 0xad, 0xb7, 0xa1, 0xc5, 0xe1, 0x5b, 0xf6, 0xb1, 0xfe, 0x31, 0xa0, 0x7d, 0xe2, 0x3e, 0xb3, 0xa2, - 0x80, 0x9c, 0x26, 0xcc, 0x37, 0xa0, 0x46, 0x33, 0xaa, 0x60, 0xbe, 0xd8, 0x2f, 0x02, 0x38, 0x7f, - 0x0a, 0xd1, 0x57, 0x40, 0x4d, 0x67, 0xb7, 0xec, 0x63, 0x0d, 0x41, 0xd5, 0x27, 0x6e, 0x4f, 0x59, - 0xa9, 0xac, 0xb7, 0x0c, 0xfa, 0xa9, 0x37, 0xa1, 0xbe, 0x6d, 0xb9, 0x36, 0x1e, 0xeb, 0x17, 0x60, - 0x21, 0x8b, 0x29, 0xc1, 0x4a, 0xbf, 0x0f, 0x9d, 0x8c, 0x48, 0x39, 0x5c, 0x07, 0x90, 0xc2, 0x91, - 0x33, 0x92, 0x28, 0xfa, 0x0a, 0xc0, 0x23, 0x1c, 0xed, 0xba, 0x51, 0xe0, 0xf9, 0x53, 0xaa, 0x5f, - 0x48, 0x5e, 0x72, 0x5c, 0xc7, 0x60, 0xdf, 0xd4, 0x31, 0xc9, 0x74, 0x0f, 0x1a, 0x98, 0x7f, 0x32, - 0x84, 0x6a, 0x24, 0x43, 0xfd, 0x57, 0x0a, 0xa8, 0x8f, 0x70, 0xb4, 0x1f, 0x1f, 0x8e, 0x89, 0xfd, - 0x39, 0x9e, 0xd2, 0xec, 0x6a, 0x39, 0x4e, 0x80, 0xc3, 0xd0, 0xa4, 0xf2, 0x57, 0xd7, 0x3b, 0x46, - 0x53, 0x10, 0x9e, 0x6b, 0xeb, 0x80, 0xb0, 0xed, 0x84, 0x96, 0x69, 0xc7, 0xc1, 0x09, 0x36, 0x5d, - 0x6b, 0x92, 0xb8, 0xa8, 0xcb, 0xe8, 0xdb, 0x94, 0xfc, 0xdc, 0x9a, 0x60, 0xba, 0xbd, 0xc3, 0x91, - 0xf7, 0x8d, 0xe9, 0x90, 0xd0, 0x1f, 0x5b, 0x53, 0x11, 0x6f, 0x6d, 0x4a, 0xdb, 0xe1, 0x24, 0x6d, - 0x0d, 0x5a, 0x34, 0x09, 0x72, 0x2e, 0x34, 0xc2, 0x5a, 0x0f, 0x1a, 0x0f, 0x49, 0x44, 0x69, 0x46, - 0x93, 0xfe, 0xa5, 0x8c, 0xf4, 0xcf, 0xa0, 0x95, 0x09, 0x77, 0x03, 0x6a, 0x2e, 0x77, 0x77, 0x65, - 0xbd, 0xbd, 0xd9, 0xee, 0x3f, 0xde, 0x79, 0xee, 0x39, 0x22, 0x74, 0x5c, 0xe1, 0xe7, 0x53, 0x3f, - 0x3e, 0x4c, 0xfc, 0x4c, 0xbf, 0xf5, 0xbf, 0x2a, 0xcc, 0x54, 0x5b, 0x5c, 0x89, 0xf3, 0x15, 0xcc, - 0xc9, 0x54, 0x99, 0x21, 0xd3, 0xeb, 0x28, 0xf7, 0x01, 0x34, 0x27, 0xf1, 0x38, 0x22, 0x21, 0x19, - 0x32, 0xdd, 0xda, 0x9b, 0x57, 0xfa, 0xcf, 0x04, 0xc1, 0xc0, 0x0e, 0xc6, 0x93, 0x81, 0x1d, 0x10, - 0x9f, 0xc7, 0x50, 0x0a, 0xd5, 0x3e, 0x85, 0x76, 0xc8, 0xe8, 0x26, 0x8b, 0xbc, 0x39, 0x16, 0x79, - 0xa8, 0xff, 0xc4, 0xf5, 0xe3, 0x28, 0xfb, 0xc1, 0x03, 0x75, 0xb0, 0xbf, 0xfb, 0x7c, 0x67, 0x6b, - 0x67, 0xc7, 0xd8, 0x1d, 0x0c, 0x0c, 0x08, 0xd3, 0x19, 0xfd, 0x00, 0xb4, 0xdd, 0x68, 0x84, 0x03, - 0x1c, 0x4f, 0x5e, 0x57, 0xe7, 0xa2, 0x36, 0x95, 0x33, 0xda, 0xd0, 0x50, 0x4a, 0x58, 0xf5, 0xa0, - 0x21, 0x7e, 0x29, 0x82, 0x32, 0x19, 0xea, 0xf7, 0x60, 0x3e, 0x59, 0x7a, 0x06, 0x58, 0xcd, 0xc0, - 0x2a, 0xc0, 0x57, 0xc4, 0xc7, 0x3b, 0xec, 0xdc, 0xd6, 0xff, 0xaf, 0x02, 0xf0, 0xd4, 0xb3, 0x1c, - 0x3e, 0xa4, 0x09, 0x7c, 0xe2, 0xe2, 0x89, 0xe7, 0x12, 0x3b, 0x49, 0xe0, 0xc9, 0x38, 0x0d, 0x81, - 0x0a, 0x33, 0x6a, 0x49, 0x08, 0x88, 0xad, 0x57, 0x65, 0xbf, 0xa3, 0x9f, 0x3f, 0x2b, 0xad, 0x69, - 0xab, 0xd2, 0x21, 0x32, 0xc7, 0x03, 0x01, 0xbb, 0xc3, 0x31, 0x09, 0x47, 0x65, 0xa7, 0x49, 0x5d, - 0x3e, 0x4d, 0x56, 0xa1, 0x13, 0x1e, 0x13, 0xdf, 0xb4, 0x47, 0xd8, 0x3e, 0x0e, 0xe3, 0x89, 0x28, - 0x41, 0x54, 0x4a, 0xdc, 0x16, 0x34, 0xed, 0x06, 0xb4, 0xe3, 0xcd, 0x23, 0xd3, 0xf6, 0x62, 0x37, - 0xc2, 0x01, 0xab, 0x3b, 0x3a, 0x06, 0xc4, 0x9b, 0x47, 0xdb, 0x9c, 0xa2, 0xff, 0xb6, 0x02, 0x6d, - 0x03, 0x87, 0x38, 0x12, 0x46, 0xb9, 0x05, 0x5d, 0xe1, 0x21, 0x33, 0xb0, 0x5c, 0xc7, 0x9b, 0x88, - 0x33, 0xa3, 0x23, 0xa8, 0x06, 0x23, 0x6a, 0x37, 0xa0, 0x19, 0x46, 0x01, 0x76, 0x87, 0xd1, 0x88, - 0x17, 0x6c, 0x0f, 0xaa, 0x9b, 0x1f, 0x7c, 0x68, 0xa4, 0xc4, 0xd9, 0xd6, 0xa8, 0x9e, 0x63, 0x8d, - 0xb3, 0x07, 0x48, 0xad, 0xec, 0x00, 0xf9, 0x05, 0x46, 0x2b, 0xd8, 0xa3, 0x51, 0xb4, 0x07, 0x05, - 0x30, 0xab, 0x8a, 0x7a, 0x81, 0x17, 0x6a, 0x40, 0x49, 0xbc, 0x5c, 0xa0, 0x85, 0x01, 0xff, 0x12, - 0x41, 0x85, 0xa0, 0x2b, 0xf2, 0x5f, 0x92, 0x64, 0x6f, 0x03, 0x08, 0x0a, 0xcd, 0xb0, 0xb9, 0xa4, - 0xa8, 0xc8, 0x49, 0xf1, 0x4f, 0x15, 0xe8, 0x1a, 0xd8, 0xf6, 0x4e, 0x70, 0x30, 0x15, 0xd6, 0x5f, - 0x06, 0xf8, 0xc6, 0x0b, 0x1c, 0x2e, 0x9f, 0x38, 0xd1, 0x5b, 0x94, 0xc2, 0xc4, 0x9b, 0x6d, 0xd4, - 0xca, 0x1b, 0x19, 0xb5, 0xfa, 0x2a, 0xa3, 0xd6, 0x5e, 0x69, 0xd4, 0x39, 0xd9, 0xa8, 0x1b, 0x80, - 0xb0, 0x7b, 0xe4, 0x05, 0x36, 0x36, 0xa9, 0xac, 0x63, 0x12, 0x46, 0xcc, 0xea, 0x4d, 0x63, 0x5e, - 0xd0, 0xbf, 0x12, 0x64, 0x9a, 0x39, 0x59, 0xca, 0xe1, 0x81, 0xc8, 0xbe, 0x8b, 0x3e, 0x69, 0x9d, - 0xf1, 0xc9, 0x65, 0x68, 0x38, 0xc1, 0xd4, 0x0c, 0x62, 0x97, 0xd5, 0xbd, 0x4d, 0xa3, 0xee, 0x04, - 0x53, 0x23, 0x76, 0xf5, 0xf7, 0xa0, 0x4d, 0x39, 0x27, 0x27, 0xe9, 0x5a, 0xee, 0x24, 0x45, 0x7d, - 0x69, 0x4e, 0x3a, 0x44, 0x97, 0xa1, 0x41, 0x27, 0xa8, 0x6f, 0x34, 0xa8, 0x51, 0x81, 0x45, 0x8a, - 0x61, 0xdf, 0xfa, 0x8f, 0x0a, 0xb4, 0x07, 0x64, 0xe8, 0x3e, 0x13, 0x15, 0xd0, 0xb9, 0x49, 0x2d, - 0x57, 0x43, 0xb0, 0xcc, 0x93, 0x14, 0x4e, 0xb9, 0x14, 0x5f, 0x9d, 0x95, 0xe2, 0x0b, 0x89, 0xb8, - 0xf6, 0xc6, 0x89, 0xf8, 0xbf, 0x15, 0xe8, 0xbc, 0xc0, 0x01, 0x39, 0x9a, 0x26, 0xf2, 0xe6, 0x92, - 0xa1, 0x22, 0x65, 0x4e, 0xed, 0x1a, 0xb4, 0x42, 0x32, 0x74, 0xd9, 0x7d, 0x8c, 0x45, 0x8c, 0x6a, - 0x64, 0x04, 0x59, 0x95, 0x2a, 0x8f, 0xd3, 0x52, 0x55, 0x66, 0x9e, 0xa0, 0xff, 0x0e, 0x48, 0x88, - 0x30, 0x90, 0x79, 0xfe, 0x1c, 0x59, 0xf4, 0x1f, 0x14, 0xba, 0xa9, 0xec, 0x60, 0xea, 0x47, 0x89, - 0x5a, 0x97, 0xa0, 0xee, 0xc7, 0x87, 0xc7, 0x38, 0xd9, 0x45, 0x62, 0x54, 0xac, 0xe2, 0x24, 0xb1, - 0x6f, 0x82, 0x9a, 0x64, 0x32, 0xcf, 0x1d, 0xa7, 0xc7, 0xa7, 0xa0, 0x7d, 0xe1, 0x8e, 0x0b, 0x55, - 0x48, 0xed, 0xbc, 0x43, 0x7a, 0x6e, 0x96, 0xda, 0x2f, 0x00, 0x09, 0x49, 0xb1, 0x93, 0xc8, 0x7a, - 0x11, 0xe6, 0x5c, 0xcf, 0xb5, 0xb1, 0x10, 0x95, 0x0f, 0xce, 0x91, 0x54, 0x83, 0xda, 0x68, 0x62, - 0xd9, 0xc2, 0xee, 0xec, 0x5b, 0xff, 0x1a, 0xba, 0x3b, 0x38, 0x67, 0x81, 0x73, 0x03, 0x31, 0x5d, - 0xb2, 0x32, 0x63, 0xc9, 0x6a, 0xf9, 0x92, 0x35, 0x69, 0xc9, 0x3d, 0x40, 0x62, 0xc9, 0x4c, 0x95, - 0x42, 0xad, 0x2d, 0x71, 0x90, 0x7c, 0x5b, 0xc9, 0xf9, 0x56, 0xff, 0xb3, 0x02, 0xdd, 0x6d, 0xe2, - 0x8f, 0x70, 0xf0, 0x39, 0x9e, 0xbe, 0xb0, 0xc6, 0xf1, 0x2b, 0x64, 0x47, 0x50, 0xa5, 0x7e, 0xe5, - 0x5c, 0xe8, 0x27, 0xd5, 0xe6, 0x84, 0xfe, 0x4e, 0x48, 0xcd, 0x07, 0x3c, 0x93, 0x32, 0xf9, 0xc4, - 0xb1, 0x90, 0x0c, 0xb5, 0x35, 0xe8, 0x5a, 0xe1, 0xb1, 0xe9, 0xb9, 0x66, 0x02, 0xe0, 0x77, 0x7a, - 0xd5, 0x0a, 0x8f, 0xbf, 0x70, 0x77, 0xcf, 0xa0, 0x1c, 0xae, 0xa6, 0x48, 0x52, 0x1c, 0x25, 0x54, - 0xd7, 0xba, 0x50, 0x21, 0x27, 0xec, 0x60, 0x50, 0x8d, 0x0a, 0x39, 0xd1, 0xd7, 0x01, 0x71, 0x65, - 0xb0, 0x93, 0xaa, 0x93, 0xca, 0xa7, 0x48, 0xf2, 0xe9, 0xff, 0x05, 0xdd, 0xdd, 0x30, 0x22, 0x13, - 0x2b, 0xc2, 0x07, 0xa7, 0x03, 0xf2, 0x12, 0xd3, 0x23, 0xda, 0x8b, 0x23, 0x3f, 0x8e, 0xc2, 0x34, - 0xa3, 0xd3, 0xc2, 0x59, 0x15, 0x44, 0x9e, 0xd4, 0x6f, 0x82, 0x4a, 0x5c, 0x09, 0x53, 0x61, 0x98, - 0x36, 0xa7, 0x71, 0xc8, 0x6b, 0x25, 0x13, 0xfd, 0x26, 0xd4, 0xc5, 0xba, 0x97, 0xa1, 0x11, 0x9d, - 0x9a, 0xa2, 0x54, 0xa7, 0xd9, 0xb4, 0x1e, 0xb1, 0x09, 0xfd, 0xf7, 0x0a, 0xd4, 0xe9, 0xf6, 0x3c, - 0x38, 0xfd, 0xc7, 0xca, 0xa6, 0x5d, 0x85, 0x46, 0xae, 0x2b, 0xf3, 0x40, 0x79, 0xd7, 0x48, 0x28, - 0xda, 0x75, 0x68, 0x8d, 0x3d, 0xfb, 0xd8, 0x8c, 0x88, 0xd8, 0x69, 0x9d, 0x07, 0xca, 0x3b, 0x46, - 0x93, 0xd2, 0x0e, 0xc8, 0x04, 0xeb, 0x7f, 0x53, 0x40, 0x1d, 0x90, 0x89, 0x3f, 0xc6, 0x42, 0xf6, - 0x35, 0xa8, 0x73, 0x11, 0x58, 0x2c, 0xb5, 0x37, 0xd5, 0xfe, 0xc1, 0x29, 0xcb, 0x99, 0x2c, 0xcd, - 0x8b, 0x39, 0xed, 0x0e, 0x34, 0x84, 0x32, 0xbd, 0x0a, 0x83, 0x75, 0xfa, 0x07, 0xa7, 0x5f, 0x30, - 0x0a, 0xc3, 0x25, 0xb3, 0xda, 0xfb, 0xa0, 0x46, 0x81, 0xe5, 0x86, 0x16, 0x3b, 0x09, 0xc3, 0x5e, - 0x95, 0xa1, 0x51, 0xff, 0x20, 0x23, 0xb2, 0x1f, 0xe4, 0x50, 0xaf, 0x97, 0x16, 0x65, 0xc5, 0xe7, - 0xce, 0x57, 0xbc, 0x7e, 0x56, 0xf1, 0x5f, 0x2b, 0xd0, 0x3a, 0x48, 0x2f, 0x8a, 0xf7, 0x41, 0x0d, - 0xf8, 0xa7, 0x29, 0x1d, 0x73, 0x6a, 0x5f, 0x3e, 0xe2, 0xda, 0x41, 0x36, 0xd0, 0xee, 0x43, 0xc3, - 0xc1, 0x91, 0x45, 0xc6, 0xa1, 0xa8, 0x63, 0x17, 0xfb, 0x29, 0xb7, 0x1d, 0x3e, 0xc1, 0x0d, 0x21, - 0x50, 0xda, 0x47, 0x00, 0x21, 0x0e, 0x92, 0x36, 0x51, 0x95, 0xfd, 0xa6, 0x97, 0xfd, 0x66, 0x90, - 0xce, 0xb1, 0x9f, 0x49, 0x58, 0x7d, 0x03, 0xe6, 0x0e, 0xd8, 0x95, 0x74, 0x05, 0x2a, 0xd1, 0x29, - 0x13, 0xad, 0xcc, 0x82, 0x95, 0xe8, 0x54, 0xff, 0xdf, 0x0a, 0x74, 0x93, 0x0a, 0x5e, 0xf8, 0xf3, - 0x67, 0xa4, 0xb6, 0xab, 0xd0, 0x1a, 0x5a, 0xa1, 0xe9, 0x07, 0xc4, 0x4e, 0xd2, 0x44, 0x73, 0x68, - 0x85, 0xfb, 0x74, 0x9c, 0x4c, 0x8e, 0xc9, 0x84, 0x44, 0x22, 0xc5, 0xd1, 0xc9, 0xa7, 0x74, 0x4c, - 0x37, 0x78, 0xe4, 0x31, 0x67, 0xa8, 0x46, 0x25, 0xf2, 0xb2, 0xcd, 0x5c, 0x97, 0x93, 0xcd, 0x5b, - 0xa0, 0xd1, 0xeb, 0xbb, 0x29, 0x9a, 0x64, 0xa6, 0x3d, 0x8a, 0xdd, 0x63, 0x91, 0x16, 0x10, 0x9d, - 0x11, 0x6d, 0xcf, 0x6d, 0x4a, 0xa7, 0x25, 0x0c, 0x43, 0x8f, 0x79, 0x45, 0x2c, 0xca, 0x6c, 0x4a, - 0x7a, 0xca, 0xcb, 0xe1, 0x2b, 0xd0, 0xb4, 0x47, 0x16, 0x71, 0x4d, 0xe2, 0x88, 0x02, 0xa7, 0xc1, - 0xc6, 0x4f, 0x1c, 0xfd, 0xff, 0x15, 0x58, 0x48, 0xec, 0x91, 0x39, 0xbb, 0xc0, 0x51, 0x39, 0xc3, - 0x91, 0x16, 0xaa, 0xc9, 0x81, 0x69, 0x9e, 0x88, 0xae, 0x29, 0xa4, 0xa4, 0x17, 0x79, 0x40, 0x20, - 0x6c, 0x94, 0x01, 0x8c, 0x3c, 0x20, 0x4c, 0x1a, 0x4d, 0x29, 0x69, 0xa0, 0xf7, 0xa1, 0x93, 0x09, - 0x46, 0x9d, 0xbb, 0x0c, 0x4c, 0x02, 0x61, 0x0c, 0x9e, 0xfc, 0x5a, 0x94, 0xc2, 0xac, 0xa0, 0x3f, - 0x85, 0x0b, 0xb2, 0x63, 0x7f, 0x59, 0x05, 0xa5, 0x13, 0x58, 0x4c, 0xb8, 0x9d, 0x5b, 0xe1, 0xa8, - 0xbf, 0xb8, 0xc2, 0xd1, 0x0d, 0xe8, 0x25, 0x4b, 0xbd, 0xaa, 0x86, 0x79, 0xdd, 0xd5, 0xf4, 0x9f, - 0x58, 0xd2, 0x1a, 0xba, 0x4f, 0x1c, 0xec, 0x46, 0x24, 0x9a, 0x6a, 0x1b, 0xd0, 0x24, 0xe2, 0x5b, - 0xec, 0x8f, 0x4e, 0x3f, 0x99, 0xe4, 0xf7, 0x73, 0x92, 0x41, 0x91, 0x3d, 0xb2, 0xc6, 0xd4, 0xf7, - 0xd8, 0x1c, 0x11, 0xc7, 0xc1, 0xae, 0x58, 0x60, 0x3e, 0xa5, 0x3f, 0x66, 0xe4, 0x3c, 0xf4, 0x84, - 0x84, 0xb1, 0x35, 0x16, 0x97, 0xd2, 0x0c, 0xfa, 0x82, 0x91, 0x4b, 0xdb, 0x2a, 0xb5, 0xb2, 0xb6, - 0x8a, 0x3e, 0x84, 0x2e, 0x15, 0x1d, 0x3b, 0xa9, 0xf0, 0xb3, 0x2b, 0xb9, 0x65, 0x00, 0x9f, 0x75, - 0x4e, 0xcc, 0xe4, 0x10, 0x57, 0x8d, 0x96, 0x9f, 0xf6, 0x52, 0x72, 0x46, 0xaa, 0x16, 0x8d, 0xf4, - 0xad, 0x02, 0x0b, 0x8f, 0x70, 0xb4, 0xbb, 0xbd, 0xf3, 0x58, 0x34, 0x5a, 0xe9, 0x6f, 0xde, 0xc0, - 0x52, 0xb7, 0x61, 0xde, 0xc7, 0x38, 0x30, 0xcf, 0x88, 0xd0, 0xa1, 0xe4, 0xac, 0xa5, 0x53, 0xa6, - 0x7b, 0xb5, 0x54, 0xf7, 0x77, 0xa1, 0x5b, 0x10, 0x87, 0xee, 0x13, 0x3e, 0x32, 0xb3, 0xfa, 0x13, - 0xc2, 0x14, 0xa0, 0xbf, 0x03, 0x9d, 0x01, 0x8e, 0xbe, 0xdc, 0xdc, 0x93, 0x2e, 0x91, 0xf2, 0x8d, - 0x46, 0x39, 0x73, 0xeb, 0xbe, 0x03, 0x9d, 0x3d, 0xd1, 0xa9, 0xde, 0x65, 0x3d, 0xdf, 0x4b, 0x50, - 0xcf, 0xed, 0x74, 0x31, 0xd2, 0xb7, 0x60, 0x3e, 0x01, 0x26, 0x99, 0xe1, 0x12, 0xd4, 0xbd, 0xa3, - 0xa3, 0x10, 0x27, 0xf7, 0x43, 0x31, 0x92, 0x58, 0x54, 0x72, 0x2c, 0x3e, 0x81, 0x6e, 0xc2, 0xe2, - 0x4b, 0x7f, 0xec, 0x59, 0x0e, 0x75, 0xa6, 0x6f, 0x4d, 0xe9, 0x67, 0xd2, 0x2f, 0x11, 0x43, 0x56, - 0x16, 0x5a, 0xe1, 0x48, 0xd8, 0x90, 0x7d, 0xeb, 0x6b, 0xd0, 0x1c, 0xe0, 0xf1, 0xd1, 0x01, 0x5d, - 0x3b, 0xf7, 0x4b, 0x45, 0xfa, 0xa5, 0x7e, 0x17, 0x16, 0x76, 0xf0, 0x61, 0x3c, 0x7c, 0x4a, 0xdc, - 0xe3, 0x1d, 0x6c, 0xf3, 0x97, 0x83, 0x45, 0xa8, 0x4f, 0x71, 0x68, 0xba, 0x1e, 0x5b, 0xa7, 0x69, - 0xcc, 0x4d, 0x71, 0xf8, 0xdc, 0xd3, 0x2f, 0x48, 0xd8, 0x47, 0x38, 0x1a, 0x44, 0x56, 0x84, 0xf5, - 0xbf, 0x54, 0x68, 0xc5, 0x2b, 0xa8, 0x8c, 0xc4, 0x34, 0xb2, 0xa6, 0x5e, 0x1c, 0x25, 0x35, 0x3f, - 0x1f, 0x25, 0xbd, 0x97, 0x4a, 0xd6, 0x7b, 0xb9, 0x04, 0xf5, 0x09, 0xeb, 0x8a, 0x0a, 0xa7, 0x8a, - 0x51, 0xae, 0xc5, 0x53, 0x9b, 0xd1, 0xe2, 0x99, 0x9b, 0xd5, 0xe2, 0x99, 0x79, 0xdb, 0xae, 0x9f, - 0x73, 0xdb, 0x5e, 0x06, 0x08, 0x70, 0x88, 0x23, 0x76, 0x13, 0x66, 0xe7, 0x45, 0xcb, 0x68, 0x31, - 0x0a, 0xbd, 0x74, 0xd2, 0xaa, 0x8b, 0x4f, 0x27, 0x3d, 0x81, 0x26, 0xd3, 0x4c, 0x65, 0xc4, 0xa4, - 0x8f, 0xfa, 0x16, 0x68, 0x81, 0xe8, 0x0b, 0x98, 0x47, 0xd6, 0x31, 0xbf, 0x55, 0x8b, 0xb7, 0x20, - 0x94, 0xcc, 0xec, 0x59, 0xc7, 0xec, 0x5a, 0xad, 0xdd, 0x85, 0x85, 0x14, 0xcd, 0x9a, 0x07, 0xbe, - 0x17, 0xb2, 0x7b, 0x72, 0xc7, 0x98, 0x4f, 0x26, 0x28, 0x70, 0xdf, 0x0b, 0xf5, 0x79, 0xe8, 0x48, - 0x36, 0xf6, 0x7c, 0x7d, 0x1f, 0xd4, 0x94, 0xf0, 0xd4, 0x1b, 0xb2, 0x0b, 0x3e, 0x3e, 0xc1, 0xe3, - 0xe4, 0x35, 0x81, 0x0d, 0xa8, 0x79, 0x0f, 0x63, 0xfb, 0x18, 0x47, 0xc2, 0xe6, 0x62, 0xc4, 0x6e, - 0xf3, 0xf8, 0x34, 0x12, 0x46, 0x67, 0xdf, 0xfa, 0x23, 0xb8, 0x90, 0x72, 0x7c, 0x86, 0x27, 0x5e, - 0x30, 0x35, 0x30, 0x8f, 0x39, 0x39, 0x81, 0x74, 0xb2, 0x04, 0x32, 0x2b, 0x6e, 0x37, 0x60, 0xbe, - 0xc0, 0x88, 0xb9, 0x99, 0x7d, 0x25, 0x01, 0xc1, 0x47, 0xfa, 0x7f, 0xc0, 0xc5, 0x02, 0xf4, 0xab, - 0x80, 0x44, 0xf8, 0xfc, 0x45, 0x05, 0xa7, 0x8a, 0xcc, 0x49, 0xbc, 0xa6, 0x84, 0x23, 0x71, 0x5b, - 0xe4, 0x03, 0xfd, 0x6d, 0x49, 0xa7, 0x3d, 0x4a, 0x49, 0x37, 0x6d, 0x88, 0xed, 0xc8, 0x4b, 0x76, - 0xb8, 0x18, 0xdd, 0xfd, 0x71, 0x11, 0xda, 0xe2, 0x1c, 0x61, 0x75, 0xd8, 0x0a, 0x5c, 0x92, 0x86, - 0x66, 0xf6, 0x60, 0x8a, 0xfe, 0x69, 0xa9, 0xf6, 0xed, 0x1f, 0x7a, 0x8a, 0xb6, 0x94, 0x5e, 0x9e, - 0x19, 0x62, 0x9f, 0xb8, 0x43, 0xa4, 0x88, 0xb9, 0x65, 0xb8, 0x20, 0xcf, 0x89, 0x57, 0x10, 0x54, - 0x59, 0xaa, 0x7d, 0x57, 0x32, 0x2d, 0xde, 0x39, 0x50, 0x55, 0x4c, 0xdf, 0x80, 0x45, 0x79, 0x3a, - 0x7d, 0x14, 0x42, 0x35, 0xc1, 0xbe, 0x20, 0x5c, 0xd6, 0x2e, 0x45, 0x73, 0x02, 0x71, 0x07, 0xae, - 0xe4, 0x56, 0x90, 0x13, 0x17, 0xaa, 0x2f, 0x35, 0x29, 0xe8, 0x8f, 0x14, 0xb8, 0x0e, 0x4b, 0x65, - 0x40, 0x9e, 0x75, 0x50, 0x43, 0x42, 0x6e, 0xc0, 0xd5, 0x32, 0xa4, 0x48, 0x71, 0xa8, 0xb9, 0xd4, - 0xfc, 0x2e, 0x81, 0x16, 0xe4, 0xcb, 0x5e, 0x23, 0x50, 0xab, 0xdc, 0x40, 0xc9, 0x34, 0x08, 0x0b, - 0xe8, 0xd0, 0x2b, 0x30, 0x48, 0x8f, 0x05, 0xd4, 0x16, 0x2c, 0x0a, 0x56, 0xca, 0x00, 0xaa, 0x60, - 0x52, 0x90, 0x22, 0xeb, 0x22, 0xa3, 0x8e, 0x60, 0x71, 0x13, 0x2e, 0xcb, 0x08, 0xa9, 0xa7, 0x8a, - 0xba, 0x02, 0x72, 0x0d, 0xb4, 0x9c, 0x27, 0x59, 0xf1, 0x8b, 0xe6, 0xc5, 0xec, 0x5a, 0x5e, 0x4e, - 0xf9, 0xc2, 0x83, 0xd0, 0x52, 0x9d, 0x62, 0x9a, 0x8a, 0x76, 0x1d, 0x2e, 0xe6, 0x2c, 0x27, 0x9e, - 0xd7, 0xd1, 0x82, 0x10, 0xf4, 0x36, 0x5c, 0x2b, 0x44, 0x52, 0xee, 0x31, 0x09, 0x69, 0x29, 0xae, - 0x57, 0x8a, 0xdb, 0xb2, 0x8f, 0xd1, 0x05, 0xee, 0xa9, 0xdf, 0x95, 0xc8, 0xcc, 0x1f, 0x97, 0xd0, - 0xc5, 0x72, 0xbb, 0xa5, 0xe5, 0x2b, 0x5a, 0x14, 0xcb, 0x5c, 0x85, 0x85, 0x3c, 0x80, 0xf2, 0xbf, - 0x94, 0x6a, 0x9c, 0x8b, 0x97, 0x7c, 0xcf, 0x00, 0x5d, 0x16, 0xa8, 0x82, 0xff, 0xe4, 0x57, 0x59, - 0xd4, 0x13, 0x98, 0xd5, 0x7c, 0x88, 0xe6, 0x1e, 0x6a, 0xd1, 0x95, 0x72, 0x50, 0xee, 0x11, 0x0f, - 0x2d, 0x09, 0x81, 0x57, 0xf3, 0x1a, 0xa5, 0x4f, 0x77, 0xe8, 0xaa, 0x64, 0x94, 0x42, 0x34, 0x64, - 0xaf, 0xb1, 0xe8, 0x5a, 0xf9, 0xae, 0xca, 0x1e, 0x49, 0xd0, 0x72, 0x79, 0xd4, 0x26, 0xd3, 0xd7, - 0xd3, 0xa8, 0xcd, 0xf9, 0x39, 0x39, 0x81, 0xd1, 0x8a, 0xb4, 0x8b, 0x0a, 0x96, 0x91, 0xdb, 0xd2, - 0x48, 0x2f, 0xb7, 0x71, 0xbe, 0x55, 0x8d, 0x56, 0xcb, 0xc3, 0x3b, 0x6b, 0x5f, 0xa3, 0xb5, 0xf2, - 0xf0, 0x96, 0xea, 0x7b, 0x74, 0xbb, 0xdc, 0xbe, 0xb9, 0xa2, 0x1d, 0xdd, 0x11, 0xa0, 0x42, 0x7c, - 0x16, 0xcb, 0x6d, 0xb4, 0x2e, 0x24, 0xba, 0x03, 0xcb, 0xb9, 0xf8, 0x2c, 0x3e, 0x65, 0xa2, 0x8d, - 0x14, 0x78, 0xa5, 0x1c, 0x48, 0xa5, 0xbf, 0x2b, 0x39, 0xed, 0x76, 0xc1, 0x12, 0xb9, 0x56, 0x0d, - 0xba, 0x27, 0xed, 0x30, 0x2d, 0x1f, 0xb2, 0x6c, 0xfe, 0xad, 0xa5, 0xfa, 0x77, 0x7c, 0xbe, 0x60, - 0xd1, 0x7c, 0x07, 0x1f, 0xbd, 0x5d, 0x6e, 0x2f, 0xa9, 0x15, 0x8d, 0xfa, 0xe5, 0x99, 0x5b, 0x34, - 0xa5, 0xd1, 0xfd, 0x72, 0x4b, 0x15, 0x9b, 0x50, 0xe8, 0x9d, 0x74, 0x27, 0x17, 0x3c, 0x2c, 0x77, - 0x0d, 0xd1, 0xbb, 0xa9, 0x5e, 0xeb, 0x79, 0x7e, 0xc5, 0xae, 0x25, 0xda, 0x4c, 0x35, 0x2c, 0x70, - 0xcc, 0xf7, 0x21, 0xd1, 0x7b, 0xb3, 0x38, 0x16, 0x9b, 0x87, 0xe8, 0xfd, 0x94, 0xa3, 0x5e, 0xcc, - 0x6d, 0xd9, 0xbd, 0x08, 0x7d, 0x50, 0x1e, 0xa9, 0xf9, 0x0b, 0x08, 0xfa, 0x50, 0x68, 0x5b, 0xb0, - 0xab, 0xf4, 0xef, 0x46, 0xe8, 0x9f, 0x05, 0xa3, 0x75, 0xb8, 0x9e, 0x53, 0xf4, 0xcc, 0x43, 0x25, - 0xfa, 0x48, 0x20, 0x6f, 0xe5, 0x8f, 0xa1, 0xc2, 0xbb, 0x22, 0xfa, 0x17, 0xb1, 0x66, 0x71, 0x0f, - 0xe5, 0x9a, 0x17, 0xe8, 0x41, 0x7a, 0x4c, 0x2e, 0x97, 0xa1, 0xb2, 0x9c, 0xf8, 0xaf, 0x69, 0x8a, - 0xb9, 0x52, 0x0e, 0xa4, 0xde, 0xff, 0xb7, 0x72, 0x6e, 0x67, 0x2e, 0x49, 0xe8, 0xe3, 0x19, 0x1b, - 0x3c, 0x8f, 0xfa, 0xa4, 0x7c, 0xcd, 0xdc, 0x75, 0x05, 0x7d, 0x2a, 0x58, 0x6d, 0xc0, 0x8d, 0x59, - 0x7a, 0x26, 0x2e, 0xfd, 0x4c, 0x40, 0xef, 0xc1, 0xcd, 0x32, 0x68, 0x7e, 0xcf, 0x6f, 0x09, 0x70, - 0x1f, 0xd6, 0xca, 0xc0, 0x67, 0xf6, 0xfe, 0x43, 0x21, 0xec, 0xbd, 0xbc, 0xee, 0x67, 0xee, 0x15, - 0xc8, 0x59, 0x6a, 0x7e, 0x9f, 0x6c, 0xeb, 0x3b, 0x33, 0xc0, 0xc9, 0xc5, 0x02, 0xe1, 0xa5, 0xda, - 0xf7, 0x25, 0x86, 0xca, 0xdf, 0x35, 0xd0, 0xd1, 0x52, 0xed, 0x87, 0x12, 0x43, 0xe5, 0xaa, 0x65, - 0x34, 0x14, 0xac, 0x0a, 0xe1, 0x2c, 0x57, 0xd0, 0x68, 0x24, 0x18, 0x15, 0x8c, 0x59, 0x52, 0x13, - 0x23, 0x57, 0xb0, 0x2b, 0x84, 0x61, 0x01, 0x8a, 0x3c, 0xc1, 0xf1, 0x2e, 0xac, 0x9c, 0x03, 0x63, - 0x15, 0x2f, 0xf2, 0x05, 0xcb, 0x59, 0xab, 0x67, 0xd5, 0x2b, 0xfa, 0x9a, 0x43, 0x1f, 0xbe, 0x0f, - 0xab, 0xb6, 0x37, 0xe9, 0x87, 0x56, 0xe4, 0x85, 0x23, 0x32, 0xb6, 0x0e, 0xc3, 0x7e, 0x14, 0xe0, - 0x97, 0x5e, 0xd0, 0x1f, 0x93, 0x43, 0xfe, 0x6f, 0x7e, 0x87, 0xf1, 0xd1, 0xc3, 0xce, 0x01, 0x23, - 0x0a, 0xae, 0x7f, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x2a, 0xe4, 0xc0, 0x85, 0x16, 0x28, 0x00, 0x00, -} diff --git a/accounts/usbwallet/internal/trezor/messages.proto b/accounts/usbwallet/internal/trezor/messages.proto deleted file mode 100644 index 8cb9c8cc25ca..000000000000 --- a/accounts/usbwallet/internal/trezor/messages.proto +++ /dev/null @@ -1,905 +0,0 @@ -// This file originates from the SatoshiLabs Trezor `common` repository at: -// https://github.com/trezor/trezor-common/blob/master/protob/messages.proto -// dated 28.07.2017, commit dd8ec3231fb5f7992360aff9bdfe30bb58130f4b. - -syntax = "proto2"; - -/** - * Messages for TREZOR communication - */ - -// Sugar for easier handling in Java -option java_package = "com.satoshilabs.trezor.lib.protobuf"; -option java_outer_classname = "TrezorMessage"; - -import "types.proto"; - -/** - * Mapping between Trezor wire identifier (uint) and a protobuf message - */ -enum MessageType { - MessageType_Initialize = 0 [(wire_in) = true]; - MessageType_Ping = 1 [(wire_in) = true]; - MessageType_Success = 2 [(wire_out) = true]; - MessageType_Failure = 3 [(wire_out) = true]; - MessageType_ChangePin = 4 [(wire_in) = true]; - MessageType_WipeDevice = 5 [(wire_in) = true]; - MessageType_FirmwareErase = 6 [(wire_in) = true, (wire_bootloader) = true]; - MessageType_FirmwareUpload = 7 [(wire_in) = true, (wire_bootloader) = true]; - MessageType_FirmwareRequest = 8 [(wire_out) = true, (wire_bootloader) = true]; - MessageType_GetEntropy = 9 [(wire_in) = true]; - MessageType_Entropy = 10 [(wire_out) = true]; - MessageType_GetPublicKey = 11 [(wire_in) = true]; - MessageType_PublicKey = 12 [(wire_out) = true]; - MessageType_LoadDevice = 13 [(wire_in) = true]; - MessageType_ResetDevice = 14 [(wire_in) = true]; - MessageType_SignTx = 15 [(wire_in) = true]; - MessageType_SimpleSignTx = 16 [(wire_in) = true, deprecated = true]; - MessageType_Features = 17 [(wire_out) = true]; - MessageType_PinMatrixRequest = 18 [(wire_out) = true]; - MessageType_PinMatrixAck = 19 [(wire_in) = true, (wire_tiny) = true]; - MessageType_Cancel = 20 [(wire_in) = true]; - MessageType_TxRequest = 21 [(wire_out) = true]; - MessageType_TxAck = 22 [(wire_in) = true]; - MessageType_CipherKeyValue = 23 [(wire_in) = true]; - MessageType_ClearSession = 24 [(wire_in) = true]; - MessageType_ApplySettings = 25 [(wire_in) = true]; - MessageType_ButtonRequest = 26 [(wire_out) = true]; - MessageType_ButtonAck = 27 [(wire_in) = true, (wire_tiny) = true]; - MessageType_ApplyFlags = 28 [(wire_in) = true]; - MessageType_GetAddress = 29 [(wire_in) = true]; - MessageType_Address = 30 [(wire_out) = true]; - MessageType_SelfTest = 32 [(wire_in) = true, (wire_bootloader) = true]; - MessageType_BackupDevice = 34 [(wire_in) = true]; - MessageType_EntropyRequest = 35 [(wire_out) = true]; - MessageType_EntropyAck = 36 [(wire_in) = true]; - MessageType_SignMessage = 38 [(wire_in) = true]; - MessageType_VerifyMessage = 39 [(wire_in) = true]; - MessageType_MessageSignature = 40 [(wire_out) = true]; - MessageType_PassphraseRequest = 41 [(wire_out) = true]; - MessageType_PassphraseAck = 42 [(wire_in) = true, (wire_tiny) = true]; - MessageType_EstimateTxSize = 43 [(wire_in) = true, deprecated = true]; - MessageType_TxSize = 44 [(wire_out) = true, deprecated = true]; - MessageType_RecoveryDevice = 45 [(wire_in) = true]; - MessageType_WordRequest = 46 [(wire_out) = true]; - MessageType_WordAck = 47 [(wire_in) = true]; - MessageType_CipheredKeyValue = 48 [(wire_out) = true]; - MessageType_EncryptMessage = 49 [(wire_in) = true, deprecated = true]; - MessageType_EncryptedMessage = 50 [(wire_out) = true, deprecated = true]; - MessageType_DecryptMessage = 51 [(wire_in) = true, deprecated = true]; - MessageType_DecryptedMessage = 52 [(wire_out) = true, deprecated = true]; - MessageType_SignIdentity = 53 [(wire_in) = true]; - MessageType_SignedIdentity = 54 [(wire_out) = true]; - MessageType_GetFeatures = 55 [(wire_in) = true]; - MessageType_EthereumGetAddress = 56 [(wire_in) = true]; - MessageType_EthereumAddress = 57 [(wire_out) = true]; - MessageType_EthereumSignTx = 58 [(wire_in) = true]; - MessageType_EthereumTxRequest = 59 [(wire_out) = true]; - MessageType_EthereumTxAck = 60 [(wire_in) = true]; - MessageType_GetECDHSessionKey = 61 [(wire_in) = true]; - MessageType_ECDHSessionKey = 62 [(wire_out) = true]; - MessageType_SetU2FCounter = 63 [(wire_in) = true]; - MessageType_EthereumSignMessage = 64 [(wire_in) = true]; - MessageType_EthereumVerifyMessage = 65 [(wire_in) = true]; - MessageType_EthereumMessageSignature = 66 [(wire_out) = true]; - MessageType_DebugLinkDecision = 100 [(wire_debug_in) = true, (wire_tiny) = true]; - MessageType_DebugLinkGetState = 101 [(wire_debug_in) = true]; - MessageType_DebugLinkState = 102 [(wire_debug_out) = true]; - MessageType_DebugLinkStop = 103 [(wire_debug_in) = true]; - MessageType_DebugLinkLog = 104 [(wire_debug_out) = true]; - MessageType_DebugLinkMemoryRead = 110 [(wire_debug_in) = true]; - MessageType_DebugLinkMemory = 111 [(wire_debug_out) = true]; - MessageType_DebugLinkMemoryWrite = 112 [(wire_debug_in) = true]; - MessageType_DebugLinkFlashErase = 113 [(wire_debug_in) = true]; -} - -//////////////////// -// Basic messages // -//////////////////// - -/** - * Request: Reset device to default state and ask for device details - * @next Features - */ -message Initialize { -} - -/** - * Request: Ask for device details (no device reset) - * @next Features - */ -message GetFeatures { -} - -/** - * Response: Reports various information about the device - * @prev Initialize - * @prev GetFeatures - */ -message Features { - optional string vendor = 1; // name of the manufacturer, e.g. "bitcointrezor.com" - optional uint32 major_version = 2; // major version of the device, e.g. 1 - optional uint32 minor_version = 3; // minor version of the device, e.g. 0 - optional uint32 patch_version = 4; // patch version of the device, e.g. 0 - optional bool bootloader_mode = 5; // is device in bootloader mode? - optional string device_id = 6; // device's unique identifier - optional bool pin_protection = 7; // is device protected by PIN? - optional bool passphrase_protection = 8; // is node/mnemonic encrypted using passphrase? - optional string language = 9; // device language - optional string label = 10; // device description label - repeated CoinType coins = 11; // supported coins - optional bool initialized = 12; // does device contain seed? - optional bytes revision = 13; // SCM revision of firmware - optional bytes bootloader_hash = 14; // hash of the bootloader - optional bool imported = 15; // was storage imported from an external source? - optional bool pin_cached = 16; // is PIN already cached in session? - optional bool passphrase_cached = 17; // is passphrase already cached in session? - optional bool firmware_present = 18; // is valid firmware loaded? - optional bool needs_backup = 19; // does storage need backup? (equals to Storage.needs_backup) - optional uint32 flags = 20; // device flags (equals to Storage.flags) -} - -/** - * Request: clear session (removes cached PIN, passphrase, etc). - * @next Success - */ -message ClearSession { -} - -/** - * Request: change language and/or label of the device - * @next Success - * @next Failure - * @next ButtonRequest - * @next PinMatrixRequest - */ -message ApplySettings { - optional string language = 1; - optional string label = 2; - optional bool use_passphrase = 3; - optional bytes homescreen = 4; -} - -/** - * Request: set flags of the device - * @next Success - * @next Failure - */ -message ApplyFlags { - optional uint32 flags = 1; // bitmask, can only set bits, not unset -} - -/** - * Request: Starts workflow for setting/changing/removing the PIN - * @next ButtonRequest - * @next PinMatrixRequest - */ -message ChangePin { - optional bool remove = 1; // is PIN removal requested? -} - -/** - * Request: Test if the device is alive, device sends back the message in Success response - * @next Success - */ -message Ping { - optional string message = 1; // message to send back in Success message - optional bool button_protection = 2; // ask for button press - optional bool pin_protection = 3; // ask for PIN if set in device - optional bool passphrase_protection = 4; // ask for passphrase if set in device -} - -/** - * Response: Success of the previous request - */ -message Success { - optional string message = 1; // human readable description of action or request-specific payload -} - -/** - * Response: Failure of the previous request - */ -message Failure { - optional FailureType code = 1; // computer-readable definition of the error state - optional string message = 2; // human-readable message of the error state -} - -/** - * Response: Device is waiting for HW button press. - * @next ButtonAck - * @next Cancel - */ -message ButtonRequest { - optional ButtonRequestType code = 1; - optional string data = 2; -} - -/** - * Request: Computer agrees to wait for HW button press - * @prev ButtonRequest - */ -message ButtonAck { -} - -/** - * Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme - * @next PinMatrixAck - * @next Cancel - */ -message PinMatrixRequest { - optional PinMatrixRequestType type = 1; -} - -/** - * Request: Computer responds with encoded PIN - * @prev PinMatrixRequest - */ -message PinMatrixAck { - required string pin = 1; // matrix encoded PIN entered by user -} - -/** - * Request: Abort last operation that required user interaction - * @prev ButtonRequest - * @prev PinMatrixRequest - * @prev PassphraseRequest - */ -message Cancel { -} - -/** - * Response: Device awaits encryption passphrase - * @next PassphraseAck - * @next Cancel - */ -message PassphraseRequest { -} - -/** - * Request: Send passphrase back - * @prev PassphraseRequest - */ -message PassphraseAck { - required string passphrase = 1; -} - -/** - * Request: Request a sample of random data generated by hardware RNG. May be used for testing. - * @next ButtonRequest - * @next Entropy - * @next Failure - */ -message GetEntropy { - required uint32 size = 1; // size of requested entropy -} - -/** - * Response: Reply with random data generated by internal RNG - * @prev GetEntropy - */ -message Entropy { - required bytes entropy = 1; // stream of random generated bytes -} - -/** - * Request: Ask device for public key corresponding to address_n path - * @next PassphraseRequest - * @next PublicKey - * @next Failure - */ -message GetPublicKey { - repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node - optional string ecdsa_curve_name = 2; // ECDSA curve name to use - optional bool show_display = 3; // optionally show on display before sending the result - optional string coin_name = 4 [default='Bitcoin']; -} - -/** - * Response: Contains public key derived from device private seed - * @prev GetPublicKey - */ -message PublicKey { - required HDNodeType node = 1; // BIP32 public node - optional string xpub = 2; // serialized form of public node -} - -/** - * Request: Ask device for address corresponding to address_n path - * @next PassphraseRequest - * @next Address - * @next Failure - */ -message GetAddress { - repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node - optional string coin_name = 2 [default='Bitcoin']; - optional bool show_display = 3 ; // optionally show on display before sending the result - optional MultisigRedeemScriptType multisig = 4; // filled if we are showing a multisig address - optional InputScriptType script_type = 5 [default=SPENDADDRESS]; // used to distinguish between various address formats (non-segwit, segwit, etc.) -} - -/** - * Request: Ask device for Ethereum address corresponding to address_n path - * @next PassphraseRequest - * @next EthereumAddress - * @next Failure - */ -message EthereumGetAddress { - repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node - optional bool show_display = 2; // optionally show on display before sending the result -} - -/** - * Response: Contains address derived from device private seed - * @prev GetAddress - */ -message Address { - required string address = 1; // Coin address in Base58 encoding -} - -/** - * Response: Contains an Ethereum address derived from device private seed - * @prev EthereumGetAddress - */ -message EthereumAddress { - required bytes address = 1; // Coin address as an Ethereum 160 bit hash -} - -/** - * Request: Request device to wipe all sensitive data and settings - * @next ButtonRequest - */ -message WipeDevice { -} - -/** - * Request: Load seed and related internal settings from the computer - * @next ButtonRequest - * @next Success - * @next Failure - */ -message LoadDevice { - optional string mnemonic = 1; // seed encoded as BIP-39 mnemonic (12, 18 or 24 words) - optional HDNodeType node = 2; // BIP-32 node - optional string pin = 3; // set PIN protection - optional bool passphrase_protection = 4; // enable master node encryption using passphrase - optional string language = 5 [default='english']; // device language - optional string label = 6; // device label - optional bool skip_checksum = 7; // do not test mnemonic for valid BIP-39 checksum - optional uint32 u2f_counter = 8; // U2F counter -} - -/** - * Request: Ask device to do initialization involving user interaction - * @next EntropyRequest - * @next Failure - */ -message ResetDevice { - optional bool display_random = 1; // display entropy generated by the device before asking for additional entropy - optional uint32 strength = 2 [default=256]; // strength of seed in bits - optional bool passphrase_protection = 3; // enable master node encryption using passphrase - optional bool pin_protection = 4; // enable PIN protection - optional string language = 5 [default='english']; // device language - optional string label = 6; // device label - optional uint32 u2f_counter = 7; // U2F counter - optional bool skip_backup = 8; // postpone seed backup to BackupDevice workflow -} - -/** - * Request: Perform backup of the device seed if not backed up using ResetDevice - * @next ButtonRequest - */ -message BackupDevice { -} - -/** - * Response: Ask for additional entropy from host computer - * @prev ResetDevice - * @next EntropyAck - */ -message EntropyRequest { -} - -/** - * Request: Provide additional entropy for seed generation function - * @prev EntropyRequest - * @next ButtonRequest - */ -message EntropyAck { - optional bytes entropy = 1; // 256 bits (32 bytes) of random data -} - -/** - * Request: Start recovery workflow asking user for specific words of mnemonic - * Used to recovery device safely even on untrusted computer. - * @next WordRequest - */ -message RecoveryDevice { - optional uint32 word_count = 1; // number of words in BIP-39 mnemonic - optional bool passphrase_protection = 2; // enable master node encryption using passphrase - optional bool pin_protection = 3; // enable PIN protection - optional string language = 4 [default='english']; // device language - optional string label = 5; // device label - optional bool enforce_wordlist = 6; // enforce BIP-39 wordlist during the process - // 7 reserved for unused recovery method - optional uint32 type = 8; // supported recovery type (see RecoveryType) - optional uint32 u2f_counter = 9; // U2F counter - optional bool dry_run = 10; // perform dry-run recovery workflow (for safe mnemonic validation) -} - -/** - * Response: Device is waiting for user to enter word of the mnemonic - * Its position is shown only on device's internal display. - * @prev RecoveryDevice - * @prev WordAck - */ -message WordRequest { - optional WordRequestType type = 1; -} - -/** - * Request: Computer replies with word from the mnemonic - * @prev WordRequest - * @next WordRequest - * @next Success - * @next Failure - */ -message WordAck { - required string word = 1; // one word of mnemonic on asked position -} - -////////////////////////////// -// Message signing messages // -////////////////////////////// - -/** - * Request: Ask device to sign message - * @next MessageSignature - * @next Failure - */ -message SignMessage { - repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node - required bytes message = 2; // message to be signed - optional string coin_name = 3 [default='Bitcoin']; // coin to use for signing - optional InputScriptType script_type = 4 [default=SPENDADDRESS]; // used to distinguish between various address formats (non-segwit, segwit, etc.) -} - -/** - * Request: Ask device to verify message - * @next Success - * @next Failure - */ -message VerifyMessage { - optional string address = 1; // address to verify - optional bytes signature = 2; // signature to verify - optional bytes message = 3; // message to verify - optional string coin_name = 4 [default='Bitcoin']; // coin to use for verifying -} - -/** - * Response: Signed message - * @prev SignMessage - */ -message MessageSignature { - optional string address = 1; // address used to sign the message - optional bytes signature = 2; // signature of the message -} - -/////////////////////////// -// Encryption/decryption // -/////////////////////////// - -/** - * Request: Ask device to encrypt message - * @next EncryptedMessage - * @next Failure - */ -message EncryptMessage { - optional bytes pubkey = 1; // public key - optional bytes message = 2; // message to encrypt - optional bool display_only = 3; // show just on display? (don't send back via wire) - repeated uint32 address_n = 4; // BIP-32 path to derive the signing key from master node - optional string coin_name = 5 [default='Bitcoin']; // coin to use for signing -} - -/** - * Response: Encrypted message - * @prev EncryptMessage - */ -message EncryptedMessage { - optional bytes nonce = 1; // nonce used during encryption - optional bytes message = 2; // encrypted message - optional bytes hmac = 3; // message hmac -} - -/** - * Request: Ask device to decrypt message - * @next Success - * @next Failure - */ -message DecryptMessage { - repeated uint32 address_n = 1; // BIP-32 path to derive the decryption key from master node - optional bytes nonce = 2; // nonce used during encryption - optional bytes message = 3; // message to decrypt - optional bytes hmac = 4; // message hmac -} - -/** - * Response: Decrypted message - * @prev DecryptedMessage - */ -message DecryptedMessage { - optional bytes message = 1; // decrypted message - optional string address = 2; // address used to sign the message (if used) -} - -/** - * Request: Ask device to encrypt or decrypt value of given key - * @next CipheredKeyValue - * @next Failure - */ -message CipherKeyValue { - repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node - optional string key = 2; // key component of key:value - optional bytes value = 3; // value component of key:value - optional bool encrypt = 4; // are we encrypting (True) or decrypting (False)? - optional bool ask_on_encrypt = 5; // should we ask on encrypt operation? - optional bool ask_on_decrypt = 6; // should we ask on decrypt operation? - optional bytes iv = 7; // initialization vector (will be computed if not set) -} - -/** - * Response: Return ciphered/deciphered value - * @prev CipherKeyValue - */ -message CipheredKeyValue { - optional bytes value = 1; // ciphered/deciphered value -} - -////////////////////////////////// -// Transaction signing messages // -////////////////////////////////// - -/** - * Request: Estimated size of the transaction - * This behaves exactly like SignTx, which means that it can ask using TxRequest - * This call is non-blocking (except possible PassphraseRequest to unlock the seed) - * @next TxSize - * @next Failure - */ -message EstimateTxSize { - required uint32 outputs_count = 1; // number of transaction outputs - required uint32 inputs_count = 2; // number of transaction inputs - optional string coin_name = 3 [default='Bitcoin']; // coin to use -} - -/** - * Response: Estimated size of the transaction - * @prev EstimateTxSize - */ -message TxSize { - optional uint32 tx_size = 1; // estimated size of transaction in bytes -} - -/** - * Request: Ask device to sign transaction - * @next PassphraseRequest - * @next PinMatrixRequest - * @next TxRequest - * @next Failure - */ -message SignTx { - required uint32 outputs_count = 1; // number of transaction outputs - required uint32 inputs_count = 2; // number of transaction inputs - optional string coin_name = 3 [default='Bitcoin']; // coin to use - optional uint32 version = 4 [default=1]; // transaction version - optional uint32 lock_time = 5 [default=0]; // transaction lock_time -} - -/** - * Request: Simplified transaction signing - * This method doesn't support streaming, so there are hardware limits in number of inputs and outputs. - * In case of success, the result is returned using TxRequest message. - * @next PassphraseRequest - * @next PinMatrixRequest - * @next TxRequest - * @next Failure - */ -message SimpleSignTx { - repeated TxInputType inputs = 1; // transaction inputs - repeated TxOutputType outputs = 2; // transaction outputs - repeated TransactionType transactions = 3; // transactions whose outputs are used to build current inputs - optional string coin_name = 4 [default='Bitcoin']; // coin to use - optional uint32 version = 5 [default=1]; // transaction version - optional uint32 lock_time = 6 [default=0]; // transaction lock_time -} - -/** - * Response: Device asks for information for signing transaction or returns the last result - * If request_index is set, device awaits TxAck message (with fields filled in according to request_type) - * If signature_index is set, 'signature' contains signed input of signature_index's input - * @prev SignTx - * @prev SimpleSignTx - * @prev TxAck - */ -message TxRequest { - optional RequestType request_type = 1; // what should be filled in TxAck message? - optional TxRequestDetailsType details = 2; // request for tx details - optional TxRequestSerializedType serialized = 3; // serialized data and request for next -} - -/** - * Request: Reported transaction data - * @prev TxRequest - * @next TxRequest - */ -message TxAck { - optional TransactionType tx = 1; -} - -/** - * Request: Ask device to sign transaction - * All fields are optional from the protocol's point of view. Each field defaults to value `0` if missing. - * Note: the first at most 1024 bytes of data MUST be transmitted as part of this message. - * @next PassphraseRequest - * @next PinMatrixRequest - * @next EthereumTxRequest - * @next Failure - */ -message EthereumSignTx { - repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node - optional bytes nonce = 2; // <=256 bit unsigned big endian - optional bytes gas_price = 3; // <=256 bit unsigned big endian (in wei) - optional bytes gas_limit = 4; // <=256 bit unsigned big endian - optional bytes to = 5; // 160 bit address hash - optional bytes value = 6; // <=256 bit unsigned big endian (in wei) - optional bytes data_initial_chunk = 7; // The initial data chunk (<= 1024 bytes) - optional uint32 data_length = 8; // Length of transaction payload - optional uint32 chain_id = 9; // Chain Id for EIP 155 -} - -/** - * Response: Device asks for more data from transaction payload, or returns the signature. - * If data_length is set, device awaits that many more bytes of payload. - * Otherwise, the signature_* fields contain the computed transaction signature. All three fields will be present. - * @prev EthereumSignTx - * @next EthereumTxAck - */ -message EthereumTxRequest { - optional uint32 data_length = 1; // Number of bytes being requested (<= 1024) - optional uint32 signature_v = 2; // Computed signature (recovery parameter, limited to 27 or 28) - optional bytes signature_r = 3; // Computed signature R component (256 bit) - optional bytes signature_s = 4; // Computed signature S component (256 bit) -} - -/** - * Request: Transaction payload data. - * @prev EthereumTxRequest - * @next EthereumTxRequest - */ -message EthereumTxAck { - optional bytes data_chunk = 1; // Bytes from transaction payload (<= 1024 bytes) -} - -//////////////////////////////////////// -// Ethereum: Message signing messages // -//////////////////////////////////////// - -/** - * Request: Ask device to sign message - * @next EthereumMessageSignature - * @next Failure - */ -message EthereumSignMessage { - repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node - required bytes message = 2; // message to be signed -} - -/** - * Request: Ask device to verify message - * @next Success - * @next Failure - */ -message EthereumVerifyMessage { - optional bytes address = 1; // address to verify - optional bytes signature = 2; // signature to verify - optional bytes message = 3; // message to verify -} - -/** - * Response: Signed message - * @prev EthereumSignMessage - */ -message EthereumMessageSignature { - optional bytes address = 1; // address used to sign the message - optional bytes signature = 2; // signature of the message -} - -/////////////////////// -// Identity messages // -/////////////////////// - -/** - * Request: Ask device to sign identity - * @next SignedIdentity - * @next Failure - */ -message SignIdentity { - optional IdentityType identity = 1; // identity - optional bytes challenge_hidden = 2; // non-visible challenge - optional string challenge_visual = 3; // challenge shown on display (e.g. date+time) - optional string ecdsa_curve_name = 4; // ECDSA curve name to use -} - -/** - * Response: Device provides signed identity - * @prev SignIdentity - */ -message SignedIdentity { - optional string address = 1; // identity address - optional bytes public_key = 2; // identity public key - optional bytes signature = 3; // signature of the identity data -} - -/////////////////// -// ECDH messages // -/////////////////// - -/** - * Request: Ask device to generate ECDH session key - * @next ECDHSessionKey - * @next Failure - */ -message GetECDHSessionKey { - optional IdentityType identity = 1; // identity - optional bytes peer_public_key = 2; // peer's public key - optional string ecdsa_curve_name = 3; // ECDSA curve name to use -} - -/** - * Response: Device provides ECDH session key - * @prev GetECDHSessionKey - */ -message ECDHSessionKey { - optional bytes session_key = 1; // ECDH session key -} - -/////////////////// -// U2F messages // -/////////////////// - -/** - * Request: Set U2F counter - * @next Success - */ -message SetU2FCounter { - optional uint32 u2f_counter = 1; // counter -} - -///////////////////////// -// Bootloader messages // -///////////////////////// - -/** - * Request: Ask device to erase its firmware (so it can be replaced via FirmwareUpload) - * @next Success - * @next FirmwareRequest - * @next Failure - */ -message FirmwareErase { - optional uint32 length = 1; // length of new firmware -} - -/** - * Response: Ask for firmware chunk - * @next FirmwareUpload - */ -message FirmwareRequest { - optional uint32 offset = 1; // offset of requested firmware chunk - optional uint32 length = 2; // length of requested firmware chunk -} - -/** - * Request: Send firmware in binary form to the device - * @next Success - * @next Failure - */ -message FirmwareUpload { - required bytes payload = 1; // firmware to be loaded into device - optional bytes hash = 2; // hash of the payload -} - - -/** - * Request: Perform a device self-test - * @next Success - * @next Failure - */ -message SelfTest { - optional bytes payload = 1; // payload to be used in self-test -} - -///////////////////////////////////////////////////////////// -// Debug messages (only available if DebugLink is enabled) // -///////////////////////////////////////////////////////////// - -/** - * Request: "Press" the button on the device - * @next Success - */ -message DebugLinkDecision { - required bool yes_no = 1; // true for "Confirm", false for "Cancel" -} - -/** - * Request: Computer asks for device state - * @next DebugLinkState - */ -message DebugLinkGetState { -} - -/** - * Response: Device current state - * @prev DebugLinkGetState - */ -message DebugLinkState { - optional bytes layout = 1; // raw buffer of display - optional string pin = 2; // current PIN, blank if PIN is not set/enabled - optional string matrix = 3; // current PIN matrix - optional string mnemonic = 4; // current BIP-39 mnemonic - optional HDNodeType node = 5; // current BIP-32 node - optional bool passphrase_protection = 6; // is node/mnemonic encrypted using passphrase? - optional string reset_word = 7; // word on device display during ResetDevice workflow - optional bytes reset_entropy = 8; // current entropy during ResetDevice workflow - optional string recovery_fake_word = 9; // (fake) word on display during RecoveryDevice workflow - optional uint32 recovery_word_pos = 10; // index of mnemonic word the device is expecting during RecoveryDevice workflow -} - -/** - * Request: Ask device to restart - */ -message DebugLinkStop { -} - -/** - * Response: Device wants host to log event - */ -message DebugLinkLog { - optional uint32 level = 1; - optional string bucket = 2; - optional string text = 3; -} - -/** - * Request: Read memory from device - * @next DebugLinkMemory - */ -message DebugLinkMemoryRead { - optional uint32 address = 1; - optional uint32 length = 2; -} - -/** - * Response: Device sends memory back - * @prev DebugLinkMemoryRead - */ -message DebugLinkMemory { - optional bytes memory = 1; -} - -/** - * Request: Write memory to device. - * WARNING: Writing to the wrong location can irreparably break the device. - */ -message DebugLinkMemoryWrite { - optional uint32 address = 1; - optional bytes memory = 2; - optional bool flash = 3; -} - -/** - * Request: Erase block of flash on device - * WARNING: Writing to the wrong location can irreparably break the device. - */ -message DebugLinkFlashErase { - optional uint32 sector = 1; -} diff --git a/accounts/usbwallet/internal/trezor/trezor.go b/accounts/usbwallet/internal/trezor/trezor.go deleted file mode 100644 index 80cc75efc420..000000000000 --- a/accounts/usbwallet/internal/trezor/trezor.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// This file contains the implementation for interacting with the Trezor hardware -// wallets. The wire protocol spec can be found on the SatoshiLabs website: -// https://doc.satoshilabs.com/trezor-tech/api-protobuf.html - -//go:generate protoc --go_out=import_path=trezor:. types.proto messages.proto - -// Package trezor contains the wire protocol wrapper in Go. -package trezor - -import ( - "reflect" - - "github.com/golang/protobuf/proto" -) - -// Type returns the protocol buffer type number of a specific message. If the -// message is nil, this method panics! -func Type(msg proto.Message) uint16 { - return uint16(MessageType_value["MessageType_"+reflect.TypeOf(msg).Elem().Name()]) -} - -// Name returns the friendly message type name of a specific protocol buffer -// type number. -func Name(kind uint16) string { - name := MessageType_name[int32(kind)] - if len(name) < 12 { - return name - } - return name[12:] -} diff --git a/accounts/usbwallet/internal/trezor/types.pb.go b/accounts/usbwallet/internal/trezor/types.pb.go deleted file mode 100644 index 25b7672d231c..000000000000 --- a/accounts/usbwallet/internal/trezor/types.pb.go +++ /dev/null @@ -1,1333 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: types.proto - -/* -Package trezor is a generated protocol buffer package. - -It is generated from these files: - types.proto - messages.proto - -It has these top-level messages: - HDNodeType - HDNodePathType - CoinType - MultisigRedeemScriptType - TxInputType - TxOutputType - TxOutputBinType - TransactionType - TxRequestDetailsType - TxRequestSerializedType - IdentityType - Initialize - GetFeatures - Features - ClearSession - ApplySettings - ApplyFlags - ChangePin - Ping - Success - Failure - ButtonRequest - ButtonAck - PinMatrixRequest - PinMatrixAck - Cancel - PassphraseRequest - PassphraseAck - GetEntropy - Entropy - GetPublicKey - PublicKey - GetAddress - EthereumGetAddress - Address - EthereumAddress - WipeDevice - LoadDevice - ResetDevice - BackupDevice - EntropyRequest - EntropyAck - RecoveryDevice - WordRequest - WordAck - SignMessage - VerifyMessage - MessageSignature - EncryptMessage - EncryptedMessage - DecryptMessage - DecryptedMessage - CipherKeyValue - CipheredKeyValue - EstimateTxSize - TxSize - SignTx - SimpleSignTx - TxRequest - TxAck - EthereumSignTx - EthereumTxRequest - EthereumTxAck - EthereumSignMessage - EthereumVerifyMessage - EthereumMessageSignature - SignIdentity - SignedIdentity - GetECDHSessionKey - ECDHSessionKey - SetU2FCounter - FirmwareErase - FirmwareRequest - FirmwareUpload - SelfTest - DebugLinkDecision - DebugLinkGetState - DebugLinkState - DebugLinkStop - DebugLinkLog - DebugLinkMemoryRead - DebugLinkMemory - DebugLinkMemoryWrite - DebugLinkFlashErase -*/ -package trezor - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -// * -// Type of failures returned by Failure message -// @used_in Failure -type FailureType int32 - -const ( - FailureType_Failure_UnexpectedMessage FailureType = 1 - FailureType_Failure_ButtonExpected FailureType = 2 - FailureType_Failure_DataError FailureType = 3 - FailureType_Failure_ActionCancelled FailureType = 4 - FailureType_Failure_PinExpected FailureType = 5 - FailureType_Failure_PinCancelled FailureType = 6 - FailureType_Failure_PinInvalid FailureType = 7 - FailureType_Failure_InvalidSignature FailureType = 8 - FailureType_Failure_ProcessError FailureType = 9 - FailureType_Failure_NotEnoughFunds FailureType = 10 - FailureType_Failure_NotInitialized FailureType = 11 - FailureType_Failure_FirmwareError FailureType = 99 -) - -var FailureType_name = map[int32]string{ - 1: "Failure_UnexpectedMessage", - 2: "Failure_ButtonExpected", - 3: "Failure_DataError", - 4: "Failure_ActionCancelled", - 5: "Failure_PinExpected", - 6: "Failure_PinCancelled", - 7: "Failure_PinInvalid", - 8: "Failure_InvalidSignature", - 9: "Failure_ProcessError", - 10: "Failure_NotEnoughFunds", - 11: "Failure_NotInitialized", - 99: "Failure_FirmwareError", -} -var FailureType_value = map[string]int32{ - "Failure_UnexpectedMessage": 1, - "Failure_ButtonExpected": 2, - "Failure_DataError": 3, - "Failure_ActionCancelled": 4, - "Failure_PinExpected": 5, - "Failure_PinCancelled": 6, - "Failure_PinInvalid": 7, - "Failure_InvalidSignature": 8, - "Failure_ProcessError": 9, - "Failure_NotEnoughFunds": 10, - "Failure_NotInitialized": 11, - "Failure_FirmwareError": 99, -} - -func (x FailureType) Enum() *FailureType { - p := new(FailureType) - *p = x - return p -} -func (x FailureType) String() string { - return proto.EnumName(FailureType_name, int32(x)) -} -func (x *FailureType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FailureType_value, data, "FailureType") - if err != nil { - return err - } - *x = FailureType(value) - return nil -} -func (FailureType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -// * -// Type of script which will be used for transaction output -// @used_in TxOutputType -type OutputScriptType int32 - -const ( - OutputScriptType_PAYTOADDRESS OutputScriptType = 0 - OutputScriptType_PAYTOSCRIPTHASH OutputScriptType = 1 - OutputScriptType_PAYTOMULTISIG OutputScriptType = 2 - OutputScriptType_PAYTOOPRETURN OutputScriptType = 3 - OutputScriptType_PAYTOWITNESS OutputScriptType = 4 - OutputScriptType_PAYTOP2SHWITNESS OutputScriptType = 5 -) - -var OutputScriptType_name = map[int32]string{ - 0: "PAYTOADDRESS", - 1: "PAYTOSCRIPTHASH", - 2: "PAYTOMULTISIG", - 3: "PAYTOOPRETURN", - 4: "PAYTOWITNESS", - 5: "PAYTOP2SHWITNESS", -} -var OutputScriptType_value = map[string]int32{ - "PAYTOADDRESS": 0, - "PAYTOSCRIPTHASH": 1, - "PAYTOMULTISIG": 2, - "PAYTOOPRETURN": 3, - "PAYTOWITNESS": 4, - "PAYTOP2SHWITNESS": 5, -} - -func (x OutputScriptType) Enum() *OutputScriptType { - p := new(OutputScriptType) - *p = x - return p -} -func (x OutputScriptType) String() string { - return proto.EnumName(OutputScriptType_name, int32(x)) -} -func (x *OutputScriptType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(OutputScriptType_value, data, "OutputScriptType") - if err != nil { - return err - } - *x = OutputScriptType(value) - return nil -} -func (OutputScriptType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -// * -// Type of script which will be used for transaction output -// @used_in TxInputType -type InputScriptType int32 - -const ( - InputScriptType_SPENDADDRESS InputScriptType = 0 - InputScriptType_SPENDMULTISIG InputScriptType = 1 - InputScriptType_EXTERNAL InputScriptType = 2 - InputScriptType_SPENDWITNESS InputScriptType = 3 - InputScriptType_SPENDP2SHWITNESS InputScriptType = 4 -) - -var InputScriptType_name = map[int32]string{ - 0: "SPENDADDRESS", - 1: "SPENDMULTISIG", - 2: "EXTERNAL", - 3: "SPENDWITNESS", - 4: "SPENDP2SHWITNESS", -} -var InputScriptType_value = map[string]int32{ - "SPENDADDRESS": 0, - "SPENDMULTISIG": 1, - "EXTERNAL": 2, - "SPENDWITNESS": 3, - "SPENDP2SHWITNESS": 4, -} - -func (x InputScriptType) Enum() *InputScriptType { - p := new(InputScriptType) - *p = x - return p -} -func (x InputScriptType) String() string { - return proto.EnumName(InputScriptType_name, int32(x)) -} -func (x *InputScriptType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(InputScriptType_value, data, "InputScriptType") - if err != nil { - return err - } - *x = InputScriptType(value) - return nil -} -func (InputScriptType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - -// * -// Type of information required by transaction signing process -// @used_in TxRequest -type RequestType int32 - -const ( - RequestType_TXINPUT RequestType = 0 - RequestType_TXOUTPUT RequestType = 1 - RequestType_TXMETA RequestType = 2 - RequestType_TXFINISHED RequestType = 3 - RequestType_TXEXTRADATA RequestType = 4 -) - -var RequestType_name = map[int32]string{ - 0: "TXINPUT", - 1: "TXOUTPUT", - 2: "TXMETA", - 3: "TXFINISHED", - 4: "TXEXTRADATA", -} -var RequestType_value = map[string]int32{ - "TXINPUT": 0, - "TXOUTPUT": 1, - "TXMETA": 2, - "TXFINISHED": 3, - "TXEXTRADATA": 4, -} - -func (x RequestType) Enum() *RequestType { - p := new(RequestType) - *p = x - return p -} -func (x RequestType) String() string { - return proto.EnumName(RequestType_name, int32(x)) -} -func (x *RequestType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RequestType_value, data, "RequestType") - if err != nil { - return err - } - *x = RequestType(value) - return nil -} -func (RequestType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - -// * -// Type of button request -// @used_in ButtonRequest -type ButtonRequestType int32 - -const ( - ButtonRequestType_ButtonRequest_Other ButtonRequestType = 1 - ButtonRequestType_ButtonRequest_FeeOverThreshold ButtonRequestType = 2 - ButtonRequestType_ButtonRequest_ConfirmOutput ButtonRequestType = 3 - ButtonRequestType_ButtonRequest_ResetDevice ButtonRequestType = 4 - ButtonRequestType_ButtonRequest_ConfirmWord ButtonRequestType = 5 - ButtonRequestType_ButtonRequest_WipeDevice ButtonRequestType = 6 - ButtonRequestType_ButtonRequest_ProtectCall ButtonRequestType = 7 - ButtonRequestType_ButtonRequest_SignTx ButtonRequestType = 8 - ButtonRequestType_ButtonRequest_FirmwareCheck ButtonRequestType = 9 - ButtonRequestType_ButtonRequest_Address ButtonRequestType = 10 - ButtonRequestType_ButtonRequest_PublicKey ButtonRequestType = 11 -) - -var ButtonRequestType_name = map[int32]string{ - 1: "ButtonRequest_Other", - 2: "ButtonRequest_FeeOverThreshold", - 3: "ButtonRequest_ConfirmOutput", - 4: "ButtonRequest_ResetDevice", - 5: "ButtonRequest_ConfirmWord", - 6: "ButtonRequest_WipeDevice", - 7: "ButtonRequest_ProtectCall", - 8: "ButtonRequest_SignTx", - 9: "ButtonRequest_FirmwareCheck", - 10: "ButtonRequest_Address", - 11: "ButtonRequest_PublicKey", -} -var ButtonRequestType_value = map[string]int32{ - "ButtonRequest_Other": 1, - "ButtonRequest_FeeOverThreshold": 2, - "ButtonRequest_ConfirmOutput": 3, - "ButtonRequest_ResetDevice": 4, - "ButtonRequest_ConfirmWord": 5, - "ButtonRequest_WipeDevice": 6, - "ButtonRequest_ProtectCall": 7, - "ButtonRequest_SignTx": 8, - "ButtonRequest_FirmwareCheck": 9, - "ButtonRequest_Address": 10, - "ButtonRequest_PublicKey": 11, -} - -func (x ButtonRequestType) Enum() *ButtonRequestType { - p := new(ButtonRequestType) - *p = x - return p -} -func (x ButtonRequestType) String() string { - return proto.EnumName(ButtonRequestType_name, int32(x)) -} -func (x *ButtonRequestType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(ButtonRequestType_value, data, "ButtonRequestType") - if err != nil { - return err - } - *x = ButtonRequestType(value) - return nil -} -func (ButtonRequestType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } - -// * -// Type of PIN request -// @used_in PinMatrixRequest -type PinMatrixRequestType int32 - -const ( - PinMatrixRequestType_PinMatrixRequestType_Current PinMatrixRequestType = 1 - PinMatrixRequestType_PinMatrixRequestType_NewFirst PinMatrixRequestType = 2 - PinMatrixRequestType_PinMatrixRequestType_NewSecond PinMatrixRequestType = 3 -) - -var PinMatrixRequestType_name = map[int32]string{ - 1: "PinMatrixRequestType_Current", - 2: "PinMatrixRequestType_NewFirst", - 3: "PinMatrixRequestType_NewSecond", -} -var PinMatrixRequestType_value = map[string]int32{ - "PinMatrixRequestType_Current": 1, - "PinMatrixRequestType_NewFirst": 2, - "PinMatrixRequestType_NewSecond": 3, -} - -func (x PinMatrixRequestType) Enum() *PinMatrixRequestType { - p := new(PinMatrixRequestType) - *p = x - return p -} -func (x PinMatrixRequestType) String() string { - return proto.EnumName(PinMatrixRequestType_name, int32(x)) -} -func (x *PinMatrixRequestType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PinMatrixRequestType_value, data, "PinMatrixRequestType") - if err != nil { - return err - } - *x = PinMatrixRequestType(value) - return nil -} -func (PinMatrixRequestType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } - -// * -// Type of recovery procedure. These should be used as bitmask, e.g., -// `RecoveryDeviceType_ScrambledWords | RecoveryDeviceType_Matrix` -// listing every method supported by the host computer. -// -// Note that ScrambledWords must be supported by every implementation -// for backward compatibility; there is no way to not support it. -// -// @used_in RecoveryDevice -type RecoveryDeviceType int32 - -const ( - // use powers of two when extending this field - RecoveryDeviceType_RecoveryDeviceType_ScrambledWords RecoveryDeviceType = 0 - RecoveryDeviceType_RecoveryDeviceType_Matrix RecoveryDeviceType = 1 -) - -var RecoveryDeviceType_name = map[int32]string{ - 0: "RecoveryDeviceType_ScrambledWords", - 1: "RecoveryDeviceType_Matrix", -} -var RecoveryDeviceType_value = map[string]int32{ - "RecoveryDeviceType_ScrambledWords": 0, - "RecoveryDeviceType_Matrix": 1, -} - -func (x RecoveryDeviceType) Enum() *RecoveryDeviceType { - p := new(RecoveryDeviceType) - *p = x - return p -} -func (x RecoveryDeviceType) String() string { - return proto.EnumName(RecoveryDeviceType_name, int32(x)) -} -func (x *RecoveryDeviceType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RecoveryDeviceType_value, data, "RecoveryDeviceType") - if err != nil { - return err - } - *x = RecoveryDeviceType(value) - return nil -} -func (RecoveryDeviceType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } - -// * -// Type of Recovery Word request -// @used_in WordRequest -type WordRequestType int32 - -const ( - WordRequestType_WordRequestType_Plain WordRequestType = 0 - WordRequestType_WordRequestType_Matrix9 WordRequestType = 1 - WordRequestType_WordRequestType_Matrix6 WordRequestType = 2 -) - -var WordRequestType_name = map[int32]string{ - 0: "WordRequestType_Plain", - 1: "WordRequestType_Matrix9", - 2: "WordRequestType_Matrix6", -} -var WordRequestType_value = map[string]int32{ - "WordRequestType_Plain": 0, - "WordRequestType_Matrix9": 1, - "WordRequestType_Matrix6": 2, -} - -func (x WordRequestType) Enum() *WordRequestType { - p := new(WordRequestType) - *p = x - return p -} -func (x WordRequestType) String() string { - return proto.EnumName(WordRequestType_name, int32(x)) -} -func (x *WordRequestType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(WordRequestType_value, data, "WordRequestType") - if err != nil { - return err - } - *x = WordRequestType(value) - return nil -} -func (WordRequestType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } - -// * -// Structure representing BIP32 (hierarchical deterministic) node -// Used for imports of private key into the device and exporting public key out of device -// @used_in PublicKey -// @used_in LoadDevice -// @used_in DebugLinkState -// @used_in Storage -type HDNodeType struct { - Depth *uint32 `protobuf:"varint,1,req,name=depth" json:"depth,omitempty"` - Fingerprint *uint32 `protobuf:"varint,2,req,name=fingerprint" json:"fingerprint,omitempty"` - ChildNum *uint32 `protobuf:"varint,3,req,name=child_num,json=childNum" json:"child_num,omitempty"` - ChainCode []byte `protobuf:"bytes,4,req,name=chain_code,json=chainCode" json:"chain_code,omitempty"` - PrivateKey []byte `protobuf:"bytes,5,opt,name=private_key,json=privateKey" json:"private_key,omitempty"` - PublicKey []byte `protobuf:"bytes,6,opt,name=public_key,json=publicKey" json:"public_key,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *HDNodeType) Reset() { *m = HDNodeType{} } -func (m *HDNodeType) String() string { return proto.CompactTextString(m) } -func (*HDNodeType) ProtoMessage() {} -func (*HDNodeType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *HDNodeType) GetDepth() uint32 { - if m != nil && m.Depth != nil { - return *m.Depth - } - return 0 -} - -func (m *HDNodeType) GetFingerprint() uint32 { - if m != nil && m.Fingerprint != nil { - return *m.Fingerprint - } - return 0 -} - -func (m *HDNodeType) GetChildNum() uint32 { - if m != nil && m.ChildNum != nil { - return *m.ChildNum - } - return 0 -} - -func (m *HDNodeType) GetChainCode() []byte { - if m != nil { - return m.ChainCode - } - return nil -} - -func (m *HDNodeType) GetPrivateKey() []byte { - if m != nil { - return m.PrivateKey - } - return nil -} - -func (m *HDNodeType) GetPublicKey() []byte { - if m != nil { - return m.PublicKey - } - return nil -} - -type HDNodePathType struct { - Node *HDNodeType `protobuf:"bytes,1,req,name=node" json:"node,omitempty"` - AddressN []uint32 `protobuf:"varint,2,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *HDNodePathType) Reset() { *m = HDNodePathType{} } -func (m *HDNodePathType) String() string { return proto.CompactTextString(m) } -func (*HDNodePathType) ProtoMessage() {} -func (*HDNodePathType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -func (m *HDNodePathType) GetNode() *HDNodeType { - if m != nil { - return m.Node - } - return nil -} - -func (m *HDNodePathType) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -// * -// Structure representing Coin -// @used_in Features -type CoinType struct { - CoinName *string `protobuf:"bytes,1,opt,name=coin_name,json=coinName" json:"coin_name,omitempty"` - CoinShortcut *string `protobuf:"bytes,2,opt,name=coin_shortcut,json=coinShortcut" json:"coin_shortcut,omitempty"` - AddressType *uint32 `protobuf:"varint,3,opt,name=address_type,json=addressType,def=0" json:"address_type,omitempty"` - MaxfeeKb *uint64 `protobuf:"varint,4,opt,name=maxfee_kb,json=maxfeeKb" json:"maxfee_kb,omitempty"` - AddressTypeP2Sh *uint32 `protobuf:"varint,5,opt,name=address_type_p2sh,json=addressTypeP2sh,def=5" json:"address_type_p2sh,omitempty"` - SignedMessageHeader *string `protobuf:"bytes,8,opt,name=signed_message_header,json=signedMessageHeader" json:"signed_message_header,omitempty"` - XpubMagic *uint32 `protobuf:"varint,9,opt,name=xpub_magic,json=xpubMagic,def=76067358" json:"xpub_magic,omitempty"` - XprvMagic *uint32 `protobuf:"varint,10,opt,name=xprv_magic,json=xprvMagic,def=76066276" json:"xprv_magic,omitempty"` - Segwit *bool `protobuf:"varint,11,opt,name=segwit" json:"segwit,omitempty"` - Forkid *uint32 `protobuf:"varint,12,opt,name=forkid" json:"forkid,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *CoinType) Reset() { *m = CoinType{} } -func (m *CoinType) String() string { return proto.CompactTextString(m) } -func (*CoinType) ProtoMessage() {} -func (*CoinType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - -const Default_CoinType_AddressType uint32 = 0 -const Default_CoinType_AddressTypeP2Sh uint32 = 5 -const Default_CoinType_XpubMagic uint32 = 76067358 -const Default_CoinType_XprvMagic uint32 = 76066276 - -func (m *CoinType) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return "" -} - -func (m *CoinType) GetCoinShortcut() string { - if m != nil && m.CoinShortcut != nil { - return *m.CoinShortcut - } - return "" -} - -func (m *CoinType) GetAddressType() uint32 { - if m != nil && m.AddressType != nil { - return *m.AddressType - } - return Default_CoinType_AddressType -} - -func (m *CoinType) GetMaxfeeKb() uint64 { - if m != nil && m.MaxfeeKb != nil { - return *m.MaxfeeKb - } - return 0 -} - -func (m *CoinType) GetAddressTypeP2Sh() uint32 { - if m != nil && m.AddressTypeP2Sh != nil { - return *m.AddressTypeP2Sh - } - return Default_CoinType_AddressTypeP2Sh -} - -func (m *CoinType) GetSignedMessageHeader() string { - if m != nil && m.SignedMessageHeader != nil { - return *m.SignedMessageHeader - } - return "" -} - -func (m *CoinType) GetXpubMagic() uint32 { - if m != nil && m.XpubMagic != nil { - return *m.XpubMagic - } - return Default_CoinType_XpubMagic -} - -func (m *CoinType) GetXprvMagic() uint32 { - if m != nil && m.XprvMagic != nil { - return *m.XprvMagic - } - return Default_CoinType_XprvMagic -} - -func (m *CoinType) GetSegwit() bool { - if m != nil && m.Segwit != nil { - return *m.Segwit - } - return false -} - -func (m *CoinType) GetForkid() uint32 { - if m != nil && m.Forkid != nil { - return *m.Forkid - } - return 0 -} - -// * -// Type of redeem script used in input -// @used_in TxInputType -type MultisigRedeemScriptType struct { - Pubkeys []*HDNodePathType `protobuf:"bytes,1,rep,name=pubkeys" json:"pubkeys,omitempty"` - Signatures [][]byte `protobuf:"bytes,2,rep,name=signatures" json:"signatures,omitempty"` - M *uint32 `protobuf:"varint,3,opt,name=m" json:"m,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MultisigRedeemScriptType) Reset() { *m = MultisigRedeemScriptType{} } -func (m *MultisigRedeemScriptType) String() string { return proto.CompactTextString(m) } -func (*MultisigRedeemScriptType) ProtoMessage() {} -func (*MultisigRedeemScriptType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - -func (m *MultisigRedeemScriptType) GetPubkeys() []*HDNodePathType { - if m != nil { - return m.Pubkeys - } - return nil -} - -func (m *MultisigRedeemScriptType) GetSignatures() [][]byte { - if m != nil { - return m.Signatures - } - return nil -} - -func (m *MultisigRedeemScriptType) GetM() uint32 { - if m != nil && m.M != nil { - return *m.M - } - return 0 -} - -// * -// Structure representing transaction input -// @used_in SimpleSignTx -// @used_in TransactionType -type TxInputType struct { - AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - PrevHash []byte `protobuf:"bytes,2,req,name=prev_hash,json=prevHash" json:"prev_hash,omitempty"` - PrevIndex *uint32 `protobuf:"varint,3,req,name=prev_index,json=prevIndex" json:"prev_index,omitempty"` - ScriptSig []byte `protobuf:"bytes,4,opt,name=script_sig,json=scriptSig" json:"script_sig,omitempty"` - Sequence *uint32 `protobuf:"varint,5,opt,name=sequence,def=4294967295" json:"sequence,omitempty"` - ScriptType *InputScriptType `protobuf:"varint,6,opt,name=script_type,json=scriptType,enum=InputScriptType,def=0" json:"script_type,omitempty"` - Multisig *MultisigRedeemScriptType `protobuf:"bytes,7,opt,name=multisig" json:"multisig,omitempty"` - Amount *uint64 `protobuf:"varint,8,opt,name=amount" json:"amount,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *TxInputType) Reset() { *m = TxInputType{} } -func (m *TxInputType) String() string { return proto.CompactTextString(m) } -func (*TxInputType) ProtoMessage() {} -func (*TxInputType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } - -const Default_TxInputType_Sequence uint32 = 4294967295 -const Default_TxInputType_ScriptType InputScriptType = InputScriptType_SPENDADDRESS - -func (m *TxInputType) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *TxInputType) GetPrevHash() []byte { - if m != nil { - return m.PrevHash - } - return nil -} - -func (m *TxInputType) GetPrevIndex() uint32 { - if m != nil && m.PrevIndex != nil { - return *m.PrevIndex - } - return 0 -} - -func (m *TxInputType) GetScriptSig() []byte { - if m != nil { - return m.ScriptSig - } - return nil -} - -func (m *TxInputType) GetSequence() uint32 { - if m != nil && m.Sequence != nil { - return *m.Sequence - } - return Default_TxInputType_Sequence -} - -func (m *TxInputType) GetScriptType() InputScriptType { - if m != nil && m.ScriptType != nil { - return *m.ScriptType - } - return Default_TxInputType_ScriptType -} - -func (m *TxInputType) GetMultisig() *MultisigRedeemScriptType { - if m != nil { - return m.Multisig - } - return nil -} - -func (m *TxInputType) GetAmount() uint64 { - if m != nil && m.Amount != nil { - return *m.Amount - } - return 0 -} - -// * -// Structure representing transaction output -// @used_in SimpleSignTx -// @used_in TransactionType -type TxOutputType struct { - Address *string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` - AddressN []uint32 `protobuf:"varint,2,rep,name=address_n,json=addressN" json:"address_n,omitempty"` - Amount *uint64 `protobuf:"varint,3,req,name=amount" json:"amount,omitempty"` - ScriptType *OutputScriptType `protobuf:"varint,4,req,name=script_type,json=scriptType,enum=OutputScriptType" json:"script_type,omitempty"` - Multisig *MultisigRedeemScriptType `protobuf:"bytes,5,opt,name=multisig" json:"multisig,omitempty"` - OpReturnData []byte `protobuf:"bytes,6,opt,name=op_return_data,json=opReturnData" json:"op_return_data,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *TxOutputType) Reset() { *m = TxOutputType{} } -func (m *TxOutputType) String() string { return proto.CompactTextString(m) } -func (*TxOutputType) ProtoMessage() {} -func (*TxOutputType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } - -func (m *TxOutputType) GetAddress() string { - if m != nil && m.Address != nil { - return *m.Address - } - return "" -} - -func (m *TxOutputType) GetAddressN() []uint32 { - if m != nil { - return m.AddressN - } - return nil -} - -func (m *TxOutputType) GetAmount() uint64 { - if m != nil && m.Amount != nil { - return *m.Amount - } - return 0 -} - -func (m *TxOutputType) GetScriptType() OutputScriptType { - if m != nil && m.ScriptType != nil { - return *m.ScriptType - } - return OutputScriptType_PAYTOADDRESS -} - -func (m *TxOutputType) GetMultisig() *MultisigRedeemScriptType { - if m != nil { - return m.Multisig - } - return nil -} - -func (m *TxOutputType) GetOpReturnData() []byte { - if m != nil { - return m.OpReturnData - } - return nil -} - -// * -// Structure representing compiled transaction output -// @used_in TransactionType -type TxOutputBinType struct { - Amount *uint64 `protobuf:"varint,1,req,name=amount" json:"amount,omitempty"` - ScriptPubkey []byte `protobuf:"bytes,2,req,name=script_pubkey,json=scriptPubkey" json:"script_pubkey,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *TxOutputBinType) Reset() { *m = TxOutputBinType{} } -func (m *TxOutputBinType) String() string { return proto.CompactTextString(m) } -func (*TxOutputBinType) ProtoMessage() {} -func (*TxOutputBinType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } - -func (m *TxOutputBinType) GetAmount() uint64 { - if m != nil && m.Amount != nil { - return *m.Amount - } - return 0 -} - -func (m *TxOutputBinType) GetScriptPubkey() []byte { - if m != nil { - return m.ScriptPubkey - } - return nil -} - -// * -// Structure representing transaction -// @used_in SimpleSignTx -type TransactionType struct { - Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"` - Inputs []*TxInputType `protobuf:"bytes,2,rep,name=inputs" json:"inputs,omitempty"` - BinOutputs []*TxOutputBinType `protobuf:"bytes,3,rep,name=bin_outputs,json=binOutputs" json:"bin_outputs,omitempty"` - Outputs []*TxOutputType `protobuf:"bytes,5,rep,name=outputs" json:"outputs,omitempty"` - LockTime *uint32 `protobuf:"varint,4,opt,name=lock_time,json=lockTime" json:"lock_time,omitempty"` - InputsCnt *uint32 `protobuf:"varint,6,opt,name=inputs_cnt,json=inputsCnt" json:"inputs_cnt,omitempty"` - OutputsCnt *uint32 `protobuf:"varint,7,opt,name=outputs_cnt,json=outputsCnt" json:"outputs_cnt,omitempty"` - ExtraData []byte `protobuf:"bytes,8,opt,name=extra_data,json=extraData" json:"extra_data,omitempty"` - ExtraDataLen *uint32 `protobuf:"varint,9,opt,name=extra_data_len,json=extraDataLen" json:"extra_data_len,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *TransactionType) Reset() { *m = TransactionType{} } -func (m *TransactionType) String() string { return proto.CompactTextString(m) } -func (*TransactionType) ProtoMessage() {} -func (*TransactionType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } - -func (m *TransactionType) GetVersion() uint32 { - if m != nil && m.Version != nil { - return *m.Version - } - return 0 -} - -func (m *TransactionType) GetInputs() []*TxInputType { - if m != nil { - return m.Inputs - } - return nil -} - -func (m *TransactionType) GetBinOutputs() []*TxOutputBinType { - if m != nil { - return m.BinOutputs - } - return nil -} - -func (m *TransactionType) GetOutputs() []*TxOutputType { - if m != nil { - return m.Outputs - } - return nil -} - -func (m *TransactionType) GetLockTime() uint32 { - if m != nil && m.LockTime != nil { - return *m.LockTime - } - return 0 -} - -func (m *TransactionType) GetInputsCnt() uint32 { - if m != nil && m.InputsCnt != nil { - return *m.InputsCnt - } - return 0 -} - -func (m *TransactionType) GetOutputsCnt() uint32 { - if m != nil && m.OutputsCnt != nil { - return *m.OutputsCnt - } - return 0 -} - -func (m *TransactionType) GetExtraData() []byte { - if m != nil { - return m.ExtraData - } - return nil -} - -func (m *TransactionType) GetExtraDataLen() uint32 { - if m != nil && m.ExtraDataLen != nil { - return *m.ExtraDataLen - } - return 0 -} - -// * -// Structure representing request details -// @used_in TxRequest -type TxRequestDetailsType struct { - RequestIndex *uint32 `protobuf:"varint,1,opt,name=request_index,json=requestIndex" json:"request_index,omitempty"` - TxHash []byte `protobuf:"bytes,2,opt,name=tx_hash,json=txHash" json:"tx_hash,omitempty"` - ExtraDataLen *uint32 `protobuf:"varint,3,opt,name=extra_data_len,json=extraDataLen" json:"extra_data_len,omitempty"` - ExtraDataOffset *uint32 `protobuf:"varint,4,opt,name=extra_data_offset,json=extraDataOffset" json:"extra_data_offset,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *TxRequestDetailsType) Reset() { *m = TxRequestDetailsType{} } -func (m *TxRequestDetailsType) String() string { return proto.CompactTextString(m) } -func (*TxRequestDetailsType) ProtoMessage() {} -func (*TxRequestDetailsType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } - -func (m *TxRequestDetailsType) GetRequestIndex() uint32 { - if m != nil && m.RequestIndex != nil { - return *m.RequestIndex - } - return 0 -} - -func (m *TxRequestDetailsType) GetTxHash() []byte { - if m != nil { - return m.TxHash - } - return nil -} - -func (m *TxRequestDetailsType) GetExtraDataLen() uint32 { - if m != nil && m.ExtraDataLen != nil { - return *m.ExtraDataLen - } - return 0 -} - -func (m *TxRequestDetailsType) GetExtraDataOffset() uint32 { - if m != nil && m.ExtraDataOffset != nil { - return *m.ExtraDataOffset - } - return 0 -} - -// * -// Structure representing serialized data -// @used_in TxRequest -type TxRequestSerializedType struct { - SignatureIndex *uint32 `protobuf:"varint,1,opt,name=signature_index,json=signatureIndex" json:"signature_index,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` - SerializedTx []byte `protobuf:"bytes,3,opt,name=serialized_tx,json=serializedTx" json:"serialized_tx,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *TxRequestSerializedType) Reset() { *m = TxRequestSerializedType{} } -func (m *TxRequestSerializedType) String() string { return proto.CompactTextString(m) } -func (*TxRequestSerializedType) ProtoMessage() {} -func (*TxRequestSerializedType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } - -func (m *TxRequestSerializedType) GetSignatureIndex() uint32 { - if m != nil && m.SignatureIndex != nil { - return *m.SignatureIndex - } - return 0 -} - -func (m *TxRequestSerializedType) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -func (m *TxRequestSerializedType) GetSerializedTx() []byte { - if m != nil { - return m.SerializedTx - } - return nil -} - -// * -// Structure representing identity data -// @used_in IdentityType -type IdentityType struct { - Proto *string `protobuf:"bytes,1,opt,name=proto" json:"proto,omitempty"` - User *string `protobuf:"bytes,2,opt,name=user" json:"user,omitempty"` - Host *string `protobuf:"bytes,3,opt,name=host" json:"host,omitempty"` - Port *string `protobuf:"bytes,4,opt,name=port" json:"port,omitempty"` - Path *string `protobuf:"bytes,5,opt,name=path" json:"path,omitempty"` - Index *uint32 `protobuf:"varint,6,opt,name=index,def=0" json:"index,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *IdentityType) Reset() { *m = IdentityType{} } -func (m *IdentityType) String() string { return proto.CompactTextString(m) } -func (*IdentityType) ProtoMessage() {} -func (*IdentityType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } - -const Default_IdentityType_Index uint32 = 0 - -func (m *IdentityType) GetProto() string { - if m != nil && m.Proto != nil { - return *m.Proto - } - return "" -} - -func (m *IdentityType) GetUser() string { - if m != nil && m.User != nil { - return *m.User - } - return "" -} - -func (m *IdentityType) GetHost() string { - if m != nil && m.Host != nil { - return *m.Host - } - return "" -} - -func (m *IdentityType) GetPort() string { - if m != nil && m.Port != nil { - return *m.Port - } - return "" -} - -func (m *IdentityType) GetPath() string { - if m != nil && m.Path != nil { - return *m.Path - } - return "" -} - -func (m *IdentityType) GetIndex() uint32 { - if m != nil && m.Index != nil { - return *m.Index - } - return Default_IdentityType_Index -} - -var E_WireIn = &proto.ExtensionDesc{ - ExtendedType: (*google_protobuf.EnumValueOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 50002, - Name: "wire_in", - Tag: "varint,50002,opt,name=wire_in,json=wireIn", - Filename: "types.proto", -} - -var E_WireOut = &proto.ExtensionDesc{ - ExtendedType: (*google_protobuf.EnumValueOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 50003, - Name: "wire_out", - Tag: "varint,50003,opt,name=wire_out,json=wireOut", - Filename: "types.proto", -} - -var E_WireDebugIn = &proto.ExtensionDesc{ - ExtendedType: (*google_protobuf.EnumValueOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 50004, - Name: "wire_debug_in", - Tag: "varint,50004,opt,name=wire_debug_in,json=wireDebugIn", - Filename: "types.proto", -} - -var E_WireDebugOut = &proto.ExtensionDesc{ - ExtendedType: (*google_protobuf.EnumValueOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 50005, - Name: "wire_debug_out", - Tag: "varint,50005,opt,name=wire_debug_out,json=wireDebugOut", - Filename: "types.proto", -} - -var E_WireTiny = &proto.ExtensionDesc{ - ExtendedType: (*google_protobuf.EnumValueOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 50006, - Name: "wire_tiny", - Tag: "varint,50006,opt,name=wire_tiny,json=wireTiny", - Filename: "types.proto", -} - -var E_WireBootloader = &proto.ExtensionDesc{ - ExtendedType: (*google_protobuf.EnumValueOptions)(nil), - ExtensionType: (*bool)(nil), - Field: 50007, - Name: "wire_bootloader", - Tag: "varint,50007,opt,name=wire_bootloader,json=wireBootloader", - Filename: "types.proto", -} - -func init() { - proto.RegisterType((*HDNodeType)(nil), "HDNodeType") - proto.RegisterType((*HDNodePathType)(nil), "HDNodePathType") - proto.RegisterType((*CoinType)(nil), "CoinType") - proto.RegisterType((*MultisigRedeemScriptType)(nil), "MultisigRedeemScriptType") - proto.RegisterType((*TxInputType)(nil), "TxInputType") - proto.RegisterType((*TxOutputType)(nil), "TxOutputType") - proto.RegisterType((*TxOutputBinType)(nil), "TxOutputBinType") - proto.RegisterType((*TransactionType)(nil), "TransactionType") - proto.RegisterType((*TxRequestDetailsType)(nil), "TxRequestDetailsType") - proto.RegisterType((*TxRequestSerializedType)(nil), "TxRequestSerializedType") - proto.RegisterType((*IdentityType)(nil), "IdentityType") - proto.RegisterEnum("FailureType", FailureType_name, FailureType_value) - proto.RegisterEnum("OutputScriptType", OutputScriptType_name, OutputScriptType_value) - proto.RegisterEnum("InputScriptType", InputScriptType_name, InputScriptType_value) - proto.RegisterEnum("RequestType", RequestType_name, RequestType_value) - proto.RegisterEnum("ButtonRequestType", ButtonRequestType_name, ButtonRequestType_value) - proto.RegisterEnum("PinMatrixRequestType", PinMatrixRequestType_name, PinMatrixRequestType_value) - proto.RegisterEnum("RecoveryDeviceType", RecoveryDeviceType_name, RecoveryDeviceType_value) - proto.RegisterEnum("WordRequestType", WordRequestType_name, WordRequestType_value) - proto.RegisterExtension(E_WireIn) - proto.RegisterExtension(E_WireOut) - proto.RegisterExtension(E_WireDebugIn) - proto.RegisterExtension(E_WireDebugOut) - proto.RegisterExtension(E_WireTiny) - proto.RegisterExtension(E_WireBootloader) -} - -func init() { proto.RegisterFile("types.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 1899 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xdb, 0x72, 0x1a, 0xc9, - 0x19, 0xf6, 0x00, 0x92, 0xe0, 0x07, 0xc4, 0xa8, 0x7d, 0xd0, 0x78, 0x6d, 0xaf, 0x31, 0x76, 0x62, - 0x45, 0x55, 0x61, 0x77, 0xc9, 0x5a, 0x8e, 0x55, 0xa9, 0x24, 0x3a, 0xa0, 0x15, 0x65, 0x0b, 0x51, - 0xc3, 0x28, 0x56, 0x72, 0x33, 0x35, 0xcc, 0xb4, 0xa0, 0x4b, 0x43, 0x37, 0xe9, 0xe9, 0x91, 0xd1, - 0xde, 0xe4, 0x2a, 0xc9, 0x55, 0x5e, 0x23, 0x6f, 0x91, 0xaa, 0xbc, 0x41, 0xaa, 0x36, 0xa7, 0xcb, - 0xbc, 0x41, 0xae, 0xf2, 0x00, 0xa9, 0x3e, 0x0c, 0x02, 0xc9, 0xde, 0xd2, 0x1d, 0xfd, 0x7d, 0xff, - 0xf9, 0xd0, 0x3d, 0x40, 0x59, 0x5c, 0x4e, 0x70, 0xd2, 0x9c, 0x70, 0x26, 0xd8, 0x67, 0xf5, 0x21, - 0x63, 0xc3, 0x18, 0x7f, 0xa1, 0x4e, 0x83, 0xf4, 0xec, 0x8b, 0x08, 0x27, 0x21, 0x27, 0x13, 0xc1, - 0xb8, 0x96, 0x68, 0xfc, 0xd5, 0x02, 0x38, 0xdc, 0xef, 0xb2, 0x08, 0x7b, 0x97, 0x13, 0x8c, 0xee, - 0xc1, 0x52, 0x84, 0x27, 0x62, 0xe4, 0x58, 0xf5, 0xdc, 0x46, 0xd5, 0xd5, 0x07, 0x54, 0x87, 0xf2, - 0x19, 0xa1, 0x43, 0xcc, 0x27, 0x9c, 0x50, 0xe1, 0xe4, 0x14, 0x37, 0x0f, 0xa1, 0x47, 0x50, 0x0a, - 0x47, 0x24, 0x8e, 0x7c, 0x9a, 0x8e, 0x9d, 0xbc, 0xe2, 0x8b, 0x0a, 0xe8, 0xa6, 0x63, 0xf4, 0x04, - 0x20, 0x1c, 0x05, 0x84, 0xfa, 0x21, 0x8b, 0xb0, 0x53, 0xa8, 0xe7, 0x36, 0x2a, 0x6e, 0x49, 0x21, - 0x7b, 0x2c, 0xc2, 0xe8, 0x29, 0x94, 0x27, 0x9c, 0x5c, 0x04, 0x02, 0xfb, 0xe7, 0xf8, 0xd2, 0x59, - 0xaa, 0x5b, 0x1b, 0x15, 0x17, 0x0c, 0xf4, 0x16, 0x5f, 0x4a, 0xfd, 0x49, 0x3a, 0x88, 0x49, 0xa8, - 0xf8, 0x65, 0xc5, 0x97, 0x34, 0xf2, 0x16, 0x5f, 0x36, 0xba, 0xb0, 0xaa, 0x33, 0xe8, 0x05, 0x62, - 0xa4, 0xb2, 0x78, 0x0a, 0x05, 0x2a, 0x5d, 0xc9, 0x24, 0xca, 0xad, 0x72, 0xf3, 0x2a, 0x41, 0x57, - 0x11, 0x32, 0xdc, 0x20, 0x8a, 0x38, 0x4e, 0x12, 0x9f, 0x3a, 0xb9, 0x7a, 0x5e, 0x86, 0x6b, 0x80, - 0x6e, 0xe3, 0x7f, 0x39, 0x28, 0xee, 0x31, 0x42, 0x95, 0x29, 0x99, 0x18, 0x23, 0xd4, 0xa7, 0xc1, - 0x58, 0xda, 0xb3, 0x36, 0x4a, 0x6e, 0x51, 0x02, 0xdd, 0x60, 0x8c, 0xd1, 0x73, 0xa8, 0x2a, 0x32, - 0x19, 0x31, 0x2e, 0xc2, 0x54, 0x56, 0x46, 0x0a, 0x54, 0x24, 0xd8, 0x37, 0x18, 0x7a, 0x01, 0x95, - 0xcc, 0x97, 0x6c, 0x8d, 0x93, 0xaf, 0x5b, 0x1b, 0xd5, 0x6d, 0xeb, 0x4b, 0xb7, 0x6c, 0xe0, 0xcc, - 0xcf, 0x38, 0x98, 0x9e, 0x61, 0xec, 0x9f, 0x0f, 0x9c, 0x42, 0xdd, 0xda, 0x28, 0xb8, 0x45, 0x0d, - 0xbc, 0x1d, 0xa0, 0x1f, 0xc3, 0xda, 0xbc, 0x09, 0x7f, 0xd2, 0x4a, 0x46, 0xaa, 0x4e, 0xd5, 0x6d, - 0xeb, 0x95, 0x5b, 0x9b, 0xb3, 0xd3, 0x6b, 0x25, 0x23, 0xd4, 0x82, 0xfb, 0x09, 0x19, 0x52, 0x1c, - 0xf9, 0x63, 0x9c, 0x24, 0xc1, 0x10, 0xfb, 0x23, 0x1c, 0x44, 0x98, 0x3b, 0x45, 0x15, 0xde, 0x5d, - 0x4d, 0x1e, 0x69, 0xee, 0x50, 0x51, 0xe8, 0x25, 0xc0, 0x74, 0x92, 0x0e, 0xfc, 0x71, 0x30, 0x24, - 0xa1, 0x53, 0x52, 0xb6, 0x8b, 0xaf, 0xb7, 0xbe, 0xdc, 0x7a, 0xfd, 0x93, 0x57, 0x3f, 0x75, 0x4b, - 0x92, 0x3b, 0x92, 0x94, 0x16, 0xe4, 0x17, 0x46, 0x10, 0xae, 0x04, 0xb7, 0x5a, 0xaf, 0xb7, 0xa4, - 0x20, 0xbf, 0xd0, 0x82, 0x0f, 0x60, 0x39, 0xc1, 0xc3, 0x0f, 0x44, 0x38, 0xe5, 0xba, 0xb5, 0x51, - 0x74, 0xcd, 0x49, 0xe2, 0x67, 0x8c, 0x9f, 0x93, 0xc8, 0xa9, 0x48, 0x65, 0xd7, 0x9c, 0x1a, 0x09, - 0x38, 0x47, 0x69, 0x2c, 0x48, 0x42, 0x86, 0x2e, 0x8e, 0x30, 0x1e, 0xf7, 0xd5, 0xa4, 0xaa, 0xea, - 0xfc, 0x08, 0x56, 0x26, 0xe9, 0xe0, 0x1c, 0x5f, 0x26, 0x8e, 0x55, 0xcf, 0x6f, 0x94, 0x5b, 0xb5, - 0xe6, 0x62, 0xcb, 0xdd, 0x8c, 0x47, 0x9f, 0x03, 0xc8, 0xfc, 0x02, 0x91, 0x72, 0x9c, 0xa8, 0xde, - 0x56, 0xdc, 0x39, 0x04, 0x55, 0xc0, 0x1a, 0xeb, 0x1e, 0xb8, 0xd6, 0xb8, 0xf1, 0x97, 0x1c, 0x94, - 0xbd, 0x69, 0x87, 0x4e, 0x52, 0x91, 0xb5, 0xe1, 0x6a, 0x30, 0xac, 0xc5, 0xc1, 0x90, 0xe4, 0x84, - 0xe3, 0x0b, 0x7f, 0x14, 0x24, 0x23, 0xb5, 0x04, 0x15, 0xb7, 0x28, 0x81, 0xc3, 0x20, 0x19, 0xa9, - 0x21, 0x95, 0x24, 0xa1, 0x11, 0x9e, 0x9a, 0x15, 0x50, 0xe2, 0x1d, 0x09, 0x48, 0x5a, 0x6f, 0x9e, - 0x9f, 0x90, 0xa1, 0x6a, 0x70, 0xc5, 0x2d, 0x69, 0xa4, 0x4f, 0x86, 0xe8, 0x87, 0x50, 0x4c, 0xf0, - 0x6f, 0x53, 0x4c, 0x43, 0x6c, 0x1a, 0x0b, 0x5f, 0xb7, 0xde, 0x7c, 0xfd, 0x66, 0xeb, 0x75, 0xeb, - 0xcd, 0x2b, 0x77, 0xc6, 0xa1, 0x5f, 0x40, 0xd9, 0x98, 0x51, 0xb3, 0x24, 0x77, 0x61, 0xb5, 0x65, - 0x37, 0x55, 0x02, 0x57, 0xf5, 0xda, 0xae, 0xf4, 0x7b, 0xed, 0xee, 0xfe, 0xce, 0xfe, 0xbe, 0xdb, - 0xee, 0xf7, 0x5d, 0xe3, 0x59, 0x25, 0xf8, 0x0a, 0x8a, 0x63, 0x53, 0x65, 0x67, 0xa5, 0x6e, 0x6d, - 0x94, 0x5b, 0x0f, 0x9b, 0x9f, 0x2a, 0xbb, 0x3b, 0x13, 0x95, 0x4d, 0x0b, 0xc6, 0x2c, 0xa5, 0x42, - 0xcd, 0x50, 0xc1, 0x35, 0xa7, 0xc6, 0x7f, 0x2d, 0xa8, 0x78, 0xd3, 0xe3, 0x54, 0x64, 0x05, 0x74, - 0x60, 0xc5, 0xd4, 0xcb, 0x6c, 0x4b, 0x76, 0xfc, 0xde, 0x9d, 0x9b, 0xb3, 0x2f, 0x2b, 0x37, 0xb3, - 0x8f, 0x5a, 0x8b, 0xf9, 0xca, 0xbb, 0x63, 0xb5, 0xb5, 0xd6, 0xd4, 0x0e, 0xe7, 0x22, 0xfd, 0x54, - 0x8a, 0x4b, 0xb7, 0x4f, 0xf1, 0x05, 0xac, 0xb2, 0x89, 0xcf, 0xb1, 0x48, 0x39, 0xf5, 0xa3, 0x40, - 0x04, 0xe6, 0xa6, 0xa9, 0xb0, 0x89, 0xab, 0xc0, 0xfd, 0x40, 0x04, 0x8d, 0x2e, 0xd4, 0xb2, 0x7c, - 0x77, 0xcd, 0x15, 0x71, 0x15, 0xbb, 0xb5, 0x10, 0xfb, 0x73, 0xa8, 0x9a, 0xd8, 0xf5, 0x6c, 0x9a, - 0x91, 0xa9, 0x68, 0xb0, 0xa7, 0xb0, 0xc6, 0xdf, 0x72, 0x50, 0xf3, 0x78, 0x40, 0x93, 0x20, 0x14, - 0x84, 0xd1, 0xac, 0x86, 0x17, 0x98, 0x27, 0x84, 0x51, 0x55, 0xc3, 0xaa, 0x9b, 0x1d, 0xd1, 0x0b, - 0x58, 0x26, 0xb2, 0xd5, 0x7a, 0xb0, 0xcb, 0xad, 0x4a, 0x73, 0x6e, 0x78, 0x5d, 0xc3, 0xa1, 0xaf, - 0xa0, 0x3c, 0x20, 0xd4, 0x67, 0x2a, 0xca, 0xc4, 0xc9, 0x2b, 0x51, 0xbb, 0x79, 0x2d, 0x6e, 0x17, - 0x06, 0x84, 0x6a, 0x24, 0x41, 0x2f, 0x61, 0x25, 0x13, 0x5f, 0x52, 0xe2, 0xd5, 0xe6, 0x7c, 0x5b, - 0xdd, 0x8c, 0x95, 0x5d, 0x8c, 0x59, 0x78, 0xee, 0x0b, 0x32, 0xc6, 0x6a, 0x8c, 0xab, 0x6e, 0x51, - 0x02, 0x1e, 0x19, 0x63, 0x39, 0xe4, 0x3a, 0x04, 0x3f, 0xa4, 0x42, 0x95, 0xaf, 0xea, 0x96, 0x34, - 0xb2, 0x47, 0x85, 0xbc, 0xe8, 0x8d, 0x19, 0xc5, 0xaf, 0x28, 0x1e, 0x0c, 0x24, 0x05, 0x9e, 0x00, - 0xe0, 0xa9, 0xe0, 0x81, 0x2e, 0x7f, 0x51, 0x2f, 0x89, 0x42, 0x64, 0xed, 0x65, 0x87, 0xae, 0x68, - 0x3f, 0xc6, 0x54, 0xdf, 0x53, 0x6e, 0x65, 0x26, 0xf2, 0x0e, 0xd3, 0xc6, 0x9f, 0x2d, 0xb8, 0xe7, - 0x4d, 0x5d, 0xb9, 0x31, 0x89, 0xd8, 0xc7, 0x22, 0x20, 0xb1, 0xbe, 0x62, 0x9f, 0x43, 0x95, 0x6b, - 0xd4, 0x2c, 0xa9, 0x2e, 0x6e, 0xc5, 0x80, 0x7a, 0x4f, 0xd7, 0x61, 0x45, 0x4c, 0xb3, 0x0d, 0x97, - 0xfe, 0x97, 0xc5, 0x54, 0xed, 0xf7, 0x4d, 0xe7, 0xf9, 0x9b, 0xce, 0xd1, 0x26, 0xac, 0xcd, 0x49, - 0xb1, 0xb3, 0xb3, 0x04, 0x0b, 0x53, 0xa6, 0xda, 0x4c, 0xf0, 0x58, 0xc1, 0x8d, 0xdf, 0x5b, 0xb0, - 0x3e, 0x0b, 0xb4, 0x8f, 0x39, 0x09, 0x62, 0xf2, 0x2d, 0x8e, 0x54, 0xac, 0x2f, 0xa1, 0x36, 0xbb, - 0xb3, 0x16, 0xa2, 0x5d, 0x9d, 0xc1, 0x3a, 0xde, 0xc7, 0x50, 0x9a, 0x21, 0x26, 0xe2, 0x2b, 0x40, - 0x8d, 0xe0, 0xcc, 0xb0, 0x2f, 0xa6, 0x2a, 0x66, 0x39, 0x82, 0x57, 0xde, 0xa6, 0x8d, 0x3f, 0x59, - 0x50, 0xe9, 0x44, 0x98, 0x0a, 0x22, 0x2e, 0xb3, 0x8f, 0x00, 0xf5, 0x71, 0x60, 0x36, 0x58, 0x1f, - 0x10, 0x82, 0x42, 0x9a, 0x60, 0x6e, 0xde, 0x38, 0xf5, 0x5b, 0x62, 0x23, 0x96, 0x08, 0x65, 0xb6, - 0xe4, 0xaa, 0xdf, 0x12, 0x9b, 0x30, 0xae, 0xb3, 0x2e, 0xb9, 0xea, 0xb7, 0xc2, 0x02, 0xa1, 0xdf, - 0x2c, 0x89, 0x05, 0x62, 0x84, 0xd6, 0x61, 0x49, 0x27, 0xb6, 0x9c, 0x3d, 0x88, 0xfa, 0xbc, 0xf9, - 0x5d, 0x0e, 0xca, 0x07, 0x01, 0x89, 0x53, 0xae, 0xbf, 0x49, 0x9e, 0xc0, 0x43, 0x73, 0xf4, 0x4f, - 0x28, 0x9e, 0x4e, 0x70, 0x28, 0x66, 0xaf, 0x97, 0x6d, 0xa1, 0xcf, 0xe0, 0x41, 0x46, 0xef, 0xa6, - 0x42, 0x30, 0xda, 0x36, 0x22, 0x76, 0x0e, 0xdd, 0x87, 0xb5, 0x8c, 0x93, 0x85, 0x6f, 0x73, 0xce, - 0xb8, 0x9d, 0x47, 0x8f, 0x60, 0x3d, 0x83, 0x77, 0xd4, 0xda, 0xed, 0x05, 0x34, 0xc4, 0x71, 0x8c, - 0x23, 0xbb, 0x80, 0xd6, 0xe1, 0x6e, 0x46, 0xf6, 0xc8, 0x95, 0xb1, 0x25, 0xe4, 0xc0, 0xbd, 0x39, - 0xe2, 0x4a, 0x65, 0x19, 0x3d, 0x00, 0x34, 0xc7, 0x74, 0xe8, 0x45, 0x10, 0x93, 0xc8, 0x5e, 0x41, - 0x8f, 0xc1, 0xc9, 0x70, 0x03, 0xf6, 0xb3, 0xd6, 0xd8, 0xc5, 0x05, 0x7b, 0x9c, 0x85, 0x38, 0x49, - 0x74, 0x7c, 0xa5, 0xf9, 0x94, 0xba, 0x4c, 0xb4, 0x29, 0x4b, 0x87, 0xa3, 0x83, 0x94, 0x46, 0x89, - 0x0d, 0xd7, 0xb8, 0x0e, 0x25, 0xc2, 0x74, 0xd2, 0x2e, 0xa3, 0x87, 0x70, 0x3f, 0xe3, 0x0e, 0x08, - 0x1f, 0x7f, 0x08, 0x38, 0xd6, 0x26, 0xc3, 0xcd, 0x3f, 0x5a, 0x60, 0x5f, 0xbf, 0x35, 0x91, 0x0d, - 0x95, 0xde, 0xce, 0xaf, 0xbd, 0x63, 0xf3, 0x50, 0xd8, 0x77, 0xd0, 0x5d, 0xa8, 0x29, 0xa4, 0xbf, - 0xe7, 0x76, 0x7a, 0xde, 0xe1, 0x4e, 0xff, 0xd0, 0xb6, 0xd0, 0x1a, 0x54, 0x15, 0x78, 0x74, 0xf2, - 0xce, 0xeb, 0xf4, 0x3b, 0xdf, 0xd8, 0xb9, 0x19, 0x74, 0xdc, 0x73, 0xdb, 0xde, 0x89, 0xdb, 0xb5, - 0xf3, 0x33, 0x63, 0xef, 0x3b, 0x5e, 0x57, 0x1a, 0x2b, 0xa0, 0x7b, 0x60, 0x2b, 0xa4, 0xd7, 0xea, - 0x1f, 0x66, 0xe8, 0xd2, 0x66, 0x0c, 0xb5, 0x6b, 0xcf, 0x95, 0x54, 0x9d, 0x7f, 0xb0, 0xec, 0x3b, - 0xd2, 0xbe, 0x42, 0x66, 0x2e, 0x2d, 0x54, 0x81, 0x62, 0xfb, 0xd4, 0x6b, 0xbb, 0xdd, 0x9d, 0x77, - 0x76, 0x6e, 0xa6, 0x92, 0xd9, 0xcd, 0x4b, 0x6f, 0x0a, 0x99, 0xf7, 0x56, 0xd8, 0x3c, 0x81, 0xb2, - 0xd9, 0x30, 0xe5, 0xa9, 0x0c, 0x2b, 0xde, 0x69, 0xa7, 0xdb, 0x3b, 0xf1, 0xec, 0x3b, 0xd2, 0xa2, - 0x77, 0x7a, 0x7c, 0xe2, 0xc9, 0x93, 0x85, 0x00, 0x96, 0xbd, 0xd3, 0xa3, 0xb6, 0xb7, 0x63, 0xe7, - 0xd0, 0x2a, 0x80, 0x77, 0x7a, 0xd0, 0xe9, 0x76, 0xfa, 0x87, 0xed, 0x7d, 0x3b, 0x8f, 0x6a, 0x50, - 0xf6, 0x4e, 0xdb, 0xa7, 0x9e, 0xbb, 0xb3, 0xbf, 0xe3, 0xed, 0xd8, 0x85, 0xcd, 0xff, 0xe4, 0x60, - 0x4d, 0x4f, 0xdb, 0xbc, 0xf5, 0x75, 0xb8, 0xbb, 0x00, 0xfa, 0xc7, 0x62, 0x84, 0xb9, 0x6d, 0xa1, - 0x06, 0x7c, 0xbe, 0x48, 0x1c, 0x60, 0x7c, 0x7c, 0x81, 0xb9, 0x37, 0xe2, 0x38, 0x19, 0xb1, 0x58, - 0xce, 0xea, 0x53, 0x78, 0xb4, 0x28, 0xb3, 0xc7, 0xe8, 0x19, 0xe1, 0x63, 0xdd, 0x35, 0x3b, 0x2f, - 0xf7, 0x60, 0x51, 0xc0, 0xc5, 0x09, 0x16, 0xfb, 0xf8, 0x82, 0x84, 0xd8, 0x2e, 0xdc, 0xa4, 0x8d, - 0xfe, 0x7b, 0xc6, 0xe5, 0xf4, 0x3e, 0x06, 0x67, 0x91, 0x7e, 0x4f, 0x26, 0xd8, 0x28, 0x2f, 0xdf, - 0x54, 0xee, 0x71, 0x26, 0x70, 0x28, 0xf6, 0x82, 0x38, 0xb6, 0x57, 0xe4, 0xa8, 0x2e, 0xd2, 0x72, - 0x8e, 0xbd, 0xa9, 0x5d, 0xbc, 0x19, 0x75, 0x36, 0x78, 0x7b, 0x23, 0x1c, 0x9e, 0xdb, 0x25, 0x39, - 0x93, 0x8b, 0x02, 0x3b, 0xfa, 0xcd, 0xb7, 0x41, 0xae, 0xe1, 0x35, 0xa7, 0xd9, 0x37, 0xbd, 0x5d, - 0xde, 0xfc, 0x1d, 0xdc, 0xeb, 0x11, 0x7a, 0x14, 0x08, 0x4e, 0xa6, 0xf3, 0x35, 0xae, 0xc3, 0xe3, - 0x8f, 0xe1, 0xfe, 0x5e, 0xca, 0x39, 0xa6, 0xc2, 0xb6, 0xd0, 0x33, 0x78, 0xf2, 0x51, 0x89, 0x2e, - 0xfe, 0x70, 0x40, 0x78, 0x22, 0xec, 0x9c, 0xec, 0xc7, 0xa7, 0x44, 0xfa, 0x38, 0x64, 0x34, 0xb2, - 0xf3, 0x9b, 0xbf, 0x01, 0xe4, 0xe2, 0x90, 0x5d, 0x60, 0x7e, 0xa9, 0xcb, 0xa4, 0xdc, 0xff, 0x00, - 0x9e, 0xdd, 0x44, 0xfd, 0x7e, 0xc8, 0x83, 0xf1, 0x20, 0xc6, 0x91, 0x2c, 0x76, 0x62, 0xdf, 0x91, - 0xf5, 0xfc, 0x88, 0x98, 0x76, 0x68, 0x5b, 0x9b, 0x67, 0x50, 0x93, 0x92, 0xf3, 0x79, 0x3d, 0x84, - 0xfb, 0xd7, 0x20, 0xbf, 0x17, 0x07, 0x84, 0xda, 0x77, 0x64, 0x9d, 0xae, 0x53, 0xda, 0xd2, 0x1b, - 0xdb, 0xfa, 0x34, 0xb9, 0x65, 0xe7, 0xb6, 0x7f, 0x06, 0x2b, 0x1f, 0x88, 0x7a, 0x41, 0xd0, 0xb3, - 0xa6, 0xfe, 0x2f, 0xd8, 0xcc, 0xfe, 0x0b, 0x36, 0xdb, 0x34, 0x1d, 0xff, 0x2a, 0x88, 0x53, 0x7c, - 0x3c, 0x91, 0x77, 0x60, 0xe2, 0x7c, 0xf7, 0x87, 0xbc, 0xfe, 0x52, 0x97, 0x3a, 0x1d, 0xba, 0xfd, - 0x73, 0x28, 0x2a, 0x6d, 0x96, 0x8a, 0xdb, 0xa8, 0xff, 0xdd, 0xa8, 0x2b, 0x97, 0xc7, 0xa9, 0xd8, - 0xfe, 0x06, 0xaa, 0x4a, 0x3f, 0xc2, 0x83, 0x74, 0x78, 0xcb, 0x18, 0xfe, 0x61, 0x8c, 0x94, 0xa5, - 0xe6, 0xbe, 0x54, 0xec, 0xd0, 0xed, 0x0e, 0xac, 0xce, 0x19, 0xba, 0x65, 0x38, 0xff, 0x34, 0x96, - 0x2a, 0x33, 0x4b, 0x32, 0xa6, 0x5f, 0x42, 0x49, 0x99, 0x12, 0x84, 0x5e, 0xde, 0xc6, 0xca, 0xbf, - 0x8c, 0x15, 0x55, 0x09, 0x8f, 0xd0, 0xcb, 0xed, 0x77, 0x50, 0x53, 0x16, 0x06, 0x8c, 0x89, 0x98, - 0xa9, 0x3f, 0x4f, 0xb7, 0xb0, 0xf3, 0x6f, 0x63, 0x47, 0x25, 0xb2, 0x3b, 0x53, 0xdd, 0xfd, 0x0a, - 0x9e, 0x87, 0x6c, 0xdc, 0x4c, 0x02, 0xc1, 0x92, 0x11, 0x89, 0x83, 0x41, 0xd2, 0x14, 0x1c, 0x7f, - 0xcb, 0x78, 0x33, 0x26, 0x83, 0x99, 0xbd, 0x5d, 0xf0, 0x14, 0x28, 0xdb, 0xfb, 0xff, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x70, 0x88, 0xcd, 0x71, 0xe2, 0x0f, 0x00, 0x00, -} diff --git a/accounts/usbwallet/internal/trezor/types.proto b/accounts/usbwallet/internal/trezor/types.proto deleted file mode 100644 index acbe79e3ffd0..000000000000 --- a/accounts/usbwallet/internal/trezor/types.proto +++ /dev/null @@ -1,278 +0,0 @@ -// This file originates from the SatoshiLabs Trezor `common` repository at: -// https://github.com/trezor/trezor-common/blob/master/protob/types.proto -// dated 28.07.2017, commit dd8ec3231fb5f7992360aff9bdfe30bb58130f4b. - -syntax = "proto2"; - -/** - * Types for TREZOR communication - * - * @author Marek Palatinus - * @version 1.2 - */ - -// Sugar for easier handling in Java -option java_package = "com.satoshilabs.trezor.lib.protobuf"; -option java_outer_classname = "TrezorType"; - -import "google/protobuf/descriptor.proto"; - -/** - * Options for specifying message direction and type of wire (normal/debug) - */ -extend google.protobuf.EnumValueOptions { - optional bool wire_in = 50002; // message can be transmitted via wire from PC to TREZOR - optional bool wire_out = 50003; // message can be transmitted via wire from TREZOR to PC - optional bool wire_debug_in = 50004; // message can be transmitted via debug wire from PC to TREZOR - optional bool wire_debug_out = 50005; // message can be transmitted via debug wire from TREZOR to PC - optional bool wire_tiny = 50006; // message is handled by TREZOR when the USB stack is in tiny mode - optional bool wire_bootloader = 50007; // message is only handled by TREZOR Bootloader -} - -/** - * Type of failures returned by Failure message - * @used_in Failure - */ -enum FailureType { - Failure_UnexpectedMessage = 1; - Failure_ButtonExpected = 2; - Failure_DataError = 3; - Failure_ActionCancelled = 4; - Failure_PinExpected = 5; - Failure_PinCancelled = 6; - Failure_PinInvalid = 7; - Failure_InvalidSignature = 8; - Failure_ProcessError = 9; - Failure_NotEnoughFunds = 10; - Failure_NotInitialized = 11; - Failure_FirmwareError = 99; -} - -/** - * Type of script which will be used for transaction output - * @used_in TxOutputType - */ -enum OutputScriptType { - PAYTOADDRESS = 0; // used for all addresses (bitcoin, p2sh, witness) - PAYTOSCRIPTHASH = 1; // p2sh address (deprecated; use PAYTOADDRESS) - PAYTOMULTISIG = 2; // only for change output - PAYTOOPRETURN = 3; // op_return - PAYTOWITNESS = 4; // only for change output - PAYTOP2SHWITNESS = 5; // only for change output -} - -/** - * Type of script which will be used for transaction output - * @used_in TxInputType - */ -enum InputScriptType { - SPENDADDRESS = 0; // standard p2pkh address - SPENDMULTISIG = 1; // p2sh multisig address - EXTERNAL = 2; // reserved for external inputs (coinjoin) - SPENDWITNESS = 3; // native segwit - SPENDP2SHWITNESS = 4; // segwit over p2sh (backward compatible) -} - -/** - * Type of information required by transaction signing process - * @used_in TxRequest - */ -enum RequestType { - TXINPUT = 0; - TXOUTPUT = 1; - TXMETA = 2; - TXFINISHED = 3; - TXEXTRADATA = 4; -} - -/** - * Type of button request - * @used_in ButtonRequest - */ -enum ButtonRequestType { - ButtonRequest_Other = 1; - ButtonRequest_FeeOverThreshold = 2; - ButtonRequest_ConfirmOutput = 3; - ButtonRequest_ResetDevice = 4; - ButtonRequest_ConfirmWord = 5; - ButtonRequest_WipeDevice = 6; - ButtonRequest_ProtectCall = 7; - ButtonRequest_SignTx = 8; - ButtonRequest_FirmwareCheck = 9; - ButtonRequest_Address = 10; - ButtonRequest_PublicKey = 11; -} - -/** - * Type of PIN request - * @used_in PinMatrixRequest - */ -enum PinMatrixRequestType { - PinMatrixRequestType_Current = 1; - PinMatrixRequestType_NewFirst = 2; - PinMatrixRequestType_NewSecond = 3; -} - -/** - * Type of recovery procedure. These should be used as bitmask, e.g., - * `RecoveryDeviceType_ScrambledWords | RecoveryDeviceType_Matrix` - * listing every method supported by the host computer. - * - * Note that ScrambledWords must be supported by every implementation - * for backward compatibility; there is no way to not support it. - * - * @used_in RecoveryDevice - */ -enum RecoveryDeviceType { - // use powers of two when extending this field - RecoveryDeviceType_ScrambledWords = 0; // words in scrambled order - RecoveryDeviceType_Matrix = 1; // matrix recovery type -} - -/** - * Type of Recovery Word request - * @used_in WordRequest - */ -enum WordRequestType { - WordRequestType_Plain = 0; - WordRequestType_Matrix9 = 1; - WordRequestType_Matrix6 = 2; -} - -/** - * Structure representing BIP32 (hierarchical deterministic) node - * Used for imports of private key into the device and exporting public key out of device - * @used_in PublicKey - * @used_in LoadDevice - * @used_in DebugLinkState - * @used_in Storage - */ -message HDNodeType { - required uint32 depth = 1; - required uint32 fingerprint = 2; - required uint32 child_num = 3; - required bytes chain_code = 4; - optional bytes private_key = 5; - optional bytes public_key = 6; -} - -message HDNodePathType { - required HDNodeType node = 1; // BIP-32 node in deserialized form - repeated uint32 address_n = 2; // BIP-32 path to derive the key from node -} - -/** - * Structure representing Coin - * @used_in Features - */ -message CoinType { - optional string coin_name = 1; - optional string coin_shortcut = 2; - optional uint32 address_type = 3 [default=0]; - optional uint64 maxfee_kb = 4; - optional uint32 address_type_p2sh = 5 [default=5]; - optional string signed_message_header = 8; - optional uint32 xpub_magic = 9 [default=76067358]; // default=0x0488b21e - optional uint32 xprv_magic = 10 [default=76066276]; // default=0x0488ade4 - optional bool segwit = 11; - optional uint32 forkid = 12; -} - -/** - * Type of redeem script used in input - * @used_in TxInputType - */ -message MultisigRedeemScriptType { - repeated HDNodePathType pubkeys = 1; // pubkeys from multisig address (sorted lexicographically) - repeated bytes signatures = 2; // existing signatures for partially signed input - optional uint32 m = 3; // "m" from n, how many valid signatures is necessary for spending -} - -/** - * Structure representing transaction input - * @used_in SimpleSignTx - * @used_in TransactionType - */ -message TxInputType { - repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node - required bytes prev_hash = 2; // hash of previous transaction output to spend by this input - required uint32 prev_index = 3; // index of previous output to spend - optional bytes script_sig = 4; // script signature, unset for tx to sign - optional uint32 sequence = 5 [default=4294967295]; // sequence (default=0xffffffff) - optional InputScriptType script_type = 6 [default=SPENDADDRESS]; // defines template of input script - optional MultisigRedeemScriptType multisig = 7; // Filled if input is going to spend multisig tx - optional uint64 amount = 8; // amount of previous transaction output (for segwit only) -} - -/** - * Structure representing transaction output - * @used_in SimpleSignTx - * @used_in TransactionType - */ -message TxOutputType { - optional string address = 1; // target coin address in Base58 encoding - repeated uint32 address_n = 2; // BIP-32 path to derive the key from master node; has higher priority than "address" - required uint64 amount = 3; // amount to spend in satoshis - required OutputScriptType script_type = 4; // output script type - optional MultisigRedeemScriptType multisig = 5; // defines multisig address; script_type must be PAYTOMULTISIG - optional bytes op_return_data = 6; // defines op_return data; script_type must be PAYTOOPRETURN, amount must be 0 -} - -/** - * Structure representing compiled transaction output - * @used_in TransactionType - */ -message TxOutputBinType { - required uint64 amount = 1; - required bytes script_pubkey = 2; -} - -/** - * Structure representing transaction - * @used_in SimpleSignTx - */ -message TransactionType { - optional uint32 version = 1; - repeated TxInputType inputs = 2; - repeated TxOutputBinType bin_outputs = 3; - repeated TxOutputType outputs = 5; - optional uint32 lock_time = 4; - optional uint32 inputs_cnt = 6; - optional uint32 outputs_cnt = 7; - optional bytes extra_data = 8; - optional uint32 extra_data_len = 9; -} - -/** - * Structure representing request details - * @used_in TxRequest - */ -message TxRequestDetailsType { - optional uint32 request_index = 1; // device expects TxAck message from the computer - optional bytes tx_hash = 2; // tx_hash of requested transaction - optional uint32 extra_data_len = 3; // length of requested extra data - optional uint32 extra_data_offset = 4; // offset of requested extra data -} - -/** - * Structure representing serialized data - * @used_in TxRequest - */ -message TxRequestSerializedType { - optional uint32 signature_index = 1; // 'signature' field contains signed input of this index - optional bytes signature = 2; // signature of the signature_index input - optional bytes serialized_tx = 3; // part of serialized and signed transaction -} - -/** - * Structure representing identity data - * @used_in IdentityType - */ -message IdentityType { - optional string proto = 1; // proto part of URI - optional string user = 2; // user part of URI - optional string host = 3; // host part of URI - optional string port = 4; // port part of URI - optional string path = 5; // path part of URI - optional uint32 index = 6 [default=0]; // identity index -} diff --git a/accounts/usbwallet/ledger.go b/accounts/usbwallet/ledger.go index 2583fbc4daa9..c30903b5b769 100644 --- a/accounts/usbwallet/ledger.go +++ b/accounts/usbwallet/ledger.go @@ -257,7 +257,9 @@ func (w *ledgerDriver) ledgerDerive(derivationPath []uint32) (common.Address, er // Decode the hex sting into an Ethereum address and return var address common.Address - hex.Decode(address[:], hexstr) + if _, err = hex.Decode(address[:], hexstr); err != nil { + return common.Address{}, err + } return address, nil } @@ -350,7 +352,7 @@ func (w *ledgerDriver) ledgerSign(derivationPath []uint32, tx *types.Transaction signer = new(types.HomesteadSigner) } else { signer = types.NewEIP155Signer(chainID) - signature[64] = signature[64] - byte(chainID.Uint64()*2+35) + signature[64] -= byte(chainID.Uint64()*2 + 35) } signed, err := tx.WithSignature(signer, signature) if err != nil { diff --git a/accounts/usbwallet/trezor.go b/accounts/usbwallet/trezor.go index b84a955992ff..1892097baf65 100644 --- a/accounts/usbwallet/trezor.go +++ b/accounts/usbwallet/trezor.go @@ -28,7 +28,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/usbwallet/internal/trezor" + "github.com/ethereum/go-ethereum/accounts/usbwallet/trezor" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" @@ -41,6 +41,9 @@ import ( // encoded passphrase. var ErrTrezorPINNeeded = errors.New("trezor: pin needed") +// ErrTrezorPassphraseNeeded is returned if opening the trezor requires a passphrase +var ErrTrezorPassphraseNeeded = errors.New("trezor: passphrase needed") + // errTrezorReplyInvalidHeader is the error message returned by a Trezor data exchange // if the device replies with a mismatching header. This usually means the device // is in browser mode. @@ -48,12 +51,13 @@ var errTrezorReplyInvalidHeader = errors.New("trezor: invalid reply header") // trezorDriver implements the communication with a Trezor hardware wallet. type trezorDriver struct { - device io.ReadWriter // USB device connection to communicate through - version [3]uint32 // Current version of the Trezor firmware - label string // Current textual label of the Trezor device - pinwait bool // Flags whether the device is waiting for PIN entry - failure error // Any failure that would make the device unusable - log log.Logger // Contextual logger to tag the trezor with its id + device io.ReadWriter // USB device connection to communicate through + version [3]uint32 // Current version of the Trezor firmware + label string // Current textual label of the Trezor device + pinwait bool // Flags whether the device is waiting for PIN entry + passphrasewait bool // Flags whether the device is waiting for passphrase entry + failure error // Any failure that would make the device unusable + log log.Logger // Contextual logger to tag the trezor with its id } // newTrezorDriver creates a new instance of a Trezor USB protocol driver. @@ -79,19 +83,21 @@ func (w *trezorDriver) Status() (string, error) { } // Open implements usbwallet.driver, attempting to initialize the connection to -// the Trezor hardware wallet. Initializing the Trezor is a two phase operation: +// the Trezor hardware wallet. Initializing the Trezor is a two or three phase operation: // * The first phase is to initialize the connection and read the wallet's -// features. This phase is invoked is the provided passphrase is empty. The +// features. This phase is invoked if the provided passphrase is empty. The // device will display the pinpad as a result and will return an appropriate // error to notify the user that a second open phase is needed. // * The second phase is to unlock access to the Trezor, which is done by the // user actually providing a passphrase mapping a keyboard keypad to the pin // number of the user (shuffled according to the pinpad displayed). +// * If needed the device will ask for passphrase which will require calling +// open again with the actual passphrase (3rd phase) func (w *trezorDriver) Open(device io.ReadWriter, passphrase string) error { w.device, w.failure = device, nil // If phase 1 is requested, init the connection and wait for user callback - if passphrase == "" { + if passphrase == "" && !w.passphrasewait { // If we're already waiting for a PIN entry, insta-return if w.pinwait { return ErrTrezorPINNeeded @@ -104,26 +110,46 @@ func (w *trezorDriver) Open(device io.ReadWriter, passphrase string) error { w.version = [3]uint32{features.GetMajorVersion(), features.GetMinorVersion(), features.GetPatchVersion()} w.label = features.GetLabel() - // Do a manual ping, forcing the device to ask for its PIN + // Do a manual ping, forcing the device to ask for its PIN and Passphrase askPin := true - res, err := w.trezorExchange(&trezor.Ping{PinProtection: &askPin}, new(trezor.PinMatrixRequest), new(trezor.Success)) + askPassphrase := true + res, err := w.trezorExchange(&trezor.Ping{PinProtection: &askPin, PassphraseProtection: &askPassphrase}, new(trezor.PinMatrixRequest), new(trezor.PassphraseRequest), new(trezor.Success)) if err != nil { return err } // Only return the PIN request if the device wasn't unlocked until now - if res == 1 { - return nil // Device responded with trezor.Success + switch res { + case 0: + w.pinwait = true + return ErrTrezorPINNeeded + case 1: + w.pinwait = false + w.passphrasewait = true + return ErrTrezorPassphraseNeeded + case 2: + return nil // responded with trezor.Success } - w.pinwait = true - return ErrTrezorPINNeeded } // Phase 2 requested with actual PIN entry - w.pinwait = false - - if _, err := w.trezorExchange(&trezor.PinMatrixAck{Pin: &passphrase}, new(trezor.Success)); err != nil { - w.failure = err - return err + if w.pinwait { + w.pinwait = false + res, err := w.trezorExchange(&trezor.PinMatrixAck{Pin: &passphrase}, new(trezor.Success), new(trezor.PassphraseRequest)) + if err != nil { + w.failure = err + return err + } + if res == 1 { + w.passphrasewait = true + return ErrTrezorPassphraseNeeded + } + } else if w.passphrasewait { + w.passphrasewait = false + if _, err := w.trezorExchange(&trezor.PassphraseAck{Passphrase: &passphrase}, new(trezor.Success)); err != nil { + w.failure = err + return err + } } + return nil } @@ -166,7 +192,13 @@ func (w *trezorDriver) trezorDerive(derivationPath []uint32) (common.Address, er if _, err := w.trezorExchange(&trezor.EthereumGetAddress{AddressN: derivationPath}, address); err != nil { return common.Address{}, err } - return common.BytesToAddress(address.GetAddress()), nil + if addr := address.GetAddressBin(); len(addr) > 0 { // Older firmwares use binary fomats + return common.BytesToAddress(addr), nil + } + if addr := address.GetAddressHex(); len(addr) > 0 { // Newer firmwares use hexadecimal fomats + return common.HexToAddress(addr), nil + } + return common.Address{}, errors.New("missing derived address") } // trezorSign sends the transaction to the Trezor wallet, and waits for the user @@ -185,7 +217,10 @@ func (w *trezorDriver) trezorSign(derivationPath []uint32, tx *types.Transaction DataLength: &length, } if to := tx.To(); to != nil { - request.To = (*to)[:] // Non contract deploy, set recipient explicitly + // Non contract deploy, set recipient explicitly + hex := to.Hex() + request.ToHex = &hex // Newer firmwares (old will ignore) + request.ToBin = (*to)[:] // Older firmwares (new will ignore) } if length > 1024 { // Send the data chunked if that was requested request.DataInitialChunk, data = data[:1024], data[1024:] @@ -221,7 +256,7 @@ func (w *trezorDriver) trezorSign(derivationPath []uint32, tx *types.Transaction signer = new(types.HomesteadSigner) } else { signer = types.NewEIP155Signer(chainID) - signature[64] = signature[64] - byte(chainID.Uint64()*2+35) + signature[64] -= byte(chainID.Uint64()*2 + 35) } // Inject the final signature into the transaction and sanity check the sender signed, err := tx.WithSignature(signer, signature) diff --git a/accounts/usbwallet/trezor/messages-common.pb.go b/accounts/usbwallet/trezor/messages-common.pb.go new file mode 100644 index 000000000000..304bec0e360a --- /dev/null +++ b/accounts/usbwallet/trezor/messages-common.pb.go @@ -0,0 +1,811 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: messages-common.proto + +package trezor + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type Failure_FailureType int32 + +const ( + Failure_Failure_UnexpectedMessage Failure_FailureType = 1 + Failure_Failure_ButtonExpected Failure_FailureType = 2 + Failure_Failure_DataError Failure_FailureType = 3 + Failure_Failure_ActionCancelled Failure_FailureType = 4 + Failure_Failure_PinExpected Failure_FailureType = 5 + Failure_Failure_PinCancelled Failure_FailureType = 6 + Failure_Failure_PinInvalid Failure_FailureType = 7 + Failure_Failure_InvalidSignature Failure_FailureType = 8 + Failure_Failure_ProcessError Failure_FailureType = 9 + Failure_Failure_NotEnoughFunds Failure_FailureType = 10 + Failure_Failure_NotInitialized Failure_FailureType = 11 + Failure_Failure_PinMismatch Failure_FailureType = 12 + Failure_Failure_FirmwareError Failure_FailureType = 99 +) + +var Failure_FailureType_name = map[int32]string{ + 1: "Failure_UnexpectedMessage", + 2: "Failure_ButtonExpected", + 3: "Failure_DataError", + 4: "Failure_ActionCancelled", + 5: "Failure_PinExpected", + 6: "Failure_PinCancelled", + 7: "Failure_PinInvalid", + 8: "Failure_InvalidSignature", + 9: "Failure_ProcessError", + 10: "Failure_NotEnoughFunds", + 11: "Failure_NotInitialized", + 12: "Failure_PinMismatch", + 99: "Failure_FirmwareError", +} + +var Failure_FailureType_value = map[string]int32{ + "Failure_UnexpectedMessage": 1, + "Failure_ButtonExpected": 2, + "Failure_DataError": 3, + "Failure_ActionCancelled": 4, + "Failure_PinExpected": 5, + "Failure_PinCancelled": 6, + "Failure_PinInvalid": 7, + "Failure_InvalidSignature": 8, + "Failure_ProcessError": 9, + "Failure_NotEnoughFunds": 10, + "Failure_NotInitialized": 11, + "Failure_PinMismatch": 12, + "Failure_FirmwareError": 99, +} + +func (x Failure_FailureType) Enum() *Failure_FailureType { + p := new(Failure_FailureType) + *p = x + return p +} + +func (x Failure_FailureType) String() string { + return proto.EnumName(Failure_FailureType_name, int32(x)) +} + +func (x *Failure_FailureType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Failure_FailureType_value, data, "Failure_FailureType") + if err != nil { + return err + } + *x = Failure_FailureType(value) + return nil +} + +func (Failure_FailureType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{1, 0} +} + +//* +// Type of button request +type ButtonRequest_ButtonRequestType int32 + +const ( + ButtonRequest_ButtonRequest_Other ButtonRequest_ButtonRequestType = 1 + ButtonRequest_ButtonRequest_FeeOverThreshold ButtonRequest_ButtonRequestType = 2 + ButtonRequest_ButtonRequest_ConfirmOutput ButtonRequest_ButtonRequestType = 3 + ButtonRequest_ButtonRequest_ResetDevice ButtonRequest_ButtonRequestType = 4 + ButtonRequest_ButtonRequest_ConfirmWord ButtonRequest_ButtonRequestType = 5 + ButtonRequest_ButtonRequest_WipeDevice ButtonRequest_ButtonRequestType = 6 + ButtonRequest_ButtonRequest_ProtectCall ButtonRequest_ButtonRequestType = 7 + ButtonRequest_ButtonRequest_SignTx ButtonRequest_ButtonRequestType = 8 + ButtonRequest_ButtonRequest_FirmwareCheck ButtonRequest_ButtonRequestType = 9 + ButtonRequest_ButtonRequest_Address ButtonRequest_ButtonRequestType = 10 + ButtonRequest_ButtonRequest_PublicKey ButtonRequest_ButtonRequestType = 11 + ButtonRequest_ButtonRequest_MnemonicWordCount ButtonRequest_ButtonRequestType = 12 + ButtonRequest_ButtonRequest_MnemonicInput ButtonRequest_ButtonRequestType = 13 + ButtonRequest_ButtonRequest_PassphraseType ButtonRequest_ButtonRequestType = 14 + ButtonRequest_ButtonRequest_UnknownDerivationPath ButtonRequest_ButtonRequestType = 15 +) + +var ButtonRequest_ButtonRequestType_name = map[int32]string{ + 1: "ButtonRequest_Other", + 2: "ButtonRequest_FeeOverThreshold", + 3: "ButtonRequest_ConfirmOutput", + 4: "ButtonRequest_ResetDevice", + 5: "ButtonRequest_ConfirmWord", + 6: "ButtonRequest_WipeDevice", + 7: "ButtonRequest_ProtectCall", + 8: "ButtonRequest_SignTx", + 9: "ButtonRequest_FirmwareCheck", + 10: "ButtonRequest_Address", + 11: "ButtonRequest_PublicKey", + 12: "ButtonRequest_MnemonicWordCount", + 13: "ButtonRequest_MnemonicInput", + 14: "ButtonRequest_PassphraseType", + 15: "ButtonRequest_UnknownDerivationPath", +} + +var ButtonRequest_ButtonRequestType_value = map[string]int32{ + "ButtonRequest_Other": 1, + "ButtonRequest_FeeOverThreshold": 2, + "ButtonRequest_ConfirmOutput": 3, + "ButtonRequest_ResetDevice": 4, + "ButtonRequest_ConfirmWord": 5, + "ButtonRequest_WipeDevice": 6, + "ButtonRequest_ProtectCall": 7, + "ButtonRequest_SignTx": 8, + "ButtonRequest_FirmwareCheck": 9, + "ButtonRequest_Address": 10, + "ButtonRequest_PublicKey": 11, + "ButtonRequest_MnemonicWordCount": 12, + "ButtonRequest_MnemonicInput": 13, + "ButtonRequest_PassphraseType": 14, + "ButtonRequest_UnknownDerivationPath": 15, +} + +func (x ButtonRequest_ButtonRequestType) Enum() *ButtonRequest_ButtonRequestType { + p := new(ButtonRequest_ButtonRequestType) + *p = x + return p +} + +func (x ButtonRequest_ButtonRequestType) String() string { + return proto.EnumName(ButtonRequest_ButtonRequestType_name, int32(x)) +} + +func (x *ButtonRequest_ButtonRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ButtonRequest_ButtonRequestType_value, data, "ButtonRequest_ButtonRequestType") + if err != nil { + return err + } + *x = ButtonRequest_ButtonRequestType(value) + return nil +} + +func (ButtonRequest_ButtonRequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{2, 0} +} + +//* +// Type of PIN request +type PinMatrixRequest_PinMatrixRequestType int32 + +const ( + PinMatrixRequest_PinMatrixRequestType_Current PinMatrixRequest_PinMatrixRequestType = 1 + PinMatrixRequest_PinMatrixRequestType_NewFirst PinMatrixRequest_PinMatrixRequestType = 2 + PinMatrixRequest_PinMatrixRequestType_NewSecond PinMatrixRequest_PinMatrixRequestType = 3 +) + +var PinMatrixRequest_PinMatrixRequestType_name = map[int32]string{ + 1: "PinMatrixRequestType_Current", + 2: "PinMatrixRequestType_NewFirst", + 3: "PinMatrixRequestType_NewSecond", +} + +var PinMatrixRequest_PinMatrixRequestType_value = map[string]int32{ + "PinMatrixRequestType_Current": 1, + "PinMatrixRequestType_NewFirst": 2, + "PinMatrixRequestType_NewSecond": 3, +} + +func (x PinMatrixRequest_PinMatrixRequestType) Enum() *PinMatrixRequest_PinMatrixRequestType { + p := new(PinMatrixRequest_PinMatrixRequestType) + *p = x + return p +} + +func (x PinMatrixRequest_PinMatrixRequestType) String() string { + return proto.EnumName(PinMatrixRequest_PinMatrixRequestType_name, int32(x)) +} + +func (x *PinMatrixRequest_PinMatrixRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(PinMatrixRequest_PinMatrixRequestType_value, data, "PinMatrixRequest_PinMatrixRequestType") + if err != nil { + return err + } + *x = PinMatrixRequest_PinMatrixRequestType(value) + return nil +} + +func (PinMatrixRequest_PinMatrixRequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{4, 0} +} + +//* +// Response: Success of the previous request +// @end +type Success struct { + Message *string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Success) Reset() { *m = Success{} } +func (m *Success) String() string { return proto.CompactTextString(m) } +func (*Success) ProtoMessage() {} +func (*Success) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{0} +} + +func (m *Success) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Success.Unmarshal(m, b) +} +func (m *Success) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Success.Marshal(b, m, deterministic) +} +func (m *Success) XXX_Merge(src proto.Message) { + xxx_messageInfo_Success.Merge(m, src) +} +func (m *Success) XXX_Size() int { + return xxx_messageInfo_Success.Size(m) +} +func (m *Success) XXX_DiscardUnknown() { + xxx_messageInfo_Success.DiscardUnknown(m) +} + +var xxx_messageInfo_Success proto.InternalMessageInfo + +func (m *Success) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +//* +// Response: Failure of the previous request +// @end +type Failure struct { + Code *Failure_FailureType `protobuf:"varint,1,opt,name=code,enum=hw.trezor.messages.common.Failure_FailureType" json:"code,omitempty"` + Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Failure) Reset() { *m = Failure{} } +func (m *Failure) String() string { return proto.CompactTextString(m) } +func (*Failure) ProtoMessage() {} +func (*Failure) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{1} +} + +func (m *Failure) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Failure.Unmarshal(m, b) +} +func (m *Failure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Failure.Marshal(b, m, deterministic) +} +func (m *Failure) XXX_Merge(src proto.Message) { + xxx_messageInfo_Failure.Merge(m, src) +} +func (m *Failure) XXX_Size() int { + return xxx_messageInfo_Failure.Size(m) +} +func (m *Failure) XXX_DiscardUnknown() { + xxx_messageInfo_Failure.DiscardUnknown(m) +} + +var xxx_messageInfo_Failure proto.InternalMessageInfo + +func (m *Failure) GetCode() Failure_FailureType { + if m != nil && m.Code != nil { + return *m.Code + } + return Failure_Failure_UnexpectedMessage +} + +func (m *Failure) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +//* +// Response: Device is waiting for HW button press. +// @auxstart +// @next ButtonAck +type ButtonRequest struct { + Code *ButtonRequest_ButtonRequestType `protobuf:"varint,1,opt,name=code,enum=hw.trezor.messages.common.ButtonRequest_ButtonRequestType" json:"code,omitempty"` + Data *string `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ButtonRequest) Reset() { *m = ButtonRequest{} } +func (m *ButtonRequest) String() string { return proto.CompactTextString(m) } +func (*ButtonRequest) ProtoMessage() {} +func (*ButtonRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{2} +} + +func (m *ButtonRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ButtonRequest.Unmarshal(m, b) +} +func (m *ButtonRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ButtonRequest.Marshal(b, m, deterministic) +} +func (m *ButtonRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ButtonRequest.Merge(m, src) +} +func (m *ButtonRequest) XXX_Size() int { + return xxx_messageInfo_ButtonRequest.Size(m) +} +func (m *ButtonRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ButtonRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ButtonRequest proto.InternalMessageInfo + +func (m *ButtonRequest) GetCode() ButtonRequest_ButtonRequestType { + if m != nil && m.Code != nil { + return *m.Code + } + return ButtonRequest_ButtonRequest_Other +} + +func (m *ButtonRequest) GetData() string { + if m != nil && m.Data != nil { + return *m.Data + } + return "" +} + +//* +// Request: Computer agrees to wait for HW button press +// @auxend +type ButtonAck struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ButtonAck) Reset() { *m = ButtonAck{} } +func (m *ButtonAck) String() string { return proto.CompactTextString(m) } +func (*ButtonAck) ProtoMessage() {} +func (*ButtonAck) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{3} +} + +func (m *ButtonAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ButtonAck.Unmarshal(m, b) +} +func (m *ButtonAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ButtonAck.Marshal(b, m, deterministic) +} +func (m *ButtonAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_ButtonAck.Merge(m, src) +} +func (m *ButtonAck) XXX_Size() int { + return xxx_messageInfo_ButtonAck.Size(m) +} +func (m *ButtonAck) XXX_DiscardUnknown() { + xxx_messageInfo_ButtonAck.DiscardUnknown(m) +} + +var xxx_messageInfo_ButtonAck proto.InternalMessageInfo + +//* +// Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme +// @auxstart +// @next PinMatrixAck +type PinMatrixRequest struct { + Type *PinMatrixRequest_PinMatrixRequestType `protobuf:"varint,1,opt,name=type,enum=hw.trezor.messages.common.PinMatrixRequest_PinMatrixRequestType" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PinMatrixRequest) Reset() { *m = PinMatrixRequest{} } +func (m *PinMatrixRequest) String() string { return proto.CompactTextString(m) } +func (*PinMatrixRequest) ProtoMessage() {} +func (*PinMatrixRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{4} +} + +func (m *PinMatrixRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PinMatrixRequest.Unmarshal(m, b) +} +func (m *PinMatrixRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PinMatrixRequest.Marshal(b, m, deterministic) +} +func (m *PinMatrixRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PinMatrixRequest.Merge(m, src) +} +func (m *PinMatrixRequest) XXX_Size() int { + return xxx_messageInfo_PinMatrixRequest.Size(m) +} +func (m *PinMatrixRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PinMatrixRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PinMatrixRequest proto.InternalMessageInfo + +func (m *PinMatrixRequest) GetType() PinMatrixRequest_PinMatrixRequestType { + if m != nil && m.Type != nil { + return *m.Type + } + return PinMatrixRequest_PinMatrixRequestType_Current +} + +//* +// Request: Computer responds with encoded PIN +// @auxend +type PinMatrixAck struct { + Pin *string `protobuf:"bytes,1,req,name=pin" json:"pin,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PinMatrixAck) Reset() { *m = PinMatrixAck{} } +func (m *PinMatrixAck) String() string { return proto.CompactTextString(m) } +func (*PinMatrixAck) ProtoMessage() {} +func (*PinMatrixAck) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{5} +} + +func (m *PinMatrixAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PinMatrixAck.Unmarshal(m, b) +} +func (m *PinMatrixAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PinMatrixAck.Marshal(b, m, deterministic) +} +func (m *PinMatrixAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_PinMatrixAck.Merge(m, src) +} +func (m *PinMatrixAck) XXX_Size() int { + return xxx_messageInfo_PinMatrixAck.Size(m) +} +func (m *PinMatrixAck) XXX_DiscardUnknown() { + xxx_messageInfo_PinMatrixAck.DiscardUnknown(m) +} + +var xxx_messageInfo_PinMatrixAck proto.InternalMessageInfo + +func (m *PinMatrixAck) GetPin() string { + if m != nil && m.Pin != nil { + return *m.Pin + } + return "" +} + +//* +// Response: Device awaits encryption passphrase +// @auxstart +// @next PassphraseAck +type PassphraseRequest struct { + OnDevice *bool `protobuf:"varint,1,opt,name=on_device,json=onDevice" json:"on_device,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseRequest) Reset() { *m = PassphraseRequest{} } +func (m *PassphraseRequest) String() string { return proto.CompactTextString(m) } +func (*PassphraseRequest) ProtoMessage() {} +func (*PassphraseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{6} +} + +func (m *PassphraseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PassphraseRequest.Unmarshal(m, b) +} +func (m *PassphraseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PassphraseRequest.Marshal(b, m, deterministic) +} +func (m *PassphraseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseRequest.Merge(m, src) +} +func (m *PassphraseRequest) XXX_Size() int { + return xxx_messageInfo_PassphraseRequest.Size(m) +} +func (m *PassphraseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseRequest proto.InternalMessageInfo + +func (m *PassphraseRequest) GetOnDevice() bool { + if m != nil && m.OnDevice != nil { + return *m.OnDevice + } + return false +} + +//* +// Request: Send passphrase back +// @next PassphraseStateRequest +type PassphraseAck struct { + Passphrase *string `protobuf:"bytes,1,opt,name=passphrase" json:"passphrase,omitempty"` + State []byte `protobuf:"bytes,2,opt,name=state" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseAck) Reset() { *m = PassphraseAck{} } +func (m *PassphraseAck) String() string { return proto.CompactTextString(m) } +func (*PassphraseAck) ProtoMessage() {} +func (*PassphraseAck) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{7} +} + +func (m *PassphraseAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PassphraseAck.Unmarshal(m, b) +} +func (m *PassphraseAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PassphraseAck.Marshal(b, m, deterministic) +} +func (m *PassphraseAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseAck.Merge(m, src) +} +func (m *PassphraseAck) XXX_Size() int { + return xxx_messageInfo_PassphraseAck.Size(m) +} +func (m *PassphraseAck) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseAck.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseAck proto.InternalMessageInfo + +func (m *PassphraseAck) GetPassphrase() string { + if m != nil && m.Passphrase != nil { + return *m.Passphrase + } + return "" +} + +func (m *PassphraseAck) GetState() []byte { + if m != nil { + return m.State + } + return nil +} + +//* +// Response: Device awaits passphrase state +// @next PassphraseStateAck +type PassphraseStateRequest struct { + State []byte `protobuf:"bytes,1,opt,name=state" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseStateRequest) Reset() { *m = PassphraseStateRequest{} } +func (m *PassphraseStateRequest) String() string { return proto.CompactTextString(m) } +func (*PassphraseStateRequest) ProtoMessage() {} +func (*PassphraseStateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{8} +} + +func (m *PassphraseStateRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PassphraseStateRequest.Unmarshal(m, b) +} +func (m *PassphraseStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PassphraseStateRequest.Marshal(b, m, deterministic) +} +func (m *PassphraseStateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseStateRequest.Merge(m, src) +} +func (m *PassphraseStateRequest) XXX_Size() int { + return xxx_messageInfo_PassphraseStateRequest.Size(m) +} +func (m *PassphraseStateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseStateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseStateRequest proto.InternalMessageInfo + +func (m *PassphraseStateRequest) GetState() []byte { + if m != nil { + return m.State + } + return nil +} + +//* +// Request: Send passphrase state back +// @auxend +type PassphraseStateAck struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseStateAck) Reset() { *m = PassphraseStateAck{} } +func (m *PassphraseStateAck) String() string { return proto.CompactTextString(m) } +func (*PassphraseStateAck) ProtoMessage() {} +func (*PassphraseStateAck) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{9} +} + +func (m *PassphraseStateAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PassphraseStateAck.Unmarshal(m, b) +} +func (m *PassphraseStateAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PassphraseStateAck.Marshal(b, m, deterministic) +} +func (m *PassphraseStateAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseStateAck.Merge(m, src) +} +func (m *PassphraseStateAck) XXX_Size() int { + return xxx_messageInfo_PassphraseStateAck.Size(m) +} +func (m *PassphraseStateAck) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseStateAck.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseStateAck proto.InternalMessageInfo + +//* +// Structure representing BIP32 (hierarchical deterministic) node +// Used for imports of private key into the device and exporting public key out of device +// @embed +type HDNodeType struct { + Depth *uint32 `protobuf:"varint,1,req,name=depth" json:"depth,omitempty"` + Fingerprint *uint32 `protobuf:"varint,2,req,name=fingerprint" json:"fingerprint,omitempty"` + ChildNum *uint32 `protobuf:"varint,3,req,name=child_num,json=childNum" json:"child_num,omitempty"` + ChainCode []byte `protobuf:"bytes,4,req,name=chain_code,json=chainCode" json:"chain_code,omitempty"` + PrivateKey []byte `protobuf:"bytes,5,opt,name=private_key,json=privateKey" json:"private_key,omitempty"` + PublicKey []byte `protobuf:"bytes,6,opt,name=public_key,json=publicKey" json:"public_key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HDNodeType) Reset() { *m = HDNodeType{} } +func (m *HDNodeType) String() string { return proto.CompactTextString(m) } +func (*HDNodeType) ProtoMessage() {} +func (*HDNodeType) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{10} +} + +func (m *HDNodeType) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_HDNodeType.Unmarshal(m, b) +} +func (m *HDNodeType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_HDNodeType.Marshal(b, m, deterministic) +} +func (m *HDNodeType) XXX_Merge(src proto.Message) { + xxx_messageInfo_HDNodeType.Merge(m, src) +} +func (m *HDNodeType) XXX_Size() int { + return xxx_messageInfo_HDNodeType.Size(m) +} +func (m *HDNodeType) XXX_DiscardUnknown() { + xxx_messageInfo_HDNodeType.DiscardUnknown(m) +} + +var xxx_messageInfo_HDNodeType proto.InternalMessageInfo + +func (m *HDNodeType) GetDepth() uint32 { + if m != nil && m.Depth != nil { + return *m.Depth + } + return 0 +} + +func (m *HDNodeType) GetFingerprint() uint32 { + if m != nil && m.Fingerprint != nil { + return *m.Fingerprint + } + return 0 +} + +func (m *HDNodeType) GetChildNum() uint32 { + if m != nil && m.ChildNum != nil { + return *m.ChildNum + } + return 0 +} + +func (m *HDNodeType) GetChainCode() []byte { + if m != nil { + return m.ChainCode + } + return nil +} + +func (m *HDNodeType) GetPrivateKey() []byte { + if m != nil { + return m.PrivateKey + } + return nil +} + +func (m *HDNodeType) GetPublicKey() []byte { + if m != nil { + return m.PublicKey + } + return nil +} + +func init() { + proto.RegisterEnum("hw.trezor.messages.common.Failure_FailureType", Failure_FailureType_name, Failure_FailureType_value) + proto.RegisterEnum("hw.trezor.messages.common.ButtonRequest_ButtonRequestType", ButtonRequest_ButtonRequestType_name, ButtonRequest_ButtonRequestType_value) + proto.RegisterEnum("hw.trezor.messages.common.PinMatrixRequest_PinMatrixRequestType", PinMatrixRequest_PinMatrixRequestType_name, PinMatrixRequest_PinMatrixRequestType_value) + proto.RegisterType((*Success)(nil), "hw.trezor.messages.common.Success") + proto.RegisterType((*Failure)(nil), "hw.trezor.messages.common.Failure") + proto.RegisterType((*ButtonRequest)(nil), "hw.trezor.messages.common.ButtonRequest") + proto.RegisterType((*ButtonAck)(nil), "hw.trezor.messages.common.ButtonAck") + proto.RegisterType((*PinMatrixRequest)(nil), "hw.trezor.messages.common.PinMatrixRequest") + proto.RegisterType((*PinMatrixAck)(nil), "hw.trezor.messages.common.PinMatrixAck") + proto.RegisterType((*PassphraseRequest)(nil), "hw.trezor.messages.common.PassphraseRequest") + proto.RegisterType((*PassphraseAck)(nil), "hw.trezor.messages.common.PassphraseAck") + proto.RegisterType((*PassphraseStateRequest)(nil), "hw.trezor.messages.common.PassphraseStateRequest") + proto.RegisterType((*PassphraseStateAck)(nil), "hw.trezor.messages.common.PassphraseStateAck") + proto.RegisterType((*HDNodeType)(nil), "hw.trezor.messages.common.HDNodeType") +} + +func init() { proto.RegisterFile("messages-common.proto", fileDescriptor_aaf30d059fdbc38d) } + +var fileDescriptor_aaf30d059fdbc38d = []byte{ + // 846 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xcd, 0x52, 0x23, 0x37, + 0x10, 0x2e, 0xff, 0x80, 0xed, 0xb6, 0xd9, 0x08, 0xc5, 0x80, 0x09, 0xb0, 0x38, 0xc3, 0x21, 0x5c, + 0xe2, 0x4a, 0xe5, 0x98, 0x53, 0x58, 0x83, 0x2b, 0xd4, 0x16, 0x86, 0x1a, 0xd8, 0xda, 0xa3, 0x4b, + 0xd1, 0xf4, 0x32, 0x2a, 0xcf, 0x48, 0x13, 0x8d, 0x06, 0xf0, 0x5e, 0xf2, 0x6a, 0x79, 0x89, 0xbc, + 0x42, 0xaa, 0x52, 0xb9, 0xe4, 0x11, 0xb6, 0x34, 0x3f, 0x78, 0xc6, 0x66, 0x39, 0xcd, 0xe8, 0xfb, + 0xbe, 0xee, 0x96, 0xba, 0x3f, 0x09, 0x76, 0x42, 0x8c, 0x63, 0x76, 0x8f, 0xf1, 0x8f, 0x5c, 0x85, + 0xa1, 0x92, 0xa3, 0x48, 0x2b, 0xa3, 0xe8, 0xbe, 0xff, 0x38, 0x32, 0x1a, 0x3f, 0x2b, 0x3d, 0x2a, + 0x04, 0xa3, 0x4c, 0xe0, 0x9c, 0x40, 0xeb, 0x36, 0xe1, 0x1c, 0xe3, 0x98, 0x0e, 0xa0, 0x95, 0xb3, + 0x83, 0xda, 0xb0, 0x76, 0xda, 0x71, 0x8b, 0xa5, 0xf3, 0x77, 0x03, 0x5a, 0x13, 0x26, 0x82, 0x44, + 0x23, 0x7d, 0x07, 0x4d, 0xae, 0xbc, 0x4c, 0xf2, 0xe6, 0xe7, 0xd1, 0xe8, 0xab, 0xa9, 0x47, 0x79, + 0x44, 0xf1, 0xbd, 0x5b, 0x44, 0xe8, 0xa6, 0xb1, 0xe5, 0x4a, 0xf5, 0x6a, 0xa5, 0xff, 0xea, 0xd0, + 0x2d, 0xe9, 0xe9, 0x11, 0xec, 0xe7, 0xcb, 0xd9, 0x07, 0x89, 0x4f, 0x11, 0x72, 0x83, 0xde, 0x55, + 0x26, 0x26, 0x35, 0xfa, 0x1d, 0xec, 0x16, 0xf4, 0xbb, 0xc4, 0x18, 0x25, 0x2f, 0x72, 0x09, 0xa9, + 0xd3, 0x1d, 0xd8, 0x2e, 0xb8, 0x73, 0x66, 0xd8, 0x85, 0xd6, 0x4a, 0x93, 0x06, 0x3d, 0x80, 0xbd, + 0x02, 0x3e, 0xe3, 0x46, 0x28, 0x39, 0x66, 0x92, 0x63, 0x10, 0xa0, 0x47, 0x9a, 0x74, 0x0f, 0xbe, + 0x2d, 0xc8, 0x1b, 0xb1, 0x4c, 0xb6, 0x41, 0x07, 0xd0, 0x2f, 0x11, 0xcb, 0x90, 0x4d, 0xba, 0x0b, + 0xb4, 0xc4, 0x5c, 0xca, 0x07, 0x16, 0x08, 0x8f, 0xb4, 0xe8, 0x21, 0x0c, 0x0a, 0x3c, 0x07, 0x6f, + 0xc5, 0xbd, 0x64, 0x26, 0xd1, 0x48, 0xda, 0x95, 0x7c, 0x5a, 0xd9, 0xf6, 0x67, 0xfb, 0xeb, 0x94, + 0x8f, 0x34, 0x55, 0xe6, 0x42, 0xaa, 0xe4, 0xde, 0x9f, 0x24, 0xd2, 0x8b, 0x09, 0xac, 0x70, 0x97, + 0x52, 0x18, 0xc1, 0x02, 0xf1, 0x19, 0x3d, 0xd2, 0x5d, 0xd9, 0xfa, 0x95, 0x88, 0x43, 0x66, 0xb8, + 0x4f, 0x7a, 0x74, 0x1f, 0x76, 0x0a, 0x62, 0x22, 0x74, 0xf8, 0xc8, 0x34, 0x66, 0xb5, 0xb8, 0xf3, + 0x4f, 0x13, 0xb6, 0xb2, 0xbe, 0xb9, 0xf8, 0x47, 0x82, 0xb1, 0xa1, 0xd3, 0xca, 0x74, 0x7f, 0x79, + 0x65, 0xba, 0x95, 0xb8, 0xea, 0xaa, 0x34, 0x69, 0x0a, 0x4d, 0x8f, 0x19, 0x96, 0x8f, 0x39, 0xfd, + 0x77, 0xfe, 0x6f, 0xc0, 0xf6, 0x9a, 0xde, 0xee, 0xbf, 0x02, 0xce, 0xae, 0x8d, 0x8f, 0x9a, 0xd4, + 0xa8, 0x03, 0x6f, 0xab, 0xc4, 0x04, 0xf1, 0xfa, 0x01, 0xf5, 0x9d, 0xaf, 0x31, 0xf6, 0x55, 0x60, + 0x67, 0x7d, 0x0c, 0x07, 0x55, 0xcd, 0x58, 0xc9, 0x4f, 0x42, 0x87, 0xd7, 0x89, 0x89, 0x12, 0x43, + 0x1a, 0xd6, 0x47, 0x55, 0x81, 0x8b, 0x31, 0x9a, 0x73, 0x7c, 0x10, 0x1c, 0x49, 0x73, 0x9d, 0xce, + 0xe3, 0x3f, 0x2a, 0x6d, 0xa7, 0x7f, 0x08, 0x83, 0x2a, 0xfd, 0x51, 0x44, 0x98, 0x07, 0x6f, 0xae, + 0x07, 0xdf, 0x68, 0x65, 0x90, 0x9b, 0x31, 0x0b, 0x02, 0xd2, 0xb2, 0xa3, 0xae, 0xd2, 0xd6, 0x07, + 0x77, 0x4f, 0xa4, 0xbd, 0xbe, 0xeb, 0x62, 0x3e, 0x63, 0x1f, 0xf9, 0x9c, 0x74, 0xec, 0xe8, 0xaa, + 0x82, 0x33, 0xcf, 0xd3, 0x18, 0x5b, 0x2b, 0x1c, 0xc0, 0xde, 0x4a, 0xd1, 0xe4, 0xf7, 0x40, 0xf0, + 0xf7, 0xb8, 0x20, 0x5d, 0x7a, 0x02, 0xc7, 0x55, 0xf2, 0x4a, 0x62, 0xa8, 0xa4, 0xe0, 0xf6, 0x3c, + 0x63, 0x95, 0x48, 0x43, 0x7a, 0xeb, 0xd5, 0x0b, 0xd1, 0xa5, 0xb4, 0x3d, 0xdb, 0xa2, 0x43, 0x38, + 0x5c, 0x29, 0xc1, 0xe2, 0x38, 0xf2, 0x35, 0x8b, 0xd3, 0xbb, 0x49, 0xde, 0xd0, 0x1f, 0xe0, 0xa4, + 0xaa, 0xf8, 0x20, 0xe7, 0x52, 0x3d, 0xca, 0x73, 0xd4, 0xe2, 0x81, 0xd9, 0xcb, 0x75, 0xc3, 0x8c, + 0x4f, 0xbe, 0x71, 0xba, 0xd0, 0xc9, 0x84, 0x67, 0x7c, 0xee, 0xfc, 0x5b, 0x03, 0x62, 0x2d, 0xca, + 0x8c, 0x16, 0x4f, 0x85, 0xf1, 0xee, 0xa0, 0x69, 0x16, 0x51, 0x61, 0xbc, 0x5f, 0x5f, 0x31, 0xde, + 0x6a, 0xe8, 0x1a, 0x90, 0xd9, 0xcf, 0x66, 0x73, 0xfe, 0x84, 0xfe, 0x4b, 0xac, 0x3d, 0xda, 0x4b, + 0xf8, 0x6c, 0x9c, 0x68, 0x8d, 0xd2, 0x90, 0x1a, 0xfd, 0x1e, 0x8e, 0x5e, 0x54, 0x4c, 0xf1, 0x71, + 0x22, 0x74, 0x6c, 0x48, 0xdd, 0x1a, 0xf3, 0x6b, 0x92, 0x5b, 0xe4, 0x4a, 0x7a, 0xa4, 0xe1, 0x0c, + 0xa1, 0xf7, 0xac, 0x39, 0xe3, 0x73, 0x4a, 0xa0, 0x11, 0x09, 0x39, 0xa8, 0x0d, 0xeb, 0xa7, 0x1d, + 0xd7, 0xfe, 0x3a, 0x3f, 0xc1, 0xf6, 0xb2, 0xaf, 0x45, 0x37, 0x0e, 0xa0, 0xa3, 0xe4, 0xcc, 0x4b, + 0x1d, 0x96, 0xb6, 0xa4, 0xed, 0xb6, 0x95, 0xcc, 0x1c, 0xe7, 0x5c, 0xc0, 0xd6, 0x32, 0xc2, 0x26, + 0x7d, 0x0b, 0x10, 0x3d, 0x03, 0xf9, 0xdb, 0x5d, 0x42, 0x68, 0x1f, 0x36, 0x62, 0xc3, 0x4c, 0xf6, + 0xd8, 0xf6, 0xdc, 0x6c, 0xe1, 0x8c, 0x60, 0x77, 0x99, 0xe6, 0xd6, 0x42, 0x45, 0xf5, 0x67, 0x7d, + 0xad, 0xac, 0xef, 0x03, 0x5d, 0xd1, 0xdb, 0x61, 0xfe, 0x55, 0x03, 0xf8, 0xed, 0x7c, 0xaa, 0xbc, + 0xec, 0xbd, 0xee, 0xc3, 0x86, 0x87, 0x91, 0xf1, 0xd3, 0x13, 0x6e, 0xb9, 0xd9, 0x82, 0x0e, 0xa1, + 0xfb, 0x49, 0xc8, 0x7b, 0xd4, 0x91, 0x16, 0xd2, 0x0c, 0xea, 0x29, 0x57, 0x86, 0xec, 0x81, 0xb9, + 0x2f, 0x02, 0x6f, 0x26, 0x93, 0x70, 0xd0, 0x48, 0xf9, 0x76, 0x0a, 0x4c, 0x93, 0x90, 0x1e, 0x01, + 0x70, 0x9f, 0x09, 0x39, 0x4b, 0x9f, 0xa6, 0xe6, 0xb0, 0x7e, 0xda, 0x73, 0x3b, 0x29, 0x32, 0xb6, + 0x6f, 0xcc, 0x31, 0x74, 0xa3, 0xd4, 0x6f, 0x38, 0x9b, 0xe3, 0x62, 0xb0, 0x91, 0x6e, 0x1a, 0x72, + 0xe8, 0x3d, 0x2e, 0x6c, 0x7c, 0x94, 0xde, 0x8e, 0x94, 0xdf, 0x4c, 0xf9, 0x4e, 0x54, 0xdc, 0x97, + 0x2f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x7d, 0x20, 0xa6, 0x35, 0x07, 0x00, 0x00, +} diff --git a/accounts/usbwallet/trezor/messages-common.proto b/accounts/usbwallet/trezor/messages-common.proto new file mode 100644 index 000000000000..75a983b0a3e5 --- /dev/null +++ b/accounts/usbwallet/trezor/messages-common.proto @@ -0,0 +1,147 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/messages-common.proto +// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. + +syntax = "proto2"; +package hw.trezor.messages.common; + +/** + * Response: Success of the previous request + * @end + */ +message Success { + optional string message = 1; // human readable description of action or request-specific payload +} + +/** + * Response: Failure of the previous request + * @end + */ +message Failure { + optional FailureType code = 1; // computer-readable definition of the error state + optional string message = 2; // human-readable message of the error state + enum FailureType { + Failure_UnexpectedMessage = 1; + Failure_ButtonExpected = 2; + Failure_DataError = 3; + Failure_ActionCancelled = 4; + Failure_PinExpected = 5; + Failure_PinCancelled = 6; + Failure_PinInvalid = 7; + Failure_InvalidSignature = 8; + Failure_ProcessError = 9; + Failure_NotEnoughFunds = 10; + Failure_NotInitialized = 11; + Failure_PinMismatch = 12; + Failure_FirmwareError = 99; + } +} + +/** + * Response: Device is waiting for HW button press. + * @auxstart + * @next ButtonAck + */ +message ButtonRequest { + optional ButtonRequestType code = 1; + optional string data = 2; + /** + * Type of button request + */ + enum ButtonRequestType { + ButtonRequest_Other = 1; + ButtonRequest_FeeOverThreshold = 2; + ButtonRequest_ConfirmOutput = 3; + ButtonRequest_ResetDevice = 4; + ButtonRequest_ConfirmWord = 5; + ButtonRequest_WipeDevice = 6; + ButtonRequest_ProtectCall = 7; + ButtonRequest_SignTx = 8; + ButtonRequest_FirmwareCheck = 9; + ButtonRequest_Address = 10; + ButtonRequest_PublicKey = 11; + ButtonRequest_MnemonicWordCount = 12; + ButtonRequest_MnemonicInput = 13; + ButtonRequest_PassphraseType = 14; + ButtonRequest_UnknownDerivationPath = 15; + } +} + +/** + * Request: Computer agrees to wait for HW button press + * @auxend + */ +message ButtonAck { +} + +/** + * Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme + * @auxstart + * @next PinMatrixAck + */ +message PinMatrixRequest { + optional PinMatrixRequestType type = 1; + /** + * Type of PIN request + */ + enum PinMatrixRequestType { + PinMatrixRequestType_Current = 1; + PinMatrixRequestType_NewFirst = 2; + PinMatrixRequestType_NewSecond = 3; + } +} + +/** + * Request: Computer responds with encoded PIN + * @auxend + */ +message PinMatrixAck { + required string pin = 1; // matrix encoded PIN entered by user +} + +/** + * Response: Device awaits encryption passphrase + * @auxstart + * @next PassphraseAck + */ +message PassphraseRequest { + optional bool on_device = 1; // passphrase is being entered on the device +} + +/** + * Request: Send passphrase back + * @next PassphraseStateRequest + */ +message PassphraseAck { + optional string passphrase = 1; + optional bytes state = 2; // expected device state +} + +/** + * Response: Device awaits passphrase state + * @next PassphraseStateAck + */ +message PassphraseStateRequest { + optional bytes state = 1; // actual device state +} + +/** + * Request: Send passphrase state back + * @auxend + */ +message PassphraseStateAck { +} + +/** + * Structure representing BIP32 (hierarchical deterministic) node + * Used for imports of private key into the device and exporting public key out of device + * @embed + */ +message HDNodeType { + required uint32 depth = 1; + required uint32 fingerprint = 2; + required uint32 child_num = 3; + required bytes chain_code = 4; + optional bytes private_key = 5; + optional bytes public_key = 6; +} diff --git a/accounts/usbwallet/trezor/messages-ethereum.pb.go b/accounts/usbwallet/trezor/messages-ethereum.pb.go new file mode 100644 index 000000000000..5d664f5ba447 --- /dev/null +++ b/accounts/usbwallet/trezor/messages-ethereum.pb.go @@ -0,0 +1,698 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: messages-ethereum.proto + +package trezor + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +//* +// Request: Ask device for public key corresponding to address_n path +// @start +// @next EthereumPublicKey +// @next Failure +type EthereumGetPublicKey struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + ShowDisplay *bool `protobuf:"varint,2,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumGetPublicKey) Reset() { *m = EthereumGetPublicKey{} } +func (m *EthereumGetPublicKey) String() string { return proto.CompactTextString(m) } +func (*EthereumGetPublicKey) ProtoMessage() {} +func (*EthereumGetPublicKey) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{0} +} + +func (m *EthereumGetPublicKey) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumGetPublicKey.Unmarshal(m, b) +} +func (m *EthereumGetPublicKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumGetPublicKey.Marshal(b, m, deterministic) +} +func (m *EthereumGetPublicKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumGetPublicKey.Merge(m, src) +} +func (m *EthereumGetPublicKey) XXX_Size() int { + return xxx_messageInfo_EthereumGetPublicKey.Size(m) +} +func (m *EthereumGetPublicKey) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumGetPublicKey.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumGetPublicKey proto.InternalMessageInfo + +func (m *EthereumGetPublicKey) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *EthereumGetPublicKey) GetShowDisplay() bool { + if m != nil && m.ShowDisplay != nil { + return *m.ShowDisplay + } + return false +} + +//* +// Response: Contains public key derived from device private seed +// @end +type EthereumPublicKey struct { + Node *HDNodeType `protobuf:"bytes,1,opt,name=node" json:"node,omitempty"` + Xpub *string `protobuf:"bytes,2,opt,name=xpub" json:"xpub,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumPublicKey) Reset() { *m = EthereumPublicKey{} } +func (m *EthereumPublicKey) String() string { return proto.CompactTextString(m) } +func (*EthereumPublicKey) ProtoMessage() {} +func (*EthereumPublicKey) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{1} +} + +func (m *EthereumPublicKey) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumPublicKey.Unmarshal(m, b) +} +func (m *EthereumPublicKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumPublicKey.Marshal(b, m, deterministic) +} +func (m *EthereumPublicKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumPublicKey.Merge(m, src) +} +func (m *EthereumPublicKey) XXX_Size() int { + return xxx_messageInfo_EthereumPublicKey.Size(m) +} +func (m *EthereumPublicKey) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumPublicKey.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumPublicKey proto.InternalMessageInfo + +func (m *EthereumPublicKey) GetNode() *HDNodeType { + if m != nil { + return m.Node + } + return nil +} + +func (m *EthereumPublicKey) GetXpub() string { + if m != nil && m.Xpub != nil { + return *m.Xpub + } + return "" +} + +//* +// Request: Ask device for Ethereum address corresponding to address_n path +// @start +// @next EthereumAddress +// @next Failure +type EthereumGetAddress struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + ShowDisplay *bool `protobuf:"varint,2,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumGetAddress) Reset() { *m = EthereumGetAddress{} } +func (m *EthereumGetAddress) String() string { return proto.CompactTextString(m) } +func (*EthereumGetAddress) ProtoMessage() {} +func (*EthereumGetAddress) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{2} +} + +func (m *EthereumGetAddress) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumGetAddress.Unmarshal(m, b) +} +func (m *EthereumGetAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumGetAddress.Marshal(b, m, deterministic) +} +func (m *EthereumGetAddress) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumGetAddress.Merge(m, src) +} +func (m *EthereumGetAddress) XXX_Size() int { + return xxx_messageInfo_EthereumGetAddress.Size(m) +} +func (m *EthereumGetAddress) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumGetAddress.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumGetAddress proto.InternalMessageInfo + +func (m *EthereumGetAddress) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *EthereumGetAddress) GetShowDisplay() bool { + if m != nil && m.ShowDisplay != nil { + return *m.ShowDisplay + } + return false +} + +//* +// Response: Contains an Ethereum address derived from device private seed +// @end +type EthereumAddress struct { + AddressBin []byte `protobuf:"bytes,1,opt,name=addressBin" json:"addressBin,omitempty"` + AddressHex *string `protobuf:"bytes,2,opt,name=addressHex" json:"addressHex,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumAddress) Reset() { *m = EthereumAddress{} } +func (m *EthereumAddress) String() string { return proto.CompactTextString(m) } +func (*EthereumAddress) ProtoMessage() {} +func (*EthereumAddress) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{3} +} + +func (m *EthereumAddress) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumAddress.Unmarshal(m, b) +} +func (m *EthereumAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumAddress.Marshal(b, m, deterministic) +} +func (m *EthereumAddress) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumAddress.Merge(m, src) +} +func (m *EthereumAddress) XXX_Size() int { + return xxx_messageInfo_EthereumAddress.Size(m) +} +func (m *EthereumAddress) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumAddress.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumAddress proto.InternalMessageInfo + +func (m *EthereumAddress) GetAddressBin() []byte { + if m != nil { + return m.AddressBin + } + return nil +} + +func (m *EthereumAddress) GetAddressHex() string { + if m != nil && m.AddressHex != nil { + return *m.AddressHex + } + return "" +} + +//* +// Request: Ask device to sign transaction +// All fields are optional from the protocol's point of view. Each field defaults to value `0` if missing. +// Note: the first at most 1024 bytes of data MUST be transmitted as part of this message. +// @start +// @next EthereumTxRequest +// @next Failure +type EthereumSignTx struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Nonce []byte `protobuf:"bytes,2,opt,name=nonce" json:"nonce,omitempty"` + GasPrice []byte `protobuf:"bytes,3,opt,name=gas_price,json=gasPrice" json:"gas_price,omitempty"` + GasLimit []byte `protobuf:"bytes,4,opt,name=gas_limit,json=gasLimit" json:"gas_limit,omitempty"` + ToBin []byte `protobuf:"bytes,5,opt,name=toBin" json:"toBin,omitempty"` + ToHex *string `protobuf:"bytes,11,opt,name=toHex" json:"toHex,omitempty"` + Value []byte `protobuf:"bytes,6,opt,name=value" json:"value,omitempty"` + DataInitialChunk []byte `protobuf:"bytes,7,opt,name=data_initial_chunk,json=dataInitialChunk" json:"data_initial_chunk,omitempty"` + DataLength *uint32 `protobuf:"varint,8,opt,name=data_length,json=dataLength" json:"data_length,omitempty"` + ChainId *uint32 `protobuf:"varint,9,opt,name=chain_id,json=chainId" json:"chain_id,omitempty"` + TxType *uint32 `protobuf:"varint,10,opt,name=tx_type,json=txType" json:"tx_type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumSignTx) Reset() { *m = EthereumSignTx{} } +func (m *EthereumSignTx) String() string { return proto.CompactTextString(m) } +func (*EthereumSignTx) ProtoMessage() {} +func (*EthereumSignTx) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{4} +} + +func (m *EthereumSignTx) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumSignTx.Unmarshal(m, b) +} +func (m *EthereumSignTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumSignTx.Marshal(b, m, deterministic) +} +func (m *EthereumSignTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumSignTx.Merge(m, src) +} +func (m *EthereumSignTx) XXX_Size() int { + return xxx_messageInfo_EthereumSignTx.Size(m) +} +func (m *EthereumSignTx) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumSignTx.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumSignTx proto.InternalMessageInfo + +func (m *EthereumSignTx) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *EthereumSignTx) GetNonce() []byte { + if m != nil { + return m.Nonce + } + return nil +} + +func (m *EthereumSignTx) GetGasPrice() []byte { + if m != nil { + return m.GasPrice + } + return nil +} + +func (m *EthereumSignTx) GetGasLimit() []byte { + if m != nil { + return m.GasLimit + } + return nil +} + +func (m *EthereumSignTx) GetToBin() []byte { + if m != nil { + return m.ToBin + } + return nil +} + +func (m *EthereumSignTx) GetToHex() string { + if m != nil && m.ToHex != nil { + return *m.ToHex + } + return "" +} + +func (m *EthereumSignTx) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *EthereumSignTx) GetDataInitialChunk() []byte { + if m != nil { + return m.DataInitialChunk + } + return nil +} + +func (m *EthereumSignTx) GetDataLength() uint32 { + if m != nil && m.DataLength != nil { + return *m.DataLength + } + return 0 +} + +func (m *EthereumSignTx) GetChainId() uint32 { + if m != nil && m.ChainId != nil { + return *m.ChainId + } + return 0 +} + +func (m *EthereumSignTx) GetTxType() uint32 { + if m != nil && m.TxType != nil { + return *m.TxType + } + return 0 +} + +//* +// Response: Device asks for more data from transaction payload, or returns the signature. +// If data_length is set, device awaits that many more bytes of payload. +// Otherwise, the signature_* fields contain the computed transaction signature. All three fields will be present. +// @end +// @next EthereumTxAck +type EthereumTxRequest struct { + DataLength *uint32 `protobuf:"varint,1,opt,name=data_length,json=dataLength" json:"data_length,omitempty"` + SignatureV *uint32 `protobuf:"varint,2,opt,name=signature_v,json=signatureV" json:"signature_v,omitempty"` + SignatureR []byte `protobuf:"bytes,3,opt,name=signature_r,json=signatureR" json:"signature_r,omitempty"` + SignatureS []byte `protobuf:"bytes,4,opt,name=signature_s,json=signatureS" json:"signature_s,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumTxRequest) Reset() { *m = EthereumTxRequest{} } +func (m *EthereumTxRequest) String() string { return proto.CompactTextString(m) } +func (*EthereumTxRequest) ProtoMessage() {} +func (*EthereumTxRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{5} +} + +func (m *EthereumTxRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumTxRequest.Unmarshal(m, b) +} +func (m *EthereumTxRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumTxRequest.Marshal(b, m, deterministic) +} +func (m *EthereumTxRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumTxRequest.Merge(m, src) +} +func (m *EthereumTxRequest) XXX_Size() int { + return xxx_messageInfo_EthereumTxRequest.Size(m) +} +func (m *EthereumTxRequest) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumTxRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumTxRequest proto.InternalMessageInfo + +func (m *EthereumTxRequest) GetDataLength() uint32 { + if m != nil && m.DataLength != nil { + return *m.DataLength + } + return 0 +} + +func (m *EthereumTxRequest) GetSignatureV() uint32 { + if m != nil && m.SignatureV != nil { + return *m.SignatureV + } + return 0 +} + +func (m *EthereumTxRequest) GetSignatureR() []byte { + if m != nil { + return m.SignatureR + } + return nil +} + +func (m *EthereumTxRequest) GetSignatureS() []byte { + if m != nil { + return m.SignatureS + } + return nil +} + +//* +// Request: Transaction payload data. +// @next EthereumTxRequest +type EthereumTxAck struct { + DataChunk []byte `protobuf:"bytes,1,opt,name=data_chunk,json=dataChunk" json:"data_chunk,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumTxAck) Reset() { *m = EthereumTxAck{} } +func (m *EthereumTxAck) String() string { return proto.CompactTextString(m) } +func (*EthereumTxAck) ProtoMessage() {} +func (*EthereumTxAck) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{6} +} + +func (m *EthereumTxAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumTxAck.Unmarshal(m, b) +} +func (m *EthereumTxAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumTxAck.Marshal(b, m, deterministic) +} +func (m *EthereumTxAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumTxAck.Merge(m, src) +} +func (m *EthereumTxAck) XXX_Size() int { + return xxx_messageInfo_EthereumTxAck.Size(m) +} +func (m *EthereumTxAck) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumTxAck.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumTxAck proto.InternalMessageInfo + +func (m *EthereumTxAck) GetDataChunk() []byte { + if m != nil { + return m.DataChunk + } + return nil +} + +//* +// Request: Ask device to sign message +// @start +// @next EthereumMessageSignature +// @next Failure +type EthereumSignMessage struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Message []byte `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumSignMessage) Reset() { *m = EthereumSignMessage{} } +func (m *EthereumSignMessage) String() string { return proto.CompactTextString(m) } +func (*EthereumSignMessage) ProtoMessage() {} +func (*EthereumSignMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{7} +} + +func (m *EthereumSignMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumSignMessage.Unmarshal(m, b) +} +func (m *EthereumSignMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumSignMessage.Marshal(b, m, deterministic) +} +func (m *EthereumSignMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumSignMessage.Merge(m, src) +} +func (m *EthereumSignMessage) XXX_Size() int { + return xxx_messageInfo_EthereumSignMessage.Size(m) +} +func (m *EthereumSignMessage) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumSignMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumSignMessage proto.InternalMessageInfo + +func (m *EthereumSignMessage) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *EthereumSignMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +//* +// Response: Signed message +// @end +type EthereumMessageSignature struct { + AddressBin []byte `protobuf:"bytes,1,opt,name=addressBin" json:"addressBin,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + AddressHex *string `protobuf:"bytes,3,opt,name=addressHex" json:"addressHex,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumMessageSignature) Reset() { *m = EthereumMessageSignature{} } +func (m *EthereumMessageSignature) String() string { return proto.CompactTextString(m) } +func (*EthereumMessageSignature) ProtoMessage() {} +func (*EthereumMessageSignature) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{8} +} + +func (m *EthereumMessageSignature) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumMessageSignature.Unmarshal(m, b) +} +func (m *EthereumMessageSignature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumMessageSignature.Marshal(b, m, deterministic) +} +func (m *EthereumMessageSignature) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumMessageSignature.Merge(m, src) +} +func (m *EthereumMessageSignature) XXX_Size() int { + return xxx_messageInfo_EthereumMessageSignature.Size(m) +} +func (m *EthereumMessageSignature) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumMessageSignature.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumMessageSignature proto.InternalMessageInfo + +func (m *EthereumMessageSignature) GetAddressBin() []byte { + if m != nil { + return m.AddressBin + } + return nil +} + +func (m *EthereumMessageSignature) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *EthereumMessageSignature) GetAddressHex() string { + if m != nil && m.AddressHex != nil { + return *m.AddressHex + } + return "" +} + +//* +// Request: Ask device to verify message +// @start +// @next Success +// @next Failure +type EthereumVerifyMessage struct { + AddressBin []byte `protobuf:"bytes,1,opt,name=addressBin" json:"addressBin,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + Message []byte `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` + AddressHex *string `protobuf:"bytes,4,opt,name=addressHex" json:"addressHex,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumVerifyMessage) Reset() { *m = EthereumVerifyMessage{} } +func (m *EthereumVerifyMessage) String() string { return proto.CompactTextString(m) } +func (*EthereumVerifyMessage) ProtoMessage() {} +func (*EthereumVerifyMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{9} +} + +func (m *EthereumVerifyMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumVerifyMessage.Unmarshal(m, b) +} +func (m *EthereumVerifyMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumVerifyMessage.Marshal(b, m, deterministic) +} +func (m *EthereumVerifyMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumVerifyMessage.Merge(m, src) +} +func (m *EthereumVerifyMessage) XXX_Size() int { + return xxx_messageInfo_EthereumVerifyMessage.Size(m) +} +func (m *EthereumVerifyMessage) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumVerifyMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumVerifyMessage proto.InternalMessageInfo + +func (m *EthereumVerifyMessage) GetAddressBin() []byte { + if m != nil { + return m.AddressBin + } + return nil +} + +func (m *EthereumVerifyMessage) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *EthereumVerifyMessage) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +func (m *EthereumVerifyMessage) GetAddressHex() string { + if m != nil && m.AddressHex != nil { + return *m.AddressHex + } + return "" +} + +func init() { + proto.RegisterType((*EthereumGetPublicKey)(nil), "hw.trezor.messages.ethereum.EthereumGetPublicKey") + proto.RegisterType((*EthereumPublicKey)(nil), "hw.trezor.messages.ethereum.EthereumPublicKey") + proto.RegisterType((*EthereumGetAddress)(nil), "hw.trezor.messages.ethereum.EthereumGetAddress") + proto.RegisterType((*EthereumAddress)(nil), "hw.trezor.messages.ethereum.EthereumAddress") + proto.RegisterType((*EthereumSignTx)(nil), "hw.trezor.messages.ethereum.EthereumSignTx") + proto.RegisterType((*EthereumTxRequest)(nil), "hw.trezor.messages.ethereum.EthereumTxRequest") + proto.RegisterType((*EthereumTxAck)(nil), "hw.trezor.messages.ethereum.EthereumTxAck") + proto.RegisterType((*EthereumSignMessage)(nil), "hw.trezor.messages.ethereum.EthereumSignMessage") + proto.RegisterType((*EthereumMessageSignature)(nil), "hw.trezor.messages.ethereum.EthereumMessageSignature") + proto.RegisterType((*EthereumVerifyMessage)(nil), "hw.trezor.messages.ethereum.EthereumVerifyMessage") +} + +func init() { proto.RegisterFile("messages-ethereum.proto", fileDescriptor_cb33f46ba915f15c) } + +var fileDescriptor_cb33f46ba915f15c = []byte{ + // 593 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0x4d, 0x6f, 0xd3, 0x40, + 0x10, 0x95, 0x9b, 0xb4, 0x49, 0x26, 0x0d, 0x1f, 0xa6, 0x55, 0x17, 0x0a, 0x34, 0x18, 0x21, 0xe5, + 0x00, 0x3e, 0x70, 0x43, 0xe2, 0xd2, 0x52, 0x44, 0x2b, 0x4a, 0x55, 0xdc, 0xa8, 0x57, 0x6b, 0x63, + 0x6f, 0xe3, 0x55, 0x9d, 0xdd, 0xe0, 0x5d, 0xb7, 0x0e, 0x7f, 0x82, 0x23, 0xff, 0x87, 0x5f, 0x86, + 0xf6, 0x2b, 0x71, 0x52, 0x54, 0x0e, 0xbd, 0x65, 0xde, 0xbc, 0x7d, 0xf3, 0x66, 0xf4, 0x62, 0xd8, + 0x99, 0x10, 0x21, 0xf0, 0x98, 0x88, 0x77, 0x44, 0x66, 0xa4, 0x20, 0xe5, 0x24, 0x9c, 0x16, 0x5c, + 0x72, 0x7f, 0x37, 0xbb, 0x09, 0x65, 0x41, 0x7e, 0xf2, 0x22, 0x74, 0x94, 0xd0, 0x51, 0x9e, 0x6d, + 0xcf, 0x5f, 0x25, 0x7c, 0x32, 0xe1, 0xcc, 0xbc, 0x09, 0x2e, 0x60, 0xeb, 0xb3, 0xa5, 0x7c, 0x21, + 0xf2, 0xac, 0x1c, 0xe5, 0x34, 0xf9, 0x4a, 0x66, 0xfe, 0x2e, 0x74, 0x70, 0x9a, 0x16, 0x44, 0x88, + 0x98, 0x21, 0xaf, 0xdf, 0x18, 0xf4, 0xa2, 0xb6, 0x05, 0x4e, 0xfd, 0x57, 0xb0, 0x29, 0x32, 0x7e, + 0x13, 0xa7, 0x54, 0x4c, 0x73, 0x3c, 0x43, 0x6b, 0x7d, 0x6f, 0xd0, 0x8e, 0xba, 0x0a, 0x3b, 0x34, + 0x50, 0x30, 0x82, 0xc7, 0x4e, 0x77, 0x21, 0xfa, 0x01, 0x9a, 0x8c, 0xa7, 0x04, 0x79, 0x7d, 0x6f, + 0xd0, 0x7d, 0xff, 0x26, 0xfc, 0x87, 0x5f, 0x6b, 0xee, 0xe8, 0xf0, 0x94, 0xa7, 0x64, 0x38, 0x9b, + 0x92, 0x48, 0x3f, 0xf1, 0x7d, 0x68, 0x56, 0xd3, 0x72, 0xa4, 0x47, 0x75, 0x22, 0xfd, 0x3b, 0x18, + 0x82, 0x5f, 0xf3, 0xbe, 0x6f, 0xdc, 0xdd, 0xdb, 0xf9, 0x77, 0x78, 0xe8, 0x54, 0x9d, 0xe4, 0x4b, + 0x00, 0xab, 0x70, 0x40, 0x99, 0x76, 0xbf, 0x19, 0xd5, 0x90, 0x5a, 0xff, 0x88, 0x54, 0xd6, 0x62, + 0x0d, 0x09, 0xfe, 0xac, 0xc1, 0x03, 0xa7, 0x79, 0x4e, 0xc7, 0x6c, 0x58, 0xdd, 0xed, 0x72, 0x0b, + 0xd6, 0x19, 0x67, 0x09, 0xd1, 0x52, 0x9b, 0x91, 0x29, 0xd4, 0x93, 0x31, 0x16, 0xf1, 0xb4, 0xa0, + 0x09, 0x41, 0x0d, 0xdd, 0x69, 0x8f, 0xb1, 0x38, 0x53, 0xb5, 0x6b, 0xe6, 0x74, 0x42, 0x25, 0x6a, + 0xce, 0x9b, 0x27, 0xaa, 0x56, 0x7a, 0x92, 0x2b, 0xeb, 0xeb, 0x46, 0x4f, 0x17, 0x06, 0x55, 0x86, + 0xbb, 0xda, 0xb0, 0x29, 0x14, 0x7a, 0x8d, 0xf3, 0x92, 0xa0, 0x0d, 0xc3, 0xd5, 0x85, 0xff, 0x16, + 0xfc, 0x14, 0x4b, 0x1c, 0x53, 0x46, 0x25, 0xc5, 0x79, 0x9c, 0x64, 0x25, 0xbb, 0x42, 0x2d, 0x4d, + 0x79, 0xa4, 0x3a, 0xc7, 0xa6, 0xf1, 0x49, 0xe1, 0xfe, 0x1e, 0x74, 0x35, 0x3b, 0x27, 0x6c, 0x2c, + 0x33, 0xd4, 0xee, 0x7b, 0x83, 0x5e, 0x04, 0x0a, 0x3a, 0xd1, 0x88, 0xff, 0x14, 0xda, 0x49, 0x86, + 0x29, 0x8b, 0x69, 0x8a, 0x3a, 0xba, 0xdb, 0xd2, 0xf5, 0x71, 0xea, 0xef, 0x40, 0x4b, 0x56, 0xb1, + 0x9c, 0x4d, 0x09, 0x02, 0xdd, 0xd9, 0x90, 0x95, 0xca, 0x41, 0xf0, 0xdb, 0x5b, 0x44, 0x6a, 0x58, + 0x45, 0xe4, 0x47, 0x49, 0x84, 0x5c, 0x1d, 0xe5, 0xdd, 0x1a, 0xb5, 0x07, 0x5d, 0x41, 0xc7, 0x0c, + 0xcb, 0xb2, 0x20, 0xf1, 0xb5, 0xbe, 0x68, 0x2f, 0x82, 0x39, 0x74, 0xb1, 0x4c, 0x28, 0xec, 0x61, + 0x17, 0x84, 0x68, 0x99, 0x20, 0xec, 0x71, 0x17, 0x84, 0xf3, 0x20, 0x84, 0xde, 0xc2, 0xd8, 0x7e, + 0x72, 0xe5, 0xbf, 0x00, 0xed, 0xc0, 0x5e, 0xc9, 0xe4, 0xa5, 0xa3, 0x10, 0x7d, 0x9e, 0xe0, 0x04, + 0x9e, 0xd4, 0xd3, 0xf0, 0xcd, 0x64, 0xff, 0xee, 0x48, 0x20, 0x68, 0xd9, 0xff, 0x88, 0x0d, 0x85, + 0x2b, 0x83, 0x0a, 0x90, 0x53, 0xb3, 0x4a, 0xe7, 0xce, 0xda, 0x7f, 0x83, 0xfb, 0x1c, 0x3a, 0xf3, + 0x3d, 0xac, 0xee, 0x02, 0x58, 0x89, 0x75, 0xe3, 0x56, 0xac, 0x7f, 0x79, 0xb0, 0xed, 0x46, 0x5f, + 0x90, 0x82, 0x5e, 0xce, 0xdc, 0x2a, 0xf7, 0x9b, 0x5b, 0xdb, 0xb5, 0xb1, 0xb4, 0xeb, 0x8a, 0xa3, + 0xe6, 0xaa, 0xa3, 0x83, 0x8f, 0xf0, 0x3a, 0xe1, 0x93, 0x50, 0x60, 0xc9, 0x45, 0x46, 0x73, 0x3c, + 0x12, 0xee, 0x03, 0x93, 0xd3, 0x91, 0xf9, 0xe2, 0x8d, 0xca, 0xcb, 0x83, 0xed, 0xa1, 0x06, 0xad, + 0x5b, 0xb7, 0xc2, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8a, 0xce, 0x81, 0xc8, 0x59, 0x05, 0x00, + 0x00, +} diff --git a/accounts/usbwallet/trezor/messages-ethereum.proto b/accounts/usbwallet/trezor/messages-ethereum.proto new file mode 100644 index 000000000000..096bed2e4ae1 --- /dev/null +++ b/accounts/usbwallet/trezor/messages-ethereum.proto @@ -0,0 +1,131 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/messages-ethereum.proto +// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. + +syntax = "proto2"; +package hw.trezor.messages.ethereum; + +// Sugar for easier handling in Java +option java_package = "com.satoshilabs.trezor.lib.protobuf"; +option java_outer_classname = "TrezorMessageEthereum"; + +import "messages-common.proto"; + + +/** + * Request: Ask device for public key corresponding to address_n path + * @start + * @next EthereumPublicKey + * @next Failure + */ +message EthereumGetPublicKey { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional bool show_display = 2; // optionally show on display before sending the result +} + +/** + * Response: Contains public key derived from device private seed + * @end + */ +message EthereumPublicKey { + optional hw.trezor.messages.common.HDNodeType node = 1; // BIP32 public node + optional string xpub = 2; // serialized form of public node +} + +/** + * Request: Ask device for Ethereum address corresponding to address_n path + * @start + * @next EthereumAddress + * @next Failure + */ +message EthereumGetAddress { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional bool show_display = 2; // optionally show on display before sending the result +} + +/** + * Response: Contains an Ethereum address derived from device private seed + * @end + */ +message EthereumAddress { + optional bytes addressBin = 1; // Ethereum address as 20 bytes (legacy firmwares) + optional string addressHex = 2; // Ethereum address as hex string (newer firmwares) +} + +/** + * Request: Ask device to sign transaction + * All fields are optional from the protocol's point of view. Each field defaults to value `0` if missing. + * Note: the first at most 1024 bytes of data MUST be transmitted as part of this message. + * @start + * @next EthereumTxRequest + * @next Failure + */ +message EthereumSignTx { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional bytes nonce = 2; // <=256 bit unsigned big endian + optional bytes gas_price = 3; // <=256 bit unsigned big endian (in wei) + optional bytes gas_limit = 4; // <=256 bit unsigned big endian + optional bytes toBin = 5; // recipient address (20 bytes, legacy firmware) + optional string toHex = 11; // recipient address (hex string, newer firmware) + optional bytes value = 6; // <=256 bit unsigned big endian (in wei) + optional bytes data_initial_chunk = 7; // The initial data chunk (<= 1024 bytes) + optional uint32 data_length = 8; // Length of transaction payload + optional uint32 chain_id = 9; // Chain Id for EIP 155 + optional uint32 tx_type = 10; // (only for Wanchain) +} + +/** + * Response: Device asks for more data from transaction payload, or returns the signature. + * If data_length is set, device awaits that many more bytes of payload. + * Otherwise, the signature_* fields contain the computed transaction signature. All three fields will be present. + * @end + * @next EthereumTxAck + */ +message EthereumTxRequest { + optional uint32 data_length = 1; // Number of bytes being requested (<= 1024) + optional uint32 signature_v = 2; // Computed signature (recovery parameter, limited to 27 or 28) + optional bytes signature_r = 3; // Computed signature R component (256 bit) + optional bytes signature_s = 4; // Computed signature S component (256 bit) +} + +/** + * Request: Transaction payload data. + * @next EthereumTxRequest + */ +message EthereumTxAck { + optional bytes data_chunk = 1; // Bytes from transaction payload (<= 1024 bytes) +} + +/** + * Request: Ask device to sign message + * @start + * @next EthereumMessageSignature + * @next Failure + */ +message EthereumSignMessage { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional bytes message = 2; // message to be signed +} + +/** + * Response: Signed message + * @end + */ +message EthereumMessageSignature { + optional bytes addressBin = 1; // address used to sign the message (20 bytes, legacy firmware) + optional bytes signature = 2; // signature of the message + optional string addressHex = 3; // address used to sign the message (hex string, newer firmware) +} + +/** + * Request: Ask device to verify message + * @start + * @next Success + * @next Failure + */ +message EthereumVerifyMessage { + optional bytes addressBin = 1; // address to verify (20 bytes, legacy firmware) + optional bytes signature = 2; // signature to verify + optional bytes message = 3; // message to verify + optional string addressHex = 4; // address to verify (hex string, newer firmware) +} diff --git a/accounts/usbwallet/trezor/messages-management.pb.go b/accounts/usbwallet/trezor/messages-management.pb.go new file mode 100644 index 000000000000..f5c872f1fb5b --- /dev/null +++ b/accounts/usbwallet/trezor/messages-management.pb.go @@ -0,0 +1,1621 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: messages-management.proto + +package trezor + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +//* +// Structure representing passphrase source +type ApplySettings_PassphraseSourceType int32 + +const ( + ApplySettings_ASK ApplySettings_PassphraseSourceType = 0 + ApplySettings_DEVICE ApplySettings_PassphraseSourceType = 1 + ApplySettings_HOST ApplySettings_PassphraseSourceType = 2 +) + +var ApplySettings_PassphraseSourceType_name = map[int32]string{ + 0: "ASK", + 1: "DEVICE", + 2: "HOST", +} + +var ApplySettings_PassphraseSourceType_value = map[string]int32{ + "ASK": 0, + "DEVICE": 1, + "HOST": 2, +} + +func (x ApplySettings_PassphraseSourceType) Enum() *ApplySettings_PassphraseSourceType { + p := new(ApplySettings_PassphraseSourceType) + *p = x + return p +} + +func (x ApplySettings_PassphraseSourceType) String() string { + return proto.EnumName(ApplySettings_PassphraseSourceType_name, int32(x)) +} + +func (x *ApplySettings_PassphraseSourceType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ApplySettings_PassphraseSourceType_value, data, "ApplySettings_PassphraseSourceType") + if err != nil { + return err + } + *x = ApplySettings_PassphraseSourceType(value) + return nil +} + +func (ApplySettings_PassphraseSourceType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{4, 0} +} + +//* +// Type of recovery procedure. These should be used as bitmask, e.g., +// `RecoveryDeviceType_ScrambledWords | RecoveryDeviceType_Matrix` +// listing every method supported by the host computer. +// +// Note that ScrambledWords must be supported by every implementation +// for backward compatibility; there is no way to not support it. +type RecoveryDevice_RecoveryDeviceType int32 + +const ( + // use powers of two when extending this field + RecoveryDevice_RecoveryDeviceType_ScrambledWords RecoveryDevice_RecoveryDeviceType = 0 + RecoveryDevice_RecoveryDeviceType_Matrix RecoveryDevice_RecoveryDeviceType = 1 +) + +var RecoveryDevice_RecoveryDeviceType_name = map[int32]string{ + 0: "RecoveryDeviceType_ScrambledWords", + 1: "RecoveryDeviceType_Matrix", +} + +var RecoveryDevice_RecoveryDeviceType_value = map[string]int32{ + "RecoveryDeviceType_ScrambledWords": 0, + "RecoveryDeviceType_Matrix": 1, +} + +func (x RecoveryDevice_RecoveryDeviceType) Enum() *RecoveryDevice_RecoveryDeviceType { + p := new(RecoveryDevice_RecoveryDeviceType) + *p = x + return p +} + +func (x RecoveryDevice_RecoveryDeviceType) String() string { + return proto.EnumName(RecoveryDevice_RecoveryDeviceType_name, int32(x)) +} + +func (x *RecoveryDevice_RecoveryDeviceType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RecoveryDevice_RecoveryDeviceType_value, data, "RecoveryDevice_RecoveryDeviceType") + if err != nil { + return err + } + *x = RecoveryDevice_RecoveryDeviceType(value) + return nil +} + +func (RecoveryDevice_RecoveryDeviceType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{17, 0} +} + +//* +// Type of Recovery Word request +type WordRequest_WordRequestType int32 + +const ( + WordRequest_WordRequestType_Plain WordRequest_WordRequestType = 0 + WordRequest_WordRequestType_Matrix9 WordRequest_WordRequestType = 1 + WordRequest_WordRequestType_Matrix6 WordRequest_WordRequestType = 2 +) + +var WordRequest_WordRequestType_name = map[int32]string{ + 0: "WordRequestType_Plain", + 1: "WordRequestType_Matrix9", + 2: "WordRequestType_Matrix6", +} + +var WordRequest_WordRequestType_value = map[string]int32{ + "WordRequestType_Plain": 0, + "WordRequestType_Matrix9": 1, + "WordRequestType_Matrix6": 2, +} + +func (x WordRequest_WordRequestType) Enum() *WordRequest_WordRequestType { + p := new(WordRequest_WordRequestType) + *p = x + return p +} + +func (x WordRequest_WordRequestType) String() string { + return proto.EnumName(WordRequest_WordRequestType_name, int32(x)) +} + +func (x *WordRequest_WordRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(WordRequest_WordRequestType_value, data, "WordRequest_WordRequestType") + if err != nil { + return err + } + *x = WordRequest_WordRequestType(value) + return nil +} + +func (WordRequest_WordRequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{18, 0} +} + +//* +// Request: Reset device to default state and ask for device details +// @start +// @next Features +type Initialize struct { + State []byte `protobuf:"bytes,1,opt,name=state" json:"state,omitempty"` + SkipPassphrase *bool `protobuf:"varint,2,opt,name=skip_passphrase,json=skipPassphrase" json:"skip_passphrase,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Initialize) Reset() { *m = Initialize{} } +func (m *Initialize) String() string { return proto.CompactTextString(m) } +func (*Initialize) ProtoMessage() {} +func (*Initialize) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{0} +} + +func (m *Initialize) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Initialize.Unmarshal(m, b) +} +func (m *Initialize) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Initialize.Marshal(b, m, deterministic) +} +func (m *Initialize) XXX_Merge(src proto.Message) { + xxx_messageInfo_Initialize.Merge(m, src) +} +func (m *Initialize) XXX_Size() int { + return xxx_messageInfo_Initialize.Size(m) +} +func (m *Initialize) XXX_DiscardUnknown() { + xxx_messageInfo_Initialize.DiscardUnknown(m) +} + +var xxx_messageInfo_Initialize proto.InternalMessageInfo + +func (m *Initialize) GetState() []byte { + if m != nil { + return m.State + } + return nil +} + +func (m *Initialize) GetSkipPassphrase() bool { + if m != nil && m.SkipPassphrase != nil { + return *m.SkipPassphrase + } + return false +} + +//* +// Request: Ask for device details (no device reset) +// @start +// @next Features +type GetFeatures struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetFeatures) Reset() { *m = GetFeatures{} } +func (m *GetFeatures) String() string { return proto.CompactTextString(m) } +func (*GetFeatures) ProtoMessage() {} +func (*GetFeatures) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{1} +} + +func (m *GetFeatures) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetFeatures.Unmarshal(m, b) +} +func (m *GetFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetFeatures.Marshal(b, m, deterministic) +} +func (m *GetFeatures) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetFeatures.Merge(m, src) +} +func (m *GetFeatures) XXX_Size() int { + return xxx_messageInfo_GetFeatures.Size(m) +} +func (m *GetFeatures) XXX_DiscardUnknown() { + xxx_messageInfo_GetFeatures.DiscardUnknown(m) +} + +var xxx_messageInfo_GetFeatures proto.InternalMessageInfo + +//* +// Response: Reports various information about the device +// @end +type Features struct { + Vendor *string `protobuf:"bytes,1,opt,name=vendor" json:"vendor,omitempty"` + MajorVersion *uint32 `protobuf:"varint,2,opt,name=major_version,json=majorVersion" json:"major_version,omitempty"` + MinorVersion *uint32 `protobuf:"varint,3,opt,name=minor_version,json=minorVersion" json:"minor_version,omitempty"` + PatchVersion *uint32 `protobuf:"varint,4,opt,name=patch_version,json=patchVersion" json:"patch_version,omitempty"` + BootloaderMode *bool `protobuf:"varint,5,opt,name=bootloader_mode,json=bootloaderMode" json:"bootloader_mode,omitempty"` + DeviceId *string `protobuf:"bytes,6,opt,name=device_id,json=deviceId" json:"device_id,omitempty"` + PinProtection *bool `protobuf:"varint,7,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + PassphraseProtection *bool `protobuf:"varint,8,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + Language *string `protobuf:"bytes,9,opt,name=language" json:"language,omitempty"` + Label *string `protobuf:"bytes,10,opt,name=label" json:"label,omitempty"` + Initialized *bool `protobuf:"varint,12,opt,name=initialized" json:"initialized,omitempty"` + Revision []byte `protobuf:"bytes,13,opt,name=revision" json:"revision,omitempty"` + BootloaderHash []byte `protobuf:"bytes,14,opt,name=bootloader_hash,json=bootloaderHash" json:"bootloader_hash,omitempty"` + Imported *bool `protobuf:"varint,15,opt,name=imported" json:"imported,omitempty"` + PinCached *bool `protobuf:"varint,16,opt,name=pin_cached,json=pinCached" json:"pin_cached,omitempty"` + PassphraseCached *bool `protobuf:"varint,17,opt,name=passphrase_cached,json=passphraseCached" json:"passphrase_cached,omitempty"` + FirmwarePresent *bool `protobuf:"varint,18,opt,name=firmware_present,json=firmwarePresent" json:"firmware_present,omitempty"` + NeedsBackup *bool `protobuf:"varint,19,opt,name=needs_backup,json=needsBackup" json:"needs_backup,omitempty"` + Flags *uint32 `protobuf:"varint,20,opt,name=flags" json:"flags,omitempty"` + Model *string `protobuf:"bytes,21,opt,name=model" json:"model,omitempty"` + FwMajor *uint32 `protobuf:"varint,22,opt,name=fw_major,json=fwMajor" json:"fw_major,omitempty"` + FwMinor *uint32 `protobuf:"varint,23,opt,name=fw_minor,json=fwMinor" json:"fw_minor,omitempty"` + FwPatch *uint32 `protobuf:"varint,24,opt,name=fw_patch,json=fwPatch" json:"fw_patch,omitempty"` + FwVendor *string `protobuf:"bytes,25,opt,name=fw_vendor,json=fwVendor" json:"fw_vendor,omitempty"` + FwVendorKeys []byte `protobuf:"bytes,26,opt,name=fw_vendor_keys,json=fwVendorKeys" json:"fw_vendor_keys,omitempty"` + UnfinishedBackup *bool `protobuf:"varint,27,opt,name=unfinished_backup,json=unfinishedBackup" json:"unfinished_backup,omitempty"` + NoBackup *bool `protobuf:"varint,28,opt,name=no_backup,json=noBackup" json:"no_backup,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Features) Reset() { *m = Features{} } +func (m *Features) String() string { return proto.CompactTextString(m) } +func (*Features) ProtoMessage() {} +func (*Features) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{2} +} + +func (m *Features) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Features.Unmarshal(m, b) +} +func (m *Features) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Features.Marshal(b, m, deterministic) +} +func (m *Features) XXX_Merge(src proto.Message) { + xxx_messageInfo_Features.Merge(m, src) +} +func (m *Features) XXX_Size() int { + return xxx_messageInfo_Features.Size(m) +} +func (m *Features) XXX_DiscardUnknown() { + xxx_messageInfo_Features.DiscardUnknown(m) +} + +var xxx_messageInfo_Features proto.InternalMessageInfo + +func (m *Features) GetVendor() string { + if m != nil && m.Vendor != nil { + return *m.Vendor + } + return "" +} + +func (m *Features) GetMajorVersion() uint32 { + if m != nil && m.MajorVersion != nil { + return *m.MajorVersion + } + return 0 +} + +func (m *Features) GetMinorVersion() uint32 { + if m != nil && m.MinorVersion != nil { + return *m.MinorVersion + } + return 0 +} + +func (m *Features) GetPatchVersion() uint32 { + if m != nil && m.PatchVersion != nil { + return *m.PatchVersion + } + return 0 +} + +func (m *Features) GetBootloaderMode() bool { + if m != nil && m.BootloaderMode != nil { + return *m.BootloaderMode + } + return false +} + +func (m *Features) GetDeviceId() string { + if m != nil && m.DeviceId != nil { + return *m.DeviceId + } + return "" +} + +func (m *Features) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *Features) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *Features) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return "" +} + +func (m *Features) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *Features) GetInitialized() bool { + if m != nil && m.Initialized != nil { + return *m.Initialized + } + return false +} + +func (m *Features) GetRevision() []byte { + if m != nil { + return m.Revision + } + return nil +} + +func (m *Features) GetBootloaderHash() []byte { + if m != nil { + return m.BootloaderHash + } + return nil +} + +func (m *Features) GetImported() bool { + if m != nil && m.Imported != nil { + return *m.Imported + } + return false +} + +func (m *Features) GetPinCached() bool { + if m != nil && m.PinCached != nil { + return *m.PinCached + } + return false +} + +func (m *Features) GetPassphraseCached() bool { + if m != nil && m.PassphraseCached != nil { + return *m.PassphraseCached + } + return false +} + +func (m *Features) GetFirmwarePresent() bool { + if m != nil && m.FirmwarePresent != nil { + return *m.FirmwarePresent + } + return false +} + +func (m *Features) GetNeedsBackup() bool { + if m != nil && m.NeedsBackup != nil { + return *m.NeedsBackup + } + return false +} + +func (m *Features) GetFlags() uint32 { + if m != nil && m.Flags != nil { + return *m.Flags + } + return 0 +} + +func (m *Features) GetModel() string { + if m != nil && m.Model != nil { + return *m.Model + } + return "" +} + +func (m *Features) GetFwMajor() uint32 { + if m != nil && m.FwMajor != nil { + return *m.FwMajor + } + return 0 +} + +func (m *Features) GetFwMinor() uint32 { + if m != nil && m.FwMinor != nil { + return *m.FwMinor + } + return 0 +} + +func (m *Features) GetFwPatch() uint32 { + if m != nil && m.FwPatch != nil { + return *m.FwPatch + } + return 0 +} + +func (m *Features) GetFwVendor() string { + if m != nil && m.FwVendor != nil { + return *m.FwVendor + } + return "" +} + +func (m *Features) GetFwVendorKeys() []byte { + if m != nil { + return m.FwVendorKeys + } + return nil +} + +func (m *Features) GetUnfinishedBackup() bool { + if m != nil && m.UnfinishedBackup != nil { + return *m.UnfinishedBackup + } + return false +} + +func (m *Features) GetNoBackup() bool { + if m != nil && m.NoBackup != nil { + return *m.NoBackup + } + return false +} + +//* +// Request: clear session (removes cached PIN, passphrase, etc). +// @start +// @next Success +type ClearSession struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ClearSession) Reset() { *m = ClearSession{} } +func (m *ClearSession) String() string { return proto.CompactTextString(m) } +func (*ClearSession) ProtoMessage() {} +func (*ClearSession) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{3} +} + +func (m *ClearSession) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ClearSession.Unmarshal(m, b) +} +func (m *ClearSession) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ClearSession.Marshal(b, m, deterministic) +} +func (m *ClearSession) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClearSession.Merge(m, src) +} +func (m *ClearSession) XXX_Size() int { + return xxx_messageInfo_ClearSession.Size(m) +} +func (m *ClearSession) XXX_DiscardUnknown() { + xxx_messageInfo_ClearSession.DiscardUnknown(m) +} + +var xxx_messageInfo_ClearSession proto.InternalMessageInfo + +//* +// Request: change language and/or label of the device +// @start +// @next Success +// @next Failure +type ApplySettings struct { + Language *string `protobuf:"bytes,1,opt,name=language" json:"language,omitempty"` + Label *string `protobuf:"bytes,2,opt,name=label" json:"label,omitempty"` + UsePassphrase *bool `protobuf:"varint,3,opt,name=use_passphrase,json=usePassphrase" json:"use_passphrase,omitempty"` + Homescreen []byte `protobuf:"bytes,4,opt,name=homescreen" json:"homescreen,omitempty"` + PassphraseSource *ApplySettings_PassphraseSourceType `protobuf:"varint,5,opt,name=passphrase_source,json=passphraseSource,enum=hw.trezor.messages.management.ApplySettings_PassphraseSourceType" json:"passphrase_source,omitempty"` + AutoLockDelayMs *uint32 `protobuf:"varint,6,opt,name=auto_lock_delay_ms,json=autoLockDelayMs" json:"auto_lock_delay_ms,omitempty"` + DisplayRotation *uint32 `protobuf:"varint,7,opt,name=display_rotation,json=displayRotation" json:"display_rotation,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplySettings) Reset() { *m = ApplySettings{} } +func (m *ApplySettings) String() string { return proto.CompactTextString(m) } +func (*ApplySettings) ProtoMessage() {} +func (*ApplySettings) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{4} +} + +func (m *ApplySettings) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ApplySettings.Unmarshal(m, b) +} +func (m *ApplySettings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ApplySettings.Marshal(b, m, deterministic) +} +func (m *ApplySettings) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplySettings.Merge(m, src) +} +func (m *ApplySettings) XXX_Size() int { + return xxx_messageInfo_ApplySettings.Size(m) +} +func (m *ApplySettings) XXX_DiscardUnknown() { + xxx_messageInfo_ApplySettings.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplySettings proto.InternalMessageInfo + +func (m *ApplySettings) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return "" +} + +func (m *ApplySettings) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *ApplySettings) GetUsePassphrase() bool { + if m != nil && m.UsePassphrase != nil { + return *m.UsePassphrase + } + return false +} + +func (m *ApplySettings) GetHomescreen() []byte { + if m != nil { + return m.Homescreen + } + return nil +} + +func (m *ApplySettings) GetPassphraseSource() ApplySettings_PassphraseSourceType { + if m != nil && m.PassphraseSource != nil { + return *m.PassphraseSource + } + return ApplySettings_ASK +} + +func (m *ApplySettings) GetAutoLockDelayMs() uint32 { + if m != nil && m.AutoLockDelayMs != nil { + return *m.AutoLockDelayMs + } + return 0 +} + +func (m *ApplySettings) GetDisplayRotation() uint32 { + if m != nil && m.DisplayRotation != nil { + return *m.DisplayRotation + } + return 0 +} + +//* +// Request: set flags of the device +// @start +// @next Success +// @next Failure +type ApplyFlags struct { + Flags *uint32 `protobuf:"varint,1,opt,name=flags" json:"flags,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplyFlags) Reset() { *m = ApplyFlags{} } +func (m *ApplyFlags) String() string { return proto.CompactTextString(m) } +func (*ApplyFlags) ProtoMessage() {} +func (*ApplyFlags) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{5} +} + +func (m *ApplyFlags) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ApplyFlags.Unmarshal(m, b) +} +func (m *ApplyFlags) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ApplyFlags.Marshal(b, m, deterministic) +} +func (m *ApplyFlags) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplyFlags.Merge(m, src) +} +func (m *ApplyFlags) XXX_Size() int { + return xxx_messageInfo_ApplyFlags.Size(m) +} +func (m *ApplyFlags) XXX_DiscardUnknown() { + xxx_messageInfo_ApplyFlags.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplyFlags proto.InternalMessageInfo + +func (m *ApplyFlags) GetFlags() uint32 { + if m != nil && m.Flags != nil { + return *m.Flags + } + return 0 +} + +//* +// Request: Starts workflow for setting/changing/removing the PIN +// @start +// @next Success +// @next Failure +type ChangePin struct { + Remove *bool `protobuf:"varint,1,opt,name=remove" json:"remove,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangePin) Reset() { *m = ChangePin{} } +func (m *ChangePin) String() string { return proto.CompactTextString(m) } +func (*ChangePin) ProtoMessage() {} +func (*ChangePin) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{6} +} + +func (m *ChangePin) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ChangePin.Unmarshal(m, b) +} +func (m *ChangePin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ChangePin.Marshal(b, m, deterministic) +} +func (m *ChangePin) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangePin.Merge(m, src) +} +func (m *ChangePin) XXX_Size() int { + return xxx_messageInfo_ChangePin.Size(m) +} +func (m *ChangePin) XXX_DiscardUnknown() { + xxx_messageInfo_ChangePin.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangePin proto.InternalMessageInfo + +func (m *ChangePin) GetRemove() bool { + if m != nil && m.Remove != nil { + return *m.Remove + } + return false +} + +//* +// Request: Test if the device is alive, device sends back the message in Success response +// @start +// @next Success +type Ping struct { + Message *string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` + ButtonProtection *bool `protobuf:"varint,2,opt,name=button_protection,json=buttonProtection" json:"button_protection,omitempty"` + PinProtection *bool `protobuf:"varint,3,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + PassphraseProtection *bool `protobuf:"varint,4,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ping) Reset() { *m = Ping{} } +func (m *Ping) String() string { return proto.CompactTextString(m) } +func (*Ping) ProtoMessage() {} +func (*Ping) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{7} +} + +func (m *Ping) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Ping.Unmarshal(m, b) +} +func (m *Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Ping.Marshal(b, m, deterministic) +} +func (m *Ping) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ping.Merge(m, src) +} +func (m *Ping) XXX_Size() int { + return xxx_messageInfo_Ping.Size(m) +} +func (m *Ping) XXX_DiscardUnknown() { + xxx_messageInfo_Ping.DiscardUnknown(m) +} + +var xxx_messageInfo_Ping proto.InternalMessageInfo + +func (m *Ping) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +func (m *Ping) GetButtonProtection() bool { + if m != nil && m.ButtonProtection != nil { + return *m.ButtonProtection + } + return false +} + +func (m *Ping) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *Ping) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +//* +// Request: Abort last operation that required user interaction +// @start +// @next Failure +type Cancel struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Cancel) Reset() { *m = Cancel{} } +func (m *Cancel) String() string { return proto.CompactTextString(m) } +func (*Cancel) ProtoMessage() {} +func (*Cancel) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{8} +} + +func (m *Cancel) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Cancel.Unmarshal(m, b) +} +func (m *Cancel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Cancel.Marshal(b, m, deterministic) +} +func (m *Cancel) XXX_Merge(src proto.Message) { + xxx_messageInfo_Cancel.Merge(m, src) +} +func (m *Cancel) XXX_Size() int { + return xxx_messageInfo_Cancel.Size(m) +} +func (m *Cancel) XXX_DiscardUnknown() { + xxx_messageInfo_Cancel.DiscardUnknown(m) +} + +var xxx_messageInfo_Cancel proto.InternalMessageInfo + +//* +// Request: Request a sample of random data generated by hardware RNG. May be used for testing. +// @start +// @next Entropy +// @next Failure +type GetEntropy struct { + Size *uint32 `protobuf:"varint,1,req,name=size" json:"size,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetEntropy) Reset() { *m = GetEntropy{} } +func (m *GetEntropy) String() string { return proto.CompactTextString(m) } +func (*GetEntropy) ProtoMessage() {} +func (*GetEntropy) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{9} +} + +func (m *GetEntropy) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetEntropy.Unmarshal(m, b) +} +func (m *GetEntropy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetEntropy.Marshal(b, m, deterministic) +} +func (m *GetEntropy) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEntropy.Merge(m, src) +} +func (m *GetEntropy) XXX_Size() int { + return xxx_messageInfo_GetEntropy.Size(m) +} +func (m *GetEntropy) XXX_DiscardUnknown() { + xxx_messageInfo_GetEntropy.DiscardUnknown(m) +} + +var xxx_messageInfo_GetEntropy proto.InternalMessageInfo + +func (m *GetEntropy) GetSize() uint32 { + if m != nil && m.Size != nil { + return *m.Size + } + return 0 +} + +//* +// Response: Reply with random data generated by internal RNG +// @end +type Entropy struct { + Entropy []byte `protobuf:"bytes,1,req,name=entropy" json:"entropy,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Entropy) Reset() { *m = Entropy{} } +func (m *Entropy) String() string { return proto.CompactTextString(m) } +func (*Entropy) ProtoMessage() {} +func (*Entropy) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{10} +} + +func (m *Entropy) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Entropy.Unmarshal(m, b) +} +func (m *Entropy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Entropy.Marshal(b, m, deterministic) +} +func (m *Entropy) XXX_Merge(src proto.Message) { + xxx_messageInfo_Entropy.Merge(m, src) +} +func (m *Entropy) XXX_Size() int { + return xxx_messageInfo_Entropy.Size(m) +} +func (m *Entropy) XXX_DiscardUnknown() { + xxx_messageInfo_Entropy.DiscardUnknown(m) +} + +var xxx_messageInfo_Entropy proto.InternalMessageInfo + +func (m *Entropy) GetEntropy() []byte { + if m != nil { + return m.Entropy + } + return nil +} + +//* +// Request: Request device to wipe all sensitive data and settings +// @start +// @next Success +// @next Failure +type WipeDevice struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *WipeDevice) Reset() { *m = WipeDevice{} } +func (m *WipeDevice) String() string { return proto.CompactTextString(m) } +func (*WipeDevice) ProtoMessage() {} +func (*WipeDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{11} +} + +func (m *WipeDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_WipeDevice.Unmarshal(m, b) +} +func (m *WipeDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_WipeDevice.Marshal(b, m, deterministic) +} +func (m *WipeDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_WipeDevice.Merge(m, src) +} +func (m *WipeDevice) XXX_Size() int { + return xxx_messageInfo_WipeDevice.Size(m) +} +func (m *WipeDevice) XXX_DiscardUnknown() { + xxx_messageInfo_WipeDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_WipeDevice proto.InternalMessageInfo + +//* +// Request: Load seed and related internal settings from the computer +// @start +// @next Success +// @next Failure +type LoadDevice struct { + Mnemonic *string `protobuf:"bytes,1,opt,name=mnemonic" json:"mnemonic,omitempty"` + Node *HDNodeType `protobuf:"bytes,2,opt,name=node" json:"node,omitempty"` + Pin *string `protobuf:"bytes,3,opt,name=pin" json:"pin,omitempty"` + PassphraseProtection *bool `protobuf:"varint,4,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + Language *string `protobuf:"bytes,5,opt,name=language,def=english" json:"language,omitempty"` + Label *string `protobuf:"bytes,6,opt,name=label" json:"label,omitempty"` + SkipChecksum *bool `protobuf:"varint,7,opt,name=skip_checksum,json=skipChecksum" json:"skip_checksum,omitempty"` + U2FCounter *uint32 `protobuf:"varint,8,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LoadDevice) Reset() { *m = LoadDevice{} } +func (m *LoadDevice) String() string { return proto.CompactTextString(m) } +func (*LoadDevice) ProtoMessage() {} +func (*LoadDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{12} +} + +func (m *LoadDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LoadDevice.Unmarshal(m, b) +} +func (m *LoadDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LoadDevice.Marshal(b, m, deterministic) +} +func (m *LoadDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_LoadDevice.Merge(m, src) +} +func (m *LoadDevice) XXX_Size() int { + return xxx_messageInfo_LoadDevice.Size(m) +} +func (m *LoadDevice) XXX_DiscardUnknown() { + xxx_messageInfo_LoadDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_LoadDevice proto.InternalMessageInfo + +const Default_LoadDevice_Language string = "english" + +func (m *LoadDevice) GetMnemonic() string { + if m != nil && m.Mnemonic != nil { + return *m.Mnemonic + } + return "" +} + +func (m *LoadDevice) GetNode() *HDNodeType { + if m != nil { + return m.Node + } + return nil +} + +func (m *LoadDevice) GetPin() string { + if m != nil && m.Pin != nil { + return *m.Pin + } + return "" +} + +func (m *LoadDevice) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *LoadDevice) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return Default_LoadDevice_Language +} + +func (m *LoadDevice) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *LoadDevice) GetSkipChecksum() bool { + if m != nil && m.SkipChecksum != nil { + return *m.SkipChecksum + } + return false +} + +func (m *LoadDevice) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +//* +// Request: Ask device to do initialization involving user interaction +// @start +// @next EntropyRequest +// @next Failure +type ResetDevice struct { + DisplayRandom *bool `protobuf:"varint,1,opt,name=display_random,json=displayRandom" json:"display_random,omitempty"` + Strength *uint32 `protobuf:"varint,2,opt,name=strength,def=256" json:"strength,omitempty"` + PassphraseProtection *bool `protobuf:"varint,3,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + PinProtection *bool `protobuf:"varint,4,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + Language *string `protobuf:"bytes,5,opt,name=language,def=english" json:"language,omitempty"` + Label *string `protobuf:"bytes,6,opt,name=label" json:"label,omitempty"` + U2FCounter *uint32 `protobuf:"varint,7,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + SkipBackup *bool `protobuf:"varint,8,opt,name=skip_backup,json=skipBackup" json:"skip_backup,omitempty"` + NoBackup *bool `protobuf:"varint,9,opt,name=no_backup,json=noBackup" json:"no_backup,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResetDevice) Reset() { *m = ResetDevice{} } +func (m *ResetDevice) String() string { return proto.CompactTextString(m) } +func (*ResetDevice) ProtoMessage() {} +func (*ResetDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{13} +} + +func (m *ResetDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ResetDevice.Unmarshal(m, b) +} +func (m *ResetDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ResetDevice.Marshal(b, m, deterministic) +} +func (m *ResetDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResetDevice.Merge(m, src) +} +func (m *ResetDevice) XXX_Size() int { + return xxx_messageInfo_ResetDevice.Size(m) +} +func (m *ResetDevice) XXX_DiscardUnknown() { + xxx_messageInfo_ResetDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_ResetDevice proto.InternalMessageInfo + +const Default_ResetDevice_Strength uint32 = 256 +const Default_ResetDevice_Language string = "english" + +func (m *ResetDevice) GetDisplayRandom() bool { + if m != nil && m.DisplayRandom != nil { + return *m.DisplayRandom + } + return false +} + +func (m *ResetDevice) GetStrength() uint32 { + if m != nil && m.Strength != nil { + return *m.Strength + } + return Default_ResetDevice_Strength +} + +func (m *ResetDevice) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *ResetDevice) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *ResetDevice) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return Default_ResetDevice_Language +} + +func (m *ResetDevice) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *ResetDevice) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +func (m *ResetDevice) GetSkipBackup() bool { + if m != nil && m.SkipBackup != nil { + return *m.SkipBackup + } + return false +} + +func (m *ResetDevice) GetNoBackup() bool { + if m != nil && m.NoBackup != nil { + return *m.NoBackup + } + return false +} + +//* +// Request: Perform backup of the device seed if not backed up using ResetDevice +// @start +// @next Success +type BackupDevice struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BackupDevice) Reset() { *m = BackupDevice{} } +func (m *BackupDevice) String() string { return proto.CompactTextString(m) } +func (*BackupDevice) ProtoMessage() {} +func (*BackupDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{14} +} + +func (m *BackupDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BackupDevice.Unmarshal(m, b) +} +func (m *BackupDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BackupDevice.Marshal(b, m, deterministic) +} +func (m *BackupDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_BackupDevice.Merge(m, src) +} +func (m *BackupDevice) XXX_Size() int { + return xxx_messageInfo_BackupDevice.Size(m) +} +func (m *BackupDevice) XXX_DiscardUnknown() { + xxx_messageInfo_BackupDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_BackupDevice proto.InternalMessageInfo + +//* +// Response: Ask for additional entropy from host computer +// @next EntropyAck +type EntropyRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EntropyRequest) Reset() { *m = EntropyRequest{} } +func (m *EntropyRequest) String() string { return proto.CompactTextString(m) } +func (*EntropyRequest) ProtoMessage() {} +func (*EntropyRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{15} +} + +func (m *EntropyRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EntropyRequest.Unmarshal(m, b) +} +func (m *EntropyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EntropyRequest.Marshal(b, m, deterministic) +} +func (m *EntropyRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_EntropyRequest.Merge(m, src) +} +func (m *EntropyRequest) XXX_Size() int { + return xxx_messageInfo_EntropyRequest.Size(m) +} +func (m *EntropyRequest) XXX_DiscardUnknown() { + xxx_messageInfo_EntropyRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_EntropyRequest proto.InternalMessageInfo + +//* +// Request: Provide additional entropy for seed generation function +// @next Success +type EntropyAck struct { + Entropy []byte `protobuf:"bytes,1,opt,name=entropy" json:"entropy,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EntropyAck) Reset() { *m = EntropyAck{} } +func (m *EntropyAck) String() string { return proto.CompactTextString(m) } +func (*EntropyAck) ProtoMessage() {} +func (*EntropyAck) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{16} +} + +func (m *EntropyAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EntropyAck.Unmarshal(m, b) +} +func (m *EntropyAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EntropyAck.Marshal(b, m, deterministic) +} +func (m *EntropyAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_EntropyAck.Merge(m, src) +} +func (m *EntropyAck) XXX_Size() int { + return xxx_messageInfo_EntropyAck.Size(m) +} +func (m *EntropyAck) XXX_DiscardUnknown() { + xxx_messageInfo_EntropyAck.DiscardUnknown(m) +} + +var xxx_messageInfo_EntropyAck proto.InternalMessageInfo + +func (m *EntropyAck) GetEntropy() []byte { + if m != nil { + return m.Entropy + } + return nil +} + +//* +// Request: Start recovery workflow asking user for specific words of mnemonic +// Used to recovery device safely even on untrusted computer. +// @start +// @next WordRequest +type RecoveryDevice struct { + WordCount *uint32 `protobuf:"varint,1,opt,name=word_count,json=wordCount" json:"word_count,omitempty"` + PassphraseProtection *bool `protobuf:"varint,2,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + PinProtection *bool `protobuf:"varint,3,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + Language *string `protobuf:"bytes,4,opt,name=language,def=english" json:"language,omitempty"` + Label *string `protobuf:"bytes,5,opt,name=label" json:"label,omitempty"` + EnforceWordlist *bool `protobuf:"varint,6,opt,name=enforce_wordlist,json=enforceWordlist" json:"enforce_wordlist,omitempty"` + // 7 reserved for unused recovery method + Type *RecoveryDevice_RecoveryDeviceType `protobuf:"varint,8,opt,name=type,enum=hw.trezor.messages.management.RecoveryDevice_RecoveryDeviceType" json:"type,omitempty"` + U2FCounter *uint32 `protobuf:"varint,9,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + DryRun *bool `protobuf:"varint,10,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RecoveryDevice) Reset() { *m = RecoveryDevice{} } +func (m *RecoveryDevice) String() string { return proto.CompactTextString(m) } +func (*RecoveryDevice) ProtoMessage() {} +func (*RecoveryDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{17} +} + +func (m *RecoveryDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RecoveryDevice.Unmarshal(m, b) +} +func (m *RecoveryDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RecoveryDevice.Marshal(b, m, deterministic) +} +func (m *RecoveryDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_RecoveryDevice.Merge(m, src) +} +func (m *RecoveryDevice) XXX_Size() int { + return xxx_messageInfo_RecoveryDevice.Size(m) +} +func (m *RecoveryDevice) XXX_DiscardUnknown() { + xxx_messageInfo_RecoveryDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_RecoveryDevice proto.InternalMessageInfo + +const Default_RecoveryDevice_Language string = "english" + +func (m *RecoveryDevice) GetWordCount() uint32 { + if m != nil && m.WordCount != nil { + return *m.WordCount + } + return 0 +} + +func (m *RecoveryDevice) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *RecoveryDevice) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *RecoveryDevice) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return Default_RecoveryDevice_Language +} + +func (m *RecoveryDevice) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *RecoveryDevice) GetEnforceWordlist() bool { + if m != nil && m.EnforceWordlist != nil { + return *m.EnforceWordlist + } + return false +} + +func (m *RecoveryDevice) GetType() RecoveryDevice_RecoveryDeviceType { + if m != nil && m.Type != nil { + return *m.Type + } + return RecoveryDevice_RecoveryDeviceType_ScrambledWords +} + +func (m *RecoveryDevice) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +func (m *RecoveryDevice) GetDryRun() bool { + if m != nil && m.DryRun != nil { + return *m.DryRun + } + return false +} + +//* +// Response: Device is waiting for user to enter word of the mnemonic +// Its position is shown only on device's internal display. +// @next WordAck +type WordRequest struct { + Type *WordRequest_WordRequestType `protobuf:"varint,1,opt,name=type,enum=hw.trezor.messages.management.WordRequest_WordRequestType" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *WordRequest) Reset() { *m = WordRequest{} } +func (m *WordRequest) String() string { return proto.CompactTextString(m) } +func (*WordRequest) ProtoMessage() {} +func (*WordRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{18} +} + +func (m *WordRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_WordRequest.Unmarshal(m, b) +} +func (m *WordRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_WordRequest.Marshal(b, m, deterministic) +} +func (m *WordRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_WordRequest.Merge(m, src) +} +func (m *WordRequest) XXX_Size() int { + return xxx_messageInfo_WordRequest.Size(m) +} +func (m *WordRequest) XXX_DiscardUnknown() { + xxx_messageInfo_WordRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_WordRequest proto.InternalMessageInfo + +func (m *WordRequest) GetType() WordRequest_WordRequestType { + if m != nil && m.Type != nil { + return *m.Type + } + return WordRequest_WordRequestType_Plain +} + +//* +// Request: Computer replies with word from the mnemonic +// @next WordRequest +// @next Success +// @next Failure +type WordAck struct { + Word *string `protobuf:"bytes,1,req,name=word" json:"word,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *WordAck) Reset() { *m = WordAck{} } +func (m *WordAck) String() string { return proto.CompactTextString(m) } +func (*WordAck) ProtoMessage() {} +func (*WordAck) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{19} +} + +func (m *WordAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_WordAck.Unmarshal(m, b) +} +func (m *WordAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_WordAck.Marshal(b, m, deterministic) +} +func (m *WordAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_WordAck.Merge(m, src) +} +func (m *WordAck) XXX_Size() int { + return xxx_messageInfo_WordAck.Size(m) +} +func (m *WordAck) XXX_DiscardUnknown() { + xxx_messageInfo_WordAck.DiscardUnknown(m) +} + +var xxx_messageInfo_WordAck proto.InternalMessageInfo + +func (m *WordAck) GetWord() string { + if m != nil && m.Word != nil { + return *m.Word + } + return "" +} + +//* +// Request: Set U2F counter +// @start +// @next Success +type SetU2FCounter struct { + U2FCounter *uint32 `protobuf:"varint,1,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetU2FCounter) Reset() { *m = SetU2FCounter{} } +func (m *SetU2FCounter) String() string { return proto.CompactTextString(m) } +func (*SetU2FCounter) ProtoMessage() {} +func (*SetU2FCounter) Descriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{20} +} + +func (m *SetU2FCounter) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SetU2FCounter.Unmarshal(m, b) +} +func (m *SetU2FCounter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SetU2FCounter.Marshal(b, m, deterministic) +} +func (m *SetU2FCounter) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetU2FCounter.Merge(m, src) +} +func (m *SetU2FCounter) XXX_Size() int { + return xxx_messageInfo_SetU2FCounter.Size(m) +} +func (m *SetU2FCounter) XXX_DiscardUnknown() { + xxx_messageInfo_SetU2FCounter.DiscardUnknown(m) +} + +var xxx_messageInfo_SetU2FCounter proto.InternalMessageInfo + +func (m *SetU2FCounter) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +func init() { + proto.RegisterEnum("hw.trezor.messages.management.ApplySettings_PassphraseSourceType", ApplySettings_PassphraseSourceType_name, ApplySettings_PassphraseSourceType_value) + proto.RegisterEnum("hw.trezor.messages.management.RecoveryDevice_RecoveryDeviceType", RecoveryDevice_RecoveryDeviceType_name, RecoveryDevice_RecoveryDeviceType_value) + proto.RegisterEnum("hw.trezor.messages.management.WordRequest_WordRequestType", WordRequest_WordRequestType_name, WordRequest_WordRequestType_value) + proto.RegisterType((*Initialize)(nil), "hw.trezor.messages.management.Initialize") + proto.RegisterType((*GetFeatures)(nil), "hw.trezor.messages.management.GetFeatures") + proto.RegisterType((*Features)(nil), "hw.trezor.messages.management.Features") + proto.RegisterType((*ClearSession)(nil), "hw.trezor.messages.management.ClearSession") + proto.RegisterType((*ApplySettings)(nil), "hw.trezor.messages.management.ApplySettings") + proto.RegisterType((*ApplyFlags)(nil), "hw.trezor.messages.management.ApplyFlags") + proto.RegisterType((*ChangePin)(nil), "hw.trezor.messages.management.ChangePin") + proto.RegisterType((*Ping)(nil), "hw.trezor.messages.management.Ping") + proto.RegisterType((*Cancel)(nil), "hw.trezor.messages.management.Cancel") + proto.RegisterType((*GetEntropy)(nil), "hw.trezor.messages.management.GetEntropy") + proto.RegisterType((*Entropy)(nil), "hw.trezor.messages.management.Entropy") + proto.RegisterType((*WipeDevice)(nil), "hw.trezor.messages.management.WipeDevice") + proto.RegisterType((*LoadDevice)(nil), "hw.trezor.messages.management.LoadDevice") + proto.RegisterType((*ResetDevice)(nil), "hw.trezor.messages.management.ResetDevice") + proto.RegisterType((*BackupDevice)(nil), "hw.trezor.messages.management.BackupDevice") + proto.RegisterType((*EntropyRequest)(nil), "hw.trezor.messages.management.EntropyRequest") + proto.RegisterType((*EntropyAck)(nil), "hw.trezor.messages.management.EntropyAck") + proto.RegisterType((*RecoveryDevice)(nil), "hw.trezor.messages.management.RecoveryDevice") + proto.RegisterType((*WordRequest)(nil), "hw.trezor.messages.management.WordRequest") + proto.RegisterType((*WordAck)(nil), "hw.trezor.messages.management.WordAck") + proto.RegisterType((*SetU2FCounter)(nil), "hw.trezor.messages.management.SetU2FCounter") +} + +func init() { proto.RegisterFile("messages-management.proto", fileDescriptor_0c720c20d27aa029) } + +var fileDescriptor_0c720c20d27aa029 = []byte{ + // 1393 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xdd, 0x6e, 0xdb, 0xc8, + 0x15, 0x8e, 0x7e, 0x62, 0x49, 0xc7, 0xfa, 0xcb, 0xd4, 0x8e, 0xe9, 0xb8, 0x6e, 0x1c, 0xba, 0x6e, + 0x12, 0x04, 0x15, 0x0a, 0x17, 0x09, 0x90, 0x5c, 0x14, 0x75, 0xec, 0xfc, 0x21, 0x71, 0x6a, 0xd0, + 0x6e, 0x02, 0xf4, 0x86, 0x18, 0x91, 0x47, 0xd2, 0xd4, 0xe4, 0x0c, 0xcb, 0x19, 0xda, 0x55, 0x5e, + 0x60, 0x6f, 0xf6, 0x45, 0x16, 0xfb, 0x1c, 0x7b, 0xb5, 0xcf, 0xb0, 0xef, 0xb2, 0x98, 0x19, 0x52, + 0xa2, 0x65, 0x3b, 0x46, 0x76, 0xef, 0xe6, 0x7c, 0xe7, 0xe3, 0x68, 0xce, 0x77, 0xbe, 0x39, 0x63, + 0xc3, 0x7a, 0x8c, 0x52, 0xd2, 0x31, 0xca, 0xbf, 0xc6, 0x94, 0xd3, 0x31, 0xc6, 0xc8, 0xd5, 0x20, + 0x49, 0x85, 0x12, 0x64, 0x73, 0x72, 0x3e, 0x50, 0x29, 0x7e, 0x11, 0xe9, 0xa0, 0x20, 0x0d, 0xe6, + 0xa4, 0x7b, 0xab, 0xb3, 0x2f, 0x03, 0x11, 0xc7, 0x82, 0xdb, 0xaf, 0xdc, 0xf7, 0x00, 0xef, 0x38, + 0x53, 0x8c, 0x46, 0xec, 0x0b, 0x92, 0x15, 0xb8, 0x2d, 0x15, 0x55, 0xe8, 0x54, 0xb6, 0x2a, 0x8f, + 0xda, 0x9e, 0x0d, 0xc8, 0x43, 0xe8, 0xc9, 0x53, 0x96, 0xf8, 0x09, 0x95, 0x32, 0x99, 0xa4, 0x54, + 0xa2, 0x53, 0xdd, 0xaa, 0x3c, 0x6a, 0x7a, 0x5d, 0x0d, 0x1f, 0xcd, 0x50, 0xb7, 0x03, 0xcb, 0x6f, + 0x50, 0xbd, 0x46, 0xaa, 0xb2, 0x14, 0xa5, 0xfb, 0x7d, 0x03, 0x9a, 0x45, 0x40, 0xee, 0xc2, 0xd2, + 0x19, 0xf2, 0x50, 0xa4, 0x66, 0xef, 0x96, 0x97, 0x47, 0x64, 0x1b, 0x3a, 0x31, 0xfd, 0xaf, 0x48, + 0xfd, 0x33, 0x4c, 0x25, 0x13, 0xdc, 0x6c, 0xdd, 0xf1, 0xda, 0x06, 0xfc, 0x64, 0x31, 0x43, 0x62, + 0xbc, 0x44, 0xaa, 0xe5, 0x24, 0x0d, 0x96, 0x48, 0x09, 0x55, 0xc1, 0x64, 0x46, 0xaa, 0x5b, 0x92, + 0x01, 0x0b, 0xd2, 0x43, 0xe8, 0x0d, 0x85, 0x50, 0x91, 0xa0, 0x21, 0xa6, 0x7e, 0x2c, 0x42, 0x74, + 0x6e, 0xdb, 0x5a, 0xe6, 0xf0, 0xa1, 0x08, 0x91, 0x6c, 0x40, 0x2b, 0xc4, 0x33, 0x16, 0xa0, 0xcf, + 0x42, 0x67, 0xc9, 0x1c, 0xb9, 0x69, 0x81, 0x77, 0x21, 0xd9, 0x81, 0x6e, 0xc2, 0xb8, 0xaf, 0x25, + 0xc4, 0x40, 0xe9, 0xdf, 0x6a, 0x98, 0x4d, 0x3a, 0x09, 0xe3, 0x47, 0x33, 0x90, 0xfc, 0x1d, 0x56, + 0xe7, 0x9a, 0x95, 0xd9, 0x4d, 0xc3, 0x5e, 0x99, 0x27, 0x4b, 0x1f, 0xdd, 0x83, 0x66, 0x44, 0xf9, + 0x38, 0xa3, 0x63, 0x74, 0x5a, 0xf6, 0x77, 0x8b, 0x58, 0xf7, 0x27, 0xa2, 0x43, 0x8c, 0x1c, 0x30, + 0x09, 0x1b, 0x90, 0x2d, 0x58, 0x66, 0xb3, 0x1e, 0x86, 0x4e, 0xdb, 0x6c, 0x5e, 0x86, 0xf4, 0x9e, + 0x29, 0x9e, 0x31, 0xa3, 0x4a, 0xc7, 0xb4, 0x76, 0x16, 0x2f, 0x28, 0x32, 0xa1, 0x72, 0xe2, 0x74, + 0x0d, 0xa5, 0xa4, 0xc8, 0x5b, 0x2a, 0x27, 0x7a, 0x13, 0x16, 0x27, 0x22, 0x55, 0x18, 0x3a, 0x3d, + 0xf3, 0x1b, 0xb3, 0x98, 0x6c, 0x02, 0x68, 0x41, 0x02, 0x1a, 0x4c, 0x30, 0x74, 0xfa, 0x26, 0xdb, + 0x4a, 0x18, 0xdf, 0x37, 0x00, 0x79, 0x02, 0x77, 0x4a, 0x42, 0xe4, 0xac, 0x3b, 0x86, 0xd5, 0x9f, + 0x27, 0x72, 0xf2, 0x63, 0xe8, 0x8f, 0x58, 0x1a, 0x9f, 0xd3, 0x54, 0x6b, 0x86, 0x12, 0xb9, 0x72, + 0x88, 0xe1, 0xf6, 0x0a, 0xfc, 0xc8, 0xc2, 0xe4, 0x01, 0xb4, 0x39, 0x62, 0x28, 0xfd, 0x21, 0x0d, + 0x4e, 0xb3, 0xc4, 0xf9, 0x83, 0x2d, 0xdd, 0x60, 0x2f, 0x0d, 0xa4, 0x25, 0x1b, 0x45, 0x74, 0x2c, + 0x9d, 0x15, 0xe3, 0x06, 0x1b, 0x68, 0x54, 0xf7, 0x3e, 0x72, 0x56, 0xad, 0x90, 0x26, 0x20, 0xeb, + 0xd0, 0x1c, 0x9d, 0xfb, 0xc6, 0x79, 0xce, 0x5d, 0x43, 0x6f, 0x8c, 0xce, 0x0f, 0x75, 0x58, 0xa4, + 0xb4, 0xdf, 0x9c, 0xb5, 0x59, 0x4a, 0x87, 0x79, 0xca, 0xb8, 0xcc, 0x71, 0x8a, 0xd4, 0x91, 0x0e, + 0xb5, 0x89, 0x46, 0xe7, 0x7e, 0xee, 0xfb, 0x75, 0xdb, 0xcc, 0xd1, 0xf9, 0x27, 0xeb, 0xfc, 0x3f, + 0x43, 0x77, 0x96, 0xf4, 0x4f, 0x71, 0x2a, 0x9d, 0x7b, 0x46, 0xf7, 0x76, 0xc1, 0x78, 0x8f, 0x53, + 0xa9, 0xa5, 0xcb, 0xf8, 0x88, 0x71, 0x26, 0x27, 0x18, 0x16, 0x75, 0x6e, 0x58, 0xe9, 0xe6, 0x89, + 0xbc, 0xd8, 0x0d, 0x68, 0x71, 0x51, 0x90, 0xfe, 0x68, 0x7b, 0xc4, 0x85, 0x4d, 0xba, 0x5d, 0x68, + 0xef, 0x47, 0x48, 0xd3, 0x63, 0x94, 0xba, 0xf1, 0xee, 0x77, 0x35, 0xe8, 0xec, 0x25, 0x49, 0x34, + 0x3d, 0x46, 0xa5, 0x18, 0x1f, 0xcb, 0x0b, 0xd6, 0xab, 0x5c, 0x67, 0xbd, 0x6a, 0xd9, 0x7a, 0x3b, + 0xd0, 0xcd, 0xb4, 0xb5, 0xe7, 0x93, 0xa1, 0x66, 0x2f, 0x42, 0x26, 0x71, 0x3e, 0x18, 0xc8, 0x9f, + 0x00, 0x26, 0x22, 0x46, 0x19, 0xa4, 0x88, 0xf6, 0x5e, 0xb6, 0xbd, 0x12, 0x42, 0xf8, 0x05, 0x7f, + 0x48, 0x91, 0xa5, 0x81, 0xbd, 0x97, 0xdd, 0xdd, 0xbd, 0xc1, 0x57, 0xe7, 0xda, 0xe0, 0x42, 0x05, + 0x83, 0xf9, 0x6f, 0x1e, 0x9b, 0x4d, 0x4e, 0xa6, 0x09, 0x96, 0x2d, 0x66, 0x51, 0xf2, 0x04, 0x08, + 0xcd, 0x94, 0xf0, 0x23, 0x11, 0x9c, 0xfa, 0x21, 0x46, 0x74, 0xea, 0xc7, 0xd2, 0xdc, 0xf2, 0x8e, + 0xd7, 0xd3, 0x99, 0x0f, 0x22, 0x38, 0x3d, 0xd0, 0xf8, 0xa1, 0xd4, 0x7e, 0x0c, 0x99, 0x4c, 0x34, + 0x29, 0x15, 0x8a, 0xce, 0xae, 0x7b, 0xc7, 0xeb, 0xe5, 0xb8, 0x97, 0xc3, 0xee, 0x53, 0x58, 0xb9, + 0xea, 0x04, 0xa4, 0x01, 0xb5, 0xbd, 0xe3, 0xf7, 0xfd, 0x5b, 0x04, 0x60, 0xe9, 0xe0, 0xd5, 0xa7, + 0x77, 0xfb, 0xaf, 0xfa, 0x15, 0xd2, 0x84, 0xfa, 0xdb, 0x7f, 0x1d, 0x9f, 0xf4, 0xab, 0xae, 0x0b, + 0x60, 0xca, 0x78, 0x5d, 0x78, 0xd3, 0x3a, 0xb6, 0x52, 0x72, 0xac, 0xbb, 0x0d, 0xad, 0xfd, 0x09, + 0xe5, 0x63, 0x3c, 0x62, 0x5c, 0x0f, 0xd3, 0x14, 0x63, 0x71, 0x66, 0xdb, 0xd4, 0xf4, 0xf2, 0xc8, + 0xfd, 0xa1, 0x02, 0xf5, 0x23, 0xc6, 0xc7, 0xc4, 0x81, 0x46, 0x2e, 0x56, 0xde, 0xc8, 0x22, 0xd4, + 0x7e, 0x1a, 0x66, 0x4a, 0x89, 0x0b, 0xd3, 0xcb, 0x8e, 0xf3, 0xbe, 0x4d, 0x94, 0x66, 0xd1, 0xe5, + 0x39, 0x57, 0xfb, 0xa6, 0x39, 0x57, 0xbf, 0x7e, 0xce, 0xb9, 0x4d, 0x58, 0xda, 0xa7, 0x3c, 0xc0, + 0xc8, 0xdd, 0x02, 0x78, 0x83, 0xea, 0x15, 0x57, 0xa9, 0x48, 0xa6, 0x84, 0x40, 0x5d, 0xb2, 0x2f, + 0xfa, 0xdc, 0xd5, 0x47, 0x1d, 0xcf, 0xac, 0xdd, 0x6d, 0x68, 0x14, 0x69, 0x07, 0x1a, 0x68, 0x97, + 0x86, 0xd1, 0xf6, 0x8a, 0xd0, 0x6d, 0x03, 0x7c, 0x66, 0x09, 0x1e, 0x98, 0x21, 0xed, 0xfe, 0x58, + 0x05, 0xf8, 0x20, 0x68, 0x68, 0x43, 0x6d, 0xed, 0x98, 0x63, 0x2c, 0x38, 0x0b, 0x0a, 0x6b, 0x17, + 0x31, 0x79, 0x0e, 0x75, 0xae, 0x1f, 0x02, 0xad, 0xc2, 0xf2, 0xee, 0xce, 0x55, 0x86, 0xcb, 0xdf, + 0xcc, 0xb7, 0x07, 0x1f, 0x45, 0x68, 0x4d, 0x65, 0x3e, 0x21, 0x7d, 0xa8, 0x25, 0xcc, 0xaa, 0xd2, + 0xf2, 0xf4, 0xf2, 0x37, 0x69, 0x41, 0xb6, 0x4b, 0x17, 0x4f, 0xdb, 0xbe, 0xf5, 0xa2, 0x81, 0x7c, + 0x1c, 0x31, 0x39, 0xb9, 0xea, 0x06, 0x2e, 0x95, 0x6f, 0xe0, 0x36, 0x74, 0xcc, 0xe3, 0x1c, 0x4c, + 0x30, 0x38, 0x95, 0x59, 0x9c, 0xbf, 0x44, 0x6d, 0x0d, 0xee, 0xe7, 0x18, 0xb9, 0x0f, 0xcb, 0xd9, + 0xee, 0xc8, 0x0f, 0x44, 0xc6, 0x15, 0xa6, 0xe6, 0xf9, 0xe9, 0x78, 0x90, 0xed, 0x8e, 0xf6, 0x2d, + 0xe2, 0xfe, 0x5c, 0x85, 0x65, 0x0f, 0x25, 0xaa, 0x5c, 0xae, 0x1d, 0xe8, 0xce, 0x3c, 0x4f, 0x79, + 0x28, 0xe2, 0xdc, 0x68, 0x9d, 0xc2, 0xf1, 0x06, 0x24, 0xf7, 0xa1, 0x29, 0x55, 0x8a, 0x7c, 0xac, + 0x26, 0xf6, 0xdd, 0x7e, 0x51, 0xdb, 0x7d, 0xfa, 0xcc, 0x9b, 0x81, 0xd7, 0xab, 0x51, 0xfb, 0x8a, + 0x1a, 0x97, 0x5d, 0x57, 0xbf, 0xca, 0x75, 0xbf, 0x43, 0xb4, 0x05, 0x3d, 0x1a, 0x8b, 0x7a, 0x68, + 0x82, 0x51, 0x35, 0x1f, 0xa5, 0xf6, 0xbd, 0x06, 0x0d, 0x5d, 0x35, 0x69, 0x5b, 0x97, 0x27, 0xad, + 0x5d, 0xe5, 0x5e, 0xec, 0x43, 0x37, 0xb7, 0xaf, 0x87, 0xff, 0xcb, 0x50, 0x2a, 0xf7, 0x2f, 0x00, + 0x39, 0xb2, 0x17, 0x9c, 0x5e, 0xf4, 0x74, 0xa5, 0xec, 0xe9, 0x5f, 0x6a, 0xd0, 0xf5, 0x30, 0x10, + 0x67, 0x98, 0x4e, 0xf3, 0xd6, 0x6c, 0x02, 0x9c, 0x8b, 0x34, 0xb4, 0x87, 0xcf, 0x67, 0x44, 0x4b, + 0x23, 0xe6, 0xec, 0xd7, 0x2b, 0x5e, 0xfd, 0x26, 0xc5, 0x6b, 0x37, 0x29, 0x5e, 0xbf, 0x51, 0xf1, + 0xdb, 0x65, 0xc5, 0x1f, 0x43, 0x1f, 0xf9, 0x48, 0xa4, 0x01, 0xfa, 0xfa, 0xac, 0x11, 0x93, 0xca, + 0xb4, 0xa4, 0xe9, 0xf5, 0x72, 0xfc, 0x73, 0x0e, 0x93, 0x13, 0xa8, 0xab, 0x69, 0x82, 0x46, 0xf4, + 0xee, 0xee, 0x3f, 0x6f, 0x98, 0xff, 0x17, 0xd5, 0x59, 0x08, 0xed, 0x4d, 0xd5, 0xbb, 0x2d, 0xb6, + 0xbc, 0x75, 0xa9, 0xe5, 0x6b, 0xd0, 0x08, 0xd3, 0xa9, 0x9f, 0x66, 0xdc, 0xfc, 0x75, 0xd5, 0xf4, + 0x96, 0xc2, 0x74, 0xea, 0x65, 0xdc, 0xfd, 0x0f, 0x90, 0xcb, 0xbb, 0x92, 0x1d, 0x78, 0x70, 0x19, + 0xf5, 0x8f, 0x83, 0x94, 0xc6, 0xc3, 0x08, 0x43, 0x5d, 0x8d, 0xec, 0xdf, 0x22, 0x9b, 0xb0, 0x7e, + 0x05, 0xed, 0x90, 0xaa, 0x94, 0xfd, 0xbf, 0x5f, 0x71, 0x7f, 0xaa, 0xc0, 0xb2, 0xa6, 0xe6, 0xbe, + 0x20, 0x1f, 0xf3, 0xda, 0x2b, 0xa6, 0xf6, 0x17, 0x37, 0xd4, 0x5e, 0xfa, 0xb2, 0xbc, 0x9e, 0x57, + 0xed, 0x8e, 0xa0, 0xb7, 0x90, 0x20, 0xeb, 0xb0, 0xba, 0x00, 0xf9, 0x47, 0x11, 0x65, 0xbc, 0x7f, + 0x8b, 0x6c, 0xc0, 0xda, 0x62, 0xca, 0x9e, 0xf4, 0x79, 0xbf, 0x72, 0x7d, 0xf2, 0x59, 0xbf, 0xea, + 0x6e, 0x42, 0x43, 0x27, 0xb5, 0x99, 0x09, 0xd4, 0x75, 0x87, 0xcd, 0x74, 0x6e, 0x79, 0x66, 0xed, + 0xfe, 0x0d, 0x3a, 0xc7, 0xa8, 0xfe, 0xbd, 0xfb, 0xba, 0x74, 0xbf, 0xca, 0xdd, 0xa8, 0x2c, 0x76, + 0xe3, 0xe5, 0x3f, 0x60, 0x3b, 0x10, 0xf1, 0x40, 0x52, 0x25, 0xe4, 0x84, 0x45, 0x74, 0x28, 0x0b, + 0x21, 0x22, 0x36, 0xb4, 0xff, 0xbb, 0x0c, 0xb3, 0xd1, 0xcb, 0xb5, 0x13, 0x03, 0x1e, 0x5a, 0x71, + 0x0e, 0x67, 0xd2, 0xfc, 0x1a, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x6e, 0xfc, 0x59, 0x29, 0x0d, 0x00, + 0x00, +} diff --git a/accounts/usbwallet/trezor/messages-management.proto b/accounts/usbwallet/trezor/messages-management.proto new file mode 100644 index 000000000000..0ab825a1bcca --- /dev/null +++ b/accounts/usbwallet/trezor/messages-management.proto @@ -0,0 +1,289 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/messages-management.proto +// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. + +syntax = "proto2"; +package hw.trezor.messages.management; + +// Sugar for easier handling in Java +option java_package = "com.satoshilabs.trezor.lib.protobuf"; +option java_outer_classname = "TrezorMessageManagement"; + +import "messages-common.proto"; + +/** + * Request: Reset device to default state and ask for device details + * @start + * @next Features + */ +message Initialize { + optional bytes state = 1; // assumed device state, clear session if set and different + optional bool skip_passphrase = 2; // this session should always assume empty passphrase +} + +/** + * Request: Ask for device details (no device reset) + * @start + * @next Features + */ +message GetFeatures { +} + +/** + * Response: Reports various information about the device + * @end + */ +message Features { + optional string vendor = 1; // name of the manufacturer, e.g. "trezor.io" + optional uint32 major_version = 2; // major version of the firmware/bootloader, e.g. 1 + optional uint32 minor_version = 3; // minor version of the firmware/bootloader, e.g. 0 + optional uint32 patch_version = 4; // patch version of the firmware/bootloader, e.g. 0 + optional bool bootloader_mode = 5; // is device in bootloader mode? + optional string device_id = 6; // device's unique identifier + optional bool pin_protection = 7; // is device protected by PIN? + optional bool passphrase_protection = 8; // is node/mnemonic encrypted using passphrase? + optional string language = 9; // device language + optional string label = 10; // device description label + optional bool initialized = 12; // does device contain seed? + optional bytes revision = 13; // SCM revision of firmware + optional bytes bootloader_hash = 14; // hash of the bootloader + optional bool imported = 15; // was storage imported from an external source? + optional bool pin_cached = 16; // is PIN already cached in session? + optional bool passphrase_cached = 17; // is passphrase already cached in session? + optional bool firmware_present = 18; // is valid firmware loaded? + optional bool needs_backup = 19; // does storage need backup? (equals to Storage.needs_backup) + optional uint32 flags = 20; // device flags (equals to Storage.flags) + optional string model = 21; // device hardware model + optional uint32 fw_major = 22; // reported firmware version if in bootloader mode + optional uint32 fw_minor = 23; // reported firmware version if in bootloader mode + optional uint32 fw_patch = 24; // reported firmware version if in bootloader mode + optional string fw_vendor = 25; // reported firmware vendor if in bootloader mode + optional bytes fw_vendor_keys = 26; // reported firmware vendor keys (their hash) + optional bool unfinished_backup = 27; // report unfinished backup (equals to Storage.unfinished_backup) + optional bool no_backup = 28; // report no backup (equals to Storage.no_backup) +} + +/** + * Request: clear session (removes cached PIN, passphrase, etc). + * @start + * @next Success + */ +message ClearSession { +} + +/** + * Request: change language and/or label of the device + * @start + * @next Success + * @next Failure + */ +message ApplySettings { + optional string language = 1; + optional string label = 2; + optional bool use_passphrase = 3; + optional bytes homescreen = 4; + optional PassphraseSourceType passphrase_source = 5; + optional uint32 auto_lock_delay_ms = 6; + optional uint32 display_rotation = 7; // in degrees from North + /** + * Structure representing passphrase source + */ + enum PassphraseSourceType { + ASK = 0; + DEVICE = 1; + HOST = 2; + } +} + +/** + * Request: set flags of the device + * @start + * @next Success + * @next Failure + */ +message ApplyFlags { + optional uint32 flags = 1; // bitmask, can only set bits, not unset +} + +/** + * Request: Starts workflow for setting/changing/removing the PIN + * @start + * @next Success + * @next Failure + */ +message ChangePin { + optional bool remove = 1; // is PIN removal requested? +} + +/** + * Request: Test if the device is alive, device sends back the message in Success response + * @start + * @next Success + */ +message Ping { + optional string message = 1; // message to send back in Success message + optional bool button_protection = 2; // ask for button press + optional bool pin_protection = 3; // ask for PIN if set in device + optional bool passphrase_protection = 4; // ask for passphrase if set in device +} + +/** + * Request: Abort last operation that required user interaction + * @start + * @next Failure + */ +message Cancel { +} + +/** + * Request: Request a sample of random data generated by hardware RNG. May be used for testing. + * @start + * @next Entropy + * @next Failure + */ +message GetEntropy { + required uint32 size = 1; // size of requested entropy +} + +/** + * Response: Reply with random data generated by internal RNG + * @end + */ +message Entropy { + required bytes entropy = 1; // chunk of random generated bytes +} + +/** + * Request: Request device to wipe all sensitive data and settings + * @start + * @next Success + * @next Failure + */ +message WipeDevice { +} + +/** + * Request: Load seed and related internal settings from the computer + * @start + * @next Success + * @next Failure + */ +message LoadDevice { + optional string mnemonic = 1; // seed encoded as BIP-39 mnemonic (12, 18 or 24 words) + optional hw.trezor.messages.common.HDNodeType node = 2; // BIP-32 node + optional string pin = 3; // set PIN protection + optional bool passphrase_protection = 4; // enable master node encryption using passphrase + optional string language = 5 [default='english']; // device language + optional string label = 6; // device label + optional bool skip_checksum = 7; // do not test mnemonic for valid BIP-39 checksum + optional uint32 u2f_counter = 8; // U2F counter +} + +/** + * Request: Ask device to do initialization involving user interaction + * @start + * @next EntropyRequest + * @next Failure + */ +message ResetDevice { + optional bool display_random = 1; // display entropy generated by the device before asking for additional entropy + optional uint32 strength = 2 [default=256]; // strength of seed in bits + optional bool passphrase_protection = 3; // enable master node encryption using passphrase + optional bool pin_protection = 4; // enable PIN protection + optional string language = 5 [default='english']; // device language + optional string label = 6; // device label + optional uint32 u2f_counter = 7; // U2F counter + optional bool skip_backup = 8; // postpone seed backup to BackupDevice workflow + optional bool no_backup = 9; // indicate that no backup is going to be made +} + +/** + * Request: Perform backup of the device seed if not backed up using ResetDevice + * @start + * @next Success + */ +message BackupDevice { +} + +/** + * Response: Ask for additional entropy from host computer + * @next EntropyAck + */ +message EntropyRequest { +} + +/** + * Request: Provide additional entropy for seed generation function + * @next Success + */ +message EntropyAck { + optional bytes entropy = 1; // 256 bits (32 bytes) of random data +} + +/** + * Request: Start recovery workflow asking user for specific words of mnemonic + * Used to recovery device safely even on untrusted computer. + * @start + * @next WordRequest + */ +message RecoveryDevice { + optional uint32 word_count = 1; // number of words in BIP-39 mnemonic + optional bool passphrase_protection = 2; // enable master node encryption using passphrase + optional bool pin_protection = 3; // enable PIN protection + optional string language = 4 [default='english']; // device language + optional string label = 5; // device label + optional bool enforce_wordlist = 6; // enforce BIP-39 wordlist during the process + // 7 reserved for unused recovery method + optional RecoveryDeviceType type = 8; // supported recovery type + optional uint32 u2f_counter = 9; // U2F counter + optional bool dry_run = 10; // perform dry-run recovery workflow (for safe mnemonic validation) + /** + * Type of recovery procedure. These should be used as bitmask, e.g., + * `RecoveryDeviceType_ScrambledWords | RecoveryDeviceType_Matrix` + * listing every method supported by the host computer. + * + * Note that ScrambledWords must be supported by every implementation + * for backward compatibility; there is no way to not support it. + */ + enum RecoveryDeviceType { + // use powers of two when extending this field + RecoveryDeviceType_ScrambledWords = 0; // words in scrambled order + RecoveryDeviceType_Matrix = 1; // matrix recovery type + } +} + +/** + * Response: Device is waiting for user to enter word of the mnemonic + * Its position is shown only on device's internal display. + * @next WordAck + */ +message WordRequest { + optional WordRequestType type = 1; + /** + * Type of Recovery Word request + */ + enum WordRequestType { + WordRequestType_Plain = 0; + WordRequestType_Matrix9 = 1; + WordRequestType_Matrix6 = 2; + } +} + +/** + * Request: Computer replies with word from the mnemonic + * @next WordRequest + * @next Success + * @next Failure + */ +message WordAck { + required string word = 1; // one word of mnemonic on asked position +} + +/** + * Request: Set U2F counter + * @start + * @next Success + */ +message SetU2FCounter { + optional uint32 u2f_counter = 1; // counter +} diff --git a/accounts/usbwallet/trezor/messages.pb.go b/accounts/usbwallet/trezor/messages.pb.go new file mode 100644 index 000000000000..6278bd8ee02c --- /dev/null +++ b/accounts/usbwallet/trezor/messages.pb.go @@ -0,0 +1,889 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: messages.proto + +package trezor + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +//* +// Mapping between TREZOR wire identifier (uint) and a protobuf message +type MessageType int32 + +const ( + // Management + MessageType_MessageType_Initialize MessageType = 0 + MessageType_MessageType_Ping MessageType = 1 + MessageType_MessageType_Success MessageType = 2 + MessageType_MessageType_Failure MessageType = 3 + MessageType_MessageType_ChangePin MessageType = 4 + MessageType_MessageType_WipeDevice MessageType = 5 + MessageType_MessageType_GetEntropy MessageType = 9 + MessageType_MessageType_Entropy MessageType = 10 + MessageType_MessageType_LoadDevice MessageType = 13 + MessageType_MessageType_ResetDevice MessageType = 14 + MessageType_MessageType_Features MessageType = 17 + MessageType_MessageType_PinMatrixRequest MessageType = 18 + MessageType_MessageType_PinMatrixAck MessageType = 19 + MessageType_MessageType_Cancel MessageType = 20 + MessageType_MessageType_ClearSession MessageType = 24 + MessageType_MessageType_ApplySettings MessageType = 25 + MessageType_MessageType_ButtonRequest MessageType = 26 + MessageType_MessageType_ButtonAck MessageType = 27 + MessageType_MessageType_ApplyFlags MessageType = 28 + MessageType_MessageType_BackupDevice MessageType = 34 + MessageType_MessageType_EntropyRequest MessageType = 35 + MessageType_MessageType_EntropyAck MessageType = 36 + MessageType_MessageType_PassphraseRequest MessageType = 41 + MessageType_MessageType_PassphraseAck MessageType = 42 + MessageType_MessageType_PassphraseStateRequest MessageType = 77 + MessageType_MessageType_PassphraseStateAck MessageType = 78 + MessageType_MessageType_RecoveryDevice MessageType = 45 + MessageType_MessageType_WordRequest MessageType = 46 + MessageType_MessageType_WordAck MessageType = 47 + MessageType_MessageType_GetFeatures MessageType = 55 + MessageType_MessageType_SetU2FCounter MessageType = 63 + // Bootloader + MessageType_MessageType_FirmwareErase MessageType = 6 + MessageType_MessageType_FirmwareUpload MessageType = 7 + MessageType_MessageType_FirmwareRequest MessageType = 8 + MessageType_MessageType_SelfTest MessageType = 32 + // Bitcoin + MessageType_MessageType_GetPublicKey MessageType = 11 + MessageType_MessageType_PublicKey MessageType = 12 + MessageType_MessageType_SignTx MessageType = 15 + MessageType_MessageType_TxRequest MessageType = 21 + MessageType_MessageType_TxAck MessageType = 22 + MessageType_MessageType_GetAddress MessageType = 29 + MessageType_MessageType_Address MessageType = 30 + MessageType_MessageType_SignMessage MessageType = 38 + MessageType_MessageType_VerifyMessage MessageType = 39 + MessageType_MessageType_MessageSignature MessageType = 40 + // Crypto + MessageType_MessageType_CipherKeyValue MessageType = 23 + MessageType_MessageType_CipheredKeyValue MessageType = 48 + MessageType_MessageType_SignIdentity MessageType = 53 + MessageType_MessageType_SignedIdentity MessageType = 54 + MessageType_MessageType_GetECDHSessionKey MessageType = 61 + MessageType_MessageType_ECDHSessionKey MessageType = 62 + MessageType_MessageType_CosiCommit MessageType = 71 + MessageType_MessageType_CosiCommitment MessageType = 72 + MessageType_MessageType_CosiSign MessageType = 73 + MessageType_MessageType_CosiSignature MessageType = 74 + // Debug + MessageType_MessageType_DebugLinkDecision MessageType = 100 + MessageType_MessageType_DebugLinkGetState MessageType = 101 + MessageType_MessageType_DebugLinkState MessageType = 102 + MessageType_MessageType_DebugLinkStop MessageType = 103 + MessageType_MessageType_DebugLinkLog MessageType = 104 + MessageType_MessageType_DebugLinkMemoryRead MessageType = 110 + MessageType_MessageType_DebugLinkMemory MessageType = 111 + MessageType_MessageType_DebugLinkMemoryWrite MessageType = 112 + MessageType_MessageType_DebugLinkFlashErase MessageType = 113 + // Ethereum + MessageType_MessageType_EthereumGetPublicKey MessageType = 450 + MessageType_MessageType_EthereumPublicKey MessageType = 451 + MessageType_MessageType_EthereumGetAddress MessageType = 56 + MessageType_MessageType_EthereumAddress MessageType = 57 + MessageType_MessageType_EthereumSignTx MessageType = 58 + MessageType_MessageType_EthereumTxRequest MessageType = 59 + MessageType_MessageType_EthereumTxAck MessageType = 60 + MessageType_MessageType_EthereumSignMessage MessageType = 64 + MessageType_MessageType_EthereumVerifyMessage MessageType = 65 + MessageType_MessageType_EthereumMessageSignature MessageType = 66 + // NEM + MessageType_MessageType_NEMGetAddress MessageType = 67 + MessageType_MessageType_NEMAddress MessageType = 68 + MessageType_MessageType_NEMSignTx MessageType = 69 + MessageType_MessageType_NEMSignedTx MessageType = 70 + MessageType_MessageType_NEMDecryptMessage MessageType = 75 + MessageType_MessageType_NEMDecryptedMessage MessageType = 76 + // Lisk + MessageType_MessageType_LiskGetAddress MessageType = 114 + MessageType_MessageType_LiskAddress MessageType = 115 + MessageType_MessageType_LiskSignTx MessageType = 116 + MessageType_MessageType_LiskSignedTx MessageType = 117 + MessageType_MessageType_LiskSignMessage MessageType = 118 + MessageType_MessageType_LiskMessageSignature MessageType = 119 + MessageType_MessageType_LiskVerifyMessage MessageType = 120 + MessageType_MessageType_LiskGetPublicKey MessageType = 121 + MessageType_MessageType_LiskPublicKey MessageType = 122 + // Tezos + MessageType_MessageType_TezosGetAddress MessageType = 150 + MessageType_MessageType_TezosAddress MessageType = 151 + MessageType_MessageType_TezosSignTx MessageType = 152 + MessageType_MessageType_TezosSignedTx MessageType = 153 + MessageType_MessageType_TezosGetPublicKey MessageType = 154 + MessageType_MessageType_TezosPublicKey MessageType = 155 + // Stellar + MessageType_MessageType_StellarSignTx MessageType = 202 + MessageType_MessageType_StellarTxOpRequest MessageType = 203 + MessageType_MessageType_StellarGetAddress MessageType = 207 + MessageType_MessageType_StellarAddress MessageType = 208 + MessageType_MessageType_StellarCreateAccountOp MessageType = 210 + MessageType_MessageType_StellarPaymentOp MessageType = 211 + MessageType_MessageType_StellarPathPaymentOp MessageType = 212 + MessageType_MessageType_StellarManageOfferOp MessageType = 213 + MessageType_MessageType_StellarCreatePassiveOfferOp MessageType = 214 + MessageType_MessageType_StellarSetOptionsOp MessageType = 215 + MessageType_MessageType_StellarChangeTrustOp MessageType = 216 + MessageType_MessageType_StellarAllowTrustOp MessageType = 217 + MessageType_MessageType_StellarAccountMergeOp MessageType = 218 + // omitted: StellarInflationOp is not a supported operation, would be 219 + MessageType_MessageType_StellarManageDataOp MessageType = 220 + MessageType_MessageType_StellarBumpSequenceOp MessageType = 221 + MessageType_MessageType_StellarSignedTx MessageType = 230 + // TRON + MessageType_MessageType_TronGetAddress MessageType = 250 + MessageType_MessageType_TronAddress MessageType = 251 + MessageType_MessageType_TronSignTx MessageType = 252 + MessageType_MessageType_TronSignedTx MessageType = 253 + // Cardano + // dropped Sign/VerifyMessage ids 300-302 + MessageType_MessageType_CardanoSignTx MessageType = 303 + MessageType_MessageType_CardanoTxRequest MessageType = 304 + MessageType_MessageType_CardanoGetPublicKey MessageType = 305 + MessageType_MessageType_CardanoPublicKey MessageType = 306 + MessageType_MessageType_CardanoGetAddress MessageType = 307 + MessageType_MessageType_CardanoAddress MessageType = 308 + MessageType_MessageType_CardanoTxAck MessageType = 309 + MessageType_MessageType_CardanoSignedTx MessageType = 310 + // Ontology + MessageType_MessageType_OntologyGetAddress MessageType = 350 + MessageType_MessageType_OntologyAddress MessageType = 351 + MessageType_MessageType_OntologyGetPublicKey MessageType = 352 + MessageType_MessageType_OntologyPublicKey MessageType = 353 + MessageType_MessageType_OntologySignTransfer MessageType = 354 + MessageType_MessageType_OntologySignedTransfer MessageType = 355 + MessageType_MessageType_OntologySignWithdrawOng MessageType = 356 + MessageType_MessageType_OntologySignedWithdrawOng MessageType = 357 + MessageType_MessageType_OntologySignOntIdRegister MessageType = 358 + MessageType_MessageType_OntologySignedOntIdRegister MessageType = 359 + MessageType_MessageType_OntologySignOntIdAddAttributes MessageType = 360 + MessageType_MessageType_OntologySignedOntIdAddAttributes MessageType = 361 + // Ripple + MessageType_MessageType_RippleGetAddress MessageType = 400 + MessageType_MessageType_RippleAddress MessageType = 401 + MessageType_MessageType_RippleSignTx MessageType = 402 + MessageType_MessageType_RippleSignedTx MessageType = 403 + // Monero + MessageType_MessageType_MoneroTransactionInitRequest MessageType = 501 + MessageType_MessageType_MoneroTransactionInitAck MessageType = 502 + MessageType_MessageType_MoneroTransactionSetInputRequest MessageType = 503 + MessageType_MessageType_MoneroTransactionSetInputAck MessageType = 504 + MessageType_MessageType_MoneroTransactionInputsPermutationRequest MessageType = 505 + MessageType_MessageType_MoneroTransactionInputsPermutationAck MessageType = 506 + MessageType_MessageType_MoneroTransactionInputViniRequest MessageType = 507 + MessageType_MessageType_MoneroTransactionInputViniAck MessageType = 508 + MessageType_MessageType_MoneroTransactionAllInputsSetRequest MessageType = 509 + MessageType_MessageType_MoneroTransactionAllInputsSetAck MessageType = 510 + MessageType_MessageType_MoneroTransactionSetOutputRequest MessageType = 511 + MessageType_MessageType_MoneroTransactionSetOutputAck MessageType = 512 + MessageType_MessageType_MoneroTransactionAllOutSetRequest MessageType = 513 + MessageType_MessageType_MoneroTransactionAllOutSetAck MessageType = 514 + MessageType_MessageType_MoneroTransactionSignInputRequest MessageType = 515 + MessageType_MessageType_MoneroTransactionSignInputAck MessageType = 516 + MessageType_MessageType_MoneroTransactionFinalRequest MessageType = 517 + MessageType_MessageType_MoneroTransactionFinalAck MessageType = 518 + MessageType_MessageType_MoneroKeyImageExportInitRequest MessageType = 530 + MessageType_MessageType_MoneroKeyImageExportInitAck MessageType = 531 + MessageType_MessageType_MoneroKeyImageSyncStepRequest MessageType = 532 + MessageType_MessageType_MoneroKeyImageSyncStepAck MessageType = 533 + MessageType_MessageType_MoneroKeyImageSyncFinalRequest MessageType = 534 + MessageType_MessageType_MoneroKeyImageSyncFinalAck MessageType = 535 + MessageType_MessageType_MoneroGetAddress MessageType = 540 + MessageType_MessageType_MoneroAddress MessageType = 541 + MessageType_MessageType_MoneroGetWatchKey MessageType = 542 + MessageType_MessageType_MoneroWatchKey MessageType = 543 + MessageType_MessageType_DebugMoneroDiagRequest MessageType = 546 + MessageType_MessageType_DebugMoneroDiagAck MessageType = 547 + MessageType_MessageType_MoneroGetTxKeyRequest MessageType = 550 + MessageType_MessageType_MoneroGetTxKeyAck MessageType = 551 + MessageType_MessageType_MoneroLiveRefreshStartRequest MessageType = 552 + MessageType_MessageType_MoneroLiveRefreshStartAck MessageType = 553 + MessageType_MessageType_MoneroLiveRefreshStepRequest MessageType = 554 + MessageType_MessageType_MoneroLiveRefreshStepAck MessageType = 555 + MessageType_MessageType_MoneroLiveRefreshFinalRequest MessageType = 556 + MessageType_MessageType_MoneroLiveRefreshFinalAck MessageType = 557 + // EOS + MessageType_MessageType_EosGetPublicKey MessageType = 600 + MessageType_MessageType_EosPublicKey MessageType = 601 + MessageType_MessageType_EosSignTx MessageType = 602 + MessageType_MessageType_EosTxActionRequest MessageType = 603 + MessageType_MessageType_EosTxActionAck MessageType = 604 + MessageType_MessageType_EosSignedTx MessageType = 605 + // Binance + MessageType_MessageType_BinanceGetAddress MessageType = 700 + MessageType_MessageType_BinanceAddress MessageType = 701 + MessageType_MessageType_BinanceGetPublicKey MessageType = 702 + MessageType_MessageType_BinancePublicKey MessageType = 703 + MessageType_MessageType_BinanceSignTx MessageType = 704 + MessageType_MessageType_BinanceTxRequest MessageType = 705 + MessageType_MessageType_BinanceTransferMsg MessageType = 706 + MessageType_MessageType_BinanceOrderMsg MessageType = 707 + MessageType_MessageType_BinanceCancelMsg MessageType = 708 + MessageType_MessageType_BinanceSignedTx MessageType = 709 +) + +var MessageType_name = map[int32]string{ + 0: "MessageType_Initialize", + 1: "MessageType_Ping", + 2: "MessageType_Success", + 3: "MessageType_Failure", + 4: "MessageType_ChangePin", + 5: "MessageType_WipeDevice", + 9: "MessageType_GetEntropy", + 10: "MessageType_Entropy", + 13: "MessageType_LoadDevice", + 14: "MessageType_ResetDevice", + 17: "MessageType_Features", + 18: "MessageType_PinMatrixRequest", + 19: "MessageType_PinMatrixAck", + 20: "MessageType_Cancel", + 24: "MessageType_ClearSession", + 25: "MessageType_ApplySettings", + 26: "MessageType_ButtonRequest", + 27: "MessageType_ButtonAck", + 28: "MessageType_ApplyFlags", + 34: "MessageType_BackupDevice", + 35: "MessageType_EntropyRequest", + 36: "MessageType_EntropyAck", + 41: "MessageType_PassphraseRequest", + 42: "MessageType_PassphraseAck", + 77: "MessageType_PassphraseStateRequest", + 78: "MessageType_PassphraseStateAck", + 45: "MessageType_RecoveryDevice", + 46: "MessageType_WordRequest", + 47: "MessageType_WordAck", + 55: "MessageType_GetFeatures", + 63: "MessageType_SetU2FCounter", + 6: "MessageType_FirmwareErase", + 7: "MessageType_FirmwareUpload", + 8: "MessageType_FirmwareRequest", + 32: "MessageType_SelfTest", + 11: "MessageType_GetPublicKey", + 12: "MessageType_PublicKey", + 15: "MessageType_SignTx", + 21: "MessageType_TxRequest", + 22: "MessageType_TxAck", + 29: "MessageType_GetAddress", + 30: "MessageType_Address", + 38: "MessageType_SignMessage", + 39: "MessageType_VerifyMessage", + 40: "MessageType_MessageSignature", + 23: "MessageType_CipherKeyValue", + 48: "MessageType_CipheredKeyValue", + 53: "MessageType_SignIdentity", + 54: "MessageType_SignedIdentity", + 61: "MessageType_GetECDHSessionKey", + 62: "MessageType_ECDHSessionKey", + 71: "MessageType_CosiCommit", + 72: "MessageType_CosiCommitment", + 73: "MessageType_CosiSign", + 74: "MessageType_CosiSignature", + 100: "MessageType_DebugLinkDecision", + 101: "MessageType_DebugLinkGetState", + 102: "MessageType_DebugLinkState", + 103: "MessageType_DebugLinkStop", + 104: "MessageType_DebugLinkLog", + 110: "MessageType_DebugLinkMemoryRead", + 111: "MessageType_DebugLinkMemory", + 112: "MessageType_DebugLinkMemoryWrite", + 113: "MessageType_DebugLinkFlashErase", + 450: "MessageType_EthereumGetPublicKey", + 451: "MessageType_EthereumPublicKey", + 56: "MessageType_EthereumGetAddress", + 57: "MessageType_EthereumAddress", + 58: "MessageType_EthereumSignTx", + 59: "MessageType_EthereumTxRequest", + 60: "MessageType_EthereumTxAck", + 64: "MessageType_EthereumSignMessage", + 65: "MessageType_EthereumVerifyMessage", + 66: "MessageType_EthereumMessageSignature", + 67: "MessageType_NEMGetAddress", + 68: "MessageType_NEMAddress", + 69: "MessageType_NEMSignTx", + 70: "MessageType_NEMSignedTx", + 75: "MessageType_NEMDecryptMessage", + 76: "MessageType_NEMDecryptedMessage", + 114: "MessageType_LiskGetAddress", + 115: "MessageType_LiskAddress", + 116: "MessageType_LiskSignTx", + 117: "MessageType_LiskSignedTx", + 118: "MessageType_LiskSignMessage", + 119: "MessageType_LiskMessageSignature", + 120: "MessageType_LiskVerifyMessage", + 121: "MessageType_LiskGetPublicKey", + 122: "MessageType_LiskPublicKey", + 150: "MessageType_TezosGetAddress", + 151: "MessageType_TezosAddress", + 152: "MessageType_TezosSignTx", + 153: "MessageType_TezosSignedTx", + 154: "MessageType_TezosGetPublicKey", + 155: "MessageType_TezosPublicKey", + 202: "MessageType_StellarSignTx", + 203: "MessageType_StellarTxOpRequest", + 207: "MessageType_StellarGetAddress", + 208: "MessageType_StellarAddress", + 210: "MessageType_StellarCreateAccountOp", + 211: "MessageType_StellarPaymentOp", + 212: "MessageType_StellarPathPaymentOp", + 213: "MessageType_StellarManageOfferOp", + 214: "MessageType_StellarCreatePassiveOfferOp", + 215: "MessageType_StellarSetOptionsOp", + 216: "MessageType_StellarChangeTrustOp", + 217: "MessageType_StellarAllowTrustOp", + 218: "MessageType_StellarAccountMergeOp", + 220: "MessageType_StellarManageDataOp", + 221: "MessageType_StellarBumpSequenceOp", + 230: "MessageType_StellarSignedTx", + 250: "MessageType_TronGetAddress", + 251: "MessageType_TronAddress", + 252: "MessageType_TronSignTx", + 253: "MessageType_TronSignedTx", + 303: "MessageType_CardanoSignTx", + 304: "MessageType_CardanoTxRequest", + 305: "MessageType_CardanoGetPublicKey", + 306: "MessageType_CardanoPublicKey", + 307: "MessageType_CardanoGetAddress", + 308: "MessageType_CardanoAddress", + 309: "MessageType_CardanoTxAck", + 310: "MessageType_CardanoSignedTx", + 350: "MessageType_OntologyGetAddress", + 351: "MessageType_OntologyAddress", + 352: "MessageType_OntologyGetPublicKey", + 353: "MessageType_OntologyPublicKey", + 354: "MessageType_OntologySignTransfer", + 355: "MessageType_OntologySignedTransfer", + 356: "MessageType_OntologySignWithdrawOng", + 357: "MessageType_OntologySignedWithdrawOng", + 358: "MessageType_OntologySignOntIdRegister", + 359: "MessageType_OntologySignedOntIdRegister", + 360: "MessageType_OntologySignOntIdAddAttributes", + 361: "MessageType_OntologySignedOntIdAddAttributes", + 400: "MessageType_RippleGetAddress", + 401: "MessageType_RippleAddress", + 402: "MessageType_RippleSignTx", + 403: "MessageType_RippleSignedTx", + 501: "MessageType_MoneroTransactionInitRequest", + 502: "MessageType_MoneroTransactionInitAck", + 503: "MessageType_MoneroTransactionSetInputRequest", + 504: "MessageType_MoneroTransactionSetInputAck", + 505: "MessageType_MoneroTransactionInputsPermutationRequest", + 506: "MessageType_MoneroTransactionInputsPermutationAck", + 507: "MessageType_MoneroTransactionInputViniRequest", + 508: "MessageType_MoneroTransactionInputViniAck", + 509: "MessageType_MoneroTransactionAllInputsSetRequest", + 510: "MessageType_MoneroTransactionAllInputsSetAck", + 511: "MessageType_MoneroTransactionSetOutputRequest", + 512: "MessageType_MoneroTransactionSetOutputAck", + 513: "MessageType_MoneroTransactionAllOutSetRequest", + 514: "MessageType_MoneroTransactionAllOutSetAck", + 515: "MessageType_MoneroTransactionSignInputRequest", + 516: "MessageType_MoneroTransactionSignInputAck", + 517: "MessageType_MoneroTransactionFinalRequest", + 518: "MessageType_MoneroTransactionFinalAck", + 530: "MessageType_MoneroKeyImageExportInitRequest", + 531: "MessageType_MoneroKeyImageExportInitAck", + 532: "MessageType_MoneroKeyImageSyncStepRequest", + 533: "MessageType_MoneroKeyImageSyncStepAck", + 534: "MessageType_MoneroKeyImageSyncFinalRequest", + 535: "MessageType_MoneroKeyImageSyncFinalAck", + 540: "MessageType_MoneroGetAddress", + 541: "MessageType_MoneroAddress", + 542: "MessageType_MoneroGetWatchKey", + 543: "MessageType_MoneroWatchKey", + 546: "MessageType_DebugMoneroDiagRequest", + 547: "MessageType_DebugMoneroDiagAck", + 550: "MessageType_MoneroGetTxKeyRequest", + 551: "MessageType_MoneroGetTxKeyAck", + 552: "MessageType_MoneroLiveRefreshStartRequest", + 553: "MessageType_MoneroLiveRefreshStartAck", + 554: "MessageType_MoneroLiveRefreshStepRequest", + 555: "MessageType_MoneroLiveRefreshStepAck", + 556: "MessageType_MoneroLiveRefreshFinalRequest", + 557: "MessageType_MoneroLiveRefreshFinalAck", + 600: "MessageType_EosGetPublicKey", + 601: "MessageType_EosPublicKey", + 602: "MessageType_EosSignTx", + 603: "MessageType_EosTxActionRequest", + 604: "MessageType_EosTxActionAck", + 605: "MessageType_EosSignedTx", + 700: "MessageType_BinanceGetAddress", + 701: "MessageType_BinanceAddress", + 702: "MessageType_BinanceGetPublicKey", + 703: "MessageType_BinancePublicKey", + 704: "MessageType_BinanceSignTx", + 705: "MessageType_BinanceTxRequest", + 706: "MessageType_BinanceTransferMsg", + 707: "MessageType_BinanceOrderMsg", + 708: "MessageType_BinanceCancelMsg", + 709: "MessageType_BinanceSignedTx", +} + +var MessageType_value = map[string]int32{ + "MessageType_Initialize": 0, + "MessageType_Ping": 1, + "MessageType_Success": 2, + "MessageType_Failure": 3, + "MessageType_ChangePin": 4, + "MessageType_WipeDevice": 5, + "MessageType_GetEntropy": 9, + "MessageType_Entropy": 10, + "MessageType_LoadDevice": 13, + "MessageType_ResetDevice": 14, + "MessageType_Features": 17, + "MessageType_PinMatrixRequest": 18, + "MessageType_PinMatrixAck": 19, + "MessageType_Cancel": 20, + "MessageType_ClearSession": 24, + "MessageType_ApplySettings": 25, + "MessageType_ButtonRequest": 26, + "MessageType_ButtonAck": 27, + "MessageType_ApplyFlags": 28, + "MessageType_BackupDevice": 34, + "MessageType_EntropyRequest": 35, + "MessageType_EntropyAck": 36, + "MessageType_PassphraseRequest": 41, + "MessageType_PassphraseAck": 42, + "MessageType_PassphraseStateRequest": 77, + "MessageType_PassphraseStateAck": 78, + "MessageType_RecoveryDevice": 45, + "MessageType_WordRequest": 46, + "MessageType_WordAck": 47, + "MessageType_GetFeatures": 55, + "MessageType_SetU2FCounter": 63, + "MessageType_FirmwareErase": 6, + "MessageType_FirmwareUpload": 7, + "MessageType_FirmwareRequest": 8, + "MessageType_SelfTest": 32, + "MessageType_GetPublicKey": 11, + "MessageType_PublicKey": 12, + "MessageType_SignTx": 15, + "MessageType_TxRequest": 21, + "MessageType_TxAck": 22, + "MessageType_GetAddress": 29, + "MessageType_Address": 30, + "MessageType_SignMessage": 38, + "MessageType_VerifyMessage": 39, + "MessageType_MessageSignature": 40, + "MessageType_CipherKeyValue": 23, + "MessageType_CipheredKeyValue": 48, + "MessageType_SignIdentity": 53, + "MessageType_SignedIdentity": 54, + "MessageType_GetECDHSessionKey": 61, + "MessageType_ECDHSessionKey": 62, + "MessageType_CosiCommit": 71, + "MessageType_CosiCommitment": 72, + "MessageType_CosiSign": 73, + "MessageType_CosiSignature": 74, + "MessageType_DebugLinkDecision": 100, + "MessageType_DebugLinkGetState": 101, + "MessageType_DebugLinkState": 102, + "MessageType_DebugLinkStop": 103, + "MessageType_DebugLinkLog": 104, + "MessageType_DebugLinkMemoryRead": 110, + "MessageType_DebugLinkMemory": 111, + "MessageType_DebugLinkMemoryWrite": 112, + "MessageType_DebugLinkFlashErase": 113, + "MessageType_EthereumGetPublicKey": 450, + "MessageType_EthereumPublicKey": 451, + "MessageType_EthereumGetAddress": 56, + "MessageType_EthereumAddress": 57, + "MessageType_EthereumSignTx": 58, + "MessageType_EthereumTxRequest": 59, + "MessageType_EthereumTxAck": 60, + "MessageType_EthereumSignMessage": 64, + "MessageType_EthereumVerifyMessage": 65, + "MessageType_EthereumMessageSignature": 66, + "MessageType_NEMGetAddress": 67, + "MessageType_NEMAddress": 68, + "MessageType_NEMSignTx": 69, + "MessageType_NEMSignedTx": 70, + "MessageType_NEMDecryptMessage": 75, + "MessageType_NEMDecryptedMessage": 76, + "MessageType_LiskGetAddress": 114, + "MessageType_LiskAddress": 115, + "MessageType_LiskSignTx": 116, + "MessageType_LiskSignedTx": 117, + "MessageType_LiskSignMessage": 118, + "MessageType_LiskMessageSignature": 119, + "MessageType_LiskVerifyMessage": 120, + "MessageType_LiskGetPublicKey": 121, + "MessageType_LiskPublicKey": 122, + "MessageType_TezosGetAddress": 150, + "MessageType_TezosAddress": 151, + "MessageType_TezosSignTx": 152, + "MessageType_TezosSignedTx": 153, + "MessageType_TezosGetPublicKey": 154, + "MessageType_TezosPublicKey": 155, + "MessageType_StellarSignTx": 202, + "MessageType_StellarTxOpRequest": 203, + "MessageType_StellarGetAddress": 207, + "MessageType_StellarAddress": 208, + "MessageType_StellarCreateAccountOp": 210, + "MessageType_StellarPaymentOp": 211, + "MessageType_StellarPathPaymentOp": 212, + "MessageType_StellarManageOfferOp": 213, + "MessageType_StellarCreatePassiveOfferOp": 214, + "MessageType_StellarSetOptionsOp": 215, + "MessageType_StellarChangeTrustOp": 216, + "MessageType_StellarAllowTrustOp": 217, + "MessageType_StellarAccountMergeOp": 218, + "MessageType_StellarManageDataOp": 220, + "MessageType_StellarBumpSequenceOp": 221, + "MessageType_StellarSignedTx": 230, + "MessageType_TronGetAddress": 250, + "MessageType_TronAddress": 251, + "MessageType_TronSignTx": 252, + "MessageType_TronSignedTx": 253, + "MessageType_CardanoSignTx": 303, + "MessageType_CardanoTxRequest": 304, + "MessageType_CardanoGetPublicKey": 305, + "MessageType_CardanoPublicKey": 306, + "MessageType_CardanoGetAddress": 307, + "MessageType_CardanoAddress": 308, + "MessageType_CardanoTxAck": 309, + "MessageType_CardanoSignedTx": 310, + "MessageType_OntologyGetAddress": 350, + "MessageType_OntologyAddress": 351, + "MessageType_OntologyGetPublicKey": 352, + "MessageType_OntologyPublicKey": 353, + "MessageType_OntologySignTransfer": 354, + "MessageType_OntologySignedTransfer": 355, + "MessageType_OntologySignWithdrawOng": 356, + "MessageType_OntologySignedWithdrawOng": 357, + "MessageType_OntologySignOntIdRegister": 358, + "MessageType_OntologySignedOntIdRegister": 359, + "MessageType_OntologySignOntIdAddAttributes": 360, + "MessageType_OntologySignedOntIdAddAttributes": 361, + "MessageType_RippleGetAddress": 400, + "MessageType_RippleAddress": 401, + "MessageType_RippleSignTx": 402, + "MessageType_RippleSignedTx": 403, + "MessageType_MoneroTransactionInitRequest": 501, + "MessageType_MoneroTransactionInitAck": 502, + "MessageType_MoneroTransactionSetInputRequest": 503, + "MessageType_MoneroTransactionSetInputAck": 504, + "MessageType_MoneroTransactionInputsPermutationRequest": 505, + "MessageType_MoneroTransactionInputsPermutationAck": 506, + "MessageType_MoneroTransactionInputViniRequest": 507, + "MessageType_MoneroTransactionInputViniAck": 508, + "MessageType_MoneroTransactionAllInputsSetRequest": 509, + "MessageType_MoneroTransactionAllInputsSetAck": 510, + "MessageType_MoneroTransactionSetOutputRequest": 511, + "MessageType_MoneroTransactionSetOutputAck": 512, + "MessageType_MoneroTransactionAllOutSetRequest": 513, + "MessageType_MoneroTransactionAllOutSetAck": 514, + "MessageType_MoneroTransactionSignInputRequest": 515, + "MessageType_MoneroTransactionSignInputAck": 516, + "MessageType_MoneroTransactionFinalRequest": 517, + "MessageType_MoneroTransactionFinalAck": 518, + "MessageType_MoneroKeyImageExportInitRequest": 530, + "MessageType_MoneroKeyImageExportInitAck": 531, + "MessageType_MoneroKeyImageSyncStepRequest": 532, + "MessageType_MoneroKeyImageSyncStepAck": 533, + "MessageType_MoneroKeyImageSyncFinalRequest": 534, + "MessageType_MoneroKeyImageSyncFinalAck": 535, + "MessageType_MoneroGetAddress": 540, + "MessageType_MoneroAddress": 541, + "MessageType_MoneroGetWatchKey": 542, + "MessageType_MoneroWatchKey": 543, + "MessageType_DebugMoneroDiagRequest": 546, + "MessageType_DebugMoneroDiagAck": 547, + "MessageType_MoneroGetTxKeyRequest": 550, + "MessageType_MoneroGetTxKeyAck": 551, + "MessageType_MoneroLiveRefreshStartRequest": 552, + "MessageType_MoneroLiveRefreshStartAck": 553, + "MessageType_MoneroLiveRefreshStepRequest": 554, + "MessageType_MoneroLiveRefreshStepAck": 555, + "MessageType_MoneroLiveRefreshFinalRequest": 556, + "MessageType_MoneroLiveRefreshFinalAck": 557, + "MessageType_EosGetPublicKey": 600, + "MessageType_EosPublicKey": 601, + "MessageType_EosSignTx": 602, + "MessageType_EosTxActionRequest": 603, + "MessageType_EosTxActionAck": 604, + "MessageType_EosSignedTx": 605, + "MessageType_BinanceGetAddress": 700, + "MessageType_BinanceAddress": 701, + "MessageType_BinanceGetPublicKey": 702, + "MessageType_BinancePublicKey": 703, + "MessageType_BinanceSignTx": 704, + "MessageType_BinanceTxRequest": 705, + "MessageType_BinanceTransferMsg": 706, + "MessageType_BinanceOrderMsg": 707, + "MessageType_BinanceCancelMsg": 708, + "MessageType_BinanceSignedTx": 709, +} + +func (x MessageType) Enum() *MessageType { + p := new(MessageType) + *p = x + return p +} + +func (x MessageType) String() string { + return proto.EnumName(MessageType_name, int32(x)) +} + +func (x *MessageType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MessageType_value, data, "MessageType") + if err != nil { + return err + } + *x = MessageType(value) + return nil +} + +func (MessageType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{0} +} + +var E_WireIn = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50002, + Name: "hw.trezor.messages.wire_in", + Tag: "varint,50002,opt,name=wire_in", + Filename: "messages.proto", +} + +var E_WireOut = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50003, + Name: "hw.trezor.messages.wire_out", + Tag: "varint,50003,opt,name=wire_out", + Filename: "messages.proto", +} + +var E_WireDebugIn = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50004, + Name: "hw.trezor.messages.wire_debug_in", + Tag: "varint,50004,opt,name=wire_debug_in", + Filename: "messages.proto", +} + +var E_WireDebugOut = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50005, + Name: "hw.trezor.messages.wire_debug_out", + Tag: "varint,50005,opt,name=wire_debug_out", + Filename: "messages.proto", +} + +var E_WireTiny = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50006, + Name: "hw.trezor.messages.wire_tiny", + Tag: "varint,50006,opt,name=wire_tiny", + Filename: "messages.proto", +} + +var E_WireBootloader = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50007, + Name: "hw.trezor.messages.wire_bootloader", + Tag: "varint,50007,opt,name=wire_bootloader", + Filename: "messages.proto", +} + +var E_WireNoFsm = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50008, + Name: "hw.trezor.messages.wire_no_fsm", + Tag: "varint,50008,opt,name=wire_no_fsm", + Filename: "messages.proto", +} + +func init() { + proto.RegisterEnum("hw.trezor.messages.MessageType", MessageType_name, MessageType_value) + proto.RegisterExtension(E_WireIn) + proto.RegisterExtension(E_WireOut) + proto.RegisterExtension(E_WireDebugIn) + proto.RegisterExtension(E_WireDebugOut) + proto.RegisterExtension(E_WireTiny) + proto.RegisterExtension(E_WireBootloader) + proto.RegisterExtension(E_WireNoFsm) +} + +func init() { proto.RegisterFile("messages.proto", fileDescriptor_4dc296cbfe5ffcd5) } + +var fileDescriptor_4dc296cbfe5ffcd5 = []byte{ + // 2430 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x9a, 0xd9, 0x73, 0x1c, 0xc5, + 0x1d, 0xc7, 0xb3, 0xab, 0x11, 0x88, 0xf6, 0x41, 0x23, 0xb0, 0x2d, 0xaf, 0x2f, 0xf9, 0xc0, 0x96, + 0x2f, 0xd9, 0x10, 0x0c, 0x44, 0x38, 0x60, 0x69, 0xb5, 0x12, 0x8a, 0xb5, 0x5a, 0x97, 0x76, 0xb1, + 0x1f, 0x5d, 0xa3, 0x9d, 0xd6, 0x6e, 0x97, 0x67, 0x67, 0x86, 0x9e, 0x1e, 0x49, 0xeb, 0xa7, 0x9c, + 0x3c, 0x13, 0x48, 0xc0, 0xb9, 0xa9, 0xa4, 0x2a, 0x21, 0x57, 0x85, 0x1c, 0x4e, 0x25, 0x55, 0x39, + 0x08, 0x24, 0x2f, 0xc9, 0x43, 0x52, 0x9c, 0x86, 0x40, 0xee, 0x90, 0xe4, 0x0f, 0xc8, 0xc5, 0x91, + 0xa4, 0x7a, 0xa6, 0xbb, 0xe7, 0xd8, 0xdf, 0xae, 0x36, 0x6f, 0x58, 0xf3, 0xf9, 0x7d, 0x7f, 0x47, + 0xff, 0xfa, 0x37, 0xdd, 0xb3, 0xa0, 0xcd, 0x2d, 0xe2, 0xfb, 0x66, 0x83, 0xf8, 0xe3, 0x1e, 0x73, + 0xb9, 0x3b, 0x3c, 0xdc, 0x5c, 0x1d, 0xe7, 0x8c, 0x5c, 0x76, 0xd9, 0xb8, 0x7a, 0x52, 0x18, 0x6d, + 0xb8, 0x6e, 0xc3, 0x26, 0x27, 0x42, 0x62, 0x29, 0x58, 0x3e, 0x61, 0x11, 0xbf, 0xce, 0xa8, 0xc7, + 0x5d, 0x16, 0x59, 0x1d, 0xf9, 0xfe, 0x7d, 0x68, 0x43, 0x39, 0xc2, 0x6b, 0x6d, 0x8f, 0x0c, 0x1f, + 0x40, 0x5b, 0x13, 0xff, 0xbc, 0x38, 0xe7, 0x50, 0x4e, 0x4d, 0x9b, 0x5e, 0x26, 0xf8, 0x5d, 0x85, + 0xa1, 0x87, 0xaf, 0x8e, 0xe4, 0x9e, 0xba, 0x3a, 0x92, 0x1b, 0x2e, 0x20, 0x9c, 0xa4, 0xce, 0x51, + 0xa7, 0x81, 0x73, 0x05, 0x43, 0x3c, 0x1f, 0xde, 0x85, 0x6e, 0x4e, 0x3e, 0xab, 0x06, 0xf5, 0x3a, + 0xf1, 0x7d, 0x9c, 0x2f, 0x18, 0x57, 0x80, 0xc7, 0x33, 0x26, 0xb5, 0x03, 0x46, 0xf0, 0x80, 0x7c, + 0xbc, 0x07, 0x6d, 0x49, 0x3e, 0x2e, 0x36, 0x4d, 0xa7, 0x41, 0xce, 0x51, 0x07, 0x1b, 0x52, 0x7e, + 0x34, 0x1d, 0xe0, 0x05, 0xea, 0x91, 0x69, 0xb2, 0x42, 0xeb, 0x04, 0x0f, 0xc2, 0xc4, 0x2c, 0xe1, + 0x25, 0x87, 0x33, 0xd7, 0x6b, 0xe3, 0x1b, 0xe0, 0x10, 0xd5, 0x63, 0x24, 0x63, 0xc8, 0x08, 0xcc, + 0xbb, 0xa6, 0x25, 0x5d, 0x6c, 0x92, 0x02, 0x7b, 0xd1, 0xb6, 0x24, 0xb1, 0x48, 0x7c, 0xc2, 0x25, + 0xb2, 0x59, 0x22, 0xbb, 0xd1, 0x2d, 0xa9, 0x3c, 0x89, 0xc9, 0x03, 0x46, 0x7c, 0x7c, 0x93, 0x74, + 0x72, 0x10, 0xed, 0xcc, 0x94, 0xb0, 0x6c, 0x72, 0x46, 0xd7, 0x16, 0xc9, 0x83, 0x01, 0xf1, 0x39, + 0x1e, 0x96, 0xdc, 0x11, 0x34, 0x02, 0x72, 0x93, 0xf5, 0x4b, 0xf8, 0xe6, 0xc2, 0x46, 0xb5, 0x24, + 0x4f, 0x47, 0x81, 0x0f, 0xa7, 0x8a, 0x67, 0x3a, 0x75, 0x62, 0xe3, 0x5b, 0x12, 0x0b, 0xb7, 0x2f, + 0xad, 0x56, 0xb4, 0x89, 0xc9, 0xaa, 0xc4, 0xf7, 0xa9, 0xeb, 0xe0, 0x11, 0x19, 0xf9, 0x7e, 0xb4, + 0x3d, 0xc9, 0x4c, 0x7a, 0x9e, 0xdd, 0xae, 0x12, 0xce, 0xa9, 0xd3, 0xf0, 0xf1, 0x76, 0x18, 0x9a, + 0x0a, 0x38, 0x77, 0x1d, 0x15, 0x7b, 0x41, 0xc6, 0x7e, 0x28, 0xbd, 0x98, 0x11, 0x24, 0x02, 0xdf, + 0xd1, 0x11, 0xf8, 0xd6, 0x0e, 0x97, 0x33, 0xb6, 0xd9, 0xf0, 0xf1, 0x4e, 0xe9, 0x2f, 0x13, 0xf8, + 0x94, 0x59, 0xbf, 0x14, 0x78, 0xb2, 0xe4, 0xfb, 0x24, 0x73, 0x00, 0x15, 0x80, 0x65, 0x55, 0x41, + 0xed, 0x87, 0x57, 0x57, 0x52, 0x22, 0xaa, 0x03, 0x52, 0xe7, 0x10, 0xda, 0x95, 0x2a, 0xb9, 0xe9, + 0xfb, 0x5e, 0x93, 0x99, 0x3e, 0x51, 0x52, 0x87, 0xa5, 0xd4, 0xd1, 0x74, 0x11, 0x62, 0x50, 0xa8, + 0x1d, 0xc9, 0xe4, 0x78, 0x0c, 0xed, 0x83, 0xe1, 0x2a, 0x37, 0xb9, 0x96, 0x2e, 0x4b, 0xe9, 0x93, + 0x68, 0x77, 0x0f, 0x5a, 0xe8, 0x2f, 0x64, 0xf4, 0x33, 0xd9, 0x2f, 0x92, 0xba, 0xbb, 0x42, 0x58, + 0x5b, 0xd6, 0xe8, 0x38, 0xdc, 0xb9, 0x17, 0x5c, 0x66, 0x29, 0xd7, 0xe3, 0xf0, 0x0e, 0x15, 0x88, + 0xf0, 0x77, 0x02, 0x56, 0x98, 0x25, 0x5c, 0xf7, 0xf6, 0x5d, 0x70, 0x73, 0x54, 0x09, 0x7f, 0xe0, + 0xf6, 0x99, 0xa2, 0x1b, 0x38, 0x9c, 0x30, 0x7c, 0x9f, 0xae, 0x72, 0x0a, 0x9a, 0xa1, 0xac, 0xb5, + 0x6a, 0x32, 0x52, 0x12, 0x49, 0xe2, 0xeb, 0xa2, 0x9e, 0xfd, 0x9e, 0x00, 0xc7, 0xd2, 0x89, 0x29, + 0xf0, 0x01, 0xcf, 0x76, 0x4d, 0x0b, 0x5f, 0x9f, 0x20, 0x0f, 0xa3, 0x1d, 0x10, 0xa9, 0x12, 0x1c, + 0x2a, 0x0c, 0x5d, 0x51, 0xe8, 0xbe, 0xf4, 0xf6, 0xac, 0x12, 0x7b, 0xb9, 0x26, 0x98, 0xd1, 0x84, + 0x5c, 0xa6, 0xe7, 0x66, 0x09, 0x3f, 0x17, 0x2c, 0xd9, 0xb4, 0x7e, 0x96, 0xb4, 0xf1, 0x06, 0x99, + 0x45, 0x66, 0x5e, 0xc5, 0xc0, 0x46, 0x59, 0xcd, 0x9d, 0xe9, 0x3d, 0x59, 0xa5, 0x0d, 0xa7, 0xb6, + 0x86, 0x6f, 0x84, 0xcd, 0x6b, 0x7a, 0xfb, 0x6f, 0x91, 0xe6, 0x3b, 0xd0, 0x4d, 0x69, 0x40, 0x2c, + 0xc5, 0xd6, 0xae, 0x93, 0x6e, 0xd2, 0xb2, 0x98, 0x98, 0xb6, 0xbb, 0xe0, 0x49, 0xa7, 0x1e, 0xef, + 0x96, 0xea, 0x99, 0xb5, 0x14, 0xc1, 0xc9, 0x7f, 0xe3, 0x83, 0xf0, 0x5a, 0x9e, 0x27, 0x8c, 0x2e, + 0xb7, 0x15, 0x74, 0x48, 0x42, 0x99, 0x61, 0x26, 0xff, 0x5b, 0xc8, 0x85, 0x9d, 0x81, 0xc7, 0xa4, + 0xbf, 0x4c, 0x8f, 0x16, 0xa9, 0xd7, 0x24, 0xec, 0x2c, 0x69, 0x9f, 0x37, 0xed, 0x80, 0xe0, 0x6d, + 0xb0, 0x5a, 0x44, 0x11, 0x4b, 0x73, 0x27, 0xa5, 0x5a, 0x66, 0x7d, 0x84, 0xbb, 0x39, 0x8b, 0x38, + 0x9c, 0xf2, 0x36, 0x3e, 0x05, 0xcf, 0x04, 0xc1, 0x10, 0x4b, 0x53, 0x77, 0xea, 0x41, 0xb5, 0x2b, + 0xfb, 0xca, 0x28, 0x4e, 0xdf, 0x2f, 0x07, 0xa3, 0x58, 0xcd, 0xf7, 0x76, 0x19, 0x31, 0x69, 0xea, + 0x5e, 0x78, 0xc4, 0x14, 0x5d, 0x9f, 0x16, 0xdd, 0x56, 0x8b, 0x72, 0x3c, 0x0b, 0xeb, 0xc4, 0x44, + 0x8b, 0x38, 0x1c, 0xdf, 0x2f, 0x75, 0x32, 0xef, 0x10, 0x41, 0x89, 0x04, 0xf0, 0x1c, 0xbc, 0x36, + 0xea, 0x79, 0x54, 0xf3, 0xf7, 0x49, 0x91, 0x13, 0xe9, 0xdc, 0xa6, 0xc9, 0x52, 0xd0, 0x98, 0xa7, + 0xce, 0xa5, 0x69, 0x52, 0xa7, 0xe1, 0xdc, 0xb7, 0x0a, 0x1b, 0x9f, 0x48, 0x0e, 0x92, 0xa3, 0x5d, + 0x0c, 0x66, 0x09, 0x0f, 0x87, 0x0f, 0x26, 0x85, 0x21, 0x65, 0x90, 0x4d, 0x44, 0xc3, 0x11, 0xb9, + 0x5c, 0x30, 0x9e, 0x04, 0x02, 0x4d, 0x50, 0xae, 0x87, 0x1b, 0x05, 0xe3, 0x09, 0x60, 0x39, 0x35, + 0x34, 0xef, 0x36, 0x70, 0x53, 0x0a, 0x1d, 0x46, 0x7b, 0x40, 0xa6, 0x4c, 0x5a, 0x2e, 0x6b, 0x2f, + 0x12, 0xd3, 0xc2, 0x8e, 0x94, 0xbb, 0x35, 0x3d, 0x0c, 0x32, 0x28, 0x76, 0xa5, 0xe2, 0x11, 0x34, + 0xda, 0x03, 0xbb, 0xc0, 0x28, 0x27, 0xd8, 0x93, 0x92, 0xdd, 0xbc, 0xcf, 0xd8, 0xa6, 0xdf, 0x8c, + 0x06, 0xd7, 0x83, 0x12, 0x3d, 0x9a, 0x96, 0x2d, 0x71, 0xd1, 0xc2, 0x41, 0x2b, 0x35, 0x43, 0x9e, + 0x19, 0x90, 0xeb, 0x38, 0x96, 0xae, 0xb8, 0x82, 0x63, 0xf2, 0x59, 0x75, 0x3c, 0x1a, 0x4b, 0xbf, + 0x16, 0x12, 0xb2, 0x6a, 0x6b, 0xdf, 0x2d, 0x35, 0x33, 0xe9, 0x2b, 0x52, 0x61, 0xef, 0x81, 0x77, + 0xa4, 0xc2, 0xe4, 0x98, 0x9a, 0x80, 0xdf, 0x88, 0x8a, 0x8a, 0xc7, 0xd5, 0x3d, 0x52, 0x2e, 0xb3, + 0xd0, 0x31, 0x28, 0xc6, 0xd6, 0x69, 0xa9, 0x96, 0x29, 0x63, 0xd2, 0xa7, 0x1a, 0x2c, 0x67, 0x24, + 0x7a, 0x14, 0xed, 0x85, 0xd0, 0xf4, 0x14, 0x9a, 0x94, 0xf0, 0x38, 0x3a, 0x00, 0xc1, 0x1d, 0xd3, + 0x68, 0x0a, 0x0e, 0x76, 0xa1, 0x54, 0x4e, 0xd4, 0xb1, 0x08, 0xcf, 0xd8, 0x85, 0x52, 0x59, 0x11, + 0xd3, 0xf0, 0x91, 0x75, 0xa1, 0x54, 0x96, 0xd5, 0x2b, 0xc1, 0x6f, 0x4c, 0x09, 0x10, 0xab, 0xb6, + 0x86, 0x67, 0xe0, 0x01, 0xb4, 0x50, 0x2a, 0x4f, 0x93, 0x3a, 0x6b, 0x7b, 0x5c, 0xe5, 0x78, 0x16, + 0xae, 0x5d, 0x0c, 0x12, 0x4b, 0xa1, 0xf3, 0xf0, 0xd2, 0xce, 0x53, 0xff, 0x52, 0x22, 0x3f, 0x06, + 0x07, 0x27, 0x28, 0x85, 0xf8, 0x5d, 0xce, 0xc3, 0xd4, 0xbf, 0x24, 0x33, 0xe4, 0xf0, 0xe9, 0x4c, + 0x11, 0x61, 0x8a, 0x81, 0x54, 0xc9, 0x34, 0xa4, 0x62, 0x54, 0xd4, 0x2b, 0x52, 0x2a, 0xb3, 0x1f, + 0x05, 0xd6, 0xb1, 0x80, 0xab, 0x70, 0xd5, 0x04, 0x9b, 0xee, 0x8c, 0x35, 0xf8, 0x8d, 0x22, 0x4b, + 0x11, 0xef, 0xaf, 0x36, 0x3c, 0x50, 0x05, 0x17, 0x43, 0x97, 0xf5, 0xc9, 0x3d, 0x95, 0x48, 0x8d, + 0x5c, 0x76, 0xfd, 0x44, 0x61, 0x1f, 0xcb, 0x69, 0xb1, 0x91, 0x0e, 0x4e, 0x41, 0x8f, 0xe7, 0xf4, + 0x3b, 0x6c, 0x5b, 0x07, 0x24, 0x8b, 0x7b, 0x25, 0xa7, 0x5f, 0x16, 0xdb, 0x41, 0x26, 0x2c, 0xef, + 0x27, 0x72, 0x7a, 0x34, 0xec, 0x82, 0xc2, 0x8a, 0xe3, 0xff, 0x64, 0x4e, 0x8f, 0x86, 0x42, 0x07, + 0x19, 0x63, 0x9f, 0xca, 0xe9, 0xfe, 0x49, 0x9f, 0xe2, 0x38, 0xb1, 0x6d, 0x93, 0xc9, 0xe0, 0x7e, + 0x9e, 0xd3, 0x0d, 0xb9, 0x1b, 0xa0, 0x6a, 0x6b, 0x15, 0x4f, 0xcd, 0x86, 0x5f, 0x74, 0x89, 0x50, + 0xa2, 0x89, 0xd2, 0xfd, 0xb2, 0x4b, 0x84, 0x92, 0x54, 0xd8, 0xaf, 0x94, 0xe0, 0xf1, 0xf4, 0x91, + 0x5a, 0x62, 0x45, 0x46, 0xc2, 0x23, 0x72, 0x5d, 0x1c, 0x38, 0x2b, 0x1e, 0x7e, 0x2e, 0xa7, 0xa7, + 0xd8, 0x4e, 0x00, 0x3f, 0x67, 0xb6, 0xc5, 0x4b, 0xb7, 0xe2, 0xe1, 0xe7, 0x73, 0x7a, 0xea, 0x8c, + 0x82, 0x20, 0x6f, 0xc6, 0xf0, 0x0b, 0xbd, 0xe1, 0xb2, 0xe9, 0x98, 0x0d, 0x52, 0x59, 0x5e, 0x26, + 0xac, 0xe2, 0xe1, 0x17, 0x15, 0x7c, 0x3b, 0x3a, 0xd4, 0x35, 0x62, 0x71, 0xc6, 0xa7, 0x2b, 0xda, + 0xe6, 0xa5, 0x9c, 0xde, 0x11, 0x7b, 0xa0, 0x75, 0x20, 0xbc, 0xe2, 0x71, 0xea, 0x3a, 0x7e, 0xc5, + 0xc3, 0x2f, 0xf7, 0x0e, 0x26, 0xba, 0x45, 0xd7, 0x58, 0xe0, 0x8b, 0xc8, 0xaf, 0xf5, 0x16, 0x9e, + 0xb4, 0x6d, 0x77, 0x55, 0xb1, 0xaf, 0x28, 0xf6, 0x58, 0x7a, 0x10, 0x2b, 0x36, 0x2a, 0x72, 0x99, + 0xb0, 0x06, 0xa9, 0x78, 0xf8, 0xd5, 0xde, 0xca, 0x51, 0x4d, 0xa6, 0x4d, 0x6e, 0x56, 0x3c, 0xfc, + 0x5a, 0x6f, 0xe5, 0xa9, 0xa0, 0xe5, 0x55, 0x45, 0x03, 0x39, 0x75, 0xa1, 0xfc, 0x7a, 0x4e, 0xef, + 0xe4, 0x1d, 0x5d, 0x9a, 0x32, 0xdc, 0x0d, 0x6f, 0xe4, 0xf4, 0xb4, 0x49, 0xf7, 0x38, 0x73, 0x9d, + 0x44, 0xa3, 0xbd, 0x99, 0xd3, 0x83, 0x6b, 0x5b, 0x16, 0x53, 0xcc, 0x5b, 0x39, 0x7d, 0x48, 0xde, + 0x9a, 0x65, 0xe4, 0x26, 0x78, 0xbb, 0xdb, 0x56, 0x97, 0x48, 0x18, 0xd2, 0x3b, 0x5d, 0xf6, 0x53, + 0xd1, 0x64, 0x96, 0xe9, 0xb8, 0x52, 0xea, 0x1b, 0x79, 0xb8, 0x49, 0x25, 0x15, 0xbf, 0x69, 0x9f, + 0xca, 0xeb, 0x0f, 0x03, 0x7b, 0x00, 0x30, 0xb5, 0xe3, 0xbf, 0xd9, 0x5b, 0x34, 0x06, 0xbf, 0x95, + 0x87, 0xb7, 0x68, 0x2c, 0xaa, 0xaa, 0xf2, 0xed, 0x3c, 0xbc, 0x45, 0x25, 0xa9, 0xb0, 0xef, 0xe4, + 0xf5, 0x3b, 0x76, 0x04, 0x4c, 0x47, 0x9c, 0x07, 0xae, 0xe6, 0xe1, 0x45, 0x4d, 0x54, 0x26, 0xac, + 0xe0, 0x77, 0x95, 0x58, 0x66, 0xd6, 0x54, 0x1c, 0xee, 0xda, 0x6e, 0xa3, 0x9d, 0x08, 0xef, 0x37, + 0x5d, 0x24, 0x15, 0xaa, 0xb8, 0xdf, 0xe6, 0xf5, 0x15, 0x7e, 0xb4, 0x8b, 0x64, 0x5c, 0x9d, 0xdf, + 0xe5, 0xe1, 0x73, 0x9a, 0x82, 0x63, 0xf2, 0xf7, 0xeb, 0xc8, 0x86, 0x8b, 0xcd, 0x4c, 0xc7, 0x5f, + 0x26, 0x0c, 0xff, 0x41, 0xc9, 0x66, 0xc6, 0x58, 0x12, 0x26, 0x96, 0xc6, 0xff, 0xa8, 0xb4, 0xc7, + 0xd1, 0xfe, 0x6e, 0xf8, 0x05, 0xca, 0x9b, 0x16, 0x33, 0x57, 0x2b, 0x4e, 0x03, 0xff, 0x49, 0xc9, + 0x9f, 0x44, 0xb7, 0x76, 0x97, 0x4f, 0x5a, 0xfc, 0x39, 0xaf, 0x3f, 0x3e, 0x74, 0xb5, 0xa8, 0x38, + 0x7c, 0xce, 0x5a, 0x24, 0x0d, 0xea, 0x8b, 0xbb, 0xfc, 0x1b, 0x79, 0x78, 0xae, 0xa5, 0x7d, 0xa4, + 0x6d, 0xfe, 0xa2, 0xbc, 0x9c, 0x42, 0x47, 0x7a, 0x7a, 0x99, 0xb4, 0xac, 0x49, 0xce, 0x19, 0x5d, + 0x0a, 0x38, 0xf1, 0xf1, 0x5f, 0x95, 0xab, 0xbb, 0xd0, 0xb1, 0x75, 0x5c, 0xa5, 0x0d, 0xff, 0x96, + 0xd7, 0xa7, 0x85, 0xd4, 0x26, 0x58, 0xa4, 0x9e, 0x67, 0x93, 0x44, 0xef, 0x3c, 0x3c, 0x00, 0xbf, + 0x6f, 0x23, 0x50, 0x51, 0x1f, 0x1d, 0x80, 0x3b, 0x3b, 0xa2, 0xe4, 0x6e, 0x7e, 0x64, 0x00, 0xde, + 0x25, 0x31, 0x14, 0x36, 0xf6, 0xa3, 0x0a, 0x7b, 0x37, 0x1a, 0x4b, 0xdd, 0x9f, 0x5d, 0x87, 0x30, + 0x37, 0x5c, 0x79, 0xb3, 0x2e, 0x66, 0xfc, 0x9c, 0x43, 0xb9, 0x1a, 0x00, 0x7f, 0x1f, 0xd0, 0x17, + 0xbb, 0x03, 0xeb, 0x1a, 0x89, 0x6d, 0xf6, 0x0f, 0x65, 0x90, 0xa9, 0x5c, 0x87, 0x41, 0x95, 0xf0, + 0x39, 0xc7, 0x0b, 0xb4, 0xa7, 0x7f, 0x2a, 0xc3, 0xf5, 0xc2, 0x53, 0x86, 0xc2, 0xdb, 0xbf, 0x94, + 0xd1, 0x19, 0x74, 0x6a, 0x9d, 0xf0, 0xbc, 0x80, 0xfb, 0xe7, 0x08, 0x6b, 0x05, 0xdc, 0x14, 0x7f, + 0x50, 0x6e, 0xff, 0xad, 0x14, 0x4e, 0xa3, 0xdb, 0xfe, 0x3f, 0x05, 0xe1, 0xff, 0x4d, 0x65, 0x7d, + 0x37, 0x3a, 0xbe, 0xbe, 0xf5, 0x79, 0xea, 0x50, 0xe5, 0xf7, 0x2d, 0x65, 0x79, 0x07, 0x3a, 0xdc, + 0x9f, 0xa5, 0xf0, 0xf7, 0xb6, 0xb2, 0xba, 0x07, 0x9d, 0xec, 0x69, 0x35, 0x69, 0xdb, 0x51, 0xc0, + 0x55, 0xa2, 0x2b, 0xfc, 0x4e, 0xbf, 0x4b, 0x93, 0x34, 0x16, 0x5e, 0xff, 0xd3, 0x6f, 0x96, 0xe2, + 0x98, 0x10, 0xf0, 0xc4, 0xa2, 0xfe, 0xb7, 0xdf, 0x2c, 0xb5, 0xa5, 0xf0, 0xf7, 0x7e, 0xa3, 0x4f, + 0x7f, 0x93, 0xb6, 0x5d, 0x09, 0x78, 0x22, 0xc5, 0x0f, 0x18, 0x7d, 0xfa, 0xd3, 0x96, 0xc2, 0xdf, + 0x07, 0xfb, 0xf5, 0x17, 0x7e, 0xf4, 0x49, 0x36, 0xed, 0x87, 0xfa, 0xf5, 0xa7, 0x2d, 0x85, 0xbf, + 0x0f, 0xf7, 0x6b, 0x35, 0x43, 0x1d, 0xd3, 0x56, 0xbe, 0x3e, 0x62, 0xc0, 0x03, 0x13, 0xb6, 0x12, + 0x7e, 0x1e, 0x52, 0x16, 0x77, 0xa2, 0xa3, 0x9d, 0x16, 0x67, 0x49, 0x7b, 0xae, 0x65, 0x36, 0x48, + 0x69, 0xcd, 0x73, 0x19, 0x4f, 0x6e, 0xfa, 0x47, 0x94, 0x5d, 0x66, 0xd0, 0x76, 0xb3, 0x13, 0xbe, + 0x1e, 0xed, 0x99, 0x93, 0xb2, 0xa9, 0xb6, 0x9d, 0x7a, 0x95, 0x13, 0x7d, 0x5a, 0xff, 0x58, 0xcf, + 0x9c, 0xb2, 0x56, 0xc2, 0xcf, 0xc7, 0x0d, 0x78, 0xa0, 0x77, 0x5a, 0xa4, 0x8a, 0xf7, 0x98, 0x32, + 0xbb, 0x0d, 0x1d, 0xec, 0xc3, 0x4c, 0x78, 0x7a, 0xdc, 0x80, 0x47, 0x79, 0x64, 0x92, 0x18, 0xe5, + 0x9f, 0x36, 0xe0, 0x51, 0x1e, 0x81, 0x8a, 0xfa, 0x8c, 0x01, 0x9f, 0x7a, 0xb4, 0xdc, 0x05, 0x93, + 0xd7, 0x9b, 0xe2, 0xbd, 0xfe, 0x59, 0x03, 0x9e, 0xe7, 0x11, 0xa9, 0xb1, 0xcf, 0x19, 0xf0, 0xc5, + 0x24, 0xfc, 0x50, 0x14, 0xb1, 0xd3, 0xd4, 0x6c, 0xa8, 0x0a, 0x7c, 0xde, 0x80, 0xef, 0x50, 0x19, + 0x5c, 0x64, 0xfe, 0x05, 0xa5, 0x9c, 0x39, 0x2d, 0xeb, 0x50, 0x6b, 0x6b, 0x67, 0x89, 0xfe, 0xa9, + 0xe3, 0x8b, 0x06, 0x7c, 0x60, 0x49, 0xd3, 0x42, 0xf7, 0x4b, 0x3d, 0x7b, 0x64, 0x9e, 0xae, 0x90, + 0x45, 0xb2, 0xcc, 0x88, 0xdf, 0xac, 0x72, 0x93, 0xe9, 0x6e, 0x7c, 0xd2, 0x80, 0x8f, 0x16, 0xb0, + 0x95, 0xf0, 0xf3, 0x65, 0xa3, 0xd7, 0xab, 0x24, 0x65, 0x11, 0xb7, 0xe2, 0x57, 0x94, 0x1b, 0xf0, + 0x4d, 0x97, 0x31, 0x12, 0x5e, 0xbe, 0xda, 0x6f, 0x36, 0xa9, 0x46, 0xfc, 0x5a, 0xbf, 0xd9, 0xe8, + 0x3e, 0xfc, 0xba, 0x01, 0x7f, 0x0a, 0x28, 0x65, 0x6e, 0xdc, 0xd7, 0x0c, 0xf8, 0x7e, 0x50, 0x4a, + 0xde, 0xb7, 0x5f, 0x31, 0xf4, 0x67, 0x96, 0x2d, 0x19, 0x48, 0x9e, 0x26, 0x5e, 0xed, 0xd2, 0x27, + 0x25, 0xd7, 0x17, 0x07, 0xe9, 0xe4, 0xbb, 0xf3, 0xd7, 0x06, 0x7c, 0xff, 0x49, 0xa0, 0x22, 0x81, + 0xd7, 0x0c, 0xf8, 0xfe, 0x53, 0x4a, 0x7c, 0x58, 0x78, 0xbd, 0xcb, 0xee, 0x98, 0xa2, 0x8e, 0xe9, + 0xd4, 0x93, 0x07, 0xa7, 0x1f, 0x0c, 0xc2, 0xbb, 0x43, 0x92, 0x0a, 0xfb, 0xe1, 0x20, 0x7c, 0x73, + 0x89, 0x05, 0xe3, 0xa2, 0xfc, 0x68, 0x10, 0xbe, 0xb9, 0x48, 0x36, 0x06, 0x7f, 0x3c, 0x08, 0xdf, + 0xae, 0x24, 0x28, 0x2b, 0xf8, 0x74, 0x6f, 0xb9, 0xf8, 0x76, 0xf5, 0x93, 0x41, 0xf8, 0xaa, 0xa1, + 0x40, 0x79, 0x18, 0x2f, 0xfb, 0x0d, 0xfc, 0xcc, 0x20, 0x7c, 0xd5, 0x90, 0x68, 0x85, 0x59, 0x11, + 0xf7, 0x6c, 0x6f, 0xdf, 0xd1, 0x8f, 0xb4, 0x02, 0xfc, 0x69, 0x6f, 0x41, 0xbd, 0x30, 0x3f, 0x93, + 0x31, 0x4e, 0x9c, 0x46, 0xd7, 0xaf, 0x52, 0x46, 0x2e, 0x52, 0x67, 0x78, 0xef, 0x78, 0xf4, 0x4b, + 0xff, 0xb8, 0xfa, 0xa5, 0x7f, 0xbc, 0xe4, 0x04, 0xad, 0xf0, 0xe7, 0x12, 0xf9, 0x95, 0x60, 0xe4, + 0xb9, 0x87, 0x06, 0x46, 0x73, 0x63, 0x43, 0x8b, 0xd7, 0x09, 0x9b, 0x39, 0x67, 0xe2, 0x5e, 0x34, + 0x14, 0x5a, 0xbb, 0x01, 0xef, 0xc7, 0xfc, 0x79, 0x69, 0x1e, 0xba, 0xac, 0x04, 0x7c, 0x62, 0x16, + 0x6d, 0x0a, 0xed, 0x2d, 0x31, 0xad, 0xfa, 0x8c, 0xe1, 0x05, 0x29, 0xb2, 0x41, 0x58, 0x86, 0x63, + 0x6e, 0xce, 0x99, 0x98, 0x43, 0x9b, 0x13, 0x42, 0x7d, 0x86, 0xf3, 0xa2, 0x54, 0xda, 0xa8, 0x95, + 0x44, 0x4c, 0x67, 0xd0, 0x0d, 0xa1, 0x14, 0xa7, 0x4e, 0xbb, 0x1f, 0x95, 0x97, 0xa4, 0x4a, 0x58, + 0x89, 0x1a, 0x75, 0xda, 0x13, 0xf3, 0xe8, 0xc6, 0x50, 0x61, 0xc9, 0x75, 0xb9, 0xed, 0x9a, 0x16, + 0x61, 0xfd, 0xe8, 0xbc, 0x2c, 0x75, 0xc2, 0x44, 0xa6, 0xb4, 0xe9, 0x44, 0x11, 0x85, 0x99, 0x5e, + 0x74, 0xdc, 0x8b, 0xcb, 0x7e, 0xab, 0x1f, 0xa5, 0x6b, 0x52, 0x29, 0xcc, 0x63, 0xc1, 0x9d, 0xf1, + 0x5b, 0x53, 0x77, 0xa0, 0xfd, 0x75, 0xb7, 0x35, 0xee, 0x9b, 0xdc, 0xf5, 0x9b, 0xd4, 0x36, 0x97, + 0x7c, 0xf5, 0xff, 0x79, 0xd8, 0x74, 0x49, 0x4b, 0x4d, 0x6d, 0xaa, 0x85, 0x7f, 0x94, 0x9d, 0xf3, + 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x69, 0x67, 0x5d, 0x1f, 0x22, 0x00, 0x00, +} diff --git a/accounts/usbwallet/trezor/messages.proto b/accounts/usbwallet/trezor/messages.proto new file mode 100644 index 000000000000..3e0482e3446f --- /dev/null +++ b/accounts/usbwallet/trezor/messages.proto @@ -0,0 +1,264 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/messages.proto +// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. + +syntax = "proto2"; +package hw.trezor.messages; + +/** + * Messages for TREZOR communication + */ + +// Sugar for easier handling in Java +option java_package = "com.satoshilabs.trezor.lib.protobuf"; +option java_outer_classname = "TrezorMessage"; + +import "google/protobuf/descriptor.proto"; + +/** + * Options for specifying message direction and type of wire (normal/debug) + */ +extend google.protobuf.EnumValueOptions { + optional bool wire_in = 50002; // message can be transmitted via wire from PC to TREZOR + optional bool wire_out = 50003; // message can be transmitted via wire from TREZOR to PC + optional bool wire_debug_in = 50004; // message can be transmitted via debug wire from PC to TREZOR + optional bool wire_debug_out = 50005; // message can be transmitted via debug wire from TREZOR to PC + optional bool wire_tiny = 50006; // message is handled by TREZOR when the USB stack is in tiny mode + optional bool wire_bootloader = 50007; // message is only handled by TREZOR Bootloader + optional bool wire_no_fsm = 50008; // message is not handled by TREZOR unless the USB stack is in tiny mode +} + +/** + * Mapping between TREZOR wire identifier (uint) and a protobuf message + */ +enum MessageType { + + // Management + MessageType_Initialize = 0 [(wire_in) = true, (wire_tiny) = true]; + MessageType_Ping = 1 [(wire_in) = true]; + MessageType_Success = 2 [(wire_out) = true]; + MessageType_Failure = 3 [(wire_out) = true]; + MessageType_ChangePin = 4 [(wire_in) = true]; + MessageType_WipeDevice = 5 [(wire_in) = true]; + MessageType_GetEntropy = 9 [(wire_in) = true]; + MessageType_Entropy = 10 [(wire_out) = true]; + MessageType_LoadDevice = 13 [(wire_in) = true]; + MessageType_ResetDevice = 14 [(wire_in) = true]; + MessageType_Features = 17 [(wire_out) = true]; + MessageType_PinMatrixRequest = 18 [(wire_out) = true]; + MessageType_PinMatrixAck = 19 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true]; + MessageType_Cancel = 20 [(wire_in) = true, (wire_tiny) = true]; + MessageType_ClearSession = 24 [(wire_in) = true]; + MessageType_ApplySettings = 25 [(wire_in) = true]; + MessageType_ButtonRequest = 26 [(wire_out) = true]; + MessageType_ButtonAck = 27 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true]; + MessageType_ApplyFlags = 28 [(wire_in) = true]; + MessageType_BackupDevice = 34 [(wire_in) = true]; + MessageType_EntropyRequest = 35 [(wire_out) = true]; + MessageType_EntropyAck = 36 [(wire_in) = true]; + MessageType_PassphraseRequest = 41 [(wire_out) = true]; + MessageType_PassphraseAck = 42 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true]; + MessageType_PassphraseStateRequest = 77 [(wire_out) = true]; + MessageType_PassphraseStateAck = 78 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true]; + MessageType_RecoveryDevice = 45 [(wire_in) = true]; + MessageType_WordRequest = 46 [(wire_out) = true]; + MessageType_WordAck = 47 [(wire_in) = true]; + MessageType_GetFeatures = 55 [(wire_in) = true]; + MessageType_SetU2FCounter = 63 [(wire_in) = true]; + + // Bootloader + MessageType_FirmwareErase = 6 [(wire_in) = true, (wire_bootloader) = true]; + MessageType_FirmwareUpload = 7 [(wire_in) = true, (wire_bootloader) = true]; + MessageType_FirmwareRequest = 8 [(wire_out) = true, (wire_bootloader) = true]; + MessageType_SelfTest = 32 [(wire_in) = true, (wire_bootloader) = true]; + + // Bitcoin + MessageType_GetPublicKey = 11 [(wire_in) = true]; + MessageType_PublicKey = 12 [(wire_out) = true]; + MessageType_SignTx = 15 [(wire_in) = true]; + MessageType_TxRequest = 21 [(wire_out) = true]; + MessageType_TxAck = 22 [(wire_in) = true]; + MessageType_GetAddress = 29 [(wire_in) = true]; + MessageType_Address = 30 [(wire_out) = true]; + MessageType_SignMessage = 38 [(wire_in) = true]; + MessageType_VerifyMessage = 39 [(wire_in) = true]; + MessageType_MessageSignature = 40 [(wire_out) = true]; + + // Crypto + MessageType_CipherKeyValue = 23 [(wire_in) = true]; + MessageType_CipheredKeyValue = 48 [(wire_out) = true]; + MessageType_SignIdentity = 53 [(wire_in) = true]; + MessageType_SignedIdentity = 54 [(wire_out) = true]; + MessageType_GetECDHSessionKey = 61 [(wire_in) = true]; + MessageType_ECDHSessionKey = 62 [(wire_out) = true]; + MessageType_CosiCommit = 71 [(wire_in) = true]; + MessageType_CosiCommitment = 72 [(wire_out) = true]; + MessageType_CosiSign = 73 [(wire_in) = true]; + MessageType_CosiSignature = 74 [(wire_out) = true]; + + // Debug + MessageType_DebugLinkDecision = 100 [(wire_debug_in) = true, (wire_tiny) = true, (wire_no_fsm) = true]; + MessageType_DebugLinkGetState = 101 [(wire_debug_in) = true, (wire_tiny) = true]; + MessageType_DebugLinkState = 102 [(wire_debug_out) = true]; + MessageType_DebugLinkStop = 103 [(wire_debug_in) = true]; + MessageType_DebugLinkLog = 104 [(wire_debug_out) = true]; + MessageType_DebugLinkMemoryRead = 110 [(wire_debug_in) = true]; + MessageType_DebugLinkMemory = 111 [(wire_debug_out) = true]; + MessageType_DebugLinkMemoryWrite = 112 [(wire_debug_in) = true]; + MessageType_DebugLinkFlashErase = 113 [(wire_debug_in) = true]; + + // Ethereum + MessageType_EthereumGetPublicKey = 450 [(wire_in) = true]; + MessageType_EthereumPublicKey = 451 [(wire_out) = true]; + MessageType_EthereumGetAddress = 56 [(wire_in) = true]; + MessageType_EthereumAddress = 57 [(wire_out) = true]; + MessageType_EthereumSignTx = 58 [(wire_in) = true]; + MessageType_EthereumTxRequest = 59 [(wire_out) = true]; + MessageType_EthereumTxAck = 60 [(wire_in) = true]; + MessageType_EthereumSignMessage = 64 [(wire_in) = true]; + MessageType_EthereumVerifyMessage = 65 [(wire_in) = true]; + MessageType_EthereumMessageSignature = 66 [(wire_out) = true]; + + // NEM + MessageType_NEMGetAddress = 67 [(wire_in) = true]; + MessageType_NEMAddress = 68 [(wire_out) = true]; + MessageType_NEMSignTx = 69 [(wire_in) = true]; + MessageType_NEMSignedTx = 70 [(wire_out) = true]; + MessageType_NEMDecryptMessage = 75 [(wire_in) = true]; + MessageType_NEMDecryptedMessage = 76 [(wire_out) = true]; + + // Lisk + MessageType_LiskGetAddress = 114 [(wire_in) = true]; + MessageType_LiskAddress = 115 [(wire_out) = true]; + MessageType_LiskSignTx = 116 [(wire_in) = true]; + MessageType_LiskSignedTx = 117 [(wire_out) = true]; + MessageType_LiskSignMessage = 118 [(wire_in) = true]; + MessageType_LiskMessageSignature = 119 [(wire_out) = true]; + MessageType_LiskVerifyMessage = 120 [(wire_in) = true]; + MessageType_LiskGetPublicKey = 121 [(wire_in) = true]; + MessageType_LiskPublicKey = 122 [(wire_out) = true]; + + // Tezos + MessageType_TezosGetAddress = 150 [(wire_in) = true]; + MessageType_TezosAddress = 151 [(wire_out) = true]; + MessageType_TezosSignTx = 152 [(wire_in) = true]; + MessageType_TezosSignedTx = 153 [(wire_out) = true]; + MessageType_TezosGetPublicKey = 154 [(wire_in) = true]; + MessageType_TezosPublicKey = 155 [(wire_out) = true]; + + // Stellar + MessageType_StellarSignTx = 202 [(wire_in) = true]; + MessageType_StellarTxOpRequest = 203 [(wire_out) = true]; + MessageType_StellarGetAddress = 207 [(wire_in) = true]; + MessageType_StellarAddress = 208 [(wire_out) = true]; + MessageType_StellarCreateAccountOp = 210 [(wire_in) = true]; + MessageType_StellarPaymentOp = 211 [(wire_in) = true]; + MessageType_StellarPathPaymentOp = 212 [(wire_in) = true]; + MessageType_StellarManageOfferOp = 213 [(wire_in) = true]; + MessageType_StellarCreatePassiveOfferOp = 214 [(wire_in) = true]; + MessageType_StellarSetOptionsOp = 215 [(wire_in) = true]; + MessageType_StellarChangeTrustOp = 216 [(wire_in) = true]; + MessageType_StellarAllowTrustOp = 217 [(wire_in) = true]; + MessageType_StellarAccountMergeOp = 218 [(wire_in) = true]; + // omitted: StellarInflationOp is not a supported operation, would be 219 + MessageType_StellarManageDataOp = 220 [(wire_in) = true]; + MessageType_StellarBumpSequenceOp = 221 [(wire_in) = true]; + MessageType_StellarSignedTx = 230 [(wire_out) = true]; + + // TRON + MessageType_TronGetAddress = 250 [(wire_in) = true]; + MessageType_TronAddress = 251 [(wire_out) = true]; + MessageType_TronSignTx = 252 [(wire_in) = true]; + MessageType_TronSignedTx = 253 [(wire_out) = true]; + + // Cardano + // dropped Sign/VerifyMessage ids 300-302 + MessageType_CardanoSignTx = 303 [(wire_in) = true]; + MessageType_CardanoTxRequest = 304 [(wire_out) = true]; + MessageType_CardanoGetPublicKey = 305 [(wire_in) = true]; + MessageType_CardanoPublicKey = 306 [(wire_out) = true]; + MessageType_CardanoGetAddress = 307 [(wire_in) = true]; + MessageType_CardanoAddress = 308 [(wire_out) = true]; + MessageType_CardanoTxAck = 309 [(wire_in) = true]; + MessageType_CardanoSignedTx = 310 [(wire_out) = true]; + + // Ontology + MessageType_OntologyGetAddress = 350 [(wire_in) = true]; + MessageType_OntologyAddress = 351 [(wire_out) = true]; + MessageType_OntologyGetPublicKey = 352 [(wire_in) = true]; + MessageType_OntologyPublicKey = 353 [(wire_out) = true]; + MessageType_OntologySignTransfer = 354 [(wire_in) = true]; + MessageType_OntologySignedTransfer = 355 [(wire_out) = true]; + MessageType_OntologySignWithdrawOng = 356 [(wire_in) = true]; + MessageType_OntologySignedWithdrawOng = 357 [(wire_out) = true]; + MessageType_OntologySignOntIdRegister = 358 [(wire_in) = true]; + MessageType_OntologySignedOntIdRegister = 359 [(wire_out) = true]; + MessageType_OntologySignOntIdAddAttributes = 360 [(wire_in) = true]; + MessageType_OntologySignedOntIdAddAttributes = 361 [(wire_out) = true]; + + // Ripple + MessageType_RippleGetAddress = 400 [(wire_in) = true]; + MessageType_RippleAddress = 401 [(wire_out) = true]; + MessageType_RippleSignTx = 402 [(wire_in) = true]; + MessageType_RippleSignedTx = 403 [(wire_in) = true]; + + // Monero + MessageType_MoneroTransactionInitRequest = 501 [(wire_out) = true]; + MessageType_MoneroTransactionInitAck = 502 [(wire_out) = true]; + MessageType_MoneroTransactionSetInputRequest = 503 [(wire_out) = true]; + MessageType_MoneroTransactionSetInputAck = 504 [(wire_out) = true]; + MessageType_MoneroTransactionInputsPermutationRequest = 505 [(wire_out) = true]; + MessageType_MoneroTransactionInputsPermutationAck = 506 [(wire_out) = true]; + MessageType_MoneroTransactionInputViniRequest = 507 [(wire_out) = true]; + MessageType_MoneroTransactionInputViniAck = 508 [(wire_out) = true]; + MessageType_MoneroTransactionAllInputsSetRequest = 509 [(wire_out) = true]; + MessageType_MoneroTransactionAllInputsSetAck = 510 [(wire_out) = true]; + MessageType_MoneroTransactionSetOutputRequest = 511 [(wire_out) = true]; + MessageType_MoneroTransactionSetOutputAck = 512 [(wire_out) = true]; + MessageType_MoneroTransactionAllOutSetRequest = 513 [(wire_out) = true]; + MessageType_MoneroTransactionAllOutSetAck = 514 [(wire_out) = true]; + MessageType_MoneroTransactionSignInputRequest = 515 [(wire_out) = true]; + MessageType_MoneroTransactionSignInputAck = 516 [(wire_out) = true]; + MessageType_MoneroTransactionFinalRequest = 517 [(wire_out) = true]; + MessageType_MoneroTransactionFinalAck = 518 [(wire_out) = true]; + MessageType_MoneroKeyImageExportInitRequest = 530 [(wire_out) = true]; + MessageType_MoneroKeyImageExportInitAck = 531 [(wire_out) = true]; + MessageType_MoneroKeyImageSyncStepRequest = 532 [(wire_out) = true]; + MessageType_MoneroKeyImageSyncStepAck = 533 [(wire_out) = true]; + MessageType_MoneroKeyImageSyncFinalRequest = 534 [(wire_out) = true]; + MessageType_MoneroKeyImageSyncFinalAck = 535 [(wire_out) = true]; + MessageType_MoneroGetAddress = 540 [(wire_in) = true]; + MessageType_MoneroAddress = 541 [(wire_out) = true]; + MessageType_MoneroGetWatchKey = 542 [(wire_in) = true]; + MessageType_MoneroWatchKey = 543 [(wire_out) = true]; + MessageType_DebugMoneroDiagRequest = 546 [(wire_in) = true]; + MessageType_DebugMoneroDiagAck = 547 [(wire_out) = true]; + MessageType_MoneroGetTxKeyRequest = 550 [(wire_in) = true]; + MessageType_MoneroGetTxKeyAck = 551 [(wire_out) = true]; + MessageType_MoneroLiveRefreshStartRequest = 552 [(wire_in) = true]; + MessageType_MoneroLiveRefreshStartAck = 553 [(wire_out) = true]; + MessageType_MoneroLiveRefreshStepRequest = 554 [(wire_in) = true]; + MessageType_MoneroLiveRefreshStepAck = 555 [(wire_out) = true]; + MessageType_MoneroLiveRefreshFinalRequest = 556 [(wire_in) = true]; + MessageType_MoneroLiveRefreshFinalAck = 557 [(wire_out) = true]; + + // EOS + MessageType_EosGetPublicKey = 600 [(wire_in) = true]; + MessageType_EosPublicKey = 601 [(wire_out) = true]; + MessageType_EosSignTx = 602 [(wire_in) = true]; + MessageType_EosTxActionRequest = 603 [(wire_out) = true]; + MessageType_EosTxActionAck = 604 [(wire_in) = true]; + MessageType_EosSignedTx = 605 [(wire_out) = true]; + + // Binance + MessageType_BinanceGetAddress = 700 [(wire_in) = true]; + MessageType_BinanceAddress = 701 [(wire_out) = true]; + MessageType_BinanceGetPublicKey = 702 [(wire_in) = true]; + MessageType_BinancePublicKey = 703 [(wire_out) = true]; + MessageType_BinanceSignTx = 704 [(wire_in) = true]; + MessageType_BinanceTxRequest = 705 [(wire_out) = true]; + MessageType_BinanceTransferMsg = 706 [(wire_in) = true]; + MessageType_BinanceOrderMsg = 707 [(wire_in) = true]; + MessageType_BinanceCancelMsg = 708 [(wire_in) = true]; + MessageType_BinanceSignedTx = 709 [(wire_out) = true]; +} diff --git a/accounts/usbwallet/trezor/trezor.go b/accounts/usbwallet/trezor/trezor.go new file mode 100644 index 000000000000..7e756e609b0c --- /dev/null +++ b/accounts/usbwallet/trezor/trezor.go @@ -0,0 +1,70 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// This file contains the implementation for interacting with the Trezor hardware +// wallets. The wire protocol spec can be found on the SatoshiLabs website: +// https://wiki.trezor.io/Developers_guide-Message_Workflows + +// !!! STAHP !!! +// +// Before you touch the protocol files, you need to be aware of a breaking change +// that occurred between firmware versions 1.7.3->1.8.0 (Model One) and 2.0.10-> +// 2.1.0 (Model T). The Ethereum address representation was changed from the 20 +// byte binary blob to a 42 byte hex string. The upstream protocol buffer files +// only support the new format, so blindly pulling in a new spec will break old +// devices! +// +// The Trezor devs had the foresight to add the string version as a new message +// code instead of replacing the binary one. This means that the proto file can +// actually define both the old and the new versions as optional. Please ensure +// that you add back the old addresses everywhere (to avoid name clash. use the +// addressBin and addressHex names). +// +// If in doubt, reach out to @karalabe. + +// To regenerate the protocol files in this package: +// - Download the latest protoc https://github.com/protocolbuffers/protobuf/releases +// - Build with the usual `./configure && make` and ensure it's on your $PATH +// - Delete all the .proto and .pb.go files, pull in fresh ones from Trezor +// - Grab the latest Go plugin `go get -u github.com/golang/protobuf/protoc-gen-go` +// - Vendor in the latest Go plugin `govendor fetch github.com/golang/protobuf/...` + +//go:generate protoc -I/usr/local/include:. --go_out=import_path=trezor:. messages.proto messages-common.proto messages-management.proto messages-ethereum.proto + +// Package trezor contains the wire protocol. +package trezor + +import ( + "reflect" + + "github.com/golang/protobuf/proto" +) + +// Type returns the protocol buffer type number of a specific message. If the +// message is nil, this method panics! +func Type(msg proto.Message) uint16 { + return uint16(MessageType_value["MessageType_"+reflect.TypeOf(msg).Elem().Name()]) +} + +// Name returns the friendly message type name of a specific protocol buffer +// type number. +func Name(kind uint16) string { + name := MessageType_name[int32(kind)] + if len(name) < 12 { + return name + } + return name[12:] +} diff --git a/accounts/usbwallet/wallet.go b/accounts/usbwallet/wallet.go index 6cef6e0fb02a..ee539d96535d 100644 --- a/accounts/usbwallet/wallet.go +++ b/accounts/usbwallet/wallet.go @@ -29,8 +29,9 @@ import ( "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" - "github.com/karalabe/hid" + "github.com/karalabe/usb" ) // Maximum time between wallet health checks to detect USB unplugs. @@ -76,17 +77,17 @@ type wallet struct { driver driver // Hardware implementation of the low level device operations url *accounts.URL // Textual URL uniquely identifying this wallet - info hid.DeviceInfo // Known USB device infos about the wallet - device *hid.Device // USB device advertising itself as a hardware wallet + info usb.DeviceInfo // Known USB device infos about the wallet + device usb.Device // USB device advertising itself as a hardware wallet accounts []accounts.Account // List of derive accounts pinned on the hardware wallet paths map[common.Address]accounts.DerivationPath // Known derivation paths for signing operations - deriveNextPath accounts.DerivationPath // Next derivation path for account auto-discovery - deriveNextAddr common.Address // Next derived account address for auto-discovery - deriveChain ethereum.ChainStateReader // Blockchain state reader to discover used account with - deriveReq chan chan struct{} // Channel to request a self-derivation on - deriveQuit chan chan error // Channel to terminate the self-deriver with + deriveNextPaths []accounts.DerivationPath // Next derivation paths for account auto-discovery (multiple bases supported) + deriveNextAddrs []common.Address // Next derived account addresses for auto-discovery (multiple bases supported) + deriveChain ethereum.ChainStateReader // Blockchain state reader to discover used account with + deriveReq chan chan struct{} // Channel to request a self-derivation on + deriveQuit chan chan error // Channel to terminate the self-deriver with healthQuit chan chan error @@ -273,9 +274,7 @@ func (w *wallet) close() error { w.device = nil w.accounts, w.paths = nil, nil - w.driver.Close() - - return nil + return w.driver.Close() } // Accounts implements accounts.Wallet, returning the list of accounts pinned to @@ -340,57 +339,62 @@ func (w *wallet) selfDerive() { accs []accounts.Account paths []accounts.DerivationPath - nextAddr = w.deriveNextAddr - nextPath = w.deriveNextPath + nextPaths = append([]accounts.DerivationPath{}, w.deriveNextPaths...) + nextAddrs = append([]common.Address{}, w.deriveNextAddrs...) context = context.Background() ) - for empty := false; !empty; { - // Retrieve the next derived Ethereum account - if nextAddr == (common.Address{}) { - if nextAddr, err = w.driver.Derive(nextPath); err != nil { - w.log.Warn("USB wallet account derivation failed", "err", err) + for i := 0; i < len(nextAddrs); i++ { + for empty := false; !empty; { + // Retrieve the next derived Ethereum account + if nextAddrs[i] == (common.Address{}) { + if nextAddrs[i], err = w.driver.Derive(nextPaths[i]); err != nil { + w.log.Warn("USB wallet account derivation failed", "err", err) + break + } + } + // Check the account's status against the current chain state + var ( + balance *big.Int + nonce uint64 + ) + balance, err = w.deriveChain.BalanceAt(context, nextAddrs[i], nil) + if err != nil { + w.log.Warn("USB wallet balance retrieval failed", "err", err) break } - } - // Check the account's status against the current chain state - var ( - balance *big.Int - nonce uint64 - ) - balance, err = w.deriveChain.BalanceAt(context, nextAddr, nil) - if err != nil { - w.log.Warn("USB wallet balance retrieval failed", "err", err) - break - } - nonce, err = w.deriveChain.NonceAt(context, nextAddr, nil) - if err != nil { - w.log.Warn("USB wallet nonce retrieval failed", "err", err) - break - } - // If the next account is empty, stop self-derivation, but add it nonetheless - if balance.Sign() == 0 && nonce == 0 { - empty = true - } - // We've just self-derived a new account, start tracking it locally - path := make(accounts.DerivationPath, len(nextPath)) - copy(path[:], nextPath[:]) - paths = append(paths, path) - - account := accounts.Account{ - Address: nextAddr, - URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, - } - accs = append(accs, account) + nonce, err = w.deriveChain.NonceAt(context, nextAddrs[i], nil) + if err != nil { + w.log.Warn("USB wallet nonce retrieval failed", "err", err) + break + } + // If the next account is empty, stop self-derivation, but add for the last base path + if balance.Sign() == 0 && nonce == 0 { + empty = true + if i < len(nextAddrs)-1 { + break + } + } + // We've just self-derived a new account, start tracking it locally + path := make(accounts.DerivationPath, len(nextPaths[i])) + copy(path[:], nextPaths[i][:]) + paths = append(paths, path) + + account := accounts.Account{ + Address: nextAddrs[i], + URL: accounts.URL{Scheme: w.url.Scheme, Path: fmt.Sprintf("%s/%s", w.url.Path, path)}, + } + accs = append(accs, account) - // Display a log message to the user for new (or previously empty accounts) - if _, known := w.paths[nextAddr]; !known || (!empty && nextAddr == w.deriveNextAddr) { - w.log.Info("USB wallet discovered new account", "address", nextAddr, "path", path, "balance", balance, "nonce", nonce) - } - // Fetch the next potential account - if !empty { - nextAddr = common.Address{} - nextPath[len(nextPath)-1]++ + // Display a log message to the user for new (or previously empty accounts) + if _, known := w.paths[nextAddrs[i]]; !known || (!empty && nextAddrs[i] == w.deriveNextAddrs[i]) { + w.log.Info("USB wallet discovered new account", "address", nextAddrs[i], "path", path, "balance", balance, "nonce", nonce) + } + // Fetch the next potential account + if !empty { + nextAddrs[i] = common.Address{} + nextPaths[i][len(nextPaths[i])-1]++ + } } } // Self derivation complete, release device lock @@ -407,8 +411,8 @@ func (w *wallet) selfDerive() { } // Shift the self-derivation forward // TODO(karalabe): don't overwrite changes from wallet.SelfDerive - w.deriveNextAddr = nextAddr - w.deriveNextPath = nextPath + w.deriveNextAddrs = nextAddrs + w.deriveNextPaths = nextPaths w.stateLock.Unlock() // Notify the user of termination and loop after a bit of time (to avoid trashing) @@ -475,32 +479,61 @@ func (w *wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Accoun if _, ok := w.paths[address]; !ok { w.accounts = append(w.accounts, account) - w.paths[address] = path + w.paths[address] = make(accounts.DerivationPath, len(path)) + copy(w.paths[address], path) } return account, nil } -// SelfDerive implements accounts.Wallet, trying to discover accounts that the -// user used previously (based on the chain state), but ones that he/she did not -// explicitly pin to the wallet manually. To avoid chain head monitoring, self -// derivation only runs during account listing (and even then throttled). -func (w *wallet) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainStateReader) { +// SelfDerive sets a base account derivation path from which the wallet attempts +// to discover non zero accounts and automatically add them to list of tracked +// accounts. +// +// Note, self derivaton will increment the last component of the specified path +// opposed to decending into a child path to allow discovering accounts starting +// from non zero components. +// +// Some hardware wallets switched derivation paths through their evolution, so +// this method supports providing multiple bases to discover old user accounts +// too. Only the last base will be used to derive the next empty account. +// +// You can disable automatic account discovery by calling SelfDerive with a nil +// chain state reader. +func (w *wallet) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) { w.stateLock.Lock() defer w.stateLock.Unlock() - w.deriveNextPath = make(accounts.DerivationPath, len(base)) - copy(w.deriveNextPath[:], base[:]) - - w.deriveNextAddr = common.Address{} + w.deriveNextPaths = make([]accounts.DerivationPath, len(bases)) + for i, base := range bases { + w.deriveNextPaths[i] = make(accounts.DerivationPath, len(base)) + copy(w.deriveNextPaths[i][:], base[:]) + } + w.deriveNextAddrs = make([]common.Address, len(bases)) w.deriveChain = chain } -// SignHash implements accounts.Wallet, however signing arbitrary data is not +// signHash implements accounts.Wallet, however signing arbitrary data is not // supported for hardware wallets, so this method will always return an error. -func (w *wallet) SignHash(account accounts.Account, hash []byte) ([]byte, error) { +func (w *wallet) signHash(account accounts.Account, hash []byte) ([]byte, error) { return nil, accounts.ErrNotSupported } +// SignData signs keccak256(data). The mimetype parameter describes the type of data being signed +func (w *wallet) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) { + return w.signHash(account, crypto.Keccak256(data)) +} + +// SignDataWithPassphrase implements accounts.Wallet, attempting to sign the given +// data with the given account using passphrase as extra authentication. +// Since USB wallets don't rely on passphrases, these are silently ignored. +func (w *wallet) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) { + return w.SignData(account, mimeType, data) +} + +func (w *wallet) SignText(account accounts.Account, text []byte) ([]byte, error) { + return w.signHash(account, accounts.TextHash(text)) +} + // SignTx implements accounts.Wallet. It sends the transaction over to the Ledger // wallet to request a confirmation from the user. It returns either the signed // transaction or a failure if the user denied the transaction. @@ -550,8 +583,8 @@ func (w *wallet) SignTx(account accounts.Account, tx *types.Transaction, chainID // SignHashWithPassphrase implements accounts.Wallet, however signing arbitrary // data is not supported for Ledger wallets, so this method will always return // an error. -func (w *wallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { - return w.SignHash(account, hash) +func (w *wallet) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error) { + return w.SignText(account, accounts.TextHash(text)) } // SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given diff --git a/appveyor.yml b/appveyor.yml index b056cb3fd7b9..8f840c190e70 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,8 +23,8 @@ environment: install: - git submodule update --init - rmdir C:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go1.11.windows-%GETH_ARCH%.zip - - 7z x go1.11.windows-%GETH_ARCH%.zip -y -oC:\ > NUL + - appveyor DownloadFile https://dl.google.com/go/go1.12.7.windows-%GETH_ARCH%.zip + - 7z x go1.12.7.windows-%GETH_ARCH%.zip -y -oC:\ > NUL - go version - gcc --version diff --git a/build/ci-notes.md b/build/ci-notes.md index f5b0e869d63e..13e1fd2307c4 100644 --- a/build/ci-notes.md +++ b/build/ci-notes.md @@ -7,27 +7,34 @@ Canonical. Packages of develop branch commits have suffix -unstable and cannot be installed alongside the stable version. Switching between release streams requires user intervention. +## Launchpad + The packages are built and served by launchpad.net. We generate a Debian source package for each distribution and upload it. Their builder picks up the source package, builds it and installs the new version into the PPA repository. Launchpad requires a valid signature -by a team member for source package uploads. The signing key is stored in an environment -variable which Travis CI makes available to certain builds. +by a team member for source package uploads. + +The signing key is stored in an environment variable which Travis CI makes available to +certain builds. Since Travis CI doesn't support FTP, SFTP is used to transfer the +packages. To set this up yourself, you need to create a Launchpad user and add a GPG key +and SSH key to it. Then encode both keys as base64 and configure 'secret' environment +variables `PPA_SIGNING_KEY` and `PPA_SSH_KEY` on Travis. We want to build go-ethereum with the most recent version of Go, irrespective of the Go version that is available in the main Ubuntu repository. In order to make this possible, our PPA depends on the ~gophers/ubuntu/archive PPA. Our source package build-depends on -golang-1.10, which is co-installable alongside the regular golang package. PPA dependencies +golang-1.11, which is co-installable alongside the regular golang package. PPA dependencies can be edited at https://launchpad.net/%7Eethereum/+archive/ubuntu/ethereum/+edit-dependencies ## Building Packages Locally (for testing) You need to run Ubuntu to do test packaging. -Add the gophers PPA and install Go 1.10 and Debian packaging tools: +Add the gophers PPA and install Go 1.11 and Debian packaging tools: $ sudo apt-add-repository ppa:gophers/ubuntu/archive $ sudo apt-get update - $ sudo apt-get install build-essential golang-1.10 devscripts debhelper + $ sudo apt-get install build-essential golang-1.11 devscripts debhelper python-bzrlib python-paramiko Create the source packages: diff --git a/build/ci.go b/build/ci.go index c5a107e1d514..8be52338989b 100644 --- a/build/ci.go +++ b/build/ci.go @@ -60,7 +60,6 @@ import ( "github.com/ethereum/go-ethereum/internal/build" "github.com/ethereum/go-ethereum/params" - sv "github.com/ethereum/go-ethereum/swarm/version" ) var ( @@ -80,12 +79,7 @@ var ( executablePath("puppeth"), executablePath("rlpdump"), executablePath("wnode"), - } - - // Files that end up in the swarm*.zip archive. - swarmArchiveFiles = []string{ - "COPYING", - executablePath("swarm"), + executablePath("clef"), } // A debian package is created for all executables listed here. @@ -118,45 +112,32 @@ var ( BinaryName: "wnode", Description: "Ethereum Whisper diagnostic tool", }, - } - - // A debian package is created for all executables listed here. - debSwarmExecutables = []debExecutable{ { - BinaryName: "swarm", - PackageName: "ethereum-swarm", - Description: "Ethereum Swarm daemon and tools", + BinaryName: "clef", + Description: "Ethereum account management tool.", }, } + // A debian package is created for all executables listed here. + debEthereum = debPackage{ Name: "ethereum", Version: params.Version, Executables: debExecutables, } - debSwarm = debPackage{ - Name: "ethereum-swarm", - Version: sv.Version, - Executables: debSwarmExecutables, - } - // Debian meta packages to build and push to Ubuntu PPA debPackages = []debPackage{ - debSwarm, debEthereum, } - // Packages to be cross-compiled by the xgo command - allCrossCompiledArchiveFiles = append(allToolsArchiveFiles, swarmArchiveFiles...) - // Distros for which packages are created. // Note: vivid is unsupported because there is no golang-1.6 package for it. - // Note: wily is unsupported because it was officially deprecated on lanchpad. - // Note: yakkety is unsupported because it was officially deprecated on lanchpad. - // Note: zesty is unsupported because it was officially deprecated on lanchpad. - // Note: artful is unsupported because it was officially deprecated on lanchpad. - debDistros = []string{"trusty", "xenial", "bionic", "cosmic"} + // Note: wily is unsupported because it was officially deprecated on Launchpad. + // Note: yakkety is unsupported because it was officially deprecated on Launchpad. + // Note: zesty is unsupported because it was officially deprecated on Launchpad. + // Note: artful is unsupported because it was officially deprecated on Launchpad. + debDistros = []string{"trusty", "xenial", "bionic", "cosmic", "disco"} ) var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin")) @@ -279,6 +260,7 @@ func buildFlags(env build.Environment) (flags []string) { var ld []string if env.Commit != "" { ld = append(ld, "-X", "main.gitCommit="+env.Commit) + ld = append(ld, "-X", "main.gitDate="+env.Date) } if runtime.GOOS == "darwin" { ld = append(ld, "-s") @@ -320,9 +302,7 @@ func goToolArch(arch string, cc string, subcmd string, args ...string) *exec.Cmd // "tests" also includes static analysis tools such as vet. func doTest(cmdline []string) { - var ( - coverage = flag.Bool("coverage", false, "Whether to record code coverage") - ) + coverage := flag.Bool("coverage", false, "Whether to record code coverage") flag.CommandLine.Parse(cmdline) env := build.Env() @@ -332,14 +312,11 @@ func doTest(cmdline []string) { } packages = build.ExpandPackagesNoVendor(packages) - // Run analysis tools before the tests. - build.MustRun(goTool("vet", packages...)) - // Run the actual tests. - gotest := goTool("test", buildFlags(env)...) // Test a single package at a time. CI builders are slow // and some tests run into timeouts under load. - gotest.Args = append(gotest.Args, "-p", "1") + gotest := goTool("test", buildFlags(env)...) + gotest.Args = append(gotest.Args, "-p", "1", "-timeout", "5m") if *coverage { gotest.Args = append(gotest.Args, "-covermode=atomic", "-cover") } @@ -408,9 +385,6 @@ func doArchive(cmdline []string) { basegeth = archiveBasename(*arch, params.ArchiveVersion(env.Commit)) geth = "geth-" + basegeth + ext alltools = "geth-alltools-" + basegeth + ext - - baseswarm = archiveBasename(*arch, sv.ArchiveVersion(env.Commit)) - swarm = "swarm-" + baseswarm + ext ) maybeSkipArchive(env) if err := build.WriteArchive(geth, gethArchiveFiles); err != nil { @@ -419,10 +393,7 @@ func doArchive(cmdline []string) { if err := build.WriteArchive(alltools, allToolsArchiveFiles); err != nil { log.Fatal(err) } - if err := build.WriteArchive(swarm, swarmArchiveFiles); err != nil { - log.Fatal(err) - } - for _, archive := range []string{geth, alltools, swarm} { + for _, archive := range []string{geth, alltools} { if err := archiveUpload(archive, *upload, *signer); err != nil { log.Fatal(err) } @@ -446,11 +417,8 @@ func archiveBasename(arch string, archiveVersion string) string { func archiveUpload(archive string, blobstore string, signer string) error { // If signing was requested, generate the signature files if signer != "" { - pgpkey, err := base64.StdEncoding.DecodeString(os.Getenv(signer)) - if err != nil { - return fmt.Errorf("invalid base64 %s", signer) - } - if err := build.PGPSignFile(archive, archive+".asc", string(pgpkey)); err != nil { + key := getenvBase64(signer) + if err := build.PGPSignFile(archive, archive+".asc", string(key)); err != nil { return err } } @@ -493,7 +461,8 @@ func maybeSkipArchive(env build.Environment) { func doDebianSource(cmdline []string) { var ( signer = flag.String("signer", "", `Signing key name, also used as package author`) - upload = flag.String("upload", "", `Where to upload the source package (usually "ppa:ethereum/ethereum")`) + upload = flag.String("upload", "", `Where to upload the source package (usually "ethereum/ethereum")`) + sshUser = flag.String("sftp-user", "", `Username for SFTP upload (usually "geth-ci")`) workdir = flag.String("workdir", "", `Output directory for packages (uses temp dir if unset)`) now = time.Now() ) @@ -503,11 +472,7 @@ func doDebianSource(cmdline []string) { maybeSkipArchive(env) // Import the signing key. - if b64key := os.Getenv("PPA_SIGNING_KEY"); b64key != "" { - key, err := base64.StdEncoding.DecodeString(b64key) - if err != nil { - log.Fatal("invalid base64 PPA_SIGNING_KEY") - } + if key := getenvBase64("PPA_SIGNING_KEY"); len(key) > 0 { gpg := exec.Command("gpg", "--import") gpg.Stdin = bytes.NewReader(key) build.MustRun(gpg) @@ -518,22 +483,58 @@ func doDebianSource(cmdline []string) { for _, distro := range debDistros { meta := newDebMetadata(distro, *signer, env, now, pkg.Name, pkg.Version, pkg.Executables) pkgdir := stageDebianSource(*workdir, meta) - debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc") + debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc", "-d", "-Zxz") debuild.Dir = pkgdir build.MustRun(debuild) - changes := fmt.Sprintf("%s_%s_source.changes", meta.Name(), meta.VersionString()) - changes = filepath.Join(*workdir, changes) + var ( + basename = fmt.Sprintf("%s_%s", meta.Name(), meta.VersionString()) + source = filepath.Join(*workdir, basename+".tar.xz") + dsc = filepath.Join(*workdir, basename+".dsc") + changes = filepath.Join(*workdir, basename+"_source.changes") + ) if *signer != "" { build.MustRunCommand("debsign", changes) } if *upload != "" { - build.MustRunCommand("dput", *upload, changes) + ppaUpload(*workdir, *upload, *sshUser, []string{source, dsc, changes}) } } } } +func ppaUpload(workdir, ppa, sshUser string, files []string) { + p := strings.Split(ppa, "/") + if len(p) != 2 { + log.Fatal("-upload PPA name must contain single /") + } + if sshUser == "" { + sshUser = p[0] + } + incomingDir := fmt.Sprintf("~%s/ubuntu/%s", p[0], p[1]) + // Create the SSH identity file if it doesn't exist. + var idfile string + if sshkey := getenvBase64("PPA_SSH_KEY"); len(sshkey) > 0 { + idfile = filepath.Join(workdir, "sshkey") + if _, err := os.Stat(idfile); os.IsNotExist(err) { + ioutil.WriteFile(idfile, sshkey, 0600) + } + } + // Upload + dest := sshUser + "@ppa.launchpad.net" + if err := build.UploadSFTP(idfile, dest, incomingDir, files); err != nil { + log.Fatal(err) + } +} + +func getenvBase64(variable string) []byte { + dec, err := base64.StdEncoding.DecodeString(os.Getenv(variable)) + if err != nil { + log.Fatal("invalid base64 " + variable) + } + return []byte(dec) +} + func makeWorkdir(wdflag string) string { var err error if wdflag != "" { @@ -555,8 +556,8 @@ func isUnstableBuild(env build.Environment) bool { } type debPackage struct { - Name string // the name of the Debian package to produce, e.g. "ethereum", or "ethereum-swarm" - Version string // the clean version of the debPackage, e.g. 1.8.12 or 0.3.0, without any metadata + Name string // the name of the Debian package to produce, e.g. "ethereum" + Version string // the clean version of the debPackage, e.g. 1.8.12, without any metadata Executables []debExecutable // executables to be included in the package } @@ -775,12 +776,8 @@ func doAndroidArchive(cmdline []string) { if os.Getenv("ANDROID_HOME") == "" { log.Fatal("Please ensure ANDROID_HOME points to your Android SDK") } - if os.Getenv("ANDROID_NDK") == "" { - log.Fatal("Please ensure ANDROID_NDK points to your Android NDK") - } // Build the Android archive and Maven resources build.MustRun(goTool("get", "golang.org/x/mobile/cmd/gomobile", "golang.org/x/mobile/cmd/gobind")) - build.MustRun(gomobileTool("init", "--ndk", os.Getenv("ANDROID_NDK"))) build.MustRun(gomobileTool("bind", "-ldflags", "-s -w", "--target", "android", "--javapkg", "org.ethereum", "-v", "github.com/ethereum/go-ethereum/mobile")) if *local { @@ -805,15 +802,10 @@ func doAndroidArchive(cmdline []string) { os.Rename(archive, meta.Package+".aar") if *signer != "" && *deploy != "" { // Import the signing key into the local GPG instance - b64key := os.Getenv(*signer) - key, err := base64.StdEncoding.DecodeString(b64key) - if err != nil { - log.Fatalf("invalid base64 %s", *signer) - } + key := getenvBase64(*signer) gpg := exec.Command("gpg", "--import") gpg.Stdin = bytes.NewReader(key) build.MustRun(gpg) - keyID, err := build.PGPKeyID(string(key)) if err != nil { log.Fatal(err) @@ -1001,7 +993,7 @@ func doXgo(cmdline []string) { if *alltools { args = append(args, []string{"--dest", GOBIN}...) - for _, res := range allCrossCompiledArchiveFiles { + for _, res := range allToolsArchiveFiles { if strings.HasPrefix(res, GOBIN) { // Binary tool found, cross build it explicitly args = append(args, "./"+filepath.Join("cmd", filepath.Base(res))) diff --git a/build/deb/ethereum-swarm/deb.changelog b/build/deb/ethereum-swarm/deb.changelog deleted file mode 100644 index 83f804a83384..000000000000 --- a/build/deb/ethereum-swarm/deb.changelog +++ /dev/null @@ -1,5 +0,0 @@ -{{.Name}} ({{.VersionString}}) {{.Distro}}; urgency=low - - * git build of {{.Env.Commit}} - - -- {{.Author}} {{.Time}} diff --git a/build/deb/ethereum-swarm/deb.control b/build/deb/ethereum-swarm/deb.control deleted file mode 100644 index 8cd325bf55ac..000000000000 --- a/build/deb/ethereum-swarm/deb.control +++ /dev/null @@ -1,19 +0,0 @@ -Source: {{.Name}} -Section: science -Priority: extra -Maintainer: {{.Author}} -Build-Depends: debhelper (>= 8.0.0), golang-1.10 -Standards-Version: 3.9.5 -Homepage: https://ethereum.org -Vcs-Git: git://github.com/ethereum/go-ethereum.git -Vcs-Browser: https://github.com/ethereum/go-ethereum - -{{range .Executables}} -Package: {{$.ExeName .}} -Conflicts: {{$.ExeConflicts .}} -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Built-Using: ${misc:Built-Using} -Description: {{.Description}} - {{.Description}} -{{end}} diff --git a/build/deb/ethereum-swarm/deb.copyright b/build/deb/ethereum-swarm/deb.copyright deleted file mode 100644 index fe6e36ad9d76..000000000000 --- a/build/deb/ethereum-swarm/deb.copyright +++ /dev/null @@ -1,14 +0,0 @@ -Copyright 2018 The go-ethereum Authors - -go-ethereum is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -go-ethereum is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with go-ethereum. If not, see . diff --git a/build/deb/ethereum-swarm/deb.docs b/build/deb/ethereum-swarm/deb.docs deleted file mode 100644 index 62deb04972da..000000000000 --- a/build/deb/ethereum-swarm/deb.docs +++ /dev/null @@ -1 +0,0 @@ -AUTHORS diff --git a/build/deb/ethereum-swarm/deb.install b/build/deb/ethereum-swarm/deb.install deleted file mode 100644 index e7666ce5fb6b..000000000000 --- a/build/deb/ethereum-swarm/deb.install +++ /dev/null @@ -1 +0,0 @@ -build/bin/{{.BinaryName}} usr/bin diff --git a/build/deb/ethereum-swarm/deb.rules b/build/deb/ethereum-swarm/deb.rules deleted file mode 100644 index 7f286569ea6e..000000000000 --- a/build/deb/ethereum-swarm/deb.rules +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -override_dh_auto_build: - build/env.sh /usr/lib/go-1.10/bin/go run build/ci.go install -git-commit={{.Env.Commit}} -git-branch={{.Env.Branch}} -git-tag={{.Env.Tag}} -buildnum={{.Env.Buildnum}} -pull-request={{.Env.IsPullRequest}} - -override_dh_auto_test: - -%: - dh $@ diff --git a/build/deb/ethereum/deb.control b/build/deb/ethereum/deb.control index defb106fe367..5b3ff93542c4 100644 --- a/build/deb/ethereum/deb.control +++ b/build/deb/ethereum/deb.control @@ -2,7 +2,7 @@ Source: {{.Name}} Section: science Priority: extra Maintainer: {{.Author}} -Build-Depends: debhelper (>= 8.0.0), golang-1.10 +Build-Depends: debhelper (>= 8.0.0), golang-1.11 Standards-Version: 3.9.5 Homepage: https://ethereum.org Vcs-Git: git://github.com/ethereum/go-ethereum.git @@ -11,8 +11,8 @@ Vcs-Browser: https://github.com/ethereum/go-ethereum Package: {{.Name}} Architecture: any Depends: ${misc:Depends}, {{.ExeList}} -Description: Meta-package to install geth, swarm, and other tools - Meta-package to install geth, swarm and other tools +Description: Meta-package to install geth and other tools + Meta-package to install geth and other tools {{range .Executables}} Package: {{$.ExeName .}} diff --git a/build/deb/ethereum/deb.rules b/build/deb/ethereum/deb.rules index 7f286569ea6e..5280e0e55aa4 100644 --- a/build/deb/ethereum/deb.rules +++ b/build/deb/ethereum/deb.rules @@ -4,8 +4,11 @@ # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 +# Launchpad rejects Go's access to $HOME/.cache, use custom folder +export GOCACHE=/tmp/go-build + override_dh_auto_build: - build/env.sh /usr/lib/go-1.10/bin/go run build/ci.go install -git-commit={{.Env.Commit}} -git-branch={{.Env.Branch}} -git-tag={{.Env.Tag}} -buildnum={{.Env.Buildnum}} -pull-request={{.Env.IsPullRequest}} + build/env.sh /usr/lib/go-1.11/bin/go run build/ci.go install -git-commit={{.Env.Commit}} -git-branch={{.Env.Branch}} -git-tag={{.Env.Tag}} -buildnum={{.Env.Buildnum}} -pull-request={{.Env.IsPullRequest}} override_dh_auto_test: diff --git a/build/travis_keepalive.sh b/build/travis_keepalive.sh new file mode 100755 index 000000000000..77cc623eaf5f --- /dev/null +++ b/build/travis_keepalive.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +# travis_keepalive runs the given command and preserves its return value, +# while it forks a child process what periodically produces a log line, +# so that Travis won't abort the build after 10 minutes. + +# Why? +# `t.Log()` in Go holds the buffer until the test does not pass or fail, +# and `-race` can increase the execution time by 2-20x. + +set -euo pipefail + +readonly KEEPALIVE_INTERVAL=300 # seconds => 5m + +main() { + keepalive + $@ +} + +# Keepalive produces a log line in each KEEPALIVE_INTERVAL. +keepalive() { + local child_pid + # Note: We fork here! + repeat "keepalive" & + child_pid=$! + ensureChildOnEXIT "${child_pid}" +} + +repeat() { + local this="$1" + while true; do + echo "${this}" + sleep "${KEEPALIVE_INTERVAL}" + done +} + +# Ensures that the child gets killed on normal program exit. +ensureChildOnEXIT() { + # Note: SIGINT and SIGTERM are forwarded to the child process by Bash + # automatically, so we don't have to deal with signals. + + local child_pid="$1" + trap "kill ${child_pid}" EXIT +} + +main "$@" diff --git a/build/update-license.go b/build/update-license.go index 22e403342808..aa4d6100d78d 100644 --- a/build/update-license.go +++ b/build/update-license.go @@ -1,3 +1,19 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + // +build none /* @@ -46,18 +62,22 @@ var ( skipPrefixes = []string{ // boring stuff "vendor/", "tests/testdata/", "build/", + // don't relicense vendored sources "cmd/internal/browser", + "common/bitutil/bitutil", + "common/prque/", "consensus/ethash/xor.go", "crypto/bn256/", "crypto/ecies/", - "crypto/secp256k1/curve.go", - "crypto/sha3/", + "graphql/graphiql.go", "internal/jsre/deps", "log/", - "common/bitutil/bitutil", - // don't license generated files - "contracts/chequebook/contract/code.go", + "metrics/", + "signer/rules/deps", + + // skip special licenses + "crypto/secp256k1", // Relicensed to BSD-3 via https://github.com/ethereum/go-ethereum/pull/17225 } // paths with this prefix are licensed as GPL. all other files are LGPL. @@ -130,6 +150,13 @@ func (i info) gpl() bool { return false } +// authors implements the sort.Interface for strings in case-insensitive mode. +type authors []string + +func (as authors) Len() int { return len(as) } +func (as authors) Less(i, j int) bool { return strings.ToLower(as[i]) < strings.ToLower(as[j]) } +func (as authors) Swap(i, j int) { as[i], as[j] = as[j], as[i] } + func main() { var ( files = getFiles() @@ -248,27 +275,32 @@ func mailmapLookup(authors []string) []string { } func writeAuthors(files []string) { - merge := make(map[string]bool) - // Add authors that Git reports as contributorxs. + var ( + dedup = make(map[string]bool) + list []string + ) + // Add authors that Git reports as contributors. // This is the primary source of author information. for _, a := range gitAuthors(files) { - merge[a] = true + if la := strings.ToLower(a); !dedup[la] { + list = append(list, a) + dedup[la] = true + } } // Add existing authors from the file. This should ensure that we // never lose authors, even if Git stops listing them. We can also // add authors manually this way. for _, a := range readAuthors() { - merge[a] = true + if la := strings.ToLower(a); !dedup[la] { + list = append(list, a) + dedup[la] = true + } } // Write sorted list of authors back to the file. - var result []string - for a := range merge { - result = append(result, a) - } - sort.Strings(result) + sort.Sort(authors(list)) content := new(bytes.Buffer) content.WriteString(authorsFileHeader) - for _, a := range result { + for _, a := range list { content.WriteString(a) content.WriteString("\n") } diff --git a/cmd/abigen/main.go b/cmd/abigen/main.go index 3ac37ba7aded..769811500896 100644 --- a/cmd/abigen/main.go +++ b/cmd/abigen/main.go @@ -18,83 +18,199 @@ package main import ( "encoding/json" - "flag" "fmt" "io/ioutil" "os" "strings" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common/compiler" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "gopkg.in/urfave/cli.v1" +) + +const ( + commandHelperTemplate = `{{.Name}}{{if .Subcommands}} command{{end}}{{if .Flags}} [command options]{{end}} [arguments...] +{{if .Description}}{{.Description}} +{{end}}{{if .Subcommands}} +SUBCOMMANDS: + {{range .Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} + {{end}}{{end}}{{if .Flags}} +OPTIONS: +{{range $.Flags}}{{"\t"}}{{.}} +{{end}} +{{end}}` ) var ( - abiFlag = flag.String("abi", "", "Path to the Ethereum contract ABI json to bind, - for STDIN") - binFlag = flag.String("bin", "", "Path to the Ethereum contract bytecode (generate deploy method)") - typFlag = flag.String("type", "", "Struct name for the binding (default = package name)") + // Git SHA1 commit hash of the release (set via linker flags) + gitCommit = "" + gitDate = "" - solFlag = flag.String("sol", "", "Path to the Ethereum contract Solidity source to build and bind") - solcFlag = flag.String("solc", "solc", "Solidity compiler to use if source builds are requested") - excFlag = flag.String("exc", "", "Comma separated types to exclude from binding") + app *cli.App - pkgFlag = flag.String("pkg", "", "Package name to generate the binding into") - outFlag = flag.String("out", "", "Output file for the generated binding (default = stdout)") - langFlag = flag.String("lang", "go", "Destination language for the bindings (go, java, objc)") + // Flags needed by abigen + abiFlag = cli.StringFlag{ + Name: "abi", + Usage: "Path to the Ethereum contract ABI json to bind, - for STDIN", + } + binFlag = cli.StringFlag{ + Name: "bin", + Usage: "Path to the Ethereum contract bytecode (generate deploy method)", + } + typeFlag = cli.StringFlag{ + Name: "type", + Usage: "Struct name for the binding (default = package name)", + } + jsonFlag = cli.StringFlag{ + Name: "combined-json", + Usage: "Path to the combined-json file generated by compiler", + } + solFlag = cli.StringFlag{ + Name: "sol", + Usage: "Path to the Ethereum contract Solidity source to build and bind", + } + solcFlag = cli.StringFlag{ + Name: "solc", + Usage: "Solidity compiler to use if source builds are requested", + Value: "solc", + } + vyFlag = cli.StringFlag{ + Name: "vy", + Usage: "Path to the Ethereum contract Vyper source to build and bind", + } + vyperFlag = cli.StringFlag{ + Name: "vyper", + Usage: "Vyper compiler to use if source builds are requested", + Value: "vyper", + } + excFlag = cli.StringFlag{ + Name: "exc", + Usage: "Comma separated types to exclude from binding", + } + pkgFlag = cli.StringFlag{ + Name: "pkg", + Usage: "Package name to generate the binding into", + } + outFlag = cli.StringFlag{ + Name: "out", + Usage: "Output file for the generated binding (default = stdout)", + } + langFlag = cli.StringFlag{ + Name: "lang", + Usage: "Destination language for the bindings (go, java, objc)", + Value: "go", + } ) -func main() { - // Parse and ensure all needed inputs are specified - flag.Parse() - - if *abiFlag == "" && *solFlag == "" { - fmt.Printf("No contract ABI (--abi) or Solidity source (--sol) specified\n") - os.Exit(-1) - } else if (*abiFlag != "" || *binFlag != "" || *typFlag != "") && *solFlag != "" { - fmt.Printf("Contract ABI (--abi), bytecode (--bin) and type (--type) flags are mutually exclusive with the Solidity source (--sol) flag\n") - os.Exit(-1) +func init() { + app = utils.NewApp(gitCommit, gitDate, "ethereum checkpoint helper tool") + app.Flags = []cli.Flag{ + abiFlag, + binFlag, + typeFlag, + jsonFlag, + solFlag, + solcFlag, + vyFlag, + vyperFlag, + excFlag, + pkgFlag, + outFlag, + langFlag, } - if *pkgFlag == "" { - fmt.Printf("No destination package specified (--pkg)\n") - os.Exit(-1) + app.Action = utils.MigrateFlags(abigen) + cli.CommandHelpTemplate = commandHelperTemplate +} + +func abigen(c *cli.Context) error { + utils.CheckExclusive(c, abiFlag, jsonFlag, solFlag, vyFlag) // Only one source can be selected. + if c.GlobalString(pkgFlag.Name) == "" { + utils.Fatalf("No destination package specified (--pkg)") } var lang bind.Lang - switch *langFlag { + switch c.GlobalString(langFlag.Name) { case "go": lang = bind.LangGo case "java": lang = bind.LangJava case "objc": lang = bind.LangObjC + utils.Fatalf("Objc binding generation is uncompleted") default: - fmt.Printf("Unsupported destination language \"%s\" (--lang)\n", *langFlag) - os.Exit(-1) + utils.Fatalf("Unsupported destination language \"%s\" (--lang)", c.GlobalString(langFlag.Name)) } // If the entire solidity code was specified, build and bind based on that var ( abis []string bins []string types []string + sigs []map[string]string + libs = make(map[string]string) ) - if *solFlag != "" || *abiFlag == "-" { + if c.GlobalString(abiFlag.Name) != "" { + // Load up the ABI, optional bytecode and type name from the parameters + var ( + abi []byte + err error + ) + input := c.GlobalString(abiFlag.Name) + if input == "-" { + abi, err = ioutil.ReadAll(os.Stdin) + } else { + abi, err = ioutil.ReadFile(input) + } + if err != nil { + utils.Fatalf("Failed to read input ABI: %v", err) + } + abis = append(abis, string(abi)) + + var bin []byte + if binFile := c.GlobalString(binFlag.Name); binFile != "" { + if bin, err = ioutil.ReadFile(binFile); err != nil { + utils.Fatalf("Failed to read input bytecode: %v", err) + } + if strings.Contains(string(bin), "//") { + utils.Fatalf("Contract has additional library references, please use other mode(e.g. --combined-json) to catch library infos") + } + } + bins = append(bins, string(bin)) + + kind := c.GlobalString(typeFlag.Name) + if kind == "" { + kind = c.GlobalString(pkgFlag.Name) + } + types = append(types, kind) + } else { // Generate the list of types to exclude from binding exclude := make(map[string]bool) - for _, kind := range strings.Split(*excFlag, ",") { + for _, kind := range strings.Split(c.GlobalString(excFlag.Name), ",") { exclude[strings.ToLower(kind)] = true } - - var contracts map[string]*compiler.Contract var err error - if *solFlag != "" { - contracts, err = compiler.CompileSolidity(*solcFlag, *solFlag) + var contracts map[string]*compiler.Contract + + switch { + case c.GlobalIsSet(solFlag.Name): + contracts, err = compiler.CompileSolidity(c.GlobalString(solcFlag.Name), c.GlobalString(solFlag.Name)) if err != nil { - fmt.Printf("Failed to build Solidity contract: %v\n", err) - os.Exit(-1) + utils.Fatalf("Failed to build Solidity contract: %v", err) } - } else { - contracts, err = contractsFromStdin() + case c.GlobalIsSet(vyFlag.Name): + contracts, err = compiler.CompileVyper(c.GlobalString(vyperFlag.Name), c.GlobalString(vyFlag.Name)) if err != nil { - fmt.Printf("Failed to read input ABIs from STDIN: %v\n", err) - os.Exit(-1) + utils.Fatalf("Failed to build Vyper contract: %v", err) + } + case c.GlobalIsSet(jsonFlag.Name): + jsonOutput, err := ioutil.ReadFile(c.GlobalString(jsonFlag.Name)) + if err != nil { + utils.Fatalf("Failed to read combined-json from compiler: %v", err) + } + contracts, err = compiler.ParseCombinedJSON(jsonOutput, "", "", "", "") + if err != nil { + utils.Fatalf("Failed to read contract information from json output: %v", err) } } // Gather all non-excluded contract for binding @@ -102,59 +218,41 @@ func main() { if exclude[strings.ToLower(name)] { continue } - abi, _ := json.Marshal(contract.Info.AbiDefinition) // Flatten the compiler parse + abi, err := json.Marshal(contract.Info.AbiDefinition) // Flatten the compiler parse + if err != nil { + utils.Fatalf("Failed to parse ABIs from compiler output: %v", err) + } abis = append(abis, string(abi)) bins = append(bins, contract.Code) - + sigs = append(sigs, contract.Hashes) nameParts := strings.Split(name, ":") types = append(types, nameParts[len(nameParts)-1]) - } - } else { - // Otherwise load up the ABI, optional bytecode and type name from the parameters - abi, err := ioutil.ReadFile(*abiFlag) - if err != nil { - fmt.Printf("Failed to read input ABI: %v\n", err) - os.Exit(-1) - } - abis = append(abis, string(abi)) - bin := []byte{} - if *binFlag != "" { - if bin, err = ioutil.ReadFile(*binFlag); err != nil { - fmt.Printf("Failed to read input bytecode: %v\n", err) - os.Exit(-1) - } + libPattern := crypto.Keccak256Hash([]byte(name)).String()[2:36] + libs[libPattern] = nameParts[len(nameParts)-1] } - bins = append(bins, string(bin)) - - kind := *typFlag - if kind == "" { - kind = *pkgFlag - } - types = append(types, kind) } // Generate the contract binding - code, err := bind.Bind(types, abis, bins, *pkgFlag, lang) + code, err := bind.Bind(types, abis, bins, sigs, c.GlobalString(pkgFlag.Name), lang, libs) if err != nil { - fmt.Printf("Failed to generate ABI binding: %v\n", err) - os.Exit(-1) + utils.Fatalf("Failed to generate ABI binding: %v", err) } // Either flush it out to a file or display on the standard output - if *outFlag == "" { + if !c.GlobalIsSet(outFlag.Name) { fmt.Printf("%s\n", code) - return + return nil } - if err := ioutil.WriteFile(*outFlag, []byte(code), 0600); err != nil { - fmt.Printf("Failed to write ABI binding: %v\n", err) - os.Exit(-1) + if err := ioutil.WriteFile(c.GlobalString(outFlag.Name), []byte(code), 0600); err != nil { + utils.Fatalf("Failed to write ABI binding: %v", err) } + return nil } -func contractsFromStdin() (map[string]*compiler.Contract, error) { - bytes, err := ioutil.ReadAll(os.Stdin) - if err != nil { - return nil, err - } +func main() { + log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) - return compiler.ParseCombinedJSON(bytes, "", "", "", "") + if err := app.Run(os.Args); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } } diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go index 84590086525a..2f9bba111769 100644 --- a/cmd/bootnode/main.go +++ b/cmd/bootnode/main.go @@ -38,7 +38,7 @@ func main() { var ( listenAddr = flag.String("addr", ":30301", "listen address") genKey = flag.String("genkey", "", "generate a node key") - writeAddr = flag.Bool("writeaddress", false, "write out the node's pubkey hash and quit") + writeAddr = flag.Bool("writeaddress", false, "write out the node's public key and quit") nodeKeyFile = flag.String("nodekey", "", "private key filename") nodeKeyHex = flag.String("nodekeyhex", "", "private key as hex (for testing)") natdesc = flag.String("nat", "none", "port mapping mechanism (any|none|upnp|pmp|extip:)") @@ -86,7 +86,7 @@ func main() { } if *writeAddr { - fmt.Printf("%v\n", enode.PubkeyToIDV4(&nodeKey.PublicKey)) + fmt.Printf("%x\n", crypto.FromECDSAPub(&nodeKey.PublicKey)[1:]) os.Exit(0) } @@ -112,26 +112,38 @@ func main() { if !realaddr.IP.IsLoopback() { go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") } - // TODO: react to external IP changes over time. if ext, err := natm.ExternalIP(); err == nil { realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port} } } + printNotice(&nodeKey.PublicKey, *realaddr) + if *runv5 { - if _, err := discv5.ListenUDP(nodeKey, conn, realaddr, "", restrictList); err != nil { + if _, err := discv5.ListenUDP(nodeKey, conn, "", restrictList); err != nil { utils.Fatalf("%v", err) } } else { + db, _ := enode.OpenDB("") + ln := enode.NewLocalNode(db, nodeKey) cfg := discover.Config{ - PrivateKey: nodeKey, - AnnounceAddr: realaddr, - NetRestrict: restrictList, + PrivateKey: nodeKey, + NetRestrict: restrictList, } - if _, err := discover.ListenUDP(conn, cfg); err != nil { + if _, err := discover.ListenUDP(conn, ln, cfg); err != nil { utils.Fatalf("%v", err) } } select {} } + +func printNotice(nodeKey *ecdsa.PublicKey, addr net.UDPAddr) { + if addr.IP.IsUnspecified() { + addr.IP = net.IP{127, 0, 0, 1} + } + n := enode.NewV4(nodeKey, addr.IP, 0, addr.Port) + fmt.Println(n.URLv4()) + fmt.Println("Note: you're using cmd/bootnode, a developer tool.") + fmt.Println("We recommend using a regular node as bootstrap node for production deployments.") +} diff --git a/cmd/checkpoint-admin/common.go b/cmd/checkpoint-admin/common.go new file mode 100644 index 000000000000..05a45dfbf997 --- /dev/null +++ b/cmd/checkpoint-admin/common.go @@ -0,0 +1,120 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "strconv" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/external" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + "gopkg.in/urfave/cli.v1" +) + +// newClient creates a client with specified remote URL. +func newClient(ctx *cli.Context) *ethclient.Client { + client, err := ethclient.Dial(ctx.GlobalString(nodeURLFlag.Name)) + if err != nil { + utils.Fatalf("Failed to connect to Ethereum node: %v", err) + } + return client +} + +// newRPCClient creates a rpc client with specified node URL. +func newRPCClient(url string) *rpc.Client { + client, err := rpc.Dial(url) + if err != nil { + utils.Fatalf("Failed to connect to Ethereum node: %v", err) + } + return client +} + +// getContractAddr retrieves the register contract address through +// rpc request. +func getContractAddr(client *rpc.Client) common.Address { + var addr string + if err := client.Call(&addr, "les_getCheckpointContractAddress"); err != nil { + utils.Fatalf("Failed to fetch checkpoint oracle address: %v", err) + } + return common.HexToAddress(addr) +} + +// getCheckpoint retrieves the specified checkpoint or the latest one +// through rpc request. +func getCheckpoint(ctx *cli.Context, client *rpc.Client) *params.TrustedCheckpoint { + var checkpoint *params.TrustedCheckpoint + + if ctx.GlobalIsSet(indexFlag.Name) { + var result [3]string + index := uint64(ctx.GlobalInt64(indexFlag.Name)) + if err := client.Call(&result, "les_getCheckpoint", index); err != nil { + utils.Fatalf("Failed to get local checkpoint %v, please ensure the les API is exposed", err) + } + checkpoint = ¶ms.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: common.HexToHash(result[0]), + CHTRoot: common.HexToHash(result[1]), + BloomRoot: common.HexToHash(result[2]), + } + } else { + var result [4]string + err := client.Call(&result, "les_latestCheckpoint") + if err != nil { + utils.Fatalf("Failed to get local checkpoint %v, please ensure the les API is exposed", err) + } + index, err := strconv.ParseUint(result[0], 0, 64) + if err != nil { + utils.Fatalf("Failed to parse checkpoint index %v", err) + } + checkpoint = ¶ms.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: common.HexToHash(result[1]), + CHTRoot: common.HexToHash(result[2]), + BloomRoot: common.HexToHash(result[3]), + } + } + return checkpoint +} + +// newContract creates a registrar contract instance with specified +// contract address or the default contracts for mainnet or testnet. +func newContract(client *rpc.Client) (common.Address, *checkpointoracle.CheckpointOracle) { + addr := getContractAddr(client) + if addr == (common.Address{}) { + utils.Fatalf("No specified registrar contract address") + } + contract, err := checkpointoracle.NewCheckpointOracle(addr, ethclient.NewClient(client)) + if err != nil { + utils.Fatalf("Failed to setup registrar contract %s: %v", addr, err) + } + return addr, contract +} + +// newClefSigner sets up a clef backend and returns a clef transaction signer. +func newClefSigner(ctx *cli.Context) *bind.TransactOpts { + clef, err := external.NewExternalSigner(ctx.String(clefURLFlag.Name)) + if err != nil { + utils.Fatalf("Failed to create clef signer %v", err) + } + return bind.NewClefTransactor(clef, accounts.Account{Address: common.HexToAddress(ctx.String(signerFlag.Name))}) +} diff --git a/cmd/checkpoint-admin/exec.go b/cmd/checkpoint-admin/exec.go new file mode 100644 index 000000000000..352a96d9e6f0 --- /dev/null +++ b/cmd/checkpoint-admin/exec.go @@ -0,0 +1,311 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "bytes" + "context" + "encoding/binary" + "fmt" + "math/big" + "strings" + "time" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle/contract" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + "gopkg.in/urfave/cli.v1" +) + +var commandDeploy = cli.Command{ + Name: "deploy", + Usage: "Deploy a new checkpoint oracle contract", + Flags: []cli.Flag{ + nodeURLFlag, + clefURLFlag, + signerFlag, + signersFlag, + thresholdFlag, + }, + Action: utils.MigrateFlags(deploy), +} + +var commandSign = cli.Command{ + Name: "sign", + Usage: "Sign the checkpoint with the specified key", + Flags: []cli.Flag{ + nodeURLFlag, + clefURLFlag, + signerFlag, + indexFlag, + hashFlag, + oracleFlag, + }, + Action: utils.MigrateFlags(sign), +} + +var commandPublish = cli.Command{ + Name: "publish", + Usage: "Publish a checkpoint into the oracle", + Flags: []cli.Flag{ + nodeURLFlag, + clefURLFlag, + signerFlag, + indexFlag, + signaturesFlag, + }, + Action: utils.MigrateFlags(publish), +} + +// deploy deploys the checkpoint registrar contract. +// +// Note the network where the contract is deployed depends on +// the network where the connected node is located. +func deploy(ctx *cli.Context) error { + // Gather all the addresses that should be permitted to sign + var addrs []common.Address + for _, account := range strings.Split(ctx.String(signersFlag.Name), ",") { + if trimmed := strings.TrimSpace(account); !common.IsHexAddress(trimmed) { + utils.Fatalf("Invalid account in --signers: '%s'", trimmed) + } + addrs = append(addrs, common.HexToAddress(account)) + } + // Retrieve and validate the signing threshold + needed := ctx.Int(thresholdFlag.Name) + if needed == 0 || needed > len(addrs) { + utils.Fatalf("Invalid signature threshold %d", needed) + } + // Print a summary to ensure the user understands what they're signing + fmt.Printf("Deploying new checkpoint oracle:\n\n") + for i, addr := range addrs { + fmt.Printf("Admin %d => %s\n", i+1, addr.Hex()) + } + fmt.Printf("\nSignatures needed to publish: %d\n", needed) + + // setup clef signer, create an abigen transactor and an RPC client + transactor, client := newClefSigner(ctx), newClient(ctx) + + // Deploy the checkpoint oracle + fmt.Println("Sending deploy request to Clef...") + oracle, tx, _, err := contract.DeployCheckpointOracle(transactor, client, addrs, big.NewInt(int64(params.CheckpointFrequency)), + big.NewInt(int64(params.CheckpointProcessConfirmations)), big.NewInt(int64(needed))) + if err != nil { + utils.Fatalf("Failed to deploy checkpoint oracle %v", err) + } + log.Info("Deployed checkpoint oracle", "address", oracle, "tx", tx.Hash().Hex()) + + return nil +} + +// sign creates the signature for specific checkpoint +// with local key. Only contract admins have the permission to +// sign checkpoint. +func sign(ctx *cli.Context) error { + var ( + offline bool // The indicator whether we sign checkpoint by offline. + chash common.Hash + cindex uint64 + address common.Address + + node *rpc.Client + oracle *checkpointoracle.CheckpointOracle + ) + if !ctx.GlobalIsSet(nodeURLFlag.Name) { + // Offline mode signing + offline = true + if !ctx.IsSet(hashFlag.Name) { + utils.Fatalf("Please specify the checkpoint hash (--hash) to sign in offline mode") + } + chash = common.HexToHash(ctx.String(hashFlag.Name)) + + if !ctx.IsSet(indexFlag.Name) { + utils.Fatalf("Please specify checkpoint index (--index) to sign in offline mode") + } + cindex = ctx.Uint64(indexFlag.Name) + + if !ctx.IsSet(oracleFlag.Name) { + utils.Fatalf("Please specify oracle address (--oracle) to sign in offline mode") + } + address = common.HexToAddress(ctx.String(oracleFlag.Name)) + } else { + // Interactive mode signing, retrieve the data from the remote node + node = newRPCClient(ctx.GlobalString(nodeURLFlag.Name)) + + checkpoint := getCheckpoint(ctx, node) + chash, cindex, address = checkpoint.Hash(), checkpoint.SectionIndex, getContractAddr(node) + + // Check the validity of checkpoint + reqCtx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second) + defer cancelFn() + + head, err := ethclient.NewClient(node).HeaderByNumber(reqCtx, nil) + if err != nil { + return err + } + num := head.Number.Uint64() + if num < ((cindex+1)*params.CheckpointFrequency + params.CheckpointProcessConfirmations) { + utils.Fatalf("Invalid future checkpoint") + } + _, oracle = newContract(node) + latest, _, h, err := oracle.Contract().GetLatestCheckpoint(nil) + if err != nil { + return err + } + if cindex < latest { + utils.Fatalf("Checkpoint is too old") + } + if cindex == latest && (latest != 0 || h.Uint64() != 0) { + utils.Fatalf("Stale checkpoint, latest registered %d, given %d", latest, cindex) + } + } + var ( + signature string + signer string + ) + // isAdmin checks whether the specified signer is admin. + isAdmin := func(addr common.Address) error { + signers, err := oracle.Contract().GetAllAdmin(nil) + if err != nil { + return err + } + for _, s := range signers { + if s == addr { + return nil + } + } + return fmt.Errorf("signer %v is not the admin", addr.Hex()) + } + // Print to the user the data thy are about to sign + fmt.Printf("Oracle => %s\n", address.Hex()) + fmt.Printf("Index %4d => %s\n", cindex, chash.Hex()) + + // Sign checkpoint in clef mode. + signer = ctx.String(signerFlag.Name) + + if !offline { + if err := isAdmin(common.HexToAddress(signer)); err != nil { + return err + } + } + clef := newRPCClient(ctx.String(clefURLFlag.Name)) + p := make(map[string]string) + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, cindex) + p["address"] = address.Hex() + p["message"] = hexutil.Encode(append(buf, chash.Bytes()...)) + + fmt.Println("Sending signing request to Clef...") + if err := clef.Call(&signature, "account_signData", accounts.MimetypeDataWithValidator, signer, p); err != nil { + utils.Fatalf("Failed to sign checkpoint, err %v", err) + } + fmt.Printf("Signer => %s\n", signer) + fmt.Printf("Signature => %s\n", signature) + return nil +} + +// sighash calculates the hash of the data to sign for the checkpoint oracle. +func sighash(index uint64, oracle common.Address, hash common.Hash) []byte { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, index) + + data := append([]byte{0x19, 0x00}, append(oracle[:], append(buf, hash[:]...)...)...) + return crypto.Keccak256(data) +} + +// ecrecover calculates the sender address from a sighash and signature combo. +func ecrecover(sighash []byte, sig []byte) common.Address { + sig[64] -= 27 + defer func() { sig[64] += 27 }() + + signer, err := crypto.SigToPub(sighash, sig) + if err != nil { + utils.Fatalf("Failed to recover sender from signature %x: %v", sig, err) + } + return crypto.PubkeyToAddress(*signer) +} + +// publish registers the specified checkpoint which generated by connected node +// with a authorised private key. +func publish(ctx *cli.Context) error { + // Print the checkpoint oracle's current status to make sure we're interacting + // with the correct network and contract. + status(ctx) + + // Gather the signatures from the CLI + var sigs [][]byte + for _, sig := range strings.Split(ctx.String(signaturesFlag.Name), ",") { + trimmed := strings.TrimPrefix(strings.TrimSpace(sig), "0x") + if len(trimmed) != 130 { + utils.Fatalf("Invalid signature in --signature: '%s'", trimmed) + } else { + sigs = append(sigs, common.Hex2Bytes(trimmed)) + } + } + // Retrieve the checkpoint we want to sign to sort the signatures + var ( + client = newRPCClient(ctx.GlobalString(nodeURLFlag.Name)) + addr, oracle = newContract(client) + checkpoint = getCheckpoint(ctx, client) + sighash = sighash(checkpoint.SectionIndex, addr, checkpoint.Hash()) + ) + for i := 0; i < len(sigs); i++ { + for j := i + 1; j < len(sigs); j++ { + signerA := ecrecover(sighash, sigs[i]) + signerB := ecrecover(sighash, sigs[j]) + if bytes.Compare(signerA.Bytes(), signerB.Bytes()) > 0 { + sigs[i], sigs[j] = sigs[j], sigs[i] + } + } + } + // Retrieve recent header info to protect replay attack + reqCtx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second) + defer cancelFn() + + head, err := ethclient.NewClient(client).HeaderByNumber(reqCtx, nil) + if err != nil { + return err + } + num := head.Number.Uint64() + recent, err := ethclient.NewClient(client).HeaderByNumber(reqCtx, big.NewInt(int64(num-128))) + if err != nil { + return err + } + // Print a summary of the operation that's going to be performed + fmt.Printf("Publishing %d => %s:\n\n", checkpoint.SectionIndex, checkpoint.Hash().Hex()) + for i, sig := range sigs { + fmt.Printf("Signer %d => %s\n", i+1, ecrecover(sighash, sig).Hex()) + } + fmt.Println() + fmt.Printf("Sentry number => %d\nSentry hash => %s\n", recent.Number, recent.Hash().Hex()) + + // Publish the checkpoint into the oracle + fmt.Println("Sending publish request to Clef...") + tx, err := oracle.RegisterCheckpoint(newClefSigner(ctx), checkpoint.SectionIndex, checkpoint.Hash().Bytes(), recent.Number, recent.Hash(), sigs) + if err != nil { + utils.Fatalf("Register contract failed %v", err) + } + log.Info("Successfully registered checkpoint", "tx", tx.Hash().Hex()) + return nil +} diff --git a/cmd/checkpoint-admin/main.go b/cmd/checkpoint-admin/main.go new file mode 100644 index 000000000000..26d751dd81a6 --- /dev/null +++ b/cmd/checkpoint-admin/main.go @@ -0,0 +1,117 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +// checkpoint-admin is a utility that can be used to query checkpoint information +// and register stable checkpoints into an oracle contract. +package main + +import ( + "fmt" + "os" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common/fdlimit" + "github.com/ethereum/go-ethereum/log" + "gopkg.in/urfave/cli.v1" +) + +const ( + commandHelperTemplate = `{{.Name}}{{if .Subcommands}} command{{end}}{{if .Flags}} [command options]{{end}} [arguments...] +{{if .Description}}{{.Description}} +{{end}}{{if .Subcommands}} +SUBCOMMANDS: + {{range .Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} + {{end}}{{end}}{{if .Flags}} +OPTIONS: +{{range $.Flags}}{{"\t"}}{{.}} +{{end}} +{{end}}` +) + +var ( + // Git SHA1 commit hash of the release (set via linker flags) + gitCommit = "" + gitDate = "" +) + +var app *cli.App + +func init() { + app = utils.NewApp(gitCommit, gitDate, "ethereum checkpoint helper tool") + app.Commands = []cli.Command{ + commandStatus, + commandDeploy, + commandSign, + commandPublish, + } + app.Flags = []cli.Flag{ + oracleFlag, + nodeURLFlag, + } + cli.CommandHelpTemplate = commandHelperTemplate +} + +// Commonly used command line flags. +var ( + indexFlag = cli.Int64Flag{ + Name: "index", + Usage: "Checkpoint index (query latest from remote node if not specified)", + } + hashFlag = cli.StringFlag{ + Name: "hash", + Usage: "Checkpoint hash (query latest from remote node if not specified)", + } + oracleFlag = cli.StringFlag{ + Name: "oracle", + Usage: "Checkpoint oracle address (query from remote node if not specified)", + } + thresholdFlag = cli.Int64Flag{ + Name: "threshold", + Usage: "Minimal number of signatures required to approve a checkpoint", + } + nodeURLFlag = cli.StringFlag{ + Name: "rpc", + Value: "http://localhost:8545", + Usage: "The rpc endpoint of a local or remote geth node", + } + clefURLFlag = cli.StringFlag{ + Name: "clef", + Value: "http://localhost:8550", + Usage: "The rpc endpoint of clef", + } + signerFlag = cli.StringFlag{ + Name: "signer", + Usage: "Signer address for clef signing", + } + signersFlag = cli.StringFlag{ + Name: "signers", + Usage: "Comma separated accounts of trusted checkpoint signers", + } + signaturesFlag = cli.StringFlag{ + Name: "signatures", + Usage: "Comma separated checkpoint signatures to submit", + } +) + +func main() { + log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) + fdlimit.Raise(2048) + + if err := app.Run(os.Args); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/cmd/checkpoint-admin/status.go b/cmd/checkpoint-admin/status.go new file mode 100644 index 000000000000..f613501eb35d --- /dev/null +++ b/cmd/checkpoint-admin/status.go @@ -0,0 +1,61 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "gopkg.in/urfave/cli.v1" +) + +var commandStatus = cli.Command{ + Name: "status", + Usage: "Fetches the signers and checkpoint status of the oracle contract", + Flags: []cli.Flag{ + nodeURLFlag, + }, + Action: utils.MigrateFlags(status), +} + +// status fetches the admin list of specified registrar contract. +func status(ctx *cli.Context) error { + // Create a wrapper around the checkpoint oracle contract + addr, oracle := newContract(newRPCClient(ctx.GlobalString(nodeURLFlag.Name))) + fmt.Printf("Oracle => %s\n", addr.Hex()) + fmt.Println() + + // Retrieve the list of authorized signers (admins) + admins, err := oracle.Contract().GetAllAdmin(nil) + if err != nil { + return err + } + for i, admin := range admins { + fmt.Printf("Admin %d => %s\n", i+1, admin.Hex()) + } + fmt.Println() + + // Retrieve the latest checkpoint + index, checkpoint, height, err := oracle.Contract().GetLatestCheckpoint(nil) + if err != nil { + return err + } + fmt.Printf("Checkpoint (published at #%d) %d => %s\n", height, index, common.Hash(checkpoint).Hex()) + + return nil +} diff --git a/cmd/clef/4byte.json b/cmd/clef/4byte.json deleted file mode 100644 index 5603d5931d78..000000000000 --- a/cmd/clef/4byte.json +++ /dev/null @@ -1 +0,0 @@ -{"0x22ec1244": "shaBid(bytes32,address,uint256,bytes32)", "0xcae9ca51": "approveAndCall(address,uint256,bytes)", "0x4fb2e45d": "transferOwner(address)", "0x7741b4ec": "RandomNumberFromSeed(uint256)", "0x267127ec": "getTokenSettings()", "0xb7213bd4": "readLog(uint256)", "0x3018205f": "getController()", "0xc8edf65e": "GetAndReduceFeesByFraction(uint256)", "0xeec2b628": "beforeExecute(address)", "0xfc0c546a": "token()", "0x40a3d246": "toggle()", "0x70983e91": "startBoardProposal(uint256,address)", "0x6b5caec4": "setBot(address)", "0x78524b2e": "halveMinQuorum()", "0x2c60a055": "MapTest()", "0xc2fb8f36": "TinyHuman(address,address,address)", "0x6822abae": "getMinimumCallCost(uint256)", "0x6f9fb98a": "getContractBalance()", "0x5c17f9f4": "approve(address,uint256,bytes)", "0x504ac982": "transfer(string,string)", "0x06e53f47": "whichChainIsThis()", "0xf359671c": "withdrawWithReference(address,uint256,string)", "0xf97d0591": "parseTimestamp(uint256)", "0xd3c0715b": "vote(uint256,bool,string)", "0x6b069710": "scheduleCall(address,bytes,uint256,uint256,uint8)", "0x37ae43a3": "BetOnHashV81()", "0xab519020": "calcShare(uint256,uint256)", "0x6572ae13": "calculateWinner(uint256,uint256)", "0x6aaba012": "ErrorGenerator()", "0xfe05e8b1": "assertFact(uint256,string)", "0x6e940a29": "changeHost(address)", "0x669ee827": "RegisterDevice()", "0x6f4dd69c": "testSetBalanceUpdatesSupply()", "0x4401a6e4": "safeSend(address)", "0x27dc297e": "__callback(bytes32,string)", "0xe4dedc7f": "DeleteContract()", "0x7fef036e": "totalEntries()", "0x64325ddb": "currentClaimPrice()", "0x2fc0aad3": "isNumericString(string)", "0xbc45d789": "setConfigUint(int256,bytes32,uint256)", "0xee95feaf": "isSeller(address)", "0x358d5dc2": "getIsCashed(uint256,uint256)", "0x1397fdbd": "getShares(address,bytes,int256[])", "0x2d8c1c35": "level_up()", "0x24600fc3": "withdrawFunds()", "0x05f8b6f5": "_rewireIdentities(bytes32[],uint256,uint256,uint32)", "0x1840f0ca": "countVotes(uint256)", "0xd44aadf7": "initROS()", "0xca1d209d": "fund(uint256)", "0x5fa513d5": "findPtr(uint256,uint256,uint256,uint256)", "0x3c314a91": "playerGetPendingTxByAddress(address)", "0xd5582205": "getCertifiedStudentAtIndex(uint256)", "0xe45ebe93": "checkVoteStatus()", "0xcd9380d5": "testSetBalanceSetsSupplyCumulatively()", "0x637e86eb": "totBOTs()", "0x5bb47808": "setFactory(address)", "0x674cc1f5": "getMarketHashes(bytes32[])", "0x648bf774": "recover(address,address)", "0x0221038a": "payOut(address,uint256)", "0x4016535a": "parseBlock(bytes,uint256)", "0xa3908e1b": "convert(uint256)", "0xd9e7ee1c": "new_game(uint256,uint256)", "0x929e626e": "getShareDistribution(bytes32)", "0xa20495d3": "Managed()", "0xd409ddda": "EtherizationUtils()", "0xcb2b9031": "addressToBytes(address,address)", "0xfff3c457": "readMessages(uint256)", "0x043753ba": "makeDecision(uint256,bool)", "0x85b4bb53": "getSettings()", "0x60726abb": "copy()", "0xe50d0473": "SetRank(uint8,address,uint16)", "0x54ae8492": "CustodialForward()", "0xd6d02c51": "whois(string)", "0xcb712535": "_transferFrom(address,address,uint256)", "0xb152f19e": "getFirstSchedulableBlock()", "0x9334ab61": "Infos()", "0x88a49164": "testErrorUnauthorizedTransfer()", "0x17db59a4": "dEthereumlotteryNet(address,address,address)", "0xf85aefba": "testBitsSetFailIndexOOB()", "0xae99847b": "daylimit(uint256)", "0xd93e7573": "disown(bytes32)", "0xa5468081": "Pyramid(address)", "0x00e7d289": "registerListening(address)", "0x57ee24af": "getNum(bytes32,uint256)", "0xdaea85c5": "approve(address)", "0x36ffa905": "getMyProposals()", "0x7143059f": "getParticipant(address)", "0x55ff440a": "castStringToUInt(string)", "0x6a4a6b6e": "_myAddressHelper()", "0xb67fabdf": "scheduleTransaction(address,uint256,uint256,bytes)", "0xbcca1fd3": "changeVotingRules(uint256,uint256,int256)", "0x1d3390a1": "carefulSendWithFixedGas(address,uint256,uint256)", "0x45104b16": "EXECUTION_GAS_OVERHEAD()", "0xa26759cb": "addFunds()", "0x232523e8": "forceDivestOfAllInvestors()", "0x7e904a48": "getNumContents(uint256)", "0xb69c0896": "BaseScheduler(address,address,uint256)", "0xc6ed8e1b": "getApprovedProxys()", "0x4d1f8c31": "owner(uint64)", "0x17c65aa7": "getMaxLossAfterTrade(address,uint256,int256,int256)", "0x2c02d622": "precalculate()", "0xa035b1fe": "price()", "0x43b0e8df": "set(uint256,uint256,uint256)", "0x9b5fde7d": "payOut(uint256,string)", "0x89fcd099": "getApproval(address,address)", "0x4c0eceb5": "plusOnePonzi()", "0x880cdc31": "updateOwner(address)", "0xdab80d6f": "addSponsor(address)", "0x0fcda174": "getAccountTokenBalance(address,address)", "0xa55cab95": "getName(uint8,uint8)", "0x934db458": "Big()", "0xeb782d8c": "ContentSeries(address)", "0xdbfef710": "getDefaultRequiredGas()", "0x4f09eba7": "proxyApprove(address,uint256,bytes32)", "0xf4c5ab7c": "validateCallGas(uint256,uint256)", "0x376fe102": "userId(address)", "0x922dd59a": "icapTransfer(bytes,address,bytes,uint256)", "0x7318b453": "setVotetUntil(uint8)", "0xb8c86aa6": "getArraySettingResult()", "0x37bdc99b": "release(uint256)", "0x7cbcc254": "__reset__()", "0x37664643": "retractLatestRevision(bytes32)", "0x4b031d0f": "shortSellShares(bytes,uint8,uint256,uint256)", "0xad8d5f48": "exec(address,bytes,uint256)", "0x2f95b833": "requiredStackDepth()", "0xe3848e5b": "thing(string,string,string)", "0xaa272d4b": "getNodeIndexId(bytes)", "0xd7f746ce": "tickingBomb()", "0x3b84edbd": "setRNG(address)", "0x1fb2f2a0": "testUpdateLatestRevision()", "0xb7fba4d3": "getProxy(address)", "0x4b8e1ba8": "isMinter(int256,address)", "0xba4c206e": "removeCertificationDocumentInternal(address,bytes32)", "0x884b5dc2": "fill(uint256[])", "0x88017e05": "setContribution(uint256)", "0x1ff517ff": "totalDebt(address)", "0xd0315658": "getShareDistributionWithTimestamp(bytes)", "0x7d03f5f3": "newGame()", "0xb7538f3e": "ChangeClient(address)", "0xbf4d89b5": "parseInt(string,uint256)", "0x7b55c8b5": "scheduleCall(address,bytes4,bytes,uint8,uint256[4])", "0x350d141e": "getWasApprovedBeforeDeadline()", "0x27960c5f": "validateEndowment(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0xb774d3d7": "BankOwner_GetDonationsBalance()", "0x267b6922": "entries(bytes32)", "0x08b7c13b": "getExists(bytes20)", "0x7e7a2fbf": "contribute_toTheGame()", "0x5b86914d": "bet_value()", "0x0e1087c3": "getMarketMakerFunds()", "0xf7149220": "RNG()", "0x345006b6": "getGenerationForCall(address)", "0xc4b14e0b": "getSignature(bytes32)", "0x419945f8": "ExpiringMarket(uint256)", "0x41868769": "CallAborted(address,bytes)", "0x29092d0e": "remove(address)", "0x746c9171": "m_required()", "0x5020dcf4": "convertToEach(uint256,string,uint256)", "0xa06db7dc": "gracePeriod()", "0xbf8fc670": "sendToAggregation(uint256)", "0xf14fcbc8": "commit(bytes32)", "0xa538d287": "getMinMax()", "0xcae523c1": "testOwnedTryAuthUnauthorized()", "0x04d10f1c": "isValidChainyJson(string)", "0x9ba5b4e9": "getEventHashes(bytes32[])", "0xfedfd535": "Config()", "0x42ce0f30": "testThrowUpdateLatestRevisionNotOwner()", "0x31be6985": "testBitXorSuccess()", "0x173cb7de": "getNumReleasesForNameHash(bytes32)", "0xd90a88cd": "getContentReplies(uint256,uint256)", "0x92eefe9b": "setController(address)", "0x052b81c7": "releaseBadges()", "0xb2855b4f": "setFeeAddr(address)", "0x19a9c2f1": "generateId(string)", "0xfa9acb05": "addressInArray(address,address)", "0x3da5c3ce": "puzzle(address,bytes32)", "0x7a427d98": "forceReturn()", "0x70e71ea3": "etherandomSeedWithGasLimit(uint256)", "0xd7a58658": "changeHouseedge(uint8)", "0x72b75585": "getOriginalClient()", "0xf802075f": "requiredEndowment()", "0x7997b997": "doMelt(uint256,uint256)", "0x6d5433e6": "max(uint256,uint256)", "0xb651cbaf": "add_level(address,bytes)", "0xb4d6d4c7": "getPackageData(bytes32)", "0x90e3c278": "getShares(uint256[128])", "0x179b73da": "killBoardProposal(uint256,address)", "0xc944a38e": "CharlyLifeLog(string,int256)", "0xe1c66292": "Create(uint32,address)", "0x69c8b344": "ownedToken(address)", "0xabcf1328": "InterestBank()", "0x532e7e6a": "calcEarningsSelling(bytes,uint256,uint256[],uint8,uint256)", "0x43d24a5e": "addUpdater(address)", "0xd1feca67": "addSpendingRequest(address)", "0x2d34ba79": "setup(address,address)", "0xcb14d93b": "getHash(bytes,address,uint256)", "0x309424fe": "get_all_names()", "0x96c52fc3": "____forward(address,uint256,uint256,bytes)", "0xde39acea": "get32(bytes,uint256)", "0xf3dd3d8a": "newCurrency(string,string,uint8)", "0x2432eb23": "testThrowRetractLatestRevisionNotUpdatable()", "0x7fcf3a2f": "throwFooBar()", "0xabe9f569": "oraclize_getPrice(string,uint256)", "0x41ee903e": "clear(uint256,uint256)", "0xd249a52e": "update(bytes,uint256[],uint256[])", "0xc3d014d6": "setContent(bytes32,bytes32)", "0x3ac5cb73": "GeometricPonzi()", "0x4a1aa767": "claim_victory(uint256,uint8,uint8,uint8)", "0xce592586": "setThresold(uint256,uint256)", "0x63deb2c5": "changeMemberAddress(address)", "0x2e6e504a": "trusteeWithdraw()", "0xcfed9199": "timePassed(uint256)", "0xb782fc9b": "getFirstActiveDuel2()", "0x35b28153": "addAuthorization(address)", "0x46f7a883": "BuyTicket(uint8,uint8,uint8)", "0x83c51a38": "thesimplegame()", "0xfa28ba0d": "validateReleaseLockfileURI(string)", "0xa7b2d4cb": "remove(int256,address)", "0x010731c0": "sendCryptedHand(bytes32)", "0xe9e99d81": "getChannelFeed(address,uint256,uint256,uint256)", "0x4e30a66c": "safeToAdd(uint256,uint256)", "0x2c4e591b": "totalGames()", "0xa3221c8e": "step8()", "0x783ce458": "expmod(uint256,uint256,uint256)", "0xe417291b": "undelegateDAOTokens(uint256)", "0x8e5d97a2": "releasePendingTransfer(uint256)", "0xbc5ff5e1": "oraclize_query(string,string[4],uint256)", "0x38f77d69": "getDistributeProfitsInfo()", "0xbb510a77": "createChannel(address,uint256)", "0x650955d4": "HashToken()", "0xa8484938": "doApprove(address,uint256)", "0x64ed31fe": "authVotes(address)", "0xf7ae9421": "checkInvestorBalance(address)", "0xba904eed": "removeRegistrar(address)", "0xdce4a447": "at(address)", "0xdb4cacec": "Other()", "0x3647b87a": "buildFactory()", "0xa51aea2d": "changeMaxMultiplier(uint256)", "0x4974bc27": "download()", "0xf8a8fd6d": "test()", "0xd8c90762": "addTrustedIssuer(address,string)", "0xdf6c13c3": "getMinFunding()", "0x867904b4": "issue(address,uint256)", "0x1531c267": "fipsRegisterMulti(uint256,address,bytes)", "0x40a49a96": "searchSmallestInvestor()", "0x61bffe01": "addIdentities(bytes32[],bytes32[])", "0xf77a0923": "BitcoinProcessor(address)", "0xd02528e6": "GetGameIndexesToProcess()", "0x9f927be7": "getNextCall(uint256)", "0xd8162db7": "lockedUntilBlock()", "0x36dfe260": "payOneTimeReward()", "0xc5b1a53c": "deposit(bytes16[],uint64)", "0xc2b6b58c": "isClosed()", "0xc88cc6ac": "getCertification(address)", "0x77ac3da5": "oraclize_query(uint256,string,string[1],uint256)", "0x70ab8ba8": "creditUpdate()", "0xd3ea3322": "testBuildTokenSystemCost()", "0x72388610": "paybackAll()", "0xca6d56dc": "addMember(address)", "0x0994a0a0": "DSTokenTest()", "0xe53e04a5": "refillGas()", "0xc1d5e84f": "addNewUser(address)", "0x89ed0b30": "setOraclizeGas(uint32)", "0x02ba8742": "sendCoins(address,uint256)", "0xb0de1cb7": "publish(uint64,bytes,uint64)", "0x0e13b9af": "getValue(uint8,uint8)", "0xb3dfcdc3": "Contribution(uint256)", "0xa9b35240": "packageExists(bytes32)", "0xd1d3bb92": "testSetPkg()", "0x97297467": "checkAndVerify(bytes)", "0xe31bfa00": "next_id()", "0x9948e493": "calcMarketFee(bytes,uint256)", "0xd148288f": "setHoldingPeriod(uint256)", "0xc032dc30": "execute(uint256,address)", "0xdad99989": "burnCoins(address)", "0xb1999937": "leapYearsBefore(uint256)", "0xa6cbcdd5": "numSignatures(bytes4)", "0xaca66aec": "DVIP()", "0x20bf0c52": "Derived(uint256)", "0x693ec85e": "get(string)", "0x0411bca8": "getChallengeAnswerResult(uint256)", "0x61584936": "sealedBids(bytes32)", "0x2f1927cb": "prepareRoll(uint256,uint256,uint256)", "0xeaa1f9fe": "reqisterListening(address)", "0xb623f5e5": "checkSetCosignerAddress(address)", "0xa88c5ef7": "NextPayout()", "0x66ad484c": "newfirst_player(address)", "0xb4022950": "collectFeesInEther(uint256)", "0xbff0fbb8": "calculateMeat(uint256)", "0xd62b255b": "setOwner(address,string)", "0x2fd6d40b": "getBetValueByGamble(uint8)", "0x3b0506f7": "getVoteByAddress(address,uint256)", "0xbddd3a6b": "step7()", "0x67fbd289": "destroyTokens(uint256)", "0x9844347b": "createCertificate(bytes,bytes,uint256,bytes)", "0x5e68ac2c": "Kingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)", "0x8ba9f354": "testClearBitSuccess()", "0x48027610": "transferPaidOut(address,address,uint256)", "0x912de8de": "fixBalance()", "0x04509918": "scheduleCall(address)", "0x7cf0ffcb": "forceDivestAll()", "0x3b3b57de": "addr(bytes32)", "0xeb7c6f72": "step6()", "0xfe6f0d82": "testConstructorEvent()", "0x55b62dcf": "getThresold(uint256)", "0xfbae5e7d": "Investors(uint256)", "0x29e206bd": "forceDivestAll(bool)", "0x6a226a49": "addMessage(string)", "0x8e2a6470": "allocateShares(address,uint256)", "0xe6e7237f": "claim_time_victory(uint256)", "0x17a601b5": "MAX_STACK_DEPTH_REQUIREMENT()", "0x87fd0421": "TheEthereumLottery()", "0xc17e6817": "sendSafe(address,uint256)", "0xa5dfee67": "testThrowsCreateNewRevisionNotUpdatable()", "0xb35893f3": "setExporter()", "0x1ceea715": "GetMyInvestFee()", "0xb78bd4a5": "breakCookie(string)", "0x05215b2f": "createStandardToken(uint256)", "0x2632bf20": "unblockMe()", "0x5292af1f": "sendBalance(address)", "0xc2e9fab3": "SubUser()", "0x6493d7fc": "CircuitBreaker(address,address,uint256,uint256)", "0x4f896d4f": "resolve(uint256)", "0x16870257": "getTileDescription(uint8,uint8)", "0x3ef87414": "getRevisionCount(bytes20)", "0x747586b8": "setInt(int256)", "0x5714f6a1": "getTotalAvailableRelays()", "0x99154b49": "ARK()", "0x1efb17ee": "changeHouseAddress(address)", "0x354d7e40": "Payout()", "0x2da0d1ea": "etherSold()", "0xea46193e": "getEtherBalance()", "0x11fe773d": "memcpy(uint256,uint256,uint256)", "0x1e701780": "MICRODAO(address,uint256,uint256,uint256,address)", "0x1c31f710": "setBeneficiary(address)", "0x0a4caed0": "getChannelByRank(address,uint256)", "0xf3125a1f": "deposit(address,uint256,bytes,uint256)", "0x00e46700": "setMinimumPassPercentage(uint8)", "0x92d282c1": "Send()", "0x89d59ee5": "createPersonalDepositAddress()", "0xbe1c766b": "getLength()", "0x70a08231": "balanceOf(address)", "0xae0a6b28": "signature(string,bytes32)", "0xb3485dca": "UpdatePrice(uint8,uint32)", "0xf8ec4bf2": "setAllowTransactions(bool)", "0x53d97e65": "setPrizes(uint32[])", "0xd1b1a22b": "set(string,uint256[],uint256[],uint256[],bool[],uint256[])", "0x96286cc9": "isTokenOwner(address)", "0x154af6b1": "sendShares(uint256,uint8,uint256,address)", "0xbe2430fe": "sendValues()", "0x57a373a1": "uintInArray(uint256,uint256,int256,uint256[],uint256)", "0x8fd28bcf": "testFailAuthorityAuth()", "0x89ef40e7": "numberOfHealthyGenerations()", "0x23e9c216": "setBounty(address,string,uint256)", "0x71dd99fe": "BigRisk()", "0x1e9fcc77": "activateAllowance(address,address)", "0x561e91a1": "makeBet()", "0x32d2fb9f": "getRefRemainingTime(uint256)", "0x992c870d": "transferName(bytes,address)", "0x6b3fdc5a": "oraclize_setNetwork(uint8)", "0x2ea459b8": "claimThrone(bytes)", "0x33a99e04": "selectWinner()", "0x3b49a77b": "hasConfirmed(bytes,address)", "0xa352f1a8": "calcSHA3(bytes)", "0x4bb4b260": "cashAllOut()", "0xb89a73cb": "isShareholder(address)", "0xba5a2d33": "exitPool(address)", "0xddd41ef6": "transferDirector(address)", "0xa06cab79": "Registrar(address,bytes32)", "0x871113c3": "oraclize_query(string,string[1],uint256)", "0x1f0f711f": "discontinue()", "0x632f0ba6": "descriptionHashes(bytes)", "0x980e8c81": "FutureBlockCall(address,uint256,uint8,address,bytes,uint256,uint256,uint256)", "0x4ae8c55f": "getWwLength()", "0x82fc49b8": "setCosignerAddress(address)", "0xc4bd8ebc": "num_monsters()", "0x0381cb3b": "setRowcol(uint256,uint256[2])", "0x124eaee6": "Identity()", "0x3f4be889": "callContractAddress()", "0xef3a6031": "testBaseToken()", "0x954ab4b2": "say()", "0x1b855044": "getHash(uint256,uint256)", "0xd9d73887": "Diana()", "0x5103a5a3": "certify(address,bytes32)", "0x51560da9": "topDogInfo()", "0xf3ee6305": "removeCertificationDocument(address,bytes32)", "0x049ae734": "scheduleCall(address,bytes4,uint256,uint256,uint8)", "0xd8a8e03a": "move(uint256,address)", "0xc3c5a547": "isRegistered(address)", "0x06005754": "nameRegAddress()", "0xbe592488": "validateName(bytes)", "0x0eecae21": "draw()", "0xac3e7d24": "addChainyData(string)", "0xfd83f3e3": "QueueUserMayBeDeliveryDroneCotnrol()", "0x7772a380": "isInGeneration(address,uint256)", "0xeb1ff845": "changeId(uint256,uint256,uint256)", "0x9cc9299e": "killSwap()", "0x1e2ca0f3": "updateLeftLottery(address)", "0x998446a8": "acceptRequest(uint256,bytes)", "0x8e1ffb19": "testThrowsRetractLatestRevisionEnforceRevisions()", "0x9935935f": "setResolveHandler(bytes,address)", "0xcd4b6914": "getRandom(uint256)", "0xc08dd1dc": "IOU(string,string,uint8)", "0xbe4054b9": "commitReading(address,uint256,uint256,string)", "0xbc21ce9d": "Aggregation()", "0x6e173a7f": "storeBlockHeader(bytes,bytes)", "0x114d69b2": "setCRLaddr(address)", "0x3fa4f245": "value()", "0x69573648": "remove(bytes,bytes)", "0x7fee4ecb": "GAS_PER_DEPTH()", "0x591c515f": "append(string,string)", "0x727b1cd6": "next_draw(bytes32,uint256,uint256,uint256,uint256,uint256)", "0xc60ce271": "findNextMinute(uint256,bytes)", "0xd337616e": "resetLottery()", "0xdacaeb07": "pledge(bool,uint256)", "0xb29c2493": "token(uint256,string,uint8,string)", "0x61047ff4": "fibonacci(uint256)", "0x8f367001": "numTokensAbleToPurchase()", "0x12cc08f2": "getPackageReleaseHashes(string,uint256,uint256)", "0x67a59d91": "scheduleCall(address,bytes,bytes,uint256,uint256,uint8)", "0xe6c3b4ab": "testBalanceAuth()", "0xd526b9bd": "_allow()", "0x29de91db": "setMsg(address,uint256)", "0xd1cf113e": "multiAccessSetRecipient(address)", "0xc2412676": "Token()", "0x391f2e96": "InvestCancel()", "0xc0ae6a3a": "ultimateOutcomes(bytes)", "0x202d6eaf": "addInvestorsValue(uint256)", "0x30b9af98": "withdrawFunding()", "0xe80bd3e5": "addCertificationDocumentToSelf(bytes32)", "0xf4e36afd": "findThroneByNameHash(uint256)", "0x30677b83": "multiplierFactor()", "0x590528a9": "sellShares(uint256,uint8,uint256,uint256)", "0x01cceb38": "setExpiry(uint256)", "0x779beca0": "getNumOfSalesWithSameId(bytes)", "0xac940823": "betOnLowHigh(bool)", "0x06961560": "DAO(address,uint256,uint256,uint256,address)", "0xd42bf301": "doTriggerTryAuth()", "0xfa566ddd": "doAllowance(address,address)", "0x6677febe": "get_all_accepted()", "0xaa67c919": "depositFor(address)", "0xf28386bf": "Nexium()", "0x77e4fb04": "testFailNotEnoughValue()", "0x12b58349": "getTotalBalance()", "0xc0d2834b": "DataSource()", "0x3e82055a": "addSignature(uint256,bytes16,bytes)", "0xcff2fa42": "_returnFee(address,uint256)", "0xa056469a": "extractFeeLength()", "0xc98031be": "hintURL(int256,bytes32,string)", "0x6ebbe863": "updatePublishContract(address)", "0x08216c0f": "createHumanStandardToken(uint256,string,uint8,string)", "0xc36af460": "getLatest()", "0xdb5b4183": "oracleOutcomes(bytes,address)", "0x0b5ab3d5": "destroyDeed()", "0xe1c7392a": "init()", "0x4ca1fad8": "addRequest(uint256)", "0x305b73d9": "configure(address,address,uint256,uint8,bytes32,bytes32)", "0x9077dcfd": "submitCoding(string,uint256)", "0x38fff2d0": "getPoolId()", "0x07bc6fad": "withdraw(address,uint256,bytes32,uint256)", "0xfbf58b3e": "transfer(string,address)", "0x1d8b70da": "order_received(string)", "0x0b3ed536": "claimDonations(uint256)", "0x6f374a12": "setBool()", "0x0ca35682": "recover(uint256)", "0x3ae7cdfa": "fipsLegacyRegister(bytes20[],address)", "0xe6c1beb4": "prepend(address)", "0x776d62f6": "costs()", "0xe4690a0b": "popRequest()", "0x74eb9b68": "isAccountLocked(address)", "0x7d32e7bd": "transfer(address,bytes32)", "0xdf2f0a4a": "getDecisionBlockNumber(uint256,uint256)", "0xc494f71a": "LedgerFund(uint32,uint32,uint64,uint64)", "0x446d5aa4": "getAttributes(address)", "0x4cdc6a73": "Marriage()", "0x677cee54": "SafeConditionalHFTransfer()", "0x7b48ba20": "testThrowDisownNotOwner()", "0x1288c42a": "Prism()", "0xe8b13c44": "getChainyTimestamp(string)", "0xe4c2db06": "getPreviousFile(bytes)", "0xf0586f0d": "doThrow(bool)", "0xc1b06513": "registerEvent(bytes32[])", "0x521eb273": "wallet()", "0x32254992": "getPrevHash(int256)", "0x1fd96b69": "ManagedAccount(address,bool)", "0xabf74a93": "pitFee()", "0xa480ca79": "collectFees(address)", "0xa0bde7e8": "getShareDistributionWithTimestamp(bytes32)", "0xff27c476": "shiftBitsRight(bytes,uint256)", "0x172d8a30": "setDirectorLock(uint256,uint256)", "0xf262de8c": "add_staircase(uint16)", "0x990f3f53": "computeResponseSecondHalf(uint256,uint16)", "0x26745909": "PRNG_Challenge()", "0xcacc24eb": "transferFromViaProxy(address,address,address,uint256)", "0x94f3f81d": "removeAuthorization(address)", "0x3f0ec70b": "RequestFactory(address)", "0xa2a8336f": "claimEtherSigner(uint256)", "0xaa5d4719": "getTransferable(bytes20)", "0x23cd7cd5": "Model()", "0x3fb0b2c9": "CancelRoundAndRefundAll()", "0xd5fa2b00": "setAddr(bytes32,address)", "0xa0f61310": "FakeRelay(bytes)", "0x4ea66c38": "buyinInternal(address,uint256)", "0xbe040fb0": "redeem()", "0xb845c9a2": "WEI()", "0x26a7985a": "getMaximumCallGas()", "0x06661abd": "count()", "0xc89f8f08": "testGetController()", "0x81baf820": "BlockScheduler(address)", "0x9801cb8e": "ProofOfExistence()", "0xeb7492d1": "testTotalSupply()", "0x3dfb4843": "renewDeed(bytes32)", "0xc3fa5f93": "BlockScheduler(address,address)", "0x7958533a": "meta(uint256,bytes32)", "0xa1a66e56": "deductFunds(uint256)", "0xaf92a693": "addRegistrar(address)", "0xb2aac51f": "lookupUser(string)", "0xd70cf105": "moveBalance(address,address,uint256)", "0x2afb21bc": "InvestWithdraw()", "0x6d09e2ec": "commitCurrency(address,uint256,uint256)", "0x7b1a4909": "transferETH(address,uint256)", "0x96c824a8": "createAccountFundContract()", "0xe0a70811": "restart(bytes20,bytes)", "0x22057bc7": "getAllRevisionBlockNumbers(bytes20)", "0x6af2da2f": "testKeyedHash()", "0x7f6d8955": "RegisterOne(uint32,address,address)", "0x65f27bea": "testSubBalanceFailsBelowZero()", "0xa2f16d80": "dexWithdrawCollectedFees()", "0xc179520c": "ManageAccount()", "0x2672b3e2": "SplitterEtcToEth()", "0xe839e65e": "query2(string,string,string)", "0x39f64b52": "calcTokenPrice()", "0x4ef5710a": "WatchNumberOfPlayerInCurrentRound()", "0x3017fe24": "callAPIVersion()", "0x2977b1b1": "testAllowanceStartsAtZero()", "0x531c1b33": "getOperatingBudget()", "0xb7f2f33c": "transferRightIfApproved(address,bytes)", "0x00873367": "comparisonchr(string)", "0x2a0d79ef": "totalSupply(bytes)", "0xa715ff59": "EtherandomProxy()", "0xd6ca8ccb": "disown(bytes20)", "0x6ad2a0b3": "buildContract(address)", "0x45596e2e": "setFeeRate(uint256)", "0x0e97cfdf": "placeOrder(uint256,uint256,uint256)", "0x9549355e": "oracalizeReading(uint256)", "0x8d7af473": "numberOfProposals()", "0x728af7ec": "getInterest(uint256,uint256)", "0x11b9fee8": "ForkChecker(uint256,bytes32)", "0xd850288b": "etherlist_top()", "0xf4dc2d21": "Deed(uint256)", "0xf8b11853": "getGenerationStartAt(uint256)", "0x7c7a52bf": "newChallenge(uint256,address)", "0xd2d4bd72": "getCrossRate(bytes,bytes)", "0xe9b93569": "OwnerGetFee()", "0xfb72d24e": "shift_right(uint64,uint256)", "0x112e39a8": "scheduleCall(uint256)", "0x6c494843": "multiAccessChangeOwnerD(address,address,address)", "0x313ce567": "decimals()", "0x9bac8602": "testFailAddBalanceAboveOverflow()", "0xa70a9ad7": "switchDeity(address)", "0x6a61e5fc": "setTokenPrice(uint256)", "0x990c8f79": "returnValue()", "0xa4136862": "setGreeting(string)", "0x0af4626d": "testRetract()", "0x5e11544b": "newPeriod()", "0xdc206e5f": "oraclize_query(uint256,string,string[])", "0xcaa648b4": "getTotalValue()", "0x20bfec70": "WatchFees()", "0x62a0b56b": "testUnset()", "0x42f6e389": "isModule(address)", "0x769796fe": "resetAction(uint256)", "0x402e6230": "getTotalGambles()", "0xe8a1c08f": "nibbleToChar(uint256)", "0x1aa3a008": "register()", "0x96d02099": "rsplit()", "0x83324e8c": "numGroups()", "0x72c7c85a": "minority()", "0xb8d94b95": "buildDSNullMap()", "0xe039e4a1": "getOwner(uint8,uint8)", "0x625cc465": "baseDonation()", "0x77372213": "setName(bytes32,string)", "0xa7dfc874": "unregister(bytes,address,uint256,bytes)", "0x37f4c00e": "anchorGasPrice()", "0xb2bfd948": "checkNumbers(uint8[3])", "0x512f1e64": "orderBookLength()", "0xafed762b": "toSlice(string)", "0xbb6a1427": "testThrowRestartEnforceRevisions()", "0x734d8287": "unclaimedFees()", "0xf295206f": "_unsafeSend(address,uint256)", "0x69d01268": "concatUInt(uint256)", "0x0494630f": "oraclize_query(uint256,string,string[4],uint256)", "0x13fc6ac2": "getEventData(bytes32)", "0xbff974e8": "getContentReplies(uint256)", "0x18921de4": "addSignature(string,uint256[],uint256[],uint256[],bool[],uint256[])", "0xa87e7552": "isValid(bytes,bytes)", "0xb8d3bfe3": "MeatGrindersAssociation(address,address,uint256,uint256,uint256,address)", "0x61461954": "execute()", "0xecb0256b": "relayTx(bytes,int256,int256[],int256,int256,bytes,int256,int256[],int256,int256)", "0x7cdbae63": "addRegistryIntoTagsIndex(address)", "0x1f4e996b": "challenge(bool)", "0x0eb0afa6": "createDebt(address,address,uint256)", "0x5f6a1301": "clearPending()", "0x305a762a": "getTicketsCountByBuyer(uint256,address)", "0x724ae9d0": "getMinInvestment()", "0x1e39499d": "scheduleCall(address,bytes,uint256)", "0x4f197ee7": "transferPackageOwner(string,address)", "0x7e3faec1": "GoldTxFeePool(address,address,bytes)", "0x8d68cf59": "sendFunds()", "0x83eed3d5": "queryN(uint256,string,bytes)", "0x15c91115": "pbkdf2(bytes,bytes,uint256)", "0xeb121e2f": "update(uint256,uint256[101][])", "0x5e44daf3": "vote(uint256,int256)", "0xac562666": "freezeCoin()", "0xb0166b04": "testTransferringMkr()", "0x631de4d6": "replace(address,address)", "0x4bd70ea3": "testFailGetUnset()", "0xf738e5ca": "ownerTakeProfit()", "0xc6236a5c": "scheduleCall(bytes,uint256,uint256,uint8,uint256)", "0x119aa5c8": "checkForward(bytes)", "0x541aea0f": "put(uint256,uint256)", "0x6386c1c7": "getUserInfo(address)", "0x4e209678": "testFailBreach()", "0xe9fe799e": "registrantRemove(address)", "0x2aee19c7": "testCreateWithNonce()", "0xa0ec4e09": "getUltimateOutcomes(bytes32[])", "0x4d9e4e22": "Etheria()", "0xa6b513ee": "finalPrice()", "0x82f0d875": "makeHash()", "0x78ae88d1": "newDeal(uint256,uint256,uint256,uint256,uint256)", "0x177766e6": "getOptionChain(uint256)", "0xf1173928": "RemovedFromGeneration(address,uint256)", "0xea2ea847": "testChallengeFinalize()", "0xbd35d570": "GAS_TO_COMPLETE_EXECUTION()", "0x364ea9e7": "set(uint256,uint256,bool[],uint256[])", "0x17ff0caa": "WeatherBet(uint256,address,address,address)", "0x4e23a144": "fundUser(address,uint256)", "0x144267e0": "refundSecurity(address,uint256,uint256)", "0x31c6c4cf": "transferFromWithReference(address,address,uint256,bytes32,string)", "0x2eb5c61f": "testThrowsUpdateLatestRevisionEnforceRevisions()", "0xde640e19": "Investment(uint256)", "0x9cb8a26a": "selfDestruct()", "0x9c43d950": "registration(uint256,uint256,uint256)", "0xe2fdcc17": "escrow()", "0xc618d15f": "ConvertNumbers(bytes5)", "0x8c98117c": "getBill(uint256,uint256)", "0x2d7788db": "rejectRequest(uint256)", "0xfaab9d39": "setRegistrar(address)", "0xa289673b": "fipsChangeOwner(bytes20,address,address)", "0x54d9d6f8": "findNextDay(uint256,bytes)", "0x008a745d": "claimDividendShare(uint256)", "0x6f4812e2": "testFailControllerInsufficientFundsTransfer()", "0x5e983d08": "setPrices()", "0x798974dd": "getNumProposals()", "0x4ca168cf": "register(bytes,uint256,address,string,uint256)", "0xa1e4d3c2": "MembershipRoster()", "0xd4065763": "returnRemainingMoney()", "0x0c4326a0": "getMajorMinorPatch(bytes32)", "0xeece1e1f": "scheduleShuffling()", "0x226685ee": "Visit()", "0x323082d7": "Vote(string)", "0x0b15650b": "randInt(uint256,uint256)", "0xc9cfac55": "refundCurrency(address,uint256,uint256)", "0xfe4a3ac9": "setExecPrice(uint256)", "0x6a0e605f": "MyToken(uint256,string,uint8,string,address)", "0xb549793d": "scheduleCall(bytes4,bytes,uint256,uint256,uint8,uint256)", "0x85e68531": "revokeAccess(address)", "0x01991313": "scheduleCall(address,bytes4,uint256)", "0x0a6be0e7": "BalancedPonzi()", "0xf463edd1": "createDocument(uint256)", "0xa20c404f": "ModifySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0x560bb612": "SignatureValidator(address)", "0xf7654176": "split()", "0x48f05187": "scheduleCall(address,bytes4,bytes,uint256)", "0xf2b904c3": "checkBetColumn(uint8,address,bytes32,bytes32)", "0x7bc0ff20": "setupExportFee(address,uint256)", "0xeb06e65e": "allowanceFromProxy(address,address,address)", "0xfe757fb5": "lastClaimPrice()", "0xa5d0bab1": "buyPartial(uint256,uint256)", "0xda7d0082": "isCertification(address,bytes32)", "0xe570be18": "DVIPBackend(address,address)", "0x54738157": "OwnerCloseContract()", "0xc1e5304a": "CreateNewDraw(uint256,bytes)", "0x0c26e42e": "getReleaseHashForNameHash(bytes32,uint256)", "0x0f7d6673": "Channel()", "0x54ea4000": "identify(address[])", "0x69307c80": "rotateBits(bytes,int256)", "0x78f0161a": "setGreyGreenPrice(uint8)", "0x23b872dd": "transferFrom(address,address,uint256)", "0x578bcc20": "reduceDebt(address,address,uint256)", "0x59e148fc": "getLastOfferId()", "0xb5299ca6": "giveMeat()", "0xae30d35d": "ARK_TROGLOg_1_00()", "0x2d2c44f2": "Vault()", "0xce19419b": "testThrowsSetNotUpdatableNotOwner()", "0xffcf21a9": "eventOracles(bytes,uint256)", "0xf46c50dc": "doFail()", "0x73b55eaf": "registerData(address,int256,bytes32,address)", "0x53770f9a": "isStateless()", "0x4d47feaa": "ShareholderDB(uint256)", "0x40b31937": "pledgeDecline(uint256)", "0x01cb3b20": "checkGoalReached()", "0x62e05175": "setMotionDB(address)", "0xf362d78f": "testBitNotEqualSuccess()", "0xd2531590": "CANCEL_EXTRA_GAS()", "0x9a92b7e7": "EthVenturesFinal()", "0x79b0797c": "AmIPlayer1()", "0x6241bfd1": "Token(uint256)", "0x94a1710d": "testNonOwnerCantBreach()", "0xb466b76f": "fresh()", "0x4a5dddd2": "proxyPurchase(address)", "0xc0a1a949": "x15()", "0xc3b8bfe5": "transferIfNoHF(address)", "0x4a7e049e": "getFullCompany(address,uint256)", "0x481b659d": "permitPermanentApproval(address)", "0x16ce8a69": "setBuilding(uint256,uint256)", "0x1593a8c7": "endLottery()", "0x078c3fa4": "_transferToICAPWithReference(bytes32,uint256,string)", "0xfa3f1e99": "testBlobStoreRegistered()", "0x0b9e9817": "CanaryV7FastTestnet()", "0x6663bbec": "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)", "0x273bc3c9": "numberOfThrones()", "0x3c84f868": "set(int256,address,uint256)", "0x1ac61e8c": "testBlobCreate()", "0x5ccc3eaa": "roundMoneyUpToWholeFinney(uint256)", "0x0ccec396": "getNumReleases()", "0x6ac6205c": "addDataPoint(int256,uint256,bool,string)", "0x1d124fe4": "setUtils2(address)", "0x4c471cde": "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8,uint256)", "0x52a554a1": "voteBoardProposal(uint256,address,bool)", "0x745a8be2": "flip32(bytes)", "0xbac1e2e0": "testBitsAndSuccess()", "0x25fda176": "notify(address,uint256)", "0x3b8e6f2e": "balanceAt(address,uint256)", "0x60585358": "getByte()", "0xc853c03d": "newDraw(uint256,uint8[3],uint256,uint256,uint256,uint256)", "0x741273d6": "testThrowRegisterContractAgain()", "0x8f2c44a2": "UnicornMilker()", "0x59d96db5": "terminate(uint256,string)", "0x483ba09e": "setBitcoinBridge(address)", "0x74fbbc86": "rate(uint256,uint256,string)", "0x83ea0620": "packageExists(string)", "0xd917deb5": "Donate()", "0x3fc6bc94": "payDAO()", "0x6558488a": "scheduleSetBool(address,uint256,bool)", "0x83e78b31": "bet(uint8,bool,uint8)", "0xeccb15bc": "SatPosition(int256,int256)", "0x7daa10ce": "getMyInfo()", "0x3e4565d2": "testErrorUnauthorizedNameRegister2()", "0x2143da91": "GameOfThrones()", "0xb29f0835": "doIt()", "0xdcc0ccf3": "Dao(address)", "0x70d53be5": "find()", "0x9a828a71": "oracalizeReading(uint256,string)", "0x6a6d31db": "externalEnter()", "0xf8b71c64": "rewardTo(address,uint256)", "0x0399c357": "assignFreeReadings(address,uint8)", "0x81ade307": "query(string,string)", "0xdb83694c": "getSaleInfo()", "0xa6bf3df0": "oraclize_query(string,string[2],uint256)", "0x29605e77": "transferOperator(address)", "0xf29d2f28": "setTokenHolder(address)", "0xa96f8668": "releaseTokens()", "0x8a3bc2bc": "iPropose(bytes,uint256,bool)", "0xd18611d6": "reactivate()", "0x7620a65b": "Publisher()", "0xa268b332": "testBitXorFailIndexOOB()", "0x6b1781b6": "Emergency()", "0x1003e2d2": "add(uint256)", "0x1209b1f6": "ticketPrice()", "0xe5a27038": "Pluton(uint256,string,uint8,string)", "0x22bc3b8e": "getArgument(uint256)", "0x47bdb7f4": "transferDisable(bytes20)", "0x13137731": "testThrowsUpdateLatestRevisionNotUpdatable()", "0x3f3935d1": "confirmReverse(string)", "0xecb4136e": "NotAnotherPonzi()", "0x49e347ae": "getContents(uint256[],uint256)", "0x669dafe8": "toWei(uint256)", "0xc233e870": "isLatestPatchTree(bytes32,bytes32)", "0x7b789b3d": "agreement(bytes,bytes,bytes)", "0x682d3bb0": "pdfCertificateProof(bytes)", "0x42346c5e": "parseInt(string)", "0x3177029f": "approveAndCall(address,uint256)", "0x71ffcb16": "changeFeeAccount(address)", "0xc971442c": "getDBs()", "0x362e2565": "returnDeposits()", "0xe10e274a": "CrazyEarning()", "0x6d705ebb": "register(address,uint256)", "0xbe9a6555": "start()", "0x1ce624d6": "Crypted_RPS()", "0x2c4cb4be": "removeRegistryFromNameIndex(address)", "0x68742da6": "withdrawFunds(address)", "0x18f3fae1": "setOversight(address)", "0x061ea8cc": "countByOwner(address)", "0xd6d22fa4": "MetaCoin()", "0x85654c9c": "setMembershipRoster(address)", "0x8aa33776": "setMsgPrice(uint256)", "0x4dd850fb": "UfoPonzi()", "0x07e00bcb": "kissBTCCallback(uint256,uint256)", "0xa1b7ae62": "setdirectorName(string)", "0xb4d9cc3a": "profitDisperser()", "0x0f24f5c8": "doTransfer(address,uint256)", "0x8d72a473": "deductFunds(address,uint256)", "0x28f03554": "ProcessDividend()", "0x98391c94": "muteMe(bool)", "0x346cabbc": "scheduleCall(address,bytes4,uint256,bytes,uint256)", "0xa42e36c6": "scheduleTransaction(address,bytes,uint8,uint256[5],uint256)", "0x21b36a08": "setFee(uint64,uint256)", "0xd94073d4": "PT()", "0xe8580dd4": "Survey(address,uint256,string,bytes32[])", "0x1f0c1e0c": "getEventTokenAddress(bytes32,uint256)", "0xce8b7151": "isHF()", "0x9bee757b": "requestExecution(bytes,uint256)", "0x775dec49": "keccak()", "0x6673ce2b": "Results_of_the_last_round()", "0x9f87acd0": "exec(bytes32,bytes32,uint256)", "0x02394872": "getLastBlockHeight()", "0x615664ba": "Market()", "0x0d7af726": "addGame(address,string,string)", "0xf4aa1291": "withdrawFundsAdvanced(address,uint256,uint256)", "0x8ed67a44": "setPrice(uint16)", "0x84ebde52": "Under_the_Hood()", "0x5a28340a": "accessOperatingBudget(uint256)", "0x9a89ad65": "within6Confirms(int256,int256)", "0xdfce8ac3": "fipsLegacyRegister(bytes20,address,bytes)", "0x73f310df": "multiAccessRemoveOwner(address)", "0x4cbee813": "logout(string)", "0xd992bd5b": "testResultNotZero()", "0x05b34410": "creationDate()", "0xfed4614b": "funeral(bytes,int256)", "0x58cb7323": "MainnetETCSurvey()", "0xbb504317": "divest(address,uint256)", "0x82381c96": "WatchCurrentMultiplier()", "0xcce81927": "EtherDice(address,address)", "0x70961774": "getBlockCreatedOn()", "0x84a7b223": "Canary(address)", "0x9378a9e2": "setUInt(uint256)", "0xe4360fc8": "getFileListElement(bytes)", "0xe597f402": "create(bytes1,bytes32,bytes)", "0x95d5a1be": "SignatureReg()", "0x33ce7787": "transferInvestorAccount(address,address)", "0x46c52b1a": "blockHexCoordsValid(int8,int8)", "0x3092afd5": "removeMinter(address)", "0x30945443": "update(address,string,string)", "0xc37ff3d9": "sha(uint256,uint256)", "0x29a6f31b": "oraclize_query(uint256,string,string[2],uint256)", "0x227f9633": "addOption(string,address,uint256)", "0x38eaf913": "setDirectorNode(string)", "0xab67aa58": "transferFrom(address,address,uint256,bytes)", "0x0ce3151c": "personUpdateRelation(uint256,string)", "0x216ef940": "proxyUpgrade(address,address,bytes)", "0x76bc21d9": "fireEventLog2Anonym()", "0xf004073a": "performAction(uint256)", "0xdba7ef7d": "Bookie(address,address)", "0xa0469b02": "inputToDigit(uint256)", "0x1d007f5f": "changeDAO(address)", "0x9dcb5c65": "resultsWeightedByEther()", "0x14ab9038": "setTTL(bytes32,uint64)", "0xf4d94699": "EndowmentRetriever()", "0xe74b9d11": "safeToSubtract(uint256,uint256)", "0xd7504385": "validateToAddress(address)", "0x57e2880d": "scheduleTransaction(uint256,uint256)", "0xe73a914c": "setDAO(address)", "0xc47bc007": "add_funds()", "0x37881810": "setCallbackAddress(address)", "0x686f2c90": "collectAllFees()", "0x278b8c0e": "cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", "0xfac34ff6": "throwFoo()", "0x6d98e9fc": "totalWei()", "0xb0bcc610": "scheduleTransaction(address)", "0x665bcc32": "ProcessGames(uint256[],bool)", "0x3fd1f232": "LookAtAllTheseTastyFees()", "0xdd727ea6": "runJackpot()", "0x0acc4382": "getMinDailyWithdrawLimit()", "0x46b207b8": "checkExpiry()", "0xde5d953a": "logSingleIndex(bytes,bytes,uint256)", "0xf504e0da": "load_level(uint16)", "0x4b63e601": "scheduleCall(address,uint256,bytes)", "0x4a71d469": "collectRev()", "0x80db79d9": "StructAndFor()", "0x090637a1": "GetPart(bytes,uint256)", "0xc003b082": "getMyPlayerID()", "0x00a7d6b3": "checkTransferFromToICAP(address,bytes32,uint256)", "0xdcf8113e": "campaignEndedSuccessfully()", "0xd1af8a5a": "LinkerExample()", "0x01fd89a4": "getFlags(bytes20)", "0xa39a45b7": "replaceOwner(address)", "0x0a3b1cd2": "setHotwallet(address)", "0x075fe877": "scheduleCall(address,bytes,uint256,uint256)", "0x3e5fd9b5": "dEthereumlotteryNet(address,address,bool,address)", "0xa6403636": "resolve(uint8,bytes32,bytes32,bytes32)", "0x0b2acb3f": "add(address,bytes)", "0x6d522b19": "multiAccessChangeRequirementD(uint256,address)", "0x4311de8f": "ownerWithdraw()", "0xa99e7e29": "register(bytes,address)", "0x1ed6f423": "changeDescription(address,string)", "0xcd50d44f": "CheckRepresentment()", "0x4c0e207a": "__outputCallback(uint256)", "0xea8a1af0": "cancel()", "0x67387d6b": "testThrowCreateWithNonceExistingNonce()", "0xdc583801": "doubleyour5()", "0xb8077e28": "getTxOrigin()", "0xbfbc793c": "computeNameFuzzyHash(string)", "0x79baa8a9": "BasicIncome_CoFund()", "0xf4dbeb9d": "getCredRanksByContents(address,uint256[])", "0x227185d6": "Send1Get2()", "0x75c4aaa6": "addUnderDog(uint256)", "0xa7abc124": "activate(bool,bool)", "0x8df554b3": "Dividend()", "0x092b25e9": "setOwner(string,address)", "0x67af26fb": "transferOtherFrom(address,address,address,uint256)", "0x4bb278f3": "finalize()", "0xd1e15045": "sendBack()", "0xa4699cad": "resetWithdrawls()", "0xb61d27f6": "execute(address,uint256,bytes)", "0x9772c982": "scheduleCall(address,bytes4,bytes,uint256,uint256)", "0x1b3a8e6f": "directionCount(int256,int256,int256,int256)", "0xd499555b": "getFirstActiveDuel()", "0xb738169c": "betOnOddEven(bool,bool)", "0x411c4e72": "ModifyFeeFraction(uint256)", "0x06f36cc9": "helpBlue()", "0x9e65c7e5": "updateLatestRevision(bytes20,bytes)", "0xb47fa7e0": "DepositLimit(uint256)", "0xf1736d86": "m_dailyLimit()", "0x62ea82db": "bids(address)", "0x4166c1fd": "getElevation(uint8,uint8)", "0x8702735c": "setCapitol(uint256,uint256)", "0x3cc7790a": "GSI()", "0x83f6d9a4": "validateNameInternal(string)", "0x8d99b2eb": "endPoll()", "0x8bbda7e3": "setContent(string,bytes)", "0x52efea6e": "clear()", "0x2581c674": "testBitsOrFailIndexOOB()", "0x05d87fe2": "issueLetterOfCredit(uint256,uint256,uint256)", "0xcbf0b0c0": "kill(address)", "0xf83d96c1": "InsuranceAgent()", "0x8dd5e298": "canEnterPool(address)", "0x2d580ef6": "add(address,bytes32)", "0xeeda149c": "Register(address)", "0xcc25decd": "SampleOffer(address,bytes,uint256,uint256,uint256,uint256,uint256)", "0x428d64bd": "getShares(address,bytes32[])", "0x3c9a4baa": "requestOutput(bytes)", "0x8cae1374": "editBlock(uint8,uint8,uint256,int8[5])", "0x419db07b": "generousFee()", "0x202e3924": "getOperation(uint256)", "0x5ee345e4": "computeEndowment(uint256,uint256,uint256,uint256,uint256,uint256)", "0x7df23b6a": "ReleaseOracle(address[])", "0x9b2ea4bd": "setAddress(string,address)", "0x65093661": "newCommunity(address)", "0x33637d5a": "getPendingBlock(uint256)", "0x7910085d": "fipsIsRegistered(bytes20)", "0x730720b8": "testControllerValidTransfers()", "0xb0c80972": "setBalance(uint256,bool)", "0xdcf537b1": "multiply7(int256)", "0xdf5cc291": "get4(bytes,uint256)", "0x9ae4e388": "ChangeClientTokenAccount(address,bool)", "0x3121369d": "validateRequiredStackDepth(uint256)", "0x1747dfd4": "ContractPlay()", "0x598647f8": "bid(uint256,uint256)", "0xc368109c": "monster_hp(uint256)", "0x7fa22001": "assertEq0(bytes,bytes,bytes)", "0x8e280dce": "findNextYear(uint256,bytes)", "0x39d1f908": "actualBalance()", "0x8143f8a8": "totalGas(bytes)", "0xfe55932a": "setName(uint256,string)", "0x0fbf7151": "startsWith()", "0x4f20f35a": "payExpenses(address,uint256)", "0x705eeb90": "MultipleConstructorTest(bool)", "0x2df8e00d": "becomeMortal(uint256)", "0x645dce72": "updateRelease(uint32,uint32,uint32,bytes20,bool)", "0x1f6e5117": "getCallbackAddress()", "0xf51cbc72": "Level()", "0x64edfbf0": "purchase()", "0x35930e13": "setMinimalRewardedBalance(uint256)", "0x015e4f3a": "getConfigUint(int256,bytes)", "0x2c329e99": "Last_block_number_and_bloctime_used()", "0x6f3a7561": "SimpleAuction(address)", "0x6de00927": "GetUserRank(uint8,address)", "0xbe600276": "move(uint16)", "0x27d6c032": "unregister(bytes)", "0x4188d79c": "releaseExists(string,uint32,uint32,uint32,string,string)", "0x7ba38916": "changeAdminFromBoard(address)", "0x3369dace": "flipTheCoinAndWin()", "0xfa8dc33a": "checkRecordExists(bytes)", "0xebaf7f2f": "returnReward(uint256)", "0xc88961da": "createKingdom(string,address,address,address)", "0x21970c0c": "pay_royalty()", "0xb4a5ef58": "updateDefaultTimeoutPeriod(uint256)", "0x57bcccb6": "revokePermanentApproval(address)", "0xd1d1c8ae": "ConvertNumbers(bytes)", "0xc1c0e9c4": "exec()", "0xcc131be1": "CreateNewDraw(uint256)", "0x75f96ead": "Guess(uint256)", "0x8a5fb3ca": "currentFeePercentage()", "0x550bcd8d": "testThrowUpdateLatestRevisionEnforceRevisions()", "0xa6780857": "fireEventLog0Anonym()", "0x2d0104a5": "updateFirstDuel1(uint256)", "0xcbf1304d": "balances(address,uint256)", "0xdda9939c": "Store(address[])", "0xf41bfa9e": "mint(int256,uint256,string)", "0x044215c6": "token(uint256)", "0x1f903037": "getBytes32()", "0xa6f9dae1": "changeOwner(address)", "0xf9391d24": "AllPayAuction()", "0xabebb7f3": "MarketsContract()", "0x9e1e6528": "uncertify(address)", "0x81788e2b": "addAllowedAddress(address)", "0x4f44728d": "ownerChangeOwner(address)", "0x3da0ac79": "compare()", "0x96e438a1": "reclaimDeposit(uint256)", "0x5fe22c8b": "testFailTransferWithoutApproval()", "0x6835f32c": "build(bytes)", "0x5cac8b27": "amazing()", "0xad605729": "getParticipantCount()", "0xb6294bde": "AdminGetFee()", "0xec81e22e": "returnmoneycreator(uint8,uint256)", "0xc535165f": "revealAndPayout(bytes,bytes)", "0x6e0bd282": "destroy(bytes32)", "0xdda44b10": "buyRecipient(address,uint8,bytes32,bytes32)", "0xd4859dbc": "UniversalFunctionSecure(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)", "0xd2602930": "RockPaperScissors()", "0xa08b3367": "EC()", "0x92d66313": "getYear(uint256)", "0xe49dcee9": "fixTokens()", "0x36555b85": "add(string,uint256)", "0x25010816": "get_length(uint256,uint256)", "0x610d5de8": "validateEndowment(uint256,uint256,uint256,uint256,uint256)", "0x79ce9fac": "transfer(bytes32,address)", "0x3ced516c": "descriptionHashes(bytes32)", "0xcf69df28": "getDataRequestLength()", "0x706dfe54": "getIssueState(uint256,bytes32)", "0x5af77fff": "Contract()", "0x66e5cb50": "stopTransfer(uint256)", "0x5f72f450": "check(uint256)", "0xf3b50c04": "rescind()", "0x57aee888": "_eraseNodeHierarchy(uint256,bytes32[],bytes32)", "0xaacc5a17": "getRandom()", "0x40275f85": "getPersonalDepositAddress(address)", "0x75700437": "query1_withGasLimit(uint256,string,string,uint256)", "0x6eb7b4c2": "underdogInfo(uint256)", "0x0f3eb785": "add(string,uint256,uint256,uint256)", "0xdc19266f": "Total_of_Players()", "0x9743dfc1": "jesterAutomaticCollectFee()", "0x6618b008": "cancelSellOrder(address)", "0x65538c73": "fireEventLog0()", "0xa4502cb8": "setExportFee(address,uint256)", "0x97bb2a63": "newvow(uint256,address)", "0xb400d149": "betOnNumber(uint8)", "0x030d406b": "entryPayout(uint256)", "0x1d71a1cd": "newIncome(string)", "0x85dd2148": "getSaleDate(bytes16)", "0x29917954": "exitPool()", "0xa25057de": "_transferToICAP(bytes32,uint256)", "0x24fc65ed": "getId(uint256,uint256)", "0x938199a5": "getDateOfLastPayment()", "0x04bb754c": "TradeFinancing()", "0xe37aa618": "distributeValue()", "0x547916ea": "finishRound()", "0xed01bf29": "budget()", "0x95ee1221": "isCancelled()", "0xfe777bcd": "etherForSale()", "0xffe302d1": "setPlz(string)", "0x891de9ed": "fromTLA(string)", "0x84734476": "copyBytes(bytes,uint256,uint256,bytes,uint256)", "0xfb114f57": "oraclize_query(uint256,string,string[3],uint256)", "0xceebe28d": "repoInterfaceVersion()", "0xb0ad38c4": "buildCity(string,uint256[2],uint256[2])", "0xefa7e56b": "GameEnds()", "0xcc3471af": "maxClaimBlock()", "0xa7c5052e": "buildDSTokenRegistry()", "0x6831c169": "totalPayedOut()", "0x98f3b81a": "getShares(address,bytes32[],int256[])", "0x2d077ad0": "Latch()", "0x0ac28725": "requestTradeDeal(uint256,uint256,string)", "0xb311ee0c": "refundClaimDeposit()", "0xadd82871": "strEqual(string,string)", "0x7879e19e": "CollectAllFees()", "0x5bd74490": "regProxy(address,address)", "0xd2b0d554": "getDisclaimer()", "0x0b74edc6": "testFinalHash()", "0x6cf761d4": "getMinConfirmationsByAddr(address)", "0x4cedf74e": "get_party1()", "0x4adcbd19": "isThisHardforkedVersion()", "0xefdecd9b": "check_withdrawdao()", "0x996a8046": "__callback(bytes32,string,bool)", "0x7c9cd7df": "changeDeveloper_only_Dev(address)", "0x3f77b560": "newDocument(bytes)", "0x06b5f02d": "calcWinnings(uint256,uint256)", "0x0a2282ae": "JackPot()", "0x378a2178": "tallyVotes()", "0xd8915fc5": "DCAssetBackend(bytes32,bytes32)", "0x0f590c36": "emergencyFixGameResult(uint64,uint256)", "0xea4af029": "ConferenceCertification()", "0x769dc523": "GetCategoryNumber(bytes4)", "0xd5df7559": "removeDocument(uint256)", "0x749aa2d9": "endRound()", "0xd8e5ae6a": "Etheramid()", "0xc0576b73": "monsters(uint256)", "0x32fefb4c": "add_account(address,address)", "0x7d619d9b": "holdCoin(address,address)", "0x5b067cce": "testCreateCostMain()", "0x384b1393": "follow(uint256)", "0x4162169f": "dao()", "0x5d8227e6": "FactoryBase(string,string,string)", "0x6bf52ffa": "Vote()", "0xeb5904c0": "setProfitDistributionContract(address)", "0x366a68dc": "setBlockLock(uint256)", "0x80d9eaa6": "refCount()", "0x89b8b492": "read(uint64)", "0x46b5e202": "set_num_levels(uint256,uint256)", "0xd96de4ce": "AdminDrawError()", "0x47b47102": "bakeCookie(string)", "0x1d7b5baf": "setUint(int256,bytes32,string,uint256)", "0x0699d07d": "updateMaxVal()", "0xfa544161": "getOwner(address)", "0x638560cf": "registerBool(address,bool)", "0x7c25f260": "Government()", "0x24a852c6": "unset(bytes)", "0xa32f0f41": "testFailControllerUnapprovedTransferFrom()", "0x0968f264": "withdraw(bytes)", "0x5f52e9fd": "WithdrawCashForHardwareReturn(uint256)", "0xc0f68859": "getMinimumGracePeriod()", "0x1bf6c21b": "USD()", "0x0fe234ed": "testSetController()", "0x05a17fc6": "getAccountFeed(address,uint256,uint256,uint256)", "0x673448dd": "isApproved(address)", "0x59dac714": "hashTo256(bytes)", "0x5a09f2f4": "setHouseFee(uint256)", "0x013cf08b": "proposals(uint256)", "0xeebf9808": "PiggyBank()", "0xadd43c59": "EtherTopDog()", "0xf909d60d": "getMinimumGasLimit()", "0xeb045789": "ChannelSeries(address)", "0x66d38203": "setup(address)", "0xe8641652": "strCompare(string,string)", "0x1959a002": "userInfo(address)", "0x737c8ea1": "_getRevisionBlockNumber(bytes32,uint256)", "0x127714c7": "getBudget()", "0x97daa043": "register(bytes,address,address,uint256,bytes)", "0xb5784f6f": "testMultiplePackages()", "0x0ce46c43": "scheduleCall(address,bytes4,bytes,uint16,uint8,uint256[5])", "0xe5782fd5": "setFeeStructure(uint256,uint256,uint256)", "0xa9f6def0": "HonestDice()", "0xeb7cdb56": "rankDown(uint256,uint256)", "0xb17b94c1": "testSystem()", "0xdd36e18b": "ContractStatus()", "0xee0dc478": "testSetEnforceRevisions()", "0x918359c6": "needsBirth()", "0xa5b1e13d": "settle(address,address,uint256,uint256)", "0x6b76484e": "swap(address,address)", "0x68402460": "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256)", "0x733480b7": "transferToICAP(bytes32,uint256)", "0x567dbf18": "__forward(address,uint256,uint256,bytes)", "0x73e1743a": "buildDSBasicAuthority()", "0x482961e1": "updateReading(uint256,uint256)", "0x4e6ba0a9": "testCreateCostMultisig()", "0x8d7108e5": "isValidLocation(uint8,uint8,int8[5],int8[24])", "0x10142785": "assign(bytes,uint256,bytes1)", "0xfe97ee88": "hasPhone(address)", "0xe2861c8d": "cashOutProfit()", "0x0fa9ced4": "emergencyFuneral()", "0x8389f353": "setNumCities(uint256)", "0xdba1ac3d": "getEnforceRevisions(bytes20)", "0x1b4fa6ab": "getDefaultStackCheck()", "0x79be02af": "Read(address)", "0x70844f7a": "sendBadge(address,uint256)", "0x7bfaad96": "addNode(bytes,address)", "0x4d782cbc": "executeSellOrder()", "0xbe71248a": "payWinner()", "0x41304fac": "log(string)", "0x4f059a43": "getClaimAmountForBlock()", "0x6d2cb794": "airaTransfer(address,address,uint256)", "0x5a5383ac": "canExitPool()", "0xcabd27de": "Motion(address)", "0x433d4aab": "resolve(uint8,uint8)", "0x7d89ae63": "__findRef(string)", "0x4e1053cc": "RobinHoodPonzi()", "0x0220a5b4": "terminate(string)", "0x419ffa03": "fipsRegister(address)", "0x77a7e6be": "getRefTotal(uint256)", "0xed64bea4": "JamCoin()", "0x3cf885c4": "isBitSet(uint256,uint8)", "0xf2da67db": "setMany(uint256,int256,uint256,bytes20,address,bytes)", "0xe26c8434": "AdminStartDraw(string,bytes)", "0x13df7091": "mintAll(int256)", "0x8a46bf6d": "testFallback()", "0x29bed3bf": "EthereumRoulette()", "0xf869b11a": "declareVictor(uint256,uint256)", "0x45c41478": "getMarkets(bytes,address)", "0x90cf581c": "voteYes()", "0x9ec35352": "returnRandom()", "0x5025b9ae": "expire(uint256,uint256,uint8,bytes,bytes,bytes)", "0x338a1379": "_setPackedBlockNumber(bytes20,uint256)", "0xdb641ab4": "Game_balance_in_Ethers()", "0xbc0e7adb": "testThrowsDisownNotOwner()", "0x302d350e": "firstChainedCallback(uint256)", "0x5af73f3f": "getMinimalBalance(uint256,address)", "0x4c488dac": "getChannelValidUntil(bytes)", "0xa1616429": "testBitOrSuccess()", "0xaa64c43b": "transferPool(address,address,uint256)", "0x78e97925": "startTime()", "0xa0355f4e": "decline(uint256)", "0x02556de3": "updateMajorTree(bytes32)", "0x01984892": "name(address)", "0xfad4b99a": "updateChannelMinimum(address,uint256)", "0x4f39ca59": "drop(bytes32)", "0x61591a7c": "personUpdateDOB(uint256,int256)", "0x17b3a34b": "_addIdentities(uint256,bytes32[])", "0x91d8b14e": "BuyTickets()", "0x1aadcc34": "convertGreyGreen(uint8,uint8)", "0x9a863892": "NewProposal(uint256)", "0xc5487661": "proxyTransferToICAPWithReference(bytes32,uint256,string)", "0x85f8c16d": "claimHours(int256)", "0xa71f94c8": "scheduleSetUInt(address,uint256,uint256)", "0x7ef09476": "transfer(uint64,address)", "0x94bcdb4c": "Example2()", "0x37930615": "extend(bytes16[],uint64)", "0xfb09b1ac": "testBalanceOfReflectsTransfer()", "0x19a278b9": "getBAddress()", "0xc0a239e3": "valuePerShare()", "0xa039e3c7": "testSetNotTransferable()", "0x22593300": "Small(address)", "0xe21608be": "ReserveToken()", "0xc2985578": "foo()", "0xb463bcde": "testThrowsSetNotTransferableNotOwner()", "0x88d695b2": "batchTransfer(address[],uint256[])", "0x37b0574a": "isClassic()", "0x1da6822c": "testThrowsTransferEnableNotTransferable()", "0xdcfa9cc0": "testProxyCall()", "0x478aa69e": "unauthorizeUser(address)", "0x102accc1": "fireEventLog2()", "0xed62cf1f": "setCanCall(address,address,bytes,bool)", "0x15f73331": "invalidateName(string)", "0x73e30e49": "majorEventFunc(uint256,bytes,bytes)", "0x00c721ab": "setHand(uint256)", "0xf9e27106": "investmentEntryCost()", "0x4c7f74df": "EtherDelta(address,address,address,uint256,uint256,uint256)", "0xb74e452b": "today()", "0xd3118a5a": "addDoc(string,string)", "0xc204f9f1": "_transferFromToICAP(address,bytes32,uint256)", "0xf50d3914": "resetFoundationtList()", "0xe67cdfb7": "moveOldUser(uint256)", "0x98eaca94": "inKissBTC(uint256)", "0xc633084f": "sendGreeting(address,string)", "0xde10f04b": "eraseNode(bytes32[])", "0xd50495f4": "addTransaction(bytes)", "0x96cff3df": "getMinimumCallCost(uint256,uint256)", "0xce373b95": "heroOfThePit()", "0x39e525f9": "resolveCallback(uint256)", "0x942b90d3": "getRewardTable()", "0xedca914c": "buyTicket()", "0x5fcb568c": "release(string,uint32,uint32,uint32,string,string,string)", "0x6c9c2faf": "getSupply()", "0xf1448e10": "requestExecution(bytes)", "0x0c08bf88": "terminate()", "0x08aba5aa": "setAccountBalance(uint256)", "0x2c46d8d5": "EndRound(uint256)", "0x3d5db1c2": "incrUserOnholdBal(address,uint256,bool)", "0xf2f254c7": "getLatestMinorTree(bytes32,uint32)", "0x373a1bc3": "scheduleCall(address,bytes4)", "0x3a96fdd7": "compare(string,string)", "0x738ddabe": "getContentIndexedAccountCred(uint256,address,address)", "0x5acce36b": "getEndowmentBalance()", "0x1ca60aeb": "setMeltingContract(address)", "0x52375093": "m_lastDay()", "0x565a2e2c": "getBeneficiary()", "0x9d5c6061": "getMsgGas()", "0x41d31feb": "get_read_only_keys()", "0x796b89b9": "getBlockTimestamp()", "0x4a41e045": "getUint8(int8)", "0x38e48f06": "save(string)", "0x1cda37f2": "eraseRecords(bytes32)", "0xae978f08": "getLatestTweet()", "0x20909fa0": "communityCurrency()", "0xafbec8df": "TheGrid()", "0x1c14179a": "GavCoin()", "0x0b6142fc": "breach()", "0x3ab1e703": "roundMoneyDown3SF(uint256)", "0x414ceac0": "investorAddFee(uint256)", "0x82a62137": "activateAccount(address)", "0x4ca7fbd0": "updateTokenPriceWeekTwo()", "0x2551858e": "getFlags(bytes32)", "0x4ad07b0e": "oracleOutcomes(bytes32,address)", "0x60b431a4": "testGetSig()", "0xa5f8cdbb": "buyTicket(address)", "0x64aabe92": "tryExec(address,bytes,uint256)", "0xa6c01cfd": "isInGeneration(uint256)", "0x149c5066": "ChanceOfWinning(uint256)", "0xc068eae0": "player_collect_winnings(uint256)", "0x8129fc1c": "initialize()", "0xcf832ce2": "ownerRefundPlayer(bytes32,address,uint256,uint256)", "0x3517a740": "getNodeParent(bytes)", "0xec6afc22": "oraclize_query(uint256,string,string[3])", "0x50944a8f": "setMembership(address)", "0x85b1423e": "returnAll()", "0xd95a2d42": "lendGovernmentMoney(address)", "0x347632e8": "getShareholderAdressByID(uint256)", "0xbb39a960": "trade(address,uint256,address,uint256)", "0x8abadb6b": "setAccountLevel(address,uint256)", "0xa502aae8": "getNextGenerationId()", "0xb5bfdd73": "addDSource(string,bytes1,uint256)", "0x28d3ad3f": "getPot(uint256)", "0x08933d11": "getJoinBlock(address)", "0x8383bfc8": "EscrowFoundry()", "0x2ca15122": "sign()", "0xf340fa01": "deposit(address)", "0x9ed93318": "create(address)", "0xa1c0539d": "scheduleCall(address,bytes4,bytes)", "0xced92670": "changeMultiplier(uint256)", "0xb2c652f3": "getMarkets(uint256[128])", "0x69b144eb": "testThrowsCreateNewRevisionNotOwner()", "0x16c72721": "forked()", "0x712ca0f8": "getOrder(string)", "0x0cf45ba5": "updateFirstDuel2(uint256)", "0x4173b181": "setWeiPrice(uint256)", "0x689b3e2d": "Moonraker(address,address)", "0x8691162a": "TlcCoin()", "0x432ced04": "reserve(bytes32)", "0x38178fbe": "addString(string,string)", "0x8f1327c0": "getRound(uint256)", "0xa9eed530": "reduceOrderQty(uint256,uint256)", "0x408938d0": "testUpdatePackageDb()", "0x56105a08": "DgxSwap()", "0xc43d0575": "scheduleCall(bytes4,uint256)", "0xdba21657": "askForEther(uint256)", "0xca3b5c91": "hasRelation(bytes,bytes,address)", "0xc71cbcf3": "recoverAccount(address,address)", "0xb010d94a": "canExitPool(address)", "0x0a16697a": "targetBlock()", "0xff1f7046": "requiresAuction(string)", "0x0b811cb6": "executeProposal(uint256,bytes32)", "0xbb8be064": "HardwareToken()", "0xe2b05077": "getSaleDate(bytes,uint256)", "0x1e9a6950": "redeem(address,uint256)", "0xd21b84ac": "createNewDAO(address)", "0xd644e356": "index(uint256,address,uint256,uint256)", "0xea27a881": "getMinimumEndowment(uint256,uint256,uint256,uint256)", "0x99a88ec4": "upgrade(address,address)", "0xc8e4acef": "playerByAddress(address)", "0x0b7abf77": "TOTAL_TOKENS()", "0xfb5d7376": "step4()", "0xc0aa18e7": "History()", "0xe2233ada": "smartDoor(address[])", "0xd6006e88": "send(address[],uint256[],uint256)", "0x95671958": "getFileListTail()", "0x16bac350": "overthrow(string)", "0x5cb18a6d": "fipsLegacyRegisterMulti(bytes20[],address,bytes)", "0x60116397": "Registrar(address,bytes32,uint256)", "0x60fe47b1": "set(uint256)", "0x5f8f0483": "buyBankerAgreementFromImporterBank()", "0x4c8cc20b": "toContentID(address,string,string,address,uint256)", "0x45ca25ed": "changeName(address,string)", "0xb21bce4c": "vote(bytes,bool)", "0x334dc700": "CanaryV7Testnet()", "0xc31d0031": "CrowdFundDAO(string,uint8,string)", "0xf3d91708": "isEligibleForUpgrade(address)", "0x0ee07836": "adjustDifficulty(uint256)", "0xf6232556": "Security_GetNumberOfAttemptsToConnectBankAccountToANewOwnerAddress()", "0xb2d37e95": "remove_order(uint32)", "0x691d58e7": "_applyRefund(uint256)", "0x1c2353e1": "isCertifier(address)", "0xcf158fe9": "scheduleTransaction(uint256,uint256,uint256)", "0x5d96ec65": "setAdministrator(address,string,bool)", "0x0651844e": "activateBalance(address)", "0x217311ac": "getWords(uint64)", "0xc127c247": "addMember(address,string)", "0x40c0bcb9": "checkBetNumber(uint8,address,bytes32,bytes32)", "0xb633620c": "getTimestamp(uint256)", "0x5b764811": "_jMul(uint256,uint256,uint256,uint256)", "0xfe029156": "swap(address,address,uint256,uint256)", "0x31db4b95": "doTriggerAuth()", "0x203c03fa": "Coinflip()", "0x209a5b8a": "moneySumAtSettlement(address,uint256,int256,uint256)", "0xf10ae2ab": "__dig_then_proxy(uint256,address,bytes)", "0xd532e481": "activateFrozenAccount(address)", "0xe9a9c1b4": "get_party1_balance()", "0x8fcc9cfb": "setMinDeposit(uint256)", "0xe5c7e509": "testThrowTransferDisableNotEnabled()", "0x4e077f2a": "addGasEther()", "0xb7c93330": "ResourcePoolTester()", "0x82661dc4": "splitDAO(uint256,address)", "0x0e554bd8": "scheduleCall(bytes,uint256,uint256,uint8)", "0x49041903": "getGame(uint64)", "0x0e1da6c3": "claimTimeout()", "0xc53ad76f": "Kardashian()", "0x8b7bcc86": "numWinners()", "0x1043dcdf": "LastIsMe(uint256,uint256)", "0x6cd22eaf": "updateAuthority(address,bool)", "0xb796a339": "addRegistryIntoOwnerIndex(address,address)", "0x308d6613": "getSignData(uint256,uint8)", "0xed88c68e": "donate()", "0xb719d1d0": "getRegInfo(address)", "0xac8d6030": "removeRequest(address)", "0x46f0975a": "signers()", "0x434cb64c": "startNextGeneration()", "0x6cb3d30a": "triggerTryAuth()", "0x3c067945": "fundBalance()", "0x26c7edaa": "flip4(bytes)", "0xf76f950e": "uint2str(uint256)", "0x860e9960": "BetPriceLimit()", "0xb0ecca8f": "LookAtLastTimePerZone(uint256)", "0xa35cfa22": "make_move(uint256,uint8,uint8,uint8,uint8)", "0x3f74fecb": "DSTrueFallbackTest()", "0xdd2ad311": "scheduleCall(bytes,uint256)", "0x0ae5e739": "grantAccess(address)", "0x7d5fec5a": "setOwner(uint8,uint8,address)", "0x6a4b6aa5": "untrustedChildWithdraw()", "0x332f93a9": "nextPayoutGoal()", "0xc5ae6e0e": "Kernal()", "0x75438e49": "fillGas()", "0x51404cbe": "forceDivestOfOneInvestor(address)", "0xeacfc0ae": "Authorized()", "0xe59d843a": "Replicator(bytes,uint256,uint256,address)", "0xf00e8651": "createRequest(address[2],address,uint256[11],uint256,bytes)", "0x02acdb44": "setAnyoneCanCall(address,bytes4,bool)", "0x2a24f46c": "auctionEnd()", "0x7ef1925b": "getShareRange(uint256,uint8)", "0x2fac1a54": "newOrder(bool,uint256,uint256,uint256,uint256)", "0x56b8c724": "transfer(address,uint256,string)", "0x33fd066d": "doBalanceFor(address)", "0xf29617da": "registrationDeposit(address)", "0x2b297f9e": "registerDao(address)", "0x79cce1c5": "getReleaseHashes(uint256,uint256)", "0xbed1b8b9": "convertToInt(string)", "0xef5daf01": "_dumpToCompany()", "0x23dc42e7": "query1(uint256,string,string)", "0xa53b1c1e": "setInt256(int256)", "0xb8cf14e7": "updateStatusPlayer()", "0x61aa8d93": "processFee()", "0x10f41715": "updateMintingData(uint256,uint256)", "0x048e2e94": "getAccountSize(address,uint256)", "0x7c47965e": "isInCurrentGeneration()", "0x420a8ac8": "NanoPyramid()", "0xe56556a9": "getPlayerID(address)", "0x5cd2f4d3": "approve(address,bytes32)", "0x8da4d776": "newCommune(address)", "0x4d30b6be": "balanceOf(address,bytes32)", "0x4a606c53": "_db()", "0x4956eaf0": "deploy(address,uint256)", "0xf1fe42b8": "TransactionRequest(address[3],address,uint256[11],uint256,bytes)", "0x63e38ff3": "id_for_nym(uint256)", "0x0e757a2e": "testSetAndGet()", "0x3facd57c": "registerBill(uint256,address,address,uint256,uint256,uint256)", "0xe548cf13": "betOnColumn(bool,bool,bool)", "0x2f1e4968": "makeNewProposal(string,uint256)", "0x0b467b9b": "revoke(bytes)", "0x74bfb965": "addNewProxy(address)", "0x02de2cf3": "isLatestPreReleaseTree(bytes32,bytes32)", "0xfc1f7652": "_isBoardMember(address)", "0xefef39a1": "purchase(uint256)", "0x3ae9b510": "getLatestMajorTree(bytes32)", "0xc24924d6": "setQueryFee(uint256)", "0x839930ba": "getMinimumBet()", "0x8f5e9ca7": "acceptTOS(address,bool)", "0xd1100691": "BookCafe()", "0x839849c0": "changeBaseMultiplier(uint256)", "0x758971e8": "ownerTakeProfit(bool)", "0x2b785960": "testBitAndSuccess()", "0xd96a094a": "buy(uint256)", "0x379607f5": "claim(uint256)", "0x88e072b2": "checkTransfer(address,uint256)", "0x05fefda7": "setPrices(uint256,uint256)", "0xfc63d4fb": "order(bool,uint32,uint128)", "0x5718b994": "checkEvent(address,bytes,bytes,uint256)", "0x0c0662a8": "getLastWithdrawal()", "0xeb947f19": "ExampleResourcePool()", "0xb51c4f96": "getCodeSize(address)", "0x702fc7da": "ReviewModel()", "0xc6cb7a96": "orderMatchTest(uint256,uint256,int256,uint256,uint256,address,address,uint256,int256)", "0xb7760c8f": "transfer(uint256,address)", "0x32b12eac": "setFallback(address)", "0x0a4d564c": "TieUpLooseEnds()", "0xc3ad5ecb": "getTweet(uint256)", "0xe86afde0": "description(uint64)", "0xd0549602": "scheduleTransaction(address,uint256,uint256,uint256)", "0xbf2e694f": "getPreviousRequest(address,address)", "0x2525f5c1": "cancelBid(address,bytes32)", "0x19f02ceb": "set(address,address,uint256)", "0xf00acc47": "prepareRoll(uint256,uint256)", "0x29d28aad": "Broker(address)", "0x041d0c0b": "MyTokenLoad(uint256,string,uint8,string,address)", "0xd81ab0c1": "invoke(uint256,address,address,bytes)", "0xab09ee80": "respond(uint256,uint256,uint256,uint256)", "0xd985f122": "RelayToolsTest()", "0xbe0638e4": "WealthShare()", "0x5263ba87": "getLatestPatchTree(bytes32,uint32,uint32)", "0xb7bae9b7": "exists(bytes,bytes)", "0x0b80f8d3": "invmod(uint256,uint256)", "0xbb4d7cd1": "tag(uint256,string)", "0xadf54e0c": "betOnLowHigh(bool,bool)", "0xed54746e": "lastAuction()", "0xf158458c": "getMinimumEndowment(uint256,uint256)", "0x5fcc2edb": "IndividualityTokenRoot(address)", "0x7cc48875": "Slots()", "0x2885b593": "extractMasterKeyIndexLength()", "0x8940aebe": "publicKey(uint256)", "0x0aece23c": "getFeeAmount(int256)", "0x72c3015c": "mint(int256,address,string)", "0xd6a619e3": "transferIfPuritanical(address)", "0xe30443bc": "setBalance(address,uint256)", "0x1277e24f": "payOneTimeFee()", "0xb958a5e1": "getPhoneByAddress(address)", "0x4e71d92d": "claim()", "0x3e0d4f4a": "ApproveContractorProposal()", "0x18160ddd": "totalSupply()", "0x150ad2a8": "owner_transfer_ownership(address)", "0xa2b5591c": "oraclize_query(uint256,string,string[],uint256)", "0x8d227fc0": "getPeriodInfo()", "0x1c0b6367": "processTransaction(bytes,uint256)", "0xf245b9e4": "DVIP(address)", "0x392327b5": "owner_set_fraction(uint256)", "0xadaccd74": "getNickname(address)", "0x2e0ef395": "voteOnNewEntryFees_only_VIP(uint8)", "0x89c19ddb": "concat(string,string)", "0xcef8d343": "buyShare(uint256,bool)", "0xd224118f": "PrepareDraw()", "0x4269d8ef": "_safeSend(address,uint256)", "0xda1441cd": "KudosBank(uint256)", "0x7ccfd45a": "removeSubUser(address)", "0xcc70bb1a": "publish(string,string,string,address)", "0x708f29a6": "getTotalPayments()", "0x05459f42": "WeeklyLotteryB(address)", "0x452d44dc": "checkBothNotNull()", "0x659fb968": "getOracleOutcomes(bytes32[],address[])", "0x3570c2ee": "PosRewards()", "0xbca86986": "testSetup()", "0xff49b26e": "createEvent(uint256,uint256,uint8,uint32,address,uint256,uint8)", "0x541d920c": "commit(bytes,string)", "0xa6a20ff6": "DSEasyMultisig(uint256,uint256,uint256,uint256)", "0x0f5381f1": "testUserCanIncreaseVersionNumber()", "0xf8f46b5f": "getCurrentMinerAddress()", "0xfcfff16f": "open()", "0x5a9b0b89": "getInfo()", "0xb8017221": "get_party2_balance()", "0x514dcfe3": "seller_accept()", "0x2004dff6": "Basics()", "0x0b6d8d52": "createDAO(address,uint256,uint256)", "0xf18d20be": "adminWithdraw()", "0x8f9df278": "newEntry(int256,bool,uint256,int256,string,bytes32,address,uint256[])", "0x75949c13": "sendHalf(address)", "0x64ac2c4a": "WavesPresale()", "0x8946d33f": "SplitterEthToEtc()", "0x11400d8e": "priv_fastGetBlockHash__(int256,int256)", "0x7266f4a4": "X3()", "0xb189ad2a": "testErrorUnauthorizedAfterTransfer()", "0x31c2bd0b": "propose(address,bytes,uint256)", "0x100c8ada": "setCAmodulus(bytes)", "0x296ed88f": "testFailControllerInsufficientFundsTransferFrom()", "0xd5dbb1ad": "solveBet(address,uint8,bool,uint8,bytes32,bytes32)", "0x8a9ffb90": "transfer(string,string,bool)", "0x968908a3": "createMarketMaker(uint256,uint16,uint256)", "0x7b02b2c9": "sendMsg(address,string)", "0xa33dd801": "setTreasuryBalance(uint256)", "0x2f553d31": "isCreated(bytes32)", "0xf712d7ff": "testFailControllerTransferFromWithoutApproval()", "0xe51ff1fc": "iterateOverThings()", "0x60fd902c": "gnosisToken()", "0x2ef875fb": "div10(uint256,uint8)", "0x640f244b": "findSuitableGen()", "0x16cb9a01": "assertFalse(bool,bytes)", "0xe671f510": "onEtherandomExec(bytes32,bytes32,uint256)", "0x758b5172": "setPlayersPerRound(uint256)", "0x6423db34": "Reset()", "0x21958a50": "AddressSeries(address)", "0xfb87d5ea": "TransactionRequest(address[4],address,uint256[11],uint256,bytes)", "0xfb279ef3": "tip(uint256,address,uint256)", "0x338cdca1": "request()", "0x4e7ad367": "fireEventLog1Anonym()", "0xbd9335c0": "scheduleHangouts()", "0x4cb85356": "BranchSender(uint256,bytes32)", "0x1d7e1f68": "getContentRank(address,uint256)", "0x1a1df394": "Play(bool)", "0x468129a5": "setUnit(uint256,uint256,uint256)", "0xecb70fb7": "hasEnded()", "0x2d49ffcd": "getLocked()", "0x2e06c756": "post(string,string,string,uint256,uint256,address)", "0x73f93a48": "getAccountContentTip(address,uint256)", "0xf6a3d24e": "exists(address)", "0x5fbddcf3": "isLivingMonarch()", "0x6d568c43": "weiToCents(uint256)", "0xacf4280c": "buildDSApprovalDB()", "0xf3541901": "execute(address,bytes,uint256,uint256)", "0x88eb7af7": "_isHuman()", "0x48a490fb": "transferFromTreasury(address,uint256)", "0x5e03d393": "setAccountFrozenStatus(address,bool)", "0xfc687311": "betOn(int8)", "0x5bbfe9b6": "_myGroupHelper()", "0x5629c6d9": "doExecution(address)", "0xe3a9b508": "EnableDisableTokenProxy()", "0x9229c504": "new_mainPlayer(address)", "0x6f6c0244": "generateShortLink()", "0x33613cbe": "getBondBalance(address)", "0x4229616d": "collectPercentOfFees(uint256)", "0x4ed3885e": "set(string)", "0x043bb5e7": "getIdentities(address[])", "0xad2fea7c": "removeMinter(int256,address)", "0x0b7e9c44": "payout(address)", "0x17f5de95": "MAX_TOKENS_SOLD()", "0x50ea1932": "lookupISO3116_1_alpha_2(bytes)", "0x96f7807a": "getDuel2(uint256)", "0xa97ffd5e": "safeToSell(uint256)", "0x2f4ee5d4": "registerThrone(bytes,uint256,address,uint256,uint256)", "0x4c0bcfe5": "getTransferableBalance(address)", "0x0d17bc2e": "_disallow()", "0x0ca7395f": "returnFund(address,uint256)", "0x69fe0e2d": "setFee(uint256)", "0xfaf27bca": "greeter(string)", "0x0c7de59d": "edit(address,bytes,bool)", "0x16e27349": "getFeeRecipient(int256,int256)", "0x37751b35": "doTransfer(address,address,uint256)", "0x67fc1c6a": "validateProposedMonarchName(string)", "0xf59f99ee": "createNextGeneration()", "0x6be505f5": "selectWinner(bytes32)", "0xf6bd5893": "getGas(uint256)", "0x35b09a6e": "someFunction()", "0xb3aaa277": "validate(address[4],address,uint256[11],uint256,bytes,uint256)", "0x4f052648": "XaurumDataContract()", "0x117b4705": "retract(bytes32)", "0x2145e36c": "testBitSetFailIndexOOB()", "0x3d750b28": "found()", "0x1334a5e2": "eventCallback(uint8,address,address,uint256)", "0x3c2c21a0": "scheduleCall(address,uint256,bytes4)", "0x82996d9f": "rent()", "0xaf640d0f": "id()", "0xdaf22f4d": "identify(bytes32)", "0xfe4667e9": "getMaxLossAfterTrade(address,uint256,uint256,int256,int256)", "0xfc108f70": "GamblerPerAddress(address)", "0x89f4ed7a": "getLastTag(uint256)", "0xfcc11241": "addOrder(uint256,uint256,uint256,uint256,uint256,uint8)", "0x43243797": "fundsOf(address)", "0x892c0214": "NumberOfCurrentBlockMiners()", "0xb5a6c525": "extractFrozenAccountLength()", "0x1acb2719": "getNextRequest(address,address)", "0xa89a4f09": "creatorBalanceChecker()", "0x1e83409a": "claim(address)", "0x5e1d7ae4": "changeFeeRebate(uint256)", "0xb7482509": "deposit(address,string)", "0xfb47a067": "_getRevisionBlockNumber(bytes20,uint256)", "0x5dcdddd1": "testSafeToAddFix()", "0x9aa26f06": "registerBytes32(address,bytes)", "0xd085e66e": "GetPart(bytes32,uint256)", "0x2cd78450": "activateExportFeeChargeRecord(address)", "0x35d129f6": "untag(string)", "0x1a7a98e2": "getDomain(uint256)", "0x877653f0": "_storeBalanceRecord(address)", "0x446fbcd1": "CredSign()", "0xfae8f9a2": "setInitialParent(int256,int256,int256,int256,int256,int256)", "0xc1b056b0": "getNodeLeftChild(bytes)", "0x71f297cc": "XaurumToken(address)", "0xe3ffc9a3": "sendEtherToOwner()", "0xeccf1b29": "CrystalDoubler()", "0x57f4d5ec": "processDividends(address,uint256)", "0x75c589a0": "getMinimumCallCost()", "0x66772438": "computeResponse(uint16)", "0x7fefde53": "WillRegistry()", "0x8f4fb958": "calculateRandomNumberByBlockhash(uint256,address)", "0xed498fa8": "userTokens(address)", "0x5601eaea": "execute(uint256,uint256)", "0x8dd8596c": "sendDonation()", "0x15a0df43": "testThrowCreateNewRevisionNotOwner()", "0x0382c254": "CheckHash(uint8,uint8,uint8,uint8,bytes32)", "0x157f8f51": "feePaid(int256,int256,int256,int256)", "0xf00aac7f": "ArrayRR()", "0x7b7d7225": "_approve(address,uint256)", "0x54ed7b6e": "addHash(bytes)", "0x235c002d": "transferOther(address,address,uint256)", "0x7057c20d": "CFD(address)", "0xd5563f31": "createAuction(uint256)", "0x46c3166f": "testThrowRetractLatestRevisionNotOwner()", "0x4420e486": "register(address)", "0x9a969768": "distributeProfits(uint256)", "0x464f37c9": "trustedChildRefund()", "0x5d495aea": "pickWinner()", "0xdf55b41a": "owner(string)", "0x10e6e06c": "vote(bool,uint256)", "0xe7faecec": "testFailInsufficientFundsTransfers()", "0xea98e540": "proxyTransferFromToICAPWithReference(address,bytes32,uint256,string)", "0xfff78f9c": "doThrow()", "0x9bb01b5f": "ElcoinDb(address)", "0xdc6dd152": "playerRollDice(uint256)", "0x5d0be9de": "softWithdrawRevenueFor(address)", "0xcd591822": "CanaryV7Fast()", "0x36e6b92e": "taskProcessedWithCosting(uint256,uint256)", "0x7bb6a4c6": "uno(uint256)", "0x03427656": "getDefaultSoftResolutionBlocks()", "0xc1fd4339": "createMarket(bytes32,uint256,uint256,address)", "0xeb95b7d5": "Bounty(address,address)", "0x4dd49ab4": "get(bytes,uint256)", "0xfa6d373c": "LeaderHash()", "0x8c8d98a0": "toTimestamp(uint16,uint8,uint8)", "0x9a79f4a8": "testFailHeaderInsufficientFee()", "0xdd90c403": "getAccountFeed(address,uint256,uint256)", "0x58e59c32": "get_entry(uint256,uint256,uint256)", "0xfd747c0b": "rsaVerify(bytes,bytes,uint256,bytes)", "0x0f4cf692": "numMessages()", "0x18433bb7": "DrawPrepare()", "0x1dea0c57": "getRealBet(uint256)", "0x7d60e343": "getFileListSize()", "0xd24ddcfe": "buyKissBTC()", "0xa055fe64": "_projectCommitNew(address)", "0x5f17114e": "TimeDeposit()", "0x85fe0448": "testThrowRestartNotUpdatable()", "0x901717d1": "one()", "0x528fd7b0": "manualPayExpiredDuel()", "0x85952454": "newOwner(address)", "0xf34c7010": "commitSecurity(address,uint256,uint256)", "0x3bf2313d": "__transferToICAPWithReference(bytes32,uint256,string)", "0x67b830ad": "fillOrder(uint256)", "0x73fac6f0": "confirmReceived()", "0xf1b3f968": "getRaceEndBlock()", "0xf99fc046": "dEthereumlotteryNet()", "0xb409da05": "logDoubleIndex(bytes,bytes,bytes,uint256)", "0x9e920587": "testOwnedAuth()", "0x8e7cb6e1": "getIndex(uint256)", "0xe2f8a017": "payInstallment(uint256)", "0xac3e6b2f": "testSetNotRetractable()", "0x8fbc3ecd": "BUFFER()", "0x4b729aff": "buyNumber(uint256)", "0x166c4b85": "len(bytes32)", "0x6299f8cf": "stop(uint256)", "0xd767aee0": "bbb()", "0x29090202": "Resolver(address)", "0xcc2c2bcf": "MotionFactory(string,string,string)", "0xfd260dfc": "getCertificationDbStatus(address)", "0x30aceb89": "validateRequestParams(address[3],address,uint256[11],uint256,bytes,uint256)", "0xd11f13df": "numberOfParticipantsWaitingForPayout()", "0xd05c78da": "safeMul(uint256,uint256)", "0x69953501": "setUtils(address)", "0xff7f5f2a": "EtherizationUtils2()", "0xde4b3262": "setBasePrice(uint256)", "0x6cf9cc58": "registerResource(bytes,uint256,bytes,string)", "0x7ac37d58": "ownerTransferEther(address,uint256)", "0x0121b93f": "vote(uint256)", "0x07b6f631": "testTestHarnessAuth()", "0x869b3f6a": "testThrowsRetractNotOwner()", "0x18253234": "ticketsAvailable()", "0x5581004d": "createThrone(bytes,uint256,uint256,uint256,uint256)", "0x7102c138": "Standard_Token(uint256)", "0xce5566c5": "cash(uint256,uint256)", "0x16a25cbd": "ttl(bytes32)", "0x0c9fcec9": "setApproval(address,address,uint256)", "0xe6d95eb8": "DSAuthorized()", "0x34c0d654": "setPackageDb(address)", "0x0ee79fb3": "closeReferendums()", "0xe2cdd42a": "vote(uint256,address,bool)", "0xd3f297d6": "claimLiquidityReward()", "0xf37b437b": "scheduleCall(address,bytes,uint256,uint256,uint8,uint256,uint256)", "0x2090cf8b": "consultBalance(address)", "0xc9296d14": "scheduleTransaction(address,uint256,uint256,uint256,bytes)", "0x7993e5c2": "Devcon2TokenForTesting()", "0x268bb78e": "propose(address,bytes,uint256,uint256)", "0x2b16b56a": "setIndex(uint256,uint256)", "0x6d15f208": "reject(string,uint256,uint16,address,uint256)", "0xc4ff3614": "Wallet(address[],uint256,uint256)", "0xb47d89ad": "Details()", "0x0ae08793": "confirmAndCheck(bytes32)", "0x061e494f": "getBet(uint256)", "0x314e99a2": "abdicate()", "0xe487eb58": "getOwner(bytes20)", "0x7ee65635": "LookAtDepositsToPlay()", "0x9e9d3aa4": "FirstBloodToken(address,address,uint256,uint256)", "0x4dfd1b02": "setUint8(int8,uint8)", "0x82fbdc9c": "register(bytes)", "0xa8b60b93": "ackMsg(uint256,string)", "0x081e806d": "PayOut(uint256)", "0x8bab8791": "testPkgUpdate()", "0xc262df45": "isKnownRequest(address,address)", "0x4123cb6b": "m_numOwners()", "0x62be3172": "Message(address,address,address,string)", "0x0d368fee": "deverify(address)", "0x5f1231ea": "getMemberInfo(address)", "0xa07daa65": "newRequest(uint256)", "0xa4406bcd": "placeSellOrder(uint256,uint256)", "0x5b7d47a9": "betOnColor(bool,bool)", "0x9c6034a7": "sendIfNotForked()", "0x26a4861c": "CROWDFUNDING_PERIOD()", "0xbaac5300": "createTokenProxy(address)", "0xfc72c1ef": "ERC20Base(uint256)", "0x316b08a0": "scheduleTransaction(address,bytes,uint256[7],uint256)", "0x0b590c6b": "SingularDTVToken()", "0x750e443a": "voteAgainst(uint256)", "0xfc7b9c18": "totalDebt()", "0x7ff9b596": "tokenPrice()", "0xd67cbec9": "release(uint32,uint32,uint32,bytes20)", "0x553cc48d": "Player(string)", "0x579cdf17": "getAdminName(address)", "0x7e1c4205": "query2(uint256,string,string,string,uint256)", "0x54107401": "declareLove(string,string)", "0xea4ba8eb": "getOutcome(bytes)", "0x9b5adea2": "setMinter()", "0x185061da": "undoIt()", "0x90c3a370": "AuctionMaster()", "0xbd02e4f6": "calcRandomNumberAndGetPreliminaryGameResult(uint256,uint64)", "0xbc126ba1": "totalCents()", "0xa3747fef": "register(bytes,bytes)", "0x805210b7": "AmIPlayer2()", "0x4e05ded6": "ClassicCheck()", "0xec2ac54e": "deposit(address,uint256,bytes32,uint256)", "0x49c15bd9": "Purchase()", "0x87bb7ae0": "getTicketPrice()", "0xf2f03877": "commit(uint256,bytes32)", "0x167d3e9c": "SetOwner(address)", "0x5c634241": "CanaryV6()", "0xba15e52e": "getInfo(bytes20)", "0x06c1df7b": "checkBetColumn(uint8)", "0xf7bc39bf": "owns(address)", "0x27b752b8": "sha3HexAddress(address)", "0x5ac801fe": "setName(bytes32)", "0x1ae460e5": "isInPool()", "0x85c7a953": "WithdrawFullBalanceFromBankAccount()", "0x755b5b75": "setNumUnits(uint256,uint256)", "0xaefc8c72": "unsealBid(bytes32,address,uint256,bytes32)", "0xfab43cb1": "getPongAddress()", "0x9e997121": "getConfigAddress(bytes)", "0xda2b7416": "testBitsAndFailIndexOOB()", "0xd0e30db0": "deposit()", "0x4a0d89ba": "getSwap(uint256)", "0x63a9c3d7": "verify(address)", "0x337b1cf9": "setIpfsHash(bytes)", "0xbaf00f76": "removeAllSubUsers()", "0x1b370abb": "getPreviousNode(bytes)", "0x741e2345": "registerMany(address,uint256,int256,uint256,bytes20,address,bytes)", "0xb3760c80": "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)", "0x73ffd969": "setMap(uint256,uint256,uint256)", "0x50b44712": "tickets(uint256)", "0x6a9d2afd": "playToWinTest(uint256)", "0x644998ae": "maintain(int256,uint256,uint256)", "0x2203ab56": "ABI(bytes32,uint256)", "0x9c67f06f": "registryStarted()", "0x93423e9c": "getAccountBalance(address)", "0x524e4e61": "testDistribution()", "0xa17042cc": "getMsgValue()", "0x4f9d719e": "testEvent()", "0xcbcaacab": "checkTransferWithReference(address,uint256,string)", "0x1bcf5758": "getOccupies(uint8)", "0x1d4b0796": "updateTxStats()", "0xd173707d": "hasPhysicalAddress(address)", "0xa54a2b8b": "testBlockHashFetch()", "0xc51bf934": "CEILING()", "0x0e54b872": "registerUser(string,address)", "0xba51a6df": "changeRequirement(uint256)", "0x6bd92f7c": "activateAllowanceRecord(address,address)", "0x90daaf67": "getMinimalDeposit()", "0x85d5c971": "logTransfer(address,address,bytes32)", "0x8b9e5385": "MeterSlock(uint256,uint256,address)", "0x7bcd7fad": "getRecordAtIndex(uint256)", "0x8e035ac1": "BetOnHashV82()", "0x5dbe47e8": "contains(address)", "0x21bb79fe": "luckyDogInfo()", "0xdd467064": "lock(uint256)", "0xa4beffa7": "increaseInvestment()", "0x8400c307": "isRecipientAllowed(address)", "0x0965bf7d": "processProposals()", "0x4b5dc8cb": "roundMoneyDown3SFExt(uint256)", "0x777feff5": "getCertificationDbAtIndex(uint256)", "0x9462eae5": "ChangeContractor(address)", "0x4c6d1d9e": "checkOutTag(string)", "0x09a399a7": "personAdd(string,int256,int256,string)", "0x31380c89": "TokenSale()", "0xd0bff051": "testSetBalanceDb()", "0x4c738909": "getMyBalance()", "0xb2310cc5": "payRequstedSum(uint256,uint256)", "0xda3c300d": "currentFee()", "0x6ed7c013": "move_monsters()", "0x4f073130": "takeOrder(bool,uint256,uint256)", "0x6860fd58": "Fees(uint256)", "0x214c9d50": "WritedrawStatus()", "0xf314bf46": "setReleaseDb(address)", "0x561a4873": "buyAd(string,string,string,uint256,uint8,address)", "0xf249cf19": "get_all_challenges()", "0xbbed7177": "getContentTimestamp(uint256)", "0xc864e760": "recordCommissionEarned(uint256)", "0x1896f70a": "setResolver(bytes32,address)", "0xfd35e71b": "entryPayoutDue(uint256)", "0x5a58cd4c": "deleteContract()", "0xb29b5366": "setRentable(bool)", "0xad5c613d": "purchase(bytes)", "0x6949a058": "sendOwnerEther()", "0xc03e382f": "calculateShare()", "0xf5bade66": "setDeposit(uint256)", "0x384e5018": "etherandomCallbackAddress()", "0xf06186c7": "testReality()", "0x677342ce": "sqrt(uint256)", "0x10e89b22": "remove_deal(uint32)", "0xf2b445ad": "rowround(uint256,uint256)", "0xd7ed7453": "redeemWinnings(uint256)", "0x92b4bb50": "rps()", "0x089327de": "MyToken()", "0x87ebd76c": "initContract(string,string,uint256,uint256)", "0xdbc45228": "newProposal(address,uint256,bytes,bytes)", "0x6b1feeeb": "get_my_sig()", "0x6837ff1e": "newContract(address)", "0x9f181b5e": "tokenCount()", "0x92ba4ba6": "GridMember(string,uint256,bool,address,address)", "0x45755dd6": "returnFunds(uint256)", "0xb4b9d1f1": "lookup(uint256,uint256)", "0x98024f18": "testThrowsTransferDisableNotEnabled()", "0x9e7b8d61": "giveRightToVote(address)", "0x8112821f": "EthVentures()", "0xe65d6b49": "getCommission()", "0x068c966b": "DrawDetails(uint256)", "0x9bb5239a": "CheckPrize(address,uint256)", "0xff08d2b0": "PayMiners()", "0x9be1fcee": "BankOwner_DisableConnectBankAccountToNewOwnerAddress()", "0x5f972df8": "_jDiv(uint256,uint256,uint256,uint256)", "0xfe8b6642": "setEnforceRevisions(bytes32)", "0xe4cc1161": "seedWithGasLimit(uint256)", "0x5fd4b08a": "getName(address)", "0xaa51793c": "isLosingBet(uint256)", "0x31757f2e": "collisionCount()", "0xe1f5ebc5": "_projectAddNew(address,uint256)", "0x64228857": "getRevisionCount(bytes32)", "0x5ca3400c": "WithBeneficiary(address)", "0x39f4debc": "fillOrderAuto()", "0xcc2c5453": "add_sword(uint16)", "0x0a19b14a": "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)", "0x4d207d9a": "identify(address)", "0x3e83fe36": "getMyShares()", "0x8bb0faee": "setRef(string,string)", "0x38bbfa50": "__callback(bytes32,string,bytes)", "0xcee6f93c": "getResultOfLastFlip()", "0xbbba3333": "safer_ecrecover(bytes32,uint8,bytes32,bytes32)", "0x8e19899e": "withdraw(bytes32)", "0xd8389dc5": "hash(bytes32)", "0x8a4068dd": "transfer()", "0xea9e107a": "acceptRegistrarTransfer(bytes32,address,uint256)", "0x8f4ffcb1": "receiveApproval(address,uint256,address,bytes)", "0xf67abd87": "entryDetails(uint256)", "0x67acd805": "lowerMinWager(uint256)", "0xec035393": "_getAllRevisionBlockNumbers(bytes20)", "0xbd858288": "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)", "0x112c7075": "ManualDeposit()", "0xd81a91e9": "get_party2()", "0xc52bd836": "setDappOwner(bytes32,address)", "0xf84f420b": "getRandomNumber(address,uint256)", "0xcfe9a7b8": "getPackageName(uint256)", "0xe97dcb62": "enter()", "0x48db5f89": "player()", "0x6bdbf8e6": "concat()", "0x3c959aca": "CheckTickets()", "0x3aa5f4f7": "changeTokenSettings(uint16,uint256,uint256)", "0xac20902e": "NormalizeMoney()", "0x2fac1d36": "isReadyFor(address)", "0xdcaa5620": "findNextWeekday(uint256,bytes)", "0xf9909915": "bulkStoreHeader(bytes,int256,bytes,int256)", "0xcd2cdd5b": "claimOwnershi()", "0xcfae3217": "greet()", "0xf5c8d71b": "forceMove(address,address,uint256)", "0x9718b524": "newTreasury(address)", "0xd0679d34": "send(address,uint256)", "0x1301ee02": "transferringETC(address)", "0x60eb2826": "Badge()", "0x0d0c2008": "TwoAndAHalfPonzi()", "0x17e1bfb7": "addInstitution(address,string)", "0x06394c9b": "changeOperator(address)", "0x80c951bf": "currentClaimPriceInFinney()", "0xd063f55f": "toLittleEndian(uint64)", "0x53f818d6": "checkBetValue()", "0x9205fbc2": "testAuthorityAuth()", "0x3e4c0c82": "player_1(uint256)", "0xe571c35e": "ReverseRegistrar(address,bytes32)", "0x24804cef": "Deed()", "0x622e88cb": "testBitsXorSuccess()", "0xdfca2f53": "LookAtPrizes()", "0xafa293d4": "getSource()", "0x755f99c2": "AddNewSmallContract(address)", "0x7137ed47": "setProxyContract(address)", "0x835b42fc": "testThrowUpdateLatestRevisionNotUpdatable()", "0xdd34e129": "PriceTest()", "0xedb27f4e": "switchWizard(address)", "0x1c5d9faa": "setNickname(string)", "0x4746cef8": "_confirmAndCheck(address,bytes32)", "0x189c94ae": "testFallbackStaticSig()", "0x0cb749b6": "FutureBlockCall(address,uint256,uint8,address,bytes,bytes,uint256,uint256,uint16,uint256,uint256)", "0x2b25a7e4": "giveKudos(address,uint256)", "0x294f3d4d": "setUpLimit(uint256)", "0x2cce81aa": "getBlockHash(int256)", "0x4cd11943": "NewManualInvestor(address,uint256)", "0x7eaef50c": "over()", "0x8ac4e1d8": "TemperatureOracle()", "0xf108a7d2": "withdraw(uint256,address,string)", "0x00a676f9": "getExists(bytes32)", "0xb8d4efb5": "validate_percent(uint8)", "0xc7489441": "closeMarketMaker(uint256)", "0x3def449b": "FipsNotary()", "0x5687f2b8": "emitApproval(address,address,uint256)", "0xa9f8ec6c": "AlarmClockTipFaucet()", "0xd8e5c048": "scheduleCall(address,uint256,uint256)", "0x135217e7": "requires_depth()", "0x0aa46c12": "testClearBitFailIndexOOB()", "0x77d32e94": "ecrecovery(bytes32,bytes)", "0xace523c4": "createReferendum(string,string,uint256,uint256)", "0x5ca8bc52": "returnIt()", "0xdb318833": "_ecAdd(uint256,uint256,uint256,uint256,uint256,uint256)", "0x623195b0": "setABI(bytes32,uint256,bytes)", "0xd7bb99ba": "contribute()", "0x2880ebe7": "underdogPayoutMarkup()", "0x4ce01d86": "totalBetValue()", "0x837a7ba5": "testThrowTransferDisabled()", "0x386fcda8": "testCreateCostToken()", "0x0e850239": "scheduleCall(bytes4,bytes)", "0x163aba3c": "getQueryFee()", "0x9941e3d0": "setCallAddress(address)", "0x23637e60": "votePrice(uint256,bool)", "0xde78e78a": "tokenLaunched()", "0xe3579ea5": "publish(string,string,address,uint256)", "0x59a547b0": "recordCommission(uint256)", "0x1aa86370": "updateXIPFSPublicKey(string)", "0x97fcb54e": "transfer_eth(address,uint256)", "0x05d2f92a": "check_depth(address,uint256)", "0xdfcbb794": "TrustFund(address,uint256,address)", "0xb7dd1d17": "getAllRevisionBlockNumbers(bytes32)", "0x75862df4": "TokenWithEStop(address)", "0xd22057a9": "register(bytes32,address)", "0x29d017b5": "TestWithConstructor(address,uint256[])", "0xd216d55d": "etherandomExec(bytes32,bytes32,uint256)", "0xfba06849": "fipsPublishDataMulti(bytes20[],bytes)", "0xa37fd390": "setHomeAdv(uint256,string)", "0xcf2e3efc": "GetBankAccountBalance()", "0x423e7e79": "_dispatchEarnings()", "0x74087040": "testBitsNotEqualSuccess()", "0x61d585da": "state(bytes32)", "0xcfb3a493": "getMyBounty(uint256)", "0x5afeb106": "Sqrt()", "0xf9e84395": "unexempt(address)", "0x5669c94f": "issueToken(address,string)", "0x19b05f49": "accept(uint256)", "0x3ae01f84": "USDOracle()", "0x8c172fa2": "getEvent(bytes32)", "0x4671e65e": "proposeEmergencyWithdrawal(address)", "0xc27d7721": "create(uint256[101][])", "0x5c52e51e": "processPayout()", "0xf7a0fa0a": "getShareDistribution(bytes)", "0x31a3a506": "closeFunding()", "0x465e759b": "testRestart()", "0xb60d4288": "fund()", "0x52200a13": "getNumHolders(uint256)", "0xf2c298be": "register(string)", "0x7bc25372": "UserCheckBalance(address)", "0x104d5fdd": "getPriceProxy()", "0x447cd682": "scheduleTransaction(address,uint256)", "0xa045fdff": "scheduleCall(address,bytes)", "0x4757f1d2": "redeemAllOutcomes(uint256,uint256)", "0x5e855f14": "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0x5d3c1d4c": "_getRequest(uint256)", "0x416c8701": "beyond()", "0x63aea3e0": "PlayerInfo(uint256)", "0xa163a624": "Test()", "0xedede601": "testBalance()", "0x13651124": "WithdrawAmountFromBankAccount(uint256)", "0x893d20e8": "getOwner()", "0x90b5561d": "insert(uint256)", "0xf9983a12": "GetMyInvestmentBalance()", "0xb71c47a2": "surrender()", "0xf2a75fe4": "empty()", "0x804ba97a": "tryGet(bytes)", "0x6506b623": "rotateBitsLeft(bytes,uint256)", "0x3ef8ec78": "announce_numbers(uint8,uint8,uint8,uint8,uint32,bytes32)", "0x73abecbb": "kill1()", "0xd5171523": "euroteambet()", "0x8e52cb51": "getRecordKey(bytes,bytes,bytes)", "0x7adbf973": "setOracle(address)", "0x4aa16737": "enter(uint8)", "0xf0cb556c": "updateLatestRevision(bytes32,bytes)", "0xbc8fbbf8": "nuke()", "0xc8e55708": "oraclize_query(string,string[1])", "0x7332b520": "getRewardsCount(uint256)", "0xf7c2b38c": "seconds_left()", "0xba344743": "_rawTransfer(address,address,uint256)", "0xcab5c0f1": "_incrementState()", "0xe044c2de": "newLoan(bytes,address,uint256,uint256,uint256,uint256,uint256,uint256)", "0x76abc03b": "getShareDistribution(uint256)", "0xf0da84f8": "getTransferable(bytes32)", "0xcde99727": "calculateROI()", "0x155dd5ee": "withdrawFunds(uint256)", "0x8b543b80": "maximumCredit(address)", "0x340ddda6": "MeatConversionCalculator(uint256,uint256)", "0x524f3889": "getPrice(string)", "0x84054d3d": "cashout()", "0x856f3080": "WhatWasMyHash(bytes32)", "0x0386a016": "closeProposal(uint256)", "0xcebce72d": "token(uint64)", "0x7f480f9d": "processDividends(address)", "0x11d12402": "testEasyPropose()", "0x2f695053": "getCertifierAtIndex(uint256)", "0xd9fcb31f": "comm_channel()", "0x141c4e60": "challenge(uint256,address)", "0x4ff13571": "x2()", "0xa01bc729": "monster_attack(uint256)", "0x2fe9541f": "addIssueBounty(string,uint256)", "0x5503a659": "smallponzi()", "0xdfc765dc": "getMatchers_by_index(uint256)", "0x0b7623ba": "abs(int8)", "0xcde0a4f8": "setRegulator(address)", "0xf95b5a58": "getInitialAnswer(uint256)", "0x66b42dcb": "register(address,string,uint256,string)", "0x9f2ce678": "vote(bytes32,bool)", "0xb3559460": "getGenerationSize(uint256)", "0x5ddae283": "transferRegistrars(bytes32)", "0x59dc735c": "getClient()", "0xc258ff74": "List()", "0x4fb4bcec": "step5()", "0xed684cc6": "trigger(uint256)", "0x09405164": "getOpenCandidates()", "0x5c5d625e": "getProof()", "0x9f5f7c7f": "tokenSplit(address,address,address,uint256)", "0x0e38901a": "unvault(uint256)", "0x75160a20": "pay_royalties()", "0x15398afe": "compareNumericStrings(string,string)", "0xbbd8b602": "getOracleOutcomes(bytes,address[])", "0xebae35a6": "DAOTokenCreationProxyTransferer(address,address)", "0x15abc160": "createValidatedRequest(address[3],address,uint256[11],uint256,bytes)", "0x830953ab": "claimAmount()", "0x26b916b4": "Set_Interest_Rate(uint256)", "0x1fb291cb": "registerInt(address,int256)", "0x505fb46c": "add(uint256,uint256,uint256)", "0xf00d4b5d": "changeOwner(address,address)", "0x034187fd": "setEthToCents(uint256)", "0x94d9cf8f": "CreateProxyWithControllerAndRecovery(address,address[],uint256,uint256)", "0xacbf98a7": "endsWith()", "0xfc2c3e08": "getIteration()", "0x6d7da0b1": "MyContract()", "0x1558ae4d": "Etheroll()", "0x42cbb15c": "getBlockNumber()", "0x29cd62ea": "setPubkey(bytes32,bytes32,bytes32)", "0x2030f721": "num_objects()", "0xbc08afd9": "WebOfTrustToken(address,uint256)", "0x8cdfb1e6": "transferIfHF(address)", "0xa0bd3c0f": "scheduleCall(address,bytes,bytes,uint256)", "0x4e71e0c8": "claimOwnership()", "0xc1cc0775": "calculateFeeDynamic(uint256,uint256)", "0x50c42921": "replicate()", "0x25495998": "getMinimumConsumerDeposit()", "0x3d8e2947": "getFileAddress(bytes)", "0x1f794436": "getBlockHeader(int256)", "0x7d380265": "addOptionChain(uint256,string,uint256,uint256,bytes32,address,int256[])", "0xec0b4153": "getMoneyness(int256,uint256,uint256)", "0x01775f23": "_closeBooks()", "0x9d063ed8": "FIFSRegistrar(address,bytes32)", "0x083b2732": "callback()", "0xa1920586": "offer(uint256,uint256)", "0x19c47214": "getBlockVersion(bytes)", "0xa293d1e8": "safeSub(uint256,uint256)", "0xfe73e3ec": "preliminaryGameResult(uint64)", "0xf004b12b": "CrowdFund(uint256,uint256,address)", "0x54d03b5c": "changeFeeMake(uint256)", "0x9dbc4f9b": "participantDetails(uint256)", "0xd002462b": "setDeploymentFee(uint256)", "0xed2b8e0b": "getPoolRotationDelay()", "0xf697a0ed": "ppb(uint256,uint256)", "0x964c836c": "receiveExecutionNotification()", "0x5e0e2957": "dumpOut()", "0x33232609": "blake2b(uint64[],uint64[],uint64)", "0x88f53db1": "getDataRequest(uint256)", "0x0caf9d39": "testFailTooManyMembers()", "0x1f2e886c": "testControllerTransferTriggersEvent()", "0x586a69fa": "getMaximumStackCheck()", "0xf64fca2e": "getNodeId(bytes)", "0x8b95ec0c": "testAddBalance()", "0x32e7c5bf": "B()", "0x57e6c2f4": "isAuthorized()", "0xb2f2588b": "sortNumbers(uint8[3])", "0xe95bee59": "checkFormat(string)", "0xcef887b0": "storeBlockWithFee(bytes,int256)", "0xbe26733c": "Kill()", "0xe82f7dd4": "testThrowsRetractLatestRevisionNotUpdatable()", "0xfd7ac203": "TestToken()", "0x6d052f56": "testBitsSetSuccess()", "0xf65c4d42": "Participate(uint256)", "0x432c685f": "trustClient(address)", "0xb0171fa4": "getCurrentGenerationId()", "0x03251a08": "setMin(uint256,uint256)", "0x58d3b617": "Notifier(string)", "0x15dacbea": "transferFrom(address,address,address,uint256)", "0x83f7b8e1": "getNumberOfPhotos()", "0xf1076703": "getVerificationId(address,bytes,bytes)", "0x752a3df6": "transferIfHardForked(address)", "0xaf93afdd": "Shipment(bytes,bytes,bytes,bytes,string,bytes,uint256,uint256,bytes,bytes,uint256,uint256,string,bytes,bytes,bytes)", "0x7fcf532c": "Withdrawal(address,uint256)", "0x72ea4b8c": "getNumInvestors()", "0x7df52ba8": "Arbitrate(uint32,uint32,bool)", "0xea25f24a": "TokenCreation(uint256,uint256,address)", "0xf74100e3": "getBits(bytes)", "0x63bfe3d8": "SkillBeatsLuck()", "0x80599e4b": "remove(string)", "0x6c050eae": "look()", "0xf9a794ad": "EtherLovers()", "0x501e8428": "getPart(bytes,uint256)", "0xf446c1d0": "A()", "0x2d67bb91": "World()", "0xeef547d7": "deal_details(uint32)", "0xa6cb9e64": "scheduleCall(address,bytes,bytes)", "0x659010e7": "m_spentToday()", "0x9b0b9c07": "acceptBankDraft()", "0x315e2f1b": "setTestString(string)", "0x69bcdb7d": "getCommitment(uint256)", "0xe1376da2": "updateFirstActiveGamble(uint256)", "0xc70d169d": "answerRequest(uint256,bytes)", "0xa094a031": "isReady()", "0x74e60a48": "cancelOrder(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", "0x1b5ee6ae": "mintToken(int256,address,uint256)", "0x7f791833": "toTimestamp(uint16,uint8,uint8,uint8)", "0x5e6ad49d": "_setCosignerAddress(address)", "0xb2e85b67": "getPlayerStatus(address,uint256)", "0x30a24abd": "create(bytes4,bytes)", "0x9f0e3107": "get_timestamp(bytes32)", "0x33397816": "withdrawAccountBalance(address)", "0x0da3e613": "EthFactory()", "0xa5f3c23b": "add(int256,int256)", "0xc1829a14": "testFailTooFewConfirms()", "0x5322f0c5": "getChannelOwner(bytes)", "0x0fd1f94e": "firstClaimBlock()", "0x639d57f2": "testGetBitSuccess()", "0xd3aa22c7": "transferTLA(string,address)", "0x86314af9": "BetOnHashV84()", "0x3059ac30": "Escrow(address,address)", "0x0efafd01": "getPlayerGainLossOnLastFlip()", "0x49bf66d3": "addRegistryIntoNameIndex(address)", "0x3af39c21": "undefined()", "0xb660d77c": "switchMPO(address,address)", "0x0fdb468f": "fee(uint64)", "0x72479140": "CreateTicket(address,uint8,uint8,uint8)", "0xe79a198f": "unregister()", "0x688dcfd7": "setProofType(bytes1)", "0xfb9a4595": "GitHubBounty()", "0xd02a9889": "getDateOfFirstPayment()", "0xca35271c": "numDebtors(address)", "0x08714bfa": "TestContract()", "0x16d960b5": "createThing(bytes32[],bytes32[],uint88)", "0x17961d0f": "ord()", "0x62ba9687": "toTimestamp(uint16,uint8,uint8,uint8,uint8)", "0xbba91ea7": "getHomeadvIndex(uint256)", "0xb45105b2": "post(string,address,string)", "0xa7e25683": "testShortOutput()", "0xa068e8d3": "convict(uint256,uint256,uint256,uint256)", "0x09a69f57": "getRewardAmount()", "0xe7334156": "processNextDeposit(address)", "0x62ee6d29": "changeHashtoLowOrHigh(uint256)", "0xa80d4e9a": "EtherAuction(uint256)", "0x18489f50": "thingExist(bytes32[])", "0x5323c6cf": "calcCostsBuying(bytes,uint256,uint256[],uint8,uint256)", "0x9a777d5d": "buyCoins()", "0x36344022": "testAuthorizedTransfer()", "0x8b863095": "setContractorProposal(uint256,bytes)", "0xd10e99fe": "mint(int256,bytes32)", "0x12c82bcc": "sendRobust(address,uint256)", "0x0bf75567": "voteSuperQuorum(uint256,bool)", "0xf5f6ea26": "EthOne()", "0x14918f5e": "performInitialWithdrawal()", "0xdf32754b": "owned()", "0x1632070c": "setRewardDivisor(uint256)", "0xe50a3bb1": "oraclize_query(string,string[],uint256)", "0x9b619d3b": "_deleteAllPackedRevisionBlockNumbers(bytes32)", "0x3b751f7f": "claimThroneRP(string)", "0xd55ec697": "upgrade()", "0x43703b0e": "getEventData(bytes)", "0xd1bf9aba": "nextRune()", "0x76849376": "addNode(bytes32,address)", "0xfd958695": "isAlphaNumeric(bytes1)", "0x9fa5e5d5": "setARKowner(address)", "0x6e2cde85": "drawPot(string,string)", "0x4d5b080c": "scheduleTransaction(uint256,address,uint256)", "0xf1e4a540": "unsetCoordinator()", "0x364f4896": "emission(address,address,uint256,uint16,uint16)", "0x9183fd01": "getSeedPrice()", "0x9832ee65": "resultsWeightedByTokens()", "0xdd5244b4": "testTryProxyCallWithValue()", "0xec2ec781": "testFailGetUnsetToken()", "0x7db9743b": "Registry()", "0x1adf2d1a": "Offer(address,address,bytes,uint256,uint256,uint128,uint256)", "0x1ba326c4": "calcShare(uint256,uint256,uint256)", "0x3ced842b": "make_offer()", "0xea295ec2": "calcRevenue(address)", "0x3c894475": "scheduleTransaction(address,bytes,uint8,uint256[6],uint256)", "0x477bddaa": "setContractAddress(address)", "0xed180443": "getUint256(int256)", "0xee725d44": "toChannelID(string)", "0xa4898fd5": "deployContract(address)", "0x75ee85bd": "salsa20_8(uint256,uint256)", "0xbe7c29c1": "getNewDAOAddress(uint256)", "0xfe01f1ff": "TokenTester()", "0x6103d915": "Winners(uint256)", "0xa30b5c69": "AttributeModel()", "0x81064e2d": "getCreditorAmounts()", "0x23584a21": "initStats(string,address,uint256)", "0xe2894a8a": "OwnerAnnounce(string)", "0xa84c5330": "createNewRevision(bytes20,bytes)", "0xb742398b": "trade(address,uint256,bytes,address,uint256,bytes)", "0x3211bb90": "OwnerAddFunds()", "0xa0befa94": "getStake(uint256,uint256)", "0x6dc3edcf": "executeExecutable(uint256,uint256)", "0x17e875e3": "Transparancy()", "0x6939864b": "lotteryState()", "0x3b107682": "DualIndex()", "0x51b3d7b9": "_transferWithReference(address,uint256,string)", "0xdf7cec28": "cancelBid(bytes32)", "0x1e74a2d3": "getMinimumEndowment()", "0x39b333d9": "Play(uint8,uint8,uint8,uint8)", "0xcbd08c8c": "config(uint256,uint256,uint256,uint256)", "0xca6ad1e4": "setCustomGasPrice(uint256)", "0x510f44cb": "TestFactoryUser()", "0xcee6ee38": "aEthereumlotteryNet()", "0x11610c25": "bet()", "0xb73405a9": "roundMoneyDownNicely(uint256)", "0xb8851fea": "endDateStart()", "0xa4325485": "getCreatorBalance()", "0x2c181929": "getChainWork()", "0xffb4c857": "_confirmAndCheck(bytes32)", "0x9e66cd38": "free(uint64)", "0x44e43cb8": "depositRevenue()", "0xa553a597": "configure(uint256,uint256,uint8,address)", "0xc47f0027": "setName(string)", "0x565a2ecf": "classicTransfer(address)", "0x1da0fb1b": "updateSettings(uint256,uint256,uint256,uint256,uint256,bool)", "0xa5ebf389": "getMoneyTotals()", "0x7f445c24": "subRegistrar(string)", "0x9ad4f98e": "BlocksureInfo()", "0xd6b4ec12": "getDailyWithdrawalLimit()", "0xe0886f90": "at(uint256)", "0x5dc77e26": "andThen(string,address)", "0xe7d50e5c": "FarmShare()", "0x3f2965f0": "registerSeller(address)", "0x85b73d3c": "testCreateNewRevision()", "0x49437210": "getUpdatable(bytes32)", "0xe1a9109d": "setSeedPrice(uint256)", "0x95978868": "strConcat(string,string,string,string,string)", "0x511b1df9": "addr(string)", "0xc5b1d9aa": "newRound()", "0xecf6eb22": "setConfigAddress(bytes,address)", "0x9a9c9c53": "DepositToBankAccount()", "0x27ea6f2b": "setLimit(uint256)", "0xd2dc0869": "add(string,uint256,string,string,address)", "0xc86a90fe": "sendCoin(uint256,address)", "0x5dfc2e4a": "noop()", "0xd81e8423": "get(address,address)", "0x4cad42d3": "testWager()", "0xd120a284": "getBytesFromNumbers(uint8[3])", "0x991ffd4e": "scheduleCall(address,bytes,bytes,uint256,uint256,uint8,uint256)", "0x60c311fd": "doBurnFromContract(address,uint256)", "0xbb6a0853": "GreedPit()", "0xc27b2c2d": "collectEarnings()", "0x446294ad": "multiAccessGetOwners()", "0x5bec9e67": "infinite()", "0x47e7ef24": "deposit(address,uint256)", "0x8d216186": "roll(uint256,bytes32)", "0xdf300b46": "getThing(bytes32[])", "0x5a6c787e": "updateWithMPO()", "0x1f2dc5ef": "divisor()", "0x421aeda6": "Set_your_game_number(string)", "0xba1162d7": "getFmLength()", "0x853255cc": "sum()", "0x20768ee8": "getProposalID()", "0xf5c57382": "nameOf(address)", "0x4e417a98": "callData()", "0xc90d080a": "registerEvent(bytes)", "0x0b1e400a": "_transferFromToICAPWithReference(address,bytes32,uint256,string)", "0xe420264a": "g(uint256)", "0x8a00a82f": "withdrawRewardFor(address)", "0x06638e92": "GetNumbersFromHash(bytes32)", "0xf63da25b": "Emailer()", "0xc01706dd": "getContentByRank(address,uint256,uint256)", "0xe1108706": "rfind()", "0xffd10e07": "enterPool(address)", "0xc4254c7b": "CoreWallet()", "0x30e0789e": "_transfer(address,address,uint256)", "0x992ae976": "isSafePunctuation(bytes1)", "0x4afce471": "test_requires_depth(uint16)", "0xda7fc24f": "setBackend(address)", "0xeb7402f5": "multiAccessHasConfirmed(bytes32,address)", "0x6c1a5b8c": "TOKEN_TARGET()", "0xb3a2a999": "nextWithdrawal(bytes16)", "0x4a420138": "scheduleHeartbeat()", "0xb1233451": "setTerm(uint256,string)", "0x266710ca": "manualUpdateBalances_only_Dev()", "0x98866c1a": "personUpdateDOD(uint256,int256)", "0xaa6be303": "debtors(address)", "0xda5c0a7c": "testDisown()", "0x8757a2cd": "test_depth(uint256,uint256)", "0xe1bedf2a": "AlarmTester(address)", "0x5dcbac7a": "registerBytes(address,bytes)", "0xa587da29": "setPackage(bytes,uint8,uint8,uint8,bytes)", "0xc3da42b8": "c()", "0x4b8772c1": "buyUnit(uint256,uint256)", "0x67f12ecf": "validate(address,uint256,uint256[101][])", "0x0bd089ab": "MyAdvancedToken(uint256,string,uint8,string,address)", "0x32829a23": "OpenBankAccount()", "0xdea06188": "NumberOfBlockAlreadyMined()", "0x61e539da": "testFailWrongAccountTransfers()", "0x8a3e44d4": "assetMoveInformation(address,address)", "0x1327d3d8": "setValidator(address)", "0x207c64fb": "validate(address)", "0x80acaafb": "profitDistribution()", "0x90b98a11": "sendCoin(address,uint256)", "0x8b147245": "update(bytes32)", "0x920c94df": "BuyTicketForOther(address,uint8,uint8,uint8)", "0x6f698fb5": "setMinimumQuorum(uint256)", "0xac5e81a9": "historyPayout(address)", "0x70d084c0": "SingularDTVCrowdfunding()", "0x67ce940d": "getOverhead()", "0x7a791524": "setNextFeePercentage(uint8)", "0xd6d902c4": "claimThroneFor(bytes,address)", "0xc71e48d6": "setOutcome(bytes32,bytes32[])", "0xef41e06f": "testThrowSetEnforceRevisionsNotOwner()", "0x70be4ffa": "testErrorUnauthorizedSetPackage()", "0x6d12301c": "getBetValue(bytes32,uint8)", "0x4e69d560": "getStatus()", "0x55234ec0": "remaining()", "0x5cfd8c24": "ResetPonzi()", "0xe29fb547": "scheduleCall(bytes4,uint256,uint256,uint8,uint256)", "0xbd119967": "add_rating(uint256,uint256)", "0x966acb38": "testThrowTransferNotTransferable()", "0x5c665f89": "getFunds(address,bool)", "0xa59d6986": "recoverLostFunds()", "0x403abbc7": "updateFirstActiveGamble()", "0x0230a07c": "releaseDeed(bytes32)", "0x2d116186": "deityBalance()", "0x602acca1": "InchainICO(address[],uint256)", "0xd393c871": "register(string,address,uint256)", "0xe0fe075e": "payoutReady()", "0xf3e3c629": "testBalanceOfStartsAtZero()", "0x48cd4cb1": "startBlock()", "0x669459a7": "removeRegistryFromOwnerIndex(address)", "0x74d89c47": "testUpdateNameDb()", "0x182db370": "getWhatHappened()", "0xf363441f": "getCreatorDotBalance()", "0x6896fabf": "getAccountBalance()", "0xb29a0308": "logAnonymous(bytes,bytes,bytes,uint256)", "0x3023d0c4": "Ethstick()", "0x1077f06c": "makeClaim(uint256)", "0x8a519fb9": "BlockChainEnterprise()", "0xbffbe61c": "node(address)", "0xe20bbd8d": "RecoveryWithTenant()", "0x03bda14e": "raiseMaxNumBets(uint256)", "0xe1041d86": "__throw()", "0x3d79d1c8": "bal()", "0xbd3f0965": "AiraEtherFunds(string,string)", "0xc388cca6": "testBitAndFailIndexOOB()", "0x921f98bb": "resolveFailVote()", "0x4bbb216c": "_target(address)", "0x10922cc1": "testTransferCost()", "0xeceb2945": "checkProposalCode(uint256,address,uint256,bytes)", "0x3df4ddf4": "first()", "0x21a49ec2": "LCoin()", "0x6d1f00a6": "ThroneMaker(uint256)", "0xcaed4f9f": "DataService()", "0x5cff876b": "carrotsCaught()", "0x3a7fb796": "mintGreen(int256,address,uint256)", "0x370b6939": "AdminSetDrawer(address)", "0x2d9a37d3": "getMaxPayout()", "0x739f888c": "setNewEstimate(int256,int256)", "0x04dd69fa": "getGenerationIdForCall(address)", "0xb764e273": "failSend()", "0xd4dfadbf": "getMarket(address)", "0xa0e67e2b": "getOwners()", "0x2d592a34": "sellKissBTC(uint256)", "0x8a341c83": "testErrorRootAuthorityChangeUnownedPackage()", "0xfcc6b5d5": "fillTheirOrder(address)", "0x61649472": "getPoolFreezePeriod()", "0x3dd297da": "safeMultiply(uint256,uint256)", "0x5d3278f0": "LooneyFifty()", "0x7399646a": "theRun()", "0x3e450fff": "adminDeleteAccount()", "0x93cc9162": "taskRejected(uint256,uint256)", "0xbc5d0f65": "beginExecution()", "0x1934d55a": "isPermanentlyApproved(address,address)", "0xf1cff4b5": "testBitsNotSetSuccess()", "0xf240f7c3": "dispute()", "0xf6d5959b": "getActionStatus(uint256)", "0x0f23cbaa": "recycle()", "0x74f8d96e": "getRevisionBlockNumber(bytes20,uint256)", "0x0bad342a": "EscrowContract(address,address,address,address,uint256,uint256,uint256,uint256)", "0xa6afd5fd": "getBets()", "0x84ad6ff3": "ReversibleDemo()", "0x62b3b833": "createCoupon(string)", "0x523ccfa8": "isKnownCall(address)", "0xacc8cb18": "pushTerm(string)", "0xa753d6f2": "CreateProposal(string,string,string,string,string,string,uint32,uint32)", "0xc5699d68": "_compare(int256,bytes,int256)", "0xe2faf044": "createDAO(address,uint256,uint256,uint256)", "0xa15afb48": "Replicator()", "0x352d2790": "UUID4()", "0x7dee2cad": "CancelMyInvestment()", "0xbeabacc8": "transfer(address,address,uint256)", "0x674f220f": "previousOwner()", "0x4b3b6168": "SetNewBigContract(address)", "0x54ba7daa": "enter(bytes,bytes)", "0x06fdde03": "name()", "0x5944427b": "getRequestResult(uint256)", "0x983ef725": "getDifficulty(uint256)", "0x9287c877": "getNavLength()", "0xa987d654": "restoreItem(uint256)", "0x05433a26": "GetNumbersFromHash(bytes)", "0xd04bfc9c": "buyer_pay()", "0x4a9b3f95": "personUpdateName(uint256,string)", "0xe6b972f5": "userName(address)", "0x88782386": "UnicornMilk()", "0x74580e2f": "changeCreator(address)", "0x1785f53c": "removeAdmin(address)", "0xad544dcb": "testSetNotUpdatable()", "0xafd09bab": "quadrupler()", "0x77bc222c": "_eraseSingleNode(bytes32)", "0x09957e69": "newSale(bytes,uint256,uint256)", "0xa21931ea": "CreateProposal(string,string,string,uint32,string,string,string,uint32,uint32)", "0xbb6b4619": "SendETC(address)", "0x3aa94b1d": "getCoinStats(uint256)", "0x9e2262f5": "testCreateCostData()", "0x2bf4e53d": "getCurrentShareholders()", "0x6111dd02": "calcCostsSelling(uint256,uint8,uint8,uint256)", "0x6b9b1006": "TransactionRecorder()", "0x83b23b40": "cEthereumlotteryNet()", "0x770c6cbb": "WithDrawPreForkChildDAO()", "0x67080f6e": "testThrowsSetEnforceRevisionsNotOwner()", "0xa10bee85": "_transferFromWithReference(address,address,uint256,string)", "0x49cc954b": "twoYearsPassed()", "0x88c3ba85": "ParallelGambling()", "0x03985426": "getMode(bytes32)", "0xad8ed335": "__proxy(address)", "0x306387a4": "dealStatus(uint256)", "0x0343dfa0": "checkInvariants()", "0x23df9df5": "_refund(uint256)", "0x837e7cc6": "rollDice()", "0x98b1e06a": "deposit(bytes)", "0xa0440426": "purchaseProduct(uint256,uint256)", "0x4cb71b9b": "getAllReleaseHashes()", "0x3a7d280c": "login(string)", "0xb9a904f9": "testUnauthorizedSetBetaPackage()", "0xe94a4db1": "isSuitableGen(uint256,uint256)", "0x60f8af90": "refundRound()", "0x43bf718e": "getHashOfTheProposalDocument()", "0x4a30f976": "censorship(uint256,bool,bool)", "0x47e46806": "toString()", "0x8d59cc02": "register(address,string,string)", "0xb3fb14ad": "getGameResult()", "0x4a23dc52": "FileStore()", "0x8da5cb5b": "owner()", "0x3cc8daf7": "setNameOwner(bytes,address)", "0x14cbdb54": "EspCoin()", "0xc47cf5de": "getAddress(bytes)", "0x71e11354": "updateRegistration(string,string)", "0x8b2e6dcf": "publish(bytes32)", "0x12d00c2e": "soloWithdraw(uint256)", "0xd68199dc": "gameStats()", "0xf0f967e8": "canCall(address,address,bytes)", "0xe0c7c117": "Randao()", "0xddeae033": "claimFor(address)", "0xcec7260b": "move_monster(uint16,uint16)", "0xe51ace16": "record(string)", "0x4f76cb02": "testGetBitFailIndexOOB()", "0x942385eb": "getPayroll()", "0x46d667db": "setBytes32(bytes)", "0x35a063b4": "abort()", "0xb1d51d31": "pay(uint64,address)", "0x7140bdf3": "get_all_best_offers()", "0x0380e2f3": "getHashOfTheSignedDocument()", "0x2feda2fa": "POI()", "0x3c0870ae": "challenge(uint256,uint256,uint256,bool)", "0x27a5c7c6": "voteDecline(uint256)", "0xafd8c8c4": "GasProxy(address,address)", "0x8de93222": "purchase(address,uint256)", "0x087e055a": "getConfigBool(bytes)", "0xbaccc92b": "RegulatorIfc(address)", "0x8c546f81": "GNT()", "0x57cb2fc4": "getInt8()", "0xe3083fb5": "removeFromContribution(uint256)", "0x1a092541": "getDescription()", "0x7486a8e3": "get_publisher(bytes32)", "0x089e0ad0": "buildDSMap()", "0x29161820": "Base(uint256)", "0xe2f8feb2": "internal_tester(int256)", "0x1d2dbb22": "CancelMyInvest()", "0x726ab4ef": "getParentHash(bytes)", "0x83d8a90f": "theDonkeyKing()", "0x9babdad6": "removeShareholder(address)", "0xdeb931a2": "getOwner(bytes32)", "0x90cb04e1": "buy(string,uint256,uint16)", "0x2ff92323": "oraclize_query(uint256,string,string[4])", "0xf91a792e": "decryptHand(string,uint256,uint256,uint256)", "0xebf6e91d": "hit(uint256)", "0xb085b9a5": "Example()", "0x07b2779f": "BasicRegulator(address,uint256,uint256)", "0xe10e5dce": "_build(bytes)", "0x3e239e1a": "getHour(uint256)", "0xacc5a0dc": "GetPrize()", "0xa79deb4f": "acceptTradeDeal()", "0xd7c26adb": "oraclize_setProof(bytes1)", "0xc6a17d2b": "pow10(uint256,uint8)", "0xa87d942c": "getCount()", "0xe706918c": "testToggleBitSuccess()", "0xc1812b15": "reorganizeOwners()", "0x7c7c7695": "getAccountID(address)", "0x1a26ed1c": "validateReservedWindowSize(uint256,uint256)", "0x87393bc6": "verifyFirstHalf(uint256[4],uint256[4])", "0x2e52d606": "n()", "0x2037fcbf": "withdrawInvestment(uint256)", "0x77228659": "query2(uint256,string,string,string)", "0xf67a1d37": "BlockChainChallenge()", "0xc67146a5": "check_bet(uint256,address,uint8)", "0xc89f2ce4": "funds()", "0x58e29e17": "initiateProof()", "0xf0e10c0d": "play(address,uint256)", "0x480b70bd": "scheduleCall(address,bytes4,uint256,uint256)", "0x5294157f": "sendWithAllOurGasExceptExt(address,uint256,uint256)", "0xad447a19": "getBalanceDB()", "0x41095b60": "voteForUltimateOutcome(bytes,uint16)", "0x5521d17b": "betOnColor(bool)", "0xc8f8d75d": "Config(uint8,address)", "0x10ae4ce2": "setReleaseValidator(address)", "0x9fd4f7d1": "replaceWizard(address)", "0x77c78df9": "getCurrentLevel()", "0x1dda5c7d": "testFailSubBalanceBelowZero()", "0x21e5383a": "addBalance(address,uint256)", "0xb0414a2d": "setMinimumGasLimit(uint256)", "0x919840ad": "check()", "0xf651bf44": "move_to(uint16)", "0x0b97bc86": "startDate()", "0x29f1bff4": "withdrawFromChildDAO(uint256)", "0x7a02dc06": "getInfo(bytes32)", "0xe5bf93b9": "balanceEther(uint256)", "0x288c6ed2": "getSeedCost(uint256)", "0x4db3da83": "scheduleCall(bytes4)", "0x270cfee1": "getTokenAccount()", "0xb5d03751": "YoutubeViews()", "0x27e056a5": "addMinter(int256,address)", "0xfa7d68f1": "getAccountInfo(uint256,uint256)", "0x09fc8f6d": "isTokenUpgraded(bytes32)", "0xa5b9e922": "getContentTimetamp(uint256)", "0x1f8947c1": "extractUint(int256,bytes,uint256,uint256)", "0xbcc941b6": "totalWinners()", "0x1db71ffb": "doLoops(uint256)", "0x35ae41c9": "godAutomaticCollectFee()", "0x42cf0e72": "searchByOwner(address)", "0x69f18967": "testSetBitFailIndexOOB()", "0x57b07cd9": "getReleaseHash(uint256)", "0x2baf4f22": "_safeFalse()", "0x3133f2a7": "outstandingBalance()", "0x773c84ee": "exec(address,bytes,uint256,uint256)", "0x9070b18d": "_getAllRevisionBlockNumbers(bytes32)", "0x476e04c7": "NewMessage(string)", "0x3b91ceef": "setMax(uint256,uint256)", "0xe6cb9013": "safeAdd(uint256,uint256)", "0xc2038560": "setOutcome(bytes,bytes)", "0xbed34bba": "compareStrings(string,string)", "0xba8661a2": "TimestampScheduler(address)", "0x4c4aea87": "getReleaseData(bytes32)", "0x1177892f": "getBalanceByAdress(address)", "0x126a710e": "dnsrr(bytes32)", "0x60913244": "botOnSale(uint256,uint256)", "0x5731f357": "oraclize_query(uint256,string,string,string)", "0x3e58c58c": "send(address)", "0x2187a833": "setGreenToken()", "0x5f09952e": "voteAllowTransactions(bool)", "0xf2b26d8f": "nextEtherForSale()", "0x1f201e39": "etherandomExecWithGasLimit(bytes32,bytes32,uint256,uint256)", "0x43d726d6": "close()", "0x6cdf4c90": "ownerSetMinBet(uint256)", "0xe6e8c692": "computeResponseFirstHalf(uint256,uint16)", "0xd1d80fdf": "setAddr(address)", "0x6da1833c": "getInstitutionByName(string)", "0x7682e6ff": "getTrustSetting(address)", "0x8f6f988c": "setUltimateOutcome(bytes)", "0xe299beb3": "SimpleIndex()", "0xa2bb5d48": "get_username(address)", "0x780900dc": "create(uint256)", "0x78710d37": "seven()", "0x2b20e397": "registrar()", "0x4094ef5e": "addDataRequest(string)", "0xc630f92b": "canEnterPool()", "0xdd114c22": "publish(address,uint256,address,uint256)", "0x57006864": "checkBetParity(uint8)", "0x45788ce2": "prev(address)", "0xee8ff562": "setMaxProfit()", "0xdc63a62c": "getFileListHead()", "0x9447fd0a": "until()", "0xb303dcbd": "Owned()", "0x0ecaea73": "create(address,uint256)", "0x20339891": "addGridMember(address)", "0xc8c01a55": "request(address,uint256)", "0x76f10ad0": "getSnapshot(uint256)", "0xc06c4474": "get_burned(bytes32)", "0x67cb61b6": "getChoice()", "0xca708230": "funnel()", "0x08b7fa31": "PriceFeed()", "0xac6bc853": "startSpin()", "0xf4bbfd6a": "scheduleCall(bytes,bytes)", "0xab73e316": "next(address)", "0xba0179b5": "confirm(uint256)", "0x1e62be25": "Bytes32Passer()", "0xb950556a": "setThingValid(bytes32[],bool)", "0xb61c0503": "fireEventLog1()", "0x79a85e6c": "getProductInfo(uint256)", "0x959ac484": "push(uint256)", "0x78e80b39": "UserGetPrize()", "0xff74927b": "strConcat(string,string)", "0xd207e757": "ownerSetOraclizeSafeGas(uint32)", "0x5819dde2": "getNumbersFromBytes(bytes3)", "0xf34ed4e6": "RanDAOPlus(address)", "0x3943807b": "insert(bytes,bytes,int256)", "0x38cc4831": "getAddress()", "0x12a7b914": "getBool()", "0xa4fd6f56": "isEnded()", "0x6c86888b": "testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)", "0x0bebd0f9": "addAddressToGeneration(address,uint256)", "0x003074ff": "getFrontend()", "0x2776a859": "computeResponseSecondHalf(uint16)", "0xadfe6b80": "InvestAdd()", "0x6981b5f4": "getLength(string)", "0x4a994eef": "setDelegate(address,bool)", "0xbac1e9f6": "getChannelSize(address,uint256)", "0xbdfdb519": "accept(string,uint256,uint16)", "0x68f5aa0f": "setShareholderDB(address)", "0xafb95eed": "logApproval(address,address,bytes32)", "0xae152cf4": "oraclize_query(string,string,uint256)", "0xe3b26a8c": "SocialNetwork()", "0x54204ad4": "triple()", "0xbc8f3bcb": "ZeroDollarHomePage()", "0xf0350c04": "transfer_ownership(address)", "0xfde9ba41": "transfer(bytes,address,uint256)", "0xfa2acd87": "G(uint64[16],uint256,uint256,uint256,uint256,uint64,uint64)", "0x3a76abff": "_eraseNode(uint256,bytes32[],bytes32)", "0x0acf473b": "AdminCloseContract()", "0x299e7318": "resolveVoting()", "0xb414d4b6": "frozenAccount(address)", "0x8d375da2": "testMakeItFail()", "0x6e8dad74": "retrieveAccountBalance(bytes,bytes)", "0xd3aa831f": "testOwnedTryAuth()", "0x13220305": "doTransferOther(address,address,address,uint256)", "0xb0c7f709": "kingAutomaticCollectFee()", "0x2dabbeed": "reclaim(uint256)", "0x5c19a95c": "delegate(address)", "0xbc2a4dd6": "doBalanceOf(address)", "0x8e7ea5b2": "getWinner()", "0xdb37e42f": "multisetProofType(uint256[],address[])", "0xa6b197aa": "Order(address,uint256)", "0x8cf4dbfb": "collectBalance()", "0xd0821b0e": "bet(uint8)", "0xa02b161e": "unregister(uint256)", "0x09dd0e81": "getBlockchainHead()", "0x8a0807b7": "indexOf(string,string)", "0xe3914699": "dEthereumlotteryNetWinners(address)", "0x44d75fa9": "updateMinorTree(bytes32)", "0x3c21db0a": "theGames(uint256)", "0xf0e959f9": "TokenSales(address)", "0x696bda86": "submitProposal(uint256,bytes)", "0x3b343a13": "getNodeAddress(bytes)", "0x2812f8b8": "FutureCall(address,uint256,uint16,address,bytes4,bytes,uint256,uint256,uint256)", "0xbf32bf97": "FailGuyTax()", "0x89ced196": "setNotUpdatable(bytes32)", "0xb94e962a": "allocateTickets(uint256)", "0x7a479160": "getRequestArgs(uint256)", "0x5a825cbb": "getPayment(uint256,uint256)", "0x4ca8b0d0": "registerExistingThrone(bytes,address,uint256,uint256)", "0x82afd23b": "isActive(uint256)", "0x6ebf10fe": "storeHeader(bytes,address)", "0x1437f9a3": "Set_your_game_number(uint16)", "0xd98d011d": "getCandidateKey(bytes,bytes,bytes,bytes)", "0x8b676ae8": "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256,uint256)", "0x90fd53ec": "farmTile(uint8,uint8,int8)", "0x46e44f63": "getCheckRecordTS(bytes)", "0x1de38038": "makercoin(uint256)", "0xc038a38e": "totals()", "0xfa80918b": "computeNodeId(bytes,bytes)", "0xc76a4bfb": "relayReceiveApproval(address,address,uint256,bytes)", "0x2406cedb": "setPackageOwner(bytes32,address)", "0xb7297cf3": "gameSettings()", "0xe94acf0e": "TinyRouter(address)", "0x4a2b0c38": "DividendProfit()", "0x0e3f732a": "TheGame()", "0xd62457f6": "callValue()", "0x4961b40c": "getReleaseValidator()", "0x540cafe0": "storeHeaderWithFee(bytes,int256,address)", "0x7ff729fc": "fillUpProject(uint256,uint256)", "0x253459e3": "feesSeperateFromBalanceApproximately()", "0x930a80b4": "testAuthorizedSetPackage()", "0xb3cb8885": "nextUnderdogPayout()", "0x62c7855b": "getConfigBytes(bytes32)", "0x4f28af6a": "handleBet(uint256)", "0x103f9251": "transferFrom(address,address)", "0x9b19251a": "whitelist(address)", "0x9928811b": "testBroken()", "0xb33a8a11": "setTokenReference(address)", "0x27f06fff": "requestFillUp(uint256)", "0x2f570a23": "test(bytes)", "0x96ef7aa0": "cash_transfered(string)", "0x3983d5c4": "calcBaseFee(uint256)", "0xec0f1025": "testBitsOrSuccess()", "0xd35f4a99": "mint(int256,address,uint256)", "0x09dfdc71": "currentPyramidBalanceApproximately()", "0xac4e73f9": "proposeReverse(string,address)", "0xac4bd53a": "currentLeader()", "0x5a2ee019": "m()", "0xeba36dbd": "setAddr(uint256,address)", "0x0358d965": "addPayout(uint256)", "0xd7206124": "setInvestorLock(bool)", "0xe916d0f0": "doBalance(address)", "0x67c2a360": "authorizeUser(address)", "0x828d671c": "dyn_sig()", "0xaf6fe8e2": "testGetToken()", "0x283a4576": "Tomeka()", "0x8ac0ca36": "buyViaJohan()", "0xcc872b66": "issue(uint256)", "0xd826f88f": "reset()", "0x2aa3177a": "self_store()", "0x53b7b2e9": "cEthereumlotteryNet(bytes)", "0xce88b145": "getAccount(uint256)", "0x1fa03a2b": "isApprovedFor(address,address)", "0xe42d5be0": "getPaymentOf(address)", "0xb722a9ef": "getPreviousShareholder(address)", "0xfadf87b1": "testGetBitsSuccess()", "0xd26c8a8a": "coinBalance()", "0x30ccebb5": "getStatus(address)", "0x47799da8": "last()", "0x4a5db3b5": "authorizeAddress(address)", "0x22686250": "index(int256,uint256)", "0x07ef99a0": "demintTokens(int256,address,uint8)", "0xea2d4cf8": "__DeployerFunctions(address,address,uint256)", "0x092a2e37": "multiAccessAddOwnerD(address,address)", "0x671fa0a0": "Inscription(string)", "0xa10edc55": "GeneralPurposeProfitSplitter()", "0xd9c67404": "getMerkleRoot(bytes)", "0xdc419fd8": "cancelOrder(bool,uint256)", "0xc9734ebd": "WatchLastPayout()", "0xc7d6faf1": "easyPropose(address,uint256)", "0xfe63300a": "registerExternalBill(uint256,address,address,uint256,uint256,uint256)", "0xd3437fe0": "assertFact(uint256,bytes)", "0x5fb3e119": "Auction()", "0x665beae7": "ExecutableBase(bytes)", "0xc8bb73ef": "testGetBitsFailIndexOOB()", "0xc1d4f708": "getMwLength()", "0x22b0f6ee": "getStatusOfPayout(uint256)", "0x21520c5f": "calculatePayout(uint8,bool,uint256)", "0x66e98c31": "createCoin(string,uint256,uint256,string,string,address)", "0x7b352962": "isFinished()", "0x48d9614d": "GetFee()", "0xfe0d94c1": "execute(uint256)", "0xe4547f98": "documentExists(bytes)", "0x4e10c3ee": "transferWithoutReward(address,uint256)", "0x58ae8bcf": "voteInMasterKey(address)", "0x1dcb304b": "fipsGenerate()", "0xb595181f": "ShapeshiftBot()", "0xe02426c1": "getSignatureHash(bytes4,uint256)", "0x67546967": "EthBtcEscrow()", "0x85b31d7b": "myInfo()", "0xaa677354": "register(address,address)", "0x1d2e2cc4": "ENS()", "0x1097e579": "Enter()", "0x13a396d8": "getRequiredDeposit(bytes)", "0x6df3edef": "getSavedBytes()", "0x09b30ed5": "afterExecute(address)", "0x718e6302": "play(string)", "0x8e46fbb2": "testBitsXorFailIndexOOB()", "0x0d87a7c0": "WLBDrawsDB()", "0xbbe42771": "closeDeed(uint256)", "0xedfbf7b6": "setVotingDeadline(uint256)", "0x299e6b07": "Wallet(address)", "0x5cbc85d0": "returnBounty(uint256)", "0xe5225381": "collect()", "0x94f60a63": "getKudosLeft(address)", "0xd6960697": "confirmPurchase()", "0x4a1f0bf6": "inheritToNextGeneration(address)", "0x244ded7a": "ChangeOwnership(address)", "0x39b35753": "authCancel(address)", "0x75cb2672": "configure(address)", "0x938ae4cc": "testThrowDisownNotTransferable()", "0x04fc11d5": "getActual()", "0xacab021c": "getTOS(address)", "0x812cddf2": "getSavedString()", "0x8ae475a9": "notorize(string)", "0xb1d05422": "SendEmail(string,string)", "0x0fffbb54": "changeRankingSize(uint256)", "0xb6ed9f15": "PFOffer(address,address,bytes,uint256,uint256,uint128)", "0xda333ca6": "payOut(uint256)", "0x652f1f16": "addSignature(string)", "0x983b2d56": "addMinter(address)", "0x5e1936d4": "testThrowSetNotTransferableNotOwner()", "0x4ac1ad78": "getWeekday(uint256)", "0x6ba0b4f2": "isKnownSelector(bytes4)", "0x7c4c27c8": "isThisPuritanicalVersion()", "0x7ae2b5c7": "min(uint256,uint256)", "0x63bd1d4a": "payout()", "0x3fd94686": "changeEligibleDonkeys(uint256)", "0x7fe0518a": "asyncSend(address,uint256)", "0x5a8dd79f": "getDesignatedCaller(address,uint256)", "0x2635f4de": "registerLibrary(bytes,address)", "0x1335ff36": "createEventAndMarketMaker(uint256,uint256,uint8,uint32,address,uint256,uint8,uint16,uint256)", "0x181be00d": "getValue(uint8)", "0x9c1500f0": "registerMany(address,uint256,int256,uint256,bytes,address,bytes)", "0x16f9ce49": "_slotCommitNew(address)", "0x8ca4eef6": "getBuild(bytes32)", "0x8ee21b8e": "get_default_keys()", "0xa66f7ad6": "signRelease(uint256)", "0x414053be": "best_adjustment_for(bool,uint128)", "0x83a51ad0": "oraclize_setConfig(bytes32)", "0x262c0b72": "getPayoutFreezePeriod()", "0x499af77c": "current_spin_number()", "0x4209fff1": "isUser(address)", "0x6e1b6bcc": "checkMyBet(address)", "0xb46300ec": "send()", "0x6b1cb549": "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)", "0x58d9fa04": "addUser(uint256,address)", "0x24c93343": "error(string)", "0xa95d017d": "getRevisionBlockNumber(bytes32,uint256)", "0x46af23f5": "InstantLottery(address,address,bool,address)", "0x29ef56b1": "getAskOrderBookStats()", "0xe97db66e": "setJackpot()", "0x4b59e880": "puzzle(address,bytes32,bytes32)", "0xc7f86c37": "withdrawFundsRP()", "0x57d4021b": "nextPayoutWhenPyramidBalanceTotalsApproximately()", "0xf1c760ae": "fixBalanceInternal(address)", "0x0908178f": "NoFeePonzi()", "0x22ebb3ac": "DieselPricePeg()", "0xb39a64cd": "getNumCalled()", "0x1c02708d": "killContract()", "0x65228934": "setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0x3397ca17": "numBalanceRecords(address)", "0xe436bdf3": "Draws(uint256)", "0xaf55bba0": "removeRegistryFromTagsIndex(address)", "0x11103599": "Token_Offer(address,address,uint16)", "0xb3a2a6c0": "setOfficialWebsite(string)", "0xb06eb03f": "DSEasyMultisig(uint256,uint256,uint256)", "0x775c300c": "deploy()", "0xb1c6517a": "LookAtNumberOfPlayers()", "0xc19d93fb": "state()", "0xac9873c7": "CanaryV7()", "0x750cae6a": "enableBetting_only_Dev()", "0xdf3c8620": "num_challenges()", "0xbb00fc55": "bookEarnings()", "0x0bd2ae1c": "ERW()", "0x580bdf3c": "disableBetting_only_Dev()", "0x5c3f9765": "endDateClose()", "0xc4128b6d": "upgradeCount()", "0x140b4465": "executeSpendingRequests()", "0xfaa1a8ff": "getOwnedBot(address,uint256)", "0x40e58ee5": "cancel(uint256)", "0xf4ea95b9": "validateReleaseVersion(uint32[3])", "0x2ba0b09f": "AddNewCategory(bytes4,uint8,uint8,address)", "0x55db4092": "setTOS(address,bool)", "0xf9cc0605": "getAvailable()", "0x3f2f46b4": "revealRock(string)", "0x2af7ceff": "testPrice(uint256)", "0xcaaf2dd7": "getInitialAnswerResult(uint256)", "0x6f36ce79": "insert_deal(address,address,uint64,uint128,uint32)", "0xa18c751e": "set(bytes,bytes)", "0x4d536fe3": "doit()", "0x3197cbb6": "endTime()", "0xb83069c5": "getStemPrice()", "0x3f15457f": "ens()", "0x81ebdeea": "testThrowCreateWithNonceRetracted()", "0x249b4d0b": "removeTrustedIssuer(address,bytes)", "0xe7b48f74": "get(int256,address)", "0x089d5c4a": "repr()", "0x3a9e7433": "scheduleCall(bytes4,uint256,uint256,uint8)", "0x504f1671": "getSize(address)", "0xf3a44fe1": "withdrawForWorkshop()", "0x7a837213": "setAllowedAccount(address)", "0x4551b1d7": "ProxyPayment(address,address)", "0x5dac1601": "SimpleStablecoin()", "0x87914c6f": "prolongateContract()", "0xe3ceb06d": "YesNo(bytes32,address,string,address,uint256)", "0x42a745cb": "testBitEqualSuccess()", "0xaa8dea8c": "fipsAddToLedger(bytes20,address,bytes)", "0x986dcd4d": "setCycleLimit(uint256)", "0x1e44c112": "find_strike(uint64,uint32,uint32)", "0x1ecfe64d": "_jSub(uint256,uint256,uint256,uint256)", "0x4ae85627": "grindUnicorns(uint256)", "0x200ebe34": "addTokensToGive(address)", "0x7b632c41": "TimestampScheduler(address,address)", "0x979b6f6f": "RoundInfo()", "0xb3ea3924": "PointlessCoin(int256,uint256,string,uint8,string,address)", "0x1d834a1b": "insert(uint256,uint256)", "0x931df75f": "validateProposedThroneName(bytes)", "0x6189be15": "columnround(uint256,uint256)", "0xdf5dd1a5": "addOracle(address)", "0x22d8cf5b": "CheckUserVote(uint8,uint8)", "0xdd62ed3e": "allowance(address,address)", "0xc0eb2325": "scheduleTransaction(address,bytes,uint256)", "0x038461ea": "getCertifiedStudentsCount()", "0x9ee035c9": "lookupCanonicalFormat(bytes)", "0x0ab58ead": "SingularDTVFund()", "0x550ed1f0": "getMaxBetAmount()", "0x6e63015c": "getCertifiersCount()", "0xbbd4f854": "buyShares(bytes32,uint8,uint256,uint256)", "0x306b031d": "getGenerationEndAt(uint256)", "0x1bd9c46e": "setImporter()", "0xc80c28a2": "getNumberOfParticipants()", "0xcb553ac9": "sweepWizardCommission(uint256)", "0x6389654e": "changeDailyWithdrawalLimit(uint256)", "0xc0a963c9": "notifyWinner(address,uint256)", "0x3c335b0e": "getRetractable(bytes20)", "0x017972af": "getNumbersFromHash(bytes32)", "0x07da68f5": "stop()", "0x1e8c72b4": "incrUserAvailBal(address,uint256,bool)", "0x0df71602": "setWinner(uint256)", "0x85e5bb3a": "Security_AddPasswordSha3HashToBankAccount(bytes32)", "0x2ade6c36": "getNodeAddress(bytes32)", "0xb33926cb": "owner_withdraw(uint256)", "0x57764094": "getRate(uint256)", "0x13827950": "getShareholderDB()", "0x26826bf8": "setImage(bytes)", "0x76d438b0": "sendReward(uint256,uint256)", "0x51d6e547": "getNonce(bytes)", "0x4f24186a": "newProposal(string)", "0x1a695230": "transfer(address)", "0xe820a32f": "vetoPayout(uint256,uint256)", "0xfb3a1fb2": "getReleaseDb()", "0x6bae05cf": "preRegister(address)", "0xae2df7b3": "setImporterBank()", "0x56d73ad1": "getCertifierDb()", "0x8396392d": "add(string,string,string,address)", "0xeb08b304": "changeMeatProvider(address)", "0xb60e72cc": "log(string,uint256)", "0x76999896": "KingOfTheEtherThrone()", "0xea851885": "buyStake(bool)", "0xa5982885": "assertFalse(bool)", "0xfbf1f78a": "unapprove(address)", "0xc2ba5b40": "getPackageData(string)", "0x83d51a38": "concatString(string)", "0x68af4971": "registerListening()", "0x14ba5c09": "getDay()", "0xe4849b32": "sell(uint256)", "0x44dd4b3b": "lookupGeneration(uint256)", "0x3fda1281": "get_keys()", "0x09241200": "wasSuccessful()", "0xbc9147a4": "Foundation()", "0xe33734fd": "changeProposalDeposit(uint256)", "0x2cce4abe": "_finishNoCallback()", "0x45e965cd": "strConcat(string,string,string,string)", "0xd4245e5b": "transferringETH(address)", "0x10082bff": "getActorBillXdetail(address,uint256,bool)", "0xc831391d": "getPoolOverlapSize()", "0x15e33901": "digest(bytes,uint256)", "0x5f0edfb8": "create(bytes,bytes32,bytes1)", "0xadd4c784": "getResult(bytes32)", "0x3233c686": "claimerDeposit()", "0x187a62d5": "voteEmergencyWithdrawal(bool)", "0x5404bbf7": "getEntropy()", "0x3f5b7675": "periodTwo()", "0x7ec0f30d": "ack(string)", "0xd30a512e": "betOnColumnOrDozen(bool,bool,bool)", "0x9fcbc738": "setIntermediate(address)", "0x539e2bfb": "secondChainedCallback(uint256)", "0xe724529c": "freezeAccount(address,bool)", "0x5aa97eeb": "getMarkets(bytes32[],address)", "0xc51be90f": "query_withGasLimit(uint256,string,string,uint256)", "0x531b97d7": "oneCentOfWei()", "0xeace4827": "player_make_bet(uint8)", "0x9c851ebc": "new_entry()", "0x98c9cdf4": "getMinimumCallGas()", "0xd8f012c6": "StatelessFactory(string,string,string)", "0xceeafd9d": "withdrawFundsAdvancedRP(address,uint256,uint256)", "0xd6d7d525": "get(bytes)", "0xbf55486b": "Tanya()", "0xd35ada32": "addParticipant(address,address)", "0xa8239d0b": "getPrice(string,address)", "0x12514bba": "transfer(uint256)", "0xb00140aa": "getHash(bytes)", "0x36f66528": "EtherDelta(address,uint256,uint256)", "0x279e0912": "getDownloadPrice()", "0x8173b813": "setNumCities(uint256,uint256)", "0xb98fdc36": "IconomiToken(uint256,string,uint8,string,uint256)", "0x3c7a3aff": "commit()", "0xcac77df7": "__transferFromToICAPWithReference(address,bytes32,uint256,string)", "0xfbeaebc6": "murder()", "0x2fa7cbfb": "getExecCost(uint256)", "0xe44d3084": "testFailure()", "0xede8acdb": "startAuction(bytes32)", "0xd5544f94": "getFundsAndAvailable(address)", "0x3824d8ee": "buy100DaoFor1Eth()", "0xbe3945e4": "getFee(address,address,uint256)", "0x1917ab5c": "activate(string)", "0x23509e69": "donkeysEligibleForFees()", "0xf460590b": "updateSigner(address,bool)", "0xc55c1cb6": "queryN_withGasLimit(uint256,string,bytes,uint256)", "0xd96d7ea2": "PRE_EXECUTION_GAS()", "0x1f7b6d32": "length()", "0xacf8bf2a": "channelCount()", "0x18968a03": "finalize(uint256,address,address)", "0x5674a3ed": "runLottery()", "0xe3280126": "addOrder(string,bool)", "0x32afa2f9": "claimEtherOwner(uint256)", "0x355474d2": "commitReading(address)", "0x00601d6c": "board(uint256,uint8,uint8)", "0x2667f407": "__proxy(address,bytes)", "0x79716e43": "confirmTransaction(bytes32)", "0x272cda88": "EternalDB()", "0x76ca0c77": "scheduleCall(address,bytes,uint256,bytes,uint256)", "0x338b5dea": "depositToken(address,uint256)", "0xfa93f883": "getMinute(uint256)", "0xafc4a982": "PathCost(uint16,uint32)", "0xf7d97577": "setPrice(uint256,uint256)", "0x842bc37b": "GetSmallCotractIndex(address)", "0x75f40f40": "underdogPayoutFund()", "0x23a1c271": "setPongval(int8)", "0x02571be3": "owner(bytes32)", "0xf79b22e0": "betOnATeam(uint256)", "0x10cf5d47": "awaitingPayout()", "0x1b00fe51": "testHypothesis()", "0xd449ce7c": "Administered()", "0x455259cb": "getGasPrice()", "0x975057e7": "store()", "0xdfdb5f17": "doBurn(address,uint256)", "0xaa497b9d": "scheduleCall(address,uint256,bytes,uint256,uint256,uint8)", "0xcabfb934": "replace(address)", "0x1f1f5e76": "addValueToContribution(uint256)", "0xa0eda9f2": "_transferFee(address,uint256,string)", "0xa8d95fb2": "claim(address,string)", "0x03ee8f08": "getCoeff(uint16)", "0x9872a20a": "registerUInt(address,uint256)", "0xb20d30a9": "setDailyLimit(uint256)", "0xe116b17e": "getKudosLeftForProject(address,address)", "0xf7c9f74a": "insert_contribution(address,uint256)", "0xc7a1865b": "play(bytes32)", "0x356594ab": "EtherTransfer()", "0xe22b0c46": "verify(uint256,uint256,uint8,bytes,bytes)", "0x2fea7b81": "getIdentity(address)", "0x6fa8de90": "changeMeatParameters(uint256,uint256)", "0x37c390e3": "allow_move(uint16)", "0xd22c391a": "validateProposedThroneRules(uint256,uint256,uint256,uint256,uint256)", "0xf6d339e4": "setAddress(bytes32,string,address)", "0xd7cc8362": "isLatestMajorTree(bytes32,bytes32)", "0xdd012a15": "setIt(uint256)", "0x254c91b3": "testBitNotSetSuccess()", "0x47e40553": "nextRound()", "0xa6b206bf": "doSomething(uint256)", "0xac996e7e": "resolvePledging()", "0x71e2d919": "lol()", "0x07d5b826": "buyAllOutcomes(bytes32,uint256)", "0x5f68804e": "SimpleLotto()", "0xa510f776": "setCompany()", "0x0d48e8d0": "doBalance()", "0xd21d7950": "changeGasLimitOfSafeSend(uint256)", "0x3358d2d3": "buildDSTokenFrontend()", "0xec93cfae": "FountainOfWealth()", "0x65b1fdf4": "scheduleIssuePOIs()", "0xdc3080f2": "spentAllowance(address,address)", "0xd1f0bb2d": "populateAllowedFreeExchanges()", "0xd591221f": "testTransfer()", "0xf24b5779": "removeTrustedIssuer(address,string)", "0xed4b1d0d": "scheduleTransaction(uint256)", "0xa83627de": "updatePeriod()", "0xf597a499": "UserDatabase(uint256)", "0x21f8a721": "getAddress(bytes32)", "0x5548c837": "Deposit(address,address,uint256)", "0x55b775ea": "setFeed(address)", "0x01b869f1": "release(uint32,uint32,uint32,bytes)", "0x609ff1bd": "winningProposal()", "0xdf98ef33": "getResource(bytes,uint256,bytes)", "0xd39eb301": "getStatus(uint8,uint8)", "0x2cc0b254": "init(address,bytes32)", "0x4228974c": "Videos()", "0xc431f885": "addToContribution()", "0x00e43ee9": "setMigrationStatus(uint256,address)", "0xd9f8a4e2": "calcCurrentTokenPrice()", "0xb9e6f1d9": "get_amount()", "0x6b3a87d2": "WatchWinningPot()", "0xef4592fb": "getResult(bytes)", "0x41b9dc2b": "has(bytes32,bytes32)", "0x3b9901cc": "getChannelsByRanks(address,uint256,uint256)", "0x83876bc9": "newProposalInWei(address,uint256,string,bytes)", "0x50a3bd39": "enterPool()", "0xc976bbbb": "_compare(int256,bytes2,int256)", "0x0e47c76f": "rotate(uint64,uint256)", "0x6f85c7e4": "WAITING_PERIOD()", "0x7075b1d8": "latestMonarchInternal()", "0x9209b3c0": "getCrtDetails(bytes)", "0x305075db": "NormalizeRanks()", "0xb6b55f25": "deposit(uint256)", "0xf09ea2a6": "offer(uint256,address,uint256,address)", "0xf1320af2": "exempt(address)", "0xc813c30e": "testThrowSomething()", "0x4faa2d54": "getTimeElapsed()", "0x22017c5f": "DSTokenBase(uint256)", "0x6637b882": "setDao(address)", "0xd0b52156": "getIpfsHash(address,address)", "0x13bd4e2c": "_prepareAndSendReward()", "0xdb7ca38a": "XaurmProxyContract()", "0x1bad1d2e": "monitorWallet(address)", "0x691f3431": "name(bytes32)", "0x3169ff3e": "LooneyLottery()", "0x446a7974": "Fokitol()", "0xdc3ab866": "checkEarnings(address)", "0xfad9bf9e": "storeBlockWithFeeAndRecipient(bytes,int256,int256,bytes,int256,int256)", "0xaf408d89": "setStatus(bytes)", "0xd02bf162": "spinTheWheel()", "0x9a36f932": "feeDivisor()", "0xca77ab8a": "getNextFile(bytes)", "0xc8e49707": "activateExportFee(address)", "0x502414e4": "marketMaker(string)", "0x78ec81a0": "sendEarnings(address)", "0x14167bf0": "oraclize_query(string,string[])", "0xba13a572": "lottery()", "0x299ed37a": "emergencyCall()", "0x6ec3af26": "addTrustedIssuer(address,bytes)", "0x3d69b403": "isOutcomeSet(bytes)", "0x9a19a953": "setInt8(int8)", "0x7817a60f": "acceptMember(address,string)", "0x1e223143": "getFirst()", "0x5437b39b": "hasUnprocessedDividends(address)", "0x8f0c724c": "setOperationsCallGas(uint256)", "0x3c925f16": "getAccountHolder()", "0x477801b1": "getLastRoundResults_by_index(uint256)", "0x3d21aa42": "sendApproval(address,uint256,address)", "0xd2b8035a": "draw(uint256,uint256)", "0x19c32e0b": "hmacsha256(bytes,bytes)", "0x28f90e4b": "Etheramid2()", "0xe87df70e": "fivetimes()", "0xc028df06": "offer()", "0xacb6c69b": "setTrustedClient(address)", "0xac7ffae3": "updt(uint256,string,uint256,uint256,string,string,address)", "0x0e5ffb3c": "hashVersion(uint32,uint32,uint32,string,string)", "0x4ac6b2be": "getCheckRecordCreator(bytes)", "0x93dafba2": "getSubpot(uint256)", "0x592685d5": "getWindowStart(address,address)", "0xc24a0f8b": "endDate()", "0x3f9b250a": "getDocument(uint256)", "0xd845a4b3": "request(uint256)", "0xa5bfa9a9": "claimToken(bytes32)", "0x8e3957d9": "RandomNumber()", "0x62fb09b2": "getRefDescr(uint256)", "0x9f35d3b2": "start(string,string,uint256,uint256,uint256,uint256)", "0xea1bf386": "getNextSellerBOTdata(uint256)", "0xe27fe50f": "startAuctions(bytes32[])", "0x031d973e": "closeMarket(bytes32)", "0x754dea40": "setBackendOwner(address)", "0xd83a8d11": "testProposing()", "0xf24a534e": "Oracle()", "0xd08275f1": "WolframAlpha()", "0x932db761": "profitsFromBitnationDebitCard()", "0xd96aee49": "MultipleConstructorTest()", "0x4594d06a": "delMinter(int256,address)", "0xb9f256cd": "newProposalInEther(address,uint256,string,bytes)", "0x1d2bca17": "MyToken(uint256,string,uint8,string)", "0x6edbd134": "hasHash()", "0x847f8a10": "Refund(uint32)", "0xb0604a26": "schedule()", "0x6676871d": "reserved_funds()", "0x05888fcd": "tradeBalances(address,uint256,address,uint256,address,uint256)", "0xe771066f": "marriageProof(bytes)", "0x7e32a592": "repairTheCastle()", "0xbab2f552": "currentCycle()", "0x45a3b0bf": "resolveFailPledge()", "0x070a888f": "updateRewardDuration(uint256)", "0x20d9822e": "setAnyoneCanCall(address,string,bool)", "0x224993c2": "setTimeBlock(uint256)", "0x01bd4051": "disown(string)", "0x4bc2a657": "setVoter(address)", "0x522103fa": "changeUnicorn(uint256,address)", "0xc988d70f": "getDailyWithdrawLimit()", "0x2f7f3ecf": "findNextHour(uint256,bytes)", "0x1b769e74": "testThrowsRestartNotUpdatable()", "0x4d561721": "etherandomSetNetwork()", "0x92a781d8": "changeBaseValue(uint256)", "0xf0a78538": "scheduleTransaction(uint256,bytes)", "0x64ef212e": "proxyTransferWithReference(address,uint256,bytes32,string)", "0x97c3ccd8": "ban(address)", "0xdeb6930c": "PriceTicker()", "0x6cc5fdaa": "setBytes32(bytes,bytes)", "0x92c8eb96": "DSFalseFallbackTest()", "0x6534b4e2": "IsPayoutReady__InfoFunction(bytes32)", "0x15e812ad": "getBaseFee()", "0xf5b53e17": "getInt256()", "0x081bf263": "isOOB(uint8,uint8)", "0xd2fb8787": "recordExists(bytes)", "0x86c57fcc": "b32ToBytes(bytes)", "0xe3a199d6": "testThrowCreateNewRevisionNotUpdatable()", "0x57cfeeee": "transfer(address,uint256,bytes32)", "0xb72e717d": "fromAddress(address)", "0x61b20d8c": "retrieveFunds()", "0xf4b103d4": "SimpleStorage(uint256)", "0xe2056c46": "ExtraBalToken()", "0xc3ee6311": "lockAndCall(string)", "0x136af582": "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes)", "0xc5d5997c": "changeSubUser(address,address)", "0xf8018a79": "prepend(address,address)", "0xf6b4dfb4": "contractAddress()", "0x9450b1c8": "addCharityFundation(string,string,string)", "0xd1a8d447": "get_all_bet_values()", "0x66d8c463": "reveal(bytes32,string)", "0xbb963c8a": "transferLibOwnership(bytes,address)", "0xd56b2889": "finish()", "0x9fb25d9e": "LeaderMessage()", "0x6ad50ed4": "investmentEntryInfos()", "0xa4d575ce": "_forward(address,bytes)", "0xa3ec5616": "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes,uint256)", "0x0db73c72": "noevent()", "0xf449619e": "collectPrize(uint256)", "0x1afccfa5": "Proposal(address,address,address,bytes,bool)", "0x4788cabf": "getContractId()", "0x4112987c": "strConcat(string,string,string)", "0x928a00d2": "deleteCoin(uint256)", "0xd9ec0508": "testThrowTransferNotEnabled()", "0x9aaf442c": "applyCensorship(uint256)", "0x49407a44": "claimEther(uint256)", "0x4fcf8210": "eraseRecord(bytes32)", "0x5ed84aa6": "getNymCenterAPIURL()", "0xa3c2c462": "totalReceived()", "0x5938748e": "changeVotingRules(address,address,uint256,uint256,uint256)", "0x6fc9d5e4": "changeCompareTo(uint256)", "0xe2ee9941": "tap(bytes20)", "0x0ff4f160": "oraclize_query(uint256,string,string[1])", "0x43ec3f38": "toSliceB32(bytes32)", "0x3288eb0b": "ChineseCookies()", "0x373c98a2": "authCall(address,bytes32)", "0x6ea056a9": "sweep(address,uint256)", "0x8dc45377": "getDuel1(uint256)", "0xd4625a3a": "equals()", "0x616fca9b": "adopt(address)", "0x32cea83e": "birth(bytes)", "0x002a5cc9": "getTicketHolders(uint256)", "0x31119b4d": "changeDeveloper(address)", "0x69569a51": "setFrontend(address)", "0xb7e24979": "addThing(bytes)", "0x164e68de": "withdrawFees(address)", "0x42bf4431": "orderMatchTest(uint256,uint256,uint256,int256,uint256,uint256,address,address,int256)", "0x5dd672ec": "latestBid()", "0x45fe6e2a": "Scheduler()", "0x55cc4e57": "setIssuer(address)", "0x1df5e755": "Etherandom()", "0x8f70009d": "id_for_address(address,address)", "0x39b50688": "cancelSellOrder()", "0x40953102": "scheduleCall(address,uint256,bytes,uint256,uint256,uint8,uint256)", "0x677913e9": "setAmount(int32)", "0x66671c71": "BaseScheduler(address,address)", "0xfe71aec5": "LittleCactus()", "0x879d46fd": "DAOTrust(address,address,bytes,uint256,uint256,uint128)", "0x3b143184": "Congress(uint256,uint256,int256,address)", "0x7370a38d": "getNumPackages()", "0xfee35ff8": "newInvest(uint256,address,uint256)", "0x57dc9760": "DaoChallenge()", "0x8ac78c80": "Docsign()", "0x76d66f5d": "_Transfer(address,address,bytes32)", "0x9dc2c8f5": "fireEventLog4Anonym()", "0x43114842": "acceptChallenge(uint256,uint256,uint256)", "0x2043285d": "getMarketMakers()", "0xfb32f4f5": "ARK_FLAGGER_1_00()", "0x69431ab6": "TokenCreation(uint256,uint256,address,string,string,uint8)", "0x045c6ce0": "voteForProposal(uint256)", "0xa140e79c": "setMinimumDebatePeriod(uint256)", "0x331a72d1": "getRetractable(bytes32)", "0x87cc1e1c": "setExporterBank()", "0x7183616c": "notarize(string)", "0xce79add1": "givableBalanceOf(address)", "0x6f0cfab6": "DNSResolver()", "0x1c2f38ff": "paid(uint64)", "0xb7de47d3": "getIndex(uint256,uint256)", "0x04a2b2c2": "testOwnerCanBreach()", "0x65a4dfb3": "oraclize_query(uint256,string,string,string,uint256)", "0xf2ddc772": "confirm(bytes)", "0xa00ce377": "getIsContractValid()", "0xfe9fbb80": "isAuthorized(address)", "0xbbd39ac0": "coinBalanceOf(address)", "0xa4fde8bc": "player_declare_taking_too_long()", "0xd052fbf6": "getHistory(string,uint256)", "0xd205ad7d": "proposeDissolve(bytes)", "0x5a3b7e42": "standard()", "0xf27197ab": "getIsAvailable()", "0x00a94b6e": "oraclize_query(uint256,string,string[5],uint256)", "0x971c803f": "getMinimumStackCheck()", "0x5168afa4": "getPackageHash(bytes,uint8,uint8,uint8)", "0xaef99eef": "Game()", "0x7f924c4e": "testDeposit()", "0xb1adc241": "BalanceDB()", "0x6a704d7b": "AddedToGeneration(address,uint256)", "0xb9f37c86": "Registrar()", "0xc631b292": "closeVoting()", "0x19350aea": "nameFor(address)", "0x85dee34c": "query2_withGasLimit(uint256,string,string,string,uint256)", "0xbf187478": "shift_left(uint64,uint256)", "0x5b6b431d": "Withdraw(uint256)", "0xe5dd90a5": "HumanStandardToken(uint256,string,uint8,string)", "0xbf8c50ff": "scheduleTransaction()", "0x013d64bd": "setCanCall(address,address,string,bool)", "0xb870ecbb": "testNormalWhitelistAdd()", "0xbcd3d8ca": "Collector(address,address,uint256)", "0x4401ff5c": "sellShares(bytes,uint8,uint256,uint256)", "0x3e0dfbdf": "getInvestorByAddress(address)", "0xcb3e64fd": "unhalt()", "0xafc24e3d": "getChallengeAnswer(uint256)", "0xa36c8ec2": "UpdateContractorAddress(address)", "0xd5a4a3c6": "findRecentBet(address)", "0xb028ee13": "s2b(string)", "0x692ad3a9": "round(uint256,uint256,uint256,uint256)", "0x0a7493b4": "Etheropt(uint256,string,uint256,uint256,bytes,address,int256[])", "0x60689557": "Rock()", "0x717fedf0": "getFirstActiveDuel1()", "0xe837ab59": "getParticipantByAddress(address)", "0x32d5fe98": "revealCampaign(uint256,uint256)", "0x0178b8bf": "resolver(bytes32)", "0x44faa139": "Withdraw(uint32)", "0x418cf199": "setEstimateCost(uint256,uint256)", "0xae45850b": "schedulerAddress()", "0xd4871517": "BTCLotto(address,uint256)", "0xfbffb355": "testBitsEqualFailIndexOOB()", "0x2be6d43c": "ARKTagger_1_00()", "0x1df47aad": "ReplayProtection()", "0xb36a0b15": "getSignDetails(uint256,uint8)", "0x9c4baf27": "Skywalker(address,address)", "0xfb34fc6f": "WatchNextBlockReward()", "0xceba30b5": "scheduleTransaction(address,bytes,uint256[4],uint256)", "0xfc94dd18": "verifyHumanStandardToken(address)", "0x1ff13086": "size(int256)", "0xce92dced": "newBid(bytes32)", "0x231944e2": "moveUnits(uint256,uint256,uint256[])", "0x784813e0": "lookupBet(uint256,uint256)", "0xe0e3ba5a": "getLosesShare(address)", "0x5c1b3ca1": "getConfigUint(int256,bytes32)", "0x91060168": "fetchString(address,bytes4,bytes32)", "0x354b2735": "testDeploy()", "0xb88eef53": "registryCreated()", "0x8e3d4e5e": "Fibonacci(bytes)", "0x64bd87d6": "scheduleCall(address,bytes,bytes,uint256,uint256)", "0x5c3d005d": "demote(address)", "0xb6509c12": "Ethereum_twelve_bagger()", "0xe87508be": "investorDeposit()", "0xcb96012e": "hashTo256(bytes32)", "0x314e0fb6": "scheduleTransaction(address,bytes,uint256[3],uint256)", "0x5b6a54bc": "adjustTransactionFee(uint256)", "0x5f515226": "checkBalance(address)", "0x76cd7cbc": "sign(bytes)", "0xce220ecf": "testAddBalanceFailsAboveOverflow()", "0x922fc84b": "taskProcessedNoCosting(uint256)", "0xf8b2cb4f": "getBalance(address)", "0x7a29332d": "buyAllOutcomes(uint256,uint256)", "0x04106c8b": "startGeneration()", "0x8eaa1e29": "getContentByData(address,uint256,string,string)", "0x5a7a8850": "rollWithSeed(bytes32)", "0x2facc4e8": "depositGovernance(uint256,address)", "0xf2561a43": "voteSuicide(address)", "0xee1b4828": "closeBooks()", "0x18f303a1": "SetInternalValues(uint8,uint256)", "0xce60f78d": "createMarriage(bytes,bytes,uint256,bytes,bytes)", "0x18b749c4": "payEther(uint256)", "0xbbc6eb1f": "getDefaultDonation()", "0x0b1ca49a": "removeMember(address)", "0xccf4f413": "setSubRegistrar(string,address)", "0x4616caa9": "pushCoin(uint256,address,string)", "0xd69450d5": "setUUID4Bytes(bytes)", "0xc98165b6": "createTarget()", "0x8c79a24d": "refName(uint256)", "0x56d88e27": "len()", "0xbfc3d84b": "CT()", "0xc7f2e6af": "Contribute(bytes20)", "0xd7e11e9d": "AddTicket(bytes)", "0x2d06177a": "addManager(address)", "0xd588acc4": "claimMiningReward()", "0x2ffb9e64": "updateGasForXaurData(uint256,uint256)", "0xf896503a": "getConfigAddress(bytes32)", "0x9af8c4ba": "respond(uint256,address,bytes)", "0x82a5285d": "getMinBetAmount()", "0x3ead67b5": "changeContractOwner(address)", "0xb29d7914": "getRefResults(uint256)", "0x135128c2": "CounterPartyDeposit()", "0x795b9a6f": "scheduleCall(address,bytes4,uint256,bytes)", "0x83197ef0": "destroy()", "0x433836dc": "scheduleTransaction(address,bytes,uint8,uint256[3],uint256)", "0xf009347d": "KudosProxy(address)", "0xf2fde38b": "transferOwnership(address)", "0x62c99e84": "_Approval(address,address,bytes32)", "0x1b83b823": "notifyPlayer(uint256)", "0xe56c8552": "spinTheWheel(address)", "0x93eec1fb": "setName(uint8,uint8,string)", "0x11af3c68": "divest(address)", "0x8279c7db": "setReceiverAddress(address)", "0x44691f7e": "hasStarted()", "0x349501b7": "checkDepth(uint256)", "0xe8beef5b": "fireEventLog3Anonym()", "0x0870607b": "addSubUser(address)", "0x063925c8": "scheduleCall(bytes,uint256,uint256)", "0xa23744f0": "tryCreateCheckRecord(bytes)", "0x35d79fad": "CertificationDb(address,uint256,address)", "0x44691f2b": "Dispute()", "0xd7ccc2c3": "getLastPayment()", "0x152583de": "getAttributes()", "0x1a9360dd": "checkDate()", "0x420ef2b3": "TargetHash()", "0xf0caea2b": "SmartRoulette()", "0x5d268629": "Refund()", "0x23385089": "emitApprove(address,address,uint256)", "0x7648c929": "returnRemainingEther()", "0x5d5bc4cb": "BetOnRed()", "0xde8fa431": "getSize()", "0xda6b31b9": "testErrorTransferToNullAuthority()", "0x444dd6f3": "Elcoin()", "0xe1fa8e84": "register(bytes32)", "0x3e0a322d": "setStartTime(uint256)", "0x21bacf28": "getDefaultFee()", "0xb1662d58": "setModule(address,bool)", "0x5b0fc9c3": "setOwner(bytes32,address)", "0x40193d17": "getPongvalConstant()", "0xfb95adeb": "testFailBlockhashInsuffiecientFee()", "0x8ecc0950": "returnToOwner()", "0x34b7ac9b": "END_MINTING()", "0xeaa37394": "create(bytes,bytes32,bool,bool,bool,bool,bool)", "0xd7bc23af": "newParameters(int256,uint256,uint256,uint256)", "0x97709cde": "ARK_VOTER_1_00(uint256,uint256,uint256,uint256,uint256,uint256)", "0xcf4a1612": "scheduleTransaction(uint256,address,bytes,uint256)", "0x40695625": "testRetractLatestRevision()", "0x90c3f38f": "setDescription(string)", "0x5fdf05d7": "two()", "0xaaac50bd": "transferDisable(bytes32)", "0x206a44f3": "getNum(bytes,uint256)", "0x7ac26aeb": "getTag(string,uint256)", "0xdc3f65d3": "createdByMe()", "0xe99543aa": "Trash(uint256)", "0x1bcad37a": "getTotalCost()", "0xa7f43779": "remove()", "0x3416f9d4": "subtractSafely(uint256,uint256)", "0x3bcf7d22": "newBribedCitizen(address)", "0x918f1bb5": "ProjectKudos()", "0xcf09e6e1": "SetBigContract(address)", "0x23add736": "claim(uint256,uint256,uint8,bytes,bytes)", "0x8ac6a869": "isObsolete()", "0x2324c67c": "getAllSignatureHashes(bytes4)", "0x981a60f5": "extractNameFromData(bytes)", "0xc018d0e6": "getFeeAmount(int256,int256)", "0x50e06b57": "Etherization()", "0x49e65440": "setSymbol(bytes32)", "0xfaee13b9": "set(int8)", "0x01ffc9a7": "supportsInterface(bytes4)", "0xc0b92612": "changePig(address)", "0x3f9f5b68": "setPreviousID(uint256,int256)", "0x2e9c5e77": "doStackExtension(uint256)", "0xc83be888": "single_move(uint256,uint8,uint8)", "0xef19c332": "_checkSigned(bytes32,uint256,uint8,bytes32,bytes32)", "0x2f30c6f6": "set(uint256,address)", "0x62986e27": "Canary(address,uint16)", "0x44dfdce0": "getNameOwner(bytes)", "0x4b7fcee7": "ownerPausePayouts(bool)", "0x84dac46e": "Fucksign()", "0x0878bc51": "getAttachesto(uint8)", "0x42d16748": "getMinDailyWithdrawalLimit()", "0x4ecd73e2": "DistributeDividends(uint256)", "0x03750d94": "serverSeed(address,bytes32)", "0xea0a5237": "announce(string)", "0x611daa7e": "EmergencyBalanceReset(uint256)", "0x2ae87a70": "getNumContents(address,uint256)", "0x5ec01e4d": "random()", "0xfd735602": "executeN()", "0xfebefd61": "startAuctionsAndBid(bytes32[],bytes32)", "0x8b64d70e": "owner_set_time_limit(uint256)", "0x2839e928": "ackermann(uint256,uint256)", "0xaf29e720": "remainingGasFund(uint256)", "0x9eee85fe": "bookEarnings(address,uint256)", "0x3733ffca": "convertTo(uint256,string,string)", "0xdbde1988": "transferFromWithoutReward(address,address,uint256)", "0xd3edcb5b": "getCreditorAddresses()", "0x77fcb91d": "forward(address,bool)", "0xf062e26b": "check_darkdao()", "0xdef2489b": "convert(address)", "0xccbda1af": "getChannelByName(string)", "0x267c8507": "authorizeManager(address)", "0xf1c30ec0": "reclaim(bytes)", "0xe6470fbe": "updateDefaultPayment()", "0x8fe58eb9": "Triger()", "0xd6b44859": "scheduleUndoIt(uint256)", "0x0eb8ed07": "transferEnable(bytes32)", "0xfc1f2a70": "Add(uint256,string,string)", "0x058026d0": "checkTransferToICAPWithReference(bytes32,uint256,string)", "0xaf27c7b3": "Security_HasPasswordSha3HashBeenAddedToBankAccount()", "0x5b151fd2": "fifty_fifty()", "0x531d1974": "testThrowRetractLatestRevisionEnforceRevisions()", "0x60213b88": "getInitialWithdrawal()", "0x29e94503": "VersionedBlob()", "0x9c5d7030": "reimburseGas(uint256,address,uint256,uint256)", "0xcd9a3c98": "any(bool[7])", "0xb484e532": "getMyMsg()", "0xd1f59db9": "isLatestMinorTree(bytes32,bytes32)", "0xe0c6190d": "checkTime()", "0xaf5610dd": "isThisPreforkVersion()", "0xfa968eea": "minBetAmount()", "0x003538c5": "TestRegistrar(address,bytes32)", "0x71c59097": "MainnetSurvey(uint256,string,bytes32[])", "0xc82aac47": "searchByTag(bytes32)", "0xeca5c793": "testErrorUnauthorizedNameRegister()", "0xdc75f2db": "multiowned(address[],uint256)", "0x4c9ed763": "requestTokensBack()", "0xbd9a5673": "oraclize_query(string,string[5])", "0xb11e3b82": "createEvent(bytes32,bool,int256,int256,uint8,address,address,bytes32[])", "0x86e4e178": "CheckTickets(address,uint256,uint256)", "0x53c84526": "setSmartAffiliateContract(address)", "0x89029d8c": "get_all(uint256,uint256)", "0xc25e6908": "ultimateOutcomes(bytes32)", "0x6b1e564a": "challengeWinningOutcome(bytes32,uint16)", "0x1c895915": "getNumberOfPayments(uint256)", "0x244fcd03": "removeRelease(bytes32,string)", "0x2ca6d2c0": "getAccountSize(address)", "0xfe67a54b": "endAuction()", "0x756fb8c9": "getOptionChain()", "0x88102583": "safeCastSigned(uint256)", "0x60063887": "transferDebt(address,address,address,uint256)", "0x16216f39": "return13()", "0x8089d001": "getHashOfBlock(uint256)", "0x27bc39c0": "submitCanonicalCandidate(bytes,bytes,bytes,bytes)", "0xb29ae23f": "getDateOfSignature()", "0xdd729530": "add_shield(uint16)", "0x38557648": "executeSellOrder(address)", "0xe2a71f12": "accountDelete()", "0xce869a64": "fails()", "0x69bdfd3a": "toContractDie(bytes,bytes,uint256)", "0x99aeade3": "iterateTable(uint256,uint256)", "0x46bdca9a": "equal(string,string)", "0x5e07f240": "shiftBitsLeft(bytes,uint256)", "0x76285b5b": "_is360thDay()", "0x594151e0": "Dice()", "0x4dc43eaf": "setTreasury(uint256,uint256)", "0xec727000": "getApprovalDB()", "0xb144adfb": "balance_of(address)", "0x63052d82": "getOwnersIndex(address)", "0x833b4596": "testApproveSetsAllowance()", "0xc67d376d": "getClosedCandidates()", "0xcf03f5f4": "activateMasterKey(address)", "0x7ca55e00": "etherandomVerify(bytes32,bytes32,bytes32,uint256,uint256)", "0xd92ebe46": "createDAO(address,uint256,uint256,uint256,string,string,uint8)", "0x3773930e": "ConfigureFunction(address,uint256,uint16,uint16,uint16)", "0xfee6d28c": "addSnapshot(string)", "0xe71264fa": "addNewTokens(uint256)", "0xc4d9102f": "setNextID(uint256,int256)", "0xa6f0e577": "isLeapYear(uint16)", "0xc7102df7": "__stopBlock()", "0xfa93019c": "getBlocks(uint8,uint8)", "0xe9794dc1": "CreateHash(uint8,string)", "0x5460ef10": "sendWithExtraGas(address,uint256,uint256)", "0x2f62a6ff": "fipsRegister(uint256,address,bytes)", "0xd630bd53": "pledgeApprove(uint256)", "0x3448c7d6": "createHistory(bytes,address,address)", "0xdda3342b": "ReplicatorFactory()", "0x0cd865ec": "recover(address)", "0xb9f28076": "historyIdx(address)", "0x4dda1764": "CafeMaker()", "0x883ba26b": "getIsSettled()", "0x3f5e268f": "convictInitial(uint256,uint256)", "0x4a3b0eec": "authorizeOpen(uint256,bool,string)", "0xee6d2641": "sendWithExtraGasExt(address,uint256,uint256)", "0xde14bbf7": "randomGen(uint256,uint256)", "0x7f3bd56e": "disburse(address,uint256)", "0x20d8741f": "Feed()", "0x60c6b3a5": "claim(bytes,address,uint256,uint8,bytes,bytes)", "0xda4b5e29": "contains()", "0xb3c25835": "addUser(address,string,string,uint256)", "0xee2af3fb": "set_factory(address)", "0xb821f815": "pay_winner(uint256)", "0x138cc941": "testErrorTransferToRejectAuthority()", "0xc0b6f0c2": "NextRoundAndEvents()", "0xc7e67360": "GAS_BUFFER()", "0x058d7433": "setAlliesContract(address)", "0xd810f298": "computeSettlementAmount()", "0xa24d23eb": "ProcessGame(uint256,uint256)", "0x7ac91cc2": "testFailOwnedAuth()", "0x79c3ddc1": "isPackageOwner(string,address,address)", "0x478ae93c": "playToWin(uint256)", "0x6632a507": "testSetupPrecondition()", "0xb6013cef": "finalize(uint256,uint256)", "0x37b7bf11": "Tile(int256,int256)", "0xecfc7ecc": "placeBid()", "0x70b1d9d4": "requestCanonicalFormat(bytes)", "0x315fdea3": "TreasureChest()", "0xc5575ef0": "checkTransferFrom(address,address,uint256)", "0x65c72840": "getDay(uint256)", "0xd6eafd08": "scheduleCall(address,bytes,bytes,uint8,uint256[4])", "0x350fbe2e": "calcNextDrawTime()", "0x8af784dc": "expectEventsExact(address)", "0x2db89533": "Auth(uint8,address)", "0x9f203255": "setAuditor(address)", "0x2526d960": "clawback()", "0x3fbd40fd": "ProcessDraw()", "0xface030b": "SpinTheWheel(address)", "0x648621ec": "xnotify(string)", "0x22dc36e2": "processed(uint64)", "0x6f52167d": "payDuel(address,string,address,string)", "0x8f70bfa0": "processDeposit()", "0x25ea269e": "Scissors()", "0x93feb13b": "ForceSendHelper(address)", "0xb688a363": "join()", "0x89859b50": "updateLatestTree(bytes32)", "0xf83d08ba": "lock()", "0x7d287697": "testTryGetUnset()", "0x98d5fdca": "getPrice()", "0xfe72e717": "toDie(bytes)", "0xb3c06f50": "transferFrom(address,address,bytes32)", "0x1465aa97": "testingContract()", "0x069d6d1c": "closeOrder(uint256)", "0xa79f26dc": "force()", "0xf2371fb3": "grantGiveableKudos(address,uint256)", "0xaa7dcd84": "testUpdateAuthorityEvent()", "0x0d8b5fa2": "testControllerValidTransferFrom()", "0x0e0f55d0": "RewardOrder(uint256,uint256)", "0x9ea1b79d": "getContentChannel(uint256)", "0x4a67fa7d": "setLotteryFee(uint256)", "0xdb006a75": "redeem(uint256)", "0x8f4ed333": "step2()", "0x1a10cfc3": "delete_entry(uint256,uint256,uint256)", "0xd422e4e0": "takeFee(address,uint256,string)", "0x61a00f6d": "Ballot(bytes32[])", "0x9c30936f": "removeCertificationDocumentFromSelf(bytes32)", "0xa5f4af33": "playerWithdrawPendingTransactions()", "0x07ad9ecb": "safeSend(address,uint256)", "0x8f99ea43": "setDividendDB(address)", "0x1df473bc": "newContract(bytes)", "0xea5ea470": "payFunding(uint256)", "0x743e0c9b": "receiveTokens(uint256)", "0x21835af6": "__dig(uint256)", "0x47448e8a": "set(bytes32,string,bytes32)", "0x9b1ad792": "destroyToken(address,uint256)", "0xf765088f": "UpdateClientAddress(address)", "0xddbbc35c": "searchByName(string)", "0x5ed7ca5b": "halt()", "0x97950740": "roomForBirth()", "0xfc01abbe": "stringToBytes32(string,string)", "0xea3d508a": "selector()", "0x8c88752a": "ContributorList(uint256)", "0x5837e083": "move_history(uint256)", "0xf7c3ee7a": "immortality()", "0x1b9f9647": "accessMyWallet(address)", "0xc8691b2a": "getHistory(uint256)", "0x91e8d3dc": "testBitOrFailIndexOOB()", "0x5c89c10d": "setBannedCycles(uint256[])", "0x4500054f": "isCancellable()", "0x334ef224": "testThrowsUpdateLatestRevisionNotOwner()", "0x763a738c": "allNames()", "0x45590ec8": "addTag(uint256,string)", "0xe7740cf9": "revealPaper(string)", "0xd9d2d058": "Splitter()", "0xb412d4d6": "CafeDelivered()", "0x8365172c": "num_levels()", "0x41c0e1b5": "kill()", "0x3106fea0": "voteOnProposal(uint256,bool,uint256)", "0x82ab890a": "update(uint256)", "0x4636a159": "newPhoneToAddr(address,uint256)", "0x2f29d8c5": "elapsed()", "0x1bf20668": "testAdminTransfer()", "0xf709dd51": "getTrademark()", "0x8b859409": "setRelease(bytes32,bytes32,string)", "0x03959bb7": "setDataContract(address)", "0x4247f52d": "DoRoll()", "0x31ab4066": "testAuthorityTryAuth()", "0xac4b2bae": "newParameters(int256,uint256,int256,uint256)", "0x57eaeddf": "_isContract()", "0x4a3a87e2": "CreateProxyWithControllerAndRecoveryKey(address,address,uint256,uint256)", "0xd116c8c4": "releasePayment()", "0x6615dd83": "setSeedSourceB(address)", "0xb8aca90b": "CurrentGame()", "0xc124e2ea": "checkBetDozen(uint8)", "0x4b0bbf84": "addEntropy()", "0x452fbc41": "USN(address,address,bytes,uint256,uint256,uint128)", "0xcdb6753b": "setNav(uint32)", "0xbb5d40eb": "isValid()", "0xd6f42038": "PhoneToAddress()", "0x6bc3e0f0": "verifySecondHalf(uint256[4],uint256[4],uint256[4])", "0x33893071": "checkMyWithdraw(address)", "0xfb46d4c5": "tweet(string)", "0x248582b0": "receivePaymentForGoodsSoldEarly()", "0x766a3f2e": "Security_ConnectBankAccountToNewOwnerAddress(uint32,string)", "0x1c8d5d38": "allowance(address,address,bytes32)", "0x6b256f57": "DAOSecurity(address,address,bytes,uint256,uint256,uint128)", "0xe8d1e961": "lockAccount(uint256)", "0x152fb125": "SimpleMixer()", "0xf72457af": "CertifierDb()", "0xe8a5282d": "setConfig(bytes32)", "0xbeb92f55": "setCaller(address)", "0x9a571d9f": "isAlphaLower(bytes1)", "0x46a2679a": "getSubpotsCount(uint256)", "0xd62d3115": "testCreate()", "0xb6ed0632": "cancelOrder(uint256,uint256)", "0xc95e81cb": "MyBet(uint8,address)", "0x1d5a9f3f": "object_types(uint256)", "0xa49d53a1": "SmartRevshare()", "0x5b65b9ab": "setFee(uint256,uint256,uint256)", "0x116c6eab": "getProfitShare(address)", "0x8e46afa9": "getDefaultGracePeriod()", "0xdabc706e": "getProposalCost()", "0x3fbb539d": "scheduleCall(address,bytes,uint256,bytes)", "0x86269a88": "checkBetNumber(uint8)", "0xb6ac24df": "updatePatchTree(bytes32)", "0x4637d827": "trust(address)", "0x1c1b8772": "update(address)", "0x5a9f2def": "scheduleCall(bytes4,bytes,uint256,uint256)", "0x81a60c0d": "getResults(uint256)", "0xd1b4ff7e": "multiAccessRevokeD(bytes32,address)", "0x92b7d5b9": "getCurrentGaslimit()", "0x77ceded8": "mintGrey(int256,address,uint256)", "0x2a095fbe": "unlinkEID(bytes,bytes,address)", "0xa6e16ba2": "testThrowsRetractLatestRevisionNotOwner()", "0x4579268a": "getOffer(uint256)", "0xcabb3a3a": "isAlphaNumeric(string)", "0xfadc51cf": "isAlpha(bytes1)", "0xf2022905": "toldYouItWouldWork()", "0x686e8aaa": "GetMoney()", "0x07718a3b": "BankOwner_WithdrawDonations()", "0xc58343ef": "getRequest(uint256)", "0x7b1a547c": "registerAs(address,string,uint256,string,address)", "0x213b9eb8": "setAddr(string,address)", "0x75090ebf": "changeDomain(uint256,uint256,uint256,address)", "0xdbbdf083": "register(uint256,address)", "0xfa4e5e5a": "notify(uint8,string,string)", "0x86a5ff97": "changeStatus(string)", "0xb8f71f26": "scheduleTransaction(uint256,address)", "0xa2ec191a": "addDSource(string,uint256)", "0x18b31f94": "registerLengthFunction(string,string,address)", "0x7b395487": "voteForUltimateOutcome(bytes32,uint16)", "0x39246d75": "VersionModel()", "0xd500dd6a": "challengeTimeout(uint256,bool,address)", "0xd1da09ee": "extractImportFeeChargeLength()", "0xc74e907b": "commit(address,uint256,uint256)", "0x4b09ebb2": "e_exp(uint256)", "0xec3af4a9": "getProjectKudos(address)", "0x714064f3": "BreakableBond(address,address,uint256)", "0xc4bc5da5": "resumeContract()", "0xf7888aec": "balanceOf(address,address)", "0x2f597e71": "testLongInput()", "0x7212b67e": "add_potion(uint16)", "0x9a15f4f3": "getBlockHeader(int256,int256)", "0x6eacd48a": "ownerPauseGame(bool)", "0xf739ed4c": "id_for_user_version(uint256,uint256)", "0xfaf0952b": "testThrowRestartNotOwner()", "0x88a1e895": "test2Fails()", "0x237e9492": "executeProposal(uint256,bytes)", "0x7cb97b2b": "set_owner(address)", "0x2bb685bc": "kill2()", "0xdc52696f": "tokenSupplyChanged()", "0x83d852d9": "shutdownTransactions()", "0x525b25b1": "getDeploymentReward()", "0xeac116c4": "createKingdom(string,address,address,address,address)", "0x014e5fde": "ARKController_1_00()", "0xc6ae3b57": "dEthereumlotteryNet(address,address)", "0xcddbe729": "game(uint256)", "0x8823a9c0": "changeFeeTake(uint256)", "0x021991e7": "getBetsLocked()", "0x3015394c": "cancelRequest(uint256)", "0x9d118770": "destroy(uint256)", "0xe854dfb4": "Order(address,uint256,uint256)", "0x8435be4b": "getLastFarm(uint8,uint8)", "0x27fbcac5": "getChannelFeed(address,uint256,uint256)", "0xc1be4031": "XaurumProxyERC20()", "0x8e25071a": "setProxyCurrator(address)", "0x4f139314": "compensateLatestMonarch(uint256)", "0x85c78fac": "retryOraclizeRequest(uint256)", "0x478e25bf": "resetAction(bytes32)", "0xc74c251f": "addSafely(uint256,uint256)", "0x058aace1": "divest()", "0x6d1da953": "createWithNonce(bytes32,bytes)", "0x30c0f8d6": "scheduleTransaction(address,bytes)", "0x69a5e902": "multiAccessCall(address,uint256,bytes)", "0x6f8b44b0": "setMaxSupply(uint256)", "0x919edc7c": "getChainySender(string)", "0x0b7ad54c": "getContent(uint256)", "0x5bfdc700": "registerData(address,int256,bytes,address)", "0x0d1fce42": "getBankroll()", "0x739b47ca": "recordWin(address)", "0xa5ea11da": "getParameters()", "0xf8af9e6f": "setAdv(uint256,string,string)", "0xe32e9f22": "setDeploymentReward(uint256)", "0x0baaaed9": "setConfigBytes(bytes,bytes)", "0x99f4b251": "mine()", "0x362af076": "createRequest(address[3],address,uint256[11],uint256,bytes)", "0x7fd238ba": "doCoinage(address[],uint256[],uint256,uint256,uint256)", "0x3adb2de7": "bet_this_spin()", "0xa311dd70": "setArray(uint8[10])", "0xc5bf339c": "getLastNonPublished()", "0x9d1bbd7e": "CancelRoundAndRefundAll(uint256)", "0x89790192": "WithFee(address,uint256)", "0x1c879c47": "getMarketHashes(bytes)", "0xbb84d362": "splitProfitVIP_only_Dev()", "0xffb1a6cb": "getWins(address)", "0x3b355af6": "baseData()", "0xb181a8fc": "resetContract()", "0x7d3d6522": "goalReached()", "0xd4c2b6b1": "scheduleTransaction(address,bytes,uint256[5],uint256)", "0xd65ab5f2": "startGame()", "0x4c4766e8": "KittenRegistry()", "0x77e5bf84": "getTxGasprice()", "0xff981099": "getVotes(uint256)", "0x4a7b26ec": "join_game(uint256)", "0xcccf7a8e": "has(uint256)", "0xa525f42c": "transferFromToICAP(address,bytes32,uint256)", "0xeef8e35f": "setChainyURL(string)", "0x557ed1ba": "getTime()", "0x595da94d": "has_owners(uint256)", "0x12511c14": "transferEnable(bytes20)", "0x2b291eb6": "UserAddTicket(bytes)", "0x50baa622": "withdrawToken(uint256)", "0xc01a8c84": "confirmTransaction(uint256)", "0x671dacdc": "CalculateSqrt(uint256)", "0xe74ffbd5": "getPart(bytes32,uint256)", "0xdd54a62f": "content(string)", "0x4025b293": "redeemAllOutcomes(bytes32,uint256)", "0xa8659216": "setInitialLockinDays(uint256)", "0x00b5b223": "computeResponse(uint256,uint16)", "0x2ef761d3": "buyTile(uint8,uint8)", "0x0a874df6": "lookup(uint256)", "0x42c69566": "get_address(address,string)", "0x02dc2e1d": "queuePayment(bytes)", "0x86bb7121": "getBlocksPerRound()", "0xacfdfd1c": "deploy(uint256,string,string,address)", "0x7d298ee3": "beforeExecute(address,uint256)", "0x5023d124": "TestFactory()", "0x827ef325": "_parseMsgData(bytes)", "0xd35b9d83": "codeAt(address)", "0x26161670": "donkeyRanking(uint256)", "0xe0834ea4": "WatchBalanceInEther()", "0xd44f2d3d": "getInitialWithdrawalDone()", "0x4f223fe3": "StatefulFactory(string,string,string)", "0x91cd242d": "setMeta(bytes32,bytes32,bytes32)", "0x9a97043b": "depositIdx(address)", "0x85db2dda": "PayoutQueueSize()", "0x423e1298": "setDoNotAutoRefundTo(bool)", "0xb7a97a2b": "isValidChannel(uint256)", "0xc1441172": "setBlackFlagRequest(uint256,uint256)", "0x53d9d910": "create(address[],uint256,uint256)", "0x64d905c0": "awaitingParticipants()", "0x718bd6dd": "setRequestUntil(uint8)", "0x5a353193": "KrakenPriceTicker()", "0xfb099c84": "newInvestor()", "0xd264e05e": "forward()", "0xcd9f05b8": "balanceEtherAddress(address)", "0xa1da2fb9": "retrieveDAOReward(bool)", "0x60708ae3": "issueAndCommit(address,address,uint256,uint256)", "0x109df68e": "rotateBitsRight(bytes,uint256)", "0x793cd71e": "cashOut()", "0xd3017193": "addUser(address,uint256)", "0xaacf5328": "setVideoID(string,uint256)", "0xb56e1bca": "setExchangeToken()", "0x9341231c": "sendOrThrow(address,uint256)", "0xaed8f3da": "partsPerBillion(uint256,uint256)", "0xdcff5581": "NewFeeAddress(address)", "0xbbe4fd50": "getNow()", "0x3df16377": "make_move_and_claim_victory(uint256,uint8,uint8,uint8,uint8,uint8,uint8,uint8)", "0x5ae5df8f": "deleteRef(string)", "0x6d853ab6": "isSubUser(address)", "0x28472c6c": "claimComputation(bytes,bytes)", "0x2c215998": "updateStatus(string)", "0x7eff1465": "setAccountAllowance(address,address,uint256)", "0xd5089396": "Token(string,string,uint8,uint256)", "0xd1f7a4e4": "createCertificate(bytes)", "0x8c0e2a31": "regProxy(address)", "0xa819819b": "sweepDeityCommission(uint256)", "0x2b861629": "storeBlockHeader(bytes)", "0x25d4bdeb": "LookAtCollectedFees()", "0x5dddea66": "updateState(uint256,uint8,uint256)", "0x3ccfd60b": "withdraw()", "0x6795dbcd": "getAddress(bytes32,string)", "0x9b9ba572": "oraclize_query(string,string[3])", "0xa925d85e": "Exchange(address,address)", "0xbfe8c107": "betOnDozen(bool,bool,bool)", "0x1af716ba": "transferFrom(address,address,uint256,string)", "0x67eae672": "sendCoinFrom(address,uint256,address)", "0x311d5a2a": "recordBalance(address)", "0x7ca823d5": "getAverageChainWork()", "0x19483cd1": "checkHash()", "0xd366fbab": "startLottery(bytes32,uint256,uint256,uint256,uint256,bool)", "0x4d70d1d7": "generateId(uint256)", "0xe13dc28b": "testValidTransfers()", "0x12065fe0": "getBalance()", "0xdd67a360": "OrderLifeCycle()", "0xd7c23572": "historyTimesPlayed(address)", "0x2675c123": "CloseContract()", "0x1381e400": "cancel(uint32)", "0xa48a663c": "transferFromToICAPWithReference(address,bytes32,uint256,string)", "0xb03260be": "scheduleTransaction(uint256,address,bytes)", "0xb37217a4": "getRandomNumber(uint256)", "0x5c54305e": "InsufficientFunds(address,uint256,uint256)", "0x17e1b09b": "minimumDeposit(uint256)", "0x10c4e8b0": "all()", "0xa31d5580": "Registrar(address,bytes32,address)", "0xbe6307c8": "getDraw(uint256)", "0xc985c221": "get_all_levels()", "0x91b7f5ed": "setPrice(uint256)", "0xe42def21": "CryptoHill()", "0x738486bd": "BeerCoin(uint256)", "0xe422ebe9": "getBot()", "0x67dd74ca": "buyTicket(uint256)", "0x276b94e1": "copypaste()", "0x39aaba25": "get_status()", "0x7ed19af9": "multiAccessRevoke(bytes32)", "0x4c1b2446": "transmitInteger(address,bytes,bytes,uint256,uint16)", "0xd014c01f": "enter(address)", "0x1d49e081": "EXECUTE_EXTRA_GAS()", "0x9dafbc13": "initBlock(uint256)", "0xc7e22ac4": "setOracleGas(uint256)", "0xa3053236": "SafeInvestments()", "0xf42ac1de": "minQuorum(uint256)", "0x04d91c6a": "testFail()", "0x0e662cf0": "buyTokens(uint16)", "0x1ef0625b": "player_2(uint256)", "0xcec1365a": "ShortLimit(uint256)", "0x340f5e4e": "get_all_num_levels()", "0x3e2729bf": "isRevocated(bytes)", "0x5a1cc358": "getChannelRank(address,uint256)", "0x4d366398": "runPeerBalance()", "0xaf9a3f9b": "hashName(string)", "0x33298e25": "invoke(uint256,uint256)", "0x63def590": "untrustClient(address)", "0x836d6d66": "WeeklyLotteryB(address,uint256)", "0x7f497550": "scheduleTransfer(address,uint256,uint256)", "0xf9e05ed9": "sha(uint128)", "0xf6458c6a": "toZ1(uint256[3],uint256)", "0xf41017fc": "finalize(uint24)", "0xeeb57139": "CollectMoney(uint256)", "0xfdacd576": "setCompleted(uint256)", "0xb7266456": "StandardToken()", "0x6a8c2437": "totalRescues()", "0x1fdf6e0c": "protectKingdom()", "0xcf31e9fe": "getOutputHash()", "0xc8117b5b": "extractBalanceOfLength()", "0x0674763c": "assert(bool)", "0x87def081": "getFeeRecipient(int256)", "0xc63ff8dd": "claim(bytes)", "0x329bfc33": "getCurrentWinner()", "0x3d6a3664": "setNewOracle(address)", "0xdaa21e0e": "testBitSetSuccess()", "0xbf8783e0": "callAndGetReturn(address,bytes,uint256)", "0xb06df18e": "transfer(bytes20,address)", "0x00100a18": "NewPoll(string,string,uint256,uint256)", "0x2ffb8631": "getReleaseLockfileURI(bytes32)", "0x6716a692": "setDVIP(address)", "0xe8223468": "sha3clone(bytes)", "0x0aeacb5e": "getTotalRecords()", "0x29e30910": "testThrowCreateExistingNonce()", "0x240ecad5": "transferViaProxy(address,address,uint256)", "0xa33d4968": "Tripler()", "0x8caaaae6": "totalWeiPrice()", "0xf28a7912": "quick2()", "0xcbe9ef39": "BasicCoin(uint256,address)", "0xea3d2827": "selectWinner(string)", "0x92e9fd5e": "ColdWallet(address,address)", "0xcd5e3c5d": "roll()", "0x4a82534b": "create(address,address,address,uint256,uint8,uint8,uint256)", "0x5ccd2f9b": "_deleteAllPackedRevisionBlockNumbers(bytes20)", "0x9380b8e7": "testFailAddingMembers()", "0x31b0795c": "registerAddress(address,address)", "0xb76e4890": "Tester()", "0x29c08ba2": "payPremium()", "0xd7f31eb9": "forward(address,uint256,bytes)", "0xd7ef1356": "best_adjustment(bool)", "0x48d9a374": "blockTransfer(address,uint256)", "0x88b9e10e": "seizeTokens(address,uint256)", "0x8736fd16": "getRefStatus(uint256)", "0x2b30d2b8": "invoke(uint256)", "0xd4e78272": "Draw()", "0x0257c48c": "meta(bytes32,bytes32)", "0xc1246d39": "simulatePathwayFromBeneficiary()", "0x699b328a": "randomize()", "0xa200dc73": "getNextShareholder(address)", "0x9a7a7c11": "makeRoll(uint256)", "0x2bf1f9da": "restart(bytes32,bytes)", "0x943a32bc": "Relay(address)", "0x93503337": "isAllowed(bytes32,uint256)", "0xe97b2190": "add_wall(uint16)", "0x0448f79f": "addOptionChain(uint256,string,uint256,uint256,bytes,address,int256[])", "0xc0df77d0": "getRefName(uint256)", "0x27121069": "verify(bytes,uint8,bytes,bytes)", "0xb7009613": "canCall(address,address,bytes4)", "0x0295d71b": "currentDepositLimit()", "0x35ee2783": "Alarm()", "0x71b6663e": "play1(address,uint256)", "0x0178fe3f": "getData(uint256)", "0x489306eb": "oraclize_query(string,string)", "0xfce59d0c": "MangoRepo()", "0x8efc777f": "isBeta(bytes)", "0x1f7b8622": "getVotingDeadline()", "0x76da5667": "admin_kill()", "0x152cf9db": "getDataPoint(int256,uint256,uint256)", "0xd09de08a": "increment()", "0x64ee49fe": "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8)", "0xd9fe60f3": "DTHPool(address,address,uint256,string,string,string)", "0x6b4dd158": "getPrice(bytes)", "0x0a80ef45": "getIsClosed()", "0x51fdaf92": "checkExpiredfunds()", "0x694e0d5b": "StringPasser(uint8[])", "0x0e1d88fc": "addTender(uint256,uint256,address,uint256)", "0x53850db3": "getParticipantById(uint256)", "0xb6cb405b": "getContractor()", "0x4c6b25b1": "results(bytes32)", "0x1c4e6cd0": "NameReg()", "0x53aab434": "buyIn()", "0x1ebe5c0f": "sendWithAllOurGasExcept(address,uint256,uint256)", "0xd98b9bb5": "placeBid(address,uint256)", "0x02e8d8c0": "scheduleTransaction(address,uint256,uint256)", "0x8a120dc9": "testBitEqualFailIndexOOB()", "0x33f707d1": "ownerWithdraw(uint256)", "0x98e00e54": "getCallWindowSize()", "0x4da74ee6": "setVoteIntention(uint256,bool,bool,string)", "0x6617e11a": "NiceGuyTax()", "0xfe13a823": "computeResponseFirstHalf(uint16)", "0xf7bd2361": "LookAtBalance()", "0xb09bc3bf": "try_to_get()", "0x0cee22e9": "testSetBalanceSetsSupply()", "0xae404996": "oraclize_query(string,string[3],uint256)", "0x2ad95786": "winner(address)", "0xe5fe4f31": "buy(uint8,bytes32,bytes32)", "0xe23941bc": "testDepositWithdraw()", "0xfc89aff6": "submitVerifiedUsers(address[])", "0xddf187b0": "dogFight()", "0xb5f5962a": "CALL_GAS_CEILING(uint256)", "0x92093dd6": "getLastResult()", "0xbfad16f4": "new_offer(uint256,uint256)", "0x01df7f30": "validateProposedThroneConfig(uint256,uint256,uint256,uint256)", "0x4054f5de": "EthVentures3()", "0x244c23ee": "Token(uint256,string,uint8,string)", "0xc3daab96": "withdrawBond(uint256)", "0x5fa21f1f": "enableBetting()", "0x3b591ea7": "AmountToForgeTheNextBlock()", "0x8c3c4b34": "getSaleStatus()", "0x7429f1eb": "multiAccessSetRecipientD(address,address)", "0xf99ff4df": "paged(uint256,uint256)", "0x2a64fb63": "getSaleDate(bytes)", "0x749f9889": "changeAllowedRecipients(address,bool)", "0x053c351b": "oraclize_getPrice(string)", "0x19663f7f": "TransferAmountFromBankAccountToAddress(uint256,address)", "0x5292c1a9": "testThrowsRestartEnforceRevisions()", "0x68f2ab8e": "Currency(string,string)", "0xd6e0bf29": "OwnerDeposit()", "0x94c3fa2e": "getLastBlockHashUsed()", "0x45362978": "query1(string,string)", "0xaff21c65": "getMinimumEndowment(uint256)", "0xe33c7ae2": "scheduleTransaction(uint256,uint256,bytes)", "0x9eb9dd3b": "getBetsProcessed()", "0x3807ba1b": "poi()", "0x7281854d": "GetCategoryValue(uint8)", "0x45ee49b9": "getUltimateOutcomes(bytes)", "0x0109f22e": "CrowdSale()", "0x98596726": "note(uint224)", "0x06900c41": "ZeroPonzi()", "0x3df76482": "fipsPublishData(bytes20,bytes)", "0xe0429b6c": "ShinySquirrels()", "0xa4a7cf5c": "redeemWinnings(bytes32)", "0x2e898ddc": "validateTemporalUnit(uint256)", "0x3af75ee1": "storeBlockWithFee(bytes,int256,bytes,int256)", "0x43e6125d": "Badge(address)", "0x75a6a332": "testThrowRetractNotRetractable()", "0xbed411a0": "CheckPrize(address)", "0x16f3cb5e": "__kill()", "0xe8efc1a0": "updatedValue(bytes32)", "0x9c7264d7": "fillOrder(address,uint256)", "0x9a0af2ec": "getStLength()", "0xf62cce34": "_clearRecordHierarchy(uint256,bytes32[],bytes32)", "0x940f851c": "Ballot(uint8)", "0xd96e5565": "testThrowsRetractNotRetractable()", "0x3a314b24": "SendETH(address)", "0xbd8c1d33": "checkTransferFromToICAPWithReference(address,bytes32,uint256,string)", "0x01da73ff": "isValidChannel(bytes)", "0x8f8bde82": "MicroDAO()", "0x2973e372": "isAlphaUpper(bytes1)", "0x1d2b7155": "activateImportFeeChargeRecord(address)", "0x06ab5923": "setSubnodeOwner(bytes32,bytes32,address)", "0x9d7d6667": "multipliers()", "0x8af49ab7": "maintain(uint256,uint256)", "0x1f3a3a53": "mint(int256,uint256)", "0x74389991": "breakit()", "0x64371977": "set(uint256,string)", "0x3fa6497f": "AdminAddFunds()", "0xba7dc45f": "_removeOperation(bytes32)", "0xf81d087d": "prepareLottery()", "0xd239ea8b": "getSchemasLenght()", "0xa2f3ede2": "computeNameHash(bytes)", "0xa28ecf0b": "sendCryptedHand(bytes)", "0x003b9d88": "setLowerFeePercentage(uint8)", "0x98ea5fca": "depositEther()", "0xb9a0a708": "testChargesAmountApproved()", "0x55291dbd": "claimEther()", "0x2d2800f1": "react()", "0xa9d2293d": "lastClaimBlock()", "0xc45aa04c": "queryShareholders(bytes,uint256)", "0x67af1c81": "getRoundIndex()", "0x50b7b7a2": "setRating(bytes32,uint256)", "0x0aa7881a": "MintableToken(int256,uint256)", "0x0eb3f5a0": "sweepCommission(uint256)", "0x97d47a60": "registerAccountant(bytes,address)", "0xe2c61114": "setImportFee(address,uint256)", "0x6dbe31eb": "testSubBalance()", "0xf5c98aff": "GreeterB(bytes)", "0x79216f5f": "add_monster(uint16,uint16,uint16)", "0x023c23db": "getSize(uint256)", "0x0e1ca8a5": "Oraclize()", "0xa05e822a": "howManyOwners()", "0x313b7b19": "finance()", "0x51a5f2f2": "ConsultingHalf(address,address)", "0x1fb6e99d": "paymentNeeded(uint64)", "0x2bffc7ed": "add(string,address)", "0x5c52c2f5": "resetSpentToday()", "0x39cdde32": "ecverify(bytes32,bytes,address)", "0x64e24f4b": "UpdateClientTokenAccount(address)", "0x0d2560ee": "addMe()", "0xd8589be3": "CoinFlipper()", "0x3b46a7df": "ivote(bool)", "0xa6823189": "parseAddr(string)", "0xd0c24e93": "setNotUpdatable(bytes20)", "0x1f13de92": "inEther(uint256)", "0xb6ce5581": "oraclize_query(string,string[5],uint256)", "0x31ae0019": "KissBTC()", "0xdabf7dc8": "PayoutDividendEarly(uint256,bool)", "0xe3da41b5": "sortWinningNumbers(uint8[5])", "0x8ea98117": "setCoordinator(address)", "0xeff6be2f": "changeBaseFee(uint256)", "0x483a83df": "setKYC(address)", "0xf98a4eca": "executeVote(uint256)", "0x776d1a01": "unvest(uint256,uint256,uint256,uint256,uint256,bool)", "0x1cf52f2b": "isActiveRegistrant(address)", "0x24c9bf5e": "Prizes()", "0xb3822da8": "getContents(uint256[])", "0x999a9965": "setMany(uint256,int256,uint256,bytes,address,bytes)", "0xbade6033": "propose(bytes,uint256)", "0xd38159b8": "testPass()", "0xdabf7ec4": "helper(uint256)", "0xf4993bbd": "executeEmergencyWithdrawal()", "0x46ddb7db": "setAccountBalance(address,uint256)", "0xc12af1ce": "fipsRegister(uint256,bytes)", "0x8f420866": "DEFAULT_SEND_GAS()", "0x62770252": "needsFuneral(uint256)", "0x32921690": "checkDepth(address,uint256)", "0xb3c1a588": "parseMsgData(bytes)", "0x29cd5777": "_tryEraseSingleNode(bytes32)", "0xc6e0c908": "checkTransferFromWithReference(address,address,uint256,string)", "0x9bd99195": "multiAccessChangeOwner(address,address)", "0xa360b26f": "Migrations()", "0x6c6f1d93": "getContractCreationValue()", "0x5445e38c": "_isCycleValid(uint256)", "0x2c85f8e0": "oraclize_query(string,string,string,uint256)", "0xcdda62ad": "FutureBlockCall(address,uint256,uint8,address,bytes4,bytes,uint256,uint256,uint16,uint256,uint256)", "0xc8fdc891": "numberOfMonarchs()", "0xf578fd85": "assertEq0(bytes,bytes)", "0xda311588": "getCoin(uint256)", "0x9a35f886": "__dig_then_proxy(uint256)", "0xfa14df6b": "getChangeRecipientFee()", "0x95f0684b": "getPackageNameHash(uint256)", "0x42909a9e": "create_game()", "0x51582ef3": "sendProxyTransaction(address,uint256,uint256,bytes)", "0xc4e41b22": "getTotalSupply()", "0x110df916": "getChannelID(uint256)", "0x4dc3141b": "CalcAll()", "0xb88a802f": "claimReward()", "0x82b2e257": "getTokenBalance()", "0x9bb0e4df": "getUint(int256,bytes32,string)", "0xc1ae4044": "checkBetColor(uint8)", "0x4a8b5389": "allocateBountyAndEcosystemTokens()", "0xdf06f906": "numBets()", "0xdeb80111": "transfer_asset(address,uint256)", "0x5216aeec": "totalInvested()", "0xe2deaa81": "set_reference(uint256,uint256,uint256)", "0x2ffda1e0": "setBlackflag(uint256,bool)", "0xba45b0b8": "transfer(address,address)", "0x7d7c2a1c": "rebalance()", "0xf32efd3c": "recoverUser(address,address,uint256,uint8,bytes32,bytes32)", "0x4571d4c4": "FutureCall(address,uint256,uint16,address,bytes,bytes,uint256,uint256,uint256)", "0x5fc5d48b": "burnUnsoldCoins(address)", "0x4da47ba0": "TokenSale(address,uint256)", "0x3d9ce89b": "scheduleCall(bytes4,bytes,uint256)", "0x6662e4be": "isWinningBet(uint256)", "0xa501e88d": "Content()", "0x4b70cec4": "getTime(address)", "0x12253a6c": "stopContract()", "0x173825d9": "removeOwner(address)", "0x26121ff0": "f()", "0x7b647652": "LittleEthereumDoubler()", "0x0c5c2ca3": "getIndexName(bytes)", "0x90f2c86d": "convertToWei(uint256,string)", "0x83f95f13": "openClaim(string)", "0xe8b5e51f": "invest()", "0xfdc4b338": "authorizeExtension(uint256,bool,string)", "0x4e116eb8": "unRegisterCertificationDb(address)", "0x5c8a1053": "extend(string)", "0xa932ed0d": "whitelistRemove(address)", "0xa1188e56": "getCurrentDifficulty()", "0xbf1fe420": "setGasPrice(uint256)", "0xead710c4": "greet(string)", "0x144fa6d7": "setToken(address)", "0x42402c2c": "fipsTransferMulti(bytes20[],address)", "0x93e84cd9": "play()", "0x741b3c39": "depositBond()", "0x23306ed6": "getMinimumBond()", "0x5f2e686d": "Ethereum_eight_bagger()", "0x9890220b": "drain()", "0x233120aa": "getChainyURL()", "0xe9dc0614": "vote(bytes)", "0x4df53a0f": "testSetApprovalDb()", "0x5fe27ab0": "createHKG(address)", "0xb56b2627": "add_owner(uint256,address)", "0x6f9a023c": "theultimatepyramid()", "0xc8796572": "collectFees()", "0xea3ebae6": "getConfigBool(bytes32)", "0x213ac932": "addUser(address,uint256,uint8,bytes32,bytes32)", "0xfae9d06d": "calculateTxFee(uint256,address)", "0x45d27edf": "forward_method(bytes,address,uint256,bytes)", "0x8e9ccd04": "computeIndexId(address,bytes)", "0x2f6ae467": "transferDocument(bytes,address)", "0x6e353a1d": "emergencyWithdrawal(address)", "0x7dd56411": "ownerOf(bytes32)", "0x9dc35799": "updateReading(uint256)", "0x246c02e6": "check_depth(uint16)", "0x03d22885": "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8,uint256)", "0x881be8f7": "undo()", "0x953307d8": "revealScissors(string)", "0x7af30442": "testToggleBitFailIndexOOB()", "0x1e0c7ed4": "setConfigBool(bytes32,bool)", "0x2e3be78d": "setPrecisionDirect(uint8)", "0x95a078e8": "hasAccess(address)", "0x245a03ec": "scheduleSetIt(uint256,uint256)", "0xb863bd37": "random(uint256)", "0xa5e62f02": "fallbackRP()", "0x618fa9ce": "getBotBillingIndex(uint256,uint256)", "0x06909f69": "cancel(string,uint256)", "0x2b198366": "addCertifier(address)", "0x57e871e7": "blockNumber()", "0x2b98222e": "getInstitutionByAddress(address)", "0x89eedf00": "setPdfHash(bytes,bytes)", "0x7ac4b05e": "returnMyMoney(uint256)", "0x7fc90182": "Pool(uint256)", "0x291e6777": "sendVote(uint256,uint256)", "0x579badf6": "UniversalFunction(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)", "0xe1f21c67": "approve(address,address,uint256)", "0xa1b9af31": "unlockBets()", "0x92d0d153": "t()", "0x095ea7b3": "approve(address,uint256)", "0x9cb31079": "setLowLimit(uint256)", "0xb971b4e5": "setNotTransferable(bytes20)", "0x2a745971": "BlockKing()", "0x582ca57b": "get_associations()", "0xa0d605c6": "addCertificationDocumentInternal(address,bytes32)", "0x85233869": "NumberOfMiners()", "0xb0349184": "clearRecords(bytes32[])", "0x3e8f5b90": "setConfig(string,uint256)", "0x7c73f846": "getMinimumEndowment(uint256,uint256,uint256)", "0xcc9ae3f6": "getMyReward()", "0xac900c2d": "unregisterSeller(address)", "0x306df22d": "GPSDestination(int256,int256,uint256)", "0x5e968a49": "ownerSetMaxProfitAsPercentOfHouse(uint256)", "0x80dcaf27": "getRefNumber()", "0x4245b0f7": "Lottery()", "0xe46164c5": "waitingForPayout()", "0xa8c3ec48": "oraclize_query(uint256,string,string[2])", "0x58ea80e5": "setThroneCreationPrice(uint256)", "0x8a4fb16a": "getWithdrawal(uint256)", "0x4464aec7": "testTryGet()", "0xf3c37bd5": "Verifier(address,uint256,uint8)", "0xb4c4e005": "testTransferToAcceptAuthority()", "0x346b306a": "oraclize_query(string,string,string)", "0x24032866": "checkExecutionAuthorization(address,uint256)", "0x509f8633": "create_account()", "0x26da8e17": "ownerUpdateCostToCallOraclize(uint256)", "0x74a93e6c": "setTokenHolder(address,address)", "0x1baaeb91": "getSignature(bytes4,uint256)", "0x337c1e28": "getIndexRoot(bytes)", "0xac92fdb5": "getSaleDate(bytes16,uint256)", "0x13b2663b": "cash_received(string)", "0x68e4bd99": "testSetBitSuccess()", "0x20620f37": "onAuctionEnd(string)", "0x85528394": "currentClaimPriceWei()", "0x1995333b": "burnFunds(uint256)", "0x5184ffc9": "setAmbiAddress(address,bytes)", "0x269975d0": "GameDetails(uint256)", "0x29274fe1": "buyBOTx(uint256,string,string,address,uint256)", "0x720c4798": "workshop()", "0x6f9a5eab": "createTx(uint256,address,uint256)", "0xb66a323c": "claimThrone(string)", "0x14cabddb": "joinProof(uint256)", "0x76e4ca0d": "voteQuorum(uint256,bool)", "0xbcb3b5d2": "getGamblesList(uint256)", "0xf2080ba6": "Pong(int8)", "0xab470f05": "getCaller()", "0xe0b1cccb": "updateBalance(address,uint256)", "0x4889ca88": "receiveApproval(address,uint256,address)", "0xbc4b3365": "addFunds(address,uint256)", "0x5d1a3b82": "getOutcome(bytes32)", "0x8204ecdd": "getFee(bytes)", "0x49aa4ee2": "removeVote()", "0x9131d803": "testSetFrontend()", "0x72929b56": "getKudosPerProject(address)", "0x287418e7": "query(uint256,uint16)", "0xbb7859b5": "periodThree()", "0x7dc5cd32": "_patternToNumber(bytes)", "0xf7ea7a3d": "setTotalSupply(uint256)", "0xb3f98adc": "vote(uint8)", "0x655388be": "walkTowardsBlock()", "0x856deacf": "findTag(string)", "0xcaab0acc": "testThrowCreateRetracted()", "0xede8ebf3": "checkApprove(address,uint256)", "0x4296a9cb": "getNodeRightChild(bytes)", "0x03cf4fd6": "expire(uint256,uint256,uint8,bytes32,bytes32,bytes32)", "0x87045369": "setCanCall(address,address,bytes4,bool)", "0x0ed21029": "getIssueAssignee(uint256,bytes32)", "0xc5958bda": "removeFile(bytes)", "0xa8026912": "setSource(address)", "0x05a5b8c6": "verifyTx(bytes,int256,int256[],int256,bytes,int256,int256[],int256)", "0xed3058e0": "transferRight(address,bytes)", "0xba487e62": "newCampaign(uint32,uint96,uint16,uint16)", "0xd6c19fe0": "build(bytes,uint256,uint256,address)", "0xebb741cb": "getChannelSize(uint256)", "0x3b996f40": "quarter(uint32,uint32,uint32,uint32)", "0x0b7373d6": "giveAllBack()", "0x3f887fad": "buyShares(uint256,uint8,uint256,uint256)", "0xb5deeca7": "BaseRegistry()", "0x6dd6e87b": "checkOut(int256)", "0x90a85119": "checkBetResult(uint8)", "0x724121ae": "contentExists(uint256)", "0x67bd69a6": "getLastDuel2()", "0x821e9169": "testFailControllerChargeMoreThanApproved()", "0x083ae1fe": "setPackage(string)", "0x8eaa6ac0": "get(bytes32)", "0xf42aa287": "getBlobStore(bytes12)", "0x32a2c5d0": "getContractAddress()", "0x69d89575": "releaseFunds()", "0x984ac378": "lotteryTitle()", "0x3baf4e1e": "newPayment(uint256,uint256)", "0x938c4307": "scheduleCall(bytes4,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)", "0x47372325": "getChannelSize(address)", "0xcb10e0c5": "getLastDuel1()", "0x1a0919dc": "unregister(bytes32)", "0x6a3c1198": "_projectCancelNew()", "0x976b01c0": "setNotRetractable(bytes20)", "0x44d03ac6": "BlockhashFetch(address)", "0xb0fd935b": "registerCertificationDb(address)", "0x2c7c4549": "PurchasableToken(uint256)", "0x3e0a51b4": "TweetAccount()", "0xc5f310c0": "register(bytes12)", "0xc10dd4c6": "getEvents(bytes32[],address)", "0x37a6b9f8": "recordCallback(address,uint256,bytes,bytes)", "0x1b9265b8": "pay()", "0xc91d7e9c": "getFee(bytes32[])", "0xf6c5c80d": "cleanUp()", "0x590e1ae3": "refund()", "0x9c709343": "split(bool,address)", "0xe68d3ae3": "escrow(uint256,string,address,uint256)", "0xa1cb31b7": "_state()", "0xfbac3951": "isBlocked(address)", "0x29dfdded": "addNewDonkey(address)", "0x7bc49a95": "play(uint256,uint256)", "0x5329c681": "checkTimeout(uint256)", "0x7c05caf3": "testCreateCostAuth()", "0x8606f905": "balanceOf(address,bytes)", "0xbe45fd62": "transfer(address,uint256,bytes)", "0xd7130651": "getCity(uint256)", "0xb2353d69": "updateRightLottery(address)", "0x01bb85a4": "__startBlock(string)", "0x4316abbb": "newJester(address)", "0x5c3e426c": "adminRetrieveDonations(address)", "0x293ffca3": "AddressReg()", "0x4156fdb7": "createSwap(uint256)", "0x2852b71c": "accept()", "0x027a5e3f": "getLastVersion(bytes)", "0x3d90d44d": "addPowerSource(address,uint256,uint256)", "0x1ab06ee5": "set(uint256,uint256)", "0x50f07cf9": "setReadingDelay(uint256)", "0x669e48aa": "get(uint256,uint256)", "0xdea9c72b": "getLatestPreReleaseTree(bytes32,uint32,uint32,uint32)", "0x60f66701": "useCoupon(string)", "0x2431f164": "process_payment()", "0x17623e5b": "unauthorizeManager(address)", "0x367bbd78": "strlen(string)", "0xbab86ea8": "test(string,string)", "0x25f3da52": "GetBankAccountNumber()", "0xebb045fa": "PublicResolver(address)", "0xdd57d5c5": "setTrust(address)", "0x22e803c2": "transferBounty()", "0x12c8052f": "won()", "0x3535cd52": "setDailyCosts(uint256)", "0x92d8c8cf": "setupImportFee(address,uint256)", "0x53caf582": "testThrowSetNotUpdatableNotOwner()", "0xb3ade772": "shipProducts(string,string)", "0x61472fd4": "CSGOBets()", "0x5c7c9aa4": "checkAccountState(address)", "0x6560a307": "suggestedGas()", "0xd0d552dd": "setAsset(address)", "0xc02f081a": "shiftBits(bytes,int256)", "0x9348cef7": "reveal(uint256,uint256)", "0x5ca1c5a0": "getNodeValue(bytes)", "0x34c1b4ba": "sha(bytes)", "0xe0117441": "setRegistrationPrice(uint256)", "0x92698814": "reserved(bytes32)", "0xaa1e84de": "hash(bytes)", "0x2125b65b": "transfer(uint32,address,uint224)", "0x9f9eac67": "ChangeName(string)", "0x7eb69ba1": "hint(int256,bytes32,string,bytes20)", "0xc6888fa1": "multiply(uint256)", "0xa9059cbb": "transfer(address,uint256)", "0x84c344fe": "_register(bytes4,string)", "0x744d8b4f": "recordWin(uint256,uint256)", "0xad1ef61e": "donkeyInvested(address)", "0xb4787dc5": "linkEID(bytes,bytes)", "0x7b1cbb13": "getChannelValue(bytes)", "0xd0febe4c": "buyTokens()", "0x74f519db": "setLastTimestamp(uint256,uint256)", "0xe30081a0": "setAddress(address)", "0x6fd902e1": "getCurrentBlockNumber()", "0x25d8dcf2": "betAndFlip()", "0xc062f578": "updateStage()", "0xe0cfc05c": "testThrowsRetractLatestRevisionDoesntHaveAdditionalRevisions()", "0x854f4817": "buyKissBTCWithCallback(address,uint256)", "0x58b1f29c": "refundBounty(uint256)", "0x0645b5d5": "getMyShareholderID()", "0xe9c63b9c": "requestPeerBalance()", "0x1b03316f": "getSecond()", "0xbcc6092a": "MyEtherBank()", "0x1cf43b63": "extractExportFeeChargeLength()", "0x5e58f141": "shares(address,bytes,int256)", "0x6103d70b": "withdrawPayments()", "0x3e0663e0": "AdminDrawProcess()", "0xa0f029fc": "ContractorInterface(address,address,address)", "0xe604cf9f": "get_all_squares()", "0xd13d1ace": "scheduleCall(bytes,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)", "0xb74bc710": "LuckyDoubler()", "0x611f69de": "__proxy_motion(address,uint256,uint256,bytes)", "0xbb814e9e": "versionExists(bytes32)", "0x545e7c61": "deploy(address,address)", "0x1b437d0c": "compareLastCalldata(bytes)", "0x845051d3": "testContractsNotNull()", "0x23de6651": "emitTransfer(address,address,uint256)", "0xd78c20ff": "voteApprove(uint256)", "0x6f13e01b": "EthVenturePlugin()", "0x1f6b0a9d": "getReleaseLockfileURI(string,uint32,uint32,uint32,string,string)", "0x13d4bc24": "buyTokenProxy(address)", "0xd509b16c": "testWithdraw()", "0x2f54bf6e": "isOwner(address)", "0xf60381a1": "stra2cbor(string[])", "0x34dbe44d": "getLastBlockNumberUsed()", "0x28dcfdac": "getSignsCount(uint256)", "0x2888f9d0": "updateMaxBet()", "0xc3b2556d": "lookup(bytes)", "0x6fbaaa1e": "currentMultiplier()", "0xe241c1d9": "deriveKey(uint256,uint256,uint256)", "0x5b37e150": "create(bytes32,bytes)", "0xa1c95ac2": "GSIToken(uint256,string,uint8,string,address)", "0xfc9e53df": "setNextRegistrar(address)", "0x34e8980f": "bootUpHangouts()", "0x457dd8b3": "setMasterKey(address)", "0xdb833e3a": "sellShares(bytes32,uint8,uint256,uint256)", "0x1e5330ca": "checkBetResult(uint8,address,bytes32,bytes32)", "0x4a00a522": "homebase(int256,int256)", "0xb938bf42": "sendBounty(bytes32)", "0x46be96c3": "amountFilled(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", "0x2fa00e58": "fipsTransfer(bytes20,address)", "0x95669952": "debtor(address,uint256)", "0x3f19d043": "getContributions(address)", "0xeb455dc6": "sendBitcoin(string,uint256)", "0x034cb28e": "addressOf(address,bytes)", "0x1e26fd33": "setBool(bool)", "0x1b55ba3a": "Start()", "0x6f3fe404": "updateBalances()", "0xc45b415e": "createRequest(address[4],address,uint256[11],uint256,bytes)", "0x180aadb7": "underLimit(uint256)", "0xb44bd51d": "getConfig(string)", "0x93d79105": "hashRelease(bytes32,bytes32)", "0x9f8a13d7": "isActive(address)", "0x257bcd6a": "placeBet(uint256,bytes32,bytes32)", "0xdd10d97e": "getPlayerWaiting()", "0x6d16f79c": "__transferWithReference(address,uint256,string)", "0x6ce1417e": "Fund()", "0x67beaccb": "scheduleCall(bytes)", "0x4b0697e4": "Manager(address)", "0x6a7fc8b7": "setDailyWithdrawLimit(uint128)", "0x7a6e9df7": "getTimestamp(bytes)", "0x797af627": "confirm(bytes32)", "0x81183633": "setStandard(bytes32)", "0x6a1db1bf": "changeFee(uint256)", "0x4e6ab570": "insert_order(address,bool,uint32,uint128)", "0xa4e2d634": "isLocked()", "0x7c79ebce": "expired(uint64)", "0x20965255": "getValue()", "0xfd408767": "fireEventLog4()", "0xcf6b3822": "WatchCollectedFeesInSzabo()", "0x8f7fe231": "ValidetherOracle()", "0xbf12165e": "fillUpSlot(uint256,uint256)", "0xdabdc1f2": "ChangeActiveDigger(address)", "0xe9e7a667": "get_stake(bytes32)", "0x0ad95b44": "bribery()", "0xdb6fcf01": "is_destroyed(uint256)", "0x4378a6e3": "getAttributes(uint256)", "0x71589d6b": "newponzi()", "0x47274dbe": "disableUser(address,address)", "0xb40a5627": "bidCount()", "0xf1eae25c": "mortal()", "0x13af4035": "setOwner(address)", "0xaf030d2c": "setResult(uint256,uint256,bytes32)", "0x098ab6a1": "snapshotCount()", "0x27cca148": "lastClaimedBlock()", "0x940c154b": "lockBet(uint256)", "0x378c0605": "buyTickets(address)", "0xbcfcb03e": "allocateFounderTokens()", "0x0138e31b": "_jAdd(uint256,uint256,uint256,uint256)", "0x0a7f4239": "getAccountFundContract(address)", "0xc96593a0": "The10ETHPyramid()", "0x22beb9b9": "scheduleDoIt(uint256)", "0xdb0e127a": "openDoor()", "0x3dc02266": "fipsRegister(uint256)", "0x7d242ae5": "setBasePrice(uint256,bytes)", "0xe82b7cb2": "proxySetCosignerAddress(address,bytes32)", "0xa60bbcd3": "ModelCoordinator()", "0xc26aa3c9": "lockUnicorn(uint256)", "0x96ff7e97": "requestIdentity()", "0x99753de7": "clear_level()", "0x69d79ad5": "moneySumAtSettlement(address,uint256,uint256,int256,uint256,uint256)", "0xda359dc8": "setBytes(bytes)", "0x6edb4cf6": "testThrowRetractLatestRevisionDoesntHaveAdditionalRevisions()", "0x9d170c5d": "getRef(string)", "0x11cd98ed": "convertToAllTable(uint256,string)", "0x67f809e9": "DynamicPyramid()", "0xd5f37f95": "sign(uint256,uint256,address)", "0xf5562753": "getClaimAmountForBlock(uint256)", "0xc9bbc8c0": "donkeyName(address)", "0x5858ef10": "testErrorNonOwnerCantBreach()", "0x74388347": "checkBetDozen(uint8,address,bytes32,bytes32)", "0xee564544": "_slotCancelNew()", "0xf3bb9741": "commitmentCampaign(uint256,bytes32)", "0x2b68b9c6": "destruct()", "0xa9b8f7b8": "ProtectTheCastle()", "0x16181bb7": "shortSellShares(bytes32,uint8,uint256,uint256)", "0xb524abcf": "totalSupply(bytes32)", "0x8006745b": "getPayout(address)", "0x137c638b": "getExtraGas()", "0x824d5603": "getIndex(uint16,uint16)", "0x245a6f74": "isProxyLegit(address)", "0x9eded57a": "paybackLast()", "0x7b1aa45f": "ownerDeposit()", "0x974654f4": "requiredGas()", "0x76d690bb": "BountyList()", "0xf4b2dfea": "Matching_Finneys()", "0xbd66528a": "claim(bytes32)", "0x85eac05f": "changeOwnerAddress(address)", "0xa69df4b5": "unlock()", "0xe6d9bb0f": "secondsUntilEnd()", "0xcd57a448": "SwapContract(address,uint256)", "0xb245fc92": "findNextMonth(uint256,bytes)", "0x7620f4bb": "fipsNotaryLegacy68b4()", "0x61886014": "combineDice(uint8,uint8)", "0xdf4ec249": "step3()", "0x2262cd94": "wroom()", "0x1099d3ec": "scheduleTransaction(uint256,uint256,uint256,bytes)", "0xd8c34127": "isKnownSignature(string)", "0x8afa08bd": "setDrawDate(uint256)", "0xdb18c972": "play4(address,uint256)", "0x2f30283e": "testSomething()", "0x8ca17995": "divest(uint256)", "0x1ef3755d": "restart()", "0x99bb875c": "funeralAndBirth(bytes,int256,bytes)", "0x157ad5a1": "canWithdrawBond(address,uint256)", "0xfd8055d2": "updateBOTBillingInfo(uint256,string,address,string,string,uint256)", "0xa10889fa": "setVersion(uint32,uint32,uint32,string,string)", "0x51cff8d9": "withdraw(address)", "0xbe999705": "addFunds(uint256)", "0x2e5d1042": "requestPayout(uint256,uint256,bytes32,uint256,uint256)", "0xb50954b6": "cancelWaitingForOpponent()", "0xc42cd8cf": "etherSplit(address,address)", "0x42ce1488": "upload(string)", "0xad04592e": "owner_deposit()", "0xc2cf7326": "hasConfirmed(bytes32,address)", "0x1dbf3bc7": "spend(uint256)", "0x36b81feb": "Deed(address)", "0xf47289e1": "_ecDouble(uint256,uint256,uint256)", "0x026993e0": "Midas(address,address)", "0x5e404de3": "setMaximumCredit(uint256)", "0x0194db8e": "sum(uint256[])", "0xa04a0908": "execute(address,bytes,uint256)", "0x2b4a3b31": "doTransferFrom(address,address,uint256)", "0x96ed10a4": "issuePOIs()", "0xb75c7dc6": "revoke(bytes32)", "0x6056969b": "announce(bytes32)", "0xd63547e6": "GetFreeCnt()", "0x788e26e7": "sponsorDeposit()", "0x550dd006": "calcCostsBuying(uint256,uint8,uint8,uint256)", "0xd4b1d19f": "testThrowsTransferDisabled()", "0x04706fdf": "giveContributionsBackProfitBugged()", "0x5d5483b3": "WatchAppliedFeePercentage()", "0x6bf8f85a": "forceFinish()", "0x3edd90e7": "NewOwner(address)", "0x7c69b5d1": "NewDeposit(uint256)", "0x866f6736": "trustedChildWithdraw()", "0xcdcb7c8f": "chase()", "0x60dccd89": "getContentAccount(uint256)", "0xbff1f9e1": "totalUsers()", "0x1aca00fd": "variable(uint256)", "0x6e658fbe": "myFundsExpireIn(uint256)", "0xddb1bdc8": "credit(address,uint256,uint256)", "0x934bc29d": "exampleFunction(uint256)", "0x113e6b66": "fipsAddToLedger(bytes20,address)", "0x1a88bc66": "slot()", "0xec97cff7": "addCertificationDocument(address,bytes32)", "0x0790e880": "setBlockappsAddr(address)", "0xe0ad411d": "assets(bytes)", "0x791b51f1": "Consulting(address,address)", "0xa26dbf26": "totalParticipants()", "0xb78b52df": "allocate(address,uint256)", "0xdb29fe12": "addShareholder(address)", "0x06459119": "testThrowsTransferNotTransferable()", "0xbadbaa3c": "setCallData()", "0x2c6b2c92": "checkProfitLossSinceInvestorChange()", "0x8aa6f1b1": "setUltimateOutcome(bytes32)", "0xecb98714": "random_damage(uint256)", "0x506e106c": "setToS(string)", "0xf0d474f9": "underdogCount()", "0x2212dbc3": "get_timestamp()", "0xd504ea1d": "getArray()", "0x9b29cb23": "getDailyPayment()", "0x9d3e069c": "StartDraw()", "0x12494160": "isHolder()", "0xbbd4e8c9": "numDeposits()", "0xfea2920e": "createNewDraw()", "0xff556ecb": "releaseUnicorn(uint256)", "0x3bed33ce": "withdrawEther(uint256)", "0xaa9669c1": "roll(uint256,bytes)", "0xa00aede9": "scheduleCall(uint256,address)", "0xc0819961": "Invest()", "0x1ed24195": "getPeriod()", "0x5babb758": "testSetUp()", "0xaaf9d13e": "buyTopDog(uint256,uint256)", "0x7c45ef6c": "stringToSig(string,string)", "0x7353f62b": "testGetApprovalDb()", "0xef7507c8": "testWinner(uint256)", "0x7ef95c6f": "extractAccountAllowanceRecordLength(address)", "0x66099706": "getChannelCred(address,uint256)", "0x5c242c59": "query1(uint256,string,string,uint256)", "0x299a7bcc": "setOwner(address,address)", "0xe1152343": "payout(uint256)", "0xd40a71fb": "step1()", "0xda9c6a46": "getReplyCount(uint256)", "0xffb7bfba": "watchProposal(uint256)", "0x2e1a7d4d": "withdraw(uint256)", "0x03da8902": "transfearDBOwner(address)", "0xc9bd2893": "fines()", "0xfdd3a879": "quick()", "0xda0774ad": "getCallFeeScalar(uint256,uint256)", "0x0f2c9329": "split(address,address)", "0xa3912ec8": "receiveEther()", "0xfd6f5430": "setContent(string,bytes32)", "0x99e0021f": "mergencyCall()", "0xb7aec6a5": "scheduleCall(address,bytes,uint256,uint256,uint8,uint256)", "0x23145ca0": "forceCheck()", "0xc7cf28fe": "canClaimTimeout()", "0x26db7648": "proposedVersion()", "0x60a60fd8": "testProxyCallWithValue()", "0x044d0b06": "oraclize_query(string,string[2])", "0x4f013184": "investInTheSystem()", "0x0c9fd581": "assertTrue(bool)", "0x09574810": "getOperationsNumber()", "0x6e2edf30": "ETCSurvey(address)", "0x3cc86b80": "GetMoney(uint256,address)", "0xf7b89a3e": "getTotalCosts()", "0xb18c6847": "manualUpdateBalances()", "0x8a65d874": "userStats(address)", "0xf80b3cfa": "checkBetLowhigh(uint8)", "0xc2def3b9": "getOrganizer()", "0x2dae9878": "BankOwner_EnableConnectBankAccountToNewOwnerAddress()", "0x1998aeef": "bid()", "0xc64e8bc0": "executeN(uint256)", "0xd4088e33": "setPrice(uint256,uint256,uint64)", "0xd263b7eb": "ownerkill()", "0xc478fc37": "EtherWheel(uint256,uint256,uint8)", "0x05b765ea": "getCertifierStatus(address)", "0x93c32e06": "changeFounder(address)", "0xf207564e": "register(uint256)", "0xae6c0b03": "canWithdrawBond(uint256)", "0x2b1071c9": "testTransferToNullAuthority()", "0xd9feeeb6": "fillMyOrder(uint256)", "0x9fb755d7": "setHotWallet(address)", "0x7f98444f": "randomEnd()", "0xf3fef3a3": "withdraw(address,uint256)", "0x48a0d754": "available()", "0x3af94817": "getPongvalRemote()", "0xec21a913": "setUint256(int256,uint256)", "0x6099af40": "setConfigBool(bytes,bool)", "0xf0cbe059": "proxyTransferFromWithReference(address,address,uint256,bytes32,string)", "0xf93589ce": "didWin(bytes)", "0x1eb5ea2e": "returnFunds()", "0xa6027d53": "IconomiTokenTest(uint256,string,uint8,string,uint256)", "0x8a323b38": "Contract(uint256,string,uint8,string)", "0xb0f07e44": "registerData()", "0xc9d27afe": "vote(uint256,bool)", "0x64265b1a": "share_transfered(string)", "0x78205f67": "testThrowTransferEnableNotTransferable()", "0x081780f4": "clearRecord(bytes32)", "0xdd137b5d": "toBase58(uint256,uint8)", "0x9483e91a": "withdraw(address,uint256,bytes,uint256)", "0xc6502da8": "basePayment()", "0xe17e1274": "testTransferToRejectAuthority()", "0x9af605cb": "__proxy(address,bytes,uint256)", "0x7a8df1b9": "getAffiliateInfo(address)", "0x46b305d6": "lockBetsForWithdraw()", "0x7d4cf602": "buildDSBalanceDB()", "0xce87f626": "replaceWizardRP(address)", "0x125b8f06": "isInNextGeneration()", "0xd0068f80": "getClient(uint256)", "0x7f0899f2": "AddTicket(bytes5[])", "0xb15dcc25": "query(address,bytes2,uint256)", "0x07a9574a": "changeLeaderMessage(string)", "0x16e55626": "getDogName(address)", "0xbc058968": "updateThingData(bytes32[],bytes32[],uint88)", "0x02aa274b": "setForward(bytes4,address)", "0x08f235ec": "getDefaultPayment()", "0x1dd4914b": "withdrawEtherOrThrow(uint256)", "0x7ca31724": "tokenId(address)", "0x0c4f65bd": "getOwnerAddress()", "0xeec3cb41": "placeBet(bool[],uint256,uint256)", "0x9054bdec": "toTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)", "0x468f02d2": "getUnderlyingPrice()", "0x74331be7": "sete(address)", "0xb05e390a": "TokenEther(string,string)", "0x89cc5ea8": "bid(string,address,uint256)", "0xa8893a6e": "getNumOfSalesWithSameId(bytes16)", "0x3defb962": "heartbeat()", "0x15a03930": "TossMyCoin()", "0x1d8ae626": "Security(string,string)", "0xf1bca7a4": "doCall(uint256)", "0xae6215d8": "getBlockHeight(bytes)", "0x8124bb0f": "continueExecution()", "0xc1cbbca7": "contribute(uint256)", "0xa48566ba": "serverSeed(address,bytes)", "0xc0f5a9cb": "deleteThing(bytes32[])", "0x4136aa35": "isAlive()", "0x6fe665e9": "SlotMachine()", "0xfaff50a8": "rootNode()", "0xaf769eff": "Paper()", "0x77863b61": "CrossWhitehatWithdraw(uint256,address)", "0x2bed55b0": "buildDSEasyMultisig(uint256,uint256,uint256)", "0xd2ef7398": "challenge()", "0x96e4ee3d": "convert(uint256,uint256)", "0x2dff6941": "content(bytes32)", "0x4d536f9f": "validateNameExt(bytes)", "0xd4d5d32a": "collectFee()", "0x6620a935": "sendToOwner()", "0x5084da18": "fipsOwner(bytes20)", "0xe419f189": "multiAccessIsOwner(address)", "0xa9fbc614": "lookupTicketHolder(uint256)", "0x11f72496": "testT()", "0x7365870b": "bet(uint256)", "0x09861b81": "flooredSub(uint256,uint256)", "0xe28fed1e": "userRescues(address)", "0x28cc413a": "getProof(uint256,uint256,uint256)", "0x9a8f09bd": "newKing(address)", "0x5d068051": "sendFees(address)", "0x49cbe338": "tryRead(uint64)", "0x691bfc89": "goods(uint16,uint256)", "0xfc36e15b": "vote(string)", "0x48107843": "getNextCallSibling(address)", "0x6461fe39": "transferFromWithReference(address,address,uint256,string)", "0x804e11dc": "testThrowsDisownNotTransferable()", "0x76f30ca1": "toContentID(address,uint256,string,bytes)", "0xa77b2e37": "Coin()", "0x3f2f1596": "setupTreasury(address,uint256)", "0x3de9e4c6": "__transferFromWithReference(address,address,uint256,string)", "0x612e45a3": "newProposal(address,uint256,string,bytes,uint256,bool)", "0x4cdb48e4": "isValidNym(address)", "0x5afa5036": "isCertified(address)", "0x9a1b420b": "OraclizeAddrResolver()", "0xec5c9036": "Crowdsale(address,uint256,uint256)", "0x01095962": "oraclize_setCustomGasPrice(uint256)", "0xe7e2aa0e": "buyer_cancel()", "0x2da8f764": "submitVideo(string,string)", "0x3395dc70": "acceptTransfer(address,address,uint256)", "0xdf143fb7": "HackerGold(address)", "0x63334c58": "transferETC(address)", "0x6a5da6e5": "followCampaign(uint256)", "0x49fb2dc5": "add_to_association(uint256,uint256,uint256)", "0x953aa435": "GetPrice(uint8)", "0xc1257bad": "testPassingAProposal()", "0x3bc5de30": "getData()", "0x4abb9d39": "depletable()", "0x129484b6": "changeFeeRecipient(int256,int256,int256,int256,int256,int256)", "0x902e64e5": "Oath()", "0x8c4dd5cd": "Democracy()", "0xbea124a6": "query(bytes,bytes,int256)", "0x69347990": "ownerWithdrawl()", "0x606deecd": "requestData()", "0x6720ceb1": "sendPayment()", "0xb1050da5": "newProposal(address,uint256,string,bytes)", "0xfeaa29d8": "insertProfitHere()", "0x36f9f49c": "etherandomSeed()", "0xae815843": "query(uint256,string,string,uint256)", "0x752d349c": "depthCheck(int256,int256)", "0xa24835d1": "destroy(address,uint256)", "0x26070774": "Token(address)", "0x6e0d98fe": "setProbabilities(uint32[])", "0x0761a004": "step(uint256,bytes)", "0xad82dcac": "testBlockhashCorrectFee()", "0x0900f010": "upgrade(address)", "0xa288fb1f": "setConfigUint(int256,bytes,uint256)", "0xe88b8ac6": "confirmAndCheck(bytes)", "0xf1a00a53": "unregisterListening(address)", "0xb17acdcd": "collectFees(uint256)", "0xb5d0f16e": "getGasScalar(uint256,uint256)", "0xae999ece": "reserve(string)", "0x95ceb4b3": "winningProtocal()", "0x1a93fa4b": "reorganizeSubUsers()", "0x9243e088": "setEnforceRevisions(bytes20)", "0x342454c7": "isDigit(bytes1)", "0x8e2c6f4d": "initiateVerification(address,bytes,bytes)", "0xddb5b3ac": "SellTokens()", "0xd18dfdc9": "parrot(uint256)", "0xd3732642": "FastRealisticPyramid()", "0x37ab8f20": "notifyPlayer(uint256,uint256,uint256,uint256)", "0xfb6e155f": "availableVolume(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", "0x50ab6f7f": "getMsgs()", "0x6b6a53fa": "testThrowsRestartNotOwner()", "0x4dc7cc55": "terminateAlt()", "0x8b9726c1": "multiAccessCallD(address,uint256,bytes,address)", "0x5a74dee5": "multiAccessRemoveOwnerD(address,address)", "0xfd339d18": "testAuthorityTryAuthUnauthorized()", "0xd3d6a975": "testThrowsTransferNotEnabled()", "0x8aa001fc": "getSecond(uint256)", "0x2ec2c246": "unregister(address)", "0xbbdb31cb": "challenge(uint256,address,bool)", "0x635cfda2": "Incrementer()", "0x704b6c02": "setAdmin(address)", "0xc1c723f4": "validateProposedMonarchName(bytes)", "0xadf5e565": "verify(bytes,address,uint256,uint8,bytes,bytes)", "0xbe7cddf8": "TwoD()", "0xc71b583b": "closeRequest()", "0x9cbf9e36": "createToken()", "0x69c4113d": "setNewBudget(uint256,uint256,uint256,uint256)", "0xd4649fde": "expire(uint256,uint8,bytes32,bytes32,bytes32)", "0xf9a7a2ef": "named(bytes)", "0xdbf45aa3": "EthBank()", "0xbb3ce7fe": "DepositHolder()", "0xfb5d5729": "getPongvalTransactional()", "0x2f0b15f6": "testGetUnset()", "0x62891b5d": "multiAccessChangeRequirement(uint256)", "0x538e0759": "refill()", "0x24c65f35": "updateRefundGas()", "0x62b24189": "DepositToBankAccountFromDifferentAddress(uint32)", "0xd81f53fd": "EtherId()", "0xcea943ee": "getSaleConfig()", "0x23647398": "testThrowRetractNotOwner()", "0xcdcd77c0": "baz(uint32,bool)", "0xa677fbd9": "example2Func()", "0xa02b9aac": "getPaymentDataByAddress(address)", "0x268eb055": "setDescription(uint64,bytes)", "0x09d2d0b9": "setServiceAccount(address,bool)", "0x5f70d9ac": "getBot(uint256)", "0x63f80de3": "issueCoin(address,uint256,uint256)", "0x8570153e": "publish(string,string,bytes,address[])", "0x7975c56e": "oraclize_query(uint256,string,string)", "0x7c3064f1": "refundStake()", "0xef4ffee2": "Honestgamble()", "0xfdc193a4": "test3Fails()", "0x0eb495c2": "pushCity()", "0x6a357465": "payHours(address,uint256)", "0x93f0bb51": "order(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", "0x0a9254e4": "setUp()", "0xc490a266": "toUInt(bytes)", "0xf666323e": "UUIDProvider()", "0x857d4c07": "throwScraps(uint256)", "0x7fd8ee68": "computeNameHashExt(bytes)", "0x7bd703e8": "getBalanceInEth(address)", "0x68f65f02": "ChangeShownDenomination(bool,bool,bool,bool)", "0xc7f758a8": "getProposal(uint256)", "0x824dbc9a": "changeMembership(address,uint256,bool,string)", "0x2a228fc2": "processWithdrawals()", "0xe0457884": "betResolution(uint8,uint8,uint8,bool)", "0x550538f6": "getOneTimeCosts()", "0xf3e84cf3": "createNewRevision(bytes32,bytes)", "0x77fe38a4": "transferToICAPWithReference(bytes32,uint256,string)", "0xcc189d00": "Vault(address,uint256)", "0x9e281a98": "withdrawToken(address,uint256)", "0x7b12df39": "userProfits()", "0xa843c97f": "attack(uint256,uint256,uint256[])", "0x9da680f3": "adjustRegistrationFee(uint256)", "0x3ea3f6c5": "activateRegistrar()", "0xb36df681": "ExecutableBase()", "0x0f3a1412": "getArrlist(uint256,uint256)", "0x8b7f0ddd": "register(address,address,string,string,bytes32[],uint256,string)", "0xb5d3a379": "CanaryTestnet()", "0x9894221a": "SendCashForHardwareReturn()", "0xc2b12a73": "setBytes32(bytes32)", "0xff1b4341": "easyPropose(address,uint256,uint256)", "0x927ed13a": "newClient(uint256,address)", "0x9b9d0364": "_setFeeStructure(uint256,uint256,uint256)", "0x01518d76": "sendQuery(uint256)", "0x4112b7f1": "tryGetNameOwner(bytes)", "0xb759f954": "approve(uint256)", "0x810a882f": "setConfigBytes(bytes32,bytes32)", "0xea7a7184": "testGetBalanceDb()", "0xb0c8f9dc": "add(string)", "0xe59f611f": "InputLimit(uint256)", "0xdce293a7": "minLength(uint256)", "0xf509b627": "confirm(address,uint224,uint32,address)", "0xd48bfca7": "addToken(address)", "0x044f9ac8": "findThroneCalled(bytes)", "0x1d57bcf7": "ProofLibInterface()", "0x75830463": "checkBetLowhigh(uint8,address,bytes32,bytes32)", "0x2a45a39a": "Post(address)", "0x29cbdc86": "buyin(address,uint256)", "0x3cbfed74": "getBondBalance()", "0x80a23ddf": "mintBadge(int256,address,uint256)", "0x96b76c23": "stand(uint256)", "0xc392f5a0": "getAllPackageReleaseHashes(string)", "0x4847a79c": "_transfer(address,uint256)", "0x905e6e42": "JSON_Test()", "0x9f489e4e": "getDeposit(uint256,address)", "0x4f8e624e": "Greeter(string)", "0x96013c9c": "testLatestPkgGetter()", "0xe4fc6b6d": "distribute()", "0x423d4ef2": "createChannel()", "0x24d7806c": "isAdmin(address)", "0x691fb8ea": "jumpIn()", "0xd50f6bf0": "transferETH(address)", "0xd0e0813a": "promote(address)", "0x528eedcb": "sendSafe(address,address,uint256)", "0x00faf4dd": "getTokenDivisor()", "0x46a1d95f": "closeMarket(bytes)", "0x318a3fee": "relayTx(bytes,int256,int256[],int256,int256)", "0x49d55d9d": "receiveTransfer(uint256)", "0x4fa99dd0": "Matching_Ethers()", "0x99a5d747": "calculateFee(uint256)", "0x3c67c51e": "testLogs()", "0x12ab7242": "setupStackDepthLib(address)", "0xad9ec17e": "setGreyToken()", "0xc37e8cb2": "testExportAuthorized()", "0x43046844": "placeBet(uint8)", "0xc6e1c178": "TheLuckyOne(bytes)", "0x13d1aa2e": "f(uint256,uint256)", "0x64a4a5d7": "testBitsEqualSuccess()", "0xfb1669ca": "setBalance(uint256)", "0x40fdef80": "administration(uint256,string,uint256,uint256,address)", "0xcf7315c6": "retract(bytes20)", "0x76196c88": "setDnsrr(bytes32,bytes)", "0x08bf2d0d": "getOrderBook(uint256,uint256)", "0x021c309a": "solveBet(address,uint8,bool,uint8)", "0x4de162e4": "extractAccountLength()", "0x56fa47f0": "split(address)", "0xb3a0b1ef": "basicInfoGetter()", "0x26066ad5": "offer(uint256,bytes,uint256,bytes)", "0x99c724ef": "skipInLine(uint256,uint256)", "0x838445e8": "EtherAds(address,address,address)", "0xe06174e4": "settings()", "0xfac5bb92": "getPreRelease(bytes32)", "0x93c94acb": "calculateRewards(uint256[3][3])", "0xd7fa1007": "setHash(bytes32,bytes32)", "0x2a714078": "triggerAuth()", "0x4cd995da": "registerCompany(address,string)", "0xf6469342": "_setPackedBlockNumber(bytes32,uint256)", "0x8e7fd292": "trySetSubnodeOwner(bytes32,address)", "0x4f573cb2": "withdrawRevenue()", "0x924c28c1": "ContractInterface(address,address,address)", "0x4fc9c91a": "identityOf(bytes32)", "0x19901f1d": "TokenSale(uint256,uint256)", "0xaf8b7525": "CollectAndReduceFees(uint256)", "0x3ccb7dc9": "CrowdFund(uint256,uint256)", "0xaeeb96af": "Highlander()", "0xa126c5df": "GAS_TO_AUTHORIZE_EXECUTION()", "0x13c89a8f": "getAllowedTime(bytes32)", "0xf38b0600": "fireEventLog3()", "0xc7144269": "changeSettings_only_Dev(uint256,uint256,uint256,uint256,uint16,uint256,uint256,uint256,uint8,uint8)", "0xefc81a8c": "create()", "0x7429c086": "repeat()", "0x9c0a4bbc": "AlwaysFail()", "0xc3d23e10": "checkBet()", "0x28a45038": "testTryProxyCall()", "0xa668d7c9": "NiceGuyPonzi()", "0x06fe1fd7": "getPackageName(bytes32)", "0x29f27577": "InvestorList(uint256)", "0x57e25a79": "PullPaymentCapable()", "0x6d1669e1": "approveAndCall(address,address,uint256,bytes)", "0xa7e93e87": "retractLatestRevision(bytes20)", "0x9c7e8a03": "addParticipant(address,address,uint256)", "0xc6ab4514": "sendRobust(address,uint256,uint256)", "0xe8f6bc2e": "changeAccountLevelsAddr(address)", "0xb5d1990d": "numRecords()", "0x3e853128": "getGasForXau(address)", "0xa1add510": "hasRelation(bytes32,bytes32,address)", "0x31e3e2fe": "WithDraw()", "0x86723215": "createMarket(bytes,uint256,uint256,address)", "0xce845d1d": "currentBalance()", "0xc3a2c0c3": "scheduleCall()", "0xcf8eeb7e": "subBalance(address,uint256)", "0xaeb4f0d3": "RegisterTwo(address,address)", "0x3c716e08": "updateAuthority(address)", "0x9919b1cc": "getContentsByRanks(address,uint256,uint256,uint256)", "0x0f06670a": "didWin(bytes32)", "0x74e4435f": "getUserAddress(uint256,bytes32)", "0x4664b235": "bytes32_to_bytes(bytes,bytes,bytes)", "0x2ac9bf09": "bid(uint256,uint256,uint256)", "0xf11c4482": "approveFromProxy(address,address,uint256)", "0xfe992c98": "balanceOfAll(address)", "0x43e332c5": "Last_block_number_and_blockhash_used()", "0x0066753e": "removeCertifier(address)", "0xd299dac0": "blake2b(bytes,bytes,uint64)", "0x41395efa": "dgxBalance()", "0xac1b14ff": "proxyCall(uint256)", "0x7a6ce2e1": "getMsgSender()", "0x3855dcd6": "getContrarians_by_index(uint256)", "0xe6febc9b": "investorWithdraw(uint256)", "0xe6e91cfc": "voidFailedPayment(uint256)", "0x547eeac1": "acceptTransfer()", "0x9824425a": "takeOrder(uint256,uint256,uint256,uint256)", "0xdf25ee23": "getIndexId(address,bytes)", "0x0f3d7c3e": "release(string,uint32[3],string,string,string)", "0x15cff546": "isOperationBlocked()", "0x0b927666": "order(address,uint256,address,uint256,uint256,uint256)", "0x00ce2057": "triggerPayment()", "0x9a9c29f6": "settle(uint256,uint256)", "0x0f096163": "Chainy()", "0x2f5a5c5b": "timegame()", "0x900d85fa": "updatePreReleaseTree(bytes32)", "0x1cbd0519": "accountLevel(address)", "0x29a065bd": "getLOg(uint256)", "0xcec95aa1": "getReleaseHashForPackage(string,uint256)", "0x41524433": "sellKissBTCWithCallback(uint256,address,uint256)", "0x5e431709": "sealedBids(address,bytes32)", "0xf55b23c0": "externalLeave()", "0x31375242": "ownerSetTreasury(address)", "0x51b42b00": "deactivate()", "0x5af36e3e": "refund(uint256,uint256)", "0xc5096a69": "feeFor(address,address,uint256)", "0x059a500c": "makeDeposit(uint256)", "0x3c2e7d54": "priv_inMainChain__(int256,int256)", "0x9431f5f0": "withdrawFees(bytes)", "0x91b4a0e7": "Difficulty()", "0x268d50fe": "ownerSetHouseEdge(uint256)", "0x9644fcbd": "changeMembership(address,bool,string)", "0x66aa6f26": "payFee(bytes)", "0x353928d8": "helpRed()", "0x9c1193ea": "GreeterA(bytes)", "0xdd79e33e": "splitIdentifiers(string)", "0x4d268ddd": "payImporterBankForGoodsBought()", "0x656d2f63": "ManagedAccount(address)", "0x1216e771": "expiration(uint64)", "0x36f7cd70": "setPricePerStake(uint256)", "0x7842a3a4": "payReward()", "0x0ae50a39": "GetOwner()", "0xc81caae7": "acceptMember(address,string,string)", "0xe50dce71": "testControllerApproveSetsAllowance()", "0x4b64e492": "execute(address)", "0xd9e947f3": "kickOutMember(address)", "0x35cc59a9": "createSchema(bytes)", "0x2530c905": "rand(uint256)", "0x4894e37f": "__callback(bytes,string,bytes)", "0x70480275": "addAdmin(address)", "0x969cb7c3": "getPublisher(uint256)", "0x4ed4831a": "all(bool[7])", "0x2ef3accc": "getPrice(string,uint256)", "0x67854643": "getGenerationMemberLength(uint256)", "0xe6690fb1": "nextAuction(uint256)", "0x5829d310": "entries(int256)", "0x7fe1dc7e": "getToken(bytes)", "0xe7329e71": "scheduleCall(bytes,bytes,uint256,uint256,uint8,uint256)", "0x41c12a70": "voteNo()", "0x6a28db13": "getQrLength()", "0xdd93890b": "setMeta(uint256,bytes32,bytes32)", "0xa48bdb7c": "results()", "0x9d888e86": "currentVersion()", "0xff81fb91": "unhint(int256,bytes32)", "0x9ec32d45": "challengeWinningOutcome(bytes,uint16)", "0xa0a2f629": "setReferralId(uint256,address)", "0x76577eae": "distributeEarnings()", "0x3e5cee05": "issueIOU(string,uint256,address)", "0xf3c7d275": "prenup(string,string,string,string,string,address,address)", "0x7154ae61": "CheckNumbers(uint8[5])", "0x05de4f07": "getContentParent(uint256)", "0xb81e43fc": "getEventName()", "0xa7eeea37": "NewContributor(uint256)", "0xe816a515": "takeFlight()", "0x05b2b03a": "CertificationCentre(address)", "0x74d4ab27": "fipsRegister()", "0x65fa2f7f": "getLastPrice(uint256)", "0xcc8b34ab": "CrowdCoin()", "0xe2b178a0": "getAuthority()", "0x5fb64fd6": "checkMembership(address)", "0x7948f523": "setAmbiAddress(address,bytes32)", "0xebb71194": "withdrawFees(bytes32)", "0x6545bed3": "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0x7065cb48": "addOwner(address)", "0x913f424c": "_ecMul(uint256,uint256,uint256,uint256)", "0xdbecc372": "Example(uint256)", "0x9f7f760c": "SimpleDice()", "0xca94692d": "abiSignature()", "0x61ba3377": "WatchLastTime()", "0x20e647e1": "checkBetColor(uint8,address,bytes32,bytes32)", "0x0a3b0a4f": "add(address)", "0xc51cf179": "calcBaseFeeForShares(uint256)", "0x8baced64": "isInPool(address)", "0x4dc415de": "reject()", "0x1555e337": "ConferenceCertificate()", "0x9555a942": "withdrawFrom(address,address,uint256)", "0xe1efda6d": "airaSend(address,address,uint256)", "0x8bfc2f33": "delegateDAOTokens(uint256)", "0xb964608d": "get_return_by_level(uint256)", "0x0c1fad51": "setSeedSourceA(address)", "0x98688a95": "Ai()", "0xd930a90b": "testFailMoveBalanceDueToInsufficientFunds()", "0x337b5988": "testSimpleNameRegister()", "0xf06d335e": "_recoverAccount(address,address)", "0x025bbbe5": "newSale(bytes16,uint256,uint256)", "0x984413b8": "_eraseNode(bytes32)", "0x5ea187c9": "BuildByteArray(bytes)", "0xc2a95cc9": "updateTrustSettings(address,uint256)", "0xde0ff7c5": "getEther()", "0x4ac7becf": "SimpleSign()", "0x252786e4": "WatchBlockSizeInEther()", "0xf2016a4f": "updateMinEthPerNotification(uint256)", "0xd743ca38": "newWinner(uint256,address,uint256,uint256,uint256)", "0x9eab5253": "getMembers()", "0x51d38d5f": "addDeveloper(address,string)", "0x930ed251": "getSavedVar()", "0x715ef4ff": "resendFailedPayment(uint256)", "0xb1418cf4": "payHouse()", "0xe1569f6b": "testThrowsSetNotRetractableNotOwner()", "0x4ae9af61": "getBotStats(uint256,uint256)", "0xbf8ecf9c": "authProposals()", "0xc00ca383": "getByOwner(address,uint256)", "0xc8e7ca2e": "getMsgData()", "0x711953ef": "setGameAddress(address)", "0x63a8dac2": "changeSettings(uint256,uint256,uint256,uint8,uint256,uint256,uint8,uint8)", "0x72c87075": "testBlockHeaderFetch()", "0x4c7a2254": "checkMyWithdraw()", "0xab91c7b0": "queueLength()", "0x25209260": "PrepareRoll(uint256)", "0x58150c8b": "GameRegistry()", "0x75608264": "get_hash(uint8,bytes32)", "0x6510ef4d": "oraclize_query(uint256,string,string[5])", "0xd57a12f5": "testCheckSigs()", "0x3f415772": "releaseExists(bytes32)", "0xda25c0cd": "ThisExternalAssembly()", "0xf239e528": "sendOneEtherHome()", "0xc4321adb": "investInTheSystem(uint256)", "0x4fab2ca4": "testGetFrontend()", "0x05261aea": "finalize(uint256)", "0x576eac66": "setFundingGoal(uint256)", "0xe75528cc": "buyBuilding(uint256,uint256)", "0x6ed43eb0": "getInvestorList(uint256)", "0xb38415f3": "getConfigBytes(bytes)", "0x771ad635": "getContentCred(address,uint256)", "0x93c166ec": "computeEndowment(uint256,uint256,uint256,uint256)", "0xac35caee": "transferWithReference(address,uint256,string)", "0xc6803622": "wasCalled()", "0x8cfd8901": "_incBlock()", "0xfcf0f55b": "eventOracles(bytes32,uint256)", "0x505ff574": "register(address,uint256,bool)", "0xf824384a": "addInvestorAtID(uint256)", "0x6b9f96ea": "flush()", "0xc3d0a564": "getAccountBalance(bytes)", "0x30fd300f": "registerBytes32(address,bytes32)", "0xc3169ef2": "respond(uint256,uint256[4])", "0xcf1cd249": "secureSend(address)", "0x62c335c1": "checkCallback(address,uint256,bytes,bytes)", "0xb599afc8": "totalBetCount()", "0x69433e12": "setExchange(uint256)", "0x899942b8": "Devcon2Token()", "0x4c2d71b3": "setConfigAddress(bytes32,address)", "0xb974b0a3": "allData()", "0x27e8c2d8": "burnUnicornShares()", "0xf639365d": "testSetGet()", "0x2f5d3916": "testControllerApproveTriggersEvent()", "0x938b5f32": "origin()", "0xd60dcb5d": "Switch()", "0xde629235": "getCertificationDocumentAtIndex(address,uint256)", "0x329ce29e": "buyTile(uint256)", "0x59e2d30e": "testThrowBlobStoreNotRegistered()", "0xa005b87b": "NullMapTest()", "0xc13afa91": "object_locations(uint256)", "0x4848b1a5": "setData(uint256,uint256)", "0x80ede329": "getDocumentDetails(uint256)", "0x35d13969": "SendAllMoney()", "0x8040cac4": "testOverflow()", "0x9507d39a": "get(uint256)", "0xc040e6b8": "stage()", "0x18178358": "poke()", "0xfd782de5": "Proxy()", "0xfd68a422": "returnmoneycreator(uint8,uint128)", "0x86a50535": "voteFor(uint256)", "0x44602a7d": "testFallbackReturn()", "0xa230c524": "isMember(address)", "0x3ffbd47f": "register(string,string)", "0x8cecf66e": "_inverse(uint256)", "0x51017702": "isOutcomeSet(bytes32)", "0xd408746a": "GetContractAddr()", "0x20130753": "testThrowSetNotRetractableNotOwner()", "0xa0e2abf7": "getFirstActiveGamble()", "0x7c582304": "updateInvestmentTotal(address,uint256)", "0x95d89b41": "symbol()", "0x1768b436": "ETCSurvey()", "0x6d4ce63c": "get()", "0xc41a360a": "getOwner(uint256)", "0x49942ccb": "scheduleCall(bytes,bytes,uint256,uint256)", "0x6b64c769": "startAuction()", "0x084d72f4": "getWinningOutcome(uint256)", "0xd379be23": "claimer()", "0x41fa4876": "multiBlockRandomGen(uint256,uint256)", "0x5bc7e259": "updateRelease(uint32,uint32,uint32,bytes,bool)", "0x47f3d794": "configure(uint256,uint8,uint256,uint256,uint256,uint256)", "0xe2bbb158": "deposit(uint256,uint256)", "0x953a7fab": "testMoveBalance()", "0xeacc5b3b": "safeSend(address,uint256,uint256)", "0x96f0aa8f": "findNextSecond(uint256,bytes)", "0xc8690233": "pubkey(bytes32)", "0x459f93f7": "getBuyers(uint256,address)", "0xf714de9c": "MultiAccess()", "0xf4a81d08": "getKudosGiven(address)", "0x5aa94a68": "computeResultVoteExtraInvestFeesRate()", "0xdb2a0cb7": "HumanStandardTokenFactory()", "0xdf3a6b10": "testMemberAddedEvent()", "0xce8d054e": "_setupNoCallback()", "0x8ea822d8": "createThings(bytes32[],uint16[],bytes32[],uint16[],uint88)", "0x24fb563f": "PlayerTickets(address,uint256,uint256)", "0x8c0e156d": "scheduleCall(bytes4,uint256,uint256)", "0xef04fdb7": "buyShares(bytes,uint8,uint256,uint256)", "0xa0afd731": "dividendBalance(address)", "0xc3c95c7b": "getMarket(bytes32)", "0x94ed9b77": "append(address,address)", "0xc87b36ed": "disableBetting()", "0x566735d8": "PreVNK(uint256,string,string,uint8)", "0x400aae08": "isInCurrentGeneration(address)", "0x44dd4b5e": "scheduleTransaction(address,uint256,bytes)", "0x48c54b9d": "claimTokens()", "0xe8930efd": "Investors(address)", "0xa6f2ae3a": "buy()", "0x12819817": "setXauForGasCurrator(address)", "0x056e1059": "oraclize_query(uint256,string,string,uint256)", "0x7824407f": "tokenSupply()", "0x7f0c949c": "setJurisdication(string)", "0x2e817963": "set_sdl(address)", "0xaee84f6b": "setTime(address,uint256)", "0x3c0dde1c": "_addPools(address,address)", "0xf8bd526e": "setCoinageContract(address)", "0x04b07a5e": "removeUpdater(address)", "0x11149ada": "getProof(uint256)", "0x4306cc3f": "queryEarnings(address)", "0x55241077": "setValue(uint256)", "0x492b67ea": "Etherdoc()", "0xadf59f99": "query(uint256,string,string)", "0x951b01c5": "setCertifierDb(address)", "0x8ae986cf": "registrantApprove(address)", "0xfa68b4ce": "lookupISO3116_1_alpha_3(bytes)", "0x7fdc8290": "isUnderscore(bytes1)", "0x89495172": "convictFinal(uint256,uint256)", "0x93e02d13": "FallenLeaders()", "0x3e476053": "moveFunds(address,uint256)", "0x8894dd2b": "addEther()", "0x8f03850b": "numContributors()", "0xbfc3cd2f": "testFailChargeMoreThanApproved()", "0x1d82e9c7": "EXTRA_GAS()", "0x278ecde1": "refund(uint256)", "0x0f825673": "deleteCoupon(string)", "0xa324ad24": "getMonth(uint256)", "0xd628e0a6": "WatchBalance()", "0xb238ad0e": "getDaysInMonth(uint8,uint16)", "0xd6febde8": "buy(uint256,uint256)", "0x370ec1c5": "_fillOrder(address,uint256)", "0x4c33fe94": "cancel(address)", "0xcdd13701": "getEventHashes(uint256[256])", "0xe1bc3003": "reveal(bytes,string)", "0xa2e62045": "update()", "0x75f45878": "scheduleCall(bytes,bytes,uint256)", "0xd2756e11": "finalizeNumber(uint256)", "0x48519189": "MonedaAlcala(string,string)", "0x009b9369": "getVoteNumber(uint256)", "0xdaa283c8": "__callback(bytes,string)", "0xfcce2622": "challengeAnswer(uint256,bytes)", "0xac18de43": "removeManager(address)", "0x16d9356f": "oraclize_query(string,string[4])", "0xd1734eac": "isInNextGeneration(address)", "0x524fa7b9": "whitelistAdd(address)", "0xa5eb7a4e": "operated()", "0xb0aab296": "getNextNode(bytes)", "0x1982ed58": "ChangeReuseCashInHarware(bool,uint16,uint16)", "0xdf811d7d": "numberOfPlayersInCurrentRound()", "0xca7dc5b1": "getNumberOfTweets()", "0x488b3538": "shares(address,bytes32,int256)", "0xebd83378": "get_blocks_for(uint256)", "0x399fdb86": "testFailNormalWhitelistReset()", "0xca0c1e62": "computeMerkle(int256,int256,int256[],int256,int256,int256[])", "0x8963dab4": "getNodeId(bytes,bytes)", "0x7d94792a": "seed()", "0xbcf175c8": "oraclize_cbAddress()", "0x38eee93e": "scheduleCall(address,bytes,bytes,uint16,uint8,uint256[5])", "0xa08d3f83": "Etheropt(uint256,string,uint256,uint256,bytes32,address,int256[])", "0xae47a290": "changeMaxBet(uint256)", "0xd12c1e28": "badgesOf(address)", "0x001f8d11": "removePackage(bytes32,string)", "0x54fd4d50": "version()", "0x89abeb19": "ProcessGameExt(uint256)", "0x3dd7c1b9": "newProduct(string,string,uint256,uint256)", "0xa396541e": "getPongvalTxRetrievalAttempted()", "0xcc8af0fe": "bytesToUInt(bytes,bytes)", "0x983b94fb": "finalizeAuction(bytes32)", "0x3df91162": "getUpdatable(bytes20)", "0x045236b4": "getChainyData(string)", "0x9c172f87": "EthVentures4()", "0x996a4be3": "uintToBytes(uint256,uint256)", "0x775a8f5e": "toBytes(uint256)", "0xb6db75a0": "isAdmin()", "0x0b6fcdb0": "getEnforceRevisions(bytes32)", "0x29d6f899": "BetOnBlue()", "0xe6cbcba9": "PlusOnePonzi()", "0xc9030ea0": "addMember(address,bool)", "0x8f283970": "changeAdmin(address)", "0x670c884e": "setup(address,uint256,uint256,uint256,address)", "0x808ab1d6": "getCertificationDbCount()", "0x018f5472": "isAUser(address)", "0x59c87d70": "request(bytes32)", "0x407cfe5e": "get_all_players()", "0x33f472b9": "MPO()", "0x662dbe96": "getNodeHeight(bytes)", "0x60b1e173": "getProof(uint256,address,address)", "0xf25eb5c1": "removeReverse()", "0x1d065dde": "_transferWithReward(address,address,uint256)", "0x65343fcb": "TrustEth()", "0xaa237e21": "set(bool,uint256)", "0x60e519c0": "computeMarginAmount()", "0xd9597016": "multisetCustomGasPrice(uint256[],address[])", "0x4f10acc1": "updateGoldFeeData(uint256)", "0x1e9ea66a": "balanceEther10000000(uint256)", "0xffe34512": "getNumChannels(address)", "0x71dd8862": "IndexOf()", "0xdd9dd688": "calcStopPrice()", "0x934354e7": "finishSpin()", "0x26881518": "setupFee(address)", "0x5eb3f639": "assertTrue(bool,bytes)", "0xe9540395": "getRewardDivisor()", "0x8e4afa51": "checkTransferToICAP(bytes32,uint256)", "0xb5b33eda": "scheduleCall(address,uint256)", "0x3d6a32bd": "createTradeContract(address,uint256,uint256,uint256,bool,bool)", "0x5fd9dff6": "allowance(address,address,bytes)", "0x0d244d68": "setNotRetractable(bytes32)", "0xe63697c8": "withdraw(uint256,address,uint256)", "0x3e5087cc": "testBasicThing()", "0xee77fe86": "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8)", "0xb1cc4348": "placeWager()", "0xb95594e5": "lineOfPlayers(uint256)", "0xa9cc4718": "fail()", "0x54385526": "setStatus(uint8,uint8,string)", "0xb45c48dc": "Security_AddPasswordSha3HashToBankAccount(bytes)", "0xace51abc": "helperVerifyHash__(uint256,int256,int256[],int256,uint256,int256,int256[],int256)", "0x1f5d0b4c": "address(address,address,uint256)", "0x7acbfb65": "setOwner(uint256,uint256)", "0x3462f32d": "execWithGasLimit(bytes32,bytes32,uint256,uint256)", "0xac04f5a7": "append(address)", "0x2fcb6628": "_stringGas(string,string)", "0xe977992d": "Doubler()", "0xc57a050e": "fairandeasy()", "0x412664ae": "sendToken(address,uint256)", "0x0afa9fb9": "contains(int256,address)", "0xb69ef8a8": "balance()", "0x264c8e9a": "whatWasTheVal()", "0x255016c8": "checkIfExploded()", "0xd716222c": "is_owner(uint256,address)", "0xc398f030": "expire(uint256,uint8,bytes,bytes,bytes)", "0xb7d454a4": "setNotTransferable(bytes32)", "0x4789aaef": "EthereumDice()", "0xc0171112": "timestamp(uint64)", "0x4f60f334": "multiAccessAddOwner(address)", "0x80aed05f": "LooneyDice()", "0x55ba343f": "getMarket(bytes)", "0x943b0747": "RewardOffer(address,address,bytes,uint256,uint256,uint128,uint256)", "0xa27c672a": "owner_reveal_and_commit(uint8,bytes32,bytes32)", "0x8f731077": "extractAllowanceRecordLength(address)", "0xc3d345c4": "getHangoutAddress()", "0xa8978434": "softResolveAnswer(uint256)", "0x7cef6047": "getNavHistory(uint256)", "0xfae14192": "changeFeePercentage(uint256)", "0x2ddbc04a": "play2(address,uint256)", "0x3fb27b85": "seal()", "0xe8038e25": "TokenSale(uint256,uint256,address)", "0x8d92fdf3": "withdrawAsset(uint256)", "0x8579cbde": "getPrice(string,uint256,address)", "0x0d61b519": "executeProposal(uint256)", "0x63a599a4": "emergencyStop()", "0x661e3605": "ConstructorContract(uint256)", "0xfd7c460d": "ciberLottery()", "0x1f83f440": "getPaymentByAddress(address)", "0xdcf73856": "generateGroups()", "0x3c6e03d7": "thewhalegame()", "0x271cd760": "getPackageDb()", "0x53fefd7d": "changeMaxDeposit(uint256)", "0xae169a50": "claimReward(uint256)", "0x6da84ec0": "calcMarketFee(bytes32,uint256)", "0xb16562fe": "fipsRegister(address,bytes)", "0x041fe13d": "onEtherandomSeed(bytes32,bytes32)", "0x4a617faa": "shaBid(bytes32,uint256,bytes32)", "0x052b2aa7": "getRegistrants()", "0x0ff0a4df": "reFund()", "0xe56b9dce": "GetPrize(uint256)", "0x8eec99c8": "setNewAdmin(address)", "0xffcce369": "changeIPFSHash(string)", "0x40fdf515": "issuetender(address,uint256,uint256)", "0xef4bdfdd": "Set_your_game_number_between_1_15(string)", "0xa991cb0e": "respond(uint256)", "0x617fba04": "getRecord(address)", "0x475a9fa9": "issueTokens(address,uint256)", "0xd30fbd0d": "safeSubtract(uint256,uint256)", "0xe54d4051": "receiveInteger(bytes,uint256,uint16)", "0x8023ffbd": "getOverallSize()", "0x8390b02a": "rfindPtr(uint256,uint256,uint256,uint256)", "0x11e99c22": "arrival()", "0x10c1952f": "setLocked()", "0x039a21b8": "tryExecute(address,bytes,uint256)", "0x201dcd7a": "newChallenge(uint256,uint256)", "0x5aebfd14": "createFile(bytes)", "0xa6b1caa3": "gasScalar(uint256)", "0x200538c6": "DTE()", "0xd1738b72": "wroomWroom()", "0x22f607f6": "Escrow()", "0x7e81b6aa": "KingdomFactory()", "0x901d7775": "voteOutMasterKey(address)", "0xd6af9411": "Rouleth()", "0x7b0383b2": "initializeDispute(uint256)", "0x70c9edb7": "BTCRelayTools(address)", "0xe9c31315": "checkBetParity(uint8,address,bytes32,bytes32)", "0xee82ac5e": "getBlockHash(uint256)", "0x727089f1": "extractAllowanceLength()", "0x8bbb5af7": "test1Fails()", "0x47872b42": "unsealBid(bytes32,uint256,bytes32)", "0x46b04e53": "PlayerInfoPerZone(uint256,uint256)", "0x752bacce": "getExecPrice()", "0x89d8ca67": "drawPot(bytes32,bytes32)", "0xc23697a8": "check(address)", "0x0af658ca": "personUpdateActivity(uint256,bool)", "0x24d4e90a": "ln(uint256)", "0x09d33f1d": "addRequest(address,uint256)", "0xc913b552": "getVersions(bytes)", "0xbb3b8dca": "getCertificateHash(bytes)", "0x3809c0bf": "doInfinite()", "0x853552d7": "_slotAddNew(address)", "0xccf1ab9b": "usurpation()", "0xe7dafdb6": "transfer_token(address,address,uint256)", "0x0c77a697": "claimFounders()", "0xda82a035": "sweepCommission()"} \ No newline at end of file diff --git a/cmd/clef/README.md b/cmd/clef/README.md index c02ac44d857a..eeaee0908cce 100644 --- a/cmd/clef/README.md +++ b/cmd/clef/README.md @@ -1,97 +1,89 @@ -Clef ----- -Clef can be used to sign transactions and data and is meant as a replacement for geth's account management. -This allows DApps not to depend on geth's account management. When a DApp wants to sign data it can send the data to -the signer, the signer will then provide the user with context and asks the user for permission to sign the data. If -the users grants the signing request the signer will send the signature back to the DApp. - -This setup allows a DApp to connect to a remote Ethereum node and send transactions that are locally signed. This can -help in situations when a DApp is connected to a remote node because a local Ethereum node is not available, not -synchronised with the chain or a particular Ethereum node that has no built-in (or limited) account management. - -Clef can run as a daemon on the same machine, or off a usb-stick like [usb armory](https://inversepath.com/usbarmory), -or a separate VM in a [QubesOS](https://www.qubes-os.org/) type os setup. - -Check out - -* the [tutorial](tutorial.md) for some concrete examples on how the signer works. -* the [setup docs](docs/setup.md) for some information on how to configure it to work on QubesOS or USBArmory. +# Clef +Clef can be used to sign transactions and data and is meant as a(n eventual) replacement for Geth's account management. This allows DApps to not depend on Geth's account management. When a DApp wants to sign data (or a transaction), it can send the content to Clef, which will then provide the user with context and asks for permission to sign the content. If the users grants the signing request, Clef will send the signature back to the DApp. + +This setup allows a DApp to connect to a remote Ethereum node and send transactions that are locally signed. This can help in situations when a DApp is connected to an untrusted remote Ethereum node, because a local one is not available, not synchronised with the chain, or is a node that has no built-in (or limited) account management. + +Clef can run as a daemon on the same machine, off a usb-stick like [USB armory](https://inversepath.com/usbarmory), or even a separate VM in a [QubesOS](https://www.qubes-os.org/) type setup. + +Check out the + +* [CLI tutorial](tutorial.md) for some concrete examples on how Clef works. +* [Setup docs](docs/setup.md) for infos on how to configure Clef on QubesOS or USB Armory. +* [Data types](datatypes.md) for details on the communication messages between Clef and an external UI. ## Command line flags + Clef accepts the following command line options: + ``` COMMANDS: init Initialize the signer, generate secret storage attest Attest that a js-file is to be used - addpw Store a credential for a keystore file + setpw Store a credential for a keystore file + delpw Remove a credential for a keystore file + gendoc Generate documentation about json-rpc format help Shows a list of commands or help for one command GLOBAL OPTIONS: --loglevel value log level to emit to the screen (default: 4) --keystore value Directory for the keystore (default: "$HOME/.ethereum/keystore") - --configdir value Directory for clef configuration (default: "$HOME/.clef") - --networkid value Network identifier (integer, 1=Frontier, 2=Morden (disused), 3=Ropsten, 4=Rinkeby) (default: 1) + --configdir value Directory for Clef configuration (default: "$HOME/.clef") + --chainid value Chain id to use for signing (1=mainnet, 3=Ropsten, 4=Rinkeby, 5=Goerli) (default: 1) --lightkdf Reduce key-derivation RAM & CPU usage at some expense of KDF strength --nousb Disables monitoring for and managing USB hardware wallets + --pcscdpath value Path to the smartcard daemon (pcscd) socket file (default: "/run/pcscd/pcscd.comm") --rpcaddr value HTTP-RPC server listening interface (default: "localhost") + --rpcvhosts value Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. (default: "localhost") + --ipcdisable Disable the IPC-RPC server + --ipcpath Filename for IPC socket/pipe within the datadir (explicit paths escape it) + --rpc Enable the HTTP-RPC server --rpcport value HTTP-RPC server listening port (default: 8550) - --signersecret value A file containing the password used to encrypt signer credentials, e.g. keystore credentials and ruleset hash - --4bytedb value File containing 4byte-identifiers (default: "./4byte.json") + --signersecret value A file containing the (encrypted) master seed to encrypt Clef data, e.g. keystore credentials and ruleset hash --4bytedb-custom value File used for writing new 4byte-identifiers submitted via API (default: "./4byte-custom.json") --auditlog value File used to emit audit logs. Set to "" to disable (default: "audit.log") - --rules value Enable rule-engine (default: "rules.json") - --stdio-ui Use STDIN/STDOUT as a channel for an external UI. This means that an STDIN/STDOUT is used for RPC-communication with a e.g. a graphical user interface, and can be used when the signer is started by an external process. - --stdio-ui-test Mechanism to test interface between signer and UI. Requires 'stdio-ui'. + --rules value Path to the rule file to auto-authorize requests with + --stdio-ui Use STDIN/STDOUT as a channel for an external UI. This means that an STDIN/STDOUT is used for RPC-communication with a e.g. a graphical user interface, and can be used when Clef is started by an external process. + --stdio-ui-test Mechanism to test interface between Clef and UI. Requires 'stdio-ui'. + --advanced If enabled, issues warnings instead of rejections for suspicious requests. Default off --help, -h show help --version, -v print the version - ``` - Example: + ``` -signer -keystore /my/keystore -chainid 4 +$ clef -keystore /my/keystore -chainid 4 ``` - ## Security model -The security model of the signer is as follows: +The security model of Clef is as follows: -* One critical component (the signer binary / daemon) is responsible for handling cryptographic operations: signing, private keys, encryption/decryption of keystore files. -* The signer binary has a well-defined 'external' API. +* One critical component (the Clef binary / daemon) is responsible for handling cryptographic operations: signing, private keys, encryption/decryption of keystore files. +* Clef has a well-defined 'external' API. * The 'external' API is considered UNTRUSTED. -* The signer binary also communicates with whatever process that invoked the binary, via stdin/stdout. +* Clef also communicates with whatever process that invoked the binary, via stdin/stdout. * This channel is considered 'trusted'. Over this channel, approvals and passwords are communicated. -The general flow for signing a transaction using e.g. geth is as follows: +The general flow for signing a transaction using e.g. Geth is as follows: ![image](sign_flow.png) -In this case, `geth` would be started with `--externalsigner=http://localhost:8550` and would relay requests to `eth.sendTransaction`. +In this case, `geth` would be started with `--signer http://localhost:8550` and would relay requests to `eth.sendTransaction`. ## TODOs Some snags and todos -* [ ] The signer should take a startup param "--no-change", for UIs that do not contain the capability - to perform changes to things, only approve/deny. Such a UI should be able to start the signer in - a more secure mode by telling it that it only wants approve/deny capabilities. - -* [x] It would be nice if the signer could collect new 4byte-id:s/method selectors, and have a -secondary database for those (`4byte_custom.json`). Users could then (optionally) submit their collections for -inclusion upstream. - -* It should be possible to configure the signer to check if an account is indeed known to it, before -passing on to the UI. The reason it currently does not, is that it would make it possible to enumerate -accounts if it immediately returned "unknown account". -* [x] It should be possible to configure the signer to auto-allow listing (certain) accounts, instead of asking every time. -* [x] Done Upon startup, the signer should spit out some info to the caller (particularly important when executed in `stdio-ui`-mode), -invoking methods with the following info: +* [ ] Clef should take a startup param "--no-change", for UIs that do not contain the capability to perform changes to things, only approve/deny. Such a UI should be able to start the signer in a more secure mode by telling it that it only wants approve/deny capabilities. +* [x] It would be nice if Clef could collect new 4byte-id:s/method selectors, and have a secondary database for those (`4byte_custom.json`). Users could then (optionally) submit their collections for inclusion upstream. +* [ ] It should be possible to configure Clef to check if an account is indeed known to it, before passing on to the UI. The reason it currently does not, is that it would make it possible to enumerate accounts if it immediately returned "unknown account" (side channel attack). +* [x] It should be possible to configure Clef to auto-allow listing (certain) accounts, instead of asking every time. +* [x] Done Upon startup, Clef should spit out some info to the caller (particularly important when executed in `stdio-ui`-mode), invoking methods with the following info: * [x] Version info about the signer - * [x] Address of API (http/ipc) + * [x] Address of API (HTTP/IPC) * [ ] List of known accounts -* [ ] Have a default timeout on signing operations, so that if the user has not answered withing e.g. 60 seconds, the request is rejected. +* [ ] Have a default timeout on signing operations, so that if the user has not answered within e.g. 60 seconds, the request is rejected. * [ ] `account_signRawTransaction` * [ ] `account_bulkSignTransactions([] transactions)` should * only exist if enabled via config/flag @@ -102,21 +94,16 @@ invoking methods with the following info: * the number of unique recipients * Geth todos - - The signer should pass the `Origin` header as call-info to the UI. As of right now, the way that info about the request is -put together is a bit of a hack into the http server. This could probably be greatly improved - - Relay: Geth should be started in `geth --external_signer localhost:8550`. - - Currently, the Geth APIs use `common.Address` in the arguments to transaction submission (e.g `to` field). This - type is 20 `bytes`, and is incapable of carrying checksum information. The signer uses `common.MixedcaseAddress`, which - retains the original input. - - The Geth api should switch to use the same type, and relay `to`-account verbatim to the external api. - + - The signer should pass the `Origin` header as call-info to the UI. As of right now, the way that info about the request is put together is a bit of a hack into the HTTP server. This could probably be greatly improved. + - Relay: Geth should be started in `geth --signer localhost:8550`. + - Currently, the Geth APIs use `common.Address` in the arguments to transaction submission (e.g `to` field). This type is 20 `bytes`, and is incapable of carrying checksum information. The signer uses `common.MixedcaseAddress`, which retains the original input. + - The Geth API should switch to use the same type, and relay `to`-account verbatim to the external API. * [x] Storage - * [x] An encrypted key-value storage should be implemented + * [x] An encrypted key-value storage should be implemented. * See [rules.md](rules.md) for more info about this. - * Another potential thing to introduce is pairing. * To prevent spurious requests which users just accept, implement a way to "pair" the caller with the signer (external API). - * Thus geth/mist/cpp would cryptographically handshake and afterwards the caller would be allowed to make signing requests. + * Thus Geth/cpp would cryptographically handshake and afterwards the caller would be allowed to make signing requests. * This feature would make the addition of rules less dangerous. * Wallets / accounts. Add API methods for wallets. @@ -125,37 +112,31 @@ put together is a bit of a hack into the http server. This could probably be gre ### External API -The signer listens to HTTP requests on `rpcaddr`:`rpcport`, with the same JSONRPC standard as Geth. The messages are -expected to be JSON [jsonrpc 2.0 standard](http://www.jsonrpc.org/specification). +Clef listens to HTTP requests on `rpcaddr`:`rpcport` (or to IPC on `ipcpath`), with the same JSON-RPC standard as Geth. The messages are expected to be [JSON-RPC 2.0 standard](https://www.jsonrpc.org/specification). -Some of these call can require user interaction. Clients must be aware that responses -may be delayed significanlty or may never be received if a users decides to ignore the confirmation request. +Some of these call can require user interaction. Clients must be aware that responses may be delayed significantly or may never be received if a users decides to ignore the confirmation request. -The External API is **untrusted** : it does not accept credentials over this api, nor does it expect -that requests have any authority. +The External API is **untrusted**: it does not accept credentials over this API, nor does it expect that requests have any authority. -### UI API +### Internal UI API -The signer has one native console-based UI, for operation without any standalone tools. -However, there is also an API to communicate with an external UI. To enable that UI, -the signer needs to be executed with the `--stdio-ui` option, which allocates the -`stdin`/`stdout` for the UI-api. +Clef has one native console-based UI, for operation without any standalone tools. However, there is also an API to communicate with an external UI. To enable that UI, the signer needs to be executed with the `--stdio-ui` option, which allocates `stdin` / `stdout` for the UI API. An example (insecure) proof-of-concept of has been implemented in `pythonsigner.py`. The model is as follows: * The user starts the UI app (`pythonsigner.py`). -* The UI app starts the `signer` with `--stdio-ui`, and listens to the +* The UI app starts `clef` with `--stdio-ui`, and listens to the process output for confirmation-requests. -* The `signer` opens the external http api. -* When the `signer` receives requests, it sends a `jsonrpc` request via `stdout`. -* The UI app prompts the user accordingly, and responds to the `signer` -* The `signer` signs (or not), and responds to the original request. +* `clef` opens the external HTTP API. +* When the `signer` receives requests, it sends a JSON-RPC request via `stdout`. +* The UI app prompts the user accordingly, and responds to `clef`. +* `clef` signs (or not), and responds to the original request. ## External API -See the [external api changelog](extapi_changelog.md) for information about changes to this API. +See the [external API changelog](extapi_changelog.md) for information about changes to this API. ### Encoding - number: positive integers that are hex encoded @@ -180,7 +161,7 @@ None #### Result - address [string]: account address that is derived from the generated key - url [string]: location of the keyfile - + #### Sample call ```json { @@ -189,7 +170,9 @@ None "method": "account_new", "params": [] } - +``` +Response +``` { "id": 0, "jsonrpc": "2.0", @@ -212,9 +195,9 @@ None #### Result - array with account records: - account.address [string]: account address that is derived from the generated key - - account.type [string]: type of the + - account.type [string]: type of the - account.url [string]: location of the account - + #### Sample call ```json { @@ -222,7 +205,9 @@ None "jsonrpc": "2.0", "method": "account_list" } - +``` +Response +``` { "id": 1, "jsonrpc": "2.0", @@ -261,7 +246,7 @@ None #### Result - signed transaction in RLP encoded form [data] - + #### Sample call ```json { @@ -285,8 +270,8 @@ Response ```json { + "id": 2, "jsonrpc": "2.0", - "id": 67, "error": { "code": -32000, "message": "Request denied" @@ -298,6 +283,7 @@ Response ```json { + "id": 67, "jsonrpc": "2.0", "method": "account_signTransaction", "params": [ @@ -311,8 +297,7 @@ Response "data": "0x4401a6e40000000000000000000000000000000000000000000000000000000000000012" }, "safeSend(address)" - ], - "id": 67 + ] } ``` Response @@ -346,26 +331,30 @@ Bash example: {"jsonrpc":"2.0","id":67,"result":{"raw":"0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663","tx":{"nonce":"0x0","gasPrice":"0x1","gas":"0x333","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0","value":"0x0","input":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012","v":"0x26","r":"0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e","s":"0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663","hash":"0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"}}} ``` - -### account_sign +### account_signData #### Sign data Signs a chunk of data and returns the calculated signature. #### Arguments + - content type [string]: type of signed data + - `text/validator`: hex data with custom validator defined in a contract + - `application/clique`: [clique](https://github.com/ethereum/EIPs/issues/225) headers + - `text/plain`: simple hex data validated by `account_ecRecover` - account [address]: account to sign with - - data [data]: data to sign + - data [object]: data to sign #### Result - calculated signature [data] - + #### Sample call ```json { "id": 3, "jsonrpc": "2.0", - "method": "account_sign", + "method": "account_signData", "params": [ + "data/plain", "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db", "0xaabbccdd" ] @@ -381,18 +370,116 @@ Response } ``` +### account_signTypedData + +#### Sign data + Signs a chunk of structured data conformant to [EIP712]([EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md)) and returns the calculated signature. + +#### Arguments + - account [address]: account to sign with + - data [object]: data to sign + +#### Result + - calculated signature [data] + +#### Sample call +```json +{ + "id": 68, + "jsonrpc": "2.0", + "method": "account_signTypedData", + "params": [ + "0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826", + { + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": 1, + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } + } + ] +} +``` +Response + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0x4355c47d63924e8a72e509b65029052eb6c299d53a04e167c5775fd466751c9d07299936d304c153f6443dfa05f40ff007d72911b6f72307f996231605b915621c" +} +``` + ### account_ecRecover -#### Recover address - Derive the address from the account that was used to sign data from the data and signature. - +#### Sign data + +Derive the address from the account that was used to sign data with content type `text/plain` and the signature. + #### Arguments - data [data]: data that was signed - signature [data]: the signature to verify #### Result - derived account [address] - + #### Sample call ```json { @@ -400,6 +487,7 @@ Response "jsonrpc": "2.0", "method": "account_ecRecover", "params": [ + "data/plain", "0xaabbccdd", "0x5b6693f153b48ec1c706ba4169960386dbaa6903e249cc79a8e6ddc434451d417e1e57327872c7f538beeb323c300afa9999a3d4a5de6caf3be0d5ef832b67ef1c" ] @@ -413,7 +501,6 @@ Response "jsonrpc": "2.0", "result": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db" } - ``` ### account_import @@ -421,16 +508,16 @@ Response #### Import account Import a private key into the keystore. The imported key is expected to be encrypted according to the web3 keystore format. - + #### Arguments - - account [object]: key in [web3 keystore format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) (retrieved with account_export) + - account [object]: key in [web3 keystore format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) (retrieved with account_export) #### Result - imported key [object]: - key.address [address]: address of the imported key - key.type [string]: type of the account - key.url [string]: key URL - + #### Sample call ```json { @@ -458,7 +545,7 @@ Response }, "id": "09bccb61-b8d3-4e93-bf4f-205a8194f0b9", "version": 3 - }, + } ] } ``` @@ -481,14 +568,14 @@ Response #### Export account from keystore Export a private key from the keystore. The exported private key is encrypted with the original passphrase. When the key is imported later this passphrase is required. - + #### Arguments - account [address]: export private key that is associated with this account #### Result - exported key, see [web3 keystore format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) for more information - + #### Sample call ```json { @@ -530,8 +617,6 @@ Response } ``` - - ## UI API These methods needs to be implemented by a UI listener. @@ -542,13 +627,13 @@ See `pythonsigner`, which can be invoked via `python3 pythonsigner.py test` to p All methods in this API uses object-based parameters, so that there can be no mixups of parameters: each piece of data is accessed by key. -See the [ui api changelog](intapi_changelog.md) for information about changes to this API. +See the [ui API changelog](intapi_changelog.md) for information about changes to this API. OBS! A slight deviation from `json` standard is in place: every request and response should be confined to a single line. Whereas the `json` specification allows for linebreaks, linebreaks __should not__ be used in this communication channel, to make things simpler for both parties. -### ApproveTx +### ApproveTx / `ui_approveTx` Invoked when there's a transaction for approval. @@ -560,13 +645,13 @@ Here's a method invocation: curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":[{"from":"0x694267f14675d7e1b9494fd8d72fefe1755710fa","gas":"0x333","gasPrice":"0x1","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x0", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"},"safeSend(address)"],"id":67}' http://localhost:8550/ ``` - +Results in the following invocation on the UI: ```json { "jsonrpc": "2.0", "id": 1, - "method": "ApproveTx", + "method": "ui_approveTx", "params": [ { "transaction": { @@ -611,7 +696,7 @@ curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","me { "jsonrpc": "2.0", "id": 1, - "method": "ApproveTx", + "method": "ui_approveTx", "params": [ { "transaction": { @@ -654,7 +739,7 @@ One which has missing `to`, but with no `data`: { "jsonrpc": "2.0", "id": 3, - "method": "ApproveTx", + "method": "ui_approveTx", "params": [ { "transaction": { @@ -683,33 +768,7 @@ One which has missing `to`, but with no `data`: } ``` -### ApproveExport - -Invoked when a request to export an account has been made. - -#### Sample call - -```json - -{ - "jsonrpc": "2.0", - "id": 7, - "method": "ApproveExport", - "params": [ - { - "address": "0x0000000000000000000000000000000000000000", - "meta": { - "remote": "signer binary", - "local": "main", - "scheme": "in-proc" - } - } - ] -} - -``` - -### ApproveListing +### ApproveListing / `ui_approveListing` Invoked when a request for account listing has been made. @@ -720,7 +779,7 @@ Invoked when a request for account listing has been made. { "jsonrpc": "2.0", "id": 5, - "method": "ApproveListing", + "method": "ui_approveListing", "params": [ { "accounts": [ @@ -747,7 +806,7 @@ Invoked when a request for account listing has been made. ``` -### ApproveSignData +### ApproveSignData / `ui_approveSignData` #### Sample call @@ -755,7 +814,7 @@ Invoked when a request for account listing has been made. { "jsonrpc": "2.0", "id": 4, - "method": "ApproveSignData", + "method": "ui_approveSignData", "params": [ { "address": "0x123409812340981234098123409812deadbeef42", @@ -773,7 +832,7 @@ Invoked when a request for account listing has been made. ``` -### ShowInfo +### ShowInfo / `ui_showInfo` The UI should show the info to the user. Does not expect response. @@ -783,7 +842,7 @@ The UI should show the info to the user. Does not expect response. { "jsonrpc": "2.0", "id": 9, - "method": "ShowInfo", + "method": "ui_showInfo", "params": [ { "text": "Tests completed" @@ -793,7 +852,7 @@ The UI should show the info to the user. Does not expect response. ``` -### ShowError +### ShowError / `ui_showError` The UI should show the info to the user. Does not expect response. @@ -812,7 +871,7 @@ The UI should show the info to the user. Does not expect response. ``` -### OnApproved +### OnApprovedTx / `ui_onApprovedTx` `OnApprovedTx` is called when a transaction has been approved and signed. The call contains the return value that will be sent to the external caller. The return value from this method is ignored - the reason for having this callback is to allow the ruleset to keep track of approved transactions. @@ -820,9 +879,9 @@ When implementing rate-limited rules, this callback should be used. TLDR; Use this method to keep track of signed transactions, instead of using the data in `ApproveTx`. -### OnSignerStartup +### OnSignerStartup / `ui_onSignerStartup` -This method provide the UI with information about what API version the signer uses (both internal and external) aswell as build-info and external api, +This method provide the UI with information about what API version the signer uses (both internal and external) aswell as build-info and external API, in k/v-form. Example call: @@ -831,7 +890,7 @@ Example call: { "jsonrpc": "2.0", "id": 1, - "method": "OnSignerStartup", + "method": "ui_onSignerStartup", "params": [ { "info": { @@ -862,13 +921,13 @@ A UI should conform to the following rules. * A UI SHOULD inform the user about the `SHA256` or `MD5` hash of the binary being executed * A UI SHOULD NOT maintain a secondary storage of data, e.g. list of accounts * The signer provides accounts -* A UI SHOULD, to the best extent possible, use static linking / bundling, so that requried libraries are bundled +* A UI SHOULD, to the best extent possible, use static linking / bundling, so that required libraries are bundled along with the UI. -### UI Implementations +### UI Implementations -There are a couple of implementation for a UI. We'll try to keep this list up to date. +There are a couple of implementation for a UI. We'll try to keep this list up to date. | Name | Repo | UI type| No external resources| Blocky support| Verifies permissions | Hash information | No secondary storage | Statically linked| Can modify parameters| | ---- | ---- | -------| ---- | ---- | ---- |---- | ---- | ---- | ---- | diff --git a/cmd/clef/datatypes.md b/cmd/clef/datatypes.md new file mode 100644 index 000000000000..5ebf9adc9712 --- /dev/null +++ b/cmd/clef/datatypes.md @@ -0,0 +1,224 @@ +## UI Client interface + +These data types are defined in the channel between clef and the UI +### SignDataRequest + +SignDataRequest contains information about a pending request to sign some data. The data to be signed can be of various types, defined by content-type. Clef has done most of the work in canonicalizing and making sense of the data, and it's up to the UI to presentthe user with the contents of the `message` + +Example: +```json +{ + "content_type": "text/plain", + "address": "0xDEADbEeF000000000000000000000000DeaDbeEf", + "raw_data": "GUV0aGVyZXVtIFNpZ25lZCBNZXNzYWdlOgoxMWhlbGxvIHdvcmxk", + "messages": [ + { + "name": "message", + "value": "\u0019Ethereum Signed Message:\n11hello world", + "type": "text/plain" + } + ], + "hash": "0xd9eba16ed0ecae432b71fe008c98cc872bb4cc214d3220a36f365326cf807d68", + "meta": { + "remote": "localhost:9999", + "local": "localhost:8545", + "scheme": "http", + "User-Agent": "Firefox 3.2", + "Origin": "www.malicious.ru" + } +} +``` +### SignDataResponse - approve + +Response to SignDataRequest + +Example: +```json +{ + "approved": true +} +``` +### SignDataResponse - deny + +Response to SignDataRequest + +Example: +```json +{ + "approved": false +} +``` +### SignTxRequest + +SignTxRequest contains information about a pending request to sign a transaction. Aside from the transaction itself, there is also a `call_info`-struct. That struct contains messages of various types, that the user should be informed of. + +As in any request, it's important to consider that the `meta` info also contains untrusted data. + +The `transaction` (on input into clef) can have either `data` or `input` -- if both are set, they must be identical, otherwise an error is generated. However, Clef will always use `data` when passing this struct on (if Clef does otherwise, please file a ticket) + +Example: +```json +{ + "transaction": { + "from": "0xDEADbEeF000000000000000000000000DeaDbeEf", + "to": null, + "gas": "0x3e8", + "gasPrice": "0x5", + "value": "0x6", + "nonce": "0x1", + "data": "0x01020304" + }, + "call_info": [ + { + "type": "Warning", + "message": "Something looks odd, show this message as a warning" + }, + { + "type": "Info", + "message": "User should see this aswell" + } + ], + "meta": { + "remote": "localhost:9999", + "local": "localhost:8545", + "scheme": "http", + "User-Agent": "Firefox 3.2", + "Origin": "www.malicious.ru" + } +} +``` +### SignTxResponse - approve + +Response to request to sign a transaction. This response needs to contain the `transaction`, because the UI is free to make modifications to the transaction. + +Example: +```json +{ + "transaction": { + "from": "0xDEADbEeF000000000000000000000000DeaDbeEf", + "to": null, + "gas": "0x3e8", + "gasPrice": "0x5", + "value": "0x6", + "nonce": "0x4", + "data": "0x04030201" + }, + "approved": true +} +``` +### SignTxResponse - deny + +Response to SignTxRequest. When denying a request, there's no need to provide the transaction in return + +Example: +```json +{ + "transaction": { + "from": "0x", + "to": null, + "gas": "0x0", + "gasPrice": "0x0", + "value": "0x0", + "nonce": "0x0", + "data": null + }, + "approved": false +} +``` +### OnApproved - SignTransactionResult + +SignTransactionResult is used in the call `clef` -> `OnApprovedTx(result)` + +This occurs _after_ successful completion of the entire signing procedure, but right before the signed transaction is passed to the external caller. This method (and data) can be used by the UI to signal to the user that the transaction was signed, but it is primarily useful for ruleset implementations. + +A ruleset that implements a rate limitation needs to know what transactions are sent out to the external interface. By hooking into this methods, the ruleset can maintain track of that count. + +**OBS:** Note that if an attacker can restore your `clef` data to a previous point in time (e.g through a backup), the attacker can reset such windows, even if he/she is unable to decrypt the content. + +The `OnApproved` method cannot be responded to, it's purely informative + +Example: +```json +{ + "raw": "0xf85d640101948a8eafb1cf62bfbeb1741769dae1a9dd47996192018026a0716bd90515acb1e68e5ac5867aa11a1e65399c3349d479f5fb698554ebc6f293a04e8a4ebfff434e971e0ef12c5bf3a881b06fd04fc3f8b8a7291fb67a26a1d4ed", + "tx": { + "nonce": "0x64", + "gasPrice": "0x1", + "gas": "0x1", + "to": "0x8a8eafb1cf62bfbeb1741769dae1a9dd47996192", + "value": "0x1", + "input": "0x", + "v": "0x26", + "r": "0x716bd90515acb1e68e5ac5867aa11a1e65399c3349d479f5fb698554ebc6f293", + "s": "0x4e8a4ebfff434e971e0ef12c5bf3a881b06fd04fc3f8b8a7291fb67a26a1d4ed", + "hash": "0x662f6d772692dd692f1b5e8baa77a9ff95bbd909362df3fc3d301aafebde5441" + } +} +``` +### UserInputRequest + +Sent when clef needs the user to provide data. If 'password' is true, the input field should be treated accordingly (echo-free) + +Example: +```json +{ + "prompt": "The question to ask the user", + "title": "The title here", + "isPassword": true +} +``` +### UserInputResponse + +Response to UserInputRequest + +Example: +```json +{ + "text": "The textual response from user" +} +``` +### ListRequest + +Sent when a request has been made to list addresses. The UI is provided with the full `account`s, including local directory names. Note: this information is not passed back to the external caller, who only sees the `address`es. + +Example: +```json +{ + "accounts": [ + { + "address": "0xdeadbeef000000000000000000000000deadbeef", + "url": "keystore:///path/to/keyfile/a" + }, + { + "address": "0x1111111122222222222233333333334444444444", + "url": "keystore:///path/to/keyfile/b" + } + ], + "meta": { + "remote": "localhost:9999", + "local": "localhost:8545", + "scheme": "http", + "User-Agent": "Firefox 3.2", + "Origin": "www.malicious.ru" + } +} +``` +### ListResponse + +Response to list request. The response contains a list of all addresses to show to the caller. Note: the UI is free to respond with any address the caller, regardless of whether it exists or not + +Example: +```json +{ + "accounts": [ + { + "address": "0x0000000000000000000000000000000000000000", + "url": ".. ignored .." + }, + { + "address": "0xffffffffffffffffffffffffffffffffffffffff", + "url": "" + } + ] +} +``` diff --git a/cmd/clef/docs/clef_architecture_pt1.png b/cmd/clef/docs/clef_architecture_pt1.png new file mode 100644 index 000000000000..e40e532f3051 Binary files /dev/null and b/cmd/clef/docs/clef_architecture_pt1.png differ diff --git a/cmd/clef/docs/clef_architecture_pt2.png b/cmd/clef/docs/clef_architecture_pt2.png new file mode 100644 index 000000000000..f617d755e2e7 Binary files /dev/null and b/cmd/clef/docs/clef_architecture_pt2.png differ diff --git a/cmd/clef/docs/clef_architecture_pt3.png b/cmd/clef/docs/clef_architecture_pt3.png new file mode 100644 index 000000000000..b9d695447308 Binary files /dev/null and b/cmd/clef/docs/clef_architecture_pt3.png differ diff --git a/cmd/clef/docs/clef_architecture_pt4.png b/cmd/clef/docs/clef_architecture_pt4.png new file mode 100644 index 000000000000..a6cb3b4df24d Binary files /dev/null and b/cmd/clef/docs/clef_architecture_pt4.png differ diff --git a/cmd/clef/extapi_changelog.md b/cmd/clef/extapi_changelog.md index 6c2c3e819430..dbc302631bc1 100644 --- a/cmd/clef/extapi_changelog.md +++ b/cmd/clef/extapi_changelog.md @@ -1,13 +1,39 @@ -### Changelog for external API +## Changelog for external API + +The API uses [semantic versioning](https://semver.org/). + +TL;DR: Given a version number MAJOR.MINOR.PATCH, increment the: + +* MAJOR version when you make incompatible API changes, +* MINOR version when you add functionality in a backwards-compatible manner, and +* PATCH version when you make backwards-compatible bug fixes. + +Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. + + +### 6.0.0 + +* `New` was changed to deliver only an address, not the full `Account` data +* `Export` was moved from External API to the UI Server API + +#### 5.0.0 + +* The external `account_EcRecover`-method was reimplemented. +* The external method `account_sign(address, data)` was replaced with `account_signData(contentType, address, data)`. +The addition of `contentType` makes it possible to use the method for different types of objects, such as: + * signing data with an intended validator (not yet implemented) + * signing clique headers, + * signing plain personal messages, +* The external method `account_signTypedData` implements [EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md) and makes it possible to sign typed data. #### 4.0.0 -* The external `account_Ecrecover`-method was removed. +* The external `account_Ecrecover`-method was removed. * The external `account_Import`-method was removed. #### 3.0.0 -* The external `account_List`-method was changed to not expose `url`, which contained info about the local filesystem. It now returns only a list of addresses. +* The external `account_List`-method was changed to not expose `url`, which contained info about the local filesystem. It now returns only a list of addresses. #### 2.0.0 @@ -18,15 +44,3 @@ makes the `accounts_signTransaction` identical to the old `eth_signTransaction`. #### 1.0.0 Initial release. - -### Versioning - -The API uses [semantic versioning](https://semver.org/). - -TLDR; Given a version number MAJOR.MINOR.PATCH, increment the: - -* MAJOR version when you make incompatible API changes, -* MINOR version when you add functionality in a backwards-compatible manner, and -* PATCH version when you make backwards-compatible bug fixes. - -Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. diff --git a/cmd/clef/intapi_changelog.md b/cmd/clef/intapi_changelog.md index 9e13f67d0338..38424f06b9fd 100644 --- a/cmd/clef/intapi_changelog.md +++ b/cmd/clef/intapi_changelog.md @@ -1,19 +1,109 @@ -### Changelog for internal API (ui-api) +## Changelog for internal API (ui-api) + +The API uses [semantic versioning](https://semver.org/). + +TL;DR: Given a version number MAJOR.MINOR.PATCH, increment the: + +* MAJOR version when you make incompatible API changes, +* MINOR version when you add functionality in a backwards-compatible manner, and +* PATCH version when you make backwards-compatible bug fixes. + +Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. + +### 7.0.0 + +- The `message` field was renamed to `messages` in all data signing request methods to better reflect that it's a list, not a value. +- The `storage.Put` and `storage.Get` methods in the rule execution engine were lower-cased to `storage.put` and `storage.get` to be consistent with JavaScript call conventions. + +### 6.0.0 + +Removed `password` from responses to operations which require them. This is for two reasons, + +- Consistency between how rulesets operate and how manual processing works. A rule can `Approve` but require the actual password to be stored in the clef storage. +With this change, the same stored password can be used even if rulesets are not enabled, but storage is. +- It also removes the usability-shortcut that a UI might otherwise want to implement; remembering passwords. Since we now will not require the +password on every `Approve`, there's no need for the UI to cache it locally. + - In a future update, we'll likely add `clef_storePassword` to the internal API, so the user can store it via his UI (currently only CLI works). + +Affected datatypes: +- `SignTxResponse` +- `SignDataResponse` +- `NewAccountResponse` + +If `clef` requires a password, the `OnInputRequired` will be used to collect it. + + +### 5.0.0 + +Changed the namespace format to adhere to the legacy ethereum format: `name_methodName`. Changes: + +* `ApproveTx` -> `ui_approveTx` +* `ApproveSignData` -> `ui_approveSignData` +* `ApproveExport` -> `removed` +* `ApproveImport` -> `removed` +* `ApproveListing` -> `ui_approveListing` +* `ApproveNewAccount` -> `ui_approveNewAccount` +* `ShowError` -> `ui_showError` +* `ShowInfo` -> `ui_showInfo` +* `OnApprovedTx` -> `ui_onApprovedTx` +* `OnSignerStartup` -> `ui_onSignerStartup` +* `OnInputRequired` -> `ui_onInputRequired` + + +### 4.0.0 + +* Bidirectional communication implemented, so the UI can query `clef` via the stdin/stdout RPC channel. Methods implemented are: + - `clef_listWallets` + - `clef_listAccounts` + - `clef_listWallets` + - `clef_deriveAccount` + - `clef_importRawKey` + - `clef_openWallet` + - `clef_chainId` + - `clef_setChainId` + - `clef_export` + - `clef_import` + +* The type `Account` was modified (the json-field `type` was removed), to consist of + +```go +type Account struct { + Address common.Address `json:"address"` // Ethereum account address derived from the key + URL URL `json:"url"` // Optional resource locator within a backend +} +``` + + +### 3.2.0 + +* Make `ShowError`, `OnApprovedTx`, `OnSignerStartup` be json-rpc [notifications](https://www.jsonrpc.org/specification#notification): + +> A Notification is a Request object without an "id" member. A Request object that is a Notification signifies the Client's lack of interest in the corresponding Response object, and as such no Response object needs to be returned to the client. The Server MUST NOT reply to a Notification, including those that are within a batch request. +> +> Notifications are not confirmable by definition, since they do not have a Response object to be returned. As such, the Client would not be aware of any errors (like e.g. "Invalid params","Internal error" +### 3.1.0 + +* Add `ContentType` `string` to `SignDataRequest` to accommodate the latest EIP-191 and EIP-712 implementations. + +### 3.0.0 + +* Make use of `OnInputRequired(info UserInputRequest)` for obtaining master password during startup ### 2.1.0 * Add `OnInputRequired(info UserInputRequest)` to internal API. This method is used when Clef needs user input, e.g. passwords. The following structures are used: -```golang - UserInputRequest struct { - Prompt string `json:"prompt"` - Title string `json:"title"` - IsPassword bool `json:"isPassword"` - } - UserInputResponse struct { - Text string `json:"text"` - } + +```go +UserInputRequest struct { + Prompt string `json:"prompt"` + Title string `json:"title"` + IsPassword bool `json:"isPassword"` +} +UserInputResponse struct { + Text string `json:"text"` +} ``` ### 2.0.0 @@ -88,15 +178,3 @@ Example call: #### 1.0.0 Initial release. - -### Versioning - -The API uses [semantic versioning](https://semver.org/). - -TLDR; Given a version number MAJOR.MINOR.PATCH, increment the: - -* MAJOR version when you make incompatible API changes, -* MINOR version when you add functionality in a backwards-compatible manner, and -* PATCH version when you make backwards-compatible bug fixes. - -Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. diff --git a/cmd/clef/main.go b/cmd/clef/main.go index c060285be604..85ec5647cdb6 100644 --- a/cmd/clef/main.go +++ b/cmd/clef/main.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . -// signer is a utility that can be used so sign transactions and -// arbitrary data. package main import ( @@ -28,40 +26,48 @@ import ( "fmt" "io" "io/ioutil" + "math/big" "os" "os/signal" "os/user" "path/filepath" "runtime" "strings" + "time" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/signer/core" + "github.com/ethereum/go-ethereum/signer/fourbyte" "github.com/ethereum/go-ethereum/signer/rules" "github.com/ethereum/go-ethereum/signer/storage" "gopkg.in/urfave/cli.v1" ) -// ExternalAPIVersion -- see extapi_changelog.md -const ExternalAPIVersion = "3.0.0" - -// InternalAPIVersion -- see intapi_changelog.md -const InternalAPIVersion = "2.0.0" - const legalWarning = ` -WARNING! +WARNING! -Clef is alpha software, and not yet publically released. This software has _not_ been audited, and there -are no guarantees about the workings of this software. It may contain severe flaws. You should not use this software -unless you agree to take full responsibility for doing so, and know what you are doing. +Clef is an account management tool. It may, like any software, contain bugs. -TLDR; THIS IS NOT PRODUCTION-READY SOFTWARE! +Please take care to +- backup your keystore files, +- verify that the keystore(s) can be opened with your password. +Clef is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. ` var ( @@ -84,6 +90,11 @@ var ( Value: DefaultConfigDir(), Usage: "Directory for Clef configuration", } + chainIdFlag = cli.Int64Flag{ + Name: "chainid", + Value: params.MainnetChainConfig.ChainID.Int64(), + Usage: "Chain id to use for signing (1=mainnet, 3=Ropsten, 4=Rinkeby, 5=Goerli)", + } rpcPortFlag = cli.IntFlag{ Name: "rpcport", Usage: "HTTP-RPC server listening port", @@ -91,12 +102,7 @@ var ( } signerSecretFlag = cli.StringFlag{ Name: "signersecret", - Usage: "A file containing the password used to encrypt Clef credentials, e.g. keystore credentials and ruleset hash", - } - dBFlag = cli.StringFlag{ - Name: "4bytedb", - Usage: "File containing 4byte-identifiers", - Value: "./4byte.json", + Usage: "A file containing the (encrypted) master seed to encrypt Clef data, e.g. keystore credentials and ruleset hash", } customDBFlag = cli.StringFlag{ Name: "4bytedb-custom", @@ -110,8 +116,7 @@ var ( } ruleFlag = cli.StringFlag{ Name: "rules", - Usage: "Enable rule-engine", - Value: "rules.json", + Usage: "Path to the rule file to auto-authorize requests with", } stdiouiFlag = cli.BoolFlag{ Name: "stdio-ui", @@ -134,7 +139,7 @@ var ( configdirFlag, }, Description: ` -The init command generates a master seed which Clef can use to store credentials and data needed for +The init command generates a master seed which Clef can use to store credentials and data needed for the rule-engine to work.`, } attestCommand = cli.Command{ @@ -148,28 +153,45 @@ the rule-engine to work.`, signerSecretFlag, }, Description: ` -The attest command stores the sha256 of the rule.js-file that you want to use for automatic processing of -incoming requests. +The attest command stores the sha256 of the rule.js-file that you want to use for automatic processing of +incoming requests. -Whenever you make an edit to the rule file, you need to use attestation to tell +Whenever you make an edit to the rule file, you need to use attestation to tell Clef that the file is 'safe' to execute.`, } - - addCredentialCommand = cli.Command{ - Action: utils.MigrateFlags(addCredential), - Name: "addpw", + setCredentialCommand = cli.Command{ + Action: utils.MigrateFlags(setCredential), + Name: "setpw", Usage: "Store a credential for a keystore file", - ArgsUsage: "
", + ArgsUsage: "
", Flags: []cli.Flag{ logLevelFlag, configdirFlag, signerSecretFlag, }, Description: ` -The addpw command stores a password for a given address (keyfile). If you invoke it with only one parameter, it will -remove any stored credential for that address (keyfile) -`, - } +The setpw command stores a password for a given address (keyfile). +`} + delCredentialCommand = cli.Command{ + Action: utils.MigrateFlags(removeCredential), + Name: "delpw", + Usage: "Remove a credential for a keystore file", + ArgsUsage: "
", + Flags: []cli.Flag{ + logLevelFlag, + configdirFlag, + signerSecretFlag, + }, + Description: ` +The delpw command removes a password for a given address (keyfile). +`} + gendocCommand = cli.Command{ + Action: GenDoc, + Name: "gendoc", + Usage: "Generate documentation about json-rpc format", + Description: ` +The gendoc generates example structures of the json-rpc communication types. +`} ) func init() { @@ -179,9 +201,10 @@ func init() { logLevelFlag, keystoreFlag, configdirFlag, - utils.NetworkIdFlag, + chainIdFlag, utils.LightKDFFlag, utils.NoUSBFlag, + utils.SmartCardDaemonPathFlag, utils.RPCListenAddrFlag, utils.RPCVirtualHostsFlag, utils.IPCDisabledFlag, @@ -189,7 +212,6 @@ func init() { utils.RPCEnabledFlag, rpcPortFlag, signerSecretFlag, - dBFlag, customDBFlag, auditLogFlag, ruleFlag, @@ -198,9 +220,9 @@ func init() { advancedMode, } app.Action = signer - app.Commands = []cli.Command{initCommand, attestCommand, addCredentialCommand} - + app.Commands = []cli.Command{initCommand, attestCommand, setCredentialCommand, delCredentialCommand, gendocCommand} } + func main() { if err := app.Run(os.Args); err != nil { fmt.Fprintln(os.Stderr, err) @@ -209,40 +231,68 @@ func main() { } func initializeSecrets(c *cli.Context) error { + // Get past the legal message if err := initialize(c); err != nil { return err } - configDir := c.String(configdirFlag.Name) - + // Ensure the master key does not yet exist, we're not willing to overwrite + configDir := c.GlobalString(configdirFlag.Name) + if err := os.Mkdir(configDir, 0700); err != nil && !os.IsExist(err) { + return err + } + location := filepath.Join(configDir, "masterseed.json") + if _, err := os.Stat(location); err == nil { + return fmt.Errorf("master key %v already exists, will not overwrite", location) + } + // Key file does not exist yet, generate a new one and encrypt it masterSeed := make([]byte, 256) - n, err := io.ReadFull(rand.Reader, masterSeed) + num, err := io.ReadFull(rand.Reader, masterSeed) if err != nil { return err } - if n != len(masterSeed) { + if num != len(masterSeed) { return fmt.Errorf("failed to read enough random") } - err = os.Mkdir(configDir, 0700) - if err != nil && !os.IsExist(err) { + n, p := keystore.StandardScryptN, keystore.StandardScryptP + if c.GlobalBool(utils.LightKDFFlag.Name) { + n, p = keystore.LightScryptN, keystore.LightScryptP + } + text := "The master seed of clef will be locked with a password.\nPlease specify a password. Do not forget this password!" + var password string + for { + password = getPassPhrase(text, true) + if err := core.ValidatePasswordFormat(password); err != nil { + fmt.Printf("invalid password: %v\n", err) + } else { + fmt.Println() + break + } + } + cipherSeed, err := encryptSeed(masterSeed, []byte(password), n, p) + if err != nil { + return fmt.Errorf("failed to encrypt master seed: %v", err) + } + // Double check the master key path to ensure nothing wrote there in between + if err = os.Mkdir(configDir, 0700); err != nil && !os.IsExist(err) { return err } - location := filepath.Join(configDir, "secrets.dat") if _, err := os.Stat(location); err == nil { - return fmt.Errorf("file %v already exists, will not overwrite", location) + return fmt.Errorf("master key %v already exists, will not overwrite", location) } - err = ioutil.WriteFile(location, masterSeed, 0400) - if err != nil { + // Write the file and print the usual warning message + if err = ioutil.WriteFile(location, cipherSeed, 0400); err != nil { return err } fmt.Printf("A master seed has been generated into %s\n", location) fmt.Printf(` -This is required to be able to store credentials, such as : +This is required to be able to store credentials, such as: * Passwords for keystores (used by rule engine) -* Storage for javascript rules -* Hash of rule-file +* Storage for JavaScript auto-signing rules +* Hash of JavaScript rule-file -You should treat that file with utmost secrecy, and make a backup of it. -NOTE: This file does not contain your accounts. Those need to be backed up separately! +You should treat 'masterseed.json' with utmost secrecy and make a backup of it! +* The password is necessary but not enough, you need to back up the master seed too! +* The master seed does not contain your accounts, those need to be backed up separately! `) return nil @@ -255,11 +305,11 @@ func attestFile(ctx *cli.Context) error { return err } - stretchedKey, err := readMasterKey(ctx) + stretchedKey, err := readMasterKey(ctx, nil) if err != nil { utils.Fatalf(err.Error()) } - configDir := ctx.String(configdirFlag.Name) + configDir := ctx.GlobalString(configdirFlag.Name) vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), stretchedKey)[:10])) confKey := crypto.Keccak256([]byte("config"), stretchedKey) @@ -271,38 +321,68 @@ func attestFile(ctx *cli.Context) error { return nil } -func addCredential(ctx *cli.Context) error { +func setCredential(ctx *cli.Context) error { if len(ctx.Args()) < 1 { - utils.Fatalf("This command requires at leaste one argument.") + utils.Fatalf("This command requires an address to be passed as an argument") } if err := initialize(ctx); err != nil { return err } + addr := ctx.Args().First() + if !common.IsHexAddress(addr) { + utils.Fatalf("Invalid address specified: %s", addr) + } + address := common.HexToAddress(addr) + password := getPassPhrase("Please enter a passphrase to store for this address:", true) + fmt.Println() - stretchedKey, err := readMasterKey(ctx) + stretchedKey, err := readMasterKey(ctx, nil) if err != nil { utils.Fatalf(err.Error()) } - configDir := ctx.String(configdirFlag.Name) + configDir := ctx.GlobalString(configdirFlag.Name) vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), stretchedKey)[:10])) pwkey := crypto.Keccak256([]byte("credentials"), stretchedKey) - // Initialize the encrypted storages pwStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "credentials.json"), pwkey) - key := ctx.Args().First() - value := "" - if len(ctx.Args()) > 1 { - value = ctx.Args().Get(1) + pwStorage.Put(address.Hex(), password) + + log.Info("Credential store updated", "set", address) + return nil +} + +func removeCredential(ctx *cli.Context) error { + if len(ctx.Args()) < 1 { + utils.Fatalf("This command requires an address to be passed as an argument") + } + if err := initialize(ctx); err != nil { + return err } - pwStorage.Put(key, value) - log.Info("Credential store updated", "key", key) + addr := ctx.Args().First() + if !common.IsHexAddress(addr) { + utils.Fatalf("Invalid address specified: %s", addr) + } + address := common.HexToAddress(addr) + + stretchedKey, err := readMasterKey(ctx, nil) + if err != nil { + utils.Fatalf(err.Error()) + } + configDir := ctx.GlobalString(configdirFlag.Name) + vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), stretchedKey)[:10])) + pwkey := crypto.Keccak256([]byte("credentials"), stretchedKey) + + pwStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "credentials.json"), pwkey) + pwStorage.Del(address.Hex()) + + log.Info("Credential store updated", "unset", address) return nil } func initialize(c *cli.Context) error { // Set up the logger to print everything logOutput := os.Stdout - if c.Bool(stdiouiFlag.Name) { + if c.GlobalBool(stdiouiFlag.Name) { logOutput = os.Stderr // If using the stdioui, we can't do the 'confirm'-flow fmt.Fprintf(logOutput, legalWarning) @@ -310,44 +390,48 @@ func initialize(c *cli.Context) error { if !confirm(legalWarning) { return fmt.Errorf("aborted by user") } + fmt.Println() } - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(c.Int(logLevelFlag.Name)), log.StreamHandler(logOutput, log.TerminalFormat(true)))) return nil } func signer(c *cli.Context) error { + // If we have some unrecognized command, bail out + if args := c.Args(); len(args) > 0 { + return fmt.Errorf("invalid command: %q", args[0]) + } if err := initialize(c); err != nil { return err } var ( - ui core.SignerUI + ui core.UIClientAPI ) - if c.Bool(stdiouiFlag.Name) { + if c.GlobalBool(stdiouiFlag.Name) { log.Info("Using stdin/stdout as UI-channel") ui = core.NewStdIOUI() } else { log.Info("Using CLI as UI-channel") ui = core.NewCommandlineUI() } - db, err := core.NewAbiDBFromFiles(c.String(dBFlag.Name), c.String(customDBFlag.Name)) + // 4bytedb data + fourByteLocal := c.GlobalString(customDBFlag.Name) + db, err := fourbyte.NewWithFile(fourByteLocal) if err != nil { utils.Fatalf(err.Error()) } - log.Info("Loaded 4byte db", "signatures", db.Size(), "file", c.String("4bytedb")) + embeds, locals := db.Size() + log.Info("Loaded 4byte database", "embeds", embeds, "locals", locals, "local", fourByteLocal) var ( - api core.ExternalAPI + api core.ExternalAPI + pwStorage storage.Storage = &storage.NoStorage{} ) - configDir := c.String(configdirFlag.Name) - if stretchedKey, err := readMasterKey(c); err != nil { - log.Info("No master seed provided, rules disabled") + configDir := c.GlobalString(configdirFlag.Name) + if stretchedKey, err := readMasterKey(c, ui); err != nil { + log.Warn("Failed to open master, rules disabled", "err", err) } else { - - if err != nil { - utils.Fatalf(err.Error()) - } vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), stretchedKey)[:10])) // Generate domain specific keys @@ -356,46 +440,53 @@ func signer(c *cli.Context) error { confkey := crypto.Keccak256([]byte("config"), stretchedKey) // Initialize the encrypted storages - pwStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "credentials.json"), pwkey) + pwStorage = storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "credentials.json"), pwkey) jsStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "jsstorage.json"), jskey) configStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "config.json"), confkey) - //Do we have a rule-file? - ruleJS, err := ioutil.ReadFile(c.String(ruleFlag.Name)) - if err != nil { - log.Info("Could not load rulefile, rules not enabled", "file", "rulefile") - } else { - hasher := sha256.New() - hasher.Write(ruleJS) - shasum := hasher.Sum(nil) - storedShasum := configStorage.Get("ruleset_sha256") - if storedShasum != hex.EncodeToString(shasum) { - log.Info("Could not validate ruleset hash, rules not enabled", "got", hex.EncodeToString(shasum), "expected", storedShasum) + // Do we have a rule-file? + if ruleFile := c.GlobalString(ruleFlag.Name); ruleFile != "" { + ruleJS, err := ioutil.ReadFile(ruleFile) + if err != nil { + log.Warn("Could not load rules, disabling", "file", ruleFile, "err", err) } else { - // Initialize rules - ruleEngine, err := rules.NewRuleEvaluator(ui, jsStorage, pwStorage) - if err != nil { - utils.Fatalf(err.Error()) + shasum := sha256.Sum256(ruleJS) + foundShaSum := hex.EncodeToString(shasum[:]) + storedShasum, _ := configStorage.Get("ruleset_sha256") + if storedShasum != foundShaSum { + log.Warn("Rule hash not attested, disabling", "hash", foundShaSum, "attested", storedShasum) + } else { + // Initialize rules + ruleEngine, err := rules.NewRuleEvaluator(ui, jsStorage) + if err != nil { + utils.Fatalf(err.Error()) + } + ruleEngine.Init(string(ruleJS)) + ui = ruleEngine + log.Info("Rule engine configured", "file", c.String(ruleFlag.Name)) } - ruleEngine.Init(string(ruleJS)) - ui = ruleEngine - log.Info("Rule engine configured", "file", c.String(ruleFlag.Name)) } } } - - apiImpl := core.NewSignerAPI( - c.Int64(utils.NetworkIdFlag.Name), - c.String(keystoreFlag.Name), - c.Bool(utils.NoUSBFlag.Name), - ui, db, - c.Bool(utils.LightKDFFlag.Name), - c.Bool(advancedMode.Name)) - + var ( + chainId = c.GlobalInt64(chainIdFlag.Name) + ksLoc = c.GlobalString(keystoreFlag.Name) + lightKdf = c.GlobalBool(utils.LightKDFFlag.Name) + advanced = c.GlobalBool(advancedMode.Name) + nousb = c.GlobalBool(utils.NoUSBFlag.Name) + scpath = c.GlobalString(utils.SmartCardDaemonPathFlag.Name) + ) + log.Info("Starting signer", "chainid", chainId, "keystore", ksLoc, + "light-kdf", lightKdf, "advanced", advanced) + am := core.StartClefAccountManager(ksLoc, nousb, lightKdf, scpath) + apiImpl := core.NewSignerAPI(am, chainId, nousb, ui, db, advanced, pwStorage) + + // Establish the bidirectional communication, by creating a new UI backend and registering + // it with the UI. + ui.RegisterUIServer(core.NewUIServerAPI(apiImpl)) api = apiImpl - // Audit logging - if logfile := c.String(auditLogFlag.Name); logfile != "" { + if logfile := c.GlobalString(auditLogFlag.Name); logfile != "" { api, err = core.NewAuditLogger(logfile, api) if err != nil { utils.Fatalf(err.Error()) @@ -414,13 +505,12 @@ func signer(c *cli.Context) error { Service: api, Version: "1.0"}, } - if c.Bool(utils.RPCEnabledFlag.Name) { - + if c.GlobalBool(utils.RPCEnabledFlag.Name) { vhosts := splitAndTrim(c.GlobalString(utils.RPCVirtualHostsFlag.Name)) cors := splitAndTrim(c.GlobalString(utils.RPCCORSDomainFlag.Name)) // start http server - httpEndpoint := fmt.Sprintf("%s:%d", c.String(utils.RPCListenAddrFlag.Name), c.Int(rpcPortFlag.Name)) + httpEndpoint := fmt.Sprintf("%s:%d", c.GlobalString(utils.RPCListenAddrFlag.Name), c.Int(rpcPortFlag.Name)) listener, _, err := rpc.StartHTTPEndpoint(httpEndpoint, rpcAPI, []string{"account"}, cors, vhosts, rpc.DefaultHTTPTimeouts) if err != nil { utils.Fatalf("Could not start RPC api: %v", err) @@ -432,11 +522,10 @@ func signer(c *cli.Context) error { listener.Close() log.Info("HTTP endpoint closed", "url", httpEndpoint) }() - } - if !c.Bool(utils.IPCDisabledFlag.Name) { + if !c.GlobalBool(utils.IPCDisabledFlag.Name) { if c.IsSet(utils.IPCPathFlag.Name) { - ipcapiURL = c.String(utils.IPCPathFlag.Name) + ipcapiURL = c.GlobalString(utils.IPCPathFlag.Name) } else { ipcapiURL = filepath.Join(configDir, "clef.ipc") } @@ -453,14 +542,14 @@ func signer(c *cli.Context) error { } - if c.Bool(testFlag.Name) { + if c.GlobalBool(testFlag.Name) { log.Info("Performing UI test") go testExternalUI(apiImpl) } ui.OnSignerStartup(core.StartupInfo{ Info: map[string]interface{}{ - "extapi_version": ExternalAPIVersion, - "intapi_version": InternalAPIVersion, + "intapi_version": core.InternalAPIVersion, + "extapi_version": core.ExternalAPIVersion, "extapi_http": extapiURL, "extapi_ipc": ipcapiURL, }, @@ -494,7 +583,12 @@ func DefaultConfigDir() string { if runtime.GOOS == "darwin" { return filepath.Join(home, "Library", "Signer") } else if runtime.GOOS == "windows" { - return filepath.Join(home, "AppData", "Roaming", "Signer") + appdata := os.Getenv("APPDATA") + if appdata != "" { + return filepath.Join(appdata, "Signer") + } else { + return filepath.Join(home, "AppData", "Roaming", "Signer") + } } else { return filepath.Join(home, ".clef") } @@ -512,36 +606,51 @@ func homeDir() string { } return "" } -func readMasterKey(ctx *cli.Context) ([]byte, error) { +func readMasterKey(ctx *cli.Context, ui core.UIClientAPI) ([]byte, error) { var ( file string - configDir = ctx.String(configdirFlag.Name) + configDir = ctx.GlobalString(configdirFlag.Name) ) - if ctx.IsSet(signerSecretFlag.Name) { - file = ctx.String(signerSecretFlag.Name) + if ctx.GlobalIsSet(signerSecretFlag.Name) { + file = ctx.GlobalString(signerSecretFlag.Name) } else { - file = filepath.Join(configDir, "secrets.dat") + file = filepath.Join(configDir, "masterseed.json") } if err := checkFile(file); err != nil { return nil, err } - masterKey, err := ioutil.ReadFile(file) + cipherKey, err := ioutil.ReadFile(file) if err != nil { return nil, err } - if len(masterKey) < 256 { - return nil, fmt.Errorf("master key of insufficient length, expected >255 bytes, got %d", len(masterKey)) + var password string + // If ui is not nil, get the password from ui. + if ui != nil { + resp, err := ui.OnInputRequired(core.UserInputRequest{ + Title: "Master Password", + Prompt: "Please enter the password to decrypt the master seed", + IsPassword: true}) + if err != nil { + return nil, err + } + password = resp.Text + } else { + password = getPassPhrase("Decrypt master seed of clef", false) + } + masterSeed, err := decryptSeed(cipherKey, password) + if err != nil { + return nil, fmt.Errorf("failed to decrypt the master seed of clef") + } + if len(masterSeed) < 256 { + return nil, fmt.Errorf("master seed of insufficient length, expected >255 bytes, got %d", len(masterSeed)) } // Create vault location - vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), masterKey)[:10])) + vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), masterSeed)[:10])) err = os.Mkdir(vaultLocation, 0700) if err != nil && !os.IsExist(err) { return nil, err } - //!TODO, use KDF to stretch the master key - // stretched_key := stretch_key(master_key) - - return masterKey, nil + return masterSeed, nil } // checkFile is a convenience function to check if a file @@ -562,13 +671,12 @@ func checkFile(filename string) error { // confirm displays a text and asks for user confirmation func confirm(text string) bool { fmt.Printf(text) - fmt.Printf("\nEnter 'ok' to proceed:\n>") + fmt.Printf("\nEnter 'ok' to proceed:\n> ") text, err := bufio.NewReader(os.Stdin).ReadString('\n') if err != nil { log.Crit("Failed to read user input", "err", err) } - if text := strings.TrimSpace(text); text == "ok" { return true } @@ -580,67 +688,347 @@ func testExternalUI(api *core.SignerAPI) { ctx := context.WithValue(context.Background(), "remote", "clef binary") ctx = context.WithValue(ctx, "scheme", "in-proc") ctx = context.WithValue(ctx, "local", "main") - errs := make([]string, 0) - api.UI.ShowInfo("Testing 'ShowInfo'") - api.UI.ShowError("Testing 'ShowError'") + a := common.HexToAddress("0xdeadbeef000000000000000000000000deadbeef") + addErr := func(errStr string) { + log.Info("Test error", "err", errStr) + errs = append(errs, errStr) + } - checkErr := func(method string, err error) { - if err != nil && err != core.ErrRequestDenied { - errs = append(errs, fmt.Sprintf("%v: %v", method, err.Error())) + queryUser := func(q string) string { + resp, err := api.UI.OnInputRequired(core.UserInputRequest{ + Title: "Testing", + Prompt: q, + }) + if err != nil { + addErr(err.Error()) } + return resp.Text } - var err error - - _, err = api.SignTransaction(ctx, core.SendTxArgs{From: common.MixedcaseAddress{}}, nil) - checkErr("SignTransaction", err) - _, err = api.Sign(ctx, common.MixedcaseAddress{}, common.Hex2Bytes("01020304")) - checkErr("Sign", err) - _, err = api.List(ctx) - checkErr("List", err) - _, err = api.New(ctx) - checkErr("New", err) - _, err = api.Export(ctx, common.Address{}) - checkErr("Export", err) - _, err = api.Import(ctx, json.RawMessage{}) - checkErr("Import", err) - - api.UI.ShowInfo("Tests completed") - - if len(errs) > 0 { - log.Error("Got errors") - for _, e := range errs { - log.Error(e) + expectResponse := func(testcase, question, expect string) { + if got := queryUser(question); got != expect { + addErr(fmt.Sprintf("%s: got %v, expected %v", testcase, got, expect)) } - } else { - log.Info("No errors") + } + expectApprove := func(testcase string, err error) { + if err == nil || err == accounts.ErrUnknownAccount { + return + } + addErr(fmt.Sprintf("%v: expected no error, got %v", testcase, err.Error())) + } + expectDeny := func(testcase string, err error) { + if err == nil || err != core.ErrRequestDenied { + addErr(fmt.Sprintf("%v: expected ErrRequestDenied, got %v", testcase, err)) + } + } + var delay = 1 * time.Second + // Test display of info and error + { + api.UI.ShowInfo("If you see this message, enter 'yes' to next question") + time.Sleep(delay) + expectResponse("showinfo", "Did you see the message? [yes/no]", "yes") + api.UI.ShowError("If you see this message, enter 'yes' to the next question") + time.Sleep(delay) + expectResponse("showerror", "Did you see the message? [yes/no]", "yes") + } + { // Sign data test - clique header + api.UI.ShowInfo("Please approve the next request for signing a clique header") + time.Sleep(delay) + cliqueHeader := types.Header{ + common.HexToHash("0000H45H"), + common.HexToHash("0000H45H"), + common.HexToAddress("0000H45H"), + common.HexToHash("0000H00H"), + common.HexToHash("0000H45H"), + common.HexToHash("0000H45H"), + types.Bloom{}, + big.NewInt(1337), + big.NewInt(1337), + 1338, + 1338, + 1338, + []byte("Extra data Extra data Extra data Extra data Extra data Extra data Extra data Extra data"), + common.HexToHash("0x0000H45H"), + types.BlockNonce{}, + } + cliqueRlp, err := rlp.EncodeToBytes(cliqueHeader) + if err != nil { + utils.Fatalf("Should not error: %v", err) + } + addr, _ := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899") + _, err = api.SignData(ctx, accounts.MimetypeClique, *addr, hexutil.Encode(cliqueRlp)) + expectApprove("signdata - clique header", err) + } + { // Sign data test - typed data + api.UI.ShowInfo("Please approve the next request for signing EIP-712 typed data") + time.Sleep(delay) + addr, _ := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899") + data := `{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Person":[{"name":"name","type":"string"},{"name":"test","type":"uint8"},{"name":"wallet","type":"address"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person"},{"name":"contents","type":"string"}]},"primaryType":"Mail","domain":{"name":"Ether Mail","version":"1","chainId":"1","verifyingContract":"0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},"message":{"from":{"name":"Cow","test":"3","wallet":"0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826"},"to":{"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB","test":"2"},"contents":"Hello, Bob!"}}` + //_, err := api.SignData(ctx, accounts.MimetypeTypedData, *addr, hexutil.Encode([]byte(data))) + var typedData core.TypedData + json.Unmarshal([]byte(data), &typedData) + _, err := api.SignTypedData(ctx, *addr, typedData) + expectApprove("sign 712 typed data", err) + } + { // Sign data test - plain text + api.UI.ShowInfo("Please approve the next request for signing text") + time.Sleep(delay) + addr, _ := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899") + _, err := api.SignData(ctx, accounts.MimetypeTextPlain, *addr, hexutil.Encode([]byte("hello world"))) + expectApprove("signdata - text", err) + } + { // Sign data test - plain text reject + api.UI.ShowInfo("Please deny the next request for signing text") + time.Sleep(delay) + addr, _ := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899") + _, err := api.SignData(ctx, accounts.MimetypeTextPlain, *addr, hexutil.Encode([]byte("hello world"))) + expectDeny("signdata - text", err) + } + { // Sign transaction + + api.UI.ShowInfo("Please reject next transaction") + time.Sleep(delay) + data := hexutil.Bytes([]byte{}) + to := common.NewMixedcaseAddress(a) + tx := core.SendTxArgs{ + Data: &data, + Nonce: 0x1, + Value: hexutil.Big(*big.NewInt(6)), + From: common.NewMixedcaseAddress(a), + To: &to, + GasPrice: hexutil.Big(*big.NewInt(5)), + Gas: 1000, + Input: nil, + } + _, err := api.SignTransaction(ctx, tx, nil) + expectDeny("signtransaction [1]", err) + expectResponse("signtransaction [2]", "Did you see any warnings for the last transaction? (yes/no)", "no") + } + { // Listing + api.UI.ShowInfo("Please reject listing-request") + time.Sleep(delay) + _, err := api.List(ctx) + expectDeny("list", err) + } + { // Import + api.UI.ShowInfo("Please reject new account-request") + time.Sleep(delay) + _, err := api.New(ctx) + expectDeny("newaccount", err) + } + { // Metadata + api.UI.ShowInfo("Please check if you see the Origin in next listing (approve or deny)") + time.Sleep(delay) + api.List(context.WithValue(ctx, "Origin", "origin.com")) + expectResponse("metadata - origin", "Did you see origin (origin.com)? [yes/no] ", "yes") } -} + for _, e := range errs { + log.Error(e) + } + result := fmt.Sprintf("Tests completed. %d errors:\n%s\n", len(errs), strings.Join(errs, "\n")) + api.UI.ShowInfo(result) -/** -//Create Account +} -curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_new","params":["test"],"id":67}' localhost:8550 +// getPassPhrase retrieves the password associated with clef, either fetched +// from a list of preloaded passphrases, or requested interactively from the user. +// TODO: there are many `getPassPhrase` functions, it will be better to abstract them into one. +func getPassPhrase(prompt string, confirmation bool) string { + fmt.Println(prompt) + password, err := console.Stdin.PromptPassword("Passphrase: ") + if err != nil { + utils.Fatalf("Failed to read passphrase: %v", err) + } + if confirmation { + confirm, err := console.Stdin.PromptPassword("Repeat passphrase: ") + if err != nil { + utils.Fatalf("Failed to read passphrase confirmation: %v", err) + } + if password != confirm { + utils.Fatalf("Passphrases do not match") + } + } + return password +} -// List accounts +type encryptedSeedStorage struct { + Description string `json:"description"` + Version int `json:"version"` + Params keystore.CryptoJSON `json:"params"` +} -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_list","params":[""],"id":67}' http://localhost:8550/ +// encryptSeed uses a similar scheme as the keystore uses, but with a different wrapping, +// to encrypt the master seed +func encryptSeed(seed []byte, auth []byte, scryptN, scryptP int) ([]byte, error) { + cryptoStruct, err := keystore.EncryptDataV3(seed, auth, scryptN, scryptP) + if err != nil { + return nil, err + } + return json.Marshal(&encryptedSeedStorage{"Clef seed", 1, cryptoStruct}) +} -// Make Transaction -// safeSend(0x12) -// 4401a6e40000000000000000000000000000000000000000000000000000000000000012 +// decryptSeed decrypts the master seed +func decryptSeed(keyjson []byte, auth string) ([]byte, error) { + var encSeed encryptedSeedStorage + if err := json.Unmarshal(keyjson, &encSeed); err != nil { + return nil, err + } + if encSeed.Version != 1 { + log.Warn(fmt.Sprintf("unsupported encryption format of seed: %d, operation will likely fail", encSeed.Version)) + } + seed, err := keystore.DecryptDataV3(encSeed.Params, auth) + if err != nil { + return nil, err + } + return seed, err +} -// supplied abi -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":[{"from":"0x82A2A876D39022B3019932D30Cd9c97ad5616813","gas":"0x333","gasPrice":"0x123","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x10", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"},"test"],"id":67}' http://localhost:8550/ +// GenDoc outputs examples of all structures used in json-rpc communication +func GenDoc(ctx *cli.Context) { -// Not supplied -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":[{"from":"0x82A2A876D39022B3019932D30Cd9c97ad5616813","gas":"0x333","gasPrice":"0x123","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x10", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"}],"id":67}' http://localhost:8550/ + var ( + a = common.HexToAddress("0xdeadbeef000000000000000000000000deadbeef") + b = common.HexToAddress("0x1111111122222222222233333333334444444444") + meta = core.Metadata{ + Scheme: "http", + Local: "localhost:8545", + Origin: "www.malicious.ru", + Remote: "localhost:9999", + UserAgent: "Firefox 3.2", + } + output []string + add = func(name, desc string, v interface{}) { + if data, err := json.MarshalIndent(v, "", " "); err == nil { + output = append(output, fmt.Sprintf("### %s\n\n%s\n\nExample:\n```json\n%s\n```", name, desc, data)) + } else { + log.Error("Error generating output", err) + } + } + ) -// Sign data + { // Sign plain text request + desc := "SignDataRequest contains information about a pending request to sign some data. " + + "The data to be signed can be of various types, defined by content-type. Clef has done most " + + "of the work in canonicalizing and making sense of the data, and it's up to the UI to present" + + "the user with the contents of the `message`" + sighash, msg := accounts.TextAndHash([]byte("hello world")) + messages := []*core.NameValueType{{"message", msg, accounts.MimetypeTextPlain}} + + add("SignDataRequest", desc, &core.SignDataRequest{ + Address: common.NewMixedcaseAddress(a), + Meta: meta, + ContentType: accounts.MimetypeTextPlain, + Rawdata: []byte(msg), + Messages: messages, + Hash: sighash}) + } + { // Sign plain text response + add("SignDataResponse - approve", "Response to SignDataRequest", + &core.SignDataResponse{Approved: true}) + add("SignDataResponse - deny", "Response to SignDataRequest", + &core.SignDataResponse{}) + } + { // Sign transaction request + desc := "SignTxRequest contains information about a pending request to sign a transaction. " + + "Aside from the transaction itself, there is also a `call_info`-struct. That struct contains " + + "messages of various types, that the user should be informed of." + + "\n\n" + + "As in any request, it's important to consider that the `meta` info also contains untrusted data." + + "\n\n" + + "The `transaction` (on input into clef) can have either `data` or `input` -- if both are set, " + + "they must be identical, otherwise an error is generated. " + + "However, Clef will always use `data` when passing this struct on (if Clef does otherwise, please file a ticket)" + + data := hexutil.Bytes([]byte{0x01, 0x02, 0x03, 0x04}) + add("SignTxRequest", desc, &core.SignTxRequest{ + Meta: meta, + Callinfo: []core.ValidationInfo{ + {"Warning", "Something looks odd, show this message as a warning"}, + {"Info", "User should see this aswell"}, + }, + Transaction: core.SendTxArgs{ + Data: &data, + Nonce: 0x1, + Value: hexutil.Big(*big.NewInt(6)), + From: common.NewMixedcaseAddress(a), + To: nil, + GasPrice: hexutil.Big(*big.NewInt(5)), + Gas: 1000, + Input: nil, + }}) + } + { // Sign tx response + data := hexutil.Bytes([]byte{0x04, 0x03, 0x02, 0x01}) + add("SignTxResponse - approve", "Response to request to sign a transaction. This response needs to contain the `transaction`"+ + ", because the UI is free to make modifications to the transaction.", + &core.SignTxResponse{Approved: true, + Transaction: core.SendTxArgs{ + Data: &data, + Nonce: 0x4, + Value: hexutil.Big(*big.NewInt(6)), + From: common.NewMixedcaseAddress(a), + To: nil, + GasPrice: hexutil.Big(*big.NewInt(5)), + Gas: 1000, + Input: nil, + }}) + add("SignTxResponse - deny", "Response to SignTxRequest. When denying a request, there's no need to "+ + "provide the transaction in return", + &core.SignTxResponse{}) + } + { // WHen a signed tx is ready to go out + desc := "SignTransactionResult is used in the call `clef` -> `OnApprovedTx(result)`" + + "\n\n" + + "This occurs _after_ successful completion of the entire signing procedure, but right before the signed " + + "transaction is passed to the external caller. This method (and data) can be used by the UI to signal " + + "to the user that the transaction was signed, but it is primarily useful for ruleset implementations." + + "\n\n" + + "A ruleset that implements a rate limitation needs to know what transactions are sent out to the external " + + "interface. By hooking into this methods, the ruleset can maintain track of that count." + + "\n\n" + + "**OBS:** Note that if an attacker can restore your `clef` data to a previous point in time" + + " (e.g through a backup), the attacker can reset such windows, even if he/she is unable to decrypt the content. " + + "\n\n" + + "The `OnApproved` method cannot be responded to, it's purely informative" + + rlpdata := common.FromHex("0xf85d640101948a8eafb1cf62bfbeb1741769dae1a9dd47996192018026a0716bd90515acb1e68e5ac5867aa11a1e65399c3349d479f5fb698554ebc6f293a04e8a4ebfff434e971e0ef12c5bf3a881b06fd04fc3f8b8a7291fb67a26a1d4ed") + var tx types.Transaction + rlp.DecodeBytes(rlpdata, &tx) + add("OnApproved - SignTransactionResult", desc, ðapi.SignTransactionResult{Raw: rlpdata, Tx: &tx}) -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_sign","params":["0x694267f14675d7e1b9494fd8d72fefe1755710fa","bazonk gaz baz"],"id":67}' http://localhost:8550/ + } + { // User input + add("UserInputRequest", "Sent when clef needs the user to provide data. If 'password' is true, the input field should be treated accordingly (echo-free)", + &core.UserInputRequest{IsPassword: true, Title: "The title here", Prompt: "The question to ask the user"}) + add("UserInputResponse", "Response to UserInputRequest", + &core.UserInputResponse{Text: "The textual response from user"}) + } + { // List request + add("ListRequest", "Sent when a request has been made to list addresses. The UI is provided with the "+ + "full `account`s, including local directory names. Note: this information is not passed back to the external caller, "+ + "who only sees the `address`es. ", + &core.ListRequest{ + Meta: meta, + Accounts: []accounts.Account{ + {a, accounts.URL{Scheme: "keystore", Path: "/path/to/keyfile/a"}}, + {b, accounts.URL{Scheme: "keystore", Path: "/path/to/keyfile/b"}}}, + }) + + add("ListResponse", "Response to list request. The response contains a list of all addresses to show to the caller. "+ + "Note: the UI is free to respond with any address the caller, regardless of whether it exists or not", + &core.ListResponse{ + Accounts: []accounts.Account{ + {common.HexToAddress("0xcowbeef000000cowbeef00000000000000000c0w"), accounts.URL{Path: ".. ignored .."}}, + {common.HexToAddress("0xffffffffffffffffffffffffffffffffffffffff"), accounts.URL{}}, + }}) + } + fmt.Println(`## UI Client interface -**/ +These data types are defined in the channel between clef and the UI`) + for _, elem := range output { + fmt.Println(elem) + } +} diff --git a/cmd/clef/pythonsigner.py b/cmd/clef/pythonsigner.py index 46fa23bd8c1b..315aabd73fdb 100644 --- a/cmd/clef/pythonsigner.py +++ b/cmd/clef/pythonsigner.py @@ -42,7 +42,6 @@ def send_reply(self, context, reply): self.output.write("\n") class StdIOHandler(): - def __init__(self): pass @@ -76,7 +75,7 @@ def ApproveTx(self,req): :param transaction: transaction info :param call_info: info abou the call, e.g. if ABI info could not be :param meta: metadata about the request, e.g. where the call comes from - :return: + :return: """ transaction = req.get('transaction') _from = req.get('from') @@ -158,8 +157,7 @@ def ShowInfo(self,message = {}): return def main(args): - - cmd = ["./clef", "--stdio-ui"] + cmd = ["clef", "--stdio-ui"] if len(args) > 0 and args[0] == "test": cmd.extend(["--stdio-ui-test"]) print("cmd: {}".format(" ".join(cmd))) diff --git a/cmd/clef/rules.md b/cmd/clef/rules.md index 327ba765c5fb..112dae651220 100644 --- a/cmd/clef/rules.md +++ b/cmd/clef/rules.md @@ -19,32 +19,30 @@ The section below deals with both of them A ruleset file is implemented as a `js` file. Under the hood, the ruleset-engine is a `SignerUI`, implementing the same methods as the `json-rpc` methods defined in the UI protocol. Example: -```javascript - -function asBig(str){ - if(str.slice(0,2) == "0x"){ return new BigNumber(str.slice(2),16)} - return new BigNumber(str) +```js +function asBig(str) { + if (str.slice(0, 2) == "0x") { + return new BigNumber(str.slice(2), 16) + } + return new BigNumber(str) } // Approve transactions to a certain contract if value is below a certain limit -function ApproveTx(req){ - - var limit = big.Newint("0xb1a2bc2ec50000") +function ApproveTx(req) { + var limit = big.Newint("0xb1a2bc2ec50000") var value = asBig(req.transaction.value); - if(req.transaction.to.toLowerCase()=="0xae967917c465db8578ca9024c205720b1a3651a9") - && value.lt(limit) ){ - return "Approve" - } - // If we return "Reject", it will be rejected. - // By not returning anything, it will be passed to the next UI, for manual processing + if (req.transaction.to.toLowerCase() == "0xae967917c465db8578ca9024c205720b1a3651a9") && value.lt(limit)) { + return "Approve" + } + // If we return "Reject", it will be rejected. + // By not returning anything, it will be passed to the next UI, for manual processing } -//Approve listings if request made from IPC +// Approve listings if request made from IPC function ApproveListing(req){ if (req.metadata.scheme == "ipc"){ return "Approve"} } - ``` Whenever the external API is called (and the ruleset is enabled), the `signer` calls the UI, which is an instance of a ruleset-engine. The ruleset-engine @@ -72,7 +70,7 @@ The Otto vm has a few [caveats](https://github.com/robertkrimen/otto): Additionally, a few more have been added * The rule execution cannot load external javascript files. -* The only preloaded libary is [`bignumber.js`](https://github.com/MikeMcl/bignumber.js) version `2.0.3`. This one is fairly old, and is not aligned with the documentation at the github repository. +* The only preloaded library is [`bignumber.js`](https://github.com/MikeMcl/bignumber.js) version `2.0.3`. This one is fairly old, and is not aligned with the documentation at the github repository. * Each invocation is made in a fresh virtual machine. This means that you cannot store data in global variables between invocations. This is a deliberate choice -- if you want to store data, use the disk-backed `storage`, since rules should not rely on ephemeral data. * Javascript API parameters are _always_ an object. This is also a design choice, to ensure that parameters are accessed by _key_ and not by order. This is to prevent mistakes due to missing parameters or parameter changes. * The JS engine has access to `storage` and `console`. @@ -140,97 +138,97 @@ This is now implemented (with ephemeral non-encrypted storage for now, so not ye ## Example 1: ruleset for a rate-limited window -```javascript - - function big(str){ - if(str.slice(0,2) == "0x"){ return new BigNumber(str.slice(2),16)} - return new BigNumber(str) +```js +function big(str) { + if (str.slice(0, 2) == "0x") { + return new BigNumber(str.slice(2), 16) } + return new BigNumber(str) +} - // Time window: 1 week - var window = 1000* 3600*24*7; +// Time window: 1 week +var window = 1000* 3600*24*7; - // Limit : 1 ether - var limit = new BigNumber("1e18"); +// Limit : 1 ether +var limit = new BigNumber("1e18"); - function isLimitOk(transaction){ - var value = big(transaction.value) - // Start of our window function - var windowstart = new Date().getTime() - window; +function isLimitOk(transaction) { + var value = big(transaction.value) + // Start of our window function + var windowstart = new Date().getTime() - window; - var txs = []; - var stored = storage.Get('txs'); + var txs = []; + var stored = storage.get('txs'); - if(stored != ""){ - txs = JSON.parse(stored) - } - // First, remove all that have passed out of the time-window - var newtxs = txs.filter(function(tx){return tx.tstamp > windowstart}); - console.log(txs, newtxs.length); + if (stored != "") { + txs = JSON.parse(stored) + } + // First, remove all that have passed out of the time-window + var newtxs = txs.filter(function(tx){return tx.tstamp > windowstart}); + console.log(txs, newtxs.length); - // Secondly, aggregate the current sum - sum = new BigNumber(0) + // Secondly, aggregate the current sum + sum = new BigNumber(0) - sum = newtxs.reduce(function(agg, tx){ return big(tx.value).plus(agg)}, sum); - console.log("ApproveTx > Sum so far", sum); - console.log("ApproveTx > Requested", value.toNumber()); + sum = newtxs.reduce(function(agg, tx){ return big(tx.value).plus(agg)}, sum); + console.log("ApproveTx > Sum so far", sum); + console.log("ApproveTx > Requested", value.toNumber()); - // Would we exceed weekly limit ? - return sum.plus(value).lt(limit) + // Would we exceed weekly limit ? + return sum.plus(value).lt(limit) +} +function ApproveTx(r) { + if (isLimitOk(r.transaction)) { + return "Approve" } - function ApproveTx(r){ - if (isLimitOk(r.transaction)){ - return "Approve" - } - return "Nope" - } + return "Nope" +} - /** - * OnApprovedTx(str) is called when a transaction has been approved and signed. The parameter - * 'response_str' contains the return value that will be sent to the external caller. - * The return value from this method is ignore - the reason for having this callback is to allow the - * ruleset to keep track of approved transactions. - * - * When implementing rate-limited rules, this callback should be used. - * If a rule responds with neither 'Approve' nor 'Reject' - the tx goes to manual processing. If the user - * then accepts the transaction, this method will be called. - * - * TLDR; Use this method to keep track of signed transactions, instead of using the data in ApproveTx. - */ - function OnApprovedTx(resp){ - var value = big(resp.tx.value) - var txs = [] - // Load stored transactions - var stored = storage.Get('txs'); - if(stored != ""){ - txs = JSON.parse(stored) - } - // Add this to the storage - txs.push({tstamp: new Date().getTime(), value: value}); - storage.Put("txs", JSON.stringify(txs)); +/** +* OnApprovedTx(str) is called when a transaction has been approved and signed. The parameter + * 'response_str' contains the return value that will be sent to the external caller. +* The return value from this method is ignore - the reason for having this callback is to allow the +* ruleset to keep track of approved transactions. +* +* When implementing rate-limited rules, this callback should be used. +* If a rule responds with neither 'Approve' nor 'Reject' - the tx goes to manual processing. If the user +* then accepts the transaction, this method will be called. +* +* TLDR; Use this method to keep track of signed transactions, instead of using the data in ApproveTx. +*/ +function OnApprovedTx(resp) { + var value = big(resp.tx.value) + var txs = [] + // Load stored transactions + var stored = storage.get('txs'); + if (stored != "") { + txs = JSON.parse(stored) } - + // Add this to the storage + txs.push({tstamp: new Date().getTime(), value: value}); + storage.put("txs", JSON.stringify(txs)); +} ``` ## Example 2: allow destination -```javascript - - function ApproveTx(r){ - if(r.transaction.from.toLowerCase()=="0x0000000000000000000000000000000000001337"){ return "Approve"} - if(r.transaction.from.toLowerCase()=="0x000000000000000000000000000000000000dead"){ return "Reject"} - // Otherwise goes to manual processing +```js +function ApproveTx(r) { + if (r.transaction.from.toLowerCase() == "0x0000000000000000000000000000000000001337") { + return "Approve" } - + if (r.transaction.from.toLowerCase() == "0x000000000000000000000000000000000000dead") { + return "Reject" + } + // Otherwise goes to manual processing +} ``` ## Example 3: Allow listing -```javascript - - function ApproveListing(){ - return "Approve" - } - -``` \ No newline at end of file +```js +function ApproveListing() { + return "Approve" +} +``` diff --git a/cmd/clef/tests/testsigner.js b/cmd/clef/tests/testsigner.js new file mode 100644 index 000000000000..258679de5073 --- /dev/null +++ b/cmd/clef/tests/testsigner.js @@ -0,0 +1,89 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +// This file is a test-utility for testing clef-functionality +// +// Start clef with +// +// build/bin/clef --4bytedb=./cmd/clef/4byte.json --rpc +// +// Start geth with +// +// build/bin/geth --nodiscover --maxpeers 0 --signer http://localhost:8550 console --preload=cmd/clef/tests/testsigner.js +// +// and in the console simply invoke +// +// > test() +// +// You can reload the file via `reload()` + +function reload(){ + loadScript("./cmd/clef/tests/testsigner.js"); +} + +function init(){ + if (typeof accts == 'undefined' || accts.length == 0){ + accts = eth.accounts + console.log("Got accounts ", accts); + } +} +init() +function testTx(){ + if( accts && accts.length > 0) { + var a = accts[0] + var txdata = eth.signTransaction({from: a, to: a, value: 1, nonce: 1, gas: 1, gasPrice: 1}) + var v = parseInt(txdata.tx.v) + console.log("V value: ", v) + if (v == 37 || v == 38){ + console.log("Mainnet 155-protected chainid was used") + } + if (v == 27 || v == 28){ + throw new Error("Mainnet chainid was used, but without replay protection!") + } + } +} +function testSignText(){ + if( accts && accts.length > 0){ + var a = accts[0] + var r = eth.sign(a, "0x68656c6c6f20776f726c64"); //hello world + console.log("signing response", r) + } +} +function testClique(){ + if( accts && accts.length > 0){ + var a = accts[0] + var r = debug.testSignCliqueBlock(a, 0); // Sign genesis + console.log("signing response", r) + if( a != r){ + throw new Error("Requested signing by "+a+ " but got sealer "+r) + } + } +} + +function test(){ + var tests = [ + testTx, + testSignText, + testClique, + ] + for( i in tests){ + try{ + tests[i]() + }catch(err){ + console.log(err) + } + } + } diff --git a/cmd/clef/tutorial.md b/cmd/clef/tutorial.md index dfb31ba4efac..422946dbd966 100644 --- a/cmd/clef/tutorial.md +++ b/cmd/clef/tutorial.md @@ -1,200 +1,278 @@ -## Initializing the signer +## Initializing Clef -First, initialize the master seed. +First thing's first, Clef needs to store some data itself. Since that data might be sensitive (passwords, signing rules, accounts), Clef's entire storage is encrypted. To support encrypting data, the first step is to initialize Clef with a random master seed, itself too encrypted with your chosen password: ```text -#./signer init +$ clef init WARNING! -The signer is alpha software, and not yet publically released. This software has _not_ been audited, and there -are no guarantees about the workings of this software. It may contain severe flaws. You should not use this software -unless you agree to take full responsibility for doing so, and know what you are doing. +Clef is an account management tool. It may, like any software, contain bugs. -TLDR; THIS IS NOT PRODUCTION-READY SOFTWARE! +Please take care to +- backup your keystore files, +- verify that the keystore(s) can be opened with your password. +Clef is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. Enter 'ok' to proceed: ->ok -A master seed has been generated into /home/martin/.signer/secrets.dat +> ok -This is required to be able to store credentials, such as : +The master seed of clef will be locked with a password. +Please specify a password. Do not forget this password! +Passphrase: +Repeat passphrase: + +A master seed has been generated into /home/martin/.clef/masterseed.json + +This is required to be able to store credentials, such as: * Passwords for keystores (used by rule engine) -* Storage for javascript rules -* Hash of rule-file +* Storage for JavaScript auto-signing rules +* Hash of JavaScript rule-file -You should treat that file with utmost secrecy, and make a backup of it. -NOTE: This file does not contain your accounts. Those need to be backed up separately! +You should treat 'masterseed.json' with utmost secrecy and make a backup of it! +* The password is necessary but not enough, you need to back up the master seed too! +* The master seed does not contain your accounts, those need to be backed up separately! ``` -(for readability purposes, we'll remove the WARNING printout in the rest of this document) +*For readability purposes, we'll remove the WARNING printout, user confirmation and the unlocking of the master seed in the rest of this document.* -## Creating rules +## Remote interactions -Now, you can create a rule-file. Note that it is not mandatory to use predefined rules, but it's really handy. +Clef is capable of managing both key-file based accounts as well as hardware wallets. To evaluate clef, we're going to point it to our Rinkeby testnet keystore and specify the Rinkeby chain ID for signing (Clef doesn't have a backing chain, so it doesn't know what network it runs on). -```javascript -function ApproveListing(){ - return "Approve" -} +```text +$ clef --keystore ~/.ethereum/rinkeby/keystore --chainid 4 + +INFO [07-01|11:00:46.385] Starting signer chainid=4 keystore=$HOME/.ethereum/rinkeby/keystore light-kdf=false advanced=false +DEBUG[07-01|11:00:46.389] FS scan times list=3.521941ms set=9.017µs diff=4.112µs +DEBUG[07-01|11:00:46.391] Ledger support enabled +DEBUG[07-01|11:00:46.391] Trezor support enabled via HID +DEBUG[07-01|11:00:46.391] Trezor support enabled via WebUSB +INFO [07-01|11:00:46.391] Audit logs configured file=audit.log +DEBUG[07-01|11:00:46.392] IPC registered namespace=account +INFO [07-01|11:00:46.392] IPC endpoint opened url=$HOME/.clef/clef.ipc +------- Signer info ------- +* intapi_version : 7.0.0 +* extapi_version : 6.0.0 +* extapi_http : n/a +* extapi_ipc : $HOME/.clef/clef.ipc ``` -Get the `sha256` hash. If you have openssl, you can do `openssl sha256 rules.js`... +By default, Clef starts up in CLI (Command Line Interface) mode. Arbitrary remote processes may *request* account interactions (e.g. sign a transaction), which the user will need to individually *confirm*. + +To test this out, we can *request* Clef to list all account via its *External API endpoint*: + ```text -#sha256sum rules.js -6c21d1737429d6d4f2e55146da0797782f3c0a0355227f19d702df377c165d72 rules.js +echo '{"id": 1, "jsonrpc": "2.0", "method": "account_list"}' | nc -U ~/.clef/clef.ipc ``` -...now `attest` the file... -```text -#./signer attest 6c21d1737429d6d4f2e55146da0797782f3c0a0355227f19d702df377c165d72 -INFO [02-21|12:14:38] Ruleset attestation updated sha256=6c21d1737429d6d4f2e55146da0797782f3c0a0355227f19d702df377c165d72 +This will prompt the user within the Clef CLI to confirm or deny the request: + +```text +-------- List Account request-------------- +A request has been made to list all accounts. +You can select which accounts the caller can see + [x] 0xD9C9Cd5f6779558b6e0eD4e6Acf6b1947E7fA1F3 + URL: keystore://$HOME/.ethereum/rinkeby/keystore/UTC--2017-04-14T15-15-00.327614556Z--d9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 + [x] 0x086278A6C067775F71d6B2BB1856Db6E28c30418 + URL: keystore://$HOME/.ethereum/rinkeby/keystore/UTC--2018-02-06T22-53-11.211657239Z--086278a6c067775f71d6b2bb1856db6e28c30418 +------------------------------------------- +Request context: + NA -> NA -> NA + +Additional HTTP header data, provided by the external caller: + User-Agent: + Origin: +Approve? [y/N]: +> ``` -...and (this is required only for non-production versions) load a mock-up `4byte.json` by copying the file from the source to your current working directory: +Depending on whether we approve or deny the request, the original NetCat process will get: + ```text -#cp $GOPATH/src/github.com/ethereum/go-ethereum/cmd/clef/4byte.json $PWD +{"jsonrpc":"2.0","id":1,"result":["0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3","0x086278a6c067775f71d6b2bb1856db6e28c30418"]} + +or + +{"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"Request denied"}} ``` -At this point, we can start the signer with the rule-file: +Apart from listing accounts, you can also *request* creating a new account; signing transactions and data; and recovering signatures. You can find the available methods in the Clef [External API Spec](https://github.com/ethereum/go-ethereum/tree/master/cmd/clef#external-api-1) and the [External API Changelog](https://github.com/ethereum/go-ethereum/blob/master/cmd/clef/extapi_changelog.md). + +*Note, the number of things you can do from the External API is deliberately small, since we want to limit the power of remote calls by as much as possible! Clef has an [Internal API](https://github.com/ethereum/go-ethereum/tree/master/cmd/clef#ui-api-1) too for the UI (User Interface) which is much richer and can support custom interfaces on top. But that's out of scope here.* + +## Automatic rules + +For most users, manually confirming every transaction is the way to go. However, there are cases when it makes sense to set up some rules which permit Clef to sign a transaction without prompting the user. One such example would be running a signer on Rinkeby or other PoA networks. + +For starters, we can create a rule file that automatically permits anyone to list our available accounts without user confirmation. The rule file is a tiny JavaScript snippet that you can program however you want: + +```js +function ApproveListing() { + return "Approve" +} +``` + +Of course, Clef isn't going to just accept and run arbitrary scripts you give it, that would be dangerous if someone changes your rule file! Instead, you need to explicitly *attest* the rule file, which entails injecting its hash into Clef's secure store. + ```text -#./signer --rules rules.js --rpc +$ sha256sum rules.js +645b58e4f945e24d0221714ff29f6aa8e860382ced43490529db1695f5fcc71c rules.js -INFO [09-25|20:28:11.866] Using CLI as UI-channel -INFO [09-25|20:28:11.876] Loaded 4byte db signatures=5509 file=./4byte.json -INFO [09-25|20:28:11.877] Rule engine configured file=./rules.js -DEBUG[09-25|20:28:11.877] FS scan times list=100.781µs set=13.253µs diff=5.761µs -DEBUG[09-25|20:28:11.884] Ledger support enabled -DEBUG[09-25|20:28:11.888] Trezor support enabled -INFO [09-25|20:28:11.888] Audit logs configured file=audit.log -DEBUG[09-25|20:28:11.888] HTTP registered namespace=account -INFO [09-25|20:28:11.890] HTTP endpoint opened url=http://localhost:8550 -DEBUG[09-25|20:28:11.890] IPC registered namespace=account -INFO [09-25|20:28:11.890] IPC endpoint opened url= +$ clef attest 645b58e4f945e24d0221714ff29f6aa8e860382ced43490529db1695f5fcc71c +Decrypt master seed of clef +Passphrase: +INFO [07-01|13:25:03.290] Ruleset attestation updated sha256=645b58e4f945e24d0221714ff29f6aa8e860382ced43490529db1695f5fcc71c +``` + +At this point, we can start Clef with the rule file: + +```text +$ clef --keystore ~/.ethereum/rinkeby/keystore --chainid 4 --rules rules.js + +INFO [07-01|13:39:49.726] Rule engine configured file=rules.js +INFO [07-01|13:39:49.726] Starting signer chainid=4 keystore=$HOME/.ethereum/rinkeby/keystore light-kdf=false advanced=false +DEBUG[07-01|13:39:49.726] FS scan times list=35.15µs set=4.251µs diff=2.766µs +DEBUG[07-01|13:39:49.727] Ledger support enabled +DEBUG[07-01|13:39:49.727] Trezor support enabled via HID +DEBUG[07-01|13:39:49.727] Trezor support enabled via WebUSB +INFO [07-01|13:39:49.728] Audit logs configured file=audit.log +DEBUG[07-01|13:39:49.728] IPC registered namespace=account +INFO [07-01|13:39:49.728] IPC endpoint opened url=$HOME/.clef/clef.ipc ------- Signer info ------- -* extapi_version : 2.0.0 -* intapi_version : 2.0.0 -* extapi_http : http://localhost:8550 -* extapi_ipc : +* intapi_version : 7.0.0 +* extapi_version : 6.0.0 +* extapi_http : n/a +* extapi_ipc : $HOME/.clef/clef.ipc ``` -Any list-requests will now be auto-approved by our rule-file. +Any account listing *request* will now be auto-approved by the rule file: + +```text +$ echo '{"id": 1, "jsonrpc": "2.0", "method": "account_list"}' | nc -U ~/.clef/clef.ipc +{"jsonrpc":"2.0","id":1,"result":["0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3","0x086278a6c067775f71d6b2bb1856db6e28c30418"]} +``` ## Under the hood While doing the operations above, these files have been created: ```text -#ls -laR ~/.signer/ -/home/martin/.signer/: -total 16 -drwx------ 3 martin martin 4096 feb 21 12:14 . -drwxr-xr-x 71 martin martin 4096 feb 21 12:12 .. -drwx------ 2 martin martin 4096 feb 21 12:14 43f73718397aa54d1b22 --rwx------ 1 martin martin 256 feb 21 12:12 secrets.dat +$ ls -laR ~/.clef/ -/home/martin/.signer/43f73718397aa54d1b22: -total 12 -drwx------ 2 martin martin 4096 feb 21 12:14 . -drwx------ 3 martin martin 4096 feb 21 12:14 .. --rw------- 1 martin martin 159 feb 21 12:14 config.json +$HOME/.clef/: +total 24 +drwxr-x--x 3 user user 4096 Jul 1 13:45 . +drwxr-xr-x 102 user user 12288 Jul 1 13:39 .. +drwx------ 2 user user 4096 Jul 1 13:25 02f90c0603f4f2f60188 +-r-------- 1 user user 868 Jun 28 13:55 masterseed.json -#cat /home/martin/.signer/43f73718397aa54d1b22/config.json -{"ruleset_sha256":{"iv":"6v4W4tfJxj3zZFbl","c":"6dt5RTDiTq93yh1qDEjpsat/tsKG7cb+vr3sza26IPL2fvsQ6ZoqFx++CPUa8yy6fD9Bbq41L01ehkKHTG3pOAeqTW6zc/+t0wv3AB6xPmU="}} +$HOME/.clef/02f90c0603f4f2f60188: +total 12 +drwx------ 2 user user 4096 Jul 1 13:25 . +drwxr-x--x 3 user user 4096 Jul 1 13:45 .. +-rw------- 1 user user 159 Jul 1 13:25 config.json +$ cat ~/.clef/02f90c0603f4f2f60188/config.json +{"ruleset_sha256":{"iv":"SWWEtnl+R+I+wfG7","c":"I3fjmwmamxVcfGax7D0MdUOL29/rBWcs73WBILmYK0o1CrX7wSMc3y37KsmtlZUAjp0oItYq01Ow8VGUOzilG91tDHInB5YHNtm/YkufEbo="}} ``` -In `~/.signer`, the `secrets.dat` file was created, containing the `master_seed`. -The `master_seed` was then used to derive a few other things: +In `$HOME/.clef`, the `masterseed.json` file was created, containing the master seed. This seed was then used to derive a few other things: -- `vault_location` : in this case `43f73718397aa54d1b22` . - - Thus, if you use a different `master_seed`, another `vault_location` will be used that does not conflict with each other. - - Example: `signer --signersecret /path/to/afile ...` -- `config.json` which is the encrypted key/value storage for configuration data, containing the key `ruleset_sha256`. +- **Vault location**: in this case `02f90c0603f4f2f60188`. + - If you use a different master seed, a different vault location will be used that does not conflict with each other (e.g. `clef --signersecret /path/to/file`). This allows you to run multiple instances of Clef, each with its own rules (e.g. mainnet + testnet). +- **`config.json`**: the encrypted key/value storage for configuration data, currently only containing the key `ruleset_sha256`, the attested hash of the automatic rules to use. +## Advanced rules -## Adding credentials - -In order to make more useful rules like signing transactions, the signer needs access to the passwords needed to unlock keystores. +In order to make more useful rules - like signing transactions - the signer needs access to the passwords needed to unlock keys from the keystore. You can inject an unlock password via `clef setpw`. ```text -#./signer addpw "0x694267f14675d7e1b9494fd8d72fefe1755710fa" "test_password" +$ clef setpw 0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 + +Please enter a passphrase to store for this address: +Passphrase: +Repeat passphrase: -INFO [02-21|13:43:21] Credential store updated key=0x694267f14675d7e1b9494fd8d72fefe1755710fa +Decrypt master seed of clef +Passphrase: +INFO [07-01|14:05:56.031] Credential store updated key=0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 ``` -## More advanced rules -Now let's update the rules to make use of credentials: +Now let's update the rules to make use of the new credentials: -```javascript -function ApproveListing(){ +```js +function ApproveListing() { return "Approve" } -function ApproveSignData(r){ - if( r.address.toLowerCase() == "0x694267f14675d7e1b9494fd8d72fefe1755710fa") - { - if(r.message.indexOf("bazonk") >= 0){ + +function ApproveSignData(req) { + if (req.address.toLowerCase() == "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3") { + if (req.messages[0].value.indexOf("bazonk") >= 0) { return "Approve" } return "Reject" } // Otherwise goes to manual processing } - ``` + In this example: -* Any requests to sign data with the account `0x694...` will be - * auto-approved if the message contains with `bazonk` - * auto-rejected if it does not. -* Any other signing-requests will be passed along for manual approve/reject. -_Note: make sure that `0x694...` is an account you have access to. You can create it either via the clef or the traditional account cli tool. If the latter was chosen, make sure both clef and geth use the same keystore by specifing `--keystore path/to/your/keystore` when running clef._ +- Any requests to sign data with the account `0xd9c9...` will be: + - Auto-approved if the message contains `bazonk`, + - Auto-rejected if the message does not contain `bazonk`, +- Any other requests will be passed along for manual confirmation. -Attest the new file... -```text -#sha256sum rules.js -2a0cb661dacfc804b6e95d935d813fd17c0997a7170e4092ffbc34ca976acd9f rules.js +*Note, to make this example work, please use you own accounts. You can create a new account either via Clef or the traditional account CLI tools. If the latter was chosen, make sure both Clef and Geth use the same keystore by specifying `--keystore path/to/your/keystore` when running Clef.* -#./signer attest 2a0cb661dacfc804b6e95d935d813fd17c0997a7170e4092ffbc34ca976acd9f +Attest the new rule file so that Clef will accept loading it: -INFO [02-21|14:36:30] Ruleset attestation updated sha256=2a0cb661dacfc804b6e95d935d813fd17c0997a7170e4092ffbc34ca976acd9f +```text +$ sha256sum rules.js +f163a1738b649259bb9b369c593fdc4c6b6f86cc87e343c3ba58faee03c2a178 rules.js + +$ clef attest f163a1738b649259bb9b369c593fdc4c6b6f86cc87e343c3ba58faee03c2a178 +Decrypt master seed of clef +Passphrase: +INFO [07-01|14:11:28.509] Ruleset attestation updated sha256=f163a1738b649259bb9b369c593fdc4c6b6f86cc87e343c3ba58faee03c2a178 ``` -And start the signer: +Restart Clef with the new rules in place: ``` -#./signer --rules rules.js --rpc - -INFO [09-25|21:02:16.450] Using CLI as UI-channel -INFO [09-25|21:02:16.466] Loaded 4byte db signatures=5509 file=./4byte.json -INFO [09-25|21:02:16.467] Rule engine configured file=./rules.js -DEBUG[09-25|21:02:16.468] FS scan times list=1.45262ms set=21.926µs diff=6.944µs -DEBUG[09-25|21:02:16.473] Ledger support enabled -DEBUG[09-25|21:02:16.475] Trezor support enabled -INFO [09-25|21:02:16.476] Audit logs configured file=audit.log -DEBUG[09-25|21:02:16.476] HTTP registered namespace=account -INFO [09-25|21:02:16.478] HTTP endpoint opened url=http://localhost:8550 -DEBUG[09-25|21:02:16.478] IPC registered namespace=account -INFO [09-25|21:02:16.478] IPC endpoint opened url= +$ clef --keystore ~/.ethereum/rinkeby/keystore --chainid 4 --rules rules.js + +INFO [07-01|14:12:41.636] Rule engine configured file=rules.js +INFO [07-01|14:12:41.636] Starting signer chainid=4 keystore=$HOME/.ethereum/rinkeby/keystore light-kdf=false advanced=false +DEBUG[07-01|14:12:41.636] FS scan times list=46.722µs set=4.47µs diff=2.157µs +DEBUG[07-01|14:12:41.637] Ledger support enabled +DEBUG[07-01|14:12:41.637] Trezor support enabled via HID +DEBUG[07-01|14:12:41.638] Trezor support enabled via WebUSB +INFO [07-01|14:12:41.638] Audit logs configured file=audit.log +DEBUG[07-01|14:12:41.638] IPC registered namespace=account +INFO [07-01|14:12:41.638] IPC endpoint opened url=$HOME/.clef/clef.ipc ------- Signer info ------- -* extapi_version : 2.0.0 -* intapi_version : 2.0.0 -* extapi_http : http://localhost:8550 -* extapi_ipc : +* intapi_version : 7.0.0 +* extapi_version : 6.0.0 +* extapi_http : n/a +* extapi_ipc : $HOME/.clef/clef.ipc ``` -And then test signing, once with `bazonk` and once without: +Then test signing, once with `bazonk` and once without: ``` -#curl -H "Content-Type: application/json" -X POST --data "{\"jsonrpc\":\"2.0\",\"method\":\"account_sign\",\"params\":[\"0x694267f14675d7e1b9494fd8d72fefe1755710fa\",\"0x$(xxd -pu <<< ' bazonk baz gaz')\"],\"id\":67}" http://localhost:8550/ -{"jsonrpc":"2.0","id":67,"result":"0x93e6161840c3ae1efc26dc68dedab6e8fc233bb3fefa1b4645dbf6609b93dace160572ea4ab33240256bb6d3dadb60dcd9c515d6374d3cf614ee897408d41d541c"} - -#curl -H "Content-Type: application/json" -X POST --data "{\"jsonrpc\":\"2.0\",\"method\":\"account_sign\",\"params\":[\"0x694267f14675d7e1b9494fd8d72fefe1755710fa\",\"0x$(xxd -pu <<< ' bonk baz gaz')\"],\"id\":67}" http://localhost:8550/ -{"jsonrpc":"2.0","id":67,"error":{"code":-32000,"message":"Request denied"}} +$ echo '{"id": 1, "jsonrpc":"2.0", "method":"account_signData", "params":["data/plain", "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3", "0x202062617a6f6e6b2062617a2067617a0a"]}' | nc -U ~/.clef/clef.ipc +{"jsonrpc":"2.0","id":1,"result":"0x4f93e3457027f6be99b06b3392d0ebc60615ba448bb7544687ef1248dea4f5317f789002df783979c417d969836b6fda3710f5bffb296b4d51c8aaae6e2ac4831c"} +$ echo '{"id": 1, "jsonrpc":"2.0", "method":"account_signData", "params":["data/plain", "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3", "0x2020626f6e6b2062617a2067617a0a"]}' | nc -U ~/.clef/clef.ipc +{"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"Request denied"}} ``` -Meanwhile, in the signer output: +Meanwhile, in the Clef output log you can see: ```text INFO [02-21|14:42:41] Op approved INFO [02-21|14:42:56] Op rejected @@ -203,9 +281,73 @@ INFO [02-21|14:42:56] Op rejected The signer also stores all traffic over the external API in a log file. The last 4 lines shows the two requests and their responses: ```text -#tail -n 4 audit.log -t=2018-02-21T14:42:41+0100 lvl=info msg=Sign api=signer type=request metadata="{\"remote\":\"127.0.0.1:49706\",\"local\":\"localhost:8550\",\"scheme\":\"HTTP/1.1\"}" addr="0x694267f14675d7e1b9494fd8d72fefe1755710fa [chksum INVALID]" data=202062617a6f6e6b2062617a2067617a0a -t=2018-02-21T14:42:42+0100 lvl=info msg=Sign api=signer type=response data=93e6161840c3ae1efc26dc68dedab6e8fc233bb3fefa1b4645dbf6609b93dace160572ea4ab33240256bb6d3dadb60dcd9c515d6374d3cf614ee897408d41d541c error=nil -t=2018-02-21T14:42:56+0100 lvl=info msg=Sign api=signer type=request metadata="{\"remote\":\"127.0.0.1:49708\",\"local\":\"localhost:8550\",\"scheme\":\"HTTP/1.1\"}" addr="0x694267f14675d7e1b9494fd8d72fefe1755710fa [chksum INVALID]" data=2020626f6e6b2062617a2067617a0a -t=2018-02-21T14:42:56+0100 lvl=info msg=Sign api=signer type=response data= error="Request denied" -``` \ No newline at end of file +$ tail -n 4 audit.log +t=2019-07-01T15:52:14+0300 lvl=info msg=SignData api=signer type=request metadata="{\"remote\":\"NA\",\"local\":\"NA\",\"scheme\":\"NA\",\"User-Agent\":\"\",\"Origin\":\"\"}" addr="0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 [chksum INVALID]" data=0x202062617a6f6e6b2062617a2067617a0a content-type=data/plain +t=2019-07-01T15:52:14+0300 lvl=info msg=SignData api=signer type=response data=4f93e3457027f6be99b06b3392d0ebc60615ba448bb7544687ef1248dea4f5317f789002df783979c417d969836b6fda3710f5bffb296b4d51c8aaae6e2ac4831c error=nil +t=2019-07-01T15:52:23+0300 lvl=info msg=SignData api=signer type=request metadata="{\"remote\":\"NA\",\"local\":\"NA\",\"scheme\":\"NA\",\"User-Agent\":\"\",\"Origin\":\"\"}" addr="0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 [chksum INVALID]" data=0x2020626f6e6b2062617a2067617a0a content-type=data/plain +t=2019-07-01T15:52:23+0300 lvl=info msg=SignData api=signer type=response data= error="Request denied" +``` + +For more details on writing automatic rules, please see the [rules spec](https://github.com/ethereum/go-ethereum/blob/master/cmd/clef/rules.md). + +## Geth integration + +Of course, as awesome as Clef is, it's not feasible to interact with it via JSON RPC by hand. Long term, we're hoping to convince the general Ethereum community to support Clef as a general signer (it's only 3-5 methods), thus allowing your favorite DApp, Metamask, MyCrypto, etc to request signatures directly. + +Until then however, we're trying to pave the way via Geth. Geth v1.9.0 has built in support via `--signer ` for using a local or remote Clef instance as an account backend! + +We can try this by running Clef with our previous rules on Rinkeby (for now it's a good idea to allow auto-listing accounts, since Geth likes to retrieve them once in a while). + +```text +$ clef --keystore ~/.ethereum/rinkeby/keystore --chainid 4 --rules rules.js +``` + +In a different window we can start Geth, list our accounts, even list our wallets to see where the accounts originate from: + +```text +$ geth --rinkeby --signer=~/.clef/clef.ipc console + +> eth.accounts +["0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3", "0x086278a6c067775f71d6b2bb1856db6e28c30418"] + +> personal.listWallets +[{ + accounts: [{ + address: "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3", + url: "extapi://$HOME/.clef/clef.ipc" + }, { + address: "0x086278a6c067775f71d6b2bb1856db6e28c30418", + url: "extapi://$HOME/.clef/clef.ipc" + }], + status: "ok [version=6.0.0]", + url: "extapi://$HOME/.clef/clef.ipc" +}] + +> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[0]}) +``` + +Lastly, when we requested a transaction to be sent, Clef prompted us in the original window to approve it: + +```text +--------- Transaction request------------- +to: 0xD9C9Cd5f6779558b6e0eD4e6Acf6b1947E7fA1F3 +from: 0xD9C9Cd5f6779558b6e0eD4e6Acf6b1947E7fA1F3 [chksum ok] +value: 0 wei +gas: 0x5208 (21000) +gasprice: 1000000000 wei +nonce: 0x2366 (9062) + +Request context: + NA -> NA -> NA + +Additional HTTP header data, provided by the external caller: + User-Agent: + Origin: +------------------------------------------- +Approve? [y/N]: +> y +``` + +:boom: + +*Note, if you enable the external signer backend in Geth, all other account management is disabled. This is because long term we want to remove account management from Geth.* diff --git a/cmd/devp2p/discv4cmd.go b/cmd/devp2p/discv4cmd.go new file mode 100644 index 000000000000..1e56687a6c78 --- /dev/null +++ b/cmd/devp2p/discv4cmd.go @@ -0,0 +1,166 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "fmt" + "net" + "sort" + "strings" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "gopkg.in/urfave/cli.v1" +) + +var ( + discv4Command = cli.Command{ + Name: "discv4", + Usage: "Node Discovery v4 tools", + Subcommands: []cli.Command{ + discv4PingCommand, + discv4RequestRecordCommand, + discv4ResolveCommand, + }, + } + discv4PingCommand = cli.Command{ + Name: "ping", + Usage: "Sends ping to a node", + Action: discv4Ping, + } + discv4RequestRecordCommand = cli.Command{ + Name: "requestenr", + Usage: "Requests a node record using EIP-868 enrRequest", + Action: discv4RequestRecord, + } + discv4ResolveCommand = cli.Command{ + Name: "resolve", + Usage: "Finds a node in the DHT", + Action: discv4Resolve, + Flags: []cli.Flag{bootnodesFlag}, + } +) + +var bootnodesFlag = cli.StringFlag{ + Name: "bootnodes", + Usage: "Comma separated nodes used for bootstrapping", +} + +func discv4Ping(ctx *cli.Context) error { + n, disc, err := getNodeArgAndStartV4(ctx) + if err != nil { + return err + } + defer disc.Close() + + start := time.Now() + if err := disc.Ping(n); err != nil { + return fmt.Errorf("node didn't respond: %v", err) + } + fmt.Printf("node responded to ping (RTT %v).\n", time.Since(start)) + return nil +} + +func discv4RequestRecord(ctx *cli.Context) error { + n, disc, err := getNodeArgAndStartV4(ctx) + if err != nil { + return err + } + defer disc.Close() + + respN, err := disc.RequestENR(n) + if err != nil { + return fmt.Errorf("can't retrieve record: %v", err) + } + fmt.Println(respN.String()) + return nil +} + +func discv4Resolve(ctx *cli.Context) error { + n, disc, err := getNodeArgAndStartV4(ctx) + if err != nil { + return err + } + defer disc.Close() + + fmt.Println(disc.Resolve(n).String()) + return nil +} + +func getNodeArgAndStartV4(ctx *cli.Context) (*enode.Node, *discover.UDPv4, error) { + if ctx.NArg() != 1 { + return nil, nil, fmt.Errorf("missing node as command-line argument") + } + n, err := parseNode(ctx.Args()[0]) + if err != nil { + return nil, nil, err + } + var bootnodes []*enode.Node + if commandHasFlag(ctx, bootnodesFlag) { + bootnodes, err = parseBootnodes(ctx) + if err != nil { + return nil, nil, err + } + } + disc, err := startV4(bootnodes) + return n, disc, err +} + +func parseBootnodes(ctx *cli.Context) ([]*enode.Node, error) { + s := params.RinkebyBootnodes + if ctx.IsSet(bootnodesFlag.Name) { + s = strings.Split(ctx.String(bootnodesFlag.Name), ",") + } + nodes := make([]*enode.Node, len(s)) + var err error + for i, record := range s { + nodes[i], err = parseNode(record) + if err != nil { + return nil, fmt.Errorf("invalid bootstrap node: %v", err) + } + } + return nodes, nil +} + +// commandHasFlag returns true if the current command supports the given flag. +func commandHasFlag(ctx *cli.Context, flag cli.Flag) bool { + flags := ctx.FlagNames() + sort.Strings(flags) + i := sort.SearchStrings(flags, flag.GetName()) + return i != len(flags) && flags[i] == flag.GetName() +} + +// startV4 starts an ephemeral discovery V4 node. +func startV4(bootnodes []*enode.Node) (*discover.UDPv4, error) { + var cfg discover.Config + cfg.Bootnodes = bootnodes + cfg.PrivateKey, _ = crypto.GenerateKey() + db, _ := enode.OpenDB("") + ln := enode.NewLocalNode(db, cfg.PrivateKey) + + socket, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IP{0, 0, 0, 0}}) + if err != nil { + return nil, err + } + addr := socket.LocalAddr().(*net.UDPAddr) + ln.SetFallbackIP(net.IP{127, 0, 0, 1}) + ln.SetFallbackUDP(addr.Port) + return discover.ListenUDP(socket, ln, cfg) +} diff --git a/cmd/devp2p/enrcmd.go b/cmd/devp2p/enrcmd.go new file mode 100644 index 000000000000..15d77dd011a8 --- /dev/null +++ b/cmd/devp2p/enrcmd.go @@ -0,0 +1,198 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "bytes" + "encoding/base64" + "encoding/hex" + "fmt" + "io/ioutil" + "net" + "os" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" + "gopkg.in/urfave/cli.v1" +) + +var enrdumpCommand = cli.Command{ + Name: "enrdump", + Usage: "Pretty-prints node records", + Action: enrdump, + Flags: []cli.Flag{ + cli.StringFlag{Name: "file"}, + }, +} + +func enrdump(ctx *cli.Context) error { + var source string + if file := ctx.String("file"); file != "" { + if ctx.NArg() != 0 { + return fmt.Errorf("can't dump record from command-line argument in -file mode") + } + var b []byte + var err error + if file == "-" { + b, err = ioutil.ReadAll(os.Stdin) + } else { + b, err = ioutil.ReadFile(file) + } + if err != nil { + return err + } + source = string(b) + } else if ctx.NArg() == 1 { + source = ctx.Args()[0] + } else { + return fmt.Errorf("need record as argument") + } + + r, err := parseRecord(source) + if err != nil { + return fmt.Errorf("INVALID: %v", err) + } + fmt.Print(dumpRecord(r)) + return nil +} + +// dumpRecord creates a human-readable description of the given node record. +func dumpRecord(r *enr.Record) string { + out := new(bytes.Buffer) + if n, err := enode.New(enode.ValidSchemes, r); err != nil { + fmt.Fprintf(out, "INVALID: %v\n", err) + } else { + fmt.Fprintf(out, "Node ID: %v\n", n.ID()) + } + kv := r.AppendElements(nil)[1:] + fmt.Fprintf(out, "Record has sequence number %d and %d key/value pairs.\n", r.Seq(), len(kv)/2) + fmt.Fprint(out, dumpRecordKV(kv, 2)) + return out.String() +} + +func dumpRecordKV(kv []interface{}, indent int) string { + // Determine the longest key name for alignment. + var out string + var longestKey = 0 + for i := 0; i < len(kv); i += 2 { + key := kv[i].(string) + if len(key) > longestKey { + longestKey = len(key) + } + } + // Print the keys, invoking formatters for known keys. + for i := 0; i < len(kv); i += 2 { + key := kv[i].(string) + val := kv[i+1].(rlp.RawValue) + pad := longestKey - len(key) + out += strings.Repeat(" ", indent) + strconv.Quote(key) + strings.Repeat(" ", pad+1) + formatter := attrFormatters[key] + if formatter == nil { + formatter = formatAttrRaw + } + fmtval, ok := formatter(val) + if ok { + out += fmtval + "\n" + } else { + out += hex.EncodeToString(val) + " (!)\n" + } + } + return out +} + +// parseNode parses a node record and verifies its signature. +func parseNode(source string) (*enode.Node, error) { + if strings.HasPrefix(source, "enode://") { + return enode.ParseV4(source) + } + r, err := parseRecord(source) + if err != nil { + return nil, err + } + return enode.New(enode.ValidSchemes, r) +} + +// parseRecord parses a node record from hex, base64, or raw binary input. +func parseRecord(source string) (*enr.Record, error) { + bin := []byte(source) + if d, ok := decodeRecordHex(bytes.TrimSpace(bin)); ok { + bin = d + } else if d, ok := decodeRecordBase64(bytes.TrimSpace(bin)); ok { + bin = d + } + var r enr.Record + err := rlp.DecodeBytes(bin, &r) + return &r, err +} + +func decodeRecordHex(b []byte) ([]byte, bool) { + if bytes.HasPrefix(b, []byte("0x")) { + b = b[2:] + } + dec := make([]byte, hex.DecodedLen(len(b))) + _, err := hex.Decode(dec, b) + return dec, err == nil +} + +func decodeRecordBase64(b []byte) ([]byte, bool) { + if bytes.HasPrefix(b, []byte("enr:")) { + b = b[4:] + } + dec := make([]byte, base64.RawURLEncoding.DecodedLen(len(b))) + n, err := base64.RawURLEncoding.Decode(dec, b) + return dec[:n], err == nil +} + +// attrFormatters contains formatting functions for well-known ENR keys. +var attrFormatters = map[string]func(rlp.RawValue) (string, bool){ + "id": formatAttrString, + "ip": formatAttrIP, + "ip6": formatAttrIP, + "tcp": formatAttrUint, + "tcp6": formatAttrUint, + "udp": formatAttrUint, + "udp6": formatAttrUint, +} + +func formatAttrRaw(v rlp.RawValue) (string, bool) { + s := hex.EncodeToString(v) + return s, true +} + +func formatAttrString(v rlp.RawValue) (string, bool) { + content, _, err := rlp.SplitString(v) + return strconv.Quote(string(content)), err == nil +} + +func formatAttrIP(v rlp.RawValue) (string, bool) { + content, _, err := rlp.SplitString(v) + if err != nil || len(content) != 4 && len(content) != 6 { + return "", false + } + return net.IP(content).String(), true +} + +func formatAttrUint(v rlp.RawValue) (string, bool) { + var x uint64 + if err := rlp.DecodeBytes(v, &x); err != nil { + return "", false + } + return strconv.FormatUint(x, 10), true +} diff --git a/cmd/devp2p/main.go b/cmd/devp2p/main.go new file mode 100644 index 000000000000..4532ab968372 --- /dev/null +++ b/cmd/devp2p/main.go @@ -0,0 +1,68 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/ethereum/go-ethereum/internal/debug" + "github.com/ethereum/go-ethereum/params" + "gopkg.in/urfave/cli.v1" +) + +var ( + // Git information set by linker when building with ci.go. + gitCommit string + gitDate string + app = &cli.App{ + Name: filepath.Base(os.Args[0]), + Usage: "go-ethereum devp2p tool", + Version: params.VersionWithCommit(gitCommit, gitDate), + Writer: os.Stdout, + HideVersion: true, + } +) + +func init() { + // Set up the CLI app. + app.Flags = append(app.Flags, debug.Flags...) + app.Before = func(ctx *cli.Context) error { + return debug.Setup(ctx, "") + } + app.After = func(ctx *cli.Context) error { + debug.Exit() + return nil + } + app.CommandNotFound = func(ctx *cli.Context, cmd string) { + fmt.Fprintf(os.Stderr, "No such command: %s\n", cmd) + os.Exit(1) + } + // Add subcommands. + app.Commands = []cli.Command{ + enrdumpCommand, + discv4Command, + } +} + +func main() { + if err := app.Run(os.Args); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/cmd/ethkey/changepassphrase.go b/cmd/ethkey/changepassphrase.go index d1ae2ae0d89b..5d8e8af64872 100644 --- a/cmd/ethkey/changepassphrase.go +++ b/cmd/ethkey/changepassphrase.go @@ -1,3 +1,19 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + package main import ( diff --git a/cmd/ethkey/main.go b/cmd/ethkey/main.go index c434da0c05e2..a8399ad7c565 100644 --- a/cmd/ethkey/main.go +++ b/cmd/ethkey/main.go @@ -30,11 +30,12 @@ const ( // Git SHA1 commit hash of the release (set via linker flags) var gitCommit = "" +var gitDate = "" var app *cli.App func init() { - app = utils.NewApp(gitCommit, "an Ethereum key manager") + app = utils.NewApp(gitCommit, gitDate, "an Ethereum key manager") app.Commands = []cli.Command{ commandGenerate, commandInspect, diff --git a/cmd/evm/internal/compiler/compiler.go b/cmd/evm/internal/compiler/compiler.go index 753ca62264ef..54981b669768 100644 --- a/cmd/evm/internal/compiler/compiler.go +++ b/cmd/evm/internal/compiler/compiler.go @@ -25,7 +25,7 @@ import ( func Compile(fn string, src []byte, debug bool) (string, error) { compiler := asm.NewCompiler(debug) - compiler.Feed(asm.Lex(fn, src, debug)) + compiler.Feed(asm.Lex(src, debug)) bin, compileErrors := compiler.Compile() if len(compileErrors) > 0 { diff --git a/cmd/evm/json_logger.go b/cmd/evm/json_logger.go deleted file mode 100644 index f16424fbe621..000000000000 --- a/cmd/evm/json_logger.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "encoding/json" - "io" - "math/big" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core/vm" -) - -type JSONLogger struct { - encoder *json.Encoder - cfg *vm.LogConfig -} - -// NewJSONLogger creates a new EVM tracer that prints execution steps as JSON objects -// into the provided stream. -func NewJSONLogger(cfg *vm.LogConfig, writer io.Writer) *JSONLogger { - return &JSONLogger{json.NewEncoder(writer), cfg} -} - -func (l *JSONLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error { - return nil -} - -// CaptureState outputs state information on the logger. -func (l *JSONLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error { - log := vm.StructLog{ - Pc: pc, - Op: op, - Gas: gas, - GasCost: cost, - MemorySize: memory.Len(), - Storage: nil, - Depth: depth, - Err: err, - } - if !l.cfg.DisableMemory { - log.Memory = memory.Data() - } - if !l.cfg.DisableStack { - log.Stack = stack.Data() - } - return l.encoder.Encode(log) -} - -// CaptureFault outputs state information on the logger. -func (l *JSONLogger) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error { - return nil -} - -// CaptureEnd is triggered at end of execution. -func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { - type endLog struct { - Output string `json:"output"` - GasUsed math.HexOrDecimal64 `json:"gasUsed"` - Time time.Duration `json:"time"` - Err string `json:"error,omitempty"` - } - if err != nil { - return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, err.Error()}) - } - return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, ""}) -} diff --git a/cmd/evm/main.go b/cmd/evm/main.go index a59cb1fb8430..a5159c6b7ee4 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -27,9 +27,10 @@ import ( ) var gitCommit = "" // Git SHA1 commit hash of the release (set via linker flags) +var gitDate = "" var ( - app = utils.NewApp(gitCommit, "the evm command line interface") + app = utils.NewApp(gitCommit, gitDate, "the evm command line interface") DebugFlag = cli.BoolFlag{ Name: "debug", @@ -110,6 +111,11 @@ var ( Name: "nostack", Usage: "disable stack output", } + EVMInterpreterFlag = cli.StringFlag{ + Name: "vm.evm", + Usage: "External EVM configuration (default = built-in interpreter)", + Value: "", + } ) func init() { @@ -133,6 +139,7 @@ func init() { ReceiverFlag, DisableMemoryFlag, DisableStackFlag, + EVMInterpreterFlag, } app.Commands = []cli.Command{ compileCommand, diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go index 962fc021d756..318aa222a33a 100644 --- a/cmd/evm/runner.go +++ b/cmd/evm/runner.go @@ -17,7 +17,6 @@ package main import ( - "bytes" "encoding/json" "fmt" "io/ioutil" @@ -31,10 +30,10 @@ import ( "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/core/vm/runtime" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" cli "gopkg.in/urfave/cli.v1" @@ -89,7 +88,7 @@ func runCmd(ctx *cli.Context) error { genesisConfig *core.Genesis ) if ctx.GlobalBool(MachineFlag.Name) { - tracer = NewJSONLogger(logconfig, os.Stdout) + tracer = vm.NewJSONLogger(logconfig, os.Stdout) } else if ctx.GlobalBool(DebugFlag.Name) { debugLogger = vm.NewStructLogger(logconfig) tracer = debugLogger @@ -99,12 +98,12 @@ func runCmd(ctx *cli.Context) error { if ctx.GlobalString(GenesisFlag.Name) != "" { gen := readGenesis(ctx.GlobalString(GenesisFlag.Name)) genesisConfig = gen - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := gen.ToBlock(db) statedb, _ = state.New(genesis.Root(), state.NewDatabase(db)) chainConfig = gen.Config } else { - statedb, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) genesisConfig = new(core.Genesis) } if ctx.GlobalString(SenderFlag.Name) != "" { @@ -121,28 +120,36 @@ func runCmd(ctx *cli.Context) error { ret []byte err error ) + codeFileFlag := ctx.GlobalString(CodeFileFlag.Name) + codeFlag := ctx.GlobalString(CodeFlag.Name) + // The '--code' or '--codefile' flag overrides code in state - if ctx.GlobalString(CodeFileFlag.Name) != "" { + if codeFileFlag != "" || codeFlag != "" { var hexcode []byte - var err error - // If - is specified, it means that code comes from stdin - if ctx.GlobalString(CodeFileFlag.Name) == "-" { - //Try reading from stdin - if hexcode, err = ioutil.ReadAll(os.Stdin); err != nil { - fmt.Printf("Could not load code from stdin: %v\n", err) - os.Exit(1) + if codeFileFlag != "" { + var err error + // If - is specified, it means that code comes from stdin + if codeFileFlag == "-" { + //Try reading from stdin + if hexcode, err = ioutil.ReadAll(os.Stdin); err != nil { + fmt.Printf("Could not load code from stdin: %v\n", err) + os.Exit(1) + } + } else { + // Codefile with hex assembly + if hexcode, err = ioutil.ReadFile(codeFileFlag); err != nil { + fmt.Printf("Could not load code from file: %v\n", err) + os.Exit(1) + } } } else { - // Codefile with hex assembly - if hexcode, err = ioutil.ReadFile(ctx.GlobalString(CodeFileFlag.Name)); err != nil { - fmt.Printf("Could not load code from file: %v\n", err) - os.Exit(1) - } + hexcode = []byte(codeFlag) } - code = common.Hex2Bytes(string(bytes.TrimRight(hexcode, "\n"))) - - } else if ctx.GlobalString(CodeFlag.Name) != "" { - code = common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name)) + if len(hexcode)%2 != 0 { + fmt.Printf("Invalid input length for hex data (%d)\n", len(hexcode)) + os.Exit(1) + } + code = common.FromHex(string(hexcode)) } else if fn := ctx.Args().First(); len(fn) > 0 { // EASM-file to compile src, err := ioutil.ReadFile(fn) @@ -155,7 +162,6 @@ func runCmd(ctx *cli.Context) error { } code = common.Hex2Bytes(bin) } - initialGas := ctx.GlobalUint64(GasFlag.Name) if genesisConfig.GasLimit != 0 { initialGas = genesisConfig.GasLimit @@ -171,8 +177,9 @@ func runCmd(ctx *cli.Context) error { Coinbase: genesisConfig.Coinbase, BlockNumber: new(big.Int).SetUint64(genesisConfig.Number), EVMConfig: vm.Config{ - Tracer: tracer, - Debug: ctx.GlobalBool(DebugFlag.Name) || ctx.GlobalBool(MachineFlag.Name), + Tracer: tracer, + Debug: ctx.GlobalBool(DebugFlag.Name) || ctx.GlobalBool(MachineFlag.Name), + EVMInterpreter: ctx.GlobalString(EVMInterpreterFlag.Name), }, } @@ -206,8 +213,9 @@ func runCmd(ctx *cli.Context) error { execTime := time.Since(tstart) if ctx.GlobalBool(DumpFlag.Name) { + statedb.Commit(true) statedb.IntermediateRoot(true) - fmt.Println(string(statedb.Dump())) + fmt.Println(string(statedb.Dump(false, false, true))) } if memProfilePath := ctx.GlobalString(MemProfileFlag.Name); memProfilePath != "" { diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go index 6d5ff069f6c1..cef2aedb5e68 100644 --- a/cmd/evm/staterunner.go +++ b/cmd/evm/staterunner.go @@ -68,7 +68,7 @@ func stateTestCmd(ctx *cli.Context) error { ) switch { case ctx.GlobalBool(MachineFlag.Name): - tracer = NewJSONLogger(config, os.Stderr) + tracer = vm.NewJSONLogger(config, os.Stderr) case ctx.GlobalBool(DebugFlag.Name): debugger = vm.NewStructLogger(config) @@ -97,18 +97,18 @@ func stateTestCmd(ctx *cli.Context) error { // Run the test and aggregate the result result := &StatetestResult{Name: key, Fork: st.Fork, Pass: true} state, err := test.Run(st, cfg) + // print state root for evmlab tracing + if ctx.GlobalBool(MachineFlag.Name) && state != nil { + fmt.Fprintf(os.Stderr, "{\"stateRoot\": \"%x\"}\n", state.IntermediateRoot(false)) + } if err != nil { // Test failed, mark as so and dump any state to aid debugging result.Pass, result.Error = false, err.Error() if ctx.GlobalBool(DumpFlag.Name) && state != nil { - dump := state.RawDump() + dump := state.RawDump(false, false, true) result.State = &dump } } - // print state root for evmlab tracing (already committed above, so no need to delete objects again - if ctx.GlobalBool(MachineFlag.Name) && state != nil { - fmt.Fprintf(os.Stderr, "{\"stateRoot\": \"%x\"}\n", state.IntermediateRoot(false)) - } results = append(results, *result) diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index 2ffe12276e4d..905eeb24a74c 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -88,6 +88,11 @@ var ( ether = new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil) ) +var ( + gitCommit = "" // Git SHA1 commit hash of the release (set via linker flags) + gitDate = "" // Git commit date YYYYMMDD of the release (set via linker flags) +) + func main() { // Parse the flags and set up the logger to print everything requested flag.Parse() @@ -216,7 +221,7 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*discv5.Node, network u // Assemble the raw devp2p protocol stack stack, err := node.New(&node.Config{ Name: "geth", - Version: params.VersionWithMeta, + Version: params.VersionWithCommit(gitCommit, gitDate), DataDir: filepath.Join(os.Getenv("HOME"), ".faucet"), P2P: p2p.Config{ NAT: nat.Any(), @@ -255,8 +260,8 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*discv5.Node, network u return nil, err } for _, boot := range enodes { - old, err := enode.ParseV4(boot.String()) - if err != nil { + old, err := enode.Parse(enode.ValidSchemes, boot.String()) + if err == nil { stack.Server().AddPeer(old) } } @@ -282,7 +287,7 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*discv5.Node, network u // close terminates the Ethereum connection and tears down the faucet. func (f *faucet) close() error { - return f.stack.Stop() + return f.stack.Close() } // listenAndServe registers the HTTP handlers for the faucet and boots it up @@ -440,10 +445,14 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { return } continue + case strings.HasPrefix(msg.URL, "https://plus.google.com/"): + if err = sendError(conn, errors.New("Google+ authentication discontinued as the service was sunset")); err != nil { + log.Warn("Failed to send Google+ deprecation to client", "err", err) + return + } + continue case strings.HasPrefix(msg.URL, "https://twitter.com/"): username, avatar, address, err = authTwitter(msg.URL) - case strings.HasPrefix(msg.URL, "https://plus.google.com/"): - username, avatar, address, err = authGooglePlus(msg.URL) case strings.HasPrefix(msg.URL, "https://www.facebook.com/"): username, avatar, address, err = authFacebook(msg.URL) case *noauthFlag: @@ -497,7 +506,10 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { Time: time.Now(), Tx: signed, }) - f.timeouts[username] = time.Now().Add(time.Duration(*minutesFlag*int(math.Pow(3, float64(msg.Tier)))) * time.Minute) + timeout := time.Duration(*minutesFlag*int(math.Pow(3, float64(msg.Tier)))) * time.Minute + grace := timeout / 288 // 24h timeout => 5m grace + + f.timeouts[username] = time.Now().Add(timeout - grace) fund = true } f.lock.Unlock() @@ -579,7 +591,7 @@ func (f *faucet) loop() { go func() { for head := range update { // New chain head arrived, query the current stats and stream to clients - timestamp := time.Unix(head.Time.Int64(), 0) + timestamp := time.Unix(int64(head.Time), 0) if time.Since(timestamp) > time.Hour { log.Warn("Skipping faucet refresh, head too old", "number", head.Number, "hash", head.Hash(), "age", common.PrettyAge(timestamp)) continue @@ -699,40 +711,6 @@ func authTwitter(url string) (string, string, common.Address, error) { return username + "@twitter", avatar, address, nil } -// authGooglePlus tries to authenticate a faucet request using GooglePlus posts, -// returning the username, avatar URL and Ethereum address to fund on success. -func authGooglePlus(url string) (string, string, common.Address, error) { - // Ensure the user specified a meaningful URL, no fancy nonsense - parts := strings.Split(url, "/") - if len(parts) < 4 || parts[len(parts)-2] != "posts" { - return "", "", common.Address{}, errors.New("Invalid Google+ post URL") - } - username := parts[len(parts)-3] - - // Google's API isn't really friendly with direct links. Still, we don't - // want to do ask read permissions from users, so just load the public posts and - // scrape it for the Ethereum address and profile URL. - res, err := http.Get(url) - if err != nil { - return "", "", common.Address{}, err - } - defer res.Body.Close() - - body, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", "", common.Address{}, err - } - address := common.HexToAddress(string(regexp.MustCompile("0x[0-9a-fA-F]{40}").Find(body))) - if address == (common.Address{}) { - return "", "", common.Address{}, errors.New("No Ethereum address found to fund") - } - var avatar string - if parts = regexp.MustCompile("src=\"([^\"]+googleusercontent.com[^\"]+photo.jpg)\"").FindStringSubmatch(string(body)); len(parts) == 2 { - avatar = parts[1] - } - return username + "@google+", avatar, address, nil -} - // authFacebook tries to authenticate a faucet request using Facebook posts, // returning the username, avatar URL and Ethereum address to fund on success. func authFacebook(url string) (string, string, common.Address, error) { diff --git a/cmd/faucet/faucet.html b/cmd/faucet/faucet.html index ab41b2c87178..314b19e1232d 100644 --- a/cmd/faucet/faucet.html +++ b/cmd/faucet/faucet.html @@ -80,14 +80,11 @@

{{

How does this work?

-

This Ether faucet is running on the {{.Network}} network. To prevent malicious actors from exhausting all available funds or accumulating enough Ether to mount long running spam attacks, requests are tied to common 3rd party social network accounts. Anyone having a Twitter, Google+ or Facebook account may request funds within the permitted limits.

+

This Ether faucet is running on the {{.Network}} network. To prevent malicious actors from exhausting all available funds or accumulating enough Ether to mount long running spam attacks, requests are tied to common 3rd party social network accounts. Anyone having a Twitter or Facebook account may request funds within the permitted limits.

To request funds via Twitter, make a tweet with your Ethereum address pasted into the contents (surrounding text doesn't matter).
Copy-paste the tweets URL into the above input box and fire away!
-
-
To request funds via Google Plus, publish a new public post with your Ethereum address embedded into the content (surrounding text doesn't matter).
Copy-paste the posts URL into the above input box and fire away!
-
To request funds via Facebook, publish a new public post with your Ethereum address embedded into the content (surrounding text doesn't matter).
Copy-paste the posts URL into the above input box and fire away!
diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index fab1d43460bf..a091d249196e 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -1,12 +1,13 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: -// faucet.html +// faucet.html (11.27kB) package main import ( "bytes" "compress/gzip" + "crypto/sha256" "fmt" "io" "io/ioutil" @@ -19,7 +20,7 @@ import ( func bindataRead(data []byte, name string) ([]byte, error) { gz, err := gzip.NewReader(bytes.NewBuffer(data)) if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %v", name, err) } var buf bytes.Buffer @@ -27,7 +28,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %v", name, err) } if clErr != nil { return nil, err @@ -37,8 +38,9 @@ func bindataRead(data []byte, name string) ([]byte, error) { } type asset struct { - bytes []byte - info os.FileInfo + bytes []byte + info os.FileInfo + digest [sha256.Size]byte } type bindataFileInfo struct { @@ -67,7 +69,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\x71\x73\xdb\xb6\x92\xff\xdb\xf9\x14\x5b\x5e\xfc\x24\x9d\x4d\x52\xb6\x93\x3c\x9f\x44\xaa\x93\x97\xd7\xd7\xcb\xcd\x5d\xdb\x69\xd3\xb9\x7b\xd3\xd7\xb9\x01\x89\x95\x88\x18\x04\x58\x00\x94\xac\x7a\xf4\xdd\x6f\x00\x90\x14\x29\xc9\x6e\xd2\xe4\xde\x34\x7f\x38\x24\xb0\xd8\x5d\xec\xfe\x16\xbb\x58\x2a\xf9\xe2\xaf\xdf\xbe\x79\xf7\xf7\xef\xbe\x82\xc2\x94\x7c\xf1\x2c\xb1\xff\x01\x27\x62\x95\x06\x28\x82\xc5\xb3\xb3\xa4\x40\x42\x17\xcf\xce\xce\x92\x12\x0d\x81\xbc\x20\x4a\xa3\x49\x83\xda\x2c\xc3\xdb\x60\x3f\x51\x18\x53\x85\xf8\x4b\xcd\xd6\x69\xf0\x3f\xe1\x8f\xaf\xc3\x37\xb2\xac\x88\x61\x19\xc7\x00\x72\x29\x0c\x0a\x93\x06\x6f\xbf\x4a\x91\xae\xb0\xb7\x4e\x90\x12\xd3\x60\xcd\x70\x53\x49\x65\x7a\xa4\x1b\x46\x4d\x91\x52\x5c\xb3\x1c\x43\xf7\x72\x09\x4c\x30\xc3\x08\x0f\x75\x4e\x38\xa6\x57\xc1\xe2\x99\xe5\x63\x98\xe1\xb8\x78\x78\x88\xbe\x41\xb3\x91\xea\x6e\xb7\x9b\xc1\xeb\xda\x14\x28\x0c\xcb\x89\x41\x0a\x7f\x23\x75\x8e\x26\x89\x3d\xa5\x5b\xc4\x99\xb8\x83\x42\xe1\x32\x0d\xac\xea\x7a\x16\xc7\x39\x15\xef\x75\x94\x73\x59\xd3\x25\x27\x0a\xa3\x5c\x96\x31\x79\x4f\xee\x63\xce\x32\x1d\x9b\x0d\x33\x06\x55\x98\x49\x69\xb4\x51\xa4\x8a\x6f\xa2\x9b\xe8\xcf\x71\xae\x75\xdc\x8d\x45\x25\x13\x51\xae\x75\x00\x0a\x79\x1a\x68\xb3\xe5\xa8\x0b\x44\x13\x40\xbc\xf8\x7d\x72\x97\x52\x98\x90\x6c\x50\xcb\x12\xe3\x17\xd1\x9f\xa3\xa9\x13\xd9\x1f\x7e\x5a\xaa\x15\xab\x73\xc5\x2a\x03\x5a\xe5\x1f\x2c\xf7\xfd\x2f\x35\xaa\x6d\x7c\x13\x5d\x45\x57\xcd\x8b\x93\xf3\x5e\x07\x8b\x24\xf6\x0c\x17\x9f\xc4\x3b\x14\xd2\x6c\xe3\xeb\xe8\x45\x74\x15\x57\x24\xbf\x23\x2b\xa4\xad\x24\x3b\x15\xb5\x83\x9f\x4d\xee\x63\x3e\x7c\x7f\xe8\xc2\xcf\x21\xac\x94\x25\x0a\x13\xbd\xd7\xf1\x75\x74\x75\x1b\x4d\xdb\x81\x63\xfe\x4e\x80\x75\x9a\x15\x75\x16\xad\x51\x59\xe4\xf2\x30\x47\x61\x50\xc1\x83\x1d\x3d\x2b\x99\x08\x0b\x64\xab\xc2\xcc\xe0\x6a\x3a\x3d\x9f\x9f\x1a\x5d\x17\x7e\x98\x32\x5d\x71\xb2\x9d\xc1\x92\xe3\xbd\x1f\x22\x9c\xad\x44\xc8\x0c\x96\x7a\x06\x9e\xb3\x9b\xd8\x39\x99\x95\x92\x2b\x85\x5a\x37\xc2\x2a\xa9\x99\x61\x52\xcc\x2c\xa2\x88\x61\x6b\x3c\x45\xab\x2b\x22\x8e\x16\x90\x4c\x4b\x5e\x1b\x3c\x50\x24\xe3\x32\xbf\xf3\x63\x2e\x9a\xfb\x9b\xc8\x25\x97\x6a\x06\x9b\x82\x35\xcb\xc0\x09\x82\x4a\x61\xc3\x1e\x2a\x42\x29\x13\xab\x19\xbc\xaa\x9a\xfd\x40\x49\xd4\x8a\x89\x19\x4c\xf7\x4b\x92\xb8\x35\x63\x12\xfb\x83\xeb\xd9\x59\x92\x49\xba\x75\x3e\xa4\x6c\x0d\x39\x27\x5a\xa7\xc1\x81\x89\xdd\x81\x34\x20\xb0\xe7\x10\x61\xa2\x9d\x1a\xcc\x29\xb9\x09\xc0\x09\x4a\x03\xaf\x44\x98\x49\x63\x64\x39\x83\x2b\xab\x5e\xb3\xe4\x80\x1f\x0f\xf9\x2a\xbc\xba\x6e\x27\xcf\x92\xe2\xaa\x65\x62\xf0\xde\x84\xce\x3f\x9d\x67\x82\x45\xc2\xda\xb5\x4b\x02\x4b\x12\x66\xc4\x14\x01\x10\xc5\x48\x58\x30\x4a\x51\xa4\x81\x51\x35\x5a\x1c\xb1\x05\xf4\x8f\xbf\x47\x4e\xbf\xe2\xaa\xd5\x2b\xa6\x6c\xdd\x6c\xab\xf7\x78\xb0\xc3\xc7\x37\x71\x0b\xcd\x83\x5c\x2e\x35\x9a\xb0\xb7\xa7\x1e\x31\x13\x55\x6d\xc2\x95\x92\x75\xd5\xcd\x9f\x25\x6e\x14\x18\x4d\x83\x5a\xf1\xa0\x39\xfe\xdd\xa3\xd9\x56\x8d\x29\x82\x6e\xe3\x52\x95\xa1\xf5\x84\x92\x3c\x80\x8a\x93\x1c\x0b\xc9\x29\xaa\x34\xf8\x41\xe6\x8c\x70\x10\x7e\xcf\xf0\xe3\xf7\xff\x09\x8d\xcb\x98\x58\xc1\x56\xd6\x0a\xbe\x32\x05\x2a\xac\x4b\x20\x94\x5a\xb8\x46\x51\xd4\x53\xc4\x61\xf7\x58\xd5\x30\x33\x62\x4f\x75\x96\x64\xb5\x31\xb2\x23\xcc\x8c\x80\xcc\x88\x90\xe2\x92\xd4\xdc\x00\x55\xb2\xa2\x72\x23\x42\x23\x57\x2b\x9b\xe9\xfc\x26\xfc\xa2\x00\x28\x31\xa4\x99\x4a\x83\x96\xb6\xf5\x21\xd1\x95\xac\xea\xaa\xf1\xa2\x1f\xc4\xfb\x8a\x08\x8a\xd4\xfa\x9c\x6b\x0c\x16\x5f\xb3\x35\x42\x89\x7e\x2f\x67\x87\x90\xc8\x89\x42\x13\xf6\x99\x1e\x01\x23\x89\xbd\x32\x7e\x4b\xd0\xfc\x4b\x6a\xde\x72\xea\xb6\x50\xa2\xa8\x61\xf0\x16\x2a\x7b\xae\x04\x8b\x87\x07\x45\xc4\x0a\xe1\x39\xa3\xf7\x97\xf0\x9c\x94\xb2\x16\x06\x66\x29\x44\xaf\xdd\xa3\xde\xed\x06\xdc\x01\x12\xce\x16\x09\x79\x0a\xde\x20\x45\xce\x59\x7e\x97\x06\x86\xa1\x4a\x1f\x1e\x2c\xf3\xdd\x6e\x0e\x0f\x0f\x6c\x09\xcf\xa3\xef\x31\x27\x95\xc9\x0b\xb2\xdb\xad\x54\xfb\x1c\xe1\x3d\xe6\xb5\xc1\xf1\xe4\xe1\x01\xb9\xc6\xdd\x4e\xd7\x59\xc9\xcc\xb8\x5d\x6e\xc7\x05\xdd\xed\xac\xce\x8d\x9e\xbb\x1d\xc4\x96\xa9\xa0\x78\x0f\xcf\xa3\xef\x50\x31\x49\x35\x78\xfa\x24\x26\x8b\x24\xe6\x6c\xd1\xac\x1b\x1a\x29\xae\xf9\x1e\x2f\xb1\x05\x4c\x87\x73\x17\x36\x4e\xd5\xbe\xa6\x27\xa2\x60\x15\x76\xda\x37\x78\xd0\xcc\xe0\x1d\x6e\xd3\xe0\xe1\xa1\xbf\xb6\x99\xcd\x09\xe7\x19\xb1\x76\xf1\x5b\xeb\x16\xfd\x8a\x16\xa7\x6b\xa6\x5d\x49\xb5\x68\x35\xd8\xab\xfd\x81\x61\x7d\x70\x70\x19\x59\xcd\xe0\xe6\xba\x77\x6a\x9d\x8a\xf8\x57\x07\x11\x7f\x73\x92\xb8\x22\x02\x39\xb8\xbf\xa1\x2e\x09\x6f\x9f\x9b\x68\xe9\x05\xdf\xe1\xa2\xd0\x9e\xd1\x9d\x6a\xdd\x59\x3f\x9d\x83\x5c\xa3\x5a\x72\xb9\x99\x01\xa9\x8d\x9c\x43\x49\xee\xbb\x7c\x77\x33\x9d\xf6\xf5\xb6\xa5\x20\xc9\x38\xba\xd3\x45\xe1\x2f\x35\x6a\xa3\xbb\xb3\xc4\x4f\xb9\xbf\xf6\x48\xa1\x28\x34\xd2\x03\x6b\x58\x89\xd6\xb4\x8e\xaa\xe7\xfa\xce\x98\x27\x75\x5f\x4a\xd9\xa5\x90\xbe\x1a\x0d\xeb\x5e\xb6\x0b\x16\x89\x51\x7b\xba\xb3\xc4\xd0\x8f\x4a\x01\xca\x96\x78\x8f\x65\x00\x7f\xa2\xd9\xbd\x57\x88\xca\xd7\x17\x16\xb2\xe0\x5e\x93\xd8\xd0\x4f\x90\x6c\x41\x98\x11\x8d\x1f\x22\xde\x65\xfa\xbd\x78\xf7\xfa\xa9\xf2\x0b\x24\xca\x64\x48\xcc\x87\x28\xb0\xac\x05\xed\xed\xdf\x9d\x9d\x9f\xaa\x40\x2d\xd8\x1a\x95\x66\x66\xfb\xa1\x1a\x20\xdd\xab\xe0\xdf\x87\x2a\x24\xb1\x51\x4f\x63\xad\xff\xf2\x99\x82\xfb\xb7\x4a\x92\x9b\xc5\xbf\xcb\x0d\x50\x89\x1a\x4c\xc1\x34\xd8\xe4\xfa\x65\x12\x17\x37\x1d\x49\xb5\x78\x67\x27\x9c\x51\x61\xe9\x4a\x0b\x60\x1a\x54\x2d\x5c\xe6\x95\x02\x4c\x81\xc3\x72\xa4\x49\xd2\x11\xbc\x93\xb6\xa4\x5b\xa3\x30\x50\x12\xce\x72\x26\x6b\x0d\x24\x37\x52\x69\x58\x2a\x59\x02\xde\x17\xa4\xd6\xc6\x32\xb2\xc7\x07\x59\x13\xc6\x5d\x2c\x39\x97\x82\x54\x40\xf2\xbc\x2e\x6b\x5b\x92\x8a\x15\xa0\x90\xf5\xaa\x68\x74\x31\x12\x7c\x62\xe2\x52\xac\x3a\x7d\x74\x45\x4a\x20\xc6\x90\xfc\x4e\x5f\x42\x7b\x2a\x00\x51\x08\x86\x21\xb5\xab\x72\x59\x96\x52\xc0\x8d\xa2\x50\x11\x65\xb6\xa0\x87\xb5\x05\xc9\x73\x97\xe5\x22\x78\x2d\xb6\x52\x20\x14\x64\xed\x34\x84\x77\xfe\x3a\x71\x09\x5f\x4b\xb9\xe2\x78\x61\x15\xfc\x1b\xc9\x31\x93\xb2\x5b\x06\x25\xd9\xb6\x72\x9b\x6d\x6c\x98\x29\x98\xb7\x53\x85\xaa\xb4\x3c\x28\x70\x56\x32\xa3\xa3\x24\xae\xf6\x47\xeb\x3e\x49\xf3\xb0\x90\x8a\xfd\x6a\x2b\x1c\xde\x3f\x47\xcd\xc1\x29\xd3\x1e\x92\xce\xfd\x1c\x97\x66\x06\x2f\xfc\x21\x79\x08\xe8\xe6\x2a\x74\x0a\xcd\x2d\x4f\x77\xc5\xb4\x99\x67\x06\x37\xbe\xae\xf5\x15\x05\x35\x3d\x0d\xe8\x01\xe6\xbc\xd0\xdb\xdb\xea\xbe\xd3\xa3\x2b\x8e\xa7\x1d\x13\x0b\x85\xa1\x51\xd6\xac\x67\xcf\x92\xdc\x21\x10\x48\xc8\xc1\x55\xb9\x51\xda\x5d\xb4\x98\x6b\x14\xc4\x66\x83\x68\xbe\xb4\x31\x9c\x7e\xef\x19\x32\xb1\x3a\xbf\x9e\x7a\x68\xda\x07\xcb\xfe\xfc\x7a\xca\x84\x91\xe7\xd7\xd3\xe9\xfd\xf4\x03\xff\x9d\x5f\x4f\xa5\x38\xbf\x9e\x9a\x02\xcf\xaf\xa7\xe7\xd7\x37\x7d\x50\xfb\x91\xb6\xc4\xb4\x54\xa8\xad\xb4\x16\xeb\x01\x18\xa2\x56\x68\xd2\xe0\x7f\x49\x26\x6b\x33\xcb\x38\x11\x77\xc1\xc2\xa9\x6b\xcb\x0e\x87\x82\xd3\x85\x2a\x54\x44\x5b\x48\x58\x8d\x1d\x4a\x9a\xa6\x88\x86\xb1\xae\x95\x92\xb5\xb0\xe9\x11\xec\x9e\x5d\xa8\x8a\x91\x45\x99\x35\xcc\x24\x4a\x32\x15\x2f\xde\xc8\x6a\x1b\x3a\x26\x6e\xf9\x91\x19\x75\x5d\x55\x52\x99\xa8\x6f\x4e\x62\x2f\x44\x1c\x75\x7c\x3b\x7d\x79\xfb\xea\x49\xf5\xb5\x2d\xb7\xdd\x1e\x3a\x0d\x49\x26\xd7\x08\xbe\xb8\xcf\xe4\x3d\x10\x41\x61\xc9\x14\x02\xd9\x90\xed\x17\x49\x4c\xdd\x55\xec\xd3\x51\xbb\x72\x81\x16\x56\xbc\xd6\xb6\x16\x61\x36\x50\xff\x50\x10\xf6\x27\x01\x7c\xc7\x6b\x7d\x09\x55\x9d\x71\xa6\x0b\x20\x20\x70\x03\x89\x36\x4a\x8a\xd5\xc2\x8d\xe6\xf6\xaa\xea\x5e\xa1\x92\xda\x3c\x85\x06\x2c\x33\xa4\xf4\x04\x1e\x7e\x27\x1c\xac\x3c\xe7\xc2\x7f\xbe\xfb\x96\xcd\xe1\xf8\x87\x72\x59\x7b\x62\xff\x51\xfd\x75\x14\xbe\x9b\xcd\x26\x6a\x2d\xe9\x62\xb7\x40\x5e\xc5\x36\x8d\xd5\x82\x99\x6d\xec\x4f\x41\x29\xe2\x2f\x19\x4d\xaf\x6f\xaf\x5f\xbd\xba\x7e\xf1\x6f\xb7\x2f\x5f\x5e\xdf\xbe\x78\xf9\x58\x60\x77\xa0\xf8\xfd\x71\xed\xaf\x43\xdf\xc8\xd7\xb5\x29\xba\xbb\x90\xc7\x4b\x5b\x83\xdb\x4a\x8b\xda\xbb\xa4\x0a\x7e\x37\x86\x6a\x61\x0b\xca\x90\xf0\x93\xb5\xe0\x47\xa0\xc8\xc1\xe8\x09\xcd\x3e\x11\x5a\x2d\x7c\x2c\x52\x64\x6d\xec\x0e\xdb\xa6\x0c\x93\xa2\x83\xd3\x25\x68\x56\x56\x7c\x0b\xf9\xde\xeb\xa7\x71\xf5\xa8\x53\x7e\x13\x56\x43\xb7\x79\x90\xb9\x2a\xae\x94\x14\x6d\xf5\xa6\x6b\x9d\x63\xe5\xba\xf5\xb6\x22\xfa\xcb\xf6\x57\x22\x0c\x13\xd8\x56\x4e\x11\x7c\x2b\xf8\x16\x6a\x8d\xb0\x94\x0a\x28\x66\xf5\x6a\xe5\xca\x3d\x05\x95\x62\x6b\x62\xb0\x2d\x97\x74\x83\x8a\x0e\x14\xbd\x1b\xaa\x2d\x5d\x79\xaf\x92\xfc\xbb\xac\x21\x27\x02\x8c\x22\xf9\x9d\x8f\x94\x5a\x29\x1b\x29\x15\xfa\xdd\x74\x05\x5b\x86\x5c\x6e\x1c\x89\xdf\xf7\x92\x21\x77\xd5\x9b\x46\x84\x42\x6e\xa0\xac\x73\x17\x90\xb6\x3a\x73\x9b\xd8\x10\x66\xa0\x16\x86\x71\x6f\x4f\x53\x2b\x61\x6b\x3d\x1c\x14\x59\x47\x77\xf8\x04\xcb\xc5\xbb\x02\x4f\x94\xb6\xdd\xed\x1b\x14\xbe\xf1\xe4\x50\x29\x69\x30\xb7\x0e\x05\xb2\x22\x4c\x68\xeb\x11\x57\xc6\x61\xf9\x01\xb7\xf3\xee\xa9\x79\xd8\x77\x9a\xdd\x74\x1c\xc3\xd7\x5c\x66\x84\xc3\xda\x22\x3d\xe3\xb6\x2c\x97\x50\x48\xbb\xf5\x9e\xb5\xb4\x21\xa6\xd6\x20\x97\x6e\xd4\x6b\x6e\xd7\xaf\x89\xb2\x1e\xc4\xb2\x32\x90\x36\x7d\x52\x3b\xa6\x51\xad\x9b\xee\xaf\x7d\x35\x0c\xd5\x60\xbe\xb3\x7a\x0a\x3f\xfd\x3c\x7f\xd6\xa8\xf2\x57\x5c\x3a\x48\x58\x7c\xfb\x2d\x9b\x82\x18\xc8\x15\x12\x83\x1a\x72\x2e\x75\xad\xbc\x86\x54\xc9\x0a\xac\x96\x2d\xa7\x96\xb3\x9d\xa8\x9c\xb4\x96\xc9\xb8\x20\xba\x98\x34\x6d\x5e\x85\xce\x4b\xdd\x5c\x3b\x7e\x66\x51\x37\xb6\x0c\x58\x3a\x9d\x03\x4b\x5a\xbe\x11\x47\xb1\x32\xc5\x1c\xd8\xc5\x45\x47\x7c\xc6\x96\x30\x6e\x29\x7e\x62\x3f\x47\xe6\x3e\xb2\x52\x20\x4d\xa1\x2f\xcd\x09\x6c\xf8\xe8\x8a\xb3\x1c\xc7\xec\x12\xae\x26\xf3\x76\x36\x53\x48\xee\xda\xb7\xc6\x8f\xfe\x3f\xf7\x77\x37\x1f\x5a\xc6\x19\x7f\x60\x1b\xdf\xc3\xd1\x40\x60\xc5\xb4\x81\x5a\x71\x68\x62\xd8\xbb\xa0\x73\x88\xa3\xeb\x5b\xe5\x08\x97\xcd\x43\x83\xa9\x76\x0b\x9e\x4d\xa4\x51\xd0\xf1\x7f\xfc\xf0\xed\x37\x91\x36\x8a\x89\x15\x5b\x6e\xc7\x0f\xb5\xe2\x33\x78\x3e\x0e\xfe\xa5\x56\x3c\x98\xfc\x34\xfd\x39\x5a\x13\x5e\xe3\xa5\xf3\xf7\xcc\xfd\x3d\x92\x72\x09\xcd\xe3\x0c\x86\x02\x77\x93\xc9\xfc\x74\xbf\xab\xd7\x9e\x53\xa8\xd1\x8c\x2d\x61\x07\xfc\x43\x1b\x11\x28\xd1\x14\xd2\x85\xae\xc2\x5c\x0a\x81\xb9\x81\xba\x92\xa2\x31\x09\x70\xa9\xf5\x1e\x88\x2d\x45\x7a\x0c\x8a\x86\x3e\x75\xc9\xfa\xbf\x31\xfb\x41\xe6\x77\x68\xc6\xe3\xf1\x86\x09\x2a\x37\x11\x97\xfe\xa8\x8d\x6c\x90\xca\x5c\x72\x48\xd3\x14\x9a\x2c\x1a\x4c\xe0\x4b\x08\x36\xda\xe6\xd3\x00\x66\xf6\xd1\x3e\x4d\xe0\x02\x0e\x97\x17\x36\xdf\x5f\x40\x10\x93\x8a\x05\x13\x1f\x0e\xad\xe1\xa5\x28\x51\x6b\xb2\xc2\xbe\x82\xee\x86\xdb\x81\xcc\xee\xa3\xd4\x2b\x48\xc1\x39\xa8\x22\x4a\xa3\x27\x89\x28\x31\xa4\x45\x9b\xc5\xac\x23\x4b\x53\x10\x35\xe7\x7b\x90\xfa\xa0\x98\xb7\xf0\x1b\x90\x47\x3e\xd7\x7c\x91\xa6\x50\x0b\xea\x4c\x4c\xf7\x2b\xad\xf3\x7d\x33\x64\x12\xd9\xbc\xb0\x5f\x31\x99\xf7\xd1\x3c\xe0\x86\xf4\xb7\xd8\x21\x3d\xe4\x87\xf4\x11\x86\xae\xf7\xf4\x14\x3f\xdf\xab\xea\xb1\x73\x03\x8f\x70\x13\x75\x99\xa1\x7a\x8a\x9d\xef\x3d\x35\xec\x9c\xa9\xdf\x0a\xd3\x5b\x7b\x09\x57\xaf\x26\x8f\x70\x47\xa5\xe4\xa3\xcc\x85\x34\xdb\xf1\x03\x27\x5b\x5b\x33\xc1\xc8\xc8\xea\x8d\x6b\x15\x8d\x2e\x5d\xc6\x9d\x41\xc7\xe1\xd2\x7d\x04\x98\xc1\xc8\xbd\xd9\x79\x56\xa2\x5b\xf5\x72\x3a\x9d\x5e\x42\xfb\xf5\xec\x2f\xc4\x06\xa1\xaa\x71\xf7\x88\x3e\xba\xce\x73\x9b\xf7\x3f\x45\xa3\x86\x47\xa7\x53\xf3\xfe\x09\x5a\x75\xb9\x61\xa0\x16\xfc\xe9\x4f\x70\x34\x3b\x84\x71\x1c\xc3\x7f\x11\x75\xe7\x1a\x3b\x95\xc2\xb5\x6b\xfe\x74\xf4\x25\xd3\xda\x35\x55\x34\x50\x29\xb0\x59\xf3\x71\xc7\xfe\x91\x8e\x0d\x19\x2c\x60\x7a\xa8\xa0\x3d\x0e\x7b\x69\xe1\x44\xb6\xe8\xf1\x1d\x26\x82\xb3\x5d\x5f\xde\x60\x25\x2b\x11\xbe\x48\x21\x08\xfa\x8b\x8f\x28\x2c\x41\xc7\xec\x4c\xa3\x79\xe7\x7d\x31\x6e\xb2\xe3\xa9\xdc\x35\xb9\x84\x9b\xe9\x74\x3a\x39\x52\x62\xb7\x37\xef\xeb\xca\x96\x4d\x40\xc4\xd6\x1d\x89\x9d\x6d\x5d\xe1\x68\x4b\x20\x7b\xa4\x71\xc8\x25\xe7\xbe\x66\x69\x96\x5a\x03\x37\x4d\xb0\x14\xc2\xab\xf9\x89\x2c\xda\xb3\x64\x6f\x6b\x87\xee\x39\x61\xfb\x43\x17\x0d\x6d\x76\x40\x1c\x5e\x0d\x9c\x32\xf0\xd7\x69\xc7\x9c\x75\x7a\xb3\xbd\x45\x0f\xdc\xb5\xf7\xd7\xa1\xcd\x7a\xfa\x7b\x3e\x17\x57\x1f\xb8\x8d\x6e\xba\xaa\x75\x31\x3e\x50\x74\x32\x3f\xf6\xcd\x5b\x83\xca\x56\xc9\xd2\xa6\x2c\xeb\x0b\x7b\x15\x50\x78\xe4\x12\x57\xaa\x2b\x0c\x15\x0a\x8a\xaa\x2d\x29\x7c\x65\x6f\x0b\xc0\x81\xcb\xfc\xad\xb2\x0f\xa7\x8f\x0c\x18\x57\x92\x49\x81\x00\x00\x07\x41\xe0\x80\x3a\x40\xaa\x25\x46\x4e\x2a\x8d\x14\x52\xf0\x3f\x66\x18\x4f\xa2\x5a\xb0\xfb\xf1\x24\x6c\xde\x0f\x79\xb4\xf3\xf3\xee\x9a\xd8\xaa\x7d\x91\x42\x90\x18\x05\x8c\xa6\xa3\x00\x2e\x4e\x85\xa0\xcd\xba\xa3\xc5\x5e\x83\xfe\x52\x80\xc4\xd0\x85\xeb\x67\xfb\xfb\xda\x3f\x82\x8c\xe4\x77\x2b\x77\x11\x9a\xd9\x52\x6b\x7c\xc4\x96\xac\x89\x21\xca\x71\x9d\xcc\x61\x4f\xde\x5c\x14\x73\xeb\x9c\x39\xf8\x1b\xa9\x6b\x9b\x43\xf7\xa9\xc9\xbd\x65\x52\x51\x54\xa1\x22\x94\xd5\x7a\x06\x2f\xaa\xfb\xf9\x3f\xda\x4f\x71\xae\xb9\xff\xa4\xaa\x95\xc2\xc5\x91\x46\x4d\x93\xf8\x02\x82\x24\xb6\x04\xbf\xc5\xa6\xdb\x6c\xff\x47\x14\x70\xe2\x13\x06\x74\x3f\x71\x68\xc6\x4b\x46\x29\x47\xab\xf0\x9e\xbd\x0d\x46\xeb\xff\x7e\x48\x0d\x45\x42\xf3\xed\x62\xbf\x66\x07\xc8\x35\x3e\xb1\xa0\xfb\x0c\x32\xb2\x00\x08\xed\x96\x99\xb3\x79\x73\xd9\x76\xc3\x6a\xe4\x6c\xd1\xfc\x24\x86\xd6\xca\xd5\x5a\xe3\xb0\x01\xd8\x25\x8c\xb4\xad\xfd\xa8\x1e\x4d\xa2\xa2\x2e\x89\x60\xbf\xe2\xd8\xe6\xa5\x89\xb7\x95\xfb\xae\x12\x1c\x1f\xc9\x47\xca\xec\x3f\x78\x8c\xda\x1c\x37\x6a\x8c\x38\x6a\xbd\xfb\x62\x7f\xb7\x9f\xc1\x74\x3e\xfa\x48\x0b\x9d\x96\x12\x66\x44\x41\xff\x25\x6c\x93\x2f\x28\x69\xa5\xb7\x73\x19\x51\x23\xdf\xc9\x70\xf5\xb9\x90\x9b\x74\x74\x33\xed\x94\xf4\x8e\x76\x7e\x1e\x35\x58\x3b\x72\x86\xd5\xb2\x0d\xcd\x05\xdc\x4c\x3f\x87\xb6\xbe\x1b\x72\xb0\x03\xa3\x58\x85\x14\x48\x6e\xd8\x1a\xff\x1f\x36\xf2\x19\x8c\xfc\xd1\x2a\x5a\x1c\xb6\xc6\x73\x30\x1d\xe8\x6b\x67\x3b\xdb\xfe\xab\x8d\x37\x88\x9d\x85\x2f\x20\x38\xb9\x91\x47\x91\x78\x40\x78\x10\xda\x8f\xc7\xbd\xfb\x50\x18\x1c\xe6\x14\x5b\xed\x76\x1f\xb9\x27\x51\x61\x4a\x3e\x0e\x12\xe3\x7e\xec\x64\x75\xee\x38\x38\x06\x7e\x78\x58\xd2\xed\x86\x17\x19\x7b\x7f\xc7\x83\x7b\x16\xf4\x8a\x93\xee\x2e\xd6\x56\x22\xb0\xdb\xff\x26\x2c\x8e\xe1\x07\x43\x94\x01\x02\x3f\xbe\x85\xba\xa2\xc4\xf8\x4f\x72\x36\x3f\xfa\xae\x73\xfb\xa3\xb1\x8c\x28\x0d\x4b\xa9\x36\x44\xd1\xa6\x3f\x63\x0a\xdc\xba\x4f\x72\x6d\xe9\xa7\xd1\xbc\xb5\xa7\xd8\x9a\xf0\xf1\xd1\xbd\xef\xf9\x78\x14\xf5\x5d\x3e\x9a\x44\x48\xf2\xe2\x98\xd0\x65\xac\x4e\x6e\x0a\xdf\xb8\x2b\xc0\xf8\xf9\xd8\x14\x4c\x4f\x22\x62\x8c\x1a\x8f\x06\x60\x18\x4d\xac\x5f\xaf\x7a\x57\xb2\x6e\x79\x32\x08\xab\xa7\x78\xec\x8b\xe9\xae\x10\x68\xc9\x73\xad\xc7\x1e\x57\xa3\xcb\x1e\xef\x21\xac\x46\xe7\xa3\xce\x51\xfb\xf0\xde\xef\x23\x3d\xa9\xc9\x80\xf5\xc8\x46\xd9\xe8\x48\x3c\xa1\xf4\x8d\x8d\x9f\x71\x70\x22\xd2\x0f\xd1\x31\xe9\x8c\xed\xcf\xeb\x27\xad\xec\x7f\x5e\xf3\x88\x89\x19\x1d\x4d\x22\x5d\x67\xbe\x37\x31\x7e\xd9\x5d\xc0\x5a\x32\x07\xde\xc3\x54\x70\x54\x50\x58\x11\xc3\xa2\x22\x3c\x28\x42\x9e\xc8\x1a\x8d\x48\xbf\xab\xdd\xa5\x35\xf8\x74\xd2\xb5\xb6\xbe\xd2\xb6\xb8\xf2\xad\xff\x0d\x66\xda\x75\x12\xa0\xc1\xbb\xeb\xe6\xf8\xae\xcd\xeb\xef\xde\xf6\x3a\x37\x5d\x44\x8c\x1d\xf7\xee\xf7\x9c\xa7\xfa\x24\x27\x7f\x40\xba\xd9\x6c\x22\xff\x45\xcb\xb5\xf1\xbb\x46\x4a\x4c\x2a\x16\xbd\xd7\x01\x10\xbd\x15\x39\x50\x5c\xa2\x5a\xf4\xd8\x37\xdd\x95\x24\xf6\x3f\x6d\x4c\x62\xff\xeb\xed\xff\x0b\x00\x00\xff\xff\x56\xf8\xb5\xef\xce\x2d\x00\x00") +var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\x6d\x93\xdb\x36\x92\xfe\x3c\xfe\x15\x1d\x9e\xbd\x92\xce\x43\x52\x33\x63\x7b\x7d\x12\xa9\x94\xd7\x9b\xdd\xf3\xd5\x5d\x92\x4a\x9c\xba\xdb\xca\xa6\xae\x40\xb2\x25\xc2\x03\x02\x0c\x00\x4a\xa3\x4c\xe9\xbf\x5f\x35\x40\x52\xd4\xcb\x4c\xec\xb5\xaf\x6a\xfd\x61\x4c\x02\x8d\x46\xa3\xfb\x69\xf4\x0b\x95\x7c\xf5\xe7\xef\xde\xbe\xff\xdb\xf7\xdf\x40\x69\x2b\xb1\x78\x92\xd0\x7f\x20\x98\x5c\xa5\x01\xca\x60\xf1\xe4\x22\x29\x91\x15\x8b\x27\x17\x17\x49\x85\x96\x41\x5e\x32\x6d\xd0\xa6\x41\x63\x97\xe1\xeb\x60\x3f\x51\x5a\x5b\x87\xf8\x6b\xc3\xd7\x69\xf0\x3f\xe1\x4f\x6f\xc2\xb7\xaa\xaa\x99\xe5\x99\xc0\x00\x72\x25\x2d\x4a\x9b\x06\xef\xbe\x49\xb1\x58\xe1\x60\x9d\x64\x15\xa6\xc1\x9a\xe3\xa6\x56\xda\x0e\x48\x37\xbc\xb0\x65\x5a\xe0\x9a\xe7\x18\xba\x97\x4b\xe0\x92\x5b\xce\x44\x68\x72\x26\x30\xbd\x0a\x16\x4f\x88\x8f\xe5\x56\xe0\xe2\xfe\x3e\xfa\x16\xed\x46\xe9\xdb\xdd\x6e\x06\x6f\x1a\x5b\xa2\xb4\x3c\x67\x16\x0b\xf8\x0b\x6b\x72\xb4\x49\xec\x29\xdd\x22\xc1\xe5\x2d\x94\x1a\x97\x69\x40\xa2\x9b\x59\x1c\xe7\x85\xfc\x60\xa2\x5c\xa8\xa6\x58\x0a\xa6\x31\xca\x55\x15\xb3\x0f\xec\x2e\x16\x3c\x33\xb1\xdd\x70\x6b\x51\x87\x99\x52\xd6\x58\xcd\xea\xf8\x26\xba\x89\xfe\x18\xe7\xc6\xc4\xfd\x58\x54\x71\x19\xe5\xc6\x04\xa0\x51\xa4\x81\xb1\x5b\x81\xa6\x44\xb4\x01\xc4\x8b\x7f\x6c\xdf\xa5\x92\x36\x64\x1b\x34\xaa\xc2\xf8\x45\xf4\xc7\x68\xea\xb6\x1c\x0e\x3f\xbe\x2b\x6d\x6b\x72\xcd\x6b\x0b\x46\xe7\x1f\xbd\xef\x87\x5f\x1b\xd4\xdb\xf8\x26\xba\x8a\xae\xda\x17\xb7\xcf\x07\x13\x2c\x92\xd8\x33\x5c\x7c\x16\xef\x50\x2a\xbb\x8d\xaf\xa3\x17\xd1\x55\x5c\xb3\xfc\x96\xad\xb0\xe8\x76\xa2\xa9\xa8\x1b\xfc\x62\xfb\x3e\x64\xc3\x0f\xc7\x26\xfc\x12\x9b\x55\xaa\x42\x69\xa3\x0f\x26\xbe\x8e\xae\x5e\x47\xd3\x6e\xe0\x94\xbf\xdb\x80\x8c\x46\x5b\x5d\x44\x6b\xd4\x84\x5c\x11\xe6\x28\x2d\x6a\xb8\xa7\xd1\x8b\x8a\xcb\xb0\x44\xbe\x2a\xed\x0c\xae\xa6\xd3\x67\xf3\x73\xa3\xeb\xd2\x0f\x17\xdc\xd4\x82\x6d\x67\xb0\x14\x78\xe7\x87\x98\xe0\x2b\x19\x72\x8b\x95\x99\x81\xe7\xec\x26\x76\x6e\xcf\x5a\xab\x95\x46\x63\xda\xcd\x6a\x65\xb8\xe5\x4a\xce\x08\x51\xcc\xf2\x35\x9e\xa3\x35\x35\x93\x27\x0b\x58\x66\x94\x68\x2c\x1e\x09\x92\x09\x95\xdf\xfa\x31\xe7\xcd\xc3\x43\xe4\x4a\x28\x3d\x83\x4d\xc9\xdb\x65\xe0\x36\x82\x5a\x63\xcb\x1e\x6a\x56\x14\x5c\xae\x66\xf0\xaa\x6e\xcf\x03\x15\xd3\x2b\x2e\x67\x30\xdd\x2f\x49\xe2\x4e\x8d\x49\xec\x2f\xae\x27\x17\x49\xa6\x8a\xad\xb3\x61\xc1\xd7\x90\x0b\x66\x4c\x1a\x1c\xa9\xd8\x5d\x48\x07\x04\x74\x0f\x31\x2e\xbb\xa9\x83\x39\xad\x36\x01\xb8\x8d\xd2\xc0\x0b\x11\x66\xca\x5a\x55\xcd\xe0\x8a\xc4\x6b\x97\x1c\xf1\x13\xa1\x58\x85\x57\xd7\xdd\xe4\x45\x52\x5e\x75\x4c\x2c\xde\xd9\xd0\xd9\xa7\xb7\x4c\xb0\x48\x78\xb7\x76\xc9\x60\xc9\xc2\x8c\xd9\x32\x00\xa6\x39\x0b\x4b\x5e\x14\x28\xd3\xc0\xea\x06\x09\x47\x7c\x01\xc3\xeb\xef\x81\xdb\xaf\xbc\xea\xe4\x8a\x0b\xbe\x6e\x8f\x35\x78\x3c\x3a\xe1\xc3\x87\x78\x0d\xed\x83\x5a\x2e\x0d\xda\x70\x70\xa6\x01\x31\x97\x75\x63\xc3\x95\x56\x4d\xdd\xcf\x5f\x24\x6e\x14\x78\x91\x06\x8d\x16\x41\x7b\xfd\xbb\x47\xbb\xad\x5b\x55\x04\xfd\xc1\x95\xae\x42\xb2\x84\x56\x22\x80\x5a\xb0\x1c\x4b\x25\x0a\xd4\x69\xf0\xa3\xca\x39\x13\x20\xfd\x99\xe1\xa7\x1f\xfe\x13\x5a\x93\x71\xb9\x82\xad\x6a\x34\x7c\x63\x4b\xd4\xd8\x54\xc0\x8a\x82\xe0\x1a\x45\xd1\x40\x10\x87\xdd\x53\x51\xc3\xcc\xca\x3d\xd5\x45\x92\x35\xd6\xaa\x9e\x30\xb3\x12\x32\x2b\xc3\x02\x97\xac\x11\x16\x0a\xad\xea\x42\x6d\x64\x68\xd5\x6a\x45\x91\xce\x1f\xc2\x2f\x0a\xa0\x60\x96\xb5\x53\x69\xd0\xd1\x76\x36\x64\xa6\x56\x75\x53\xb7\x56\xf4\x83\x78\x57\x33\x59\x60\x41\x36\x17\x06\x83\xc5\x5f\xf9\x1a\xa1\x42\x7f\x96\x8b\x63\x48\xe4\x4c\xa3\x0d\x87\x4c\x4f\x80\x91\xc4\x5e\x18\x7f\x24\x68\xff\x25\x8d\xe8\x38\xf5\x47\xa8\x50\x36\x70\xf0\x16\x6a\xba\x57\x82\xc5\xfd\xbd\x66\x72\x85\xf0\x94\x17\x77\x97\xf0\x94\x55\xaa\x91\x16\x66\x29\x44\x6f\xdc\xa3\xd9\xed\x0e\xb8\x03\x24\x82\x2f\x12\xf6\x18\xbc\x41\xc9\x5c\xf0\xfc\x36\x0d\x2c\x47\x9d\xde\xdf\x13\xf3\xdd\x6e\x0e\xf7\xf7\x7c\x09\x4f\xa3\x1f\x30\x67\xb5\xcd\x4b\xb6\xdb\xad\x74\xf7\x1c\xe1\x1d\xe6\x8d\xc5\xf1\xe4\xfe\x1e\x85\xc1\xdd\xce\x34\x59\xc5\xed\xb8\x5b\x4e\xe3\xb2\xd8\xed\x48\xe6\x56\xce\xdd\x0e\x62\x62\x2a\x0b\xbc\x83\xa7\xd1\xf7\xa8\xb9\x2a\x0c\x78\xfa\x24\x66\x8b\x24\x16\x7c\xd1\xae\x3b\x54\x52\xdc\x88\x3d\x5e\x62\x02\x4c\x8f\x73\xe7\x36\x4e\xd4\xa1\xa4\x67\xbc\x60\x15\xf6\xd2\xb7\x78\x30\xdc\xe2\x2d\x6e\xd3\xe0\xfe\x7e\xb8\xb6\x9d\xcd\x99\x10\x19\x23\xbd\xf8\xa3\xf5\x8b\x7e\x43\xc2\xe9\x9a\x1b\x97\x52\x2d\x3a\x09\xf6\x62\x7f\xa4\x5b\x1f\x5d\x5c\x56\xd5\x33\xb8\xb9\x1e\xdc\x5a\xe7\x3c\xfe\xd5\x91\xc7\xdf\x9c\x25\xae\x99\x44\x01\xee\x6f\x68\x2a\x26\xba\xe7\xd6\x5b\x06\xce\x77\xbc\x28\xa4\x3b\xba\x17\xad\xbf\xeb\xa7\x73\x50\x6b\xd4\x4b\xa1\x36\x33\x60\x8d\x55\x73\xa8\xd8\x5d\x1f\xef\x6e\xa6\xd3\xa1\xdc\x94\x0a\xb2\x4c\xa0\xbb\x5d\x34\xfe\xda\xa0\xb1\xa6\xbf\x4b\xfc\x94\xfb\x4b\x57\x4a\x81\xd2\x60\x71\xa4\x0d\xda\x91\x54\xeb\xa8\x06\xa6\xef\x95\x79\x56\xf6\xa5\x52\x7d\x08\x19\x8a\xd1\xb2\x1e\x44\xbb\x60\x91\x58\xbd\xa7\xbb\x48\x6c\xf1\x49\x21\x40\x53\x8a\xf7\x50\x04\xf0\x37\x1a\x9d\xbd\x46\xd4\x3e\xbf\x20\xc8\x82\x7b\x4d\x62\x5b\x7c\xc6\xce\x04\xc2\x8c\x19\xfc\x98\xed\x5d\xa4\xdf\x6f\xef\x5e\x3f\x77\xff\x12\x99\xb6\x19\x32\xfb\x31\x02\x2c\x1b\x59\x0c\xce\xef\xee\xce\xcf\x15\xa0\x91\x7c\x8d\xda\x70\xbb\xfd\x58\x09\xb0\xd8\x8b\xe0\xdf\x0f\x45\x48\x62\xab\x1f\xc7\xda\xf0\xe5\x0b\x39\xf7\xef\xa5\x24\x37\x8b\x7f\x57\x1b\x28\x14\x1a\xb0\x25\x37\x40\xc1\xf5\xeb\x24\x2e\x6f\x7a\x92\x7a\xf1\x9e\x26\x9c\x52\x61\xe9\x52\x0b\xe0\x06\x74\x23\x5d\xe4\x55\x12\x6c\x89\x87\xe9\x48\x1b\xa4\x23\x78\xaf\x28\xa5\x5b\xa3\xb4\x50\x31\xc1\x73\xae\x1a\x03\x2c\xb7\x4a\x1b\x58\x6a\x55\x01\xde\x95\xac\x31\x96\x18\xd1\xf5\xc1\xd6\x8c\x0b\xe7\x4b\xce\xa4\xa0\x34\xb0\x3c\x6f\xaa\x86\x52\x52\xb9\x02\x94\xaa\x59\x95\xad\x2c\x56\x81\x0f\x4c\x42\xc9\x55\x2f\x8f\xa9\x59\x05\xcc\x5a\x96\xdf\x9a\x4b\xe8\x6e\x05\x60\x1a\xc1\x72\x2c\x68\x55\xae\xaa\x4a\x49\xb8\xd1\x05\xd4\x4c\xdb\x2d\x98\xc3\xdc\x82\xe5\xb9\x8b\x72\x11\xbc\x91\x5b\x25\x11\x4a\xb6\x76\x12\xc2\x7b\x5f\x4e\x90\x5c\x7f\x61\x39\x66\x4a\xf5\xd4\x50\xb1\x6d\xb7\x5d\x2b\xfd\x86\xdb\x92\x7b\xf5\xd4\xa8\x2b\x5a\x5a\x80\xe0\x15\xb7\x26\x4a\xe2\x7a\x7f\xa3\xee\x63\xb3\x08\x4b\xa5\xf9\x6f\x94\xd8\x88\xe1\xf5\x69\x8f\x2e\x97\xee\x6e\x74\x56\x17\xb8\xb4\x33\x78\xe1\xef\xc6\x63\x1c\xb7\x15\xd0\x39\x10\x77\x3c\x5d\x65\x49\x01\x67\x06\x37\x3e\x9d\xf5\x89\x44\x61\x07\x12\x14\x47\x50\xf3\x9b\xbe\x7e\x5d\xdf\xf5\x72\xf4\x39\xf1\xb4\x67\x42\x08\x38\x54\xca\x9a\xf7\x6a\xbc\x84\x8a\xdd\x22\x30\x48\xd8\x51\x85\xdc\x0a\xed\xea\x2b\xee\xfa\x03\xb1\xdd\x20\xda\xaf\xc9\x75\xd3\x1f\x3c\x43\x2e\x57\xcf\xae\xa7\x1e\x91\xf4\x40\xec\x9f\x5d\x4f\xb9\xb4\xea\xd9\xf5\x74\x7a\x37\xfd\xc8\x7f\xcf\xae\xa7\x4a\x3e\xbb\x9e\xda\x12\x9f\x5d\x4f\x9f\x5d\xdf\x0c\xb1\xec\x47\xba\xcc\x92\xa8\xd0\xd0\x6e\x1d\xc4\x03\xb0\x4c\xaf\xd0\xa6\xc1\xff\xb2\x4c\x35\x76\x96\x09\x26\x6f\x83\x85\x13\x97\xb2\x0d\x87\x82\xf3\xf9\x29\xd4\xcc\x10\x24\x48\x62\x87\x92\xb6\x17\x62\x60\x6c\x1a\xad\x55\x23\x29\x2a\x02\x9d\xd9\x79\xa8\x1c\x11\xca\x48\x31\x93\x28\xc9\x74\xbc\x78\xab\xea\x6d\xe8\x98\xb8\xe5\x27\x6a\x34\x4d\x5d\x2b\x6d\xa3\xa1\x3a\x19\xd5\x41\x02\x4d\xfc\x7a\xfa\xf2\xf5\xab\x47\xc5\x37\x94\x65\xbb\x33\xf4\x12\xb2\x4c\xad\x11\x7c\x4e\x9f\xa9\x3b\x60\xb2\x80\x25\xd7\x08\x6c\xc3\xb6\x5f\x25\x71\xe1\x2a\xb0\xcf\x47\xed\xb2\xf5\xae\x7f\x2a\xd8\x76\x2e\x7f\x09\x75\x93\x09\x6e\x4a\x60\x20\x71\x03\x89\xb1\x5a\xc9\xd5\xc2\x8d\xe6\x54\x92\xba\x57\xa8\x95\xb1\x8f\x99\x1f\xab\x0c\x8b\xe2\x0c\x00\xbe\x94\xfd\x37\x9b\x4d\xd4\x69\xd2\x19\xbf\x44\x51\xc7\x74\xfd\x35\x92\xdb\x6d\xec\xdd\x48\xc9\xf8\x6b\x5e\xa4\xd7\xaf\xaf\x5f\xbd\xba\x7e\xf1\x6f\xaf\x5f\xbe\xbc\x7e\xfd\xe2\xe5\x43\xc8\xa0\x43\x7d\x26\x30\x7c\x1a\xfd\xad\xa2\xaa\xb5\xcf\xa1\x3d\x5e\xba\xdc\x8d\x22\x74\x41\x35\x88\x0e\xfe\x61\x0c\x35\x92\x12\x91\x90\x89\xb3\x39\xc4\x27\xa0\xc8\xc1\xe8\x11\xc9\x3e\x13\x5a\x1d\x7c\x08\x29\xaa\xb1\x74\xc2\xae\x98\xe7\x4a\xf6\x70\xba\x04\xc3\xab\x5a\x6c\x21\xdf\x5b\xfd\x3c\xae\x1e\x34\xca\xef\xc2\xea\xd0\x6c\x1e\x64\x2e\xfa\x57\xaa\x40\x8a\xfa\xa6\x31\x39\xd6\xae\xcb\x4b\x91\xf4\x4f\xdb\xdf\x98\xb4\x5c\x62\x17\x71\x23\xf8\x4e\x8a\x2d\x34\x06\x61\xa9\x34\x14\x98\x35\xab\x95\x4b\x13\x34\xd4\x9a\xaf\x99\xc5\x2e\xcc\x9a\x16\x15\x3d\x28\x06\x95\x0d\xa5\x3c\x62\x90\x81\xfc\x4d\x35\x90\x33\x09\x56\xb3\xfc\xd6\x7b\x4a\xa3\x35\x79\x4a\x8d\xfe\x34\x7d\xa0\xcf\x50\xa8\x8d\x23\xf1\xe7\x5e\x72\x14\x2e\xea\x1b\x44\x28\xd5\x06\xaa\x26\x77\x0e\x49\x51\xdd\x1d\x62\xc3\xb8\x85\x46\x5a\x2e\xbc\x3e\x6d\xa3\x25\xe5\x08\x78\x10\xa5\x4f\x6a\xbf\x04\xab\xc5\xfb\x12\xcf\xa4\x44\x7d\xd5\x06\x1a\xdf\x7a\x72\xa8\xb5\xb2\x98\x93\x41\x81\xad\x18\x97\x86\x2c\xe2\xf2\x00\xac\x3e\xa2\xaa\xeb\x9f\xda\x87\x7d\x87\xd2\x4d\xc7\x31\xfc\x55\xa8\x8c\x09\x58\x13\xd2\x33\x41\xe9\x9c\x82\x52\xd1\xd1\x07\xda\x32\x96\xd9\xc6\x80\x5a\xba\x51\x2f\x39\xad\x5f\x33\x4d\x16\xc4\xaa\xb6\x90\xb6\xfd\x35\x1a\x33\xa8\xd7\x6d\xd7\x90\x5e\xa9\x72\x3f\x98\xef\xb5\x9e\xc2\xcf\xbf\xcc\x9f\xb4\xa2\xfc\x19\x97\x0e\x12\x84\x6f\x7f\x64\x5b\x32\x0b\xb9\x46\x66\xd1\x40\x2e\x94\x69\xb4\x97\xb0\xd0\xaa\x06\x92\xb2\xe3\xd4\x71\xa6\x89\xda\xed\xd6\x31\x19\x97\xcc\x94\x93\xb6\x3d\xa8\xd1\x59\xa9\x9f\xeb\xc6\x2f\x08\x75\x63\x62\xc0\xd3\xe9\x1c\x78\xd2\xf1\x8d\x04\xca\x95\x2d\xe7\xc0\x9f\x3f\xef\x89\x2f\xf8\x12\xc6\x1d\xc5\xcf\xfc\x97\xc8\xde\x45\xb4\x0b\xa4\x29\x0c\x77\x73\x1b\xb6\x7c\x4c\x2d\x78\x8e\x63\x7e\x09\x57\x93\x79\x37\x9b\x69\x64\xb7\xdd\x5b\x6b\x47\xff\x9f\xfb\xbb\x9b\x1f\x6a\xc6\x29\xff\x40\x37\xbe\xf6\x37\xc0\x60\xc5\x8d\x85\x46\x0b\x68\x7d\xd8\x9b\xa0\x37\x88\xa3\x1b\x6a\xe5\x04\x97\xed\x43\x8b\xa9\xee\x08\x9e\x4d\x64\x50\x16\xe3\xff\xf8\xf1\xbb\x6f\x23\x63\x35\x97\x2b\xbe\xdc\x8e\xef\x1b\x2d\x66\xf0\x74\x1c\xfc\x4b\xa3\x45\x30\xf9\x79\xfa\x4b\xb4\x66\xa2\xc1\x4b\x67\xef\x99\xfb\x7b\xb2\xcb\x25\xb4\x8f\x33\x38\xdc\x70\x37\x99\xcc\xcf\xf7\x49\x06\x6d\x1d\x8d\x06\xed\x98\x08\x7b\xe0\x1f\xeb\x88\x41\x85\xb6\x54\xce\x75\x35\xe6\x4a\x4a\xcc\x2d\x34\xb5\x92\xad\x4a\x40\x28\x63\xf6\x40\xec\x28\xd2\x53\x50\xb4\xf4\xa9\x0b\xd6\xff\x8d\xd9\x8f\x2a\xbf\x45\x3b\x1e\x8f\x37\x5c\x16\x6a\x13\x09\xe5\xaf\xda\x88\x9c\x54\xe5\x4a\x40\x9a\xa6\xd0\x46\xd1\x60\x02\x5f\x43\xb0\x31\x14\x4f\x03\x98\xd1\x23\x3d\x4d\xe0\x39\x1c\x2f\x2f\x29\xde\x3f\x87\x20\x66\x35\x0f\x26\xde\x1d\x3a\xc5\x2b\x59\xa1\x31\x6c\x85\x43\x01\x5d\x65\xd4\x83\x8c\xce\x51\x99\x15\xa4\xe0\x0c\x54\x33\x6d\xd0\x93\x44\x54\x8d\x77\x68\x23\xcc\x3a\xb2\x34\x05\xd9\x08\xb1\x07\xa9\x77\x8a\x79\x07\xbf\x03\xf2\xc8\xc7\x9a\xaf\xd2\x14\xa8\x34\x25\x15\x17\xfb\x95\x64\x7c\x5f\x44\x4f\x22\x8a\x0b\xfb\x15\x93\xf9\x10\xcd\x07\xdc\xb0\xf8\x3d\x76\x58\x1c\xf3\xc3\xe2\x01\x86\xae\x67\xf1\x18\x3f\xdf\xe3\x18\xb0\x73\x03\x0f\x70\x93\x4d\x95\xa1\x7e\x8c\x9d\xef\x59\xb4\xec\x9c\xaa\xdf\x49\x3b\x58\x7b\x09\x57\xaf\x26\x0f\x70\x47\xad\xd5\x83\xcc\xa5\xb2\xdb\xf1\xbd\x60\x5b\xca\x99\x60\x64\x55\xfd\xd6\xb5\x18\x46\x97\x2e\xe2\xce\xa0\xe7\x70\xe9\x9a\xc7\x33\x18\xb9\x37\x9a\xe7\x15\xba\x55\x2f\xa7\xd3\xe9\x25\x74\x5f\x5d\xfe\xc4\xc8\x09\x75\x83\xbb\x07\xe4\x31\x4d\x9e\x53\xdc\xff\x1c\x89\x5a\x1e\xbd\x4c\xed\xfb\x67\x48\xd5\xc7\x86\x03\xb1\xe0\x0f\x7f\x80\x93\xd9\x43\x18\xc7\x31\xfc\x17\xa3\x32\x5c\x08\xd7\x3d\x70\x4d\x83\x9e\xbe\xe2\xc6\xb8\x62\xdc\x40\xa1\x24\xb6\x6b\x3e\xed\xda\x3f\x91\xb1\x25\x83\x05\x4c\x8f\x05\xa4\xeb\x70\x10\x16\xce\x44\x8b\x01\xdf\xc3\x40\x70\xb1\x1b\xee\x77\xb0\x92\x57\x08\x5f\xa5\x10\x04\xc3\xc5\x27\x14\x44\xd0\x33\xbb\x30\x68\xdf\x7b\x5b\x8c\xdb\xe8\x78\x2e\x76\x4d\x2e\xe1\x66\x3a\x9d\x4e\x4e\x84\xd8\xed\xd5\xfb\xa6\xa6\xb4\x09\x98\xdc\xba\x2b\xb1\xd7\xad\x4b\x1c\x29\x05\xa2\x2b\x4d\x40\xae\x84\xf0\x39\x4b\xbb\x94\x14\xdc\x36\x4f\x52\x08\xaf\xe6\x67\xa2\xe8\x40\x93\x83\xa3\x1d\x9b\xe7\x8c\xee\x8f\x4d\x74\xa8\xb3\x23\xe2\xf0\xea\xc0\x28\x07\xf6\x3a\x6f\x98\x8b\x5e\x6e\xbe\xd7\xe8\x91\xb9\xf6\xf6\x3a\xd6\xd9\x40\x7e\xcf\xe7\xf9\xd5\x47\x1e\xa3\x9f\xae\x1b\x53\x8e\x8f\x04\x9d\xcc\x4f\x6d\xf3\xce\xa2\xa6\x2c\x59\x51\xc8\x22\x5b\x50\x29\xa0\xf1\xc4\x24\x2e\x55\xd7\x18\x6a\x94\x05\xea\x2e\xa5\xf0\x99\x3d\x25\x80\x07\x26\xf3\x55\xe5\x10\x4e\x9f\xe8\x30\x2e\x25\x53\x12\x01\x00\x8e\x9c\xc0\x01\xf5\x00\xa9\x44\x8c\x82\xd5\x06\x0b\x48\xc1\x7f\x04\x1f\x4f\xa2\x46\xf2\xbb\xf1\x24\x6c\xdf\x8f\x79\x74\xf3\xf3\xbe\x4c\xec\xc4\x7e\x9e\x42\x90\x58\x0d\xbc\x48\x47\x01\x3c\x3f\xe7\x82\x14\x75\x47\x8b\xbd\x04\xc3\xa5\x00\x89\x2d\x16\xae\x0f\xea\xeb\xb5\xbf\x07\x19\xcb\x6f\x57\xae\x10\x9a\x51\xaa\x35\x3e\x61\xcb\xd6\xcc\x32\xed\xb8\x4e\xe6\xb0\x27\x6f\x0b\xc5\x9c\x8c\x33\x07\x5f\x91\xba\x76\x2b\xf4\x9f\x28\xdc\x5b\xa6\x74\x81\x3a\xd4\xac\xe0\x8d\x99\xc1\x8b\xfa\x6e\xfe\xf7\xee\x13\x8e\x6b\x0a\x3f\x2a\x6a\xad\x71\x71\x22\x51\xdb\x65\x7c\x0e\x41\x12\x13\xc1\xef\xb1\xe9\x0f\x3b\xfc\xf8\x0e\x67\x5a\xdf\xd0\x7f\x1a\x6f\xc7\x2b\x5e\x14\x02\x49\xe0\x3d\x7b\x72\x46\xb2\xff\xd0\xa5\x0e\xb7\x84\xb6\xe7\xbd\x5f\xb3\x03\x14\x06\x1f\x59\xd0\xb7\xcf\x47\x04\x80\x90\x8e\xcc\x9d\xce\xdb\x62\xdb\x0d\xeb\x91\xd3\x45\xfb\x53\x8a\xa2\xd1\x2e\xd7\x1a\x87\x2d\xc0\x2e\x61\x64\x28\xf7\x2b\xcc\x68\x12\x95\x4d\xc5\x24\xff\x0d\xc7\x14\x97\x26\x5e\x57\xae\x1f\x1f\x9c\x5e\xc9\x27\xc2\xec\x1b\xe5\xa3\x2e\xc6\x8d\x5a\x25\x8e\x3a\xeb\xbe\xd8\xd7\xf6\x33\x98\xce\x47\x9f\xa8\xa1\xf3\xbb\x84\x19\xd3\x30\x7c\x09\xbb\xe0\x0b\x5a\xd1\xee\xdd\x5c\xc6\xf4\xc8\x77\x32\x5c\x7e\x2e\xd5\x26\x1d\xdd\x4c\x7b\x21\xbd\xa1\x9d\x9d\x47\x2d\xd6\x4e\x8c\x41\x52\x76\xae\xb9\x80\x9b\xe9\x97\x90\xd6\x77\x43\x8e\x4e\x60\x35\xaf\xb1\x00\x96\x5b\xbe\xc6\xff\x87\x83\x7c\x01\x25\x7f\xb2\x88\x84\xc3\x4e\x79\x0e\xa6\x07\xf2\xd2\x6c\xaf\xdb\x7f\x25\x7f\x83\xd8\x69\xf8\x39\x04\x67\x0f\xf2\x20\x12\x8f\x08\x8f\x5c\xfb\x61\xbf\x77\x1f\x98\x82\xe3\x98\x42\xd9\x6e\xff\x71\x74\x12\x95\xb6\x12\xe3\x20\xb1\xee\x47\x32\x24\x73\xcf\xc1\x31\xf0\xc3\x87\x29\xdd\xee\xb0\x90\xa1\xfa\x1d\x8f\xea\x2c\x18\x24\x27\x7d\x2d\xd6\x65\x22\xb0\xdb\xff\x96\x28\x8e\xe1\x47\xcb\xb4\x05\x06\x3f\xbd\x83\xa6\x2e\x98\xf5\x9f\x72\x28\x3e\xfa\x4f\x25\xdd\x8f\x8d\x32\xa6\x0d\x2c\x95\xde\x30\x5d\xb4\xfd\x19\x5b\xe2\xd6\x7d\xca\xe9\x52\x3f\x83\xf6\x1d\xdd\x62\x6b\x26\xc6\x27\x75\xdf\xd3\xf1\x28\x1a\x9a\x7c\x34\x89\x90\xe5\xe5\x29\xa1\x8b\x58\xfd\xbe\x29\x7c\xeb\x4a\x80\xf1\xd3\xb1\x2d\xb9\x99\x44\xcc\x5a\x3d\x1e\x1d\x80\x61\x34\x21\xbb\x5e\x0d\x4a\xb2\x7e\x79\x72\xe0\x56\x8f\xf1\xd8\x27\xd3\x7d\x22\xd0\x91\xe7\xc6\x8c\x3d\xae\x46\x97\x03\xde\x87\xb0\x1a\x3d\x1b\xf5\x86\xda\xbb\xf7\xfe\x1c\xe9\x59\x49\x0e\x58\x8f\xc8\xcb\x46\x27\xdb\xb3\xa2\x78\x4b\xfe\x33\x0e\xce\x78\xfa\x31\x3a\x26\xbd\xb2\xfd\x7d\xfd\xa8\x96\xfd\xcf\x32\x1e\x50\x31\x2f\x46\x93\xc8\x34\x99\xef\x4d\x8c\x5f\xf6\x05\x58\x47\xe6\xc0\x7b\x1c\x0a\x4e\x12\x0a\xda\xe2\x30\xa9\x08\x8f\x92\x90\x47\xa2\x46\xbb\xa5\x3f\xd5\xee\x92\x14\x3e\x9d\xf4\xad\xad\x6f\x0c\x25\x57\xbe\xf5\xbf\xc1\xcc\xb8\x4e\x02\xb4\x78\x77\xdd\x1c\xdf\xb5\x79\xf3\xfd\xbb\x41\xe7\xa6\xf7\x88\xb1\xe3\xde\xff\x0e\xf0\x5c\x9f\xe4\xec\x0f\x0f\x37\x9b\x4d\xb4\x52\x6a\x25\xfc\x4f\x0e\xfb\x46\x4a\xcc\x6a\x1e\x7d\x30\x01\x30\xb3\x95\x39\x14\xb8\x44\xbd\x18\xb0\x6f\xbb\x2b\x49\xec\x7f\x12\x97\xc4\xfe\x57\xbf\xff\x17\x00\x00\xff\xff\x31\x9f\x54\x5e\x06\x2c\x00\x00") func faucetHtmlBytes() ([]byte, error) { return bindataRead( @@ -83,7 +85,7 @@ func faucetHtml() (*asset, error) { } info := bindataFileInfo{name: "faucet.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdb, 0xa2, 0x98, 0x44, 0x4b, 0x50, 0xf8, 0xa1, 0xac, 0x4a, 0x76, 0x2e, 0xcc, 0x3d, 0xcb, 0x81, 0x9e, 0x2a, 0xaa, 0x87, 0xf5, 0x9d, 0x53, 0x4, 0x8a, 0xdd, 0x5a, 0xfe, 0xd3, 0xc3, 0xf, 0x11}} return a, nil } @@ -102,6 +104,12 @@ func Asset(name string) ([]byte, error) { return nil, fmt.Errorf("Asset %s not found", name) } +// AssetString returns the asset contents as a string (instead of a []byte). +func AssetString(name string) (string, error) { + data, err := Asset(name) + return string(data), err +} + // MustAsset is like Asset but panics when Asset would return an error. // It simplifies safe initialization of global variables. func MustAsset(name string) []byte { @@ -113,6 +121,12 @@ func MustAsset(name string) []byte { return a } +// MustAssetString is like AssetString but panics when Asset would return an +// error. It simplifies safe initialization of global variables. +func MustAssetString(name string) string { + return string(MustAsset(name)) +} + // AssetInfo loads and returns the asset info for the given name. // It returns an error if the asset could not be found or // could not be loaded. @@ -128,6 +142,33 @@ func AssetInfo(name string) (os.FileInfo, error) { return nil, fmt.Errorf("AssetInfo %s not found", name) } +// AssetDigest returns the digest of the file with the given name. It returns an +// error if the asset could not be found or the digest could not be loaded. +func AssetDigest(name string) ([sha256.Size]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) + } + return a.digest, nil + } + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) +} + +// Digests returns a map of all known files and their checksums. +func Digests() (map[string][sha256.Size]byte, error) { + mp := make(map[string][sha256.Size]byte, len(_bindata)) + for name := range _bindata { + a, err := _bindata[name]() + if err != nil { + return nil, err + } + mp[name] = a.digest + } + return mp, nil +} + // AssetNames returns the names of the assets. func AssetNames() []string { names := make([]string, 0, len(_bindata)) @@ -151,9 +192,9 @@ var _bindata = map[string]func() (*asset, error){ // img/ // a.png // b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// then AssetDir("data") would return []string{"foo.txt", "img"}, +// AssetDir("data/img") would return []string{"a.png", "b.png"}, +// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and // AssetDir("") will return []string{"data"}. func AssetDir(name string) ([]string, error) { node := _bintree @@ -186,7 +227,7 @@ var _bintree = &bintree{nil, map[string]*bintree{ "faucet.html": {faucetHtml, map[string]*bintree{}}, }} -// RestoreAsset restores an asset under the given directory +// RestoreAsset restores an asset under the given directory. func RestoreAsset(dir, name string) error { data, err := Asset(name) if err != nil { @@ -207,7 +248,7 @@ func RestoreAsset(dir, name string) error { return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) } -// RestoreAssets restores an asset under the given directory recursively +// RestoreAssets restores an asset under the given directory recursively. func RestoreAssets(dir, name string) error { children, err := AssetDir(name) // File diff --git a/cmd/geth/accountcmd.go b/cmd/geth/accountcmd.go index 071be85397da..8fd149cacc60 100644 --- a/cmd/geth/accountcmd.go +++ b/cmd/geth/accountcmd.go @@ -205,7 +205,7 @@ func accountList(ctx *cli.Context) error { } // tries unlocking the specified account a few times. -func unlockAccount(ctx *cli.Context, ks *keystore.KeyStore, address string, i int, passwords []string) (accounts.Account, string) { +func unlockAccount(ks *keystore.KeyStore, address string, i int, passwords []string) (accounts.Account, string) { account, err := utils.MakeAddress(ks, address) if err != nil { utils.Fatalf("Could not list accounts: %v", err) @@ -307,12 +307,18 @@ func accountCreate(ctx *cli.Context) error { password := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx)) - address, err := keystore.StoreKey(keydir, password, scryptN, scryptP) + account, err := keystore.StoreKey(keydir, password, scryptN, scryptP) if err != nil { utils.Fatalf("Failed to create account: %v", err) } - fmt.Printf("Address: {%x}\n", address) + fmt.Printf("\nYour new key was generated\n\n") + fmt.Printf("Public address of the key: %s\n", account.Address.Hex()) + fmt.Printf("Path of the secret key file: %s\n\n", account.URL.Path) + fmt.Printf("- You can share your public address with anyone. Others need it to interact with you.\n") + fmt.Printf("- You must NEVER share the secret key with anyone! The key controls access to your funds!\n") + fmt.Printf("- You must BACKUP your key file! Without the key, it's impossible to access account funds!\n") + fmt.Printf("- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!\n\n") return nil } @@ -326,7 +332,7 @@ func accountUpdate(ctx *cli.Context) error { ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) for _, addr := range ctx.Args() { - account, oldPassword := unlockAccount(ctx, ks, addr, 0, nil) + account, oldPassword := unlockAccount(ks, addr, 0, nil) newPassword := getPassPhrase("Please give a new password. Do not forget this password.", true, 0, nil) if err := ks.Update(account, oldPassword, newPassword); err != nil { utils.Fatalf("Could not update the account: %v", err) diff --git a/cmd/geth/accountcmd_test.go b/cmd/geth/accountcmd_test.go index 3ea22ccfab60..6c97f0ddc33f 100644 --- a/cmd/geth/accountcmd_test.go +++ b/cmd/geth/accountcmd_test.go @@ -74,8 +74,18 @@ Your new account is locked with a password. Please give a password. Do not forge !! Unsupported terminal, password will be echoed. Passphrase: {{.InputLine "foobar"}} Repeat passphrase: {{.InputLine "foobar"}} + +Your new key was generated +`) + geth.ExpectRegexp(` +Public address of the key: 0x[0-9a-fA-F]{40} +Path of the secret key file: .*UTC--.+--[0-9a-f]{40} + +- You can share your public address with anyone. Others need it to interact with you. +- You must NEVER share the secret key with anyone! The key controls access to your funds! +- You must BACKUP your key file! Without the key, it's impossible to access account funds! +- You must REMEMBER your password! Without the password, it's impossible to decrypt the key! `) - geth.ExpectRegexp(`Address: \{[0-9a-f]{40}\}\n`) } func TestAccountNewBadRepeat(t *testing.T) { diff --git a/cmd/geth/bugcmd.go b/cmd/geth/bugcmd.go deleted file mode 100644 index 0adc69d1fab4..000000000000 --- a/cmd/geth/bugcmd.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/url" - "os/exec" - "runtime" - "strings" - - "github.com/ethereum/go-ethereum/cmd/internal/browser" - "github.com/ethereum/go-ethereum/params" - - "github.com/ethereum/go-ethereum/cmd/utils" - cli "gopkg.in/urfave/cli.v1" -) - -var bugCommand = cli.Command{ - Action: utils.MigrateFlags(reportBug), - Name: "bug", - Usage: "opens a window to report a bug on the geth repo", - ArgsUsage: " ", - Category: "MISCELLANEOUS COMMANDS", -} - -const issueURL = "https://github.com/ethereum/go-ethereum/issues/new" - -// reportBug reports a bug by opening a new URL to the go-ethereum GH issue -// tracker and setting default values as the issue body. -func reportBug(ctx *cli.Context) error { - // execute template and write contents to buff - var buff bytes.Buffer - - fmt.Fprintln(&buff, "#### System information") - fmt.Fprintln(&buff) - fmt.Fprintln(&buff, "Version:", params.VersionWithMeta) - fmt.Fprintln(&buff, "Go Version:", runtime.Version()) - fmt.Fprintln(&buff, "OS:", runtime.GOOS) - printOSDetails(&buff) - fmt.Fprintln(&buff, header) - - // open a new GH issue - if !browser.Open(issueURL + "?body=" + url.QueryEscape(buff.String())) { - fmt.Printf("Please file a new issue at %s using this template:\n\n%s", issueURL, buff.String()) - } - return nil -} - -// copied from the Go source. Copyright 2017 The Go Authors -func printOSDetails(w io.Writer) { - switch runtime.GOOS { - case "darwin": - printCmdOut(w, "uname -v: ", "uname", "-v") - printCmdOut(w, "", "sw_vers") - case "linux": - printCmdOut(w, "uname -sr: ", "uname", "-sr") - printCmdOut(w, "", "lsb_release", "-a") - case "openbsd", "netbsd", "freebsd", "dragonfly": - printCmdOut(w, "uname -v: ", "uname", "-v") - case "solaris": - out, err := ioutil.ReadFile("/etc/release") - if err == nil { - fmt.Fprintf(w, "/etc/release: %s\n", out) - } else { - fmt.Printf("failed to read /etc/release: %v\n", err) - } - } -} - -// printCmdOut prints the output of running the given command. -// It ignores failures; 'go bug' is best effort. -// -// copied from the Go source. Copyright 2017 The Go Authors -func printCmdOut(w io.Writer, prefix, path string, args ...string) { - cmd := exec.Command(path, args...) - out, err := cmd.Output() - if err != nil { - fmt.Printf("%s %s: %v\n", path, strings.Join(args, " "), err) - return - } - fmt.Fprintf(w, "%s%s\n", prefix, bytes.TrimSpace(out)) -} - -const header = ` -#### Expected behaviour - - -#### Actual behaviour - - -#### Steps to reproduce the behaviour - - -#### Backtrace -` diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 562c7e0deee0..49e6a0594933 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "os" + "path/filepath" "runtime" "strconv" "sync/atomic" @@ -29,14 +30,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/console" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/trie" - "github.com/syndtr/goleveldb/leveldb/util" "gopkg.in/urfave/cli.v1" ) @@ -162,12 +162,32 @@ Remove blockchain and state databases`, utils.DataDirFlag, utils.CacheFlag, utils.SyncModeFlag, + utils.IterativeOutputFlag, + utils.ExcludeCodeFlag, + utils.ExcludeStorageFlag, + utils.IncludeIncompletesFlag, }, Category: "BLOCKCHAIN COMMANDS", Description: ` The arguments are interpreted as block numbers or hashes. Use "ethereum dump 0" to dump the genesis block.`, } + inspectCommand = cli.Command{ + Action: utils.MigrateFlags(inspect), + Name: "inspect", + Usage: "Inspect the storage size for each type of data in the database", + ArgsUsage: " ", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.AncientFlag, + utils.CacheFlag, + utils.TestnetFlag, + utils.RinkebyFlag, + utils.GoerliFlag, + utils.SyncModeFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + } ) // initGenesis will initialise the given JSON format genesis file and writes it as @@ -190,8 +210,10 @@ func initGenesis(ctx *cli.Context) error { } // Open an initialise both full and light databases stack := makeFullNode(ctx) + defer stack.Close() + for _, name := range []string{"chaindata", "lightchaindata"} { - chaindb, err := stack.OpenDatabase(name, 0, 0) + chaindb, err := stack.OpenDatabase(name, 0, 0, "") if err != nil { utils.Fatalf("Failed to open database: %v", err) } @@ -199,6 +221,7 @@ func initGenesis(ctx *cli.Context) error { if err != nil { utils.Fatalf("Failed to write genesis block: %v", err) } + chaindb.Close() log.Info("Successfully wrote genesis state", "database", name, "hash", hash) } return nil @@ -209,8 +232,10 @@ func importChain(ctx *cli.Context) error { utils.Fatalf("This command requires an argument.") } stack := makeFullNode(ctx) - chain, chainDb := utils.MakeChain(ctx, stack) - defer chainDb.Close() + defer stack.Close() + + chain, db := utils.MakeChain(ctx, stack) + defer db.Close() // Start periodically gathering memory profiles var peakMemAlloc, peakMemSys uint64 @@ -245,23 +270,18 @@ func importChain(ctx *cli.Context) error { fmt.Printf("Import done in %v.\n\n", time.Since(start)) // Output pre-compaction stats mostly to see the import trashing - db := chainDb.(*ethdb.LDBDatabase) - - stats, err := db.LDB().GetProperty("leveldb.stats") + stats, err := db.Stat("leveldb.stats") if err != nil { utils.Fatalf("Failed to read database stats: %v", err) } fmt.Println(stats) - ioStats, err := db.LDB().GetProperty("leveldb.iostats") + ioStats, err := db.Stat("leveldb.iostats") if err != nil { utils.Fatalf("Failed to read database iostats: %v", err) } fmt.Println(ioStats) - fmt.Printf("Trie cache misses: %d\n", trie.CacheMisses()) - fmt.Printf("Trie cache unloads: %d\n\n", trie.CacheUnloads()) - // Print the memory statistics used by the importing mem := new(runtime.MemStats) runtime.ReadMemStats(mem) @@ -271,30 +291,29 @@ func importChain(ctx *cli.Context) error { fmt.Printf("Allocations: %.3f million\n", float64(mem.Mallocs)/1000000) fmt.Printf("GC pause: %v\n\n", time.Duration(mem.PauseTotalNs)) - if ctx.GlobalIsSet(utils.NoCompactionFlag.Name) { + if ctx.GlobalBool(utils.NoCompactionFlag.Name) { return nil } // Compact the entire database to more accurately measure disk io and print the stats start = time.Now() fmt.Println("Compacting entire database...") - if err = db.LDB().CompactRange(util.Range{}); err != nil { + if err = db.Compact(nil, nil); err != nil { utils.Fatalf("Compaction failed: %v", err) } fmt.Printf("Compaction done in %v.\n\n", time.Since(start)) - stats, err = db.LDB().GetProperty("leveldb.stats") + stats, err = db.Stat("leveldb.stats") if err != nil { utils.Fatalf("Failed to read database stats: %v", err) } fmt.Println(stats) - ioStats, err = db.LDB().GetProperty("leveldb.iostats") + ioStats, err = db.Stat("leveldb.iostats") if err != nil { utils.Fatalf("Failed to read database iostats: %v", err) } fmt.Println(ioStats) - return nil } @@ -303,6 +322,8 @@ func exportChain(ctx *cli.Context) error { utils.Fatalf("This command requires an argument.") } stack := makeFullNode(ctx) + defer stack.Close() + chain, _ := utils.MakeChain(ctx, stack) start := time.Now() @@ -336,10 +357,12 @@ func importPreimages(ctx *cli.Context) error { utils.Fatalf("This command requires an argument.") } stack := makeFullNode(ctx) - diskdb := utils.MakeChainDatabase(ctx, stack).(*ethdb.LDBDatabase) + defer stack.Close() + db := utils.MakeChainDatabase(ctx, stack) start := time.Now() - if err := utils.ImportPreimages(diskdb, ctx.Args().First()); err != nil { + + if err := utils.ImportPreimages(db, ctx.Args().First()); err != nil { utils.Fatalf("Import error: %v\n", err) } fmt.Printf("Import done in %v\n", time.Since(start)) @@ -352,10 +375,12 @@ func exportPreimages(ctx *cli.Context) error { utils.Fatalf("This command requires an argument.") } stack := makeFullNode(ctx) - diskdb := utils.MakeChainDatabase(ctx, stack).(*ethdb.LDBDatabase) + defer stack.Close() + db := utils.MakeChainDatabase(ctx, stack) start := time.Now() - if err := utils.ExportPreimages(diskdb, ctx.Args().First()); err != nil { + + if err := utils.ExportPreimages(db, ctx.Args().First()); err != nil { utils.Fatalf("Export error: %v\n", err) } fmt.Printf("Export done in %v\n", time.Since(start)) @@ -364,18 +389,27 @@ func exportPreimages(ctx *cli.Context) error { func copyDb(ctx *cli.Context) error { // Ensure we have a source chain directory to copy - if len(ctx.Args()) != 1 { + if len(ctx.Args()) < 1 { utils.Fatalf("Source chaindata directory path argument missing") } + if len(ctx.Args()) < 2 { + utils.Fatalf("Source ancient chain directory path argument missing") + } // Initialize a new chain for the running node to sync into stack := makeFullNode(ctx) + defer stack.Close() + chain, chainDb := utils.MakeChain(ctx, stack) + syncMode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode) - syncmode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode) - dl := downloader.New(syncmode, chainDb, new(event.TypeMux), chain, nil, nil) + var syncBloom *trie.SyncBloom + if syncMode == downloader.FastSync { + syncBloom = trie.NewSyncBloom(uint64(ctx.GlobalInt(utils.CacheFlag.Name)/2), chainDb) + } + dl := downloader.New(0, chainDb, syncBloom, new(event.TypeMux), chain, nil, nil) // Create a source peer to satisfy downloader requests from - db, err := ethdb.NewLDBDatabase(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name), 256) + db, err := rawdb.NewLevelDBDatabaseWithFreezer(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name)/2, 256, ctx.Args().Get(1), "") if err != nil { return err } @@ -391,7 +425,7 @@ func copyDb(ctx *cli.Context) error { start := time.Now() currentHeader := hc.CurrentHeader() - if err = dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil { + if err = dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncMode); err != nil { return err } for dl.Synchronising() { @@ -402,46 +436,79 @@ func copyDb(ctx *cli.Context) error { // Compact the entire database to remove any sync overhead start = time.Now() fmt.Println("Compacting entire database...") - if err = chainDb.(*ethdb.LDBDatabase).LDB().CompactRange(util.Range{}); err != nil { + if err = db.Compact(nil, nil); err != nil { utils.Fatalf("Compaction failed: %v", err) } fmt.Printf("Compaction done in %v.\n\n", time.Since(start)) - return nil } func removeDB(ctx *cli.Context) error { - stack, _ := makeConfigNode(ctx) - - for _, name := range []string{"chaindata", "lightchaindata"} { - // Ensure the database exists in the first place - logger := log.New("database", name) + stack, config := makeConfigNode(ctx) - dbdir := stack.ResolvePath(name) - if !common.FileExist(dbdir) { - logger.Info("Database doesn't exist, skipping", "path", dbdir) - continue - } - // Confirm removal and execute - fmt.Println(dbdir) - confirm, err := console.Stdin.PromptConfirm("Remove this database?") - switch { - case err != nil: - utils.Fatalf("%v", err) - case !confirm: - logger.Warn("Database deletion aborted") - default: - start := time.Now() - os.RemoveAll(dbdir) - logger.Info("Database successfully deleted", "elapsed", common.PrettyDuration(time.Since(start))) - } + // Remove the full node state database + path := stack.ResolvePath("chaindata") + if common.FileExist(path) { + confirmAndRemoveDB(path, "full node state database") + } else { + log.Info("Full node state database missing", "path", path) + } + // Remove the full node ancient database + path = config.Eth.DatabaseFreezer + switch { + case path == "": + path = filepath.Join(stack.ResolvePath("chaindata"), "ancient") + case !filepath.IsAbs(path): + path = config.Node.ResolvePath(path) + } + if common.FileExist(path) { + confirmAndRemoveDB(path, "full node ancient database") + } else { + log.Info("Full node ancient database missing", "path", path) + } + // Remove the light node database + path = stack.ResolvePath("lightchaindata") + if common.FileExist(path) { + confirmAndRemoveDB(path, "light node database") + } else { + log.Info("Light node database missing", "path", path) } return nil } +// confirmAndRemoveDB prompts the user for a last confirmation and removes the +// folder if accepted. +func confirmAndRemoveDB(database string, kind string) { + confirm, err := console.Stdin.PromptConfirm(fmt.Sprintf("Remove %s (%s)?", kind, database)) + switch { + case err != nil: + utils.Fatalf("%v", err) + case !confirm: + log.Info("Database deletion skipped", "path", database) + default: + start := time.Now() + filepath.Walk(database, func(path string, info os.FileInfo, err error) error { + // If we're at the top level folder, recurse into + if path == database { + return nil + } + // Delete all the files, but not subfolders + if !info.IsDir() { + os.Remove(path) + return nil + } + return filepath.SkipDir + }) + log.Info("Database successfully deleted", "path", database, "elapsed", common.PrettyDuration(time.Since(start))) + } +} + func dump(ctx *cli.Context) error { stack := makeFullNode(ctx) + defer stack.Close() + chain, chainDb := utils.MakeChain(ctx, stack) + defer chainDb.Close() for _, arg := range ctx.Args() { var block *types.Block if hashish(arg) { @@ -458,13 +525,33 @@ func dump(ctx *cli.Context) error { if err != nil { utils.Fatalf("could not create new state: %v", err) } - fmt.Printf("%s\n", state.Dump()) + excludeCode := ctx.Bool(utils.ExcludeCodeFlag.Name) + excludeStorage := ctx.Bool(utils.ExcludeStorageFlag.Name) + includeMissing := ctx.Bool(utils.IncludeIncompletesFlag.Name) + if ctx.Bool(utils.IterativeOutputFlag.Name) { + state.IterativeDump(excludeCode, excludeStorage, !includeMissing, json.NewEncoder(os.Stdout)) + } else { + if includeMissing { + fmt.Printf("If you want to include accounts with missing preimages, you need iterative output, since" + + " otherwise the accounts will overwrite each other in the resulting mapping.") + } + fmt.Printf("%v %s\n", includeMissing, state.Dump(excludeCode, excludeStorage, false)) + } } } - chainDb.Close() return nil } +func inspect(ctx *cli.Context) error { + node, _ := makeConfigNode(ctx) + defer node.Close() + + _, chainDb := utils.MakeChain(ctx, node) + defer chainDb.Close() + + return rawdb.InspectDatabase(chainDb) +} + // hashish returns true for strings that look like hashes. func hashish(x string) bool { _, err := strconv.Atoi(x) diff --git a/cmd/geth/config.go b/cmd/geth/config.go index b0749d23291b..0a63a027760d 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -20,7 +20,6 @@ import ( "bufio" "errors" "fmt" - "io" "os" "reflect" "unicode" @@ -100,7 +99,7 @@ func loadConfig(file string, cfg *gethConfig) error { func defaultNodeConfig() node.Config { cfg := node.DefaultConfig cfg.Name = clientIdentifier - cfg.Version = params.VersionWithCommit(gitCommit) + cfg.Version = params.VersionWithCommit(gitCommit, gitDate) cfg.HTTPModules = append(cfg.HTTPModules, "eth", "shh") cfg.WSModules = append(cfg.WSModules, "eth", "shh") cfg.IPCPath = "geth.ipc" @@ -133,7 +132,6 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { if ctx.GlobalIsSet(utils.EthStatsURLFlag.Name) { cfg.Ethstats.URL = ctx.GlobalString(utils.EthStatsURLFlag.Name) } - utils.SetShhConfig(ctx, stack, &cfg.Shh) utils.SetDashboardConfig(ctx, &cfg.Dashboard) @@ -152,7 +150,6 @@ func enableWhisper(ctx *cli.Context) bool { func makeFullNode(ctx *cli.Context) *node.Node { stack, cfg := makeConfigNode(ctx) - utils.RegisterEthService(stack, &cfg.Eth) if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) { @@ -173,7 +170,10 @@ func makeFullNode(ctx *cli.Context) *node.Node { } utils.RegisterShhService(stack, &cfg.Shh) } - + // Configure GraphQL if requested + if ctx.GlobalIsSet(utils.GraphQLEnabledFlag.Name) { + utils.RegisterGraphQLService(stack, cfg.Node.GraphQLEndpoint(), cfg.Node.GraphQLCors, cfg.Node.GraphQLVirtualHosts, cfg.Node.HTTPTimeouts) + } // Add the Ethereum Stats daemon if requested. if cfg.Ethstats.URL != "" { utils.RegisterEthStatsService(stack, cfg.Ethstats.URL) @@ -195,7 +195,17 @@ func dumpConfig(ctx *cli.Context) error { if err != nil { return err } - io.WriteString(os.Stdout, comment) - os.Stdout.Write(out) + + dump := os.Stdout + if ctx.NArg() > 0 { + dump, err = os.OpenFile(ctx.Args().Get(0), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + return err + } + defer dump.Close() + } + dump.WriteString(comment) + dump.Write(out) + return nil } diff --git a/cmd/geth/consolecmd.go b/cmd/geth/consolecmd.go index 2500a969cf5e..d4443b328295 100644 --- a/cmd/geth/consolecmd.go +++ b/cmd/geth/consolecmd.go @@ -79,7 +79,7 @@ func localConsole(ctx *cli.Context) error { // Create and start the node based on the CLI flags node := makeFullNode(ctx) startNode(ctx, node) - defer node.Stop() + defer node.Close() // Attach to the newly started node and start the JavaScript console client, err := node.Attach() @@ -180,7 +180,7 @@ func ephemeralConsole(ctx *cli.Context) error { // Create and start the node based on the CLI flags node := makeFullNode(ctx) startNode(ctx, node) - defer node.Stop() + defer node.Close() // Attach to the newly started node and start the JavaScript console client, err := node.Attach() diff --git a/cmd/geth/consolecmd_test.go b/cmd/geth/consolecmd_test.go index 34ba877020c0..4360451195b1 100644 --- a/cmd/geth/consolecmd_test.go +++ b/cmd/geth/consolecmd_test.go @@ -50,7 +50,7 @@ func TestConsoleWelcome(t *testing.T) { geth.SetTemplateFunc("goos", func() string { return runtime.GOOS }) geth.SetTemplateFunc("goarch", func() string { return runtime.GOARCH }) geth.SetTemplateFunc("gover", runtime.Version) - geth.SetTemplateFunc("gethver", func() string { return params.VersionWithMeta }) + geth.SetTemplateFunc("gethver", func() string { return params.VersionWithCommit("", "") }) geth.SetTemplateFunc("niltime", func() string { return time.Unix(0, 0).Format(time.RFC1123) }) geth.SetTemplateFunc("apis", func() string { return ipcAPIs }) @@ -133,7 +133,7 @@ func testAttachWelcome(t *testing.T, geth *testgeth, endpoint, apis string) { attach.SetTemplateFunc("goos", func() string { return runtime.GOOS }) attach.SetTemplateFunc("goarch", func() string { return runtime.GOARCH }) attach.SetTemplateFunc("gover", runtime.Version) - attach.SetTemplateFunc("gethver", func() string { return params.VersionWithMeta }) + attach.SetTemplateFunc("gethver", func() string { return params.VersionWithCommit("", "") }) attach.SetTemplateFunc("etherbase", func() string { return geth.Etherbase }) attach.SetTemplateFunc("niltime", func() string { return time.Unix(0, 0).Format(time.RFC1123) }) attach.SetTemplateFunc("ipc", func() bool { return strings.HasPrefix(endpoint, "ipc") }) diff --git a/cmd/geth/dao_test.go b/cmd/geth/dao_test.go index 52983ff2af2c..cb06038ec8bc 100644 --- a/cmd/geth/dao_test.go +++ b/cmd/geth/dao_test.go @@ -25,7 +25,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/rawdb" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" ) @@ -121,7 +120,7 @@ func testDAOForkBlockNewChain(t *testing.T, test int, genesis string, expectBloc } // Retrieve the DAO config flag from the database path := filepath.Join(datadir, "geth", "chaindata") - db, err := ethdb.NewLDBDatabase(path, 0, 0) + db, err := rawdb.NewLevelDBDatabase(path, 0, 0, "") if err != nil { t.Fatalf("test %d: failed to open test database: %v", test, err) } diff --git a/cmd/geth/main.go b/cmd/geth/main.go index fae4b5718191..5ae358d52d20 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -32,14 +32,17 @@ import ( "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/console" "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/internal/debug" + "github.com/ethereum/go-ethereum/les" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/node" - "gopkg.in/urfave/cli.v1" + cli "gopkg.in/urfave/cli.v1" ) const ( @@ -49,8 +52,9 @@ const ( var ( // Git SHA1 commit hash of the release (set via linker flags) gitCommit = "" + gitDate = "" // The app that holds all commands and flags. - app = utils.NewApp(gitCommit, "the go-ethereum command line interface") + app = utils.NewApp(gitCommit, gitDate, "the go-ethereum command line interface") // flags that configure the node nodeFlags = []cli.Flag{ utils.IdentityFlag, @@ -60,8 +64,11 @@ var ( utils.BootnodesV4Flag, utils.BootnodesV5Flag, utils.DataDirFlag, + utils.AncientFlag, utils.KeyStoreDirFlag, + utils.ExternalSignerFlag, utils.NoUSBFlag, + utils.SmartCardDaemonPathFlag, utils.DashboardEnabledFlag, utils.DashboardAddrFlag, utils.DashboardPortFlag, @@ -84,14 +91,24 @@ var ( utils.TxPoolGlobalQueueFlag, utils.TxPoolLifetimeFlag, utils.SyncModeFlag, + utils.ExitWhenSyncedFlag, utils.GCModeFlag, - utils.LightServFlag, - utils.LightPeersFlag, + utils.LightServeFlag, + utils.LightLegacyServFlag, + utils.LightIngressFlag, + utils.LightEgressFlag, + utils.LightMaxPeersFlag, + utils.LightLegacyPeersFlag, utils.LightKDFFlag, + utils.UltraLightServersFlag, + utils.UltraLightFractionFlag, + utils.UltraLightOnlyAnnounceFlag, + utils.WhitelistFlag, utils.CacheFlag, utils.CacheDatabaseFlag, + utils.CacheTrieFlag, utils.CacheGCFlag, - utils.TrieCacheGenFlag, + utils.CacheNoPrefetchFlag, utils.ListenPortFlag, utils.MaxPeersFlag, utils.MaxPendingPeersFlag, @@ -120,12 +137,10 @@ var ( utils.DeveloperPeriodFlag, utils.TestnetFlag, utils.RinkebyFlag, + utils.GoerliFlag, utils.VMEnableDebugFlag, utils.NetworkIdFlag, - utils.RPCCORSDomainFlag, - utils.RPCVirtualHostsFlag, utils.EthStatsURLFlag, - utils.MetricsEnabledFlag, utils.FakePoWFlag, utils.NoCompactionFlag, utils.GpoBlocksFlag, @@ -139,6 +154,13 @@ var ( utils.RPCEnabledFlag, utils.RPCListenAddrFlag, utils.RPCPortFlag, + utils.RPCCORSDomainFlag, + utils.RPCVirtualHostsFlag, + utils.GraphQLEnabledFlag, + utils.GraphQLListenAddrFlag, + utils.GraphQLPortFlag, + utils.GraphQLCORSDomainFlag, + utils.GraphQLVirtualHostsFlag, utils.RPCApiFlag, utils.WSEnabledFlag, utils.WSListenAddrFlag, @@ -147,6 +169,8 @@ var ( utils.WSAllowedOriginsFlag, utils.IPCDisabledFlag, utils.IPCPathFlag, + utils.InsecureUnlockAllowedFlag, + utils.RPCGlobalGasCap, } whisperFlags = []cli.Flag{ @@ -157,12 +181,14 @@ var ( } metricsFlags = []cli.Flag{ + utils.MetricsEnabledFlag, + utils.MetricsEnabledExpensiveFlag, utils.MetricsEnableInfluxDBFlag, utils.MetricsInfluxDBEndpointFlag, utils.MetricsInfluxDBDatabaseFlag, utils.MetricsInfluxDBUsernameFlag, utils.MetricsInfluxDBPasswordFlag, - utils.MetricsInfluxDBHostTagFlag, + utils.MetricsInfluxDBTagsFlag, } ) @@ -170,7 +196,7 @@ func init() { // Initialize the CLI app and start Geth app.Action = geth app.HideVersion = true // we have a command to print the version - app.Copyright = "Copyright 2013-2018 The go-ethereum Authors" + app.Copyright = "Copyright 2013-2019 The go-ethereum Authors" app.Commands = []cli.Command{ // See chaincmd.go: initCommand, @@ -181,8 +207,7 @@ func init() { copydbCommand, removedbCommand, dumpCommand, - // See monitorcmd.go: - monitorCommand, + inspectCommand, // See accountcmd.go: accountCommand, walletCommand, @@ -194,10 +219,11 @@ func init() { makecacheCommand, makedagCommand, versionCommand, - bugCommand, licenseCommand, // See config.go dumpConfigCommand, + // See retesteth.go + retestethCommand, } sort.Sort(cli.CommandsByName(app.Commands)) @@ -209,8 +235,6 @@ func init() { app.Flags = append(app.Flags, metricsFlags...) app.Before = func(ctx *cli.Context) error { - runtime.GOMAXPROCS(runtime.NumCPU()) - logdir := "" if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) { logdir = (&node.Config{DataDir: utils.MakeDataDir(ctx)}).ResolvePath("logs") @@ -218,13 +242,31 @@ func init() { if err := debug.Setup(ctx, logdir); err != nil { return err } + // If we're a full node on mainnet without --cache specified, bump default cache allowance + if ctx.GlobalString(utils.SyncModeFlag.Name) != "light" && !ctx.GlobalIsSet(utils.CacheFlag.Name) && !ctx.GlobalIsSet(utils.NetworkIdFlag.Name) { + // Make sure we're not on any supported preconfigured testnet either + if !ctx.GlobalIsSet(utils.TestnetFlag.Name) && !ctx.GlobalIsSet(utils.RinkebyFlag.Name) && !ctx.GlobalIsSet(utils.GoerliFlag.Name) && !ctx.GlobalIsSet(utils.DeveloperFlag.Name) { + // Nope, we're really on mainnet. Bump that cache up! + log.Info("Bumping default cache on mainnet", "provided", ctx.GlobalInt(utils.CacheFlag.Name), "updated", 4096) + ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(4096)) + } + } + // If we're running a light client on any network, drop the cache to some meaningfully low amount + if ctx.GlobalString(utils.SyncModeFlag.Name) == "light" && !ctx.GlobalIsSet(utils.CacheFlag.Name) { + log.Info("Dropping default light client cache", "provided", ctx.GlobalInt(utils.CacheFlag.Name), "updated", 128) + ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(128)) + } // Cap the cache allowance and tune the garbage collector var mem gosigar.Mem - if err := mem.Get(); err == nil { - allowance := int(mem.Total / 1024 / 1024 / 3) - if cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance { - log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance) - ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance)) + // Workaround until OpenBSD support lands into gosigar + // Check https://github.com/elastic/gosigar#supported-platforms + if runtime.GOOS != "openbsd" { + if err := mem.Get(); err == nil { + allowance := int(mem.Total / 1024 / 1024 / 3) + if cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance { + log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance) + ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance)) + } } } // Ensure Go's GC ignores the database cache for trigger percentage @@ -265,6 +307,7 @@ func geth(ctx *cli.Context) error { return fmt.Errorf("invalid command: %q", args[0]) } node := makeFullNode(ctx) + defer node.Close() startNode(ctx, node) node.Wait() return nil @@ -280,27 +323,39 @@ func startNode(ctx *cli.Context, stack *node.Node) { utils.StartNode(stack) // Unlock any account specifically requested - ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) + unlockAccounts(ctx, stack) - passwords := utils.MakePasswordList(ctx) - unlocks := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ",") - for i, account := range unlocks { - if trimmed := strings.TrimSpace(account); trimmed != "" { - unlockAccount(ctx, ks, trimmed, i, passwords) - } - } // Register wallet event handlers to open and auto-derive wallets events := make(chan accounts.WalletEvent, 16) stack.AccountManager().Subscribe(events) - go func() { - // Create a chain state reader for self-derivation - rpcClient, err := stack.Attach() - if err != nil { - utils.Fatalf("Failed to attach to self: %v", err) + // Create a client to interact with local geth node. + rpcClient, err := stack.Attach() + if err != nil { + utils.Fatalf("Failed to attach to self: %v", err) + } + ethClient := ethclient.NewClient(rpcClient) + + // Set contract backend for ethereum service if local node + // is serving LES requests. + if ctx.GlobalInt(utils.LightLegacyServFlag.Name) > 0 || ctx.GlobalInt(utils.LightServeFlag.Name) > 0 { + var ethService *eth.Ethereum + if err := stack.Service(ðService); err != nil { + utils.Fatalf("Failed to retrieve ethereum service: %v", err) + } + ethService.SetContractBackend(ethClient) + } + // Set contract backend for les service if local node is + // running as a light client. + if ctx.GlobalString(utils.SyncModeFlag.Name) == "light" { + var lesService *les.LightEthereum + if err := stack.Service(&lesService); err != nil { + utils.Fatalf("Failed to retrieve light ethereum service: %v", err) } - stateReader := ethclient.NewClient(rpcClient) + lesService.SetContractBackend(ethClient) + } + go func() { // Open any wallets already attached for _, wallet := range stack.AccountManager().Wallets() { if err := wallet.Open(""); err != nil { @@ -318,11 +373,13 @@ func startNode(ctx *cli.Context, stack *node.Node) { status, _ := event.Wallet.Status() log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", status) - derivationPath := accounts.DefaultBaseDerivationPath + var derivationPaths []accounts.DerivationPath if event.Wallet.URL().Scheme == "ledger" { - derivationPath = accounts.DefaultLedgerBaseDerivationPath + derivationPaths = append(derivationPaths, accounts.LegacyLedgerBaseDerivationPath) } - event.Wallet.SelfDerive(derivationPath, stateReader) + derivationPaths = append(derivationPaths, accounts.DefaultBaseDerivationPath) + + event.Wallet.SelfDerive(derivationPaths, ethClient) case accounts.WalletDropped: log.Info("Old wallet dropped", "url", event.Wallet.URL()) @@ -330,6 +387,31 @@ func startNode(ctx *cli.Context, stack *node.Node) { } } }() + + // Spawn a standalone goroutine for status synchronization monitoring, + // close the node when synchronization is complete if user required. + if ctx.GlobalBool(utils.ExitWhenSyncedFlag.Name) { + go func() { + sub := stack.EventMux().Subscribe(downloader.DoneEvent{}) + defer sub.Unsubscribe() + for { + event := <-sub.Chan() + if event == nil { + continue + } + done, ok := event.Data.(downloader.DoneEvent) + if !ok { + continue + } + if timestamp := time.Unix(int64(done.Latest.Time), 0); time.Since(timestamp) < 10*time.Minute { + log.Info("Synchronisation completed", "latestnum", done.Latest.Number, "latesthash", done.Latest.Hash(), + "age", common.PrettyAge(timestamp)) + stack.Stop() + } + } + }() + } + // Start auxiliary services if enabled if ctx.GlobalBool(utils.MiningEnabledFlag.Name) || ctx.GlobalBool(utils.DeveloperFlag.Name) { // Mining only makes sense if a full Ethereum node is running @@ -356,3 +438,28 @@ func startNode(ctx *cli.Context, stack *node.Node) { } } } + +// unlockAccounts unlocks any account specifically requested. +func unlockAccounts(ctx *cli.Context, stack *node.Node) { + var unlocks []string + inputs := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ",") + for _, input := range inputs { + if trimmed := strings.TrimSpace(input); trimmed != "" { + unlocks = append(unlocks, trimmed) + } + } + // Short circuit if there is no account to unlock. + if len(unlocks) == 0 { + return + } + // If insecure account unlocking is not allowed if node's APIs are exposed to external. + // Print warning log to user and skip unlocking. + if !stack.Config().InsecureUnlockAllowed && stack.Config().ExtRPCEnabled() { + utils.Fatalf("Account unlock with HTTP access is forbidden!") + } + ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) + passwords := utils.MakePasswordList(ctx) + for i, account := range unlocks { + unlockAccount(ks, account, i, passwords) + } +} diff --git a/cmd/geth/misccmd.go b/cmd/geth/misccmd.go index f62e254786d5..39ca47872bad 100644 --- a/cmd/geth/misccmd.go +++ b/cmd/geth/misccmd.go @@ -112,6 +112,9 @@ func version(ctx *cli.Context) error { if gitCommit != "" { fmt.Println("Git Commit:", gitCommit) } + if gitDate != "" { + fmt.Println("Git Commit Date:", gitDate) + } fmt.Println("Architecture:", runtime.GOARCH) fmt.Println("Protocol Versions:", eth.ProtocolVersions) fmt.Println("Network Id:", eth.DefaultConfig.NetworkId) diff --git a/cmd/geth/monitorcmd.go b/cmd/geth/monitorcmd.go deleted file mode 100644 index e4ba96a7a681..000000000000 --- a/cmd/geth/monitorcmd.go +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "fmt" - "math" - "reflect" - "runtime" - "sort" - "strings" - "time" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rpc" - "github.com/gizak/termui" - "gopkg.in/urfave/cli.v1" -) - -var ( - monitorCommandAttachFlag = cli.StringFlag{ - Name: "attach", - Value: node.DefaultIPCEndpoint(clientIdentifier), - Usage: "API endpoint to attach to", - } - monitorCommandRowsFlag = cli.IntFlag{ - Name: "rows", - Value: 5, - Usage: "Maximum rows in the chart grid", - } - monitorCommandRefreshFlag = cli.IntFlag{ - Name: "refresh", - Value: 3, - Usage: "Refresh interval in seconds", - } - monitorCommand = cli.Command{ - Action: utils.MigrateFlags(monitor), // keep track of migration progress - Name: "monitor", - Usage: "Monitor and visualize node metrics", - ArgsUsage: " ", - Category: "MONITOR COMMANDS", - Description: ` -The Geth monitor is a tool to collect and visualize various internal metrics -gathered by the node, supporting different chart types as well as the capacity -to display multiple metrics simultaneously. -`, - Flags: []cli.Flag{ - monitorCommandAttachFlag, - monitorCommandRowsFlag, - monitorCommandRefreshFlag, - }, - } -) - -// monitor starts a terminal UI based monitoring tool for the requested metrics. -func monitor(ctx *cli.Context) error { - var ( - client *rpc.Client - err error - ) - // Attach to an Ethereum node over IPC or RPC - endpoint := ctx.String(monitorCommandAttachFlag.Name) - if client, err = dialRPC(endpoint); err != nil { - utils.Fatalf("Unable to attach to geth node: %v", err) - } - defer client.Close() - - // Retrieve all the available metrics and resolve the user pattens - metrics, err := retrieveMetrics(client) - if err != nil { - utils.Fatalf("Failed to retrieve system metrics: %v", err) - } - monitored := resolveMetrics(metrics, ctx.Args()) - if len(monitored) == 0 { - list := expandMetrics(metrics, "") - sort.Strings(list) - - if len(list) > 0 { - utils.Fatalf("No metrics specified.\n\nAvailable:\n - %s", strings.Join(list, "\n - ")) - } else { - utils.Fatalf("No metrics collected by geth (--%s).\n", utils.MetricsEnabledFlag.Name) - } - } - sort.Strings(monitored) - if cols := len(monitored) / ctx.Int(monitorCommandRowsFlag.Name); cols > 6 { - utils.Fatalf("Requested metrics (%d) spans more that 6 columns:\n - %s", len(monitored), strings.Join(monitored, "\n - ")) - } - // Create and configure the chart UI defaults - if err := termui.Init(); err != nil { - utils.Fatalf("Unable to initialize terminal UI: %v", err) - } - defer termui.Close() - - rows := len(monitored) - if max := ctx.Int(monitorCommandRowsFlag.Name); rows > max { - rows = max - } - cols := (len(monitored) + rows - 1) / rows - for i := 0; i < rows; i++ { - termui.Body.AddRows(termui.NewRow()) - } - // Create each individual data chart - footer := termui.NewPar("") - footer.Block.Border = true - footer.Height = 3 - - charts := make([]*termui.LineChart, len(monitored)) - units := make([]int, len(monitored)) - data := make([][]float64, len(monitored)) - for i := 0; i < len(monitored); i++ { - charts[i] = createChart((termui.TermHeight() - footer.Height) / rows) - row := termui.Body.Rows[i%rows] - row.Cols = append(row.Cols, termui.NewCol(12/cols, 0, charts[i])) - } - termui.Body.AddRows(termui.NewRow(termui.NewCol(12, 0, footer))) - - refreshCharts(client, monitored, data, units, charts, ctx, footer) - termui.Body.Align() - termui.Render(termui.Body) - - // Watch for various system events, and periodically refresh the charts - termui.Handle("/sys/kbd/C-c", func(termui.Event) { - termui.StopLoop() - }) - termui.Handle("/sys/wnd/resize", func(termui.Event) { - termui.Body.Width = termui.TermWidth() - for _, chart := range charts { - chart.Height = (termui.TermHeight() - footer.Height) / rows - } - termui.Body.Align() - termui.Render(termui.Body) - }) - go func() { - tick := time.NewTicker(time.Duration(ctx.Int(monitorCommandRefreshFlag.Name)) * time.Second) - for range tick.C { - if refreshCharts(client, monitored, data, units, charts, ctx, footer) { - termui.Body.Align() - } - termui.Render(termui.Body) - } - }() - termui.Loop() - return nil -} - -// retrieveMetrics contacts the attached geth node and retrieves the entire set -// of collected system metrics. -func retrieveMetrics(client *rpc.Client) (map[string]interface{}, error) { - var metrics map[string]interface{} - err := client.Call(&metrics, "debug_metrics", true) - return metrics, err -} - -// resolveMetrics takes a list of input metric patterns, and resolves each to one -// or more canonical metric names. -func resolveMetrics(metrics map[string]interface{}, patterns []string) []string { - res := []string{} - for _, pattern := range patterns { - res = append(res, resolveMetric(metrics, pattern, "")...) - } - return res -} - -// resolveMetrics takes a single of input metric pattern, and resolves it to one -// or more canonical metric names. -func resolveMetric(metrics map[string]interface{}, pattern string, path string) []string { - results := []string{} - - // If a nested metric was requested, recurse optionally branching (via comma) - parts := strings.SplitN(pattern, "/", 2) - if len(parts) > 1 { - for _, variation := range strings.Split(parts[0], ",") { - submetrics, ok := metrics[variation].(map[string]interface{}) - if !ok { - utils.Fatalf("Failed to retrieve system metrics: %s", path+variation) - return nil - } - results = append(results, resolveMetric(submetrics, parts[1], path+variation+"/")...) - } - return results - } - // Depending what the last link is, return or expand - for _, variation := range strings.Split(pattern, ",") { - switch metric := metrics[variation].(type) { - case float64: - // Final metric value found, return as singleton - results = append(results, path+variation) - - case map[string]interface{}: - results = append(results, expandMetrics(metric, path+variation+"/")...) - - default: - utils.Fatalf("Metric pattern resolved to unexpected type: %v", reflect.TypeOf(metric)) - return nil - } - } - return results -} - -// expandMetrics expands the entire tree of metrics into a flat list of paths. -func expandMetrics(metrics map[string]interface{}, path string) []string { - // Iterate over all fields and expand individually - list := []string{} - for name, metric := range metrics { - switch metric := metric.(type) { - case float64: - // Final metric value found, append to list - list = append(list, path+name) - - case map[string]interface{}: - // Tree of metrics found, expand recursively - list = append(list, expandMetrics(metric, path+name+"/")...) - - default: - utils.Fatalf("Metric pattern %s resolved to unexpected type: %v", path+name, reflect.TypeOf(metric)) - return nil - } - } - return list -} - -// fetchMetric iterates over the metrics map and retrieves a specific one. -func fetchMetric(metrics map[string]interface{}, metric string) float64 { - parts := strings.Split(metric, "/") - for _, part := range parts[:len(parts)-1] { - var found bool - metrics, found = metrics[part].(map[string]interface{}) - if !found { - return 0 - } - } - if v, ok := metrics[parts[len(parts)-1]].(float64); ok { - return v - } - return 0 -} - -// refreshCharts retrieves a next batch of metrics, and inserts all the new -// values into the active datasets and charts -func refreshCharts(client *rpc.Client, metrics []string, data [][]float64, units []int, charts []*termui.LineChart, ctx *cli.Context, footer *termui.Par) (realign bool) { - values, err := retrieveMetrics(client) - for i, metric := range metrics { - if len(data) < 512 { - data[i] = append([]float64{fetchMetric(values, metric)}, data[i]...) - } else { - data[i] = append([]float64{fetchMetric(values, metric)}, data[i][:len(data[i])-1]...) - } - if updateChart(metric, data[i], &units[i], charts[i], err) { - realign = true - } - } - updateFooter(ctx, err, footer) - return -} - -// updateChart inserts a dataset into a line chart, scaling appropriately as to -// not display weird labels, also updating the chart label accordingly. -func updateChart(metric string, data []float64, base *int, chart *termui.LineChart, err error) (realign bool) { - dataUnits := []string{"", "K", "M", "G", "T", "E"} - timeUnits := []string{"ns", "µs", "ms", "s", "ks", "ms"} - colors := []termui.Attribute{termui.ColorBlue, termui.ColorCyan, termui.ColorGreen, termui.ColorYellow, termui.ColorRed, termui.ColorRed} - - // Extract only part of the data that's actually visible - if chart.Width*2 < len(data) { - data = data[:chart.Width*2] - } - // Find the maximum value and scale under 1K - high := 0.0 - if len(data) > 0 { - high = data[0] - for _, value := range data[1:] { - high = math.Max(high, value) - } - } - unit, scale := 0, 1.0 - for high >= 1000 && unit+1 < len(dataUnits) { - high, unit, scale = high/1000, unit+1, scale*1000 - } - // If the unit changes, re-create the chart (hack to set max height...) - if unit != *base { - realign, *base, *chart = true, unit, *createChart(chart.Height) - } - // Update the chart's data points with the scaled values - if cap(chart.Data) < len(data) { - chart.Data = make([]float64, len(data)) - } - chart.Data = chart.Data[:len(data)] - for i, value := range data { - chart.Data[i] = value / scale - } - // Update the chart's label with the scale units - units := dataUnits - if strings.Contains(metric, "/Percentiles/") || strings.Contains(metric, "/pauses/") || strings.Contains(metric, "/time/") { - units = timeUnits - } - chart.BorderLabel = metric - if len(units[unit]) > 0 { - chart.BorderLabel += " [" + units[unit] + "]" - } - chart.LineColor = colors[unit] | termui.AttrBold - if err != nil { - chart.LineColor = termui.ColorRed | termui.AttrBold - } - return -} - -// createChart creates an empty line chart with the default configs. -func createChart(height int) *termui.LineChart { - chart := termui.NewLineChart() - if runtime.GOOS == "windows" { - chart.Mode = "dot" - } - chart.DataLabels = []string{""} - chart.Height = height - chart.AxesColor = termui.ColorWhite - chart.PaddingBottom = -2 - - chart.BorderLabelFg = chart.BorderFg | termui.AttrBold - chart.BorderFg = chart.BorderBg - - return chart -} - -// updateFooter updates the footer contents based on any encountered errors. -func updateFooter(ctx *cli.Context, err error, footer *termui.Par) { - // Generate the basic footer - refresh := time.Duration(ctx.Int(monitorCommandRefreshFlag.Name)) * time.Second - footer.Text = fmt.Sprintf("Press Ctrl+C to quit. Refresh interval: %v.", refresh) - footer.TextFgColor = termui.ThemeAttr("par.fg") | termui.AttrBold - - // Append any encountered errors - if err != nil { - footer.Text = fmt.Sprintf("Error: %v.", err) - footer.TextFgColor = termui.ColorRed | termui.AttrBold - } -} diff --git a/cmd/geth/retesteth.go b/cmd/geth/retesteth.go new file mode 100644 index 000000000000..f20f2295acda --- /dev/null +++ b/cmd/geth/retesteth.go @@ -0,0 +1,891 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "bytes" + "context" + "fmt" + "math/big" + "os" + "os/signal" + "strings" + "time" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/consensus/misc" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/trie" + + cli "gopkg.in/urfave/cli.v1" +) + +var ( + rpcPortFlag = cli.IntFlag{ + Name: "rpcport", + Usage: "HTTP-RPC server listening port", + Value: node.DefaultHTTPPort, + } + retestethCommand = cli.Command{ + Action: utils.MigrateFlags(retesteth), + Name: "retesteth", + Usage: "Launches geth in retesteth mode", + ArgsUsage: "", + Flags: []cli.Flag{rpcPortFlag}, + Category: "MISCELLANEOUS COMMANDS", + Description: `Launches geth in retesteth mode (no database, no network, only retesteth RPC interface)`, + } +) + +type RetestethTestAPI interface { + SetChainParams(ctx context.Context, chainParams ChainParams) (bool, error) + MineBlocks(ctx context.Context, number uint64) (bool, error) + ModifyTimestamp(ctx context.Context, interval uint64) (bool, error) + ImportRawBlock(ctx context.Context, rawBlock hexutil.Bytes) (common.Hash, error) + RewindToBlock(ctx context.Context, number uint64) (bool, error) + GetLogHash(ctx context.Context, txHash common.Hash) (common.Hash, error) +} + +type RetestethEthAPI interface { + SendRawTransaction(ctx context.Context, rawTx hexutil.Bytes) (common.Hash, error) + BlockNumber(ctx context.Context) (uint64, error) + GetBlockByNumber(ctx context.Context, blockNr math.HexOrDecimal64, fullTx bool) (map[string]interface{}, error) + GetBalance(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (*math.HexOrDecimal256, error) + GetCode(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (hexutil.Bytes, error) + GetTransactionCount(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (uint64, error) +} + +type RetestethDebugAPI interface { + AccountRange(ctx context.Context, + blockHashOrNumber *math.HexOrDecimal256, txIndex uint64, + addressHash *math.HexOrDecimal256, maxResults uint64, + ) (AccountRangeResult, error) + StorageRangeAt(ctx context.Context, + blockHashOrNumber *math.HexOrDecimal256, txIndex uint64, + address common.Address, + begin *math.HexOrDecimal256, maxResults uint64, + ) (StorageRangeResult, error) +} + +type RetestWeb3API interface { + ClientVersion(ctx context.Context) (string, error) +} + +type RetestethAPI struct { + ethDb ethdb.Database + db state.Database + chainConfig *params.ChainConfig + author common.Address + extraData []byte + genesisHash common.Hash + engine *NoRewardEngine + blockchain *core.BlockChain + blockNumber uint64 + txMap map[common.Address]map[uint64]*types.Transaction // Sender -> Nonce -> Transaction + txSenders map[common.Address]struct{} // Set of transaction senders + blockInterval uint64 +} + +type ChainParams struct { + SealEngine string `json:"sealEngine"` + Params CParamsParams `json:"params"` + Genesis CParamsGenesis `json:"genesis"` + Accounts map[common.Address]CParamsAccount `json:"accounts"` +} + +type CParamsParams struct { + AccountStartNonce math.HexOrDecimal64 `json:"accountStartNonce"` + HomesteadForkBlock *math.HexOrDecimal64 `json:"homesteadForkBlock"` + EIP150ForkBlock *math.HexOrDecimal64 `json:"EIP150ForkBlock"` + EIP158ForkBlock *math.HexOrDecimal64 `json:"EIP158ForkBlock"` + DaoHardforkBlock *math.HexOrDecimal64 `json:"daoHardforkBlock"` + ByzantiumForkBlock *math.HexOrDecimal64 `json:"byzantiumForkBlock"` + ConstantinopleForkBlock *math.HexOrDecimal64 `json:"constantinopleForkBlock"` + ConstantinopleFixForkBlock *math.HexOrDecimal64 `json:"constantinopleFixForkBlock"` + ChainID *math.HexOrDecimal256 `json:"chainID"` + MaximumExtraDataSize math.HexOrDecimal64 `json:"maximumExtraDataSize"` + TieBreakingGas bool `json:"tieBreakingGas"` + MinGasLimit math.HexOrDecimal64 `json:"minGasLimit"` + MaxGasLimit math.HexOrDecimal64 `json:"maxGasLimit"` + GasLimitBoundDivisor math.HexOrDecimal64 `json:"gasLimitBoundDivisor"` + MinimumDifficulty math.HexOrDecimal256 `json:"minimumDifficulty"` + DifficultyBoundDivisor math.HexOrDecimal256 `json:"difficultyBoundDivisor"` + DurationLimit math.HexOrDecimal256 `json:"durationLimit"` + BlockReward math.HexOrDecimal256 `json:"blockReward"` + NetworkID math.HexOrDecimal256 `json:"networkID"` +} + +type CParamsGenesis struct { + Nonce math.HexOrDecimal64 `json:"nonce"` + Difficulty *math.HexOrDecimal256 `json:"difficulty"` + MixHash *math.HexOrDecimal256 `json:"mixHash"` + Author common.Address `json:"author"` + Timestamp math.HexOrDecimal64 `json:"timestamp"` + ParentHash common.Hash `json:"parentHash"` + ExtraData hexutil.Bytes `json:"extraData"` + GasLimit math.HexOrDecimal64 `json:"gasLimit"` +} + +type CParamsAccount struct { + Balance *math.HexOrDecimal256 `json:"balance"` + Precompiled *CPAccountPrecompiled `json:"precompiled"` + Code hexutil.Bytes `json:"code"` + Storage map[string]string `json:"storage"` + Nonce *math.HexOrDecimal64 `json:"nonce"` +} + +type CPAccountPrecompiled struct { + Name string `json:"name"` + StartingBlock math.HexOrDecimal64 `json:"startingBlock"` + Linear *CPAPrecompiledLinear `json:"linear"` +} + +type CPAPrecompiledLinear struct { + Base uint64 `json:"base"` + Word uint64 `json:"word"` +} + +type AccountRangeResult struct { + AddressMap map[common.Hash]common.Address `json:"addressMap"` + NextKey common.Hash `json:"nextKey"` +} + +type StorageRangeResult struct { + Complete bool `json:"complete"` + Storage map[common.Hash]SRItem `json:"storage"` +} + +type SRItem struct { + Key string `json:"key"` + Value string `json:"value"` +} + +type NoRewardEngine struct { + inner consensus.Engine + rewardsOn bool +} + +func (e *NoRewardEngine) Author(header *types.Header) (common.Address, error) { + return e.inner.Author(header) +} + +func (e *NoRewardEngine) VerifyHeader(chain consensus.ChainReader, header *types.Header, seal bool) error { + return e.inner.VerifyHeader(chain, header, seal) +} + +func (e *NoRewardEngine) VerifyHeaders(chain consensus.ChainReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error) { + return e.inner.VerifyHeaders(chain, headers, seals) +} + +func (e *NoRewardEngine) VerifyUncles(chain consensus.ChainReader, block *types.Block) error { + return e.inner.VerifyUncles(chain, block) +} + +func (e *NoRewardEngine) VerifySeal(chain consensus.ChainReader, header *types.Header) error { + return e.inner.VerifySeal(chain, header) +} + +func (e *NoRewardEngine) Prepare(chain consensus.ChainReader, header *types.Header) error { + return e.inner.Prepare(chain, header) +} + +func (e *NoRewardEngine) accumulateRewards(config *params.ChainConfig, state *state.StateDB, header *types.Header, uncles []*types.Header) { + // Simply touch miner and uncle coinbase accounts + reward := big.NewInt(0) + for _, uncle := range uncles { + state.AddBalance(uncle.Coinbase, reward) + } + state.AddBalance(header.Coinbase, reward) +} + +func (e *NoRewardEngine) Finalize(chain consensus.ChainReader, header *types.Header, statedb *state.StateDB, txs []*types.Transaction, + uncles []*types.Header) { + if e.rewardsOn { + e.inner.Finalize(chain, header, statedb, txs, uncles) + } else { + e.accumulateRewards(chain.Config(), statedb, header, uncles) + header.Root = statedb.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + } +} + +func (e *NoRewardEngine) FinalizeAndAssemble(chain consensus.ChainReader, header *types.Header, statedb *state.StateDB, txs []*types.Transaction, + uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { + if e.rewardsOn { + return e.inner.FinalizeAndAssemble(chain, header, statedb, txs, uncles, receipts) + } else { + e.accumulateRewards(chain.Config(), statedb, header, uncles) + header.Root = statedb.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + + // Header seems complete, assemble into a block and return + return types.NewBlock(header, txs, uncles, receipts), nil + } +} + +func (e *NoRewardEngine) Seal(chain consensus.ChainReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error { + return e.inner.Seal(chain, block, results, stop) +} + +func (e *NoRewardEngine) SealHash(header *types.Header) common.Hash { + return e.inner.SealHash(header) +} + +func (e *NoRewardEngine) CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Header) *big.Int { + return e.inner.CalcDifficulty(chain, time, parent) +} + +func (e *NoRewardEngine) APIs(chain consensus.ChainReader) []rpc.API { + return e.inner.APIs(chain) +} + +func (e *NoRewardEngine) Close() error { + return e.inner.Close() +} + +func (api *RetestethAPI) SetChainParams(ctx context.Context, chainParams ChainParams) (bool, error) { + // Clean up + if api.blockchain != nil { + api.blockchain.Stop() + } + if api.engine != nil { + api.engine.Close() + } + if api.ethDb != nil { + api.ethDb.Close() + } + ethDb := rawdb.NewMemoryDatabase() + accounts := make(core.GenesisAlloc) + for address, account := range chainParams.Accounts { + balance := big.NewInt(0) + if account.Balance != nil { + balance.Set((*big.Int)(account.Balance)) + } + var nonce uint64 + if account.Nonce != nil { + nonce = uint64(*account.Nonce) + } + if account.Precompiled == nil || account.Balance != nil { + storage := make(map[common.Hash]common.Hash) + for k, v := range account.Storage { + storage[common.HexToHash(k)] = common.HexToHash(v) + } + accounts[address] = core.GenesisAccount{ + Balance: balance, + Code: account.Code, + Nonce: nonce, + Storage: storage, + } + } + } + chainId := big.NewInt(1) + if chainParams.Params.ChainID != nil { + chainId.Set((*big.Int)(chainParams.Params.ChainID)) + } + var ( + homesteadBlock *big.Int + daoForkBlock *big.Int + eip150Block *big.Int + eip155Block *big.Int + eip158Block *big.Int + byzantiumBlock *big.Int + constantinopleBlock *big.Int + petersburgBlock *big.Int + ) + if chainParams.Params.HomesteadForkBlock != nil { + homesteadBlock = big.NewInt(int64(*chainParams.Params.HomesteadForkBlock)) + } + if chainParams.Params.DaoHardforkBlock != nil { + daoForkBlock = big.NewInt(int64(*chainParams.Params.DaoHardforkBlock)) + } + if chainParams.Params.EIP150ForkBlock != nil { + eip150Block = big.NewInt(int64(*chainParams.Params.EIP150ForkBlock)) + } + if chainParams.Params.EIP158ForkBlock != nil { + eip158Block = big.NewInt(int64(*chainParams.Params.EIP158ForkBlock)) + eip155Block = eip158Block + } + if chainParams.Params.ByzantiumForkBlock != nil { + byzantiumBlock = big.NewInt(int64(*chainParams.Params.ByzantiumForkBlock)) + } + if chainParams.Params.ConstantinopleForkBlock != nil { + constantinopleBlock = big.NewInt(int64(*chainParams.Params.ConstantinopleForkBlock)) + } + if chainParams.Params.ConstantinopleFixForkBlock != nil { + petersburgBlock = big.NewInt(int64(*chainParams.Params.ConstantinopleFixForkBlock)) + } + if constantinopleBlock != nil && petersburgBlock == nil { + petersburgBlock = big.NewInt(100000000000) + } + genesis := &core.Genesis{ + Config: ¶ms.ChainConfig{ + ChainID: chainId, + HomesteadBlock: homesteadBlock, + DAOForkBlock: daoForkBlock, + DAOForkSupport: false, + EIP150Block: eip150Block, + EIP155Block: eip155Block, + EIP158Block: eip158Block, + ByzantiumBlock: byzantiumBlock, + ConstantinopleBlock: constantinopleBlock, + PetersburgBlock: petersburgBlock, + }, + Nonce: uint64(chainParams.Genesis.Nonce), + Timestamp: uint64(chainParams.Genesis.Timestamp), + ExtraData: chainParams.Genesis.ExtraData, + GasLimit: uint64(chainParams.Genesis.GasLimit), + Difficulty: big.NewInt(0).Set((*big.Int)(chainParams.Genesis.Difficulty)), + Mixhash: common.BigToHash((*big.Int)(chainParams.Genesis.MixHash)), + Coinbase: chainParams.Genesis.Author, + ParentHash: chainParams.Genesis.ParentHash, + Alloc: accounts, + } + chainConfig, genesisHash, err := core.SetupGenesisBlock(ethDb, genesis) + if err != nil { + return false, err + } + fmt.Printf("Chain config: %v\n", chainConfig) + + var inner consensus.Engine + switch chainParams.SealEngine { + case "NoProof", "NoReward": + inner = ethash.NewFaker() + case "Ethash": + inner = ethash.New(ethash.Config{ + CacheDir: "ethash", + CachesInMem: 2, + CachesOnDisk: 3, + DatasetsInMem: 1, + DatasetsOnDisk: 2, + }, nil, false) + default: + return false, fmt.Errorf("unrecognised seal engine: %s", chainParams.SealEngine) + } + engine := &NoRewardEngine{inner: inner, rewardsOn: chainParams.SealEngine != "NoReward"} + + blockchain, err := core.NewBlockChain(ethDb, nil, chainConfig, engine, vm.Config{}, nil) + if err != nil { + return false, err + } + + api.chainConfig = chainConfig + api.genesisHash = genesisHash + api.author = chainParams.Genesis.Author + api.extraData = chainParams.Genesis.ExtraData + api.ethDb = ethDb + api.engine = engine + api.blockchain = blockchain + api.db = state.NewDatabase(api.ethDb) + api.blockNumber = 0 + api.txMap = make(map[common.Address]map[uint64]*types.Transaction) + api.txSenders = make(map[common.Address]struct{}) + api.blockInterval = 0 + return true, nil +} + +func (api *RetestethAPI) SendRawTransaction(ctx context.Context, rawTx hexutil.Bytes) (common.Hash, error) { + tx := new(types.Transaction) + if err := rlp.DecodeBytes(rawTx, tx); err != nil { + // Return nil is not by mistake - some tests include sending transaction where gasLimit overflows uint64 + return common.Hash{}, nil + } + signer := types.MakeSigner(api.chainConfig, big.NewInt(int64(api.blockNumber))) + sender, err := types.Sender(signer, tx) + if err != nil { + return common.Hash{}, err + } + if nonceMap, ok := api.txMap[sender]; ok { + nonceMap[tx.Nonce()] = tx + } else { + nonceMap = make(map[uint64]*types.Transaction) + nonceMap[tx.Nonce()] = tx + api.txMap[sender] = nonceMap + } + api.txSenders[sender] = struct{}{} + return tx.Hash(), nil +} + +func (api *RetestethAPI) MineBlocks(ctx context.Context, number uint64) (bool, error) { + for i := 0; i < int(number); i++ { + if err := api.mineBlock(); err != nil { + return false, err + } + } + fmt.Printf("Mined %d blocks\n", number) + return true, nil +} + +func (api *RetestethAPI) mineBlock() error { + parentHash := rawdb.ReadCanonicalHash(api.ethDb, api.blockNumber) + parent := rawdb.ReadBlock(api.ethDb, parentHash, api.blockNumber) + var timestamp uint64 + if api.blockInterval == 0 { + timestamp = uint64(time.Now().Unix()) + } else { + timestamp = parent.Time() + api.blockInterval + } + gasLimit := core.CalcGasLimit(parent, 9223372036854775807, 9223372036854775807) + header := &types.Header{ + ParentHash: parent.Hash(), + Number: big.NewInt(int64(api.blockNumber + 1)), + GasLimit: gasLimit, + Extra: api.extraData, + Time: timestamp, + } + header.Coinbase = api.author + if api.engine != nil { + api.engine.Prepare(api.blockchain, header) + } + // If we are care about TheDAO hard-fork check whether to override the extra-data or not + if daoBlock := api.chainConfig.DAOForkBlock; daoBlock != nil { + // Check whether the block is among the fork extra-override range + limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange) + if header.Number.Cmp(daoBlock) >= 0 && header.Number.Cmp(limit) < 0 { + // Depending whether we support or oppose the fork, override differently + if api.chainConfig.DAOForkSupport { + header.Extra = common.CopyBytes(params.DAOForkBlockExtra) + } else if bytes.Equal(header.Extra, params.DAOForkBlockExtra) { + header.Extra = []byte{} // If miner opposes, don't let it use the reserved extra-data + } + } + } + statedb, err := api.blockchain.StateAt(parent.Root()) + if err != nil { + return err + } + if api.chainConfig.DAOForkSupport && api.chainConfig.DAOForkBlock != nil && api.chainConfig.DAOForkBlock.Cmp(header.Number) == 0 { + misc.ApplyDAOHardFork(statedb) + } + gasPool := new(core.GasPool).AddGas(header.GasLimit) + txCount := 0 + var txs []*types.Transaction + var receipts []*types.Receipt + var coalescedLogs []*types.Log + var blockFull = gasPool.Gas() < params.TxGas + for address := range api.txSenders { + if blockFull { + break + } + m := api.txMap[address] + for nonce := statedb.GetNonce(address); ; nonce++ { + if tx, ok := m[nonce]; ok { + // Try to apply transactions to the state + statedb.Prepare(tx.Hash(), common.Hash{}, txCount) + snap := statedb.Snapshot() + + receipt, _, err := core.ApplyTransaction( + api.chainConfig, + api.blockchain, + &api.author, + gasPool, + statedb, + header, tx, &header.GasUsed, *api.blockchain.GetVMConfig(), + ) + if err != nil { + statedb.RevertToSnapshot(snap) + break + } + txs = append(txs, tx) + receipts = append(receipts, receipt) + coalescedLogs = append(coalescedLogs, receipt.Logs...) + delete(m, nonce) + if len(m) == 0 { + // Last tx for the sender + delete(api.txMap, address) + delete(api.txSenders, address) + } + txCount++ + if gasPool.Gas() < params.TxGas { + blockFull = true + break + } + } else { + break // Gap in the nonces + } + } + } + block, err := api.engine.FinalizeAndAssemble(api.blockchain, header, statedb, txs, []*types.Header{}, receipts) + if err != nil { + return err + } + return api.importBlock(block) +} + +func (api *RetestethAPI) importBlock(block *types.Block) error { + if _, err := api.blockchain.InsertChain([]*types.Block{block}); err != nil { + return err + } + api.blockNumber = block.NumberU64() + fmt.Printf("Imported block %d\n", block.NumberU64()) + return nil +} + +func (api *RetestethAPI) ModifyTimestamp(ctx context.Context, interval uint64) (bool, error) { + api.blockInterval = interval + return true, nil +} + +func (api *RetestethAPI) ImportRawBlock(ctx context.Context, rawBlock hexutil.Bytes) (common.Hash, error) { + block := new(types.Block) + if err := rlp.DecodeBytes(rawBlock, block); err != nil { + return common.Hash{}, err + } + fmt.Printf("Importing block %d with parent hash: %x, genesisHash: %x\n", block.NumberU64(), block.ParentHash(), api.genesisHash) + if err := api.importBlock(block); err != nil { + return common.Hash{}, err + } + return block.Hash(), nil +} + +func (api *RetestethAPI) RewindToBlock(ctx context.Context, newHead uint64) (bool, error) { + if err := api.blockchain.SetHead(newHead); err != nil { + return false, err + } + api.blockNumber = newHead + return true, nil +} + +var emptyListHash common.Hash = common.HexToHash("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347") + +func (api *RetestethAPI) GetLogHash(ctx context.Context, txHash common.Hash) (common.Hash, error) { + receipt, _, _, _ := rawdb.ReadReceipt(api.ethDb, txHash, api.chainConfig) + if receipt == nil { + return emptyListHash, nil + } else { + if logListRlp, err := rlp.EncodeToBytes(receipt.Logs); err != nil { + return common.Hash{}, err + } else { + return common.BytesToHash(crypto.Keccak256(logListRlp)), nil + } + } +} + +func (api *RetestethAPI) BlockNumber(ctx context.Context) (uint64, error) { + //fmt.Printf("BlockNumber, response: %d\n", api.blockNumber) + return api.blockNumber, nil +} + +func (api *RetestethAPI) GetBlockByNumber(ctx context.Context, blockNr math.HexOrDecimal64, fullTx bool) (map[string]interface{}, error) { + block := api.blockchain.GetBlockByNumber(uint64(blockNr)) + if block != nil { + response, err := RPCMarshalBlock(block, true, fullTx) + if err != nil { + return nil, err + } + response["author"] = response["miner"] + response["totalDifficulty"] = (*hexutil.Big)(api.blockchain.GetTd(block.Hash(), uint64(blockNr))) + return response, err + } + return nil, fmt.Errorf("block %d not found", blockNr) +} + +func (api *RetestethAPI) AccountRange(ctx context.Context, + blockHashOrNumber *math.HexOrDecimal256, txIndex uint64, + addressHash *math.HexOrDecimal256, maxResults uint64, +) (AccountRangeResult, error) { + var ( + header *types.Header + block *types.Block + ) + if (*big.Int)(blockHashOrNumber).Cmp(big.NewInt(math.MaxInt64)) > 0 { + blockHash := common.BigToHash((*big.Int)(blockHashOrNumber)) + header = api.blockchain.GetHeaderByHash(blockHash) + block = api.blockchain.GetBlockByHash(blockHash) + //fmt.Printf("Account range: %x, txIndex %d, start: %x, maxResults: %d\n", blockHash, txIndex, common.BigToHash((*big.Int)(addressHash)), maxResults) + } else { + blockNumber := (*big.Int)(blockHashOrNumber).Uint64() + header = api.blockchain.GetHeaderByNumber(blockNumber) + block = api.blockchain.GetBlockByNumber(blockNumber) + //fmt.Printf("Account range: %d, txIndex %d, start: %x, maxResults: %d\n", blockNumber, txIndex, common.BigToHash((*big.Int)(addressHash)), maxResults) + } + parentHeader := api.blockchain.GetHeaderByHash(header.ParentHash) + var root common.Hash + var statedb *state.StateDB + var err error + if parentHeader == nil || int(txIndex) >= len(block.Transactions()) { + root = header.Root + statedb, err = api.blockchain.StateAt(root) + if err != nil { + return AccountRangeResult{}, err + } + } else { + root = parentHeader.Root + statedb, err = api.blockchain.StateAt(root) + if err != nil { + return AccountRangeResult{}, err + } + // Recompute transactions up to the target index. + signer := types.MakeSigner(api.blockchain.Config(), block.Number()) + for idx, tx := range block.Transactions() { + // Assemble the transaction call message and return if the requested offset + msg, _ := tx.AsMessage(signer) + context := core.NewEVMContext(msg, block.Header(), api.blockchain, nil) + // Not yet the searched for transaction, execute on top of the current state + vmenv := vm.NewEVM(context, statedb, api.blockchain.Config(), vm.Config{}) + if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil { + return AccountRangeResult{}, fmt.Errorf("transaction %#x failed: %v", tx.Hash(), err) + } + // Ensure any modifications are committed to the state + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + root = statedb.IntermediateRoot(vmenv.ChainConfig().IsEIP158(block.Number())) + if idx == int(txIndex) { + // This is to make sure root can be opened by OpenTrie + root, err = statedb.Commit(api.chainConfig.IsEIP158(block.Number())) + if err != nil { + return AccountRangeResult{}, err + } + break + } + } + } + accountTrie, err := statedb.Database().OpenTrie(root) + if err != nil { + return AccountRangeResult{}, err + } + it := trie.NewIterator(accountTrie.NodeIterator(common.BigToHash((*big.Int)(addressHash)).Bytes())) + result := AccountRangeResult{AddressMap: make(map[common.Hash]common.Address)} + for i := 0; /*i < int(maxResults) && */ it.Next(); i++ { + if preimage := accountTrie.GetKey(it.Key); preimage != nil { + result.AddressMap[common.BytesToHash(it.Key)] = common.BytesToAddress(preimage) + //fmt.Printf("%x: %x\n", it.Key, preimage) + } else { + //fmt.Printf("could not find preimage for %x\n", it.Key) + } + } + //fmt.Printf("Number of entries returned: %d\n", len(result.AddressMap)) + // Add the 'next key' so clients can continue downloading. + if it.Next() { + next := common.BytesToHash(it.Key) + result.NextKey = next + } + return result, nil +} + +func (api *RetestethAPI) GetBalance(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (*math.HexOrDecimal256, error) { + //fmt.Printf("GetBalance %x, block %d\n", address, blockNr) + header := api.blockchain.GetHeaderByNumber(uint64(blockNr)) + statedb, err := api.blockchain.StateAt(header.Root) + if err != nil { + return nil, err + } + return (*math.HexOrDecimal256)(statedb.GetBalance(address)), nil +} + +func (api *RetestethAPI) GetCode(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (hexutil.Bytes, error) { + header := api.blockchain.GetHeaderByNumber(uint64(blockNr)) + statedb, err := api.blockchain.StateAt(header.Root) + if err != nil { + return nil, err + } + return statedb.GetCode(address), nil +} + +func (api *RetestethAPI) GetTransactionCount(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (uint64, error) { + header := api.blockchain.GetHeaderByNumber(uint64(blockNr)) + statedb, err := api.blockchain.StateAt(header.Root) + if err != nil { + return 0, err + } + return statedb.GetNonce(address), nil +} + +func (api *RetestethAPI) StorageRangeAt(ctx context.Context, + blockHashOrNumber *math.HexOrDecimal256, txIndex uint64, + address common.Address, + begin *math.HexOrDecimal256, maxResults uint64, +) (StorageRangeResult, error) { + var ( + header *types.Header + block *types.Block + ) + if (*big.Int)(blockHashOrNumber).Cmp(big.NewInt(math.MaxInt64)) > 0 { + blockHash := common.BigToHash((*big.Int)(blockHashOrNumber)) + header = api.blockchain.GetHeaderByHash(blockHash) + block = api.blockchain.GetBlockByHash(blockHash) + //fmt.Printf("Storage range: %x, txIndex %d, addr: %x, start: %x, maxResults: %d\n", + // blockHash, txIndex, address, common.BigToHash((*big.Int)(begin)), maxResults) + } else { + blockNumber := (*big.Int)(blockHashOrNumber).Uint64() + header = api.blockchain.GetHeaderByNumber(blockNumber) + block = api.blockchain.GetBlockByNumber(blockNumber) + //fmt.Printf("Storage range: %d, txIndex %d, addr: %x, start: %x, maxResults: %d\n", + // blockNumber, txIndex, address, common.BigToHash((*big.Int)(begin)), maxResults) + } + parentHeader := api.blockchain.GetHeaderByHash(header.ParentHash) + var root common.Hash + var statedb *state.StateDB + var err error + if parentHeader == nil || int(txIndex) >= len(block.Transactions()) { + root = header.Root + statedb, err = api.blockchain.StateAt(root) + if err != nil { + return StorageRangeResult{}, err + } + } else { + root = parentHeader.Root + statedb, err = api.blockchain.StateAt(root) + if err != nil { + return StorageRangeResult{}, err + } + // Recompute transactions up to the target index. + signer := types.MakeSigner(api.blockchain.Config(), block.Number()) + for idx, tx := range block.Transactions() { + // Assemble the transaction call message and return if the requested offset + msg, _ := tx.AsMessage(signer) + context := core.NewEVMContext(msg, block.Header(), api.blockchain, nil) + // Not yet the searched for transaction, execute on top of the current state + vmenv := vm.NewEVM(context, statedb, api.blockchain.Config(), vm.Config{}) + if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil { + return StorageRangeResult{}, fmt.Errorf("transaction %#x failed: %v", tx.Hash(), err) + } + // Ensure any modifications are committed to the state + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + _ = statedb.IntermediateRoot(vmenv.ChainConfig().IsEIP158(block.Number())) + if idx == int(txIndex) { + // This is to make sure root can be opened by OpenTrie + _, err = statedb.Commit(vmenv.ChainConfig().IsEIP158(block.Number())) + if err != nil { + return StorageRangeResult{}, err + } + } + } + } + storageTrie := statedb.StorageTrie(address) + it := trie.NewIterator(storageTrie.NodeIterator(common.BigToHash((*big.Int)(begin)).Bytes())) + result := StorageRangeResult{Storage: make(map[common.Hash]SRItem)} + for i := 0; /*i < int(maxResults) && */ it.Next(); i++ { + if preimage := storageTrie.GetKey(it.Key); preimage != nil { + key := (*math.HexOrDecimal256)(big.NewInt(0).SetBytes(preimage)) + v, _, err := rlp.SplitString(it.Value) + if err != nil { + return StorageRangeResult{}, err + } + value := (*math.HexOrDecimal256)(big.NewInt(0).SetBytes(v)) + ks, _ := key.MarshalText() + vs, _ := value.MarshalText() + if len(ks)%2 != 0 { + ks = append(append(append([]byte{}, ks[:2]...), byte('0')), ks[2:]...) + } + if len(vs)%2 != 0 { + vs = append(append(append([]byte{}, vs[:2]...), byte('0')), vs[2:]...) + } + result.Storage[common.BytesToHash(it.Key)] = SRItem{ + Key: string(ks), + Value: string(vs), + } + //fmt.Printf("Key: %s, Value: %s\n", ks, vs) + } else { + //fmt.Printf("Did not find preimage for %x\n", it.Key) + } + } + if it.Next() { + result.Complete = false + } else { + result.Complete = true + } + return result, nil +} + +func (api *RetestethAPI) ClientVersion(ctx context.Context) (string, error) { + return "Geth-" + params.VersionWithCommit(gitCommit, gitDate), nil +} + +// splitAndTrim splits input separated by a comma +// and trims excessive white space from the substrings. +func splitAndTrim(input string) []string { + result := strings.Split(input, ",") + for i, r := range result { + result[i] = strings.TrimSpace(r) + } + return result +} + +func retesteth(ctx *cli.Context) error { + log.Info("Welcome to retesteth!") + // register signer API with server + var ( + extapiURL string + ) + apiImpl := &RetestethAPI{} + var testApi RetestethTestAPI = apiImpl + var ethApi RetestethEthAPI = apiImpl + var debugApi RetestethDebugAPI = apiImpl + var web3Api RetestWeb3API = apiImpl + rpcAPI := []rpc.API{ + { + Namespace: "test", + Public: true, + Service: testApi, + Version: "1.0", + }, + { + Namespace: "eth", + Public: true, + Service: ethApi, + Version: "1.0", + }, + { + Namespace: "debug", + Public: true, + Service: debugApi, + Version: "1.0", + }, + { + Namespace: "web3", + Public: true, + Service: web3Api, + Version: "1.0", + }, + } + vhosts := splitAndTrim(ctx.GlobalString(utils.RPCVirtualHostsFlag.Name)) + cors := splitAndTrim(ctx.GlobalString(utils.RPCCORSDomainFlag.Name)) + + // start http server + httpEndpoint := fmt.Sprintf("%s:%d", ctx.GlobalString(utils.RPCListenAddrFlag.Name), ctx.Int(rpcPortFlag.Name)) + listener, _, err := rpc.StartHTTPEndpoint(httpEndpoint, rpcAPI, []string{"test", "eth", "debug", "web3"}, cors, vhosts, rpc.DefaultHTTPTimeouts) + if err != nil { + utils.Fatalf("Could not start RPC api: %v", err) + } + extapiURL = fmt.Sprintf("http://%s", httpEndpoint) + log.Info("HTTP endpoint opened", "url", extapiURL) + + defer func() { + listener.Close() + log.Info("HTTP endpoint closed", "url", httpEndpoint) + }() + + abortChan := make(chan os.Signal) + signal.Notify(abortChan, os.Interrupt) + + sig := <-abortChan + log.Info("Exiting...", "signal", sig) + return nil +} diff --git a/cmd/geth/retesteth_copypaste.go b/cmd/geth/retesteth_copypaste.go new file mode 100644 index 000000000000..e2795af7f968 --- /dev/null +++ b/cmd/geth/retesteth_copypaste.go @@ -0,0 +1,148 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" +) + +// RPCTransaction represents a transaction that will serialize to the RPC representation of a transaction +type RPCTransaction struct { + BlockHash common.Hash `json:"blockHash"` + BlockNumber *hexutil.Big `json:"blockNumber"` + From common.Address `json:"from"` + Gas hexutil.Uint64 `json:"gas"` + GasPrice *hexutil.Big `json:"gasPrice"` + Hash common.Hash `json:"hash"` + Input hexutil.Bytes `json:"input"` + Nonce hexutil.Uint64 `json:"nonce"` + To *common.Address `json:"to"` + TransactionIndex hexutil.Uint `json:"transactionIndex"` + Value *hexutil.Big `json:"value"` + V *hexutil.Big `json:"v"` + R *hexutil.Big `json:"r"` + S *hexutil.Big `json:"s"` +} + +// newRPCTransaction returns a transaction that will serialize to the RPC +// representation, with the given location metadata set (if available). +func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber uint64, index uint64) *RPCTransaction { + var signer types.Signer = types.FrontierSigner{} + if tx.Protected() { + signer = types.NewEIP155Signer(tx.ChainId()) + } + from, _ := types.Sender(signer, tx) + v, r, s := tx.RawSignatureValues() + + result := &RPCTransaction{ + From: from, + Gas: hexutil.Uint64(tx.Gas()), + GasPrice: (*hexutil.Big)(tx.GasPrice()), + Hash: tx.Hash(), + Input: hexutil.Bytes(tx.Data()), + Nonce: hexutil.Uint64(tx.Nonce()), + To: tx.To(), + Value: (*hexutil.Big)(tx.Value()), + V: (*hexutil.Big)(v), + R: (*hexutil.Big)(r), + S: (*hexutil.Big)(s), + } + if blockHash != (common.Hash{}) { + result.BlockHash = blockHash + result.BlockNumber = (*hexutil.Big)(new(big.Int).SetUint64(blockNumber)) + result.TransactionIndex = hexutil.Uint(index) + } + return result +} + +// newRPCTransactionFromBlockIndex returns a transaction that will serialize to the RPC representation. +func newRPCTransactionFromBlockIndex(b *types.Block, index uint64) *RPCTransaction { + txs := b.Transactions() + if index >= uint64(len(txs)) { + return nil + } + return newRPCTransaction(txs[index], b.Hash(), b.NumberU64(), index) +} + +// newRPCTransactionFromBlockHash returns a transaction that will serialize to the RPC representation. +func newRPCTransactionFromBlockHash(b *types.Block, hash common.Hash) *RPCTransaction { + for idx, tx := range b.Transactions() { + if tx.Hash() == hash { + return newRPCTransactionFromBlockIndex(b, uint64(idx)) + } + } + return nil +} + +// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are +// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain +// transaction hashes. +func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { + head := b.Header() // copies the header once + fields := map[string]interface{}{ + "number": (*hexutil.Big)(head.Number), + "hash": b.Hash(), + "parentHash": head.ParentHash, + "nonce": head.Nonce, + "mixHash": head.MixDigest, + "sha3Uncles": head.UncleHash, + "logsBloom": head.Bloom, + "stateRoot": head.Root, + "miner": head.Coinbase, + "difficulty": (*hexutil.Big)(head.Difficulty), + "extraData": hexutil.Bytes(head.Extra), + "size": hexutil.Uint64(b.Size()), + "gasLimit": hexutil.Uint64(head.GasLimit), + "gasUsed": hexutil.Uint64(head.GasUsed), + "timestamp": hexutil.Uint64(head.Time), + "transactionsRoot": head.TxHash, + "receiptsRoot": head.ReceiptHash, + } + + if inclTx { + formatTx := func(tx *types.Transaction) (interface{}, error) { + return tx.Hash(), nil + } + if fullTx { + formatTx = func(tx *types.Transaction) (interface{}, error) { + return newRPCTransactionFromBlockHash(b, tx.Hash()), nil + } + } + txs := b.Transactions() + transactions := make([]interface{}, len(txs)) + var err error + for i, tx := range txs { + if transactions[i], err = formatTx(tx); err != nil { + return nil, err + } + } + fields["transactions"] = transactions + } + + uncles := b.Uncles() + uncleHashes := make([]common.Hash, len(uncles)) + for i, uncle := range uncles { + uncleHashes[i] = uncle.Hash() + } + fields["uncles"] = uncleHashes + + return fields, nil +} diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index 8b0491ce3c08..af195425b12e 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -26,14 +26,14 @@ import ( "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/internal/debug" - "gopkg.in/urfave/cli.v1" + cli "gopkg.in/urfave/cli.v1" ) // AppHelpTemplate is the test template for the default, global app help topic. var AppHelpTemplate = `NAME: {{.App.Name}} - {{.App.Usage}} - Copyright 2013-2018 The go-ethereum Authors + Copyright 2013-2019 The go-ethereum Authors USAGE: {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} @@ -69,18 +69,33 @@ var AppHelpFlagGroups = []flagGroup{ Flags: []cli.Flag{ configFileFlag, utils.DataDirFlag, + utils.AncientFlag, utils.KeyStoreDirFlag, utils.NoUSBFlag, + utils.SmartCardDaemonPathFlag, utils.NetworkIdFlag, utils.TestnetFlag, utils.RinkebyFlag, + utils.GoerliFlag, utils.SyncModeFlag, + utils.ExitWhenSyncedFlag, utils.GCModeFlag, utils.EthStatsURLFlag, utils.IdentityFlag, - utils.LightServFlag, - utils.LightPeersFlag, utils.LightKDFFlag, + utils.WhitelistFlag, + }, + }, + { + Name: "LIGHT CLIENT", + Flags: []cli.Flag{ + utils.LightServeFlag, + utils.LightIngressFlag, + utils.LightEgressFlag, + utils.LightMaxPeersFlag, + utils.UltraLightServersFlag, + utils.UltraLightFractionFlag, + utils.UltraLightOnlyAnnounceFlag, }, }, { @@ -132,8 +147,9 @@ var AppHelpFlagGroups = []flagGroup{ Flags: []cli.Flag{ utils.CacheFlag, utils.CacheDatabaseFlag, + utils.CacheTrieFlag, utils.CacheGCFlag, - utils.TrieCacheGenFlag, + utils.CacheNoPrefetchFlag, }, }, { @@ -141,24 +157,32 @@ var AppHelpFlagGroups = []flagGroup{ Flags: []cli.Flag{ utils.UnlockedAccountFlag, utils.PasswordFileFlag, + utils.ExternalSignerFlag, + utils.InsecureUnlockAllowedFlag, }, }, { Name: "API AND CONSOLE", Flags: []cli.Flag{ + utils.IPCDisabledFlag, + utils.IPCPathFlag, utils.RPCEnabledFlag, utils.RPCListenAddrFlag, utils.RPCPortFlag, utils.RPCApiFlag, + utils.RPCGlobalGasCap, + utils.RPCCORSDomainFlag, + utils.RPCVirtualHostsFlag, utils.WSEnabledFlag, utils.WSListenAddrFlag, utils.WSPortFlag, utils.WSApiFlag, utils.WSAllowedOriginsFlag, - utils.IPCDisabledFlag, - utils.IPCPathFlag, - utils.RPCCORSDomainFlag, - utils.RPCVirtualHostsFlag, + utils.GraphQLEnabledFlag, + utils.GraphQLListenAddrFlag, + utils.GraphQLPortFlag, + utils.GraphQLCORSDomainFlag, + utils.GraphQLVirtualHostsFlag, utils.JSpathFlag, utils.ExecFlag, utils.PreloadJSFlag, @@ -219,16 +243,8 @@ var AppHelpFlagGroups = []flagGroup{ }, debug.Flags...), }, { - Name: "METRICS AND STATS", - Flags: []cli.Flag{ - utils.MetricsEnabledFlag, - utils.MetricsEnableInfluxDBFlag, - utils.MetricsInfluxDBEndpointFlag, - utils.MetricsInfluxDBDatabaseFlag, - utils.MetricsInfluxDBUsernameFlag, - utils.MetricsInfluxDBPasswordFlag, - utils.MetricsInfluxDBHostTagFlag, - }, + Name: "METRICS AND STATS", + Flags: metricsFlags, }, { Name: "WHISPER (EXPERIMENTAL)", @@ -237,6 +253,8 @@ var AppHelpFlagGroups = []flagGroup{ { Name: "DEPRECATED", Flags: []cli.Flag{ + utils.LightLegacyServFlag, + utils.LightLegacyPeersFlag, utils.MinerLegacyThreadsFlag, utils.MinerLegacyGasTargetFlag, utils.MinerLegacyGasPriceFlag, @@ -303,7 +321,7 @@ func init() { categorized[flag.String()] = struct{}{} } } - uncategorized := []cli.Flag{} + var uncategorized []cli.Flag for _, flag := range data.(*cli.App).Flags { if _, ok := categorized[flag.String()]; !ok { if strings.HasPrefix(flag.GetName(), "dashboard") { diff --git a/cmd/internal/browser/browser.go b/cmd/internal/browser/browser.go deleted file mode 100644 index 897086f47177..000000000000 --- a/cmd/internal/browser/browser.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package browser provides utilities for interacting with users' browsers. -package browser - -import ( - "os" - "os/exec" - "runtime" -) - -// Commands returns a list of possible commands to use to open a url. -func Commands() [][]string { - var cmds [][]string - if exe := os.Getenv("BROWSER"); exe != "" { - cmds = append(cmds, []string{exe}) - } - switch runtime.GOOS { - case "darwin": - cmds = append(cmds, []string{"/usr/bin/open"}) - case "windows": - cmds = append(cmds, []string{"cmd", "/c", "start"}) - default: - cmds = append(cmds, []string{"xdg-open"}) - } - cmds = append(cmds, - []string{"chrome"}, - []string{"google-chrome"}, - []string{"chromium"}, - []string{"firefox"}, - ) - return cmds -} - -// Open tries to open url in a browser and reports whether it succeeded. -func Open(url string) bool { - for _, args := range Commands() { - cmd := exec.Command(args[0], append(args[1:], url)...) - if cmd.Start() == nil { - return true - } - } - return false -} diff --git a/cmd/puppeth/genesis.go b/cmd/puppeth/genesis.go index 5f39a889d1b5..ae7675cd9bc9 100644 --- a/cmd/puppeth/genesis.go +++ b/cmd/puppeth/genesis.go @@ -20,35 +20,41 @@ import ( "encoding/binary" "errors" "math" + "math/big" + "strings" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + math2 "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/params" ) -// cppEthereumGenesisSpec represents the genesis specification format used by the +// alethGenesisSpec represents the genesis specification format used by the // C++ Ethereum implementation. -type cppEthereumGenesisSpec struct { +type alethGenesisSpec struct { SealEngine string `json:"sealEngine"` Params struct { - AccountStartNonce hexutil.Uint64 `json:"accountStartNonce"` - HomesteadForkBlock hexutil.Uint64 `json:"homesteadForkBlock"` - EIP150ForkBlock hexutil.Uint64 `json:"EIP150ForkBlock"` - EIP158ForkBlock hexutil.Uint64 `json:"EIP158ForkBlock"` - ByzantiumForkBlock hexutil.Uint64 `json:"byzantiumForkBlock"` - ConstantinopleForkBlock hexutil.Uint64 `json:"constantinopleForkBlock"` - NetworkID hexutil.Uint64 `json:"networkID"` - ChainID hexutil.Uint64 `json:"chainID"` - MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"` - MinGasLimit hexutil.Uint64 `json:"minGasLimit"` - MaxGasLimit hexutil.Uint64 `json:"maxGasLimit"` - GasLimitBoundDivisor hexutil.Uint64 `json:"gasLimitBoundDivisor"` - MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"` - DifficultyBoundDivisor *hexutil.Big `json:"difficultyBoundDivisor"` - DurationLimit *hexutil.Big `json:"durationLimit"` - BlockReward *hexutil.Big `json:"blockReward"` + AccountStartNonce math2.HexOrDecimal64 `json:"accountStartNonce"` + MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"` + HomesteadForkBlock hexutil.Uint64 `json:"homesteadForkBlock"` + DaoHardforkBlock math2.HexOrDecimal64 `json:"daoHardforkBlock"` + EIP150ForkBlock hexutil.Uint64 `json:"EIP150ForkBlock"` + EIP158ForkBlock hexutil.Uint64 `json:"EIP158ForkBlock"` + ByzantiumForkBlock hexutil.Uint64 `json:"byzantiumForkBlock"` + ConstantinopleForkBlock hexutil.Uint64 `json:"constantinopleForkBlock"` + MinGasLimit hexutil.Uint64 `json:"minGasLimit"` + MaxGasLimit hexutil.Uint64 `json:"maxGasLimit"` + TieBreakingGas bool `json:"tieBreakingGas"` + GasLimitBoundDivisor math2.HexOrDecimal64 `json:"gasLimitBoundDivisor"` + MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"` + DifficultyBoundDivisor *math2.HexOrDecimal256 `json:"difficultyBoundDivisor"` + DurationLimit *math2.HexOrDecimal256 `json:"durationLimit"` + BlockReward *hexutil.Big `json:"blockReward"` + NetworkID hexutil.Uint64 `json:"networkID"` + ChainID hexutil.Uint64 `json:"chainID"` + AllowFutureBlocks bool `json:"allowFutureBlocks"` } `json:"params"` Genesis struct { @@ -62,57 +68,68 @@ type cppEthereumGenesisSpec struct { GasLimit hexutil.Uint64 `json:"gasLimit"` } `json:"genesis"` - Accounts map[common.Address]*cppEthereumGenesisSpecAccount `json:"accounts"` + Accounts map[common.UnprefixedAddress]*alethGenesisSpecAccount `json:"accounts"` } -// cppEthereumGenesisSpecAccount is the prefunded genesis account and/or precompiled +// alethGenesisSpecAccount is the prefunded genesis account and/or precompiled // contract definition. -type cppEthereumGenesisSpecAccount struct { - Balance *hexutil.Big `json:"balance"` - Nonce uint64 `json:"nonce,omitempty"` - Precompiled *cppEthereumGenesisSpecBuiltin `json:"precompiled,omitempty"` +type alethGenesisSpecAccount struct { + Balance *math2.HexOrDecimal256 `json:"balance"` + Nonce uint64 `json:"nonce,omitempty"` + Precompiled *alethGenesisSpecBuiltin `json:"precompiled,omitempty"` } -// cppEthereumGenesisSpecBuiltin is the precompiled contract definition. -type cppEthereumGenesisSpecBuiltin struct { - Name string `json:"name,omitempty"` - StartingBlock hexutil.Uint64 `json:"startingBlock,omitempty"` - Linear *cppEthereumGenesisSpecLinearPricing `json:"linear,omitempty"` +// alethGenesisSpecBuiltin is the precompiled contract definition. +type alethGenesisSpecBuiltin struct { + Name string `json:"name,omitempty"` + StartingBlock hexutil.Uint64 `json:"startingBlock,omitempty"` + Linear *alethGenesisSpecLinearPricing `json:"linear,omitempty"` } -type cppEthereumGenesisSpecLinearPricing struct { +type alethGenesisSpecLinearPricing struct { Base uint64 `json:"base"` Word uint64 `json:"word"` } -// newCppEthereumGenesisSpec converts a go-ethereum genesis block into a Parity specific +// newAlethGenesisSpec converts a go-ethereum genesis block into a Aleth-specific // chain specification format. -func newCppEthereumGenesisSpec(network string, genesis *core.Genesis) (*cppEthereumGenesisSpec, error) { - // Only ethash is currently supported between go-ethereum and cpp-ethereum +func newAlethGenesisSpec(network string, genesis *core.Genesis) (*alethGenesisSpec, error) { + // Only ethash is currently supported between go-ethereum and aleth if genesis.Config.Ethash == nil { return nil, errors.New("unsupported consensus engine") } - // Reconstruct the chain spec in Parity's format - spec := &cppEthereumGenesisSpec{ + // Reconstruct the chain spec in Aleth format + spec := &alethGenesisSpec{ SealEngine: "Ethash", } + // Some defaults spec.Params.AccountStartNonce = 0 + spec.Params.TieBreakingGas = false + spec.Params.AllowFutureBlocks = false + spec.Params.DaoHardforkBlock = 0 + spec.Params.HomesteadForkBlock = (hexutil.Uint64)(genesis.Config.HomesteadBlock.Uint64()) spec.Params.EIP150ForkBlock = (hexutil.Uint64)(genesis.Config.EIP150Block.Uint64()) spec.Params.EIP158ForkBlock = (hexutil.Uint64)(genesis.Config.EIP158Block.Uint64()) - spec.Params.ByzantiumForkBlock = (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()) - spec.Params.ConstantinopleForkBlock = (hexutil.Uint64)(math.MaxUint64) + + // Byzantium + if num := genesis.Config.ByzantiumBlock; num != nil { + spec.setByzantium(num) + } + // Constantinople + if num := genesis.Config.ConstantinopleBlock; num != nil { + spec.setConstantinople(num) + } spec.Params.NetworkID = (hexutil.Uint64)(genesis.Config.ChainID.Uint64()) spec.Params.ChainID = (hexutil.Uint64)(genesis.Config.ChainID.Uint64()) - spec.Params.MaximumExtraDataSize = (hexutil.Uint64)(params.MaximumExtraDataSize) spec.Params.MinGasLimit = (hexutil.Uint64)(params.MinGasLimit) - spec.Params.MaxGasLimit = (hexutil.Uint64)(math.MaxUint64) + spec.Params.MaxGasLimit = (hexutil.Uint64)(math.MaxInt64) spec.Params.MinimumDifficulty = (*hexutil.Big)(params.MinimumDifficulty) - spec.Params.DifficultyBoundDivisor = (*hexutil.Big)(params.DifficultyBoundDivisor) - spec.Params.GasLimitBoundDivisor = (hexutil.Uint64)(params.GasLimitBoundDivisor) - spec.Params.DurationLimit = (*hexutil.Big)(params.DurationLimit) + spec.Params.DifficultyBoundDivisor = (*math2.HexOrDecimal256)(params.DifficultyBoundDivisor) + spec.Params.GasLimitBoundDivisor = (math2.HexOrDecimal64)(params.GasLimitBoundDivisor) + spec.Params.DurationLimit = (*math2.HexOrDecimal256)(params.DurationLimit) spec.Params.BlockReward = (*hexutil.Big)(ethash.FrontierBlockReward) spec.Genesis.Nonce = (hexutil.Bytes)(make([]byte, 8)) @@ -126,77 +143,109 @@ func newCppEthereumGenesisSpec(network string, genesis *core.Genesis) (*cppEther spec.Genesis.ExtraData = (hexutil.Bytes)(genesis.ExtraData) spec.Genesis.GasLimit = (hexutil.Uint64)(genesis.GasLimit) - spec.Accounts = make(map[common.Address]*cppEthereumGenesisSpecAccount) for address, account := range genesis.Alloc { - spec.Accounts[address] = &cppEthereumGenesisSpecAccount{ - Balance: (*hexutil.Big)(account.Balance), - Nonce: account.Nonce, - } + spec.setAccount(address, account) } - spec.Accounts[common.BytesToAddress([]byte{1})].Precompiled = &cppEthereumGenesisSpecBuiltin{ - Name: "ecrecover", Linear: &cppEthereumGenesisSpecLinearPricing{Base: 3000}, + + spec.setPrecompile(1, &alethGenesisSpecBuiltin{Name: "ecrecover", + Linear: &alethGenesisSpecLinearPricing{Base: 3000}}) + spec.setPrecompile(2, &alethGenesisSpecBuiltin{Name: "sha256", + Linear: &alethGenesisSpecLinearPricing{Base: 60, Word: 12}}) + spec.setPrecompile(3, &alethGenesisSpecBuiltin{Name: "ripemd160", + Linear: &alethGenesisSpecLinearPricing{Base: 600, Word: 120}}) + spec.setPrecompile(4, &alethGenesisSpecBuiltin{Name: "identity", + Linear: &alethGenesisSpecLinearPricing{Base: 15, Word: 3}}) + if genesis.Config.ByzantiumBlock != nil { + spec.setPrecompile(5, &alethGenesisSpecBuiltin{Name: "modexp", + StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64())}) + spec.setPrecompile(6, &alethGenesisSpecBuiltin{Name: "alt_bn128_G1_add", + StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), + Linear: &alethGenesisSpecLinearPricing{Base: 500}}) + spec.setPrecompile(7, &alethGenesisSpecBuiltin{Name: "alt_bn128_G1_mul", + StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), + Linear: &alethGenesisSpecLinearPricing{Base: 40000}}) + spec.setPrecompile(8, &alethGenesisSpecBuiltin{Name: "alt_bn128_pairing_product", + StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64())}) } - spec.Accounts[common.BytesToAddress([]byte{2})].Precompiled = &cppEthereumGenesisSpecBuiltin{ - Name: "sha256", Linear: &cppEthereumGenesisSpecLinearPricing{Base: 60, Word: 12}, + return spec, nil +} + +func (spec *alethGenesisSpec) setPrecompile(address byte, data *alethGenesisSpecBuiltin) { + if spec.Accounts == nil { + spec.Accounts = make(map[common.UnprefixedAddress]*alethGenesisSpecAccount) } - spec.Accounts[common.BytesToAddress([]byte{3})].Precompiled = &cppEthereumGenesisSpecBuiltin{ - Name: "ripemd160", Linear: &cppEthereumGenesisSpecLinearPricing{Base: 600, Word: 120}, + addr := common.UnprefixedAddress(common.BytesToAddress([]byte{address})) + if _, exist := spec.Accounts[addr]; !exist { + spec.Accounts[addr] = &alethGenesisSpecAccount{} } - spec.Accounts[common.BytesToAddress([]byte{4})].Precompiled = &cppEthereumGenesisSpecBuiltin{ - Name: "identity", Linear: &cppEthereumGenesisSpecLinearPricing{Base: 15, Word: 3}, + spec.Accounts[addr].Precompiled = data +} + +func (spec *alethGenesisSpec) setAccount(address common.Address, account core.GenesisAccount) { + if spec.Accounts == nil { + spec.Accounts = make(map[common.UnprefixedAddress]*alethGenesisSpecAccount) } - if genesis.Config.ByzantiumBlock != nil { - spec.Accounts[common.BytesToAddress([]byte{5})].Precompiled = &cppEthereumGenesisSpecBuiltin{ - Name: "modexp", StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), - } - spec.Accounts[common.BytesToAddress([]byte{6})].Precompiled = &cppEthereumGenesisSpecBuiltin{ - Name: "alt_bn128_G1_add", StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), Linear: &cppEthereumGenesisSpecLinearPricing{Base: 500}, - } - spec.Accounts[common.BytesToAddress([]byte{7})].Precompiled = &cppEthereumGenesisSpecBuiltin{ - Name: "alt_bn128_G1_mul", StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), Linear: &cppEthereumGenesisSpecLinearPricing{Base: 40000}, - } - spec.Accounts[common.BytesToAddress([]byte{8})].Precompiled = &cppEthereumGenesisSpecBuiltin{ - Name: "alt_bn128_pairing_product", StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), - } + + a, exist := spec.Accounts[common.UnprefixedAddress(address)] + if !exist { + a = &alethGenesisSpecAccount{} + spec.Accounts[common.UnprefixedAddress(address)] = a } - return spec, nil + a.Balance = (*math2.HexOrDecimal256)(account.Balance) + a.Nonce = account.Nonce + +} + +func (spec *alethGenesisSpec) setByzantium(num *big.Int) { + spec.Params.ByzantiumForkBlock = hexutil.Uint64(num.Uint64()) +} + +func (spec *alethGenesisSpec) setConstantinople(num *big.Int) { + spec.Params.ConstantinopleForkBlock = hexutil.Uint64(num.Uint64()) } // parityChainSpec is the chain specification format used by Parity. type parityChainSpec struct { - Name string `json:"name"` - Engine struct { + Name string `json:"name"` + Datadir string `json:"dataDir"` + Engine struct { Ethash struct { Params struct { - MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"` - DifficultyBoundDivisor *hexutil.Big `json:"difficultyBoundDivisor"` - DurationLimit *hexutil.Big `json:"durationLimit"` - BlockReward *hexutil.Big `json:"blockReward"` - HomesteadTransition uint64 `json:"homesteadTransition"` - EIP150Transition uint64 `json:"eip150Transition"` - EIP160Transition uint64 `json:"eip160Transition"` - EIP161abcTransition uint64 `json:"eip161abcTransition"` - EIP161dTransition uint64 `json:"eip161dTransition"` - EIP649Reward *hexutil.Big `json:"eip649Reward"` - EIP100bTransition uint64 `json:"eip100bTransition"` - EIP649Transition uint64 `json:"eip649Transition"` + MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"` + DifficultyBoundDivisor *hexutil.Big `json:"difficultyBoundDivisor"` + DurationLimit *hexutil.Big `json:"durationLimit"` + BlockReward map[string]string `json:"blockReward"` + DifficultyBombDelays map[string]string `json:"difficultyBombDelays"` + HomesteadTransition hexutil.Uint64 `json:"homesteadTransition"` + EIP100bTransition hexutil.Uint64 `json:"eip100bTransition"` } `json:"params"` } `json:"Ethash"` } `json:"engine"` Params struct { - MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"` - MinGasLimit hexutil.Uint64 `json:"minGasLimit"` - GasLimitBoundDivisor hexutil.Uint64 `json:"gasLimitBoundDivisor"` - NetworkID hexutil.Uint64 `json:"networkID"` - MaxCodeSize uint64 `json:"maxCodeSize"` - EIP155Transition uint64 `json:"eip155Transition"` - EIP98Transition uint64 `json:"eip98Transition"` - EIP86Transition uint64 `json:"eip86Transition"` - EIP140Transition uint64 `json:"eip140Transition"` - EIP211Transition uint64 `json:"eip211Transition"` - EIP214Transition uint64 `json:"eip214Transition"` - EIP658Transition uint64 `json:"eip658Transition"` + AccountStartNonce hexutil.Uint64 `json:"accountStartNonce"` + MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"` + MinGasLimit hexutil.Uint64 `json:"minGasLimit"` + GasLimitBoundDivisor math2.HexOrDecimal64 `json:"gasLimitBoundDivisor"` + NetworkID hexutil.Uint64 `json:"networkID"` + ChainID hexutil.Uint64 `json:"chainID"` + MaxCodeSize hexutil.Uint64 `json:"maxCodeSize"` + MaxCodeSizeTransition hexutil.Uint64 `json:"maxCodeSizeTransition"` + EIP98Transition hexutil.Uint64 `json:"eip98Transition"` + EIP150Transition hexutil.Uint64 `json:"eip150Transition"` + EIP160Transition hexutil.Uint64 `json:"eip160Transition"` + EIP161abcTransition hexutil.Uint64 `json:"eip161abcTransition"` + EIP161dTransition hexutil.Uint64 `json:"eip161dTransition"` + EIP155Transition hexutil.Uint64 `json:"eip155Transition"` + EIP140Transition hexutil.Uint64 `json:"eip140Transition"` + EIP211Transition hexutil.Uint64 `json:"eip211Transition"` + EIP214Transition hexutil.Uint64 `json:"eip214Transition"` + EIP658Transition hexutil.Uint64 `json:"eip658Transition"` + EIP145Transition hexutil.Uint64 `json:"eip145Transition"` + EIP1014Transition hexutil.Uint64 `json:"eip1014Transition"` + EIP1052Transition hexutil.Uint64 `json:"eip1052Transition"` + EIP1283Transition hexutil.Uint64 `json:"eip1283Transition"` + EIP1283DisableTransition hexutil.Uint64 `json:"eip1283DisableTransition"` } `json:"params"` Genesis struct { @@ -215,22 +264,22 @@ type parityChainSpec struct { GasLimit hexutil.Uint64 `json:"gasLimit"` } `json:"genesis"` - Nodes []string `json:"nodes"` - Accounts map[common.Address]*parityChainSpecAccount `json:"accounts"` + Nodes []string `json:"nodes"` + Accounts map[common.UnprefixedAddress]*parityChainSpecAccount `json:"accounts"` } // parityChainSpecAccount is the prefunded genesis account and/or precompiled // contract definition. type parityChainSpecAccount struct { - Balance *hexutil.Big `json:"balance"` - Nonce uint64 `json:"nonce,omitempty"` + Balance math2.HexOrDecimal256 `json:"balance"` + Nonce math2.HexOrDecimal64 `json:"nonce,omitempty"` Builtin *parityChainSpecBuiltin `json:"builtin,omitempty"` } // parityChainSpecBuiltin is the precompiled contract definition. type parityChainSpecBuiltin struct { Name string `json:"name,omitempty"` - ActivateAt uint64 `json:"activate_at,omitempty"` + ActivateAt math2.HexOrDecimal64 `json:"activate_at,omitempty"` Pricing *parityChainSpecPricing `json:"pricing,omitempty"` } @@ -265,34 +314,56 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin } // Reconstruct the chain spec in Parity's format spec := &parityChainSpec{ - Name: network, - Nodes: bootnodes, + Name: network, + Nodes: bootnodes, + Datadir: strings.ToLower(network), } + spec.Engine.Ethash.Params.BlockReward = make(map[string]string) + spec.Engine.Ethash.Params.DifficultyBombDelays = make(map[string]string) + // Frontier spec.Engine.Ethash.Params.MinimumDifficulty = (*hexutil.Big)(params.MinimumDifficulty) spec.Engine.Ethash.Params.DifficultyBoundDivisor = (*hexutil.Big)(params.DifficultyBoundDivisor) spec.Engine.Ethash.Params.DurationLimit = (*hexutil.Big)(params.DurationLimit) - spec.Engine.Ethash.Params.BlockReward = (*hexutil.Big)(ethash.FrontierBlockReward) - spec.Engine.Ethash.Params.HomesteadTransition = genesis.Config.HomesteadBlock.Uint64() - spec.Engine.Ethash.Params.EIP150Transition = genesis.Config.EIP150Block.Uint64() - spec.Engine.Ethash.Params.EIP160Transition = genesis.Config.EIP155Block.Uint64() - spec.Engine.Ethash.Params.EIP161abcTransition = genesis.Config.EIP158Block.Uint64() - spec.Engine.Ethash.Params.EIP161dTransition = genesis.Config.EIP158Block.Uint64() - spec.Engine.Ethash.Params.EIP649Reward = (*hexutil.Big)(ethash.ByzantiumBlockReward) - spec.Engine.Ethash.Params.EIP100bTransition = genesis.Config.ByzantiumBlock.Uint64() - spec.Engine.Ethash.Params.EIP649Transition = genesis.Config.ByzantiumBlock.Uint64() + spec.Engine.Ethash.Params.BlockReward["0x0"] = hexutil.EncodeBig(ethash.FrontierBlockReward) + + // Homestead + spec.Engine.Ethash.Params.HomesteadTransition = hexutil.Uint64(genesis.Config.HomesteadBlock.Uint64()) + + // Tangerine Whistle : 150 + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-608.md + spec.Params.EIP150Transition = hexutil.Uint64(genesis.Config.EIP150Block.Uint64()) + + // Spurious Dragon: 155, 160, 161, 170 + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-607.md + spec.Params.EIP155Transition = hexutil.Uint64(genesis.Config.EIP155Block.Uint64()) + spec.Params.EIP160Transition = hexutil.Uint64(genesis.Config.EIP155Block.Uint64()) + spec.Params.EIP161abcTransition = hexutil.Uint64(genesis.Config.EIP158Block.Uint64()) + spec.Params.EIP161dTransition = hexutil.Uint64(genesis.Config.EIP158Block.Uint64()) + + // Byzantium + if num := genesis.Config.ByzantiumBlock; num != nil { + spec.setByzantium(num) + } + // Constantinople + if num := genesis.Config.ConstantinopleBlock; num != nil { + spec.setConstantinople(num) + } + // ConstantinopleFix (remove eip-1283) + if num := genesis.Config.PetersburgBlock; num != nil { + spec.setConstantinopleFix(num) + } spec.Params.MaximumExtraDataSize = (hexutil.Uint64)(params.MaximumExtraDataSize) spec.Params.MinGasLimit = (hexutil.Uint64)(params.MinGasLimit) - spec.Params.GasLimitBoundDivisor = (hexutil.Uint64)(params.GasLimitBoundDivisor) + spec.Params.GasLimitBoundDivisor = (math2.HexOrDecimal64)(params.GasLimitBoundDivisor) spec.Params.NetworkID = (hexutil.Uint64)(genesis.Config.ChainID.Uint64()) + spec.Params.ChainID = (hexutil.Uint64)(genesis.Config.ChainID.Uint64()) spec.Params.MaxCodeSize = params.MaxCodeSize - spec.Params.EIP155Transition = genesis.Config.EIP155Block.Uint64() - spec.Params.EIP98Transition = math.MaxUint64 - spec.Params.EIP86Transition = math.MaxUint64 - spec.Params.EIP140Transition = genesis.Config.ByzantiumBlock.Uint64() - spec.Params.EIP211Transition = genesis.Config.ByzantiumBlock.Uint64() - spec.Params.EIP214Transition = genesis.Config.ByzantiumBlock.Uint64() - spec.Params.EIP658Transition = genesis.Config.ByzantiumBlock.Uint64() + // geth has it set from zero + spec.Params.MaxCodeSizeTransition = 0 + + // Disable this one + spec.Params.EIP98Transition = math.MaxInt64 spec.Genesis.Seal.Ethereum.Nonce = (hexutil.Bytes)(make([]byte, 8)) binary.LittleEndian.PutUint64(spec.Genesis.Seal.Ethereum.Nonce[:], genesis.Nonce) @@ -305,42 +376,81 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin spec.Genesis.ExtraData = (hexutil.Bytes)(genesis.ExtraData) spec.Genesis.GasLimit = (hexutil.Uint64)(genesis.GasLimit) - spec.Accounts = make(map[common.Address]*parityChainSpecAccount) + spec.Accounts = make(map[common.UnprefixedAddress]*parityChainSpecAccount) for address, account := range genesis.Alloc { - spec.Accounts[address] = &parityChainSpecAccount{ - Balance: (*hexutil.Big)(account.Balance), - Nonce: account.Nonce, + bal := math2.HexOrDecimal256(*account.Balance) + + spec.Accounts[common.UnprefixedAddress(address)] = &parityChainSpecAccount{ + Balance: bal, + Nonce: math2.HexOrDecimal64(account.Nonce), } } - spec.Accounts[common.BytesToAddress([]byte{1})].Builtin = &parityChainSpecBuiltin{ - Name: "ecrecover", Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 3000}}, - } - spec.Accounts[common.BytesToAddress([]byte{2})].Builtin = &parityChainSpecBuiltin{ + spec.setPrecompile(1, &parityChainSpecBuiltin{Name: "ecrecover", + Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 3000}}}) + + spec.setPrecompile(2, &parityChainSpecBuiltin{ Name: "sha256", Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 60, Word: 12}}, - } - spec.Accounts[common.BytesToAddress([]byte{3})].Builtin = &parityChainSpecBuiltin{ + }) + spec.setPrecompile(3, &parityChainSpecBuiltin{ Name: "ripemd160", Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 600, Word: 120}}, - } - spec.Accounts[common.BytesToAddress([]byte{4})].Builtin = &parityChainSpecBuiltin{ + }) + spec.setPrecompile(4, &parityChainSpecBuiltin{ Name: "identity", Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 15, Word: 3}}, - } + }) if genesis.Config.ByzantiumBlock != nil { - spec.Accounts[common.BytesToAddress([]byte{5})].Builtin = &parityChainSpecBuiltin{ - Name: "modexp", ActivateAt: genesis.Config.ByzantiumBlock.Uint64(), Pricing: &parityChainSpecPricing{ModExp: &parityChainSpecModExpPricing{Divisor: 20}}, - } - spec.Accounts[common.BytesToAddress([]byte{6})].Builtin = &parityChainSpecBuiltin{ - Name: "alt_bn128_add", ActivateAt: genesis.Config.ByzantiumBlock.Uint64(), Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 500}}, - } - spec.Accounts[common.BytesToAddress([]byte{7})].Builtin = &parityChainSpecBuiltin{ - Name: "alt_bn128_mul", ActivateAt: genesis.Config.ByzantiumBlock.Uint64(), Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 40000}}, - } - spec.Accounts[common.BytesToAddress([]byte{8})].Builtin = &parityChainSpecBuiltin{ - Name: "alt_bn128_pairing", ActivateAt: genesis.Config.ByzantiumBlock.Uint64(), Pricing: &parityChainSpecPricing{AltBnPairing: &parityChainSpecAltBnPairingPricing{Base: 100000, Pair: 80000}}, - } + blnum := math2.HexOrDecimal64(genesis.Config.ByzantiumBlock.Uint64()) + spec.setPrecompile(5, &parityChainSpecBuiltin{ + Name: "modexp", ActivateAt: blnum, Pricing: &parityChainSpecPricing{ModExp: &parityChainSpecModExpPricing{Divisor: 20}}, + }) + spec.setPrecompile(6, &parityChainSpecBuiltin{ + Name: "alt_bn128_add", ActivateAt: blnum, Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 500}}, + }) + spec.setPrecompile(7, &parityChainSpecBuiltin{ + Name: "alt_bn128_mul", ActivateAt: blnum, Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 40000}}, + }) + spec.setPrecompile(8, &parityChainSpecBuiltin{ + Name: "alt_bn128_pairing", ActivateAt: blnum, Pricing: &parityChainSpecPricing{AltBnPairing: &parityChainSpecAltBnPairingPricing{Base: 100000, Pair: 80000}}, + }) } return spec, nil } +func (spec *parityChainSpec) setPrecompile(address byte, data *parityChainSpecBuiltin) { + if spec.Accounts == nil { + spec.Accounts = make(map[common.UnprefixedAddress]*parityChainSpecAccount) + } + a := common.UnprefixedAddress(common.BytesToAddress([]byte{address})) + if _, exist := spec.Accounts[a]; !exist { + spec.Accounts[a] = &parityChainSpecAccount{} + } + spec.Accounts[a].Builtin = data +} + +func (spec *parityChainSpec) setByzantium(num *big.Int) { + spec.Engine.Ethash.Params.BlockReward[hexutil.EncodeBig(num)] = hexutil.EncodeBig(ethash.ByzantiumBlockReward) + spec.Engine.Ethash.Params.DifficultyBombDelays[hexutil.EncodeBig(num)] = hexutil.EncodeUint64(3000000) + n := hexutil.Uint64(num.Uint64()) + spec.Engine.Ethash.Params.EIP100bTransition = n + spec.Params.EIP140Transition = n + spec.Params.EIP211Transition = n + spec.Params.EIP214Transition = n + spec.Params.EIP658Transition = n +} + +func (spec *parityChainSpec) setConstantinople(num *big.Int) { + spec.Engine.Ethash.Params.BlockReward[hexutil.EncodeBig(num)] = hexutil.EncodeBig(ethash.ConstantinopleBlockReward) + spec.Engine.Ethash.Params.DifficultyBombDelays[hexutil.EncodeBig(num)] = hexutil.EncodeUint64(2000000) + n := hexutil.Uint64(num.Uint64()) + spec.Params.EIP145Transition = n + spec.Params.EIP1014Transition = n + spec.Params.EIP1052Transition = n + spec.Params.EIP1283Transition = n +} + +func (spec *parityChainSpec) setConstantinopleFix(num *big.Int) { + spec.Params.EIP1283DisableTransition = hexutil.Uint64(num.Uint64()) +} + // pyEthereumGenesisSpec represents the genesis specification format used by the // Python Ethereum implementation. type pyEthereumGenesisSpec struct { diff --git a/cmd/puppeth/genesis_test.go b/cmd/puppeth/genesis_test.go new file mode 100644 index 000000000000..f128da24f90e --- /dev/null +++ b/cmd/puppeth/genesis_test.go @@ -0,0 +1,108 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package main + +import ( + "encoding/json" + "io/ioutil" + "reflect" + "strings" + "testing" + + "github.com/davecgh/go-spew/spew" + "github.com/ethereum/go-ethereum/core" +) + +// Tests the go-ethereum to Aleth chainspec conversion for the Stureby testnet. +func TestAlethSturebyConverter(t *testing.T) { + blob, err := ioutil.ReadFile("testdata/stureby_geth.json") + if err != nil { + t.Fatalf("could not read file: %v", err) + } + var genesis core.Genesis + if err := json.Unmarshal(blob, &genesis); err != nil { + t.Fatalf("failed parsing genesis: %v", err) + } + spec, err := newAlethGenesisSpec("stureby", &genesis) + if err != nil { + t.Fatalf("failed creating chainspec: %v", err) + } + + expBlob, err := ioutil.ReadFile("testdata/stureby_aleth.json") + if err != nil { + t.Fatalf("could not read file: %v", err) + } + expspec := &alethGenesisSpec{} + if err := json.Unmarshal(expBlob, expspec); err != nil { + t.Fatalf("failed parsing genesis: %v", err) + } + if !reflect.DeepEqual(expspec, spec) { + t.Errorf("chainspec mismatch") + c := spew.ConfigState{ + DisablePointerAddresses: true, + SortKeys: true, + } + exp := strings.Split(c.Sdump(expspec), "\n") + got := strings.Split(c.Sdump(spec), "\n") + for i := 0; i < len(exp) && i < len(got); i++ { + if exp[i] != got[i] { + t.Logf("got: %v\nexp: %v\n", exp[i], got[i]) + } + } + } +} + +// Tests the go-ethereum to Parity chainspec conversion for the Stureby testnet. +func TestParitySturebyConverter(t *testing.T) { + blob, err := ioutil.ReadFile("testdata/stureby_geth.json") + if err != nil { + t.Fatalf("could not read file: %v", err) + } + var genesis core.Genesis + if err := json.Unmarshal(blob, &genesis); err != nil { + t.Fatalf("failed parsing genesis: %v", err) + } + spec, err := newParityChainSpec("Stureby", &genesis, []string{}) + if err != nil { + t.Fatalf("failed creating chainspec: %v", err) + } + + expBlob, err := ioutil.ReadFile("testdata/stureby_parity.json") + if err != nil { + t.Fatalf("could not read file: %v", err) + } + expspec := &parityChainSpec{} + if err := json.Unmarshal(expBlob, expspec); err != nil { + t.Fatalf("failed parsing genesis: %v", err) + } + expspec.Nodes = []string{} + + if !reflect.DeepEqual(expspec, spec) { + t.Errorf("chainspec mismatch") + c := spew.ConfigState{ + DisablePointerAddresses: true, + SortKeys: true, + } + exp := strings.Split(c.Sdump(expspec), "\n") + got := strings.Split(c.Sdump(spec), "\n") + for i := 0; i < len(exp) && i < len(got); i++ { + if exp[i] != got[i] { + t.Logf("got: %v\nexp: %v\n", exp[i], got[i]) + } + } + } +} diff --git a/cmd/puppeth/module_dashboard.go b/cmd/puppeth/module_dashboard.go index d22bd8110398..9a77587b4a85 100644 --- a/cmd/puppeth/module_dashboard.go +++ b/cmd/puppeth/module_dashboard.go @@ -608,30 +608,31 @@ func deployDashboard(client *sshClient, network string, conf *config, config *da bootPython[i] = "'" + boot + "'" } template.Must(template.New("").Parse(dashboardContent)).Execute(indexfile, map[string]interface{}{ - "Network": network, - "NetworkID": conf.Genesis.Config.ChainID, - "NetworkTitle": strings.Title(network), - "EthstatsPage": config.ethstats, - "ExplorerPage": config.explorer, - "WalletPage": config.wallet, - "FaucetPage": config.faucet, - "GethGenesis": network + ".json", - "Bootnodes": conf.bootnodes, - "BootnodesFlat": strings.Join(conf.bootnodes, ","), - "Ethstats": statsLogin, - "Ethash": conf.Genesis.Config.Ethash != nil, - "CppGenesis": network + "-cpp.json", - "CppBootnodes": strings.Join(bootCpp, " "), - "HarmonyGenesis": network + "-harmony.json", - "HarmonyBootnodes": strings.Join(bootHarmony, " "), - "ParityGenesis": network + "-parity.json", - "PythonGenesis": network + "-python.json", - "PythonBootnodes": strings.Join(bootPython, ","), - "Homestead": conf.Genesis.Config.HomesteadBlock, - "Tangerine": conf.Genesis.Config.EIP150Block, - "Spurious": conf.Genesis.Config.EIP155Block, - "Byzantium": conf.Genesis.Config.ByzantiumBlock, - "Constantinople": conf.Genesis.Config.ConstantinopleBlock, + "Network": network, + "NetworkID": conf.Genesis.Config.ChainID, + "NetworkTitle": strings.Title(network), + "EthstatsPage": config.ethstats, + "ExplorerPage": config.explorer, + "WalletPage": config.wallet, + "FaucetPage": config.faucet, + "GethGenesis": network + ".json", + "Bootnodes": conf.bootnodes, + "BootnodesFlat": strings.Join(conf.bootnodes, ","), + "Ethstats": statsLogin, + "Ethash": conf.Genesis.Config.Ethash != nil, + "CppGenesis": network + "-cpp.json", + "CppBootnodes": strings.Join(bootCpp, " "), + "HarmonyGenesis": network + "-harmony.json", + "HarmonyBootnodes": strings.Join(bootHarmony, " "), + "ParityGenesis": network + "-parity.json", + "PythonGenesis": network + "-python.json", + "PythonBootnodes": strings.Join(bootPython, ","), + "Homestead": conf.Genesis.Config.HomesteadBlock, + "Tangerine": conf.Genesis.Config.EIP150Block, + "Spurious": conf.Genesis.Config.EIP155Block, + "Byzantium": conf.Genesis.Config.ByzantiumBlock, + "Constantinople": conf.Genesis.Config.ConstantinopleBlock, + "ConstantinopleFix": conf.Genesis.Config.PetersburgBlock, }) files[filepath.Join(workdir, "index.html")] = indexfile.Bytes() @@ -640,7 +641,7 @@ func deployDashboard(client *sshClient, network string, conf *config, config *da files[filepath.Join(workdir, network+".json")] = genesis if conf.Genesis.Config.Ethash != nil { - cppSpec, err := newCppEthereumGenesisSpec(network, conf.Genesis) + cppSpec, err := newAlethGenesisSpec(network, conf.Genesis) if err != nil { return nil, err } diff --git a/cmd/puppeth/module_ethstats.go b/cmd/puppeth/module_ethstats.go index a7d99a297992..58ecb83951e0 100644 --- a/cmd/puppeth/module_ethstats.go +++ b/cmd/puppeth/module_ethstats.go @@ -43,7 +43,8 @@ version: '2' services: ethstats: build: . - image: {{.Network}}/ethstats{{if not .VHost}} + image: {{.Network}}/ethstats + container_name: {{.Network}}_ethstats_1{{if not .VHost}} ports: - "{{.Port}}:3000"{{end}} environment: diff --git a/cmd/puppeth/module_explorer.go b/cmd/puppeth/module_explorer.go index e916deaf6f99..8fffe1a1c468 100644 --- a/cmd/puppeth/module_explorer.go +++ b/cmd/puppeth/module_explorer.go @@ -30,107 +30,86 @@ import ( // explorerDockerfile is the Dockerfile required to run a block explorer. var explorerDockerfile = ` -FROM puppeth/explorer:latest - -ADD ethstats.json /ethstats.json -ADD chain.json /chain.json +FROM puppeth/blockscout:latest +ADD genesis.json /genesis.json RUN \ - echo '(cd ../eth-net-intelligence-api && pm2 start /ethstats.json)' > explorer.sh && \ - echo '(cd ../etherchain-light && npm start &)' >> explorer.sh && \ - echo 'exec /parity/parity --chain=/chain.json --port={{.NodePort}} --tracing=on --fat-db=on --pruning=archive' >> explorer.sh + echo 'geth --cache 512 init /genesis.json' > explorer.sh && \ + echo $'geth --networkid {{.NetworkID}} --syncmode "full" --gcmode "archive" --port {{.EthPort}} --bootnodes {{.Bootnodes}} --ethstats \'{{.Ethstats}}\' --cache=512 --rpc --rpcapi "net,web3,eth,shh,debug" --rpccorsdomain "*" --rpcvhosts "*" --ws --wsorigins "*" --exitwhensynced' >> explorer.sh && \ + echo $'exec geth --networkid {{.NetworkID}} --syncmode "full" --gcmode "archive" --port {{.EthPort}} --bootnodes {{.Bootnodes}} --ethstats \'{{.Ethstats}}\' --cache=512 --rpc --rpcapi "net,web3,eth,shh,debug" --rpccorsdomain "*" --rpcvhosts "*" --ws --wsorigins "*" &' >> explorer.sh && \ + echo '/usr/local/bin/docker-entrypoint.sh postgres &' >> explorer.sh && \ + echo 'sleep 5' >> explorer.sh && \ + echo 'mix do ecto.drop --force, ecto.create, ecto.migrate' >> explorer.sh && \ + echo 'mix phx.server' >> explorer.sh ENTRYPOINT ["/bin/sh", "explorer.sh"] ` -// explorerEthstats is the configuration file for the ethstats javascript client. -var explorerEthstats = `[ - { - "name" : "node-app", - "script" : "app.js", - "log_date_format" : "YYYY-MM-DD HH:mm Z", - "merge_logs" : false, - "watch" : false, - "max_restarts" : 10, - "exec_interpreter" : "node", - "exec_mode" : "fork_mode", - "env": - { - "NODE_ENV" : "production", - "RPC_HOST" : "localhost", - "RPC_PORT" : "8545", - "LISTENING_PORT" : "{{.Port}}", - "INSTANCE_NAME" : "{{.Name}}", - "CONTACT_DETAILS" : "", - "WS_SERVER" : "{{.Host}}", - "WS_SECRET" : "{{.Secret}}", - "VERBOSITY" : 2 - } - } -]` - // explorerComposefile is the docker-compose.yml file required to deploy and // maintain a block explorer. var explorerComposefile = ` version: '2' services: - explorer: - build: . - image: {{.Network}}/explorer - ports: - - "{{.NodePort}}:{{.NodePort}}" - - "{{.NodePort}}:{{.NodePort}}/udp"{{if not .VHost}} - - "{{.WebPort}}:3000"{{end}} - volumes: - - {{.Datadir}}:/root/.local/share/io.parity.ethereum - environment: - - NODE_PORT={{.NodePort}}/tcp - - STATS={{.Ethstats}}{{if .VHost}} - - VIRTUAL_HOST={{.VHost}} - - VIRTUAL_PORT=3000{{end}} - logging: - driver: "json-file" - options: - max-size: "1m" - max-file: "10" - restart: always + explorer: + build: . + image: {{.Network}}/explorer + container_name: {{.Network}}_explorer_1 + ports: + - "{{.EthPort}}:{{.EthPort}}" + - "{{.EthPort}}:{{.EthPort}}/udp"{{if not .VHost}} + - "{{.WebPort}}:4000"{{end}} + environment: + - ETH_PORT={{.EthPort}} + - ETH_NAME={{.EthName}} + - BLOCK_TRANSFORMER={{.Transformer}}{{if .VHost}} + - VIRTUAL_HOST={{.VHost}} + - VIRTUAL_PORT=4000{{end}} + volumes: + - {{.Datadir}}:/opt/app/.ethereum + - {{.DBDir}}:/var/lib/postgresql/data + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "10" + restart: always ` // deployExplorer deploys a new block explorer container to a remote machine via // SSH, docker and docker-compose. If an instance with the specified network name // already exists there, it will be overwritten! -func deployExplorer(client *sshClient, network string, chainspec []byte, config *explorerInfos, nocache bool) ([]byte, error) { +func deployExplorer(client *sshClient, network string, bootnodes []string, config *explorerInfos, nocache bool, isClique bool) ([]byte, error) { // Generate the content to upload to the server workdir := fmt.Sprintf("%d", rand.Int63()) files := make(map[string][]byte) dockerfile := new(bytes.Buffer) template.Must(template.New("").Parse(explorerDockerfile)).Execute(dockerfile, map[string]interface{}{ - "NodePort": config.nodePort, + "NetworkID": config.node.network, + "Bootnodes": strings.Join(bootnodes, ","), + "Ethstats": config.node.ethstats, + "EthPort": config.node.port, }) files[filepath.Join(workdir, "Dockerfile")] = dockerfile.Bytes() - ethstats := new(bytes.Buffer) - template.Must(template.New("").Parse(explorerEthstats)).Execute(ethstats, map[string]interface{}{ - "Port": config.nodePort, - "Name": config.ethstats[:strings.Index(config.ethstats, ":")], - "Secret": config.ethstats[strings.Index(config.ethstats, ":")+1 : strings.Index(config.ethstats, "@")], - "Host": config.ethstats[strings.Index(config.ethstats, "@")+1:], - }) - files[filepath.Join(workdir, "ethstats.json")] = ethstats.Bytes() - + transformer := "base" + if isClique { + transformer = "clique" + } composefile := new(bytes.Buffer) template.Must(template.New("").Parse(explorerComposefile)).Execute(composefile, map[string]interface{}{ - "Datadir": config.datadir, - "Network": network, - "NodePort": config.nodePort, - "VHost": config.webHost, - "WebPort": config.webPort, - "Ethstats": config.ethstats[:strings.Index(config.ethstats, ":")], + "Network": network, + "VHost": config.host, + "Ethstats": config.node.ethstats, + "Datadir": config.node.datadir, + "DBDir": config.dbdir, + "EthPort": config.node.port, + "EthName": config.node.ethstats[:strings.Index(config.node.ethstats, ":")], + "WebPort": config.port, + "Transformer": transformer, }) files[filepath.Join(workdir, "docker-compose.yaml")] = composefile.Bytes() - - files[filepath.Join(workdir, "chain.json")] = chainspec + files[filepath.Join(workdir, "genesis.json")] = config.node.genesis // Upload the deployment files to the remote server (and clean up afterwards) if out, err := client.Upload(files); err != nil { @@ -148,22 +127,20 @@ func deployExplorer(client *sshClient, network string, chainspec []byte, config // explorerInfos is returned from a block explorer status check to allow reporting // various configuration parameters. type explorerInfos struct { - datadir string - ethstats string - nodePort int - webHost string - webPort int + node *nodeInfos + dbdir string + host string + port int } // Report converts the typed struct into a plain string->string map, containing // most - but not all - fields for reporting to the user. func (info *explorerInfos) Report() map[string]string { report := map[string]string{ - "Data directory": info.datadir, - "Node listener port ": strconv.Itoa(info.nodePort), - "Ethstats username": info.ethstats, - "Website address ": info.webHost, - "Website listener port ": strconv.Itoa(info.webPort), + "Website address ": info.host, + "Website listener port ": strconv.Itoa(info.port), + "Ethereum listener port ": strconv.Itoa(info.node.port), + "Ethstats username": info.node.ethstats, } return report } @@ -171,7 +148,7 @@ func (info *explorerInfos) Report() map[string]string { // checkExplorer does a health-check against a block explorer server to verify // whether it's running, and if yes, whether it's responsive. func checkExplorer(client *sshClient, network string) (*explorerInfos, error) { - // Inspect a possible block explorer container on the host + // Inspect a possible explorer container on the host infos, err := inspectContainer(client, fmt.Sprintf("%s_explorer_1", network)) if err != nil { return nil, err @@ -180,13 +157,13 @@ func checkExplorer(client *sshClient, network string) (*explorerInfos, error) { return nil, ErrServiceOffline } // Resolve the port from the host, or the reverse proxy - webPort := infos.portmap["3000/tcp"] - if webPort == 0 { + port := infos.portmap["4000/tcp"] + if port == 0 { if proxy, _ := checkNginx(client, network); proxy != nil { - webPort = proxy.port + port = proxy.port } } - if webPort == 0 { + if port == 0 { return nil, ErrNotExposed } // Resolve the host from the reverse-proxy and the config values @@ -195,17 +172,23 @@ func checkExplorer(client *sshClient, network string) (*explorerInfos, error) { host = client.server } // Run a sanity check to see if the devp2p is reachable - nodePort := infos.portmap[infos.envvars["NODE_PORT"]] - if err = checkPort(client.server, nodePort); err != nil { - log.Warn(fmt.Sprintf("Explorer devp2p port seems unreachable"), "server", client.server, "port", nodePort, "err", err) + p2pPort := infos.portmap[infos.envvars["ETH_PORT"]+"/tcp"] + if err = checkPort(host, p2pPort); err != nil { + log.Warn("Explorer node seems unreachable", "server", host, "port", p2pPort, "err", err) + } + if err = checkPort(host, port); err != nil { + log.Warn("Explorer service seems unreachable", "server", host, "port", port, "err", err) } // Assemble and return the useful infos stats := &explorerInfos{ - datadir: infos.volumes["/root/.local/share/io.parity.ethereum"], - nodePort: nodePort, - webHost: host, - webPort: webPort, - ethstats: infos.envvars["STATS"], + node: &nodeInfos{ + datadir: infos.volumes["/opt/app/.ethereum"], + port: infos.portmap[infos.envvars["ETH_PORT"]+"/tcp"], + ethstats: infos.envvars["ETH_NAME"], + }, + dbdir: infos.volumes["/var/lib/postgresql/data"], + host: host, + port: port, } return stats, nil } diff --git a/cmd/puppeth/module_faucet.go b/cmd/puppeth/module_faucet.go index 06c9fc0f583c..3a06bf3c68da 100644 --- a/cmd/puppeth/module_faucet.go +++ b/cmd/puppeth/module_faucet.go @@ -56,8 +56,10 @@ services: faucet: build: . image: {{.Network}}/faucet + container_name: {{.Network}}_faucet_1 ports: - - "{{.EthPort}}:{{.EthPort}}"{{if not .VHost}} + - "{{.EthPort}}:{{.EthPort}}" + - "{{.EthPort}}:{{.EthPort}}/udp"{{if not .VHost}} - "{{.ApiPort}}:8080"{{end}} volumes: - {{.Datadir}}:/root/.faucet diff --git a/cmd/puppeth/module_nginx.go b/cmd/puppeth/module_nginx.go index 7f87661d3bc9..1b1ae61ff598 100644 --- a/cmd/puppeth/module_nginx.go +++ b/cmd/puppeth/module_nginx.go @@ -40,6 +40,7 @@ services: nginx: build: . image: {{.Network}}/nginx + container_name: {{.Network}}_nginx_1 ports: - "{{.Port}}:80" volumes: diff --git a/cmd/puppeth/module_node.go b/cmd/puppeth/module_node.go index 038152a3e44c..5d9ef46523e0 100644 --- a/cmd/puppeth/module_node.go +++ b/cmd/puppeth/module_node.go @@ -42,7 +42,7 @@ ADD genesis.json /genesis.json RUN \ echo 'geth --cache 512 init /genesis.json' > geth.sh && \{{if .Unlock}} echo 'mkdir -p /root/.ethereum/keystore/ && cp /signer.json /root/.ethereum/keystore/' >> geth.sh && \{{end}} - echo $'exec geth --networkid {{.NetworkID}} --cache 512 --port {{.Port}} --maxpeers {{.Peers}} {{.LightFlag}} --ethstats \'{{.Ethstats}}\' {{if .Bootnodes}}--bootnodes {{.Bootnodes}}{{end}} {{if .Etherbase}}--miner.etherbase {{.Etherbase}} --mine --miner.threads 1{{end}} {{if .Unlock}}--unlock 0 --password /signer.pass --mine{{end}} --miner.gastarget {{.GasTarget}} --miner.gaslimit {{.GasLimit}} --miner.gasprice {{.GasPrice}}' >> geth.sh + echo $'exec geth --networkid {{.NetworkID}} --cache 512 --port {{.Port}} --nat extip:{{.IP}} --maxpeers {{.Peers}} {{.LightFlag}} --ethstats \'{{.Ethstats}}\' {{if .Bootnodes}}--bootnodes {{.Bootnodes}}{{end}} {{if .Etherbase}}--miner.etherbase {{.Etherbase}} --mine --miner.threads 1{{end}} {{if .Unlock}}--unlock 0 --password /signer.pass --mine{{end}} --miner.gastarget {{.GasTarget}} --miner.gaslimit {{.GasLimit}} --miner.gasprice {{.GasPrice}}' >> geth.sh ENTRYPOINT ["/bin/sh", "geth.sh"] ` @@ -55,6 +55,7 @@ services: {{.Type}}: build: . image: {{.Network}}/{{.Type}} + container_name: {{.Network}}_{{.Type}}_1 ports: - "{{.Port}}:{{.Port}}" - "{{.Port}}:{{.Port}}/udp" @@ -99,6 +100,7 @@ func deployNode(client *sshClient, network string, bootnodes []string, config *n template.Must(template.New("").Parse(nodeDockerfile)).Execute(dockerfile, map[string]interface{}{ "NetworkID": config.network, "Port": config.port, + "IP": client.address, "Peers": config.peersTotal, "LightFlag": lightFlag, "Bootnodes": strings.Join(bootnodes, ","), @@ -227,10 +229,10 @@ func checkNode(client *sshClient, network string, boot bool) (*nodeInfos, error) // Container available, retrieve its node ID and its genesis json var out []byte - if out, err = client.Run(fmt.Sprintf("docker exec %s_%s_1 geth --exec admin.nodeInfo.id --cache=16 attach", network, kind)); err != nil { + if out, err = client.Run(fmt.Sprintf("docker exec %s_%s_1 geth --exec admin.nodeInfo.enode --cache=16 attach", network, kind)); err != nil { return nil, ErrServiceUnreachable } - id := bytes.Trim(bytes.TrimSpace(out), "\"") + enode := bytes.Trim(bytes.TrimSpace(out), "\"") if out, err = client.Run(fmt.Sprintf("docker exec %s_%s_1 cat /genesis.json", network, kind)); err != nil { return nil, ErrServiceUnreachable @@ -265,7 +267,7 @@ func checkNode(client *sshClient, network string, boot bool) (*nodeInfos, error) gasLimit: gasLimit, gasPrice: gasPrice, } - stats.enode = fmt.Sprintf("enode://%s@%s:%d", id, client.address, stats.port) + stats.enode = string(enode) return stats, nil } diff --git a/cmd/puppeth/module_wallet.go b/cmd/puppeth/module_wallet.go index 90812c4a0b8b..ebaa5b6ae1a5 100644 --- a/cmd/puppeth/module_wallet.go +++ b/cmd/puppeth/module_wallet.go @@ -57,6 +57,7 @@ services: wallet: build: . image: {{.Network}}/wallet + container_name: {{.Network}}_wallet_1 ports: - "{{.NodePort}}:{{.NodePort}}" - "{{.NodePort}}:{{.NodePort}}/udp" diff --git a/cmd/puppeth/puppeth.go b/cmd/puppeth/puppeth.go index f9b8fe481153..c3de5f936024 100644 --- a/cmd/puppeth/puppeth.go +++ b/cmd/puppeth/puppeth.go @@ -43,18 +43,23 @@ func main() { Usage: "log level to emit to the screen", }, } - app.Action = func(c *cli.Context) error { + app.Before = func(c *cli.Context) error { // Set up the logger to print everything and the random generator log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(c.Int("loglevel")), log.StreamHandler(os.Stdout, log.TerminalFormat(true)))) rand.Seed(time.Now().UnixNano()) - network := c.String("network") - if strings.Contains(network, " ") || strings.Contains(network, "-") { - log.Crit("No spaces or hyphens allowed in network name") - } - // Start the wizard and relinquish control - makeWizard(c.String("network")).run() return nil } + app.Action = runWizard app.Run(os.Args) } + +// runWizard start the wizard and relinquish control to it. +func runWizard(c *cli.Context) error { + network := c.String("network") + if strings.Contains(network, " ") || strings.Contains(network, "-") || strings.ToLower(network) != network { + log.Crit("No spaces, hyphens or capital letters allowed in network name") + } + makeWizard(c.String("network")).run() + return nil +} diff --git a/cmd/puppeth/testdata/stureby_aleth.json b/cmd/puppeth/testdata/stureby_aleth.json new file mode 100644 index 000000000000..1ef1d8ae1866 --- /dev/null +++ b/cmd/puppeth/testdata/stureby_aleth.json @@ -0,0 +1,112 @@ +{ + "sealEngine":"Ethash", + "params":{ + "accountStartNonce":"0x00", + "maximumExtraDataSize":"0x20", + "homesteadForkBlock":"0x2710", + "daoHardforkBlock":"0x00", + "EIP150ForkBlock":"0x3a98", + "EIP158ForkBlock":"0x59d8", + "byzantiumForkBlock":"0x7530", + "constantinopleForkBlock":"0x9c40", + "minGasLimit":"0x1388", + "maxGasLimit":"0x7fffffffffffffff", + "tieBreakingGas":false, + "gasLimitBoundDivisor":"0x0400", + "minimumDifficulty":"0x20000", + "difficultyBoundDivisor":"0x0800", + "durationLimit":"0x0d", + "blockReward":"0x4563918244F40000", + "networkID":"0x4cb2e", + "chainID":"0x4cb2e", + "allowFutureBlocks":false + }, + "genesis":{ + "nonce":"0x0000000000000000", + "difficulty":"0x20000", + "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "author":"0x0000000000000000000000000000000000000000", + "timestamp":"0x59a4e76d", + "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData":"0x0000000000000000000000000000000000000000000000000000000b4dc0ffee", + "gasLimit":"0x47b760" + }, + "accounts":{ + "0000000000000000000000000000000000000001":{ + "balance":"1", + "precompiled":{ + "name":"ecrecover", + "linear":{ + "base":3000, + "word":0 + } + } + }, + "0000000000000000000000000000000000000002":{ + "balance":"1", + "precompiled":{ + "name":"sha256", + "linear":{ + "base":60, + "word":12 + } + } + }, + "0000000000000000000000000000000000000003":{ + "balance":"1", + "precompiled":{ + "name":"ripemd160", + "linear":{ + "base":600, + "word":120 + } + } + }, + "0000000000000000000000000000000000000004":{ + "balance":"1", + "precompiled":{ + "name":"identity", + "linear":{ + "base":15, + "word":3 + } + } + }, + "0000000000000000000000000000000000000005":{ + "balance":"1", + "precompiled":{ + "name":"modexp", + "startingBlock":"0x7530" + } + }, + "0000000000000000000000000000000000000006":{ + "balance":"1", + "precompiled":{ + "name":"alt_bn128_G1_add", + "startingBlock":"0x7530", + "linear":{ + "base":500, + "word":0 + } + } + }, + "0000000000000000000000000000000000000007":{ + "balance":"1", + "precompiled":{ + "name":"alt_bn128_G1_mul", + "startingBlock":"0x7530", + "linear":{ + "base":40000, + "word":0 + } + } + }, + "0000000000000000000000000000000000000008":{ + "balance":"1", + "precompiled":{ + "name":"alt_bn128_pairing_product", + "startingBlock":"0x7530" + } + } + } +} diff --git a/cmd/puppeth/testdata/stureby_geth.json b/cmd/puppeth/testdata/stureby_geth.json new file mode 100644 index 000000000000..c8c3b3c9564c --- /dev/null +++ b/cmd/puppeth/testdata/stureby_geth.json @@ -0,0 +1,47 @@ +{ + "config": { + "ethash":{}, + "chainId": 314158, + "homesteadBlock": 10000, + "eip150Block": 15000, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 23000, + "eip158Block": 23000, + "byzantiumBlock": 30000, + "constantinopleBlock": 40000 + }, + "nonce": "0x0", + "timestamp": "0x59a4e76d", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x0000000000000000000000000000000000000000000000000000000b4dc0ffee", + "gasLimit": "0x47b760", + "difficulty": "0x20000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0000000000000000000000000000000000000001": { + "balance": "0x01" + }, + "0000000000000000000000000000000000000002": { + "balance": "0x01" + }, + "0000000000000000000000000000000000000003": { + "balance": "0x01" + }, + "0000000000000000000000000000000000000004": { + "balance": "0x01" + }, + "0000000000000000000000000000000000000005": { + "balance": "0x01" + }, + "0000000000000000000000000000000000000006": { + "balance": "0x01" + }, + "0000000000000000000000000000000000000007": { + "balance": "0x01" + }, + "0000000000000000000000000000000000000008": { + "balance": "0x01" + } + } +} diff --git a/cmd/puppeth/testdata/stureby_parity.json b/cmd/puppeth/testdata/stureby_parity.json new file mode 100644 index 000000000000..f3fa8386a061 --- /dev/null +++ b/cmd/puppeth/testdata/stureby_parity.json @@ -0,0 +1,181 @@ +{ + "name":"Stureby", + "dataDir":"stureby", + "engine":{ + "Ethash":{ + "params":{ + "minimumDifficulty":"0x20000", + "difficultyBoundDivisor":"0x800", + "durationLimit":"0xd", + "blockReward":{ + "0x0":"0x4563918244f40000", + "0x7530":"0x29a2241af62c0000", + "0x9c40":"0x1bc16d674ec80000" + }, + "homesteadTransition":"0x2710", + "eip100bTransition":"0x7530", + "difficultyBombDelays":{ + "0x7530":"0x2dc6c0", + "0x9c40":"0x1e8480" + } + } + } + }, + "params":{ + "accountStartNonce":"0x0", + "maximumExtraDataSize":"0x20", + "gasLimitBoundDivisor":"0x400", + "minGasLimit":"0x1388", + "networkID":"0x4cb2e", + "chainID":"0x4cb2e", + "maxCodeSize":"0x6000", + "maxCodeSizeTransition":"0x0", + "eip98Transition": "0x7fffffffffffffff", + "eip150Transition":"0x3a98", + "eip160Transition":"0x59d8", + "eip161abcTransition":"0x59d8", + "eip161dTransition":"0x59d8", + "eip155Transition":"0x59d8", + "eip140Transition":"0x7530", + "eip211Transition":"0x7530", + "eip214Transition":"0x7530", + "eip658Transition":"0x7530", + "eip145Transition":"0x9c40", + "eip1014Transition":"0x9c40", + "eip1052Transition":"0x9c40", + "eip1283Transition":"0x9c40" + }, + "genesis":{ + "seal":{ + "ethereum":{ + "nonce":"0x0000000000000000", + "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "difficulty":"0x20000", + "author":"0x0000000000000000000000000000000000000000", + "timestamp":"0x59a4e76d", + "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData":"0x0000000000000000000000000000000000000000000000000000000b4dc0ffee", + "gasLimit":"0x47b760" + }, + "nodes":[ + "enode://dfa7aca3f5b635fbfe7d0b20575f25e40d9e27b4bfbb3cf74364a42023ad9f25c1a4383bcc8cced86ee511a7d03415345a4df05be37f1dff040e4c780699f1c0@168.61.153.255:31303", + "enode://ef441b20dd70aeabf0eac35c3b8a2854e5ce04db0e30be9152ea9fd129359dcbb3f803993303ff5781c755dfd7223f3fe43505f583cccb740949407677412ba9@40.74.91.252:31303", + "enode://953b5ea1c8987cf46008232a0160324fd00d41320ecf00e23af86ec8f5396b19eb57ddab37c78141be56f62e9077de4f4dfa0747fa768ed8c8531bbfb1046237@40.70.214.166:31303", + "enode://276e613dd4b277a66591e565711e6c8bb107f0905248a9f8f8228c1a87992e156e5114bb9937c02824a9d9d25f76340442cf86e2028bf5293cae19904fb2b98e@35.178.251.52:30303", + "enode://064c820d41e52ed7d426ac64b60506c2998235bedc7e67cb497c6faf7bb4fc54fe56fc82d0add3180b747c0c4f40a1108a6f84d7d0629ed606d504528e61cc57@3.8.5.3:30303", + "enode://90069fdabcc5e684fa5d59430bebbb12755d9362dfe5006a1485b13d71a78a3812d36e74dd7d88e50b51add01e097ea80f16263aeaa4f0230db6c79e2a97e7ca@217.29.191.142:30303", + "enode://0aac74b7fd28726275e466acb5e03bc88a95927e9951eb66b5efb239b2f798ada0690853b2f2823fe4efa408f0f3d4dd258430bc952a5ff70677b8625b3e3b14@40.115.33.57:40404", + "enode://0b96415a10f835106d83e090a0528eed5e7887e5c802a6d084e9f1993a9d0fc713781e6e4101f6365e9b91259712f291acc0a9e6e667e22023050d602c36fbe2@40.115.33.57:40414" + ], + "accounts":{ + "0000000000000000000000000000000000000001":{ + "balance":"1", + "nonce":"0", + "builtin":{ + "name":"ecrecover", + "pricing":{ + "linear":{ + "base":3000, + "word":0 + } + } + } + }, + "0000000000000000000000000000000000000002":{ + "balance":"1", + "nonce":"0", + "builtin":{ + "name":"sha256", + "pricing":{ + "linear":{ + "base":60, + "word":12 + } + } + } + }, + "0000000000000000000000000000000000000003":{ + "balance":"1", + "nonce":"0", + "builtin":{ + "name":"ripemd160", + "pricing":{ + "linear":{ + "base":600, + "word":120 + } + } + } + }, + "0000000000000000000000000000000000000004":{ + "balance":"1", + "nonce":"0", + "builtin":{ + "name":"identity", + "pricing":{ + "linear":{ + "base":15, + "word":3 + } + } + } + }, + "0000000000000000000000000000000000000005":{ + "balance":"1", + "nonce":"0", + "builtin":{ + "name":"modexp", + "activate_at":"0x7530", + "pricing":{ + "modexp":{ + "divisor":20 + } + } + } + }, + "0000000000000000000000000000000000000006":{ + "balance":"1", + "nonce":"0", + "builtin":{ + "name":"alt_bn128_add", + "activate_at":"0x7530", + "pricing":{ + "linear":{ + "base":500, + "word":0 + } + } + } + }, + "0000000000000000000000000000000000000007":{ + "balance":"1", + "nonce":"0", + "builtin":{ + "name":"alt_bn128_mul", + "activate_at":"0x7530", + "pricing":{ + "linear":{ + "base":40000, + "word":0 + } + } + } + }, + "0000000000000000000000000000000000000008":{ + "balance":"1", + "nonce":"0", + "builtin":{ + "name":"alt_bn128_pairing", + "activate_at":"0x7530", + "pricing":{ + "alt_bn128_pairing":{ + "base":100000, + "pair":80000 + } + } + } + } + } +} diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index b88a61de7ded..83536506c4cb 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -23,6 +23,7 @@ import ( "io/ioutil" "math/big" "net" + "net/url" "os" "path/filepath" "sort" @@ -118,6 +119,47 @@ func (w *wizard) readDefaultString(def string) string { return def } +// readDefaultYesNo reads a single line from stdin, trimming if from spaces and +// interpreting it as a 'yes' or a 'no'. If an empty line is entered, the default +// value is returned. +func (w *wizard) readDefaultYesNo(def bool) bool { + for { + fmt.Printf("> ") + text, err := w.in.ReadString('\n') + if err != nil { + log.Crit("Failed to read user input", "err", err) + } + if text = strings.ToLower(strings.TrimSpace(text)); text == "" { + return def + } + if text == "y" || text == "yes" { + return true + } + if text == "n" || text == "no" { + return false + } + log.Error("Invalid input, expected 'y', 'yes', 'n', 'no' or empty") + } +} + +// readURL reads a single line from stdin, trimming if from spaces and trying to +// interpret it as a URL (http, https or file). +func (w *wizard) readURL() *url.URL { + for { + fmt.Printf("> ") + text, err := w.in.ReadString('\n') + if err != nil { + log.Crit("Failed to read user input", "err", err) + } + uri, err := url.Parse(strings.TrimSpace(text)) + if err != nil { + log.Error("Invalid input, expected URL", "err", err) + continue + } + return uri + } +} + // readInt reads a single line from stdin, trimming if from spaces, enforcing it // to parse into an integer. func (w *wizard) readInt() int { diff --git a/cmd/puppeth/wizard_dashboard.go b/cmd/puppeth/wizard_dashboard.go index 1a01631ff453..b699d7617d00 100644 --- a/cmd/puppeth/wizard_dashboard.go +++ b/cmd/puppeth/wizard_dashboard.go @@ -77,7 +77,7 @@ func (w *wizard) deployDashboard() { } case "explorer": if infos, err := checkExplorer(client, w.network); err == nil { - port = infos.webPort + port = infos.port } case "wallet": if infos, err := checkWallet(client, w.network); err == nil { @@ -137,14 +137,14 @@ func (w *wizard) deployDashboard() { if w.conf.ethstats != "" { fmt.Println() fmt.Println("Include ethstats secret on dashboard (y/n)? (default = yes)") - infos.trusted = w.readDefaultString("y") == "y" + infos.trusted = w.readDefaultYesNo(true) } // Try to deploy the dashboard container on the host nocache := false if existed { fmt.Println() fmt.Printf("Should the dashboard be built from scratch (y/n)? (default = no)\n") - nocache = w.readDefaultString("n") != "n" + nocache = w.readDefaultYesNo(false) } if out, err := deployDashboard(client, w.network, &w.conf, infos, nocache); err != nil { log.Error("Failed to deploy dashboard container", "err", err) diff --git a/cmd/puppeth/wizard_ethstats.go b/cmd/puppeth/wizard_ethstats.go index fb2529c2673a..58ff3efbe986 100644 --- a/cmd/puppeth/wizard_ethstats.go +++ b/cmd/puppeth/wizard_ethstats.go @@ -67,11 +67,11 @@ func (w *wizard) deployEthstats() { if existed { fmt.Println() fmt.Printf("Keep existing IP %v blacklist (y/n)? (default = yes)\n", infos.banned) - if w.readDefaultString("y") != "y" { + if !w.readDefaultYesNo(true) { // The user might want to clear the entire list, although generally probably not fmt.Println() fmt.Printf("Clear out blacklist and start over (y/n)? (default = no)\n") - if w.readDefaultString("n") != "n" { + if w.readDefaultYesNo(false) { infos.banned = nil } // Offer the user to explicitly add/remove certain IP addresses @@ -106,7 +106,7 @@ func (w *wizard) deployEthstats() { if existed { fmt.Println() fmt.Printf("Should the ethstats be built from scratch (y/n)? (default = no)\n") - nocache = w.readDefaultString("n") != "n" + nocache = w.readDefaultYesNo(false) } trusted := make([]string, 0, len(w.servers)) for _, client := range w.servers { diff --git a/cmd/puppeth/wizard_explorer.go b/cmd/puppeth/wizard_explorer.go index 413511c1c3a1..1df9cbc0f322 100644 --- a/cmd/puppeth/wizard_explorer.go +++ b/cmd/puppeth/wizard_explorer.go @@ -35,10 +35,6 @@ func (w *wizard) deployExplorer() { log.Error("No ethstats server configured") return } - if w.conf.Genesis.Config.Ethash == nil { - log.Error("Only ethash network supported") - return - } // Select the server to interact with server := w.selectServer() if server == "" { @@ -50,59 +46,66 @@ func (w *wizard) deployExplorer() { infos, err := checkExplorer(client, w.network) if err != nil { infos = &explorerInfos{ - nodePort: 30303, webPort: 80, webHost: client.server, + node: &nodeInfos{port: 30303}, + port: 80, + host: client.server, } } existed := err == nil - chainspec, err := newParityChainSpec(w.network, w.conf.Genesis, w.conf.bootnodes) - if err != nil { - log.Error("Failed to create chain spec for explorer", "err", err) - return - } - chain, _ := json.MarshalIndent(chainspec, "", " ") + infos.node.genesis, _ = json.MarshalIndent(w.conf.Genesis, "", " ") + infos.node.network = w.conf.Genesis.Config.ChainID.Int64() // Figure out which port to listen on fmt.Println() - fmt.Printf("Which port should the explorer listen on? (default = %d)\n", infos.webPort) - infos.webPort = w.readDefaultInt(infos.webPort) + fmt.Printf("Which port should the explorer listen on? (default = %d)\n", infos.port) + infos.port = w.readDefaultInt(infos.port) // Figure which virtual-host to deploy ethstats on - if infos.webHost, err = w.ensureVirtualHost(client, infos.webPort, infos.webHost); err != nil { + if infos.host, err = w.ensureVirtualHost(client, infos.port, infos.host); err != nil { log.Error("Failed to decide on explorer host", "err", err) return } // Figure out where the user wants to store the persistent data fmt.Println() - if infos.datadir == "" { - fmt.Printf("Where should data be stored on the remote machine?\n") - infos.datadir = w.readString() + if infos.node.datadir == "" { + fmt.Printf("Where should node data be stored on the remote machine?\n") + infos.node.datadir = w.readString() + } else { + fmt.Printf("Where should node data be stored on the remote machine? (default = %s)\n", infos.node.datadir) + infos.node.datadir = w.readDefaultString(infos.node.datadir) + } + // Figure out where the user wants to store the persistent data for backend database + fmt.Println() + if infos.dbdir == "" { + fmt.Printf("Where should postgres data be stored on the remote machine?\n") + infos.dbdir = w.readString() } else { - fmt.Printf("Where should data be stored on the remote machine? (default = %s)\n", infos.datadir) - infos.datadir = w.readDefaultString(infos.datadir) + fmt.Printf("Where should postgres data be stored on the remote machine? (default = %s)\n", infos.dbdir) + infos.dbdir = w.readDefaultString(infos.dbdir) } // Figure out which port to listen on fmt.Println() - fmt.Printf("Which TCP/UDP port should the archive node listen on? (default = %d)\n", infos.nodePort) - infos.nodePort = w.readDefaultInt(infos.nodePort) + fmt.Printf("Which TCP/UDP port should the archive node listen on? (default = %d)\n", infos.node.port) + infos.node.port = w.readDefaultInt(infos.node.port) // Set a proper name to report on the stats page fmt.Println() - if infos.ethstats == "" { + if infos.node.ethstats == "" { fmt.Printf("What should the explorer be called on the stats page?\n") - infos.ethstats = w.readString() + ":" + w.conf.ethstats + infos.node.ethstats = w.readString() + ":" + w.conf.ethstats } else { - fmt.Printf("What should the explorer be called on the stats page? (default = %s)\n", infos.ethstats) - infos.ethstats = w.readDefaultString(infos.ethstats) + ":" + w.conf.ethstats + fmt.Printf("What should the explorer be called on the stats page? (default = %s)\n", infos.node.ethstats) + infos.node.ethstats = w.readDefaultString(infos.node.ethstats) + ":" + w.conf.ethstats } // Try to deploy the explorer on the host nocache := false if existed { fmt.Println() fmt.Printf("Should the explorer be built from scratch (y/n)? (default = no)\n") - nocache = w.readDefaultString("n") != "n" + nocache = w.readDefaultYesNo(false) } - if out, err := deployExplorer(client, w.network, chain, infos, nocache); err != nil { + if out, err := deployExplorer(client, w.network, w.conf.bootnodes, infos, nocache, w.conf.Genesis.Config.Clique != nil); err != nil { log.Error("Failed to deploy explorer container", "err", err) if len(out) > 0 { fmt.Printf("%s\n", out) diff --git a/cmd/puppeth/wizard_faucet.go b/cmd/puppeth/wizard_faucet.go index 6f0840894747..9068c1d30b5a 100644 --- a/cmd/puppeth/wizard_faucet.go +++ b/cmd/puppeth/wizard_faucet.go @@ -81,7 +81,7 @@ func (w *wizard) deployFaucet() { if infos.captchaToken != "" { fmt.Println() fmt.Println("Reuse previous reCaptcha API authorization (y/n)? (default = yes)") - if w.readDefaultString("y") != "y" { + if !w.readDefaultYesNo(true) { infos.captchaToken, infos.captchaSecret = "", "" } } @@ -89,7 +89,7 @@ func (w *wizard) deployFaucet() { // No previous authorization (or old one discarded) fmt.Println() fmt.Println("Enable reCaptcha protection against robots (y/n)? (default = no)") - if w.readDefaultString("n") == "n" { + if !w.readDefaultYesNo(false) { log.Warn("Users will be able to requests funds via automated scripts") } else { // Captcha protection explicitly requested, read the site and secret keys @@ -132,7 +132,7 @@ func (w *wizard) deployFaucet() { } else { fmt.Println() fmt.Printf("Reuse previous (%s) funding account (y/n)? (default = yes)\n", key.Address.Hex()) - if w.readDefaultString("y") != "y" { + if !w.readDefaultYesNo(true) { infos.node.keyJSON, infos.node.keyPass = "", "" } } @@ -166,7 +166,7 @@ func (w *wizard) deployFaucet() { if existed { fmt.Println() fmt.Printf("Should the faucet be built from scratch (y/n)? (default = no)\n") - nocache = w.readDefaultString("n") != "n" + nocache = w.readDefaultYesNo(false) } if out, err := deployFaucet(client, w.network, w.conf.bootnodes, infos, nocache); err != nil { log.Error("Failed to deploy faucet container", "err", err) diff --git a/cmd/puppeth/wizard_genesis.go b/cmd/puppeth/wizard_genesis.go index 6c4cd571fbaa..499f320f6432 100644 --- a/cmd/puppeth/wizard_genesis.go +++ b/cmd/puppeth/wizard_genesis.go @@ -20,9 +20,13 @@ import ( "bytes" "encoding/json" "fmt" + "io" "io/ioutil" "math/big" "math/rand" + "net/http" + "os" + "path/filepath" "time" "github.com/ethereum/go-ethereum/common" @@ -40,11 +44,13 @@ func (w *wizard) makeGenesis() { Difficulty: big.NewInt(524288), Alloc: make(core.GenesisAlloc), Config: ¶ms.ChainConfig{ - HomesteadBlock: big.NewInt(1), - EIP150Block: big.NewInt(2), - EIP155Block: big.NewInt(3), - EIP158Block: big.NewInt(3), - ByzantiumBlock: big.NewInt(4), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), }, } // Figure out which consensus engine to choose @@ -114,9 +120,13 @@ func (w *wizard) makeGenesis() { } break } - // Add a batch of precompile balances to avoid them getting deleted - for i := int64(0); i < 256; i++ { - genesis.Alloc[common.BigToAddress(big.NewInt(i))] = core.GenesisAccount{Balance: big.NewInt(1)} + fmt.Println() + fmt.Println("Should the precompile-addresses (0x1 .. 0xff) be pre-funded with 1 wei? (advisable yes)") + if w.readDefaultYesNo(true) { + // Add a batch of precompile balances to avoid them getting deleted + for i := int64(0); i < 256; i++ { + genesis.Alloc[common.BigToAddress(big.NewInt(i))] = core.GenesisAccount{Balance: big.NewInt(1)} + } } // Query the user for some custom extras fmt.Println() @@ -130,53 +140,138 @@ func (w *wizard) makeGenesis() { w.conf.flush() } +// importGenesis imports a Geth genesis spec into puppeth. +func (w *wizard) importGenesis() { + // Request the genesis JSON spec URL from the user + fmt.Println() + fmt.Println("Where's the genesis file? (local file or http/https url)") + url := w.readURL() + + // Convert the various allowed URLs to a reader stream + var reader io.Reader + + switch url.Scheme { + case "http", "https": + // Remote web URL, retrieve it via an HTTP client + res, err := http.Get(url.String()) + if err != nil { + log.Error("Failed to retrieve remote genesis", "err", err) + return + } + defer res.Body.Close() + reader = res.Body + + case "": + // Schemaless URL, interpret as a local file + file, err := os.Open(url.String()) + if err != nil { + log.Error("Failed to open local genesis", "err", err) + return + } + defer file.Close() + reader = file + + default: + log.Error("Unsupported genesis URL scheme", "scheme", url.Scheme) + return + } + // Parse the genesis file and inject it successful + var genesis core.Genesis + if err := json.NewDecoder(reader).Decode(&genesis); err != nil { + log.Error("Invalid genesis spec: %v", err) + return + } + log.Info("Imported genesis block") + + w.conf.Genesis = &genesis + w.conf.flush() +} + // manageGenesis permits the modification of chain configuration parameters in // a genesis config and the export of the entire genesis spec. func (w *wizard) manageGenesis() { // Figure out whether to modify or export the genesis fmt.Println() - fmt.Println(" 1. Modify existing fork rules") - fmt.Println(" 2. Export genesis configuration") + fmt.Println(" 1. Modify existing configurations") + fmt.Println(" 2. Export genesis configurations") fmt.Println(" 3. Remove genesis configuration") choice := w.read() - switch { - case choice == "1": + switch choice { + case "1": // Fork rule updating requested, iterate over each fork fmt.Println() fmt.Printf("Which block should Homestead come into effect? (default = %v)\n", w.conf.Genesis.Config.HomesteadBlock) w.conf.Genesis.Config.HomesteadBlock = w.readDefaultBigInt(w.conf.Genesis.Config.HomesteadBlock) fmt.Println() - fmt.Printf("Which block should EIP150 come into effect? (default = %v)\n", w.conf.Genesis.Config.EIP150Block) + fmt.Printf("Which block should EIP150 (Tangerine Whistle) come into effect? (default = %v)\n", w.conf.Genesis.Config.EIP150Block) w.conf.Genesis.Config.EIP150Block = w.readDefaultBigInt(w.conf.Genesis.Config.EIP150Block) fmt.Println() - fmt.Printf("Which block should EIP155 come into effect? (default = %v)\n", w.conf.Genesis.Config.EIP155Block) + fmt.Printf("Which block should EIP155 (Spurious Dragon) come into effect? (default = %v)\n", w.conf.Genesis.Config.EIP155Block) w.conf.Genesis.Config.EIP155Block = w.readDefaultBigInt(w.conf.Genesis.Config.EIP155Block) fmt.Println() - fmt.Printf("Which block should EIP158 come into effect? (default = %v)\n", w.conf.Genesis.Config.EIP158Block) + fmt.Printf("Which block should EIP158/161 (also Spurious Dragon) come into effect? (default = %v)\n", w.conf.Genesis.Config.EIP158Block) w.conf.Genesis.Config.EIP158Block = w.readDefaultBigInt(w.conf.Genesis.Config.EIP158Block) fmt.Println() fmt.Printf("Which block should Byzantium come into effect? (default = %v)\n", w.conf.Genesis.Config.ByzantiumBlock) w.conf.Genesis.Config.ByzantiumBlock = w.readDefaultBigInt(w.conf.Genesis.Config.ByzantiumBlock) + fmt.Println() + fmt.Printf("Which block should Constantinople come into effect? (default = %v)\n", w.conf.Genesis.Config.ConstantinopleBlock) + w.conf.Genesis.Config.ConstantinopleBlock = w.readDefaultBigInt(w.conf.Genesis.Config.ConstantinopleBlock) + if w.conf.Genesis.Config.PetersburgBlock == nil { + w.conf.Genesis.Config.PetersburgBlock = w.conf.Genesis.Config.ConstantinopleBlock + } + fmt.Println() + fmt.Printf("Which block should Petersburg come into effect? (default = %v)\n", w.conf.Genesis.Config.PetersburgBlock) + w.conf.Genesis.Config.PetersburgBlock = w.readDefaultBigInt(w.conf.Genesis.Config.PetersburgBlock) + out, _ := json.MarshalIndent(w.conf.Genesis.Config, "", " ") fmt.Printf("Chain configuration updated:\n\n%s\n", out) - case choice == "2": + w.conf.flush() + + case "2": // Save whatever genesis configuration we currently have fmt.Println() - fmt.Printf("Which file to save the genesis into? (default = %s.json)\n", w.network) + fmt.Printf("Which folder to save the genesis specs into? (default = current)\n") + fmt.Printf(" Will create %s.json, %s-aleth.json, %s-harmony.json, %s-parity.json\n", w.network, w.network, w.network, w.network) + + folder := w.readDefaultString(".") + if err := os.MkdirAll(folder, 0755); err != nil { + log.Error("Failed to create spec folder", "folder", folder, "err", err) + return + } out, _ := json.MarshalIndent(w.conf.Genesis, "", " ") - if err := ioutil.WriteFile(w.readDefaultString(fmt.Sprintf("%s.json", w.network)), out, 0644); err != nil { + + // Export the native genesis spec used by puppeth and Geth + gethJson := filepath.Join(folder, fmt.Sprintf("%s.json", w.network)) + if err := ioutil.WriteFile((gethJson), out, 0644); err != nil { log.Error("Failed to save genesis file", "err", err) + return } - log.Info("Exported existing genesis block") + log.Info("Saved native genesis chain spec", "path", gethJson) - case choice == "3": + // Export the genesis spec used by Aleth (formerly C++ Ethereum) + if spec, err := newAlethGenesisSpec(w.network, w.conf.Genesis); err != nil { + log.Error("Failed to create Aleth chain spec", "err", err) + } else { + saveGenesis(folder, w.network, "aleth", spec) + } + // Export the genesis spec used by Parity + if spec, err := newParityChainSpec(w.network, w.conf.Genesis, []string{}); err != nil { + log.Error("Failed to create Parity chain spec", "err", err) + } else { + saveGenesis(folder, w.network, "parity", spec) + } + // Export the genesis spec used by Harmony (formerly EthereumJ + saveGenesis(folder, w.network, "harmony", w.conf.Genesis) + + case "3": // Make sure we don't have any services running if len(w.conf.servers()) > 0 { log.Error("Genesis reset requires all services and servers torn down") @@ -186,8 +281,20 @@ func (w *wizard) manageGenesis() { w.conf.Genesis = nil w.conf.flush() - default: log.Error("That's not something I can do") + return + } +} + +// saveGenesis JSON encodes an arbitrary genesis spec into a pre-defined file. +func saveGenesis(folder, network, client string, spec interface{}) { + path := filepath.Join(folder, fmt.Sprintf("%s-%s.json", network, client)) + + out, _ := json.Marshal(spec) + if err := ioutil.WriteFile(path, out, 0644); err != nil { + log.Error("Failed to save genesis file", "client", client, "err", err) + return } + log.Info("Saved genesis chain spec", "client", client, "path", path) } diff --git a/cmd/puppeth/wizard_intro.go b/cmd/puppeth/wizard_intro.go index 60aa0f7ffbdf..75fb04b76f70 100644 --- a/cmd/puppeth/wizard_intro.go +++ b/cmd/puppeth/wizard_intro.go @@ -61,14 +61,14 @@ func (w *wizard) run() { // Make sure we have a good network name to work with fmt.Println() // Docker accepts hyphens in image names, but doesn't like it for container names if w.network == "" { - fmt.Println("Please specify a network name to administer (no spaces or hyphens, please)") + fmt.Println("Please specify a network name to administer (no spaces, hyphens or capital letters please)") for { w.network = w.readString() - if !strings.Contains(w.network, " ") && !strings.Contains(w.network, "-") { + if !strings.Contains(w.network, " ") && !strings.Contains(w.network, "-") && strings.ToLower(w.network) == w.network { fmt.Printf("\nSweet, you can set this via --network=%s next time!\n\n", w.network) break } - log.Error("I also like to live dangerously, still no spaces or hyphens") + log.Error("I also like to live dangerously, still no spaces, hyphens or capital letters") } } log.Info("Administering Ethereum network", "name", w.network) @@ -131,7 +131,20 @@ func (w *wizard) run() { case choice == "2": if w.conf.Genesis == nil { - w.makeGenesis() + fmt.Println() + fmt.Println("What would you like to do? (default = create)") + fmt.Println(" 1. Create new genesis from scratch") + fmt.Println(" 2. Import already existing genesis") + + choice := w.read() + switch { + case choice == "" || choice == "1": + w.makeGenesis() + case choice == "2": + w.importGenesis() + default: + log.Error("That's not something I can do") + } } else { w.manageGenesis() } @@ -149,7 +162,6 @@ func (w *wizard) run() { } else { w.manageComponents() } - default: log.Error("That's not something I can do") } diff --git a/cmd/puppeth/wizard_network.go b/cmd/puppeth/wizard_network.go index 83b10cf375cb..97302c0df8bb 100644 --- a/cmd/puppeth/wizard_network.go +++ b/cmd/puppeth/wizard_network.go @@ -174,7 +174,7 @@ func (w *wizard) deployComponent() { fmt.Println(" 1. Ethstats - Network monitoring tool") fmt.Println(" 2. Bootnode - Entry point of the network") fmt.Println(" 3. Sealer - Full node minting new blocks") - fmt.Println(" 4. Explorer - Chain analysis webservice (ethash only)") + fmt.Println(" 4. Explorer - Chain analysis webservice") fmt.Println(" 5. Wallet - Browser wallet for quick sends") fmt.Println(" 6. Faucet - Crypto faucet to give away funds") fmt.Println(" 7. Dashboard - Website listing above web-services") diff --git a/cmd/puppeth/wizard_nginx.go b/cmd/puppeth/wizard_nginx.go index 4eeae93a0b26..8397b7fd57ff 100644 --- a/cmd/puppeth/wizard_nginx.go +++ b/cmd/puppeth/wizard_nginx.go @@ -41,12 +41,12 @@ func (w *wizard) ensureVirtualHost(client *sshClient, port int, def string) (str // Reverse proxy is not running, offer to deploy a new one fmt.Println() fmt.Println("Allow sharing the port with other services (y/n)? (default = yes)") - if w.readDefaultString("y") == "y" { + if w.readDefaultYesNo(true) { nocache := false if proxy != nil { fmt.Println() fmt.Printf("Should the reverse-proxy be rebuilt from scratch (y/n)? (default = no)\n") - nocache = w.readDefaultString("n") != "n" + nocache = w.readDefaultYesNo(false) } if out, err := deployNginx(client, w.network, port, nocache); err != nil { log.Error("Failed to deploy reverse-proxy", "err", err) diff --git a/cmd/puppeth/wizard_node.go b/cmd/puppeth/wizard_node.go index 49b10a023a44..e37297f6d629 100644 --- a/cmd/puppeth/wizard_node.go +++ b/cmd/puppeth/wizard_node.go @@ -126,7 +126,7 @@ func (w *wizard) deployNode(boot bool) { } else { fmt.Println() fmt.Printf("Reuse previous (%s) signing account (y/n)? (default = yes)\n", key.Address.Hex()) - if w.readDefaultString("y") != "y" { + if !w.readDefaultYesNo(true) { infos.keyJSON, infos.keyPass = "", "" } } @@ -165,7 +165,7 @@ func (w *wizard) deployNode(boot bool) { if existed { fmt.Println() fmt.Printf("Should the node be built from scratch (y/n)? (default = no)\n") - nocache = w.readDefaultString("n") != "n" + nocache = w.readDefaultYesNo(false) } if out, err := deployNode(client, w.network, w.conf.bootnodes, infos, nocache); err != nil { log.Error("Failed to deploy Ethereum node container", "err", err) diff --git a/cmd/puppeth/wizard_wallet.go b/cmd/puppeth/wizard_wallet.go index 7624d11e20e2..ca1ea5bd2591 100644 --- a/cmd/puppeth/wizard_wallet.go +++ b/cmd/puppeth/wizard_wallet.go @@ -96,7 +96,7 @@ func (w *wizard) deployWallet() { if existed { fmt.Println() fmt.Printf("Should the wallet be built from scratch (y/n)? (default = no)\n") - nocache = w.readDefaultString("n") != "n" + nocache = w.readDefaultYesNo(false) } if out, err := deployWallet(client, w.network, w.conf.bootnodes, infos, nocache); err != nil { log.Error("Failed to deploy wallet container", "err", err) diff --git a/cmd/swarm/access.go b/cmd/swarm/access.go deleted file mode 100644 index dd2d513c24b3..000000000000 --- a/cmd/swarm/access.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . -package main - -import ( - "crypto/rand" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "strings" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/api/client" - "gopkg.in/urfave/cli.v1" -) - -var salt = make([]byte, 32) - -func init() { - if _, err := io.ReadFull(rand.Reader, salt); err != nil { - panic("reading from crypto/rand failed: " + err.Error()) - } -} - -func accessNewPass(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 1 { - utils.Fatalf("Expected 1 argument - the ref") - } - - var ( - ae *api.AccessEntry - accessKey []byte - err error - ref = args[0] - password = getPassPhrase("", 0, makePasswordList(ctx)) - dryRun = ctx.Bool(SwarmDryRunFlag.Name) - ) - accessKey, ae, err = api.DoPassword(ctx, password, salt) - if err != nil { - utils.Fatalf("error getting session key: %v", err) - } - m, err := api.GenerateAccessControlManifest(ctx, ref, accessKey, ae) - if dryRun { - err = printManifests(m, nil) - if err != nil { - utils.Fatalf("had an error printing the manifests: %v", err) - } - } else { - err = uploadManifests(ctx, m, nil) - if err != nil { - utils.Fatalf("had an error uploading the manifests: %v", err) - } - } -} - -func accessNewPK(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 1 { - utils.Fatalf("Expected 1 argument - the ref") - } - - var ( - ae *api.AccessEntry - sessionKey []byte - err error - ref = args[0] - privateKey = getPrivKey(ctx) - granteePublicKey = ctx.String(SwarmAccessGrantKeyFlag.Name) - dryRun = ctx.Bool(SwarmDryRunFlag.Name) - ) - sessionKey, ae, err = api.DoPK(ctx, privateKey, granteePublicKey, salt) - if err != nil { - utils.Fatalf("error getting session key: %v", err) - } - m, err := api.GenerateAccessControlManifest(ctx, ref, sessionKey, ae) - if dryRun { - err = printManifests(m, nil) - if err != nil { - utils.Fatalf("had an error printing the manifests: %v", err) - } - } else { - err = uploadManifests(ctx, m, nil) - if err != nil { - utils.Fatalf("had an error uploading the manifests: %v", err) - } - } -} - -func accessNewACT(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 1 { - utils.Fatalf("Expected 1 argument - the ref") - } - - var ( - ae *api.AccessEntry - actManifest *api.Manifest - accessKey []byte - err error - ref = args[0] - pkGrantees = []string{} - passGrantees = []string{} - pkGranteesFilename = ctx.String(SwarmAccessGrantKeysFlag.Name) - passGranteesFilename = ctx.String(utils.PasswordFileFlag.Name) - privateKey = getPrivKey(ctx) - dryRun = ctx.Bool(SwarmDryRunFlag.Name) - ) - if pkGranteesFilename == "" && passGranteesFilename == "" { - utils.Fatalf("you have to provide either a grantee public-keys file or an encryption passwords file (or both)") - } - - if pkGranteesFilename != "" { - bytes, err := ioutil.ReadFile(pkGranteesFilename) - if err != nil { - utils.Fatalf("had an error reading the grantee public key list") - } - pkGrantees = strings.Split(strings.Trim(string(bytes), "\n"), "\n") - } - - if passGranteesFilename != "" { - bytes, err := ioutil.ReadFile(passGranteesFilename) - if err != nil { - utils.Fatalf("could not read password filename: %v", err) - } - passGrantees = strings.Split(strings.Trim(string(bytes), "\n"), "\n") - } - accessKey, ae, actManifest, err = api.DoACT(ctx, privateKey, salt, pkGrantees, passGrantees) - if err != nil { - utils.Fatalf("error generating ACT manifest: %v", err) - } - - if err != nil { - utils.Fatalf("error getting session key: %v", err) - } - m, err := api.GenerateAccessControlManifest(ctx, ref, accessKey, ae) - if err != nil { - utils.Fatalf("error generating root access manifest: %v", err) - } - - if dryRun { - err = printManifests(m, actManifest) - if err != nil { - utils.Fatalf("had an error printing the manifests: %v", err) - } - } else { - err = uploadManifests(ctx, m, actManifest) - if err != nil { - utils.Fatalf("had an error uploading the manifests: %v", err) - } - } -} - -func printManifests(rootAccessManifest, actManifest *api.Manifest) error { - js, err := json.Marshal(rootAccessManifest) - if err != nil { - return err - } - fmt.Println(string(js)) - - if actManifest != nil { - js, err := json.Marshal(actManifest) - if err != nil { - return err - } - fmt.Println(string(js)) - } - return nil -} - -func uploadManifests(ctx *cli.Context, rootAccessManifest, actManifest *api.Manifest) error { - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := client.NewClient(bzzapi) - - var ( - key string - err error - ) - if actManifest != nil { - key, err = client.UploadManifest(actManifest, false) - if err != nil { - return err - } - - rootAccessManifest.Entries[0].Access.Act = key - } - key, err = client.UploadManifest(rootAccessManifest, false) - if err != nil { - return err - } - fmt.Println(key) - return nil -} - -// makePasswordList reads password lines from the file specified by the global --password flag -// and also by the same subcommand --password flag. -// This function ia a fork of utils.MakePasswordList to lookup cli context for subcommand. -// Function ctx.SetGlobal is not setting the global flag value that can be accessed -// by ctx.GlobalString using the current version of cli package. -func makePasswordList(ctx *cli.Context) []string { - path := ctx.GlobalString(utils.PasswordFileFlag.Name) - if path == "" { - path = ctx.String(utils.PasswordFileFlag.Name) - if path == "" { - return nil - } - } - text, err := ioutil.ReadFile(path) - if err != nil { - utils.Fatalf("Failed to read password file: %v", err) - } - lines := strings.Split(string(text), "\n") - // Sanitise DOS line endings. - for i := range lines { - lines[i] = strings.TrimRight(lines[i], "\r") - } - return lines -} diff --git a/cmd/swarm/access_test.go b/cmd/swarm/access_test.go deleted file mode 100644 index 106e6dd9124c..000000000000 --- a/cmd/swarm/access_test.go +++ /dev/null @@ -1,605 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -// +build !windows - -package main - -import ( - "bytes" - "crypto/rand" - "encoding/hex" - "encoding/json" - "io" - "io/ioutil" - gorand "math/rand" - "net/http" - "os" - "strings" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/ecies" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/api" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "github.com/ethereum/go-ethereum/swarm/testutil" -) - -const ( - hashRegexp = `[a-f\d]{128}` - data = "notsorandomdata" -) - -var DefaultCurve = crypto.S256() - -// TestAccessPassword tests for the correct creation of an ACT manifest protected by a password. -// The test creates bogus content, uploads it encrypted, then creates the wrapping manifest with the Access entry -// The parties participating - node (publisher), uploads to second node then disappears. Content which was uploaded -// is then fetched through 2nd node. since the tested code is not key-aware - we can just -// fetch from the 2nd node using HTTP BasicAuth -func TestAccessPassword(t *testing.T) { - cluster := newTestCluster(t, 1) - defer cluster.Shutdown() - proxyNode := cluster.Nodes[0] - - dataFilename := testutil.TempFileWithContent(t, data) - defer os.RemoveAll(dataFilename) - - // upload the file with 'swarm up' and expect a hash - up := runSwarm(t, - "--bzzapi", - proxyNode.URL, //it doesn't matter through which node we upload content - "up", - "--encrypt", - dataFilename) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - - if len(matches) < 1 { - t.Fatal("no matches found") - } - - ref := matches[0] - tmp, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - password := "smth" - passwordFilename := testutil.TempFileWithContent(t, "smth") - defer os.RemoveAll(passwordFilename) - - up = runSwarm(t, - "access", - "new", - "pass", - "--dry-run", - "--password", - passwordFilename, - ref, - ) - - _, matches = up.ExpectRegexp(".+") - up.ExpectExit() - - if len(matches) == 0 { - t.Fatalf("stdout not matched") - } - - var m api.Manifest - - err = json.Unmarshal([]byte(matches[0]), &m) - if err != nil { - t.Fatalf("unmarshal manifest: %v", err) - } - - if len(m.Entries) != 1 { - t.Fatalf("expected one manifest entry, got %v", len(m.Entries)) - } - - e := m.Entries[0] - - ct := "application/bzz-manifest+json" - if e.ContentType != ct { - t.Errorf("expected %q content type, got %q", ct, e.ContentType) - } - - if e.Access == nil { - t.Fatal("manifest access is nil") - } - - a := e.Access - - if a.Type != "pass" { - t.Errorf(`got access type %q, expected "pass"`, a.Type) - } - if len(a.Salt) < 32 { - t.Errorf(`got salt with length %v, expected not less the 32 bytes`, len(a.Salt)) - } - if a.KdfParams == nil { - t.Fatal("manifest access kdf params is nil") - } - if a.Publisher != "" { - t.Fatal("should be empty") - } - client := swarm.NewClient(cluster.Nodes[0].URL) - - hash, err := client.UploadManifest(&m, false) - if err != nil { - t.Fatal(err) - } - - httpClient := &http.Client{} - - url := cluster.Nodes[0].URL + "/" + "bzz:/" + hash - response, err := httpClient.Get(url) - if err != nil { - t.Fatal(err) - } - if response.StatusCode != http.StatusUnauthorized { - t.Fatal("should be a 401") - } - authHeader := response.Header.Get("WWW-Authenticate") - if authHeader == "" { - t.Fatal("should be something here") - } - - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - t.Fatal(err) - } - req.SetBasicAuth("", password) - - response, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatal(err) - } - defer response.Body.Close() - - if response.StatusCode != http.StatusOK { - t.Errorf("expected status %v, got %v", http.StatusOK, response.StatusCode) - } - d, err := ioutil.ReadAll(response.Body) - if err != nil { - t.Fatal(err) - } - if string(d) != data { - t.Errorf("expected decrypted data %q, got %q", data, string(d)) - } - - wrongPasswordFilename := testutil.TempFileWithContent(t, "just wr0ng") - defer os.RemoveAll(wrongPasswordFilename) - - //download file with 'swarm down' with wrong password - up = runSwarm(t, - "--bzzapi", - proxyNode.URL, - "down", - "bzz:/"+hash, - tmp, - "--password", - wrongPasswordFilename) - - _, matches = up.ExpectRegexp("unauthorized") - if len(matches) != 1 && matches[0] != "unauthorized" { - t.Fatal(`"unauthorized" not found in output"`) - } - up.ExpectExit() -} - -// TestAccessPK tests for the correct creation of an ACT manifest between two parties (publisher and grantee). -// The test creates bogus content, uploads it encrypted, then creates the wrapping manifest with the Access entry -// The parties participating - node (publisher), uploads to second node (which is also the grantee) then disappears. -// Content which was uploaded is then fetched through the grantee's http proxy. Since the tested code is private-key aware, -// the test will fail if the proxy's given private key is not granted on the ACT. -func TestAccessPK(t *testing.T) { - // Setup Swarm and upload a test file to it - cluster := newTestCluster(t, 2) - defer cluster.Shutdown() - - dataFilename := testutil.TempFileWithContent(t, data) - defer os.RemoveAll(dataFilename) - - // upload the file with 'swarm up' and expect a hash - up := runSwarm(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - "--encrypt", - dataFilename) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - - if len(matches) < 1 { - t.Fatal("no matches found") - } - - ref := matches[0] - pk := cluster.Nodes[0].PrivateKey - granteePubKey := crypto.CompressPubkey(&pk.PublicKey) - - publisherDir, err := ioutil.TempDir("", "swarm-account-dir-temp") - if err != nil { - t.Fatal(err) - } - - passwordFilename := testutil.TempFileWithContent(t, testPassphrase) - defer os.RemoveAll(passwordFilename) - - _, publisherAccount := getTestAccount(t, publisherDir) - up = runSwarm(t, - "--bzzaccount", - publisherAccount.Address.String(), - "--password", - passwordFilename, - "--datadir", - publisherDir, - "--bzzapi", - cluster.Nodes[0].URL, - "access", - "new", - "pk", - "--dry-run", - "--grant-key", - hex.EncodeToString(granteePubKey), - ref, - ) - - _, matches = up.ExpectRegexp(".+") - up.ExpectExit() - - if len(matches) == 0 { - t.Fatalf("stdout not matched") - } - - //get the public key from the publisher directory - publicKeyFromDataDir := runSwarm(t, - "--bzzaccount", - publisherAccount.Address.String(), - "--password", - passwordFilename, - "--datadir", - publisherDir, - "print-keys", - "--compressed", - ) - _, publicKeyString := publicKeyFromDataDir.ExpectRegexp(".+") - publicKeyFromDataDir.ExpectExit() - pkComp := strings.Split(publicKeyString[0], "=")[1] - var m api.Manifest - - err = json.Unmarshal([]byte(matches[0]), &m) - if err != nil { - t.Fatalf("unmarshal manifest: %v", err) - } - - if len(m.Entries) != 1 { - t.Fatalf("expected one manifest entry, got %v", len(m.Entries)) - } - - e := m.Entries[0] - - ct := "application/bzz-manifest+json" - if e.ContentType != ct { - t.Errorf("expected %q content type, got %q", ct, e.ContentType) - } - - if e.Access == nil { - t.Fatal("manifest access is nil") - } - - a := e.Access - - if a.Type != "pk" { - t.Errorf(`got access type %q, expected "pk"`, a.Type) - } - if len(a.Salt) < 32 { - t.Errorf(`got salt with length %v, expected not less the 32 bytes`, len(a.Salt)) - } - if a.KdfParams != nil { - t.Fatal("manifest access kdf params should be nil") - } - if a.Publisher != pkComp { - t.Fatal("publisher key did not match") - } - client := swarm.NewClient(cluster.Nodes[0].URL) - - hash, err := client.UploadManifest(&m, false) - if err != nil { - t.Fatal(err) - } - - httpClient := &http.Client{} - - url := cluster.Nodes[0].URL + "/" + "bzz:/" + hash - response, err := httpClient.Get(url) - if err != nil { - t.Fatal(err) - } - if response.StatusCode != http.StatusOK { - t.Fatal("should be a 200") - } - d, err := ioutil.ReadAll(response.Body) - if err != nil { - t.Fatal(err) - } - if string(d) != data { - t.Errorf("expected decrypted data %q, got %q", data, string(d)) - } -} - -// TestAccessACT tests the creation of the ACT manifest end-to-end, without any bogus entries (i.e. default scenario = 3 nodes 1 unauthorized) -func TestAccessACT(t *testing.T) { - testAccessACT(t, 0) -} - -// TestAccessACTScale tests the creation of the ACT manifest end-to-end, with 1000 bogus entries (i.e. 1000 EC keys + default scenario = 3 nodes 1 unauthorized = 1003 keys in the ACT manifest) -func TestAccessACTScale(t *testing.T) { - testAccessACT(t, 1000) -} - -// TestAccessACT tests the e2e creation, uploading and downloading of an ACT access control with both EC keys AND password protection -// the test fires up a 3 node cluster, then randomly picks 2 nodes which will be acting as grantees to the data -// set and also protects the ACT with a password. the third node should fail decoding the reference as it will not be granted access. -// the third node then then tries to download using a correct password (and succeeds) then uses a wrong password and fails. -// the publisher uploads through one of the nodes then disappears. -func testAccessACT(t *testing.T, bogusEntries int) { - // Setup Swarm and upload a test file to it - const clusterSize = 3 - cluster := newTestCluster(t, clusterSize) - defer cluster.Shutdown() - - var uploadThroughNode = cluster.Nodes[0] - client := swarm.NewClient(uploadThroughNode.URL) - - r1 := gorand.New(gorand.NewSource(time.Now().UnixNano())) - nodeToSkip := r1.Intn(clusterSize) // a number between 0 and 2 (node indices in `cluster`) - dataFilename := testutil.TempFileWithContent(t, data) - defer os.RemoveAll(dataFilename) - - // upload the file with 'swarm up' and expect a hash - up := runSwarm(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - "--encrypt", - dataFilename) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - - if len(matches) < 1 { - t.Fatal("no matches found") - } - - ref := matches[0] - grantees := []string{} - for i, v := range cluster.Nodes { - if i == nodeToSkip { - continue - } - pk := v.PrivateKey - granteePubKey := crypto.CompressPubkey(&pk.PublicKey) - grantees = append(grantees, hex.EncodeToString(granteePubKey)) - } - - if bogusEntries > 0 { - bogusGrantees := []string{} - - for i := 0; i < bogusEntries; i++ { - prv, err := ecies.GenerateKey(rand.Reader, DefaultCurve, nil) - if err != nil { - t.Fatal(err) - } - bogusGrantees = append(bogusGrantees, hex.EncodeToString(crypto.CompressPubkey(&prv.ExportECDSA().PublicKey))) - } - r2 := gorand.New(gorand.NewSource(time.Now().UnixNano())) - for i := 0; i < len(grantees); i++ { - insertAtIdx := r2.Intn(len(bogusGrantees)) - bogusGrantees = append(bogusGrantees[:insertAtIdx], append([]string{grantees[i]}, bogusGrantees[insertAtIdx:]...)...) - } - grantees = bogusGrantees - } - granteesPubkeyListFile := testutil.TempFileWithContent(t, strings.Join(grantees, "\n")) - defer os.RemoveAll(granteesPubkeyListFile) - - publisherDir, err := ioutil.TempDir("", "swarm-account-dir-temp") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(publisherDir) - - passwordFilename := testutil.TempFileWithContent(t, testPassphrase) - defer os.RemoveAll(passwordFilename) - actPasswordFilename := testutil.TempFileWithContent(t, "smth") - defer os.RemoveAll(actPasswordFilename) - _, publisherAccount := getTestAccount(t, publisherDir) - up = runSwarm(t, - "--bzzaccount", - publisherAccount.Address.String(), - "--password", - passwordFilename, - "--datadir", - publisherDir, - "--bzzapi", - cluster.Nodes[0].URL, - "access", - "new", - "act", - "--grant-keys", - granteesPubkeyListFile, - "--password", - actPasswordFilename, - ref, - ) - - _, matches = up.ExpectRegexp(`[a-f\d]{64}`) - up.ExpectExit() - - if len(matches) == 0 { - t.Fatalf("stdout not matched") - } - - //get the public key from the publisher directory - publicKeyFromDataDir := runSwarm(t, - "--bzzaccount", - publisherAccount.Address.String(), - "--password", - passwordFilename, - "--datadir", - publisherDir, - "print-keys", - "--compressed", - ) - _, publicKeyString := publicKeyFromDataDir.ExpectRegexp(".+") - publicKeyFromDataDir.ExpectExit() - pkComp := strings.Split(publicKeyString[0], "=")[1] - - hash := matches[0] - m, _, err := client.DownloadManifest(hash) - if err != nil { - t.Fatalf("unmarshal manifest: %v", err) - } - - if len(m.Entries) != 1 { - t.Fatalf("expected one manifest entry, got %v", len(m.Entries)) - } - - e := m.Entries[0] - - ct := "application/bzz-manifest+json" - if e.ContentType != ct { - t.Errorf("expected %q content type, got %q", ct, e.ContentType) - } - - if e.Access == nil { - t.Fatal("manifest access is nil") - } - - a := e.Access - - if a.Type != "act" { - t.Fatalf(`got access type %q, expected "act"`, a.Type) - } - if len(a.Salt) < 32 { - t.Fatalf(`got salt with length %v, expected not less the 32 bytes`, len(a.Salt)) - } - - if a.Publisher != pkComp { - t.Fatal("publisher key did not match") - } - httpClient := &http.Client{} - - // all nodes except the skipped node should be able to decrypt the content - for i, node := range cluster.Nodes { - log.Debug("trying to fetch from node", "node index", i) - - url := node.URL + "/" + "bzz:/" + hash - response, err := httpClient.Get(url) - if err != nil { - t.Fatal(err) - } - log.Debug("got response from node", "response code", response.StatusCode) - - if i == nodeToSkip { - log.Debug("reached node to skip", "status code", response.StatusCode) - - if response.StatusCode != http.StatusUnauthorized { - t.Fatalf("should be a 401") - } - - // try downloading using a password instead, using the unauthorized node - passwordUrl := strings.Replace(url, "http://", "http://:smth@", -1) - response, err = httpClient.Get(passwordUrl) - if err != nil { - t.Fatal(err) - } - if response.StatusCode != http.StatusOK { - t.Fatal("should be a 200") - } - - // now try with the wrong password, expect 401 - passwordUrl = strings.Replace(url, "http://", "http://:smthWrong@", -1) - response, err = httpClient.Get(passwordUrl) - if err != nil { - t.Fatal(err) - } - if response.StatusCode != http.StatusUnauthorized { - t.Fatal("should be a 401") - } - continue - } - - if response.StatusCode != http.StatusOK { - t.Fatal("should be a 200") - } - d, err := ioutil.ReadAll(response.Body) - if err != nil { - t.Fatal(err) - } - if string(d) != data { - t.Errorf("expected decrypted data %q, got %q", data, string(d)) - } - } -} - -// TestKeypairSanity is a sanity test for the crypto scheme for ACT. it asserts the correct shared secret according to -// the specs at https://github.com/ethersphere/swarm-docs/blob/eb857afda906c6e7bb90d37f3f334ccce5eef230/act.md -func TestKeypairSanity(t *testing.T) { - salt := make([]byte, 32) - if _, err := io.ReadFull(rand.Reader, salt); err != nil { - t.Fatalf("reading from crypto/rand failed: %v", err.Error()) - } - sharedSecret := "a85586744a1ddd56a7ed9f33fa24f40dd745b3a941be296a0d60e329dbdb896d" - - for i, v := range []struct { - publisherPriv string - granteePub string - }{ - { - publisherPriv: "ec5541555f3bc6376788425e9d1a62f55a82901683fd7062c5eddcc373a73459", - granteePub: "0226f213613e843a413ad35b40f193910d26eb35f00154afcde9ded57479a6224a", - }, - { - publisherPriv: "70c7a73011aa56584a0009ab874794ee7e5652fd0c6911cd02f8b6267dd82d2d", - granteePub: "02e6f8d5e28faaa899744972bb847b6eb805a160494690c9ee7197ae9f619181db", - }, - } { - b, _ := hex.DecodeString(v.granteePub) - granteePub, _ := crypto.DecompressPubkey(b) - publisherPrivate, _ := crypto.HexToECDSA(v.publisherPriv) - - ssKey, err := api.NewSessionKeyPK(publisherPrivate, granteePub, salt) - if err != nil { - t.Fatal(err) - } - - hasher := sha3.NewKeccak256() - hasher.Write(salt) - shared, err := hex.DecodeString(sharedSecret) - if err != nil { - t.Fatal(err) - } - hasher.Write(shared) - sum := hasher.Sum(nil) - - if !bytes.Equal(ssKey, sum) { - t.Fatalf("%d: got a session key mismatch", i) - } - } -} diff --git a/cmd/swarm/bootnodes.go b/cmd/swarm/bootnodes.go deleted file mode 100644 index cbba9970da0e..000000000000 --- a/cmd/swarm/bootnodes.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -var SwarmBootnodes = []string{ - // Foundation Swarm Gateway Cluster - "enode://e5c6f9215c919a5450a7b8c14c22535607b69f2c8e1e7f6f430cb25d7a2c27cd1df4c4f18ad7c1d7e5162e271ffcd3f20b1a1467fb6e790e7d727f3b2193de97@52.232.7.187:30399", - "enode://9b2fe07e69ccc7db5fef15793dab7d7d2e697ed92132d6e9548218e68a34613a8671ad03a6658d862b468ed693cae8a0f8f8d37274e4a657ffb59ca84676e45b@52.232.7.187:30400", - "enode://76c1059162c93ef9df0f01097c824d17c492634df211ef4c806935b349082233b63b90c23970254b3b7138d630400f7cf9b71e80355a446a8b733296cb04169a@52.232.7.187:30401", - "enode://ce46bbe2a8263145d65252d52da06e000ad350ed09c876a71ea9544efa42f63c1e1b6cc56307373aaad8f9dd069c90d0ed2dd1530106200e16f4ca681dd8ae2d@52.232.7.187:30402", - "enode://f431e0d6008a6c35c6e670373d828390c8323e53da8158e7bfc43cf07e632cc9e472188be8df01decadea2d4a068f1428caba769b632554a8fb0607bc296988f@52.232.7.187:30403", - "enode://174720abfff83d7392f121108ae50ea54e04889afe020df883655c0f6cb95414db945a0228d8982fe000d86fc9f4b7669161adc89cd7cd56f78f01489ab2b99b@52.232.7.187:30404", - "enode://2ae89be4be61a689b6f9ecee4360a59e185e010ab750f14b63b4ae43d4180e872e18e3437d4386ce44875dc7cc6eb761acba06412fe3178f3dac1dab3b65703e@52.232.7.187:30405", - "enode://24abebe1c0e6d75d6052ce3219a87be8573fd6397b4cb51f0773b83abba9b3d872bfb273cdc07389715b87adfac02f5235f5241442c5089802cbd8d42e310fce@52.232.7.187:30406", - "enode://d08dfa46bfbbdbcaafbb6e34abee4786610f6c91e0b76d7881f0334ac10dda41d8c1f2b6eedffb4493293c335c0ad46776443b2208d1fbbb9e1a90b25ee4eef2@52.232.7.187:30407", - "enode://8d95eb0f837d27581a43668ed3b8783d69dc4e84aa3edd7a0897e026155c8f59c8702fdc0375ee7bac15757c9c78e1315d9b73e4ce59c936db52ea4ae2f501c7@52.232.7.187:30408", - "enode://a5967cc804aebd422baaaba9f06f27c9e695ccab335b61088130f8cbe64e3cdf78793868c7051dfc06eecfe844fad54bc7f6dfaed9db3c7ecef279cb829c25fb@52.232.7.187:30409", - "enode://5f00134d81a8f2ebcc46f8766f627f492893eda48138f811b7de2168308171968f01710bca6da05764e74f14bae41652f554e6321f1aed85fa3461e89d075dbf@52.232.7.187:30410", - "enode://b2142b79b01a5aa66a5e23cc35e78219a8e97bc2412a6698cee24ae02e87078b725d71730711bd62e25ff1aa8658c6633778af8ac14c63814a337c3dd0ebda9f@52.232.7.187:30411", - "enode://1ffa7651094867d6486ce3ef46d27a052c2cb968b618346c6df7040322c7efc3337547ba85d4cbba32e8b31c42c867202554735c06d4c664b9afada2ed0c4b3c@52.232.7.187:30412", - "enode://129e0c3d5f5df12273754f6f703d2424409fa4baa599e0b758c55600169313887855e75b082028d2302ec034b303898cd697cc7ae8256ba924ce927510da2c8d@52.232.7.187:30413", - "enode://419e2dc0d2f5b022cf16b0e28842658284909fa027a0fbbb5e2b755e7f846ea02a8f0b66a7534981edf6a7bcf8a14855344c6668e2cd4476ccd35a11537c9144@52.232.7.187:30414", - "enode://23d55ad900583231b91f2f62e3f72eb498b342afd58b682be3af052eed62b5651094471065981de33d8786f075f05e3cca499503b0ac8ae84b2a06e99f5b0723@52.232.7.187:30415", - "enode://bc56e4158c00e9f616d7ea533def20a89bef959df4e62a768ff238ff4e1e9223f57ecff969941c20921bad98749baae311c0fbebce53bf7bbb9d3dc903640990@52.232.7.187:30416", - "enode://433ce15199c409875e7e72fffd69fdafe746f17b20f0d5555281722a65fde6c80328fab600d37d8624509adc072c445ce0dad4a1c01cff6acf3132c11d429d4d@52.232.7.187:30417", - "enode://632ee95b8f0eac51ef89ceb29313fef3a60050181d66a6b125583b1a225a7694b252edc016efb58aa3b251da756cb73280842a022c658ed405223b2f58626343@52.232.7.187:30418", - "enode://4a0f9bcff7a4b9ee453fb298d0fb222592efe121512e30cd72fef631beb8c6a15153a1456eb073ee18551c0e003c569651a101892dc4124e90b933733a498bb5@52.232.7.187:30419", - "enode://f0d80fbc72d16df30e19aac3051eb56a7aff0c8367686702e01ea132d8b0b3ee00cadd6a859d2cca98ec68d3d574f8a8a87dba2347ec1e2818dc84bc3fa34fae@52.232.7.187:30420", - "enode://a199146906e4f9f2b94b195a8308d9a59a3564b92efaab898a4243fe4c2ad918b7a8e4853d9d901d94fad878270a2669d644591299c3d43de1b298c00b92b4a7@52.232.7.187:30421", - "enode://052036ea8736b37adbfb684d90ce43e11b3591b51f31489d7c726b03618dea4f73b1e659deb928e6bf40564edcdcf08351643f42db3d4ca1c2b5db95dad59e94@52.232.7.187:30422", - "enode://460e2b8c6da8f12fac96c836e7d108f4b7ec55a1c64631bb8992339e117e1c28328fee83af863196e20af1487a655d13e5ceba90e980e92502d5bac5834c1f71@52.232.7.187:30423", - "enode://6d2cdd13741b2e72e9031e1b93c6d9a4e68de2844aa4e939f6a8a8498a7c1d7e2ee4c64217e92a6df08c9a32c6764d173552810ef1bd2ecb356532d389dd2136@52.232.7.187:30424", - "enode://62105fc25ce2cd5b299647f47eaa9211502dc76f0e9f461df915782df7242ac3223e3db04356ae6ed2977ccac20f0b16864406e9ca514a40a004cb6a5d0402aa@52.232.7.187:30425", - "enode://e0e388fc520fd493c33f0ce16685e6f98fb6aec28f2edc14ee6b179594ee519a896425b0025bb6f0e182dd3e468443f19c70885fbc66560d000093a668a86aa8@52.232.7.187:30426", - "enode://63f3353a72521ea10022127a4fe6b4acbef197c3fe668fd9f4805542d8a6fcf79f6335fbab62d180a35e19b739483e740858b113fdd7c13a26ad7b4e318a5aef@52.232.7.187:30427", - "enode://33a42b927085678d4aefd4e70b861cfca6ef5f6c143696c4f755973fd29e64c9e658cad57a66a687a7a156da1e3688b1fbdd17bececff2ee009fff038fa5666b@52.232.7.187:30428", - "enode://259ab5ab5c1daee3eab7e3819ab3177b82d25c29e6c2444fdd3f956e356afae79a72840ccf2d0665fe82c81ebc3b3734da1178ac9fd5d62c67e674b69f86b6be@52.232.7.187:30429", - "enode://558bccad7445ce3fd8db116ed6ab4aed1324fdbdac2348417340c1764dc46d46bffe0728e5b7d5c36f12e794c289f18f57f08f085d2c65c9910a5c7a65b6a66a@52.232.7.187:30430", - "enode://abe60937a0657ffded718e3f84a32987286983be257bdd6004775c4b525747c2b598f4fac49c8de324de5ce75b22673fa541a7ce2d555fb7f8ca325744ae3577@52.232.7.187:30431", - "enode://bce6f0aaa5b230742680084df71d4f026b3eff7f564265599216a1b06b765303fdc9325de30ffd5dfdaf302ce4b14322891d2faea50ce2ca298d7409f5858339@52.232.7.187:30432", - "enode://21b957c4e03277d42be6660730ec1b93f540764f26c6abdb54d006611139c7081248486206dfbf64fcaffd62589e9c6b8ea77a5297e4b21a605f1bcf49483ed0@52.232.7.187:30433", - "enode://ff104e30e64f24c3d7328acee8b13354e5551bc8d60bb25ecbd9632d955c7e34bb2d969482d173355baad91c8282f8b592624eb3929151090da3b4448d4d58fb@52.232.7.187:30434", - "enode://c76e2b5f81a521bceaec1518926a21380a345df9cf463461562c6845795512497fb67679e155fc96a74350f8b78de8f4c135dd52b106dbbb9795452021d09ea5@52.232.7.187:30435", - "enode://3288fd860105164f3e9b69934c4eb18f7146cfab31b5a671f994e21a36e9287766e5f9f075aefbc404538c77f7c2eb2a4495020a7633a1c3970d94e9fa770aeb@52.232.7.187:30436", - "enode://6cea859c7396d46b20cfcaa80f9a11cd112f8684f2f782f7b4c0e1e0af9212113429522075101923b9b957603e6c32095a6a07b5e5e35183c521952ee108dfaf@52.232.7.187:30437", - "enode://f628ec56e4ca8317cc24cc4ac9b27b95edcce7b96e1c7f3b53e30de4a8580fe44f2f0694a513bdb0a431acaf2824074d6ace4690247bbc34c14f426af8c056ea@52.232.7.187:30438", - "enode://055ec8b26fc105c4f97970a1cce9773a5e34c03f511b839db742198a1c571e292c54aa799e9afb991cc8a560529b8cdf3e0c344bc6c282aff2f68eec59361ddf@52.232.7.187:30439", - "enode://48cb0d430c328974226aa33a931d8446cd5a8d40f3ead8f4ce7ad60faa1278192eb6d58bed91258d63e81f255fc107eec2425ce2ae8b22350dd556076e160610@52.232.7.187:30440", - "enode://3fadb7af7f770d5ffc6b073b8d42834bebb18ce1fe8a4fe270d2b799e7051327093960dc61d9a18870db288f7746a0e6ea2a013cd6ab0e5f97ca08199473aace@52.232.7.187:30441", - "enode://a5d7168024c9992769cf380ffa559a64b4f39a29d468f579559863814eb0ae0ed689ac0871a3a2b4c78b03297485ec322d578281131ef5d5c09a4beb6200a97a@52.232.7.187:30442", - "enode://9c57744c5b2c2d71abcbe80512652f9234d4ab041b768a2a886ab390fe6f184860f40e113290698652d7e20a8ac74d27ac8671db23eb475b6c5e6253e4693bf8@52.232.7.187:30443", - "enode://daca9ff0c3176045a0e0ed228dee00ec86bc0939b135dc6b1caa23745d20fd0332e1ee74ad04020e89df56c7146d831a91b89d15ca3df05ba7618769fefab376@52.232.7.187:30444", - "enode://a3f6af59428cb4b9acb198db15ef5554fa43c2b0c18e468a269722d64a27218963a2975eaf82750b6262e42192b5e3669ea51337b4cda62b33987981bc5e0c1a@52.232.7.187:30445", - "enode://fe571422fa4651c3354c85dac61911a6a6520dd3c0332967a49d4133ca30e16a8a4946fa73ca2cb5de77917ea701a905e1c3015b2f4defcd53132b61cc84127a@52.232.7.187:30446", - - // Mainframe - "enode://ee9a5a571ea6c8a59f9a8bb2c569c865e922b41c91d09b942e8c1d4dd2e1725bd2c26149da14de1f6321a2c6fdf1e07c503c3e093fb61696daebf74d6acd916b@54.186.219.160:30399", - "enode://a03f0562ecb8a992ad5242345535e73483cdc18ab934d36bf24b567d43447c2cea68f89f1d51d504dd13acc30f24ebce5a150bea2ccb1b722122ce4271dc199d@52.67.248.147:30399", - "enode://e2cbf9eafd85903d3b1c56743035284320695e0072bc8d7396e0542aa5e1c321b236f67eab66b79c2f15d4447fa4bbe74dd67d0467da23e7eb829f60ec8a812b@13.58.169.1:30399", - "enode://8b8c6bda6047f1cad9fab2db4d3d02b7aa26279902c32879f7bcd4a7d189fee77fdc36ee151ce6b84279b4792e72578fd529d2274d014132465758fbfee51cee@13.209.13.15:30399", - "enode://63f6a8818927e429585287cf2ca0cb9b11fa990b7b9b331c2962cdc6f21807a2473b26e8256225c26caff70d7218e59586d704d49061452c6852e382c885d03c@35.154.106.174:30399", - "enode://ed4bd3b794ed73f18e6dcc70c6624dfec63b5654f6ab54e8f40b16eff8afbd342d4230e099ddea40e84423f81b2d2ea79799dc345257b1fec6f6c422c9d008f7@52.213.20.99:30399", -} diff --git a/cmd/swarm/config.go b/cmd/swarm/config.go deleted file mode 100644 index 16001010df3f..000000000000 --- a/cmd/swarm/config.go +++ /dev/null @@ -1,426 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "errors" - "fmt" - "io" - "os" - "reflect" - "strconv" - "strings" - "time" - "unicode" - - cli "gopkg.in/urfave/cli.v1" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/naoina/toml" - - bzzapi "github.com/ethereum/go-ethereum/swarm/api" -) - -var ( - //flag definition for the dumpconfig command - DumpConfigCommand = cli.Command{ - Action: utils.MigrateFlags(dumpConfig), - Name: "dumpconfig", - Usage: "Show configuration values", - ArgsUsage: "", - Flags: app.Flags, - Category: "MISCELLANEOUS COMMANDS", - Description: `The dumpconfig command shows configuration values.`, - } - - //flag definition for the config file command - SwarmTomlConfigPathFlag = cli.StringFlag{ - Name: "config", - Usage: "TOML configuration file", - } -) - -//constants for environment variables -const ( - SWARM_ENV_CHEQUEBOOK_ADDR = "SWARM_CHEQUEBOOK_ADDR" - SWARM_ENV_ACCOUNT = "SWARM_ACCOUNT" - SWARM_ENV_LISTEN_ADDR = "SWARM_LISTEN_ADDR" - SWARM_ENV_PORT = "SWARM_PORT" - SWARM_ENV_NETWORK_ID = "SWARM_NETWORK_ID" - SWARM_ENV_SWAP_ENABLE = "SWARM_SWAP_ENABLE" - SWARM_ENV_SWAP_API = "SWARM_SWAP_API" - SWARM_ENV_SYNC_DISABLE = "SWARM_SYNC_DISABLE" - SWARM_ENV_SYNC_UPDATE_DELAY = "SWARM_ENV_SYNC_UPDATE_DELAY" - SWARM_ENV_MAX_STREAM_PEER_SERVERS = "SWARM_ENV_MAX_STREAM_PEER_SERVERS" - SWARM_ENV_LIGHT_NODE_ENABLE = "SWARM_LIGHT_NODE_ENABLE" - SWARM_ENV_DELIVERY_SKIP_CHECK = "SWARM_DELIVERY_SKIP_CHECK" - SWARM_ENV_ENS_API = "SWARM_ENS_API" - SWARM_ENV_ENS_ADDR = "SWARM_ENS_ADDR" - SWARM_ENV_CORS = "SWARM_CORS" - SWARM_ENV_BOOTNODES = "SWARM_BOOTNODES" - SWARM_ENV_PSS_ENABLE = "SWARM_PSS_ENABLE" - SWARM_ENV_STORE_PATH = "SWARM_STORE_PATH" - SWARM_ENV_STORE_CAPACITY = "SWARM_STORE_CAPACITY" - SWARM_ENV_STORE_CACHE_CAPACITY = "SWARM_STORE_CACHE_CAPACITY" - SWARM_ACCESS_PASSWORD = "SWARM_ACCESS_PASSWORD" - GETH_ENV_DATADIR = "GETH_DATADIR" -) - -// These settings ensure that TOML keys use the same names as Go struct fields. -var tomlSettings = toml.Config{ - NormFieldName: func(rt reflect.Type, key string) string { - return key - }, - FieldToKey: func(rt reflect.Type, field string) string { - return field - }, - MissingField: func(rt reflect.Type, field string) error { - link := "" - if unicode.IsUpper(rune(rt.Name()[0])) && rt.PkgPath() != "main" { - link = fmt.Sprintf(", check github.com/ethereum/go-ethereum/swarm/api/config.go for available fields") - } - return fmt.Errorf("field '%s' is not defined in %s%s", field, rt.String(), link) - }, -} - -//before booting the swarm node, build the configuration -func buildConfig(ctx *cli.Context) (config *bzzapi.Config, err error) { - //start by creating a default config - config = bzzapi.NewConfig() - //first load settings from config file (if provided) - config, err = configFileOverride(config, ctx) - if err != nil { - return nil, err - } - //override settings provided by environment variables - config = envVarsOverride(config) - //override settings provided by command line - config = cmdLineOverride(config, ctx) - //validate configuration parameters - err = validateConfig(config) - - return -} - -//finally, after the configuration build phase is finished, initialize -func initSwarmNode(config *bzzapi.Config, stack *node.Node, ctx *cli.Context) { - //at this point, all vars should be set in the Config - //get the account for the provided swarm account - prvkey := getAccount(config.BzzAccount, ctx, stack) - //set the resolved config path (geth --datadir) - config.Path = expandPath(stack.InstanceDir()) - //finally, initialize the configuration - config.Init(prvkey) - //configuration phase completed here - log.Debug("Starting Swarm with the following parameters:") - //after having created the config, print it to screen - log.Debug(printConfig(config)) -} - -//configFileOverride overrides the current config with the config file, if a config file has been provided -func configFileOverride(config *bzzapi.Config, ctx *cli.Context) (*bzzapi.Config, error) { - var err error - - //only do something if the -config flag has been set - if ctx.GlobalIsSet(SwarmTomlConfigPathFlag.Name) { - var filepath string - if filepath = ctx.GlobalString(SwarmTomlConfigPathFlag.Name); filepath == "" { - utils.Fatalf("Config file flag provided with invalid file path") - } - var f *os.File - f, err = os.Open(filepath) - if err != nil { - return nil, err - } - defer f.Close() - - //decode the TOML file into a Config struct - //note that we are decoding into the existing defaultConfig; - //if an entry is not present in the file, the default entry is kept - err = tomlSettings.NewDecoder(f).Decode(&config) - // Add file name to errors that have a line number. - if _, ok := err.(*toml.LineError); ok { - err = errors.New(filepath + ", " + err.Error()) - } - } - return config, err -} - -//override the current config with whatever is provided through the command line -//most values are not allowed a zero value (empty string), if not otherwise noted -func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Config { - - if keyid := ctx.GlobalString(SwarmAccountFlag.Name); keyid != "" { - currentConfig.BzzAccount = keyid - } - - if chbookaddr := ctx.GlobalString(ChequebookAddrFlag.Name); chbookaddr != "" { - currentConfig.Contract = common.HexToAddress(chbookaddr) - } - - if networkid := ctx.GlobalString(SwarmNetworkIdFlag.Name); networkid != "" { - id, err := strconv.ParseUint(networkid, 10, 64) - if err != nil { - utils.Fatalf("invalid cli flag %s: %v", SwarmNetworkIdFlag.Name, err) - } - if id != 0 { - currentConfig.NetworkID = id - } - } - - if ctx.GlobalIsSet(utils.DataDirFlag.Name) { - if datadir := ctx.GlobalString(utils.DataDirFlag.Name); datadir != "" { - currentConfig.Path = expandPath(datadir) - } - } - - bzzport := ctx.GlobalString(SwarmPortFlag.Name) - if len(bzzport) > 0 { - currentConfig.Port = bzzport - } - - if bzzaddr := ctx.GlobalString(SwarmListenAddrFlag.Name); bzzaddr != "" { - currentConfig.ListenAddr = bzzaddr - } - - if ctx.GlobalIsSet(SwarmSwapEnabledFlag.Name) { - currentConfig.SwapEnabled = true - } - - if ctx.GlobalIsSet(SwarmSyncDisabledFlag.Name) { - currentConfig.SyncEnabled = false - } - - if d := ctx.GlobalDuration(SwarmSyncUpdateDelay.Name); d > 0 { - currentConfig.SyncUpdateDelay = d - } - - // any value including 0 is acceptable - currentConfig.MaxStreamPeerServers = ctx.GlobalInt(SwarmMaxStreamPeerServersFlag.Name) - - if ctx.GlobalIsSet(SwarmLightNodeEnabled.Name) { - currentConfig.LightNodeEnabled = true - } - - if ctx.GlobalIsSet(SwarmDeliverySkipCheckFlag.Name) { - currentConfig.DeliverySkipCheck = true - } - - currentConfig.SwapAPI = ctx.GlobalString(SwarmSwapAPIFlag.Name) - if currentConfig.SwapEnabled && currentConfig.SwapAPI == "" { - utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API) - } - - if ctx.GlobalIsSet(EnsAPIFlag.Name) { - ensAPIs := ctx.GlobalStringSlice(EnsAPIFlag.Name) - // preserve backward compatibility to disable ENS with --ens-api="" - if len(ensAPIs) == 1 && ensAPIs[0] == "" { - ensAPIs = nil - } - for i := range ensAPIs { - ensAPIs[i] = expandPath(ensAPIs[i]) - } - - currentConfig.EnsAPIs = ensAPIs - } - - if cors := ctx.GlobalString(CorsStringFlag.Name); cors != "" { - currentConfig.Cors = cors - } - - if storePath := ctx.GlobalString(SwarmStorePath.Name); storePath != "" { - currentConfig.LocalStoreParams.ChunkDbPath = storePath - } - - if storeCapacity := ctx.GlobalUint64(SwarmStoreCapacity.Name); storeCapacity != 0 { - currentConfig.LocalStoreParams.DbCapacity = storeCapacity - } - - if storeCacheCapacity := ctx.GlobalUint(SwarmStoreCacheCapacity.Name); storeCacheCapacity != 0 { - currentConfig.LocalStoreParams.CacheCapacity = storeCacheCapacity - } - - return currentConfig - -} - -//override the current config with whatver is provided in environment variables -//most values are not allowed a zero value (empty string), if not otherwise noted -func envVarsOverride(currentConfig *bzzapi.Config) (config *bzzapi.Config) { - - if keyid := os.Getenv(SWARM_ENV_ACCOUNT); keyid != "" { - currentConfig.BzzAccount = keyid - } - - if chbookaddr := os.Getenv(SWARM_ENV_CHEQUEBOOK_ADDR); chbookaddr != "" { - currentConfig.Contract = common.HexToAddress(chbookaddr) - } - - if networkid := os.Getenv(SWARM_ENV_NETWORK_ID); networkid != "" { - id, err := strconv.ParseUint(networkid, 10, 64) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_NETWORK_ID, err) - } - if id != 0 { - currentConfig.NetworkID = id - } - } - - if datadir := os.Getenv(GETH_ENV_DATADIR); datadir != "" { - currentConfig.Path = expandPath(datadir) - } - - bzzport := os.Getenv(SWARM_ENV_PORT) - if len(bzzport) > 0 { - currentConfig.Port = bzzport - } - - if bzzaddr := os.Getenv(SWARM_ENV_LISTEN_ADDR); bzzaddr != "" { - currentConfig.ListenAddr = bzzaddr - } - - if swapenable := os.Getenv(SWARM_ENV_SWAP_ENABLE); swapenable != "" { - swap, err := strconv.ParseBool(swapenable) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_SWAP_ENABLE, err) - } - currentConfig.SwapEnabled = swap - } - - if syncdisable := os.Getenv(SWARM_ENV_SYNC_DISABLE); syncdisable != "" { - sync, err := strconv.ParseBool(syncdisable) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_SYNC_DISABLE, err) - } - currentConfig.SyncEnabled = !sync - } - - if v := os.Getenv(SWARM_ENV_DELIVERY_SKIP_CHECK); v != "" { - skipCheck, err := strconv.ParseBool(v) - if err != nil { - currentConfig.DeliverySkipCheck = skipCheck - } - } - - if v := os.Getenv(SWARM_ENV_SYNC_UPDATE_DELAY); v != "" { - d, err := time.ParseDuration(v) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_SYNC_UPDATE_DELAY, err) - } - currentConfig.SyncUpdateDelay = d - } - - if max := os.Getenv(SWARM_ENV_MAX_STREAM_PEER_SERVERS); max != "" { - m, err := strconv.Atoi(max) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_MAX_STREAM_PEER_SERVERS, err) - } - currentConfig.MaxStreamPeerServers = m - } - - if lne := os.Getenv(SWARM_ENV_LIGHT_NODE_ENABLE); lne != "" { - lightnode, err := strconv.ParseBool(lne) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_LIGHT_NODE_ENABLE, err) - } - currentConfig.LightNodeEnabled = lightnode - } - - if swapapi := os.Getenv(SWARM_ENV_SWAP_API); swapapi != "" { - currentConfig.SwapAPI = swapapi - } - - if currentConfig.SwapEnabled && currentConfig.SwapAPI == "" { - utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API) - } - - if ensapi := os.Getenv(SWARM_ENV_ENS_API); ensapi != "" { - currentConfig.EnsAPIs = strings.Split(ensapi, ",") - } - - if ensaddr := os.Getenv(SWARM_ENV_ENS_ADDR); ensaddr != "" { - currentConfig.EnsRoot = common.HexToAddress(ensaddr) - } - - if cors := os.Getenv(SWARM_ENV_CORS); cors != "" { - currentConfig.Cors = cors - } - - return currentConfig -} - -// dumpConfig is the dumpconfig command. -// writes a default config to STDOUT -func dumpConfig(ctx *cli.Context) error { - cfg, err := buildConfig(ctx) - if err != nil { - utils.Fatalf(fmt.Sprintf("Uh oh - dumpconfig triggered an error %v", err)) - } - comment := "" - out, err := tomlSettings.Marshal(&cfg) - if err != nil { - return err - } - io.WriteString(os.Stdout, comment) - os.Stdout.Write(out) - return nil -} - -//validate configuration parameters -func validateConfig(cfg *bzzapi.Config) (err error) { - for _, ensAPI := range cfg.EnsAPIs { - if ensAPI != "" { - if err := validateEnsAPIs(ensAPI); err != nil { - return fmt.Errorf("invalid format [tld:][contract-addr@]url for ENS API endpoint configuration %q: %v", ensAPI, err) - } - } - } - return nil -} - -//validate EnsAPIs configuration parameter -func validateEnsAPIs(s string) (err error) { - // missing contract address - if strings.HasPrefix(s, "@") { - return errors.New("missing contract address") - } - // missing url - if strings.HasSuffix(s, "@") { - return errors.New("missing url") - } - // missing tld - if strings.HasPrefix(s, ":") { - return errors.New("missing tld") - } - // missing url - if strings.HasSuffix(s, ":") { - return errors.New("missing url") - } - return nil -} - -//print a Config as string -func printConfig(config *bzzapi.Config) string { - out, err := tomlSettings.Marshal(&config) - if err != nil { - return fmt.Sprintf("Something is not right with the configuration: %v", err) - } - return string(out) -} diff --git a/cmd/swarm/config_test.go b/cmd/swarm/config_test.go deleted file mode 100644 index 02198f878ec4..000000000000 --- a/cmd/swarm/config_test.go +++ /dev/null @@ -1,575 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "fmt" - "io" - "io/ioutil" - "net" - "os" - "os/exec" - "testing" - "time" - - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm" - "github.com/ethereum/go-ethereum/swarm/api" - - "github.com/docker/docker/pkg/reexec" -) - -func TestDumpConfig(t *testing.T) { - swarm := runSwarm(t, "dumpconfig") - defaultConf := api.NewConfig() - out, err := tomlSettings.Marshal(&defaultConf) - if err != nil { - t.Fatal(err) - } - swarm.Expect(string(out)) - swarm.ExpectExit() -} - -func TestConfigFailsSwapEnabledNoSwapApi(t *testing.T) { - flags := []string{ - fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", - fmt.Sprintf("--%s", SwarmPortFlag.Name), "54545", - fmt.Sprintf("--%s", SwarmSwapEnabledFlag.Name), - } - - swarm := runSwarm(t, flags...) - swarm.Expect("Fatal: " + SWARM_ERR_SWAP_SET_NO_API + "\n") - swarm.ExpectExit() -} - -func TestConfigFailsNoBzzAccount(t *testing.T) { - flags := []string{ - fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", - fmt.Sprintf("--%s", SwarmPortFlag.Name), "54545", - } - - swarm := runSwarm(t, flags...) - swarm.Expect("Fatal: " + SWARM_ERR_NO_BZZACCOUNT + "\n") - swarm.ExpectExit() -} - -func TestConfigCmdLineOverrides(t *testing.T) { - dir, err := ioutil.TempDir("", "bzztest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - conf, account := getTestAccount(t, dir) - node := &testNode{Dir: dir} - - // assign ports - httpPort, err := assignTCPPort() - if err != nil { - t.Fatal(err) - } - - flags := []string{ - fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", - fmt.Sprintf("--%s", SwarmPortFlag.Name), httpPort, - fmt.Sprintf("--%s", SwarmSyncDisabledFlag.Name), - fmt.Sprintf("--%s", CorsStringFlag.Name), "*", - fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), - fmt.Sprintf("--%s", SwarmDeliverySkipCheckFlag.Name), - fmt.Sprintf("--%s", EnsAPIFlag.Name), "", - "--datadir", dir, - "--ipcpath", conf.IPCPath, - } - node.Cmd = runSwarm(t, flags...) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - if info.Port != httpPort { - t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) - } - - if info.NetworkID != 42 { - t.Fatalf("Expected network ID to be %d, got %d", 42, info.NetworkID) - } - - if info.SyncEnabled { - t.Fatal("Expected Sync to be disabled, but is true") - } - - if !info.DeliverySkipCheck { - t.Fatal("Expected DeliverySkipCheck to be enabled, but it is not") - } - - if info.Cors != "*" { - t.Fatalf("Expected Cors flag to be set to %s, got %s", "*", info.Cors) - } - - node.Shutdown() -} - -func TestConfigFileOverrides(t *testing.T) { - - // assign ports - httpPort, err := assignTCPPort() - if err != nil { - t.Fatal(err) - } - - //create a config file - //first, create a default conf - defaultConf := api.NewConfig() - //change some values in order to test if they have been loaded - defaultConf.SyncEnabled = false - defaultConf.DeliverySkipCheck = true - defaultConf.NetworkID = 54 - defaultConf.Port = httpPort - defaultConf.DbCapacity = 9000000 - defaultConf.HiveParams.KeepAliveInterval = 6000000000 - defaultConf.Swap.Params.Strategy.AutoCashInterval = 600 * time.Second - //defaultConf.SyncParams.KeyBufferSize = 512 - //create a TOML string - out, err := tomlSettings.Marshal(&defaultConf) - if err != nil { - t.Fatalf("Error creating TOML file in TestFileOverride: %v", err) - } - //create file - f, err := ioutil.TempFile("", "testconfig.toml") - if err != nil { - t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) - } - //write file - _, err = f.WriteString(string(out)) - if err != nil { - t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) - } - f.Sync() - - dir, err := ioutil.TempDir("", "bzztest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - conf, account := getTestAccount(t, dir) - node := &testNode{Dir: dir} - - flags := []string{ - fmt.Sprintf("--%s", SwarmTomlConfigPathFlag.Name), f.Name(), - fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), - "--ens-api", "", - "--ipcpath", conf.IPCPath, - "--datadir", dir, - } - node.Cmd = runSwarm(t, flags...) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - if info.Port != httpPort { - t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) - } - - if info.NetworkID != 54 { - t.Fatalf("Expected network ID to be %d, got %d", 54, info.NetworkID) - } - - if info.SyncEnabled { - t.Fatal("Expected Sync to be disabled, but is true") - } - - if !info.DeliverySkipCheck { - t.Fatal("Expected DeliverySkipCheck to be enabled, but it is not") - } - - if info.DbCapacity != 9000000 { - t.Fatalf("Expected network ID to be %d, got %d", 54, info.NetworkID) - } - - if info.HiveParams.KeepAliveInterval != 6000000000 { - t.Fatalf("Expected HiveParams KeepAliveInterval to be %d, got %d", uint64(6000000000), uint64(info.HiveParams.KeepAliveInterval)) - } - - if info.Swap.Params.Strategy.AutoCashInterval != 600*time.Second { - t.Fatalf("Expected SwapParams AutoCashInterval to be %ds, got %d", 600, info.Swap.Params.Strategy.AutoCashInterval) - } - - // if info.SyncParams.KeyBufferSize != 512 { - // t.Fatalf("Expected info.SyncParams.KeyBufferSize to be %d, got %d", 512, info.SyncParams.KeyBufferSize) - // } - - node.Shutdown() -} - -func TestConfigEnvVars(t *testing.T) { - // assign ports - httpPort, err := assignTCPPort() - if err != nil { - t.Fatal(err) - } - - envVars := os.Environ() - envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmPortFlag.EnvVar, httpPort)) - envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmNetworkIdFlag.EnvVar, "999")) - envVars = append(envVars, fmt.Sprintf("%s=%s", CorsStringFlag.EnvVar, "*")) - envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmSyncDisabledFlag.EnvVar, "true")) - envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmDeliverySkipCheckFlag.EnvVar, "true")) - - dir, err := ioutil.TempDir("", "bzztest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - conf, account := getTestAccount(t, dir) - node := &testNode{Dir: dir} - flags := []string{ - fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), - "--ens-api", "", - "--datadir", dir, - "--ipcpath", conf.IPCPath, - } - - //node.Cmd = runSwarm(t,flags...) - //node.Cmd.cmd.Env = envVars - //the above assignment does not work, so we need a custom Cmd here in order to pass envVars: - cmd := &exec.Cmd{ - Path: reexec.Self(), - Args: append([]string{"swarm-test"}, flags...), - Stderr: os.Stderr, - Stdout: os.Stdout, - } - cmd.Env = envVars - //stdout, err := cmd.StdoutPipe() - //if err != nil { - // t.Fatal(err) - //} - //stdout = bufio.NewReader(stdout) - var stdin io.WriteCloser - if stdin, err = cmd.StdinPipe(); err != nil { - t.Fatal(err) - } - if err := cmd.Start(); err != nil { - t.Fatal(err) - } - - //cmd.InputLine(testPassphrase) - io.WriteString(stdin, testPassphrase+"\n") - defer func() { - if t.Failed() { - node.Shutdown() - cmd.Process.Kill() - } - }() - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - if info.Port != httpPort { - t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) - } - - if info.NetworkID != 999 { - t.Fatalf("Expected network ID to be %d, got %d", 999, info.NetworkID) - } - - if info.Cors != "*" { - t.Fatalf("Expected Cors flag to be set to %s, got %s", "*", info.Cors) - } - - if info.SyncEnabled { - t.Fatal("Expected Sync to be disabled, but is true") - } - - if !info.DeliverySkipCheck { - t.Fatal("Expected DeliverySkipCheck to be enabled, but it is not") - } - - node.Shutdown() - cmd.Process.Kill() -} - -func TestConfigCmdLineOverridesFile(t *testing.T) { - - // assign ports - httpPort, err := assignTCPPort() - if err != nil { - t.Fatal(err) - } - - //create a config file - //first, create a default conf - defaultConf := api.NewConfig() - //change some values in order to test if they have been loaded - defaultConf.SyncEnabled = true - defaultConf.NetworkID = 54 - defaultConf.Port = "8588" - defaultConf.DbCapacity = 9000000 - defaultConf.HiveParams.KeepAliveInterval = 6000000000 - defaultConf.Swap.Params.Strategy.AutoCashInterval = 600 * time.Second - //defaultConf.SyncParams.KeyBufferSize = 512 - //create a TOML file - out, err := tomlSettings.Marshal(&defaultConf) - if err != nil { - t.Fatalf("Error creating TOML file in TestFileOverride: %v", err) - } - //write file - fname := "testconfig.toml" - f, err := ioutil.TempFile("", fname) - if err != nil { - t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) - } - defer os.Remove(fname) - //write file - _, err = f.WriteString(string(out)) - if err != nil { - t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) - } - f.Sync() - - dir, err := ioutil.TempDir("", "bzztest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - conf, account := getTestAccount(t, dir) - node := &testNode{Dir: dir} - - expectNetworkId := uint64(77) - - flags := []string{ - fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "77", - fmt.Sprintf("--%s", SwarmPortFlag.Name), httpPort, - fmt.Sprintf("--%s", SwarmSyncDisabledFlag.Name), - fmt.Sprintf("--%s", SwarmTomlConfigPathFlag.Name), f.Name(), - fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), - "--ens-api", "", - "--datadir", dir, - "--ipcpath", conf.IPCPath, - } - node.Cmd = runSwarm(t, flags...) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - if info.Port != httpPort { - t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) - } - - if info.NetworkID != expectNetworkId { - t.Fatalf("Expected network ID to be %d, got %d", expectNetworkId, info.NetworkID) - } - - if info.SyncEnabled { - t.Fatal("Expected Sync to be disabled, but is true") - } - - if info.LocalStoreParams.DbCapacity != 9000000 { - t.Fatalf("Expected Capacity to be %d, got %d", 9000000, info.LocalStoreParams.DbCapacity) - } - - if info.HiveParams.KeepAliveInterval != 6000000000 { - t.Fatalf("Expected HiveParams KeepAliveInterval to be %d, got %d", uint64(6000000000), uint64(info.HiveParams.KeepAliveInterval)) - } - - if info.Swap.Params.Strategy.AutoCashInterval != 600*time.Second { - t.Fatalf("Expected SwapParams AutoCashInterval to be %ds, got %d", 600, info.Swap.Params.Strategy.AutoCashInterval) - } - - // if info.SyncParams.KeyBufferSize != 512 { - // t.Fatalf("Expected info.SyncParams.KeyBufferSize to be %d, got %d", 512, info.SyncParams.KeyBufferSize) - // } - - node.Shutdown() -} - -func TestValidateConfig(t *testing.T) { - for _, c := range []struct { - cfg *api.Config - err string - }{ - { - cfg: &api.Config{EnsAPIs: []string{ - "/data/testnet/geth.ipc", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "http://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "ws://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "test:/data/testnet/geth.ipc", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "test:ws://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "test:314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "eth:314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "eth:314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:12344", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "eth:", - }}, - err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"eth:\": missing url", - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "314159265dD8dbb310642f98f50C066173C1259b@", - }}, - err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"314159265dD8dbb310642f98f50C066173C1259b@\": missing url", - }, - { - cfg: &api.Config{EnsAPIs: []string{ - ":314159265dD8dbb310642f98f50C066173C1259", - }}, - err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \":314159265dD8dbb310642f98f50C066173C1259\": missing tld", - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "@/data/testnet/geth.ipc", - }}, - err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"@/data/testnet/geth.ipc\": missing contract address", - }, - } { - err := validateConfig(c.cfg) - if c.err != "" && err.Error() != c.err { - t.Errorf("expected error %q, got %q", c.err, err) - } - if c.err == "" && err != nil { - t.Errorf("unexpected error %q", err) - } - } -} - -func assignTCPPort() (string, error) { - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - return "", err - } - l.Close() - _, port, err := net.SplitHostPort(l.Addr().String()) - if err != nil { - return "", err - } - return port, nil -} diff --git a/cmd/swarm/db.go b/cmd/swarm/db.go deleted file mode 100644 index fe03f2d160a6..000000000000 --- a/cmd/swarm/db.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "fmt" - "io" - "os" - "path/filepath" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/storage" - "gopkg.in/urfave/cli.v1" -) - -func dbExport(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 3 { - utils.Fatalf("invalid arguments, please specify both (path to a local chunk database), (path to write the tar archive to, - for stdout) and the base key") - } - - store, err := openLDBStore(args[0], common.Hex2Bytes(args[2])) - if err != nil { - utils.Fatalf("error opening local chunk database: %s", err) - } - defer store.Close() - - var out io.Writer - if args[1] == "-" { - out = os.Stdout - } else { - f, err := os.Create(args[1]) - if err != nil { - utils.Fatalf("error opening output file: %s", err) - } - defer f.Close() - out = f - } - - count, err := store.Export(out) - if err != nil { - utils.Fatalf("error exporting local chunk database: %s", err) - } - - log.Info(fmt.Sprintf("successfully exported %d chunks", count)) -} - -func dbImport(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 3 { - utils.Fatalf("invalid arguments, please specify both (path to a local chunk database), (path to read the tar archive from, - for stdin) and the base key") - } - - store, err := openLDBStore(args[0], common.Hex2Bytes(args[2])) - if err != nil { - utils.Fatalf("error opening local chunk database: %s", err) - } - defer store.Close() - - var in io.Reader - if args[1] == "-" { - in = os.Stdin - } else { - f, err := os.Open(args[1]) - if err != nil { - utils.Fatalf("error opening input file: %s", err) - } - defer f.Close() - in = f - } - - count, err := store.Import(in) - if err != nil { - utils.Fatalf("error importing local chunk database: %s", err) - } - - log.Info(fmt.Sprintf("successfully imported %d chunks", count)) -} - -func dbClean(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 2 { - utils.Fatalf("invalid arguments, please specify (path to a local chunk database) and the base key") - } - - store, err := openLDBStore(args[0], common.Hex2Bytes(args[1])) - if err != nil { - utils.Fatalf("error opening local chunk database: %s", err) - } - defer store.Close() - - store.Cleanup() -} - -func openLDBStore(path string, basekey []byte) (*storage.LDBStore, error) { - if _, err := os.Stat(filepath.Join(path, "CURRENT")); err != nil { - return nil, fmt.Errorf("invalid chunkdb path: %s", err) - } - - storeparams := storage.NewDefaultStoreParams() - ldbparams := storage.NewLDBStoreParams(storeparams, path) - ldbparams.BaseKey = basekey - return storage.NewLDBStore(ldbparams) -} diff --git a/cmd/swarm/download.go b/cmd/swarm/download.go deleted file mode 100644 index 91bc2c93abc3..000000000000 --- a/cmd/swarm/download.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . -package main - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/api" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "gopkg.in/urfave/cli.v1" -) - -func download(ctx *cli.Context) { - log.Debug("downloading content using swarm down") - args := ctx.Args() - dest := "." - - switch len(args) { - case 0: - utils.Fatalf("Usage: swarm down [options] []") - case 1: - log.Trace(fmt.Sprintf("swarm down: no destination path - assuming working dir")) - default: - log.Trace(fmt.Sprintf("destination path arg: %s", args[1])) - if absDest, err := filepath.Abs(args[1]); err == nil { - dest = absDest - } else { - utils.Fatalf("could not get download path: %v", err) - } - } - - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - isRecursive = ctx.Bool(SwarmRecursiveFlag.Name) - client = swarm.NewClient(bzzapi) - ) - - if fi, err := os.Stat(dest); err == nil { - if isRecursive && !fi.Mode().IsDir() { - utils.Fatalf("destination path is not a directory!") - } - } else { - if !os.IsNotExist(err) { - utils.Fatalf("could not stat path: %v", err) - } - } - - uri, err := api.Parse(args[0]) - if err != nil { - utils.Fatalf("could not parse uri argument: %v", err) - } - - dl := func(credentials string) error { - // assume behaviour according to --recursive switch - if isRecursive { - if err := client.DownloadDirectory(uri.Addr, uri.Path, dest, credentials); err != nil { - if err == swarm.ErrUnauthorized { - return err - } - return fmt.Errorf("directory %s: %v", uri.Path, err) - } - } else { - // we are downloading a file - log.Debug("downloading file/path from a manifest", "uri.Addr", uri.Addr, "uri.Path", uri.Path) - - err := client.DownloadFile(uri.Addr, uri.Path, dest, credentials) - if err != nil { - if err == swarm.ErrUnauthorized { - return err - } - return fmt.Errorf("file %s from address: %s: %v", uri.Path, uri.Addr, err) - } - } - return nil - } - if passwords := makePasswordList(ctx); passwords != nil { - password := getPassPhrase(fmt.Sprintf("Downloading %s is restricted", uri), 0, passwords) - err = dl(password) - } else { - err = dl("") - } - if err != nil { - utils.Fatalf("download: %v", err) - } -} diff --git a/cmd/swarm/export_test.go b/cmd/swarm/export_test.go deleted file mode 100644 index 20df7b060904..000000000000 --- a/cmd/swarm/export_test.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -// +build !windows - -package main - -import ( - "bytes" - "crypto/md5" - "crypto/rand" - "io" - "io/ioutil" - "net/http" - "os" - "strings" - "testing" - - "github.com/ethereum/go-ethereum/swarm" -) - -// TestCLISwarmExportImport perform the following test: -// 1. runs swarm node -// 2. uploads a random file -// 3. runs an export of the local datastore -// 4. runs a second swarm node -// 5. imports the exported datastore -// 6. fetches the uploaded random file from the second node -func TestCLISwarmExportImport(t *testing.T) { - cluster := newTestCluster(t, 1) - - // generate random 10mb file - f, cleanup := generateRandomFile(t, 10000000) - defer cleanup() - - // upload the file with 'swarm up' and expect a hash - up := runSwarm(t, "--bzzapi", cluster.Nodes[0].URL, "up", f.Name()) - _, matches := up.ExpectRegexp(`[a-f\d]{64}`) - up.ExpectExit() - hash := matches[0] - - var info swarm.Info - if err := cluster.Nodes[0].Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - cluster.Stop() - defer cluster.Cleanup() - - // generate an export.tar - exportCmd := runSwarm(t, "db", "export", info.Path+"/chunks", info.Path+"/export.tar", strings.TrimPrefix(info.BzzKey, "0x")) - exportCmd.ExpectExit() - - // start second cluster - cluster2 := newTestCluster(t, 1) - - var info2 swarm.Info - if err := cluster2.Nodes[0].Client.Call(&info2, "bzz_info"); err != nil { - t.Fatal(err) - } - - // stop second cluster, so that we close LevelDB - cluster2.Stop() - defer cluster2.Cleanup() - - // import the export.tar - importCmd := runSwarm(t, "db", "import", info2.Path+"/chunks", info.Path+"/export.tar", strings.TrimPrefix(info2.BzzKey, "0x")) - importCmd.ExpectExit() - - // spin second cluster back up - cluster2.StartExistingNodes(t, 1, strings.TrimPrefix(info2.BzzAccount, "0x")) - - // try to fetch imported file - res, err := http.Get(cluster2.Nodes[0].URL + "/bzz:/" + hash) - if err != nil { - t.Fatal(err) - } - - if res.StatusCode != 200 { - t.Fatalf("expected HTTP status %d, got %s", 200, res.Status) - } - - // compare downloaded file with the generated random file - mustEqualFiles(t, f, res.Body) -} - -func mustEqualFiles(t *testing.T, up io.Reader, down io.Reader) { - h := md5.New() - upLen, err := io.Copy(h, up) - if err != nil { - t.Fatal(err) - } - upHash := h.Sum(nil) - h.Reset() - downLen, err := io.Copy(h, down) - if err != nil { - t.Fatal(err) - } - downHash := h.Sum(nil) - - if !bytes.Equal(upHash, downHash) || upLen != downLen { - t.Fatalf("downloaded imported file md5=%x (length %v) is not the same as the generated one mp5=%x (length %v)", downHash, downLen, upHash, upLen) - } -} - -func generateRandomFile(t *testing.T, size int) (f *os.File, teardown func()) { - // create a tmp file - tmp, err := ioutil.TempFile("", "swarm-test") - if err != nil { - t.Fatal(err) - } - - // callback for tmp file cleanup - teardown = func() { - tmp.Close() - os.Remove(tmp.Name()) - } - - // write 10mb random data to file - buf := make([]byte, 10000000) - _, err = rand.Read(buf) - if err != nil { - t.Fatal(err) - } - ioutil.WriteFile(tmp.Name(), buf, 0755) - - return tmp, teardown -} diff --git a/cmd/swarm/fs.go b/cmd/swarm/fs.go deleted file mode 100644 index 3dc38ca4daca..000000000000 --- a/cmd/swarm/fs.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "context" - "fmt" - "path/filepath" - "strings" - "time" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/fuse" - "gopkg.in/urfave/cli.v1" -) - -func mount(cliContext *cli.Context) { - args := cliContext.Args() - if len(args) < 2 { - utils.Fatalf("Usage: swarm fs mount --ipcpath ") - } - - client, err := dialRPC(cliContext) - if err != nil { - utils.Fatalf("had an error dailing to RPC endpoint: %v", err) - } - defer client.Close() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - mf := &fuse.MountInfo{} - mountPoint, err := filepath.Abs(filepath.Clean(args[1])) - if err != nil { - utils.Fatalf("error expanding path for mount point: %v", err) - } - err = client.CallContext(ctx, mf, "swarmfs_mount", args[0], mountPoint) - if err != nil { - utils.Fatalf("had an error calling the RPC endpoint while mounting: %v", err) - } -} - -func unmount(cliContext *cli.Context) { - args := cliContext.Args() - - if len(args) < 1 { - utils.Fatalf("Usage: swarm fs unmount --ipcpath ") - } - client, err := dialRPC(cliContext) - if err != nil { - utils.Fatalf("had an error dailing to RPC endpoint: %v", err) - } - defer client.Close() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - mf := fuse.MountInfo{} - err = client.CallContext(ctx, &mf, "swarmfs_unmount", args[0]) - if err != nil { - utils.Fatalf("encountered an error calling the RPC endpoint while unmounting: %v", err) - } - fmt.Printf("%s\n", mf.LatestManifest) //print the latest manifest hash for user reference -} - -func listMounts(cliContext *cli.Context) { - client, err := dialRPC(cliContext) - if err != nil { - utils.Fatalf("had an error dailing to RPC endpoint: %v", err) - } - defer client.Close() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - mf := []fuse.MountInfo{} - err = client.CallContext(ctx, &mf, "swarmfs_listmounts") - if err != nil { - utils.Fatalf("encountered an error calling the RPC endpoint while listing mounts: %v", err) - } - if len(mf) == 0 { - fmt.Print("Could not found any swarmfs mounts. Please make sure you've specified the correct RPC endpoint\n") - } else { - fmt.Printf("Found %d swarmfs mount(s):\n", len(mf)) - for i, mountInfo := range mf { - fmt.Printf("%d:\n", i) - fmt.Printf("\tMount point: %s\n", mountInfo.MountPoint) - fmt.Printf("\tLatest Manifest: %s\n", mountInfo.LatestManifest) - fmt.Printf("\tStart Manifest: %s\n", mountInfo.StartManifest) - } - } -} - -func dialRPC(ctx *cli.Context) (*rpc.Client, error) { - var endpoint string - - if ctx.IsSet(utils.IPCPathFlag.Name) { - endpoint = ctx.String(utils.IPCPathFlag.Name) - } else { - utils.Fatalf("swarm ipc endpoint not specified") - } - - if endpoint == "" { - endpoint = node.DefaultIPCEndpoint(clientIdentifier) - } else if strings.HasPrefix(endpoint, "rpc:") || strings.HasPrefix(endpoint, "ipc:") { - // Backwards compatibility with geth < 1.5 which required - // these prefixes. - endpoint = endpoint[4:] - } - return rpc.Dial(endpoint) -} diff --git a/cmd/swarm/fs_test.go b/cmd/swarm/fs_test.go deleted file mode 100644 index 4f38b094bbf2..000000000000 --- a/cmd/swarm/fs_test.go +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -// +build linux freebsd - -package main - -import ( - "bytes" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - colorable "github.com/mattn/go-colorable" -) - -func init() { - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -type testFile struct { - filePath string - content string -} - -// TestCLISwarmFs is a high-level test of swarmfs -// -// This test fails on travis for macOS as this executable exits with code 1 -// and without any log messages in the log: -// /Library/Filesystems/osxfuse.fs/Contents/Resources/load_osxfuse. -// This is the reason for this file not being built on darwin architecture. -func TestCLISwarmFs(t *testing.T) { - cluster := newTestCluster(t, 3) - defer cluster.Shutdown() - - // create a tmp dir - mountPoint, err := ioutil.TempDir("", "swarm-test") - log.Debug("swarmfs cli test", "1st mount", mountPoint) - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(mountPoint) - - handlingNode := cluster.Nodes[0] - mhash := doUploadEmptyDir(t, handlingNode) - log.Debug("swarmfs cli test: mounting first run", "ipc path", filepath.Join(handlingNode.Dir, handlingNode.IpcPath)) - - mount := runSwarm(t, []string{ - "fs", - "mount", - "--ipcpath", filepath.Join(handlingNode.Dir, handlingNode.IpcPath), - mhash, - mountPoint, - }...) - mount.ExpectExit() - - filesToAssert := []*testFile{} - - dirPath, err := createDirInDir(mountPoint, "testSubDir") - if err != nil { - t.Fatal(err) - } - dirPath2, err := createDirInDir(dirPath, "AnotherTestSubDir") - - dummyContent := "somerandomtestcontentthatshouldbeasserted" - dirs := []string{ - mountPoint, - dirPath, - dirPath2, - } - files := []string{"f1.tmp", "f2.tmp"} - for _, d := range dirs { - for _, entry := range files { - tFile, err := createTestFileInPath(d, entry, dummyContent) - if err != nil { - t.Fatal(err) - } - filesToAssert = append(filesToAssert, tFile) - } - } - if len(filesToAssert) != len(dirs)*len(files) { - t.Fatalf("should have %d files to assert now, got %d", len(dirs)*len(files), len(filesToAssert)) - } - hashRegexp := `[a-f\d]{64}` - log.Debug("swarmfs cli test: unmounting first run...", "ipc path", filepath.Join(handlingNode.Dir, handlingNode.IpcPath)) - - unmount := runSwarm(t, []string{ - "fs", - "unmount", - "--ipcpath", filepath.Join(handlingNode.Dir, handlingNode.IpcPath), - mountPoint, - }...) - _, matches := unmount.ExpectRegexp(hashRegexp) - unmount.ExpectExit() - - hash := matches[0] - if hash == mhash { - t.Fatal("this should not be equal") - } - log.Debug("swarmfs cli test: asserting no files in mount point") - - //check that there's nothing in the mount folder - filesInDir, err := ioutil.ReadDir(mountPoint) - if err != nil { - t.Fatalf("had an error reading the directory: %v", err) - } - - if len(filesInDir) != 0 { - t.Fatal("there shouldn't be anything here") - } - - secondMountPoint, err := ioutil.TempDir("", "swarm-test") - log.Debug("swarmfs cli test", "2nd mount point at", secondMountPoint) - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(secondMountPoint) - - log.Debug("swarmfs cli test: remounting at second mount point", "ipc path", filepath.Join(handlingNode.Dir, handlingNode.IpcPath)) - - //remount, check files - newMount := runSwarm(t, []string{ - "fs", - "mount", - "--ipcpath", filepath.Join(handlingNode.Dir, handlingNode.IpcPath), - hash, // the latest hash - secondMountPoint, - }...) - - newMount.ExpectExit() - time.Sleep(1 * time.Second) - - filesInDir, err = ioutil.ReadDir(secondMountPoint) - if err != nil { - t.Fatal(err) - } - - if len(filesInDir) == 0 { - t.Fatal("there should be something here") - } - - log.Debug("swarmfs cli test: traversing file tree to see it matches previous mount") - - for _, file := range filesToAssert { - file.filePath = strings.Replace(file.filePath, mountPoint, secondMountPoint, -1) - fileBytes, err := ioutil.ReadFile(file.filePath) - - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(fileBytes, bytes.NewBufferString(file.content).Bytes()) { - t.Fatal("this should be equal") - } - } - - log.Debug("swarmfs cli test: unmounting second run", "ipc path", filepath.Join(handlingNode.Dir, handlingNode.IpcPath)) - - unmountSec := runSwarm(t, []string{ - "fs", - "unmount", - "--ipcpath", filepath.Join(handlingNode.Dir, handlingNode.IpcPath), - secondMountPoint, - }...) - - _, matches = unmountSec.ExpectRegexp(hashRegexp) - unmountSec.ExpectExit() - - if matches[0] != hash { - t.Fatal("these should be equal - no changes made") - } -} - -func doUploadEmptyDir(t *testing.T, node *testNode) string { - // create a tmp dir - tmpDir, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - hashRegexp := `[a-f\d]{64}` - - flags := []string{ - "--bzzapi", node.URL, - "--recursive", - "up", - tmpDir} - - log.Info("swarmfs cli test: uploading dir with 'swarm up'") - up := runSwarm(t, flags...) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - hash := matches[0] - log.Info("swarmfs cli test: dir uploaded", "hash", hash) - return hash -} - -func createDirInDir(createInDir string, dirToCreate string) (string, error) { - fullpath := filepath.Join(createInDir, dirToCreate) - err := os.MkdirAll(fullpath, 0777) - if err != nil { - return "", err - } - return fullpath, nil -} - -func createTestFileInPath(dir, filename, content string) (*testFile, error) { - tFile := &testFile{} - filePath := filepath.Join(dir, filename) - if file, err := os.Create(filePath); err == nil { - tFile.content = content - tFile.filePath = filePath - - _, err = io.WriteString(file, content) - if err != nil { - return nil, err - } - file.Close() - } - - return tFile, nil -} diff --git a/cmd/swarm/hash.go b/cmd/swarm/hash.go deleted file mode 100644 index d679806e380b..000000000000 --- a/cmd/swarm/hash.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -// Command bzzhash computes a swarm tree hash. -package main - -import ( - "context" - "fmt" - "os" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/swarm/storage" - "gopkg.in/urfave/cli.v1" -) - -func hash(ctx *cli.Context) { - args := ctx.Args() - if len(args) < 1 { - utils.Fatalf("Usage: swarm hash ") - } - f, err := os.Open(args[0]) - if err != nil { - utils.Fatalf("Error opening file " + args[1]) - } - defer f.Close() - - stat, _ := f.Stat() - fileStore := storage.NewFileStore(&storage.FakeChunkStore{}, storage.NewFileStoreParams()) - addr, _, err := fileStore.Store(context.TODO(), f, stat.Size(), false) - if err != nil { - utils.Fatalf("%v\n", err) - } else { - fmt.Printf("%v\n", addr) - } -} diff --git a/cmd/swarm/list.go b/cmd/swarm/list.go deleted file mode 100644 index 01b3f4ab6c5b..000000000000 --- a/cmd/swarm/list.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "fmt" - "os" - "strings" - "text/tabwriter" - - "github.com/ethereum/go-ethereum/cmd/utils" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "gopkg.in/urfave/cli.v1" -) - -func list(ctx *cli.Context) { - args := ctx.Args() - - if len(args) < 1 { - utils.Fatalf("Please supply a manifest reference as the first argument") - } else if len(args) > 2 { - utils.Fatalf("Too many arguments - usage 'swarm ls manifest [prefix]'") - } - manifest := args[0] - - var prefix string - if len(args) == 2 { - prefix = args[1] - } - - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := swarm.NewClient(bzzapi) - list, err := client.List(manifest, prefix, "") - if err != nil { - utils.Fatalf("Failed to generate file and directory list: %s", err) - } - - w := tabwriter.NewWriter(os.Stdout, 1, 2, 2, ' ', 0) - defer w.Flush() - fmt.Fprintln(w, "HASH\tCONTENT TYPE\tPATH") - for _, prefix := range list.CommonPrefixes { - fmt.Fprintf(w, "%s\t%s\t%s\n", "", "DIR", prefix) - } - for _, entry := range list.Entries { - fmt.Fprintf(w, "%s\t%s\t%s\n", entry.Hash, entry.ContentType, entry.Path) - } -} diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go deleted file mode 100644 index 5acf87c71399..000000000000 --- a/cmd/swarm/main.go +++ /dev/null @@ -1,842 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "crypto/ecdsa" - "encoding/hex" - "fmt" - "io/ioutil" - "os" - "os/signal" - "runtime" - "sort" - "strconv" - "strings" - "syscall" - - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/keystore" - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/console" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/internal/debug" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm" - bzzapi "github.com/ethereum/go-ethereum/swarm/api" - swarmmetrics "github.com/ethereum/go-ethereum/swarm/metrics" - "github.com/ethereum/go-ethereum/swarm/tracing" - sv "github.com/ethereum/go-ethereum/swarm/version" - - "gopkg.in/urfave/cli.v1" -) - -const clientIdentifier = "swarm" -const helpTemplate = `NAME: -{{.HelpName}} - {{.Usage}} - -USAGE: -{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} - -CATEGORY: -{{.Category}}{{end}}{{if .Description}} - -DESCRIPTION: -{{.Description}}{{end}}{{if .VisibleFlags}} - -OPTIONS: -{{range .VisibleFlags}}{{.}} -{{end}}{{end}} -` - -var ( - gitCommit string // Git SHA1 commit hash of the release (set via linker flags) -) - -var ( - ChequebookAddrFlag = cli.StringFlag{ - Name: "chequebook", - Usage: "chequebook contract address", - EnvVar: SWARM_ENV_CHEQUEBOOK_ADDR, - } - SwarmAccountFlag = cli.StringFlag{ - Name: "bzzaccount", - Usage: "Swarm account key file", - EnvVar: SWARM_ENV_ACCOUNT, - } - SwarmListenAddrFlag = cli.StringFlag{ - Name: "httpaddr", - Usage: "Swarm HTTP API listening interface", - EnvVar: SWARM_ENV_LISTEN_ADDR, - } - SwarmPortFlag = cli.StringFlag{ - Name: "bzzport", - Usage: "Swarm local http api port", - EnvVar: SWARM_ENV_PORT, - } - SwarmNetworkIdFlag = cli.IntFlag{ - Name: "bzznetworkid", - Usage: "Network identifier (integer, default 3=swarm testnet)", - EnvVar: SWARM_ENV_NETWORK_ID, - } - SwarmSwapEnabledFlag = cli.BoolFlag{ - Name: "swap", - Usage: "Swarm SWAP enabled (default false)", - EnvVar: SWARM_ENV_SWAP_ENABLE, - } - SwarmSwapAPIFlag = cli.StringFlag{ - Name: "swap-api", - Usage: "URL of the Ethereum API provider to use to settle SWAP payments", - EnvVar: SWARM_ENV_SWAP_API, - } - SwarmSyncDisabledFlag = cli.BoolTFlag{ - Name: "nosync", - Usage: "Disable swarm syncing", - EnvVar: SWARM_ENV_SYNC_DISABLE, - } - SwarmSyncUpdateDelay = cli.DurationFlag{ - Name: "sync-update-delay", - Usage: "Duration for sync subscriptions update after no new peers are added (default 15s)", - EnvVar: SWARM_ENV_SYNC_UPDATE_DELAY, - } - SwarmMaxStreamPeerServersFlag = cli.IntFlag{ - Name: "max-stream-peer-servers", - Usage: "Limit of Stream peer servers, 0 denotes unlimited", - EnvVar: SWARM_ENV_MAX_STREAM_PEER_SERVERS, - Value: 10000, // A very large default value is possible as stream servers have very small memory footprint - } - SwarmLightNodeEnabled = cli.BoolFlag{ - Name: "lightnode", - Usage: "Enable Swarm LightNode (default false)", - EnvVar: SWARM_ENV_LIGHT_NODE_ENABLE, - } - SwarmDeliverySkipCheckFlag = cli.BoolFlag{ - Name: "delivery-skip-check", - Usage: "Skip chunk delivery check (default false)", - EnvVar: SWARM_ENV_DELIVERY_SKIP_CHECK, - } - EnsAPIFlag = cli.StringSliceFlag{ - Name: "ens-api", - Usage: "ENS API endpoint for a TLD and with contract address, can be repeated, format [tld:][contract-addr@]url", - EnvVar: SWARM_ENV_ENS_API, - } - SwarmApiFlag = cli.StringFlag{ - Name: "bzzapi", - Usage: "Swarm HTTP endpoint", - Value: "http://127.0.0.1:8500", - } - SwarmRecursiveFlag = cli.BoolFlag{ - Name: "recursive", - Usage: "Upload directories recursively", - } - SwarmWantManifestFlag = cli.BoolTFlag{ - Name: "manifest", - Usage: "Automatic manifest upload (default true)", - } - SwarmUploadDefaultPath = cli.StringFlag{ - Name: "defaultpath", - Usage: "path to file served for empty url path (none)", - } - SwarmAccessGrantKeyFlag = cli.StringFlag{ - Name: "grant-key", - Usage: "grants a given public key access to an ACT", - } - SwarmAccessGrantKeysFlag = cli.StringFlag{ - Name: "grant-keys", - Usage: "grants a given list of public keys in the following file (separated by line breaks) access to an ACT", - } - SwarmUpFromStdinFlag = cli.BoolFlag{ - Name: "stdin", - Usage: "reads data to be uploaded from stdin", - } - SwarmUploadMimeType = cli.StringFlag{ - Name: "mime", - Usage: "Manually specify MIME type", - } - SwarmEncryptedFlag = cli.BoolFlag{ - Name: "encrypt", - Usage: "use encrypted upload", - } - SwarmAccessPasswordFlag = cli.StringFlag{ - Name: "password", - Usage: "Password", - EnvVar: SWARM_ACCESS_PASSWORD, - } - SwarmDryRunFlag = cli.BoolFlag{ - Name: "dry-run", - Usage: "dry-run", - } - CorsStringFlag = cli.StringFlag{ - Name: "corsdomain", - Usage: "Domain on which to send Access-Control-Allow-Origin header (multiple domains can be supplied separated by a ',')", - EnvVar: SWARM_ENV_CORS, - } - SwarmStorePath = cli.StringFlag{ - Name: "store.path", - Usage: "Path to leveldb chunk DB (default <$GETH_ENV_DIR>/swarm/bzz-<$BZZ_KEY>/chunks)", - EnvVar: SWARM_ENV_STORE_PATH, - } - SwarmStoreCapacity = cli.Uint64Flag{ - Name: "store.size", - Usage: "Number of chunks (5M is roughly 20-25GB) (default 5000000)", - EnvVar: SWARM_ENV_STORE_CAPACITY, - } - SwarmStoreCacheCapacity = cli.UintFlag{ - Name: "store.cache.size", - Usage: "Number of recent chunks cached in memory (default 5000)", - EnvVar: SWARM_ENV_STORE_CACHE_CAPACITY, - } - SwarmCompressedFlag = cli.BoolFlag{ - Name: "compressed", - Usage: "Prints encryption keys in compressed form", - } - SwarmResourceNameFlag = cli.StringFlag{ - Name: "name", - Usage: "User-defined name for the new resource, limited to 32 characters. If combined with topic, the resource will be a subtopic with this name", - } - SwarmResourceTopicFlag = cli.StringFlag{ - Name: "topic", - Usage: "User-defined topic this resource is tracking, hex encoded. Limited to 64 hexadecimal characters", - } - SwarmResourceDataOnCreateFlag = cli.StringFlag{ - Name: "data", - Usage: "Initializes the resource with the given hex-encoded data. Data must be prefixed by 0x", - } - SwarmResourceManifestFlag = cli.StringFlag{ - Name: "manifest", - Usage: "Refers to the resource through a manifest", - } - SwarmResourceUserFlag = cli.StringFlag{ - Name: "user", - Usage: "Indicates the user who updates the resource", - } -) - -//declare a few constant error messages, useful for later error check comparisons in test -var ( - SWARM_ERR_NO_BZZACCOUNT = "bzzaccount option is required but not set; check your config file, command line or environment variables" - SWARM_ERR_SWAP_SET_NO_API = "SWAP is enabled but --swap-api is not set" -) - -// this help command gets added to any subcommand that does not define it explicitly -var defaultSubcommandHelp = cli.Command{ - Action: func(ctx *cli.Context) { cli.ShowCommandHelpAndExit(ctx, "", 1) }, - CustomHelpTemplate: helpTemplate, - Name: "help", - Usage: "shows this help", - Hidden: true, -} - -var defaultNodeConfig = node.DefaultConfig - -// This init function sets defaults so cmd/swarm can run alongside geth. -func init() { - defaultNodeConfig.Name = clientIdentifier - defaultNodeConfig.Version = sv.VersionWithCommit(gitCommit) - defaultNodeConfig.P2P.ListenAddr = ":30399" - defaultNodeConfig.IPCPath = "bzzd.ipc" - // Set flag defaults for --help display. - utils.ListenPortFlag.Value = 30399 -} - -var app = utils.NewApp("", "Ethereum Swarm") - -// This init function creates the cli.App. -func init() { - app.Action = bzzd - app.Version = sv.ArchiveVersion(gitCommit) - app.Copyright = "Copyright 2013-2016 The go-ethereum Authors" - app.Commands = []cli.Command{ - { - Action: version, - CustomHelpTemplate: helpTemplate, - Name: "version", - Usage: "Print version numbers", - Description: "The output of this command is supposed to be machine-readable", - }, - { - Action: keys, - CustomHelpTemplate: helpTemplate, - Name: "print-keys", - Flags: []cli.Flag{SwarmCompressedFlag}, - Usage: "Print public key information", - Description: "The output of this command is supposed to be machine-readable", - }, - { - Action: upload, - CustomHelpTemplate: helpTemplate, - Name: "up", - Usage: "uploads a file or directory to swarm using the HTTP API", - ArgsUsage: "", - Flags: []cli.Flag{SwarmEncryptedFlag}, - Description: "uploads a file or directory to swarm using the HTTP API and prints the root hash", - }, - { - CustomHelpTemplate: helpTemplate, - Name: "access", - Usage: "encrypts a reference and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root manifest", - Subcommands: []cli.Command{ - { - CustomHelpTemplate: helpTemplate, - Name: "new", - Usage: "encrypts a reference and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root access manifest and prints the resulting manifest", - Subcommands: []cli.Command{ - { - Action: accessNewPass, - CustomHelpTemplate: helpTemplate, - Flags: []cli.Flag{ - utils.PasswordFileFlag, - SwarmDryRunFlag, - }, - Name: "pass", - Usage: "encrypts a reference with a password and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root access manifest and prints the resulting manifest", - }, - { - Action: accessNewPK, - CustomHelpTemplate: helpTemplate, - Flags: []cli.Flag{ - utils.PasswordFileFlag, - SwarmDryRunFlag, - SwarmAccessGrantKeyFlag, - }, - Name: "pk", - Usage: "encrypts a reference with the node's private key and a given grantee's public key and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root access manifest and prints the resulting manifest", - }, - { - Action: accessNewACT, - CustomHelpTemplate: helpTemplate, - Flags: []cli.Flag{ - SwarmAccessGrantKeysFlag, - SwarmDryRunFlag, - utils.PasswordFileFlag, - }, - Name: "act", - Usage: "encrypts a reference with the node's private key and a given grantee's public key and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root access manifest and prints the resulting manifest", - }, - }, - }, - }, - }, - { - CustomHelpTemplate: helpTemplate, - Name: "resource", - Usage: "(Advanced) Create and update Mutable Resources", - ArgsUsage: "", - Description: "Works with Mutable Resource Updates", - Subcommands: []cli.Command{ - { - Action: resourceCreate, - CustomHelpTemplate: helpTemplate, - Name: "create", - Usage: "creates and publishes a new Mutable Resource manifest", - Description: `creates and publishes a new Mutable Resource manifest pointing to a specified user's updates about a particular topic. - The resource topic can be built in the following ways: - * use --topic to set the topic to an arbitrary binary hex string. - * use --name to set the topic to a human-readable name. - For example --name could be set to "profile-picture", meaning this Mutable Resource allows to get this user's current profile picture. - * use both --topic and --name to create named subtopics. - For example, --topic could be set to an Ethereum contract address and --name could be set to "comments", meaning - the Mutable Resource tracks a discussion about that contract. - The --user flag allows to have this manifest refer to a user other than yourself. If not specified, - it will then default to your local account (--bzzaccount)`, - Flags: []cli.Flag{SwarmResourceNameFlag, SwarmResourceTopicFlag, SwarmResourceUserFlag}, - }, - { - Action: resourceUpdate, - CustomHelpTemplate: helpTemplate, - Name: "update", - Usage: "updates the content of an existing Mutable Resource", - ArgsUsage: "<0x Hex data>", - Description: `publishes a new update on the specified topic - The resource topic can be built in the following ways: - * use --topic to set the topic to an arbitrary binary hex string. - * use --name to set the topic to a human-readable name. - For example --name could be set to "profile-picture", meaning this Mutable Resource allows to get this user's current profile picture. - * use both --topic and --name to create named subtopics. - For example, --topic could be set to an Ethereum contract address and --name could be set to "comments", meaning - the Mutable Resource tracks a discussion about that contract. - - If you have a manifest, you can specify it with --manifest to refer to the resource, - instead of using --topic / --name - `, - Flags: []cli.Flag{SwarmResourceManifestFlag, SwarmResourceNameFlag, SwarmResourceTopicFlag}, - }, - { - Action: resourceInfo, - CustomHelpTemplate: helpTemplate, - Name: "info", - Usage: "obtains information about an existing Mutable Resource", - Description: `obtains information about an existing Mutable Resource - The topic can be specified directly with the --topic flag as an hex string - If no topic is specified, the default topic (zero) will be used - The --name flag can be used to specify subtopics with a specific name. - The --user flag allows to refer to a user other than yourself. If not specified, - it will then default to your local account (--bzzaccount) - If you have a manifest, you can specify it with --manifest instead of --topic / --name / ---user - to refer to the resource`, - Flags: []cli.Flag{SwarmResourceManifestFlag, SwarmResourceNameFlag, SwarmResourceTopicFlag, SwarmResourceUserFlag}, - }, - }, - }, - { - Action: list, - CustomHelpTemplate: helpTemplate, - Name: "ls", - Usage: "list files and directories contained in a manifest", - ArgsUsage: " []", - Description: "Lists files and directories contained in a manifest", - }, - { - Action: hash, - CustomHelpTemplate: helpTemplate, - Name: "hash", - Usage: "print the swarm hash of a file or directory", - ArgsUsage: "", - Description: "Prints the swarm hash of file or directory", - }, - { - Action: download, - Name: "down", - Flags: []cli.Flag{SwarmRecursiveFlag, SwarmAccessPasswordFlag}, - Usage: "downloads a swarm manifest or a file inside a manifest", - ArgsUsage: " []", - Description: `Downloads a swarm bzz uri to the given dir. When no dir is provided, working directory is assumed. --recursive flag is expected when downloading a manifest with multiple entries.`, - }, - { - Name: "manifest", - CustomHelpTemplate: helpTemplate, - Usage: "perform operations on swarm manifests", - ArgsUsage: "COMMAND", - Description: "Updates a MANIFEST by adding/removing/updating the hash of a path.\nCOMMAND could be: add, update, remove", - Subcommands: []cli.Command{ - { - Action: manifestAdd, - CustomHelpTemplate: helpTemplate, - Name: "add", - Usage: "add a new path to the manifest", - ArgsUsage: " ", - Description: "Adds a new path to the manifest", - }, - { - Action: manifestUpdate, - CustomHelpTemplate: helpTemplate, - Name: "update", - Usage: "update the hash for an already existing path in the manifest", - ArgsUsage: " ", - Description: "Update the hash for an already existing path in the manifest", - }, - { - Action: manifestRemove, - CustomHelpTemplate: helpTemplate, - Name: "remove", - Usage: "removes a path from the manifest", - ArgsUsage: " ", - Description: "Removes a path from the manifest", - }, - }, - }, - { - Name: "fs", - CustomHelpTemplate: helpTemplate, - Usage: "perform FUSE operations", - ArgsUsage: "fs COMMAND", - Description: "Performs FUSE operations by mounting/unmounting/listing mount points. This assumes you already have a Swarm node running locally. For all operation you must reference the correct path to bzzd.ipc in order to communicate with the node", - Subcommands: []cli.Command{ - { - Action: mount, - CustomHelpTemplate: helpTemplate, - Name: "mount", - Flags: []cli.Flag{utils.IPCPathFlag}, - Usage: "mount a swarm hash to a mount point", - ArgsUsage: "swarm fs mount --ipcpath ", - Description: "Mounts a Swarm manifest hash to a given mount point. This assumes you already have a Swarm node running locally. You must reference the correct path to your bzzd.ipc file", - }, - { - Action: unmount, - CustomHelpTemplate: helpTemplate, - Name: "unmount", - Flags: []cli.Flag{utils.IPCPathFlag}, - Usage: "unmount a swarmfs mount", - ArgsUsage: "swarm fs unmount --ipcpath ", - Description: "Unmounts a swarmfs mount residing at . This assumes you already have a Swarm node running locally. You must reference the correct path to your bzzd.ipc file", - }, - { - Action: listMounts, - CustomHelpTemplate: helpTemplate, - Name: "list", - Flags: []cli.Flag{utils.IPCPathFlag}, - Usage: "list swarmfs mounts", - ArgsUsage: "swarm fs list --ipcpath ", - Description: "Lists all mounted swarmfs volumes. This assumes you already have a Swarm node running locally. You must reference the correct path to your bzzd.ipc file", - }, - }, - }, - { - Name: "db", - CustomHelpTemplate: helpTemplate, - Usage: "manage the local chunk database", - ArgsUsage: "db COMMAND", - Description: "Manage the local chunk database", - Subcommands: []cli.Command{ - { - Action: dbExport, - CustomHelpTemplate: helpTemplate, - Name: "export", - Usage: "export a local chunk database as a tar archive (use - to send to stdout)", - ArgsUsage: " ", - Description: ` -Export a local chunk database as a tar archive (use - to send to stdout). - - swarm db export ~/.ethereum/swarm/bzz-KEY/chunks chunks.tar - -The export may be quite large, consider piping the output through the Unix -pv(1) tool to get a progress bar: - - swarm db export ~/.ethereum/swarm/bzz-KEY/chunks - | pv > chunks.tar -`, - }, - { - Action: dbImport, - CustomHelpTemplate: helpTemplate, - Name: "import", - Usage: "import chunks from a tar archive into a local chunk database (use - to read from stdin)", - ArgsUsage: " ", - Description: `Import chunks from a tar archive into a local chunk database (use - to read from stdin). - - swarm db import ~/.ethereum/swarm/bzz-KEY/chunks chunks.tar - -The import may be quite large, consider piping the input through the Unix -pv(1) tool to get a progress bar: - - pv chunks.tar | swarm db import ~/.ethereum/swarm/bzz-KEY/chunks -`, - }, - { - Action: dbClean, - CustomHelpTemplate: helpTemplate, - Name: "clean", - Usage: "remove corrupt entries from a local chunk database", - ArgsUsage: "", - Description: "Remove corrupt entries from a local chunk database", - }, - }, - }, - - // See config.go - DumpConfigCommand, - } - - // append a hidden help subcommand to all commands that have subcommands - // if a help command was already defined above, that one will take precedence. - addDefaultHelpSubcommands(app.Commands) - - sort.Sort(cli.CommandsByName(app.Commands)) - - app.Flags = []cli.Flag{ - utils.IdentityFlag, - utils.DataDirFlag, - utils.BootnodesFlag, - utils.KeyStoreDirFlag, - utils.ListenPortFlag, - utils.NoDiscoverFlag, - utils.DiscoveryV5Flag, - utils.NetrestrictFlag, - utils.NodeKeyFileFlag, - utils.NodeKeyHexFlag, - utils.MaxPeersFlag, - utils.NATFlag, - utils.IPCDisabledFlag, - utils.IPCPathFlag, - utils.PasswordFileFlag, - // bzzd-specific flags - CorsStringFlag, - EnsAPIFlag, - SwarmTomlConfigPathFlag, - SwarmSwapEnabledFlag, - SwarmSwapAPIFlag, - SwarmSyncDisabledFlag, - SwarmSyncUpdateDelay, - SwarmMaxStreamPeerServersFlag, - SwarmLightNodeEnabled, - SwarmDeliverySkipCheckFlag, - SwarmListenAddrFlag, - SwarmPortFlag, - SwarmAccountFlag, - SwarmNetworkIdFlag, - ChequebookAddrFlag, - // upload flags - SwarmApiFlag, - SwarmRecursiveFlag, - SwarmWantManifestFlag, - SwarmUploadDefaultPath, - SwarmUpFromStdinFlag, - SwarmUploadMimeType, - // storage flags - SwarmStorePath, - SwarmStoreCapacity, - SwarmStoreCacheCapacity, - } - rpcFlags := []cli.Flag{ - utils.WSEnabledFlag, - utils.WSListenAddrFlag, - utils.WSPortFlag, - utils.WSApiFlag, - utils.WSAllowedOriginsFlag, - } - app.Flags = append(app.Flags, rpcFlags...) - app.Flags = append(app.Flags, debug.Flags...) - app.Flags = append(app.Flags, swarmmetrics.Flags...) - app.Flags = append(app.Flags, tracing.Flags...) - app.Before = func(ctx *cli.Context) error { - runtime.GOMAXPROCS(runtime.NumCPU()) - if err := debug.Setup(ctx, ""); err != nil { - return err - } - swarmmetrics.Setup(ctx) - tracing.Setup(ctx) - return nil - } - app.After = func(ctx *cli.Context) error { - debug.Exit() - return nil - } -} - -func main() { - if err := app.Run(os.Args); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func keys(ctx *cli.Context) error { - privateKey := getPrivKey(ctx) - pub := hex.EncodeToString(crypto.FromECDSAPub(&privateKey.PublicKey)) - pubCompressed := hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)) - if !ctx.Bool(SwarmCompressedFlag.Name) { - fmt.Println(fmt.Sprintf("publicKey=%s", pub)) - } - fmt.Println(fmt.Sprintf("publicKeyCompressed=%s", pubCompressed)) - return nil -} - -func version(ctx *cli.Context) error { - fmt.Println(strings.Title(clientIdentifier)) - fmt.Println("Version:", sv.VersionWithMeta) - if gitCommit != "" { - fmt.Println("Git Commit:", gitCommit) - } - fmt.Println("Go Version:", runtime.Version()) - fmt.Println("OS:", runtime.GOOS) - return nil -} - -func bzzd(ctx *cli.Context) error { - //build a valid bzzapi.Config from all available sources: - //default config, file config, command line and env vars - - bzzconfig, err := buildConfig(ctx) - if err != nil { - utils.Fatalf("unable to configure swarm: %v", err) - } - - cfg := defaultNodeConfig - - //pss operates on ws - cfg.WSModules = append(cfg.WSModules, "pss") - - //geth only supports --datadir via command line - //in order to be consistent within swarm, if we pass --datadir via environment variable - //or via config file, we get the same directory for geth and swarm - if _, err := os.Stat(bzzconfig.Path); err == nil { - cfg.DataDir = bzzconfig.Path - } - - //optionally set the bootnodes before configuring the node - setSwarmBootstrapNodes(ctx, &cfg) - //setup the ethereum node - utils.SetNodeConfig(ctx, &cfg) - stack, err := node.New(&cfg) - if err != nil { - utils.Fatalf("can't create node: %v", err) - } - - //a few steps need to be done after the config phase is completed, - //due to overriding behavior - initSwarmNode(bzzconfig, stack, ctx) - //register BZZ as node.Service in the ethereum node - registerBzzService(bzzconfig, stack) - //start the node - utils.StartNode(stack) - - go func() { - sigc := make(chan os.Signal, 1) - signal.Notify(sigc, syscall.SIGTERM) - defer signal.Stop(sigc) - <-sigc - log.Info("Got sigterm, shutting swarm down...") - stack.Stop() - }() - - stack.Wait() - return nil -} - -func registerBzzService(bzzconfig *bzzapi.Config, stack *node.Node) { - //define the swarm service boot function - boot := func(_ *node.ServiceContext) (node.Service, error) { - // In production, mockStore must be always nil. - return swarm.NewSwarm(bzzconfig, nil) - } - //register within the ethereum node - if err := stack.Register(boot); err != nil { - utils.Fatalf("Failed to register the Swarm service: %v", err) - } -} - -func getAccount(bzzaccount string, ctx *cli.Context, stack *node.Node) *ecdsa.PrivateKey { - //an account is mandatory - if bzzaccount == "" { - utils.Fatalf(SWARM_ERR_NO_BZZACCOUNT) - } - // Try to load the arg as a hex key file. - if key, err := crypto.LoadECDSA(bzzaccount); err == nil { - log.Info("Swarm account key loaded", "address", crypto.PubkeyToAddress(key.PublicKey)) - return key - } - // Otherwise try getting it from the keystore. - am := stack.AccountManager() - ks := am.Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) - - return decryptStoreAccount(ks, bzzaccount, utils.MakePasswordList(ctx)) -} - -// getPrivKey returns the private key of the specified bzzaccount -// Used only by client commands, such as `resource` -func getPrivKey(ctx *cli.Context) *ecdsa.PrivateKey { - // booting up the swarm node just as we do in bzzd action - bzzconfig, err := buildConfig(ctx) - if err != nil { - utils.Fatalf("unable to configure swarm: %v", err) - } - cfg := defaultNodeConfig - if _, err := os.Stat(bzzconfig.Path); err == nil { - cfg.DataDir = bzzconfig.Path - } - utils.SetNodeConfig(ctx, &cfg) - stack, err := node.New(&cfg) - if err != nil { - utils.Fatalf("can't create node: %v", err) - } - return getAccount(bzzconfig.BzzAccount, ctx, stack) -} - -func decryptStoreAccount(ks *keystore.KeyStore, account string, passwords []string) *ecdsa.PrivateKey { - var a accounts.Account - var err error - if common.IsHexAddress(account) { - a, err = ks.Find(accounts.Account{Address: common.HexToAddress(account)}) - } else if ix, ixerr := strconv.Atoi(account); ixerr == nil && ix > 0 { - if accounts := ks.Accounts(); len(accounts) > ix { - a = accounts[ix] - } else { - err = fmt.Errorf("index %d higher than number of accounts %d", ix, len(accounts)) - } - } else { - utils.Fatalf("Can't find swarm account key %s", account) - } - if err != nil { - utils.Fatalf("Can't find swarm account key: %v - Is the provided bzzaccount(%s) from the right datadir/Path?", err, account) - } - keyjson, err := ioutil.ReadFile(a.URL.Path) - if err != nil { - utils.Fatalf("Can't load swarm account key: %v", err) - } - for i := 0; i < 3; i++ { - password := getPassPhrase(fmt.Sprintf("Unlocking swarm account %s [%d/3]", a.Address.Hex(), i+1), i, passwords) - key, err := keystore.DecryptKey(keyjson, password) - if err == nil { - return key.PrivateKey - } - } - utils.Fatalf("Can't decrypt swarm account key") - return nil -} - -// getPassPhrase retrieves the password associated with bzz account, either by fetching -// from a list of pre-loaded passwords, or by requesting it interactively from user. -func getPassPhrase(prompt string, i int, passwords []string) string { - // non-interactive - if len(passwords) > 0 { - if i < len(passwords) { - return passwords[i] - } - return passwords[len(passwords)-1] - } - - // fallback to interactive mode - if prompt != "" { - fmt.Println(prompt) - } - password, err := console.Stdin.PromptPassword("Passphrase: ") - if err != nil { - utils.Fatalf("Failed to read passphrase: %v", err) - } - return password -} - -// addDefaultHelpSubcommand scans through defined CLI commands and adds -// a basic help subcommand to each -// if a help command is already defined, it will take precedence over the default. -func addDefaultHelpSubcommands(commands []cli.Command) { - for i := range commands { - cmd := &commands[i] - if cmd.Subcommands != nil { - cmd.Subcommands = append(cmd.Subcommands, defaultSubcommandHelp) - addDefaultHelpSubcommands(cmd.Subcommands) - } - } -} - -func setSwarmBootstrapNodes(ctx *cli.Context, cfg *node.Config) { - if ctx.GlobalIsSet(utils.BootnodesFlag.Name) || ctx.GlobalIsSet(utils.BootnodesV4Flag.Name) { - return - } - - cfg.P2P.BootstrapNodes = []*enode.Node{} - - for _, url := range SwarmBootnodes { - node, err := enode.ParseV4(url) - if err != nil { - log.Error("Bootstrap URL invalid", "enode", url, "err", err) - } - cfg.P2P.BootstrapNodes = append(cfg.P2P.BootstrapNodes, node) - } - log.Debug("added default swarm bootnodes", "length", len(cfg.P2P.BootstrapNodes)) -} diff --git a/cmd/swarm/manifest.go b/cmd/swarm/manifest.go deleted file mode 100644 index 0216ffc1dd70..000000000000 --- a/cmd/swarm/manifest.go +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -// Command MANIFEST update -package main - -import ( - "fmt" - "os" - "strings" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/swarm/api" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "gopkg.in/urfave/cli.v1" -) - -// manifestAdd adds a new entry to the manifest at the given path. -// New entry hash, the last argument, must be the hash of a manifest -// with only one entry, which meta-data will be added to the original manifest. -// On success, this function will print new (updated) manifest's hash. -func manifestAdd(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 3 { - utils.Fatalf("Need exactly three arguments ") - } - - var ( - mhash = args[0] - path = args[1] - hash = args[2] - ) - - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := swarm.NewClient(bzzapi) - - m, _, err := client.DownloadManifest(hash) - if err != nil { - utils.Fatalf("Error downloading manifest to add: %v", err) - } - l := len(m.Entries) - if l == 0 { - utils.Fatalf("No entries in manifest %s", hash) - } else if l > 1 { - utils.Fatalf("Too many entries in manifest %s", hash) - } - - newManifest := addEntryToManifest(client, mhash, path, m.Entries[0]) - fmt.Println(newManifest) -} - -// manifestUpdate replaces an existing entry of the manifest at the given path. -// New entry hash, the last argument, must be the hash of a manifest -// with only one entry, which meta-data will be added to the original manifest. -// On success, this function will print hash of the updated manifest. -func manifestUpdate(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 3 { - utils.Fatalf("Need exactly three arguments ") - } - - var ( - mhash = args[0] - path = args[1] - hash = args[2] - ) - - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := swarm.NewClient(bzzapi) - - m, _, err := client.DownloadManifest(hash) - if err != nil { - utils.Fatalf("Error downloading manifest to update: %v", err) - } - l := len(m.Entries) - if l == 0 { - utils.Fatalf("No entries in manifest %s", hash) - } else if l > 1 { - utils.Fatalf("Too many entries in manifest %s", hash) - } - - newManifest, _, defaultEntryUpdated := updateEntryInManifest(client, mhash, path, m.Entries[0], true) - if defaultEntryUpdated { - // Print informational message to stderr - // allowing the user to get the new manifest hash from stdout - // without the need to parse the complete output. - fmt.Fprintln(os.Stderr, "Manifest default entry is updated, too") - } - fmt.Println(newManifest) -} - -// manifestRemove removes an existing entry of the manifest at the given path. -// On success, this function will print hash of the manifest which does not -// contain the path. -func manifestRemove(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 2 { - utils.Fatalf("Need exactly two arguments ") - } - - var ( - mhash = args[0] - path = args[1] - ) - - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := swarm.NewClient(bzzapi) - - newManifest := removeEntryFromManifest(client, mhash, path) - fmt.Println(newManifest) -} - -func addEntryToManifest(client *swarm.Client, mhash, path string, entry api.ManifestEntry) string { - var longestPathEntry = api.ManifestEntry{} - - mroot, isEncrypted, err := client.DownloadManifest(mhash) - if err != nil { - utils.Fatalf("Manifest download failed: %v", err) - } - - // See if we path is in this Manifest or do we have to dig deeper - for _, e := range mroot.Entries { - if path == e.Path { - utils.Fatalf("Path %s already present, not adding anything", path) - } else { - if e.ContentType == api.ManifestType { - prfxlen := strings.HasPrefix(path, e.Path) - if prfxlen && len(path) > len(longestPathEntry.Path) { - longestPathEntry = e - } - } - } - } - - if longestPathEntry.Path != "" { - // Load the child Manifest add the entry there - newPath := path[len(longestPathEntry.Path):] - newHash := addEntryToManifest(client, longestPathEntry.Hash, newPath, entry) - - // Replace the hash for parent Manifests - newMRoot := &api.Manifest{} - for _, e := range mroot.Entries { - if longestPathEntry.Path == e.Path { - e.Hash = newHash - } - newMRoot.Entries = append(newMRoot.Entries, e) - } - mroot = newMRoot - } else { - // Add the entry in the leaf Manifest - entry.Path = path - mroot.Entries = append(mroot.Entries, entry) - } - - newManifestHash, err := client.UploadManifest(mroot, isEncrypted) - if err != nil { - utils.Fatalf("Manifest upload failed: %v", err) - } - return newManifestHash -} - -// updateEntryInManifest updates an existing entry o path with a new one in the manifest with provided mhash -// finding the path recursively through all nested manifests. Argument isRoot is used for default -// entry update detection. If the updated entry has the same hash as the default entry, then the -// default entry in root manifest will be updated too. -// Returned values are the new manifest hash, hash of the entry that was replaced by the new entry and -// a a bool that is true if default entry is updated. -func updateEntryInManifest(client *swarm.Client, mhash, path string, entry api.ManifestEntry, isRoot bool) (newManifestHash, oldHash string, defaultEntryUpdated bool) { - var ( - newEntry = api.ManifestEntry{} - longestPathEntry = api.ManifestEntry{} - ) - - mroot, isEncrypted, err := client.DownloadManifest(mhash) - if err != nil { - utils.Fatalf("Manifest download failed: %v", err) - } - - // See if we path is in this Manifest or do we have to dig deeper - for _, e := range mroot.Entries { - if path == e.Path { - newEntry = e - // keep the reference of the hash of the entry that should be replaced - // for default entry detection - oldHash = e.Hash - } else { - if e.ContentType == api.ManifestType { - prfxlen := strings.HasPrefix(path, e.Path) - if prfxlen && len(path) > len(longestPathEntry.Path) { - longestPathEntry = e - } - } - } - } - - if longestPathEntry.Path == "" && newEntry.Path == "" { - utils.Fatalf("Path %s not present in the Manifest, not setting anything", path) - } - - if longestPathEntry.Path != "" { - // Load the child Manifest add the entry there - newPath := path[len(longestPathEntry.Path):] - var newHash string - newHash, oldHash, _ = updateEntryInManifest(client, longestPathEntry.Hash, newPath, entry, false) - - // Replace the hash for parent Manifests - newMRoot := &api.Manifest{} - for _, e := range mroot.Entries { - if longestPathEntry.Path == e.Path { - e.Hash = newHash - } - newMRoot.Entries = append(newMRoot.Entries, e) - - } - mroot = newMRoot - } - - // update the manifest if the new entry is found and - // check if default entry should be updated - if newEntry.Path != "" || isRoot { - // Replace the hash for leaf Manifest - newMRoot := &api.Manifest{} - for _, e := range mroot.Entries { - if newEntry.Path == e.Path { - entry.Path = e.Path - newMRoot.Entries = append(newMRoot.Entries, entry) - } else if isRoot && e.Path == "" && e.Hash == oldHash { - entry.Path = e.Path - newMRoot.Entries = append(newMRoot.Entries, entry) - defaultEntryUpdated = true - } else { - newMRoot.Entries = append(newMRoot.Entries, e) - } - } - mroot = newMRoot - } - - newManifestHash, err = client.UploadManifest(mroot, isEncrypted) - if err != nil { - utils.Fatalf("Manifest upload failed: %v", err) - } - return newManifestHash, oldHash, defaultEntryUpdated -} - -func removeEntryFromManifest(client *swarm.Client, mhash, path string) string { - var ( - entryToRemove = api.ManifestEntry{} - longestPathEntry = api.ManifestEntry{} - ) - - mroot, isEncrypted, err := client.DownloadManifest(mhash) - if err != nil { - utils.Fatalf("Manifest download failed: %v", err) - } - - // See if we path is in this Manifest or do we have to dig deeper - for _, entry := range mroot.Entries { - if path == entry.Path { - entryToRemove = entry - } else { - if entry.ContentType == api.ManifestType { - prfxlen := strings.HasPrefix(path, entry.Path) - if prfxlen && len(path) > len(longestPathEntry.Path) { - longestPathEntry = entry - } - } - } - } - - if longestPathEntry.Path == "" && entryToRemove.Path == "" { - utils.Fatalf("Path %s not present in the Manifest, not removing anything", path) - } - - if longestPathEntry.Path != "" { - // Load the child Manifest remove the entry there - newPath := path[len(longestPathEntry.Path):] - newHash := removeEntryFromManifest(client, longestPathEntry.Hash, newPath) - - // Replace the hash for parent Manifests - newMRoot := &api.Manifest{} - for _, entry := range mroot.Entries { - if longestPathEntry.Path == entry.Path { - entry.Hash = newHash - } - newMRoot.Entries = append(newMRoot.Entries, entry) - } - mroot = newMRoot - } - - if entryToRemove.Path != "" { - // remove the entry in this Manifest - newMRoot := &api.Manifest{} - for _, entry := range mroot.Entries { - if entryToRemove.Path != entry.Path { - newMRoot.Entries = append(newMRoot.Entries, entry) - } - } - mroot = newMRoot - } - - newManifestHash, err := client.UploadManifest(mroot, isEncrypted) - if err != nil { - utils.Fatalf("Manifest upload failed: %v", err) - } - return newManifestHash -} diff --git a/cmd/swarm/manifest_test.go b/cmd/swarm/manifest_test.go deleted file mode 100644 index 08fe0b2eb7ab..000000000000 --- a/cmd/swarm/manifest_test.go +++ /dev/null @@ -1,579 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/ethereum/go-ethereum/swarm/api" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" -) - -// TestManifestChange tests manifest add, update and remove -// cli commands without encryption. -func TestManifestChange(t *testing.T) { - testManifestChange(t, false) -} - -// TestManifestChange tests manifest add, update and remove -// cli commands with encryption enabled. -func TestManifestChangeEncrypted(t *testing.T) { - testManifestChange(t, true) -} - -// testManifestChange performs cli commands: -// - manifest add -// - manifest update -// - manifest remove -// on a manifest, testing the functionality of this -// comands on paths that are in root manifest or a nested one. -// Argument encrypt controls whether to use encryption or not. -func testManifestChange(t *testing.T, encrypt bool) { - t.Parallel() - cluster := newTestCluster(t, 1) - defer cluster.Shutdown() - - tmp, err := ioutil.TempDir("", "swarm-manifest-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - origDir := filepath.Join(tmp, "orig") - if err := os.Mkdir(origDir, 0777); err != nil { - t.Fatal(err) - } - - indexDataFilename := filepath.Join(origDir, "index.html") - err = ioutil.WriteFile(indexDataFilename, []byte("

Test

"), 0666) - if err != nil { - t.Fatal(err) - } - // Files paths robots.txt and robots.html share the same prefix "robots." - // which will result a manifest with a nested manifest under path "robots.". - // This will allow testing manifest changes on both root and nested manifest. - err = ioutil.WriteFile(filepath.Join(origDir, "robots.txt"), []byte("Disallow: /"), 0666) - if err != nil { - t.Fatal(err) - } - err = ioutil.WriteFile(filepath.Join(origDir, "robots.html"), []byte("No Robots Allowed"), 0666) - if err != nil { - t.Fatal(err) - } - err = ioutil.WriteFile(filepath.Join(origDir, "mutants.txt"), []byte("Frank\nMarcus"), 0666) - if err != nil { - t.Fatal(err) - } - - args := []string{ - "--bzzapi", - cluster.Nodes[0].URL, - "--recursive", - "--defaultpath", - indexDataFilename, - "up", - origDir, - } - if encrypt { - args = append(args, "--encrypt") - } - - origManifestHash := runSwarmExpectHash(t, args...) - - checkHashLength(t, origManifestHash, encrypt) - - client := swarm.NewClient(cluster.Nodes[0].URL) - - // upload a new file and use its manifest to add it the original manifest. - t.Run("add", func(t *testing.T) { - humansData := []byte("Ann\nBob") - humansDataFilename := filepath.Join(tmp, "humans.txt") - err = ioutil.WriteFile(humansDataFilename, humansData, 0666) - if err != nil { - t.Fatal(err) - } - - humansManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - humansDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "manifest", - "add", - origManifestHash, - "humans.txt", - humansManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - for _, e := range newManifest.Entries { - if e.Path == "humans.txt" { - found = true - if e.Size != int64(len(humansData)) { - t.Errorf("expected humans.txt size %v, got %v", len(humansData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for humans.txt") - } - ct := "text/plain; charset=utf-8" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break - } - } - if !found { - t.Fatal("no humans.txt in new manifest") - } - - checkFile(t, client, newManifestHash, "humans.txt", humansData) - }) - - // upload a new file and use its manifest to add it the original manifest, - // but ensure that the file will be in the nested manifest of the original one. - t.Run("add nested", func(t *testing.T) { - robotsData := []byte(`{"disallow": "/"}`) - robotsDataFilename := filepath.Join(tmp, "robots.json") - err = ioutil.WriteFile(robotsDataFilename, robotsData, 0666) - if err != nil { - t.Fatal(err) - } - - robotsManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - robotsDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "manifest", - "add", - origManifestHash, - "robots.json", - robotsManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - loop: - for _, e := range newManifest.Entries { - if e.Path == "robots." { - nestedManifest := downloadManifest(t, client, e.Hash, encrypt) - for _, e := range nestedManifest.Entries { - if e.Path == "json" { - found = true - if e.Size != int64(len(robotsData)) { - t.Errorf("expected robots.json size %v, got %v", len(robotsData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for robots.json") - } - ct := "application/json" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break loop - } - } - } - } - if !found { - t.Fatal("no robots.json in new manifest") - } - - checkFile(t, client, newManifestHash, "robots.json", robotsData) - }) - - // upload a new file and use its manifest to change the file it the original manifest. - t.Run("update", func(t *testing.T) { - indexData := []byte("

Ethereum Swarm

") - indexDataFilename := filepath.Join(tmp, "index.html") - err = ioutil.WriteFile(indexDataFilename, indexData, 0666) - if err != nil { - t.Fatal(err) - } - - indexManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - indexDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "manifest", - "update", - origManifestHash, - "index.html", - indexManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - for _, e := range newManifest.Entries { - if e.Path == "index.html" { - found = true - if e.Size != int64(len(indexData)) { - t.Errorf("expected index.html size %v, got %v", len(indexData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for index.html") - } - ct := "text/html; charset=utf-8" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break - } - } - if !found { - t.Fatal("no index.html in new manifest") - } - - checkFile(t, client, newManifestHash, "index.html", indexData) - - // check default entry change - checkFile(t, client, newManifestHash, "", indexData) - }) - - // upload a new file and use its manifest to change the file it the original manifest, - // but ensure that the file is in the nested manifest of the original one. - t.Run("update nested", func(t *testing.T) { - robotsData := []byte(`Only humans allowed!!!`) - robotsDataFilename := filepath.Join(tmp, "robots.html") - err = ioutil.WriteFile(robotsDataFilename, robotsData, 0666) - if err != nil { - t.Fatal(err) - } - - humansManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - robotsDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "manifest", - "update", - origManifestHash, - "robots.html", - humansManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - loop: - for _, e := range newManifest.Entries { - if e.Path == "robots." { - nestedManifest := downloadManifest(t, client, e.Hash, encrypt) - for _, e := range nestedManifest.Entries { - if e.Path == "html" { - found = true - if e.Size != int64(len(robotsData)) { - t.Errorf("expected robots.html size %v, got %v", len(robotsData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for robots.html") - } - ct := "text/html; charset=utf-8" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break loop - } - } - } - } - if !found { - t.Fatal("no robots.html in new manifest") - } - - checkFile(t, client, newManifestHash, "robots.html", robotsData) - }) - - // remove a file from the manifest. - t.Run("remove", func(t *testing.T) { - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "manifest", - "remove", - origManifestHash, - "mutants.txt", - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - for _, e := range newManifest.Entries { - if e.Path == "mutants.txt" { - found = true - break - } - } - if found { - t.Fatal("mutants.txt is not removed") - } - }) - - // remove a file from the manifest, but ensure that the file is in - // the nested manifest of the original one. - t.Run("remove nested", func(t *testing.T) { - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "manifest", - "remove", - origManifestHash, - "robots.html", - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - loop: - for _, e := range newManifest.Entries { - if e.Path == "robots." { - nestedManifest := downloadManifest(t, client, e.Hash, encrypt) - for _, e := range nestedManifest.Entries { - if e.Path == "html" { - found = true - break loop - } - } - } - } - if found { - t.Fatal("robots.html in not removed") - } - }) -} - -// TestNestedDefaultEntryUpdate tests if the default entry is updated -// if the file in nested manifest used for it is also updated. -func TestNestedDefaultEntryUpdate(t *testing.T) { - testNestedDefaultEntryUpdate(t, false) -} - -// TestNestedDefaultEntryUpdateEncrypted tests if the default entry -// of encrypted upload is updated if the file in nested manifest -// used for it is also updated. -func TestNestedDefaultEntryUpdateEncrypted(t *testing.T) { - testNestedDefaultEntryUpdate(t, true) -} - -func testNestedDefaultEntryUpdate(t *testing.T, encrypt bool) { - t.Parallel() - cluster := newTestCluster(t, 1) - defer cluster.Shutdown() - - tmp, err := ioutil.TempDir("", "swarm-manifest-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - origDir := filepath.Join(tmp, "orig") - if err := os.Mkdir(origDir, 0777); err != nil { - t.Fatal(err) - } - - indexData := []byte("

Test

") - indexDataFilename := filepath.Join(origDir, "index.html") - err = ioutil.WriteFile(indexDataFilename, indexData, 0666) - if err != nil { - t.Fatal(err) - } - // Add another file with common prefix as the default entry to test updates of - // default entry with nested manifests. - err = ioutil.WriteFile(filepath.Join(origDir, "index.txt"), []byte("Test"), 0666) - if err != nil { - t.Fatal(err) - } - - args := []string{ - "--bzzapi", - cluster.Nodes[0].URL, - "--recursive", - "--defaultpath", - indexDataFilename, - "up", - origDir, - } - if encrypt { - args = append(args, "--encrypt") - } - - origManifestHash := runSwarmExpectHash(t, args...) - - checkHashLength(t, origManifestHash, encrypt) - - client := swarm.NewClient(cluster.Nodes[0].URL) - - newIndexData := []byte("

Ethereum Swarm

") - newIndexDataFilename := filepath.Join(tmp, "index.html") - err = ioutil.WriteFile(newIndexDataFilename, newIndexData, 0666) - if err != nil { - t.Fatal(err) - } - - newIndexManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - newIndexDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - cluster.Nodes[0].URL, - "manifest", - "update", - origManifestHash, - "index.html", - newIndexManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - for _, e := range newManifest.Entries { - if e.Path == "index." { - found = true - newManifest = downloadManifest(t, client, e.Hash, encrypt) - break - } - } - if !found { - t.Fatal("no index. path in new manifest") - } - - found = false - for _, e := range newManifest.Entries { - if e.Path == "html" { - found = true - if e.Size != int64(len(newIndexData)) { - t.Errorf("expected index.html size %v, got %v", len(newIndexData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for index.html") - } - ct := "text/html; charset=utf-8" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break - } - } - if !found { - t.Fatal("no html in new manifest") - } - - checkFile(t, client, newManifestHash, "index.html", newIndexData) - - // check default entry change - checkFile(t, client, newManifestHash, "", newIndexData) -} - -func runSwarmExpectHash(t *testing.T, args ...string) (hash string) { - t.Helper() - hashRegexp := `[a-f\d]{64,128}` - up := runSwarm(t, args...) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - - if len(matches) < 1 { - t.Fatal("no matches found") - } - return matches[0] -} - -func checkHashLength(t *testing.T, hash string, encrypted bool) { - t.Helper() - l := len(hash) - if encrypted && l != 128 { - t.Errorf("expected hash length 128, got %v", l) - } - if !encrypted && l != 64 { - t.Errorf("expected hash length 64, got %v", l) - } -} - -func downloadManifest(t *testing.T, client *swarm.Client, hash string, encrypted bool) (manifest *api.Manifest) { - t.Helper() - m, isEncrypted, err := client.DownloadManifest(hash) - if err != nil { - t.Fatal(err) - } - - if encrypted != isEncrypted { - t.Error("new manifest encryption flag is not correct") - } - return m -} - -func checkFile(t *testing.T, client *swarm.Client, hash, path string, expected []byte) { - t.Helper() - f, err := client.Download(hash, path) - if err != nil { - t.Fatal(err) - } - - got, err := ioutil.ReadAll(f) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(got, expected) { - t.Errorf("expected file content %q, got %q", expected, got) - } -} diff --git a/cmd/swarm/mimegen/generator.go b/cmd/swarm/mimegen/generator.go deleted file mode 100644 index 68f9e306e5ac..000000000000 --- a/cmd/swarm/mimegen/generator.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . -package main - -// Standard "mime" package rely on system-settings, see mime.osInitMime -// Swarm will run on many OS/Platform/Docker and must behave similar -// This command generates code to add common mime types based on mime.types file -// -// mime.types file provided by mailcap, which follow https://www.iana.org/assignments/media-types/media-types.xhtml -// -// Get last version of mime.types file by: -// docker run --rm -v $(pwd):/tmp alpine:edge /bin/sh -c "apk add -U mailcap; mv /etc/mime.types /tmp" - -import ( - "bufio" - "bytes" - "flag" - "html/template" - "io/ioutil" - "strings" - - "log" -) - -var ( - typesFlag = flag.String("types", "", "Input mime.types file") - packageFlag = flag.String("package", "", "Golang package in output file") - outFlag = flag.String("out", "", "Output file name for the generated mime types") -) - -type mime struct { - Name string - Exts []string -} - -type templateParams struct { - PackageName string - Mimes []mime -} - -func main() { - // Parse and ensure all needed inputs are specified - flag.Parse() - if *typesFlag == "" { - log.Fatalf("--types is required") - } - if *packageFlag == "" { - log.Fatalf("--types is required") - } - if *outFlag == "" { - log.Fatalf("--out is required") - } - - params := templateParams{ - PackageName: *packageFlag, - } - - types, err := ioutil.ReadFile(*typesFlag) - if err != nil { - log.Fatal(err) - } - - scanner := bufio.NewScanner(bytes.NewReader(types)) - for scanner.Scan() { - txt := scanner.Text() - if strings.HasPrefix(txt, "#") || len(txt) == 0 { - continue - } - parts := strings.Fields(txt) - if len(parts) == 1 { - continue - } - params.Mimes = append(params.Mimes, mime{parts[0], parts[1:]}) - } - - if err = scanner.Err(); err != nil { - log.Fatal(err) - } - - result := bytes.NewBuffer([]byte{}) - - if err := template.Must(template.New("_").Parse(tpl)).Execute(result, params); err != nil { - log.Fatal(err) - } - - if err := ioutil.WriteFile(*outFlag, result.Bytes(), 0600); err != nil { - log.Fatal(err) - } -} - -var tpl = `// Code generated by github.com/ethereum/go-ethereum/cmd/swarm/mimegen. DO NOT EDIT. - -package {{ .PackageName }} - -import "mime" -func init() { - var mimeTypes = map[string]string{ -{{- range .Mimes -}} - {{ $name := .Name -}} - {{- range .Exts }} - ".{{ . }}": "{{ $name | html }}", - {{- end }} -{{- end }} - } - for ext, name := range mimeTypes { - if err := mime.AddExtensionType(ext, name); err != nil { - panic(err) - } - } -} -` diff --git a/cmd/swarm/mimegen/mime.types b/cmd/swarm/mimegen/mime.types deleted file mode 100644 index 1bdf211490d9..000000000000 --- a/cmd/swarm/mimegen/mime.types +++ /dev/null @@ -1,1828 +0,0 @@ -# This is a comment. I love comments. -*- indent-tabs-mode: t -*- - -# This file controls what Internet media types are sent to the client for -# given file extension(s). Sending the correct media type to the client -# is important so they know how to handle the content of the file. -# Extra types can either be added here or by using an AddType directive -# in your config files. For more information about Internet media types, -# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type -# registry is at . - -# IANA types - -# MIME type Extensions -application/1d-interleaved-parityfec -application/3gpdash-qoe-report+xml -application/3gpp-ims+xml -application/A2L a2l -application/activemessage -application/alto-costmap+json -application/alto-costmapfilter+json -application/alto-directory+json -application/alto-endpointcost+json -application/alto-endpointcostparams+json -application/alto-endpointprop+json -application/alto-endpointpropparams+json -application/alto-error+json -application/alto-networkmap+json -application/alto-networkmapfilter+json -application/AML aml -application/andrew-inset ez -application/applefile -application/ATF atf -application/ATFX atfx -application/ATXML atxml -application/atom+xml atom -application/atomcat+xml atomcat -application/atomdeleted+xml atomdeleted -application/atomicmail -application/atomsvc+xml atomsvc -application/auth-policy+xml apxml -application/bacnet-xdd+zip xdd -application/batch-SMTP -application/beep+xml -application/calendar+json -application/calendar+xml xcs -application/call-completion -application/cals-1840 -application/cbor cbor -application/ccmp+xml ccmp -application/ccxml+xml ccxml -application/CDFX+XML cdfx -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -application/cdni -application/CEA cea -application/cea-2018+xml -application/cellml+xml cellml cml -application/cfw -application/clue_info+xml clue -application/cms cmsc -application/cnrp+xml -application/coap-group+json -application/coap-payload -application/commonground -application/conference-info+xml -application/cpl+xml cpl -application/cose -application/cose-key -application/cose-key-set -application/csrattrs csrattrs -application/csta+xml -application/CSTAdata+xml -application/csvm+json -application/cybercash -application/dash+xml mpd -application/dashdelta mpdd -application/davmount+xml davmount -application/dca-rft -application/DCD dcd -application/dec-dx -application/dialog-info+xml -application/dicom dcm -application/dicom+json -application/dicom+xml -application/DII dii -application/DIT dit -application/dns -application/dskpp+xml xmls -application/dssc+der dssc -application/dssc+xml xdssc -application/dvcs dvc -application/ecmascript es -application/EDI-Consent -application/EDI-X12 -application/EDIFACT -application/efi efi -application/EmergencyCallData.Comment+xml -application/EmergencyCallData.Control+xml -application/EmergencyCallData.DeviceInfo+xml -application/EmergencyCallData.eCall.MSD -application/EmergencyCallData.ProviderInfo+xml -application/EmergencyCallData.ServiceInfo+xml -application/EmergencyCallData.SubscriberInfo+xml -application/EmergencyCallData.VEDS+xml -application/emma+xml emma -application/emotionml+xml emotionml -application/encaprtp -application/epp+xml -application/epub+zip epub -application/eshop -application/exi exi -application/fastinfoset finf -application/fastsoap -application/fdt+xml fdt -# fits, fit, fts: image/fits -application/fits -# application/font-sfnt deprecated in favor of font/sfnt -application/font-tdpfr pfr -# application/font-woff deprecated in favor of font/woff -application/framework-attributes+xml -application/geo+json geojson -application/geo+json-seq -application/gml+xml gml -application/gzip gz tgz -application/H224 -application/held+xml -application/http -application/hyperstudio stk -application/ibe-key-request+xml -application/ibe-pkg-reply+xml -application/ibe-pp-data -application/iges -application/im-iscomposing+xml -application/index -application/index.cmd -application/index.obj -application/index.response -application/index.vnd -application/inkml+xml ink inkml -application/iotp -application/ipfix ipfix -application/ipp -application/isup -application/its+xml its -application/javascript js -application/jose -application/jose+json -application/jrd+json jrd -application/json json -application/json-patch+json json-patch -application/json-seq -application/jwk+json -application/jwk-set+json -application/jwt -application/kpml-request+xml -application/kpml-response+xml -application/ld+json jsonld -application/lgr+xml lgr -application/link-format wlnk -application/load-control+xml -application/lost+xml lostxml -application/lostsync+xml lostsyncxml -application/LXF lxf -application/mac-binhex40 hqx -application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica nb ma mb -application/mathml-content+xml -application/mathml-presentation+xml -application/mathml+xml mml -application/mbms-associated-procedure-description+xml -application/mbms-deregister+xml -application/mbms-envelope+xml -application/mbms-msk-response+xml -application/mbms-msk+xml -application/mbms-protection-description+xml -application/mbms-reception-report+xml -application/mbms-register-response+xml -application/mbms-register+xml -application/mbms-schedule+xml -application/mbms-user-service-description+xml -application/mbox mbox -application/media_control+xml -# mpf: text/vnd.ms-mediapackage -application/media-policy-dataset+xml -application/mediaservercontrol+xml -application/merge-patch+json -application/metalink4+xml meta4 -application/mets+xml mets -application/MF4 mf4 -application/mikey -application/mods+xml mods -application/moss-keys -application/moss-signature -application/mosskey-data -application/mosskey-request -application/mp21 m21 mp21 -# mp4, mpg4: video/mp4, see RFC 4337 -application/mp4 -application/mpeg4-generic -application/mpeg4-iod -application/mpeg4-iod-xmt -# xdf: application/xcap-diff+xml -application/mrb-consumer+xml -application/mrb-publish+xml -application/msc-ivr+xml -application/msc-mixer+xml -application/msword doc -application/mud+json -application/mxf mxf -application/n-quads nq -application/n-triples nt -application/nasdata -application/news-checkgroups -application/news-groupinfo -application/news-transmission -application/nlsml+xml -application/nss -application/ocsp-request orq -application/ocsp-response ors -application/octet-stream bin lha lzh exe class so dll img iso -application/oda oda -application/ODX odx -application/oebps-package+xml opf -application/ogg ogx -application/oxps oxps -application/p2p-overlay+xml relo -application/parityfec -# xer: application/xcap-error+xml -application/patch-ops-error+xml -application/pdf pdf -application/PDX pdx -application/pgp-encrypted pgp -application/pgp-keys -application/pgp-signature sig -application/pidf-diff+xml -application/pidf+xml -application/pkcs10 p10 -application/pkcs12 p12 pfx -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -# ac: application/vnd.nokia.n-gage.ac+xml -application/pkix-attr-cert -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -application/poc-settings+xml -application/postscript ps eps ai -application/ppsp-tracker+json -application/problem+json -application/problem+xml -application/provenance+xml provx -application/prs.alvestrand.titrax-sheet -application/prs.cww cw cww -application/prs.hpub+zip hpub -application/prs.nprend rnd rct -application/prs.plucker -application/prs.rdf-xml-crypt rdf-crypt -application/prs.xsf+xml xsf -application/pskc+xml pskcxml -application/qsig -application/raptorfec -application/rdap+json -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -application/remote-printing -application/reputon+json -application/resource-lists-diff+xml rld -application/resource-lists+xml rl -application/rfc+xml rfcxml -application/riscos -application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-publication -application/rpki-roa roa -application/rpki-updown -application/rtf rtf -application/rtploopback -application/rtx -application/samlassertion+xml -application/samlmetadata+xml -application/sbml+xml -application/scaip+xml -# scm: application/vnd.lotus-screencam -application/scim+json scim -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -application/sep+xml -application/sep-exi -application/session-info -application/set-payment -application/set-payment-initiation -application/set-registration -application/set-registration-initiation -application/sgml -application/sgml-open-catalog soc -application/shf+xml shf -application/sieve siv sieve -application/simple-filter+xml cl -application/simple-message-summary -application/simpleSymbolContainer -application/slate -# application/smil obsoleted by application/smil+xml -application/smil+xml smil smi sml -application/smpte336m -application/soap+fastinfoset -application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -application/spirits-event+xml -application/sql sql -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssml+xml ssml -application/tamp-apex-update tau -application/tamp-apex-update-confirm auc -application/tamp-community-update tcu -application/tamp-community-update-confirm cuc -application/tamp-error ter -application/tamp-sequence-adjust tsa -application/tamp-sequence-adjust-confirm sac -# tsq: application/timestamp-query -application/tamp-status-query -# tsr: application/timestamp-reply -application/tamp-status-response -application/tamp-update tur -application/tamp-update-confirm tuc -application/tei+xml tei teiCorpus odd -application/thraud+xml tfi -application/timestamp-query tsq -application/timestamp-reply tsr -application/timestamped-data tsd -application/trig trig -application/ttml+xml ttml -application/tve-trigger -application/ulpfec -application/urc-grpsheet+xml gsheet -application/urc-ressheet+xml rsheet -application/urc-targetdesc+xml td -application/urc-uisocketdesc+xml uis -application/vcard+json -application/vcard+xml -application/vemmi -application/vnd.3gpp.access-transfer-events+xml -application/vnd.3gpp.bsf+xml -application/vnd.3gpp.mid-call+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -application/vnd.3gpp-prose+xml -application/vnd.3gpp-prose-pc3ch+xml -# sms: application/vnd.3gpp2.sms -application/vnd.3gpp.sms -application/vnd.3gpp.sms+xml -application/vnd.3gpp.srvcc-ext+xml -application/vnd.3gpp.SRVCC-info+xml -application/vnd.3gpp.state-and-event-info+xml -application/vnd.3gpp.ussd+xml -application/vnd.3gpp2.bcmcsinfo+xml -application/vnd.3gpp2.sms sms -application/vnd.3gpp2.tcap tcap -application/vnd.3lightssoftware.imagescal imgcal -application/vnd.3M.Post-it-Notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.flash.movie swf -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -application/vnd.aether.imp -application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.mobi8-ebook azw3 -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -application/vnd.amundsen.maze+xml -application/vnd.anki apkg -application/vnd.anser-web-certificate-issue-initiation cii -# Not in IANA listing, but is on FTP site? -application/vnd.anser-web-funds-transfer-initiation fti -# atx: audio/ATRAC-X -application/vnd.antix.game-component -application/vnd.apache.thrift.binary -application/vnd.apache.thrift.compact -application/vnd.apache.thrift.json -application/vnd.api+json -application/vnd.apothekende.reservation+json -application/vnd.apple.installer+xml dist distz pkg mpkg -# m3u: audio/x-mpegurl for now -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi obsoleted by application/vnd.aristanetworks.swi -application/vnd.aristanetworks.swi swi -application/vnd.artsquare -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -application/vnd.autopackage package -application/vnd.avistar+xml -application/vnd.balsamiq.bmml+xml bmml -application/vnd.balsamiq.bmpr bmpr -application/vnd.bekitzur-stech+json -application/vnd.bint.med-content -application/vnd.biopax.rdf+xml -application/vnd.blueice.multipass mpm -application/vnd.bluetooth.ep.oob ep -application/vnd.bluetooth.le.oob le -application/vnd.bmi bmi -application/vnd.businessobjects rep -application/vnd.cab-jscript -application/vnd.canon-cpdl -application/vnd.canon-lips -application/vnd.capasystems-pg+json -application/vnd.cendio.thinlinc.clientconf tlclient -application/vnd.century-systems.tcp_stream -application/vnd.chemdraw+xml cdxml -application/vnd.chess-pgn pgn -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -application/vnd.cirpack.isdn-ext -application/vnd.citationstyles.style+xml csl -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -application/vnd.coffeescript coffee -application/vnd.collection+json -application/vnd.collection.doc+json -application/vnd.collection.next+json -application/vnd.comicbook+zip cbz -# icc: application/vnd.iccprofile -application/vnd.commerce-battelle ica icf icd ic0 ic1 ic2 ic3 ic4 ic5 ic6 ic7 ic8 -application/vnd.commonspace csp cst -application/vnd.contact.cmsg cdbcmsg -application/vnd.coreos.ignition+json ign ignition -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -application/vnd.ctct.ws+xml -application/vnd.cups-pdf -application/vnd.cups-postscript -application/vnd.cups-ppd ppd -application/vnd.cups-raster -application/vnd.cups-raw -application/vnd.curl curl -application/vnd.cyan.dean.root+xml -application/vnd.cybank -application/vnd.d2l.coursepackage1p0+zip -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.datapackage+json -application/vnd.dataresource+json -application/vnd.debian.binary-package deb udeb -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -application/vnd.desmume.movie dsm -application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dm.delegation+xml -application/vnd.dna dna -application/vnd.document+json docjson -application/vnd.dolby.mobile.1 -application/vnd.dolby.mobile.2 -application/vnd.doremir.scorecloud-binary-document scld -application/vnd.dpgraph dpg mwc dpgraph -application/vnd.dreamfactory dfac -application/vnd.drive+json -application/vnd.dtg.local -application/vnd.dtg.local.flash fla -application/vnd.dtg.local.html -application/vnd.dvb.ait ait -# class: application/octet-stream -application/vnd.dvb.dvbj -application/vnd.dvb.esgcontainer -application/vnd.dvb.ipdcdftnotifaccess -application/vnd.dvb.ipdcesgaccess -application/vnd.dvb.ipdcesgaccess2 -application/vnd.dvb.ipdcesgpdd -application/vnd.dvb.ipdcroaming -application/vnd.dvb.iptv.alfec-base -application/vnd.dvb.iptv.alfec-enhancement -application/vnd.dvb.notif-aggregate-root+xml -application/vnd.dvb.notif-container+xml -application/vnd.dvb.notif-generic+xml -application/vnd.dvb.notif-ia-msglist+xml -application/vnd.dvb.notif-ia-registration-request+xml -application/vnd.dvb.notif-ia-registration-response+xml -application/vnd.dvb.notif-init+xml -# pfr: application/font-tdpfr -application/vnd.dvb.pfr -application/vnd.dvb.service svc -# dxr: application/x-director -application/vnd.dxr -application/vnd.dynageo geo -application/vnd.dzr dzr -application/vnd.easykaraoke.cdgdownload -application/vnd.ecdis-update -application/vnd.ecowin.chart mag -application/vnd.ecowin.filerequest -application/vnd.ecowin.fileupdate -application/vnd.ecowin.series -application/vnd.ecowin.seriesrequest -application/vnd.ecowin.seriesupdate -# img: application/octet-stream -application/vnd.efi-img -# iso: application/octet-stream -application/vnd.efi-iso -application/vnd.enliven nml -application/vnd.enphase.envoy -application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -application/vnd.ericsson.quickcall qcall qca -application/vnd.espass-espass+zip espass -application/vnd.eszigno3+xml es3 et3 -application/vnd.etsi.aoc+xml -application/vnd.etsi.asic-e+zip asice sce -# scs: application/scvp-cv-response -application/vnd.etsi.asic-s+zip asics -application/vnd.etsi.cug+xml -application/vnd.etsi.iptvcommand+xml -application/vnd.etsi.iptvdiscovery+xml -application/vnd.etsi.iptvprofile+xml -application/vnd.etsi.iptvsad-bc+xml -application/vnd.etsi.iptvsad-cod+xml -application/vnd.etsi.iptvsad-npvr+xml -application/vnd.etsi.iptvservice+xml -application/vnd.etsi.iptvsync+xml -application/vnd.etsi.iptvueprofile+xml -application/vnd.etsi.mcid+xml -application/vnd.etsi.mheg5 -application/vnd.etsi.overload-control-policy-dataset+xml -application/vnd.etsi.pstn+xml -application/vnd.etsi.sci+xml -application/vnd.etsi.simservs+xml -application/vnd.etsi.timestamp-token tst -application/vnd.etsi.tsl.der -application/vnd.etsi.tsl+xml -application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -application/vnd.f-secure.mobile -application/vnd.fastcopy-disk-image dim -application/vnd.fdf fdf -application/vnd.fdsn.mseed msd mseed -application/vnd.fdsn.seed seed dataless -application/vnd.ffsns -application/vnd.filmit.zfc zfc -# all extensions: application/vnd.hbci -application/vnd.fints -application/vnd.firemonkeys.cloudcell -application/vnd.FloGraphIt gph -application/vnd.fluxtime.clip ftc -application/vnd.font-fontforge-sfd sfd -application/vnd.framemaker fm -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -application/vnd.fujixerox.ART-EX -application/vnd.fujixerox.ART4 -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -application/vnd.fujixerox.docuworks.container xct -application/vnd.fujixerox.HBPL -application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geo+json obsoleted by application/geo+json -application/vnd.geocube+xml g3 g³ -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# gbr: application/rpki-ghostbusters -application/vnd.gerber -application/vnd.globalplatform.card-content-mgt -application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.gov.sk.e-form+xml -application/vnd.gov.sk.e-form+zip -application/vnd.gov.sk.xmldatacontainer+xml -application/vnd.grafeq gqf gqs -application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.HandHeld-Entertainment+xml zmm -application/vnd.hbci hbci hbc kom upa pkd bpd -application/vnd.hc+json -# rep: application/vnd.businessobjects -application/vnd.hcl-bireports -application/vnd.hdt hdt -application/vnd.heroku+json -application/vnd.hhe.lesson-player les -application/vnd.hp-HPGL hpgl -application/vnd.hp-hpid hpi hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-PCL pcl -application/vnd.hp-PCLXL -application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -application/vnd.hyperdrive+json -application/vnd.hzn-3d-crossword x3d -application/vnd.ibm.afplinedata -application/vnd.ibm.electronic-media emm -application/vnd.ibm.MiniPay mpy -application/vnd.ibm.modcap list3820 listafp afp pseg3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.ieee.1905 1905.1 -application/vnd.igloader igl -application/vnd.imagemeter.folder+zip imf -application/vnd.imagemeter.image+zip imi -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -application/vnd.ims.imsccv1p1 imscc -application/vnd.ims.imsccv1p2 -application/vnd.ims.imsccv1p3 -application/vnd.ims.lis.v2.result+json -application/vnd.ims.lti.v2.toolconsumerprofile+json -application/vnd.ims.lti.v2.toolproxy.id+json -application/vnd.ims.lti.v2.toolproxy+json -application/vnd.ims.lti.v2.toolsettings+json -application/vnd.ims.lti.v2.toolsettings.simple+json -application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary obsoleted by application/vnd.visionary -application/vnd.infotech.project -application/vnd.infotech.project+xml -application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -application/vnd.intertrust.digibox -application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -application/vnd.iptc.g2.catalogitem+xml -application/vnd.iptc.g2.conceptitem+xml -application/vnd.iptc.g2.knowledgeitem+xml -application/vnd.iptc.g2.newsitem+xml -application/vnd.iptc.g2.newsmessage+xml -application/vnd.iptc.g2.packageitem+xml -application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -application/vnd.japannet-directory-service -application/vnd.japannet-jpnstore-wakeup -application/vnd.japannet-payment-wakeup -application/vnd.japannet-registration -application/vnd.japannet-registration-wakeup -application/vnd.japannet-setstore-wakeup -application/vnd.japannet-verification -application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.jsk.isdn-ngn -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.Kinar kne knp sdf -application/vnd.koan skp skd skm skt -application/vnd.kodak-descriptor sse -application/vnd.las.las+json lasjson -application/vnd.las.las+xml lasxml -application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 wk4 wk3 wk1 -application/vnd.lotus-approach apr vew -application/vnd.lotus-freelance prz pre -application/vnd.lotus-notes nsf ntf ndl ns4 ns3 ns2 nsh nsg -application/vnd.lotus-organizer or3 or2 org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp sam -application/vnd.macports.portpkg portpkg -application/vnd.mapbox-vector-tile mvt -application/vnd.marlin.drm.actiontoken+xml -application/vnd.marlin.drm.conftoken+xml -application/vnd.marlin.drm.license+xml -application/vnd.marlin.drm.mdcf mdc -application/vnd.mason+json -application/vnd.maxmind.maxmind-db mmdb -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -application/vnd.meridian-slingshot -application/vnd.MFER mwf -application/vnd.mfmp mfm -application/vnd.micro+json -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.microsoft.portable-executable -application/vnd.microsoft.windows.thumbnail-cache -application/vnd.miele+json -application/vnd.mif mif -application/vnd.minisoft-hp3000-save -application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.Mobius.DAF daf -application/vnd.Mobius.DIS dis -application/vnd.Mobius.MBK mbk -application/vnd.Mobius.MQY mqy -application/vnd.Mobius.MSL msl -application/vnd.Mobius.PLC plc -application/vnd.Mobius.TXF txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -application/vnd.motorola.flexsuite -application/vnd.motorola.flexsuite.adsi -application/vnd.motorola.flexsuite.fis -application/vnd.motorola.flexsuite.gotap -application/vnd.motorola.flexsuite.kmr -application/vnd.motorola.flexsuite.ttc -application/vnd.motorola.flexsuite.wem -application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-3mfdocument 3mf -application/vnd.ms-artgalry cil -application/vnd.ms-asf asf -application/vnd.ms-cab-compressed cab -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.template.macroEnabled.12 xltm -application/vnd.ms-excel.addin.macroEnabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb -application/vnd.ms-excel.sheet.macroEnabled.12 xlsm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -application/vnd.ms-office.activeX+xml -application/vnd.ms-officetheme thmx -application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm -application/vnd.ms-powerpoint.slide.macroEnabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm -application/vnd.ms-powerpoint.template.macroEnabled.12 potm -application/vnd.ms-PrintDeviceCapabilities+xml -application/vnd.ms-PrintSchemaTicket+xml -application/vnd.ms-project mpp mpt -application/vnd.ms-tnef tnef tnf -application/vnd.ms-windows.devicepairing -application/vnd.ms-windows.nwprinting.oob -application/vnd.ms-windows.printerpairing -application/vnd.ms-windows.wsd.oob -application/vnd.ms-wmdrm.lic-chlg-req -application/vnd.ms-wmdrm.lic-resp -application/vnd.ms-wmdrm.meter-chlg-req -application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroEnabled.12 docm -application/vnd.ms-word.template.macroEnabled.12 dotm -application/vnd.ms-works wcm wdb wks wps -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.msa-disk-image msa -application/vnd.mseq mseq -application/vnd.msign -application/vnd.multiad.creator crtr -application/vnd.multiad.creator.cif cif -application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -application/vnd.ncd.control -application/vnd.ncd.reference -application/vnd.nearst.inv+json -application/vnd.nervana entity request bkm kcm -application/vnd.netfpx -# ntf: application/vnd.lotus-notes -application/vnd.nitf nitf -application/vnd.neurolanguage.nlu nlu -application/vnd.nintendo.nitro.rom nds -application/vnd.nintendo.snes.rom sfc smc -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -application/vnd.nokia.catalogs -application/vnd.nokia.conml+wbxml -application/vnd.nokia.conml+xml -application/vnd.nokia.iptv.config+xml -application/vnd.nokia.iSDS-radio-presets -application/vnd.nokia.landmark+wbxml -application/vnd.nokia.landmark+xml -application/vnd.nokia.landmarkcollection+xml -application/vnd.nokia.n-gage.ac+xml ac -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -application/vnd.nokia.ncd -application/vnd.nokia.pcd+wbxml -application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.EDM edm -application/vnd.novadigm.EDX edx -application/vnd.novadigm.EXT ext -application/vnd.ntt-local.content-share -application/vnd.ntt-local.file-transfer -application/vnd.ntt-local.ogw_remote-access -application/vnd.ntt-local.sip-ta_remote -application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -# otf: font/otf -application/vnd.oasis.opendocument.formula-template -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -application/vnd.obn -application/vnd.ocf+cbor -application/vnd.oftn.l10n+json -application/vnd.oipf.contentaccessdownload+xml -application/vnd.oipf.contentaccessstreaming+xml -application/vnd.oipf.cspg-hexbinary -application/vnd.oipf.dae.svg+xml -application/vnd.oipf.dae.xhtml+xml -application/vnd.oipf.mippvcontrolmessage+xml -application/vnd.oipf.pae.gem -application/vnd.oipf.spdiscovery+xml -application/vnd.oipf.spdlist+xml -application/vnd.oipf.ueprofile+xml -application/vnd.olpc-sugar xo -application/vnd.oma.bcast.associated-procedure-parameter+xml -application/vnd.oma.bcast.drm-trigger+xml -application/vnd.oma.bcast.imd+xml -application/vnd.oma.bcast.ltkm -application/vnd.oma.bcast.notification+xml -application/vnd.oma.bcast.provisioningtrigger -application/vnd.oma.bcast.sgboot -application/vnd.oma.bcast.sgdd+xml -application/vnd.oma.bcast.sgdu -application/vnd.oma.bcast.simple-symbol-container -application/vnd.oma.bcast.smartcard-trigger+xml -application/vnd.oma.bcast.sprov+xml -application/vnd.oma.bcast.stkm -application/vnd.oma.cab-address-book+xml -application/vnd.oma.cab-feature-handler+xml -application/vnd.oma.cab-pcc+xml -application/vnd.oma.cab-subs-invite+xml -application/vnd.oma.cab-user-prefs+xml -application/vnd.oma.dcd -application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -application/vnd.oma.drm.risd+xml -application/vnd.oma.group-usage-list+xml -application/vnd.oma.lwm2m+json -application/vnd.oma.lwm2m+tlv -application/vnd.oma.pal+xml -application/vnd.oma.poc.detailed-progress-report+xml -application/vnd.oma.poc.final-report+xml -application/vnd.oma.poc.groups+xml -application/vnd.oma.poc.invocation-descriptor+xml -application/vnd.oma.poc.optimized-progress-report+xml -application/vnd.oma.push -application/vnd.oma.scidm.messages+xml -application/vnd.oma.xcap-directory+xml -application/vnd.oma-scws-config -application/vnd.oma-scws-http-request -application/vnd.oma-scws-http-response -application/vnd.omads-email+xml -application/vnd.omads-file+xml -application/vnd.omads-folder+xml -application/vnd.omaloc-supl-init -application/vnd.onepager tam -application/vnd.onepagertamp tamp -application/vnd.onepagertamx tamx -application/vnd.onepagertat tat -application/vnd.onepagertatp tatp -application/vnd.onepagertatx tatx -application/vnd.openblox.game+xml obgx -application/vnd.openblox.game-binary obg -application/vnd.openeye.oeb oeb -application/vnd.openofficeorg.extension oxt -application/vnd.openstreetmap.data+xml osm -application/vnd.openxmlformats-officedocument.custom-properties+xml -application/vnd.openxmlformats-officedocument.customXmlProperties+xml -application/vnd.openxmlformats-officedocument.drawing+xml -application/vnd.openxmlformats-officedocument.drawingml.chart+xml -application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml -application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml -application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml -application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml -application/vnd.openxmlformats-officedocument.extended-properties+xml -application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml -application/vnd.openxmlformats-officedocument.presentationml.comments+xml -application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml -application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml -application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml -application/vnd.openxmlformats-officedocument.presentationml.presProps+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -application/vnd.openxmlformats-officedocument.presentationml.slide+xml -application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml -application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideUpdateInfo+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml -application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -application/vnd.openxmlformats-officedocument.theme+xml -application/vnd.openxmlformats-officedocument.themeOverride+xml -application/vnd.openxmlformats-officedocument.vmlDrawing -application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml -application/vnd.openxmlformats-package.core-properties+xml -application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -application/vnd.openxmlformats-package.relationships+xml -application/vnd.oracle.resource+json -application/vnd.orange.indata -application/vnd.osa.netdeploy ndc -application/vnd.osgeo.mapguide.package mgp -# jar: application/x-java-archive -application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -application/vnd.otps.ct-kip+xml -application/vnd.oxli.countgraph oxlicg -application/vnd.pagerduty+json -application/vnd.palm prc pdb pqa oprc -application/vnd.panoply plp -application/vnd.paos+xml -application/vnd.pawaafile paw -application/vnd.pcos -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -application/vnd.piaccess.application-license pil -application/vnd.picsel efif -application/vnd.pmi.widget wg -application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -application/vnd.powerbuilder6-s -application/vnd.powerbuilder7 -application/vnd.powerbuilder7-s -application/vnd.powerbuilder75 -application/vnd.powerbuilder75-s -application/vnd.preminet preminet -application/vnd.previewsystems.box box vbox -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -# pti: image/prs.pti -application/vnd.pvi.ptid1 ptid -application/vnd.pwg-multiplexed -application/vnd.pwg-xhtml-print+xml -application/vnd.qualcomm.brew-app-res bar -application/vnd.quarantainenet -application/vnd.Quark.QuarkXPress qxd qxt qwd qwt qxl qxb -application/vnd.quobject-quoxdocument quox quiz -application/vnd.radisys.moml+xml -application/vnd.radisys.msml-audit-conf+xml -application/vnd.radisys.msml-audit-conn+xml -application/vnd.radisys.msml-audit-dialog+xml -application/vnd.radisys.msml-audit-stream+xml -application/vnd.radisys.msml-audit+xml -application/vnd.radisys.msml-conf+xml -application/vnd.radisys.msml-dialog-base+xml -application/vnd.radisys.msml-dialog-fax-detect+xml -application/vnd.radisys.msml-dialog-fax-sendrecv+xml -application/vnd.radisys.msml-dialog-group+xml -application/vnd.radisys.msml-dialog-speech+xml -application/vnd.radisys.msml-dialog-transform+xml -application/vnd.radisys.msml-dialog+xml -application/vnd.radisys.msml+xml -application/vnd.rainstor.data tree -application/vnd.rapid -application/vnd.rar rar -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml -application/vnd.RenLearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.route66.link66+xml link66 -# gbr: application/rpki-ghostbusters -application/vnd.rs-274x -application/vnd.ruckus.download -application/vnd.s3sms -application/vnd.sailingtracker.track st -application/vnd.sbm.cid -application/vnd.sbm.mid2 -application/vnd.scribus scd sla slaz -application/vnd.sealed.3df s3df -application/vnd.sealed.csf scsf -application/vnd.sealed.doc sdoc sdo s1w -application/vnd.sealed.eml seml sem -application/vnd.sealed.mht smht smh -application/vnd.sealed.net -# spp: application/scvp-vp-response -application/vnd.sealed.ppt sppt s1p -application/vnd.sealed.tiff stif -application/vnd.sealed.xls sxls sxl s1e -# stm: audio/x-stm -application/vnd.sealedmedia.softseal.html stml s1h -application/vnd.sealedmedia.softseal.pdf spdf spd s1a -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.SimTech-MindMapper twd twds -application/vnd.siren+json -application/vnd.smaf mmf -application/vnd.smart.notebook notebook -application/vnd.smart.teacher teacher -application/vnd.software602.filler.form+xml fo -application/vnd.software602.filler.form-xml-zip zfo -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -application/vnd.sss-cod -application/vnd.sss-dtf -application/vnd.sss-ntf -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -application/vnd.street-stream -application/vnd.sun.wadl+xml wadl -application/vnd.sus-calendar sus susp -application/vnd.svd -application/vnd.swiftview-ics -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -application/vnd.syncml.dm.notification -application/vnd.syncml.dmddf+wbxml -application/vnd.syncml.dmddf+xml ddf -application/vnd.syncml.dmtnds+wbxml -application/vnd.syncml.dmtnds+xml -application/vnd.syncml.ds.notification -application/vnd.tableschema+json -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.theqvd qvd -application/vnd.tmd.mediaflex.api+xml -application/vnd.tml vfr viaframe -application/vnd.tmobile-livetv tmo -application/vnd.tri.onesource -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -application/vnd.truedoc -# cab: application/vnd.ms-cab-compressed -application/vnd.ubisoft.webplayer -application/vnd.ufdl ufdl ufd frm -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml uo -application/vnd.uplanet.alert -application/vnd.uplanet.alert-wbxml -application/vnd.uplanet.bearer-choice -application/vnd.uplanet.bearer-choice-wbxml -application/vnd.uplanet.cacheop -application/vnd.uplanet.cacheop-wbxml -application/vnd.uplanet.channel -application/vnd.uplanet.channel-wbxml -application/vnd.uplanet.list -application/vnd.uplanet.list-wbxml -application/vnd.uplanet.listcmd -application/vnd.uplanet.listcmd-wbxml -application/vnd.uplanet.signal -application/vnd.uri-map urim urimap -application/vnd.valve.source.material vmt -application/vnd.vcx vcx -# sxi: application/vnd.sun.xml.impress -application/vnd.vd-study mxi study-inter model-inter -# mcd: application/vnd.mcd -application/vnd.vectorworks vwx -application/vnd.vel+json -application/vnd.verimatrix.vcas -application/vnd.vidsoft.vidconference vsc -application/vnd.visio vsd vst vsw vss -application/vnd.visionary vis -# vsc: application/vnd.vidsoft.vidconference -application/vnd.vividence.scriptfile -application/vnd.vsf vsf -application/vnd.wap.sic sic -application/vnd.wap.slc slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -application/vnd.wfa.p2p p2p -application/vnd.wfa.wsc wsc -application/vnd.windows.devicepairing -application/vnd.wmc wmc -application/vnd.wmf.bootstrap -# nb: application/mathematica for now -application/vnd.wolfram.mathematica -application/vnd.wolfram.mathematica.package m -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -application/vnd.wv.csp+xml -application/vnd.wv.csp+wbxml wv -application/vnd.wv.ssp+xml -application/vnd.xacml+json -application/vnd.xara xar -application/vnd.xfdl xfdl xfd -application/vnd.xfdl.webform -application/vnd.xmi+xml -application/vnd.xmpie.cpkg cpkg -application/vnd.xmpie.dpkg dpkg -# dpkg: application/vnd.xmpie.dpkg -application/vnd.xmpie.plan -application/vnd.xmpie.ppkg ppkg -application/vnd.xmpie.xlim xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml -application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -application/vnd.yamaha.through-ngn -application/vnd.yamaha.tunnel-udpencap -application/vnd.yaoweme yme -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -application/vq-rtcp-xr -application/watcherinfo+xml wif -application/whoispp-query -application/whoispp-response -application/widget wgt -application/wita -application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -# yes, this *is* IANA registered despite of x- -application/x-www-form-urlencoded -application/x400-bp -application/xacml+xml -application/xcap-att+xml xav -application/xcap-caps+xml xca -application/xcap-diff+xml xdf -application/xcap-el+xml xel -application/xcap-error+xml xer -application/xcap-ns+xml xns -application/xcon-conference-info-diff+xml -application/xcon-conference-info+xml -application/xenc+xml -application/xhtml+xml xhtml xhtm xht -# xml, xsd, rng: text/xml -application/xml -# mod: audio/x-mod -application/xml-dtd dtd -# ent: text/xml-external-parsed-entity -application/xml-external-parsed-entity -application/xml-patch+xml -application/xmpp+xml -application/xop+xml xop -application/xslt+xml xsl xslt -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yang-data+json -application/yang-data+xml -application/yang-patch+json -application/yang-patch+xml -application/yin+xml yin -application/zip zip -application/zlib -audio/1d-interleaved-parityfec -audio/32kadpcm 726 -# 3gp, 3gpp: video/3gpp -audio/3gpp -# 3g2, 3gpp2: video/3gpp2 -audio/3gpp2 -audio/ac3 ac3 -audio/AMR amr -audio/AMR-WB awb -audio/amr-wb+ -audio/aptx -audio/asc acn -# aa3, omg: audio/ATRAC3 -audio/ATRAC-ADVANCED-LOSSLESS aal -# aa3, omg: audio/ATRAC3 -audio/ATRAC-X atx -audio/ATRAC3 at3 aa3 omg -audio/basic au snd -audio/BV16 -audio/BV32 -audio/clearmode -audio/CN -audio/DAT12 -audio/dls dls -audio/dsr-es201108 -audio/dsr-es202050 -audio/dsr-es202211 -audio/dsr-es202212 -audio/DV -audio/DVI4 -audio/eac3 -audio/encaprtp -audio/EVRC evc -# qcp: audio/qcelp -audio/EVRC-QCP -audio/EVRC0 -audio/EVRC1 -audio/EVRCB evb -audio/EVRCB0 -audio/EVRCB1 -audio/EVRCNW enw -audio/EVRCNW0 -audio/EVRCNW1 -audio/EVRCWB evw -audio/EVRCWB0 -audio/EVRCWB1 -audio/EVS -audio/example -audio/fwdred -audio/G711-0 -audio/G719 -audio/G722 -audio/G7221 -audio/G723 -audio/G726-16 -audio/G726-24 -audio/G726-32 -audio/G726-40 -audio/G728 -audio/G729 -audio/G7291 -audio/G729D -audio/G729E -audio/GSM -audio/GSM-EFR -audio/GSM-HR-08 -audio/iLBC lbc -audio/ip-mr_v2.5 -# wav: audio/x-wav -audio/L16 l16 -audio/L20 -audio/L24 -audio/L8 -audio/LPC -audio/MELP -audio/MELP600 -audio/MELP1200 -audio/MELP2400 -audio/mobile-xmf mxmf -# mp4, mpg4: video/mp4, see RFC 4337 -audio/mp4 m4a -audio/MP4A-LATM -audio/MPA -audio/mpa-robust -audio/mpeg mp3 mpga mp1 mp2 -audio/mpeg4-generic -audio/ogg oga ogg opus spx -audio/opus -audio/parityfec -audio/PCMA -audio/PCMA-WB -audio/PCMU -audio/PCMU-WB -audio/prs.sid sid psid -audio/qcelp qcp -audio/raptorfec -audio/RED -audio/rtp-enc-aescm128 -audio/rtp-midi -audio/rtploopback -audio/rtx -audio/SMV smv -# qcp: audio/qcelp, see RFC 3625 -audio/SMV-QCP -audio/SMV0 -# mid: audio/midi -audio/sp-midi -audio/speex -audio/t140c -audio/t38 -audio/telephone-event -audio/tone -audio/UEMCLIP -audio/ulpfec -audio/VDVI -audio/VMR-WB -audio/vnd.3gpp.iufp -audio/vnd.4SB -audio/vnd.audikoz koz -audio/vnd.CELP -audio/vnd.cisco.nse -audio/vnd.cmles.radio-events -audio/vnd.cns.anp1 -audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -audio/vnd.dlna.adts -audio/vnd.dolby.heaac.1 -audio/vnd.dolby.heaac.2 -audio/vnd.dolby.mlp mlp -audio/vnd.dolby.mps -audio/vnd.dolby.pl2 -audio/vnd.dolby.pl2x -audio/vnd.dolby.pl2z -audio/vnd.dolby.pulse.1 -audio/vnd.dra -# wav: audio/x-wav, cpt: application/mac-compactpro -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# dvb: video/vnd.dvb.file -audio/vnd.dvb.file -audio/vnd.everad.plj plj -# rm: audio/x-pn-realaudio -audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# mxmf: audio/mobile-xmf -audio/vnd.nokia.mobile-xmf -audio/vnd.nortel.vbk vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -audio/vnd.octel.sbc -# audio/vnd.qcelp deprecated in favour of audio/qcelp -audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -audio/vnd.sealedmedia.softseal.mpeg smp3 smp s1m -audio/vnd.vmx.cvsd -audio/vorbis -audio/vorbis-config -font/collection ttc -font/otf otf -font/sfnt -font/ttf ttf -font/woff woff -font/woff2 woff2 -image/bmp bmp dib -image/cgm cgm -image/dicom-rle drle -image/emf emf -image/example -image/fits fits fit fts -image/g3fax -image/gif gif -image/ief ief -image/jls jls -image/jp2 jp2 jpg2 -image/jpeg jpg jpeg jpe jfif -image/jpm jpm jpgm -image/jpx jpx jpf -image/ktx ktx -image/naplps -image/png png -image/prs.btif btif btf -image/prs.pti pti -image/pwg-raster -image/svg+xml svg svgz -image/t38 t38 -image/tiff tiff tif -image/tiff-fx tfx -image/vnd.adobe.photoshop psd -image/vnd.airzip.accelerator.azv azv -image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.djvu djvu djv -# sub: text/vnd.dvb.subtitle -image/vnd.dvb.subtitle -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -image/vnd.globalgraphics.pgb pgb -image/vnd.microsoft.icon ico -image/vnd.mix -image/vnd.mozilla.apng apng -image/vnd.ms-modi mdi -image/vnd.net-fpx -image/vnd.radiance hdr rgbe xyze -image/vnd.sealed.png spng spn s1n -image/vnd.sealedmedia.softseal.gif sgif sgi s1g -image/vnd.sealedmedia.softseal.jpg sjpg sjp s1j -image/vnd.svf -image/vnd.tencent.tap tap -image/vnd.valve.source.texture vtf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/vnd.zbrush.pcx pcx -image/wmf wmf -message/CPIM -message/delivery-status -message/disposition-notification -message/example -message/external-body -message/feedback-report -message/global u8msg -message/global-delivery-status u8dsn -message/global-disposition-notification u8mdn -message/global-headers u8hdr -message/http -# cl: application/simple-filter+xml -message/imdn+xml -# message/news obsoleted by message/rfc822 -message/partial -message/rfc822 eml mail art -message/s-http -message/sip -message/sipfrag -message/tracking-status -message/vnd.si.simp -# wsc: application/vnd.wfa.wsc -message/vnd.wfa.wsc -model/example -model/gltf+json gltf -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# 3dml, 3dm: text/vnd.in3d.3dml -model/vnd.flatland.3dml -model/vnd.gdl gdl gsm win dor lmp rsm msm ism -model/vnd.gs-gdl -model/vnd.gtw gtw -model/vnd.moml+xml moml -model/vnd.mts mts -model/vnd.opengex ogex -model/vnd.parasolid.transmit.binary x_b xmt_bin -model/vnd.parasolid.transmit.text x_t xmt_txt -model/vnd.rosette.annotated-data-model -model/vnd.valve.source.compiled-map bsp -model/vnd.vtu vtu -model/vrml wrl vrml -# x3db: model/x3d+xml -model/x3d+fastinfoset -# x3d: application/vnd.hzn-3d-crossword -model/x3d+xml x3db -model/x3d-vrml x3dv x3dvz -multipart/alternative -multipart/appledouble -multipart/byteranges -multipart/digest -multipart/encrypted -multipart/form-data -multipart/header-set -multipart/mixed -multipart/parallel -multipart/related -multipart/report -multipart/signed -multipart/vnd.bint.med-plus bmed -multipart/voice-message vpm -multipart/x-mixed-replace -text/1d-interleaved-parityfec -text/cache-manifest appcache manifest -text/calendar ics ifb -text/css css -text/csv csv -text/csv-schema csvs -text/directory -text/dns soa zone -text/encaprtp -# text/ecmascript obsoleted by application/ecmascript -text/enriched -text/example -text/fwdred -text/grammar-ref-list -text/html html htm -# text/javascript obsoleted by application/javascript -text/jcr-cnd cnd -text/markdown markdown md -text/mizar miz -text/n3 n3 -text/parameters -text/parityfec -text/plain txt asc text pm el c h cc hh cxx hxx f90 conf log -text/provenance-notation provn -text/prs.fallenstein.rst rst -text/prs.lines.tag tag dsc -text/prs.prop.logic -text/raptorfec -text/RED -text/rfc822-headers -text/richtext rtx -# rtf: application/rtf -text/rtf -text/rtp-enc-aescm128 -text/rtploopback -text/rtx -text/sgml sgml sgm -text/strings -text/t140 -text/tab-separated-values tsv -text/troff t tr roff -text/turtle ttl -text/ulpfec -text/uri-list uris uri -text/vcard vcf vcard -text/vnd.a a -text/vnd.abc abc -text/vnd.ascii-art ascii -# curl: application/vnd.curl -text/vnd.curl -text/vnd.debian.copyright copyright -text/vnd.DMClientScript dms -text/vnd.dvb.subtitle sub -text/vnd.esmertec.theme-descriptor jtd -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv dot -text/vnd.in3d.3dml 3dml 3dm -text/vnd.in3d.spot spot spo -text/vnd.IPTC.NewsML -text/vnd.IPTC.NITF -text/vnd.latex-z -text/vnd.motorola.reflex -text/vnd.ms-mediapackage mpf -text/vnd.net2phone.commcenter.command ccc -text/vnd.radisys.msml-basic-layout -text/vnd.si.uricatalogue uric -text/vnd.sun.j2me.app-descriptor jad -text/vnd.trolltech.linguist ts -text/vnd.wap.si si -text/vnd.wap.sl sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/xml xml xsd rng -text/xml-external-parsed-entity ent -video/1d-interleaved-parityfec -video/3gpp 3gp 3gpp -video/3gpp2 3g2 3gpp2 -video/3gpp-tt -video/BMPEG -video/BT656 -video/CelB -video/DV -video/encaprtp -video/example -video/H261 -video/H263 -video/H263-1998 -video/H263-2000 -video/H264 -video/H264-RCDO -video/H264-SVC -video/H265 -video/iso.segment m4s -video/JPEG -video/jpeg2000 -video/mj2 mj2 mjp2 -video/MP1S -video/MP2P -video/MP2T -video/mp4 mp4 mpg4 m4v -video/MP4V-ES -video/mpeg mpeg mpg mpe m1v m2v -video/mpeg4-generic -video/MPV -video/nv -video/ogg ogv -video/parityfec -video/pointer -video/quicktime mov qt -video/raptorfec -video/raw -video/rtp-enc-aescm128 -video/rtploopback -video/rtx -video/SMPTE292M -video/ulpfec -video/vc1 -video/vnd.CCTV -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -video/vnd.dece.mp4 uvu uvvu -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -video/vnd.directv.mpeg -video/vnd.directv.mpeg-tts -video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# rm: audio/x-pn-realaudio -video/vnd.hns.video -video/vnd.iptvforum.1dparityfec-1010 -video/vnd.iptvforum.1dparityfec-2005 -video/vnd.iptvforum.2dparityfec-1010 -video/vnd.iptvforum.2dparityfec-2005 -video/vnd.iptvforum.ttsavc -video/vnd.iptvforum.ttsmpeg2 -video/vnd.motorola.video -video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -video/vnd.nokia.interleaved-multimedia nim -video/vnd.nokia.videovoip -# mp4: video/mp4 -video/vnd.objectvideo -video/vnd.radgamettools.bink bik bk2 -video/vnd.radgamettools.smacker smk -video/vnd.sealed.mpeg1 smpg s11 -# smpg: video/vnd.sealed.mpeg1 -video/vnd.sealed.mpeg4 s14 -video/vnd.sealed.swf sswf ssw -video/vnd.sealedmedia.softseal.mov smov smo s1q -# uvu, uvvu: video/vnd.dece.mp4 -video/vnd.uvvu.mp4 -video/vnd.vivo viv -video/VP8 - -# Non-IANA types - -application/mac-compactpro cpt -application/metalink+xml metalink -application/owl+xml owx -application/rss+xml rss -application/vnd.android.package-archive apk -application/vnd.oma.dd+xml dd -application/vnd.oma.drm.content dcf -# odf: application/vnd.oasis.opendocument.formula -application/vnd.oma.drm.dcf o4a o4v -application/vnd.oma.drm.message dm -application/vnd.oma.drm.rights+wbxml drc -application/vnd.oma.drm.rights+xml dr -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -application/vnd.symbian.install sis -application/vnd.wap.mms-message mms -application/x-annodex anx -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-bzip2 bz2 -application/x-cdlink vcd -application/x-chrome-extension crx -application/x-cpio cpio -application/x-csh csh -application/x-director dcr dir dxr -application/x-dvi dvi -application/x-futuresplash spl -application/x-gtar gtar -application/x-hdf hdf -application/x-java-archive jar -application/x-java-jnlp-file jnlp -application/x-java-pack200 pack -application/x-killustrator kil -application/x-latex latex -application/x-netcdf nc cdf -application/x-perl pl -application/x-rpm rpm -application/x-sh sh -application/x-shar shar -application/x-stuffit sit -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-texinfo texinfo texi -application/x-troff-man man 1 2 3 4 5 6 7 8 -application/x-troff-me me -application/x-troff-ms ms -application/x-ustar ustar -application/x-wais-source src -application/x-xpinstall xpi -application/x-xspf+xml xspf -application/x-xz xz -audio/midi mid midi kar -audio/x-aiff aif aiff aifc -audio/x-annodex axa -audio/x-flac flac -audio/x-matroska mka -audio/x-mod mod ult uni m15 mtm 669 med -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram rm -audio/x-realaudio ra -audio/x-s3m s3m -audio/x-stm stm -audio/x-wav wav -chemical/x-xyz xyz -image/webp webp -image/x-cmu-raster ras -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-targa tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -text/html-sandboxed sandboxed -text/x-pod pod -text/x-setext etx -video/webm webm -video/x-annodex axv -video/x-flv flv -video/x-javafx fxm -video/x-matroska mkv -video/x-matroska-3d mk3d -video/x-ms-asf asx -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -x-conference/x-cooltalk ice -x-epoc/x-sisx-app sisx diff --git a/cmd/swarm/mru.go b/cmd/swarm/mru.go deleted file mode 100644 index cc7f634cbcfd..000000000000 --- a/cmd/swarm/mru.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -// Command resource allows the user to create and update signed mutable resource updates -package main - -import ( - "fmt" - "strings" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - - "github.com/ethereum/go-ethereum/cmd/utils" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "github.com/ethereum/go-ethereum/swarm/storage/mru" - "gopkg.in/urfave/cli.v1" -) - -func NewGenericSigner(ctx *cli.Context) mru.Signer { - return mru.NewGenericSigner(getPrivKey(ctx)) -} - -func getTopic(ctx *cli.Context) (topic mru.Topic) { - var name = ctx.String(SwarmResourceNameFlag.Name) - var relatedTopic = ctx.String(SwarmResourceTopicFlag.Name) - var relatedTopicBytes []byte - var err error - - if relatedTopic != "" { - relatedTopicBytes, err = hexutil.Decode(relatedTopic) - if err != nil { - utils.Fatalf("Error parsing topic: %s", err) - } - } - - topic, err = mru.NewTopic(name, relatedTopicBytes) - if err != nil { - utils.Fatalf("Error parsing topic: %s", err) - } - return topic -} - -// swarm resource create [--name ] [--data <0x Hexdata> [--multihash=false]] -// swarm resource update <0x Hexdata> [--multihash=false] -// swarm resource info - -func resourceCreate(ctx *cli.Context) { - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client = swarm.NewClient(bzzapi) - ) - - newResourceRequest := mru.NewFirstRequest(getTopic(ctx)) - newResourceRequest.View.User = resourceGetUser(ctx) - - manifestAddress, err := client.CreateResource(newResourceRequest) - if err != nil { - utils.Fatalf("Error creating resource: %s", err.Error()) - return - } - fmt.Println(manifestAddress) // output manifest address to the user in a single line (useful for other commands to pick up) - -} - -func resourceUpdate(ctx *cli.Context) { - args := ctx.Args() - - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client = swarm.NewClient(bzzapi) - manifestAddressOrDomain = ctx.String(SwarmResourceManifestFlag.Name) - ) - - if len(args) < 1 { - fmt.Println("Incorrect number of arguments") - cli.ShowCommandHelpAndExit(ctx, "update", 1) - return - } - - signer := NewGenericSigner(ctx) - - data, err := hexutil.Decode(args[0]) - if err != nil { - utils.Fatalf("Error parsing data: %s", err.Error()) - return - } - - var updateRequest *mru.Request - var query *mru.Query - - if manifestAddressOrDomain == "" { - query = new(mru.Query) - query.User = signer.Address() - query.Topic = getTopic(ctx) - - } - - // Retrieve resource status and metadata out of the manifest - updateRequest, err = client.GetResourceMetadata(query, manifestAddressOrDomain) - if err != nil { - utils.Fatalf("Error retrieving resource status: %s", err.Error()) - } - - // set the new data - updateRequest.SetData(data) - - // sign update - if err = updateRequest.Sign(signer); err != nil { - utils.Fatalf("Error signing resource update: %s", err.Error()) - } - - // post update - err = client.UpdateResource(updateRequest) - if err != nil { - utils.Fatalf("Error updating resource: %s", err.Error()) - return - } -} - -func resourceInfo(ctx *cli.Context) { - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client = swarm.NewClient(bzzapi) - manifestAddressOrDomain = ctx.String(SwarmResourceManifestFlag.Name) - ) - - var query *mru.Query - if manifestAddressOrDomain == "" { - query = new(mru.Query) - query.Topic = getTopic(ctx) - query.User = resourceGetUser(ctx) - } - - metadata, err := client.GetResourceMetadata(query, manifestAddressOrDomain) - if err != nil { - utils.Fatalf("Error retrieving resource metadata: %s", err.Error()) - return - } - encodedMetadata, err := metadata.MarshalJSON() - if err != nil { - utils.Fatalf("Error encoding metadata to JSON for display:%s", err) - } - fmt.Println(string(encodedMetadata)) -} - -func resourceGetUser(ctx *cli.Context) common.Address { - var user = ctx.String(SwarmResourceUserFlag.Name) - if user != "" { - return common.HexToAddress(user) - } - pk := getPrivKey(ctx) - if pk == nil { - utils.Fatalf("Cannot read private key. Must specify --user or --bzzaccount") - } - return crypto.PubkeyToAddress(pk.PublicKey) - -} diff --git a/cmd/swarm/mru_test.go b/cmd/swarm/mru_test.go deleted file mode 100644 index 142cf9cfd6bb..000000000000 --- a/cmd/swarm/mru_test.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "testing" - - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" - "github.com/ethereum/go-ethereum/swarm/testutil" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/swarm/storage/mru" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/log" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - swarmhttp "github.com/ethereum/go-ethereum/swarm/api/http" -) - -func TestCLIResourceUpdate(t *testing.T) { - - srv := testutil.NewTestSwarmServer(t, func(api *api.API) testutil.TestServer { - return swarmhttp.NewServer(api, "") - }, nil) - log.Info("starting 1 node cluster") - defer srv.Close() - - // create a private key file for signing - pkfile, err := ioutil.TempFile("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer pkfile.Close() - defer os.Remove(pkfile.Name()) - - privkeyHex := "0000000000000000000000000000000000000000000000000000000000001979" - privKey, _ := crypto.HexToECDSA(privkeyHex) - address := crypto.PubkeyToAddress(privKey.PublicKey) - - // save the private key to a file - _, err = io.WriteString(pkfile, privkeyHex) - if err != nil { - t.Fatal(err) - } - - // compose a topic. We'll be doing quotes about Miguel de Cervantes - var topic mru.Topic - subject := []byte("Miguel de Cervantes") - copy(topic[:], subject[:]) - name := "quotes" - - // prepare some data for the update - data := []byte("En boca cerrada no entran moscas") - hexData := hexutil.Encode(data) - - flags := []string{ - "--bzzapi", srv.URL, - "--bzzaccount", pkfile.Name(), - "resource", "update", - "--topic", topic.Hex(), - "--name", name, - hexData} - - // create an update and expect an exit without errors - log.Info(fmt.Sprintf("updating a resource with 'swarm resource update'")) - cmd := runSwarm(t, flags...) - cmd.ExpectExit() - - // now try to get the update using the client - client := swarm.NewClient(srv.URL) - if err != nil { - t.Fatal(err) - } - - // build the same topic as before, this time - // we use NewTopic to create a topic automatically. - topic, err = mru.NewTopic(name, subject) - if err != nil { - t.Fatal(err) - } - - // View configures whose updates we will be looking up. - view := mru.View{ - Topic: topic, - User: address, - } - - // Build a query to get the latest update - query := mru.NewQueryLatest(&view, lookup.NoClue) - - // retrieve content! - reader, err := client.GetResource(query, "") - if err != nil { - t.Fatal(err) - } - - retrieved, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - - // check we retrieved the sent information - if !bytes.Equal(data, retrieved) { - t.Fatalf("Received %s, expected %s", retrieved, data) - } - - // Now retrieve info for the next update - flags = []string{ - "--bzzapi", srv.URL, - "resource", "info", - "--topic", topic.Hex(), - "--user", address.Hex(), - } - - log.Info(fmt.Sprintf("getting resource info with 'swarm resource info'")) - cmd = runSwarm(t, flags...) - _, matches := cmd.ExpectRegexp(`.*`) // regex hack to extract stdout - cmd.ExpectExit() - - // verify we can deserialize the result as a valid JSON - var request mru.Request - err = json.Unmarshal([]byte(matches[0]), &request) - if err != nil { - t.Fatal(err) - } - - // make sure the retrieved view is the same - if request.View != view { - t.Fatalf("Expected view to be: %s, got %s", view, request.View) - } - - // test publishing a manifest - flags = []string{ - "--bzzapi", srv.URL, - "--bzzaccount", pkfile.Name(), - "resource", "create", - "--topic", topic.Hex(), - } - - log.Info(fmt.Sprintf("Publishing manifest with 'swarm resource create'")) - cmd = runSwarm(t, flags...) - _, matches = cmd.ExpectRegexp(`[a-f\d]{64}`) // regex hack to extract stdout - cmd.ExpectExit() - - manifestAddress := matches[0] // read the received resource manifest - - // now attempt to lookup the latest update using a manifest instead - reader, err = client.GetResource(nil, manifestAddress) - if err != nil { - t.Fatal(err) - } - - retrieved, err = ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(data, retrieved) { - t.Fatalf("Received %s, expected %s", retrieved, data) - } -} diff --git a/cmd/swarm/run_test.go b/cmd/swarm/run_test.go deleted file mode 100644 index 4be0495f884e..000000000000 --- a/cmd/swarm/run_test.go +++ /dev/null @@ -1,463 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "context" - "crypto/ecdsa" - "fmt" - "io/ioutil" - "net" - "os" - "path" - "path/filepath" - "runtime" - "sync" - "syscall" - "testing" - "time" - - "github.com/docker/docker/pkg/reexec" - "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/keystore" - "github.com/ethereum/go-ethereum/internal/cmdtest" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm" -) - -func init() { - // Run the app if we've been exec'd as "swarm-test" in runSwarm. - reexec.Register("swarm-test", func() { - if err := app.Run(os.Args); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - os.Exit(0) - }) -} - -func TestMain(m *testing.M) { - // check if we have been reexec'd - if reexec.Init() { - return - } - os.Exit(m.Run()) -} - -func runSwarm(t *testing.T, args ...string) *cmdtest.TestCmd { - tt := cmdtest.NewTestCmd(t, nil) - - // Boot "swarm". This actually runs the test binary but the TestMain - // function will prevent any tests from running. - tt.Run("swarm-test", args...) - - return tt -} - -type testCluster struct { - Nodes []*testNode - TmpDir string -} - -// newTestCluster starts a test swarm cluster of the given size. -// -// A temporary directory is created and each node gets a data directory inside -// it. -// -// Each node listens on 127.0.0.1 with random ports for both the HTTP and p2p -// ports (assigned by first listening on 127.0.0.1:0 and then passing the ports -// as flags). -// -// When starting more than one node, they are connected together using the -// admin SetPeer RPC method. - -func newTestCluster(t *testing.T, size int) *testCluster { - cluster := &testCluster{} - defer func() { - if t.Failed() { - cluster.Shutdown() - } - }() - - tmpdir, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - cluster.TmpDir = tmpdir - - // start the nodes - cluster.StartNewNodes(t, size) - - if size == 1 { - return cluster - } - - // connect the nodes together - for _, node := range cluster.Nodes { - if err := node.Client.Call(nil, "admin_addPeer", cluster.Nodes[0].Enode); err != nil { - t.Fatal(err) - } - } - - // wait until all nodes have the correct number of peers -outer: - for _, node := range cluster.Nodes { - var peers []*p2p.PeerInfo - for start := time.Now(); time.Since(start) < time.Minute; time.Sleep(50 * time.Millisecond) { - if err := node.Client.Call(&peers, "admin_peers"); err != nil { - t.Fatal(err) - } - if len(peers) == len(cluster.Nodes)-1 { - continue outer - } - } - t.Fatalf("%s only has %d / %d peers", node.Name, len(peers), len(cluster.Nodes)-1) - } - - return cluster -} - -func (c *testCluster) Shutdown() { - for _, node := range c.Nodes { - node.Shutdown() - } - os.RemoveAll(c.TmpDir) -} - -func (c *testCluster) Stop() { - for _, node := range c.Nodes { - node.Shutdown() - } -} - -func (c *testCluster) StartNewNodes(t *testing.T, size int) { - c.Nodes = make([]*testNode, 0, size) - for i := 0; i < size; i++ { - dir := filepath.Join(c.TmpDir, fmt.Sprintf("swarm%02d", i)) - if err := os.Mkdir(dir, 0700); err != nil { - t.Fatal(err) - } - - node := newTestNode(t, dir) - node.Name = fmt.Sprintf("swarm%02d", i) - - c.Nodes = append(c.Nodes, node) - } -} - -func (c *testCluster) StartExistingNodes(t *testing.T, size int, bzzaccount string) { - c.Nodes = make([]*testNode, 0, size) - for i := 0; i < size; i++ { - dir := filepath.Join(c.TmpDir, fmt.Sprintf("swarm%02d", i)) - node := existingTestNode(t, dir, bzzaccount) - node.Name = fmt.Sprintf("swarm%02d", i) - - c.Nodes = append(c.Nodes, node) - } -} - -func (c *testCluster) Cleanup() { - os.RemoveAll(c.TmpDir) -} - -type testNode struct { - Name string - Addr string - URL string - Enode string - Dir string - IpcPath string - PrivateKey *ecdsa.PrivateKey - Client *rpc.Client - Cmd *cmdtest.TestCmd -} - -const testPassphrase = "swarm-test-passphrase" - -func getTestAccount(t *testing.T, dir string) (conf *node.Config, account accounts.Account) { - // create key - conf = &node.Config{ - DataDir: dir, - IPCPath: "bzzd.ipc", - NoUSB: true, - } - n, err := node.New(conf) - if err != nil { - t.Fatal(err) - } - account, err = n.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore).NewAccount(testPassphrase) - if err != nil { - t.Fatal(err) - } - - // use a unique IPCPath when running tests on Windows - if runtime.GOOS == "windows" { - conf.IPCPath = fmt.Sprintf("bzzd-%s.ipc", account.Address.String()) - } - - return conf, account -} - -func existingTestNode(t *testing.T, dir string, bzzaccount string) *testNode { - conf, _ := getTestAccount(t, dir) - node := &testNode{Dir: dir} - - // use a unique IPCPath when running tests on Windows - if runtime.GOOS == "windows" { - conf.IPCPath = fmt.Sprintf("bzzd-%s.ipc", bzzaccount) - } - - // assign ports - ports, err := getAvailableTCPPorts(2) - if err != nil { - t.Fatal(err) - } - p2pPort := ports[0] - httpPort := ports[1] - - // start the node - node.Cmd = runSwarm(t, - "--port", p2pPort, - "--nat", "extip:127.0.0.1", - "--nodiscover", - "--datadir", dir, - "--ipcpath", conf.IPCPath, - "--ens-api", "", - "--bzzaccount", bzzaccount, - "--bzznetworkid", "321", - "--bzzport", httpPort, - "--verbosity", fmt.Sprint(*loglevel), - ) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - // ensure that all ports have active listeners - // so that the next node will not get the same - // when calling getAvailableTCPPorts - err = waitTCPPorts(ctx, ports...) - if err != nil { - t.Fatal(err) - } - - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - node.Addr = net.JoinHostPort("127.0.0.1", info.Port) - node.URL = "http://" + node.Addr - - var nodeInfo p2p.NodeInfo - if err := node.Client.Call(&nodeInfo, "admin_nodeInfo"); err != nil { - t.Fatal(err) - } - node.Enode = nodeInfo.Enode - node.IpcPath = conf.IPCPath - return node -} - -func newTestNode(t *testing.T, dir string) *testNode { - - conf, account := getTestAccount(t, dir) - ks := keystore.NewKeyStore(path.Join(dir, "keystore"), 1<<18, 1) - - pk := decryptStoreAccount(ks, account.Address.Hex(), []string{testPassphrase}) - - node := &testNode{Dir: dir, PrivateKey: pk} - - // assign ports - ports, err := getAvailableTCPPorts(2) - if err != nil { - t.Fatal(err) - } - p2pPort := ports[0] - httpPort := ports[1] - - // start the node - node.Cmd = runSwarm(t, - "--port", p2pPort, - "--nat", "extip:127.0.0.1", - "--nodiscover", - "--datadir", dir, - "--ipcpath", conf.IPCPath, - "--ens-api", "", - "--bzzaccount", account.Address.String(), - "--bzznetworkid", "321", - "--bzzport", httpPort, - "--verbosity", fmt.Sprint(*loglevel), - ) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - // ensure that all ports have active listeners - // so that the next node will not get the same - // when calling getAvailableTCPPorts - err = waitTCPPorts(ctx, ports...) - if err != nil { - t.Fatal(err) - } - - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - node.Addr = net.JoinHostPort("127.0.0.1", info.Port) - node.URL = "http://" + node.Addr - - var nodeInfo p2p.NodeInfo - if err := node.Client.Call(&nodeInfo, "admin_nodeInfo"); err != nil { - t.Fatal(err) - } - node.Enode = nodeInfo.Enode - node.IpcPath = conf.IPCPath - return node -} - -func (n *testNode) Shutdown() { - if n.Cmd != nil { - n.Cmd.Kill() - } -} - -// getAvailableTCPPorts returns a set of ports that -// nothing is listening on at the time. -// -// Function assignTCPPort cannot be called in sequence -// and guardantee that the same port will be returned in -// different calls as the listener is closed within the function, -// not after all listeners are started and selected unique -// available ports. -func getAvailableTCPPorts(count int) (ports []string, err error) { - for i := 0; i < count; i++ { - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - return nil, err - } - // defer close in the loop to be sure the same port will not - // be selected in the next iteration - defer l.Close() - - _, port, err := net.SplitHostPort(l.Addr().String()) - if err != nil { - return nil, err - } - ports = append(ports, port) - } - return ports, nil -} - -// waitTCPPorts blocks until tcp connections can be -// established on all provided ports. It runs all -// ports dialers in parallel, and returns the first -// encountered error. -// See waitTCPPort also. -func waitTCPPorts(ctx context.Context, ports ...string) error { - var err error - // mu locks err variable that is assigned in - // other goroutines - var mu sync.Mutex - - // cancel is canceling all goroutines - // when the firs error is returned - // to prevent unnecessary waiting - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - var wg sync.WaitGroup - for _, port := range ports { - wg.Add(1) - go func(port string) { - defer wg.Done() - - e := waitTCPPort(ctx, port) - - mu.Lock() - defer mu.Unlock() - if e != nil && err == nil { - err = e - cancel() - } - }(port) - } - wg.Wait() - - return err -} - -// waitTCPPort blocks until tcp connection can be established -// ona provided port. It has a 3 minute timeout as maximum, -// to prevent long waiting, but it can be shortened with -// a provided context instance. Dialer has a 10 second timeout -// in every iteration, and connection refused error will be -// retried in 100 milliseconds periods. -func waitTCPPort(ctx context.Context, port string) error { - ctx, cancel := context.WithTimeout(ctx, 3*time.Minute) - defer cancel() - - for { - c, err := (&net.Dialer{Timeout: 10 * time.Second}).DialContext(ctx, "tcp", "127.0.0.1:"+port) - if err != nil { - if operr, ok := err.(*net.OpError); ok { - if syserr, ok := operr.Err.(*os.SyscallError); ok && syserr.Err == syscall.ECONNREFUSED { - time.Sleep(100 * time.Millisecond) - continue - } - } - return err - } - return c.Close() - } -} diff --git a/cmd/swarm/swarm-smoke/main.go b/cmd/swarm/swarm-smoke/main.go deleted file mode 100644 index 70aee19229c8..000000000000 --- a/cmd/swarm/swarm-smoke/main.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "os" - "sort" - - "github.com/ethereum/go-ethereum/log" - colorable "github.com/mattn/go-colorable" - - cli "gopkg.in/urfave/cli.v1" -) - -var ( - endpoints []string - includeLocalhost bool - cluster string - scheme string - filesize int - from int - to int -) - -func main() { - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) - - app := cli.NewApp() - app.Name = "smoke-test" - app.Usage = "" - - app.Flags = []cli.Flag{ - cli.StringFlag{ - Name: "cluster-endpoint", - Value: "testing", - Usage: "cluster to point to (local, open or testing)", - Destination: &cluster, - }, - cli.IntFlag{ - Name: "cluster-from", - Value: 8501, - Usage: "swarm node (from)", - Destination: &from, - }, - cli.IntFlag{ - Name: "cluster-to", - Value: 8512, - Usage: "swarm node (to)", - Destination: &to, - }, - cli.StringFlag{ - Name: "cluster-scheme", - Value: "http", - Usage: "http or https", - Destination: &scheme, - }, - cli.BoolFlag{ - Name: "include-localhost", - Usage: "whether to include localhost:8500 as an endpoint", - Destination: &includeLocalhost, - }, - cli.IntFlag{ - Name: "filesize", - Value: 1024, - Usage: "file size for generated random file in KB", - Destination: &filesize, - }, - } - - app.Commands = []cli.Command{ - { - Name: "upload_and_sync", - Aliases: []string{"c"}, - Usage: "upload and sync", - Action: cliUploadAndSync, - }, - } - - sort.Sort(cli.FlagsByName(app.Flags)) - sort.Sort(cli.CommandsByName(app.Commands)) - - err := app.Run(os.Args) - if err != nil { - log.Error(err.Error()) - } -} diff --git a/cmd/swarm/swarm-smoke/upload_and_sync.go b/cmd/swarm/swarm-smoke/upload_and_sync.go deleted file mode 100644 index 5e0ff4b0f313..000000000000 --- a/cmd/swarm/swarm-smoke/upload_and_sync.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package main - -import ( - "bytes" - "crypto/md5" - "crypto/rand" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "os/exec" - "strings" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/pborman/uuid" - - cli "gopkg.in/urfave/cli.v1" -) - -func generateEndpoints(scheme string, cluster string, from int, to int) { - if cluster == "prod" { - cluster = "" - } else if cluster == "local" { - for port := from; port <= to; port++ { - endpoints = append(endpoints, fmt.Sprintf("%s://localhost:%v", scheme, port)) - } - return - } else { - cluster = cluster + "." - } - - for port := from; port <= to; port++ { - endpoints = append(endpoints, fmt.Sprintf("%s://%v.%sswarm-gateways.net", scheme, port, cluster)) - } - - if includeLocalhost { - endpoints = append(endpoints, "http://localhost:8500") - } -} - -func cliUploadAndSync(c *cli.Context) error { - defer func(now time.Time) { log.Info("total time", "time", time.Since(now), "size (kb)", filesize) }(time.Now()) - - generateEndpoints(scheme, cluster, from, to) - - log.Info("uploading to " + endpoints[0] + " and syncing") - - f, cleanup := generateRandomFile(filesize * 1000) - defer cleanup() - - hash, err := upload(f, endpoints[0]) - if err != nil { - log.Error(err.Error()) - return err - } - - fhash, err := digest(f) - if err != nil { - log.Error(err.Error()) - return err - } - - log.Info("uploaded successfully", "hash", hash, "digest", fmt.Sprintf("%x", fhash)) - - time.Sleep(3 * time.Second) - - wg := sync.WaitGroup{} - for _, endpoint := range endpoints { - endpoint := endpoint - ruid := uuid.New()[:8] - wg.Add(1) - go func(endpoint string, ruid string) { - for { - err := fetch(hash, endpoint, fhash, ruid) - if err != nil { - continue - } - - wg.Done() - return - } - }(endpoint, ruid) - } - wg.Wait() - log.Info("all endpoints synced random file successfully") - - return nil -} - -// fetch is getting the requested `hash` from the `endpoint` and compares it with the `original` file -func fetch(hash string, endpoint string, original []byte, ruid string) error { - log.Trace("sleeping", "ruid", ruid) - time.Sleep(3 * time.Second) - - log.Trace("http get request", "ruid", ruid, "api", endpoint, "hash", hash) - res, err := http.Get(endpoint + "/bzz:/" + hash + "/") - if err != nil { - log.Warn(err.Error(), "ruid", ruid) - return err - } - log.Trace("http get response", "ruid", ruid, "api", endpoint, "hash", hash, "code", res.StatusCode, "len", res.ContentLength) - - if res.StatusCode != 200 { - err := fmt.Errorf("expected status code %d, got %v", 200, res.StatusCode) - log.Warn(err.Error(), "ruid", ruid) - return err - } - - defer res.Body.Close() - - rdigest, err := digest(res.Body) - if err != nil { - log.Warn(err.Error(), "ruid", ruid) - return err - } - - if !bytes.Equal(rdigest, original) { - err := fmt.Errorf("downloaded imported file md5=%x is not the same as the generated one=%x", rdigest, original) - log.Warn(err.Error(), "ruid", ruid) - return err - } - - log.Trace("downloaded file matches random file", "ruid", ruid, "len", res.ContentLength) - - return nil -} - -// upload is uploading a file `f` to `endpoint` via the `swarm up` cmd -func upload(f *os.File, endpoint string) (string, error) { - var out bytes.Buffer - cmd := exec.Command("swarm", "--bzzapi", endpoint, "up", f.Name()) - cmd.Stdout = &out - err := cmd.Run() - if err != nil { - return "", err - } - hash := strings.TrimRight(out.String(), "\r\n") - return hash, nil -} - -func digest(r io.Reader) ([]byte, error) { - h := md5.New() - _, err := io.Copy(h, r) - if err != nil { - return nil, err - } - return h.Sum(nil), nil -} - -// generateRandomFile is creating a temporary file with the requested byte size -func generateRandomFile(size int) (f *os.File, teardown func()) { - // create a tmp file - tmp, err := ioutil.TempFile("", "swarm-test") - if err != nil { - panic(err) - } - - // callback for tmp file cleanup - teardown = func() { - tmp.Close() - os.Remove(tmp.Name()) - } - - buf := make([]byte, size) - _, err = rand.Read(buf) - if err != nil { - panic(err) - } - ioutil.WriteFile(tmp.Name(), buf, 0755) - - return tmp, teardown -} diff --git a/cmd/swarm/upload.go b/cmd/swarm/upload.go deleted file mode 100644 index 2225127cf3f4..000000000000 --- a/cmd/swarm/upload.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -// Command bzzup uploads files to the swarm HTTP API. -package main - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "os/user" - "path" - "path/filepath" - "strings" - - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - - "github.com/ethereum/go-ethereum/cmd/utils" - "gopkg.in/urfave/cli.v1" -) - -func upload(ctx *cli.Context) { - - args := ctx.Args() - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - recursive = ctx.GlobalBool(SwarmRecursiveFlag.Name) - wantManifest = ctx.GlobalBoolT(SwarmWantManifestFlag.Name) - defaultPath = ctx.GlobalString(SwarmUploadDefaultPath.Name) - fromStdin = ctx.GlobalBool(SwarmUpFromStdinFlag.Name) - mimeType = ctx.GlobalString(SwarmUploadMimeType.Name) - client = swarm.NewClient(bzzapi) - toEncrypt = ctx.Bool(SwarmEncryptedFlag.Name) - file string - ) - - if len(args) != 1 { - if fromStdin { - tmp, err := ioutil.TempFile("", "swarm-stdin") - if err != nil { - utils.Fatalf("error create tempfile: %s", err) - } - defer os.Remove(tmp.Name()) - n, err := io.Copy(tmp, os.Stdin) - if err != nil { - utils.Fatalf("error copying stdin to tempfile: %s", err) - } else if n == 0 { - utils.Fatalf("error reading from stdin: zero length") - } - file = tmp.Name() - } else { - utils.Fatalf("Need filename as the first and only argument") - } - } else { - file = expandPath(args[0]) - } - - if !wantManifest { - f, err := swarm.Open(file) - if err != nil { - utils.Fatalf("Error opening file: %s", err) - } - defer f.Close() - hash, err := client.UploadRaw(f, f.Size, toEncrypt) - if err != nil { - utils.Fatalf("Upload failed: %s", err) - } - fmt.Println(hash) - return - } - - stat, err := os.Stat(file) - if err != nil { - utils.Fatalf("Error opening file: %s", err) - } - - // define a function which either uploads a directory or single file - // based on the type of the file being uploaded - var doUpload func() (hash string, err error) - if stat.IsDir() { - doUpload = func() (string, error) { - if !recursive { - return "", errors.New("Argument is a directory and recursive upload is disabled") - } - if defaultPath != "" { - // construct absolute default path - absDefaultPath, _ := filepath.Abs(defaultPath) - absFile, _ := filepath.Abs(file) - // make sure absolute directory ends with only one "/" - // to trim it from absolute default path and get relative default path - absFile = strings.TrimRight(absFile, "/") + "/" - if absDefaultPath != "" && absFile != "" && strings.HasPrefix(absDefaultPath, absFile) { - defaultPath = strings.TrimPrefix(absDefaultPath, absFile) - } - } - return client.UploadDirectory(file, defaultPath, "", toEncrypt) - } - } else { - doUpload = func() (string, error) { - f, err := swarm.Open(file) - if err != nil { - return "", fmt.Errorf("error opening file: %s", err) - } - defer f.Close() - if mimeType != "" { - f.ContentType = mimeType - } - return client.Upload(f, "", toEncrypt) - } - } - hash, err := doUpload() - if err != nil { - utils.Fatalf("Upload failed: %s", err) - } - fmt.Println(hash) -} - -// Expands a file path -// 1. replace tilde with users home dir -// 2. expands embedded environment variables -// 3. cleans the path, e.g. /a/b/../c -> /a/c -// Note, it has limitations, e.g. ~someuser/tmp will not be expanded -func expandPath(p string) string { - if i := strings.Index(p, ":"); i > 0 { - return p - } - if i := strings.Index(p, "@"); i > 0 { - return p - } - if strings.HasPrefix(p, "~/") || strings.HasPrefix(p, "~\\") { - if home := homeDir(); home != "" { - p = home + p[1:] - } - } - return path.Clean(os.ExpandEnv(p)) -} - -func homeDir() string { - if home := os.Getenv("HOME"); home != "" { - return home - } - if usr, err := user.Current(); err == nil { - return usr.HomeDir - } - return "" -} diff --git a/cmd/swarm/upload_test.go b/cmd/swarm/upload_test.go deleted file mode 100644 index 84205031bb0b..000000000000 --- a/cmd/swarm/upload_test.go +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -// +build !windows - -package main - -import ( - "bytes" - "flag" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "github.com/mattn/go-colorable" -) - -var loglevel = flag.Int("loglevel", 3, "verbosity of logs") - -func init() { - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -// TestCLISwarmUp tests that running 'swarm up' makes the resulting file -// available from all nodes via the HTTP API -func TestCLISwarmUp(t *testing.T) { - testCLISwarmUp(false, t) -} -func TestCLISwarmUpRecursive(t *testing.T) { - testCLISwarmUpRecursive(false, t) -} - -// TestCLISwarmUpEncrypted tests that running 'swarm encrypted-up' makes the resulting file -// available from all nodes via the HTTP API -func TestCLISwarmUpEncrypted(t *testing.T) { - testCLISwarmUp(true, t) -} -func TestCLISwarmUpEncryptedRecursive(t *testing.T) { - testCLISwarmUpRecursive(true, t) -} - -func testCLISwarmUp(toEncrypt bool, t *testing.T) { - log.Info("starting 3 node cluster") - cluster := newTestCluster(t, 3) - defer cluster.Shutdown() - - // create a tmp file - tmp, err := ioutil.TempFile("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer tmp.Close() - defer os.Remove(tmp.Name()) - - // write data to file - data := "notsorandomdata" - _, err = io.WriteString(tmp, data) - if err != nil { - t.Fatal(err) - } - - hashRegexp := `[a-f\d]{64}` - flags := []string{ - "--bzzapi", cluster.Nodes[0].URL, - "up", - tmp.Name()} - if toEncrypt { - hashRegexp = `[a-f\d]{128}` - flags = []string{ - "--bzzapi", cluster.Nodes[0].URL, - "up", - "--encrypt", - tmp.Name()} - } - // upload the file with 'swarm up' and expect a hash - log.Info(fmt.Sprintf("uploading file with 'swarm up'")) - up := runSwarm(t, flags...) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - hash := matches[0] - log.Info("file uploaded", "hash", hash) - - // get the file from the HTTP API of each node - for _, node := range cluster.Nodes { - log.Info("getting file from node", "node", node.Name) - - res, err := http.Get(node.URL + "/bzz:/" + hash) - if err != nil { - t.Fatal(err) - } - defer res.Body.Close() - - reply, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Fatal(err) - } - if res.StatusCode != 200 { - t.Fatalf("expected HTTP status 200, got %s", res.Status) - } - if string(reply) != data { - t.Fatalf("expected HTTP body %q, got %q", data, reply) - } - log.Debug("verifying uploaded file using `swarm down`") - //try to get the content with `swarm down` - tmpDownload, err := ioutil.TempDir("", "swarm-test") - tmpDownload = path.Join(tmpDownload, "tmpfile.tmp") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDownload) - - bzzLocator := "bzz:/" + hash - flags = []string{ - "--bzzapi", cluster.Nodes[0].URL, - "down", - bzzLocator, - tmpDownload, - } - - down := runSwarm(t, flags...) - down.ExpectExit() - - fi, err := os.Stat(tmpDownload) - if err != nil { - t.Fatalf("could not stat path: %v", err) - } - - switch mode := fi.Mode(); { - case mode.IsRegular(): - downloadedBytes, err := ioutil.ReadFile(tmpDownload) - if err != nil { - t.Fatalf("had an error reading the downloaded file: %v", err) - } - if !bytes.Equal(downloadedBytes, bytes.NewBufferString(data).Bytes()) { - t.Fatalf("retrieved data and posted data not equal!") - } - - default: - t.Fatalf("expected to download regular file, got %s", fi.Mode()) - } - } - - timeout := time.Duration(2 * time.Second) - httpClient := http.Client{ - Timeout: timeout, - } - - // try to squeeze a timeout by getting an non-existent hash from each node - for _, node := range cluster.Nodes { - _, err := httpClient.Get(node.URL + "/bzz:/1023e8bae0f70be7d7b5f74343088ba408a218254391490c85ae16278e230340") - // we're speeding up the timeout here since netstore has a 60 seconds timeout on a request - if err != nil && !strings.Contains(err.Error(), "Client.Timeout exceeded while awaiting headers") { - t.Fatal(err) - } - // this is disabled since it takes 60s due to netstore timeout - // if res.StatusCode != 404 { - // t.Fatalf("expected HTTP status 404, got %s", res.Status) - // } - } -} - -func testCLISwarmUpRecursive(toEncrypt bool, t *testing.T) { - fmt.Println("starting 3 node cluster") - cluster := newTestCluster(t, 3) - defer cluster.Shutdown() - - tmpUploadDir, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpUploadDir) - // create tmp files - data := "notsorandomdata" - for _, path := range []string{"tmp1", "tmp2"} { - if err := ioutil.WriteFile(filepath.Join(tmpUploadDir, path), bytes.NewBufferString(data).Bytes(), 0644); err != nil { - t.Fatal(err) - } - } - - hashRegexp := `[a-f\d]{64}` - flags := []string{ - "--bzzapi", cluster.Nodes[0].URL, - "--recursive", - "up", - tmpUploadDir} - if toEncrypt { - hashRegexp = `[a-f\d]{128}` - flags = []string{ - "--bzzapi", cluster.Nodes[0].URL, - "--recursive", - "up", - "--encrypt", - tmpUploadDir} - } - // upload the file with 'swarm up' and expect a hash - log.Info(fmt.Sprintf("uploading file with 'swarm up'")) - up := runSwarm(t, flags...) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - hash := matches[0] - log.Info("dir uploaded", "hash", hash) - - // get the file from the HTTP API of each node - for _, node := range cluster.Nodes { - log.Info("getting file from node", "node", node.Name) - //try to get the content with `swarm down` - tmpDownload, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDownload) - bzzLocator := "bzz:/" + hash - flagss := []string{} - flagss = []string{ - "--bzzapi", cluster.Nodes[0].URL, - "down", - "--recursive", - bzzLocator, - tmpDownload, - } - - fmt.Println("downloading from swarm with recursive") - down := runSwarm(t, flagss...) - down.ExpectExit() - - files, err := ioutil.ReadDir(tmpDownload) - for _, v := range files { - fi, err := os.Stat(path.Join(tmpDownload, v.Name())) - if err != nil { - t.Fatalf("got an error: %v", err) - } - - switch mode := fi.Mode(); { - case mode.IsRegular(): - if file, err := swarm.Open(path.Join(tmpDownload, v.Name())); err != nil { - t.Fatalf("encountered an error opening the file returned from the CLI: %v", err) - } else { - ff := make([]byte, len(data)) - io.ReadFull(file, ff) - buf := bytes.NewBufferString(data) - - if !bytes.Equal(ff, buf.Bytes()) { - t.Fatalf("retrieved data and posted data not equal!") - } - } - default: - t.Fatalf("this shouldnt happen") - } - } - if err != nil { - t.Fatalf("could not list files at: %v", files) - } - } -} - -// TestCLISwarmUpDefaultPath tests swarm recursive upload with relative and absolute -// default paths and with encryption. -func TestCLISwarmUpDefaultPath(t *testing.T) { - testCLISwarmUpDefaultPath(false, false, t) - testCLISwarmUpDefaultPath(false, true, t) - testCLISwarmUpDefaultPath(true, false, t) - testCLISwarmUpDefaultPath(true, true, t) -} - -func testCLISwarmUpDefaultPath(toEncrypt bool, absDefaultPath bool, t *testing.T) { - cluster := newTestCluster(t, 1) - defer cluster.Shutdown() - - tmp, err := ioutil.TempDir("", "swarm-defaultpath-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - err = ioutil.WriteFile(filepath.Join(tmp, "index.html"), []byte("

Test

"), 0666) - if err != nil { - t.Fatal(err) - } - err = ioutil.WriteFile(filepath.Join(tmp, "robots.txt"), []byte("Disallow: /"), 0666) - if err != nil { - t.Fatal(err) - } - - defaultPath := "index.html" - if absDefaultPath { - defaultPath = filepath.Join(tmp, defaultPath) - } - - args := []string{ - "--bzzapi", - cluster.Nodes[0].URL, - "--recursive", - "--defaultpath", - defaultPath, - "up", - tmp, - } - if toEncrypt { - args = append(args, "--encrypt") - } - - up := runSwarm(t, args...) - hashRegexp := `[a-f\d]{64,128}` - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - hash := matches[0] - - client := swarm.NewClient(cluster.Nodes[0].URL) - - m, isEncrypted, err := client.DownloadManifest(hash) - if err != nil { - t.Fatal(err) - } - - if toEncrypt != isEncrypted { - t.Error("downloaded manifest is not encrypted") - } - - var found bool - var entriesCount int - for _, e := range m.Entries { - entriesCount++ - if e.Path == "" { - found = true - } - } - - if !found { - t.Error("manifest default entry was not found") - } - - if entriesCount != 3 { - t.Errorf("manifest contains %v entries, expected %v", entriesCount, 3) - } -} diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 58d72f32baa0..a3ee45ba7f06 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -238,7 +238,7 @@ func ExportAppendChain(blockchain *core.BlockChain, fn string, first uint64, las } // ImportPreimages imports a batch of exported hash preimages into the database. -func ImportPreimages(db *ethdb.LDBDatabase, fn string) error { +func ImportPreimages(db ethdb.Database, fn string) error { log.Info("Importing preimages", "file", fn) // Open the file handle and potentially unwrap the gzip stream @@ -272,20 +272,20 @@ func ImportPreimages(db *ethdb.LDBDatabase, fn string) error { // Accumulate the preimages and flush when enough ws gathered preimages[crypto.Keccak256Hash(blob)] = common.CopyBytes(blob) if len(preimages) > 1024 { - rawdb.WritePreimages(db, 0, preimages) + rawdb.WritePreimages(db, preimages) preimages = make(map[common.Hash][]byte) } } // Flush the last batch preimage data if len(preimages) > 0 { - rawdb.WritePreimages(db, 0, preimages) + rawdb.WritePreimages(db, preimages) } return nil } // ExportPreimages exports all known hash preimages into the specified file, // truncating any data already present in the file. -func ExportPreimages(db *ethdb.LDBDatabase, fn string) error { +func ExportPreimages(db ethdb.Database, fn string) error { log.Info("Exporting preimages", "file", fn) // Open the file handle and potentially wrap with a gzip stream @@ -302,6 +302,8 @@ func ExportPreimages(db *ethdb.LDBDatabase, fn string) error { } // Iterate over the preimages and export them it := db.NewIteratorWithPrefix([]byte("secure-key-")) + defer it.Release() + for it.Next() { if err := rlp.Encode(writer, it.Value()); err != nil { return err diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index b48f37177d6c..7e28dff79a46 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -19,6 +19,7 @@ package utils import ( "crypto/ecdsa" + "errors" "fmt" "io/ioutil" "math/big" @@ -36,7 +37,6 @@ import ( "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/dashboard" @@ -45,10 +45,12 @@ import ( "github.com/ethereum/go-ethereum/eth/gasprice" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethstats" + "github.com/ethereum/go-ethereum/graphql" "github.com/ethereum/go-ethereum/les" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/metrics/influxdb" + "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/discv5" @@ -56,8 +58,10 @@ import ( "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/p2p/netutil" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" - "gopkg.in/urfave/cli.v1" + pcsclite "github.com/gballet/go-libpcsclite" + cli "gopkg.in/urfave/cli.v1" ) var ( @@ -91,16 +95,12 @@ GLOBAL OPTIONS: } // NewApp creates an app with sane defaults. -func NewApp(gitCommit, usage string) *cli.App { +func NewApp(gitCommit, gitDate, usage string) *cli.App { app := cli.NewApp() app.Name = filepath.Base(os.Args[0]) app.Author = "" - //app.Authors = nil app.Email = "" - app.Version = params.VersionWithMeta - if len(gitCommit) >= 8 { - app.Version += "-" + gitCommit[:8] - } + app.Version = params.VersionWithCommit(gitCommit, gitDate) app.Usage = usage return app } @@ -119,6 +119,10 @@ var ( Usage: "Data directory for the databases and keystore", Value: DirectoryString{node.DefaultDataDir()}, } + AncientFlag = DirectoryFlag{ + Name: "datadir.ancient", + Usage: "Data directory for ancient chain segments (default = inside chaindata)", + } KeyStoreDirFlag = DirectoryFlag{ Name: "keystore", Usage: "Directory for the keystore (default = inside the datadir)", @@ -127,6 +131,11 @@ var ( Name: "nousb", Usage: "Disables monitoring for and managing USB hardware wallets", } + SmartCardDaemonPathFlag = cli.StringFlag{ + Name: "pcscdpath", + Usage: "Path to the smartcard daemon (pcscd) socket file", + Value: pcsclite.PCSCDSockName, + } NetworkIdFlag = cli.Uint64Flag{ Name: "networkid", Usage: "Network identifier (integer, 1=Frontier, 2=Morden (disused), 3=Ropsten, 4=Rinkeby)", @@ -140,6 +149,10 @@ var ( Name: "rinkeby", Usage: "Rinkeby network: pre-configured proof-of-authority test network", } + GoerliFlag = cli.BoolFlag{ + Name: "goerli", + Usage: "Görli network: pre-configured proof-of-authority test network", + } DeveloperFlag = cli.BoolFlag{ Name: "dev", Usage: "Ephemeral proof-of-authority network with a pre-funded developer account, mining enabled", @@ -157,6 +170,26 @@ var ( Usage: "Document Root for HTTPClient file scheme", Value: DirectoryString{homeDir()}, } + ExitWhenSyncedFlag = cli.BoolFlag{ + Name: "exitwhensynced", + Usage: "Exits after block synchronisation completes", + } + IterativeOutputFlag = cli.BoolFlag{ + Name: "iterative", + Usage: "Print streaming JSON iteratively, delimited by newlines", + } + ExcludeStorageFlag = cli.BoolFlag{ + Name: "nostorage", + Usage: "Exclude storage entries (save db lookups)", + } + IncludeIncompletesFlag = cli.BoolFlag{ + Name: "incompletes", + Usage: "Include accounts for which we don't have the address (missing preimage)", + } + ExcludeCodeFlag = cli.BoolFlag{ + Name: "nocode", + Usage: "Exclude contract code (save db lookups)", + } defaultSyncMode = eth.DefaultConfig.SyncMode SyncModeFlag = TextMarshalerFlag{ Name: "syncmode", @@ -168,23 +201,62 @@ var ( Usage: `Blockchain garbage collection mode ("full", "archive")`, Value: "full", } - LightServFlag = cli.IntFlag{ + LightKDFFlag = cli.BoolFlag{ + Name: "lightkdf", + Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", + } + WhitelistFlag = cli.StringFlag{ + Name: "whitelist", + Usage: "Comma separated block number-to-hash mappings to enforce (=)", + } + // Light server and client settings + LightLegacyServFlag = cli.IntFlag{ // Deprecated in favor of light.serve, remove in 2021 Name: "lightserv", - Usage: "Maximum percentage of time allowed for serving LES requests (0-90)", - Value: 0, + Usage: "Maximum percentage of time allowed for serving LES requests (deprecated, use --light.serve)", + Value: eth.DefaultConfig.LightServ, + } + LightServeFlag = cli.IntFlag{ + Name: "light.serve", + Usage: "Maximum percentage of time allowed for serving LES requests (multi-threaded processing allows values over 100)", + Value: eth.DefaultConfig.LightServ, + } + LightIngressFlag = cli.IntFlag{ + Name: "light.ingress", + Usage: "Incoming bandwidth limit for serving light clients (kilobytes/sec, 0 = unlimited)", + Value: eth.DefaultConfig.LightIngress, } - LightPeersFlag = cli.IntFlag{ + LightEgressFlag = cli.IntFlag{ + Name: "light.egress", + Usage: "Outgoing bandwidth limit for serving light clients (kilobytes/sec, 0 = unlimited)", + Value: eth.DefaultConfig.LightEgress, + } + LightLegacyPeersFlag = cli.IntFlag{ // Deprecated in favor of light.maxpeers, remove in 2021 Name: "lightpeers", - Usage: "Maximum number of LES client peers", + Usage: "Maximum number of light clients to serve, or light servers to attach to (deprecated, use --light.maxpeers)", Value: eth.DefaultConfig.LightPeers, } - LightKDFFlag = cli.BoolFlag{ - Name: "lightkdf", - Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", + LightMaxPeersFlag = cli.IntFlag{ + Name: "light.maxpeers", + Usage: "Maximum number of light clients to serve, or light servers to attach to", + Value: eth.DefaultConfig.LightPeers, + } + UltraLightServersFlag = cli.StringFlag{ + Name: "ulc.servers", + Usage: "List of trusted ultra-light servers", + Value: strings.Join(eth.DefaultConfig.UltraLightServers, ","), + } + UltraLightFractionFlag = cli.IntFlag{ + Name: "ulc.fraction", + Usage: "Minimum % of trusted ultra-light servers required to announce a new head", + Value: eth.DefaultConfig.UltraLightFraction, + } + UltraLightOnlyAnnounceFlag = cli.BoolFlag{ + Name: "ulc.onlyannounce", + Usage: "Ultra light server sends announcements only", } // Dashboard settings DashboardEnabledFlag = cli.BoolFlag{ - Name: metrics.DashboardEnabledFlag, + Name: "dashboard", Usage: "Enable the dashboard", } DashboardAddrFlag = cli.StringFlag{ @@ -289,23 +361,27 @@ var ( // Performance tuning settings CacheFlag = cli.IntFlag{ Name: "cache", - Usage: "Megabytes of memory allocated to internal caching", + Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node, 128 light mode)", Value: 1024, } CacheDatabaseFlag = cli.IntFlag{ Name: "cache.database", Usage: "Percentage of cache memory allowance to use for database io", - Value: 75, + Value: 50, + } + CacheTrieFlag = cli.IntFlag{ + Name: "cache.trie", + Usage: "Percentage of cache memory allowance to use for trie caching (default = 25% full mode, 50% archive mode)", + Value: 25, } CacheGCFlag = cli.IntFlag{ Name: "cache.gc", - Usage: "Percentage of cache memory allowance to use for trie pruning", + Usage: "Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode)", Value: 25, } - TrieCacheGenFlag = cli.IntFlag{ - Name: "trie-cache-gens", - Usage: "Number of trie node generations to keep in memory", - Value: int(state.MaxTrieCacheGen), + CacheNoPrefetchFlag = cli.BoolFlag{ + Name: "cache.noprefetch", + Usage: "Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)", } // Miner settings MiningEnabledFlag = cli.BoolFlag{ @@ -329,27 +405,27 @@ var ( MinerGasTargetFlag = cli.Uint64Flag{ Name: "miner.gastarget", Usage: "Target gas floor for mined blocks", - Value: eth.DefaultConfig.MinerGasFloor, + Value: eth.DefaultConfig.Miner.GasFloor, } MinerLegacyGasTargetFlag = cli.Uint64Flag{ Name: "targetgaslimit", Usage: "Target gas floor for mined blocks (deprecated, use --miner.gastarget)", - Value: eth.DefaultConfig.MinerGasFloor, + Value: eth.DefaultConfig.Miner.GasFloor, } MinerGasLimitFlag = cli.Uint64Flag{ Name: "miner.gaslimit", Usage: "Target gas ceiling for mined blocks", - Value: eth.DefaultConfig.MinerGasCeil, + Value: eth.DefaultConfig.Miner.GasCeil, } MinerGasPriceFlag = BigFlag{ Name: "miner.gasprice", Usage: "Minimum gas price for mining a transaction", - Value: eth.DefaultConfig.MinerGasPrice, + Value: eth.DefaultConfig.Miner.GasPrice, } MinerLegacyGasPriceFlag = BigFlag{ Name: "gasprice", Usage: "Minimum gas price for mining a transaction (deprecated, use --miner.gasprice)", - Value: eth.DefaultConfig.MinerGasPrice, + Value: eth.DefaultConfig.Miner.GasPrice, } MinerEtherbaseFlag = cli.StringFlag{ Name: "miner.etherbase", @@ -372,7 +448,7 @@ var ( MinerRecommitIntervalFlag = cli.DurationFlag{ Name: "miner.recommit", Usage: "Time interval to recreate the block being mined", - Value: eth.DefaultConfig.MinerRecommit, + Value: eth.DefaultConfig.Miner.Recommit, } MinerNoVerfiyFlag = cli.BoolFlag{ Name: "miner.noverify", @@ -389,11 +465,23 @@ var ( Usage: "Password file to use for non-interactive password input", Value: "", } - + ExternalSignerFlag = cli.StringFlag{ + Name: "signer", + Usage: "External signer (url or path to ipc file)", + Value: "", + } VMEnableDebugFlag = cli.BoolFlag{ Name: "vmdebug", Usage: "Record information useful for VM and contract debugging", } + InsecureUnlockAllowedFlag = cli.BoolFlag{ + Name: "allow-insecure-unlock", + Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http", + } + RPCGlobalGasCap = cli.Uint64Flag{ + Name: "rpc.gascap", + Usage: "Sets a cap on gas that can be used in eth_call/estimateGas", + } // Logging and debug settings EthStatsURLFlag = cli.StringFlag{ Name: "ethstats", @@ -408,6 +496,14 @@ var ( Usage: "Disables db compaction after import", } // RPC settings + IPCDisabledFlag = cli.BoolFlag{ + Name: "ipcdisable", + Usage: "Disable the IPC-RPC server", + } + IPCPathFlag = DirectoryFlag{ + Name: "ipcpath", + Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", + } RPCEnabledFlag = cli.BoolFlag{ Name: "rpc", Usage: "Enable the HTTP-RPC server", @@ -437,14 +533,6 @@ var ( Usage: "API's offered over the HTTP-RPC interface", Value: "", } - IPCDisabledFlag = cli.BoolFlag{ - Name: "ipcdisable", - Usage: "Disable the IPC-RPC server", - } - IPCPathFlag = DirectoryFlag{ - Name: "ipcpath", - Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", - } WSEnabledFlag = cli.BoolFlag{ Name: "ws", Usage: "Enable the WS-RPC server", @@ -469,6 +557,30 @@ var ( Usage: "Origins from which to accept websockets requests", Value: "", } + GraphQLEnabledFlag = cli.BoolFlag{ + Name: "graphql", + Usage: "Enable the GraphQL server", + } + GraphQLListenAddrFlag = cli.StringFlag{ + Name: "graphql.addr", + Usage: "GraphQL server listening interface", + Value: node.DefaultGraphQLHost, + } + GraphQLPortFlag = cli.IntFlag{ + Name: "graphql.port", + Usage: "GraphQL server listening port", + Value: node.DefaultGraphQLPort, + } + GraphQLCORSDomainFlag = cli.StringFlag{ + Name: "graphql.corsdomain", + Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", + Value: "", + } + GraphQLVirtualHostsFlag = cli.StringFlag{ + Name: "graphql.vhosts", + Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", + Value: strings.Join(node.DefaultConfig.GraphQLVirtualHosts, ","), + } ExecFlag = cli.StringFlag{ Name: "exec", Usage: "Execute JavaScript statement", @@ -482,12 +594,12 @@ var ( MaxPeersFlag = cli.IntFlag{ Name: "maxpeers", Usage: "Maximum number of network peers (network disabled if set to 0)", - Value: 25, + Value: node.DefaultConfig.P2P.MaxPeers, } MaxPendingPeersFlag = cli.IntFlag{ Name: "maxpendpeers", Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", - Value: 0, + Value: node.DefaultConfig.P2P.MaxPendingPeers, } ListenPortFlag = cli.IntFlag{ Name: "port", @@ -574,9 +686,13 @@ var ( // Metrics flags MetricsEnabledFlag = cli.BoolFlag{ - Name: metrics.MetricsEnabledFlag, + Name: "metrics", Usage: "Enable metrics collection and reporting", } + MetricsEnabledExpensiveFlag = cli.BoolFlag{ + Name: "metrics.expensive", + Usage: "Enable expensive metrics collection and reporting", + } MetricsEnableInfluxDBFlag = cli.BoolFlag{ Name: "metrics.influxdb", Usage: "Enable metrics export/push to an external InfluxDB database", @@ -601,14 +717,14 @@ var ( Usage: "Password to authorize access to the database", Value: "test", } - // The `host` tag is part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB. - // It is used so that we can group all nodes and average a measurement across all of them, but also so - // that we can select a specific node and inspect its measurements. + // Tags are part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB. + // For example `host` tag could be used so that we can group all nodes and average a measurement + // across all of them, but also so that we can select a specific node and inspect its measurements. // https://docs.influxdata.com/influxdb/v1.4/concepts/key_concepts/#tag-key - MetricsInfluxDBHostTagFlag = cli.StringFlag{ - Name: "metrics.influxdb.host.tag", - Usage: "InfluxDB `host` tag attached to all measurements", - Value: "localhost", + MetricsInfluxDBTagsFlag = cli.StringFlag{ + Name: "metrics.influxdb.tags", + Usage: "Comma-separated InfluxDB tags (key/values) attached to all measurements", + Value: "host=localhost", } EWASMInterpreterFlag = cli.StringFlag{ @@ -634,6 +750,9 @@ func MakeDataDir(ctx *cli.Context) string { if ctx.GlobalBool(RinkebyFlag.Name) { return filepath.Join(path, "rinkeby") } + if ctx.GlobalBool(GoerliFlag.Name) { + return filepath.Join(path, "goerli") + } return path } Fatalf("Cannot determine default data directory, please set manually (--datadir)") @@ -688,17 +807,22 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { urls = params.TestnetBootnodes case ctx.GlobalBool(RinkebyFlag.Name): urls = params.RinkebyBootnodes + case ctx.GlobalBool(GoerliFlag.Name): + urls = params.GoerliBootnodes case cfg.BootstrapNodes != nil: return // already set, don't apply defaults. } cfg.BootstrapNodes = make([]*enode.Node, 0, len(urls)) for _, url := range urls { - node, err := enode.ParseV4(url) - if err != nil { - log.Crit("Bootstrap URL invalid", "enode", url, "err", err) + if url != "" { + node, err := enode.Parse(enode.ValidSchemes, url) + if err != nil { + log.Crit("Bootstrap URL invalid", "enode", url, "err", err) + continue + } + cfg.BootstrapNodes = append(cfg.BootstrapNodes, node) } - cfg.BootstrapNodes = append(cfg.BootstrapNodes, node) } } @@ -715,18 +839,22 @@ func setBootstrapNodesV5(ctx *cli.Context, cfg *p2p.Config) { } case ctx.GlobalBool(RinkebyFlag.Name): urls = params.RinkebyBootnodes + case ctx.GlobalBool(GoerliFlag.Name): + urls = params.GoerliBootnodes case cfg.BootstrapNodesV5 != nil: return // already set, don't apply defaults. } cfg.BootstrapNodesV5 = make([]*discv5.Node, 0, len(urls)) for _, url := range urls { - node, err := discv5.ParseNode(url) - if err != nil { - log.Error("Bootstrap URL invalid", "enode", url, "err", err) - continue + if url != "" { + node, err := discv5.ParseNode(url) + if err != nil { + log.Error("Bootstrap URL invalid", "enode", url, "err", err) + continue + } + cfg.BootstrapNodesV5 = append(cfg.BootstrapNodesV5, node) } - cfg.BootstrapNodesV5 = append(cfg.BootstrapNodesV5, node) } } @@ -768,7 +896,6 @@ func setHTTP(ctx *cli.Context, cfg *node.Config) { cfg.HTTPHost = ctx.GlobalString(RPCListenAddrFlag.Name) } } - if ctx.GlobalIsSet(RPCPortFlag.Name) { cfg.HTTPPort = ctx.GlobalInt(RPCPortFlag.Name) } @@ -783,6 +910,24 @@ func setHTTP(ctx *cli.Context, cfg *node.Config) { } } +// setGraphQL creates the GraphQL listener interface string from the set +// command line flags, returning empty if the GraphQL endpoint is disabled. +func setGraphQL(ctx *cli.Context, cfg *node.Config) { + if ctx.GlobalBool(GraphQLEnabledFlag.Name) && cfg.GraphQLHost == "" { + cfg.GraphQLHost = "127.0.0.1" + if ctx.GlobalIsSet(GraphQLListenAddrFlag.Name) { + cfg.GraphQLHost = ctx.GlobalString(GraphQLListenAddrFlag.Name) + } + } + cfg.GraphQLPort = ctx.GlobalInt(GraphQLPortFlag.Name) + if ctx.GlobalIsSet(GraphQLCORSDomainFlag.Name) { + cfg.GraphQLCors = splitAndTrim(ctx.GlobalString(GraphQLCORSDomainFlag.Name)) + } + if ctx.GlobalIsSet(GraphQLVirtualHostsFlag.Name) { + cfg.GraphQLVirtualHosts = splitAndTrim(ctx.GlobalString(GraphQLVirtualHostsFlag.Name)) + } +} + // setWS creates the WebSocket RPC listener interface string from the set // command line flags, returning empty if the HTTP endpoint is disabled. func setWS(ctx *cli.Context, cfg *node.Config) { @@ -792,7 +937,6 @@ func setWS(ctx *cli.Context, cfg *node.Config) { cfg.WSHost = ctx.GlobalString(WSListenAddrFlag.Name) } } - if ctx.GlobalIsSet(WSPortFlag.Name) { cfg.WSPort = ctx.GlobalInt(WSPortFlag.Name) } @@ -807,7 +951,7 @@ func setWS(ctx *cli.Context, cfg *node.Config) { // setIPC creates an IPC path configuration from the set command line flags, // returning an empty string if IPC was explicitly disabled, or the set path. func setIPC(ctx *cli.Context, cfg *node.Config) { - checkExclusive(ctx, IPCDisabledFlag, IPCPathFlag) + CheckExclusive(ctx, IPCDisabledFlag, IPCPathFlag) switch { case ctx.GlobalBool(IPCDisabledFlag.Name): cfg.IPCPath = "" @@ -816,22 +960,53 @@ func setIPC(ctx *cli.Context, cfg *node.Config) { } } +// setLes configures the les server and ultra light client settings from the command line flags. +func setLes(ctx *cli.Context, cfg *eth.Config) { + if ctx.GlobalIsSet(LightLegacyServFlag.Name) { + cfg.LightServ = ctx.GlobalInt(LightLegacyServFlag.Name) + } + if ctx.GlobalIsSet(LightServeFlag.Name) { + cfg.LightServ = ctx.GlobalInt(LightServeFlag.Name) + } + if ctx.GlobalIsSet(LightIngressFlag.Name) { + cfg.LightIngress = ctx.GlobalInt(LightIngressFlag.Name) + } + if ctx.GlobalIsSet(LightEgressFlag.Name) { + cfg.LightEgress = ctx.GlobalInt(LightEgressFlag.Name) + } + if ctx.GlobalIsSet(LightLegacyPeersFlag.Name) { + cfg.LightPeers = ctx.GlobalInt(LightLegacyPeersFlag.Name) + } + if ctx.GlobalIsSet(LightMaxPeersFlag.Name) { + cfg.LightPeers = ctx.GlobalInt(LightMaxPeersFlag.Name) + } + if ctx.GlobalIsSet(UltraLightServersFlag.Name) { + cfg.UltraLightServers = strings.Split(ctx.GlobalString(UltraLightServersFlag.Name), ",") + } + if ctx.GlobalIsSet(UltraLightFractionFlag.Name) { + cfg.UltraLightFraction = ctx.GlobalInt(UltraLightFractionFlag.Name) + } + if cfg.UltraLightFraction <= 0 && cfg.UltraLightFraction > 100 { + log.Error("Ultra light fraction is invalid", "had", cfg.UltraLightFraction, "updated", eth.DefaultConfig.UltraLightFraction) + cfg.UltraLightFraction = eth.DefaultConfig.UltraLightFraction + } + if ctx.GlobalIsSet(UltraLightOnlyAnnounceFlag.Name) { + cfg.UltraLightOnlyAnnounce = ctx.GlobalBool(UltraLightOnlyAnnounceFlag.Name) + } +} + // makeDatabaseHandles raises out the number of allowed file handles per process // for Geth and returns half of the allowance to assign to the database. func makeDatabaseHandles() int { - limit, err := fdlimit.Current() + limit, err := fdlimit.Maximum() if err != nil { Fatalf("Failed to retrieve file descriptor allowance: %v", err) } - if limit < 2048 { - if err := fdlimit.Raise(2048); err != nil { - Fatalf("Failed to raise file descriptor allowance: %v", err) - } - } - if limit > 2048 { // cap database file descriptors even if more is available - limit = 2048 + raised, err := fdlimit.Raise(uint64(limit)) + if err != nil { + Fatalf("Failed to raise file descriptor allowance: %v", err) } - return limit / 2 // Leave half for networking and other stuff + return int(raised / 2) // Leave half for networking and other stuff } // MakeAddress converts an account specified directly as a hex encoded string or @@ -872,11 +1047,15 @@ func setEtherbase(ctx *cli.Context, ks *keystore.KeyStore, cfg *eth.Config) { } // Convert the etherbase into an address and configure it if etherbase != "" { - account, err := MakeAddress(ks, etherbase) - if err != nil { - Fatalf("Invalid miner etherbase: %v", err) + if ks != nil { + account, err := MakeAddress(ks, etherbase) + if err != nil { + Fatalf("Invalid miner etherbase: %v", err) + } + cfg.Miner.Etherbase = account.Address + } else { + Fatalf("No etherbase configured") } - cfg.Etherbase = account.Address } } @@ -906,19 +1085,22 @@ func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) { setBootstrapNodesV5(ctx, cfg) lightClient := ctx.GlobalString(SyncModeFlag.Name) == "light" - lightServer := ctx.GlobalInt(LightServFlag.Name) != 0 - lightPeers := ctx.GlobalInt(LightPeersFlag.Name) + lightServer := (ctx.GlobalInt(LightLegacyServFlag.Name) != 0 || ctx.GlobalInt(LightServeFlag.Name) != 0) + lightPeers := ctx.GlobalInt(LightLegacyPeersFlag.Name) + if ctx.GlobalIsSet(LightMaxPeersFlag.Name) { + lightPeers = ctx.GlobalInt(LightMaxPeersFlag.Name) + } if ctx.GlobalIsSet(MaxPeersFlag.Name) { cfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name) - if lightServer && !ctx.GlobalIsSet(LightPeersFlag.Name) { + if lightServer && !ctx.GlobalIsSet(LightLegacyPeersFlag.Name) && !ctx.GlobalIsSet(LightMaxPeersFlag.Name) { cfg.MaxPeers += lightPeers } } else { if lightServer { cfg.MaxPeers += lightPeers } - if lightClient && ctx.GlobalIsSet(LightPeersFlag.Name) && cfg.MaxPeers < lightPeers { + if lightClient && (ctx.GlobalIsSet(LightLegacyPeersFlag.Name) || ctx.GlobalIsSet(LightMaxPeersFlag.Name)) && cfg.MaxPeers < lightPeers { cfg.MaxPeers = lightPeers } } @@ -970,18 +1152,14 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { SetP2PConfig(ctx, &cfg.P2P) setIPC(ctx, cfg) setHTTP(ctx, cfg) + setGraphQL(ctx, cfg) setWS(ctx, cfg) setNodeUserIdent(ctx, cfg) + setDataDir(ctx, cfg) + setSmartCard(ctx, cfg) - switch { - case ctx.GlobalIsSet(DataDirFlag.Name): - cfg.DataDir = ctx.GlobalString(DataDirFlag.Name) - case ctx.GlobalBool(DeveloperFlag.Name): - cfg.DataDir = "" // unless explicitly requested, use memory databases - case ctx.GlobalBool(TestnetFlag.Name): - cfg.DataDir = filepath.Join(node.DefaultDataDir(), "testnet") - case ctx.GlobalBool(RinkebyFlag.Name): - cfg.DataDir = filepath.Join(node.DefaultDataDir(), "rinkeby") + if ctx.GlobalIsSet(ExternalSignerFlag.Name) { + cfg.ExternalSigner = ctx.GlobalString(ExternalSignerFlag.Name) } if ctx.GlobalIsSet(KeyStoreDirFlag.Name) { @@ -993,6 +1171,44 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { if ctx.GlobalIsSet(NoUSBFlag.Name) { cfg.NoUSB = ctx.GlobalBool(NoUSBFlag.Name) } + if ctx.GlobalIsSet(InsecureUnlockAllowedFlag.Name) { + cfg.InsecureUnlockAllowed = ctx.GlobalBool(InsecureUnlockAllowedFlag.Name) + } +} + +func setSmartCard(ctx *cli.Context, cfg *node.Config) { + // Skip enabling smartcards if no path is set + path := ctx.GlobalString(SmartCardDaemonPathFlag.Name) + if path == "" { + return + } + // Sanity check that the smartcard path is valid + fi, err := os.Stat(path) + if err != nil { + log.Info("Smartcard socket not found, disabling", "err", err) + return + } + if fi.Mode()&os.ModeType != os.ModeSocket { + log.Error("Invalid smartcard daemon path", "path", path, "type", fi.Mode().String()) + return + } + // Smartcard daemon path exists and is a socket, enable it + cfg.SmartCardDaemonPath = path +} + +func setDataDir(ctx *cli.Context, cfg *node.Config) { + switch { + case ctx.GlobalIsSet(DataDirFlag.Name): + cfg.DataDir = ctx.GlobalString(DataDirFlag.Name) + case ctx.GlobalBool(DeveloperFlag.Name): + cfg.DataDir = "" // unless explicitly requested, use memory databases + case ctx.GlobalBool(TestnetFlag.Name) && cfg.DataDir == node.DefaultDataDir(): + cfg.DataDir = filepath.Join(node.DefaultDataDir(), "testnet") + case ctx.GlobalBool(RinkebyFlag.Name) && cfg.DataDir == node.DefaultDataDir(): + cfg.DataDir = filepath.Join(node.DefaultDataDir(), "rinkeby") + case ctx.GlobalBool(GoerliFlag.Name) && cfg.DataDir == node.DefaultDataDir(): + cfg.DataDir = filepath.Join(node.DefaultDataDir(), "goerli") + } } func setGPO(ctx *cli.Context, cfg *gasprice.Config) { @@ -1068,10 +1284,66 @@ func setEthash(ctx *cli.Context, cfg *eth.Config) { } } -// checkExclusive verifies that only a single instance of the provided flags was +func setMiner(ctx *cli.Context, cfg *miner.Config) { + if ctx.GlobalIsSet(MinerNotifyFlag.Name) { + cfg.Notify = strings.Split(ctx.GlobalString(MinerNotifyFlag.Name), ",") + } + if ctx.GlobalIsSet(MinerLegacyExtraDataFlag.Name) { + cfg.ExtraData = []byte(ctx.GlobalString(MinerLegacyExtraDataFlag.Name)) + } + if ctx.GlobalIsSet(MinerExtraDataFlag.Name) { + cfg.ExtraData = []byte(ctx.GlobalString(MinerExtraDataFlag.Name)) + } + if ctx.GlobalIsSet(MinerLegacyGasTargetFlag.Name) { + cfg.GasFloor = ctx.GlobalUint64(MinerLegacyGasTargetFlag.Name) + } + if ctx.GlobalIsSet(MinerGasTargetFlag.Name) { + cfg.GasFloor = ctx.GlobalUint64(MinerGasTargetFlag.Name) + } + if ctx.GlobalIsSet(MinerGasLimitFlag.Name) { + cfg.GasCeil = ctx.GlobalUint64(MinerGasLimitFlag.Name) + } + if ctx.GlobalIsSet(MinerLegacyGasPriceFlag.Name) { + cfg.GasPrice = GlobalBig(ctx, MinerLegacyGasPriceFlag.Name) + } + if ctx.GlobalIsSet(MinerGasPriceFlag.Name) { + cfg.GasPrice = GlobalBig(ctx, MinerGasPriceFlag.Name) + } + if ctx.GlobalIsSet(MinerRecommitIntervalFlag.Name) { + cfg.Recommit = ctx.Duration(MinerRecommitIntervalFlag.Name) + } + if ctx.GlobalIsSet(MinerNoVerfiyFlag.Name) { + cfg.Noverify = ctx.Bool(MinerNoVerfiyFlag.Name) + } +} + +func setWhitelist(ctx *cli.Context, cfg *eth.Config) { + whitelist := ctx.GlobalString(WhitelistFlag.Name) + if whitelist == "" { + return + } + cfg.Whitelist = make(map[uint64]common.Hash) + for _, entry := range strings.Split(whitelist, ",") { + parts := strings.Split(entry, "=") + if len(parts) != 2 { + Fatalf("Invalid whitelist entry: %s", entry) + } + number, err := strconv.ParseUint(parts[0], 0, 64) + if err != nil { + Fatalf("Invalid whitelist block number %s: %v", parts[0], err) + } + var hash common.Hash + if err = hash.UnmarshalText([]byte(parts[1])); err != nil { + Fatalf("Invalid whitelist hash %s: %v", parts[1], err) + } + cfg.Whitelist[number] = hash + } +} + +// CheckExclusive verifies that only a single instance of the provided flags was // set by the user. Each flag might optionally be followed by a string type to // specialize it further. -func checkExclusive(ctx *cli.Context, args ...interface{}) { +func CheckExclusive(ctx *cli.Context, args ...interface{}) { set := make([]string, 0, 1) for i := 0; i < len(args); i++ { // Make sure the next argument is a flag and skip if not set @@ -1085,11 +1357,14 @@ func checkExclusive(ctx *cli.Context, args ...interface{}) { if i+1 < len(args) { switch option := args[i+1].(type) { case string: - // Extended flag, expand the name and shift the arguments + // Extended flag check, make sure value set doesn't conflict with passed in option if ctx.GlobalString(flag.GetName()) == option { name += "=" + option + set = append(set, "--"+name) } + // shift arguments and continue i++ + continue case cli.Flag: default: @@ -1122,74 +1397,51 @@ func SetShhConfig(ctx *cli.Context, stack *node.Node, cfg *whisper.Config) { // SetEthConfig applies eth-related command line flags to the config. func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { // Avoid conflicting network flags - checkExclusive(ctx, DeveloperFlag, TestnetFlag, RinkebyFlag) - checkExclusive(ctx, LightServFlag, SyncModeFlag, "light") + CheckExclusive(ctx, DeveloperFlag, TestnetFlag, RinkebyFlag, GoerliFlag) + CheckExclusive(ctx, LightLegacyServFlag, LightServeFlag, SyncModeFlag, "light") + CheckExclusive(ctx, DeveloperFlag, ExternalSignerFlag) // Can't use both ephemeral unlocked and external signer - ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) + var ks *keystore.KeyStore + if keystores := stack.AccountManager().Backends(keystore.KeyStoreType); len(keystores) > 0 { + ks = keystores[0].(*keystore.KeyStore) + } setEtherbase(ctx, ks, cfg) setGPO(ctx, &cfg.GPO) setTxPool(ctx, &cfg.TxPool) setEthash(ctx, cfg) + setMiner(ctx, &cfg.Miner) + setWhitelist(ctx, cfg) + setLes(ctx, cfg) if ctx.GlobalIsSet(SyncModeFlag.Name) { cfg.SyncMode = *GlobalTextMarshaler(ctx, SyncModeFlag.Name).(*downloader.SyncMode) } - if ctx.GlobalIsSet(LightServFlag.Name) { - cfg.LightServ = ctx.GlobalInt(LightServFlag.Name) - } - if ctx.GlobalIsSet(LightPeersFlag.Name) { - cfg.LightPeers = ctx.GlobalInt(LightPeersFlag.Name) - } if ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name) } - if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheDatabaseFlag.Name) { cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100 } cfg.DatabaseHandles = makeDatabaseHandles() + if ctx.GlobalIsSet(AncientFlag.Name) { + cfg.DatabaseFreezer = ctx.GlobalString(AncientFlag.Name) + } if gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != "full" && gcmode != "archive" { Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name) } cfg.NoPruning = ctx.GlobalString(GCModeFlag.Name) == "archive" + cfg.NoPrefetch = ctx.GlobalBool(CacheNoPrefetchFlag.Name) - if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) { - cfg.TrieCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100 + if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheTrieFlag.Name) { + cfg.TrieCleanCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheTrieFlag.Name) / 100 } - if ctx.GlobalIsSet(MinerNotifyFlag.Name) { - cfg.MinerNotify = strings.Split(ctx.GlobalString(MinerNotifyFlag.Name), ",") + if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) { + cfg.TrieDirtyCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100 } if ctx.GlobalIsSet(DocRootFlag.Name) { cfg.DocRoot = ctx.GlobalString(DocRootFlag.Name) } - if ctx.GlobalIsSet(MinerLegacyExtraDataFlag.Name) { - cfg.MinerExtraData = []byte(ctx.GlobalString(MinerLegacyExtraDataFlag.Name)) - } - if ctx.GlobalIsSet(MinerExtraDataFlag.Name) { - cfg.MinerExtraData = []byte(ctx.GlobalString(MinerExtraDataFlag.Name)) - } - if ctx.GlobalIsSet(MinerLegacyGasTargetFlag.Name) { - cfg.MinerGasFloor = ctx.GlobalUint64(MinerLegacyGasTargetFlag.Name) - } - if ctx.GlobalIsSet(MinerGasTargetFlag.Name) { - cfg.MinerGasFloor = ctx.GlobalUint64(MinerGasTargetFlag.Name) - } - if ctx.GlobalIsSet(MinerGasLimitFlag.Name) { - cfg.MinerGasCeil = ctx.GlobalUint64(MinerGasLimitFlag.Name) - } - if ctx.GlobalIsSet(MinerLegacyGasPriceFlag.Name) { - cfg.MinerGasPrice = GlobalBig(ctx, MinerLegacyGasPriceFlag.Name) - } - if ctx.GlobalIsSet(MinerGasPriceFlag.Name) { - cfg.MinerGasPrice = GlobalBig(ctx, MinerGasPriceFlag.Name) - } - if ctx.GlobalIsSet(MinerRecommitIntervalFlag.Name) { - cfg.MinerRecommit = ctx.Duration(MinerRecommitIntervalFlag.Name) - } - if ctx.GlobalIsSet(MinerNoVerfiyFlag.Name) { - cfg.MinerNoverify = ctx.Bool(MinerNoVerfiyFlag.Name) - } if ctx.GlobalIsSet(VMEnableDebugFlag.Name) { // TODO(fjl): force-enable this in --dev mode cfg.EnablePreimageRecording = ctx.GlobalBool(VMEnableDebugFlag.Name) @@ -1202,6 +1454,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { if ctx.GlobalIsSet(EVMInterpreterFlag.Name) { cfg.EVMInterpreter = ctx.GlobalString(EVMInterpreterFlag.Name) } + if ctx.GlobalIsSet(RPCGlobalGasCap.Name) { + cfg.RPCGasCap = new(big.Int).SetUint64(ctx.GlobalUint64(RPCGlobalGasCap.Name)) + } // Override any default configs for hard coded networks. switch { @@ -1215,6 +1470,11 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { cfg.NetworkId = 4 } cfg.Genesis = core.DefaultRinkebyGenesisBlock() + case ctx.GlobalBool(GoerliFlag.Name): + if !ctx.GlobalIsSet(NetworkIdFlag.Name) { + cfg.NetworkId = 5 + } + cfg.Genesis = core.DefaultGoerliGenesisBlock() case ctx.GlobalBool(DeveloperFlag.Name): if !ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = 1337 @@ -1239,13 +1499,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { cfg.Genesis = core.DeveloperGenesisBlock(uint64(ctx.GlobalInt(DeveloperPeriodFlag.Name)), developer.Address) if !ctx.GlobalIsSet(MinerGasPriceFlag.Name) && !ctx.GlobalIsSet(MinerLegacyGasPriceFlag.Name) { - cfg.MinerGasPrice = big.NewInt(1) + cfg.Miner.GasPrice = big.NewInt(1) } } - // TODO(fjl): move trie cache generations into config - if gen := ctx.GlobalInt(TrieCacheGenFlag.Name); gen > 0 { - state.MaxTrieCacheGen = uint16(gen) - } } // SetDashboardConfig applies dashboard related command line flags to the config. @@ -1304,12 +1560,33 @@ func RegisterEthStatsService(stack *node.Node, url string) { var lesServ *les.LightEthereum ctx.Service(&lesServ) + // Let ethstats use whichever is not nil return ethstats.New(url, ethServ, lesServ) }); err != nil { Fatalf("Failed to register the Ethereum Stats service: %v", err) } } +// RegisterGraphQLService is a utility function to construct a new service and register it against a node. +func RegisterGraphQLService(stack *node.Node, endpoint string, cors, vhosts []string, timeouts rpc.HTTPTimeouts) { + if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { + // Try to construct the GraphQL service backed by a full node + var ethServ *eth.Ethereum + if err := ctx.Service(ðServ); err == nil { + return graphql.New(ethServ.APIBackend, endpoint, cors, vhosts, timeouts) + } + // Try to construct the GraphQL service backed by a light node + var lesServ *les.LightEthereum + if err := ctx.Service(&lesServ); err == nil { + return graphql.New(lesServ.ApiBackend, endpoint, cors, vhosts, timeouts) + } + // Well, this should not have happened, bail out + return nil, errors.New("no Ethereum service") + }); err != nil { + Fatalf("Failed to register the GraphQL service: %v", err) + } +} + func SetupMetrics(ctx *cli.Context) { if metrics.Enabled { log.Info("Enabling metrics collection") @@ -1319,16 +1596,33 @@ func SetupMetrics(ctx *cli.Context) { database = ctx.GlobalString(MetricsInfluxDBDatabaseFlag.Name) username = ctx.GlobalString(MetricsInfluxDBUsernameFlag.Name) password = ctx.GlobalString(MetricsInfluxDBPasswordFlag.Name) - hosttag = ctx.GlobalString(MetricsInfluxDBHostTagFlag.Name) ) if enableExport { + tagsMap := SplitTagsFlag(ctx.GlobalString(MetricsInfluxDBTagsFlag.Name)) + log.Info("Enabling metrics export to InfluxDB") - go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "geth.", map[string]string{ - "host": hosttag, - }) + + go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "geth.", tagsMap) + } + } +} + +func SplitTagsFlag(tagsFlag string) map[string]string { + tags := strings.Split(tagsFlag, ",") + tagsMap := map[string]string{} + + for _, t := range tags { + if t != "" { + kv := strings.Split(t, "=") + + if len(kv) == 2 { + tagsMap[kv[0]] = kv[1] + } } } + + return tagsMap } // MakeChainDatabase open an LevelDB using the flags passed to the client and will hard crash if it fails. @@ -1341,7 +1635,7 @@ func MakeChainDatabase(ctx *cli.Context, stack *node.Node) ethdb.Database { if ctx.GlobalString(SyncModeFlag.Name) == "light" { name = "lightchaindata" } - chainDb, err := stack.OpenDatabase(name, cache, handles) + chainDb, err := stack.OpenDatabaseWithFreezer(name, cache, handles, ctx.GlobalString(AncientFlag.Name), "") if err != nil { Fatalf("Could not open database: %v", err) } @@ -1355,6 +1649,8 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { genesis = core.DefaultTestnetGenesisBlock() case ctx.GlobalBool(RinkebyFlag.Name): genesis = core.DefaultRinkebyGenesisBlock() + case ctx.GlobalBool(GoerliFlag.Name): + genesis = core.DefaultGoerliGenesisBlock() case ctx.GlobalBool(DeveloperFlag.Name): Fatalf("Developer chains are ephemeral") } @@ -1365,7 +1661,6 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chainDb ethdb.Database) { var err error chainDb = MakeChainDatabase(ctx, stack) - config, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx)) if err != nil { Fatalf("%v", err) @@ -1390,12 +1685,17 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name) } cache := &core.CacheConfig{ - Disabled: ctx.GlobalString(GCModeFlag.Name) == "archive", - TrieNodeLimit: eth.DefaultConfig.TrieCache, - TrieTimeLimit: eth.DefaultConfig.TrieTimeout, + TrieCleanLimit: eth.DefaultConfig.TrieCleanCache, + TrieCleanNoPrefetch: ctx.GlobalBool(CacheNoPrefetchFlag.Name), + TrieDirtyLimit: eth.DefaultConfig.TrieDirtyCache, + TrieDirtyDisabled: ctx.GlobalString(GCModeFlag.Name) == "archive", + TrieTimeLimit: eth.DefaultConfig.TrieTimeout, + } + if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheTrieFlag.Name) { + cache.TrieCleanLimit = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheTrieFlag.Name) / 100 } if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) { - cache.TrieNodeLimit = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100 + cache.TrieDirtyLimit = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100 } vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)} chain, err = core.NewBlockChain(chainDb, cache, config, engine, vmcfg, nil) @@ -1413,7 +1713,7 @@ func MakeConsolePreloads(ctx *cli.Context) []string { return nil } // Otherwise resolve absolute paths and return them - preloads := []string{} + var preloads []string assets := ctx.GlobalString(JSpathFlag.Name) for _, file := range strings.Split(ctx.GlobalString(PreloadJSFlag.Name), ",") { diff --git a/cmd/utils/flags_test.go b/cmd/utils/flags_test.go new file mode 100644 index 000000000000..adfdd0903e8d --- /dev/null +++ b/cmd/utils/flags_test.go @@ -0,0 +1,64 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +// Package utils contains internal helper functions for go-ethereum commands. +package utils + +import ( + "reflect" + "testing" +) + +func Test_SplitTagsFlag(t *testing.T) { + tests := []struct { + name string + args string + want map[string]string + }{ + { + "2 tags case", + "host=localhost,bzzkey=123", + map[string]string{ + "host": "localhost", + "bzzkey": "123", + }, + }, + { + "1 tag case", + "host=localhost123", + map[string]string{ + "host": "localhost123", + }, + }, + { + "empty case", + "", + map[string]string{}, + }, + { + "garbage", + "smth=smthelse=123", + map[string]string{}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := SplitTagsFlag(tt.args); !reflect.DeepEqual(got, tt.want) { + t.Errorf("splitTagsFlag() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/cmd/wnode/main.go b/cmd/wnode/main.go index 97e5852013bf..99cf84ec1bfa 100644 --- a/cmd/wnode/main.go +++ b/cmd/wnode/main.go @@ -203,7 +203,7 @@ func initialize() { if len(*argEnode) == 0 { argEnode = scanLineA("Please enter the peer's enode: ") } - peer := enode.MustParseV4(*argEnode) + peer := enode.MustParse(*argEnode) peers = append(peers, peer) } @@ -747,9 +747,9 @@ func requestExpiredMessagesLoop() { } func extractIDFromEnode(s string) []byte { - n, err := enode.ParseV4(s) + n, err := enode.Parse(enode.ValidSchemes, s) if err != nil { - utils.Fatalf("Failed to parse enode: %s", err) + utils.Fatalf("Failed to parse node: %s", err) } return n.ID().Bytes() } diff --git a/common/bitutil/bitutil_test.go b/common/bitutil/bitutil_test.go index 93647031ef84..307bf731f765 100644 --- a/common/bitutil/bitutil_test.go +++ b/common/bitutil/bitutil_test.go @@ -190,6 +190,8 @@ func benchmarkBaseOR(b *testing.B, size int) { } } +var GloBool bool // Exported global will not be dead-code eliminated, at least not yet. + // Benchmarks the potentially optimized bit testing performance. func BenchmarkFastTest1KB(b *testing.B) { benchmarkFastTest(b, 1024) } func BenchmarkFastTest2KB(b *testing.B) { benchmarkFastTest(b, 2048) } @@ -197,9 +199,11 @@ func BenchmarkFastTest4KB(b *testing.B) { benchmarkFastTest(b, 4096) } func benchmarkFastTest(b *testing.B, size int) { p := make([]byte, size) + a := false for i := 0; i < b.N; i++ { - TestBytes(p) + a = a != TestBytes(p) } + GloBool = a // Use of benchmark "result" to prevent total dead code elimination. } // Benchmarks the baseline bit testing performance. @@ -209,7 +213,9 @@ func BenchmarkBaseTest4KB(b *testing.B) { benchmarkBaseTest(b, 4096) } func benchmarkBaseTest(b *testing.B, size int) { p := make([]byte, size) + a := false for i := 0; i < b.N; i++ { - safeTestBytes(p) + a = a != safeTestBytes(p) } + GloBool = a // Use of benchmark "result" to prevent total dead code elimination. } diff --git a/common/bytes.go b/common/bytes.go index 0c257a1ee0b6..c82e61624187 100644 --- a/common/bytes.go +++ b/common/bytes.go @@ -31,6 +31,15 @@ func ToHex(b []byte) string { return "0x" + hex } +// ToHexArray creates a array of hex-string based on []byte +func ToHexArray(b [][]byte) []string { + r := make([]string, len(b)) + for i := range b { + r[i] = ToHex(b[i]) + } + return r +} + // FromHex returns the bytes represented by the hexadecimal string s. // s may be prefixed with "0x". func FromHex(s string) []byte { diff --git a/common/compiler/helpers.go b/common/compiler/helpers.go new file mode 100644 index 000000000000..5ed640de8f0e --- /dev/null +++ b/common/compiler/helpers.go @@ -0,0 +1,65 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper). +package compiler + +import ( + "bytes" + "io/ioutil" + "regexp" +) + +var versionRegexp = regexp.MustCompile(`([0-9]+)\.([0-9]+)\.([0-9]+)`) + +// Contract contains information about a compiled contract, alongside its code and runtime code. +type Contract struct { + Code string `json:"code"` + RuntimeCode string `json:"runtime-code"` + Info ContractInfo `json:"info"` + Hashes map[string]string `json:"hashes"` +} + +// ContractInfo contains information about a compiled contract, including access +// to the ABI definition, source mapping, user and developer docs, and metadata. +// +// Depending on the source, language version, compiler version, and compiler +// options will provide information about how the contract was compiled. +type ContractInfo struct { + Source string `json:"source"` + Language string `json:"language"` + LanguageVersion string `json:"languageVersion"` + CompilerVersion string `json:"compilerVersion"` + CompilerOptions string `json:"compilerOptions"` + SrcMap interface{} `json:"srcMap"` + SrcMapRuntime string `json:"srcMapRuntime"` + AbiDefinition interface{} `json:"abiDefinition"` + UserDoc interface{} `json:"userDoc"` + DeveloperDoc interface{} `json:"developerDoc"` + Metadata string `json:"metadata"` +} + +func slurpFiles(files []string) (string, error) { + var concat bytes.Buffer + for _, file := range files { + content, err := ioutil.ReadFile(file) + if err != nil { + return "", err + } + concat.Write(content) + } + return concat.String(), nil +} diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index f6e8d2e42a6e..50b32d7e5864 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package compiler wraps the Solidity compiler executable (solc). +// Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper). package compiler import ( @@ -22,38 +22,11 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "os/exec" - "regexp" "strconv" "strings" ) -var versionRegexp = regexp.MustCompile(`([0-9]+)\.([0-9]+)\.([0-9]+)`) - -// Contract contains information about a compiled contract, alongside its code. -type Contract struct { - Code string `json:"code"` - Info ContractInfo `json:"info"` -} - -// ContractInfo contains information about a compiled contract, including access -// to the ABI definition, user and developer docs, and metadata. -// -// Depending on the source, language version, compiler version, and compiler -// options will provide information about how the contract was compiled. -type ContractInfo struct { - Source string `json:"source"` - Language string `json:"language"` - LanguageVersion string `json:"languageVersion"` - CompilerVersion string `json:"compilerVersion"` - CompilerOptions string `json:"compilerOptions"` - AbiDefinition interface{} `json:"abiDefinition"` - UserDoc interface{} `json:"userDoc"` - DeveloperDoc interface{} `json:"developerDoc"` - Metadata string `json:"metadata"` -} - // Solidity contains information about the solidity compiler. type Solidity struct { Path, Version, FullVersion string @@ -63,18 +36,21 @@ type Solidity struct { // --combined-output format type solcOutput struct { Contracts map[string]struct { - Bin, Abi, Devdoc, Userdoc, Metadata string + BinRuntime string `json:"bin-runtime"` + SrcMapRuntime string `json:"srcmap-runtime"` + Bin, SrcMap, Abi, Devdoc, Userdoc, Metadata string + Hashes map[string]string } Version string } func (s *Solidity) makeArgs() []string { p := []string{ - "--combined-json", "bin,abi,userdoc,devdoc", + "--combined-json", "bin,bin-runtime,srcmap,srcmap-runtime,abi,userdoc,devdoc", "--optimize", // code optimizer switched on } if s.Major > 0 || s.Minor > 4 || s.Patch > 6 { - p[1] += ",metadata" + p[1] += ",metadata,hashes" } return p } @@ -157,7 +133,7 @@ func (s *Solidity) run(cmd *exec.Cmd, source string) (map[string]*Contract, erro // provided source, language and compiler version, and compiler options are all // passed through into the Contract structs. // -// The solc output is expected to contain ABI, user docs, and dev docs. +// The solc output is expected to contain ABI, source mapping, user docs, and dev docs. // // Returns an error if the JSON is malformed or missing data, or if the JSON // embedded within the JSON is malformed. @@ -166,7 +142,6 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin if err := json.Unmarshal(combinedJSON, &output); err != nil { return nil, err } - // Compilation succeeded, assemble and return the contracts. contracts := make(map[string]*Contract) for name, info := range output.Contracts { @@ -175,22 +150,22 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin if err := json.Unmarshal([]byte(info.Abi), &abi); err != nil { return nil, fmt.Errorf("solc: error reading abi definition (%v)", err) } - var userdoc interface{} - if err := json.Unmarshal([]byte(info.Userdoc), &userdoc); err != nil { - return nil, fmt.Errorf("solc: error reading user doc: %v", err) - } - var devdoc interface{} - if err := json.Unmarshal([]byte(info.Devdoc), &devdoc); err != nil { - return nil, fmt.Errorf("solc: error reading dev doc: %v", err) - } + var userdoc, devdoc interface{} + json.Unmarshal([]byte(info.Userdoc), &userdoc) + json.Unmarshal([]byte(info.Devdoc), &devdoc) + contracts[name] = &Contract{ - Code: "0x" + info.Bin, + Code: "0x" + info.Bin, + RuntimeCode: "0x" + info.BinRuntime, + Hashes: info.Hashes, Info: ContractInfo{ Source: source, Language: "Solidity", LanguageVersion: languageVersion, CompilerVersion: compilerVersion, CompilerOptions: compilerOptions, + SrcMap: info.SrcMap, + SrcMapRuntime: info.SrcMapRuntime, AbiDefinition: abi, UserDoc: userdoc, DeveloperDoc: devdoc, @@ -200,15 +175,3 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin } return contracts, nil } - -func slurpFiles(files []string) (string, error) { - var concat bytes.Buffer - for _, file := range files { - content, err := ioutil.ReadFile(file) - if err != nil { - return "", err - } - concat.Write(content) - } - return concat.String(), nil -} diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index 0da3bb337e89..491e3665e2c0 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -23,9 +23,10 @@ import ( const ( testSource = ` +pragma solidity >0.0.0; contract test { /// @notice Will multiply ` + "`a`" + ` by 7. - function multiply(uint a) returns(uint d) { + function multiply(uint a) public returns(uint d) { return a * 7; } } @@ -38,7 +39,7 @@ func skipWithoutSolc(t *testing.T) { } } -func TestCompiler(t *testing.T) { +func TestSolidityCompiler(t *testing.T) { skipWithoutSolc(t) contracts, err := CompileSolidityString("", testSource) @@ -66,7 +67,7 @@ func TestCompiler(t *testing.T) { } } -func TestCompileError(t *testing.T) { +func TestSolidityCompileError(t *testing.T) { skipWithoutSolc(t) contracts, err := CompileSolidityString("", testSource[4:]) diff --git a/common/compiler/test.v.py b/common/compiler/test.v.py new file mode 100644 index 000000000000..35af56c8f6ef --- /dev/null +++ b/common/compiler/test.v.py @@ -0,0 +1,3 @@ +@public +def test(): + hello: int128 diff --git a/common/compiler/test_bad.v.py b/common/compiler/test_bad.v.py new file mode 100644 index 000000000000..443ef7826325 --- /dev/null +++ b/common/compiler/test_bad.v.py @@ -0,0 +1,3 @@ +lic +def test(): + hello: int128 diff --git a/common/compiler/vyper.go b/common/compiler/vyper.go new file mode 100644 index 000000000000..a9bca95e5901 --- /dev/null +++ b/common/compiler/vyper.go @@ -0,0 +1,144 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper). +package compiler + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "os/exec" + "strconv" + "strings" +) + +// Vyper contains information about the vyper compiler. +type Vyper struct { + Path, Version, FullVersion string + Major, Minor, Patch int +} + +func (s *Vyper) makeArgs() []string { + p := []string{ + "-f", "combined_json", + } + return p +} + +// VyperVersion runs vyper and parses its version output. +func VyperVersion(vyper string) (*Vyper, error) { + if vyper == "" { + vyper = "vyper" + } + var out bytes.Buffer + cmd := exec.Command(vyper, "--version") + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + return nil, err + } + matches := versionRegexp.FindStringSubmatch(out.String()) + if len(matches) != 4 { + return nil, fmt.Errorf("can't parse vyper version %q", out.String()) + } + s := &Vyper{Path: cmd.Path, FullVersion: out.String(), Version: matches[0]} + if s.Major, err = strconv.Atoi(matches[1]); err != nil { + return nil, err + } + if s.Minor, err = strconv.Atoi(matches[2]); err != nil { + return nil, err + } + if s.Patch, err = strconv.Atoi(matches[3]); err != nil { + return nil, err + } + return s, nil +} + +// CompileVyper compiles all given Vyper source files. +func CompileVyper(vyper string, sourcefiles ...string) (map[string]*Contract, error) { + if len(sourcefiles) == 0 { + return nil, errors.New("vyper: no source files") + } + source, err := slurpFiles(sourcefiles) + if err != nil { + return nil, err + } + s, err := VyperVersion(vyper) + if err != nil { + return nil, err + } + args := s.makeArgs() + cmd := exec.Command(s.Path, append(args, sourcefiles...)...) + return s.run(cmd, source) +} + +func (s *Vyper) run(cmd *exec.Cmd, source string) (map[string]*Contract, error) { + var stderr, stdout bytes.Buffer + cmd.Stderr = &stderr + cmd.Stdout = &stdout + if err := cmd.Run(); err != nil { + return nil, fmt.Errorf("vyper: %v\n%s", err, stderr.Bytes()) + } + + return ParseVyperJSON(stdout.Bytes(), source, s.Version, s.Version, strings.Join(s.makeArgs(), " ")) +} + +// ParseVyperJSON takes the direct output of a vyper --f combined_json run and +// parses it into a map of string contract name to Contract structs. The +// provided source, language and compiler version, and compiler options are all +// passed through into the Contract structs. +// +// The vyper output is expected to contain ABI and source mapping. +// +// Returns an error if the JSON is malformed or missing data, or if the JSON +// embedded within the JSON is malformed. +func ParseVyperJSON(combinedJSON []byte, source string, languageVersion string, compilerVersion string, compilerOptions string) (map[string]*Contract, error) { + var output map[string]interface{} + if err := json.Unmarshal(combinedJSON, &output); err != nil { + return nil, err + } + + // Compilation succeeded, assemble and return the contracts. + contracts := make(map[string]*Contract) + for name, info := range output { + // Parse the individual compilation results. + if name == "version" { + continue + } + c := info.(map[string]interface{}) + + contracts[name] = &Contract{ + Code: c["bytecode"].(string), + RuntimeCode: c["bytecode_runtime"].(string), + Info: ContractInfo{ + Source: source, + Language: "Vyper", + LanguageVersion: languageVersion, + CompilerVersion: compilerVersion, + CompilerOptions: compilerOptions, + SrcMap: c["source_map"], + SrcMapRuntime: "", + AbiDefinition: c["abi"], + UserDoc: "", + DeveloperDoc: "", + Metadata: "", + }, + } + } + return contracts, nil +} diff --git a/common/compiler/vyper_test.go b/common/compiler/vyper_test.go new file mode 100644 index 000000000000..7761c92affc5 --- /dev/null +++ b/common/compiler/vyper_test.go @@ -0,0 +1,71 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package compiler + +import ( + "os/exec" + "testing" +) + +func skipWithoutVyper(t *testing.T) { + if _, err := exec.LookPath("vyper"); err != nil { + t.Skip(err) + } +} + +func TestVyperCompiler(t *testing.T) { + skipWithoutVyper(t) + + testSource := []string{"test.v.py"} + source, err := slurpFiles(testSource) + if err != nil { + t.Error("couldn't read test files") + } + contracts, err := CompileVyper("", testSource...) + if err != nil { + t.Fatalf("error compiling test.v.py. result %v: %v", contracts, err) + } + if len(contracts) != 1 { + t.Errorf("one contract expected, got %d", len(contracts)) + } + c, ok := contracts["test.v.py"] + if !ok { + c, ok = contracts[":test"] + if !ok { + t.Fatal("info for contract 'test.v.py' not present in result") + } + } + if c.Code == "" { + t.Error("empty code") + } + if c.Info.Source != source { + t.Error("wrong source") + } + if c.Info.CompilerVersion == "" { + t.Error("empty version") + } +} + +func TestVyperCompileError(t *testing.T) { + skipWithoutVyper(t) + + contracts, err := CompileVyper("", "test_bad.v.py") + if err == nil { + t.Errorf("error expected compiling test_bad.v.py. got none. result %v", contracts) + } + t.Logf("error: %v", err) +} diff --git a/common/fdlimit/fdlimit_darwin.go b/common/fdlimit/fdlimit_darwin.go new file mode 100644 index 000000000000..6b26fa00f12c --- /dev/null +++ b/common/fdlimit/fdlimit_darwin.go @@ -0,0 +1,71 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package fdlimit + +import "syscall" + +// hardlimit is the number of file descriptors allowed at max by the kernel. +const hardlimit = 10240 + +// Raise tries to maximize the file descriptor allowance of this process +// to the maximum hard-limit allowed by the OS. +// Returns the size it was set to (may differ from the desired 'max') +func Raise(max uint64) (uint64, error) { + // Get the current limit + var limit syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + // Try to update the limit to the max allowance + limit.Cur = limit.Max + if limit.Cur > max { + limit.Cur = max + } + if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + // MacOS can silently apply further caps, so retrieve the actually set limit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + return limit.Cur, nil +} + +// Current retrieves the number of file descriptors allowed to be opened by this +// process. +func Current() (int, error) { + var limit syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + return int(limit.Cur), nil +} + +// Maximum retrieves the maximum number of file descriptors this process is +// allowed to request for itself. +func Maximum() (int, error) { + // Retrieve the maximum allowed by dynamic OS limits + var limit syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + // Cap it to OPEN_MAX (10240) because macos is a special snowflake + if limit.Max > hardlimit { + limit.Max = hardlimit + } + return int(limit.Max), nil +} diff --git a/common/fdlimit/fdlimit_freebsd.go b/common/fdlimit/fdlimit_freebsd.go index c126b0c26583..0d8727138e6d 100644 --- a/common/fdlimit/fdlimit_freebsd.go +++ b/common/fdlimit/fdlimit_freebsd.go @@ -26,11 +26,11 @@ import "syscall" // Raise tries to maximize the file descriptor allowance of this process // to the maximum hard-limit allowed by the OS. -func Raise(max uint64) error { +func Raise(max uint64) (uint64, error) { // Get the current limit var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { - return err + return 0, err } // Try to update the limit to the max allowance limit.Cur = limit.Max @@ -38,9 +38,12 @@ func Raise(max uint64) error { limit.Cur = int64(max) } if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { - return err + return 0, err + } + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err } - return nil + return uint64(limit.Cur), nil } // Current retrieves the number of file descriptors allowed to be opened by this diff --git a/common/fdlimit/fdlimit_test.go b/common/fdlimit/fdlimit_test.go index a9ee9ab36a9b..21362b8463a3 100644 --- a/common/fdlimit/fdlimit_test.go +++ b/common/fdlimit/fdlimit_test.go @@ -36,7 +36,7 @@ func TestFileDescriptorLimits(t *testing.T) { if limit, err := Current(); err != nil || limit <= 0 { t.Fatalf("failed to retrieve file descriptor limit (%d): %v", limit, err) } - if err := Raise(uint64(target)); err != nil { + if _, err := Raise(uint64(target)); err != nil { t.Fatalf("failed to raise file allowance") } if limit, err := Current(); err != nil || limit < target { diff --git a/common/fdlimit/fdlimit_unix.go b/common/fdlimit/fdlimit_unix.go index a258132353cd..e5a575f7a79d 100644 --- a/common/fdlimit/fdlimit_unix.go +++ b/common/fdlimit/fdlimit_unix.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build linux darwin netbsd openbsd solaris +// +build linux netbsd openbsd solaris package fdlimit @@ -22,11 +22,12 @@ import "syscall" // Raise tries to maximize the file descriptor allowance of this process // to the maximum hard-limit allowed by the OS. -func Raise(max uint64) error { +// Returns the size it was set to (may differ from the desired 'max') +func Raise(max uint64) (uint64, error) { // Get the current limit var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { - return err + return 0, err } // Try to update the limit to the max allowance limit.Cur = limit.Max @@ -34,9 +35,13 @@ func Raise(max uint64) error { limit.Cur = max } if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { - return err + return 0, err + } + // MacOS can silently apply further caps, so retrieve the actually set limit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err } - return nil + return limit.Cur, nil } // Current retrieves the number of file descriptors allowed to be opened by this diff --git a/common/fdlimit/fdlimit_windows.go b/common/fdlimit/fdlimit_windows.go index 863c58bedfab..f472153662e6 100644 --- a/common/fdlimit/fdlimit_windows.go +++ b/common/fdlimit/fdlimit_windows.go @@ -16,28 +16,31 @@ package fdlimit -import "errors" +import "fmt" + +// hardlimit is the number of file descriptors allowed at max by the kernel. +const hardlimit = 16384 // Raise tries to maximize the file descriptor allowance of this process // to the maximum hard-limit allowed by the OS. -func Raise(max uint64) error { +func Raise(max uint64) (uint64, error) { // This method is NOP by design: // * Linux/Darwin counterparts need to manually increase per process limits // * On Windows Go uses the CreateFile API, which is limited to 16K files, non // changeable from within a running process // This way we can always "request" raising the limits, which will either have // or not have effect based on the platform we're running on. - if max > 16384 { - return errors.New("file descriptor limit (16384) reached") + if max > hardlimit { + return hardlimit, fmt.Errorf("file descriptor limit (%d) reached", hardlimit) } - return nil + return max, nil } // Current retrieves the number of file descriptors allowed to be opened by this // process. func Current() (int, error) { // Please see Raise for the reason why we use hard coded 16K as the limit - return 16384, nil + return hardlimit, nil } // Maximum retrieves the maximum number of file descriptors this process is diff --git a/common/hexutil/json.go b/common/hexutil/json.go index fbc21241c8ad..777b08eca42a 100644 --- a/common/hexutil/json.go +++ b/common/hexutil/json.go @@ -72,6 +72,25 @@ func (b Bytes) String() string { return Encode(b) } +// ImplementsGraphQLType returns true if Bytes implements the specified GraphQL type. +func (b Bytes) ImplementsGraphQLType(name string) bool { return name == "Bytes" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (b *Bytes) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + data, err := Decode(input) + if err != nil { + return err + } + *b = data + default: + err = fmt.Errorf("Unexpected type for Bytes: %v", input) + } + return err +} + // UnmarshalFixedJSON decodes the input as a string with 0x prefix. The length of out // determines the required input length. This function is commonly used to implement the // UnmarshalJSON method for fixed-size types. @@ -187,6 +206,25 @@ func (b *Big) String() string { return EncodeBig(b.ToInt()) } +// ImplementsGraphQLType returns true if Big implements the provided GraphQL type. +func (b Big) ImplementsGraphQLType(name string) bool { return name == "BigInt" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (b *Big) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + return b.UnmarshalText([]byte(input)) + case int32: + var num big.Int + num.SetInt64(int64(input)) + *b = Big(num) + default: + err = fmt.Errorf("Unexpected type for BigInt: %v", input) + } + return err +} + // Uint64 marshals/unmarshals as a JSON string with 0x prefix. // The zero value marshals as "0x0". type Uint64 uint64 @@ -234,6 +272,23 @@ func (b Uint64) String() string { return EncodeUint64(uint64(b)) } +// ImplementsGraphQLType returns true if Uint64 implements the provided GraphQL type. +func (b Uint64) ImplementsGraphQLType(name string) bool { return name == "Long" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (b *Uint64) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + return b.UnmarshalText([]byte(input)) + case int32: + *b = Uint64(input) + default: + err = fmt.Errorf("Unexpected type for Long: %v", input) + } + return err +} + // Uint marshals/unmarshals as a JSON string with 0x prefix. // The zero value marshals as "0x0". type Uint uint diff --git a/common/math/big.go b/common/math/big.go index 9d2e7946d155..d31c59af10ab 100644 --- a/common/math/big.go +++ b/common/math/big.go @@ -42,6 +42,13 @@ const ( // HexOrDecimal256 marshals big.Int as hex or decimal. type HexOrDecimal256 big.Int +// NewHexOrDecimal256 creates a new HexOrDecimal256 +func NewHexOrDecimal256(x int64) *HexOrDecimal256 { + b := big.NewInt(x) + h := HexOrDecimal256(*b) + return &h +} + // UnmarshalText implements encoding.TextUnmarshaler. func (i *HexOrDecimal256) UnmarshalText(input []byte) error { bigint, ok := ParseBig256(string(input)) diff --git a/common/prque/prque.go b/common/prque/prque.go index 9fd31a2e5d1f..3cc5a1adaf15 100755 --- a/common/prque/prque.go +++ b/common/prque/prque.go @@ -1,5 +1,20 @@ +// CookieJar - A contestant's algorithm toolbox +// Copyright (c) 2013 Peter Szilagyi. All rights reserved. +// +// CookieJar is dual licensed: use of this source code is governed by a BSD +// license that can be found in the LICENSE file. Alternatively, the CookieJar +// toolbox may be used in accordance with the terms and conditions contained +// in a signed written agreement between you and the author(s). + // This is a duplicated and slightly modified version of "gopkg.in/karalabe/cookiejar.v2/collections/prque". +// Package prque implements a priority queue data structure supporting arbitrary +// value types and int64 priorities. +// +// If you would like to use a min-priority queue, simply negate the priorities. +// +// Internally the queue is based on the standard heap package working on a +// sortable version of the block based stack. package prque import ( @@ -11,8 +26,8 @@ type Prque struct { cont *sstack } -// Creates a new priority queue. -func New(setIndex setIndexCallback) *Prque { +// New creates a new priority queue. +func New(setIndex SetIndexCallback) *Prque { return &Prque{newSstack(setIndex)} } @@ -21,6 +36,12 @@ func (p *Prque) Push(data interface{}, priority int64) { heap.Push(p.cont, &item{data, priority}) } +// Peek returns the value with the greates priority but does not pop it off. +func (p *Prque) Peek() (interface{}, int64) { + item := p.cont.blocks[0][0] + return item.value, item.priority +} + // Pops the value with the greates priority off the stack and returns it. // Currently no shrinking is done. func (p *Prque) Pop() (interface{}, int64) { diff --git a/common/prque/sstack.go b/common/prque/sstack.go index 4875dae99d96..8518af54ff1a 100755 --- a/common/prque/sstack.go +++ b/common/prque/sstack.go @@ -1,3 +1,11 @@ +// CookieJar - A contestant's algorithm toolbox +// Copyright (c) 2013 Peter Szilagyi. All rights reserved. +// +// CookieJar is dual licensed: use of this source code is governed by a BSD +// license that can be found in the LICENSE file. Alternatively, the CookieJar +// toolbox may be used in accordance with the terms and conditions contained +// in a signed written agreement between you and the author(s). + // This is a duplicated and slightly modified version of "gopkg.in/karalabe/cookiejar.v2/collections/prque". package prque @@ -14,16 +22,16 @@ type item struct { priority int64 } -// setIndexCallback is called when the element is moved to a new index. -// Providing setIndexCallback is optional, it is needed only if the application needs +// SetIndexCallback is called when the element is moved to a new index. +// Providing SetIndexCallback is optional, it is needed only if the application needs // to delete elements other than the top one. -type setIndexCallback func(a interface{}, i int) +type SetIndexCallback func(data interface{}, index int) // Internal sortable stack data structure. Implements the Push and Pop ops for // the stack (heap) functionality and the Len, Less and Swap methods for the // sortability requirements of the heaps. type sstack struct { - setIndex setIndexCallback + setIndex SetIndexCallback size int capacity int offset int @@ -33,7 +41,7 @@ type sstack struct { } // Creates a new, empty stack. -func newSstack(setIndex setIndexCallback) *sstack { +func newSstack(setIndex SetIndexCallback) *sstack { result := new(sstack) result.setIndex = setIndex result.active = make([]*item, blockSize) diff --git a/common/size.go b/common/size.go index bd0fc85c7dcc..097b6304a8d0 100644 --- a/common/size.go +++ b/common/size.go @@ -26,10 +26,14 @@ type StorageSize float64 // String implements the stringer interface. func (s StorageSize) String() string { - if s > 1000000 { - return fmt.Sprintf("%.2f mB", s/1000000) - } else if s > 1000 { - return fmt.Sprintf("%.2f kB", s/1000) + if s > 1099511627776 { + return fmt.Sprintf("%.2f TiB", s/1099511627776) + } else if s > 1073741824 { + return fmt.Sprintf("%.2f GiB", s/1073741824) + } else if s > 1048576 { + return fmt.Sprintf("%.2f MiB", s/1048576) + } else if s > 1024 { + return fmt.Sprintf("%.2f KiB", s/1024) } else { return fmt.Sprintf("%.2f B", s) } @@ -38,10 +42,14 @@ func (s StorageSize) String() string { // TerminalString implements log.TerminalStringer, formatting a string for console // output during logging. func (s StorageSize) TerminalString() string { - if s > 1000000 { - return fmt.Sprintf("%.2fmB", s/1000000) - } else if s > 1000 { - return fmt.Sprintf("%.2fkB", s/1000) + if s > 1099511627776 { + return fmt.Sprintf("%.2fTiB", s/1099511627776) + } else if s > 1073741824 { + return fmt.Sprintf("%.2fGiB", s/1073741824) + } else if s > 1048576 { + return fmt.Sprintf("%.2fMiB", s/1048576) + } else if s > 1024 { + return fmt.Sprintf("%.2fKiB", s/1024) } else { return fmt.Sprintf("%.2fB", s) } diff --git a/common/size_test.go b/common/size_test.go index f5b6c725e237..0938d483c4bb 100644 --- a/common/size_test.go +++ b/common/size_test.go @@ -25,8 +25,8 @@ func TestStorageSizeString(t *testing.T) { size StorageSize str string }{ - {2381273, "2.38 mB"}, - {2192, "2.19 kB"}, + {2381273, "2.27 MiB"}, + {2192, "2.14 KiB"}, {12, "12.00 B"}, } diff --git a/common/types.go b/common/types.go index a4b9995267dd..98c83edd4fa2 100644 --- a/common/types.go +++ b/common/types.go @@ -27,7 +27,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto/sha3" + "golang.org/x/crypto/sha3" ) // Lengths of hashes and addresses in bytes. @@ -141,6 +141,21 @@ func (h Hash) Value() (driver.Value, error) { return h[:], nil } +// ImplementsGraphQLType returns true if Hash implements the specified GraphQL type. +func (_ Hash) ImplementsGraphQLType(name string) bool { return name == "Bytes32" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (h *Hash) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + *h = HexToHash(input) + default: + err = fmt.Errorf("Unexpected type for Bytes32: %v", input) + } + return err +} + // UnprefixedHash allows marshaling a Hash without 0x prefix. type UnprefixedHash Hash @@ -187,16 +202,13 @@ func IsHexAddress(s string) bool { // Bytes gets the string representation of the underlying address. func (a Address) Bytes() []byte { return a[:] } -// Big converts an address to a big integer. -func (a Address) Big() *big.Int { return new(big.Int).SetBytes(a[:]) } - // Hash converts an address to a hash by left-padding it with zeros. func (a Address) Hash() Hash { return BytesToHash(a[:]) } // Hex returns an EIP55-compliant hex string representation of the address. func (a Address) Hex() string { unchecksummed := hex.EncodeToString(a[:]) - sha := sha3.NewKeccak256() + sha := sha3.NewLegacyKeccak256() sha.Write([]byte(unchecksummed)) hash := sha.Sum(nil) @@ -268,6 +280,21 @@ func (a Address) Value() (driver.Value, error) { return a[:], nil } +// ImplementsGraphQLType returns true if Hash implements the specified GraphQL type. +func (a Address) ImplementsGraphQLType(name string) bool { return name == "Address" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (a *Address) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + *a = HexToAddress(input) + default: + err = fmt.Errorf("Unexpected type for Address: %v", input) + } + return err +} + // UnprefixedAddress allows marshaling an Address without 0x prefix. type UnprefixedAddress Address diff --git a/common/types_test.go b/common/types_test.go index 7095ccd0191b..fffd673c6ee2 100644 --- a/common/types_test.go +++ b/common/types_test.go @@ -114,8 +114,8 @@ func TestAddressUnmarshalJSON(t *testing.T) { if test.ShouldErr { t.Errorf("test #%d: expected error, got none", i) } - if v.Big().Cmp(test.Output) != 0 { - t.Errorf("test #%d: address mismatch: have %v, want %v", i, v.Big(), test.Output) + if got := new(big.Int).SetBytes(v.Bytes()); got.Cmp(test.Output) != 0 { + t.Errorf("test #%d: address mismatch: have %v, want %v", i, got, test.Output) } } } diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index eae09f91df7a..084009a066a0 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -20,6 +20,7 @@ package clique import ( "bytes" "errors" + "io" "math/big" "math/rand" "sync" @@ -33,13 +34,13 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" lru "github.com/hashicorp/golang-lru" + "golang.org/x/crypto/sha3" ) const ( @@ -136,40 +137,9 @@ var ( errRecentlySigned = errors.New("recently signed") ) -// SignerFn is a signer callback function to request a hash to be signed by a +// SignerFn is a signer callback function to request a header to be signed by a // backing account. -type SignerFn func(accounts.Account, []byte) ([]byte, error) - -// sigHash returns the hash which is used as input for the proof-of-authority -// signing. It is the hash of the entire header apart from the 65 byte signature -// contained at the end of the extra data. -// -// Note, the method requires the extra data to be at least 65 bytes, otherwise it -// panics. This is done to avoid accidentally using both forms (signature present -// or not), which could be abused to produce different hashes for the same header. -func sigHash(header *types.Header) (hash common.Hash) { - hasher := sha3.NewKeccak256() - - rlp.Encode(hasher, []interface{}{ - header.ParentHash, - header.UncleHash, - header.Coinbase, - header.Root, - header.TxHash, - header.ReceiptHash, - header.Bloom, - header.Difficulty, - header.Number, - header.GasLimit, - header.GasUsed, - header.Time, - header.Extra[:len(header.Extra)-65], // Yes, this will panic if extra is too short - header.MixDigest, - header.Nonce, - }) - hasher.Sum(hash[:0]) - return hash -} +type SignerFn func(accounts.Account, string, []byte) ([]byte, error) // ecrecover extracts the Ethereum account address from a signed header. func ecrecover(header *types.Header, sigcache *lru.ARCCache) (common.Address, error) { @@ -185,7 +155,7 @@ func ecrecover(header *types.Header, sigcache *lru.ARCCache) (common.Address, er signature := header.Extra[len(header.Extra)-extraSeal:] // Recover the public key and the Ethereum address - pubkey, err := crypto.Ecrecover(sigHash(header).Bytes(), signature) + pubkey, err := crypto.Ecrecover(SealHash(header).Bytes(), signature) if err != nil { return common.Address{}, err } @@ -279,7 +249,7 @@ func (c *Clique) verifyHeader(chain consensus.ChainReader, header *types.Header, number := header.Number.Uint64() // Don't waste time checking blocks from the future - if header.Time.Cmp(big.NewInt(time.Now().Unix())) > 0 { + if header.Time > uint64(time.Now().Unix()) { return consensus.ErrFutureBlock } // Checkpoint blocks need to enforce zero beneficiary @@ -351,7 +321,7 @@ func (c *Clique) verifyCascadingFields(chain consensus.ChainReader, header *type if parent == nil || parent.Number.Uint64() != number-1 || parent.Hash() != header.ParentHash { return consensus.ErrUnknownAncestor } - if parent.Time.Uint64()+c.config.Period > header.Time.Uint64() { + if parent.Time+c.config.Period > header.Time { return ErrInvalidTimestamp } // Retrieve the snapshot needed to verify this header and cache it @@ -395,8 +365,11 @@ func (c *Clique) snapshot(chain consensus.ChainReader, number uint64, hash commo break } } - // If we're at an checkpoint block, make a snapshot if it's known - if number == 0 || (number%c.config.Epoch == 0 && chain.GetHeaderByNumber(number-1) == nil) { + // If we're at the genesis, snapshot the initial state. Alternatively if we're + // at a checkpoint block without a parent (light client CHT), or we have piled + // up more headers than allowed to be reorged (chain reinit from a freezer), + // consider the checkpoint trusted and snapshot it. + if number == 0 || (number%c.config.Epoch == 0 && (len(headers) > params.ImmutabilityThreshold || chain.GetHeaderByNumber(number-1) == nil)) { checkpoint := chain.GetHeaderByNumber(number) if checkpoint != nil { hash := checkpoint.Hash() @@ -570,16 +543,24 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro if parent == nil { return consensus.ErrUnknownAncestor } - header.Time = new(big.Int).Add(parent.Time, new(big.Int).SetUint64(c.config.Period)) - if header.Time.Int64() < time.Now().Unix() { - header.Time = big.NewInt(time.Now().Unix()) + header.Time = parent.Time + c.config.Period + if header.Time < uint64(time.Now().Unix()) { + header.Time = uint64(time.Now().Unix()) } return nil } // Finalize implements consensus.Engine, ensuring no uncles are set, nor block -// rewards given, and returns the final block. -func (c *Clique) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { +// rewards given. +func (c *Clique) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header) { + // No block rewards in PoA, so the state remains as is and uncles are dropped + header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + header.UncleHash = types.CalcUncleHash(nil) +} + +// FinalizeAndAssemble implements consensus.Engine, ensuring no uncles are set, +// nor block rewards given, and returns the final block. +func (c *Clique) FinalizeAndAssemble(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { // No block rewards in PoA, so the state remains as is and uncles are dropped header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) header.UncleHash = types.CalcUncleHash(nil) @@ -637,7 +618,7 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, results c } } // Sweet, the protocol permits us to sign the block, wait for our time - delay := time.Unix(header.Time.Int64(), 0).Sub(time.Now()) // nolint: gosimple + delay := time.Unix(int64(header.Time), 0).Sub(time.Now()) // nolint: gosimple if header.Difficulty.Cmp(diffNoTurn) == 0 { // It's not our turn explicitly to sign, delay it a bit wiggle := time.Duration(len(snap.Signers)/2+1) * wiggleTime @@ -646,7 +627,7 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, results c log.Trace("Out-of-turn signing requested", "wiggle", common.PrettyDuration(wiggle)) } // Sign all the things! - sighash, err := signFn(accounts.Account{Address: signer}, sigHash(header).Bytes()) + sighash, err := signFn(accounts.Account{Address: signer}, accounts.MimetypeClique, CliqueRLP(header)) if err != nil { return err } @@ -663,7 +644,7 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, results c select { case results <- block.WithSeal(header): default: - log.Warn("Sealing result is not read by miner", "sealhash", c.SealHash(header)) + log.Warn("Sealing result is not read by miner", "sealhash", SealHash(header)) } }() @@ -693,10 +674,10 @@ func CalcDifficulty(snap *Snapshot, signer common.Address) *big.Int { // SealHash returns the hash of a block prior to it being sealed. func (c *Clique) SealHash(header *types.Header) common.Hash { - return sigHash(header) + return SealHash(header) } -// Close implements consensus.Engine. It's a noop for clique as there is are no background threads. +// Close implements consensus.Engine. It's a noop for clique as there are no background threads. func (c *Clique) Close() error { return nil } @@ -711,3 +692,47 @@ func (c *Clique) APIs(chain consensus.ChainReader) []rpc.API { Public: false, }} } + +// SealHash returns the hash of a block prior to it being sealed. +func SealHash(header *types.Header) (hash common.Hash) { + hasher := sha3.NewLegacyKeccak256() + encodeSigHeader(hasher, header) + hasher.Sum(hash[:0]) + return hash +} + +// CliqueRLP returns the rlp bytes which needs to be signed for the proof-of-authority +// sealing. The RLP to sign consists of the entire header apart from the 65 byte signature +// contained at the end of the extra data. +// +// Note, the method requires the extra data to be at least 65 bytes, otherwise it +// panics. This is done to avoid accidentally using both forms (signature present +// or not), which could be abused to produce different hashes for the same header. +func CliqueRLP(header *types.Header) []byte { + b := new(bytes.Buffer) + encodeSigHeader(b, header) + return b.Bytes() +} + +func encodeSigHeader(w io.Writer, header *types.Header) { + err := rlp.Encode(w, []interface{}{ + header.ParentHash, + header.UncleHash, + header.Coinbase, + header.Root, + header.TxHash, + header.ReceiptHash, + header.Bloom, + header.Difficulty, + header.Number, + header.GasLimit, + header.GasUsed, + header.Time, + header.Extra[:len(header.Extra)-65], // Yes, this will panic if extra is too short + header.MixDigest, + header.Nonce, + }) + if err != nil { + panic("can't encode: " + err.Error()) + } +} diff --git a/consensus/clique/clique_test.go b/consensus/clique/clique_test.go new file mode 100644 index 000000000000..710f44805555 --- /dev/null +++ b/consensus/clique/clique_test.go @@ -0,0 +1,113 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package clique + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" +) + +// This test case is a repro of an annoying bug that took us forever to catch. +// In Clique PoA networks (Rinkeby, Görli, etc), consecutive blocks might have +// the same state root (no block subsidy, empty block). If a node crashes, the +// chain ends up losing the recent state and needs to regenerate it from blocks +// already in the database. The bug was that processing the block *prior* to an +// empty one **also completes** the empty one, ending up in a known-block error. +func TestReimportMirroredState(t *testing.T) { + // Initialize a Clique chain with a single signer + var ( + db = rawdb.NewMemoryDatabase() + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr = crypto.PubkeyToAddress(key.PublicKey) + engine = New(params.AllCliqueProtocolChanges.Clique, db) + signer = new(types.HomesteadSigner) + ) + genspec := &core.Genesis{ + ExtraData: make([]byte, extraVanity+common.AddressLength+extraSeal), + Alloc: map[common.Address]core.GenesisAccount{ + addr: {Balance: big.NewInt(1)}, + }, + } + copy(genspec.ExtraData[extraVanity:], addr[:]) + genesis := genspec.MustCommit(db) + + // Generate a batch of blocks, each properly signed + chain, _ := core.NewBlockChain(db, nil, params.AllCliqueProtocolChanges, engine, vm.Config{}, nil) + defer chain.Stop() + + blocks, _ := core.GenerateChain(params.AllCliqueProtocolChanges, genesis, engine, db, 3, func(i int, block *core.BlockGen) { + // The chain maker doesn't have access to a chain, so the difficulty will be + // lets unset (nil). Set it here to the correct value. + block.SetDifficulty(diffInTurn) + + // We want to simulate an empty middle block, having the same state as the + // first one. The last is needs a state change again to force a reorg. + if i != 1 { + tx, err := types.SignTx(types.NewTransaction(block.TxNonce(addr), common.Address{0x00}, new(big.Int), params.TxGas, nil, nil), signer, key) + if err != nil { + panic(err) + } + block.AddTxWithChain(chain, tx) + } + }) + for i, block := range blocks { + header := block.Header() + if i > 0 { + header.ParentHash = blocks[i-1].Hash() + } + header.Extra = make([]byte, extraVanity+extraSeal) + header.Difficulty = diffInTurn + + sig, _ := crypto.Sign(SealHash(header).Bytes(), key) + copy(header.Extra[len(header.Extra)-extraSeal:], sig) + blocks[i] = block.WithSeal(header) + } + // Insert the first two blocks and make sure the chain is valid + db = rawdb.NewMemoryDatabase() + genspec.MustCommit(db) + + chain, _ = core.NewBlockChain(db, nil, params.AllCliqueProtocolChanges, engine, vm.Config{}, nil) + defer chain.Stop() + + if _, err := chain.InsertChain(blocks[:2]); err != nil { + t.Fatalf("failed to insert initial blocks: %v", err) + } + if head := chain.CurrentBlock().NumberU64(); head != 2 { + t.Fatalf("chain head mismatch: have %d, want %d", head, 2) + } + + // Simulate a crash by creating a new chain on top of the database, without + // flushing the dirty states out. Insert the last block, trigerring a sidechain + // reimport. + chain, _ = core.NewBlockChain(db, nil, params.AllCliqueProtocolChanges, engine, vm.Config{}, nil) + defer chain.Stop() + + if _, err := chain.InsertChain(blocks[2:]); err != nil { + t.Fatalf("failed to insert final block: %v", err) + } + if head := chain.CurrentBlock().NumberU64(); head != 3 { + t.Fatalf("chain head mismatch: have %d, want %d", head, 3) + } +} diff --git a/consensus/clique/snapshot.go b/consensus/clique/snapshot.go index 54d4555f3b6a..4ee731a90821 100644 --- a/consensus/clique/snapshot.go +++ b/consensus/clique/snapshot.go @@ -20,10 +20,12 @@ import ( "bytes" "encoding/json" "sort" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" lru "github.com/hashicorp/golang-lru" ) @@ -197,7 +199,11 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { // Iterate through the headers and create a new snapshot snap := s.copy() - for _, header := range headers { + var ( + start = time.Now() + logged = time.Now() + ) + for i, header := range headers { // Remove any votes on checkpoint blocks number := header.Number.Uint64() if number%s.config.Epoch == 0 { @@ -285,6 +291,14 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { } delete(snap.Tally, header.Coinbase) } + // If we're taking too much time (ecrecover), notify the user once a while + if time.Since(logged) > 8*time.Second { + log.Info("Reconstructing voting history", "processed", i, "total", len(headers), "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + } + if time.Since(start) > 8*time.Second { + log.Info("Reconstructed voting history", "processed", len(headers), "elapsed", common.PrettyDuration(time.Since(start))) } snap.Number += uint64(len(headers)) snap.Hash = headers[len(headers)-1].Hash() diff --git a/consensus/clique/snapshot_test.go b/consensus/clique/snapshot_test.go index 41dae1426fec..fc08722efd63 100644 --- a/consensus/clique/snapshot_test.go +++ b/consensus/clique/snapshot_test.go @@ -24,10 +24,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" ) @@ -80,7 +80,7 @@ func (ap *testerAccountPool) sign(header *types.Header, signer string) { ap.accounts[signer], _ = crypto.GenerateKey() } // Sign the header and embed the signature in extra data - sig, _ := crypto.Sign(sigHash(header).Bytes(), ap.accounts[signer]) + sig, _ := crypto.Sign(SealHash(header).Bytes(), ap.accounts[signer]) copy(header.Extra[len(header.Extra)-extraSeal:], sig) } @@ -246,10 +246,10 @@ func TestClique(t *testing.T) { // Votes from deauthorized signers are discarded immediately (auth votes) signers: []string{"A", "B", "C"}, votes: []testerVote{ - {signer: "C", voted: "B", auth: false}, + {signer: "C", voted: "D", auth: true}, {signer: "A", voted: "C", auth: false}, {signer: "B", voted: "C", auth: false}, - {signer: "A", voted: "B", auth: false}, + {signer: "A", voted: "D", auth: true}, }, results: []string{"A", "B"}, }, { @@ -400,7 +400,7 @@ func TestClique(t *testing.T) { copy(genesis.ExtraData[extraVanity+j*common.AddressLength:], signer[:]) } // Create a pristine blockchain with the genesis injected - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis.Commit(db) // Assemble a chain of headers from the cast votes diff --git a/consensus/consensus.go b/consensus/consensus.go index 487b07be7725..f753af550ca0 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -80,10 +80,19 @@ type Engine interface { Prepare(chain ChainReader, header *types.Header) error // Finalize runs any post-transaction state modifications (e.g. block rewards) - // and assembles the final block. + // but does not assemble the block. + // // Note: The block header and state database might be updated to reflect any // consensus rules that happen at finalization (e.g. block rewards). Finalize(chain ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, + uncles []*types.Header) + + // FinalizeAndAssemble runs any post-transaction state modifications (e.g. block + // rewards) and assembles the final block. + // + // Note: The block header and state database might be updated to reflect any + // consensus rules that happen at finalization (e.g. block rewards). + FinalizeAndAssemble(chain ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) // Seal generates a new sealing request for the given input block and pushes diff --git a/consensus/ethash/algorithm.go b/consensus/ethash/algorithm.go index f252a7f3a305..d6c871092ed3 100644 --- a/consensus/ethash/algorithm.go +++ b/consensus/ethash/algorithm.go @@ -30,8 +30,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/bitutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/log" + "golang.org/x/crypto/sha3" ) const ( @@ -123,7 +123,7 @@ func seedHash(block uint64) []byte { if block < epochLength { return seed } - keccak256 := makeHasher(sha3.NewKeccak256()) + keccak256 := makeHasher(sha3.NewLegacyKeccak256()) for i := 0; i < int(block/epochLength); i++ { keccak256(seed, seed) } @@ -177,7 +177,7 @@ func generateCache(dest []uint32, epoch uint64, seed []byte) { } }() // Create a hasher to reuse between invocations - keccak512 := makeHasher(sha3.NewKeccak512()) + keccak512 := makeHasher(sha3.NewLegacyKeccak512()) // Sequentially produce the initial dataset keccak512(cache, seed) @@ -301,7 +301,7 @@ func generateDataset(dest []uint32, epoch uint64, cache []uint32) { defer pend.Done() // Create a hasher to reuse between invocations - keccak512 := makeHasher(sha3.NewKeccak512()) + keccak512 := makeHasher(sha3.NewLegacyKeccak512()) // Calculate the data segment this thread should generate batch := uint32((size + hashBytes*uint64(threads) - 1) / (hashBytes * uint64(threads))) @@ -375,7 +375,7 @@ func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) // in-memory cache) in order to produce our final value for a particular header // hash and nonce. func hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64) ([]byte, []byte) { - keccak512 := makeHasher(sha3.NewKeccak512()) + keccak512 := makeHasher(sha3.NewLegacyKeccak512()) lookup := func(index uint32) []uint32 { rawData := generateDatasetItem(cache, index, keccak512) diff --git a/consensus/ethash/algorithm_test.go b/consensus/ethash/algorithm_test.go index c58479e2896c..cf8552f3ab74 100644 --- a/consensus/ethash/algorithm_test.go +++ b/consensus/ethash/algorithm_test.go @@ -716,7 +716,7 @@ func TestConcurrentDiskCacheGeneration(t *testing.T) { Difficulty: big.NewInt(167925187834220), GasLimit: 4015682, GasUsed: 0, - Time: big.NewInt(1488928920), + Time: 1488928920, Extra: []byte("www.bw.com"), MixDigest: common.HexToHash("0x3e140b0784516af5e5ec6730f2fb20cca22f32be399b9e4ad77d32541f798cd0"), Nonce: types.EncodeNonce(0xf400cd0006070c49), diff --git a/consensus/ethash/api.go b/consensus/ethash/api.go index a04ea235d925..4d8eed416116 100644 --- a/consensus/ethash/api.go +++ b/consensus/ethash/api.go @@ -37,27 +37,28 @@ type API struct { // result[0] - 32 bytes hex encoded current block header pow-hash // result[1] - 32 bytes hex encoded seed hash used for DAG // result[2] - 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty -func (api *API) GetWork() ([3]string, error) { +// result[3] - hex encoded block number +func (api *API) GetWork() ([4]string, error) { if api.ethash.config.PowMode != ModeNormal && api.ethash.config.PowMode != ModeTest { - return [3]string{}, errors.New("not supported") + return [4]string{}, errors.New("not supported") } var ( - workCh = make(chan [3]string, 1) + workCh = make(chan [4]string, 1) errc = make(chan error, 1) ) select { case api.ethash.fetchWorkCh <- &sealWork{errc: errc, res: workCh}: case <-api.ethash.exitCh: - return [3]string{}, errEthashStopped + return [4]string{}, errEthashStopped } select { case work := <-workCh: return work, nil case err := <-errc: - return [3]string{}, err + return [4]string{}, err } } diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go index 548c57cd9b80..d271518f4fed 100644 --- a/consensus/ethash/consensus.go +++ b/consensus/ethash/consensus.go @@ -31,9 +31,9 @@ import ( "github.com/ethereum/go-ethereum/consensus/misc" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" ) // Ethash proof-of-work protocol constants. @@ -63,7 +63,6 @@ var ( // codebase, inherently breaking if the engine is swapped out. Please put common // error types into the consensus package. var ( - errLargeBlockTime = errors.New("timestamp too big") errZeroBlockTime = errors.New("timestamp equals parent's") errTooManyUncles = errors.New("too many uncles") errDuplicateUncle = errors.New("duplicate uncle") @@ -192,6 +191,9 @@ func (ethash *Ethash) VerifyUncles(chain consensus.ChainReader, block *types.Blo if len(block.Uncles()) > maxUncles { return errTooManyUncles } + if len(block.Uncles()) == 0 { + return nil + } // Gather the set of past uncles and ancestors uncles, ancestors := mapset.NewSet(), make(map[common.Hash]*types.Header) @@ -242,20 +244,16 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent * return fmt.Errorf("extra-data too long: %d > %d", len(header.Extra), params.MaximumExtraDataSize) } // Verify the header's timestamp - if uncle { - if header.Time.Cmp(math.MaxBig256) > 0 { - return errLargeBlockTime - } - } else { - if header.Time.Cmp(big.NewInt(time.Now().Add(allowedFutureBlockTime).Unix())) > 0 { + if !uncle { + if header.Time > uint64(time.Now().Add(allowedFutureBlockTime).Unix()) { return consensus.ErrFutureBlock } } - if header.Time.Cmp(parent.Time) <= 0 { + if header.Time <= parent.Time { return errZeroBlockTime } // Verify the block's difficulty based in it's timestamp and parent's difficulty - expected := ethash.CalcDifficulty(chain, header.Time.Uint64(), parent) + expected := ethash.CalcDifficulty(chain, header.Time, parent) if expected.Cmp(header.Difficulty) != 0 { return fmt.Errorf("invalid difficulty: have %v, want %v", header.Difficulty, expected) @@ -349,7 +347,7 @@ func makeDifficultyCalculator(bombDelay *big.Int) func(time uint64, parent *type // ) + 2^(periodCount - 2) bigTime := new(big.Int).SetUint64(time) - bigParentTime := new(big.Int).Set(parent.Time) + bigParentTime := new(big.Int).SetUint64(parent.Time) // holds intermediate values to make the algo easier to read & audit x := new(big.Int) @@ -408,7 +406,7 @@ func calcDifficultyHomestead(time uint64, parent *types.Header) *big.Int { // ) + 2^(periodCount - 2) bigTime := new(big.Int).SetUint64(time) - bigParentTime := new(big.Int).Set(parent.Time) + bigParentTime := new(big.Int).SetUint64(parent.Time) // holds intermediate values to make the algo easier to read & audit x := new(big.Int) @@ -456,7 +454,7 @@ func calcDifficultyFrontier(time uint64, parent *types.Header) *big.Int { bigParentTime := new(big.Int) bigTime.SetUint64(time) - bigParentTime.Set(parent.Time) + bigParentTime.SetUint64(parent.Time) if bigTime.Sub(bigTime, bigParentTime).Cmp(params.DurationLimit) < 0 { diff.Add(parent.Difficulty, adjust) @@ -558,13 +556,21 @@ func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header) if parent == nil { return consensus.ErrUnknownAncestor } - header.Difficulty = ethash.CalcDifficulty(chain, header.Time.Uint64(), parent) + header.Difficulty = ethash.CalcDifficulty(chain, header.Time, parent) return nil } // Finalize implements consensus.Engine, accumulating the block and uncle rewards, -// setting the final state and assembling the block. -func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { +// setting the final state on the header +func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header) { + // Accumulate any block and uncle rewards and commit the final state root + accumulateRewards(chain.Config(), state, header, uncles) + header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) +} + +// FinalizeAndAssemble implements consensus.Engine, accumulating the block and +// uncle rewards, setting the final state and assembling the block. +func (ethash *Ethash) FinalizeAndAssemble(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { // Accumulate any block and uncle rewards and commit the final state root accumulateRewards(chain.Config(), state, header, uncles) header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) @@ -575,7 +581,7 @@ func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header // SealHash returns the hash of a block prior to it being sealed. func (ethash *Ethash) SealHash(header *types.Header) (hash common.Hash) { - hasher := sha3.NewKeccak256() + hasher := sha3.NewLegacyKeccak256() rlp.Encode(hasher, []interface{}{ header.ParentHash, diff --git a/consensus/ethash/consensus_test.go b/consensus/ethash/consensus_test.go index 438a99dd66c2..675737d9e1aa 100644 --- a/consensus/ethash/consensus_test.go +++ b/consensus/ethash/consensus_test.go @@ -76,7 +76,7 @@ func TestCalcDifficulty(t *testing.T) { number := new(big.Int).Sub(test.CurrentBlocknumber, big.NewInt(1)) diff := CalcDifficulty(config, test.CurrentTimestamp, &types.Header{ Number: number, - Time: new(big.Int).SetUint64(test.ParentTimestamp), + Time: test.ParentTimestamp, Difficulty: test.ParentDifficulty, }) if diff.Cmp(test.CurrentDifficulty) != 0 { diff --git a/consensus/ethash/ethash.go b/consensus/ethash/ethash.go index d124cb1e2025..78892e1da85d 100644 --- a/consensus/ethash/ethash.go +++ b/consensus/ethash/ethash.go @@ -432,7 +432,7 @@ type hashrate struct { // sealWork wraps a seal work package for remote sealer. type sealWork struct { errc chan error - res chan [3]string + res chan [4]string } // Ethash is a consensus engine based on proof-of-work implementing the ethash diff --git a/consensus/ethash/ethash_test.go b/consensus/ethash/ethash_test.go index 8eded2ca81b9..90cb6470f735 100644 --- a/consensus/ethash/ethash_test.go +++ b/consensus/ethash/ethash_test.go @@ -107,7 +107,7 @@ func TestRemoteSealer(t *testing.T) { ethash.Seal(nil, block, results, nil) var ( - work [3]string + work [4]string err error ) if work, err = api.GetWork(); err != nil || work[0] != sealhash.Hex() { diff --git a/consensus/ethash/sealer.go b/consensus/ethash/sealer.go index 06c98a781141..43db1fcb7fd7 100644 --- a/consensus/ethash/sealer.go +++ b/consensus/ethash/sealer.go @@ -30,6 +30,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" @@ -193,7 +194,7 @@ func (ethash *Ethash) remote(notify []string, noverify bool) { results chan<- *types.Block currentBlock *types.Block - currentWork [3]string + currentWork [4]string notifyTransport = &http.Transport{} notifyClient = &http.Client{ @@ -234,12 +235,14 @@ func (ethash *Ethash) remote(notify []string, noverify bool) { // result[0], 32 bytes hex encoded current block header pow-hash // result[1], 32 bytes hex encoded seed hash used for DAG // result[2], 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty + // result[3], hex encoded block number makeWork := func(block *types.Block) { hash := ethash.SealHash(block.Header()) currentWork[0] = hash.Hex() currentWork[1] = common.BytesToHash(SeedHash(block.NumberU64())).Hex() currentWork[2] = common.BytesToHash(new(big.Int).Div(two256, block.Difficulty()).Bytes()).Hex() + currentWork[3] = hexutil.EncodeBig(block.Number()) // Trace the seal work fetched by remote sealer. currentBlock = block @@ -267,7 +270,7 @@ func (ethash *Ethash) remote(notify []string, noverify bool) { start := time.Now() if !noverify { if err := ethash.verifySeal(nil, header, true); err != nil { - log.Warn("Invalid proof-of-work submitted", "sealhash", sealhash, "elapsed", time.Since(start), "err", err) + log.Warn("Invalid proof-of-work submitted", "sealhash", sealhash, "elapsed", common.PrettyDuration(time.Since(start)), "err", err) return false } } @@ -276,7 +279,7 @@ func (ethash *Ethash) remote(notify []string, noverify bool) { log.Warn("Ethash result channel is empty, submitted mining result is rejected") return false } - log.Trace("Verified correct proof-of-work", "sealhash", sealhash, "elapsed", time.Since(start)) + log.Trace("Verified correct proof-of-work", "sealhash", sealhash, "elapsed", common.PrettyDuration(time.Since(start))) // Solutions seems to be valid, return to the miner and notify acceptance. solution := block.WithSeal(header) diff --git a/consensus/ethash/sealer_test.go b/consensus/ethash/sealer_test.go index 436359af7c16..82f08d673c89 100644 --- a/consensus/ethash/sealer_test.go +++ b/consensus/ethash/sealer_test.go @@ -1,3 +1,19 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + package ethash import ( diff --git a/console/bridge.go b/console/bridge.go index b0b4d37985f8..bb14abca25ae 100644 --- a/console/bridge.go +++ b/console/bridge.go @@ -23,6 +23,7 @@ import ( "strings" "time" + "github.com/ethereum/go-ethereum/accounts/scwallet" "github.com/ethereum/go-ethereum/accounts/usbwallet" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rpc" @@ -104,10 +105,92 @@ func (b *bridge) OpenWallet(call otto.FunctionCall) (response otto.Value) { if err == nil { return val } - // Wallet open failed, report error unless it's a PIN entry - if !strings.HasSuffix(err.Error(), usbwallet.ErrTrezorPINNeeded.Error()) { + + // Wallet open failed, report error unless it's a PIN or PUK entry + switch { + case strings.HasSuffix(err.Error(), usbwallet.ErrTrezorPINNeeded.Error()): + val, err = b.readPinAndReopenWallet(call) + if err == nil { + return val + } + val, err = b.readPassphraseAndReopenWallet(call) + if err != nil { + throwJSException(err.Error()) + } + + case strings.HasSuffix(err.Error(), scwallet.ErrPairingPasswordNeeded.Error()): + // PUK input requested, fetch from the user and call open again + if input, err := b.prompter.PromptPassword("Please enter the pairing password: "); err != nil { + throwJSException(err.Error()) + } else { + passwd, _ = otto.ToValue(input) + } + if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { + if !strings.HasSuffix(err.Error(), scwallet.ErrPINNeeded.Error()) { + throwJSException(err.Error()) + } else { + // PIN input requested, fetch from the user and call open again + if input, err := b.prompter.PromptPassword("Please enter current PIN: "); err != nil { + throwJSException(err.Error()) + } else { + passwd, _ = otto.ToValue(input) + } + if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { + throwJSException(err.Error()) + } + } + } + + case strings.HasSuffix(err.Error(), scwallet.ErrPINUnblockNeeded.Error()): + // PIN unblock requested, fetch PUK and new PIN from the user + var pukpin string + if input, err := b.prompter.PromptPassword("Please enter current PUK: "); err != nil { + throwJSException(err.Error()) + } else { + pukpin = input + } + if input, err := b.prompter.PromptPassword("Please enter new PIN: "); err != nil { + throwJSException(err.Error()) + } else { + pukpin += input + } + passwd, _ = otto.ToValue(pukpin) + if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { + throwJSException(err.Error()) + } + + case strings.HasSuffix(err.Error(), scwallet.ErrPINNeeded.Error()): + // PIN input requested, fetch from the user and call open again + if input, err := b.prompter.PromptPassword("Please enter current PIN: "); err != nil { + throwJSException(err.Error()) + } else { + passwd, _ = otto.ToValue(input) + } + if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { + throwJSException(err.Error()) + } + + default: + // Unknown error occurred, drop to the user throwJSException(err.Error()) } + return val +} + +func (b *bridge) readPassphraseAndReopenWallet(call otto.FunctionCall) (otto.Value, error) { + var passwd otto.Value + wallet := call.Argument(0) + if input, err := b.prompter.PromptPassword("Please enter your passphrase: "); err != nil { + throwJSException(err.Error()) + } else { + passwd, _ = otto.ToValue(input) + } + return call.Otto.Call("jeth.openWallet", nil, wallet, passwd) +} + +func (b *bridge) readPinAndReopenWallet(call otto.FunctionCall) (otto.Value, error) { + var passwd otto.Value + wallet := call.Argument(0) // Trezor PIN matrix input requested, display the matrix to the user and fetch the data fmt.Fprintf(b.printer, "Look at the device for number positions\n\n") fmt.Fprintf(b.printer, "7 | 8 | 9\n") @@ -121,10 +204,7 @@ func (b *bridge) OpenWallet(call otto.FunctionCall) (response otto.Value) { } else { passwd, _ = otto.ToValue(input) } - if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { - throwJSException(err.Error()) - } - return val + return call.Otto.Call("jeth.openWallet", nil, wallet, passwd) } // UnlockAccount is a wrapper around the personal.unlockAccount RPC method that diff --git a/console/console.go b/console/console.go index 3c397f800614..5326ed2c8791 100644 --- a/console/console.go +++ b/console/console.go @@ -120,10 +120,10 @@ func (c *Console) init(preload []string) error { consoleObj.Object().Set("error", c.consoleOutput) // Load all the internal utility JavaScript libraries - if err := c.jsre.Compile("bignumber.js", jsre.BigNumber_JS); err != nil { + if err := c.jsre.Compile("bignumber.js", jsre.BignumberJs); err != nil { return fmt.Errorf("bignumber.js: %v", err) } - if err := c.jsre.Compile("web3.js", jsre.Web3_JS); err != nil { + if err := c.jsre.Compile("web3.js", jsre.Web3Js); err != nil { return fmt.Errorf("web3.js: %v", err) } if _, err := c.jsre.Run("var Web3 = require('web3');"); err != nil { @@ -236,7 +236,7 @@ func (c *Console) clearHistory() { // consoleOutput is an override for the console.log and console.error methods to // stream the output into the configured output stream instead of stdout. func (c *Console) consoleOutput(call otto.FunctionCall) otto.Value { - output := []string{} + var output []string for _, argument := range call.ArgumentList { output = append(output, fmt.Sprintf("%v", argument)) } @@ -274,14 +274,22 @@ func (c *Console) AutoCompleteInput(line string, pos int) (string, []string, str // Welcome show summary of current Geth instance and some metadata about the // console's available modules. func (c *Console) Welcome() { + message := "Welcome to the Geth JavaScript console!\n\n" + // Print some generic Geth metadata - fmt.Fprintf(c.printer, "Welcome to the Geth JavaScript console!\n\n") - c.jsre.Run(` - console.log("instance: " + web3.version.node); - console.log("coinbase: " + eth.coinbase); - console.log("at block: " + eth.blockNumber + " (" + new Date(1000 * eth.getBlock(eth.blockNumber).timestamp) + ")"); - console.log(" datadir: " + admin.datadir); - `) + if res, err := c.jsre.Run(` + var message = "instance: " + web3.version.node + "\n"; + try { + message += "coinbase: " + eth.coinbase + "\n"; + } catch (err) {} + message += "at block: " + eth.blockNumber + " (" + new Date(1000 * eth.getBlock(eth.blockNumber).timestamp) + ")\n"; + try { + message += " datadir: " + admin.datadir + "\n"; + } catch (err) {} + message + `); err == nil { + message += res.String() + } // List all the supported modules for the user to call if apis, err := c.client.SupportedModules(); err == nil { modules := make([]string, 0, len(apis)) @@ -289,9 +297,9 @@ func (c *Console) Welcome() { modules = append(modules, fmt.Sprintf("%s:%s", api, version)) } sort.Strings(modules) - fmt.Fprintln(c.printer, " modules:", strings.Join(modules, " ")) + message += " modules: " + strings.Join(modules, " ") + "\n" } - fmt.Fprintln(c.printer) + fmt.Fprintln(c.printer, message) } // Evaluate executes code and pretty prints the result to the specified output diff --git a/console/console_test.go b/console/console_test.go index 26465ca6f450..89dd7cd838a8 100644 --- a/console/console_test.go +++ b/console/console_test.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/internal/jsre" + "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/node" ) @@ -96,8 +97,10 @@ func newTester(t *testing.T, confOverride func(*eth.Config)) *tester { t.Fatalf("failed to create node: %v", err) } ethConf := ð.Config{ - Genesis: core.DeveloperGenesisBlock(15, common.Address{}), - Etherbase: common.HexToAddress(testAddress), + Genesis: core.DeveloperGenesisBlock(15, common.Address{}), + Miner: miner.Config{ + Etherbase: common.HexToAddress(testAddress), + }, Ethash: ethash.Config{ PowMode: ethash.ModeTest, }, @@ -149,8 +152,8 @@ func (env *tester) Close(t *testing.T) { if err := env.console.Stop(false); err != nil { t.Errorf("failed to stop embedded console: %v", err) } - if err := env.stack.Stop(); err != nil { - t.Errorf("failed to stop embedded node: %v", err) + if err := env.stack.Close(); err != nil { + t.Errorf("failed to tear down embedded node: %v", err) } os.RemoveAll(env.workspace) } diff --git a/console/prompter.go b/console/prompter.go index 29a53aeadda3..65675061a768 100644 --- a/console/prompter.go +++ b/console/prompter.go @@ -142,7 +142,7 @@ func (p *terminalPrompter) PromptPassword(prompt string) (passwd string, err err // PromptConfirm displays the given prompt to the user and requests a boolean // choice to be made, returning that choice. func (p *terminalPrompter) PromptConfirm(prompt string) (bool, error) { - input, err := p.Prompt(prompt + " [y/N] ") + input, err := p.Prompt(prompt + " [y/n] ") if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { return true, nil } diff --git a/containers/docker/develop-alpine/Dockerfile b/containers/docker/develop-alpine/Dockerfile deleted file mode 100644 index 1f3e1112ec1b..000000000000 --- a/containers/docker/develop-alpine/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM alpine:3.7 - -RUN \ - apk add --update go git make gcc musl-dev linux-headers ca-certificates && \ - git clone --depth 1 https://github.com/ethereum/go-ethereum && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ - apk del go git make gcc musl-dev linux-headers && \ - rm -rf /go-ethereum && rm -rf /var/cache/apk/* - -EXPOSE 8545 -EXPOSE 30303 - -ENTRYPOINT ["/geth"] diff --git a/containers/docker/develop-ubuntu/Dockerfile b/containers/docker/develop-ubuntu/Dockerfile deleted file mode 100644 index 8c4fe9f59514..000000000000 --- a/containers/docker/develop-ubuntu/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM ubuntu:xenial - -ENV PATH=/usr/lib/go-1.9/bin:$PATH - -RUN \ - apt-get update && apt-get upgrade -q -y && \ - apt-get install -y --no-install-recommends golang-1.9 git make gcc libc-dev ca-certificates && \ - git clone --depth 1 https://github.com/ethereum/go-ethereum && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ - apt-get remove -y golang-1.9 git make gcc libc-dev && apt autoremove -y && apt-get clean && \ - rm -rf /go-ethereum - -EXPOSE 8545 -EXPOSE 30303 - -ENTRYPOINT ["/geth"] diff --git a/containers/docker/master-alpine/Dockerfile b/containers/docker/master-alpine/Dockerfile deleted file mode 100644 index 8d4e7fe81a6b..000000000000 --- a/containers/docker/master-alpine/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM alpine:3.7 - -RUN \ - apk add --update go git make gcc musl-dev linux-headers ca-certificates && \ - git clone --depth 1 --branch release/1.8 https://github.com/ethereum/go-ethereum && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ - apk del go git make gcc musl-dev linux-headers && \ - rm -rf /go-ethereum && rm -rf /var/cache/apk/* - -EXPOSE 8545 -EXPOSE 30303 - -ENTRYPOINT ["/geth"] diff --git a/containers/docker/master-ubuntu/Dockerfile b/containers/docker/master-ubuntu/Dockerfile deleted file mode 100644 index 4cfc4f58c0cb..000000000000 --- a/containers/docker/master-ubuntu/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM ubuntu:xenial - -ENV PATH=/usr/lib/go-1.9/bin:$PATH - -RUN \ - apt-get update && apt-get upgrade -q -y && \ - apt-get install -y --no-install-recommends golang-1.9 git make gcc libc-dev ca-certificates && \ - git clone --depth 1 --branch release/1.8 https://github.com/ethereum/go-ethereum && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ - apt-get remove -y golang-1.9 git make gcc libc-dev && apt autoremove -y && apt-get clean && \ - rm -rf /go-ethereum - -EXPOSE 8545 -EXPOSE 30303 - -ENTRYPOINT ["/geth"] diff --git a/contracts/checkpointoracle/contract/oracle.go b/contracts/checkpointoracle/contract/oracle.go new file mode 100644 index 000000000000..3bb351792f7a --- /dev/null +++ b/contracts/checkpointoracle/contract/oracle.go @@ -0,0 +1,415 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = abi.U256 + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// CheckpointOracleABI is the input ABI used to generate the binding from. +const CheckpointOracleABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"GetAllAdmin\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GetLatestCheckpoint\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"},{\"name\":\"\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_recentNumber\",\"type\":\"uint256\"},{\"name\":\"_recentHash\",\"type\":\"bytes32\"},{\"name\":\"_hash\",\"type\":\"bytes32\"},{\"name\":\"_sectionIndex\",\"type\":\"uint64\"},{\"name\":\"v\",\"type\":\"uint8[]\"},{\"name\":\"r\",\"type\":\"bytes32[]\"},{\"name\":\"s\",\"type\":\"bytes32[]\"}],\"name\":\"SetCheckpoint\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_adminlist\",\"type\":\"address[]\"},{\"name\":\"_sectionSize\",\"type\":\"uint256\"},{\"name\":\"_processConfirms\",\"type\":\"uint256\"},{\"name\":\"_threshold\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"index\",\"type\":\"uint64\"},{\"indexed\":false,\"name\":\"checkpointHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"v\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"r\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"NewCheckpointVote\",\"type\":\"event\"}]" + +// CheckpointOracleBin is the compiled bytecode used for deploying new contracts. +const CheckpointOracleBin = `0x608060405234801561001057600080fd5b506040516108153803806108158339818101604052608081101561003357600080fd5b81019080805164010000000081111561004b57600080fd5b8201602081018481111561005e57600080fd5b815185602082028301116401000000008211171561007b57600080fd5b505060208201516040830151606090930151919450925060005b84518110156101415760016000808784815181106100af57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060018582815181106100fc57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501610095565b50600592909255600655600755506106b78061015e6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806345848dfc146100465780634d6a304c1461009e578063d459fc46146100cf575b600080fd5b61004e6102b0565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561008a578181015183820152602001610072565b505050509050019250505060405180910390f35b6100a661034f565b6040805167ffffffffffffffff9094168452602084019290925282820152519081900360600190f35b61029c600480360360e08110156100e557600080fd5b81359160208101359160408201359167ffffffffffffffff6060820135169181019060a08101608082013564010000000081111561012257600080fd5b82018360208201111561013457600080fd5b8035906020019184602083028401116401000000008311171561015657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156101a657600080fd5b8201836020820111156101b857600080fd5b803590602001918460208302840111640100000000831117156101da57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022a57600080fd5b82018360208201111561023c57600080fd5b8035906020019184602083028401116401000000008311171561025e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061036a945050505050565b604080519115158252519081900360200190f35b6060806001805490506040519080825280602002602001820160405280156102e2578160200160208202803883390190505b50905060005b60015481101561034957600181815481106102ff57fe5b9060005260206000200160009054906101000a90046001600160a01b031682828151811061032957fe5b6001600160a01b03909216602092830291909101909101526001016102e8565b50905090565b60025460045460035467ffffffffffffffff90921691909192565b3360009081526020819052604081205460ff1661038657600080fd5b8688401461039357600080fd5b82518451146103a157600080fd5b81518451146103af57600080fd5b6006546005548660010167ffffffffffffffff1602014310156103d457506000610677565b60025467ffffffffffffffff90811690861610156103f457506000610677565b60025467ffffffffffffffff8681169116148015610426575067ffffffffffffffff8516151580610426575060035415155b1561043357506000610677565b8561044057506000610677565b60408051601960f81b6020808301919091526000602183018190523060601b60228401526001600160c01b031960c08a901b166036840152603e8084018b905284518085039091018152605e909301909352815191012090805b86518110156106715760006001848984815181106104b457fe5b60200260200101518985815181106104c857fe5b60200260200101518986815181106104dc57fe5b602002602001015160405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561053b573d6000803e3d6000fd5b505060408051601f1901516001600160a01b03811660009081526020819052919091205490925060ff16905061057057600080fd5b826001600160a01b0316816001600160a01b03161161058e57600080fd5b8092508867ffffffffffffffff167fce51ffa16246bcaf0899f6504f473cd0114f430f566cef71ab7e03d3dde42a418b8a85815181106105ca57fe5b60200260200101518a86815181106105de57fe5b60200260200101518a87815181106105f257fe5b6020026020010151604051808581526020018460ff1660ff16815260200183815260200182815260200194505050505060405180910390a260075482600101106106685750505060048790555050436003556002805467ffffffffffffffff191667ffffffffffffffff86161790556001610677565b5060010161049a565b50600080fd5b97965050505050505056fea265627a7a723058207f6a191ce575596a2f1e907c8c0a01003d16b69fb2c4f432d10878e8c0a99a0264736f6c634300050a0032` + +// DeployCheckpointOracle deploys a new Ethereum contract, binding an instance of CheckpointOracle to it. +func DeployCheckpointOracle(auth *bind.TransactOpts, backend bind.ContractBackend, _adminlist []common.Address, _sectionSize *big.Int, _processConfirms *big.Int, _threshold *big.Int) (common.Address, *types.Transaction, *CheckpointOracle, error) { + parsed, err := abi.JSON(strings.NewReader(CheckpointOracleABI)) + if err != nil { + return common.Address{}, nil, nil, err + } + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(CheckpointOracleBin), backend, _adminlist, _sectionSize, _processConfirms, _threshold) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CheckpointOracle{CheckpointOracleCaller: CheckpointOracleCaller{contract: contract}, CheckpointOracleTransactor: CheckpointOracleTransactor{contract: contract}, CheckpointOracleFilterer: CheckpointOracleFilterer{contract: contract}}, nil +} + +// CheckpointOracle is an auto generated Go binding around an Ethereum contract. +type CheckpointOracle struct { + CheckpointOracleCaller // Read-only binding to the contract + CheckpointOracleTransactor // Write-only binding to the contract + CheckpointOracleFilterer // Log filterer for contract events +} + +// CheckpointOracleCaller is an auto generated read-only Go binding around an Ethereum contract. +type CheckpointOracleCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CheckpointOracleTransactor is an auto generated write-only Go binding around an Ethereum contract. +type CheckpointOracleTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CheckpointOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type CheckpointOracleFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CheckpointOracleSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type CheckpointOracleSession struct { + Contract *CheckpointOracle // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CheckpointOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type CheckpointOracleCallerSession struct { + Contract *CheckpointOracleCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// CheckpointOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type CheckpointOracleTransactorSession struct { + Contract *CheckpointOracleTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CheckpointOracleRaw is an auto generated low-level Go binding around an Ethereum contract. +type CheckpointOracleRaw struct { + Contract *CheckpointOracle // Generic contract binding to access the raw methods on +} + +// CheckpointOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type CheckpointOracleCallerRaw struct { + Contract *CheckpointOracleCaller // Generic read-only contract binding to access the raw methods on +} + +// CheckpointOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type CheckpointOracleTransactorRaw struct { + Contract *CheckpointOracleTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewCheckpointOracle creates a new instance of CheckpointOracle, bound to a specific deployed contract. +func NewCheckpointOracle(address common.Address, backend bind.ContractBackend) (*CheckpointOracle, error) { + contract, err := bindCheckpointOracle(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CheckpointOracle{CheckpointOracleCaller: CheckpointOracleCaller{contract: contract}, CheckpointOracleTransactor: CheckpointOracleTransactor{contract: contract}, CheckpointOracleFilterer: CheckpointOracleFilterer{contract: contract}}, nil +} + +// NewCheckpointOracleCaller creates a new read-only instance of CheckpointOracle, bound to a specific deployed contract. +func NewCheckpointOracleCaller(address common.Address, caller bind.ContractCaller) (*CheckpointOracleCaller, error) { + contract, err := bindCheckpointOracle(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CheckpointOracleCaller{contract: contract}, nil +} + +// NewCheckpointOracleTransactor creates a new write-only instance of CheckpointOracle, bound to a specific deployed contract. +func NewCheckpointOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*CheckpointOracleTransactor, error) { + contract, err := bindCheckpointOracle(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CheckpointOracleTransactor{contract: contract}, nil +} + +// NewCheckpointOracleFilterer creates a new log filterer instance of CheckpointOracle, bound to a specific deployed contract. +func NewCheckpointOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*CheckpointOracleFilterer, error) { + contract, err := bindCheckpointOracle(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CheckpointOracleFilterer{contract: contract}, nil +} + +// bindCheckpointOracle binds a generic wrapper to an already deployed contract. +func bindCheckpointOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(CheckpointOracleABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CheckpointOracle *CheckpointOracleRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _CheckpointOracle.Contract.CheckpointOracleCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CheckpointOracle *CheckpointOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CheckpointOracle.Contract.CheckpointOracleTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CheckpointOracle *CheckpointOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CheckpointOracle.Contract.CheckpointOracleTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CheckpointOracle *CheckpointOracleCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _CheckpointOracle.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CheckpointOracle *CheckpointOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CheckpointOracle.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CheckpointOracle *CheckpointOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CheckpointOracle.Contract.contract.Transact(opts, method, params...) +} + +// GetAllAdmin is a free data retrieval call binding the contract method 0x45848dfc. +// +// Solidity: function GetAllAdmin() constant returns(address[]) +func (_CheckpointOracle *CheckpointOracleCaller) GetAllAdmin(opts *bind.CallOpts) ([]common.Address, error) { + var ( + ret0 = new([]common.Address) + ) + out := ret0 + err := _CheckpointOracle.contract.Call(opts, out, "GetAllAdmin") + return *ret0, err +} + +// GetAllAdmin is a free data retrieval call binding the contract method 0x45848dfc. +// +// Solidity: function GetAllAdmin() constant returns(address[]) +func (_CheckpointOracle *CheckpointOracleSession) GetAllAdmin() ([]common.Address, error) { + return _CheckpointOracle.Contract.GetAllAdmin(&_CheckpointOracle.CallOpts) +} + +// GetAllAdmin is a free data retrieval call binding the contract method 0x45848dfc. +// +// Solidity: function GetAllAdmin() constant returns(address[]) +func (_CheckpointOracle *CheckpointOracleCallerSession) GetAllAdmin() ([]common.Address, error) { + return _CheckpointOracle.Contract.GetAllAdmin(&_CheckpointOracle.CallOpts) +} + +// GetLatestCheckpoint is a free data retrieval call binding the contract method 0x4d6a304c. +// +// Solidity: function GetLatestCheckpoint() constant returns(uint64, bytes32, uint256) +func (_CheckpointOracle *CheckpointOracleCaller) GetLatestCheckpoint(opts *bind.CallOpts) (uint64, [32]byte, *big.Int, error) { + var ( + ret0 = new(uint64) + ret1 = new([32]byte) + ret2 = new(*big.Int) + ) + out := &[]interface{}{ + ret0, + ret1, + ret2, + } + err := _CheckpointOracle.contract.Call(opts, out, "GetLatestCheckpoint") + return *ret0, *ret1, *ret2, err +} + +// GetLatestCheckpoint is a free data retrieval call binding the contract method 0x4d6a304c. +// +// Solidity: function GetLatestCheckpoint() constant returns(uint64, bytes32, uint256) +func (_CheckpointOracle *CheckpointOracleSession) GetLatestCheckpoint() (uint64, [32]byte, *big.Int, error) { + return _CheckpointOracle.Contract.GetLatestCheckpoint(&_CheckpointOracle.CallOpts) +} + +// GetLatestCheckpoint is a free data retrieval call binding the contract method 0x4d6a304c. +// +// Solidity: function GetLatestCheckpoint() constant returns(uint64, bytes32, uint256) +func (_CheckpointOracle *CheckpointOracleCallerSession) GetLatestCheckpoint() (uint64, [32]byte, *big.Int, error) { + return _CheckpointOracle.Contract.GetLatestCheckpoint(&_CheckpointOracle.CallOpts) +} + +// SetCheckpoint is a paid mutator transaction binding the contract method 0xd459fc46. +// +// Solidity: function SetCheckpoint(uint256 _recentNumber, bytes32 _recentHash, bytes32 _hash, uint64 _sectionIndex, uint8[] v, bytes32[] r, bytes32[] s) returns(bool) +func (_CheckpointOracle *CheckpointOracleTransactor) SetCheckpoint(opts *bind.TransactOpts, _recentNumber *big.Int, _recentHash [32]byte, _hash [32]byte, _sectionIndex uint64, v []uint8, r [][32]byte, s [][32]byte) (*types.Transaction, error) { + return _CheckpointOracle.contract.Transact(opts, "SetCheckpoint", _recentNumber, _recentHash, _hash, _sectionIndex, v, r, s) +} + +// SetCheckpoint is a paid mutator transaction binding the contract method 0xd459fc46. +// +// Solidity: function SetCheckpoint(uint256 _recentNumber, bytes32 _recentHash, bytes32 _hash, uint64 _sectionIndex, uint8[] v, bytes32[] r, bytes32[] s) returns(bool) +func (_CheckpointOracle *CheckpointOracleSession) SetCheckpoint(_recentNumber *big.Int, _recentHash [32]byte, _hash [32]byte, _sectionIndex uint64, v []uint8, r [][32]byte, s [][32]byte) (*types.Transaction, error) { + return _CheckpointOracle.Contract.SetCheckpoint(&_CheckpointOracle.TransactOpts, _recentNumber, _recentHash, _hash, _sectionIndex, v, r, s) +} + +// SetCheckpoint is a paid mutator transaction binding the contract method 0xd459fc46. +// +// Solidity: function SetCheckpoint(uint256 _recentNumber, bytes32 _recentHash, bytes32 _hash, uint64 _sectionIndex, uint8[] v, bytes32[] r, bytes32[] s) returns(bool) +func (_CheckpointOracle *CheckpointOracleTransactorSession) SetCheckpoint(_recentNumber *big.Int, _recentHash [32]byte, _hash [32]byte, _sectionIndex uint64, v []uint8, r [][32]byte, s [][32]byte) (*types.Transaction, error) { + return _CheckpointOracle.Contract.SetCheckpoint(&_CheckpointOracle.TransactOpts, _recentNumber, _recentHash, _hash, _sectionIndex, v, r, s) +} + +// CheckpointOracleNewCheckpointVoteIterator is returned from FilterNewCheckpointVote and is used to iterate over the raw logs and unpacked data for NewCheckpointVote events raised by the CheckpointOracle contract. +type CheckpointOracleNewCheckpointVoteIterator struct { + Event *CheckpointOracleNewCheckpointVote // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CheckpointOracleNewCheckpointVoteIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CheckpointOracleNewCheckpointVote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CheckpointOracleNewCheckpointVote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CheckpointOracleNewCheckpointVoteIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CheckpointOracleNewCheckpointVoteIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CheckpointOracleNewCheckpointVote represents a NewCheckpointVote event raised by the CheckpointOracle contract. +type CheckpointOracleNewCheckpointVote struct { + Index uint64 + CheckpointHash [32]byte + V uint8 + R [32]byte + S [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNewCheckpointVote is a free log retrieval operation binding the contract event 0xce51ffa16246bcaf0899f6504f473cd0114f430f566cef71ab7e03d3dde42a41. +// +// Solidity: event NewCheckpointVote(uint64 indexed index, bytes32 checkpointHash, uint8 v, bytes32 r, bytes32 s) +func (_CheckpointOracle *CheckpointOracleFilterer) FilterNewCheckpointVote(opts *bind.FilterOpts, index []uint64) (*CheckpointOracleNewCheckpointVoteIterator, error) { + + var indexRule []interface{} + for _, indexItem := range index { + indexRule = append(indexRule, indexItem) + } + + logs, sub, err := _CheckpointOracle.contract.FilterLogs(opts, "NewCheckpointVote", indexRule) + if err != nil { + return nil, err + } + return &CheckpointOracleNewCheckpointVoteIterator{contract: _CheckpointOracle.contract, event: "NewCheckpointVote", logs: logs, sub: sub}, nil +} + +// WatchNewCheckpointVote is a free log subscription operation binding the contract event 0xce51ffa16246bcaf0899f6504f473cd0114f430f566cef71ab7e03d3dde42a41. +// +// Solidity: event NewCheckpointVote(uint64 indexed index, bytes32 checkpointHash, uint8 v, bytes32 r, bytes32 s) +func (_CheckpointOracle *CheckpointOracleFilterer) WatchNewCheckpointVote(opts *bind.WatchOpts, sink chan<- *CheckpointOracleNewCheckpointVote, index []uint64) (event.Subscription, error) { + + var indexRule []interface{} + for _, indexItem := range index { + indexRule = append(indexRule, indexItem) + } + + logs, sub, err := _CheckpointOracle.contract.WatchLogs(opts, "NewCheckpointVote", indexRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CheckpointOracleNewCheckpointVote) + if err := _CheckpointOracle.contract.UnpackLog(event, "NewCheckpointVote", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNewCheckpointVote is a log parse operation binding the contract event 0xce51ffa16246bcaf0899f6504f473cd0114f430f566cef71ab7e03d3dde42a41. +// +// Solidity: event NewCheckpointVote(uint64 indexed index, bytes32 checkpointHash, uint8 v, bytes32 r, bytes32 s) +func (_CheckpointOracle *CheckpointOracleFilterer) ParseNewCheckpointVote(log types.Log) (*CheckpointOracleNewCheckpointVote, error) { + event := new(CheckpointOracleNewCheckpointVote) + if err := _CheckpointOracle.contract.UnpackLog(event, "NewCheckpointVote", log); err != nil { + return nil, err + } + return event, nil +} diff --git a/contracts/checkpointoracle/contract/oracle.sol b/contracts/checkpointoracle/contract/oracle.sol new file mode 100644 index 000000000000..010644727374 --- /dev/null +++ b/contracts/checkpointoracle/contract/oracle.sol @@ -0,0 +1,174 @@ +pragma solidity ^0.5.10; + +/** + * @title CheckpointOracle + * @author Gary Rong, Martin Swende + * @dev Implementation of the blockchain checkpoint registrar. + */ +contract CheckpointOracle { + /* + Events + */ + + // NewCheckpointVote is emitted when a new checkpoint proposal receives a vote. + event NewCheckpointVote(uint64 indexed index, bytes32 checkpointHash, uint8 v, bytes32 r, bytes32 s); + + /* + Public Functions + */ + constructor(address[] memory _adminlist, uint _sectionSize, uint _processConfirms, uint _threshold) public { + for (uint i = 0; i < _adminlist.length; i++) { + admins[_adminlist[i]] = true; + adminList.push(_adminlist[i]); + } + sectionSize = _sectionSize; + processConfirms = _processConfirms; + threshold = _threshold; + } + + /** + * @dev Get latest stable checkpoint information. + * @return section index + * @return checkpoint hash + * @return block height associated with checkpoint + */ + function GetLatestCheckpoint() + view + public + returns(uint64, bytes32, uint) { + return (sectionIndex, hash, height); + } + + // SetCheckpoint sets a new checkpoint. It accepts a list of signatures + // @_recentNumber: a recent blocknumber, for replay protection + // @_recentHash : the hash of `_recentNumber` + // @_hash : the hash to set at _sectionIndex + // @_sectionIndex : the section index to set + // @v : the list of v-values + // @r : the list or r-values + // @s : the list of s-values + function SetCheckpoint( + uint _recentNumber, + bytes32 _recentHash, + bytes32 _hash, + uint64 _sectionIndex, + uint8[] memory v, + bytes32[] memory r, + bytes32[] memory s) + public + returns (bool) + { + // Ensure the sender is authorized. + require(admins[msg.sender]); + + // These checks replay protection, so it cannot be replayed on forks, + // accidentally or intentionally + require(blockhash(_recentNumber) == _recentHash); + + // Ensure the batch of signatures are valid. + require(v.length == r.length); + require(v.length == s.length); + + // Filter out "future" checkpoint. + if (block.number < (_sectionIndex+1)*sectionSize+processConfirms) { + return false; + } + // Filter out "old" announcement + if (_sectionIndex < sectionIndex) { + return false; + } + // Filter out "stale" announcement + if (_sectionIndex == sectionIndex && (_sectionIndex != 0 || height != 0)) { + return false; + } + // Filter out "invalid" announcement + if (_hash == ""){ + return false; + } + + // EIP 191 style signatures + // + // Arguments when calculating hash to validate + // 1: byte(0x19) - the initial 0x19 byte + // 2: byte(0) - the version byte (data with intended validator) + // 3: this - the validator address + // -- Application specific data + // 4 : checkpoint section_index(uint64) + // 5 : checkpoint hash (bytes32) + // hash = keccak256(checkpoint_index, section_head, cht_root, bloom_root) + bytes32 signedHash = keccak256(abi.encodePacked(byte(0x19), byte(0), this, _sectionIndex, _hash)); + + address lastVoter = address(0); + + // In order for us not to have to maintain a mapping of who has already + // voted, and we don't want to count a vote twice, the signatures must + // be submitted in strict ordering. + for (uint idx = 0; idx < v.length; idx++){ + address signer = ecrecover(signedHash, v[idx], r[idx], s[idx]); + require(admins[signer]); + require(uint256(signer) > uint256(lastVoter)); + lastVoter = signer; + emit NewCheckpointVote(_sectionIndex, _hash, v[idx], r[idx], s[idx]); + + // Sufficient signatures present, update latest checkpoint. + if (idx+1 >= threshold){ + hash = _hash; + height = block.number; + sectionIndex = _sectionIndex; + return true; + } + } + // We shouldn't wind up here, reverting un-emits the events + revert(); + } + + /** + * @dev Get all admin addresses + * @return address list + */ + function GetAllAdmin() + public + view + returns(address[] memory) + { + address[] memory ret = new address[](adminList.length); + for (uint i = 0; i < adminList.length; i++) { + ret[i] = adminList[i]; + } + return ret; + } + + /* + Fields + */ + // A map of admin users who have the permission to update CHT and bloom Trie root + mapping(address => bool) admins; + + // A list of admin users so that we can obtain all admin users. + address[] adminList; + + // Latest stored section id + uint64 sectionIndex; + + // The block height associated with latest registered checkpoint. + uint height; + + // The hash of latest registered checkpoint. + bytes32 hash; + + // The frequency for creating a checkpoint + // + // The default value should be the same as the checkpoint size(32768) in the ethereum. + uint sectionSize; + + // The number of confirmations needed before a checkpoint can be registered. + // We have to make sure the checkpoint registered will not be invalid due to + // chain reorg. + // + // The default value should be the same as the checkpoint process confirmations(256) + // in the ethereum. + uint processConfirms; + + // The required signatures to finalize a stable checkpoint. + uint threshold; +} diff --git a/contracts/checkpointoracle/oracle.go b/contracts/checkpointoracle/oracle.go new file mode 100644 index 000000000000..2d725397bdf0 --- /dev/null +++ b/contracts/checkpointoracle/oracle.go @@ -0,0 +1,90 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package checkpointoracle is a an on-chain light client checkpoint oracle. +package checkpointoracle + +//go:generate abigen --sol contract/oracle.sol --pkg contract --out contract/oracle.go + +import ( + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle/contract" + "github.com/ethereum/go-ethereum/core/types" +) + +// CheckpointOracle is a Go wrapper around an on-chain light client checkpoint oracle. +type CheckpointOracle struct { + contract *contract.CheckpointOracle +} + +// NewCheckpointOracle binds checkpoint contract and returns a registrar instance. +func NewCheckpointOracle(contractAddr common.Address, backend bind.ContractBackend) (*CheckpointOracle, error) { + c, err := contract.NewCheckpointOracle(contractAddr, backend) + if err != nil { + return nil, err + } + return &CheckpointOracle{contract: c}, nil +} + +// Contract returns the underlying contract instance. +func (oracle *CheckpointOracle) Contract() *contract.CheckpointOracle { + return oracle.contract +} + +// LookupCheckpointEvents searches checkpoint event for specific section in the +// given log batches. +func (oracle *CheckpointOracle) LookupCheckpointEvents(blockLogs [][]*types.Log, section uint64, hash common.Hash) []*contract.CheckpointOracleNewCheckpointVote { + var votes []*contract.CheckpointOracleNewCheckpointVote + + for _, logs := range blockLogs { + for _, log := range logs { + event, err := oracle.contract.ParseNewCheckpointVote(*log) + if err != nil { + continue + } + if event.Index == section && common.Hash(event.CheckpointHash) == hash { + votes = append(votes, event) + } + } + } + return votes +} + +// RegisterCheckpoint registers the checkpoint with a batch of associated signatures +// that are collected off-chain and sorted by lexicographical order. +// +// Notably all signatures given should be transformed to "ethereum style" which transforms +// v from 0/1 to 27/28 according to the yellow paper. +func (oracle *CheckpointOracle) RegisterCheckpoint(opts *bind.TransactOpts, index uint64, hash []byte, rnum *big.Int, rhash [32]byte, sigs [][]byte) (*types.Transaction, error) { + var ( + r [][32]byte + s [][32]byte + v []uint8 + ) + for i := 0; i < len(sigs); i++ { + if len(sigs[i]) != 65 { + return nil, errors.New("invalid signature") + } + r = append(r, common.BytesToHash(sigs[i][:32])) + s = append(s, common.BytesToHash(sigs[i][32:64])) + v = append(v, sigs[i][64]) + } + return oracle.contract.SetCheckpoint(opts, rnum, rhash, common.BytesToHash(hash), index, v, r, s) +} diff --git a/contracts/checkpointoracle/oracle_test.go b/contracts/checkpointoracle/oracle_test.go new file mode 100644 index 000000000000..5986ea0d861e --- /dev/null +++ b/contracts/checkpointoracle/oracle_test.go @@ -0,0 +1,333 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package checkpointoracle + +import ( + "bytes" + "crypto/ecdsa" + "encoding/binary" + "errors" + "math/big" + "reflect" + "sort" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle/contract" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" +) + +var ( + emptyHash = [32]byte{} + + checkpoint0 = params.TrustedCheckpoint{ + SectionIndex: 0, + SectionHead: common.HexToHash("0x7fa3c32f996c2bfb41a1a65b3d8ea3e0a33a1674cde43678ad6f4235e764d17d"), + CHTRoot: common.HexToHash("0x98fc5d3de23a0fecebad236f6655533c157d26a1aedcd0852a514dc1169e6350"), + BloomRoot: common.HexToHash("0x99b5adb52b337fe25e74c1c6d3835b896bd638611b3aebddb2317cce27a3f9fa"), + } + checkpoint1 = params.TrustedCheckpoint{ + SectionIndex: 1, + SectionHead: common.HexToHash("0x2d4dee68102125e59b0cc61b176bd89f0d12b3b91cfaf52ef8c2c82fb920c2d2"), + CHTRoot: common.HexToHash("0x7d428008ece3b4c4ef5439f071930aad0bb75108d381308df73beadcd01ded95"), + BloomRoot: common.HexToHash("0x652571f7736de17e7bbb427ac881474da684c6988a88bf51b10cca9a2ee148f4"), + } + checkpoint2 = params.TrustedCheckpoint{ + SectionIndex: 2, + SectionHead: common.HexToHash("0x61c0de578c0115b1dff8ef39aa600588c7c6ecb8a2f102003d7cf4c4146e9291"), + CHTRoot: common.HexToHash("0x407a08a407a2bc3838b74ca3eb206903c9c8a186ccf5ef14af07794efff1970b"), + BloomRoot: common.HexToHash("0x058b4161f558ce295a92925efc57f34f9210d5a30088d7475c183e0d3e58f5ac"), + } +) + +var ( + // The block frequency for creating checkpoint(only used in test) + sectionSize = big.NewInt(512) + + // The number of confirmations needed to generate a checkpoint(only used in test). + processConfirms = big.NewInt(4) +) + +// validateOperation executes the operation, watches and delivers all events fired by the backend and ensures the +// correctness by assert function. +func validateOperation(t *testing.T, c *contract.CheckpointOracle, backend *backends.SimulatedBackend, operation func(), + assert func(<-chan *contract.CheckpointOracleNewCheckpointVote) error, opName string) { + // Watch all events and deliver them to assert function + var ( + sink = make(chan *contract.CheckpointOracleNewCheckpointVote) + sub, _ = c.WatchNewCheckpointVote(nil, sink, nil) + ) + defer func() { + // Close all subscribers + sub.Unsubscribe() + }() + operation() + + // flush pending block + backend.Commit() + if err := assert(sink); err != nil { + t.Errorf("operation {%s} failed, err %s", opName, err) + } +} + +// validateEvents checks that the correct number of contract events +// fired by contract backend. +func validateEvents(target int, sink interface{}) (bool, []reflect.Value) { + chanval := reflect.ValueOf(sink) + chantyp := chanval.Type() + if chantyp.Kind() != reflect.Chan || chantyp.ChanDir()&reflect.RecvDir == 0 { + return false, nil + } + count := 0 + var recv []reflect.Value + timeout := time.After(1 * time.Second) + cases := []reflect.SelectCase{{Chan: chanval, Dir: reflect.SelectRecv}, {Chan: reflect.ValueOf(timeout), Dir: reflect.SelectRecv}} + for { + chose, v, _ := reflect.Select(cases) + if chose == 1 { + // Not enough event received + return false, nil + } + count += 1 + recv = append(recv, v) + if count == target { + break + } + } + done := time.After(50 * time.Millisecond) + cases = cases[:1] + cases = append(cases, reflect.SelectCase{Chan: reflect.ValueOf(done), Dir: reflect.SelectRecv}) + chose, _, _ := reflect.Select(cases) + // If chose equal 0, it means receiving redundant events. + return chose == 1, recv +} + +func signCheckpoint(addr common.Address, privateKey *ecdsa.PrivateKey, index uint64, hash common.Hash) []byte { + // EIP 191 style signatures + // + // Arguments when calculating hash to validate + // 1: byte(0x19) - the initial 0x19 byte + // 2: byte(0) - the version byte (data with intended validator) + // 3: this - the validator address + // -- Application specific data + // 4 : checkpoint section_index(uint64) + // 5 : checkpoint hash (bytes32) + // hash = keccak256(checkpoint_index, section_head, cht_root, bloom_root) + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, index) + data := append([]byte{0x19, 0x00}, append(addr.Bytes(), append(buf, hash.Bytes()...)...)...) + sig, _ := crypto.Sign(crypto.Keccak256(data), privateKey) + sig[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper + return sig +} + +// assertSignature verifies whether the recovered signers are equal with expected. +func assertSignature(addr common.Address, index uint64, hash [32]byte, r, s [32]byte, v uint8, expect common.Address) bool { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, index) + data := append([]byte{0x19, 0x00}, append(addr.Bytes(), append(buf, hash[:]...)...)...) + pubkey, err := crypto.Ecrecover(crypto.Keccak256(data), append(r[:], append(s[:], v-27)...)) + if err != nil { + return false + } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) + return bytes.Equal(signer.Bytes(), expect.Bytes()) +} + +type Account struct { + key *ecdsa.PrivateKey + addr common.Address +} +type Accounts []Account + +func (a Accounts) Len() int { return len(a) } +func (a Accounts) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a Accounts) Less(i, j int) bool { return bytes.Compare(a[i].addr.Bytes(), a[j].addr.Bytes()) < 0 } + +func TestCheckpointRegister(t *testing.T) { + // Initialize test accounts + var accounts Accounts + for i := 0; i < 3; i++ { + key, _ := crypto.GenerateKey() + addr := crypto.PubkeyToAddress(key.PublicKey) + accounts = append(accounts, Account{key: key, addr: addr}) + } + sort.Sort(accounts) + + // Deploy registrar contract + transactOpts := bind.NewKeyedTransactor(accounts[0].key) + contractBackend := backends.NewSimulatedBackend(core.GenesisAlloc{accounts[0].addr: {Balance: big.NewInt(1000000000)}, accounts[1].addr: {Balance: big.NewInt(1000000000)}, accounts[2].addr: {Balance: big.NewInt(1000000000)}}, 10000000) + // 3 trusted signers, threshold 2 + contractAddr, _, c, err := contract.DeployCheckpointOracle(transactOpts, contractBackend, []common.Address{accounts[0].addr, accounts[1].addr, accounts[2].addr}, sectionSize, processConfirms, big.NewInt(2)) + if err != nil { + t.Error("Failed to deploy registrar contract", err) + } + contractBackend.Commit() + + // getRecent returns block height and hash of the head parent. + getRecent := func() (*big.Int, common.Hash) { + parentNumber := new(big.Int).Sub(contractBackend.Blockchain().CurrentHeader().Number, big.NewInt(1)) + parentHash := contractBackend.Blockchain().CurrentHeader().ParentHash + return parentNumber, parentHash + } + // collectSig generates specified number signatures. + collectSig := func(index uint64, hash common.Hash, n int, unauthorized *ecdsa.PrivateKey) (v []uint8, r [][32]byte, s [][32]byte) { + for i := 0; i < n; i++ { + sig := signCheckpoint(contractAddr, accounts[i].key, index, hash) + if unauthorized != nil { + sig = signCheckpoint(contractAddr, unauthorized, index, hash) + } + r = append(r, common.BytesToHash(sig[:32])) + s = append(s, common.BytesToHash(sig[32:64])) + v = append(v, sig[64]) + } + return v, r, s + } + // insertEmptyBlocks inserts a batch of empty blocks to blockchain. + insertEmptyBlocks := func(number int) { + for i := 0; i < number; i++ { + contractBackend.Commit() + } + } + // assert checks whether the current contract status is same with + // the expected. + assert := func(index uint64, hash [32]byte, height *big.Int) error { + lindex, lhash, lheight, err := c.GetLatestCheckpoint(nil) + if err != nil { + return err + } + if lindex != index { + return errors.New("latest checkpoint index mismatch") + } + if !bytes.Equal(lhash[:], hash[:]) { + return errors.New("latest checkpoint hash mismatch") + } + if lheight.Cmp(height) != 0 { + return errors.New("latest checkpoint height mismatch") + } + return nil + } + + // Test future checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(0, checkpoint0.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + return assert(0, emptyHash, big.NewInt(0)) + }, "test future checkpoint registration") + + insertEmptyBlocks(int(sectionSize.Uint64() + processConfirms.Uint64())) + + // Test transaction replay protection + validateOperation(t, c, contractBackend, func() { + number, _ := getRecent() + v, r, s := collectSig(0, checkpoint0.Hash(), 2, nil) + hash := common.HexToHash("deadbeef") + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + return assert(0, emptyHash, big.NewInt(0)) + }, "test transaction replay protection") + + // Test unauthorized signature checking + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + u, _ := crypto.GenerateKey() + v, r, s := collectSig(0, checkpoint0.Hash(), 2, u) + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + return assert(0, emptyHash, big.NewInt(0)) + }, "test unauthorized signature checking") + + // Test un-multi-signature checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(0, checkpoint0.Hash(), 1, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + return assert(0, emptyHash, big.NewInt(0)) + }, "test un-multi-signature checkpoint registration") + + // Test valid checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(0, checkpoint0.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + if valid, recv := validateEvents(2, events); !valid { + return errors.New("receive incorrect number of events") + } else { + for i := 0; i < len(recv); i++ { + event := recv[i].Interface().(*contract.CheckpointOracleNewCheckpointVote) + if !assertSignature(contractAddr, event.Index, event.CheckpointHash, event.R, event.S, event.V, accounts[i].addr) { + return errors.New("recover signer failed") + } + } + } + number, _ := getRecent() + return assert(0, checkpoint0.Hash(), number.Add(number, big.NewInt(1))) + }, "test valid checkpoint registration") + + distance := 3*sectionSize.Uint64() + processConfirms.Uint64() - contractBackend.Blockchain().CurrentHeader().Number.Uint64() + insertEmptyBlocks(int(distance)) + + // Test uncontinuous checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(2, checkpoint2.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint2.Hash(), 2, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + if valid, recv := validateEvents(2, events); !valid { + return errors.New("receive incorrect number of events") + } else { + for i := 0; i < len(recv); i++ { + event := recv[i].Interface().(*contract.CheckpointOracleNewCheckpointVote) + if !assertSignature(contractAddr, event.Index, event.CheckpointHash, event.R, event.S, event.V, accounts[i].addr) { + return errors.New("recover signer failed") + } + } + } + number, _ := getRecent() + return assert(2, checkpoint2.Hash(), number.Add(number, big.NewInt(1))) + }, "test uncontinuous checkpoint registration") + + // Test old checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(1, checkpoint1.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint1.Hash(), 1, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + number, _ := getRecent() + return assert(2, checkpoint2.Hash(), number) + }, "test uncontinuous checkpoint registration") + + // Test stale checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(2, checkpoint2.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint2.Hash(), 2, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + number, _ := getRecent() + return assert(2, checkpoint2.Hash(), number.Sub(number, big.NewInt(1))) + }, "test stale checkpoint registration") +} diff --git a/contracts/chequebook/api.go b/contracts/chequebook/api.go deleted file mode 100644 index b2b2365f31ff..000000000000 --- a/contracts/chequebook/api.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package chequebook - -import ( - "errors" - "math/big" - - "github.com/ethereum/go-ethereum/common" -) - -const Version = "1.0" - -var errNoChequebook = errors.New("no chequebook") - -type Api struct { - chequebookf func() *Chequebook -} - -func NewApi(ch func() *Chequebook) *Api { - return &Api{ch} -} - -func (self *Api) Balance() (string, error) { - ch := self.chequebookf() - if ch == nil { - return "", errNoChequebook - } - return ch.Balance().String(), nil -} - -func (self *Api) Issue(beneficiary common.Address, amount *big.Int) (cheque *Cheque, err error) { - ch := self.chequebookf() - if ch == nil { - return nil, errNoChequebook - } - return ch.Issue(beneficiary, amount) -} - -func (self *Api) Cash(cheque *Cheque) (txhash string, err error) { - ch := self.chequebookf() - if ch == nil { - return "", errNoChequebook - } - return ch.Cash(cheque) -} - -func (self *Api) Deposit(amount *big.Int) (txhash string, err error) { - ch := self.chequebookf() - if ch == nil { - return "", errNoChequebook - } - return ch.Deposit(amount) -} diff --git a/contracts/chequebook/cheque.go b/contracts/chequebook/cheque.go deleted file mode 100644 index 92bd896e0a6a..000000000000 --- a/contracts/chequebook/cheque.go +++ /dev/null @@ -1,641 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package chequebook package wraps the 'chequebook' Ethereum smart contract. -// -// The functions in this package allow using chequebook for -// issuing, receiving, verifying cheques in ether; (auto)cashing cheques in ether -// as well as (auto)depositing ether to the chequebook contract. -package chequebook - -//go:generate abigen --sol contract/chequebook.sol --exc contract/mortal.sol:mortal,contract/owned.sol:owned --pkg contract --out contract/chequebook.go -//go:generate go run ./gencode.go - -import ( - "bytes" - "context" - "crypto/ecdsa" - "encoding/json" - "fmt" - "io/ioutil" - "math/big" - "os" - "sync" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/contracts/chequebook/contract" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/services/swap/swap" -) - -// TODO(zelig): watch peer solvency and notify of bouncing cheques -// TODO(zelig): enable paying with cheque by signing off - -// Some functionality requires interacting with the blockchain: -// * setting current balance on peer's chequebook -// * sending the transaction to cash the cheque -// * depositing ether to the chequebook -// * watching incoming ether - -var ( - gasToCash = uint64(2000000) // gas cost of a cash transaction using chequebook - // gasToDeploy = uint64(3000000) -) - -// Backend wraps all methods required for chequebook operation. -type Backend interface { - bind.ContractBackend - TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) - BalanceAt(ctx context.Context, address common.Address, blockNum *big.Int) (*big.Int, error) -} - -// Cheque represents a payment promise to a single beneficiary. -type Cheque struct { - Contract common.Address // address of chequebook, needed to avoid cross-contract submission - Beneficiary common.Address - Amount *big.Int // cumulative amount of all funds sent - Sig []byte // signature Sign(Keccak256(contract, beneficiary, amount), prvKey) -} - -func (self *Cheque) String() string { - return fmt.Sprintf("contract: %s, beneficiary: %s, amount: %v, signature: %x", self.Contract.Hex(), self.Beneficiary.Hex(), self.Amount, self.Sig) -} - -type Params struct { - ContractCode, ContractAbi string -} - -var ContractParams = &Params{contract.ChequebookBin, contract.ChequebookABI} - -// Chequebook can create and sign cheques from a single contract to multiple beneficiaries. -// It is the outgoing payment handler for peer to peer micropayments. -type Chequebook struct { - path string // path to chequebook file - prvKey *ecdsa.PrivateKey // private key to sign cheque with - lock sync.Mutex // - backend Backend // blockchain API - quit chan bool // when closed causes autodeposit to stop - owner common.Address // owner address (derived from pubkey) - contract *contract.Chequebook // abigen binding - session *contract.ChequebookSession // abigen binding with Tx Opts - - // persisted fields - balance *big.Int // not synced with blockchain - contractAddr common.Address // contract address - sent map[common.Address]*big.Int //tallies for beneficiaries - - txhash string // tx hash of last deposit tx - threshold *big.Int // threshold that triggers autodeposit if not nil - buffer *big.Int // buffer to keep on top of balance for fork protection - - log log.Logger // contextual logger with the contract address embedded -} - -func (self *Chequebook) String() string { - return fmt.Sprintf("contract: %s, owner: %s, balance: %v, signer: %x", self.contractAddr.Hex(), self.owner.Hex(), self.balance, self.prvKey.PublicKey) -} - -// NewChequebook creates a new Chequebook. -func NewChequebook(path string, contractAddr common.Address, prvKey *ecdsa.PrivateKey, backend Backend) (self *Chequebook, err error) { - balance := new(big.Int) - sent := make(map[common.Address]*big.Int) - - chbook, err := contract.NewChequebook(contractAddr, backend) - if err != nil { - return nil, err - } - transactOpts := bind.NewKeyedTransactor(prvKey) - session := &contract.ChequebookSession{ - Contract: chbook, - TransactOpts: *transactOpts, - } - - self = &Chequebook{ - prvKey: prvKey, - balance: balance, - contractAddr: contractAddr, - sent: sent, - path: path, - backend: backend, - owner: transactOpts.From, - contract: chbook, - session: session, - log: log.New("contract", contractAddr), - } - - if (contractAddr != common.Address{}) { - self.setBalanceFromBlockChain() - self.log.Trace("New chequebook initialised", "owner", self.owner, "balance", self.balance) - } - return -} - -func (self *Chequebook) setBalanceFromBlockChain() { - balance, err := self.backend.BalanceAt(context.TODO(), self.contractAddr, nil) - if err != nil { - log.Error("Failed to retrieve chequebook balance", "err", err) - } else { - self.balance.Set(balance) - } -} - -// LoadChequebook loads a chequebook from disk (file path). -func LoadChequebook(path string, prvKey *ecdsa.PrivateKey, backend Backend, checkBalance bool) (self *Chequebook, err error) { - var data []byte - data, err = ioutil.ReadFile(path) - if err != nil { - return - } - self, _ = NewChequebook(path, common.Address{}, prvKey, backend) - - err = json.Unmarshal(data, self) - if err != nil { - return nil, err - } - if checkBalance { - self.setBalanceFromBlockChain() - } - log.Trace("Loaded chequebook from disk", "path", path) - - return -} - -// chequebookFile is the JSON representation of a chequebook. -type chequebookFile struct { - Balance string - Contract string - Owner string - Sent map[string]string -} - -// UnmarshalJSON deserialises a chequebook. -func (self *Chequebook) UnmarshalJSON(data []byte) error { - var file chequebookFile - err := json.Unmarshal(data, &file) - if err != nil { - return err - } - _, ok := self.balance.SetString(file.Balance, 10) - if !ok { - return fmt.Errorf("cumulative amount sent: unable to convert string to big integer: %v", file.Balance) - } - self.contractAddr = common.HexToAddress(file.Contract) - for addr, sent := range file.Sent { - self.sent[common.HexToAddress(addr)], ok = new(big.Int).SetString(sent, 10) - if !ok { - return fmt.Errorf("beneficiary %v cumulative amount sent: unable to convert string to big integer: %v", addr, sent) - } - } - return nil -} - -// MarshalJSON serialises a chequebook. -func (self *Chequebook) MarshalJSON() ([]byte, error) { - var file = &chequebookFile{ - Balance: self.balance.String(), - Contract: self.contractAddr.Hex(), - Owner: self.owner.Hex(), - Sent: make(map[string]string), - } - for addr, sent := range self.sent { - file.Sent[addr.Hex()] = sent.String() - } - return json.Marshal(file) -} - -// Save persists the chequebook on disk, remembering balance, contract address and -// cumulative amount of funds sent for each beneficiary. -func (self *Chequebook) Save() (err error) { - data, err := json.MarshalIndent(self, "", " ") - if err != nil { - return err - } - self.log.Trace("Saving chequebook to disk", self.path) - - return ioutil.WriteFile(self.path, data, os.ModePerm) -} - -// Stop quits the autodeposit go routine to terminate -func (self *Chequebook) Stop() { - defer self.lock.Unlock() - self.lock.Lock() - if self.quit != nil { - close(self.quit) - self.quit = nil - } -} - -// Issue creates a cheque signed by the chequebook owner's private key. The -// signer commits to a contract (one that they own), a beneficiary and amount. -func (self *Chequebook) Issue(beneficiary common.Address, amount *big.Int) (ch *Cheque, err error) { - defer self.lock.Unlock() - self.lock.Lock() - - if amount.Sign() <= 0 { - return nil, fmt.Errorf("amount must be greater than zero (%v)", amount) - } - if self.balance.Cmp(amount) < 0 { - err = fmt.Errorf("insufficient funds to issue cheque for amount: %v. balance: %v", amount, self.balance) - } else { - var sig []byte - sent, found := self.sent[beneficiary] - if !found { - sent = new(big.Int) - self.sent[beneficiary] = sent - } - sum := new(big.Int).Set(sent) - sum.Add(sum, amount) - - sig, err = crypto.Sign(sigHash(self.contractAddr, beneficiary, sum), self.prvKey) - if err == nil { - ch = &Cheque{ - Contract: self.contractAddr, - Beneficiary: beneficiary, - Amount: sum, - Sig: sig, - } - sent.Set(sum) - self.balance.Sub(self.balance, amount) // subtract amount from balance - } - } - - // auto deposit if threshold is set and balance is less then threshold - // note this is called even if issuing cheque fails - // so we reattempt depositing - if self.threshold != nil { - if self.balance.Cmp(self.threshold) < 0 { - send := new(big.Int).Sub(self.buffer, self.balance) - self.deposit(send) - } - } - - return -} - -// Cash is a convenience method to cash any cheque. -func (self *Chequebook) Cash(ch *Cheque) (txhash string, err error) { - return ch.Cash(self.session) -} - -// data to sign: contract address, beneficiary, cumulative amount of funds ever sent -func sigHash(contract, beneficiary common.Address, sum *big.Int) []byte { - bigamount := sum.Bytes() - if len(bigamount) > 32 { - return nil - } - var amount32 [32]byte - copy(amount32[32-len(bigamount):32], bigamount) - input := append(contract.Bytes(), beneficiary.Bytes()...) - input = append(input, amount32[:]...) - return crypto.Keccak256(input) -} - -// Balance returns the current balance of the chequebook. -func (self *Chequebook) Balance() *big.Int { - defer self.lock.Unlock() - self.lock.Lock() - return new(big.Int).Set(self.balance) -} - -// Owner returns the owner account of the chequebook. -func (self *Chequebook) Owner() common.Address { - return self.owner -} - -// Address returns the on-chain contract address of the chequebook. -func (self *Chequebook) Address() common.Address { - return self.contractAddr -} - -// Deposit deposits money to the chequebook account. -func (self *Chequebook) Deposit(amount *big.Int) (string, error) { - defer self.lock.Unlock() - self.lock.Lock() - return self.deposit(amount) -} - -// deposit deposits amount to the chequebook account. -// The caller must hold self.lock. -func (self *Chequebook) deposit(amount *big.Int) (string, error) { - // since the amount is variable here, we do not use sessions - depositTransactor := bind.NewKeyedTransactor(self.prvKey) - depositTransactor.Value = amount - chbookRaw := &contract.ChequebookRaw{Contract: self.contract} - tx, err := chbookRaw.Transfer(depositTransactor) - if err != nil { - self.log.Warn("Failed to fund chequebook", "amount", amount, "balance", self.balance, "target", self.buffer, "err", err) - return "", err - } - // assume that transaction is actually successful, we add the amount to balance right away - self.balance.Add(self.balance, amount) - self.log.Trace("Deposited funds to chequebook", "amount", amount, "balance", self.balance, "target", self.buffer) - return tx.Hash().Hex(), nil -} - -// AutoDeposit (re)sets interval time and amount which triggers sending funds to the -// chequebook. Contract backend needs to be set if threshold is not less than buffer, then -// deposit will be triggered on every new cheque issued. -func (self *Chequebook) AutoDeposit(interval time.Duration, threshold, buffer *big.Int) { - defer self.lock.Unlock() - self.lock.Lock() - self.threshold = threshold - self.buffer = buffer - self.autoDeposit(interval) -} - -// autoDeposit starts a goroutine that periodically sends funds to the chequebook -// contract caller holds the lock the go routine terminates if Chequebook.quit is closed. -func (self *Chequebook) autoDeposit(interval time.Duration) { - if self.quit != nil { - close(self.quit) - self.quit = nil - } - // if threshold >= balance autodeposit after every cheque issued - if interval == time.Duration(0) || self.threshold != nil && self.buffer != nil && self.threshold.Cmp(self.buffer) >= 0 { - return - } - - ticker := time.NewTicker(interval) - self.quit = make(chan bool) - quit := self.quit - - go func() { - for { - select { - case <-quit: - return - case <-ticker.C: - self.lock.Lock() - if self.balance.Cmp(self.buffer) < 0 { - amount := new(big.Int).Sub(self.buffer, self.balance) - txhash, err := self.deposit(amount) - if err == nil { - self.txhash = txhash - } - } - self.lock.Unlock() - } - } - }() -} - -// Outbox can issue cheques from a single contract to a single beneficiary. -type Outbox struct { - chequeBook *Chequebook - beneficiary common.Address -} - -// NewOutbox creates an outbox. -func NewOutbox(chbook *Chequebook, beneficiary common.Address) *Outbox { - return &Outbox{chbook, beneficiary} -} - -// Issue creates cheque. -func (self *Outbox) Issue(amount *big.Int) (swap.Promise, error) { - return self.chequeBook.Issue(self.beneficiary, amount) -} - -// AutoDeposit enables auto-deposits on the underlying chequebook. -func (self *Outbox) AutoDeposit(interval time.Duration, threshold, buffer *big.Int) { - self.chequeBook.AutoDeposit(interval, threshold, buffer) -} - -// Stop helps satisfy the swap.OutPayment interface. -func (self *Outbox) Stop() {} - -// String implements fmt.Stringer. -func (self *Outbox) String() string { - return fmt.Sprintf("chequebook: %v, beneficiary: %s, balance: %v", self.chequeBook.Address().Hex(), self.beneficiary.Hex(), self.chequeBook.Balance()) -} - -// Inbox can deposit, verify and cash cheques from a single contract to a single -// beneficiary. It is the incoming payment handler for peer to peer micropayments. -type Inbox struct { - lock sync.Mutex - contract common.Address // peer's chequebook contract - beneficiary common.Address // local peer's receiving address - sender common.Address // local peer's address to send cashing tx from - signer *ecdsa.PublicKey // peer's public key - txhash string // tx hash of last cashing tx - session *contract.ChequebookSession // abi contract backend with tx opts - quit chan bool // when closed causes autocash to stop - maxUncashed *big.Int // threshold that triggers autocashing - cashed *big.Int // cumulative amount cashed - cheque *Cheque // last cheque, nil if none yet received - log log.Logger // contextual logger with the contract address embedded -} - -// NewInbox creates an Inbox. An Inboxes is not persisted, the cumulative sum is updated -// from blockchain when first cheque is received. -func NewInbox(prvKey *ecdsa.PrivateKey, contractAddr, beneficiary common.Address, signer *ecdsa.PublicKey, abigen bind.ContractBackend) (self *Inbox, err error) { - if signer == nil { - return nil, fmt.Errorf("signer is null") - } - chbook, err := contract.NewChequebook(contractAddr, abigen) - if err != nil { - return nil, err - } - transactOpts := bind.NewKeyedTransactor(prvKey) - transactOpts.GasLimit = gasToCash - session := &contract.ChequebookSession{ - Contract: chbook, - TransactOpts: *transactOpts, - } - sender := transactOpts.From - - self = &Inbox{ - contract: contractAddr, - beneficiary: beneficiary, - sender: sender, - signer: signer, - session: session, - cashed: new(big.Int).Set(common.Big0), - log: log.New("contract", contractAddr), - } - self.log.Trace("New chequebook inbox initialized", "beneficiary", self.beneficiary, "signer", hexutil.Bytes(crypto.FromECDSAPub(signer))) - return -} - -func (self *Inbox) String() string { - return fmt.Sprintf("chequebook: %v, beneficiary: %s, balance: %v", self.contract.Hex(), self.beneficiary.Hex(), self.cheque.Amount) -} - -// Stop quits the autocash goroutine. -func (self *Inbox) Stop() { - defer self.lock.Unlock() - self.lock.Lock() - if self.quit != nil { - close(self.quit) - self.quit = nil - } -} - -// Cash attempts to cash the current cheque. -func (self *Inbox) Cash() (txhash string, err error) { - if self.cheque != nil { - txhash, err = self.cheque.Cash(self.session) - self.log.Trace("Cashing in chequebook cheque", "amount", self.cheque.Amount, "beneficiary", self.beneficiary) - self.cashed = self.cheque.Amount - } - return -} - -// AutoCash (re)sets maximum time and amount which triggers cashing of the last uncashed -// cheque if maxUncashed is set to 0, then autocash on receipt. -func (self *Inbox) AutoCash(cashInterval time.Duration, maxUncashed *big.Int) { - defer self.lock.Unlock() - self.lock.Lock() - self.maxUncashed = maxUncashed - self.autoCash(cashInterval) -} - -// autoCash starts a loop that periodically clears the last cheque -// if the peer is trusted. Clearing period could be 24h or a week. -// The caller must hold self.lock. -func (self *Inbox) autoCash(cashInterval time.Duration) { - if self.quit != nil { - close(self.quit) - self.quit = nil - } - // if maxUncashed is set to 0, then autocash on receipt - if cashInterval == time.Duration(0) || self.maxUncashed != nil && self.maxUncashed.Sign() == 0 { - return - } - - ticker := time.NewTicker(cashInterval) - self.quit = make(chan bool) - quit := self.quit - - go func() { - for { - select { - case <-quit: - return - case <-ticker.C: - self.lock.Lock() - if self.cheque != nil && self.cheque.Amount.Cmp(self.cashed) != 0 { - txhash, err := self.Cash() - if err == nil { - self.txhash = txhash - } - } - self.lock.Unlock() - } - } - }() -} - -// Receive is called to deposit the latest cheque to the incoming Inbox. -// The given promise must be a *Cheque. -func (self *Inbox) Receive(promise swap.Promise) (*big.Int, error) { - ch := promise.(*Cheque) - - defer self.lock.Unlock() - self.lock.Lock() - - var sum *big.Int - if self.cheque == nil { - // the sum is checked against the blockchain once a cheque is received - tally, err := self.session.Sent(self.beneficiary) - if err != nil { - return nil, fmt.Errorf("inbox: error calling backend to set amount: %v", err) - } - sum = tally - } else { - sum = self.cheque.Amount - } - - amount, err := ch.Verify(self.signer, self.contract, self.beneficiary, sum) - var uncashed *big.Int - if err == nil { - self.cheque = ch - - if self.maxUncashed != nil { - uncashed = new(big.Int).Sub(ch.Amount, self.cashed) - if self.maxUncashed.Cmp(uncashed) < 0 { - self.Cash() - } - } - self.log.Trace("Received cheque in chequebook inbox", "amount", amount, "uncashed", uncashed) - } - - return amount, err -} - -// Verify verifies cheque for signer, contract, beneficiary, amount, valid signature. -func (self *Cheque) Verify(signerKey *ecdsa.PublicKey, contract, beneficiary common.Address, sum *big.Int) (*big.Int, error) { - log.Trace("Verifying chequebook cheque", "cheque", self, "sum", sum) - if sum == nil { - return nil, fmt.Errorf("invalid amount") - } - - if self.Beneficiary != beneficiary { - return nil, fmt.Errorf("beneficiary mismatch: %v != %v", self.Beneficiary.Hex(), beneficiary.Hex()) - } - if self.Contract != contract { - return nil, fmt.Errorf("contract mismatch: %v != %v", self.Contract.Hex(), contract.Hex()) - } - - amount := new(big.Int).Set(self.Amount) - if sum != nil { - amount.Sub(amount, sum) - if amount.Sign() <= 0 { - return nil, fmt.Errorf("incorrect amount: %v <= 0", amount) - } - } - - pubKey, err := crypto.SigToPub(sigHash(self.Contract, beneficiary, self.Amount), self.Sig) - if err != nil { - return nil, fmt.Errorf("invalid signature: %v", err) - } - if !bytes.Equal(crypto.FromECDSAPub(pubKey), crypto.FromECDSAPub(signerKey)) { - return nil, fmt.Errorf("signer mismatch: %x != %x", crypto.FromECDSAPub(pubKey), crypto.FromECDSAPub(signerKey)) - } - return amount, nil -} - -// v/r/s representation of signature -func sig2vrs(sig []byte) (v byte, r, s [32]byte) { - v = sig[64] + 27 - copy(r[:], sig[:32]) - copy(s[:], sig[32:64]) - return -} - -// Cash cashes the cheque by sending an Ethereum transaction. -func (self *Cheque) Cash(session *contract.ChequebookSession) (string, error) { - v, r, s := sig2vrs(self.Sig) - tx, err := session.Cash(self.Beneficiary, self.Amount, v, r, s) - if err != nil { - return "", err - } - return tx.Hash().Hex(), nil -} - -// ValidateCode checks that the on-chain code at address matches the expected chequebook -// contract code. This is used to detect suicided chequebooks. -func ValidateCode(ctx context.Context, b Backend, address common.Address) (ok bool, err error) { - code, err := b.CodeAt(ctx, address, nil) - if err != nil { - return false, err - } - return bytes.Equal(code, common.FromHex(contract.ContractDeployedCode)), nil -} diff --git a/contracts/chequebook/cheque_test.go b/contracts/chequebook/cheque_test.go deleted file mode 100644 index 4bd2e176b14f..000000000000 --- a/contracts/chequebook/cheque_test.go +++ /dev/null @@ -1,487 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package chequebook - -import ( - "crypto/ecdsa" - "math/big" - "os" - "path/filepath" - "testing" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/chequebook/contract" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" -) - -var ( - key0, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - key1, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") - key2, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") - addr0 = crypto.PubkeyToAddress(key0.PublicKey) - addr1 = crypto.PubkeyToAddress(key1.PublicKey) - addr2 = crypto.PubkeyToAddress(key2.PublicKey) -) - -func newTestBackend() *backends.SimulatedBackend { - return backends.NewSimulatedBackend(core.GenesisAlloc{ - addr0: {Balance: big.NewInt(1000000000)}, - addr1: {Balance: big.NewInt(1000000000)}, - addr2: {Balance: big.NewInt(1000000000)}, - }, 10000000) -} - -func deploy(prvKey *ecdsa.PrivateKey, amount *big.Int, backend *backends.SimulatedBackend) (common.Address, error) { - deployTransactor := bind.NewKeyedTransactor(prvKey) - deployTransactor.Value = amount - addr, _, _, err := contract.DeployChequebook(deployTransactor, backend) - if err != nil { - return common.Address{}, err - } - backend.Commit() - return addr, nil -} - -func TestIssueAndReceive(t *testing.T) { - path := filepath.Join(os.TempDir(), "chequebook-test.json") - backend := newTestBackend() - addr0, err := deploy(key0, big.NewInt(0), backend) - if err != nil { - t.Fatalf("deploy contract: expected no error, got %v", err) - } - chbook, err := NewChequebook(path, addr0, key0, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - chbook.sent[addr1] = new(big.Int).SetUint64(42) - amount := common.Big1 - - if _, err = chbook.Issue(addr1, amount); err == nil { - t.Fatalf("expected insufficient funds error, got none") - } - - chbook.balance = new(big.Int).Set(common.Big1) - if chbook.Balance().Cmp(common.Big1) != 0 { - t.Fatalf("expected: %v, got %v", "0", chbook.Balance()) - } - - ch, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - if chbook.Balance().Sign() != 0 { - t.Errorf("expected: %v, got %v", "0", chbook.Balance()) - } - - chbox, err := NewInbox(key1, addr0, addr1, &key0.PublicKey, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - received, err := chbox.Receive(ch) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - if received.Cmp(big.NewInt(43)) != 0 { - t.Errorf("expected: %v, got %v", "43", received) - } - -} - -func TestCheckbookFile(t *testing.T) { - path := filepath.Join(os.TempDir(), "chequebook-test.json") - backend := newTestBackend() - chbook, err := NewChequebook(path, addr0, key0, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - chbook.sent[addr1] = new(big.Int).SetUint64(42) - chbook.balance = new(big.Int).Set(common.Big1) - - chbook.Save() - - chbook, err = LoadChequebook(path, key0, backend, false) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - if chbook.Balance().Cmp(common.Big1) != 0 { - t.Errorf("expected: %v, got %v", "0", chbook.Balance()) - } - - var ch *Cheque - if ch, err = chbook.Issue(addr1, common.Big1); err != nil { - t.Fatalf("expected no error, got %v", err) - } - if ch.Amount.Cmp(new(big.Int).SetUint64(43)) != 0 { - t.Errorf("expected: %v, got %v", "0", ch.Amount) - } - - err = chbook.Save() - if err != nil { - t.Fatalf("expected no error, got %v", err) - } -} - -func TestVerifyErrors(t *testing.T) { - path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json") - backend := newTestBackend() - contr0, err := deploy(key0, common.Big2, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - chbook0, err := NewChequebook(path0, contr0, key0, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - - path1 := filepath.Join(os.TempDir(), "chequebook-test-1.json") - contr1, _ := deploy(key1, common.Big2, backend) - chbook1, err := NewChequebook(path1, contr1, key1, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - - chbook0.sent[addr1] = new(big.Int).SetUint64(42) - chbook0.balance = new(big.Int).Set(common.Big2) - chbook1.balance = new(big.Int).Set(common.Big1) - amount := common.Big1 - ch0, err := chbook0.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - received, err := chbox.Receive(ch0) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - if received.Cmp(big.NewInt(43)) != 0 { - t.Errorf("expected: %v, got %v", "43", received) - } - - ch1, err := chbook0.Issue(addr2, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - received, err = chbox.Receive(ch1) - t.Logf("correct error: %v", err) - if err == nil { - t.Fatalf("expected receiver error, got none and value %v", received) - } - - ch2, err := chbook1.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - received, err = chbox.Receive(ch2) - t.Logf("correct error: %v", err) - if err == nil { - t.Fatalf("expected sender error, got none and value %v", received) - } - - _, err = chbook1.Issue(addr1, new(big.Int).SetInt64(-1)) - t.Logf("correct error: %v", err) - if err == nil { - t.Fatalf("expected incorrect amount error, got none") - } - - received, err = chbox.Receive(ch0) - t.Logf("correct error: %v", err) - if err == nil { - t.Fatalf("expected incorrect amount error, got none and value %v", received) - } - -} - -func TestDeposit(t *testing.T) { - path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json") - backend := newTestBackend() - contr0, _ := deploy(key0, new(big.Int), backend) - - chbook, err := NewChequebook(path0, contr0, key0, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - - balance := new(big.Int).SetUint64(42) - chbook.Deposit(balance) - backend.Commit() - if chbook.Balance().Cmp(balance) != 0 { - t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) - } - - amount := common.Big1 - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - exp := new(big.Int).SetUint64(41) - if chbook.Balance().Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) - } - - // autodeposit on each issue - chbook.AutoDeposit(0, balance, balance) - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - if chbook.Balance().Cmp(balance) != 0 { - t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) - } - - // autodeposit off - chbook.AutoDeposit(0, common.Big0, balance) - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - exp = new(big.Int).SetUint64(40) - if chbook.Balance().Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) - } - - // autodeposit every 200ms if new cheque issued - interval := 200 * time.Millisecond - chbook.AutoDeposit(interval, common.Big1, balance) - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - exp = new(big.Int).SetUint64(38) - if chbook.Balance().Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) - } - - time.Sleep(3 * interval) - backend.Commit() - if chbook.Balance().Cmp(balance) != 0 { - t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) - } - - exp = new(big.Int).SetUint64(40) - chbook.AutoDeposit(4*interval, exp, balance) - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - time.Sleep(3 * interval) - backend.Commit() - if chbook.Balance().Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) - } - - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - time.Sleep(1 * interval) - backend.Commit() - - if chbook.Balance().Cmp(balance) != 0 { - t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) - } - - chbook.AutoDeposit(1*interval, common.Big0, balance) - chbook.Stop() - - _, err = chbook.Issue(addr1, common.Big1) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - _, err = chbook.Issue(addr1, common.Big2) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - time.Sleep(1 * interval) - backend.Commit() - - exp = new(big.Int).SetUint64(39) - if chbook.Balance().Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) - } - -} - -func TestCash(t *testing.T) { - path := filepath.Join(os.TempDir(), "chequebook-test.json") - backend := newTestBackend() - contr0, _ := deploy(key0, common.Big2, backend) - - chbook, err := NewChequebook(path, contr0, key0, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - chbook.sent[addr1] = new(big.Int).SetUint64(42) - amount := common.Big1 - chbook.balance = new(big.Int).Set(common.Big1) - ch, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - // cashing latest cheque - if _, err = chbox.Receive(ch); err != nil { - t.Fatalf("expected no error, got %v", err) - } - if _, err = ch.Cash(chbook.session); err != nil { - t.Fatal("Cash failed:", err) - } - backend.Commit() - - chbook.balance = new(big.Int).Set(common.Big3) - ch0, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - ch1, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - interval := 10 * time.Millisecond - // setting autocash with interval of 10ms - chbox.AutoCash(interval, nil) - _, err = chbox.Receive(ch0) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - _, err = chbox.Receive(ch1) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - // after 3x interval time and 2 cheques received, exactly one cashing tx is sent - time.Sleep(4 * interval) - backend.Commit() - - // after stopping autocash no more tx are sent - ch2, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - chbox.Stop() - _, err = chbox.Receive(ch2) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - time.Sleep(2 * interval) - backend.Commit() - - // autocash below 1 - chbook.balance = big.NewInt(2) - chbox.AutoCash(0, common.Big1) - - ch3, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - ch4, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - _, err = chbox.Receive(ch3) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbox.Receive(ch4) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - // autochash on receipt when maxUncashed is 0 - chbook.balance = new(big.Int).Set(common.Big2) - chbox.AutoCash(0, common.Big0) - - ch5, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - ch6, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - _, err = chbox.Receive(ch5) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - _, err = chbox.Receive(ch6) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - -} diff --git a/contracts/chequebook/contract/chequebook.go b/contracts/chequebook/contract/chequebook.go deleted file mode 100644 index e275ac9b8d64..000000000000 --- a/contracts/chequebook/contract/chequebook.go +++ /dev/null @@ -1,367 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package contract - -import ( - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// ChequebookABI is the input ABI used to generate the binding from. -const ChequebookABI = "[{\"constant\":false,\"inputs\":[],\"name\":\"kill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"sent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"beneficiary\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"sig_v\",\"type\":\"uint8\"},{\"name\":\"sig_r\",\"type\":\"bytes32\"},{\"name\":\"sig_s\",\"type\":\"bytes32\"}],\"name\":\"cash\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"deadbeat\",\"type\":\"address\"}],\"name\":\"Overdraft\",\"type\":\"event\"}]" - -// ChequebookBin is the compiled bytecode used for deploying new contracts. -const ChequebookBin = `0x606060405260008054600160a060020a033316600160a060020a03199091161790556102ec806100306000396000f3006060604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b581146100585780637bf786f81461006b578063fbf788d61461009c575b005b341561006357600080fd5b6100566100ca565b341561007657600080fd5b61008a600160a060020a03600435166100f1565b60405190815260200160405180910390f35b34156100a757600080fd5b610056600160a060020a036004351660243560ff60443516606435608435610103565b60005433600160a060020a03908116911614156100ef57600054600160a060020a0316ff5b565b60016020526000908152604090205481565b600160a060020a0385166000908152600160205260408120548190861161012957600080fd5b3087876040516c01000000000000000000000000600160a060020a03948516810282529290931690910260148301526028820152604801604051809103902091506001828686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f115156101cf57600080fd5b505060206040510351600054600160a060020a039081169116146101f257600080fd5b50600160a060020a03808716600090815260016020526040902054860390301631811161026257600160a060020a0387166000818152600160205260409081902088905582156108fc0290839051600060405180830381858888f19350505050151561025d57600080fd5b6102b7565b6000547f2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f97890600160a060020a0316604051600160a060020a03909116815260200160405180910390a186600160a060020a0316ff5b505050505050505600a165627a7a72305820533e856fc37e3d64d1706bcc7dfb6b1d490c8d566ea498d9d01ec08965a896ca0029` - -// DeployChequebook deploys a new Ethereum contract, binding an instance of Chequebook to it. -func DeployChequebook(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Chequebook, error) { - parsed, err := abi.JSON(strings.NewReader(ChequebookABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ChequebookBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &Chequebook{ChequebookCaller: ChequebookCaller{contract: contract}, ChequebookTransactor: ChequebookTransactor{contract: contract}, ChequebookFilterer: ChequebookFilterer{contract: contract}}, nil -} - -// Chequebook is an auto generated Go binding around an Ethereum contract. -type Chequebook struct { - ChequebookCaller // Read-only binding to the contract - ChequebookTransactor // Write-only binding to the contract - ChequebookFilterer // Log filterer for contract events -} - -// ChequebookCaller is an auto generated read-only Go binding around an Ethereum contract. -type ChequebookCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ChequebookTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ChequebookTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ChequebookFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ChequebookFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ChequebookSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type ChequebookSession struct { - Contract *Chequebook // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ChequebookCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type ChequebookCallerSession struct { - Contract *ChequebookCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// ChequebookTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type ChequebookTransactorSession struct { - Contract *ChequebookTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ChequebookRaw is an auto generated low-level Go binding around an Ethereum contract. -type ChequebookRaw struct { - Contract *Chequebook // Generic contract binding to access the raw methods on -} - -// ChequebookCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ChequebookCallerRaw struct { - Contract *ChequebookCaller // Generic read-only contract binding to access the raw methods on -} - -// ChequebookTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ChequebookTransactorRaw struct { - Contract *ChequebookTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewChequebook creates a new instance of Chequebook, bound to a specific deployed contract. -func NewChequebook(address common.Address, backend bind.ContractBackend) (*Chequebook, error) { - contract, err := bindChequebook(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &Chequebook{ChequebookCaller: ChequebookCaller{contract: contract}, ChequebookTransactor: ChequebookTransactor{contract: contract}, ChequebookFilterer: ChequebookFilterer{contract: contract}}, nil -} - -// NewChequebookCaller creates a new read-only instance of Chequebook, bound to a specific deployed contract. -func NewChequebookCaller(address common.Address, caller bind.ContractCaller) (*ChequebookCaller, error) { - contract, err := bindChequebook(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &ChequebookCaller{contract: contract}, nil -} - -// NewChequebookTransactor creates a new write-only instance of Chequebook, bound to a specific deployed contract. -func NewChequebookTransactor(address common.Address, transactor bind.ContractTransactor) (*ChequebookTransactor, error) { - contract, err := bindChequebook(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &ChequebookTransactor{contract: contract}, nil -} - -// NewChequebookFilterer creates a new log filterer instance of Chequebook, bound to a specific deployed contract. -func NewChequebookFilterer(address common.Address, filterer bind.ContractFilterer) (*ChequebookFilterer, error) { - contract, err := bindChequebook(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &ChequebookFilterer{contract: contract}, nil -} - -// bindChequebook binds a generic wrapper to an already deployed contract. -func bindChequebook(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(ChequebookABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_Chequebook *ChequebookRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _Chequebook.Contract.ChequebookCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_Chequebook *ChequebookRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Chequebook.Contract.ChequebookTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Chequebook *ChequebookRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Chequebook.Contract.ChequebookTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_Chequebook *ChequebookCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _Chequebook.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_Chequebook *ChequebookTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Chequebook.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Chequebook *ChequebookTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Chequebook.Contract.contract.Transact(opts, method, params...) -} - -// Sent is a free data retrieval call binding the contract method 0x7bf786f8. -// -// Solidity: function sent( address) constant returns(uint256) -func (_Chequebook *ChequebookCaller) Sent(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _Chequebook.contract.Call(opts, out, "sent", arg0) - return *ret0, err -} - -// Sent is a free data retrieval call binding the contract method 0x7bf786f8. -// -// Solidity: function sent( address) constant returns(uint256) -func (_Chequebook *ChequebookSession) Sent(arg0 common.Address) (*big.Int, error) { - return _Chequebook.Contract.Sent(&_Chequebook.CallOpts, arg0) -} - -// Sent is a free data retrieval call binding the contract method 0x7bf786f8. -// -// Solidity: function sent( address) constant returns(uint256) -func (_Chequebook *ChequebookCallerSession) Sent(arg0 common.Address) (*big.Int, error) { - return _Chequebook.Contract.Sent(&_Chequebook.CallOpts, arg0) -} - -// Cash is a paid mutator transaction binding the contract method 0xfbf788d6. -// -// Solidity: function cash(beneficiary address, amount uint256, sig_v uint8, sig_r bytes32, sig_s bytes32) returns() -func (_Chequebook *ChequebookTransactor) Cash(opts *bind.TransactOpts, beneficiary common.Address, amount *big.Int, sig_v uint8, sig_r [32]byte, sig_s [32]byte) (*types.Transaction, error) { - return _Chequebook.contract.Transact(opts, "cash", beneficiary, amount, sig_v, sig_r, sig_s) -} - -// Cash is a paid mutator transaction binding the contract method 0xfbf788d6. -// -// Solidity: function cash(beneficiary address, amount uint256, sig_v uint8, sig_r bytes32, sig_s bytes32) returns() -func (_Chequebook *ChequebookSession) Cash(beneficiary common.Address, amount *big.Int, sig_v uint8, sig_r [32]byte, sig_s [32]byte) (*types.Transaction, error) { - return _Chequebook.Contract.Cash(&_Chequebook.TransactOpts, beneficiary, amount, sig_v, sig_r, sig_s) -} - -// Cash is a paid mutator transaction binding the contract method 0xfbf788d6. -// -// Solidity: function cash(beneficiary address, amount uint256, sig_v uint8, sig_r bytes32, sig_s bytes32) returns() -func (_Chequebook *ChequebookTransactorSession) Cash(beneficiary common.Address, amount *big.Int, sig_v uint8, sig_r [32]byte, sig_s [32]byte) (*types.Transaction, error) { - return _Chequebook.Contract.Cash(&_Chequebook.TransactOpts, beneficiary, amount, sig_v, sig_r, sig_s) -} - -// Kill is a paid mutator transaction binding the contract method 0x41c0e1b5. -// -// Solidity: function kill() returns() -func (_Chequebook *ChequebookTransactor) Kill(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Chequebook.contract.Transact(opts, "kill") -} - -// Kill is a paid mutator transaction binding the contract method 0x41c0e1b5. -// -// Solidity: function kill() returns() -func (_Chequebook *ChequebookSession) Kill() (*types.Transaction, error) { - return _Chequebook.Contract.Kill(&_Chequebook.TransactOpts) -} - -// Kill is a paid mutator transaction binding the contract method 0x41c0e1b5. -// -// Solidity: function kill() returns() -func (_Chequebook *ChequebookTransactorSession) Kill() (*types.Transaction, error) { - return _Chequebook.Contract.Kill(&_Chequebook.TransactOpts) -} - -// ChequebookOverdraftIterator is returned from FilterOverdraft and is used to iterate over the raw logs and unpacked data for Overdraft events raised by the Chequebook contract. -type ChequebookOverdraftIterator struct { - Event *ChequebookOverdraft // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ChequebookOverdraftIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ChequebookOverdraft) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ChequebookOverdraft) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ChequebookOverdraftIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ChequebookOverdraftIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ChequebookOverdraft represents a Overdraft event raised by the Chequebook contract. -type ChequebookOverdraft struct { - Deadbeat common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOverdraft is a free log retrieval operation binding the contract event 0x2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f978. -// -// Solidity: event Overdraft(deadbeat address) -func (_Chequebook *ChequebookFilterer) FilterOverdraft(opts *bind.FilterOpts) (*ChequebookOverdraftIterator, error) { - - logs, sub, err := _Chequebook.contract.FilterLogs(opts, "Overdraft") - if err != nil { - return nil, err - } - return &ChequebookOverdraftIterator{contract: _Chequebook.contract, event: "Overdraft", logs: logs, sub: sub}, nil -} - -// WatchOverdraft is a free log subscription operation binding the contract event 0x2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f978. -// -// Solidity: event Overdraft(deadbeat address) -func (_Chequebook *ChequebookFilterer) WatchOverdraft(opts *bind.WatchOpts, sink chan<- *ChequebookOverdraft) (event.Subscription, error) { - - logs, sub, err := _Chequebook.contract.WatchLogs(opts, "Overdraft") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ChequebookOverdraft) - if err := _Chequebook.contract.UnpackLog(event, "Overdraft", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} diff --git a/contracts/chequebook/contract/chequebook.sol b/contracts/chequebook/contract/chequebook.sol deleted file mode 100644 index c386cceed856..000000000000 --- a/contracts/chequebook/contract/chequebook.sol +++ /dev/null @@ -1,47 +0,0 @@ -pragma solidity ^0.4.18; - -import "./mortal.sol"; - -/// @title Chequebook for Ethereum micropayments -/// @author Daniel A. Nagy -contract chequebook is mortal { - // Cumulative paid amount in wei to each beneficiary - mapping (address => uint256) public sent; - - /// @notice Overdraft event - event Overdraft(address deadbeat); - - // Allow sending ether to the chequebook. - function() public payable { } - - /// @notice Cash cheque - /// - /// @param beneficiary beneficiary address - /// @param amount cumulative amount in wei - /// @param sig_v signature parameter v - /// @param sig_r signature parameter r - /// @param sig_s signature parameter s - /// The digital signature is calculated on the concatenated triplet of contract address, beneficiary address and cumulative amount - function cash(address beneficiary, uint256 amount, uint8 sig_v, bytes32 sig_r, bytes32 sig_s) public { - // Check if the cheque is old. - // Only cheques that are more recent than the last cashed one are considered. - require(amount > sent[beneficiary]); - // Check the digital signature of the cheque. - bytes32 hash = keccak256(address(this), beneficiary, amount); - require(owner == ecrecover(hash, sig_v, sig_r, sig_s)); - // Attempt sending the difference between the cumulative amount on the cheque - // and the cumulative amount on the last cashed cheque to beneficiary. - uint256 diff = amount - sent[beneficiary]; - if (diff <= this.balance) { - // update the cumulative amount before sending - sent[beneficiary] = amount; - beneficiary.transfer(diff); - } else { - // Upon failure, punish owner for writing a bounced cheque. - // owner.sendToDebtorsPrison(); - Overdraft(owner); - // Compensate beneficiary. - selfdestruct(beneficiary); - } - } -} diff --git a/contracts/chequebook/contract/code.go b/contracts/chequebook/contract/code.go deleted file mode 100644 index d837a9d60114..000000000000 --- a/contracts/chequebook/contract/code.go +++ /dev/null @@ -1,5 +0,0 @@ -package contract - -// ContractDeployedCode is used to detect suicides. This constant needs to be -// updated when the contract code is changed. -const ContractDeployedCode = "0x6060604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b581146100585780637bf786f81461006b578063fbf788d61461009c575b005b341561006357600080fd5b6100566100ca565b341561007657600080fd5b61008a600160a060020a03600435166100f1565b60405190815260200160405180910390f35b34156100a757600080fd5b610056600160a060020a036004351660243560ff60443516606435608435610103565b60005433600160a060020a03908116911614156100ef57600054600160a060020a0316ff5b565b60016020526000908152604090205481565b600160a060020a0385166000908152600160205260408120548190861161012957600080fd5b3087876040516c01000000000000000000000000600160a060020a03948516810282529290931690910260148301526028820152604801604051809103902091506001828686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f115156101cf57600080fd5b505060206040510351600054600160a060020a039081169116146101f257600080fd5b50600160a060020a03808716600090815260016020526040902054860390301631811161026257600160a060020a0387166000818152600160205260409081902088905582156108fc0290839051600060405180830381858888f19350505050151561025d57600080fd5b6102b7565b6000547f2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f97890600160a060020a0316604051600160a060020a03909116815260200160405180910390a186600160a060020a0316ff5b505050505050505600a165627a7a72305820533e856fc37e3d64d1706bcc7dfb6b1d490c8d566ea498d9d01ec08965a896ca0029" diff --git a/contracts/chequebook/contract/mortal.sol b/contracts/chequebook/contract/mortal.sol deleted file mode 100644 index c43f1e4f7951..000000000000 --- a/contracts/chequebook/contract/mortal.sol +++ /dev/null @@ -1,10 +0,0 @@ -pragma solidity ^0.4.0; - -import "./owned.sol"; - -contract mortal is owned { - function kill() public { - if (msg.sender == owner) - selfdestruct(owner); - } -} diff --git a/contracts/chequebook/contract/owned.sol b/contracts/chequebook/contract/owned.sol deleted file mode 100644 index ee9860d343af..000000000000 --- a/contracts/chequebook/contract/owned.sol +++ /dev/null @@ -1,15 +0,0 @@ -pragma solidity ^0.4.0; - -contract owned { - address owner; - - modifier onlyowner() { - if (msg.sender == owner) { - _; - } - } - - function owned() public { - owner = msg.sender; - } -} diff --git a/contracts/chequebook/gencode.go b/contracts/chequebook/gencode.go deleted file mode 100644 index ddfe8d151274..000000000000 --- a/contracts/chequebook/gencode.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build none - -// This program generates contract/code.go, which contains the chequebook code -// after deployment. -package main - -import ( - "fmt" - "io/ioutil" - "math/big" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/contracts/chequebook/contract" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" -) - -var ( - testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - testAlloc = core.GenesisAlloc{ - crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(500000000000)}, - } -) - -func main() { - backend := backends.NewSimulatedBackend(testAlloc, uint64(100000000)) - auth := bind.NewKeyedTransactor(testKey) - - // Deploy the contract, get the code. - addr, _, _, err := contract.DeployChequebook(auth, backend) - if err != nil { - panic(err) - } - backend.Commit() - code, err := backend.CodeAt(nil, addr, nil) - if err != nil { - panic(err) - } - if len(code) == 0 { - panic("empty code") - } - - // Write the output file. - content := fmt.Sprintf(`package contract - -// ContractDeployedCode is used to detect suicides. This constant needs to be -// updated when the contract code is changed. -const ContractDeployedCode = "%#x" -`, code) - if err := ioutil.WriteFile("contract/code.go", []byte(content), 0644); err != nil { - panic(err) - } -} diff --git a/contracts/ens/README.md b/contracts/ens/README.md deleted file mode 100644 index c09b47e39d81..000000000000 --- a/contracts/ens/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Swarm ENS interface - -## Usage - -Full documentation for the Ethereum Name Service [can be found as EIP 137](https://github.com/ethereum/EIPs/issues/137). -This package offers a simple binding that streamlines the registration of arbitrary UTF8 domain names to swarm content hashes. - -## Development - -The SOL file in contract subdirectory implements the ENS root registry, a simple -first-in, first-served registrar for the root namespace, and a simple resolver contract; -they're used in tests, and can be used to deploy these contracts for your own purposes. - -The solidity source code can be found at [github.com/arachnid/ens/](https://github.com/arachnid/ens/). - -The go bindings for ENS contracts are generated using `abigen` via the go generator: - -```shell -go generate ./contracts/ens -``` diff --git a/contracts/ens/contract/AbstractENS.sol b/contracts/ens/contract/AbstractENS.sol deleted file mode 100644 index b80a1b0e6b50..000000000000 --- a/contracts/ens/contract/AbstractENS.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma solidity ^0.4.0; - -contract AbstractENS { - function owner(bytes32 node) constant returns(address); - function resolver(bytes32 node) constant returns(address); - function ttl(bytes32 node) constant returns(uint64); - function setOwner(bytes32 node, address owner); - function setSubnodeOwner(bytes32 node, bytes32 label, address owner); - function setResolver(bytes32 node, address resolver); - function setTTL(bytes32 node, uint64 ttl); - - // Logged when the owner of a node assigns a new owner to a subnode. - event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); - - // Logged when the owner of a node transfers ownership to a new account. - event Transfer(bytes32 indexed node, address owner); - - // Logged when the resolver for a node changes. - event NewResolver(bytes32 indexed node, address resolver); - - // Logged when the TTL of a node changes - event NewTTL(bytes32 indexed node, uint64 ttl); -} diff --git a/contracts/ens/contract/ENS.sol b/contracts/ens/contract/ENS.sol deleted file mode 100644 index 47050c19dabb..000000000000 --- a/contracts/ens/contract/ENS.sol +++ /dev/null @@ -1,94 +0,0 @@ -pragma solidity ^0.4.0; - -import './AbstractENS.sol'; - -/** - * The ENS registry contract. - */ -contract ENS is AbstractENS { - struct Record { - address owner; - address resolver; - uint64 ttl; - } - - mapping(bytes32=>Record) records; - - // Permits modifications only by the owner of the specified node. - modifier only_owner(bytes32 node) { - if (records[node].owner != msg.sender) throw; - _; - } - - /** - * Constructs a new ENS registrar. - */ - function ENS() { - records[0].owner = msg.sender; - } - - /** - * Returns the address that owns the specified node. - */ - function owner(bytes32 node) constant returns (address) { - return records[node].owner; - } - - /** - * Returns the address of the resolver for the specified node. - */ - function resolver(bytes32 node) constant returns (address) { - return records[node].resolver; - } - - /** - * Returns the TTL of a node, and any records associated with it. - */ - function ttl(bytes32 node) constant returns (uint64) { - return records[node].ttl; - } - - /** - * Transfers ownership of a node to a new address. May only be called by the current - * owner of the node. - * @param node The node to transfer ownership of. - * @param owner The address of the new owner. - */ - function setOwner(bytes32 node, address owner) only_owner(node) { - Transfer(node, owner); - records[node].owner = owner; - } - - /** - * Transfers ownership of a subnode sha3(node, label) to a new address. May only be - * called by the owner of the parent node. - * @param node The parent node. - * @param label The hash of the label specifying the subnode. - * @param owner The address of the new owner. - */ - function setSubnodeOwner(bytes32 node, bytes32 label, address owner) only_owner(node) { - var subnode = sha3(node, label); - NewOwner(node, label, owner); - records[subnode].owner = owner; - } - - /** - * Sets the resolver address for the specified node. - * @param node The node to update. - * @param resolver The address of the resolver. - */ - function setResolver(bytes32 node, address resolver) only_owner(node) { - NewResolver(node, resolver); - records[node].resolver = resolver; - } - - /** - * Sets the TTL for the specified node. - * @param node The node to update. - * @param ttl The TTL in seconds. - */ - function setTTL(bytes32 node, uint64 ttl) only_owner(node) { - NewTTL(node, ttl); - records[node].ttl = ttl; - } -} diff --git a/contracts/ens/contract/FIFSRegistrar.sol b/contracts/ens/contract/FIFSRegistrar.sol deleted file mode 100644 index 51629c2b65e0..000000000000 --- a/contracts/ens/contract/FIFSRegistrar.sol +++ /dev/null @@ -1,39 +0,0 @@ -pragma solidity ^0.4.0; - -import './AbstractENS.sol'; - -/** - * A registrar that allocates subdomains to the first person to claim them. - */ -contract FIFSRegistrar { - AbstractENS ens; - bytes32 rootNode; - - modifier only_owner(bytes32 subnode) { - var node = sha3(rootNode, subnode); - var currentOwner = ens.owner(node); - - if (currentOwner != 0 && currentOwner != msg.sender) throw; - - _; - } - - /** - * Constructor. - * @param ensAddr The address of the ENS registry. - * @param node The node that this registrar administers. - */ - function FIFSRegistrar(AbstractENS ensAddr, bytes32 node) { - ens = ensAddr; - rootNode = node; - } - - /** - * Register a name, or change the owner of an existing registration. - * @param subnode The hash of the label to register. - * @param owner The address of the new owner. - */ - function register(bytes32 subnode, address owner) only_owner(subnode) { - ens.setSubnodeOwner(rootNode, subnode, owner); - } -} diff --git a/contracts/ens/contract/PublicResolver.sol b/contracts/ens/contract/PublicResolver.sol deleted file mode 100644 index 9dcc95689ecc..000000000000 --- a/contracts/ens/contract/PublicResolver.sol +++ /dev/null @@ -1,212 +0,0 @@ -pragma solidity ^0.4.0; - -import './AbstractENS.sol'; - -/** - * A simple resolver anyone can use; only allows the owner of a node to set its - * address. - */ -contract PublicResolver { - bytes4 constant INTERFACE_META_ID = 0x01ffc9a7; - bytes4 constant ADDR_INTERFACE_ID = 0x3b3b57de; - bytes4 constant CONTENT_INTERFACE_ID = 0xd8389dc5; - bytes4 constant NAME_INTERFACE_ID = 0x691f3431; - bytes4 constant ABI_INTERFACE_ID = 0x2203ab56; - bytes4 constant PUBKEY_INTERFACE_ID = 0xc8690233; - bytes4 constant TEXT_INTERFACE_ID = 0x59d1d43c; - - event AddrChanged(bytes32 indexed node, address a); - event ContentChanged(bytes32 indexed node, bytes32 hash); - event NameChanged(bytes32 indexed node, string name); - event ABIChanged(bytes32 indexed node, uint256 indexed contentType); - event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y); - event TextChanged(bytes32 indexed node, string indexed indexedKey, string key); - - struct PublicKey { - bytes32 x; - bytes32 y; - } - - struct Record { - address addr; - bytes32 content; - string name; - PublicKey pubkey; - mapping(string=>string) text; - mapping(uint256=>bytes) abis; - } - - AbstractENS ens; - mapping(bytes32=>Record) records; - - modifier only_owner(bytes32 node) { - if (ens.owner(node) != msg.sender) throw; - _; - } - - /** - * Constructor. - * @param ensAddr The ENS registrar contract. - */ - function PublicResolver(AbstractENS ensAddr) { - ens = ensAddr; - } - - /** - * Returns true if the resolver implements the interface specified by the provided hash. - * @param interfaceID The ID of the interface to check for. - * @return True if the contract implements the requested interface. - */ - function supportsInterface(bytes4 interfaceID) constant returns (bool) { - return interfaceID == ADDR_INTERFACE_ID || - interfaceID == CONTENT_INTERFACE_ID || - interfaceID == NAME_INTERFACE_ID || - interfaceID == ABI_INTERFACE_ID || - interfaceID == PUBKEY_INTERFACE_ID || - interfaceID == TEXT_INTERFACE_ID || - interfaceID == INTERFACE_META_ID; - } - - /** - * Returns the address associated with an ENS node. - * @param node The ENS node to query. - * @return The associated address. - */ - function addr(bytes32 node) constant returns (address ret) { - ret = records[node].addr; - } - - /** - * Sets the address associated with an ENS node. - * May only be called by the owner of that node in the ENS registry. - * @param node The node to update. - * @param addr The address to set. - */ - function setAddr(bytes32 node, address addr) only_owner(node) { - records[node].addr = addr; - AddrChanged(node, addr); - } - - /** - * Returns the content hash associated with an ENS node. - * Note that this resource type is not standardized, and will likely change - * in future to a resource type based on multihash. - * @param node The ENS node to query. - * @return The associated content hash. - */ - function content(bytes32 node) constant returns (bytes32 ret) { - ret = records[node].content; - } - - /** - * Sets the content hash associated with an ENS node. - * May only be called by the owner of that node in the ENS registry. - * Note that this resource type is not standardized, and will likely change - * in future to a resource type based on multihash. - * @param node The node to update. - * @param hash The content hash to set - */ - function setContent(bytes32 node, bytes32 hash) only_owner(node) { - records[node].content = hash; - ContentChanged(node, hash); - } - - /** - * Returns the name associated with an ENS node, for reverse records. - * Defined in EIP181. - * @param node The ENS node to query. - * @return The associated name. - */ - function name(bytes32 node) constant returns (string ret) { - ret = records[node].name; - } - - /** - * Sets the name associated with an ENS node, for reverse records. - * May only be called by the owner of that node in the ENS registry. - * @param node The node to update. - * @param name The name to set. - */ - function setName(bytes32 node, string name) only_owner(node) { - records[node].name = name; - NameChanged(node, name); - } - - /** - * Returns the ABI associated with an ENS node. - * Defined in EIP205. - * @param node The ENS node to query - * @param contentTypes A bitwise OR of the ABI formats accepted by the caller. - * @return contentType The content type of the return value - * @return data The ABI data - */ - function ABI(bytes32 node, uint256 contentTypes) constant returns (uint256 contentType, bytes data) { - var record = records[node]; - for(contentType = 1; contentType <= contentTypes; contentType <<= 1) { - if ((contentType & contentTypes) != 0 && record.abis[contentType].length > 0) { - data = record.abis[contentType]; - return; - } - } - contentType = 0; - } - - /** - * Sets the ABI associated with an ENS node. - * Nodes may have one ABI of each content type. To remove an ABI, set it to - * the empty string. - * @param node The node to update. - * @param contentType The content type of the ABI - * @param data The ABI data. - */ - function setABI(bytes32 node, uint256 contentType, bytes data) only_owner(node) { - // Content types must be powers of 2 - if (((contentType - 1) & contentType) != 0) throw; - - records[node].abis[contentType] = data; - ABIChanged(node, contentType); - } - - /** - * Returns the SECP256k1 public key associated with an ENS node. - * Defined in EIP 619. - * @param node The ENS node to query - * @return x, y the X and Y coordinates of the curve point for the public key. - */ - function pubkey(bytes32 node) constant returns (bytes32 x, bytes32 y) { - return (records[node].pubkey.x, records[node].pubkey.y); - } - - /** - * Sets the SECP256k1 public key associated with an ENS node. - * @param node The ENS node to query - * @param x the X coordinate of the curve point for the public key. - * @param y the Y coordinate of the curve point for the public key. - */ - function setPubkey(bytes32 node, bytes32 x, bytes32 y) only_owner(node) { - records[node].pubkey = PublicKey(x, y); - PubkeyChanged(node, x, y); - } - - /** - * Returns the text data associated with an ENS node and key. - * @param node The ENS node to query. - * @param key The text data key to query. - * @return The associated text data. - */ - function text(bytes32 node, string key) constant returns (string ret) { - ret = records[node].text[key]; - } - - /** - * Sets the text data associated with an ENS node and key. - * May only be called by the owner of that node in the ENS registry. - * @param node The node to update. - * @param key The key to set. - * @param value The text data value to set. - */ - function setText(bytes32 node, string key, string value) only_owner(node) { - records[node].text[key] = value; - TextChanged(node, key, key); - } -} diff --git a/contracts/ens/contract/ens.go b/contracts/ens/contract/ens.go deleted file mode 100644 index cbf6cb05b37f..000000000000 --- a/contracts/ens/contract/ens.go +++ /dev/null @@ -1,879 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package contract - -import ( - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// ENSABI is the input ABI used to generate the binding from. -const ENSABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"resolver\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"label\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setSubnodeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"setTTL\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"ttl\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"setResolver\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"label\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"NewResolver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"NewTTL\",\"type\":\"event\"}]" - -// ENSBin is the compiled bytecode used for deploying new contracts. -const ENSBin = `0x6060604052341561000f57600080fd5b60008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054600160a060020a033316600160a060020a0319909116179055610503806100626000396000f3006060604052600436106100825763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630178b8bf811461008757806302571be3146100b957806306ab5923146100cf57806314ab9038146100f657806316a25cbd146101195780631896f70a1461014c5780635b0fc9c31461016e575b600080fd5b341561009257600080fd5b61009d600435610190565b604051600160a060020a03909116815260200160405180910390f35b34156100c457600080fd5b61009d6004356101ae565b34156100da57600080fd5b6100f4600435602435600160a060020a03604435166101c9565b005b341561010157600080fd5b6100f460043567ffffffffffffffff6024351661028b565b341561012457600080fd5b61012f600435610357565b60405167ffffffffffffffff909116815260200160405180910390f35b341561015757600080fd5b6100f4600435600160a060020a036024351661038e565b341561017957600080fd5b6100f4600435600160a060020a0360243516610434565b600090815260208190526040902060010154600160a060020a031690565b600090815260208190526040902054600160a060020a031690565b600083815260208190526040812054849033600160a060020a039081169116146101f257600080fd5b8484604051918252602082015260409081019051908190039020915083857fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e8285604051600160a060020a03909116815260200160405180910390a3506000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555050565b600082815260208190526040902054829033600160a060020a039081169116146102b457600080fd5b827f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa688360405167ffffffffffffffff909116815260200160405180910390a250600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b600082815260208190526040902054829033600160a060020a039081169116146103b757600080fd5b827f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a083604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120600101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600082815260208190526040902054829033600160a060020a0390811691161461045d57600080fd5b827fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d26683604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555600a165627a7a72305820f4c798d4c84c9912f389f64631e85e8d16c3e6644f8c2e1579936015c7d5f6660029` - -// DeployENS deploys a new Ethereum contract, binding an instance of ENS to it. -func DeployENS(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ENS, error) { - parsed, err := abi.JSON(strings.NewReader(ENSABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ENSBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &ENS{ENSCaller: ENSCaller{contract: contract}, ENSTransactor: ENSTransactor{contract: contract}, ENSFilterer: ENSFilterer{contract: contract}}, nil -} - -// ENS is an auto generated Go binding around an Ethereum contract. -type ENS struct { - ENSCaller // Read-only binding to the contract - ENSTransactor // Write-only binding to the contract - ENSFilterer // Log filterer for contract events -} - -// ENSCaller is an auto generated read-only Go binding around an Ethereum contract. -type ENSCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ENSTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ENSTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ENSFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ENSFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ENSSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type ENSSession struct { - Contract *ENS // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ENSCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type ENSCallerSession struct { - Contract *ENSCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// ENSTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type ENSTransactorSession struct { - Contract *ENSTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ENSRaw is an auto generated low-level Go binding around an Ethereum contract. -type ENSRaw struct { - Contract *ENS // Generic contract binding to access the raw methods on -} - -// ENSCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ENSCallerRaw struct { - Contract *ENSCaller // Generic read-only contract binding to access the raw methods on -} - -// ENSTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ENSTransactorRaw struct { - Contract *ENSTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewENS creates a new instance of ENS, bound to a specific deployed contract. -func NewENS(address common.Address, backend bind.ContractBackend) (*ENS, error) { - contract, err := bindENS(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &ENS{ENSCaller: ENSCaller{contract: contract}, ENSTransactor: ENSTransactor{contract: contract}, ENSFilterer: ENSFilterer{contract: contract}}, nil -} - -// NewENSCaller creates a new read-only instance of ENS, bound to a specific deployed contract. -func NewENSCaller(address common.Address, caller bind.ContractCaller) (*ENSCaller, error) { - contract, err := bindENS(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &ENSCaller{contract: contract}, nil -} - -// NewENSTransactor creates a new write-only instance of ENS, bound to a specific deployed contract. -func NewENSTransactor(address common.Address, transactor bind.ContractTransactor) (*ENSTransactor, error) { - contract, err := bindENS(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &ENSTransactor{contract: contract}, nil -} - -// NewENSFilterer creates a new log filterer instance of ENS, bound to a specific deployed contract. -func NewENSFilterer(address common.Address, filterer bind.ContractFilterer) (*ENSFilterer, error) { - contract, err := bindENS(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &ENSFilterer{contract: contract}, nil -} - -// bindENS binds a generic wrapper to an already deployed contract. -func bindENS(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(ENSABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ENS *ENSRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _ENS.Contract.ENSCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ENS *ENSRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ENS.Contract.ENSTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ENS *ENSRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ENS.Contract.ENSTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ENS *ENSCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _ENS.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ENS *ENSTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ENS.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ENS *ENSTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ENS.Contract.contract.Transact(opts, method, params...) -} - -// Owner is a free data retrieval call binding the contract method 0x02571be3. -// -// Solidity: function owner(node bytes32) constant returns(address) -func (_ENS *ENSCaller) Owner(opts *bind.CallOpts, node [32]byte) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _ENS.contract.Call(opts, out, "owner", node) - return *ret0, err -} - -// Owner is a free data retrieval call binding the contract method 0x02571be3. -// -// Solidity: function owner(node bytes32) constant returns(address) -func (_ENS *ENSSession) Owner(node [32]byte) (common.Address, error) { - return _ENS.Contract.Owner(&_ENS.CallOpts, node) -} - -// Owner is a free data retrieval call binding the contract method 0x02571be3. -// -// Solidity: function owner(node bytes32) constant returns(address) -func (_ENS *ENSCallerSession) Owner(node [32]byte) (common.Address, error) { - return _ENS.Contract.Owner(&_ENS.CallOpts, node) -} - -// Resolver is a free data retrieval call binding the contract method 0x0178b8bf. -// -// Solidity: function resolver(node bytes32) constant returns(address) -func (_ENS *ENSCaller) Resolver(opts *bind.CallOpts, node [32]byte) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _ENS.contract.Call(opts, out, "resolver", node) - return *ret0, err -} - -// Resolver is a free data retrieval call binding the contract method 0x0178b8bf. -// -// Solidity: function resolver(node bytes32) constant returns(address) -func (_ENS *ENSSession) Resolver(node [32]byte) (common.Address, error) { - return _ENS.Contract.Resolver(&_ENS.CallOpts, node) -} - -// Resolver is a free data retrieval call binding the contract method 0x0178b8bf. -// -// Solidity: function resolver(node bytes32) constant returns(address) -func (_ENS *ENSCallerSession) Resolver(node [32]byte) (common.Address, error) { - return _ENS.Contract.Resolver(&_ENS.CallOpts, node) -} - -// Ttl is a free data retrieval call binding the contract method 0x16a25cbd. -// -// Solidity: function ttl(node bytes32) constant returns(uint64) -func (_ENS *ENSCaller) Ttl(opts *bind.CallOpts, node [32]byte) (uint64, error) { - var ( - ret0 = new(uint64) - ) - out := ret0 - err := _ENS.contract.Call(opts, out, "ttl", node) - return *ret0, err -} - -// Ttl is a free data retrieval call binding the contract method 0x16a25cbd. -// -// Solidity: function ttl(node bytes32) constant returns(uint64) -func (_ENS *ENSSession) Ttl(node [32]byte) (uint64, error) { - return _ENS.Contract.Ttl(&_ENS.CallOpts, node) -} - -// Ttl is a free data retrieval call binding the contract method 0x16a25cbd. -// -// Solidity: function ttl(node bytes32) constant returns(uint64) -func (_ENS *ENSCallerSession) Ttl(node [32]byte) (uint64, error) { - return _ENS.Contract.Ttl(&_ENS.CallOpts, node) -} - -// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3. -// -// Solidity: function setOwner(node bytes32, owner address) returns() -func (_ENS *ENSTransactor) SetOwner(opts *bind.TransactOpts, node [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.contract.Transact(opts, "setOwner", node, owner) -} - -// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3. -// -// Solidity: function setOwner(node bytes32, owner address) returns() -func (_ENS *ENSSession) SetOwner(node [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetOwner(&_ENS.TransactOpts, node, owner) -} - -// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3. -// -// Solidity: function setOwner(node bytes32, owner address) returns() -func (_ENS *ENSTransactorSession) SetOwner(node [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetOwner(&_ENS.TransactOpts, node, owner) -} - -// SetResolver is a paid mutator transaction binding the contract method 0x1896f70a. -// -// Solidity: function setResolver(node bytes32, resolver address) returns() -func (_ENS *ENSTransactor) SetResolver(opts *bind.TransactOpts, node [32]byte, resolver common.Address) (*types.Transaction, error) { - return _ENS.contract.Transact(opts, "setResolver", node, resolver) -} - -// SetResolver is a paid mutator transaction binding the contract method 0x1896f70a. -// -// Solidity: function setResolver(node bytes32, resolver address) returns() -func (_ENS *ENSSession) SetResolver(node [32]byte, resolver common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetResolver(&_ENS.TransactOpts, node, resolver) -} - -// SetResolver is a paid mutator transaction binding the contract method 0x1896f70a. -// -// Solidity: function setResolver(node bytes32, resolver address) returns() -func (_ENS *ENSTransactorSession) SetResolver(node [32]byte, resolver common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetResolver(&_ENS.TransactOpts, node, resolver) -} - -// SetSubnodeOwner is a paid mutator transaction binding the contract method 0x06ab5923. -// -// Solidity: function setSubnodeOwner(node bytes32, label bytes32, owner address) returns() -func (_ENS *ENSTransactor) SetSubnodeOwner(opts *bind.TransactOpts, node [32]byte, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.contract.Transact(opts, "setSubnodeOwner", node, label, owner) -} - -// SetSubnodeOwner is a paid mutator transaction binding the contract method 0x06ab5923. -// -// Solidity: function setSubnodeOwner(node bytes32, label bytes32, owner address) returns() -func (_ENS *ENSSession) SetSubnodeOwner(node [32]byte, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetSubnodeOwner(&_ENS.TransactOpts, node, label, owner) -} - -// SetSubnodeOwner is a paid mutator transaction binding the contract method 0x06ab5923. -// -// Solidity: function setSubnodeOwner(node bytes32, label bytes32, owner address) returns() -func (_ENS *ENSTransactorSession) SetSubnodeOwner(node [32]byte, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetSubnodeOwner(&_ENS.TransactOpts, node, label, owner) -} - -// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038. -// -// Solidity: function setTTL(node bytes32, ttl uint64) returns() -func (_ENS *ENSTransactor) SetTTL(opts *bind.TransactOpts, node [32]byte, ttl uint64) (*types.Transaction, error) { - return _ENS.contract.Transact(opts, "setTTL", node, ttl) -} - -// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038. -// -// Solidity: function setTTL(node bytes32, ttl uint64) returns() -func (_ENS *ENSSession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) { - return _ENS.Contract.SetTTL(&_ENS.TransactOpts, node, ttl) -} - -// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038. -// -// Solidity: function setTTL(node bytes32, ttl uint64) returns() -func (_ENS *ENSTransactorSession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) { - return _ENS.Contract.SetTTL(&_ENS.TransactOpts, node, ttl) -} - -// ENSNewOwnerIterator is returned from FilterNewOwner and is used to iterate over the raw logs and unpacked data for NewOwner events raised by the ENS contract. -type ENSNewOwnerIterator struct { - Event *ENSNewOwner // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ENSNewOwnerIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ENSNewOwner) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ENSNewOwner) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ENSNewOwnerIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSNewOwnerIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSNewOwner represents a NewOwner event raised by the ENS contract. -type ENSNewOwner struct { - Node [32]byte - Label [32]byte - Owner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterNewOwner is a free log retrieval operation binding the contract event 0xce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82. -// -// Solidity: event NewOwner(node indexed bytes32, label indexed bytes32, owner address) -func (_ENS *ENSFilterer) FilterNewOwner(opts *bind.FilterOpts, node [][32]byte, label [][32]byte) (*ENSNewOwnerIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var labelRule []interface{} - for _, labelItem := range label { - labelRule = append(labelRule, labelItem) - } - - logs, sub, err := _ENS.contract.FilterLogs(opts, "NewOwner", nodeRule, labelRule) - if err != nil { - return nil, err - } - return &ENSNewOwnerIterator{contract: _ENS.contract, event: "NewOwner", logs: logs, sub: sub}, nil -} - -// WatchNewOwner is a free log subscription operation binding the contract event 0xce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82. -// -// Solidity: event NewOwner(node indexed bytes32, label indexed bytes32, owner address) -func (_ENS *ENSFilterer) WatchNewOwner(opts *bind.WatchOpts, sink chan<- *ENSNewOwner, node [][32]byte, label [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var labelRule []interface{} - for _, labelItem := range label { - labelRule = append(labelRule, labelItem) - } - - logs, sub, err := _ENS.contract.WatchLogs(opts, "NewOwner", nodeRule, labelRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ENSNewOwner) - if err := _ENS.contract.UnpackLog(event, "NewOwner", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ENSNewResolverIterator is returned from FilterNewResolver and is used to iterate over the raw logs and unpacked data for NewResolver events raised by the ENS contract. -type ENSNewResolverIterator struct { - Event *ENSNewResolver // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ENSNewResolverIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ENSNewResolver) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ENSNewResolver) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ENSNewResolverIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSNewResolverIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSNewResolver represents a NewResolver event raised by the ENS contract. -type ENSNewResolver struct { - Node [32]byte - Resolver common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterNewResolver is a free log retrieval operation binding the contract event 0x335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0. -// -// Solidity: event NewResolver(node indexed bytes32, resolver address) -func (_ENS *ENSFilterer) FilterNewResolver(opts *bind.FilterOpts, node [][32]byte) (*ENSNewResolverIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.FilterLogs(opts, "NewResolver", nodeRule) - if err != nil { - return nil, err - } - return &ENSNewResolverIterator{contract: _ENS.contract, event: "NewResolver", logs: logs, sub: sub}, nil -} - -// WatchNewResolver is a free log subscription operation binding the contract event 0x335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0. -// -// Solidity: event NewResolver(node indexed bytes32, resolver address) -func (_ENS *ENSFilterer) WatchNewResolver(opts *bind.WatchOpts, sink chan<- *ENSNewResolver, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.WatchLogs(opts, "NewResolver", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ENSNewResolver) - if err := _ENS.contract.UnpackLog(event, "NewResolver", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ENSNewTTLIterator is returned from FilterNewTTL and is used to iterate over the raw logs and unpacked data for NewTTL events raised by the ENS contract. -type ENSNewTTLIterator struct { - Event *ENSNewTTL // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ENSNewTTLIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ENSNewTTL) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ENSNewTTL) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ENSNewTTLIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSNewTTLIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSNewTTL represents a NewTTL event raised by the ENS contract. -type ENSNewTTL struct { - Node [32]byte - Ttl uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterNewTTL is a free log retrieval operation binding the contract event 0x1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68. -// -// Solidity: event NewTTL(node indexed bytes32, ttl uint64) -func (_ENS *ENSFilterer) FilterNewTTL(opts *bind.FilterOpts, node [][32]byte) (*ENSNewTTLIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.FilterLogs(opts, "NewTTL", nodeRule) - if err != nil { - return nil, err - } - return &ENSNewTTLIterator{contract: _ENS.contract, event: "NewTTL", logs: logs, sub: sub}, nil -} - -// WatchNewTTL is a free log subscription operation binding the contract event 0x1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68. -// -// Solidity: event NewTTL(node indexed bytes32, ttl uint64) -func (_ENS *ENSFilterer) WatchNewTTL(opts *bind.WatchOpts, sink chan<- *ENSNewTTL, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.WatchLogs(opts, "NewTTL", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ENSNewTTL) - if err := _ENS.contract.UnpackLog(event, "NewTTL", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ENSTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ENS contract. -type ENSTransferIterator struct { - Event *ENSTransfer // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ENSTransferIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ENSTransfer) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ENSTransfer) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ENSTransferIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSTransferIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSTransfer represents a Transfer event raised by the ENS contract. -type ENSTransfer struct { - Node [32]byte - Owner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterTransfer is a free log retrieval operation binding the contract event 0xd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266. -// -// Solidity: event Transfer(node indexed bytes32, owner address) -func (_ENS *ENSFilterer) FilterTransfer(opts *bind.FilterOpts, node [][32]byte) (*ENSTransferIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.FilterLogs(opts, "Transfer", nodeRule) - if err != nil { - return nil, err - } - return &ENSTransferIterator{contract: _ENS.contract, event: "Transfer", logs: logs, sub: sub}, nil -} - -// WatchTransfer is a free log subscription operation binding the contract event 0xd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266. -// -// Solidity: event Transfer(node indexed bytes32, owner address) -func (_ENS *ENSFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ENSTransfer, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.WatchLogs(opts, "Transfer", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ENSTransfer) - if err := _ENS.contract.UnpackLog(event, "Transfer", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} diff --git a/contracts/ens/contract/fifsregistrar.go b/contracts/ens/contract/fifsregistrar.go deleted file mode 100644 index a08380adfca5..000000000000 --- a/contracts/ens/contract/fifsregistrar.go +++ /dev/null @@ -1,195 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package contract - -import ( - "strings" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -// FIFSRegistrarABI is the input ABI used to generate the binding from. -const FIFSRegistrarABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"subnode\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"register\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"ensAddr\",\"type\":\"address\"},{\"name\":\"node\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]" - -// FIFSRegistrarBin is the compiled bytecode used for deploying new contracts. -const FIFSRegistrarBin = `0x6060604052341561000f57600080fd5b604051604080610224833981016040528080519190602001805160008054600160a060020a03909516600160a060020a03199095169490941790935550506001556101c58061005f6000396000f3006060604052600436106100275763ffffffff60e060020a600035041663d22057a9811461002c575b600080fd5b341561003757600080fd5b61004e600435600160a060020a0360243516610050565b005b816000806001548360405191825260208201526040908101905190819003902060008054919350600160a060020a03909116906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156100c857600080fd5b6102c65a03f115156100d957600080fd5b5050506040518051915050600160a060020a0381161580159061010e575033600160a060020a031681600160a060020a031614155b1561011857600080fd5b600054600154600160a060020a03909116906306ab592390878760405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b151561017e57600080fd5b6102c65a03f1151561018f57600080fd5b50505050505050505600a165627a7a723058206fb963cb168d5e3a51af12cd6bb23e324dbd32dd4954f43653ba27e66b68ea650029` - -// DeployFIFSRegistrar deploys a new Ethereum contract, binding an instance of FIFSRegistrar to it. -func DeployFIFSRegistrar(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address, node [32]byte) (common.Address, *types.Transaction, *FIFSRegistrar, error) { - parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(FIFSRegistrarBin), backend, ensAddr, node) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}, FIFSRegistrarFilterer: FIFSRegistrarFilterer{contract: contract}}, nil -} - -// FIFSRegistrar is an auto generated Go binding around an Ethereum contract. -type FIFSRegistrar struct { - FIFSRegistrarCaller // Read-only binding to the contract - FIFSRegistrarTransactor // Write-only binding to the contract - FIFSRegistrarFilterer // Log filterer for contract events -} - -// FIFSRegistrarCaller is an auto generated read-only Go binding around an Ethereum contract. -type FIFSRegistrarCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// FIFSRegistrarTransactor is an auto generated write-only Go binding around an Ethereum contract. -type FIFSRegistrarTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// FIFSRegistrarFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type FIFSRegistrarFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// FIFSRegistrarSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type FIFSRegistrarSession struct { - Contract *FIFSRegistrar // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// FIFSRegistrarCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type FIFSRegistrarCallerSession struct { - Contract *FIFSRegistrarCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// FIFSRegistrarTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type FIFSRegistrarTransactorSession struct { - Contract *FIFSRegistrarTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// FIFSRegistrarRaw is an auto generated low-level Go binding around an Ethereum contract. -type FIFSRegistrarRaw struct { - Contract *FIFSRegistrar // Generic contract binding to access the raw methods on -} - -// FIFSRegistrarCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type FIFSRegistrarCallerRaw struct { - Contract *FIFSRegistrarCaller // Generic read-only contract binding to access the raw methods on -} - -// FIFSRegistrarTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type FIFSRegistrarTransactorRaw struct { - Contract *FIFSRegistrarTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewFIFSRegistrar creates a new instance of FIFSRegistrar, bound to a specific deployed contract. -func NewFIFSRegistrar(address common.Address, backend bind.ContractBackend) (*FIFSRegistrar, error) { - contract, err := bindFIFSRegistrar(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}, FIFSRegistrarFilterer: FIFSRegistrarFilterer{contract: contract}}, nil -} - -// NewFIFSRegistrarCaller creates a new read-only instance of FIFSRegistrar, bound to a specific deployed contract. -func NewFIFSRegistrarCaller(address common.Address, caller bind.ContractCaller) (*FIFSRegistrarCaller, error) { - contract, err := bindFIFSRegistrar(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &FIFSRegistrarCaller{contract: contract}, nil -} - -// NewFIFSRegistrarTransactor creates a new write-only instance of FIFSRegistrar, bound to a specific deployed contract. -func NewFIFSRegistrarTransactor(address common.Address, transactor bind.ContractTransactor) (*FIFSRegistrarTransactor, error) { - contract, err := bindFIFSRegistrar(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &FIFSRegistrarTransactor{contract: contract}, nil -} - -// NewFIFSRegistrarFilterer creates a new log filterer instance of FIFSRegistrar, bound to a specific deployed contract. -func NewFIFSRegistrarFilterer(address common.Address, filterer bind.ContractFilterer) (*FIFSRegistrarFilterer, error) { - contract, err := bindFIFSRegistrar(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &FIFSRegistrarFilterer{contract: contract}, nil -} - -// bindFIFSRegistrar binds a generic wrapper to an already deployed contract. -func bindFIFSRegistrar(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_FIFSRegistrar *FIFSRegistrarRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _FIFSRegistrar.Contract.FIFSRegistrarCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_FIFSRegistrar *FIFSRegistrarRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_FIFSRegistrar *FIFSRegistrarRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_FIFSRegistrar *FIFSRegistrarCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _FIFSRegistrar.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.contract.Transact(opts, method, params...) -} - -// Register is a paid mutator transaction binding the contract method 0xd22057a9. -// -// Solidity: function register(subnode bytes32, owner address) returns() -func (_FIFSRegistrar *FIFSRegistrarTransactor) Register(opts *bind.TransactOpts, subnode [32]byte, owner common.Address) (*types.Transaction, error) { - return _FIFSRegistrar.contract.Transact(opts, "register", subnode, owner) -} - -// Register is a paid mutator transaction binding the contract method 0xd22057a9. -// -// Solidity: function register(subnode bytes32, owner address) returns() -func (_FIFSRegistrar *FIFSRegistrarSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner) -} - -// Register is a paid mutator transaction binding the contract method 0xd22057a9. -// -// Solidity: function register(subnode bytes32, owner address) returns() -func (_FIFSRegistrar *FIFSRegistrarTransactorSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner) -} diff --git a/contracts/ens/contract/publicresolver.go b/contracts/ens/contract/publicresolver.go deleted file mode 100644 index c567d5884a79..000000000000 --- a/contracts/ens/contract/publicresolver.go +++ /dev/null @@ -1,1321 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package contract - -import ( - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// PublicResolverABI is the input ABI used to generate the binding from. -const PublicResolverABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"name\":\"setText\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"contentTypes\",\"type\":\"uint256\"}],\"name\":\"ABI\",\"outputs\":[{\"name\":\"contentType\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"x\",\"type\":\"bytes32\"},{\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"setPubkey\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"content\",\"outputs\":[{\"name\":\"ret\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"addr\",\"outputs\":[{\"name\":\"ret\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"key\",\"type\":\"string\"}],\"name\":\"text\",\"outputs\":[{\"name\":\"ret\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"contentType\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"setABI\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"name\",\"outputs\":[{\"name\":\"ret\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"hash\",\"type\":\"bytes32\"}],\"name\":\"setContent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"pubkey\",\"outputs\":[{\"name\":\"x\",\"type\":\"bytes32\"},{\"name\":\"y\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"setAddr\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"ensAddr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"a\",\"type\":\"address\"}],\"name\":\"AddrChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"hash\",\"type\":\"bytes32\"}],\"name\":\"ContentChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NameChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"contentType\",\"type\":\"uint256\"}],\"name\":\"ABIChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"x\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"PubkeyChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"indexedKey\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"key\",\"type\":\"string\"}],\"name\":\"TextChanged\",\"type\":\"event\"}]" - -// PublicResolverBin is the compiled bytecode used for deploying new contracts. -const PublicResolverBin = `0x6060604052341561000f57600080fd5b6040516020806111b28339810160405280805160008054600160a060020a03909216600160a060020a0319909216919091179055505061115e806100546000396000f3006060604052600436106100ab5763ffffffff60e060020a60003504166301ffc9a781146100b057806310f13a8c146100e45780632203ab561461017e57806329cd62ea146102155780632dff6941146102315780633b3b57de1461025957806359d1d43c1461028b578063623195b014610358578063691f3431146103b457806377372213146103ca578063c3d014d614610420578063c869023314610439578063d5fa2b0014610467575b600080fd5b34156100bb57600080fd5b6100d0600160e060020a031960043516610489565b604051901515815260200160405180910390f35b34156100ef57600080fd5b61017c600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506105f695505050505050565b005b341561018957600080fd5b610197600435602435610807565b60405182815260406020820181815290820183818151815260200191508051906020019080838360005b838110156101d95780820151838201526020016101c1565b50505050905090810190601f1680156102065780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561022057600080fd5b61017c600435602435604435610931565b341561023c57600080fd5b610247600435610a30565b60405190815260200160405180910390f35b341561026457600080fd5b61026f600435610a46565b604051600160a060020a03909116815260200160405180910390f35b341561029657600080fd5b6102e1600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610a6195505050505050565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561031d578082015183820152602001610305565b50505050905090810190601f16801561034a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036357600080fd5b61017c600480359060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610b8095505050505050565b34156103bf57600080fd5b6102e1600435610c7c565b34156103d557600080fd5b61017c600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610d4295505050505050565b341561042b57600080fd5b61017c600435602435610e8c565b341561044457600080fd5b61044f600435610f65565b60405191825260208201526040908101905180910390f35b341561047257600080fd5b61017c600435600160a060020a0360243516610f82565b6000600160e060020a031982167f3b3b57de0000000000000000000000000000000000000000000000000000000014806104ec5750600160e060020a031982167fd8389dc500000000000000000000000000000000000000000000000000000000145b806105205750600160e060020a031982167f691f343100000000000000000000000000000000000000000000000000000000145b806105545750600160e060020a031982167f2203ab5600000000000000000000000000000000000000000000000000000000145b806105885750600160e060020a031982167fc869023300000000000000000000000000000000000000000000000000000000145b806105bc5750600160e060020a031982167f59d1d43c00000000000000000000000000000000000000000000000000000000145b806105f05750600160e060020a031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561064f57600080fd5b6102c65a03f1151561066057600080fd5b50505060405180519050600160a060020a031614151561067f57600080fd5b6000848152600160205260409081902083916005909101908590518082805190602001908083835b602083106106c65780518252601f1990920191602091820191016106a7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090805161070a929160200190611085565b50826040518082805190602001908083835b6020831061073b5780518252601f19909201916020918201910161071c565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051908190039020847fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508560405160208082528190810183818151815260200191508051906020019080838360005b838110156107c75780820151838201526020016107af565b50505050905090810190601f1680156107f45780820380516001836020036101000a031916815260200191505b509250505060405180910390a350505050565b6000610811611103565b60008481526001602081905260409091209092505b838311610924578284161580159061085f5750600083815260068201602052604081205460026000196101006001841615020190911604115b15610919578060060160008481526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561090d5780601f106108e25761010080835404028352916020019161090d565b820191906000526020600020905b8154815290600101906020018083116108f057829003601f168201915b50505050509150610929565b600290920291610826565b600092505b509250929050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561098a57600080fd5b6102c65a03f1151561099b57600080fd5b50505060405180519050600160a060020a03161415156109ba57600080fd5b6040805190810160409081528482526020808301859052600087815260019091522060030181518155602082015160019091015550837f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46848460405191825260208201526040908101905180910390a250505050565b6000908152600160208190526040909120015490565b600090815260016020526040902054600160a060020a031690565b610a69611103565b60008381526001602052604090819020600501908390518082805190602001908083835b60208310610aac5780518252601f199092019160209182019101610a8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b735780601f10610b4857610100808354040283529160200191610b73565b820191906000526020600020905b815481529060010190602001808311610b5657829003601f168201915b5050505050905092915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610bd957600080fd5b6102c65a03f11515610bea57600080fd5b50505060405180519050600160a060020a0316141515610c0957600080fd5b6000198301831615610c1a57600080fd5b60008481526001602090815260408083208684526006019091529020828051610c47929160200190611085565b5082847faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe360405160405180910390a350505050565b610c84611103565b6001600083600019166000191681526020019081526020016000206002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d365780601f10610d0b57610100808354040283529160200191610d36565b820191906000526020600020905b815481529060010190602001808311610d1957829003601f168201915b50505050509050919050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610d9b57600080fd5b6102c65a03f11515610dac57600080fd5b50505060405180519050600160a060020a0316141515610dcb57600080fd5b6000838152600160205260409020600201828051610ded929160200190611085565b50827fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f78360405160208082528190810183818151815260200191508051906020019080838360005b83811015610e4d578082015183820152602001610e35565b50505050905090810190601f168015610e7a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610ee557600080fd5b6102c65a03f11515610ef657600080fd5b50505060405180519050600160a060020a0316141515610f1557600080fd5b6000838152600160208190526040918290200183905583907f0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc9084905190815260200160405180910390a2505050565b600090815260016020526040902060038101546004909101549091565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610fdb57600080fd5b6102c65a03f11515610fec57600080fd5b50505060405180519050600160a060020a031614151561100b57600080fd5b60008381526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03851617905583907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd290849051600160a060020a03909116815260200160405180910390a2505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106110c657805160ff19168380011785556110f3565b828001600101855582156110f3579182015b828111156110f35782518255916020019190600101906110d8565b506110ff929150611115565b5090565b60206040519081016040526000815290565b61112f91905b808211156110ff576000815560010161111b565b905600a165627a7a723058201ecacbc445b9fbcd91b0ab164389f69d7283b856883bc7437eeed1008345a4920029` - -// DeployPublicResolver deploys a new Ethereum contract, binding an instance of PublicResolver to it. -func DeployPublicResolver(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address) (common.Address, *types.Transaction, *PublicResolver, error) { - parsed, err := abi.JSON(strings.NewReader(PublicResolverABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(PublicResolverBin), backend, ensAddr) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}, PublicResolverFilterer: PublicResolverFilterer{contract: contract}}, nil -} - -// PublicResolver is an auto generated Go binding around an Ethereum contract. -type PublicResolver struct { - PublicResolverCaller // Read-only binding to the contract - PublicResolverTransactor // Write-only binding to the contract - PublicResolverFilterer // Log filterer for contract events -} - -// PublicResolverCaller is an auto generated read-only Go binding around an Ethereum contract. -type PublicResolverCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PublicResolverTransactor is an auto generated write-only Go binding around an Ethereum contract. -type PublicResolverTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PublicResolverFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type PublicResolverFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PublicResolverSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type PublicResolverSession struct { - Contract *PublicResolver // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// PublicResolverCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type PublicResolverCallerSession struct { - Contract *PublicResolverCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// PublicResolverTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type PublicResolverTransactorSession struct { - Contract *PublicResolverTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// PublicResolverRaw is an auto generated low-level Go binding around an Ethereum contract. -type PublicResolverRaw struct { - Contract *PublicResolver // Generic contract binding to access the raw methods on -} - -// PublicResolverCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type PublicResolverCallerRaw struct { - Contract *PublicResolverCaller // Generic read-only contract binding to access the raw methods on -} - -// PublicResolverTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type PublicResolverTransactorRaw struct { - Contract *PublicResolverTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewPublicResolver creates a new instance of PublicResolver, bound to a specific deployed contract. -func NewPublicResolver(address common.Address, backend bind.ContractBackend) (*PublicResolver, error) { - contract, err := bindPublicResolver(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}, PublicResolverFilterer: PublicResolverFilterer{contract: contract}}, nil -} - -// NewPublicResolverCaller creates a new read-only instance of PublicResolver, bound to a specific deployed contract. -func NewPublicResolverCaller(address common.Address, caller bind.ContractCaller) (*PublicResolverCaller, error) { - contract, err := bindPublicResolver(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &PublicResolverCaller{contract: contract}, nil -} - -// NewPublicResolverTransactor creates a new write-only instance of PublicResolver, bound to a specific deployed contract. -func NewPublicResolverTransactor(address common.Address, transactor bind.ContractTransactor) (*PublicResolverTransactor, error) { - contract, err := bindPublicResolver(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &PublicResolverTransactor{contract: contract}, nil -} - -// NewPublicResolverFilterer creates a new log filterer instance of PublicResolver, bound to a specific deployed contract. -func NewPublicResolverFilterer(address common.Address, filterer bind.ContractFilterer) (*PublicResolverFilterer, error) { - contract, err := bindPublicResolver(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &PublicResolverFilterer{contract: contract}, nil -} - -// bindPublicResolver binds a generic wrapper to an already deployed contract. -func bindPublicResolver(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(PublicResolverABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_PublicResolver *PublicResolverRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _PublicResolver.Contract.PublicResolverCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_PublicResolver *PublicResolverRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PublicResolver.Contract.PublicResolverTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_PublicResolver *PublicResolverRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _PublicResolver.Contract.PublicResolverTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_PublicResolver *PublicResolverCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _PublicResolver.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_PublicResolver *PublicResolverTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PublicResolver.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_PublicResolver *PublicResolverTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _PublicResolver.Contract.contract.Transact(opts, method, params...) -} - -// ABI is a free data retrieval call binding the contract method 0x2203ab56. -// -// Solidity: function ABI(node bytes32, contentTypes uint256) constant returns(contentType uint256, data bytes) -func (_PublicResolver *PublicResolverCaller) ABI(opts *bind.CallOpts, node [32]byte, contentTypes *big.Int) (struct { - ContentType *big.Int - Data []byte -}, error) { - ret := new(struct { - ContentType *big.Int - Data []byte - }) - out := ret - err := _PublicResolver.contract.Call(opts, out, "ABI", node, contentTypes) - return *ret, err -} - -// ABI is a free data retrieval call binding the contract method 0x2203ab56. -// -// Solidity: function ABI(node bytes32, contentTypes uint256) constant returns(contentType uint256, data bytes) -func (_PublicResolver *PublicResolverSession) ABI(node [32]byte, contentTypes *big.Int) (struct { - ContentType *big.Int - Data []byte -}, error) { - return _PublicResolver.Contract.ABI(&_PublicResolver.CallOpts, node, contentTypes) -} - -// ABI is a free data retrieval call binding the contract method 0x2203ab56. -// -// Solidity: function ABI(node bytes32, contentTypes uint256) constant returns(contentType uint256, data bytes) -func (_PublicResolver *PublicResolverCallerSession) ABI(node [32]byte, contentTypes *big.Int) (struct { - ContentType *big.Int - Data []byte -}, error) { - return _PublicResolver.Contract.ABI(&_PublicResolver.CallOpts, node, contentTypes) -} - -// Addr is a free data retrieval call binding the contract method 0x3b3b57de. -// -// Solidity: function addr(node bytes32) constant returns(ret address) -func (_PublicResolver *PublicResolverCaller) Addr(opts *bind.CallOpts, node [32]byte) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "addr", node) - return *ret0, err -} - -// Addr is a free data retrieval call binding the contract method 0x3b3b57de. -// -// Solidity: function addr(node bytes32) constant returns(ret address) -func (_PublicResolver *PublicResolverSession) Addr(node [32]byte) (common.Address, error) { - return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node) -} - -// Addr is a free data retrieval call binding the contract method 0x3b3b57de. -// -// Solidity: function addr(node bytes32) constant returns(ret address) -func (_PublicResolver *PublicResolverCallerSession) Addr(node [32]byte) (common.Address, error) { - return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node) -} - -// Content is a free data retrieval call binding the contract method 0x2dff6941. -// -// Solidity: function content(node bytes32) constant returns(ret bytes32) -func (_PublicResolver *PublicResolverCaller) Content(opts *bind.CallOpts, node [32]byte) ([32]byte, error) { - var ( - ret0 = new([32]byte) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "content", node) - return *ret0, err -} - -// Content is a free data retrieval call binding the contract method 0x2dff6941. -// -// Solidity: function content(node bytes32) constant returns(ret bytes32) -func (_PublicResolver *PublicResolverSession) Content(node [32]byte) ([32]byte, error) { - return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node) -} - -// Content is a free data retrieval call binding the contract method 0x2dff6941. -// -// Solidity: function content(node bytes32) constant returns(ret bytes32) -func (_PublicResolver *PublicResolverCallerSession) Content(node [32]byte) ([32]byte, error) { - return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node) -} - -// Name is a free data retrieval call binding the contract method 0x691f3431. -// -// Solidity: function name(node bytes32) constant returns(ret string) -func (_PublicResolver *PublicResolverCaller) Name(opts *bind.CallOpts, node [32]byte) (string, error) { - var ( - ret0 = new(string) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "name", node) - return *ret0, err -} - -// Name is a free data retrieval call binding the contract method 0x691f3431. -// -// Solidity: function name(node bytes32) constant returns(ret string) -func (_PublicResolver *PublicResolverSession) Name(node [32]byte) (string, error) { - return _PublicResolver.Contract.Name(&_PublicResolver.CallOpts, node) -} - -// Name is a free data retrieval call binding the contract method 0x691f3431. -// -// Solidity: function name(node bytes32) constant returns(ret string) -func (_PublicResolver *PublicResolverCallerSession) Name(node [32]byte) (string, error) { - return _PublicResolver.Contract.Name(&_PublicResolver.CallOpts, node) -} - -// Pubkey is a free data retrieval call binding the contract method 0xc8690233. -// -// Solidity: function pubkey(node bytes32) constant returns(x bytes32, y bytes32) -func (_PublicResolver *PublicResolverCaller) Pubkey(opts *bind.CallOpts, node [32]byte) (struct { - X [32]byte - Y [32]byte -}, error) { - ret := new(struct { - X [32]byte - Y [32]byte - }) - out := ret - err := _PublicResolver.contract.Call(opts, out, "pubkey", node) - return *ret, err -} - -// Pubkey is a free data retrieval call binding the contract method 0xc8690233. -// -// Solidity: function pubkey(node bytes32) constant returns(x bytes32, y bytes32) -func (_PublicResolver *PublicResolverSession) Pubkey(node [32]byte) (struct { - X [32]byte - Y [32]byte -}, error) { - return _PublicResolver.Contract.Pubkey(&_PublicResolver.CallOpts, node) -} - -// Pubkey is a free data retrieval call binding the contract method 0xc8690233. -// -// Solidity: function pubkey(node bytes32) constant returns(x bytes32, y bytes32) -func (_PublicResolver *PublicResolverCallerSession) Pubkey(node [32]byte) (struct { - X [32]byte - Y [32]byte -}, error) { - return _PublicResolver.Contract.Pubkey(&_PublicResolver.CallOpts, node) -} - -// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. -// -// Solidity: function supportsInterface(interfaceID bytes4) constant returns(bool) -func (_PublicResolver *PublicResolverCaller) SupportsInterface(opts *bind.CallOpts, interfaceID [4]byte) (bool, error) { - var ( - ret0 = new(bool) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "supportsInterface", interfaceID) - return *ret0, err -} - -// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. -// -// Solidity: function supportsInterface(interfaceID bytes4) constant returns(bool) -func (_PublicResolver *PublicResolverSession) SupportsInterface(interfaceID [4]byte) (bool, error) { - return _PublicResolver.Contract.SupportsInterface(&_PublicResolver.CallOpts, interfaceID) -} - -// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. -// -// Solidity: function supportsInterface(interfaceID bytes4) constant returns(bool) -func (_PublicResolver *PublicResolverCallerSession) SupportsInterface(interfaceID [4]byte) (bool, error) { - return _PublicResolver.Contract.SupportsInterface(&_PublicResolver.CallOpts, interfaceID) -} - -// Text is a free data retrieval call binding the contract method 0x59d1d43c. -// -// Solidity: function text(node bytes32, key string) constant returns(ret string) -func (_PublicResolver *PublicResolverCaller) Text(opts *bind.CallOpts, node [32]byte, key string) (string, error) { - var ( - ret0 = new(string) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "text", node, key) - return *ret0, err -} - -// Text is a free data retrieval call binding the contract method 0x59d1d43c. -// -// Solidity: function text(node bytes32, key string) constant returns(ret string) -func (_PublicResolver *PublicResolverSession) Text(node [32]byte, key string) (string, error) { - return _PublicResolver.Contract.Text(&_PublicResolver.CallOpts, node, key) -} - -// Text is a free data retrieval call binding the contract method 0x59d1d43c. -// -// Solidity: function text(node bytes32, key string) constant returns(ret string) -func (_PublicResolver *PublicResolverCallerSession) Text(node [32]byte, key string) (string, error) { - return _PublicResolver.Contract.Text(&_PublicResolver.CallOpts, node, key) -} - -// SetABI is a paid mutator transaction binding the contract method 0x623195b0. -// -// Solidity: function setABI(node bytes32, contentType uint256, data bytes) returns() -func (_PublicResolver *PublicResolverTransactor) SetABI(opts *bind.TransactOpts, node [32]byte, contentType *big.Int, data []byte) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setABI", node, contentType, data) -} - -// SetABI is a paid mutator transaction binding the contract method 0x623195b0. -// -// Solidity: function setABI(node bytes32, contentType uint256, data bytes) returns() -func (_PublicResolver *PublicResolverSession) SetABI(node [32]byte, contentType *big.Int, data []byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetABI(&_PublicResolver.TransactOpts, node, contentType, data) -} - -// SetABI is a paid mutator transaction binding the contract method 0x623195b0. -// -// Solidity: function setABI(node bytes32, contentType uint256, data bytes) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetABI(node [32]byte, contentType *big.Int, data []byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetABI(&_PublicResolver.TransactOpts, node, contentType, data) -} - -// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00. -// -// Solidity: function setAddr(node bytes32, addr address) returns() -func (_PublicResolver *PublicResolverTransactor) SetAddr(opts *bind.TransactOpts, node [32]byte, addr common.Address) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setAddr", node, addr) -} - -// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00. -// -// Solidity: function setAddr(node bytes32, addr address) returns() -func (_PublicResolver *PublicResolverSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) { - return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr) -} - -// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00. -// -// Solidity: function setAddr(node bytes32, addr address) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) { - return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr) -} - -// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6. -// -// Solidity: function setContent(node bytes32, hash bytes32) returns() -func (_PublicResolver *PublicResolverTransactor) SetContent(opts *bind.TransactOpts, node [32]byte, hash [32]byte) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setContent", node, hash) -} - -// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6. -// -// Solidity: function setContent(node bytes32, hash bytes32) returns() -func (_PublicResolver *PublicResolverSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash) -} - -// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6. -// -// Solidity: function setContent(node bytes32, hash bytes32) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash) -} - -// SetName is a paid mutator transaction binding the contract method 0x77372213. -// -// Solidity: function setName(node bytes32, name string) returns() -func (_PublicResolver *PublicResolverTransactor) SetName(opts *bind.TransactOpts, node [32]byte, name string) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setName", node, name) -} - -// SetName is a paid mutator transaction binding the contract method 0x77372213. -// -// Solidity: function setName(node bytes32, name string) returns() -func (_PublicResolver *PublicResolverSession) SetName(node [32]byte, name string) (*types.Transaction, error) { - return _PublicResolver.Contract.SetName(&_PublicResolver.TransactOpts, node, name) -} - -// SetName is a paid mutator transaction binding the contract method 0x77372213. -// -// Solidity: function setName(node bytes32, name string) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetName(node [32]byte, name string) (*types.Transaction, error) { - return _PublicResolver.Contract.SetName(&_PublicResolver.TransactOpts, node, name) -} - -// SetPubkey is a paid mutator transaction binding the contract method 0x29cd62ea. -// -// Solidity: function setPubkey(node bytes32, x bytes32, y bytes32) returns() -func (_PublicResolver *PublicResolverTransactor) SetPubkey(opts *bind.TransactOpts, node [32]byte, x [32]byte, y [32]byte) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setPubkey", node, x, y) -} - -// SetPubkey is a paid mutator transaction binding the contract method 0x29cd62ea. -// -// Solidity: function setPubkey(node bytes32, x bytes32, y bytes32) returns() -func (_PublicResolver *PublicResolverSession) SetPubkey(node [32]byte, x [32]byte, y [32]byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetPubkey(&_PublicResolver.TransactOpts, node, x, y) -} - -// SetPubkey is a paid mutator transaction binding the contract method 0x29cd62ea. -// -// Solidity: function setPubkey(node bytes32, x bytes32, y bytes32) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetPubkey(node [32]byte, x [32]byte, y [32]byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetPubkey(&_PublicResolver.TransactOpts, node, x, y) -} - -// SetText is a paid mutator transaction binding the contract method 0x10f13a8c. -// -// Solidity: function setText(node bytes32, key string, value string) returns() -func (_PublicResolver *PublicResolverTransactor) SetText(opts *bind.TransactOpts, node [32]byte, key string, value string) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setText", node, key, value) -} - -// SetText is a paid mutator transaction binding the contract method 0x10f13a8c. -// -// Solidity: function setText(node bytes32, key string, value string) returns() -func (_PublicResolver *PublicResolverSession) SetText(node [32]byte, key string, value string) (*types.Transaction, error) { - return _PublicResolver.Contract.SetText(&_PublicResolver.TransactOpts, node, key, value) -} - -// SetText is a paid mutator transaction binding the contract method 0x10f13a8c. -// -// Solidity: function setText(node bytes32, key string, value string) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetText(node [32]byte, key string, value string) (*types.Transaction, error) { - return _PublicResolver.Contract.SetText(&_PublicResolver.TransactOpts, node, key, value) -} - -// PublicResolverABIChangedIterator is returned from FilterABIChanged and is used to iterate over the raw logs and unpacked data for ABIChanged events raised by the PublicResolver contract. -type PublicResolverABIChangedIterator struct { - Event *PublicResolverABIChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverABIChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverABIChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverABIChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverABIChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverABIChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverABIChanged represents a ABIChanged event raised by the PublicResolver contract. -type PublicResolverABIChanged struct { - Node [32]byte - ContentType *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterABIChanged is a free log retrieval operation binding the contract event 0xaa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3. -// -// Solidity: event ABIChanged(node indexed bytes32, contentType indexed uint256) -func (_PublicResolver *PublicResolverFilterer) FilterABIChanged(opts *bind.FilterOpts, node [][32]byte, contentType []*big.Int) (*PublicResolverABIChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var contentTypeRule []interface{} - for _, contentTypeItem := range contentType { - contentTypeRule = append(contentTypeRule, contentTypeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "ABIChanged", nodeRule, contentTypeRule) - if err != nil { - return nil, err - } - return &PublicResolverABIChangedIterator{contract: _PublicResolver.contract, event: "ABIChanged", logs: logs, sub: sub}, nil -} - -// WatchABIChanged is a free log subscription operation binding the contract event 0xaa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3. -// -// Solidity: event ABIChanged(node indexed bytes32, contentType indexed uint256) -func (_PublicResolver *PublicResolverFilterer) WatchABIChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverABIChanged, node [][32]byte, contentType []*big.Int) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var contentTypeRule []interface{} - for _, contentTypeItem := range contentType { - contentTypeRule = append(contentTypeRule, contentTypeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "ABIChanged", nodeRule, contentTypeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverABIChanged) - if err := _PublicResolver.contract.UnpackLog(event, "ABIChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverAddrChangedIterator is returned from FilterAddrChanged and is used to iterate over the raw logs and unpacked data for AddrChanged events raised by the PublicResolver contract. -type PublicResolverAddrChangedIterator struct { - Event *PublicResolverAddrChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverAddrChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverAddrChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverAddrChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverAddrChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverAddrChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverAddrChanged represents a AddrChanged event raised by the PublicResolver contract. -type PublicResolverAddrChanged struct { - Node [32]byte - A common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterAddrChanged is a free log retrieval operation binding the contract event 0x52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2. -// -// Solidity: event AddrChanged(node indexed bytes32, a address) -func (_PublicResolver *PublicResolverFilterer) FilterAddrChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverAddrChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "AddrChanged", nodeRule) - if err != nil { - return nil, err - } - return &PublicResolverAddrChangedIterator{contract: _PublicResolver.contract, event: "AddrChanged", logs: logs, sub: sub}, nil -} - -// WatchAddrChanged is a free log subscription operation binding the contract event 0x52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2. -// -// Solidity: event AddrChanged(node indexed bytes32, a address) -func (_PublicResolver *PublicResolverFilterer) WatchAddrChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverAddrChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "AddrChanged", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverAddrChanged) - if err := _PublicResolver.contract.UnpackLog(event, "AddrChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverContentChangedIterator is returned from FilterContentChanged and is used to iterate over the raw logs and unpacked data for ContentChanged events raised by the PublicResolver contract. -type PublicResolverContentChangedIterator struct { - Event *PublicResolverContentChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverContentChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverContentChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverContentChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverContentChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverContentChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverContentChanged represents a ContentChanged event raised by the PublicResolver contract. -type PublicResolverContentChanged struct { - Node [32]byte - Hash [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterContentChanged is a free log retrieval operation binding the contract event 0x0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc. -// -// Solidity: event ContentChanged(node indexed bytes32, hash bytes32) -func (_PublicResolver *PublicResolverFilterer) FilterContentChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverContentChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "ContentChanged", nodeRule) - if err != nil { - return nil, err - } - return &PublicResolverContentChangedIterator{contract: _PublicResolver.contract, event: "ContentChanged", logs: logs, sub: sub}, nil -} - -// WatchContentChanged is a free log subscription operation binding the contract event 0x0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc. -// -// Solidity: event ContentChanged(node indexed bytes32, hash bytes32) -func (_PublicResolver *PublicResolverFilterer) WatchContentChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverContentChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "ContentChanged", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverContentChanged) - if err := _PublicResolver.contract.UnpackLog(event, "ContentChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverNameChangedIterator is returned from FilterNameChanged and is used to iterate over the raw logs and unpacked data for NameChanged events raised by the PublicResolver contract. -type PublicResolverNameChangedIterator struct { - Event *PublicResolverNameChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverNameChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverNameChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverNameChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverNameChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverNameChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverNameChanged represents a NameChanged event raised by the PublicResolver contract. -type PublicResolverNameChanged struct { - Node [32]byte - Name string - Raw types.Log // Blockchain specific contextual infos -} - -// FilterNameChanged is a free log retrieval operation binding the contract event 0xb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7. -// -// Solidity: event NameChanged(node indexed bytes32, name string) -func (_PublicResolver *PublicResolverFilterer) FilterNameChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverNameChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "NameChanged", nodeRule) - if err != nil { - return nil, err - } - return &PublicResolverNameChangedIterator{contract: _PublicResolver.contract, event: "NameChanged", logs: logs, sub: sub}, nil -} - -// WatchNameChanged is a free log subscription operation binding the contract event 0xb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7. -// -// Solidity: event NameChanged(node indexed bytes32, name string) -func (_PublicResolver *PublicResolverFilterer) WatchNameChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverNameChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "NameChanged", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverNameChanged) - if err := _PublicResolver.contract.UnpackLog(event, "NameChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverPubkeyChangedIterator is returned from FilterPubkeyChanged and is used to iterate over the raw logs and unpacked data for PubkeyChanged events raised by the PublicResolver contract. -type PublicResolverPubkeyChangedIterator struct { - Event *PublicResolverPubkeyChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverPubkeyChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverPubkeyChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverPubkeyChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverPubkeyChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverPubkeyChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverPubkeyChanged represents a PubkeyChanged event raised by the PublicResolver contract. -type PublicResolverPubkeyChanged struct { - Node [32]byte - X [32]byte - Y [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPubkeyChanged is a free log retrieval operation binding the contract event 0x1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46. -// -// Solidity: event PubkeyChanged(node indexed bytes32, x bytes32, y bytes32) -func (_PublicResolver *PublicResolverFilterer) FilterPubkeyChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverPubkeyChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "PubkeyChanged", nodeRule) - if err != nil { - return nil, err - } - return &PublicResolverPubkeyChangedIterator{contract: _PublicResolver.contract, event: "PubkeyChanged", logs: logs, sub: sub}, nil -} - -// WatchPubkeyChanged is a free log subscription operation binding the contract event 0x1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46. -// -// Solidity: event PubkeyChanged(node indexed bytes32, x bytes32, y bytes32) -func (_PublicResolver *PublicResolverFilterer) WatchPubkeyChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverPubkeyChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "PubkeyChanged", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverPubkeyChanged) - if err := _PublicResolver.contract.UnpackLog(event, "PubkeyChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverTextChangedIterator is returned from FilterTextChanged and is used to iterate over the raw logs and unpacked data for TextChanged events raised by the PublicResolver contract. -type PublicResolverTextChangedIterator struct { - Event *PublicResolverTextChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverTextChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverTextChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverTextChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverTextChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverTextChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverTextChanged represents a TextChanged event raised by the PublicResolver contract. -type PublicResolverTextChanged struct { - Node [32]byte - IndexedKey common.Hash - Key string - Raw types.Log // Blockchain specific contextual infos -} - -// FilterTextChanged is a free log retrieval operation binding the contract event 0xd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550. -// -// Solidity: event TextChanged(node indexed bytes32, indexedKey indexed string, key string) -func (_PublicResolver *PublicResolverFilterer) FilterTextChanged(opts *bind.FilterOpts, node [][32]byte, indexedKey []string) (*PublicResolverTextChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var indexedKeyRule []interface{} - for _, indexedKeyItem := range indexedKey { - indexedKeyRule = append(indexedKeyRule, indexedKeyItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "TextChanged", nodeRule, indexedKeyRule) - if err != nil { - return nil, err - } - return &PublicResolverTextChangedIterator{contract: _PublicResolver.contract, event: "TextChanged", logs: logs, sub: sub}, nil -} - -// WatchTextChanged is a free log subscription operation binding the contract event 0xd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550. -// -// Solidity: event TextChanged(node indexed bytes32, indexedKey indexed string, key string) -func (_PublicResolver *PublicResolverFilterer) WatchTextChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverTextChanged, node [][32]byte, indexedKey []string) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var indexedKeyRule []interface{} - for _, indexedKeyItem := range indexedKey { - indexedKeyRule = append(indexedKeyRule, indexedKeyItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "TextChanged", nodeRule, indexedKeyRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverTextChanged) - if err := _PublicResolver.contract.UnpackLog(event, "TextChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} diff --git a/contracts/ens/ens.go b/contracts/ens/ens.go deleted file mode 100644 index b7448c471730..000000000000 --- a/contracts/ens/ens.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ens - -//go:generate abigen --sol contract/ENS.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/ens.go -//go:generate abigen --sol contract/FIFSRegistrar.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/fifsregistrar.go -//go:generate abigen --sol contract/PublicResolver.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/publicresolver.go - -import ( - "strings" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/ens/contract" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" -) - -var ( - MainNetAddress = common.HexToAddress("0x314159265dD8dbb310642f98f50C066173C1259b") - TestNetAddress = common.HexToAddress("0x112234455c3a32fd11230c42e7bccd4a84e02010") -) - -// swarm domain name registry and resolver -type ENS struct { - *contract.ENSSession - contractBackend bind.ContractBackend -} - -// NewENS creates a struct exposing convenient high-level operations for interacting with -// the Ethereum Name Service. -func NewENS(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*ENS, error) { - ens, err := contract.NewENS(contractAddr, contractBackend) - if err != nil { - return nil, err - } - - return &ENS{ - &contract.ENSSession{ - Contract: ens, - TransactOpts: *transactOpts, - }, - contractBackend, - }, nil -} - -// DeployENS deploys an instance of the ENS nameservice, with a 'first-in, first-served' root registrar. -func DeployENS(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (common.Address, *ENS, error) { - // Deploy the ENS registry. - ensAddr, _, _, err := contract.DeployENS(transactOpts, contractBackend) - if err != nil { - return ensAddr, nil, err - } - - ens, err := NewENS(transactOpts, ensAddr, contractBackend) - if err != nil { - return ensAddr, nil, err - } - - // Deploy the registrar. - regAddr, _, _, err := contract.DeployFIFSRegistrar(transactOpts, contractBackend, ensAddr, [32]byte{}) - if err != nil { - return ensAddr, nil, err - } - // Set the registrar as owner of the ENS root. - if _, err = ens.SetOwner([32]byte{}, regAddr); err != nil { - return ensAddr, nil, err - } - - return ensAddr, ens, nil -} - -func ensParentNode(name string) (common.Hash, common.Hash) { - parts := strings.SplitN(name, ".", 2) - label := crypto.Keccak256Hash([]byte(parts[0])) - if len(parts) == 1 { - return [32]byte{}, label - } else { - parentNode, parentLabel := ensParentNode(parts[1]) - return crypto.Keccak256Hash(parentNode[:], parentLabel[:]), label - } -} - -func EnsNode(name string) common.Hash { - parentNode, parentLabel := ensParentNode(name) - return crypto.Keccak256Hash(parentNode[:], parentLabel[:]) -} - -func (self *ENS) getResolver(node [32]byte) (*contract.PublicResolverSession, error) { - resolverAddr, err := self.Resolver(node) - if err != nil { - return nil, err - } - - resolver, err := contract.NewPublicResolver(resolverAddr, self.contractBackend) - if err != nil { - return nil, err - } - - return &contract.PublicResolverSession{ - Contract: resolver, - TransactOpts: self.TransactOpts, - }, nil -} - -func (self *ENS) getRegistrar(node [32]byte) (*contract.FIFSRegistrarSession, error) { - registrarAddr, err := self.Owner(node) - if err != nil { - return nil, err - } - - registrar, err := contract.NewFIFSRegistrar(registrarAddr, self.contractBackend) - if err != nil { - return nil, err - } - - return &contract.FIFSRegistrarSession{ - Contract: registrar, - TransactOpts: self.TransactOpts, - }, nil -} - -// Resolve is a non-transactional call that returns the content hash associated with a name. -func (self *ENS) Resolve(name string) (common.Hash, error) { - node := EnsNode(name) - - resolver, err := self.getResolver(node) - if err != nil { - return common.Hash{}, err - } - - ret, err := resolver.Content(node) - if err != nil { - return common.Hash{}, err - } - - return common.BytesToHash(ret[:]), nil -} - -// Addr is a non-transactional call that returns the address associated with a name. -func (self *ENS) Addr(name string) (common.Address, error) { - node := EnsNode(name) - - resolver, err := self.getResolver(node) - if err != nil { - return common.Address{}, err - } - - ret, err := resolver.Addr(node) - if err != nil { - return common.Address{}, err - } - - return common.BytesToAddress(ret[:]), nil -} - -// SetAddress sets the address associated with a name. Only works if the caller -// owns the name, and the associated resolver implements a `setAddress` function. -func (self *ENS) SetAddr(name string, addr common.Address) (*types.Transaction, error) { - node := EnsNode(name) - - resolver, err := self.getResolver(node) - if err != nil { - return nil, err - } - - opts := self.TransactOpts - opts.GasLimit = 200000 - return resolver.Contract.SetAddr(&opts, node, addr) -} - -// Register registers a new domain name for the caller, making them the owner of the new name. -// Only works if the registrar for the parent domain implements the FIFS registrar protocol. -func (self *ENS) Register(name string) (*types.Transaction, error) { - parentNode, label := ensParentNode(name) - registrar, err := self.getRegistrar(parentNode) - if err != nil { - return nil, err - } - return registrar.Contract.Register(&self.TransactOpts, label, self.TransactOpts.From) -} - -// SetContentHash sets the content hash associated with a name. Only works if the caller -// owns the name, and the associated resolver implements a `setContent` function. -func (self *ENS) SetContentHash(name string, hash common.Hash) (*types.Transaction, error) { - node := EnsNode(name) - - resolver, err := self.getResolver(node) - if err != nil { - return nil, err - } - - opts := self.TransactOpts - opts.GasLimit = 200000 - return resolver.Contract.SetContent(&opts, node, hash) -} diff --git a/contracts/ens/ens_test.go b/contracts/ens/ens_test.go deleted file mode 100644 index cd64fbf15f83..000000000000 --- a/contracts/ens/ens_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ens - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/ens/contract" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" -) - -var ( - key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - name = "my name on ENS" - hash = crypto.Keccak256Hash([]byte("my content")) - addr = crypto.PubkeyToAddress(key.PublicKey) - testAddr = common.HexToAddress("0x1234123412341234123412341234123412341234") -) - -func TestENS(t *testing.T) { - contractBackend := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}}, 10000000) - transactOpts := bind.NewKeyedTransactor(key) - - ensAddr, ens, err := DeployENS(transactOpts, contractBackend) - if err != nil { - t.Fatalf("can't deploy root registry: %v", err) - } - contractBackend.Commit() - - // Set ourself as the owner of the name. - if _, err := ens.Register(name); err != nil { - t.Fatalf("can't register: %v", err) - } - contractBackend.Commit() - - // Deploy a resolver and make it responsible for the name. - resolverAddr, _, _, err := contract.DeployPublicResolver(transactOpts, contractBackend, ensAddr) - if err != nil { - t.Fatalf("can't deploy resolver: %v", err) - } - if _, err := ens.SetResolver(EnsNode(name), resolverAddr); err != nil { - t.Fatalf("can't set resolver: %v", err) - } - contractBackend.Commit() - - // Set the content hash for the name. - if _, err = ens.SetContentHash(name, hash); err != nil { - t.Fatalf("can't set content hash: %v", err) - } - contractBackend.Commit() - - // Try to resolve the name. - vhost, err := ens.Resolve(name) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - if vhost != hash { - t.Fatalf("resolve error, expected %v, got %v", hash.Hex(), vhost.Hex()) - } - - // set the address for the name - if _, err = ens.SetAddr(name, testAddr); err != nil { - t.Fatalf("can't set address: %v", err) - } - contractBackend.Commit() - - // Try to resolve the name to an address - recoveredAddr, err := ens.Addr(name) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - if vhost != hash { - t.Fatalf("resolve error, expected %v, got %v", testAddr.Hex(), recoveredAddr.Hex()) - } -} diff --git a/core/asm/asm.go b/core/asm/asm.go index ce22f93f9258..4257198cc779 100644 --- a/core/asm/asm.go +++ b/core/asm/asm.go @@ -109,9 +109,9 @@ func PrintDisassembled(code string) error { it := NewInstructionIterator(script) for it.Next() { if it.Arg() != nil && 0 < len(it.Arg()) { - fmt.Printf("%06v: %v 0x%x\n", it.PC(), it.Op(), it.Arg()) + fmt.Printf("%05x: %v 0x%x\n", it.PC(), it.Op(), it.Arg()) } else { - fmt.Printf("%06v: %v\n", it.PC(), it.Op()) + fmt.Printf("%05x: %v\n", it.PC(), it.Op()) } } return it.Error() @@ -124,9 +124,9 @@ func Disassemble(script []byte) ([]string, error) { it := NewInstructionIterator(script) for it.Next() { if it.Arg() != nil && 0 < len(it.Arg()) { - instrs = append(instrs, fmt.Sprintf("%06v: %v 0x%x\n", it.PC(), it.Op(), it.Arg())) + instrs = append(instrs, fmt.Sprintf("%05x: %v 0x%x\n", it.PC(), it.Op(), it.Arg())) } else { - instrs = append(instrs, fmt.Sprintf("%06v: %v\n", it.PC(), it.Op())) + instrs = append(instrs, fmt.Sprintf("%05x: %v\n", it.PC(), it.Op())) } } if err := it.Error(); err != nil { diff --git a/core/asm/lex_test.go b/core/asm/lex_test.go index e6901d4e3769..16e0ad458d16 100644 --- a/core/asm/lex_test.go +++ b/core/asm/lex_test.go @@ -22,7 +22,7 @@ import ( ) func lexAll(src string) []token { - ch := Lex("test.asm", []byte(src), false) + ch := Lex([]byte(src), false) var tokens []token for i := range ch { diff --git a/core/asm/lexer.go b/core/asm/lexer.go index 91caeb27bc35..00526242e4cf 100644 --- a/core/asm/lexer.go +++ b/core/asm/lexer.go @@ -95,7 +95,7 @@ type lexer struct { // lex lexes the program by name with the given source. It returns a // channel on which the tokens are delivered. -func Lex(name string, source []byte, debug bool) <-chan token { +func Lex(source []byte, debug bool) <-chan token { ch := make(chan token) l := &lexer{ input: string(source), diff --git a/core/bench_test.go b/core/bench_test.go index 53cba051709d..79c369d5fcfb 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -150,14 +150,14 @@ func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) { // Create the database in memory or in a temporary directory. var db ethdb.Database if !disk { - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() } else { dir, err := ioutil.TempDir("", "eth-core-bench") if err != nil { b.Fatalf("cannot create temporary directory: %v", err) } defer os.RemoveAll(dir) - db, err = ethdb.NewLDBDatabase(dir, 128, 128) + db, err = rawdb.NewLevelDBDatabase(dir, 128, 128, "") if err != nil { b.Fatalf("cannot create temporary database: %v", err) } @@ -255,7 +255,7 @@ func benchWriteChain(b *testing.B, full bool, count uint64) { if err != nil { b.Fatalf("cannot create temporary directory: %v", err) } - db, err := ethdb.NewLDBDatabase(dir, 128, 1024) + db, err := rawdb.NewLevelDBDatabase(dir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", dir, err) } @@ -272,7 +272,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) { } defer os.RemoveAll(dir) - db, err := ethdb.NewLDBDatabase(dir, 128, 1024) + db, err := rawdb.NewLevelDBDatabase(dir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", dir, err) } @@ -283,7 +283,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) { b.ResetTimer() for i := 0; i < b.N; i++ { - db, err := ethdb.NewLDBDatabase(dir, 128, 1024) + db, err := rawdb.NewLevelDBDatabase(dir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", dir, err) } @@ -297,7 +297,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) { if full { hash := header.Hash() rawdb.ReadBody(db, hash, n) - rawdb.ReadReceipts(db, hash, n) + rawdb.ReadReceipts(db, hash, n, chain.Config()) } } chain.Stop() diff --git a/core/block_validator.go b/core/block_validator.go index 1329f624276f..b36ca56d7f7a 100644 --- a/core/block_validator.go +++ b/core/block_validator.go @@ -53,12 +53,6 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error { if v.bc.HasBlockAndState(block.Hash(), block.NumberU64()) { return ErrKnownBlock } - if !v.bc.HasBlockAndState(block.ParentHash(), block.NumberU64()-1) { - if !v.bc.HasBlock(block.ParentHash(), block.NumberU64()-1) { - return consensus.ErrUnknownAncestor - } - return consensus.ErrPrunedAncestor - } // Header validity is known at this point, check the uncles and transactions header := block.Header() if err := v.engine.VerifyUncles(v.bc, block); err != nil { @@ -70,6 +64,12 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error { if hash := types.DeriveSha(block.Transactions()); hash != header.TxHash { return fmt.Errorf("transaction root hash mismatch: have %x, want %x", hash, header.TxHash) } + if !v.bc.HasBlockAndState(block.ParentHash(), block.NumberU64()-1) { + if !v.bc.HasBlock(block.ParentHash(), block.NumberU64()-1) { + return consensus.ErrUnknownAncestor + } + return consensus.ErrPrunedAncestor + } return nil } @@ -77,7 +77,7 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error { // transition, such as amount of used gas, the receipt roots and the state root // itself. ValidateState returns a database batch if the validation was a success // otherwise nil and an error is returned. -func (v *BlockValidator) ValidateState(block, parent *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas uint64) error { +func (v *BlockValidator) ValidateState(block *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas uint64) error { header := block.Header() if block.GasUsed() != usedGas { return fmt.Errorf("invalid gas used (remote: %d local: %d)", block.GasUsed(), usedGas) diff --git a/core/block_validator_test.go b/core/block_validator_test.go index 9319a7835dba..06e2ba1a4fd9 100644 --- a/core/block_validator_test.go +++ b/core/block_validator_test.go @@ -22,9 +22,9 @@ import ( "time" "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" ) @@ -32,7 +32,7 @@ import ( func TestHeaderVerification(t *testing.T) { // Create a simple chain to verify var ( - testdb = ethdb.NewMemDatabase() + testdb = rawdb.NewMemoryDatabase() gspec = &Genesis{Config: params.TestChainConfig} genesis = gspec.MustCommit(testdb) blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil) @@ -84,7 +84,7 @@ func TestHeaderConcurrentVerification32(t *testing.T) { testHeaderConcurrentVeri func testHeaderConcurrentVerification(t *testing.T, threads int) { // Create a simple chain to verify var ( - testdb = ethdb.NewMemDatabase() + testdb = rawdb.NewMemoryDatabase() gspec = &Genesis{Config: params.TestChainConfig} genesis = gspec.MustCommit(testdb) blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil) @@ -156,7 +156,7 @@ func TestHeaderConcurrentAbortion32(t *testing.T) { testHeaderConcurrentAbortion func testHeaderConcurrentAbortion(t *testing.T, threads int) { // Create a simple chain to verify var ( - testdb = ethdb.NewMemDatabase() + testdb = rawdb.NewMemoryDatabase() gspec = &Genesis{Config: params.TestChainConfig} genesis = gspec.MustCommit(testdb) blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 1024, nil) diff --git a/core/blockchain.go b/core/blockchain.go index f4a818f4c054..59be3558950a 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -35,7 +35,6 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" @@ -47,9 +46,29 @@ import ( ) var ( - blockInsertTimer = metrics.NewRegisteredTimer("chain/inserts", nil) + headBlockGauge = metrics.NewRegisteredGauge("chain/head/block", nil) + headHeaderGauge = metrics.NewRegisteredGauge("chain/head/header", nil) + headFastBlockGauge = metrics.NewRegisteredGauge("chain/head/receipt", nil) - ErrNoGenesis = errors.New("Genesis not found in chain") + accountReadTimer = metrics.NewRegisteredTimer("chain/account/reads", nil) + accountHashTimer = metrics.NewRegisteredTimer("chain/account/hashes", nil) + accountUpdateTimer = metrics.NewRegisteredTimer("chain/account/updates", nil) + accountCommitTimer = metrics.NewRegisteredTimer("chain/account/commits", nil) + + storageReadTimer = metrics.NewRegisteredTimer("chain/storage/reads", nil) + storageHashTimer = metrics.NewRegisteredTimer("chain/storage/hashes", nil) + storageUpdateTimer = metrics.NewRegisteredTimer("chain/storage/updates", nil) + storageCommitTimer = metrics.NewRegisteredTimer("chain/storage/commits", nil) + + blockInsertTimer = metrics.NewRegisteredTimer("chain/inserts", nil) + blockValidationTimer = metrics.NewRegisteredTimer("chain/validation", nil) + blockExecutionTimer = metrics.NewRegisteredTimer("chain/execution", nil) + blockWriteTimer = metrics.NewRegisteredTimer("chain/write", nil) + + blockPrefetchExecuteTimer = metrics.NewRegisteredTimer("chain/prefetch/executes", nil) + blockPrefetchInterruptMeter = metrics.NewRegisteredMeter("chain/prefetch/interrupts", nil) + + errInsertionInterrupted = errors.New("insertion is interrupted") ) const ( @@ -59,18 +78,39 @@ const ( maxFutureBlocks = 256 maxTimeFutureBlocks = 30 badBlockLimit = 10 - triesInMemory = 128 + TriesInMemory = 128 // BlockChainVersion ensures that an incompatible database forces a resync from scratch. - BlockChainVersion = 3 + // + // Changelog: + // + // - Version 4 + // The following incompatible database changes were added: + // * the `BlockNumber`, `TxHash`, `TxIndex`, `BlockHash` and `Index` fields of log are deleted + // * the `Bloom` field of receipt is deleted + // * the `BlockIndex` and `TxIndex` fields of txlookup are deleted + // - Version 5 + // The following incompatible database changes were added: + // * the `TxHash`, `GasCost`, and `ContractAddress` fields are no longer stored for a receipt + // * the `TxHash`, `GasCost`, and `ContractAddress` fields are computed by looking up the + // receipts' corresponding block + // - Version 6 + // The following incompatible database changes were added: + // * Transaction lookup information stores the corresponding block number instead of block hash + // - Version 7 + // The following incompatible database changes were added: + // * Use freezer as the ancient database to maintain all ancient data + BlockChainVersion uint64 = 7 ) // CacheConfig contains the configuration values for the trie caching/pruning // that's resident in a blockchain. type CacheConfig struct { - Disabled bool // Whether to disable trie write caching (archive node) - TrieNodeLimit int // Memory limit (MB) at which to flush the current in-memory trie to disk - TrieTimeLimit time.Duration // Time limit after which to flush the current in-memory trie to disk + TrieCleanLimit int // Memory allowance (MB) to use for caching trie nodes in memory + TrieCleanNoPrefetch bool // Whether to disable heuristic state prefetching for followup blocks + TrieDirtyLimit int // Memory limit (MB) at which to start flushing dirty trie nodes to disk + TrieDirtyDisabled bool // Whether to disable trie write caching and GC altogether (archive node) + TrieTimeLimit time.Duration // Time limit after which to flush the current in-memory trie to disk } // BlockChain represents the canonical chain given a database with a genesis @@ -101,14 +141,12 @@ type BlockChain struct { chainSideFeed event.Feed chainHeadFeed event.Feed logsFeed event.Feed + blockProcFeed event.Feed scope event.SubscriptionScope genesisBlock *types.Block - mu sync.RWMutex // global mutex for locking chain operations chainmu sync.RWMutex // blockchain insertion lock - procmu sync.RWMutex // block processor lock - checkpoint int // checkpoint counts towards the new checkpoint currentBlock atomic.Value // Current head of the block chain currentFastBlock atomic.Value // Current head of the fast-sync chain (may be above the block chain!) @@ -125,13 +163,15 @@ type BlockChain struct { procInterrupt int32 // interrupt signaler for block processing wg sync.WaitGroup // chain processing wait group for shutting down - engine consensus.Engine - processor Processor // block processor interface - validator Validator // block and state validator interface - vmConfig vm.Config + engine consensus.Engine + validator Validator // Block and state validator interface + prefetcher Prefetcher // Block state prefetcher interface + processor Processor // Block transaction processor interface + vmConfig vm.Config - badBlocks *lru.Cache // Bad block cache - shouldPreserve func(*types.Block) bool // Function used to determine whether should preserve the given block. + badBlocks *lru.Cache // Bad block cache + shouldPreserve func(*types.Block) bool // Function used to determine whether should preserve the given block. + terminateInsert func(common.Hash, uint64) bool // Testing hook used to terminate ancient receipt chain insertion. } // NewBlockChain returns a fully initialised block chain using information @@ -140,8 +180,9 @@ type BlockChain struct { func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config, shouldPreserve func(block *types.Block) bool) (*BlockChain, error) { if cacheConfig == nil { cacheConfig = &CacheConfig{ - TrieNodeLimit: 256 * 1024 * 1024, - TrieTimeLimit: 5 * time.Minute, + TrieCleanLimit: 256, + TrieDirtyLimit: 256, + TrieTimeLimit: 5 * time.Minute, } } bodyCache, _ := lru.New(bodyCacheLimit) @@ -156,7 +197,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par cacheConfig: cacheConfig, db: db, triegc: prque.New(nil), - stateCache: state.NewDatabase(db), + stateCache: state.NewDatabaseWithCache(db, cacheConfig.TrieCleanLimit), quit: make(chan struct{}), shouldPreserve: shouldPreserve, bodyCache: bodyCache, @@ -168,8 +209,9 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par vmConfig: vmConfig, badBlocks: badBlocks, } - bc.SetValidator(NewBlockValidator(chainConfig, bc, engine)) - bc.SetProcessor(NewStateProcessor(chainConfig, bc, engine)) + bc.validator = NewBlockValidator(chainConfig, bc, engine) + bc.prefetcher = newStatePrefetcher(chainConfig, bc, engine) + bc.processor = NewStateProcessor(chainConfig, bc, engine) var err error bc.hc, err = NewHeaderChain(db, chainConfig, engine, bc.getProcInterrupt) @@ -180,9 +222,51 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par if bc.genesisBlock == nil { return nil, ErrNoGenesis } + // Initialize the chain with ancient data if it isn't empty. + if bc.empty() { + rawdb.InitDatabaseFromFreezer(bc.db) + } if err := bc.loadLastState(); err != nil { return nil, err } + // The first thing the node will do is reconstruct the verification data for + // the head block (ethash cache or clique voting snapshot). Might as well do + // it in advance. + bc.engine.VerifyHeader(bc, bc.CurrentHeader(), true) + + if frozen, err := bc.db.Ancients(); err == nil && frozen > 0 { + var ( + needRewind bool + low uint64 + ) + // The head full block may be rolled back to a very low height due to + // blockchain repair. If the head full block is even lower than the ancient + // chain, truncate the ancient store. + fullBlock := bc.CurrentBlock() + if fullBlock != nil && fullBlock != bc.genesisBlock && fullBlock.NumberU64() < frozen-1 { + needRewind = true + low = fullBlock.NumberU64() + } + // In fast sync, it may happen that ancient data has been written to the + // ancient store, but the LastFastBlock has not been updated, truncate the + // extra data here. + fastBlock := bc.CurrentFastBlock() + if fastBlock != nil && fastBlock.NumberU64() < frozen-1 { + needRewind = true + if fastBlock.NumberU64() < low || low == 0 { + low = fastBlock.NumberU64() + } + } + if needRewind { + var hashes []common.Hash + previous := bc.CurrentHeader().Number.Uint64() + for i := low + 1; i <= bc.CurrentHeader().Number.Uint64(); i++ { + hashes = append(hashes, rawdb.ReadCanonicalHash(bc.db, i)) + } + bc.Rollback(hashes) + log.Warn("Truncate ancient chain", "from", previous, "to", low) + } + } // Check the current state of the block hashes and make sure that we do not have any of the bad blocks in our chain for hash := range BadHashes { if header := bc.GetHeaderByHash(hash); header != nil { @@ -205,6 +289,25 @@ func (bc *BlockChain) getProcInterrupt() bool { return atomic.LoadInt32(&bc.procInterrupt) == 1 } +// GetVMConfig returns the block chain VM config. +func (bc *BlockChain) GetVMConfig() *vm.Config { + return &bc.vmConfig +} + +// empty returns an indicator whether the blockchain is empty. +// Note, it's a special case that we connect a non-empty ancient +// database with an empty node, so that we can plugin the ancient +// into node seamlessly. +func (bc *BlockChain) empty() bool { + genesis := bc.genesisBlock.Hash() + for _, hash := range []common.Hash{rawdb.ReadHeadBlockHash(bc.db), rawdb.ReadHeadHeaderHash(bc.db), rawdb.ReadHeadFastBlockHash(bc.db)} { + if hash != genesis { + return false + } + } + return true +} + // loadLastState loads the last known chain state from the database. This method // assumes that the chain manager mutex is held. func (bc *BlockChain) loadLastState() error { @@ -229,9 +332,11 @@ func (bc *BlockChain) loadLastState() error { if err := bc.repair(¤tBlock); err != nil { return err } + rawdb.WriteHeadBlockHash(bc.db, currentBlock.Hash()) } // Everything seems to be fine, set as the head block bc.currentBlock.Store(currentBlock) + headBlockGauge.Update(int64(currentBlock.NumberU64())) // Restore the last known head header currentHeader := currentBlock.Header() @@ -244,12 +349,14 @@ func (bc *BlockChain) loadLastState() error { // Restore the last known head fast block bc.currentFastBlock.Store(currentBlock) + headFastBlockGauge.Update(int64(currentBlock.NumberU64())) + if head := rawdb.ReadHeadFastBlockHash(bc.db); head != (common.Hash{}) { if block := bc.GetBlockByHash(head); block != nil { bc.currentFastBlock.Store(block) + headFastBlockGauge.Update(int64(block.NumberU64())) } } - // Issue a status log for the user currentFastBlock := bc.CurrentFastBlock() @@ -257,9 +364,9 @@ func (bc *BlockChain) loadLastState() error { blockTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) fastTd := bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()) - log.Info("Loaded most recent local header", "number", currentHeader.Number, "hash", currentHeader.Hash(), "td", headerTd, "age", common.PrettyAge(time.Unix(currentHeader.Time.Int64(), 0))) - log.Info("Loaded most recent local full block", "number", currentBlock.Number(), "hash", currentBlock.Hash(), "td", blockTd, "age", common.PrettyAge(time.Unix(currentBlock.Time().Int64(), 0))) - log.Info("Loaded most recent local fast block", "number", currentFastBlock.Number(), "hash", currentFastBlock.Hash(), "td", fastTd, "age", common.PrettyAge(time.Unix(currentFastBlock.Time().Int64(), 0))) + log.Info("Loaded most recent local header", "number", currentHeader.Number, "hash", currentHeader.Hash(), "td", headerTd, "age", common.PrettyAge(time.Unix(int64(currentHeader.Time), 0))) + log.Info("Loaded most recent local full block", "number", currentBlock.Number(), "hash", currentBlock.Hash(), "td", blockTd, "age", common.PrettyAge(time.Unix(int64(currentBlock.Time()), 0))) + log.Info("Loaded most recent local fast block", "number", currentFastBlock.Number(), "hash", currentFastBlock.Hash(), "td", fastTd, "age", common.PrettyAge(time.Unix(int64(currentFastBlock.Time()), 0))) return nil } @@ -271,15 +378,62 @@ func (bc *BlockChain) loadLastState() error { func (bc *BlockChain) SetHead(head uint64) error { log.Warn("Rewinding blockchain", "target", head) - bc.mu.Lock() - defer bc.mu.Unlock() + bc.chainmu.Lock() + defer bc.chainmu.Unlock() + + updateFn := func(db ethdb.KeyValueWriter, header *types.Header) { + // Rewind the block chain, ensuring we don't end up with a stateless head block + if currentBlock := bc.CurrentBlock(); currentBlock != nil && header.Number.Uint64() < currentBlock.NumberU64() { + newHeadBlock := bc.GetBlock(header.Hash(), header.Number.Uint64()) + if newHeadBlock == nil { + newHeadBlock = bc.genesisBlock + } else { + if _, err := state.New(newHeadBlock.Root(), bc.stateCache); err != nil { + // Rewound state missing, rolled back to before pivot, reset to genesis + newHeadBlock = bc.genesisBlock + } + } + rawdb.WriteHeadBlockHash(db, newHeadBlock.Hash()) + bc.currentBlock.Store(newHeadBlock) + headBlockGauge.Update(int64(newHeadBlock.NumberU64())) + } + + // Rewind the fast block in a simpleton way to the target head + if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock != nil && header.Number.Uint64() < currentFastBlock.NumberU64() { + newHeadFastBlock := bc.GetBlock(header.Hash(), header.Number.Uint64()) + // If either blocks reached nil, reset to the genesis state + if newHeadFastBlock == nil { + newHeadFastBlock = bc.genesisBlock + } + rawdb.WriteHeadFastBlockHash(db, newHeadFastBlock.Hash()) + bc.currentFastBlock.Store(newHeadFastBlock) + headFastBlockGauge.Update(int64(newHeadFastBlock.NumberU64())) + } + } // Rewind the header chain, deleting all block bodies until then - delFn := func(db rawdb.DatabaseDeleter, hash common.Hash, num uint64) { - rawdb.DeleteBody(db, hash, num) + delFn := func(db ethdb.KeyValueWriter, hash common.Hash, num uint64) { + // Ignore the error here since light client won't hit this path + frozen, _ := bc.db.Ancients() + if num+1 <= frozen { + // Truncate all relative data(header, total difficulty, body, receipt + // and canonical hash) from ancient store. + if err := bc.db.TruncateAncients(num + 1); err != nil { + log.Crit("Failed to truncate ancient data", "number", num, "err", err) + } + + // Remove the hash <-> number mapping from the active store. + rawdb.DeleteHeaderNumber(db, hash) + } else { + // Remove relative body and receipts from the active store. + // The header, total difficulty and canonical hash will be + // removed in the hc.SetHead function. + rawdb.DeleteBody(db, hash, num) + rawdb.DeleteReceipts(db, hash, num) + } + // Todo(rjl493456442) txlookup, bloombits, etc } - bc.hc.SetHead(head, delFn) - currentHeader := bc.hc.CurrentHeader() + bc.hc.SetHead(head, updateFn, delFn) // Clear out any stale content from the caches bc.bodyCache.Purge() @@ -288,33 +442,6 @@ func (bc *BlockChain) SetHead(head uint64) error { bc.blockCache.Purge() bc.futureBlocks.Purge() - // Rewind the block chain, ensuring we don't end up with a stateless head block - if currentBlock := bc.CurrentBlock(); currentBlock != nil && currentHeader.Number.Uint64() < currentBlock.NumberU64() { - bc.currentBlock.Store(bc.GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64())) - } - if currentBlock := bc.CurrentBlock(); currentBlock != nil { - if _, err := state.New(currentBlock.Root(), bc.stateCache); err != nil { - // Rewound state missing, rolled back to before pivot, reset to genesis - bc.currentBlock.Store(bc.genesisBlock) - } - } - // Rewind the fast block in a simpleton way to the target head - if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock != nil && currentHeader.Number.Uint64() < currentFastBlock.NumberU64() { - bc.currentFastBlock.Store(bc.GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64())) - } - // If either blocks reached nil, reset to the genesis state - if currentBlock := bc.CurrentBlock(); currentBlock == nil { - bc.currentBlock.Store(bc.genesisBlock) - } - if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock == nil { - bc.currentFastBlock.Store(bc.genesisBlock) - } - currentBlock := bc.CurrentBlock() - currentFastBlock := bc.CurrentFastBlock() - - rawdb.WriteHeadBlockHash(bc.db, currentBlock.Hash()) - rawdb.WriteHeadFastBlockHash(bc.db, currentFastBlock.Hash()) - return bc.loadLastState() } @@ -326,13 +453,14 @@ func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error { if block == nil { return fmt.Errorf("non existent block [%x…]", hash[:4]) } - if _, err := trie.NewSecure(block.Root(), bc.stateCache.TrieDB(), 0); err != nil { + if _, err := trie.NewSecure(block.Root(), bc.stateCache.TrieDB()); err != nil { return err } // If all checks out, manually set the head block - bc.mu.Lock() + bc.chainmu.Lock() bc.currentBlock.Store(block) - bc.mu.Unlock() + headBlockGauge.Update(int64(block.NumberU64())) + bc.chainmu.Unlock() log.Info("Committed new head block", "number", block.Number(), "hash", hash) return nil @@ -355,31 +483,13 @@ func (bc *BlockChain) CurrentFastBlock() *types.Block { return bc.currentFastBlock.Load().(*types.Block) } -// SetProcessor sets the processor required for making state modifications. -func (bc *BlockChain) SetProcessor(processor Processor) { - bc.procmu.Lock() - defer bc.procmu.Unlock() - bc.processor = processor -} - -// SetValidator sets the validator which is used to validate incoming blocks. -func (bc *BlockChain) SetValidator(validator Validator) { - bc.procmu.Lock() - defer bc.procmu.Unlock() - bc.validator = validator -} - // Validator returns the current validator. func (bc *BlockChain) Validator() Validator { - bc.procmu.RLock() - defer bc.procmu.RUnlock() return bc.validator } // Processor returns the current processor. func (bc *BlockChain) Processor() Processor { - bc.procmu.RLock() - defer bc.procmu.RUnlock() return bc.processor } @@ -393,6 +503,11 @@ func (bc *BlockChain) StateAt(root common.Hash) (*state.StateDB, error) { return state.New(root, bc.stateCache) } +// StateCache returns the caching database underpinning the blockchain instance. +func (bc *BlockChain) StateCache() state.Database { + return bc.stateCache +} + // Reset purges the entire blockchain, restoring it to its genesis state. func (bc *BlockChain) Reset() error { return bc.ResetWithGenesisBlock(bc.genesisBlock) @@ -405,8 +520,8 @@ func (bc *BlockChain) ResetWithGenesisBlock(genesis *types.Block) error { if err := bc.SetHead(0); err != nil { return err } - bc.mu.Lock() - defer bc.mu.Unlock() + bc.chainmu.Lock() + defer bc.chainmu.Unlock() // Prepare the genesis block and reinitialise the chain if err := bc.hc.WriteTd(genesis.Hash(), genesis.NumberU64(), genesis.Difficulty()); err != nil { @@ -417,9 +532,12 @@ func (bc *BlockChain) ResetWithGenesisBlock(genesis *types.Block) error { bc.genesisBlock = genesis bc.insert(bc.genesisBlock) bc.currentBlock.Store(bc.genesisBlock) + headBlockGauge.Update(int64(bc.genesisBlock.NumberU64())) + bc.hc.SetGenesis(bc.genesisBlock.Header()) bc.hc.SetCurrentHeader(bc.genesisBlock.Header()) bc.currentFastBlock.Store(bc.genesisBlock) + headFastBlockGauge.Update(int64(bc.genesisBlock.NumberU64())) return nil } @@ -438,7 +556,11 @@ func (bc *BlockChain) repair(head **types.Block) error { return nil } // Otherwise rewind one block and recheck state availability there - (*head) = bc.GetBlock((*head).ParentHash(), (*head).NumberU64()-1) + block := bc.GetBlock((*head).ParentHash(), (*head).NumberU64()-1) + if block == nil { + return fmt.Errorf("missing block %d [%x]", (*head).NumberU64()-1, (*head).ParentHash()) + } + *head = block } } @@ -449,8 +571,8 @@ func (bc *BlockChain) Export(w io.Writer) error { // ExportN writes a subset of the active chain to the given writer. func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error { - bc.mu.RLock() - defer bc.mu.RUnlock() + bc.chainmu.RLock() + defer bc.chainmu.RUnlock() if first > last { return fmt.Errorf("export failed: first (%d) is greater than last (%d)", first, last) @@ -471,7 +593,6 @@ func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error { reported = time.Now() } } - return nil } @@ -490,6 +611,7 @@ func (bc *BlockChain) insert(block *types.Block) { rawdb.WriteHeadBlockHash(bc.db, block.Hash()) bc.currentBlock.Store(block) + headBlockGauge.Update(int64(block.NumberU64())) // If the block is better than our head or is on a different chain, force update heads if updateHeads { @@ -497,6 +619,7 @@ func (bc *BlockChain) insert(block *types.Block) { rawdb.WriteHeadFastBlockHash(bc.db, block.Hash()) bc.currentFastBlock.Store(block) + headFastBlockGauge.Update(int64(block.NumberU64())) } } @@ -554,6 +677,17 @@ func (bc *BlockChain) HasBlock(hash common.Hash, number uint64) bool { return rawdb.HasBody(bc.db, hash, number) } +// HasFastBlock checks if a fast block is fully present in the database or not. +func (bc *BlockChain) HasFastBlock(hash common.Hash, number uint64) bool { + if !bc.HasBlock(hash, number) { + return false + } + if bc.receiptsCache.Contains(hash) { + return true + } + return rawdb.HasReceipts(bc.db, hash, number) +} + // HasState checks if state trie is fully present in the database or not. func (bc *BlockChain) HasState(hash common.Hash) bool { _, err := bc.stateCache.OpenTrie(hash) @@ -611,13 +745,14 @@ func (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts { if receipts, ok := bc.receiptsCache.Get(hash); ok { return receipts.(types.Receipts) } - number := rawdb.ReadHeaderNumber(bc.db, hash) if number == nil { return nil } - - receipts := rawdb.ReadReceipts(bc.db, hash, *number) + receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig) + if receipts == nil { + return nil + } bc.receiptsCache.Add(hash, receipts) return receipts } @@ -676,10 +811,10 @@ func (bc *BlockChain) Stop() { // - HEAD: So we don't need to reprocess any blocks in the general case // - HEAD-1: So we don't do large reorgs if our HEAD becomes an uncle // - HEAD-127: So we have a hard limit on the number of blocks reexecuted - if !bc.cacheConfig.Disabled { + if !bc.cacheConfig.TrieDirtyDisabled { triedb := bc.stateCache.TrieDB() - for _, offset := range []uint64{0, 1, triesInMemory - 1} { + for _, offset := range []uint64{0, 1, TriesInMemory - 1} { if number := bc.CurrentBlock().NumberU64(); number > offset { recent := bc.GetBlockByNumber(number - offset) @@ -728,8 +863,8 @@ const ( // Rollback is designed to remove a chain of links from the database that aren't // certain enough to be valid. func (bc *BlockChain) Rollback(chain []common.Hash) { - bc.mu.Lock() - defer bc.mu.Unlock() + bc.chainmu.Lock() + defer bc.chainmu.Unlock() for i := len(chain) - 1; i >= 0; i-- { hash := chain[i] @@ -740,134 +875,328 @@ func (bc *BlockChain) Rollback(chain []common.Hash) { } if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock.Hash() == hash { newFastBlock := bc.GetBlock(currentFastBlock.ParentHash(), currentFastBlock.NumberU64()-1) - bc.currentFastBlock.Store(newFastBlock) rawdb.WriteHeadFastBlockHash(bc.db, newFastBlock.Hash()) + bc.currentFastBlock.Store(newFastBlock) + headFastBlockGauge.Update(int64(newFastBlock.NumberU64())) } if currentBlock := bc.CurrentBlock(); currentBlock.Hash() == hash { newBlock := bc.GetBlock(currentBlock.ParentHash(), currentBlock.NumberU64()-1) - bc.currentBlock.Store(newBlock) rawdb.WriteHeadBlockHash(bc.db, newBlock.Hash()) + bc.currentBlock.Store(newBlock) + headBlockGauge.Update(int64(newBlock.NumberU64())) } } + // Truncate ancient data which exceeds the current header. + // + // Notably, it can happen that system crashes without truncating the ancient data + // but the head indicator has been updated in the active store. Regarding this issue, + // system will self recovery by truncating the extra data during the setup phase. + if err := bc.truncateAncient(bc.hc.CurrentHeader().Number.Uint64()); err != nil { + log.Crit("Truncate ancient store failed", "err", err) + } } -// SetReceiptsData computes all the non-consensus fields of the receipts -func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts types.Receipts) error { - signer := types.MakeSigner(config, block.Number()) - - transactions, logIndex := block.Transactions(), uint(0) - if len(transactions) != len(receipts) { - return errors.New("transaction and receipt count mismatch") +// truncateAncient rewinds the blockchain to the specified header and deletes all +// data in the ancient store that exceeds the specified header. +func (bc *BlockChain) truncateAncient(head uint64) error { + frozen, err := bc.db.Ancients() + if err != nil { + return err } + // Short circuit if there is no data to truncate in ancient store. + if frozen <= head+1 { + return nil + } + // Truncate all the data in the freezer beyond the specified head + if err := bc.db.TruncateAncients(head + 1); err != nil { + return err + } + // Clear out any stale content from the caches + bc.hc.headerCache.Purge() + bc.hc.tdCache.Purge() + bc.hc.numberCache.Purge() - for j := 0; j < len(receipts); j++ { - // The transaction hash can be retrieved from the transaction itself - receipts[j].TxHash = transactions[j].Hash() + // Clear out any stale content from the caches + bc.bodyCache.Purge() + bc.bodyRLPCache.Purge() + bc.receiptsCache.Purge() + bc.blockCache.Purge() + bc.futureBlocks.Purge() - // The contract address can be derived from the transaction itself - if transactions[j].To() == nil { - // Deriving the signer is expensive, only do if it's actually needed - from, _ := types.Sender(signer, transactions[j]) - receipts[j].ContractAddress = crypto.CreateAddress(from, transactions[j].Nonce()) - } - // The used gas can be calculated based on previous receipts - if j == 0 { - receipts[j].GasUsed = receipts[j].CumulativeGasUsed - } else { - receipts[j].GasUsed = receipts[j].CumulativeGasUsed - receipts[j-1].CumulativeGasUsed - } - // The derived log fields can simply be set from the block and transaction - for k := 0; k < len(receipts[j].Logs); k++ { - receipts[j].Logs[k].BlockNumber = block.NumberU64() - receipts[j].Logs[k].BlockHash = block.Hash() - receipts[j].Logs[k].TxHash = receipts[j].TxHash - receipts[j].Logs[k].TxIndex = uint(j) - receipts[j].Logs[k].Index = logIndex - logIndex++ - } - } + log.Info("Rewind ancient data", "number", head) return nil } +// numberHash is just a container for a number and a hash, to represent a block +type numberHash struct { + number uint64 + hash common.Hash +} + // InsertReceiptChain attempts to complete an already existing header chain with // transaction and receipt data. -func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) { +func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts, ancientLimit uint64) (int, error) { + // We don't require the chainMu here since we want to maximize the + // concurrency of header insertion and receipt insertion. bc.wg.Add(1) defer bc.wg.Done() + var ( + ancientBlocks, liveBlocks types.Blocks + ancientReceipts, liveReceipts []types.Receipts + ) // Do a sanity check that the provided chain is actually ordered and linked - for i := 1; i < len(blockChain); i++ { - if blockChain[i].NumberU64() != blockChain[i-1].NumberU64()+1 || blockChain[i].ParentHash() != blockChain[i-1].Hash() { - log.Error("Non contiguous receipt insert", "number", blockChain[i].Number(), "hash", blockChain[i].Hash(), "parent", blockChain[i].ParentHash(), - "prevnumber", blockChain[i-1].Number(), "prevhash", blockChain[i-1].Hash()) - return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, blockChain[i-1].NumberU64(), - blockChain[i-1].Hash().Bytes()[:4], i, blockChain[i].NumberU64(), blockChain[i].Hash().Bytes()[:4], blockChain[i].ParentHash().Bytes()[:4]) + for i := 0; i < len(blockChain); i++ { + if i != 0 { + if blockChain[i].NumberU64() != blockChain[i-1].NumberU64()+1 || blockChain[i].ParentHash() != blockChain[i-1].Hash() { + log.Error("Non contiguous receipt insert", "number", blockChain[i].Number(), "hash", blockChain[i].Hash(), "parent", blockChain[i].ParentHash(), + "prevnumber", blockChain[i-1].Number(), "prevhash", blockChain[i-1].Hash()) + return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, blockChain[i-1].NumberU64(), + blockChain[i-1].Hash().Bytes()[:4], i, blockChain[i].NumberU64(), blockChain[i].Hash().Bytes()[:4], blockChain[i].ParentHash().Bytes()[:4]) + } + } + if blockChain[i].NumberU64() <= ancientLimit { + ancientBlocks, ancientReceipts = append(ancientBlocks, blockChain[i]), append(ancientReceipts, receiptChain[i]) + } else { + liveBlocks, liveReceipts = append(liveBlocks, blockChain[i]), append(liveReceipts, receiptChain[i]) } } var ( stats = struct{ processed, ignored int32 }{} start = time.Now() - bytes = 0 - batch = bc.db.NewBatch() + size = 0 ) - for i, block := range blockChain { - receipts := receiptChain[i] - // Short circuit insertion if shutting down or processing failed - if atomic.LoadInt32(&bc.procInterrupt) == 1 { - return 0, nil + // updateHead updates the head fast sync block if the inserted blocks are better + // and returns a indicator whether the inserted blocks are canonical. + updateHead := func(head *types.Block) bool { + bc.chainmu.Lock() + + // Rewind may have occurred, skip in that case. + if bc.CurrentHeader().Number.Cmp(head.Number()) >= 0 { + currentFastBlock, td := bc.CurrentFastBlock(), bc.GetTd(head.Hash(), head.NumberU64()) + if bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()).Cmp(td) < 0 { + rawdb.WriteHeadFastBlockHash(bc.db, head.Hash()) + bc.currentFastBlock.Store(head) + headFastBlockGauge.Update(int64(head.NumberU64())) + bc.chainmu.Unlock() + return true + } } - // Short circuit if the owner header is unknown - if !bc.HasHeader(block.Hash(), block.NumberU64()) { - return i, fmt.Errorf("containing header #%d [%x…] unknown", block.Number(), block.Hash().Bytes()[:4]) + bc.chainmu.Unlock() + return false + } + // writeAncient writes blockchain and corresponding receipt chain into ancient store. + // + // this function only accepts canonical chain data. All side chain will be reverted + // eventually. + writeAncient := func(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) { + var ( + previous = bc.CurrentFastBlock() + batch = bc.db.NewBatch() + ) + // If any error occurs before updating the head or we are inserting a side chain, + // all the data written this time wll be rolled back. + defer func() { + if previous != nil { + if err := bc.truncateAncient(previous.NumberU64()); err != nil { + log.Crit("Truncate ancient store failed", "err", err) + } + } + }() + var deleted []*numberHash + for i, block := range blockChain { + // Short circuit insertion if shutting down or processing failed + if atomic.LoadInt32(&bc.procInterrupt) == 1 { + return 0, errInsertionInterrupted + } + // Short circuit insertion if it is required(used in testing only) + if bc.terminateInsert != nil && bc.terminateInsert(block.Hash(), block.NumberU64()) { + return i, errors.New("insertion is terminated for testing purpose") + } + // Short circuit if the owner header is unknown + if !bc.HasHeader(block.Hash(), block.NumberU64()) { + return i, fmt.Errorf("containing header #%d [%x…] unknown", block.Number(), block.Hash().Bytes()[:4]) + } + var ( + start = time.Now() + logged = time.Now() + count int + ) + // Migrate all ancient blocks. This can happen if someone upgrades from Geth + // 1.8.x to 1.9.x mid-fast-sync. Perhaps we can get rid of this path in the + // long term. + for { + // We can ignore the error here since light client won't hit this code path. + frozen, _ := bc.db.Ancients() + if frozen >= block.NumberU64() { + break + } + h := rawdb.ReadCanonicalHash(bc.db, frozen) + b := rawdb.ReadBlock(bc.db, h, frozen) + size += rawdb.WriteAncientBlock(bc.db, b, rawdb.ReadReceipts(bc.db, h, frozen, bc.chainConfig), rawdb.ReadTd(bc.db, h, frozen)) + count += 1 + + // Always keep genesis block in active database. + if b.NumberU64() != 0 { + deleted = append(deleted, &numberHash{b.NumberU64(), b.Hash()}) + } + if time.Since(logged) > 8*time.Second { + log.Info("Migrating ancient blocks", "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + // Don't collect too much in-memory, write it out every 100K blocks + if len(deleted) > 100000 { + + // Sync the ancient store explicitly to ensure all data has been flushed to disk. + if err := bc.db.Sync(); err != nil { + return 0, err + } + // Wipe out canonical block data. + for _, nh := range deleted { + rawdb.DeleteBlockWithoutNumber(batch, nh.hash, nh.number) + rawdb.DeleteCanonicalHash(batch, nh.number) + } + if err := batch.Write(); err != nil { + return 0, err + } + batch.Reset() + // Wipe out side chain too. + for _, nh := range deleted { + for _, hash := range rawdb.ReadAllHashes(bc.db, nh.number) { + rawdb.DeleteBlock(batch, hash, nh.number) + } + } + if err := batch.Write(); err != nil { + return 0, err + } + batch.Reset() + deleted = deleted[0:] + } + } + if count > 0 { + log.Info("Migrated ancient blocks", "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + } + // Flush data into ancient database. + size += rawdb.WriteAncientBlock(bc.db, block, receiptChain[i], bc.GetTd(block.Hash(), block.NumberU64())) + rawdb.WriteTxLookupEntries(batch, block) + + stats.processed++ } - // Skip if the entire data is already known - if bc.HasBlock(block.Hash(), block.NumberU64()) { - stats.ignored++ - continue + // Flush all tx-lookup index data. + size += batch.ValueSize() + if err := batch.Write(); err != nil { + return 0, err } - // Compute all the non-consensus fields of the receipts - if err := SetReceiptsData(bc.chainConfig, block, receipts); err != nil { - return i, fmt.Errorf("failed to set receipts data: %v", err) + batch.Reset() + + // Sync the ancient store explicitly to ensure all data has been flushed to disk. + if err := bc.db.Sync(); err != nil { + return 0, err } - // Write all the data out into the database - rawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()) - rawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), receipts) - rawdb.WriteTxLookupEntries(batch, block) + if !updateHead(blockChain[len(blockChain)-1]) { + return 0, errors.New("side blocks can't be accepted as the ancient chain data") + } + previous = nil // disable rollback explicitly - stats.processed++ + // Wipe out canonical block data. + for _, nh := range deleted { + rawdb.DeleteBlockWithoutNumber(batch, nh.hash, nh.number) + rawdb.DeleteCanonicalHash(batch, nh.number) + } + for _, block := range blockChain { + // Always keep genesis block in active database. + if block.NumberU64() != 0 { + rawdb.DeleteBlockWithoutNumber(batch, block.Hash(), block.NumberU64()) + rawdb.DeleteCanonicalHash(batch, block.NumberU64()) + } + } + if err := batch.Write(); err != nil { + return 0, err + } + batch.Reset() - if batch.ValueSize() >= ethdb.IdealBatchSize { - if err := batch.Write(); err != nil { - return 0, err + // Wipe out side chain too. + for _, nh := range deleted { + for _, hash := range rawdb.ReadAllHashes(bc.db, nh.number) { + rawdb.DeleteBlock(batch, hash, nh.number) + } + } + for _, block := range blockChain { + // Always keep genesis block in active database. + if block.NumberU64() != 0 { + for _, hash := range rawdb.ReadAllHashes(bc.db, block.NumberU64()) { + rawdb.DeleteBlock(batch, hash, block.NumberU64()) + } } - bytes += batch.ValueSize() - batch.Reset() } - } - if batch.ValueSize() > 0 { - bytes += batch.ValueSize() if err := batch.Write(); err != nil { return 0, err } + return 0, nil + } + // writeLive writes blockchain and corresponding receipt chain into active store. + writeLive := func(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) { + batch := bc.db.NewBatch() + for i, block := range blockChain { + // Short circuit insertion if shutting down or processing failed + if atomic.LoadInt32(&bc.procInterrupt) == 1 { + return 0, errInsertionInterrupted + } + // Short circuit if the owner header is unknown + if !bc.HasHeader(block.Hash(), block.NumberU64()) { + return i, fmt.Errorf("containing header #%d [%x…] unknown", block.Number(), block.Hash().Bytes()[:4]) + } + if bc.HasBlock(block.Hash(), block.NumberU64()) { + stats.ignored++ + continue + } + // Write all the data out into the database + rawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()) + rawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), receiptChain[i]) + rawdb.WriteTxLookupEntries(batch, block) + + stats.processed++ + if batch.ValueSize() >= ethdb.IdealBatchSize { + if err := batch.Write(); err != nil { + return 0, err + } + size += batch.ValueSize() + batch.Reset() + } + } + if batch.ValueSize() > 0 { + size += batch.ValueSize() + if err := batch.Write(); err != nil { + return 0, err + } + } + updateHead(blockChain[len(blockChain)-1]) + return 0, nil + } + // Write downloaded chain data and corresponding receipt chain data. + if len(ancientBlocks) > 0 { + if n, err := writeAncient(ancientBlocks, ancientReceipts); err != nil { + if err == errInsertionInterrupted { + return 0, nil + } + return n, err + } } - - // Update the head fast sync block if better - bc.mu.Lock() - head := blockChain[len(blockChain)-1] - if td := bc.GetTd(head.Hash(), head.NumberU64()); td != nil { // Rewind may have occurred, skip in that case - currentFastBlock := bc.CurrentFastBlock() - if bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()).Cmp(td) < 0 { - rawdb.WriteHeadFastBlockHash(bc.db, head.Hash()) - bc.currentFastBlock.Store(head) + if len(liveBlocks) > 0 { + if n, err := writeLive(liveBlocks, liveReceipts); err != nil { + if err == errInsertionInterrupted { + return 0, nil + } + return n, err } } - bc.mu.Unlock() + head := blockChain[len(blockChain)-1] context := []interface{}{ "count", stats.processed, "elapsed", common.PrettyDuration(time.Since(start)), - "number", head.Number(), "hash", head.Hash(), "age", common.PrettyAge(time.Unix(head.Time().Int64(), 0)), - "size", common.StorageSize(bytes), + "number", head.Number(), "hash", head.Hash(), "age", common.PrettyAge(time.Unix(int64(head.Time()), 0)), + "size", common.StorageSize(size), } if stats.ignored > 0 { context = append(context, []interface{}{"ignored", stats.ignored}...) @@ -879,10 +1208,10 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ var lastWrite uint64 -// WriteBlockWithoutState writes only the block and its metadata to the database, +// writeBlockWithoutState writes only the block and its metadata to the database, // but does not write any state. This is used to construct competing side forks // up to the point where they exceed the canonical total difficulty. -func (bc *BlockChain) WriteBlockWithoutState(block *types.Block, td *big.Int) (err error) { +func (bc *BlockChain) writeBlockWithoutState(block *types.Block, td *big.Int) (err error) { bc.wg.Add(1) defer bc.wg.Done() @@ -894,8 +1223,37 @@ func (bc *BlockChain) WriteBlockWithoutState(block *types.Block, td *big.Int) (e return nil } +// writeKnownBlock updates the head block flag with a known block +// and introduces chain reorg if necessary. +func (bc *BlockChain) writeKnownBlock(block *types.Block) error { + bc.wg.Add(1) + defer bc.wg.Done() + + current := bc.CurrentBlock() + if block.ParentHash() != current.Hash() { + if err := bc.reorg(current, block); err != nil { + return err + } + } + // Write the positional metadata for transaction/receipt lookups. + // Preimages here is empty, ignore it. + rawdb.WriteTxLookupEntries(bc.db, block) + + bc.insert(block) + return nil +} + // WriteBlockWithState writes the block and all associated state to the database. func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) { + bc.chainmu.Lock() + defer bc.chainmu.Unlock() + + return bc.writeBlockWithState(block, receipts, state) +} + +// writeBlockWithState writes the block and all associated state to the database, +// but is expects the chain mutex to be held. +func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) { bc.wg.Add(1) defer bc.wg.Done() @@ -905,9 +1263,6 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. return NonStatTy, consensus.ErrUnknownAncestor } // Make sure no inconsistent state is leaked during insertion - bc.mu.Lock() - defer bc.mu.Unlock() - currentBlock := bc.CurrentBlock() localTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) externTd := new(big.Int).Add(block.Difficulty(), ptd) @@ -925,7 +1280,7 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. triedb := bc.stateCache.TrieDB() // If we're running an archive node, always flush - if bc.cacheConfig.Disabled { + if bc.cacheConfig.TrieDirtyDisabled { if err := triedb.Commit(root, false); err != nil { return NonStatTy, err } @@ -934,30 +1289,36 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. triedb.Reference(root, common.Hash{}) // metadata reference to keep trie alive bc.triegc.Push(root, -int64(block.NumberU64())) - if current := block.NumberU64(); current > triesInMemory { + if current := block.NumberU64(); current > TriesInMemory { // If we exceeded our memory allowance, flush matured singleton nodes to disk var ( nodes, imgs = triedb.Size() - limit = common.StorageSize(bc.cacheConfig.TrieNodeLimit) * 1024 * 1024 + limit = common.StorageSize(bc.cacheConfig.TrieDirtyLimit) * 1024 * 1024 ) if nodes > limit || imgs > 4*1024*1024 { triedb.Cap(limit - ethdb.IdealBatchSize) } // Find the next state trie we need to commit - header := bc.GetHeaderByNumber(current - triesInMemory) - chosen := header.Number.Uint64() + chosen := current - TriesInMemory // If we exceeded out time allowance, flush an entire trie to disk if bc.gcproc > bc.cacheConfig.TrieTimeLimit { - // If we're exceeding limits but haven't reached a large enough memory gap, - // warn the user that the system is becoming unstable. - if chosen < lastWrite+triesInMemory && bc.gcproc >= 2*bc.cacheConfig.TrieTimeLimit { - log.Info("State in memory for too long, committing", "time", bc.gcproc, "allowance", bc.cacheConfig.TrieTimeLimit, "optimum", float64(chosen-lastWrite)/triesInMemory) + // If the header is missing (canonical chain behind), we're reorging a low + // diff sidechain. Suspend committing until this operation is completed. + header := bc.GetHeaderByNumber(chosen) + if header == nil { + log.Warn("Reorg in progress, trie commit postponed", "number", chosen) + } else { + // If we're exceeding limits but haven't reached a large enough memory gap, + // warn the user that the system is becoming unstable. + if chosen < lastWrite+TriesInMemory && bc.gcproc >= 2*bc.cacheConfig.TrieTimeLimit { + log.Info("State in memory for too long, committing", "time", bc.gcproc, "allowance", bc.cacheConfig.TrieTimeLimit, "optimum", float64(chosen-lastWrite)/TriesInMemory) + } + // Flush an entire trie and restart the counters + triedb.Commit(header.Root, true) + lastWrite = chosen + bc.gcproc = 0 } - // Flush an entire trie and restart the counters - triedb.Commit(header.Root, true) - lastWrite = chosen - bc.gcproc = 0 } // Garbage collect anything below our required write retention for !bc.triegc.Empty() { @@ -1002,7 +1363,7 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. } // Write the positional metadata for transaction/receipt lookups and preimages rawdb.WriteTxLookupEntries(batch, block) - rawdb.WritePreimages(batch, block.NumberU64(), state.Preimages()) + rawdb.WritePreimages(batch, state.Preimages()) status = CanonStatTy } else { @@ -1020,6 +1381,18 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. return status, nil } +// addFutureBlock checks if the block is within the max allowed window to get +// accepted for future processing, and returns an error if the block is too far +// ahead and was not added. +func (bc *BlockChain) addFutureBlock(block *types.Block) error { + max := uint64(time.Now().Unix() + maxTimeFutureBlocks) + if block.Time() > max { + return fmt.Errorf("future block timestamp %v > allowed %v", block.Time(), max) + } + bc.futureBlocks.Add(block.Hash(), block) + return nil +} + // InsertChain attempts to insert the given batch of blocks in to the canonical // chain or, otherwise, create a fork. If an error is returned it will return // the index number of the failing block as well an error describing what went @@ -1027,36 +1400,57 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. // // After insertion is done, all accumulated events will be fired. func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { - n, events, logs, err := bc.insertChain(chain) - bc.PostChainEvents(events, logs) - return n, err -} - -// insertChain will execute the actual chain insertion and event aggregation. The -// only reason this method exists as a separate one is to make locking cleaner -// with deferred statements. -func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*types.Log, error) { // Sanity check that we have something meaningful to import if len(chain) == 0 { - return 0, nil, nil, nil + return 0, nil } + + bc.blockProcFeed.Send(true) + defer bc.blockProcFeed.Send(false) + + // Remove already known canon-blocks + var ( + block, prev *types.Block + ) // Do a sanity check that the provided chain is actually ordered and linked for i := 1; i < len(chain); i++ { - if chain[i].NumberU64() != chain[i-1].NumberU64()+1 || chain[i].ParentHash() != chain[i-1].Hash() { + block = chain[i] + prev = chain[i-1] + if block.NumberU64() != prev.NumberU64()+1 || block.ParentHash() != prev.Hash() { // Chain broke ancestry, log a message (programming error) and skip insertion - log.Error("Non contiguous block insert", "number", chain[i].Number(), "hash", chain[i].Hash(), - "parent", chain[i].ParentHash(), "prevnumber", chain[i-1].Number(), "prevhash", chain[i-1].Hash()) + log.Error("Non contiguous block insert", "number", block.Number(), "hash", block.Hash(), + "parent", block.ParentHash(), "prevnumber", prev.Number(), "prevhash", prev.Hash()) - return 0, nil, nil, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, chain[i-1].NumberU64(), - chain[i-1].Hash().Bytes()[:4], i, chain[i].NumberU64(), chain[i].Hash().Bytes()[:4], chain[i].ParentHash().Bytes()[:4]) + return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, prev.NumberU64(), + prev.Hash().Bytes()[:4], i, block.NumberU64(), block.Hash().Bytes()[:4], block.ParentHash().Bytes()[:4]) } } // Pre-checks passed, start the full block imports bc.wg.Add(1) - defer bc.wg.Done() - bc.chainmu.Lock() - defer bc.chainmu.Unlock() + n, events, logs, err := bc.insertChain(chain, true) + bc.chainmu.Unlock() + bc.wg.Done() + + bc.PostChainEvents(events, logs) + return n, err +} + +// insertChain is the internal implementation of InsertChain, which assumes that +// 1) chains are contiguous, and 2) The chain mutex is held. +// +// This method is split out so that import batches that require re-injecting +// historical blocks can do so without releasing the lock, which could lead to +// racey behaviour. If a sidechain import is in progress, and the historic state +// is imported, but then new canon-head is added before the actual sidechain +// completes, then the historic state could be pruned again +func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, []interface{}, []*types.Log, error) { + // If the chain is terminating, don't even bother starting up + if atomic.LoadInt32(&bc.procInterrupt) == 1 { + return 0, nil, nil, nil + } + // Start a parallel signature recovery (signer will fluke on fork transition, minimal perf loss) + senderCacher.recoverFromBlocks(types.MakeSigner(bc.chainConfig, chain[0].Number()), chain) // A queued approach to delivering events. This is generally // faster than direct delivery and requires much less mutex @@ -1073,16 +1467,86 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty for i, block := range chain { headers[i] = block.Header() - seals[i] = true + seals[i] = verifySeals } abort, results := bc.engine.VerifyHeaders(bc, headers, seals) defer close(abort) - // Start a parallel signature recovery (signer will fluke on fork transition, minimal perf loss) - senderCacher.recoverFromBlocks(types.MakeSigner(bc.chainConfig, chain[0].Number()), chain) + // Peek the error for the first block to decide the directing import logic + it := newInsertIterator(chain, results, bc.validator) - // Iterate over the blocks and insert when the verifier permits - for i, block := range chain { + block, err := it.next() + + // Left-trim all the known blocks + if err == ErrKnownBlock { + // First block (and state) is known + // 1. We did a roll-back, and should now do a re-import + // 2. The block is stored as a sidechain, and is lying about it's stateroot, and passes a stateroot + // from the canonical chain, which has not been verified. + // Skip all known blocks that are behind us + var ( + current = bc.CurrentBlock() + localTd = bc.GetTd(current.Hash(), current.NumberU64()) + externTd = bc.GetTd(block.ParentHash(), block.NumberU64()-1) // The first block can't be nil + ) + for block != nil && err == ErrKnownBlock { + externTd = new(big.Int).Add(externTd, block.Difficulty()) + if localTd.Cmp(externTd) < 0 { + break + } + log.Debug("Ignoring already known block", "number", block.Number(), "hash", block.Hash()) + stats.ignored++ + + block, err = it.next() + } + // The remaining blocks are still known blocks, the only scenario here is: + // During the fast sync, the pivot point is already submitted but rollback + // happens. Then node resets the head full block to a lower height via `rollback` + // and leaves a few known blocks in the database. + // + // When node runs a fast sync again, it can re-import a batch of known blocks via + // `insertChain` while a part of them have higher total difficulty than current + // head full block(new pivot point). + for block != nil && err == ErrKnownBlock { + log.Debug("Writing previously known block", "number", block.Number(), "hash", block.Hash()) + if err := bc.writeKnownBlock(block); err != nil { + return it.index, nil, nil, err + } + lastCanon = block + + block, err = it.next() + } + // Falls through to the block import + } + switch { + // First block is pruned, insert as sidechain and reorg only if TD grows enough + case err == consensus.ErrPrunedAncestor: + log.Debug("Pruned ancestor, inserting as sidechain", "number", block.Number(), "hash", block.Hash()) + return bc.insertSideChain(block, it) + + // First block is future, shove it (and all children) to the future queue (unknown ancestor) + case err == consensus.ErrFutureBlock || (err == consensus.ErrUnknownAncestor && bc.futureBlocks.Contains(it.first().ParentHash())): + for block != nil && (it.index == 0 || err == consensus.ErrUnknownAncestor) { + log.Debug("Future block, postponing import", "number", block.Number(), "hash", block.Hash()) + if err := bc.addFutureBlock(block); err != nil { + return it.index, events, coalescedLogs, err + } + block, err = it.next() + } + stats.queued += it.processed() + stats.ignored += it.remaining() + + // If there are any still remaining, mark as ignored + return it.index, events, coalescedLogs, err + + // Some other error occurred, abort + case err != nil: + stats.ignored += len(it.chain) + bc.reportBlock(block, nil, err) + return it.index, events, coalescedLogs, err + } + // No validation errors for the first block (or chain prefix skipped) + for ; block != nil && err == nil || err == ErrKnownBlock; block, err = it.next() { // If the chain is terminating, stop processing blocks if atomic.LoadInt32(&bc.procInterrupt) == 1 { log.Debug("Premature abort during blocks processing") @@ -1091,115 +1555,121 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty // If the header is a banned one, straight out abort if BadHashes[block.Hash()] { bc.reportBlock(block, nil, ErrBlacklistedHash) - return i, events, coalescedLogs, ErrBlacklistedHash + return it.index, events, coalescedLogs, ErrBlacklistedHash } - // Wait for the block's verification to complete - bstart := time.Now() - - err := <-results - if err == nil { - err = bc.Validator().ValidateBody(block) - } - switch { - case err == ErrKnownBlock: - // Block and state both already known. However if the current block is below - // this number we did a rollback and we should reimport it nonetheless. - if bc.CurrentBlock().NumberU64() >= block.NumberU64() { - stats.ignored++ - continue - } - - case err == consensus.ErrFutureBlock: - // Allow up to MaxFuture second in the future blocks. If this limit is exceeded - // the chain is discarded and processed at a later time if given. - max := big.NewInt(time.Now().Unix() + maxTimeFutureBlocks) - if block.Time().Cmp(max) > 0 { - return i, events, coalescedLogs, fmt.Errorf("future block: %v > %v", block.Time(), max) + // If the block is known (in the middle of the chain), it's a special case for + // Clique blocks where they can share state among each other, so importing an + // older block might complete the state of the subsequent one. In this case, + // just skip the block (we already validated it once fully (and crashed), since + // its header and body was already in the database). + if err == ErrKnownBlock { + logger := log.Debug + if bc.chainConfig.Clique == nil { + logger = log.Warn } - bc.futureBlocks.Add(block.Hash(), block) - stats.queued++ - continue - - case err == consensus.ErrUnknownAncestor && bc.futureBlocks.Contains(block.ParentHash()): - bc.futureBlocks.Add(block.Hash(), block) - stats.queued++ - continue + logger("Inserted known block", "number", block.Number(), "hash", block.Hash(), + "uncles", len(block.Uncles()), "txs", len(block.Transactions()), "gas", block.GasUsed(), + "root", block.Root()) - case err == consensus.ErrPrunedAncestor: - // Block competing with the canonical chain, store in the db, but don't process - // until the competitor TD goes above the canonical TD - currentBlock := bc.CurrentBlock() - localTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) - externTd := new(big.Int).Add(bc.GetTd(block.ParentHash(), block.NumberU64()-1), block.Difficulty()) - if localTd.Cmp(externTd) > 0 { - if err = bc.WriteBlockWithoutState(block, externTd); err != nil { - return i, events, coalescedLogs, err - } - continue + if err := bc.writeKnownBlock(block); err != nil { + return it.index, nil, nil, err } - // Competitor chain beat canonical, gather all blocks from the common ancestor - var winner []*types.Block + stats.processed++ - parent := bc.GetBlock(block.ParentHash(), block.NumberU64()-1) - for !bc.HasState(parent.Root()) { - winner = append(winner, parent) - parent = bc.GetBlock(parent.ParentHash(), parent.NumberU64()-1) - } - for j := 0; j < len(winner)/2; j++ { - winner[j], winner[len(winner)-1-j] = winner[len(winner)-1-j], winner[j] - } - // Import all the pruned blocks to make the state available - bc.chainmu.Unlock() - _, evs, logs, err := bc.insertChain(winner) - bc.chainmu.Lock() - events, coalescedLogs = evs, logs - - if err != nil { - return i, events, coalescedLogs, err - } + // We can assume that logs are empty here, since the only way for consecutive + // Clique blocks to have the same state is if there are no transactions. + events = append(events, ChainEvent{block, block.Hash(), nil}) + lastCanon = block - case err != nil: - bc.reportBlock(block, nil, err) - return i, events, coalescedLogs, err + continue } - // Create a new statedb using the parent block and report an - // error if it fails. - var parent *types.Block - if i == 0 { - parent = bc.GetBlock(block.ParentHash(), block.NumberU64()-1) - } else { - parent = chain[i-1] + // Retrieve the parent block and it's state to execute on top + start := time.Now() + + parent := it.previous() + if parent == nil { + parent = bc.GetHeader(block.ParentHash(), block.NumberU64()-1) } - state, err := state.New(parent.Root(), bc.stateCache) + statedb, err := state.New(parent.Root, bc.stateCache) if err != nil { - return i, events, coalescedLogs, err + return it.index, events, coalescedLogs, err } - // Process block using the parent state as reference point. - receipts, logs, usedGas, err := bc.processor.Process(block, state, bc.vmConfig) + // If we have a followup block, run that against the current state to pre-cache + // transactions and probabilistically some of the account/storage trie nodes. + var followupInterrupt uint32 + + if !bc.cacheConfig.TrieCleanNoPrefetch { + if followup, err := it.peek(); followup != nil && err == nil { + go func(start time.Time) { + throwaway, _ := state.New(parent.Root, bc.stateCache) + bc.prefetcher.Prefetch(followup, throwaway, bc.vmConfig, &followupInterrupt) + + blockPrefetchExecuteTimer.Update(time.Since(start)) + if atomic.LoadUint32(&followupInterrupt) == 1 { + blockPrefetchInterruptMeter.Mark(1) + } + }(time.Now()) + } + } + // Process block using the parent state as reference point + substart := time.Now() + receipts, logs, usedGas, err := bc.processor.Process(block, statedb, bc.vmConfig) if err != nil { bc.reportBlock(block, receipts, err) - return i, events, coalescedLogs, err + atomic.StoreUint32(&followupInterrupt, 1) + return it.index, events, coalescedLogs, err } + // Update the metrics touched during block processing + accountReadTimer.Update(statedb.AccountReads) // Account reads are complete, we can mark them + storageReadTimer.Update(statedb.StorageReads) // Storage reads are complete, we can mark them + accountUpdateTimer.Update(statedb.AccountUpdates) // Account updates are complete, we can mark them + storageUpdateTimer.Update(statedb.StorageUpdates) // Storage updates are complete, we can mark them + + triehash := statedb.AccountHashes + statedb.StorageHashes // Save to not double count in validation + trieproc := statedb.AccountReads + statedb.AccountUpdates + trieproc += statedb.StorageReads + statedb.StorageUpdates + + blockExecutionTimer.Update(time.Since(substart) - trieproc - triehash) + // Validate the state using the default validator - err = bc.Validator().ValidateState(block, parent, state, receipts, usedGas) - if err != nil { + substart = time.Now() + if err := bc.validator.ValidateState(block, statedb, receipts, usedGas); err != nil { bc.reportBlock(block, receipts, err) - return i, events, coalescedLogs, err + atomic.StoreUint32(&followupInterrupt, 1) + return it.index, events, coalescedLogs, err } - proctime := time.Since(bstart) + proctime := time.Since(start) + + // Update the metrics touched during block validation + accountHashTimer.Update(statedb.AccountHashes) // Account hashes are complete, we can mark them + storageHashTimer.Update(statedb.StorageHashes) // Storage hashes are complete, we can mark them + + blockValidationTimer.Update(time.Since(substart) - (statedb.AccountHashes + statedb.StorageHashes - triehash)) // Write the block to the chain and get the status. - status, err := bc.WriteBlockWithState(block, receipts, state) + substart = time.Now() + status, err := bc.writeBlockWithState(block, receipts, statedb) if err != nil { - return i, events, coalescedLogs, err + atomic.StoreUint32(&followupInterrupt, 1) + return it.index, events, coalescedLogs, err } + atomic.StoreUint32(&followupInterrupt, 1) + + // Update the metrics touched during block commit + accountCommitTimer.Update(statedb.AccountCommits) // Account commits are complete, we can mark them + storageCommitTimer.Update(statedb.StorageCommits) // Storage commits are complete, we can mark them + + blockWriteTimer.Update(time.Since(substart) - statedb.AccountCommits - statedb.StorageCommits) + blockInsertTimer.UpdateSince(start) + switch status { case CanonStatTy: - log.Debug("Inserted new block", "number", block.Number(), "hash", block.Hash(), "uncles", len(block.Uncles()), - "txs", len(block.Transactions()), "gas", block.GasUsed(), "elapsed", common.PrettyDuration(time.Since(bstart))) + log.Debug("Inserted new block", "number", block.Number(), "hash", block.Hash(), + "uncles", len(block.Uncles()), "txs", len(block.Transactions()), "gas", block.GasUsed(), + "elapsed", common.PrettyDuration(time.Since(start)), + "root", block.Root()) coalescedLogs = append(coalescedLogs, logs...) - blockInsertTimer.UpdateSince(bstart) events = append(events, ChainEvent{block, block.Hash(), logs}) lastCanon = block @@ -1207,149 +1677,247 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty bc.gcproc += proctime case SideStatTy: - log.Debug("Inserted forked block", "number", block.Number(), "hash", block.Hash(), "diff", block.Difficulty(), "elapsed", - common.PrettyDuration(time.Since(bstart)), "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles())) - - blockInsertTimer.UpdateSince(bstart) + log.Debug("Inserted forked block", "number", block.Number(), "hash", block.Hash(), + "diff", block.Difficulty(), "elapsed", common.PrettyDuration(time.Since(start)), + "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()), + "root", block.Root()) events = append(events, ChainSideEvent{block}) + + default: + // This in theory is impossible, but lets be nice to our future selves and leave + // a log, instead of trying to track down blocks imports that don't emit logs. + log.Warn("Inserted block with unknown status", "number", block.Number(), "hash", block.Hash(), + "diff", block.Difficulty(), "elapsed", common.PrettyDuration(time.Since(start)), + "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()), + "root", block.Root()) } stats.processed++ stats.usedGas += usedGas - cache, _ := bc.stateCache.TrieDB().Size() - stats.report(chain, i, cache) + dirty, _ := bc.stateCache.TrieDB().Size() + stats.report(chain, it.index, dirty) + } + // Any blocks remaining here? The only ones we care about are the future ones + if block != nil && err == consensus.ErrFutureBlock { + if err := bc.addFutureBlock(block); err != nil { + return it.index, events, coalescedLogs, err + } + block, err = it.next() + + for ; block != nil && err == consensus.ErrUnknownAncestor; block, err = it.next() { + if err := bc.addFutureBlock(block); err != nil { + return it.index, events, coalescedLogs, err + } + stats.queued++ + } } + stats.ignored += it.remaining() + // Append a single chain head event if we've progressed the chain if lastCanon != nil && bc.CurrentBlock().Hash() == lastCanon.Hash() { events = append(events, ChainHeadEvent{lastCanon}) } - return 0, events, coalescedLogs, nil -} - -// insertStats tracks and reports on block insertion. -type insertStats struct { - queued, processed, ignored int - usedGas uint64 - lastIndex int - startTime mclock.AbsTime + return it.index, events, coalescedLogs, err } -// statsReportLimit is the time limit during import and export after which we -// always print out progress. This avoids the user wondering what's going on. -const statsReportLimit = 8 * time.Second - -// report prints statistics if some number of blocks have been processed -// or more than a few seconds have passed since the last message. -func (st *insertStats) report(chain []*types.Block, index int, cache common.StorageSize) { - // Fetch the timings for the batch +// insertSideChain is called when an import batch hits upon a pruned ancestor +// error, which happens when a sidechain with a sufficiently old fork-block is +// found. +// +// The method writes all (header-and-body-valid) blocks to disk, then tries to +// switch over to the new chain if the TD exceeded the current chain. +func (bc *BlockChain) insertSideChain(block *types.Block, it *insertIterator) (int, []interface{}, []*types.Log, error) { var ( - now = mclock.Now() - elapsed = time.Duration(now) - time.Duration(st.startTime) + externTd *big.Int + current = bc.CurrentBlock() ) - // If we're at the last block of the batch or report period reached, log - if index == len(chain)-1 || elapsed >= statsReportLimit { - var ( - end = chain[index] - txs = countTransactions(chain[st.lastIndex : index+1]) - ) - context := []interface{}{ - "blocks", st.processed, "txs", txs, "mgas", float64(st.usedGas) / 1000000, - "elapsed", common.PrettyDuration(elapsed), "mgasps", float64(st.usedGas) * 1000 / float64(elapsed), - "number", end.Number(), "hash", end.Hash(), + // The first sidechain block error is already verified to be ErrPrunedAncestor. + // Since we don't import them here, we expect ErrUnknownAncestor for the remaining + // ones. Any other errors means that the block is invalid, and should not be written + // to disk. + err := consensus.ErrPrunedAncestor + for ; block != nil && (err == consensus.ErrPrunedAncestor); block, err = it.next() { + // Check the canonical state root for that number + if number := block.NumberU64(); current.NumberU64() >= number { + canonical := bc.GetBlockByNumber(number) + if canonical != nil && canonical.Hash() == block.Hash() { + // Not a sidechain block, this is a re-import of a canon block which has it's state pruned + continue + } + if canonical != nil && canonical.Root() == block.Root() { + // This is most likely a shadow-state attack. When a fork is imported into the + // database, and it eventually reaches a block height which is not pruned, we + // just found that the state already exist! This means that the sidechain block + // refers to a state which already exists in our canon chain. + // + // If left unchecked, we would now proceed importing the blocks, without actually + // having verified the state of the previous blocks. + log.Warn("Sidechain ghost-state attack detected", "number", block.NumberU64(), "sideroot", block.Root(), "canonroot", canonical.Root()) + + // If someone legitimately side-mines blocks, they would still be imported as usual. However, + // we cannot risk writing unverified blocks to disk when they obviously target the pruning + // mechanism. + return it.index, nil, nil, errors.New("sidechain ghost-state attack") + } } - if timestamp := time.Unix(end.Time().Int64(), 0); time.Since(timestamp) > time.Minute { - context = append(context, []interface{}{"age", common.PrettyAge(timestamp)}...) + if externTd == nil { + externTd = bc.GetTd(block.ParentHash(), block.NumberU64()-1) } - context = append(context, []interface{}{"cache", cache}...) + externTd = new(big.Int).Add(externTd, block.Difficulty()) - if st.queued > 0 { - context = append(context, []interface{}{"queued", st.queued}...) - } - if st.ignored > 0 { - context = append(context, []interface{}{"ignored", st.ignored}...) + if !bc.HasBlock(block.Hash(), block.NumberU64()) { + start := time.Now() + if err := bc.writeBlockWithoutState(block, externTd); err != nil { + return it.index, nil, nil, err + } + log.Debug("Injected sidechain block", "number", block.Number(), "hash", block.Hash(), + "diff", block.Difficulty(), "elapsed", common.PrettyDuration(time.Since(start)), + "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()), + "root", block.Root()) } - log.Info("Imported new chain segment", context...) + } + // At this point, we've written all sidechain blocks to database. Loop ended + // either on some other error or all were processed. If there was some other + // error, we can ignore the rest of those blocks. + // + // If the externTd was larger than our local TD, we now need to reimport the previous + // blocks to regenerate the required state + localTd := bc.GetTd(current.Hash(), current.NumberU64()) + if localTd.Cmp(externTd) > 0 { + log.Info("Sidechain written to disk", "start", it.first().NumberU64(), "end", it.previous().Number, "sidetd", externTd, "localtd", localTd) + return it.index, nil, nil, err + } + // Gather all the sidechain hashes (full blocks may be memory heavy) + var ( + hashes []common.Hash + numbers []uint64 + ) + parent := it.previous() + for parent != nil && !bc.HasState(parent.Root) { + hashes = append(hashes, parent.Hash()) + numbers = append(numbers, parent.Number.Uint64()) - *st = insertStats{startTime: now, lastIndex: index + 1} + parent = bc.GetHeader(parent.ParentHash, parent.Number.Uint64()-1) } -} + if parent == nil { + return it.index, nil, nil, errors.New("missing parent") + } + // Import all the pruned blocks to make the state available + var ( + blocks []*types.Block + memory common.StorageSize + ) + for i := len(hashes) - 1; i >= 0; i-- { + // Append the next block to our batch + block := bc.GetBlock(hashes[i], numbers[i]) + + blocks = append(blocks, block) + memory += block.Size() + + // If memory use grew too large, import and continue. Sadly we need to discard + // all raised events and logs from notifications since we're too heavy on the + // memory here. + if len(blocks) >= 2048 || memory > 64*1024*1024 { + log.Info("Importing heavy sidechain segment", "blocks", len(blocks), "start", blocks[0].NumberU64(), "end", block.NumberU64()) + if _, _, _, err := bc.insertChain(blocks, false); err != nil { + return 0, nil, nil, err + } + blocks, memory = blocks[:0], 0 -func countTransactions(chain []*types.Block) (c int) { - for _, b := range chain { - c += len(b.Transactions()) + // If the chain is terminating, stop processing blocks + if atomic.LoadInt32(&bc.procInterrupt) == 1 { + log.Debug("Premature abort during blocks processing") + return 0, nil, nil, nil + } + } } - return c + if len(blocks) > 0 { + log.Info("Importing sidechain segment", "start", blocks[0].NumberU64(), "end", blocks[len(blocks)-1].NumberU64()) + return bc.insertChain(blocks, false) + } + return 0, nil, nil, nil } -// reorgs takes two blocks, an old chain and a new chain and will reconstruct the blocks and inserts them -// to be part of the new canonical chain and accumulates potential missing transactions and post an -// event about them +// reorg takes two blocks, an old chain and a new chain and will reconstruct the +// blocks and inserts them to be part of the new canonical chain and accumulates +// potential missing transactions and post an event about them. func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { var ( newChain types.Blocks oldChain types.Blocks commonBlock *types.Block - deletedTxs types.Transactions + + deletedTxs types.Transactions + addedTxs types.Transactions + deletedLogs []*types.Log + rebirthLogs []*types.Log + // collectLogs collects the logs that were generated during the // processing of the block that corresponds with the given hash. - // These logs are later announced as deleted. - collectLogs = func(hash common.Hash) { - // Coalesce logs and set 'Removed'. + // These logs are later announced as deleted or reborn + collectLogs = func(hash common.Hash, removed bool) { number := bc.hc.GetBlockNumber(hash) if number == nil { return } - receipts := rawdb.ReadReceipts(bc.db, hash, *number) + receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig) for _, receipt := range receipts { for _, log := range receipt.Logs { - del := *log - del.Removed = true - deletedLogs = append(deletedLogs, &del) + l := *log + if removed { + l.Removed = true + deletedLogs = append(deletedLogs, &l) + } else { + rebirthLogs = append(rebirthLogs, &l) + } } } } ) - - // first reduce whoever is higher bound + // Reduce the longer chain to the same number as the shorter one if oldBlock.NumberU64() > newBlock.NumberU64() { - // reduce old chain + // Old chain is longer, gather all transactions and logs as deleted ones for ; oldBlock != nil && oldBlock.NumberU64() != newBlock.NumberU64(); oldBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1) { oldChain = append(oldChain, oldBlock) deletedTxs = append(deletedTxs, oldBlock.Transactions()...) - - collectLogs(oldBlock.Hash()) + collectLogs(oldBlock.Hash(), true) } } else { - // reduce new chain and append new chain blocks for inserting later on + // New chain is longer, stash all blocks away for subsequent insertion for ; newBlock != nil && newBlock.NumberU64() != oldBlock.NumberU64(); newBlock = bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1) { newChain = append(newChain, newBlock) } } if oldBlock == nil { - return fmt.Errorf("Invalid old chain") + return fmt.Errorf("invalid old chain") } if newBlock == nil { - return fmt.Errorf("Invalid new chain") + return fmt.Errorf("invalid new chain") } - + // Both sides of the reorg are at the same number, reduce both until the common + // ancestor is found for { + // If the common ancestor was found, bail out if oldBlock.Hash() == newBlock.Hash() { commonBlock = oldBlock break } - + // Remove an old block as well as stash away a new block oldChain = append(oldChain, oldBlock) - newChain = append(newChain, newBlock) deletedTxs = append(deletedTxs, oldBlock.Transactions()...) - collectLogs(oldBlock.Hash()) + collectLogs(oldBlock.Hash(), true) - oldBlock, newBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1), bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1) + newChain = append(newChain, newBlock) + + // Step back with both chains + oldBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1) if oldBlock == nil { - return fmt.Errorf("Invalid old chain") + return fmt.Errorf("invalid old chain") } + newBlock = bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1) if newBlock == nil { - return fmt.Errorf("Invalid new chain") + return fmt.Errorf("invalid new chain") } } // Ensure the user sees large reorgs @@ -1363,36 +1931,55 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { } else { log.Error("Impossible reorg, please file an issue", "oldnum", oldBlock.Number(), "oldhash", oldBlock.Hash(), "newnum", newBlock.Number(), "newhash", newBlock.Hash()) } - // Insert the new chain, taking care of the proper incremental order - var addedTxs types.Transactions - for i := len(newChain) - 1; i >= 0; i-- { - // insert the block in the canonical way, re-writing history + // Insert the new chain(except the head block(reverse order)), + // taking care of the proper incremental order. + for i := len(newChain) - 1; i >= 1; i-- { + // Insert the block in the canonical way, re-writing history bc.insert(newChain[i]) - // write lookup entries for hash based transaction/receipt searches + + // Collect reborn logs due to chain reorg + collectLogs(newChain[i].Hash(), false) + + // Write lookup entries for hash based transaction/receipt searches rawdb.WriteTxLookupEntries(bc.db, newChain[i]) addedTxs = append(addedTxs, newChain[i].Transactions()...) } - // calculate the difference between deleted and added transactions - diff := types.TxDifference(deletedTxs, addedTxs) - // When transactions get deleted from the database that means the - // receipts that were created in the fork must also be deleted + // When transactions get deleted from the database, the receipts that were + // created in the fork must also be deleted batch := bc.db.NewBatch() - for _, tx := range diff { + for _, tx := range types.TxDifference(deletedTxs, addedTxs) { rawdb.DeleteTxLookupEntry(batch, tx.Hash()) } - batch.Write() - - if len(deletedLogs) > 0 { - go bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs}) + // Delete any canonical number assignments above the new head + number := bc.CurrentBlock().NumberU64() + for i := number + 1; ; i++ { + hash := rawdb.ReadCanonicalHash(bc.db, i) + if hash == (common.Hash{}) { + break + } + rawdb.DeleteCanonicalHash(batch, i) } - if len(oldChain) > 0 { - go func() { + batch.Write() + // If any logs need to be fired, do it now. In theory we could avoid creating + // this goroutine if there are no events to fire, but realistcally that only + // ever happens if we're reorging empty blocks, which will only happen on idle + // networks where performance is not an issue either way. + // + // TODO(karalabe): Can we get rid of the goroutine somehow to guarantee correct + // event ordering? + go func() { + if len(deletedLogs) > 0 { + bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs}) + } + if len(rebirthLogs) > 0 { + bc.logsFeed.Send(rebirthLogs) + } + if len(oldChain) > 0 { for _, block := range oldChain { bc.chainSideFeed.Send(ChainSideEvent{Block: block}) } - }() - } - + } + }() return nil } @@ -1453,8 +2040,10 @@ func (bc *BlockChain) reportBlock(block *types.Block, receipts types.Receipts, e bc.addBadBlock(block) var receiptString string - for _, receipt := range receipts { - receiptString += fmt.Sprintf("\t%v\n", receipt) + for i, receipt := range receipts { + receiptString += fmt.Sprintf("\t %d: cumulative: %v gas: %v contract: %v status: %v tx: %v logs: %v bloom: %x state: %x\n", + i, receipt.CumulativeGasUsed, receipt.GasUsed, receipt.ContractAddress.Hex(), + receipt.Status, receipt.TxHash.Hex(), receipt.Logs, receipt.Bloom, receipt.PostState) } log.Error(fmt.Sprintf(` ########## BAD BLOCK ######### @@ -1491,36 +2080,12 @@ func (bc *BlockChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (i defer bc.wg.Done() whFunc := func(header *types.Header) error { - bc.mu.Lock() - defer bc.mu.Unlock() - _, err := bc.hc.WriteHeader(header) return err } - return bc.hc.InsertHeaderChain(chain, whFunc, start) } -// writeHeader writes a header into the local chain, given that its parent is -// already known. If the total difficulty of the newly inserted header becomes -// greater than the current known TD, the canonical chain is re-routed. -// -// Note: This method is not concurrent-safe with inserting blocks simultaneously -// into the chain, as side effects caused by reorganisations cannot be emulated -// without the real blocks. Hence, writing headers directly should only be done -// in two scenarios: pure-header mode of operation (light clients), or properly -// separated header/block phases (non-archive clients). -func (bc *BlockChain) writeHeader(header *types.Header) error { - bc.wg.Add(1) - defer bc.wg.Done() - - bc.mu.Lock() - defer bc.mu.Unlock() - - _, err := bc.hc.WriteHeader(header) - return err -} - // CurrentHeader retrieves the current head header of the canonical chain. The // header is retrieved from the HeaderChain's internal cache. func (bc *BlockChain) CurrentHeader() *types.Header { @@ -1569,8 +2134,8 @@ func (bc *BlockChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []com // // Note: ancestor == 0 returns the same block, 1 returns its parent and so on. func (bc *BlockChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { - bc.chainmu.Lock() - defer bc.chainmu.Unlock() + bc.chainmu.RLock() + defer bc.chainmu.RUnlock() return bc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical) } @@ -1581,7 +2146,7 @@ func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header { return bc.hc.GetHeaderByNumber(number) } -// Config retrieves the blockchain's chain configuration. +// Config retrieves the chain's fork configuration. func (bc *BlockChain) Config() *params.ChainConfig { return bc.chainConfig } // Engine retrieves the blockchain's consensus engine. @@ -1611,3 +2176,9 @@ func (bc *BlockChain) SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Su func (bc *BlockChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { return bc.scope.Track(bc.logsFeed.Subscribe(ch)) } + +// SubscribeBlockProcessingEvent registers a subscription of bool where true means +// block processing has started while false means it has stopped. +func (bc *BlockChain) SubscribeBlockProcessingEvent(ch chan<- bool) event.Subscription { + return bc.scope.Track(bc.blockProcFeed.Subscribe(ch)) +} diff --git a/core/blockchain_insert.go b/core/blockchain_insert.go new file mode 100644 index 000000000000..5685b0a4bdd9 --- /dev/null +++ b/core/blockchain_insert.go @@ -0,0 +1,166 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" +) + +// insertStats tracks and reports on block insertion. +type insertStats struct { + queued, processed, ignored int + usedGas uint64 + lastIndex int + startTime mclock.AbsTime +} + +// statsReportLimit is the time limit during import and export after which we +// always print out progress. This avoids the user wondering what's going on. +const statsReportLimit = 8 * time.Second + +// report prints statistics if some number of blocks have been processed +// or more than a few seconds have passed since the last message. +func (st *insertStats) report(chain []*types.Block, index int, dirty common.StorageSize) { + // Fetch the timings for the batch + var ( + now = mclock.Now() + elapsed = time.Duration(now) - time.Duration(st.startTime) + ) + // If we're at the last block of the batch or report period reached, log + if index == len(chain)-1 || elapsed >= statsReportLimit { + // Count the number of transactions in this segment + var txs int + for _, block := range chain[st.lastIndex : index+1] { + txs += len(block.Transactions()) + } + end := chain[index] + + // Assemble the log context and send it to the logger + context := []interface{}{ + "blocks", st.processed, "txs", txs, "mgas", float64(st.usedGas) / 1000000, + "elapsed", common.PrettyDuration(elapsed), "mgasps", float64(st.usedGas) * 1000 / float64(elapsed), + "number", end.Number(), "hash", end.Hash(), + } + if timestamp := time.Unix(int64(end.Time()), 0); time.Since(timestamp) > time.Minute { + context = append(context, []interface{}{"age", common.PrettyAge(timestamp)}...) + } + context = append(context, []interface{}{"dirty", dirty}...) + + if st.queued > 0 { + context = append(context, []interface{}{"queued", st.queued}...) + } + if st.ignored > 0 { + context = append(context, []interface{}{"ignored", st.ignored}...) + } + log.Info("Imported new chain segment", context...) + + // Bump the stats reported to the next section + *st = insertStats{startTime: now, lastIndex: index + 1} + } +} + +// insertIterator is a helper to assist during chain import. +type insertIterator struct { + chain types.Blocks // Chain of blocks being iterated over + + results <-chan error // Verification result sink from the consensus engine + errors []error // Header verification errors for the blocks + + index int // Current offset of the iterator + validator Validator // Validator to run if verification succeeds +} + +// newInsertIterator creates a new iterator based on the given blocks, which are +// assumed to be a contiguous chain. +func newInsertIterator(chain types.Blocks, results <-chan error, validator Validator) *insertIterator { + return &insertIterator{ + chain: chain, + results: results, + errors: make([]error, 0, len(chain)), + index: -1, + validator: validator, + } +} + +// next returns the next block in the iterator, along with any potential validation +// error for that block. When the end is reached, it will return (nil, nil). +func (it *insertIterator) next() (*types.Block, error) { + // If we reached the end of the chain, abort + if it.index+1 >= len(it.chain) { + it.index = len(it.chain) + return nil, nil + } + // Advance the iterator and wait for verification result if not yet done + it.index++ + if len(it.errors) <= it.index { + it.errors = append(it.errors, <-it.results) + } + if it.errors[it.index] != nil { + return it.chain[it.index], it.errors[it.index] + } + // Block header valid, run body validation and return + return it.chain[it.index], it.validator.ValidateBody(it.chain[it.index]) +} + +// peek returns the next block in the iterator, along with any potential validation +// error for that block, but does **not** advance the iterator. +// +// Both header and body validation errors (nil too) is cached into the iterator +// to avoid duplicating work on the following next() call. +func (it *insertIterator) peek() (*types.Block, error) { + // If we reached the end of the chain, abort + if it.index+1 >= len(it.chain) { + return nil, nil + } + // Wait for verification result if not yet done + if len(it.errors) <= it.index+1 { + it.errors = append(it.errors, <-it.results) + } + if it.errors[it.index+1] != nil { + return it.chain[it.index+1], it.errors[it.index+1] + } + // Block header valid, ignore body validation since we don't have a parent anyway + return it.chain[it.index+1], nil +} + +// previous returns the previous header that was being processed, or nil. +func (it *insertIterator) previous() *types.Header { + if it.index < 1 { + return nil + } + return it.chain[it.index-1].Header() +} + +// first returns the first block in the it. +func (it *insertIterator) first() *types.Block { + return it.chain[0] +} + +// remaining returns the number of remaining blocks. +func (it *insertIterator) remaining() int { + return len(it.chain) - it.index +} + +// processed returns the number of processed blocks. +func (it *insertIterator) processed() int { + return it.index + 1 +} diff --git a/core/blockchain_test.go b/core/blockchain_test.go index aef810050bec..27115af52d99 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -18,8 +18,10 @@ package core import ( "fmt" + "io/ioutil" "math/big" "math/rand" + "os" "sync" "testing" "time" @@ -47,7 +49,7 @@ var ( // header only chain. func newCanonical(engine consensus.Engine, n int, full bool) (ethdb.Database, *BlockChain, error) { var ( - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() genesis = new(Genesis).MustCommit(db) ) @@ -126,13 +128,6 @@ func testFork(t *testing.T, blockchain *BlockChain, i, n int, full bool, compara comparator(tdPre, tdPost) } -func printChain(bc *BlockChain) { - for i := bc.CurrentBlock().Number().Uint64(); i > 0; i-- { - b := bc.GetBlockByNumber(uint64(i)) - fmt.Printf("\t%x %v\n", b.Hash(), b.Difficulty()) - } -} - // testBlockChainImport tries to process a chain of blocks, writing them into // the database if successful. func testBlockChainImport(chain types.Blocks, blockchain *BlockChain) error { @@ -152,21 +147,21 @@ func testBlockChainImport(chain types.Blocks, blockchain *BlockChain) error { if err != nil { return err } - receipts, _, usedGas, err := blockchain.Processor().Process(block, statedb, vm.Config{}) + receipts, _, usedGas, err := blockchain.processor.Process(block, statedb, vm.Config{}) if err != nil { blockchain.reportBlock(block, receipts, err) return err } - err = blockchain.validator.ValidateState(block, blockchain.GetBlockByHash(block.ParentHash()), statedb, receipts, usedGas) + err = blockchain.validator.ValidateState(block, statedb, receipts, usedGas) if err != nil { blockchain.reportBlock(block, receipts, err) return err } - blockchain.mu.Lock() + blockchain.chainmu.Lock() rawdb.WriteTd(blockchain.db, block.Hash(), block.NumberU64(), new(big.Int).Add(block.Difficulty(), blockchain.GetTdByHash(block.ParentHash()))) rawdb.WriteBlock(blockchain.db, block) statedb.Commit(false) - blockchain.mu.Unlock() + blockchain.chainmu.Unlock() } return nil } @@ -180,23 +175,14 @@ func testHeaderChainImport(chain []*types.Header, blockchain *BlockChain) error return err } // Manually insert the header into the database, but don't reorganise (allows subsequent testing) - blockchain.mu.Lock() + blockchain.chainmu.Lock() rawdb.WriteTd(blockchain.db, header.Hash(), header.Number.Uint64(), new(big.Int).Add(header.Difficulty, blockchain.GetTdByHash(header.ParentHash))) rawdb.WriteHeader(blockchain.db, header) - blockchain.mu.Unlock() + blockchain.chainmu.Unlock() } return nil } -func insertChain(done chan bool, blockchain *BlockChain, chain types.Blocks, t *testing.T) { - _, err := blockchain.InsertChain(chain) - if err != nil { - fmt.Println(err) - t.FailNow() - } - done <- true -} - func TestLastBlock(t *testing.T) { _, blockchain, err := newCanonical(ethash.NewFaker(), 0, true) if err != nil { @@ -579,11 +565,11 @@ func testInsertNonceError(t *testing.T, full bool) { blockchain.hc.engine = blockchain.engine failRes, err = blockchain.InsertHeaderChain(headers, 1) } - // Check that the returned error indicates the failure. + // Check that the returned error indicates the failure if failRes != failAt { - t.Errorf("test %d: failure index mismatch: have %d, want %d", i, failRes, failAt) + t.Errorf("test %d: failure (%v) index mismatch: have %d, want %d", i, err, failRes, failAt) } - // Check that all no blocks after the failing block have been inserted. + // Check that all blocks after the failing block have been inserted for j := 0; j < i-failAt; j++ { if full { if block := blockchain.GetBlockByNumber(failNum + uint64(j)); block != nil { @@ -603,7 +589,7 @@ func testInsertNonceError(t *testing.T, full bool) { func TestFastVsFullChains(t *testing.T) { // Configure and generate a sample block chain var ( - gendb = ethdb.NewMemDatabase() + gendb = rawdb.NewMemoryDatabase() key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000) @@ -633,7 +619,7 @@ func TestFastVsFullChains(t *testing.T) { } }) // Import the chain as an archive node for the comparison baseline - archiveDb := ethdb.NewMemDatabase() + archiveDb := rawdb.NewMemoryDatabase() gspec.MustCommit(archiveDb) archive, _ := NewBlockChain(archiveDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) defer archive.Stop() @@ -642,7 +628,7 @@ func TestFastVsFullChains(t *testing.T) { t.Fatalf("failed to process block %d: %v", n, err) } // Fast import the chain as a non-archive node to test - fastDb := ethdb.NewMemDatabase() + fastDb := rawdb.NewMemoryDatabase() gspec.MustCommit(fastDb) fast, _ := NewBlockChain(fastDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) defer fast.Stop() @@ -654,7 +640,27 @@ func TestFastVsFullChains(t *testing.T) { if n, err := fast.InsertHeaderChain(headers, 1); err != nil { t.Fatalf("failed to insert header %d: %v", n, err) } - if n, err := fast.InsertReceiptChain(blocks, receipts); err != nil { + if n, err := fast.InsertReceiptChain(blocks, receipts, 0); err != nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + // Freezer style fast import the chain. + frdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(frdir) + ancientDb, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), frdir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + gspec.MustCommit(ancientDb) + ancient, _ := NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer ancient.Stop() + + if n, err := ancient.InsertHeaderChain(headers, 1); err != nil { + t.Fatalf("failed to insert header %d: %v", n, err) + } + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(len(blocks)/2)); err != nil { t.Fatalf("failed to insert receipt %d: %v", n, err) } // Iterate over all chain data components, and cross reference @@ -662,26 +668,35 @@ func TestFastVsFullChains(t *testing.T) { num, hash := blocks[i].NumberU64(), blocks[i].Hash() if ftd, atd := fast.GetTdByHash(hash), archive.GetTdByHash(hash); ftd.Cmp(atd) != 0 { - t.Errorf("block #%d [%x]: td mismatch: have %v, want %v", num, hash, ftd, atd) + t.Errorf("block #%d [%x]: td mismatch: fastdb %v, archivedb %v", num, hash, ftd, atd) + } + if antd, artd := ancient.GetTdByHash(hash), archive.GetTdByHash(hash); antd.Cmp(artd) != 0 { + t.Errorf("block #%d [%x]: td mismatch: ancientdb %v, archivedb %v", num, hash, antd, artd) } if fheader, aheader := fast.GetHeaderByHash(hash), archive.GetHeaderByHash(hash); fheader.Hash() != aheader.Hash() { - t.Errorf("block #%d [%x]: header mismatch: have %v, want %v", num, hash, fheader, aheader) + t.Errorf("block #%d [%x]: header mismatch: fastdb %v, archivedb %v", num, hash, fheader, aheader) + } + if anheader, arheader := ancient.GetHeaderByHash(hash), archive.GetHeaderByHash(hash); anheader.Hash() != arheader.Hash() { + t.Errorf("block #%d [%x]: header mismatch: ancientdb %v, archivedb %v", num, hash, anheader, arheader) } - if fblock, ablock := fast.GetBlockByHash(hash), archive.GetBlockByHash(hash); fblock.Hash() != ablock.Hash() { - t.Errorf("block #%d [%x]: block mismatch: have %v, want %v", num, hash, fblock, ablock) - } else if types.DeriveSha(fblock.Transactions()) != types.DeriveSha(ablock.Transactions()) { - t.Errorf("block #%d [%x]: transactions mismatch: have %v, want %v", num, hash, fblock.Transactions(), ablock.Transactions()) - } else if types.CalcUncleHash(fblock.Uncles()) != types.CalcUncleHash(ablock.Uncles()) { - t.Errorf("block #%d [%x]: uncles mismatch: have %v, want %v", num, hash, fblock.Uncles(), ablock.Uncles()) + if fblock, arblock, anblock := fast.GetBlockByHash(hash), archive.GetBlockByHash(hash), ancient.GetBlockByHash(hash); fblock.Hash() != arblock.Hash() || anblock.Hash() != arblock.Hash() { + t.Errorf("block #%d [%x]: block mismatch: fastdb %v, ancientdb %v, archivedb %v", num, hash, fblock, anblock, arblock) + } else if types.DeriveSha(fblock.Transactions()) != types.DeriveSha(arblock.Transactions()) || types.DeriveSha(anblock.Transactions()) != types.DeriveSha(arblock.Transactions()) { + t.Errorf("block #%d [%x]: transactions mismatch: fastdb %v, ancientdb %v, archivedb %v", num, hash, fblock.Transactions(), anblock.Transactions(), arblock.Transactions()) + } else if types.CalcUncleHash(fblock.Uncles()) != types.CalcUncleHash(arblock.Uncles()) || types.CalcUncleHash(anblock.Uncles()) != types.CalcUncleHash(arblock.Uncles()) { + t.Errorf("block #%d [%x]: uncles mismatch: fastdb %v, ancientdb %v, archivedb %v", num, hash, fblock.Uncles(), anblock, arblock.Uncles()) } - if freceipts, areceipts := rawdb.ReadReceipts(fastDb, hash, *rawdb.ReadHeaderNumber(fastDb, hash)), rawdb.ReadReceipts(archiveDb, hash, *rawdb.ReadHeaderNumber(archiveDb, hash)); types.DeriveSha(freceipts) != types.DeriveSha(areceipts) { - t.Errorf("block #%d [%x]: receipts mismatch: have %v, want %v", num, hash, freceipts, areceipts) + if freceipts, anreceipts, areceipts := rawdb.ReadReceipts(fastDb, hash, *rawdb.ReadHeaderNumber(fastDb, hash), fast.Config()), rawdb.ReadReceipts(ancientDb, hash, *rawdb.ReadHeaderNumber(ancientDb, hash), fast.Config()), rawdb.ReadReceipts(archiveDb, hash, *rawdb.ReadHeaderNumber(archiveDb, hash), fast.Config()); types.DeriveSha(freceipts) != types.DeriveSha(areceipts) { + t.Errorf("block #%d [%x]: receipts mismatch: fastdb %v, ancientdb %v, archivedb %v", num, hash, freceipts, anreceipts, areceipts) } } // Check that the canonical chains are the same between the databases for i := 0; i < len(blocks)+1; i++ { if fhash, ahash := rawdb.ReadCanonicalHash(fastDb, uint64(i)), rawdb.ReadCanonicalHash(archiveDb, uint64(i)); fhash != ahash { - t.Errorf("block #%d: canonical hash mismatch: have %v, want %v", i, fhash, ahash) + t.Errorf("block #%d: canonical hash mismatch: fastdb %v, archivedb %v", i, fhash, ahash) + } + if anhash, arhash := rawdb.ReadCanonicalHash(ancientDb, uint64(i)), rawdb.ReadCanonicalHash(archiveDb, uint64(i)); anhash != arhash { + t.Errorf("block #%d: canonical hash mismatch: ancientdb %v, archivedb %v", i, anhash, arhash) } } } @@ -691,7 +706,7 @@ func TestFastVsFullChains(t *testing.T) { func TestLightVsFastVsFullChainHeads(t *testing.T) { // Configure and generate a sample block chain var ( - gendb = ethdb.NewMemDatabase() + gendb = rawdb.NewMemoryDatabase() key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000) @@ -701,6 +716,20 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { height := uint64(1024) blocks, receipts := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), gendb, int(height), nil) + // makeDb creates a db instance for testing. + makeDb := func() (ethdb.Database, func()) { + dir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(dir) + db, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), dir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + gspec.MustCommit(db) + return db, func() { os.RemoveAll(dir) } + } // Configure a subchain to roll back remove := []common.Hash{} for _, block := range blocks[height/2:] { @@ -719,9 +748,8 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { } } // Import the chain as an archive node and ensure all pointers are updated - archiveDb := ethdb.NewMemDatabase() - gspec.MustCommit(archiveDb) - + archiveDb, delfn := makeDb() + defer delfn() archive, _ := NewBlockChain(archiveDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) if n, err := archive.InsertChain(blocks); err != nil { t.Fatalf("failed to process block %d: %v", n, err) @@ -733,8 +761,8 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { assert(t, "archive", archive, height/2, height/2, height/2) // Import the chain as a non-archive node and ensure all pointers are updated - fastDb := ethdb.NewMemDatabase() - gspec.MustCommit(fastDb) + fastDb, delfn := makeDb() + defer delfn() fast, _ := NewBlockChain(fastDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) defer fast.Stop() @@ -745,17 +773,35 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { if n, err := fast.InsertHeaderChain(headers, 1); err != nil { t.Fatalf("failed to insert header %d: %v", n, err) } - if n, err := fast.InsertReceiptChain(blocks, receipts); err != nil { + if n, err := fast.InsertReceiptChain(blocks, receipts, 0); err != nil { t.Fatalf("failed to insert receipt %d: %v", n, err) } assert(t, "fast", fast, height, height, 0) fast.Rollback(remove) assert(t, "fast", fast, height/2, height/2, 0) - // Import the chain as a light node and ensure all pointers are updated - lightDb := ethdb.NewMemDatabase() - gspec.MustCommit(lightDb) + // Import the chain as a ancient-first node and ensure all pointers are updated + ancientDb, delfn := makeDb() + defer delfn() + ancient, _ := NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer ancient.Stop() + + if n, err := ancient.InsertHeaderChain(headers, 1); err != nil { + t.Fatalf("failed to insert header %d: %v", n, err) + } + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(3*len(blocks)/4)); err != nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + assert(t, "ancient", ancient, height, height, 0) + ancient.Rollback(remove) + assert(t, "ancient", ancient, height/2, height/2, 0) + if frozen, err := ancientDb.Ancients(); err != nil || frozen != height/2+1 { + t.Fatalf("failed to truncate ancient store, want %v, have %v", height/2+1, frozen) + } + // Import the chain as a light node and ensure all pointers are updated + lightDb, delfn := makeDb() + defer delfn() light, _ := NewBlockChain(lightDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) if n, err := light.InsertHeaderChain(headers, 1); err != nil { t.Fatalf("failed to insert header %d: %v", n, err) @@ -776,7 +822,7 @@ func TestChainTxReorgs(t *testing.T) { addr1 = crypto.PubkeyToAddress(key1.PublicKey) addr2 = crypto.PubkeyToAddress(key2.PublicKey) addr3 = crypto.PubkeyToAddress(key3.PublicKey) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec = &Genesis{ Config: params.TestChainConfig, GasLimit: 3141592, @@ -859,7 +905,7 @@ func TestChainTxReorgs(t *testing.T) { if txn, _, _, _ := rawdb.ReadTransaction(db, tx.Hash()); txn != nil { t.Errorf("drop %d: tx %v found while shouldn't have been", i, txn) } - if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash()); rcpt != nil { + if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash(), blockchain.Config()); rcpt != nil { t.Errorf("drop %d: receipt %v found while shouldn't have been", i, rcpt) } } @@ -868,7 +914,7 @@ func TestChainTxReorgs(t *testing.T) { if txn, _, _, _ := rawdb.ReadTransaction(db, tx.Hash()); txn == nil { t.Errorf("add %d: expected tx to be found", i) } - if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash()); rcpt == nil { + if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash(), blockchain.Config()); rcpt == nil { t.Errorf("add %d: expected receipt to be found", i) } } @@ -877,18 +923,17 @@ func TestChainTxReorgs(t *testing.T) { if txn, _, _, _ := rawdb.ReadTransaction(db, tx.Hash()); txn == nil { t.Errorf("share %d: expected tx to be found", i) } - if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash()); rcpt == nil { + if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash(), blockchain.Config()); rcpt == nil { t.Errorf("share %d: expected receipt to be found", i) } } } func TestLogReorgs(t *testing.T) { - var ( key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") addr1 = crypto.PubkeyToAddress(key1.PublicKey) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() // this code generates a log code = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{addr1: {Balance: big.NewInt(10000000000000)}}} @@ -930,9 +975,216 @@ func TestLogReorgs(t *testing.T) { } } +func TestLogRebirth(t *testing.T) { + var ( + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr1 = crypto.PubkeyToAddress(key1.PublicKey) + db = rawdb.NewMemoryDatabase() + + // this code generates a log + code = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") + gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{addr1: {Balance: big.NewInt(10000000000000)}}} + genesis = gspec.MustCommit(db) + signer = types.NewEIP155Signer(gspec.Config.ChainID) + newLogCh = make(chan bool) + ) + + // listenNewLog checks whether the received logs number is equal with expected. + listenNewLog := func(sink chan []*types.Log, expect int) { + cnt := 0 + for { + select { + case logs := <-sink: + cnt += len(logs) + case <-time.NewTimer(5 * time.Second).C: + // new logs timeout + newLogCh <- false + return + } + if cnt == expect { + break + } else if cnt > expect { + // redundant logs received + newLogCh <- false + return + } + } + select { + case <-sink: + // redundant logs received + newLogCh <- false + case <-time.NewTimer(100 * time.Millisecond).C: + newLogCh <- true + } + } + + blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer blockchain.Stop() + + logsCh := make(chan []*types.Log) + blockchain.SubscribeLogsEvent(logsCh) + + rmLogsCh := make(chan RemovedLogsEvent) + blockchain.SubscribeRemovedLogsEvent(rmLogsCh) + + chain, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 2, func(i int, gen *BlockGen) { + if i == 1 { + tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), 1000000, new(big.Int), code), signer, key1) + if err != nil { + t.Fatalf("failed to create tx: %v", err) + } + gen.AddTx(tx) + } + }) + + // Spawn a goroutine to receive log events + go listenNewLog(logsCh, 1) + if _, err := blockchain.InsertChain(chain); err != nil { + t.Fatalf("failed to insert chain: %v", err) + } + if !<-newLogCh { + t.Fatalf("failed to receive new log event") + } + + // Generate long reorg chain + forkChain, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 2, func(i int, gen *BlockGen) { + if i == 1 { + tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), 1000000, new(big.Int), code), signer, key1) + if err != nil { + t.Fatalf("failed to create tx: %v", err) + } + gen.AddTx(tx) + // Higher block difficulty + gen.OffsetTime(-9) + } + }) + + // Spawn a goroutine to receive log events + go listenNewLog(logsCh, 1) + if _, err := blockchain.InsertChain(forkChain); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + if !<-newLogCh { + t.Fatalf("failed to receive new log event") + } + // Ensure removedLog events received + select { + case ev := <-rmLogsCh: + if len(ev.Logs) == 0 { + t.Error("expected logs") + } + case <-time.NewTimer(1 * time.Second).C: + t.Fatal("Timeout. There is no RemovedLogsEvent has been sent.") + } + + newBlocks, _ := GenerateChain(params.TestChainConfig, chain[len(chain)-1], ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) + go listenNewLog(logsCh, 1) + if _, err := blockchain.InsertChain(newBlocks); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + // Ensure removedLog events received + select { + case ev := <-rmLogsCh: + if len(ev.Logs) == 0 { + t.Error("expected logs") + } + case <-time.NewTimer(1 * time.Second).C: + t.Fatal("Timeout. There is no RemovedLogsEvent has been sent.") + } + // Rebirth logs should omit a newLogEvent + if !<-newLogCh { + t.Fatalf("failed to receive new log event") + } +} + +func TestSideLogRebirth(t *testing.T) { + var ( + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr1 = crypto.PubkeyToAddress(key1.PublicKey) + db = rawdb.NewMemoryDatabase() + + // this code generates a log + code = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") + gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{addr1: {Balance: big.NewInt(10000000000000)}}} + genesis = gspec.MustCommit(db) + signer = types.NewEIP155Signer(gspec.Config.ChainID) + newLogCh = make(chan bool) + ) + + // listenNewLog checks whether the received logs number is equal with expected. + listenNewLog := func(sink chan []*types.Log, expect int) { + cnt := 0 + for { + select { + case logs := <-sink: + cnt += len(logs) + case <-time.NewTimer(5 * time.Second).C: + // new logs timeout + newLogCh <- false + return + } + if cnt == expect { + break + } else if cnt > expect { + // redundant logs received + newLogCh <- false + return + } + } + select { + case <-sink: + // redundant logs received + newLogCh <- false + case <-time.NewTimer(100 * time.Millisecond).C: + newLogCh <- true + } + } + + blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer blockchain.Stop() + + logsCh := make(chan []*types.Log) + blockchain.SubscribeLogsEvent(logsCh) + + chain, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 2, func(i int, gen *BlockGen) { + if i == 1 { + // Higher block difficulty + gen.OffsetTime(-9) + } + }) + if _, err := blockchain.InsertChain(chain); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + + // Generate side chain with lower difficulty + sideChain, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 2, func(i int, gen *BlockGen) { + if i == 1 { + tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), 1000000, new(big.Int), code), signer, key1) + if err != nil { + t.Fatalf("failed to create tx: %v", err) + } + gen.AddTx(tx) + } + }) + if _, err := blockchain.InsertChain(sideChain); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + + // Generate a new block based on side chain + newBlocks, _ := GenerateChain(params.TestChainConfig, sideChain[len(sideChain)-1], ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) + go listenNewLog(logsCh, 1) + if _, err := blockchain.InsertChain(newBlocks); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + // Rebirth logs should omit a newLogEvent + if !<-newLogCh { + t.Fatalf("failed to receive new log event") + } +} + func TestReorgSideEvent(t *testing.T) { var ( - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") addr1 = crypto.PubkeyToAddress(key1.PublicKey) gspec = &Genesis{ @@ -1060,7 +1312,7 @@ func TestCanonicalBlockRetrieval(t *testing.T) { func TestEIP155Transition(t *testing.T) { // Configure and generate a sample block chain var ( - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000) @@ -1163,7 +1415,7 @@ func TestEIP155Transition(t *testing.T) { func TestEIP161AccountRemoval(t *testing.T) { // Configure and generate a sample block chain var ( - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000) @@ -1235,7 +1487,7 @@ func TestBlockchainHeaderchainReorgConsistency(t *testing.T) { // Generate a canonical chain to act as the main dataset engine := ethash.NewFaker() - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := new(Genesis).MustCommit(db) blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 64, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) @@ -1251,7 +1503,7 @@ func TestBlockchainHeaderchainReorgConsistency(t *testing.T) { } // Import the canonical and fork chain side by side, verifying the current block // and current header consistency - diskdb := ethdb.NewMemDatabase() + diskdb := rawdb.NewMemoryDatabase() new(Genesis).MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) @@ -1280,9 +1532,9 @@ func TestTrieForkGC(t *testing.T) { // Generate a canonical chain to act as the main dataset engine := ethash.NewFaker() - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := new(Genesis).MustCommit(db) - blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*triesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) + blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*TriesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) // Generate a bunch of fork blocks, each side forking from the canonical chain forks := make([]*types.Block, len(blocks)) @@ -1295,7 +1547,7 @@ func TestTrieForkGC(t *testing.T) { forks[i] = fork[0] } // Import the canonical and fork chain side by side, forcing the trie cache to cache both - diskdb := ethdb.NewMemDatabase() + diskdb := rawdb.NewMemoryDatabase() new(Genesis).MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) @@ -1311,7 +1563,7 @@ func TestTrieForkGC(t *testing.T) { } } // Dereference all the recent tries and ensure no past trie is left in - for i := 0; i < triesInMemory; i++ { + for i := 0; i < TriesInMemory; i++ { chain.stateCache.TrieDB().Dereference(blocks[len(blocks)-1-i].Root()) chain.stateCache.TrieDB().Dereference(forks[len(blocks)-1-i].Root()) } @@ -1326,15 +1578,15 @@ func TestLargeReorgTrieGC(t *testing.T) { // Generate the original common chain segment and the two competing forks engine := ethash.NewFaker() - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := new(Genesis).MustCommit(db) shared, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 64, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) - original, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*triesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{2}) }) - competitor, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*triesInMemory+1, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{3}) }) + original, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*TriesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{2}) }) + competitor, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*TriesInMemory+1, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{3}) }) // Import the shared chain and the original canonical one - diskdb := ethdb.NewMemDatabase() + diskdb := rawdb.NewMemoryDatabase() new(Genesis).MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) @@ -1345,7 +1597,7 @@ func TestLargeReorgTrieGC(t *testing.T) { t.Fatalf("failed to insert shared chain: %v", err) } if _, err := chain.InsertChain(original); err != nil { - t.Fatalf("failed to insert shared chain: %v", err) + t.Fatalf("failed to insert original chain: %v", err) } // Ensure that the state associated with the forking point is pruned away if node, _ := chain.stateCache.TrieDB().Node(shared[len(shared)-1].Root()); node != nil { @@ -1366,13 +1618,521 @@ func TestLargeReorgTrieGC(t *testing.T) { if _, err := chain.InsertChain(competitor[len(competitor)-2:]); err != nil { t.Fatalf("failed to finalize competitor chain: %v", err) } - for i, block := range competitor[:len(competitor)-triesInMemory] { + for i, block := range competitor[:len(competitor)-TriesInMemory] { if node, _ := chain.stateCache.TrieDB().Node(block.Root()); node != nil { t.Fatalf("competitor %d: competing chain state missing", i) } } } +func TestBlockchainRecovery(t *testing.T) { + // Configure and generate a sample block chain + var ( + gendb = rawdb.NewMemoryDatabase() + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + address = crypto.PubkeyToAddress(key.PublicKey) + funds = big.NewInt(1000000000) + gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{address: {Balance: funds}}} + genesis = gspec.MustCommit(gendb) + ) + height := uint64(1024) + blocks, receipts := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), gendb, int(height), nil) + + // Import the chain as a ancient-first node and ensure all pointers are updated + frdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(frdir) + ancientDb, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), frdir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + gspec.MustCommit(ancientDb) + ancient, _ := NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + + headers := make([]*types.Header, len(blocks)) + for i, block := range blocks { + headers[i] = block.Header() + } + if n, err := ancient.InsertHeaderChain(headers, 1); err != nil { + t.Fatalf("failed to insert header %d: %v", n, err) + } + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(3*len(blocks)/4)); err != nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + ancient.Stop() + + // Destroy head fast block manually + midBlock := blocks[len(blocks)/2] + rawdb.WriteHeadFastBlockHash(ancientDb, midBlock.Hash()) + + // Reopen broken blockchain again + ancient, _ = NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer ancient.Stop() + if num := ancient.CurrentBlock().NumberU64(); num != 0 { + t.Errorf("head block mismatch: have #%v, want #%v", num, 0) + } + if num := ancient.CurrentFastBlock().NumberU64(); num != midBlock.NumberU64() { + t.Errorf("head fast-block mismatch: have #%v, want #%v", num, midBlock.NumberU64()) + } + if num := ancient.CurrentHeader().Number.Uint64(); num != midBlock.NumberU64() { + t.Errorf("head header mismatch: have #%v, want #%v", num, midBlock.NumberU64()) + } +} + +func TestIncompleteAncientReceiptChainInsertion(t *testing.T) { + // Configure and generate a sample block chain + var ( + gendb = rawdb.NewMemoryDatabase() + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + address = crypto.PubkeyToAddress(key.PublicKey) + funds = big.NewInt(1000000000) + gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{address: {Balance: funds}}} + genesis = gspec.MustCommit(gendb) + ) + height := uint64(1024) + blocks, receipts := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), gendb, int(height), nil) + + // Import the chain as a ancient-first node and ensure all pointers are updated + frdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(frdir) + ancientDb, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), frdir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + gspec.MustCommit(ancientDb) + ancient, _ := NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer ancient.Stop() + + headers := make([]*types.Header, len(blocks)) + for i, block := range blocks { + headers[i] = block.Header() + } + if n, err := ancient.InsertHeaderChain(headers, 1); err != nil { + t.Fatalf("failed to insert header %d: %v", n, err) + } + // Abort ancient receipt chain insertion deliberately + ancient.terminateInsert = func(hash common.Hash, number uint64) bool { + return number == blocks[len(blocks)/2].NumberU64() + } + previousFastBlock := ancient.CurrentFastBlock() + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(3*len(blocks)/4)); err == nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + if ancient.CurrentFastBlock().NumberU64() != previousFastBlock.NumberU64() { + t.Fatalf("failed to rollback ancient data, want %d, have %d", previousFastBlock.NumberU64(), ancient.CurrentFastBlock().NumberU64()) + } + if frozen, err := ancient.db.Ancients(); err != nil || frozen != 1 { + t.Fatalf("failed to truncate ancient data") + } + ancient.terminateInsert = nil + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(3*len(blocks)/4)); err != nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + if ancient.CurrentFastBlock().NumberU64() != blocks[len(blocks)-1].NumberU64() { + t.Fatalf("failed to insert ancient recept chain after rollback") + } +} + +// Tests that importing a very large side fork, which is larger than the canon chain, +// but where the difficulty per block is kept low: this means that it will not +// overtake the 'canon' chain until after it's passed canon by about 200 blocks. +// +// Details at: +// - https://github.com/ethereum/go-ethereum/issues/18977 +// - https://github.com/ethereum/go-ethereum/pull/18988 +func TestLowDiffLongChain(t *testing.T) { + // Generate a canonical chain to act as the main dataset + engine := ethash.NewFaker() + db := rawdb.NewMemoryDatabase() + genesis := new(Genesis).MustCommit(db) + + // We must use a pretty long chain to ensure that the fork doesn't overtake us + // until after at least 128 blocks post tip + blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 6*TriesInMemory, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{1}) + b.OffsetTime(-9) + }) + + // Import the canonical chain + diskdb := rawdb.NewMemoryDatabase() + new(Genesis).MustCommit(diskdb) + + chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + if n, err := chain.InsertChain(blocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + // Generate fork chain, starting from an early block + parent := blocks[10] + fork, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 8*TriesInMemory, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{2}) + }) + + // And now import the fork + if i, err := chain.InsertChain(fork); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", i, err) + } + head := chain.CurrentBlock() + if got := fork[len(fork)-1].Hash(); got != head.Hash() { + t.Fatalf("head wrong, expected %x got %x", head.Hash(), got) + } + // Sanity check that all the canonical numbers are present + header := chain.CurrentHeader() + for number := head.NumberU64(); number > 0; number-- { + if hash := chain.GetHeaderByNumber(number).Hash(); hash != header.Hash() { + t.Fatalf("header %d: canonical hash mismatch: have %x, want %x", number, hash, header.Hash()) + } + header = chain.GetHeader(header.ParentHash, number-1) + } +} + +// Tests that importing a sidechain (S), where +// - S is sidechain, containing blocks [Sn...Sm] +// - C is canon chain, containing blocks [G..Cn..Cm] +// - A common ancestor is placed at prune-point + blocksBetweenCommonAncestorAndPruneblock +// - The sidechain S is prepended with numCanonBlocksInSidechain blocks from the canon chain +func testSideImport(t *testing.T, numCanonBlocksInSidechain, blocksBetweenCommonAncestorAndPruneblock int) { + + // Generate a canonical chain to act as the main dataset + engine := ethash.NewFaker() + db := rawdb.NewMemoryDatabase() + genesis := new(Genesis).MustCommit(db) + + // Generate and import the canonical chain + blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*TriesInMemory, nil) + diskdb := rawdb.NewMemoryDatabase() + new(Genesis).MustCommit(diskdb) + chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + if n, err := chain.InsertChain(blocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + + lastPrunedIndex := len(blocks) - TriesInMemory - 1 + lastPrunedBlock := blocks[lastPrunedIndex] + firstNonPrunedBlock := blocks[len(blocks)-TriesInMemory] + + // Verify pruning of lastPrunedBlock + if chain.HasBlockAndState(lastPrunedBlock.Hash(), lastPrunedBlock.NumberU64()) { + t.Errorf("Block %d not pruned", lastPrunedBlock.NumberU64()) + } + // Verify firstNonPrunedBlock is not pruned + if !chain.HasBlockAndState(firstNonPrunedBlock.Hash(), firstNonPrunedBlock.NumberU64()) { + t.Errorf("Block %d pruned", firstNonPrunedBlock.NumberU64()) + } + // Generate the sidechain + // First block should be a known block, block after should be a pruned block. So + // canon(pruned), side, side... + + // Generate fork chain, make it longer than canon + parentIndex := lastPrunedIndex + blocksBetweenCommonAncestorAndPruneblock + parent := blocks[parentIndex] + fork, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 2*TriesInMemory, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{2}) + }) + // Prepend the parent(s) + var sidechain []*types.Block + for i := numCanonBlocksInSidechain; i > 0; i-- { + sidechain = append(sidechain, blocks[parentIndex+1-i]) + } + sidechain = append(sidechain, fork...) + _, err = chain.InsertChain(sidechain) + if err != nil { + t.Errorf("Got error, %v", err) + } + head := chain.CurrentBlock() + if got := fork[len(fork)-1].Hash(); got != head.Hash() { + t.Fatalf("head wrong, expected %x got %x", head.Hash(), got) + } +} + +// Tests that importing a sidechain (S), where +// - S is sidechain, containing blocks [Sn...Sm] +// - C is canon chain, containing blocks [G..Cn..Cm] +// - The common ancestor Cc is pruned +// - The first block in S: Sn, is == Cn +// That is: the sidechain for import contains some blocks already present in canon chain. +// So the blocks are +// [ Cn, Cn+1, Cc, Sn+3 ... Sm] +// ^ ^ ^ pruned +func TestPrunedImportSide(t *testing.T) { + //glogger := log.NewGlogHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(false))) + //glogger.Verbosity(3) + //log.Root().SetHandler(log.Handler(glogger)) + testSideImport(t, 3, 3) + testSideImport(t, 3, -3) + testSideImport(t, 10, 0) + testSideImport(t, 1, 10) + testSideImport(t, 1, -10) +} + +func TestInsertKnownHeaders(t *testing.T) { testInsertKnownChainData(t, "headers") } +func TestInsertKnownReceiptChain(t *testing.T) { testInsertKnownChainData(t, "receipts") } +func TestInsertKnownBlocks(t *testing.T) { testInsertKnownChainData(t, "blocks") } + +func testInsertKnownChainData(t *testing.T, typ string) { + engine := ethash.NewFaker() + + db := rawdb.NewMemoryDatabase() + genesis := new(Genesis).MustCommit(db) + + blocks, receipts := GenerateChain(params.TestChainConfig, genesis, engine, db, 32, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) + // A longer chain but total difficulty is lower. + blocks2, receipts2 := GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], engine, db, 65, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) + // A shorter chain but total difficulty is higher. + blocks3, receipts3 := GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], engine, db, 64, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{1}) + b.OffsetTime(-9) // A higher difficulty + }) + // Import the shared chain and the original canonical one + dir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(dir) + chaindb, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), dir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + new(Genesis).MustCommit(chaindb) + defer os.RemoveAll(dir) + + chain, err := NewBlockChain(chaindb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + + var ( + inserter func(blocks []*types.Block, receipts []types.Receipts) error + asserter func(t *testing.T, block *types.Block) + ) + headers, headers2 := make([]*types.Header, 0, len(blocks)), make([]*types.Header, 0, len(blocks2)) + for _, block := range blocks { + headers = append(headers, block.Header()) + } + for _, block := range blocks2 { + headers2 = append(headers2, block.Header()) + } + if typ == "headers" { + inserter = func(blocks []*types.Block, receipts []types.Receipts) error { + headers := make([]*types.Header, 0, len(blocks)) + for _, block := range blocks { + headers = append(headers, block.Header()) + } + _, err := chain.InsertHeaderChain(headers, 1) + return err + } + asserter = func(t *testing.T, block *types.Block) { + if chain.CurrentHeader().Hash() != block.Hash() { + t.Fatalf("current head header mismatch, have %v, want %v", chain.CurrentHeader().Hash().Hex(), block.Hash().Hex()) + } + } + } else if typ == "receipts" { + inserter = func(blocks []*types.Block, receipts []types.Receipts) error { + headers := make([]*types.Header, 0, len(blocks)) + for _, block := range blocks { + headers = append(headers, block.Header()) + } + _, err := chain.InsertHeaderChain(headers, 1) + if err != nil { + return err + } + _, err = chain.InsertReceiptChain(blocks, receipts, 0) + return err + } + asserter = func(t *testing.T, block *types.Block) { + if chain.CurrentFastBlock().Hash() != block.Hash() { + t.Fatalf("current head fast block mismatch, have %v, want %v", chain.CurrentFastBlock().Hash().Hex(), block.Hash().Hex()) + } + } + } else { + inserter = func(blocks []*types.Block, receipts []types.Receipts) error { + _, err := chain.InsertChain(blocks) + return err + } + asserter = func(t *testing.T, block *types.Block) { + if chain.CurrentBlock().Hash() != block.Hash() { + t.Fatalf("current head block mismatch, have %v, want %v", chain.CurrentBlock().Hash().Hex(), block.Hash().Hex()) + } + } + } + + if err := inserter(blocks, receipts); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + + // Reimport the chain data again. All the imported + // chain data are regarded "known" data. + if err := inserter(blocks, receipts); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks[len(blocks)-1]) + + // Import a long canonical chain with some known data as prefix. + var rollback []common.Hash + for i := len(blocks) / 2; i < len(blocks); i++ { + rollback = append(rollback, blocks[i].Hash()) + } + chain.Rollback(rollback) + if err := inserter(append(blocks, blocks2...), append(receipts, receipts2...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks2[len(blocks2)-1]) + + // Import a heavier shorter but higher total difficulty chain with some known data as prefix. + if err := inserter(append(blocks, blocks3...), append(receipts, receipts3...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks3[len(blocks3)-1]) + + // Import a longer but lower total difficulty chain with some known data as prefix. + if err := inserter(append(blocks, blocks2...), append(receipts, receipts2...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + // The head shouldn't change. + asserter(t, blocks3[len(blocks3)-1]) + + // Rollback the heavier chain and re-insert the longer chain again + for i := 0; i < len(blocks3); i++ { + rollback = append(rollback, blocks3[i].Hash()) + } + chain.Rollback(rollback) + + if err := inserter(append(blocks, blocks2...), append(receipts, receipts2...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks2[len(blocks2)-1]) +} + +// getLongAndShortChains returns two chains, +// A is longer, B is heavier +func getLongAndShortChains() (*BlockChain, []*types.Block, []*types.Block, error) { + // Generate a canonical chain to act as the main dataset + engine := ethash.NewFaker() + db := rawdb.NewMemoryDatabase() + genesis := new(Genesis).MustCommit(db) + + // Generate and import the canonical chain, + // Offset the time, to keep the difficulty low + longChain, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 80, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{1}) + }) + diskdb := rawdb.NewMemoryDatabase() + new(Genesis).MustCommit(diskdb) + + chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + return nil, nil, nil, fmt.Errorf("failed to create tester chain: %v", err) + } + + // Generate fork chain, make it shorter than canon, with common ancestor pretty early + parentIndex := 3 + parent := longChain[parentIndex] + heavyChain, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 75, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{2}) + b.OffsetTime(-9) + }) + // Verify that the test is sane + var ( + longerTd = new(big.Int) + shorterTd = new(big.Int) + ) + for index, b := range longChain { + longerTd.Add(longerTd, b.Difficulty()) + if index <= parentIndex { + shorterTd.Add(shorterTd, b.Difficulty()) + } + } + for _, b := range heavyChain { + shorterTd.Add(shorterTd, b.Difficulty()) + } + if shorterTd.Cmp(longerTd) <= 0 { + return nil, nil, nil, fmt.Errorf("Test is moot, heavyChain td (%v) must be larger than canon td (%v)", shorterTd, longerTd) + } + longerNum := longChain[len(longChain)-1].NumberU64() + shorterNum := heavyChain[len(heavyChain)-1].NumberU64() + if shorterNum >= longerNum { + return nil, nil, nil, fmt.Errorf("Test is moot, heavyChain num (%v) must be lower than canon num (%v)", shorterNum, longerNum) + } + return chain, longChain, heavyChain, nil +} + +// TestReorgToShorterRemovesCanonMapping tests that if we +// 1. Have a chain [0 ... N .. X] +// 2. Reorg to shorter but heavier chain [0 ... N ... Y] +// 3. Then there should be no canon mapping for the block at height X +func TestReorgToShorterRemovesCanonMapping(t *testing.T) { + chain, canonblocks, sideblocks, err := getLongAndShortChains() + if err != nil { + t.Fatal(err) + } + if n, err := chain.InsertChain(canonblocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + canonNum := chain.CurrentBlock().NumberU64() + _, err = chain.InsertChain(sideblocks) + if err != nil { + t.Errorf("Got error, %v", err) + } + head := chain.CurrentBlock() + if got := sideblocks[len(sideblocks)-1].Hash(); got != head.Hash() { + t.Fatalf("head wrong, expected %x got %x", head.Hash(), got) + } + // We have now inserted a sidechain. + if blockByNum := chain.GetBlockByNumber(canonNum); blockByNum != nil { + t.Errorf("expected block to be gone: %v", blockByNum.NumberU64()) + } + if headerByNum := chain.GetHeaderByNumber(canonNum); headerByNum != nil { + t.Errorf("expected header to be gone: %v", headerByNum.Number.Uint64()) + } +} + +// TestReorgToShorterRemovesCanonMappingHeaderChain is the same scenario +// as TestReorgToShorterRemovesCanonMapping, but applied on headerchain +// imports -- that is, for fast sync +func TestReorgToShorterRemovesCanonMappingHeaderChain(t *testing.T) { + chain, canonblocks, sideblocks, err := getLongAndShortChains() + if err != nil { + t.Fatal(err) + } + // Convert into headers + canonHeaders := make([]*types.Header, len(canonblocks)) + for i, block := range canonblocks { + canonHeaders[i] = block.Header() + } + if n, err := chain.InsertHeaderChain(canonHeaders, 0); err != nil { + t.Fatalf("header %d: failed to insert into chain: %v", n, err) + } + canonNum := chain.CurrentHeader().Number.Uint64() + sideHeaders := make([]*types.Header, len(sideblocks)) + for i, block := range sideblocks { + sideHeaders[i] = block.Header() + } + if n, err := chain.InsertHeaderChain(sideHeaders, 0); err != nil { + t.Fatalf("header %d: failed to insert into chain: %v", n, err) + } + head := chain.CurrentHeader() + if got := sideblocks[len(sideblocks)-1].Hash(); got != head.Hash() { + t.Fatalf("head wrong, expected %x got %x", head.Hash(), got) + } + // We have now inserted a sidechain. + if blockByNum := chain.GetBlockByNumber(canonNum); blockByNum != nil { + t.Errorf("expected block to be gone: %v", blockByNum.NumberU64()) + } + if headerByNum := chain.GetHeaderByNumber(canonNum); headerByNum != nil { + t.Errorf("expected header to be gone: %v", headerByNum.Number.Uint64()) + } +} + // Benchmarks large blocks with value transfers to non-existing accounts func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks int, recipientFn func(uint64) common.Address, dataFn func(uint64) []byte) { var ( @@ -1394,7 +2154,7 @@ func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks in ) // Generate the original common chain segment and the two competing forks engine := ethash.NewFaker() - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := gspec.MustCommit(db) blockGenerator := func(i int, block *BlockGen) { @@ -1402,7 +2162,6 @@ func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks in for txi := 0; txi < numTxs; txi++ { uniq := uint64(i*numTxs + txi) recipient := recipientFn(uniq) - //recipient := common.BigToAddress(big.NewInt(0).SetUint64(1337 + uniq)) tx, err := types.SignTx(types.NewTransaction(uniq, recipient, big.NewInt(1), params.TxGas, big.NewInt(1), nil), signer, testBankKey) if err != nil { b.Error(err) @@ -1416,7 +2175,7 @@ func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks in b.ResetTimer() for i := 0; i < b.N; i++ { // Import the shared chain and the original canonical one - diskdb := ethdb.NewMemDatabase() + diskdb := rawdb.NewMemoryDatabase() gspec.MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) @@ -1429,26 +2188,26 @@ func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks in } b.StopTimer() if got := chain.CurrentBlock().Transactions().Len(); got != numTxs*numBlocks { - b.Fatalf("Transactions were not included, expected %d, got %d", (numTxs * numBlocks), got) + b.Fatalf("Transactions were not included, expected %d, got %d", numTxs*numBlocks, got) } } } + func BenchmarkBlockChain_1x1000ValueTransferToNonexisting(b *testing.B) { var ( numTxs = 1000 numBlocks = 1 ) - recipientFn := func(nonce uint64) common.Address { return common.BigToAddress(big.NewInt(0).SetUint64(1337 + nonce)) } dataFn := func(nonce uint64) []byte { return nil } - benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn) } + func BenchmarkBlockChain_1x1000ValueTransferToExisting(b *testing.B) { var ( numTxs = 1000 @@ -1463,9 +2222,9 @@ func BenchmarkBlockChain_1x1000ValueTransferToExisting(b *testing.B) { dataFn := func(nonce uint64) []byte { return nil } - benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn) } + func BenchmarkBlockChain_1x1000Executions(b *testing.B) { var ( numTxs = 1000 @@ -1480,6 +2239,5 @@ func BenchmarkBlockChain_1x1000Executions(b *testing.B) { dataFn := func(nonce uint64) []byte { return nil } - benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn) } diff --git a/core/chain_indexer.go b/core/chain_indexer.go index 4bdd4ba1c854..c0c2c4f7f945 100644 --- a/core/chain_indexer.go +++ b/core/chain_indexer.go @@ -53,14 +53,14 @@ type ChainIndexerChain interface { // CurrentHeader retrieves the latest locally known header. CurrentHeader() *types.Header - // SubscribeChainEvent subscribes to new head header notifications. - SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription + // SubscribeChainHeadEvent subscribes to new head header notifications. + SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription } // ChainIndexer does a post-processing job for equally sized sections of the // canonical chain (like BlooomBits and CHT structures). A ChainIndexer is // connected to the blockchain through the event system by starting a -// ChainEventLoop in a goroutine. +// ChainHeadEventLoop in a goroutine. // // Further child ChainIndexers can be added which use the output of the parent // section indexer. These child indexers receive new head notifications only @@ -97,7 +97,7 @@ type ChainIndexer struct { // NewChainIndexer creates a new chain indexer to do background processing on // chain segments of a given size after certain number of confirmations passed. // The throttling parameter might be used to prevent database thrashing. -func NewChainIndexer(chainDb, indexDb ethdb.Database, backend ChainIndexerBackend, section, confirm uint64, throttling time.Duration, kind string) *ChainIndexer { +func NewChainIndexer(chainDb ethdb.Database, indexDb ethdb.Database, backend ChainIndexerBackend, section, confirm uint64, throttling time.Duration, kind string) *ChainIndexer { c := &ChainIndexer{ chainDb: chainDb, indexDb: indexDb, @@ -128,12 +128,13 @@ func (c *ChainIndexer) AddCheckpoint(section uint64, shead common.Hash) { c.lock.Lock() defer c.lock.Unlock() + // Short circuit if the given checkpoint is below than local's. + if c.checkpointSections >= section+1 || section < c.storedSections { + return + } c.checkpointSections = section + 1 c.checkpointHead = shead - if section < c.storedSections { - return - } c.setSectionHead(section, shead) c.setValidSections(section + 1) } @@ -142,8 +143,8 @@ func (c *ChainIndexer) AddCheckpoint(section uint64, shead common.Hash) { // cascading background processing. Children do not need to be started, they // are notified about new events by their parents. func (c *ChainIndexer) Start(chain ChainIndexerChain) { - events := make(chan ChainEvent, 10) - sub := chain.SubscribeChainEvent(events) + events := make(chan ChainHeadEvent, 10) + sub := chain.SubscribeChainHeadEvent(events) go c.eventLoop(chain.CurrentHeader(), events, sub) } @@ -190,7 +191,7 @@ func (c *ChainIndexer) Close() error { // eventLoop is a secondary - optional - event loop of the indexer which is only // started for the outermost indexer to push chain head events into a processing // queue. -func (c *ChainIndexer) eventLoop(currentHeader *types.Header, events chan ChainEvent, sub event.Subscription) { +func (c *ChainIndexer) eventLoop(currentHeader *types.Header, events chan ChainHeadEvent, sub event.Subscription) { // Mark the chain indexer as active, requiring an additional teardown atomic.StoreUint32(&c.active, 1) @@ -219,13 +220,13 @@ func (c *ChainIndexer) eventLoop(currentHeader *types.Header, events chan ChainE } header := ev.Block.Header() if header.ParentHash != prevHash { - // Reorg to the common ancestor (might not exist in light sync mode, skip reorg then) + // Reorg to the common ancestor if needed (might not exist in light sync mode, skip reorg then) // TODO(karalabe, zsfelfoldi): This seems a bit brittle, can we detect this case explicitly? - // TODO(karalabe): This operation is expensive and might block, causing the event system to - // potentially also lock up. We need to do with on a different thread somehow. - if h := rawdb.FindCommonAncestor(c.chainDb, prevHeader, header); h != nil { - c.newHead(h.Number.Uint64(), true) + if rawdb.ReadCanonicalHash(c.chainDb, prevHeader.Number.Uint64()) != prevHash { + if h := rawdb.FindCommonAncestor(c.chainDb, prevHeader, header); h != nil { + c.newHead(h.Number.Uint64(), true) + } } } c.newHead(header.Number.Uint64(), false) @@ -243,7 +244,7 @@ func (c *ChainIndexer) newHead(head uint64, reorg bool) { // If a reorg happened, invalidate all sections until that point if reorg { // Revert the known section number to the reorg point - known := head / c.sectionSize + known := (head + 1) / c.sectionSize stored := known if known < c.checkpointSections { known = 0 @@ -323,6 +324,7 @@ func (c *ChainIndexer) updateLoop() { updated = time.Now() } // Cache the current section count and head to allow unlocking the mutex + c.verifyLastHead() section := c.storedSections var oldHead common.Hash if section > 0 { @@ -342,8 +344,8 @@ func (c *ChainIndexer) updateLoop() { } c.lock.Lock() - // If processing succeeded and no reorgs occcurred, mark the section completed - if err == nil && oldHead == c.SectionHead(section-1) { + // If processing succeeded and no reorgs occurred, mark the section completed + if err == nil && (section == 0 || oldHead == c.SectionHead(section-1)) { c.setSectionHead(section, newHead) c.setValidSections(section + 1) if c.storedSections == c.knownSections && updating { @@ -358,6 +360,7 @@ func (c *ChainIndexer) updateLoop() { } else { // If processing failed, don't retry until further notification c.log.Debug("Chain index processing failed", "section", section, "err", err) + c.verifyLastHead() c.knownSections = c.storedSections } } @@ -411,6 +414,18 @@ func (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (com return lastHead, nil } +// verifyLastHead compares last stored section head with the corresponding block hash in the +// actual canonical chain and rolls back reorged sections if necessary to ensure that stored +// sections are all valid +func (c *ChainIndexer) verifyLastHead() { + for c.storedSections > 0 && c.storedSections > c.checkpointSections { + if c.SectionHead(c.storedSections-1) == rawdb.ReadCanonicalHash(c.chainDb, c.storedSections*c.sectionSize-1) { + return + } + c.setValidSections(c.storedSections - 1) + } +} + // Sections returns the number of processed sections maintained by the indexer // and also the information about the last header indexed for potential canonical // verifications. @@ -418,6 +433,7 @@ func (c *ChainIndexer) Sections() (uint64, uint64, common.Hash) { c.lock.Lock() defer c.lock.Unlock() + c.verifyLastHead() return c.storedSections, c.storedSections*c.sectionSize - 1, c.SectionHead(c.storedSections - 1) } diff --git a/core/chain_indexer_test.go b/core/chain_indexer_test.go index a029dec62658..abf5b3cc1400 100644 --- a/core/chain_indexer_test.go +++ b/core/chain_indexer_test.go @@ -27,7 +27,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" ) // Runs multiple tests with randomized parameters. @@ -49,7 +48,7 @@ func TestChainIndexerWithChildren(t *testing.T) { // multiple backends. The section size and required confirmation count parameters // are randomized. func testChainIndexer(t *testing.T, count int) { - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() defer db.Close() // Create a chain of indexers and ensure they all report empty @@ -60,7 +59,7 @@ func testChainIndexer(t *testing.T, count int) { confirmsReq = uint64(rand.Intn(10)) ) backends[i] = &testChainIndexBackend{t: t, processCh: make(chan uint64)} - backends[i].indexer = NewChainIndexer(db, ethdb.NewTable(db, string([]byte{byte(i)})), backends[i], sectionSize, confirmsReq, 0, fmt.Sprintf("indexer-%d", i)) + backends[i].indexer = NewChainIndexer(db, rawdb.NewTable(db, string([]byte{byte(i)})), backends[i], sectionSize, confirmsReq, 0, fmt.Sprintf("indexer-%d", i)) if sections, _, _ := backends[i].indexer.Sections(); sections != 0 { t.Fatalf("Canonical section count mismatch: have %v, want %v", sections, 0) diff --git a/core/chain_makers.go b/core/chain_makers.go index 0bc453fdf369..17f4042116fa 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -33,12 +33,11 @@ import ( // BlockGen creates blocks for testing. // See GenerateChain for a detailed explanation. type BlockGen struct { - i int - parent *types.Block - chain []*types.Block - chainReader consensus.ChainReader - header *types.Header - statedb *state.StateDB + i int + parent *types.Block + chain []*types.Block + header *types.Header + statedb *state.StateDB gasPool *GasPool txs []*types.Transaction @@ -72,6 +71,13 @@ func (b *BlockGen) SetNonce(nonce types.BlockNonce) { b.header.Nonce = nonce } +// SetDifficulty sets the difficulty field of the generated block. This method is +// useful for Clique tests where the difficulty does not depend on time. For the +// ethash tests, please use OffsetTime, which implicitly recalculates the diff. +func (b *BlockGen) SetDifficulty(diff *big.Int) { + b.header.Difficulty = diff +} + // AddTx adds a transaction to the generated block. If no coinbase has // been set, the block's coinbase is set to the zero address. // @@ -105,6 +111,15 @@ func (b *BlockGen) AddTxWithChain(bc *BlockChain, tx *types.Transaction) { b.receipts = append(b.receipts, receipt) } +// AddUncheckedTx forcefully adds a transaction to the block without any +// validation. +// +// AddUncheckedTx will cause consensus failures when used during real +// chain processing. This is best used in conjunction with raw block insertion. +func (b *BlockGen) AddUncheckedTx(tx *types.Transaction) { + b.txs = append(b.txs, tx) +} + // Number returns the block number of the block being generated. func (b *BlockGen) Number() *big.Int { return new(big.Int).Set(b.header.Number) @@ -138,7 +153,7 @@ func (b *BlockGen) AddUncle(h *types.Header) { // For index -1, PrevBlock returns the parent block given to GenerateChain. func (b *BlockGen) PrevBlock(index int) *types.Block { if index >= b.i { - panic("block index out of range") + panic(fmt.Errorf("block index %d out of range (%d,%d)", index, -1, b.i)) } if index == -1 { return b.parent @@ -150,11 +165,12 @@ func (b *BlockGen) PrevBlock(index int) *types.Block { // associated difficulty. It's useful to test scenarios where forking is not // tied to chain length directly. func (b *BlockGen) OffsetTime(seconds int64) { - b.header.Time.Add(b.header.Time, new(big.Int).SetInt64(seconds)) - if b.header.Time.Cmp(b.parent.Header().Time) <= 0 { + b.header.Time += uint64(seconds) + if b.header.Time <= b.parent.Header().Time { panic("block time out of range") } - b.header.Difficulty = b.engine.CalcDifficulty(b.chainReader, b.header.Time.Uint64(), b.parent.Header()) + chainreader := &fakeChainReader{config: b.config} + b.header.Difficulty = b.engine.CalcDifficulty(chainreader, b.header.Time, b.parent.Header()) } // GenerateChain creates a chain of n blocks. The first block's @@ -174,14 +190,10 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse config = params.TestChainConfig } blocks, receipts := make(types.Blocks, n), make([]types.Receipts, n) + chainreader := &fakeChainReader{config: config} genblock := func(i int, parent *types.Block, statedb *state.StateDB) (*types.Block, types.Receipts) { - // TODO(karalabe): This is needed for clique, which depends on multiple blocks. - // It's nonetheless ugly to spin up a blockchain here. Get rid of this somehow. - blockchain, _ := NewBlockChain(db, nil, config, engine, vm.Config{}, nil) - defer blockchain.Stop() - - b := &BlockGen{i: i, parent: parent, chain: blocks, chainReader: blockchain, statedb: statedb, config: config, engine: engine} - b.header = makeHeader(b.chainReader, parent, statedb, b.engine) + b := &BlockGen{i: i, chain: blocks, parent: parent, statedb: statedb, config: config, engine: engine} + b.header = makeHeader(chainreader, parent, statedb, b.engine) // Mutate the state and block according to any hard-fork specs if daoBlock := config.DAOForkBlock; daoBlock != nil { @@ -201,7 +213,7 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse } if b.engine != nil { // Finalize and seal the block - block, _ := b.engine.Finalize(b.chainReader, b.header, statedb, b.txs, b.uncles, b.receipts) + block, _ := b.engine.FinalizeAndAssemble(chainreader, b.header, statedb, b.txs, b.uncles, b.receipts) // Write state changes to db root, err := statedb.Commit(config.IsEIP158(b.header.Number)) @@ -229,20 +241,20 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse } func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.StateDB, engine consensus.Engine) *types.Header { - var time *big.Int - if parent.Time() == nil { - time = big.NewInt(10) + var time uint64 + if parent.Time() == 0 { + time = 10 } else { - time = new(big.Int).Add(parent.Time(), big.NewInt(10)) // block time is fixed at 10 seconds + time = parent.Time() + 10 // block time is fixed at 10 seconds } return &types.Header{ Root: state.IntermediateRoot(chain.Config().IsEIP158(parent.Number())), ParentHash: parent.Hash(), Coinbase: parent.Coinbase(), - Difficulty: engine.CalcDifficulty(chain, time.Uint64(), &types.Header{ + Difficulty: engine.CalcDifficulty(chain, time, &types.Header{ Number: parent.Number(), - Time: new(big.Int).Sub(time, big.NewInt(10)), + Time: time - 10, Difficulty: parent.Difficulty(), UncleHash: parent.UncleHash(), }), @@ -269,3 +281,19 @@ func makeBlockChain(parent *types.Block, n int, engine consensus.Engine, db ethd }) return blocks } + +type fakeChainReader struct { + config *params.ChainConfig + genesis *types.Block +} + +// Config returns the chain configuration. +func (cr *fakeChainReader) Config() *params.ChainConfig { + return cr.config +} + +func (cr *fakeChainReader) CurrentHeader() *types.Header { return nil } +func (cr *fakeChainReader) GetHeaderByNumber(number uint64) *types.Header { return nil } +func (cr *fakeChainReader) GetHeaderByHash(hash common.Hash) *types.Header { return nil } +func (cr *fakeChainReader) GetHeader(hash common.Hash, number uint64) *types.Header { return nil } +func (cr *fakeChainReader) GetBlock(hash common.Hash, number uint64) *types.Block { return nil } diff --git a/core/chain_makers_test.go b/core/chain_makers_test.go index 64b64fd6a355..32e3888d55ce 100644 --- a/core/chain_makers_test.go +++ b/core/chain_makers_test.go @@ -21,10 +21,10 @@ import ( "math/big" "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" ) @@ -36,7 +36,7 @@ func ExampleGenerateChain() { addr1 = crypto.PubkeyToAddress(key1.PublicKey) addr2 = crypto.PubkeyToAddress(key2.PublicKey) addr3 = crypto.PubkeyToAddress(key3.PublicKey) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() ) // Ensure that key1 has some funds in the genesis block. diff --git a/core/dao_test.go b/core/dao_test.go index 966139bce302..4e8dba9e8488 100644 --- a/core/dao_test.go +++ b/core/dao_test.go @@ -21,8 +21,8 @@ import ( "testing" "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" ) @@ -32,13 +32,13 @@ func TestDAOForkRangeExtradata(t *testing.T) { forkBlock := big.NewInt(32) // Generate a common prefix for both pro-forkers and non-forkers - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() gspec := new(Genesis) genesis := gspec.MustCommit(db) prefix, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, int(forkBlock.Int64()-1), func(i int, gen *BlockGen) {}) // Create the concurrent, conflicting two nodes - proDb := ethdb.NewMemDatabase() + proDb := rawdb.NewMemoryDatabase() gspec.MustCommit(proDb) proConf := *params.TestChainConfig @@ -48,7 +48,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { proBc, _ := NewBlockChain(proDb, nil, &proConf, ethash.NewFaker(), vm.Config{}, nil) defer proBc.Stop() - conDb := ethdb.NewMemDatabase() + conDb := rawdb.NewMemoryDatabase() gspec.MustCommit(conDb) conConf := *params.TestChainConfig @@ -67,7 +67,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Try to expand both pro-fork and non-fork chains iteratively with other camp's blocks for i := int64(0); i < params.DAOForkExtraRange.Int64(); i++ { // Create a pro-fork block, and try to feed into the no-fork chain - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec.MustCommit(db) bc, _ := NewBlockChain(db, nil, &conConf, ethash.NewFaker(), vm.Config{}, nil) defer bc.Stop() @@ -92,7 +92,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { t.Fatalf("contra-fork chain didn't accepted no-fork block: %v", err) } // Create a no-fork block, and try to feed into the pro-fork chain - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec.MustCommit(db) bc, _ = NewBlockChain(db, nil, &proConf, ethash.NewFaker(), vm.Config{}, nil) defer bc.Stop() @@ -118,7 +118,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { } } // Verify that contra-forkers accept pro-fork extra-datas after forking finishes - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec.MustCommit(db) bc, _ := NewBlockChain(db, nil, &conConf, ethash.NewFaker(), vm.Config{}, nil) defer bc.Stop() @@ -138,7 +138,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { t.Fatalf("contra-fork chain didn't accept pro-fork block post-fork: %v", err) } // Verify that pro-forkers accept contra-fork extra-datas after forking finishes - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec.MustCommit(db) bc, _ = NewBlockChain(db, nil, &proConf, ethash.NewFaker(), vm.Config{}, nil) defer bc.Stop() diff --git a/core/error.go b/core/error.go index 410eca1e1ea0..cd4be3d705e1 100644 --- a/core/error.go +++ b/core/error.go @@ -32,4 +32,7 @@ var ( // ErrNonceTooHigh is returned if the nonce of a transaction is higher than the // next one expected based on the local chain. ErrNonceTooHigh = errors.New("nonce too high") + + // ErrNoGenesis is returned when there is no Genesis Block. + ErrNoGenesis = errors.New("genesis not found in chain") ) diff --git a/core/evm.go b/core/evm.go index d303c40a4074..b654bbd4796f 100644 --- a/core/evm.go +++ b/core/evm.go @@ -51,7 +51,7 @@ func NewEVMContext(msg Message, header *types.Header, chain ChainContext, author Origin: msg.From(), Coinbase: beneficiary, BlockNumber: new(big.Int).Set(header.Number), - Time: new(big.Int).Set(header.Time), + Time: new(big.Int).SetUint64(header.Time), Difficulty: new(big.Int).Set(header.Difficulty), GasLimit: header.GasLimit, GasPrice: new(big.Int).Set(msg.GasPrice()), diff --git a/core/forkid/forkid.go b/core/forkid/forkid.go new file mode 100644 index 000000000000..8c1700879a5e --- /dev/null +++ b/core/forkid/forkid.go @@ -0,0 +1,236 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package forkid implements EIP-2124 (https://eips.ethereum.org/EIPS/eip-2124). +package forkid + +import ( + "encoding/binary" + "errors" + "hash/crc32" + "math" + "math/big" + "reflect" + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +var ( + // ErrRemoteStale is returned by the validator if a remote fork checksum is a + // subset of our already applied forks, but the announced next fork block is + // not on our already passed chain. + ErrRemoteStale = errors.New("remote needs update") + + // ErrLocalIncompatibleOrStale is returned by the validator if a remote fork + // checksum does not match any local checksum variation, signalling that the + // two chains have diverged in the past at some point (possibly at genesis). + ErrLocalIncompatibleOrStale = errors.New("local incompatible or needs update") +) + +// ID is a fork identifier as defined by EIP-2124. +type ID struct { + Hash [4]byte // CRC32 checksum of the genesis block and passed fork block numbers + Next uint64 // Block number of the next upcoming fork, or 0 if no forks are known +} + +// NewID calculates the Ethereum fork ID from the chain config and head. +func NewID(chain *core.BlockChain) ID { + return newID( + chain.Config(), + chain.Genesis().Hash(), + chain.CurrentHeader().Number.Uint64(), + ) +} + +// newID is the internal version of NewID, which takes extracted values as its +// arguments instead of a chain. The reason is to allow testing the IDs without +// having to simulate an entire blockchain. +func newID(config *params.ChainConfig, genesis common.Hash, head uint64) ID { + // Calculate the starting checksum from the genesis hash + hash := crc32.ChecksumIEEE(genesis[:]) + + // Calculate the current fork checksum and the next fork block + var next uint64 + for _, fork := range gatherForks(config) { + if fork <= head { + // Fork already passed, checksum the previous hash and the fork number + hash = checksumUpdate(hash, fork) + continue + } + next = fork + break + } + return ID{Hash: checksumToBytes(hash), Next: next} +} + +// NewFilter creates an filter that returns if a fork ID should be rejected or not +// based on the local chain's status. +func NewFilter(chain *core.BlockChain) func(id ID) error { + return newFilter( + chain.Config(), + chain.Genesis().Hash(), + func() uint64 { + return chain.CurrentHeader().Number.Uint64() + }, + ) +} + +// newFilter is the internal version of NewFilter, taking closures as its arguments +// instead of a chain. The reason is to allow testing it without having to simulate +// an entire blockchain. +func newFilter(config *params.ChainConfig, genesis common.Hash, headfn func() uint64) func(id ID) error { + // Calculate the all the valid fork hash and fork next combos + var ( + forks = gatherForks(config) + sums = make([][4]byte, len(forks)+1) // 0th is the genesis + ) + hash := crc32.ChecksumIEEE(genesis[:]) + sums[0] = checksumToBytes(hash) + for i, fork := range forks { + hash = checksumUpdate(hash, fork) + sums[i+1] = checksumToBytes(hash) + } + // Add two sentries to simplify the fork checks and don't require special + // casing the last one. + forks = append(forks, math.MaxUint64) // Last fork will never be passed + + // Create a validator that will filter out incompatible chains + return func(id ID) error { + // Run the fork checksum validation ruleset: + // 1. If local and remote FORK_CSUM matches, connect. + // The two nodes are in the same fork state currently. They might know + // of differing future forks, but that's not relevant until the fork + // triggers (might be postponed, nodes might be updated to match). + // 2. If the remote FORK_CSUM is a subset of the local past forks and the + // remote FORK_NEXT matches with the locally following fork block number, + // connect. + // Remote node is currently syncing. It might eventually diverge from + // us, but at this current point in time we don't have enough information. + // 3. If the remote FORK_CSUM is a superset of the local past forks and can + // be completed with locally known future forks, connect. + // Local node is currently syncing. It might eventually diverge from + // the remote, but at this current point in time we don't have enough + // information. + // 4. Reject in all other cases. + head := headfn() + for i, fork := range forks { + // If our head is beyond this fork, continue to the next (we have a dummy + // fork of maxuint64 as the last item to always fail this check eventually). + if head > fork { + continue + } + // Found the first unpassed fork block, check if our current state matches + // the remote checksum (rule #1). + if sums[i] == id.Hash { + // Yay, fork checksum matched, ignore any upcoming fork + return nil + } + // The local and remote nodes are in different forks currently, check if the + // remote checksum is a subset of our local forks (rule #2). + for j := 0; j < i; j++ { + if sums[j] == id.Hash { + // Remote checksum is a subset, validate based on the announced next fork + if forks[j] != id.Next { + return ErrRemoteStale + } + return nil + } + } + // Remote chain is not a subset of our local one, check if it's a superset by + // any chance, signalling that we're simply out of sync (rule #3). + for j := i + 1; j < len(sums); j++ { + if sums[j] == id.Hash { + // Yay, remote checksum is a superset, ignore upcoming forks + return nil + } + } + // No exact, subset or superset match. We are on differing chains, reject. + return ErrLocalIncompatibleOrStale + } + log.Error("Impossible fork ID validation", "id", id) + return nil // Something's very wrong, accept rather than reject + } +} + +// checksum calculates the IEEE CRC32 checksum of a block number. +func checksum(fork uint64) uint32 { + var blob [8]byte + binary.BigEndian.PutUint64(blob[:], fork) + return crc32.ChecksumIEEE(blob[:]) +} + +// checksumUpdate calculates the next IEEE CRC32 checksum based on the previous +// one and a fork block number (equivalent to CRC32(original-blob || fork)). +func checksumUpdate(hash uint32, fork uint64) uint32 { + var blob [8]byte + binary.BigEndian.PutUint64(blob[:], fork) + return crc32.Update(hash, crc32.IEEETable, blob[:]) +} + +// checksumToBytes converts a uint32 checksum into a [4]byte array. +func checksumToBytes(hash uint32) [4]byte { + var blob [4]byte + binary.BigEndian.PutUint32(blob[:], hash) + return blob +} + +// gatherForks gathers all the known forks and creates a sorted list out of them. +func gatherForks(config *params.ChainConfig) []uint64 { + // Gather all the fork block numbers via reflection + kind := reflect.TypeOf(params.ChainConfig{}) + conf := reflect.ValueOf(config).Elem() + + var forks []uint64 + for i := 0; i < kind.NumField(); i++ { + // Fetch the next field and skip non-fork rules + field := kind.Field(i) + if !strings.HasSuffix(field.Name, "Block") { + continue + } + if field.Type != reflect.TypeOf(new(big.Int)) { + continue + } + // Extract the fork rule block number and aggregate it + rule := conf.Field(i).Interface().(*big.Int) + if rule != nil { + forks = append(forks, rule.Uint64()) + } + } + // Sort the fork block numbers to permit chronologival XOR + for i := 0; i < len(forks); i++ { + for j := i + 1; j < len(forks); j++ { + if forks[i] > forks[j] { + forks[i], forks[j] = forks[j], forks[i] + } + } + } + // Deduplicate block numbers applying multiple forks + for i := 1; i < len(forks); i++ { + if forks[i] == forks[i-1] { + forks = append(forks[:i], forks[i+1:]...) + i-- + } + } + // Skip any forks in block 0, that's the genesis ruleset + if len(forks) > 0 && forks[0] == 0 { + forks = forks[1:] + } + return forks +} diff --git a/core/forkid/forkid_test.go b/core/forkid/forkid_test.go new file mode 100644 index 000000000000..b33f85bec7ab --- /dev/null +++ b/core/forkid/forkid_test.go @@ -0,0 +1,205 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package forkid + +import ( + "bytes" + "math" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" +) + +// TestCreation tests that different genesis and fork rule combinations result in +// the correct fork ID. +func TestCreation(t *testing.T) { + type testcase struct { + head uint64 + want ID + } + tests := []struct { + config *params.ChainConfig + genesis common.Hash + cases []testcase + }{ + // Mainnet test cases + { + params.MainnetChainConfig, + params.MainnetGenesisHash, + []testcase{ + {0, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Unsynced + {1149999, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Last Frontier block + {1150000, ID{Hash: checksumToBytes(0x97c2c34c), Next: 1920000}}, // First Homestead block + {1919999, ID{Hash: checksumToBytes(0x97c2c34c), Next: 1920000}}, // Last Homestead block + {1920000, ID{Hash: checksumToBytes(0x91d1f948), Next: 2463000}}, // First DAO block + {2462999, ID{Hash: checksumToBytes(0x91d1f948), Next: 2463000}}, // Last DAO block + {2463000, ID{Hash: checksumToBytes(0x7a64da13), Next: 2675000}}, // First Tangerine block + {2674999, ID{Hash: checksumToBytes(0x7a64da13), Next: 2675000}}, // Last Tangerine block + {2675000, ID{Hash: checksumToBytes(0x3edd5b10), Next: 4370000}}, // First Spurious block + {4369999, ID{Hash: checksumToBytes(0x3edd5b10), Next: 4370000}}, // Last Spurious block + {4370000, ID{Hash: checksumToBytes(0xa00bc324), Next: 7280000}}, // First Byzantium block + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 7280000}}, // Last Byzantium block + {7280000, ID{Hash: checksumToBytes(0x668db0af), Next: 0}}, // First and last Constantinople, first Petersburg block + {7987396, ID{Hash: checksumToBytes(0x668db0af), Next: 0}}, // Today Petersburg block + }, + }, + // Ropsten test cases + { + params.TestnetChainConfig, + params.TestnetGenesisHash, + []testcase{ + {0, ID{Hash: checksumToBytes(0x30c7ddbc), Next: 10}}, // Unsynced, last Frontier, Homestead and first Tangerine block + {9, ID{Hash: checksumToBytes(0x30c7ddbc), Next: 10}}, // Last Tangerine block + {10, ID{Hash: checksumToBytes(0x63760190), Next: 1700000}}, // First Spurious block + {1699999, ID{Hash: checksumToBytes(0x63760190), Next: 1700000}}, // Last Spurious block + {1700000, ID{Hash: checksumToBytes(0x3ea159c7), Next: 4230000}}, // First Byzantium block + {4229999, ID{Hash: checksumToBytes(0x3ea159c7), Next: 4230000}}, // Last Byzantium block + {4230000, ID{Hash: checksumToBytes(0x97b544f3), Next: 4939394}}, // First Constantinople block + {4939393, ID{Hash: checksumToBytes(0x97b544f3), Next: 4939394}}, // Last Constantinople block + {4939394, ID{Hash: checksumToBytes(0xd6e2149b), Next: 0}}, // First Petersburg block + {5822692, ID{Hash: checksumToBytes(0xd6e2149b), Next: 0}}, // Today Petersburg block + }, + }, + // Rinkeby test cases + { + params.RinkebyChainConfig, + params.RinkebyGenesisHash, + []testcase{ + {0, ID{Hash: checksumToBytes(0x3b8e0691), Next: 1}}, // Unsynced, last Frontier block + {1, ID{Hash: checksumToBytes(0x60949295), Next: 2}}, // First and last Homestead block + {2, ID{Hash: checksumToBytes(0x8bde40dd), Next: 3}}, // First and last Tangerine block + {3, ID{Hash: checksumToBytes(0xcb3a64bb), Next: 1035301}}, // First Spurious block + {1035300, ID{Hash: checksumToBytes(0xcb3a64bb), Next: 1035301}}, // Last Spurious block + {1035301, ID{Hash: checksumToBytes(0x8d748b57), Next: 3660663}}, // First Byzantium block + {3660662, ID{Hash: checksumToBytes(0x8d748b57), Next: 3660663}}, // Last Byzantium block + {3660663, ID{Hash: checksumToBytes(0xe49cab14), Next: 4321234}}, // First Constantinople block + {4321233, ID{Hash: checksumToBytes(0xe49cab14), Next: 4321234}}, // Last Constantinople block + {4321234, ID{Hash: checksumToBytes(0xafec6b27), Next: 0}}, // First Petersburg block + {4586649, ID{Hash: checksumToBytes(0xafec6b27), Next: 0}}, // Today Petersburg block + }, + }, + // Goerli test cases + { + params.GoerliChainConfig, + params.GoerliGenesisHash, + []testcase{ + {0, ID{Hash: checksumToBytes(0xa3f5ab08), Next: 0}}, // Unsynced, last Frontier, Homestead, Tangerine, Spurious, Byzantium, Constantinople and first Petersburg block + {795329, ID{Hash: checksumToBytes(0xa3f5ab08), Next: 0}}, // Today Petersburg block + }, + }, + } + for i, tt := range tests { + for j, ttt := range tt.cases { + if have := newID(tt.config, tt.genesis, ttt.head); have != ttt.want { + t.Errorf("test %d, case %d: fork ID mismatch: have %x, want %x", i, j, have, ttt.want) + } + } + } +} + +// TestValidation tests that a local peer correctly validates and accepts a remote +// fork ID. +func TestValidation(t *testing.T) { + tests := []struct { + head uint64 + id ID + err error + }{ + // Local is mainnet Petersburg, remote announces the same. No future fork is announced. + {7987396, ID{Hash: checksumToBytes(0x668db0af), Next: 0}, nil}, + + // Local is mainnet Petersburg, remote announces the same. Remote also announces a next fork + // at block 0xffffffff, but that is uncertain. + {7987396, ID{Hash: checksumToBytes(0x668db0af), Next: math.MaxUint64}, nil}, + + // Local is mainnet currently in Byzantium only (so it's aware of Petersburg), remote announces + // also Byzantium, but it's not yet aware of Petersburg (e.g. non updated node before the fork). + // In this case we don't know if Petersburg passed yet or not. + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 0}, nil}, + + // Local is mainnet currently in Byzantium only (so it's aware of Petersburg), remote announces + // also Byzantium, and it's also aware of Petersburg (e.g. updated node before the fork). We + // don't know if Petersburg passed yet (will pass) or not. + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 7280000}, nil}, + + // Local is mainnet currently in Byzantium only (so it's aware of Petersburg), remote announces + // also Byzantium, and it's also aware of some random fork (e.g. misconfigured Petersburg). As + // neither forks passed at neither nodes, they may mismatch, but we still connect for now. + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: math.MaxUint64}, nil}, + + // Local is mainnet Petersburg, remote announces Byzantium + knowledge about Petersburg. Remote + // is simply out of sync, accept. + {7987396, ID{Hash: checksumToBytes(0x668db0af), Next: 7280000}, nil}, + + // Local is mainnet Petersburg, remote announces Spurious + knowledge about Byzantium. Remote + // is definitely out of sync. It may or may not need the Petersburg update, we don't know yet. + {7987396, ID{Hash: checksumToBytes(0x3edd5b10), Next: 4370000}, nil}, + + // Local is mainnet Byzantium, remote announces Petersburg. Local is out of sync, accept. + {7279999, ID{Hash: checksumToBytes(0x668db0af), Next: 0}, nil}, + + // Local is mainnet Spurious, remote announces Byzantium, but is not aware of Petersburg. Local + // out of sync. Local also knows about a future fork, but that is uncertain yet. + {4369999, ID{Hash: checksumToBytes(0xa00bc324), Next: 0}, nil}, + + // Local is mainnet Petersburg. remote announces Byzantium but is not aware of further forks. + // Remote needs software update. + {7987396, ID{Hash: checksumToBytes(0xa00bc324), Next: 0}, ErrRemoteStale}, + + // Local is mainnet Petersburg, and isn't aware of more forks. Remote announces Petersburg + + // 0xffffffff. Local needs software update, reject. + {7987396, ID{Hash: checksumToBytes(0x5cddc0e1), Next: 0}, ErrLocalIncompatibleOrStale}, + + // Local is mainnet Byzantium, and is aware of Petersburg. Remote announces Petersburg + + // 0xffffffff. Local needs software update, reject. + {7279999, ID{Hash: checksumToBytes(0x5cddc0e1), Next: 0}, ErrLocalIncompatibleOrStale}, + + // Local is mainnet Petersburg, remote is Rinkeby Petersburg. + {7987396, ID{Hash: checksumToBytes(0xafec6b27), Next: 0}, ErrLocalIncompatibleOrStale}, + } + for i, tt := range tests { + filter := newFilter(params.MainnetChainConfig, params.MainnetGenesisHash, func() uint64 { return tt.head }) + if err := filter(tt.id); err != tt.err { + t.Errorf("test %d: validation error mismatch: have %v, want %v", i, err, tt.err) + } + } +} + +// Tests that IDs are properly RLP encoded (specifically important because we +// use uint32 to store the hash, but we need to encode it as [4]byte). +func TestEncoding(t *testing.T) { + tests := []struct { + id ID + want []byte + }{ + {ID{Hash: checksumToBytes(0), Next: 0}, common.Hex2Bytes("c6840000000080")}, + {ID{Hash: checksumToBytes(0xdeadbeef), Next: 0xBADDCAFE}, common.Hex2Bytes("ca84deadbeef84baddcafe,")}, + {ID{Hash: checksumToBytes(math.MaxUint32), Next: math.MaxUint64}, common.Hex2Bytes("ce84ffffffff88ffffffffffffffff")}, + } + for i, tt := range tests { + have, err := rlp.EncodeToBytes(tt.id) + if err != nil { + t.Errorf("test %d: failed to encode forkid: %v", i, err) + continue + } + if !bytes.Equal(have, tt.want) { + t.Errorf("test %d: RLP mismatch: have %x, want %x", i, have, tt.want) + } + } +} diff --git a/core/genesis.go b/core/genesis.go index 6e71afd61c64..87bab2520159 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -134,7 +134,7 @@ type GenesisMismatchError struct { } func (e *GenesisMismatchError) Error() string { - return fmt.Sprintf("database already contains an incompatible genesis block (have %x, new %x)", e.Stored[:8], e.New[:8]) + return fmt.Sprintf("database contains incompatible genesis (have %x, new %x)", e.Stored, e.New) } // SetupGenesisBlock writes or updates the genesis block in db. @@ -154,7 +154,6 @@ func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig if genesis != nil && genesis.Config == nil { return params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig } - // Just commit the new block if there is no stored genesis block. stored := rawdb.ReadCanonicalHash(db, 0) if (stored == common.Hash{}) { @@ -165,7 +164,29 @@ func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig log.Info("Writing custom genesis block") } block, err := genesis.Commit(db) - return genesis.Config, block.Hash(), err + if err != nil { + return genesis.Config, common.Hash{}, err + } + return genesis.Config, block.Hash(), nil + } + + // We have the genesis block in database(perhaps in ancient database) + // but the corresponding state is missing. + header := rawdb.ReadHeader(db, stored, 0) + if _, err := state.New(header.Root, state.NewDatabaseWithCache(db, 0)); err != nil { + if genesis == nil { + genesis = DefaultGenesisBlock() + } + // Ensure the stored genesis matches with the given one. + hash := genesis.ToBlock(nil).Hash() + if hash != stored { + return genesis.Config, hash, &GenesisMismatchError{stored, hash} + } + block, err := genesis.Commit(db) + if err != nil { + return genesis.Config, hash, err + } + return genesis.Config, block.Hash(), nil } // Check whether the genesis block is already written. @@ -222,7 +243,7 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { // to the given database (or discards it if nil). func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { if db == nil { - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() } statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) for addr, account := range g.Alloc { @@ -237,7 +258,7 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { head := &types.Header{ Number: new(big.Int).SetUint64(g.Number), Nonce: types.EncodeNonce(g.Nonce), - Time: new(big.Int).SetUint64(g.Timestamp), + Time: g.Timestamp, ParentHash: g.ParentHash, Extra: g.ExtraData, GasLimit: g.GasLimit, @@ -271,6 +292,7 @@ func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) { rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil) rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64()) rawdb.WriteHeadBlockHash(db, block.Hash()) + rawdb.WriteHeadFastBlockHash(db, block.Hash()) rawdb.WriteHeadHeaderHash(db, block.Hash()) config := g.Config @@ -333,6 +355,18 @@ func DefaultRinkebyGenesisBlock() *Genesis { } } +// DefaultGoerliGenesisBlock returns the Görli network genesis block. +func DefaultGoerliGenesisBlock() *Genesis { + return &Genesis{ + Config: params.GoerliChainConfig, + Timestamp: 1548854791, + ExtraData: hexutil.MustDecode("0x22466c6578692069732061207468696e6722202d204166726900000000000000e0a2bd4258d2768837baa26a28fe71dc079f84c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + GasLimit: 10485760, + Difficulty: big.NewInt(1), + Alloc: decodePrealloc(goerliAllocData), + } +} + // DeveloperGenesisBlock returns the 'geth --dev' genesis block. Note, this must // be seeded with the func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { diff --git a/core/genesis_alloc.go b/core/genesis_alloc.go index 4cb7d6839ff9..81477a6f6b29 100644 --- a/core/genesis_alloc.go +++ b/core/genesis_alloc.go @@ -24,3 +24,4 @@ package core const mainnetAllocData = "\xfa\x04]X\u0793\r\x83b\x011\x8e\u0189\x9agT\x06\x908'\x80t2\x80\x89\n\u05ce\xbcZ\xc6 \x00\x00\u0793\x17bC\x0e\xa9\u00e2nWI\xaf\xdbp\xda_x\u077b\x8c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u0793\x1d\x14\x80K9\x9cn\xf8\x0edWoev`\x80O\xec\v\x89\u3bb5sr@\xa0\x00\x00\u07932@5\x87\x94{\x9f\x15b*h\xd1\x04\xd5M3\xdb\xd1\u0349\x043\x87Oc,\xc6\x00\x00\u0793I~\x92\xcd\xc0\xe0\xb9c\xd7R\xb2)j\u02c7\u0682\x8b$\x89\n\x8fd\x9f\xe7\xc6\x18\x00\x00\u0793K\xfb\xe1Tk\xc6\xc6[\\~\xaaU0K8\xbb\xfe\xc6\u04c9lk\x93[\x8b\xbd@\x00\x00\u0793Z\x9c\x03\xf6\x9d\x17\xd6l\xbb\x8a\xd7!\x00\x8a\x9e\xbb\xb86\xfb\x89lk\x93[\x8b\xbd@\x00\x00\u0793]\x0e\xe8\x15^\xc0\xa6\xffh\bU,\xa5\xf1k\xb5\xbe2:\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u0793v\"\xd8J#K\xb8\xb0x#\x0f\u03c4\xb6z\u9a2c\xae\x89%\xe1\xccQ\x99R\xf8\x00\x00\u0793{\x9f\xc3\x19\x05\xb4\x99K\x04\xc9\xe2\xcf\xdc^'pP?B\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u0793\u007fJ#\xca\x00\xcd\x04=%\u0088\x8c\x1a\xa5h\x8f\x81\xa3D\x89)\xf0\xa9[\xfb\xf7)\x00\x00\u0793\x869\u06bb\u3bac\x88{]\xc0\xe4>\x13\xbc\u0487\xd7l\x89\x10\xd0\xe3\xc8}n,\x00\x00\u0793\x89P\x86y\xab\xf8\xc7\x1b\xf6x\x16\x87\x12\x0e>j\x84XM\x89a\x94\x04\x9f0\xf7 \x00\x00\u0793\x8f\xc7\u02ed\xff\xbd\r\u007f\xe4O\x8d\xfd`\xa7\x9dr\x1a\x1c\x9c\x8965\u026d\xc5\u07a0\x00\x00\u0793\x95`\xa3\xdebxh\xf9\x1f\xa8\xbf\xe1\xc1\xb7\xaf\xaf\b\x18k\x89\x1cg\xf5\xf7\xba\xa0\xb0\x00\x00\u0793\x96\x97G\xf7\xa5\xb3\x06E\xfe\x00\xe4I\x01CZ\xce$\xcc7\x89\\(=A\x03\x94\x10\x00\x00\u0793\x9am}\xb3&g\x9bw\xc9\x03\x91\xa7Gm#\x8f;\xa3>\x89\n\xdaUGK\x814\x00\x00\u0793\x9e\xef\n\b\x86\x05n?i!\x18S\xb9\xb7E\u007f7\x82\u4262\xa8x\x06\x9b(\xe0\x00\x00\u0793\x9f\xdb\xf4N\x1fJcb\xb7i\u00daG_\x95\xa9l+\u01c9\x1e\x93\x12\x83\xcc\xc8P\x00\x00\u07d3\xa5y\u007fR\xc9\u054f\x18\x9f6\xb1\xd4]\x1b\xf6\x04\x1f/k\x8a\x01'\u0473F\x1a\xcd\x1a\x00\x00\u0793\xaaS\x81\xb2\x13\x8e\xbe\xff\xc1\x91\xd5\xd8\u00d1u;p\x98\u04895\xab\xb0\x9f\xfe\u07b6\x80\x00\u0793\xaa\xda%\xea\"\x86p\x9a\xbbB-A\x92?\u04c0\xcd\x04\u01c9#=\xf3)\x9far\x00\x00\u0793\xac\xbf\xb2\xf2ZT\x85\xc79\xefp\xa4N\xee\xeb|e\xa6o\x89\x05k\xc7^-c\x10\x00\x00\u07d3\xac\xc6\xf0\x82\xa4B\x82\x87d\xd1\x1fX\u0589J\xe4\b\xf0s\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u0793\xb2w\xb0\x99\xa8\xe8f\xca\x0e\xc6[\u02c7(O\xd1B\xa5\x82\x89j\xcb=\xf2~\x1f\x88\x00\x00\u0753\xbd\xd4\x01:\xa3\x1c\x04al+\xc9x_'\x88\xf9\x15g\x9b\x88\xb9\xf6]\x00\xf6<\x00\x00\u0793\xc2}c\xfd\xe2K\x92\xee\x8a\x1e~\xd5\xd2m\x8d\xc5\xc8;\x03\x89lk\x93[\x8b\xbd@\x00\x00\u0553\xc4\x0f\xe2\tT#P\x9b\x9f\u0677T21X\xaf#\x10\xf3\x80\u0793\xd7^\xd6\fwO\x8b:ZQs\xfb\x183\xadq\x05\xa2\u0649l\xb7\xe7Hg\xd5\xe6\x00\x00\u07d3\u05cd\x89\xb3_G'\x16\xec\xea\xfe\xbf`\x05'\u04e1\xf9i\x8a\x05\xe0T\x9c\x962\xe1\xd8\x00\x00\u0793\xda\xe2{5\v\xae \xc5e!$\xaf]\x8b\\\xba\x00\x1e\xc1\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u0793\xdc\x01\xcb\xf4Ix\xa4.\x8d\xe8\xe46\xed\xf9B\x05\u03f6\xec\x89O\x0f\xeb\xbc\u068c\xb4\x00\x00\u07d3\u607c-\x10\xdbb\u0785\x84\x83$I\"P4\x8e\x90\xbf\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d3\xf4c\xe17\xdc\xf6%\xfb\U000fc8de\u0298\u04b9h\xcf\u007f\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4\x01\x00\a9K\x8bue\xa1e\x8a\xf8\x8c\xe4cI\x915\u05b7\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x01\r\xf1\xdfK\xed#v\r-\x1c\x03x\x15\x86\xdd\xf7\x91\x8eT\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94\x01\x0fJ\x98\u07e1\xd9y\x9b\xf5\u01d6\xfbU\x0e\xfb\xe7\xec\xd8w\x8a\x01\xb2\xf2\x92#b\x92\xc7\x00\x00\u07d4\x01\x15PW\x00/k\r\x18\xac\xb98\x8d;\xc8\x12\x9f\x8fz \x89H\xa4\xa9\x0f\xb4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x01k`\xbbmg\x92\x8c)\xfd\x03\x13\xc6f\u068f\x16\x98\xd9\u0149lk\x93[\x8b\xbd@\x00\x00\u07d4\x01l\x85\xe1a;\x90\x0f\xa3W\xb8(;\x12\x0ee\xae\xfc\xdd\b\x89+]\x97\x84\xa9|\xd5\x00\x00\u07d4\x01\x84\x92H\x8b\xa1\xa2\x924\"G\xb3\x18U\xa5Y\x05\xfe\xf2i\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\x01\x8f \xa2{'\xecD\x1a\xf7#\xfd\x90\x99\xf2\u02f7\x9dbc\x89uy*\x8a\xbd\xef|\x00\x00\u07d4\x01\x91\xebT~{\xf6\x97k\x9b\x1bWuFv\x1d\xe6V\"\xe2\x89lkLM\xa6\u077e\x00\x00\u07d4\x01\x9dp\x95y\xffK\xc0\x9f\xdc\xdd\xe41\xdc\x14G\xd2\xc2`\xbc\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x01\xa2Z_Z\xf0\x16\x9b0\x86L;\xe4\xd7V<\xcdD\xf0\x9e\x89M\x85<\x8f\x89\b\x98\x00\x00\xe0\x94\x01\xa7\xd9\xfa}\x0e\xb1\x18\\g\xe5M\xa8<.u\xdbi\u37ca\x01\x9dJ\xdd\xd0\u063c\x96\x00\x00\u07d4\x01\xa8\x18\x13ZAB\x10\xc3|b\xb6%\xac\xa1\xa5F\x11\xac6\x89\x0e\x189\x8ev\x01\x90\x00\x00\u07d4\x01\xb1\xca\xe9\x1a;\x95Y\xaf\xb3<\xdcmh\x94B\xfd\xbf\xe07\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x01\xb5\xb5\xbcZ\x11\u007f\xa0\x8b4\xed\x1d\xb9D\x06\bYz\xc5H\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x01\xbb\xc1Og\xaf\x069\xaa\xb1D\x1ej\b\xd4\xceqb\t\x0f\x89F\xfc\xf6\x8f\xf8\xbe\x06\x00\x00\xe0\x94\x01\xd08\x15\xc6\x1fAkq\xa2a\n-\xab\xa5\x9f\xf6\xa6\xde[\x8a\x02\x05\xdf\xe5\v\x81\xc8.\x00\x00\u07d4\x01\u0559\xee\r_\x8c8\xab-9.,e\xb7L<\xe3\x18 \x89\x1b\xa5\xab\xf9\xe7y8\x00\x00\u07d4\x01\xe4\x05!\x12%0\u066c\x91\x11<\x06\xa0\x19\vmc\x85\v\x89Hz\x9a0E9D\x00\x00\u07d4\x01\xe6A]X{\x06T\x90\xf1\xed\u007f!\xd6\xe0\xf3\x86\xeegG\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x01\xe8d\xd3Tt\x1bB>oB\x85\x17$F\x8ct\xf5\xaa\x9c\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x01\xed_\xba\x8d.\xabg:\xec\x04-0\xe4\xe8\xa6\x11\xd8\xc5Z\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x01\xfb\x8e\xc1$%\xa0O\x81>F\xc5L\x05t\x8c\xa6\xb2\x9a\xa9\x89\x0e\x15s\x03\x85F|\x00\x00\u07d4\x01\xff\x1e\xb1\u07adP\xa7\xf2\xf9c\x8f\xde\xe6\xec\xcf:{*\u0209 \x86\xac5\x10R`\x00\x00\u07d4\x02\x03b\u00ed\xe8x\u0290\u05b2\u0609\xa4\xccU\x10\xee\xd5\xf3\x898\x88\xe8\xb3\x11\xad\xb3\x80\x00\u07d4\x02\x03\xae\x01\xd4\xc4\x1c\xae\x18e\xe0K\x1f[S\xcd\xfa\xec\xae1\x896\x89\xcd\u03b2\x8c\xd7\x00\x00\u07d4\x02\b\x93a\xa3\xfetQ\xfb\x1f\x87\xf0\x1a-\x86fS\xdc\v\a\x89\x02*\xc7H2\xb5\x04\x00\x00\u07d4\x02\x1fi\x04=\xe8\x8cI\x17\xca\x10\xf1\x84(\x97\xee\xc0X\x9c|\x89kD\u03f8\x14\x87\xf4\x00\x00\u07d4\x02)\x0f\xb5\xf9\xa5\x17\xf8(E\xac\xde\xca\x0f\xc8F\x03\x9b\xe23\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x029\xb4\xf2\x1f\x8e\x05\xcd\x01Q++\xe7\xa0\xe1\x8am\x97F\a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x02Gr\x12\xff\xddu\xe5\x15VQ\xb7e\x06\xb1dfq\xa1\xeb\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\x02J\t\x8a\xe7\x02\xbe\xf5@l\x9c\"\xb7\x8b\xd4\xeb,\u01e2\x93\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x02K\xdd,{\xfdP\x0e\xe7@O\u007f\xb3\xe9\xfb1\xdd \xfb\u0449\t\xc2\x00vQ\xb2P\x00\x00\u07d4\x02Sg\x96\x03\x04\xbe\xee4Y\x11\x18\xe9\xac-\x13X\xd8\x02\x1a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x02V\x14\x9f[Pc\xbe\xa1N\x15f\x1f\xfbX\xf9\xb4Y\xa9W\x89&)\xf6n\fS\x00\x00\x00\u07d4\x02`=z;\xb2\x97\xc6|\x87~]4\xfb\u0579\x13\xd4\xc6:\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x02a\xad:\x17*\xbf\x13\x15\xf0\xff\xec2p\x98j\x84\t\xcb%\x89\v\b!;\u03cf\xfe\x00\x00\u07d4\x02d2\xaf7\xdcQ\x13\xf1\xf4mH\nM\u0c80R#~\x89\x13I\xb7\x86\xe4\v\xfc\x00\x00\u07d4\x02f\xab\x1ck\x02\x16#\v\x93\x95D=_\xa7^hEh\u018965\u026d\xc5\u07a0\x00\x00\u07d4\x02u\x1d\u018c\xb5\xbdsp'\xab\xf7\u0777s\x90\xcdw\xc1k\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x02w\x8e9\x0f\xa1u\x10\xa3B\x8a\xf2\x87\fBsT}8l\x8a\x03lw\x80\x18\x8b\xf0\xef\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x037|\x0eUkd\x01\x03(\x9aa\x89\u1baecI4g\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x03IcM\u00a9\xe8\f?w!\xee+PF\xae\xaa\xed\xfb\xb5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x03U\xbc\xac\xbd!D\x1e\x95\xad\xee\xdc0\xc1r\x18\u0224\b\u0389\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x03n\xef\xf5\xba\x90\xa6\x87\x9a\x14\xdf\xf4\xc5\x04;\x18\xca\x04`\u0249\x05k\xc7^-c\x10\x00\x00\xe0\x94\x03qKA\u04a6\xf7Q\x00\x8e\xf8\xddM+)\xae\u02b8\xf3n\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x03r\xe8RX.\t44J\x0f\xed!x0M\xf2]F(\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x03r\xeeU\b\xbf\x81c\xed(N^\xef\x94\xceMsg\xe5\"\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x03}\xd0V\xe7\xfd\xbdd\x1d\xb5\xb6\xbe\xa2\xa8x\n\x83\xfa\u1009\a\x96\xe3\xea?\x8a\xb0\x00\x00\xe0\x94\x03\x83#\xb1\x84\xcf\xf7\xa8*\xe2\u1f67y?\xe41\x9c\xa0\xbf\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x03\x87y\xca-\xbef>c\xdb?\xe7V\x83\xea\x0e\xc6.#\x83\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94\x03\x8eE\xea\xdd=\x88\xb8\u007f\xe4\u06b0fh\x05\"\xf0\xdf\xc8\xf9\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x03\x92T\x9ar\u007f\x81eT)\u02d2\x8bR\x9f%\xdfM\x13\x85\x89\x01lC\xa0\xee\xa0t\x00\x00\u07d4\x03\x94\xb9\x0f\xad\xb8`O\x86\xf4?\xc1\xe3]1$\xb3*Y\x89\x89)j\xa1@'\x8ep\x00\x00\u0794\x03\x9ezN\xbc(N,\xcdB\xb1\xbd\xd6\v\xd6Q\x1c\x0fw\x06\x88\xf0\x15\xf2W6B\x00\x00\u07d4\x03\x9e\xf1\xceR\xfeyc\xf1f\u0562u\u0131\x06\x9f\xe3\xa82\x89\x15\xaf9\u4ab2t\x00\x00\u07d4\x03\xa2l\xfcL\x181op\u055e\x9e\x1ay\xee>\x8b\x96/L\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x03\xaab(\x81#m\xd0\xf4\x94\f$\xc3$\xff\x8b{~!\x86\x89\xadx\xeb\u016cb\x00\x00\x00\u07d4\x03\xafz\xd9\xd5\"<\xf7\xc8\xc1? \xdfg\xeb\xe5\xff\u017bA\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x03\xb0\xf1|\xd4F\x9d\xdc\u03f7\xdai~\x82\xa9\x1a_\x9ewt\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x03\xb4\x1bQ\xf4\x1d\xf2\r\xd2y\xba\xe1\x8c\x12w_w\xadw\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x03\xbe[F)\xae\xfb\xbc\xab\x9d\xe2m9Wl\xb7\xf6\x91\xd7d\x89\n\xdf0\xbap\u0217\x00\x00\u07d4\x03\xc6G\xa9\xf9)\xb0x\x1f\xe9\xae\x01\u02a3\xe1\x83\xe8vw~\x89\x18*\xb7\xc2\f\xe5$\x00\x00\u07d4\x03\xc9\x1d\x92\x946\x03\xe7R >\x054\x0eV`\x13\xb9\x00E\x89+|\xc2\xe9\xc3\"\\\x00\x00\u07d4\x03\xcbLOE\x16\xc4\xffy\xa1\xb6$O\xbfW.\x1c\u007f\xeay\x89\x94\x89#z\u06daP\x00\x00\u07d4\x03\u02d8\u05ec\xd8\x17\u079d\x88m\"\xfa\xb3\xf1\xb5}\x92\xa6\b\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x03\u031d-!\xf8k\x84\xac\x8c\xea\xf9q\u06e7\x8a\x90\xe6%p\x89WG=\x05\u06ba\xe8\x00\x00\u07d4\x03\xd1rO\xd0\x0eT\xaa\xbc\xd2\xde*\x91\xe8F+\x10I\xdd:\x89\x8f\x1d\\\x1c\xae7@\x00\x00\u07d4\x03\xde\xdf\xcd\v<.\x17\xc7\x05\xda$\x87\x90\uf626\xbdWQ\x89Hz\x9a0E9D\x00\x00\u07d4\x03\u8c04SuW\xe7\t\xea\xe2\xe1\u1966\xbc\xe1\xef\x83\x14\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x03\xeam&\u0400\xe5z\xee9&\xb1\x8e\x8e\xd7:N[(&\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x03\xeb<\xb8`\xf6\x02\x8d\xa5T\xd3D\xa2\xbbZP\n\xe8\xb8o\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x03\xeb\xc6?\xdaf`\xa4e\x04^#_\xben\\\xf1\x95s_\x89\a\xb0l\xe8\u007f\xddh\x00\x00\xe0\x94\x03\xefj\xd2\x0f\xf7\xbdO\x00+\xacX\xd4uD\u03c7\x9a\xe7(\x8a\x01u\xc7X\u0439n\\\x00\x00\u07d4\x03\xf7\xb9 \b\x81:\xe0\xa6v\xeb!(\x14\xaf\xab5\"\x10i\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x04\x11p\xf5\x81\u0780\xe5\x8b*\x04\\\x8f|\x14\x93\xb0\x01\xb7\u02c90\xc8\xeca2\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4\x04i\xe8\xc4@E\v\x0eQ&&\xfe\x81~gT\xa8\x15(0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x04m'K\x1a\xf6\x15\xfbPZvJ\xd8\u0767p\xb1\xdb/=\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x04}Z&\u05ed\x8f\x8ep`\x0fp\xa3\x98\u076a\x1c-\xb2o\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x04~\x87\xc8\xf7\xd1\xfc\xe3\xb0\x13S\xa8Xb\xa9H\xac\x04\x9f>\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\x04\u007f\x9b\xf1R\x9d\xaf\x87\xd4\a\x17^o\x17\x1b^Y\xe9\xff>\x89#<\x8f\xe4'\x03\xe8\x00\x00\xe0\x94\x04\x85'2\xb4\xc6R\xf6\xc2\u53b3e\x87\xe6\nb\xda\x14\u06ca\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x04\x8a\x89p\xeaAE\xc6MU\x17\xb8\xde[F\xd0YZ\xad\x06\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x04\x9c]K\xc6\xf2]NEli{R\xa0x\x11\xcc\u045f\xb1\x89\x10D\x00\xa2G\x0eh\x00\x00\u07d4\x04\xa1\xca\xda\x1c\xc7Q\b/\xf8\u0692\x8e<\xfa\x00\b \xa9\xe9\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x04\xa8\n\xfa\xd5>\xf1\xf8Ae\xcf\xd8R\xb0\xfd\xf1\xb1\xc2K\xa8\x89\x03$\xe9d\xb3\xec\xa8\x00\x00\u07d4\x04\xaa\xfc\x8a\xe5\xceoI\x03\u021d\u007f\xac\x9c\xb1\x95\x12\"Gw\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x04\xbaK\xb8q@\x02,!Jo\xacB\xdbZ\x16\u0755@E\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x04\xba\x8a?\x03\xf0\x8b\x89P\x95\x99M\xdaa\x9e\u06ac\xee>z\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x04\xc2\xc6K\xb5L>\xcc\xd0U\x85\xe1\x0e\xc6\xf9\x9a\f\xdb\x01\xa3\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x04\xceE\xf6\x00\xdb\x18\xa9\u0405\x1b)\xd99>\xbd\xaa\xfe=\u0149\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x04\u05b8\xd4\u0686t\a\xbb\x99wI\u07bb\xcd\xc0\xb3XS\x8a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x04\xd78\x96\xcfe\x93\xa6\x91\x97*\x13\xa6\xe4\x87\x1f\xf2\xc4+\x13\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x04\xd8*\xf9\xe0\x1a\x93m\x97\xf8\xf8Y@\xb9p\xf9\xd4\u06d96\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x04\xe5\xf5\xbc|\x92?\xd1\xe3\x175\xe7.\xf9h\xfdg\x11\fn\x89WU\x1d\xbc\x8ebL\x00\x00\u07d4\x04\xec\xa5\x01c\n\xbc\xe3R\x18\xb1t\x95k\x89\x1b\xa2^\xfb#\x8966\x9e\xd7t}&\x00\x00\u07d4\x05\x05\xa0\x8e\"\xa1\t\x01Z\"\xf6\x850STf*U1\u0549\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\u07d4\x05\x14\x95L\xe8\x81\xc807\x03d\x00\x89lO\xd1\xee$nx\x00\x00\u07d4\x05\x1dBBv\xb2\x129fQ\x86\x13=e;\xb8\xb1\x86/\x89\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x05!\xbc:\x9f\x87\x11\xfe\xcb\x10\xf5\a\x97\xd7\x10\x83\xe3A\ub749\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x05#mL\x90\xd0e\xf9\u34c3X\xaa\xff\xd7w\xb8j\xecI\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x05*X\xe05\xf1\xfe\x9c\xdd\x16\x9b\xcf \x97\x03E\xd1+\x9cQ\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\x05.\xab\x1fa\xb6\xd4U\x17(?A\xd1D\x18$\x87\x87I\u0409\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x053n\x9ar'(\xd9c\xe7\xa1\xcf'Y\xfd\x02tS\x0f\u02891\xa2D?\x88\x8ay\x80\x00\u07d4\x054q\u035aA\x92[9\x04\xa5\xa8\xff\xca6Y\xe04\xbe#\x89\n\xd2\x01\xa6yO\xf8\x00\x00\u07d4\x056\x1d\x8e\xb6\x94\x1dN\x90\xfb~\x14\x18\xa9Z2\xd5%w2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x05B:T\xc8\xd0\xf9p~pAs\xd9#\xb9F\xed\xc8\xe7\x00\x89\x06\xea\x03\u00bf\x8b\xa5\x80\x00\u07d4\x05D\f[\a;R\x9bH) \x9d\xff\x88\t\x0e\a\xc4\xf6\xf5\x89E\u04977\xe2/ \x00\x00\u07d4\x05Z\xb6X\xc6\xf0\xedO\x87^\xd6t.K\xc7)-\x1a\xbb\xf0\x89\x04\x86\u02d7\x99\x19\x1e\x00\x00\u07d4\x05[\xd0,\xaf\x19\xd6 +\xbc\u0703m\x18{\xd1\xc0\x1c\xf2a\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x05^\xacO\x1a\xd3\xf5\x8f\v\xd0$\u058e\xa6\r\xbe\x01\u01af\xb3\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x05fQU\xccI\xcb\xf6\xaa\xbd\u056e\x92\xcb\xfa\xad\x82\xb8\xc0\xc1\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x05f\x86\a\x8f\xb6\xbc\xf9\xba\n\x8a\x8d\xc6:\x90o_\xea\xc0\xea\x89\x1b\x18\x1eK\xf24<\x00\x00\u07d4\x05iks\x91k\xd3\x03>\x05R\x1e2\x11\xdf\xec\x02n\x98\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x05k\x15F\x89O\x9a\x85\xe2\x03\xfb3m\xb5i\xb1l%\xe0O\x89\t.\xdb\t\xff\b\u0600\x00\u07d4\x05yI\xe1\xca\x05pF\x9eL\xe3\u0190\xaea:k\x01\xc5Y\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x05}\u049f-\x19\xaa=\xa4#'\xeaP\xbc\xe8o\xf5\xc9\x11\u0649\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x05\u007f\u007f\x81\xcdz@o\xc4Y\x94@\x8bPI\x91,Vdc\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x05\x91]N\"Zf\x81b\xae\xe7\xd6\xc2_\xcf\xc6\xed\x18\xdb\x03\x89\x03\x98\xc3ry%\x9e\x00\x00\u07d4\x05\x96\xa2}\xc3\xee\x11_\xce/\x94\xb4\x81\xbc z\x9e&\x15%\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x05\xa80rC\x02\xbc\x0fn\xbd\xaa\x1e\xbe\xee\xb4nl\xe0\v9\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\u07d4\x05\xae\u007f\u053b\u0300\xca\x11\xa9\n\x1e\u01e3\x01\xf7\xcc\u0303\u06c91T\xc9r\x9d\x05x\x00\x00\u07d4\x05\xbbd\xa9\x16\xbef\xf4`\xf5\xe3\xb6C2\x11\r \x9e\x19\xae\x89\u3bb5sr@\xa0\x00\x00\xe0\x94\x05\xbfO\xcf\xe7r\xe4[\x82dC\x85.l5\x13P\xcer\xa2\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94\x05\xc6@\x04\xa9\xa8&\xe9N^N\xe2g\xfa*v2\xddNo\x8a\x03m\xc4.\xbf\xf9\v\u007f\x80\x00\xe0\x94\x05\xc76\xd3e\xaa7\xb5\xc0\xbe\x9c\x12\u022d\\\xd9\x03\xc3,\xf9\x8a\x01E^{\x80\n\x86\x88\x00\x00\xe0\x94\x05\xcbl;\x00r\xd3\x11ga\xb52\xb2\x18D;S\xe8\xf6\u014a\x1e\x02\xc3\xd7\xfc\xa9\xb6(\x00\x00\u07d4\x05\xd0\xf4\xd7(\xeb\xe8.\x84\xbfYu\x15\xadA\xb6\v\xf2\x8b9\x89\u3bb5sr@\xa0\x00\x00\u07d4\x05\u058d\xada\u04fb\u07f3\xf7y&\\IGJ\xff?\xcd0\x89\x02\"\xc5]\xc1Q\x9d\x80\x00\u07d4\x05\xe6q\xdeU\xaf\xec\x96K\aM\xe5t\xd5\x15\x8d]!\xb0\xa3\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x05\xe9{\tI,\u058fc\xb1+\x89.\xd1\xd1\x1d\x15,\x0e\u02897\b\xba\xed=h\x90\x00\x00\u07d4\x05\xf3c\x1fVd\xbd\xad]\x012\xc88\x8d6\xd7\u0612\t\x18\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x06\t\xd8:l\xe1\xff\u0276\x90\xf3\xe9\xa8\x1e\x98>\x8b\xdcM\x9d\x8a\x0e\u04b5%\x84\x1a\xdf\xc0\x00\x00\u07d4\x06\x1e\xa4\x87|\u0409D\xebd\u0096n\x9d\xb8\xde\xdc\xfe\xc0k\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x06%\xd0`V\x96\x8b\x00\"\x06\xff\x91\x98\x01@$+\xfa\xa4\x99\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x06(\xbf\xbeU5x/\xb5\x88@k\xc9f`\xa4\x9b\x01\x1a\xf5\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4\x061\u044b\xbb\xbd0\xd9\xe1s+\xf3n\xda\xe2\u0389\x01\xab\x80\x89\xa3\xf9\x88U\xec9\x90\x00\x00\u07d4\x061\xdc@\xd7NP\x95\xe3r\x9e\xdd\xf4\x95D\xec\xd49og\x89\b\xacr0H\x9e\x80\x00\x00\xe0\x94\x067Y\xdd\x1cN6.\xb1\x93\x98\x95\x1f\xf9\xf8\xfa\xd1\xd3\x10h\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x06_\xf5u\xfd\x9c\x16\xd3\xcbo\u058f\xfc\x8fH?\xc3.\xc85\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x06a\x8e\x9dWb\xdfb\x02\x86\x01\xa8\x1dD\x87\u05a0\xec\xb8\x0e\x89Hz\x9a0E9D\x00\x00\xe0\x94\x06fG\xcf\xc8]#\xd3v\x05W= \x8c\xa1T\xb2D\xd7l\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x06xeJ\xc6v\x1d\xb9\x04\xa2\xf7\xe8Y^\xc1\xea\xacsC\b\x89/\x98\xb2\x9c(\x18\xf8\x00\x00\u07d4\x06\x86\n\x93RYU\xffbI@\xfa\xdc\xff\xb8\xe1I\xfdY\x9c\x89lh\xcc\u041b\x02,\x00\x00\xe0\x94\x06\x8c\xe8\xbdn\x90*E\u02c3\xb5\x15A\xb4\x0f9\xc4F\x97\x12\x8a\x01\x1c\x0f\x9b\xadJF\xe0\x00\x00\u07d4\x06\x8e)\xb3\xf1\x91\xc8\x12\xa699\x18\xf7\x1a\xb93\xaehG\xf2\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x06\x8eeWf\xb9D\xfb&6\x19e\x87@\xb8P\xc9J\xfa1\x89\x01\xe8\u007f\x85\x80\x9d\xc0\x00\x00\u0794\x06\x96N-\x17\xe9\x18\x9f\x88\xa8 96\xb4\n\xc9nS<\x06\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x06\x99L\xd8:\xa2d\n\x97\xb2`\vA3\x9d\x1e\r>\xdel\x89\r\x8drkqw\xa8\x00\x00\u07d4\x06\x9e\u042bz\xa7}\xe5q\xf1a\x06\x05\x1d\x92\xaf\xe1\x95\xf2\u0409\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x06\xac&\xad\x92\u02c5\x9b\u0550]\xdc\xe4&j\xa0\xecP\xa9\u0149*\x03I\x19\u07ff\xbc\x00\x00\u07d4\x06\xb0\xc1\xe3\u007fZ^\u013b\xf5\b@T\x8f\x9d:\xc0(\x88\x97\x89\xd8\u0602\u148e}\x00\x00\u07d4\x06\xb0\xff\x83@s\xcc\xe1\xcb\xc9\xeaU~\xa8{`Yc\u8d09\x10CV\x1a\x88)0\x00\x00\xe0\x94\x06\xb1\x06d\x9a\xa8\xc4!\xdd\xcd\x1b\x8c2\xcd\x04\x18\xcf0\xda\x1f\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x06\xb5\xed\xe6\xfd\xf1\xd6\xe9\xa3G!7\x9a\xea\xa1|q=\xd8*\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x06\xcb\xfa\b\xcd\xd4\xfb\xa77\xba\xc4\a\xbe\x82$\xf4\xee\xf3X(\x89 +\xe5\xe88.\x8b\x80\x00\u07d4\x06\xd6\xcb0\x84\x81\xc36\xa6\xe1\xa2%\xa9\x12\xf6\xe65Y@\xa1\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\x06\xdc\u007f\x18\xce\xe7\xed\xab[yS7\xb1\xdfj\x9e\x8b\u062eY\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x06\xf6\x8d\xe3\xd79\xdbA\x12\x1e\xac\xf7y\xaa\xda=\xe8v!\a\x89\x01\x84\x93\xfb\xa6N\xf0\x00\x00\u07d4\x06\xf7\u070d\x1b\x94b\xce\xf6\xfe\xb13h\xa7\xe3\x97K\t\u007f\x9f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\a\x01\xf9\xf1G\xecHhV\xf5\xe1\xb7\x1d\xe9\xf1\x17\xe9\x9e!\x05\x89\te\xdaq\u007f\u0578\x00\x00\u07d4\a\r]6L\xb7\xbb\xf8\"\xfc,\xa9\x1a5\xbd\xd4A\xb2\x15\u0549lk\x93[\x8b\xbd@\x00\x00\xe0\x94\a\x1d\xd9\r\x14\xd4\x1fO\xf7\xc4\x13\xc2B8\xd35\x9c\xd6\x1a\a\x8a\a\xb5?y\xe8\x88\xda\xc0\x00\x00\u07d4\a&\xc4.\x00\xf4T\x04\x83n\xb1\xe2\x80\xd0s\xe7\x05\x96\x87\xf5\x89X\x00>?\xb9G\xa3\x80\x00\xe0\x94\a'\xbe\n*\x00! H\xb5R\x0f\xbe\xfb\x95>\xbc\x9dT\xa0\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\a)\xa8\xa4\xa5\xba#\xf5y\xd0\x02[\x1a\xd0\xf8\xa0\xd3\\\xdf\u048a\x02\r\u058a\xaf2\x89\x10\x00\x00\u07d4\a)\xb4\xb4|\t\xeb\x16\x15\x84d\u022a\u007f\xd9i\vC\x889\x89lh\xcc\u041b\x02,\x00\x00\u0794\a4\xa0\xa8\x1c\x95b\xf4\xd9\xe9\xe1\n\x85\x03\xda\x15\xdbF\xd7n\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\a\xa7\xef[G\x00\x00\xe0\x94\ap\xc6\x1b\xe7\x87r#\f\xb5\xa3\xbb$)\xa7&\x14\xa0\xb36\x8a\x01n\u0899\xb7\x13A\x80\x00\u07d4\ar><0\xe8\xb71\xeeEj)\x1e\xe0\u7630 Jw\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\as\xee\xac\xc0P\xf7G \xb4\xa1\xbdW\x89[\x1c\xce\xebI]\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\a\x80\r/\x80h\xe4H\u01daOi\xb1\xf1^\xf6\x82\xaa\xe5\xf6\x8a\x04\x1b\xad\x15^e\x12 \x00\x00\u07d4\a\xa8\xda\xde\xc1BW\x1a}S\xa4)pQxm\a,\xbaU\x89\x01;m\xa1\x13\x9b\u0680\x00\u07d4\a\xaf\x93\x8c\x127\xa2|\x900\tM\xcf$\aP$n=,\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\a\xb1\xa3\x06\xcbC\x12\xdffH,,\xaer\xd1\xe0a@\x0f\u034a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\a\xb7\xa5p3\xf8\xf1\x130\xe4f^\x18]#N\x83\xec\x14\v\x89\xea~\xe9*\f\x9a\v\x80\x00\u07d4\a\xbc,\xc8\xee\xdc\x01\x97\a\x00\xef\xc9\xc4\xfb6s^\x98\xcdq\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\a\xd4\x12\x17\xba\u0725\xe0\xe6\x03'\xd8E\xa3FO\x0f'\xf8J\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\a\xd43N\u00c5\xe8\xaaT\xee\xda\xea\xdb0\x02/\f\u07e4\xab\x89\x8e\x91\xd5 \xf2\xeby\x00\x00\u07d4\a\xda\xe6\"c\r\x1168\x193\u04adk\"\xb89\xd8!\x02\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\a\xdc+\xf8;\u01af\x19\xa8B\xff\xeaf\x1a\xf5\xb4\x1bg\xfd\xa1\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\a\u070c\x8b\x92z\xdb\xed\xfa\x8f]c\x9bCR5\x1f/6\u0489\x11\n\xed;U0\xdb\x00\x00\u07d4\a\xdd\xd0B,\x86\xefe\xbf\f\u007f\xc3E(b\xb1\"\x8b\b\xb8\x89o\xf5\u04aa\x8f\x9f\xcf\x00\x00\u07d4\a\xe1\x16,\xea\xe3\xcf!\xa3\xf6-\x10Y\x900.0\u007fN;\x89R\xf1\x03\xed\xb6k\xa8\x00\x00\u07d4\a\xe2\xb4\xcd\xee\xd9\u0407\xb1.Um\x9ew\f\x13\xc0\x99a_\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\a\xfe\xefT\xc16\x85\b)\xba\xdcKI\xc3\xf2\xa7<\x89\xfb\x9e\x89\x06hZ\xc1\xbf\xe3,\x00\x00\u07d4\b\x05FP\x8a=&\x82\u0239\x88O\x13c{\x88G\xb4M\xb3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\b\t\bv\xba\xad\xfe\xe6\\=6;\xa5S\x12t\x8c\xfa\x87=\x89\\*\x997\x1c\xff\xe1\x00\x00\u07d4\b\x16o\x021?\xea\u12f0D\xe7\x87|\x80\x8bU\xb5\xbfX\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\b)\xd0\xf7\xbb|Dl\xfb\xb0\u07ad\xb29M\x9d\xb7$\x9a\x87\x89\x02,\xa3X|\xf4\xeb\x00\x00\u07d4\b0m\xe5\x19\x81\u7b21\x85hY\xb7\xc7xijki\xf9\x89\xadx\xeb\u016cb\x00\x00\x00\xe0\x94\b7S\x9b_jR*H,\xdc\u04e9\xbbpC\xaf9\xbd\u048a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\b8\xa7v\x8d\x9c*\u028b\xa2y\xad\xfe\xe4\xb1\xf4\x91\xe3&\xf1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\bA\x16R\xc8qq6\t\xaf\x00b\xa8\xa1(\x1b\xf1\xbb\xcf\u0649K\xe4\xe7&{j\xe0\x00\x00\xe0\x94\bM\x102Tu\x9b4<\xb2\xb9\xc2\xd8\xff\x9e\x1a\xc5\xf1E\x96\x8a\x01\x9b\xff/\xf5yh\xc0\x00\x00\u07d4\bPO\x05d?\xabY\x19\xf5\xee\xa5Y%\u05e3\xed}\x80z\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\b[J\xb7]\x83b\xd9\x14C\\\xed\xee\x1d\xaa+\x1e\xe1\xa2;\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\b[\xa6_\xeb\xe2>\xef\xc2\xc8\x02fj\xb1&#\x82\xcf\u0114\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\bt\x98\xc0FFh\xf3\x11P\xf4\xd3\u013c\u0765\"\x1b\xa1\x02\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\bw\uebabx\xd5\xc0\x0e\x83\xc3+-\x98\xfay\xadQH/\x89\x17\xd2-q\xdab&\x00\x00\u0794\b\x93j7\u07c5\xb3\xa1X\xca\xfd\x9d\xe0!\xf5\x817h\x13G\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\b\xa9\xa4N\x1fA\xde=\xbb\xa7\xa3c\xa3\xabA,\x12L\xd1^\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\b\xb7\xbd\u03d4MUp\x83\x8b\xe7\x04`$:\x86\x94HXX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\b\xb8E6\xb7L\x8c\x01T=\xa8\x8b\x84\u05cb\xb9WG\xd8\"\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\b\xc2\xf26\xacJ\xdc\xd3\xfd\xa9\xfb\xc6\xe4S\"S\xf9\xda;\xec\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\b\xc8\x02\xf8wX4\x9f\xa0>k\xc2\xe2\xfd\a\x91\x19~\ua689lk\x93[\x8b\xbd@\x00\x00\u07d4\b\xc9\U0007fd89\xfd\xf8\x04\xd7i\xf8!#6\x02\x15\xaf\xf9;\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\b\xca\u0215&A\xd8\xfcRn\xc1\xabO-\xf8&\xa5\xe7q\x0f\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94\b\xcc\xdaP\xe4\xb2j\x0f\xfc\x0e\xf9.\x92\x051\a\x06\xbe\xc2\u01ca\x01Iul8W\xc6\x00\x00\x00\u07d4\b\u0406M\xc3/\x9a\xcb6\xbfN\xa4G\xe8\xddg&\x90j\x15\x89lnY\xe6|xT\x00\x00\u07d4\b\xd4&\u007f\xeb\x15\u0697\x00\xf7\xcc\xc3\xc8J\x89\x18\xbf\x17\xcf\u0789a\t=|,m8\x00\x00\xe0\x94\b\xd41\x1c\x9c\x1b\xba\xf8\u007f\xab\xe1\xa1\xd0\x14c\x82\x8d]\x98\u038a\x13\x0e\xe8\xe7\x17\x90D@\x00\x00\u07d4\b\xd5N\x83\xadHj\x93L\xfa\xea\u20e3>\xfd\"|\x0e\x99\x898S\x05\x83$^\xdc\x00\x00\u07d4\b\xd9~\xad\xfc\xb7\xb0d\xe1\xcc\xd9\u0217\x9f\xbe\xe5\xe7z\x97\x19\x89\x0el]\xa8\xd6z\xc1\x80\x00\u07d4\b\xda:z\x0fE!a\u03fc\xec1\x1b\xb6\x8e\xbf\xde\xe1~\x88\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\b\xe3\x8e\xe0\xceH\xc9\xcad\\\x10\x19\xf7;SUX\x1cV\xe6\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\b\xef?\xa4\xc4<\xcd\xc5{\"\xa4\xb9\xb23\x1a\x82\xe58\x18\xf2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\t\td\x8c\x18\xa3\xce[\xaez\x04~\xc2\xf8h\xd2L\u0768\x1d\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4\t\f\xd6{`\xe8\x1dT\xe7\xb5\xf6\a\x8f>\x02\x1b\xa6[\x9a\x1e\x8965\u026d\xc5\u07a0\x00\x00\u07d4\t\f\xeb\xef),>\xb0\x81\xa0_\u062a\xf7\u04db\xf0{\x89\u0509\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\t\x0f\xa96{\xdaW\xd0\xd3%:\n\x8f\xf7l\xe0\xb8\xe1\x9as\x8965\u026d\xc5\u07a0\x00\x00\u07d4\t\x14n\xa3\x88Qv\xf0w\x82\xe1\xfe0\xdc\xe3\xce$\u011e\x1f\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\t!`_\x99\x16N;\xcc(\xf3\x1c\xae\xcex\x971\x82V\x1d\x89+\ai*\x90e\xa8\x00\x00\xe0\x94\t&\x1f\x9a\xcbE\x1c7\x88\x84O\f\x14Q\xa3[\xadP\x98\xe3\x8a\x01\u056d'P) `\x00\x00\xe0\x94\t'\"\x04\x92\x19K.\u069f\u013b\xe3\x8f%\u0581\xdf\xd3l\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u0794\t*\xcbbK\b\xc0U\x10\x18\x9b\xbb\xe2\x1ee$\xd6D\u032d\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\t.\x81UX@-g\xf9\rk\xfem\xa0\xb2\xff\xfa\x91EZ\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\tP0\xe4\xb8&\x92\xdc\xf8\xb8\u0411$\x94\xb9\xb3x\xec\x93(\x89H\xa4zu\x80\x00\u07d4\t\x89\xc2\x00D\v\x87\x89\x91\xb6\x9d`\x95\xdf\xe6\x9e3\xa2.p\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\t\x90\xe8\x1c\u05c5Y\x9e\xa26\xbd\x19f\xcfRc\x02\xc3[\x9c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\t\x98\xd8'1\x15\xb5j\xf4%\xff\xc8>!\x8c\x1e\n\xfe\x89(\u01c8\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\t\xaeI\xe3\u007f\x12\x1d\xf5\xdc\x15\x8c\xfd\xe8\x06\xf1s\xa0k\f\u007f\x89\xd80\x9e&\xab\xa1\xd0\x00\x00\u07d4\t\xaf\xa7;\xc0G\xefF\xb9w\xfd\x97c\xf8r\x86\xa6\xbeh\u0189\x1b/\xb5\xe8\xf0jf\x00\x00\u07d4\t\xb4f\x86\x96\xf8j\b\x0f\x8b\xeb\xb9\x1d\xb8\xe6\xf8p\x15\x91Z\x89#\x8f\xf7\xb3O`\x01\x00\x00\xe0\x94\t\xb5\x9b\x86\x98\xa7\xfb\xd3\xd2\xf8\xc7:\x00\x89\x88\xde>@k+\x8a\bxg\x83&\xea\xc9\x00\x00\x00\xe0\x94\t\xb7\xa9\x88\xd1?\xf8\x91\x86so\x03\xfd\xf4au\xb5=\x16\xe0\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\t\xc1w\xf1\xaeD$\x11\u076c\xf1\x87\xd4m\xb9V\x14\x83`\xe7\x8a\x01\xe5.3l\xde\"\x18\x00\x00\xe0\x94\t\u020f\x91~Mj\xd4s\xfa\x12\u93a3\xc4G*^\xd6\u068a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\t\u0438\xcd\a|i\xd9\xf3-\x9c\xcaC\xb3\xc2\b\xa2\x1e\u050b\x89\b!\xd2!\xb5)\x1f\x80\x00\xe0\x94\t\xd6\xce\xfdu\xb0\u0133\xf8\xf1\u0587\xa5\"\xc9a#\xf1\xf59\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\t\xe47\xd4H\x86\x12(\xa22\xb6.\xe8\xd3ye\xa9\x04\ud70a\x04\x98\xcf@\x1d\xf8\x84.\x80\x00\u07d4\t\xee\x12\xb1\xb4+\x05\xaf\x9c\xf2\a\xd5\xfc\xac%[.\xc4\x11\xf2\x89\x031\xcd\xddG\xe0\xfe\x80\x00\u07d4\t\xf3\xf6\x01\xf6\x05D\x11@Xl\xe0eo\xa2J\xa5\xb1\u066e\x89Sswo\xe8\xc4T\x00\x00\u07d4\t\xf9W[\xe5}\x00G\x93\u01e4\ub137\x15\x87\xf9|\xbbj\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\n\x06P\x86\x1fx^\xd8\xe4\xbf\x10\x05\xc4P\xbb\xd0n\xb4\x8f\xb6\x89\xa6A;y\x14N~\x00\x00\u07d4\n\x06\xfa\xd7\xdc\u05e4\x92\xcb\xc0S\xee\xab\xdei4\xb3\x9d\x867\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\n\a}\xb1?\xfe\xb0\x94\x84\xc2\x17p\x9dX\x86\xb8\xbf\x9cZ\x8b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\n\x0e\u0366cow\x16\xef\x19saF\x87\xfd\x89\xa8 \xa7\x06\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\n)\xa8\xa4\xd5\xfd\x95\x00u\xff\xb3Mw\xaf\xeb-\x82;\u0589\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\n*\u0795\xb2\xe8\xc6m\x8a\xe6\xf0\xbad\xcaW\u05c3\xbemD\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\n+O\xc5\xd8\x1a\xceg\xdcK\xba\x03\xf7\xb4UA=F\xfe=\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\n-\xcbzg\x17\x01\u06f8\xf4\x95r\x80\x88&Xs5l\x8e\x89\b?\x16\xce\b\xa0l\x00\x00\u07d4\n=\xe1U\xd5\xec\xd8\xe8\x1c\x1f\xf9\xbb\xf07\x83\x01\xf8\xd4\xc6#\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\nG\xad\x90Y\xa2I\xfc\x93k&b5=\xa6\x90_u\u00b9\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\nH)ov1p\x8c\x95\u04b7Iu\xbcJ\xb8\x8a\xc19*\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94\nJ\x01\x19\x95\u0181\xbc\x99\x9f\xddyuN\x9a2J\xe3\xb3y\x8a\b\xc1\x9a\xb0n\xb8\x9a\xf6\x00\x00\u07d4\nX\xfd\xddq\x89\x8d\xe7s\xa7O\xda\xe4^{\xd8N\xf46F\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\n[y\xd8\xf2;d\x83\xdb\u2f6ab\xb1\x06L\xc7cf\xae\x89j\u0202\x10\tR\u01c0\x00\u07d4\ne.*\x8bw\xbd\x97\xa7\x90\xd0\xe9\x13a\u0248\x90\u06f0N\x8965\u026d\xc5\u07a0\x00\x00\u07d4\nn\xber;n\xd1\xf9\xa8ji\xdd\xdah\xdcGF\\+\x1b\x89@=-\xb5\x99\xd5\xe4\x00\x00\u07d4\nw\xe7\xf7+C{WO\x00\x12\x8b!\xf2\xac&Q3R\x8c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\n\x91\u007f;\\\xb0\xb8\x83\x04\u007f\u0676Y=\xbc\xd5W\xf4S\xb9\x8965\u026d\xc5\u07a0\x00\x00\u07d4\n\x93\x1bD\x9e\xa8\xf1,\xdb\xd5\xe2\xc8\xccv\xba\xd2\xc2|\x069\x89\x01?\x9e\x8cy\xfe\x05\x80\x00\u0794\n\x98\x04\x13x\x03\xbahh\xd9:U\xf9\x98_\xcdT\x04Q\u4239\x8b\xc8)\xa6\xf9\x00\x00\u07d4\n\x9a\xb2c\x8b\x1c\xfdeM%\u06b0\x18\xa0\xae\xbd\u07c5\xfdU\x89\x01.\x8c\xb5\xfeLJ\x80\x00\u07d4\n\xb3f\xe6\xe7\u056b\xbc\xe6\xb4JC\x8di\xa1\u02bb\x90\xd13\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4\n\xb4(\x1e\xbb1\x85\x90\xab\xb8\x9a\x81\xdf\a\xfa:\xf9\x04%\x8a\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u0794\n\xb5\x9d9\a\x02\xc9\xc0Y\xdb\x14\x8e\xb4\xf3\xfc\xfa}\x04\xc7\xe7\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\n\xbf\xb3\x9b\x11HmyW(f\x19[\xa2lc\vg\x84\u06ca\x19\xba\x877\xf9i(\xf0\x00\x00\u07d4\n\u029aV&\x91;\b\xcf\u0266m@P\x8d\xceR\xb6\x0f\x87\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\n\xd3\xe4M<\x00\x1f\xa2\x90\xb3\x93ap0TA\b\xacn\xb9\x89j\xbd\xa0\xbc0\xb2\u07c0\x00\u07d4\n\xec.Bn\xd6\xcc\f\xf3\xc2I\xc1\x89~\xacG\xa7\xfa\xa9\xbd\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\n\xf6_\x14xNU\xa6\xf9Vg\xfds%*\x1c\x94\a-*\x89\nv;\x8e\x02\xd4O\x80\x00\u07d4\n\xf6\xc8\xd59\xc9mP%\x9e\x1b\xa6q\x9e\x9c\x80`\xf3\x88\u008965\u026d\xc5\u07a0\x00\x00\u07d4\v\x069\x0f$7\xb2\x0e\u0123\xd3C\x1b2y\xc6X>^\u05c9\n\x84Jt$\xd9\xc8\x00\x00\u07d4\v\v8b\x11*\xee\u00e04\x92\xb1\xb0_D\x0e\xcaT%n\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\v\x0e\x05[(\xcb\xd0=\xc5\xffD\xaad\xf3\xdc\xe0O^c\xfb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\x11\x9d\xf9\x9ck\x8d\xe5\x8a\x1e,?)zgD\xbfU\"w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\x14\x89\x19\x99\xa6\\\x9e\xf73\b\xef\xe3\x10\f\xa1\xb2\x0e\x81\x92\x89+^:\xf1k\x18\x80\x00\x00\u07d4\v!\x13PE4d*\x1d\xaf\x10.\xee\x10\xb9\xeb\xdev\xe2a\x89\x94,\xdd|\x95\xf2\xbd\x80\x00\xe0\x94\v(\x8aZ\x8bu\xf3\xdcA\x91\xeb\x04W\xe1\xc8=\xbd M%\x8a\x01\a\x14\xe7{\xb4:\xb4\x00\x00\u07d4\v6\x9e\x00.\x1bLy\x13\xfc\xf0\x0f-^\x19\u0141eG\x8f\x89\x03\u007fe\x16(\x8c4\x00\x00\u07d4\vC\xbd#\x91\x02U\x81\u0615l\xe4*\a%y\u02ff\xcb\x14\x89\x01\x04\xe7\x04d\xb1X\x00\x00\u07d4\vP|\xf5SV\x8d\xaa\xf6U\x04\xaeN\xaa\x17\xa8\xea<\xdb\xf5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v]f\xb1<\x87\xb3\x92\xe9M\x91\xd5\xf7l\rE\nU(C\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v^ \x11\xeb\xc2Z\x00\u007f!6)`I\x8a\xfb\x8a\xf2\x80\xfb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\vd\x9d\xa3\xb9j\x10,\xdcm\xb6R\xa0\xc0}e\xb1\xe4C\xe6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\vi \xa6K6;\x8d]\x90\x80$\x94\xcfVKT|C\r\x89A\rXj \xa4\xc0\x00\x00\u07d4\vp\x11\x01\xa4\x10\x9f\x9c\xb3`\xdcW\xb7tBg=^Y\x83\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\vq\xf5T\x12$i\uf5ce/\x1f\xef\xd7\u02f4\x10\x98'r\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\xe0\x94\v{\xb3B\xf0\x1b\u0248\x8ej\x9a\xf4\xa8\x87\xcb\xf4\xc2\xdd,\xaf\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\v}3\x93q\xe5\xbeg'\xe6\xe31\xb5\x82\x1f\xa2K\u06ddZ\x89.\u007f\x81\x86\x82b\x01\x00\x00\u07d4\v\u007f\xc9\xdd\xf7\x05v\xf63\x06i\xea\xaaq\xb6\xa81\xe9\x95(\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\v\x80\xfcp(,\xbd\xd5\xfd\xe3[\xf7\x89\x84\xdb;\xdb\x12\x01\x88\x8968\x02\x1c\xec\u06b0\x00\x00\u07d4\v\x92M\xf0\a\xe9\xc0\x87\x84\x17\xcf\xe6;\x97n\xa1\xa3\x82\xa8\x97\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\v\x93\xfc\xa4\xa4\xf0\x9c\xac \xdb`\xe0e\xed\xcc\xcc\x11\u0976\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\v\x9d\xf8\x0f\xbe# \t\xda\xcf\n\xa8\xca\u0153v\xe2Gb\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\xa6\xe4j\xf2Z\x13\xf5qi%Z4\xa4\xda\xc7\xce\x12\xbe\x04\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\v\xa8p[\xf5\\\xf2\x19\xc0\x95k^?\xc0\x1cDt\xa6\xcd\xc1\x89\x05%\xe0Y]Mk\x80\x00\u07d4\v\xafn\u0379\x1a\xcb6\x06\xa85|\v\xc4\xf4\\\xfd-~o\x8965\u026d\xc5\u07a0\x00\x00\u07d4\v\xb0_r$\xbbX\x04\x85eV\xc0~\xea\xdb\ud1fa\x8f|\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\v\xb0\xc1&\x82\xa2\xf1\\\x9bWA\xb28\\\xbeA\xf04\x06\x8e\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\v\xb2\\\xa7\u0448\xe7\x1eMi={\x17\a\x17\xd6\xf8\xf0\xa7\n\x89\x12C\x02\xa8/\xad\xd7\x00\x00\u07d4\v\xb2e\x0e\xa0\x1a\xcau[\xc0\xc0\x17\xb6K\x1a\xb5\xa6m\x82\xe3\x89Hz\x9a0E9D\x00\x00\u07d4\v\xb5Lr\xfdf\x10\xbf\xa463\x97\xe0 8K\x02+\fI\x89Hz\x9a0E9D\x00\x00\u07d4\v\xb7\x16\n\xba)7b\xf8sO>\x03&\xff\u0264\xca\xc1\x90\x8965\u026d\xc5\u07a0\x00\x00\u07d4\v\xc9\\\xb3-\xbbWL\x83/\xa8\x17J\x815m8\xbc\x92\xac\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\xd6}\xbd\xe0z\x85n\xbd\x89;^\xdcO:[\xe4 &\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\v\xdb\xc5L\u023d\xbb\xb4\x02\xa0\x89\x11\xe2#*T`\u0386k\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\v\xddX\xb9n|\x91m\xd2\xfb05o*\xeb\xfa\xaf\x1d\x860\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\v\u1f39\x03C\xfa\xe501s\xf4a\xbd\x91JH9\x05l\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\v\xe1\xfd\xf6&\xeea\x89\x10-p\xd1;1\x01,\x95\xcd\x1c\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\v\xe2\xb9J\xd9P\xa2\xa6&@\xc3[\xfc\xcdlg\xda\xe4P\xf6\x89i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94\v\u681eC\a\xfeH\xd4\x12\xb8\u0461\xa8(M\xceHba\x8a\x04\x0f\xbf\xf8\\\x0180\x00\x00\u07d4\v\xef\xb5G\a\xf6\x1b,\x9f\xb0G\x15\xab\x02n\x1b\xb7 B\xbd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\v\xf0dB\x8f\x83bg\"\xa7\xb5\xb2j\x9a\xb2\x04!\xa7r>\x89\a?u\u0460\x85\xba\x00\x00\u07d4\v\xfb\xb6\x92]\xc7^R\xcf&\x84\"K\xbe\x05P\xfe\xa6\x85\u04c9j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\f\b\x80\x06\xc6K0\xc4\u076f\xbc6\xcb_\x05F\x9e\xb6(4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\f s\xbaD\xd3\u077d\xb69\xc0N\x19\x109\xa7\x17\x16#\u007f\x89M\x85<\x8f\x89\b\x98\x00\x00\xe0\x94\f\",|A\u0270H\xef\xcc\xe0\xa22CCb\xe1-g;\x8a\x02\x1e\x83Yivw8\x00\x00\xe0\x94\f(\b\xb9Q\ud787-{2y\x0f\xccY\x94\xaeA\xff\u070a\x15\x99n[<\u05b3\xc0\x00\x00\u07d4\f(\x84~O\t\xdf\xce_\x9b%\xaf|NS\x0fY\u0200\xfe\x8965\u026d\xc5\u07a0\x00\x00\u07d4\f-\\\x92\x058\xe9S\u02af$\xf0s\u007fUL\u0192wB\x8965\u026d\xc5\u07a0\x00\x00\u07d4\f0\xca\xcc?r&\x9f\x8bO\x04\xcf\a=+\x05\xa8=\x9a\u0449lyt\x12?d\xa4\x00\x00\u07d4\f29\xe2\xe8A$-\xb9\x89\xa6\x15\x18\xc2\"G\xe8\xc5R\b\x89\x0eJ\xf6G\x174d\x00\x00\xe0\x94\fH\r\xe9\xf7F\x10\x02\x90\x8bI\xf6\x0f\xc6\x1e+b\xd3\x14\v\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\fH\xaeb\xd1S\x97\x88\xeb\xa0\x13\xd7^\xa6\vd\xee\xbaN\x80\x89w\xfb\xdcC\xe00\x99\x80\x00\u07d4\fU\x89\xa7\xa8\x9b\x9a\xd1[\x02u\x190AYH\xa8u\xfb\xef\x89\x06\u0519\xeclc8\x00\x00\u07d4\fg\x03=\xd8\xee\u007f\f\x8a\xe54\xd4*Q\xf7\xd9\xd4\xf7\x97\x8f\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\fhE\xbfA\xd5\xee'<>\u6d70\u059fo\xd5\xea\xbb\xf7\x89\xa2\xa1\xb9h.X\t\x00\x00\xe0\x94\f\u007f\x86\x9f\x8e\x90\xd5?\xdc\x03\u8c81\x9b\x01k\x9d\x18\xeb&\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\f\x86\x92\xee\xff*S\xd6\xd1h\x8e\xd5j\x9d\u06fdh\u06bb\xa1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\f\x8ff\xc6\x01{\xce[ 4r\x04\xb6\x02\xb7C\xba\u05cd`\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\f\x8f\xd7w^T\xa6\xd9\u0263\xbf\x89\x0ev\x1fewi?\xf0\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\f\x92Z\xd5\xeb5,\x8e\xf7m\f\"-\x11[\a\x91\xb9b\xa1\x89\xacc]\u007f\xa3N0\x00\x00\u07d4\f\x96~0a\xb8zu>\x84P~\xb6\t\x86x,\x8f0\x13\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\f\xa1*\xb0\xb9fl\xf0\xce\xc6g\x1a\x15)/&SGj\xb2\x8a,x'\xc4-\"\xd0|\x00\x00\u07d4\f\xa6p\xeb,\x8b\x96\u02e3y!\u007fY)\u00b8\x92\xf3\x9e\xf6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\f\xae\x10\x8em\xb9\x9b\x9ecxv\xb0d\xc60>\u068ae\u0209\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\f\xbd\x92\x1d\xbe\x12\x15c\xb9\x8ahq\xfe\xcb\x14\xf1\xcc~\x88\u05c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\f\xbf\x87p\xf0\xd1\b.\\ \u016e\xad4\xe5\xfc\xa9\xaez\xe2\x8965\u026d\xc5\u07a0\x00\x00\u07d4\f\xc6\u007f\x82s\xe1\xba\xe0\x86\u007f\xd4.\x8b\x81\x93\xd7&y\xdb\xf8\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\f\u05a1A\x91\x8d\x12k\x10m\x9f.\xbfi\xe1\x02\xdeM2w\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\f\xda\x12\xbfr\xd4a\xbb\xc4y\xeb\x92\xe6I\x1d\x05~kZ\u044a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\f\u0716\v\x99\x8c\x14\x19\x98\x16\r\xc1y\xb3l\x15\u0484p\xed\x89\x1b\x1bk\u05efd\xc7\x00\x00\xe0\x94\f\xfb\x17#5\xb1l\x87\xd5\x19\xcd\x14uS\r W\u007f^\x0e\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\r\x1f*Wq>\xbcn\x94\xde)\x84n\x88D\xd3vfWc\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\r2e\xd3\u7f79=^\x8e\x8b\x1c\xa4\u007f!\ny>\u030e\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\r5@\x8f\"ef\x11o\xb8\xac\u06a9\xe2\xc9\u055bvh?\x892\xf5\x1e\u06ea\xa30\x00\x00\u07d4\rU\x1e\xc1\xa2\x13<\x98\x1d_\u01a8\xc8\x17?\x9e|OG\xaf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\r]\x98V\\d|\xa5\xf1w\xa2\xad\xb9\xd3\x02/\xac(\u007f!\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\re\x80\x14\xa1\x99\x06\x1c\xf6\xb3\x943\x14\x03\x03\xc2\x0f\xfdNZ\x8a\x01\xbc\x85\xdc*\x89\xbb \x00\x00\u07d4\rg\x87\x06\xd07\x18\u007f>\"\xe6\xf6\x9b\x99\xa5\x92\xd1\x1e\xbcY\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\ri\x10\f9\\\xe6\xc5\xea\xad\xf9]\x05\xd8r\x83~\xde\xdd!\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\rt~\u559b\xf7\x9dW8\x1do\xe3\xa2@l\xd0\xd8\xce'\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\r\x80#\x92\x9d\x91r4\xae@Q+\x1a\xab\xb5\xe8\xa4Q'q\x89\b\x05\xe9\x9f\xdc\xc5\xd0\x00\x00\xe0\x94\r\x8a\xab\x8ft\xea\x86,\xdfvh\x05\x00\x9d?>B\xd8\xd0\v\x8a\x01;\x80\xb9\x9cQ\x85p\x00\x00\u07d4\r\x8c@\xa7\x9e\x18\x99O\xf9\x9e\xc2Q\xee\x10\u0408\u00d1.\x80\x89\x066d\xfc\u04bb\xc4\x00\x00\u07d4\r\x8e\xd7\xd0\xd1V83\x0e\xd7\xe4\xea\u032b\x8aE\x8dus~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\r\x92X/\u06e0^\xab\xc3\xe5\x158\xc5m\xb8\x817\x85\xb3(\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4\r\x94C\xa7\x94h\xa5\xbb\xf7\xc1\xe5\xb9\x15\xb3d\x87\xf9\x16\x1f\x19\x84m\x10\x1431\x8a\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\r\xbdA|7+\x8b\r\x01\xbc\xd9Dpk\xd3.`\xae(\u0449\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\r\xc1\x00\xb1\a\x01\x1c\u007f\xc0\xa13\x96\x12\xa1l\xce\xc3(R\b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\r\u03dd\x8c\x98\x04E\x9fd|\x14\x13\x8e\xd5\x0f\xadV;AT\x89\t`\xdbwh\x1e\x94\x00\x00\u07d4\r\xcf\xe87\xea\x1c\xf2\x8ce\xfc\xce\u00fe\xf1\xf8NY\xd1P\xc0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\r\xd4\xe6t\xbb\xad\xb1\xb0\u0702D\x98q=\xce;QV\xda)\x89\t79SM(h\x00\x00\u07d4\r\xfb\u0501pP\xd9\x1d\x9db\\\x02\x05<\xf6\x1a>\xe2\x85r\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\x0e\x02N\u007f\x02\x9cj\xaf:\x8b\x91\x0f^\b\bs\xb8W\x95\xaa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x0e\tdl\x99\xafC\x8e\x99\xfa'L\xb2\xf9\xc8V\xcbe\xf76\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x0e\f\x9d\x00^\xa0\x16\u0095\xcdy\\\xc9!>\x87\xfe\xbc3\xeb\x89\n\xbb\xcdN\xf3wX\x00\x00\u07d4\x0e\rf3\xdb\x1e\f\u007f#Jm\xf1c\xa1\x0e\n\xb3\x9c \x0f\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x0e\x11\xd7z\x89w\xfa\xc3\r&\x84E\xe51\x14\x9b1T\x1a$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e\x12=}\xa6\xd1\xe6\xfa\xc2\u072d\xd2p)$\v\xb3\x90R\xfe\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x0e\x18\x01\xe7\vbb\x86\x1b\x114\u033c9\x1fV\x8a\xfc\x92\xf7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x0e \x94\xac\x16T\xa4k\xa1\xc4\u04e4\v\xb8\xc1}\xa7\U000d6209\x13h?\u007f<\x15\xd8\x00\x00\u07d4\x0e!\xaf\x1b\x8d\xbf'\xfc\xf6?7\xe0G\xb8z\x82\\\xbe|'\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x0e.PJ-\x11\"\xb5\xa9\xfe\xee\\\xb1E\x1b\xf4\u00ac\xe8{\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x0e/\x8e(\xa6\x81\xf7|X;\xd0\xec\xde\x16cK\xdd~\x00\u0349\x05'8\xf6Y\xbc\xa2\x00\x00\u07d4\x0e2\x02\x19\x83\x8e\x85\x9b/\x9f\x18\xb7.=@s\xcaP\xb3}\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e3\xfc\xbb\xc0\x03Q\v\xe3W\x85\xb5*\x9c]!k\xc0\x05\xf4\x89e\xea=\xb7UF`\x00\x00\u07d4\x0e6\x96\xcf\x1fB\x17\xb1c\u047c\x12\xa5\xeas\x0f\x1c2\xa1J\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x0e9\x0fD\x05=\xdf\xce\xf0\xd6\b\xb3^M\x9c,\xbe\x98q\xbb\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x0e:(\xc1\u07ef\xb0P[\xdc\xe1\x9f\xe0%\xf5\x06\xa6\xd0\x1c\xeb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e=\xd7\xd4\xe4)\xfe90\xa6A@5\xf5+\xdcY\x9dxM\x89\x02,\xa3X|\xf4\xeb\x00\x00\u07d4\x0eGey\x03Rek\xc6Vh,$\xfc^\xf3\xe7j#\u01c9\x02\x86\xd7\xfc\f\xb4\xf5\x00\x00\u07d4\x0eI\x88\x00Dqw\xb8\u022f\xc3\xfd\xfa\u007fi\xf4\x05\x1b\xb6)\x89t\x05\xb6\x9b\x8d\xe5a\x00\x00\u07d4\x0ek\xaa\xa3\u07b9\x89\xf2\x89b\x00vf\x86\x18\xe9\xac3(e\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x0el\xd6d\xad\x9c\x1e\xd6K\xf9\x87I\xf4\x06D\xb6&\xe3y,\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\xe0\x94\x0em\xfdU;.\x87=*\xec\x15\xbd_\xbb?\x84r\xd8\u04d4\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\x0en\xc3\x137bq\xdf\xf5T#\xabT\"\xcc:\x8b\x06\xb2+\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x0en\u0399\x11\x1c\xad\x19a\xc7H\xed=\xf5\x1e\xddi\u04a3\xb1\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\x0e\x83\xb8PH\x1a\xb4MI\xe0\xa2)\xa2\xe4d\x90,iS\x9b\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x0e\x89\xed\xdd?\xa0\xd7\x1d\x8a\xb0\xff\x8d\xa5X\x06\x86\xe3\xd4\xf7O\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e\x90\x96\xd3C\xc0`\xdbX\x1a\x12\x01\x12\xb2x`~\xc6\xe5+\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x0e\x9cQ\x18d\xa1w\xf4\x9b\xe7\x82\x02w?`H\x9f\xe0NR\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x0e\xa2\xa2\x101+>\x86~\xe0\xd1\xcch,\xe1\xd6f\xf1\x8e\u054a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x0e\xb1\x89\xef,-Wb\xa9c\u05b7\xbd\xf9i\x8e\xa8\u7d0a\x89Hz\x9a0E9D\x00\x00\xe0\x94\x0e\xb5\xb6b\xa1\xc7\x18`\x8f\xd5/\f%\xf97\x880\x17\x85\x19\x8a\x01J7(\x1aa.t\x00\x00\xe0\x94\x0e\xc4f\x96\xff\xac\x1fX\x00_\xa8C\x98$\xf0\x8e\xed\x1d\xf8\x9b\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x0e\xc5\n\xa8#\xf4e\xb9FK\v\xc0\u0125w$\xa5U\xf5\u058a\f\x83\xd1Bj\u01f1\xf0\x00\x00\u07d4\x0e\xc50\x8b1(.!\x8f\xc9\xe7Y\xd4\xfe\xc5\xdb7\b\xce\u01096C\xaady\x86\x04\x00\x00\u07d4\x0e\xcc\xf6\x17\x84O\xd6\x1f\xbab\xcb\x0eD[z\u018b\xcc\x1f\xbe\x89\x14\xfeO\xe65e\xc6\x00\x00\u07d4\x0e\u04fb:N\xb5T\xcf\u0297\x94}WU\a\xcd\xfdm!\u0609\x1d\xb3 _\xcc#\u0540\x00\u07d4\x0e\xd7l,;]P\xff\x8f\xb5\v>\xea\xcdh\x15\x90\xbe\x1c-\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x0e\u0680\xf4\xed\aJ\xeaiz\xed\xdf(;c\xdb\xca=\xc4\u0689lk\x93[\x8b\xbd@\x00\x00\u07d4\x0e\xddKX\x0f\xf1\x0f\xe0lJ\x03\x11b9\xef\x96b+\xae5\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\x0e\xe3\x91\xf0^\u038a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x0f\x92\x9c\xf8\x95\xdb\x01z\xf7\x9f>\xad\"\x16\xb1\xbdi\xc3}\u01c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x0f\xa0\x10\xce\fs\x1d;b\x8e6\xb9\x1fW\x13\x00\u477e\xab\x8963\x03\"\xd5#\x8c\x00\x00\u07d4\x0f\xa5\xd8\u0173\xf2\x94\xef\u0515\xabi\xd7h\xf8\x18rP\x85H\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x0f\xa6\u01f0\x97=\v\xae)@T\x0e$}6'\xe3|\xa3G\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x0f\xad\x05P|\u070f$\xb2\xbeL\xb7\xfa]\x92}\u06d1\x1b\x88\x89\xa2\xdf\x13\xf4A\xf0\t\x80\x00\u07d4\x0f\xb5\xd2\xc6s\xbf\xb1\xdd\xca\x14\x1b\x98\x94\xfdm?\x05\xdag \x89\x05k\xc7^-c\x10\x00\x00\u07d4\x0f\u0260\xe3AE\xfb\xfd\xd2\xc9\u04a4\x99\xb6\x17\u05e0)i\xb9\x89\t\xc2\x00vQ\xb2P\x00\x00\xe0\x94\x0f\xcf\xc4\x06P\b\xcf\xd3#0_b\x86\xb5zM\xd7\xee\xe2;\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x0f\xdde@#\x95\u07db\u045f\xeeE\a\xefSE\xf7E\x10L\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x0f\xecN\xe0\xd7\xca\x18\x02\x90\xb6\xbd \xf9\x99#B\xf6\x0f\xf6\x8d\x89\x12 \u007f\x0e\xdc\xe9q\x80\x00\u07d4\x0f\ue06c3\x1e\xfd\x8f\x81\x16\x1cW8+\xb4P{\xb9\xeb\xec\x89\x15\xaf\x88\r\x8c\u06c3\x00\x00\u07d4\x0f\xfe\xa0mq\x13\xfbj\xec(i\xf4\xa9\u07f0\x90\a\xfa\xce\xf4\x89\f8F\x81\xb1\xe1t\x00\x00\u07d4\x10\tq\x98\xb4\xe7\xee\x91\xff\x82\xcc/;\xd9_\xeds\xc5@\xc0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x10\vM\tw\xfc\xba\xd4\u07bd^d\xa0Iz\xea\xe5\x16\x8f\xab\x89\x11\f\x90s\xb5$Z\x00\x00\xe0\x94\x10\x1a\nd\xf9\xaf\xccD\x8a\x8a\x13\rM\xfc\xbe\xe8\x957\xd8T\x8a\x037\xfe_\xea\xf2\u0440\x00\x00\u07d4\x10,G}i\xaa\u06e9\xa0\xb0\xf6+tY\xe1\u007f\xbb\x1c\x15a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x101\xe0\xec\xb5I\x85\xae!\xaf\x17\x93\x95\r\xc8\x11\x88\x8f\xde|\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x104d\x14\xbe\xc6\xd3\xdc\xc4NP\xe5MT\u00b8\xc3sN>\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x108\x98X\xb8\x00\xe8\xc0\xec2\xf5\x1e\xd6\x1a5YF\xcc@\x9b\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x10Y\xcb\xc6>6\xc4>\x88\xf3\x00\b\xac\xa7\xce\x05\x8e\ua816\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\x10n\xd5\xc7\x19\xb5&\x14w\x89\x04%\xaeuQ\xdcY\xbd%\\\x8a\x02\x89jX\xc9[\xe5\x88\x00\x00\u07d4\x10q\x1c=\xda21x\x85\xf0\xa2\xfd\x8a\xe9.\x82\x06\x9b\r\v\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x10sy\xd4\xc4gFO#[\xc1\x8eU\x93\x8a\xad>h\x8a\u05c9\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\x10v!-Ou\x8c\x8e\xc7\x12\x1c\x1c}t%I&E\x92\x84\x8a\ai[Y\xb5\xc1{L\x00\x00\u07d4\x10x\xd7\xf6\x1b\x0eV\xc7N\xe6c[.\x18\x19\xef\x1e=\x87\x85\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x10z\x03\xcf\bB\xdb\u07b0a\x8f\xb5\x87\xcai\x18\x9e\xc9/\xf5\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x10\x80\xc1\xd85\x8a\x15\xbc\x84\xda\xc8%\x89\u0392\xb9\x81\x89t\xc1\xfa\xb8\xad\xb4T\x00\x00\u07d4\x10\xe1\xe37x\x85\xc4-}\xf2\x18R.\xe7vh\x87\xc0^j\x89\x10C\xc4<\xde\x1d9\x80\x00\u07d4\x10\u342d+\xa3=\x82\xb3s\x88\u041cED\u01b0\"]\xe5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x10\xf4\xbf\xf0\u02a5\x02|\nj-\xcf\xc9R\x82M\xe2\x94\t\t\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x11\x00\x1b\x89\xed\x87>:\xae\xc1\x15V4\xb4h\x16C\x98c#\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x11\x027\u03d1\x17\xe7g\x92/\u0121\xb7\x8dyd\u0682\xdf \x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x11\x11\xe5\xdb\xf4^o\x90mb\x86o\x17\b\x10\x17\x88\xdd\xd5q\x89F{\xe6S>\xc2\xe4\x00\x00\xe0\x94\x11\x17+'\x8d\xddD\xee\xa2\xfd\xf4\xcb\x1d\x16\x96#\x91\xc4S\u064a\xc6/=\x9b\xfdH\x95\xf0\x00\x00\u07d4\x11&4\xb4\xec0\xffxn\x02AY\xf7\x96\xa5y9\xea\x14N\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x110l}WX\x867x\x0f\xc9\xfd\xe8\xe9\x8e\xcb\x00\x8f\x01d\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\x116\x12\xbc;\xa0\xeeH\x98\xb4\x9d\xd2\x023\x90_/E\x8fb\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x11A_\xaba\xe0\xdf\u0539\x06v\x14\x1aUz\x86\x9b\xa0\xbd\xe9\x89o\x05\xb5\x9d; \x00\x00\x00\u07d4\x11L\xbb\xbfo\xb5*\xc4\x14\xbe~\xc6\x1f{\xb7\x14\x95\xce\x1d\xfa\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x11L\xfe\xfeP\x17\r\xd9z\xe0\x8f\nDTIx\u0159T\x8d\x89.\u0207\xe7\xa1J\x1c\x00\x00\u07d4\x11a\b\xc1 \x84a.\xed\xa7\xa9=\xdc\xf8\xd2`.'\x9e\\\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x11d\u02aa\x8c\u0157z\xfe\x1f\xad\x8a}`(\xce-W)\x9b\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x11gZ%UF\a\xa3\xb6\xc9*\x9e\xe8\xf3ou\xed\xd3\xe36\x89\b\xa9\xab\xa5W\xe3l\x00\x00\u07d4\x11j\t\xdff\xcb\x15\x0e\x97W\x8e)\u007f\xb0n\x13\x04\f\x89<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x11o\xef^`\x16B\xc9\x18\u02c9\x16\x0f\xc2);\xa7\x1d\xa96\x89+|\xc2\xe9\xc3\"\\\x00\x00\u07d4\x11xP\x1f\xf9J\xdd\x1cX\x81\xfe\x88a6\xf6\xdf\xdb\xe6\x1a\x94\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x11y\xc6\r\xbd\x06\x8b\x15\v\aM\xa4\xbe#\x03; \u0185X\x89$\xdc\xe5M4\xa1\xa0\x00\x00\u07d4\x11}\x9a\xa3\xc4\xd1;\xee\x12\xc7P\x0f\t\xf5\xdd\x1cf\xc4e\x04\x89\v*\xd3\x04\x90\xb2x\x00\x00\xe0\x94\x11}\xb867\u007f\xe1TU\xe0,.\xbd\xa4\v\x1c\xebU\x1b\x19\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x11\x8c\x18\xb2\xdc\xe1p\xe8\xf4Eu;\xa5\xd7Q<\xb7cm-\x8a\x01\xdd\f\x88_\x9a\r\x80\x00\x00\u07d4\x11\x8f\xbdu;\x97\x929Z\xefzMx\xd2c\xcd\u02ab\xd4\xf7\x8963\x03\"\xd5#\x8c\x00\x00\xe0\x94\x11\x92\x83x\xd2}U\xc5 \xce\xed\xf2L\xeb\x1e\x82-\x89\r\xf0\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x11\x9a\xa6M[}\x18\x1d\xae\x9d<\xb4I\x95\\\x89\xc1\xf9c\xfa\x89%\xf2s\x93=\xb5p\x00\x00\xe0\x94\x11\xc05\x8a\xa6G\x9d\xe2\x18f\xfe!\a\x19$\xb6^p\xf8\xb9\x8a\a\xb5?y\xe8\x88\xda\xc0\x00\x00\xe0\x94\x11\xd2$z\"\x1ep\xc2\xd6m\x17\xee\x13\x8d8\xc5_\xfb\x86@\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x11\u05c4JG\x1e\xf8\x9a\x8d\x87uUX<\xee\xbd\x149\xea&\x8a\x02#i\u6e80\u0188\x00\x00\u07d4\x11\xdda\x85\u0668\xd7=\xdf\u06a7\x1e\x9bwtC\x1cM\xfe\u008965\u026d\xc5\u07a0\x00\x00\u07d4\x11\xe7\x99~\u0750E\x03\xd7}\xa6\x03\x8a\xb0\xa4\xc84\xbb\xd5c\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4\x11\xec\x00\xf8I\xb61\x9c\xf5\x1a\xa8\u074ff\xb3U)\xc0\xbew\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x11\ufe22\x04Q\x16\x1bdJ\x8c\u03bb\xc1\xd3C\xa3\xbb\xcbR\x89\xadx\xeb\u016cb\x00\x00\x00\xe0\x94\x11\xfe\xfb]\xc1\xa4Y\x8a\xa7\x12d\fQwu\u07e1\xd9\x1f\x8c\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x12\x0f\x9d\xe6\xe0\xaf~\xc0*\a\xc6\t\u0284G\xf1W\xe64L\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\x12\x10\xf8\v\u06c2l\x17Tb\xab\a\x16\xe6\x9eF\xc2J\xd0v\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x12\x13N\u007fk\x01{\xf4\x8e\x85Z9\x9c\xa5\x8e.\x89/\xa5\u020965\u026d\xc5\u07a0\x00\x00\u07d4\x12\x170t\x98\x01S\xae\xaaK\r\xcb\xc7\x13.\xad\xce\xc2\x1bd\x89\r\x02\xabHl\xed\xc0\x00\x00\u07d4\x12\x1f\x85[p\x14\x9a\xc84s\xb9po\xb4MG\x82\x8b\x98;\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x12'\xe1\nM\xbf\x9c\xac\xa3\x1b\x17\x80#\x9fUv\x15\xfc5\xc1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x12-\xcf\xd8\x1a\u0779}\x1a\x0eI%\u0135I\x80n\x9f;\xeb\x89R 5\xccn\x01!\x00\x00\u07d4\x12/V\x12%I\xd1h\xa5\xc5\xe2g\xf5&b\xe5\xc5\xcc\xe5\u0209\n\ad\a\xd3\xf7D\x00\x00\xe0\x94\x121o\xc7\xf1x\xea\xc2.\xb2\xb2Z\xed\xea\xdf=u\xd0\x01w\x8a\x04<3\xbe\x05\xf6\xbf\xb9\x80\x00\xe0\x94\x127Y\xf33\xe1>0i\xe2\x03KO\x059\x89\x18\x11\x9d6\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x12\\\xc5\xe4\xd5k+\xcc.\xe1\xc7\t\xfb\x9eh\xfb\x17t@\xbd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x12c#\x88\xb2v^\xe4E+P\x16\x1d\x1f\xff\xd9\x1a\xb8\x1fJ\x89(\x1d\x90\x1fO\xdd\x10\x00\x00\u07d4\x12h\x97\xa3\x11\xa1J\xd4;x\xe0\x92\x01\x00\xc4Bk\xfdk\u07494\xc7&\x89?-\x94\x80\x00\u07d4\x12m\x91\xf7\xad\x86\u07bb\x05W\xc6\x12\xca'n\xb7\xf9m\x00\xa1\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x12}?\xc5\x00;\xf6<\r\x83\xe99W\x83e\x15\xfd'\x90E\x89\x06\x10\xc9\".nu\x00\x00\xe0\x94\x12}\xb1\xca\xdf\x1bw\x1c\xbdtu\xe1\xb2ri\x0fU\x8c\x85e\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x12\x84\xf0\xce\xe9\xd2\xff)\x89\xb6Ut\xd0o\xfd\x9a\xb0\xf7\xb8\x05\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x12\x8b\x90\x8f\xe7C\xa44 =\xe2\x94\xc4A\xc7\xe2\n\x86\xeag\x89&\xab\x14\xe0\xc0\xe1<\x00\x00\xe0\x94\x12\x93\u01cc}jD;\x9dt\xb0\xba^\xe7\xbbG\xfdA\x85\x88\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\x12\x96\xac\xde\xd1\xe0c\xaf9\xfe\x8b\xa0\xb4\xb6=\xf7\x89\xf7\x05\x17\x89\x05k\xf9\x1b\x1ae\xeb\x00\x00\u07d4\x12\xaa}\x86\xdd\xfb\xad0\x16\x92\xfe\xac\x8a\b\xf8A\xcb!\\7\x89\amA\xc6$\x94\x84\x00\x00\xe0\x94\x12\xaf\xbc\xba\x14'\xa6\xa3\x9e{\xa4\x84\x9fz\xb1\xc45\x8a\xc3\x1b\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x12\xb5\xe2\x89E\xbb)i\xf9\xc6Lc\xcc\x05\xb6\xf1\xf8\xd6\xf4\u054a\x01\xa2\x9e\x86\x91;t\x05\x00\x00\u0794\x12\u03cb\x0eFR\x13!\x1a[S\u07f0\xdd'\x1a(,\x12\u0248\xd2\xf1?w\x89\xf0\x00\x00\u07d4\x12\xd2\a\x90\xb7\xd3\xdb\u060c\x81\xa2y\xb8\x12\x03\x9e\x8a`;\u0409V\xf9\x85\u04c6D\xb8\x00\x00\xe0\x94\x12\xd6\re\xb7\xd9\xfcH\x84\v\xe5\xf8\x91\xc7E\xcev\xeeP\x1e\x8a\x04\x85\xe58\x8d\fv\x84\x00\x00\u0794\x12\xd9\x1a\x92\xd7O\xc8a\xa7)dm\xb1\x92\xa1%\xb7\x9fSt\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\x12\u992d*\xd5t\x84\xddp\x05e\xbd\xdbFB;\u067d1\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\x12\xf3,\n\x1f-\xaa\xb6v\xfei\xab\xd9\xe0\x185-L\xcdE\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\x12\xf4`\xaedl\xd2x\x0f\xd3\\P\xa6\xafK\x9a\xcc\xfa\x85\u018965\u026d\xc5\u07a0\x00\x00\u07d4\x12\xff\xc1\x12\x86\x05\xcb\f\x13p\x9ar\x90Po&\x90\x97q\x93\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\x13\x03$F\xe7\xd6\x10\xaa\x00\xec\x8cV\u0275t\xd3l\xa1\xc0\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x13\x1cy,\x19}\x18\xbd\x04]p$\x93|\x1f\x84\xb6\x0fD8\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13\x1d\xf8\xd30\xeb|\xc7\x14}\nUWo\x05\u078d&\xa8\xb7\x89\n1\x06+\xee\xedp\x00\x00\u07d4\x13\x1f\xae\xd1%a\xbbz\xee\x04\xe5\x18Z\xf8\x02\xb1\xc3C\x8d\x9b\x89\v\xdf\x0e\u0733\x90\xc9\xc8V\b\xb7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x13!\xcc\xf2\x979\xb9t\xe5\xa5\x16\xf1\x8f:\x846q\xe3\x96B\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13'\xd7Y\xd5n\n\xb8z\xf3~\xcfc\xfe\x01\xf3\x10\xbe\x10\n\x89#\xbc<\xdbh\xa1\x80\x00\x00\u07d4\x13)\xdd\x19\xcdK\xaa\x9f\xc6C\x10\xef\xec\xea\xb2!\x17%\x1f\x12\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x137\x1f\x92\xa5n\xa88\x1eC\x05\x9a\x95\x12\x8b\xdcMC\u0166\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x13O\x15\xe1\xe3\x9cSCY0\xaa\xed\xf3\xe0\xfeV\xfd\xe8C\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x13Ac\xbe\x9f\xbb\xe1\xc5in\xe2U\xe9\v\x13%C\x95\xc3\x18\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x13\\\xec\xd9U\xe5y\x83pv\x920\x15\x93\x03\u0671\x83\x9ff\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x13]\x17\x19\xbf\x03\xe3\xf8f1$y\xfe3\x81\x18\xcd8~p\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x13^\xb8\xc0\xe9\xe1\x01\xde\xed\xec\x11\xf2\xec\xdbf\xae\x1a\xae\x88g\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x13`\xe8}\xf2Li\xeemQ\xc7nsv\u007f\xfe\x19\xa2\x13\x1c\x89\x04\xfc\xc1\xa8\x90'\xf0\x00\x00\u07d4\x13l\x83K\xf1\x112m s\x95)[.X>\xa7\xf35r\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x13mKf+\xbd\x10\x80\xcf\xe4D[\x0f\xa2\x13\x86D5\xb7\xf1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13oI\a\u02b4\x1e'\bK\x98E\x06\x9f\xf2\xfd\f\x9a\xdey\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13t\xfa\xcd{?\x8dhd\x9d`\xd4U\x0e\xe6\x9f\xf0HA3\x89\x0e\x9e\xd6\xe1\x11r\xda\x00\x00\u07d4\x13|\xf3A\xe8Ql\x81X\x14\xeb\xcds\xe6V\x9a\xf1L\xf7\xbc\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x13\x84\x8bF\xeau\xbe\xb7\xea\xa8_Y\xd8f\xd7\u007f\xd2L\xf2\x1a\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\x13\x9d51\u0252*\xd5bi\xf60\x9a\xa7\x89\xfb$\x85\xf9\x8c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x13\x9eG\x97d\xb4\x99\xd6f \x8cJ\x8a\x04z\x97\x041c\u0749 w!*\xffm\xf0\x00\x00\u07d4\x13\xa5\xee\xcb80]\xf9Iq\xef-\x9e\x17\x9a\xe6\u03ba\xb37\x89\x11\u3ac3\x95\xc6\xe8\x00\x00\u07d4\x13\xac\xad\xa8\x98\n\xff\xc7PI!\xbe\x84\xebID\xc8\xfb\xb2\xbd\x89V\u04aa:\\\t\xa0\x00\x00\u07d4\x13\xb9\xb1\a\x15qL\t\xcf\xd6\x10\u03dc\x98F\x05\x1c\xb1\xd5\x13\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x13\xce3-\xffe\xa6\xab\x938\x97X\x8a\xa2>\x00\t\x80\xfa\x82\x89\x0e\x02\x056\xf0(\xf0\x00\x00\u07d4\x13\xd6z~%\xf2\xb1,\u06c5XP\t\xf8\xac\u011b\x96s\x01\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x13\xde\xe0>7\x99\x95-\a8\x84=K\xe8\xfc\n\x80?\xb2\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x13\xe0/\xb4H\xd6\xc8J\xe1}\xb3\x10\xad(m\x05a`\u0695\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x13\xe3!r\x8c\x9cWb\x80X\xe9?\xc8f\xa02\xdd\v\u0690\x89&\xbc\xca#\xfe.\xa2\x00\x00\u07d4\x13\xec\x81\"\x84\x02n@\x9b\xc0f\xdf\xeb\xf9\u0564\xa2\xbf\x80\x1e\x89WG=\x05\u06ba\xe8\x00\x00\xe0\x94\x14\x01)\xea\xa7f\xb5\xa2\x9f[:\xf2WND\t\xf8\xf6\xd3\xf1\x8a\x01Z\xf1\u05cbX\xc4\x00\x00\x00\u07d4\x14\x05\x18\xa3\x19K\xad\x13P\xb8\x94\x9ee\x05e\u07bem\xb3\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x14\x06\x85M\x14\x9e\b\x1a\xc0\x9c\xb4\xcaV\r\xa4c\xf3\x120Y\x89Hz\x9a0E9D\x00\x00\u07d4\x14\f\xa2\x8f\xf3;\x9ff\xd7\xf1\xfc\x00x\xf8\xc1\xee\xf6\x9a\x1b\xc0\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x14\x0f\xbaX\xdb\xc0H\x03\xd8L!0\xf0\x19x\xf9\xe0\xc71)\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\x14\x1a^9\xee/h\n`\x0f\xbfo\xa2\x97\u0790\xf3\"\\\u074a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x14%N\xa1&\xb5-\x01B\xda\n~\x18\x8c\xe2U\xd8\xc4qx\x89*\x03I\x19\u07ff\xbc\x00\x00\u07d4\x14+\x87\xc5\x04?\xfbZ\x91\xdf\x18\xc2\xe1\t\xce\xd6\xfeJq\u06c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x14\x87\xf5\xa5$\u0288Q^\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4\x14\xa75 f6D\x04\xdbP\xf0\xd0\u05cduJ\"\x19\x8e\xf4\x89e\xea=\xb7UF`\x00\x00\u07d4\x14\xab\x16K;RL\x82\u05ab\xfb\xc0\u0783\x11&\xae\x8d\x13u\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x14\xb1`>\xc6+ \x02 3\xee\xc4\xd6\xd6eZ\xc2J\x01Z\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\x14\xc6;\xa2\u0731\xddM\xf3=\u06b1\x1cO\x00\a\xfa\x96\xa6-\x8a\x03HA\xb6\x05z\xfa\xb0\x00\x00\xe0\x94\x14\xcd\u077c\x8b\t\xe6gZ\x9e\x9e\x05\t\x1c\xb9\"8\u00de\x1e\x8a\x01\x14x\xb7\xc3\n\xbc0\x00\x00\u07d4\x14\xd0\n\xad9\xa0\xa7\u045c\xa0SP\xf7\xb07'\xf0\x8d\xd8.\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x14\xee\xc0\x9b\xf0>5+\xd6\xff\x1b\x1e\x87k\xe6d\xce\xff\xd0\u03c9\x01\x16\xdc:\x89\x94\xb3\x00\x00\u07d4\x14\xf2!\x15\x95\x18x;\u0127\x06go\xc4\xf3\xc5\xee@X)\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x14\xfc\xd19\x1e}s/Avl\xda\u0344\xfa\x1d\xeb\x9f\xfd\u0489lk\x93[\x8b\xbd@\x00\x00\u07d4\x15\x0e=\xbc\xbc\xfc\x84\xcc\xf8\x9bsBwc\xa5e\xc2>`\u0409\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\x15\x18b{\x885\x1f\xed\xe7\x96\xd3\xf3\b3d\xfb\u0508{\f\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u0794\x15\"J\xd1\xc0\xfa\xceF\xf9\xf5V\xe4wJ0%\xad\x06\xbdR\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\x15/+\xd2)\xdd\xf3\xcb\x0f\xda\xf4U\xc1\x83 \x9c\x0e\x1e9\xa2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x15/N\x86\x0e\xf3\xee\x80jP'w\xa1\xb8\xdb\xc9\x1a\x90vh\x89 \x86\xac5\x10R`\x00\x00\u07d4\x15<\b\xaa\x8b\x96\xa6\x11\xefc\xc0%>*C4\x82\x9eW\x9d\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\x15<\xf2\x84,\xb9\u0787l'o\xa6Gg\u0468\xec\xf5s\xbb\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x15>\xf5\x8a\x1e.z>\xb6\xb4Y\xa8\n\xb2\xa5G\xc9A\x82\xa2\x8a\x14T+\xa1*3|\x00\x00\x00\u07d4\x15DY\xfa/!1\x8e44D\x97\x89\xd8&\xcd\xc1W\f\xe5\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x15G\xb9\xbfz\xd6bt\xf3A8'#\x1b\xa4\x05\ue308\xc1\x8a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4\x15H\xb7p\xa5\x11\x8e\u0787\u06e2\xf6\x903\u007fam\u60eb\x89\x1c\x99V\x85\u0fc7\x00\x00\u07d4\x15R\x83P\xe0\xd9g\n.\xa2\u007f{J3\xb9\xc0\xf9b\x1d!\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\x15[7y\xbbmV4./\u0681{[-\x81\xc7\xf4\x13'\x89\x02\xb8\xaa:\al\x9c\x00\x00\u07d4\x15e\xaf\x83~\xf3\xb0\xbdN+#V\x8dP#\xcd4\xb1d\x98\x89\x15Q\xe9rJ\u013a\x00\x00\u07d4\x15f\x91\x80\xde\u2558\x86\x9b\b\xa7!\xc7\xd2LL\x0e\xe6?\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x15r\xcd\xfa\xb7*\x01\u0396\x8ex\xf5\xb5D\x8d\xa2\x98S\xfb\u074a\x01\x12blI\x06\x0f\xa6\x00\x00\xe0\x94\x15uY\xad\xc5Wd\xccm\xf7\x93#\t%4\xe3\xd6dZf\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x15x\xbd\xbc7\x1bM$8E3\x05V\xff\xf2\xd5\xefM\xffg\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x15~\xb3\xd3\x11;\u04f5\x97qM:\x95N\xdd\x01\x89\x82\xa5\u02c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x15\x84\xa2\xc0f\xb7\xa4U\xdb\u05ae(\a\xa73N\x83\xc3_\xa5\x89\a\f\x1c\xc7;\x00\xc8\x00\x00\u07d4\x15\x87F\x86\xb6s=\x10\xd7\x03\xc9\xf9\xbe\xc6\xc5.\xb8b\x8dg\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x15\x8a\ra\x92S\xbfD2\xb5\xcd\x02\u01f8b\xf7\u00b7V6\x89\a[\xac|[\x12\x18\x80\x00\u07d4\x15\x98\x12y\x82\xf2\xf8\xad;k\x8f\xc3\xcf'\xbfax\x01\xba+\x89\t`\xdbwh\x1e\x94\x00\x00\xe0\x94\x15\x9a\xdc\xe2z\xa1\vG#d)\xa3JZ\xc4,\xad[d\x16\x8a\x06\xbf\x90\xa9n\xdb\xfaq\x80\x00\u07d4\x15\xa0\xae\xc3\u007f\xf9\xff=T\t\xf2\xa4\xf0\xc1!*\xac\xcb\x02\x96\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x15\xaaS\r\xc3iX\xb4\xed\xb3\x8e\xeem\xd9\xe3\xc7}L\x91E\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x15\xac\xb6\x15h\xecJ\xf7\xea(\x198a\x81\xb1\x16\xa6\xc5\xeep\x8a\x06\x90\x83l\n\xf5\xf5`\x00\x00\u07d4\x15\xb9o0\xc2;\x86d\xe7I\x06Q\x06k\x00\xc49\x1f\xbf\x84\x89\x16B\xe9\xdfHv)\x00\x00\u07d4\x15\xc7\xed\xb8\x11\x8e\xe2{4\"\x85\xebY&\xb4z\x85[\u01e5\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x15\u0654hPz\xa0A?\xb6\r\xca*\xdc\u007fV\x9c\xb3kT\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x15\u06f4\x8c\x980\x97d\xf9\x9c\xed6\x92\xdc\xca5\xee0k\xac\x8a\x1f\u00c4+\xd1\xf0q\xc0\x00\x00\xe0\x94\x15\u072f\xcc+\xac\xe7\xb5[T\xc0\x1a\x1cQF&\xbfa\xeb\u060a\x01\xfd\x934\x94\xaa_\xe0\x00\x00\u07d4\x15\u3d44\x05kb\xc9s\xcf^\xb0\x96\xf1s>T\xc1\\\x91\x892\xc7Z\x02#\xdd\xf3\x00\x00\u07d4\x15\xeb\xd1\xc7\xca\u04af\xf1\x92u\xc6W\xc4\xd8\b\xd0\x10\xef\xa0\xf5\x89\n\xdf0\xbap\u0217\x00\x00\u07d4\x15\xee\x0f\xc6>\xbf\x1b\x1f\u011d{\xb3\x8f\x88c\x82:.\x17\u0489g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x15\xf1\xb3R\x11\rh\x90\x1d\x8fg\xaa\xc4jl\xfa\xfe\x03\x14w\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x15\xf2\xb7\xb1d2\xeeP\xa5\xf5[A#/c4\xedX\xbd\xc0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x16\x01\x9aM\xaf\xabC\xf4\u067fAc\xfa\xe0\x84}\x84\x8a\xfc\xa2\x89\x01[\xc7\x019\xf7J\x00\x00\u07d4\x16\x02&\xef\xe7\xb5:\x8a\xf4b\xd1\x17\xa0\x10\x80\x89\xbd\xec\xc2\u0449\n\xdf0\xbap\u0217\x00\x00\u07d4\x16\f\xebo\x98\x0e\x041_S\xc4\xfc\x98\x8b+\xf6\x9e(M}\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\xe0\x94\x16\x1c\xafZ\x97*\u0383y\xa6\u0420J\xe6\xe1c\xfe!\xdf+\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\x16\x1d&\xefgY\xba[\x9f \xfd\xcdf\xf1a2\xc3RA^\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16!\x10\xf2\x9e\xac_}\x02\xb5C\xd8\xdc\u057bY\xa5\xe3;s\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x16+\xa5\x03'b\x14\xb5\t\xf9u\x86\xbd\x84!\x10\xd1\x03\xd5\x17\x8a\x01\xe7\xff\u0609\\\"h\x00\x00\u07d4\x16-v\xc2\xe6QJ:\xfbo\xe3\xd3\u02d3\xa3\\Z\xe7\x83\xf1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16;\xadJ\x12+E}d\xe8\x15\nA>\xaeM\a\x02>k\x89\x01\x04\xe7\x04d\xb1X\x00\x00\u07d4\x16<\u023e\"vF\xcb\tq\x91Y\xf2\x8e\u041c]\xc0\xdc\xe0\x89Hz\x9a0E9D\x00\x00\u07d4\x16=\xcas\xd7\xd6\xea?>`b2*\x874\x18\f\vx\uf25ft \x03\xcb}\xfc\x00\x00\u07d4\x16Mz\xac>\xec\xba\uc86dQ\x91\xb7S\xf1s\xfe\x12\xec3\x89(VR\xb8\xa4hi\x00\x00\u07d4\x16Rl\x9e\u07d4>\xfaOm\x0f\v\xae\x81\xe1\x8b1\xc5@y\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x16S\x05\xb7\x872.%\xdcj\xd0\xce\xfelo3Fx\xd5i\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16e\xab\x179\xd7\x11\x19\xeea2\xab\xbd\x92j'\x9f\xe6yH\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\x16k\xf6\u06b2-\x84\x1bHl8\xe7\xbaj\xb3:\x14\x87\ud30a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x16v\x99\xf4\x8ax\xc6\x15Q%\x15s\x99X\x993\x12WO\a\x89\x02\x1d;\xd5^\x80<\x00\x00\u07d4\x16x\xc5\xf2\xa5\"92%\x19ca\x89OS\xccu/\xe2\xf3\x89h\xf3e\xae\xa1\xe4@\x00\x00\u07d4\x16|\xe7\xdee\xe8G\bYZRT\x97\xa3\xeb^ZfPs\x89\x1f1Gsfo\xc4\x00\x00\u07d4\x16~>:\xe2\x003HE\x93\x92\xf7\xdf\xceD\xaf|!\xadY\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x16\x80\xce\xc5\x02\x1e\xe90P\xf8\xae\x12rQ\x83\x9et\xc1\xf1\xfd\x8a\x02\xc6\x14a\xe5\xd7C\u0580\x00\u07d4\x16\x81j\xac\x0e\xde\r-<\xd4B\xday\xe0c\x88\x0f\x0f\x1dg\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x16\x8bP\x19\xb8\x18i\x16D\x83_\xe6\x9b\xf2)\xe1q\x12\xd5,\x8a\x05\xed\xe2\x0f\x01\xa4Y\x80\x00\x00\u07d4\x16\x8b\xde\xc8\x18\xea\xfcm)\x92\xe5\xefT\xaa\x0e\x16\x01\xe3\xc5a\x8967Pz0\xab\xeb\x00\x00\u07d4\x16\x8d0\xe5?\xa6\x81\t+R\xe9\xba\xe1Z\r\xcbA\xa8\u027b\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x16\x9b\xbe\xfcA\xcf\xd7\xd7\u02f8\xdf\xc60 \xe9\xfb\x06\u0515F\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16\xa5\x8e\x98]\xcc\xd7\a\xa5\x94\u0453\xe7\u0327\x8b]\x02xI\x89I\xb9\u029aiC@\x00\x00\u07d4\x16\xa9\xe9\xb7:\u92c6M\x17(y\x8b\x87f\xdb\xc6\xea\x8d\x12\x893\xe7\xb4K\r\xb5\x04\x00\x00\u07d4\x16\xaaR\xcb\vUG#\xe7\x06\x0f!\xf3'\xb0\xa6\x83\x15\xfe\xa3\x89\r\x8drkqw\xa8\x00\x00\u07d4\x16\xab\xb8\xb0!\xa7\x10\xbd\u01ce\xa54\x94\xb2\x06\x14\xffN\xaf\xe8\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x16\xaf\xa7\x87\xfc\x9f\x94\xbd\xffiv\xb1\xa4/C\n\x8b\xf6\xfb\x0f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16\xba\xe5\xd2N\xff\x91w\x8c\u064bM:\x1c\xc3\x16/D\xaaw\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\x16\xbc@!Z\xbb\u066e](\v\x95\xb8\x01\vE\x14\xff\x12\x92\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x16\xbeu\u9299Z9R\"\xd0\v\u05df\xf4\xb6\xe68\u144a\a\x9f\x90\\o\xd3N\x80\x00\x00\u07d4\x16\xc1\xbf[}\xc9\xc8<\x17\x9e\xfa\xcb\xcf.\xb1t\xe3V\x1c\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x16\u01f3\x1e\x8c7b\x82\xac\"qr\x8c1\xc9^5\xd9R\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x16\xf3\x13\u03ca\xd0\x00\x91J\n\x17m\u01a44+y\xec%8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x16\xff\xac\x84\x03)@\xf0\x12\x1a\tf\x8b\x85\x8a~y\xff\xa3\xbb\x89\xd2J\xdan\x10\x87\x11\x00\x00\xe0\x94\x17\x03\xb4\xb2\x92\xb8\xa9\xde\xdd\xed\xe8\x1b\xb2]\x89\x17\x9fdF\xb6\x8a\x04+e\xa4U\xe8\xb1h\x00\x00\u07d4\x17\x04\x93\x11\x10\x1d\x81~\xfb\x1de\x91\x0ff6b\xa6\x99\u024c\x89lh\xcc\u041b\x02,\x00\x00\u07d4\x17\x04\xce\xfc\xfb\x131\xeczx8\x8b)9>\x85\xc1\xafy\x16\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x17\n\x88\xa8\x99\u007f\x92\xd287\x0f\x1a\xff\xde\xe64pP\xb0\x13\x89\xa2\xacw5\x14\x880\x00\x00\u07d4\x17\x10\x8d\xab,P\xf9\x9d\xe1\x10\u1cf3\xb4\u0342\xf5\xdf(\xe7\x895 ;g\xbc\xca\xd0\x00\x00\xe0\x94\x17\x12[Y\xacQ\xce\xe0)\xe4\xbdx\xd7\xf5\x94}\x1e\xa4\x9b\xb2\x8a\x04\xa8\x9fT\xef\x01!\xc0\x00\x00\u07d4\x17\x1a\u0660K\xed\u0238a\xe8\xedK\xdd\xf5qx\x13\xb1\xbbH\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x17\x1c\xa0*\x8bmb\xbfL\xa4~\x90i\x14\a\x98a\x97,\xb2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x17\"\xc4\xcb\xe7\n\x94\xb6U\x9dBP\x84\xca\xee\xd4\xd6\xe6n!\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x17X\vvotSR\\\xa4\u01a8\x8b\x01\xb5\x05p\xea\b\x8c\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x17X\x9al\x00jT\xca\xd7\x01\x03\x12:\xae\n\x82\x13_\u07b4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x17Z\x18::#_\xfb\xb0;\xa85gRg\"\x94\x17\xa0\x91\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\x17_\xee\xea*\xa4\xe0\xef\xda\x12\xe1X\x8d/H2\x90\xed\xe8\x1a\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x17e6\x1c.\xc2\xf86\x16\u0383c\xaa\xe2\x10%\xf2Vo@\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x17gR\\_Z\"\xed\x80\xe9\xd4\xd7q\x0f\x03b\u049e\xfa3\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x17v%`\xe8*\x93\xb3\xf5\"\xe0\xe5$\xad\xb8a,:tp\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x17}\xaex\xbc\x01\x13\xd8\u04dcD\x02\xf2\xa6A\xae*\x10Z\xb8\x89b\x92BV \xb4H\x00\x00\xe0\x94\x17\x84\x94\x8b\xf9\x98H\u021eDV8PM\u0598'\x1bY$\x8a\x01GLA\r\x87\xba\xee\x00\x00\u07d4\x17\x88\u069bW\xfd\x05\xed\xc4\xff\x99\xe7\xfe\xf3\x01Q\x9c\x8a\n\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x17\x8e\xafk\x85T\xc4]\xfd\xe1kx\xce\f\x15\u007f.\xe3\x13Q\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4\x17\x96\x1dc;\xcf \xa7\xb0)\xa7\xd9K}\xf4\xda.\xc5B\u007f\x89\fo\xf0p\U000532c0\x00\u07d4\x17\x96\xbc\xc9{\x8a\xbcq\u007fKJ|k\x106\xea!\x82c\x9f\x89\x13A\xf9\x1c\xd8\xe3Q\x00\x00\u07d4\x17\x99=1*\xa1\x10iW\x86\x8fjU\xa5\xe8\xf1/w\xc8C\x89\x18e\xe8\x14\xf4\x14.\x80\x00\u07d4\x17\x9a\x82^\x0f\x1fn\x98S\tf\x84e\xcf\xfe\xd46\xf6\xae\xa9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x17\xb2\xd6\xcfe\xc6\xf4\xa3G\xdd\xc6W&U5M\x8aA+)\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x17\xb8\a\xaf\xa3\xdd\xd6G\xe7#T.{R\xfe\xe3\x95'\xf3\x06\x89\x15\xaf@\xff\xa7\xfc\x01\x00\x00\u07d4\x17\xc0G\x86W\xe1\xd3\xd1z\xaa3\x1d\xd4)\xce\u03d1\xf8\xae]\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4\x17\xc0\xfe\xf6\x98l\xfb.@A\xf9\x97\x9d\x99@\xb6\x9d\xff=\xe2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x17\u0511\x8d\xfa\xc1]w\xc4\u007f\x9e\xd4\x00\xa8P\x19\rd\xf1Q\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x17\xd5!\xa8\xd9w\x90#\xf7\x16M#<;d \xff\xd2#\xed\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x17\xd91\xd4\xc5b\x94\u073ew\xc8e[\xe4i_\x00mJ<\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x17\xdfIQ\x8ds\xb1)\xf0\xda6\xb1\u0274\f\xb6d \xfd\u01ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x17\xe4\xa0\xe5+\xac>\xe4N\xfe\tT\xe7S\u0538]dN\x05\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x17\xe5\x84\xe8\x10\xe5gp,a\xd5]CK4\u0375\xee0\xf6\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x17\xe8.px\xdcO\xd9\xe8y\xfb\x8aPf\u007fS\xa5\xc5E\x91\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x17\xe8o;[0\xc0\xbaY\xf2\xb2\xe8XB[\xa8\x9f\n\x10\xb0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x17\xee\x9fT\xd4\xdd\xc8Mg\x0e\xff\x11\xe5Je\x9f\xd7/DU\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\xe0\x94\x17\xefJ\xcc\x1b\xf1G\xe3&t\x9d\x10\xe6w\xdc\xff\xd7o\x9e\x06\x8a\bwQ\xf4\xe0\xe1\xb50\x00\x00\u07d4\x17\xf1F2\xa7\xe2\x82\v\xe6\xe8\xf6\u07c25X(=\xad\xab-\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x17\xf5#\xf1\x17\xbc\x9f\xe9x\xaaH\x1e\xb4\xf5V\x17\x117\x1b\u0209li\xf7>)\x13N\x00\x00\u07d4\x17\xfd\x9bU\x1a\x98\xcba\xc2\xe0\u007f\xbfA\xd3\xe8\u02650\u02e5\x89\x01v\x8c0\x81\x93\x04\x80\x00\u07d4\x18\x04x\xa6U\u05cd\x0f;\fO +aH[\xc4\x00/\u0549lk\x93[\x8b\xbd@\x00\x00\u07d4\x18\x13l\x9d\xf1g\xaa\x17\xb6\xf1\x8e\"\xa7\x02\u020fK\u0082E\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x18\x15'\x9d\xff\x99R\xda;\xe8\xf7rI\xdb\xe2\"C7{\xe7\x8a\x01\x01|\xb7n{&d\x00\x00\u07d4\x18\x1f\xbb\xa8R\xa7\xf5\x01x\xb1\xc7\xf0>\xd9\xe5\x8dT\x16))\x89$\x1a\x9bOaz(\x00\x00\xe0\x94\x18'\x03\x9f\tW\x02\x94\b\x8f\xdd\xf0G\x16\\3\u65a4\x92\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\x18-\xb8R\x93\xf6\x06\u8248\xc3pL\xb3\xf0\xc0\xbb\xbf\xcaZ\x89\a?u\u0460\x85\xba\x00\x00\u07d4\x18H\x00<%\xbf\u052a\x90\xe7\xfc\xb5\u05f1k\xcd\f\xff\xc0\u060965\u026d\xc5\u07a0\x00\x00\xe0\x94\x18JO\v\xebq\xff\xd5X\xa6\xb6\xe8\xf2(\xb7\x87\x96\xc4\xcf>\x8a\x02\x8a\x85t%Fo\x80\x00\x00\xe0\x94\x18M\x86\xf3Fj\xe6h;\x19r\x99\x82\xe7\xa7\u1903G\xb2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x18Q\xa0c\xcc\xdb0T\x90w\xf1\xd19\xe7-\xe7\x97\x11\x97\u0549lk\x93[\x8b\xbd@\x00\x00\u07d4\x18UF\xe8v\x8dPhs\x81\x8a\xc9u\x1c\x1f\x12\x11j;\xef\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x18X\xcf\x11\xae\xa7\x9fS\x98\xad+\xb2\"g\xb5\xa3\xc9R\xeat\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\xe0\x94\x18Z\u007f\u012c\xe3h\xd23\xe6 \xb2\xa4Y5f\x12\x92\xbd\xf2\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x18d\xa3\u01f4\x81UD\x8cT\u020cp\x8f\x16g\tsm1\x89\a?u\u0460\x85\xba\x00\x00\u07d4\x18j\xfd\xc0\x85\xf2\xa3\xdc\xe4a^\xdf\xfb\xad\xf7\x1a\x11x\x0fP\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x18k\x95\xf8\xe5\xef\xfd\xdc\xc9O\x1a1[\xf0)];\x1e\xa5\x88\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x18}\x9f\f\a\xf8\xebt\xfa\xaa\xd1^\xbc{\x80Dt\x17\xf7\x82\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x18\x95\xa0\xebJCrr/\xcb\u016f\xe6\x93o(\x9c\x88\xa4\x19\x891T\xc9r\x9d\x05x\x00\x00\u07d4\x18\x99\xf6\x9fe;\x05\xa5\xa6\xe8\x1fH\a\x11\u041b\xbf\x97X\x8c\x89i\xfb\x13=\xf7P\xac\x00\x00\u07d4\x18\xa6\xd2\xfcR\xbes\b@#\xc9\x18\x02\xf0[\xc2JK\xe0\x9f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x18\xb0@|\xda\xd4\xceR`\x06#\xbd^\x1fj\x81\xaba\xf0&\x89\x11Q\xcc\xf0\xc6T\u0180\x00\u07d4\x18\xb8\xbc\xf9\x83!\xdaa\xfbN>\xac\xc1\xecT\x17'-\xc2~\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\x18\xc6r:gS)\x9c\xb9\x14G}\x04\xa3\xbd!\x8d\xf8\xc7u\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x18\xe1\x13\xd8\x17|i\x1aa\xbexXR\xfa[\xb4z\uef6f\x89Hz\x9a0E9D\x00\x00\xe0\x94\x18\xe4\xceGH;S\x04\n\u06eb5\x17,\x01\xefdPn\f\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\xe0\x94\x18\xe52C\x98\x1a\xab\xc8v}\xa1\fsD\x9f\x13\x91V\x0e\xaa\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x18\xfa\x86%\xc9\u0704>\x00\x15\x9e\x892\xf5\x1e\u06ea\xa30\x00\x00\xe0\x94\x193\xe34\xc4\x0f:\u02ed\f\v\x85\x11X i$\xbe\xca:\x8a\x01\x99^\xaf\x01\xb8\x96\x18\x80\x00\xe0\x94\x197\xc5\xc5\x15\x05uS\u033dF\u0546dU\xcef)\x02\x84\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\u07d4\x19:\xc6Q\x83e\x18\x00\xe25\x80\xf8\xf0\xea\u04fbY~\xb8\xa4\x89\x02\xb6*\xbc\xfb\x91\n\x00\x00\u07d4\x19=7\xed4}\x1c/N55\r\x9aDK\xc5|\xa4\xdbC\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94\x19@\u0713d\xa8R\x16_GAN'\xf5\x00$E\xa4\xf1C\x8a\x02L-\xffj<|H\x00\x00\u07d4\x19E\xfe7\u007f\xe6\u0537\x1e>y\x1fo\x17\xdb$<\x9b\x8b\x0f\x89vy\u7fb9\x886\x00\x00\u07d4\x19Jk\xb3\x02\xb8\xab\xa7\xa5\xb5y\u07d3\xe0\xdf\x15t\x96v%\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x19L\ubd12\x98\x82\xbf;K\xf9\x86L+\x1b\x0fb\u0083\xf9\x89\x1e\xf8aS\x1ft\xaa\x00\x00\u07d4\x19O\xf4J\xef\xc1{\xd2\x0e\xfdz LG\xd1b\f\x86\xdb]\x89\xa2\x99\th\u007fj\xa4\x00\x00\xe0\x94\x19O\xfex\xbb\xf5\xd2\r\u044a\x1f\x01\xdaU.\x00\xb7\xb1\x1d\xb1\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\x19S1>*\xd7F#\x9c\xb2'\x0fH\xaf4\u063b\x9cDe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x19W\x1a+\x8f\x81\u01bc\xf6j\xb3\xa1\x00\x83)V\x17\x15\x00\x03\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\xe0\x94\x19h}\xaa9\xc3h\x13\x9bn{\xe6\r\xc1u:\x9f\f\xbe\xa3\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x19l\x02!\nE\n\xb0\xb3cpe_qz\xa8{\xd1\xc0\x04\x89\x0e\x10\xac\xe1W\xdb\xc0\x00\x00\u07d4\x19n\x85\xdf~s+J\x8f\x0e\xd06#\xf4\u06dd\xb0\xb8\xfa1\x89\x01%\xb9/\\\xef$\x80\x00\u07d4\x19s+\xf9s\x05]\xbd\x91\xa4S:\u06a2\x14\x9a\x91\u04c3\x80\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x19vr\xfd9\xd6\xf2F\xcef\xa7\x90\xd1:\xa9\"\xd7\x0e\xa1\t\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x19y\x8c\xbd\xa7\x15\ua69b\x9dj\xab\x94,U\x12\x1e\x98\xbf\x91\x89A\rXj \xa4\xc0\x00\x00\u07d4\x19\x8b\xfc\xf1\xb0z\xe3\b\xfa,\x02\x06\x9a\xc9\xda\xfeq5\xfbG\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x19\x8e\xf1\xec2Z\x96\xcc5Lrf\xa08\xbe\x8b\\U\x8fg\x8a\x80\xd1\xe47>\u007f!\xda\x00\x00\xe0\x94\x19\x91\x8a\xa0\x9e}IN\x98\xff\xa5\xdbP5\b\x92\xf7\x15j\u018a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x19\xb3k\f\x87\xeafN\xd8\x03\x18\xdcw\xb6\x88\xdd\xe8}\x95\xa5\x89i\x9fI\x98\x020=\x00\x00\u07d4\x19\u07d4E\xa8\x1c\x1b=\x80J\xea\xebon NB6f?\x89\x02\x06\xd9NjI\x87\x80\x00\u07d4\x19\xe5\u07a37\n,tj\xae4\xa3|S\x1fA\xda&N\x83\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x19\xe7\xf3\xeb{\xf6\u007f5\x99 \x9e\xbe\b\xb6*\xd32\u007f\x8c\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\x19\xe9Nb\x00P\xaa\xd7f\xb9\xe1\xba\xd91#\x83\x12\u053fI\x89\x81\xe3-\xf9r\xab\xf0\x00\x00\u07d4\x19\xec\xf2\xab\xf4\f\x9e\x85{%/\xe1\xdb\xfd=L]\x8f\x81n\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x19\xf5\xca\xf4\xc4\x0ei\b\x81<\aE\xb0\xae\xa9Xm\x9d\xd91\x89#\xfe\xd9\xe1\xfa+`\x00\x00\u07d4\x19\xf6C\xe1\xa8\xfa\x04\xae\x16\x00`(\x13\x833\xa5\x9a\x96\u0787\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x19\xf9\x9f,\vF\u0389\x06\x87]\xc9\xf9\n\xe1\x04\xda\xe3U\x94\x89\xf4WZ]M\x16*\x00\x00\u07d4\x19\xff$O\xcf\xe3\xd4\xfa/O\u065f\x87\xe5[\xb3\x15\xb8\x1e\xb6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1a\x04\xce\xc4 \xadC\"\x15$mw\xfe\x17\x8d3\x9e\u0435\x95\x89\x11!a\x85\u009fp\x00\x00\xe0\x94\x1a\x04\xd58\x9e\xb0\x06\xf9\u0388\f0\xd1SS\xf8\xd1\x1cK1\x8a\x03\x9d\x84\xb2\x18m\xc9\x10\x00\x00\u07d4\x1a\bA\xb9*\u007fpuV\x9d\xc4b~kv\u02b0Z\u0791\x89Rf<\u02b1\xe1\xc0\x00\x00\xe0\x94\x1a\b]C\xec\x92AN\xa2{\x91O\xe7g\xb6\xd4k\x1e\xefD\x8a\x06A\xe8\xa15c\xd8\xf8\x00\x00\u07d4\x1a\t\xfd\xc2\u01e2\x0e#WK\x97\u019e\x93\u07bag\xd3r \x89lO\xd1\xee$nx\x00\x00\u07d4\x1a\n\x1d\u07f01\xe5\xc8\xcc\x1dF\xcf\x05\x84-P\xfd\xdcq0\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x1a\x1c\x9a&\xe0\xe0$\x18\xa5\xcfh}\xa7Z'\\b,\x94@\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x1a \x1bC'\u03a7\xf3\x99\x04bF\xa3\xc8~n\x03\xa3\u0368\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1a$4\xccwD\"\u050dS\u055c]V,\u0384\a\xc9K\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4\x1a%\xe1\u017c~_P\xec\x16\xf8\x88_!\x0e\xa1\xb98\x80\x0e\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x1a&\x94\xec\a\xcf^Mh\xba@\xf3\xe7\xa1LS\xf3\x03\x8cn\x8966\xcd\x06\xe2\xdb:\x80\x00\u07d4\x1a5 E5\x82\xc7\x18\xa2\x1cB7[\xc5\as%RS\xe1\x89*\xd3s\xcef\x8e\x98\x00\x00\xe0\x94\x1a7n\x1b-/Y\ai\xbb\x85\x8dEu2\rN\x14\x99p\x8a\x01\x06q%v9\x1d\x18\x00\x00\u07d4\x1a:3\x0eO\xcbi\xdb\xef^i\x01x;\xf5\x0f\xd1\xc1SB\x89\u3bb5sr@\xa0\x00\x00\u07d4\x1aN\u01a0\xae\u007fZ\x94'\xd2=\xb9rL\r\f\xff\xb2\xab/\x89\t\xb4\x1f\xbf\x9e\n\xec\x00\x00\u07d4\x1aP^b\xa7N\x87\xe5wG>O:\xfa\x16\xbe\xdd<\xfaR\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x1a^\xe53\xac\xbf\xb3\xa2\xd7m[hRw\xb7\x96\xc5j\x05+\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1adJP\xcb\u00ae\xe8#\xbd+\xf2C\xe8%\xbeMG\xdf\x02\x89\x05k\xe0<\xa3\xe4}\x80\x00\u07d4\x1apD\xe28?\x87\b0[I[\xd1\x17k\x92\xe7\xef\x04:\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1ay\xc7\xf4\x03\x9cg\xa3\x9du\x13\x88L\xdc\x0e,4\"$\x90\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1a\x89\x89\x9c\xbe\xbd\xbbd\xbb&\xa1\x95\xa6<\bI\x1f\u035e\xee\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x1a\x8a\\\xe4\x14\u079c\xd1r\x93~7\xf2\u055c\xffq\xceW\xa0\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x1a\x95\xa8\xa8\b.FR\xe4\x17\r\xf9'\x1c\xb4\xbbC\x05\xf0\xb2\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\x1a\x95\u0277Tk]\x17\x86\u00c5\x8f\xb1#dF\xbc\f\xa4\u0389j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x1a\x98~?\x83\xdeu\xa4/\x1b\xde|\x99|\x19!{J_$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1a\x9ep/8]\xcd\x10^\x8b\x9f\xa4(\xee\xa2\x1cW\xffR\x8a\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x1a\xa1\x02\x1fU\n\xf1X\xc7Gf\x8d\xd1;F1`\xf9Z@\x89O\xb0Y\x1b\x9b08\x00\x00\u07d4\x1a\xa2v\x99\xca\u068d\u00e7oy3\xaaf\xc7\x19\x19\x04\x0e\x88\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x1a\xa4\x02p\xd2\x1e\\\u0786\xb61m\x1a\xc3\xc53IKy\xed\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1a\xb5:\x11\xbc\xc6=\u07ea@\xa0+\x9e\x18d\x96\u037b\x8a\xff\x89l?*\xac\x80\f\x00\x00\x00\u07d4\x1a\xbcN%;\b\n\xebCy\x84\xab\x05\xbc\xa0\x97\x9a\xa4>\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1a\xc0\x89\u00fcM\x82\xf0j \x05\x1a\x9ds-\xc0\xe74\xcba\x89%\xf6\x9dc\xa6\xce\x0e\x00\x00\xe0\x94\x1a\xd4V>\xa5xk\xe1\x15\x995\xab\xb0\xf1\u0547\x9c>sr\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x1a\xd7- \xa7n\u007f\xcckv@X\xf4\x8dA}Io\xa6\u0349lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x1a\xda\xf4\xab\xfa\x86}\xb1\u007f\x99\xafj\xbe\xbfpz<\xf5]\xf6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x1a\xf6\x03C6\x0e\v-u%R\x107W \xdf!\xdb\\}\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1a\xfc\u0145\x89l\xd0\xed\xe1)\xee-\xe5\xc1\x9e\xa8\x11T\vd\x89\xaf*\xba\f\x8e[\xef\x80\x00\u07d4\x1b\x05\xeajj\u022f|\xb6\xa8\xb9\x11\xa8\xcc\xe8\xfe\x1a*\xcf\u0209lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\v1\xaf\xffKm\xf3e:\x94\xd7\xc8yx\xae5\xf3J\xae\x89\x139\x10E?\xa9\x84\x00\x00\u07d4\x1b\r\ah\x17\xe8\u058e\xe2\xdfN\x1d\xa1\xc1\x14-\x19\x8cD5\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\x1b\x13\ro\xa5\x1d\\H\xec\x8d\x1dR\u070a\"{\xe8s\\\x8a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b#\u02c6cUHq\xfb\xbe\r\x9e`9~\xfbo\xae\xdc>\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1b&9X\x8bU\xc3D\xb0#\xe8\xde_\xd4\b{\x1f\x04\x03a\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\x1b9 \xd0\x01\xc4>r\xb2N|\xa4o\x0f\xd6\xe0\xc2\n_\xf2\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x1b<\xb8\x1eQ\x01\x1bT\x9dx\xbfr\v\r\x92J\xc7c\xa7\u008av\x95\xa9, \xd6\xfe\x00\x00\x00\u07d4\x1bC#,\xcdH\x80\xd6\xf4o\xa7Q\xa9l\xd8$s1XA\x89\x04V9\x18$O@\x00\x00\u07d4\x1bK\xbc\xb1\x81e!\x1b&[(\a\x16\xcb?\x1f!!v\xe8\x89\x19\x9a\xd3}\x03\xd0`\x80\x00\u07d4\x1bM\a\xac\u04c1\x83\xa6\x1b\xb2x=+{\x17\x8d\xd5\x02\xac\x8d\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1bckzIo\x04MsYYn5:\x10F\x16Cok\x89\x13\x88\xea\x95\xc3?\x1d\x00\x00\u07d4\x1bd\x95\x89\x12@\xe6NYD\x93\xc2f!q\xdb^0\xce\x13\x89\tX\x87\u0595\xedX\x00\x00\u07d4\x1bf\x10\xfbh\xba\xd6\xed\x1c\xfa\xa0\xbb\xe3:$\xeb.\x96\xfa\xfb\x89\b=lz\xabc`\x00\x00\u07d4\x1by\x903\xefm\xc7\x12x\"\xf7EB\xbb\"\xdb\xfc\t\xa3\b\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x1b~\xd9t\xb6\xe24\u0381$t\x98B\x9a[\u0520\xa2\xd19\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\x82o\xb3\xc0\x12\xb0\xd1Y\u253a[\x8aI\x9f\xf3\xc0\xe0<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\x8a\xa0\x16\f\u05df\x00_\x88Q\nqI\x13\xd7\n\u04fe3\x89\n\xef\xfb\x83\a\x9a\xd0\x00\x00\xe0\x94\x1b\x8b\xd6\xd2\xec\xa2\x01\x85\xa7\x8e}\x98\xe8\xe1\x85g\x8d\xacH0\x8a\x03\x89O\x0eo\x9b\x9fp\x00\x00\u07d4\x1b\x9b-\u0096\x0eL\xb9@\x8ft\x05\x82|\x9bY\a\x16\x12\xfd\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x1b\xa9\"\x8d8\x87'\xf3\x89\x15\x0e\xa0;s\xc8-\xe8\xeb.\t\x8a\x01\x89t\xfb\xe1w\xc9(\x00\x00\u07d4\x1b\xa9\xf7\x99~S\x87\xb6\xb2\xaa\x015\xac$R\xfe6\xb4\xc2\r\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4\x1b\xba\x03\xffkJ\u057f\x18\x18J\xcb!\xb1\x88\xa3\x99\xe9\xebJ\x89a\t=|,m8\x00\x00\u07d4\x1b\xbc\x19\x9eXg\x90\xbe\x87\xaf\xed\xc8I\xc0G&t\\]{\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x1b\xbc`\xbc\xc8\x0e\\\xdc5\xc5Aj\x1f\n@\xa8=\xae\x86{\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\xc4L\x87a#\x1b\xa1\xf1\x1f_\xaa@\xfaf\x9a\x01>\x12\u0389\v\tR\xc4Z\xea\xad\x00\x00\u07d4\x1b\xcf4A\xa8f\xbd\xbe\x960\t\xce3\xc8\x1c\xbb\x02a\xb0,\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\x1b\u048c\xd5\u01ca\xeeQ5|\x95\xc1\xef\x925\xe7\xc1\x8b\xc8T\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\xd8\xeb\xaavt\xbb\x18\u1458\xdb$OW\x03\x13\a_C\x89\b!\xab\rD\x14\x98\x00\x00\u07d4\x1b\xd9\t\xac\rJ\x11\x02\xec\x98\xdc\xf2\u0329j\n\xdc\u05e9Q\x89\x01\x16Q\xac>zu\x80\x00\u07d4\x1b\xe3T,6\x13hte\xf1Zp\xae\xeb\x81f+e\u0328\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1b\xeaM\xf5\x12/\xaf\u07b3`~\xdd\xda\x1e\xa4\xff\u06da\xbf*\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\u07d4\x1b\xecM\x02\u0385\xfcH\xfe\xb6$\x89\x84\x1d\x85\xb1pXj\x9b\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\x1b\xf9t\u0650OE\u0381\xa8E\xe1\x1e\xf4\xcb\xcf'\xafq\x9e\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\x1c\x04VI\xcdS\xdc#T\x1f\x8e\xd4\xd3A\x81(\b\xd5\u075c\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\x1c\x12\x8b\xd6\u0365\xfc\xa2uu\xe4\xb4;2S\xc8\xc4\x17*\xfe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c\x13\u04c67\xb9\xa4|\xe7\x9d7\xa8oP\xfb@\x9c\x06\a(\x89Hz\x9a0E9D\x00\x00\u07d4\x1c \x10\xbdf-\xf4\x17\xf2\xa2q\x87\x9a\xfb\x13\xefL\x88\xa3\xae\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x1c%z\u0525Q\x05\xea;X\xed7K\x19\x8d\xa2f\xc8_c\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x1c.6\a\xe1'\xca\xca\x0f\xbd\\YH\xad\xad}\xd80\xb2\x85\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\x1c5l\xfd\xb9_\xeb\xb7\x14c;(\xd5\xc12\u0744\xa9\xb46\x89\x01Z\xf1\u05cbX\xc4\x00\x00\u07d4\x1c5\xaa\xb6\x88\xa0\u034e\xf8.vT\x1b\xa7\xac9R\u007ft;\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x1c>\xf0]\xae\x9d\xcb\u0509\xf3\x02D\bf\x9d\xe2D\xc5*\x02\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x1cJ\xf0\xe8c\xd2el\x865\xbco\xfe\xc8\u0759(\x90\x8c\xb5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c`\x19\x93x\x92\a\xf9e\xbb\x86\\\xbbL\xd6W\xcc\xe7o\xc0\x89\x05T\x1ap7P?\x00\x00\u07d4\x1cc\xfa\x9e,\xbb\xf21a\xda3\xa1\xda}\xf7\r\x1b\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1c\xb6\xb2\xd7\xcf\xc5Y\xb7\xf4\x1eoV\xab\x95\xc7\xc9X\xcd\x0eL\x89Hz\x9a0E9D\x00\x00\u07d4\x1c\xc1\xd3\xc1O\x0f\xb8d\x0e6rM\xc42)\xd2\xeaz\x1eH\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x1c\xc9\bv\x00A\t\xcdy\xa3\u07a8f\u02c4\n\xc3d\xba\x1b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c\xd1\xf0\xa3\x14\u02f2\x00\xde\n\f\xb1\xef\x97\xe9 p\x9d\x97\u0089lk\x93[\x8b\xbd@\x00\x00\u0794\x1c\xdaA\x1b\xd5\x16;\xae\xca\x1eU\x85c`\x1c\xe7 \xe2N\xe1\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x1c\xe8\x1d1\xa7\x920\"\xe1%\xbfH\xa3\xe06\x93\xb9\x8d\xc9\u0749lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c\xeb\xf0\x98]\u007fh\n\xaa\x91\\D\xccb\xed\xb4\x9e\xab&\x9e\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x1c\xedg\x15\xf8b\xb1\xff\x86\x05\x82\x01\xfc\xceP\x82\xb3nb\xb2\x8a\x01j^`\xbe\xe2s\xb1\x00\x00\u07d4\x1c\xf0L\xb1C\x80\x05\x9e\xfd?#\x8be\u057e\xb8j\xfa\x14\u0609\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1c\xf1\x05\xab#\x02;ULX>\x86\u05d2\x11y\xee\x83\x16\x9f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x1c\xf2\xebz\x8c\xca\u00ad\xea\xef\x0e\xe8sG\xd55\u04f9@X\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1c\xfc\xf7Q\u007f\f\bE\x97 \x94+dz\u0452\xaa\x9c\x88(\x89+^:\xf1k\x18\x80\x00\x00\xe0\x94\x1d\t\xad$\x12i\x1c\u0141\xc1\xab6\xb6\xf9CL\xd4\xf0\x8bT\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\x1d\x15|Xv\xc5\xca\xd5S\xc9\x12\xca\xf6\xce-Rw\xe0\\s\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x1d&\x15\xf8\xb6\xcaP\x12\xb6c\xbd\u0414\xb0\xc5\x13|w\x8d\u07ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x1d)\u01ea\xb4+ H\u04b2R%\u0518\u06e6z\x03\xfb\xb2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u0794\x1d4\x1f\xa5\xa3\xa1\xbd\x05\x1f}\xb8\a\xb6\xdb/\u01faO\x9bE\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x1d4N\x96%g\xcb'\xe4M\xb9\xf2\xfa\u01f6\x8d\xf1\xc1\xe6\xf7\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x1d6h0c\xb7\xe9\xeb\x99F-\xab\xd5i\xbd\xdc\xe7\x16\x86\xf2\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1d7aky?\x94\x91\x188\xac\x8e\x19\xee\x94I\u07d2\x1e\u0109QP\xae\x84\xa8\xcd\xf0\x00\x00\xe0\x94\x1d9[0\xad\xda\x1c\xf2\x1f\t\x1aOJ{u3q\x18\x94A\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\x1dEXn\xb8\x03\xca!\x90e\v\xf7H\xa2\xb1t1+\xb5\a\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x1dW.\xdd-\x87\xca'\x1ag\x14\xc1Z;7v\x1d\u0320\x05\x89\x06\xeb\xd5*\x8d\xdd9\x00\x00\u07d4\x1dc0\x97\xa8R%\xa1\xffC!\xb1)\x88\xfd\xd5\\+8D\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x1di\xc8=(\xff\x04t\xce\xeb\xea\xcb:\xd2'\xa1D\xec\u78ca\x01(\xcc\x03\x92\nb\u0480\x00\u07d4\x1d\x96\xbc\u0544W\xbb\xf1\xd3\u00a4o\xfa\xf1m\xbf}\x83hY\x89\tIr\t\xd8F~\x80\x00\u07d4\x1d\x9ej\xaf\x80\x19\xa0_#\x0e]\xef\x05\xaf]\x88\x9b\xd4\xd0\xf2\x89\a?u\u0460\x85\xba\x00\x00\u07d4\x1d\xab\x17.\xff\xa6\xfb\xeeSL\x94\xb1~yN\xda\xc5OU\xf8\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x1d\xb9\xac\x9a\x9e\xae\xec\nR7W\x05\fq\xf4rx\xc7-P\x89Hz\x9a0E9D\x00\x00\u07d4\x1d\xbe\x8e\x1c+\x8a\x00\x9f\x85\xf1\xad<\xe8\r.\x055\x0e\u3709\aW\rn\x9e\xbb\xe4\x00\x00\u07d4\x1d\xc7\xf7\xda\xd8]\xf5?\x12q\x15$\x03\xf4\xe1\xe4\xfd\xb3\xaf\xa0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1d\u03bc\xb7em\xf5\u072a3h\xa0U\xd2/\x9e\xd6\xcd\xd9@\x89\x1b\x18\x1eK\xf24<\x00\x00\xe0\x94\x1d\xd7tA\x84J\xfe\x9c\xc1\x8f\x15\xd8\xc7{\xcc\xfbe^\xe04\x8a\x01\x06\xebEW\x99D\x88\x00\x00\u07d4\x1d\xde\xfe\xfd5\xab\x8fe\x8b$q\xe5G\x90\xbc\x17\xaf\x98\u07a4\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1d\xee\xc0\x1a\xbe\\\r\x95-\xe9\x10l=\xc3\x069\xd8P\x05\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\x1d\xf6\x91\x16rg\x9b\xb0\xef5\t\x03\x8c\f'\xe3\x94\xfd\xfe0\x89\x1dF\x01b\xf5\x16\xf0\x00\x00\u07d4\x1d\xfa\xee\ar\x12\xf1\xbe\xaf\x0eo/\x18@Sz\xe1T\xad\x86\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x1e\x06\r\xc6\xc5\xf1\u02cc\xc7\xe1E.\x02\xee\x16u\b\xb5eB\x8a\x02\xb1O\x02\xc8d\xc7~\x00\x00\xe0\x94\x1e\x13\xecQ\x14,\ubde2`\x83A,<\xe3QD\xbaV\xa1\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x1e\x1aH(\x11\x9b\xe3\t\xbd\x88#nMH+PM\xc5W\x11\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4\x1e\x1a\ud178leb\u02cf\xa1\xebo\x8f;\xc9\u072eny\x89\xf4\xd2\u0744%\x9b$\x00\x00\u07d4\x1e\x1ccQwj\xc3\x10\x919~\xcf\x16\x00-\x97\x9a\x1b-Q\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x1e\x1dz_$h\xb9N\xa8&\x98-\xbf!%yR*\xb7\xdf\n\u02ac\x9e\xee\xd3Y09\xe5\xacuy\x8a+\x14F\xddj\xef\xe4\x1c\x00\x00\u07d4\x1e{^M\x1fW+\xec\xf2\xc0\x0f\xc9\f\xb4v{Jn3\u0509\x06\x1f\xc6\x10u\x93\xe1\x00\x00\u07d4\x1e\x8eh\x9b\x02\x91|\xdc)$]\f\x9ch\xb0\x94\xb4\x1a\x9e\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\x1e\xa34\xb5u\b\a\xeat\xaa\u016b\x86\x94\xec_(\xaaw\u03c9\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\u07d4\x1e\xa4qU\x04\u01af\x10{\x01\x94\xf4\xf7\xb1\xcbo\xcc\xcdoK\x89 \x041\x97\xe0\xb0'\x00\x00\u07d4\x1e\xa4\x92\xbc\xe1\xad\x10~3\u007fK\u0527\xac\x9a{\xab\xcc\u036b\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x1e\xa6\xbf/\x15\xae\x9c\x1d\xbcd\u06a7\xf8\xeaM\r\x81\xaa\xd3\xeb\x89\u3bb5sr@\xa0\x00\x00\u07d4\x1e\xb4\xbfs\x15j\x82\xa0\xa6\x82 \x80\xc6\xed\xf4\x9cF\x9a\xf8\xb9\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94\x1e\xba\xcbxD\xfd\xc3\"\xf8\x05\x90O\xbf\x19b\x80-\xb1S|\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x1e\xc4\xecKw\xbf\x19\u0411\xa8h\xe6\xf4\x91T\x18\x05A\xf9\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1e\xd0n\xe5\x16b\xa8lcE\x88\xfbb\xdcC\xc8\xf2~|\x17\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1e\u063b?\x06w\x8b\x03\x9e\x99a\xd8\x1c\xb7\x1as\xe6x|\x8e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x1e\xda\bNye\x00\xba\x14\xc5\x12\x1c\r\x90\x84of\xe4\xbeb\x89\x1c\xfd\xd7F\x82\x16\xe8\x00\x00\u07d4\x1e\xeel\xbe\xe4\xfe\x96\xadaZ\x9c\xf5\x85zdy@\u07ccx\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4\x1e\xf2\u073f\xe0\xa5\x00A\x1d\x95n\xb8\u0213\x9c=l\xfef\x9d\x89*\x11)\u0413g \x00\x00\xe0\x94\x1e\xf5\xc9\xc76P\u03fb\xde\\\x88U1\xd4'\xc7\xc3\xfeUD\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x1f\x04\x12\xbf\xed\u0356N\x83}\t,q\xa5\xfc\xba\xf3\x01&\xe2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1f\x17O@\xa0Dr4\xe6fS\x91Mu\xbc\x00>V\x90\u0709\b\xacr0H\x9e\x80\x00\x00\u07d4\x1f!\x86\xde\xd2>\f\xf9R\x16\x94\xe4\xe1dY>i\n\x96\x85\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x1f*\xfc\n\xed\x11\xbf\xc7\x1ew\xa9\ae{6\xeav\xe3\xfb\x99\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u0794\x1f9Y\xfc)\x11\x10\xe8\x822\xc3kvg\xfcx\xa3ya?\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x1f=\xa6\x8f\xe8~\xafC\xa8)\xabm~\u0166\xe0\t\xb2\x04\xfb\x89\x1e\x16\x01u\x8c,~\x00\x00\u07d4\x1fI\xb8m\r9EY\x06\x98\xa6\xaa\xf1g<7u\\\xa8\r\x89%\xf2s\x93=\xb5p\x00\x00\u07d4\x1f_;4\xbd\x13K'\x81\xaf\xe5\xa0BJ\u0144l\xde\xfd\x11\x89\x05]\xe6\xa7y\xbb\xac\x00\x00\u07d4\x1fo\x0004\x97R\x06\x1c\x96\a+\xc3\xd6\xeb5I \x8dk\x89\x01K\x8d\xe1\xeb\x88\u06c0\x00\u07d4\x1f}\x8e\x86\xd6\xee\xb0%E\xaa\xd9\x0e\x912{\xd3i\xd7\xd2\xf3\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1f\x81\x16\xbd\n\xf5W\x0e\xaf\fV\u011cz\xb5\xe3zX\x04X\x89lk\x93[\x8b\xbd@\x00\x00\u0794\x1f\x88\xf8\xa13\x8f\xc7\xc1\tv\xab\xcd?\xb8\u04c5T\xb5\uc708\xb9\xf6]\x00\xf6<\x00\x00\u07d4\x1f\x9c2hE\x8d\xa3\x01\xa2\xbeZ\xb0\x82W\xf7{\xb5\xa9\x8a\xa4\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x1f\xa21\x9f\xed\x8c-F*\xdf.\x17\xfe\xecjo0Qn\x95\x89\x06\xca\xe3\x06!\xd4r\x00\x00\u07d4\x1f\xb4c\xa08\x99\x83\xdf}Y?{\xddmxI\u007f\xed\x88y\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x1f\xb7\xbd1\r\x95\xf2\xa6\u067a\xaf\x8a\x8aC\n\x9a\x04E:\x8b\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x1f\xcc|\xe6\xa8HX\x95\xa3\x19\x9e\x16H\x1fr\xe1\xf7b\xde\xfe\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x1f\xcf\xd1\xd5\u007f\x87\"\x90V\f\xb6-`\x0e\x1d\xef\xbe\xfc\xcc\x1c\x89P\xc5\xe7a\xa4D\b\x00\x00\u0794\x1f\u0496\xbe\x03\xads|\x92\xf9\u0186\x9e\x8d\x80\xa7\x1cW\x14\xaa\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\x1f\xdd\xd8_\u024b\xe9\xc4\x04Ya\xf4\x0f\x93\x80^\xccEI\xe5\x89\b\xe3\xf5\v\x17<\x10\x00\x00\u07d4 \x01\xbe\xf7{f\xf5\x1e\x15\x99\xb0/\xb1\x10\x19J\x00\x99\xb7\x8d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4 \x02d\xa0\x9f\x8ch\xe3\xe6b\x97\x95(\x0fV%O\x86@\u0409\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4 \x03qy\a\xa7%`\xf40\u007f\x1b\xee\xccT6\xf4=!\xe7\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4 \r\xfc\vq\xe3Y\xb2\xb4eD\n6\xa6\xcd\xc3Rw0\a\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4 \x13L\xbf\xf8\x8b\xfa\xdcFkR\xec\ua9d8W\x89\x1d\x83\x1e\x8965\u026d\xc5\u07a0\x00\x00\u07d4 \x14&\x1f\x01\b\x9fSyV0\xba\x9d\xd2O\x9a4\xc2\xd9B\x89Hz\x9a0E9D\x00\x00\u07d4 \x16\x89]\xf3,\x8e\xd5G\x82iF\x84#\xae\xa7\xb7\xfb\xceP\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4 \x18\x1cKA\xf6\xf9r\xb6iX!_\x19\xf5p\xc1]\xdf\xf1\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4 \x18d\xa8\xf7\x84\xc2'{\v|\x9e\xe74\xf7\xb3w\xea\xb6H\x89\xf2(\x14\x00\xd1\xd5\xec\x00\x00\u07d4 \xb8\x1a\xe59&\xac\xe9\xf7\xd7AZ\x05\f\x03\x1dX_ \x89\x12\u007f\x19\xe8>\xb3H\x00\x00\xe0\x94 \x1d\x9e\xc1\xbc\v\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4 \xa1RV\xd5\f\xe0X\xbf\x0e\xacC\xaaS:\xa1n\u0273\x80\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4 \xa2\x9cPy\xe2k?\x181\x8b\xb2\xe5\x0e\x8e\x8b4n[\xe8\x89\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\u07d4 \xa8\x16\x80\xe4e\xf8\x87\x90\xf0\aO`\xb4\xf3_]\x1ej\xa5\x89Ea\x80'\x8f\fw\x80\x00\u07d4 \xb9\xa9\u6f48\x80\u0659J\xe0\r\u0439(*\v\xea\xb8\x16\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4 \u0084\xba\x10\xa2\b0\xfc=i\x9e\xc9}-\xfa'\xe1\xb9^\x89lk\x93[\x8b\xbd@\x00\x00\u07d4 \xd1A\u007f\x99\xc5i\u3fb0\x95\x85e0\xfe\x12\xd0\xfc\uaa89@\x15\xf9K\x11\x83i\x80\x00\u07d4 \u074f\u02f4n\xa4o\u3066\x8b\x8c\xa0\xea[\xe2\x1f\u9949lk\x93[\x8b\xbd@\x00\x00\xe0\x94 \xff>\u078c\xad\xb5\xc3{H\xcb\x14X\x0f\xb6^#\t\n{\x8a\b\xe4\xd3\x16\x82v\x86@\x00\x00\xe0\x94!\x008\x1d`\xa5\xb5J\xdc\t\u0456\x83\xa8\xf6\u057bK\xfb\u02ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94!\x18\xc1\x16\xab\f\xdfo\xd1\x1dT\xa40\x93\a\xb4w\xc3\xfc\x0f\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94!\x1b)\xce\xfcy\xae\x97gD\xfd\xeb\u03bd<\xbb2\xc5\x13\x03\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4! l\xe2.\xa4\x80\xe8Y@\xd3\x13\x14\xe0\xd6ONM:\x04\x8965\u026d\xc5\u07a0\x00\x00\u07d4!2\xc0Qj.\x17\x17J\xc5G\xc4;{\x00 \xd1\xebLY\x895e\x9e\xf9?\x0f\xc4\x00\x00\xe0\x94!@\x8bMz,\x0en\xcaAC\xf2\xca\u037b\u033a\x12\x1b\u060a\x04<3\xc1\x93ud\x80\x00\x00\u07d4!Kt9U\xa5\x12\xden\r\x88j\x8c\xbd\x02\x82\xbe\xe6\u04a2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4!L\x89\u017d\x8e}\"\xbcWK\xb3^H\x95\x02\x11\xc6\xf7v\x89\x01\x06T\xf2X\xfd5\x80\x00\xe0\x94!Ti\x14\xdf\u04ef*\xddA\xb0\xff>\x83\xff\xdat\x14\xe1\xe0\x8a\x01C\x95\xe78ZP.\x00\x00\u07d4!X.\x99\xe5\x02\xcb\xf3\xd3\xc2;\xdf\xfbv\xe9\x01\xacmV\xb2\x89\x05k\xc7^-c\x10\x00\x00\u07d4!Y$\b\x13\xa70\x95\xa7\xeb\xf7\u00f3t>\x80(\xae_\t\x89lk\x93[\x8b\xbd@\x00\x00\u07d4!`\xb4\xc0,\xac\n\x81\u0791\b\xdeCE\x90\xa8\xbf\xe6\x875\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94!nA\x86N\xf9\x8f\x06\r\xa0\x8e\xca\xe1\x9a\xd1\x16j\x17\xd06\x8a\x016\x9f\xb9a(\xacH\x00\x00\u07d4!\x84o/\xdfZA\xed\x8d\xf3n^\xd8TM\xf7Y\x88\xec\xe3\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94!\xa6\xdbe'F{\xc6\xda\xd5K\xc1n\x9f\xe2\x95;g\x94\xed\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4!\xa6\xfe\xb6\xab\x11\xc7f\xfd\xd9w\xf8\xdfA!\x15_G\xa1\xc0\x89\x03\x19\xcf8\xf1\x00X\x00\x00\u07d4!\xb1\x82\xf2\xda+8D\x93\xcf_5\xf8=\x9d\x1e\xe1O*!\x89lk\x93[\x8b\xbd@\x00\x00\u07d4!\xbf\xe1\xb4\\\xac\xdebt\xfd\x86\b\u0661x\xbf>\xebn\u0709l\xee\x06\u077e\x15\xec\x00\x00\u07d4!\xc0s\x80HOl\xbc\x87$\xad2\xbc\x86L;Z\xd5\x00\xb7\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94!\u00e8\xbb\xa2g\xc8\u0322{\x1a\x9a\xfa\xba\xd8o`z\xf7\b\x8a\x01\xe4\xa3lI\u06580\x00\x00\u07d4!\xcem[\x90\x18\xce\xc0J\u0596yD\xbe\xa3\x9e\x800\xb6\xb8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4!\xd0'\x05\xf3\xf6I\x05\xd8\x0e\xd9\x14y\x13\xea\x8cs\a\u0595\x89I\xed\xb1\xc0\x98\x876\x00\x00\u07d4!\xd1?\f@$\xe9g\xd9G\a\x91\xb5\x0f\"\xde:\xfe\xcf\x1b\x89\xf1Z\xd3^.1\xe5\x00\x00\xe0\x94!\xdb\u06c1z\r\x84\x04\u01bd\xd6\x15\x047N\x9cC\xc9!\x0e\x8a\x02\x1e\x18\xb9\xe9\xabE\xe4\x80\x00\xe0\x94!\xdf\x1e\xc2KNK\xfey\xb0\xc0\x95\u03ba\xe1\x98\xf2\x91\xfb\u044a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94!\xdf-\u036ft\xb2\xbf\x804\x04\xddM\xe6\xa3^\xab\xec\x1b\xbd\x8a\x01w\"J\xa8D\xc7 \x00\x00\u07d4!\xe2\x19\u021c\xa8\xac\x14\xaeL\xbaa0\xee\xb7}\x9em9b\x89*\u035f\xaa\xa08\xee\x00\x00\u07d4!\xe5\u04ba\xe9\x95\xcc\xfd\b\xa5\xc1k\xb5$\xe1\xf60D\x8f\x82\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4!\xe5\xd7s 0L \x1c\x1eS\xb2a\xa1#\u0421\x06>\x81\x89\x04\xb6\xfa\x9d3\xddF\x00\x00\xe0\x94!\xea\xe6\xfe\xff\xa9\xfb\xf4\u0347OG9\xac\xe50\u033eY7\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4!\xec\xb2\u07e6Wy\xc7Y-\x04\x1c\xd2\x10Z\x81\xf4\xfdNF\x8965\u026d\xc5\u07a0\x00\x00\u07d4!\uff20\x9b5\x80\xb9\x8es\xf5\xb2\xf7\xf4\xdc\v\xf0,R\x9c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4!\xfd\v\xad\xe5\xf4\xeftt\xd0X\xb7\xf3\xd8T\xcb\x13\x00RN\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94!\xfdG\xc5%`\x12\x19\x8f\xa5\xab\xf11\xc0mj\xa1\x96_u\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4!\xfdl]\x97\xf9\xc6\x00\xb7h!\xdd\xd4\xe7v5\x0f\xce+\xe0\x89lj\u04c2\xd4\xfba\x00\x00\u07d4\"\r\u018d\xf0\x19\xb6\xb0\u033f\xfbxKZZ\xb4\xb1]@`\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\"\x0e+\x92\xc0\xf6\xc9\x02\xb5\x13\xd9\xf1\xe6\xfa\xb6\xa8\xb0\xde\xf3\u05c9+^:\xf1k\x18\x80\x00\x00\u07d4\"V\x1cY1\x14560\x9c\x17\xe82X{b\\9\v\x9a\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\"W\xfc\xa1jn\\*d|<)\xf3l\xe2)\xab\x93\xb1~\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\"]5\xfa\xed\xb3\x91\u01fc-\xb7\xfa\x90q\x16\x04\x05\x99m\x00\x89\t\x18T\xfc\x18bc\x00\x00\u07d4\"_\x9e\xb3\xfbo\xf3\xe9\xe3\xc8D~\x14\xa6n\x8dO7y\xf6\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\"r\x18n\xf2}\xcb\xe2\xf5\xfc70P\xfd\xae\u007f*\xce#\x16\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4\"s\xba\u05fcNHv\"\xd1u\xefzf\x98\x8bj\x93\xc4\xee\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\"v&K\xec\x85&\xc0\xc0\xf2pgz\xba\xf4\xf0\xe4A\xe1g\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\"\x82B\xf83n\xec\xd8$.\x1f\x00\x0fA\x93~q\xdf\xfb\xbf\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\"\x84*\xb80\xdaP\x99\x13\xf8\x1d\xd1\xf0O\x10\xaf\x9e\xdd\x1cU\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\"\x94O\xbc\xa9\xb5yc\bN\xb8M\xf7\xc8_\xb9\xbc\u07f8V\x89\xfc\x11\x8f\uf43a8\x80\x00\u07d4\"\x9c\xc4q\x1bbu^\xa2\x96DZ\u00f7\u007f\xc63\x82\x1c\xf2\x89\x02#\xe8\xb0R\x192\x80\x00\u0794\"\x9eC\r\xe2\xb7OD&Q\xdd\u0377\x01v\xbc\x05L\xadT\x88\xbb\xf9\x81\xbcJ\xaa\x80\x00\u07d4\"\x9fO\x1a*OT\atP[G\a\xa8\x1d\xe4D\x10%[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\"\x9f\xf8\v\xf5p\x80\t\xa9\xf79\xe0\xf8\xb5`\x91@\x16\u0566\x89\x12\x11\xec\xb5m\x13H\x80\x00\u07d4\"\xa2X\x12\xabV\xdc\xc4#\x17^\xd1\u062d\xac\xce3\xcd\x18\x10\x89dI\xe8NG\xa8\xa8\x00\x00\xe0\x94\"\xb9j\xb2\xca\xd5]\xb1\x00\xb50\x01\xf9\xe4\xdb7\x81\x04\xc8\a\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\"\xbd\xff\xc2@\xa8\x8f\xf7C\x1a\xf3\xbf\xf5\x0e\x14\xda7\xd5\x18>\x8965\u026d\xc5\u07a0\x00\x00\u07d4\"\xce4\x91Y\xee\xb1D\xef\x06\xff&6X\x8a\xefy\xf6(2\x89\n1\x06+\xee\xedp\x00\x00\u07d4\"\xdbU\x9f,<\x14u\xa2\xe6\xff\xe8:YyY\x91\x96\xa7\xfa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\"\xe1QX\xb5\xee>\x86\xeb\x032\xe3\u6a6cl\u0675^\u0349\b\xacr0H\x9e\x80\x00\x00\u07d4\"\xe2H\x8e-\xa2jI\xae\x84\xc0\x1b\xd5K!\xf2\x94x\x91\u0189]\u0212\xaa\x111\xc8\x00\x00\u07d4\"\xe5\x12\x14\x9a\x18\xd3i\xb7\x86\xc9\xed\xab\xaf\x1d\x89N\xe0.g\x14a\\\x00\x00\u07d4\"\xeb}\xb0\xbaV\xb0\xf8\xb8\x16\u0332\x06\xe6\x15\xd9)\x18[\r\x89\x04])s~\"\xf2\x00\x00\u07d4\"\xee\xd3'\xf8\xeb\x1d\x138\xa3\xcb{\x0f\x8aK\xaaY\a\u0355\x89\x01E]_Hw\b\x80\x00\xe0\x94\"\xf0\x04\u07cd\xe9\xe6\xeb\xf5#\u032c\xe4W\xac\xcb&\xf9r\x81\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794\"\xf2\xdc\xffZ\u05cc>\xb6\x85\v\\\xb9Q\x12{e\x95\"\u623e -j\x0e\xda\x00\x00\u07d4\"\xf3\xc7y\xddy\x02>\xa9*x\xb6\\\x1a\x17\x80\xf6-\\J\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\"\xfe\x88M\x907)\x1bMR\xe6(Z\xe6\x8d\xea\v\xe9\xff\xb5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\x06\u07d3\x1a\x94\rX\xc0\x16e\xfaM\b\x00\x80,\x02\xed\xfe\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94#\t\xd3@\x91D[22Y\v\xd7\x0fO\x10\x02[,\x95\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4#\x12\x00F\xf6\x83!\x02\xa7R\xa7fVi\x1c\x86>\x17\u5709\x11\xe0\xe4\xf8\xa5\v\xd4\x00\x00\u07d4#\x1a\x15\xac\xc1\x99\u021f\xa9\xcb\"D\x1c\xc7\x030\xbd\xcc\xe6\x17\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4#\x1d\x94\x15]\xbc\xfe*\x93\xa3\x19\xb6\x17\x1fc\xb2\v\u04b6\xfa\x89\xcf\x14{\xb9\x06\xe2\xf8\x00\x00\u07d4#(2\xcdYw\xe0\nL0\xd0\x16?.$\xf0\x88\xa6\xcb\t\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4#,m\x03\xb5\xb6\xe6q\x1e\xff\xf1\x90\xe4\x9c(\xee\xf3l\x82\xb0\x89Hz\x9a0E9D\x00\x00\xe0\x94#,\xb1\xcdI\x99<\x14J?\x88\xb3a\x1e#5i\xa8k\u058a\x03L`lB\u042c`\x00\x00\u07d4#,\xe7\x82Pb%\xfd\x98`\xa2\xed\xc1Jz0Gsm\xa2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4#/R]U\x85\x9b}N`\x8d H\u007f\xaa\xdb\x00)15\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94#4\u0150\u01e4\x87i\x100E\u0176SL\x8a4i\xf4J\x8a\x03\xb1\x99\a=\xf7-\xc0\x00\x00\u07d4#7n\u02bftl\xe53!\xcfB\xc8fI\xb9+g\xb2\xff\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#7\x8fB\x92m\x01\x84\xb7\x93\xb0\xc8'\xa6\xdd>=3O\u0349\x03\t'\xf7L\x9d\xe0\x00\x00\u07d4#8B\xb1\xd0i/\xd1\x11@\xcfZ\u0364\xbf\x960\xba\xe5\xf8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#9\xe9I(p\xaf\xea%7\xf3\x89\xac/\x83\x83\x02\xa3<\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#;\xdd\xdd]\xa9HR\xf4\xad\xe8\xd2\x12\x88V\x82\xd9\ak\u0189\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4#OF\xba\xb7?\xe4]1\xbf\x87\xf0\xa1\xe0Fa\x99\xf2\ubb09\x1aJ\xba\"\\ t\x00\x00\u07d4#U\x1fV\x97_\xe9+1\xfaF\x9cI\xeaf\xeefb\xf4\x1e\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4#V\x95B\xc9}V`\x18\xc9\a\xac\xfc\xf3\x91\xd1@g\xe8~\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94#_\xa6l\x02^\xf5T\x00p\xeb\xcf\r7-\x81w\xc4g\xab\x8a\a\x12\x9e\x1c\xdf7>\xe0\x00\x00\xe0\x94#r\xc4\xc1\u0253\x9fz\xafl\xfa\xc0@\x90\xf0\x04t\x84\n\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4#s\f5z\x91\x02nD\xb1\xd0\xe2\xfc*Q\xd0q\xd8\xd7{\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4#v\xad\xa9\x033\xb1\u0441\bL\x97\xe6E\xe8\x10\xaa[v\xf1\x89(\xa8WBTf\xf8\x00\x00\u07d4#x\xfdC\x82Q\x1e\x96\x8e\u0452\x10g7\xd3$\xf4T\xb55\x8965\u026d\xc5\u07a0\x00\x00\u07d4#\x82\xa9\u050e\xc8>\xa3e(\x90\xfd\x0e\u7710{[-\xc1\x89\a?u\u0460\x85\xba\x00\x00\u07d4#\x83\xc2\"\xe6~\x96\x91\x90\xd3!\x9e\xf1M\xa3xP\xe2lU\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\x8akv5%/RDHl\n\xf0\xa7: s\x85\xe09\x89JD\x91\xbdm\xcd(\x00\x00\u07d4#\x9as>k\x85Z\u0152\xd6c\x15a\x86\xa8\xa1t\xd2D\x9e\x89X\xbe7X\xb2A\xf6\x00\x00\xe0\x94#\xab\t\xe7?\x87\xaa\x0f;\xe0\x13\x9d\xf0\xc8\xebk\xe5cO\x95\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94#\xab\xd9\xe9>yW\xe5\xb66\xbeey\x05\x1c\x15\xe5\xce\v\x0e\x8a\x03\xa3\xc8\xf7\xcb\xf4,8\x00\x00\u07d4#\xb1\u0111\u007f\xbd\x93\xee=H8\x93\x06\x95s\x84\xa5Il\xbf\x89\xd8\xd8X?\xa2\xd5/\x00\x00\xe0\x94#\xba8d\xdaX=\xabV\xf4 \x87<7g\x96\x90\xe0/\x00\x8a\x02\x13BR\r_\xec \x00\x00\u07d4#\xc5Z\xebW9\x87o\n\xc8\xd7\xeb\xea\x13\xber\x96\x85\xf0\x00\x89Hz\x9a0E9D\x00\x00\u07d4#\u025b\xa0\x87D\x8e\x19\xc9p\x1d\xf6n\f\xabR6\x831\xfa\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\xcc\xc3\u01ac\xd8\\.F\fO\xfd\xd8+\xc7]\xc8I\xea\x14\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4#\xcd%\x98\xa2\x0e\x14\x9e\xad*\u0593yWn\xce\xdb`\u3389lk\x93[\x8b\xbd@\x00\x00\u07d4#\u07cfH\xee\x00\x92V\xeay~\x1f\xa3i\xbe\xeb\xcfk\xc6c\x89|\xd3\xfa\xc2m\x19\x81\x80\x00\u07d4#\xe2\u01a8\xbe\x8e\n\u03e5\xc4\xdf^6\x05\x8b\xb7\u02ecZ\x81\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\xeaf\x9e5d\x81\x9a\x83\xb0\xc2l\x00\xa1m\x9e\x82olF\x89M\x8dl\xa9h\xca\x13\x00\x00\u07d4#\xebo\xd8Vq\xa9\x06:\xb7g\x8e\xbe&Z \xf6\x1a\x02\xb3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4#\xf9\xec\xf3\xe5\xdd\u0723\x88\x15\xd3\xe5\x9e\xd3K[\x90\xb4\xa3S\x89\v\x17\x81\xa3\xf0\xbb \x00\x00\u07d4#\xfa~\xb5\x1aH\"\x95\x98\xf9~v+\xe0\x86\x96R\xdf\xfcf\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94$\x03\x05rs\x13\xd0\x1esT,w_\xf5\x9d\x11\xcd5\xf8\x19\x8a\x01A\x88Vf\x80\u007f\\\x80\x00\u07d4$\x04k\x91\u069ba\xb6)\u02cb\x8e\xc0\xc3Q\xa0~\a\x03\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4$\x0eU\x9e'J\xae\xf0\xc2X\x99\x8c\x97\x9fg\x1d\x11s\xb8\x8b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94$\x13aU\x9f\xee\xf8\x0e\xf170!S\xbd\x9e\xd2\xf2]\xb3\xef\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94$;;\xcaj)\x93Y\xe8\x86\xce3\xa3\x03A\xfa\xfeMW=\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4$<\x84\xd1$ W\f\xc4\xef;\xab\xa1\xc9Y\u0083$\x95 \x89\u007f\x1fi\x93\xa8S\x04\x00\x00\xe0\x94$CJ>2\xe5N\xcf'/\xe3G\v_oQ/gU \x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4$HYo\x91\xc0\x9b\xaa0\xbc\x96\x10j-7\xb5p^](\x89lk\x93[\x8b\xbd@\x00\x00\u0794$Xn\xc5E\x175\xee\xaa\xebG\r\xc8sj\xaeu/\x82\xe5\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4$X\xd6U_\xf9\x8a\x12\x9c\xce@7\x95=\x00 n\xffB\x87\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4$b\x91\x16[Y3-\xf5\xf1\x8c\xe5\u0248V\xfa\xe9X\x97\u0589\\(=A\x03\x94\x10\x00\x00\u07d4$g\u01a5\u0196\xed\xe9\xa1\xe5B\xbf\x1a\xd0k\xccK\x06\xac\xa0\x89\x01\x00\xbd3\xfb\x98\xba\x00\x00\u07d4$v\xb2\xbbu\x1c\xe7H\xe1\xa4\xc4\xff{#\v\xe0\xc1]\"E\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4$z\n\x11\xc5\u007f\x03\x83\xb9I\xdeT\vf\xde\xe6\x86\x04\xb0\xa1\x899\xfb\xae\x8d\x04-\xd0\x00\x00\u07d4$\x87\xc3\u013e\x86\xa2r=\x91|\x06\xb4XU\x01p\xc3\xed\xba\x8965\u026d\xc5\u07a0\x00\x00\u07d4$\x89\xac\x12i4\xd4\u05a9M\xf0\x87C\xda{v\x91\xe9y\x8e\x8965\u026d\xc5\u07a0\x00\x00\u07d4$\x9d\xb2\x9d\xbc\x19\xd1#]\xa7)\x8a\x04\b\x1c1WB\u9b09a\xac\xff\x81\xa7\x8a\xd4\x00\x00\u07d4$\xa4\xeb6\xa7\xe4\x98\xc3o\x99\x97\\\x1a\x8dr\x9f\u05b3\x05\u05c9\r\xfcx!\x0e\xb2\xc8\x00\x00\u07d4$\xa7P\xea\xe5\x87G\x11\x11m\xd7\xd4{q\x86\u0399\r1\x03\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4$\xaa\x11Q\xbbv_\xa3\xa8\x9c\xa5\x0e\xb6\xe1\xb1\xc7\x06A\u007f\u0509\xa8\r$g~\xfe\xf0\x00\x00\u0794$\xac\xa0\x8d[\xe8^\xbb\x9f12\xdf\xc1\xb6 \x82N\xdf\xed\xf9\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4$\xb2\xbe\x11\x8b\x16\u0632\x17Gi\xd1{L\xf8O\a\u0294m\x89lk\x93[\x8b\xbd@\x00\x00\u07d4$\xb8\xb4F\u07bd\x19G\x95]\u0404\xf2\xc5D\x933F\u04ed\x89\xeaim\x90@9\xbd\x80\x00\u07d4$\xb9^\xbe\xf7\x95\x00\xba\xa0\xed\xa7.w\xf8wA]\xf7\\3\x891T\xc9r\x9d\x05x\x00\x00\u07d4$\xb9\xe6dOk\xa4\xcd\xe1&'\r\x81\xf6\xab`\xf2\x86\xdf\xf4\x89\a?u\u0460\x85\xba\x00\x00\u07d4$\xbdY\x04\x05\x90\x91\xd2\xf9\xe1-j&\xa0\x10\xca\"\xab\x14\xe8\x89e\xea=\xb7UF`\x00\x00\u07d4$\xc0\u020bT\xa3TG\t\x82\x8a\xb4\xab\x06\x84\x05Y\xf6\xc5\u2250\xf54`\x8ar\x88\x00\x00\u07d4$\xc1\x17\xd1\u04b3\xa9z\xb1\x1aFy\u025awJ\x9e\xad\xe8\u044965\u026d\xc5\u07a0\x00\x00\u07d4$\xcf\xf0\xe93j\x9f\x80\xf9\xb1\u02d6\x8c\xafk\x1d\x1cI2\xa4\x89\n\xdaUGK\x814\x00\x00\u07d4$\u06aa\xdd\xf7\xb0k\xbc\ua6c0Y\x00\x85\xa8\x85gh+N\x89\x11K \x15\u04bb\xd0\x00\x00\u07d4$\xdc\xc2K\xd9\xc7!\f\xea\u03f3\r\xa9\x8a\xe0JM{\x8a\xb9\x8965\u026d\xc5\u07a0\x00\x00\u07d4$\xf7E\r\xdb\xf1\x8b\x02\x0f\xeb\x1a 2\xd9\xd5Kc>\xdf7\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4$\xfcs\xd2\a\x93\t\x8e\t\u076bW\x98Pb$\xfa\x1e\x18P\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4$\xfd\x9al\x87L/\xab?\xf3n\x9a\xfb\xf8\xce\r2\xc7\u0792\x89Hz\x9a0E9D\x00\x00\u07d4%\n@\xce\xf3 #\x97\xf2@F\x95H\xbe\xb5bj\xf4\xf2<\x89\x05\x03\xb2\x03\xe9\xfb\xa2\x00\x00\u07d4%\niC\av\xf64w\x03\xf9R\x97\x83\x95Za\x97\xb6\x82\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4%\x0e\xb7\xc6o\x86\x9d\xdfI\u0685\xf39>\x98\f\x02\x9a\xa44\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4%\x10j\xb6u]\xf8mkc\xa1\x87p;\f\xfe\xa0\u5520\x89\x01|@Z\xd4\x1d\xb4\x00\x00\xe0\x94%\x18_2Z\xcf-dP\x06\x98\xf6\\v\x9d\xdfh0\x16\x02\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4%\x1c\x12r,hy\"y\x92\xa3\x04\xeb5v\xcd\x18CN\xa5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4%\x1eh8\xf7\xce\u0173\x83\xc1\xd9\x01F4\x12t\xda\xf8\xe5\x02\x89\a\xff\x1c\xcbua\xdf\x00\x00\u07d4%%\x9d\x97Z!\xd8:\xe3\x0e3\xf8\x00\xf5?7\u07e0\x198\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4%({\x81_\\\x828\ns\xb0\xb1?\xba\xf9\x82\xbe$\xc4\u04c9\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94%+eU\xaf\u0700\xf2\xd9m\x97-\x17\u06c4\xeaZ\xd5!\xac\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4%8S)6\x81<\x91\xe6S(O\x01|\x80\u00f8\xf8\xa3o\x89l\x87T\xc8\xf3\f\b\x00\x00\xe0\x94%>2\xb7N\xa4I\n\xb9&\x06\xfd\xa0\xaa%{\xf2=\u02cb\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94%?\x1et*,\uc1b0\u05f3\x06\xe5\xea\xcbl\xcb/\x85T\x8a\x04>^\xde\x1f\x87\x8c \x00\x00\u07d4%A1J\v@\x8e\x95\xa6\x94DIwq*Pq5\x91\xab\x89X\x9e\x1a]\xf4\u05f5\x00\x00\u07d4%L\x1e\xccc\f(w\u0780\x95\xf0\xa8\u06e1\xe8\xbf\x1fU\f\x89\\(=A\x03\x94\x10\x00\x00\u07d4%Z\xbc\x8d\b\xa0\x96\xa8\x8f=j\xb5_\xbcsR\xbd\u0739\u0389\x04t6\x821>\u0780\x00\u07d4%[\xdddt\u0302b\xf2j\"\u00cfE\x94\x0e\x1c\ue99b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4%`\xb0\x9b\x89\xa4\xaehI\xedZ<\x99XBf1qDf\x89\\(=A\x03\x94\x10\x00\x00\u07d4%a\xa18\xdc\xf8;\xd8\x13\xe0\xe7\xf1\bd+\xe3\xde=o\x05\x8964\xf4\x84\x17@\x1a\x00\x00\u0794%a\xec\x0f7\x92\x18\xfe^\xd4\xe0(\xa3\xf7D\xaaAuLr\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u0794%b\x92\xa1\x91\xbd\xda4\xc4\xdakk\u0591G\xbfu\u2a6b\x88\xc2\xff.\r\xfb\x03\x80\x00\u07d4%i~\xf2\f\u032ap\xd3-7o\x82r\xd9\xc1\a\f=x\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4%o\xa1P\u0307\xb5\x05j\a\xd0\x04\xef\xc8E$s\x9eb\xb5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4%r\x1c\x87\xb0\xdc!7|r\x00\xe5$\xb1J\"\xf0\xafi\xfb\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4%\x899\xbb\xf0\f\x9d\xe9\xafS8\xf5\xd7\x14\xab\xf6\xd0\xc1\xc6q\x89T\x06\x923\xbf\u007fx\x00\x00\xe0\x94%\x90\x12hp\xe0\xbd\xe8\xa6c\xab\x04\nr\xa5W=\x8dA\u008a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4%\x9e\xc4\xd2e\xf3\xabSk|p\xfa\x97\xac\xa1Bi,\x13\xfc\x89\x01\x1b\x1b[\xea\x89\xf8\x00\x00\xe0\x94%\xa5\x00\xee\xeczf*\x84\x15R\xb5\x16\x8bp{\r\xe2\x1e\x9e\x8a\x02\x1f/o\x0f\xc3\xc6\x10\x00\x00\xe0\x94%\xa5\xa4M8\xa2\xf4Lj\x9d\xb9\u037ck\x1e.\x97\xab\xb5\t\x8a\x03\x99\x92d\x8a#\u0220\x00\x00\u07d4%\xa7L*\xc7]\u023a\xa8\xb3\x1a\x9c|\xb4\xb7\x82\x9b$V\u0689lk\x93[\x8b\xbd@\x00\x00\xe0\x94%\xad\xb8\xf9o9I,\x9b\xb4|^\u0708bNF\aV\x97\x8a\x05\xa9\x94\v\xc5hyP\x00\x00\u07d4%\xae\xe6\x8d\t\xaf\xb7\x1d\x88\x17\xf3\xf1\x84\xecV/x\x97\xb74\x89lk\x93[\x8b\xbd@\x00\x00\u07d4%\xb0S;\x81\xd0*a{\x92)\xc7\xec]o/g.[Z\x8965\u026d\xc5\u07a0\x00\x00\u07d4%\xb7\x8c\x9f\xad\x85\xb43C\xf0\xbf\xcd\x0f\xac\x11\u0254\x9c\xa5\xeb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4%\xbcI\xef(\x8c\xd1e\xe5%\xc6a\xa8\x12\u03c4\xfb\xec\x8f3\x89\x12Y!\xae\xbd\xa9\xd0\x00\x00\u07d4%\xbd\xfa>\xe2o8Ia{#\x00bX\x8a\x97\xe3\xca\xe7\x01\x8965\xe6\x19\xbb\x04\xd4\x00\x00\u07d4%\xc1\xa3~\xe5\xf0\x82e\xa1\xe1\r=\x90\xd5G)U\xf9x\x06\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4%\xc6\xe7O\xf1\xd9(\u07d8\x13z\xf4\u07c40\xdf$\xf0|\u05c9\x15$VU\xb1\x02X\x00\x00\xe0\x94%\xcf\xc4\xe2\\5\xc1;i\xf7\xe7}\xbf\xb0\x8b\xafXuk\x8d\x8a\bxg\x83&\xea\xc9\x00\x00\x00\xe0\x94%\xda\u0515\xa1\x1a\x86\xb9\xee\xec\xe1\xee\xec\x80^W\xf1W\xfa\xff\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\xe0\x94%\xe07\xf0\n\x18'\v\xa5\xec4 \"\x9d\xdb\n,\u33e2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4%\xe6a\xc99\x86:\xcc\x04No\x17\xb5i\x8c\xce7\x9e\xc3\u0309JD\x91\xbdm\xcd(\x00\x00\u07d4&\x04\x8f\xe8M\x9b\x01\nb\xe71b~I\xbc.\xb7?@\x8f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4&\x06\u00f3\xb4\xca\x1b\t\x14\x98`,\xb1\x97\x8b\xf3\xb9R!\xc0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4&\n#\x0eDe\a~\v\x14\xeeDB\xa4\x82\u0570\xc9\x14\xbf\x89Z\xf6\x06\xa0k[\x11\x80\x00\u07d4&\r\xf8\x94:\x8c\x9a]\xbayE2\u007f\xd7\xe0\x83|\x11\xad\a\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4&\x14\xf4-]\xa8D7ux\xe6\xb4H\xdc$0[\xef+\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4&\x15\x10\x0e\xa7\xe2[\xba\x9b\xcat`X\xaf\xbb\xb4\xff\xbeBD\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4&\x15u\xe9\xcfY\xc8\"o\xa7\xaa\xf9\x1d\xe8o\xb7\x0fZ\u00ee\x89\x10C\xa4CjR?\x00\x00\xe0\x94&\x1e\x0f\xa6LQ\x13te\xee\xcf[\x90\xf1\x97\xf7\x93\u007f\xdb\x05\x8a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\u07d4&*\x8b\xfd}\x9d\xc5\xdd:\u05c1a\xb6\xbbV\b$76U\x89?j\x83\x84\a+v\x00\x00\xe0\x94&*\xedK\xc0\xf4\xa4\xb2\xc6\xfb5y>\x83ZI\x18\x9c\xdf\xec\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94&-\xc16L\xcfm\xf8\\C&\x8e\xe1\x82UM\xaei.)\x8a\x01\v /\xect\xce\xd8\x00\x00\u07d4&8\x140\x9d\xe4\xe65\xcfX^\r6Tw\xfc@\xe6l\xf7\x89\a\xea(2uw\b\x00\x00\u07d4&9\xee\xe9\x87<\xee\xc2o\u0314T\xb5H\xb9\xe7\xc5J\xa6\\\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94&>W\xda\xcb\xe0\x14\x9f\x82\xfee\xa2fH\x98\x86o\xf5\xb4c\x8a\b\v\xfb\xef\xcb_\v\xc0\x00\x00\u07d4>\x19\xc0m_\x14z\xa5\x97$\x8e\xb4l\xf7\xbe\xfad\xa5\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4&L\xc8\bj\x87\x10\xf9\x1b!r\t\x05\x91,\u05d6J\xe8h\x89\x01s\x17\x90SM\xf2\x00\x00\xe0\x94&S\x83\u058bR\xd04\x16\x1b\xfa\xb0\x1a\xe1\xb0G\x94/\xbc2\x8a\x04rq\xde\xe2\rt\\\x00\x00\u07d4&Y\xfa\xcb\x1e\x83CeS\xb5\xb4)\x89\xad\xb8\a_\x99S\xed\x89\x01\x97evw\x1a^\x00\x00\xe0\x94&o-\xa7\xf0\b^\xf3\xf3\xfa\t\xba\xee#+\x93\xc7D\xdb.\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4&qH\xfdr\xc5Ob\nY/\xb9'\x991\x9c\xc4S+\\\x89\x169\u46fa\x16(\x00\x00\xe0\x94&xJ\u0791\u0228:\x8e9e\x8c\x8d\x82wA<\u0319T\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4&z~n\x82\xe1\xb9\x1dQ\xde\u0776D\xf0\xe9m\xbb\x1f\u007f~\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4&\x80q=@\x80\x8e*P\xed\x011P\xa2\xa6\x94\xb9j\u007f\x1d\x89a\t=|,m8\x00\x00\u07d4&\x97\xb39\x81;\f-\x96K$q\xeb\x1c`oN\u02d6\x16\x89>\x8e\xf7\x95\u0610\xc8\x00\x00\u07d4&\xa6\x8e\xab\x90Z\x8b=\xce\x00\xe3\x170\x82%\u06b1\xb9\xf6\xb8\x89kV\x05\x15\x82\xa9p\x00\x00\u07d4&\xb1\x1d\x06e\x88\xcet\xa5r\xa8Zc(s\x92\x12\xaa\x8b@\x89lk\x93[\x8b\xbd@\x00\x00\u07d4&\xba\xbfB\xb2g\xfd\xcf8a\xfd\xd4#j^GHH\xb3X\x8965\u026d\xc5\u07a0\x00\x00\u07d4&\xc0\x05Kp\r:|-\xcb\xe2uh\x9dOL\xad\x16\xa35\x89lk\x93[\x8b\xbd@\x00\x00\u07d4&\xc2\xff\xc3\x0e\xfd\xc5'>v\x18:\x16\xc2i\x8dnS\x12\x86\x89*\x11)\u0413g \x00\x00\u07d4&\u025f\x88I\u0240+\x83\xc8a!\u007f\xd0z\x9e\x84\u0377\x9d\x89\x10CV\x1a\x88)0\x00\x00\u07d4&\xcf\xff\xd0R\x15+\xb3\xf9W\xb4x\xd5\xf9\x8b#:|+\x92\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4&\u0521h\x91\xf5)\"x\x92\x17\xfc\u0606\xf7\xfc\xe2\x96\xd4\x00\x89lk\x93[\x8b\xbd@\x00\x00\u07d4&\xd4\xec\x17\xd5\u03b2\u0214\xbd\u015d\nji]\xad+C\u0309\x9f\x1fxv\x1d4\x1a\x00\x00\u07d4&\xe8\x01\xb6,\x82q\x91\xddh\xd3\x1a\x01\x19\x90\x94\u007f\xd0\xeb\xe0\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4&\xe9\xe2\xadr\x97\x02bd\x17\xef%\xde\r\xc8\x00\xf7\xa7y\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4&\xf9\xf7\xce\xfd~9K\x9d9$A+\xf2\u0083\x1f\xaf\x1f\x85\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94&\xfe\x17L\xbfRfP\xe0\xcd\x00\x9b\xd6\x12e\x02\u038ehM\x8a\x02w\x01s8\xa3\n\xe0\x00\x00\xe0\x94&\xff\nQ\xe7\xce\u0384\x00'ix\xdb\xd6#n\xf1b\xc0\xe6\x8a\x15.\x18V'T\nP\x00\x00\u07d4'\x10\x1a\x0fV\u04da\x88\u0168O\x9b2L\xdd\xe3>\\\xb6\x8c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'\x14L\xa9\xa7w\x1a\x83j\xd5\x0f\x80?d\xd8i\xb2\xae+ \x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4'\x14i\x13V:\xa7E\xe2X\x840\xd94\x8e\x86\xea|5\x10\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4'\x1d=H\x1c\xb8\x8evq\xad!iI\xb66^\x060=\xe0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4' \xf9\xcaBn\xf2\xf2\xcb\xd2\xfe\xcd9\x92\fO\x1a\x89\xe1m\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'*\x13\x1aZejz:\xca5\u023d \"\"\xa7Y\"X\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4'D\xffgFA!\xe3Z\xfc)\"\x17qd\xfa/\xcb\x02g\x89\x05k\xc7^-c\x10\x00\x00\u07d4'J=w\x1a=p\x97\x96\xfb\xc4\xd5\xf4\x8f\xce/\xe3\x8cy\u0589\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4'Mi\x17\x0f\xe7\x14\x14\x01\x88+\x88j\xc4a\x8cj\xe4\x0e\u06c93\xc5I\x901r\f\x00\x00\u07d4'R\x1d\xeb;n\xf1An\xa4\u01c1\xa2\xe5\u05f3n\xe8\x1ca\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'Xu\xffO\xbb\f\xf3\xa40!1'H\u007fv\b\xd0L\xba\x89\x1b\x1c\x01\x0evmX\x00\x00\u07d4'j\x00n0(\xec\xd4L\xdbb\xba\nw\u0394\xeb\xd9\xf1\x0f\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4'k\x05!\xb0\xe6\x8b'}\xf0\xbb2\xf3\xfdH2cP\xbf\xb2\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4'o\xd7\xd2O\x8f\x88?Zz()[\xf1qQ\u01e8K\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'p\xf1N\xfb\x16]\u07bay\xc1\v\xb0\xaf1\xc3\x1eY3L\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4'vw\xab\xa1\xe5,;S\xbf\xa2\a\x1dN\x85\x9a\n\xf7\xe8\xe1\x8965\u026d\xc5\u07a0\x00\x00\u07d4'\x82Ff\xd2x\xd7\x04#\xf0=\xfe\x1d\u01e3\xf0/C\u2d4966\xc2^f\xec\xe7\x00\x00\u07d4'\x83\f_`#\xaf\xaa\xf7\x97Egl J\x0f\xac\u0360\xba\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94'\x84\x90?\x1d|\x1b\\\xd9\x01\xf8\x87]\x14\xa7\x9b<\xbe*V\x8a\x04\xbd\xa7\xe9\xd7J\xd5P\x00\x00\u07d4'\x8c\v\xdec\x0e\u00d3\xb1\xe7&\u007f\xc9\xd7\xd9p\x19\xe4\x14[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4'\x98q\x10\"\x1a\x88\b&\xad\xb2\xe7\xab^\xcax\xc6\xe3\x1a\xec\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94'\xac\a;\xe7\x9c\xe6W\xa9:\xa6\x93\xeeC\xbf\x0f\xa4\x1f\xef\x04\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4'\xb1iN\xaf\xa1e\xeb\xd7\xcc{\u025et\x81J\x95\x14\x19\u0709+^:\xf1k\x18\x80\x00\x00\u07d4'\xb6(\x16\xe1\xe3\xb8\u045by\xd1Q=]\xfa\x85[\f:*\x89\x05j\xf5\xc1\xfdiP\x80\x00\u07d4'\xbf\x94<\x163\xfe2\xf8\xbc\xcc\xdbc\x02\xb4\a\xa5rND\x892\xf8Lm\xf4\b\xc0\x80\x00\u07d4'\xbf\x9fD\xba}\x05\xc35@\u00e5;\xb0,\xbb\xff\xe7\xc3\u0189lk\x93[\x8b\xbd@\x00\x00\u07d4'\xc2\xd7\xcaPM\xaa=\x90f\xdc\t\x13}\xc4/:\xaa\xb4R\x89 \x86\xac5\x10R`\x00\x00\u07d4'\xd1X\xac=>\x11\t\xabnW\x0e\x90\xe8]8\x92\xcdv\x80\x89\x05k\xc7^-c\x10\x00\x00\u07d4'\xe69\x89\xca\x1e\x90;\xc6 \xcf\x1b\x9c?g\xb9\xe2\xaee\x81\x89Hz\x9a0E9D\x00\x00\xe0\x94'\xf0<\xf1\xab\xc5\xe1\xb5\x1d\xbcDK(\x9eT,\x9d\u07f0\xe6\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4'\xfc\x85\xa4\x9c\xff\x90\xdb\xcf\xda\u071d\xdd@\u05b9\xa2!\nl\x89\x05k\xc7^-c\x10\x00\x00\u07d4(\x05A^\x1d\u007f\xde\xc6\xde\u07f8\x9eR\x1d\x10Y-t<\x10\x89\x05k\xc7^-c\x10\x00\x00\u07d4(\a>\xfc\x17\xd0\\\xab1\x95\xc2\xdb3+a\x98Gw\xa6\x12\x8965\u026d\xc5\u07a0\x00\x00\u07d4(\x12P\xa2\x91!'\nN\xe5\u05cd$\xfe\xaf\xe8,p\xba:\x8965\u026d\xc5\u07a0\x00\x00\u07d4(\x13\xd2c\xfc_\xf2G\x9e\x97\x05\x95\u05b6\xb5`\xf8\xd6\xd6\u0449lk\x93[\x8b\xbd@\x00\x00\u07d4(.\x80\xa5T\x87ZVy\x9f\xa0\xa9\u007fU\x10\u7557LN\x8965\u026d\xc5\u07a0\x00\x00\u07d4(3\x96\xce<\xac9\x8b\xcb\xe7\"\u007f2>x\xff\x96\u0407g\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4(4\x9f~\xf9t\xeaU\xfe6\xa1X;4\xce\xc3\xc4Pe\xf0\x89\f\xb63\u051eeY\x00\x00\u07d4(6\x120F\xb2\x84\xe5\xef\x10+\xfd\"\xb1v^P\x81\x16\xad\x89\x16S\xfb\xb5\xc4'\xe4\x00\x00\u07d4(<#\x14(<\x92\u0530d\xf0\xae\xf9\xbbRF\xa7\x00\u007f9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4(>\x11 7I\xb1\xfaO2\xfe\xbbq\xe4\x9d\x13Y\x198*\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94(>bR\xb4\xef\xcfFT9\x1a\xcbu\xf9\x03\u015bx\xc5\xfb\x8a\x02\x8a\x85t%Fo\x80\x00\x00\xe0\x94(Q\x0en\xff\x1f\xc8)\xb6WoC(\xbc98\xecze\x80\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4(X\xac\xac\xaf!\xea\x81\u02b7Y\x8f\xdb\xd8kE.\x9e\x8e\x15\x89$\x1a\x9bOaz(\x00\x00\u07d4(Z\xe5\x1b\x95\x00\u014dT\x13e\xd9ui\xf1K\xb2\xa3p\x9b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4(f\xb8\x1d\xec\xb0.\xe7\n\xe2P\xce\xe5\xcd\xc7{Y\u05f6y\x89lk\x93[\x8b\xbd@\x00\x00\u07d4(i\x06\xb6\xbdIr\xe3\xc7\x16U\xe0K\xaf6&\f|\xb1S\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4(k\x18ma\xea\x1f\u05cd\x990\xfe\x12\xb0e7\xb0\\=Q\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94(t\xf3\xe2\x98]_{@f'\xe1{\xaaw+\x01\xab\u031e\x8a\x01F\x05\x04\x10v_8\x00\x00\xe0\x94(|\xf9\u0410.\xf8\x19\xa7\xa5\xf1ID[\xf1w^\xe8\xc4|\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4(\x81\x8e\x18\xb6\x10\x00\x13!\xb3\x1d\xf6\xfe}(\x15\u036d\xc9\xf5\x8965\u026d\xc5\u07a0\x00\x00\u07d4(\x86\x83$3~\x11\xba\x10l\xb4\x81\u0696/:\x84S\x80\x8d\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94(\x90K\xb7\xc40)C\xb7\t\xb1Myp\xe4+\x83$\u184a\x02\x1f\x97\x84j\a-~\x00\x00\u07d4(\x95\xe8\t\x99\xd4\x06\xadY.+&'7\xd3_}\xb4\xb6\x99\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4(\x96r\x80!N!\x8a\x12\f]\xda7\x04\x1b\x11\x1e\xa3mt\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4(\xa3\xda\t\xa8\x19H\x19\xae\x19\x9f.m\x9d\x13\x04\x81~(\xa5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4(\xab\x16_\xfbi\xed\xa0\xc5I\xae8\xe9\x82o_\u007f\x92\xf8S\x89FM\xf6\xd7\xc8DY\x00\x00\u07d4(\xb7u\x85\xcb=U\xa1\x99\xab)\x1d:\x18\u018f\u8684\x8a\x89j@v\xcfy\x95\xa0\x00\x00\xe0\x94(\xd4\xeb\xf4\x1e=\x95\xf9\xbb\x9a\x89u#\\\x1d\x009>\x80\x00\u07d4)\nV\xd4\x1fn\x9e\xfb\xdc\xea\x03B\u0dd2\x9a\x8c\xdf\xcb\x05\x89\x12\xa5\xf5\x81h\xee`\x00\x00\u07d4)\x15bK\xcbg\x917\xb8\xda\xe9\xabW\xd1\x1bI\x05\xea\xeeK\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4)\x1e\xfe\x00\x81\xdc\xe8\xc1G\x99\xf7\xb2\xa46\x19\xc0\u00f3\xfc\x1f\x89A\rXj \xa4\xc0\x00\x00\u07d4)\x1f\x92\x9c\xa5\x9bT\xf8D>=Mu\xd9]\xee$<\xefx\x89\x1b\x1a\b\x927\a=\x00\x00\xe0\x94))\x8c\xcb\xdf\xf6\x89\xf8\u007f\xe4\x1a\xa6\xe9\x8f\u07f5=\xea\xf3z\x8a\x041\\2\xd7\x1a\x9e`\x00\x00\u07d4)/\"\x8b\n\x94t\x8c\x8e\xeca-$o\x98\x93c\xe0\x8f\b\x89\n\ad\a\xd3\xf7D\x00\x00\u07d4)3\x84\xc4+o\x8f)\x05\xceR\xb7 \\\"t7la+\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4)4\xc0\xdf{\xbc\x17+l\x18k\vrTz\u038b\xf7TT\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4)<#\x06\xdf6\x04\xaeO\xda\r z\xbasog\xde\a\x92\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94)I\xfd\x1d\xef\\v\xa2\x86\xb3\x87$$\x80\x9a\a\xdb9f\xf3\x8a\x01\x1b\xd9\x06\u06a0\xc9C\x80\x00\u07d4)OIK?.\x14\xa3\xf8\xab\x00\x00\x00\u07d4)U\xc3W\xfd\x8fu\xd5\x15\x9a=\xfai\u0178z5\x9d\ua309lk\x93[\x8b\xbd@\x00\x00\u07d4)a\xfb9\x1ca\x95|\xb5\xc9\xe4\a\u0762\x938\u04f9,\x80\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4)h\x1d\x99\x12\xdd\xd0~\xaa\xbb\x88\xd0]\x90\xf7f\xe8bA}\x8965\u026d\xc5\u07a0\x00\x00\u07d4)kq\xc0\x01X\x19\xc2B\xa7\x86\x1eo\xf7\xed\xed\x8a_q\xe3\x89lh\xcc\u041b\x02,\x00\x00\u07d4)mf\xb5!W\x1aNA\x03\xa7\xf5b\xc5\x11\xe6\xaas-\x81\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4)o\x00\xde\x1d\u00fb\x01\xd4z\x8c\xcd\x1e]\x1d\u0661\xebw\x91\x8965\u026d\xc5\u07a0\x00\x00\u07d4)s\x85\xe8\x864FV\x85\xc21\xa3\x14\xa0\xd5\xdc\xd1F\xaf\x01\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4)v=\xd6\u069a|\x16\x11s\x88\x83!\ub9b6<\x8f\xb8E\x89\x11\xc7\xea\x16.x \x00\x00\u07d4)yt\x11t\xa8\xc1\xea\v\u007f\x9e\xdfe\x81w\x85\x94\x17\xf5\x12\x89\x19\x01\x96l\x84\x96\x83\x80\x00\u07d4)z\x88\x92\x1b_\xca\x10\u5edd\xed`\x02T7\xae\"\x16\x94\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94)}]\xbe\"//\xb5%1\xac\xbd\v\x01=\xc4F\xacsh\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4)\x82N\x94\xccCH\xbc\x962y\xdc\xdfG9\x17\x152L\u04c9i*\xe8\x89p\x81\xd0\x00\x00\u07d4)\x82\xd7j\x15\xf8G\xddA\xf1\x92*\xf3h\xfeg\x8d\x0eh\x1e\x89\x05k\xc7^-c\x10\x00\x00\u07d4)\x88\x87\xba\xb5|[\xa4\xf0aR)\xd7R_\xa1\x13\xb7\ua249\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94)\x8e\xc7kD\r\x88\a\xb3\xf7\x8b_\x90\x97\x9b\xeeB\xedC\u06ca\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4)\x93h`\x90B\xa8X\xd1\xec\xdf\x1f\xc0\xad\xa5\xea\xce\xca)\u03c9lk\x93[\x8b\xbd@\x00\x00\u07d4)\x9e\v\xcaU\xe0i\u0785\x04\xe8\x9a\xcan\xca!\u04ca\x9a]\x89\x03\x027\x9b\xf2\xca.\x00\x00\u07d4)\xac+E\x84T\xa3l~\x96\xc7:\x86g\"*\x12$,q\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94)\xad\u03c3\xb6\xb2\n\u01a44\xab\xb1\x99<\xbd\x05\xc6\x0e\xa2\xe4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94)\xae\xf4\x8d\xe8\xc9\xfb\xadK\x9eL\xa9pyzU3\xebr-\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4)\xb3\xf5a\xeezn%\x94\x1e\x98\xa52[x\xad\u01d7\x85\xf3\x89\x05k\xc7^-c\x10\x00\x00\u07d4)\xbd\xc4\xf2\x8d\xe0\x18\x0fC<&\x94\xebt\xf5PL\xe9C7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4)\u0300M\x92+\xe9\x1fY\t\xf3H\xb0\xaa\xa5\xd2\x1b`x0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94)\xda>5\xb2;\xb1\xf7/\x8e\"X\xcf\u007fU3Y\xd2K\xac\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94)\xe6y\x90\xe1\xb6\xd5.\x10U\xff\xe0I\xc51\x95\xa8\x15B\u03ca\x04<3\xc1\x93ud\x80\x00\x00\u07d4)\uab82v\x17b\xf4\xd2\xdbS\xa9\u018b\x0fk\vmNf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4)\xeb~\xef\xda\xe9\xfe\xb4I\xc6?\xf5\xf2y\xd6u\x10\xeb\x14\"\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4)\xf0\xed\xc6\x038\xe7\x11 \x85\xa1\xd1\x14\u068cB\u038fU\u0589\xa0Z\u007f\x0f\xd8%x\x00\x00\u07d4)\xf8\xfb\xa4\xc3\ar\xb0W\xed\xbb\xe6*\xe7B\f9\x05r\xe1\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94)\xf9(l\x0es\x8d\x17!\xa6\x91\u01b9Z\xb3\u0667\x97\xed\xe8\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4*\b^%\xb6Hb\xf5\xe6\x8dv\x8e+\x0fz\x85)\x85\x8e\xee\x89k\x88:\xcdWf\xcd\x00\x00\u07d4**\xb6\xb7Lz\xf1\xd9Gk\xb5\xbc\xb4RG\x97\xbe\xdc5R\x8965\u026d\xc5\u07a0\x00\x00\u07d4*9\x19\nO\u0783\u07f3\xdd\xcbL_\xbb\x83\xaclIu\\\x8965\u026d\xc5\u07a0\x00\x00\u07d4*@\r\xff\x85\x94\xder(\xb4\xfd\x15\xc3#\"\xb7[\xb8}\xa8\x89\x051\xa1\u007f`z-\x00\x00\xe0\x94*D\xa7!\x8f\xe4Me\xa1\xb4\xb7\xa7\u0671\xc2\xc5,\x8c>4\x8a\r-\x06\xc3\x05\xa1\xebW\x80\x00\u07d4*F\xd3Swqv\xff\x8e\x83\xff\xa8\x00\x1fOp\xf9s:\xa5\x89\x05\xbf\v\xa6cOh\x00\x00\u07d4*Y_\x16\xee\xe4\xcb\f\x17\u0662\xd99\xb3\xc1\x0flgrC\x89;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4*Y\xe4~\xa5\xd8\xf0\xe7\xc0(\xa3\xe8\xe0\x93\xa4\x9c\x1bP\xb9\xa3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4*[\xa9\xe3L\u054d\xa5L\x9a'\x12f:;\xe2t\xc8\xe4{\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94*^:@\xd2\xcd\x03%vm\xe7:=g\x18\x96\xb3b\xc7;\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94*cY\x0e\xfe\x99\x86\xc3\xfe\xe0\x9b\n\n3\x8b\x15\xbe\xd9\x1f!\x8a\x01^\x1cN\x05\xee&\xd0\x00\x00\u07d4*gf\n\x13h\xef\xcdbn\xf3k+\x1b`\x19\x80\x94\x1c\x05\x89\a?u\u0460\x85\xba\x00\x00\u07d4*t+\x89\x10\x94\x1e\t2\x83\n\x1d\x96\x92\xcf\u0484\x94\xcf@\x89\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\u07d4*tl\xd4@'\xaf>\xbd7\xc3x\xc8^\xf7\xf7T\xab_(\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4*\x81\xd2|\xb6\xd4w\x0f\xf4\xf3\u0123\xba\x18\xe5\xe5\u007f\aQ|\x89lk\x93[\x8b\xbd@\x00\x00\u07d4*\x91\xa9\xfe\xd4\x1b}\x0e\\\xd2\xd81X\xd3\xe8\xa4\x1a\x9a-q\x89i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94*\x9cW\xfe{k\x13\x8a\x92\rgo{\x1a%\x10\x80\xff\xb9\x8a4\xf0\x86\xf3\xb3;h@\x00\x00\u07d4+p\x1d\x16\xc0\xd3\xcc\x1eL\xd8TE\xe6\xad\x02\ue92c\x01-\x89 \x86\xac5\x10R`\x00\x00\xe0\x94+q|\xd42\xa3#\xa4e\x909\x84\x8d;\x87\xde&\xfc\x95F\x8ai\xe1\r\xe7fv\u0400\x00\x00\u07d4+t\xc3s\xd0K\xfb\x0f\xd6\n\x18\xa0\x1a\x88\xfb\xe8Gp\u5309\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4+w\xa4\u060c\rV\xa3\xdb\xe3\xba\xe0J\x05\xf4\xfc\u0477W\xe1\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94+\x84\x88\xbd-<\x19z=&\x15\x18\x15\xb5\xa7\x98\xd2qh\u070a\x01j\x1f\x9f_\xd7\xd9`\x00\x00\u07d4+\x8a\r\xee\\\xb0\xe1\xe9~\x15\xcf\xcan\x19\xad!\xf9\x95\ufb49\x1bUC\x8d\x9a$\x9b\x00\x00\xe0\x94+\x8f\xe4\x16n#\xd1\x19c\xc0\x93+\x8a\u078e\x01E\xea\ap\x8a\t(\x96R\x9b\xad\u0708\x00\x00\xe0\x94+\x99\xb4.OBa\x9e\xe3k\xaa~J\xf2\xd6^\xac\xfc\xba5\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4+\xab\x0f\xbe(\u0544 \xb5 6w\n\x12\xf9\x95*\xeai\x11\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4+\xad\xe9\x1d\x15E\x17b\x0f\u05349\xac\x97\x15zA\x02\xa9\xf7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4+\xaf\x8dn\"\x11t\x12H \xeeI+\x94Y\xecO\xad\xaf\xbb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4+\xaf\xbf\x9e\x9e\xd2\xc2\x19\xf7\xf2y\x13t\xe7\xd0\\\xb0gw\xe7\x89\v\xed\x1d\x02c\xd9\xf0\x00\x00\xe0\x94+\xb3f\xb9\xed\xcb\r\xa6\x80\xf0\xe1\v;n(t\x81\x90\xd6\u00ca\x01:b\u05f5v@d\x00\x00\xe0\x94+\xb6\xf5x\xad\xfb\u7ca1\x16\xb3UO\xac\xf9\x96\x98\x13\xc3\x19\x8a\x01\x91'\xa19\x1e\xa2\xa0\x00\x00\u07d4+\xbeb\xea\xc8\f\xa7\xf4\xd6\xfd\xee~}\x8e(\xb6:\xcfw\x0e\x89\x81\xe3-\xf9r\xab\xf0\x00\x00\u07d4+\xbeg*\x18WP\x8fc\x0f*^\xdbV=\x9e\x9d\xe9(\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4+\xc4)\xd6\x18\xa6jL\xf8-\xbb-\x82N\x93V\xef\xfa\x12j\x89lj\xccg\u05f1\xd4\x00\x00\u07d4+\xd2R\xe0\xd72\xff\x1d|x\xf0\xa0.l\xb2T#\xcf\x1b\x1a\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4+\xdd\x03\xbe\xbb\xee';l\xa1\x05\x9b4\x99\x9a[\xbda\xbby\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4,\x04\x11\\>R\x96\x1b\r\xc0\xb0\xbf1\xfb\xa4ToYf\xfd\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94,\x06\u0752+aQJ\xaf\xed\xd8D\x88\xc0\u008em\xcf\x0e\x99\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94,\f\xc3\xf9QH,\u0222\x92X\x15hN\xb9\xf9N\x06\x02\x00\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4,\x0e\xe14\u0633aE\xb4{\xee\u7bcd'8\xdb\xda\b\xe8\x89\n\xe5os\x0em\x84\x00\x00\u07d4,\x0f[\x9d\xf46%y\x8e~\x03\xc1\xa5\xfdjm\t\x1a\xf8+\x89\x01\xb0\xfc\xaa\xb2\x000\x00\x00\u07d4,\x12\x8c\x95\xd9W!Q\x01\xf0C\u074f\u0142EmA\x01m\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4,\x18\x00\xf3_\xa0->\xb6\xff[%(_^J\xdd\x13\xb3\x8d\x891\"\u04ed\xaf\xde\x10\x00\x00\u07d4,\x1c\x19\x11N=m\xe2xQHK\x8d'\x15\xe5\x0f\x8a\x10e\x89\x05k\xc7^-c\x10\x00\x00\u07d4,\x1c\xc6\xe1\x8c\x15$\x88\xba\x11\xc2\xcc\x1b\xce\xfa-\xf3\x06\xab\u0449Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94,\x1d\xf8\xa7oH\xf6\xb5K\u03dc\xafV\xf0\xee\x1c\xf5z\xb3=\x8a\x02$\u007fu\x00\x89\xdaX\x00\x00\u07d4,!G\x94z\xe3?\xb0\x98\xb4\x89\xa5\xc1k\xff\xf9\xab\xcdN*\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4,#OP\\\xa8\xdc\xc7}\x9b~\x01\xd2W\xc3\x18\xcc\x199m\x89\x05k\xc7^-c\x10\x00\x00\u07d4,$(\xe4\xa6it\xed\xc8\"\xd5\xdb\xfb$\x1b'(\aQX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4,-\x15\xff9V\x1c\x1br\xed\xa1\xcc\x02\u007f\xfe\xf27C\xa1D\x89\u0500\xed\x9e\xf3+@\x00\x00\u07d4,-\xb2\x8c3\t7^\xea1\x82\x1b\x84\xd4\b\x93\x0e\xfa\x1a\u01c9lk\x93[\x8b\xbd@\x00\x00\u07d4,Z-\n\xbd\xa0;\xbe!W\x81\xb4\xff)l\x8ca\xbd\xba\xf6\x89\x01\xa8\xe5oH\xc0\"\x80\x00\u07d4,[}{\x19Z7\x1b\xf9\xab\u0774/\xe0O/\x1d\x9a\x99\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4,]\xf8ffj\x19K&\u03bb@~J\x1f\xd7> \x8d^\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94,`?\xf0\xfe\x93alCW>\xf2y\xbf\xea@\x88\x8dj\xe7\x8a\x01\x00\xf4\xb6\xd6gW\x90\x00\x00\xe0\x94,hF\xa1\xaa\x99\x9a\"F\xa2\x87\x05`\x00\xbaM\u02e8\xe6=\x8a\x02\x1f/o\x0f\xc3\xc6\x10\x00\x00\u0794,j\xfc\xd4\x03|\x1e\xd1O\xa7O\xf6u\x8e\tE\xa1\x85\xa8\xe8\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4,ki\x9d\x9e\xad4\x9f\x06\u007fEq\x1a\aJd\x1d\xb6\xa8\x97\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4,o\\\x12L\u01c9\xf8\xbb9\x8e?\x88\x97Q\xbcK`-\x9e\x89\x01Y\xf2\v\xed\x00\xf0\x00\x00\u07d4,\x83\xae\xb0/\xcf\x06}e\xa4p\x82\xfd\x97x3\xab\x1c\uc449\b'8#%\x8a\xc0\x00\x00\xe0\x94,\x89\xf5\xfd\xca=\x15T\t\xb68\xb9\x8at.U\xebFR\xb7\x8a\x14\u06f2\x19\\\xa2(\x90\x00\x00\u07d4,\x96HI\xb1\xf6\x9c\xc7\u03a4D%8\xed\x87\xfd\xf1l\xfc\x8f\x89lk\x93[\x8b\xbd@\x00\x00\u0794,\x9f\xa7,\x95\xf3}\b\xe9\xa3`\t\u7930\u007f)\xba\xd4\x1a\x88\xdfn\xb0\xb2\xd3\xca\x00\x00\u07d4,\xafk\xf4\xec}Z\x19\xc5\xe0\x89z^\xeb\x01\x1d\xce\xceB\x10\x89\a\x93H5\xa01\x16\x00\x00\u07d4,\xb4\xc3\xc1k\xb1\xc5^|kz\x19\xb1'\xa1\xac\x93\x90\xcc\t\x89\xb8'\x94\xa9$O\f\x80\x00\xe0\x94,\xb5IZPS6\xc2FT\x10\xd1\xca\xe0\x95\xb8\xe1\xba\\\u074a\x04<3\xc1\x93ud\x80\x00\x00\u07d4,\xb6\x15\a:@\xdc\u06d9\xfa\xa8HW.\x98{;\x05n\xfb\x89+X\xad\u06c9\xa2X\x00\x00\u07d4,\xbam]\r\xc2\x04\xea\x8a%\xad\xa2\xe2oVu\xbd_/\u0709H#\xef}\u06da\xf3\x80\x00\u07d4,\xbb\fs\u07d1\xb9\x17@\xb6i;wJ}\x05\x17~\x8eX\x89dI\xe8NG\xa8\xa8\x00\x00\u07d4,\xcbfIM\n\xf6\x89\xab\xf9H=6]x$D\xe7\u07ad\x8965\u026d\xc5\u07a0\x00\x00\u07d4,\xcc\x1f\x1c\xb5\xf4\xa8\x00.\x18k \x88]\x9d\xbc\x03\f\b\x94\x89lk\x93[\x8b\xbd@\x00\x00\u07d4,\u03c0\xe2\x18\x98\x12^\xb4\xe8\a\u0342\xe0\x9b\x9d(Y/n\x89lk\x93[\x8b\xbd@\x00\x00\u07d4,\u0456\x94\u0452j\x0f\xa9\x18\x9e\u07ba\xfcg\x1c\xf1\xb2\u02a5\x8965\u026d\xc5\u07a0\x00\x00\u07d4,\u04d34\xac~\xacyrW\xab\xe3sa\x95\xf5\xb4\xb5\xce\x0f\x89\x05kGx^7&\x00\x00\u07d4,\u05de\xb5 '\xb1,\x18\x82\x8e>\xaa\xb2\x96\x9b\xfc\u0487\xe9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4,\xd8xfV\x8d\xd8\x1a\xd4}\x9d:\u0404nZePss\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4,\xdb9De\x06\x16\xe4|\xb1\x82\xe0`2/\xa1Hyx\u0389b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4,\xe1\x1a\x92\xfa\xd0$\xff+>\x87\xe3\xb5B\xe6\xc6\r\xcb\u0656\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4-\x03&\xb2?\x04\t\xc0\xc0\xe9#hc\xa13\aZ\x94\xba\x18\x89\vg\x9b\xe7[\xe6\xae\x00\x00\u07d4-\r\xecQ\xa6\xe8s0\xa6\xa8\xfa*\x0fe\u060dJ\xbc\xdfs\x89\n\ad\a\xd3\xf7D\x00\x00\u07d4-#vkok\x05s}\xad\x80\xa4\x19\xc4\x0e\xdaMw\x10>\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4-+\x03#Y\xb3c\x96O\xc1\x1aQ\x82c\xbf\xd0T1\xe8g\x89\b\x1c\x1d\xf7b\x9ep\x00\x00\u07d4-4\x80\xbf\be\aJr\xc7u\x9e\xe5\x13{Mp\xc5\x1c\xe9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4-5\xa9\xdfbu\u007f\u007f\xfa\xd1\x04\x9a\xfb\x06\xcaJ\xfcFLQ\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4-@U\x8b\x06\xf9\n9#\x14U\x92\x12;gt\xe4n1\xf4\x8965\u026d\xc5\u07a0\x00\x00\u07d4-Bi\x12\xd0Y\xfa\xd9t\v.9\n.\xea\xc0To\xf0\x1b\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4-S-\xf4\xc69\x11\xd1\u0391\xf6\xd1\xfc\xbf\xf7\x96\x0fx\xa8\x85\x89Z\x85\x96\x8aXx\u0680\x00\u07d4-S\x91\xe98\xb3HX\u03d6[\x84\x051\xd5\xef\xdaA\v\t\x89K\xe4\xe7&{j\xe0\x00\x00\xe0\x94-[B\xfcY\xeb\xda\r\xfdf\xae\x91K\u008c\x1b\nn\xf8:\x8a+\u0235\x9f\xdc\xd86c\x80\x00\u07d4-]s5\xac\xb06+G\u07e3\xa8\xa4\xd3\xf5\x94\x95D\u04c0\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94-a\xbf\xc5hs\x92<+\x00\t]\xc3\xea\xa0\xf5\x90\u062e\x0f\x8a\x04ef\xdf\xf8\xceU`\x00\x00\u07d4-e\x11\xfdz8\x00\xb2hT\xc7\xec9\xc0\u0735\xf4\xc4\xe8\xe8\x89\x15\xad\u077a/\x9ew\x00\x00\u07d4-}\\@\u076f\xc4P\xb0Jt\xa4\u06bc+\xb5\xd6e\x00.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4-\x89\xa8\x00jO\x13z \xdc+\xecF\xfe.\xb3\x12\xea\x96T\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4-\x8cR2\x9f8\u04a2\xfa\x9c\xba\xf5\u0143\xda\xf1I\v\xb1\x1c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4-\x8e\x06\x18\x92\xa5\xdc\xce!\x96j\xe1\xbb\a\x88\xfd>\x8b\xa0Y\x89\r\x8e\\\xe6\x17\xf2\xd5\x00\x00\u07d4-\x8e[\xb8\xd3R\x16\x95\xc7~|\x83N\x02\x91\xbf\xac\xeet\b\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4-\x90\xb4\x15\xa3\x8e.\x19\xcd\xd0/\U000ed069z\xf7\xcb\xf6r\x89\x05\xf3\xc7\xf6A1\xe4\x00\x00\u07d4-\x9b\xado\x1e\xe0*p\xf1\xf1=\xef\\\u0332z\x9a'@1\x89a\t=|,m8\x00\x00\u07d4-\x9c_\xec\u04b4O\xbbj\x1e\xc72\xea\x05\x9fO\x1f\x9d+\\\x896\xca2f\x1d\x1a\xa7\x00\x00\xe0\x94-\xa6\x17iP\t\xccW\xd2j\u0510\xb3*]\xfb\xeb\x93N^\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4-\xa7k|9\xb4 \u323a,\x10 \xb0\x85k\x02pd\x8a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4-\u01ddn\u007fU\xbc\xe2\xe2\xd0\xc0*\xd0|\uca3bR\x93T\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\xe0\x94-\xca\x0eD\x9a\xb6F\xdb\xdf\u04d3\xa9fb\x96\v\u02b5\xae\x1e\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4-\xd3%\xfd\xff\xb9{\x19\x99R\x84\xaf\xa5\xab\xdbWJ\x1d\xf1j\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4-\xd5x\xf7@}\xfb\xd5H\xd0^\x95\xcc\u00dcHT)bj\x89\u3bb5sr@\xa0\x00\x00\u07d4-\xd8\xee\xef\x87\x19J\xbc,\xe7X]\xa1\xe3[|\xeax\f\xb7\x8965\xc6 G9\u0640\x00\u07d4-\xdf@\x90Wi\xbc\xc4&\xcb,)8\xff\xe0w\xe1\u8758\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4-\xe0\x96D\x00\u0082\xbd\u05ca\x91\x9ck\xf7|k_yay\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94-\xe3\x1a\xfd\x18\x9a\x13\xa7o\xf6\xfes\xea\xd9\xf7K\xb5\u0126)\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4-\xec\x982\x9d\x1f\x96\u00e5\x9c\xaay\x81uTR\xd4\xdaI\u0549\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94-\ue422\x8f\x19-gj\x87s#+V\xf1\x8f#\x9e/\xad\x8a\x03\xef\xa7\xe7G\xb6\u046d\x00\x00\xe0\x94.\b\x80\xa3E\x96#\a \xf0Z\xc8\xf0e\xaf\x86\x81\u0736\u008a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4.\fW\xb4qP\xf9Z\xa6\xa7\xe1j\xb9\xb1\xcb\xf5C(\x97\x9a\x89\x05k\xc7^-c\x10\x00\x00\u07d4.\x10\x91\v\xa6\xe0\xbc\x17\xe0UUf\x14\u02c7\t\x0fM~[\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94.$\xb5\x97\x87;\xb1A\xbd\xb27\xea\x8aZ\xb7Gy\x9a\xf0-\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4.(\x10\xde\xe4J\xe4\xdf\xf3\xd8cB\xab\x12fW\xd6S\xc36\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4.,\xbdz\xd8%G\xb4\xf5\xff\x8b:\xb5o\x94*dE\xa3\xb0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4.-~\xa6k\x9fG\xd8\xccR\xc0\x1cR\xb6\u147c}G\x86\x89\xd8\xd4`,&\xbfl\x00\x00\u07d4.C\x93H\u07caBw\xb2*v\x84W\xd1\x15\x8e\x97\xc4\t\x04\x89*\x1e\x9f\xf2o\xbfA\x00\x00\xe0\x94.F\xfc\xeej;\xb1E\xb5\x94\xa2C\xa3\x91?\xce]\xado\xba\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794.G\xf2\x87\xf4\x98#7\x13\x85\r1&\x82<\xc6}\xce\xe2U\x88\u029d\x9e\xa5X\xb4\x00\x00\u07d4.N\u1b99j\xa0\xa1\xd9$(\xd0fR\xa6\xbe\xa6\xd2\xd1]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4.R\x91+\xc1\x0e\xa3\x9dT\xe2\x93\xf7\xae\u05b9\x9a\x0fLs\xbe\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4.a\x9fW\xab\xc1\u91ea\x93j\xe3\xa2&Ib\xe7\xeb-\x9a\x89(\xfb\x9b\x8a\x8aSP\x00\x00\u07d4.d\xa8\xd7\x11\x11\xa2/L]\xe1\xe09\xb36\xf6\x8d9\x8a|\x89lk\x93[\x8b\xbd@\x00\x00\u07d4.i3T=O,\xc0\vSP\xbd\x80h\xba\x92C\u05be\xb0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94.~\x05\xe2\x9e\u0767\xe4\xae%\xc5\x175C\xef\xd7\x1fm=\x80\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4.\u007fFU \xec5\xcc#\u058eue\x1b\xb6h\x95D\xa1\x96\x898\xec[r\x1a\x1a&\x80\x00\u07d4.\x8e\xb3\nqn_\xe1\\t#>\x03\x9b\xfb\x11\x06\xe8\x1d\x12\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94.\x98$\xb5\xc12\x11\x1b\xca$\xdd\xfb\xa7\xe5u\xa5\xcdr\x96\xc1\x8a\x03\xa4\x84Qnm\u007f\xfe\x00\x00\u07d4.\xa5\xfe\xe6?3z7nK\x91\x8e\xa8!H\xf9MH\xa6&\x89e\x0f\x8e\r\u0493\xc5\x00\x00\u07d4.\xafN*F\xb7\x89\xcc\u0088\xc8\xd1\xd9)N?\xb0\x858\x96\x89lk\x93[\x8b\xbd@\x00\x00\u07d4.\xaf\xf9\xf8\xf8\x110d\u04d5z\xc6\xd6\xe1\x1e\xeeB\xc8\x19]\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4.\xba\fn\xe5\xa1\x14\\\x1cW9\x84\x96:`]\x88\nz \x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4.\xc9X\"\xeb\x88{\xc1\x13\xb4q*M\xfd\u007f\x13\xb0\x97\xb5\xe7\x8965\u026d\xc5\u07a0\x00\x00\u07d4.\xcaj<]\x9fD\x9d\tV\xbdC\xfa{M{\xe8CYX\x89lk\xdaip\x9c\xc2\x00\x00\xe0\x94.\xca\xc5\x04\xb23\x86n\xb5\xa4\xa9\x9e{\u0490\x13Y\xe4;=\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4.\xeb\xf5\x942\xb5(\x92\xf98\v\xd1@\xaa\x99\xdc\xf8\xad\f\x0f\x89\b=lz\xabc`\x00\x00\u07d4.\xee\xd5\x04q\xa1\xa2\xbfS\xee0\xb1#.n\x9d\x80\xef\x86m\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4.\xefk\x14\x17\u05f1\x0e\xcf\xc1\x9b\x12:\x8a\x89\xe7>RlX\x89 \x86\xac5\x10R`\x00\x00\u07d4.\xf8i\xf05\vW\xd54x\xd7\x01\xe3\xfe\xe5)\xbc\x91\x1cu\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4.\xf9\xe4eqj\xca\u03f8\xc8%/\xa8\xe7\xbcyi\xeb\xf6\u4255\x9e\xb1\xc0\xe4\xae \x00\x00\xe0\x94.\xfcLd}\xacj\xca\xc3Uw\xad\"\x17X\xfe\xf6ao\xaa\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4/\x13eu&\xb1w\xca\xd5G\u00d0\x8c\x84\x0e\xffd{E\u0649?v\x84\x9c\xf1\xee,\x80\x00\u07d4/\x18}ZpMZ3\x8c[(v\xa0\x90\xdc\xe9d(N)\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94/%#\u0303O\x00\x86\x05$\x02bb\x96gQ\x86\xa8\u508a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4/(*\xbb\xb6\u0523\xc3\xcd;\\\xa8\x12\xf7d>\x800_\x06\x89dI\xe8NG\xa8\xa8\x00\x00\u07d4/+\xba\x1b\x17\x96\x82\x1avo\xced\xb8O(\xech\xf1Z\xea\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4/1]\x90\x16\xe8\xee_Sf\x81 /\x90\x84\xb02TMM\x898<\xd1+\x9e\x86<\x00\x00\u07d4/M\xa7SC\x0f\xc0\x9es\xac\xbc\xcd\xcd\xe9\xdad\u007f+]7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4/P\x80\xb8?~-\xc0\xa1\xdd\x11\xb0\x92\xad\x04+\xffx\x8fL\x89\xb4\xf8\xfby#\x1d+\x80\x00\u07d4/a\uf941\x9dp_+\x1eN\xe7T\xae\xb8\xa8\x19Pju\x89O%\x91\xf8\x96\xa6P\x00\x00\xe0\x94/f\xbf\xbf\"b\xef\u030d+\xd0DO\u0170ib\x98\xff\x1e\x8a\x02\x1a\xd95\xf7\x9fv\xd0\x00\x00\u07d4/m\xce\x130\u015e\xf9!`!TW-MK\xac\xbd\x04\x8a\x8965\u026d\xc5\u07a0\x00\x00\u07d4/}2\x90\x85\x1b\xe5\u01b4\xb4?}Et2\x9fa\xa7\x92\u00c9\x05k\xc7^-c\x10\x00\x00\u07d4/\x858\x17\xaf\u04f8\xf3\xb8n\x9f`\xeew\xb5\xd9ws\xc0\xe3\x89N\xae\xeaD\xe3h\xb9\x00\x00\u07d4/\xa4\x91\xfbY \xa6WN\xbd(\x9f9\xc1\xb2C\r-\x9aj\x89lk\x93[\x8b\xbd@\x00\x00\u07d4/\xb5f\xc9K\xbb\xa4\xe3\xcbg\xcd\xda}_\xadq1S\x91\x02\x89lk\x93[\x8b\xbd@\x00\x00\u07d4/\xbbPJ]\xc5'\xd3\xe3\xeb\x00\x85\xe2\xfc<}\xd58\xcbz\x89C\u00b1\x8a\xec<\n\x80\x00\u07d4/\xbc\x85y\x8aX5\x98\xb5\"\x16mn\x9d\xda\x12\x1db}\xbc\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4/\xbc\xef3\x84\xd4 \xe4\xbfa\xa0f\x99\x90\xbcpT\U00065bc9lk\x93[\x8b\xbd@\x00\x00\xe0\x94/\xc8.\xf0v\x93#A&Oaz\f\x80\xddW\x1ej\xe99\x8a\x01\x84$\xf5\xf0\xb1\xb4\xe0\x00\x00\u07d4/\u075by\u07cd\xf50\xadc\xc2\x0eb\xafC\x1a\xe9\x92\x16\xb8\x89\x01#n\xfc\xbc\xbb4\x00\x00\u07d4/\xe0\x02?W\"e\x0f:\x8a\xc0\x10\t\x12^t\xe3\xf8.\x9b\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4/\xe0\xccBKS\xa3\x1f\t\x16\xbe\b\xec\x81\xc5\v\xf8\xea\xb0\xc1\x89 \x86\xac5\x10R`\x00\x00\u07d4/\xe1:\x8d\a\x85\u0787X\xa5\xe4\x18v\xc3n\x91l\xf7Pt\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4/\xea\x1b/\x83O\x02\xfcT3?\x8a\x80\x9f\x048\xe5\x87\n\xa9\x89\x01\x18T\xd0\xf9\xce\xe4\x00\x00\u07d4/\xee6\xa4\x9e\xe5\x0e\xcfqo\x10G\x91VFw\x9f\x8b\xa0?\x899B\"\xc4\u0686\xd7\x00\x00\u07d4/\xef\x81G\x8aK.\x80\x98\xdb_\xf3\x87\xba!S\xf4\xe2+y\x896'\xe8\xf7\x127<\x00\x00\u07d4/\xf1`\xc4Or\xa2\x99\xb5\xec-q\xe2\x8c\xe5Dm/\u02ef\x89\x13\x84\x00\xec\xa3d\xa0\x00\x00\u07d4/\xf1\xcaU\xfd\x9c\xec\x1b\x1f\xe9\U00029af7LQ<\x1e*\xaa\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94/\xf5\u02b1,\r\x95\u007f\xd33\xf3\x82\xee\xb7Q\a\xa6L\xb8\xe8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94/\xf80\xcfU\xfb\x00\u0560\xe05\x14\xfe\xcdD1K\xd6\xd9\xf1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4/\xfe\x93\xec\x1aV6\xe9\xee4\xafp\xdf\xf5&\x82\xe6\xffpy\x89lk\x93[\x8b\xbd@\x00\x00\u07d40\x03y\x88p&q\xac\xbe\x89,\x03\xfeW\x88\xaa\x98\xaf(z\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d40$\x8dX\xe4\x14\xb2\x0f\xed:lH+Y\xd9\xd8\xf5\xa4\xb7\xe2\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4019\xbcYd\x03\xd5\u04d3\x1fwLf\u013aFtT\u06c9\\%\xe1J\xea(?\x00\x00\u079408\x00\x87xie\x14\x9e\x81B;\x15\xe3\x13\xba2\xc5\u01c3\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d40:0\xacB\x86\xae\x17\xcfH=\xad{\x87\fk\xd6M{J\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d40?\xba\xeb\xbeF\xb3[n[t\x94j_\x99\xbc\x15\x85\xca\xe7\x89/\x9a\xc0i_[\xba\x00\x00\u07d40ADZ3\xba\x15\x87A\x16\r\x9c4N\xb8\x8e\\0o\x94\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d40H\x01d\xbc\xd8It\xeb\xc0\xd9\f\x9b\x9a\xfa\xb6&\xcd\x1cs\x89+^:\xf1k\x18\x80\x00\x00\u07d40N\u019atTW!\xd71j\xefM\u03f4\x1a\u015e\xe2\xf0\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x940Q\x182\x91\x8d\x804\xa7\xbe\xe7.\xf2\xbf\xeeD\x0e\u02fc\xf6\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d40Q?\u029f6\xfdx\x8c\xfe\xa7\xa3@\xe8m\xf9\x82\x94\xa2D\x89\x18;_\x03\xb1G\x9c\x00\x00\u07d40U\xef\xd2`)\xe0\xd1\x1b\x93\r\xf4\xf5;\x16,\x8c?\xd2\u0389\x1b\x1a\b\x927\a=\x00\x00\u07d40]&\xc1\v\xdc\x10?k\x9c!'.\xb7\xcb-\x91\b\xc4~\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d40_x\xd6\x18\xb9\x90\xb4)[\xac\x8a-\xfa&(\x84\xf8\x04\xea\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x940d\x89\x9a\x96\x1a>\x1d\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d40\x98\xb6]\xb9>\xca\xca\xf75\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d40\uc4d2$J!\b\u0247\xbc\\\xdd\xe0\ud7c3z\x81{\x89T\x99%\xf6\xc9\xc5%\x00\x00\xe0\x940\xed\x11\xb7{\xc1~^f\x94\u023c[nG\x98\xf6\x8d\x9c\xa7\x8a\x1eo\xb3B\x1f\xe0)\x9e\x00\x00\u07d40\xf7\xd0%\xd1o{\xee\x10U\x80Ho\x9fV\x1c{\xae?\xef\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x940\xfb\xe5\x88_\x9f\xcc\xe9\xea^\u06c2\xedJ\x11\x96\xdd%\x9a\xed\x8a\x01\x19\xe4\u007f!8\x1f@\x00\x00\u07d41\x04}p?c\xb94$\xfb\xbdn/\x1f\x9et\xde\x13\xe7\t\x89\x9a\x81f\xf7\u6ca7\x80\x00\u07d411?\xfdc[\xf2\xf32HA\xa8\x8c\a\xed\x14aD\xce\xeb\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d41Y\xe9\fH\xa9\x15\x90J\xdf\u24b2/\xa5\xfd^ryk\x896\xaf\xe9\x8f&\x06\x10\x00\x00\u07d41]\xb7C\x9f\xa1\u0574#\xaf\xa7\xddq\x98\xc1\xcft\xc9\x18\xbc\x89 \x86\xac5\x10R`\x00\x00\u07d41^\xf2\xdab\x0f\xd30\xd1.\xe5]\xe5\xf3)\xa6\x96\xe0\xa9h\x89\b!\xab\rD\x14\x98\x00\x00\u07d41n\x92\xa9\x1b\xbd\xa6\x8b\x9e/\x98\xb3\xc0H\x93N<\xc0\xb4\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d41n\xb4\xe4}\xf7\x1bB\xe1mo\xe4h%\xb72{\xaf1$\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d41q\x87~\x9d\x82\f\xc6\x18\xfc\t\x19\xb2\x9e\xfd3?\xdaI4\x8965\u026d\xc5\u07a0\x00\x00\u07d41|\xf4\xa2<\xb1\x91\xcd\xc5c\x12\u009d\x15\xe2\x10\xb3\xb9\xb7\x84\x89\a\xcef\xc5\x0e(@\x00\x00\u07d41\x8b.\xa5\xf0\xaa\xa8y\xc4\xd5\xe5H\xac\x9d\x92\xa0\xc6t\x87\xb7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d41\x8cv\xec\xfd\x8a\xf6\x8dpUSR\xe1\xf6\x01\xe3Y\x88\x04-\x89\x1b1\x19.h\xc7\xf0\x00\x00\u07d41\x8f\x1f\x8b\xd2 \xb0U\x8b\x95\xfb3\x10\x0f\xfd\xbbd\r|\xa6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d41\xaa;\x1e\xbe\x8cM\xbc\xb6\xa7\b\xb1\xd7H1\xe6\x0eIv`\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d41\xab\b\x89f\xec\xc7\"\x92X\xf6\t\x8f\xceh\xcf9\xb3\x84\x85\x8965\u026d\xc5\u07a0\x00\x00\xe0\x941\xadM\x99F\xef\t\xd8\xe9\x88\xd9F\xb1\"\u007f\x91A\x90\x176\x8a\x04\xd8S\xc8\xf8\x90\x89\x80\x00\x00\xe0\x941\xb4;\x01]\x00\x81d~h\x00\x00\u07d424\x86\xcad\xb3uGO\xb2\xb7Y\xa9\xe7\xa15\x85\x9b\xd9\xf6\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d427I\xa3\xb9q\x95\x9eF\u0234\x82-\xca\xfa\xf7\xaa\xf9\xbdn\x89\x01\x16q\xa5\xb2Ep\x00\x00\u07d42:\xadA\xdfKo\xc8\xfe\u038c\x93\x95\x8a\xa9\x01\xfah\bC\x894\x95tD\xb8@\xe8\x00\x00\xe0\x942;<\xfe>\xe6+\xbd\xe2\xa2a\xe5<\xb3\xec\xc0X\x10\xf2\u018a\x02\ub3b1\xa1r\u0738\x00\x00\u07d42?\xca^\xd7\u007fi\x9f\x9d\x990\xf5\xce\xef\xf8\xe5oY\xf0<\x89Hz\x9a0E9D\x00\x00\u07d42H\\\x81\x87(\xc1\x97\xfe\xa4\x87\xfb\xb6\xe8)\x15\x9e\xba\x83p\x899!\xb4\x13\xbcN\xc0\x80\x00\xe0\x942P\xe3\xe8X\xc2j\xde\u032d\xf3jVc\xc2*\xa8LAp\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x942Y\xbd/\xdd\xfb\xbco\xba\u04f6\xe8t\xf0\xbb\xc0,\xda\x18\xb5\x8a\x02\x84`VI[\r\x18\x80\x00\u07d42uIo\xd4\u07491\xfdi\xfb\n\v\x04\xc4\xd1\xff\x87\x9e\xf5\x89\x18-~L\xfd\xa08\x00\x00\u07d42{\xb4\x9euOo\xb4\xf73\xc6\xe0o9\x89\xb4\xf6]K\xee\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d42\x82y\x1do\xd7\x13\xf1\xe9OK\xfdV^\xaax\xb3\xa0Y\x9d\x89Hz\x9a0E9D\x00\x00\u07d42\x83\xeb\u007f\x917\xdd9\xbe\xd5_\xfek\x8d\xc8E\xf3\xe1\xa0y\x89\x03\x97\n\xe9!Ux\x00\x00\u07d42\x86\t\x97\xd70\xb2\xd8;s$\x1a%\xd3f}Q\xc9\b\xef\x89\x1b\x1a\b\x927\a=\x00\x00\xe0\x942\x86\u047cez1,\x88G\xd9<\xb3\xcbyP\xf2\xb0\xc6\xe3\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x942\xa2\r\x02\x8e,b\x18\xb9\xd9[D\\w\x15$cj\"\xef\x8a\x02\x02\xfe\xfb\xf2\xd7\xc2\xf0\x00\x00\u07d42\xa7\x06\x91%\\\x9f\xc9y\x1aOu\u0238\x1f8\x8e\n%\x03\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d42\xb7\xfe\xeb\xc5\u015b\xf6^\x86\x1cL\v\xe4*v\x11\xa5T\x1a\x89w\u9aa8R\\\x10\x00\x00\xe0\x942\xba\x9a}\x04#\xe0:R_\xe2\xeb\xebf\x1d \x85w\x8b\u060a\x04<3\xc1\x93ud\x80\x00\x00\u07d42\xbb.\x96\x93\xe4\xe0\x854M/\r\xbdF\xa2\x83\u3807\xfd\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x942\xc2\xfd\u2daa\xbb\x80\u5ba2\xb9I\xa2\x17\xf3\xcb\t\"\x83\x8a\x010a`\xaf\xdf 7\x80\x00\u07d42\xd9P\xd5\xe9>\xa1\u0574\x8d\xb4qO\x86{\x03 \xb3\x1c\x0f\x897\b\xba\xed=h\x90\x00\x00\u07d42\u06f6qlT\xe81e\x82\x9aJ\xbb6uxI\xb6\xe4}\x8965\u026d\xc5\u07a0\x00\x00\u07d42\xebd\xbe\x1b]\xed\xe4\b\u01bd\xef\xben@\\\x16\xb7\xed\x02\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d42\xef\\\xdcg\x1d\xf5V*\x90\x1a\xee]\xb7\x16\xb9\xbev\xdc\xf6\x89lk\x93[\x8b\xbd@\x00\x00\u07d42\xf2\x9e\x87'\xa7LkC\x01\xe3\xff\xff\x06\x87\xc1\xb8p\xda\xe9\x8965\u026d\xc5\u07a0\x00\x00\u07d42\xfa\x0e\x86\xcd\b}\u058di1\x90\xf3-\x931\t\t\xedS\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d42\xfb\xee\xd6\xf6&\xfc\xdf\xd5\x1a\xca\xfbs\v\x9e\xef\xf6\x12\xf5d\x89lk\x93[\x8b\xbd@\x00\x00\u07943\x00\xfb\x14\x9a\xde\xd6[\u02e6\xc0N\x9c\u05b7\xa0;\x89;\xb1\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x943\x01\xd9\xca/;\xfe\x02by\xcdh\x19\xf7\x9a)=\x98\x15n\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\xe0\x943\b\xb04f\xc2z\x17\xdf\xe1\xaa\xfc\xeb\x81\xe1m)4Vo\x8a\x03\x99\x92d\x8a#\u0220\x00\x00\u07943\x1a\x1c&\xcci\x94\xcd\xd3\xc1K\xec\xe2v\xff\xffK\x9d\xf7|\x88\xfaz\xed\xdfO\x06\x80\x00\xe0\x943&\xb8\x8d\xe8\x06\x18DT\xc4\v'\xf3\t\xd9\xddm\u03f9x\x8a\x03\xca\\f\u067cD0\x00\x00\xe0\x943)\xeb;\xafCE\xd6\x00\xce\xd4\x0en\x99ueo\x117B\x8a\x01\x0f\b\xed\xa8\xe5U\t\x80\x00\u07d432\r\xd9\x0f+\xaa\x11\r\xd34\x87*\x99\x8f\x14\x84&E<\x8965f3\xeb\xd8\xea\x00\x00\u07d436\xc3\xefn\x8bP\xee\x90\xe07\xb1d\xb7\xa8\xea_\xaa\xc6]\x89\x0e\u0223\xa7\x1c\"T\x00\x00\xe0\x9438\fo\xffZ\xcd&Q0\x96)\u06daq\xbf? \u017a\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d43:\xd1Yd\x01\xe0Z\xea-6\xcaG1\x8e\xf4\xcd,\xb3\u07c9\x9d\xc0\\\xce(\u00b8\x00\x00\u07d43C@\xeeK\x9c\u0701\xf8P\xa7Q\x16\xd5\x0e\u9d98%\xbf\x89lk\x93[\x8b\xbd@\x00\x00\u07d43H\x1e\x85n\xbe\u050e\xa7\b\xa2t&\xef(\xe8g\xf5|\u0449\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x943V[\xa9\xda,\x03\xe7x\xce\x12)O\b\x1d\xfe\x81\x06M$\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07943X\x1c\xee#0\x88\xc0\x86\r\x94N\f\xf1\u03ab\xb8&\x1c.\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d43XX\xf7I\xf1i\u02bc\xfeR\xb7\x96\xe3\xc1\x1e\xc4~\xa3\u0089\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x943^\"\x02[zw\u00e0t\u01cb\x8e=\xfe\a\x13A\x94n\x8a\x02'\xcas\n\xb3\xf6\xac\x00\x00\u07d43b\x9b\xd5/\x0e\x10{\xc0q\x17ld\xdf\x10\x8fdw}I\x89\x01\xcf\xddth!n\x80\x00\u07d43{;\u07c6\xd7\x13\xdb\xd0{]\xbf\xcc\x02+z{\x19F\xae\x89\xd7\xc1\x98q\x0ef\xb0\x00\x00\u07d43|\xfe\x11W\xa5\u0191 \x10\xddV\x153y\x17i\u00b6\xa6\x8965\u026d\xc5\u07a0\x00\x00\u07d43\xb36\xf5\xba^\xdb{\x1c\xcc~\xb1\xa0\u0644\xc1#\x1d\x0e\u0709lk\x93[\x8b\xbd@\x00\x00\u07d43\xc4\a\x13;\x84\xb3\xcaL=\xed\x1fFX\x90\f8\x10\x16$\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\xe0\x943\xd1r\xab\a\\Q\xdb\x1c\xd4\n\x8c\xa8\xdb\xff\r\x93\xb8C\xbb\x8a\x016x\x05\x10\xd1-\xe3\x80\x00\u07d43\xe9\xb7\x18#\x95.\x1ff\x95\x8c'\x8f\u008b\x11\x96\xa6\u0164\x89\x05k\xc7^-c\x10\x00\x00\u07d43\xeakxU\xe0[\a\xab\x80\u06b1\xe1M\xe9\xb6I\xe9\x9bl\x89\x1c\xd6\xfb\xadW\xdb\xd0\x00\x00\u07d43\xf1R#1\rD\u078bf6h_:L=\x9cVU\xa5\x89\r\x94b\xc6\xcbKZ\x00\x00\u07d43\xf4\xa6G\x1e\xb1\xbc\xa6\xa9\xf8[;Hr\xe1\aU\xc8+\xe1\x89lk\x93[\x8b\xbd@\x00\x00\u07d43\xfbWzM!O\xe0\x10\xd3,\xca|>\xed\xa6?\x87\xce\xef\x8965\u026d\xc5\u07a0\x00\x00\u07d43\xfdq\x8f\v\x91\xb5\xce\u020a]\xc1^\xec\xf0\xec\xef\xa4\xef=\x89\x17r$\xaa\x84Lr\x00\x00\u07d44\x14\x80\u030c\xb4v\xf8\xd0\x1f\xf3\b\x12\xe7\xc7\x0e\x05\xaf\xaf]\x89lk\x93[\x8b\xbd@\x00\x00\u07d44'-^ut1]\xca\u9afd1{\xac\x90(\x9dGe\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x9440\xa1c\x81\xf8i\xf6\xeaT#\x91XU\xe8\x00\x885%\xa9\x8a\x03\xca\\f\u067cD0\x00\x00\u07d441\x86%\x81\x8e\xc1?\x11\x83Z\xe9sS\xce7}oY\n\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d449<]\x91\xb9\xdeYr\x03\xe7[\xacC\t\xb5\xfa=(\u00c9\n\x84Jt$\xd9\xc8\x00\x00\u07d449\x99\x8b$|\xb4\xbf\x8b\xc8\nm+5'\xf1\xdf\xe9\xa6\u0489\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d44C}\x14ed\v\x13l\xb5\x84\x1c?\x93O\x9b\xa0\xb7\t}\x89\t`\xdbwh\x1e\x94\x00\x00\u07d44J\x8d\xb0\x86\xfa\xedN\xfc7\x13\x1b:\"\xb0x-\xadp\x95\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x944fM\"\x0f\xa7\xf3yX\x02J32\u0584\xbc\xc6\xd4\u023d\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d44f\xf6~9cl\x01\xf4;:!\xa0\xe8R\x93%\xc0\x86$\x89-\xb1\x16vP\xac\xd8\x00\x00\u07d44\x856\x1e\xe6\xbf\x06\xefe\b\xcc\xd2=\x94d\x1f\x81M>/\x89lk\x93[\x8b\xbd@\x00\x00\u07d44\x85\xf6!%d3\xb9\x8aB\x00\xda\xd8W\xef\xe5Y7\uc609lk\x93[\x8b\xbd@\x00\x00\u07d44\x95\x8aF\xd3\x0e0\xb2s\xec\xc6\xe5\xd3X\xa2\x12\xe50~\x8c\x89lk\x93[\x8b\xbd@\x00\x00\u07d44\x97\xddf\xfd\x11\x80q\xa7\x8c,\xb3n@\xb6e\x1c\xc8%\x98\x89\x05\xf1\x01kPv\xd0\x00\x00\xe0\x944\x9a\x81k\x17\xab='\xbb\xc0\xae\x00Q\xf6\xa0p\xbe\x1f\xf2\x9d\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d44\x9d,\x91\x8f\u041e(\a1\x8ef\xceC)\t\x17k\xd5\v\x89<\xb7\x1fQ\xfcU\x80\x00\x00\u07d44\xa0C\x1f\xff^\xad\x92\u007f\xb6`\f\x1e\xa8\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d44\xff&\xeb`\xa8\u0469ZH\x9f\xae\x13n\xe9\x1dNX\bL\x89 \x86\xac5\x10R`\x00\x00\u07d44\xffX)R\xff$E\x8f{\x13\xd5\x1f\vO\x98p\"\xc1\xfe\x89\x98\x06\xde=\xa6\xe9x\x00\x00\u07d45\x10k\xa9N\x85c\u0533\xcb<\\i,\x10\xe6\x04\xb7\xce\u0609lk\x93[\x8b\xbd@\x00\x00\xe0\x945\x14_b\x03\x97\u019c\xb8\xe0\tb\x96\x1f\x0fH\x86d9\x89\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d45\x14t0\xc3\x10e\x00\u77e2\xf5\x02F.\x94p<#\xb1\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x945\x17\x87\x845\x05\xf8\xe4\xef\xf4ef\xcc\u695fM\x1c_\xe7\x8a\x01\xf5q\x89\x87fKH\x00\x00\xe0\x945\x1f\x16\xe5\xe0sZ\xf5gQ\xb0\xe2%\xb2B\x11q9@\x90\x8a\x02\xd4\xca\x05\xe2\xb4<\xa8\x00\x00\xe0\x945$\xa0\x00#N\xba\xaf\a\x89\xa14\xa2\xa4\x178<\xe5(*\x8a\x011yU\x94}\x8e,\x00\x00\u07d45&\xee\xce\x1ak\xdc>\xe7\xb4\x00\xfe\x93[HF?1\xbe\u05c9\x04w\x87\x9bm\x140\x00\x00\u07d45*x_J\x92\x162PL\xe5\xd0\x15\xf8\xd7FO\xa3\xdb\x14\xe7r\x92\x13\u03aa7\x8c\t^\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d45\xaf\x04\n\f\xc23zv\xaf(\x81T\xc7V\x1e\x1a#3I\x8965\u026d\xc5\u07a0\x00\x00\u07d45\xb0>\xa4$W6\xf5{\x85\xd2\xebyb\x8f\x03m\xdc\xd7\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d45\xbd$he\xfa\xb4\x90\xac\bz\xc1\xf1\xd4\xf2\xc1\r\f\xda\x03\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x945\xbff\x88R/5Fz\u007fu0#\x14\xc0+\xa1v\x80\x0e\x8a\x03\xafA\x82\x02\xd9T\xe0\x00\x00\u07d45\u022d\xc1\x11%C+;w\xac\xd6F%\xfeX\xeb\xee\x9df\x89lk\x93[\x8b\xbd@\x00\x00\u07d45\u0497\x0fI\xdc\xc8\x1e\xa9\xeep~\x9c\x8a\n\xb2\xa8\xbbtc\x89N\x10\x03\xb2\x8d\x92\x80\x00\x00\u07d45\xe0\x96\x12\r\xea\xa5\xc1\xec\xb1d^,\u02cbN\xdb\xd9)\x9a\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d45\xea!c\xa3\x8c\u07da\x12?\x82\xa5\xec\x00%\x8d\xae\v\xc7g\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d45\xf1\xda\x12{\x837o\x1b\x88\xc8*3Y\xf6z^g\xddP\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d45\xf2\x94\x9c\xf7\x8b\xc2\x19\xbbO\x01\x90|\xf3\xb4\xb3\u04c6T\x82\x89\x0f\xb5\xc8l\x92\xe44\x00\x00\u07d45\xf5\x86\x01I\xe4\xbb\xc0K\x8a\u0172r\xbeU\xad\x1a\xcaX\xe0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d46\x02E\x8d\xa8omj\x9d\x9e\xb0=\xaf\x97\xfeV\x19\xd4B\xfa\x89lk\x93[\x8b\xbd@\x00\x00\u07d46\x057-\x93\xa9\x01\t\x88\x01\x8f\x9f1]\x03.\u0448\x0f\xa1\x89\x1b\x1b\xcfQ\x89j}\x00\x00\u07d46\x16\xd4H\x98_]2\xae\xfa\x8b\x93\xa9\x93\xe0\x94\xbd\x85I\x86\x89\v\"\u007fc\xbe\x81<\x00\x00\u07d46\x16\xfbF\xc8\x15x\xc9\xc8\xebM;\xf8\x80E\x1a\x887\x9d}\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d46\x1cu\x93\x16\x96\xbc=B}\x93\xe7lw\xfd\x13\xb2A\xf6\xf4\x89\x1d\xc5\xd8\xfc&m\xd6\x00\x00\u07d46\x1d\x9e\xd8\v[\xd2|\xf9\xf1\"o&u2X\xee_\x9b?\x89\xbfi\x14\xba}r\xc2\x00\x00\u07d46\x1f;\xa9\xed\x95kw\x0f%}6r\xfe\x1f\xf9\xf7\xb0$\f\x89 \x86\xac5\x10R`\x00\x00\u07d46\"|\u07e0\xfd;\x9d~jtF\x85\xf5\xbe\x9a\xa3f\xa7\xf0\x89\n\xc2s\x0e\xe9\xc6\xc1\x80\x00\u07d46/\xbc\xb1\x06b7\n\x06\x8f\xc2e&\x02\xa2Wy7\xcc\xe6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d460\xc5\xe5e\u03aa\x8a\x0f\x0f\xfe2\x87^\xae*l\xe6<\x19\x89\t7r+7t\xd0\x00\x00\u07d463\x9f\x84\xa5\u00b4L\xe5=\xfd\xb6\xd4\xf9}\xf7\x82\x12\xa7\u07c9\x11o\x18\xb8\x17\x15\xa0\x00\x00\u07d464:\xec\xa0{n\u054a\x0eb\xfaN\xcbI\x8a\x12O\xc9q\x89\x10CV\x1a\x88)0\x00\x00\u07d46au@4\x81\xe0\xab\x15\xbbQF\x15\u02f9\x89\xeb\u018f\x82\x89lk\x93[\x8b\xbd@\x00\x00\u07d46ro;\x88Z$\xf9)\x96\u0681b^\u022d\x16\xd8\xcb\xe6\x89S\xafu\u0441HW\x80\x00\xe0\x946s\x95C\x99\xf6\u07feg\x18\x18%\x9b\xb2x\xe2\xe9.\xe3\x15\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d46u\x8e\x04\x9c\u064b\u03a1\"w\xa6v\xf9)sb\x89\x00#\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d46\u007fY\u0302yS)8NA\xe1(1\x15\xe7\x91\xf2j\x01\x89lk\x93[\x8b\xbd@\x00\x00\u07d46\x81\x0f\xf9\xd2\x13\xa2q\xed\xa2\xb8\xaay\x8b\xe6T\xfaK\xbe\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d46\x8cT\x14\xb5k\x84U\x17\x1f\xbf\ab \xc1\u02e4\xb5\xca1\x89\x1e>\xf9\x11\xe8=r\x00\x00\xe0\x946\x90$k\xa3\xc8\x06y\xe2.\xacD\x12\xa1\xae\xfc\xe6\xd7\u0342\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d46\x92\x8bU\xbc\x86\x15\t\xd5\x1c\x8c\xf1\xd5F\xbf\xecn>\x90\xaf\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d46\x98\"\xf5W\x8b@\xdd\x1fDqpk\"\u0357\x13R\xdak\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\u07d46\x9e\xf7a\x19_:7>$\xec\xe6\xcd\"R\x0f\xe0\xb9\xe8n\x89\x1c\xff\xaf\xc9M\xb2\b\x80\x00\u07d46\xa0\x8f\xd6\xfd\x1a\xc1|\xe1^\xd5~\xef\xb1*+\u2048\xbf\x89Hz\x9a0E9D\x00\x00\u07d46\xa0\xe6\x1e\x1b\xe4\u007f\xa8~0\xd3(\x88\xee\x030\x90\x1c\xa9\x91\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x946\xb2\xc8^:\xee\xeb\xb7\rc\u0124s\f\xe2\xe8\xe8\x8a6$\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x946\xbfC\xff5\u07d0\x90\x88$3l\x9b1\xce3\x06~/P\x8aIr\x15\x10\xc1\xc1\xe9H\x00\x00\u07d46\xbf\xe1\xfa;{p\xc1r\xeb\x04/h\x19\xa8\x97%\x95A>\x8965\u026d\xc5\u07a0\x00\x00\xe0\x946\xc5\x10\xbf\x8dnV\x9b\xf2\xf3}G&]\xbc\xb5\x02\xff+\u038a\x06ZM\xa2]0\x16\xc0\x00\x00\xe0\x946\xd8]\xc3h1V\xe6;\xf8\x80\xa9\xfa\xb7x\x8c\xf8\x14:'\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d46\u07cf\x88<\x12s\xec\x8a\x17\x1fz3\xcf\xd6I\xb1\xfe`u\x89\fRHJ\xc4\x16\x89\x00\x00\xe0\x946\xe1Va\f\xd8\xffd\xe7\x80\u061d\x00T8\\\xa7gU\xaa\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d46\xfe\xc6,,B^!\x9b\x18D\x8a\xd7W\x00\x9d\x8cT\x02o\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d47\x00\xe3\x02t$\xd99\xdb\xde]B\xfbx\xf6\xc4\xdb\xec\x1a\x8f\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d47\x02\xe7\x04\xcc!at9\xadN\xa2zW\x14\xf2\xfd\xa1\xe92\x8965\u026d\xc5\u07a0\x00\x00\u07d47\x035\fMo\xe374,\xdd\xc6[\xf1\xe28k\xf3\xf9\xb2\x89m\x81!\xa1\x94\xd1\x10\x00\x00\xe0\x947\b\xe5\x9d\xe6\xb4\x05P\x88x)\x02\xe0W\x9cr\x01\xa8\xbfP\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d47\x126~^U\xa9mZ\x19\x16\x8fn\xb2\xbc~\x99q\xf8i\x8965\u026d\xc5\u07a0\x00\x00\u07d47\x19Zc]\xccb\xf5jq\x80I\xd4~\x8f\x9f\x96\x83(\x91\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d47'4\x1f&\xc1 \x01\xe3x@^\xe3\x8b-\x84d\xecq@\x89lk\x93[\x8b\xbd@\x00\x00\u07d47.E:kb\x9f'g\x8c\u022e\xb5\xe5|\xe8^\xc0\xae\xf9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d474\xcb\x18t\x91\xed\xe7\x13\xae[;-\x12(J\xf4k\x81\x01\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d477!n\xe9\x1f\x17w2\xfbX\xfa@\x97&r\a\xe2\xcfU\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d47M;\xbb\x057Q\xf9\xf6\x8d\xdb\a\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d48r\xf4\x8d\xc5\xe3\xf8\x17\xbck*\xd2\xd00\xfc^\x04q\x19=\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d48~\xea\xfdk@\t\u07af\x8b\u0578Zr\x98:\x8d\xcc4\x87\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d48\x81\xde\xfa\xe1\xc0{<\xe0Lx\xab\xe2k\f\u070ds\xf0\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d48\x83\xbe\xcc\b\xb9\xbeh\xad;\b6\xaa\u00f6 \xdc\x00\x17\xef\x89lk\x93[\x8b\xbd@\x00\x00\u07d48\x85\xfe\xe6q\a\xdc:\xa9\x8a\x1d\x99:t\xdf\\\xd7T\xb9\x8dR\x9a\x89a\t=|,m8\x00\x00\u07d48\xe4m\xe4E<8\xe9A\xe7\x93\x0fC0O\x94\xbb{+\xe8\x89l\xb7\xe7Hg\xd5\xe6\x00\x00\u07d48\xe7\u06e8\xfdO\x1f\x85\r\xbc&I\xd8\xe8O\tR\xe3\xeb<\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d48\xe8\xa3\x1a\xf2\xd2e\xe3\x1a\x9f\xff-\x8fF(m\x12E\xa4g\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d48\xeao[Z{\x88AuQ\xb4\x12=\xc1'\xdf\xe94-\xa6\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d48\xee\xc6\xe2\x17\xf4\xd4\x1a\xa9 \xe4$\xb9RQ\x97\x04\x1c\xd4\u0189\xf0\r%\xeb\x92.g\x00\x00\xe0\x948\xf3\x87\xe1\xa4\xedJs\x10n\xf2\xb4b\xe4t\xe2\xe3\x14:\u040a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d49\x11a\xb0\xe4<0 f\u898d,\xe7\xe1\x99\xec\xdb\x1dW\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x949\x15\uad6b.Yw\xd0u\xde\xc4}\x96\xb6\x8bK\\\xf5\x15\x8a\r\a\x01\x81\x85\x12\x0f@\x00\x00\u07d49\x1aw@\\\t\xa7+^\x846#z\xaa\xf9]h\xda\x17\t\x89\x02\xa9&J\xf3\u0479\x00\x00\u07d49\x1f \x17m\x126\rrMQG\n\x90p6uYJM\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d49$3\xd2\u0383\xd3\xfbJv\x02\u0323\xfa\xcaN\xc1@\xa4\xb0\x89\x02\xc3\xc4e\xcaX\xec\x00\x00\xe0\x949?x;\\\u06c6\"\x1b\xf0)O\xb7\x14\x95\x9c{E\x89\x9c\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d49?\xf4%^\\e\x8f.\u007f\x10\xec\xbd)%rg\x1b\xc2\u0489lk\x93[\x8b\xbd@\x00\x00\u07d49A2`\x0fAU\xe0\u007fME\xbc>\xb8\xd9\xfbr\xdc\u05c4\x89\x9fn\x92\xed\xea\a\xd4\x00\x00\u07d49Q\xe4\x8e<\x86\x9ekr\xa1C\xb6\xa4Ph\u0379\xd4f\u0409\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x949T\xbd\xfe\v\xf5\x87\u0195\xa3\x05\xd9$L=[\xdd\xda\u027b\x8a\x04\x10'\x83'\xf9\x85`\x80\x00\u07d49]m%U \xa8\xdb)\xab\xc4}\x83\xa5\u06ca\x1a}\xf0\x87\x89\x05k\xc7^-c\x10\x00\x00\u07d49ck%\x81\x1b\x17j\xbf\xcf\xee\xcad\xbc\x87E/\x1f\xdf\xf4\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d49i\xb4\xf7\x1b\xb8u\x1e\xdeC\xc0\x166:zaOv\x11\x8e\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x949x/\xfe\x06\xacx\x82*<:\x8a\xfe0^P\xa5a\x88\u038a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d49zn\xf8v:\x18\xf0\x0f\xac!~\x05\\\r0\x94\x10\x10\x11\x89lk\x93[\x8b\xbd@\x00\x00\u07d49|\u06cc\x80\xc6yP\xb1\x8deB)a\x0e\x93\xbf\xa6\xee\x1a\x89?\x95\xc8\xe0\x82\x15!\x00\x00\u07d49\x82O\x8b\xce\xd1v\xfd>\xa2.\u01a4\x93\xd0\xcc\xc3?\xc1G\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d49\x93l'\x19E\v\x94 \xcc%\"\u03d1\xdb\x01\xf2'\xc1\xc1\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d49\x95\xe0\x96\xb0\x8aZrh\x00\xfc\xd1}\x9cd\xc6N\b\x8d+\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d49\x9a\xa6\xf5\xd0x\xcb\tp\x88+\u0259 \x06\xf8\xfb\xdf4q\x8965\u026d\xc5\u07a0\x00\x00\u07d49\xaa\x05\xe5m}28T!\u03d36\xe9\r=\x15\xa9\xf8Y\x89\x01h\u048e?\x00(\x00\x00\u07d49\xaa\xf0\x85M\xb6\xeb9\xbc{.C\x84jv\x17\x1c\x04E\u0789dI\xe8NG\xa8\xa8\x00\x00\u07d49\xb1\xc4q\xae\x94\xe1!dE.\x81\x1f\xbb\xe2\xb3\xcdru\xac\x89lk\x93[\x8b\xbd@\x00\x00\u07d49\xb2\x992t\x90\xd7/\x9a\x9e\xdf\xf1\x1b\x83\xaf\xd0\xe9\xd3\xc4P\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d49\xba\u018d\x94xY\xf5\x9e\x92&\b\x9c\x96\xd6.\x9f\xbe<\u0789\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x949\xbf\xd9xh\x9b\xec\x04\x8f\xc7v\xaa\x15$\u007f^\x1d|9\xa2\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d49\xc7s6|\x88%\xd3YlhoB\xbf\r\x141\x9e?\x84\x89\a?u\u0460\x85\xba\x00\x00\u07d49\u05291@,\fy\xc4W\x18o$\u07c7)\u03d5p1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d49\xd6\xca\xca\"\xbc\xcdjr\xf8~\xe7\u05b5\x9e\v\xde!\xd7\x19\x89l\x87T\xc8\xf3\f\b\x00\x00\u07d49\xe0\xdbM`V\x8c\x80\v\x8cU\x00\x02l%\x94\xf5v\x89`\x8965\u026d\xc5\u07a0\x00\x00\xe0\x949\xeeO\xe0\x0f\xbc\xeddph\xd4\xf5|\x01\xcb\"\xa8\v\xcc\u044a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d49\xf1\x983\x1eK!\xc1\xb7`\xa3\x15_J\xb2\xfe\x00\xa7F\x19\x89lk\x93[\x8b\xbd@\x00\x00\u07d49\xf4Fc\xd9%a\t\x1b\x82\xa7\r\xcfY=u@\x05\x97:\x89\n\u05cb.\xdc!Y\x80\x00\u07d4:\x03U\x94\xc7GGmB\xd1\xee\x96l6\"L\xdd\"I\x93\x89\x13J\xf7Ei\xf9\xc5\x00\x00\u07d4:\x04W(G\xd3\x1e\x81\xf7v\\\xa5\xbf\xc9\xd5W\x15\x9f6\x83\x89\a6-\r\xab\xea\xfd\x80\x00\xe0\x94:\x06\xe3\xbb\x1e\xdc\xfd\fD\xc3\aM\xe0\xbb`k\x04\x98\x94\xa2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794:\x10\x88\x8b~\x14\x9c\xae',\x010,2}\n\xf0\x1a\v$\x88\xeb\xec!\xee\x1d\xa4\x00\x00\u07d4:1\b\xc1\u6023;3l!\x13\x134@\x9d\x97\xe5\xad\xec\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4:6\x8e\xfeJ\u05c6\xe2c\x95\xec\x9f\u01adi\x8c\xae)\xfe\x01\x89\"E\x89\x96u\xf9\xf4\x00\x00\u07d4:=\xd1\x04\xcd~\xb0O!\x93/\xd43\xeaz\xff\u04d3i\xf5\x89\x13aO#\xe2B&\x00\x00\u07d4:B\x97\xda\xc4.\x1eO\xb8\xcb1\xec\xddC\xaew<\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94:\x99`&m\xf6I cS\x8a\x99\xf4\x87\xc9P\xa3\xa5\uc78a\x05\x15\n\xe8J\x8c\xdf\x00\x00\x00\u07d4:\x9b\x11\x10)\xce\x1f \xc9\x10\x9czt\xee\xee\xf3OO.\xb2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4:\x9eTA\xd4K$;\xe5[u\x02z\x1c\ub7ac\xf5\r\xf2\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94:\xa0z4\xa1\xaf\u0216}=\x13\x83\xb9kb\u03d6\xd5\xfa\x90\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94:\xa4,!\xb9\xb3\x1c>'\xcc\xd1~\t\x9a\xf6y\xcd\xf5i\a\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4:\xa9H\xea\x029wU\xef\xfb/\x9d\xc99-\xf1\x05\x8f~3\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4:\xad\xf9\x8ba\xe5\u0216\xe7\xd1\x00\xa39\x1d2P\"]a\u07c9\f\xafg\x007\x01h\x00\x00\u07d4:\xaeHr\xfd\x90\x93\xcb\xca\xd1@o\x1e\x80x\xba\xb5\x03Y\xe2\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4:\xbb\x8a\xdf\xc6\x04\xf4\x8dY\x84\x81\x1d\u007f\x1dR\xfe\xf6u\x82p\x89\xf2\x97\x19\xb6o\x11\f\x00\x00\u07d4:\xc2\xf0\xff\x16\x12\xe4\xa1\xc3F\xd53\x82\xab\xf6\u0622[\xaaS\x89lk\x93[\x8b\xbd@\x00\x00\u07d4:\xc9\xdczCj\xe9\x8f\xd0\x1cz\x96!\xaa\x8e\x9d\v\x8bS\x1d\x89a\t=|,m8\x00\x00\xe0\x94:\xd0aI\xb2\x1cU\xff\x86|\xc3\xfb\x97@\u04bc\xc7\x10\x121\x8a)\xb7d2\xb9DQ \x00\x00\u07d4:\xd7\x02C\u060b\xf0@\x0fW\xc8\xc1\xfdW\x81\x18H\xaf\x16*\x89.\x9e\xe5\u00c6S\xf0\x00\x00\u07d4:\xd9\x15\xd5P\xb7#AV \xf5\xa9\xb5\xb8\x8a\x85\xf3\x82\xf05\x8965\u026d\xc5\u07a0\x00\x00\u07d4:\xe1`\xe3\xcd`\xae1\xb9\xd6t-h\xe1Nv\xbd\x96\xc5\x17\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4:\xe6+\xd2q\xa7`c\u007f\xady\xc3\x1c\x94\xffb\xb4\xcd\x12\xf7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4:\xeaN\x82\xd2@\x02H\xf9\x98q\xa4\x1c\xa2W\x06\r:\"\x1b\x8965\u026d\xc5\u07a0\x00\x00\u07d4:\xf6[>(\x89ZJ\x00\x11S9\x1d\x1ei\xc3\x1f\xb9\xdb9\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4;\a\xdbZ5\u007fZ\xf2HL\xbc\x9dw\xd7;\x1f\xd0Q\x9f\u01c9\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4;\n\u032fK`|\xfea\xd1s4\xc2\x14\xb7\\\xde\xfd\xbd\x89\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\x13c\x1a\x1b\x89\xcbVeH\x89\x9a\x1d`\x91\\\xdc\xc4 [\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\x15\x90\x99\aR\a\u0180vc\xb1\xf0\xf7\xed\xa5J\xc8\xcc\xe3\x89j\xc4\xe6[i\xf9-\x80\x00\u07d4;\x197\xd5\u74f8\x9bc\xfb\x8e\xb5\xf1\xb1\xc9\xcak\xa0\xfa\x8e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\"\xda*\x02q\xc8\xef\xe1\x02S'scji\xb1\xc1~\t\x89\x1b6\xa6DJ>\x18\x00\x00\u07d4;\"\u07a3\xc2_\x1bY\u01fd'\xbb\x91\u04e3\xea\xec\xef9\x84\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94;#g\xf8IK_\xe1\x8dh<\x05]\x89\x99\x9c\x9f=\x1b4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4;,E\x99\x0e!GDQ\xcfOY\xf0\x19U\xb31\xc7\xd7\u0249lk\x93[\x8b\xbd@\x00\x00\xe0\x94;A\x00\xe3\ns\xb0\xc74\xb1\x8f\xfa\x84&\u045b\x191/\x1a\x8a\v\xb5\u046ap\n\xfd\x90\x00\x00\u07d4;B\xa6m\x97\x9fX(4tz\x8b`B\x8e\x9bN\xec\xcd#\x89!\xa1\u01d0\xfa\xdcX\x00\x00\u07d4;Gh\xfdq\xe2\xdb,\xbe\u007f\xa0PH<'\xb4\xeb\x93\x1d\xf3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;Vj\x8a\xfa\u0456\x82\xdc,\xe8g\x9a<\xe4D\xa5\xb0\xfdO\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94;\\%\x1d\u007f\u05c9;\xa2\t\xfeT\x1c\xec\xd0\xce%:\x99\r\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4;^\x8b\x17w\xca\x18A\x896\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94;\x93\xb1a6\xf1\x1e\xaf\x10\x99l\x95\x99\r;'9\xcc\xea_\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4;\xabK\x01\xa7\xc8K\xa1?\uea70\xbb\x19\x1bw\xa3\xaa\u0723\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4;\xb55\x98\xcc \xe2\x05]\xc5S\xb0I@J\u0277\xdd\x1e\x83\x89!W\x1d\xf7|\x00\xbe\x00\x00\u07d4;\xbc\x13\xd0J\xcc\xc0pz\xeb\u072e\xf0\x87\u0438~\v^\u327e\xd1\xd0&=\x9f\x00\x00\x00\u07d4;\xc6\xe3\xeezV\u038f\x14\xa3u2Y\x0fcqk\x99f\xe8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\xc8]ls[\x9c\xdaK\xba_H\xb2K\x13\xe7\x0600{\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4;\xd6$\xb5H\xcbe\x976\x90~\u062a<\fp^$\xb5u\x89lk\x93[\x8b\xbd@\x00\x00\u07d4;\u0660m\x1b\xd3lN\xdd'\xfc\r\x1f[\b\x8d\xda\xe3\xc7*\x89\x1b\x1azB\v\xa0\r\x00\x00\u0794;\u077c\x814\xf7}UY\u007f\xc9|&\xd2f\x98\t\x06\x04\ub23e -j\x0e\xda\x00\x00\xe0\x94;\xf8n\u0623\x15>\xc93xj\x02\xac\t\x03\x01\x85^Wk\x8a_J\x8c\x83u\xd1U@\x00\x00\u07d4;\xfb\u04c4|\x17\xa6\x1c\xf3\xf1{R\xf8\ub879`\xb3\U000df262\xa1]\tQ\x9b\xe0\x00\x00\u07d4<\x03\xbb\xc0#\xe1\xe9?\xa3\xa3\xa6\xe4(\xcf\f\xd8\xf9^\x1e\u0189Rf<\u02b1\xe1\xc0\x00\x00\u07d4<\f=\ufb1c\xeaz\xcc1\x9a\x96\xc3\v\x8e\x1f\xed\xabEt\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4<\x15\xb3Q\x1d\xf6\xf04.sH\u0309\xaf9\xa1h\xb7s\x0f\x8965\u026d\xc5\u07a0\x00\x00\u07d4<\x1f\x91\xf3\x01\xf4\xb5e\xbc\xa2GQ\xaa\x1fv\x13\"p\x9d\u0749a\t=|,m8\x00\x00\xe0\x94<(l\xfb0\x14n_\u05d0\xc2\xc8T\x15RW\x8d\xe34\u060a\x02)\x1b\x11\xaa0n\x8c\x00\x00\u07d4<2.a\x1f\u06c2\rG\xc6\xf8\xfcd\xb6\xfa\xd7L\xa9_^\x89\r%\x8e\xce\x1b\x13\x15\x00\x00\u07d4\xa5\xe5\xbfb\xbb\u0309\x05V\xf6L\x1f\xe7\xfa\x00\x00\u07d4<\x86\x9c\tie#\xce\xd8$\xa0pAF\x05\xbbv#\x1f\xf2\x8965\u026d\xc5\u07a0\x00\x00\u07d4<\x92V\x19\u02731DF?\x057\u06165\x87\x06\xc5 \xb0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4<\x98YK\xf6\x8bW5\x1e\x88\x14\xae\x9em\xfd-%J\xa0o\x89\x10CV\x1a\x88)0\x00\x00\u07d4<\xad\xeb=>\xed?b1\x1dRU>p\xdfJ\xfc\xe5o#\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94<\xae\xdbS\x19\xfe\x80eC\xc5nP!\xd3r\xf7\x1b\xe9\x06.\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4<\xaf\xaf^bPV\x15\x06\x8a\xf8\xeb\"\xa1:\u0629\xe5Pp\x89lf\x06E\xaaG\x18\x00\x00\u07d4<\xb1y\xcbH\x01\xa9\x9b\x95\u00f0\xc3$\xa2\xbd\xc1\x01\xa6S`\x89\x01h\u048e?\x00(\x00\x00\u07d4<\xb5a\u0386BK5\x98\x91\xe3d\xec\x92_\xfe\xff'}\xf7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4<\xcbq\xaah\x80\xcb\v\x84\x01-\x90\xe6\a@\xec\x06\xac\u05cf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4<\xce\xf8\x86yW9G\xe9I\x97y\x8a\x1e2~\b`:e\x89+\xc9\x16\u059f;\x02\x00\x00\xe0\x94<\xd1\xd9s\x1b\xd5H\xc1\xddo\u03a6\x1b\xebu\xd9\x17T\xf7\u04ca\x01\x16\x1d\x01\xb2\x15\xca\xe4\x80\x00\u07d4<\u04e6\xe95y\xc5mIAq\xfcS>z\x90\xe6\xf5\x94d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4<\u05b7Y<\xbe\xe7x0\xa8\xb1\x9d\b\x01\x95\x8f\xcdK\xc5z\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4<\xd7\xf7\xc7\xc257\x80\xcd\xe0\x81\xee\xecE\x82+%\xf2\x86\f\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4<\xe1\u0717\xfc\u05f7\xc4\u04e1\x8aI\xd6\xf2\xa5\xc1\xb1\xa9\x06\u05c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4<\xea0*G*\x94\x03y\xdd9\x8a$\xea\xfd\xba\u07c8\xady\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94<\xec\xa9k\xb1\xcd\xc2\x14\x02\x9c\xbc^\x18\x1d9\x8a\xb9M=A\x8a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4<\xf4\x84RO\xbd\xfa\xda\xe2m\xc1\x85\xe3++c\x0f\xd2\xe7&\x89\x18TR\xcb*\x91\xc3\x00\x00\u07d4<\xf9\xa1\xd4e\xe7\x8bp9\xe3iDx\xe2b{6\xfc\xd1A\x89J`S*\xd5\x1b\xf0\x00\x00\u07d4<\xfb\xf0fVYpc\x9e\x13\r\xf2\xa7\xd1k\x0e\x14\xd6\t\x1c\x89\\(=A\x03\x94\x10\x00\x00\xe0\x94=\th\x8d\x93\xad\a\xf3\xab\xe6\x8cr'#\xcdh\t\x90C^\x8a\x06ZL\xe9\x9fv\x9en\x00\x00\u07d4=1X{_\u0546\x98Ex\x87%\xa6c)\nI\xd3g\x8c\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4=?\xadI\xc9\xe5\xd2u\x9c\x8e\x8eZzM`\xa0\xdd\x13V\x92\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4=WO\xcf\x00\xfa\xe1\u064c\u023f\x9d\u07e1\xb3\x95;\x97A\xbc\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4=Z\x8b+\x80\xbe\x8b5\xd8\xec\xf7\x89\xb5\xedz\au\xc5\al\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4=f\xcdK\xd6M\\\x8c\x1b^\xea(\x1e\x10m\x1cZ\xad#s\x89i\xc4\xf3\xa8\xa1\x10\xa6\x00\x00\u0794=j\xe0S\xfc\xbc1\x8do\xd0\xfb\xc3S\xb8\xbfT.h\r'\x88\xc6s\xce<@\x16\x00\x00\u07d4=o\xf8,\x93w\x05\x9f\xb3\r\x92\x15r?`\xc7u\u0211\xfe\x89\r\x8e\\\xe6\x17\xf2\xd5\x00\x00\u07d4=y\xa8S\xd7\x1b\xe0b\x1bD\xe2\x97Yel\xa0u\xfd\xf4\t\x89lk\x93[\x8b\xbd@\x00\x00\u07d4=~\xa5\xbf\x03R\x81\x00\xed\x8a\xf8\xae\xd2e>\x92\x1bng%\x8965\u026d\xc5\u07a0\x00\x00\u07d4=\x81?\xf2\xb6\xedW\xb97\u06bf+8\x1d\x14\x8aA\x1f\xa0\x85\x89\x05k\xc7^-c\x10\x00\x00\u07d4=\x88\x143\xf0J}\r'\xf8ID\xe0\x8aQ-\xa3UR\x87\x89A\rXj \xa4\xc0\x00\x00\u07d4=\x89\xe5\x05\xcbF\xe2\x11\xa5?2\xf1g\xa8w\xbe\xc8\u007fK\n\x89\x01[5W\xf1\x93\u007f\x80\x00\xe0\x94=\x8d\a#r\x1es\xa6\xc0\xd8`\xaa\x05W\xab\xd1L\x1e\xe3b\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4=\x8f9\x88\x1b\x9e\xdf\xe9\x12'\xc3?\xa4\xcd\xd9\x1eg\x85D\xb0\x89\x04\xab\a\xbaC\xad\xa9\x80\x00\u07d4=\x9dk\xe5\u007f\xf8>\x06Y\x85fO\x12VD\x83\xf2\xe6\x00\xb2\x89n\xac\xe4?#\xbd\x80\x00\x00\u07d4=\xa3\x9c\xe3\xefJz9f\xb3.\xe7\xeaN\xbc#5\xa8\xf1\x1f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4=\xaa\x01\u03b7\x0e\xaf\x95\x91\xfaR\x1b\xa4\xa2~\xa9\xfb\x8e\xdeJ\x89Zc\xd2\u027cvT\x00\x00\u07d4=\xb5\xfejh\xbd6\x12\xac\x15\xa9\x9aa\xe5U\x92\x8e\xec\xea\xf3\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4=\xb9\xed\u007f\x02L~&7/\xea\xcf+\x05\b\x03D^8\x10\x89E\xb1H\xb4\x99j0\x00\x00\u07d4=\xbf\r\xbf\xd7x\x90\x80\x053\xf0\x9d\xea\x83\x01\xb9\xf0%\u04a6\x8965\u026d\xc5\u07a0\x00\x00\u07d4=\xce\U0005c18b\x15\xd3N\xdaBn\xc7\xe0K\x18\xb6\x01p\x02\x89lh\xcc\u041b\x02,\x00\x00\xe0\x94=\xd1.Uj`76\xfe\xbaJo\xa8\xbdJ\xc4]f*\x04\x8a#u{\x91\x83\xe0x(\x00\x00\u07d4=\u078b\x15\xb3\u033a\xa5x\x01\x12\xc3\xd6t\xf3\x13\xbb\xa6\x80&\x89`\x1dQZ>O\x94\x00\x00\xe0\x94=\xde\xdb\xe4\x89#\xfb\xf9\xe56\xbf\x9f\xfb\aG\xc9\xcd\u04de\xef\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4=\xea\xe43'\x91?b\x80\x8f\xaa\x1bbv\xa2\xbdch\xea\u0649lk\x93[\x8b\xbd@\x00\x00\u07d4=\xf7b\x04\x9e\u068a\u0192}\x90Lz\xf4/\x94\xe5Q\x96\x01\x89lk\x93[\x8b\xbd@\x00\x00\u07d4>\x04\r@\u02c0\xba\x01%\xf3\xb1_\xde\xfc\xc8?0\x05\xda\x1b\x898E$\xccp\xb7x\x00\x00\u07d4>\v\x8e\xd8n\xd6i\xe1'#\xafur\xfb\xac\xfe\x82\x9b\x1e\x16\x89QM\xe7\xf9\xb8\x12\xdc\x00\x00\xe0\x94>\f\xbejm\xcba\xf1\x10\xc4[\xa2\xaa6\x1d\u007f\xca\xd3\xdas\x8a\x01\xb2\u07dd!\x9fW\x98\x00\x00\u07d4>\x19KN\xce\xf8\xbbq\x1e\xa2\xff$\xfe\xc4\xe8{\xd02\xf7\u0449\x8b\x9d\xc1\xbc\x1a\x03j\x80\x00\xe0\x94>\x1b\"0\xaf\xbb\xd3\x10\xb4\x92jLwmZ\u705cf\x1d\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4>\x1cS0\x0eL\x16\x89\x12\x16<~\x99\xb9]\xa2h\xad(\n\x896b2\\\u044f\xe0\x00\x00\u07d4>\x1c\x96 c\xe0\xd5)YA\xf2\x10\u0723\xabS\x1e\xec\x88\t\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4>,\xa0\xd24\xba\xf6\a\xadFj\x1b\x85\xf4\xa6H\x8e\xf0\n\xe7\x89\x04\xda!\xa3H=V\x80\x00\u07d4>/&#^\x13zs$\xe4\xdc\x15K]\xf5\xafF\xea\x1aI\x89\x017\xaa\xd8\x03-\xb9\x00\x00\xe0\x94>1a\xf1\xea/\xbf\x12ny\xda\x18\x01\u0695\x12\xb3y\x88\u024a\nm\xd9\f\xaeQ\x14H\x00\x00\xe0\x94>6\xc1rS\xc1\x1c\xf3\x89t\xed\r\xb1\xb7Y\x16\r\xa67\x83\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4><\u04fe\xc0e\x91\xd64o%Kb\x1e\xb4\x1c\x89\x00\x8d1\x895\u07fe\u069f74\x00\x00\u07d4>E\xbdU\u06d0`\xec\xed\x92;\xb9\xcbs<\xb3W?\xb51\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4>M\x13\xc5Z\x84\xe4n\xd7\xe9\u02d0\xfd5^\x8a\u0651\u33c965\u026d\xc5\u07a0\x00\x00\u07d4>N\x92e\"<\x9782L\xf2\v\xd0`\x06\xd0\a>\u06cc\x89\a?u\u0460\x85\xba\x00\x00\xe0\x94>O\xbdf\x10\x15\xf6F\x1e\xd6s\\\xef\xef\x01\xf3\x14E\xde:\x8a\x03n4)\x98\xb8\xb0 \x00\x00\xe0\x94>S\xff!\a\xa8\u07be3(I:\x92\xa5\x86\xa7\xe1\xf4\x97X\x8a\x04\xe6\x9c*q\xa4\x05\xab\x00\x00\u07d4>Z9\xfd\xdap\xdf\x11&\xab\r\u011asx1\x1aSz\x1f\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\xe0\x94>Z\xbd\t\xceZ\xf7\xba\x84\x87\xc3Y\xe0\xf2\xa9:\x98k\v\x18\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4>\\\xb8\x92\x8cAx%\xc0:;\xfc\xc5!\x83\xe5\xc9\x1eB\u05c9\xe71\xd9\xc5,\x96/\x00\x00\u07d4>^\x93\xfbL\x9c\x9d\x12F\xf8\xf2G5\x8e\"\xc3\xc5\xd1{j\x89\b!\xab\rD\x14\x98\x00\x00\u07d4>a\x83P\xfa\x01ez\xb0\xef>\xba\xc8\xe3p\x12\xf8\xfc+o\x89\x98\x06\xde=\xa6\xe9x\x00\x00\u07d4>c\xce;$\xca(e\xb4\u0166\x87\xb7\xae\xa3Y~\xf6\xe5H\x89lk\x93[\x8b\xbd@\x00\x00\u07d4>f\xb8GiVj\xb6yE\xd5\xfa\x8175V\xbc\u00e1\xfa\x89\b=lz\xabc`\x00\x00\xe0\x94>v\xa6-\xb1\x87\xaat\xf68\x17S;0l\xea\xd0\xe8\u03be\x8a\x06\x9bZ\xfa\xc7P\xbb\x80\x00\x00\u07d4>z\x96k]\xc3W\xff\xb0~\x9f\xe0g\xc4W\x91\xfd\x8e0I\x89\x034-`\xdf\xf1\x96\x00\x00\xe0\x94>\x81w!u#~\xb4\xcb\xe0\xfe-\xca\xfd\xad\xff\xebj\x19\x99\x8a\x01\xdd\f\x88_\x9a\r\x80\x00\x00\u07d4>\x83I\xb6\u007fWED\x9fe\x93g\u066dG\x12\xdb[\x89Z\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4>\x83TO\x00\x82U%r\u01c2\xbe\xe5\xd2\x18\xf1\xef\x06J\x9d\x89\x05l\xd5_\xc6M\xfe\x00\x00\u07d4>\x84\xb3\\[\"ePpa\xd3\vo\x12\xda\x03?\xe6\xf8\xb9\x89a\t=|,m8\x00\x00\u07d4>\x86A\xd4\x87E\xba2/_\xd6\xcbP\x12N\xc4f\x88\u01e6\x9a\u007f\xae\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\u07d4>\x91N0\x18\xac\x00D\x93A\u011d\xa7\x1d\x04\xdf\xee\xedb!\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4>\x94\x10\u04f9\xa8~\xd5\xe4Q\xa6\xb9\x1b\xb8\x92?\xe9\x0f\xb2\xb5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4>\x94\xdfS\x13\xfaR\x05p\xef#+\xc31\x1d_b/\xf1\x83\x89lk\x93[\x8b\xbd@\x00\x00\u0794>\x9b4\xa5\u007f3u\xaeY\xc0\xa7^\x19\u0136A\"\x8d\x97\x00\x88\xf8i\x93)g~\x00\x00\u07d4>\xad\xa8\xc9/V\x06~\x1b\xb7<\xe3x\xdaV\xdc,\xdf\xd3e\x89w\xcd\xe9:\xeb\rH\x00\x00\xe0\x94>\xaf\by\xb5\xb6\xdb\x15\x9bX\x9f\x84W\x8bjt\xf6\xc1\x03W\x8a\x01\x898\xb6q\xfae\xa2\x80\x00\u07d4>\xaf1k\x87a]\x88\xf7\xad\xc7|X\xe7\x12\xedMw\x96k\x89\x05m\xbcL\xee$d\x80\x00\u07d4>\xb8\xb3;!\xd2<\u0686\xd8(\x88\x84\xabG\x0e\x16F\x91\xb5\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4>\xb9\xef\x06\xd0\xc2Y\x04\x03\x19\x94~\x8czh\x12\xaa\x02S\u0609\t\r\x97/22<\x00\x00\u07d4>\u030e\x16h\xdd\xe9\x95\xdcW\x0f\xe4\x14\xf4B\x11\xc54\xa6\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4>\u03752\xe3\x97W\x96b\xb2\xa4aA\u73c25\x93j_\x89\x03\x9f\xba\xe8\xd0B\xdd\x00\x00\u07d4>\xeeo\x1e\x966\vv\x89\xb3\x06\x9a\xda\xf9\xaf\x8e\xb6\f\u404965\u026d\xc5\u07a0\x00\x00\xe0\x94?\b\u066d\x89O\x81>\x8e!H\xc1`\xd2K5:\x8et\xb0\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4?\f\x83\xaa\xc5qybsN\\\xea\xea\xec\u04db(\xad\x06\xbe\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94?\x10\x80\x02\x82\u0477\xdd\u01cf\xa9-\x820\aN\x1b\xf6\xae\xae\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\u07d4?\x123qO M\xe9\xdeN\xe9m\a;6\x8d\x81\x97\x98\x9f\x89\x02\x17\xc4\x10t\xe6\xbb\x00\x00\u07d4?\x17:\xa6\xed\xf4i\u0445\xe5\x9b\xd2j\xe4#k\x92\xb4\xd8\xe1\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4?\x1b\xc4 \xc5<\x00,\x9e\x90\x03|D\xfej\x8e\xf4\xdd\xc9b\x89\t`\xdbwh\x1e\x94\x00\x00\u07d4?#a\b\xee\xc7\"\x89\xba\u00e6\\\u0483\xf9^\x04\x1d\x14L\x8964\xbf9\xab\x98x\x80\x00\u07d4?-\xa0\x93\xbb\x16\xeb\x06O\x8b\xfa\x9e0\xb9)\xd1_\x8e\x1cL\x89lk\x93[\x8b\xbd@\x00\x00\u07d4?-\xd5]\xb7\xea\xb0\xeb\xeee\xb3>\xd8 ,\x1e\x99.\x95\x8b\x89,s\xc97t,P\x00\x00\u07d4?/8\x14\x91y|\xc5\xc0\u0502\x96\xc1O\xd0\xcd\x00\xcd\xfa-\x89+\x95\xbd\xcc9\xb6\x10\x00\x00\u07d4?0\u04fc\x9f`\"2\xbcrB\x88\xcaF\xcd\v\a\x88\xf7\x15\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4?<\x8ea\xe5`L\xef\x06\x05\xd46\xdd\"\xac\u0346\"\x17\xfc\x89Hz\x9a0E9D\x00\x00\u07d4??F\xb7\\\xab\xe3{\xfa\u0307`(\x1fCA\xca\u007fF=\x89 \xacD\x825\xfa\xe8\x80\x00\u07d4?G)c\x19x\x83\xbb\xdaZ\x9b}\xfc\xb2-\xb1\x14@\xad1\x89\x1a\x19d<\xb1\xef\xf0\x80\x00\u07d4?L\xd19\x9f\x8a4\xed\u06da\x17\xa4q\xfc\x92+Xp\xaa\xfc\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4?U\x1b\xa9<\xd5F\x93\xc1\x83\xfb\x9a\xd6\re\xe1`\x96s\u0249lk\x93[\x8b\xbd@\x00\x00\xe0\x94?bzv\x9ej\x95\x0e\xb8p\x17\xa7\u035c\xa2\bq\x13h1\x8a\x02\ub3b1\xa1r\u0738\x00\x00\u07d4?m\xd3e\x0e\xe4(\u0737u\x95S\xb0\x17\xa9j\x94(j\u0249Hz\x9a0E9D\x00\x00\u07d4?tr7\x80o\xed?\x82\x8ahR\xeb\bg\xf7\x90'\xaf\x89\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4?u\xaea\xcc\x1d\x80Be;[\xae\xc4D>\x05\x1c^z\xbd\x89\x05-T(\x04\xf1\xce\x00\x00\u07d4?\xb7\u0457\xb3\xbaO\xe0E\xef\xc2=P\xa1E\x85\xf5X\u0672\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94?\xbc\x1eE\x18\xd74\x00\xc6\xd0F5\x949\xfbh\xea\x1aI\xf4\x8a\x03y\v\xb8U\x13v@\x00\x00\u07d4?\xbe\xd6\xe7\xe0\u029c\x84\xfb\xe9\xeb\u03ddN\xf9\xbbIB\x81e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4?\u043bGy\x8c\xf4L\u07feM3=\xe67\xdfJ\x00\xe4\\\x89\x05lUy\xf7\"\x14\x00\x00\xe0\x94?\xe4\x0f\xbd\x91\x9a\xad(\x18\xdf\x01\xeeM\xf4lF\x84*\xc59\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4?\xe8\x01\xe6\x135\xc5\x14\r\xc7\xed\xa2\xefR\x04F\nP\x120\x89lk\x93[\x8b\xbd@\x00\x00\u07d4?\xf86\xb6\xf5{\x90\x1bD\f0\xe4\xdb\xd0e\xcf7\xd3\u050c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4?\xfc\xb8p\xd4\x02=%]Qg\u0625\a\xce\xfc6kh\xba\x89#4^\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4@s\xfaI\xb8q\x17\u02d0\x8c\xf1\xabQ-\xa7T\xa92\xd4w\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4@\x8ai\xa4\a\x15\xe1\xb3\x13\xe15N`\b\x00\xa1\xe6\xdc\x02\xa5\x89\x01\u7e11\u0312T\x00\x00\u07d4@\x9b\xd7P\x85\x82\x1c\x1d\xe7\f\xdc;\x11\xff\xc3\xd9#\xc7@\x10\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4@\x9dZ\x96.\xde\uefa1x\x01\x8c\x0f8\xb9\u0372\x13\xf2\x89\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4@\xa31\x19[\x97s%\u00aa(\xfa/B\xcb%\xec<%<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4@\xa7\xf7(g\xa7\u0706w\v\x16+uW\xa44\xedP\xcc\xe9\x8965\u026d\xc5\u07a0\x00\x00\u07d4@\xab\n>\x83\xd0\u022c\x93f\x91\x05 \xea\xb1w+\xac;\x1a\x894\xf1\f-\xc0^|\x00\x00\u07d4@\xabf\xfe!>\xa5l:\xfb\x12\xc7[\xe3?\x8e2\xfd\b]\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94@\xadt\xbc\v\xce*E\xe5/6\xc3\u07bb\x1b:\xda\x1bv\x19\x8a\x01p\x16-\xe1\t\xc6X\x00\x00\u07d4@\u03c9\x05\x91\xea\u484f\x81*)T\xcb)_c3'\xe6\x89\x02\x9b\xf76\xfcY\x1a\x00\x00\u07d4@\u03d0\xef[v\x8c]\xa5\x85\x00,\xcb\xe6avP\xd8\xe87\x8963\x03\"\xd5#\x8c\x00\x00\xe0\x94@\xd4]\x9dv%\xd1QV\xc92\xb7q\xca{\x05'\x13\tX\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4@\xdb\x1b\xa5\x85\xce4S\x1e\xde\xc5IHI9\x13\x81\xe6\xcc\u04c9a\t=|,m8\x00\x00\xe0\x94@\xdfI^\xcf?\x8bL\xef*l\x18\x99W$\x8f\u813c+\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4@\xe0\xdb\xf3\xef\uf404\xea\x1c\xd7\xe5\x03\xf4\v;J\x84C\xf6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4@\xe2D\n\xe1B\u02006j\x12\xc6\xd4\x10/K\x844\xb6*\x8965\u026d\xc5\u07a0\x00\x00\u07d4@\xe3\u0083\xf7\xe2M\xe0A\f\x12\x1b\xee`\xa5`\u007f>)\xa6\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94@\xeaPD\xb2\x04\xb20v\xb1\xa5\x80;\xf1\xd3\f\x0f\x88\x87\x1a\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\xe0\x94@\xed\xdbD\x8di\x0e\xd7.\x05\xc2%\xd3O\xc85\x0f\xa1\xe4\u014a\x01{x\x83\xc0i\x16`\x00\x00\xe0\x94@\xf4\xf4\xc0ls,\xd3[\x11\x9b\x89;\x12~}\x9d\aq\xe4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4A\x01\x0f\u023a\xf8C}\x17\xa0Ci\x80\x9a\x16\x8a\x17\xcaV\xfb\x89\x05k\xc7^-c\x10\x00\x00\u07d4A\x03)\x96q\xd4gc\x97\x8f\xa4\xaa\x19\xee4\xb1\xfc\x95'\x84\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4A\x03<\x1bm\x05\xe1\u0289\xb0\x94\x8f\xc6DS\xfb\xe8z\xb2^\x89Hz\x9a0E9D\x00\x00\u07d4A\t\x8a\x81E#\x17\xc1\x9e>\xef\v\xd1#\xbb\xe1x\xe9\xe9\u0289\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4A\x16\x10\xb1x\xd5a}\xfa\xb94\u0493\xf5\x12\xa9>\\\x10\xe1\x89\t79SM(h\x00\x00\u07d4A\x1c\x83\x1c\xc6\xf4O\x19e\xecWW\xabN[<\xa4\xcf\xfd\x1f\x89\x17\n\x0fP@\xe5\x04\x00\x00\xe0\x94A*h\xf6\xc6EU\x9c\xc9w\xfcId\x04z \x1d\x1b\xb0\xe2\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4A?K\x02f\x9c\xcf\xf6\x80k\xc8&\xfc\xb7\xde\xca;\x0e\xa9\xbc\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4AE\x99\t.\x87\x9a\xe2Sr\xa8MsZ\xf5\xc4\xe5\x10\xcdm\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4AHV\x12\xd04F\xecL\x05\xe5$NV?\x1c\xba\xe0\xf1\x97\x894\x95tD\xb8@\xe8\x00\x00\u07d4A]\tj\xb0b\x93\x18?<\x03=%\xf6\xcfqx\xac;\u01c9\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4Af\xfc\b\u0285\xf7f\xfd\xe81F\x0e\x9d\xc9<\x0e!\xaal\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94Ag\x84\xaf`\x960\xb0p\u051a\x8b\xcd\x12#\\d(\xa4\b\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4Ag\xcdH\xe73A\x8e\x8f\x99\xff\xd14\x12\x1cJJ\xb2x\u0109\xc5S%\xcat\x15\xe0\x00\x00\u07d4Al\x86\xb7 \x83\xd1\xf8\x90}\x84\xef\xd2\xd2\u05c3\xdf\xfa>\xfb\x89lj\xccg\u05f1\xd4\x00\x00\u07d4AsA\x9d\\\x9fc)U\x1d\xc4\xd3\xd0\u03ac\x1bp\x1b\x86\x9e\x89\x04\xc5>\xcd\xc1\x8a`\x00\x00\u07d4At\xfa\x1b\xc1*;q\x83\u02eb\xb7z\vYU{\xa5\xf1\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4Axj\x10\xd4G\xf4\x84\xd32D\u0337\xfa\u034bB{[\x8c\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94Az<\u0454\x96S\nmB\x04\u00f5\xa1|\xe0\xf2\a\xb1\xa5\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4A~N&\x88\xb1\xfdf\xd8!R\x9eF\xedOB\xf8\xb3\xdb=\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94A\x9aq\xa3l\x11\xd1\x05\xe0\xf2\xae\xf5\xa3\xe5\x98\a\x8e\x85\xc8\v\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94A\x9b\xdes\x16\xcc\x1e\u0495\u0205\xac\xe3B\u01db\xf7\xee3\xea\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4A\xa2\xf2\xe6\xec\xb8c\x94\xec\x0e3\x8c\x0f\xc9~\x9cU\x83\xde\u0489l\xee\x06\u077e\x15\xec\x00\x00\u07d4A\xa8\u0083\x00\x81\xb1\x02\xdfn\x011e|\a\xabc[T\u0389lj\xccg\u05f1\xd4\x00\x00\u07d4A\xa8\xe26\xa3\x0emc\xc1\xffdM\x13*\xa2\\\x89S~\x01\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4A\xa9\xa4\x04\xfc\x9f[\xfe\xe4\x8e\xc2e\xb1%#3\x8e)\xa8\xbf\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4A\xad6\x9fu\x8f\xef8\xa1\x9a\xa3\x14\x93y\x83,\x81\x8e\xf2\xa0\x8966\x9e\xd7t}&\x00\x00\u07d4A\xb2\xd3O\xde\v\x10)&+Ar\xc8\x1c\x15\x90@[\x03\xae\x8965\u026d\xc5\u07a0\x00\x00\u07d4A\xb2\xdb\u05dd\u069b\x86Ojp0'T\x19\u00dd>\xfd;\x89\xadx\xeb\u016cb\x00\x00\x00\u07d4A\xc3\xc26u4\xd1;\xa2\xb3?\x18\\\xdb\xe6\xacC\xc2\xfa1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4A\u02d8\x96D_p\xa1\n\x14!R\x96\xda\xf6\x14\xe3,\xf4\u0549g\x8a\x93 b\xe4\x18\x00\x00\u07d4A\xcey\x95\t5\xcf\xf5[\xf7\x8eL\xce\xc2\xfec\x17\x85\u06d5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4A\u04f71\xa3&\xe7hX\xba\xa5\xf4\xbd\x89\xb5{6\x93#C\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\xe0\x94A\xe4\xa2\x02u\xe3\x9b\xdc\xef\xebe\\\x03\"tKvQ@\u008a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4A\xed-\x8ep\x81H,\x91\x9f\xc2=\x8f\x00\x91\xb3\xc8,F\x85\x89F:\x1ev[\u05ca\x00\x00\xe0\x94A\xf2~tK\u049d\xe2\xb0Y\x8f\x02\xa0\xbb\x9f\x98\xe6\x81\ua90a\x01\xa4\xab\xa2%\xc2\a@\x00\x00\u07d4A\xf4\x89\xa1\xect{\u009c>_\x9d\x8d\xb9xw\xd4\u0474\xe9\x89\a?u\u0460\x85\xba\x00\x00\u07d4B\x0f\xb8n}+Q@\x1f\xc5\xe8\xc7 \x15\xde\xcbN\xf8\xfc.\x8965\u026d\xc5\u07a0\x00\x00\u07d4B\x16\x84\xba\xa9\xc0\xb4\xb5\xf5S8\xe6\xf6\xe7\xc8\xe1F\xd4\x1c\xb7\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4B9\x96Y\xac\xa6\xa5\xa8c\xea\"E\xc93\xfe\x9a5\xb7\x88\x0e\x89n\xce2\xc2l\x82p\x00\x00\xe0\x94B;\xcaG\xab\xc0\fpW\xe3\xad4\xfc\xa6>7_\xbd\x8bJ\x8a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\u07d4B<1\a\xf4\xba\xceANI\x9cd9\nQ\xf7F\x15\xca^\x89lk\x93[\x8b\xbd@\x00\x00\u07d4B<\xc4YL\xf4\xab\xb66\x8d\xe5\x9f\u04b1#\a4a!C\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94BD\xf13\x11X\xb9\xce&\xbb\xe0\xb9#k\x92\x03\xca5\x144\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794BQw\xebt\xad\n\x9d\x9aWR\"\x81G\xeemcV\xa6\u6239\x8b\xc8)\xa6\xf9\x00\x00\u07d4BW%\xc0\xf0\x8f\b\x11\xf5\xf0\x06\xee\xc9\x1c\\\\\x12k\x12\xae\x89\b!\xab\rD\x14\x98\x00\x00\xe0\x94BX\xfdf/\xc4\xce2\x95\xf0\xd4\xed\x8f{\xb1D\x96\x00\xa0\xa9\x8a\x01lE.\xd6\b\x8a\xd8\x00\x00\xe0\x94B\\\x18\x16\x86\x8fww\xcc+\xa6\xc6\u048c\x9e\x1eylR\xb3\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4B\\3\x8a\x13%\xe3\xa1W\x8e\xfa)\x9eW\u0646\xebGO\x81\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94BbY\xb0\xa7Vp\x1a\x8bf5(R!V\xc0(\x8f\x0f$\x8a\x02\x18\xae\x19k\x8dO0\x00\x00\u07d4Bm\x15\xf4\a\xa0\x115\xb1:kr\xf8\xf2R\v51\xe3\x02\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4Box\xf7\r\xb2Y\xac\x854\x14[)4\xf4\xef\x10\x98\xb5\u0609\x13\x84\x00\xec\xa3d\xa0\x00\x00\u07d4Bs-\x8e\xf4\x9f\xfd\xa0K\x19x\x0f\xd3\xc1\x84i\xfb7A\x06\x89\x17\v\x00\xe5\u4a7e\x00\x00\u07d4Bt\x17\xbd\x16\xb1\xb3\xd2-\xbb\x90-\x8f\x96W\x01o$\xa6\x1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Btj\xee\xa1O'\xbe\xff\f\r\xa6BS\xf1\xe7\x97\x18\x90\xa0\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4B{F*\xb8NP\x91\xf4\x8aF\xeb\f\u0712\xdd\xcb&\xe0x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4B~GQ\u00fa\xbex\xcf\xf8\x83\b\x86\xfe\xbc\x10\xf9\x90\x8dt\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94B~\xc6h\xac\x94\x04\xe8\x95\u0306\x15\x11\xd1b\nI\x12\xbe\x98\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4B\x80\xa5\x8f\x8b\xb1\v\x94@\u0794\xf4+OY! \x82\x01\x91\x89lk\x93[\x8b\xbd@\x00\x00\u07d4B\x8a\x1e\xe0\xed3\x1dyR\u033e\x1cyt\xb2\x85+\u0453\x8a\x89w\xb7JN\x8d\xe5e\x00\x00\u0794B\x9c\x06\xb4\x87\xe8Tj\xbd\xfc\x95\x8a%\xa3\xf0\xfb\xa5?o\x00\x88\xbbdJ\xf5B\x19\x80\x00\xe0\x94B\xa9\x8b\xf1`'\xceX\x9cN\xd2\xc9X1\xe2rB\x05\x06N\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4B\xc6\xed\xc5\x15\xd3UW\x80\x8d\x13\xcdD\xdc\xc4@\v%\x04\xe4\x89\n\xba\x14\u015b\xa72\x00\x00\u07d4B\xce\xcf\u0492\x10y\xc2\xd7\xdf?\b\xb0z\xa3\xbe\xee^!\x9a\x8965\u026d\xc5\u07a0\x00\x00\u07d4B\u04669\x9b0\x16\xa8Y\u007f\x8bd\t'\xb8\xaf\xbc\xe4\xb2\x15\x89\xa1\x8b\xce\xc3H\x88\x10\x00\x00\u07d4B\xd3I@\xed\xd2\xe7\x00]F\xe2\x18\x8eL\xfe\u0383\x11\xd7M\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4B\u04e5\xa9\x01\xf2\xf6\xbd\x93V\xf1\x12\xa7\x01\x80\xe5\xa1U\v`\x892$\xf4'#\xd4T\x00\x00\u07d4B\u05b2c\xd9\xe9\xf4\x11lA\x14$\xfc\x99Ux;\xa1\xc5\x1b\x81\x0f\xc4g\u057aM\xeaB\xf7\xa9\x88^i\x8a\bxg\x83&\xea\xc9\x00\x00\x00\xe0\x94C>\xb9J3\x90\x86\xed\x12\u067d\xe9\xcd\x1dE\x86\x03\xc9}\u058a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4CI\"Zb\xf7\n\xeaH\n\x02\x99\x15\xa0\x1eSy\xe6O\xa5\x89\x8c\xd6~#4\xc0\xd8\x00\x00\u07d4CT\"\x1eb\xdc\t\xe6@d6\x16:\x18^\xf0m\x11J\x81\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94CTC\xb8\x1d\xfd\xb9\xbd\x8cg\x87\xbc%\x18\xe2\xd4~W\xc1_\x8a\x01C\x8d\x93\x97\x88\x1e\xf2\x00\x00\u07d4Ca\u0504o\xaf\xb3w\xb6\xc0\xeeI\xa5\x96\xa7\x8d\xdf5\x16\xa3\x89\xc2\x12z\xf8X\xdap\x00\x00\xe0\x94Cd0\x9a\x9f\xa0p\x95`\x0fy\xed\xc6Q \xcd\xcd#\xdcd\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4Cg\xaeK\f\xe9d\xf4\xa5J\xfdK\\6\x84\x96\xdb\x16\x9e\x9a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Ct\x89(\xe8\xc3\xecD6\xa1\u0412\xfb\xe4:\xc7I\xbe\x12Q\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4Cv{\xf7\xfd*\xf9[r\xe91-\xa9D<\xb1h\x8eCC\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94Cy\x838\x8a\xb5\x9aO\xfc!_\x8e\x82iF\x10)\xc3\xf1\xc1\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4C\x89\x8cI\xa3MP\x9b\xfe\xd4\xf7`A\xee\x91\xca\xf3\xaaj\xa5\x89\x10CV\x1a\x88)0\x00\x00\u07d4C\x8c/T\xff\x8eb\x9b\xab6\xb1D+v\v\x12\xa8\x8f\x02\xae\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\x98b\x8e\xa6c-9>\x92\x9c\xbd\x92\x84d\xc5h\xaaJ\f\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4C\x9d//Q\x10\xa4\u054b\x17W\x93P\x15@\x87@\xfe\xc7\xf8\x89\u03e5\xc5\x15\x0fL\x88\x80\x00\u07d4C\x9d\xee?vy\xff\x100s?\x93@\xc0\x96hkI9\v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\xb0y\xba\xf0ry\x99\xe6k\xf7C\u057c\xbfwl;\t\"\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\xbc-M\xdc\xd6X;\xe2\u01fc\tK(\xfbr\xe6+\xa8;\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\xc7\xeb\u0173\xe7\xaf\x16\xf4}\xc5az\xb1\x0e\x0f9\xb4\xaf\xbb\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4C\u02d6R\x81\x8coMg\x96\xb0\xe8\x94\t0ly\xdbcI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4C\xcc\b\xd0s*\xa5\x8a\xde\xf7a\x9b\xedFU\x8a\xd7wAs\x89\xf0\xe7\u0730\x12*\x8f\x00\x00\xe0\x94C\u0567\x1c\xe8\xb8\xf8\xae\x02\xb2\xea\xf8\xea\xf2\xca(@\xb9?\xb6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u0794C\xdb\u007f\xf9Z\bm(\ubff8/\xb8\xfb_#\n^\xbc\u0348\xdfn\xb0\xb2\xd3\xca\x00\x00\u07d4C\xe7\xec\x84cX\xd7\xd0\xf97\xad\x1c5\v\xa0i\u05ffr\xbf\x89\x06p\xaeb\x92\x14h\x00\x00\u07d4C\xf1o\x1eu\xc3\xc0j\x94x\xe8\u0157\xa4\n<\xb0\xbf\x04\u0309\x9d\xf7\u07e8\xf7`H\x00\x00\u07d4C\xf4p\xede\x9e)\x91\xc3u\x95~]\xde\u017d\x1d8\"1\x89\x05k\xc7^-c\x10\x00\x00\u07d4C\xf7\xe8n8\x1e\xc5\x1e\u0110m\x14v\u02e9z=\xb5\x84\xe4\x8965\u026d\xc5\u07a0\x00\x00\u07d4C\xff8t>\xd0\xcdC0\x8c\x06e\t\u030e~r\xc8b\xaa\x89i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94C\xff\x88S\xe9\x8e\xd8@k\x95\x00\n\u0684\x83b\u05a09*\x8a\x04\xae\v\x1cM.\x84\xd0\x00\x00\u07d4D\t\x88f\xa6\x9bh\xc0\xb6\xbc\x16\x82)\xb9`5\x87\x05\x89g\x89\n1\x06+\xee\xedp\x00\x00\u07d4D\x19\xaca\x8d]\xea|\xdc`w o\xb0}\xbd\xd7\x1c\x17\x02\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4D\x1aR\x00\x16a\xfa\xc7\x18\xb2\u05f3Q\xb7\xc6\xfbR\x1az\xfd\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94D\x1a\u0282c\x13$\xac\xbf\xa2F\x8b\xda2[\xbdxG{\xbf\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4D\x1f7\xe8\xa0)\xfd\x02H/(\x9cI\xb5\xd0m\x00\xe4\b\xa4\x89\x12\x11\xec\xb5m\x13H\x80\x00\u07d4D \xaa5F[\xe6\x17\xad$\x98\xf3p\xde\n<\xc4\xd20\xaf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4D#/\xf6m\xda\xd1\xfd\x84\x12f8\x006\xaf\xd7\xcf}\u007fB\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4D%\rGn\x06$\x84\xe9\b\n9g\xbf:Js*\xd7?\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4D)\xa2\x9f\xee\x19\x84Pg,\f\x1d\a1b%\v\xecdt\x896*\xaf\x82\x02\xf2P\x00\x00\u07d4D5RS\xb2wH\xe3\xf3O\xe9\xca\xe1\xfbq\x8c\x8f$\x95)\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4D8\xe8\x80\xcb'f\xb0\xc1\u03ae\xc9\xd2A\x8f\u03b9R\xa0D\x89\a?\xa0s\x90?\b\x00\x00\u07d4DL\xafy\xb7\x138\ue6a7\xc73\xb0*\u02a7\xdc\x02YH\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4D\\\xb8\xde^=\xf5 \xb4\x99\xef\u0240\xf5+\xff@\xf5\\v\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94Dj\x809\xce\u03dd\xceHy\xcb\xca\xf3I;\xf5E\xa8\x86\x10\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4Dt)\x9d\x0e\xe0\x90\u0710x\x9a\x14\x86H\x9c=\rd^m\x8965\u026d\xc5\u07a0\x00\x00\u07d4D\x8b\xf4\x10\xad\x9b\xbc/\xec\xc4P\x8d\x87\xa7\xfc.K\x85a\xad\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4D\x90\x1e\r\x0e\b\xac=^\x95\xb8\xec\x9d^\x0f\xf5\xf1.\x03\x93\x89\x16\xa1\xf9\xf5\xfd}\x96\x00\x00\xe0\x94D\x93\x12<\x02\x1e\xce;3\xb1\xa4R\xc9&\x8d\xe1@\a\xf9\u04ca\x01je\x02\xf1Z\x1eT\x00\x00\xe0\x94D\x9a\xc4\xfb\xe3\x83\xe3g8\x85^6JW\xf4q\xb2\xbf\xa11\x8a)\xb7d2\xb9DQ \x00\x00\u07d4D\xa0\x1f\xb0J\xc0\xdb,\xce]\xbe(\x1e\x1cF\xe2\x8b9\xd8x\x89lj\xccg\u05f1\xd4\x00\x00\u07d4D\xa6=\x18BE\x87\xb9\xb3\a\xbf\xc3\xc3d\xae\x10\xcd\x04\xc7\x13\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94D\xa8\x98\x9e20\x81!\xf7$f\x97\x8d\xb3\x95\xd1\xf7l:K\x8a\x01\x88P)\x9fB\xb0j\x00\x00\u07d4D\xc1\x11\v\x18\x87\x0e\xc8\x11x\xd9=!X8\xc5Q\u050ed\x89\n\xd6\xf9\x85\x93\xbd\x8f\x00\x00\u07d4D\xc1Ge\x12|\xde\x11\xfa\xb4l],\xf4\u0532\x89\x00#\xfd\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94D\xc5N\xaa\x8a\xc9@\xf9\xe8\x0f\x1et\xe8/\xc1O\x16v\x85j\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4D\xcdwSZ\x89?\xa7\xc4\xd5\xeb:$\x0ey\u0419\xa7--\x89,s\xc97t,P\x00\x00\u07d4D\u07faP\xb8)\xbe\xcc_O\x14\u0470J\xab3 \xa2\x95\xe5\x8965\u026d\xc5\u07a0\x00\x00\u07d4D\xe2\xfd\xc6y\xe6\xbe\xe0\x1e\x93\xefJ:\xb1\xbc\xce\x01*\xbc|\x89\x16=\x19I\x00\xc5E\x80\x00\xe0\x94D\xf6/*\xaa\xbc)\xad:k\x04\xe1\xffo\x9c\xe4R\xd1\xc1@\x8a\x03\x99\x92d\x8a#\u0220\x00\x00\u07d4D\xff\xf3{\xe0\x1a8\x88\u04f8\xb8\u1200\xa7\xdd\xef\xee\xea\u04c9\x0e\f[\xfc}\xae\x9a\x80\x00\u07d4E\x06\xfe\x19\xfaK\x00k\xaa9\x84R\x9d\x85\x16\xdb++P\xab\x89lk\x93[\x8b\xbd@\x00\x00\u07d4E\x1b6\x99G[\xed]y\x05\xf8\x90Z\xa3Eo\x1e\u05c8\xfc\x89\x8a\xc7#\x04\x89\xe8\x00\x00\x00\u0794E\x1bpp%\x9b\u06e2q\x00\xe3n#B\x8aS\xdf\xe3\x04\u9239\x8b\xc8)\xa6\xf9\x00\x00\u07d4E'+\x8fb\xe9\xf9\xfa\x8c\xe0D \u1ba3\xeb\xa9hn\xac\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94E+d\u06ce\xf7\xd6\u07c7\u01c8c\x9c\"\x90\xbe\x84\x82\xd5u\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4E>5\x9a3\x97\x94LZ'Z\xb1\xa2\xf7\n^Z?i\x89\x89\r\x02\xabHl\xed\xc0\x00\x00\u07d4EI\xb1Yy%_~e\xe9\x9b\rV\x04\u06d8\xdf\xca\u023f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4EKa\xb3D\xc0\xef\x96Qy#\x81U\xf2w\u00c2\x9d\v8\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94EO\x01A\xd7!\xd3<\xbd\xc4\x10\x18\xbd\x01\x11\x9a\xa4xH\x18\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4ES3\x90\xe3@\xfe\r\xe3\xb3\xcf_\xb9\xfc\x8e\xa5R\xe2\x9eb\x89O%\x91\xf8\x96\xa6P\x00\x00\u07d4ES\x96\xa4\xbb\u067a\u8bdf\xb7\xc4\xd6MG\x1d\xb9\xc2E\x05\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\u07d4E[\x92\x96\x92\x1at\xd1\xfcAa\u007fC\xb80>o>\xd7l\x89\u3bb5sr@\xa0\x00\x00\u07d4E\\\xb8\xee9\xff\xbcu#1\xe5\xae\xfcX\x8e\xf0\xeeY4T\x8965F:x\r\xef\x80\x00\u07d4Ej\u0b24\x8e\xbc\xfa\xe1f\x06\x02PR_c\x96^v\x0f\x89\x10CV\x1a\x88)0\x00\x00\u07d4Eo\x8dtf\x82\xb2$g\x93I\x06M\x1b6\x8c|\x05\xb1v\x89\u0213\u041c\x8fQP\x00\x00\u07d4Ep)\xc4i\xc4T\x8d\x16\x8c\xec>e\x87.D(\xd4+g\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Eq\xdeg+\x99\x04\xba\xd8t6\x92\xc2\x1cO\xdc\xeaL.\x01\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4Ex\x1b\xbew\x14\xa1\xc8\xf7;\x1cty!\xdfO\x84'\x8bp\x89lk\x93[\x8b\xbd@\x00\x00\u07d4E{\xce\xf3}\xd3\xd6\v-\xd0\x19\xe3\xfea\xd4k?\x1erR\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94E\x8e<\u025e\x94xD\xa1\x8ejB\x91\x8f\xef~\u007f_^\xb3\x8a\a\xb5?y\xe8\x88\xda\xc0\x00\x00\u07d4E\x93\x93\xd6:\x06>\xf3r\x1e\x16\xbd\x9f\xdeE\ue77dw\xfb\x89j\xba\u05a3\xc1S\x05\x00\x00\u07d4E\xa5p\xdc\xc2\t\f\x86\xa6\xb3\xea)\xa6\bc\xdd\xe4\x1f\x13\xb5\x89\f\x9a\x95\xee)\x86R\x00\x00\u07d4E\xa8 \xa0g/\x17\xdct\xa0\x81\x12\xbcd?\xd1\x16w6\u00c9\n\xd6\xc4;(\x15\xed\x80\x00\u07d4E\xb4q\x05\xfeB\xc4q-\xcen*!\xc0[\xff\xd5\xeaG\xa9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4E\xbb\x82\x96R\u063f\xb5\x8b\x85'\xf0\xec\xb6!\u009e!.\u00c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94E\xc0\u045f\v\x8e\x05O\x9e\x8986\xd5\xec\xaey\x01\xaf(\x12\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4E\xc4\xec\xb4\xee\x89\x1e\xa9\x84\xa7\xc5\xce\xfd\x8d\xfb\x001\v(P\x89kV\x05\x15\x82\xa9p\x00\x00\u07d4E\u028d\x95f\b\xf9\xe0\n/\x99t\x02\x86@\x88\x84ef\x8f\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94E\u0298b\x00;N@\xa3\x17\x1f\xb5\xca\xfa\x90(\xca\xc8\xde\x19\x8a\x02\ub3b1\xa1r\u0738\x00\x00\u07d4E\xd1\xc9\xee\xdf|\xabA\xa7y\x05{y9_T(\xd8\x05(\x89lk\x93[\x8b\xbd@\x00\x00\u07d4E\u0535M7\xa8\xcfY\x98!#_\x06/\xa9\xd1p\xed\u8909\x11\x90g;_\u0690\x00\x00\xe0\x94E\xdb\x03\xbc\xcf\u05a5\xf4\xd0&k\x82\xa2*6\x87\x92\xc7}\x83\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4E\xe3\xa9>r\x14J\u0686\f\xbcV\xff\x85\x14Z\xda8\xc6\u0689WG=\x05\u06ba\xe8\x00\x00\u07d4E\u6378\u06fa\xba_\xc2\xcb3|b\xbc\xd0\xd6\x1b\x05\x91\x89\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94E\u6379L}\n\xb7\xacA\x85zq\xd6qG\x87\x0fNq\x8aT\xb4\v\x1f\x85+\xda\x00\x00\x00\u07d4E\xf4\xfc`\xf0\x8e\xac\xa1\x05\x98\xf03c)\x80\x1e<\x92\xcbF\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4F\rSU\xb2\xce\xebnb\x10}\x81\xe5\x12p\xb2k\xf4V \x89l\xb7\xe7Hg\xd5\xe6\x00\x00\xe0\x94F\"O2\xf4\xec\xe5\u0206p\x90\xd4@\x9dU\xe5\v\x18C-\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4F'\xc6\x06\x84&q\xab\u0782\x95\xee]\xd9L\u007fT\x954\xf4\x89\x0f\x89_\xbd\x872\xf4\x00\x00\u07d4F+g\x8bQ\xb5\x84\xf3\xedz\xda\a\v\\\u065c\v\xf7\xb8\u007f\x89\x05k\xc7^-c\x10\x00\x00\u07d4FM\x9c\x89\xcc\xe4\x84\xdf\x00\x02w\x19\x8e\xd8\a_\xa65r\u0449\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4FPNj!Z\xc8;\xcc\xf9V\xbe\xfc\x82\xabZg\x93q\u0209\x1c!(\x05\u00b4\xa5\x00\x00\xe0\x94FQ\xdcB\x0e\b\xc3);'\xd2Ix\x90\xebP\":\xe2\xf4\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4FS\x1e\x8b\x1b\xde\t\u007f\u07c4\x9dm\x11\x98\x85`\x8a\x00\x8d\xf7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4Fb\x92\xf0\xe8\rC\xa7\x87t'u\x90\xa9\xebE\x96\x12\x14\xf4\x894\x95tD\xb8@\xe8\x00\x00\xe0\x94Fb\xa1v^\xe9!\x84-\u0708\x89\x8d\x1d\xc8bu\x97\xbd~\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4Fe\xe4s\x96\xc7\u06d7\xeb*\x03\xd9\bc\xd5\u053a1\x9a\x94\x89 \x86\xac5\x10R`\x00\x00\u07d4Fo\xdak\x9bX\xc5S'P0j\x10\xa2\xa8\xc7h\x10;\a\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4Fq$\xae\u007fE/&\xb3\xd5t\xf6\b\x88\x94\xfa]\x1c\xfb;\x89\x92^\x06\xee\xc9r\xb0\x00\x00\u0794Fr*6\xa0\x1e\x84\x1d\x03\xf7\x80\x93^\x91}\x85\u0566z\xbd\x88\xce\xc7o\x0eqR\x00\x00\u07d4Fw\x9aVV\xff\x00\xd7>\xac:\xd0\u00cbl\x850\x94\xfb@\x89\f\x82S\xc9lj\xf0\x00\x00\u07d4Fw\xb0N\x03C\xa3!1\xfdj\xbb9\xb1\xb6\x15k\xba=[\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4F}Y\x88$\x9ahaG\x16e\x98@\xed\n\xe6\xf6\xf4W\xbc\x89\x15\x01\xa4\x8c\xef\xdf\xde\x00\x00\u07d4F~\x0e\xd5O;v\xae\x066\x17n\aB\b\x15\xa0!sn\x89lk\x93[\x8b\xbd@\x00\x00\u07d4F~\xa1\x04E\x82~\xf1\xe5\x02\xda\xf7k\x92\x8a \x9e\r@2\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94F\u007f\xbfAD\x16\x00u\u007f\xe1X0\xc8\xcd_O\xfb\xbb\xd5`\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94F\x93Xp\x932\xc8+\x88~ \xbc\xdd\xd0\"\x0f\x8e\u06e7\u040a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4F\x97\xba\xaf\x9c\xcb`?\xd3\x040h\x9dCTE\xe9\u024b\xf5\x89\n\xd2\x01\xa6yO\xf8\x00\x00\u07d4F\xa3\v\x8a\x80\x891!tE\xc3\xf5\xa9>\x88,\x03E\xb4&\x89\r\x8d\xb5\xeb\u05f2c\x80\x00\u07d4F\xa40\xa2\u0528\x94\xa0\u062a?\xea\xc6\x156\x14\x15\xc3\xf8\x1f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4F\xaaP\x18pg~\u007f\nPHv\xb4\xe8\x80\x1a\n\xd0\x1cF\x89+^:\xf1k\x18\x80\x00\x00\u07d4F\xbf\u0172\a\xeb \x13\xe2\xe6\x0fw_\xec\xd7\x18\x10\u0159\f\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4F\xc1\xaa\"D\xb9\u0229W\u028f\xacC\x1b\x05\x95\xa3\xb8h$\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4F\xd8\x061(B\x03\xf6(\x8e\xcdNWX\xbb\x9dA\xd0]\xbe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4G\n\xc5\xd1\xf3\xef\xe2\x8f8\x02\xaf\x92[W\x1ec\x86\x8b9}\x89lk\x93[\x8b\xbd@\x00\x00\u07d4G\x10\x10\xdaI/@\x18\x83;\b\x8d\x98r\x90\x1e\x06\x12\x91t\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4G\x12T\x02e\xcb\xee\u00c4p\"\u015f\x1b1\x8dC@\n\x9e\x89\xbd\xbcA\xe04\x8b0\x00\x00\xe0\x94G\x14\u03e4\xf4k\u05bdps}u\x87\x81\x97\xe0\x8f\x88\xe61\x8a\x02\u007f>\u07f3Nn@\x00\x00\u07d4G H\xcc`\x9a\xeb$!e\uaa87\x05\x85\f\xf3\x12]\xe0\x8965\u026d\xc5\u07a0\x00\x00\u07d4G!\x92)\xe8\xcdVe\x9ae\u00a9C\xe2\u075a\x8fK\xfd\x89\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4G7\xd0B\xdcj\xe7>\xc7:\xe2Qz\u03a2\xfd\xd9d\x87\u014965\u026d\xc5\u07a0\x00\x00\u07d4GAX\xa1\xa9\xdci<\x13?e\xe4{\\:\xe2\xf7s\xa8o\x89\n\xdaUGK\x814\x00\x00\u07d4GE\xab\x18\x1a6\xaa\x8c\xbf\"\x89\xd0\xc4Qe\xbc~\xbe#\x81\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4GPf\xf9\xad&eQ\x96\xd5SS'\xbb\xeb\x9by)\xcb\x04\x89\xa4\xccy\x95c\u00c0\x00\x00\xe0\x94GR!\x8eT\xdeB?\x86\xc0P\x193\x91z\xea\b\xc8\xfe\u054a\x04<3\xc1\x93ud\x80\x00\x00\u07d4GZa\x93W-JNY\u05fe\t\u02d6\r\u074cS\x0e/\x89$,\xf7\x8c\xdf\a\xff\x80\x00\u07d4Gd\x8b\xed\x01\xf3\xcd2I\bNc]\x14\u06a9\xe7\xec<\x8a\x89\n\x84Jt$\xd9\xc8\x00\x00\u07d4Gh\x84\x10\xff%\xd6T\xd7.\xb2\xbc\x06\xe4\xad$\xf83\xb0\x94\x89\b\xb2\x8da\xf3\u04ec\x00\x00\u07d4GkU\x99\b\x9a?\xb6\xf2\x9clr\xe4\x9b.G@\ua00d\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4Gs\x0f_\x8e\xbf\x89\xacr\xef\x80\xe4l\x12\x19P8\xec\xdcI\x89\xabM\xcf9\x9a:`\x00\x00\xe0\x94G{$\xee\u80deO\u045d\x12P\xbd\vfEyJa\u028a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4G\x81\xa1\nM\xf5\uef02\xf4\xcf\xe1\a\xba\x1d\x8av@\xbdf\x89a\t=|,m8\x00\x00\u07d4G\x88Z\xba\xbe\xdfM\x92\x8e\x1c\x88\x83\xa6a\x9cl(\x11\x84\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94G\xe2]\xf8\x82%8\xa8Yk(\xc67\x89kM\x14<5\x1d\x8a\x11\v\xe9\xeb$\xb8\x81P\x00\x00\u07d4G\xf4ik\xd4b\xb2\r\xa0\x9f\xb8>\xd2\x03\x98\x18\xd7v%\xb3\x89\b\x13\xcaV\x90m4\x00\x00\u07d4G\xfe\xf5\x85\x84FRH\xa0\x81\r`F>\xe9>Zn\xe8\u04c9\x0fX\xcd>\x12i\x16\x00\x00\u07d4G\xffo\xebC! `\xbb\x15\x03\u05e3\x97\xfc\b\xf4\xe7\x03R\x89lk\x93[\x8b\xbd@\x00\x00\u07d4G\xff\xf4,g\x85Q\xd1A\xebu\xa6\xee9\x81\x17\xdf>J\x8d\x89\x05k\xea\xe5\x1f\xd2\xd1\x00\x00\u07d4H\x01\x0e\xf3\xb8\xe9^?0\x8f0\xa8\xcb\u007fN\xb4\xbf`\xd9e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4H\n\xf5 v\x00\x9c\xa77\x81\xb7\x0eC\xb9Y\x16\xa6\"\x03\xab\x892\x19r\xf4\b=\x87\x80\x00\u07d4H\x0f1\xb9\x891\x1eA$\u01a7F_ZD\tM6\xf9\u04097\x90\xbb\x85Q7d\x00\x00\xe0\x94H\x11\x15)j\xb7\xdbRI/\xf7\xb6G\xd63)\xfb\\\xbck\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4H\x1e:\x91\xbf\xdc/\x1c\x84(\xa0\x11\x9d\x03\xa4\x16\x01A~\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4H(\xe4\xcb\xe3N\x15\x10\xaf\xb7,+\ueb0aE\x13\xea\xeb\u0649\u0556{\xe4\xfc?\x10\x00\x00\xe0\x94H)\x82\xac\x1f\x1cm\x17!\xfe\xec\u0679\xc9l\xd9I\x80PU\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4H0,1\x1e\xf8\xe5\xdcfAX\xddX<\x81\x19Mn\rX\x89\xb6gl\xe0\xbc\xcb\\\x00\x00\u07d4H;\xa9\x904\xe9\x00\xe3\xae\xdfaI\x9d;+\xce9\xbe\xb7\xaa\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4HT\x8bK\xa6+\xcb/\r4\xa8\x8d\u019ah\x0eS\x9c\xf0F\x89\x05l\xf1\u02fbt2\x00\x00\u07d4Hc\x84\x979&Zc\xb0\xa2\xbf#jY\x13\xe6\xf9Y\xce\x15\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4He\x9d\x8f\x8c\x9a/\xd4Oh\u06a5]#\xa6\b\xfb\xe5\x00\u0709lk\x93[\x8b\xbd@\x00\x00\xe0\x94Hf\x9e\xb5\xa8\x01\u0637_\xb6\xaaX\xc3E\x1bpX\xc2C\xbf\x8a\x06\x8dB\xc18\u06b9\xf0\x00\x00\u07d4Hjl\x85\x83\xa8D\x84\xe3\xdfC\xa1#\x83\u007f\x8c~#\x17\u0409\x11\x87\xc5q\xab\x80E\x00\x00\u07d4Hz\xdf}p\xa6t\x0f\x8dQ\xcb\xddh\xbb?\x91\u0125\xceh\x89\x03\x9f\xba\xe8\xd0B\xdd\x00\x00\u07d4H~\x10\x85\x02\xb0\xb1\x89\uf70cm\xa4\xd0\xdbba\xee\xc6\xc0\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94H\x88\xfb%\xcdP\u06f9\xe0H\xf4\x1c\xa4}x\xb7\x8a'\xc7\u064a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u0794H\x934\u00b6\x95\xc8\xee\a\x94\xbd\x86B\x17\xfb\x9f\xd8\xf8\xb15\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4H\xa3\r\xe1\xc9\x19\xd3\xfd1\x80\xe9}_+*\x9d\xbd\x96M-\x89\x02b\x9ff\xe0\xc50\x00\x00\u07d4H\xbf\x14\u05f1\xfc\x84\xeb\xf3\xc9k\xe1/{\xce\x01\xaai\xb0>\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4H\xc2\ue465\aV\xd8\u039a\xbe\xebu\x89\xd2,o\xee]\xfb\x89\xae\x8ez\v\xb5u\xd0\x00\x00\u07d4H\xc5\u0197\v\x91a\xbb\x1c{z\xdf\xed\x9c\xde\u078a\x1b\xa8d\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94H\xd2CKz}\xbb\xff\b\";c\x87\xb0]\xa2\xe5\t1&\x8a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\u07d4H\xd4\xf2F\x8f\x96?\u05da\x00a\x98\xbbg\x89]-Z\xa4\u04c9K\xe4\xe7&{j\xe0\x00\x00\u07d4H\xe0\xcb\xd6\u007f\x18\xac\xdbzb\x91\xe1%M\xb3.\trs\u007f\x89\x05k\xe0<\xa3\xe4}\x80\x00\u07d4H\xf6\n5HO\xe7y+\u030a{c\x93\xd0\u0761\xf6\xb7\x17\x89\xc3(\t>a\xee@\x00\x00\u07d4H\xf8\x83\xe5g\xb46\xa2{\xb5\xa3\x12M\xbc\x84\xde\xc7u\xa8\x00\x89)\xd7n\x86\x9d\u0340\x00\x00\xe0\x94I\x01E\xaf\xa8\xb5E\"\xbb!\xf3R\xf0m\xa5\xa7\x88\xfa\x8f\x1d\x8a\x01\xf4lb\x90\x1a\x03\xfb\x00\x00\u07d4I\t\xb3\x19\x98\xea\xd4\x14\xb8\xfb\x0e\x84k\xd5\xcb\xde995\xbe\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4I\x12\xd9\x02\x93\x16v\xff9\xfc4\xfe<<\xc8\xfb!\x82\xfaz\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4I\x13o\xe6\xe2\x8btS\xfc\xb1kk\xbb\u9aac\xba\x837\xfd\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94I\x15a\u06cbo\xaf\xb9\x00~b\xd0P\u0082\xe9,Kk\u020a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4I\x18]\xd7\xc262\xf4lu\x94s\ubb96`\b\xcd5\x98\x89\r\xc5_\xdb\x17d{\x00\x00\u07d4I,\xb5\xf8a\xb1\x87\xf9\xdf!\xcdD\x85\xbe\xd9\vP\xff\xe2-\x89\x1b\x19\xe5\vD\x97|\x00\x00\u07d4I-\xe4j\xaf\x8f\x1dp\x8dY\u05da\xf1\xd0:\xd2\xcb`\x90/\x89lk\x93[\x8b\xbd@\x00\x00\u07d4I.p\xf0M\x18@\x8c\xb4\x1e%`70Pk5\xa2\x87k\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4I:g\xfe#\xde\xccc\xb1\r\xdau\xf3(v\x95\xa8\x1b\u056b\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4I=H\xbd\xa0\x15\xa9\xbf\xcf\x16\x03\x93n\xabh\x02L\xe5Q\xe0\x89\x018\xa3\x88\xa4<\x00\x00\x00\xe0\x94IBV\xe9\x9b\x0f\x9c\xd6\xe5\xeb\xca8\x99\x862R\x90\x01e\u020a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4IM\xecM^\xe8\x8a'q\xa8\x15\xf1\xeerd\x94/\xb5\x8b(\x89lk\x93[\x8b\xbd@\x00\x00\u07d4I[d\x1b\x1c\u07a3b\u00f4\u02fd\x0f\\\xc5\v\x1e\x17k\x9c\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94Ih\xa2\xce\xdbEuU\xa19)Z\xea(wnT\x00<\x87\x8a\x02#\x1a\xef\u0266b\x8f\x00\x00\u07d4Im6U4S\n_\xc1W|\nRA\u02c8\xc4\xdapr\x89a\t=|,m8\x00\x00\xe0\x94In1\x95\x92\xb3A\xea\xcc\xd7x\u0767\xc8\x19mT\xca\xc7u\x8a\x01\xf5q\x89\x87fKH\x00\x00\u07d4IoXC\xf6\xd2L\u064d%^L#\xd1\xe1\xf0#\"uE\x89_\x17\x9f\u0526\xee\t\x80\x00\xe0\x94Ip\u04ec\xf7+[\x1f2\xa7\x00<\xf1\x02\xc6N\xe0TyA\x8a\x1d\xa5jK\b5\xbf\x80\x00\x00\u07d4Iw\xa7\x93\x9d\t9h\x94U\xce&9\xd0\xeeZL\xd9\x10\xed\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4Iy\x19N\xc9\xe9}\xb9\xbe\xe84;|w\xd9\xd7\xf3\xf1\u071f\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4Iy4c\xe1h\x10\x83\u05ab\xd6\xe7%\u057b\xa7E\xdc\xcd\xe8\x89\x1d\x98\xe9LNG\x1f\x00\x00\u07d4I\x81\xc5\xfff\xccN\x96\x80%\x1f\xc4\xcd/\xf9\a\xcb2xe\x89(\xa8WBTf\xf8\x00\x00\u07d4I\x89\u007f\xe92\xbb\xb3\x15L\x95\u04fc\xe6\xd9;ms)\x04\u0749\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4I\x89\xe1\xab^|\xd0\aF\xb3\x93\x8e\xf0\xf0\xd0d\xa2\x02[\xa5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4I\x8a\xbd\xeb\x14\xc2k{r4\xd7\x0f\u03ae\xf3a\xa7m\xffr\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4I\xa6E\xe0f}\xfd{2\xd0u\xcc$g\u074ch\t\a\u0109\a\x06\x01\x95\x8f\u02dc\x00\x00\xe0\x94I\xb7N\x16\x92e\xf0\x1a\x89\xecL\x90r\u0164\xcdr\xe4\xe85\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4I\xbd\xbc{\xa5\xab\xeb\xb68\x9e\x91\xa3(R \xd3E\x1b\xd2S\x8965\u026d\xc5\u07a0\x00\x00\u07d4I\xc9A\xe0\xe5\x01\x87&\xb7)\x0f\xc4s\xb4q\xd4\x1d\xae\x80\u0449\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94I\xc9w\x1f\xca\x19\u0579\xd2E\u0211\xf8\x15\x8f\xe4\x9fG\xa0b\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4I\xcf\x1eT\xbe61\x06\xb9 r\x9d-\v\xa4o\bg\x98\x9a\x89\x0e\x87?D\x13<\xb0\x00\x00\u07d4I\xd2\u008e\xe9\xbcT^\xaa\xf7\xfd\x14\xc2|@s\xb4\xbb_\x1a\x89O\xe9\xb8\x06\xb4\r\xaf\x00\x00\u07d4I\xdd\xee\x90.\x1d\f\x99\u0471\x1a\xf3\u030a\x96\xf7\x8eM\xcf\x1a\x89\n\u03a5\xe4\xc1\x8cS\x00\x00\u07d4I\xf0(9[Z\x86\xc9\xe0\u007fwxc\x0eL.=7:w\x89\x06\xa7JP8\u06d1\x80\x00\xe0\x94J\x19 5\xe2a\x9b$\xb0p\x9dVY\x0e\x91\x83\xcc\xf2\xc1\u064a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4J@S\xb3\x1d\x0e\xe5\u06ef\xb1\xd0k\u05ec\u007f\xf3\",G\u0589K\xe4\xe7&{j\xe0\x00\x00\u07d4JC\x01p\x15-\xe5\x17&3\u0742b\xd1\a\xa0\xaf\xd9j\x0f\x89\xabM\xcf9\x9a:`\x00\x00\u07d4JG\xfc>\x17\u007fVz\x1e8\x93\xe0\x00\xe3k\xba#R\n\xb8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4JR\xba\xd2\x03W\"\x8f\xaa\x1e\x99k\xedy\f\x93gK\xa7\u0409Hz\x9a0E9D\x00\x00\u07d4JS\xdc\xdbV\xceL\xdc\xe9\xf8.\xc0\xeb\x13\xd6sR\xe7\u020b\x89\u3bb5sr@\xa0\x00\x00\u07d4J_\xae;\x03r\xc20\xc1%\xd6\xd4p\x14\x037\xab\x91VV\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4Jq\x90a\xf5(T\x95\xb3{\x9d~\xf8\xa5\x1b\a\xd6\u6b2c\x89\n\xd4\xc81j\v\f\x00\x00\u07d4Js8\x92\x98\x03\x1b\x88\x16\u0329FB\x1c\x19\x9e\x18\xb3C\u0589\"8h\xb8y\x14o\x00\x00\u07d4Js]\"G\x927m3\x13g\xc0\x93\xd3\x1c\x87\x944\x15\x82\x89f\xff\xcb\xfd^Z0\x00\x00\u07d4Jt\x94\xcc\xe4HU\u0300X(B\xbe\x95\x8a\r\x1c\x00r\ue242\x1a\xb0\xd4AI\x80\x00\x00\u07d4Ju\xc3\xd4\xfao\u033d]\u0567\x03\xc1Sy\xa1\xe7\x83\u9dc9b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94J\x81\xab\xe4\x98L|k\xefc\u0598 \xe5WC\xc6\x1f \x1c\x8a\x03d\x01\x00N\x9a\xa3G\x00\x00\u07d4J\x82iO\xa2\x9d\x9e!2\x02\xa1\xa2\t(]\xf6\xe7E\xc2\t\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4J\x83\\%\x82LG\xec\xbf\u01d49\xbf?\\4\x81\xaau\u0349K\xe4\xe7&{j\xe0\x00\x00\u07d4J\x91\x802C\x91Y\xbb1[g%\xb6\x83\r\xc86\x97s\x9f\x89\x12\xa3.\xf6x3L\x00\x00\u07d4J\x97\xe8\xfc\xf4c^\xa7\xfc^\x96\xeeQu.\u00c8qk`\x89\x1d\x99E\xab+\x03H\x00\x00\u07d4J\x9a&\xfd\n\x8b\xa1\x0f\x97}\xa4\xf7|1\x90\x8d\xabJ\x80\x16\x89a\t=|,m8\x00\x00\u07d4J\xa1H\xc2\xc34\x01\xe6j+Xnew\u0132\x92\xd3\xf2@\x89\v\xb8`\xb2\x85\xf7t\x00\x00\u07d4J\xa6\x93\xb1\"\xf3\x14H*G\xb1\x1c\xc7|h\xa4\x97\x87ab\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4J\xb2\xd3O\x04\x83O\xbftyd\x9c\xab\x92=,G%\xc5S\x89\xbe\xd1\xd0&=\x9f\x00\x00\x00\u07d4J\xc0vs\xe4/d\xc1\xa2^\xc2\xfa-\x86\xe5\xaa+4\xe09\x89lk\x93[\x8b\xbd@\x00\x00\u07d4J\u016c\xad\x00\v\x88w!L\xb1\xae\x00\xea\u0263}Y\xa0\xfd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4J\u0250ZL\xb6\xab\x1c\xfdbTn\xe5\x91s\x00\xb8|O\u07897\b\xba\xed=h\x90\x00\x00\u07d4J\u03e9\xd9N\xdaf%\xc9\u07e5\xf9\xf4\xf5\xd1\a\xc4\x03\x1f\u07c9\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4J\xd0G\xfa\xe6~\xf1b\xfeh\xfe\xdb\xc2};e\xca\xf1\f6\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4J\xd9]\x18\x8dddp\x9a\xdd%U\xfbM\x97\xfe\x1e\xbf1\x1f\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\u07d4J\xdb\xf4\xaa\xe0\xe3\xefD\xf7\xddM\x89\x85\u03ef\tn\u010e\x98\x89\b!\xab\rD\x14\x98\x00\x00\u07d4J\xe2\xa0M9\t\xefENTL\xcf\xd6\x14\xbf\xef\xa7\x10\x89\xae\x89\x18\x01\x15\x9d\xf1\xee\xf8\x00\x00\xe0\x94J\xe90\x82\xe4Q\x87\xc2a`\xe6g\x92\xf5\u007f\xad5Q\xc7:\x8a\x04\x96\x15 \xda\xff\x82(\x00\x00\u07d4J\xf0\xdb\a{\xb9\xba^D>!\xe1H\xe5\x9f7\x91\x05\u0152\x89 \x86\xac5\x10R`\x00\x00\u07d4K\x06\x19\xd9\u062a1:\x951\xac}\xbe\x04\xca\rjZ\u0476\x89lk\x93[\x8b\xbd@\x00\x00\u07d4K\v\u062c\xfc\xbcS\xa6\x01\v@\xd4\u040d\xdd-\x9dib-\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4K\x19\xeb\f5K\xc199`\xeb\x06\x06;\x83\x92o\rg\xb2\x89\x01\x92t\xb2Y\xf6T\x00\x00\u07d4K)C|\x97\xb4\xa8D\xbeq\u0323\xb6H\xd4\xca\x0f\u075b\xa4\x89\b$q\x984\u03ec\x00\x00\u07d4K1\xbfA\xab\xc7\\\x9a\xe2\u034f\u007f5\x16;n+tPT\x89\x14\xb5P\xa0\x13\xc78\x00\x00\u07d4K:|\u00e7\u05f0\x0e\xd5(\"!\xa6\x02Y\xf2[\xf6S\x8a\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94K:\xab3^\xbb\xfa\xa8p\xccM`^}.t\xc6h6\x9f\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4K\xcd\xc1\x8a`\x00\x00\u07d4K`\xa3\xe2S\xbf8\xc8\xd5f \x10\xbb\x93\xa4s\xc9e\xc3\xe5\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4Kt\xf5\xe5\x8e.\xdfv\xda\xf7\x01Q\x96J\v\x8f\x1d\xe0f<\x89\x11\x90\xaeID\xba\x12\x00\x00\u07d4Kv!f\xdd\x11\x18\xe8Ci\xf8\x04\xc7_\x9c\xd6W\xbfs\f\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4Ky.)h>\xb5\x86\u353b3Rl`\x01\xb3\x97\x99\x9e\x89 \x86\xac5\x10R`\x00\x00\u07d4K\x90N\x93K\xd0\u030b p_\x87\x9e\x90[\x93\xea\f\xcc0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94K\x92\x06\xbakT\x9a\x1a\u007f\x96\x9e\x1d]\xba\x86u9\xd1\xfag\x8a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4K\x98N\xf2lWn\x81Z.\xae\xd2\xf5\x17\u007f\a\u06f1\xc4v\x89T\x91YV\xc4\t`\x00\x00\u07d4K\x9e\x06\x8f\xc4h\tv\xe6\x15\x04\x91)\x85\xfd\\\xe9K\xab\r\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4K\xa0\xd9\xe8\x96\x01w+IhG\xa2\xbbC@\x18g\x87\xd2e\x8965\u026d\xc5\u07a0\x00\x00\u07d4K\xa5:\xb5I\xe2\x01m\xfa\"<\x9e\u0563\x8f\xad\x91(\x8d\a\x89K\xe4\xe7&{j\xe0\x00\x00\xe0\x94K\xa8\xe0\x11\u007f\xc0\xb6\xa3\xe5k$\xa3\xa5\x8f\xe6\xce\xf4B\xff\x98\x8a\x011\xbe\xb9%\xff\xd3 \x00\x00\u07d4K\xac\x84j\xf4\x16\x9f\x1d\x95C\x1b4\x1d\x88\x00\xb2!\x80\xaf\x1a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4K\xb6\xd8k\x83\x14\xc2-\x8d7\xeaQm\x00\x19\xf1V\xaa\xe1-\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94K\xb9e\\\xfb*6\xea|cz{\x85\x9bJ1T\xe2n\xbe\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\xe0\x94K\xbc\xbf8\xb3\xc9\x01c\xa8K\x1c\u04a9;X\xb2\xa34\x8d\x87\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94K\xd6\xdd\f\xff#@\x0e\x170\xba{\x89E\x04W}\x14\xe7J\x8a+\xa0\xcc\xdd\xd0\xdfs\xb0\x00\x00\u07d4K\xe8b\x8a\x81T\x87N\x04\x8d\x80\xc1B\x18\x10\"\xb1\x80\xbc\xc1\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4K\xe9\rA!)\u0564\xd0BCa\xd6d\x9dNG\xa6#\x16\x897\b\xba\xed=h\x90\x00\x00\xe0\x94K\xea(\x8e\xeaB\u0115^\xb9\xfa\xad*\x9f\xafG\x83\xcb\u076c\x8a\x06\x18\xbe\x16c\u012fI\x00\x00\u07d4K\xf4G\x97\x99\xef\x82\xee\xa2\tC7OV\xa1\xbfT\x00\x1e^\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4K\xf8\xbf\x1d5\xa211Wd\xfc\x80\x01\x80\x9a\x94\x92\x94\xfcI\x89\x03\x9f\xba\xe8\xd0B\xdd\x00\x00\u07d4K\xf8\xe2oL'\x90\xdae3\xa2\xac\x9a\xba\xc3\u019a\x19\x943\x89\n\u05ce\xbcZ\xc6 \x00\x00\u0794L\n\xcaP\x8b<\xaf^\xe0(\xbcp}\xd1\xe8\x00\xb88\xf4S\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94L\v\x15\x15\xdf\xce\u05e1>\x13\xee\x12\xc0\xf5#\xaePO\x03+\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4L\x13\x98\f2\xdc\xf3\x92\vx\xa4\xa7\x903\x12\x90|\x1b\x12?\x89\x03A\x00\x15\xfa\xae\f\x00\x00\u07d4L\x15y\xaf3\x12\xe4\xf8\x8a\xe9\x95\xcc9W\xd2R\xce\v\xf0\xc8}[O\"4g.p\x89\x87\x86x2n\xac\x90\x00\x00\u07d4LB1y\x82i\x1d\x10\x89\x05k\xc7^-c\x10\x00\x00\u07d4LZ\xfe@\xf1\x8f\xfcH\u04e1\xae\xc4\x1f\u009d\xe1y\xf4\u0497\x89lk\x93[\x8b\xbd@\x00\x00\u07d4L[=\xc0\xe2\xb96\x0f\x91(\x9b\x1f\xe1<\xe1,\x0f\xbd\xa3\xe1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Lfk\x86\xf1\xc5\ue324\x12\x85\xf5\xbd\xe4\xf7\x90R\b\x14\x06\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4Lik\xe9\x9f:i\x04@\xc3CjY\xa7\xd7\xe97\u05ba\r\x89\xbb\x91%T\"c\x90\x00\x00\u07d4Lj$\x8f\xc9}p]\xefI\\\xa2\aY\x16\x9e\xf0\xd3dq\x89)3\x1eeX\xf0\xe0\x00\x00\u07d4Lj\x9d\xc2\u02b1\n\xbb.|\x13p\x06\xf0\x8f\ucd77y\xe1\x89\x1b\r\x04 /G\xec\x00\x00\u07d4Lk\x93\xa3\xbe\xc1cIT\f\xbf\xca\xe9l\x96!\xd6dP\x10\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Lu\x98\x13\xad\x13\x86\xbe\xd2\u007f\xfa\xe9\xe4\x81^60\u0323\x12\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94Lv\f\xd9\xe1\x95\xeeO-k\xce%\x00\xff\x96\xda|C\ue44a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4Lv{e\xfd\x91\x16\x1fO\xbd\xccji\xe2\xf6\xadq\x1b\xb9\x18\x89'\b\x01\xd9F\xc9@\x00\x00\u07d4L~.+w\xad\f\xd6\xf4J\xcb(a\xf0\xfb\x8b(u\x0e\xf9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4L\x85\xed6/$\xf6\xb9\xf0L\xdf\xcc\xd0\"\xaeSQG\u02f9\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4L\x93[\xb2Pw\x8b0\x9b==\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4L\xee\x90\x1bJ\u0231V\xc5\xe2\xf8\xa6\xf1\xbe\xf5r\xa7\xdc\xeb~\x8965\u026d\xc5\u07a0\x00\x00\u07d4L\xef\xbe#\x98\xe4}R\u73743L\x8bivu\U00053b89\xd9o\u0390\u03eb\xcc\x00\x00\u07d4L\xf5S{\x85\x84/\x89\xcf\xee5\x9e\xaeP\x0f\xc4I\xd2\x11\x8f\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94M\bG\x1dh\x00z\xff*\xe2y\xbc^?\xe4\x15o\xbb\xe3\u078a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4M \x01\x10\x12@\b\xd5ov\x98\x12VB\f\x94jo\xf4\\\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4M$\xb7\xacG\xd2\xf2}\xe9\tt\xba=\xe5\xea\xd2\x03TK\u0349\x05k\xc7^-c\x10\x00\x00\u0794M)\xfcR:,\x16)S!!\u0699\x98\u9d6b\x9d\x1bE\x88\xdbD\xe0I\xbb,\x00\x00\u07d4M8\xd9\x0f\x83\xf4Q\\\x03\xccx2j\x15M5\x8b\u0602\xb7\x89\n\ad\a\xd3\xf7D\x00\x00\u07d4ML\xf5\x80t)a^0\xcd\xfa\xce\x1eZ\xaeM\xad0U\xe6\x89 \x86\xac5\x10R`\x00\x00\u07d4MW\xe7\x16\x87l\f\x95\xef^\xae\xbd5\xc8\xf4\x1b\x06\x9bk\xfe\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94Mg\U000ab159\xfe\xf5\xfcA9\x99\xaa\x01\xfd\u007f\xcep\xb4=\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4Mn\x8f\xe1\t\xcc\xd2\x15\x8eM\xb1\x14\x13/\xe7_\xec\u023e[\x89\x01[5W\xf1\x93\u007f\x80\x00\xe0\x94Mq\xa6\xeb=\u007f2~\x184'\x8e(\v\x03\x9e\xdd\xd3\x1c/\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4M|\xfa\xa8L\xb31\x06\x80\n\x8c\x80/\xb8\xaaF8\x96\u0159\x89a\t=|,m8\x00\x00\u07d4M\x80\x10\x93\xc1\x9c\xa9\xb8\xf3B\xe3<\xc9\xc7{\xbdL\x83\x12\u03c9\x12\xb3\xe7\xfb\x95\u0364\x80\x00\u07d4M\x82\x88\x94u/o%\x17]\xaf!w\tD\x87\x95Ko\x9f\x89O!+\xc2\u011c\x83\x80\x00\xe0\x94M\x82\xd7p\f\x12;\xb9\x19A\x9b\xba\xf0Fy\x9ck\x0e,f\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4M\x83m\x9d;\x0e,\xbdM\xe0PYo\xaaI\f\xff\xb6\r]\x89\x10CV\x1a\x88)0\x00\x00\u07d4M\x86\x97\xaf\x0f\xbf,\xa3n\x87h\xf4\xaf\"\x135phZ`\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4M\x92y\x96 )\xa8\xbdEc\x977\xe9\x8bQ\x1e\xff\aL!\x89Hz\x9a0E9D\x00\x00\u07d4M\x93io\xa2HY\xf5\u0493\x9a\xeb\xfaT\xb4\xb5\x1a\xe1\xdc\u0309\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4M\x9cw\xd0u\f^o\xbc$\u007f/\u05d2thl\xb3S\u0589\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4M\xa5\xed\u0188\xb0\xcbb\xe1@=\x17\x00\xd9\u0739\x9f\xfe?\u04c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94M\xa8\x03\ai\x84K\xc3A\x86\xb8\\\xd4\xc74\x88I\xffI\xe9\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4M\xb1\xc4:\x0f\x83M}\x04x\xb8\x96\ag\xec\x1a\xc4L\x9a\xeb\x89/Q\x810V'7\x00\x00\u07d4M\xb2\x12\x84\xbc\xd4\xf7\x87\xa7Ue\x00\xd6\xd7\xd8\xf3f#\xcf5\x89i(7Ow\xa3c\x00\x00\u07d4M\xc3\xda\x13\xb2\xb4\xaf\xd4O]\r1\x89\xf4D\xd4\xdd\xf9\x1b\x1b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4M\u013f^u\x89\xc4{(7\x8du\x03\u03d6H\x80a\u06fd\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4M\xc9\u057bK\x19\xce\u0354\xf1\x9e\xc2] \x0e\xa7/%\xd7\xed\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94M\xcd\x11\x81X\x18\xae)\xb8]\x016sI\xa8\xa7\xfb\x12\xd0k\x8a\x01\xacB\x86\x10\x01\x91\xf0\x00\x00\u07d4M\xcfb\xa3\xde?\x06\x1d\xb9\x14\x98\xfda\x06\x0f\x1fc\x98\xffs\x89lj\xccg\u05f1\xd4\x00\x00\u07d4M\xd11\xc7J\x06\x8a7\xc9\n\xde\xd4\xf3\t\xc2@\x9fdx\u04c9\x15\xaf9\u4ab2t\x00\x00\xe0\x94M\u0767Xk\"7\xb0S\xa7\xf3(\x9c\xf4`\xdcW\xd3z\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4M\xe3\xfe4\xa6\xfb\xf64\xc0Q\x99\u007fG\xcc\u007fHy\x1fX$\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4M\xf1@\xbaye\x85\xddT\x891[\xcaK\xbah\n\u06f8\x18\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4N\x02\ay\xb5\xdd\xd3\xdf\"\x8a\x00\xcbH\xc2\xfc\x97\x9d\xa6\xae8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4N\v\xd3$s\xc4\xc5\x1b\xf2VT\xde\xf6\x9fy|k)\xa22\x89V\xc9]\xe8\xe8\xca\x1d\x00\x00\u07d4N\"%\xa1\xbbY\xbc\x88\xa21ft\xd33\xb9\xb0\xaf\xcafU\x89\bg\x0e\x9e\xc6Y\x8c\x00\x00\u07d4N#\x10\x19\x1e\xad\x8d;\xc6H\x98s\xa5\xf0\xc2\xeck\x87\u1f8965\u026d\xc5\u07a0\x00\x00\u07d4N#-S\xb3\u6f8f\x89Sa\xd3\x1c4\xd4v+\x12\xc8.\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4N+\xfaJFo\x82g\x1b\x80\x0e\xeeBj\xd0\f\a\x1b\xa1p\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4N>\xda\u0506M\xabd\xca\xe4\xc5Azvw@S\xdcd2\x89 \b\xfbG\x8c\xbf\xa9\x80\x00\u07d4NC\x18\xf5\xe1>\x82JT\xed\xfe0\xa7\xedO&\xcd=\xa5\x04\x89lk\x93[\x8b\xbd@\x00\x00\u07d4N[w\xf9\x06aY\xe6\x15\x93?-\xdatw\xfaNG\xd6H\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94Nf\x00\x80b\x89EJ\u03630\xa2\xa3U`\x10\u07ec\xad\xe6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4Ns\xcf#y\xf1$\x86\x0fs\xd6\xd9\x1b\xf5\x9a\xcc\\\xfc\x84[\x89\x02,\xa3X|\xf4\xeb\x00\x00\xe0\x94Nz\xa6~\x12\x18>\xf9\xd7F\x8e\xa2\x8a\xd29\xc2\xee\xf7\x1bv\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\xe0\x94N{TGM\x01\xfe\xfd8\x8d\xfc\xd5;\x9ff&$A\x8a\x05\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94N\x89.\x80\x81\xbf6\xe4\x88\xfd\xdb;&0\xf3\xf1\xe8\xda0\u048a\x02\x8a\xba0u$Q\xfc\x00\x00\xe0\x94N\x8amcH\x9c\xcc\x10\xa5\u007f\x88_\x96\xeb\x04\xec\xbbT`$\x8a\x03\xea\xe3\x13\x0e\u0316\x90\x00\x00\u07d4N\x8eG\xae;\x1e\xf5\f\x9dT\xa3\x8e\x14 \x8c\x1a\xbd6\x03\u0089y(\xdb\x12vf\f\x00\x00\u0794N\x90\u03312X\xac\xaa\x9fO\xeb\xc0\xa3B\x92\xf9Y\x91\xe20\x88\xdbD\xe0I\xbb,\x00\x00\u07d4N\xa5n\x11\x12d\x1c\x03\x8d\x05e\xa9\u0096\xc4c\xaf\xef\xc1~\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\xe0\x94N\xa7\x0f\x041?\xaee\xc3\xff\"J\x05\\=-\xab(\xdd\u07ca\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4N\xb1EKW8\x05\u022c\xa3~\xde\xc7\x14\x9aA\xf6\x12\x02\xf4\x89\x10CV\x1a\x88)0\x00\x00\u07d4N\xb8{\xa8x\x8e\xba\r\xf8~[\x9b\xd5\n\x8eE6\x80\x91\xc1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4N\xbcV)\xf9\xa6\xa6k,\xf36:\u0109\\\x03H\u8fc7\x8967\tlK\xcci\x00\x00\u07d4N\xc7h)^\xea\xba\xfcB\x95\x84\x15\xe2+\xe2\x16\xcd\xe7v\x18\x89\x03;\x1d\xbc9\xc5H\x00\x00\u07d4N\xcc\x19\x94\x8d\xd9\u0347\xb4\xc7 \x1a\xb4\x8eu\x8f(\xe7\xccv\x89\x1b\x1d\xaba\u04ead\x00\x00\u07d4N\xd1M\x81\xb6\v#\xfb%\x05M\x89%\u07e5s\u072eah\x89\x12nr\xa6\x9aP\xd0\x00\x00\xe0\x94N\xe1<\rA \vF\u045d\xee\\K\xce\xc7\x1d\x82\xbb\x8e8\x8a\x01\xab\xee\x13\u033e\ufbc0\x00\u07d4N\xea\xd4\n\xad\x8cs\xef\b\xfc\x84\xbc\n\x92\xc9\t/j6\xbf\x89\x01s\x17\x90SM\xf2\x00\x00\u07d4N\xeb\xe8\f\xb6\xf3\xaeY\x04\xf6\xf4\xb2\x8d\x90\u007f\x90q\x89\xfc\xab\x89lj\xccg\u05f1\xd4\x00\x00\u07d4N\xeb\xf1 ]\f\xc2\f\xeel\u007f\x8f\xf3\x11_V\u050f\xba&\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4N\xf1\xc2\x14c:\xd9\xc0p;N#t\xa2\xe3>>B\x92\x91\x89Hz\x9a0E9D\x00\x00\u07d4N\xfc\xd9\u01df\xb43L\xa6${\n3\xbd\x9c\xc32\b\xe2r\x89Hz\x9a0E9D\x00\x00\xe0\x94O\x06$k\x8dK\u0496a\xf4>\x93v\"\x01\u0486\x93Z\xb1\x8a\x01\x059O\xfcF6\x11\x00\x00\u07d4O\x15+/\xb8e\x9dCwn\xbb\x1e\x81g:\xa8Ai\xbe\x96\x89lk\x93[\x8b\xbd@\x00\x00\u07d4O\x17\u007f\x9dV\x95=\xedq\xa5a\x1f93\"\xc3\x02y\x89\\\x89\rU\uf422\xda\x18\x00\x00\u07d4O\x1a-\xa5JLm\xa1\x9d\x14$\x12\xe5n\x81WA\xdb#%\x89\x05k\xc7^-c\x10\x00\x00\u07d4O#\xb6\xb8\x17\xff\xa5\xc6d\xac\xda\u05db\xb7\xb7&\xd3\n\xf0\xf9\x89_h\xe8\x13\x1e\u03c0\x00\x00\xe0\x94O&i\f\x99+z1*\xb1.\x13\x85\xd9J\xcdX(\x8e{\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4O+G\xe2wZ\x1f\xa7\x17\x8d\xad\x92\x98Z[\xbeI;\xa6\u0589\n\u05ce\xbcZ\xc6 \x00\x00\u07d4O:HT\x91\x11E\xea\x01\xc6D\x04K\xdb.Z\x96\n\x98/\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4O?,g0i\xac\x97\xc2\x026\a\x15)\x81\xf5\xcd`c\xa0\x89 \x86\xac5\x10R`\x00\x00\xe0\x94OJ\x9b\xe1\f\xd5\xd3\xfb]\xe4\x8c\x17\xbe)o\x89V\x90d[\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4OR\xadap\xd2[*.\x85\x0e\xad\xbbRA?\xf20>\u007f\x89\xa4\xccy\x95c\u00c0\x00\x00\u07d4OX\x01\xb1\xeb0\xb7\x12\u0620WZ\x9aq\xff\x96]O4\xeb\x89\x10CV\x1a\x88)0\x00\x00\u07d4O]\xf5\xb9CW\u0794\x86\x04\xc5\x1bx\x93\xcd\xdf`v\xba\xad\x89\xcb\xd4{n\xaa\x8c\xc0\x00\x00\u07d4Od\xa8^\x8e\x9a@I\x8c\fu\xfc\xeb\x037\xfbI\b>^\x8965\u026d\xc5\u07a0\x00\x00\u07d4Og9m%S\xf9\x98x_pN\a\xa69\x19}\u0454\x8d\x89\x10DrR\x1b\xa78\x00\x00\u07d4OmG7\u05e9@8$\x87&H\x86i|\xf7c\u007f\x80\x15\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4Os0\toy\xed&N\xe0\x12\u007f]0\xd2\xf7?!\xcb\u007f\x04\x89\x04\x82\xfe&\f\xbc\xa9\x00\x00\u07d4O\xeeP\xc5\xf9\x88 k\t\xa5sF\x9f\xb1\u0434.\xbbm\u0389l\xee\x06\u077e\x15\xec\x00\x00\u07d4O\xf6v\xe2\u007fh\x1a\x98-\x8f\xd9\xd2\x0ed\x8b=\xce\x05\xe9E\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4O\xf6\u007f\xb8\u007fn\xfb\xa9'\x990\u03fd\x1bz4L\u057a\x8bN\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94PFf\u03891\x17^\x11\xa5\xed\x11\xc1\u072a\x06\xe5\u007fNf\x8a\x02\u007f>\u07f3Nn@\x00\x00\u0794PXM\x92\x06\xa4l\xe1\\0\x11\x17\xee(\xf1\\0\xe6\x0eu\x88\xb9\xf6]\x00\xf6<\x00\x00\xe0\x94PZ3\xa1\x864\xddH\x00i)\x13N\x00\x00\u07d4P\u0286\xb5\xeb\x1d\x01\x87M\xf8\xe5\xf3IE\u051cl\x1a\xb8H\x8965\u026d\xc5\u07a0\x00\x00\u07d4P\u0357\xe97\x8b\\\xf1\x8f\x179c#l\x99Q\xeft8\xa5\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4P\u073c'\xbc\xad\x98@\x93\xa2\x12\xa9\xb4\x17\x8e\xab\xe9\x01ua\x89\a\xe3by\v\\\xa4\x00\x00\u07d4P\xe10#\xbd\x9c\xa9j\xd4\xc5?\xdf\xd4\x10\xcbk\x1fB\v\u07c9\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94P\xe1\xc8\xec\x98A[\xefD&\x18p\x87\x99C{\x86\xe6\xc2\x05\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4P\xf8\xfaK\xb9\xe2g|\x99\nN\xe8\xcep\xdd\x15#%\x1eO\x89\x01i=#\x16Ok\x00\x00\u07d4P\xfb6\xc2q\a\xee,\xa9\xa3#n'F\u0321\x9a\xcekI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4P\xfe\xf2\x96\x95U\x88\u02aet\xc6.\xc3*#\xa4T\xe0\x9a\xb8\x89A\x1d\xff\xab\xc5\a8\x00\x00\u07d4Q\x02\xa4\xa4 w\xe1\x1cX\xdfGs\u3b14F#\xa6m\x9f\x89lp\x15\xfdR\xed@\x80\x00\u07d4Q\x03\x93w\xee\xd0\xc5s\xf9\x86\xc5\xe8\xa9_\xb9\x9aY\xe93\x0f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4Q\x03\xbc\t\x93>\x99!\xfdS\xdcSo\x11\xf0]\rG\x10}\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94Q\x04\xec\xc0\xe30\xdd\x1f\x81\xb5\x8a\xc9\u06f1\xa9\xfb\xf8\x8a<\x85\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4Q\r\x81Y\u0314Wh\xc7E\a\x90\xba\a>\xc0\xd9\xf8\x9e0\x89\x8a\xc7#\x04\x89\xe8\x00\x00\x00\u07d4Q\x0e\xdaV\x01I\x9a\r^\x1a\x00k\xff\xfd\x836r\xf2\xe2g\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Q\x12dF\xab=\x802U~\x8e\xbaeY}u\xfa\u0701\\\x89\x11t\xa5\xcd\xf8\x8b\xc8\x00\x00\xe0\x94Q\x18U}`\r\x05\xc2\xfc\xbf8\x06\xff\xbd\x93\xd0 %\xd70\x8a\x02g\u04ebd#\xf5\x80\x00\x00\u07d4Q\x1e\x0e\xfb\x04\xacN?\xf2\xe6U\x0eI\x82\x95\xbf\xcdV\xff\u0549$=M\x18\"\x9c\xa2\x00\x00\u07d4Q!\x16\x81{\xa9\xaa\xf8C\xd1P|e\xa5\xead\n{\x9e\xec\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4Q&F\ri,q\u026fo\x05WM\x93\x99\x83h\xa27\x99\x89\x02\u0465\x1c~\x00P\x00\x00\u07d4Q'\u007f\xe7\xc8\x1e\xeb\xd2R\xa0=\xf6\x9ak\x9f2n'\"\a\x89\x03@.y\u02b4L\x80\x00\u07d4Q)oPD'\r\x17pvF\x12\x9c\x86\xaa\xd1d^\xad\xc1\x89H|r\xb3\x10\xd4d\x80\x00\xe0\x94Q+\x91\xbb\xfa\xa9\xe5\x81\xefh?\xc9\r\x9d\xb2*\x8fI\xf4\x8b\x8aA\xa5\"8m\x9b\x95\xc0\x00\x00\u07d4Q5\xfb\x87W`\f\xf4tTbR\xf7M\xc0tm\x06&,\x89lk\x93[\x8b\xbd@\x00\x00\u07d4QF2\xef\xbdd,\x04\xdel\xa3B1]@\u0750\xa2\u06e6\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4QKu\x12\u026e^\xa6<\xbf\x11q[c\xf2\x1e\x18\u0496\xc1\x89lj\xccg\u05f1\xd4\x00\x00\u07d4QS\xa0\xc3\u0211(\x81\xbf\x1c5\x01\xbfd\xb4VI\xe4\x82\"\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94QVQ\xd6\xdbO\xaf\x9e\xcd\x10:\x92\x1b\xbb\xbej\xe9p\xfd\u050a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94Q_0\xbc\x90\xcd\xf4W~\xe4}e\u05c5\xfb\xe2\xe87\u01bc\x8a\x02'\x1b^\x01\x8b\xa0X\x00\x00\u07d4Q`\xeda.\x1bH\xe7??\xc1[\xc42\x1b\x8f#\xb8\xa2K\x89\x1e\x82kB(e\xd8\x00\x00\u07d4Qa\xfdI\xe8G\xf6tU\xf1\u023bz\xbb6\xe9\x85&\r\x03\x89A\rXj \xa4\xc0\x00\x00\u07d4QiT\x02_\xca&\b\xf4}\xa8\x1c!^\xed\xfd\x84J\t\xff\x89\x14\xb5P\xa0\x13\xc78\x00\x00\u07d4Qi\xc6\n\xeeL\xee\u0444\x9a\xb3mfL\xff\x97\x06\x1e\x8e\xa8\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4Q|uC\r\xe4\x01\xc3A\x03&\x86\x11'\x90\xf4mM6\x9e\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4Q|\xd7`\x8e]\r\x83\xa2kq\u007f6\x03\xda\xc2'}\u00e4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Q\x86]\xb1H\x88\x19Q\xf5\x12Qq\x0e\x82\xb9\xbe\r~\xad\xb2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Q\x89\x1b,\xcd\xd2\xf5\xa4K*\x8b\u011a]\x9b\xcadw%\x1c\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4Q\x8c\xef'\xb1\x05\x82\xb6\xd1OiH=\u06a0\xdd<\x87\xbb\\\x89 \x86\xac5\x10R`\x00\x00\u07d4Q\xa6\xd6'\xf6j\x89#\u060d`\x94\xc4qS\x80\xd3\x05|\xb6\x89>s\xd2z5\x94\x1e\x00\x00\u07d4Q\xa8\xc2\x166\x02\xa3.\xe2L\xf4\xaa\x97\xfd\x9e\xa4\x14QiA\x89\x03h\xf7\xe6\xb8g,\x00\x00\u07d4Q\xb4u\x8e\x9e\x14P\xe7\xafBh\xc3\u01f1\xe7\xbdo\\uP\x8965\u026d\xc5\u07a0\x00\x00\u07d4Q\u028b\xd4\xdcdO\xacG\xafgUc\u0540J\r\xa2\x1e\xeb\x89*\xb7\xb2`\xff?\xd0\x00\x00\u07d4Q\xd2K\xc3so\x88\xddc\xb7\" &\x88f0\xb6\ub1cd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Q\u05cb\x17\x8dp~9n\x87\x10\x96\\OA\xb1\xa1\xd9\x17\x9d\x89\x05\xfe\xe2\"\x04\x1e4\x00\x00\u07d4Q\xe3/\x14\xf4\xca^(|\xda\xc0W\xa7y^\xa9\xe0C\x99S\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4Q\xe4?\xe0\xd2\\x(`\xaf\x81\xea\x89\xddy<\x13\xf0\u02f1\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4Q\xe7\xb5\\/\x98 \xee\xd78\x846\x1bPf\xa5\x9boE\u0189lk\x93[\x8b\xbd@\x00\x00\xe0\x94Q\xea\x1c\t4\xe3\xd0@\"\ud715\xa0\x87\xa1P\xefp^\x81\x8a\x01Tp\x81\xe7\"M \x00\x00\u07d4Q\xee\f\xca;\xcb\x10\xcd>\x987\"\xce\xd8I=\x92l\bf\x8965f3\xeb\xd8\xea\x00\x00\xe0\x94Q\xf4f:\xb4O\xf7\x93E\xf4'\xa0\xf6\xf8\xa6\u0225?\xf24\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4Q\xf5^\xf4~dV\xa4\x18\xab2\xb9\"\x1e\xd2}\xbaf\b\xee\x89\u3bb5sr@\xa0\x00\x00\xe0\x94Q\xf9\xc42\xa4\xe5\x9a\xc8b\x82\u05ad\xabL.\xb8\x91\x91`\xeb\x8ap;[\x89\u00e6\xe7@\x00\x00\u07d4R\x0ff\xa0\xe2e\u007f\xf0\xacA\x95\xf2\xf0d\xcf/\xa4\xb2BP\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4R\x10#T\xa6\xac\xa9]\x8a.\x86\xd5\u07bd\xa6\xdei4`v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4R\x13\xf4Y\xe0x\xad:\xb9Z\t #\x9f\xcf\x163\xdc\x04\u0289\x8c\xf2\x18|*\xfb\x18\x80\x00\u07d4R\x15\x18;\x8f\x80\xa9\xbc\x03\xd2l\xe9\x12\a\x83*\r9\xe6 \x8965\u026d\xc5\u07a0\x00\x00\xe0\x94R!Cx\xb5@\x04\x05j|\xc0\x8c\x89\x13'y\x8a\u01b2H\x8a\x037\xfe_\xea\xf2\u0440\x00\x00\xe0\x94R##\xaa\xd7\x1d\xbc\x96\xd8Z\xf9\x0f\bK\x99\xc3\xf0\x9d\ucdca\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4R>\x14\r\xc8\x11\xb1\x86\xde\xe5\xd6\u020b\xf6\x8e\x90\xb8\xe0\x96\xfd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4R?mdi\x0f\xda\u0354(SY\x1b\xb0\xff \xd3em\x95\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4RO\xb2\x10R,^#\xbbg\u07ff\x8c&\xaaam\xa4\x99U\x8965b\xa6m4#\x80\x00\u07d4RU\xdci\x15ZE\xb9p\xc6\x04\xd3\x00G\xe2\xf50i\x0e\u007f\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4R`\xdcQ\xee\a\xbd\u06ab\xab\xb9\xeetK9<\u007fG\x93\xa6\x89\x01\xd8f_\xa5\xfaL\x00\x00\u07d4Rg\xf4\xd4\x12\x92\xf3p\x86<\x90\u05d3)i\x03\x846%\u01c9K\xe4\xe7&{j\xe0\x00\x00\u07d4Rk\xb53\xb7n \xc8\xee\x1e\xbf\x12?\x1e\x9f\xf4\x14\x8e@\xbe\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4Rl\xb0\x9c\u3b63g.\xec\x1d\xebF [\xe8\x9aKV>\x89\x85\xcaa[\xf9\xc0\x10\x00\x00\u07d4Rs\x8c\x90\xd8`\xe0L\xb1/I\x8d\x96\xfd\xb5\xbf6\xfc4\x0e\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4Rz\x8c\xa1&\x863\xa6\xc99\xc5\xde\x1b\x92\x9a\ue4ae\xac\x8d\x890\xca\x02O\x98{\x90\x00\x00\u07d4R\x81\x01\xceF\xb7 \xa2!M\u036ef\x18\xa51w\xff\xa3w\x89\x1b\x96\x12\xb9\xdc\x01\xae\x00\x00\xe0\x94R\x81s4s\xe0\r\x87\xf1\x1e\x99U\u5275\x9fJ\u008ez\x8a\x8b\xd6/\xf4\xee\xc5Y \x00\x00\u07d4R\x98\xab\x18*\x195\x9f\xfc\xec\xaf\xd7\u0475\xfa!-\xed\xe6\u0749\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4R\x9a\xa0\x02\u0196*:\x85E\x02\u007f\u0630_\"\xb5\xbf\x95d\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4R\x9e\x82O\xa0rX+@2h:\xc7\xee\xcc\x1c\x04\xb4\xca\xc1\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94R\xa5\xe4\xdeC\x93\xee\xcc\xf0X\x1a\xc1\x1bR\u0183\xc7n\xa1]\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4R\xb4%|\xf4\x1bn(\x87\x8dP\xd5{\x99\x91O\xfa\x89\x87:\x89\xd5\r\u026a,Aw\x00\x00\u07d4R\xb8\xa9Y&4\xf70\v|\\Y\xa34[\x83_\x01\xb9\\\x89lk\x93[\x8b\xbd@\x00\x00\u07d4R\xbd\u066fYx\x85\v\xc2A\x10q\x8b7#u\x9bC~Y\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4R\xcd @;\xa7\xed\xa6\xbc0z=c\xb5\x91\x1b\x81|\x12c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794R\u04c0Q\x1d\xf1\x9d^\u0080{\xbc\xb6vX\x1bg\xfd7\xa3\x88\xb9\xf6]\x00\xf6<\x00\x00\xe0\x94R\xe1s\x13P\xf9\x83\xcc,A\x89\x84/\xde\x06\x13\xfa\xd5\f\xe1\x8a\x02w\x01s8\xa3\n\xe0\x00\x00\u07d4R\xe4g\x832\x9av\x93\x01\xb1u\x00\x9d4gh\xf4\xc8~\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4R\xf0X\xd4aG\xe9\x00m)\xbf,\t0J\xd1\xcd\xddn\x15\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4R\xf1T#2<$\xf1\x9a\xe2\xabg7\x17\"\x9d?t}\x9b\x897\xa04\xcb\xe8\xe3\xf3\x80\x00\u07d4R\xf8\xb5\t\xfe\xe1\xa8t\xabo\x9d\x876\u007f\xbe\xaf\x15\xac\x13\u007f\x8965\u026d\xc5\u07a0\x00\x00\u07d4R\xfbF\xac]\x00\xc3Q\x8b,:\x1c\x17}D/\x81eU_\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4S\x00w\xc9\xf7\xb9\a\xff\x9c\xec\fw\xa4\x1ap\xe9\x02\x9a\xddJ\x89lk\x93[\x8b\xbd@\x00\x00\u07d4S\x03\x19\xdb\n\x8f\x93\xe5\xbb}M\xbfH\x161O\xbe\xd86\x1b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4S\x04}\u022c\x90\x83\xd9\x06r\xe8\xb3G<\x10\f\xcd'\x83#\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4S\va\xe4/9Bm$\b\xd4\bR\xb9\xe3J\xb5\xeb\xeb\u0149\x0e~\xeb\xa3A\vt\x00\x00\u07d4S\x0f\xfa\u00fc4\x12\xe2\xec\x0e\xa4{y\x81\xc7p\xf5\xbb/5\x89\a?u\u0460\x85\xba\x00\x00\u07d4S\x17\xec\xb0#\x05,\xa7\xf5e+\xe2\xfa\x85L\xfeEc\xdfM\x89\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\u07d4S\x19M\x8a\xfa>\x885\x02v~\xdb\xc3\x05\x86\xaf3\xb1\x14\u04c9lk\x93[\x8b\xbd@\x00\x00\u07d4S*}\xa0\xa5\xadt\aF\x8d;\xe8\xe0~i\xc7\xddd\xe8a\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4S-2\xb0\x0f0[\xcc$\xdc\xefV\x81}b/4\xfb,$\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4S4DX@\x82\xeb\xa6T\xe1\xad0\xe1Is\\o{\xa9\"\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4S8\xefp\xea\xc9\u075a\xf5\xa0P;^\xfa\xd1\x03\x9eg\xe7%\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94S9oJ&\u00b4`D\x960lTB\xe7\xfc\xba'.6\x8a\x04?/\b\xd4\x0eZ\xfc\x00\x00\xe0\x94S:s\xa4\xa2\"\x8e\xee\x05\xc4\xff\xd7\x18\xbb\xf3\xf9\xc1\xb1)\xa7\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4S<\x06\x92\x8f\x19\u0429V\xcc(\x86k\xf6\xc8\xd8\xf4\x19\x1a\x94\x89\x0f\xd8\xc1C8\xe60\x00\x00\u07d4S@e6\x1c\xb8T\xfa\xc4+\xfb\\\x9f\xcd\xe0`J\xc9\x19\u0689lk\x93[\x8b\xbd@\x00\x00\u07d4SC\u007f\xec\xf3J\xb9\xd45\xf4\u07b8\xca\x18\x15\x19\xe2Y 5\x89\n1\x06+\xee\xedp\x00\x00\u07d4SR\x01\xa0\xa1\xd74\"\x80\x1fU\xde\xd4\u07ee\xe4\xfb\xaan;\x89\x02&!\x1fy\x15B\x80\x00\xe0\x94S`\x81\x05\xceK\x9e\x11\xf8k\xf4\x97\xff\xca;x\x96{_\x96\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4SnM\x80)\xb7?Uy\u0723>p\xb2N\xba\x89\xe1\x1d~\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4Sp\rS%MC\x0f\"x\x1aJv\xa4c\x93;]k\b\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94S\u007f\x9dM1\xefp\x83\x9d\x84\xb0\xd9\u0377+\x9a\xfe\xdb\xdf5\x8a\x0e\u04b5%\x84\x1a\xdf\xc0\x00\x00\xe0\x94S\x81D\x85\x03\xc0\xc7\x02T+\x1d\xe7\xcc_\xb5\xf6\xab\x1c\xf6\xa5\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94S\x94.yI\xd6x\x8b\xb7\x80\xa7\xe8\xa0y'\x81\xb1aK\x84\x8a\x03]\xebFhO\x10\xc8\x00\x00\u07d4S\x95\xa4E]\x95\xd1x\xb4S*\xa4r[\x19?\xfeQ)a\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94S\x98\x9e\xd30V?\xd5}\xfe\u027d4<7`\xb0y\x93\x90\x8a\x01P\x89N\x84\x9b9\x00\x00\x00\u07d4S\xa2Dg(\x95H\x0fJ+\x1c\xdf}\xa5\xe5\xa2B\xecM\xbc\x8965\u026d\xc5\u07a0\x00\x00\u07d4S\xa7\x14\xf9\x9f\xa0\x0f\xefu\x8e#\xa2\xe7F2m\xad$|\xa7\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4S\xaf2\xc2/\uf640?\x17\x8c\xf9\v\x80/\xb5q\xc6\x1c\xb9\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4S\xc0\xbb\u007f\u020e\xa4\"\xd2\xef~T\x0e-\x8f(\xb1\xbb\x81\x83\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94S\xc5\xfe\x01\x19\xe1\xe8Hd\f\xee0\xad\ua594\x0f*]\x8b\x8a\x04\x9a\xda_\xa8\xc1\f\x88\x00\x00\u07d4S\xc9\xec\xa4\ts\xf6;\xb5\x92{\xe0\xbcj\x8a\x8b\xe1\x95\x1ft\x89lk\x93[\x8b\xbd@\x00\x00\u07d4S\u0388\xe6lZ\xf2\U0009bf4fY*V\xa3\xd1_ l2\x89\a\xa2\x8c1\xcc6\x04\x00\x00\u07d4S\xce\xc6\u0200\x92\xf7V\xef\xe5o}\xb1\x12(\xa2\xdbE\xb1\"\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4S\xe3[\x12#\x1f\x19\xc3\xfdwL\x88\xfe\xc8\xcb\xee\xdf\x14\b\xb2\x89\x1b\xc1mgN\xc8\x00\x00\x00\u07d4S\xe4\xd9im\xcb?M{?p\u072aN\xec\xb7\x17\x82\xff\\\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4S\xfa\xf1e\xbe\x03\x1e\xc1\x830\xd9\xfc\xe5\xbd\x12\x81\xa1\xaf\b\u06c9\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4T\n\x18\x19\xbd|5\x86\x1ey\x18\x04\xe5\xfb\xb3\xbc\x97\u026b\xb1\x89N\xd7\xda\xc6B0 \x00\x00\xe0\x94T\f\a(\x02\x01N\xf0\xd5a4Z\xecH\x1e\x8e\x11\xcb5p\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94T\f\xf2=\xd9\\MU\x8a'\x9dw\x8d+75\xb3\x16A\x91\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4T\x10`\xfcX\xc7P\xc4\x05\x12\xf83i\xc0\xa63@\xc1\"\xb6\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4T\x13\xc9\u007f\xfaJn*{\xba\x89a\u071f\u03850\xa7\x87\u05c965\u026d\xc5\u07a0\x00\x00\u07d4T\x1d\xb2\n\x80\xcf;\x17\xf1b\x1f\x1b?\xf7\x9b\x88/P\xde\xf3\x8965\u026d\xc5\u07a0\x00\x00\u07d4T.\x80\x96\xba\xfb\x88\x16&\x06\x00.\x8c\x8a>\u0458\x14\xae\xac\x89lk\x93[\x8b\xbd@\x00\x00\u07d4T1\v:\xa8\x87\x03\xa7%\u07e5}\xe6\xe6F\x93Qd\x80,\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4T1\xb1\u0447Q\xb9\x8f\xc9\u220a\xc7u\x9f\x155\xa2\xdbG\x89lk\x93[\x8b\xbd@\x00\x00\u07d4T1\xcaB~ae\xa6D\xba\xe3&\xbd\tu\n\x17\x8ce\r\x89lk\x93[\x8b\xbd@\x00\x00\u07d4T5\xc6\xc1y3\x17\xd3,\xe1;\xbaLO\xfe\xb9s\xb7\x8a\u0709\r\x8ek\x1c\x12\x85\xef\x00\x00\xe0\x94T6)\xc9\\\xde\xf4(\xad7\xd4S\u02958\xa9\xf9\t\x00\xac\x8a\t(\x96R\x9b\xad\u0708\x00\x00\u07d4T9\x1bM\x17mGl\xea\x16N_\xb55\u0197\x00\xcb%5\x89\x05l\xd5_\xc6M\xfe\x00\x00\xe0\x94T:\x8c\x0e\xfb\x8b\xcd\x15\xc5C\u29a4\xf8\aYv1\xad\xef\x8a\x01?\x80\xe7\xe1O-D\x00\x00\u07d4T?\x8cgN$b\xd8\xd5\u06a0\xe8\x01\x95\xa8p\x8e\x11\xa2\x9e\x89\x03wX\x83;:z\x00\x00\xe0\x94TK[5\x1d\x1b\xc8.\x92\x97C\x99H\xcfHa\xda\u026e\x11\x8a\x04\xa8\x9fT\xef\x01!\xc0\x00\x00\u07d4TM\xdaB\x1d\xc1\xebs\xbb$\xe3\xe5j$\x80\x13\xb8|\x0fD\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4TW\\1\x14u\x1e\x14o\xfe\u00c7nE\xf2\x0e\xe8AJ\u07ba\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4T\xb4B\x9b\x18/\x03w\xbe~bi9\xc5\xdbd@\xf7]z\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4T\xbc\xb8\xe7\xf7<\xda=s\xf4\u04cb-\bG\xe6\x00\xba\r\xf8\x89:pAX\x82\xdf\x18\x00\x00\u07d4T\xc9>\x03\xa9\xb2\xe8\xe4\xc3g(5\xa9\xeev\xf9a[\xc1N\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4T\u0388'YV\xde\xf5\xf9E\x8e;\x95\xde\xca\xcdH@!\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4T\xdb^\x06\xb4\x81]1\xcbV\xa8q\x9b\xa3:\xf2\xd7>rR\x89$R\x1e*0\x17\xb8\x00\x00\xe0\x94T\xe0\x12\x83\u030b8E8\xdddgp\xb3W\xc9`\xd6\xca\u034a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4T\xecs\x00\xb8\x1a\xc8C3\xed\x1b\x03<\xd5\u05e39r\xe24\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4T\xfe\xbc\xce \xfez\x90\x98\xa7U\xbd\x90\x98\x86\x02\xa4\x8c\b\x9e\x89\"\xb1\xc8\xc1\"z\x00\x00\x00\u07d4U\n\xad\xae\x12!\xb0z\xfe\xa3\x9f\xba.\xd6.\x05\u5df5\xf9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4U\f0o\x81\xef]\x95\x80\xc0l\xb1\xab \x1b\x95\xc7H\xa6\x91\x89$\x17\xd4\xc4p\xbf\x14\x00\x00\xe0\x94U\x19\x99\xdd\xd2\x05V3'\xb9\xb50xZ\xcf\xf9\xbcs\xa4\xba\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4U\x1ew\x84w\x8e\xf8\xe0H\xe4\x95\xdfI\xf2aO\x84\xa4\xf1\u0709 \x86\xac5\x10R`\x00\x00\xe0\x94U)\x83\na\xc1\xf1<\x19~U\v\xed\xdf\u05bd\x19\\\x9d\x02\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4U)\x87\xf0e\x1b\x91[.\x1eS(\xc1!\x96\rK\xddj\xf4\x89a\t=|,m8\x00\x00\u07d4U;k\x1cW\x05\x0e\x88\xcf\f1\x06{\x8dL\xd1\xff\x80\xcb\t\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4U?7\xd9$fU\x0e\x9f\xd7u\xaet6-\xf00\x17\x912\x89lk\x93[\x8b\xbd@\x00\x00\u07d4UC6\xeeN\xa1U\xf9\xf2O\x87\xbc\xa9\xcar\xe2S\xe1,\u0489\x05k\xc7^-c\x10\x00\x00\u0794UC\xddm\x16\x9e\xec\x8a!;\xbfz\x8a\xf9\xff\xd1]O\xf7Y\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4UG\xfd\xb4\xae\x11\x95>\x01)+x\a\xfa\x92#\xd0\xe4`j\x89\x05]\x11}\xcb\x1d&\x00\x00\u07d4UR\xf4\xb3\xed>\x1d\xa7\x9a/x\xbb\x13\xe8\xaeZh\xa9\xdf;\x8965\u026d\xc5\u07a0\x00\x00\u07d4U\\\xa9\xf0\\\xc14\xabT\xae\x9b\xea\x1c?\xf8z\xa8Q\x98\u0289\x05k\xc7^-c\x10\x00\x00\xe0\x94U]\x8d<\xe1y\x8a\u0290'T\xf1d\xb8\xbe*\x022\x9cl\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4U]\xf1\x93\x90\xc1m\x01)\x87r\xba\xe8\xbc:\x11R\x19\x9c\xbd\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4U^\xbe\x84\u06a4+\xa2V\xeax\x91\x05\xce\u0136\x93\xf1/\x18\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94U\u007f^e\xe0\xda3\x99\x82\x19\xadN\x99W\x05E\xb2\xa9\xd5\x11\x8a\x02U\x9c\xbb\x98XB@\x00\x00\u07d4U\x83` h\x83\xdd\x1bmJYc\x9eV)\xd0\xf0\xc6u\u0409lk\x93[\x8b\xbd@\x00\x00\u07d4U\x84B0P\xe3\xc2\x05\x1f\v\xbd\x8fD\xbdm\xbc'\xec\xb6,\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4U\x85)CI)p\xf8\xd6)\xa1Sf\xcd\xda\x06\xa9OE\x13\x89lk\x93[\x8b\xbd@\x00\x00\u0794U\x86d\x86\xec\x16\x8fy\xdb\xe0\u1af1\x88d\u0649\x91\xae,\x88\xdfn\xb0\xb2\xd3\xca\x00\x00\u07d4U\x8cTd\x9a\x8an\x94r+\xd6\xd2\x1d\x14qOqx\x054\x89lk\x93[\x8b\xbd@\x00\x00\u07d4U\x91\x940O\x14\xb1\xb9:\xfeDO\x06$\xe0S\xc2:\x00\t\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4U\x93\xc9\u0536ds\x0f\xd9<\xa6\x01Q\xc2\\.\xae\xd9<;\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4U\x97\x06\xc32\xd2\ay\xc4_\x8am\x04ji\x91Y\xb7I!\x89\x14\x9bD.\x85\xa3\u03c0\x00\u07d4U\x98\xb3\xa7\x9aH\xf3+\x1f_\xc9\x15\xb8{d]\x80]\x1a\xfe\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4U\xa3\xdfW\xb7\xaa\xec\x16\xa1b\xfdS\x16\xf3[\xec\b(!\u03c9j\xcb=\xf2~\x1f\x88\x00\x00\u07d4U\xa4\xca\xc0\u02cbX-\x9f\xef8\xc5\xc9\xff\xf9\xbdS\t=\x1f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4U\xa6\x1b\x10\x94\x80\xb5\xb2\xc4\xfc\xfd\xef\x92\xd9\x05\x84\x16\f\r5\x89\x02lVM+S\xf6\x00\x00\u07d4U\xaa]1>\xbb\bM\xa0\xe7\x80\x10\x91\u2792\xc5\xde\u00ea\x89lk\x93[\x8b\xbd@\x00\x00\u07d4U\xab\x99\xb0\xe0\xe5]{\xb8t\xb7\xcf\xe84\xdec\x1c\x97\xec#\x897\xe9\x8c\xe3h\x99\xe4\x00\x00\u07d4U\xaf\t/\x94\xbajy\x91\x8b\f\xf99\xea\xb3\xf0\x1b?Q\u01c9\b \xd5\xe3\x95v\x12\x00\x00\u07d4U\xc5dfAf\xa1\xed\xf3\x91>\x01i\xf1\xcdE\x1f\xdb]\f\x89\x82\x17\xeaIP\x8el\x00\x00\xe0\x94U\xcaj\xbey\xea$\x97\xf4o\u06f804`\x10\xfeF\x9c\xbe\x8a\x016\x9f\xb9a(\xacH\x00\x00\u07d4U\xca\xffK\xba\x04\xd2 \u0265\xd2\x01\x86r\xec\x85\xe3\x1e\xf8>\x89lk\x93[\x8b\xbd@\x00\x00\u07d4U\xd0W\xbc\xc0K\xd0\xf4\xaf\x96BQ:\xa5\t\v\xb3\xff\x93\xfe\x89;\xfeE,\x8e\xddL\x00\x00\u07d4U\xd4.\xb4\x95\xbfF\xa64\x99{_.\xa3b\x81I\x18\u2c09\x05\xc0\xd2e\xb5\xb2\xa8\x00\x00\u07d4U\u069d\xcd\xcaa\xcb\xfe\x1f\x13<{\xce\xfc\x86{\x9c\x81\"\xf9\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4U\xe2 \x87bb\xc2\x18\xafOVxG\x98\xc7\xe5]\xa0\x9e\x91\x89\a=\x99\xc1VE\xd3\x00\x00\u07d4U\xfd\b\u0440d\xbd ,\x0e\xc3\xd2\xcc\xe0\xce\v\x9d\x16\x9cM\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4V\x00s\nU\xf6\xb2\x0e\xbd$\x81\x1f\xaa=\xe9m\x16b\xab\xab\x89e\xea=\xb7UF`\x00\x00\u07d4V\x03$\x1e\xb8\xf0\x8fr\x1e4\x8c\x9d\x9a\xd9/H\u342a$\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4V\x056yJ\x9e+\x00I\xd1\x023\xc4\x1a\xdc_A\x8a&J\x8965\u026d\xc5\u07a0\x00\x00\u07d4V\aY\x00Y\xa9\xfe\xc1\x88\x11I\xa4K6\x94\x9a\xef\x85\xd5`\x89lk\x93[\x8b\xbd@\x00\x00\u07d4V\v\xec\xdfR\xb7\x1f=\x88'\xd9'a\x0f\x1a\x98\x0f3qo\x89\x17GMp_V\u0400\x00\xe0\x94V\r\xa3~\x95m\x86/\x81\xa7_\u0540\xa7\x13\\\x1b$cR\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94V\x0f\xc0\x8d\a\x9f\x04~\xd8\xd7\xdfuU\x1a\xa55\x01\xf5p\x13\x8a\x01\x9b\xff/\xf5yh\xc0\x00\x00\u07d4V\x1b\xe9)\x9b>k>c\xb7\x9b\t\x16\x9d\x1a\x94\x8a\xe6\xdb\x01\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94V \xe3\xedy-/\x185\xfe_UA}Q\x11F\fj\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4V \xf4m\x14Q\xc25=bC\xa5\u0534'\x13\v\xe2\xd4\a\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94V!\x05\xe8+\t\x975\xdeI\xf6&\x92\u0307\xcd8\xa8\xed\u034a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94V*\x8d\u02fe\xee\xf7\xb3`h]'0;\u059e\tJ\xcc\xf6\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4V+\xce\u04ca\xb2\xabl\b\x0f;\x05A\xb8Enp\x82K?\x89\"\xca5\x87\xcfN\xb0\x00\x00\xe0\x94V+\xe9Z\xba\x17\xc57\x1f\u2e82\x87\x99\xb1\xf5]!w\u058a\b\x16\xd3~\x87\xb9\xd1\xe0\x00\x00\u07d4V/\x16\u05da\xbf\xce\u00d4>4\xb2\x0f\x05\xf9{\xdf\u0366\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4V7=\xaa\xb4c\x16\xfd~\x15v\xc6\x1ej\xff\xcbeY\xdd\u05c9\v\xacq]\x14l\x9e\x00\x00\u07d4V9v8\xbb<\xeb\xf1\xf6 byK^\xb9B\xf9\x16\x17\x1d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4V:\x03\xab\x9cV\xb6\x00\xf6\xd2[f\f!\xe1c5Qzu\x8965\u026d\xc5\u07a0\x00\x00\u07d4V<\xb8\x80<\x1d2\xa2['\xb6A\x14\x85+\xd0M\x9c \u0349\v\x14\x9e\xad\n\xd9\xd8\x00\x00\u07d4VXc\x91\x04\fW\xee\xc6\xf5\xaf\xfd\x8c\u052b\xde\x10\xb5\n\u0309\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4Vl\x10\xd68\u8e0bG\xd6\xe6\xa4\x14Iz\xfd\xd0\x06\x00\u0509\x05k9Bc\xa4\f\x00\x00\u07d4Vl(\xe3L8\b\xd9vo\xe8B\x1e\xbfO+\x1cO}w\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4V\x8d\xf3\x18Vi\x9b\xb5\xac\xfc\x1f\xe1\u0580\u07d9`\xcaCY\x89J\xcfUR\xf3\xb2I\x80\x00\u07d4V\x91\xdd/gE\xf2\x0e\"\xd2\xe1\u0479U\xaa)\x03\xd6VV\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4V\xa1\xd6\r@\xf5\u007f0\x8e\xeb\xf0\x87\xde\xe3\xb3\u007f\x1e|,\xba\x89>\u072e\xc8-\x06\xf8\x00\x00\u07d4V\xac \xd6;\xd8\x03Y\\\xec\x03m\xa7\xed\x1d\xc6n\n\x9e\a\x89\x03w*S\xcc\xdce\x80\x00\u07d4V\xb6\xc2=\xd2\uc434r\x8f;\xb2\xe7d\xc3\xc5\f\x85\xf1D\x8965\u026d\xc5\u07a0\x00\x00\u07d4V\xdf\x05\xba\xd4l?\x00\xaeGn\xcf\x01{\xb8\xc8w8?\xf1\x89\n\xb1]\xaa\xefp@\x00\x00\u07d4V\xee\x19\u007fK\xbf\x9f\x1b\x06b\xe4\x1c+\xbd\x9a\xa1\xf7\x99\xe8F\x8965\u026d\xc5\u07a0\x00\x00\u07d4V\xf4\x93\xa3\xd1\b\xaa\xa2\u044d\x98\x92/\x8e\xfe\x16b\u03f7=\x89m\x81!\xa1\x94\xd1\x10\x00\x00\u07d4V\xfc\x1a{\xad@G#|\xe1\x16\x14b\x96#\x8e\a\x8f\x93\xad\x89\t\xa6?\b\xeac\x88\x00\x00\u07d4V\xfe\xbf\x9e\x10\x03\xaf\x15\xb1\xbdI\a\xec\b\x9aJ\x1b\x91\xd2h\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4W\x17\u0313\x01Q\x1dJ\x81\xb9\xf5\x83\x14\x8b\xee\xd3\xd3\u0303\t\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\u07d4W\x17\xf2\xd8\xf1\x8f\xfc\xc0\xe5\xfe$}:B\x19\x03|:d\x9c\x89\u063beI\xb0+\xb8\x00\x00\u07d4W\x19P\xea,\x90\xc1B}\x93\x9da\xb4\xf2\xdeL\xf1\u03ff\xb0\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4W\x19\xf4\x9br\r\xa6\x88V\xf4\xb9\xe7\b\xf2VE\xbd\xbcKA\x89\"\xb1\xc8\xc1\"z\x00\x00\x00\u07d4W*\xc1\xab\xa0\xde#\xaeA\xa7\xca\xe1\xdc\bB\u062b\xfc\x10;\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94W-\xd8\xcd?\xe3\x99\xd1\xd0\xec(\x121\xb7\xce\xfc \xb9\u4eca\x023\xc8\xfeBp>\x80\x00\x00\xe0\x94WI!\x83\x8c\xc7}l\x98\xb1}\x90::\xe0\xee\r\xa9[\u040a\vS(\x17\x8a\xd0\xf2\xa0\x00\x00\u07d4WJ\xd95S\x90\u421e\xf4*\xcd\x13\x8b*'\xe7\x8c\x00\xae\x89Tg\xb72\xa9\x134\x00\x00\u07d4WM\xe1\xb3\xf3\x8d\x91XF\xae7\x18VJZ\xda \xc2\xf3\xed\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94W\\\x00\u0081\x82\x10\u0085U\xa0\xff)\x01\x02\x89\xd3\xf8#\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94Ws\xb6\x02g!\xa1\xdd\x04\xb7\x82\x8c\xd6+Y\x1b\xfb4SL\x8a\x05\xb7\xacES\xdez\xe0\x00\x00\xe0\x94WwD\x1c\x83\xe0?\v\xe8\xdd4\v\xdechP\x84|b\v\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4Wx\xff\u071b\x94\u0165\x9e\"N\xb9e\xb6\u0790\xf2\"\xd1p\x89\x12-\u007f\xf3f\x03\xfc\x00\x00\u07d4Wz\xee\xe8\u053c\b\xfc\x97\xab\x15n\xd5\u007f\xb9p\x92Sf\xbe\x89\x12\r\xf1\x14rX\xbf\x00\x00\u07d4W{-\a\xe9\xcfRJ\x18\u04c9\x15Vak\x96\x06g\x00\x00\u07d4W\xd5\xfd\x0e=0I3\x0f\xfc\xdc\xd0 Ei\x17e{\xa2\u0689k\xf2\x01\x95\xf5T\xd4\x00\x00\u07d4W\u0754q\xcb\xfa&'\t\xf5\U00106f37t\xc5\xf5'\xb8\xf8\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4W\xdf#\xbe\xbd\xc6^\xb7_\ub732\xfa\xd1\xc0si++\xaf\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4X\x00\u03410\x83\x9e\x94I]-\x84\x15\xa8\xea,\x90\xe0\xc5\u02c9\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94X\x03\xe6\x8b4\xda\x12\x1a\xef\b\xb6\x02\xba\u06ef\xb4\xd1$\x81\u028a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\xe0\x94X\x16\xc2hww\xb6\xd7\u04a2C-Y\xa4\x1f\xa0Y\xe3\xa4\x06\x8a\x1cO\xe4:\xdb\n^\x90\x00\x00\u07d4X\x1a:\xf2\x97\xef\xa4Cj)\xaf\x00r\x92\x9a\xbf\x98&\xf5\x8b\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94X\x1b\x9f\xd6\xea\xe3r\xf3P\x1fB\xeb\x96\x19\xee\xc8 \xb7\x8a\x84\x8a\x04+\xe2\xc0\f\xa5;\x8d\x80\x00\u07d4X\x1b\xdf\x1b\xb2v\xdb\u0746\xae\xdc\xdb9z\x01\xef\xc0\xe0\f[\x8965\u026d\xc5\u07a0\x00\x00\u07d4X\x1f4\xb5#\xe5\xb4\x1c\t\xc8|)\x8e)\x9c\xbc\x0e)\xd0f\x89=X3\xaa\xfd9u\x80\x00\xe0\x94X$\xa7\xe2(8'q40\x8c_KP\u06b6^C\xbb1\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4X+pf\x9c\x97\xaa\xb7\u0581H\xd8\xd4\xe9\x04\x11\xe2\x81\rV\x8965f3\xeb\xd8\xea\x00\x00\u07d4X.|\xc4o\x1d{Nn\x9d\x95\x86\x8b\xfd7\x05s\x17\x8fL\x89lk\x93[\x8b\xbd@\x00\x00\u07d4X>\x83\xbaU\xe6~\x13\xe0\xe7o\x83\x92\xd8s\xcd!\xfb\xf7\x98\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4Xi\xfb\x86}q\xf18\u007f\x86;i\x8d\t\xfd\xfb\x87\u011b\\\x89\u01bb\xf8X\xb3\x16\b\x00\x00\u07d4X}hI\xb1h\xf6\xc33+z\xba\xe7\xeblB\xc3\u007fH\xbf\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4X\x87\xdcj3\xdf\xedZ\xc1\xed\xef\xe3^\xf9\x1a!b1\xac\x96\x89\r\x8drkqw\xa8\x00\x00\xe0\x94X\x8e\u0650\xa2\xaf\xf4J\x94\x10]X\xc3\x05%w5\xc8h\xac\x8a\x03h\xc8b:\x8bM\x10\x00\x00\u07d4X\xae-\xdc_L\x8a\u0697\xe0l\x00\x86\x17\x17g\xc4#\xf5\u05c9WG=\x05\u06ba\xe8\x00\x00\u07d4X\xae\xd6gJ\xff\xd9\xf6B3'*W\x8d\xd98k\x99\xc2c\x89\xb8Pz\x82\a( \x00\x00\xe0\x94X\xb8\b\xa6[Q\xe63\x89i\xaf\xb9^\xc7\a5\xe4Q\xd5&\x8a\bxK\xc1\xb9\x83z8\x00\x00\u07d4X\xb8\xae\x8fc\xef5\xed\ab\xf0\xb6#=J\xc1Nd\xb6M\x89lk\x93[\x8b\xbd@\x00\x00\u07d4X\xba\x15ie\x0e[\xbb\xb2\x1d5\xd3\xe1u\xc0\u05b0\xc6Q\xa9\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4X\xc5U\xbc)<\xdb\x16\xc66.\xd9z\xe9U\v\x92\xea\x18\x0e\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4X\xc6P\xce\xd4\v\xb6VA\xb8\xe8\xa9$\xa09\xde\xf4hT\u07c9\x01\x00\xbd3\xfb\x98\xba\x00\x00\u07d4X\xc9\aT\xd2\xf2\n\x1c\xb1\xdd3\x06%\xe0KE\xfaa\x9d\\\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94X\xe2\xf1\x12#\xfc\x827\xf6\x9d\x99\xc6(\x9c\x14\x8c\x06\x04\xf7B\x8a\x05\x15\n\xe8J\x8c\xdf\x00\x00\x00\u07d4X\xe5T\xaf=\x87b\x96 \xdaa\xd58\xc7\xf5\xb4\xb5LJ\xfe\x89FP\x9diE4r\x80\x00\u07d4X\xe5\xc9\xe3D\xc8\x06e\r\xac\xfc\x90M3\xed\xbaQ\a\xb0\u0789\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4X\xe6a\u043as\xd6\xcf$\t\x9aUb\xb8\b\xf7\xb3g;h\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94X\xf0[&%`P<\xa7a\xc6\x18\x90\xa4\x03_Lsr\x80\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4X\xfb\x94sd\xe7iWe6\x1e\xbb\x1e\x80\x1f\xfb\x8b\x95\xe6\u0409\n\u05ce\xbcZ\xc6 \x00\x00\u07d4Y\x01\x81\xd4E\x00{\u0407Z\xaf\x06\x1c\x8dQ\x159\x00\x83j\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Y\x02\xe4J\xf7i\xa8rF\xa2\x1e\a\x9c\b\xbf6\xb0n\xfe\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4Y\n\xcb\xda7)\f\r>\xc8O\xc2\x00\rv\x97\xf9\xa4\xb1]\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94Y\f\xcbY\x11\xcfx\xf6\xf6\"\xf55\xc4t7_J\x12\xcf\u03ca\x04<3\xc1\x93ud\x80\x00\x00\u07d4Y\x10\x10m\xeb\u0491\xa1\u0340\xb0\xfb\xbb\x8d\x8d\x9e\x93\xa7\xcc\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Y\x16\x17I\xfe\xdc\xf1\xc7!\xf2 -\x13\xad\xe2\xab\xcfF\v=\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94Y\x1b\xef1q\xd1\u0155w\x17\xa4\xe9\x8d\x17\xeb\x14,!NV\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4Y <\xc3u\x99\xb6H1*|\xc9\xe0m\xac\xb5\x89\xa9\xaej\x89\b\x0fyq\xb6@\x0e\x80\x00\u07d4Y&\x81q\xb83\xe0\xaa\x13\xc5KR\xcc\xc0B.O\xa0:\ub262\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94Y'w&\x1e;\xd8R\u010e\u0295\xb3\xa4L[\u007f-B,\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4Y0Dg\x0f\xae\xff\x00\xa5[Z\xe0Q\xeb{\xe8p\xb1\x16\x94\x89\a?u\u0460\x85\xba\x00\x00\xe0\x94Y;E\xa1\x86J\xc5\xc7\xe8\xf0\u02ae\xba\r\x87<\xd5\xd1\x13\xb2\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4Y_^\xdajV\xf1N%\xe0\xc6\xf3\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4Z\x1a3ib\xd6\xe0\xc601\u0303\u01a5\u01a6\xf4G\x8e\u02c965\u026d\xc5\u07a0\x00\x00\u07d4Z\x1d--\x1dR\x03\x04\xb6 \x88IW\x047\xeb0\x91\xbb\x9f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4Z&s1\xfa\xcb&-\xaa\xec\xd9\xddc\xa9p\f_RY\u07c9\x05k\xc7^-c\x10\x00\x00\xe0\x94Z(WU9\x1e\x91NX\x02_\xaaH\xcch_O\xd4\xf5\xb8\x8a\x05\x81v{\xa6\x18\x9c@\x00\x00\u07d4Z)\x16\xb8\xd2\xe8\xcc\x12\xe2\a\xabFMC>#p\xd8#\u0649lk\x93[\x8b\xbd@\x00\x00\u07d4Z+\x1c\x85:\xeb(\xc4U9\xafv\xa0\n\xc2\u0628$(\x96\x89\x01Z\xf1\u05cbX\xc4\x00\x00\u07d4Z-\xaa\xb2\\1\xa6\x1a\x92\xa4\xc8,\x99%\xa1\xd2\xefXX^\x89\f8\r\xa9\u01d5\f\x00\x00\u07d4Z0\xfe\xac7\xac\x9fr\u05f4\xaf\x0f+\xc79R\xc7O\xd5\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4ZTh\xfa\\\xa2&\xc7S.\xcf\x06\xe1\xbc\x1cE\"]~\u0249g\x8a\x93 b\xe4\x18\x00\x00\u07d4ZVR\x857JI\xee\xddPL\x95}Q\bt\xd0\x04U\xbc\x89\x05k\xc7^-c\x10\x00\x00\u07d4Z^\xe8\xe9\xbb\x0e\x8a\xb2\xfe\xcbK3\u0494x\xbeP\xbb\xd4K\x89*\x11)\u0413g \x00\x00\xe0\x94Z_\x85\b\xda\x0e\xbe\xbb\x90\xbe\x903\xbdM\x9e'A\x05\xae\x00\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4Z`q\xbc\xeb\xfc\xbaJ\xb5\u007fM\xb9o\u01e6\x8b\xec\xe2\xba[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Z`\xc9$\x16(s\xfc~\xa4\xda\u007f\x97.5\x01g7`1\x89\x04\x87\xf2w\xa8\x85y\x80\x00\u07d4Zf\x86\xb0\xf1~\a\xed\xfcY\xb7Y\xc7}[\xef\x16M8y\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4Zp\x10o \xd6?\x87Re\xe4\x8e\r5\xf0\x0e\x17\xd0+\u0249\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794Zt\xbab\xe7\xc8\x1a4t\xe2}\x89O\xed3\xdd$\xad\x95\xfe\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94Zw5\x00}p\xb0hD\u0699\x01\xcd\xfa\xdb\x11\xa2X,/\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4Z\x82\xf9l\u0537\xe2\xd9=\x10\xf3\x18]\xc8\xf4=Ku\xaai\x89lc?\xba\xb9\x8c\x04\x00\x00\u07d4Z\x87\xf04\xe6\xf6\x8fNt\xff\xe6\fd\x81\x946\x03l\xf7\u05c9\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94Z\x89\x11U\xf5\x0eB\aCt\xc79\xba\xad\xf7\xdf&Q\x15:\x8a\x01\x02\xdao\xd0\xf7:<\x00\x00\u07d4Z\x9c\x8bi\xfcaMiVI\x99\xb0\r\xcbB\xdbg\xf9~\x90\x89\xb9\xe6\x15\xab\xad:w\x80\x00\xe0\x94Z\xaf\x1c1%Jn\x00_\xba\u007fZ\xb0\xecy\xd7\xfc+c\x0e\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4Z\xb1\xa5aSH\x00\x1c|w]\xc7WHf\x9b\x8b\xe4\xde\x14\x89%jr\xfb)\xe6\x9c\x00\x00\xe1\x94Z\xbf\xec%\xf7L\u06047c\x1aw1\x90i2wcV\xf9\x8b\t\xd8<\xc0\u07e1\x11w\xff\x80\x00\u07d4Z\u0090\x8b\x0f9\x8c\r\xf5\xba\xc2\xcb\x13\xcas\x14\xfb\xa8\xfa=\x89\n\xd4\xc81j\v\f\x00\x00\xe0\x94Z\u025a\u05c1j\xe9\x02\x0f\xf8\xad\xf7\x9f\xa9\x86\x9b|\xeaf\x01\x8a\x04ri\x8bA;C \x00\x00\u07d4Z\xd1,^\xd4\xfa\x82~!P\u03e0\u058c\n\xa3{\x17i\xb8\x89+^:\xf1k\x18\x80\x00\x00\xe0\x94Z\xd5\xe4 uV\x13\x88o5\xaaV\xac@>\xeb\xdf\xe4\xb0\u040a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4Z\xdew\xfd\x81\xc2\\\n\xf7\x13\xb1\a\x02v\x8c\x1e\xb2\xf9u\xe7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4Z\xe6N\x85;\xa0\xa5\x12\x82\u02cd\xb5.Aa^|\x9fs?\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Z\xed\x0el\xfe\x95\xf9\u0580\xc7dr\xa8\x1a+h\n\u007f\x93\xe2\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4Z\xef\x16\xa2&\xddh\a\x1f$\x83\xe1\xdaBY\x83\x19\xf6\x9b,\x89lk\x93[\x8b\xbd@\x00\x00\u07d4Z\xf4j%\xac\t\xcbsakS\xb1O\xb4/\xf0\xa5\x1c\u0772\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4Z\xf7\xc0r\xb2\u016c\xd7\x1cv\xad\xdc\xceS\\\xf7\xf8\xf95\x85\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94Z\xfd\xa9@\\\x8e\x976QEt\u0692\x8d\xe6tV\x01\t\x18\x8a\x01E\xb8\xb0#\x9aF\x92\x00\x00\u07d4[\x06\xd1\xe6\x93\f\x10Ti+y\xe3\xdb\xe6\xec\xceS\x96d \x89\v\"\u007fc\xbe\x81<\x00\x00\u07d4[%\xca\xe8m\xca\xfa*`\xe7r61\xfc_\xa4\x9c\x1a\xd8}\x89\x87\fXQ\x0e\x85 \x00\x00\u07d4[(|~sB\x99\xe7'bo\x93\xfb\x11\x87\xa6\rPW\xfe\x89\x05|\xd94\xa9\x14\xcb\x00\x00\u07d4[)\f\x01\x96|\x81.M\xc4\xc9\v\x17L\x1b@\x15\xba\xe7\x1e\x89\b \xeb4\x8dR\xb9\x00\x00\u07d4[+d\xe9\xc0X\u30a8\xb2\x99\"N\xec\xaa\x16\xe0\x9c\x8d\x92\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\xe0\x94[./\x16\x18U.\xab\r\xb9\x8a\xddUc|)Q\xf1\xfb\x19\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4[0`\x8cg\x8e\x1a\xc4d\xa8\x99L;3\xe5\xcd\xf3Iq\x12\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4[36\x96\xe0L\xca\x16\x92\xe7\x19\x86W\x9c\x92\rk)\x16\xf9\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94[C\rw\x96\x96\xa3e?\xc6\x0et\xfb\u02ec\xf6\xb9\u00ba\xf1\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4[Cse\xae:\x9a/\xf9|h\xe6\xf9\nv \x18\x8c}\x19\x89l\x87T\xc8\xf3\f\b\x00\x00\u07d4[I\xaf\xcduDx8\xf6\xe7\xce\u068d!w}O\xc1\xc3\xc0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4[L\f`\xf1\x0e\u0489K\xdbB\xd9\xdd\x1d!\x05\x87\x81\n\r\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4[N\xa1m\xb6\x80\x9b\x03R\u0536\xe8\x1c9\x13\xf7jQ\xbb2\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4[[\xe0\xd8\xc6rv\xba\xab\xd8\xed\xb3\rH\xeaud\v\x8b)\x89,\xb1\xf5_\xb7\xbe\x10\x00\x00\u07d4[]Qp)2\x15b\x11\x1bC\bm\v\x045\x91\x10\x9ap\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\xe0\x94[]\x8c\x8e\xedl\x85\xac!Va\xde\x02fv\x82?\xaa\n\f\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4[mU\xf6q)g@\\e\x91)\xf4\xb1\xde\t\xac\xf2\xcb{\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4[p\u011c\u024b=\xf3\xfb\xe2\xb1Y\u007f\\\x1bcG\xa3\x88\xb7\x894\x95tD\xb8@\xe8\x00\x00\u07d4[sn\xb1\x83Sb\x9b\u0796v\xda\xdd\x16P4\xce^\xcch\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4[u\x9f\xa1\x10\xa3\x1c\x88F\x9fT\xd4K\xa3\x03\xd5}\xd3\xe1\x0f\x89[F\xdd/\x0e\xa3\xb8\x00\x00\u07d4[w\x84\xca\xea\x01y\x9c\xa3\x02'\x82vg\xce |\\\xbcv\x89lk\x93[\x8b\xbd@\x00\x00\u07d4[x\xec\xa2\u007f\xbd\xeao&\xbe\xfb\xa8\x97+)^x\x146K\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94[\x80\v\xfd\x1b>\u0525}\x87Z\xed&\xd4/\x1aw\b\xd7*\x8a\x01Z\x82\xd1\u057b\x88\xe0\x00\x00\u07d4[\x85\xe6\x0e*\xf0TO/\x01\xc6N 2\x90\x0e\xbd8\xa3\u01c9lk\x93[\x8b\xbd@\x00\x00\u07d4[\xa2\xc6\xc3]\xfa\xec)h&Y\x19\x04\xd5DFJ\xea\xbd^\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94[\xafmt\x96 \x80>\x83H\xaf7\x10\xe5\xc4\xfb\xf2\x0f\u0214\x8a\x01\x0f@\x02a]\xfe\x90\x00\x00\u07d4[\xc1\xf9U\a\xb1\x01\x86B\xe4\\\xd9\xc0\xe2'3\xb9\xb1\xa3&\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94[\xd25GG\u007fm\t\u05f2\xa0\x05\xc5\xeee\fQ\fV\u05ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4[\xd2J\xac6\x12\xb2\f`\x9e\xb4gy\xbf\x95i\x84\a\xc5|\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4[\u0586-Q}M\xe4U\x9dN\xec\n\x06\xca\xd0^/\x94n\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4[\xe0EQ*\x02n?\x1c\xeb\xfdZ~\xc0\xcf\xc3o-\xc1k\x89\x06\x81U\xa46v\xe0\x00\x00\xe0\x94[\xf9\xf2\"nZ\xea\xcf\x1d\x80\xae\nY\xc6\xe3\x808\xbc\x8d\xb5\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4[\xfa\xfe\x97\xb1\xdd\x1dq+\xe8mA\xdfy\x89SE\x87Z\x87\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\\\x0f.Q7\x8fk\r{\xabas1X\vn9\xad<\xa5\x8a\x02\bj\xc3Q\x05&\x00\x00\x00\u07d4\\)\xf9\xe9\xa5#\xc1\xf8f\x94H\xb5\\H\xcb\xd4|%\xe6\x10\x894F\xa0\xda\xd0L\xb0\x00\x00\xe0\x94\\0\x8b\xacHW\xd3;\xae\xa0t\xf3\x95m6!\xd9\xfa(\xe1\x8a\x01\x0f\b\xed\xa8\xe5U\t\x80\x00\u07d4\\1*V\u01c4\xb1\"\t\x9bvM\x05\x9c!\xec\xe9^\x84\u0289\x05&c\u032b\x1e\x1c\x00\x00\u07d4\\1\x99m\xca\xc0\x15\xf9\xbe\x98[a\x1fF\x870\xef$M\x90\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\\24W\xe1\x87v\x1a\x82v\xe3Y\xb7\xb7\xaf?;n=\xf6\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\\<\x1cd[\x91uC\x11;>l\x1c\x05M\xa1\xfet+\x9a\x89+^:\xf1k\x18\x80\x00\x00\u0794\\=\x19D\x1d\x19l\xb4Cf \xfc\xad\u007f\xbby\xb2\x9ex\x88\xc6s\xce<@\x16\x00\x00\u07d4\\?V\u007f\xaf\xf7\xba\u0475\x12\x00\"\xe8\xcb\u02a8+I\x17\xb3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\\Ch\x91\x8a\xced\t\u01de\u0280\u036a\xe49\x1d+bN\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\\FA\x97y\x1c\x8a=\xa3\xc9%Co'z\xb1;\xf2\xfa\xa2\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\\H\x81\x16\\\xb4+\xb8.\x979l\x8e\xf4J\xdb\xf1s\xfb\x99\x89\x05\xfe\xe2\"\x04\x1e4\x00\x00\xe0\x94\\H\x92\x90z\a \xdfo\xd3A>c\xffv}k9\x80#\x8a\x02\xcb\x00\x9f\u04f5y\x0f\x80\x00\u07d4\\O$\xe9\x94\ud3c5\x0e\xa7\x81\x8fG\x1c\x8f\xac;\xcf\x04R\x89]\x80h\x8d\x9e1\xc0\x00\x00\u07d4\\T\x19V\\:\xadNqN\a92\x8e5!\u024f\x05\u0309\x1c\x9fx\u0489>@\x00\x00\u07d4\\a6\xe2\x18\xde\na\xa17\xb2\xb3\x96-*a\x12\xb8\t\u05c9\x0f\xf3\u06f6_\xf4\x86\x80\x00\xe0\x94\\a\xaby\xb4\b\xdd2)\xf6bY7\x05\xd7/\x1e\x14{\xb8\x8a\x04\xd0$=4\x98\u0344\x00\x00\u07d4\\m\x04\x1d\xa7\xafD\x87\xb9\xdcH\xe8\xe1\xf6\af\u0425m\xbc\x89O\a\n\x00>\x9ct\x00\x00\u07d4\\o6\xaf\x90\xab\x1aeln\xc8\xc7\xd5!Q'b\xbb\xa3\xe1\x89lh\xcc\u041b\x02,\x00\x00\u07d4\\{\x9e\u01e2C\x8d\x1eD*\x86\x0f\x8a\x02\x1e\x18\x99\xf07z\xea\x00\x00\u07d4\\\xcc\xf1P\x8b\xfd5\xc2\x050\xaad%\x00\xc1\r\xeee\xea\xed\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4\\\xcer\xd0h\xc7\xc3\xf5[\x1d(\x19T^w1|\xae\x82@\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\\\xd0\xe4u\xb5D!\xbd\xfc\f\x12\xea\x8e\b+\u05e5\xaf\nj\x89\x032\xca\x1bg\x94\f\x00\x00\u07d4\\\u0548\xa1N\xc6H\xcc\xf6G)\xf9\x16z\xa7\xbf\x8b\xe6\xeb=\x8965\u026d\xc5\u07a0\x00\x00\u07d4\\\u062f`\xdee\xf2M\xc3\xceW0\xba\x92e0\"\xdcYc\x89a\t=|,m8\x00\x00\u07d4\\\xdcG\b\xf1O@\xdc\xc1Zy_}\xc8\xcb\v\u007f\xaa\x9en\x89\x1d\x1c_>\xda \xc4\x00\x00\u07d4\\\u0d86,\u0391b\xe8~\bI\xe3\x87\xcb]\xf4\xf9\x11\x8c\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94\\\xe2\xe7\u03aa\xa1\x8a\xf0\xf8\xaa\xfa\u007f\xba\xd7L\u021e<\xd46\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\\\xe4@h\xb8\xf4\xa3\xfey\x9ej\x83\x11\xdb\xfd\xed\xa2\x9d\xee\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u0794\\\xeb\xe3\v*\x95\xf4\xae\xfd\xa6ee\x1d\xc0\xcf~\xf5u\x81\x99\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\\\xf1\x8f\xa7\u0227\xc0\xa2\xb3\xd5\xef\u0459\x0fd\xdd\xc5i$,\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\\\xf4N\x10T\reqd#\xb1\xbc\xb5B\xd2\x1f\xf8:\x94\u034a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\\\xf8\xc0>\xb3\xe8r\xe5\x0f|\xfd\f/\x8d;?,\xb5\x18:\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\\\xfa\x8dV\x85ue\x8c\xa4\xc1\xa5\x93\xacL]\x0eD\xc6\aE\x89\x0f\xc6o\xae7F\xac\x00\x00\u07d4\\\xfa\x98w\xf7\x19\u01dd\x9eIJ\b\xd1\xe4\x1c\xf1\x03\xfc\x87\u0249\n\u05ce\xbcZ\xc6 \x00\x00\u07d4]\x1d\xc38{G\xb8E\x1eU\x10l\f\xc6}m\xc7+\u007f\v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4]#\x1ap\xc1\xdf\xeb6\n\xbd\x97\xf6\x16\xe2\xd1\r9\xf3\u02b5\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4]$\xbd\xbc\x1cG\xf0\xeb\x83\xd1(\xca\xe4\x8a\xc3\xf4\xb5\x02bt\a\xda'/g\x81Jk\xec\u0509\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4]\x83\xb2\x1b\xd2q#`Ckg\xa5\x97\xee3x\xdb>z\xe4\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94]\x87+\x12.\x99N\xf2|q\xd7\u07b4W\xbfeB\x9e\xcal\x8a\x01\xb1\xad\xed\x81\u04d4\x10\x80\x00\xe0\x94]\x8d1\xfa\xa8d\xe2!Y\xcdoQu\xcc\xec\xc5?\xa5Mr\x8a\x05\xb6\x96\xb7\r\xd5g\x10\x00\x00\xe0\x94]\x95\x8a\x9b\u0449\u0098_\x86\u014a\x8ci\xa7\xa7\x88\x06\xe8\u068a\x02(\xf1o\x86\x15x`\x00\x00\u07d4]\xa2\xa9\xa4\xc2\xc0\xa4\xa9$\xcb\xe0\xa5:\xb9\xd0\xc6'\xa1\u03e0\x89'\xbf8\xc6TM\xf5\x00\x00\u07d4]\xa4\u0288\x93\\'\xf5\\1\x10H\x84\x0eX\x9e\x04\xa8\xa0I\x89\x04V9\x18$O@\x00\x00\u07d4]\xa5G\x85\u027d0W\\\x89\u07b5\x9d A\xd2\n9\xe1{\x89j\xa2\t\xf0\xb9\x1de\x80\x00\xe0\x94]\xb6\x9f\xe9>o\xb6\xfb\xd4P\x96k\x97#\x8b\x11\n\xd8'\x9a\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4]\xb7\xbb\xa1\xf9W?$\x11]\x8c\x8cb\xe9\u0388\x95\x06\x8e\x9f\x89\x02\xb5\xaa\xd7,e \x00\x00\xe0\x94]\xb8D\x00W\x00i\xa9W<\xab\x04\xb4\u6d955\xe2\x02\xb8\x8a\x02\r\u058a\xaf2\x89\x10\x00\x00\u07d4]\xc3m\xe55\x94P\xa1\xec\t\xcb\fD\xcf+\xb4+:\xe45\x89<\x94m\x89;3\x06\x00\x00\u07d4]\xc6\xf4_\xef&\xb0n3\x021?\x88M\xafH\xe2to\xb9\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94]\u0376\xb8zP\xa9\xde\x02C\x80\x00\x00\u07d4^Q\xb8\xa3\xbb\t\xd3\x03\xea|\x86\x05\x15\x82\xfd`\x0f\xb3\xdc\x1a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794^X\xe2U\xfc\x19\x87\n\x040_\xf2\xa0F1\xf2\xff)K\xb1\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4^ZD\x19t\xa8=t\u0187\xeb\xdcc?\xb1\xa4\x9e{\x1a\u05c9\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4^eE\x8b\xe9d\xaeD\x9fqw7\x04\x97\x97f\xf8\x89\x87a\x89\x1c\xa7\xccs[o|\x00\x00\u07d4^g\u07c9i\x10\x1a\u06bd\x91\xac\xcdk\xb1\x99\x12t\xaf\x8d\xf2\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4^n\x97G\xe1b\xf8\xb4\\en\x0fl\xaez\x84\xba\xc8\x0eN\x89lk\x93[\x8b\xbd@\x00\x00\u07d4^s\x1bU\xce\xd4R\xbb??\xe8q\xdd\xc3\xed~\xe6Q\n\x8f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4^t\xed\x80\xe9eW\x88\xe1\xbb&\x97R1\x96g\xfeuNZ\x89\x03\t'\xf7L\x9d\xe0\x00\x00\u07d4^w.'\xf2\x88\x00\xc5\r\u0697;\xb3>\x10v.n\xea \x89a\t=|,m8\x00\x00\u07d4^{\x8cT\xdcW\xb0@ bq\x9d\xee~\xf5\xe3~\xa3]b\x89\x9b\xf9\x81\x0f\xd0\\\x84\x00\x00\u07d4^\u007fp7\x87uX\x9f\xc6j\x81\xd3\xf6S\xe9T\xf5U`\ub243\xf2\x89\x18\x1d\x84\xc8\x00\x00\xe0\x94^\x80n\x84W0\xf8\a>l\xc9\x01\x8e\xe9\x0f\\\x05\xf9\t\xa3\x8a\x02\x01\xe9m\xac\u03af \x00\x00\u07d4^\x8eM\xf1\x8c\xf0\xafw\tx\xa8\u07cd\xac\x90\x93\x15\x10\xa6y\x89lk\x93[\x8b\xbd@\x00\x00\u07d4^\x90\xc8Xw\x19\x87V\xb06l\x0e\x17\xb2\x8eR\xb4FPZ\x89\x14JJ\x18\xef\xebh\x00\x00\u07d4^\x95\xfe_\xfc\xf9\x98\xf9\xf9\xac\x0e\x9a\x81\u06b8>\xadw\x00=\x89\x1dB\xc2\r2y\u007f\x00\x00\u07d4^\xad)\x03z\x12\x89dx\xb1)j\xb7\x14\xe9\u02d5B\x8c\x81\x89\x03\xe0C\a-@n\x00\x00\u07d4^\xb3q\xc4\a@lB{;}\xe2q\xad<\x1e\x04&\x95y\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4^\u037a\xea\xb9\x10o\xfe]{Q\x96\x96`\x9a\x05\xba\ub16d\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4^\xd0\xd63\x85Y\xefD\xdcza\xed\xeb\x89?\xa5\xd8?\xa1\xb5\x89\v\xed\x1d\x02c\xd9\xf0\x00\x00\xe0\x94^\u04fb\xc0R@\xe0\u04d9\xebm\xdf\xe6\x0fb\xdeM\x95\t\xaf\x8a)\x14\xc0$u\xf9\xd6\xd3\x00\x00\u0594^\xd3\xf1\xeb\xe2\xaegV\xb5\xd8\xdc\x19\xca\xd0,A\x9a\xa5w\x8b\x80\u07d4^\xd5a\x15\xbde\x05\xa8\x82s\xdf\\V\x83\x94p\xd2J-\xb7\x89\x03\x8ee\x91\xeeVf\x80\x00\xe0\x94^\xf8\xc9a\x86\xb3y\x84\xcb\xfe\x04\u0158@n;\n\xc3\x17\x1f\x8a\x01\xfd\x934\x94\xaa_\xe0\x00\x00\u07d4^\xfb\xdf\xe58\x99\x99c<&`Z[\xfc,\x1b\xb5\x95\x93\x93\x89\x03\xc0W\xc9\\\xd9\b\x00\x00\xe0\x94_\x13\x15F1Fm\xcb\x13S\u0210\x93*|\x97\xe0\x87\x8e\x90\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4_\x16z\xa2B\xbcL\x18\x9a\xde\xcb:\u0127\xc4R\xcf\x19/\u03c9lkLM\xa6\u077e\x00\x00\xe0\x94_\x1c\x8a\x04\xc9\rs[\x8a\x15)\t\xae\xaeco\xb0\xce\x16e\x8a\x01{x'a\x8cZ7\x00\x00\u07d4_#\xba\x1f7\xa9lE\xbcI\x02YS\x8aT\u008b\xa3\xb0\u0549A\rXj \xa4\xc0\x00\x00\u07d4_&\xcf4Y\x9b\xc3n\xa6{\x9ez\x9f\x9bC0\xc9\xd5B\xa3\x8965\u026d\xc5\u07a0\x00\x00\u07d4_)\xc9\xdev]\xde%\x85*\xf0}3\xf2\xceF\x8f\xd2\t\x82\x89lk\x93[\x8b\xbd@\x00\x00\u07d4_/\a\xd2\u0597\xe8\xc5g\xfc\xfd\xfe\x02\x0fI\xf3`\xbe!9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4_2\x1b=\xaa\xa2\x96\xca\xdf)C\x9f\x9d\xab\x06*K\xff\xed\u0589\x04p%\x90>\xa7\xae\x00\x00\u07d4_3:;#\x10vZ\r\x182\xb9\xbeL\n\x03pL\x1c\t\x8965\u026d\xc5\u07a0\x00\x00\u07d4_4K\x01\xc7\x19\x1a2\xd0v*\xc1\x88\xf0\xec-\xd4`\x91\x1d\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94_6>\n\xb7G\xe0-\x1b;f\xab\xb6\x9e\xa5<{\xafR:\x8a\x02w\x01s8\xa3\n\xe0\x00\x00\u07d4_7[\x86`\f@\u0328\xb2gkz\x1a\x1d\x16D\xc5\xf5,\x89\x04F\x18\xd7Lb?\x00\x00\u07d4_>\x1eg9\xb0\xc6\"\x00\xe0\n\x006\x91\xd9\xef\xb28\u061f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4_H?\xfb\x8fh\n\xed\xf2\xa3\x8fx3\xaf\xdc\xdeY\xb6\x1eK\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94_J\xceL\x1c\xc13\x91\xe0\x1f\x00\xb1\x98\xe1\xf2\v_\x91\xcb\xf5\x8a\x01\x0f\x0f\xa8\xb9\u04c1\x1a\x00\x00\xe0\x94_R\x12\x82\xe9\xb2x\u070c\x03Lr\xafS\xee)\xe5D=x\x8a\x01as-/\x8f:\xe0\x00\x00\u07d4_h\xa2L~\xb4\x11vgs{39?\xb3\xc2\x14\x8aS\xb6\x89\x02\xce\u0791\x8dE<\x00\x00\u07d4_p\x8e\xaf9\xd8#\x94lQ\xb3\xa3\u9df3\xc0\x03\xe2cA\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4_t.H~:\xb8\x1a\xf2\xf9J\xfd\xbe\x1b\x9b\x8f\\\u0301\xbc\x89u\xc4E\xd4\x11c\xe6\x00\x00\u07d4_t\xed\x0e$\xff\x80\u0672\u0124K\xaa\x99uB\x8c\u05b95\x89\xa1\x8b\xce\xc3H\x88\x10\x00\x00\u07d4_v\xf0\xa3\x06&\x9cx0k=e\r\xc3\xe9\xc3p\x84\xdba\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4_w\xa1\a\xab\x12&\xb3\xf9_\x10\ue0ee\xfcl]\xff>\u0709\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4_{;\xba\xc1m\xab\x83\x1aJ\x0f\xc5;\fT\x9d\xc3l1\u0289i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94_\x93\xff\x83't\xdbQ\x14\xc5[\xb4\xbfD\xcc\U000f53d0?\x8a(\xa9\xc9\x1a&4X)\x00\x00\u07d4_\x96\x16\xc4{Jg\xf4\x06\xb9Z\x14\xfeo\xc2h9o\x17!\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4_\x98\x109\xfc\xf5\x02%\xe2\xad\xf7bu!\x12\xd1\xcc&\xb6\xe3\x89\x1b\x1aAj!S\xa5\x00\x00\u07d4_\x99\u070eI\xe6\x1dW\xda\xef`j\xcd\xd9\x1bMp\a2j\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4_\xa6\x1f\x15-\xe6\x125\x16\xc7Q$)y(_yj\u01d1\x89\v\x0f\x11\x97)c\xb0\x00\x00\u07d4_\xa7\xbf\xe0C\x88a'\xd4\x01\x1d\x83V\xa4~\x94yc\xac\xa8\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94_\xa8\xa5Nh\x17lO\xe2\xc0\x1c\xf6q\xc5\x15\xbf\xbd\xd5(\xa8\x8aE\xe1U\xfa\x01\x10\xfa@\x00\x00\u07d4_\xad\x96\x0fk,\x84V\x9c\x9fMG\xbf\x19\x85\xfc\xb2\xc6]\xa6\x8965f3\xeb\xd8\xea\x00\x00\u07d4_\xc6\xc1\x14&\xb4\xa1\xea\xe7\xe5\x1d\xd5\x12\xad\x10\x90\xc6\xf1\xa8[\x89\x93\xfe\\W\xd7\x10h\x00\x00\u07d4_\u0344Th\x96\xdd\b\x1d\xb1\xa3 \xbdM\x8c\x1d\xd1R\x8cL\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4_\u0368G\xaa\xf8\xd7\xfa\x8b\xca\b\x02\x9c\xa2\x84\x91f\xaa\x15\xa3\x89!\u02b8\x12Y\xa3\xbf\x00\x00\u07d4_\xd1\xc3\xe3\x17x'l\xb4.\xa7@\xf5\xea\xe9\xc6A\xdb\xc7\x01\x89\n\x84Jt$\xd9\xc8\x00\x00\u07d4_\xd3\xd6w~\xc2b\n\xe8:\x05R\x8e\xd4%\a-<\xa8\xfd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4_\xd9s\xaf6j\xa5\x15|Te\x9b\u03f2|\xbf\xa5\xac\x15\u0589\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4_\xe7w\x03\x80\x8f\x82>l9\x93R\x10\x8b\xdb,R|\xb8|\x89j@v\xcfy\x95\xa0\x00\x00\xe0\x94_\xecI\xc6e\xe6N\xe8\x9d\xd4A\xeet\x05n\x1f\x01\xe9(p\x8a\x01V\x9b\x9es4t\xc0\x00\x00\u07d4_\xf3&\xcd`\xfd\x13k$^)\xe9\bzj\u04e6R\u007f\r\x89e\xea=\xb7UF`\x00\x00\u07d4_\xf9=\xe6\xee\x05L\xadE\x9b-^\xb0\xf6\x87\x03\x89\xdf\xcbt\x89\v\xed\x1d\x02c\xd9\xf0\x00\x00\u07d4`\x06\xe3m\x92\x9b\xf4]\x8f\x16#\x1b\x12j\x01\x1a\xe2\x83\xd9%\x89\t\x8a}\x9b\x83\x14\xc0\x00\x00\u07d4`!\xe8Z\x88\x14\xfc\xe1\xe8*A\xab\xd1\u04f2\xda\xd2\xfa\xef\xe0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4`8t\n\xe2\x8df\xba\x93\xb0\xbe\bH+2\x05\xa0\xf7\xa0{\x89\x11!a\x85\u009fp\x00\x00\u07d4`?/\xabz\xfbn\x01{\x94v`i\xa4\xb4;8\x96I#\x89Y\xd2\xdb$\x14\u0699\x00\x00\u07d4`B'm\xf2\x98?\xe2\xbcGY\xdc\x19C\xe1\x8f\xdb\xc3Ow\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4`B\xc6D\xba\xe2\xb9o%\xf9M1\xf6x\xc9\r\xc9f\x90\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4`L\xdf\x18b\x8d\xbf\xa82\x91\x94\xd4x\xddR\x01\xee\xccK\xe7\x89\x01?0j$\t\xfc\x00\x00\u07d4`N\x94w\xeb\xf4r|t[\u02bb\xed\xcbl\xcf)\x99@\"\x8966\x9e\xd7t}&\x00\x00\u07d4`gm\x1f\xa2\x1f\xca\x05\"\x97\xe2K\xf9c\x89\u0171*p\u05c9\r\x17|Zzh\xd6\x00\x00\u07d4`gn\x92\u044b\x00\x05\t\xc6\x1d\xe5@\xe6\xc5\u0776v\xd5\t\x89A\rXj \xa4\xc0\x00\x00\u07d4`o\x17q!\xf7\x85\\!\xa5\x06#0\xc8v\"d\xa9{1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4`\x86B6\x93\r\x04\xd8@+]\xcb\xeb\x80\u007f<\xafa\x1e\xa2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4`\xabq\xcd&\xeamnY\xa7\xa0\xf6'\xee\a\x9c\x88^\xbb\xf6\x89\x01s\x17\x90SM\xf2\x00\x00\u07d4`\xaf\x0e\xe1\x18D<\x9b7\xd2\xfe\xadw\xf5\xe5!\u07be\x15s\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4`\xb3X\xcb=\xbe\xfa7\xf4}\xf2\xd76X@\u068e;\u024c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4`\xb8\u05b7;ySO\xb0\x8b\xb8\xcb\xce\xfa\xc7\xf3\x93\xc5{\xfe\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4`\xbeo\x95?*M%\xb6%o\xfd$#\xac\x148%.N\x89\b!\xab\rD\x14\x98\x00\x00\u0794`\xc3qO\xdd\xdbcFY\u48b1\xeaB\xc4r\x8c\u01f8\xba\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4`\xcc=D^\xbd\xf7j}z\xe5q\u0197\x1d\xffh\u0305\x85\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94`\xd5fq@\xd1&\x14\xb2\x1c\x8e^\x8a3\b.2\xdf\xcf#\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4`\xde\"\xa1Pt2\xa4{\x01\xcch\xc5*\v\xf8\xa2\xe0\u0418\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4`\xe0\xbd\u0422Y\xbb\x9c\xb0\x9d?7\xe5\u034b\x9d\xac\uafca\x89JD\x91\xbdm\xcd(\x00\x00\u07d4`\xe3\xccC\xbc\xdb\x02j\xadu\x9cpf\xf5U\xbb\xf2\xacf\xf5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a\x04+\x80\xfd`\x95\u0478{\xe2\xf0\x0f\x10\x9f\xab\xaf\xd1W\xa6\x89\x05k\xc7^-c\x10\x00\x00\u07d4a\a\xd7\x1d\xd6\xd0\xee\xfb\x11\xd4\xc9\x16@L\xb9\x8cu>\x11}\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a\x0f\xd6\xeeN\xeb\xab\x10\xa8\xc5]\vK\xd2\xe7\xd6\xef\x81qV\x89\x01\x15\x95a\x06]]\x00\x00\u07d4a\x14\xb0\xea\xe5Wi\x03\xf8\v\xfb\x98\x84-$\xed\x92#\u007f\x1e\x89\x05k\xc7^-c\x10\x00\x00\u07d4a!\xaf9\x8a[-\xa6\x9fe\xc68\x1a\xec\x88\u039c\xc6D\x1f\x89\"\xb1\xc8\xc1\"z\x00\x00\x00\u07d4a&g\xf1r\x13[\x95\v,\xd1\xde\x10\xaf\xde\xcehW\xb8s\x8965\u026d\xc5\u07a0\x00\x00\u07d4a,\xed\x8d\xc0\u071e\x89\x9e\xe4oyb33\x15\xf3\xf5^D\x89\x12^5\xf9\xcd=\x9b\x00\x00\u07d4a4\xd9B\xf07\xf2\xcc=BJ#\f`=g\xab\xd3\xed\xf7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a:\xc5;\xe5e\xd4e6\xb8 q[\x9b\x8d:\xe6\x8aK\x95\x89\xcb\xd4{n\xaa\x8c\xc0\x00\x00\u07d4a?\xabD\xb1k\xbeUMD\xaf\xd1x\xab\x1d\x02\xf3z\ua949lk\x93[\x8b\xbd@\x00\x00\u07d4aN\x8b\xef=\xd2\u015bY\xa4\x14Vt@\x10\x185\x18\x84\xea\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4aQ\x84d\xfd\u0637<\x1b\xb6\xacm\xb6\x00eI8\xdb\xf1z\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4aT}7nSi\xbc\xf9x\xfc\x16,1\xc9\b\"3\xb8%\xd0%\xbe?{\x10V\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4a\x91\xdd\u0276J\x8e\b\x90\xb427\t\u05e0|H\xb9*d\x89*\x03I\x19\u07ff\xbc\x00\x00\u07d4a\x96\xc3\xd3\xc0\x90\x8d%Cf\xb7\xbc\xa5WE\"-\x9dM\xb1\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4a\x9f\x17\x14E\xd4+\x02\xe2\xe0p\x04\xad\x8a\xfeiO\xa5=j\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4a\xad\xf5\x92\x9a^)\x81hN\xa2C\xba\xa0\x1f}\x1f^\x14\x8a\x89\x05\xfa\xbfl\x98O#\x00\x00\u07d4a\xb1\xb8\xc0\x12\xcdLx\xf6\x98\xe4p\xf9\x02V\xe6\xa3\x0fH\u0749\n\u05ce\xbcZ\xc6 \x00\x00\u07d4a\xb3\xdf.\x9e\x9f\xd9h\x13\x1f\x1e\x88\xf0\xa0\xeb[\xd7eFM\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4a\xb9\x02\u0166s\x88X&\x82\r\x1f\xe1EI\xe4\x86_\xbd\u0089\x12$\xef\xed*\u1440\x00\u07d4a\xb9\x05\xdef?\xc1s\x86R;:(\xe2\xf7\xd07\xa6U\u0349\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4a\xba\x87\xc7~\x9bYm\xe7\xba\x0e2o\xdd\xfe\xec!c\xeff\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4a\xbf\x84\u056b\x02oX\xc8s\xf8o\xf0\xdf\u0282\xb5W3\xae\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a\xc4\xee|\x86LMk^7\xea\x131\xc2\x03s\x9e\x82k/\x89\x01\xa15;8*\x91\x80\x00\u07d4a\xc80\xf1eG\x18\xf0u\u032b\xa3\x16\xfa\xac\xb8[}\x12\v\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4a\xc8\xf1\xfaC\xbf\x84i\x99\xec\xf4{+2M\xfbkc\xfe:\x89+^:\xf1k\x18\x80\x00\x00\u07d4a\xc9\xdc\u8c98\x1c\xb4\x0e\x98\xb0@+\xc3\xeb(4\x8f\x03\xac\x89\n\xac\xac\u0679\xe2+\x00\x00\u07d4a\u03a7\x1f\xa4d\xd6*\a\x06?\x92\v\f\xc9\x17S\x973\u0609Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4a\xd1\x01\xa03\xee\x0e.\xbb1\x00\xed\xe7f\xdf\x1a\xd0$IT\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4a\xedU\x96\u0197 \u007f=U\xb2\xa5\x1a\xa7\xd5\x0f\a\xfa\t\xe8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4a\xff\x8eg\xb3M\x9e\xe6\xf7\x8e\xb3o\xfe\xa1\xb9\xf7\xc1W\x87\xaf\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4b\x05\xc2\xd5dtp\x84\x8a8@\xf3\x88~\x9b\x01]4u\\\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4b(\xad\xe9^\x8b\xb1}\x1a\xe2;\xfb\x05\x18AMI~\x0e\xb8\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94b)\xdc\xc2\x03\xb1\xed\xcc\xfd\xf0n\x87\x91\fE*\x1fMzr\x8a\x06\xe1\xd4\x1a\x8f\x9e\xc3P\x00\x00\u0794b+\xe4\xb4T\x95\xfc\xd91C\xef\xc4\x12\u0599\xd6\xcd\xc2=\u0148\xf0\x15\xf2W6B\x00\x00\u07d4b3\x1d\xf2\xa3\xcb\xee5 \xe9\x11\u07a9\xf7>\x90_\x89%\x05\x89lk\x93[\x8b\xbd@\x00\x00\u07d4bVD\xc9Z\x87>\xf8\xc0l\u06de\x9fm\x8dv\x80\x04=b\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4be\xb2\xe7s\x0f6\xb7v\xb5-\f\x9d\x02\xad\xa5]\x8e<\xb6\x8965\u026d\xc5\u07a0\x00\x00\u07d4bh\n\x15\xf8\u0338\xbd\xc0/s`\xc2Z\xd8\u03f5{\x8c\u034965\u026d\xc5\u07a0\x00\x00\u07d4b\x94\xea\xe6\xe4 \xa3\xd5`\n9\xc4\x14\x1f\x83\x8f\xf8\xe7\xccH\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4b\x97\x1b\xf2cL\xee\v\xe3\u0249\x0fQ\xa5`\x99\u06f9Q\x9b\x89#\x8f\xd4,\\\xf0@\x00\x00\u07d4b\x9b\xe7\xab\x12jS\x98\xed\xd6\u069f\x18D~x\u0192\xa4\xfd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4b\xb4\xa9\"nah\a\x1el\xbea\x11\xfe\xf0\xbcc\x8a\x03\xba\x19\x10\xbf4\x1b\x00\x00\x00\xe0\x94c\n\x91:\x901\xc9I*\xbdLA\u06f1PT\xcf\xecD\x16\x8a\x014X\xdbg\xaf5\xe0\x00\x00\xe0\x94c\fRs\x12mQ|\xe6q\x01\x81\x1c\xab\x16\xb8SL\xf9\xa8\x8a\x01\xfe\xcc\xc6%s\xbb\u04c0\x00\u07d4c\x100\xa5\xb2{\a(\x8aEio\x18\x9e\x11\x14\xf1*\x81\xc0\x89\x1b\x1azB\v\xa0\r\x00\x00\u07d4c\x10\xb0 \xfd\x98\x04IW\x99P\x92\t\x0f\x17\xf0NR\xcd\xfd\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4c+\x91I\xd7\x01x\xa7364'^\x82\u0555?'\x96{\x89%\xf2s\x93=\xb5p\x00\x00\u07d4c,\xec\xb1\f\xfc\xf3\x8e\u0246\xb4;\x87p\xad\xec\xe9 \x02!\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4c1\x02\x8c\xbbZ!H[\xc5\x1bVQB\x99;\xdb%\x82\xa9\x89\x1c\xfd\xd7F\x82\x16\xe8\x00\x00\u07d4c3O\xcf\x17E\x84\x0eK\tJ;\xb4\v\xb7o\x96\x04\xc0L\x89\u05e5\xd7\x03\xa7\x17\xe8\x00\x00\u07d4c4\nWqk\xfac\xebl\xd13r\x12\x02W[\xf7\x96\xf0\x89\va\xe0\xa2\f\x12q\x80\x00\u07d4cN\xfc$7\x11\a\xb4\xcb\xf0?y\xa9=\xfd\x93\xe41\xd5\xfd\x89B5\x82\xe0\x8e\xdc\\\x80\x00\xe0\x94c\\\x00\xfd\xf05\xbc\xa1_\xa3a\r\xf38N\x0f\xb7\x90h\xb1\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\u07d4ca.xb\xc2{X|\xfbm\xaf\x99\x12\xcb\x05\x1f\x03\n\x9f\x89\x02[\x19\u053f\xe8\xed\x00\x00\u07d4cfgU\xbdA\xb5\x98i\x97x<\x13\x040\b$+<\xb5\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4c{\xe7\x1b:\xa8\x15\xffE=VB\xf70tE\vd\xc8*\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94c}g\xd8\u007fXo\nZG\x9e \xee\x13\xea1\n\x10\xb6G\x8a\n:Y&\xaf\xa1\xe70\x00\x00\u07d4c\u007fXi\xd6\xe4i_\x0e\xb9\xe2s\x11\u0107\x8a\xff33\x80\x89j\xc0Nh\xaa\xec\x86\x00\x00\u07d4c\x97|\xad}\r\xcd\xc5+\x9a\xc9\xf2\xff\xa16\xe8d(\x82\xb8\x89\x04\x10\u0546\xa2\nL\x00\x00\u07d4c\xa6\x1d\xc3\n\x8e;0\xa7c\xc4!<\x80\x1c\xbf\x98s\x81x\x8965\u026d\xc5\u07a0\x00\x00\u07d4c\xacT\\\x99\x12C\xfa\x18\xae\xc4\x1dOoY\x8eUP\x15\u0709 \x86\xac5\x10R`\x00\x00\u07d4c\xb9uMu\xd1-8@9\xeci\x06<\v\xe2\x10\xd5\xe0\u3252\v\x86\f\xc8\xec\xfd\x80\x00\u07d4c\xbbfO\x91\x17\x03v(YM\xa7\xe3\xc5\b\x9f\xd6\x18\xb5\xb5\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4c\u00a3\xd25\xe5\xee\xab\xd0\u0526\xaf\u06c9\xd9F'9d\x95\x89CN\xf0[\x9d\x84\x82\x00\x00\u07d4c\xc8\xdf\xde\v\x8e\x01\xda\xdc.t\x8c\x82L\xc06\x9d\U00010cc9\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4c\xd5Z\u065b\x917\xfd\x1b \xcc+O\x03\xd4,\xba\xdd\xf34\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4c\xd8\x00H\x87u\x96\xe0\u0084\x89\xe6P\xcdJ\xc1\x80\tjI\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\xe0\x94c\xe4\x14`>\x80\xd4\xe5\xa0\xf5\xc1\x87t FB%\x82\b\xe4\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94c\xe8\x8e.S\x9f\xfbE\x03\x86\xb4\xe4g\x89\xb2#\xf5GlE\x8a\x01U\x17\nw\x8e%\xd0\x00\x00\u07d4c\xef/\xbc=\xaf^\xda\xf4\xa2\x95b\x9c\xcf1\xbc\xdf@8\xe5\x89O%\x91\xf8\x96\xa6P\x00\x00\u07d4c\xf0\xe5\xa7R\xf7\x9fg\x12N\xedc:\xd3\xfd'\x05\xa3\x97\u0509\u0556{\xe4\xfc?\x10\x00\x00\xe0\x94c\xf5\xb5=y\xbf.A\x14\x89Re0\"8E\xfa\xc6\xf6\x01\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4c\xfc\x93\x00\x13\x05\xad\xfb\u0278])\xd9)\x1a\x05\xf8\xf1A\v\x8965\u026d\xc5\u07a0\x00\x00\u0794c\xfek\xccK\x8a\x98P\xab\xbeu\x8070\xc92%\x1f\x14[\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4d\x03\xd0bT\x96\x90\xc8\xe8\xb6>\xaeA\xd6\xc1\tGn%\x88\x89lk\x93[\x8b\xbd@\x00\x00\u07d4d\x04+\xa6\x8b\x12\xd4\xc1Qe\x1c\xa2\x81;sR\xbdV\xf0\x8e\x89 \x86\xac5\x10R`\x00\x00\u0794d\x05\xdd\x13\xe9:\xbc\xff7~p\x0e<\x1a\x00\x86\xec\xa2})\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94d\n\xbam\xe9\x84\xd9E\x177x\x03p^\xae\xa7\t_J\x11\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4d\v\xf8t\x15\xe0\xcf@s\x01\xe5Y\x9ah6m\xa0\x9b\xba\u0209\x1a\xbc\x9fA`\x98\x15\x80\x00\u07d4d \xf8\xbc\xc8\x16JaR\xa9\x9dk\x99i0\x05\xcc\xf7\xe0S\x8965f3\xeb\xd8\xea\x00\x00\u07d4d$\x1axD)\x0e\n\xb8U\xf1\u052au\xb5SE\x03\"$\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4d&J\xed\xd5-\xca\xe9\x18\xa0\x12\xfb\xcd\f\x03\x0e\xe6\xf7\x18!\x8965\u026d\xc5\u07a0\x00\x00\u07d4d7\x0e\x87 &E\x12Z5\xb2\a\xaf\x121\xfb`r\xf9\xa7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4d=\x9a\xee\u0531\x80\x94~\u04b9 |\xceL=\xdcU\xe1\xf7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4dC\xb8\xaec\x9d\xe9\x1c\xf7\xf0p\xa5G\x03\xb7\x18NH'l\\\x00w\xefK4\x89\x11X\xe4`\x91=\x00\x00\x00\xe0\x94d\xe2\xde! \v\x18\x99\u00e0\xc0e;P@\x13m\r\xc8B\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4d\xec\x8a[t?4y\xe7\a\xda\xe9\xee \u076aO@\xf1\u0649\n\u05ce\xbcZ\xc6 \x00\x00\u07d4e\x03\x86\v\x19\x10\b\xc1U\x83\xbf\u0201X\t\x93\x01v((\x8965\u026d\xc5\u07a0\x00\x00\u07d4e\x051\x911\x9e\x06z%\xe66\x1dG\xf3\u007fc\x18\xf84\x19\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4e\t;#\x9b\xbf\xba#\xc7w\\\xa7\xdaZ\x86H\xa9\xf5L\xf7\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4e\t\xee\xb14~\x84/\xfbA>7\x15^,\xbcs\x82s\xfd\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94e\vBUU\xe4\xe4\xc5\x17\x18\x14h6\xa2\xc1\xeew\xa5\xb4!\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4e\f\xf6}\xb0`\xcc\xe1uh\xd5\xf2\xa4#h|Idv\t\x89\x05k\xc7^-c\x10\x00\x00\u07d4e\x10\xdfB\xa5\x99\xbc\xb0\xa5\x19\u0329a\xb4\x88u\x9aogw\x89lk\x93[\x8b\xbd@\x00\x00\u07d4e6u\xb8B\xd7\u0634a\xf7\"\xb4\x11|\xb8\x1d\xac\x8ec\x9d\x89\x01\xae6\x1f\xc1E\x1c\x00\x00\u07d4eK~\x80\x87\x99\xa8=r\x87\xc6w\x06\xf2\xab\xf4\x9aId\x04\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94eORHG\xb3\xa6\xac\xc0\xd3\xd5\xf1\xf3b\xb6\x03\xed\xf6_\x96\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4eY4\u068etN\xaa=\xe3M\xbb\xc0\x89LN\xda\va\xf2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4e]\\\xd7H\x96)\xe2ANIb?\xabb\xa1~M6\x11\x89\x05\fL\xb2\xa1\f`\x00\x00\u07d4e\xaf\x8d\x8b[\x1d\x1e\xed\xfaw\xbc\xbc\x96\xc1\xb13\xf83\x06\u07c9\x05P\x05\xf0\xc6\x14H\x00\x00\u07d4e\xaf\x90\x87\xe0QgqT\x97\u0265\xa7I\x18\x94\x89\x00M\xef\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u0794e\xb4/\xae\xcc\x1e\u07f1B\x83\u0297\x9a\xf5E\xf6;0\xe6\f\x88\xfc\x93c\x92\x80\x1c\x00\x00\u0794e\xd3>\xb3\x9c\xdadS\xb1\x9ea\xc1\xfeM\xb91p\xef\x9d4\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4e\xd8\xddN%\x1c\xbc\x02\x1f\x05\xb0\x10\xf2\xd5\xdcR\f8r\xe0\x89-CW\x9a6\xa9\x0e\x00\x00\u07d4e\xea&\xea\xbb\xe2\xf6L\xcc\xcf\xe0h)\xc2]F7R\x02%\x89%\xf2s\x93=\xb5p\x00\x00\u07d4e\xeag\xad?\xb5j\xd5\xfb\x948}\u04ce\xb3\x83\x00\x1d|h\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94e\xeb\xae\xd2~\u06dd\xcc\x19W\xae\xe5\xf4R\xac!\x05\xa6\\\x0e\x8a\t7\u07ed\xae%\u26c0\x00\u07d4e\xee \xb0m\x9a\u0549\xa7\xe7\xce\x04\xb9\xf5\xf7\x95\xf4\x02\xae\u0389lk\x93[\x8b\xbd@\x00\x00\u07d4e\xf544m/\xfbx\u007f\xa9\xcf\x18]t[\xa4)\x86\xbdn\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94e\xf5\x87\x0f&\xbc\xe0\x89g}\xfc#\xb5\x00\x1e\xe4\x92H4(\x8a\x01\x12\xb1\xf1U\xaa2\xa3\x00\x00\u07d4e\xfd\x02\xd7\x04\xa1*M\xac\xe9G\x1b\x06E\xf9b\xa8\x96q\u0209\x01\x8d\x1c\xe6\xe4'\u0340\x00\u07d4e\xff\x87O\xaf\xceM\xa3\x18\xd6\xc9=W\xe2\u00ca\rs\xe8 \x8968\x02\x1c\xec\u06b0\x00\x00\xe0\x94f\x05W\xbbC\xf4\xbe:\x1b\x8b\x85\xe7\xdf{<[\xcdT\x80W\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4f\b,u\xa8\xde1\xa59\x13\xbb\xd4M\xe3\xa07O\u007f\xaaA\x89O%\x91\xf8\x96\xa6P\x00\x00\u07d4f\x11\xceY\xa9\x8b\a*\xe9Y\xdcI\xadQ\x1d\xaa\xaa\xa1\x9dk\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4f \x1b\xd2'\xaem\u01bd\xfe\xd5\xfb\u0781\x1f\xec\xfe^\x9d\u0649 >\x9e\x84\x92x\x8c\x00\x00\u07d4f#4\x81G$\x93[y1\xdd\xcaa\x00\xe0\rFw'\u0349\"\x88&\x9d\a\x83\xd4\x00\x00\u07d4f'O\xea\x82\xcd0\xb6\u009b#5\x0eOO=1\nX\x99\x89p7\x05P\xab\x82\x98\x00\x00\u07d4f,\xfa\x03\x8f\xab7\xa0\x17E\xa3d\u1e41'\xc5\x03tm\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4f5\xb4oq\x1d-\xa6\xf0\xe1cp\u034e\xe4>\xfb,-R\x89lk\x93[\x8b\xbd@\x00\x00\u07d4f6\x04\xb0P0F\xe6$\xcd&\xa8\xb6\xfbGB\xdc\xe0*o\x89\x03\x8b\x9by~\xf6\x8c\x00\x00\u07d4f6\u05ecczH\xf6\x1d8\xb1L\xfdHe\xd3m\x14(\x05\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4f@\xcc\xf0SU\\\x13\n\xe2\xb6Vd~\xa6\xe3\x167\xb9\xab\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4fBK\xd8x[\x8c\xb4a\x10*\x90\x02\x83\xc3]\xfa\a\xefj\x89\x02.-\xb2ff\xfc\x80\x00\u07d4fL\xd6}\xcc\u026c\x82(\xb4\\U\u06cdvU\ve\x9c\u0709\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4fNC\x11\x98p\xaf\x10zD\x8d\xb1'\x8b\x04H8\xff\u036f\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4fQso\xb5\x9b\x91\xfe\xe9\xc9:\xa0\xbdn\xa2\xf7\xb2Pa\x80\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4f[\x00\x0f\vw'P\xcc\x89k\x91\x8a\xacIK\x16\x80\x00\xe0\x94g]\\\xaa`\x9b\xf7\n\x18\xac\xa5\x80F]\x8f\xb71\r\x1b\xbb\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4gc F\u0732ZT\x93i(\xa9oB?3 \xcb\ud489lk\x93[\x8b\xbd@\x00\x00\u07d4ge\xdf%(\x0e\x8eO8\u0531\xcfDo\xc5\xd7\xebe\x9e4\x89\x05k\xc7^-c\x10\x00\x00\u07d4gv\xe13\xd9\xdc5L\x12\xa9Q\b{c\x96P\xf59\xa43\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4g\x85Q<\xf72\xe4~\x87g\ap\xb5A\x9b\xe1\f\xd1\xfct\x89lk\x93[\x8b\xbd@\x00\x00\u07d4g\x947\xea\xcfCxx\xdc)=H\xa3\x9c\x87\xb7B\x1a!l\x89\x03\u007f\x81\x82\x1d\xb2h\x00\x00\u07d4g\x9b\x9a\x10\x990Q~\x89\x99\t\x9c\xcf*\x91LL\x8d\xd94\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4g\xa8\x0e\x01\x90r\x1f\x949\rh\x02r\x9d\xd1,1\xa8\x95\xad\x89lk\x13u\xbc\x91V\x00\x00\u07d4g\xb8\xa6\xe9\x0f\xdf\n\x1c\xacD\x17\x930\x1e\x87P\xa9\xfayW\x890\x84\x9e\xbe\x166\x9c\x00\x00\u07d4g\xbc\x85\xe8}\xc3LN\x80\xaa\xfa\x06k\xa8\u049d\xbb\x8eC\x8e\x89\x15\xd1\xcfAv\xae\xba\x00\x00\u07d4g\xc9&\t>\x9b\x89'\x938\x10\u0642\"\xd6.+\x82\x06\xbb\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4g\xcf\xdanp\xbfvW\u04d0Y\xb5\x97\x90\xe5\x14Z\xfd\xbea\x89#\x05\r\tXfX\x00\x00\u07d4g\u0582\xa2\x82\xefs\xfb\x8dn\x90q\xe2aOG\xab\x1d\x0f^\x8965\u026d\xc5\u07a0\x00\x00\u07d4g\u05a8\xaa\x1b\xf8\xd6\xea\xf78N\x99=\xfd\xf1\x0f\n\xf6\x8aa\x89\n\xbc\xbbW\x18\x97K\x80\x00\u07d4g\u0692.\xff\xa4r\xa6\xb1$\xe8N\xa8\xf8k$\xe0\xf5\x15\xaa\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4g\xdf$-$\r\u0538\a\x1dr\xf8\xfc\xf3[\xb3\x80\x9dq\xe8\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4g\xee@n\xa4\xa7\xaej:8\x1e\xb4\xed\xd2\xf0\x9f\x17KI(\x898)c_\th\xb0\x00\x00\u07d4g\xf2\xbbx\xb8\xd3\xe1\x1f|E\x8a\x10\xb5\xc8\xe0\xa1\xd3tF}\x89a\t=|,m8\x00\x00\u07d4g\xfcR}\xce\x17\x85\xf0\xfb\x8b\xc7\xe5\x18\xb1\xc6i\xf7\xec\u07f5\x89\r\x02\xabHl\xed\xc0\x00\x00\u07d4h\x02}\x19U\x8e\xd73\x9a\b\xae\xe8\xde5Y\xbe\x06>\xc2\xea\x89lk\x93[\x8b\xbd@\x00\x00\u07d4h\x06@\x83\x8b\xd0zD{\x16\x8dm\x92;\x90\xcflC\xcd\u0289]\u0212\xaa\x111\xc8\x00\x00\u07d4h\a\xdd\u020d\xb4\x89\xb03\xe6\xb2\xf9\xa8\x15SW\x1a\xb3\xc8\x05\x89\x01\x9f\x8euY\x92L\x00\x00\xe0\x94h\rY\x11\xed\x8d\xd9\xee\xc4\\\x06\f\"?\x89\xa7\xf6 \xbb\u054a\x04<3\xc1\x93ud\x80\x00\x00\u07d4h\x11\xb5L\u0456c\xb1\x1b\x94\xda\x1d\xe2D\x82\x85\u035fh\u0649;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4h\x19\f\xa8\x85\xdaB1\x87L\x1c\xfbB\xb1X\n!s\u007f8\x89\xcf\x15&@\xc5\xc80\x00\x00\xe0\x94h(\x97\xbcO\x8e\x89\x02\x91 \xfc\xff\xb7\x87\xc0\x1a\x93\xe6A\x84\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4h)^\x8e\xa5\xaf\xd9\t?\xc0\xa4e\xd1W\x92+]*\xe24\x89\x01\x15NS!}\xdb\x00\x00\u07d4h.\x96'oQ\x8d1\xd7\xe5n0\u07f0\t\xc1!\x82\x01\xbd\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4h5\xc8\xe8\xb7J,\xa2\xae?J\x8d\x0fk\x95J>*\x83\x92\x89\x03B\x9c3]W\xfe\x00\x00\u07d4h63\x01\n\x88hk\xeaZ\x98\xeaS\xe8y\x97\xcb\xf7>i\x89\x05k9Bc\xa4\f\x00\x00\u07d4h=\xba6\xf7\xe9O@\xeaj\xea\ry\xb8\xf5!\xdeU\an\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4hA\x9cm\xd2\xd3\xceo\u02f3\xc7>/\xa0y\xf0`Q\xbd\xe6\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4hG;z}\x96Y\x04\xbe\u06e5V\u07fc\x17\x13l\xd5\xd44\x89\x05k\xc7^-c\x10\x00\x00\u07d4hG\x82[\xde\xe8$\x0e(\x04,\x83\xca\xd6B\U000868fd\u0709QP\xae\x84\xa8\xcd\xf0\x00\x00\xe0\x94hJD\xc0i3\x9d\b\xe1\x9auf\x8b\u06e3\x03\xbe\x85S2\x8a\x0e\u04b5%\x84\x1a\xdf\xc0\x00\x00\u07d4hS\x1fM\u0680\x8fS vz\x03\x114(\xca\f\xe2\xf3\x89\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4hy'\xe3\x04\x8b\xb5\x16*\xe7\xc1\\\xf7k\xd1$\xf9I{\x9e\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94h\x80\x9a\xf5\xd52\xa1\x1c\x1aMn2\xaa\xc7\\LR\xb0\x8e\xad\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4h\x86\xad\xa7\xbb\xb0a{\u0684!\x91\u018c\x92.\xa3\xa8\xac\x82\x89>\xe2;\xde\x0e} \x00\x00\xe0\x94h\x88>\x15.V`\xfe\xe5\x96&\xe7\xe3\xb4\xf0Q\x10\xe6\"/\x8a\v\x94c;\xe9u\xa6*\x00\x00\u07d4h\x8aV\x9e\x96U$\xeb\x1d\n\xc3\xd3s>\xab\x90\x9f\xb3\xd6\x1e\x89G\x8e\xae\x0eW\x1b\xa0\x00\x00\xe0\x94h\x8e\xb3\x85;\xbc\xc5\x0e\xcf\xee\x0f\xa8\u007f\n\xb6\x93\u02bd\xef\x02\x8a\x06\xb1\n\x18@\x06G\xc0\x00\x00\u07d4h\xa7B_\xe0\x9e\xb2\x8c\xf8n\xb1y>A\xb2\x11\xe5{\u058d\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4h\xa8l@#\x88\xfd\xdcY\x02\x8f\xecp!\u933f\x83\x0e\xac\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\xe0\x94h\xac\u06a9\xfb\x17\xd3\xc3\t\x91\x1aw\xb0_S\x91\xfa\x03N\xe9\x8a\x01\xe5.3l\xde\"\x18\x00\x00\u07d4h\xad\xdf\x01\x9dk\x9c\xabp\xac\xb1?\v1\x17\x99\x9f\x06.\x12\x89\x02\xb5\x12\x12\xe6\xb7\u0200\x00\u07d4h\xb3\x186\xa3\n\x01j\xda\x15{c\x8a\xc1]\xa7?\x18\xcf\u0789\x01h\u048e?\x00(\x00\x00\xe0\x94h\xb6\x85G\x88\xa7\xc6Il\xdb\xf5\xf8K\x9e\xc5\xef9+x\xbb\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4h\xc0\x84\x90\u021b\xf0\u05b6\xf3 \xb1\xac\xa9\\\x83\x12\xc0\x06\b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4h\xc7\xd1q\x1b\x01\x1a3\xf1o\x1fU\xb5\xc9\x02\xcc\xe9p\xbd\u05c9\b=lz\xabc`\x00\x00\u07d4h\xc8y\x1d\xc3B\xc3sv\x9e\xa6\x1f\xb7\xb5\x10\xf2Q\xd3 \x88\x8965\u026d\xc5\u07a0\x00\x00\u07d4h\u07d4|I[\ubbb8\u8273\xf9S\xd53\x87K\xf1\x06\x89\x1d\x99E\xab+\x03H\x00\x00\u07d4h\xe8\x02'@\xf4\xaf)\xebH\xdb2\xbc\xec\xdd\xfd\x14\x8d=\xe3\x8965\u026d\xc5\u07a0\x00\x00\u07d4h\xecy\u057eqUql@\x94\x1cy\u05cd\x17\u079e\xf8\x03\x89\x1b#8w\xb5 \x8c\x00\x00\u07d4h\xee\xc1\u222c1\xb6\xea\xba~\x1f\xbdO\x04\xadW\x9ak]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4h\xf5%\x92\x1d\xc1\x1c2\x9buO\xbf>R\x9f\xc7#\xc84\u0349WG=\x05\u06ba\xe8\x00\x00\u07d4h\xf7\x19\xae4+\xd7\xfe\xf1\x8a\x05\u02f0/pZ\u04ce\u0572\x898\xeb\xad\\\u0710(\x00\x00\xe0\x94h\xf7W<\xd4W\xe1L\x03\xfe\xa4>0-04|\x10p\\\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4h\xf8\xf4QU\xe9\x8cP)\xa4\xeb\u0175'\xa9.\x9f\xa81 \x89\xf0{D\xb4\a\x93 \x80\x00\u07d4h\xfe\x13W!\x8d\tXI\xcdW\x98B\u012a\x02\xff\x88\x8d\x93\x89lk\x93[\x8b\xbd@\x00\x00\u07d4i\x02(\xe4\xbb\x12\xa8\u0535\u09d7\xb0\xc5\xcf*u\t\x13\x1e\x89e\xea=\xb7UF`\x00\x00\u07d4i\x05\x94\xd3\x06a<\xd3\xe2\xfd$\xbc\xa9\x99J\u064a=s\xf8\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94i\a2ir\x9ed\x14\xb2n\xc8\xdc\x0f\xd95\xc7;W\x9f\x1e\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\xe0\x94i\x19\xdd^]\xfb\x1a\xfa@G\x03\xb9\xfa\xea\x8c\xee5\xd0\rp\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4i4\x92\xa5\xc5\x13\x96\xa4\x82\x88\x16i\xcc\xf6\xd8\xd7y\xf0\tQ\x89\x12\xbfPP:\xe3\x03\x80\x00\u07d4i=\x83\xbe\tE\x9e\xf89\v.0\xd7\xf7\u008d\xe4\xb4(N\x89lk\x93[\x8b\xbd@\x00\x00\u07d4iQp\x83\xe3\x03\xd4\xfb\xb6\xc2\x11E\x14!]i\xbcF\xa2\x99\x89\x05k\xc7^-c\x10\x00\x00\u07d4iUPel\xbf\x90\xb7]\x92\xad\x91\"\xd9\r#\xcah\xcaM\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94iX\xf8;\xb2\xfd\xfb'\xce\x04\t\xcd\x03\xf9\xc5\xed\xbfL\xbe\u074a\x04<3\xc1\x93ud\x80\x00\x00\u0794i[\x0fRBu7\x01\xb2d\xa6pq\xa2\u0708\b6\xb8\u06c8\u3601\x1b\xech\x00\x00\xe0\x94i[L\xce\bXV\xd9\xe1\xf9\xff>y\x94 #5\x9e_\xbc\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94if\x06:\xa5\xde\x1d\xb5\xc6q\xf3\xddi\x9dZ\xbe!>\xe9\x02\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4it\u0224\x14\u03ae\xfd<.M\xfd\xbe\xf40V\x8d\x9a\x96\v\x89\x12\x1e\xa6\x8c\x11NQ\x00\x00\xe0\x94iximQP\xa9\xa2cQ?\x8ft\u0196\xf8\xb19|\xab\x8a\x01g\xf4\x82\xd3\u0171\xc0\x00\x00\xe0\x94iy{\xfb\x12\u027e\u0582\xb9\x1f\xbcY5\x91\xd5\xe4\x027(\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94i\u007fUSk\xf8Z\xdaQ\x84\x1f\x02\x87b:\x9f\x0e\u041a\x17\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4i\x82\xfe\x8a\x86~\x93\xebJ\v\xd0QX\x93\x99\xf2\xec\x9aR\x92\x89lk\x93[\x8b\xbd@\x00\x00\u07d4i\x8a\x8ao\x01\xf9\xabh/c|yi\xbe\x88_lS\x02\xbf\x89\x01\r:\xa56\xe2\x94\x00\x00\u07d4i\x8a\xb9\xa2\xf33\x81\xe0|\fGC=\r!\xd6\xf36\xb1'\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4i\x94\xfb21\xd7\xe4\x1dI\x1a\x9dh\xd1\xfaL\xae,\xc1Y`\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4i\x9c\x9e\xe4q\x95Q\x1f5\xf8b\xcaL\"\xfd5\xae\x8f\xfb\xf4\x89\x04V9\x18$O@\x00\x00\u07d4i\x9f\xc6\u058aGuW<\x1d\u036e\xc80\xfe\xfdP9|N\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4i\xaf(\xb0tl\xac\r\xa1p\x84\xb99\x8c^6\xbb:\r\xf2\x896w\x03n\xdf\n\xf6\x00\x00\u07d4i\xb8\x0e\xd9\x0f\x84\x83J\xfa?\xf8.\xb9dp;V\tw\u0589\x01s\x17\x90SM\xf2\x00\x00\xe0\x94i\xb8\x1dY\x81\x14\x1e\u01e7\x14\x10`\xdf\u03cf5\x99\xff\xc6>\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4i\xbc\xfc\x1dC\xb4\xba\x19\xde{'K\xdf\xfb5\x13\x94\x12\xd3\u05c95e\x9e\xf9?\x0f\xc4\x00\x00\u07d4i\xbd%\xad\xe1\xa34lY\xc4\xe90\xdb*\x9dq^\xf0\xa2z\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4i\xc0\x8dtGT\xdep\x9c\xe9n\x15\xae\r\x1d9[:\"c\x8965\u026d\xc5\u07a0\x00\x00\u07d4i\xc2\xd85\xf1>\xe9\x05\x80@\x8ej2\x83\xc8\u0326\xa44\xa2\x89#\x8f\xd4,\\\xf0@\x00\x00\u07d4i\xc9N\a\u0129\xbe3\x84\xd9]\xfa<\xb9)\x00Q\x87;{\x89\x03\xcbq\xf5\x1f\xc5X\x00\x00\u07d4i\xcb>!S\x99\x8d\x86\xe5\xee \xc1\xfc\u0466\xba\uec86?\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4i\u04ddQ\b\x89\xe5R\xa3\x96\x13[\xfc\xdb\x06\xe3~8v3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94i\u064f8\xa3\xba=\xbc\x01\xfa\\,\x14'\xd8b\x83//p\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94i\xe2\xe2\xe7\x040|\xcc[\\\xa3\xf1d\xfe\xce.\xa7\xb2\xe5\x12\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4i\xffB\x90t\u02dblc\xbc\x91B\x84\xbc\xe5\xf0\xc8\xfb\xf7\u0409\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4i\xff\x89\x01\xb5Av?\x81|_)\x98\xf0-\xcf\xc1\xdf)\x97\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4j\x02:\xf5}XM\x84^i\x876\xf10\u06dd\xb4\r\xfa\x9a\x89\x05[ \x1c\x89\x00\x98\x00\x00\u07d4j\x04\xf5\xd5?\xc0\xf5\x15\xbe\x94+\x8f\x12\xa9\xcbz\xb0\xf3\x97x\x89\xa9\xaa\xb3E\x9b\xe1\x94\x00\x00\u07d4j\x05\xb2\x1cO\x17\xf9\xd7?_\xb2\xb0\u02c9\xffSV\xa6\xcc~\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\xe0\x94j\x0f\x05`f\xc2\xd5f(\x85\x02s\xd7\xec\xb7\xf8\xe6\xe9\x12\x9e\x8a\x01\x0f\r)<\u01e5\x88\x00\x00\u07d4j\x13\xd5\xe3,\x1f\xd2m~\x91\xffn\x051`\xa8\x9b,\x8a\xad\x89\x02\xe6/ \xa6\x9b\xe4\x00\x00\u07d4j.\x86F\x9a[\xf3|\xee\x82\xe8\x8bL8c\x89](\xfc\xaf\x89\x1c\"\x92f8[\xbc\x00\x00\u07d4j6\x94BL|\u01b8\xbc\u067c\u02baT\f\xc1\xf5\xdf\x18\u05c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94jB\u0297\x1cex\u056d\xe2\x95\xc3\xe7\xf4\xad3\x1d\xd3BN\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4jD\xaf\x96\xb3\xf02\xaed\x1b\xebg\xf4\xb6\xc83B\xd3|]\x89\x01\x92t\xb2Y\xf6T\x00\x00\u07d4jL\x89\a\xb6\x00$\x80W\xb1\xe4cT\xb1\x9b\u0705\x9c\x99\x1a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4jQNbB\xf6\xb6\x8c\x13~\x97\xfe\xa1\u73b5U\xa7\xe5\xf7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4jS\xd4\x1a\xe4\xa7R\xb2\x1a\xbe\xd57FI\x95:Q=\xe5\xe5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4jaY\aJ\xb5s\xe0\xeeX\x1f\x0f=\xf2\u05a5\x94b\x9bt\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4jc7\x83?\x8fjk\xf1\f\xa7\xec!\xaa\x81\x0e\xd4D\xf4\u02c97\xbd$4\\\xe8\xa4\x00\x00\u07d4jcS\xb9qX\x9f\x18\xf2\x95\\\xba(\xab\xe8\xac\xcejWa\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4jc\xfc\x89\xab\xc7\xf3n(-\x80x{{\x04\xaf\xd6U>q\x89\b\xacr0H\x9e\x80\x00\x00\u07d4jg\x9e7\x8f\xdc\xe6\xbf\xd9\u007f\xe6/\x04)Z$\xb9\x8965\u026d\xc5\u07a0\x00\x00\u07d4j\x8c\xea-\xe8J\x8d\xf9\x97\xfd?\x84\xe3\b=\x93\xdeW\u0369\x89\x05k\xe0<\xa3\xe4}\x80\x00\xe0\x94j\x97Xt;`>\xea:\xa0RKB\x88\x97#\xc4\x159H\x8a\x02#\x85\xa8'\xe8\x15P\x00\x00\u07d4j\xa5s/;\x86\xfb\x8c\x81\xef\xbek[G\xb5cs\v\x06\u020965\u026d\xc5\u07a0\x00\x00\u07d4j\xb3#\xaePV\xed\nE0r\u016b\xe2\xe4/\xcf]q9\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4j\xb5\xb4\xc4\x1c\u0778)i\f/\xda\u007f \xc8^b\x9d\xd5\u0549d\u052fqL2\x90\x00\x00\u07d4j\xc4\x0fS-\xfe\xe5\x11\x81\x17\u04ad5-\xa7}Om\xa2\u0209\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4j\xc4\u053e-\xb0\u065d\xa3\xfa\xaa\xf7RZ\xf2\x82\x05\x1dj\x90\x89\x04X\xcaX\xa9b\xb2\x80\x00\u07d4j\xcd\u0723\xcd+I\x90\xe2\\\xd6\\$\x14\x9d\t\x12\t\x9ey\x89\xa2\xa1\xe0|\x9fl\x90\x80\x00\u07d4j\xd9\v\xe2R\xd9\xcdFM\x99\x81%\xfa\xb6\x93\x06\v\xa8\xe4)\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4j\u0753!\x93\xcd8IJ\xa3\xf0:\xec\xccKz\xb7\xfa\xbc\xa2\x89\x04\xdbs%Gc\x00\x00\x00\xe0\x94j\xe5\u007f'\x91|V*\x13*M\x1b\xf7\xec\n\u01c5\x83)&\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4j\xeb\x9ftt.\xa4\x91\x81=\xbb\xf0\xd6\xfc\xde\x1a\x13\x1dM\xb3\x89\x17\xe5T0\x8a\xa00\x00\x00\u07d4j\xf25\u04bb\xe0P\xe6)\x16\x15\xb7\x1c\xa5\x82\x96X\x81\x01B\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4j\xf6\xc7\xee\x99\xdf'\x1b\xa1[\xf3\x84\xc0\xb7d\xad\xcbM\xa1\x82\x8965f3\xeb\xd8\xea\x00\x00\u07d4j\xf8\xe5Yih,q_H\xadO\xc0\xfb\xb6~\xb5\x97\x95\xa3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4j\xf9@\xf6>\u0278\xd8v'*\u0296\xfe\xf6\\\xda\xce\xcd\ua262\xa1]\tQ\x9b\xe0\x00\x00\u07d4j\xf9\xf0\xdf\uebbb_d\xbf\x91\xabw\x16i\xbf\x05)US\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4j\xff\x14f\xc2b6u\xe3\xcb\x0eu\xe4#\xd3z%\xe4B\xeb\x89]\u0212\xaa\x111\xc8\x00\x00\xe0\x94k\r\xa2Z\xf2g\u05c3l\"k\xca\xe8\xd8r\xd2\xceR\xc9A\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4k\x10\xf8\xf8\xb3\xe3\xb6\r\xe9\n\xa1-\x15_\x9f\xf5\xff\xb2,P\x89lk\x93[\x8b\xbd@\x00\x00\u07d4k\x17Y\x8a\x8e\xf5Oyz\xe5\x15\u0336Q}\x18Y\xbf\x80\x11\x89\x05k\xc7^-c\x10\x00\x00\u07d4k \xc0\x80`jy\xc7;\xd8\xe7[\x11qzN\x8d\xb3\xf1\u00c9\x10?sX\x03\xf0\x14\x00\x00\u07d4k\"\x84D\x02!\xce\x16\xa88-\xe5\xff\x02)G\"i\xde\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4k0\xf1\x829\x10\xb8m:\xcbZj\xfc\x9d\xef\xb6\xf3\xa3\v\xf8\x89\u3bb5sr@\xa0\x00\x00\u07d4k8\u0784\x1f\xad\u007fS\xfe\x02\xda\x11[\xd8j\xaff$f\xbd\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4kK\x99\xcb?\xa9\xf7\xb7L\u3903\x17\xb1\xcd\x13\t\n\x1az\x89\x03\x1b2~i]\xe2\x00\x00\u07d4kZ\xe7\xbfx\xecu\xe9\f\xb5\x03\xc7x\xcc\u04f2KO\x1a\xaf\x89+^:\xf1k\x18\x80\x00\x00\u07d4kc\xa2\u07f2\xbc\xd0\xca\xec\x00\"\xb8\x8b\xe3\f\x14Q\xeaV\xaa\x89+\xdbk\xf9\x1f\u007fL\x80\x00\u07d4kew\xf3\x90\x9aMm\xe0\xf4\x11R-Ep8d\x004\\\x89e\xea=\xb7UF`\x00\x00\u07d4kr\xa8\xf0a\xcf\xe6\x99j\xd4G\xd3\xc7,(\xc0\xc0\x8a\xb3\xa7\x89\xe7\x8cj\u01d9\x12b\x00\x00\u07d4kv\rHw\xe6\xa6'\xc1\xc9g\xbe\xe4Q\xa8P}\xdd\u06eb\x891T\xc9r\x9d\x05x\x00\x00\u07d4k\x83\xba\xe7\xb5e$EXU[\xcfK\xa8\xda \x11\x89\x1c\x17\x89lk\x93[\x8b\xbd@\x00\x00\u07d4k\x92]\xd5\xd8\xeda2\xabm\b`\xb8,D\xe1\xa5\x1f\x1f\xee\x89P; >\x9f\xba \x00\x00\xe0\x94k\x94a]\xb7Pej\u00cc~\x1c\xf2\x9a\x9d\x13g\u007fN\x15\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4k\x95\x1aC'N\xea\xfc\x8a\t\x03\xb0\xaf.\xc9+\xf1\xef\xc89\x89\x05k\xc7^-c\x10\x00\x00\u07d4k\x99%!\xec\x85#p\x84\x8a\u0597\xcc-\xf6Nc\xcc\x06\xff\x8965\u026d\xc5\u07a0\x00\x00\u07d4k\xa8\xf7\xe2_\xc2\xd8qa\x8e$\xe4\x01\x84\x19\x917\xf9\xf6\xaa\x89\x15\xafd\x86\x9ak\xc2\x00\x00\u07d4k\xa9\xb2\x1b5\x10k\xe1Y\xd1\xc1\xc2ez\xc5l\u049f\xfdD\x89\xf2\xdc}G\xf1V\x00\x00\x00\u07d4k\xafz*\x02\xaex\x80\x1e\x89\x04\xadz\xc0Q\b\xfcV\xcf\xf6\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94k\xb2\xac\xa2?\xa1bm\x18\xef\xd6w\u007f\xb9}\xb0-\x8e\n\xe4\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4k\xb4\xa6a\xa3:q\xd4$\u051b\xb5\xdf(b.\xd4\xdf\xfc\xf4\x89\",\x8e\xb3\xfff@\x00\x00\u07d4k\xb5\b\x13\x14j\x9a\xddB\xee\"\x03\x8c\x9f\x1fti\xd4\u007fG\x89\n\xdaUGK\x814\x00\x00\u07d4k\xbc?5\x8af\x8d\u0461\x1f\x03\x80\xf3\xf71\bBj\xbdJ\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4k\xbd\x1eq\x93\x90\xe6\xb9\x10C\xf8\xb6\xb9\u07c9\x8e\xa8\x00\x1b4\x89llO\xa6\xc3\xdaX\x80\x00\u07d4k\xc8Z\xcdY(r.\xf5\tS1\xee\x88\xf4\x84\xb8\u03c3W\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4k\xd3\xe5\x9f#\x9f\xaf\xe4wk\xb9\xbd\xddk\ue0fa]\x9d\x9f\x8965\u026d\xc5\u07a0\x00\x00\u07d4k\xd4W\xad\xe0Qy]\xf3\xf2F\\89\xae\xd3\xc5\xde\xe9x\x8964\xbf9\xab\x98x\x80\x00\u07d4k\xe1c\x13d>\xbc\x91\xff\x9b\xb1\xa2\xe1\x16\xb8T\xea\x93:E\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4k\xe7Y^\xa0\xf0hH\x9a'\x01\xecFI\x15\x8d\xdcC\xe1x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4k\xe9\x03\x0e\xe6\xe2\xfb\u0111\xac\xa3\xde@\"\xd3\x01w+{}\x89\x01s\x17\x90SM\xf2\x00\x00\xe0\x94k\xec1\x1a\xd0P\b\xb4\xaf5<\x95\x8c@\xbd\x06s\x9a?\xf3\x8a\x03w\xf6*\x0f\nbp\x00\x00\u07d4k\xf7\xb3\xc0e\xf2\xc1\xe7\xc6\xeb\t+\xa0\xd1Pf\xf3\x93\u0478\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4k\xf8o\x1e/+\x802\xa9\\Mw8\xa1\t\xd3\xd0\xed\x81\x04\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4l\x05\xe3N^\xf2\xf4.\u041d\xef\xf1\x02l\xd6k\xcbi`\xbb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4l\b\xa6\xdc\x01s\xc74)U\xd1\xd3\xf2\xc0e\xd6/\x83\xae\u01c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4l\n\xe9\xf0C\xc84\xd4Bq\xf14\x06Y=\xfe\tO8\x9f\x89RD*\xe13\xb6*\x80\x00\u07d4l\f\xc9\x17\xcb\xee}|\t\x97c\xf1Nd\xdf}4\xe2\xbf\t\x89\r\x8drkqw\xa8\x00\x00\xe0\x94l\x0eq/@\\Yr_\xe8)\xe9wK\xf4\xdf\u007fM\xd9e\x8a\f(h\x88\x9c\xa6\x8aD\x00\x00\xe0\x94l\x10\x12\x05\xb3#\xd7uD\xd6\xdcR\xaf7\xac\xa3\xce\xc6\xf7\xf1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4l\x15\xec5 \xbf\x8e\xbb\xc8 \xbd\x0f\xf1\x97x7T\x94\u03dd\x89l\xb7\xe7Hg\xd5\xe6\x00\x00\xe0\x94l\x1d\xdd3\xc8\x19f\u0706!w`q\xa4\x12\x94\x82\xf2\xc6_\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4l%2\u007f\x8d\u02f2\xf4^V\x1e\x86\xe3]\x88P\xe5:\xb0Y\x89;\xcd\xf9\xba\xfe\xf2\xf0\x00\x00\u07d4l.\x9b\xe6\u052bE\x0f\xd1%1\xf3?\x02\x8caFt\xf1\x97\x89\xc2\x12z\xf8X\xdap\x00\x00\u07d4l5\x9eX\xa1=Ex\xa93\x8e3\\g\xe7c\x9f_\xb4\u05c9\v\xd1[\x94\xfc\x8b(\x00\x00\u07d4l=\x18pA&\xaa\x99\xee3B\xce`\xf5\xd4\xc8_\x18g\u0349\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4lGK\xc6jTx\x00f\xaaOQ.\xef\xa7s\xab\xf9\x19\u01c9\x05\x18\x83\x15\xf7v\xb8\x00\x00\u07d4lNBn\x8d\xc0\x05\u07e3Ql\xb8\xa6\x80\xb0.\ua56e\x8e\x89Hz\x9a0E9D\x00\x00\u07d4lR\xcf\b\x95\xbb5\xe6V\x16\x1eM\xc4j\xe0\xe9m\xd3\xe6,\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4lT\"\xfbK\x14\xe6\u064b`\x91\xfd\xecq\xf1\xf0\x86@A\x9d\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4l\\:T\u0367\xc2\xf1\x18\xed\xbaCN\xd8\x1en\xbb\x11\xddz\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4lc\xf8EV\u0490\xbf\u0359\xe44\ue657\xbf\xd7yWz\x89lk\x93[\x8b\xbd@\x00\x00\u07d4lc\xfc\x85\x02\x9a&T\u05db+\xeaM\xe3I\xe4REw\u0149#\xc7W\a+\x8d\xd0\x00\x00\u07d4led\xe5\xc9\xc2N\xaa\xa7D\xc9\xc7\xc9h\xc9\xe2\xc9\xf1\xfb\xae\x89I\x9bB\xa2\x119d\x00\x00\xe0\x94lg\xd6\xdb\x1d\x03Ql\x12\x8b\x8f\xf24\xbf=I\xb2m)A\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4lg\xe0\u05f6.*\bPiE\xa5\xdf\xe3\x82c3\x9f\x1f\"\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4lj\xa0\xd3\vdr\x19\x90\xb9PJ\x86?\xa0\xbf\xb5\xe5}\xa7\x89\x92^\x06\xee\xc9r\xb0\x00\x00\u07d4lqJX\xff\xf6\xe9}\x14\xb8\xa5\xe3\x05\xeb$@eh\x8b\xbd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4l\x80\rKI\xba\a%\x04`\xf9\x93\xb8\xcb\xe0\v&j%S\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\u07d4l\x80\x8c\xab\xb8\xff_\xbbc\x12\xd9\xc8\xe8J\xf8\xcf\x12\xef\bu\x89\xd8\xd8X?\xa2\xd5/\x00\x00\xe0\x94l\x82 )!\x8a\xc8\xe9\x8a&\f\x1e\x06@)4\x889\x87[\x8a\x01\x0f\x97\xb7\x87\xe1\xe3\b\x00\x00\u07d4l\x84\u02e7|m\xb4\xf7\xf9\x0e\xf1=^\xe2\x1e\x8c\xfc\u007f\x83\x14\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94l\x86\x87\xe3Aw\x10\xbb\x8a\x93U\x90!\xa1F\x9ej\x86\xbcw\x8a\x02[-\xa2x\xd9k{\x80\x00\xe0\x94l\x88,'s,\xef\\|\x13\xa6\x86\xf0\xa2\xeawUZ\u0089\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4l\xa5\xde\x00\x81}\xe0\xce\xdc\xe5\xfd\x00\x01(\xde\xde\x12d\x8b<\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4l\xa6\xa12\xce\x1c\u0488\xbe\xe3\x0e\xc7\xcf\xef\xfb\x85\xc1\xf5\nT\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94l\xb1\x1e\xcb2\xd3\u0382\x96\x011\x066\xf5\xa1\f\xf7\u03db_\x8a\x04?\u851c8\x01\xf5\x00\x00\u07d4l\xc1\xc8x\xfal\u078a\x9a\v\x83\x11$~t\x1eFB\xfem\x895e\x9e\xf9?\x0f\xc4\x00\x00\xe0\x94l\xcb\x03\xac\xf7\xf5<\xe8z\xad\xcc!\xa9\x93-\xe9\x15\xf8\x98\x04\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4l\xd2\x12\xae\xe0N\x01?=*\xba\u04a0#`k\xfb\\j\u01c9lj\xccg\u05f1\xd4\x00\x00\u07d4l\xd2(\xdcq!i0\u007f\xe2|\xebtw\xb4\x8c\xfc\x82r\xe5\x89\x044\xea\x94\u06caP\x00\x00\u07d4l\xe1\xb0\xf6\xad\xc4pQ\xe8\xab8\xb3\x9e\xdbA\x86\xb0;\xab\u0309Ay\x97\x94\xcd$\xcc\x00\x00\u07d4l\xea\xe3s=\x8f\xa4=l\xd8\f\x1a\x96\xe8\xeb\x93\x10\x9c\x83\xb7\x89\x10'\x94\xad \xdah\x00\x00\u07d4m\x05i\xe5U\x8f\xc7\xdf'f\xf2\xba\x15\u070a\xef\xfc[\xebu\x89\xd8\xe6\x00\x1el0+\x00\x00\u07d4m\x12\x0f\f\xaa\xe4O\xd9K\xca\xfeU\xe2\xe2y\uf5ba\\z\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4m\x14V\xff\xf0\x10N\xe8D\xa31G7\x8438\xd2L\xd6l\x89\a\xb0l\xe8\u007f\xddh\x00\x00\u07d4m \xef\x97\x04g\nP\v\xb2i\xb5\x83.\x85\x98\x02\x04\x9f\x01\x89\a\f\x1c\xc7;\x00\xc8\x00\x00\xe0\x94m/\x97g4\xb9\xd0\a\r\x18\x83\xcfz\u02b8\xb3\xe4\x92\x0f\xc1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4m9\xa9\u93c1\xf7i\xd7:\xad,\xea\xd2v\xac\x13\x87\xba\xbe\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4m;x6\xa2\xb9\u0619r\x1aM#{R#\x85\xdc\xe8\xdf\u034966\xc2^f\xec\xe7\x00\x00\u07d4m?+\xa8V\u033b\x027\xfava\x15k\x14\xb0\x13\xf2\x12@\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94m@\b\xb4\xa8\x88\xa8&\xf2H\xeej\v\r\xfd\xe9\xf92\x10\xb9\x8a\x01'\xfc\xb8\xaf\xae \xd0\x00\x00\u07d4m@\xca'\x82m\x97s\x1b>\x86\xef\xfc\u05f9*Aa\xfe\x89\x89lk\x93[\x8b\xbd@\x00\x00\u07d4mD\x97J1\u0447\xed\xa1m\xddG\xb9\xc7\xecP\x02\xd6\x1f\xbe\x892\xf5\x1e\u06ea\xa30\x00\x00\xe0\x94mK\\\x05\xd0j \x95~\x17H\xabm\xf2\x06\xf3C\xf9/\x01\x8a\x02\x1f6\x06\x99\xbf\x82_\x80\x00\xe0\x94mL\xbf=\x82\x84\x83:\xe9\x93D0>\b\xb4\xd6\x14\xbf\xda;\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4mY\xb2\x1c\xd0\xe2t\x88\x04\u066b\xe0d\xea\u00be\xf0\xc9_'\x89lk\x93[\x8b\xbd@\x00\x00\u07d4mc\u04ce\xe8\xb9\x0e\x0en\xd8\xf1\x92\xed\xa0Q\xb2\u05a5\x8b\xfd\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4mf4\xb5\xb8\xa4\x01\x95\xd9I\x02z\xf4\x82\x88\x02\t,\ued89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94m}\x1c\x94\x95\x11\xf8\x83\x03\x80\x8c`\xc5\xea\x06@\xfc\xc0&\x83\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4m\x84m\xc1&W\xe9\x1a\xf2P\bQ\x9c>\x85\u007fQp}\u0589\xf8\xd3\v\xc9#B\xf8\x00\x00\u07d4m\x91\x93\x99k\x19F\x17!\x11\x06\xd1c^\xb2l\u0136ll\x89\x15\xaa\x1e~\x9d\xd5\x1c\x00\x00\u07d4m\x99\x97P\x98\x82\x02~\xa9G#\x14$\xbe\xde\xde)e\u043a\x89l\x81\u01f3\x11\x95\xe0\x00\x00\u07d4m\xa0\xed\x8f\x1di3\x9f\x05\x9f*\x0e\x02G\x1c\xb4O\xb8\u00fb\x892\xbc8\xbbc\xa8\x16\x00\x00\u07d4m\xb7+\xfdC\xfe\xf4e\xcaV2\xb4Z\xabra@N\x13\xbf\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94m\xbe\x8a\xbf\xa1t(\x06&9\x817\x1b\xf3\xd3U\x90\x80kn\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4m\xc3\xf9+\xaa\x1d!\u06b78+\x892a\xa05o\xa7\xc1\x87\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4m\xc7\x05:q\x86\x16\xcf\u01cb\xeec\x82\xeeQ\xad\xd0\xc7\x030\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94m\xcc~d\xfc\xaf\xcb\xc2\xdcl\x0e^f,\xb3G\xbf\xfc\xd7\x02\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4m\xda_x\x8alh\x8d\u07d2\x1f\xa3\x85.\xb6\xd6\xc6\xc6)f\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4m\xdb`\x92w\x9dXB\xea\xd3x\xe2\x1e\x81 \xfdLk\xc12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4m\xdf\xefc\x91U\u06ab\n\\\xb4\x95:\xa8\u016f\xaa\x88\x04S\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4m\xe0/-\xd6~\xfd\xb794\x02\xfa\x9e\xaa\xcb\xcfX\x9d.V\x89@\x13\x8b\x91~\u07f8\x00\x00\u07d4m\u4d418\\\xf7\xfc\x9f\xe8\xc7}\x13\x1f\xe2\xeew$\xc7j\x89})\x97s=\xcc\xe4\x00\x00\u07d4m\xe4\xd1R\x19\x18/\xaf:\xa2\xc5\xd4\xd2Y_\xf20\x91\xa7'\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4m\xed\xf6.t?M,*K\x87\xa7\x87\xf5BJz\xeb9<\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4m\xf2Of\x85\xa6/y\x1b\xa37\xbf?\xf6~\x91\xf3\u053c:\x89ukI\xd4\nH\x18\x00\x00\u07d4m\xf5\xc8O{\x90\x9a\xab>a\xfe\x0e\xcb\x1b;\xf2`\"*\u0489\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4m\xff\x90\xe6\xdc5\x9d%\x90\x88+\x14\x83\xed\xbc\xf8\x87\xc0\xe4#\x8965\u026d\xc5\u07a0\x00\x00\u07d4n\x01\xe4\xadV\x9c\x95\xd0\a\xad\xa3\r^-\xb1(\x88I\"\x94\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\a;f\u0478\xc6gD\u0600\x96\xa8\u0759\xec~\x02(\u0689\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\x0e\xe7\x06\x12\xc9v(}I\x9d\u07e6\xc0\xdc\xc1,\x06\xde\xea\x89\a\v\u0579V!F\x00\x00\xe0\x94n\x12\xb5\x1e\"[JCr\xe5\x9a\u05e2\xa1\xa1>\xa3\u04e17\x8a\x03\x00F\xc8\xccw_\x04\x00\x00\u07d4n\x1a\x04l\xaf[JW\xf4\xfdK\xc1sb!&\xb4\xe2\xfd\x86\x89a\t=|,m8\x00\x00\u07d4n\x1e\xa4\xb1\x83\xe2R\u027bwg\xa0\x06\u05346\x96\u02ca\xe9\x89\x0f\xf3x<\x85\xee\u0400\x00\u07d4n%[p\n\xe7\x13\x8aK\xac\xf2(\x88\xa9\xe2\xc0\n(^\xec\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n'\n\xd5)\xf1\xf0\xb8\xd9\xcbm$'\xec\x1b~-\xc6Jt\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4n.\xab\x85\u0709\xfe)\xdc\n\xa1\x852G\u06b4:R=V\x89\x04V9\x18$O@\x00\x00\u07d4n:Q\xdbt=3M/\xe8\x82$\xb5\xfe|\x00\x8e\x80\xe6$\x89\x05\xbf\v\xa6cOh\x00\x00\u07d4nL*\xb7\xdb\x02i9\xdb\u04fch8J\xf6`\xa6\x18\x16\xb2\x89\t\r\x97/22<\x00\x00\u07d4nM.9\u0203f)\u5d07\xb1\x91\x8af\x9a\xeb\u07556\x8965\u026d\xc5\u07a0\x00\x00\u07d4n\\-\x9b\x1cTj\x86\xee\xfd]\nQ \xc9\xe4\xe70\x19\x0e\x89\n\xd2\x01\xa6yO\xf8\x00\x00\u07d4n`\xae\u19cf\x8e\u068bBLs\xe3S5J\xe6|0B\x89\xbd5\xa4\x8d\x99\x19\xe6\x00\x00\u07d4nd\xe6\x12\x9f\"N7\x8c\x0ensj~z\x06\xc2\x11\xe9\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4nm[\xbb\xb9\x05;\x89\xd7D\xa2s\x16\u00a7\xb8\xc0\x9bT}\x891Rq\n\x02>m\x80\x00\u07d4nr\xb2\xa1\x18j\x8e)\x16T;\x1c\xb3jh\x87\x0e\xa5\u0457\x89\n\x15D\xbe\x87\x9e\xa8\x00\x00\u07d4nv\x1e\xaa\x0f4_w{TA\xb7:\x0f\xa5\xb5k\x85\xf2-\x89lk\x93[\x8b\xbd@\x00\x00\u07d4ny\xed\u0504[\anL\u060d\x18\x8bnC-\xd9?5\xaa\x893\xc5I\x901r\f\x00\x00\u07d4n\x82\x12\xb7\"\xaf\xd4\b\xa7\xa7>\xd3\xe29^\xe6EJ\x030\x89\b\x9e\x91y\x94\xf7\x1c\x00\x00\u07d4n\x84\x87m\xbb\x95\xc4\vfV\xe4+\xa9\xae\xa0\x8a\x99;T\u0709;\xbc`\xe3\xb6\u02fe\x00\x00\u07d4n\x84\xc2\xfd\x18\xd8\tW\x14\xa9h\x17\x18\x9c\xa2\x1c\xcab\xba\xb1\x89\x12{lp&!\u0340\x00\u07d4n\x86m\x03-@Z\xbd\xd6\\\xf6QA\x1d\x807\x96\xc2#\x11\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94n\x89\x9eY\xa9\xb4\x1a\xb7\xeaA\xdfu\x17\x86\x0f*\xcbY\xf4\xfd\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4n\x89\xc5\x1e\xa6\xde\x13\xe0l\xdct\x8bg\xc4A\x0f\u9f2b\x03\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\x8a&h\x9fz/\xde\xfd\x00\x9c\xba\xaaS\x10%4P\u06ba\x89o!7\x17\xba\xd8\xd3\x00\x00\u07d4n\x96\xfa\xed\xa3\x05C\x02\xc4_X\xf1a2L\x99\xa3\xee\xbbb\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4n\xb0\xa5\xa9\xae\x96\xd2,\xf0\x1d\x8f\xd6H;\x9f8\xf0\x8c,\x8b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\xb3\x81\x96\x17@@X&\x8f\f<\xff5\x96\xbf\xe9\x14\x8c\x1c\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94n\xb5W\x8ak\xb7\xc3!S\x19[\r\x80 \xa6\x91HR\xc0Y\x8a\x8b\u00ab\xf4\x02!\xf4\x80\x00\x00\u07d4n\xbb^iW\xaa\x82\x1e\xf6Y\xb6\x01\x8a9:PL\xaeDP\x89lk\x93[\x8b\xbd@\x00\x00\u07d4n\xbc\xf9\x95\u007f_\xc5\u916d\xd4u\";\x04\xb8\xc1Jz\xed\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4n\xc3e\x95q\xb1\x1f\x88\x9d\xd49\xbc\xd4\xd6u\x10\xa2[\xe5~\x89\x06\xaa\xf7\xc8Qm\f\x00\x00\u07d4n\u021b9\xf9\xf5'jU>\x8d\xa3\x0en\xc1z\xa4~\xef\u01c9\x18BO_\v\x1bN\x00\x00\u07d4n\xc9m\x13\xbd\xb2M\u01e5W)?\x02\x9e\x02\xddt\xb9zU\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\xca\xef\xa6\xfc>\xe54bm\xb0,o\x85\xa0\u00d5W\x1ew\x89 \x86\xac5\x10R`\x00\x00\u07d4n\u04a1+\x02\xf8\u0188\u01f5\u04e6\xea\x14\xd66\x87\u06b3\xb6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4n\u0604E\x9f\x80\x9d\xfa\x10\x16\xe7p\xed\xaf>\x9f\xefF\xfa0\x89\xb8R\xd6x \x93\xf1\x00\x00\xe0\x94n\xdf\u007fR\x83r\\\x95>\xe6C\x17\xf6a\x88\xaf\x11\x84\xb03\x8a\x01\xb4d1\x1dE\xa6\x88\x00\x00\u07d4n\xe8\xaa\xd7\xe0\xa0e\u0605-|;\x9an_\xdcK\xf5\f\x00\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4n\xef\u0705\x0e\x87\xb7\x15\xc7'\x91w<\x03\x16\xc3U\x9bX\xa4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4n\xf9\xe8\u0276!}Vv\x9a\xf9}\xbb\x1c\x8e\x1b\x8b\xe7\x99\u0489\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4n\xfb\xa8\xfb*\u0176s\a)\xa9r\xec\"D&\xa2\x87\u00ed\x89\x0fY\x85\xfb\xcb\xe1h\x00\x00\xe0\x94n\xfd\x90\xb55\xe0\v\xbd\x88\x9f\xda~\x9c1\x84\xf8y\xa1Q\u06ca\x02#\x85\xa8'\xe8\x15P\x00\x00\u07d4o\x05\x16f\xcbO{\u04b1\x90r!\xb8)\xb5U\u05e3\xdbt\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4o\x0e\xdd#\xbc\xd8_`\x15\xf9(\x9c(\x84\x1f\xe0L\x83\xef\xeb\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4o\x13zq\xa6\xf1\x97\xdf,\xbb\xf0\x10\u073d\x89a\t=|,m8\x00\x00\u07d4p\x10\xbe-\xf5{\u042b\x9a\xe8\x19l\xd5\n\xb0\xc5!\xab\xa9\xf9\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4p#\xc7\tV\xe0J\x92\xd7\x00%\xaa\u0497\xb59\xaf5Xi\x89lk\x93[\x8b\xbd@\x00\x00\u07d4p%\x96]+\x88\xda\x19}DY\xbe=\xc98cD\xcc\x1f1\x89l\xb7\xe7Hg\xd5\xe6\x00\x00\u07d4p(\x02\xf3m\x00%\x0f\xabS\xad\xbc\u0596\xf0\x17oc\x8aI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4pH\x19\xd2\xe4Mn\xd1\xda%\xbf\u0384\u011f\u0322V\x13\xe5\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4pJn\xb4\x1b\xa3O\x13\xad\xdd\xe7\xd2\xdb}\xf0I\x15\u01e2!\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4pJ\xb1\x15\r^\x10\xf5\xe3I\x95\b\xf0\xbfpe\x0f\x02\x8dK\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4pJ\xe2\x1dv-n\x1d\xde(\xc25\xd11\x04Yr6\xdb\x1a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4pM$<)x\xe4l,\x86\xad\xbe\xcd$n;)_\xf63\x89m\x12\x1b\xeb\xf7\x95\xf0\x00\x00\u07d4pM]\xe4\x84m9\xb5<\xd2\x1d\x1cI\xf0\x96\xdb\\\x19\xba)\x89\b=lz\xabc`\x00\x00\u07d4p]\xdd85T\x82\xb8\xc7\u04f5\x15\xbd\xa1P\r\xd7\u05e8\x17\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94pan(\x92\xfa&\x97\x05\xb2\x04k\x8f\xe3\xe7/\xa5X\x16\u04ca\x04<3\xc1\x93ud\x80\x00\x00\u07d4pg\x0f\xbb\x05\xd30\x14DK\x8d\x1e\x8ew\x00%\x8b\x8c\xaam\x89lk\x93[\x8b\xbd@\x00\x00\u07d4p\x81\xfak\xaa\xd6\u03f7\xf5\x1b,\xca\x16\xfb\x89p\x99\x1ad\xba\x89\f\xae\xc0\x05\xf6\xc0\xf6\x80\x00\xe0\x94p\x85\xae~~M\x93!\x97\xb5\u01c5\x8c\x00\xa3gF&\xb7\xa5\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4p\x86\xb4\xbd\xe3\xe3]J\xeb$\xb8%\xf1\xa2\x15\xf9\x9d\x85\xf7E\x89lh\xcc\u041b\x02,\x00\x00\u07d4p\x8a*\xf4%\u03b0\x1e\x87\xff\xc1\xbeT\xc0\xf52\xb2\x0e\xac\u0589\aE\u0503\xb1\xf5\xa1\x80\x00\u07d4p\x8e\xa7\a\xba\xe45\u007f\x1e\xbe\xa9Y\u00e2P\xac\u05aa!\xb3\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u0794p\x8f\xa1\x1f\xe3=\x85\xad\x1b\xef\u02ee8\x18\xac\xb7\x1fj}~\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4p\x9101\x16\xd5\xf28\x9b##\x8bMej\x85\x96\u0644\u04c9;N~\x80\xaaX3\x00\x00\u07d4p\x99\xd1/n\xc6V\x89\x9b\x04\x9avW\x06]b\x99h\x92\u0209\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4p\x9f\xe9\xd2\xc1\xf1\xceB |\x95\x85\x04J`\x89\x9f5\x94/\x89lk\x93[\x8b\xbd@\x00\x00\u07d4p\xa05I\xaaah\xe9~\x88\xa5\b3\nZ\v\xeatq\x1a\x89Hz\x9a0E9D\x00\x00\u07d4p\xa4\x06}D\x8c\xc2]\xc8\xe7\x0ee\x1c\xea|\xf8N\x92\x10\x9e\x89\t\x8a}\x9b\x83\x14\xc0\x00\x00\u07d4p\xab4\xbc\x17\xb6o\x9c;c\xf1Q'O*r|S\x92c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4p\xc2\x13H\x8a\x02\f<\xfb9\x01N\xf5\xbad\x04rK\u02a3\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4p\xd2^\xd2\u022d\xa5\x9c\b\x8c\xf7\r\xd2+\xf2\u06d3\xac\xc1\x8a\x899GEE\u4b7c\x00\x00\u07d4p\xe5\xe9\xdas_\xf0w$\x9d\u02da\xaf=\xb2\xa4\x8d\x94\x98\xc0\x8965\u026d\xc5\u07a0\x00\x00\u07d4p\xfe\xe0\x8b\x00\xc6\xc2\xc0Jp\xc0\xce=\x92\u03ca\x01Z\xf1\u05cbX\xc4\x00\x00\x00\u0794q\v\xe8\xfd^)\x18F\x8b\u2abe\xa8\r\x82\x845\u05d6\x12\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4q\x13]\x8f\x05\x96<\x90ZJ\a\x92)\t#Z\x89jR\ua262\xa1]\tQ\x9b\xe0\x00\x00\u07d4q\x1e\xcfw\xd7\x1b=\x0e\xa9\\\xe4u\x8a\xfe\u0379\xc11\a\x9d\x89)3\x1eeX\xf0\xe0\x00\x00\u07d4q!?\xca14\x04 N\u02e8q\x97t\x1a\xa9\xdf\xe9c8\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94q+vQ\x02\x14\xdcb\x0fl:\x1d\u049a\xa2+\xf6\xd2\x14\xfb\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4q/\xf77\n\x13\xed6\ts\xfe\u071f\xf5\xd2\xc9:P^\x9e\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4q3\x84:x\xd99\u019dD\x86\xe1\x0e\xbc{`*4\x9f\xf7\x89\x11\xd5\xca\xcc\xe2\x1f\x84\x00\x00\u07d4qH\xae\xf32a\xd8\x03\x1f\xac?q\x82\xff5\x92\x8d\xafT\u0649\xdeB\xee\x15D\u0750\x00\x00\u07d4qcu\x8c\xbblLR^\x04\x14\xa4\n\x04\x9d\xcc\xcc\xe9\x19\xbb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4qh\xb3\xbb\x8c\x16s!\u067d\xb0#\xa6\xe9\xfd\x11\xaf\u026f\u0649a\t=|,m8\x00\x00\u07d4qirN\xe7\"q\xc54\xca\xd6B\x0f\xb0N\xe6D\u02c6\xfe\x89\x16<+@\u06e5R\x00\x00\u07d4qj\xd3\xc3:\x9b\x9a\n\x18\x96sW\x96\x9b\x94\xee}*\xbc\x10\x89\x1a!\x17\xfeA*H\x00\x00\xe0\x94qk\xa0\x1e\xad*\x91'\x065\xf9_%\xbf\xaf-\xd6\x10\xca#\x8a\ty\xe7\x01 V\xaax\x00\x00\u07d4qmP\u0320\x1e\x93\x85\x00\xe6B\x1c\xc0p\xc3P|g\u04c7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4qv,cg\x8c\x18\xd1\xc67\x8c\xe0h\xe6f8\x13\x15\x14~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4qxL\x10Q\x17\xc1\xf6\x895y\u007f\xe1Y\xab\xc7NC\xd1j\x89l\x81\u01f3\x11\x95\xe0\x00\x00\xe0\x94qyro\\q\xae\x1bm\x16\xa6\x84(\x17Nk4\xb26F\x8a\x01\x8e\xa2P\t|\xba\xf6\x00\x00\xe0\x94q|\xf9\xbe\xab680\x8d\xed~\x19^\f\x86\x13-\x16?\xed\x8a\x032n\xe6\xf8e\xf4\"\x00\x00\u07d4q\x80\xb8>\xe5WC\x17\xf2\x1c\x80r\xb1\x91\u0615\xd4aS\u00c9\x18\xef\xc8J\xd0\u01f0\x00\x00\u07d4q\x94kq\x17\xfc\x91^\xd1\a8_B\u065d\xda\xc62I\u0089lk\x93[\x8b\xbd@\x00\x00\xe0\x94q\x9e\x89\x1f\xbc\xc0\xa3>\x19\xc1-\xc0\xf0 9\xca\x05\xb8\x01\u07ca\x01OU8F:\x1bT\x00\x00\u07d4q\xc7#\n\x1d5\xbd\u0581\x9e\u0539\xa8\x8e\x94\xa0\xeb\a\x86\u0749\uc80b5=$\x14\x00\x00\u07d4q\xd2\xccm\x02W\x8ce\xf7\r\xf1\x1bH\xbe\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4r\x83\xcdFu\xdaX\u0116UaQ\xda\xfd\x80\xc7\xf9\x95\xd3\x18\x89)3\x1eeX\xf0\xe0\x00\x00\u07d4r\x86\xe8\x9c\xd9\u078fz\x8a\x00\xc8o\xfd\xb59\x92\u0752Q\u0449i*\xe8\x89p\x81\xd0\x00\x00\u07d4r\x8f\x9a\xb0\x80\x15}\xb3\a1V\xdb\xca\x1a\x16\x9e\xf3\x17\x94\a\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4r\x94\xc9\x18\xb1\xae\xfbM%\x92~\xf9\u05d9\xe7\x1f\x93\xa2\x8e\x85\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94r\x94\uc763\x10\xbckK\xbd\xf5C\xb0\xefE\xab\xfc>\x1bM\x8a\x04\xa8\x9fT\xef\x01!\xc0\x00\x00\u07d4r\x9a\xadF'tNS\xf5\xd6c\t\xaatD\x8b:\xcd\xf4o\x89lk\x93[\x8b\xbd@\x00\x00\u07d4r\xa2\xfc\x86u\xfe\xb9r\xfaA\xb5\r\xff\u06fa\xe7\xfa*\u07f7\x89\x9a\xb4\xfcg\xb5(\xc8\x00\x00\u07d4r\xa8&\b&)G&\xa7[\xf3\x9c\u066a\x9e\a\xa3\xea\x14\u0349lk\x93[\x8b\xbd@\x00\x00\u07d4r\xb0Yb\xfb*\u0549\xd6Z\xd1j\"U\x9e\xba\x14X\xf3\x87\x89\a?u\u0460\x85\xba\x00\x00\u07d4r\xb5c?\xe4w\xfeT.t/\xac\xfdi\f\x13xT\xf2\x16\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4r\xb7\xa0=\xda\x14\u029cf\x1a\x1dF\x9f\xd376\xf6s\xc8\xe8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4r\xb9\x04D\x0e\x90\xe7 \u05ac\x1c*\u05dc2\x1d\xcc\x1c\x1a\x86\x89T\x06\x923\xbf\u007fx\x00\x00\xe0\x94r\xb9\nM\xc0\x97#\x94\x92\u0179w}\xcd\x1eR\xba+\xe2\u008a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4r\xbb'\u02d9\xf3\xe2\xc2\u03d0\xa9\x8fp}0\xe4\xa2\x01\xa0q\x89X\xe7\x92n\xe8X\xa0\x00\x00\xe0\x94r\xc0\x83\xbe\xad\xbd\xc2'\xc5\xfbC\x88\x15\x97\xe3.\x83\xc2`V\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4r\xcd\x04\x8a\x11\x05tH)\x83I-\xfb\x1b\xd2yB\xa6\x96\xba\x89lk\x93[\x8b\xbd@\x00\x00\u07d4r\xd0=M\xfa\xb3P\f\xf8\x9b\x86\x86o\x15\xd4R\x8e\x14\xa1\x95\x89\xf3K\x82\xfd\x8e\x91 \x00\x00\u07d4r\u06bb[n\ud799\xbe\x91X\x88\xf6V\x80V8\x16\b\xf8\x89\vL\x96\xc5,\xb4\xfe\x80\x00\u07d4r\xfbI\u009d#\xa1\x89P\u0132\xdc\r\xdfA\x0fS-oS\x89lk\x93[\x8b\xbd@\x00\x00\u07d4r\xfe\xaf\x12EyR9Td[\u007f\xaf\xff\x03x\xd1\xc8$.\x8965\u026d\xc5\u07a0\x00\x00\u07d4s\x01\xdcL\xf2mq\x86\xf2\xa1\x1b\xf8\xb0\x8b\xf2)F?d\xa3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4s\x04G\xf9|\xe9\xb2_\"\xba\x1a\xfb6\xdf'\xf9Xk\ub6c9,s\xc97t,P\x00\x00\u07d4s\x06\xde\x0e(\x8bV\xcf\u07d8~\xf0\xd3\xcc)f\a\x93\xf6\u0749\x1b\x8a\xbf\xb6.\xc8\xf6\x00\x00\xe0\x94s\r\x87c\u01a4\xfd\x82J\xb8\xb8Y\x16\x1e\xf7\xe3\xa9j\x12\x00\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4s\x12\x81sH\x95(\x01.v\xb4\x1a^(\u018b\xa4\xe3\xa9\u050965\u026d\xc5\u07a0\x00\x00\u07d4s\x13F\x12\bETUFTE\xa4Y\xb0l7s\xb0\xeb0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4s/\xea\xd6\x0f{\xfd\u05a9\xde\u0101%\xe3s]\xb1\xb6eO\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4sB#\xd2\u007f\xf2>Y\x06\xca\xed\"YW\x01\xbb4\x83\f\xa1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4sG>r\x11Q\x10\xd0\xc3\xf1\x17\b\xf8nw\xbe+\xb0\x98<\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4sRXm\x02\x1a\xd0\xcfw\xe0\xe9(@JY\xf3t\xffE\x82\x89\xb8Pz\x82\a( \x00\x00\u07d4sU\v\xebs+\xa9\u076f\xdaz\xe4\x06\xe1\x8f\u007f\xeb\x0f\x8b\xb2\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4s[\x97\xf2\xfc\x1b\xd2K\x12\an\xfa\xf3\xd1(\x80s\xd2\f\x8c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4s^2\x86f\xedV7\x14+3\x06\xb7|\xccT`\xe7,=\x89j\xb8\xf3xy\u0251\x00\x00\u07d4sc\u0350\xfb\xab[\xb8\u011a\xc2\x0f\xc6,9\x8f\xe6\xfbtL\x89lk\x93[\x8b\xbd@\x00\x00\u07d4skDP=\xd2\xf6\xddTi\xffL[-\xb8\xeaO\xece\u0409\x11\x04\xeeu\x9f!\xe3\x00\x00\xe0\x94sk\xf1@,\x83\x80\x0f\x89>X1\x92X*\x13N\xb52\xe9\x8a\x02\x1e\x19\u0493\xc0\x1f&\x00\x00\xe0\x94s\x8c\xa9M\xb7\u038b\xe1\xc3\x05l\u0598\x8e\xb3v5\x9f3S\x8a\x05f[\x96\xcf5\xac\xf0\x00\x00\u07d4s\x91K\"\xfc/\x13\x15\x84$}\x82\xbeO\ucfd7\x8a\u053a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4s\x93'\t\xa9\u007f\x02\u024eQ\xb0\x911(e\x12#\x85\xae\x8e\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4s\x93\xcb\xe7\xf9\xba!e\xe5\xa7U5\x00\xb6\xe7]\xa3\xc3:\xbf\x89\x05k\xc7^-c\x10\x00\x00\u07d4s\xb4\u0519\xde?8\xbf5\xaa\xf7i\xa6\xe3\x18\xbcm\x126\x92\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94s\xbe\xddo\xda{\xa3'!\x85\b{cQ\xfc\x13=HN7\x8a\x01\x12&\xbf\x9d\xceYx\x00\x00\u07d4s\xbf\xe7q\x0f1\u02b9I\xb7\xa2`O\xbfR9\xce\xe7\x90\x15\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94s\u03c0\xae\x96\x88\xe1X\x0eh\xe7\x82\xcd\b\x11\xf7\xaaIM,\x8a\x01\xa4\xab\xa2%\xc2\a@\x00\x00\xe0\x94s\xd7&\x9f\xf0l\x9f\xfd3uL\xe5\x88\xf7J\x96j\xbb\xbb\xba\x8a\x01e\xc9fG\xb3\x8a \x00\x00\u07d4s\xd8\xfe\xe3\u02c6M\xce\"\xbb&\u029c/\bm^\x95\xe6;\x8965\u026d\xc5\u07a0\x00\x00\u07d4s\xdf<>yU\xf4\xf2\xd8Y\x83\x1b\xe3\x80\x00\xb1\ak8\x84\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4s\u48b6\f\U0010e2ef+w~\x17Z[\x1eM\f-\x8f\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94t\n\xf1\xee\xfd3e\u05cb\xa7\xb1,\xb1\xa6s\xe0j\arF\x8a\x04+\xf0kx\xed;P\x00\x00\xe0\x94t\v\xfdR\xe0\x16g\xa3A\x9b\x02\x9a\x1b\x8eEWj\x86\xa2\u06ca\x03\x8e\xba\xd5\xcd\xc9\x02\x80\x00\x00\u07d4t\x0fd\x16\x14w\x9d\u03e8\x8e\xd1\xd4%\xd6\r\xb4*\x06\f\xa6\x896\"\xc6v\b\x10W\x00\x00\u07d4t\x12\u027c0\xb4\xdfC\x9f\x021\x00\xe69$\x06j\xfdS\xaf\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4t\x16\x93\xc3\x03vP\x85\x13\b \xcc+c\xe9\xfa\x92\x13\x1b\x89A\rXj \xa4\xc0\x00\x00\u07d4t!\xce[\xe3\x81s\x8d\u0703\xf0&!\x97O\xf0hly\xb8\x89Xx\x8c\xb9K\x1d\x80\x00\x00\u07d4t1j\xdf%7\x8c\x10\xf5v\u0574\x1aoG\xfa\x98\xfc\xe3=\x89\x128\x13\x1e\\z\xd5\x00\x00\u07d4t6Q\xb5^\xf8B\x9d\xf5\f\xf8\x198\xc2P\x8d\xe5\u0207\x0f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4t=\xe5\x00&\xcag\xc9M\xf5O\x06b`\xe1\xd1J\xcc\x11\xac\x89lk\x93[\x8b\xbd@\x00\x00\u07d4tE /\ft)z\x00N\xb3rj\xa6\xa8-\xd7\xc0/\xa1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4tK\x03\xbb\xa8X*\xe5I\x8e-\xc2-\x19\x94\x94g\xabS\xfc\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4tL\fw\xba\u007f#i \xd1\xe44\xde]\xa3>H\xeb\xf0,\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4tP\xff\u007f\x99\xea\xa9\x11bu\u07ach\xe4(\xdf[\xbc\u0639\x89lk\x93[\x8b\xbd@\x00\x00\u07d4tV\u0172\xc5Cn>W\x10\b\x93?\x18\x05\xcc\xfe4\xe9\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4tZ\u04eb\xc6\xee\xeb$qh\x9bS\x9ex\x9c\xe2\xb8&\x83\x06\x89=A\x94\xbe\xa0\x11\x92\x80\x00\xe0\x94tZ\xec\xba\xf9\xbb9\xb7Jg\xea\x1c\xe6#\xde6\x84\x81\xba\xa6\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4t\\\xcf-\x81\x9e\u06fd\u07a8\x11{\\I\xed<*\x06n\x93\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4tb\u021c\xaa\x9d\x8dx\x91\xb2T]\xef!otd\u057b!\x89\x05\xea\xedT\xa2\x8b1\x00\x00\u07d4td\x8c\xaa\xc7H\xdd\x13\\\xd9\x1e\xa1L(\xe1\xbdM\u007f\xf6\xae\x89\xa8\r$g~\xfe\xf0\x00\x00\xe0\x94tq\xf7.\xeb0\x06$\xeb(.\xabM\x03r\x00\x00\x00\xe0\x94t\x84\xd2k\xec\xc1\xee\xa8\xc61^\xc3\xee\nE\x01\x17\u0706\xa0\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4t\x86:\xce\xc7]\x03\xd5>\x86\x0ed\x00/,\x16^S\x83w\x8965\u026d\xc5\u07a0\x00\x00\u07d4t\x89\u030a\xbeu\u0364\xef\r\x01\xce\xf2`^G\xed\xa6z\xb1\x89\a?u\u0460\x85\xba\x00\x00\u07d4t\x8c(^\xf1#?\xe4\xd3\x1c\x8f\xb17\x833r\x1c\x12\xe2z\x89lk\x93[\x8b\xbd@\x00\x00\u07d4t\x90\x87\xac\x0fZ\x97\xc6\xfa\xd0!S\x8b\xf1\xd6\u0361\x8e\r\xaa\x8965\u026d\xc5\u07a0\x00\x00\u07d4t\x95\xaex\xc0\xd9\x02a\xe2\x14\x0e\xf2\x061\x04s\x1a`\xd1\xed\x89\x01\xdbPq\x89%!\x00\x00\u07d4t\x9aJv\x8b_#rH\x93\x8a\x12\xc6#\x84{\xd4\xe6\x88\u0709\x03\xe73b\x87\x14 \x00\x00\u07d4t\x9a\xd6\xf2\xb5pk\xbe/h\x9aD\u0136@\xb5\x8e\x96\xb9\x92\x89\x05k\xc7^-c\x10\x00\x00\u07d4t\xa1\u007f\x06K4N\x84\xdbce\u0695\x91\xff\x16(%vC\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4t\xae\xec\x91]\xe0\x1c\u019b,\xb5\xa65o\xee\xa1FX\xc6\u0149\f\x9a\x95\xee)\x86R\x00\x00\u07d4t\xaf\xe5I\x02\xd6\x15x%v\xf8\xba\xac\x13\xac\x97\f\x05\x0fn\x89\t\xa1\xaa\xa3\xa9\xfb\xa7\x00\x00\u07d4t\xb7\xe0\"\x8b\xae\xd6YW\xae\xbbM\x91m3:\xae\x16O\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4t\xbcJ^ E\xf4\xff\x8d\xb1\x84\xcf:\x9b\f\x06Z\xd8\a\u0489lk\x93[\x8b\xbd@\x00\x00\u07d4t\xbc\xe9\xec86-l\x94\u032c&\xd5\xc0\xe1:\x8b;\x1d@\x8965&A\x04B\xf5\x00\x00\u07d4t\xbfzZ\xb5\x92\x93\x14\x9b\\`\xcf6Bc\xe5\xeb\xf1\xaa\r\x89\x06G\f>w\x1e<\x00\x00\xe0\x94t\xc7<\x90R\x8a\x15s6\xf1\xe7\xea b\n\xe5?\xd2G(\x8a\x01\xe6:.S\x8f\x16\xe3\x00\x00\u07d4t\u0464\xd0\xc7RN\x01\x8dN\x06\xed;d\x80\x92\xb5\xb6\xaf,\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94t\xd3f\xb0{/VG}|pw\xaco\xe4\x97\xe0\xebeY\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4t\xd3zQt{\xf8\xb7q\xbf\xbfC\x9493\xd1\x00\xd2\x14\x83\x8965\u026d\xc5\u07a0\x00\x00\u07d4t\xd6q\u065c\xbe\xa1\xabW\x90cu\xb6?\xf4+PE\x1d\x17\x8965\u026d\xc5\u07a0\x00\x00\u07d4t\xeb\xf4BVF\xe6\u03c1\xb1\t\xce{\xf4\xa2\xa6=\x84\x81_\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4t\xed3\xac\xf4?5\xb9\x8c\x920\xb9\xe6d.\xcbS0\x83\x9e\x89$\xf6\xdf\xfbI\x8d(\x00\x00\u07d4t\xef(i\xcb\xe6\b\x85`E\xd8\xc2\x04\x11\x18W\x9f\"6\xea\x89\x03<\xd6E\x91\x95n\x00\x00\u07d4t\xfcZ\x99\xc0\xc5F\x05\x03\xa1;\x05\tE\x9d\xa1\x9c\xe7\u0350\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4u\v\xbb\x8c\x06\xbb\xbf$\bC\xccux.\xe0/\b\xa9tS\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4u\x14\xad\xbd\xc6?H?0M\x8e\x94\xb6\u007f\xf30\x9f\x18\v\x82\x89!\u0120n-\x13Y\x80\x00\u0794u\x17\xf1l(\xd12\xbb@\xe3\xba6\u01ae\xf11\xc4b\xda\x17\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4u\x1a,\xa3Nq\x87\xc1c\u048e6\x18\xdb(\xb1<\x19m&\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94u\x1a\xbc\xb6\xcc\x030Y\x91\x18\x15\xc9o\u04516\n\xb0D-\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4u&\xe4\x82R\x9f\n\x14\xee\u0248q\xdd\xdd\x0er\x1b\f\u0662\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4u)\xf3y{\xb6\xa2\x0f~\xa6I$\x19\xc8L\x86vA\xd8\x1c\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94u*^\xe22a,\xd3\x00_\xb2n[Y}\xe1\x9fwk\xe6\x8a\x01'\xfc\xb8\xaf\xae \xd0\x00\x00\u07d4u,\x9f\xeb\xf4/f\xc4x{\xfa~\xb1|\xf53;\xbaPp\x89j\x99\xf2\xb5O\xddX\x00\x00\u07d4u930F\u07b1\xef\x8e\u07b9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94u\xc1\xad#\xd2?$\xb3\x84\xd0\xc3\x14\x91w\xe8f\x97a\r!\x8a\x01\\[\xcdl(\x8b\xbd\x00\x00\u07d4u\xc2\xff\xa1\xbe\xf5I\x19\xd2\t\u007fz\x14-.\x14\xf9\xb0JX\x89\x90\xf3XP@2\xa1\x00\x00\u07d4u\xd6|\xe1N\x8d)\xe8\xc2\xff\u3051{\x93\v\x1a\xff\x1a\x87\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4u\xde~\x93R\xe9\v\x13\xa5\x9aXx\xff\xec\u01c3\x1c\xacM\x82\x89\x94\x89#z\u06daP\x00\x00\u07d4u\xf7S\x9d0\x9e\x909\x98\x9e\xfe.\x8b-\xbd\x86Z\r\xf0\x88\x89\x85[[\xa6\\\x84\xf0\x00\x00\u07d4v\b\xf47\xb3\x1f\x18\xbc\vd\u04c1\xae\x86\xfd\x97\x8e\u05f3\x1f\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94v\x0f\xf35N\x0f\u0793\x8d\x0f\xb5\xb8,\xef[\xa1\\=)\x16\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4v\x1an6,\x97\xfb\xbd|Yw\xac\xba-\xa7F\x876_I\x89\t\xf7J\xe1\xf9S\xd0\x00\x00\u07d4v\x1el\xae\xc1\x89\xc20\xa1b\xec\x00e0\x19>g\u03dd\x19\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94v\x1f\x8a:*\U00028f7e\x1d\xa0\t2\x1f\xb2\x97d\xebb\xa1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4v)\x98\xe1\xd7R'\xfc\xedzp\xbe\x10\x9aL\vN\xd8d\x14\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4v-o0\u06b9\x915\xe4\xec\xa5\x1dRC\xd6\xc8b\x11\x02\u0549\x0fI\x89A\xe6d(\x00\x00\u07d4v3\x1e0yl\xe6d\xb2p\x0e\rASp\x0e\u0706\x97w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4v8\x86\xe33\xc5o\xef\xf8[\xe3\x95\x1a\xb0\xb8\x89\xce&.\x95\x89lk\x93[\x8b\xbd@\x00\x00\u07d4v:|\xba\xb7\rzd\u0427\xe5)\x80\xf6\x81G%\x93I\f\x89 \x86\xac5\x10R`\x00\x00\u07d4v>\xec\u0c0a\u021e2\xbf\xa4\xbe\xcev\x95\x14\xd8\xcb[\x85\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4v@\xa3\u007f\x80R\x98\x15\x15\xbc\xe0x\u0693\xaf\xa4x\x9bW4\x89lk\x93[\x8b\xbd@\x00\x00\u0794vA\xf7\xd2j\x86\xcd\xdb+\xe10\x81\x81\x0e\x01\xc9\xc8E\x89dI\xe8NG\xa8\xa8\x00\x00\xe0\x94vO\xc4mB\x8bm\xbc\"\x8a\x0f_U\xc9P\x8cw.\xab\x9f\x8a\x05\x81v{\xa6\x18\x9c@\x00\x00\u07d4vPn\xb4\xa7\x80\xc9Q\xc7J\x06\xb0=;\x83b\xf0\x99\x9dq\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94v[\xe2\xe1/b\x9ecI\xb9}!\xb6*\x17\xb7\xc80\xed\xab\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94vb\x81P\xe2\x99[['\x9f\xc8>\r\xd5\xf1\x02\xa6q\xdd\x1c\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4vk7Y\xe8yN\x92m\xacG=\x91:\x8f\xb6\x1a\xd0\xc2\u0249\x04\xb0m\xbb\xb4\x0fJ\x00\x00\u07d4vp\xb0/,<\xf8\xfdOG0\xf38\x1aq\xeaC\x1c3\u01c9\x0e~\xeb\xa3A\vt\x00\x00\u07d4vz\x03eZ\xf3`\x84\x1e\x81\r\x83\xf5\xe6\x1f\xb4\x0fL\xd1\x13\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4vz\u0190y\x1c.#E\x10\x89\xfelp\x83\xfeU\u07b6+\x89,s\xc97t,P\x00\x00\u07d4v\u007f\xd7y}Qi\xa0_sd2\x1c\x19\x84:\x8c4\x8e\x1e\x89\x01\x04\xe7\x04d\xb1X\x00\x00\u0794v\x84o\r\xe0;Zv\x97\x1e\xad)\x8c\xdd\b\x84:K\xc6\u0188\xd7\x1b\x0f\u088e\x00\x00\xe0\x94v\x84\x98\x93N7\xe9\x05\xf1\xd0\xe7{D\xb5t\xbc\xf3\xecJ\xe8\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4v\x8c\xe0\u06a0)\xb7\xde\xd0\"\xe5\xfcWM\x11\xcd\xe3\xec\xb5\x17\x89\x11t\xa5\xcd\xf8\x8b\xc8\x00\x00\xe0\x94v\x93\xbd\xebo\xc8+[\xcar\x13U\"1u\xd4z\bKM\x8a\x04\xa8\x9fT\xef\x01!\xc0\x00\x00\u07d4v\xaa\xf8\xc1\xac\x01/\x87R\xd4\xc0\x9b\xb4f\a\xb6e\x1d\\\xa8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4v\xab\x87\xddZ\x05\xad\x83\x9aN/\xc8\xc8Z\xa6\xba\x05d\x170\x89lk\x93[\x8b\xbd@\x00\x00\u07d4v\xaf\xc2%\xf4\xfa0}\xe4\x84U+\xbe\x1d\x9d?\x15\aLJ\x89\xa2\x90\xb5\u01ed9h\x00\x00\xe0\x94v\xbe\xca\xe4\xa3\x1d6\xf3\xcbW\u007f*CYO\xb1\xab\xc1\xbb\x96\x8a\x05C\xa9\xce\x0e\x132\xf0\x00\x00\u07d4v\xc2u5\xbc\xb5\x9c\xe1\xfa-\x8c\x91\x9c\xab\xebJk\xba\x01\u0449lk\x93[\x8b\xbd@\x00\x00\u07d4v\xca\"\xbc\xb8y\x9eS'\u012a*}\tI\xa1\xfc\xce_)\x89R\xa0?\"\x8cZ\xe2\x00\x00\u07d4v\xca\u0108\x11\x1aO\u0555\xf5h\xae:\x85\x87p\xfc\x91]_\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94v\u02dc\x8bi\xf48vu\u0102S\xe24\xcb~\rt\xa4&\x8a\x01\x90\xf4H.\xb9\x1d\xae\x00\x00\u07d4v\xf8:\xc3\xda0\xf7\t&(\xc73\x9f \x8b\xfc\x14,\xb1\ue25a\x18\xff\xe7B}d\x00\x00\xe0\x94v\xf9\xad=\x9b\xbd\x04\xae\x05\\\x14w\xc0\xc3^u\x92\xcb* \x8a\b\x83?\x11\xe3E\x8f \x00\x00\u07d4v\xff\xc1W\xadk\xf8\xd5m\x9a\x1a\u007f\u077c\x0f\xea\x01\n\xab\xf4\x8965\u026d\xc5\u07a0\x00\x00\u07d4w\x02\x8e@\x9c\xc4:;\xd3=!\xa9\xfcS\xec`n\x94\x91\x0e\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4w\f/\xb2\u0128\x17S\xac\x01\x82\xeaF\x0e\xc0\x9c\x90\xa5\x16\xf8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4w\r\x98\xd3\x1bCS\xfc\xee\xe8V\fL\u03c0>\x88\xc0\xc4\xe0\x89 \x86\xac5\x10R`\x00\x00\xe0\x94w\x13\xab\x807A\x1c\t\xbah\u007fo\x93d\xf0\xd3#\x9f\xac(\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4w\x15\a\xae\xeej%]\xc2\u035d\xf5QT\x06-\b\x97\xb2\x97\x89\x12\x1e\xa6\x8c\x11NQ\x00\x00\u07d4w\x19\x88\x87\x95\xadtY$\xc7W`\u0771\x82}\xff\xd8\u0368\x89lkLM\xa6\u077e\x00\x00\u07d4w'\xaf\x10\x1f\n\xab\xa4\xd2:\x1c\xaf\xe1|n\xb5\u06b1\xc6\u0709lk\x93[\x8b\xbd@\x00\x00\u07d4w,)\u007f\n\u0454H.\xe8\xc3\xf06\xbd\xeb\x01\xc2\x01\xd5\u0309\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94w0o\xfe.J\x8f<\xa8&\xc1\xa2I\xf7!-\xa4:\xef\xfd\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4w1A\x12}\x8c\xf3\x18\xae\xbf\x886Z\xdd=U'\xd8[j\x8966\u05ef^\u024e\x00\x00\u07d4wF\xb6\xc6i\x9c\x8f4\xca'h\xa8 \xf1\xff\xa4\xc2\a\xfe\x05\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4wQ\xf3c\xa0\xa7\xfd\x053\x19\b\t\u076f\x93@\xd8\xd1\x12\x91\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4wW\xa4\xb9\xcc=\x02G\u032a\xeb\x99\t\xa0\xe5n\x1d\xd6\xdc\u0089\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4w\\\x10\xc9>\r\xb7 [&CE\x823\xc6O\xc3?\xd7[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4wa~\xbcK\xeb\xc5\xf5\xdd\xeb\x1bzp\xcd\xebj\xe2\xff\xa0$\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4wiC\xff\xb2\xef\\\xdd5\xb8<(\xbc\x04k\xd4\xf4gp\x98\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94wp\x1e,I=\xa4|\x1bX\xf4!\xb5I]\xeeE\xbe\xa3\x9b\x8a\x01H\xf6I\xcfaB\xa5\x80\x00\u07d4wy\x8f \x12W\xb9\xc3R\x04\x95pW\xb5Ft\xae\xfaQ\u07c9\b\x13\xcaV\x90m4\x00\x00\u07d4w\x8cC\xd1\x1a\xfe;Xo\xf3t\x19-\x96\xa7\xf2=+\x9b\u007f\x89\x8b\xb4\xfc\xfa;}k\x80\x00\u07d4w\x8cy\xf4\xde\x19S\xeb\u0398\xfe\x80\x06\xd5:\x81\xfbQ@\x12\x8963\x03\"\xd5#\x8c\x00\x00\u07d4w\x92t\xbf\x18\x03\xa36\xe4\u04f0\r\u0753\xf2\xd4\xf5\xf4\xa6.\x8965\u026d\xc5\u07a0\x00\x00\u07d4w\xa1q\"\xfa1\xb9\x8f\x17\x11\xd3*\x99\xf0>\xc3&\xf3=\b\x89\\(=A\x03\x94\x10\x00\x00\u07d4w\xa3I\a\xf3\x05\xa5L\x85\xdb\t\xc3c\xfd\xe3\xc4~j\xe2\x1f\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4w\xa7i\xfa\xfd\xec\xf4\xa68v-[\xa3\x96\x9d\xf61 \xa4\x1d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4w\xbekd\xd7\xc73\xa46\xad\xec^\x14\xbf\x9a\xd7@+\x1bF\x8965\u026d\xc5\u07a0\x00\x00\u07d4w\xbf\xe9<\u0367P\x84~A\xa1\xaf\xfe\xe6\xb2\u0696\xe7!N\x89\x10CV\x1a\x88)0\x00\x00\u07d4w\u0126\x97\xe6\x03\xd4+\x12\x05l\xbb\xa7a\xe7\xf5\x1d\x04C\xf5\x89$\xdc\xe5M4\xa1\xa0\x00\x00\u07d4w\xcc\x02\xf6#\xa9\u03d8S\t\x97\xeag\xd9\\;I\x18Y\xae\x89Is\x03\xc3n\xa0\xc2\x00\x00\u07d4w\xd4?\xa7\xb4\x81\xdb\xf3\xdbS\f\xfb\xf5\xfd\xce\xd0\xe6W\x181\x89lk\x93[\x8b\xbd@\x00\x00\u07d4w\xda^lr\xfb6\xbc\xe1\xd9y\x8f{\xcd\xf1\u044fE\x9c.\x89\x016\x95\xbbl\xf9>\x00\x00\u07d4w\xf4\xe3\xbd\xf0V\x88<\xc8r\x80\xdb\xe6@\xa1\x8a\r\x02\xa2\a\x89\n\x81\x99:+\xfb[\x00\x00\u0794w\xf6\t\u0287 \xa0#&,U\xc4o-&\xfb90\xaci\x88\xf0\x15\xf2W6B\x00\x00\u07d4w\xf8\x1b\x1b&\xfc\x84\xd6\u0797\uf2df\xbdr\xa310\xccJ\x8965\u026d\xc5\u07a0\x00\x00\u07d4x\x19\xb0E\x8e1N+S\xbf\xe0\f8I_\u0539\xfd\xf8\u0589\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4x\x1b\x15\x01dz.\x06\xc0\xedC\xff\x19\u007f\xcc\xec5\xe1p\v\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4x/R\xf0\xa6v\xc7w\x16\xd5t\xc8\x1e\xc4hO\x9a\x02\n\x97\x89.\x14\xe2\x06\xb70\xad\x80\x00\u07d4x5]\xf0\xa20\xf8=\x03,p1TAM\xe3\xee\u06b5W\x89lk\x93[\x8b\xbd@\x00\x00\u07d4x6\xf7\xefk\u01fd\x0f\xf3\xac\xafD\x9c\x84\xddk\x1e,\x93\x9f\x89\xe0\x8d\xe7\xa9,\xd9|\x00\x00\u07d4x7\xfc\xb8v\xda\x00\xd1\xeb;\x88\xfe\xb3\xdf?\xa4\x04/\xac\x82\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4x>\uc2a5\xda\xc7{.f#\xedQ\x98\xa41\xab\xba\xee\a\x89\x17\xda:\x04\u01f3\xe0\x00\x00\u07d4x\\\x8e\xa7t\xd70D\xa74\xfay\n\x1b\x1et>w\xed|\x89\f\xf1Rd\f\\\x83\x00\x00\u07d4x`\xa3\xde8\xdf8*\xe4\xa4\xdc\xe1\x8c\f\a\xb9\x8b\xce=\xfa\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94xcCq\xe1s\x04\xcb\xf39\xb1E*L\xe48\xdcvL\u038a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4xd\u0719\x9f\xe4\xf8\xe0\x03\xc0\xf4=\xec\u00da\xae\x15\"\xdc\x0f\x89\x05\x1e\x10+\xd8\xec\xe0\x00\x00\u07d4xtj\x95\x8d\xce\xd4\xc7d\xf8vP\x8cAJh4,\uce49\x02\xbe7O\xe8\xe2\xc4\x00\x00\xe0\x94x}1?\xd3k\x05>\xee\xae\xdb\xcet\xb9\xfb\x06x32\x89\x8a\x05\xc0X\xb7\x84'\x19`\x00\x00\u07d4x\x85\x9c[T\x8bp\r\x92\x84\xce\xe4\xb6c=GJ\x8a\x04{\x92\xc4\x15B$-\n\b\xc7\x0f\x99\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4x\u03c36\xb3(\xdb=\x87\x81:G+\x9e\x89\xb7^\f\xf3\xbc\x8965\u026d\xc5\u07a0\x00\x00\u07d4x\xd4\xf8\xc7\x1c\x1eh\xa6\x9a\x98\xf5/\xcbE\u068a\xf5n\xa1\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4x\xdf&\x81\xd6\xd6\x02\xe2!B\xd5A\x16\u07a1]EIW\xaa\x89\x10'\x94\xad \xdah\x00\x00\u07d4x\xe0\x8b\xc53A<&\u2473\x14?\xfa|\u026f\xb9{x\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4x\xe8?\x80\xb3g\x8cz\nN>\x8c\x84\xdc\xcd\xe0dBbw\x89a\t=|,m8\x00\x00\u07d4x\xf5\xc7G\x85\xc5f\x8a\x83\x80r\x04\x8b\xf8\xb4SYM\u06ab\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4y\x0f\x91\xbd]\x1c\\\xc4s\x9a\xe9\x13\x00\u06c9\xe1\xc10<\x93\x89lk\x93[\x8b\xbd@\x00\x00\u07d4y\x17\u5f42\xa9y\x0f\xd6P\xd0C\xcd\xd90\xf7y\x963\u06c9\xd8\xd4`,&\xbfl\x00\x00\u07d4y\x19\xe7b\u007f\x9b}T\xea;\x14\xbbM\xd4d\x9fO9\xde\xe0\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4y\x1f`@\xb4\xe3\xe5\r\xcf5S\xf1\x82\u0357\xa9\x060\xb7]\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4y0\xc2\xd9\xcb\xfa\x87\xf5\x10\xf8\xf9\x87w\xff\x8a\x84H\xcaV)\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4yE)\u041d\x01rq5\x970\x02pu\xb8z\xd8=\xaen\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4yKQ\u00deS\xd9\xe7b\xb0a;\x82\x9aD\xb4r\xf4\xff\xf3\x89$5\xe0dxA\u0300\x00\xe0\x94yU\x1c\xed\xe3v\xf7G\xe3ql\x8dy@\rvm.\x01\x95\x8a\t\xcb7\xaf\xa4\xffxh\x00\x00\u07d4y^\xbc&&\xfc9\xb0\xc8b\x94\xe0\xe87\xdc\xf5#U0\x90\x8965\u026d\xc5\u07a0\x00\x00\u07d4yn\xbb\xf4\x9b>6\xd6v\x94\xady\xf8\xff6vz\xc6\xfa\xb0\x89\x03K\xc4\xfd\xde'\xc0\x00\x00\u07d4yo\x87\xbaaz)0\xb1g\v\xe9.\xd1(\x1f\xb0\xb3F\xe1\x89\x06\xf5\xe8o\xb5((\x00\x00\u07d4yt'\xe3\xdb\xf0\xfe\xaez%\x06\xf1-\xf1\xdc@2n\x85\x05\x8965\u026d\xc5\u07a0\x00\x00\u07d4yu\x10\xe3\x86\xf5c\x93\xce\xd8\xf4w7\x8aDLHO}\xad\x8965\u026d\xc5\u07a0\x00\x00\u07d4y{\xb7\xf1W\xd9\xfe\xaa\x17\xf7m\xa4\xf7\x04\xb7M\xc1\x03\x83A\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4y\x88\x90\x131\xe3\x87\xf7\x13\xfa\u03b9\x00\\\xb9\xb6Q6\xeb\x14\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4y\x89\u041f8&\xc3\u5bccu*\x81\x15r:\x84\xd8\tp\x89\x16\x86\xf8aL\xf0\xad\x00\x00\xe0\x94y\x95\xbd\x8c\xe2\xe0\xc6{\xf1\u01e51\xd4w\xbc\xa1\xb2\xb9ua\x8a\x01BH\xd6\x17\x82\x9e\xce\x00\x00\u07d4y\xae\xb3Ef\xb9t\xc3ZX\x81\xde\xc0 \x92}\xa7\xdf]%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4y\xb1 \xeb\x88\x06s#!(\x8fgZ'\xa9\"_\x1c\xd2\ub245\xa0\xbf7\xde\xc9\xe4\x00\x00\u07d4y\xb4\x8d-a7\u00c5Ma\x1c\x01\xeaBBz\x0fY{\xb7\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4y\xb8\xaa\xd8y\xdd0V~\x87x\xd2\xd21\xc8\xf3z\xb8sN\x89lk\x93[\x8b\xbd@\x00\x00\u07d4y\xbf/{n2\x8a\xaf&\xe0\xbb\t?\xa2-\xa2\x9e\xf2\xf4q\x89a\t=|,m8\x00\x00\u07d4y\xc10\xc7b\xb8v[\x19\u04ab\u0260\x83\xab\x8f:\xady@\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4y\xc1\xbe\x19q\x1fs\xbe\xe4\xe61j\xe7T\x94Y\xaa\u03a2\xe0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4y\xc6\x00/\x84R\xca\x15\u007f\x13\x17\xe8\n/\xaf$GUY\xb7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4y\xca\xc6IO\x11\xef'\x98t\x8c\xb52\x85\xbd\x8e\"\xf9|\u0689lk\x93[\x8b\xbd@\x00\x00\u07d4y\u03e9x\n\xe6\xd8{,1\x88?\t'i\x86\u021ag5\x8965\u026d\xc5\u07a0\x00\x00\u07d4y\u06e2VG-\xb4\xe0X\xf2\xe4\xcd\xc3\xeaN\x8aBw83\x89O%\x91\xf8\x96\xa6P\x00\x00\u07d4y\xed\x10\xcf\x1fm\xb4\x82\x06\xb5\t\x19\xb9\xb6\x97\b\x1f\xbd\xaa\xf3\x89lk\x93[\x8b\xbd@\x00\x00\u0794y\xf0\x8e\x01\xce\t\x88\xe6<\u007f\x8f)\b\xfa\xdeC\xc7\xf9\xf5\u0248\xfc\x93c\x92\x80\x1c\x00\x00\u07d4y\xfdmH1Pf\xc2\x04\xf9e\x18i\xc1\tl\x14\xfc\x97\x81\x89lk\x93[\x8b\xbd@\x00\x00\u0794y\xff\xb4\xac\x13\x81*\vx\u0123{\x82u\">\x17k\xfd\xa5\x88\xf0\x15\xf2W6B\x00\x00\u07d4z\x05\x89\xb1C\xa8\xe5\xe1\a\u026cf\xa9\xf9\xf8Yz\xb3\u7ac9Q\xe92\xd7n\x8f{\x00\x00\u07d4z\nx\xa9\xcc9?\x91\xc3\xd9\xe3\x9ak\x8c\x06\x9f\a^k\xf5\x89Hz\x9a0E9D\x00\x00\u07d4z\x13p\xa7B\xec&\x87\xe7a\xa1\x9a\u0167\x942\x9e\xe6t\x04\x89\xa2\xa12ga\xe2\x92\x00\x00\xe0\x94z-\xfcw\x0e$6\x811\xb7\x84w\x95\xf2\x03\xf3\xd5\r[V\x8a\x02i\xfe\xc7\xf06\x1d \x00\x00\u07d4z3\x83N\x85\x83s>-R\xae\xadX\x9b\u046f\xfb\x1d\xd2V\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94z6\xab\xa5\xc3\x1e\xa0\xca~'{\xaa2\xecF\u0393\xcfu\x06\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94z8\x11\"\xba\xday\x1az\xb1\xf6\x03}\xac\x80C'S\xba\xad\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94zH\xd8w\xb6:\x8f\x8f\x93\x83\xe9\xd0\x1eS\xe8\fR\x8e\x95_\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4zO\x9b\x85\x06\x90\xc7\xc9F\x00\xdb\xee\f\xa4\xb0\xa4\x11\xe9\xc2!\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4zc\x86\x9f\xc7g\xa4\u01b1\xcd\x0e\x06I\xf3cL\xb1!\xd2K\x89\x043\x87Oc,\xc6\x00\x00\u07d4zg\xdd\x04:PO\xc2\xf2\xfcq\x94\xe9\xbe\xcfHL\xec\xb1\xfb\x89\r\x8drkqw\xa8\x00\x00\xe0\x94zk&\xf48\u0663RD\x91U\xb8\x87l\xbd\x17\xc9\u065bd\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4zmx\x1cw\u013a\x1f\xca\xdfhsA\xc1\xe3\x17\x99\xe9='\x89\x0e\u0683\x8cI)\b\x00\x00\u07d4zph\xe1\xc37\\\x0eY\x9d\xb1\xfb\xe6\xb2\xea#\xb8\xf4\a\u0489lk\x93[\x8b\xbd@\x00\x00\u07d4zt\xce\xe4\xfa\x0fcp\xa7\x89O\x11l\xd0\f\x11G\xb8>Y\x89+^:\xf1k\x18\x80\x00\x00\u07d4zy\xe3\x0f\xf0W\xf7\n=\x01\x91\xf7\xf5?v\x157\xaf}\xff\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94zzO\x80sW\xa4\xbb\xe6\x8e\x1a\xa8\x0692\x10\xc4\x11\u0333\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4z\x85c\x86y\x01 o?+\xf0\xfa>\x1c\x81\t\u02bc\u0345\x89\amA\xc6$\x94\x84\x00\x00\xe0\x94z\x87\x97i\n\xb7{Tp\xbf|\f\x1b\xbaa%\b\xe1\xac}\x8a\x01\xe0\x92\x96\xc37\x8d\xe4\x00\x00\u07d4z\x8c\x89\xc0\x14P\x9dV\u05f6\x810f\x8f\xf6\xa3\xec\xecsp\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94z\x94\xb1\x99\x92\u03b8\xcec\xbc\x92\xeeKZ\xde\xd1\fM\x97%\x8a\x03\x8d\x1a\x80d\xbbd\xc8\x00\x00\u07d4z\xa7\x9a\xc0C\x16\u030d\b\xf2\x00e\xba\xa6\xd4\x14(\x97\xd5N\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4z\xadM\xbc\u04ec\xf9\x97\u07d3XiV\xf7+d\u062d\x94\xee\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94z\xb2V\xb2\x04\x80\n\xf2\x017\xfa\xbc\xc9\x16\xa22Xu%\x01\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4z\xbaV\xf6:H\xbc\b\x17\u05b9p9\x03\x9az\xd6/\xae.\x89 \x86\xac5\x10R`\x00\x00\xe0\x94z\xbb\x10\xf5\xbd\x9b\xc3;\x8e\xc1\xa8-d\xb5[k\x18wuA\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4z\u010d@\xc6d\u031am\x89\xf1\xc5\xf5\xc8\n\x1cp\xe7D\u6263\x10b\xbe\xee\xd7\x00\x00\x00\u07d4z\u014fo\xfcO\x81\a\xaen07\x8eN\x9f\x99\xc5\u007f\xbb$\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4z\xd3\xf3\aao\x19\u0731C\xe6DM\xab\x9c<3a\x1fR\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4z\xd8,\xae\xa1\xa8\xb4\xed\x051\x9b\x9c\x98p\x17<\x81N\x06\xee\x89!d\xb7\xa0J\u0220\x00\x00\u07d4z\xde]f\xb9D\xbb\x86\f\x0e\xfd\xc8bv\u054fFS\xf7\x11\x89lk\x93[\x8b\xbd@\x00\x00\u07d4z\xdf\xed\xb0m\x91\xf3\xccs\x90E\v\x85U\x02p\x88<{\xb7\x89\x11x\xfa@Q]\xb4\x00\x00\u07d4z\xe1\xc1\x9eS\xc7\x1c\xeeLs\xfa\xe2\xd7\xfcs\xbf\x9a\xb5\u348965\u026d\xc5\u07a0\x00\x00\u07d4z\xe6Y\xeb;\xc4hR\xfa\x86\xfa\xc4\xe2\x1cv\x8dP8\x89E\x89\x0f\x81\f\x1c\xb5\x01\xb8\x00\x00\u07d4z\xea%\xd4+&\x12(n\x99\xc56\x97\u01bcA\x00\xe2\u06ff\x89lk\x93[\x8b\xbd@\x00\x00\u07d4z\xef{U\x1f\v\x9cF\xe7U\xc0\xf3\x8e[:s\xfe\x11\x99\xf5\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4{\v1\xffn$t^\xad\x8e\u067b\x85\xfc\v\xf2\xfe\x1dU\u0509+^:\xf1k\x18\x80\x00\x00\xe0\x94{\x0f\xea\x11v\xd5!Y3:\x14<)IC\xda6\xbb\u0774\x8a\x01\xfc}\xa6N\xa1L\x10\x00\x00\u07d4{\x11g<\xc0\x19bk)\f\xbd\xce&\x04o~m\x14\x1e!\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4{\x12!b\xc9\x13\xe7\x14l\xad\v~\xd3z\xff\xc9*\v\xf2\u007f\x89Q\xaf\tk#\x01\u0440\x00\u07d4{\x1b\xf5:\x9c\xbe\x83\xa7\u07a44W\x9f\xe7*\xac\x8d*\f\u0409\n\xd4\xc81j\v\f\x00\x00\u07d4{\x1d\xaf\x14\x89\x1b\x8a\x1e\x1b\xd4)\u0633k\x9aJ\xa1\u066f\xbf\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4{\x1f\xe1\xabM\xfd\x00\x88\xcd\xd7\xf6\x01c\xefY\xec*\xee\x06\xf5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4{%\xbb\x9c\xa8\xe7\x02!~\x933\"RP\xe5<6\x80MH\x89e\xea=\xb7UF`\x00\x00\u07d4{'\xd0\xd1\xf3\xdd<\x14\x02\x94\xd0H\x8bx>\xbf@\x15'}\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94{@\a\xc4^ZW?\u06f6\xf8\xbdtk\xf9J\xd0J<&\x8a\x038!\xf5\x13]%\x9a\x00\x00\u07d4{C\xc7\xee\xa8\xd6#U\xb0\xa8\xa8\x1d\xa0\x81\xc6Dk3\xe9\xe0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4{M*8&\x90i\xc1\x85Ww\rY\x1d$\xc5\x12\x1f^\x83\x89%\xf2s\x93=\xb5p\x00\x00\xe0\x94{au\xec\x9b\xef\xc78$\x955\xdd\xde4h\x8c\xd3n\xdf%\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94{f\x12hy\x84M\xfa4\xfee\xc9\xf2\x88\x11\u007f\xef\xb4I\xad\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4{j\x84q\x8d\xd8nc3\x84)\xac\x81\x1d|\x8a\x86\x0f!\xf1\x89a\t=|,m8\x00\x00\xe0\x94{q,z\xf1\x16v\x00jf\xd2\xfc\\\x1a\xb4\xc4y\xce`7\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4{s$-u\u029a\xd5X\xd6P)\r\xf1v\x92\xd5L\u0638\x89lnY\xe6|xT\x00\x00\u07d4{v\x1f\xeb\u007f\u03e7\xde\xd1\xf0\xeb\x05\x8fJ`\v\xf3\xa7\b\u02c9\xf9]\xd2\xec'\xcc\xe0\x00\x00\xe0\x94{\x82|\xae\u007f\xf4t\t\x18\xf2\xe00\xab&\u02d8\xc4\xf4l\xf5\x8a\x01\x94hL\v9\xde\x10\x00\x00\xe0\x94{\x892\x86B~r\xdb!\x9a!\xfcM\xcd_\xbfY(<1\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4{\x92&\xd4o\xe7Q\x94\v\xc4\x16\xa7\x98\xb6\x9c\xcf\r\xfa\xb6g\x89\u3bb5sr@\xa0\x00\x00\u07d4{\x98\xe2<\xb9k\xee\xe8\n\x16\x80i\ube8f \xed\xd5\\\u03c9\v\xa0\xc9\x15\x87\xc1J\x00\x00\u07d4{\xb0\xfd\xf5\xa6c\xb5\xfb\xa2\x8d\x9c\x90*\xf0\xc8\x11\xe2R\xf2\x98\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4{\xb9W\x1f9K\v\x1a\x8e\xbaVd\xe9\u0635\xe8@g{\xea\x89\x01\x11du\x9f\xfb2\x00\x00\xe0\x94{\xb9\x84\xc6\u06f9\xe2y\x96j\xfa\xfd\xa5\x9c\x01\xd0&'\xc8\x04\x8a\x01\xb4d1\x1dE\xa6\x88\x00\x00\u07d4{\xbb\xec^p\xbd\xea\u063b2\xb4(\x05\x98\x8e\x96H\xc0\xaa\x97\x8966\u05ef^\u024e\x00\x00\u07d4{\xca\x1d\xa6\xc8\nf\xba\xa5\xdbZ\u0245A\u013e'kD}\x89$\xcf\x04\x96\x80\xfa<\x00\x00\u07d4{\u0772\xee\x98\xde\x19\xeeL\x91\xf6a\xee\x8eg\xa9\x1d\x05K\x97\x8965\u026d\xc5\u07a0\x00\x00\u0794{\xe2\xf7h\f\x80-\xa6\x15L\x92\xc0\x19J\xe72Qzqi\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4{\xe7\xf2Eiq\x88;\x9a\x8d\xbeL\x91\xde\xc0\x8a\xc3N\x88b\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4{\xe8\u0334\xf1\x1bf\xcan\x1dW\xc0\xb59b!\xa3\x1b\xa5:\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94{\xeb\x81\xfb/^\x91Rk*\xc9y^v\u019b\xcf\xf0K\xc0\x8a\x0e\xb2.yO\n\x8d`\x00\x00\u07d4|\b\x83\x05L-\x02\xbcz\x85+\x1f\x86\xc4'w\xd0\xd5\xc8V\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4|\x0f^\a C\xc9\xeet\x02B\x19~x\xccK\x98\xcd\xf9`\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4|\x1d\xf2JO\u007f\xb2\u01f4r\xe0\xbb\x00l\xb2}\xcd\x16AV\x8965\u026d\xc5\u07a0\x00\x00\u07d4|)\xd4}W\xa73\xf5k\x9b!pc\xb5\x13\xdc;1Y#\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4|+\x96\x03\x88JO.FN\u03b9}\x17\x93\x8d\x82\x8b\xc0,\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4|8,\x02\x96a.N\x97\xe4@\xe0-8q';U\xf5;\x89\n\xb6@9\x12\x010\x00\x00\u07d4|>\xb7\x13\xc4\xc9\xe08\x1c\xd8\x15L|\x9a}\xb8d\\\xde\x17\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4|D\x01\xae\x98\xf1.\xf6\xde9\xae$\u03df\xc5\x1f\x80\xeb\xa1k\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4|E\xf0\xf8D*V\xdb\u04dd\xbf\x15\x99\x95A\\R\xedG\x9b\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94|S-\xb9\xe0\xc0l&\xfd@\xac\xc5j\xc5\\\x1e\xe9-<:\x8a?\x87\bW\xa3\xe0\xe3\x80\x00\x00\u07d4|`\xa0_zJ_\x8c\xf2xC\x916.uZ\x83A\xefY\x89f\x94\xf0\x18*7\xae\x00\x00\u07d4|`\xe5\x1f\v\xe2(\xe4\xd5o\xdd)\x92\xc8\x14\xdaw@\u01bc\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4|i$\xd0|>\xf5\x89\x19f\xfe\nxV\xc8{\xef\x9d 4\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94|\x8b\xb6Zo\xbbI\xbdA3\x96\xa9\xd7\xe3\x10S\xbb\xb3z\xa9\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94|\x9a\x11\f\xb1\x1f%\x98\xb2\xb2\x0e,\xa4\x002^A\xe9\xdb3\x8a\x05\x81v{\xa6\x18\x9c@\x00\x00\u07d4|\xbc\xa8\x8f\xcaj\x00`\xb9`\x98\\\x9a\xa1\xb0%4\xdc\"\b\x89\x19\x12z\x13\x91\xea*\x00\x00\u07d4|\xbe\xb9\x992\xe9~n\x02\x05\x8c\xfcb\u0432k\xc7\u0325+\x89lk\x93[\x8b\xbd@\x00\x00\u07d4|\xc2Jj\x95\x8c \xc7\xd1$\x96`\xf7Xb&\x95\v\r\x9a\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4|\xd2\x0e\u0335\x18\xb6\f\xab\t[r\x0fW\x15p\u02aaD~\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4|\xd5\xd8\x1e\xab7\xe1\x1ebv\xa3\xa1\t\x12Q`~\r~8\x89\x03hM^\xf9\x81\xf4\x00\x00\u07d4|\xdft!9E\x95=\xb3\x9a\xd0\xe8\xa9x\x1a\xddy.M\x1d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4|\xe4hdF\U000547be\xd6r\x15\xeb\rZ\x1d\xd7,\x11\xb8\x89x9\xd3!\xb8\x1a\xb8\x00\x00\u07d4|\xefMC\xaaA\u007f\x9e\xf8\xb7\x87\xf8\xb9\x9dS\xf1\xfe\xa1\ue209g\x8a\x93 b\xe4\x18\x00\x00\u07d4}\x03P\xe4\v3\x8d\xdasfa\x87+\xe3?\x1f\x97R\xd7U\x89\x02\xb4\xf5\xa6\U00051500\x00\xe0\x94}\x04\xd2\xed\xc0X\xa1\xaf\xc7a\xd9\u025a\xe4\xfc\\\x85\xd4\u0226\x8aB\xa9\xc4g\\\x94g\xd0\x00\x00\u07d4}\v%^\xfbW\xe1\x0fp\b\xaa\"\xd4\x0e\x97R\xdf\xcf\x03x\x89\x01\x9f\x8euY\x92L\x00\x00\xe0\x94}\x13\xd6pX\x84\xab!W\u074d\xccpF\xca\xf5\x8e\xe9K\xe4\x8a\x1d\r\xa0|\xbb>\xe9\xc0\x00\x00\u07d4}'>c~\xf1\xea\u0101\x11\x94\x13\xb9\x1c\x98\x9d\xc5\xea\xc1\"\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4}*R\xa7\xcf\f\x846\xa8\xe0\a\x97kl&\xb7\"\x9d\x1e\x15\x89\x17\xbf\x06\xb3*$\x1c\x00\x00\u07d4}4\x805i\xe0\v\u05b5\x9f\xff\b\x1d\xfa\\\n\xb4\x19zb\x89\\\xd8|\xb7\xb9\xfb\x86\x00\x00\u07d4}4\xffY\xae\x84\nt\x13\u01baL[\xb2\xba,u\xea\xb0\x18\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4}9(R\xf3\xab\xd9/\xf4\xbb[\xb2l\xb6\bt\xf2\xbeg\x95\x8966\xc2^f\xec\xe7\x00\x00\u07d4}DRg\u015a\xb8\u04a2\xd9\xe7\t\x99\x0e\th%\x80\u011f\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94}U\x13\x97\xf7\x9a)\x88\xb0d\xaf\xd0\xef\xeb\xee\x80,w!\xbc\x8a\bW\xe0\xd6\xf1\xdav\xa0\x00\x00\u07d4}Z\xa3?\xc1KQ\x84\x1a\x06\x90n\xdb+\xb4\x9c*\x11ri\x89\x10D\x00\xa2G\x0eh\x00\x00\xe0\x94}]/s\x94\x9d\xad\xda\bV\xb2\x06\x98\x9d\xf0\a\x8dQ\xa1\xe5\x8a\x02\xc4:H\x1d\xf0M\x01wb\xed\xcb\\\xaab\x9bZ\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4~\x8f\x96\xcc)\xf5{\tu\x12\f\xb5\x93\xb7\u0743=`kS\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4~\x97*\x8a|*D\xc9;!Cl8\xd2\x1b\x92R\xc3E\xfe\x89a\t=|,m8\x00\x00\u07d4~\x99\u07fe\x98\x9d;\xa5)\u0457Q\xb7\xf41\u007f\x89S\xa3\xe2\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4~\xa0\xf9n\xe0\xa5s\xa30\xb5h\x97v\x1f=L\x010\xa8\xe3\x89Hz\x9a0E9D\x00\x00\u0794~\xa7\x91\xeb\xab\x04E\xa0\x0e\xfd\xfcNJ\x8e\x9a~ue\x13m\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4~\xab\xa05\xe2\xaf7\x93\xfdtgK\x10%@\xcf\x19\n\u0779\x89E\x02l\x83[`D\x00\x00\xe0\x94~\xb4\xb0\x18\\\x92\xb6C\x9a\b\xe72!h\xcb5<\x8awJ\x8a\x02'\x19l\xa0I\x83\xca\x00\x00\xe0\x94~\xbd\x95\xe9\xc4p\xf7(5\x83\xdcn\x9d,M\xce\v\ua3c4\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4~\u0425\xa8G\xbe\xf9\xa9\xda|\xba\x1dd\x11\xf5\xc3\x161&\x19\x89\x02(\xeb7\xe8u\x1d\x00\x00\u07d4~\xda\xfb\xa8\x98K\xafc\x1a\x82\vk\x92\xbb\xc2\xc56U\xf6\xbd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4~\xdb\x02\xc6\x1a\"r\x87a\x1a\xd9Pici\xccNdzh\x89\x0e\u0683\x8cI)\b\x00\x00\u07d4~\xe5\u0280]\xce#\xaf\x89\xc2\xd4D\xe7\xe4\af\xc5Lt\x04\x89\r\v\xd4\x12\xed\xbd\x82\x00\x00\xe0\x94~\xe6\x04\u01e9\xdc)\t\xce2\x1d\u6e72OWgWuU\x8a\x01+\xf9\u01d8\\\xf6-\x80\x00\u07d4~\xf1o\xd8\xd1[7\x8a\x0f\xba0k\x8d\x03\u0758\xfc\x92a\x9f\x89%\xf2s\x93=\xb5p\x00\x00\u07d4~\xf9\x8bR\xbe\xe9S\xbe\xf9\x92\xf3\x05\xfd\xa0'\xf8\x91\x1cXQ\x89\x1b\xe7\" i\x96\xbc\x80\x00\u07d4~\xfc\x90vj\x00\xbcR7,\xac\x97\xfa\xbd\x8a<\x83\x1f\x8e\u0349\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4~\xfe\xc0\xc6%<\xaf9\u007fq(|\x1c\a\xf6\xc9X+[\x86\x89\x1a,\xbc\xb8O0\u0540\x00\u07d4\u007f\x01\xdc|7G\xca`\x8f\x98=\xfc\x8c\x9b9\xe7U\xa3\xb9\x14\x89\v8l\xad_zZ\x00\x00\u07d4\u007f\x06b\xb4\x10)\x8c\x99\xf3\x11\u04e1EJ\x1e\xed\xba/\xeav\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\u007f\x06\u021dY\x80\u007f\xa6\v\xc6\x016\xfc\xf8\x14\u02ef%C\xbd\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u007f\v\x90\xa1\xfd\u050f'\xb2h\xfe\xb3\x83\x82\xe5]\xdbP\xef\x0f\x892\xf5\x1e\u06ea\xa30\x00\x00\u07d4\u007f\x0e\xc3\u06c0F\x92\xd4\xd1\xea2E6Z\xab\x05\x90\a[\u0109\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u007f\x0f\x04\xfc\xf3zS\xa4\xe2N\xden\x93\x10Nx\xbe\x1d<\x9e\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u007f\x13\xd7`I\x8dq\x93\xcahY\xbc\x95\xc9\x018d#\xd7l\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\u007f\x15\n\xfb\x1aw\u00b4Y(\xc2h\xc1\u9f74d\x1dG\u0609lk\x93[\x8b\xbd@\x00\x00\u07d4\u007f\x16\x19\x98\x8f7\x15\xe9O\xf1\xd2S&-\xc5X\x1d\xb3\xde\x1c\x890\xca\x02O\x98{\x90\x00\x00\u07d4\u007f\x1c\x81\xee\x16\x97\xfc\x14K|\v\xe5I;V\x15\xae\u007f\xdd\u0289\x1b\x1d\xaba\u04ead\x00\x00\u07d4\u007f#\x82\xff\xd8\xf89VFy7\xf9\xbar7F#\xf1\x1b8\x89 \x86\xac5\x10R`\x00\x00\u07d4\u007f7\t9\x1f?\xbe\xba5\x92\xd1u\xc7@\xe8z\tT\x1d\x02\x89\x1a\x05V\x90\xd9\u06c0\x00\x00\u07d4\u007f8\x9c\x12\xf3\xc6\x16OdFVlwf\x95\x03\xc2y%'\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\xe0\x94\u007f:\x1eE\xf6~\x92\u0200\xe5s\xb43y\xd7\x1e\xe0\x89\xdbT\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\u007f=r\x03\u0224G\xf7\xbf6\u060a\xe9\xb6\x06*^\xeex\xae\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\u007fF\xbb%F\r\xd7\xda\xe4!\x1c\xa7\xf1Z\xd3\x12\xfc}\xc7\\\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\u007fI\xe7\xa4&\x98\x82\xbd\x87\"\u0526\xf5f4v)b@y\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u007fI\xf2\a&G\x1a\xc1\u01e8>\xf1\x06\xe9w\\\xebf%f\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4\u007fK^'\x85x\xc0F\xcc\xea\xf6W0\xa0\xe0h2\x9e\u0576\x89e\xea=\xb7UF`\x00\x00\u07d4\u007fOY;a\x8c3\v\xa2\xc3\xd5\xf4\x1e\xce\xeb\x92\xe2~Bl\x89\x96n\xdcuk|\xfc\x00\x00\u07d4\u007fT\x14\x91\u04ac\x00\xd2a/\x94\xaa\u007f\v\xcb\x01FQ\xfb\u0509\x14b\fW\xdd\xda\xe0\x00\x00\u07d4\u007fZ\xe0Z\xe0\xf8\xcb\xe5\xdf\xe7!\xf0D\u05e7\xbe\xf4\xc2y\x97\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\u007f`:\xec\x17Y\xea_\a\xc7\xf8\xd4\x1a\x14(\xfb\xba\xf9\xe7b\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u007falo\x00\x8a\u07e0\x82\xf3M\xa7\xd0e\x04`6\x80u\xfb\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u007fa\xfal\xf5\xf8\x98\xb4@\xda\u016b\xd8`\rmi\x1f\xde\xf9\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\xe0\x94\u007fe\\g\x89\xed\xdfE\\\xb4\xb8\x80\x99r\x0698\x9e\ubb0a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\u007fk(\u0204!\xe4\x85~E\x92\x81\u05c4ai$\x89\xd3\xfb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u007fn\xfboC\x18\x87m.\xe6$\xe2u\x95\xf4DF\xf6\x8e\x93\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\u007fq\x92\xc0\xdf\x1c}\xb6\xd9\xede\xd7\x11\x84\xd8\xe4\x15Z\x17\xba\x89\x04Sr\x8d3\x94,\x00\x00\u07d4\u007fz:!\xb3\xf5\xa6]\x81\xe0\xfc\xb7\xd5-\xd0\n\x1a\xa3m\xba\x89\x05k\xc7^-c\x10\x00\x00\u07d4\u007f\x8d\xbc\xe1\x80\xed\x9cV65\xaa\xd2\xd9{L\xbcB\x89\x06\u0649\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\u007f\x99=\xdb~\x02\u0082\xb8\x98\xf6\x15_h\x0e\xf5\xb9\xaf\xf9\a\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\u007f\x9f\x9bV\xe4(\x9d\xfbX\xe7\x0f\xd5\xf1*\x97\xb5m5\u01a5\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u007f\xa3~\xd6x\x87u\x1aG\x1f\x0e\xb3\x06\xbeD\xe0\xdb\xcd`\x89\x899vt\u007f\xe1\x1a\x10\x00\x00\u07d4\u007f\xaa0\xc3\x15\x19\xb5\x84\xe9rP\xed*<\xf38^\xd5\xfdP\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u007f\xcf[\xa6fo\x96lTH\xc1{\xf1\xcb\v\xbc\xd8\x01\x9b\x06\x89\x05k\xc3\u042e\xbeI\x80\x00\xe0\x94\u007f\xd6y\xe5\xfb\r\xa2\xa5\xd1\x16\x19M\xcbP\x83\x18\xed\u0140\xf3\x8a\x01c\x9eI\xbb\xa1b\x80\x00\x00\u07d4\u007f\u06e01\u01cf\x9c\tmb\xd0Z6\x9e\uac3c\xccU\u5257\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\u007f\xdb\u00e8D\xe4\r\x96\xb2\xf3\xa652.`e\xf4\xca\x0e\x84\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u007f\xdf\u020dx\xbf\x1b(Z\xc6O\x1a\xdb5\xdc\x11\xfc\xb09Q\x89|\x06\xfd\xa0/\xb06\x00\x00\u07d4\u007f\xea\x19b\xe3]b\x05\x97h\xc7I\xbe\u0756\u02b90\xd3x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u007f\xef\x8c8w\x9f\xb3\a\xeco\x04K\xeb\xe4\u007f<\xfa\xe7\x96\xf1\x89\t#@\xf8l\xf0\x9e\x80\x00\u07d4\u007f\xf0\xc6?p$\x1b\xec\xe1\x9bs~SA\xb1+\x10\x901\u0609\x12\xc1\xb6\xee\xd0=(\x00\x00\xe0\x94\u007f\xfa\xbf\xbc9\f\xbeC\u0389\x18\x8f\bh\xb2}\xcb\x0f\f\xad\x8a\x01YQ\x82\"K&H\x00\x00\xe0\x94\u007f\xfd\x02\xed7\fp`\xb2\xaeS\xc0x\xc8\x01!\x90\u07fbu\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u0794\x80\x02*\x12\a\xe9\x10\x91\x1f\xc9(I\xb0i\xab\f\xda\xd0C\u04c8\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\x80\t\xa7\xcb\u0452\xb3\xae\u052d\xb9\x83\xd5(ER\xc1ltQ\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x80\x0e}c\x1cnW:\x903/\x17\xf7\x1f_\u045bR\x8c\xb9\x89\b=lz\xabc`\x00\x00\u07d4\x80\x15m\x10\ufa320\u0254\x10c\r7\xe2i\xd4\t<\xea\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x80\x172\xa4\x81\u00c0\xe5~\xd6-l)\u0799\x8a\xf3\xfa;\x13\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x80\x1de\xc5\x18\xb1\x1d\x0e?OG\x02!Ap\x13\xc8\xe5>\u0149\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x80&CZ\xacr\x8dI{\x19\xb3\xe7\xe5|(\xc5c\x95O+\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\x80-\xc3\xc4\xff-}\x92^\u215fJ\x06\u05fa`\xf10\x8c\x89\x05P\x94\f\x8f\xd3L\x00\x00\u07d4\x800\xb1\x11\u0198?\x04\x85\u076c\xa7b$\xc6\x18\x064x\x9f\x89\x04V9\x18$O@\x00\x00\u07d4\x805\xbc\xff\xae\xfd\xee\xea5\x83\fI}\x14(\x9d6 #\u0789\x10CV\x1a\x88)0\x00\x00\u07d4\x805\xfeNkj\xf2z\u44a5xQ^\x9d9\xfao\xa6[\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x80C\xed\"\xf9\x97\u58a4\xc1n6D\x86\xaed\x97V\x92\u0109=I\x04\xff\xc9\x11.\x80\x00\u07d4\x80C\xfd\u043cL\x97=\x16c\xd5_\xc15P\x8e\xc5\xd4\xf4\xfa\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x80L\xa9IrcOc:Q\xf3V\v\x1d\x06\xc0\xb2\x93\xb3\xb1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x80R-\u07d4N\xc5.'\xd7$\xedL\x93\xe1\xf7\xbe`\x83\u0589\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x80Y\x1aB\x17\x9f4\xe6M\x9d\xf7]\xcdF;(hoUt\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x80\\\xe5\x12\x97\xa0y;\x81 g\xf0\x17\xb3\xe7\xb2\u07db\xb1\xf9\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\x80]\x84o\xb0\xbc\x02\xa73r&\u0585\xbe\x9e\xe7s\xb9\x19\x8a\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\x80c7\x9a{\xf2\u02d2:\x84\xc5\t>h\xda\xc7\xf7T\x81\u0149\x11v\x10.n2\xdf\x00\x00\u07d4\x80hTX\x8e\xcc\xe5AI_\x81\u008a)\x03s\xdf\x02t\xb2\x89\x1f\x8c\xdf\\n\x8dX\x00\x00\u07d4\x80oD\xbd\xebh\x807\x01^\x84\xff!\x80I\xe3\x823*3\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4\x80tF\x18\xde9jT1\x97\xeeH\x94\xab\xd0c\x98\xdd|'\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x80w\xc3\xe4\xc4EXn\tL\xe1\x02\x93\u007f\xa0[s{V\x8c\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x80\x90\u007fY1H\xb5|F\xc1w\xe2=%\xab\u012a\xe1\x83a\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x80\x97s\x16\x94NYB\xe7\x9b\x0e:\xba\u04cd\xa7F\be\x19\x89\x02\x1auJm\xc5(\x00\x00\xe0\x94\x80\xa0\xf6\xcc\x18l\xf6 \x14\x00sn\x06Z9\x1fR\xa9\xdfJ\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x80\xab\xecZ\xa3n\\\x9d\t\x8f\x1b\x94(\x81\xbdZ\xca\u0196=\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x80\xb2=8\v\x82\\F\xe098\x99\xa8UVF-\xa0\u1309lk\x93[\x8b\xbd@\x00\x00\u07d4\x80\xb4-\xe1p\xdb\xd7#\xf4T\xe8\x8fw\x16E-\x92\x98P\x92\x89\x10F#\xc0v-\xd1\x00\x00\u07d4\x80\xb7\x9f3\x83\x90\u047a\x1b77\xa2\x9a\x02W\xe5\xd9\x1e\a1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x80\xbf\x99^\u063a\x92p\x1d\x10\xfe\u011f\x9e}\x01M\xbe\xe0&\x89\x1f\x047\xca\x1a~\x12\x80\x00\u07d4\x80\xc0N\xfd1\x0fD\x04\x83\xc7?tK[\x9edY\x9c\xe3\xec\x89A\rXj \xa4\xc0\x00\x00\u07d4\x80\u00e9\xf6\x95\xb1m\xb1Yr\x86\u0473\xa8\xb7il9\xfa'\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x80\xc5>\xe7\xe35\u007f\x94\xce\rxh\x00\x9c \x8bJ\x13\x01%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x80\xcc!\xbd\x99\xf3\x90\x05\u014f\xe4\xa4H\x90\x92 !\x8ff\u02c966\xc9yd6t\x00\x00\u07d4\x80\xd5\xc4\fY\xc7\xf5N\xa3\xa5_\xcf\xd1uG\x1e\xa3P\x99\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x80\xda/\u0762\x9a\x9e'\xf9\xe1\x15\x97^i\xae\x9c\xfb\xf3\xf2~\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x80\xe7\xb3 R0\xa5f\xa1\xf0a\xd9\"\x81\x9b\xb4\xd4\u04a0\xe1\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x80\xea\x1a\xcc\x13n\xcaKh\xc8B\xa9Z\xdfk\u007f\xee~\xb8\xa2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x80\xf0z\xc0\x9e{,<\n=\x1e\x94\x13\xa5D\xc7:A\xbe\u02c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x81\r\xb2Vu\xf4^\xa4\xc7\xf3\x17\u007f7\xce)\xe2-g\x99\x9c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x81\x13\x9b\xfd\u0326V\xc40 ?r\x95\x8cT;e\x80\xd4\f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x81\x14a\xa2\xb0\u0290\xba\xda\xc0j\x9e\xa1nx{3\xb1\x96\u0309\b\xe3\xf5\v\x17<\x10\x00\x00\u07d4\x81\x16M\xeb\x10\x81J\xe0\x83\x91\xf3,\bf{bH\xc2}z\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\x81\x18i1\x18A7\xd1\x19*\u020c\xd3\xe1\xe5\xd0\xfd\xb8jt\x89\x9d5\x95\xab$8\xd0\x00\x00\u0794\x81*U\xc4<\xae\xdcYr\x187\x90\x00\xceQ\rT\x886\xfd\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x81.\xa7\xa3\xb2\xc8n\xed2\xffO,sQL\xc6;\xac\xfb\u038965\u026d\xc5\u07a0\x00\x00\u07d4\x814\xdd\x1c\x9d\xf0\xd6\u0225\x81$&\xbbU\xc7a\u0283\x1f\b\x89\x06\xa2\x16\v\xb5|\xcc\x00\x00\u07d4\x81A5\u068f\x98\x11\aW\x83\xbf\x1a\xb6pb\xaf\x8d>\x9f@\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x81I\x8c\xa0{\x0f/\x17\xe8\xbb\xc7\xe6\x1a\u007fJ\xe7\xbef\xb7\x8b\x89\x05\x81\xfb\xb5\xb3;\xb0\x00\x00\u07d4\x81Um\xb2sI\xab\x8b'\x00ID\xedP\xa4n\x94\x1a\x0f_\x89\u063beI\xb0+\xb8\x00\x00\u07d4\x81U\xfalQ\xeb1\xd8\bA-t\x8a\xa0\x86\x10P\x18\x12/\x89e\xea=\xb7UF`\x00\x00\xe0\x94\x81V6\v\xbd7\ta\xce\xcakf\x91\xd7P\x06\xad L\xf2\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x81a\xd9@\xc3v\x01\x00\xb9\b\x05)\xf8\xa6\x03%\x03\x0fn\u0709\x10CV\x1a\x88)0\x00\x00\xe0\x94\x81d\xe7\x83\x14\xae\x16\xb2\x89&\xccU=,\xcb\x16\xf3V'\r\x8a\x01\xca\x13N\x95\xfb2\xc8\x00\x00\u07d4\x81e\u02b0\xea\xfbZ2\x8f\xc4\x1a\xc6M\xaeq[.\xef,e\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x81h\xed\xce\u007f)a\xcf)[\x9f\xcdZE\xc0l\xde\xdan\xf5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x81m\x97r\xcf\x119\x91\x16\xcc\x1er\xc2lgt\xc9\xed\xd79\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x81s\xc85djg.\x01R\xbe\x10\xff\xe8Ab\xdd%nL\x89\x1a\xab\xdf!E\xb40\x00\x00\u07d4\x81t\x93\u035b\xc6#p*$\xa5o\x9f\x82\xe3\xfdH\xf3\xcd1\x89\x9eK#\xf1-L\xa0\x00\x00\u07d4\x81y\xc8\tp\x18,\u0177\xd8*M\xf0n\xa9M\xb6:%\xf3\x89'o%\x9d\xe6k\xf4\x00\x00\u07d4\x81z\xc3;\xd8\xf8GVsr\x95\x1fJ\x10\u05e9\x1c\xe3\xf40\x89\n\xd7\xc4\x06\xc6m\xc1\x80\x00\xe0\x94\x81\x8f\xfe'\x1f\u00d75e\xc3\x03\xf2\x13\xf6\xd2\u0689\x89~\xbd\x8a\x016\xe0SB\xfe\u1e40\x00\u07d4\x81\x97\x94\x81!s.c\xd9\xc1H\x19N\xca\xd4n0\xb7I\u0209\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x81\x9a\xf9\xa1\xc2s2\xb1\xc3i\xbb\xda\x1b=\xe1\xc6\xe93\xd6@\x89\x11\t\xe6T\xb9\x8fz\x00\x00\xe0\x94\x81\x9c\u06a506x\xef|\xecY\u050c\x82\x16:\xcc`\xb9R\x8a\x03\x13QT_y\x81l\x00\x00\u07d4\x81\x9e\xb4\x99\vZ\xbaUG\t=\xa1+k<\x10\x93\xdfmF\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x81\xa8\x81\x96\xfa\xc5\xf2<>\x12\xa6\x9d\xecK\x88\x0e\xb7\xd9s\x10\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x81\xbc\xcb\xff\x8fD4~\xb7\xfc\xa9['\xce|\x95$\x92\xaa\xad\x89\b@\xc1!e\xddx\x00\x00\u07d4\x81\xbdu\xab\xd8e\xe0\xc3\xf0J\vO\xdb\xcbt\xd3@\x82\xfb\xb7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x81\xc1\x8c*#\x8d\xdcL\xba#\n\a-\xd7\xdc\x10\x1eb\x02s\x89Hz\x9a0E9D\x00\x00\u07d4\x81\xc9\xe1\xae\xe2\xd36]S\xbc\xfd\u0356\xc7\xc58\xb0\xfd~\xec\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\x81\u03edv\t\x13\xd3\xc3\"\xfc\xc7{I\u00ae9\a\xe7On\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\x81\xd6\x19\xffW&\xf2@_\x12\x90Lr\xeb\x1e$\xa0\xaa\xeeO\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x81\xef\u25aev\xc8`\xd1\xc5\xfb\xd3=G\xe8\u0399\x96\xd1W\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x81\xf8\xde,(=_\u052f\xbd\xa8]\xed\xf9v\x0e\xab\xbb\xb5r\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x82\f\x19)\x11\x96P[e\x05\x9d\x99\x14\xb7\t\v\xe1\u06c7\u0789\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\x82\x1c\xb5\xcd\x05\xc7\uf41f\xe1\xbe`s=\x89c\xd7`\xdcA\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x82\x1dy\x8a\xf1\x99\x89\u00ee[\x84\xa7\xa7(<\xd7\xfd\xa1\xfa\xbe\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x82\x1e\xb9\t\x94\xa2\xfb\xf9K\xdc23\x91\x02\x96\xf7o\x9b\xf6\xe7\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x82$\x9f\xe7\x0fa\u01b1o\x19\xa3$\x84\x0f\xdc\x02\x021\xbb\x02\x8a\x02\x036\xb0\x8a\x93c[\x00\x00\u07d4\x82(\xeb\xc0\x87H\x0f\xd6EG\xca(\x1f^\xac\xe3\x04\x14S\xb9\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\x82)\u03b9\xf0\xd7\b9I\x8dD\xe6\xab\xed\x93\xc5\xca\x05\x9f]\x8a\x1a\x1c\x1b<\x98\x9a \x10\x00\x00\u07d4\x82.\xdf\xf66V:a\x06\xe5.\x9a%\x98\xf7\xe6\xd0\xef'\x82\x89\x01\xf4\xf9i=B\u04c0\x00\u07d4\x822\x19\xa2Yv\xbb*\xa4\xaf\x8b\xadA\xac5&\xb4\x936\x1f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x822\xd1\xf9t.\u07cd\xd9'\xda5;*\xe7\xb4\xcb\xceu\x92\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\x824\xf4c\u0444\x85P\x1f\x8f\x85\xac\xe4\x97,\x9bc-\xbc\u0309lk\x93[\x8b\xbd@\x00\x00\u07d4\x827htg7\xcem\xa3\x12\xd5>TSN\x10o\x96|\xf3\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x82;\xa7dr8\xd1\x13\xbc\xe9\x96JC\u0420\x98\x11\x8b\xfeM\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x82@t1(\x06\xdaGHCBf\xee\x00!@\u305a\u0089Q\xb1\u04c3\x92a\xac\x00\x00\u07d4\x82C\x8f\u04b3*\x9b\xddgKI\xd8\xcc_\xa2\xef\xf9x\x18G\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x82HW(\xd0\xe2\x81V7X\xc7Z\xb2~\xd9\u80a0\x00-\x89\a\xf8\b\xe9)\x1el\x00\x00\u07d4\x82K<\x19)]~\xf6\xfa\xa7\xf3t\xa4y\x84\x86\xa8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x82Q5\x8c\xa4\xe0`\u0775Y\xcaX\xbc\v\u077e\xb4\a\x02\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x82Q5\xb1\xa7\xfc\x16\x05aL\x8a\xa4\u042cm\xba\u040fH\x0e\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\x82S\t\xa7\xd4]\x18\x12\xf5\x1en\x8d\xf5\xa7\xb9ol\x90\x88\x87\x89\x804\xf7\u0671f\xd4\x00\x00\u07d4\x82Z\u007fN\x10\x94\x9c\xb6\xf8\x96Bh\xf1\xfa_W\xe7\x12\xb4\u0109\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x82a\xfa#\f\x90\x1dC\xffW\x9fG\x80\u04d9\xf3\x1e`v\xbc\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x82b\x16\x9baXp\x13N\xb4\xacl_G\x1ck\xf2\xf7\x89\xfc\x89\x19\x12z\x13\x91\xea*\x00\x00\u07d4\x82c\xec\xe5\xd7\t\xe0\u05eeq\u0328h\xed7\xcd/\xef\x80{\x895\xab\x02\x8a\xc1T\xb8\x00\x00\xe0\x94\x82l\xe5y\x052\xe0T\x8ca\x02\xa3\r>\xac\x83k\xd68\x8f\x8a\x03\xcf\xc8.7\xe9\xa7@\x00\x00\u07d4\x82n\xb7\xcds\x19\xb8-\xd0z\x1f;@\x90q\xd9n9g\u007f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x82u1\xa6\u0141z\xe3_\x82\xb0\v\x97T\xfc\xf7LU\xe22\x89\xc3(\t>a\xee@\x00\x00\u0794\x82u\xcdhL6y\u0548}\x03fN3\x83E\xdc<\xdd\xe1\x88\xdbD\xe0I\xbb,\x00\x00\u07d4\x82\x84\x92;b\u62ff|+\x9f4\x14\xd1>\xf6\xc8\x12\xa9\x04\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\x82\x8b\xa6Q\u02d3\x0e\xd9xqV)\x9a=\xe4L\u040br\x12\x89Hz\x9a0E9D\x00\x00\u07d4\x82\xa1\\\xef\x1dl\x82`\xea\xf1Y\xea?\x01\x80\xd8g}\xce\x1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x82\xa8\xb9kl\x9e\x13\xeb\xec\x1e\x9f\x18\xac\x02\xa6\x0e\xa8\x8aH\xff\x89lk\x8c@\x8es\xb3\x00\x00\u07d4\x82\xa8\u02ff\xdf\xf0+.8\xaeK\xbf\xca\x15\xf1\xf0\xe8;\x1a\xea\x89\x04\x9b\x99\x1c'\xefm\x80\x00\u07d4\x82\xe4F\x1e\xb9\xd8I\xf0\x04\x1c\x14\x04!\x9eBr\u0110\n\xb4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x82\xe5w\xb5\x15\xcb+\b`\xaa\xfe\x1c\xe0\x9aY\xe0\x9f\xe7\xd0@\x89 \x86\xac5\x10R`\x00\x00\u07d4\x82\xea\x01\xe3\xbf.\x83\x83nqpN\"\xa2q\x93w\xef\xd9\u00c9\xa4\xccy\x95c\u00c0\x00\x00\u07d4\x82\xf2\xe9\x91\xfd2L_]\x17v\x8e\x9fa3]\xb61\x9dl\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x82\xf3\x9b'X\xaeB'{\x86\u059fu\xe6(\xd9X\xeb\u02b0\x8a\bxg\x83&\xea\xc9\x00\x00\x00\xe0\x94\x82\xf8T\xc9\xc2\xf0\x87\xdf\xfa\x98Z\xc8 \x1ebl\xa5Fv\x86\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\x82\xffqo\xdf\x03>\xc7\xe9B\xc9\t\u0643\x18g\xb8\xb6\xe2\xef\x89a\t=|,m8\x00\x00\u07d4\x83\b\xed\n\xf7\xf8\xa3\xc1u\x1f\xaf\xc8w\xb5\xa4*\xf7\xd3X\x82\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x83\x1cD\xb3\b@G\x18K*\xd2\x18h\x06@\x907P\xc4]\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x83!\x05\x83\xc1jN\x1e\x1d\xac\x84\xeb\xd3~=\x0f|W\ub909lk\x93[\x8b\xbd@\x00\x00\u07d4\x83,T\x17k\xdfC\xd2\u027c\u05f8\b\xb8\x95V\xb8\x9c\xbf1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x833\x16\x98]Gt+\xfe\xd4\x10`J\x91\x95<\x05\xfb\x12\xb0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x834vK{9zNW\x8fP6M`\xceD\x89\x9b\xff\x94\x89\x05\x03\xb2\x03\xe9\xfb\xa2\x00\x00\xe0\x94\x83;j\x8e\xc8\xda@\x81\x86\xac\x8a}*m\xd6\x15#\xe7\u0384\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\x83=?\xaeT*\xd5\xf8\xb5\f\xe1\x9b\xde+\xecW\x91\x80\u020c\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\xe0\x94\x83=\xb4,\x14\x16<{\xe4\u02b8j\u0153\xe0bf\u0599\u054a$\xe4\r+iC\xef\x90\x00\x00\xe0\x94\x83V;\xc3d\ud060\xc6\xda;V\xffI\xbb\xf2g\x82z\x9c\x8a\x03\xab\x91\xd1{ \xdeP\x00\x00\u07d4\x83zd]\xc9\\IT\x9f\x89\x9cN\x8b\u03c7S$\xb2\xf5|\x89 \x8c9J\xf1\u0208\x00\x00\u07d4\x83\x8b\xd5e\xf9\x9f\xdeH\x05?y\x17\xfe3<\xf8J\xd5H\xab\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x83\x90\x8a\xa7G\x8am\x1c\x9b\x9b\x02\x81\x14\x8f\x8f\x9f$+\x9f\u0709lk\x93[\x8b\xbd@\x00\x00\u07d4\x83\x92\xe57vq5x\x01[\xffI@\xcfC\x84\x9d}\u02e1\x89\bM\xf05]V\x17\x00\x00\xe0\x94\x83\x97\xa1\xbcG\xac\xd6GA\x81Y\xb9\x9c\xeaW\xe1\xe6S-n\x8a\x01\xf1\x0f\xa8'\xb5P\xb4\x00\x00\u07d4\x83\x98\xe0~\xbc\xb4\xf7_\xf2\x11m\xe7|\x1c*\x99\xf3\x03\xa4\u03c9\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x83\xa3\x14\x883\xd9dI\x84\xf7\xc4u\xa7\x85\a\x16\ufd00\xff\x89\xb8Pz\x82\a( \x00\x00\u07d4\x83\xa4\x02C\x8e\x05\x19w=TH2k\xfba\xf8\xb2\f\xf5-\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4\x83\xa9;[\xa4\x1b\xf8\x87 \xe4\x15y\f\xdc\vg\xb4\xaf4\u0109\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x83\xc2=\x8aP!$\xee\x15\x0f\b\xd7\x1d\xc6rt\x10\xa0\xf9\x01\x8a\a3\x1f;\xfef\x1b\x18\x00\x00\u07d4\x83\u0217\xa8Ki^\xeb\xe4fy\xf7\xda\x19\xd7vb\x1c&\x94\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x83\xd52\u04cdm\xee?`\xad\u018b\x93a3\u01e2\xa1\xb0\u0749\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x83\xdb\xf8\xa1(S\xb4\n\xc6\x19\x96\xf8\xbf\x1d\xc8\xfd\xba\xdd\xd3)\x894\x95tD\xb8@\xe8\x00\x00\u07d4\x83\xdb\xfd\x8e\xda\x01\xd0\u078e\x15\x8b\x16\u0413_\xc28\n]\u01c9 \x86\xac5\x10R`\x00\x00\u07d4\x83\xe4\x80U2|(\xb5\x93o\xd9\xf4D~s\xbd\xb2\xdd3v\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\x83\xfeZ\x1b2\x8b\xaeD\a\x11\xbe\xafj\xad`&\xed\xa6\xd2 \x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x84\x00\x8ar\xf8\x03o?\xeb\xa5B\xe3Px\xc0W\xf3*\x88%\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x84\x0e\xc8>\xa96!\xf04\xe7\xbb7b\xbb\x8e)\xde\xd4\xc4y\x89\x87\x86x2n\xac\x90\x00\x00\xe0\x94\x84\x11E\xb4H@\xc9F\xe2\x1d\xbc\x19\x02d\xb8\xe0\xd5\x02\x93i\x8a?\x87\bW\xa3\xe0\xe3\x80\x00\x00\u07d4\x84#!\a\x93+\x12\xe01\x86X5%\xce\x02:p>\xf8\u0649lk\x93[\x8b\xbd@\x00\x00\u07d4\x84$O\xc9ZiW\xed|\x15\x04\xe4\x9f0\xb8\xc3^\xcaKy\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x841'}{\xdd\x10E}\xc0\x17@\x8c\x8d\xbb\xbdAJ\x8d\xf3\x89\x02\"\xc8\xeb?\xf6d\x00\x00\u07d4\x847Z\xfb\xf5\x9b:\x1da\xa1\xbe2\xd0u\xe0\xe1ZO\xbc\xa5\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x84;\xd3P/E\xf8\xbcM\xa3p\xb3#\xbd\xac?\xcf_\x19\xa6\x89P\x03\x9dc\xd1\x1c\x90\x00\x00\u07d4\x84P34c\rw\xf7AG\xf6\x8b.\bf\x13\xc8\xf1\xad\xe9\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x84R\x03u\x0fqH\xa9\xaa&)!\xe8mC\xbfd\x19t\xfd\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x84a\xec\u0126\xa4^\xb1\xa5\xb9G\xfb\x86\xb8\x80i\xb9\x1f\xcdo\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x84g^\x91wrmE\xea\xa4k9\x92\xa3@\xba\u007fq\f\x95\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x84hl{\xadv,T\xb6g\u055f\x90\x94<\xd1M\x11z&\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x84\x89\xf6\xad\x1d\x9a\x94\xa2\x97x\x91V\x89\x9d\xb6AT\xf1\u06f5\x89\x13t\a\xc0<\x8c&\x80\x00\u07d4\x84\x8c\x99Jy\x00?\xe7\xb7\xc2l\xc62\x12\xe1\xfc/\x9c\x19\xeb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x84\x8f\xbd)\xd6|\xf4\xa0\x13\xcb\x02\xa4\xb1v\xef$N\x9e\u6349\x01\x17*ck\xbd\xc2\x00\x00\u07d4\x84\x94\x9d\xbaU\x9ac\xbf\xc8E\xde\xd0n\x9f-\x9b\u007f\x11\xef$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x84\x9a\xb8\a\x90\xb2\x8f\xf1\xff\u05ba9N\xfctc\x10\\6\xf7\x89\x01\xe0+\xe4\xael\x84\x00\x00\u07d4\x84\x9b\x11oYc\x01\xc5\u063bb\xe0\xe9z\x82H\x12n9\xf3\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x84\xa7L\xee\xcf\xf6\\\xb9;/\x94\x9dw>\xf1\xad\u007f\xb4\xa2E\x89\x05\n\x9bDF\x85\xc7\x00\x00\u07d4\x84\xaa\xc7\xfa\x19\u007f\xf8\\0\xe0;zS\x82\xb9W\xf4\x1f:\xfb\x89\b\x8b#\xac\xff\u0650\x00\x00\u07d4\x84\xaf\x1b\x15sB\xd5Ch&\r\x17\x87b0\xa54\xb5K\x0e\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x84\xb0\xeek\xb87\u04e4\xc4\xc5\x01\x1c:\"\x8c\x0e\u06b4cJ\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x84\xb4\xb7Nf#\xba\x9d\x15\x83\xe0\u03feId?\x168AI\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x84\xb6\xb6\xad\xbe/[>-h,f\xaf\x1b\u0110S@\xc3\xed\x89!\x92\xf8\xd2\"\x15\x00\x80\x00\xe0\x94\x84\xb9\x1e.)\x02\xd0^+Y\x1bA\b;\u05fe\xb2\xd5,t\x8a\x02\x15\xe5\x12\x8bE\x04d\x80\x00\u07d4\x84\xbc\xbf\"\xc0\x96\a\xac\x844\x1d.\xdb\xc0;\xfb\x179\xd7D\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x84\xbf\xce\xf0I\x1a\n\xe0iK7\u03ac\x02E\x84\xf2\xaa\x04g\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x84\xcb}\xa0P-\xf4\\\xf5a\x81{\xbd#b\xf4Q\xbe\x02\u0689Hz\x9a0E9D\x00\x00\u07d4\x84\xccxx\xda`_\xdb\x01\x9f\xab\x9bL\xcf\xc1Wp\x9c\u0765\x89Hy\x85\x13\xaf\x04\xc9\x00\x00\u07d4\x84\xdb\x14Y\xbb\x00\x81.\xa6~\xcb=\xc1\x89\xb7!\x87\xd9\xc5\x01\x89\b\x11\xb8\xfb\u0685\xab\x80\x00\u07d4\x84\u9516\x80\xbe\xcehA\xb9\xa7\xe5%\r\b\xac\xd8}\x16\u0349\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x84\xe9\u03c1f\xc3j\xbf\xa4\x90S\xb7\xa1\xad@6 &\x81\xef\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x84\xec\x06\xf2G\x00\xfeBAL\xb9\x89|\x15L\x88\xde/a2\x89Hz\x9a0E9D\x00\x00\xe0\x94\x84\xf5\"\xf0R\x0e\xbaR\xdd\x18\xad!\xfaK\x82\x9f+\x89\u02d7\x8a\x01\fQ\x06\xd5\x13O\x13\x00\x00\u07d4\x85\v\x9d\xb1\x8f\xf8K\xf0\xc7\xdaI\xea7\x81\xd9 \x90\xad~d\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\u07d4\x85\x10\xee\x93O\f\xbc\x90\x0e\x10\a\xeb8\xa2\x1e*Q\x01\xb8\xb2\x89\x05\xbf\v\xa6cOh\x00\x00\u07d4\x85\x16\xfc\xafw\u0213\x97\x0f\xcd\x1a\x95\x8b\xa9\xa0\x0eI\x04@\x19\x89\n\xa3\xeb\x16\x91\xbc\xe5\x80\x00\u07d4\x85\x1a\xa9\x1c\x82\xf4/\xad]\xd8\xe8\xbb^\xa6\x9c\x8f:Yw\u0449\b\x0eV\x1f%xy\x80\x00\u07d4\x85\x1c\rb\xbeF5\xd4w~\x805\xe3~K\xa8Q|a2\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x85\x1d\u00ca\xdbE\x93r\x9av\xf3:\x86\x16\u06b6\xf5\xf5\x9aw\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x852I\b\x97\xbb\xb4\u038b\u007fk\x83~L\xba\x84\x8f\xbe\x99v\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x85>j\xba\xf4Di\xc7/\x15\x1dN\"8\x19\xac\xedN7(\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x85F\x91\xceqO2\\\xedU\xceY(\u039b\xa1/\xac\u0478\x89\xedp\xb5\xe9\xc3\xf2\xf0\x00\x00\u07d4\x85L\fF\x9c$k\x83\xb5\u0473\xec\xa4C\xb3\x9a\xf5\xee\x12\x8a\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x85]\x9a\xef,9\xc6#\r\t\u025e\xf6II\x89\xab\u61c5\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\u07d4\x85c\u0113a\xb6%\xe7hw\x1c\x96\x15\x1d\xbf\xbd\x1c\x90iv\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x85fa\t\x01\xaa\xce8\xb82D\xf3\xa9\xc810jg\xb9\u0709\xb0\x82\x13\xbc\xf8\xff\xe0\x00\x00\xe0\x94\x85j\xa2<\x82\xd7![\xec\x8dW\xf6\n\xd7^\xf1O\xa3_D\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x85nZ\xb3\xf6L\x9a\xb5k\x00\x93\x93\xb0\x16d\xfc\x03$\x05\x0e\x89a\t=|,m8\x00\x00\u07d4\x85n\xb2\x04$\x1a\x87\x83\x0f\xb2)\x03\x13C\xdc0\x85OX\x1a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x85s,\x06\\\xbdd\x11\x99A\xae\xd40\xacYg\vlQ\u0109'\xa5sb\xab\n\x0e\x80\x00\xe0\x94\x85x\xe1\x02\x12\xca\x14\xff\a2\xa8$\x1e7F}\xb8V2\xa9\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x85y\xda\xdf\x1a9Z4q\xe2\vov=\x9a\x0f\xf1\x9a?o\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x85\u007f\x10\v\x1aY0\"^\xfc~\x90 \u05c3'\xb4\x1c\x02\u02c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x85\x94mV\xa4\xd3q\xa93hS\x96\x90\xb6\x0e\xc8%\x10tT\x89]\u0212\xaa\x111\xc8\x00\x00\xe0\x94\x85\x99\xcb\u0566\xa9\xdc\u0539f\xbe8}iw]\xa5\xe3C'\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x86$_Yf\x91\t>\xce?=<\xa2&>\xac\xe8\x19A\u0649\n1\x06+\xee\xedp\x00\x00\u07d4\x86%i!\x1e\x8cc'\xb5A^:g\xe5s\x8b\x15\xba\xafn\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\x86)}s\x0f\xe0\xf7\xa9\xee$\xe0\x8f\xb1\b{1\xad\xb3\x06\xa7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x86D\xcc(\x1b\xe32\xcc\xce\xd3m\xa4\x83\xfb*\aF\u067a.\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x86I\x9a\x12(\xff-~\xe3\au\x93dPo\x8e\x8c\x83\a\xa5\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x86K\xecPi\xf8U\xa4\xfdX\x92\xa6\xc4I\x1d\xb0|\x88\xff|\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x86W\n\xb2Y\u0271\xc3,\x97) /w\xf5\x90\xc0}\xd6\x12\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x86c\xa2A\xa0\xa8\x9ep\xe1\x82\xc8E\xe2\x10\\\x8a\xd7&K\u03ca\x03#\xb1=\x83\x98\xf3#\x80\x00\u07d4\x86g\xfa\x11U\xfe\xd72\u03f8\u0725\xa0\xd7e\xce\r\a\x05\xed\x89\x04n\xc9e\u00d3\xb1\x00\x00\u07d4\x86h\xaf\x86\x8a\x1e\x98\x88_\x93\u007f&\x15\xde\xd6u\x18\x04\xeb-\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x86t\nFd\x8e\x84Z]\x96F\x1b\x18\t\x1f\xf5{\xe8\xa1o\x8a\x14\xc0\x974\x85\xbf9@\x00\x00\xe0\x94\x86~\xbaVt\x8aY\x045\r,\xa2\xa5\u039c\xa0\vg\n\x9b\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x86\x80dt\xc3X\x04}\x94\x06\xe6\xa0\u007f@\x94[\xc82\x8eg\x8a\x01u.\xb0\xf7\x01=\x10\x00\x00\u07d4\x86\x88=T\xcd9\x15\xe5I\tU0\xf9\xab\x18\x05\xe8\xc5C-\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x86\x8c#\xbe\x874f\xd4\xc7L\"\n\x19\xb2E\xd1x~\x80\u007f\x89J\x13\xbb\xbd\x92\u020e\x80\x00\xe0\x94\x86\x92O\xb2\x11\xaa\xd2<\xf5\xce`\x0e\n\xae\x80c\x96D@\x87\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x86\x93\u9e3e\x94B^\xefyi\xbci\xf9\xd4/|\xadg\x1e\x8967\tlK\xcci\x00\x00\xe0\x94\x86\x9f\x1a\xa3\x0eDU\xbe\xb1\x82 \x91\xde\\\xad\xecy\xa8\xf9F\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x86\xa1\xea\xde\xeb0F\x13E\xd9\xefk\xd0R\x16\xfa$|\r\f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x86\xa5\xf8%\x9e\u0570\x9e\x18\x8c\xe3F\xee\x92\xd3J\xa5\u0753\xfa\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x86\xb7\xbdV<\uad86\xf9bD\xf9\xdd\xc0*\u05f0\xb1K\u008a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x86\u008bVx\xaf7\xd7'\xec\x05\xe4Dw\x90\xf1_q\xf2\xea\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x86\xc4\xce\x06\u066c\x18[\xb1H\xd9o{z\xbes\xf4A\x00m\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x86\xc8\xd0\u0642\xb59\xf4\x8f\x980\xf9\x89\x1f\x9d`z\x94&Y\x8a\x02\xce\xd3wa\x82O\xb0\x00\x00\u07d4\x86\xc94\xe3\x8eS\xbe;3\xf2t\xd0S\x9c\xfc\xa1Y\xa4\xd0\u04494\x95tD\xb8@\xe8\x00\x00\xe0\x94\x86\xca\x01E\x95~k\r\xfe6\x87_\xbez\r\xecU\xe1z(\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x86\u02af\xac\xf3*\xa01|\x03*\xc3k\xab\xed\x97G\x91\xdc\x03\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x86\u0377\xe5\x1a\xc4Gr\xbe6\x90\xf6\x1d\x0eYvn\x8b\xfc\x18\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x86\xdfs\xbd7\u007f,\t\xdec\xc4]g\xf2\x83\xea\xef\xa0\xf4\xab\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x86\xe3\xfe\x86\xe9=\xa4\x86\xb1Bf\xea\xdf\x05l\xbf\xa4\xd9\x14C\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x86\xe8g\x0e'Y\x8e\xa0\x9c8\x99\xabw\x11\u04f9\xfe\x90\x1c\x17\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x86\xefd&!\x19I\xcc7\xf4\xc7^xP6\x9d\f\xf5\xf4y\x8a\x02\xd6_2\xea\x04Z\xf6\x00\x00\u07d4\x86\xf0]\x19\x06>\x93i\xc6\x00N\xb3\xf1#\x94:|\xffN\xab\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x86\xf2>\x9c\n\xaf\u01cb\x9c@M\xcd`3\x9a\x92[\xff\xa2f\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x86\xf4\xf4\n\u0644\xfb\xb8\t3\xaebn\x0eB\xf93?\xddA\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x86\xf9\\[\x11\xa2\x93\x94\x0e5\xc0\xb8\x98\u0637_\b\xaa\xb0m\x8a\x06D\xe3\xe8u\xfc\xcft\x00\x00\u07d4\x86\xff\xf2 \xe5\x93\x05\xc0\x9fH8`\xd6\xf9N\x96\xfb\xe3/W\x89\x02S[j\xb4\xc0B\x00\x00\u07d4\x87\a\x96\xab\xc0\u06c4\xaf\x82\xdaR\xa0\xedhsM\xe7\xe66\xf5\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x87\x0f\x15\xe5\u07cb\x0e\xab\xd0%iSz\x8e\xf9;Vx\\B\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4\x87\x181`\xd1r\xd2\xe0\x84\xd3'\xb8k\xcb|\x1d\x8eg\x84\xef\x89\xd8\xd8X?\xa2\xd5/\x00\x00\xe0\x94\x87\x1b\x8a\x8bQ\u07a1\x98\x9aY!\xf1>\xc1\xa9U\xa5\x15\xadG\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x87%\xe8\xc7S\xb3\xac\xbf\u0725_I\x13\\3\x91\x99\x10`)\n\xa7\xf6\u0338\xf8Zx\u06c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x87Pa\xee\x12\xe8 \x04\x1a\x01\x94,\xb0\xe6[\xb4'\xb0\x00`\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\x87XJ?a;\xd4\xfa\xc7L\x1ex\v\x86\xd6\xca\xeb\x89\f\xb2\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x87d\xd0'\"\x00\t\x96\xec\xd4u\xb43)\x8e\x9fT\v\x05\xbf\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x87l?!\x8bGv\xdf<\xa9\xdb\xfb'\r\xe1R\xd9N\xd2R\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x87u\xa6\x10\xc5\x02\xb9\xf1\xe6\xadL\xda\u06cc\xe2\x9b\xffu\xf6\xe4\x89 \x86\xac5\x10R`\x00\x00\u07d4\x87vN6w\xee\xf6\x04\xcb\u015a\xed$\xab\xdcVk\t\xfc%\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94\x87\x87\xd1&w\xa5\xec)\x1eW\xe3\x1f\xfb\xfa\xd1\x05\xc32K\x87\x8a\x02\xa2N\xb52\b\xf3\x12\x80\x00\u07d4\x87\x94\xbfG\xd5E@\xec\xe5\xc7\"7\xa1\xff\xb5\x11\u0777Gb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x87\xa5>\xa3\x9fY\xa3[\xad\xa85%!dU\x94\xa1\xa7\x14\u02c9g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x87\xa7\xc5\b\xefqX-\u0665Cr\xf8\x9c\xb0\x1f%/\xb1\x80\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x87\xaf%\xd3\xf6\xf8\xee\xa1S\x13\xd5\xfeEW\xe8\x10\xc5$\xc0\x83\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\x87\xb1\x0f\x9c(\x00\x98\x17\x9a+v\xe9\u0390\xbea\xfc\x84M\r\x89Hz\x9a0E9D\x00\x00\u07d4\x87\xbf|\xd5\u0629)\xe1\u01c5\xf9\xe5D\x91\x06\xac#$c\u0249\x047\xb1\x1f\xccEd\x00\x00\u07d4\x87\u0118\x17\t4\xb8#=\x1a\xd1\xe7i1}\\G_/@\x897\b\xba\xed=h\x90\x00\x00\u07d4\x87\xcf6\xad\x03\xc9\xea\xe9\x05:\xbbRB\u0791\x17\xbb\x0f*\v\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x87\u05ec\x06S\xcc\xc6z\xa9\xc3F\x9e\xefCR\x19?}\xbb\x86\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\xe0\x94\x87\xe3\x06+#!\xe9\u07f0\x87\\\u311c\x9b.5\"\xd5\n\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x87\xe6\x03N\xcf#\xf8\xb5c\x9d_\x0e\xa7\n\"S\x8a\x92\x04#\x89\x11\xc7\xea\x16.x \x00\x00\u07d4\x87\xefm\x8bj|\xbf\x9b\\\x8c\x97\xf6~\xe2\xad\u00a7;?w\x89\n\xdd\x1b\xd2<\x00L\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x88F\x92\x8dh2\x89\xa2\xd1\x1d\xf8\xdbz\x94t\x98\x8e\xf0\x13H\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x88I\x80\xebEe\xc1\x04\x83\x17\xa8\xf4\u007f\u06f4a\x96[\u4049\xd8\xd6\x11\x9a\x81F\x05\x00\x00\xe0\x94\x88Jz9\u0411n\x05\xf1\xc2B\xdfU`\u007f7\u07cc_\u068a\x04\xf4\x84<\x15|\x8c\xa0\x00\x00\u07d4\x88T\x93\xbd\xa3j\x042\x97eF\xc1\xdd\xceq\xc3\xf4W\x00!\x89\v\xbfQ\r\xdf\xcb&\x00\x00\xe0\x94\x88`\x9e\nF[n\x99\xfc\xe9\a\x16mW\xe9\xda\b\x14\xf5\u020a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x88m\n\x9e\x17\xc9\xc0\x95\xaf.\xa25\x8b\x89\xecpR\x12\ue509\x01\x84\x93\xfb\xa6N\xf0\x00\x00\u07d4\x88y~Xg^\xd5\xccL\x19\x98\a\x83\xdb\xd0\xc9V\bQS\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x88|\xacA\xcdpo3E\xf2\xd3J\xc3N\x01u*nY\t\x89 F\\\ue7617\x00\x00\u07d4\x88\x88\x8aW\xbd\x96\x87\xcb\xf9P\xae\xea\u03d7@\xdc\xc4\xd1\xefY\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u0794\x88\x89D\x83\x16\xcc\xf1N\xd8m\xf8\xe2\xf4x\xdcc\xc43\x83@\x88\xd2\xf1?w\x89\xf0\x00\x00\u07d4\x88\x8c\x16\x14I3\x19|\xac&PM\xd7n\x06\xfdf\x00\u01c9\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x88\x8e\x94\x91p\x83\xd1R +S\x1699\x86\x9d'\x11u\xb4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x88\x90\x87\xf6o\xf2\x84\xf8\xb5\xef\xbd)I;pg3\xab\x14G\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\x88\x95\xebrb&\xed\xc3\xf7\x8c\u01a5\x15\a{2\x96\xfd\xb9^\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x88\x97Z_\x1e\xf2R\x8c0\v\x83\xc0\xc6\a\xb8\xe8}\u0593\x15\x89\x04\x86\u02d7\x99\x19\x1e\x00\x00\u07d4\x88\x9d\xa4\x0f\xb1\xb6\x0f\x9e\xa9\xbdzE>XL\xf7\xb1\xb4\xd9\xf7\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x88\x9d\xa6b\xebJ\n*\x06\x9d+\xc2K\x05\xb4\xee.\x92\xc4\x1b\x89Z,\x8cTV\xc9\xf2\x80\x00\u07d4\x88\xa1\"\xa28,R91\xfbQ\xa0\u032d;\xeb[rY\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x88\xa2\x15D0\xc0\xe4\x11G\xd3\xc1\xfe\u3cf0\x06\xf8Q\xed\xbd\x8965f3\xeb\xd8\xea\x00\x00\u07d4\x88\xb2\x17\u0337\x86\xa2T\xcfM\xc5\u007f]\x9a\xc3\xc4U\xa3\x04\x83\x892$\xf4'#\xd4T\x00\x00\xe0\x94\x88\xbcC\x01.\xdb\x0e\xa9\xf0b\xacCxC%\n9\xb7\x8f\xbb\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x88\xc2Qj|\xdb\t\xa6'mr\x97\xd3\x0fZM\xb1\xe8K\x86\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x88\xc3ad\rki7;\b\x1c\xe0\xc43\xbdY\x02\x87\xd5\xec\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\x88\xd5A\xc8@\xceC\xce\xfb\xafm\x19\xafk\x98Y\xb5s\xc1E\x89\t79SM(h\x00\x00\u07d4\x88\xde\x13\xb0\x991\x87|\x91\rY1e\xc3d\u0221d\x1b\u04c9\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x88\xde\u017d?N\xba-\x18\xb8\xaa\xce\xfa{r\x15H\xc3\x19\xba\x89JD\x91\xbdm\xcd(\x00\x00\u07d4\x88\xe6\xf9\xb2G\xf9\x88\xf6\xc0\xfc\x14\xc5o\x1d\xe5>\u019dC\u0309\x05k\xc7^-c\x10\x00\x00\u07d4\x88\xee\u007f\x0e\xfc\x8fw\x8ckh~\xc3+\xe9\xe7\xd6\xf0 \xb6t\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x88\xf1\x04_\x19\xf2\xd3\x19\x18\x16\xb1\xdf\x18\xbbn\x145\xad\x1b8\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94\x89\x00\x9e\a\xe3\xfahc\xa7x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x89Wr~r\xcfb\x90 \xf4\xe0^\xdfy\x9a\xa7E\x80b\u0409wC\"\x17\xe6\x83`\x00\x00\u07d4\x89]iN\x88\v\x13\xcc\u0404\x8a\x86\xc5\xceA\x1f\x88Gk\xbf\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\x89^\xc5TVD\u0dc30\xff\xfa\xb8\xdd\xea\xc9\xe83\x15l\x89 \x86\xac5\x10R`\x00\x00\u07d4\x89`\tRj,{\f\t\xa6\xf6:\x80\xbd\U0009d707\u079c\x89\xbb\xb8k\x82#\xed\xeb\x00\x00\u07d4\x89g\u05f9\xbd\xb7\xb4\xae\xd2.e\xa1]\xc8\x03\xcbz!?\x10\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x89n3\\\xa4z\xf5yb\xfa\x0fM\xbf>E\xe6\x88\u02e5\x84\x89J/\xc0\xab`R\x12\x00\x00\u07d4\x89s\xae\xfd^\xfa\xee\x96\t]\x9e(\x8fj\x04l\x977KC\x89\a\xa4\u0120\xf32\x14\x00\x00\u07d4\x89\x8cr\xddseX\xef\x9eK\xe9\xfd\xc3O\xefT\xd7\xfc~\b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x89\x9b<$\x9f\fK\x81\xdfu\xd2\x12\x00M=m\x95/\xd2#\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x89\xab\x13\xee&mw\x9c5\xe8\xbb\x04\u034a\x90\xcc!\x03\xa9[\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4\x89\xc43\xd6\x01\xfa\xd7\x14\xdaci0\x8f\xd2l\x1d\u0254+\xbf\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x89\xd7[\x8e\b1\xe4o\x80\xbc\x17A\x88\x18N\x00o\xde\x0e\xae\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x89\u3d5a\x15\x86G7\u0513\xc1\xd2<\xc5=\xbf\x8d\xcb\x13b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x89\xfc\x8eM8k\r\v\xb4\xa7\a\xed\xf3\xbdV\r\xf1\xad\x8fN\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4\x89\xfe\xe3\r\x17(\xd9l\xec\xc1\u06b3\xda.w\x1a\xfb\u03eaA\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\x8a\x1c\u016c\x11\x1cI\xbf\xcf\xd8H\xf3}\xd7h\xaae\u0208\x02\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x8a \xe5\xb5\xce\xe7\xcd\x1fU\x15\xba\xce;\xf4\xf7\u007f\xfd\xe5\xcc\a\x89\x04V9\x18$O@\x00\x00\xe0\x94\x8a!}\xb3\x8b\xc3_!_\xd9)\x06\xbeBCo\xe7\xe6\xed\x19\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x8a$:\n\x9f\xeaI\xb89TwE\xff-\x11\xaf?K\x05\"\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x8a$}\x18e\x10\x80\x9fq\xcf\xfcEYG\x1c9\x10\x85\x81!\x89a\t=|,m8\x00\x00\u07d4\x8a4p(-^**\xef\u05e7P\x94\xc8\"\xc4\xf5\xae\uf289\r(\xbc`dx\xa5\x80\x00\u07d4\x8a6\x86\x9a\xd4x\x99|\xbfm\x89$\xd2\n<\x80\x18\xe9\x85[\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x8aC\x14\xfba\u0353\x8f\xc3>\x15\xe8\x16\xb1\x13\U000ac267\xfb\x89\x17vNz\xede\x10\x00\x00\u07d4\x8aOJ\u007fR\xa3U\xba\x10_\xca r\xd3\x06_\xc8\xf7\x94K\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8aX1(,\xe1Jezs\r\xc1\x88&\xf7\xf9\xb9\x9d\xb9h\x89\uaf8a[A\xc16\x00\x00\u07d4\x8a_\xb7W\x93\xd0C\xf1\xbc\xd48\x85\xe07\xbd0\xa5(\xc9'\x89\x13Snm.\x9a\xc2\x00\x00\u07d4\x8af\xab\xbc-0\xce!\xa83\xb0\u06ceV\x1dQ\x05\xe0\xa7,\x89%\xf1\xde\\v\xac\xdf\x00\x00\u07d4\x8atl]g\x06G\x11\xbf\xcah[\x95\xa4\xfe)\x1a'\x02\x8e\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x8ax\n\xb8z\x91E\xfe\x10\xed`\xfaGjt\n\xf4\u02b1\u0489\x12\x1b.^ddx\x00\x00\u07d4\x8az\x06\xbe\x19\x9a:X\x01\x9d\x84j\xc9\xcb\xd4\xd9]\xd7W\u0789\xa2\xa4#\x94BV\xf4\x00\x00\u07d4\x8a\x81\x01\x14\xb2\x02]\xb9\xfb\xb5\x00\x99\xa6\xe0\u02de.\xfak\u0709g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x8a\x86\xe4\xa5\x1c\x01;\x1f\xb4\xc7k\xcf0f|x\xd5.\xed\xef\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8a\x9e\u029cZ\xba\x8e\x13\x9f\x80\x03\xed\xf1\x16:\xfbp\xaa:\xa9\x89#\xc7W\a+\x8d\xd0\x00\x00\u07d4\x8a\xb89\xae\xaf*\xd3|\xb7\x8b\xac\xbb\xb63\xbc\xc5\xc0\x99\xdcF\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8a\u021b\u06780\x1ek\x06w\xfa%\xfc\xf0\xf5\x8f\f\u01f6\x11\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x8a\xdcS\xef\x8c\x18\xed0Qx]\x88\xe9\x96\xf3\xe4\xb2\x0e\xcdQ\x8a\b\xe4\xd3\x16\x82v\x86@\x00\x00\u07d4\x8a\xe6\xf8\vp\xe1\xf2<\x91\xfb\u0569f\xb0\xe4\x99\xd9]\xf82\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\x8a\xe9\uf30a\x8a\u07e6\xaby\x8a\xb2\xcd\xc4\x05\b*\x1b\xbbp\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8a\xf6&\xa5\xf3'\xd7Pe\x89\xee\xb7\x01\x0f\xf9\xc9D` \u0489K\xe4\xe7&{j\xe0\x00\x00\xe0\x94\x8b\x01\xda4\xd4p\xc1\xd1\x15\xac\xf4\xd8\x11\xe1\x01\xdb\x1e\x14\xec\xc7\xd3\"\xc7+\x8c\x04s\x89\x18\xb2j1>\x8a\xe9\x00\x00\xe0\x94\x8bH\xe1\x9d9\xdd5\xb6nn\x1b\xb6\xb9\xc6W\xcb,\xf5\x9d\x04\x8a\x03\xc7U\xac\x9c\x02J\x01\x80\x00\xe0\x94\x8bP^(q\xf7\u07b7\xa68\x95 \x8e\x82'\u072a\x1b\xff\x05\x8a\f\xf6\x8e\xfc0\x8dy\xbc\x00\x00\u07d4\x8bW\xb2\xbc\x83\u030dM\xe31 N\x89?/;\x1d\xb1\a\x9a\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x8b\\\x91K\x12\x8b\xf1i\\\b\x89#\xfaF~y\x11\xf3Q\xfa\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\xe0\x94\x8b_)\xcc/\xaa&,\xde\xf3\x0e\xf5T\xf5\x0e\xb4\x88\x14n\xac\x8a\x01;hp\\\x97 \x81\x00\x00\u07d4\x8bpV\xf6\xab\xf3\xb1\x18\xd0&\xe9D\xd5\xc0sC<\xa4Q\u05c965\xc6 G9\u0640\x00\u07d4\x8bqE\"\xfa(9b\x04p\xed\xcf\fD\x01\xb7\x13f=\xf1\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x8bt\xa7\xcb\x1b\xb8\u014f\xce&tf\xa3\x03X\xad\xafR\u007fa\x8a\x02\xe2WxN%\xb4P\x00\x00\u07d4\x8b~\x9fo\x05\xf7\xe3dv\xa1n>q\x00\xc9\x03\x1c\xf4\x04\xaf\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8b\x81\x15ni\x869\x94<\x01\xa7Rr\xad=5\x85\x1a\xb2\x82\x89\x12\xb3\x16_e\xd3\xe5\x00\x00\u07d4\x8b\x95w\x92\x00S\xb1\xa0\x01\x890M\x88\x80\x10\xd9\xef,\xb4\xbf\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8b\x98A\x86.w\xfb\xbe\x91\x94p\x93U\x83\xa9<\xf0'\xe4P\x89llS4B\u007f\x1f\x00\x00\u07d4\x8b\x99}\xbc\a\x8a\xd0)a5]\xa0\xa1Y\xf2\x92~\xd4=d\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\x8b\x9f\xda}\x98\x1f\xe9\xd6B\x87\xf8\\\x94\xd8?\x90t\x84\x9f\u030a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x8b\xb0!/2\x95\xe0)\u02b1\xd9a\xb0A3\xa1\x80\x9e{\x91\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8b\xbe\xac\xfc)\xcf\xe94\x02\xdb\xd6j\x1a\xcbvv\x85c7\xb9;\xf0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8b\xf3s\xd0v\x81L\xbcW\xe1\xc6\xd1j\x82\u017e\x13\xc7=7\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x8c\x10#\xfd\xe1WM\xb8\xbbT\xf1s\x96p\x15|\xa4}\xa6R\x8a\x01y\u03da\u00e1\xb1w\x00\x00\u07d4\x8c\x1f\xbe_\n\xea5\x9cZ\xa1\xfa\b\u0209T\x12\u028e\x05\xa6\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8c\"B`U\xb7o\x11\xf0\xa2\xde\x1a\u007f\x81\x9aa\x96\x85\xfe`\x89kV\x05\x15\x82\xa9p\x00\x00\u07d4\x8c+}\x8b`\x8d(\xb7\u007f\\\xaa\x9c\xd6E$*\x82>L\u0649b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\x8c/\xbe\ue3ac\xc5\xc5\xd7|\x16\xab\xd4b\ue701E\xf3K\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x8c:\x9e\xe7\x1fr\x9f#l\xba8g\xb4\u05dd\x8c\xee\xe2]\xbc\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x8cP\xaa*\x92\x12\xbc\xdeVA\x8a\xe2a\xf0\xb3^z\x9d\xbb\x82\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x8cT\xc7\xf8\xb9\x89nu\xd7\xd5\xf5\xc7`%\x86\x99\x95qB\xad\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x8c]\x16\xede\xe3\xed~\x8b\x96\u0297+\xc8as\xe3P\v\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8cj\xa8\x82\xee2,\xa8HW\x8c\x06\xcb\x0f\xa9\x11\xd3`\x83\x05\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\x8cj\xe7\xa0Z\x1d\xe5u\x82\xae'h Bv\xc0\xffG\xed\x03\x8a,\v\xb3\xdd0\xc4\xe2\x00\x00\x00\u07d4\x8co\x9fN[z\xe2v\xbfXI{\u05ff*}%$_d\x89\x93\xfe\\W\xd7\x10h\x00\x00\u07d4\x8cu\x95n\x8f\xedP\xf5\xa7\xdd|\xfd'\xda \x0fgF\xae\xa6\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8c|\xb4\xe4\x8b%\x03\x1a\xa1\xc4\xf9)%\xd61\xa8\xc3\xed\xc7a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8c\u007f\xa5\xca\xe8/\xed\xb6\x9a\xb1\x89\xd3\xff'\xae \x92\x93\xfb\x93\x89\x15\xaf\x88\r\x8c\u06c3\x00\x00\xe0\x94\x8c\x81A\x0e\xa85L\xc5\xc6\\A\xbe\x8b\xd5\xdes<\v\x11\x1d\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\x8c\x83\xd4$\xa3\xcf$\xd5\x1f\x01\x92=\xd5J\x18\u05b6\xfe\xde{\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8c\x90\n\x826\xb0\x8c+e@]9\xd7_ \x06*ua\xfd\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4\x8c\x93\xc3\xc6\u06dd7q}\xe1e\u00e1\xb4\xfeQ\x95,\b\u0789\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x8c\x99\x95\x91\xfdr\xefq\x11\xef\xcaz\x9e\x97\xa25k;\x00\n\x89\xddd\xe2\xaa\ngP\x00\x00\u07d4\x8c\xa6\x98\x97F\xb0n2\xe2Hta\xb1\u0399j':\xcf\u05c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x8c\xb3\xaa?\xcd!(T\xd7W\x8f\xcc0\xfd\xed\xe6t*1*\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x8c\xc0\xd7\xc0\x16\xfaz\xa9P\x11J\xa1\xdb\tH\x82\xed\xa2t\xea\x89\b\xa9\xab\xa5W\xe3l\x00\x00\u07d4\x8c\xc6R\xdd\x13\xe7\xfe\x14\u06bb\xb3m]2\r\xb9\xff\xee\x8aT\x89a\t=|,m8\x00\x00\u07d4\x8c\u02bf%\a\u007f:\xa4\x15E4MS\xbe\x1b+\x9c3\x90\x00\x89[\xe8f\xc5b\xc5D\x00\x00\u07d4\x8c\xcf:\xa2\x1a\xb7BWj\xd8\xc4\"\xf7\x1b\xb1\x88Y\x1d\ua28965\u026d\xc5\u07a0\x00\x00\u07d4\x8c\xd0\xcd\"\xe6 \xed\xa7\x9c\x04a\xe8\x96\xc9\xd1b)\x12K_z\xfb\xec\x89\a?u\u0460\x85\xba\x00\x00\u07d4\x8c\xe2/\x9f\xa3rD\x9aB\x06\x10\xb4z\xe0\xc8\xd5eH\x122\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x8c\u451d\x8a\x16T-B<\x17\x98Ng9\xfar\u03b1w\x8a\x05K@Y&\xf4\xa6=\x80\x00\u07d4\x8c\xe5\xe3\xb5\xf5\x91\xd5\uc8ca\xbf\"\x8f.<5\x13K\xda\xc0\x89}\xc3[\x84\x89|8\x00\x00\xe0\x94\x8c\xee8\xd6YW\x88\xa5n?\xb9F4\xb3\xff\xe1\xfb\xdb&\u058a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x8c\xee\xa1^\xec;\xda\xd8\x02?\x98\xec\xf2[+\x8f\xef'\xdb)\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8c\xf3To\xd1\u0363=X\x84_\xc8\xfc\xfe\u02bc\xa7\xc5d*\x89\x1f\x1e9\x93,\xb3'\x80\x00\u07d4\x8c\xf6\xda\x02\x04\xdb\u0106\vF\xad\x97?\xc1\x11\x00\x8d\x9e\fF\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x8c\xfe\xde\xf1\x98\xdb\n\x91C\xf0\x91)\xb3\xfdd\u073b\x9bIV\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8d\x04\xa5\xeb\xfb]\xb4\t\xdb\x06\x17\xc9\xfaV1\xc1\x92\x86\x1fJ\x894\x95tD\xb8@\xe8\x00\x00\u07d4\x8d\x06\xe4d$\\\xadaI9\xe0\xaf\bE\xe6\xd70\xe2\x03t\x89\n\u070a(\xf3\xd8}\x80\x00\u07d4\x8d\a\xd4-\x83\x1c-|\x83\x8a\xa1\x87+:\xd5\xd2w\x17h#\x89\x12\xee\x1f\x9d\xdb\xeeh\x00\x00\u07d4\x8d\v\x9e\xa5?\xd2cA^\xac\x119\x1f|\xe9\x12V\xb9\xfb\x06`\xf6\xf0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8dy\\_JV\x89\xadb\u0696\x16q\xf0(\x06R\x86\xd5T\x89o\x05\xb5\x9d; \x00\x00\x00\u07d4\x8d\u007f>a)\x9c-\xb9\xb9\xc0H|\xf6'Q\x9e\xd0\n\x91#\x89^t\xa8P^\x80\xa0\x00\x00\xe0\x94\x8d\x89\x17\v\x92\xb2\xbe,\b\xd5|H\xa7\xb1\x90\xa2\xf1Fr\x0f\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\x8d\x93\xda\u01c5\xf8\x8f\x1a\x84\xbf\x92}Se+E\xa1T\xcc\u0749\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x8d\x99R\u043bN\xbf\xa0\xef\xd0\x1a:\xa9\xe8\xe8\u007f\x05%t.\x89\xbb\x91%T\"c\x90\x00\x00\u07d4\x8d\x9a\fp\xd2& B\xdf\x10\x17\xd6\xc3\x03\x13 $w'\x12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8d\x9e\xd7\xf4U0X\xc2ox6\xa3\x80-0d\xeb\x1b6=\x89\x04\xe1\x00;(\xd9(\x00\x00\u07d4\x8d\xa1\x17\x8fU\xd9wr\xbb\x1d$\x11\x1a@JO\x87\x15\xb9]\x89/\x9a\xc3\xf6\xde\x00\x80\x80\x00\u07d4\x8d\xa1\xd3Y\xbal\xb4\xbc\xc5}zCw \xd5]\xb2\xf0\x1cr\x89\x04V9\x18$O@\x00\x00\u07d4\x8d\xab\x94\x8a\xe8\x1d\xa3\x01\xd9r\xe3\xf6\x17\xa9\x12\xe5\xa7Sq.\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x8d\xad\xdfR\xef\xbdt\u0695\xb9i\xa5GoO\xbb\xb5c\xbf\u0489-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4\x8d\xb1\x85\xfe\x1bp\xa9Jj\b\x0e~#\xa8\xbe\xdcJ\xcb\xf3K\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x8d\xb5\x8e@n -\xf9\xbcpl\xb43\xe1\x94\xf4\x0f\x82\xb4\x0f\xaa\xdb\x1f\x8b\x85a\x16\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x8d\xc1\xd5\x11\x1d\t\xaf%\xfd\xfc\xacE\\|\xec(>mgu\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8d\u0504\xff\x8a0sd\xebf\xc5%\xa5q\xaa\xc7\x01\xc5\xc3\x18\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8d\u05a9\xba\xe5\u007fQ\x85I\xad\xa6wFo\ua2b0O\u0674\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8d\xde<\xb8\x11\x85h\xefE\x03\xfe\x99\x8c\xcd\xf56\xbf\x19\xa0\x98\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8d\xde`\xeb\b\xa0\x99\xd7\u06a3V\u06aa\xb2G\r{\x02Zk\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\x8d\xf39!Kj\u0472Fc\xceq`4t\x9dn\xf88\u064a\x02TO\xaaw\x80\x90\xe0\x00\x00\xe0\x94\x8d\xf5=\x96\x19\x14q\xe0Y\xdeQ\xc7\x18\xb9\x83\xe4\xa5\x1d*\xfd\x8a\x06\u01b95\xb8\xbb\xd4\x00\x00\x00\u07d4\x8d\xfb\xaf\xbc\x0e[\\\x86\xcd\x1a\u0597\xfe\xea\x04\xf41\x88\u0796\x89\x15%+\u007f_\xa0\xde\x00\x00\u07d4\x8e\a;\xad%\xe4\"\x18a_J\x0ek.\xa8\xf8\xde\"0\xc0\x89\x82=b\x9d\x02k\xfa\x00\x00\u07d4\x8e\x0f\xee8hZ\x94\xaa\xbc\xd7\u0385{k\x14\t\x82Ou\xb8\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8e#\xfa\xcd\x12\xc7e\xc3j\xb8\x1am\xd3M\x8a\xa9\xe6\x89\x18\xae\x89\t\x11\u418d\xba\x9b\x00\x00\xe0\x94\x8e/\x904\xc9%G\x19\u00ceP\u026ad0^\u0596\xdf\x1e\x8a\x01\x00N.E\xfb~\xe0\x00\x00\u07d4\x8e2@\xb0\x81\x0e\x1c\xf4\a\xa5\x00\x80G@\u03cdad2\xa4\x89\x02/fU\xef\v8\x80\x00\u07d4\x8eHj\x04B\xd1q\xc8`[\xe3H\xfe\xe5~\xb5\b^\xff\r\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8eaV3k\xe2\u037e2\x14\r\xf0\x8a+\xa5_\u0425\x84c\x89\x04\t\x9e\x1dcW\x18\x00\x00\u07d4\x8eg\b\x15\xfbg\xae\xae\xa5{\x86SN\xdc\x00\xcd\xf5d\xfe\u5272\xe4\xb3#\xd9\xc5\x10\x00\x00\u07d4\x8emt\x85\xcb\u942c\xc1\xad\x0e\xe9\xe8\xcc\xf3\x9c\f\x93D\x0e\x893\xc5I\x901r\f\x00\x00\xe0\x94\x8et\xe0\u0477~\xbc\x82:\xca\x03\xf1\x19\x85L\xb1 '\xf6\u05ca\x16\xb3R\xda^\x0e\xd3\x00\x00\x00\u07d4\x8ex\xf3QE}\x01oJ\xd2u^\xc7BN\\!\xbamQ\x89\a\xea(2uw\b\x00\x00\u07d4\x8ey6\u0552\x00\x8f\xdcz\xa0N\xde\xebuZ\xb5\x13\u06f8\x9d\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x8e\u007f\xd28H\xf4\xdb\a\x90j}\x10\xc0K!\x80;\xb0\x82'\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8e\x92\xab\xa3\x8er\xa0\x98\x17\v\x92\x95\x92FSz.UV\xc0\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\x8e\x98ve$\xb0\xcf'G\xc5\r\xd4;\x95gYM\x971\u0789lD\xb7\xc2a\x82(\x00\x00\u07d4\x8e\x9b5\xadJ\n\x86\xf7XDo\xff\xde4&\x9d\x94\f\xea\u0349\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8e\x9c\b\xf78f\x1f\x96v#n\xff\x82\xbaba\xdd?H\"\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x8e\x9cB\x92f\xdf\x05~\xfax\xdd\x1d_w\xfc@t*\xd4f\x89\x10D.\u0475l|\x80\x00\u07d4\x8e\xa6V\xe7\x1e\xc6Q\xbf\xa1|ZWY\xd8`1\xcc5\x99w\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x8e\xae)CU\x98\xba\x8f\x1c\x93B\x8c\xdb>+M1\a\x8e\x00\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8e\xb1\xfb\xe4\xe5\xd3\x01\x9c\xd7\xd3\r\xae\x9c\r[Lv\xfbc1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8e\xb5\x17t\xaf k\x96k\x89\t\xc4Z\xa6r'H\x80,\f\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8e\xb8\xc7\x19\x82\xa0\x0f\xb8Bu)2S\xf8\x04ED\xb6kI\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\x8e\xcb\u03ec\xbf\xaf\xe9\xf0\f9\"\xa2N,\xf0\x02gV\xca \x8a\x011\xbe\xb9%\xff\xd3 \x00\x00\u07d4\x8e\u03b2\xe1$Sl[_\xfcd\x0e\xd1O\xf1^\u0668\xcbq\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8e\u042f\x11\xff(p\xda\x06\x81\x00J\xfe\x18\xb0\x13\xf7\xbd8\x82\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u0794\x8e\xd1Cp\x1f/r(\x0f\xd0J{Ad(\x19y\xea\x87\u0248\xc2I\xfd\xd3'x\x00\x00\u07d4\x8e\xd1R\x8bD~\xd4)y\x02\xf69\xc5\x14\u0414J\x88\xf8\u0209\n\xc6\xe7z\xb6c\xa8\x00\x00\u07d4\x8e\xd4(L\x0fGD\x9c\x15\xb8\u0673$]\u8fb6\u0380\xbf\x89+^:\xf1k\x18\x80\x00\x00\xe0\x94\x8e\xde~=\xc5\aI\xc6\xc5\x0e.(\x16\x84x\xc3M\xb8\x19F\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\x8e\xe5\x843}\xdb\xc8\x0f\x9e4\x98\xdfU\xf0\xa2\x1e\xac\xb5\u007f\xb1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x8e\xeb\xec\x1ab\xc0\x8b\x05\xa7\xd1\u0551\x80\xaf\x9f\xf0\u044e?6\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x8e\xf4\u0622\xc2o\xf7\x14\xb6u\x89\x19\x80\x1c\x83\xb6\xc7\xc0\x00\x00\u07d4\x8fM\x1dAi>F,\xf9\x82\xfd\x81\u042ap\x1d:St\u0249\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8fM\x1e~Ea(J4\xfe\xf9g<\r4\xe1*\xf4\xaa\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8fO\xb1\xae\xa7\xcd\x0fW\x0e\xa5\xe6\x1b@\xa4\xf4Q\vbd\xe4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x8fV\x1bA\xb2\t\xf2H\u0229\x9f\x85\x87\x887bP`\x9c\xf3\x89\\(=A\x03\x94\x10\x00\x00\xe0\x94\x8fX\xd84\x8f\xc1\xdcN\r\xd84;eC\xc8W\x04^\xe9@\x8a\x02\xe3\x03\x8d\xf4s\x03(\x00\x00\u07d4\x8f`\x89_\xbe\xbb\xb5\x01\u007f\xcb\xff<\u0763\x97)+\xf2[\xa6\x89\x17D\x06\xff\x9fo\u0480\x00\u07d4\x8fd\xb9\xc1$m\x85x1d1\a\xd3U\xb5\xc7_\xef]O\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\x8ff\x0f\x8b.L|\u00b4\xac\x9cG\xed(P\x8d_\x8f\x86P\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x8fi\xea\xfd\x023\xca\xdb@Y\xabw\x9cF\xed\xf2\xa0PnH\x89`\xf0f \xa8IE\x00\x00\xe0\x94\x8fq~\xc1U/LD\x00\x84\xfb\xa1\x15J\x81\xdc\x00>\xbd\xc0\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\x8f\x8a\xcb\x10v\a8\x84y\xf6K\xaa\xab\xea\x8f\xf0\a\xad\xa9}\x8a\x05\xc6\xf3\b\n\xd4#\xf4\x00\x00\u07d4\x8f\x8c\xd2n\x82\xe7\xc6\xde\xfd\x02\u07ed\a\x97\x90!\xcb\xf7\x15\f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x8f\x8f7\u042d\x8f3]*q\x01\xb4\x11V\xb6\x88\xa8\x1a\x9c\xbe\x89\x03\xcbq\xf5\x1f\xc5X\x00\x00\u07d4\x8f\x92\x84O(*\x92\x99\x9e\u5d28\xd7s\xd0kiM\xbd\x9f\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x8f\xact\x8fxJ\x0f\xedh\u06e43\x19\xb4*u\xb4d\x9cn\x891T\xc9r\x9d\x05x\x00\x00\u07d4\x8f\u0665\xc3:}\x9e\xdc\xe0\x99{\xdfw\xab0d$\xa1\x1e\xa9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x8f\xef\xfa\xdb8z\x15G\xfb(M\xa9\xb8\x14\u007f>|m\xc6\u0689-b{\xe4S\x05\b\x00\x00\u07d4\x8f\xf4`Ehw#\xdc3\xe4\u0419\xa0i\x04\xf1\ubd44\u0709lk\x93[\x8b\xbd@\x00\x00\u07d4\x8f\xfa\x06!\"\xac0t\x18\x82\x1a\u06d3\x11\aZ7\x03\xbf\xa3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x8f\xfe2)\x97\xb8\xe4\x04B-\x19\xc5J\xad\xb1\x8f[\xc8\u9dc9\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x90\x01\x94\u0131\aC\x05\u045d\xe4\x05\xb0\xacx(\x0e\xca\xf9g\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x90\x03\xd2p\x89\x1b\xa2\xdfd=\xa84\x15\x83\x195E\xe3\xe0\x00\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x90\x05z\xf9\xaaf0~\xc9\xf03\xb2\x97$\u04f2\xf4\x1e\xb6\xf9\x8a\x19\xd1\u05aa\xdb,R\xe8\x00\x00\u07d4\x90\x0f\v\x8e5\xb6h\xf8\x1e\xf2R\xb18U\xaaP\a\xd0\x12\xe7\x89\x17\n\x0fP@\xe5\x04\x00\x00\u07d4\x90\x18\xcc\x1fH\xd20\x8e%*\xb6\b\x9f\xb9\x9a|\x1dV\x94\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x90\x1d\x99\xb6\x99\xe5\u0191\x15\x19\xcb v\xb4\xc7c0\xc5M\"\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x90-t\xa1W\xf7\u04b9\xa37\x8b\x1fVp70\xe0:\x17\x19\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x904\x13\x87\x8a\xea;\xc1\bc\t\xa3\xfev\x8beU\x9e\x8c\xab\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x90If\xcc\"\x13\xb5\xb8\xcb[\xd6\b\x9e\xf9\xcd\xdb\xef~\xdf\u0309lk\x93[\x8b\xbd@\x00\x00\u07d4\x90L\xaaB\x9ca\x9d\x94\x0f\x8egA\x82j\r\xb6\x92\xb1\x97(\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x90R\xf2\xe4\xa3\xe3\xc1-\xd1\xc7\x1b\xf7\x8aN\xc3\x04=\u020b~\x89\x0e~\xeb\xa3A\vt\x00\x00\u0794\x90U&V\x8a\xc1#\xaf\xc0\xe8J\xa7\x15\x12O\xeb\xe8=\xc8|\x88\xf8i\x93)g~\x00\x00\u07d4\x90\x92\x91\x87\a\xc6!\xfd\xbd\x1d\x90\xfb\x80\xebx\u007f\xd2osP\x89\x85[[\xa6\\\x84\xf0\x00\x00\u07d4\x90\x9b^v:9\xdc\u01d5\"=s\xa1\u06f7\xd9L\xa7Z\u0209lk\x93[\x8b\xbd@\x00\x00\u07d4\x90\xac\xce\xd7\xe4\x8c\b\u01b94dm\xfa\n\xdf)\u0714\aO\x89\x03\vK\x15{\xbdI\x00\x00\u07d4\x90\xb1\xf3p\xf9\xc1\xeb\v\xe0\xfb\x8e+\x8a\xd9jAcq\u074a\x890\xca\x02O\x98{\x90\x00\x00\u07d4\x90\xb6/\x13\x1a_)\xb4UqQ>\xe7\xa7J\x8f\v#\"\x02\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x90\xbdb\xa0P\x84Ra\xfaJ\x9f|\xf2A\xeac\v\x05\ufe09\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x90\xc4\x1e\xba\x00\x8e \xcb\xe9'\xf3F`?\u0206\x98\x12Yi\x89\x02F\xdd\xf9yvh\x00\x00\u07d4\x90\u0480\x9a\xe1\xd1\xff\xd8\xf6>\xda\x01\xdeI\xddU-\xf3\u047c\x89\u063beI\xb0+\xb8\x00\x00\u07d4\x90\xdc\t\xf7\x17\xfc*[i\xfd`\xba\b\xeb\xf4\v\xf4\xe8$l\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\x90\xe3\x00\xacqE\x1e@\x1f\x88\u007fnw(\x85\x16G\xa8\x0e\a\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x90\xe3Z\xab\xb2\xde\xef@\x8b\xb9\xb5\xac\xefqDW\xdf\xdebr\x89\x05l\xd5_\xc6M\xfe\x00\x00\u07d4\x90\xe7\a\x0fM\x03?\xe6\x91\f\x9e\xfeZ'\x8e\x1f\xc6#M\xef\x89\x05q8\b\x19\xb3\x04\x00\x00\u07d4\x90\xe9>M\xc1q!HyR36\x14\x00+\xe4#VI\x8e\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x90\u9a68.\u06a8\x14\u0084\xd22\xb6\u9e90p\x1dIR\x89\x05k\xe0<\xa3\xe4}\x80\x00\u07d4\x90\xf7t\xc9\x14}\u0790\x85=\xdcC\xf0\x8f\x16\xd4U\x17\x8b\x8c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x90\xfcS{!\x06Xf\n\x83\xba\xa9\xacJ\x84\x02\xf6WF\xa8\x89e\xea=\xb7UF`\x00\x00\u07d4\x91\x05\n\\\xff\xad\xed\xb4\xbbn\xaa\xfb\xc9\xe5\x014(\xe9l\x80\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x91\x05\x17d\xafk\x80\x8eB\x12\xc7~0\xa5W.\xaa1pp\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x91\v}Wz~9\xaa#\xac\xf6*\xd7\xf1\xef4)4\xb9h\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x91\x0e\x99eC4Lh\x15\xfb\x97\u0367\xafK\x86\x98vZ[\x89\x05\x9a\xf6\x98)\xcfd\x00\x00\u07d4\x91\x1f\xee\xa6\x1f\xe0\xedP\u0179\xe5\xa0\xd6`q9\x9d(\xbd\u0189\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\x91\x1f\xf23\xe1\xa2\x11\xc0\x17,\x92\xb4l\xf9\x97\x03\x05\x82\xc8:\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x91 \xe7\x11s\xe1\xba\x19\xba\x8f\x9fO\xdb\u072a4\xe1\u05bbx\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x91!\x17\x12q\x9f+\bM;8u\xa8Pi\xf4f61A\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x91#\x04\x11\x8b\x80G=\x9e\x9f\xe3\xeeE\x8f\xbea\x0f\xfd\xa2\xbb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x91Tky\xec\xf6\x9f\x93kZV\x15\b\xb0\xd7\xe5\f\u0159/\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\x91V\u0440)5\x0eG\x04\b\xf1_\x1a\xa3\xbe\x9f\x04\ng\u018965\u026d\xc5\u07a0\x00\x00\u07d4\x91b\x0f>\xb3\x04\xe8\x13\u048b\x02\x97Ume\xdcN]\u5a89\xcf\x15&@\xc5\xc80\x00\x00\xe0\x94\x91k\xf7\xe3\xc5E\x92\x1d2\x06\xd9\x00\xc2O\x14\x12|\xbd^p\x8a\x03\xd0\u077c}\xf2\xbb\x10\x00\x00\u0794\x91l\xf1}qA(\x05\xf4\xaf\xc3DJ\v\x8d\xd1\xd93\x9d\x16\x88\xc6s\xce<@\x16\x00\x00\u07d4\x91{\x8f\x9f:\x8d\t\xe9 ,R\u009erA\x96\xb8\x97\xd3^\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\u07d4\x91\x89g\x91\x8c\u0617\xdd\x00\x05\xe3m\xc6\u0203\xefC\x8f\xc8\u01c9\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\x91\x89\x8e\xab\x8c\x05\xc0\"(\x83\xcdM\xb2;w\x95\xe1\xa2J\u05c9lk\x93[\x8b\xbd@\x00\x00\u0794\x91\x91\xf9F\x98!\x05\x16\xcfc!\xa1B\a\x0e Yvt\xed\x88\xee\x9d[\xe6\xfc\x11\x00\x00\u07d4\x91\xa4\x14\x9a,{\x1b:g\xea(\xaf\xf3G%\u0fcdu$\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x91\xa7\x87\xbcQ\x96\xf3HW\xfe\f7/M\xf3v\xaa\xa7f\x13\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x91\xa8\xba\xae\xd0\x12\xea.c\x80;Y=\r\f*\xabL[\n\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\x91\xac\\\xfeg\xc5J\xa7\xeb\xfb\xa4HflF\x1a;\x1f\xe2\xe1\x89\x15\xc94\x92\xbf\x9d\xfc\x00\x00\u07d4\x91\xbb?y\x02+\xf3\xc4S\xf4\xff%n&\x9b\x15\xcf,\x9c\xbd\x89RX\\\x13\xfe:\\\x00\x00\u07d4\x91\xc7^<\xb4\xaa\x89\xf3F\x19\xa1d\xe2\xa4x\x98\xf5gM\x9c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x91\xc8\f\xaa\b\x1b85\x1d*\x0e\x0e\x00\xf8\n4\xe5dt\xc1\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x91\xccF\xaa7\x9f\x85jf@\xdc\xcdZd\x8ay\x02\xf8I\u0649\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x91\u04a9\xee\x1am\xb2\x0fS\x17\u0327\xfb\xe218\x95\u06ce\xf8\x8a\x01\xcc\u00e5/0n(\x00\x00\u07d4\x91\xd6n\xa6(\x8f\xaaK=`l*\xa4\\{k\x8a%'9\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x91\u06f6\xaa\xad\x14\x95\x85\xbeG7\\]m\xe5\xff\t\x19\x15\x18\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x91\xe8\x81\x06R\xe8\xe6\x16\x15%\xd6;\xb7u\x1d\xc2\x0fg`v\x89'Mej\xc9\x0e4\x00\x00\u07d4\x91\xf5\x16\x14l\xda (\x17\x19\x97\x80`\u01beAI\x06|\x88\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x91\xf6$\xb2J\x1f\xa5\xa0V\xfeW\x12)\xe77\x9d\xb1K\x9a\x1e\x8a\x02\x8a\x85\x17\xc6i\xb3W\x00\x00\xe0\x94\x91\xfe\x8aLad\u07cf\xa6\x06\x99]k\xa7\xad\xca\xf1\u0213\u038a\x03\x99\x92d\x8a#\u0220\x00\x00\u07d4\x92\x1fRa\xf4\xf6\x12v\a\x06\x89&%\xc7^{\u0396\xb7\b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92!\xc9\xce\x01#&et\x10\x96\xac\a#Y\x03\xad\x1f\xe2\xfc\x89\x06\xdbc3U\"b\x80\x00\u07d4\x92%\x988`\xa1\xcbF#\xc7$\x80\xac\x16'+\f\x95\xe5\xf5\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x92%\xd4jZ\x80\x949$\xa3\x9e[\x84\xb9m\xa0\xacE\x05\x81\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x92* \u01da\x1d:&\xdd8)g{\xf1\xd4\\\x8fg+\xb6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x92C\x8eR\x03\xb64o\xf8\x86\xd7\xc3b\x88\xaa\xcc\xccx\xce\u028965\u026d\xc5\u07a0\x00\x00\u07d4\x92C\xd7v-w({\x12c\x86\x88\xb9\x85N\x88\xa7i\xb2q\x8965\u026d\xc5\u07a0\x00\x00\u0794\x92K\xcez\x85<\x97\v\xb5\xec{\xb7Y\xba\xeb\x9ct\x10\x85{\x88\xbe -j\x0e\xda\x00\x00\u07d4\x92N\xfam\xb5\x95\xb7\x93\x13'~\x881\x96%\akX\n\x10\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92U\x82&\xb3\x84bl\xadH\xe0\x9d\x96k\xf19^\xe7\xea]\x89\x12\x1e\xa6\x8c\x11NQ\x00\x00\u07d4\x92`\x82\xcb~\xedK\x19\x93\xad$ZGrg\xe1\xc3<\xd5h\x89\x14Jt\xba\u07e4\xb6\x00\x00\u07d4\x92b\t\xb7\xfd\xa5N\x8d\u06dd\x9eM=\x19\xeb\u070e\x88\u009f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92h\xd6&FV6\x11\xdc;\x83*0\xaa#\x94\xc6F\x13\xe3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92i\x8e4Sx\xc6-\x8e\xda\x18M\x946j\x14K\f\x10[\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\x92y:\u0173rhwJq0\xde+\xbd3\x04\x05f\x17s\x89\x02,\xa3X|\xf4\xeb\x00\x00\xe0\x94\x92y\xb2\"\x8c\xec\x8f{M\xda?2\x0e\x9a\x04f\xc2\xf5\x85\u028a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x92|\xb7\xdc\x18p6\xb5B{\xc7\xe2\x00\xc5\xecE\f\x1d'\u0509\v\xb5\x9a'\x95<`\x00\x00\u07d4\x92|\u00bf\xda\x0e\b\x8d\x02\xef\xf7\v8\xb0\x8a\xa5<\xc3\tA\x89do`\xa1\xf9\x866\x00\x00\xe0\x94\x92\x84\xf9m\xdbG\xb5\x18n\xe5X\xaa12M\xf56\x1c\x0fs\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\x92\x9d6\x8e\xb4j-\x1f\xbd\xc8\xff\xa0`~\xdeK\xa8\x8fY\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\xa7\u0166Cb\xe9\xf8B\xa2=\xec\xa2\x105\x85\u007f\x88\x98\x00\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\x92\xa8\x98\xd4o\x19q\x9c8\x12j\x8a<'\x86z\xe2\xce\u5589lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\xa9q\xa79y\x9f\x8c\xb4\x8e\xa8G]r\xb2\xd2GAr\xe6\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x92\xaa\xe5\x97h\xed\xdf\xf8<\xfe`\xbbQ.s\n\x05\xa1a\u05c9\\\x97xA\fv\u0440\x00\u07d4\x92\xad\x1b=u\xfb\xa6}Tf=\xa9\xfc\x84\x8a\x8a\xde\x10\xfag\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\xae[|~\xb4\x92\xff\x1f\xfa\x16\xddB\xad\x9c\xad@\xb7\xf8\u0709.\xe4IU\b\x98\xe4\x00\x00\u07d4\x92\xc0\xf5s\xec\xcfb\xc5H\x10\xeek\xa8\xd1\xf1\x13T+0\x1b\x89\xb7ro\x16\u0331\xe0\x00\x00\u07d4\x92\xc1?\xe0\xd6\u0387\xfdP\xe0=\uf7e6@\x05\t\xbdps\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x92\xc9L( \xdf\xcfqV\xe6\xf10\x88\xec\u754b6v\xfd\x89\x05-T(\x04\xf1\xce\x00\x00\u07d4\x92\xcf\xd6\x01\x88\xef\u07f2\xf8\xc2\xe7\xb1i\x8a\xbb\x95&\xc1Q\x1f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\u062d\x9aMah;\x80\u0526g.\x84\xc2\rbB\x1e\x80\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x92\u0725\xe1\x02\xb3\xb8\x1b`\xf1\xa5\x04cIG\xc3t\xa8\x8c\u02c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x92\xe454\x0e\x9d%<\x00%c\x89\xf5+\x06}U\x97Nv\x89\x0e\x87?D\x13<\xb0\x00\x00\xe0\x94\x92\xe49(\x16\xe5\xf2\xef_\xb6X7\xce\xc2\xc22\\\xc6I\"\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x92\xe6X\x1e\x1d\xa1\xf9\xb8F\xe0\x93G3=\xc8\x18\xe2\u04acf\x89\xc5S%\xcat\x15\xe0\x00\x00\u07d4\x93\x1d\xf3M\x12%\xbc\xd4\"Nch\r\\L\t\xbc\xe75\xa6\x89\x03\xaf\xb0\x87\xb8v\x90\x00\x00\u07d4\x93\x1f\xe7\x12\xf6B\a\xa2\xfdP\"r\x88CT\x8b\xfb\x8c\xbb\x05\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x93#_4\r(c\xe1\x8d/LR\x99e\x16\x13\x8d\"\x02g\x89\x04\x00.D\xfd\xa7\xd4\x00\x00\u07d4\x93%\x82U\xb3|\u007fX\xf4\xb1\x06s\xa92\xdd:\xfd\x90\xf4\xf2\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x93(\xd5\\\xcb?\xceS\x1f\x19\x93\x823\x9f\x0eWn\xe8@\xa3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x93)\xff\xdc&\x8b\xab\u0788t\xb3f@l\x81D[\x9b-5\x89\x16\xe6/\x8cs\f\xa1\x80\x00\u07d4\x93+\x9c\x04\xd4\r*\xc80\x83\xd9B\x98\x16\x9d\xae\x81\xab.\u0409lk\x93[\x8b\xbd@\x00\x00\u07d4\x9346\xc8G&U\xf6L:\xfa\xaf|Lb\x1c\x83\xa6+8\x8965\u026d\xc5\u07a0\x00\x00\u0794\x93;\xf3?\x82\x99p+:\x90&B\xc3>\v\xfa\xea\\\x1c\xa3\x88\xd2\xf1?w\x89\xf0\x00\x00\u07d4\x93@4\\\xa6\xa3\uaf77sc\xf2X`C\xf2\x948\xce\v\x89\x1c\xc8\x05\xda\r\xff\xf1\x00\x00\xe0\x94\x93@\xb5\xf6x\xe4^\xe0^\xb7\b\xbbz\xbbn\xc8\xf0\x8f\x1bk\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x93J\xf2\x1b~\xbf\xa4g\xe2\xce\xd6Z\xa3N\xdd:\x0e\xc7\x132\x8a\a\x80\x1f>\x80\xcc\x0f\xf0\x00\x00\xe0\x94\x93PiDJj\x98M\xe2\bNFi*\xb9\x9fg\x1f\xc7'\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\xe0\x94\x93P~\x9e\x81\x19\xcb\xce\u068a\xb0\x87\xe7\xec\xb0q8=i\x81\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\x93g\x8a\x00\x00\xe0\x94\x93m\xcf\x00\x01\x94\xe3\xbf\xf5\n\u0174$:;\xa0\x14\xd6a\u060a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x93o8\x13\xf5\xf6\xa1;\x8eO\xfe\xc8?\xe7\xf8&\x18jq\u0349\x1c0s\x1c\xec\x03 \x00\x00\u07d4\x93t\x86\x9dJ\x99\x11\xee\x1e\xafU\x8b\xc4\u00b6>\xc6:\xcf\u074965\u026d\xc5\u07a0\x00\x00\u07d4\x93uc\u0628\x0f\u05657\xb0\xe6m \xa0%%\xd5\u0606`\x89\x87\x86x2n\xac\x90\x00\x00\u07d4\x93v\xdc\xe2\xaf.\xc8\xdc\xdat\x1b~sEfF\x81\xd96h\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x93\x86\x8d\xdb*yM\x02\xeb\xda/\xa4\x80|v\xe3`\x98X\u0709m\xee\x15\xfc|$\xa7\x80\x00\xe0\x94\x93\x9cC\x13\xd2(\x0e\xdf^\a\x1b\xce\xd8F\x06?\n\x97]T\x8a\x19i6\x89t\xc0[\x00\x00\x00\xe0\x94\x93\xa6\xb3\xabB0\x10\xf9\x81\xa7H\x9dJ\xad%\xe2b\\WA\x8a\x04F\x80\xfej\x1e\xdeN\x80\x00\u07d4\x93\xaa\x8f\x92\xeb\xff\xf9\x91\xfc\x05^\x90ne\x1a\xc7h\xd3+\u02092\xf5\x1e\u06ea\xa30\x00\x00\u07d4\x93\xb4\xbf?\xdf\xf6\xde?NV\xbamw\x99\xdcK\x93\xa6T\x8f\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4\x93\xbc}\x9aJ\xbdD\u023b\xb8\xfe\x8b\xa8\x04\xc6\x1a\xd8\xd6Wl\x89\xd8\xd6\x11\x9a\x81F\x05\x00\x00\u07d4\x93\xc2\xe6N]\xe5X\x9e\xd2P\x06\xe8C\x19n\xe9\xb1\xcf\v>\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94\x93\u020e-\x88b\x1e0\xf5\x8a\x95\x86\xbe\xd4\t\x89\x99\xebg\u074a\x06\x9bZ\xfa\xc7P\xbb\x80\x00\x00\u07d4\x93\xe0\xf3~\xcd\xfb\x00\x86\xe3\xe8b\xa9p4D{\x1eM\xec\x1a\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\xe0\x94\x93\xe3\x03A\x1a\xfa\xf6\xc1\a\xa4A\x01\u026c[6\xe9\xd6S\x8b\x8a\r\xf9\xdd\xfe\xcd\x03e@\x00\x00\u07d4\x93\xf1\x8c\xd2R`@v\x14\x88\xc5\x13\x17M\x1eycv\x8b,\x89\x82\xff\xac\x9a\u0553r\x00\x00\u07d4\x94\x0fqQ@P\x9f\xfa\xbf\x97EF\xfa\xb3\x90\"\xa4\x19R\u0489K\xe4\xe7&{j\xe0\x00\x00\u07d4\x94,k\x8c\x95[\xc0\u0608\x12g\x8a#g%\xb3'9\xd9G\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\x94=7\x86JJS}5\xc8\u0657#\xcdd\x06\xce%b\xe6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x94C\x9c\xa9\xcc\x16\x9ay\u0520\x9c\xae^gvJo\x87\x1a!\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94\x94D\x9c\x01\xb3*\u007f\xa5Z\xf8\x10OB\xcd\xd8D\xaa\x8c\xbc@\x8a\x03\x81\x11\xa1\xf4\xf0<\x10\x00\x00\xe0\x94\x94E\xba\\0\xe9\x89a\xb8`$a\xd08]@\xfb\xd8\x03\x11\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x94O\a\xb9o\x90\xc5\xf0\xd7\xc0\u0140S1I\xf3\xf5\x85\xa0x\x89\x04\x02\xf4\xcf\xeeb\xe8\x00\x00\u07d4\x94T\xb3\xa8\xbf\xf9p\x9f\xd0\u1407~l\xb6\u0219t\xdb\u0589\x90\xf54`\x8ar\x88\x00\x00\u07d4\x94]\x96\xeaW>\x8d\xf7&+\xbf\xa5r\"\x9bK\x16\x01k\x0f\x89\vX\x9e\xf9\x14\xc1B\x00\x00\u07d4\x94^\x18v\x9d~\xe7'\xc7\x01?\x92\xde$\xd1\x17\x96\u007f\xf3\x17\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x94a'\x81\x03;W\xb1F\xeet\xe7S\xc6r\x01\u007fS\x85\xe4\x89\xc3(\t>a\xee@\x00\x00\xe0\x94\x94dJ\xd1\x16\xa4\x1c\xe2\xca\u007f\xbe\xc6\t\xbd\xefs\x8a*\xc7\u01ca\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x94p\xcc6YE\x86\x82\x18!\xc5\u0256\xb6\xed\xc8;mZ2\x89\x01M\x11 \u05f1`\x00\x00\xe0\x94\x94u\xc5\x10\xec\x9a&\x97\x92GtL=\x8c;\x0e\v_D\u04ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x94~\x11\xe5\xea)\ro\u00f3\x80H\x97\x9e\f\xd4N\xc7\xc1\u007f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x94\x83\u064f\x14\xa3?\xdc\x11\x8d@9U\u00995\xed\xfc_p\x89\x18\xea;4\xefQ\x88\x00\x00\u07d4\x94\x911\xf2\x89C\x92\\\xfc\x97\xd4\x1e\f\xea\v&)s\xa70\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\x94\x9f\x84\xf0\xb1\xd7\u0127\xcfI\xee\u007f\x8b,J\x13M\xe3(x\x89%\"H\u07b6\xe6\x94\x00\x00\u07d4\x94\x9f\x8c\x10{\xc7\xf0\xac\xea\xa0\xf1pR\xaa\xdb\xd2\xf9s+.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x94\xa7\u0368\xf4\x81\xf9\u061dB\xc3\x03\xae\x162\xb3\xb7\t\xdb\x1d\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x94\xa9\xa7\x16\x911| d'\x1bQ\xc95?\xbd\xed5\x01\xa8\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\x94\xadK\xad\x82K\xd0\ub7a4\x9cX\u03bc\xc0\xff^\b4k\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\x94\xbb\xc6}\x13\xf8\x9e\xbc\xa5\x94\xbe\x94\xbcQp\x92\f0\xd9\xf3\x89\x04X\xff\xa3\x15\nT\x00\x00\u07d4\x94\xbe:\xe5Ob\xd6c\xb0\xd4\u031e\x1e\xa8\xfe\x95V\ua7bf\x89\x01C\x13,\xa8C\x18\x00\x00\xe0\x94\x94\xc0U\xe8X5z\xaa0\xcf A\xfa\x90Y\xce\x16J\x1f\x91\x8a\x04<%\xe0\xdc\xc1\xbd\x1c\x00\x00\xe0\x94\x94\xc7B\xfdz\x8by\x06\xb3\xbf\xe4\xf8\x90O\xc0\xbe\\v\x803\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x94\xcaV\xdew\u007f\xd4S\x17\u007f^\x06\x94\xc4x\xe6j\xff\x8a\x84\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x94\xd8\x10t\xdbZ\xe1\x97\u04bb\x13s\xab\x80\xa8}\x12\x1cK\u04ca\x01\xfd\x934\x94\xaa_\xe0\x00\x00\u07d4\x94\u06c0xs\x86\n\xac=Z\xea\x1e\x88^R\xbf\xf2\x86\x99T\x89\xae\x8ez\v\xb5u\xd0\x00\x00\u07d4\x94\xe1\xf5\u02db\x8a\xba\xce\x03\xa1\xa6B\x82VU;i\f#U\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x94\xef\x8b\xe4Pw\xc7\xd4\xc5e'@\u0794jbbOq?\x89\x05l\xf5Y:\x18\xf8\x80\x00\u07d4\x94\xf1?\x9f\b6\xa3\xee$7\xa8I\"\u0498M\xc0\xf7\xd5;\x89\xa2\xa02\x9b\u00ca\xbe\x00\x00\u07d4\x94\xf8\xf0W\xdb~`\xe6u\xad\x94\x0f\x15X\x85\u0464w4\x8e\x89\x15\xbeat\xe1\x91.\x00\x00\xe0\x94\x94\xfc\u03ad\xfe\\\x10\x9c^\xae\xafF-C\x871B\u020e\"\x8a\x01\x045a\xa8\x82\x93\x00\x00\x00\u07d4\x95\x03N\x16!\x86Q7\xcdG9\xb3F\xdc\x17\xda:'\xc3N\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\x95\fh\xa4\t\x88\x15M#\x93\xff\xf8\xda|\u0369\x96\x14\xf7,\x89\xf9AF\xfd\x8d\xcd\xe5\x80\x00\xe0\x94\x95\x0f\xe9\xc6\xca\xd5\f\x18\xf1\x1a\x9e\xd9\xc4W@\xa6\x18\x06\x12\u040a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x95!\x83\xcf\u04ce5.W\x9d6\xde\xce\u0171\x84P\xf7\xfb\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x95'\x8b\b\xde\xe7\xc0\xf2\xc8\xc0\xf7\"\xf9\xfc\xbb\xb9\xa5$\x1f\u0689\x82\x93\t\xf6O\r\xb0\x00\x00\u07d4\x95,W\xd2\xfb\x19Q\a\xd4\xcd\\\xa3\x00wA\x19\u07ed/x\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x955r\xf0\xeam\xf9\xb1\x97\xca\xe4\x0eK\x8e\xcc\x05lCq\u014965\u026d\xc5\u07a0\x00\x00\u07d4\x95>\xf6R\xe7\xb7i\xf5=nxjX\x95/\xa9>\xe6\xab\u725b\ny\x1f\x12\x110\x00\x00\u07d4\x95DpF1;/:^\x19\xb9H\xfd;\x8b\xed\xc8,q|\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x95]\xb3\xb7C`\xb9\xa2hg~s\u03a8!f\x8a\xf6\xfa\u038a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4\x95`\xe8\xacg\x18\xa6\xa1\xcd\xcf\xf1\x89\xd6\x03\xc9\x06>A=\xa6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x95g\xa0\u0781\x1d\xe6\xff\t[~\xe6N\u007f\x1b\x83\xc2a[\x80\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\x95h\x1c\xda\xe6\x9b I\xce\x10\x1e2\\u\x98\x92\xca\xc3\xf8\x11\x89\x9a\xe9*\x9b\xc9L@\x00\x00\xe0\x94\x95h\xb7\xdeuV(\xaf5\x9a\x84T=\xe25\x04\xe1^A\xe6\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x95i\xc6:\x92\x84\xa8\x05bm\xb3\xa3.\x9d#c\x93GaQ\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x95\x80\x9e\x8d\xa3\xfb\xe4\xb7\xf2\x81\xf0\xb8\xb1q_B\x0f}}c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x95\x9fW\xfd\xedj\xe3y\x13\xd9\x00\xb8\x1e_H\xa7\x93\"\xc6'\x89\r\xdb&\x10GI\x11\x80\x00\u07d4\x95\x9f\xf1\u007f\x1dQ\xb4s\xb4@\x10\x05'U\xa7\xfa\x8cu\xbdT\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x95\xa5w\xdc.\xb3\xael\xb9\xdf\xc7z\xf6\x97\xd7\xef\xdf\xe8\x9a\x01\x89\a_a\x0fp\xed \x00\x00\u07d4\x95\xcbm\x8acy\xf9J\xba\x8b\x88ViV,MD\x8eV\xa7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x95\xd5PB{ZQLu\x1ds\xa0\xf6\u049f\xb6]\"\xed\x10\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x95\u064d\f\x10i\x90\x8f\x06zR\xac\xac+\x8bSM\xa3z\xfd\x89oY\xb60\xa9)p\x80\x00\xe0\x94\x95\xdfN4E\xd7f&$\u010e\xbat\u03de\nS\xe9\xf72\x8a\v\xdb\xc4\x1e\x03H\xb3\x00\x00\x00\u07d4\x95\xe6\xa5K-_g\xa2JHu\xafu\x10|\xa7\xea\x9f\xd2\xfa\x89Hz\x9a0E9D\x00\x00\xe0\x94\x95\xe6\xf9=\xac\"\x8b\xc7XZ%sZ\xc2\xd0v\xcc:@\x17\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x95\xe7ad$\xcd\ta\xa7\x17'$t7\xf0\x06\x92r(\x0e\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x95\xe8\n\x82\xc2\f\xbe= `$,\xb9-sX\x10\xd04\xa2\x89\x01\xc3.F?\u0539\x80\x00\u07d4\x95\xf6-\x02C\xed\xe6\x1d\xad\x9a1e\xf59\x05'\rT\xe2B\x89WG=\x05\u06ba\xe8\x00\x00\u07d4\x95\xfbZ\xfb\x14\xc1\uf6b7\xd1y\xc5\xc3\x00P?\xd6j^\xe2\x89\x01\xda\xf7\xa0+\r\xbe\x80\x00\u07d4\x96\x10Y\"\x02\u0082\xab\x9b\u0628\x84Q\x8b>\v\xd4u\x817\x89\x0e\x87?D\x13<\xb0\x00\x00\xe0\x94\x96\x1cY\xad\xc7E\x05\u0446M\x1e\xcf\u02ca\xfa\x04\x12Y<\x93\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\x96,\r\xec\x8a=FK\xf3\x9b\x12\x15\xea\xfd&H\n\xe4\x90\u0349l\x82\xe3\xea\xa5\x13\xe8\x00\x00\u07d4\x96,\xd2*\x8e\xdf\x1eONU\xb4\xb1]\xdb\xfb]\x9dT\x19q\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x963K\xfe\x04\xff\xfaY\x02\x13\xea\xb3e\x14\xf38\xb8d\xb76\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x967\xdc\x12r=\x9cxX\x85B\uac02fO?\x03\x8d\x9d\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x96N\xabK'kL\u0618>\x15\xcar\xb1\x06\x90\x0f\xe4\x1f\u0389\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x96b\xee\x02\x19&h+1\xc5\xf2\x00\xceEz\xbe\xa7ll\xe9\x89$Y\x0e\x85\x89\xebj\x00\x00\xe0\x94\x96l\x04x\x1c\xb5\xe6}\xde25\xd7\xf8b\x0e\x1a\xb6c\xa9\xa5\x8a\x10\r P\xdacQ`\x00\x00\u07d4\x96pv\xa8w\xb1\x8e\xc1ZA[\xb1\x16\xf0n\xf3&E\u06e3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x96{\xfa\xf7bC\u0379@\t\xae<\x8d5\x05\xe9\xc0\x80EK\xe0\xe8\x19\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x96\x92A\x91\xb7\xdfe[3\x19\xdcma7\xf4\x81\xa7:\x0f\xf3\x89\xd9\xec\xb4\xfd \x8eP\x00\x00\u07d4\x96\x96\x05!83\x8cr/\x11@\x81\\\xf7t\x9d\r;:t\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x96\xa5_\x00\xdf\xf4\x05\xdcM\xe5\xe5\x8cW\xf6\xf6\xf0\xca\xc5]/\x89jf\x167\x9c\x87\xb5\x80\x00\u07d4\x96\xaaW?\xed/#4\x10\u06eeQ\x80\x14[#\xc3\x1a\x02\xf0\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\x96\xadW\x9b\xbf\xa8\u06ce\xbe\xc9\u0486\xa7.Fa\xee\xd8\xe3V\x89:\v\xa4+\xeca\x83\x00\x00\u07d4\x96\xb44\xfe\x06W\xe4*\u0302\x12\xb6\x86Q9\xde\xde\x15\x97\x9c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x96\xb9\x06\xear\x9fFU\xaf\xe3\xe5}5'|\x96}\xfa\x15w\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x96\xd6-\xfdF\b\u007fb@\x9d\x93\xdd`a\x88\xe7\x0e8\x12W\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x96\xd9\u0328\xf5^\xea\x00@\xecn\xb3H\xa1wK\x95\xd9>\xf4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x96\xe7\xc0\xc9\u057f\x10\x82\x1b\xf1@\xc5X\xa1E\xb7\xca\xc2\x13\x97\x899>\xf1\xa5\x12|\x80\x00\x00\u07d4\x96\xeaj\u021a+\xac\x954{Q\u06e6=\x8b\xd5\xeb\xde\xdc\xe1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x96\xea\xfb\xf2\xfboM\xb9\xa46\xa7LE\xb5eDR\xe28\x19\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x96\xebR>\x83/P\n\x01}\xe1>\xc2\u007f]6lV\x0e\xff\x89\x10\xac\u03baC\xee(\x00\x00\u07d4\x96\xf0F*\xe6\xf8\xb9`\x88\xf7\xe9\u018ct\xb9\u062d4\xb3G\x89a\t=|,m8\x00\x00\u07d4\x96\xf8 P\vp\xf4\xa3\xe3#\x9da\x9c\xff\x8f\" u\xb15\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x96\xfeY\xc3\u06f3\xaa|\xc8\xcbbH\fe\xe5nb\x04\xa7\xe2\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x96\xffoP\x99h\xf3l\xb4,\xbaH\xdb2\xf2\x1fVv\xab\xf8\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x97\t8R*\xfb^\x8f\x99Hs\xc9\xfb\xdc&\xe3\xb3~1L\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x97\n\xbdS\xa5O\xcaJd) |\x18-MW\xbb9\u0520\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x97\r\x8b\x8a\x00\x16\xd1C\x05O\x14\x9f\xb3\xb8\xe5P\xdc\a\x97\u01c965\u026d\xc5\u07a0\x00\x00\u07d4\x97,/\x96\xaa\x00\u03ca/ Z\xbc\xf8\x93|\fu\xf5\xd8\u0649\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x97?N6\x1f\xe5\xde\u0358\x9dL\x8f}|\xc9y\x908]\xaf\x89\x15\x0f\x85C\xa3\x87B\x00\x00\u07d4\x97M\x05A\xabJG\xec\u007fu6\x9c\x00i\xb6J\x1b\x81w\x10\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u0794\x97M/\x17\x89_)\x02\x04\x9d\xea\xae\xcf\t\xc3\x04e\a@-\x88\xcc\x19\u00947\xab\x80\x00\u07d4\x97R\xd1O^\x10\x93\xf0qq\x1c\x1a\xdb\xc4\xe3\xeb\x1e\\W\xf3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x97V\xe1v\xc9\xefi>\xe1\xee\u01b9\xf8\xb1Q\xd3\x13\xbe\xb0\x99\x89A\rXj \xa4\xc0\x00\x00\u07d4\x97_7d\xe9{\xbc\xcfv|\xbd;y[\xa8m\x8b\xa9\x84\x0e\x89\x12\xc1\xb6\xee\xd0=(\x00\x00\xe0\x94\x97j\x18Sj\xf4\x18tBc\b\x87\x1b\xcd\x15\x12\xa7u\xc9\xf8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x97n<\xea\xf3\xf1\xafQ\xf8\u009a\xff]\u007f\xa2\x1f\x03\x86\xd8\xee\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94\x97w\xcca\xcfuk\xe3\xb3\xc2\f\xd4I\x1ci\xd2u\xe7\xa1 \x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x97\x81\v\xaf\xc3~\x840c2\xaa\xcb5\xe9*\xd9\x11\xd2=$\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x97\x8cC\f\xe45\x9b\x06\xbc,\xdf\\)\x85\xfc\x95\x0eP\xd5\u0209\x1a\x05V\x90\xd9\u06c0\x00\x00\u07d4\x97\x95\xf6C\x19\xfc\x17\xdd\x0f\x82a\xf9\xd2\x06\xfbf\xb6L\xd0\u0249\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x97\x99\xca!\xdb\xcfi\xbf\xa1\xb3\xf7+\xacQ\xb9\xe3\xcaX|\xf9\x89\\(=A\x03\x94\x10\x00\x00\u07d4\x97\x9c\xbf!\xdf\xec\x8a\xce?\x1c\x19m\x82\u07d6%4\xdf9O\x89\x99\x91\xd4x\xddM\x16\x00\x00\u07d4\x97\x9dh\x1ca}\xa1o!\xbc\xac\xa1\x01\xed\x16\xed\x01Z\xb6\x96\x89e\xea=\xb7UF`\x00\x00\u07d4\x97\x9f0\x15\x8bWK\x99\x9a\xab4\x81\a\xb9\xee\xd8[\x1f\xf8\xc1\x894\x95tD\xb8@\xe8\x00\x00\u07d4\x97\xa8o\x01\xce?|\xfdDA3\x0e\x1c\x9b\x19\xe1\xb1\x06\x06\xef\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x97\xb9\x1e\xfesP\xc2\xd5~~@k\xab\x18\xf3a{\xcd\xe1J\x8a\x02\x1e\x19\x99\xbb\xd5\u04be\x00\x00\u07d4\x97\xd0\xd9r^;p\xe6u\x841s\x93\x8e\xd3q\xb6,\u007f\xac\x89\t79SM(h\x00\x00\u07d4\x97\xd9\xe4jv\x04\u05f5\xa4\xeaN\xe6\x1aB\xb3\xd25\x0f\xc3\xed\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x97\xdc&\xecg\n1\xe0\"\x1d*u\xbc]\xc9\xf9\f\x1fo\u0509\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\x97\xde!\xe4!\xc3\u007f\xe4\xb8\x02_\x9aQ\xb7\xb3\x90\xb5\xdfx\x04\x8a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4\x97\xe2\x89s\xb8`\xc5g@(\x00\xfb\xb6<\xe3\x9a\x04\x8a=y\x89\x05B%:\x12l\xe4\x00\x00\u07d4\x97\xe5\xcca'\xc4\xf8\x85\xbe\x02\xf4KB\xd1\u0230\xac\x91\u44c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x97\xf1\xfeL\x80\x83\xe5\x96!*\x18w(\xdd\\\xf8\n1\xbe\u0149\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\x97\xf7v\x06W\xc1\xe2\x02u\x90\x86\x96>\xb4!\x1c_\x819\xb9\x8a\n\x8a\t\u007f\xcb=\x17h\x00\x00\xe0\x94\x97\xf9\x9bk\xa3\x13F\u0358\xa9\xfeL0\x8f\x87\u0165\x8cQQ\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x98\n\x84\xb6\x86\xfc1\xbd\xc8<\"\x10XTjq\xb1\x1f\x83\x8a\x89*AUH\xaf\x86\x81\x80\x00\u07d4\x98\x10\xe3J\x94\xdbn\xd1V\xd08\x9a\x0e+\x80\xf4\xfdk\n\x8a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x98\x1d\xdf\x04\x04\xe4\xd2-\xdaUj\a&\xf0\v-\x98\xab\x95i\x8965f3\xeb\xd8\xea\x00\x00\xe0\x94\x98\x1fq'u\xc0\xda\xd9u\x18\xff\xed\xcbG\xb9\xad\x1dl'b\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\x984h!\x80\xb9\x82\xd1f\xba\u06dd\x9d\x1d\x9b\xbf\x01m\x87\xee\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x986\xb4\xd3\x04sd\x1a\xb5j\xee\xe1\x92Bv\x1drrQx\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x989sB\xec_=L\xb8w\xe5N\xf5\xd6\xf1\xd3fs\x1b\u050a\x01@a\xb9\xd7z^\x98\x00\x00\xe0\x94\x98Fd\x886\xa3\a\xa0W\x18O\xd5\x1fb\x8a_\x8c\x12B|\x8a\x04\vi\xbfC\xdc\xe8\xf0\x00\x00\xe0\x94\x98Jy\x85\xe3\xcc~\xb5\xc96\x91\xf6\xf8\xcc{\x8f$]\x01\xb2\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x98]p\xd2\a\x89+\xed9\x85\x90\x02N$!\xb1\xcc\x11\x93Y\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x98m\xf4~v\xe4\u05e7\x89\xcd\xee\x91<\u0243\x16P\x93l\x9d\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\x98t\x80?\xe1\xf3\xa06^y\"\xb1Bp\xea\xeb\x03,\xc1\xb5\x89<\xf5\x92\x88$\xc6\xc2\x00\x00\u07d4\x98ub4\x95\xa4l\xdb\xf2YS\x0f\xf88\xa1y\x9e\u00c9\x91\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x98v\x18\xc8VV |{\xac\x15\a\xc0\xff\xef\xa2\xfbd\xb0\x92\x89\x03}\xfeC1\x89\xe3\x80\x00\u07d4\x98|\x9b\xcdn?9\x90\xa5+\xe3\xed\xa4q\f'Q\x8fOr\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x98\x82\x96|\xeeh\u04a89\xfa\u062bJ|=\xdd\xf6\xc0\xad\u0209Hx\xbe\x1f\xfa\xf9]\x00\x00\u07d4\x98\x85\\}\xfb\xee3SD\x90J\x12\xc4\fs\x17\x95\xb1:T\x899\xfb\xae\x8d\x04-\xd0\x00\x00\u07d4\x98\x9c\f\xcf\xf6T\xda\x03\xae\xb1\x1a\xf7\x01\x05Ea\xd6)~\x1d\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x98\xa0\xe5Lm\x9d\u023e\x96'l\xeb\xf4\xfe\xc4`\xf6#]\x85\x89j\u0202\x10\tR\u01c0\x00\u07d4\x98\xb7i\xcc0\\\xec\xfbb\x9a\x00\xc9\a\x06\x9d~\xf9\xbc:\x12\x89\x01h\u048e?\x00(\x00\x00\xe0\x94\x98\xbaN\x9c\xa7/\xdd\xc2\fi\xb49ov\xf8\x18?z*N\x8a\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\x00\u07d4\x98\xbeimQ\xe3\x90\xff\x1cP\x1b\x8a\x0fc1\xb6(\xdd\u016d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x98\xbe\u04e7.\xcc\xfb\xaf\xb9#H\x92\x93\xe4)\xe7\x03\xc7\xe2[\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x98\xbfJ\xf3\x81\v\x84#\x87\xdbp\xc1MF\t\x96&\x00=\x10\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x98\xc1\x0e\xbf,O\x97\u02e5\xa1\xab?*\xaf\xe1\xca\xc4#\xf8\u02c9\x10CV\x1a\x88)0\x00\x00\u07d4\x98\xc1\x9d\xba\x81\v\xa6\x11\xe6\x8f/\x83\xee\x16\xf6\xe7tO\f\x1f\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x98\xc5IJ\x03\xac\x91\xa7h\xdf\xfc\x0e\xa1\xdd\u0b3f\x88\x90\x19\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\x98\xd2\x04\xf9\b_\x8c\x8e}\xe2>X\x9bd\xc6\xef\xf6\x92\xccc\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x98\xd3s\x19\x92\xd1\xd4\x0e\x12\x11\xc7\xf75\xf2\x18\x9a\xfa\a\x02\xe0\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x98\xe2\xb6\xd6\x06\xfd-i\x91\xc9\xd6\xd4\a\u007f\xdf?\xddE\x85\u06890\xdf\x1ao\x8a\xd6(\x00\x00\u07d4\x98\xe3\xe9\v(\xfc\xca\ue087y\xb8\xd4\nUh\xc4\x11n!\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\x98\xe6\xf5G\u06c8\xe7_\x1f\x9c\x8a\xc2\xc5\xcf\x16'\xbaX\v>\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x98\xf4\xaf:\xf0\xae\xde_\xaf\xdcB\xa0\x81\xec\xc1\xf8\x9e<\xcf \x8a\x01\xfd\x934\x94\xaa_\xe0\x00\x00\u07d4\x98\xf6\xb8\xe6!=\xbc\x9aU\x81\xf4\xcc\xe6e_\x95%+\xdb\a\x89\x11Xr\xb0\xbc\xa40\x00\x00\u07d4\x99\te\r\u05719{\x8b\x8b\x0e\xb6\x94\x99\xb2\x91\xb0\xad\x12\x13\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x99\x11s`\x19G\xc2\bJb\xd69R~\x96\x15\x12W\x9a\xf9\x89 \x86\xac5\x10R`\x00\x00\u07d4\x99\x12\x9d[<\f\xdeG\xea\r\xefM\xfc\a\r\x1fJY\x95'\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x99\x17\u058dJ\xf3A\xd6Q\xe7\xf0\a\\m\xe6\xd7\x14Nt\t\x8a\x012\xd4Gl\b\xe6\xf0\x00\x00\u07d4\x99\x1a\xc7\xcap\x97\x11_& ^\xee\x0e\xf7\xd4\x1e\xb4\xe3\x11\xae\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794\x99#e\xd7d\xc5\xce5@9\xdd\xfc\x91.\x02:u\xb8\xe1h\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x99&F\xac\x1a\u02ab\xf5\u076b\xa8\xf9B\x9a\xa6\xa9Nt\x96\xa7\x8967Pz0\xab\xeb\x00\x00\u07d4\x99&\x83'\xc3s3.\x06\xc3\xf6\x16B\x87\xd4U\xb9\xd5\xfaK\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99(\xffqZ\xfc:+`\xf8\xebL\u013aN\xe8\u06b6\u5749\x17\xda:\x04\u01f3\xe0\x00\x00\u07d4\x992\xef\x1c\x85\xb7Z\x9b*\x80\x05}P\x874\xc5\x10\x85\xbe\u0309\x02\xb8?\xa50\x1dY\x00\x00\xe0\x94\x99?\x14ax`^f\xd5\x17\xbex.\xf0\xb3\xc6\x1aN\x19%\x8a\x01|\x1f\x055\u05e5\x83\x00\x00\xe0\x94\x99A7\x04\xb1\xa3.p\xf3\xbc\ri\u0748\x1c8VkT\u02ca\x05\xcckiF1\xf7\x12\x00\x00\u07d4\x99AR\xfc\x95\xd5\xc1\u028b\x88\x11:\xbb\xadMq\x0e@\xde\xf6\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x99D\xfe\xe9\xd3JJ\x88\x00#\u01c92\xc0\vY\xd5\xc8*\x82\x89(\xa8\xa5k6\x90\a\x00\x00\u07d4\x99L\u00b5\"~\xc3\xcf\x04\x85\x12F|A\xb7\xb7\xb7H\x90\x9f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99q\xdf`\xf0\xaef\xdc\xe9\xe8\xc8N\x17\x14\x9f\t\xf9\xc5/d\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x99v\x94~\xff_j\xe5\xda\b\xddT\x11\x92\xf3x\xb4(\xff\x94\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x99}e\x92\xa3\x15\x89\xac\xc3\x1b\x99\x01\xfb\xeb<\xc3\xd6[2\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99\x82\xa5\x89\x0f\xfbT\x06\u04ec\xa8\u04bf\xc1\xddp\xaa\xa8\n\xe0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99\x87\x8f\x9dn\n~\u066e\u01c2\x97\xb78y\xa8\x01\x95\xaf\xe0\x89\xd7\xc1\x98q\x0ef\xb0\x00\x00\u07d4\x99\x8c\x1f\x93\xbc\xdbo\xf2<\x10\xd0\u0712G(\xb7;\xe2\xff\x9f\x896[\xf3\xa43\xea\xf3\x00\x00\u07d4\x99\x91aL[\xaaG\xddl\x96\x87FE\xf9z\xdd,=\x83\x80\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x99\x92J\x98\x16\xbb}\xdf?\xec\x18D\x82\x8e\x9a\xd7\xd0k\xf4\xe6\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\x99\x99vh\xf7\xc1\xa4\xff\x9e1\xf9\x97z\xe3\"K\u02c8z\x85\x89\x0f\xc969(\x01\xc0\x00\x00\u07d4\x99\x9cI\xc1t\xca\x13\xbc\x83l\x1e\n\x92\xbf\xf4\x8b'\x15C\u0289\xb1\xcf$\xdd\u0431@\x00\x00\u07d4\x99\xa4\xde\x19\xde\u05d0\b\xcf\xdc\xd4]\x01M.XK\x89\x14\xa8\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\x99\xa9k\xf2$.\xa1\xb3\x9e\xceo\xcc\r\x18\xae\xd0\f\x01y\xf3\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x99\xb0\x18\x93+\xca\xd3U\xb6y+%]\xb6p-\xec\x8c\xe5\u0749\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\x99\xb7C\xd1\xd9\xef\xf9\r\x9a\x194\xb4\xdb!\xd5\x19\u061bJ8\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x99\xb8\xc8$\x86\x9d\xe9\xed$\xf3\xbf\xf6\x85L\xb6\xddE\xcc?\x9f\x89e\xea=\xb7UF`\x00\x00\u07d4\x99\xc0\x17L\xf8N\a\x83\xc2 \xb4\xebj\xe1\x8f\xe7\x03\x85J\u04c9py\xa2W=\fx\x00\x00\u07d4\x99\xc1\xd9\xf4\fj\xb7\xf8\xa9/\xce/\xdc\xe4zT\xa5\x86\xc5?\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x99\xc26\x14\x1d\xae\xc87\xec\xe0O\xda\xee\x1d\x90\u03cb\xbd\xc1\x04\x89ve\x16\xac\xac\r \x00\x00\u07d4\x99\xc3\x1f\xe7HX7\x87\xcd\xd3\xe5%\xb2\x81\xb2\x18\x96\x179\xe3\x897\b\xba\xed=h\x90\x00\x00\u07d4\x99\xc4u\xbf\x02\xe8\xb9!J\xda_\xad\x02\xfd\xfd\x15\xba6\\\f\x89 \t\xc5\u023fo\xdc\x00\x00\u07d4\x99\u0203%\x85F\xcc~N\x97\x1fR.8\x99\x18\xda^\xa6:\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x99\xc9\xf9>E\xfe<\x14\x18\xc3S\xe4\u016c8\x94\xee\xf8\x12\x1e\x89\x05\x85\xba\xf1E\x05\v\x00\x00\xe0\x94\x99\xd1W\x9c\xd4&\x82\xb7dN\x1dOq(D\x1e\xef\xfe3\x9d\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\x99\u0475\x85\x96_@jB\xa4\x9a\x1c\xa7\x0fv\x9evZ?\x98\x8a\x03\x89O\x0eo\x9b\x9fp\x00\x00\u07d4\x99\xdf\xd0PL\x06\xc7C\xe4e4\xfd{U\xf1\xf9\xc7\xec3)\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99\xf4\x14|\xcck\u02c0\u0304.i\xf6\xd0\x0e0\xfaA3\u0649\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\x99\xf7\u007f\x99\x8b \xe0\xbc\xdc\xd9\xfc\x83\x86ARl\xf2Y\x18\xef\x89a\t=|,m8\x00\x00\u07d4\x99\xfa\xd5\x008\xd0\xd9\xd4\xc3\xfb\xb4\xbc\xe0V\x06\xec\xad\xcdQ!\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x99\xfe\r \x12(\xa7S\x14VU\xd4(\xeb\x9f\xd9I\x85\xd3m\x89i \xbf\xf3QZ:\x00\x00\u07d4\x9a\a\x9c\x92\xa6)\xca\x15\xc8\xca\xfa.\xb2\x8d[\xc1z\xf8(\x11\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x9a\r<\xee=\x98\x92\xea;7\x00\xa2\u007f\xf8A@\xd9\x02T\x93\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\x9a$\u038dH\\\xc4\xc8nI\u07b3\x90\"\xf9,t0\xe6~\x89Fy\x1f\xc8N\a\xd0\x00\x00\u07d4\x9a,\xe4;]\x89\u0593k\x8e\x8c5G\x91\xb8\xaf\xff\x96$%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9a9\x01bS^9\x88w\xe4\x16x}b9\xe0uN\x93|\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9a=\xa6P#\xa10 \xd2!E\xcf\xc1\x8b\xab\x10\xbd\x19\xceN\x89\x18\xbfn\xa3FJ:\x00\x00\xe0\x94\x9a>+\x1b\xf3F\xdd\a\v\x02sW\xfe\xacD\xa4\xb2\xc9}\xb8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9aL\xa8\xb8!\x17\x89NC\xdbr\xb9\xfax\xf0\xb9\xb9:\xce\t\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\x9aR.R\xc1\x95\xbf\xb7\xcf_\xfa\xae\u06d1\xa3\xbath\x16\x1d\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9aZ\xf3\x1c~\x063\x9a\u0234b\x8d|M\xb0\xce\x0fE\u0224\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u0794\x9ac?\xcd\x11,\xce\xebv_\xe0A\x81ps*\x97\x05\u7708\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x9ac\u0445\xa7\x91)\xfd\xab\x19\xb5\x8b\xb61\xea6\xa4 TN\x89\x02F\xdd\xf9yvh\x00\x00\u07d4\x9ag\b\u0778\x90<(\x9f\x83\xfe\x88\x9c\x1e\xdc\xd6\x1f\x85D#\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9ao\xf5\xf6\xa7\xaf{z\xe0\xed\x9c \xec\xecP#\u0481\xb7\x86\x89\x8a\x12\xb9\xbdjg\xec\x00\x00\xe0\x94\x9a\x82\x82m<)H\x1d\xcc+\u0495\x00G\xe8\xb6\x04\x86\xc38\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x9a\x8e\xcaA\x89\xffJ\xa8\xff~\u0536\xb7\x03\x9f\t\x02!\x9b\x15\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9a\x95;[\xccp\x93y\xfc\xb5Y\u05f9\x16\xaf\u06a5\f\xad\u0309\x05k\xc7^-c\x10\x00\x00\u07d4\x9a\x99\v\x8a\xebX\x8d~\xe7\xec.\xd8\xc2\xe6Os\x82\xa9\xfe\xe2\x89\x01\xd1'\xdbi\xfd\x8b\x00\x00\u07d4\x9a\x9d\x1d\xc0\xba\xa7}n \xc3\xd8I\u01c8b\xdd\x1c\x05L\x87\x89/\xb4t\t\x8fg\xc0\x00\x00\xe0\x94\x9a\xa4\x8cf\xe4\xfbJ\u0419\x93N2\x02.\x82t'\xf2w\xba\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9a\xa80\x8fB\x91\x0eZ\xde\t\xc1\xa5\xe2\x82\xd6\xd9\x17\x10\xbd\xbf\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9a\xaa\xfa\x00gd~\u0659\x06kzL\xa5\xb4\xb3\xf3\xfe\xaao\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9a\xb9\x88\xb5\x05\xcf\xee\x1d\xbe\x9c\u044e\x9bTs\xb9\xa2\xd4\xf56\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4\x9a\xb9\x8dm\xbb\x1e\xaa\xe1mE\xa0EhT\x1a\xd3\xd8\xfe\x06\u0309\x0e\xc5\x04d\xfe#\xf3\x80\x00\xe0\x94\x9a\xba+^'\xffx\xba\xaa\xb5\xcd\u0248\xb7\xbe\x85\\\xeb\xbd\u038a\x02\x1e\f\x00\x13\a\n\xdc\x00\x00\u07d4\x9a\xc4\xdaQ\xd2x\"\xd1\xe2\b\xc9n\xa6J\x1e[U)\x97#\x89\x05lUy\xf7\"\x14\x00\x00\u0794\x9a\xc8S\x97y*i\u05cf(k\x86C*\a\xae\u03b6\x0ed\x88\xc6s\xce<@\x16\x00\x00\xe0\x94\x9a\xc9\a\xee\x85\xe6\xf3\xe2#E\x99\x92\xe2V\xa4?\xa0\x8f\xa8\xb2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9a\xd4\u007f\xdc\xf9\u0354-(\xef\xfd[\x84\x11[1\xa6X\xa1>\x89\xb2Y\xec\x00\xd5;(\x00\x00\u07d4\x9a\xdb\u04fc{\n\xfc\x05\xd1\xd2\xed\xa4\x9f\xf8c\x93\x9cH\xdbF\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\x9a\xdfE\x8b\xff5\x99\xee\xe1\xa2c\x98\x85\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\x9a\xf9\xdb\xe4t\"\xd1w\xf9E\xbd\xea\xd7\xe6\xd8)05b0\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x9a\xfaSkLf\xbc8\xd8u\u0133\x00\x99\xd9&\x1f\xdb8\xeb\x89\v*\x8f\x84*w\xbc\x80\x00\u07d4\x9b\x06\xad\x84\x1d\xff\xbeL\xcfF\xf1\x03\x9f\u00c6\xf3\xc3!Dn\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9b\x11h\u078a\xb6KGU/3\x89\x80\n\x9c\xc0\x8bFf\u03c9]\u0212\xaa\x111\xc8\x00\x00\u07d4\x9b\x18\x11\xc3\x05\x1fF\xe6d\xaeK\xc9\xc8$\u0445\x92\xc4WJ\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\x9b\x18G\x86U\xa4\x85\x1c\xc9\x06\xe6`\xfe\xaca\xf7\xf4\u023f\xfc\x89\xe2G\x8d8\x90}\x84\x00\x00\u07d4\x9b\"\xa8\r\\{3t\xa0[D`\x81\xf9}\n4\a\x9e\u007f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x9b+\xe7\xf5gT\xf5\x05\xe3D\x1a\x10\xf7\xf0\xe2\x0f\xd3\xdd\xf8I\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\x9b2\xcfOQ\x15\xf4\xb3J\x00\xa6La}\xe0c\x875C#\x89\x05\xb8\x1e\u0608 |\x80\x00\u07d4\x9bC\u0739_\xde1\x80u\xa5g\xf1\xe6\xb5v\x17\x05^\xf9\xe8\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\x9bDO\xd37\xe5\xd7R\x93\xad\xcf\xffp\xe1\xea\x01\xdb\x022\"\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9bH$\xff\x9f\xb2\xab\xdaUM\xeeO\xb8\xcfT\x91eW\x061\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9bL'\x15x\f\xa4\xe9\x9e`\xeb\xf2\x19\xf1Y\f\x8c\xadP\n\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\x9bY\xeb!;\x1eue\xe4PG\xe0N\xa07O\x10v-\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9b\\9\xf7\xe0\xac\x16\x8c\x8e\xd0\xed4\x04w\x11}\x1bh.\xe9\x89\x05P\x05\xf0\xc6\x14H\x00\x00\u07d4\x9b^\xc1\x8e\x83\x13\x88}\xf4a\u0490.\x81\xe6z\x8f\x11;\xb1\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9bd\xd3\u034d+s\xf6hA\xb5\xc4k\xb6\x95\xb8\x8a\x9a\xb7]\x89\x01 :Ov\f\x16\x80\x00\u07d4\x9be\x8f\xb3a\xe0F\xd4\xfc\xaa\x8a\xefm\x02\xa9\x91\x11\"6%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9bfA\xb1>\x17/\xc0r\xcaK\x83'\xa3\xbc(\xa1[f\xa9\x89\x06\x81U\xa46v\xe0\x00\x00\xe0\x94\x9bh\xf6t\x16\xa6;\xf4E\x1a1\x16L\x92\xf6r\xa6\x87Y\xe9\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4\x9bw6i\xe8}v\x01\x8c\t\x0f\x82U\xe5D\t\xb9\u0728\xb2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9bw\xeb\xce\xd7\xe2\x15\xf0\x92\x0e\x8c+\x87\x00$\xf6\xec\xb2\xff1\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9b|\x88\x10\xcc|\u021e\x80Nm>8\x12\x18PG(w\xfe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9b\xa5=\xc8\xc9^\x9aG/\xeb\xa2\xc4\xe3,\x1d\xc4\xdd{\xabF\x89Hz\x9a0E9D\x00\x00\xe0\x94\x9b\xac\xd3\xd4\x0f;\x82\xac\x91\xa2d\xd9\u060d\x90\x8e\xac\x86d\xb9\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x9b\xb7`\xd5\u0089\xa3\xe1\xdb\x18\xdb\tSE\xcaA;\x9aC\u0089\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\x9b\xb7b\x04\x18j\xf2\xf6;\xe7\x91h`\x16\x87\xfc\x9b\xadf\x1f\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x9b\xb9\xb0*&\xbf\xe1\xcc\xc3\xf0\xc6!\x9e&\x1c9\u007f\xc5\xcax\x89Hz\x9a0E9D\x00\x00\u07d4\x9b\xc5s\xbc\xda#\xb8\xb2o\x90s\xd9\f#\x0e\x8eq\xe0'\v\x896/u\xa40]\f\x00\x00\u07d4\x9b\xd7\u00caB\x100JMe>\xde\xff\x1b<\xe4_\xcexC\x89\x0fI\x89A\xe6d(\x00\x00\xe0\x94\x9b\u0600h\xe10u\xf3\xa8\xca\xc4d\xa5\xf9I\xd6\xd8\x18\xc0\xf6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x9b\xd9\x05\xf1q\x9f\u01ec\xd0\x15\x9dM\xc1\xf8\xdb/!G#8\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9b\xdb\u071b\x9741\xd1<\x89\xa3\xf9u~\x9b;bu\xbf\u01c9\x1b\x1a}\u03caD\u04c0\x00\u07d4\x9b\xe3\xc3)\xb6*(\xb8\xb0\x88l\xbd\x8b\x99\xf8\xbc\x93\f\xe3\xe6\x89\x04\t\xe5+H6\x9a\x00\x00\xe0\x94\x9b\xf5\x8e\xfb\xea\a\x84\xeb\x06\x8a\xde\u03e0\xbb!P\x84\xc7:5\x8a\x01:k+VHq\xa0\x00\x00\u07d4\x9b\xf6r\xd9y\xb3fR\xfcR\x82Tzjk\xc2\x12\xaeCh\x89#\x8f\xd4,\\\xf0@\x00\x00\xe0\x94\x9b\xf7\x03\xb4\x1c6$\xe1_@T\x96#\x90\xbc\xba0R\xf0\xfd\x8a\x01H>\x01S<.<\x00\x00\u07d4\x9b\xf7\x1f\u007f\xb57\xacT\xf4\xe5\x14\x94\u007f\xa7\xffg(\xf1m/\x89\x01\u03c4\xa3\n\n\f\x00\x00\u07d4\x9b\xf9\xb3\xb2\xf2<\xf4a\xebY\x1f(4\v\xc7\x19\x93\x1c\x83d\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x9b\xfce\x9c\x9c`\x1e\xa4*k!\xb8\xf1p\x84\xec\x87\xd7\x02\x12\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9b\xff\xf5\r\xb3jxUU\xf0vR\xa1S\xb0\xc4+\x1b\x8bv\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9c\x05\xe9\xd0\xf0u\x8eyS\x03q~1\xda!<\xa1W\u618965\u026d\xc5\u07a0\x00\x00\u07d4\x9c\x1bw\x1f\t\xaf\x88*\xf0d0\x83\xde*\xa7\x9d\xc0\x97\xc4\x0e\x89\x86p\xe9\xece\x98\xc0\x00\x00\u07d4\x9c(\xa2\xc4\b`\x91\xcb]\xa2&\xa6W\xce2H\xe8\xea{o\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\x9c/\xd5@\x89\xaff]\xf5\x97\x1ds\xb8\x04a`9dsu\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9c4@\x98\xbaaZ9\x8f\x11\xd0\t\x90[\x17|D\xa7\xb6\x02\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9c=\x06\x92\xce\xee\xf8\n\xa4\x96\\\xee\xd2b\xff\xc7\xf0i\xf2\u0709\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9c@\\\xf6\x97\x95a8\x06^\x11\xc5\xf7U\x9eg$[\u0465\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x9cE *%\xf6\xad\x00\x11\xf1\x15\xa5\xa7\"\x04\xf2\xf2\x19\x88f\x8a\x01\x0f\xcf:b\xb0\x80\x98\x00\x00\xe0\x94\x9cI\xde\xffG\b_\xc0\x97\x04\u02a2\u0728\u0087\xa9\xa17\u068a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\x9cK\xbc\xd5\xf1dJo\aX$\xdd\xfe\x85\xc5q\u05ab\xf6\x9c\x89a\x94\x04\x9f0\xf7 \x00\x00\u07d4\x9cRj\x14\x06\x83\xed\xf1C\x1c\xfa\xa1(\xa95\xe2\xb6\x14\u060b\x89\x06\x04o7\xe5\x94\\\x00\x00\xe0\x94\x9cT\xe4\xedG\x9a\x85h)\u01bbB\u069f\vi*u\xf7(\x8a\x01\x97\xa8\xf6\xddU\x19\x80\x00\x00\xe0\x94\x9cX\x1a`\xb6\x10(\xd94\x16y)\xb2-p\xb3\x13\xc3O\u040a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\x9c\\\xc1\x11\t,\x12!\x16\xf1\xa8_N\xe3\x14\bt\x1a}/\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\u07d4\x9ck\u0264k\x03\xaeT\x04\xf0C\xdf\xcf!\x88>A\x10\xcc3\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x9cx\x96?\xbc&<\t\xbdr\xe4\xf8\xde\xf7J\x94u\xf7\x05\\\x8a\x02\ub3b1\xa1r\u0738\x00\x00\u07d4\x9cx\xfb\xb4\xdfv\x9c\xe2\xc1V\x92\f\xfe\xdf\xda\x03:\x0e%J\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x9c{m\xc5\x19\x0f\xe2\x91)c\xfc\xd5yh>\xc79Q\x16\xb0\x89*\x11)\u0413g \x00\x00\u07d4\x9c\x80\xbc\x18\xe9\xf8\u0516\x8b\x18]\xa8\u01df\xa6\xe1\x1f\xfc>#\x89\r\x02\xabHl\xed\xc0\x00\x00\xe0\x94\x9c\x98\xfd\xf1\xfd\u034b\xa8\xf4\u0170L:\xe8X~\xfd\xf0\xf6\xe6\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\x9c\x99\xa1\u0691\u0552\v\xc1N\f\xb9\x14\xfd\xf6+\x94\u02c3X\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\x9c\x99\xb6&\x06(\x1b\\\xef\xab\xf3aV\xc8\xfeb\x83\x9e\xf5\xf3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x9c\x9a\a\xa8\xe5|1r\xa9\x19\xefdx\x94tI\x0f\r\x9fQ\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9c\x9d\xe4G$\xa4\x05M\xa0\xea\xa6\x05\xab\u0300&hw\x8b\xea\x89\n\xd7\xd5\xca?\xa5\xa2\x00\x00\u07d4\x9c\x9f;\x8a\x81\x1b!\xf3\xff?\xe2\x0f\xe9p\x05\x1c\xe6j\x82O\x89>\xc2\u07bc\a\u053e\x00\x00\xe0\x94\x9c\x9f\x89\xa3\x91\x0fj*\xe8\xa9\x10G\xa1z\xb7\x88\xbd\xde\xc1p\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9c\xa0B\x9f\x87O\x8d\xce\xe2\xe9\xc0b\xa9\x02\n\x84*Xz\xb9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9c\xa4.\u7838\x98\xf6\xa5\xcc`\xb5\xa5\u05f1\xbf\xa3\xc321\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9c\xb2\x8a\xc1\xa2\n\x10o\u007f76\x92\xc5\xceLs\xf172\xa1\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9c\xcd\u0732\xcf\u00b2[\br\x9a\n\x98\xd9\xe6\xf0 .\xa2\xc1\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9c\xe2\u007f$^\x02\xd1\xc3\x12\xc1\xd5\x00x\x8c\x9d\xefv\x90E;\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9c\xe56;\x13\xe8#\x8a\xa4\xdd\x15\xac\u0432\xe8\xaf\xe0\x872G\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\x9c\xf2\x92\x8b\xee\xf0\x9a@\xf9\xbf\xc9S\xbe\x06\xa2Q\x11a\x82\xfb\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x9d\x06\x91\x97\xd1\xdeP\x04Z\x18o^\xc7D\xac@\u8bd1\u0189lk\x93[\x8b\xbd@\x00\x00\u07d4\x9d\x0e}\x92\xfb0XS\u05d8&;\xf1^\x97\xc7+\xf9\xd7\xe0\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9d\x0f4~\x82k}\u03aa\xd2y\x06\n5\xc0\x06\x1e\xcf3K\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9d u\x17B,\xc0\xd6\r\xe7\xc27\tzMO\xce \x94\f\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\x9d%\n\xe4\xf1\x10\xd7\x1c\xaf\u01f0\xad\xb5.\x8d\x9a\xcbfy\xb8\x8a\x02\x15mn\x99r\x13\xc0\x00\x00\xe0\x94\x9d+\xfc6\x10o\x03\x82P\xc0\x18\x01hW\x85\xb1l\x86\xc6\r\x8aPw\xd7]\xf1\xb6u\x80\x00\x00\xe0\x94\x9d0\xcb#{\xc0\x96\xf1p6\xfc\x80\xdd!\xcah\x99,\xa2\u064a\x06n\xe71\x8f\u070f0\x00\x00\u07d4\x9d2\x96.\xa9\x97\x00\xd92(\xe9\xdb\xda\xd2\xcc7\xbb\x99\xf0~\x89\xb4c+\xed\xd4\xde\xd4\x00\x00\u07d4\x9d4\xda\xc2[\xd1X(\xfa\xef\xaa\xf2\x8fq\aS\xb3\x9e\x89\u0709;\x1cV\xfe\xd0-\xf0\x00\x00\u07d4\x9d6\x91e\xfbp\xb8\x1a:v_\x18\x8f\xd6\f\xbe^{\th\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9d@\xe0\x12\xf6\x04%\xa3@\xd8-\x03\xa1\xc7W\xbf\xab\xc7\x06\xfb\x89\t4o:\xdd\u020d\x80\x00\u07d4\x9dAt\xaaj\xf2\x84v\xe2)\xda\xdbF\x18\b\b\xc6u\x05\xc1\x89B\x1a\xfd\xa4.\u0597\x00\x00\u07d4\x9dB\x133\x9a\x01U\x18avL\x87\xa9<\xe8\xf8_\x87\x95\x9a\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9dF\f\x1b7\x9d\xdb\x19\xa8\xc8[LgG\x05\r\xdf\x17\xa8u\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\x9dG\xba[L\x85\x05\xad\x8d\xa4)4(\va\xa0\xe1\xe8\xb9q\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9dM2\x11w%n\xbd\x9a\xfb\xda0A5\xd5\x17\xc3\xdcV\x93\x89!d\xb7\xa0J\u0220\x00\x00\u07d4\x9dO\xf9\x89\xb7\xbe\u066b\x10\x9d\x10\xc8\xc7\xe5_\x02\xd7g4\xad\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\x9dQ\x15C\xb3\xd9\xdc`\xd4\u007f\t\u051d\x01\xb6\u0118\xd8 x\x8a\x02a\x97\xb9Qo\u00d4\x00\x00\u07d4\x9dn\u03e0:\xf2\xc6\xe1D\xb7\xc4i*\x86\x95\x1e\x90.\x9e\x1f\x89\xa2\xa5\xaa`\xad$?\x00\x00\u07d4\x9dvU\xe9\xf3\xe5\xba]n\x87\xe4\x12\xae\xbe\x9e\xe0\u0512G\ue24e\t1\x1c\x1d\x80\xfa\x00\x00\u07d4\x9dx1\xe84\xc2\v\x1b\xaaiz\xf1\xd8\xe0\xc6!\u016f\xff\x9a\x89\x04\xb0m\xbb\xb4\x0fJ\x00\x00\u07d4\x9dx\xa9u\xb7\xdb^M\x8e(\x84\\\xfb\xe7\xe3\x14\x01\xbe\r\u0649H\xa40k\xa2\u5e5c\x8ahX\u02f5,\f\xf75\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94\x9d\u007f\xdapp\xbf>\xe9\xbb\u0664\x1fU\xca\u0505J\xe6\xc2,\x8a\x02U\u02e3\xc4o\xcf\x12\x00\x00\u07d4\x9d\x81\xae\xa6\x9a\xedj\xd0p\x89\xd6\x14E4\x8c\x17\xf3K\xfc[\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x9d\x91\x1f6\x82\xf3/\xe0y.\x9f\xb6\xff<\xfcG\xf5\x89\xfc\xa5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9d\x91;]3\x9c\x95\xd8wEV%c\xfe\xa9\x8b#\xc6\f\u0109\tA0,\u007fM#\x00\x00\u07d4\x9d\x93\xfa\xb6\xe2(E\xf8\xf4Z\aIo\x11\xdeqS\r\xeb\u01c9lO\xd1\xee$nx\x00\x00\u07d4\x9d\x99\xb1\x89\xbb\u0664\x8f\xc2\xe1n\x8f\u0363;\xb9\x9a1{\xbb\x89=\x16\xe1\vm\x8b\xb2\x00\x00\u07d4\x9d\x9cN\xfe\x9fC9\x89\xe2;\xe9@I!S)\xfaU\xb4\u02c9\r\u3c89\x03\u01b5\x80\x00\u07d4\x9d\x9eW\xfd\xe3\x0ePh\xc0>I\x84\x8e\xdc\xe3C\xb7\x02\x83X\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\x9d\xa30\"@\xaf\x05\x11\xc6\xfd\x18W\xe6\u07779Ow\xabk\x89\xa8\r$g~\xfe\xf0\x00\x00\u07d4\x9d\xa4\xec@pw\xf4\xb9p{-\x9d.\xde^\xa5(+\xf1\u07c9\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9d\xa6\t\xfa:~l\xf2\xcc\x0ep\u036b\xe7\x8d\xc4\xe3\x82\xe1\x1e\x89A\rXj \xa4\xc0\x00\x00\xe0\x94\x9d\xa6\x1c\xcdb\xbf\x86\x06V\xe02]qW\xe2\xf1`\xd9;\xb5\x8a\x01\x0f\f\xa9V\xf8y\x9e\x00\x00\xe0\x94\x9d\xa6\xe0u\x98\x9ct\x19\tL\xc9\xf6\xd2\u44d3\xbb\x19\x96\x88\x8a\x02Y\xbbq\u056d\xf3\xf0\x00\x00\u07d4\x9d\xa8\xe2,\xa1\x0eg\xfe\xa4NR^GQ\xee\xac6\xa3\x11\x94\x89\x0e\x189\x8ev\x01\x90\x00\x00\u07d4\x9d\xb2\xe1\\\xa6\x81\xf4\xc6`H\xf6\xf9\xb7\x94\x1e\u040b\x1f\xf5\x06\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9d\xc1\x0f\xa3\x8f\x9f\xb0h\x10\xe1\x1f`\x17>\xc3\xd2\xfdju\x1e\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\x9d\xd2\x19f$\xa1\xdd\xf1J\x9d7^_\a\x15+\xaf\"\xaf\xa2\x89A\xb0^$c\xa5C\x80\x00\u07d4\x9d\xd4k\x1cm?\x05\u279co\x03~\xed\x9aYZ\xf4\xa9\xaa\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x9d\xdd5^cN\xe9\x92~K\u007fl\x97\xe7\xbf:/\x1ehz\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\x9d\xe2\n\xe7j\xa0\x82c\xb2\x05\xd5\x14$a\x96\x1e$\b\xd2f\x89\r\xa93\xd8\xd8\xc6p\x00\x00\u07d4\x9d\xe2\v\xc3~\u007fH\xa8\x0f\xfdz\xd8O\xfb\xf1\xa1\xab\xe1s\x8c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9d\xe78m\xde@\x1c\xe4\xc6{q\xb6U?\x8a\xa3N\xa5\xa1}\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\x9d\xeb9\x02z\xf8w\x99+\x89\xf2\xecJ\x1f\x82.\xcd\xf1&\x93\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x9d\xef\xe5j\x0f\xf1\xa1\x94}\xba\t#\xf7\xdd%\x8d\x8f\x12\xfaE\x8a\x05\xb1*\ufbe8\x04\x00\x00\x00\u07d4\x9d\xf0W\xcd\x03\xa4\xe2~\x8e\x03/\x85y\x85\xfd\u007f\x01\xad\xc8\u05c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x9d\xf3*P\x1c\vx\x1c\x02\x81\x02/B\xa1)?\xfd{\x89*\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\u07d4\x9e\x01vZ\xff\b\xbc\"\x05P\xac\xa5\xea.\x1c\xe8\u5c19#\x8965\u026d\xc5\u07a0\x00\x00\u07d4\x9e \xe5\xfd6\x1e\xab\xcfc\x89\x1f[\x87\xb0\x92h\xb8\xeb7\x93\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9e#,\b\xc1M\xc1\xa6\xed\v\x8a;(h\x97{\xa5\xc1}\x10\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9e#\xc5\u4dc2\xb0\n_\xad\U0006eb47\xda\xcf[\x03g\xa1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9e59\x90q\xa4\xa1\x01\xe9\x19M\xaa?\t\xf0J\v_\x98p\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9e>\xb5\t'\x8f\xe0\xdc\xd8\xe0\xbb\xe7\x8a\x19N\x06\xb6\x809C\x892\xf5\x1e\u06ea\xa30\x00\x00\u07d4\x9eBrrQk>g\xd4\xfc\xbf\x82\xf5\x93\x90\xd0L\x8e(\xe5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\x9eL\xec5:\xc3\u3043^<\t\x91\xf8\xfa\xa5\xb7\u0428\xe6\x8a\x02\x1e\x18\xb9\xe9\xabE\xe4\x80\x00\u07d4\x9eX\x11\xb4\v\xe1\xe2\xa1\xe1\u048c;\at\xac\xde\n\t`=\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\x9eZ1\x1d\x9fi\x89\x8a|j\x9dc`h\x048\xe6z{/\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\x9e| P\xa2'\xbb\xfd`\x93~&\x8c\xea>h\xfe\xa8\xd1\xfe\x89\x05k\xc7^-c\x10\x00\x00\u07d4\x9e\u007fe\xa9\x0e\x85\b\x86{\xcc\xc9\x14%j\x1e\xa5t\xcf\a\xe3\x89C8t\xf62\xcc`\x00\x00\xe0\x94\x9e\x81D\xe0\x8e\x89dx\x11\xfekr\xd4E\u05a5\xf8\n\xd2D\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9e\x8fd\xdd\xcd\u9e34Q\xba\xfa\xa25\xa9\xbfQ\x1a%\xac\x91\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\x9e\x95\x1fm\xc5\xe3R\xaf\xb8\xd0B\x99\xd2G\x8aE\x12Y\xbfV\x89\x03\xe7A\x98\x81\xa7:\x00\x00\u07d4\x9e\x96\r\xcd\x03\u057a\x99\xcb\x11]\x17\xffL\t$\x8a\xd4\u043e\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9e\xafj2\x8a@v\x02N\xfakg\xb4\x8b!\xee\xdc\xc0\xf0\xb8\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\x9e\xb1\xffqy\x8f(\xd6\xe9\x89\xfa\x1e\xa0X\x8e'\xba\x86\xcb}\x89\a\xa1\xfe\x16\x02w\x00\x00\x00\u07d4\x9e\xb2\x81\xc3'\x19\xc4\x0f\xdb>!m\xb0\xf3\u007f\xbcs\xa0&\xb7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\x9e\xb3\xa7\xcb^g&Bz:6\x1c\xfa\x8dad\xdb\u043a\x16\x89+\x95\xbd\xcc9\xb6\x10\x00\x00\u07d4\x9e\xb7\x83N\x17\x1dA\xe0i\xa7yG\xfc\xa8v\"\xf0\xbaNH\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\x9e\xc0>\x02\u51f7v\x9d\xefS\x84\x13\xe9\u007f~U\xbeq\u060a\x04+\xf0kx\xed;P\x00\x00\u07d4\x9e\u02eb\xb0\xb2'\x82\xb3uD)\xe1uz\xab\xa0K\x81\x18\x9f\x89,\xa7\xbb\x06\x1f^\x99\x80\x00\u07d4\x9e\xce\x14\x00\x80\t6\xc7\xc6H_\xcd\xd3b`\x17\u041a\xfb\xf6\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4\x9e\xd4\xe6?ReB\xd4O\xdd\xd3MY\xcd%8\x8f\xfdk\u0689\u049b4\xa4cH\x94\x00\x00\u07d4\x9e\xd8\x0e\xda\u007fU\x05M\xb9\xfbR\x82E\x16\x88\xf2k\xb3t\xc1\x89\x10CV\x1a\x88)0\x00\x00\u07d4\x9e\u0710\xf4\xbe!\be!J\xb5\xb3^Z\x8d\xd7t\x15'\x9d\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9e\u07acL\x02k\x93\x05M\u0171\xd6a\fo9`\xf2\xads\x89A\rXj \xa4\xc0\x00\x00\u07d4\x9e\xe9?3\x9eg&\xece\xee\xa4O\x8aK\xfe\x10\xda=2\x82\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\x9e\xe9v\f\xc2s\xd4pj\xa0\x83u\xc3\xe4o\xa20\xaf\xf3\u054a\x01\xe5.3l\xde\"\x18\x00\x00\u07d4\x9e\xeb\a\xbd+x\x90\x19^}F\xbd\xf2\a\x1bf\x17QM\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\x9e\xefD-)\x1aD}t\xc5\xd2S\u011e\xf3$\xea\xc1\xd8\xf0\x89\xb9f\b\xc8\x10;\xf0\x00\x00\u07d4\x9e\xf1\x89k\x00|2\xa1Q\x14\xfb\x89\xd7=\xbdG\xf9\x12+i\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9f\x01w\x06\xb80\xfb\x9c0\ufc20\x9fPk\x91WEu4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9f\x10\xf2\xa0F;e\xae0\xb0p\xb3\xdf\x18\xcfF\xf5\x1e\x89\xbd\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\x9f\x19\xfa\u0223$7\xd8\n\u0183z\v\xb7\x84\x17)\xf4\x97.\x89#=\xf3)\x9far\x00\x00\u07d4\x9f\x1a\xa8\xfc\xfc\x89\xa1\xa52\x8c\xbdcD\xb7\x1f'\x8a,\xa4\xa0\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\x9f!0,\xa5\tk\xeat\x02\xb9\x1b\x0f\xd5\x06%O\x99\x9a=\x89C\x97E\x1a\x00=\xd8\x00\x00\u07d4\x9f'\x1d(U\x00\xd78F\xb1\x8fs>%\u074bO]J\x8b\x89'#\xc3F\xae\x18\b\x00\x00\u07d4\x9f4\x97\xf5\xef_\xe60\x95\x83l\x00N\xb9\xce\x02\xe9\x01;K\x89\"V\x86\x1b\xf9\xcf\b\x00\x00\xe0\x94\x9f:t\xfd^~\xdc\xc1\x16)\x93\x17\x13\x81\u02f62\xb7\xcf\xf0\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\x9fF\xe7\xc1\xe9\a\x8c\xae\x860Z\xc7\x06\v\x01F}f\x85\xee\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\x9fIl\xb2\x06\x95c\x14M\b\x11g{\xa0\xe4q:\nAC\x89<\xd2\xe0\xbfc\xa4H\x00\x00\u07d4\x9fJq\x95\xac|\x15\x1c\xa2X\xca\xfd\xa0\u02b0\x83\xe0I\xc6\x02\x89SS\x8c2\x18\\\xee\x00\x00\u07d4\x9fJ\xc9\xc9\xe7\xe2L\xb2DJ\x04T\xfa[\x9a\xd9\xd9-8S\x89-C\xf3\xeb\xfa\xfb,\x00\x00\u07d4\x9f_D\x02kWjJ\xdbA\xe9YaV\x1dA\x03\x9c\xa3\x91\x89\r\x8drkqw\xa8\x00\x00\u07d4\x9f`{?\x12F\x9fDa!\u03bf4u5kq\xb42\x8c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\x9fa\xbe\xb4o^\x85=\n\x85!\xc7Dnh\xe3L}\ts\x89\x1e[\x8f\xa8\xfe*\xc0\x00\x00\u07d4\x9fd\xa8\xe8\xda\xcfJ\xde0\xd1\x0fMY\xb0\xa3\u056b\xfd\xbft\x8966\x9e\xd7t}&\x00\x00\u07d4\x9ff.\x95'A!\xf1wVncm#\x96L\xf1\xfdho\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9fj2*mF\x99\x81Bj\xe8D\x86]~\xe0\xbb\x15\u01f3\x89\x02\xb5\xeeW\x92\x9f\u06c0\x00\u07d4\x9fy\x86\x92J\xeb\x02h|\xd6A\x89\x18\x9f\xb1g\xde\xd2\xdd\\\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\x9fz\x03\x92\xf8Ws.0\x04\xa3u\xe6\xb1\x06\x8dI\xd801\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9f\x82E\u00eb}\x171d\x86\x1c\u04d9\x1b\x94\xf1\xba@\xa9:\x89\x9b\ny\x1f\x12\x110\x00\x00\u07d4\x9f\x83\xa2\x93\xc3$\xd4\x10l\x18\xfa\xa8\x88\x8fd\u0499\x05L\xa0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\x9f\x86\xa0f\xed\xb6\x1f\xcbXV\u0793\xb7\\\x8cy\x18d\xb9{\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\x9f\x98\xeb4\xd4iy\xb0\xa6\u078b\x05\xaaS:\x89\xb8%\xdc\xf1\x89\x04\xb0m\xbb\xb4\x0fJ\x00\x00\xe0\x94\x9f\x9f\xe0\xc9_\x10\xfe\xe8z\xf1\xaf r6\xc8\xf3aN\xf0/\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\x9f\xae\xa1\xc5\xe8\x1ez\xcb?\x17\xf1\xc3Q\xee.\u0649\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa0\b\x01\x98c\xc1\xa7|\x14\x99\xeb9\xbb\u05ff-\u05e3\x1c\xb9\x89\amA\xc6$\x94\x84\x00\x00\u07d4\xa0\t\xbf\ao\x1b\xa3\xfaW\u04a7!r\x18\xbe\xd5VZzz\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa0\x1e\x94v\u07c4C\x18%\xc86\xe8\x80:\x97\xe2/\xa5\xa0\u034a\x01EB\xba\x12\xa37\xc0\x00\x00\u0794\xa0\x1f\x12\xd7\x0fD\xaa{\x11;(\\\"\xdc\xdbE\x874T\xa7\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xa0\x1f\u0450j\x90\x85\x06\xde\xda\xe1\xe2\b\x12\x88r\xb5n\u7489\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xa0\"\x82@\xf9\x9e\x1d\xe9\xcb2\xd8,\x0f/\xa9\xa3\xd4K\v\xf3\x89V\xbcu\xe2\xd61\x00\x00\x00\xe0\x94\xa0+\xdedahn\x19\xace\f\x97\r\x06r\xe7m\xcbO\u008a\x01\xe0\x92\x96\xc37\x8d\xe4\x00\x00\u07d4\xa0,\x1e4\x06O\x04u\xf7\xfa\x83\x1c\xcb%\x01L:\xa3\x1c\xa2\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xa0-\u01aa2\x8b\x88\r\u97acTh#\xfc\xcfw@G\xfb\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xa0.?\x8fYY\xa7\xaa\xb7A\x86\x12\x12\x9bp\x1c\xa1\xb8\x00\x10\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa04\u007f\n\x98wc\x90\x16\\\x16m2\x96;\xf7M\xcd\n/\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa05\xa3e$x\xf8-\xbdm\x11_\xaa\x8c\xa9F\xec\x9eh\x1d\x89\x05\xf4\xe4-\u052f\xec\x00\x00\u07d4\xa0:=\xc7\xc53\xd1tB\x95\xbe\x95]a\xaf?R\xb5\x1a\xf5\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xa0E\x9e\xf3i:\xac\xd1d|\xd5\u0612\x989 L\xefS\xbe\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa0O*\xe0*\xdd\x14\xc1/\xafe\xcb%\x90\"\u0403\n\x8e&\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xa0l\xd1\xf3\x969l\ndFFQ\xd7\xc2\x05\xef\xaf8|\xa3\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xa0ri\x1c\x8d\xd7\xcdB7\xffr\xa7\\\x1a\x95\x06\xd0\xce[\x9e\x89\x14\x0e\xc8\x0f\xa7\xee\x88\x00\x00\u07d4\xa0r\u03beb\xa9\xe9\xf6\x1c\xc3\xfb\xf8\x8a\x9e\xfb\xfe>\x9a\x8dp\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa0v\x82\x00\v\x1b\xcf0\x02\xf8\\\x80\xc0\xfa)I\xbd\x1e\x82\xfd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa0z\xa1mt\xae\u8a63(\x8dR\xdb\x15Q\u0553\x882\x97\x89 \x86\xac5\x10R`\x00\x00\u07d4\xa0\x8d![[j\xacHa\xa2\x81\xac~@\vx\xfe\xf0L\xbf\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa0\x95\x19p\xdf\u0403/\xb8;\xda\x12\xc25E\xe7\x90Aul\x89 \x86\xac5\x10R`\x00\x00\u07d4\xa0\x9fM^\xaae\xa2\xf4\xcbu\nI\x924\x01\xda\u5410\xaf\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\xe0\x94\xa0\xa0\xe6R\x04T\x1f\u029b/\xb2\x82\u0355\x13\x8f\xae\x16\xf8\t\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa0\xaa_\x02\x01\xf0M;\xbe\xb8\x98\x13/|\x11g\x94f\xd9\x01\x89\x01\xfb\xedR\x15\xbbL\x00\x00\u07d4\xa0\xaa\xdb\xd9P\x97\"p_m#X\xa5\u01df7\x97\x0f\x00\xf6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa0\xb7q\x95\x1c\xe1\xde\xee6:\xe2\xb7q\xb7>\a\u0135\xe8\x00\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xa0\xde\\`\x1eif5\u0198\xb7\xae\x9c\xa4S\x9f\u01f9A\xec\x89\x12\xc3\xcb\xd7\x04\xc9w\x00\x00\u07d4\xa0\xe8\xbaf\x1bH\x15L\xf8C\xd4\u00a5\xc0\xf7\x92\xd5(\xee)\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa0\xfc~S\xc5\xeb\xd2z*\xbd\xacE&\x1f\x84\xab;Q\xae\xfb\x89\xa3\x13\xda\xec\x9b\xc0\xd9\x00\x00\xe0\x94\xa0\xff[L\xf0\x16\x02~\x83#I}D(\xd3\xe5\xa8;\x87\x95\x8a\x01e\x98\xd3\xc8>\xc0B\x00\x00\u07d4\xa1\x06F[\xbd\x19\u1dbc\xe5\r\x1b\x11W\xdcY\tZ60\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa1\x06\xe6\x92>\xddS\u028e\xd6P\x96\x8a\x91\b\xd6\xcc\xfd\x96p\x8a\x02\x02\xfe\x15\x05\xaf\uc240\x00\u07d4\xa1\t\u12f0\xa3\x9c\x9e\xf8/\xa1\x95\x97\xfc^\xd8\xe9\xebmX\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4\xa1\x1a\x03\u013b&\xd2\x1e\xffg}]U\\\x80\xb2TS\xeez\x89\x03\xcb'Y\xbcA\x0f\x80\x00\u07d4\xa1\x1e\xff\xabl\xf0\xf5\x97,\xff\xe4\xd5e\x96\xe9\x89h\x14J\x8f\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\xa1 M\xad_V\a(\xa3\\\r\x8f\u01d4\x81\x05{\xf7s\x86\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa1&#\xe6)\u07d3\tg\x04\xb1`\x84\xbe,\u061dV-\xa4\x8a\x01\xcc\xc92E\x11\xe4P\x00\x00\xe0\x94\xa1*l-\x98]\xaf\x0eO_ z\xe8Q\xaa\xf7)\xb32\u034a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\xa13m\xfb\x96\xb6\xbc\xbeK>\xdf2\x05\xbeW#\xc9\x0f\xadR\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xa1;\x9d\x82\xa9\x9b<\x9b\xbaZ\xe7.\xf2\x19\x9e\xdc};\xb3l\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\xa1<\xfe\x82mm\x18A\u072eD;\xe8\u00c7Q\x816\xb5\xe8\x8a\x1d\xa5jK\b5\xbf\x80\x00\x00\xe0\x94\xa1C.\xd2\u01b7wz\x88\xe8\xd4m8\x8epG\u007f \x8c\xa5\x8a\x01\xb1\xa7\xe4\x13\xa1\x96\xc5\x00\x00\u07d4\xa1D\xf6\xb6\x0fr\xd6J!\xe30\xda\xdbb\u0619\n\xde+\t\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa1P%\xf5\x95\xac\xdb\xf3\x11\x0fw\u017f$G~eH\xf9\xe8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1X\x14\x8a.\x0f>\x92\xdc,\xe3\x8f\xeb\xc2\x01\a\xe3%<\x96\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1a`\x85\x1d+\x9c4\x9b\x92\xe4o\x82\x9a\xbf\xb2\x10\x945\x95\x89a\t=|,m8\x00\x00\u07d4\xa1f\xf9\x11\xc6D\xac2\x13\u049e\x0e\x1a\xe0\x10\xf7\x94\u056d&\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1m\x9e=c\x98aY\xa8\x00\xb4h7\xf4^\x8b\xb9\x80\xee\v\x89n\x11u\xdaz\xd1 \x00\x00\u07d4\xa1pp\xc2\xe9\u0169@\xa4\xec\x0eIT\xc4\xd7\xd6C\xbe\x8fI\x89lk\x17\x03;6\x1c\x80\x00\u07d4\xa1|\x9eC#\x06\x95\x18\x18\x9dR\a\xa0r\x8d\u02d20j?\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa1\x83`\xe9\x85\xf2\x06.\x8f\x8e\xfe\x02\xad,\xbc\x91\xad\x9aZ\xad\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xa1\x91\x14\x05\xcfn\x99\x9e\xd0\x11\xf0\xdd\xcd*O\xf7\u008f%&\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xa1\x92i\x80\a\xcc\x11\xaa`=\"\x1d_\xee\xa0v\xbc\xf7\xc3\r\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1\x92\xf0j\xb0R\xd5\xfd\u007f\x94\xee\xa81\x8e\x82x\x15\xfegz\x89\a\x1f\x8a\x93\xd0\x1eT\x00\x00\u07d4\xa1\x99\x81D\x96\x8a\\p\xa6AUT\xce\xfe\u0082F\x90\u0125\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa1\xa1\xf0\xfam \xb5\nyO\x02\xefR\b\\\x9d\x03j\xa6\u028965\u026d\xc5\u07a0\x00\x00\u07d4\xa1\xae\x8dE@\xd4\xdbo\xdd\xe7\x14oA[C\x1e\xb5\\y\x83\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xa1\xb4|M\x0e\xd6\x01\x88B\xe6\xcf\xc8c\n\u00e3\x14.^k\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xa1\xc4\xf4Z\x82\xe1\xc4x\xd8E\b.\xb1\x88u\xc4\xeae9\xab\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xa1\xdc\xd0\xe5\xb0Z\x97|\x96#\xe5\xae/Y\xb9\xad\xa2\xf3>1\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa1\xe48\n;\x1ft\x96s\xe2p\"\x99\x93\xeeU\xf3Vc\xb4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1\xf1\x93\xa0Y/\x1f\xeb\x9f\xdf\xc9\n\xa8\x13xN\xb8\x04q\u0249K\xe4\xe7&{j\xe0\x00\x00\u07d4\xa1\xf2\x85@P\xf8re\x8e\xd8.R\xb0\xad{\xbc\x1c\xb9!\xf6\x89m\x03\x17\xe2\xb3&\xf7\x00\x00\u07d4\xa1\xf5\xb8@\x14\rZ\x9a\xce\xf4\x02\xac<\u00c8jh\xca\xd2H\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa1\xf7e\xc4O\xe4_y\x06w\x94HD\xbeO-B\x16_\xbd\x89\xc7\xe9\xcf\xdev\x8e\xc7\x00\x00\u07d4\xa1\xf7\xdd\xe1\xd78\xd8\xcdg\x9e\xa1\xee\x96[\xee\"K\xe7\xd0M\x89=\x18DP\xe5\xe9<\x00\x00\u07d4\xa1\xf8\u063c\xf9\x0ew\u007f\x19\xb3\xa6Iu\x9a\xd9P'\xab\xdf\u00c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa2\x02TrB\x80onp\xe7@X\xd6\xe5)-\xef\xc8\xc8\u0509l\x87T\xc8\xf3\f\b\x00\x00\u07d4\xa2\r\a\x1b\x1b\x000cI}y\x90\xe1$\x9d\xab\xf3l5\xf7\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa2\r\x8f\xf6\f\xaa\xe3\x1d\x02\xe0\xb6e\xfaC]v\xf7|\x94B\x89\x1a\x8a\x90\x9d\xfc\xef@\x00\x00\u07d4\xa2\x11\xda\x03\xcc\x0e1\xec\xceS\t\x99\x87\x18QU(\xa0\x90\u07c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa2\x14B\xab\x054\n\xdeh\xc9\x15\xf3\xc39\x9b\x99U\xf3\xf7\xeb\x89*\x03I\x19\u07ff\xbc\x00\x00\u07d4\xa2\"\"Y\u075c>=\xed\x12p\x84\xf8\b\xe9*\x18\x870,\x89\b\xc83\x9d\xaf\xedH\x00\x00\u07d4\xa2*\xde\r\xdb\\n\xf8\xd0\u034d\xe9M\x82\xb1\x10\x82\xcb.\x91\x897KW\xf3\xce\xf2p\x00\x00\u07d4\xa2L:\xb6!\x81\xe9\xa1[x\xc4b\x1eL|X\x81'\xbe&\x89\b\xcd\xe4:\x83\xd31\x00\x00\u07d4\xa2W\xadYK\u0603(\xa7\xd9\x0f\xc0\xa9\a\u07d5\xee\xca\xe3\x16\x89\x1c7\x86\xff8F\x93\x00\x00\u07d4\xa2[\bd7\xfd!\x92\u0420\xf6On\xd0D\xf3\x8e\xf3\xda2\x89\x12)\x0f\x15\x18\v\xdc\x00\x00\u07d4\xa2v\xb0X\u02d8\u060b\xee\xdbg\xe5CPl\x9a\r\x94p\u0609\x90\xaa\xfcv\xe0/\xbe\x00\x00\u07d4\xa2\x82\xe9i\xca\xc9\xf7\xa0\xe1\xc0\u0350\xf5\xd0\xc48\xacW\r\xa3\x89\"\a\xeb\x89\xfc'8\x00\x00\xe0\x94\xa2\x91\xe9\u01d9\rU-\u046e\x16\u03bc?\xca4,\xba\xf1\u044a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa2\x93\x19\xe8\x10i\xe5\xd6\r\xf0\x0f=\xe5\xad\xee5\x05\xec\xd5\xfb\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa2\x96\x8f\xc1\xc6K\xac\vz\xe0\u058b\xa9I\x87Mm\xb2S\xf4\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xa2\x9d[\xdat\xe0\x03GHr\xbdX\x94\xb8\x853\xffd\u00b5\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa2\x9df\x1acv\xf6m\vt\xe2\xfe\x9d\x8f&\xc0$~\xc8L\x89\xdf3\x04\a\x9c\x13\xd2\x00\x00\u07d4\xa2\xa45\xdeD\xa0\x1b\xd0\ucc9eD\xe4vD\xe4j\f\xdf\xfb\x89\x1b\x1dDZz\xff\xe7\x80\x00\u07d4\xa2\xac\xe4\u0253\xbb\x1eS\x83\xf8\xact\xe1y\x06n\x81O\x05\x91\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa2\xb7\x01\xf9\xf5\xcd\u041eK\xa6+\xae\xba\u3a02W\x10X\x85\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa2\u0145O\xf1Y\x9f\x98\x89,W%\xd2b\xbe\x1d\xa9\x8a\xad\xac\x89\x11\t\xff30\x10\xe7\x80\x00\u07d4\xa2\xc7\xea\xff\xdc,\x9d\x93sE l\x90\x9aR\u07f1LG\x8f\x89\a\xc0\x86\x0eZ\x80\xdc\x00\x00\u07d4\xa2\u04aabk\t\xd6\xd4\xe4\xb1?\u007f\xfcZ\x88\xbdz\xd3gB\x89\xfb\x80xPuS\x83\x00\x00\u07d4\xa2\u04cd\xe1\xc79\x06\xf6\xa7\xcan\xfe\xb9|\xf6\xf6\x9c\xc4!\xbe\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa2\xdce\xee%kY\xa5\xbdy)wO\x90K5\x8d\U000ed84a\x04\x83\xbc\xe2\x8b\xeb\t\xf8\x00\x00\u07d4\xa2\xe0h:\x80]\xe6\xa0^\xdb/\xfb\xb5\xe9o\x05p\xb67\u00c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa2\u1e2a\x90\x0e\x9c\x13\x9b?\xa1\"5OaV\xd9*\x18\xb1\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa2\u2d54\x1e\f\x01\x94K\xfe\x1d_\xb4\xe8\xa3K\x92,\u03f1\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa2\xe4`\xa9\x89\xcb\x15V_\x9e\u0327\xd1!\xa1\x8eN\xb4\x05\xb6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa2\xec\xce,I\xf7*\t\x95\xa0\xbd\xa5z\xac\xf1\xe9\xf0\x01\xe2*\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xa2\xf4r\xfeO\"\xb7}\xb4\x89!\x9e\xa4\x02=\x11X*\x93)\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xa2\xf7\x98\xe0w\xb0}\x86\x12N\x14\a\xdf2\x89\r\xbbKcy\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa2\xf8k\xc0a\x88N\x9e\xef\x05d\x0e\xddQ\xa2\xf7\xc0Yli\x89llD\xfeG\xec\x05\x00\x00\u07d4\xa2\xfa\x17\xc0\xfbPl\xe4\x94\x00\x8b\x95W\x84\x1c?d\x1b\x8c\xae\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa3\x04X\x8f\r\x85\f\xd8\u04cfv\xe9\xe8<\x1b\xf6>3>\u0789\x02(V\x01!l\x8c\x00\x00\u07d4\xa3\x05\x8cQszN\x96\xc5_.\xf6\xbd{\xb3X\x16~\u00a7\x89 \xdb:\xe4H\x1a\u0500\x00\u07d4\xa3\t\xdfT\u02bc\xe7\f\x95\xec03\x14\x9c\xd6g\x8ao\xd4\u03c9\f\x1f\x12\xc7Q\x01X\x00\x00\u07d4\xa3\nER\x0eR\x06\xd9\x00@p\xe6\xaf>{\xb2\xe8\xddS\x13\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa3\x0e\n\xcbSL\x9b0\x84\xe8P\x1d\xa0\x90\xb4\xeb\x16\xa2\xc0\u0349lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3 0\x95\xed\xb7\x02\x8ehq\xce\n\x84\xf5HE\x9f\x830\n\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa3!\t\x1d0\x18\x06By\xdb9\x9d+*\x88\xa6\xf4@\xae$\x89\xadx\xeb\u016cb\x00\x00\x00\u07d4\xa3#-\x06\x8dP\x06I\x03\xc9\xeb\xc5c\xb5\x15\xac\u0237\xb0\x97\x89l\x87T\xc8\xf3\f\b\x00\x00\xe0\x94\xa3$\x1d\x89\n\x92\xba\xf5)\b\xdcJ\xa0Irk\xe4&\xeb\u04ca\x04<-\xa6a\xca/T\x00\x00\u07d4\xa3)F&\xec)\x84\xc4;C\xdaM]\x8eFi\xb1\x1dKY\x896\xa4\xcfcc\x19\xc0\x00\x00\u07d4\xa3,\xf7\xdd\xe2\f=\xd5g\x9f\xf5\xe3%\x84\\p\u0156&b\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa39\xa3\xd8\xca(\x0e'\xd2A[&\xd1\xfcy2(\xb6`C\x896\U00086577\x8f\xf0\x00\x00\u07d4\xa3<\xb4P\xf9[\xb4n%\xaf\xb5\x0f\xe0_\xee\xe6\xfb\x8c\xc8\xea\x89*\x11)\u0413g \x00\x00\u07d4\xa3?p\xdaru\xef\x05q\x04\u07e7\xdbd\xf4r\xe9\xf5\xd5S\x89\x04YF\xb0\xf9\xe9\xd6\x00\x00\u07d4\xa3@v\xf8K\xd9\x17\xf2\x0f\x83B\u024b\xa7\x9eo\xb0\x8e\xcd1\x89\u3bb5sr@\xa0\x00\x00\u07d4\xa3C\x0e\x1fd\u007f2\x1e\xd3G9V##\xc7\xd6#A\vV\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4\xa3O\x9dV\x8b\xf7\xaf\xd9L*[\x8a_\xf5\\f\xc4\by\x99\x89\x84}P;\"\x0e\xb0\x00\x00\u07d4\xa3V\x06\xd5\x12 \xee\u007f!F\xd4\x11X.\xe4\xeeJEYn\x89\u062a\xbe\b\v\xc9@\x00\x00\u07d4\xa3VU\x1b\xb7}OE\xa6\xd7\xe0\x9f\n\b\x9ey\u0322I\u02c9\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\xa3\\\x19\x13,\xac\x195Wj\xbf\xedl\x04\x95\xfb\a\x88\x1b\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3e\x91\x8b\xfe?&'\xb9\xf3\xa8gu\xd8un\x0f\u0629K\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa3n\r\x94\xb9Sd\xa8&q\xb6\b\xcb-72Ea)\t\x89\b!\xd2!\xb5)\x1f\x80\x00\u07d4\xa3u\xb4\xbc$\xa2N\x1fyu\x93\xcc0+/3\x10c\xfa\\\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa3v\"\xac\x9b\xbd\xc4\xd8+u\x01]t[\x9f\x8d\xe6Z(\uc25d\xc0\\\xce(\u00b8\x00\x00\xe0\x94\xa3y\xa5\a\fP=/\xac\x89\xb8\xb3\xaf\xa0\x80\xfdE\xedK\xec\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\xa3\x80-\x8ae\x9e\x89\xa2\xc4~\x90T0\xb2\xa8'\x97\x89P\xa7\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa3\x83\x06\xcbp\xba\xa8\u4446\xbdh\xaap\xa8=$/)\a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3\x84vi\x1d4\x94.\xeak/v\x88\x92#\x04}\xb4az\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3\x87\xceN\x96\x1axG\xf5`\a\\d\xe1YkVA\xd2\x1c\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\xa3\x87\xec\xde\x0e\xe4\xc8\a\x94\x99\xfd\x8e\x03G;\u060a\xd7R*\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xa3\x88:$\xf7\xf1f _\x1aj\x99I\al&\xa7nqx\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94\xa3\x8b[\xd8\x1a\x9d\xb9\u04b2\x1d^\xc7\xc6\x05R\xcd\x02\xedV\x1b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xa3\x90\xca\x12+\x85\x01\xee>^\a\xa8\xcaKA\x9f~M\xae\x15\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xa3\x93*1\xd6\xffu\xfb;\x12q\xac\xe7\u02a7\xd5\xe1\xff\x10Q\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xa3\x94\xadO\xd9\xe6S\x0eo\\S\xfa\xec\xbe\u0781\xcb\x17-\xa1\x8a\x01/\x93\x9c\x99\xed\xab\x80\x00\x00\u07d4\xa3\x97\x9a\x92v\n\x13Z\xdfi\xd7/u\xe1gu_\x1c\xb8\u00c9\x05k\xc7^-c\x10\x00\x00\xe0\x94\xa3\x9b\xfe\xe4\xae\u027du\xbd\"\u01b6r\x89\x8c\xa9\xa1\xe9]2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa3\xa2b\xaf\u0493h\x19#\b\x92\xfd\xe8O-ZYJ\xb2\x83\x89e\xea=\xb7UF`\x00\x00\u07d4\xa3\xa2\xe3\x19\xe7\u04e1D\x8bZ\xa2F\x89S\x16\f-\xbc\xbaq\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3\xa5{\a\x16\x13(\x04\xd6\n\xac(\x11\x97\xff+=#{\x01\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xa3\xa9>\xf9\xdb\xea&6&=\x06\xd8I/jA\u0790|\"\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94\xa3\xae\x18y\x00}\x80\x1c\xb5\xf3RqjM\u063a'!\xde=\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xa3\xba\r:6\x17\xb1\xe3\x1bNB,\xe2i\xe8s\x82\x8d]i\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4\xa3\xbc\x97\x9bp\x80\t/\xa1\xf9/n\x0f\xb3G\u2359PE\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xa3\xbf\xf1\u07e9\x97\x16h6\f\r\x82\x82\x842\xe2{\xf5Ng\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xa3\xc1J\xce(\xb1\x92\u02f0b\x14_\u02fdXi\xc6rq\xf6\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa3\xc3:\xfc\x8c\xb4pN#\x15=\xe2\x04\x9d5\xaeq3$r\x89+X\xad\u06c9\xa2X\x00\x00\u07d4\xa3\u0430<\xff\xbb&\x9fyj\u009d\x80\xbf\xb0}\xc7\u01ad\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa3\u0543\xa7\xb6[#\xf6\vy\x05\xf3\xe4\xaab\xaa\xc8\u007fB'\x898\xbe\xfa\x12mZ\x9f\x80\x00\u07d4\xa3\xdb6J3-\x88K\xa9;&\x17\xaeM\x85\xa1H\x9b\xeaG\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xa3\xe0Q\xfbtJ\xa3A\f;\x88\xf8\x99\xf5\xd5\u007f\x16\x8d\xf1-\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4\xa3\xe3\xa6\xeaP\x95s\xe2\x1b\xd0#\x9e\xce\x05#\xa7\xb7\u061b/\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xa3\xf4\xad\x14\xe0\xbbD\xe2\xce,\x145\x9cu\xb8\xe72\xd3pT\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa3\xfa\xccP\x19\\\vI3\xc8X\x97\xfe\xcc[\xbd\x99\\4\xb8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa4\x03Z\xb1\xe5\x18\b!\xf0\xf3\x80\xf1\x13\x1bs\x87\xc8\u0641\u0349\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa4\n\xa2\xbb\xce\fr\xb4\xd0\xdf\xff\xccBq[+T\xb0\x1b\xfa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa4\x19\xa9\x84\x14#c&uuV`\x894\x0e\xea\x0e\xa2\b\x19\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\xa4!\u06f8\x9b:\aA\x90\x84\xad\x10\xc3\xc1]\xfe\x9b2\xd0\u008a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa4\"\xe4\xbf\v\xf7AG\u0309[\xed\x8f\x16\xd3\xce\xf3BaT\x89\x12\xef?b\xee\x116\x80\x00\u07d4\xa4%\x9f\x83E\xf7\u3a37+\x0f\xec,\xf7^2\x1f\xdaM\u0089g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xa4)\b\xe7\xfeS\x98\n\x9a\xbf@D\xe9W\xa5Kp\u973e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa4)\xfa\x88s\x1f\xdd5\x0e\x8e\xcdn\xa5B\x96\xb6HO\u6549j\xc5\xc6-\x94\x86\a\x00\x00\xe0\x94\xa40\x99]\xdb\x18[\x98e\xdb\xe6%9\xad\x90\xd2.Ks\u008a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa46\xc7TS\xcc\xcaJ\x1f\x1bb\xe5\u0123\r\x86\xdd\xe4\xbeh\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa47\xfen\xc1\x03\u028d\x15\x8fc\xb34\"N\u032c[>\xa3\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa4;m\xa6\xcbz\xacW\x1d\xff'\xf0\x9d9\xf8F\xf57i\xb1\x89\x14\x99\x8f2\xacxp\x00\x00\u07d4\xa4;\x81\xf9\x93V\xc0\xaf\x14\x1a\x03\x01\rw\xbd\x04,q\xc1\xee\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa4>\x19G\xa9$+5Ua\xc3\n\x82\x9d\xfe\uc881Z\xf8\x89\xd2=\x99\x96\x9f\u0591\x80\x00\u07d4\xa4H\x9aP\xea\xd5\xd5DZ{\xeeM-U6\u00a7lA\xf8\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa4O\xe8\x00\xd9o\xca\xd7;qp\xd0\xf6\x10\u02cc\x06\x82\xd6\u0389\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa4T2\xa6\xf2\xac\x9dVW{\x93\x8a7\xfa\xba\xc8\xcc|F\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa4f\xd7p\u0618\xd8\xc9\xd4\x05\xe4\xa0\xe5Q\xef\xaf\xcd\xe5<\xf9\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\xe0\x94\xa4g\a1\x17X\x93\xbb\xcf\xf4\xfa\x85\u0397\xd9O\xc5\x1cK\xa8\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa4kC\x87\xfbM\xcc\xe0\x11\xe7nMsT}D\x81\xe0\x9b\xe5\x89Hz\x9a0E9D\x00\x00\u07d4\xa4l\xd27\xb6>\xeaC\x8c\x8e;e\x85\xf6y\xe4\x86\b2\xac\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa4wy\u063c\x1c{\xce\x0f\x01\x1c\xcb9\xefh\xb8T\xf8\u078f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa4\x82kl8\x82\xfa\xd0\xed\\\x8f\xbb%\xcc@\xccO3u\x9f\x89p\x1bC\xe3D3\xd0\x00\x00\u07d4\xa4\x87Y(E\x8e\xc2\x00]\xbbW\x8c\\\xd35\x80\xf0\xcf\x14R\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa4\x9fR:\xa5\x13d\xcb\xc7\u0655\x16=4\xebY\r\xed/\b\x89\x90'B\x1b*\x9f\xbc\x00\x00\u07d4\xa4\xa4\x9f\v\xc8h\x8c\xc9\xe6\xdc\x04\xe1\xe0\x8dR\x10&\xe6Ut\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa4\xa7\xd3\x06\xf5\x10\xcdX5\x94(\xc0\xd2\xf7\xc3`\x9dVt\u05c9\xb5\x8c\xb6\x1c<\xcf4\x00\x00\u07d4\xa4\xa8:\a8y\x9b\x97\x1b\xf2\xdep\x8c.\xbf\x91\x1c\xa7\x9e\xb2\x89 \x86\xac5\x10R`\x00\x00\u07d4\xa4\xb0\x9d\xe6\xe7\x13\xdciTnv\xef\n\xcf@\xb9O\x02A\xe6\x89\x11}\xc0b~\xc8p\x00\x00\xe0\x94\xa4\u04b4)\xf1\xadSI\xe3\x17\x04\x96\x9e\xdc_%\xee\x8a\xca\x10\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xa4\xd6\xc8.\u076eYG\xfb\xe9\xcd\xfb\xd5H\xae3\xd9\x1aq\x91\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa4\xda4E\r\"\xec\x0f\xfc\xed\xe0\x00K\x02\xf7\x87.\xe0\xb7:\x89\x05\x0fafs\xf0\x83\x00\x00\xe0\x94\xa4\xddY\xab^Q}9\x8eI\xfaS\u007f\x89\x9f\xedL\x15\xe9]\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa4\xe6#E\x1e~\x94\xe7\u86e5\xed\x95\u0228:b\xff\xc4\xea\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa4\xed\x11\xb0r\u061f\xb16u\x9f\u019bB\x8cH\xaa]L\xed\x89\x0e?\x15'\xa0<\xa8\x00\x00\u07d4\xa4\xfb\x14@\x9ag\xb4V\x88\xa8Y>\\\xc2\xcfYl\xedo\x11\x89a\t=|,m8\x00\x00\xe0\x94\xa5\x14\xd0\x0e\xddq\b\xa6\xbe\x83\x9ac\x8d\xb2AT\x18\x17A\x96\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\xe0\x94\xa5\"\xde~\xb6\xae\x12PR*Q13\xa9;\xd4(IG\\\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa5$\xa8\xcc\xccIQ\x8d\x17\n2\x82p\xa2\xf8\x813\xfb\xaf]\x89\x0f\xf7\x02-\xac\x10\x8a\x00\x00\u07d4\xa59\xb4\xa4\x01\xb5\x84\xdf\xe0\xf3D\xb1\xb4\"\xc6UC\x16~.\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xa5>\xadT\xf7\x85\n\xf2\x148\xcb\xe0z\xf6\x86'\x9a1[\x86\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa5C\xa0f\xfb2\xa8f\x8a\xa0sj\f\x9c\xd4\rx\t\x87'\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa5gw\vj\xe3 \xbd\xdeP\xf9\x04\xd6c\xe7F\xa6\x1d\xac\xe6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa5h\xdbMW\xe4\xd6tb\xd73\u019a\x9e\x0f\xe2n!\x83'\x89;k\xff\x92f\xc0\xae\x00\x00\u07d4\xa5i\x8059\x1eg\xa4\x90\x13\xc0\x00 yY1\x14\xfe\xb3S\x89\r\x02\xabHl\xed\xc0\x00\x00\u07d4\xa5p\":\xe3\u02a8QA\x8a\x98C\xa1\xacU\xdbH$\xf4\xfd\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa5s`\xf0\x02\xe0\xd6M-tE}\x8c\xa4\x85~\xe0\v\xcd\u07c9\x123\xe22\xf6\x18\xaa\x00\x00\u07d4\xa5u\xf2\x89\x1d\xcf\u0368<\\\xf0\x14t\xaf\x11\xee\x01\xb7-\u0089\x05l\xd5_\xc6M\xfe\x00\x00\u07d4\xa5x;\xf342\xff\x82\xacI\x89\x85\xd7\xd4`\xaeg\xec6s\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xa5\x87MuF5\xa7b\xb3\x81\xa5\xc4\u01d2H:\xf8\xf2=\x1d\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\xa5\xa4\"\u007fl\xf9\x88%\xc0\u057a\xffS\x15u,\xcc\x1a\x13\x91\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa5\xabK\xd3X\x8fF\xcb'.V\xe9=\xee\u04c6\xba\x8bu=\x89HB\xf0A\x05\x87,\x80\x00\xe0\x94\xa5\xba\xd8e\t\xfb\xe0\xe0\xe3\xc0\xe9?m8\x1f\x1a\xf6\xe9\u0501\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xa5\xc36\b;\x04\xf9G\x1b\x8cn\xd76y\xb7Mf\xc3c\uc263e\nL\x9d \xe2\x00\x00\u07d4\xa5\xcd\x129\x92\x19K4\xc4x\x13\x140;\x03\xc5IH\xf4\xb9\x89l\xfc\xc3\xd9\x1d\xa5c\x00\x00\u07d4\xa5\u0578\xb6-\x00-\xef\x92A7\x10\xd1;o\xf8\xd4\xfc}\u04c9\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xa5\xd9ni}F5\x8d\x11\x9a\xf7\x81\x9d\xc7\b\u007fj\xe4\u007f\xef\x8a\x03\x17\xbe\xe8\xaf3\x15\xa7\x80\x00\u07d4\xa5\xde^CO\xdc\xddh\x8f\x1c1\xb6\xfbQ,\xb1\x96rG\x01\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xa5\xe0\xfc<:\xff\xed=\xb6q\tG\xd1\xd6\xfb\x01\u007f>'m\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa5\xe9;I\xea|P\x9d\xe7\xc4Ml\xfe\xdd\xefY\x10\u07aa\xf2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa5\xe9\xcdKt%]\"\xb7\u0672z\xe8\xddC\xedn\xd0%+\x89)\x8d\xb2\xf5D\x11\u0640\x00\xe0\x94\xa5\xf0\a{5\x1flP\\\xd5\x15\u07e6\xd2\xfa\u007f\\L\u0487\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xa5\xf0u\xfd@\x135W{f\x83\u0081\xe6\xd1\x01C-\xc6\xe0\x89\x91Hx\xa8\xc0^\xe0\x00\x00\u07d4\xa5\xfe,\xe9\u007f\x0e\x8c8V\xbe\r\xe5\xf4\u0732\xce]8\x9a\x16\x89\x01=\xb0\xb8\xb6\x86>\x00\x00\u07d4\xa5\xffb\"-\x80\xc0\x13\xce\xc1\xa0\xe8\x85\x0e\xd4\xd3T\xda\xc1m\x89\vA\a\\\x16\x8b\x18\x00\x00\u07d4\xa6\t\xc2m\xd3P\xc25\xe4K+\x9c\x1d\xdd\xcc\u0429\xd9\xf87\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa6\f\x12\tuO]\x87\xb1\x81\xdaO\b\x17\xa8\x18Y\xef\x9f\u0609\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\xe0\x94\xa6\x10\x1c\x96\x1e\x8e\x1c\x15y\x8f\xfc\xd0\xe3 \x1dw\x86\xec7:\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xa6\x13Ei\x96@\x8a\xf1\xc2\xe9>\x17w\x88\xabU\x89^+2\x8a\x01Y\x19\xffG|\x88\xb8\x00\x00\u07d4\xa6\x18\x87\x81\x8f\x91J \xe3\x10w)\v\x83qZk-n\xf9\x89e\xea=\xb7UF`\x00\x00\u07d4\xa6\x1aT\xdfxJD\xd7\x1bw\x1b\x871u\t!\x13\x81\xf2\x00\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa6\x1c\u06ed\xf0K\x1eT\u0203\xde`\x05\xfc\xdf\x16\xbe\xb8\xeb/\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa69\xac\xd9k1\xbaS\xb0\u0407c\"\x9e\x1f\x06\xfd\x10^\x9d\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa6BP\x10\x04\xc9\x0e\xa9\xc9\xed\x19\x98\xba\x14\nL\xd6,o_\x89\r\x94\xfb\x8b\x10\xf8\xb1\x80\x00\u07d4\xa6D\xed\x92,\xc27\xa3\xe5\u0117\x9a\x99Tw\xf3nP\xbcb\x89\x1f\xa7=\x84]~\x96\x00\x00\u07d4\xa6F\xa9\\moY\xf1\x04\xc6T\x1dw`uz\xb3\x92\xb0\x8c\x89\u3bb5sr@\xa0\x00\x00\xe0\x94\xa6HL\u0184\xc4\xc9\x1d\xb5>\xb6\x8aM\xa4Zjk\xda0g\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xa6N_\xfbpL,\x919\xd7~\xf6\x1d\x8c\u07e3\x1dz\x88\xe9\x89\a\xc0\x86\x0eZ\x80\xdc\x00\x00\xe0\x94\xa6T&\xcf\xf3x\xed#%5\x13\xb1\x9fIm\xe4_\xa7\u13ca\x01\x86P\x12|\xc3\u0700\x00\x00\u07d4\xa6jIc\xb2\u007f\x1e\xe1\x93+\x17+\xe5\x96N\r:\xe5KQ\x89\t`\xdbwh\x1e\x94\x00\x00\u07d4\xa6\u007f8\x81\x95eB:\xa8_>:\xb6\x1b\xc7c\u02eb\x89\u0749sw\xb0\"\u01be\b\x00\x00\u07d4\xa6\x8c14E\xc2-\x91\x9e\xe4l\xc2\xd0\xcd\xff\x04:uX%\x89\x04\x13t\xfd!\xb0\u0600\x00\u07d4\xa6\x8e\f0\u02e3\xbcZ\x88>T\x03 \xf9\x99\xc7\xcdU\x8e\\\x89a\x9237b\xa5\x8c\x80\x00\u07d4\xa6\x90\xf1\xa4\xb2\n\xb7\xba4b\x86 \u079c\xa0@\xc4<\x19c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa6\x9d|\xd1}HB\xfe\x03\xf6*\x90\xb2\xfb\xf8\xf6\xaf{\xb3\x80\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa6\xa0\x82R\xc8YQw\xcc.`\xfc'Y>#y\xc8\x1f\xb1\x89\x01\x16Q\xac>zu\x80\x00\u07d4\xa6\xa0\xdeB\x1a\xe5Om\x17(\x13\b\xf5dm/9\xf7w]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa6\xb2\xd5s)s`\x10,\a\xa1\x8f\xc2\x1d\xf2\xe7I\x9f\xf4\xeb\x89\xd9o\u0390\u03eb\xcc\x00\x00\xe0\x94\xa6\xc9\x10\xceMIJ\x91\x9c\u036a\xa1\xfc;\x82\xaat\xba\x06\u03ca\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xa6\u3ea3\x8e\x10J\x1e'\xa4\xd8(i\xaf\xb1\xc0\xaen\xff\x8d\x89\x01\x11@\ueb4bq\x00\x00\u07d4\xa6\xee\xbb\xe4d\u04d1\x87\xbf\x80\u029c\x13\xd7 '\xec[\xa8\xbe\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xa6\xf6+\x8a=\u007f\x11\"\a\x01\xab\x9f\xff\xfc\xb3'\x95\x9a'\x85\x89\x1bn)\x1f\x18\u06e8\x00\x00\u07d4\xa6\xf93\a\xf8\xbc\xe01\x95\xfe\u0387 C\xe8\xa0?{\xd1\x1a\x89\x9csK\xadQ\x11X\x00\x00\u07d4\xa7\x01\xdfy\xf5\x94\x90\x1a\xfe\x14DH^k \u00fd\xa2\xb9\xb3\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa7\x02L\xfdt,\x1e\xc1<\x01\xfe\xa1\x8d0B\xe6_\x1d]\xee\x8a\x02c\x11\x9a(\xab\u0430\x80\x00\u07d4\xa7\x18\xaa\xadY\xbf9\\\xba+#\xe0\x9b\x02\xfe\f\x89\x81bG\x8960<\x97\xe4hx\x00\x00\u07d4\xa7$|S\xd0Y\xeb|\x93\x10\xf6(\xd7\xfclj\nw?\b\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xa7%7c\xcfJu\u07d2\xca\x1evm\xc4\xee\x8a'E\x14{\x8a\x02F7p\xe9\n\x8fP\x00\x00\u07d4\xa7.\xe6f\u0133^\x82\xa5\x06\x80\x8bD<\xeb\xd5\xc62\xc7\u0749+^:\xf1k\x18\x80\x00\x00\u07d4\xa7DD\xf9\x0f\xbbT\xe5o:\u0276\xcf\u032aH\x19\xe4aJ\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa7GC\x9a\xd0\u04d3\xb5\xa08a\xd7r\x962m\u8edd\xb9\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xa7`{BW;\xb6\xf6\xb4\xd4\xf2<~*&\xb3\xa0\xf6\xb6\xf0\x89WG=\x05\u06ba\xe8\x00\x00\xe0\x94\xa7i)\x89\n{G\xfb\x85\x91\x96\x01lo\u0742\x89\u03b7U\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u0794\xa7kt?\x98\x1bi0r\xa11\xb2+\xa5\x10\x96\\/\xef\u05c8\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xa7m?\x15bQ\xb7,\f\xcfKG\xa39<\xbdoI\xa9\u0149Hz\x9a0E9D\x00\x00\u07d4\xa7t(\xbc\xb2\xa0\xdbv\xfc\x8e\xf1\xe2\x0eF\x1a\n2\u016c\x15\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\xa7u\x8c\xec\xb6\x0e\x8faL\u0396\x13~\xf7+O\xbd\awJ\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa7w^J\xf6\xa2:\xfa \x1f\xb7\x8b\x91^Q\xa5\x15\xb7\xa7(\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4\xa7\u007f>\u1793\x88\xbb\xbb\"\x15\xc6#\x97\xb9e`\x13#`\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xa7\x85\x9f\xc0\u007fun\xa7\xdc\xeb\xbc\xcdB\xf0X\x17X-\x97?\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa7\x96lH\x9fLt\x8az\u902a'\xa5t%\x17g\xca\xf9\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xa7\xa3\xbba9\xb0\xad\xa0\f\x1f\u007f\x1f\x9fV\u0654\xbaM\x1f\xa8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa7\xa3\xf1S\xcd\u00c8!\xc2\f]\x8c\x82A\xb2\x94\xa3\xf8+$\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa7\xa5\x17\u05ed5\x82\v\t\u0517\xfa~U@\xcd\xe9IXS\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xa7\xc9\u04c8\xeb\xd8s\xe6k\x17\x13D\x83\x97\xd0\xf3\u007f\x8b\u04e8\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xa7\u073b\xa9\xb9\xbfgb\xc1EAlPjq\u3d17 \x9c\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xa7\xe7O\v\xdb'\x8f\xf0\xa8\x05\xa6Ha\x8e\xc5+\x16o\xf1\xbe\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa7\xe87r\xbc \x0f\x90\x06\xaa*&\r\xba\xa8H=\xc5+0\x89\vB\xd56f7\xe5\x00\x00\xe0\x94\xa7\xef5\u0387\xed\xa6\u008d\xf2HxX\x15\x05>\xc9zPE\x8a\x01\x0f\f\xe9I\xe0\x0f\x93\x00\x00\u07d4\xa7\xf9\"\f\x80G\x82k\xd5\xd5\x18?Ngjmw\xbf\xed6\x89\bPh\x97k\xe8\x1c\x00\x00\u07d4\xa8\a\x10O'\x03\xd6y\xf8\u07af\xc4B\xbe\xfe\x84\x9eB\x95\v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa8\f\xb1s\x8b\xac\b\xd4\xf9\xc0\x8bM\xef\xf5\x15T_\xa8XO\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa8\x19\xd2\xec\xe1\"\xe0(\xc8\xe8\xa0J\x06M\x02\xb9\x02\x9b\b\xb9\x8965\u026d\xc5\u07a0\x00\x00\u0794\xa8%\xfdZ\xbby&\xa6|\xf3k\xa2F\xa2K\xd2{\xe6\xf6\xed\x88\xf4?\xc2\xc0N\xe0\x00\x00\u07d4\xa8(U9\x86\x9d\x88\xf8\xa9aS7Uq}~\xb6Uv\xae\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xa83\x82\xb6\xe1Rg\x97J\x85P\xb9\x8fqv\xc1\xa3S\xf9\xbe\x89\xbf\xfd\xaf/\xc1\xb1\xa4\x00\x00\xe0\x94\xa8DlG\x81\xa77\xacC(\xb1\xe1[\x8a\v?\xbb\x0f\xd6h\x8a\x04\x87\x94\xd1\xf2F\x19*\x00\x00\u07d4\xa8E[A\x17e\u0590\x1e1\x1erd\x03\t\x1eB\xc5f\x83\x89\xb7:\xec;\xfe\x14P\x00\x00\xe0\x94\xa8f\x13\xe6\u0124\xc9\xc5_\\\x10\xbc\xda2\x17]\u02f4\xaf`\x8a\x02C\xd6\xc2\xe3k\xe6\xae\x00\x00\u07d4\xa8m\xb0}\x9f\x81/G\x96b-@\xe0=\x13Xt\xa8\x8at\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa8\u007fz\xbdo\xa3\x11\x94(\x96x\xef\xb6<\xf5\x84\xee^*a\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xa8\x80\u2a3f\x88\xa1\xa8&H\xb4\x01W\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa8\x9d\xf3HY\xed\xd7\xc8 \u06c8w@\xd8\xff\x9e\x15\x15|{\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa8\xa4<\x00\x91\x00al\xb4\xaeN\x03?\x1f\xc5\xd7\xe0\xb6\xf1R\x89\u0548\xd0x\xb4?M\x80\x00\u07d4\xa8\xa7\b\xe8O\x82\u06c6\xa3U\x02\x19;Ln\xe9\xa7n\xbe\x8f\x897\b\xba\xed=h\x90\x00\x00\xe0\x94\xa8\xa7\xb6\x8a\u06b4\xe3\xea\xdf\xf1\x9f\xfaX\xe3J?\xce\xc0\xd9j\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xa8\xa8\xdb\xdd\x1a\x85\u047e\xee%i\xe9\x1c\xccM\t\xae\u007fn\xa1\x8a\x01:k+VHq\xa0\x00\x00\u07d4\xa8\xac\xa7H\xf9\xd3\x12\xect\u007f\x8bex\x14&\x94\xc7\xe9\xf3\x99\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa8\xb6[\xa3\x17\x1a?w\xa65\v\x9d\xaf\x1f\x8dU\xb4\xd2\x01\xeb\x89(b\xf3\xb0\xd2\"\x04\x00\x00\u07d4\xa8\xbe\xb9\x1c+\x99\u0216J\xa9[kJ\x18K\x12i\xfc4\x83\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u0794\xa8\xc0\xb0/\xaf\x02\xcbU\x19\u0768\x84\xde{\xbc\x8c\x88\xa2\u0681\x88\xe7\xc2Q\x85\x05\x06\x00\x00\u07d4\xa8\xc1\u05aaA\xfe=e\xf6{\xd0\x1d\xe2\xa8f\xed\x1e\u066eR\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4\xa8\xca\xfa\xc3\"\x80\xd0!\x02\v\xf6\xf2\xa9x(\x83\u05ea\xbe\x12\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xa8\xdb\v\x9b \x14S3A<;\fb\xf5\xf5.\u0544\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa8\xf3\u007f\n\xb3\xa1\xd4H\xa9\xe3\xce@\x96_\x97\xa6F\b:4\x89\x11\xe0\xe4\xf8\xa5\v\xd4\x00\x00\u07d4\xa8\xf8\x9d\xd5\xccnd\u05f1\xee\xac\xe0\a\x02\x02,\xd7\xd2\xf0=\x89%\xf2s\x93=\xb5p\x00\x00\xe0\x94\xa9\x04v\xe2\xef\xdf\xeeO8{\x0f2\xa5\x06x\xb0\xef\xb5s\xb5\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa9\x14PF\xfa6(\xcf_\xd4\xc6\x13\x92{\xe51\xe6\xdb\x1f\u0749\x06\x12O\xee\x99;\xc0\x00\x00\u07d4\xa9\x14\u0375q\xbf\xd9=d\xdaf\xa4\xe1\b\xea\x13NP\xd0\x00\x89M\x878\x99G\x13y\x80\x00\xe0\x94\xa9\x1aZ{4\x1f\x99\xc55\x14N \xbe\x9ck;\xb4\u008eM\x8a\x01&u:\xa2$\xa7\v\x00\x00\u07d4\xa9%%Q\xa6$\xaeQ7\x19\u06beR\a\xfb\xef\xb2\xfdwI\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xa9'\u050b\xb6\u02c1K\xc6\t\xcb\u02a9\x15\x1f]E\x9a'\xe1\x89\x0e\xb95\t\x00d\x18\x00\x00\u07d4\xa9)\u023dq\xdb\f0\x8d\xac\x06\b\n\x17G\xf2\x1b\x14e\xaa\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xa9K\xbb\x82\x14\u03cd\xa0\xc2\xf6h\xa2\xacs\xe8bHR\x8dK\x894\n\xad!\xb3\xb7\x00\x00\x00\u07d4\xa9Q\xb2D\xffP\u03eeY\x1d^\x1a\x14\x8d\xf6\xa98\xef*\x1a\x89^\x00\x15\x84\xdf\xcfX\x00\x00\u07d4\xa9`\xb1\xca\xdd;\\\x1a\x8el\xb3\xab\xca\xf5.\xe7\xc3\xd9\xfa\x88\x89R\x8b\xc3T^Rh\x00\x00\u07d4\xa9a\x17\x1fSB\xb1s\xddp\xe7\xbf\xe5\xb5\xca#\x8b\x13\xbc\u0749\xb8'\x94\xa9$O\f\x80\x00\u07d4\xa9u\xb0w\xfc\xb4\u030e\xfc\xbf\x83\x84Y\xb6\xfa$:AY\u0589\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xa9{\xeb:H\xc4_\x15((L\xb6\xa9_}\xe4S5\x8e\u018a\x06\x90\x83l\n\xf5\xf5`\x00\x00\u07d4\xa9~\a!DI\x9f\xe5\xeb\xbd5J\xcc~~\xfbX\x98]\b\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xa9\x86v/zO)O.\v\x172y\xad,\x81\xa2\"4X\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xa9\x8f\x10\x985\xf5\xea\xcd\x05Cd|4\xa6\xb2i\xe3\x80/\xac\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xa9\x97\xdf\u01d8j'\x05\bH\xfa\x1cd\u05e7\xd6\xe0z\u0322\x89\a\xc0\x86\x0eZ\x80\xdc\x00\x00\u07d4\xa9\x99\x91\u03bd\x98\xd9\xc88\xc2_zt\x16\xd9\xe2D\xca%\r\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xa9\xa1\xcd\xc3;\xfd7o\x1c\rv\xfbl\x84\xb6\xb4\xac'Mh\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xa9\xa8\xec\xa1\x1a#\xd6F\x89\xa2\xaa>A}\xbb=3k\xb5\x9a\x89\x0e4S\xcd;g\xba\x80\x00\u07d4\xa9\xac\xf6\x00\b\x1b\xb5[\xb6\xbf\xba\xb1\x81_\xfcN\x17\xe8Z\x95\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xa9\xad\x19&\xbcf\xbd\xb31X\x8e\xa8\x197\x88SM\x98,\x98\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4\xa9\xaf!\xac\xbeH/\x811\x89j\"\x806\xbaQ\xb1\x94S\u00c9\x02\xb5\xe0!\x98\f\xc1\x80\x00\xe0\x94\xa9\xb2\xd2\xe0IN\xab\x18\xe0}7\xbb\xb8V\xd8\x0e\x80\xf8L\u04ca\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xa9\xbaoA;\x82\xfc\xdd\xf3\xaf\xfb\xbd\u0412\x87\xdc\xf5\x04\x15\u0289\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xa9\xbe\x88\xad\x1eQ\x8b\v\xbb\x02J\xb1\xd8\xf0\xe7?y\x0e\fv\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xa9\xbf\xc4\x10\xdd\xdb q\x1eE\xc0s\x87\xea\xb3\n\x05N\x19\xac\x89>\x99`\x1e\xdfNS\x00\x00\u07d4\xa9\u0522\xbc\xbe[\x9e\bi\xd7\x0f\x0f\xe2\xe1\u05aa\xcdE\xed\u0149\n\xc6\xe7z\xb6c\xa8\x00\x00\xe0\x94\xa9\xd6KO;\xb7\x85\a\"\xb5\x8bG\x8b\xa6\x917^\"NB\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xa9\xd6\xf8q\xcax\x1au\x9a \xac:\u06d7,\xf1()\xa2\b\x892$\xf4'#\xd4T\x00\x00\xe0\x94\xa9\xdc\x04$\u0196\x9dy\x83X\xb3\x93\xb1\x93:\x1fQ\xbe\xe0\n\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xa9\xe1\x94f\x1a\xacpN\xe9\u07a0C\x97N\x96\x92\xde\xd8J]\x89\x1a&\xa5\x14\"\xa0p\x00\x00\u07d4\xa9\xe2\x837\xe65q\x93\xd9\xe2\xcb#k\x01\xbeD\xb8\x14'\u07c9wC\"\x17\xe6\x83`\x00\x00\u07d4\xa9\xe6\xe2^ekv%Xa\x9f\x14z!\x98[\x88t\xed\xfe\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xa9\xe9\xdb\xcez,\xb06\x94y\x98\x97\xbe\xd7\xc5M\x15_\u06a8\x89\n\xb5\xae\x8f\u025de\x80\x00\u07d4\xa9\xed7{}n\xc2Yq\xc1\xa5\x97\xa3\xb0\xf3\xbe\xadW\u024f\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xaa\x02\x00\xf1\xd1~\x9cT\xda\x06G\xbb\x969]W\xa7\x858\u06099>\xf1\xa5\x12|\x80\x00\x00\u07d4\xaa\f\xa3ss7\x17\x8a\f\xaa\xc3\t\x9cXK\x05lV0\x1c\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\xaa\x13kG\x96+\xb8\xb4\xfbT\r\xb4\xcc\xf5\xfd\xd0B\xff\xb8\u03c9\x1b\x1bk\u05efd\xc7\x00\x00\xe0\x94\xaa\x14B-o\n\xe5\xa7X\x19N\xd1W\x80\xc88\xd6\u007f\x1e\xe1\x8a\x06\t2\x05lD\x9d\xe8\x00\x00\u07d4\xaa\x16&\x9a\xac\x9c\r\x800h\xd8/\u01d1Q\xda\xdd3Kf\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xaa\x16p&\u04da\xb7\xa8V5\x94N\xd9\xed\xb2\xbf\xeb\xa1\x18P\x8a\x01\xc1\xd5\xe2\x1bO\xcfh\x00\x00\u07d4\xaa\x1b7h\xc1m\x82\x1fX\x0ev\xc8\xe4\xc8\xe8m}\u01c8S\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xaa\x1d\xf9.Q\xdf\xf7\v\x19s\xe0\xe9$\xc6b\x87\xb4\x94\xa1x\x89\x1c\xf8J0\xa0\xa0\xc0\x00\x00\u07d4\xaa,g\x00\x96\xd3\xf990S%B~\xb9U\xa8\xa6\r\xb3\u0149l\x95Y\x06\x99#-\x00\x00\u07d4\xaa15\xcbT\xf1\x02\xcb\xef\xe0\x9e\x96\x10:\x1ayg\x18\xffT\x89\x03\"\"\xd9\xc31\x94\x00\x00\u07d4\xaa2\x1f\xdb\xd4I\x18\r\xb8\xdd\xd3O\x0f\xe9\x06\xec\x18\xee\t\x14\x89%\"H\u07b6\xe6\x94\x00\x00\xe0\x94\xaa9%\xdc\"\v\xb4\xae!w\xb2\x880x\xb6\xdc4l\xa1\xb2\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xaa?)`\x1a\x131t^\x05\xc4(0\xa1^q\x93\x8ab7\x89\\(=A\x03\x94\x10\x00\x00\xe0\x94\xaaG\xa4\xff\xc9y622\u025b\x99\xfa\xda\x0f'4\xb0\xae\xee\x8a\x01\xb8H\x9d\xf4\xdb\xff\x94\x00\x00\u07d4\xaaI=?O\xb8fI\x1c\xf8\xf8\x00\xef\xb7\xe22N\xd7\xcf\xe5\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xaaV\xa6]\u012b\xb7/\x11\xba\xe3+o\xbb\aDG\x91\xd5\u0249(\x94\xe9u\xbfIl\x00\x00\xe0\x94\xaaZ\xfc\xfd\x83\t\xc2\u07dd\x15\xbe^jPN}pf$\u014a\x01<\xf4\"\xe3\x05\xa17\x80\x00\u07d4\xaa\x8e\xb0\x82;\a\xb0\xe6\xd2\n\xad\xda\x0e\x95\xcf85\xbe\x19.\x89\x01\xbc\x16\xd6t\xec\x80\x00\x00\u07d4\xaa\x91#~t\r%\xa9/\u007f\xa1F\xfa\xa1\x8c\xe5m\xc6\xe1\xf3\x892$\xf4'#\xd4T\x00\x00\u07d4\xaa\x96\x0e\x10\xc5#\x91\xc5N\x158|\xc6z\xf8'\xb51m\u0309lk\x93[\x8b\xbd@\x00\x00\u07d4\xaa\x9b\xd4X\x955\xdb'\xfa+\xc9\x03\xca\x17\xd6y\xddeH\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaa\xa8\xde\xfe\x11\xe3a?\x11\x06\u007f\xb9\x83bZ\b\x99Z\x8d\xfc\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xaa\xaa\xe6\x8b2\x14\x02\xc8\xeb\xc14h\xf3A\xc6<\f\xf0?\u0389Rf<\u02b1\xe1\xc0\x00\x00\u07d4\xaa\xad\x1b\xaa\xdeZ\xf0N+\x17C\x9e\x93Y\x87\xbf\x8c+\xb4\xb9\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xaa\xb0\n\xbfX(\xd7\xeb\xf2kG\u03ac\u0378\xba\x032Qf\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xaa\xbd\xb3\\\x15\x14\x98J\x03\x92\x13y?3E\xa1h\xe8\x1f\xf1\x89\x10\xca\u0216\xd29\x00\x00\x00\u07d4\xaa\xca`\xd9\xd7\x00\u7156\xbb\xbb\xb1\xf1\xe2\xf7\x0fF'\xf9\u060965\xbbw\xcbK\x86\x00\x00\u07d4\xaa\xce\u0629V;\x1b\xc3\x11\xdb\xdf\xfc\x1a\xe7\xf5u\x19\xc4D\f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaa\u04b7\xf8\x10f\x95\a\x8el\x13\x8e\xc8\x1at\x86\xaa\xca\x1e\xb2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xaa\xe6\x1eC\xcb\r\f\x96\xb3\x06\x99\xf7~\x00\xd7\x11\u0423\x97\x9b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xaa\xe72\xed\xa6Y\x88\u00e0\f\u007fG/5\x1cF;\x1c\x96\x8e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaa\xf0#\xfe\U0009091b\xb7\x8b\xb7\xab\xc9]f\x9cP\xd5(\xb0\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xaa\xf5\xb2\a\xb8\x8b\r\xe4\xac@\xd7G\xce\xe0n\x17-\xf6\xe7E\x8a\x06\xa7\xb7\x1d\u007fQ\u0410\x00\x00\u07d4\xaa\xf9\xeeK\x88lm\x1e\x95Io\xd2t#[\xf4\xec\xfc\xb0}\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xaa\xfb{\x01:\xa1\xf8T\x1c~2{\xf6P\xad\xbd\x19L \x8f\x89I\x9e\t-\x01\xf4x\x00\x00\xe0\x94\xab\t\x863\xee\xee\f\xce\xfd\xf62\xf9WTV\xf6\u0740\xfc\x86\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xab\f\xedv.\x16a\xfa\xe1\xa9*\xfb\x14\b\x88\x94\x13yH%\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94\xab\x14\xd2!\xe3=TF)\x19\x8c\u0416\xedc\u07e2\x8d\x9fG\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xab \x9f\u0729y\u0426G\x01\n\xf9\xa8\xb5/\xc7\xd2\r\x8c\u044a\x01\xee\xe2S,|-\x04\x00\x00\u07d4\xab'\xbax\xc8\xe5\xe3\xda\xef1\xad\x05\xae\xf0\xff\x03%r\x1e\b\x89\x19^\xce\x00n\x02\xd0\x00\x00\u07d4\xab(q\xe5\a\u01fe9eI\x8e\x8f\xb4b\x02Z\x1a\x1cBd\x89*\x03I\x19\u07ff\xbc\x00\x00\u07d4\xab8a\"o\xfe\xc1(\x91\x87\xfb\x84\xa0\x8e\xc3\xed\x042d\xe8\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xab=\x86\xbc\x82\x92~\f\xd4!\xd1F\xe0\u007f\x91\x93'\xcd\xf6\xf9\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94\xab>b\xe7z\x8b\"^A\x15\x92\xb1\xaf0\aR\xfeA$c\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xab>x)K\xa8\x86\xa0\xcf\xd5\xd3H\u007f\xb3\xa3\a\x8d3\x8dn\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xab@\x04\xc0@?~\xab\xb0\xeaXo!!V\xc4 =g\xf1\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xabAo\xe3\rX\xaf\xe5\xd9EL\u007f\xce\u007f\x83\v\xccu\x03V\x89\x0657\x01\xc6\x05\u06c0\x00\u07d4\xabEr\xfb\xb1\xd7+W]i\xecj\xd1s3\x87>\x85R\xfc\x89lj\xc5L\xdahG\x00\x00\u07d4\xabZy\x01av2\ts\xe8\xcd8\xf67U0\x02%1\xc0\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xab]\xfc\x1e\xa2\x1a\xdcB\u03cc?n6\x1e$?\xd0\xdaa\xe5\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xabke\xea\xb8\xdf\xc9\x17\xec\x02Q\xb9\xdb\x0e\u03e0\xfa\x03(I\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xabp\x91\x93.K\u00dd\xbbU#\x80\u0293O\xd7\x16m\x1en\x89\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\xabt\x16\xff2%IQ\u02fcbN\xc7\xfbE\xfc~\u02a8r\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\xab|B\xc5\xe5-d\x1a\a\xadu\t\x9cb\x92\x8b\u007f\x86b/\x89\x126\x1a\xa2\x1d\x14\xba\x00\x00\u07d4\xab}T\xc7\xc6W\x0e\xfc\xa5\xb4\xb8\xcep\xf5*Ws\xe5\xd5;\x89\x0f(:\xbe\x9d\x9f8\x00\x00\u07d4\xab~\v\x83\xed\x9aBLm\x1ejo\x87\xa4\xdb\xf0d\t\xc7\u0589\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\xab\x84\xa0\xf1G\xad&T\x00\x00+\x85\x02\x9aA\xfc\x9c\xe5\u007f\x85\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xab\x93\xb2n\xce\n\n\xa2\x13e\xaf\xed\x1f\xa9\xae\xa3\x1c\xd5Dh\x89W+{\x98sl \x00\x00\u07d4\xab\x94\x8aJ\xe3y\\\xbc\xa11&\xe1\x92S\xbd\xc2\x1d:\x85\x14\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xab\x9a\xd3n\\t\xce.\x969\x9fW\x83\x941\xd0\u77d6\xab\x89\b\xe3\xf5\v\x17<\x10\x00\x00\u07d4\xab\xb2\xe6\xa7*@\xban\xd9\b\u037c\xec\x91\xac\xfdwx0\xd1dcG\x8a\xe0\xfcw \x89\a?u\u0460\x85\xba\x00\x00\xe0\x94\xab\u071f\x1b\xcfM\x19\xee\x96Y\x100\xe7r\xc340/}\x83\x8a\b~^\x11\xa8\x1c\xb5\xf8\x00\x00\u07d4\xab\xde\x14{*\xf7\x89\ua946T~f\xc4\xfa&d\xd3(\xa4\x89\rk`\x81\xf3L\x12\x80\x00\xe0\x94\xab\xe0|\xedj\xc5\xdd\xf9\x91\xef\xf6\xc3\xda\"jt\x1b\xd2C\xfe\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xab\xf1/\xa1\x9e\x82\xf7lq\x8f\x01\xbd\xca\x00\x03gE#\xef0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xab\xf7(\u03d3\x12\xf2!(\x02NpF\xc2Q\xf5\xdcY\x01\xed\x8a\x06A\xe8\xa15c\xd8\xf8\x00\x00\u07d4\xab\xf8\xff\xe0p\x8a\x99\xb5(\xcc\x1e\xd4\xe9\xceK\r\x060\xbe\x8c\x89z\xb5\u00ae\xee\xe68\x00\x00\u07d4\xab\xfc\xf5\xf2P\x91\xceW\x87_\xc6t\xdc\xf1\x04\xe2\xa7=\xd2\xf2\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xab\xfe\x93d%\xdc\u01f7K\x95P\x82\xbb\xaa\xf2\xa1\x1dx\xbc\x05\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xac\x02OYO\x95X\xf0ICa\x8e\xb0\xe6\xb2\xeeP\x1d\xc2r\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xac\x12*\x03\xcd\x05\x8c\x12._\xe1{\x87/Hw\xf9\u07d5r\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4\xac\x14.\xda\x11W\xb9\xa9\xa6C\x90\xdf~j\xe6\x94\xfa\u0249\x05\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xac\x1d\xfc\x98Kq\xa1\x99)\xa8\x1d\x81\xf0J|\xbb\x14\a7\x03\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xac!\xc1\xe5\xa3\xd7\xe0\xb5\x06\x81g\x9d\xd6\u01d2\xdb\u0287\xde\u02ca\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\xac(\x89\xb5\x96o\f\u007f\x9e\xdbB\x89\\\xb6\x9d\x1c\x04\xf9#\xa2\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xac(\xb5\xed\xea\x05\xb7o\x8c_\x97\bEA'|\x96ijL\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xac,\x8e\t\xd0d\x93\xa68XC{\xd2\v\xe0\x19bE\x03e\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xac.vm\xac?d\x8fcz\xc6q?\u0770h\xe4\xa4\xf0M\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\xac9\x00)\x8d\xd1M|\xc9mJ\xbbB\x8d\xa1\xba\xe2\x13\xff\xed\x8a\x05<\xa1)t\x85\x1c\x01\x00\x00\u07d4\xac=\xa5&\xcf\u0388)s\x02\xf3LI\xcaR\r\xc2q\xf9\xb2\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xacD`\xa7nm\xb2\xb9\xfc\xd1R\xd9\xc7q\x8d\x9a\xc6\xed\x8co\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xacJ\xcf\xc3n\xd6\tJ'\xe1\x18\xec\xc9\x11\xcdG>\x8f\xb9\x1f\x89a\x91>\x14@<\f\x00\x00\u07d4\xacL\xc2V\xaet\xd6$\xac\xe8\r\xb0x\xb2 \u007fW\x19\x8fk\x89lyt\x12?d\xa4\x00\x00\u07d4\xacN\xe9\xd5\x02\xe7\xd2\xd2\xe9\x9eY\xd8\xca}_\x00\xc9KM\u058965\u026d\xc5\u07a0\x00\x00\u07d4\xacR\xb7~\x15fH\x14\xf3\x9eO'\x1b\xe6A0\x8d\x91\xd6\u0309\v\xed\x1d\x02c\xd9\xf0\x00\x00\u07d4\xacY\x99\xa8\x9d-\u0486\u0568\fm\xee~\x86\xaa\xd4\x0f\x9e\x12\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\xac_br1H\r\r\x950.m\x89\xfc2\xcb\x1dO\xe7\xe3\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xac`\x8e+\xac\x9d\xd2\a(\u0494~\xff\xbb\xbf\x90\n\x9c\xe9K\x8a\x01EK\r\xb3uh\xfc\x00\x00\u07d4\xacm\x02\xe9\xa4k7\x9f\xacJ\u0271\u05f5\xd4{\xc8P\xce\x16\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xacoh\xe87\xcf\x19a\xcb\x14\xabGDm\xa1h\xa1m\u0789\x89Hz\x9a0E9D\x00\x00\u07d4\xacw\xbd\xf0\x0f\u0558[]\xb1+\xbe\xf8\x008\n\xbc*\x06w\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xac~\x03p'#\xcb\x16\xee'\xe2-\u0438\x15\xdc-\\\xae\x9f\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\xac\x8bP\x9a\xef\xea\x1d\xbf\xaf+\xb35\x00\xd6W\vo\xd9mQ\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xac\x8e\x87\xdd\xda^x\xfc\xbc\xb9\xfa\u007f\xc3\xce\x03\x8f\x9f}.4\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xac\x9f\xffh\xc6\x1b\x01\x1e\xfb\xec\xf08\xedr\u06d7\xbb\x9er\x81\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xac\xa1\xe6\xbcd\xcc1\x80\xf6 \xe9M\u0171\xbc\xfd\x81X\xe4]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xac\xa2\xa883\v\x170-\xa71\xd3\r\xb4\x8a\x04\xf0\xf2\a\xc1\x89Hz\x9a0E9D\x00\x00\u07d4\xac\xaa\xdd\xcb\xf2\x86\xcb\x0e!]\xdaUY\x8f\u007f\xf0\xf4\xad\xa5\u018965\u026d\xc5\u07a0\x00\x00\u07d4\xac\xb9C8UK\u0108\u0308\xae-\x9d\x94\b\rk\u07c4\x10\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xac\xbc-\x19\xe0l;\xab\xbb[o\x05+k\xf7\xfc7\xe0r)\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xac\xbd\x18U\x89\xf7\xa6\x8ag\xaaK\x1b\xd6Pw\xf8\xc6NN!\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xac\xc0bp,Ya]4D\xefb\x14\xb8\x86+\x00\x9a\x02\xed\x89QO\xcb$\xff\x9cP\x00\x00\u07d4\xac\xc0\x90\x9f\xda.\xa6\xb7\xb7\xa8\x8d\xb7\xa0\xaa\xc8h\t\x1d\xdb\xf6\x89\x013v_\x1e&\u01c0\x00\u07d4\xac\xc1\u01c7\x86\xabM+;'q5\xb5\xba\x12>\x04\x00Hk\x89\x04E\x91\xd6\u007f\xec\xc8\x00\x00\u07d4\xac\xc4j*U\\t\xde\u0522\xbd\tN\x82\x1b\x97\x84;@\xc0\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xac\u015f;0\xce\xff\xc5da\xcc[\x8d\xf4\x89\x02$\x0e\x0e{\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xac\xce\x01\xe0\xa7\x06\x10\xdcp\xbb\x91\xe9\x92o\xa9\x95\u007f7/\xba\x89\x1d\x1c_>\xda \xc4\x00\x00\u07d4\xac\xd8\u0751\xf7\x14vLEg|c\xd8R\xe5n\xb9\xee\xce.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xac\u2af6;\x06\x04@\x9f\xbd\xe3\xe7\x16\u0487mD\xe8\xe5\u0749\b=lz\xabc`\x00\x00\xe0\x94\xac\xec\x91\xefiA\xcfc\v\xa9\xa3\u71e0\x12\xf4\xa2\xd9\x1d\u050a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4\xad\nJ\xe4x\xe9cn\x88\xc6\x04\xf2B\xcfT9\xc6\xd4V9\x89\xbe\xd1\xd0&=\x9f\x00\x00\x00\u07d4\xad\x17\x99\xaa\xd7`+E@\u0343/\x9d\xb5\xf1\x11P\xf1hz\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xad\x1dh\xa08\xfd%\x86\x06~\xf6\xd15\xd9b\x8ey\xc2\xc9$\x89\xfe\t\xa5'\x9e*\xbc\x00\x00\u07d4\xad*\\\x00\xf9#\xaa\xf2\x1a\xb9\xf3\xfb\x06n\xfa\n\x03\xde/\xb2\x8965\xbbw\xcbK\x86\x00\x00\u07d4\xad5e\xd5+h\x8a\xdd\xed\b\x16\x8b-8r\xd1}\n&\xae\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xad7|\xd2^\xb5>\x83\xae\t\x1a\n\x1d+E\x16\xf4\x84\xaf\u0789i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94\xadAM)\xcb~\xe9s\xfe\xc5N\"\xa3\x88I\x17\x86\xcfT\x02\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\xadD5~\x01~$OGi1\u01f8\x18\x9e\xfe\xe8\n]\n\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xadW\xaa\x9d\x00\xd1\fC\x9b5\xef\xcc\v\xec\xac.9U\xc3\x13\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xadY\xa7\x8e\xb9\xa7J\u007f\xbd\xae\xfa\xfa\x82\xea\u0684u\xf0\u007f\x95\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xadZ\x8dV\x01L\xfc\xb3`\xf4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xadr\x81!\x87?\x04V\xd0Q\x8b\x80\xabe\x80\xa2\x03pe\x95\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xads,\x97e\x93\xee\xc4x;N.\xcdy9yx\v\xfe\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xad}\xd0S\x85\x9e\xdf\xf1\xcbo\x9d*\xcb\xedm\xd5\xe32Bo\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xad\x80\xd8e\xb8\\4\xd2\xe6IK.z\xef\xeak\x9a\xf1\x84\u06c9\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xad\x8b\xfe\xf8\u018aH\x16\xb3\x91o5\xcb{\xfc\xd7\xd3\x04\tv\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xad\x8eH\xa3wi]\xe0\x146:R:(\xb1\xa4\fx\xf2\b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xad\x91\n#\u0585\x06\x13eJ\xf7\x863z\u04a7\bh\xacm\x89lh\xcc\u041b\x02,\x00\x00\u07d4\xad\x92~\x03\xd1Y\x9ax\xca+\xf0\xca\u04a1\x83\xdc\xebq\xea\xc0\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\xad\x92\xca\x06n\xdb|q\x1d\xfc[\x16a\x92\xd1\xed\xf8\xe7q\x85\x8a\a\x9f\x90\\o\xd3N\x80\x00\x00\u07d4\xad\x94#_\u00f3\xf4z$\x13\xaf1\u8111I\b\xef\fE\x89\x1b\x1b\x01B\xd8\x15\x84\x00\x00\u07d4\xad\x9e\x97\xa0H/5:\x05\xc0\xf7\x92\xb9w\xb6\xc7\xe8\x11\xfa_\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xad\x9fL\x89\n;Q\x1c\xeeQ\xdf\xe6\xcf\xd7\xf1\t;vA,\x89\x1bv|\xbf\xeb\f\xe4\x00\x00\u07d4\xad\xaa\x0eT\x8c\x03Z\xff\xedd\xcag\x8a\x96?\xab\xe9\xa2k\xfd\x89\x03\xcbq\xf5\x1f\xc5X\x00\x00\u07d4\xad\xb9H\xb1\xb6\xfe\xfe }\xe6^\x9b\xbc-\xe9\x8e`]\vW\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xad\xc1\x9e\xc85\xaf\xe3\u5347\u0713\xa8\xa9!<\x90E\x13&\x89j\xdb\xe54\"\x82\x00\x00\x00\u07d4\xad\xc8\"\x8e\xf9(\xe1\x8b*\x80}\x00\xfb1\xfcgX\x15\xaa\x00\x00\u07d4\xad\xff\r\x1d\v\x97G\x1ev\u05c9\xd2\u470at\xf9\xbdT\xff\x89e\xea=\xb7UF`\x00\x00\u07d4\xae\x06,D\x86\x18d0u\xdez\x0004-\xce\xd6=\xba\u05c9,\xc6\u034c\u0082\xb3\x00\x00\xe0\x94\xae\x10\xe2z\x01O\r0k\xaf&mH\x97\u021a\xee\xe2\xe9t\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xae\x12k8,\xf2W\xfa\xd7\xf0\xbc}\x16)~T\xccrg\u0689\x10CV\x1a\x88)0\x00\x00\u07d4\xae\x13\xa0\x85\x11\x11\x0f2\xe5;\xe4\x12xE\xc8C\xa1\xa5|{\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xae\x17\x9aF\r\xb6c&t=$\xe6u#\xa5{$m\xaf\u007f\x8a\x01\x00\a\xae|\xe5\xbb\xe4\x00\x00\u07d4\xae\"(ey\x90y\xaa\xf4\xf0gJ\f\u06ab\x02\xa6\xd5p\xff\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xae#\x9a\xcf\xfdN\xbe.\x1b\xa5\xb4\x17\x05r\xdcy\xcce3\xec\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xae/\x9c\x19\xacv\x13e\x94C#\x93\xb0G\x1d\b\x90!d\u04c9%\xdf\x05\u01a8\x97\xe4\x00\x00\u07d4\xae4\x86\x1d4\"S\x19O\xfcfR\xdf\xdeQ\xabD\xca\xd3\xfe\x89\x19F\bhc\x16\xbd\x80\x00\u07d4\xae6\xf7E!!\x91>\x80\x0e\x0f\xcd\x1ae\xa5G\x1c#\x84o\x89\b\xe3\xf5\v\x17<\x10\x00\x00\u07d4\xae?\x98\xa4C\xef\xe0\x0f>q\x1dR]\x98\x94\u071aa\x15{\x89\x10\x04\xe2\xe4_\xb7\xee\x00\x00\xe0\x94\xaeG\xe2`\x9c\xfa\xfe6\x9df\xd4\x15\xd99\xde\x05\b\x1a\x98r\x8a\x05\xba\xec\xf0%\xf9\xb6P\x00\x00\u07d4\xaeO\x12.5\xc0\xb1\xd1\xe4\x06\x92\x91E|\x83\xc0\u007f\x96_\xa3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xaePU\x81L\xb8\xbe\f\x11{\xb8\xb1\xc8\u04b6;F\x98\xb7(\x89\x01\xbc\x93.\xc5s\xa3\x80\x00\u07d4\xaeS\x8cs\u0173\x8d\x8dXM~\xbd\xad\xef\xb1\\\xab\xe4\x83W\x896'\xe8\xf7\x127<\x00\x00\u07d4\xaeW\xcc\x12\x9a\x96\xa8\x99\x81\xda\xc6\r/\xfb\x87}]\xc5\xe42\x89<:#\x94\xb3\x96U\x00\x00\u07d4\xaeZ\xa1\xe6\u00b6\x0fo\xd3\xef\xe7!\xbbJq\x9c\xbe=o]\x89+$\u01b5Z^b\x00\x00\u07d4\xae\\\x9b\xda\xd3\xc5\u0221\"\x04D\xae\xa5\xc2)\xc1\x83\x9f\x1dd\x89\x19\xe2\xa4\xc8\x18\xb9\x06\x00\x00\u07d4\xae\\\xe35Z{\xa9\xb32v\f\tP\u00bcE\xa8_\xa9\xa0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xae]\"\x1a\xfc\xd3\u0493U\xf5\b\xea\xdf\xca@\x8c\xe3<\xa9\x03\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xaec[\xf781\x11\x9d-)\xc0\xd0O\xf8\xf8\xd8\u0425zF\x89Hz\x9a0E9D\x00\x00\xe0\x94\xaed\x81U\xa6X7\x0f\x92\x9b\xe3\x84\xf7\xe0\x01\x04~I\xddF\x8a\x02\xdf$\xae2\xbe D\x00\x00\xe0\x94\xaeo\fs\xfd\xd7|H\x97'Q!t\u0675\x02\x96a\x1cL\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xaep\xe6\x9d,J\n\xf8\x18\x80{\x1a'\x05\xf7\x9f\u0435\xdb\u01095e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\xaew9\x12N\xd1S\x05%\x03\xfc\x10\x14\x10\xd1\xff\xd8\xcd\x13\xb7\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4\xaex\xbb\x84\x919\xa6\xba8\xae\x92\xa0\x9ai`\x1c\xc4\xcbb\u0449\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xae\x84\"\x10\xf4M\x14\u0124\u06d1\xfc\x9d;;P\x01O{\xf7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xae\x84.\x81\x85\x8e\xcf\xed\xf6Plhm\xc2\x04\xac\x15\xbf\x8b$\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xae\x89T\xf8\xd6\x16m\xe5\a\xcfa)}\x0f\xc7\xcak\x9eq(\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xae\x9e\xcdk\u0755.\xf4\x97\xc0\x05\n\u0aca\x82\xa9\x18\x98\u0389\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4\xae\x9f\\?\xbb\xe0\u027c\xbf\x1a\xf8\xfft\xea(\v:]\x8b\b\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\xae\xad\x88\u0589Ak\x1c\x91\xf26D!7[}\x82\xd0RR\n\xfb\\Wm\x9f~\xb9>\u048a\r\xd0A \xba\t\xcf\xe6\x00\x00\u07d4\xae\xc2\u007f\xf5\xd7\xf9\xdd\u0691\x18?F\xf9\xd5%C\xb6\xcd+/\x89\x18e\x01'\xcc=\xc8\x00\x00\u07d4\xae\xe4\x9dh\xad\xed\xb0\x81\xfdCpZ_x\xc7x\xfb\x90\xdeH\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xae\xf5\xb1\"X\xa1\x8d\xec\a\xd5\xec.1et\x91\x9dy\xd6\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\xae\xfc\xfe\x88\xc8&\xcc\xf11\xd5N\xb4\ua7b8\x0ea\xe1\xee%\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\xaf\x06\xf5\xfam\x12\x14\xecC\x96}\x1b\xd4\xdd\xe7J\xb8\x14\xa98\x89\x04\xc5>\xcd\xc1\x8a`\x00\x00\u07d4\xaf\x11H\xefl\x8e\x10=u0\xef\xc9\x16y\u026c'\x00\t\x93\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xaf >\"\x9d~mA\x9d\xf47\x8e\xa9\x87\x15Q_c\x14\x85\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\xaf X\xc7(,\xf6|\x8c<\xf90\x13<\x89a|\xe7])\x8a\x01w\"J\xa8D\xc7 \x00\x00\u07d4\xaf&\xf7\u01bfE> x\xf0\x89S\u4c80\x04\xa2\xc1\xe2\t\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xaf0\x87\xe6.\x04\xbf\x90\rZT\xdc>\x94bt\u0692B;\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xaf6\x14\u0736\x8a6\xe4ZN\x91\x1ebybG\"-Y[\x89z\x81\x06_\x11\x03\xbc\x00\x00\u07d4\xaf6\x15\u01c9\u0431\x15*\xd4\xdb%\xfe]\xcf\"(\x04\xcfb\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xaf<\xb5\x96Y3\xe7\xda\u0603i;\x9c>\x15\xbe\xb6\x8aHs\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xafD\x93\xe8R\x1c\xa8\x9d\x95\xf5&|\x1a\xb6?\x9fEA\x1e\x1b\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xafL\xf4\x17\x85\x16\x1fW\x1d\f\xa6\x9c\x94\xf8\x02\x1fA)N\u028a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xafR\x9b\xdbE\x9c\xc1\x85\xbe\xe5\xa1\u014b\xf7\xe8\xcc\xe2\\\x15\r\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xafg\xfd>\x12\u007f\xd9\xdc6\xeb?\xcdj\x80\u01feOu2\xb2\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\xafw\x1094Z40\x01\xbc\x0f\x8aY#\xb1&\xb6\rP\x9c\x895e\x9e\xf9?\x0f\xc4\x00\x00\xe0\x94\xaf\u007fy\xcbAZ\x1f\xb8\u06fd\tF\a\xee\x8dA\xfb|Z;\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xaf\x87\xd27\x1e\xf3x\x95\u007f\xbd\x05\xba/\x1df\x93\x1b\x01\u2e09%\xf2s\x93=\xb5p\x00\x00\u07d4\xaf\x88\x0f\xc7V}U\x95\xca\xcc\xe1\\?\xc1L\x87B\xc2l\x9e\x89\a?u\u0460\x85\xba\x00\x00\u07d4\xaf\x8e\x1d\xcb1L\x95\r6\x87CM0\x98X\xe1\xa8s\x9c\u0509\x0e~\xeb\xa3A\vt\x00\x00\u07d4\xaf\x99-\xd6i\xc0\x88>U\x15\xd3\xf3\x11*\x13\xf6\x17\xa4\xc3g\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaf\xa1\u056d8\xfe\xd4GY\xc0[\x89\x93\xc1\xaa\r\xac\xe1\x9f@\x89\x04V9\x18$O@\x00\x00\xe0\x94\xaf\xa59XnG\x19\x17J;F\xb9\xb3\xe6c\xa7\u0475\xb9\x87\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xaf\xa6\x94n\xff\xd5\xffS\x15O\x82\x01\x02S\xdfG\xae(\f\u0309j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xaf\xc8\xeb\u860b\xd4\x10Z\xccL\x01\x8eTj\x1e\x8f\x9cx\x88\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xaf\xcc}\xbb\x83V\xd8B\xd4:\xe7\xe2<\x84\"\xb0\"\xa3\b\x03\x8a\x06o\xfc\xbf\xd5\xe5\xa3\x00\x00\x00\u07d4\xaf\xd0\x19\xff6\xa0\x91U4ki\x97H\x15\xa1\xc9\x12\xc9\n\xa4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xaf\xda\xc5\xc1\xcbV\xe2E\xbfp3\x00f\xa8\x17\uabecL\u0449\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xaf\xdd\x1bxab\xb81~ \xf0\xe9y\xf4\xb2\xceHmv]\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xaf\xf1\x04Z\xdf'\xa1\xaa2\x94a\xb2M\xe1\xba\u950ai\x8b\x89\x01\u03c4\xa3\n\n\f\x00\x00\u07d4\xaf\xf1\a\x96\v~\xc3N\u0590\xb6e\x02M`\x83\x8c\x19\x0fp\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xaf\xf1\x1c\xcfi\x93\x04\xd5\xf5\x86*\xf8`\x83E\x1c&\xe7\x9a\xe5\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4\xaf\xf1at\nm\x90\x9f\xe9\x9cY\xa9\xb7yE\xc9\x1c\xc9\x14H\x89\x03@\xaa\xd2\x1b;p\x00\x00\xe0\x94\xaf\xfc\x99\xd5\ubd28O\xe7x\x8d\x97\xdc\xe2t\xb08$\x048\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xaf\xfe\xa0G7\"\xcb\u007f\x0e\x0e\x86\xb9\xe1\x18\x83\xbfB\x8d\x8dT\x89i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94\xb0\t\x96\xb0Vn\xcb>rC\xb8\"y\x88\u0733R\xc2\x18\x99\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xb0\x1e8\x9b(\xa3\x1d\x8eI\x95\xbd\xd7\xd7\xc8\x1b\xee\xab\x1eA\x19\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb0-\x06(s3EE\u03a2\x92\x18\xe4\x05w`Y\x0ft#\x89\xac\xb6\xa1\xc7\xd9:\x88\x00\x00\u07d4\xb0/\xa2\x93\x87\xec\x12\xe3\u007fi\"\xacL\xe9\x8c[\t\xe0\xb0\x0f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb06\x91k\xda\u03d4\xb6\x9eZ\x8ae`)u\xeb\x02a\x04\u0749\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb0A1\x0f\xe9\xee\u0586L\xed\u053e\xe5\x8d\xf8\x8e\xb4\xed<\xac\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xb0U\xafL\xad\xfc\xfd\xb4%\xcfe\xbad1\a\x8f\a\xec\u056b\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xb0W\x11S\xdb\x1cN\u05ec\xae\xfe\x13\xec\xdf\xdbr\xe7\xe4\xf0j\x8a\x11\f\xffyj\xc1\x95 \x00\x00\u07d4\xb0n\xab\t\xa6\x10\u01a5=V\xa9F\xb2\xc44\x87\xac\x1d[-\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb0rI\xe0U\x04J\x91U5\x9a@)7\xbb\xd9T\xfeH\xb6\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xb0v\x182\x8a\x90\x13\a\xa1\xb7\xa0\xd0X\xfc\xd5xn\x9er\xfe\x8a\x06gI]JC0\xce\x00\x00\u07d4\xb0y\xbbM\x98f\x14:m\xa7*\xe7\xac\x00\"\x06)\x811\\\x89)3\x1eeX\xf0\xe0\x00\x00\u07d4\xb0{\xcc\bZ\xb3\xf7)\xf2D\x00Ah7\xb6\x996\xba\x88s\x89lm\x84\xbc\xcd\xd9\xce\x00\x00\u07d4\xb0{\xcf\x1c\xc5\xd4F.Q$\xc9e\xec\xf0\xd7\r\xc2z\xcau\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\xb0|\xb9\xc1$\x05\xb7\x11\x80uC\u0113De\xf8\u007f\x98\xbd-\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xb0\u007f\u07af\xf9\x1dD`\xfel\xd0\u8870\xbd\x8d\"\xa6.\x87\x8a\x01\x1d%)\xf3SZ\xb0\x00\x00\xe0\x94\xb0\x9f\xe6\xd44\x9b\x99\xbc7\x93\x80T\x02-T\xfc\xa3f\xf7\xaf\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\xe0\x94\xb0\xaa\x00\x95\f\x0e\x81\xfa2\x10\x17>r\x9a\xaf\x16:'\xcdq\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xb0\xacN\xfff\x80\xee\x14\x16\x9c\xda\xdb\xff\xdb0\x80Om%\xf5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb0\xb3j\xf9\xae\xee\u07d7\xb6\xb0\"\x80\xf1\x14\xf19\x84\xea2`\x895e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\xb0\xb7y\xb9K\xfa<.\x1fX{\u031c~!x\x92\"7\x8f\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\xb0\xba\xeb0\xe3\x13wlLm$t\x02\xbaAg\xaf\u0361\u0309j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xb0\xbb)\xa8a\xea\x1dBME\xac\u053f\u0112\xfb\x8e\xd8\t\xb7\x89\x04V9\x18$O@\x00\x00\xe0\x94\xb0\xc1\xb1w\xa2 \xe4\x1f|t\xd0|\u0785i\xc2\x1cu\xc2\xf9\x8a\x01/\x93\x9c\x99\xed\xab\x80\x00\x00\u07d4\xb0\xc7\xceL\r\xc3\u00bb\xb9\x9c\xc1\x85{\x8aE_a\x17\x11\u0389\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb0\xce\xf8\xe8\xfb\x89\x84\xa6\x01\x9f\x01\xc6y\xf2r\xbb\xe6\x8f\\w\x89\b=lz\xabc`\x00\x00\xe0\x94\xb0\xd3+\xd7\xe4\u6577\xb0\x1a\xa3\xd0Ao\x80U}\xba\x99\x03\x8a\x03s\x9f\xf0\xf6\xe6\x130\x00\x00\xe0\x94\xb0\xd3\u0247+\x85\x05n\xa0\xc0\xe6\xd1\xec\xf7\xa7~<\u6ac5\x8a\x01\x0f\b\xed\xa8\xe5U\t\x80\x00\u07d4\xb0\xe4i\u0206Y8\x15\xb3IV8Y]\xae\xf0f_\xaeb\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xb0\xe7`\xbb\a\xc0\x81wsE\xe0W\x8e\x8b\u0218\"mN;\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb1\x040\x04\xec\x19A\xa8\xcfO+\x00\xb1W\x00\u076co\xf1~\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb1\x05\xdd=\x98|\xff\xd8\x13\xe9\xc8P\n\x80\xa1\xad%}V\u0189lj\xccg\u05f1\xd4\x00\x00\u07d4\xb1\x0f\u04a6G\x10/\x88\x1ft\xc9\xfb\xc3}\xa62\x94\x9f#u\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xb1\x15\xee:\xb7d\x1e\x1a\xa6\xd0\x00\xe4\x1b\xfc\x1e\xc7!\f/2\x8a\x02\xc0\xbb=\xd3\fN \x00\x00\u07d4\xb1\x17\x8a\xd4s\x83\xc3\x1c\x814\xa1\x94\x1c\xbc\xd4t\xd0bD\xe2\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xb1\x17\x95\x89\u1779\xd4\x15W\xbb\xec\x1c\xb2L\xcc-\xec\x1c\u007f\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xb1\x19\u76a9\xb9\x16Re\x81\xcb\xf5!\xefGJ\xe8M\xcf\xf4\x89O\xba\x10\x01\xe5\xbe\xfe\x00\x00\u07d4\xb1\x1f\xa7\xfb'\n\xbc\xdfZ.\xab\x95\xaa0\u013566\uffc9+^:\xf1k\x18\x80\x00\x00\u07d4\xb1$\xbc\xb6\xff\xa40\xfc\xae.\x86\xb4_'\xe3\xf2\x1e\x81\xee\b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb1)\xa5\xcbq\x05\xfe\x81\v\u0615\xdcr\x06\xa9\x91\xa4TT\x88\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\xe0\x94\xb1.\xd0{\x8a8\xadU\x066?\xc0z\vmy\x996\xbd\xaf\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xb14\xc0\x049\x1a\xb4\x99(x3zQ\xec$/B(WB\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb1?\x93\xaf0\xe8\xd7fs\x81\xb2\xb9[\xc1\xa6\x99\xd5\xe3\xe1)\x89\x16\u012b\xbe\xbe\xa0\x10\x00\x00\u07d4\xb1E\x92\x85\x86>\xa2\xdb7Y\xe5F\u03b3\xfb7a\xf5\x90\x9c\x89<\xd7*\x89@\x87\xe0\x80\x00\u07d4\xb1F\xa0\xb9%U<\xf0o\xca\xf5J\x1bM\xfe\xa6!)\aW\x89lnY\xe6|xT\x00\x00\xe0\x94\xb1Jz\xaa\x8fI\xf2\xfb\x9a\x81\x02\u05bb\xe4\u010a\xe7\xc0o\xb2\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xb1K\xbe\xffpr\tu\xdca\x91\xb2\xa4O\xf4\x9f&r\x87<\x89\a\xc0\x86\x0eZ\x80\xdc\x00\x00\xe0\x94\xb1L\xc8\xde3\xd63\x826S\x9aH\x90 \xceFU\xa3+\u018a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xb1M\xdb\x03\x86\xfb`c\x98\xb8\xccGVZ\xfa\xe0\x0f\xf1\xd6j\x89\xa1*\xff\b>f\xf0\x00\x00\u07d4\xb1S\xf8(\xdd\amJ|\x1c%t\xbb-\xee\x1aD\xa3\x18\xa8\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb1T\x0e\x94\xcf\xf3F\\\xc3\u0447\xe7\xc8\u3f6f\x98FY\u2262\x15\xe4C\x90\xe33\x00\x00\u07d4\xb1X\xdbC\xfab\xd3\x0ee\xf3\u041b\xf7\x81\u01f6sr\uba89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4\xb1ar_\xdc\xed\xd1yR\xd5{#\xef([~K\x11i\xe8\x89\x02\xb6\xdf\xed6d\x95\x80\x00\u07d4\xb1dy\xba\x8e}\xf8\xf6>\x1b\x95\xd1I\u0345)\xd75\xc2\u0689-\xe3:j\xac2T\x80\x00\u07d4\xb1f\xe3}.P\x1a\xe7<\x84\x14+_\xfbZ\xa6U\xddZ\x99\x89l]\xb2\xa4\xd8\x15\xdc\x00\x00\u07d4\xb1\x83\xeb\xeeO\xcbB\xc2 \xe4wt\xf5\x9dlT\xd5\xe3*\xb1\x89V\xf7\xa9\xc3<\x04\xd1\x00\x00\u07d4\xb1\x88\a\x84D\x02~8g\x98\xa8\xaehi\x89\x19\xd5\xcc#\r\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\xb1\x89j7\xe5\u0602Z-\x01vZ\xe5\xdeb\x99w\u0783R\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb1\x8eg\xa5\x05\n\x1d\xc9\xfb\x19\t\x19\xa3=\xa88\xefDP\x14\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb1\xa2\xb4:t3\xdd\x15\v\xb8\"'\xedQ\x9c\u05b1B\u04c2\x89\x94mb\rtK\x88\x00\x00\u07d4\xb1\xc0\u040b6\xe1\x84\xf9\x95*@7\xe3\xe5:f}\a\nN\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb1\xc3(\xfb\x98\xf2\xf1\x9a\xb6do\n|\x8cVo\xdaZ\x85@\x89\x87\x86x2n\xac\x90\x00\x00\xe0\x94\xb1\xc7Qxi9\xbb\xa0\xd6q\xa6w\xa1X\u01ab\xe7&^F\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xb1\xcdK\xdf\xd1\x04H\x9a\x02n\u025dYs\a\xa0By\xf1s\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xb1\u03d4\xf8\t\x15\x05\x05_\x01\n\xb4\xba\u0196\xe0\xca\x0fg\xa1\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xb1\u05b0\x1b\x94\xd8T\xfe\x8b7J\xa6^\x89\\\xf2*\xa2V\x0e\x892\xf5\x1e\u06ea\xa30\x00\x00\xe0\x94\xb1\u06e5%\v\xa9bWU$n\x06yg\xf2\xad/\a\x91\u078a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4\xb1\xe2\u0755\xe3\x9a\xe9w\\U\xae\xb1?\x12\xc2\xfa#0S\xba\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb1\xe6\xe8\x10\xc2J\xb0H\x8d\xe9\xe0\x1eWH7\x82\x9f|w\u0409\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb1\xe9\xc5\xf1\xd2\x1eauzk.\xe7Y\x13\xfcZ\x1aA\x01\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xb2\x03\u049elV\xb9&\x99\u0139-\x1fo\x84d\x8d\xc4\u03fc\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb2\x16\xdcY\xe2|=ry\xf5\xcd[\xb2\xbe\u03f2`n\x14\u0649\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb2\x1byy\xbf|\\\xa0\x1f\xa8-\xd6@\xb4\x1c9\xe6\u01bcu\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xb2#\xbf\x1f\xbf\x80H\\\xa2\xb5V}\x98\xdb{\xc3SM\xd6i\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb2-PU\xd9b15\x96\x1ej\xbd'<\x90\xde\xea\x16\xa3\xe7\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xb2-\xad\xd7\xe1\xe0R2\xa927\xba\xed\x98\xe0\u07d2\xb1\x86\x9e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb24\x03_uDF<\xe1\xe2+\xc5S\x06F\x84\xc5\x13\xcdQ\x89\r\x89\xfa=\u010d\xcf\x00\x00\u07d4\xb2G\u03dcr\xecH*\xf3\xea\xa7Ye\x8fy=g\nW\f\x891p\x8a\xe0\x04T@\x00\x00\u07d4\xb2ghA\xee\x9f-1\xc1r\xe8#\x03\xb0\xfe\x9b\xbf\x9f\x1e\t\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb2y\xc7\xd3U\u0088\x03\x92\xaa\u046a!\xee\x86|;5\a\u07c9D[\xe3\xf2\uf1d4\x00\x00\u07d4\xb2|\x1a$ L\x1e\x11\x8du\x14\x9d\xd1\t1\x1e\a\xc0s\xab\x89\xa8\r$g~\xfe\xf0\x00\x00\u07d4\xb2\x81\x81\xa4X\xa4@\xf1\u01bb\x1d\xe8@\x02\x81\xa3\x14\x8fL5\x89\x14b\fW\xdd\xda\xe0\x00\x00\xe0\x94\xb2\x82E\x03|\xb1\x92\xf7W\x85\u02c6\xcb\xfe|\x93\r\xa2X\xb0\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\xb2\x87\xf7\xf8\xd8\u00c7,\x1bXk\xcd}\n\xed\xbf~s'2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb2\x8b\xb3\x9f4fQ|\xd4o\x97\x9c\xf5\x96S\xee}\x8f\x15.\x89\x18e\x01'\xcc=\xc8\x00\x00\u07d4\xb2\x8d\xbf\xc6I\x98\x94\xf7:q\xfa\xa0\n\xbe\x0fK\xc9\u045f*\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xb2\x96\x8f}5\xf2\b\x87\x161\xc6h{?=\xae\xab\xc6al\x89\bu\xc4\u007f(\x9fv\x00\x00\u07d4\xb2\x9f[|\x190\xd9\xf9z\x11^\x06pf\xf0\xb5M\xb4K;\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb2\xa1D\xb1\xeag\xb9Q\x0f\"g\xf9\xda9\xd3\xf9=\xe2fB\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb2\xa2\xc2\x11\x16\x12\xfb\x8b\xbb\x8e}\xd97\x8dg\xf1\xa3\x84\xf0P\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb2\xa4\x98\xf0;\xd7\x17\x8b\u0627\x89\xa0\x0fR7\xafy\xa3\xe3\xf8\x8a\x04\x1b\xad\x15^e\x12 \x00\x00\u07d4\xb2\xaa/\x1f\x8e\x93\xe7\x97\x13\xd9,\xea\x9f\xfc\xe9\xa4\n\xf9\xc8-\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb2\xb5\x16\xfd\u045e\u007f8d\xb6\xd2\xcf\x1b%*AV\xf1\xb0;\x89\x02\xe9\x83\xc7a\x15\xfc\x00\x00\u07d4\xb2\xb7\u0374\xffKa\u0577\xce\v\"p\xbb\xb5&\x97C\xec\x04\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb2\xbd\xbe\u07d5\x90\x84v\xd7\x14\x8a7\f\u0193t6(\x05\u007f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb2\xbf\xaaX\xb5\x19l\\\xb7\xf8\x9d\xe1_G\x9d\x188\xdeq=\x89\x01#n\xfc\xbc\xbb4\x00\x00\u07d4\xb2\xc5>\xfa3\xfeJ:\x1a\x80 \\s\xec;\x1d\xbc\xad\x06\x02\x89h\x01\u06b3Y\x18\x93\x80\x00\xe0\x94\xb2\xd06\x05\x15\xf1}\xab\xa9\x0f\u02ec\x82\x05\xd5i\xb9\x15\u05ac\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xb2\xd1\xe9\x9a\xf9\x121\x85\x8epe\xdd\x19\x183\r\xc4\xc7G\u054a\x03\x89O\x0eo\x9b\x9fp\x00\x00\u07d4\xb2\u066b\x96d\xbc\xf6\xdf <4o\u0192\xfd\x9c\xba\xb9 ^\x89\x17\xbex\x97`e\x18\x00\x00\u07d4\xb2\u0777\x86\xd3yN'\x01\x87\xd0E\x1a\xd6\u0237\x9e\x0e\x87E\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb2\xe0\x85\xfd\xdd\x14h\xba\aA['NsN\x11#\u007f\xb2\xa9\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xb2\xe9\xd7k\xf5\x0f\xc3k\xf7\u04d4Kc\xe9\u0288\x9bi\x99h\x89\x902\xeab\xb7K\x10\x00\x00\xe0\x94\xb2\xf9\xc9r\xc1\xe9swU\xb3\xff\x1b0\x88s\x83\x969[&\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xb2\xfc\x84\xa3\xe5\nP\xaf\x02\xf9M\xa08>\u055fq\xff\x01\u05ca\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4\xb3\x05\v\xef\xf9\xde3\xc8\x0e\x1f\xa1R%\xe2\x8f,A:\xe3\x13\x89%\xf2s\x93=\xb5p\x00\x00\u07d4\xb3\x11\x96qJH\xdf\xf7&\xea\x943\xcd)\x12\xf1\xa4\x14\xb3\xb3\x89\x91Hx\xa8\xc0^\xe0\x00\x00\xe0\x94\xb3\x14[tPm\x1a\x8d\x04|\xdc\xdcU9*{SPy\x9a\x8a\x1bb)t\x1c\r=]\x80\x00\u07d4\xb3 \x83H6\xd1\xdb\xfd\xa9\xe7\xa3\x18M\x1a\xd1\xfdC \xcc\xc0\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb3#\u073f.\xdd\xc58.\u4efb \x1c\xa3\x93\x1b\xe8\xb48\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xb3$\x00\xfd\x13\xc5P\t\x17\xcb\x03{)\xfe\"\xe7\xd5\"\x8f-\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xb3%gL\x01\xe3\xf7)\rR&3\x9f\xbe\xacg\xd2!'\x9f\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xb3(%\xd5\xf3\xdb$\x9e\xf4\xe8\\\xc4\xf31S\x95\x89v\u8f09\x1b-\xf9\xd2\x19\xf5y\x80\x00\u07d4\xb3*\xf3\xd3\xe8\xd0u4I&To.2\x88{\xf9;\x16\xbd\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb3/\x1c&\x89\xa5\xcey\xf1\xbc\x97\v1XO\x1b\xcf\"\x83\xe7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb3<\x03#\xfb\xf9\xc2l\x1d\x8a\xc4N\xf7C\x91\u0400F\x96\u0689\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb3O\x04\xb8\xdbe\xbb\xa9\xc2n\xfcL\xe6\xef\xc5\x04\x81\xf3\xd6]\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xb3U}9\xb5A\x1b\x84D__T\xf3\x8fb\xd2qM\x00\x87\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xb3X\xe9|p\xb6\x05\xb1\xd7\xd7)\u07f6@\xb4<^\xaf\xd1\xe7\x8a\x04<3\xc1\x93ud\x80\x00\x00\u0794\xb3^\x8a\x1c\r\xac~\x0ef\u06ecsjY*\xbdD\x01%a\x88\xcf\xceU\xaa\x12\xb3\x00\x00\xe0\x94\xb3fx\x94\xb7\x86<\x06\x8a\xd3D\x87?\xcf\xf4\xb5g\x1e\x06\x89\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xb3qw1\xda\xd6Q2\xday-\x87`0\xe4j\xc2'\xbb\x8a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb3s\x1b\x04l\x8a\u0195\xa1'\xfdy\u0425\xd5\xfaj\xe6\xd1.\x89lO\xd1\xee$nx\x00\x00\u07d4\xb3|+\x9fPc{\xec\xe0\u0295\x92\b\xae\xfe\xe6F;\xa7 \x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb3\x88\xb5\xdf\xec\xd2\xc5\u4d56W|d%V\xdb\xfe'xU\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb3\x8cNS{]\xf90\xd6Zt\xd0C\x83\x1dkH[\xbd\xe4\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xb3\x919Wa\x94\xa0\x86a\x95\x15\x1f3\xf2\x14\n\xd1\u0306\u03ca\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xb3\x9fL\x00\xb2c\f\xab}\xb7)^\xf4=G\xd5\x01\xe1\u007f\u05c9\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb3\xa6K\x11vrOT\t\xe1AJ5#f\x1b\xae\xe7KJ\x89\x01ch\xffO\xf9\xc1\x00\x00\u07d4\xb3\xa6\xbdA\xf9\xd9\xc3 \x1e\x05\v\x87\x19\x8f\xbd\xa3\x994\"\x10\x89\xc4a\xe1\xdd\x10)\xb5\x80\x00\u07d4\xb3\xa8\xc2\xcb}5\x8eW9\x94\x1d\x94[\xa9\x04Z\x02:\x8b\xbb\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb3\xaeT\xfb\xa0\x9d>\xe1\u05bd\xd1\xe9W\x929\x19\x02L5\xfa\x89\x03\x8d,\xeee\xb2*\x80\x00\u07d4\xb3\xb7\xf4\x93\xb4J,\x8d\x80\xecx\xb1\xcd\xc7Ze+s\xb0l\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb3\xc2(s\x1d\x18m-\xed[_\xbe\x00Lfl\x8eF\x9b\x86\x89\x01\x92t\xb2Y\xf6T\x00\x00\u07d4\xb3\xc2``\x9b\x9d\xf4\t^l]\xff9\x8e\xeb^-\xf4\x99\x85\x89\r\xc5_\xdb\x17d{\x00\x00\u07d4\xb3\xc6[\x84Z\xbal\xd8\x16\xfb\xaa\xe9\x83\xe0\xe4l\x82\xaa\x86\"\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb3\xc9H\x11\xe7\x17[\x14\x8b(\x1c\x1a\x84[\xfc\x9b\xb6\xfb\xc1\x15\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb3\xe2\x0e\xb4\xde\x18\xbd\x06\x02!h\x98\x94\xbe\u5bb2SQ\xee\x89\x03\xfc\x80\xcc\xe5\x16Y\x80\x00\u07d4\xb3\xe3\xc49\x06\x98\x80\x15f\x00\u0089.D\x8dA6\xc9-\x9b\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\xe0\x94\xb3\xf8*\x87\xe5\x9a9\xd0\u0480\x8f\aQ\xebr\xc22\x9c\xdc\u014a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xb3\xfc\x1dh\x81\xab\xfc\xb8\xbe\xcc\v\xb0!\xb8\xb7;r3\u0751\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xb4\x05\x94\xc4\xf3fN\xf8I\u0326\"{\x8a%\xaai\t%\xee\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb4\x1e\xaf]Q\xa5\xba\x1b\xa3\x9b\xb4\x18\u06f5O\xabu\x0e\xfb\x1f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4$\u058d\x9d\r\x00\xce\xc1\x93\x8c\x85N\x15\xff\xb8\x80\xba\x01p\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb4%bs\x96+\xf61\xd0\x14U\\\xc1\xda\r\xcc1akI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb40g\xfep\u0675Ys\xbaX\xdcd\xdd\u007f1\x1eUBY\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb46W\xa5\x0e\xec\xbc0w\xe0\x05\xd8\xf8\xd9O7xv\xba\u0509\x01\xec\x1b:\x1f\xf7Z\x00\x00\u07d4\xb4<'\xf7\xa0\xa1\"\bK\x98\xf4\x83\x92%A\u0203l\xee,\x89&\u009eG\u0104L\x00\x00\xe0\x94\xb4A5v\x86\x9c\b\xf9Q*\xd3\x11\xfe\x92Y\x88\xa5-4\x14\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xb4F\x05U$q\xa6\xee\xe4\u06abq\xff;\xb4\x13&\xd4s\xe0\x89-~=Q\xbaS\xd0\x00\x00\u07d4\xb4GW\x1d\xac\xbb>\u02f6\xd1\xcf\v\f\x8f88\xe5#$\xe2\x89\x01\xa3\x18f\u007f\xb4\x05\x80\x00\u07d4\xb4G\x83\xc8\xe5{H\a\x93\xcb\u059aE\xd9\f{O\fH\xac\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb4H\x15\xa0\xf2\x8eV\x9d\x0e\x92\x1aJ\u078f\xb2d%&Iz\x89\x03\x027\x9b\xf2\xca.\x00\x00\u07d4\xb4Im\xdb'y\x9a\"$W\xd79y\x11g(\u8844[\x89\x8d\x81\x9e\xa6_\xa6/\x80\x00\xe0\x94\xb4RL\x95\xa7\x86\x0e!\x84\x02\x96\xa6\x16$@\x19B\x1cJ\xba\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xb4\\\xca\r6\x82fbh<\xf7\u0432\xfd\xach\u007f\x02\xd0\u010965\u026d\xc5\u07a0\x00\x00\u0794\xb4d@\u01d7\xa5V\xe0L}\x91\x04f\x04\x91\xf9k\xb0v\xbf\x88\xce\xc7o\x0eqR\x00\x00\u07d4\xb4j\u0386^,P\xeaF\x98\xd2\x16\xabE]\xffZ\x11\xcdr\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4m\x11\x82\xe5\xaa\xca\xff\r&\xb2\xfc\xf7/<\x9f\xfb\xcd\xd9}\x89\xaa*`<\xdd\u007f,\x00\x00\u07d4\xb4\x89!\xc9h}U\x10tE\x84\x93n\x88\x86\xbd\xbf-\xf6\x9b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4\x98\xbb\x0fR\x00\x05\xb6!jD%\xb7Z\xa9\xad\xc5-b+\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xb4\xb1\x1d\x10\x9f`\x8f\xa8\xed\xd3\xfe\xa9\xf8\xc3\x15d\x9a\xeb=\x11\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xb4\xb1K\xf4TU\u042b\b\x035\x8bu$\xa7+\xe1\xa2\x04[\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xb4\xb1\x85\xd9C\xee+Xc\x1e3\xdf\xf5\xafhT\xc1y\x93\xac\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4\xbf$\u02c3hk\xc4i\x86\x9f\xef\xb0D\xb9\tqi\x93\xe2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb4\xc2\x00@\xcc\u0661\xa3(=\xa4\u0522\xf3e\x82\bC\xd7\xe2\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb4\xc8\x17\x0f{*\xb56\xd1\u0662[\xdd :\xe1(\x8d\xc3\u0549\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb4\xd8/.i\x94?}\xe0\xf5\xf7t8y@o\xac.\x9c\xec\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xb4\xddF\f\xd0\x16rZd\xb2.\xa4\xf8\xe0n\x06gN\x03>\x8a\x01#\x1b\xb8t\x85G\xa8\x00\x00\u07d4\xb4\xddT\x99\xda\xeb%\a\xfb-\xe1\"\x97s\x1dLr\xb1k\xb0\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb5\x04l\xb3\xdc\x1d\xed\xbd6E\x14\xa2\x84\x8eD\xc1\xdeN\xd1G\x8a\x03{}\x9b\xb8 @^\x00\x00\xe0\x94\xb5\b\xf9\x87\xb2\xde4\xaeL\xf1\x93\u0785\xbf\xf6\x13\x89b\x1f\x88\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xb5\tU\xaan4\x15q\x98f\b\xbd\u0211\xc2\x13\x9fT\f\u07c9j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xb5\f\x14\x9a\x19\x06\xfa\xd2xo\xfb\x13Z\xabP\x177\xe9\xe5o\x89\x15\b\x94\xe8I\xb3\x90\x00\x00\u07d4\xb5\f\x9fW\x89\xaeD\xe2\xdc\xe0\x17\xc7\x14\xca\xf0\f\x83\x00\x84\u0089\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xb5\x14\x88,\x97\x9b\xb6B\xa8\r\u04c7T\u0578\xc8)m\x9a\a\x893\xc5I\x901r\f\x00\x00\u07d4\xb5\x1d\u0734\xddN\x8a\xe6\xbe3m\xd9eIq\xd9\xfe\xc8kA\x89\x16\xd4d\xf8=\u2500\x00\u07d4\xb5\x1eU\x8e\xb5Q/\xbc\xfa\x81\xf8\u043d\x93\x8cy\xeb\xb5$+\x89&\u009eG\u0104L\x00\x00\u07d4\xb5#\xff\xf9t\x98q\xb3S\x88C\x887\xf7\xe6\xe0\u07a9\xcbk\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xb5-\xfbE\xde]t\xe3\xdf \x832\xbcW\x1c\x80\x9b\x8d\xcf2\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xb55\xf8\u06c7\x9f\xc6\u007f\xecX\x82J\\\xbenT\x98\xab\xa6\x92\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xb57\xd3jp\xee\xb8\xd3\xe5\xc8\r\xe8\x15\"\\\x11X\u02d2\u0109QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\xb5;\xcb\x17L%\x184\x8b\x81\x8a\xec\xe0 6E\x96Fk\xa3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5I>\xf1srDE\xcf4\\\x03]'\x9b\xa7Y\xf2\x8dQ\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb5S\xd2]kT!\xe8\x1c*\xd0^\v\x8b\xa7Q\xf8\xf0\x10\xe3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5Tt\xbaX\xf0\xf2\xf4\x0el\xba\xbe\xd4\xea\x17n\x01\x1f\xca\u0589j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xb5U\xd0\x0f\x91\x90\xcc6w\xae\xf3\x14\xac\xd7?\xdc99\x92Y\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5W\xab\x949\xefP\xd27\xb5S\xf0%\b6JFj\\\x03\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb5jx\x00(\x03\x9c\x81\xca\xf3{gu\xc6 \u7195Gd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5j\u04ae\xc6\xc8\xc3\xf1\x9e\x15\x15\xbb\xb7\u0751(RV\xb69\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb5t\x13\x06\n\xf3\xf1N\xb4y\x06_\x1e\x9d\x19\xb3uz\xe8\u0309\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xb5uI\xbf\xbc\x9b\xdd\x18\xf76\xb2&P\xe4\x8as`\x1f\xa6\\\x89\x18-~L\xfd\xa08\x00\x00\xe0\x94\xb5w\xb6\xbe\xfa\x05N\x9c\x04\x04a\x85P\x94\xb0\x02\xd7\xf5{\u05ca\x18#\xf3\xcfb\x1d#@\x00\x00\u07d4\xb5{\x04\xfa#\xd1 ?\xae\x06\x1e\xacEB\xcb`\xf3\xa5v7\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4\xb5\x87\f\xe3B\xd43C36s\x03\x8bGd\xa4n\x92_>\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb5\x87\xb4J,\xa7\x9eK\xc1\u074b\xfd\xd4: qP\xf2\xe7\xe0\x89\",\x8e\xb3\xfff@\x00\x00\u07d4\xb5\x89gm\x15\xa0DH4B0\xd4\xff'\xc9^\xdf\x12,I\x8965\u026d\xc5\u07a0\x00\x00\u0794\xb5\x8bR\x86^\xa5]\x806\xf2\xfa\xb2`\x98\xb3R\u0283~\x18\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xb5\x90k\n\u9881X\xe8\xacU\x0e9\xda\bn\xe3\x15v#\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb5\xa4g\x96\x85\xfa\x14\x19l.\x920\xc8\xc4\xe3;\xff\xbc\x10\xe2\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xb5\xa5\x89\u075f@q\u06f6\xfb\xa8\x9b?]]\xae}\x96\xc1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5\xa6\x06\xf4\xdd\u02f9G\x1e\xc6\u007fe\x8c\xaf+\x00\xees\x02^\x89\xeaun\xa9*\xfct\x00\x00\u07d4\xb5\xadQW\u0769!\xe6\xba\xfa\u0350\x86\xaes\xae\x1fa\x1d?\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb5\xad\xd1\u701f}\x03\x06\x9b\xfe\x88;\n\x93\"\x10\xbe\x87\x12\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb5\xba)\x91|x\xa1\xd9\xe5\xc5\xc7\x13fl\x1eA\x1d\u007fi:\x89\xa8\r$g~\xfe\xf0\x00\x00\u07d4\xb5\xc8\x16\xa8(<\xa4\xdfh\xa1\xa7=c\xbd\x80&\x04\x88\xdf\b\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb5\xca\xc5\xed\x03G}9\v\xb2g\xd4\xeb\xd4a\x01\xfb\xc2\xc3\u0689\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xb5\u037cA\x15@oR\u5a85\xd0\xfe\xa1p\u0497\x9c\u01fa\x89Hz\x9a0E9D\x00\x00\u0794\xb5\u0653M{)+\xcf`;(\x80t\x1e\xb7`(\x83\x83\xa0\x88\xe7\xc2Q\x85\x05\x06\x00\x00\u07d4\xb5\xddP\xa1]\xa3Ih\x89\nS\xb4\xf1?\xe1\xaf\b\x1b\xaa\xaa\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb5\xfa\x81\x84\xe4>\xd3\u0e2b\x91!da\xb3R\x8d\x84\xfd\t\x89\x91Hx\xa8\xc0^\xe0\x00\x00\u07d4\xb5\xfb~\xa2\xdd\xc1Y\x8bfz\x9dW\xdd9\xe8Z8\xf3]V\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xb6\x00B\x97R\xf3\x99\xc8\r\a4tK\xae\n\x02.\xcag\u0189\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb6\x00\xfe\xabJ\xa9lSu\x04\xd9`W\"1Ai,\x19:\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xb6\x04|\u07d3-\xb3\xe4\x04_Iv\x12#AS~\u0556\x1e\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb6\x15\xe9@\x14>\xb5\u007f\x87X\x93\xbc\x98\xa6\x1b=a\x8c\x1e\x8c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xb6\x1c4\xfc\xac\xdap\x1aZ\xa8p$Y\u07b0\u4b83\x8d\xf8\x8a\aiZ\x92\xc2\ro\xe0\x00\x00\xe0\x94\xb60d\xbd3U\xe6\xe0~-7p$\x12Z3wlJ\xfa\x8a\b7Z*\xbc\xca$@\x00\x00\u07d4\xb65\xa4\xbcq\xfb(\xfd\xd5\xd2\xc3\"\x98:V\u0084Bni\x89\t79SM(h\x00\x00\u07d4\xb6F\u07d8\xb4\x94BtkaR\\\x81\xa3\xb0K\xa3\x10bP\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xb6YA\xd4LP\xd2Ffg\r6Gf\xe9\x91\xc0.\x11\u0089 \x86\xac5\x10R`\x00\x00\xe0\x94\xb6[\u05c0\xc7CA\x15\x16 'VR#\xf4NT\x98\xff\x8c\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\xb6d\x11\xe3\xa0-\xed\xb7&\xfay\x10}\xc9\v\xc1\xca\xe6MH\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb6fu\x14.1\x11\xa1\xc2\xea\x1e\xb2A\x9c\xfaB\xaa\xf7\xa24\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xb6o\x92\x12K^c\x03XY\xe3\x90b\x88i\xdb\u07a9H^\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xb6rsJ\xfc\xc2$\xe2\xe6\t\xfcQ\xd4\xf0Ys'D\xc9H\x89\x10\x04\xe2\xe4_\xb7\xee\x00\x00\xe0\x94\xb6w\x1b\v\xf3B\u007f\x9a\xe7\xa9>|.a\xeec\x94\x1f\xdb\b\x8a\x03\xfb&i)T\xbf\xc0\x00\x00\u07d4\xb6z\x80\xf1p\x19}\x96\xcd\xccJ\xb6\u02e6'\xb4\xaf\xa6\xe1,\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\xb6\x88\x99\xe7a\rL\x93\xa255\xbc\xc4H\x94[\xa1fo\x1c\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb6\xa8)3\xc9\xea\u06bd\x98\x1e]m`\xa6\x81\x8f\xf8\x06\xe3k\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xb6\xaa\u02cc\xb3\v\xab*\xe4\xa2BF&\xe6\xe1+\x02\xd0F\x05\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xb6\xb3J&?\x10\xc3\xd2\xec\xeb\n\xccU\x9a{*\xb8\\\xe5e\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb6\xbf\xe1\xc3\xef\x94\xe1\x84o\xb9\xe3\xac\xfe\x9bP\xc3\xe9\x06\x923\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xb6\xcdt2\xd5\x16\x1b\xe7\x97h\xadE\xde>Dz\a\x98 c\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb6\xceM\xc5`\xfcs\xdci\xfbzb\xe3\x88\xdb~r\xeavO\x894]\xf1i\xe9\xa3X\x00\x00\u07d4\xb6\xde\u03c2\x96\x98\x19\xba\x02\xde)\xb9\xb5\x93\xf2\x1bd\xee\xda\x0f\x89(\x1d\x90\x1fO\xdd\x10\x00\x00\xe0\x94\xb6\xe6\xc3\"+ko\x9b\xe2\x87]*\x89\xf1'\xfbd\x10\x0f\xe2\x8a\x01\xb2\x1dS#\xcc0 \x00\x00\u07d4\xb6\xe8\xaf\xd9=\xfa\x9a\xf2\u007f9\xb4\xdf\x06\ag\x10\xbe\xe3\u07eb\x89\x01Z\xf1\u05cbX\xc4\x00\x00\xe0\x94\xb6\xf7\x8d\xa4\xf4\xd0A\xb3\xbc\x14\xbc[\xa5\x19\xa5\xba\f2\xf1(\x8a$}\xd3,?\xe1\x95\x04\x80\x00\xe0\x94\xb6\xfb9xbP\b\x14&\xa3B\xc7\rG\xeeR\x1e[\xc5c\x8a\x03-&\xd1.\x98\v`\x00\x00\u07d4\xb7\r\xba\x93\x91h+J6Nw\xfe\x99%c\x01\xa6\xc0\xbf\x1f\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb7\x16#\xf3Q\a\xcft1\xa8?\xb3\xd2\x04\xb2\x9e\u0c67\xf4\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xb7\x1a\x13\xba\x8e\x95\x16{\x803\x1bR\u059e7\x05O\xe7\xa8&\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb7\x1bb\xf4\xb4H\xc0+\x12\x01\xcb^9J\xe6'\xb0\xa5`\xee\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xb7\" \xad\xe3d\xd06\x9f--\xa7\x83\xcaGM{\x9b4\u0389\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\xe0\x94\xb7#\r\x1d\x1f\xf2\xac\xa3f\x969\x14\xa7\x9d\xf9\xf7\xc5\xea,\x98\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94\xb7$\n\U000af433<\b\xae\x97d\x10>5\xdc\xe3c\x84(\x8a\x01\xca\xdd/\xe9hnc\x80\x00\u07d4\xb7'\xa9\xfc\x82\xe1\xcf\xfc\\\x17_\xa1HZ\x9b\xef\xa2\u037d\u04496'\xe8\xf7\x127<\x00\x00\u07d4\xb7,*\x01\x1c\r\xf5\x0f\xbbn(\xb2\n\xe1\xaa\xd2\x17\x88g\x90\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb78-7\xdb\x03\x98\xacrA\f\xf9\x81=\xe9\xf8\xe1\uc36d\x8966\xc2^f\xec\xe7\x00\x00\u07d4\xb7;O\xf9\x9e\xb8\x8f\u061b\vmW\xa9\xbc3\x8e\x88o\xa0j\x89\x01\xbc\x16\xd6t\xec\x80\x00\x00\u07d4\xb7=jwU\x9c\x86\xcfet$)\x039K\xac\xf9n5p\x89\x04\xf1\xa7|\xcd;\xa0\x00\x00\u07d4\xb7Cr\xdb\xfa\x18\x1d\xc9$/9\xbf\x1d71\xdf\xfe+\xda\u03c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xb7G\x9d\xabP\"\xc4\xd5\u06ea\xf8\xde\x17\x1bN\x95\x1d\u0464W\x89\x04V9\x18$O@\x00\x00\u07d4\xb7I\xb5N\x04\u0571\x9b\xdc\xed\xfb\x84\xdaw\x01\xabG\x8c'\xae\x89\x91Hx\xa8\xc0^\xe0\x00\x00\u07d4\xb7N\xd2f`\x01\xc1c3\xcfz\xf5\x9eJ=H`6;\x9c\x89\n~\xbd^Cc\xa0\x00\x00\u07d4\xb7QI\xe1\x85\xf6\xe3\x92pWs\x90s\xa1\x82*\xe1\xcf\r\xf2\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\xb7S\xa7_\x9e\xd1\v!d:\n=\xc0Qz\xc9k\x1a@h\x89\x15\xc8\x18[,\x1f\xf4\x00\x00\xe0\x94\xb7V\xadR\xf3\xbft\xa7\xd2LgG\x1e\b\x87Ci6PL\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xb7Wn\x9d1M\xf4\x1e\xc5Pd\x94):\xfb\x1b\xd5\xd3\xf6]\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb7X\x89o\x1b\xaa\x86O\x17\xeb\xed\x16\xd9S\x88o\xeeh\xaa\xe6\x8965\u026d\xc5\u07a0\x00\x00\u0794\xb7h\xb5#N\xba:\x99h\xb3Mm\xdbH\x1c\x84\x19\xb3e]\x88\xcf\xceU\xaa\x12\xb3\x00\x00\u07d4\xb7\x82\xbf\xd1\xe2\xdep\xf4gdo\x9b\xc0\x9e\xa5\xb1\xfc\xf4P\xaf\x89\x0e~\xeb\xa3A\vt\x00\x00\xe0\x94\xb7\xa2\xc1\x03r\x8bs\x05\xb5\xaen\x96\x1c\x94\xee\x99\xc9\xfe\x8e+\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\xb7\xa3\x1a|8\xf3\xdb\t2.\xae\x11\xd2'!A\xea\"\x99\x02\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb7\xa6y\x1c\x16\xebN!b\xf1Ke7\xa0+=c\xbf\xc6\x02\x89*Rc\x91\xac\x93v\x00\x00\u07d4\xb7\xa7\xf7|4\x8f\x92\xa9\xf1\x10\fk\xd8)\xa8\xacm\u007f\u03d1\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xb7\xc0w\x94ft\xba\x93A\xfbLtz]P\xf5\xd2\xdad\x15\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xb7\xc0\xd0\xcc\vM4-@b\xba\xc6$\xcc\xc3\xc7\f\xc6\xda?\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xb7\xc9\xf1+\x03\x8esCm\x17\xe1\xc1/\xfe\x1a\xec\u0373\xf5\x8c\x89\x1dF\x01b\xf5\x16\xf0\x00\x00\u07d4\xb7\xcck\x1a\xcc2\u0632\x95\xdfh\xed\x9d^`\xb8\xf6L\xb6{\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xb7\xcehK\t\xab\xdaS8\x9a\x87Si\xf7\x19X\xae\xac;\u0749lk\x93[\x8b\xbd@\x00\x00\u07d4\xb7\xd1.\x84\xa2\xe4\u01264Z\xf1\xdd\x1d\xa9\xf2PJ*\x99n\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xb7\xd2R\xee\x94\x02\xb0\xee\xf1D)_\x0ei\xf0\xdbXl\bq\x89#\xc7W\a+\x8d\xd0\x00\x00\xe0\x94\xb7\u0541\xfe\n\xf1\xec8?;\xce\x00\xaf\x91\x99\xf3\xcf_\xe0\xcc\xe2\x8c\xd1J\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4\xb8R\x18\xf3B\xf8\x01.\u069f'Nc\xce!R\xb2\xdc\xfd\xab\x89\xa8\r$g~\xfe\xf0\x00\x00\u07d4\xb8UP\x10wn<\\\xb3\x11\xa5\xad\xee\xfe\x9e\x92\xbb\x9ad\xb9\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xb8_&\xdd\x0er\xd9\u009e\xba\xf6\x97\xa8\xafwG,+X\xb5\x8a\x02\x85\x19\xac\xc7\x19\fp\x00\x00\u07d4\xb8_\xf0>{_\xc4\"\x98\x1f\xae^\x99A\xda\xcb\u06bau\x84\x89Hz\x9a0E9D\x00\x00\xe0\x94\xb8f\a\x02\x1bb\xd3@\xcf&R\xf3\xf9_\xd2\xdcgi\x8b\u07ca\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xb8}\xe1\xbc\u0492i\xd5!\xb8v\x1c\u00dc\xfbC\x19\xd2\xea\u054965\u026d\xc5\u07a0\x00\x00\u07d4\xb8\u007fSv\xc2\xde\vl\xc3\xc1y\xc0`\x87\xaaG=kFt\x89Hz\x9a0E9D\x00\x00\u07d4\xb8\x84\xad\u060d\x83\xdcVJ\xb8\xe0\xe0,\xbd\xb69\x19\xae\xa8D\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb8\x8a7\xc2\u007fx\xa6\x17\xd5\xc0\x91\xb7\u0577:7a\xe6_*\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb8\x94x\"\u056c\u79ad\x83&\xe9T\x96\"\x1e\v\xe6\xb7=\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb8\x9c\x03n\xd7\u0112\x87\x99!\xbeA\xe1\f\xa1i\x81\x98\xa7L\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94\xb8\x9fF2\xdfY\t\xe5\x8b*\x99d\xf7O\xeb\x9a;\x01\xe0\u014a\x04\x88u\xbc\xc6\xe7\xcb\xeb\x80\x00\u07d4\xb8\xa7\x9c\x84\x94^G\xa9\xc3C\x86\x83\u05b5\x84,\xffv\x84\xb1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xb8\xa9y5'Y\xba\t\xe3Z\xa5\x93]\xf1u\xbf\xf6x\xa1\b\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xb8\xab9\x80[\xd8!\x18Ol\xbd=$s4{\x12\xbf\x17\\\x89\x06hZ\xc1\xbf\xe3,\x00\x00\xe0\x94\xb8\xac\x11}\x9f\r\xba\x80\x90\x14E\x82:\x92\x11\x03\xa51o\x85Zew\x9d\x1b\x8a\x05\x15\n\xe8J\x8c\xdf\x00\x00\x00\u07d4\xb9\xe9\f\x11\x92\xb3\xd5\xd3\xe3\xab\a\x00\xf1\xbfe_]\xd44z\x89\x1b\x19\xe5\vD\x97|\x00\x00\u07d4\xb9\xfd83\xe8\x8e|\xf1\xfa\x98y\xbd\xf5Z\xf4\xb9\x9c\xd5\xce?\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xba\x02I\xe0\x1d\x94[\xef\x93\xee^\xc6\x19%\xe0<\\\xa5\t\xfd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xba\x0f9\x02;\xdb)\xeb\x18b\xa9\xf9\x05\x9c\xab]0nf/\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xba\x10\xf2vB\x90\xf8uCCr\xf7\x9d\xbfq8\x01\u02ac\x01\x893\xc5I\x901r\f\x00\x00\u07d4\xba\x151\xfb\x9ey\x18\x96\xbc\xf3\xa8\x05X\xa3Y\xf6\xe7\xc1D\xbd\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\xba\x17m\xbe2I\xe3E\xcdO\xa9g\xc0\xed\x13\xb2LG\u5189\x15\xae\xf9\xf1\xc3\x1c\u007f\x00\x00\xe0\x94\xba\x1f\x0e\x03\u02da\xa0!\xf4\xdc\xeb\xfa\x94\xe5\u0209\xc9\u01fc\x9e\x8a\x06\u0450\xc4u\x16\x9a \x00\x00\u07d4\xba\x1f\xca\xf2#\x93~\xf8\x9e\x85gU\x03\xbd\xb7\xcaj\x92\x8bx\x89\"\xb1\xc8\xc1\"z\x00\x00\x00\xe0\x94\xba$\xfcCgS\xa79\xdb,\x8d@\xe6\xd4\xd0LR\x8e\x86\xfa\x8a\x02\xc0\xbb=\xd3\fN \x00\x00\u07d4\xbaB\xf9\xaa\xceL\x18E\x04\xab\xf5BWb\xac\xa2oq\xfb\u0709\x02\a\a}\u0627\x9c\x00\x00\u07d4\xbaF\x9a\xa5\u00c6\xb1\x92\x95\u0521\xb5G;T\x03S9\f\x85\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbad@\xae\xb3s{\x8e\xf0\xf1\xaf\x9b\f\x15\xf4\xc2\x14\xff\xc7\u03c965\u026d\xc5\u07a0\x00\x00\xe0\x94\xbam1\xb9\xa2a\xd6@\xb5\u07a5\x1e\xf2\x16,1\t\xf1\uba0a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xbap\xe8\xb4u\x9c\f<\x82\xcc\x00\xacN\x9a\x94\xdd[\xaf\xb2\xb8\x890C\xfa3\xc4\x12\xd7\x00\x00\u07d4\xba\x8ac\xf3\xf4\r\u4a03\x88\xbcP!/\xea\x8e\x06O\xbb\x86\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xba\x8eF\u059d.#C\xd8l`\xd8,\xf4, A\xa0\xc1\u0089\x05k\xc7^-c\x10\x00\x00\u07d4\xba\xa4\xb6L+\x15\xb7\x9f_ BF\xfdp\xbc\xbd\x86\xe4\xa9*\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xba\u0212,J\xcc},\xb6\xfdY\xa1N\xb4\\\xf3\xe7\x02!K\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xba\xd25\xd5\b]\u01f0h\xa6|A&w\xb0>\x186\x88L\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xba\xd4B^\x17\x1c>r\x97^\xb4j\xc0\xa0\x15\xdb1Z]\x8f\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xba\xdc*\xef\x9fYQ\xa8\u05cak5\xc3\u0433\xa4\xe6\xe2\xe79\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xba\xdeCY\x9e\x02\xf8OL0\x14W\x1c\x97k\x13\xa3le\xab\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xba\xe9\xb8/r\x99c\x14\be\x9d\xd7N\x89\x1c\xb8\xf3\x86\x0f\xe5\x89j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\xbb\x03f\xa7\u03fd4E\xa7\r\xb7\xfeZ\xe3H\x85uO\xd4h\x8a\x01M\xef,B\xeb\xd6@\x00\x00\u07d4\xbb\aj\xac\x92 \x80i\xea1\x8a1\xff\x8e\xeb\x14\xb7\xe9\x96\xe3\x89\b\x13\xcaV\x90m4\x00\x00\u07d4\xbb\bW\xf1\xc9\x11\xb2K\x86\u0227\x06\x81G?\u6aa1\xcc\xe2\x89\x05k\xc7^-c\x10\x00\x00\u0794\xbb\x19\xbf\x91\u02edt\xcc\xeb_\x81\x1d\xb2~A\x1b\xc2\xea\x06V\x88\xf4?\xc2\xc0N\xe0\x00\x00\xe0\x94\xbb'\u01a7\xf9\x10uGZ\xb2)a\x90@\xf8\x04\xc8\xeczj\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xbb7\x1cr\xc9\xf01l\xea+\xd9\xc6\xfb\xb4\a\x9ewT)\xef\x89_h\xe8\x13\x1e\u03c0\x00\x00\xe0\x94\xbb;\x01\v\x18\xe6\xe2\xbe\x115\x87\x10&\xb7\xba\x15\xea\x0f\xde$\x8a\x02 |\x800\x9bwp\x00\x00\xe0\x94\xbb;\x90\x05\xf4o\xd2\xca;0\x16%\x99\x92\x8cw\xd9\xf6\xb6\x01\x8a\x01\xb1\xae\u007f+\x1b\xf7\xdb\x00\x00\u07d4\xbb?\xc0\xa2\x9c\x03Mq\b\x12\xdc\xc7u\xc8\u02b9\u048diu\x899\xd4\xe8D\xd1\xcf_\x00\x00\u07d4\xbbH\xea\xf5\x16\xce-\xec>A\xfe\xb4\xc6y\xe4\x95vA\x16O\x89\xcf\x15&@\xc5\xc80\x00\x00\u07d4\xbbKJKT\x80p\xffAC,\x9e\b\xa0\xcao\xa7\xbc\x9fv\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\u07d4\xbbV\xa4\x04r<\xff \xd0hT\x88\xb0Z\x02\xcd\xc3Z\xac\xaa\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xbba\x8e%\"\x1a\u0667@\xb2\x99\xed\x14\x06\xbc94\xb0\xb1m\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbba\xa0K\xff\xd5|\x10G\rE\u00d1\x03\xf6FP4v\x16\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbbh#\xa1\xbd\x81\x9f\x13QU8&J-\xe0R\xb4D\"\b\x89\x01ch\xffO\xf9\xc1\x00\x00\u07d4\xbbl(J\xac\x8ai\xb7\\\u0770\x0f(\xe1EX;V\xbe\u0389lk\x93[\x8b\xbd@\x00\x00\u07d4\xbbu\xcbPQ\xa0\xb0\x94KFs\xcau*\x97\x03\u007f|\x8c\x15\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbb\x99;\x96\xee\x92Z\xda}\x99\u05c6W=?\x89\x18\f\u3a89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbb\xa3\u0180\x04$\x8eH\x95s\xab\xb2t6w\x06k$\u0227\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbb\xa4\xfa\xc3\xc4 9\xd8(\xe7B\xcd\xe0\xef\xff\xe7t\x94\x1b9\x89lj\u04c2\xd4\xfba\x00\x00\u07d4\xbb\xa8\xab\"\xd2\xfe\xdb\xcf\xc6?hL\b\xaf\xdf\x1c\x17P\x90\xb5\x89\x05_)\xf3~N;\x80\x00\u07d4\xbb\xa9v\xf1\xa1!_u\x12\x87\x18\x92\xd4_pH\xac\xd3V\u0209lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xbb\xab\x00\v\x04\b\xed\x01Z7\xc0GG\xbcF\x1a\xb1N\x15\x1b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xbb\xab\xf6d;\xebK\xd0\x1c\x12\v\xd0Y\x8a\t\x87\xd8)g\u0449\xb52\x81x\xad\x0f*\x00\x00\u07d4\xbb\xb4\xee\x1d\x82\xf2\xe1VD,\xc938\xa2\xfc(o\xa2\x88d\x89JD\x91\xbdm\xcd(\x00\x00\u07d4\xbb\xb5\xa0\xf4\x80,\x86H\x00\x9e\x8ai\x98\xaf5,\u0787TO\x89\x05-T(\x04\xf1\xce\x00\x00\u07d4\xbb\xb6C\xd2\x18{6J\xfc\x10\xa6\xfd6\x8d}U\xf5\r\x1a<\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbb\xb8\xff\xe4?\x98\u078e\xae\x18F#\xaeRd\xe4$\u0438\u05c9\x05\xd5?\xfd\xe9(\b\x00\x00\u07d4\xbb\xbdn\u02f5u(\x91\xb4\u03b3\xcc\xe7:\x8fGpY7o\x89\x01\xf3\x99\xb1C\x8a\x10\x00\x00\u07d4\xbb\xbf9\xb1\xb6y\x95\xa4\"APO\x97\x03\u04a1JQV\x96\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xbb\xc8\xea\xffc~\x94\xfc\u014d\x91\xdb\\\x89\x12\x1d\x06\xe1/\xff\x98\x80\x00\u07d4\xbc\u065e\xdc!`\xf2\x10\xa0^:\x1f\xa0\xb0CL\xed\x00C\x9b\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbc\u07ec\xb9\xd9\x02<4\x17\x18.\x91\x00\xe8\xea\x1d73\x93\xa3\x89\x034-`\xdf\xf1\x96\x00\x00\u07d4\xbc\xe1>\"2*\u03f3U\xcd!\xfd\r\xf6\f\xf9:\xdd&\u0189\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xbc\xe4\x04u\xd3E\xb0q-\xeep=\x87\xcdvW\xfc\u007f;b\x8a\x01\xa4 \xdb\x02\xbd}X\x00\x00\u07d4\xbc\xed\xc4&|\u02c9\xb3\x1b\xb7d\xd7!\x11q\x00\x8d\x94\xd4M\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbc\xfc\x98\xe5\xc8+j\xdb\x18\n?\xcb\x12\v\x9av\x90\xc8j?\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xbd\x04;g\xc6>`\xf8A\xcc\xca\x15\xb1)\xcd\xfee\x90\xc8\xe3\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbd\x04\u007f\xf1\xe6\x9c\u01b2\x9a\xd2d\x97\xa9\xa6\xf2z\x90?\xc4\u0749.\xe4IU\b\x98\xe4\x00\x00\u07d4\xbd\b\xe0\xcd\xde\xc0\x97\xdby\x01\ua05a=\x1f\xd9\u0789Q\xa2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xbd\t\x12l\x89\x1cJ\x83\x06\x80Y\xfe\x0e\x15ylFa\xa9\xf4\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xbd\f\\\u05d9\xeb\u0106B\xef\x97\xd7N\x8eB\x90d\xfe\u4489\x11\xac(\xa8\xc7)X\x00\x00\u07d4\xbd\x17\xee\xd8+\x9a%\x92\x01\x9a\x1b\x1b<\x0f\xba\xd4\\@\x8d\"\x89\r\x8drkqw\xa8\x00\x00\u07d4\xbd\x18\x037\v\u0771)\xd29\xfd\x16\xea\x85&\xa6\x18\x8a\u5389\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xbd+p\xfe\xcc7d\x0fiQO\xc7\xf3@IF\xaa\xd8k\x11\x89A\rXj \xa4\xc0\x00\x00\u07d4\xbd0\x97\xa7\x9b<\r.\xbf\xf0\xe6\xe8j\xb0\xed\xad\xbe\xd4p\x96\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\xbd2]@)\xe0\xd8r\x9fm9\x9cG\x82$\xae\x9ez\xe4\x1e\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\xbdC*9\x16$\x9bG$):\xf9\x14nI\xb8(\n\u007f*\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xbdG\xf5\xf7n;\x93\x0f\xd9HR\t\xef\xa0\xd4v=\xa0uh\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbdK`\xfa\xect\n!\xe3\a\x13\x91\xf9j\xa54\xf7\xc1\xf4N\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xbdK\u0571\"\xd8\xef{|\x8f\x06gE\x03 \xdb!\x16\x14.\x89 \x86\xac5\x10R`\x00\x00\u07d4\xbdQ\xee.\xa1C\u05f1\u05b7~~D\xbd\xd7\xda\x12\U00105b09G~\x06\u0332\xb9(\x00\x00\u07d4\xbdY\tN\aO\x8dy\x14*\xb1H\x9f\x14\x8e2\x15\x1f \x89\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xbdZ\x8c\x94\xbd\x8b\xe6G\x06D\xf7\f\x8f\x8a3\xa8\xa5\\cA\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbd^G:\xbc\xe8\xf9zi2\xf7|/\xac\xaf\x9c\xc0\xa0\x05\x14\x89<\x92X\xa1\x06\xa6\xb7\x00\x00\u07d4\xbd_F\u02ab,=K(\x93\x96\xbb\xb0\u007f *\x06\x11>\xd4\xc3\xfb\xa1\xa8\x91;\x19@~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbd\x9eV\xe9\x02\xf4\xbe\x1f\xc8v\x8d\x808\xba\xc6>*\u02ff\x8e\x8965f3\xeb\xd8\xea\x00\x00\u07d4\xbd\xa4\xbe1~~K\xed\x84\xc0I^\xee2\xd6\a\xec8\xcaR\x89}2'yx\xefN\x80\x00\u07d4\xbd\xb6\v\x82:\x11s\xd4Z\a\x92$_\xb4\x96\xf1\xfd3\x01\u03c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xbd\xba\xf6CM@\xd65[\x1e\x80\xe4\f\u012b\x9ch\xd9a\x16\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xbd\xc0,\xd43\f\x93\xd6\xfb\xdaOm\xb2\xa8]\xf2/C\xc23\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbd\xc4aF+c\"\xb4b\xbd\xb3?\"y\x9e\x81\b\xe2A}\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\xbd\xc79\xa6\x99p\v.\x8e,JL{\x05\x8a\x0eQ=\u07be\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbd\xc7Hs\xaf\x92+\x9d\xf4t\x85;\x0f\xa7\xff\v\xf8\xc8&\x95\x89\xd8\xc9F\x00c\xd3\x1c\x00\x00\u07d4\xbd\xca*\x0f\xf3E\x88\xafb_\xa8\xe2\x8f\xc3\x01Z\xb5\xa3\xaa\x00\x89~\xd7?w5R\xfc\x00\x00\u07d4\xbd\xd3%N\x1b:m\xc6\xcc,i}Eq\x1a\xca!\xd5\x16\xb2\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xbd\u07e3M\x0e\xbf\x1b\x04\xafS\xb9\x9b\x82IJ\x9e=\x8a\xa1\x00\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xbd\xe4\xc7?\x96\x9b\x89\xe9\u03aef\xa2\xb5\x18DH\x0e\x03\x8e\x9a\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xbd\xe9xj\x84\xe7[H\xf1\x8erm\u05cdp\xe4\xaf>\xd8\x02\x8a\x016\x9f\xb9a(\xacH\x00\x00\u07d4\xbd\xed\x11a/\xb5\xc6\u0699\xd1\xe3\x0e2\v\xc0\x99Tf\x14\x1e\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xbd\xed~\a\xd0q\x1ehM\xe6Z\u0232\xabW\xc5\\\x1a\x86E\x89 \t\xc5\u023fo\xdc\x00\x00\u07d4\xbd\xf6\x93\xf83\xc3\xfeG\x17S\x18G\x88\xebK\xfeJ\xdc?\x96\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xbd\xf6\xe6\x8c\f\xd7X@\x80\xe8G\xd7,\xbb#\xaa\xd4j\xeb\x1d\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xbe\n/8_\t\xdb\xfc\xe9g2\xe1+\xb4\n\xc3I\x87\x1b\xa8\x89WL\x11^\x02\xb8\xbe\x00\x00\u07d4\xbe\f*\x80\xb9\xde\bK\x17(\x94\xa7l\xf4szOR\x9e\x1a\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xbe\x1c\xd7\xf4\xc4r\a\th\xf3\xbd\xe2h6k!\xee\xea\x83!\x89\xe9\x1a|\u045f\xa3\xb0\x00\x00\u07d4\xbe#F\xa2\u007f\xf9\xb7\x02\x04OP\r\xef\xf2\xe7\xff\xe6\x82EA\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xbe$q\xa6\u007f`G\x91\x87r\xd0\xe3h9%^\xd9\u0591\xae\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xbe+\"\x80R7h\xea\x8a\xc3\\\xd9\xe8\x88\xd6\nq\x93\x00\u0509lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xbe+2nx\xed\x10\xe5P\xfe\xe8\xef\xa8\xf8\a\x03\x96R/Z\x8a\bW\xe0\xd6\xf1\xdav\xa0\x00\x00\xe0\x94\xbe0Zyn3\xbb\xf7\xf9\xae\xaee\x12\x95\x90f\xef\xda\x10\x10\x8a\x02M\xceT\xd3J\x1a\x00\x00\x00\u07d4\xbeG\x8e\x8e=\xdek\xd4\x03\xbb-\x1ce|C\x10\xee\x19'#\x89\x1a\xb2\xcf|\x9f\x87\xe2\x00\x00\u07d4\xbeN}\x98?.*ck\x11\x02\xecp9\xef\xeb\xc8B\u9349\x03\x93\xef\x1aQ'\xc8\x00\x00\u07d4\xbeO\xd0sap\"\xb6\u007f\\\x13I\x9b\x82\u007fv69\xe4\xe3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbeRZ3\xea\x91aw\xf1r\x83\xfc\xa2\x9e\x8b5\v\u007fS\v\x89\x8f\x01\x9a\xafF\xe8x\x00\x00\u07d4\xbeS2/C\xfb\xb5\x84\x94\xd7\xcc\xe1\x9d\xda'+$P\xe8'\x89\n\xd7\u03afB\\\x15\x00\x00\u07d4\xbeS\x82F\xddNo\f \xbfZ\xd17<;F:\x13\x1e\x86\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbeZ`h\x99\x98c\x9a\xd7[\xc1\x05\xa3qt>\xef\x0fy@\x89\x1b2|s\xe1%z\x00\x00\u07d4\xbe\\\xba\x8d7By\x86\xe8\xca&\x00\xe8X\xbb\x03\xc3YR\x0f\x89\xa00\xdc\xeb\xbd/L\x00\x00\u07d4\xbe`\x03~\x90qJK\x91~a\xf1\x93\xd84\x90g\x03\xb1:\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xbec:77\xf6\x849\xba\xc7\xc9\nR\x14 X\ue38ao\x894\n\xad!\xb3\xb7\x00\x00\x00\xe0\x94\xbee\x9d\x85\xe7\xc3O\x883\xea\u007fH\x8d\xe1\xfb\xb5\xd4\x14\x9b\xef\x8a\x01\xeb\xd2:\xd9\u057br\x00\x00\u07d4\xbes'M\x8cZ\xa4J<\xbe\xfc\x82c\xc3{\xa1!\xb2\n\u04c9\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xbe\x86\u0430C\x84\x19\u03b1\xa081\x927\xbaR\x06\xd7.F\x8964\xfb\x9f\x14\x89\xa7\x00\x00\u07d4\xbe\x8d\u007f\x18\xad\xfe]l\xc7u9I\x89\xe1\x93\f\x97\x9d\x00}\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbe\x91\x86\xc3JRQJ\xbb\x91\a\x86\x0fgO\x97\xb8!\xbd[\x89\x1b\xa0\x1e\xe4\x06\x03\x10\x00\x00\u07d4\xbe\x93W\x93\xf4[p\xd8\x04]&T\xd8\xdd:\xd2K[a7\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\xbe\x98\xa7\u007f\xd4\x10\x97\xb3OY\xd7X\x9b\xaa\xd0!e\x9f\xf7\x12\x890\xca\x02O\x98{\x90\x00\x00\u07d4\xbe\x9b\x8c4\xb7\x8e\xe9G\xff\x81G.\xdaz\xf9\xd2\x04\xbc\x84f\x89\b!\xab\rD\x14\x98\x00\x00\u07d4\xbe\xa0\r\xf1pg\xa4:\x82\xbc\x1d\xae\xca\xfbl\x140\x0e\x89\xe6\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xbe\xa0\xaf\xc9:\xae!\b\xa3\xfa\xc0Yb;\xf8o\xa5\x82\xa7^\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xbe\xb35\x8cP\u03dfu\xff\xc7mD<,\u007fU\aZ\x05\x89\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xbe\xb4\xfd1UYC`E\u0739\x9dI\xdc\xec\x03\xf4\fB\u0709lk\x93[\x8b\xbd@\x00\x00\u07d4\xbe\xc2\xe6\xde9\xc0|+\xaeUj\u03fe\xe2\xc4r\x8b\x99\x82\xe3\x89\x1f\x0f\xf8\xf0\x1d\xaa\xd4\x00\x00\u07d4\xbe\xc6d\x0fI\t\xb5\x8c\xbf\x1e\x80cB\x96\x1d`u\x95\tl\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xbe\xc8\xca\xf7\xeeIF\x8f\xeeU.\xff:\xc5#N\xb9\xb1}B\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbe\xce\xf6\x1c\x1cD+\xef|\xe0Ks\xad\xb2I\xa8\xba\x04~\x00\x896;V\u00e7T\xc8\x00\x00\u0794\xbe\xd4d\x9d\xf6F\u2052)\x03-\x88hUo\xe1\xe0S\u04c8\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\xbe\xd4\xc8\xf0\x06\xa2|\x1e_|\xe2\x05\xdeu\xf5\x16\xbf\xb9\xf7d\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\xbe\xe8\u0430\bB\x19T\xf9-\x00\r9\x0f\xb8\xf8\xe6X\xea\xee\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbe\xec\u05af\x90\f\x8b\x06J\xfc\xc6\a?-\x85\u055a\xf1\x19V\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xbe\xef\x94!8y\xe0&\"\x14+\xeaa)\tx\x93\x9a`\u05ca\x016\x85{2\xad\x86\x04\x80\x00\xe0\x94\xbe\xf0}\x97\xc3H\x1f\x9dj\xee\x1c\x98\xf9\xd9\x1a\x18\n2D+\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xbe\xfbD\x8c\f_h?\xb6~\xe5p\xba\xf0\xdbV\x86Y\x97Q\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xbf\x05\a\f,4!\x93\x11\xc4T\x8b&\x14\xa48\x81\r\xedm\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbf\x05\xff^\xcf\r\xf2\u07c8wY\xfb\x82t\xd928\xac&}\x89+^:\xf1k\x18\x80\x00\x00\xe0\x94\xbf\t\xd7pH\xe2p\xb6b3\x0e\x94\x86\xb3\x8bC\xcdx\x14\x95\x8a\\S\x9b{\xf4\xff(\x80\x00\x00\u07d4\xbf\x17\xf3\x97\xf8\xf4o\x1b\xaeE\u0447\x14\x8c\x06\xee\xb9Y\xfaM\x896I\u0156$\xbb0\x00\x00\u07d4\xbf\x186A\xed\xb8\x86\xce`\xb8\x19\x02a\xe1OB\xd9<\xce\x01\x89\x01[5W\xf1\x93\u007f\x80\x00\u07d4\xbf*\xeaZ\x1d\xcfn\u04f5\xe829D\xe9\x83\xfe\xdf\u046c\xfb\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xbf@\x96\xbcT}\xbf\xc4\xe7H\t\xa3\x1c\x03\x9e{8\x9d^\x17\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\xbfI\xc1H\x981eg\u0637\t\xc2\xe5\x05\x94\xb3f\xc6\u04cc\x89'\xbf8\xc6TM\xf5\x00\x00\u07d4\xbfLs\xa7\xed\xe7\xb1d\xfe\a!\x14\x846T\xe4\xd8x\x1d\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xbfP\xce.&K\x9f\xe2\xb0h0az\xed\xf5\x02\xb25\x1bE\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbfY\xae\xe2\x81\xfaC\xfe\x97\x19CQ\xa9\x85~\x01\xa3\xb8\x97\xb2\x89 \x86\xac5\x10R`\x00\x00\u07d4\xbfh\u048a\xaf\x1e\xee\xfe\xf6F\xb6^\x8c\xc8\u0450\xf6\xc6\u069c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xbfi%\xc0\aQ\x00\x84@\xa6s\x9a\x02\xbf+l\u06ab^:\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xbfw\x01\xfcb%\u0561x\x15C\x8a\x89A\xd2\x1e\xbc]\x05\x9d\x89e\xea=\xb7UF`\x00\x00\u07d4\xbf\x8b\x80\x05\xd66\xa4\x96d\xf7Bu\xefBC\x8a\xcde\xac\x91\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbf\x92A\x8a\fl1$M\"\x02`\xcb>\x86}\u05f4\xefI\x89\x05i\x00\xd3<\xa7\xfc\x00\x00\u07d4\xbf\x9a\xcdDE\xd9\xc9UF\x89\u02bb\xba\xb1\x88\x00\xff\x17A\u008965\u026d\xc5\u07a0\x00\x00\u07d4\xbf\x9f'\x1fz~\x12\xe3m\xd2\xfe\x9f\xac\xeb\xf3\x85\xfeaB\xbd\x89\x03f\xf8O{\xb7\x84\x00\x00\u07d4\xbf\xa8\xc8X\xdf\x10,\xb1$!\x00\x8b\n1\xc4\xc7\x19\n\xd5`\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xbf\xae\xb9\x10ga}\u03cbD\x17+\x02\xafaVt\x83]\xba\x89\b\xb5\x9e\x88H\x13\b\x80\x00\xe0\x94\xbf\xb0\xea\x02\xfe\xb6\x1d\xec\x9e\"\xa5\a\tY3\x02\x99\xc40r\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xbf\xbc\xa4\x18\xd3R\x9c\xb3\x93\b\x10b\x03*n\x11\x83\u01b2\u070a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xbf\xbe\x05\u831c\xbb\xcc\x0e\x92\xa4\x05\xfa\xc1\xd8]\xe2H\xee$\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xbf\xbf\xbc\xb6V\u0099+\xe8\xfc\u0782\x19\xfb\xc5J\xad\u055f)\x8a\x02\x1e\x18\xd2\xc8!\xc7R\x00\x00\u07d4\xbf\xc5z\xa6f\xfa\u239f\x10zI\xcbP\x89\xa4\xe2!Q\u074965\u026d\xc5\u07a0\x00\x00\u07d4\xbf\u02d70$c\x04p\r\xa9\vAS\xe7\x11Ab.\x1cA\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xbf\xd9<\x90\u009c\a\xbc_\xb5\xfcI\xae\xeaU\xa4\x0e\x13O5\x8a\x05\xed\xe2\x0f\x01\xa4Y\x80\x00\x00\xe0\x94\xbf\xe3\xa1\xfcn$\xc8\xf7\xb3%\x05`\x99\x1f\x93\u02e2\u03c0G\x8a\x10\xf0\xcf\x06M\u0552\x00\x00\x00\u07d4\xbf\u6f30\xf0\xc0xRd3$\xaa]\xf5\xfdb%\xab\xc3\u0289\x04\t\xe5+H6\x9a\x00\x00\u07d4\xbf\xf5\xdfv\x994\xb8\x94<\xa9\x13}\x0e\xfe\xf2\xfen\xbb\xb3N\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xbf\xfbi)$\x1fx\x86\x93'>p\"\xe6\x0e>\xab\x1f\xe8O\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc0\x06O\x1d\x94t\xab\x91]V\x90l\x9f\xb3 \xa2\xc7\t\x8c\x9b\x89\x13h?\u007f<\x15\xd8\x00\x00\u07d4\xc0\a\xf0\xbd\xb6\xe7\x00\x92\x02\xb7\xaf>\xa9\t\x02i|r\x14\x13\x89\xa2\xa0\xe4>\u007f\xb9\x83\x00\x00\u07d4\xc0\n\xb0\x80\xb6C\xe1\u00ba\xe3c\xe0\u0455\xde.\xff\xfc\x1cD\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u0794\xc0 wD\x9a\x13Jz\xd1\xef~M\x92z\xff\xec\ueb75\xae\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xc0$q\xe3\xfc.\xa0S&\x15\xa7W\x1dI2\x89\xc1<6\xef\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc0-n\xad\xea\xcf\x1bx\xb3\u0285\x03\\c{\xb1\xce\x01\xf4\x90\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc03\xb12Z\n\xf4Tr\xc2U'\x85;\x1f\x1c!\xfa5\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xc03\xbe\x10\xcbHa;\xd5\xeb\xcb3\xedI\x02\xf3\x8bX0\x03\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xc04[3\xf4\x9c\xe2\u007f\xe8,\xf7\xc8M\x14\x1ch\xf5\x90\xcev\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc0=\xe4*\x10\x9bezd\xe9\"$\xc0\x8d\xc1'^\x80\u0672\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc0@i\u07f1\x8b\tlxg\xf8\xbe\xe7zm\xc7Gz\xd0b\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\xc0A?Z|-\x9aK\x81\b(\x9e\xf6\xec\xd2qx\x15$\xf4\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\xc0C\xf2E-\u02d6\x02\xefb\xbd6\x0e\x03=\xd29q\xfe\x84\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc0OK\xd4\x04\x9f\x04F\x85\xb8\x83\xb6)Y\xaec\x1df~5\x8a\x01;\x80\xb9\x9cQ\x85p\x00\x00\u07d4\xc0V\u053dk\xf3\u02ec\xace\xf8\xf5\xa0\xe3\x98\v\x85'@\xae\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xc0[t\x06 \xf1s\xf1nRG\x1d\u00cb\x9cQJ\v\x15&\x89\a\x96\xe3\xea?\x8a\xb0\x00\x00\u07d4\xc0i\xef\x0e\xb3B\x99\xab\xd2\xe3-\xab\xc4yD\xb2r3H$\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4\xc0l\xeb\xbb\xf7\xf5\x14\x9af\xf7\xeb\x97k>G\xd5e\x16\xda/\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc0r^\u00bd\xc3:\x1d\x82`q\u07a2\x9db\xd48Z\x8c%\x8a\b\xa0\x85\x13F:\xa6\x10\x00\x00\u07d4\xc0~8g\xad\xa0\x96\x80z\x05\x1al\x9c4\xcc;?J\xd3J\x89`\xf0f \xa8IE\x00\x00\u07d4\xc0\x89^\xfd\x05m\x9a:\x81\xc3\xdaW\x8a\xda1\x1b\xfb\x93V\u03c9\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc0\x90\xfe#\xdc\xd8k5\x8c2\xe4\x8d*\xf9\x10$%\x9fef\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc0\x9af\x17*\xea7\r\x9ac\xda\x04\xffq\xff\xbb\xfc\xff\u007f\x94\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc0\x9e<\xfc\x19\xf6\x05\xff>\xc9\xc9\xc7\x0e%@\xd7\xee\x97Cf\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc0\xa0*\xb9N\xbeV\xd0E\xb4\x1bb\x9b\x98F.:\x02J\x93\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xc0\xa3\x93\b\xa8\x0e\x9e\x84\xaa\xaf\x16\xac\x01\xe3\xb0\x1dt\xbdk-\x89\afM\xddL\x1c\v\x80\x00\u07d4\xc0\xa6\u02edwi*=\x88\xd1A\xefv\x9a\x99\xbb\x9e<\x99Q\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xc0\xa7\xe8C]\xff\x14\xc2Uws\x9d\xb5\\$\u057fW\xa3\u064a\nm\xd9\f\xaeQ\x14H\x00\x00\u07d4\xc0\xae\x14\xd7$\x83./\xce'x\xde\u007f{\x8d\xaf{\x12\xa9>\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc0\xaf\xb7\u0637\x93p\xcf\xd6c\u018c\u01b9p*7\u035e\xff\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc0\xb0\xb7\xa8\xa6\xe1\xac\xdd\x05\xe4\u007f\x94\xc0\x96\x88\xaa\x16\u01ed\x8d\x89\x03{m\x02\xacvq\x00\x00\xe0\x94\xc0\xb3\xf2D\xbc\xa7\xb7\xde[H\xa5>\u06dc\xbe\xab\vm\x88\xc0\x8a\x01;\x80\xb9\x9cQ\x85p\x00\x00\u07d4\xc0\xc0M\x01\x06\x81\x0e>\xc0\xe5J\x19\U000ab157\xe6\x9aW=\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xc0\xca2w\x94.tE\x87K\xe3\x1c\xeb\x90)rqO\x18#\x89\r\x8drkqw\xa8\x00\x00\u07d4\xc0\u02ed<\xcd\xf6T\xda\"\xcb\xcf\\xe\x97\xca\x19U\xc1\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc0\xcb\xf6\x03/\xa3\x9e|F\xffw\x8a\x94\xf7\xd4E\xfe\"\xcf0\x89\x10\xce\x1d=\x8c\xb3\x18\x00\x00\u07d4\xc0\xe0\xb9\x03\b\x8e\fc\xf5=\xd0iWTR\xaf\xf5$\x10\u00c9\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xc0\xe4W\xbdV\xec6\xa1$k\xfa20\xff\xf3\x8eY&\xef\"\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xc0\xed\rJ\xd1\r\xe045\xb1S\xa0\xfc%\xde;\x93\xf4R\x04\x89\xabM\xcf9\x9a:`\x00\x00\u07d4\xc0\xf2\x9e\xd0\af\x11\xb5\xe5^\x13\x05G\xe6\x8aH\xe2m\xf5\u4262\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xc1\x13(x#\\]\u06e5\xd9\xf3\"\x8bR6\xe4p \xdco\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc1\x17\r\xba\xad\xb3\xde\xe6\x19\x8e\xa5D\xba\xec\x93%\x18`\xfd\xa5\x89A\rXj \xa4\xc0\x00\x00\xe0\x94\xc1&W=\x87\xb0\x17ZR\x95\xf1\xdd\a\xc5u\u03cc\xfa\x15\xf2\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xc1'\xaa\xb5\x90e\xa2\x86D\xa5k\xa3\xf1^.\xac\x13\xda)\x95\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xc1+\u007f@\u07da/{\xf9\x83f\x14\"\xab\x84\xc9\xc1\xf5\bX\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xc1,\xfb{=\xf7\x0f\xce\xca\x0e\xde&5\x00\xe2xs\xf8\xed\x16\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc1/\x88\x1f\xa1\x12\xb8\x19\x9e\xcb\xc7>\xc4\x18W\x90\xe6\x14\xa2\x0f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc18Lnq~\xbeK#\x01NQ\xf3\x1c\x9d\xf7\xe4\xe2[1\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc1C\x8c\x99\xddQ\xef\x1c\xa88j\xf0\xa3\x17\xe9\xb0AEx\x88\x89\f\x1d\xaf\x81\u0623\xce\x00\x00\u07d4\xc1c\x12(\xef\xbf*.:@\x92\xee\x89\x00\xc69\xed4\xfb\u02093\xc5I\x901r\f\x00\x00\u07d4\xc1u\xbe1\x94\xe6iB-\x15\xfe\xe8\x1e\xb9\xf2\xc5lg\xd9\u0249\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc1\x82v\x86\xc0\x16\x94\x85\xec\x15\xb3\xa7\xc8\xc0\x15\x17\xa2\x87M\xe1\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xc1\x8a\xb4g\xfe\xb5\xa0\xaa\xdf\xff\x91#\x0f\xf0VFMx\xd8\x00\x89lk\x93[\x8b\xbd@\x00\x00\u0794\xc1\x95\x05CUM\x8aq0\x03\xf6b\xbba,\x10\xadL\xdf!\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xc1\xa4\x1aZ'\x19\x92&\xe4\xc7\xeb\x19\x8b\x03\x1bY\x19o\x98B\x89\nZ\xa8P\t\xe3\x9c\x00\x00\u07d4\xc1\xb2\xa0\xfb\x9c\xadE\xcdi\x91\x92\xcd'T\v\x88\xd38By\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc1\xb2\xaa\x8c\xb2\xbfb\xcd\xc1:G\xec\xc4e\u007f\xac\xaa\x99_\x98\x8967\x93\xfa\x96\u6980\x00\u07d4\xc1\xb5\x00\x01\x1c\xfb\xa9]|\xd66\xe9^l\xbfagFK%\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc1\xb9\xa5pM5\x1c\xfe\x98?y\xab\xee\xc3\u06fb\xae;\xb6)\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc1\xcb\xd2\xe23*RL\xf2\x19\xb1\r\x87\x1c\xcc \xaf\x1f\xb0\xfa\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xc1\xcd\xc6\x01\xf8\x9c\x04(\xb3\x13\x02\u0447\xe0\xdc\b\xad}\x1cW\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xc1\u052f8\xe9\xbay\x90@\x89HI\xb8\xa8!\x93u\xf1\xacx\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc1\xe1@\x9c\xa5,%CQ4\xd0\x06\u00a6\xa8T-\xfbrs\x89\x01\xdd\x1eK\xd8\xd1\xee\x00\x00\u07d4\xc1\xeb\xa5hJ\xa1\xb2L\xbac\x15\x02c\xb7\xa9\x13\x1a\xee\u008d\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc1\xec\x81\xdd\x12=K|-\u0674\xd48\xa7\a,\x11\u0707L\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc1\xf3\x9b\xd3]\xd9\xce\xc37\xb9oG\xc6w\x81\x81`\xdf7\xb7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794\xc1\xff\xad\a\u06d6\x13\x8cK*S\x0e\xc1\xc7\xde)\xb8\xa0Y,\x88\xf4?\xc2\xc0N\xe0\x00\x00\xe0\x94\xc2\x1f\xa6d:\x1f\x14\xc0)\x96\xadqD\xb7Y&\xe8~\xcbK\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc24\nL\xa9L\x96x\xb7IL<\x85%(\xed\xe5\xeeR\x9f\x89\x02\xa3k\x05\xa3\xfd|\x80\x00\u07d4\xc29\xab\u07ee>\x9a\xf5E\u007fR\xed+\x91\xfd\n\xb4\xd9\xc7\x00\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc2;/\x92\x1c\xe4\xa3z%\x9e\u4b4b!X\xd1]fOY\x89\x01`\x89\x95\xe8\xbd?\x80\x00\u07d4\xc2C\x99\xb4\xbf\x86\xf73\x8f\xbfd^;\"\xb0\u0dd79\x12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc2L\u03bc#D\xcc\xe5d\x17\xfbhL\xf8\x16\x13\xf0\xf4\xb9\xbd\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\xc2Rf\xc7gf2\xf1>\xf2\x9b\xe4U\ud50a\xddVw\x92\x89Hz\x9a0E9D\x00\x00\u07d4\xc2\\\xf8&U\f\x8e\xaf\x10\xaf\"4\xfe\xf9\x04\u0779R\x13\xbe\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc2f?\x81E\xdb\xfe\xc6\xc6F\xfc\\I\x96\x13E\xde\x1c\x9f\x11\x89%g\xacp9+\x88\x00\x00\u07d4\xc2pEh\x854+d\vL\xfc\x1bR\x0e\x1aTN\xe0\xd5q\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xc2sv\xf4]!\xe1^\xde;&\xf2e_\xce\xe0,\xcc\x0f*\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xc2w\x97q\xf0Smy\xa8p\x8fi1\xab\xc4K05\u964a\x047\u04ca\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xc2\xc1>r\xd2h\xe7\x15\r\u01d9\xe7\xc6\xcf\x03\u0209T\xce\u05c9%\xf2s\x93=\xb5p\x00\x00\u07d4\xc2\xcb\x1a\xda]\xa9\xa0B8s\x81G\x93\xf1aD\xef6\xb2\xf3\x89HU~;p\x17\xdf\x00\x00\u07d4\xc2\xd1w\x8e\xf6\xee_\xe4\x88\xc1E\xf3Xkn\xbb\xe3\xfb\xb4E\x89>\x1f\xf1\xe0;U\xa8\x00\x00\xe0\x94\xc2\xd9\xee\xdb\xc9\x01\x92c\xd9\xd1l\u016e\a-\x1d=\xd9\xdb\x03\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc2\xe0XJq4\x8c\xc3\x14\xb7; )\xb6#\v\x92\u06f1\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc2\xe2\u0518\xf7\r\xcd\bY\xe5\v\x02:q\nmK!3\xbd\x8989\x11\xf0\f\xbc\xe1\x00\x00\u07d4\xc2\xed_\xfd\u046d\xd8U\xa2i/\xe0b\xb5\xd6\x18t#`\u0509A\rXj \xa4\xc0\x00\x00\u07d4\xc2\xee\x91\xd3\xefX\xc9\u0465\x89\x84N\xa1\xae1%\xd6\u017ai\x894\x95tD\xb8@\xe8\x00\x00\u07d4\xc2\xfa\xfd\xd3\n\xcbmg\x06\xe9)<\xb0&A\xf9\xed\xbe\a\xb5\x89Q\x00\x86\vC\x0fH\x00\x00\u07d4\xc2\xfd\v\xf7\xc7%\xef>\x04~Z\xe1\u009f\xe1\x8f\x12\xa7)\x9c\x89Hz\x9a0E9D\x00\x00\u07d4\xc2\xfe}us\x1fcm\xcd\t\xdb\xda\x06q9;\xa0\xc8*}\x89wC\"\x17\xe6\x83`\x00\x00\u07d4\xc3\x10z\x9a\xf32-R8\xdf\x012A\x911b\x959W}\x89\x1a\xb4\xe4d\xd4\x141\x00\x00\xe0\x94\xc3\x11\v\xe0\x1d\xc9sL\xfcn\x1c\xe0\u007f\x87\xd7}\x13E\xb7\xe1\x8a\x01\x0f\f\xe9I\xe0\x0f\x93\x00\x00\u07d4\xc3 8\xcaR\xae\xe1\x97E\xbe\\1\xfc\xdcT\x14\x8b\xb2\xc4\u0409\x02\xb5\xaa\xd7,e \x00\x00\u07d4\xc3%\xc3R\x80\x1b\xa8\x83\xb3\"l_\xeb\r\xf9\xea\xe2\xd6\xe6S\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\xc3.\xc7\xe4*\xd1l\xe3\xe2UZ\xd4\xc5C\x06\xed\xa0\xb2gX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc32\xdfP\xb1<\x014\x90\xa5\xd7\xc7]\xbf\xa3f\u0687\xb6\u0589\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc3:\u0373\xba\x1a\xab'P{\x86\xb1]g\xfa\xf9\x1e\xcfb\x93\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc3>\u0393Z\x8fN\xf98\xea~\x1b\xac\x87\u02d2]\x84\x90\u028a\a\x03\x8c\x16x\x1fxH\x00\x00\u07d4\xc3@\xf9\xb9\x1c&r\x8c1\xd1!\xd5\xd6\xfc;\xb5m=\x86$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc3F\xcb\x1f\xbc\xe2\xab(]\x8eT\x01\xf4-\xd7#M7\xe8m\x89\x04\x86\u02d7\x99\x19\x1e\x00\x00\xe0\x94\xc3H=n\x88\xac\x1fJ\xe7<\xc4@\x8dl\x03\xab\xe0\xe4\x9d\u028a\x03\x99\x92d\x8a#\u0220\x00\x00\xe0\x94\xc3H\xfcZF\x13#\xb5{\xe3\x03\u02c96\x1b\x99\x19\x13\xdf(\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xc3N;\xa12.\xd0W\x11\x83\xa2O\x94 N\xe4\x9c\x18fA\x89\x03'\xaf\uf927\xbc\x00\x00\xe0\x94\xc3[\x95\xa2\xa3s|\xb8\xf0\xf5\x96\xb3E$\x87+\xd3\r\xa24\x8a\x01\x98\xbe\x85#^-P\x00\x00\xe0\x94\xc3c\x1cv\x98\xb6\xc5\x11\x19\x89\xbfE''\xb3\xf99Zm\xea\x8a\x02C'X\x96d\x1d\xbe\x00\x00\u07d4\xc3l\vc\xbf\xd7\\/\x8e\xfb\x06\b\x83\xd8h\xcc\xcdl\xbd\xb4\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94\xc3uk\xcd\xcc~\xect\xed\x89j\xdf\xc35'Y0&n\b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\u00c4\xacn\xe2|9\xe2\xf2x\xc2 \xbd\xfa[\xae\xd6&\xd9\u04c9 \x86\xac5\x10R`\x00\x00\u07d4\u00e0F\xe3\u04b2\xbfh\x14\x88\x82n2\xd9\xc0aQ\x8c\xfe\x8c\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\u07d4\u00e9\"j\xe2u\xdf,\xab1+\x91\x10@cJ\x9c\x9c\x9e\xf6\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u00f9(\xa7o\xadex\xf0O\x05U\xe69R\xcd!\xd1R\n\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc3\xc2)s)\xa6\xfd\x99\x11~T\xfcj\xf3y\xb4\xd5VT~\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc3\xc3\xc2Q\rg\x80 HZcs]\x13\a\xecL\xa60+\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc3\xcbk6\xafD?,n%\x8bJ9U:\x81\x87G\x81\x1f\x89WG=\x05\u06ba\xe8\x00\x00\xe0\x94\xc3\xdbVW\xbbr\xf1\rX\xf21\xfd\xdf\x11\x98\n\xffg\x86\x93\x8a\x01@a\xb9\xd7z^\x98\x00\x00\xe0\x94\xc3\u06df\xb6\xf4lH\n\xf3De\u05d7S\xb4\xe2\xb7Jg\u038a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc3\xddX\x908\x860;\x92\x86%%z\xe1\xa0\x13\xd7\x1a\xe2\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc3\xe0G\x1cd\xff5\xfaR2\xcc1!\xd1\u04cd\x1a\x0f\xb7\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xc3\xe2\f\x96\u07cdN8\xf5\v&Z\x98\xa9\x06\xd6\x1b\xc5\x1aq\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc3\u31f0<\xe9\\\xcf\xd7\xfaQ\u0744\x01\x83\xbcCS(\t\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc3\xf8\xf6r\x95\xa5\xcd\x04\x93d\xd0]#P&#\xa3\xe5.\x84\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc4\x01\xc4'\xcc\xcf\xf1\r\xec\xb8d /6\xf5\x80\x83\"\xa0\xa8\x89\xb4{Q\xa6\x9c\xd4\x02\x00\x00\u07d4\xc4\b\x8c\x02_>\x85\x01?T9\xfb4@\xa1s\x01\xe5D\xfe\x89~\t\xdbM\x9f?4\x00\x00\u07d4\xc4\x14a\xa3\u03fd2\u0246UU\xa4\x8117\xc0v1#`\x8965\xc6 G9\u0640\x00\u07d4\xc4 8\x8f\xbe\xe8J\xd6V\xddh\xcd\xc1\xfb\xaa\x93\x92x\v4\x89\n-\xcac\xaa\xf4\u0140\x00\u07d4\xc4\"P\xb0\xfeB\xe6\xb7\xdc\xd5\u0210\xa6\xf0\u020f__\xb5t\x89\b\x1e\xe4\x82SY\x84\x00\x00\u07d4\xc4-j\xebq\x0e:P\xbf\xb4Ml1\t)i\xa1\x1a\xa7\xf3\x89\b\"c\xca\xfd\x8c\xea\x00\x00\xe0\x94\xc4@\xc7\xca/\x96Kir\xeffJ\"a\xdd\xe8\x92a\x9d\x9c\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xc4K\xde\xc8\xc3l\\h\xba\xa2\xdd\xf1\xd41i2)rlC\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xc4OJ\xb5\xbc`9|s~\xb0h3\x91\xb63\xf8\xa2G\x1b\x12\x1c\xa4\x89 .h\xf2\u00ae\xe4\x00\x00\u07d4\xc4h\x1es\xbb\x0e2\xf6\xb7& H1\xffi\xba\xa4\x87~2\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xc4k\xbd\xefv\xd4\xca`\xd3\x16\xc0\u007f]\x1ax\x0e;\x16_~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc4}a\v9\x92P\xf7\x0e\xcf\x13\x89\xba\xb6),\x91&O#\x89\x0f\xa7\xe7\xb5\xdf<\xd0\x00\x00\u07d4\u0100;\xb4\a\xc7b\xf9\vu\x96\xe6\xfd\u1513\x1ev\x95\x90\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u0106Q\xc1\xd9\xc1k\xffL\x95T\x88l??&C\x1foh\x89#\xab\x95\x99\xc4?\b\x00\x00\u07d4\u0109\xc8?\xfb\xb0%*\xc0\xdb\xe3R\x12\x17c\x0e\x0fI\x1f\x14\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u010bi<\xac\xef\xdb\xd6\xcb]x\x95\xa4.1\x962~&\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0113H\x9eV\u00fd\xd8)\x00}\xc2\xf9VA)\x06\xf7k\xfa\x89\x02\xa7\x91H\x8eqT\x00\x00\u07d4\u0116\u02f0E\x9aj\x01`\x0f\u0149\xa5Z2\xb4T!\u007f\x9d\x89\x0e\u0683\x8cI)\b\x00\x00\u07d4\u011c\xfa\xa9g\xf3\xaf\xbfU\x03\x10a\xfcL\xef\x88\xf8]\xa5\x84\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u0136\xe5\xf0\x9c\xc1\xb9\r\xf0x\x03\xce=M\x13vj\x9cF\xf4\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\u013e\xc9c\b\xa2\x0f\x90\u02b1\x83\x99\u0113\xfd=\x06Z\xbfE\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\xe0\x94\xc4\xc0\x1a\xfc>\x0f\x04R!\xda\x12\x84\u05c7\x85tD/\xb9\xac\x8a\x01\x92\xb5\u0249\x02J\x19\xc1\xbdo\x12\x80\x00\xe0\x94\xc5\x00\xb7 sN\xd2)8\u05cc^H\xb2\xba\x93g\xa5u\xba\x8a\a\x12\x9e\x1c\xdf7>\xe0\x00\x00\u07d4\xc5\x0f\xe4\x15\xa6A\xb0\x85lNu\xbf\x96\x05\x15D\x1a\xfa5\x8d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc5\x13L\xfb\xb1\xdfz \xb0\xedpWb.\xee\u0480\x94}\xad\x89\xcd\xff\x97\xfa\xbc\xb4`\x00\x00\xe0\x94\xc5\x17\xd01\\\x87\x88\x13\xc7\x17\u132f\xa1\xea\xb2eN\x01\u068a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xc5\x18y\x9aY%Wb\x13\xe2\x18\x96\xe0S\x9a\xbb\x85\xb0Z\xe3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc5\"\xe2\x0f\xbf\x04\xed\u007fk\x05\xa3{G\x18\xd6\xfc\xe0\x14.\x1a\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc5$\bmF\xc8\x11+\x12\x8b/\xafo|}\x81`\xa88l\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xc5-\x1a\fs\u00a1\xbe\x84\x91Q\x85\xf8\xb3O\xaa\n\xdf\x1d\xe3\x89K\xe4\xea\xb3\xfa\x0f\xa6\x80\x00\xe0\x94\xc55\x94\xc7\u03f2\xa0\x8f(L\xc9\u05e6;\xbd\xfc\v1\x972\x8a\nk#(\xff:b\xc0\x00\x00\u07d4\xc57I(\xcd\xf1\x93pTC\xb1L\xc2\r\xa4#G<\xd9\u03c9\a}\x10P\x9b\xb3\xaf\x80\x00\u07d4\xc58\xa0\xff(*\xaa_Ku\u03f6,p\x03~\xe6}O\xb5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc5;P\xfd;+r\xbclC\v\xaf\x19JQU\x85\u04d8m\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xc5=y\xf7\u02dbp\x95/\xd3\x0f\xceX\xd5K\x9f\vY\xf6G\x8a\x01\x13\xe2\xd6tCE\xf8\x00\x00\u07d4\xc5I\u07c3\xc6\xf6^\xec\x0f\x1d\u0260\x93J\\_:P\xfd\x88\x89\x9d\xc0\\\xce(\u00b8\x00\x00\u07d4\xc5P\x05\xa6\xc3~\x8c\xa7\xe5C\xce%\x99s\xa3\xca\u0396\x1aJ\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc5U\xb91V\xf0\x91\x01#\x80\x00\xe0\x94\u0166)\xa3\x96%R\u02ce\xde\u0609cj\xaf\xbd\f\x18\xcee\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u016e\x86\xb0\xc6\xc7\xe3\x90\x0f\x13h\x10\\VS\u007f\xaf\x8dt>\x89\n1\x06+\xee\xedp\x00\x00\u07d4\u0170\t\xba\xea\xf7\x88\xa2v\xbd5\x81:\xd6[@\v\x84\x9f;\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0175l\xd24&|(\xe8\x9cok\"f\xb0\x86\xa1/\x97\f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xc5\u01a4\x99\x8a3\xfe\xb7dCz\x8b\xe9)\xa7;\xa3J\ad\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\xe0\x94\xc5\xc7=a\xcc\xe7\xc8\xfeL\x8f\xce)\xf3\x90\x92\xcd\x19>\x0f\xff\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xc5\xc7Y\vV!\xec\xf85\x85\x88\u079bh\x90\xf2baC\U000498a1]\tQ\x9b\xe0\x00\x00\u07d4\xc5\xcd\xce\xe0\xe8]\x11}\xab\xbfSj?@i\xbfD?T\xe7\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4\xc5\u050c\xa2\xdb/\x85\xd8\xc5U\xcb\x0e\x9c\xfe\x82i6x?\x9e\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xc5\xde\x12\x03\xd3\xcc,\xea1\xc8.\xe2\xdeY\x16\x88\a\x99\xea\xfd\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xc5\xe4\x88\xcf+Vw\x939q\xf6L\xb8 -\xd0WR\xa2\xc0\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc5\xe8\x12\xf7o\x15\xf2\xe1\xf2\xf9\xbcH#H<\x88\x04cog\x89\x03\xf5\x14\x19:\xbb\x84\x00\x00\u07d4\xc5\u94d34\xf1%.\u04ba&\x81D\x87\xdf\u0498+1(\x89\x03\xcbq\xf5\x1f\xc5X\x00\x00\u07d4\xc5\xebB)^\x9c\xad\xea\xf2\xaf\x12\xde\u078a\x8dS\xc5y\xc4i\x89\xcf\x15&@\xc5\xc80\x00\x00\xe0\x94\xc5\xed\xbb\xd2\xca\x03WeJ\xd0\xeaG\x93\xf8\xc5\xce\xcd0\xe2T\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc5\xf6K\xab\xb7\x031B\xf2\x0eF\u05eab\x01\xed\x86\xf6q\x03\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc5\xf6\x87qrF\u068a \r \xe5\u9f2c`\xb6\u007f8a\x89\x01\x8d\x99?4\xae\xf1\x00\x00\u07d4\xc6\x04[<5\vL\xe9\xca\fkuO\xb4\x1ai\xb9~\x99\x00\x892$\xf4'#\xd4T\x00\x00\u07d4\xc6\v\x04eN\x00;F\x83\x04\x1f\x1c\xbdk\u00cf\xda|\xdb\u0589lk\x93[\x8b\xbd@\x00\x00\u07d4\xc6\x14F\xb7T\xc2N;\x16B\xd9\xe5\x17e\xb4\xd3\xe4k4\xb6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc6\x18R\x13!\xab\xaf[&Q:J\x95(\bo\"\n\xdco\x89\x01v\xb3D\xf2\xa7\x8c\x00\x00\u07d4\xc6#FW\xa8\a8A&\xf8\x96\x8c\xa1p\x8b\xb0{\xaaI<\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc6%\xf8\u024d'\xa0\x9a\x1b\u02bdQ(\xb1\u00a9HV\xaf0\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xc65^\xc4v\x8cp\xa4\x9a\xf6\x95\x13\u0343\xa5\xbc\xa7\xe3\xb9\u034a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc6:\xc4\x17\x99.\x9f\x9b`8n\xd9S\xe6\xd7\xdf\xf2\xb0\x90\xe8\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\xc6<\u05c8!\x18\xb8\xa9\x1e\aML\x8fK\xa9\x18Q0;\x9a\x89\x0e\x189\x8ev\x01\x90\x00\x00\u07d4\xc6R\x87\x1d\x19$\"\u01bc#_\xa0c\xb4J~\x1dC\u3149\bg\x0e\x9e\xc6Y\x8c\x00\x00\xe0\x94\xc6gD\x1e\u007f)y\x9a\xbaadQ\xd5;?H\x9f\x9e\x0fH\x8a\x02\xf2\x9a\xceh\xad\u0740\x00\x00\u07d4\xc6j\xe4\xce\xe8\u007f\xb352\x19\xf7\u007f\x1dd\x86\u0140(\x032\x89\x01\x9a\x16\xb0o\xf8\xcb\x00\x00\u07d4\xc6t\xf2\x8c\x8a\xfd\a?\x8by\x96\x91\xb2\xf0XM\xf9B\xe8D\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u0197\xb7\x04w\u02b4.+\x8b&f\x81\xf4\xaesu\xbb%A\x8a\x01.W2\xba\xba\\\x98\x00\x00\u07d4\u019b\x85U9\xce\x1b\x04qG(\xee\xc2Z7\xf3g\x95\x1d\xe7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u019b\xe4@\x13Mb\x80\x98\x01D\xa9\xf6M\x84t\x8a7\xf3I\x89&\u009eG\u0104L\x00\x00\u07d4\u019df<\x8d`\x90\x83\x91\xc8\xd26\x19\x153\xfd\xf7wV\x13\x89\x1aJ\xba\"\\ t\x00\x00\u0794\u01a2\x86\xe0e\xc8_:\xf7H\x12\xed\x8b\u04e8\xce]%\xe2\x1d\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\u01a3\x0e\xf5\xbb3 \xf4\r\xc5\xe9\x81#\rR\xae:\xc1\x93\"\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\u01ae(}\xdb\xe1\x14\x9b\xa1m\xdc\xcaO\xe0j\xa2\uaa48\xa9\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xc6\xc7\xc1\x917\x98\x97\u075c\x9d\x9a3\x83\x9cJ_b\xc0\x89\r\x89\xd8\xd8T\xb2$0h\x80\x00\xe0\x94\xc6\xcdh\xec56,Z\xd8L\x82\xadN\xdc#!%\x91-\x99\x8a\x05\xe0T\x9c\x962\xe1\xd8\x00\x00\u07d4\xc6\u0615N\x8f?\xc53\xd2\xd20\xff\x02\\\xb4\xdc\xe1O4&\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xc6\xdb\u06de\xfd^\xc1\xb3xn\x06q\xeb\"y\xb2S\xf2\x15\xed\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc6\xdf u\xeb\xd2@\xd4Hi\u00bek\u07c2\xe6=N\xf1\xf5\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc6\xe2\xf5\xaf\x97\x9a\x03\xfdr:\x1bn\xfar\x83\x18\u03dc\x18\x00\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\xc6\xe3$\xbe\xeb[6v^\xcdFB`\xf7\xf2`\x06\xc5\xc6.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc6\xe4\xcc\fr\x83\xfc\x1c\x85\xbcH\x13\xef\xfa\xafr\xb4\x98#\xc0\x89\x0f\x03\x1e\xc9\xc8}\xd3\x00\x00\xe0\x94\xc6\xee5\x93B)i5)\xdcA\u067bq\xa2IfX\xb8\x8e\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\xc6\xfb\x1e\xe3t\x17\u0400\xa0\xd0H\x92;\u06ba\xb0\x95\xd0w\u0189\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc7\x05'\xd4D\u0110\xe9\xfc?\\\xc4Nf\xebO0k8\x0f\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc7\r\x85mb\x1e\xc1E0<\nd\x00\xcd\x17\xbb\xd6\xf5\xea\xf7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xc7\x0f\xa4Uv\xbf\x9c\x86_\x988\x93\x00,AI&\xf6\x10)\x89\x15\xb4\xaa\x8e\x97\x02h\x00\x00\u07d4\xc7\x11E\xe5)\u01e7\x14\xe6y\x03\xeeb\x06\xe4\xc3\x04+g'\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\xc7\x1b*=q5\u04a8_\xb5\xa5q\u073ei^\x13\xfcC\u034965\u026d\xc5\u07a0\x00\x00\u07d4\xc7\x1f\x1du\x87?3\u0732\xddK9\x87\xa1-\a\x91\xa5\xce'\x897\b\xba\xed=h\x90\x00\x00\u07d4\xc7\x1f\x92\xa3\xa5J{\x8c/^\xa4C\x05\xfc\u02c4\xee\xe21H\x89\x02\xb5\x9c\xa11\xd2\x06\x00\x00\u07d4\xc7!\xb2\xa7\xaaD\xc2\x12\x98\xe8P9\xd0\x0e.F\x0eg\v\x9c\x89\a\xa1\xfe\x16\x02w\x00\x00\x00\u07d4\xc7,\xb3\x01%\x8e\x91\xbc\b\x99\x8a\x80]\u0452\xf2\\/\x9a5\x89 \t\xc5\u023fo\xdc\x00\x00\xe0\x94\xc76\x8b\x97\t\xa5\xc1\xb5\x1c\n\xdf\x18ze\xdf\x14\xe1+}\xba\x8a\x02\x02o\xc7\u007f\x03\u5b80\x00\u07d4\xc79%\x9e\u007f\x85\xf2e\x9b\xef_`\x9e\xd8k=Yl \x1e\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xc7>!\x12(\"\x15\xdc\ab\xf3+~\x80}\xcd\x1az\xae>\x8a\x01v\f\xbcb;\xb3P\x00\x00\xe0\x94\xc7If\x80B\xe7\x11#\xa6H\x97^\b\xedc\x82\xf8>\x05\xe2\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\xc7J9\x95\xf8\a\xde\x1d\xb0\x1a.\xb9\xc6.\x97\xd0T\x8fio\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc7Pl\x10\x19\x12\x1f\xf0\x8a,\x8c\x15\x91\xa6^\xb4\xbd\xfbJ?\x89 \x86\xac5\x10R`\x00\x00\u07d4\xc7\\7\xce-\xa0k\xbc@\b\x11Y\u01ba\x0f\x97n9\x93\xb1\x89:y#\x15\x1e\xcfX\x00\x00\u07d4\xc7]\"Y0j\xec}\xf0\"v\x8ci\x89\x9ae!\x85\xdb\u0109\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc7`\x97\x1b\xbc\x18\x1cj|\xf7tA\xf2BG\u045c\xe9\xb4\u03c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xc7a0\xc7<\xb9!\x028\x02\\\x9d\xf9]\v\xe5J\xc6\u007f\xbe\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\xc7e\xe0\x04v\x81\tG\x81j\xf1B\xd4m.\u7f28\xccO\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc7g^VG\xb9\xd8\xda\xf4\xd3\xdf\xf1\xe5R\xf6\xb0qT\xac8\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4\xc7{\x01\xa6\xe9\x11\xfa\x98\x8d\x01\xa3\xab3dk\xee\xf9\xc18\xf3\x89'\x1bo\xa5\xdb\xe6\xcc\x00\x00\u07d4\u01c3z\u0420\xbf\x14\x18i7\xac\xe0lUF\xa3j\xa5OF\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u01d8\x06\x03+\xc7\xd8(\xf1\x9a\u01a6@\u018e=\x82\x0f\xa4B\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u01d9\xe3N\x88\xff\x88\xbe}\xe2\x8e\x15\xe4\xf2\xa6=\v3\xc4\u02c9\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\u01ddPb\u01d6\xddwa\xf1\xf1>U\x8ds\xa5\x9f\x82\xf3\x8b\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\u01e0\x18\xf0\x96\x8aQ\xd1\xf6`<\\I\xdcT[\xcb\x0f\xf2\x93\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u01ef\xf9\x19)yt\x89UZ/\xf1\xd1M\\iZ\x10\x83U\x8965\u026d\xc5\u07a0\x00\x00\u0794\u01f1\xc8>c ?\x95G&>\xf6(.}\xa3;n\xd6Y\x88\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\u01f3\x9b\x06\x04Q\x00\f\xa1\x04\x9b\xa1T\xbc\xfa\x00\xff\x8a\xf2b\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\u01ff\x17\xc4\xc1\x1f\x98\x94\x1fP~w\bO\xff\xbd-\xbd=\xb5\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\u01ff.\xd1\xed1)@\xeej\xde\xd1Qn&\x8eJ`HV\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xc7\xd4O\xe3,\u007f\x8c\xd5\xf1\xa9t'\xb6\xcd:\xfc\x9eE\x02>\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xc7\xd5\xc7\x05@\x81\xe9\x18\xech{Z\xb3n\x97=\x18\x13)5\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xc7\xde^\x8e\xaf\xb5\xf6+\x1a\n\xf2\x19\\\xf7\x93\u01c9L\x92h\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xc7\xe30\xcd\f\x89\n\u025f\xe7q\xfc\xc7\xe7\xb0\t\xb7A=\x8a\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc7\xea\xc3\x1a\xbc\xe6\xd5\xf1\u07a4\"\x02\xb6\xa6t\x15=\xb4z)\x89 \t\xc5\u023fo\xdc\x00\x00\xe0\x94\xc7\xecb\xb8\x04\xb1\xf6\x9b\x1e0p\xb5\xd3b\xc6/\xb3\t\xb0p\x8a\x02\xc4k\xf5A`f\x11\x00\x00\u07d4\xc7\xf7+\xb7X\x01k7G\x14\u0509\x9b\xce\"\xb4\xae\xc7\n1\x89:&\xc9G\x8f^-\x00\x00\u0794\xc8\v6\u047e\xaf\xba_\xccdM`\xacnF\xed)'\xe7\u0708\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\xc8\x11\xc2\xe9\xaa\x1a\xc3F.\xba^\x88\xfc\xb5\x12\x0e\x9fn,\xa2\x89K\xe6\u0607\xbd\x87n\x00\x00\u07d4\xc8\x17\xdf\x1b\x91\xfa\xf3\x0f\xe3%\x15qr|\x97\x11\xb4]\x8f\x06\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xc8\x1f\xb7\xd2\x0f\u0480\x01\x92\xf0\xaa\xc1\x98\xd6\u05a3}?\xcb}\x89\x0e\x11I3\x1c-\xde\x00\x00\u07d4\xc8 \xc7\x11\xf0w\x05'8\a\xaa\xaam\xe4M\x0eKH\xbe.\x89\bg\x0e\x9e\xc6Y\x8c\x00\x00\u07d4\xc8#\x1b\xa5\xa4\x11\xa1>\"+)\xbf\xc1\b?v1X\xf2&\x8967\tlK\xcci\x00\x00\u07d4\xc86\xe2Jo\xcf)\x94;6\b\xe6b)\n!_e)\xea\x89\x0f\xd4Pd\xea\xee\x10\x00\x00\xe0\x94\xc8;\xa6\u0755I\xbe\x1d2\x87\xa5\xa6T\xd1\x06\xc3Lk]\xa2\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\xc8>\x9djX%;\uefb7\x93\xe6\xf2\x8b\x05JXI\x1bt\x89\x0fF\u00b6\xf5\xa9\x14\x00\x00\u07d4\xc8A\x88O\xa4x_\xb7s\xb2\x8e\x97\x15\xfa\xe9\x9aQ40]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc8M\x9b\xea\n{\x9f\x14\x02 \xfd\x8b\x90\x97\u03ff\xd5\xed\xf5d\x89\x06\xab\x9e\u0091\xad}\x80\x00\u07d4\xc8RB\x8d+Xd\x97\xac\xd3\fV\xaa\x13\xfbU\x82\xf8D\x02\x893B\xd6\r\xff\x19`\x00\x00\u07d4\xc8S![\x9b\x9f-,\xd0t\x1eX^\x98{_\xb8\f!.\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\xc8S%\uaca5\x9b>\xd8c\xc8j_)\x06\xa0B)\xff\xa9\x89\x19=\u007f}%=\xe0\x00\x00\u07d4\xc8^\xf2}\x82\x04\x03\x80_\xc9\xed%\x9f\xffd\xac\xb8\xd64j\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc8akN\xc0\x91(\xcd\xff9\xd6\u4e6c\x86\xee\xc4q\xd5\xf2\x89\x01\r:\xa56\xe2\x94\x00\x00\xe0\x94\xc8a\x90\x90K\x8d\a\x9e\xc0\x10\xe4b\xcb\xff\xc9\b4\xff\xaa\\\x8a\x02#\x85\xa8'\xe8\x15P\x00\x00\u07d4\xc8q\r~\x8bZ;\u059aB\xfe\x0f\xa8\xb8|5\u007f\xdd\xcd\u0209\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc8sR\u06e5\x82\xee f\xb9\xc0\x02\xa9b\xe0\x03\x13Ox\xb1\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xc8|w\xe3\xc2J\xde\xcd\xcd\x108\xa3\x8bV\xe1\x8d\xea\u04f7\x02\x8a\x01\xdd\f\x88_\x9a\r\x80\x00\x00\u07d4\xc8}:\xe3\u0607\x04\u066b\x00\t\xdc\xc1\xa0\x06q1\xf8\xba<\x89j\xc5\xc6-\x94\x86\a\x00\x00\xe0\x94\u0201N4R>8\xe1\xf9'\xa7\xdc\xe8FjDz\t6\x03\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u0202U\xed\xdc\xf5!\xc6\xf8\x1d\x97\xf5\xa4!\x81\xc9\a=N\xf1\x89\x0f\u00d0D\xd0\n*\x80\x00\u07d4\u0205\xa1\x8a\xab\xf4T\x1b{{~\xcd0\xf6\xfa\u619d\x95i\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u020c\xa1\xe6\xe5\xf4\xd5X\xd17\x80\xf4\x88\xf1\rJ\xd3\x13\r4\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\u020e\xecT\xd3\x05\xc9(\xcc(H\xc2\xfe\xe251\xac\xb9mI\x89lj\u04c2\xd4\xfba\x00\x00\xe0\x94\u021c\xf5\x04\xb9\xf3\xf85\x18\x1f\xd8BO\\\xcb\xc8\xe1\xbd\xdf}\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u0222\xc4\xe5\x9e\x1c\u007f\xc5H\x05X\x048\xae\xd3\xe4J\xfd\xf0\x0e\x89\x02b\x9ff\xe0\xc50\x00\x00\u07d4\u022aI\u301f\b\x99\xf2\x8a\xb5~gCp\x9dXA\x903\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\u022b\x1a<\xf4l\xb8\xb0d\xdf.\"-9`s\x94 2w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0231\x85\x05%\xd9F\xf2\xae\x84\xf3\x17\xb1Q\x88\xc56\xa5\u0706\x89\x91\x8d\xdc:B\xa3\xd4\x00\x00\u07d4\xc8\xd4\xe1Y\x9d\x03\xb7\x98\t\xe0\x13\n\x8d\u00c4\b\xf0^\x8c\u04c9\x9f\xad\x06$\x12y\x16\x00\x00\u07d4\xc8\xdd'\xf1k\xf2$P\xf5w\x1b\x9f\xe4\xedO\xfc\xb3\t6\xf4\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xc8\xdezVL\u007f@\x12\xa6\xf6\xd1\x0f\u040fG\x89\x0f\xbf\a\u0509\x10CV\x1a\x88)0\x00\x00\u07d4\xc8\xe2\xad\xebT^I\x9d\x98,\f\x11sc\u03b4\x89\u0171\x1f\x895e\x9e\xf9?\x0f\xc4\x00\x00\xe0\x94\xc8\xe5X\xa3\xc5i~o\xb2:%\x94\u0200\xb7\xa1\xb6\x8f\x98`\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xc8\xf2\xb3 \xe6\xdf\xd7\t\x06\u0157\xba\xd2\xf9P\x13\x12\u01c2Y\x89Q\x93K\x8b:W\xd0\x00\x00\u07d4\xc9\x03\x00\xcb\x1d@w\xe6\xa6\xd7\xe1i\xa4`F\x8c\xf4\xa4\x92\u05c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xc9\f7e\x15k\u028eH\x97\xab\x80$\x19\x15<\xbeR%\xa9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xc9\x10\xa9pUl\x97\x16\xeaS\xaff\xdd\xef\x93\x141$\x91=\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\xe0\x94\xc9\x12{\u007ff)\xee\x13\xfc?`\xbc/Dg\xa2\aE\xa7b\x8a\x03|\x9a\xa4\xe7\xceB\x1d\x80\x00\u07d4\xc9\x1b\xb5b\xe4+\xd4a0\xe2\u04eeFR\xb6\xa4\ub1bc\x0f\x89\x1dF\x01b\xf5\x16\xf0\x00\x00\xe0\x94\xc90\x88y\x05m\xfe\x13\x8e\xf8 \x8fy\xa9\x15\u01bc~p\xa8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xc94\xbe\xca\xf7\x1f\"_\x8bJK\xf7\xb1\x97\xf4\xac\x9604\\\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc9?\xbd\xe8\xd4m+\xcc\x0f\xa9\xb3;\u063a\u007f\x80B\x12Ue\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xc9@\x89U:\xe4\xc2,\xa0\x9f\xbc\x98\xf5pu\xcf.\u0155\x04\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xc9A\x10\xe7\x1a\xfeW\x8a\xa2\x18\xe4\xfc(d\x03\xb03\n\u038d\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xc9F\u056c\xc14n\xba\nry\xa0\xac\x1dF\\\x99m\x82~\x8a\x03x=T_\xdf\n\xa4\x00\x00\u07d4\xc9J(\xfb20\xa9\xdd\xfa\x96Nw\x0f,\xe3\xc2S\xa7\xbeO\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xc9JXR\x03\xda{\xba\xfd\x93\xe1X\x84\xe6`\u0531\xea\xd8T\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\xc9O|5\xc0'\xd4}\xf8\xefO\x9d\xf8Z\x92H\xa1}\xd2;\x89\x01\x9f\x8euY\x92L\x00\x00\u07d4\xc9Q\x90\f4\x1a\xbb\xb3\xba\xfb\xf7\xee )7pq\xdb\xc3j\x89\x11\xc2]\x00M\x01\xf8\x00\x00\u07d4\xc9S\xf94\xc0\xeb-\x0f\x14K\u06b0\x04\x83\xfd\x81\x94\x86\\\xe7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc9f&r\x8a\xaaLO\xb3\xd3\x1c&\xdf:\xf3\x10\b\x17\x10\u0449\xb5\x0f\u03ef\xeb\xec\xb0\x00\x00\u07d4\xc9gQel\n\x8e\xf45{sD2!4\xb9\x83PJ\u0289lk\x93[\x8b\xbd@\x00\x00\u07d4\u0240Hh\u007f+\xfc\u027d\x90\xed\x18slW\xed\xd3R\xb6]\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0241\xd3\x12\u0487\xd5X\x87\x1e\u0757:\xbbv\xb9y\xe5\xc3^\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u0242Xmc\xb0\xd7L \x1b\x1a\xf8A\x83r\xe3\fv\x16\xbe\x89\x05k\xc7^-c\x10\x00\x00\u07d4\u0249CO\x82Z\xaf\x9cU/h^\xba|\x11\xdbJ_\xc7:\x89\x1b(\u014d\x96\x96\xb4\x00\x00\u07d4\u0249\xee\xc3\a\u80db\x9dr7\xcf\xda\b\x82)b\xab\u41c9\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\u0252\xbeY\xc6r\x1c\xafN\x02\x8f\x9e\x8f\x05\xc2\\UQ[\u0509\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u0255{\xa9L\x1b)\xe5'~\xc3f\"pI\x04\xc6=\xc0#\x89h>\xfcg\x82d,\x00\x00\xe0\x94\u025a\x9c\xd6\xc9\xc1\xbe54\xee\u0352\xec\xc2/\\8\xe9Q[\x8a\x01\x05Y;:\x16\x9dw\x00\x00\xe0\x94\u026c\x01\xc3\xfb\t)\x03?\f\xcc~\x1a\xcf\uaae7\x94]G\x8a\x02\xa3j\x9e\x9c\xa4\xd2\x03\x80\x00\u07d4\u0276\x98\xe8\x98\xd2\rMO@\x8eNM\x06\x19\"\xaa\x85c\a\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\u0276\xb6\x86\x11\x16\x91\xeej\xa1\x97\xc7#\x1a\x88\xdc`\xbd)]\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc9\u01ec\v\u0753B\xb5\xea\xd46\t#\xf6\x8cr\xa6\xbac:\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xc9\xc8\r\xc1.{\xab\x86\xe9I\xd0\x1eL>\xd3_+\x9b\xba_\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xc9\xd7dF\u056a\xdf\xf8\vh\xb9\x1b\b\u035b\xc8\xf5U\x1a\xc1\x89&\xb4\xbd\x91\x10\xdc\xe8\x00\x00\xe0\x94\xc9\u073b\x05oM\xb7\xd9\xda9\x93b\x02\u017d\x820\xb3\xb4w\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xc9\xe0&\b\x06h(\x84\x8a\xeb(\xc76r\xa1)%\x18\x1fM\x89\x1b\x1bk\u05efd\xc7\x00\x00\u07d4\xca\x042\xcb\x15{Qy\xf0.\xbb\xa5\xc9\u0475O\xecM\x88\u028965\u026d\xc5\u07a0\x00\x00\u07d4\xca\x12,\xf0\U00094216\xb7HC\xf4\x9a\xfe\u043a\x16\x18\xee\u05c9\x1e[\x8f\xa8\xfe*\xc0\x00\x00\xe0\x94\xca\"\u0363`m\xa5\xca\xd0\x13\xb8\aG\x06\xd7\xe9\xe7!\xa5\f\x8a\x01q\x81\xc6\xfa9\x81\x94\x00\x00\u07d4\xca#\xf6-\xff\rd`\x03lb\xe8@\xae\xc5W~\v\xef\u0489\a\xa1\xfe\x16\x02w\x00\x00\x00\u07d4\xca%\xff4\x93L\x19B\xe2*N{\xd5o\x14\x02\x1a\x1a\xf0\x88\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xca7?\xe3\xc9\x06\xb8\xc6U\x9e\xe4\x9c\xcd\a\xf3|\xd4\xfbRf\x89a\t=|,m8\x00\x00\u07d4\xcaA\u032c0\x17 R\xd5\"\xcd//\x95}$\x81S@\x9f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xcaB\x88\x01N\xdd\xc5c/_\xac\xb5\xe3\x85\x17\xa8\xf8\xbc]\x98\x89\x12nr\xa6\x9aP\xd0\x00\x00\u07d4\xcaB\x88c\xa5\xca06\x98\x92\xd6\x12\x18>\xf9\xfb\x1a\x04\xbc\xea\x89Rf<\u02b1\xe1\xc0\x00\x00\u07d4\xcaI\xa5\xf5\x8a\xdb\xef\xae#\xeeY\xee\xa2A\xcf\x04\x82b.\xaa\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\xcaL\xa9\xe4w\x9dS\x0e\u02ec\xd4~j\x80X\xcf\xdee\u064f\x89+^:\xf1k\x18\x80\x00\x00\u07d4\xcae~\xc0o\xe5\xbc\t\xcf#\xe5*\xf7\xf8\f\xc3h\x9en\u07890\xca\x02O\x98{\x90\x00\x00\u07d4\xcaf\xb2(\x0f\xa2\x82\u0176v1\xceU+b\xeeU\xad\x84t\x89j\xc4\"\xf54\x92\x88\x00\x00\xe0\x94\xcal\x81\x8b\xef\xd2Q6\x1e\x02t@h\xbe\x99\u062a`\xb8J\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xcap\xf4\u077f\x06\x9d!C\xbdk\xbc\u007fikRx\x9b2\u7262\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94\xcatuvDjL\x8f0\xb0\x83@\xfe\xe1\x98\xdec\xec\x92\u03ca\x01|\x8e\x12\x06r*0\x00\x00\u07d4\xca{\xa3\xffSl~_\x0e\x158\x00\xbd8=\xb81)\x98\xe0\x89\t1\xac=k\xb2@\x00\x00\xe0\x94\u0282v\xc4w\xb4\xa0{\x80\x10{\x845\x94\x18\x96\a\xb5;\xec\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\u0284\t\b>\x01\xb3\x97\xcf\x12\x92\x8a\x05\xb6\x84U\xceb\x01\u07c9V\xbcu\xe2\xd61\x00\x00\x00\u07d4\u0298\u01d8\x8e\xfa\b\xe9%\uf719ER\x03&\xe9\xf4;\x99\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u029a\x04*j\x80o\xfc\x92\x17\x95\x00\xd2D)\xe8\xabR\x81\x17\x89;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4\u029d\xec\x02\x84\x1a\xdf\\\xc9 WjQ\x87\xed\u04bdCJ\x18\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u029f\xaa\x17T/\xaf\xbb8\x8e\xab!\xbcL\x94\u89f3G\x88\x89lk\x8f\xce\r\x18y\x80\x00\xe0\x94\u02aah\xeel\xdf\r4EJv\x9b\r\xa1H\xa1\xfa\xaa\x18e\x8a\x01\x87.\x1d\xe7\xfeR\xc0\x00\x00\u07d4\u02ad\x9d\xc2\rX\x9c\xe4(\xd8\xfd\xa3\xa9\xd5:`{y\x88\xb5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\u02b0\xd3,\xf3v\u007f\xa6\xb3S|\x842\x8b\xaa\x9fPE\x816\x8a\x01\xe5\xb8\xfa\x8f\xe2\xac\x00\x00\x00\u07d4\u02b9\xa3\x01\xe6\xbdF\xe9@5P(\xec\xcd@\xceMZ\x1a\u00c9\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\u02b9\xa9z\xda\x06\\\x87\x81nh`\xa8\xf1Bo\xe6\xb3\xd7u\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\u02ba\xb6'N\xd1P\x89s~({\xe8x\xb7W\x93Hd\xe2\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\u02bd\xaf5OG \xa4f\xa7d\xa5(\xd6\x0e:H*9<\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xca\xcbg^\t\x96#T\x04\ufbfb.\u02c1R'\x1bU\xe0\x89%\xf2s\x93=\xb5p\x00\x00\u07d4\xca\xd1O\x9e\xbb\xa7f\x80\xeb\x83k\a\x9c\u007f{\xaa\xf4\x81\xedm\x89\f\xef={\xd7\xd04\x00\x00\xe0\x94\xca\xe3\xa2S\xbc\xb2\xcfN\x13\xba\x80\u0098\xab\x04\x02\xda|*\xa0\x8a\x01$\xbc\r\u0752\xe5`\x00\x00\u07d4\xca\xef\x02{\x1a\xb5\x04\xc7?A\xf2\xa1\ty\xb4t\xf9~0\x9f\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xca\xf4H\x1d\x9d\xb7\x8d\xc4\xf2_{J\u023d;\x1c\xa0\x10k1\x8a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94\xca\xfd\xe8U\x86L%\x98\xda<\xaf\xc0Z\u064d\U00089380H\x8a\x03\x00\xa8\xed\x96\xffJ\x94\x00\x00\xe0\x94\xcb\r\xd7\xcfN]\x86a\xf6\x02\x89C\xa4\xb9\xb7\\\x91D6\xa7\x8a\x19i6\x89t\xc0[\x00\x00\x00\u07d4\xcb\x1b\xb6\xf1\xda^\xb1\rH\x99\xf7\xe6\x1d\x06\xc1\xb0\x0f\u07f5-\x898E$\xccp\xb7x\x00\x00\u07d4\xcb=vl\x98?\x19+\xce\xca\xc7\x0fN\xe0=\xd9\xffqMQ\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xcbB\xb4N\xb5\xfd`\xb5\x83~O\x9e\xb4rgR=\x1a\"\x9c\x89.\xe4IU\b\x98\xe4\x00\x00\u07d4\xcbG\xbd0\u03e8\xecTh\xaa\xa6\xa9FB\xce\xd9\xc8\x19\xc8\u0509\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xcbH\xfe\x82e\u066fU\xebp\x06\xbc3VE\xb0\xa3\xa1\x83\xbe\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xcbJ\x91M+\xb0)\xf3._\xef\\#LO\xec--\xd5w\x89a\x94\x04\x9f0\xf7 \x00\x00\xe0\x94\xcbJ\xbf\u0082\xae\xd7n]W\xaf\xfd\xa5B\xc1\xf3\x82\xfc\xac\xf4\x8a\x01\xb9\x0f\x11\xc3\x18?\xaa\x00\x00\u07d4\xcbJ\xd0\xc7#\xdaF\xabV\xd5&\xda\f\x1d%\xc7=\xaf\xf1\n\x89\x1b\xa5\xab\xf9\xe7y8\x00\x00\u07d4\xcbK\xb1\xc6#\xba(\xdcB\xbd\xaa\xa6\xe7N\x1d*\xa1%l*\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xcbPXt\x12\x82#\x04\xeb\u02e0}\xab:\x0f\t\xff\xfe\u4189JD\x91\xbdm\xcd(\x00\x00\u07d4\xcbX\x99\v\u0350\u03ffm\x8f\t\x86\xf6\xfa`\x02v\xb9N-\x8964\xbf9\xab\x98x\x80\x00\u07d4\xcbh\xaeZ\xbe\x02\xdc\xf8\xcb\u016aq\x9c%\x81FQ\xaf\x8b\x85\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xcbty\x10\x9bC\xb2fW\xf4F_M\x18\xc6\xf9t\xbe_B\x89b\xa9\x92\xe5:\n\xf0\x00\x00\xe0\x94\xcb}+\x80\x89\xe91,\u026e\xaa's\xf3S\b\xecl*{\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u02c6\xed\xbc\x8b\xbb\x1f\x911\x02+\xe6IV^\xbd\xb0\x9e2\xa1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u02d3\x19\x9b\x9c\x90\xbcI\x15\xbd\x85\x9e=B\x86m\xc8\xc1\x87I\x89\f\x90\xdf\a\xde\xf7\x8c\x00\x00\u07d4\u02d4\xe7o\xeb\xe2\b\x11g3\xe7n\x80]H\xd1\x12\xec\x9f\u028965\u026d\xc5\u07a0\x00\x00\u07d4\u02dbQ\x03\xe4\u0389\xafOd\x91aP\xbf\xf9\xee\u02df\xaa\\\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u02e2\\zP<\xc8\xe0\xd0Iq\xca\x05\xc7b\xf9\xb7b\xb4\x8b\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u02e2\x88\xcd<\x1e\xb4\u055d\xdb\x06\xa6B\x1c\x14\xc3E\xa4{$\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u02f3\x18\x9eK\xd7\xf4_\x17\x8b\x1c0\xc7n&1MJK\n\x89\x0f\xfe\vg|e\xa9\x80\x00\xe0\x94\u02f7\xbe\x17\x95?,\u0313\u1f19\x80[\xf4U\x11CNL\x8a\n\xae[\x9d\xf5m/ \x00\x00\xe0\x94\xcb\xc0KM\x8b\x82\xca\xf6p\x99o\x16\f6)@\xd6o\xcf\x1a\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xcb\u07974\xb8\xe6\xaaS\x8c)\x1dm\u007f\xac\xed\xb0\xf38\xf8W\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xcb\xe1\xb9H\x86M\x84t\xe7e\x14XX\xfc\xa4U\x0fxK\x92\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xcb\xe5/\xc53\xd7\xdd`\x8c\x92\xa2`\xb3|?E\u07b4\xeb3\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xcb\xe8\x10\xfe\x0f\xec\xc9dGJ\x1d\xb9w(\xbc\x87\xe9s\xfc\xbd\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xcb\xf1j\x0f\xe2tRX\xcdR\xdb+\xf2\x19T\xc9u\xfcj\x15\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94\xcb\xf3\u007f\xf8T\xa2\xf1\xceS\x93D\x94wx\x92\xd3\xeceW\x82\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xcb\xfaj\xf6\u0083\xb0F\xe2w,`c\xb0\xb2\x15S\xc4\x01\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcb\xfav\xdb\x04\xce8\xfb ]7\xb8\xd3w\xcf\x13\x80\xda\x03\x17\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\xcc\x03I\x85\xd3\xf2\x8c-9\xb1\xa3K\xce\xd4\u04f2\xb6\xca#N\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xcc\x04\x8d\u01f9]\xca%\xdf&\xee\xfac\x9d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcc+_D\x8f5(\xd3\xfeA\xcc}\x1f\xa9\xc0\xdcv\xf1\xb7v\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xcc-\x04\xf0\xa4\x01q\x89\xb3@\xcaw\x19\x86A\xdc\xf6Ek\x91\x89\u0556{\xe4\xfc?\x10\x00\x00\xe0\x94\xccA\x9f\u0651+\x85\x13VY\xe7z\x93\xbc=\xf1\x82\xd4Q\x15\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xccE\xfb:U[\xad\x80{8\x8a\x03W\xc8U _|u\xe8\x89.\xe4IU\b\x98\xe4\x00\x00\u07d4\xccHAM*\xc4\xd4*Yb\xf2\x9e\xeeD\x97\t/C\x13R\x89\b\xbaR\xe6\xfcE\xe4\x00\x00\u07d4\xccJ/,\xf8l\xf3\xe43u\xf3`\xa4sF\x91\x19_\x14\x90\x89I\x15\x05;\xd1)\t\x80\x00\u07d4\xccO\x0f\xf2\xae\xb6}T\xce;\xc8\xc6Q\v\x9a\xe8>\x9d2\x8b\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xccO\xaa\xc0\v\xe6b\x8f\x92\xefk\x8c\xb1\xb1\xe7j\xac\x81\xfa\x18\x89\v\"\xa2\xea\xb0\xf0\xfd\x00\x00\xe0\x94\xccO\xebr\u07d8\xff5\xa18\xe0\x17a\xd1 ?\x9b~\xdf\n\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\xcc`oQ\x13\x97\xa3\x8f\u01c7+\u04f0\xbd\x03\xc7\x1b\xbdv\x8b\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xcc`\xf86\xac\xde\xf3T\x8a\x1f\xef\u0321>\u01a97\xdbD\xa0\x89\x04\xb0m\xbb\xb4\x0fJ\x00\x00\u07d4\xccl\x03\xbd`>\t\xdeT\xe9\xc4\u056cmA\xcb\xceqW$\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\u07d4\xccl-\xf0\x0e\x86\xec\xa4\x0f!\xff\xda\x1ag\xa1i\x0fG|e\x89\xabM\xcf9\x9a:`\x00\x00\xe0\x94\xccm{\x12\x06\x1b\xc9m\x10M`me\xff\xa3+\x006\xeb\a\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xccs\xdd5kIy\xb5y\xb4\x01\xd4\xccz1\xa2h\xdd\xceZ\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xccu\x8d\a\x1d%\xa62\n\xf6\x8c]\xc9\xc4\xf6\x95[\xa9E \x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xcc{\x04\x81\xcc2\xe6\xfa\xef#\x86\xa0p\"\xbc\xb6\xd2\u00f4\xfc\x89\xabM\xcf9\x9a:`\x00\x00\xe0\x94\u0314;\xe1\",\xd1@\n#\x99\xdd\x1bE\x94E\xcfmT\xa9\x8a\x02\xa7@\xaee6\xfc\x88\x00\x00\u07d4\u0315\x19\xd1\xf3\x98_k%^\xad\xed\x12\xd5bJ\x97'!\xe1\x8965\u026d\xc5\u07a0\x00\x00\u0794\u031a\xc7\x15\xcdo&\x10\xc5+XgdV\x88B\x97\x01\x8b)\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\u0320{\xb7\x94W\x1dJ\xcf\x04\x1d\xad\x87\xf0\xd1\xef1\x85\xb3\x19\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u032b\xc6\x04\x8aSFD$\xfc\xf7n\xeb\x9en\x18\x01\xfa#\u0509\x02\xab{&\x0f\xf3\xfd\x00\x00\u07d4\u032e\r=\x85*}\xa3\x86\x0f\x066\x15L\nl\xa3\x16(\u0509\x05\xc6\xd1+k\xc1\xa0\x00\x00\u07d4\xcc\xca$\xd8\xc5mn,\a\xdb\bn\xc0~X[\xe2g\xac\x8d\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xcc\xd5!\x13-\x98l\xb9hi\x84&\"\xa7\u0762l>\xd0W\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcc\xf49u\xb7k\xfes_\xec<\xb7\xd4\xdd$\xf8\x05\xba\tb\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xcc\xf6*f?\x13S\xba.\xf8\xe6R\x1d\xc1\xec\xb6s\xec\x8e\xf7\x89\b=lz\xabc`\x00\x00\u07d4\xcc\xf7\x11\r\x1b\u0667K\xfd\x1d}}-\x9dU`~{\x83}\x890\xca\x02O\x98{\x90\x00\x00\u07d4\xcc\xfdrW`\xa6\x88#\xff\x1e\x06/L\xc9~\x13`\xe8\u0657\x89\x15\xacV\xed\xc4\xd1,\x00\x00\u07d4\xcd\x02\x0f\x8e\xdf\xcfRG\x98\xa9\xb7:d\x034\xbb\xf7/\x80\xa5\x89\a?u\u0460\x85\xba\x00\x00\u07d4\xcd\x06\xf8\xc1\xb5\u037d(\xe2\xd9kcF\xc3\xe8Z\x04\x83\xba$\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xcd\a.n\x183\x13y\x95\x19m{\xb1r_\xef\x87a\xf6U\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xcd\n\x16\x1b\xc3g\xae\t'\xa9*\xac\x9c\xf6\xe5\bg\x14\xef\u0289lk\x93[\x8b\xbd@\x00\x00\u07d4\xcd\n\xf3GN\"\xf0i\xec4\a\x87\r\xd7pD=[\x12\xb0\x89\x8e^\xb4\xeew\xb2\xef\x00\x00\u07d4\xcd\v\x02W\u70e3\xd2\xc2\u3e9dny\xb7^\xf9\x80$\u0509\x9f\xad\x06$\x12y\x16\x00\x00\u07d4\xcd\x10,\xd6\xdb=\xf1J\u05af\x0f\x87\xc7$y\x86\x1b\xfc=$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcd\x1ef\xedS\x9d\xd9/\xc4\v\xba\xa1\xfa\x16\u078c\x02\xc1ME\x89\fw\xe4%hc\xd8\x00\x00\u07d4\xcd\x1e\xd2c\xfb\xf6\xf6\xf7\xb4\x8a\xef\x8fs=2\x9dC\x82\xc7\u01c9\x01\x00\xbd3\xfb\x98\xba\x00\x00\u07d4\xcd*6\xd7S\xe9\xe0\xed\x01*XMqh\aX{A\xd5j\x89\x0e+\xa7[\v\x1f\x1c\x00\x00\u07d4\xcd2\xa4\xa8\xa2\u007f\x1c\xc69T\xaacOxW\x05s4\u01e3\x89:\xd1fWlr\xd4\x00\x00\u07d4\xcd5\xff\x01\x0e\xc5\x01\xa7!\xa1\xb2\xf0z\x9c\xa5\x87}\xfc\xf9Z\x89\xd9o\u0390\u03eb\xcc\x00\x00\u07d4\xcdC\x06\xd7\xf6\x94z\xc1tMN\x13\xb8\xef2\xcbe~\x1c\x00\x89\x1b\x1a\xb3\x19\xf5\xecu\x00\x00\u07d4\xcdC%\x8bs\x92\xa90\x83\x9aQ\xb2\xef\x8a\xd24\x12\xf7Z\x9f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcdI\xbf\x18^p\xd0E\a\x99\x9f\x92\xa4\xdeDU1('\u040965\u026d\xc5\u07a0\x00\x00\u07d4\xcdU\x10\xa2B\u07f0\x18=\xe9%\xfb\xa8f\xe3\x12\xfa\xbc\x16W\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\xcdVj\u05f8\x83\xf0\x1f\u04d9\x8a\x9aX\xa9\xde\xe4rM\u0725\x89\x030\xae\x185\xbe0\x00\x00\xe0\x94\xcdY\xf3\xdd\xe7~\t\x94\v\xef\xb6\xeeX\x03\x19e\xca\xe7\xa36\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xcdr]p\xbe\x97\xe6w\xe3\xc8\xe8\\\v&\xef1\xe9\x95PE\x89Hz\x9a0E9D\x00\x00\xe0\x94\xcd~G\x90\x94d\xd8q\xb9\xa6\xdcv\xa8\xe9\x19]\xb3H^z\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xcd~\xce\bkKa\x9b;6\x93R\xee8\xb7\x1d\xdb\x06C\x9a\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xcd\u007f\t\xd7\xedf\xd0\u00cb\u016dN2\xb7\xf2\xb0\x8d\xc1\xb3\r\x89>;\xb3M\xa2\xa4p\x00\x00\u07d4\u0355)I+\\)\xe4u\xac\xb9A@+=;\xa5\x06\x86\xb0\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u0355\xfaB=o\xc1 'J\xac\xde\x19\xf4\xee\xb7f\xf1\x04 \x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\u035bL\xefs9\f\x83\xa8\xfdq\u05f5@\xa7\xf9\u03cb\x8c\x92\x89\x04\xe1\x00;(\xd9(\x00\x00\u07d4\u0361t\x11\t\xc0&[?\xb2\xbf\x8d^\xc9\u00b8\xa34kc\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u0361\xb8\x86\u39d5\u027aw\x91N\n/\xe5go\x0f\\\u03c9\x05\xbf`\xeaB\xc2\x04\x00\x00\u07d4\u0364S\x0fK\x9b\xc5\t\x05\xb7\x9d\x17\u008f\xc4o\x954\x9b\u07c93\x10\xe0I\x11\xf1\xf8\x00\x00\u07d4\u036bF\xa5\x90 \x80do\xbf\x95B\x04 J\xe8\x84\x04\x82+\x89\x1d\x8a\x96\xe5\xc6\x06\xeb\x00\x00\u07d4\u0375\x97)\x900\x18?n-#\x853\xf4d*\xa5\x87T\xb6\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xcd\xd5\u0601\xa76,\x90p\a;\u07fcu\xe7$S\xacQ\x0e\x89-\xa5\x18\xea\xe4\x8e\xe8\x00\x00\u07d4\xcd\xd6\rs\xef\xaa\xd8s\u027b\xfb\x17\x8c\xa1\xb7\x10Z\x81\xa6\x81\x89\x01\xbc\x16\xd6t\xec\x80\x00\x00\u07d4\xcd\xd9\xef\xacMm`\xbdq\xd9U\x85\xdc\xe5\u0557\x05\xc15d\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xcd\xe3m\x81\xd1(\u015d\xa1Ee!\x93\xee\u00bf\xd9e\x86\xef\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xcd\xea8o\x9d\x0f\xd8\x04\xd0(\x18\xf27\xb7\xd9\xfavF\xd3^\x89\xa3I\xd3m\x80\xecW\x80\x00\u07d4\xcd\xec\xf5gT3\u0370\xc2\xe5Zh\xdb]\x8b\xbexA\x9d\u0489\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xcd\xfd\x82\x173\x97%\xd7\xeb\xac\x11\xa66U\xf2e\xef\xf1\xcc=\x8a\x01\x0f\fid\x10\xe3\xa9\x00\x00\u07d4\xce\a\x9fQ\x88wt\xd8\x02\x1c\xb3\xb5u\xf5\x8f\x18\xe9\xac\xf9\x84\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4\xce\x18\x84\u077b\xb8\xe1\x0eM\xbanD\xfe\xee\u00a7\xe5\xf9/\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xce\x1b\f\xb4j\xae\xcf\u05db\x88\f\xad\x0f-\u068a\x8d\xed\u0431\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xce&\xf9\xa50_\x83\x81\tCT\xdb\xfc\x92fN\x84\xf9\x02\xb5\x89\fz\xaa\xb0Y\x1e\xec\x00\x00\u07d4\xce-\xea\xb5\x1c\n\x9a\xe0\x9c\xd2\x12\xc4\xfaL\xc5+S\xcc\r\xec\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xce.\r\xa8\x93F\x99\xbb\x1aU>U\xa0\xb8\\\x16\x945\xbe\xa3\x8a\x01\x0f\fid\x10\xe3\xa9\x00\x00\u07d4\xce:a\xf0F\x1b\x00\x93^\x85\xfa\x1e\xad\x82\xc4^Zd\u0508\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xceK\x06]\xbc\xb20G 2b\xfbH\xc1\x18\x83d\x97tp\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xceS\xc8\xcd\xd7B\x96\xac\xa9\x87\xb2\xbc\x19\u00b8u\xa4\x87I\u0409\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xce^\x04\xf0\x18Ci\xbc\xfa\x06\xac\xa6o\xfa\x91\xbfY\xfa\x0f\xb9\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xce^\xb6:{\xf4\xfb\xc2\xf6\u4ea0\u018a\xb1\xcbL\xf9\x8f\xb4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xceb\x12Z\xde\xc37\n\xc5!\x10\x95:Nv\v\xe9E\x1e;\x89\b=lz\xabc`\x00\x00\xe0\x94\xceq\bmL`%T\xb8-\xcb\xfc\xe8\x8d cMS\xccM\x8a\t(\x96R\x9b\xad\u0708\x00\x00\u07d4\u038akmP3\xb1I\x8b\x1f\xfe\xb4\x1aAU\x04\x05\xfa\x03\xa2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u0397\x86\xd3q/\xa2\x00\xe9\xf6\x857\xee\xaa\x1a\x06\xa6\xf4ZK\x89a\t=|,m8\x00\x00\u07d4\u039d!\u0192\xcd<\x01\xf2\x01\x1fP_\x87\x006\xfa\x8fl\u0489\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\u03a2\x89f#\xf4\x91\x02\x87\xa2\xbd\u017e\x83\xae\xa3\xf2\xe6\xde\b\x8a\x01\xfbZ7Q\xe4\x90\xdc\x00\x00\u07d4\u03a3JM\xd9=\u066e\xfd9\x90\x02\xa9}\x99z\x1bK\x89\u0349QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\u03a4?pu\x81k`\xbb\xfc\u62d9:\xf0\x88\x12p\xf6\u0109lk\x93[\x8b\xbd@\x00\x00\u07d4\u03a8t3AS<\xb2\xf0\xb9\xc6\xef\xb8\xfd\xa8\rw\x16(%\x89\x05k\xc7^-c\x10\x00\x00\u07d4\u03b0\x89\xec\x8ax3~\x8e\xf8\x8d\xe1\x1bI\xe3\u0751\x0ft\x8f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u03b3=x\xe7Tz\x9d\xa2\xe8}Q\xae\xc5\xf3D\x1c\x87\x92:\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u03b3\x898\x1dH\xa8\xaeO\xfcH:\u043b^ L\xfd\xb1\xec\x89('\xe6\xe4\xddb\xba\x80\x00\u07d4\xce\xc6\xfce\x85?\x9c\xce_\x8e\x84Fv6.\x15y\x01_\x02\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xce\xd3\u01fe\x8d\xe7XQ@\x95*\xebP\x1d\xc1\xf8v\ucbf0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xce\xd8\x1e\xc3S?\xf1\xbf\xeb\xf3\xe3\x84>\xe7@\xad\x11u\x8d>\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xce\u0733\xa1\u0584?\xb6\xbe\xf6Ca}\xea\U000cf398\xdd_\x89\x19\xe2\xa4\xc8\x18\xb9\x06\x00\x00\u07d4\xce\xe6\x99\xc0pzx6%+)/\x04|\xe8\xad(\x9b/U\x89\x11\x9a\x1e!\xaaiV\x00\x00\u07d4\xce\xedG\xca[\x89\x9f\xd1b?!\xe9\xbdM\xb6Z\x10\u5c1d\x89\a8w@L\x1e\xee\x00\x00\u07d4\xce\xf7tQ\u07e2\xc6C\xe0\v\x15mlo\xf8N#s\xebf\x89\n1\x06+\xee\xedp\x00\x00\u07d4\xcf\x11i\x04\x1c\x17E\xe4[\x17$5\xa2\xfc\x99\xb4\x9a\xce+\x00\x89\x01\xbb\x88\xba\xab-|\x00\x00\xe0\x94\xcf\x15v\x12vN\x0f\u0596\xc8\xcb_\xba\x85\xdfL\r\xdc<\xb0\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u0794\xcf\x1b\xdby\x9b.\xa6<\xe14f\x8b\xdc\x19\x8bT\x84\x0f\x18\v\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xcf\"\x88\xefN\xbf\x88\xe8m\xb1=\x8a\x0e\v\xf5*\x05e\x82\u00c9\x89Po\xbf\x97@t\x00\x00\u07d4\xcf&Ni%\x13\t\x06\xc4\xd7\xc1\x85\x91\xaaA\xb2\xa6\u007foX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcf&\xb4{\xd04\xbcP\x8elK\xcf\xd6\xc7\xd3\x004\x92Wa\x89a\x94\x04\x9f0\xf7 \x00\x00\xe0\x94\xcf.*\xd65\xe9\x86\x1a\xe9\\\xb9\xba\xfc\xca\x03kR\x81\xf5\u038a\at2!~h6\x00\x00\x00\u07d4\xcf.s@B\xa3U\xd0_\xfb.9\x15\xb1h\x11\xf4Zi^\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcf4\x8f/\xe4{~A<\az{\xaf:u\xfb\xf8B\x86\x92\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xcf?\x91(\xb0r\x03\xa3\xe1\r}WU\xc0\u012b\xc6\xe2\xca\u008a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xcf?\xbf\xa1\xfd2\u05e6\xe0\xe6\xf8\xefN\xabW\xbe4\x02\\L\x899\xa1\xc0\xf7YMH\x00\x00\u07d4\xcfAftn\x1d;\xc1\xf8\xd0qK\x01\xf1~\x8ab\xdf\x14d\x896w\x03n\xdf\n\xf6\x00\x00\u07d4\xcfO\x118\xf1\xbdk\xf5\xb6\u0505\xcc\xe4\xc1\x01\u007f\u02c5\xf0}\x89/\u043cw\xc3+\xff\x00\x00\u07d4\xcfZo\x9d\xf7Uy\xc6D\xf7\x94q\x12\x15\xb3\rw\xa0\xce@\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcf^\x0e\xac\u0473\x9d\x06U\xf2\xf7u5\xeff\b\xeb\x95\v\xa0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xcfhM\xfb\x83\x04r\x93U\xb5\x83\x15\xe8\x01\x9b\x1a\xa2\xad\x1b\xac\x89\x17r$\xaa\x84Lr\x00\x00\u07d4\xcfi@\x81\xc7m\x18\xc6L\xa7\x13\x82\xbe\\\xd6;<\xb4v\xf8\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xcfnR\xe6\xb7t\x80\xb1\x86~\xfe\xc6Dm\x9f\xc3\xcc5w\xe8\x89\f\t\x01\xf6\xbd\x98y\x00\x00\u07d4\u03c8: 2\x96g\xea\"j\x1e\x9a\x92*\x12\xf2\x1f\xaa\x03\x81V\x91\x8cO\u02dc\x89\x04E\x91\xd6\u007f\xec\xc8\x00\x00\u07d4\xcf\xf7\xf8\x9aMB\x19\xa3\x82\x95%\x131V\x82\x10\xff\xc1\xc14\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xcf\xf8\xd0k\x00\xe3\xf5\f\x19\x10\x99\xadV\xbaj\xe2eq\u0348\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xcf\xfcI\xc1x~\ubcb5l\xab\xe9$\x04\xb66\x14}EX\x8a\x013\xe00\x8f@\xa3\u0680\x00\u07d4\xd0\bQ;'`J\x89\xba\x17c\xb6\xf8L\u6233F\x94[\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0\x0f\x06r\x86\xc0\xfb\u0402\xf9\xf4\xa6\x10\x83\xecv\u07b3\xce\xe6\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0\x15\xf6\xfc\xb8M\xf7\xbbA\x0e\x8c\x8f\x04\x89J\x88\x1d\xca\xc27\x898E$\xccp\xb7x\x00\x00\u07d4\xd0\x1a\xf9\x13O\xafRW\x17N\x8by\x18oB\xee5Nd-\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0!\b\u04ae<\xab\x10\xcb\xcf\x16W\xaf\">\x02|\x82\x10\xf6\x89lm\x84\xbc\xcd\xd9\xce\x00\x00\u07d4\xd0*\xfe\u03ce.\u00b6*\u022d Aa\xfd\x1f\xaew\x1d\x0e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd01\x919\xfb\xab.\x8e*\xcc\xc1\xd9$\u0531\x1d\xf6ilZ\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd07\xd2\x15\xd1\x1d\x1d\xf3\xd5O\xbd2\x1c\u0495\xc5F^';\x89K\xe4\xe7&{j\xe0\x00\x00\u07d4\xd0:-\xa4\x1e\x86\x8e\xd3\xfe\xf5t[\x96\xf5\xec\xa4b\xffo\u0689\xa2\xa1]\tQ\x9b\xe0\x00\x00\xe0\x94\xd0?\xc1eWj\xae\xd5%\xe5P,\x8e\x14\x0f\x8b.\x86\x969\x8a\x01sV\u0633%\x01\xc8\x00\x00\u07d4\xd0C\xa0\x11\xecBp\xee~\u0239hsu\x15\xe5\x03\xf80(\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd0K\x86\x1b=\x9a\xccV:\x90\x16\x89\x94\x1a\xb1\xe1\x86\x11a\xa2\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd0ZD|\x91\x1d\xbb'[\xfb.Z7\xe5\xa7\x03\xa5o\x99\x97\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd0_\xfb+t\xf8g O\xe51e;\x02H\xe2\x1c\x13TN\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0bX\x81q\u03d9\xbb\xebX\xf1&\xb8p\xf9\xa3r\x8da\xec\x89\xf3\xf2\v\x8d\xfai\xd0\x00\x00\u07d4\xd0c\x8e\xa5q\x89\xa6\xa6\x99\x02J\u05ccq\xd99\xc1\xc2\xff\x8c\x89\x8e\xaeVg\x10\xfc \x00\x00\xe0\x94\xd0d\x8aX\x1b5\b\xe15\xa2\x93]\x12\xc9epE\xd8q\u028a\x01\xb2\u07dd!\x9fW\x98\x00\x00\u07d4\xd0q\x19)f\xebi\xc3R\x0f\xca:\xa4\xdd\x04)~\xa0KN\x89\x05\xf6\x8e\x811\xec\xf8\x00\x00\u07d4\xd0q\x85 \xea\xe0\xa4\xd6-p\xde\x1b\xe0\xcaC\x1c^\xea$\x82\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd0w]\xba*\xf4\xc3\n:x6Y9\xcdq\xc2\xf9\u0795\u0489i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xd0{\xe0\xf9\t\x97\xca\xf9\x03\u022c\x1dS\xcd\xe9\x04\xfb\x19\aA\x8968\x908\xb6\x99\xb4\x00\x00\u07d4\xd0~Q\x18d\xb1\u03d9i\xe3V\x06\x02\x82\x9e2\xfcNq\xf5\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\u0400\x94\x98\xc5H\x04z\x1e**\xa6\xa2\x9c\xd6\x1a\x0e\xe2h\xbd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0402'_tZ,\xac\x02v\xfb\xdb\x02\u0532\xa3\xab\x17\x11\xfe\x89\x01\xa0Ui\r\x9d\xb8\x00\x00\u07d4\u040f\xc0\x9a\x000\xfd\t(\xcd2\x11\x98X\x01\x82\xa7j\xae\x9f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0413\xe8)\x81\x9f\xd2\xe2[\x978\x00\xbb=XA\xdd\x15-\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u0414J\xa1\x85\xa13pa\xae \u071d\xd9l\x83\xb2\xbaF\x02\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\u0416V[|t\a\xd0e6X\x03U\xfd\xd6\xd29\x14J\xa1\x89\r\x8drkqw\xa8\x00\x00\u07d4\u041c\xb2\xe6\b-i:\x13\xe8\xd2\xf6\x8d\xd1\u0744a\xf5X@\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u0426\xc6\xf9\xe9\u0133\x83\xd7\x16\xb3\x1d\xe7\x8dVAM\xe8\xfa\x91\x89\x10CV\x1a\x88)0\x00\x00\u07d4\u0427 \x9b\x80\xcf`\xdbb\xf5}\n]}R\x1ai`fU\x89\b\xacr0H\x9e\x80\x00\x00\xe0\x94\u0428\xab\xd8\n\x19\x9bT\xb0\x8be\xf0\x1d \x9c'\xfe\xf0\x11[\x8a\x01a\xc6&\xdca\xa2\xef\x80\x00\xe0\x94\u042b\xccp\xc0B\x0e\x0e\x17/\x97\xd4;\x87\xd5\xe8\f3n\xa9\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u042es]\x91^\x94hf\xe1\xfe\xa7~^\xa4f\xb5\xca\xdd\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0431\x1do+\u0394^\fjP \u00f5'S\xf8\x03\xf9\u0449\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xd0\xc1\x01\xfd\x1f\x01\xc6?k\x1d\x19\xbc\x92\r\x9f\x93#\x14\xb16\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xd0\xc5Z\xbf\x97o\xdc=\xb2\xaf\u9f99\u0519HMWl\x02\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd0\u0422\xadE\xf5\x9a\x9d\xcc\u0195\xd8_%\xcaF\xed1\xa5\xa3\x89-\x89W}}@ \x00\x00\u07d4\xd0\xd6,G\xea`\xfb\x90\xa3c\x92\t\xbb\xfd\xd4\xd93\x99\x1c\u0189\n\x84Jt$\xd9\xc8\x00\x00\u07d4\xd0\xdbEax o\\D0\xfe\x00Pc\x90<=zI\xa7\x89&I\x1eE\xa7S\xc0\x80\x00\u07d4\xd0\xe1\x94\xf3K\x1d\xb6\t(\x85\t\xcc\xd2\xe7;a1\xa2S\x8b\x8965f3\xeb\xd8\xea\x00\x00\u07d4\xd0\xe3^\x04vF\xe7Y\xf4Qp\x93\xd6@\x86BQ\u007f\bM\x89\u054f\xa4h\x18\xec\u02c0\x00\u07d4\xd0\xeeM\x02\xcf$8,0\x90\xd3\xe9\x95`\xde6xs\\\u07c9\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\xd0\xf0OR\x10\x9a\xeb\xec\x9a{\x1e\x932v\x1e\x9f\xe2\xb9{\xb5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd0\xf9Yx\x11\xb0\xb9\x92\xbb}7W\xaa%\xb4\xc2V\x1d2\xe2\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd1\x03\x02\xfa\xa1\x92\x9a2i\x04\xd3v\xbf\v\x8d\xc9:\xd0LL\x89a\t=|,m8\x00\x00\xe0\x94\xd1\x10\r\xd0\x0f\xe2\xdd\xf1\x81c\xad\x96M\vi\xf1\xf2\xe9e\x8a\x8a\x01C\x12\tU\xb2Pk\x00\x00\u07d4\xd1\x16\xf3\xdc\xd5\xdbtK\xd0\b\x88v\x87\xaa\x0e\xc9\xfdr\x92\xaa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd1\x19A|Fs,\xf3M\x1a\x1a\xfby\xc3\xe7\xe2\u034e\xec\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd1-w\xae\x01\xa9-5\x11{\xacpZ\xac\u0642\xd0.t\xc1\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xd15yK\x14\x9a\x18\xe1G\xd1nb\x1ai1\xf0\xa4\n\x96\x9a\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xd1C%8\xe3[vd\x95j\u4563*\xbd\xf0A\xa7\xa2\x1c\x8a\x04+\xf0kx\xed;P\x00\x00\u07d4\xd1C\x82g#\x17\x04\xfcr\x80\xd5c\xad\xf4v8D\xa8\a\"\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd1S\x8e\x9a\x87\u5729\xec\x8eX&\xa5\xb7\x93\xf9\x9f\x96\xc4\u00c965\u026d\xc5\u07a0\x00\x00\xe0\x94\xd1d\x85\x03\xb1\xcc\u0178\xbe\x03\xfa\x1e\xc4\xf3\xee&~j\xdf{\x8a\x01;\xef\xbfQ\xee\xc0\x90\x00\x00\xe0\x94\xd1h,!Y\x01\x8d\xc3\xd0\u007f\b$\n\x8c`m\xafe\xf8\xe1\x8a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xd1q\xc3\xf2%\x8a\xef5\xe5\x99\xc7\xda\x1a\xa0s\x00#M\xa9\xa6\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd1w\x8c\x13\xfb\xd9h\xbc\b<\xb7\xd1\x02O\xfe\x1fI\xd0,\xaa\x89\xd9\xec\xb4\xfd \x8eP\x00\x00\u07d4\xd1\u007f\xbe\"\xd9\x04b\xed7(\x06p\xa2\xea\v0\x86\xa0\xd6\u0589\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\u0441\x1cU\x97i\x80\xf0\x83\x90\x1d\x8a\r\xb2i\"-\xfb\\\xfe\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\u044e\xb9\xe1\u0485\u06be\x93\xe5\u053a\xe7k\xee\xfeC\xb5!\xe8\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\u0453\xe5\x83\xd6\a\x05c\xe7\xb8b\xb9aJG\u9509\xf3\xe5\x8965f3\xeb\xd8\xea\x00\x00\u07d4\u0457\x8f.4@\u007f\xab\x1d\xc2\x18=\x95\xcf\xdab`\xb3Y\x82\x89*\xb7\xb2`\xff?\xd0\x00\x00\u07d4\u045c\xaf9\xbb7\u007f\xdf,\xf1\x9b\xd4\xfbRY\x1c&1\xa6<\x8965\u026d\xc5\u07a0\x00\x00\u0794\u0463\x96\xdc\u06b2\xc7IA0\xb3\xfd0x 4\r\xfd\x8c\x1f\x88\xf9\"P\xe2\xdf\xd0\x00\x00\xe0\x94\u0467\x1b-\bX\xe82p\b]\x95\xa3\xb1T\x96P\x03^#\x8a\x03'\xbb\t\xd0j\xa8P\x00\x00\u07d4\u046c\xb5\xad\xc1\x189s%\x8dk\x85$\xff\xa2\x8f\xfe\xb2=\xe3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u0473\u007f\x03\xcb\x10t$\xe9\xc4\xddW\\\xcdOL\xeeW\xe6\u0349lk\x93[\x8b\xbd@\x00\x00\u07d4\u0475\xa4T\xac4\x05\xbbAy \x8cl\x84\xde\x00k\u02db\xe9\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd1\xc4YT\xa6+\x91\x1a\xd7\x01\xff.\x90\x13\x1e\x8c\xeb\x89\xc9\\\x89K\x91\xa2\xdeE~\x88\x00\x00\u07d4\xd1\xc9np\xf0Z\xe0\xe6\xcd`!\xb2\b7P\xa7q|\xdeV\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd1\u0571\u007f\xfe-{\xbby\xcc}y0\xbc\xb2\xe5\x18\xfb\x1b\xbf\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xd1\xda\f\x8f\xb7\xc2\x10\xe0\xf2\xeca\x8f\x85\xbd\xae}>sK\x1c\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xd1\xddy\xfb\x15\x81`\xe5\xb4\xe8\xe2?1.j\x90\u007f\xbcMN\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd1\xdeZ\xad:_\xd8\x03\U00071bb6\x10<\xb8\xe1O\xe7#\xb7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd1\xe1\xf2\xb9\xc1l0\x98t\xde\xe7\xfa\xc3&u\xaf\xf1)\u00d8\x89\x03\xf2M\x8eJ\x00p\x00\x00\xe0\x94\xd1\xe5\xe24\xa9\xf4Bf\xa4\xa6$\x1a\x84\u05e1\xa5Z\u0567\xfe\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xd1\xeaMr\xa6{[>\x0f1UY\xf5+\xd0aMq0i\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd1\xee\x90YW\xfe|\xc7\x0e\xc8\xf2\x86\x8bC\xfeG\xb1?\xeb\xff\x89\x02b\x9ff\xe0\xc50\x00\x00\u07d4\xd1\xf1iM\"g\x1bZ\xadj\x94\x99\\6\x9f\xbea3go\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd1\xf4\xdc\x1d\u06ca\xbb\x88H\xa8\xb1N%\xf3\xb5Z\x85\x91\xc2f\x89\r\x8drkqw\xa8\x00\x00\u07d4\xd1\xfe\u042e\xe6\xf5\xdf\xd7\xe2Wi%L<\xfa\xd1Z\xde\u032a\x89'\x92\xc8\xfcKS(\x00\x00\u07d4\xd2\x05\x1c\xb3\xcbg\x04\xf0T\x8c\u0210\xab\n\x19\xdb4\x15\xb4*\x89\x12\x1b.^ddx\x00\x00\u07d4\xd2\x06\xaa\u07736\xd4^yr\xe9<\xb0uG\x1d\x15\x89{]\x89 \x86\xac5\x10R`\x00\x00\u07d4\xd2\tH+\xb5I\xab\xc4w{\xeam\u007fe\x00b\xc9\xc5z\x1c\x89\x11e\x1a\xc3\xe7\xa7X\x00\x00\u07d4\xd2\r\xcb\vxh+\x94\xbc0\x00(\x14H\xd5W\xa2\v\xfc\x83\x890\x84\x9e\xbe\x166\x9c\x00\x00\u07d4\xd2\x10{57&\u00e2\xb4ef\xea\xa7\xd9\xf8\v]!\xdb\xe3\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd2\x11\xb2\x1f\x1b\x12\xb5\ta\x81Y\r\xe0~\xf8\x1a\x89S~\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd2\x18\xef\xb4\u06d8\x1c\xddjy\u007fK\u050c|&)<\xeb@\x89\xa1Fk1\xc6C\x1c\x00\x00\xe0\x94\xd2\x1asA\xeb\x84\xfd\x15\x10T\xe5\u31fb%\xd3nI\x9c\t\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\xe0\x94\xd2$\xf8\x80\xf9G\x9a\x89\xd3/\t\xe5+\u9432\x88\x13\\\xef\x8a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4\xd2/\f\xa4\xcdG\x9ef\x17u\x05;\xccI\xe3\x90\xf6p\u074a\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd21\x92\x975\x13!\x02G\x1b\xa5\x90\a\xb6dL\xc0\xc1\xde>\x8967\tlK\xcci\x00\x00\u07d4\xd25\xd1\\\xb5\xec\xee\xbba)\x9e\x0e\x82\u007f\xa8'H\x91\x1d\x89\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd2:$\xd7\xf9F\x83C\xc1C\xa4\x1ds\xb8\x8f|\xbec\xbe^\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd2=z\xff\xac\xdc>\x9f=\xaez\xfc\xb4\x00oX\xf8\xa4F\x00\x89\xc3(\t>a\xee@\x00\x00\u07d4\xd2C\x18L\x80\x1e]y\xd2\x06?5x\u06ee\x81\u7ce9\u02c9k\u0722h\x1e\x1a\xba\x00\x00\u07d4\xd2KfD\xf49\xc8\x05\x1d\xfcd\u04c1\xb8\xc8lu\xc1u8\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd2K\xf1--\xdfE}\xec\xb1xt\xef\xde R\xb6\\\xbbI\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\xe0\x94\xd2Q\xf9\x03\xae\x18rrY\xee\xe8A\xa1\x89\xa1\xf5i\xa5\xfdv\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xd2R\x96\v\v\xf6\xb2\x84\x8f\u07ad\x80\x13m\xb5\xf5\a\xf8\xbe\x02\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd2X\x1aU\xce#\xab\x10\u062d\x8cD7\x8fY\a\x9b\xd6\xf6X\x8a\x01\xdd\f\x88_\x9a\r\x80\x00\x00\u07d4\xd2Z\xec\xd7\xeb\x8b\xd64[\x06;]\xbd'\x1cw\xd3QD\x94\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xd2|#O\xf7\xac\xca\xce=\x99g\b\xf8\xf9\xb0Ip\xf9}6\x89Hz\x9a0E9D\x00\x00\u07d4\u0482\x98RM\xf5\xecK$\xb0\xff\xb9\u07c5\x17\n\x14Z\x9e\xb5\x89\x0f\x98\xa3\xb9\xb37\xe2\x00\x00\xe0\x94\u0483\xb8\xed\xb1\n%R\x8aD\x04\xde\x1ce\xe7A\r\xbc\xaag\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\u0484\xa5\x03\x82\xf8:am9\xb8\xa9\xc0\xf3\x96\xe0\ubfe9]\x8966\xc2^f\xec\xe7\x00\x00\u07d4\u0488\xe7\xcb{\xa9\xf6 \xab\x0ftR\xe5\bc=\x1cZ\xa2v\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\u049d\xc0\x8e\xfb\xb3\xd7.&?x\xabv\x10\xd0\"m\xe7k\x00\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\u04a00\xac\x89R2_\x9e\x1d\xb3x\xa7\x14\x85\xa2N\x1b\a\xb2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u04a4y@CG\xc5T:\xab)*\xe1\xbbJo\x15\x83W\xfa\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\u04a5\xa0$#\nW\xcc\xc6fv\v\x89\xb0\xe2l\xaf\u0449\u01ca\n\x96YZ\\n\x8a?\x80\x00\u07d4\u04a8\x03'\xcb\xe5\\L{\xd5\x1f\xf9\xdd\xe4\xcad\x8f\x9e\xb3\xf8\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\u04a8Oug\\b\xd8\f\x88ulB\x8e\xee+\xcb\x18T!\x89A\rXj \xa4\xc0\x00\x00\u07d4\u04ab\xd8J\x18\x10\x93\xe5\xe2)\x13oB\xd85\xe8#]\xe1\t\x89\x05k\xe0<\xa3\xe4}\x80\x00\u07d4\u04ac\r:X`^\x1d\x0f\x0e\xb3\xde%\xb2\xca\xd1)\xed`X\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u04bfg\xa7\xf3\xc6\xceV\xb7\xbeAg]\xbb\xad\xfe~\xa9:3\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd2\xdb\xeb\xe8\x9b\x03W\xae\xa9\x8b\xbe\x8eIc8\u07bb(\xe8\x05\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd2\xe2\x1e\xd5hh\xfa\xb2\x8e\tG\x92z\xda\xf2\x9f#\xeb\xadl\x89l\x18O\x13U\xd0\xe8\x00\x00\u07d4\xd2\xe8\x17s\x8a\xbf\x1f\xb4\x86X?\x80\xc3P1\x8b\xed\x86\f\x80\x89\r\x02\xce\xcf_]\x81\x00\x00\u07d4\xd2\xed\xd1\xdd\xd6\xd8m\xc0\x05\xba\xebT\x1d\"\xb6@\xd5\xc7\xca\xe5\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd2\xf1\x99\x8e\x1c\xb1X\f\xecOl\x04}\xcd=\xce\xc5L\xf7<\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd2\xf2A%]\xd7\xc3\xf7<\a\x040q\xec\b\xdd\xd9\xc5\xcd\xe5\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd2\xffg \x16\xf6;/\x859\x8fJo\xed\xbb`\xa5\r<\u0389\x12\x91$o[sJ\x00\x00\u07d4\xd3\rLC\xad\xcfU\xb2\xcbS\u0583#&A4I\x8d\x89\u038965\u026d\xc5\u07a0\x00\x00\u07d4\xd3\x0e\xe9\xa1+Mh\xab\xac\xe6\xba\u029a\u05ff\\\xd1\xfa\xf9\x1c\x89QO\xcb$\xff\x9cP\x00\x00\u07d4\xd3\x11\x8e\xa3\xc85\x05\xa9\u0613\xbbg\xe2\xde\x14-Sz>\xe7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd3\x11\xbc\u05eaN\x9bO8?\xf3\xd0\u05b6\xe0~!\xe3p]\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd3\x15\xde\xea\x1d\x8c\x12q\xf9\xd11\x12c\xabG\xc0\a\xaf\xb6\xf5\x89\x03\xc8\x1dNeK@\x00\x00\u07d4\xd3+,y\xc3dx\xc5C\x19\x01\xf6\xd7\x00\xb0M\xbe\x9b\x88\x10\x89\x15w\x9a\x9d\xe6\xee\xb0\x00\x00\u07d4\xd3+EVF\x14Ql\x91\xb0\u007f\xa9\xf7-\xcfx|\xceN\x1c\x89\x0f\xc6o\xae7F\xac\x00\x00\u07d4\xd30r\x811\xfe\x8e:\x15Hz4W<\x93E~*\xfe\x95\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd31\xc8#\x82Z\x9eRc\xd0R\u0611]M\xcd\xe0z\\7\x89\x1e\x93\x12\x83\xcc\xc8P\x00\x00\u07d4\xd33btE\xf2\u05c7\x90\x1e\xf3;\xb2\xa8\xa3g^'\xff\xec\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd3<\xf8+\xf1LY&@\xa0\x86\b\x91L#py\u057e4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd3Mp\x8ds\x98\x02E3\xa5\xa2\xb20\x9b\x19\xd3\xc5Qq\xbb\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd3N\x03\xd3j+\xd4\u045a_\xa1b\x18\xd1\xd6\x1e?\xfa\v\x15\x89\x11X\xe4`\x91=\x00\x00\x00\u07d4\xd3Pu\xcaa\xfeY\xd1#\x96\x9c6\xa8-\x1a\xb2\xd9\x18\xaa8\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xd3g\x00\x9a\xb6X&;b\xc23:\x1c\x9eA@I\x8e\x13\x89\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd3g\x9aG\xdf-\x99\xa4\x9b\x01\u024d\x1c>\f\x98|\xe1\xe1X\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\xe0\x94\u04cf\xa2\xc4\xcc\x14z\xd0j\u0562\xf7Uy(\x1f\"\xa7\xcc\x1f\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\u04da]\xa4`9+\x94\v\u01ee8\xf1e\u007f\x8a\x01f\xc5H\b\x89\xdbw\x00\x00\xe0\x94\xd3\xd6\xe9\xfb\x82T/\u049e\xd9\xea6\t\x89\x1e\x15\x13\x96\xb6\xf7\x8a\voX\x8a\xa7\xbc\xf5\xc0\x00\x00\xe0\x94\xd3\xda\u0476\u040dE\x81\u032ee\xa8s-\xb6\xaci\xf0\u019e\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xd3\xdf;S\xcb;GU\xdeT\xe1\x80E\x1c\xc4L\x9e\x8a\u0a89#\u0114\t\xb9w\x82\x80\x00\u07d4\xd3\xf8s\xbd\x99V\x13W\x89\xab\x00\xeb\xc1\x95\xb9\"\xe9K%\x9d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd4\x02\xb4\xf6\xa0\x99\xeb\xe7\x16\xcb\x14\xdfOy\xc0\xcd\x01\xc6\a\x1b\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd4\r\x00U\xfd\x9a8H\x8a\xff\x92?\xd0=5\xecF\xd7\x11\xb3\x8a\x01\x0f\b\xed\xa8\xe5U\t\x80\x00\u07d4\xd4\x0e\xd6j\xb3\xce\xff$\xca\x05\xec\xd4q\ufd12\xc1__\xfa\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd4\x18\x87\v\xc2\xe4\xfa{\x8aa!\xae\br\xd5RG\xb6%\x01\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xd4\x1d\u007f\xb4\x9f\xe7\x01\xba\xac%qpBl\u0273\x8c\xa3\xa9\xb2\x89\t\x8a}\x9b\x83\x14\xc0\x00\x00\u07d4\xd4 U\x92\x84@U\xb3\u01e1\xf8\f\xef\xe3\xb8\xebP\x9b\xcd\xe7\x89\t\xb3\xbf\xd3B\xa9\xfc\x80\x00\u07d4\xd4+ \xbd\x03\x11`\x8bf\xf8\xa6\xd1[*\x95\xe6\xde'\u017f\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd44O}\\\xade\xd1~\\-\x0es#\x94=ob\xfe\x92\x89\x0e~\xeb\xa3A\vt\x00\x00\u07d4\xd4>\xe48\xd8=\xe9\xa3ub\xbbN(l\xb1\xbd\x19\xf4\x96M\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd4C4\xb4\xe2:\x16\x9a\f\x16\xbd!\xe8f\xbb\xa5-\x97\x05\x87\x89\x8c\xf2?\x90\x9c\x0f\xa0\x00\x00\xe0\x94\xd4M\x81\xe1\x8fF\xe2\u03f5\xc1\xfc\xf5\x04\x1b\xc8V\x97g\xd1\x00\x8a\a\xb4B\xe6\x84\xf6Z\xa4\x00\x00\u07d4\xd4OJ\xc5\xfa\xd7k\xdc\x157\xa3\xb3\xafdr1\x9bA\r\x9d\x89V\xbcu\xe2\xd61\x00\x00\x00\u07d4\xd4O^\xdf+\xcf$3\xf2\x11\xda\xdd\f\xc4P\xdb\x1b\x00\x8e\x14\x89\x0e~\xeb\xa3A\vt\x00\x00\xe0\x94\xd4Oj\u00d2;_\xd71\xa4\xc4YD\xecO~\xc5*j\xe4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xd4[3A\xe8\xf1\\\x802\x93 \u00d7~;\x90\xe7\x82j~\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xd4]]\xaa\x13\x8d\xd1\xd3t\xc7\x1b\x90\x19\x91h\x11\xf4\xb2\nN\x89\x1f9\x9b\x148\xa1\x00\x00\x00\u07d4\xd4`\xa4\xb9\b\xdd+\x05gY\xb4\x88\x85\vf\xa88\xfcw\xa8\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xd4g\xcf\x06L\bq\x98\x9b\x90\u0632\xeb\x14\xcc\xc6;6\b#\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd4k\xaea\xb0'\xe5\xbbB.\x83\xa3\xf9\xc9?<\x8f\xc7}'\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd4o\x82#E)\x82\xa1\xee\xa0\x19\xa8\x81n\xfc-o\xc0\ah\x89\amA\xc6$\x94\x84\x00\x00\u07d4\xd4uG\u007f\xa5c\x90\xd30\x17Q\x8dg\x11\x02\u007f\x05\U0008dfc9k\x11\x133\xd4\xfdL\x00\x00\u07d4\xd4|$.\xdf\xfe\xa0\x91\xbcT\xd5}\xf5\xd1\xfd\xb91\x01Gl\x89\x9d\xf7\u07e8\xf7`H\x00\x00\u07d4\xd4}\x86\x85\xfa\xee\x14|R\x0f\u0646p\x91u\xbf/\x88k\xef\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd4\u007fP\u07c9\xa1\xcf\xf9e\x13\xbe\xf1\xb2\xae:)q\xac\xcf,\x89-\x89W}}@ \x00\x00\u07d4\u0502\xe7\xf6\x8eA\xf28\xfeQx)\xde\x15G\u007f\xe0\xf6\xdd\x1d\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u0507\x9f\xd1+\x1f:'\xf7\xe1\tv\x1b#\xca4\xfa#\x06K\x1c\xaf\x00Qn(pJ\x82\xa4\xf8\x89Hz\x9a0E9D\x00\x00\u07d4\xd5\x00\xe4\xd1\u0242K\xa9\xf5\xb65\u03e3\xa8\xc2\u00cb\xbdL\xed\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd5\b\u04dcp\x91oj\xbcL\xc7\xf9\x99\xf0\x11\xf0w\x10X\x02\x89\x05rM$\xaf\xe7\u007f\x00\x00\u07d4\xd5\x0f\u007f\xa0>8\x98v\u04d0\x8b`\xa57\xa6pc\x04\xfbV\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xd5\x13\xa4P\x80\xff/\xeb\xe6,\u0545J\xbe)\xeeDg\xf9\x96\x89\bN\x13\xbcO\xc5\xd8\x00\x00\u07d4\xd5'o\f\xd5\xff\xd5\xff\xb6?\x98\xb5p=U\x94\xed\xe0\x83\x8b\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xd5)KfbB0;m\xf0\xb1\u020d7B\x9b\xc8\xc9e\xaa\x89\x10M\r\x00\u04b7\xf6\x00\x00\u07d4\xd5*\xec\xc6I98\xa2\x8c\xa1\xc3g\xb7\x01\xc2\x15\x98\xb6\xa0.\x89;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4\xd5\x99x\xee \xa3\x8c?I\x8dc\xd5\u007f1\xa3\x9fj\x06\x8a\x022\xb3o\xfcg*\xb0\x00\x00\u07d4\u05568\xd3\xc5\xfa\xa7q\x1b\xf0\x85t_\x9d[\xdc#\u0518\u0609lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u055d\x92\xd2\xc8p\x19\x80\xcc\a<7]r\n\xf0dt<\f\x8a\x04\x05\xfd\xf7\u5bc5\xe0\x00\x00\u07d4\u0567\xbe\xc32\xad\xde\x18\xb3\x10KW\x92Tj\xa5\x9b\x87\x9bR\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0571\x17\xec\x11n\xb8FA\x89a\xeb~\xdbb\x9c\xd0\xddi\u007f\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\u0572\x84\x04\x010\xab\xf7\xc1\xd1cq#q\xcc~(\xadf\u0689j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u0579\xd2w\u062a\xd2\x06\x97\xa5\x1fv\xe2\tx\x99k\xff\xe0U\x89\a\xc3\xfe<\aj\xb5\x00\x00\u07d4\u057d^\x84U\xc10\x16\x93W\xc4q\xe3\u6077\x99jrv\x89-\x9e(\x8f\x8a\xbb6\x00\x00\u07d4\xd5\u02e5\xb2k\xea]s\xfa\xbb\x1a\xba\xfa\xcd\xef\x85\xde\xf3h\u0309\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd5\xceU\u0476/YC\xc0?\x89\b\xe3\x1f\xe1h\x9d\x8a\x00\x00\u07d4\xd6\x06Q\xe3\x93x4#\xe5\xcc\x1b\xc5\xf8\x89\xe4N\xf7\xea$>\x89\x15\x9ev7\x11)\xc8\x00\x00\u07d4\xd6\t\xbfO\x14n\xeak\r\xc8\xe0m\xdc\xf4D\x8a\x1f\xcc\xc9\xfa\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd6\t\xec\v\xe7\r\n\xd2ong\xc9\xd4v+R\xeeQ\x12,\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd6\nRX\a(R\r\xf7Tk\xc1\xe2\x83)\x17\x88\u06ee\f\x8964\x89\xef?\xf0\xd7\x00\x00\u07d4\xd6\v$s!\xa3*Z\xff\xb9k\x1e'\x99'\xccXM\xe9C\x89z\xd0 \xd6\xdd\xd7v\x00\x00\u07d4\xd6\x11\x02v\xcf\xe3\x1eB\x82ZW\u007fkC]\xbc\xc1\f\xf7d\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xd6\x12Y{\xc3\x17C\u01c63\xf63\xf29\xb1\xe9Bk\xd9%\x8a\x10\x17\xf7\u07d6\xbe\x17\x80\x00\x00\u07d4\xd6#J\xafE\xc6\xf2.f\xa2%\xff\xb9:\xddb\x9bN\xf8\x0f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd6.\u06d6\xfc\u259a\xaflT^\x96|\xf1\xc0\xbc\x80R\x05\x89\x04\xa5eSjZ\u0680\x00\u07d4\xd60\v2\x15\xb1\x1d\xe7b\xec\xdeKp\xb7\x92}\x01)\x15\x82\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd69]\xb5\xa4\xbbf\xe6\x0fL\xfb\xcd\xf0\x05{\xb4\xd9xb\xe2\x891T\xc9r\x9d\x05x\x00\x00\xe0\x94\xd6J-P\xf8\x85\x857\x18\x8a$\xe0\xf5\r\xf1h\x1a\xb0~\u05ca\b7Z*\xbc\xca$@\x00\x00\u07d4\xd6X\n\xb5\xedL}\xfaPo\xa6\xfed\xad\\\xe1)pw2\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd6Y\x8b\x13\x86\xe9<\\\u02d6\x02\xffK\xbb\xec\xdb\xd3p\x1d\u0109\f%\xf4\xec\xb0A\xf0\x00\x00\u07d4\xd6dM@\xe9\v\xc9\u007f\xe7\xdf\xe7\u02bd2i\xfdW\x9b\xa4\xb3\x89\b\x9e\x91y\x94\xf7\x1c\x00\x00\xe0\x94\xd6g\f\x03m\xf7T\xbeC\xda\u074fP\xfe\xea(\x9d\x06\x1f\u058a\x01D\xa2\x904H\xce\xf7\x80\x00\u07d4\xd6hR:\x90\xf0)=e\xc58\xd2\xddlWg7\x10\x19n\x89\x02$,0\xb8S\xee\x00\x00\u07d4\xd6j\xb7\x92\x94\aL\x8bb}\x84-\xabA\xe1}\xd7\f]\xe5\x8965\u026d\xc5\u07a0\x00\x00\u0794\xd6j\xcc\r\x11\xb6\x89\u03a6\xd9\xea_\xf4\x01L\"J]\xc7\u0108\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xd6m\xdf\x11Y\xcf\"\xfd\x8czK\xc8\u0540wV\xd43\xc4>\x89wC\"\x17\xe6\x83`\x00\x00\u07d4\u0587\xce\xc0\x05\x90\x87\xfd\xc7\x13\xd4\xd2\xd6^w\xda\xef\xed\xc1_\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\u0588\xe7\x85\u024f\x00\xf8K:\xa1S3U\u01e2X\xe8yH\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u05a2.Y\x8d\xab\u04ce\xa6\xe9X\xbdy\u050d\u0756\x04\xf4\u07c965\u026d\xc5\u07a0\x00\x00\u07d4\u05a7\xacM\xe7\xb5\x10\xf0\xe8\xdeQ\x9d\x97?\xa4\xc0\x1b\xa84\x00\x89e\xea=\xb7UF`\x00\x00\u07d4\u05ac\xc2 \xba.Q\xdf\xcf!\xd4C6\x1e\xeav\\\xbd5\u0609\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u05ac\xff\u043f\u065c8.{\xd5o\xf0\xe6\x14J\x9eR\xb0\x8e\x89\b\xacr0H\x9e\x80\x00\x00\u07d4\xd6\xc0\u043c\x93\xa6.%qtp\x0e\x10\xf0$\u0232?\x1f\x87\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd6\xcf\\\x1b\u03dd\xa6b\xbc\xea\"U\x90P\x99\xf9\xd6\xe8M\u030a\x01\u011eB\x01W\xd9\xc2\x00\x00\u07d4\xd6\xd05r\xa4RE\xdb\xd46\x8cO\x82\xc9W\x14\xbd!g\xe2\x89?\x00\xc3\xd6f\x86\xfc\x00\x00\u07d4\xd6\xd6wiX\xee#\x14:\x81\xad\xad\xeb\b8 \t\xe9\x96\u0089\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xd6\xd9\xe3\x0f\bB\x01*qv\xa9\x17\xd9\xd2\x04\x8c\xa0s\x87Y\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd6\xe0\x9e\x98\xfe\x13\x003!\x04\xc1\xca4\xfb\xfa\xc5T6N\u0649lk\x93[\x8b\xbd@\x00\x00\u07d4\xd6\xe8\xe9z\u90db\x9e\xe5\a\xee\xdb(\xed\xfbtw\x03\x149\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd6\uea18\u052e+q\x80'\xa1\x9c\xe9\xa5\xebs\x00\xab\xe3\u0289\x01}J\xce\xeec\u06c0\x00\xe0\x94\xd6\xf1\xe5[\x16\x94\b\x9e\xbc\xb4\xfe}x\x82\xaaf\u0217av\x8a\x04<#\xbd\xbe\x92\x9d\xb3\x00\x00\u07d4\xd6\xf4\xa7\xd0N\x8f\xaf \xe8\xc6\ub15c\xf7\xf7\x8d\xd2=z\x15\x89\a$\xde\xd1\xc7H\x14\x00\x00\u07d4\xd6\xfc\x04F\u01a8\xd4\n\xe3U\x1d\xb7\xe7\x01\xd1\xfa\x87nJI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\x03\u01a4\xf1\x1d`\x19Ey\u054c'f\xa7\xef\x16\xc3\n)\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\x05%\x19uj\xf4%\x90\xf1S\x91\xb7#\xa0?\xa5d\xa9Q\x89\xfa61H\r\x01\xfd\x80\x00\u07d4\xd7\na+\xd6\u0769\xea\xb0\xdd\xdc\xffJ\xafA\"\u04cf\xea\xe4\x89\x1dF\x01b\xf5\x16\xf0\x00\x00\u07d4\xd7\n\xd2\xc4\xe9\uefe67\xefV\xbdHj\u04a1\xe5\xbc\xe0\x93\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\x14\f\x8eZC\a\xfa\xb0\xcc'\xba\u0752\x95\x01\x8b\xf8yp\x89\x05\xf1\x01kPv\xd0\x00\x00\u07d4\xd7\x16J\xa2a\xc0\x9a\u0672\xb5\x06\x8dE>\xd8\xebj\xa10\x83\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xd7\x1eC\xa4Qw\xadQ\xcb\xe0\xf7!\x84\xa5\xcbP9\x17(Z\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\x1f\xb10\xf0\x15\fVRi\xe0\x0e\xfbC\x90+R\xa4U\xa6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\"W8\xdc\xf3W\x848\xf8\xe7\u0233\x83~B\xe0J&/\x89\x18+\x8c\ubec3\xaa\x00\x00\u07d4\xd7'MP\x80M\x9cw\u0693\xfaH\x01V\xef\xe5{\xa5\x01\u0789i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xd71\xbbk_<79^\t\u03ac\xcd\x14\xa9\x18\xa6\x06\a\x89\x89\u0556{\xe4\xfc?\x10\x00\x00\xe0\x94\xd7>\xd2\u0645\xb5\xf2\x1bU\xb2td;\xc6\xda\x03\x1d\x8e\u074d\x8a\nm\xd9\f\xaeQ\x14H\x00\x00\u07d4\xd7D\xac~S\x10\xbeijc\xb0\x03\xc4\v\xd097\x05a\u0189Z\x87\xe7\xd7\xf5\xf6X\x00\x00\xe0\x94\xd7Jn\x8dj\xab4\u0385\x97h\x14\xc12{\xd6\xea\a\x84\u048a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xd7ZP*[gr\x87G\x0fe\u016aQ\xb8|\x10\x15\x05r\x8910\xb4dc\x85t\x00\x00\u07d4\xd7m\xba\xeb\xc3\rN\xf6{\x03\xe6\xe6\xec\xc6\xd8N\x00MP-\x89mv\xb9\x18\x8e\x13\x85\x00\x00\u07d4\xd7q\xd9\xe0\u028a\b\xa1\x13wW1CN\xb3'\x05\x99\xc4\r\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xd7x\x8e\xf2\x86X\xaa\x06\xccS\xe1\xf3\xf0\xdeX\xe5\xc3q\xbex\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\xd7x\x92\xe2';#]v\x89\xe40\xe7\xae\ud73c\xe8\xa1\xf3\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u05c1\xf7\xfc\t\x18F\x11V\x85p\xb4\x98n,r\x87+~\u0409\x01\x15\x95a\x06]]\x00\x00\u07d4\u05c5\xa8\xf1\x8c8\xb9\xbcO\xfb\x9b\x8f\xa8\xc7r{\xd6B\xee\x1c\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u05ce\xcd%\xad\xc8k\xc2\x05\x1d\x96\xf6Sd\x86kB\xa4&\xb7\x89\xd20X\xbf/&\x12\x00\x00\xe0\x94\u05cf\x84\xe3\x89D\xa0\xe0%_\xae\xceH\xbaIP\u053d9\u048a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\u05d4\x83\xf6\xa8DO%I\xd6\x11\xaf\xe0,C-\x15\xe1\x10Q\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u05d85\xe4\x04\xfb\x86\xbf\x84_\xba\t\rk\xa2^\f\x88f\xa6\x89\x82\x1a\xb0\xd4AI\x80\x00\x00\u07d4\u05da\xff\x13\xba-\xa7]F$\f\xac\n$g\xc6V\x94\x98#\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\u05dd\xb5\xabCb\x1az=\xa7\x95\xe5\x89)\xf3\xdd%\xafg\u0649lj\xccg\u05f1\xd4\x00\x00\u07d4\u05e1C\x1e\xe4S\xd1\xe4\x9a\x05P\xd1%hy\xb4\xf5\xd1\x02\x01\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\u05ed\t\xc6\xd3&WhSU\xb5\xc6\uc39fW\xb4\ube42\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u05f7@\xdf\xf8\xc4Wf\x8f\xdft\xf6\xa2f\xbf\xc1\u0737#\xf9\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xd7\u0080>\u05f0\xe0\x83sQA\x1a\x8ef7\xd1h\xbc[\x05\x8a\x06A\xda\xf5\xc9\x1b\xd95\x80\x00\u07d4\xd7\xc6&]\xea\x11\x87l\x90;q\x8eL\u062b$\xfe&[\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\xca\u007f\xdc\xfe\xbeE\x88\xef\xf5B\x1d\x15\"\xb6\x13(\xdf{\xf3\x89\xd8\xe6\x00\x1el0+\x00\x00\u07d4\xd7\u037dA\xff\xf2\r\xf7'\xc7\vbU\xc1\xbav\x06\x05Th\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\xd1W\xe4\xc0\xa9d7\xa6\u0485t\x1d\xd2>\xc46\x1f\xa3k\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\xd2\xc6\xfc\xa8\xad\x1fu9R\x10\xb5}\xe5\xdf\xd6s\x939\t\x89\x12nr\xa6\x9aP\xd0\x00\x00\xe0\x94\xd7\xd3\xc7Y Y\x048\xb8,>\x95\x15\xbe.\xb6\xedz\x8b\x1a\x8a\f\xb4\x9bD\xba`-\x80\x00\x00\u07d4\xd7\xd7\xf2\u02a4b\xa4\x1b;0\xa3J\xeb;\xa6\x10\x10\xe2bo\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd7\xe7J\xfd\xba\xd5^\x96\u03bcZ7O,\x8bv\x86\x80\xf2\xb0\x89\x05]\xe6\xa7y\xbb\xac\x00\x00\xe0\x94\xd7\xeb\x901b'\x1c\x1a\xfa5\xfei\xe3s\"\u0224\u049b\x11\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xd7\xeb\u0779\xf99\x87w\x9bh\x01U7T8\xdbe\xaf\xcbj\x89\x05t\x1a\xfe\xff\x94L\x00\x00\u07d4\xd7\xef4\x0ef\xb0\u05ef\xcc\xe2\n\x19\xcb{\xfc\x81\xda3\xd9N\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xd7\xf3p\u053e\xd9\xd5|oI\u0259\xder\x9e\xe5i\xd3\xf4\xe4\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd7\xfa_\xfb`H\xf9o\xb1\xab\xa0\x9e\xf8{\x1c\x11\xddp\x05\xe4\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd8\x06\x9f\x84\xb5!I?G\x15\x03\u007f2&\xb2_3\xb6\x05\x86\x89g\x8a\x93 b\xe4\x18\x00\x00\u0794\xd8\x15\xe1\xd9\xf4\xe2\xb5\xe5~4\x82k|\xfd\x88\x81\xb8Th\x90\x88\xf0\x15\xf2W6B\x00\x00\u07d4\xd8\x1b\xd5K\xa2\xc4Jok\xeb\x15a\u058b\x80\xb5DNm\u0189?\x17\r~\xe4\"\xf8\x9c\x80-1({\x96q\xe8\x1c\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\xd8K\x92/xA\xfcWt\xf0\x0e\x14`J\xe0\xdfB\xc8U\x1e\x89\xd9o\u0390\u03eb\xcc\x00\x00\u07d4\xd8U\xb0<\xcb\x02\x9awG\xb1\xf0s\x03\xe0\xa6dy59\u0209lk\x93[\x8b\xbd@\x00\x00\u07d4\xd8_\u07af*a\xf9]\xb9\x02\xf9\xb5\xa5<\x9b\x8f\x92f\u00ec\x89l\xf6Z~\x90G(\x00\x00\u07d4\xd8q^\xf9\x17o\x85\v.0\xeb\x8e8'\a\xf7w\xa6\xfb\xe9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd8t\xb9\u07eeEj\x92\x9b\xa3\xb1\xa2~W,\x9b,\xec\u07f3\x89\t79SM(h\x00\x00\u07d4\u0613\n9\xc7sW\xc3\n\u04e0`\xf0\v\x06\x04c1\xfdb\x89,s\xc97t,P\x00\x00\u07d4\u061b\xc2q\xb2{\xa3\xabib\xc9JU\x90\x06\xae8\xd5\xf5j\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0637}\xb9\xb8\x1b\xbe\x90B{b\xf7\x02\xb2\x01\xff\u009f\xf6\x18\x892m\x1eC\x96\xd4\\\x00\x00\u07d4\xd8\xcdd\xe0(N\xecS\xaaF9\xaf\xc4u\b\x10\xb9\u007f\xabV\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd8\xd6C\x84$\x9bwg\x94\x06;V\x98x\xd5\xe3\xb50\xa4\xb2\x89\t\xa0C\u0432\xf9V\x80\x00\u07d4\xd8\xd6T \xc1\x8c#'\xccZ\xf9t%\xf8W\xe4\xa9\xfdQ\xb3\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xd8\xe5\xc9g^\xf4\xde\xed&k\x86\x95o\xc4Y\x0e\xa7\u0522}\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xd8\xe8GB\x92\xe7\xa0Q`L\xa1d\xc0pw\x83\xbb(\x85\xe8\x8a\x02\xd4\xca\x05\xe2\xb4<\xa8\x00\x00\u07d4\xd8\xebxP>\xc3\x1aT\xa9\x016x\x1a\xe1\t\x00Lt2W\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd8\xee\xf4\xcfK\xeb\x01\xee \xd1\x11t\x8ba\xcbM?d\x1a\x01\x89\x94\x89#z\u06daP\x00\x00\u07d4\xd8\xf4\xba\xe6\xf8M\x91\rm}Z\xc9\x14\xb1\xe6\x83r\xf9A5\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xd8\xf6 6\xf0;v5\xb8X\xf1\x10?\x8a\x1d\x90\x19\xa8\x92\xb6\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xd8\xf6e\xfd\x8c\xd5\u00bc\xc6\xdd\xc0\xa8\xaeR\x1eM\u01aa``\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xd8\xf9$\fU\xcf\xf05RB\x80\xc0\x9e\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xd8\xfe\b\x8f\xff\u0394\x8fQ7\xee#\xb0\x1d\x95\x9e\x84\xacB#\x89\f[T\xa9O\xc0\x17\x00\x00\u07d4\xd9\x0f0\t\xdbC~N\x11\u01c0\xbe\u0209os\x8de\xef\r\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd9\x10;\xb6\xb6zU\xa7\xfe\xce-\x1a\xf6-E|!x\x94m\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd9\x13\xf0w\x19Iu\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xd9D\u0226\x9f\xf2\xca\x12Ii\f\x12)\xc7\x19/6%\x10b\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xd9JW\x88*Rs\x9b\xbe*\x06G\xc8\f$\xf5\x8a+O\x1c\x89H\xb5N*\xdb\xe1+\x00\x00\xe0\x94\xd9SB\x95<\x8a!\xe8\xb65\xee\xfa\u01c1\x9b\xea0\xf1pG\x8a\x13\xf0l\u007f\xfe\xf0]@\x00\x00\u07d4\xd9\\\x90\xff\xbeT\x84\x86G\x80\xb8gIJ\x83\u0212V\xd6\xe4\x89X\xe7\x92n\xe8X\xa0\x00\x00\u07d4\xd9g\x11T\x0e.\x99\x83C\xd4\xf5\x90\xb6\xfc\x8f\xac;\xb8\xb3\x1d\x89_Z@h\xb7\x1c\xb0\x00\x00\u07d4\xd9j\xc2Pt\t\u01e3\x83\xab.\xee\x18\"\xa5\xd78\xb3kV\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xd9m\xb3;{Z\x95\f>\xfa-\xc3\x1b\x10\xba\x10\xa52\uf1c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xd9wYe\xb7\x16Gfu\xa8\xd5\x13\xeb\x14\xbb\xf7\xb0|\xd1J\x8a\x01\x13.m-#\xc5\xe4\x00\x00\u07d4\xd9{\xc8J\xbdG\xc0[\xbfE{.\xf6Y\xd6\x1c\xa5\xe5\u43c9\x06\x9d\x17\x11\x9d\u0168\x00\x00\u07d4\xd9\u007fE&\u07a9\xb1c\xf8\xe8\xe3:k\u03d2\xfb\x90}\xe6\xec\x89\x0feJ\xafM\xb2\xf0\x00\x00\u07d4\xd9\u007f\xe6\xf5?*X\xf6\xd7mu*\xdft\xa8\xa2\xc1\x8e\x90t\x89\x10\xcd\xf9\xb6\x9aCW\x00\x00\u07d4\u0659\x99\xa2I\r\x94\x94\xa50\xca\xe4\xda\xf3\x85T\xf4\xddc>\x89\x06\x81U\xa46v\xe0\x00\x00\u07d4\u065d\xf7B\x1b\x93\x82\xe4,\x89\xb0\x06\xc7\xf0\x87p*\aW\xc0\x89\x1a\x05V\x90\xd9\u06c0\x00\x00\xe0\x94\u0677\x83\xd3\x1d2\xad\xc5\x0f\xa3\xea\u02a1]\x92\xb5h\xea\xebG\x8a\a3\xaf\x907L\x1b(\x00\x00\u07d4\xd9\xd3p\xfe\xc65v\xab\x15\xb3\x18\xbf\x9eX6M\u00a3U*\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xd9\xd4/\xd1>\xbdK\xf6\x9c\xac^\x9c~\x82H:\xb4m\xd7\xe9\x8a\x01!\xeah\xc1\x14\xe5\x10\x00\x00\u07d4\xd9\xe2~\xb0}\xfcq\xa7\x06\x06\f\u007f\a\x928\u0293\xe8\x859\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xd9\xe3\x85~\xfd\x1e *D\x17p\xa7w\xa4\x9d\xccE\xe2\xe0\u04c9\f\x1d\xaf\x81\u0623\xce\x00\x00\u07d4\xd9\xec.\xfe\x99\xff\\\xf0\r\x03\xa81{\x92\xa2J\xefD\x1f~\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xd9\xec\x8f\xe6\x9bw\x16\xc0\x86Z\xf8\x88\xa1\x1b+\x12\xf7 \xed3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xd9\xf1\xb2d\b\xf0\xecg\xad\x1d\ro\xe2.\x85\x15\xe1t\x06$\x89\x01M\x11 \u05f1`\x00\x00\u07d4\xd9\xf5G\xf2\xc1\xde\x0e\u064aS\xd1a\xdfWc]\xd2\x1a\x00\xbd\x89\x05V\xf6L\x1f\xe7\xfa\x00\x00\u07d4\xd9\xff\x11]\x01&l\x9fs\xb0c\xc1\xc28\xef5e\xe6;6\x89$\xdc\xe5M4\xa1\xa0\x00\x00\u07d4\xda\x06\x04N)#&\xffil\x0091h\xceF\xff\xac9\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xda*\x14\xf9r@\x15\u05d0\x14\xed\x8eY\th\x1dYaH\xf1\x89\x02\xa1\x0f\x0f\x8a\x91\xab\x80\x00\u07d4\xda*\u054ew\xde\xdd\xed\xe2\x18vF\xc4e\x94Z\x8d\xc3\xf6A\x89#\xc7W\a+\x8d\xd0\x00\x00\u07d4\xda0\x17\xc1P\xdd\r\xce\u007f\u03c8\x1b\nH\xd0\xd1\xc7V\xc4\u01c9\x05k\xf9\x1b\x1ae\xeb\x00\x00\u07d4\xda4\xb2\xea\xe3\v\xaf\xe8\xda\xec\xcd\xe8\x19\xa7\x94\u0349\xe0\x95I\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xdaJ_U\u007f;\xab9\n\x92\xf4\x9b\x9b\x90\n\xf3\fF\xae\x80\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xdaPU7S\u007f\xfb3\xc4\x15\xfe\xc6Ni\xba\xe0\x90\xc5\xf6\x0f\x89\b\xacr0H\x9e\x80\x00\x00\u07d4\xdai\x8dd\xc6\\\u007f+,rS\x05\x9c\xd3\u0441\u0619\xb6\xb7\x89\x10\x04\xe2\xe4_\xb7\xee\x00\x00\u07d4\xdaw2\xf0/.'.\xaf(\u07d7.\xcc\r\xde\xed\x9c\xf4\x98\x89\v \xbf\xbfig\x89\x00\x00\u07d4\xdaz\xd0%\xeb\xde%\xd2\"C\u02c3\x0e\xa1\xd3\xf6JVc#\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\u0685]SG\u007fP^\xc4\xc8\xd5\u8ed1\x80\u04c6\x81\x11\x9c\x8a\x01/\x93\x9c\x99\xed\xab\x80\x00\x00\u07d4\u0687^N/<\xab\xe4\xf3~\x0e\xae\xd7\xd1\xf6\xdc\xc6\xff\xefC\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u068b\xbe\xe1\x82\xe4U\xd2\t\x8a\xcb3\x8amE\xb4\xb1~\u0636\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0698.\x96C\xff\xec\xe7#\aZ@\xfewnZ\xce\x04\xb2\x9b\x89\b\xb8\xb6\u0259\x9b\xf2\x00\x00\u07d4\u069fUF\tF\u05ff\xb5p\xdd\xecu|\xa5w;XB\x9a\x89\x1b\x84]v\x9e\xb4H\x00\x00\u07d4\u06a1\xbdz\x91H\xfb\x86\\\xd6\x12\xdd5\xf1b\x86\x1d\x0f;\u0709\xa68\xabr\xd9,\x13\x80\x00\xe0\x94\u06a6<\xbd\xa4]\u0507\xa3\xf1\xcdJtj\x01\xbb^\x06\v\x90\x8a\x01\x04\x16\u0670*\x89$\x00\x00\u07d4\u06a7v\xa6uDi\u05f9&z\x89\xb8g%\xe7@\xda\x0f\xa0\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\u06ac\x91\xc1\xe8Y\xd5\xe5~\xd3\bKP \x0f\x97f\xe2\xc5+\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\u06ac\xda\xf4\"&\xd1\\\xb1\u03d8\xfa\x15\x04\x8c\u007fL\xee\xfei\x89\x10CV\x1a\x88)0\x00\x00\xe0\x94\u06b6\xbc\u06c3\xcf$\xa0\xae\x1c\xb2\x1b;[\x83\xc2\xf3\x82I'\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\u06bb\b\x89\xfc\x04)&\xb0^\xf5{% \x91\n\xbcKAI\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u06bc\"PB\xa6Y,\xfa\x13\xeb\xe5N\xfaA\x04\bx\xa5\xa2\x89\x0e\x11\xfa\xd5\xd8\\\xa3\x00\x00\u07d4\xda\xc0\xc1w\xf1\x1c\\>>x\xf2\xef\xd6c\xd12!H\x85t\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xda\xd16\xb8\x81x\xb4\x83zlx\x0f\xeb\xa2&\xb9\x85i\xa9L\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xda\xdb\xfa\xfd\x8bb\xb9*$\xef\xd7RV\u0743\xab\xdb\u05fb\u06c9\x01\x11du\x9f\xfb2\x00\x00\u07d4\xda\xdc\x00\xaby'`\xaa4\x15i\xfa\x9f\xf5\x98&\x84\x85JJ2\x8an\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xda\xe7 \x1e\xab\x8c\x063\x02\x93\ri9)\xd0\u007f\x95\xe7\x19b\x89\x91\xae\xc0(\xb4\x19\x81\x00\x00\u07d4\xda\xed\u052d\x10{'\x1e\x89Hl\xbf\x80\xeb\xd6!\u0757Ex\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb\x04\xfa\xd9\u011f\x9e\x88\v\xeb\x8f\xcf\x1d:8\x90\u4cc4o\x89CZ\xe6\xcc\fX\xe5\x00\x00\u07d4\xdb\f\u01cft\u0642{\u070ads'n\xb8O\u0717b\x12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb\x12\x93\xa5\x06\xe9\f\xad*Y\xe1\xb8V\x1f^f\x96\x1ag\x88\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb\x19\xa3\x98\"06\x8f\x01w!\x9c\xb1\f\xb2Y\u0372%|\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb#\xa6\xfe\xf1\xaf{X\x1ew,\xf9\x18\x82\u07b2Qo\xc0\xa7\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdb$O\x97\xd9\xc4K\x15\x8a@\xed\x96\x06\xd9\xf7\xbd8\x9131\x89\x05\x87\x88\u02d4\xb1\xd8\x00\x00\u07d4\xdb(\x8f\x80\xff\xe22\u00baG\u0314\xc7c\xcfo\u0278+\r\x89\x04\x9b\x9c\xa9\xa6\x944\x00\x00\u07d4\xdb*\f\x9a\xb6M\xf5\x8d\u07f1\u06ec\xf8\xba\r\x89\xc8[1\xb4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdb4t^\u0785v\xb4\x99\xdb\x01\xbe\xb7\xc1\xec\u0685\xcfJ\xbe\x89\x04V9\x18$O@\x00\x00\u07d4\xdb?%\x8a\xb2\xa3\xc2\xcf3\x9cD\x99\xf7ZK\xd1\xd3G.\x9e\x89QP\xae\x84\xa8\xcd\xf0\x00\x00\u07d4\xdbK\xc8;\x0ek\xaa\xdb\x11V\xc5\xcf\x06\xe0\xf7!\x80\x8cR\u01c9/\xb4t\t\x8fg\xc0\x00\x00\u07d4\xdbc\x12-\xe7\x03}\xa4\x97\x151\xfa\u9bc5\x86x\x86\u0192\x89\x0f\x04%\xb0d\x1f4\x00\x00\u07d4\xdbl*s\xda\xc7BJ\xb0\xd01\xb6ga\x12%f\xc0\x10C\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xdbnV\f\x9b\xc6 \u053e\xa3\xa9MG\xf7\x88\v\xf4\u007f-_\x89\x04\xda\x0f\xdf\xcf\x05v\x00\x00\u07d4\xdbo\xf7\x1b=\xb0\x92\x8f\x83\x9e\x05\xa72;\xfbW\u049c\x87\xaa\x891T\xc9r\x9d\x05x\x00\x00\u07d4\xdbsF\vY\xd8\xe8PE\xd5\xe7R\xe6%Y\x87^BP.\x8963\x03\"\xd5#\x8c\x00\x00\u07d4\xdbw\xb8\x8d\xcbq/\xd1~\xe9\x1a[\x94t\x8dr\f\x90\xa9\x94\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdb}@7\b\x1fle\xf9Gk\x06\x87\xd9\u007f\x1e\x04M\n\x1d\x89#\xc7W\a+\x8d\xd0\x00\x00\xe0\x94\u06c8.\xac\xed\xd0\xef\xf2cQ\x1b1*\u06fcY\u01b8\xb2[\x8a\x01\xedO\xdez\"6\xb0\x00\x00\u07d4\u06d3q\xb3\fL\x84NY\xe0>\x92K\xe6\x06\xa98\xd1\xd3\x10\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u06e4ym\f\xebM:\x83k\x84\xc9o\x91\n\xfc\x10?[\xa0\x89\t\b\xf4\x93\xf77A\x00\x00\u07d4\u06ed\xc6\x1e\xd5\xf0F\n\u007f\x18\xe5\x1b/\xb2aM\x92d\xa0\xe0\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\u06f6\xacH@'\x04\x16B\xbb\xfd\x8d\x80\xf9\xd0\xc1\xcf3\xc1\xeb\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u06fc\xbby\xbfG\x9aB\xadq\xdb\u02b7{Z\u07ea\x87,X\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\xdb\xc1\xce\x0eI\xb1\xa7\x05\xd2. 7\xae\xc8x\xee\ru\xc7\x03\x89\r\x8drkqw\xa8\x00\x00\u07d4\xdb\xc1\xd0\xee+\xabS\x11@\xde\x13w\"\xcd6\xbd\xb4\xe4q\x94\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdb\u015e\u0609s\u07ad1\b\x84\":\xf4\x97c\xc0P0\xf1\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u0794\xdb\xc6ie\xe4&\xff\x1a\xc8z\xd6\xebx\xc1\xd9Rq\x15\x8f\x9f\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xdb\xcb\xcdzW\ua7724\x9b\x87\x8a\xf3K\x1a\xd6B\xa7\xf1\u0449\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdb\xd5\x1c\xdf,;\xfa\xcd\xff\x10b!\xde.\x19\xadmB\x04\x14\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xdb\xd7\x1e\xfaK\x93\u0209\xe7e\x93\xde`\x9c;\x04\u02ef\xbe\b\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xdb\xf5\xf0a\xa0\xf4\x8e^ia\x879\xa7}.\xc1\x97h\xd2\x01\x89\b=lz\xabc`\x00\x00\u07d4\xdb\xf8\xb19g\xf5Q%'-\xe0V%6\xc4P\xbaVU\xa0\x89n\xf5x\xf0n\f\xcb\x00\x00\u07d4\xdb\xfb\x1b\xb4d\xb8\xa5\x8eP\r.\xd8\u0797,E\xf5\xf1\xc0\xfb\x89V\xbcu\xe2\xd61\x00\x00\x00\xe0\x94\xdc\x06~\xd3\xe1-q\x1e\xd4u\xf5\x15n\xf7\xe7\x1a\x80\xd94\xb9\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xdc\b\u007f\x93\x90\xfb\x9e\x97j\xc2:\xb6\x89TJ\tB\xec !\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xdc\x1e\xb9\xb6\xe6CQ\xf5d$P\x96E\xf8>y\xee\xe7l\xf4\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdc\x1f\x19ya_\b!@\xb8\xbbx\xc6{'\xa1\x94'\x13\xb1\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xdc#\xb2`\xfc\xc2n}\x10\xf4\xbd\x04J\xf7\x94W\x94`\xd9\u0689\x1b\x1bk\u05efd\xc7\x00\x00\u07d4\xdc)\x11\x97E\xd23s \xdaQ\xe1\x91\x00\xc9H\u0640\xb9\x15\x89\b\xacr0H\x9e\x80\x00\x00\u07d4\xdc-\x15\xa6\x9fk\xb3;$j\xef@E\aQ\xc2\xf6uj\u0489l4\x10\x80\xbd\x1f\xb0\x00\x00\u07d4\xdc=\xaeY\xed\x0f\xe1\x8bXQ\x1eo\xe2\xfbi\xb2\x19h\x94#\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xdc?\x0evr\xf7\x1f\xe7R[\xa3\v\x97U\x18: \xb9\x16j\x8a\x02\b\x9c\xf5{[>\x96\x80\x00\xe0\x94\xdcCE\u0581.\x87\n\xe9\fV\x8cg\xd2\xc5g\u03f4\xf0<\x8a\x01k5-\xa5\xe0\xed0\x00\x00\u07d4\xdcD'[\x17\x15\xba\xea\x1b\x03EsZ)\xacB\xc9\xf5\x1bO\x89?\x19\xbe\xb8\xdd\x1a\xb0\x00\x00\u07d4\xdcF\xc13%\u034e\xdf\x020\xd0h\x89d\x86\xf0\a\xbfN\xf1\x89Hz\x9a0E9D\x00\x00\u07d4\xdcQ\xb2\u071d$z\x1d\x0e[\xc3l\xa3\x15oz\xf2\x1f\xf9\xf6\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xdcS\x05\xb4\x02\n\x06\xb4\x9de||\xa3L5\xc9\x1c_,V\x8a\x01}\xf6\xc1\r\xbe\xba\x97\x00\x00\u07d4\xdcW4[8\xe0\xf0g\u0263\x1d\x9d\xea\xc5'Z\x10\x94\x93!\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdcWG}\xaf\xa4/p\\\u007f\xe4\x0e\xae\x9c\x81un\x02%\xf1\x89\x1b\x1b\x81(\xa7An\x00\x00\u07d4\xdc_Z\xd6c\xa6\xf2c2}d\xca\xc9\xcb\x13=,\x96\x05\x97\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdcp:_7\x94\xc8Ml\xb3TI\x18\xca\xe1J5\u00fdO\x89dI\xe8NG\xa8\xa8\x00\x00\xe0\x94\xdcs\x8f\xb2\x17\u03ad/iYL\b\x17\r\xe1\xaf\x10\xc4\x19\xe3\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xdcv\xe8[\xa5\v\x9b1\xec\x1e& \xbc\xe6\xe7\xc8\x05\x8c\x0e\xaf\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\u0703\xb6\xfd\rQ!1 G\a\xea\xf7.\xa0\xc8\u027e\xf9v\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u070c)\x12\xf0\x84\xa6\u0444\xaasc\x85\x13\u033c2n\x01\x02\x89F3\xbc6\xcb\xc2\xdc\x00\x00\u07d4\u0711\x1c\xf7\xdc]\u04016Vg\x05(\xe93\x8eg\x03G\x86\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0730;\xfal\x111#NV\xb7\xea|Or\x14\x87Tkz\x89Hz\x9a0E9D\x00\x00\xe0\x94\u0736M\xf47X\xc7\u03d7O\xa6`HO\xbbq\x8f\x8cg\xc1\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xdc\xc5-\x8f\x8d\x9f\xc7B\xa8\xb8'g\xf0US\x87\xc5c\xef\xff\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xdc\xcb7\x0e\u058a\xa9\"(0C\xef|\xad\x1b\x9d@?\xc3J\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdc\u0324 E\xec>\x16P\x8b`?\xd96\xe7\xfd}\xe5\xf3j\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xdc\xd1\fU\xbb\x85OuD4\xf1!\x9c,\x9a\x98\xac\xe7\x9f\x03\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\xdc\u057c\xa2\x00S\x95\xb6u\xfd\xe5\x03VY\xb2k\xfe\xfcI\xee\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xdc\u06fdN&\x04\xe4\x0e\x17\x10\xccg0(\x9d\xcc\xfa\u04c9-\x89\xf9]\xd2\xec'\xcc\xe0\x00\x00\u07d4\xdc\xe3\f1\xf3\xcafr\x1e\xcb!<\x80\x9a\xabV\x1d\x9bR\xe4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdc\xf39eS\x13\x80\x161h\xfc\x11\xf6~\x89\xc6\xf1\xbc\x17\x8a\x89\x12'v\x854\x06\xb0\x80\x00\u07d4\xdc\xf6\xb6W&n\x91\xa4\xda\xe6\x03=\xda\xc1S2\u074d+4\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xdc\xf9q\x9b\xe8|oFum\xb4\x89\x1d\xb9\xb6\x11\xd2F\x9cP\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xdc\xff\xf3\xe8\xd2<*4\xb5k\u0473\xbdE\u01d3tC\"9\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xdd\x04\xee\xe7N\v\xf3\f?\x8dl,\u007fR\xe0Q\x92\x10\u07d3\x89\x04V9\x18$O@\x00\x00\xe0\x94\xdd&\xb4)\xfdC\xd8N\xc1y\x82S$\xba\u057f\xb9\x16\xb3`\x8a\x01\x16\xbf\x95\xbc\x842\x98\x00\x00\u07d4\xdd*#:\xde\xdef\xfe\x11&\xd6\xc1h#\xb6*\x02\x1f\xed\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xdd+\u07e9\x17\xc1\xf3\x10\xe6\xfa5\xaa\x8a\xf1i9\xc23\xcd}\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xdd5\xcf\xdb\u02d93\x95Sz\xec\xc9\xf5\x90\x85\xa8\xd5\u0776\xf5\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xddG\x18\x9a>d9qg\xf0b\x0eHEe\xb7b\xbf\xbb\xf4\x89dI\xe8NG\xa8\xa8\x00\x00\u07d4\xddM\xd6\xd3`3\xb0co\u030d\t8`\x9fM\xd6OJ\x86\x89\x03@\xaa\xd2\x1b;p\x00\x00\u07d4\xddO_\xa2\x11\x1d\xb6\x8fk\xde5\x89\xb60)9[i\xa9-\x89\b\x96=\xd8\xc2\xc5\xe0\x00\x00\xe0\x94\xddc\x04/%\xed2\x88J\xd2n:\xd9Y\xeb\x94\xea6\xbfg\x8a\x04\x84\xd7\xfd\xe7\u0553\xf0\x00\x00\u07d4\xdde\xf6\xe1qc\xb5\xd2\x03d\x1fQ\xcc{$\xb0\x0f\x02\xc8\xfb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xddl\x06!\x93\xea\xc2=/\xdb\xf9\x97\xd5\x06:4k\xb3\xb4p\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xdd{\u0366Y$\xaa\xa4\x9b\x80\x98J\xe1su\x02X\xb9(G\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xdd\u007f\xf4A\xbao\xfe6q\xf3\xc0\u06bb\xff\x18#\xa5\x043p\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u0742T\x12\x1an\x94/\xc9\b(\xf2C\x1fQ\x1d\xad\u007f2\u6263\x9b)\xe1\xf3`\xe8\x00\x00\xe0\x94\u074a\xf9\xe7vR#\xf4DoD\xd3\xd5\t\x81\x9a==\xb4\x11\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\u0755\xdb\xe3\x0f\x1f\x18w\xc5\xddv\x84\xae\xef0*\xb6\x88Q\x92\x8a\x01\xc5\xd8\xd6\xeb>2P\x00\x00\xe0\x94\u0756|L_\x8a\xe4~&o\xb4\x16\xaa\u0456N\xe3\xe7\xe8\u00ca\x01\xa4 \xdb\x02\xbd}X\x00\x00\u07d4\u075bHZ;\x1c\xd3:j\x9cb\xf1\xe5\xbe\xe9'\x01\x85m%\x89\f3\x83\xed\x03\x1b~\x80\x00\xe0\x94\u0763q\xe6\x00\xd3\x06\x88\xd4q\x0e\b\x8e\x02\xfd\xf2\xb9RM_\x8a\x01w\"J\xa8D\xc7 \x00\x00\u07d4\u0764\xed*X\xa8\xdd \xa72u4{X\rq\xb9[\xf9\x9a\x89\x15\xa1<\xc2\x01\xe4\xdc\x00\x00\xe0\x94\u0764\xff}\xe4\x91\u0187\xdfEt\xdd\x1b\x17\xff\x8f$k\xa3\u044a\x04&\x84\xa4\x1a\xbf\xd8@\x00\x00\u07d4\u076bkQ\xa9\x03\v@\xfb\x95\xcf\vt\x8a\x05\x9c$\x17\xbe\u01c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94\u076bu\xfb/\xf9\xfe\u02c8\xf8\x94vh\x8e+\x00\xe3g\xeb\xf9\x8a\x04\x1b\xad\x15^e\x12 \x00\x00\xe0\x94\u076b\xf1<<\x8e\xa4\xe3\xd7=x\xecqz\xfa\xfaC\x0eTy\x8a\b\xcf#\xf9\t\xc0\xfa\x00\x00\x00\u07d4\u076c1*\x96UBj\x9c\f\x9e\xfa?\xd8%Y\xefE\x05\xbf\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\u076ck\xf4\xbb\xdd}Y}\x9chm\x06\x95Y;\xed\xcc\xc7\xfa\x89.\xe4IU\b\x98\xe4\x00\x00\xe0\x94\u077d+\x93,v;\xa5\xb1\xb7\xae;6.\xac>\x8d@\x12\x1a\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\u077d\xdd\x1b\xbd8\xff\xad\xe00]0\xf0 (\xd9.\x9f:\xa8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\u077e\xe6\xf0\x94\xea\xe64 \xb0\x03\xfbGW\x14*\xeal\xd0\xfd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdd\u059c[\x9b\xf5\xebZ9\xce\xe7\xc34\x1a\x12\r\x97?\xdb4\x89k\xc1K\x8f\x8e\x1b5\x00\x00\xe0\x94\xdd\xdd{\x9en\xab@\x9b\x92&:\xc2r\u0680\x1bfO\x8aW\x8ai\xe1\r\xe7fv\u0400\x00\x00\u07d4\xdd\xe6p\xd0\x169fuv\xa2-\xd0]2F\xd6\x1f\x06\xe0\x83\x89\x01s\x17\x90SM\xf2\x00\x00\xe0\x94\xdd\xe7zG@\xba\b\xe7\xf7?\xbe:\x16t\x91)1t.\xeb\x8a\x044\xfeMC\x82\xf1\u0500\x00\u07d4\xdd\xe8\xf0\xc3\x1bt\x15Q\x1d\xce\xd1\xcd}F2>K\xd1\"2\x89WG=\x05\u06ba\xe8\x00\x00\u07d4\xdd\xe9i\xae\xf3N\xa8z\u0099\xb7Y~)+J\x01U\u030a\x89\x102\xf2YJ\x01s\x80\x00\u07d4\xdd\xf0\xcc\xe1\xfe\x99m\x91v5\xf0\a\x12\xf4\x05 \x91\xdf\xf9\xea\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xdd\xf3\xadv58\x10\xbej\x89\xd71\xb7\x87\xf6\xf1q\x88a+\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xdd\xf5\x81\n\x0e\xb2\xfb.22;\xb2\u0255\t\xab2\x0f$\xac\x8a\x03\xca\\f\u067cD0\x00\x00\xe0\x94\xdd\xf9\\\x1e\x99\xce/\x9fV\x98\x05|\x19\xd5\xc9@'\xeeJn\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u0794\xdd\xfa\xfd\xbc|\x90\xf12\x0eT\xb9\x8f7F\x17\xfb\xd0\x1d\x10\x9f\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\xdd\xfc\xca\x13\xf94\xf0\u03fe#\x1d\xa109\xd7\x04u\xe6\xa1\u040968\"\x16`\xa5\xaa\x80\x00\u07d4\xde\x02~\xfb\xb3\x85\x03\"n\xd8q\t\x9c\xb3\v\xdb\x02\xaf\x135\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xde\x06\xd5\xeawzN\xb1G^`]\xbc\xbfCDN\x807\xea\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\xde\a\xfb[zFN;\xa7\xfb\xe0\x9e\x9a\xcb'\x1a\xf53\x8cX\x89\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xde\x11!\x82\x9c\x9a\b(@\x87\xa4?\xbd/\xc1\x14*23\xb4\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xde\x17kR\x84\xbc\xee:\x83\x8b\xa2Og\xfc|\xbfg\u05ce\xf6\x89\x02\t\xce\b\xc9b\xb0\x00\x00\u07d4\xde!\"\x93\xf8\xf1\xd21\xfa\x10\xe6\tG\rQ,\xb8\xff\xc5\x12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xde0\xe4\x9eZ\xb3\x13!M/\x01\u072b\u0389@\xb8\x1b\x1cv\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xde3\xd7\b\xa3\xb8\x9e\x90\x9e\xafe;0\xfd\u00e5\xd5\u0334\xb3\x89\t\x9c\x88\"\x9f\xd4\xc2\x00\x00\u07d4\xde7B\x99\xc1\xd0}ySs\x85\x19\x0fD.\xf9\xca$\x06\x1f\x89\a?u\u0460\x85\xba\x00\x00\u07d4\xdeB\xfc\xd2L\xe4#\x93\x830CgY_\x06\x8f\fa\a@\x89\x02r*p\xf1\xa9\xa0\x00\x00\u07d4\xdeP\x86\x8e\xb7\xe3\xc7\x197\xecs\xfa\x89\u074b\x9e\xe1\rE\xaa\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xdeU\xde\x04X\xf8P\xb3~Mx\xa6A\xdd.\xb2\u074f8\u0389\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xde[\x00_\xe8\u06ae\x8d\x1f\x05\xde>\xda\x04 f\xc6\xc4i\x1c\x89;\xa1\x91\v\xf3A\xb0\x00\x00\u07d4\xdea-\a$\xe8N\xa4\xa7\xfe\xaa=!B\xbd^\xe8-2\x01\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xdem61\x06\xccb8\xd2\xf0\x92\xf0\xf07!6\xd1\xcdP\u018a\x01!\xeah\xc1\x14\xe5\x10\x00\x00\u07d4\xde}\xee\"\x0f\x04W\xa7\x18}V\xc1\xc4\x1f.\xb0\n\xc5`!\x89\"%\xf3\x9c\x85\x05*\x00\x00\u07d4\u0782\u030dJ\x1b\xb1\xd9CC\x92\x96[>\x80\xba\xd3\xc0=O\x89P\x18nu\u0797\xa6\x00\x00\u07d4\u0797\xf43\a\x00\xb4\x8cImC|\x91\xca\x1d\xe9\u0130\x1b\xa4\x89\x9d\xcc\x05\x15\xb5n\f\x00\x00\u07d4\u079e\xffLy\x88\x11\xd9h\xdc\xcbF\r\x9b\x06\x9c\xf3\x02x\xe0\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\u07b1\xbc4\xd8mJM\xde%\x80\u063e\xaf\aN\xb0\xe1\xa2D\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\u07b2I]j\xca{*j-\x13\x8bn\x1aB\xe2\xdc1\x1f\u0749lk\x93[\x8b\xbd@\x00\x00\u07d4\u07b9rTGL\r/Zyp\xdc\xdb/R\xfb\x10\x98\xb8\x96\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u07b9\xa4\x9aC\x870 \xf0u\x91\x85\xe2\v\xbbL\U000c1ecf\x89\vx\xed\xb0\xbf.^\x00\x00\u07d4\u07bb\u0743\x1e\x0f \xaen7\x82R\xde\xcd\xf9/|\xf0\xc6X\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xde\xc3\xee\xc2d\nu,Fn+~~\u616f\xe9\xacA\xf4\x89G\u0257SYk(\x80\x00\u07d4\xde\xc8#s\xad\xe8\xeb\xcf*\xcbo\x8b\xc2AM\u05eb\xb7\rw\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xde\u0221\xa8\x98\xf1\xb8\x95\xd80\x1f\xe6J\xb3\xad]\xe9A\xf6\x89\x89*\xb4\xf6~\x8as\x0f\x80\x00\u07d4\xde\u025e\x97/\xcaqwP\x8c\x8e\x1aG\xac\"\xd7h\xac\xab|\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xde\xd8w7\x84\a\xb9Nx\x1cN\xf4\xaf|\xfc[\xc2 \xb5\x16\x89\x141y\xd8i\x11\x02\x00\x00\u07d4\xde\xe9B\xd5\xca\xf5\xfa\xc1\x14!\xd8k\x01\vE\x8e\\9)\x90\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xde\xee&\x89\xfa\x90\x06\xb5\x9c\xf2\x85#}\xe5;:\u007f\xd0\x148\x89\x18ey\xf2\x9e %\x00\x00\u07d4\xde\xfd\xdf\u055b\x8d,\x15N\xec\xf5\xc7\xc1g\xbf\v\xa2\x90]>\x89\x05\x12\xcb^&GB\x00\x00\u07d4\xde\xfe\x91A\xf4pE\x99\x15\x9d{\"=\xe4+\xff\xd8\x04\x96\xb3\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xdf\t\x8f^N=\xff\xa5\x1a\xf27\xbd\xa8e,Os\ud726\x89\x1b6\xa6DJ>\x18\x00\x00\xe0\x94\xdf\r\ba{\xd2R\xa9\x11\u07cb\xd4\x1a9\xb8=\u07c0\x96s\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xdf\x0f\xf1\xf3\xd2z\x8e\xc9\xfb\x8fk\f\xb2T\xa6;\xba\x82$\xa5\x89\xec\xc5 )E\xd0\x02\x00\x00\u07d4\xdf\x1f\xa2\xe2\x0e1\x98^\xbe,\x0f\f\x93\xb5L\x0f\xb6z&K\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xdf!\x1c\xd2\x12\x88\xd6\xc5o\xaef\xc3\xffTb]\u0531T'\x89\x87\x86\xcdvN\x1f,\x00\x00\u07d4\xdf#k\xf6\xab\xf4\xf3)7\x95\xbf\f(q\x8f\x93\u3c73k\x89Hz\x9a0E9D\x00\x00\u07d4\xdf1\x02_VI\xd2\xc6\xee\xa4\x1e\u04fd\xd3G\x1ay\x0fu\x9a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xdf7\xc2.`:\xed\xb6\nbrS\xc4}\x8b\xa8f\xf6\xd9r\x8a\x05\x15\n\xe8J\x8c\xdf\x00\x00\x00\u07d4\xdf;r\u017dq\u0501N\x88\xa6#!\xa9=@\x11\xe3W\x8b\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdf?W\xb8\xeed4\xd0G\"=\xeft\xb2\x0fc\xf9\xe4\xf9U\x89\r\x94b\xc6\xcbKZ\x00\x00\u07d4\xdfD\xc4\u007f\xc3\x03\xacv\xe7O\x97\x19L\xcag\xb5\xbb<\x02?\x89 \t\xc5\u023fo\xdc\x00\x00\u07d4\xdfG\xa6\x1brSQ\x93\xc5a\xcc\xccu\xc3\xf3\xce\b\x04\xa2\x0e\x89\x15\x93\\\vN=x\x00\x00\u07d4\xdfG\xa8\xef\x95\xf2\xf4\x9f\x8eoX\x18AT\x14]\x11\xf7'\x97\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xdfS\x003F\xd6\\^zdk\xc04\xf2\xb7\xd3/\xcb\xe5j\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xdfW5:\xaf\xf2\xaa\xdb\n\x04\xf9\x01N\x8d\xa7\x88N\x86X\x9c\x89\bH\x86\xa6nO\xb0\x00\x00\u07d4\xdf`\xf1\x8c\x81*\x11\xedN'v\xe7\xa8\x0e\xcf^S\x05\xb3\u05890\xca\x02O\x98{\x90\x00\x00\u07d4\xdfd\x85\xc4)z\xc1R\xb2\x89\xb1\x9d\xde2\xc7~\xc4\x17\xf4}\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xdff\n\x91\u06b9\xf70\xf6\x19\rP\xc89\x05aP\aV\u0289lk\x93[\x8b\xbd@\x00\x00\u07d4\xdfn\xd6\x00jj\xbe\x88n\xd3=\x95\xa4\xde(\xfc\x12\x189'\x891T\xc9r\x9d\x05x\x00\x00\u07d4\u07c5\x10y>\xee\x81\x1c-\xab\x1c\x93\xc6\xf4G?0\xfb\xef[\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u07cdH\xb1\xeb\a\xb3\xc2\x17y\x0el-\xf0M\xc3\x19\xe7\xe8H\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\u07e6\xb8\xb8\xad1\x84\xe3W\xda()Q\u05d1a\u03f0\x89\xbc\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\u07ef1\xe6\"\xc0=\x9e\x18\xa0\u0778\xbe`\xfb\xe3\xe6a\xbe\n\x8a\x02\x1e\x17\x1a>\xc9\xf7,\x00\x00\u07d4\u07f1bn\xf4\x8a\x1d}uR\xa5\xe0)\x8f\x1f\xc2:;H-\x89\\\xe8\x95\u0754\x9e\xfa\x00\x00\xe0\x94\u07f4\u052d\xe5/\u0301\x8a\xccz,k\xb2\xb0\x02$e\x8fx\x8a\x01\xa4 \xdb\x02\xbd}X\x00\x00\u07d4\u07fdB2\xc1|@z\x98\r\xb8\u007f\xfb\u036060\xe5\xc4Y\x89\x1d\xfc\u007f\x92I#S\x00\x00\u07d4\xdf\xcb\xdf\tEN\x1a^J@\xd3\xee\xf7\xc5\xcf\x1c\xd3\u0794\x86\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xdf\xdb\xce\xc1\x01K\x96\xda!X\xcaQ>\x9c\x8d;\x9a\xf1\xc3\u0409lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xdf\xde\xd2WK'\xd1a:}\x98\xb7\x15\x15\x9b\r\x00\xba\xab(\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xdf\xdfC9P\x8b\x0fnZ\xb1\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe0\x06\x04b\xc4\u007f\xf9g\x9b\xae\xf0qY\xca\xe0\x8c)\xf2t\xa9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\r\x15;\x106\x91C\xf9\u007fT\xb8\xd4\xca\"\x9e\xb3\xe8\xf3$\x89\b=lz\xabc`\x00\x00\u07d4\xe0\x12\xdbE8'\xa5\x8e\x16\xc16V\b\xd3n\xd6Xr\x05\a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\x15G\xbaB\xfc\xaf\xaf\x93\x93\x8b\xec\xf7i\x9ft)\n\xf7O\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\x16\xdc\x13\x8e%\x81[\x90\xbe?\xe9\xee\xe8\xff\xb2\xe1\x05bO\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe0\x18Y\xf2B\xf1\xa0\xec`/\xa8\xa3\xb0\xb5v@\xec\x89\a^\x89\x1e\x16,\x17{\xe5\xcc\x00\x00\xe0\x94\xe0 \xe8cb\xb4\x87u(6\xa6\xde\v\xc0,\xd8\u061a\x8bj\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xe0#\xf0\x9b(\x87a,|\x9c\xf1\x98\x8e::`+3\x94\u0249lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0'\"\x13\xe8\xd2\xfd>\x96\xbdb\x17\xb2KK\xa0\x1bapy\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe0+t\xa4v(\xbe1[\x1fv\xb3\x15\x05J\xd4J\xe9qo\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xe02 \u0197\xbc\u048f&\xef\vt@J\x8b\xeb\x06\xb2\xba{\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xe05/\u07c1\x9b\xa2e\xf1L\x06\xa61\\J\xc1\xfe\x13\x1b.\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe08\x8a\xed\xdd?\xe2\xadV\xf8WH\xe8\x0eq\n4\xb7\xc9.\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe0<\x00\xd0\x03\x88\xec\xbfO&=\n\xc7x\xbbA\xa5z@\u064966\xc9yd6t\x00\x00\u07d4\xe0I \xdcn\xcc\x1dn\xcc\bO\x88\xaa\n\xf5\u06d7\xbf\x89:\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xe0Ir\xa8<\xa4\x11+\xc8q\xc7-J\xe1al/\a(\u06c9\x0e\x81\xc7\u007f)\xa3/\x00\x00\u07d4\xe0O\xf5\xe5\xa7\u2bd9]\x88W\xce\x02\x90\xb5:+\x0e\xda]\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xe0P)\xac\xeb\axg[\xef\x17A\xab,\u0493\x1e\xf7\xc8K\x8a\x01\x0f\r\xba\xe6\x10\tR\x80\x00\u07d4\xe0V\xbf?\xf4\x1c&%o\xefQqf\x12\xb9\u04da\u0799\x9c\x89\x05k\xe7W\xa1.\n\x80\x00\u07d4\xe0a\xa4\xf2\xfcw\xb2\x96\u045a\xda#\x8eI\xa5\u02ce\xcb\xfap\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xe0f>\x8c\xd6g\x92\xa6A\xf5nP\x03f\x01G\x88\x0f\x01\x8e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0f\x8f\xa8,\x14\xd6\xe8\xd9:S\x11>\xf2\x86/\xa8\x15\x81\xbc\x89//9\xfclT\x00\x00\x00\u07d4\xe0i\xc0\x173R\xb1\v\xf6\x83G\x19\xdb[\xed\x01\xad\xf9{\xbc\x89\x01\x064\xf8\xe52;\x00\x00\u07d4\xe0l)\xa8\x15\x17\xe0\u0507\xb6\u007f\xb0\xb6\xaa\xbcOW6\x83\x88\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\xe0l\xb6)G\x04\xee\xa7C|/\xc3\xd3\as\xb7\xbf8\x88\x9a\x89\x01\x16\xdc:\x89\x94\xb3\x00\x00\u07d4\xe0q7\xae\r\x11m\x0353\xc4\uad16\xf8\xa9\xfb\tV\x9c\x89K\xe4\xe7&{j\xe0\x00\x00\xe0\x94\xe0v\xdb0\xabHoy\x19N\xbb\xc4]\x8f\xab\x9a\x92B\xf6T\x8a\x01\x06`~4\x94\xba\xa0\x00\x00\u07d4\xe0~\xbb\xc7\xf4\xdaAnB\xc8\xd4\xf8B\xab\xa1b3\xc1%\x80\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\x81\xca\x1fH\x82\xdb`C\u0569\x19\a\x03\xfd\xe0\xab;\xf5m\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe0\x83\xd3Hc\xe0\xe1\u007f\x92ky(\xed\xff1~\x99\x8e\x9cK\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe0\x8b\x9a\xbak\xd9\u048b\xc2\x05gy\xd2\xfb\xf0\xf2\x85Z=\x9d\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\x8b\u009c+H\xb1i\xff+\xdc\x16qLXnl\xb8\\\u03c9\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe0\x8c`11\x06\xe3\xf93O\xe6\xf7\xe7bM!\x110\xc0w\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xe0\x9ch\xe6\x19\x98\xd9\xc8\x1b\x14\xe4\xee\x80+\xa7\xad\xf6\xd7L\u06c9\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xe0\x9f\xeauZ\xee\x1aD\xc0\xa8\x9f\x03\xb5\u07b7b\xba3\x00o\x89;\xa2\x89\xbc\x94O\xf7\x00\x00\xe0\x94\xe0\xa2T\xac\t\xb9r[\xeb\xc8\xe4`C\x1d\xd0s.\xbc\xab\xbf\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xe0\xaai6UU\xb7?(#3\xd1\xe3\f\x1b\xbd\a(T\xe8\x8a\x01{x\x83\xc0i\x16`\x00\x00\u07d4\xe0\xba\u064e\ue598\xdb\xf6\xd7`\x85\xb7\x92=\xe5uN\x90m\x89\t\r\x97/22<\x00\x00\u07d4\xe0\u012b\x90r\xb4\xe6\xe3eJI\xf8\xa8\xdb\x02jK3\x86\xa9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\u0380\xa4a\xb6H\xa5\x01\xfd\v\x82F\x90\u0206\x8b\x0eM\xe8\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe0\xcfi\x8a\x053'\xeb\xd1k}w\x00\t/\xe2\xe8T$F\x89\x05*4\u02f6\x1fW\x80\x00\xe0\x94\xe0\xd21\xe1D\xec\x91\a8l|\x9b\x02\xf1p,\xea\xa4\xf7\x00\x8a\x01\x0f\r\xba\xe6\x10\tR\x80\x00\u07d4\xe0\xd7kqf\xb1\xf3\xa1+@\x91\xee+)\u078c\xaa}\a\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xe0\xe0\xb2\xe2\x9d\xdes\xafu\x98~\xe4Dl\x82\x9a\x18\x9c\x95\xbc\x89\b\x13\xcaV\x90m4\x00\x00\xe0\x94\xe0\xe9xu=\x98/\u007f\x9d\x1d#\x8a\x18\xbdH\x89\xae\xfeE\x1b\x8a\x02\r\u058a\xaf2\x89\x10\x00\x00\u07d4\xe0\xf3r4|\x96\xb5_}C\x06\x03K\xeb\x83&o\xd9\tf\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe0\xf9\x03\xc1\xe4\x8a\xc4!\xabHR\x8f=J&H\b\x0f\xe0C\x897\b\xba\xed=h\x90\x00\x00\u07d4\xe0\xff\v\xd9\x15D9\u0125\xb7#>)\x1d}\x86\x8a\xf5?3\x89\x15y!jQ\xbb\xfb\x00\x00\xe0\x94\xe1\n\xc1\x9cTo\xc2T|a\xc19\xf5\xd1\xf4Zff\u0570\x8a\x01\x02\xdao\xd0\xf7:<\x00\x00\xe0\x94\xe1\fT\x00\x88\x11?\xa6\xec\x00\xb4\xb2\u0202O\x87\x96\xe9n\u010a2\x0fE\t\xab\x1e\xc7\xc0\x00\x00\xe0\x94\xe1\x17:$})\xd8#\x8d\xf0\x92/M\xf2Z\x05\xf2\xafw\u00ca\bx\xc9]V\x0f0G\x80\x00\xe0\x94\xe1 >\xb3\xa7#\xe9\x9c\" \x11|\xa6\xaf\xebf\xfaBOa\x8a\x02\x00\uf49e2V\xfe\x00\x00\xe0\x94\xe11\xf8~\xfc^\xf0~C\xf0\xf2\xf4\xa7G\xb5Q\xd7P\xd9\xe6\x8a\x04<%\xe0\xdc\xc1\xbd\x1c\x00\x00\u07d4\xe13N\x99\x83y\xdf\xe9\x83\x17pby\x1b\x90\xf8\x0e\xe2-\x8d\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe15@\xec\xee\x11\xb2\x12\xe8\xb7u\u070eq\xf3t\xaa\xe9\xb3\xf8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe1;=+\xbf\u073c\x87r\xa23\x15rL\x14%\x16|V\x88\x897\xf3y\x14\x1e\xd0K\x80\x00\u07d4\xe1D=\xbd\x95\xccA#\u007fa:HEi\x88\xa0Oh2\x82\x89\xd8\xd8X?\xa2\xd5/\x00\x00\u07d4\xe1F\x17\xf6\x02%\x01\xe9~{>-\x886\xaaa\xf0\xff-\xba\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe1I\xb5rl\xafm^\xb5\xbf*\xccA\xd4\xe2\xdc2\x8d\u1089i*\xe8\x89p\x81\xd0\x00\x00\xe0\x94\xe1T\xda\xea\xdbTX8\xcb\u01aa\fUu\x19\x02\xf5(h*\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\u07d4\xe1l\xe3Ya\xcdt\xbdY\r\x04\u012dJ\x19\x89\xe0V\x91\u0189\a\xea(2uw\b\x00\x00\u07d4\xe1r\xdf\xc8\xf8\f\xd1\xf8\u03459\xdc&\b \x14\xf5\xa8\xe3\u8262\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xe1w\xe0\xc2\x01\xd35\xba9V\x92\x9cW\x15\x88\xb5\x1cR#\xae\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe1x\x12\xf6l^e\x94\x1e\x18lF\x92+n{/\x0e\xebF\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xe1\x80\u079e\x86\xf5{\xaf\xac\u05d0O\x98&\xb6\xb4\xb2c7\xa3\x89-\x04\x1dpZ,`\x00\x00\xe0\x94\xe1\x92H\x9b\x85\xa9\x82\xc1\x882F\xd9\x15\xb2)\xcb\x13 \u007f8\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xe1\x95\xbb\xc6,{tD\x04\x0e\xb9\x96#\x96Ovg\xb3v\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe2\x06\xfbs$\xe9\u07b7\x9e\x19\x904\x96\u0596\x1b\x9b\xe5f\x03\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xe2\aW\x8e\x1fM\u06cf\xf6\u0546{9X-q\xb9\x81*\u0149\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\xe2\b\x81*h@\x98\xf3\xdaN\xfej\xba%bV\xad\xfe?\xe6\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe2\tT\xd0\xf4\x10\x8c\x82\xd4\u0732\x14\x8d&\xbb\xd9$\xf6\xdd$\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xe2\v\xb9\xf3\x96d\x19\xe1K\xbb\xaa\xaag\x89\xe9$\x96\u03e4y\x89\xbb\xd8%\x03\aRv\x00\x00\u07d4\xe2\r\x1b\xcbq(m\xc7\x12\x8a\x9f\xc7\xc6\xed\u007fs8\x92\xee\xf5\x896d\xf8\xe7\xc2J\xf4\x00\x00\u0794\xe2\x19\x12\x15\x98?3\xfd3\xe2,\u0522I\x00T\xdaS\xfd\u0708\xdbD\xe0I\xbb,\x00\x00\u07d4\xe2\x19\x8c\x8c\xa1\xb3\x99\xf7R\x15a\xfdS\x84\xa7\x13/\xbaHk\x897\b\xba\xed=h\x90\x00\x00\xe0\x94\xe2\x1cw\x8e\xf2\xa0\xd7\xf7Q\xea\x8c\aM\x1f\x81\"C\x86>N\x8a\x01\x1f\xc7\x0e,\x8c\x8a\xe1\x80\x00\xe0\x94\xe2)\xe7F\xa8?,\xe2S\xb0\xb0>\xb1G$\x11\xb5~W\x00\x8a\x016\x9f\xb9a(\xacH\x00\x00\u07d4\xe2+ \xc7x\x94F;\xafwL\xc2V\u057d\u06ff}\xdd\t\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe20\xfe\x1b\xff\x03\x18m\x02\x19\xf1]LH\x1b}Y\xbe(j\x89\x01\xfdt\x1e\x80\x88\x97\x00\x00\u07d4\xe27\xba\xa4\xdb\u0252n2\xa3\xd8]\x12d@-T\xdb\x01/\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe2A\t\xbe/Q=\x87I\x8e\x92j(d\x99uO\x9e\u051e\x890\x0e\xa8\xad\x1f'\xca\x00\x00\u07d4\xe2Fh<\u025d\xb7\u0125+\u02ec\xaa\xb0\xb3/k\xfc\x93\u05c9lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe2Z\x16{\x03\x1e\x84am\x0f\x01?1\xbd\xa9]\xcccP\xb9\x8a\x02\x8c*\xaa\u0243\xd0]\u0187st\xa8\xf4F\xee\xe9\x89\n\xb6@9\x12\x010\x00\x00\u07d4\xe2\x8b\x06\"Y\xe9n\xeb<\x8dA\x04\x94?\x9e\xb3%\x89<\xf5\x89Hz\x9a0E9D\x00\x00\xe0\x94\u237c\x8e\xfd^Ajv.\xc0\xe0\x18\x86K\xb9\xaa\x83({\x8a\x051\xf2\x00\xab>\x03\n\x80\x00\u07d4\xe2\x90K\x1a\xef\xa0V9\x8bb4\xcb5\x81\x12\x88\xd76\xdbg\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\u274a\xe4R\xdc\xf3\xb6\xacd^c\x04\t8UQ\xfa\xae\n\x89\x04Z\r\xa4\xad\xf5B\x00\x00\u07d4\xe2\xbb\xf8FA\xe3T\x1fl3\xe6\xedh:cZp\xbd\xe2\xec\x89\x1bA<\xfc\xbfY\xb7\x80\x00\u07d4\xe2\xcf6\n\xa22\x9e\xb7\x9d+\xf7\xca\x04\xa2z\x17\xc52\xe4\u0609\x05\x87\x88\u02d4\xb1\xd8\x00\x00\u07d4\xe2\xdf#\xf6\xea\x04\xbe\xcfJ\xb7\x01t\x8d\xc0\x961\x84U\\\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xe2\xe1\\`\xdd8\x1e:K\xe2Pq\xab$\x9aL\\Rd\u0689\u007fk\u011b\x81\xb57\x00\x00\u07d4\xe2\xe2nN\x1d\xcf0\xd0H\xccn\u03ddQ\xec\x12\x05\xa4\xe9&\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xe2\xeei\x1f#~\xe6R\x9beW\xf2\xfc\xdd=\xcf\fY\xecc\x8a\x01'r\x9c\x14h| \x00\x00\u07d4\xe2\xef\xa5\xfc\xa7\x958\xce`h\xbf1\xd2\xc5\x16\xd4\xd5<\b\xe5\x89\a\x1c\xc4\b\xdfc@\x00\x00\xe0\x94\xe2\xef\u0429\xbc@~\xce\x03\xd6~\x8e\xc8\xe9\u0483\xf4\x8d*I\x8a\x02\x99\xb3;\xf9\u0144\xe0\x00\x00\u07d4\xe2\xf4\r5\x8f^?\xe7F>\xc7\x04\x80\xbd.\u04d8\xa7\x06;\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe2\xf98=X\x10\xea{C\x18+\x87\x04\xb6+'\xf5\x92]9\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe2\xff\x9e\xe4\xb6\xec\xc1AA\xcct\xcaR\xa9\xe7\xa2\xee\x14\xd9\b\x89K\xe4\xe7&{j\xe0\x00\x00\xe0\x94\xe3\x02\x12\xb2\x01\x1b\xb5k\xdb\xf1\xbc5i\x0f:N\x0f\xd9\x05\xea\x8a\x01\xb2\u07dd!\x9fW\x98\x00\x00\u07d4\xe3\x03\x16\u007f=I`\xfe\x88\x1b2\x80\n+J\xef\xf1\xb0\x88\u0509lk\x93[\x8b\xbd@\x00\x00\u07d4\xe3\x04\xa3/\x05\xa87btJ\x95B\x97o\xf9\xb7#\xfa1\xea\x89Ur\xf2@\xa3F \x00\x00\u07d4\xe3\bCR\x04y7d\xf5\xfc\xbee\xebQ\x0fZtJeZ\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe3\t\x97L\xe3\x9d`\xaa\xdf.ig2Q\xbf\x0e\x04v\n\x10\x89\r\xc5_\xdb\x17d{\x00\x00\u07d4\xe3\x1bN\xef\x18L$\xab\t\x8e6\xc8\x02qK\xd4t=\xd0\u0509\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe3!\xbbJ\x94j\xda\xfd\xad\xe4W\x1f\xb1\\\x00C\u04de\xe3_\x89Udu8+L\x9e\x00\x00\u07d4\xe3&<\xe8\xafm\xb3\xe4gXE\x02\xedq\t\x12^\xae\"\xa5\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe3+\x1cG%\xa1\x87TI\u93d7\x0e\xb3\xe5@b\xd1X\x00\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe3/\x95vmW\xb5\xcdK\x172\x89\u0587o\x9edU\x81\x94\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xe38@\u063c\xa7\u0698\xa6\xf3\u0416\xd8=\xe7\x8bp\xb7\x1e\xf8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe38\xe8Y\xfe.\x8c\x15UHH\xb7\\\xae\u0368w\xa0\xe82\x89a\xac\xff\x81\xa7\x8a\xd4\x00\x00\u07d4\xe3=\x98\x02 \xfa\xb2Y\xafj\x1fK8\xcf\x0e\xf3\xc6\xe2\xea\x1a\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe3=\xf4\u0380\u0336*v\xb1+\xcd\xfc\xec\xc4b\x89\x97:\xa9\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xe3?\xf9\x87T\x1d\xde\\\xde\u0a29m\xcc?3\xc3\xf2L\u008a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xe3A\v\xb7U|\xf9\x1dy\xfai\xd0\xdf\xea\n\xa0u@&Q\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe3Ad-@\u04af\xce.\x91\a\xc6py\xacz&`\bl\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe3TS\xee\xf2\xcc2\x89\x10CR\x8d\t\x84i\x80\x00\xe0\x94\xe5\x10\xd6y\u007f\xba=f\x93\x83Z\x84N\xa2\xadT\x06\x91\x97\x1b\x8a\x03\xae9\xd4s\x83\xe8t\x00\x00\u07d4\xe5\x14!\xf8\xee\"\x10\xc7\x1e\xd8p\xfea\x82v\u0215J\xfb\xe9\x89Hz\x9a0E9D\x00\x00\u07d4\xe5\x1e\xb8~\u007f\xb71\x1fR(\xc4y\xb4\x8e\u0247\x881\xacL\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5!V1\xb1BH\xd4Z%R\x96\xbe\xd1\xfb\xfa\x030\xff5\x89G\x03\xe6\xebR\x91\xb8\x00\x00\xe0\x94\xe5(\xa0\xe5\xa2g\xd6g\xe99:e\x84\xe1\x9b4\u071b\xe9s\x8a\x01/\x93\x9c\x99\xed\xab\x80\x00\x00\u07d4\xe54%\xd8\xdf\x1f\x11\xc3A\xffX\xae_\x148\xab\xf1\xcaS\u03c9\x11t\xa5\xcd\xf8\x8b\xc8\x00\x00\u07d4\xe5No\x9c\xffV\xe1\x9cF\x1e\xb4T\xf9\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe5A\x02SM\xe8\xf2>\xff\xb0\x93\xb3\x12B\xad;#?\xac\xfd\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xe5E\xee\x84\xeaH\xe5d\x16\x1e\x94\x82\u055b\xcf@j`,\xa2\x89dI\xe8NG\xa8\xa8\x00\x00\u07d4\xe5H\x1a\u007f\xedB\xb9\x01\xbb\xed x\x9b\u052d\xe5\r_\x83\xb9\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5Y\xb5\xfd3{\x9cUr\xa9\xbf\x9e\x0f%!\xf7\xd4F\xdb\xe4\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe5\\\x80R\n\x1b\x0fu[\x9a,\xd3\xce!Ov%e>\x8a\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe5mC\x13$\xc9)\x11\xa1t\x9d\xf2\x92p\x9c\x14\xb7ze\u034a\x01\xbc\x85\xdc*\x89\xbb \x00\x00\u07d4\xe5})\x95\xb0\xeb\xdf?<\xa6\xc0\x15\xeb\x04&\r\xbb\x98\xb7\u0189lk\x93[\x8b\xbd@\x00\x00\u07d4\u51f1j\xbc\x8at\b\x1e6\x13\xe1CB\xc03u\xbf\bG\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\x89\xfav\x98M\xb5\xec@\x04\xb4n\u8954\x92\xc3\aD\u0389\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xe5\x8d\xd228\xeen\xa7\xc2\x13\x8d8]\xf5\x00\xc3%\xf3v\xbe\x89b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xe5\x95?\xeaIq\x04\xef\x9a\xd2\xd4\xe5\x84\x1c'\x1f\a5\x19\u0089&)\xf6n\fS\x00\x00\x00\xe0\x94\u5587\x97F\x8e\xf7g\x10\x1bv\x1dC\x1f\xce\x14\xab\xff\u06f4\x8a\x01\xb3\xd9i\xfaA\x1c\xa0\x00\x00\u07d4\xe5\x97\xf0\x83\xa4i\xc4Y\x1c=+\x1d,w'\x87\xbe\xfe'\xb2\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\xe5\x9b;\xd3\x00\x89?\x97#>\xf9G\xc4or\x17\xe3\x92\xf7\xe9\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe5\xa3e4<\xc4\xeb\x1ew\x03h\xe1\xf1\x14Jw\xb82\xd7\xe0\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe5\xa3\xd7\xeb\x13\xb1\\\x10\x01w#m\x1b\xeb0\xd1~\xe1T \x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xaa\v\x83;\xb9\x16\xdc\x19\xa8\xddh?\x0e\xde$\x1d\x98\x8e\xba\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\u5def\x14i\x86\xc0\xff\x8f\x85\xd2.l\xc34\a}\x84\xe8$\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xb8&\x19l\x0e\x1b\xc1\x11\x9b\x02\x1c\xf6\xd2Y\xa6\x10\u0256p\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe5\xb9o\u026c\x03\xd4H\xc1a:\xc9\x1d\x15\x97\x81E\xdb\xdf\u0449\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\u5e40\u048e\xec\xe2\xc0o\xcal\x94s\x06\x8b7\u0526\xd6\xe9\x89%\xaf\u058c\xac+\x90\x00\x00\u07d4\u5eb4\xf0\xaf\u0629\u0463\x81\xb4Wa\xaa\x18\xf3\xd3\xcc\xe1\x05\x89Q\xbf\xd7\xc18x\xd1\x00\x00\u07d4\xe5\xbc\u020c;%on\xd5\xfeU\x0eJ\x18\x19\x8b\x943V\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xbd\xf3OL\xccH>L\xa50\xcc|\xf2\xbb\x18\xfe\xbe\x92\xb3\x89\x06\xd85\xa1\v\xbc\xd2\x00\x00\u07d4\xe5\u0713I\xcbR\xe1a\x19a\"\u03c7\xa3\x896\xe2\xc5\u007f4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xe38\x00\xa1\xb2\xe9k\xde\x101c\n\x95\x9a\xa0\a\xf2nQ\x89Hz\x9a0E9D\x00\x00\u07d4\xe5\xe3~\x19@\x8f,\xfb\xec\x834\x9d\u0501S\xa4\xa7\x95\xa0\x8f\x89\u3bb5sr@\xa0\x00\x00\u07d4\xe5\xed\xc7>bo]4A\xa4U9\xb5\xf7\xa3\x98\u0153\xed\xf6\x89.\xe4IU\b\x98\xe4\x00\x00\u07d4\xe5\xed\xf8\x12?$\x03\xce\x1a\x02\x99\xbe\xcfz\xactM\a_#\x89\n\xdaUGK\x814\x00\x00\u07d4\xe5\xf8\xefm\x97\x066\xb0\u072aO \x0f\xfd\xc9\xe7Z\xf1t\x1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe5\xfb1\xa5\xca\xeej\x96\xde9;\xdb\xf8\x9f\xbee\xfe\x12[\xb3\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe5\xfb\xe3I\x84\xb67\x19o3\x1cg\x9d\f\fG\xd84\x10\xe1\x89llD\xfeG\xec\x05\x00\x00\u07d4\xe6\tU\xdc\v\xc1V\xf6\xc4\x18I\xf6\xbdwk\xa4K\x0e\xf0\xa1\x89\x10C\x16'\xa0\x93;\x00\x00\u07d4\xe6\nU\xf2\u07d9m\u00ee\xdbil\b\xdd\xe09\xb2d\x1d\xe8\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe6\x11[\x13\xf9y_~\x95e\x02\xd5\aEg\u06b9E\xcek\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xe6\x1f(\t\x15\xc7t\xa3\x1d\"<\xf8\f\x06\x92f\xe5\xad\xf1\x9b\x89/\xb4t\t\x8fg\xc0\x00\x00\u07d4\xe6/\x98e\a\x12\xeb\x15\x87S\xd8)r\xb8\u9723\xf6\x18w\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe6/\x9d|d\xe8\xe2cZ\xeb\x88=\xd7;\xa6\x84\xee|\x10y\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xe6>xt\x14\xb9\x04\x84x\xa5\a35\x9e\xcd\xd7\xe3dz\xa6\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xe6FfXr\xe4\v\rz\xa2\xff\x82r\x9c\xaa\xba[\xc3\u8789\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe6N\xf0\x12e\x8dT\xf8\xe8`\x9cN\x90#\xc0\x9f\xe8e\xc8;\x89\x01\x84\x93\xfb\xa6N\xf0\x00\x00\u07d4\xe6On\x1dd\x01\xb5l\akd\xa1\xb0\x86}\v/1\rN\x89\x02\u02edq\xc5:\xe5\x00\x00\u07d4\xe6g\xf6R\xf9W\u008c\x0ef\u04364\x17\xc8\f\x8c\x9d\xb8x\x89 \x9d\x92/RY\xc5\x00\x00\xe0\x94\xe6w\xc3\x1f\xd9\xcbr\x00u\u0724\x9f\x1a\xbc\xcdY\xec3\xf74\x8a\x01\xa6\u05be\xb1\xd4.\xe0\x00\x00\u07d4\xe6|,\x16e\u02038h\x81\x87b\x9fI\xe9\x9b`\xb2\u04fa\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xe6\x9al\xdb:\x8a}\xb8\xe1\xf3\f\x8b\x84\xcds\xba\xe0+\xc0\xf8\x8a\x03\x94\xfd\xc2\xe4R\xf6q\x80\x00\u07d4\xe6\x9d\x1c7\x8bw\x1e\x0f\xef\xf0Q\xdbi\xd9f\xacgy\xf4\xed\x89\x1d\xfaj\xaa\x14\x97\x04\x00\x00\u07d4\xe6\x9f\xcc&\xed\"_{.7\x984\xc5$\xd7\f\x175\u5f09lk\x93[\x8b\xbd@\x00\x00\u07d4\xe6\xa3\x01\x0f\x02\x01\xbc\x94\xffg\xa2\xf6\x99\xdf\xc2\x06\xf9\xe7gB\x89/\xa7\xcb\xf6dd\x98\x00\x00\u07d4\xe6\xa6\xf6\xddop\xa4V\xf4\xec\x15\xefz\xd5\xe5\u06f6\x8b\xd7\u0709\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe6\xb2\x0f\x98\n\xd8S\xad\x04\xcb\xfc\x88|\xe6`\x1ck\xe0\xb2L\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\u6cec?]M\xa5\xa8\x85}\v?0\xfcK+i+w\u05c9O%\x91\xf8\x96\xa6P\x00\x00\u07d4\xe6\xb9T_~\u0406\xe5R\x92F9\xf9\xa9\xed\xbb\xd5T\v>\x89\xcb\xd4{n\xaa\x8c\xc0\x00\x00\xe0\x94\xe6\xbc\xd3\n\x8f\xa18\xc5\xd9\xe5\xf6\xc7\xd2\u0680i\x92\x81-\u034a7\x0e\xa0\xd4|\xf6\x1a\x80\x00\x00\u07d4\xe6\xc8\x1f\xfc\xec\xb4~\xcd\xc5\\\vq\xe4\x85_>^\x97\xfc\x1e\x89\x12\x1e\xa6\x8c\x11NQ\x00\x00\u07d4\xe6\xcb&\vqmL\n\xb7&\xee\xeb\a\xc8pr\x04\xe2v\xae\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe6\xcb?1$\xc9\xc9\xcc84\xb1'K\xc33dV\xa3\x8b\xac\x89\x17+\x1d\xe0\xa2\x13\xff\x00\x00\xe0\x94\xe6\xd2\"\t\xff\u0438u\t\xad\xe3\xa8\xe2\xefB\x98y\u02c9\xb5\x8a\x03\xa7\xaa\x9e\x18\x99\xca0\x00\x00\u07d4\xe6\u051f\x86\xc2(\xf4sg\xa3^\x88l\xaa\xcb'\x1eS\x94)\x89\x16^\xc0\x9d\xa7\xa1\x98\x00\x00\u07d4\xe6\xe6!\xea\xab\x01\xf2\x0e\xf0\x83k|\xadGFL\xb5\xfd<\x96\x89\x11!\x93B\xaf\xa2K\x00\x00\u07d4\xe6\xe8\x861{jf\xa5\xb4\xf8\x1b\xf1d\xc58\xc2d5\x17e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe6\u98ddu\x0f\xe9\x949N\xb6\x82\x86\xe5\xeab\xa6\x99x\x82\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xe6\xec\\\xf0\u011b\x9c1~\x1epc\x15\uf7b7\xc0\xbf\x11\xa7\x8a\x03\xa4i\xf3F~\x8e\xc0\x00\x00\u07d4\xe6\xf5\xebd\x9a\xfb\x99Y\x9cAK'\xa9\xc9\xc8U5\u007f\xa8x\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\xe6\xfe\n\xfb\x9d\xce\xdd7\xb2\xe2,E\x1b\xa6\xfe\xabg4\x803\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xe7\x10\xdc\u041b\x81\x01\xf9C{\xd9}\xb9\ns\xef\x99=\v\xf4\x89\x14\xee6\xc0Z\xc2R\x00\x00\u07d4\xe7'\xe6~\xf9\x11\xb8\x1fl\xf9\xc7?\xcb\xfe\xbc+\x02\xb5\xbf\u0189lk\x93[\x8b\xbd@\x00\x00\u07d4\xe7.\x1d3\\\u009a\x96\xb9\xb1\xc0/\x00:\x16\xd9q\xe9\v\x9d\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xe71\x1c\x953\xf0\t,rH\xc9s\x9b[,\x86J4\xb1\u0389\x97\xf9}l\xc2m\xfe\x00\x00\u07d4\xe7;\xfe\xad\xa6\xf0\xfd\x01o\xbc\x84>\xbc\xf6\xe3p\xa6[\xe7\f\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xe7<\xcfCg%\xc1Q\xe2U\xcc\xf5!\f\xfc\xe5\xa4?\x13\xe3\x89\x01\x15NS!}\xdb\x00\x00\u07d4\xe7B\xb1\xe6\x06\x9a\x8f\xfc'\f\xc6\x1f\xa1d\xac\x15SE\\\x10]\x04\x88~\x14\x89\x06\x96\xd8Y\x00 \xbb\x00\x00\u07d4\xe7\\\x1f\xb1w\b\x9f>X\xb1\x06y5\xa6Yn\xf1s\u007f\xb5\x89\x05j\x87\x9f\xa7uG\x00\x00\u07d4\xe7\\;8\xa5\x8a?3\xd5V\x90\xa5\xa5\x97f\xbe\x18^\x02\x84\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe7a\xd2\u007f\xa3P,\xc7k\xb1\xa6\bt\x0e\x14\x03\u03dd\xfci\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\xe7f\xf3O\xf1o<\xfc\xc9s!r\x1fC\xdd\xf5\xa3\x8b\f\xf4\x89T\x06\x923\xbf\u007fx\x00\x00\u07d4\xe7m\x94Z\xa8\x9d\xf1\xe4W\xaa4+1\x02\x8a^\x910\xb2\u03897\b\xba\xed=h\x90\x00\x00\u07d4\xe7s^\xc7e\x18\xfcj\xa9-\xa8qZ\x9e\xe3\xf6%x\x8f\x13\x89lM\x16\v\xaf\xa1\xb7\x80\x00\xe0\x94\xe7z\x89\xbdE\xdc\x04\xee\xb4\xe4\x1d{Ykp~nQ\xe7L\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xe7}}\uac96\u0234\xfa\a\xca;\xe1\x84\x16=Zm`l\x89\x05\x049\x04\xb6q\x19\x00\x00\u07d4\xe7\u007f\xeb\xab\xdf\b\x0f\x0f]\xca\x1d?Wf\xf2\xa7\x9c\x0f\xfa|\x89K\"\x9d(\xa8Ch\x00\x00\xe0\x94\u7025c\x06\xba\x1ek\xb31\x95,\"S\x9b\x85\x8a\xf9\xf7}\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\xe7\x81\xecs-@\x12\x02\xbb\x9b\xd18`\x91\r\xd6\u009a\xc0\xb6\x89C8t\xf62\xcc`\x00\x00\u07d4\xe7\x84\xdc\xc8s\xaa\x8c\x15\x13\xec&\xff6\xbc\x92\xea\xc6\xd4\xc9h\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe7\x91-L\xf4V,W=\xdc[q\xe3s\x10\xe3x\xef\x86\u0249\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xe7\x91\u0545\xb8\x996\xb2])\x8f\x9d5\xf9\xf9\xed\xc2Z)2\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe7\x924\x9c\xe9\xf6\xf1O\x81\xd0g@\x96\xbe\xfa\x1f\x92!\xcd\xea\x89[]#J\r\xb48\x80\x00\u07d4\xe7\x96\xfdN\x83\x9bL\x95\xd7Q\x0f\xb7\xc5\xc7+\x83\xc6\xc3\xe3\u01c9\x1b\xc43\xf2?\x83\x14\x00\x00\xe0\x94\xe7\xa4/Y\xfe\xe0t\xe4\xfb\x13\xea\x9eW\xec\xf1\xccH(\"I\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xe7\xa4V\f\x84\xb2\x0e\x0f\xb5LIg\f)\x03\xb0\xa9lB\xa4\x89 j\xea\u01e9\x03\x98\x00\x00\u07d4\xe7\xa8\xe4q\xea\xfby\x8fET\xccnRg0\xfdV\xe6,}\x8965\u026d\xc5\u07a0\x00\x00\u07d4\u7f82\xc6Y<\x1e\xed\xdd*\xe0\xb1P\x01\xff \x1a\xb5{/\x89\x01\t\x10\xd4\xcd\xc9\xf6\x00\x00\u07d4\xe7\u01b5\xfc\x05\xfct\x8e[C\x81rdI\xa1\xc0\xad\x0f\xb0\xf1\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe7\xd1u$\xd0\v\xad\x82I|\x0f'\x15jd\u007f\xf5\x1d'\x92\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xe7\xd2\x13\x94\u007f\u02d0J\xd78H\v\x1e\xed/\\2\x9f'\xe8\x89\x01\x03\u00f1\xd3\xe9\xc3\x00\x00\u07d4\xe7\xd6$\x06 \xf4,^\u06f2\xed\xe6\xae\xc4=\xa4\xed\x9bWW\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe7\xda`\x9d@\xcd\xe8\x0f\x00\xce[O\xfbj\xa9\u04304\x94\xfc\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe7\xf0oi\x9b\xe3\x1cD\vC\xb4\xdb\x05\x01\xec\x0e%&\x16D\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe7\xf4\xd7\xfeoV\x1f\u007f\xa1\xda0\x05\xfd6TQ\xad\x89\u07c9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe7\xfd\x8f\xd9Y\xae\xd2v~\xa7\xfa\x96\f\xe1\xdbS\xaf\x80%s\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe8\x0e\u007f\xef\x18\xa5\xdb\x15\xb0\x14s\xf3\xadkx\xb2\xa2\xf8\xac\u0649\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xe8\x13\u007f\xc1\xb2\xec|\xc7\x10:\xf9!\x89\x9bJ9\xe1\xd9Y\xa1\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\xe8\x1c-4l\n\xdfL\xc5g\b\xf69K\xa6\xc8\u0226J\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe8,X\xc5yC\x1bg5F\xb5:\x86E\x9a\xca\xf1\u079b\x93\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xe84\xc6C\x18 \\\xa7\xddJ!\xab\xcb\b&l\xb2\x1f\xf0,\x8965\xc6 G9\u0640\x00\u07d4\xe86\x04\xe4\xffk\xe7\xf9o`\x18\xd3\xec0r\xecR]\xffk\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\xe0\x94\xe8E\xe3\x87\xc4\xcb\u07d8\"\x80\xf6\xaa\x01\xc4\x0eK\xe9X\u0772\x8a\x05K@\xb1\xf8R\xbd\xa0\x00\x00\u07d4\xe8H\xca~\xbf\xf5\xc2O\x9b\x9c1g\x97\xa4;\xf7\xc3V)-\x89\x06.\x11\\\x00\x8a\x88\x00\x00\u07d4\xe8KU\xb5%\xf1\x03\x9etK\x91\x8c\xb33$\x92\xe4^\xcaz\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe8O\x80v\xa0\xf2\x96\x9e\xcd3>\xef\x8d\xe4\x10B\x98b\x91\xf2\x89\x17k4O*x\xc0\x00\x00\u07d4\xe8d\xfe\xc0~\xd1!Je1\x1e\x11\xe3)\xde\x04\r\x04\xf0\xfd\x89Y\u0283\xf5\xc4\x04\x96\x80\x00\u07d4\xe8}\xba\xc66\xa3w!\xdfT\xb0\x8a2\xefIY\xb5\xe4\xff\x82\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xe8~\x9b\xbf\xbb\xb7\x1c\x1at\ft\xc7#Bm\xf5]\x06=\u064a\x01\xb1\x92\x8c\x00\u01e68\x00\x00\u07d4\xe8~\xacm`+A\t\xc9g\x1b\xf5{\x95\f,\xfd\xb9\x9dU\x89\x02\xb4\xf2\x19r\xec\xce\x00\x00\xe0\x94\u807b\xbeir-\x81\xef\xec\xaaH\u0455*\x10\xa2\xbf\xac\x8f\x8a\x03c\\\x9a\xdc]\xea\x00\x00\x00\u07d4\xe8\x92Is\x8b~\xce\xd7\xcbfjf\xe4s\xbcv\x82/U\t\x8d\x89\xb9\x1c\u0149lk\x93[\x8b\xbd@\x00\x00\u07d4\xe8\xc3\u04f0\xe1\u007f\x97\xd1\xe7V\xe6\x84\xf9N\x14p\xf9\x9c\x95\xa1\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xe8\xc3\xf0E\xbb}8\xc9\xd2\U000d5c3a\x84\x92\xb2S#\t\x01\x8a\x01\xe7\xe4\x17\x1b\xf4\u04e0\x00\x00\u07d4\xe8\xccC\xbcO\x8a\xcf9\xbf\xf0N\xbf\xbfB\xaa\xc0j2\x84p\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xe8\xd9B\xd8/\x17^\xcb\x1c\x16\xa4\x05\xb1\x01C\xb3\xf4k\x96:\x89\x1e\xd2\xe8\xffm\x97\x1c\x00\x00\u07d4\xe8\u077e\xd72\xeb\xfeu@\x96\xfd\xe9\bk\x8e\xa4\xa4\xcd\xc6\x16\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe8\xder^\xca]\xef\x80_\xf7\x94\x1d1\xac\x1c.4-\xfe\x95\x89\x85~\ro\x1d\xa7j\x00\x00\u07d4\xe8\xe9\x85\x05\x86\xe9OR\x99\xabIK\xb8!\xa5\xf4\f\x00\xbd\x04\x89\xcf\x15&@\xc5\xc80\x00\x00\xe0\x94\xe8\xea\u047b\x90\xcc\u00ee\xa2\xb0\xdc\u0175\x80VUFU\xd1\u054a\x01\xa4\xab\xa2%\xc2\a@\x00\x00\u07d4\xe8\xea\xf1)D\t-\xc3Y\x9b9S\xfa|\xb1\xc9v\x1c\xc2F\x89a\x94\x04\x9f0\xf7 \x00\x00\xe0\x94\xe8\xedQ\xbb\xb3\xac\xe6\x9e\x06\x02K3\xf8hD\xc4sH\u06de\x8a\"\xf9\xea\x89\xf4\xa7\xd6\xc4\x00\x00\u07d4\xe8\xef\x10\r|\xe0\x89X2\xf2g\x8d\xf7-J\u03cc(\xb8\xe3\x89\x1b\x1bk\u05efd\xc7\x00\x00\u07d4\xe8\xf2\x99i\xe7\\e\xe0\x1c\xe3\xd8aT }\n\x9e|v\xf2\x89\xa2/\xa9\xa7:'\x19\x80\x00\u07d4\xe8\xfc6\xb0\x13\x1e\xc1 \xac\x9e\x85\xaf\xc1\f\xe7\vV\u0636\xba\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe9\n5L\xec\x04\u059e]\x96\xdd\xc0\xc5\x13\x8d=3\x15\n\xa0\x89\x1b\x1a}\u03caD\u04c0\x00\xe0\x94\xe9\x13>}1\x84]_+f\xa2a\x87\x92\xe8i1\x1a\xcff\x8a\x05\x17\xc0\xcb\xf9\xa3\x90\x88\x00\x00\u07d4\xe9\x1d\xac\x01\x95\xb1\x9e7\xb5\x9bS\xf7\xc0\x17\xc0\xb29[\xa4L\x89e\xea=\xb7UF`\x00\x00\u07d4\xe9\x1f\xa0\xba\xda\u0779\xa9~\x88\xd3\xf4\xdb|U\u05bbt0\xfe\x89\x14b\fW\xdd\xda\xe0\x00\x00\u07d4\xe9#\xc0aw\xb3B~\xa4H\xc0\xa6\xff\x01\x9bT\xccT\x8d\x95\x89\x01\xf7\x80\x01Fg\xf2\x80\x00\xe0\x94\xe9=G\xa8\u0288]T\fNRo%\xd5\xc6\xf2\xc1\b\u0138\x8a\x17\xda:\x04\u01f3\xe0\x00\x00\x00\u07d4\xe9E\x8fh\xbb',\xb5g:\x04\xf7\x81\xb4\x03Uo\u04e3\x87\x89\x03N\x8b\x88\xce\xe2\xd4\x00\x00\u07d4\xe9IA\xb6\x03`\x19\xb4\x01j0\xc1\x03}Zi\x03\xba\xba\xad\x89*H\xac\xabb\x04\xb0\x00\x00\u07d4\xe9I[\xa5\x84'(\xc0\ud5fe7\xd0\xe4\"\xb9\x8di ,\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xe9M\xed\x99\u0735r\xb9\xbb\x1d\u02e3/m\xee\x91\xe0W\x98N\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\xe0\x94\xe9QyR}\uc951l\xa9\xa3\x8f!\\\x1e\x9c\xe77\xb4\u024a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xe9U\x91\x85\xf1f\xfc\x95\x13\xccq\x11aD\xce-\xeb\x0f\x1dK\x8a\x04<3\xc1\x93ud\x80\x00\x00\u0794\xe9^\x92\xbb\xc6\xde\a\xbf:f\x0e\xbf_\xeb\x1c\x8a5'\xe1\u0148\xfc\x93c\x92\x80\x1c\x00\x00\xe0\x94\xe9e\u06a3@9\xf7\xf0\xdfb7Z7\u5acar\xb3\x01\xe7\x8a\x01\x03\xfd\xde\u0373\xf5p\x00\x00\u07d4\xe9i\xea\x15\x95\xed\xc5\u0127\a\xcf\xde8\t)c2Q\xa2\xb0\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xe9k\x18N\x1f\x0fT\x92J\xc8t\xf6\v\xbfDptF\xb7+\x89\x9d\xcc\x05\x15\xb5n\f\x00\x00\xe0\x94\xe9m}L\xdd\x15U:NM1mmd\x80\xca<\xea\x1e8\x8a\x02\x95]\x02\xe1\xa15\xa0\x00\x00\u07d4\xe9n-8\x13\xef\xd1\x16_\x12\xf6\x02\xf9\u007fJb\x90\x9d\x1b;\xc0\xe9\xaa\"\u007f\x90\x89'\xcaK\xd7\x19\xf0\xb8\x00\x00\u07d4\xea,\x19}&\xe9\x8b\r\xa8>\x1br\u01c7a\x8c\x97\x9d=\xb0\x89\x01\x11du\x9f\xfb2\x00\x00\xe0\x94\xea7y\xd1J\x13\xf6\u01c5f\xbc\xde@5\x91A:b9\u06ca)\xb7d2\xb9DQ \x00\x00\u07d4\xeaN\x80\x9e&j\xe5\xf1<\xdb\u33dd\x04V\xe68m\x12t\x89\xf3\xf2\v\x8d\xfai\xd0\x00\x00\xe0\x94\xeaS\xc9T\xf4\xed\x97\xfdH\x10\x11\x1b\u06b6\x9e\xf9\x81\xef%\xb9\x8a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4\xeaS\xd2ed\x85\x9d\x9e\x90\xbb\x0eS\xb7\xab\xf5`\xe0\x16,8\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xea`Ci\x12\xdek\xf1\x87\u04e4r\xff\x8fS3\xa0\xf7\xed\x06\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xea`T\x9e\xc7U?Q\x1d!I\xf2\xd4fl\xbd\x92C\xd9<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xeaf\xe7\xb8M\u037f6\xee\xa3\xe7[\x858*u\xf1\xa1]\x96\x89]\xbc\x91\x91&o\x11\x80\x00\u07d4\xeahlPW\t<\x17\x1cf\u06d9\xe0\x1b\x0e\xce\xcb0\x86\x83\x89\x14\u0768],\xe1G\x80\x00\u07d4\xeaj\xfe,\xc9(\xac\x83\x91\xeb\x1e\x16_\xc4\x00@\xe3t!\u7262\u007f\xa0c\xb2\xe2\xe6\x80\x00\u07d4\xeay\x05}\xab\xef^d\xe7\xb4O\u007f\x18d\x8e~S7\x18\u0489\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xea|Mm\xc7)\xcdk\x15|\x03\xad#|\xa1\x9a \x93F\u00c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xea\x81h\xfb\xf2%\xe7\x86E\x9c\xa6\xbb\x18\xd9c\xd2kPS\t\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xea\x81\u02868T\f\xd9\xd4\xd7=\x06\x0f,\xeb\xf2$\x1f\xfc>\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xea\x83\x17\x19yYB@A\xd9\xd7\xc6z>\xce\x1d\xbbx\xbbU\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xea\x85'\xfe\xbf\xa1\xad\xe2\x9e&A\x93)\u04d3\xb9@\xbb\xb7\u0709lj\xccg\u05f1\xd4\x00\x00\u07d4\xea\x8f0\xb6\xe4\xc5\xe6R\x90\xfb\x98d%\x9b\u0159\x0f\xa8\ue289\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xea\x94\xf3(\b\xa2\uf29b\xf0\x86\x1d\x1d$\x04\xf7\xb7\xbe%\x8a\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xea\xa4\\\xea\x02\xd8},\xc8\xfd\xa9CN-\x98[\xd4\x03\x15\x84\x89h\x1f\xc2\xccn+\x8b\x00\x00\xe0\x94\uac3d\x14\x83\t\x18l\xf8\xcb\xd1;r2\xd8\tZ\u02c3:\x8a\x02C\x9a\x88\x1cjq|\x00\x00\u07d4\uaed0\xd3y\x89\xaa\xb3\x1f\xea\xe5G\xe0\xe6\xf3\x99\x9c\xe6\xa3]\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xea\xc0\x82~\xff\fn?\xf2\x8a}JT\xf6\\\xb7h\x9d{\x99\x89\x9a\xd9\u67ddGR\x00\x00\u07d4\xea\xc1H(&\xac\xb6\x11\x1e\x19\xd3@\xa4_\xb8QWk\xed`\x89\x01\xbe\x8b\xab\x04\u067e\x80\x00\xe0\x94\xea\xc1{\x81\xedQ\x91\xfb\b\x02\xaaT3s\x13\x83A\a\xaa\xa4\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xea\u00efW\x84\x92\u007f\u9958\xfcN\xec8\xb8\x10/7\xbcX\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xea\u01b9\x88BT.\xa1\v\xb7O&\xd7\xc7H\x8fi\x8bdR\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xea\xc7h\xbf\x14\xb8\xf9C.i\xea\xa8*\x99\xfb\xeb\x94\xcd\f\x9c\x8a\x14\u06f2\x19\\\xa2(\x90\x00\x00\u07d4\xea\xd2\x1c\x1d\xec\u03ff\x1c\\\xd9f\x88\xa2Gki\xba\a\xceJ\x89\x03\xf2M\x8eJ\x00p\x00\x00\u07d4\xea\xd4\xd2\xee\xfbv\xab\xaeU3\x96\x1e\xdd\x11@\x04\x06\xb2\x98\xfc\x89\xd2U\xd1\x12\xe1\x03\xa0\x00\x00\u07d4\xea\xd6Rb\xed]\x12-\xf2\xb2u\x14\x10\xf9\x8c2\xd1#\x8fQ\x89\x05\x83\x17\xedF\xb9\xb8\x00\x00\u07d4\xea\xd7P\x16\u3801Pr\xb6\xb1\b\xbc\xc1\xb7\x99\xac\xf08>\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xea\xea#\xaa\x05r\x00\xe7\xc9\xc1^\x8f\xf1\x90\xd0\xe6l\f\x0e\x83\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xea\xed\x16\xea\xf5\u06ab[\xf0)^^\a\u007fY\xfb\x82U\x90\v\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xea\xed\xcck\x8bib\xd5\xd9(\x8c\x15lW\x9dG\xc0\xa9\xfc\xff\x89\x04\x9b\x9c\xa9\xa6\x944\x00\x00\u07d4\xea\xf5#\x88Tn\xc3Z\xcaolc\x93\xd8\xd6\t\xde:K\xf3\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xeb\x10E\x8d\xac\xa7\x9eJk$\xb2\x9a\x8a\x8a\xdaq\x1b\u007f.\xb6\x89\u063beI\xb0+\xb8\x00\x00\u07d4\xeb\x1c\xea{E\u047dM\x0e*\x00{\u04ff\xb3Tu\x9e,\x16\x89\n\xbb\xcdN\xf3wX\x00\x00\u07d4\xeb%H\x1f\u035c\"\x1f\x1a\xc7\xe5\xfd\x1e\u0353\a\xa1b\x15\xb8\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\xe0\x94\xeb.\xf3\u04cf\xe6R@<\xd4\xc9\xd8^\xd7\xf0h,\xd7\xc2\u078a\t\x0fSF\b\xa7(\x80\x00\x00\xe0\x94\xeb;\xddY\xdc\u0765\xa9\xbb*\xc1d\x1f\xd0!\x80\xf5\xf3e`\x8a\x01e\xc9fG\xb3\x8a \x00\x00\u07d4\xeb<\xe7\xfc8\x1cQ\xdb}_\xbdi/\x8f\x9e\x05\x8aLp=\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xebE?Z:\xdd\u074a\xb5gP\xfa\xdb\x0f\xe7\xf9M\x9c\x89\xe7\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xebO\x00\xe2\x836\xea\t\x94%\x88\ueb12\x18\x11\xc5\"\x14<\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xebR\xab\x10U4\x922\x9c\x1cT\x83:\xe6\x10\xf3\x98\xa6[\x9d\x89\b=lz\xabc`\x00\x00\u07d4\xebW\r\xba\x97R'\xb1\xc4-n\x8d\xea,V\u026d\x96\x06p\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xebc\x94\xa7\xbf\xa4\u0489\x11\u0565\xb2>\x93\xf3^4\f\"\x94\x89\x04:w\xaa\xbd\x00x\x00\x00\u07d4\xebh\x10i\x1d\x1a\xe0\u045eG\xbd\"\u03be\u0cfa'\xf8\x8a\x89\x87\x85c\x15\xd8x\x15\x00\x00\u07d4\xebvBL\x0f\u0557\xd3\xe3A\xa9d*\xd1\xee\x11\x8b+W\x9d\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xeb| +F+|\u0145]t\x84u_n&\xefC\xa1\x15\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xeb\x83\\\x1a\x91\x18\x17\x87\x8a3\xd1gV\x9e\xa3\xcd\u04c7\xf3(\x8965\u026d\xc5\u07a0\x00\x00\u07d4\ub268\x82g\t\t\xcf7~\x9ex(n\xe9{\xa7\x8dF\u0089+|\xc2\xe9\xc3\"\\\x00\x00\xe0\x94\xeb\x90\u01d3\xb3S\x97a\xe1\xc8\x14\xa2\x96q\x14\x86\x92\x19>\xb4\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xeb\x9c\xc9\xfe\bi\xd2\u06b5,\u01ea\xe8\xfdW\xad\xb3_\x9f\xeb\x89j\x93\xbb\x17\xaf\x81\xf8\x00\x00\xe0\x94\ub8c8\xb0\xda'\xc8{\x1c\xc0\xea\xc6\xc5{,Z\vE\x9c\x1a\x8a\x01p\xa0\xf5\x04\x0eP@\x00\x00\u07d4\xeb\xaa!m\xe9\xccZC\x03\x17\a\xd3o\xe6\u057e\xdc\x05\xbd\xf0\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4\xeb\xac+D\b\xefT1\xa1;\x85\b\xe8bP\x98!\x14\xe1E\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xeb\xb6,\xf8\xe2,\x88K\x1b(\xc6\xfa\x88\xfb\xbc\x17\x93\x8a\xa7\x87\x89+By\x84\x03\u0278\x00\x00\u07d4\xeb\xb7\xd2\xe1\x1b\u01b5\x8f\n\x8dE\xc2\xf6\xde0\x10W\n\u0211\x89\x01s\x17\x90SM\xf2\x00\x00\u07d4\xeb\xbbO,=\xa8\xbe>\xb6-\x1f\xfb\x1f\x95\x02a\u03d8\xec\u0689lk\x93[\x8b\xbd@\x00\x00\u07d4\xeb\xbdM\xb9\x01\x99R\u058b\x1b\x0fm\x8c\xf0h<\x008{\xb5\x89\x12\x04\x01V=}\x91\x00\x00\u07d4\xeb\xbe\xeb%\x91\x84\xa6\xe0\x1c\xcc\xfc\"\a\xbb\u0603xZ\xc9\n\x89!\x9b\xc1\xb0G\x83\xd3\x00\x00\u07d4\xeb\xd3V\x15j81#4=H\x84;\xff\xeda\x03\xe8f\xb3\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xeb\xd3{%ec\xe3\fo\x92\x89\xa8\xe2p/\bR\x88\b3\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xeb\xe4l\xc3\xc3L2\xf5\xad\xd6\xc3\x19[\xb4\x86\xc4q>\xb9\x18\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xeb\xff\x84\xbb\xefB0q\xe6\x04\xc3a\xbb\xa6w\xf5Y=\xefN\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xec\t'\xba\xc7\xdc6f\x9c(5J\xb1\xbe\x83\xd7\xee\xc3\t4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xec\x0e\x18\xa0\x1d\xc4\xdc]\xaa\xe5g\xc3\xfaL\u007f\x8f\x9bY\x02\x05\x89\x11\x1f\xfe@JA\xe6\x00\x00\xe0\x94\xec\x116,\xec\x81\t\x85\xd0\xeb\xbd{sE\x14D\x98[6\x9f\x8a\x06ZNIWpW1\x80\x00\u07d4\xec,\xb8\xb97\x8d\xff1\xae\xc3\xc2.\x0em\xad\xff1J\xb5\u0749lk\x93[\x8b\xbd@\x00\x00\u07d4\xec0\xad\u0749[\x82\xee1\x9eT\xfb\x04\xcb+\xb09q\xf3k\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xec;\x8bX\xa1'\x03\xe5\x81\xce_\xfd~!\xc5}\x1e\\f?\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xecHg\xd2\x17Z\xb5\xb9F\x93aYUFUF\x84\u0364`\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xecM\b\xaa.GIm\u0287\"]\xe3?+@\xa8\xa5\xb3o\x89\b\x90\xb0\xc2\xe1O\xb8\x00\x00\u07d4\xecX\xbc\r\f \xd8\xf4\x94efAS\xc5\xc1\x96\xfeY\u6f89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xec[\x19\x8a\x00\u03f5Z\x97\xb5\xd56D\xcf\xfa\x8a\x04\u04abE\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xec]\xf2'\xbf\xa8]z\xd7kBn\x1c\xee\x96;\xc7\xf5\x19\u074965\u026d\xc5\u07a0\x00\x00\xe0\x94\xec_\xea\xfe!\f\x12\xbf\u0265\xd0Y%\xa1#\xf1\xe7?\xbe\xf8\x8a`\x8f\xcf=\x88t\x8d\x00\x00\x00\u07d4\xeci\x04\xba\xe1\xf6\x97\x90Y\x17\t\xb0`\x97\x83s?%s\xe3\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\xe0\x94\xecs\x11L^@o\u06fe\t\xb4\xfab\x1b\xd7\x0e\xd5N\xa1\xef\x8a\x050%\xcd!o\xceP\x00\x00\u07d4\xecs\x83=\xe4\xb8\x10\xbb\x02x\x10\xfc\x8fi\xf5D\xe8<\x12\u044965\u026d\xc5\u07a0\x00\x00\u07d4\xecu\xb4\xa4u\x13\x12\v\xa5\xf8`9\x81O\x19\x98\xe3\x81z\u00c9\t\xb0\xbc\xe2\xe8\xfd\xba\x00\x00\u07d4\xecv\xf1.W\xa6U\x04\x03?,\v\xceo\xc0;\xd7\xfa\n\u0109\xc2\x12z\xf8X\xdap\x00\x00\u0794\xec\x80\x14\xef\xc7\xcb\xe5\xb0\xceP\xf3V,\xf4\xe6\u007f\x85\x93\xcd2\x88\xf0\x15\xf2W6B\x00\x00\u07d4\xec\x82\xf5\r\x06G_hM\xf1\xb3\x92\xe0\r\xa3A\xaa\x14TD\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xec\x83\xe7\x98\u00d6\xb7\xa5^*\"$\xab\u0343K'\xeaE\x9c\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xec\x89\xf2\xb6x\xa1\xa1[\x914\xec^\xb7\fjb\a\x1f\xba\xf9\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xec\x8c\x1d{j\xac\xcdB\x9d\xb3\xa9\x1e\xe4\xc9\xeb\x1c\xa4\xf6\xf7<\x89\xe6d\x99\"\x88\xf2(\x00\x00\xe0\x94\xec\x98Q\xbd\x91rpa\x02g\xd6\x05\x18\xb5M<\xa2\xb3[\x17\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xec\x99\xe9]\xec\xe4o\xff\xfb\x17^\xb6@\x0f\xbe\xbb\b\ue6d5\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xec\xa5\xf5\x87\x92\xb8\xc6-*\xf5Vq~\xe3\xee0(\xbeM\u0389lk\x93[\x8b\xbd@\x00\x00\u07d4\xec\xabZ\xba[\x82\x8d\xe1pS\x81\xf3\x8b\xc7D\xb3+\xa1\xb47\x892\xf5\x1e\u06ea\xa30\x00\x00\u07d4\xec\xaf3P\xb7\xce\x14M\x06\x8b\x18`\x10\x85,\x84\xdd\f\xe0\xf0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xec\xb9LV\x8b\xfeY\xad\xe6Pd_O&0lsl\xac\xe4\x89\x0e~\xeb\xa3A\vt\x00\x00\xe0\x94\xec\xbeB^g\r9\tN \xfbVC\xa9\xd8\x18\xee\xd26\u078a\x01\x0f\f\xf0d\xddY \x00\x00\xe0\x94\xec\xbe^\x1c\x9a\u04b1\xdc\xcf\n0_\xc9R/Fi\xdd:\xe7\x8a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xec\xcfz\x04W\xb5f\xb3F\xcag:\x18\x0fDA0!j\u00c9\x05k\xc7^-c\x10\x00\x00\u07d4\xec\u0466(\x025\x1aAV\x8d#\x030\x04\xac\xc6\xc0\x05\xa5\u04c9\x02\xb5\xe3\xaf\x16\xb1\x88\x00\x00\u07d4\xec\xd2v\xafd\u01dd\x1b\u0669+\x86\xb5\u835a\x95\xeb\x88\xf8\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xec\u0506\xfc\x19g\x91\xb9,\xf6\x12\xd3HaO\x91VH\x8b~\x8a\x02\x8a\x85t%Fo\x80\x00\x00\u07d4\xec\xda\xf92)\xb4^\xe6r\xf6]\xb5\x06\xfb^\xca\x00\xf7\xfc\xe6\x89W\x01\xf9m\xcc@\xee\x80\x00\u07d4\xec\xe1\x11g\vV<\u037e\xbc\xa5#\x84)\x0e\xcdh\xfe\\\x92\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xec\xe1\x15&\x82\xb7Y\x8f\xe2\xd1\xe2\x1e\xc1U3\x88T5\xac\x85\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xec\xe1)\bw\xb5\x83\xe3a\xa2\xd4\x1b\x00\x93F\xe6'N%8\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xec\xf0]\a\xea\x02n~\xbfIA\x00#5\xba\xf2\xfe\xd0\xf0\x02\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xec\xf2L\xdd|\"\x92\x8cD\x1eiM\xe4\xaa1\xb0\xfa\xb5\x97x\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xec\xfd\x00M\x02\xf3l\xd4\u0634\xa8\xc1\xa9S;j\xf8\\\xd7\x16\x8a\x01\x0fA\xac\xb4\xbb;\x9c\x00\x00\xe0\x94\xed\x02\x06\xcb#1Q(\xf8\xca\xff&\xf6\xa3\v\x98Tg\xd0\"\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xed\x10e\xdb\u03dds\xc0O\xfcy\b\x87\r\x88\x14h\xc1\xe12\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xed\x12vQ;o\u0186(\xa7A\x85\xc2\xe2\f\xbb\xcax\x17\xbf\x89\nZ\xa8P\t\xe3\x9c\x00\x00\xe0\x94\xed\x12\xa1\xba\x1f\xb8\xad\xfc\xb2\r\xfa\x19X.RZ\xa3\xb7E$\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\xed\x16\xce9\xfe\xef;\xd7\xf5\xd1b\x04^\x0fg\xc0\xf0\x00F\xbb\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xed\x1a\\C\xc5t\xd4\xe94)\x9b$\xf1G,\u071f\xd6\xf0\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xed\x1b$\xb6\x91-Q\xb34\xac\r\xe6\xe7q\xc7\xc0EF\x95\xea\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xed\x1f\x1e\x11Z\r`\xce\x02\xfb%\xdf\x01M(\x9e:\f\xbe}\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xed10\\1\x9f\x92s\u04d3m\x8f[/q\u9c72)c\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xed2z\x14\xd5\u03ed\u0641\x03\xfc\t\x99q\x8d~\xd7\x05(\xea\x89N\x10\x03\xb2\x8d\x92\x80\x00\x00\u07d4\xed<\xbc7\x82\u03bdg\x98\x9b0\\A3\xb2\xcd\xe3\"\x11\xeb\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xed@\x14S\x8c\xeefJ/\xbc\xb6\xdcf\x9fz\xb1m\v\xa5|\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xedA\u188f\\\xaa\x848\x80\xefN\x8b\b\xbdl3\x14\x1e\u07c9*\xd5\xdd\xfaz\x8d\x83\x00\x00\xe0\x94\xedK\xe0J\x05-z\u0333\xdc\u03901\x9d\xba@ \xab,h\x8a\a\xf3zp\xea\xf3b\x17\x80\x00\xe0\x94\xedR\xa2\xcc\bi\u071e\x9f\x84+\u0415|G\xa8\xe9\xb0\xc9\xff\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xed[LA\xe7b\xd9B@Cs\xca\xf2\x1e\xd4a]%\xe6\xc1\x89m-O=\x95%\xb4\x00\x00\u07d4\xed`\u012bnT\x02\x061~5\x94zc\xa9\xcak\x03\xe2\u02c9\x03\x1a\u066d\vF\u007f\x80\x00\u07d4\xedd\x1e\x066\x8f\xb0\xef\xaa\x17\x03\xe0\x1f\xe4\x8fJhS\t\xeb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xedfC\xc0\xe8\x88K-2\x11\x857\x85\xa0\x8b\xf8\xf3>\u049f\x89Hz\x9a0E9D\x00\x00\xe0\x94\xedp\xa3|\xdd\x1c\xbd\xa9tm\x93\x96X\xae*a\x81(\x85x\x8a\x02\bj\xc3Q\x05&\x00\x00\x00\u07d4\xedsFvn\x1agm\r\x06\xec\x82\x18g\xa2v\xa0\x83\xbf1\x89\u064a\t1\xcc-I\x00\x00\u07d4\xed\x86&\x16\xfc\xbf\xb3\xbe\xcbt\x06\xf7<\\\xbf\xf0\f\x94\aU\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xed\x9e\x03\f\xa7\\\xb1\u049e\xa0\x1d\rL\xdf\xdc\xcd8D\xb6\xe4\x89\x01\xac\xc1\x16\u03ef\xb1\x80\x00\xe0\x94\ud7bc\u02e4/\x98\x15\xe7\x823&m\xd6\xe85\xb6\xaf\xc3\x1b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\ud7f1\xf5\xaf/\xbf\u007f\xfcP)\xce\xe4+p\xff\\'[\xf5\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\xed\xa4\xb2\xfaY\u0584\xb2z\x81\r\xf8\x97\x8as\xdf0\x8ac\u0089\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xed\xb4s59y\xa2\x06\x87\x9d\xe1D\xc1\n:\xcf\x12\xa7'OV9a\xf57R\x9d\x89\xc7\u0789lk\x93[\x8b\xbd@\x00\x00\u07d4\xeer\x88\xd9\x10\x86\xd9\xe2\xeb\x91\x00\x14\u066b\x90\xa0-x\u00a0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xee|=\xed|(\xf4Y\xc9/\xe1;M\x95\xba\xfb\xab\x026}\x89%\xf2s\x93=\xb5p\x00\x00\xe0\x94\xee\x86} \x91k\xd2\xe9\xc9\xec\xe0\x8a\xa0C\x85\xdbf|\x91.\x8a\n\x96\x81c\xf0\xa5{@\x00\x00\u07d4\ue25b\x02\xcb\xcb99\xcda\xde\x13B\xd5\x04\x82\xab\xb6\x852\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xee\x90m}_\x17H%\x81t\xbeL\xbc8\x93\x03\x02\xab{B\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\ue5ea\x8a\u019e\xdfz\x98}mp\x97\x9f\x8e\xc1\xfb\xcaz\x94\x89\x14b\fW\xdd\xda\xe0\x00\x00\u07d4\xee\xa1\xe9y\x88\xdeu\xd8!\xcd(\xadh\"\xb2,\u0398\x8b1\x89\x1c0s\x1c\xec\x03 \x00\x00\xe0\x94\xee\u048c?\x06\x8e\tJ0K\x85<\x95\nh\t\xeb\xcb\x03\xe0\x8a\x03\xa9\u057a\xa4\xab\xf1\xd0\x00\x00\u07d4\xee\u04c4\xef-A\xd9\xd2\x03\x97NW\xc1#(\xeav\x0e\b\xea\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xee\xdflB\x80\xe6\xeb\x05\xb94\xac\xe4(\xe1\x1dB1\xb5\x90[\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xee\xe7a\x84~3\xfda\u0653\x87\xee\x14b\x86\x94\u047f\xd5%\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xee\xe9\xd0Rn\xda\x01\xe41\x16\xa3\x952-\u0689pW\x8f9\x8a\x02\x1e\x19\x99\xbb\xd5\u04be\x00\x00\u07d4\xee\xf1\xbb\xb1\xe5\xa8?\u0782H\xf8\x8e\xe3\x01\x8a\xfa-\x132\xeb\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xee\xfb\xa1-\xfc\x99gB\xdby\x04d\xca}';\xe6\xe8\x1b>\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xee\xfd\x05\xb0\xe3\xc4\x17\xd5[3C\x06\x04\x86\xcd\xd5\xe9*\xa7\xa6\x89M\x85<\x8f\x89\b\x98\x00\x00\u07d4\xef\r\xc7\xddzS\xd6\x12r\x8b\xcb\u04b2|\x19\xddM}fo\x89&A\x1c[5\xf0Z\x00\x00\u07d4\xef\x11RR\xb1\xb8E\u0345\u007f\x00-c\x0f\x1bo\xa3zNP\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xef\x1c\x04w\xf1\x18M`\xac\u02b3t\xd3tUz\n>\x10\xf3\x89\b=lz\xabc`\x00\x00\u07d4\xef,4\xbbH}7b\xc3\u0327\x82\xcc\xddz\x8f\xbb\n\x991\x89\t\xc2\x00vQ\xb2P\x00\x00\u07d4\xef5\xf6\u0531\a^j\xa19\x15\x1c\x97K/FX\xf7\x058\x89<;\xc3?\x94\xe5\r\x80\x00\u07d4\xef9\u0291s\xdf\x15S\x1ds\xe6\xb7*hKQ\xba\x0f+\xb4\x89V\xa0\xb4un\xe28\x00\x00\u07d4\xefF<&y\xfb'\x91d\xe2\f=&\x915\x87s\xa0\xad\x95\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xefG\xcf\a>6\xf2q\xd5\"\xd7\xfaNq \xadP\a\xa0\xbc\x89\x87\x86x2n\xac\x90\x00\x00\u07d4\xefa\x15[\xa0\t\xdc\u07be\xf1\v(\xd9\xda=\x1b\xc6\xc9\xce\u0509\x034-`\xdf\xf1\x96\x00\x00\u0794\xefix\x1f2\xff\xce34o,\x9a\xe3\xf0\x84\x93\xf3\xe8/\x89\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xefv\xa4\u034f\xeb\xcb\u0278\x18\xf1x(\xf8\xd94s\xf3\xf3\u02c9\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\uf4c1\x8fhM\xb0\xc3g^\xc8\x132\xb3\x18>\xcc(\xa4\x95\x89T\x06\x923\xbf\u007fx\x00\x00\xe0\x94\xef\x9fY\xae\xdaA\x8c\x14\x94h-\x94\x1a\xabI$\xb5\xf4\x92\x9a\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\uf9b1\xf0\xdb`57\x82h\x91\xb8\xb4\xbc\x169\x84\xbb@\u03495e\x9e\xf9?\x0f\xc4\x00\x00\u07d4\xef\xbdR\xf9}\xa5\xfd:g:F\xcb\xf30D{~\x8a\xad\\\x89\x05l<\x9b\x80\xa0\xa6\x80\x00\xe0\x94\xef\xc8\xcf\x19c\u0269Rg\xb2(\xc0\x86#\x98\x89\xf4\xdf\xd4g\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xef\u02ae\x9f\xf6M,\xd9[RI\xdc\xff\xe7\xfa\xa0\xa0\xc0\xe4M\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\xef\xcc\xe0k\xd6\b\x9d\x0eE\x8e\xf5a\xf5\xa6\x89H\n\xfep\x00\x89 \x86\xac5\x10R`\x00\x00\u07d4\xef\xe0g]\xa9\x8a]\xdap\u0356\x19k\x87\xf4\xe7&\xb43H\x89?\x19\xbe\xb8\xdd\x1a\xb0\x00\x00\u07d4\xef\xe8\xff\x87\xfc&\x0e\agc\x8d\xd5\xd0/\xc4g.\x0e\xc0m\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xef\xeb\x19\x97\xaa\xd2w\xcc3C\x0ea\x11\xed\tCY@H\xb8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xef\xee\xa0\x10uo\x81\xdaK\xa2[r\x17\x87\xf0X\x17\v\uff49\x01\u009c\x9c\xf7p\xef\x00\x00\u07d4\xef\xf5\x1dr\xad\xfa\xe1C\xed\xf3\xa4+\x1a\xecU\xa2\xcc\xdd\v\x90\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xef\xf8kQ#\xbc\xdc\x17\xedL\xe8\xe0[~\x12\xe5\x13\x93\xa1\xf7\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xef\xfc\x15\u41f1\xbe\xda\n\x8d\x13%\xbd\xb4\x17\"@\xdcT\n\x89\x03\x8599\xee\xe1\xde\x00\x00\xe0\x94\xf0\x11\x95\xd6W\xef<\x94.l\xb89I\xe5\xa2\v\\\xfa\x8b\x1e\x8a\x05ts\xd0]\xab\xae\x80\x00\x00\u07d4\xf0'\x96)Q\x01gB\x88\xc1\xd94g\x05=\x04\"\x19\xb7\x94\x89(\x1d\x90\x1fO\xdd\x10\x00\x00\u07d4\xf09h={=\"[\xc7\xd8\u07ed\xefc\x164A\xbeA\xe2\x89\x01\xdd\x1eK\xd8\xd1\xee\x00\x00\u07d4\xf0Jj7\x97\b\xb9B\x8dr*\xa2\xb0kw\xe8\x895\u03c9\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xf0M,\x91\xef\xb6\xe9\xc4_\xfb\xe7KCL\x8c_+\x02\x8f\x1f\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf0W\xaaf\xcav~\xde\x12J\x1c[\x9c\xc5\xfc\x94\xef\v\x017\x89p\xa2K\u02b6\xf4]\x00\x00\u07d4\xf0[\xa8\u05f6\x859\xd930\v\xc9(\x9c=\x94t\xd0A\x9e\x89\x06\xda'\x02M\xd9`\x00\x00\u07d4\xf0\\\xee\xabeA\x05dp\x99Qw<\x84E\xad\x9fN\u01d7\x89\x10C\x16'\xa0\x93;\x00\x00\xe0\x94\xf0_\xcdL\rs\xaa\x16~US\xc8\xc0\xd6\xd4\xf2\xfa\xa3\x97W\x8a\x02\xd2\xd6l1p\xb2\x98\x00\x00\u07d4\xf0g\xe1\xf1\u0583UjL\xc4\xfd\f\x03\x13#\x9f2\xc4\xcf\u060965\u026d\xc5\u07a0\x00\x00\u07d4\xf0g\xfb\x10\u07f2\x93\u962b\xe5d\xc0U\xe34\x8f\x9f\xbf\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf0h\xdf\xe9]\x15\xcd:\u007f\x98\xff\xa6\x88\xb44hB\xbe&\x90\x89D\n\xd8\x19\xe0\x97L\x00\x00\xe0\x94\xf0j\x85J<]\xc3m\x1cI\xf4\xc8}m\xb33\xb5~J\u074a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf0y\xe1\xb1&_P\xe8\u0229\x8e\xc0\u01c1^\xb3\xae\xac\x9e\xb4\x89\x01\x16\xdc:\x89\x94\xb3\x00\x00\xe0\x94\xf0{\xd0\xe5\xc2\xcei\xc7\u0127$\xbd&\xbb\xfa\x9d*\x17\xca\x03\x8a\x01@a\xb9\xd7z^\x98\x00\x00\xe0\x94\xf0\x83*k\xb2U\x03\xee\xcaC[\xe3\x1b\v\xf9\x05\xca\x1f\xcfW\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\xf0\x9b>\x87\xf9\x13\xdd\xfdW\xae\x80I\xc71\u06e9\xb66\xdf\u00c9 \xf5\xb1\uab4d\x80\x00\x00\u07d4\xf0\xb14\v\x99oo\v\xf0\xd9V\x1c\x84\x9c\xaf\u007fD0\xbe\xfa\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf0\xb1\xf9\xe2x2\xc6\xdei\x14\xd7\n\xfc#\x8ct\x99\x95\xac\xe4\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xf0\xb4i\xea\xe8\x9d@\f\xe7\xd5\xd6j\x96\x95\x03p6\xb8\x89\x03\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xf0\xb9\u0583\u03a1+\xa6\x00\xba\xac\xe2\x19\xb0\xb3\xc9~\x8c\x00\xe4\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf0\xbe\x0f\xafMy#\xfcDF\"\u0458\f\xf2\u0650\xaa\xb3\a\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf0\xc0\x81\xdaR\xa9\xae6d*\xdf^\b _\x05\xc5Ah\xa6\x89\x06\x04o7\xe5\x94\\\x00\x00\u07d4\xf0\xc7\r\rm\xabvc\xaa\x9e\xd9\xce\xeaV~\xe2\u01b0'e\x89qC\x8a\u0167\x91\xa0\x80\x00\u07d4\xf0\xcb\xef\x84\xe1ic\x00\x98\xd4\xe3\x01\xb2\x02\b\xef\x05\x84j\u0249\x0e\v\x83EPkN\x00\x00\u07d4\xf0\xd2\x16c\u0630\x17n\x05\xfd\xe1\xb9\x0e\xf3\x1f\x850\xfd\xa9_\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\xf0\xd5\xc3\x1c\xcbl\xbe0\xc7\xc9\xea\x19\xf2h\xd1Y\x85\x1f\x8c\x9c\x8a\x03\x89O\x0eo\x9b\x9fp\x00\x00\u07d4\xf0\xd6L\xf9\xdf\tt\x113\xd1pH_\xd2K\x00P\x11\xd5 \x89\x1b\b\x93A\xe1O\xcc\x00\x00\u07d4\xf0\xd8X\x10^\x1bd\x81\x01\xac?\x85\xa0\xf8\"+\xf4\xf8\x1dj\x89 \x86\xac5\x10R`\x00\x00\u07d4\xf0\xdcC\xf2\x05a\x91'P{+\x1c\x1c\xfd\xf3-(1\t \x89\x10^\xb7\x9b\x94\x17\b\x80\x00\u07d4\xf0\xe1\u07e4*\u07ac/\x17\xf6\xfd\xf5\x84\xc9Hb\xfdV3\x93\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf0\xe2d\x9c~j?,]\xfe3\xbb\xfb\xd9'\xca<5\nX\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf0\xe7\xfb\x9eB\nS@\xd56\xf4\x04\b4O\xea\xef\xc0j\xef\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf1\x04b\xe5\x8f\xcc\a\U000d5121\x87c\x94Q\x16~\x85\x92\x01\x89\t4\xdd]3\xbc\x97\x00\x00\xe0\x94\xf1\x06a\xff\x94\x14\x0f >zH%rCy8\xbe\xc9\xc3\xf7\x8a\x04<3\xc1\x93ud\x80\x00\x00\u0794\xf1\x14\xff\r\x0f$\xef\xf8\x96\xed\xdeTq\u07a4\x84\x82J\x99\xb3\x88\xbe -j\x0e\xda\x00\x00\u07d4\xf1\x16\xb0\xb4h\x0fS\xabr\xc9h\xba\x80.\x10\xaa\x1b\xe1\x1d\u0209\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xf1\x1c\xf5\xd3cto\xeehd\xd3\xca3m\xd8\x06y\xbb\x87\xae\x8a\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xf1\x1e\x01\u01e9\xd1$\x99\x00_M\xaew\x16\tZ4\x17bw\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xf1;\b0\x93\xbaVN-\xc61V\x8c\xf7T\r\x9a\x0e\xc7\x19\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xf1O\x0e\xb8m\xb0\xebhu?\x16\x91\x8e]K\x80t7\xbd>\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf1Qx\xff\xc4:\xa8\a\x0e\xce2~\x93\x0f\x80\x9a\xb1\xa5O\x9d\x89\n\xb6@9\x12\x010\x00\x00\u07d4\xf1V\xdc\v*\x98\x1e[U\xd3\xf2\xf0;\x814\xe31\u06ed\xb7\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf1]\x9dZ!\xb1\x92\x9ey\x03q\xa1\u007f\x16\xd9_\fie\\\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1^\x18,O\xbb\xady\xbd\x934\"B\xd4\xdc\xcf+\xe5\x89%\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xf1bM\x98\ve3o\xea\u0166\xd5A%\x00\\\xfc\xf2\xaa\u02c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1g\xf5\x86\x8d\xcfB3\xa7\x83\x06\th,\xaf-\xf4\xb1\xb8\a\x89\x81\xe5B\xe1\xa78?\x00\x00\u07d4\xf1m\xe1\x89\x1d\x81\x96F\x13\x95\xf9\xb16&[;\x95F\xf6\xef\x89\x01\xb2\x8e\x1f\x98\xbb\u0380\x00\u07d4\xf1z\x92\xe06\x1d\xba\xce\xcd\xc5\xde\r\x18\x94\x95Z\xf6\xa9\xb6\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1z\xdbt\x0fE\u02fd\xe3\tN~\x13qo\x81\x03\xf5c\xbd\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1\x8b\x14\xcb\xf6iC6\xd0\xfe\x12\xac\x1f%\xdf-\xa0\xc0]\xbb\x89\xd8\xd4`,&\xbfl\x00\x00\u07d4\xf1\x9b98\x9dG\xb1\x1b\x8a,?\x1d\xa9\x12M\xec\xff\xbe\xfa\xf7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf1\x9f\x195\b9>M*\x12{ \xb2\x03\x1f9\xc8%\x81\u0189\xbd\xbdz\x83\xbd/l\x00\x00\u07d4\xf1\xa1\xf3 @yd\xfd<\x8f.,\u0224X\r\xa9O\x01\xea\x89ll!wU|D\x00\x00\u07d4\xf1\xb4\xec\xc65%\xf7C,=\x83O\xfe+\x97\x0f\xbe\xb8r\x12\x89\xa2\xa2@h\xfa\u0340\x00\x00\u07d4\U000753ef\xfa\x87\x94\xf5\n\xf8\xe8\x83\t\u01e6&TU\xd5\x1a\x8963\x03\"\xd5#\x8c\x00\x00\u07d4\xf1\xc8\u0129A\xb4b\x8c\rl0\xfd\xa5dR\u065c~\x1bd\x89N\x8c\xea\x1e\xdeu\x04\x00\x00\u07d4\xf1\xda@so\x99\xd5\xdf;\x06\x8a]t_\xaf\xc6F?\u0271\x89\x06\x96\xca#\x05\x8d\xa1\x00\x00\u07d4\xf1\u070a\xc8\x10B\xc6z\x9c\\c2!\xa8\xf76>e\x87\f\x9f(t$\u04a9`\x89J\xcfX\xe0rW\x10\x00\x00\u07d4\xf2B\u0684]B\u053fw\x9a\x00\xf2\x95\xb4\aP\xfeI\xea\x13\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf2RY\xa5\xc99\xcd%\x96l\x9bc\x03\xd3s\x1cS\u077cL\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf2^Lp\xbcFV2\u021eV%\xa82\xa7r/k\xff\xab\x89\xf3K\x82\xfd\x8e\x91 \x00\x00\u07d4\xf2k\xce\xdc\xe3\xfe\xad\u03a3\xbc>\x96\xeb\x10@\xdf\xd8\xff\u1809*\x03I\x19\u07ff\xbc\x00\x00\u07d4\xf2py%v\xf0]QD\x93\xff\xd1\xf5\xe8K\xecK-\xf8\x10\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf2s,\xf2\xc1;\x8b\xb8\xe7I*\x98\x8f_\x89\xe3\x82s\xdd\u0209 \x86\xac5\x10R`\x00\x00\xe0\x94\xf2t.hY\xc5i\xd5\xf2\x10\x83Q\xe0\xbfM\xca5*H\xa8\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf2\x81:d\xc5&]\x02\x025\u02dc1\x9bl\x96\xf9\x06\xc4\x1e\x89\x12\xf99\u025e\u06b8\x00\x00\u07d4\xf2\x87\xffR\xf4a\x11z\xdb>\x1d\xaaq\x93-\x14\x93\xc6_.\x89\xc5S%\xcat\x15\xe0\x00\x00\u07d4\xf2\xab\x11au\x02D\xd0\xec\xd0H\xee\r>Q\xab\xb1C\xa2\xfd\x89B\xfe+\x90ss\xbc\x00\x00\u07d4\xf2\xb4\xab,\x94'\xa9\x01^\xf6\xee\xff\xf5\xed\xb6\x019\xb7\x19\u0449&\u06d9*;\x18\x00\x00\x00\u07d4\xf2\xc0>*8\x99\x8c!d\x87`\xf1\xe5\xae~\xa3\a}\x85\"\x89\x8f?q\x93\xab\a\x9c\x00\x00\u0794\xf2\u0090N\x9f\xa6d\xa1\x1e\xe2VV\xd8\xfd,\xc0\u0665\"\xa0\x88\xb9\x8b\xc8)\xa6\xf9\x00\x00\u07d4\xf2\xc3b\xb0\xef\x99\x1b\xc8/\xb3nf\xffu\x93*\xe8\u0742%\x89\x04\x02\xf4\xcf\xeeb\xe8\x00\x00\u07d4\xf2\xd0\xe9\x86\xd8\x14\xea\x13\xc8\xf4f\xa0S\x8cS\u0712&Q\xf0\x89J\xcfX\xe0rW\x10\x00\x00\xe0\x94\xf2\u04775w$\xecL\x03\x18[\x87\x9bc\xf5~&X\x91S\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xf2\xd5v<\xe0s\x12~,\xed\xdeo\xab\xa7\x86\xc7<\xa9AA\x8a\x01\xacB\x86\x10\x01\x91\xf0\x00\x00\xe0\x94\xf2\u055c\x89#u\x90s\xd6\xf4\x15\xaa\xf8\xeb\x06_\xf2\U000f614a\x01\xab,\xf7\xc9\xf8~ \x00\x00\u07d4\xf2\xe9\x9f\\\xbb\x83kz\xd3bGW\x1a0,\xbeKH\x1ci\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf2\xed>w%J\u02c3#\x1d\xc0\x86\x0e\x1a\x11$+\xa6'\u06c9kV\x05\x15\x82\xa9p\x00\x00\xe0\x94\xf2\xed\xde7\xf9\xa8\u00dd\u07a2My\xf4\x01WW\xd0k\xf7\x86\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xf2\xef\xe9e`\xc9\xd9{r\xbd6DxC\x88\\\x1d\x90\xc21\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf2\xfb\xb6\u0607\xf8\xb8\xcc:\x86\x9a\xba\x84\u007f=\x1fd\xfcc\x97\xaae\xfbS\xa8\xf0z\x0f\x89:\xae0\xe8\xbc\xee\x89|\xf28\x1fa\x9f\x15\x00\x00\u07d4\xf3@\x83\xec\xea8P\x17\xaa@\xbd\xd3^\xf7\xef\xfbL\xe7v-\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xf3F\xd7\u0792t\x1c\b\xfcX\xa6M\xb5[\x06-\xde\x01-\x14\x89\x0f\xffk\x1fv\x1em\x00\x00\xe0\x94\xf3U\xd3\xec\f\xfb\x90}\x8d\xbb\x1b\xf3FNE\x81(\x19\v\xac\x8a\x01\v\x04n\u007f\r\x80\x10\x00\x00\u07d4\xf3m\xf0/\xbd\x89`sG\xaf\xce)i\xb9\xc4#jX\xa5\x06\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf3s\xe9\u06ac\f\x86u\xf5;yz\x16\x0fo\xc04\xaek#\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf3{BeG\xa1d-\x8032H\x14\xf0\xed\xe3\x11O\xc2\x12\x89\x15\xbeat\xe1\x91.\x00\x00\u07d4\xf3{\xf7\x8cXu\x15G\x11\xcbd\r7\xeam(\xcf\xcb\x12Y\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xf3\x82\xdfX1U\xd8T\x8f?\x93D\f\xd5\xf6\x8c\xb7\x9d`&\x8a8u}\x02\u007f\xc1\xfd\\\x00\x00\xe0\x94\xf3\x82\xe4\xc2\x04\x10\xb9Q\b\x9e\x19\xba\x96\xa2\xfe\xe3\xd9\x1c\xce~\x8a\x01\x11\xfaV\xee\u00a88\x00\x00\xe0\x94\xf3\x8al\xa8\x01hS~\x97M\x14\xe1\xc3\xd19\x90\xa4L,\x1b\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\u07d4\xf3\x9a\x9dz\xa3X\x1d\xf0~\xe4'\x9a\xe6\xc3\x12\xef!\x036X\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf3\xb6h\xb3\xf1M\x92\x0e\xbc7\x90\x92\u06d8\x03\x1bg\xb2\x19\xb3\x89\n\xd6\xee\xdd\x17\xcf;\x80\x00\u07d4\U000fe679\x10<\xe7U\n\xa7O\xf1\xdb\x18\xe0\x9d\xfe2\xe0\x05\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf3\xc1\xab\u049d\xc5{A\xdc\x19-\x0e8M\x02\x1d\xf0\xb4\xf6\u0509\x97\xae\f\u07cf\x86\xf8\x00\x00\u07d4\xf3\xc4qm\x1e\xe5'\x9a\x86\xd0\x16:\x14a\x81\x81\xe1a6\u01c965\u026d\xc5\u07a0\x00\x00\xe0\x94\xf3\u030b\xcbU\x94e\xf8\x1b\xfeX;\u05eb\n#\x06E;\x9e\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xf3\u0588\xf0k\xbd\xbfP\xf9\x93,AE\xcb\xe4\x8e\xcd\xf6\x89\x04\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf3\xdb\xcf\x13Z\u02dd\xee\x1aH\x9cY<\x02O\x03\u00bb\xae\u0389lk\x93[\x8b\xbd@\x00\x00\u07d4\xf3\xde_&\xefj\xde\xd6\xf0m;\x91\x13F\xeep@\x1d\xa4\xa0\x89\x13:\xb3}\x9f\x9d\x03\x00\x00\u07d4\xf3\xdfc\xa9q\x99\x93308;>\xd7W\v\x96\u0101#4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf3\xe7OG\f}:?\x003x\x0fv\xa8\x9f>\xf6\x91\xe6\u02c9\xa3\xcf\xe61\xd1Cd\x00\x00\u07d4\xf3\xeb\x19H\xb9Q\xe2-\xf1ax)\xbf;\x8d\x86\x80\xeckh\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf3\xf1\xfa9\x18\xca4\xe2\xcf~\x84g\v\x1fM\x8e\xca\x16\r\xb3\x89$\xdc\xe5M4\xa1\xa0\x00\x00\u07d4\xf3\xf2O\u009e @?\xc0\xe8\xf5\xeb\xbbU4&\xf7\x82p\xa2\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf3\xfar5R\xa5\xd0Q.+b\xf4\x8d\xca{+\x81\x050[\x89\amA\xc6$\x94\x84\x00\x00\u07d4\xf3\xfeQ\xfd\xe3D\x13\xc73\x18\xb9\xc8T7\xfe~\x82\x0fV\x1a\x896b2\\\u044f\xe0\x00\x00\u07d4\xf4\x00\xf9=_\\~?\xc3\x03\x12\x9a\xc8\xfb\f/xd\a\xfa\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf4\v\x13O\xea\"\u01b2\x9c\x84W\xf4\x9f\x00\x0f\x9c\xdax\x9a\u06c9 \x86\xac5\x10R`\x00\x00\u07d4\xf4\x15W\xdf\u07f1\xa1\xbd\xce\xfe\xfe.\xba\x1e!\xfe\nJ\x99B\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf4\x17z\r\x85\u050b\x0e&B\x11\xce*\xa2\xef\xd3\xf1\xb4\u007f\b\x89\xc2\xcc\xca&\xb7\xe8\x0e\x80\x00\u07d4\xf4/\x90R1\xc7p\xf0\xa4\x06\xf2\xb7h\x87\u007f\xb4\x9e\xee\x0f!\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xf42\xb9\u06ef\x11\xbd\xbds\xb6Q\x9f\xc0\xa9\x04\x19\x87q\xaa\u0189\b=lz\xabc`\x00\x00\u07d4\xf4=\xa3\xa4\xe3\xf5\xfa\xb1\x04\u029b\xc1\xa0\xf7\xf3\xbbJV\xf3Q\x89lj\xccg\u05f1\xd4\x00\x00\xe0\x94\xf4G\x10\x8b\x98\xdfd\xb5~\x87\x103\x88\\\x1a\xd7\x1d\xb1\xa3\xf9\x8a\x01v\xf4\x9e\xad4\x83P\x80\x00\u07d4\xf4O\x85Q\xac\xe93r\a\x12\xc5\u0111\u0376\xf2\xf9Qsl\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u0794\xf4V\x05Z\x11\xab\x91\xfff\x8e.\xc9\"\x96\x1f*#\xe3\xdb%\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xf4V\xa7[\xb9\x96U\xa7A,\xe9}\xa0\x81\x81m\xfd\xb2\xb1\xf2\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf4[\x1d\xcb.A\xdc'\xff\xa0$\u06ad\xf6\x19\xc1\x11u\xc0\x87\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xf4c\xa9\f\xb3\xf1>\x1f\x06CB66\xbe\xab\x84\xc1#\xb0m\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xf4h\x90n~\xdffJ\xb0\u063e=\x83\xebz\xb3\xf7\xff\xdcx\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xf4i\x80\u3929\u049ajn\x90`E7\xa3\x11K\xcb(\x97\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf4kk\x9c|\xb5R\x82\x9c\x1d=\xfd\x8f\xfb\x11\xaa\xba\xe7\x82\xf6\x89\x01#n\xfc\xbc\xbb4\x00\x00\u07d4\xf4v\xe1&\u007f\x86$|\xc9\b\x81o.z\xd58\x8c\x95-\xb0\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf4v\xf2\xcbr\b\xa3.\x05\x1f\xd9N\xa8f)\x92c\x82\x87\xa2\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xf4{\xb14\xda0\xa8\x12\xd0\x03\xaf\x8d\u0338\x88\xf4K\xbfW$\x8a\x01\x19Y\xb7\xfe3\x95X\x00\x00\u07d4\xf4\x83\xf6\a\xa2\x1f\xcc(\x10\n\x01\x8cV\x8f\xfb\xe1@8\x04\x10\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf4\x8e\x1f\x13\xf6\xafM\x84\xb3q\xd7\xdeK'=\x03\xa2c'\x8e\x89 \x86\xac5\x10R`\x00\x00\xe0\x94\xf4\x9cG\xb3\xef\xd8knj[\xc9A\x8d\x1f\x9f\xec\x81Ki\xef\x8a\x04<3\xc1\x93ud\x80\x00\x00\xe0\x94\xf4\x9fo\x9b\xaa\xbc\x01\x8c\x8f\x8e\x11\x9e\x01\x15\xf4\x91\xfc\x92\xa8\xa4\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf4\xa3g\xb1f\u0499\x1a+\xfd\xa9\xf5dc\xa0\x9f%,\x1b\x1d\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf4\xa5\x1f\xceJ\x1d[\x94\xb0q\x83\x89\xbaNx\x14\x13\x9c\xa78\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xf4\xa9\xd0\f\xef\xa9{zX\xef\x94\x17\xfcbg\xa5\x06\x909\xee\x89\x01.\x89(\u007f\xa7\x84\x00\x00\u07d4\xf4\xaa\xa3\xa6\x16>7\x06W{I\xc0v~\x94\x8ah\x1e\x16\xee\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf4\xb1bn$\xf3\v\xca\xd9'!\xb2\x93r\x89U\xa6\xe7\x9c\xcd\x1d0\x00\x00\u07d4\xf5U\xa2{\xb1\xe2\xfdN,\u01c4\xca\ue493\x9f\xc0n/\u0249lk\x93[\x8b\xbd@\x00\x00\u07d4\xf5X\xa2\xb2\xdd&\u0755\x93\xaa\xe0E1\xfd<<\u00c5Kg\x89\n\xbb\xcdN\xf3wX\x00\x00\u07d4\xf5`H\xdd!\x81\u0523od\xfc\xec\xc6!T\x81\xe4*\xbc\x15\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf5dB\xf6\x0e!i\x13\x95\u043f\xfa\xa9\x19M\xca\xff\x12\u2dc9\x0e\x189\x8ev\x01\x90\x00\x00\u07d4\xf5yqJE\xeb\x8fR\xc3\xd5{\xbd\xef\xd2\xc1[./\x11\u07c9T\x91YV\xc4\t`\x00\x00\u07d4\xf5\x93\xc6R\x85\xeek\xbdf7\U000fe3c9\xad@\u0509\xf6U\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xf5\x98\xdb.\t\xa8\xa5\xee}r\r+\\C\xbb\x12m\x11\xec\u0089\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xf5\x9d\xab\x1b\xf8\xdf\x112~a\xf9\xb7\xa1KV:\x96\xec5T\x8a\x01EB\xba\x12\xa37\xc0\x00\x00\xe0\x94\xf5\x9f\x9f\x02\xbb\u024e\xfe\t~\xab\xb7\x82\x10\x97\x90!\x89\x8b\xfd\x8a\x02\x1e\x17\x1a>\xc9\xf7,\x00\x00\u07d4\xf5\xa5E\x9f\xcd\xd5\xe5\xb2s\x83\r\xf8\x8e\xeaL\xb7}\xda\u07f9\x89\x04\t\xe5+H6\x9a\x00\x00\u07d4\xf5\xa7gj\xd1H\xae\x9c\x1e\xf8\xb6\xf5\xe5\xa0\xc2\xc4s\xbe\x85\v\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf5\xb0h\x98\x9d\xf2\x9c%5w\xd0@Z\xden\x0eu(\xf8\x9e\x89WG=\x05\u06ba\xe8\x00\x00\u07d4\xf5\xb6\xe9\x06\x1aN\xb0\x96\x16\aw\xe2gb\xcfH\xbd\u0635]\x89\r\xc5_\xdb\x17d{\x00\x00\u07d4\xf5\xcf\xfb\xbabN~\xb3!\xbc\x83\xc6\f\xa6\x81\x99\xb4\xe3fq\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf5\xd1ER\xb1\xdc\xe0\xd6\xdc\x1f2\r\xa6\xff\u02231\xcdo\f\x89Hz\x9a0E9D\x00\x00\xe0\x94\xf5\xd6\x1a\xc4\u0295G^[{\xff\xd5\xf2\xf6\x90\xb3\x16u\x96\x15\x8a\x06\x92\xae\x88\x97\b\x1d\x00\x00\x00\u07d4\xf5\xd9\xcf\x00\xd6X\xddEQzH\xa9\xd3\xf5\xf63T\x1aS=\x89\x06O_\xdfIOx\x00\x00\u07d4\xf5\xea\xdc\xd2\u0478ez\x12\x1f3\xc4X\xa8\xb1>v\xb6U&\x89\r\x8b\x0fZZ\xc2J\x00\x00\u07d4\xf6\a\xc2\x15\r>\x1b\x99\xf2O\xa1\xc7\xd5@\xad\xd3\\N\xbe\x1e\x89\xa7\xf1\xaa\a\xfc\x8f\xaa\x00\x00\u07d4\xf6\v\xd75T>k\xfd.\xa6\xf1\x1b\xffbs@\xbc\x03Z#\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf6\f\x1bE\xf1d\xb9X\x0e 'Z\\9\xe1\xd7\x1e5\xf8\x91\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xf6\x0fb\xd797\x95?\xef5\x16\x9e\x11\xd8r\xd2\xea1~\xec\x8a\x01!\xeah\xc1\x14\xe5\x10\x00\x00\u07d4\xf6\x12\x83\xb4\xbd\x85\x04\x05\x8c\xa3`\u94d9\x9bb\xcb\xc8\xcdg\x89\r\xd2\xd5\xfc\xf3\xbc\x9c\x00\x00\u07d4\xf6\x17\xb9g\xb9\xbdH_v\x95\xd2\xefQ\xfbw\x92\u0618\xf5\x00\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf6\x18\u0671\x04A\x14\x80\xa8c\xe6#\xfcU#-\x1aOH\xaa\x89\x0eh\x9emD\xb1f\x80\x00\u07d4\xf6\"\u5126b>\xaa\xf9\x9f+\xe4\x9eS\x80\xc5\xcb\xcf\\\u0609\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf62\xad\xffI\r\xa4\xb7-\x126\xd0KQ\x0ft\xd2\xfa\xa3\u0349K\xe4\xe7&{j\xe0\x00\x00\u07d4\xf69\xac1\u069fg'\x1b\xd1\x04\x02\xb7eN\\\xe7c\xbdG\x89\x15\xaf\x0fB\xba\xf9&\x00\x00\u07d4\xf6:W\x9b\xc3\xea\u00a9I\x04\x10\x12\x8d\xbc\xeb\xe6\xd9\u0782C\x89P\xc5\xe7a\xa4D\b\x00\x00\u07d4\xf6E\xdd|\x89\x00\x93\xe8\xe4\u022a\x92\xa6\xbb55\"\xd3\u0718\x89\aC\x9f\xa2\t\x9eX\x00\x00\xe0\x94\xf6H\xea\x89\xc2u%q\x01r\x94Ny\xed\xff\x84x\x03\xb7u\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xf6JJ\xc8\xd5@\xa9(\x9ch\xd9`\xd5\xfb|\xc4Zw\x83\x1c\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf6N\xcf!\x17\x93\x1cmSZ1\x1eO\xfe\xae\xf9\u0514\x05\xb8\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xf6O\xe0\x93\x9a\x8d\x1e\xea*\x0e\u035a\x970\xfdyX\xe31\t\x89\x01\x1d\xe1\xe6\xdbE\f\x00\x00\u07d4\xf6V\x16\xbe\x9c\x8by~t\x15\"|\x918\xfa\xa0\x89\x17B\u05c9*\xd3s\xcef\x8e\x98\x00\x00\u07d4\xf6W\xfc\xbeh.\xb4\xe8\xdb\x15.\u03c9$V\x00\vQ=\x15\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xf6X\x19\xacL\xc1L\x13\u007f\x05\xddyw\xc7\xda\xe0\x8d\x1aJ\xb5\x89\x05\x87\x88\u02d4\xb1\xd8\x00\x00\u07d4\xf6{\xb8\xe2\x11\x8b\xbc\u0550'fn\xed\xf6\x94>\xc9\xf8\x80\xa5\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf6\x84d\xbfd\xf2A\x13V\xe4\xd3%\x0e\xfe\xfe\\P\xa5\xf6[\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf6\x86x[\x89r\va\x14_\ua017\x8dj\u030e\v\xc1\x96\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf6\x8c^3\xfa\x97\x13\x9d\xf5\xb2\xe68\x86\xce4\xeb\xf3\u45dc\x89\xb3\xfaAi\xe2\xd8\xe0\x00\x00\u07d4\xf6\xa8cWW\xc5\xe8\xc14\xd2\r\x02\x8c\xf7x\u03c6\t\xe4j\x89O\x1dw/\xae\xc1|\x00\x00\u07d4\xf6\xb7\x82\xf4\xdc\xd7E\xa6\xc0\xe2\xe00`\x0e\x04\xa2K%\xe5B\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\xe0\x94\xf6\xbc7\xb1\u04a3x\x8dX\x9bm\xe2\x12\xdc\x17\x13\xb2\xf6\u738a\x01\x0f\f\xf0d\xddY \x00\x00\u07d4\xf6\xc3\u010a\x1a\xc0\xa3G\x99\xf0M\xb8n\u01e9u\xfewh\xf3\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf6\xd2]?=\x84m#\x9fR_\xa8\xca\xc9{\xc45x\u06ec\x890\x92\u007ft\xc9\xde\x00\x00\x00\u07d4\xf6\xea\xacp2\u0512\xef\x17\xfd`\x95\xaf\xc1\x1dcOV\xb3\x82\x89\x1b\x1bk\u05efd\xc7\x00\x00\xe0\x94\xf6\xea\xd6}\xbf[~\xb13X\xe1\x0f6\x18\x9dS\xe6C\xcf\u03ca\bxg\x83&\xea\xc9\x00\x00\x00\u07d4\xf6\xf1\xa4C\t\x05\x1ck%\xe4}\xff\x90\x9b\x17\x9b\xb9\xabY\x1c\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xf7\x03(\xef\x97b_\xe7E\xfa\xa4\x9e\xe0\xf9\u052a;\r\xfbi\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf7\n\x99\x8aq{3\x8d\x1d\u0658T@\x9b\x1a3\x8d\ue930\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf7\rcz\x84\\\x06\xdbl\u0711\xe67\x1c\xe7\xc48\x8ab\x8e\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf7\x15R\x13D\x98\x92tK\xc6\x0f.\x04@\a\x88\xbd\x04\x1f\u0749\x03\x9f\xba\xe8\xd0B\xdd\x00\x00\xe0\x94\xf7\x1bE4\xf2\x86\xe40\x93\xb1\xe1^\xfe\xa7I\xe7Y{\x8bW\x8a\x16\x1c\x13\xd34\x1c\x87(\x00\x00\u07d4\xf74\xec\x03rM\xde\xe5\xbbRy\xaa\x1a\xfc\xf6\x1b\f\xb4H\xa1\x89\xe5\xbf,\u0270\x97\x80\x00\x00\u07d4\xf76\u0716v\x00\x128\x8f\xe8\x8bf\xc0n\xfeW\xe0\xd7\xcf\n\x89q\xd7Z\xb9\xb9 P\x00\x00\u07d4\xf7:\xc4l ;\xe1S\x81\x11\xb1Q\xec\x82 \u01c6\xd8AD\x89\x0f\xf77x\x17\xb8+\x80\x00\u07d4\xf7=\xd9\xc1B\xb7\x1b\xce\x11\xd0n0\xe7\xe7\xd02\xf2\uc71e\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf7A\x8a\xa0\xe7\x13\xd2H\"\x87v\xb2\xe7CB\"\xaeu\u3949lk\x93[\x8b\xbd@\x00\x00\u07d4\xf7Nn\x14S\x82\xb4\u06c2\x1f\xe0\xf2\u0643\x88\xf4V\t\u019f\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xf7P\f\x16o\x8b\xea/\x824v\x06\xe5\x02K\xe9\xe4\xf4\u0399\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf7W\xfc\x87 \xd3\xc4\xfaRw\a^`\xbd\\A\x1a\xeb\xd9w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf7[\xb3\x9cy\x97y\xeb\xc0J3m&\r\xa61F\xed\x98\u0409\x01Z\xf1\u05cbX\xc4\x00\x00\xe0\x94\xf7h\xf3!\xfdd3\xd9kO5M<\xc1e,\x172\xf5\u007f\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf7oi\xce\xe4\xfa\xa0\xa6;0\xae\x1ex\x81\xf4\xf7\x15ep\x10\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf7w6\x1a=\u062bb\xe5\xf1\xb9\xb0GV\x8c\xc0\xb5UpL\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf7|{\x84QI\xef\xba\x19\xe2a\xbc|u\x15y\b\xaf\xa9\x90\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf7\u007f\x95\x87\xffz-r\x95\xf1\xf5q\u0206\xbd3\x92jR|\x89lh\xcc\u041b\x02,\x00\x00\u07d4\xf7\x82X\xc1$\x81\xbc\xdd\u06f7*\x8c\xa0\xc0C\tra\xc6\u0149\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf7\x98\xd1m\xa4\xe4`\xc4`\xcdH_\xae\x0f\xa0Y\x97\b\ub08965\u026d\xc5\u07a0\x00\x00\u07d4\xf7\xa1\xad\xe2\xd0\xf5)\x12=\x10U\xf1\x9b\x17\x91\x9fV!Ng\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf7\xac\xff\x93K\x84\xda\ti\xdc7\xa8\xfc\xf6C\xb7\xd7\xfb\xedA\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xf7\xb1Q\xcc^W\x1c\x17\xc7e9\xdb\xe9\x96L\xbbo\xe5\xdey\x89tq|\xfbh\x83\x10\x00\x00\u07d4\xf7\xb2\x9b\x82\x19\\\x88-\xabx\x97\u00ae\x95\xe7w\x10\xf5xu\x89w5Aa2\xdb\xfc\x00\x00\u07d4\xf7\xbcLD\x91\rZ\xed\xd6n\xd25U8\xa6\xb1\x93\xc3a\xec\x89\x05A\xde,-\x8db\x00\x00\u07d4\xf7\xc0\f\xdb\x1f\x02\x03\x10\u056c\xab{Ij\xaaD\xb7y\b^\x89Z\x87\xe7\xd7\xf5\xf6X\x00\x00\u07d4\xf7\xc1\xb4C\x96\x8b\x11{]\u0677UW/\xcd9\xca^\xc0K\x89\x18\xb9h\u0092\xf1\xb5\x00\x00\xe0\x94\xf7\xc5\x0f\x92*\xd1ka\xc6\u047a\xa0E\xed\x81h\x15\xba\u010f\x8a\x02\xa99j\x97\x84\xad}\x00\x00\u07d4\xf7\xc7\b\x01Pq\xd4\xfb\n:*\t\xa4]\x15c\x96\xe34\x9e\x89\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xf7\xcb\u06e6\xbel\xfeh\xdb\xc2<+\x0f\xf50\xee\x05\"o\x84\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf7\xd0\xd3\x10\xac\xea\x18@a8\xba\xaa\xbb\xfe\x05q\xe8\r\xe8_\x89Hz\x9a0E9D\x00\x00\u07d4\xf7\u05ef LV\xf3\x1f\xd9C\x98\xe4\r\xf1\x96K\u063f\x12<\x89\b!\xd2!\xb5)\x1f\x80\x00\u07d4\xf7\xdc%\x11\x96\xfb\u02f7|\x94}|\x19F\xb0\xffe\x02\x1c\xea\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xf7\xe4Z\x12\xaaq\x1cp\x9a\xce\xfe\x95\xf3;xa-*\xd2*\x8a\x0e\x06U\xe2\xf2k\xc9\x18\x00\x00\u07d4\xf7\xf4\x89\x8cLRm\x95_!\xf0U\xcbnG\xb9\x15\xe5\x19d\x89|\b`\xe5\xa8\r\xc0\x00\x00\u07d4\xf7\xf9\x1ez\xcb[\x81)\xa3\x06\x87|\xe3\x16\x8eoC\x8bf\xa1\x89\t\x8a}\x9b\x83\x14\xc0\x00\x00\u07d4\xf7\xfcE\xab\xf7oP\x88\xe2\u5d68\xd12\xf2\x8aMN\xc1\xc0\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\x06:\xf4\xcc\x1d\xd9a\x9a\xb5\u063f\xf3\xfc\xd1\xfa\xa8H\x82!\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\bnBf\x1e\xa9)\xd2\u0761\xablt\x8c\xe3\x05]\x11\x1e\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xf8\bw\x86\xb4-\xa0N\xd6\xd1\xe0\xfe&\xf6\xc0\xee\xfe\x1e\x9fZ\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xf8\r6\x19p/\xa5\x83\x8cH9\x18Y\xa89\xfb\x9c\xe7\x16\x0f\x89l\a\xa7\u0471np\x00\x00\u07d4\xf8\x14y\x9fm\xdfM\xcb)\xc7\xee\x87\x0eu\xf9\xcc-52m\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xf8\x15\xc1\n\x03-\x13\xc3K\x89v\xfan;\xd2\xc9\x13\x1a\x8b\xa9\x89Hz\x9a0E9D\x00\x00\u07d4\xf8\x16\"\xe5WW\xda\xeafu\x97]\xd958\xda}\x16\x99\x1e\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8$\xee3\x1eJ\xc3\xccXv\x939[W\xec\xf6%\xa6\xc0\u0089V\xc9]\xe8\xe8\xca\x1d\x00\x00\u07d4\xf8'\xd5n\xd2\xd3' \u052b\xf1\x03\xd6\xd0\xefM;\xcdU\x9b\x89\x01l\x80\x06W\x91\xa2\x80\x00\u07d4\xf8)\x85\x91R>P\xb1\x03\xf0\xb7\x01\xd6#\xcb\xf0\xf7EV\xf6\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf8H\xfc\xe9\xaba\x1c}\x99 n#\xfa\u019a\u0508\xb9O\xe1\x89\x02\xa1\x12\x9d\t6r\x00\x00\u07d4\xf8O\t\n\xdf?\x8d\xb7\u1533P\xfb\xb7u\x00i\x9ff\xfd\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf8Q\xb0\x10\xf63\xc4\n\xf1\xa8\xf0js\ubeabe\az\xb5\x89\xee\x86D/\xcd\x06\xc0\x00\x00\u07d4\xf8X\x17\x1a\x04\xd3W\xa1;IA\xc1n~U\xdd\u0514\x13)\x89\x02F\xa5!\x8f*\x00\x00\x00\u07d4\xf8[\xab\x1c\xb3q\x0f\xc0_\xa1\x9f\xfa\xc2.gR\x1a\v\xa2\x1d\x89l\x955\u007f\xa6\xb3l\x00\x00\u07d4\xf8j>\xa8\a\x1fp\x95\xc7\u06ca\x05\xaePz\x89)\u06f8v\x89\x126\xef\xcb\u02f3@\x00\x00\u07d4\xf8pL\x16\xd2\xfd[\xa3\xa2\xc0\x1d\x0e\xb2\x04\x84\xe6\xec\xfa1\t\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf8p\x99_\xe1\xe5\"2\x1duC7\xa4\\\f\x9d{8\x95\x1c\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf8s\xe5ze\xc9;n\x18\xcbu\xf0\xdc\a}[\x893\xdc\\\x89\n\xad\xec\x98?\xcf\xf4\x00\x00\u07d4\xf8ua\x9d\x8a#\xe4]\x89\x98\u0444\u0500\xc0t\x89p\x82*\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf8{\xb0{(\x9d\xf70\x1eT\xc0\xef\xdaj,\xf2\x91\xe8\x92\x00\x89K\xe4\xe7&{j\xe0\x00\x00\u0794\xf8\x89\x00\xdbsyU\xb1Q\x9b\x1a}\x17\n\x18\x86L\xe5\x90\xeb\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xf8\x8bX\xdb7B\vFL\v\xe8\x8bE\xee+\x95)\x0f\x8c\xfa\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xf8\x96+u\xdb]$\xc7\xe8\xb7\xce\xf1\x06\x8c>g\u03bb0\xa5\x89\x0f-\xc7\xd4\u007f\x15`\x00\x00\u07d4\xf8\xa0e\xf2\x87\xd9\x1dw\xcdbj\xf3\x8f\xfa\"\r\x9bU*+\x89g\x8a\x93 b\xe4\x18\x00\x00\u07d4\xf8\xa4\x9c\xa29\f\x1fm\\\x0ebQ;\a\x95qt?|\u0189\xa2\xa1]\tQ\x9b\xe0\x00\x00\u07d4\xf8\xa5\f\xee.h\x8c\xee\u3b24\u0522\x97%\xd4\a,\u0103\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\xacJ9\xb5<\x110x \x97;D\x13e\xcf\xfeYof\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\xae\x85{g\xa4\xa2\x89:?\xbe|z\x87\xff\x1c\x01\u01a6\xe7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xf8\xbf\x9c\x04\x87NZw\xf3\x8fL8R~\x80\xc6v\xf7\xb8\x87\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\xc7\xf3J8\xb3\x18\x01\xdaC\x064w\xb1+'\xd0\xf2\x03\xff\x89\x1a\u04ba\xbao\xefH\x00\x00\u07d4\xf8\xca3l\x8e\x91\xbd \xe3\x14\xc2\v-\xd4`\x8b\x9c\x8b\x94Y\x89-\u071b\u0173,x\x00\x00\u07d4\xf8\xd1t$\xc7g\xbe\xa3\x12\x05s\x9a+W\xa7'r\x14\uef89\x02F\xdd\xf9yvh\x00\x00\u07d4\xf8\xd5-\xcc_\x96\xcc(\x00{>\u02f4\t\xf7\xe2*dl\xaa\x89\b\x16\x90\xe1\x81(H\x00\x00\u07d4\xf8\xdc\xe8g\xf0\xa3\x9c[\xef\x9e\xeb\xa6\t\"\x9e\xfa\x02g\x8bl\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf8\xf2&\x14*B\x844\xab\x17\xa1\x86J%\x97\xf6J\xab/\x06\x89\tY\x8b/\xb2\xe9\xf2\x80\x00\u07d4\xf8\xf6d^\r\xeedK=\xad\x81\xd5q\uf6ef\x84\x00!\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf9\x01\xc0\x0f\xc1\u06c8\xb6\x9cK\xc3%+\\\xa7\x0e\xa6\xee\\\xf6\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xf9=[\xcb\x06D\xb0\xcc\xe5\xfc\u0763C\xf5\x16\x8f\xfa\xb2\x87}\x89\vb\a\xb6}&\xf9\x00\x00\u07d4\xf9W\x0e\x92L\x95\u07bbpa6\x97\x92\xcf.\xfe\u00a8-^\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xf9d \x86\xb1\xfb\xaea\xa6\x80M\xbe_\xb1^\xc2\u04b57\xf4\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf9d\x88i\x85\x90\xdc;,UVB\xb8q4\x8d\xfa\x06z\u0549\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf9d\u064d(\x170\xba5\xb2\xe3\xa3\x14yn{B\xfe\xdfg\x89S\xb0\x87`\x98\xd8\f\x00\x00\u07d4\xf9e\ri\x89\xf1\x99\xab\x1c\xc4ycm\xed0\xf2A\x02\x1fe\x89.\x14\x1e\xa0\x81\xca\b\x00\x00\xe0\x94\xf9h\x83X$Y\x90\x8c\x82v'\xe8o(\xe6F\xf9\xc7\xfcz\x8a\x01\u0127\x877\xcd\u03f8\x00\x00\u07d4\xf9kL\x00voSsj\x85t\xf8\"\xe6GL/!\xda-\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xf9r\x9dH(,\x9e\x87\x16m^\xef-\x01\xed\xa9\xdb\xf7\x88!\x89\x05k\x83\xdd\xc7(T\x80\x00\u07d4\xf9v~N\xcbJY\x80Ru\b\u05fe\xc3\xd4^Ld\x9c\x13\x89g\x8a\x93 b\xe4\x18\x00\x00\xe0\x94\xf9x\xb0%\xb6B3U\\\xc3\xc1\x9a\xda\u007fA\x99\xc94\x8b\xf7\x8aT\xb4\v\x1f\x85+\xda\x00\x00\x00\u07d4\xf9{V\xeb\u0577z\xbc\x9f\xba\u02eb\u0514\xb9\xd2\xc2!\xcd\x03\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xf9\x81\x1f\xa1\x9d\xad\xbf\x02\x9f\x8b\xfeV\x9a\xdb\x18\"\x8c\x80H\x1a\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xf9\x82Ps\fLa\xc5\u007f\x12\x985\xf2h\b\x94yEB\xf3\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xf9\x894gr\x99^\xc1\x90o\xaf\xfe\xba*\u007f\xe7\u079ck\xab\x8a\x01je\x02\xf1Z\x1eT\x00\x00\u07d4\xf9\x98\xca4\x11s\nl\xd1\x0etU\xb0A\x0f\xb0\xf6\xd3\xff\x80\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xf9\x9a\xeeDKW\x83\xc0\x93\xcf\xff\xd1\xc4c,\xf9\x90\x9f\xbb\x91\x1d/\x81\x92\xf8B\t\x89\x90\xf54`\x8ar\x88\x00\x00\u07d4\xf9\xbf\xb5\x9dS\x8a\xfcHt\xd4\xf5\x94\x1b\b\xc9s\x0e8\xe2K\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\u07d4\xf9\xdd#\x90\b\x18/\xb5\x19\xfb0\xee\xdd \x93\xfe\xd1c\x9b\xe8\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xf9\u07ba\xec\xb5\xf39\xbe\xeaH\x94\xe5 K\xfa4\r\x06\u007f%\x89ZB\x84Fs\xb1d\x00\x00\xe0\x94\xf9\xe3tG@lA!\x97\xb2\u2bbc\x00\x1dn0\u024c`\x8a\x01\xc4y\xbbCI\xc0\xee\x00\x00\u07d4\xf9\xe7\"/\xaa\xf0\xf4\xda@\xc1\u0124\x0607:\t\xbe\u05f6\x89\x9bO\u0730\x94V$\x00\x00\u07d4\xf9\xec\xe0\"\xbc\xcd,\x924i\x11\xe7\x9d\xd5\x03\x03\xc0\x1e\x01\x88\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfa\x00\xc3v\xe8\x9c\x05\u81c1z\x9d\xd0t\x8d\x96\xf3A\xaa\x89\x89\x10M\r\x00\u04b7\xf6\x00\x00\u07d4\xfa\f\x1a\x98\x8c\x8a\x17\xad5(\xeb(\xb3@\x9d\xaaX\"_&\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xfa\x10_\x1a\x11\xb6\xe4\xb1\xf5`\x12\xa2y\"\xe2\xac-\xa4\x81/\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xfa\x14/\xe4~\u0697\xe6P;8k\x18\xa2\xbe\xdds\u0335\xb1\x89.\x15:\xd8\x15H\x10\x00\x00\u07d4\xfa\x14\xb5f#J\xbe\xe70B\xc3\x1d!qq\x82\u02e1J\xa1\x89\x11\xc7\xea\x16.x \x00\x00\u07d4\xfa\x19\xd6\xf7\xa5\x0fO\a\x98\x93\xd1g\xbf\x14\xe2\x1d\x00s\u0456\x89\x1c\xbb:?\xf0\x8d\b\x00\x00\u07d4\xfa\x1f\x19q\xa7u\xc3PO\xefPy\xf6@\xc2\u013c\xe7\xac\x05\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfa'\x9b\xfd\x87g\xf9V\xbf\u007f\xa0\xbdV`\x16\x8d\xa7V\x86\xbd\x89\x90\xf54`\x8ar\x88\x00\x00\xe0\x94\xfa'\xccI\xd0\vl\x98s6\xa8u\xae9\xdaX\xfb\x04\x1b.\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xfa(2\x99`=\x87X\xe8\u02b0\x82\x12],\x8f}DT)\x8a\x01[\xca\xcb\x1e\x05\x01\xae\x80\x00\u07d4\xfa+\xbc\xa1]?\u37ca2\x8e\x91\xf9\r\xa1Oz\xc6%=\x89\n\u05ce\xbcZ\xc6 \x00\x00\xe0\x94\xfa/\u049d\x03\xfe\xe9\xa0x\x93\xdf:&\x9fV\xb7/.\x1ed\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xfa3U2\x85\xa9sq\x9a\r_\x95o\xf8a\xb2\u061e\xd3\x04\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfa:\fK\x90?n\xa5.\xa7\xab{\x88c\xb6\xa6\x16\xadfP\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfa:\x1a\xa4H\x8b5\x1a\xa7V\f\xf5\xeec\n/\xd4\\2\"\x89/\xa4~j\xa74\r\x00\x00\u07d4\xfaA\tq\xad\"\x9c06\xf4\x1a\u03c5/*\u0259(\x19P\x89\u0633\x11\xa8\xdd\xfa|\x00\x00\u07d4\xfaD\xa8U\xe4\x04\xc8m\f\xa8\xef3$%\x1d\xfb4\x9cS\x9e\x89T\"S\xa1&\xce@\x00\x00\xe0\x94\xfaR\x01\xfe\x13B\xaf\x110{\x91B\xa0A$<\xa9./\t\x8a 8\x11j:\xc0C\x98\x00\x00\xe0\x94\xfa`\x86\x8a\xaf\xd4\xffL\\W\x91K\x8e\u054bBWs\u07e9\x8a\x01\xcf\xe5\xc8\b\xf3\x9f\xbc\x00\x00\u07d4\xfag\xb6{O7\xa0\x15\t\x15\x11\x0e\xde\a;\x05\xb8S\xbd\xa2\x89#\x19\xba\x94sq\xad\x00\x00\u07d4\xfah\xe0\xcb>\xdfQ\xf0\xa6\xf2\x11\u0272\xcb^\a<\x9b\xff\xe6\x89\x0f\xc969(\x01\xc0\x00\x00\xe0\x94\xfaj7\xf0\x18\xe9yg\x93\u007f\xc5\xe8a{\xa1\u05c6\xdd_w\x8a\x04<0\xfb\b\x84\xa9l\x00\x00\u07d4\xfav\x06C[5l\xee%{\xd2\xfc\xd3\xd9\xea\xcb<\xd1\xc4\xe1\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xfaz\xdff\v\x8d\x99\xce\x15\x93=|_\a/<\xbe\xb9\x9d3\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4\xfa\x86\xca'\xbf(T\u0648p\x83\u007f\xb6\xf6\xdf\xe4\xbfdS\xfc\x89\x11u~\x85%\xcf\x14\x80\x00\u07d4\xfa\x8c\xf4\xe6'i\x8c]W\x88\xab\xb7\x88\x04\x17\xe7P#\x13\x99\x89\xe6\x1a6\x96\xee\xf6\x10\x00\x00\u07d4\xfa\x8e;\x1f\x13C9\x00s}\xaa\xf1\xf6)\x9cH\x87\xf8[_\x89&\u009eG\u0104L\x00\x00\u07d4\xfa\x9e\xc8\xef\xe0\x86\x86\xfaX\xc1\x813Xr\xbai\x85`\ucac9lj\xccg\u05f1\xd4\x00\x00\u07d4\xfa\xad\x90]\x84|{#A\x8a\xee\xcb\xe3\xad\u06cd\xd3\xf8\x92J\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xfa\xae\xba\x8f\xc0\xbb\xdaU<\xa7.0\xef=s.&\xe8 A\x89H\x8d(*\xaf\xc9\xf6\x80\x00\u07d4\xfa\xb4\x87P\r\xf2\x0f\xb8>\xbe\xd9\x16y\x1dV\x17r\xad\xbe\xbf\x89lkLM\xa6\u077e\x00\x00\u07d4\xfa\xc5\u0294u\x80x\xfb\xfc\xcd\x19\xdb5X\xda~\u8827h\x897(\xa6+\r\xcf\xf6\x00\x00\u07d4\xfa\xd9j\xb6\xacv\x8a\xd5\t\x94R\xacGw\xbd\x1aG\xed\u010f\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xfa\xe7g\x19\xd9~\xacA\x87\x04(\xe9@'\x9d\x97\xddW\xb2\xf6\x8a\x14\u06f2\x19\\\xa2(\x90\x00\x00\u07d4\xfa\u8053pG\x89Zf\f\xf2)v\x0f'\xe6h(\xd6C\x89\t\xdd\xc1\xe3\xb9\x01\x18\x00\x00\u07d4\xfa\xe9,\x13p\xe9\u115a]\xf8;V\xd0\xf5\x86\xaa;@L\x89\x05\u0174\xf3\xd8C\x98\x00\x00\xe0\x94\xfa\xf5\xf0\xb7\xb6\xd5X\xf5\t\r\x9e\xa1\xfb-B%\x9cX`x\x8a\x01Z\xff\xb8B\fkd\x00\x00\xe0\x94\xfb\x12o\x0e\xc7i\xf4\x9d\xce\xfc\xa2\xf2\x00(dQX0\x84\xb8\x8a\x01\x0f\xcb\xc25\x03\x96\xbf\x00\x00\xe0\x94\xfb\x13^\xb1Z\x8b\xacr\xb6\x99\x154*`\xbb\xc0k~\a|\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xfb\"<\x1e\"\xea\xc1&\x9b2\xee\x15jS\x85\x92.\xd3o\xb8\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfb7\xcfkO\x81\xa9\xe2\"\xfb\xa2.\x9b\xd2KP\x98\xb73\u03c9\x02\x1auJm\xc5(\x00\x00\u07d4\xfb8`\xf4\x12\x1cC.\xbd\xc8\xecj\x031\xb1\xb7\ty.\x90\x89 \x8c9J\xf1\u0208\x00\x00\u07d4\xfb9\x18\x9a\xf8v\xe7b\xc7\x1dl>t\x18\x93\xdf\"l\xed\u0589\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfb:\v\rkjq\x8fo\xc0)*\x82]\xc9$z\x90\xa5\u0409\n\xd6\xdd\x19\x9e\x97[\x00\x00\xe0\x94\xfb?\xa1\xac\b\xab\xa9\xcc;\xf0\xfe\x9dH8 h\x8fe\xb4\x10\x8a\x06ZM\xa2]0\x16\xc0\x00\x00\u07d4\xfb?\xe0\x9b\xb86\x86\x15)\xd7Q\x8d\xa2v5\xf58PV\x15\x89K\xe3\x92\x16\xfd\xa0p\x00\x00\xe0\x94\xfbQ%\xbf\x0f^\xb0\xb6\xf0 \xe5k\xfc/\xdf=@,\t~\x8a\x01@a\xb9\xd7z^\x98\x00\x00\u07d4\xfbU\x18qL\xef\xc3m\x04\x86]\xe5\x91^\xf0\xffG\xdf\xe7C\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfb_\xfa\xa0\xf7aW&5x\x91GX\x18\x93\x9d 7\u03d6\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfbh\\\x15\xe49\x96^\xf6&\xbf\r\x83L\u0468\x9f+V\x95\x89\u0556{\xe4\xfc?\x10\x00\x00\u07d4\xfbtK\x95\x1d\tK1\x02b\xc8\xf9\x86\xc8`\u07da\xb1\xdee\x89\x02\xd1\xc5\x15\xf1\xcbJ\x80\x00\u07d4\xfby\xab\u06d2\\U\xb9\xf9\x8e\xfe\xefd\xcf\xc9\xeba\xf5\x1b\xb1\x89a@\xc0V\xfb\n\xc8\x00\x00\u07d4\xfb\x81\x13\xf9M\x91s\xee\xfdZ0s\xf5\x16\x80:\x10\xb2\x86\xae\x89\x04V9\x18$O@\x00\x00\u07d4\xfb\x84,\xa2\xc5\xef\x139\x17\xa26\xa0\u052c@i\x01\x10\xb08\x89\x10\x96\x9ab\xbe\x15\x88\x00\x00\u07d4\xfb\x91\xfb\x1aiUS\xf0\u018e!'m\xec\xf0\xb89\t\xb8m\x89\x05l\x006\x17\xafx\x00\x00\u07d4\xfb\x94s\xcfw\x125\n\x1f\xa09Rs\xfc\x80V\aR\xe4\xfb\x89\x06\xaf!\x98\xba\x85\xaa\x00\x00\xe0\x94\xfb\x94\x9cd\u007f\xdc\xfd%\x14\xc7\u054e1\xf2\x8aS-\x8cX3\x8a\x04<3\xc1\x93ud\x80\x00\x00\u07d4\xfb\xa5HmS\xc6\xe2@IBA\xab\xf8~C\xc7`\rA:\x89k\xbfaIIH4\x00\x00\u07d4\xfb\xb1a\xfe\x87_\t)\nK&+\xc6\x01\x10\x84\x8f\r\"&\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfb\xbb\xeb\u03fe#^W\xdd#\x06\xad\x1a\x9e\u0141\xc7\xf9\xf4\x8f\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xfb\xc0\x1d\xb5NG\xcd\xc3\xc48iJ\xb7\x17\xa8V\xc2?\xe6\xe9\x8a\x01\xcaqP\xab\x17OG\x00\x00\xe0\x94\xfb\xcf\xccJ{\x0f&\xcf&\xe9\xf33!2\xe2\xfcj#\af\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xfb\xe7\x16\"\xbc\xbd1\xc1\xa3iv\xe7\xe5\xf6p\xc0\u007f\xfe\x16\u0789\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xfb\xed\xe3,4\x9f3\x00\xefL\xd3;M\xe7\xdc\x18\xe4C\xd3&\x89\xabM\xcf9\x9a:`\x00\x00\u07d4\xfb\xf2\x04\xc8\x13\xf86\xd89b\u01c7\fx\b\xca4\u007f\xd3>\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xfb\xf7Y3\xe0\x1bu\xb1T\xef\x06i\ak\xe8\u007fb\xdf\xfa\xe1\x8a\x10\x84cr\xf2I\xd4\xc0\x00\x00\u07d4\xfc\x00\x96\xb2\x1e\x95\xac\xb8\xd6\x19\xd1v\xa4\xa1\xd8\xd5)\xba\xdb\xef\x89\x14\xd9i;\xcb\xec\x02\x80\x00\xe0\x94\xfc\x00\xa4 \xa3a\a\xdf\xd5\xf4\x95\x12\x8a_\u5af2\xdb\x0f4\x8a\x01C\x17\x9d\x86\x91\x10 \x00\x00\xe0\x94\xfc\x01\x8ai\n\xd6tm\xbe:\u03d7\x12\xdd\xcaR\xb6%\x009\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\u07d4\xfc\x02s@3\xe5\u007fpQ~\n\xfc~\xe6$a\xf0o\xad\x8e\x89\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xfc\x0e\xe6\xf7\u00b3qJ\xe9\x91lEVf\x05\xb6V\xf3$A\x89_h\xe8\x13\x1e\u03c0\x00\x00\u07d4\xfc\x10\xb7\xa6{2h\xd53\x1b\xfbj\x14\xde\xf5\xeaJ\x16,\xa3\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xfc\x15\u02d9\xa8\xd1\x03\v\x12w\n\xdd\x03:y\xee\r\f\x90\x8c\x89\x12\xfa\x00\xbdR\xe6$\x00\x00\u07d4\xfc)R\xb4\u011f\xed\u043c\x05(\xa3\bI^mj\x1cq\u0589lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xfc,\x1f\x88\x96\x1d\x01\x9c>\x9e\xa30\t\x15.\x06\x93\xfb\xf8\x8a\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\xe0\x94\xfc6\x11\x05\u0750\xf9\xed\xe5fI\x9di\xe9\x13\x03\x95\xf1*\u020aS\xa4\xfe/ N\x80\xe0\x00\x00\u07d4\xfc7/\xf6\x92|\xb3\x96\xd9\xcf)\x805\x00\x11\r\xa62\xbcR\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfc9\xbeA\tK\x19\x97\xd2\x16\x9e\x82d\xc2\u00fa\xa6\u025b\u0109lk\x93[\x8b\xbd@\x00\x00\u07d4\xfc=\"k\xb3jX\xf5&V\x88W\xb0\xbb\x12\xd1\t\xec\x93\x01\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfcC\x82\x9a\u01c7\xff\x88\xaa\xf1\x83\xba5*\xad\xbfZ\x15\xb1\x93\x89\u05ac\n+\x05R\xe0\x00\x00\u07d4\xfcI\xc1C\x9aA\u05b3\xcf&\xbbg\xe06R$\xe5\xe3\x8f_\x8966\u05ef^\u024e\x00\x00\u07d4\xfcU\x00\x82Q\x05\xcfq*1\x8a^\x9c;\xfci\u021d\f\x12\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\xe0\x94\xfcf\xfa\xba'\u007fK]\xe6J\xd4^\xb1\x9c1\xe0\f\xed>\u054a\x011\xbe\xb9%\xff\xd3 \x00\x00\xe0\x94\xfc~\"\xa5\x03\xecZ\xbe\x9b\b\xc5\v\xd1I\x99\xf5 \xfaH\x84\x8a\x01ZG}\xfb\xe1\xea\x14\x80\x00\u07d4\xfc\x82\x15\xa0\xa6\x99\x13\xf6*C\xbf\x1c\x85\x90\xb9\xdd\xcd\r\x8d\u06c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xfc\x98\x9c\xb4\x87\xbf\x1a}\x17\xe4\xc1\xb7\u0137\xaa\xfd\xdak\n\x8d\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\xe0\x94\xfc\x9b4td\xb2\xf9\x92\x9d\x80~\x03\x9d\xaeH\xd3\u064d\xe3y\x8a\x02\xf6\xf1\a\x80\xd2,\xc0\x00\x00\u07d4\xfc\xa4;\xbc#\xa0\xd3!\xba\x9eF\xb9)s\\\xe7\xd8\xef\f\x18\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfc\xa7>\xff\x87q\xc0\x10;\xa3\xcc\x1a\x9c%\x94H\xc7*\xbf\v\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfc\xad\xa3\x00(?k\xcc\x13J\x91Eg`\xb0\xd7}\xe4\x10\xe0\x89lk\x93[\x8b\xbd@\x00\x00\xe0\x94\xfc\xbc\\q\xac\xe7\x97AE\v\x01,\xf6\xb8\xd3\xf1}\xb6\x8ap\x8a\x02\x05\xb4\u07e1\xeetx\x00\x00\u07d4\xfc\xbd\x85\xfe\xeajuO\xcf4ID\x9e7\xff\x97\x84\xf7w<\x89\xa7J\xdai\xab\xd7x\x00\x00\xe0\x94\xfc\xc9\u0524&.z\x02z\xb7Q\x91\x10\xd8\x02\u0115\xce\xea9\x8a\x01YQ\x82\"K&H\x00\x00\xe0\x94\xfc\xcd\r\x1e\xce\xe2z\xdd\xea\x95\xf6\x85z\xee\xc8\u01e0K(\xee\x8a\x02\x1e\x19\xe0\u027a\xb2@\x00\x00\xe0\x94\xfc\u0434\x82|\xd2\b\xff\xbf^u\x9d\xba\x8c<\xc6\x1d\x8c,<\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xfc\xe0\x89c\\\xe9z\xba\xc0kD\x81\x9b\xe5\xbb\n>.\v7\x89\x05\x03\x92\nv0\xa7\x80\x00\u07d4\xfc\xf1\x99\xf8\xb8T\"/\x18.N\x1d\t\x9dN2>*\xae\x01\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfc\xfc:P\x04\xd6xa?\v6\xa6B&\x9a\u007f7\x1c?j\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfd\x19\x1a5\x15}x\x13s\xfbA\x1b\xf9\xf2R\x90\x04|^\xef\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfd\x1f\xaa4{\x0f\u0300L-\xa8l6\xd5\xf1\u044bp\x87\xbb\x89\x02\xd6\xeb$z\x96\xf6\x00\x00\u07d4\xfd\x1f\xb5\xa8\x9a\x89\xa7!\xb8yph\xfb\xc4\u007f>\x9dR\xe1I\x89\f\u0435\x83\u007f\xc6X\x00\x00\u07d4\xfd OOJ\xba%%\xbar\x8a\xfd\xf7\x87\x92\xcb\u07b75\xae\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd'W\xcc5Q\xa0\x95\x87\x8d\x97\x87V\x15\xfe\fj2\xaa\x8a\x89 m\xb1R\x99\xbe\xac\x00\x00\u07d4\xfd(r\u045eW\x85<\xfa\x16\xef\xfe\x93\u0431\xd4{O\x93\xfb\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfd))'\x1e\x9d \x95\xa2dv~{\r\xf5.\xa0\xd1\xd4\x00\x89\xa2\xa1\xeb%\x1bZ\xe4\x00\x00\u07d4\xfd7z8Rr\x90\f\xb46\xa3\xbbyb\xcd\xff\xe9?]\xad\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd@$+\xb3Jp\x85^\xf0\xfd\x90\xf3\x80-\xec!6\xb3'\x89h\xa8u\a>)$\x00\x00\xe0\x94\xfdE,9i\xec\xe3\x80\x1cT \xf1\xcd\u02a1\xc7\x1e\xd2=\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\u07d4\xfdKU\x1fo\xdb\u0366\xc5\x11\xb5\xbb7\"P\xa6\xb7\x83\xe54\x89\x01\x1d\xe1\xe6\xdbE\f\x00\x00\u07d4\xfdK\x98\x95X\xae\x11\xbe\f;6\xe2\xd6\xf2\xa5J\x93C\xca.\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfdM\xe8\xe3t\x8a(\x9c\xf7\xd0`Q}\x9d88\x8d\xb0\x1f\xb8\x89\r\x8drkqw\xa8\x00\x00\u07d4\xfdZc\x15\u007f\x91O\u04d8\uac5c\x13}\xd9U\v\xb7q\\\x89\x05k\xc7^-c\x10\x00\x00\u07d4\xfd`\u04b5\xaf=5\xf7\xaa\xf0\u00d3\x05.y\xc4\xd8#\u0645\x89\x03\x0e\xb5\r.\x14\b\x00\x00\u07d4\xfdhm\xe5?\xa9\u007f\x99c\x9e%hT\x97 \xbcX\x8c\x9e\xfc\x89j\xc5\xc6-\x94\x86\a\x00\x00\u07d4\xfd~\u078fR@\xa0eA\xebi\x9dx,/\x9a\xfb!p\xf6\x89Hz\x9a0E9D\x00\x00\u07d4\xfd\x81+\u019f\xb1p\xefW\xe22~\x80\xaf\xfd\x14\xf8\xe4\xb6\u0489lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd\x88\xd1\x14\"\x0f\b\x1c\xb3\xd5\xe1[\xe8\x15*\xb0sfWj\x89\x10CV\x1a\x88)0\x00\x00\u07d4\xfd\x91\x856\xa8\xef\xa6\xf6\xce\xfe\x1f\xa1\x159\x95\xfe\xf5\xe3=;\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xfd\x92\x0fr&\x82\xaf\xb5\xafE\x1b\x05D\xd4\xf4\x1b;\x9dWB\x89~R\x05j\x12?<\x00\x00\u07d4\xfd\x95y\xf1\x19\xbb\xc8\x19\xa0+a\u3348\x03\xc9B\xf2M2\x89\x05\xb9~\x90\x81\xd9@\x00\x00\u07d4\xfd\xa0\xce\x153\a\a\xf1\v\xce2\x01\x17- \x18\xb9\xdd\xeat\x89\x02\xd0A\xd7\x05\xa2\xc6\x00\x00\xe0\x94\xfd\xa3\x04(\x19\xaf>f)\x00\xe1\xb9+CX\xed\xa6\xe9%\x90\x8a\x19\a\xa2\x84\u054fc\xe0\x00\x00\u07d4\xfd\xa6\x81\x0e\xa5\xac\x98]o\xfb\xf1\xc5\x11\xf1\xc1B\xed\xcf\xdd\xf7\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfd\xb39D\xf26\x06\x15\xe5\xbe#\x95w\u0221\x9b\xa5-\x98\x87\x89 \x9d\x92/RY\xc5\x00\x00\u07d4\xfd\xbaSY\xf7\xec;\xc7p\xacI\x97]\x84N\xc9qbV\xf1\x8965\u026d\xc5\u07a0\x00\x00\xe0\x94\xfd\xc4\xd4vZ\x94/[\xf9i1\xa9\xe8\xccz\xb8\xb7W\xffL\x8a\x12lG\x8a\x0e>\xa8`\x00\x00\xe0\x94\xfd\xcd]\x80\xb1\x05\x89zW\xab\xc4xev\x8b)\x00RB\x95\x8a\x01Z\xf1\u05cbX\xc4\x00\x00\x00\u0794\xfd\xd1\x19_y}O5q}\x15\xe6\xf9\x81\n\x9a?\xf5T`\x88\xfc\x93c\x92\x80\x1c\x00\x00\u07d4\xfd\xd5\x02\xa7N\x81;\u03e3U\xce\xda<\x17ojhq\xaf\u007f\x89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xfd\u357c\vm\\\xbbL\x1d\x8f\xea>\vK\xffc^\x9d\xb7\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd\xea\xac*\xcf\x1d\x13\x8e\x19\xf2\xfc?\x9f\xb7E\x92\xe3\ud04a\x89$=M\x18\"\x9c\xa2\x00\x00\u07d4\xfd\xec\xc8-\xdf\xc5a\x92\xe2oV<=h\xcbTJ\x96\xbf\xed\x89\x17\xda:\x04\u01f3\xe0\x00\x00\u07d4\xfd\xf4#C\x01\x9b\v\fk\xf2`\xb1s\xaf\xab~E\xb9\xd6!\x89lj\xccg\u05f1\xd4\x00\x00\u07d4\xfd\xf4I\xf1\b\xc6\xfbOZ+\b\x1e\xed~E\u645eM%\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfd\xfda4\xc0J\x8a\xb7\xeb\x16\xf0\x06C\xf8\xfe\xd7\u06aa\ucc89\x15\xaf\x1dx\xb5\x8c@\x00\x00\u07d4\xfe\x00\xbfC\x99\x11\xa5S\x98-\xb68\x03\x92E\xbc\xf02\xdb\u0709\x15[\xd90\u007f\x9f\xe8\x00\x00\u07d4\xfe\x01n\xc1~\xc5\xf1\x0e;\xb9\x8f\xf4\xa1\xed\xa0E\x15v\x82\xab\x89\x14_T\x02\xe7\xb2\xe6\x00\x00\u07d4\xfe\x0e0\xe2\x14)\rt=\xd3\x0e\xb0\x82\xf1\xf0\xa5\"Z\xdea\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xfe!\v\x8f\x04\xdcmOv!j\xcf\xcb\u055b\xa8;\xe9\xb60\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfe\"\xa0\xb3\x88f\x8d\x1a\xe2d>w\x1d\xac\xf3\x8aCB#\u0309\xd8\xdb^\xbd{&8\x00\x00\u07d4\xfe6&\x88\x84_\xa2D\u0300~K\x110\xeb7A\xa8\x05\x1e\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfe8'\xd5v0\u03c7a\xd5\x12y{\v\x85\x8eG\x8b\xbd\x12\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfeA\x8bB\x1a\x9cm76\x02y\x04u\xd20>\x11\xa7Y0\x897\b\xba\xed=h\x90\x00\x00\u07d4\xfeBI\x12yP\xe2\xf8\x96\xec\x0e~.=\x05Z\xab\x10U\x0f\x89$=M\x18\"\x9c\xa2\x00\x00\xe0\x94\xfeM\x84\x03!o\xd5qW+\xf1\xbd\xb0\x1d\x00W\x89x\u0588\x8a\x02\x15\xf85\xbcv\x9d\xa8\x00\x00\u07d4\xfeS\xb9I\x89\u0619d\xda aS\x95&\xbb\xe9y\xdd.\xa9\x89h\xa8u\a>)$\x00\x00\u07d4\xfeT\x9b\xbf\xe6G@\x18\x98\x92\x93%8\u06afF\u04b6\x1dO\x89\x02+\x1c\x8c\x12'\xa0\x00\x00\xe0\x94\xfea]\x97\\\b\x87\xe0\xc9\x11>\xc7)\x84 \xa7\x93\xaf\x8b\x96\x8a\x01\xb1\xaeMn.\xf5\x00\x00\x00\u07d4\xfee\xc4\x18\x8dy\"Wi\td D\xfd\xc5#\x95V\x01e\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfei\u007f\xf2,\xa5G\xbf\xc9^3\xd9`\xda`\\gc\xf3[\x89G\xd4\x11\x9f\xd9`\x94\x00\x00\u07d4\xfej\x89[y\\\xb4\xbf\x85\x90=<\xe0\x9cZ\xa49S\u04ff\x89\xb8Pz\x82\a( \x00\x00\u07d4\xfeo_B\xb6\x19;\x1a\xd1b\x06\u4bf5#\x9dM}\xb4^\x89]\u0212\xaa\x111\xc8\x00\x00\u07d4\xfep\x11\xb6\x98\xbf3q\x13-tE\xb1\x9e\xb5\xb0\x945j\xee\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfe\x80\xe9#-\xea\xff\x19\xba\xf9\x98i\x88:K\xdf\x00\x04\xe5<\x89.b\xf2\ni\xbe@\x00\x00\u07d4\xfe\x8en6eW\r\xffz\x1b\xdaiz\xa5\x89\xc0\xb4\xe9\x02J\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfe\x8f\x1f\u072b\u007f\xbe\u0266\xa3\xfc\xc5\aa\x96\x00P\\6\xa3\x89\x01\x11du\x9f\xfb2\x00\x00\u07d4\xfe\x91\xec\xcf+\xd5f\xaf\xa1\x16\x96\xc5\x04\x9f\xa8Lic\nR\x89i*\xe8\x89p\x81\xd0\x00\x00\u07d4\xfe\x96\xc4\xcd8\x15b@\x1a\xa3*\x86\xe6[\x9dR\xfa\x8a\xee'\x89\x8f\x1d\\\x1c\xae7@\x00\x00\u07d4\xfe\x98\xc6d\xc3\xe4G\xa9^i\xbdX!q\xb7\x17n\xa2\xa6\x85\x89\xd8\xd7&\xb7\x17z\x80\x00\x00\u07d4\xfe\x9a\xd1.\xf0]m\x90&\x1f\x96\xc84\n\x03\x81\x97M\xf4w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfe\x9c\x0f\xff\xef\xb8\x03\b\x12V\xc0\xcfMfY\xe6\xd3>\xb4\xfb\x89R\xd5B\x80O\x1c\xe0\x00\x00\u07d4\xfe\x9c\xfc;\xb2\x93\u0772\x85\xe6%\xf3X/t\xa6\xb0\xa5\xa6\u0349j\xcb=\xf2~\x1f\x88\x00\x00\xe0\x94\xfe\x9e\x11\x97\u05d7JvH\xdc\u01e01\x12\xa8\x8e\xdb\xc9\x04]\x8a\x01\n\xfc\x1a\xde;N\xd4\x00\x00\xe0\x94\xfe\xac\xa2\xactbK\xf3H\xda\u0258QC\xcf\xd6R\xa4\xbeU\x8a\x05\x89\u007f\u02f0)\x14\b\x80\x00\u07d4\xfe\xad\x18\x03\xe5\xe77\xa6\x8e\x18G-\x9a\xc7\x15\xf0\x99L\u00be\x89\x1b\x1a\xe4\xd6\xe2\xefP\x00\x00\u07d4\xfe\xb8\xb8\xe2\xafqj\xe4\x1f\xc7\xc0K\xcf)T\x01VF\x1ek\x89TQt\xa5(\xa7z\x00\x00\u07d4\xfe\xb9-0\xbf\x01\xff\x9a\x19\x01flUsS+\xfa\a\xee\xec\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xfe\xbc1s\xbc\x90r\x13cT\x00+{O\xb3\xbf\xc5?\"\xf1\x89\x14\x0e\xc8\x0f\xa7\xee\x88\x00\x00\u07d4\xfe\xbdH\xd0\xff\xdb\xd5el\xd5\xe6\x866:a\x14R(\xf2y\x89\x97\xc9\xceL\xf6\xd5\xc0\x00\x00\u07d4\xfe\xbd\x9f\x81\xcfx\xbd_\xb6\u0139\xa2K\xd4\x14\xbb\x9b\xfaLN\x89k\xe1\x0f\xb8\xedn\x13\x80\x00\u07d4\xfe\xc0o\xe2{D\u01c4\xb29n\xc9/{\x92:\xd1~\x90w\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xfe\xc1NT\x85\xde+>\xef^t\xc4aF\u06ceEN\x035\x89\t\xb4\x1f\xbf\x9e\n\xec\x00\x00\u07d4\xfe\xd8Gm\x10\u0544\xb3\x8b\xfag7`\x0e\xf1\x9d5\xc4\x1e\u0609b\xa9\x92\xe5:\n\xf0\x00\x00\u07d4\xfe\xef;n\xab\xc9J\xff\xd31\f\x1cM\x0ee7^\x13\x11\x19\x89\x01\x15\x8eF\t\x13\xd0\x00\x00\u07d4\xfe\xf0\x9dp$?9\xed\x8c\xd8\x00\xbf\x96QG\x9e\x8fJ\xca<\x89\n\u05ce\xbcZ\xc6 \x00\x00\u07d4\xfe\xf3\xb3\u07ad\x1ai&\u051a\xa3+\x12\xc2*\xf5M\x9f\xf9\x85\x8965\u026d\xc5\u07a0\x00\x00\u07d4\xff\v|\xb7\x1d\xa9\xd4\xc1\xean\xcc(\xeb\xdaPLc\xf8/\u04498\x8a\x88]\xf2\xfcl\x00\x00\u07d4\xff\f\xc6\u73c9lk\x93[\x8b\xbd@\x00\x00\u07d4\xff'&)AH\xb8lx\xa97$\x97\xe4Y\x89\x8e\xd3\xfe\xe3\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xff=\xedz@\u04ef\xf0\u05e8\xc4_\xa6\x13j\xa0C=\xb4W\x89lh\xcc\u041b\x02,\x00\x00\u07d4\xff>\xeeW\xc3Mm\xae\x97\r\x8b1\x11\x17\xc55\x86\xcd5\x02\x89\\(=A\x03\x94\x10\x00\x00\u07d4\xff>\xf6\xba\x15\x1c!\xb5\x99\x86\xaed\xf6\xe8\"\x8b\u0262\xc73\x89lk\x93[\x8b\xbd@\x00\x00\u07d4\xffA\xd9\xe1\xb4\xef\xfe\x18\u0630\xd1\xf6?\xc4%_\xb4\xe0l=\x89Hz\x9a0E9D\x00\x00\u07d4\xffE\xcb4\xc9(6M\x9c\xc9\u063b\x0074ta\x8f\x06\xf3\x89\x05k\xc7^-c\x10\x00\x00\xe0\x94\xffI\xa7u\x81N\xc0\x00Q\xa7\x95\xa8u\xde$Y.\xa4\x00\u050a*Z\x05\x8f\u0095\xed\x00\x00\x00\u07d4\xffJ@\x8fP\xe9\xe7!F\xa2\x8c\xe4\xfc\x8d\x90'\x1f\x11n\x84\x89j\xcb=\xf2~\x1f\x88\x00\x00\u07d4\xffM\x9c\x84\x84\xc4\x10T\x89H\xa4\x80\xc2?\x80\xc2@\x80\xc2A\x80\xc2B\x80\xc2C\x80\xc2D\x80\xc2E\x80\xc2F\x80\xc2G\x80\xc2H\x80\xc2I\x80\xc2J\x80\xc2K\x80\xc2L\x80\xc2M\x80\xc2N\x80\xc2O\x80\xc2P\x80\xc2Q\x80\xc2R\x80\xc2S\x80\xc2T\x80\xc2U\x80\xc2V\x80\xc2W\x80\xc2X\x80\xc2Y\x80\xc2Z\x80\xc2[\x80\xc2\\\x80\xc2]\x80\xc2^\x80\xc2_\x80\xc2`\x80\xc2a\x80\xc2b\x80\xc2c\x80\xc2d\x80\xc2e\x80\xc2f\x80\xc2g\x80\xc2h\x80\xc2i\x80\xc2j\x80\xc2k\x80\xc2l\x80\xc2m\x80\xc2n\x80\xc2o\x80\xc2p\x80\xc2q\x80\xc2r\x80\xc2s\x80\xc2t\x80\xc2u\x80\xc2v\x80\xc2w\x80\xc2x\x80\xc2y\x80\xc2z\x80\xc2{\x80\xc2|\x80\xc2}\x80\xc2~\x80\xc2\u007f\x80\u00c1\x80\x80\u00c1\x81\x80\u00c1\x82\x80\u00c1\x83\x80\u00c1\x84\x80\u00c1\x85\x80\u00c1\x86\x80\u00c1\x87\x80\u00c1\x88\x80\u00c1\x89\x80\u00c1\x8a\x80\u00c1\x8b\x80\u00c1\x8c\x80\u00c1\x8d\x80\u00c1\x8e\x80\u00c1\x8f\x80\u00c1\x90\x80\u00c1\x91\x80\u00c1\x92\x80\u00c1\x93\x80\u00c1\x94\x80\u00c1\x95\x80\u00c1\x96\x80\u00c1\x97\x80\u00c1\x98\x80\u00c1\x99\x80\u00c1\x9a\x80\u00c1\x9b\x80\u00c1\x9c\x80\u00c1\x9d\x80\u00c1\x9e\x80\u00c1\x9f\x80\u00c1\xa0\x80\u00c1\xa1\x80\u00c1\xa2\x80\u00c1\xa3\x80\u00c1\xa4\x80\u00c1\xa5\x80\u00c1\xa6\x80\u00c1\xa7\x80\u00c1\xa8\x80\u00c1\xa9\x80\u00c1\xaa\x80\u00c1\xab\x80\u00c1\xac\x80\u00c1\xad\x80\u00c1\xae\x80\u00c1\xaf\x80\u00c1\xb0\x80\u00c1\xb1\x80\u00c1\xb2\x80\u00c1\xb3\x80\u00c1\xb4\x80\u00c1\xb5\x80\u00c1\xb6\x80\u00c1\xb7\x80\u00c1\xb8\x80\u00c1\xb9\x80\u00c1\xba\x80\u00c1\xbb\x80\u00c1\xbc\x80\u00c1\xbd\x80\u00c1\xbe\x80\u00c1\xbf\x80\u00c1\xc0\x80\u00c1\xc1\x80\u00c1\u0080\u00c1\u00c0\u00c1\u0100\u00c1\u0140\u00c1\u0180\u00c1\u01c0\u00c1\u0200\u00c1\u0240\u00c1\u0280\u00c1\u02c0\u00c1\u0300\u00c1\u0340\u00c1\u0380\u00c1\u03c0\u00c1\u0400\u00c1\u0440\u00c1\u0480\u00c1\u04c0\u00c1\u0500\u00c1\u0540\u00c1\u0580\u00c1\u05c0\u00c1\u0600\u00c1\u0640\u00c1\u0680\u00c1\u06c0\u00c1\u0700\u00c1\u0740\u00c1\u0780\u00c1\u07c0\u00c1\xe0\x80\u00c1\xe1\x80\u00c1\xe2\x80\u00c1\xe3\x80\u00c1\xe4\x80\u00c1\xe5\x80\u00c1\xe6\x80\u00c1\xe7\x80\u00c1\xe8\x80\u00c1\xe9\x80\u00c1\xea\x80\u00c1\xeb\x80\u00c1\xec\x80\u00c1\xed\x80\u00c1\xee\x80\u00c1\xef\x80\u00c1\xf0\x80\u00c1\xf1\x80\u00c1\xf2\x80\u00c1\xf3\x80\u00c1\xf4\x80\u00c1\xf5\x80\u00c1\xf6\x80\u00c1\xf7\x80\u00c1\xf8\x80\u00c1\xf9\x80\u00c1\xfa\x80\u00c1\xfb\x80\u00c1\xfc\x80\u00c1\xfd\x80\u00c1\xfe\x80\u00c1\xff\x80\u3507KT\xa8\xbd\x15)f\xd6?pk\xae\x1f\xfe\xb0A\x19!\xe5\x8d\f\x9f,\x9c\xd0Ft\xed\xea@\x00\x00\x00" const rinkebyAllocData = "\xf9\x03\xb7\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03\x01\xc2\x04\x01\xc2\x05\x01\xc2\x06\x01\xc2\a\x01\xc2\b\x01\xc2\t\x01\xc2\n\x01\xc2\v\x01\xc2\f\x01\xc2\r\x01\xc2\x0e\x01\xc2\x0f\x01\xc2\x10\x01\xc2\x11\x01\xc2\x12\x01\xc2\x13\x01\xc2\x14\x01\xc2\x15\x01\xc2\x16\x01\xc2\x17\x01\xc2\x18\x01\xc2\x19\x01\xc2\x1a\x01\xc2\x1b\x01\xc2\x1c\x01\xc2\x1d\x01\xc2\x1e\x01\xc2\x1f\x01\xc2 \x01\xc2!\x01\xc2\"\x01\xc2#\x01\xc2$\x01\xc2%\x01\xc2&\x01\xc2'\x01\xc2(\x01\xc2)\x01\xc2*\x01\xc2+\x01\xc2,\x01\xc2-\x01\xc2.\x01\xc2/\x01\xc20\x01\xc21\x01\xc22\x01\xc23\x01\xc24\x01\xc25\x01\xc26\x01\xc27\x01\xc28\x01\xc29\x01\xc2:\x01\xc2;\x01\xc2<\x01\xc2=\x01\xc2>\x01\xc2?\x01\xc2@\x01\xc2A\x01\xc2B\x01\xc2C\x01\xc2D\x01\xc2E\x01\xc2F\x01\xc2G\x01\xc2H\x01\xc2I\x01\xc2J\x01\xc2K\x01\xc2L\x01\xc2M\x01\xc2N\x01\xc2O\x01\xc2P\x01\xc2Q\x01\xc2R\x01\xc2S\x01\xc2T\x01\xc2U\x01\xc2V\x01\xc2W\x01\xc2X\x01\xc2Y\x01\xc2Z\x01\xc2[\x01\xc2\\\x01\xc2]\x01\xc2^\x01\xc2_\x01\xc2`\x01\xc2a\x01\xc2b\x01\xc2c\x01\xc2d\x01\xc2e\x01\xc2f\x01\xc2g\x01\xc2h\x01\xc2i\x01\xc2j\x01\xc2k\x01\xc2l\x01\xc2m\x01\xc2n\x01\xc2o\x01\xc2p\x01\xc2q\x01\xc2r\x01\xc2s\x01\xc2t\x01\xc2u\x01\xc2v\x01\xc2w\x01\xc2x\x01\xc2y\x01\xc2z\x01\xc2{\x01\xc2|\x01\xc2}\x01\xc2~\x01\xc2\u007f\x01\u00c1\x80\x01\u00c1\x81\x01\u00c1\x82\x01\u00c1\x83\x01\u00c1\x84\x01\u00c1\x85\x01\u00c1\x86\x01\u00c1\x87\x01\u00c1\x88\x01\u00c1\x89\x01\u00c1\x8a\x01\u00c1\x8b\x01\u00c1\x8c\x01\u00c1\x8d\x01\u00c1\x8e\x01\u00c1\x8f\x01\u00c1\x90\x01\u00c1\x91\x01\u00c1\x92\x01\u00c1\x93\x01\u00c1\x94\x01\u00c1\x95\x01\u00c1\x96\x01\u00c1\x97\x01\u00c1\x98\x01\u00c1\x99\x01\u00c1\x9a\x01\u00c1\x9b\x01\u00c1\x9c\x01\u00c1\x9d\x01\u00c1\x9e\x01\u00c1\x9f\x01\u00c1\xa0\x01\u00c1\xa1\x01\u00c1\xa2\x01\u00c1\xa3\x01\u00c1\xa4\x01\u00c1\xa5\x01\u00c1\xa6\x01\u00c1\xa7\x01\u00c1\xa8\x01\u00c1\xa9\x01\u00c1\xaa\x01\u00c1\xab\x01\u00c1\xac\x01\u00c1\xad\x01\u00c1\xae\x01\u00c1\xaf\x01\u00c1\xb0\x01\u00c1\xb1\x01\u00c1\xb2\x01\u00c1\xb3\x01\u00c1\xb4\x01\u00c1\xb5\x01\u00c1\xb6\x01\u00c1\xb7\x01\u00c1\xb8\x01\u00c1\xb9\x01\u00c1\xba\x01\u00c1\xbb\x01\u00c1\xbc\x01\u00c1\xbd\x01\u00c1\xbe\x01\u00c1\xbf\x01\u00c1\xc0\x01\u00c1\xc1\x01\u00c1\xc2\x01\u00c1\xc3\x01\u00c1\xc4\x01\u00c1\xc5\x01\u00c1\xc6\x01\u00c1\xc7\x01\u00c1\xc8\x01\u00c1\xc9\x01\u00c1\xca\x01\u00c1\xcb\x01\u00c1\xcc\x01\u00c1\xcd\x01\u00c1\xce\x01\u00c1\xcf\x01\u00c1\xd0\x01\u00c1\xd1\x01\u00c1\xd2\x01\u00c1\xd3\x01\u00c1\xd4\x01\u00c1\xd5\x01\u00c1\xd6\x01\u00c1\xd7\x01\u00c1\xd8\x01\u00c1\xd9\x01\u00c1\xda\x01\u00c1\xdb\x01\u00c1\xdc\x01\u00c1\xdd\x01\u00c1\xde\x01\u00c1\xdf\x01\u00c1\xe0\x01\u00c1\xe1\x01\u00c1\xe2\x01\u00c1\xe3\x01\u00c1\xe4\x01\u00c1\xe5\x01\u00c1\xe6\x01\u00c1\xe7\x01\u00c1\xe8\x01\u00c1\xe9\x01\u00c1\xea\x01\u00c1\xeb\x01\u00c1\xec\x01\u00c1\xed\x01\u00c1\xee\x01\u00c1\xef\x01\u00c1\xf0\x01\u00c1\xf1\x01\u00c1\xf2\x01\u00c1\xf3\x01\u00c1\xf4\x01\u00c1\xf5\x01\u00c1\xf6\x01\u00c1\xf7\x01\u00c1\xf8\x01\u00c1\xf9\x01\u00c1\xfa\x01\u00c1\xfb\x01\u00c1\xfc\x01\u00c1\xfd\x01\u00c1\xfe\x01\u00c1\xff\x01\xf6\x941\xb9\x8d\x14\x00{\xde\xe67)\x80\x86\x98\x8a\v\xbd1\x18E#\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +const goerliAllocData = "\xf9\x04\x06\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03\x01\xc2\x04\x01\xc2\x05\x01\xc2\x06\x01\xc2\a\x01\xc2\b\x01\xc2\t\x01\xc2\n\x01\xc2\v\x01\xc2\f\x01\xc2\r\x01\xc2\x0e\x01\xc2\x0f\x01\xc2\x10\x01\xc2\x11\x01\xc2\x12\x01\xc2\x13\x01\xc2\x14\x01\xc2\x15\x01\xc2\x16\x01\xc2\x17\x01\xc2\x18\x01\xc2\x19\x01\xc2\x1a\x01\xc2\x1b\x01\xc2\x1c\x01\xc2\x1d\x01\xc2\x1e\x01\xc2\x1f\x01\xc2 \x01\xc2!\x01\xc2\"\x01\xc2#\x01\xc2$\x01\xc2%\x01\xc2&\x01\xc2'\x01\xc2(\x01\xc2)\x01\xc2*\x01\xc2+\x01\xc2,\x01\xc2-\x01\xc2.\x01\xc2/\x01\xc20\x01\xc21\x01\xc22\x01\xc23\x01\xc24\x01\xc25\x01\xc26\x01\xc27\x01\xc28\x01\xc29\x01\xc2:\x01\xc2;\x01\xc2<\x01\xc2=\x01\xc2>\x01\xc2?\x01\xc2@\x01\xc2A\x01\xc2B\x01\xc2C\x01\xc2D\x01\xc2E\x01\xc2F\x01\xc2G\x01\xc2H\x01\xc2I\x01\xc2J\x01\xc2K\x01\xc2L\x01\xc2M\x01\xc2N\x01\xc2O\x01\xc2P\x01\xc2Q\x01\xc2R\x01\xc2S\x01\xc2T\x01\xc2U\x01\xc2V\x01\xc2W\x01\xc2X\x01\xc2Y\x01\xc2Z\x01\xc2[\x01\xc2\\\x01\xc2]\x01\xc2^\x01\xc2_\x01\xc2`\x01\xc2a\x01\xc2b\x01\xc2c\x01\xc2d\x01\xc2e\x01\xc2f\x01\xc2g\x01\xc2h\x01\xc2i\x01\xc2j\x01\xc2k\x01\xc2l\x01\xc2m\x01\xc2n\x01\xc2o\x01\xc2p\x01\xc2q\x01\xc2r\x01\xc2s\x01\xc2t\x01\xc2u\x01\xc2v\x01\xc2w\x01\xc2x\x01\xc2y\x01\xc2z\x01\xc2{\x01\xc2|\x01\xc2}\x01\xc2~\x01\xc2\u007f\x01\u00c1\x80\x01\u00c1\x81\x01\u00c1\x82\x01\u00c1\x83\x01\u00c1\x84\x01\u00c1\x85\x01\u00c1\x86\x01\u00c1\x87\x01\u00c1\x88\x01\u00c1\x89\x01\u00c1\x8a\x01\u00c1\x8b\x01\u00c1\x8c\x01\u00c1\x8d\x01\u00c1\x8e\x01\u00c1\x8f\x01\u00c1\x90\x01\u00c1\x91\x01\u00c1\x92\x01\u00c1\x93\x01\u00c1\x94\x01\u00c1\x95\x01\u00c1\x96\x01\u00c1\x97\x01\u00c1\x98\x01\u00c1\x99\x01\u00c1\x9a\x01\u00c1\x9b\x01\u00c1\x9c\x01\u00c1\x9d\x01\u00c1\x9e\x01\u00c1\x9f\x01\u00c1\xa0\x01\u00c1\xa1\x01\u00c1\xa2\x01\u00c1\xa3\x01\u00c1\xa4\x01\u00c1\xa5\x01\u00c1\xa6\x01\u00c1\xa7\x01\u00c1\xa8\x01\u00c1\xa9\x01\u00c1\xaa\x01\u00c1\xab\x01\u00c1\xac\x01\u00c1\xad\x01\u00c1\xae\x01\u00c1\xaf\x01\u00c1\xb0\x01\u00c1\xb1\x01\u00c1\xb2\x01\u00c1\xb3\x01\u00c1\xb4\x01\u00c1\xb5\x01\u00c1\xb6\x01\u00c1\xb7\x01\u00c1\xb8\x01\u00c1\xb9\x01\u00c1\xba\x01\u00c1\xbb\x01\u00c1\xbc\x01\u00c1\xbd\x01\u00c1\xbe\x01\u00c1\xbf\x01\u00c1\xc0\x01\u00c1\xc1\x01\u00c1\xc2\x01\u00c1\xc3\x01\u00c1\xc4\x01\u00c1\xc5\x01\u00c1\xc6\x01\u00c1\xc7\x01\u00c1\xc8\x01\u00c1\xc9\x01\u00c1\xca\x01\u00c1\xcb\x01\u00c1\xcc\x01\u00c1\xcd\x01\u00c1\xce\x01\u00c1\xcf\x01\u00c1\xd0\x01\u00c1\xd1\x01\u00c1\xd2\x01\u00c1\xd3\x01\u00c1\xd4\x01\u00c1\xd5\x01\u00c1\xd6\x01\u00c1\xd7\x01\u00c1\xd8\x01\u00c1\xd9\x01\u00c1\xda\x01\u00c1\xdb\x01\u00c1\xdc\x01\u00c1\xdd\x01\u00c1\xde\x01\u00c1\xdf\x01\u00c1\xe0\x01\u00c1\xe1\x01\u00c1\xe2\x01\u00c1\xe3\x01\u00c1\xe4\x01\u00c1\xe5\x01\u00c1\xe6\x01\u00c1\xe7\x01\u00c1\xe8\x01\u00c1\xe9\x01\u00c1\xea\x01\u00c1\xeb\x01\u00c1\xec\x01\u00c1\xed\x01\u00c1\xee\x01\u00c1\xef\x01\u00c1\xf0\x01\u00c1\xf1\x01\u00c1\xf2\x01\u00c1\xf3\x01\u00c1\xf4\x01\u00c1\xf5\x01\u00c1\xf6\x01\u00c1\xf7\x01\u00c1\xf8\x01\u00c1\xf9\x01\u00c1\xfa\x01\u00c1\xfb\x01\u00c1\xfc\x01\u00c1\xfd\x01\u00c1\xfe\x01\u00c1\xff\x01\xe0\x94L*\xe4\x82Y5\x05\xf0\x16<\xde\xfc\a>\x81\xc6<\xdaA\a\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\xa8\xe8\xf1G2e\x8eKQ\xe8q\x191\x05:\x8ai\xba\xf2\xb1\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe1\x94\u0665\x17\x9f\t\x1d\x85\x05\x1d<\x98'\x85\xef\xd1E\\\uc199\x8b\bE\x95\x16\x14\x01HJ\x00\x00\x00\xe1\x94\u08bdBX\xd2v\x887\xba\xa2j(\xfeq\xdc\a\x9f\x84\u01cbJG\xe3\xc1$H\xf4\xad\x00\x00\x00" diff --git a/core/genesis_test.go b/core/genesis_test.go index c7d54f20571b..c6bcd0aa54bd 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -141,7 +141,7 @@ func TestSetupGenesis(t *testing.T) { } for _, test := range tests { - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() config, hash, err := test.fn(db) // Check the return values. if !reflect.DeepEqual(err, test.wantErr) { diff --git a/core/headerchain.go b/core/headerchain.go index d2093113c0e2..034858f651cf 100644 --- a/core/headerchain.go +++ b/core/headerchain.go @@ -33,7 +33,7 @@ import ( "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" - "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru" ) const ( @@ -104,6 +104,7 @@ func NewHeaderChain(chainDb ethdb.Database, config *params.ChainConfig, engine c } } hc.currentHeaderHash = hc.CurrentHeader().Hash() + headHeaderGauge.Update(hc.CurrentHeader().Number.Int64()) return hc, nil } @@ -185,12 +186,12 @@ func (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, er hc.currentHeaderHash = hash hc.currentHeader.Store(types.CopyHeader(header)) + headHeaderGauge.Update(header.Number.Int64()) status = CanonStatTy } else { status = SideStatTy } - hc.headerCache.Add(hash, header) hc.numberCache.Add(hash, number) @@ -219,14 +220,18 @@ func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) // Generate the list of seal verification requests, and start the parallel verifier seals := make([]bool, len(chain)) - for i := 0; i < len(seals)/checkFreq; i++ { - index := i*checkFreq + hc.rand.Intn(checkFreq) - if index >= len(seals) { - index = len(seals) - 1 + if checkFreq != 0 { + // In case of checkFreq == 0 all seals are left false. + for i := 0; i < len(seals)/checkFreq; i++ { + index := i*checkFreq + hc.rand.Intn(checkFreq) + if index >= len(seals) { + index = len(seals) - 1 + } + seals[index] = true } - seals[index] = true + // Last should always be verified to avoid junk. + seals[len(seals)-1] = true } - seals[len(seals)-1] = true // Last should always be verified to avoid junk abort, results := hc.engine.VerifyHeaders(hc, chain, seals) defer close(abort) @@ -270,9 +275,14 @@ func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, writeHeader WhCa return i, errors.New("aborted") } // If the header's already known, skip it, otherwise store - if hc.HasHeader(header.Hash(), header.Number.Uint64()) { - stats.ignored++ - continue + hash := header.Hash() + if hc.HasHeader(hash, header.Number.Uint64()) { + externTd := hc.GetTd(hash, header.Number.Uint64()) + localTd := hc.GetTd(hc.currentHeaderHash, hc.CurrentHeader().Number.Uint64()) + if externTd == nil || externTd.Cmp(localTd) <= 0 { + stats.ignored++ + continue + } } if err := writeHeader(header); err != nil { return i, err @@ -286,7 +296,7 @@ func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, writeHeader WhCa "count", stats.processed, "elapsed", common.PrettyDuration(time.Since(start)), "number", last.Number, "hash", last.Hash(), } - if timestamp := time.Unix(last.Time.Int64(), 0); time.Since(timestamp) > time.Minute { + if timestamp := time.Unix(int64(last.Time), 0); time.Since(timestamp) > time.Minute { context = append(context, []interface{}{"age", common.PrettyAge(timestamp)}...) } if stats.ignored > 0 { @@ -447,35 +457,60 @@ func (hc *HeaderChain) SetCurrentHeader(head *types.Header) { hc.currentHeader.Store(head) hc.currentHeaderHash = head.Hash() + headHeaderGauge.Update(head.Number.Int64()) } -// DeleteCallback is a callback function that is called by SetHead before -// each header is deleted. -type DeleteCallback func(rawdb.DatabaseDeleter, common.Hash, uint64) +type ( + // UpdateHeadBlocksCallback is a callback function that is called by SetHead + // before head header is updated. + UpdateHeadBlocksCallback func(ethdb.KeyValueWriter, *types.Header) + + // DeleteBlockContentCallback is a callback function that is called by SetHead + // before each header is deleted. + DeleteBlockContentCallback func(ethdb.KeyValueWriter, common.Hash, uint64) +) // SetHead rewinds the local chain to a new head. Everything above the new head // will be deleted and the new one set. -func (hc *HeaderChain) SetHead(head uint64, delFn DeleteCallback) { - height := uint64(0) - - if hdr := hc.CurrentHeader(); hdr != nil { - height = hdr.Number.Uint64() - } - batch := hc.chainDb.NewBatch() +func (hc *HeaderChain) SetHead(head uint64, updateFn UpdateHeadBlocksCallback, delFn DeleteBlockContentCallback) { + var ( + parentHash common.Hash + batch = hc.chainDb.NewBatch() + ) for hdr := hc.CurrentHeader(); hdr != nil && hdr.Number.Uint64() > head; hdr = hc.CurrentHeader() { - hash := hdr.Hash() - num := hdr.Number.Uint64() + hash, num := hdr.Hash(), hdr.Number.Uint64() + + // Rewind block chain to new head. + parent := hc.GetHeader(hdr.ParentHash, num-1) + if parent == nil { + parent = hc.genesisHeader + } + parentHash = hdr.ParentHash + // Notably, since geth has the possibility for setting the head to a low + // height which is even lower than ancient head. + // In order to ensure that the head is always no higher than the data in + // the database(ancient store or active store), we need to update head + // first then remove the relative data from the database. + // + // Update head first(head fast block, head full block) before deleting the data. + if updateFn != nil { + updateFn(hc.chainDb, parent) + } + // Update head header then. + rawdb.WriteHeadHeaderHash(hc.chainDb, parentHash) + + // Remove the relative data from the database. if delFn != nil { delFn(batch, hash, num) } + // Rewind header chain to new head. rawdb.DeleteHeader(batch, hash, num) rawdb.DeleteTd(batch, hash, num) + rawdb.DeleteCanonicalHash(batch, num) - hc.currentHeader.Store(hc.GetHeader(hdr.ParentHash, hdr.Number.Uint64()-1)) - } - // Roll back the canonical chain numbering - for i := height; i > head; i-- { - rawdb.DeleteCanonicalHash(batch, i) + hc.currentHeader.Store(parent) + hc.currentHeaderHash = parentHash + headHeaderGauge.Update(parent.Number.Int64()) } batch.Write() @@ -483,13 +518,6 @@ func (hc *HeaderChain) SetHead(head uint64, delFn DeleteCallback) { hc.headerCache.Purge() hc.tdCache.Purge() hc.numberCache.Purge() - - if hc.CurrentHeader() == nil { - hc.currentHeader.Store(hc.genesisHeader) - } - hc.currentHeaderHash = hc.CurrentHeader().Hash() - - rawdb.WriteHeadHeaderHash(hc.chainDb, hc.currentHeaderHash) } // SetGenesis sets a new genesis block header for the chain diff --git a/core/helper_test.go b/core/helper_test.go index 051384d8547b..e61c92dcdd23 100644 --- a/core/helper_test.go +++ b/core/helper_test.go @@ -19,6 +19,7 @@ package core import ( "container/list" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -78,7 +79,7 @@ func (tm *TestManager) Db() ethdb.Database { func NewTestManager() *TestManager { testManager := &TestManager{} testManager.eventMux = new(event.TypeMux) - testManager.db = ethdb.NewMemDatabase() + testManager.db = rawdb.NewMemoryDatabase() // testManager.txPool = NewTxPool(testManager) // testManager.blockChain = NewBlockChain(testManager) // testManager.stateManager = NewStateManager(testManager) diff --git a/core/mkalloc.go b/core/mkalloc.go index 565e8c5826d4..5118a4fcb327 100644 --- a/core/mkalloc.go +++ b/core/mkalloc.go @@ -52,7 +52,8 @@ func makelist(g *core.Genesis) allocList { if len(account.Storage) > 0 || len(account.Code) > 0 || account.Nonce != 0 { panic(fmt.Sprintf("can't encode account %x", addr)) } - a = append(a, allocItem{addr.Big(), account.Balance}) + bigAddr := new(big.Int).SetBytes(addr.Bytes()) + a = append(a, allocItem{bigAddr, account.Balance}) } sort.Sort(a) return a diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go index da543283265f..fab7ca56c3a5 100644 --- a/core/rawdb/accessors_chain.go +++ b/core/rawdb/accessors_chain.go @@ -23,13 +23,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" ) // ReadCanonicalHash retrieves the hash assigned to a canonical block number. -func ReadCanonicalHash(db DatabaseReader, number uint64) common.Hash { - data, _ := db.Get(headerHashKey(number)) +func ReadCanonicalHash(db ethdb.Reader, number uint64) common.Hash { + data, _ := db.Ancient(freezerHashTable, number) + if len(data) == 0 { + data, _ = db.Get(headerHashKey(number)) + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + if len(data) == 0 { + data, _ = db.Ancient(freezerHashTable, number) + } + } if len(data) == 0 { return common.Hash{} } @@ -37,21 +49,38 @@ func ReadCanonicalHash(db DatabaseReader, number uint64) common.Hash { } // WriteCanonicalHash stores the hash assigned to a canonical block number. -func WriteCanonicalHash(db DatabaseWriter, hash common.Hash, number uint64) { +func WriteCanonicalHash(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { if err := db.Put(headerHashKey(number), hash.Bytes()); err != nil { log.Crit("Failed to store number to hash mapping", "err", err) } } // DeleteCanonicalHash removes the number to hash canonical mapping. -func DeleteCanonicalHash(db DatabaseDeleter, number uint64) { +func DeleteCanonicalHash(db ethdb.KeyValueWriter, number uint64) { if err := db.Delete(headerHashKey(number)); err != nil { log.Crit("Failed to delete number to hash mapping", "err", err) } } +// ReadAllHashes retrieves all the hashes assigned to blocks at a certain heights, +// both canonical and reorged forks included. +func ReadAllHashes(db ethdb.Iteratee, number uint64) []common.Hash { + prefix := headerKeyPrefix(number) + + hashes := make([]common.Hash, 0, 1) + it := db.NewIteratorWithPrefix(prefix) + defer it.Release() + + for it.Next() { + if key := it.Key(); len(key) == len(prefix)+32 { + hashes = append(hashes, common.BytesToHash(key[len(key)-32:])) + } + } + return hashes +} + // ReadHeaderNumber returns the header number assigned to a hash. -func ReadHeaderNumber(db DatabaseReader, hash common.Hash) *uint64 { +func ReadHeaderNumber(db ethdb.KeyValueReader, hash common.Hash) *uint64 { data, _ := db.Get(headerNumberKey(hash)) if len(data) != 8 { return nil @@ -60,8 +89,24 @@ func ReadHeaderNumber(db DatabaseReader, hash common.Hash) *uint64 { return &number } +// WriteHeaderNumber stores the hash->number mapping. +func WriteHeaderNumber(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { + key := headerNumberKey(hash) + enc := encodeBlockNumber(number) + if err := db.Put(key, enc); err != nil { + log.Crit("Failed to store hash to number mapping", "err", err) + } +} + +// DeleteHeaderNumber removes hash->number mapping. +func DeleteHeaderNumber(db ethdb.KeyValueWriter, hash common.Hash) { + if err := db.Delete(headerNumberKey(hash)); err != nil { + log.Crit("Failed to delete hash to number mapping", "err", err) + } +} + // ReadHeadHeaderHash retrieves the hash of the current canonical head header. -func ReadHeadHeaderHash(db DatabaseReader) common.Hash { +func ReadHeadHeaderHash(db ethdb.KeyValueReader) common.Hash { data, _ := db.Get(headHeaderKey) if len(data) == 0 { return common.Hash{} @@ -70,14 +115,14 @@ func ReadHeadHeaderHash(db DatabaseReader) common.Hash { } // WriteHeadHeaderHash stores the hash of the current canonical head header. -func WriteHeadHeaderHash(db DatabaseWriter, hash common.Hash) { +func WriteHeadHeaderHash(db ethdb.KeyValueWriter, hash common.Hash) { if err := db.Put(headHeaderKey, hash.Bytes()); err != nil { log.Crit("Failed to store last header's hash", "err", err) } } // ReadHeadBlockHash retrieves the hash of the current canonical head block. -func ReadHeadBlockHash(db DatabaseReader) common.Hash { +func ReadHeadBlockHash(db ethdb.KeyValueReader) common.Hash { data, _ := db.Get(headBlockKey) if len(data) == 0 { return common.Hash{} @@ -86,14 +131,14 @@ func ReadHeadBlockHash(db DatabaseReader) common.Hash { } // WriteHeadBlockHash stores the head block's hash. -func WriteHeadBlockHash(db DatabaseWriter, hash common.Hash) { +func WriteHeadBlockHash(db ethdb.KeyValueWriter, hash common.Hash) { if err := db.Put(headBlockKey, hash.Bytes()); err != nil { log.Crit("Failed to store last block's hash", "err", err) } } // ReadHeadFastBlockHash retrieves the hash of the current fast-sync head block. -func ReadHeadFastBlockHash(db DatabaseReader) common.Hash { +func ReadHeadFastBlockHash(db ethdb.KeyValueReader) common.Hash { data, _ := db.Get(headFastBlockKey) if len(data) == 0 { return common.Hash{} @@ -102,7 +147,7 @@ func ReadHeadFastBlockHash(db DatabaseReader) common.Hash { } // WriteHeadFastBlockHash stores the hash of the current fast-sync head block. -func WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) { +func WriteHeadFastBlockHash(db ethdb.KeyValueWriter, hash common.Hash) { if err := db.Put(headFastBlockKey, hash.Bytes()); err != nil { log.Crit("Failed to store last fast block's hash", "err", err) } @@ -110,7 +155,7 @@ func WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) { // ReadFastTrieProgress retrieves the number of tries nodes fast synced to allow // reporting correct numbers across restarts. -func ReadFastTrieProgress(db DatabaseReader) uint64 { +func ReadFastTrieProgress(db ethdb.KeyValueReader) uint64 { data, _ := db.Get(fastTrieProgressKey) if len(data) == 0 { return 0 @@ -120,20 +165,33 @@ func ReadFastTrieProgress(db DatabaseReader) uint64 { // WriteFastTrieProgress stores the fast sync trie process counter to support // retrieving it across restarts. -func WriteFastTrieProgress(db DatabaseWriter, count uint64) { +func WriteFastTrieProgress(db ethdb.KeyValueWriter, count uint64) { if err := db.Put(fastTrieProgressKey, new(big.Int).SetUint64(count).Bytes()); err != nil { log.Crit("Failed to store fast sync trie progress", "err", err) } } // ReadHeaderRLP retrieves a block header in its raw RLP database encoding. -func ReadHeaderRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { - data, _ := db.Get(headerKey(number, hash)) +func ReadHeaderRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + data, _ := db.Ancient(freezerHeaderTable, number) + if len(data) == 0 { + data, _ = db.Get(headerKey(number, hash)) + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + if len(data) == 0 { + data, _ = db.Ancient(freezerHeaderTable, number) + } + } return data } // HasHeader verifies the existence of a block header corresponding to the hash. -func HasHeader(db DatabaseReader, hash common.Hash, number uint64) bool { +func HasHeader(db ethdb.Reader, hash common.Hash, number uint64) bool { + if has, err := db.Ancient(freezerHashTable, number); err == nil && common.BytesToHash(has) == hash { + return true + } if has, err := db.Has(headerKey(number, hash)); !has || err != nil { return false } @@ -141,7 +199,7 @@ func HasHeader(db DatabaseReader, hash common.Hash, number uint64) bool { } // ReadHeader retrieves the block header corresponding to the hash. -func ReadHeader(db DatabaseReader, hash common.Hash, number uint64) *types.Header { +func ReadHeader(db ethdb.Reader, hash common.Hash, number uint64) *types.Header { data := ReadHeaderRLP(db, hash, number) if len(data) == 0 { return nil @@ -156,53 +214,69 @@ func ReadHeader(db DatabaseReader, hash common.Hash, number uint64) *types.Heade // WriteHeader stores a block header into the database and also stores the hash- // to-number mapping. -func WriteHeader(db DatabaseWriter, header *types.Header) { - // Write the hash -> number mapping +func WriteHeader(db ethdb.KeyValueWriter, header *types.Header) { var ( - hash = header.Hash() - number = header.Number.Uint64() - encoded = encodeBlockNumber(number) + hash = header.Hash() + number = header.Number.Uint64() ) - key := headerNumberKey(hash) - if err := db.Put(key, encoded); err != nil { - log.Crit("Failed to store hash to number mapping", "err", err) - } + // Write the hash -> number mapping + WriteHeaderNumber(db, hash, number) + // Write the encoded header data, err := rlp.EncodeToBytes(header) if err != nil { log.Crit("Failed to RLP encode header", "err", err) } - key = headerKey(number, hash) + key := headerKey(number, hash) if err := db.Put(key, data); err != nil { log.Crit("Failed to store header", "err", err) } } // DeleteHeader removes all block header data associated with a hash. -func DeleteHeader(db DatabaseDeleter, hash common.Hash, number uint64) { - if err := db.Delete(headerKey(number, hash)); err != nil { - log.Crit("Failed to delete header", "err", err) - } +func DeleteHeader(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { + deleteHeaderWithoutNumber(db, hash, number) if err := db.Delete(headerNumberKey(hash)); err != nil { log.Crit("Failed to delete hash to number mapping", "err", err) } } +// deleteHeaderWithoutNumber removes only the block header but does not remove +// the hash to number mapping. +func deleteHeaderWithoutNumber(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { + if err := db.Delete(headerKey(number, hash)); err != nil { + log.Crit("Failed to delete header", "err", err) + } +} + // ReadBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. -func ReadBodyRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { - data, _ := db.Get(blockBodyKey(number, hash)) +func ReadBodyRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + data, _ := db.Ancient(freezerBodiesTable, number) + if len(data) == 0 { + data, _ = db.Get(blockBodyKey(number, hash)) + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + if len(data) == 0 { + data, _ = db.Ancient(freezerBodiesTable, number) + } + } return data } // WriteBodyRLP stores an RLP encoded block body into the database. -func WriteBodyRLP(db DatabaseWriter, hash common.Hash, number uint64, rlp rlp.RawValue) { +func WriteBodyRLP(db ethdb.KeyValueWriter, hash common.Hash, number uint64, rlp rlp.RawValue) { if err := db.Put(blockBodyKey(number, hash), rlp); err != nil { log.Crit("Failed to store block body", "err", err) } } // HasBody verifies the existence of a block body corresponding to the hash. -func HasBody(db DatabaseReader, hash common.Hash, number uint64) bool { +func HasBody(db ethdb.Reader, hash common.Hash, number uint64) bool { + if has, err := db.Ancient(freezerHashTable, number); err == nil && common.BytesToHash(has) == hash { + return true + } if has, err := db.Has(blockBodyKey(number, hash)); !has || err != nil { return false } @@ -210,7 +284,7 @@ func HasBody(db DatabaseReader, hash common.Hash, number uint64) bool { } // ReadBody retrieves the block body corresponding to the hash. -func ReadBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body { +func ReadBody(db ethdb.Reader, hash common.Hash, number uint64) *types.Body { data := ReadBodyRLP(db, hash, number) if len(data) == 0 { return nil @@ -223,8 +297,8 @@ func ReadBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body { return body } -// WriteBody storea a block body into the database. -func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.Body) { +// WriteBody stores a block body into the database. +func WriteBody(db ethdb.KeyValueWriter, hash common.Hash, number uint64, body *types.Body) { data, err := rlp.EncodeToBytes(body) if err != nil { log.Crit("Failed to RLP encode body", "err", err) @@ -233,15 +307,31 @@ func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.B } // DeleteBody removes all block body data associated with a hash. -func DeleteBody(db DatabaseDeleter, hash common.Hash, number uint64) { +func DeleteBody(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { if err := db.Delete(blockBodyKey(number, hash)); err != nil { log.Crit("Failed to delete block body", "err", err) } } +// ReadTdRLP retrieves a block's total difficulty corresponding to the hash in RLP encoding. +func ReadTdRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + data, _ := db.Ancient(freezerDifficultyTable, number) + if len(data) == 0 { + data, _ = db.Get(headerTDKey(number, hash)) + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + if len(data) == 0 { + data, _ = db.Ancient(freezerDifficultyTable, number) + } + } + return data +} + // ReadTd retrieves a block's total difficulty corresponding to the hash. -func ReadTd(db DatabaseReader, hash common.Hash, number uint64) *big.Int { - data, _ := db.Get(headerTDKey(number, hash)) +func ReadTd(db ethdb.Reader, hash common.Hash, number uint64) *big.Int { + data := ReadTdRLP(db, hash, number) if len(data) == 0 { return nil } @@ -254,7 +344,7 @@ func ReadTd(db DatabaseReader, hash common.Hash, number uint64) *big.Int { } // WriteTd stores the total difficulty of a block into the database. -func WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) { +func WriteTd(db ethdb.KeyValueWriter, hash common.Hash, number uint64, td *big.Int) { data, err := rlp.EncodeToBytes(td) if err != nil { log.Crit("Failed to RLP encode block total difficulty", "err", err) @@ -265,34 +355,89 @@ func WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) { } // DeleteTd removes all block total difficulty data associated with a hash. -func DeleteTd(db DatabaseDeleter, hash common.Hash, number uint64) { +func DeleteTd(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { if err := db.Delete(headerTDKey(number, hash)); err != nil { log.Crit("Failed to delete block total difficulty", "err", err) } } -// ReadReceipts retrieves all the transaction receipts belonging to a block. -func ReadReceipts(db DatabaseReader, hash common.Hash, number uint64) types.Receipts { +// HasReceipts verifies the existence of all the transaction receipts belonging +// to a block. +func HasReceipts(db ethdb.Reader, hash common.Hash, number uint64) bool { + if has, err := db.Ancient(freezerHashTable, number); err == nil && common.BytesToHash(has) == hash { + return true + } + if has, err := db.Has(blockReceiptsKey(number, hash)); !has || err != nil { + return false + } + return true +} + +// ReadReceiptsRLP retrieves all the transaction receipts belonging to a block in RLP encoding. +func ReadReceiptsRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + data, _ := db.Ancient(freezerReceiptTable, number) + if len(data) == 0 { + data, _ = db.Get(blockReceiptsKey(number, hash)) + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + if len(data) == 0 { + data, _ = db.Ancient(freezerReceiptTable, number) + } + } + return data +} + +// ReadRawReceipts retrieves all the transaction receipts belonging to a block. +// The receipt metadata fields are not guaranteed to be populated, so they +// should not be used. Use ReadReceipts instead if the metadata is needed. +func ReadRawReceipts(db ethdb.Reader, hash common.Hash, number uint64) types.Receipts { // Retrieve the flattened receipt slice - data, _ := db.Get(blockReceiptsKey(number, hash)) + data := ReadReceiptsRLP(db, hash, number) if len(data) == 0 { return nil } - // Convert the revceipts from their storage form to their internal representation + // Convert the receipts from their storage form to their internal representation storageReceipts := []*types.ReceiptForStorage{} if err := rlp.DecodeBytes(data, &storageReceipts); err != nil { log.Error("Invalid receipt array RLP", "hash", hash, "err", err) return nil } receipts := make(types.Receipts, len(storageReceipts)) - for i, receipt := range storageReceipts { - receipts[i] = (*types.Receipt)(receipt) + for i, storageReceipt := range storageReceipts { + receipts[i] = (*types.Receipt)(storageReceipt) + } + return receipts +} + +// ReadReceipts retrieves all the transaction receipts belonging to a block, including +// its correspoinding metadata fields. If it is unable to populate these metadata +// fields then nil is returned. +// +// The current implementation populates these metadata fields by reading the receipts' +// corresponding block body, so if the block body is not found it will return nil even +// if the receipt itself is stored. +func ReadReceipts(db ethdb.Reader, hash common.Hash, number uint64, config *params.ChainConfig) types.Receipts { + // We're deriving many fields from the block body, retrieve beside the receipt + receipts := ReadRawReceipts(db, hash, number) + if receipts == nil { + return nil + } + body := ReadBody(db, hash, number) + if body == nil { + log.Error("Missing body but have receipt", "hash", hash, "number", number) + return nil + } + if err := receipts.DeriveFields(config, hash, number, body.Transactions); err != nil { + log.Error("Failed to derive block receipts fields", "hash", hash, "number", number, "err", err) + return nil } return receipts } // WriteReceipts stores all the transaction receipts belonging to a block. -func WriteReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts types.Receipts) { +func WriteReceipts(db ethdb.KeyValueWriter, hash common.Hash, number uint64, receipts types.Receipts) { // Convert the receipts into their storage form and serialize them storageReceipts := make([]*types.ReceiptForStorage, len(receipts)) for i, receipt := range receipts { @@ -309,7 +454,7 @@ func WriteReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts } // DeleteReceipts removes all receipt data associated with a block hash. -func DeleteReceipts(db DatabaseDeleter, hash common.Hash, number uint64) { +func DeleteReceipts(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { if err := db.Delete(blockReceiptsKey(number, hash)); err != nil { log.Crit("Failed to delete block receipts", "err", err) } @@ -321,7 +466,7 @@ func DeleteReceipts(db DatabaseDeleter, hash common.Hash, number uint64) { // // Note, due to concurrent download of header and block body the header and thus // canonical hash can be stored in the database but the body data not (yet). -func ReadBlock(db DatabaseReader, hash common.Hash, number uint64) *types.Block { +func ReadBlock(db ethdb.Reader, hash common.Hash, number uint64) *types.Block { header := ReadHeader(db, hash, number) if header == nil { return nil @@ -334,21 +479,61 @@ func ReadBlock(db DatabaseReader, hash common.Hash, number uint64) *types.Block } // WriteBlock serializes a block into the database, header and body separately. -func WriteBlock(db DatabaseWriter, block *types.Block) { +func WriteBlock(db ethdb.KeyValueWriter, block *types.Block) { WriteBody(db, block.Hash(), block.NumberU64(), block.Body()) WriteHeader(db, block.Header()) } +// WriteAncientBlock writes entire block data into ancient store and returns the total written size. +func WriteAncientBlock(db ethdb.AncientWriter, block *types.Block, receipts types.Receipts, td *big.Int) int { + // Encode all block components to RLP format. + headerBlob, err := rlp.EncodeToBytes(block.Header()) + if err != nil { + log.Crit("Failed to RLP encode block header", "err", err) + } + bodyBlob, err := rlp.EncodeToBytes(block.Body()) + if err != nil { + log.Crit("Failed to RLP encode body", "err", err) + } + storageReceipts := make([]*types.ReceiptForStorage, len(receipts)) + for i, receipt := range receipts { + storageReceipts[i] = (*types.ReceiptForStorage)(receipt) + } + receiptBlob, err := rlp.EncodeToBytes(storageReceipts) + if err != nil { + log.Crit("Failed to RLP encode block receipts", "err", err) + } + tdBlob, err := rlp.EncodeToBytes(td) + if err != nil { + log.Crit("Failed to RLP encode block total difficulty", "err", err) + } + // Write all blob to flatten files. + err = db.AppendAncient(block.NumberU64(), block.Hash().Bytes(), headerBlob, bodyBlob, receiptBlob, tdBlob) + if err != nil { + log.Crit("Failed to write block data to ancient store", "err", err) + } + return len(headerBlob) + len(bodyBlob) + len(receiptBlob) + len(tdBlob) + common.HashLength +} + // DeleteBlock removes all block data associated with a hash. -func DeleteBlock(db DatabaseDeleter, hash common.Hash, number uint64) { +func DeleteBlock(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { DeleteReceipts(db, hash, number) DeleteHeader(db, hash, number) DeleteBody(db, hash, number) DeleteTd(db, hash, number) } +// DeleteBlockWithoutNumber removes all block data associated with a hash, except +// the hash to number mapping. +func DeleteBlockWithoutNumber(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { + DeleteReceipts(db, hash, number) + deleteHeaderWithoutNumber(db, hash, number) + DeleteBody(db, hash, number) + DeleteTd(db, hash, number) +} + // FindCommonAncestor returns the last common ancestor of two block headers -func FindCommonAncestor(db DatabaseReader, a, b *types.Header) *types.Header { +func FindCommonAncestor(db ethdb.Reader, a, b *types.Header) *types.Header { for bn := b.Number.Uint64(); a.Number.Uint64() > bn; { a = ReadHeader(db, a.ParentHash, a.Number.Uint64()-1) if a == nil { diff --git a/core/rawdb/accessors_chain_test.go b/core/rawdb/accessors_chain_test.go index 9ddae6e2b56b..8c8affffd9e8 100644 --- a/core/rawdb/accessors_chain_test.go +++ b/core/rawdb/accessors_chain_test.go @@ -18,19 +18,21 @@ package rawdb import ( "bytes" + "encoding/hex" + "fmt" "math/big" "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" ) // Tests block header storage and retrieval operations. func TestHeaderStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test header to move around the database and make sure it's really new header := &types.Header{Number: big.NewInt(42), Extra: []byte("test header")} @@ -47,7 +49,7 @@ func TestHeaderStorage(t *testing.T) { if entry := ReadHeaderRLP(db, header.Hash(), header.Number.Uint64()); entry == nil { t.Fatalf("Stored header RLP not found") } else { - hasher := sha3.NewKeccak256() + hasher := sha3.NewLegacyKeccak256() hasher.Write(entry) if hash := common.BytesToHash(hasher.Sum(nil)); hash != header.Hash() { @@ -63,12 +65,12 @@ func TestHeaderStorage(t *testing.T) { // Tests block body storage and retrieval operations. func TestBodyStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test body to move around the database and make sure it's really new body := &types.Body{Uncles: []*types.Header{{Extra: []byte("test header")}}} - hasher := sha3.NewKeccak256() + hasher := sha3.NewLegacyKeccak256() rlp.Encode(hasher, body) hash := common.BytesToHash(hasher.Sum(nil)) @@ -85,7 +87,7 @@ func TestBodyStorage(t *testing.T) { if entry := ReadBodyRLP(db, hash, 0); entry == nil { t.Fatalf("Stored body RLP not found") } else { - hasher := sha3.NewKeccak256() + hasher := sha3.NewLegacyKeccak256() hasher.Write(entry) if calc := common.BytesToHash(hasher.Sum(nil)); calc != hash { @@ -101,7 +103,7 @@ func TestBodyStorage(t *testing.T) { // Tests block storage and retrieval operations. func TestBlockStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test block to move around the database and make sure it's really new block := types.NewBlockWithHeader(&types.Header{ @@ -151,7 +153,7 @@ func TestBlockStorage(t *testing.T) { // Tests that partial block contents don't get reassembled into full blocks. func TestPartialBlockStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() block := types.NewBlockWithHeader(&types.Header{ Extra: []byte("test block"), UncleHash: types.EmptyUncleHash, @@ -185,7 +187,7 @@ func TestPartialBlockStorage(t *testing.T) { // Tests block total difficulty storage and retrieval operations. func TestTdStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test TD to move around the database and make sure it's really new hash, td := common.Hash{}, big.NewInt(314) @@ -208,7 +210,7 @@ func TestTdStorage(t *testing.T) { // Tests that canonical numbers can be mapped to hashes and retrieved. func TestCanonicalMappingStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test canonical number and assinged hash to move around hash, number := common.Hash{0: 0xff}, uint64(314) @@ -231,7 +233,7 @@ func TestCanonicalMappingStorage(t *testing.T) { // Tests that head headers and head blocks can be assigned, individually. func TestHeadStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() blockHead := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block header")}) blockFull := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block full")}) @@ -266,8 +268,15 @@ func TestHeadStorage(t *testing.T) { // Tests that receipts associated with a single block can be stored and retrieved. func TestBlockReceiptStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() + // Create a live block since we need metadata to reconstruct the receipt + tx1 := types.NewTransaction(1, common.HexToAddress("0x1"), big.NewInt(1), 1, big.NewInt(1), nil) + tx2 := types.NewTransaction(2, common.HexToAddress("0x2"), big.NewInt(2), 2, big.NewInt(2), nil) + + body := &types.Body{Transactions: types.Transactions{tx1, tx2}} + + // Create the two receipts to manage afterwards receipt1 := &types.Receipt{ Status: types.ReceiptStatusFailed, CumulativeGasUsed: 1, @@ -275,10 +284,12 @@ func TestBlockReceiptStorage(t *testing.T) { {Address: common.BytesToAddress([]byte{0x11})}, {Address: common.BytesToAddress([]byte{0x01, 0x11})}, }, - TxHash: common.BytesToHash([]byte{0x11, 0x11}), + TxHash: tx1.Hash(), ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), GasUsed: 111111, } + receipt1.Bloom = types.CreateBloom(types.Receipts{receipt1}) + receipt2 := &types.Receipt{ PostState: common.Hash{2}.Bytes(), CumulativeGasUsed: 2, @@ -286,34 +297,64 @@ func TestBlockReceiptStorage(t *testing.T) { {Address: common.BytesToAddress([]byte{0x22})}, {Address: common.BytesToAddress([]byte{0x02, 0x22})}, }, - TxHash: common.BytesToHash([]byte{0x22, 0x22}), + TxHash: tx2.Hash(), ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}), GasUsed: 222222, } + receipt2.Bloom = types.CreateBloom(types.Receipts{receipt2}) receipts := []*types.Receipt{receipt1, receipt2} // Check that no receipt entries are in a pristine database hash := common.BytesToHash([]byte{0x03, 0x14}) - if rs := ReadReceipts(db, hash, 0); len(rs) != 0 { + if rs := ReadReceipts(db, hash, 0, params.TestChainConfig); len(rs) != 0 { t.Fatalf("non existent receipts returned: %v", rs) } + // Insert the body that corresponds to the receipts + WriteBody(db, hash, 0, body) + // Insert the receipt slice into the database and check presence WriteReceipts(db, hash, 0, receipts) - if rs := ReadReceipts(db, hash, 0); len(rs) == 0 { + if rs := ReadReceipts(db, hash, 0, params.TestChainConfig); len(rs) == 0 { t.Fatalf("no receipts returned") } else { - for i := 0; i < len(receipts); i++ { - rlpHave, _ := rlp.EncodeToBytes(rs[i]) - rlpWant, _ := rlp.EncodeToBytes(receipts[i]) - - if !bytes.Equal(rlpHave, rlpWant) { - t.Fatalf("receipt #%d: receipt mismatch: have %v, want %v", i, rs[i], receipts[i]) - } + if err := checkReceiptsRLP(rs, receipts); err != nil { + t.Fatalf(err.Error()) } } - // Delete the receipt slice and check purge + // Delete the body and ensure that the receipts are no longer returned (metadata can't be recomputed) + DeleteBody(db, hash, 0) + if rs := ReadReceipts(db, hash, 0, params.TestChainConfig); rs != nil { + t.Fatalf("receipts returned when body was deleted: %v", rs) + } + // Ensure that receipts without metadata can be returned without the block body too + if err := checkReceiptsRLP(ReadRawReceipts(db, hash, 0), receipts); err != nil { + t.Fatalf(err.Error()) + } + // Sanity check that body alone without the receipt is a full purge + WriteBody(db, hash, 0, body) + DeleteReceipts(db, hash, 0) - if rs := ReadReceipts(db, hash, 0); len(rs) != 0 { + if rs := ReadReceipts(db, hash, 0, params.TestChainConfig); len(rs) != 0 { t.Fatalf("deleted receipts returned: %v", rs) } } + +func checkReceiptsRLP(have, want types.Receipts) error { + if len(have) != len(want) { + return fmt.Errorf("receipts sizes mismatch: have %d, want %d", len(have), len(want)) + } + for i := 0; i < len(want); i++ { + rlpHave, err := rlp.EncodeToBytes(have[i]) + if err != nil { + return err + } + rlpWant, err := rlp.EncodeToBytes(want[i]) + if err != nil { + return err + } + if !bytes.Equal(rlpHave, rlpWant) { + return fmt.Errorf("receipt #%d: receipt mismatch: have %s, want %s", i, hex.EncodeToString(rlpHave), hex.EncodeToString(rlpWant)) + } + } + return nil +} diff --git a/core/rawdb/accessors_indexes.go b/core/rawdb/accessors_indexes.go index 4ff7e5bd35d3..38f8fe10ea94 100644 --- a/core/rawdb/accessors_indexes.go +++ b/core/rawdb/accessors_indexes.go @@ -17,90 +17,114 @@ package rawdb import ( + "math/big" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" ) // ReadTxLookupEntry retrieves the positional metadata associated with a transaction // hash to allow retrieving the transaction or receipt by hash. -func ReadTxLookupEntry(db DatabaseReader, hash common.Hash) (common.Hash, uint64, uint64) { +func ReadTxLookupEntry(db ethdb.Reader, hash common.Hash) *uint64 { data, _ := db.Get(txLookupKey(hash)) if len(data) == 0 { - return common.Hash{}, 0, 0 + return nil + } + // Database v6 tx lookup just stores the block number + if len(data) < common.HashLength { + number := new(big.Int).SetBytes(data).Uint64() + return &number } - var entry TxLookupEntry + // Database v4-v5 tx lookup format just stores the hash + if len(data) == common.HashLength { + return ReadHeaderNumber(db, common.BytesToHash(data)) + } + // Finally try database v3 tx lookup format + var entry LegacyTxLookupEntry if err := rlp.DecodeBytes(data, &entry); err != nil { - log.Error("Invalid transaction lookup entry RLP", "hash", hash, "err", err) - return common.Hash{}, 0, 0 + log.Error("Invalid transaction lookup entry RLP", "hash", hash, "blob", data, "err", err) + return nil } - return entry.BlockHash, entry.BlockIndex, entry.Index + return &entry.BlockIndex } // WriteTxLookupEntries stores a positional metadata for every transaction from // a block, enabling hash based transaction and receipt lookups. -func WriteTxLookupEntries(db DatabaseWriter, block *types.Block) { - for i, tx := range block.Transactions() { - entry := TxLookupEntry{ - BlockHash: block.Hash(), - BlockIndex: block.NumberU64(), - Index: uint64(i), - } - data, err := rlp.EncodeToBytes(entry) - if err != nil { - log.Crit("Failed to encode transaction lookup entry", "err", err) - } - if err := db.Put(txLookupKey(tx.Hash()), data); err != nil { +func WriteTxLookupEntries(db ethdb.KeyValueWriter, block *types.Block) { + number := block.Number().Bytes() + for _, tx := range block.Transactions() { + if err := db.Put(txLookupKey(tx.Hash()), number); err != nil { log.Crit("Failed to store transaction lookup entry", "err", err) } } } // DeleteTxLookupEntry removes all transaction data associated with a hash. -func DeleteTxLookupEntry(db DatabaseDeleter, hash common.Hash) { +func DeleteTxLookupEntry(db ethdb.KeyValueWriter, hash common.Hash) { db.Delete(txLookupKey(hash)) } // ReadTransaction retrieves a specific transaction from the database, along with // its added positional metadata. -func ReadTransaction(db DatabaseReader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { - blockHash, blockNumber, txIndex := ReadTxLookupEntry(db, hash) +func ReadTransaction(db ethdb.Reader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { + blockNumber := ReadTxLookupEntry(db, hash) + if blockNumber == nil { + return nil, common.Hash{}, 0, 0 + } + blockHash := ReadCanonicalHash(db, *blockNumber) if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0 } - body := ReadBody(db, blockHash, blockNumber) - if body == nil || len(body.Transactions) <= int(txIndex) { - log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash, "index", txIndex) + body := ReadBody(db, blockHash, *blockNumber) + if body == nil { + log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash) return nil, common.Hash{}, 0, 0 } - return body.Transactions[txIndex], blockHash, blockNumber, txIndex + for txIndex, tx := range body.Transactions { + if tx.Hash() == hash { + return tx, blockHash, *blockNumber, uint64(txIndex) + } + } + log.Error("Transaction not found", "number", blockNumber, "hash", blockHash, "txhash", hash) + return nil, common.Hash{}, 0, 0 } // ReadReceipt retrieves a specific transaction receipt from the database, along with // its added positional metadata. -func ReadReceipt(db DatabaseReader, hash common.Hash) (*types.Receipt, common.Hash, uint64, uint64) { - blockHash, blockNumber, receiptIndex := ReadTxLookupEntry(db, hash) - if blockHash == (common.Hash{}) { +func ReadReceipt(db ethdb.Reader, hash common.Hash, config *params.ChainConfig) (*types.Receipt, common.Hash, uint64, uint64) { + // Retrieve the context of the receipt based on the transaction hash + blockNumber := ReadTxLookupEntry(db, hash) + if blockNumber == nil { return nil, common.Hash{}, 0, 0 } - receipts := ReadReceipts(db, blockHash, blockNumber) - if len(receipts) <= int(receiptIndex) { - log.Error("Receipt refereced missing", "number", blockNumber, "hash", blockHash, "index", receiptIndex) + blockHash := ReadCanonicalHash(db, *blockNumber) + if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0 } - return receipts[receiptIndex], blockHash, blockNumber, receiptIndex + // Read all the receipts from the block and return the one with the matching hash + receipts := ReadReceipts(db, blockHash, *blockNumber, config) + for receiptIndex, receipt := range receipts { + if receipt.TxHash == hash { + return receipt, blockHash, *blockNumber, uint64(receiptIndex) + } + } + log.Error("Receipt not found", "number", blockNumber, "hash", blockHash, "txhash", hash) + return nil, common.Hash{}, 0, 0 } // ReadBloomBits retrieves the compressed bloom bit vector belonging to the given // section and bit index from the. -func ReadBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash) ([]byte, error) { +func ReadBloomBits(db ethdb.KeyValueReader, bit uint, section uint64, head common.Hash) ([]byte, error) { return db.Get(bloomBitsKey(bit, section, head)) } // WriteBloomBits stores the compressed bloom bits vector belonging to the given // section and bit index. -func WriteBloomBits(db DatabaseWriter, bit uint, section uint64, head common.Hash, bits []byte) { +func WriteBloomBits(db ethdb.KeyValueWriter, bit uint, section uint64, head common.Hash, bits []byte) { if err := db.Put(bloomBitsKey(bit, section, head), bits); err != nil { log.Crit("Failed to store bloom bits", "err", err) } diff --git a/core/rawdb/accessors_indexes_test.go b/core/rawdb/accessors_indexes_test.go index d9c10e1490fa..c09bff010127 100644 --- a/core/rawdb/accessors_indexes_test.go +++ b/core/rawdb/accessors_indexes_test.go @@ -23,46 +23,86 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/rlp" ) // Tests that positional lookup metadata can be stored and retrieved. func TestLookupStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + tests := []struct { + name string + writeTxLookupEntries func(ethdb.Writer, *types.Block) + }{ + { + "DatabaseV6", + func(db ethdb.Writer, block *types.Block) { + WriteTxLookupEntries(db, block) + }, + }, + { + "DatabaseV4-V5", + func(db ethdb.Writer, block *types.Block) { + for _, tx := range block.Transactions() { + db.Put(txLookupKey(tx.Hash()), block.Hash().Bytes()) + } + }, + }, + { + "DatabaseV3", + func(db ethdb.Writer, block *types.Block) { + for index, tx := range block.Transactions() { + entry := LegacyTxLookupEntry{ + BlockHash: block.Hash(), + BlockIndex: block.NumberU64(), + Index: uint64(index), + } + data, _ := rlp.EncodeToBytes(entry) + db.Put(txLookupKey(tx.Hash()), data) + } + }, + }, + } - tx1 := types.NewTransaction(1, common.BytesToAddress([]byte{0x11}), big.NewInt(111), 1111, big.NewInt(11111), []byte{0x11, 0x11, 0x11}) - tx2 := types.NewTransaction(2, common.BytesToAddress([]byte{0x22}), big.NewInt(222), 2222, big.NewInt(22222), []byte{0x22, 0x22, 0x22}) - tx3 := types.NewTransaction(3, common.BytesToAddress([]byte{0x33}), big.NewInt(333), 3333, big.NewInt(33333), []byte{0x33, 0x33, 0x33}) - txs := []*types.Transaction{tx1, tx2, tx3} + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + db := NewMemoryDatabase() - block := types.NewBlock(&types.Header{Number: big.NewInt(314)}, txs, nil, nil) + tx1 := types.NewTransaction(1, common.BytesToAddress([]byte{0x11}), big.NewInt(111), 1111, big.NewInt(11111), []byte{0x11, 0x11, 0x11}) + tx2 := types.NewTransaction(2, common.BytesToAddress([]byte{0x22}), big.NewInt(222), 2222, big.NewInt(22222), []byte{0x22, 0x22, 0x22}) + tx3 := types.NewTransaction(3, common.BytesToAddress([]byte{0x33}), big.NewInt(333), 3333, big.NewInt(33333), []byte{0x33, 0x33, 0x33}) + txs := []*types.Transaction{tx1, tx2, tx3} - // Check that no transactions entries are in a pristine database - for i, tx := range txs { - if txn, _, _, _ := ReadTransaction(db, tx.Hash()); txn != nil { - t.Fatalf("tx #%d [%x]: non existent transaction returned: %v", i, tx.Hash(), txn) - } - } - // Insert all the transactions into the database, and verify contents - WriteBlock(db, block) - WriteTxLookupEntries(db, block) + block := types.NewBlock(&types.Header{Number: big.NewInt(314)}, txs, nil, nil) - for i, tx := range txs { - if txn, hash, number, index := ReadTransaction(db, tx.Hash()); txn == nil { - t.Fatalf("tx #%d [%x]: transaction not found", i, tx.Hash()) - } else { - if hash != block.Hash() || number != block.NumberU64() || index != uint64(i) { - t.Fatalf("tx #%d [%x]: positional metadata mismatch: have %x/%d/%d, want %x/%v/%v", i, tx.Hash(), hash, number, index, block.Hash(), block.NumberU64(), i) + // Check that no transactions entries are in a pristine database + for i, tx := range txs { + if txn, _, _, _ := ReadTransaction(db, tx.Hash()); txn != nil { + t.Fatalf("tx #%d [%x]: non existent transaction returned: %v", i, tx.Hash(), txn) + } } - if tx.Hash() != txn.Hash() { - t.Fatalf("tx #%d [%x]: transaction mismatch: have %v, want %v", i, tx.Hash(), txn, tx) + // Insert all the transactions into the database, and verify contents + WriteCanonicalHash(db, block.Hash(), block.NumberU64()) + WriteBlock(db, block) + tc.writeTxLookupEntries(db, block) + + for i, tx := range txs { + if txn, hash, number, index := ReadTransaction(db, tx.Hash()); txn == nil { + t.Fatalf("tx #%d [%x]: transaction not found", i, tx.Hash()) + } else { + if hash != block.Hash() || number != block.NumberU64() || index != uint64(i) { + t.Fatalf("tx #%d [%x]: positional metadata mismatch: have %x/%d/%d, want %x/%v/%v", i, tx.Hash(), hash, number, index, block.Hash(), block.NumberU64(), i) + } + if tx.Hash() != txn.Hash() { + t.Fatalf("tx #%d [%x]: transaction mismatch: have %v, want %v", i, tx.Hash(), txn, tx) + } + } } - } - } - // Delete the transactions and check purge - for i, tx := range txs { - DeleteTxLookupEntry(db, tx.Hash()) - if txn, _, _, _ := ReadTransaction(db, tx.Hash()); txn != nil { - t.Fatalf("tx #%d [%x]: deleted transaction returned: %v", i, tx.Hash(), txn) - } + // Delete the transactions and check purge + for i, tx := range txs { + DeleteTxLookupEntry(db, tx.Hash()) + if txn, _, _, _ := ReadTransaction(db, tx.Hash()); txn != nil { + t.Fatalf("tx #%d [%x]: deleted transaction returned: %v", i, tx.Hash(), txn) + } + } + }) } } diff --git a/core/rawdb/accessors_metadata.go b/core/rawdb/accessors_metadata.go index 514328e87b7e..f8d09fbddf2d 100644 --- a/core/rawdb/accessors_metadata.go +++ b/core/rawdb/accessors_metadata.go @@ -20,31 +20,40 @@ import ( "encoding/json" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" ) // ReadDatabaseVersion retrieves the version number of the database. -func ReadDatabaseVersion(db DatabaseReader) int { - var version int +func ReadDatabaseVersion(db ethdb.KeyValueReader) *uint64 { + var version uint64 enc, _ := db.Get(databaseVerisionKey) - rlp.DecodeBytes(enc, &version) + if len(enc) == 0 { + return nil + } + if err := rlp.DecodeBytes(enc, &version); err != nil { + return nil + } - return version + return &version } // WriteDatabaseVersion stores the version number of the database -func WriteDatabaseVersion(db DatabaseWriter, version int) { - enc, _ := rlp.EncodeToBytes(version) - if err := db.Put(databaseVerisionKey, enc); err != nil { +func WriteDatabaseVersion(db ethdb.KeyValueWriter, version uint64) { + enc, err := rlp.EncodeToBytes(version) + if err != nil { + log.Crit("Failed to encode database version", "err", err) + } + if err = db.Put(databaseVerisionKey, enc); err != nil { log.Crit("Failed to store the database version", "err", err) } } // ReadChainConfig retrieves the consensus settings based on the given genesis hash. -func ReadChainConfig(db DatabaseReader, hash common.Hash) *params.ChainConfig { +func ReadChainConfig(db ethdb.KeyValueReader, hash common.Hash) *params.ChainConfig { data, _ := db.Get(configKey(hash)) if len(data) == 0 { return nil @@ -58,7 +67,7 @@ func ReadChainConfig(db DatabaseReader, hash common.Hash) *params.ChainConfig { } // WriteChainConfig writes the chain config settings to the database. -func WriteChainConfig(db DatabaseWriter, hash common.Hash, cfg *params.ChainConfig) { +func WriteChainConfig(db ethdb.KeyValueWriter, hash common.Hash, cfg *params.ChainConfig) { if cfg == nil { return } @@ -72,14 +81,13 @@ func WriteChainConfig(db DatabaseWriter, hash common.Hash, cfg *params.ChainConf } // ReadPreimage retrieves a single preimage of the provided hash. -func ReadPreimage(db DatabaseReader, hash common.Hash) []byte { +func ReadPreimage(db ethdb.KeyValueReader, hash common.Hash) []byte { data, _ := db.Get(preimageKey(hash)) return data } -// WritePreimages writes the provided set of preimages to the database. `number` is the -// current block number, and is used for debug messages only. -func WritePreimages(db DatabaseWriter, number uint64, preimages map[common.Hash][]byte) { +// WritePreimages writes the provided set of preimages to the database. +func WritePreimages(db ethdb.KeyValueWriter, preimages map[common.Hash][]byte) { for hash, preimage := range preimages { if err := db.Put(preimageKey(hash), preimage); err != nil { log.Crit("Failed to store trie preimage", "err", err) diff --git a/core/rawdb/database.go b/core/rawdb/database.go new file mode 100644 index 000000000000..353b7dce623d --- /dev/null +++ b/core/rawdb/database.go @@ -0,0 +1,355 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rawdb + +import ( + "bytes" + "errors" + "fmt" + "os" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/leveldb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" + "github.com/ethereum/go-ethereum/log" + "github.com/olekukonko/tablewriter" +) + +// freezerdb is a database wrapper that enabled freezer data retrievals. +type freezerdb struct { + ethdb.KeyValueStore + ethdb.AncientStore +} + +// Close implements io.Closer, closing both the fast key-value store as well as +// the slow ancient tables. +func (frdb *freezerdb) Close() error { + var errs []error + if err := frdb.KeyValueStore.Close(); err != nil { + errs = append(errs, err) + } + if err := frdb.AncientStore.Close(); err != nil { + errs = append(errs, err) + } + if len(errs) != 0 { + return fmt.Errorf("%v", errs) + } + return nil +} + +// nofreezedb is a database wrapper that disables freezer data retrievals. +type nofreezedb struct { + ethdb.KeyValueStore +} + +// HasAncient returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) HasAncient(kind string, number uint64) (bool, error) { + return false, errNotSupported +} + +// Ancient returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) Ancient(kind string, number uint64) ([]byte, error) { + return nil, errNotSupported +} + +// Ancients returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) Ancients() (uint64, error) { + return 0, errNotSupported +} + +// AncientSize returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) AncientSize(kind string) (uint64, error) { + return 0, errNotSupported +} + +// AppendAncient returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) AppendAncient(number uint64, hash, header, body, receipts, td []byte) error { + return errNotSupported +} + +// TruncateAncients returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) TruncateAncients(items uint64) error { + return errNotSupported +} + +// Sync returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) Sync() error { + return errNotSupported +} + +// NewDatabase creates a high level database on top of a given key-value data +// store without a freezer moving immutable chain segments into cold storage. +func NewDatabase(db ethdb.KeyValueStore) ethdb.Database { + return &nofreezedb{ + KeyValueStore: db, + } +} + +// NewDatabaseWithFreezer creates a high level database on top of a given key- +// value data store with a freezer moving immutable chain segments into cold +// storage. +func NewDatabaseWithFreezer(db ethdb.KeyValueStore, freezer string, namespace string) (ethdb.Database, error) { + // Create the idle freezer instance + frdb, err := newFreezer(freezer, namespace) + if err != nil { + return nil, err + } + // Since the freezer can be stored separately from the user's key-value database, + // there's a fairly high probability that the user requests invalid combinations + // of the freezer and database. Ensure that we don't shoot ourselves in the foot + // by serving up conflicting data, leading to both datastores getting corrupted. + // + // - If both the freezer and key-value store is empty (no genesis), we just + // initialized a new empty freezer, so everything's fine. + // - If the key-value store is empty, but the freezer is not, we need to make + // sure the user's genesis matches the freezer. That will be checked in the + // blockchain, since we don't have the genesis block here (nor should we at + // this point care, the key-value/freezer combo is valid). + // - If neither the key-value store nor the freezer is empty, cross validate + // the genesis hashes to make sure they are compatible. If they are, also + // ensure that there's no gap between the freezer and sunsequently leveldb. + // - If the key-value store is not empty, but the freezer is we might just be + // upgrading to the freezer release, or we might have had a small chain and + // not frozen anything yet. Ensure that no blocks are missing yet from the + // key-value store, since that would mean we already had an old freezer. + + // If the genesis hash is empty, we have a new key-value store, so nothing to + // validate in this method. If, however, the genesis hash is not nil, compare + // it to the freezer content. + if kvgenesis, _ := db.Get(headerHashKey(0)); len(kvgenesis) > 0 { + if frozen, _ := frdb.Ancients(); frozen > 0 { + // If the freezer already contains something, ensure that the genesis blocks + // match, otherwise we might mix up freezers across chains and destroy both + // the freezer and the key-value store. + if frgenesis, _ := frdb.Ancient(freezerHashTable, 0); !bytes.Equal(kvgenesis, frgenesis) { + return nil, fmt.Errorf("genesis mismatch: %#x (leveldb) != %#x (ancients)", kvgenesis, frgenesis) + } + // Key-value store and freezer belong to the same network. Ensure that they + // are contiguous, otherwise we might end up with a non-functional freezer. + if kvhash, _ := db.Get(headerHashKey(frozen)); len(kvhash) == 0 { + // Subsequent header after the freezer limit is missing from the database. + // Reject startup is the database has a more recent head. + if *ReadHeaderNumber(db, ReadHeadHeaderHash(db)) > frozen-1 { + return nil, fmt.Errorf("gap (#%d) in the chain between ancients and leveldb", frozen) + } + // Database contains only older data than the freezer, this happens if the + // state was wiped and reinited from an existing freezer. + } else { + // Key-value store continues where the freezer left off, all is fine. We might + // have duplicate blocks (crash after freezer write but before kay-value store + // deletion, but that's fine). + } + } else { + // If the freezer is empty, ensure nothing was moved yet from the key-value + // store, otherwise we'll end up missing data. We check block #1 to decide + // if we froze anything previously or not, but do take care of databases with + // only the genesis block. + if ReadHeadHeaderHash(db) != common.BytesToHash(kvgenesis) { + // Key-value store contains more data than the genesis block, make sure we + // didn't freeze anything yet. + if kvblob, _ := db.Get(headerHashKey(1)); len(kvblob) == 0 { + return nil, errors.New("ancient chain segments already extracted, please set --datadir.ancient to the correct path") + } + // Block #1 is still in the database, we're allowed to init a new feezer + } else { + // The head header is still the genesis, we're allowed to init a new feezer + } + } + } + // Freezer is consistent with the key-value database, permit combining the two + go frdb.freeze(db) + + return &freezerdb{ + KeyValueStore: db, + AncientStore: frdb, + }, nil +} + +// NewMemoryDatabase creates an ephemeral in-memory key-value database without a +// freezer moving immutable chain segments into cold storage. +func NewMemoryDatabase() ethdb.Database { + return NewDatabase(memorydb.New()) +} + +// NewMemoryDatabaseWithCap creates an ephemeral in-memory key-value database +// with an initial starting capacity, but without a freezer moving immutable +// chain segments into cold storage. +func NewMemoryDatabaseWithCap(size int) ethdb.Database { + return NewDatabase(memorydb.NewWithCap(size)) +} + +// NewLevelDBDatabase creates a persistent key-value database without a freezer +// moving immutable chain segments into cold storage. +func NewLevelDBDatabase(file string, cache int, handles int, namespace string) (ethdb.Database, error) { + db, err := leveldb.New(file, cache, handles, namespace) + if err != nil { + return nil, err + } + return NewDatabase(db), nil +} + +// NewLevelDBDatabaseWithFreezer creates a persistent key-value database with a +// freezer moving immutable chain segments into cold storage. +func NewLevelDBDatabaseWithFreezer(file string, cache int, handles int, freezer string, namespace string) (ethdb.Database, error) { + kvdb, err := leveldb.New(file, cache, handles, namespace) + if err != nil { + return nil, err + } + frdb, err := NewDatabaseWithFreezer(kvdb, freezer, namespace) + if err != nil { + kvdb.Close() + return nil, err + } + return frdb, nil +} + +// InspectDatabase traverses the entire database and checks the size +// of all different categories of data. +func InspectDatabase(db ethdb.Database) error { + it := db.NewIterator() + defer it.Release() + + var ( + count int64 + start = time.Now() + logged = time.Now() + + // Key-value store statistics + total common.StorageSize + headerSize common.StorageSize + bodySize common.StorageSize + receiptSize common.StorageSize + tdSize common.StorageSize + numHashPairing common.StorageSize + hashNumPairing common.StorageSize + trieSize common.StorageSize + txlookupSize common.StorageSize + preimageSize common.StorageSize + bloomBitsSize common.StorageSize + cliqueSnapsSize common.StorageSize + + // Ancient store statistics + ancientHeaders common.StorageSize + ancientBodies common.StorageSize + ancientReceipts common.StorageSize + ancientHashes common.StorageSize + ancientTds common.StorageSize + + // Les statistic + chtTrieNodes common.StorageSize + bloomTrieNodes common.StorageSize + + // Meta- and unaccounted data + metadata common.StorageSize + unaccounted common.StorageSize + ) + // Inspect key-value database first. + for it.Next() { + var ( + key = it.Key() + size = common.StorageSize(len(key) + len(it.Value())) + ) + total += size + switch { + case bytes.HasPrefix(key, headerPrefix) && bytes.HasSuffix(key, headerTDSuffix): + tdSize += size + case bytes.HasPrefix(key, headerPrefix) && bytes.HasSuffix(key, headerHashSuffix): + numHashPairing += size + case bytes.HasPrefix(key, headerPrefix) && len(key) == (len(headerPrefix)+8+common.HashLength): + headerSize += size + case bytes.HasPrefix(key, headerNumberPrefix) && len(key) == (len(headerNumberPrefix)+common.HashLength): + hashNumPairing += size + case bytes.HasPrefix(key, blockBodyPrefix) && len(key) == (len(blockBodyPrefix)+8+common.HashLength): + bodySize += size + case bytes.HasPrefix(key, blockReceiptsPrefix) && len(key) == (len(blockReceiptsPrefix)+8+common.HashLength): + receiptSize += size + case bytes.HasPrefix(key, txLookupPrefix) && len(key) == (len(txLookupPrefix)+common.HashLength): + txlookupSize += size + case bytes.HasPrefix(key, preimagePrefix) && len(key) == (len(preimagePrefix)+common.HashLength): + preimageSize += size + case bytes.HasPrefix(key, bloomBitsPrefix) && len(key) == (len(bloomBitsPrefix)+10+common.HashLength): + bloomBitsSize += size + case bytes.HasPrefix(key, []byte("clique-")) && len(key) == 7+common.HashLength: + cliqueSnapsSize += size + case bytes.HasPrefix(key, []byte("cht-")) && len(key) == 4+common.HashLength: + chtTrieNodes += size + case bytes.HasPrefix(key, []byte("blt-")) && len(key) == 4+common.HashLength: + bloomTrieNodes += size + case len(key) == common.HashLength: + trieSize += size + default: + var accounted bool + for _, meta := range [][]byte{databaseVerisionKey, headHeaderKey, headBlockKey, headFastBlockKey, fastTrieProgressKey} { + if bytes.Equal(key, meta) { + metadata += size + accounted = true + break + } + } + if !accounted { + unaccounted += size + } + } + count += 1 + if count%1000 == 0 && time.Since(logged) > 8*time.Second { + log.Info("Inspecting database", "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + } + // Inspect append-only file store then. + ancients := []*common.StorageSize{&ancientHeaders, &ancientBodies, &ancientReceipts, &ancientHashes, &ancientTds} + for i, category := range []string{freezerHeaderTable, freezerBodiesTable, freezerReceiptTable, freezerHashTable, freezerDifficultyTable} { + if size, err := db.AncientSize(category); err == nil { + *ancients[i] += common.StorageSize(size) + total += common.StorageSize(size) + } + } + // Display the database statistic. + stats := [][]string{ + {"Key-Value store", "Headers", headerSize.String()}, + {"Key-Value store", "Bodies", bodySize.String()}, + {"Key-Value store", "Receipts", receiptSize.String()}, + {"Key-Value store", "Difficulties", tdSize.String()}, + {"Key-Value store", "Block number->hash", numHashPairing.String()}, + {"Key-Value store", "Block hash->number", hashNumPairing.String()}, + {"Key-Value store", "Transaction index", txlookupSize.String()}, + {"Key-Value store", "Bloombit index", bloomBitsSize.String()}, + {"Key-Value store", "Trie nodes", trieSize.String()}, + {"Key-Value store", "Trie preimages", preimageSize.String()}, + {"Key-Value store", "Clique snapshots", cliqueSnapsSize.String()}, + {"Key-Value store", "Singleton metadata", metadata.String()}, + {"Ancient store", "Headers", ancientHeaders.String()}, + {"Ancient store", "Bodies", ancientBodies.String()}, + {"Ancient store", "Receipts", ancientReceipts.String()}, + {"Ancient store", "Difficulties", ancientTds.String()}, + {"Ancient store", "Block number->hash", ancientHashes.String()}, + {"Light client", "CHT trie nodes", chtTrieNodes.String()}, + {"Light client", "Bloom trie nodes", bloomTrieNodes.String()}, + } + table := tablewriter.NewWriter(os.Stdout) + table.SetHeader([]string{"Database", "Category", "Size"}) + table.SetFooter([]string{"", "Total", total.String()}) + table.AppendBulk(stats) + table.Render() + + if unaccounted > 0 { + log.Error("Database contains unaccounted data", "size", unaccounted) + } + return nil +} diff --git a/core/rawdb/freezer.go b/core/rawdb/freezer.go new file mode 100644 index 000000000000..41677fbba220 --- /dev/null +++ b/core/rawdb/freezer.go @@ -0,0 +1,393 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rawdb + +import ( + "errors" + "fmt" + "math" + "os" + "path/filepath" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/params" + "github.com/prometheus/tsdb/fileutil" +) + +var ( + // errUnknownTable is returned if the user attempts to read from a table that is + // not tracked by the freezer. + errUnknownTable = errors.New("unknown table") + + // errOutOrderInsertion is returned if the user attempts to inject out-of-order + // binary blobs into the freezer. + errOutOrderInsertion = errors.New("the append operation is out-order") + + // errSymlinkDatadir is returned if the ancient directory specified by user + // is a symbolic link. + errSymlinkDatadir = errors.New("symbolic link datadir is not supported") +) + +const ( + // freezerRecheckInterval is the frequency to check the key-value database for + // chain progression that might permit new blocks to be frozen into immutable + // storage. + freezerRecheckInterval = time.Minute + + // freezerBatchLimit is the maximum number of blocks to freeze in one batch + // before doing an fsync and deleting it from the key-value store. + freezerBatchLimit = 30000 +) + +// freezer is an memory mapped append-only database to store immutable chain data +// into flat files: +// +// - The append only nature ensures that disk writes are minimized. +// - The memory mapping ensures we can max out system memory for caching without +// reserving it for go-ethereum. This would also reduce the memory requirements +// of Geth, and thus also GC overhead. +type freezer struct { + // WARNING: The `frozen` field is accessed atomically. On 32 bit platforms, only + // 64-bit aligned fields can be atomic. The struct is guaranteed to be so aligned, + // so take advantage of that (https://golang.org/pkg/sync/atomic/#pkg-note-BUG). + frozen uint64 // Number of blocks already frozen + + tables map[string]*freezerTable // Data tables for storing everything + instanceLock fileutil.Releaser // File-system lock to prevent double opens +} + +// newFreezer creates a chain freezer that moves ancient chain data into +// append-only flat file containers. +func newFreezer(datadir string, namespace string) (*freezer, error) { + // Create the initial freezer object + var ( + readMeter = metrics.NewRegisteredMeter(namespace+"ancient/read", nil) + writeMeter = metrics.NewRegisteredMeter(namespace+"ancient/write", nil) + sizeCounter = metrics.NewRegisteredCounter(namespace+"ancient/size", nil) + ) + // Ensure the datadir is not a symbolic link if it exists. + if info, err := os.Lstat(datadir); !os.IsNotExist(err) { + if info.Mode()&os.ModeSymlink != 0 { + log.Warn("Symbolic link ancient database is not supported", "path", datadir) + return nil, errSymlinkDatadir + } + } + // Leveldb uses LOCK as the filelock filename. To prevent the + // name collision, we use FLOCK as the lock name. + lock, _, err := fileutil.Flock(filepath.Join(datadir, "FLOCK")) + if err != nil { + return nil, err + } + // Open all the supported data tables + freezer := &freezer{ + tables: make(map[string]*freezerTable), + instanceLock: lock, + } + for name, disableSnappy := range freezerNoSnappy { + table, err := newTable(datadir, name, readMeter, writeMeter, sizeCounter, disableSnappy) + if err != nil { + for _, table := range freezer.tables { + table.Close() + } + lock.Release() + return nil, err + } + freezer.tables[name] = table + } + if err := freezer.repair(); err != nil { + for _, table := range freezer.tables { + table.Close() + } + lock.Release() + return nil, err + } + log.Info("Opened ancient database", "database", datadir) + return freezer, nil +} + +// Close terminates the chain freezer, unmapping all the data files. +func (f *freezer) Close() error { + var errs []error + for _, table := range f.tables { + if err := table.Close(); err != nil { + errs = append(errs, err) + } + } + if err := f.instanceLock.Release(); err != nil { + errs = append(errs, err) + } + if errs != nil { + return fmt.Errorf("%v", errs) + } + return nil +} + +// HasAncient returns an indicator whether the specified ancient data exists +// in the freezer. +func (f *freezer) HasAncient(kind string, number uint64) (bool, error) { + if table := f.tables[kind]; table != nil { + return table.has(number), nil + } + return false, nil +} + +// Ancient retrieves an ancient binary blob from the append-only immutable files. +func (f *freezer) Ancient(kind string, number uint64) ([]byte, error) { + if table := f.tables[kind]; table != nil { + return table.Retrieve(number) + } + return nil, errUnknownTable +} + +// Ancients returns the length of the frozen items. +func (f *freezer) Ancients() (uint64, error) { + return atomic.LoadUint64(&f.frozen), nil +} + +// AncientSize returns the ancient size of the specified category. +func (f *freezer) AncientSize(kind string) (uint64, error) { + if table := f.tables[kind]; table != nil { + return table.size() + } + return 0, errUnknownTable +} + +// AppendAncient injects all binary blobs belong to block at the end of the +// append-only immutable table files. +// +// Notably, this function is lock free but kind of thread-safe. All out-of-order +// injection will be rejected. But if two injections with same number happen at +// the same time, we can get into the trouble. +func (f *freezer) AppendAncient(number uint64, hash, header, body, receipts, td []byte) (err error) { + // Ensure the binary blobs we are appending is continuous with freezer. + if atomic.LoadUint64(&f.frozen) != number { + return errOutOrderInsertion + } + // Rollback all inserted data if any insertion below failed to ensure + // the tables won't out of sync. + defer func() { + if err != nil { + rerr := f.repair() + if rerr != nil { + log.Crit("Failed to repair freezer", "err", rerr) + } + log.Info("Append ancient failed", "number", number, "err", err) + } + }() + // Inject all the components into the relevant data tables + if err := f.tables[freezerHashTable].Append(f.frozen, hash[:]); err != nil { + log.Error("Failed to append ancient hash", "number", f.frozen, "hash", hash, "err", err) + return err + } + if err := f.tables[freezerHeaderTable].Append(f.frozen, header); err != nil { + log.Error("Failed to append ancient header", "number", f.frozen, "hash", hash, "err", err) + return err + } + if err := f.tables[freezerBodiesTable].Append(f.frozen, body); err != nil { + log.Error("Failed to append ancient body", "number", f.frozen, "hash", hash, "err", err) + return err + } + if err := f.tables[freezerReceiptTable].Append(f.frozen, receipts); err != nil { + log.Error("Failed to append ancient receipts", "number", f.frozen, "hash", hash, "err", err) + return err + } + if err := f.tables[freezerDifficultyTable].Append(f.frozen, td); err != nil { + log.Error("Failed to append ancient difficulty", "number", f.frozen, "hash", hash, "err", err) + return err + } + atomic.AddUint64(&f.frozen, 1) // Only modify atomically + return nil +} + +// Truncate discards any recent data above the provided threshold number. +func (f *freezer) TruncateAncients(items uint64) error { + if atomic.LoadUint64(&f.frozen) <= items { + return nil + } + for _, table := range f.tables { + if err := table.truncate(items); err != nil { + return err + } + } + atomic.StoreUint64(&f.frozen, items) + return nil +} + +// sync flushes all data tables to disk. +func (f *freezer) Sync() error { + var errs []error + for _, table := range f.tables { + if err := table.Sync(); err != nil { + errs = append(errs, err) + } + } + if errs != nil { + return fmt.Errorf("%v", errs) + } + return nil +} + +// freeze is a background thread that periodically checks the blockchain for any +// import progress and moves ancient data from the fast database into the freezer. +// +// This functionality is deliberately broken off from block importing to avoid +// incurring additional data shuffling delays on block propagation. +func (f *freezer) freeze(db ethdb.KeyValueStore) { + nfdb := &nofreezedb{KeyValueStore: db} + + for { + // Retrieve the freezing threshold. + hash := ReadHeadBlockHash(nfdb) + if hash == (common.Hash{}) { + log.Debug("Current full block hash unavailable") // new chain, empty database + time.Sleep(freezerRecheckInterval) + continue + } + number := ReadHeaderNumber(nfdb, hash) + switch { + case number == nil: + log.Error("Current full block number unavailable", "hash", hash) + time.Sleep(freezerRecheckInterval) + continue + + case *number < params.ImmutabilityThreshold: + log.Debug("Current full block not old enough", "number", *number, "hash", hash, "delay", params.ImmutabilityThreshold) + time.Sleep(freezerRecheckInterval) + continue + + case *number-params.ImmutabilityThreshold <= f.frozen: + log.Debug("Ancient blocks frozen already", "number", *number, "hash", hash, "frozen", f.frozen) + time.Sleep(freezerRecheckInterval) + continue + } + head := ReadHeader(nfdb, hash, *number) + if head == nil { + log.Error("Current full block unavailable", "number", *number, "hash", hash) + time.Sleep(freezerRecheckInterval) + continue + } + // Seems we have data ready to be frozen, process in usable batches + limit := *number - params.ImmutabilityThreshold + if limit-f.frozen > freezerBatchLimit { + limit = f.frozen + freezerBatchLimit + } + var ( + start = time.Now() + first = f.frozen + ancients = make([]common.Hash, 0, limit) + ) + for f.frozen < limit { + // Retrieves all the components of the canonical block + hash := ReadCanonicalHash(nfdb, f.frozen) + if hash == (common.Hash{}) { + log.Error("Canonical hash missing, can't freeze", "number", f.frozen) + break + } + header := ReadHeaderRLP(nfdb, hash, f.frozen) + if len(header) == 0 { + log.Error("Block header missing, can't freeze", "number", f.frozen, "hash", hash) + break + } + body := ReadBodyRLP(nfdb, hash, f.frozen) + if len(body) == 0 { + log.Error("Block body missing, can't freeze", "number", f.frozen, "hash", hash) + break + } + receipts := ReadReceiptsRLP(nfdb, hash, f.frozen) + if len(receipts) == 0 { + log.Error("Block receipts missing, can't freeze", "number", f.frozen, "hash", hash) + break + } + td := ReadTdRLP(nfdb, hash, f.frozen) + if len(td) == 0 { + log.Error("Total difficulty missing, can't freeze", "number", f.frozen, "hash", hash) + break + } + log.Trace("Deep froze ancient block", "number", f.frozen, "hash", hash) + // Inject all the components into the relevant data tables + if err := f.AppendAncient(f.frozen, hash[:], header, body, receipts, td); err != nil { + break + } + ancients = append(ancients, hash) + } + // Batch of blocks have been frozen, flush them before wiping from leveldb + if err := f.Sync(); err != nil { + log.Crit("Failed to flush frozen tables", "err", err) + } + // Wipe out all data from the active database + batch := db.NewBatch() + for i := 0; i < len(ancients); i++ { + // Always keep the genesis block in active database + if first+uint64(i) != 0 { + DeleteBlockWithoutNumber(batch, ancients[i], first+uint64(i)) + DeleteCanonicalHash(batch, first+uint64(i)) + } + } + if err := batch.Write(); err != nil { + log.Crit("Failed to delete frozen canonical blocks", "err", err) + } + batch.Reset() + // Wipe out side chain also. + for number := first; number < f.frozen; number++ { + // Always keep the genesis block in active database + if number != 0 { + for _, hash := range ReadAllHashes(db, number) { + DeleteBlock(batch, hash, number) + } + } + } + if err := batch.Write(); err != nil { + log.Crit("Failed to delete frozen side blocks", "err", err) + } + // Log something friendly for the user + context := []interface{}{ + "blocks", f.frozen - first, "elapsed", common.PrettyDuration(time.Since(start)), "number", f.frozen - 1, + } + if n := len(ancients); n > 0 { + context = append(context, []interface{}{"hash", ancients[n-1]}...) + } + log.Info("Deep froze chain segment", context...) + + // Avoid database thrashing with tiny writes + if f.frozen-first < freezerBatchLimit { + time.Sleep(freezerRecheckInterval) + } + } +} + +// repair truncates all data tables to the same length. +func (f *freezer) repair() error { + min := uint64(math.MaxUint64) + for _, table := range f.tables { + items := atomic.LoadUint64(&table.items) + if min > items { + min = items + } + } + for _, table := range f.tables { + if err := table.truncate(min); err != nil { + return err + } + } + atomic.StoreUint64(&f.frozen, min) + return nil +} diff --git a/core/rawdb/freezer_reinit.go b/core/rawdb/freezer_reinit.go new file mode 100644 index 000000000000..ea4dd33d1d6b --- /dev/null +++ b/core/rawdb/freezer_reinit.go @@ -0,0 +1,127 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rawdb + +import ( + "errors" + "runtime" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/prque" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" +) + +// InitDatabaseFromFreezer reinitializes an empty database from a previous batch +// of frozen ancient blocks. The method iterates over all the frozen blocks and +// injects into the database the block hash->number mappings and the transaction +// lookup entries. +func InitDatabaseFromFreezer(db ethdb.Database) error { + // If we can't access the freezer or it's empty, abort + frozen, err := db.Ancients() + if err != nil || frozen == 0 { + return err + } + // Blocks previously frozen, iterate over- and hash them concurrently + var ( + number = ^uint64(0) // -1 + results = make(chan *types.Block, 4*runtime.NumCPU()) + ) + abort := make(chan struct{}) + defer close(abort) + + for i := 0; i < runtime.NumCPU(); i++ { + go func() { + for { + // Fetch the next task number, terminating if everything's done + n := atomic.AddUint64(&number, 1) + if n >= frozen { + return + } + // Retrieve the block from the freezer (no need for the hash, we pull by + // number from the freezer). If successful, pre-cache the block hash and + // the individual transaction hashes for storing into the database. + block := ReadBlock(db, common.Hash{}, n) + if block != nil { + block.Hash() + for _, tx := range block.Transactions() { + tx.Hash() + } + } + // Feed the block to the aggregator, or abort on interrupt + select { + case results <- block: + case <-abort: + return + } + } + }() + } + // Reassemble the blocks into a contiguous stream and push them out to disk + var ( + queue = prque.New(nil) + next = int64(0) + + batch = db.NewBatch() + start = time.Now() + logged time.Time + ) + for i := uint64(0); i < frozen; i++ { + // Retrieve the next result and bail if it's nil + block := <-results + if block == nil { + return errors.New("broken ancient database") + } + // Push the block into the import queue and process contiguous ranges + queue.Push(block, -int64(block.NumberU64())) + for !queue.Empty() { + // If the next available item is gapped, return + if _, priority := queue.Peek(); -priority != next { + break + } + // Next block available, pop it off and index it + block = queue.PopItem().(*types.Block) + next++ + + // Inject hash<->number mapping and txlookup indexes + WriteHeaderNumber(batch, block.Hash(), block.NumberU64()) + WriteTxLookupEntries(batch, block) + + // If enough data was accumulated in memory or we're at the last block, dump to disk + if batch.ValueSize() > ethdb.IdealBatchSize || uint64(next) == frozen { + if err := batch.Write(); err != nil { + return err + } + batch.Reset() + } + // If we've spent too much time already, notify the user of what we're doing + if time.Since(logged) > 8*time.Second { + log.Info("Initializing chain from ancient data", "number", block.Number(), "hash", block.Hash(), "total", frozen-1, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + } + } + hash := ReadCanonicalHash(db, frozen-1) + WriteHeadHeaderHash(db, hash) + WriteHeadFastBlockHash(db, hash) + + log.Info("Initialized chain from ancient data", "number", frozen-1, "hash", hash, "elapsed", common.PrettyDuration(time.Since(start))) + return nil +} diff --git a/core/rawdb/freezer_table.go b/core/rawdb/freezer_table.go new file mode 100644 index 000000000000..61804f1f2bcf --- /dev/null +++ b/core/rawdb/freezer_table.go @@ -0,0 +1,637 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rawdb + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "sync" + "sync/atomic" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/golang/snappy" +) + +var ( + // errClosed is returned if an operation attempts to read from or write to the + // freezer table after it has already been closed. + errClosed = errors.New("closed") + + // errOutOfBounds is returned if the item requested is not contained within the + // freezer table. + errOutOfBounds = errors.New("out of bounds") + + // errNotSupported is returned if the database doesn't support the required operation. + errNotSupported = errors.New("this operation is not supported") +) + +// indexEntry contains the number/id of the file that the data resides in, aswell as the +// offset within the file to the end of the data +// In serialized form, the filenum is stored as uint16. +type indexEntry struct { + filenum uint32 // stored as uint16 ( 2 bytes) + offset uint32 // stored as uint32 ( 4 bytes) +} + +const indexEntrySize = 6 + +// unmarshallBinary deserializes binary b into the rawIndex entry. +func (i *indexEntry) unmarshalBinary(b []byte) error { + i.filenum = uint32(binary.BigEndian.Uint16(b[:2])) + i.offset = binary.BigEndian.Uint32(b[2:6]) + return nil +} + +// marshallBinary serializes the rawIndex entry into binary. +func (i *indexEntry) marshallBinary() []byte { + b := make([]byte, indexEntrySize) + binary.BigEndian.PutUint16(b[:2], uint16(i.filenum)) + binary.BigEndian.PutUint32(b[2:6], i.offset) + return b +} + +// freezerTable represents a single chained data table within the freezer (e.g. blocks). +// It consists of a data file (snappy encoded arbitrary data blobs) and an indexEntry +// file (uncompressed 64 bit indices into the data file). +type freezerTable struct { + // WARNING: The `items` field is accessed atomically. On 32 bit platforms, only + // 64-bit aligned fields can be atomic. The struct is guaranteed to be so aligned, + // so take advantage of that (https://golang.org/pkg/sync/atomic/#pkg-note-BUG). + items uint64 // Number of items stored in the table (including items removed from tail) + + noCompression bool // if true, disables snappy compression. Note: does not work retroactively + maxFileSize uint32 // Max file size for data-files + name string + path string + + head *os.File // File descriptor for the data head of the table + files map[uint32]*os.File // open files + headId uint32 // number of the currently active head file + tailId uint32 // number of the earliest file + index *os.File // File descriptor for the indexEntry file of the table + + // In the case that old items are deleted (from the tail), we use itemOffset + // to count how many historic items have gone missing. + itemOffset uint32 // Offset (number of discarded items) + + headBytes uint32 // Number of bytes written to the head file + readMeter metrics.Meter // Meter for measuring the effective amount of data read + writeMeter metrics.Meter // Meter for measuring the effective amount of data written + sizeCounter metrics.Counter // Counter for tracking the combined size of all freezer tables + + logger log.Logger // Logger with database path and table name ambedded + lock sync.RWMutex // Mutex protecting the data file descriptors +} + +// newTable opens a freezer table with default settings - 2G files +func newTable(path string, name string, readMeter metrics.Meter, writeMeter metrics.Meter, sizeCounter metrics.Counter, disableSnappy bool) (*freezerTable, error) { + return newCustomTable(path, name, readMeter, writeMeter, sizeCounter, 2*1000*1000*1000, disableSnappy) +} + +// openFreezerFileForAppend opens a freezer table file and seeks to the end +func openFreezerFileForAppend(filename string) (*os.File, error) { + // Open the file without the O_APPEND flag + // because it has differing behaviour during Truncate operations + // on different OS's + file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + return nil, err + } + // Seek to end for append + if _, err = file.Seek(0, io.SeekEnd); err != nil { + return nil, err + } + return file, nil +} + +// openFreezerFileForReadOnly opens a freezer table file for read only access +func openFreezerFileForReadOnly(filename string) (*os.File, error) { + return os.OpenFile(filename, os.O_RDONLY, 0644) +} + +// openFreezerFileTruncated opens a freezer table making sure it is truncated +func openFreezerFileTruncated(filename string) (*os.File, error) { + return os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) +} + +// truncateFreezerFile resizes a freezer table file and seeks to the end +func truncateFreezerFile(file *os.File, size int64) error { + if err := file.Truncate(size); err != nil { + return err + } + // Seek to end for append + if _, err := file.Seek(0, io.SeekEnd); err != nil { + return err + } + return nil +} + +// newCustomTable opens a freezer table, creating the data and index files if they are +// non existent. Both files are truncated to the shortest common length to ensure +// they don't go out of sync. +func newCustomTable(path string, name string, readMeter metrics.Meter, writeMeter metrics.Meter, sizeCounter metrics.Counter, maxFilesize uint32, noCompression bool) (*freezerTable, error) { + // Ensure the containing directory exists and open the indexEntry file + if err := os.MkdirAll(path, 0755); err != nil { + return nil, err + } + var idxName string + if noCompression { + // Raw idx + idxName = fmt.Sprintf("%s.ridx", name) + } else { + // Compressed idx + idxName = fmt.Sprintf("%s.cidx", name) + } + offsets, err := openFreezerFileForAppend(filepath.Join(path, idxName)) + if err != nil { + return nil, err + } + // Create the table and repair any past inconsistency + tab := &freezerTable{ + index: offsets, + files: make(map[uint32]*os.File), + readMeter: readMeter, + writeMeter: writeMeter, + sizeCounter: sizeCounter, + name: name, + path: path, + logger: log.New("database", path, "table", name), + noCompression: noCompression, + maxFileSize: maxFilesize, + } + if err := tab.repair(); err != nil { + tab.Close() + return nil, err + } + // Initialize the starting size counter + size, err := tab.sizeNolock() + if err != nil { + tab.Close() + return nil, err + } + tab.sizeCounter.Inc(int64(size)) + + return tab, nil +} + +// repair cross checks the head and the index file and truncates them to +// be in sync with each other after a potential crash / data loss. +func (t *freezerTable) repair() error { + // Create a temporary offset buffer to init files with and read indexEntry into + buffer := make([]byte, indexEntrySize) + + // If we've just created the files, initialize the index with the 0 indexEntry + stat, err := t.index.Stat() + if err != nil { + return err + } + if stat.Size() == 0 { + if _, err := t.index.Write(buffer); err != nil { + return err + } + } + // Ensure the index is a multiple of indexEntrySize bytes + if overflow := stat.Size() % indexEntrySize; overflow != 0 { + truncateFreezerFile(t.index, stat.Size()-overflow) // New file can't trigger this path + } + // Retrieve the file sizes and prepare for truncation + if stat, err = t.index.Stat(); err != nil { + return err + } + offsetsSize := stat.Size() + + // Open the head file + var ( + firstIndex indexEntry + lastIndex indexEntry + contentSize int64 + contentExp int64 + ) + // Read index zero, determine what file is the earliest + // and what item offset to use + t.index.ReadAt(buffer, 0) + firstIndex.unmarshalBinary(buffer) + + t.tailId = firstIndex.offset + t.itemOffset = firstIndex.filenum + + t.index.ReadAt(buffer, offsetsSize-indexEntrySize) + lastIndex.unmarshalBinary(buffer) + t.head, err = t.openFile(lastIndex.filenum, openFreezerFileForAppend) + if err != nil { + return err + } + if stat, err = t.head.Stat(); err != nil { + return err + } + contentSize = stat.Size() + + // Keep truncating both files until they come in sync + contentExp = int64(lastIndex.offset) + + for contentExp != contentSize { + // Truncate the head file to the last offset pointer + if contentExp < contentSize { + t.logger.Warn("Truncating dangling head", "indexed", common.StorageSize(contentExp), "stored", common.StorageSize(contentSize)) + if err := truncateFreezerFile(t.head, contentExp); err != nil { + return err + } + contentSize = contentExp + } + // Truncate the index to point within the head file + if contentExp > contentSize { + t.logger.Warn("Truncating dangling indexes", "indexed", common.StorageSize(contentExp), "stored", common.StorageSize(contentSize)) + if err := truncateFreezerFile(t.index, offsetsSize-indexEntrySize); err != nil { + return err + } + offsetsSize -= indexEntrySize + t.index.ReadAt(buffer, offsetsSize-indexEntrySize) + var newLastIndex indexEntry + newLastIndex.unmarshalBinary(buffer) + // We might have slipped back into an earlier head-file here + if newLastIndex.filenum != lastIndex.filenum { + // Release earlier opened file + t.releaseFile(lastIndex.filenum) + if t.head, err = t.openFile(newLastIndex.filenum, openFreezerFileForAppend); err != nil { + return err + } + if stat, err = t.head.Stat(); err != nil { + // TODO, anything more we can do here? + // A data file has gone missing... + return err + } + contentSize = stat.Size() + } + lastIndex = newLastIndex + contentExp = int64(lastIndex.offset) + } + } + // Ensure all reparation changes have been written to disk + if err := t.index.Sync(); err != nil { + return err + } + if err := t.head.Sync(); err != nil { + return err + } + // Update the item and byte counters and return + t.items = uint64(t.itemOffset) + uint64(offsetsSize/indexEntrySize-1) // last indexEntry points to the end of the data file + t.headBytes = uint32(contentSize) + t.headId = lastIndex.filenum + + // Close opened files and preopen all files + if err := t.preopen(); err != nil { + return err + } + t.logger.Debug("Chain freezer table opened", "items", t.items, "size", common.StorageSize(t.headBytes)) + return nil +} + +// preopen opens all files that the freezer will need. This method should be called from an init-context, +// since it assumes that it doesn't have to bother with locking +// The rationale for doing preopen is to not have to do it from within Retrieve, thus not needing to ever +// obtain a write-lock within Retrieve. +func (t *freezerTable) preopen() (err error) { + // The repair might have already opened (some) files + t.releaseFilesAfter(0, false) + // Open all except head in RDONLY + for i := t.tailId; i < t.headId; i++ { + if _, err = t.openFile(i, openFreezerFileForReadOnly); err != nil { + return err + } + } + // Open head in read/write + t.head, err = t.openFile(t.headId, openFreezerFileForAppend) + return err +} + +// truncate discards any recent data above the provided threshold number. +func (t *freezerTable) truncate(items uint64) error { + t.lock.Lock() + defer t.lock.Unlock() + + // If our item count is correct, don't do anything + if atomic.LoadUint64(&t.items) <= items { + return nil + } + // We need to truncate, save the old size for metrics tracking + oldSize, err := t.sizeNolock() + if err != nil { + return err + } + // Something's out of sync, truncate the table's offset index + t.logger.Warn("Truncating freezer table", "items", t.items, "limit", items) + if err := truncateFreezerFile(t.index, int64(items+1)*indexEntrySize); err != nil { + return err + } + // Calculate the new expected size of the data file and truncate it + buffer := make([]byte, indexEntrySize) + if _, err := t.index.ReadAt(buffer, int64(items*indexEntrySize)); err != nil { + return err + } + var expected indexEntry + expected.unmarshalBinary(buffer) + + // We might need to truncate back to older files + if expected.filenum != t.headId { + // If already open for reading, force-reopen for writing + t.releaseFile(expected.filenum) + newHead, err := t.openFile(expected.filenum, openFreezerFileForAppend) + if err != nil { + return err + } + // Release any files _after the current head -- both the previous head + // and any files which may have been opened for reading + t.releaseFilesAfter(expected.filenum, true) + // Set back the historic head + t.head = newHead + atomic.StoreUint32(&t.headId, expected.filenum) + } + if err := truncateFreezerFile(t.head, int64(expected.offset)); err != nil { + return err + } + // All data files truncated, set internal counters and return + atomic.StoreUint64(&t.items, items) + atomic.StoreUint32(&t.headBytes, expected.offset) + + // Retrieve the new size and update the total size counter + newSize, err := t.sizeNolock() + if err != nil { + return err + } + t.sizeCounter.Dec(int64(oldSize - newSize)) + + return nil +} + +// Close closes all opened files. +func (t *freezerTable) Close() error { + t.lock.Lock() + defer t.lock.Unlock() + + var errs []error + if err := t.index.Close(); err != nil { + errs = append(errs, err) + } + t.index = nil + + for _, f := range t.files { + if err := f.Close(); err != nil { + errs = append(errs, err) + } + } + t.head = nil + + if errs != nil { + return fmt.Errorf("%v", errs) + } + return nil +} + +// openFile assumes that the write-lock is held by the caller +func (t *freezerTable) openFile(num uint32, opener func(string) (*os.File, error)) (f *os.File, err error) { + var exist bool + if f, exist = t.files[num]; !exist { + var name string + if t.noCompression { + name = fmt.Sprintf("%s.%04d.rdat", t.name, num) + } else { + name = fmt.Sprintf("%s.%04d.cdat", t.name, num) + } + f, err = opener(filepath.Join(t.path, name)) + if err != nil { + return nil, err + } + t.files[num] = f + } + return f, err +} + +// releaseFile closes a file, and removes it from the open file cache. +// Assumes that the caller holds the write lock +func (t *freezerTable) releaseFile(num uint32) { + if f, exist := t.files[num]; exist { + delete(t.files, num) + f.Close() + } +} + +// releaseFilesAfter closes all open files with a higher number, and optionally also deletes the files +func (t *freezerTable) releaseFilesAfter(num uint32, remove bool) { + for fnum, f := range t.files { + if fnum > num { + delete(t.files, fnum) + f.Close() + if remove { + os.Remove(f.Name()) + } + } + } +} + +// Append injects a binary blob at the end of the freezer table. The item number +// is a precautionary parameter to ensure data correctness, but the table will +// reject already existing data. +// +// Note, this method will *not* flush any data to disk so be sure to explicitly +// fsync before irreversibly deleting data from the database. +func (t *freezerTable) Append(item uint64, blob []byte) error { + // Read lock prevents competition with truncate + t.lock.RLock() + // Ensure the table is still accessible + if t.index == nil || t.head == nil { + t.lock.RUnlock() + return errClosed + } + // Ensure only the next item can be written, nothing else + if atomic.LoadUint64(&t.items) != item { + t.lock.RUnlock() + return fmt.Errorf("appending unexpected item: want %d, have %d", t.items, item) + } + // Encode the blob and write it into the data file + if !t.noCompression { + blob = snappy.Encode(nil, blob) + } + bLen := uint32(len(blob)) + if t.headBytes+bLen < bLen || + t.headBytes+bLen > t.maxFileSize { + // we need a new file, writing would overflow + t.lock.RUnlock() + t.lock.Lock() + nextID := atomic.LoadUint32(&t.headId) + 1 + // We open the next file in truncated mode -- if this file already + // exists, we need to start over from scratch on it + newHead, err := t.openFile(nextID, openFreezerFileTruncated) + if err != nil { + t.lock.Unlock() + return err + } + // Close old file, and reopen in RDONLY mode + t.releaseFile(t.headId) + t.openFile(t.headId, openFreezerFileForReadOnly) + + // Swap out the current head + t.head = newHead + atomic.StoreUint32(&t.headBytes, 0) + atomic.StoreUint32(&t.headId, nextID) + t.lock.Unlock() + t.lock.RLock() + } + + defer t.lock.RUnlock() + if _, err := t.head.Write(blob); err != nil { + return err + } + newOffset := atomic.AddUint32(&t.headBytes, bLen) + idx := indexEntry{ + filenum: atomic.LoadUint32(&t.headId), + offset: newOffset, + } + // Write indexEntry + t.index.Write(idx.marshallBinary()) + + t.writeMeter.Mark(int64(bLen + indexEntrySize)) + t.sizeCounter.Inc(int64(bLen + indexEntrySize)) + + atomic.AddUint64(&t.items, 1) + return nil +} + +// getBounds returns the indexes for the item +// returns start, end, filenumber and error +func (t *freezerTable) getBounds(item uint64) (uint32, uint32, uint32, error) { + var startIdx, endIdx indexEntry + buffer := make([]byte, indexEntrySize) + if _, err := t.index.ReadAt(buffer, int64(item*indexEntrySize)); err != nil { + return 0, 0, 0, err + } + startIdx.unmarshalBinary(buffer) + if _, err := t.index.ReadAt(buffer, int64((item+1)*indexEntrySize)); err != nil { + return 0, 0, 0, err + } + endIdx.unmarshalBinary(buffer) + if startIdx.filenum != endIdx.filenum { + // If a piece of data 'crosses' a data-file, + // it's actually in one piece on the second data-file. + // We return a zero-indexEntry for the second file as start + return 0, endIdx.offset, endIdx.filenum, nil + } + return startIdx.offset, endIdx.offset, endIdx.filenum, nil +} + +// Retrieve looks up the data offset of an item with the given number and retrieves +// the raw binary blob from the data file. +func (t *freezerTable) Retrieve(item uint64) ([]byte, error) { + // Ensure the table and the item is accessible + if t.index == nil || t.head == nil { + return nil, errClosed + } + if atomic.LoadUint64(&t.items) <= item { + return nil, errOutOfBounds + } + // Ensure the item was not deleted from the tail either + offset := atomic.LoadUint32(&t.itemOffset) + if uint64(offset) > item { + return nil, errOutOfBounds + } + t.lock.RLock() + startOffset, endOffset, filenum, err := t.getBounds(item - uint64(offset)) + if err != nil { + t.lock.RUnlock() + return nil, err + } + dataFile, exist := t.files[filenum] + if !exist { + t.lock.RUnlock() + return nil, fmt.Errorf("missing data file %d", filenum) + } + // Retrieve the data itself, decompress and return + blob := make([]byte, endOffset-startOffset) + if _, err := dataFile.ReadAt(blob, int64(startOffset)); err != nil { + t.lock.RUnlock() + return nil, err + } + t.lock.RUnlock() + t.readMeter.Mark(int64(len(blob) + 2*indexEntrySize)) + + if t.noCompression { + return blob, nil + } + return snappy.Decode(nil, blob) +} + +// has returns an indicator whether the specified number data +// exists in the freezer table. +func (t *freezerTable) has(number uint64) bool { + return atomic.LoadUint64(&t.items) > number +} + +// size returns the total data size in the freezer table. +func (t *freezerTable) size() (uint64, error) { + t.lock.RLock() + defer t.lock.RUnlock() + + return t.sizeNolock() +} + +// sizeNolock returns the total data size in the freezer table without obtaining +// the mutex first. +func (t *freezerTable) sizeNolock() (uint64, error) { + stat, err := t.index.Stat() + if err != nil { + return 0, err + } + total := uint64(t.maxFileSize)*uint64(t.headId-t.tailId) + uint64(t.headBytes) + uint64(stat.Size()) + return total, nil +} + +// Sync pushes any pending data from memory out to disk. This is an expensive +// operation, so use it with care. +func (t *freezerTable) Sync() error { + if err := t.index.Sync(); err != nil { + return err + } + return t.head.Sync() +} + +// printIndex is a debug print utility function for testing +func (t *freezerTable) printIndex() { + buf := make([]byte, indexEntrySize) + + fmt.Printf("|-----------------|\n") + fmt.Printf("| fileno | offset |\n") + fmt.Printf("|--------+--------|\n") + + for i := uint64(0); ; i++ { + if _, err := t.index.ReadAt(buf, int64(i*indexEntrySize)); err != nil { + break + } + var entry indexEntry + entry.unmarshalBinary(buf) + fmt.Printf("| %03d | %03d | \n", entry.filenum, entry.offset) + if i > 100 { + fmt.Printf(" ... \n") + break + } + } + fmt.Printf("|-----------------|\n") +} diff --git a/core/rawdb/freezer_table_test.go b/core/rawdb/freezer_table_test.go new file mode 100644 index 000000000000..61ba7a17e28b --- /dev/null +++ b/core/rawdb/freezer_table_test.go @@ -0,0 +1,624 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rawdb + +import ( + "bytes" + "fmt" + "math/rand" + "os" + "path/filepath" + "testing" + "time" + + "github.com/ethereum/go-ethereum/metrics" +) + +func init() { + rand.Seed(time.Now().Unix()) +} + +// Gets a chunk of data, filled with 'b' +func getChunk(size int, b int) []byte { + data := make([]byte, size) + for i := range data { + data[i] = byte(b) + } + return data +} + +func print(t *testing.T, f *freezerTable, item uint64) { + a, err := f.Retrieve(item) + if err != nil { + t.Fatal(err) + } + t.Logf("db[%d] = %x\n", item, a) +} + +// TestFreezerBasics test initializing a freezertable from scratch, writing to the table, +// and reading it back. +func TestFreezerBasics(t *testing.T) { + t.Parallel() + // set cutoff at 50 bytes + f, err := newCustomTable(os.TempDir(), + fmt.Sprintf("unittest-%d", rand.Uint64()), + metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter(), 50, true) + if err != nil { + t.Fatal(err) + } + defer f.Close() + // Write 15 bytes 255 times, results in 85 files + for x := 0; x < 255; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + + //print(t, f, 0) + //print(t, f, 1) + //print(t, f, 2) + // + //db[0] = 000000000000000000000000000000 + //db[1] = 010101010101010101010101010101 + //db[2] = 020202020202020202020202020202 + + for y := 0; y < 255; y++ { + exp := getChunk(15, y) + got, err := f.Retrieve(uint64(y)) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, exp) { + t.Fatalf("test %d, got \n%x != \n%x", y, got, exp) + } + } + // Check that we cannot read too far + _, err = f.Retrieve(uint64(255)) + if err != errOutOfBounds { + t.Fatal(err) + } +} + +// TestFreezerBasicsClosing tests same as TestFreezerBasics, but also closes and reopens the freezer between +// every operation +func TestFreezerBasicsClosing(t *testing.T) { + t.Parallel() + // set cutoff at 50 bytes + var ( + fname = fmt.Sprintf("basics-close-%d", rand.Uint64()) + rm, wm, sc = metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter() + f *freezerTable + err error + ) + f, err = newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 255 times, results in 85 files + for x := 0; x < 255; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + f.Close() + f, err = newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + } + defer f.Close() + + for y := 0; y < 255; y++ { + exp := getChunk(15, y) + got, err := f.Retrieve(uint64(y)) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, exp) { + t.Fatalf("test %d, got \n%x != \n%x", y, got, exp) + } + f.Close() + f, err = newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + } +} + +// TestFreezerRepairDanglingHead tests that we can recover if index entries are removed +func TestFreezerRepairDanglingHead(t *testing.T) { + t.Parallel() + rm, wm, sc := metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter() + fname := fmt.Sprintf("dangling_headtest-%d", rand.Uint64()) + + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 255 times + for x := 0; x < 255; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(0xfe); err != nil { + t.Fatal(err) + } + f.Close() + } + // open the index + idxFile, err := os.OpenFile(filepath.Join(os.TempDir(), fmt.Sprintf("%s.ridx", fname)), os.O_RDWR, 0644) + if err != nil { + t.Fatalf("Failed to open index file: %v", err) + } + // Remove 4 bytes + stat, err := idxFile.Stat() + if err != nil { + t.Fatalf("Failed to stat index file: %v", err) + } + idxFile.Truncate(stat.Size() - 4) + idxFile.Close() + // Now open it again + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // The last item should be missing + if _, err = f.Retrieve(0xff); err == nil { + t.Errorf("Expected error for missing index entry") + } + // The one before should still be there + if _, err = f.Retrieve(0xfd); err != nil { + t.Fatalf("Expected no error, got %v", err) + } + } +} + +// TestFreezerRepairDanglingHeadLarge tests that we can recover if very many index entries are removed +func TestFreezerRepairDanglingHeadLarge(t *testing.T) { + t.Parallel() + rm, wm, sc := metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter() + fname := fmt.Sprintf("dangling_headtest-%d", rand.Uint64()) + + { // Fill a table and close it + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 255 times + for x := 0; x < 0xff; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err == nil { + if err != nil { + t.Fatal(err) + } + } + f.Close() + } + // open the index + idxFile, err := os.OpenFile(filepath.Join(os.TempDir(), fmt.Sprintf("%s.ridx", fname)), os.O_RDWR, 0644) + if err != nil { + t.Fatalf("Failed to open index file: %v", err) + } + // Remove everything but the first item, and leave data unaligned + // 0-indexEntry, 1-indexEntry, corrupt-indexEntry + idxFile.Truncate(indexEntrySize + indexEntrySize + indexEntrySize/2) + idxFile.Close() + // Now open it again + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // The first item should be there + if _, err = f.Retrieve(0); err != nil { + t.Fatal(err) + } + // The second item should be missing + if _, err = f.Retrieve(1); err == nil { + t.Errorf("Expected error for missing index entry") + } + // We should now be able to store items again, from item = 1 + for x := 1; x < 0xff; x++ { + data := getChunk(15, ^x) + f.Append(uint64(x), data) + } + f.Close() + } + // And if we open it, we should now be able to read all of them (new values) + { + f, _ := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + for y := 1; y < 255; y++ { + exp := getChunk(15, ^y) + got, err := f.Retrieve(uint64(y)) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, exp) { + t.Fatalf("test %d, got \n%x != \n%x", y, got, exp) + } + } + } +} + +// TestSnappyDetection tests that we fail to open a snappy database and vice versa +func TestSnappyDetection(t *testing.T) { + t.Parallel() + rm, wm, sc := metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter() + fname := fmt.Sprintf("snappytest-%d", rand.Uint64()) + // Open with snappy + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 255 times + for x := 0; x < 0xff; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + f.Close() + } + // Open without snappy + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, false) + if err != nil { + t.Fatal(err) + } + if _, err = f.Retrieve(0); err == nil { + f.Close() + t.Fatalf("expected empty table") + } + } + + // Open with snappy + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // There should be 255 items + if _, err = f.Retrieve(0xfe); err != nil { + f.Close() + t.Fatalf("expected no error, got %v", err) + } + } + +} +func assertFileSize(f string, size int64) error { + stat, err := os.Stat(f) + if err != nil { + return err + } + if stat.Size() != size { + return fmt.Errorf("error, expected size %d, got %d", size, stat.Size()) + } + return nil + +} + +// TestFreezerRepairDanglingIndex checks that if the index has more entries than there are data, +// the index is repaired +func TestFreezerRepairDanglingIndex(t *testing.T) { + t.Parallel() + rm, wm, sc := metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter() + fname := fmt.Sprintf("dangling_indextest-%d", rand.Uint64()) + + { // Fill a table and close it + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 9 times : 150 bytes + for x := 0; x < 9; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err != nil { + f.Close() + t.Fatal(err) + } + f.Close() + // File sizes should be 45, 45, 45 : items[3, 3, 3) + } + // Crop third file + fileToCrop := filepath.Join(os.TempDir(), fmt.Sprintf("%s.0002.rdat", fname)) + // Truncate third file: 45 ,45, 20 + { + if err := assertFileSize(fileToCrop, 45); err != nil { + t.Fatal(err) + } + file, err := os.OpenFile(fileToCrop, os.O_RDWR, 0644) + if err != nil { + t.Fatal(err) + } + file.Truncate(20) + file.Close() + } + // Open db it again + // It should restore the file(s) to + // 45, 45, 15 + // with 3+3+1 items + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + if f.items != 7 { + f.Close() + t.Fatalf("expected %d items, got %d", 7, f.items) + } + if err := assertFileSize(fileToCrop, 15); err != nil { + t.Fatal(err) + } + } +} + +func TestFreezerTruncate(t *testing.T) { + + t.Parallel() + rm, wm, sc := metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter() + fname := fmt.Sprintf("truncation-%d", rand.Uint64()) + + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 30 times + for x := 0; x < 30; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err != nil { + t.Fatal(err) + } + f.Close() + } + // Reopen, truncate + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + defer f.Close() + f.truncate(10) // 150 bytes + if f.items != 10 { + t.Fatalf("expected %d items, got %d", 10, f.items) + } + // 45, 45, 45, 15 -- bytes should be 15 + if f.headBytes != 15 { + t.Fatalf("expected %d bytes, got %d", 15, f.headBytes) + } + + } + +} + +// TestFreezerRepairFirstFile tests a head file with the very first item only half-written. +// That will rewind the index, and _should_ truncate the head file +func TestFreezerRepairFirstFile(t *testing.T) { + t.Parallel() + rm, wm, sc := metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter() + fname := fmt.Sprintf("truncationfirst-%d", rand.Uint64()) + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 80 bytes, splitting out into two files + f.Append(0, getChunk(40, 0xFF)) + f.Append(1, getChunk(40, 0xEE)) + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err != nil { + t.Fatal(err) + } + f.Close() + } + // Truncate the file in half + fileToCrop := filepath.Join(os.TempDir(), fmt.Sprintf("%s.0001.rdat", fname)) + { + if err := assertFileSize(fileToCrop, 40); err != nil { + t.Fatal(err) + } + file, err := os.OpenFile(fileToCrop, os.O_RDWR, 0644) + if err != nil { + t.Fatal(err) + } + file.Truncate(20) + file.Close() + } + // Reopen + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + if f.items != 1 { + f.Close() + t.Fatalf("expected %d items, got %d", 0, f.items) + } + // Write 40 bytes + f.Append(1, getChunk(40, 0xDD)) + f.Close() + // Should have been truncated down to zero and then 40 written + if err := assertFileSize(fileToCrop, 40); err != nil { + t.Fatal(err) + } + } +} + +// TestFreezerReadAndTruncate tests: +// - we have a table open +// - do some reads, so files are open in readonly +// - truncate so those files are 'removed' +// - check that we did not keep the rdonly file descriptors +func TestFreezerReadAndTruncate(t *testing.T) { + t.Parallel() + rm, wm, sc := metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter() + fname := fmt.Sprintf("read_truncate-%d", rand.Uint64()) + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 30 times + for x := 0; x < 30; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err != nil { + t.Fatal(err) + } + f.Close() + } + // Reopen and read all files + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 50, true) + if err != nil { + t.Fatal(err) + } + if f.items != 30 { + f.Close() + t.Fatalf("expected %d items, got %d", 0, f.items) + } + for y := byte(0); y < 30; y++ { + f.Retrieve(uint64(y)) + } + // Now, truncate back to zero + f.truncate(0) + // Write the data again + for x := 0; x < 30; x++ { + data := getChunk(15, ^x) + if err := f.Append(uint64(x), data); err != nil { + t.Fatalf("error %v", err) + } + } + f.Close() + } +} + +func TestOffset(t *testing.T) { + t.Parallel() + rm, wm, sc := metrics.NewMeter(), metrics.NewMeter(), metrics.NewCounter() + fname := fmt.Sprintf("offset-%d", rand.Uint64()) + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 40, true) + if err != nil { + t.Fatal(err) + } + // Write 6 x 20 bytes, splitting out into three files + f.Append(0, getChunk(20, 0xFF)) + f.Append(1, getChunk(20, 0xEE)) + + f.Append(2, getChunk(20, 0xdd)) + f.Append(3, getChunk(20, 0xcc)) + + f.Append(4, getChunk(20, 0xbb)) + f.Append(5, getChunk(20, 0xaa)) + f.printIndex() + f.Close() + } + // Now crop it. + { + // delete files 0 and 1 + for i := 0; i < 2; i++ { + p := filepath.Join(os.TempDir(), fmt.Sprintf("%v.%04d.rdat", fname, i)) + if err := os.Remove(p); err != nil { + t.Fatal(err) + } + } + // Read the index file + p := filepath.Join(os.TempDir(), fmt.Sprintf("%v.ridx", fname)) + indexFile, err := os.OpenFile(p, os.O_RDWR, 0644) + if err != nil { + t.Fatal(err) + } + indexBuf := make([]byte, 7*indexEntrySize) + indexFile.Read(indexBuf) + + // Update the index file, so that we store + // [ file = 2, offset = 4 ] at index zero + + tailId := uint32(2) // First file is 2 + itemOffset := uint32(4) // We have removed four items + zeroIndex := indexEntry{ + offset: tailId, + filenum: itemOffset, + } + buf := zeroIndex.marshallBinary() + // Overwrite index zero + copy(indexBuf, buf) + // Remove the four next indices by overwriting + copy(indexBuf[indexEntrySize:], indexBuf[indexEntrySize*5:]) + indexFile.WriteAt(indexBuf, 0) + // Need to truncate the moved index items + indexFile.Truncate(indexEntrySize * (1 + 2)) + indexFile.Close() + + } + // Now open again + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sc, 40, true) + if err != nil { + t.Fatal(err) + } + f.printIndex() + // It should allow writing item 6 + f.Append(6, getChunk(20, 0x99)) + + // It should be fine to fetch 4,5,6 + if got, err := f.Retrieve(4); err != nil { + t.Fatal(err) + } else if exp := getChunk(20, 0xbb); !bytes.Equal(got, exp) { + t.Fatalf("expected %x got %x", exp, got) + } + if got, err := f.Retrieve(5); err != nil { + t.Fatal(err) + } else if exp := getChunk(20, 0xaa); !bytes.Equal(got, exp) { + t.Fatalf("expected %x got %x", exp, got) + } + if got, err := f.Retrieve(6); err != nil { + t.Fatal(err) + } else if exp := getChunk(20, 0x99); !bytes.Equal(got, exp) { + t.Fatalf("expected %x got %x", exp, got) + } + + // It should error at 0, 1,2,3 + for i := 0; i < 4; i++ { + if _, err := f.Retrieve(uint64(i)); err == nil { + t.Fatal("expected err") + } + } + } +} + +// TODO (?) +// - test that if we remove several head-files, aswell as data last data-file, +// the index is truncated accordingly +// Right now, the freezer would fail on these conditions: +// 1. have data files d0, d1, d2, d3 +// 2. remove d2,d3 +// +// However, all 'normal' failure modes arising due to failing to sync() or save a file should be +// handled already, and the case described above can only (?) happen if an external process/user +// deletes files from the filesystem. diff --git a/core/rawdb/interfaces.go b/core/rawdb/interfaces.go deleted file mode 100644 index 3bdf55124a03..000000000000 --- a/core/rawdb/interfaces.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package rawdb - -// DatabaseReader wraps the Has and Get method of a backing data store. -type DatabaseReader interface { - Has(key []byte) (bool, error) - Get(key []byte) ([]byte, error) -} - -// DatabaseWriter wraps the Put method of a backing data store. -type DatabaseWriter interface { - Put(key []byte, value []byte) error -} - -// DatabaseDeleter wraps the Delete method of a backing data store. -type DatabaseDeleter interface { - Delete(key []byte) error -} diff --git a/core/rawdb/schema.go b/core/rawdb/schema.go index ef597ef309f6..a44a2c99f94f 100644 --- a/core/rawdb/schema.go +++ b/core/rawdb/schema.go @@ -29,13 +29,13 @@ var ( // databaseVerisionKey tracks the current database version. databaseVerisionKey = []byte("DatabaseVersion") - // headHeaderKey tracks the latest know header's hash. + // headHeaderKey tracks the latest known header's hash. headHeaderKey = []byte("LastHeader") - // headBlockKey tracks the latest know full block's hash. + // headBlockKey tracks the latest known full block's hash. headBlockKey = []byte("LastBlock") - // headFastBlockKey tracks the latest known incomplete block's hash duirng fast sync. + // headFastBlockKey tracks the latest known incomplete block's hash during fast sync. headFastBlockKey = []byte("LastFast") // fastTrieProgressKey tracks the number of trie entries imported during fast sync. @@ -63,9 +63,36 @@ var ( preimageHitCounter = metrics.NewRegisteredCounter("db/preimage/hits", nil) ) -// TxLookupEntry is a positional metadata to help looking up the data content of -// a transaction or receipt given only its hash. -type TxLookupEntry struct { +const ( + // freezerHeaderTable indicates the name of the freezer header table. + freezerHeaderTable = "headers" + + // freezerHashTable indicates the name of the freezer canonical hash table. + freezerHashTable = "hashes" + + // freezerBodiesTable indicates the name of the freezer block body table. + freezerBodiesTable = "bodies" + + // freezerReceiptTable indicates the name of the freezer receipts table. + freezerReceiptTable = "receipts" + + // freezerDifficultyTable indicates the name of the freezer total difficulty table. + freezerDifficultyTable = "diffs" +) + +// freezerNoSnappy configures whether compression is disabled for the ancient-tables. +// Hashes and difficulties don't compress well. +var freezerNoSnappy = map[string]bool{ + freezerHeaderTable: false, + freezerHashTable: true, + freezerBodiesTable: false, + freezerReceiptTable: false, + freezerDifficultyTable: true, +} + +// LegacyTxLookupEntry is the legacy TxLookupEntry definition with some unnecessary +// fields. +type LegacyTxLookupEntry struct { BlockHash common.Hash BlockIndex uint64 Index uint64 @@ -78,6 +105,11 @@ func encodeBlockNumber(number uint64) []byte { return enc } +// headerKeyPrefix = headerPrefix + num (uint64 big endian) +func headerKeyPrefix(number uint64) []byte { + return append(headerPrefix, encodeBlockNumber(number)...) +} + // headerKey = headerPrefix + num (uint64 big endian) + hash func headerKey(number uint64, hash common.Hash) []byte { return append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...) diff --git a/core/rawdb/table.go b/core/rawdb/table.go new file mode 100644 index 000000000000..6610b7f5a256 --- /dev/null +++ b/core/rawdb/table.go @@ -0,0 +1,204 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rawdb + +import ( + "github.com/ethereum/go-ethereum/ethdb" +) + +// table is a wrapper around a database that prefixes each key access with a pre- +// configured string. +type table struct { + db ethdb.Database + prefix string +} + +// NewTable returns a database object that prefixes all keys with a given string. +func NewTable(db ethdb.Database, prefix string) ethdb.Database { + return &table{ + db: db, + prefix: prefix, + } +} + +// Close is a noop to implement the Database interface. +func (t *table) Close() error { + return nil +} + +// Has retrieves if a prefixed version of a key is present in the database. +func (t *table) Has(key []byte) (bool, error) { + return t.db.Has(append([]byte(t.prefix), key...)) +} + +// Get retrieves the given prefixed key if it's present in the database. +func (t *table) Get(key []byte) ([]byte, error) { + return t.db.Get(append([]byte(t.prefix), key...)) +} + +// HasAncient is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) HasAncient(kind string, number uint64) (bool, error) { + return t.db.HasAncient(kind, number) +} + +// Ancient is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) Ancient(kind string, number uint64) ([]byte, error) { + return t.db.Ancient(kind, number) +} + +// Ancients is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) Ancients() (uint64, error) { + return t.db.Ancients() +} + +// AncientSize is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) AncientSize(kind string) (uint64, error) { + return t.db.AncientSize(kind) +} + +// AppendAncient is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) AppendAncient(number uint64, hash, header, body, receipts, td []byte) error { + return t.db.AppendAncient(number, hash, header, body, receipts, td) +} + +// TruncateAncients is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) TruncateAncients(items uint64) error { + return t.db.TruncateAncients(items) +} + +// Sync is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) Sync() error { + return t.db.Sync() +} + +// Put inserts the given value into the database at a prefixed version of the +// provided key. +func (t *table) Put(key []byte, value []byte) error { + return t.db.Put(append([]byte(t.prefix), key...), value) +} + +// Delete removes the given prefixed key from the database. +func (t *table) Delete(key []byte) error { + return t.db.Delete(append([]byte(t.prefix), key...)) +} + +// NewIterator creates a binary-alphabetical iterator over the entire keyspace +// contained within the database. +func (t *table) NewIterator() ethdb.Iterator { + return t.NewIteratorWithPrefix(nil) +} + +// NewIteratorWithStart creates a binary-alphabetical iterator over a subset of +// database content starting at a particular initial key (or after, if it does +// not exist). +func (t *table) NewIteratorWithStart(start []byte) ethdb.Iterator { + return t.db.NewIteratorWithStart(start) +} + +// NewIteratorWithPrefix creates a binary-alphabetical iterator over a subset +// of database content with a particular key prefix. +func (t *table) NewIteratorWithPrefix(prefix []byte) ethdb.Iterator { + return t.db.NewIteratorWithPrefix(append([]byte(t.prefix), prefix...)) +} + +// Stat returns a particular internal stat of the database. +func (t *table) Stat(property string) (string, error) { + return t.db.Stat(property) +} + +// Compact flattens the underlying data store for the given key range. In essence, +// deleted and overwritten versions are discarded, and the data is rearranged to +// reduce the cost of operations needed to access them. +// +// A nil start is treated as a key before all keys in the data store; a nil limit +// is treated as a key after all keys in the data store. If both is nil then it +// will compact entire data store. +func (t *table) Compact(start []byte, limit []byte) error { + // If no start was specified, use the table prefix as the first value + if start == nil { + start = []byte(t.prefix) + } + // If no limit was specified, use the first element not matching the prefix + // as the limit + if limit == nil { + limit = []byte(t.prefix) + for i := len(limit) - 1; i >= 0; i-- { + // Bump the current character, stopping if it doesn't overflow + limit[i]++ + if limit[i] > 0 { + break + } + // Character overflown, proceed to the next or nil if the last + if i == 0 { + limit = nil + } + } + } + // Range correctly calculated based on table prefix, delegate down + return t.db.Compact(start, limit) +} + +// NewBatch creates a write-only database that buffers changes to its host db +// until a final write is called, each operation prefixing all keys with the +// pre-configured string. +func (t *table) NewBatch() ethdb.Batch { + return &tableBatch{t.db.NewBatch(), t.prefix} +} + +// tableBatch is a wrapper around a database batch that prefixes each key access +// with a pre-configured string. +type tableBatch struct { + batch ethdb.Batch + prefix string +} + +// Put inserts the given value into the batch for later committing. +func (b *tableBatch) Put(key, value []byte) error { + return b.batch.Put(append([]byte(b.prefix), key...), value) +} + +// Delete inserts the a key removal into the batch for later committing. +func (b *tableBatch) Delete(key []byte) error { + return b.batch.Delete(append([]byte(b.prefix), key...)) +} + +// ValueSize retrieves the amount of data queued up for writing. +func (b *tableBatch) ValueSize() int { + return b.batch.ValueSize() +} + +// Write flushes any accumulated data to disk. +func (b *tableBatch) Write() error { + return b.batch.Write() +} + +// Reset resets the batch for reuse. +func (b *tableBatch) Reset() { + b.batch.Reset() +} + +// Replay replays the batch contents. +func (b *tableBatch) Replay(w ethdb.KeyValueWriter) error { + return b.batch.Replay(w) +} diff --git a/core/state/database.go b/core/state/database.go index c1b630991ce0..ecc2c134da6c 100644 --- a/core/state/database.go +++ b/core/state/database.go @@ -18,7 +18,6 @@ package state import ( "fmt" - "sync" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethdb" @@ -26,14 +25,7 @@ import ( lru "github.com/hashicorp/golang-lru" ) -// Trie cache generation limit after which to evict trie nodes from memory. -var MaxTrieCacheGen = uint16(120) - const ( - // Number of past tries to keep. This value is chosen such that - // reasonable chain reorg depths will hit an existing trie. - maxPastTries = 12 - // Number of codehash->size associations to keep. codeSizeCacheSize = 100000 ) @@ -59,76 +51,87 @@ type Database interface { TrieDB() *trie.Database } -// Trie is a Ethereum Merkle Trie. +// Trie is a Ethereum Merkle Patricia trie. type Trie interface { + // GetKey returns the sha3 preimage of a hashed key that was previously used + // to store a value. + // + // TODO(fjl): remove this when SecureTrie is removed + GetKey([]byte) []byte + + // TryGet returns the value for key stored in the trie. The value bytes must + // not be modified by the caller. If a node was not found in the database, a + // trie.MissingNodeError is returned. TryGet(key []byte) ([]byte, error) + + // TryUpdate associates key with value in the trie. If value has length zero, any + // existing value is deleted from the trie. The value bytes must not be modified + // by the caller while they are stored in the trie. If a node was not found in the + // database, a trie.MissingNodeError is returned. TryUpdate(key, value []byte) error + + // TryDelete removes any existing value for key from the trie. If a node was not + // found in the database, a trie.MissingNodeError is returned. TryDelete(key []byte) error - Commit(onleaf trie.LeafCallback) (common.Hash, error) + + // Hash returns the root hash of the trie. It does not write to the database and + // can be used even if the trie doesn't have one. Hash() common.Hash + + // Commit writes all nodes to the trie's memory database, tracking the internal + // and external (for account tries) references. + Commit(onleaf trie.LeafCallback) (common.Hash, error) + + // NodeIterator returns an iterator that returns nodes of the trie. Iteration + // starts at the key after the given start key. NodeIterator(startKey []byte) trie.NodeIterator - GetKey([]byte) []byte // TODO(fjl): remove this when SecureTrie is removed - Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error + + // Prove constructs a Merkle proof for key. The result contains all encoded nodes + // on the path to the value at key. The value itself is also included in the last + // node and can be retrieved by verifying the proof. + // + // If the trie does not contain a value for key, the returned proof contains all + // nodes of the longest existing prefix of the key (at least the root), ending + // with the node that proves the absence of the key. + Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error } // NewDatabase creates a backing store for state. The returned database is safe for -// concurrent use and retains cached trie nodes in memory. The pool is an optional -// intermediate trie-node memory pool between the low level storage layer and the -// high level trie abstraction. +// concurrent use, but does not retain any recent trie nodes in memory. To keep some +// historical state in memory, use the NewDatabaseWithCache constructor. func NewDatabase(db ethdb.Database) Database { + return NewDatabaseWithCache(db, 0) +} + +// NewDatabaseWithCache creates a backing store for state. The returned database +// is safe for concurrent use and retains a lot of collapsed RLP trie nodes in a +// large memory cache. +func NewDatabaseWithCache(db ethdb.Database, cache int) Database { csc, _ := lru.New(codeSizeCacheSize) return &cachingDB{ - db: trie.NewDatabase(db), + db: trie.NewDatabaseWithCache(db, cache), codeSizeCache: csc, } } type cachingDB struct { db *trie.Database - mu sync.Mutex - pastTries []*trie.SecureTrie codeSizeCache *lru.Cache } -// OpenTrie opens the main account trie. +// OpenTrie opens the main account trie at a specific root hash. func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) { - db.mu.Lock() - defer db.mu.Unlock() - - for i := len(db.pastTries) - 1; i >= 0; i-- { - if db.pastTries[i].Hash() == root { - return cachedTrie{db.pastTries[i].Copy(), db}, nil - } - } - tr, err := trie.NewSecure(root, db.db, MaxTrieCacheGen) - if err != nil { - return nil, err - } - return cachedTrie{tr, db}, nil -} - -func (db *cachingDB) pushTrie(t *trie.SecureTrie) { - db.mu.Lock() - defer db.mu.Unlock() - - if len(db.pastTries) >= maxPastTries { - copy(db.pastTries, db.pastTries[1:]) - db.pastTries[len(db.pastTries)-1] = t - } else { - db.pastTries = append(db.pastTries, t) - } + return trie.NewSecure(root, db.db) } // OpenStorageTrie opens the storage trie of an account. func (db *cachingDB) OpenStorageTrie(addrHash, root common.Hash) (Trie, error) { - return trie.NewSecure(root, db.db, 0) + return trie.NewSecure(root, db.db) } // CopyTrie returns an independent copy of the given trie. func (db *cachingDB) CopyTrie(t Trie) Trie { switch t := t.(type) { - case cachedTrie: - return cachedTrie{t.SecureTrie.Copy(), db} case *trie.SecureTrie: return t.Copy() default: @@ -158,21 +161,3 @@ func (db *cachingDB) ContractCodeSize(addrHash, codeHash common.Hash) (int, erro func (db *cachingDB) TrieDB() *trie.Database { return db.db } - -// cachedTrie inserts its trie into a cachingDB on commit. -type cachedTrie struct { - *trie.SecureTrie - db *cachingDB -} - -func (m cachedTrie) Commit(onleaf trie.LeafCallback) (common.Hash, error) { - root, err := m.SecureTrie.Commit(onleaf) - if err == nil { - m.db.pushTrie(m.SecureTrie) - } - return root, err -} - -func (m cachedTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { - return m.SecureTrie.Prove(key, fromLevel, proofDb) -} diff --git a/core/state/dump.go b/core/state/dump.go index 072dbbf05300..51d3e5554f61 100644 --- a/core/state/dump.go +++ b/core/state/dump.go @@ -21,61 +21,133 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" ) +// DumpAccount represents an account in the state type DumpAccount struct { - Balance string `json:"balance"` - Nonce uint64 `json:"nonce"` - Root string `json:"root"` - CodeHash string `json:"codeHash"` - Code string `json:"code"` - Storage map[string]string `json:"storage"` + Balance string `json:"balance"` + Nonce uint64 `json:"nonce"` + Root string `json:"root"` + CodeHash string `json:"codeHash"` + Code string `json:"code,omitempty"` + Storage map[common.Hash]string `json:"storage,omitempty"` + Address *common.Address `json:"address,omitempty"` // Address only present in iterative (line-by-line) mode + SecureKey hexutil.Bytes `json:"key,omitempty"` // If we don't have address, we can output the key + } +// Dump represents the full dump in a collected format, as one large map type Dump struct { - Root string `json:"root"` - Accounts map[string]DumpAccount `json:"accounts"` + Root string `json:"root"` + Accounts map[common.Address]DumpAccount `json:"accounts"` +} + +// iterativeDump is a 'collector'-implementation which dump output line-by-line iteratively +type iterativeDump json.Encoder + +// Collector interface which the state trie calls during iteration +type collector interface { + onRoot(common.Hash) + onAccount(common.Address, DumpAccount) +} + +func (self *Dump) onRoot(root common.Hash) { + self.Root = fmt.Sprintf("%x", root) } -func (self *StateDB) RawDump() Dump { - dump := Dump{ - Root: fmt.Sprintf("%x", self.trie.Hash()), - Accounts: make(map[string]DumpAccount), +func (self *Dump) onAccount(addr common.Address, account DumpAccount) { + self.Accounts[addr] = account +} + +func (self iterativeDump) onAccount(addr common.Address, account DumpAccount) { + dumpAccount := &DumpAccount{ + Balance: account.Balance, + Nonce: account.Nonce, + Root: account.Root, + CodeHash: account.CodeHash, + Code: account.Code, + Storage: account.Storage, + SecureKey: account.SecureKey, + Address: nil, + } + if addr != (common.Address{}) { + dumpAccount.Address = &addr } + (*json.Encoder)(&self).Encode(dumpAccount) +} +func (self iterativeDump) onRoot(root common.Hash) { + (*json.Encoder)(&self).Encode(struct { + Root common.Hash `json:"root"` + }{root}) +} +func (self *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissingPreimages bool) { + emptyAddress := (common.Address{}) + missingPreimages := 0 + c.onRoot(self.trie.Hash()) it := trie.NewIterator(self.trie.NodeIterator(nil)) for it.Next() { - addr := self.trie.GetKey(it.Key) var data Account if err := rlp.DecodeBytes(it.Value, &data); err != nil { panic(err) } - - obj := newObject(nil, common.BytesToAddress(addr), data) + addr := common.BytesToAddress(self.trie.GetKey(it.Key)) + obj := newObject(nil, addr, data) account := DumpAccount{ Balance: data.Balance.String(), Nonce: data.Nonce, Root: common.Bytes2Hex(data.Root[:]), CodeHash: common.Bytes2Hex(data.CodeHash), - Code: common.Bytes2Hex(obj.Code(self.db)), - Storage: make(map[string]string), } - storageIt := trie.NewIterator(obj.getTrie(self.db).NodeIterator(nil)) - for storageIt.Next() { - account.Storage[common.Bytes2Hex(self.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(storageIt.Value) + if emptyAddress == addr { + // Preimage missing + missingPreimages++ + if excludeMissingPreimages { + continue + } + account.SecureKey = it.Key + } + if !excludeCode { + account.Code = common.Bytes2Hex(obj.Code(self.db)) + } + if !excludeStorage { + account.Storage = make(map[common.Hash]string) + storageIt := trie.NewIterator(obj.getTrie(self.db).NodeIterator(nil)) + for storageIt.Next() { + account.Storage[common.BytesToHash(self.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(storageIt.Value) + } } - dump.Accounts[common.Bytes2Hex(addr)] = account + c.onAccount(addr, account) + } + if missingPreimages > 0 { + log.Warn("Dump incomplete due to missing preimages", "missing", missingPreimages) + } +} + +// RawDump returns the entire state an a single large object +func (self *StateDB) RawDump(excludeCode, excludeStorage, excludeMissingPreimages bool) Dump { + dump := &Dump{ + Accounts: make(map[common.Address]DumpAccount), } - return dump + self.dump(dump, excludeCode, excludeStorage, excludeMissingPreimages) + return *dump } -func (self *StateDB) Dump() []byte { - json, err := json.MarshalIndent(self.RawDump(), "", " ") +// Dump returns a JSON string representing the entire state as a single json-object +func (self *StateDB) Dump(excludeCode, excludeStorage, excludeMissingPreimages bool) []byte { + dump := self.RawDump(excludeCode, excludeStorage, excludeMissingPreimages) + json, err := json.MarshalIndent(dump, "", " ") if err != nil { fmt.Println("dump err", err) } - return json } + +// IterativeDump dumps out accounts as json-objects, delimited by linebreaks on stdout +func (self *StateDB) IterativeDump(excludeCode, excludeStorage, excludeMissingPreimages bool, output *json.Encoder) { + self.dump(iterativeDump(*output), excludeCode, excludeStorage, excludeMissingPreimages) +} diff --git a/core/state/iterator_test.go b/core/state/iterator_test.go index 9e46c851cdcb..69f51c4c7d8a 100644 --- a/core/state/iterator_test.go +++ b/core/state/iterator_test.go @@ -51,7 +51,9 @@ func TestNodeIteratorCoverage(t *testing.T) { t.Errorf("state entry not reported %x", hash) } } - for _, key := range db.TrieDB().DiskDB().(*ethdb.MemDatabase).Keys() { + it := db.TrieDB().DiskDB().(ethdb.Database).NewIterator() + for it.Next() { + key := it.Key() if bytes.HasPrefix(key, []byte("secure-key-")) { continue } @@ -59,4 +61,5 @@ func TestNodeIteratorCoverage(t *testing.T) { t.Errorf("state entry not reported %x", key) } } + it.Release() } diff --git a/core/state/managed_state.go b/core/state/managed_state.go deleted file mode 100644 index 1390ef4a00af..000000000000 --- a/core/state/managed_state.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package state - -import ( - "sync" - - "github.com/ethereum/go-ethereum/common" -) - -type account struct { - stateObject *stateObject - nstart uint64 - nonces []bool -} - -type ManagedState struct { - *StateDB - - mu sync.RWMutex - - accounts map[common.Address]*account -} - -// ManagedState returns a new managed state with the statedb as it's backing layer -func ManageState(statedb *StateDB) *ManagedState { - return &ManagedState{ - StateDB: statedb.Copy(), - accounts: make(map[common.Address]*account), - } -} - -// SetState sets the backing layer of the managed state -func (ms *ManagedState) SetState(statedb *StateDB) { - ms.mu.Lock() - defer ms.mu.Unlock() - ms.StateDB = statedb -} - -// RemoveNonce removed the nonce from the managed state and all future pending nonces -func (ms *ManagedState) RemoveNonce(addr common.Address, n uint64) { - if ms.hasAccount(addr) { - ms.mu.Lock() - defer ms.mu.Unlock() - - account := ms.getAccount(addr) - if n-account.nstart <= uint64(len(account.nonces)) { - reslice := make([]bool, n-account.nstart) - copy(reslice, account.nonces[:n-account.nstart]) - account.nonces = reslice - } - } -} - -// NewNonce returns the new canonical nonce for the managed account -func (ms *ManagedState) NewNonce(addr common.Address) uint64 { - ms.mu.Lock() - defer ms.mu.Unlock() - - account := ms.getAccount(addr) - for i, nonce := range account.nonces { - if !nonce { - return account.nstart + uint64(i) - } - } - account.nonces = append(account.nonces, true) - - return uint64(len(account.nonces)-1) + account.nstart -} - -// GetNonce returns the canonical nonce for the managed or unmanaged account. -// -// Because GetNonce mutates the DB, we must take a write lock. -func (ms *ManagedState) GetNonce(addr common.Address) uint64 { - ms.mu.Lock() - defer ms.mu.Unlock() - - if ms.hasAccount(addr) { - account := ms.getAccount(addr) - return uint64(len(account.nonces)) + account.nstart - } else { - return ms.StateDB.GetNonce(addr) - } -} - -// SetNonce sets the new canonical nonce for the managed state -func (ms *ManagedState) SetNonce(addr common.Address, nonce uint64) { - ms.mu.Lock() - defer ms.mu.Unlock() - - so := ms.GetOrNewStateObject(addr) - so.SetNonce(nonce) - - ms.accounts[addr] = newAccount(so) -} - -// HasAccount returns whether the given address is managed or not -func (ms *ManagedState) HasAccount(addr common.Address) bool { - ms.mu.RLock() - defer ms.mu.RUnlock() - return ms.hasAccount(addr) -} - -func (ms *ManagedState) hasAccount(addr common.Address) bool { - _, ok := ms.accounts[addr] - return ok -} - -// populate the managed state -func (ms *ManagedState) getAccount(addr common.Address) *account { - if account, ok := ms.accounts[addr]; !ok { - so := ms.GetOrNewStateObject(addr) - ms.accounts[addr] = newAccount(so) - } else { - // Always make sure the state account nonce isn't actually higher - // than the tracked one. - so := ms.StateDB.getStateObject(addr) - if so != nil && uint64(len(account.nonces))+account.nstart < so.Nonce() { - ms.accounts[addr] = newAccount(so) - } - - } - - return ms.accounts[addr] -} - -func newAccount(so *stateObject) *account { - return &account{so, so.Nonce(), nil} -} diff --git a/core/state/managed_state_test.go b/core/state/managed_state_test.go deleted file mode 100644 index 3d9c4e867603..000000000000 --- a/core/state/managed_state_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package state - -import ( - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" -) - -var addr = common.BytesToAddress([]byte("test")) - -func create() (*ManagedState, *account) { - statedb, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) - ms := ManageState(statedb) - ms.StateDB.SetNonce(addr, 100) - ms.accounts[addr] = newAccount(ms.StateDB.getStateObject(addr)) - return ms, ms.accounts[addr] -} - -func TestNewNonce(t *testing.T) { - ms, _ := create() - - nonce := ms.NewNonce(addr) - if nonce != 100 { - t.Error("expected nonce 100. got", nonce) - } - - nonce = ms.NewNonce(addr) - if nonce != 101 { - t.Error("expected nonce 101. got", nonce) - } -} - -func TestRemove(t *testing.T) { - ms, account := create() - - nn := make([]bool, 10) - for i := range nn { - nn[i] = true - } - account.nonces = append(account.nonces, nn...) - - i := uint64(5) - ms.RemoveNonce(addr, account.nstart+i) - if len(account.nonces) != 5 { - t.Error("expected", i, "'th index to be false") - } -} - -func TestReuse(t *testing.T) { - ms, account := create() - - nn := make([]bool, 10) - for i := range nn { - nn[i] = true - } - account.nonces = append(account.nonces, nn...) - - i := uint64(5) - ms.RemoveNonce(addr, account.nstart+i) - nonce := ms.NewNonce(addr) - if nonce != 105 { - t.Error("expected nonce to be 105. got", nonce) - } -} - -func TestRemoteNonceChange(t *testing.T) { - ms, account := create() - nn := make([]bool, 10) - for i := range nn { - nn[i] = true - } - account.nonces = append(account.nonces, nn...) - ms.NewNonce(addr) - - ms.StateDB.stateObjects[addr].data.Nonce = 200 - nonce := ms.NewNonce(addr) - if nonce != 200 { - t.Error("expected nonce after remote update to be", 200, "got", nonce) - } - ms.NewNonce(addr) - ms.NewNonce(addr) - ms.NewNonce(addr) - ms.StateDB.stateObjects[addr].data.Nonce = 200 - nonce = ms.NewNonce(addr) - if nonce != 204 { - t.Error("expected nonce after remote update to be", 204, "got", nonce) - } -} - -func TestSetNonce(t *testing.T) { - ms, _ := create() - - var addr common.Address - ms.SetNonce(addr, 10) - - if ms.GetNonce(addr) != 10 { - t.Error("Expected nonce of 10, got", ms.GetNonce(addr)) - } - - addr[0] = 1 - ms.StateDB.SetNonce(addr, 1) - - if ms.GetNonce(addr) != 1 { - t.Error("Expected nonce of 1, got", ms.GetNonce(addr)) - } -} diff --git a/core/state/state_object.go b/core/state/state_object.go index b120ea70182a..51b960a10ce6 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -21,9 +21,11 @@ import ( "fmt" "io" "math/big" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/rlp" ) @@ -31,23 +33,23 @@ var emptyCodeHash = crypto.Keccak256(nil) type Code []byte -func (self Code) String() string { - return string(self) //strings.Join(Disassemble(self), " ") +func (c Code) String() string { + return string(c) //strings.Join(Disassemble(c), " ") } type Storage map[common.Hash]common.Hash -func (self Storage) String() (str string) { - for key, value := range self { +func (s Storage) String() (str string) { + for key, value := range s { str += fmt.Sprintf("%X : %X\n", key, value) } return } -func (self Storage) Copy() Storage { +func (s Storage) Copy() Storage { cpy := make(Storage) - for key, value := range self { + for key, value := range s { cpy[key] = value } @@ -77,8 +79,8 @@ type stateObject struct { trie Trie // storage trie, which becomes non-nil on first access code Code // contract bytecode, which gets set when code is loaded - originStorage Storage // Storage cache of original entries to dedup rewrites - dirtyStorage Storage // Storage entries that need to be flushed to disk + originStorage Storage // Storage cache of original entries to dedup rewrites + dirtyStorage Storage // Storage entries that need to be flushed to disk dirtyStorageKeys []common.Hash // Dirty storage keys in order of insertion into dirtyStorage // Cache flags. @@ -112,213 +114,231 @@ func newObject(db *StateDB, address common.Address, data Account) *stateObject { data.CodeHash = emptyCodeHash } return &stateObject{ - db: db, - address: address, - addrHash: crypto.Keccak256Hash(address[:]), - data: data, - originStorage: make(Storage), - dirtyStorage: make(Storage), + db: db, + address: address, + addrHash: crypto.Keccak256Hash(address[:]), + data: data, + originStorage: make(Storage), + dirtyStorage: make(Storage), dirtyStorageKeys: nil, } } // EncodeRLP implements rlp.Encoder. -func (c *stateObject) EncodeRLP(w io.Writer) error { - return rlp.Encode(w, c.data) +func (s *stateObject) EncodeRLP(w io.Writer) error { + return rlp.Encode(w, s.data) } // setError remembers the first non-nil error it is called with. -func (self *stateObject) setError(err error) { - if self.dbErr == nil { - self.dbErr = err +func (s *stateObject) setError(err error) { + if s.dbErr == nil { + s.dbErr = err } } -func (self *stateObject) markSuicided() { - self.suicided = true +func (s *stateObject) markSuicided() { + s.suicided = true } -func (c *stateObject) touch() { - c.db.journal.append(touchChange{ - account: &c.address, +func (s *stateObject) touch() { + s.db.journal.append(touchChange{ + account: &s.address, }) - if c.address == ripemd { + if s.address == ripemd { // Explicitly put it in the dirty-cache, which is otherwise generated from // flattened journals. - c.db.journal.dirty(c.address) + s.db.journal.dirty(s.address) } } -func (c *stateObject) getTrie(db Database) Trie { - if c.trie == nil { +func (s *stateObject) getTrie(db Database) Trie { + if s.trie == nil { var err error - c.trie, err = db.OpenStorageTrie(c.addrHash, c.data.Root) + s.trie, err = db.OpenStorageTrie(s.addrHash, s.data.Root) if err != nil { - c.trie, _ = db.OpenStorageTrie(c.addrHash, common.Hash{}) - c.setError(fmt.Errorf("can't create storage trie: %v", err)) + s.trie, _ = db.OpenStorageTrie(s.addrHash, common.Hash{}) + s.setError(fmt.Errorf("can't create storage trie: %v", err)) } } - return c.trie + return s.trie } // GetState retrieves a value from the account storage trie. -func (self *stateObject) GetState(db Database, key common.Hash) common.Hash { +func (s *stateObject) GetState(db Database, key common.Hash) common.Hash { // If we have a dirty value for this state entry, return it - value, dirty := self.dirtyStorage[key] + value, dirty := s.dirtyStorage[key] if dirty { return value } // Otherwise return the entry's original value - return self.GetCommittedState(db, key) + return s.GetCommittedState(db, key) } // GetCommittedState retrieves a value from the committed account storage trie. -func (self *stateObject) GetCommittedState(db Database, key common.Hash) common.Hash { +func (s *stateObject) GetCommittedState(db Database, key common.Hash) common.Hash { // If we have the original value cached, return that - value, cached := self.originStorage[key] + value, cached := s.originStorage[key] if cached { return value } + // Track the amount of time wasted on reading the storge trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.db.StorageReads += time.Since(start) }(time.Now()) + } // Otherwise load the value from the database - enc, err := self.getTrie(db).TryGet(key[:]) + enc, err := s.getTrie(db).TryGet(key[:]) if err != nil { - self.setError(err) + s.setError(err) return common.Hash{} } if len(enc) > 0 { _, content, _, err := rlp.Split(enc) if err != nil { - self.setError(err) + s.setError(err) } value.SetBytes(content) } - self.originStorage[key] = value + s.originStorage[key] = value return value } // SetState updates a value in account storage. -func (self *stateObject) SetState(db Database, key, value common.Hash) { +func (s *stateObject) SetState(db Database, key, value common.Hash) { // If the new value is the same as old, don't set - prev := self.GetState(db, key) + prev := s.GetState(db, key) if prev == value { return } // New value is different, update and journal the change - self.db.journal.append(storageChange{ - account: &self.address, + s.db.journal.append(storageChange{ + account: &s.address, key: key, prevalue: prev, }) - self.setState(key, value) + s.setState(key, value) } -func (self *stateObject) setState(key, value common.Hash) { - self.dirtyStorage[key] = value - for _, k := range self.dirtyStorageKeys { +func (s *stateObject) setState(key, value common.Hash) { + s.dirtyStorage[key] = value + for _, k := range s.dirtyStorageKeys { if k == key { return } } - self.dirtyStorageKeys = append(self.dirtyStorageKeys, key) + s.dirtyStorageKeys = append(s.dirtyStorageKeys, key) } // updateTrie writes cached storage modifications into the object's storage trie. -func (self *stateObject) updateTrie(db Database) Trie { - tr := self.getTrie(db) +func (s *stateObject) updateTrie(db Database) Trie { + // Track the amount of time wasted on updating the storge trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.db.StorageUpdates += time.Since(start) }(time.Now()) + } + // Update all the dirty slots in the trie + tr := s.getTrie(db) // Iterate through the storage keys in deterministic order to ensure the storage trie is // identical across machines - for _, key := range self.dirtyStorageKeys { - value := self.dirtyStorage[key] - delete(self.dirtyStorage, key) + for _, key := range s.dirtyStorageKeys { + value := s.dirtyStorage[key] + delete(s.dirtyStorage, key) // Skip noop changes, persist actual changes - if value == self.originStorage[key] { + if value == s.originStorage[key] { continue } - self.originStorage[key] = value + s.originStorage[key] = value if (value == common.Hash{}) { - self.setError(tr.TryDelete(key[:])) + s.setError(tr.TryDelete(key[:])) continue } // Encoding []byte cannot fail, ok to ignore the error. v, _ := rlp.EncodeToBytes(bytes.TrimLeft(value[:], "\x00")) - self.setError(tr.TryUpdate(key[:], v)) + s.setError(tr.TryUpdate(key[:], v)) } return tr } // UpdateRoot sets the trie root to the current root hash of -func (self *stateObject) updateRoot(db Database) { - self.updateTrie(db) - self.data.Root = self.trie.Hash() +func (s *stateObject) updateRoot(db Database) { + s.updateTrie(db) + + // Track the amount of time wasted on hashing the storge trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.db.StorageHashes += time.Since(start) }(time.Now()) + } + s.data.Root = s.trie.Hash() } // CommitTrie the storage trie of the object to db. // This updates the trie root. -func (self *stateObject) CommitTrie(db Database) error { - self.updateTrie(db) - if self.dbErr != nil { - return self.dbErr +func (s *stateObject) CommitTrie(db Database) error { + s.updateTrie(db) + if s.dbErr != nil { + return s.dbErr + } + // Track the amount of time wasted on committing the storge trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.db.StorageCommits += time.Since(start) }(time.Now()) } - root, err := self.trie.Commit(nil) + root, err := s.trie.Commit(nil) if err == nil { - self.data.Root = root + s.data.Root = root } return err } // AddBalance removes amount from c's balance. // It is used to add funds to the destination account of a transfer. -func (c *stateObject) AddBalance(amount *big.Int) { +func (s *stateObject) AddBalance(amount *big.Int) { // EIP158: We must check emptiness for the objects such that the account // clearing (0,0,0 objects) can take effect. if amount.Sign() == 0 { - if c.empty() { - c.touch() + if s.empty() { + s.touch() } return } - c.SetBalance(new(big.Int).Add(c.Balance(), amount)) + s.SetBalance(new(big.Int).Add(s.Balance(), amount)) } // SubBalance removes amount from c's balance. // It is used to remove funds from the origin account of a transfer. -func (c *stateObject) SubBalance(amount *big.Int) { +func (s *stateObject) SubBalance(amount *big.Int) { if amount.Sign() == 0 { return } - c.SetBalance(new(big.Int).Sub(c.Balance(), amount)) + s.SetBalance(new(big.Int).Sub(s.Balance(), amount)) } -func (self *stateObject) SetBalance(amount *big.Int) { - self.db.journal.append(balanceChange{ - account: &self.address, - prev: new(big.Int).Set(self.data.Balance), +func (s *stateObject) SetBalance(amount *big.Int) { + s.db.journal.append(balanceChange{ + account: &s.address, + prev: new(big.Int).Set(s.data.Balance), }) - self.setBalance(amount) + s.setBalance(amount) } -func (self *stateObject) setBalance(amount *big.Int) { - self.data.Balance = amount +func (s *stateObject) setBalance(amount *big.Int) { + s.data.Balance = amount } // Return the gas back to the origin. Used by the Virtual machine or Closures -func (c *stateObject) ReturnGas(gas *big.Int) {} +func (s *stateObject) ReturnGas(gas *big.Int) {} -func (self *stateObject) deepCopy(db *StateDB) *stateObject { - stateObject := newObject(db, self.address, self.data) - if self.trie != nil { - stateObject.trie = db.db.CopyTrie(self.trie) +func (s *stateObject) deepCopy(db *StateDB) *stateObject { + stateObject := newObject(db, s.address, s.data) + if s.trie != nil { + stateObject.trie = db.db.CopyTrie(s.trie) } - stateObject.code = self.code - stateObject.dirtyStorage = self.dirtyStorage.Copy() - stateObject.dirtyStorageKeys = append([]common.Hash{}, self.dirtyStorageKeys...) - stateObject.originStorage = self.originStorage.Copy() - stateObject.suicided = self.suicided - stateObject.dirtyCode = self.dirtyCode - stateObject.deleted = self.deleted + stateObject.code = s.code + stateObject.dirtyStorage = s.dirtyStorage.Copy() + stateObject.dirtyStorageKeys = append([]common.Hash{}, s.dirtyStorageKeys...) + stateObject.originStorage = s.originStorage.Copy() + stateObject.suicided = s.suicided + stateObject.dirtyCode = s.dirtyCode + stateObject.deleted = s.deleted return stateObject } @@ -327,69 +347,69 @@ func (self *stateObject) deepCopy(db *StateDB) *stateObject { // // Returns the address of the contract/account -func (c *stateObject) Address() common.Address { - return c.address +func (s *stateObject) Address() common.Address { + return s.address } // Code returns the contract code associated with this object, if any. -func (self *stateObject) Code(db Database) []byte { - if self.code != nil { - return self.code +func (s *stateObject) Code(db Database) []byte { + if s.code != nil { + return s.code } - if bytes.Equal(self.CodeHash(), emptyCodeHash) { + if bytes.Equal(s.CodeHash(), emptyCodeHash) { return nil } - code, err := db.ContractCode(self.addrHash, common.BytesToHash(self.CodeHash())) + code, err := db.ContractCode(s.addrHash, common.BytesToHash(s.CodeHash())) if err != nil { - self.setError(fmt.Errorf("can't load code hash %x: %v", self.CodeHash(), err)) + s.setError(fmt.Errorf("can't load code hash %x: %v", s.CodeHash(), err)) } - self.code = code + s.code = code return code } -func (self *stateObject) SetCode(codeHash common.Hash, code []byte) { - prevcode := self.Code(self.db.db) - self.db.journal.append(codeChange{ - account: &self.address, - prevhash: self.CodeHash(), +func (s *stateObject) SetCode(codeHash common.Hash, code []byte) { + prevcode := s.Code(s.db.db) + s.db.journal.append(codeChange{ + account: &s.address, + prevhash: s.CodeHash(), prevcode: prevcode, }) - self.setCode(codeHash, code) + s.setCode(codeHash, code) } -func (self *stateObject) setCode(codeHash common.Hash, code []byte) { - self.code = code - self.data.CodeHash = codeHash[:] - self.dirtyCode = true +func (s *stateObject) setCode(codeHash common.Hash, code []byte) { + s.code = code + s.data.CodeHash = codeHash[:] + s.dirtyCode = true } -func (self *stateObject) SetNonce(nonce uint64) { - self.db.journal.append(nonceChange{ - account: &self.address, - prev: self.data.Nonce, +func (s *stateObject) SetNonce(nonce uint64) { + s.db.journal.append(nonceChange{ + account: &s.address, + prev: s.data.Nonce, }) - self.setNonce(nonce) + s.setNonce(nonce) } -func (self *stateObject) setNonce(nonce uint64) { - self.data.Nonce = nonce +func (s *stateObject) setNonce(nonce uint64) { + s.data.Nonce = nonce } -func (self *stateObject) CodeHash() []byte { - return self.data.CodeHash +func (s *stateObject) CodeHash() []byte { + return s.data.CodeHash } -func (self *stateObject) Balance() *big.Int { - return self.data.Balance +func (s *stateObject) Balance() *big.Int { + return s.data.Balance } -func (self *stateObject) Nonce() uint64 { - return self.data.Nonce +func (s *stateObject) Nonce() uint64 { + return s.data.Nonce } // Never called, but must be present to allow stateObject to be used // as a vm.Account interface that also satisfies the vm.ContractRef // interface. Interfaces are awesome. -func (self *stateObject) Value() *big.Int { +func (s *stateObject) Value() *big.Int { panic("Value on stateObject should never be called") } diff --git a/core/state/state_test.go b/core/state/state_test.go index a09273f3b1fb..d6ff714ee49c 100644 --- a/core/state/state_test.go +++ b/core/state/state_test.go @@ -22,13 +22,14 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" checker "gopkg.in/check.v1" ) type StateSuite struct { - db *ethdb.MemDatabase + db ethdb.Database state *StateDB } @@ -51,33 +52,28 @@ func (s *StateSuite) TestDump(c *checker.C) { s.state.Commit(false) // check that dump contains the state objects that are in trie - got := string(s.state.Dump()) + got := string(s.state.Dump(false, false, true)) want := `{ "root": "71edff0130dd2385947095001c73d9e28d862fc286fca2b922ca6f6f3cddfdd2", "accounts": { - "0000000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000001": { "balance": "22", "nonce": 0, "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "code": "", - "storage": {} + "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, - "0000000000000000000000000000000000000002": { + "0x0000000000000000000000000000000000000002": { "balance": "44", "nonce": 0, "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "code": "", - "storage": {} + "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, - "0000000000000000000000000000000000000102": { + "0x0000000000000000000000000000000000000102": { "balance": "0", "nonce": 0, "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "87874902497a5bb968da31a2998d8f22e949d1ef6214bcdedd8bae24cca4b9e3", - "code": "03030303030303", - "storage": {} + "code": "03030303030303" } } }` @@ -87,7 +83,7 @@ func (s *StateSuite) TestDump(c *checker.C) { } func (s *StateSuite) SetUpTest(c *checker.C) { - s.db = ethdb.NewMemDatabase() + s.db = rawdb.NewMemoryDatabase() s.state, _ = New(common.Hash{}, NewDatabase(s.db)) } @@ -141,7 +137,7 @@ func (s *StateSuite) TestSnapshotEmpty(c *checker.C) { // use testing instead of checker because checker does not support // printing/logging in tests (-check.vv does not work) func TestSnapshot2(t *testing.T) { - state, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + state, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) stateobjaddr0 := toAddr([]byte("so0")) stateobjaddr1 := toAddr([]byte("so1")) diff --git a/core/state/statedb.go b/core/state/statedb.go index 216667ce983f..3bb9862edd15 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -18,15 +18,17 @@ package state import ( + "errors" "fmt" "math/big" "sort" - "sync" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" ) @@ -37,13 +39,24 @@ type revision struct { } var ( - // emptyState is the known hash of an empty state trie entry. - emptyState = crypto.Keccak256Hash(nil) + // emptyRoot is the known root hash of an empty trie. + emptyRoot = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") // emptyCode is the known hash of the empty EVM bytecode. emptyCode = crypto.Keccak256Hash(nil) ) +type proofList [][]byte + +func (n *proofList) Put(key []byte, value []byte) error { + *n = append(*n, value) + return nil +} + +func (n *proofList) Delete(key []byte) error { + panic("not supported") +} + // StateDBs within the ethereum protocol are used to store anything // within the merkle trie. StateDBs take care of caching and storing // nested states. It's the general query interface to retrieve: @@ -80,7 +93,15 @@ type StateDB struct { validRevisions []revision nextRevisionId int - lock sync.Mutex + // Measurements gathered during execution for debugging purposes + AccountReads time.Duration + AccountHashes time.Duration + AccountUpdates time.Duration + AccountCommits time.Duration + StorageReads time.Duration + StorageHashes time.Duration + StorageUpdates time.Duration + StorageCommits time.Duration } // Create a new state from a given trie. @@ -216,6 +237,16 @@ func (self *StateDB) GetNonce(addr common.Address) uint64 { return 0 } +// TxIndex returns the current transaction index set by Prepare. +func (self *StateDB) TxIndex() int { + return self.txIndex +} + +// BlockHash returns the current block hash set by Prepare. +func (self *StateDB) BlockHash() common.Hash { + return self.bhash +} + func (self *StateDB) GetCode(addr common.Address) []byte { stateObject := self.getStateObject(addr) if stateObject != nil { @@ -256,6 +287,24 @@ func (self *StateDB) GetState(addr common.Address, hash common.Hash) common.Hash return common.Hash{} } +// GetProof returns the MerkleProof for a given Account +func (self *StateDB) GetProof(a common.Address) ([][]byte, error) { + var proof proofList + err := self.trie.Prove(crypto.Keccak256(a.Bytes()), 0, &proof) + return [][]byte(proof), err +} + +// GetProof returns the StorageProof for given key +func (self *StateDB) GetStorageProof(a common.Address, key common.Hash) ([][]byte, error) { + var proof proofList + trie := self.StorageTrie(a) + if trie == nil { + return proof, errors.New("storage trie for requested address does not exist") + } + err := trie.Prove(crypto.Keccak256(key.Bytes()), 0, &proof) + return [][]byte(proof), err +} + // GetCommittedState retrieves a value from the given account's committed storage trie. func (self *StateDB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash { stateObject := self.getStateObject(addr) @@ -363,36 +412,51 @@ func (self *StateDB) Suicide(addr common.Address) bool { // // updateStateObject writes the given object to the trie. -func (self *StateDB) updateStateObject(stateObject *stateObject) { +func (s *StateDB) updateStateObject(stateObject *stateObject) { + // Track the amount of time wasted on updating the account from the trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountUpdates += time.Since(start) }(time.Now()) + } + // Encode the account and update the account trie addr := stateObject.Address() + data, err := rlp.EncodeToBytes(stateObject) if err != nil { panic(fmt.Errorf("can't encode object at %x: %v", addr[:], err)) } - self.setError(self.trie.TryUpdate(addr[:], data)) + s.setError(s.trie.TryUpdate(addr[:], data)) } // deleteStateObject removes the given object from the state trie. -func (self *StateDB) deleteStateObject(stateObject *stateObject) { +func (s *StateDB) deleteStateObject(stateObject *stateObject) { + // Track the amount of time wasted on deleting the account from the trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountUpdates += time.Since(start) }(time.Now()) + } + // Delete the account from the trie stateObject.deleted = true + addr := stateObject.Address() - self.setError(self.trie.TryDelete(addr[:])) + s.setError(s.trie.TryDelete(addr[:])) } // Retrieve a state object given by the address. Returns nil if not found. -func (self *StateDB) getStateObject(addr common.Address) (stateObject *stateObject) { - // Prefer 'live' objects. - if obj := self.stateObjects[addr]; obj != nil { +func (s *StateDB) getStateObject(addr common.Address) (stateObject *stateObject) { + // Prefer live objects + if obj := s.stateObjects[addr]; obj != nil { if obj.deleted { return nil } return obj } - - // Load the object from the database. - enc, err := self.trie.TryGet(addr[:]) + // Track the amount of time wasted on loading the object from the database + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountReads += time.Since(start) }(time.Now()) + } + // Load the object from the database + enc, err := s.trie.TryGet(addr[:]) if len(enc) == 0 { - self.setError(err) + s.setError(err) return nil } var data Account @@ -400,9 +464,9 @@ func (self *StateDB) getStateObject(addr common.Address) (stateObject *stateObje log.Error("Failed to decode state object", "addr", addr, "err", err) return nil } - // Insert into the live set. - obj := newObject(self, addr, data) - self.setStateObject(obj) + // Insert into the live set + obj := newObject(s, addr, data) + s.setStateObject(obj) return obj } @@ -445,34 +509,44 @@ func (self *StateDB) createObject(addr common.Address) (newobj, prev *stateObjec // // Carrying over the balance ensures that Ether doesn't disappear. func (self *StateDB) CreateAccount(addr common.Address) { - new, prev := self.createObject(addr) + newObj, prev := self.createObject(addr) if prev != nil { - new.setBalance(prev.data.Balance) + newObj.setBalance(prev.data.Balance) } } -func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) { +func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) error { so := db.getStateObject(addr) if so == nil { - return + return nil } it := trie.NewIterator(so.getTrie(db.db).NodeIterator(nil)) + for it.Next() { key := common.BytesToHash(db.trie.GetKey(it.Key)) if value, dirty := so.dirtyStorage[key]; dirty { - cb(key, value) + if !cb(key, value) { + return nil + } continue } - cb(key, common.BytesToHash(it.Value)) + + if len(it.Value) > 0 { + _, content, _, err := rlp.Split(it.Value) + if err != nil { + return err + } + if !cb(key, common.BytesToHash(content)) { + return nil + } + } } + return nil } // Copy creates a deep, independent copy of the state. // Snapshots of the copied state cannot be applied to the copy. func (self *StateDB) Copy() *StateDB { - self.lock.Lock() - defer self.lock.Unlock() - // Copy all the basic fields, initialize the memory ones state := &StateDB{ db: self.db, @@ -482,7 +556,7 @@ func (self *StateDB) Copy() *StateDB { refund: self.refund, logs: make(map[common.Hash][]*types.Log, len(self.logs)), logSize: self.logSize, - preimages: make(map[common.Hash][]byte), + preimages: make(map[common.Hash][]byte, len(self.preimages)), journal: newJournal(), } // Copy the dirty states, logs, and preimages @@ -580,6 +654,11 @@ func (s *StateDB) Finalise(deleteEmptyObjects bool) { // goes into transaction receipts. func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { s.Finalise(deleteEmptyObjects) + + // Track the amount of time wasted on hashing the account trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountHashes += time.Since(start) }(time.Now()) + } return s.trie.Hash() } @@ -604,7 +683,7 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (root common.Hash, err error) for addr := range s.journal.dirties { s.stateObjectsDirty[addr] = struct{}{} } - // Commit objects to the trie. + // Commit objects to the trie, measuring the elapsed time for addr, stateObject := range s.stateObjects { _, isDirty := s.stateObjectsDirty[addr] switch { @@ -627,13 +706,16 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (root common.Hash, err error) } delete(s.stateObjectsDirty, addr) } - // Write trie changes. + // Write the account trie changes, measuing the amount of wasted time + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountCommits += time.Since(start) }(time.Now()) + } root, err = s.trie.Commit(func(leaf []byte, parent common.Hash) error { var account Account if err := rlp.DecodeBytes(leaf, &account); err != nil { return nil } - if account.Root != emptyState { + if account.Root != emptyRoot { s.db.TrieDB().Reference(account.Root, parent) } code := common.BytesToHash(account.CodeHash) @@ -642,6 +724,5 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (root common.Hash, err error) } return nil }) - log.Debug("Trie cache stats after commit", "misses", trie.CacheMisses(), "unloads", trie.CacheUnloads()) return root, err } diff --git a/core/state/statedb_test.go b/core/state/statedb_test.go index cbd5bc75e75f..bf073bc94827 100644 --- a/core/state/statedb_test.go +++ b/core/state/statedb_test.go @@ -31,15 +31,15 @@ import ( check "gopkg.in/check.v1" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" ) // Tests that updating a state trie does not leak any database writes prior to // actually committing the state. func TestUpdateLeaks(t *testing.T) { // Create an empty state database - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() state, _ := New(common.Hash{}, NewDatabase(db)) // Update it with some accounts @@ -56,18 +56,19 @@ func TestUpdateLeaks(t *testing.T) { state.IntermediateRoot(false) } // Ensure that no data was leaked into the database - for _, key := range db.Keys() { - value, _ := db.Get(key) - t.Errorf("State leaked into database: %x -> %x", key, value) + it := db.NewIterator() + for it.Next() { + t.Errorf("State leaked into database: %x -> %x", it.Key(), it.Value()) } + it.Release() } // Tests that no intermediate state of an object is stored into the database, // only the one right before the commit. func TestIntermediateLeaks(t *testing.T) { // Create two state databases, one transitioning to the final state, the other final from the beginning - transDb := ethdb.NewMemDatabase() - finalDb := ethdb.NewMemDatabase() + transDb := rawdb.NewMemoryDatabase() + finalDb := rawdb.NewMemoryDatabase() transState, _ := New(common.Hash{}, NewDatabase(transDb)) finalState, _ := New(common.Hash{}, NewDatabase(finalDb)) @@ -85,15 +86,15 @@ func TestIntermediateLeaks(t *testing.T) { // Modify the transient state. for i := byte(0); i < 255; i++ { - modify(transState, common.Address{byte(i)}, i, 0) + modify(transState, common.Address{i}, i, 0) } // Write modifications to trie. transState.IntermediateRoot(false) // Overwrite all the data with new values in the transient database. for i := byte(0); i < 255; i++ { - modify(transState, common.Address{byte(i)}, i, 99) - modify(finalState, common.Address{byte(i)}, i, 99) + modify(transState, common.Address{i}, i, 99) + modify(finalState, common.Address{i}, i, 99) } // Commit and cross check the databases. @@ -103,16 +104,20 @@ func TestIntermediateLeaks(t *testing.T) { if _, err := finalState.Commit(false); err != nil { t.Fatalf("failed to commit final state: %v", err) } - for _, key := range finalDb.Keys() { + it := finalDb.NewIterator() + for it.Next() { + key := it.Key() if _, err := transDb.Get(key); err != nil { - val, _ := finalDb.Get(key) - t.Errorf("entry missing from the transition database: %x -> %x", key, val) + t.Errorf("entry missing from the transition database: %x -> %x", key, it.Value()) } } - for _, key := range transDb.Keys() { + it.Release() + + it = transDb.NewIterator() + for it.Next() { + key := it.Key() if _, err := finalDb.Get(key); err != nil { - val, _ := transDb.Get(key) - t.Errorf("extra entry in the transition database: %x -> %x", key, val) + t.Errorf("extra entry in the transition database: %x -> %x", key, it.Value()) } } } @@ -122,7 +127,7 @@ func TestIntermediateLeaks(t *testing.T) { // https://github.com/ethereum/go-ethereum/pull/15549. func TestCopy(t *testing.T) { // Create a random state test to copy and modify "independently" - orig, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + orig, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) for i := byte(0); i < 255; i++ { obj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i})) @@ -276,13 +281,22 @@ func newTestAction(addr common.Address, r *rand.Rand) testAction { }, args: make([]int64, 1), }, + { + name: "AddPreimage", + fn: func(a testAction, s *StateDB) { + preimage := []byte{1} + hash := common.BytesToHash(preimage) + s.AddPreimage(hash, preimage) + }, + args: make([]int64, 1), + }, } action := actions[r.Intn(len(actions))] var nameargs []string if !action.noAddr { nameargs = append(nameargs, addr.Hex()) } - for _, i := range action.args { + for i := range action.args { action.args[i] = rand.Int63n(100) nameargs = append(nameargs, fmt.Sprint(action.args[i])) } @@ -333,7 +347,7 @@ func (test *snapshotTest) String() string { func (test *snapshotTest) run() bool { // Run all actions and create snapshots. var ( - state, _ = New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + state, _ = New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) snapshotRevs = make([]int, len(test.snapshots)) sindex = 0 ) @@ -424,7 +438,7 @@ func (s *StateSuite) TestTouchDelete(c *check.C) { // TestCopyOfCopy tests that modified objects are carried over to the copy, and the copy of the copy. // See https://github.com/ethereum/go-ethereum/pull/15225#issuecomment-380191512 func TestCopyOfCopy(t *testing.T) { - sdb, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + sdb, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) addr := common.HexToAddress("aaaa") sdb.SetBalance(addr, big.NewInt(42)) diff --git a/core/state/sync.go b/core/state/sync.go index c566e790739a..ef7930527366 100644 --- a/core/state/sync.go +++ b/core/state/sync.go @@ -20,12 +20,13 @@ import ( "bytes" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" ) // NewStateSync create a new state trie download scheduler. -func NewStateSync(root common.Hash, database trie.DatabaseReader) *trie.Sync { +func NewStateSync(root common.Hash, database ethdb.KeyValueReader, bloom *trie.SyncBloom) *trie.Sync { var syncer *trie.Sync callback := func(leaf []byte, parent common.Hash) error { var obj Account @@ -36,6 +37,6 @@ func NewStateSync(root common.Hash, database trie.DatabaseReader) *trie.Sync { syncer.AddRawEntry(common.BytesToHash(obj.CodeHash), 64, parent) return nil } - syncer = trie.NewSync(root, database, callback) + syncer = trie.NewSync(root, database, callback, bloom) return syncer } diff --git a/core/state/sync_test.go b/core/state/sync_test.go index 31774016082a..de098dce0fea 100644 --- a/core/state/sync_test.go +++ b/core/state/sync_test.go @@ -22,8 +22,10 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" "github.com/ethereum/go-ethereum/trie" ) @@ -38,7 +40,7 @@ type testAccount struct { // makeTestState create a sample test state to test node-wise reconstruction. func makeTestState() (Database, common.Hash, []*testAccount) { // Create an empty state - db := NewDatabase(ethdb.NewMemDatabase()) + db := NewDatabase(rawdb.NewMemoryDatabase()) state, _ := New(common.Hash{}, db) // Fill it with some arbitrary data @@ -124,7 +126,7 @@ func checkStateConsistency(db ethdb.Database, root common.Hash) error { // Tests that an empty state is not scheduled for syncing. func TestEmptyStateSync(t *testing.T) { empty := common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") - if req := NewStateSync(empty, ethdb.NewMemDatabase()).Missing(1); len(req) != 0 { + if req := NewStateSync(empty, rawdb.NewMemoryDatabase(), trie.NewSyncBloom(1, memorydb.New())).Missing(1); len(req) != 0 { t.Errorf("content requested for empty state: %v", req) } } @@ -139,8 +141,8 @@ func testIterativeStateSync(t *testing.T, batch int) { srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) queue := append([]common.Hash{}, sched.Missing(batch)...) for len(queue) > 0 { @@ -171,8 +173,8 @@ func TestIterativeDelayedStateSync(t *testing.T) { srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) queue := append([]common.Hash{}, sched.Missing(0)...) for len(queue) > 0 { @@ -208,8 +210,8 @@ func testIterativeRandomStateSync(t *testing.T, batch int) { srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) queue := make(map[common.Hash]struct{}) for _, hash := range sched.Missing(batch) { @@ -248,8 +250,8 @@ func TestIterativeRandomDelayedStateSync(t *testing.T) { srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) queue := make(map[common.Hash]struct{}) for _, hash := range sched.Missing(0) { @@ -295,8 +297,8 @@ func TestIncompleteStateSync(t *testing.T) { checkTrieConsistency(srcDb.TrieDB().DiskDB().(ethdb.Database), srcRoot) // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) added := []common.Hash{} queue := append([]common.Hash{}, sched.Missing(1)...) diff --git a/core/state_prefetcher.go b/core/state_prefetcher.go new file mode 100644 index 000000000000..cb85a05b578e --- /dev/null +++ b/core/state_prefetcher.go @@ -0,0 +1,85 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "sync/atomic" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" +) + +// statePrefetcher is a basic Prefetcher, which blindly executes a block on top +// of an arbitrary state with the goal of prefetching potentially useful state +// data from disk before the main block processor start executing. +type statePrefetcher struct { + config *params.ChainConfig // Chain configuration options + bc *BlockChain // Canonical block chain + engine consensus.Engine // Consensus engine used for block rewards +} + +// newStatePrefetcher initialises a new statePrefetcher. +func newStatePrefetcher(config *params.ChainConfig, bc *BlockChain, engine consensus.Engine) *statePrefetcher { + return &statePrefetcher{ + config: config, + bc: bc, + engine: engine, + } +} + +// Prefetch processes the state changes according to the Ethereum rules by running +// the transaction messages using the statedb, but any changes are discarded. The +// only goal is to pre-cache transaction signatures and state trie nodes. +func (p *statePrefetcher) Prefetch(block *types.Block, statedb *state.StateDB, cfg vm.Config, interrupt *uint32) { + var ( + header = block.Header() + gaspool = new(GasPool).AddGas(block.GasLimit()) + ) + // Iterate over and process the individual transactions + for i, tx := range block.Transactions() { + // If block precaching was interrupted, abort + if interrupt != nil && atomic.LoadUint32(interrupt) == 1 { + return + } + // Block precaching permitted to continue, execute the transaction + statedb.Prepare(tx.Hash(), block.Hash(), i) + if err := precacheTransaction(p.config, p.bc, nil, gaspool, statedb, header, tx, cfg); err != nil { + return // Ugh, something went horribly wrong, bail out + } + } +} + +// precacheTransaction attempts to apply a transaction to the given state database +// and uses the input parameters for its environment. The goal is not to execute +// the transaction successfully, rather to warm up touched data slots. +func precacheTransaction(config *params.ChainConfig, bc ChainContext, author *common.Address, gaspool *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, cfg vm.Config) error { + // Convert the transaction into an executable message and pre-cache its sender + msg, err := tx.AsMessage(types.MakeSigner(config, header.Number)) + if err != nil { + return err + } + // Create the EVM and execute the transaction + context := NewEVMContext(msg, header, bc, author) + vm := vm.NewEVM(context, statedb, config, cfg) + + _, _, _, err = ApplyMessage(vm, msg, gaspool) + return err +} diff --git a/core/state_processor.go b/core/state_processor.go index 503a35d16ad8..bed6a073063d 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -76,7 +76,7 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg allLogs = append(allLogs, receipt.Logs...) } // Finalize the block, applying any consensus engine specific extras (e.g. block rewards) - p.engine.Finalize(p.bc, header, statedb, block.Transactions(), block.Uncles(), receipts) + p.engine.Finalize(p.bc, header, statedb, block.Transactions(), block.Uncles()) return receipts, allLogs, *usedGas, nil } @@ -121,6 +121,9 @@ func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *commo // Set the receipt logs and create a bloom for filtering receipt.Logs = statedb.GetLogs(tx.Hash()) receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) + receipt.BlockHash = statedb.BlockHash() + receipt.BlockNumber = header.Number + receipt.TransactionIndex = uint(statedb.TxIndex()) return receipt, gas, err } diff --git a/core/tx_cacher.go b/core/tx_cacher.go index bcaa5ead3813..b1e5d676a2b1 100644 --- a/core/tx_cacher.go +++ b/core/tx_cacher.go @@ -22,7 +22,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" ) -// senderCacher is a concurrent transaction sender recoverer anc cacher. +// senderCacher is a concurrent transaction sender recoverer and cacher. var senderCacher = newTxSenderCacher(runtime.NumCPU()) // txSenderCacherRequest is a request for recovering transaction senders with a diff --git a/core/tx_list.go b/core/tx_list.go index 57abc5148643..75bfdaedac1a 100644 --- a/core/tx_list.go +++ b/core/tx_list.go @@ -418,9 +418,9 @@ func (l *txPricedList) Put(tx *types.Transaction) { // Removed notifies the prices transaction list that an old transaction dropped // from the pool. The list will just keep a counter of stale objects and update // the heap if a large enough ratio of transactions go stale. -func (l *txPricedList) Removed() { +func (l *txPricedList) Removed(count int) { // Bump the stale counter, but exit if still too low (< 25%) - l.stales++ + l.stales += count if l.stales <= len(*l.items)/4 { return } diff --git a/core/tx_noncer.go b/core/tx_noncer.go new file mode 100644 index 000000000000..aa87c643aee2 --- /dev/null +++ b/core/tx_noncer.go @@ -0,0 +1,79 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" +) + +// txNoncer is a tiny virtual state database to manage the executable nonces of +// accounts in the pool, falling back to reading from a real state database if +// an account is unknown. +type txNoncer struct { + fallback *state.StateDB + nonces map[common.Address]uint64 + lock sync.Mutex +} + +// newTxNoncer creates a new virtual state database to track the pool nonces. +func newTxNoncer(statedb *state.StateDB) *txNoncer { + return &txNoncer{ + fallback: statedb.Copy(), + nonces: make(map[common.Address]uint64), + } +} + +// get returns the current nonce of an account, falling back to a real state +// database if the account is unknown. +func (txn *txNoncer) get(addr common.Address) uint64 { + // We use mutex for get operation is the underlying + // state will mutate db even for read access. + txn.lock.Lock() + defer txn.lock.Unlock() + + if _, ok := txn.nonces[addr]; !ok { + txn.nonces[addr] = txn.fallback.GetNonce(addr) + } + return txn.nonces[addr] +} + +// set inserts a new virtual nonce into the virtual state database to be returned +// whenever the pool requests it instead of reaching into the real state database. +func (txn *txNoncer) set(addr common.Address, nonce uint64) { + txn.lock.Lock() + defer txn.lock.Unlock() + + txn.nonces[addr] = nonce +} + +// setIfLower updates a new virtual nonce into the virtual state database if the +// the new one is lower. +func (txn *txNoncer) setIfLower(addr common.Address, nonce uint64) { + txn.lock.Lock() + defer txn.lock.Unlock() + + if _, ok := txn.nonces[addr]; !ok { + txn.nonces[addr] = txn.fallback.GetNonce(addr) + } + if txn.nonces[addr] <= nonce { + return + } + txn.nonces[addr] = nonce +} diff --git a/core/tx_pool.go b/core/tx_pool.go index f6da5da2a732..0c422dd99d92 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -85,20 +85,25 @@ var ( var ( // Metrics for the pending pool - pendingDiscardCounter = metrics.NewRegisteredCounter("txpool/pending/discard", nil) - pendingReplaceCounter = metrics.NewRegisteredCounter("txpool/pending/replace", nil) - pendingRateLimitCounter = metrics.NewRegisteredCounter("txpool/pending/ratelimit", nil) // Dropped due to rate limiting - pendingNofundsCounter = metrics.NewRegisteredCounter("txpool/pending/nofunds", nil) // Dropped due to out-of-funds + pendingDiscardMeter = metrics.NewRegisteredMeter("txpool/pending/discard", nil) + pendingReplaceMeter = metrics.NewRegisteredMeter("txpool/pending/replace", nil) + pendingRateLimitMeter = metrics.NewRegisteredMeter("txpool/pending/ratelimit", nil) // Dropped due to rate limiting + pendingNofundsMeter = metrics.NewRegisteredMeter("txpool/pending/nofunds", nil) // Dropped due to out-of-funds // Metrics for the queued pool - queuedDiscardCounter = metrics.NewRegisteredCounter("txpool/queued/discard", nil) - queuedReplaceCounter = metrics.NewRegisteredCounter("txpool/queued/replace", nil) - queuedRateLimitCounter = metrics.NewRegisteredCounter("txpool/queued/ratelimit", nil) // Dropped due to rate limiting - queuedNofundsCounter = metrics.NewRegisteredCounter("txpool/queued/nofunds", nil) // Dropped due to out-of-funds + queuedDiscardMeter = metrics.NewRegisteredMeter("txpool/queued/discard", nil) + queuedReplaceMeter = metrics.NewRegisteredMeter("txpool/queued/replace", nil) + queuedRateLimitMeter = metrics.NewRegisteredMeter("txpool/queued/ratelimit", nil) // Dropped due to rate limiting + queuedNofundsMeter = metrics.NewRegisteredMeter("txpool/queued/nofunds", nil) // Dropped due to out-of-funds // General tx metrics - invalidTxCounter = metrics.NewRegisteredCounter("txpool/invalid", nil) - underpricedTxCounter = metrics.NewRegisteredCounter("txpool/underpriced", nil) + validMeter = metrics.NewRegisteredMeter("txpool/valid", nil) + invalidTxMeter = metrics.NewRegisteredMeter("txpool/invalid", nil) + underpricedTxMeter = metrics.NewRegisteredMeter("txpool/underpriced", nil) + + pendingCounter = metrics.NewRegisteredCounter("txpool/pending", nil) + queuedCounter = metrics.NewRegisteredCounter("txpool/queued", nil) + localCounter = metrics.NewRegisteredCounter("txpool/local", nil) ) // TxStatus is the current status of a transaction as seen by the pool. @@ -172,6 +177,26 @@ func (config *TxPoolConfig) sanitize() TxPoolConfig { log.Warn("Sanitizing invalid txpool price bump", "provided", conf.PriceBump, "updated", DefaultTxPoolConfig.PriceBump) conf.PriceBump = DefaultTxPoolConfig.PriceBump } + if conf.AccountSlots < 1 { + log.Warn("Sanitizing invalid txpool account slots", "provided", conf.AccountSlots, "updated", DefaultTxPoolConfig.AccountSlots) + conf.AccountSlots = DefaultTxPoolConfig.AccountSlots + } + if conf.GlobalSlots < 1 { + log.Warn("Sanitizing invalid txpool global slots", "provided", conf.GlobalSlots, "updated", DefaultTxPoolConfig.GlobalSlots) + conf.GlobalSlots = DefaultTxPoolConfig.GlobalSlots + } + if conf.AccountQueue < 1 { + log.Warn("Sanitizing invalid txpool account queue", "provided", conf.AccountQueue, "updated", DefaultTxPoolConfig.AccountQueue) + conf.AccountQueue = DefaultTxPoolConfig.AccountQueue + } + if conf.GlobalQueue < 1 { + log.Warn("Sanitizing invalid txpool global queue", "provided", conf.GlobalQueue, "updated", DefaultTxPoolConfig.GlobalQueue) + conf.GlobalQueue = DefaultTxPoolConfig.GlobalQueue + } + if conf.Lifetime < 1 { + log.Warn("Sanitizing invalid txpool lifetime", "provided", conf.Lifetime, "updated", DefaultTxPoolConfig.Lifetime) + conf.Lifetime = DefaultTxPoolConfig.Lifetime + } return conf } @@ -183,20 +208,18 @@ func (config *TxPoolConfig) sanitize() TxPoolConfig { // current state) and future transactions. Transactions move between those // two states over time as they are received and processed. type TxPool struct { - config TxPoolConfig - chainconfig *params.ChainConfig - chain blockChain - gasPrice *big.Int - txFeed event.Feed - scope event.SubscriptionScope - chainHeadCh chan ChainHeadEvent - chainHeadSub event.Subscription - signer types.Signer - mu sync.RWMutex - - currentState *state.StateDB // Current state in the blockchain head - pendingState *state.ManagedState // Pending state tracking virtual nonces - currentMaxGas uint64 // Current gas limit for transaction caps + config TxPoolConfig + chainconfig *params.ChainConfig + chain blockChain + gasPrice *big.Int + txFeed event.Feed + scope event.SubscriptionScope + signer types.Signer + mu sync.RWMutex + + currentState *state.StateDB // Current state in the blockchain head + pendingNonces *txNoncer // Pending state tracking virtual nonces + currentMaxGas uint64 // Current gas limit for transaction caps locals *accountSet // Set of local transaction to exempt from eviction rules journal *txJournal // Journal of local transaction to back up to disk @@ -207,9 +230,18 @@ type TxPool struct { all *txLookup // All transactions to allow lookups priced *txPricedList // All transactions sorted by price - wg sync.WaitGroup // for shutdown sync + chainHeadCh chan ChainHeadEvent + chainHeadSub event.Subscription + reqResetCh chan *txpoolResetRequest + reqPromoteCh chan *accountSet + queueTxEventCh chan *types.Transaction + reorgDoneCh chan chan struct{} + reorgShutdownCh chan struct{} // requests shutdown of scheduleReorgLoop + wg sync.WaitGroup // tracks loop, scheduleReorgLoop +} - homestead bool +type txpoolResetRequest struct { + oldHead, newHead *types.Header } // NewTxPool creates a new transaction pool to gather, sort and filter inbound @@ -220,16 +252,21 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block // Create the transaction pool with its initial settings pool := &TxPool{ - config: config, - chainconfig: chainconfig, - chain: chain, - signer: types.NewEIP155Signer(chainconfig.ChainID), - pending: make(map[common.Address]*txList), - queue: make(map[common.Address]*txList), - beats: make(map[common.Address]time.Time), - all: newTxLookup(), - chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), - gasPrice: new(big.Int).SetUint64(config.PriceLimit), + config: config, + chainconfig: chainconfig, + chain: chain, + signer: types.NewEIP155Signer(chainconfig.ChainID), + pending: make(map[common.Address]*txList), + queue: make(map[common.Address]*txList), + beats: make(map[common.Address]time.Time), + all: newTxLookup(), + chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), + reqResetCh: make(chan *txpoolResetRequest), + reqPromoteCh: make(chan *accountSet), + queueTxEventCh: make(chan *types.Transaction), + reorgDoneCh: make(chan chan struct{}), + reorgShutdownCh: make(chan struct{}), + gasPrice: new(big.Int).SetUint64(config.PriceLimit), } pool.locals = newAccountSet(pool.signer) for _, addr := range config.Locals { @@ -239,6 +276,10 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block pool.priced = newTxPricedList(pool.all) pool.reset(nil, chain.CurrentBlock().Header()) + // Start the reorg loop early so it can handle requests generated during journal loading. + pool.wg.Add(1) + go pool.scheduleReorgLoop() + // If local transactions and journaling is enabled, load from disk if !config.NoLocals && config.Journal != "" { pool.journal = newTxJournal(config.Journal) @@ -250,10 +291,9 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block log.Warn("Failed to rotate transaction journal", "err", err) } } - // Subscribe events from blockchain - pool.chainHeadSub = pool.chain.SubscribeChainHeadEvent(pool.chainHeadCh) - // Start the event loop and return + // Subscribe events from blockchain and start the main event loop. + pool.chainHeadSub = pool.chain.SubscribeChainHeadEvent(pool.chainHeadCh) pool.wg.Add(1) go pool.loop() @@ -266,38 +306,31 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block func (pool *TxPool) loop() { defer pool.wg.Done() - // Start the stats reporting and transaction eviction tickers - var prevPending, prevQueued, prevStales int - - report := time.NewTicker(statsReportInterval) + var ( + prevPending, prevQueued, prevStales int + // Start the stats reporting and transaction eviction tickers + report = time.NewTicker(statsReportInterval) + evict = time.NewTicker(evictionInterval) + journal = time.NewTicker(pool.config.Rejournal) + // Track the previous head headers for transaction reorgs + head = pool.chain.CurrentBlock() + ) defer report.Stop() - - evict := time.NewTicker(evictionInterval) defer evict.Stop() - - journal := time.NewTicker(pool.config.Rejournal) defer journal.Stop() - // Track the previous head headers for transaction reorgs - head := pool.chain.CurrentBlock() - - // Keep waiting for and reacting to the various events for { select { // Handle ChainHeadEvent case ev := <-pool.chainHeadCh: if ev.Block != nil { - pool.mu.Lock() - if pool.chainconfig.IsHomestead(ev.Block.Number()) { - pool.homestead = true - } - pool.reset(head.Header(), ev.Block.Header()) + pool.requestReset(head.Header(), ev.Block.Header()) head = ev.Block - - pool.mu.Unlock() } - // Be unsubscribed due to system stopped + + // System shutdown. case <-pool.chainHeadSub.Err(): + close(pool.reorgShutdownCh) return // Handle stats reporting ticks @@ -342,99 +375,6 @@ func (pool *TxPool) loop() { } } -// lockedReset is a wrapper around reset to allow calling it in a thread safe -// manner. This method is only ever used in the tester! -func (pool *TxPool) lockedReset(oldHead, newHead *types.Header) { - pool.mu.Lock() - defer pool.mu.Unlock() - - pool.reset(oldHead, newHead) -} - -// reset retrieves the current state of the blockchain and ensures the content -// of the transaction pool is valid with regard to the chain state. -func (pool *TxPool) reset(oldHead, newHead *types.Header) { - // If we're reorging an old state, reinject all dropped transactions - var reinject types.Transactions - - if oldHead != nil && oldHead.Hash() != newHead.ParentHash { - // If the reorg is too deep, avoid doing it (will happen during fast sync) - oldNum := oldHead.Number.Uint64() - newNum := newHead.Number.Uint64() - - if depth := uint64(math.Abs(float64(oldNum) - float64(newNum))); depth > 64 { - log.Debug("Skipping deep transaction reorg", "depth", depth) - } else { - // Reorg seems shallow enough to pull in all transactions into memory - var discarded, included types.Transactions - - var ( - rem = pool.chain.GetBlock(oldHead.Hash(), oldHead.Number.Uint64()) - add = pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64()) - ) - for rem.NumberU64() > add.NumberU64() { - discarded = append(discarded, rem.Transactions()...) - if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { - log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) - return - } - } - for add.NumberU64() > rem.NumberU64() { - included = append(included, add.Transactions()...) - if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { - log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) - return - } - } - for rem.Hash() != add.Hash() { - discarded = append(discarded, rem.Transactions()...) - if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { - log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) - return - } - included = append(included, add.Transactions()...) - if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { - log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) - return - } - } - reinject = types.TxDifference(discarded, included) - } - } - // Initialize the internal state to the current head - if newHead == nil { - newHead = pool.chain.CurrentBlock().Header() // Special case during testing - } - statedb, err := pool.chain.StateAt(newHead.Root) - if err != nil { - log.Error("Failed to reset txpool state", "err", err) - return - } - pool.currentState = statedb - pool.pendingState = state.ManageState(statedb) - pool.currentMaxGas = newHead.GasLimit - - // Inject any transactions discarded due to reorgs - log.Debug("Reinjecting stale transactions", "count", len(reinject)) - senderCacher.recover(pool.signer, reinject) - pool.addTxsLocked(reinject, false) - - // validate the pool of pending transactions, this will remove - // any transactions that have been included in the block or - // have been invalidated because of another transaction (e.g. - // higher gas price) - pool.demoteUnexecutables() - - // Update all accounts to the latest known pending nonce - for addr, list := range pool.pending { - txs := list.Flatten() // Heavy but will be cached and is needed by the miner anyway - pool.pendingState.SetNonce(addr, txs[len(txs)-1].Nonce()+1) - } - // Check the queue and move transactions over to the pending if possible - // or remove those that have become invalid - pool.promoteExecutables(nil) -} - // Stop terminates the transaction pool. func (pool *TxPool) Stop() { // Unsubscribe all subscriptions registered from txpool @@ -477,12 +417,13 @@ func (pool *TxPool) SetGasPrice(price *big.Int) { log.Info("Transaction pool price threshold updated", "price", price) } -// State returns the virtual managed state of the transaction pool. -func (pool *TxPool) State() *state.ManagedState { +// Nonce returns the next nonce of an account, with all transactions executable +// by the pool already applied on top. +func (pool *TxPool) Nonce(addr common.Address) uint64 { pool.mu.RLock() defer pool.mu.RUnlock() - return pool.pendingState + return pool.pendingNonces.get(addr) } // Stats retrieves the current pool stats, namely the number of pending and the @@ -598,7 +539,8 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { if pool.currentState.GetBalance(from).Cmp(tx.Cost()) < 0 { return ErrInsufficientFunds } - intrGas, err := IntrinsicGas(tx.Data(), tx.To() == nil, pool.homestead) + // Ensure the transaction has more gas than the basic tx fee. + intrGas, err := IntrinsicGas(tx.Data(), tx.To() == nil, true) if err != nil { return err } @@ -608,74 +550,74 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { return nil } -// add validates a transaction and inserts it into the non-executable queue for -// later pending promotion and execution. If the transaction is a replacement for -// an already pending or queued one, it overwrites the previous and returns this -// so outer code doesn't uselessly call promote. +// add validates a transaction and inserts it into the non-executable queue for later +// pending promotion and execution. If the transaction is a replacement for an already +// pending or queued one, it overwrites the previous transaction if its price is higher. // // If a newly added transaction is marked as local, its sending account will be -// whitelisted, preventing any associated transaction from being dropped out of -// the pool due to pricing constraints. -func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { +// whitelisted, preventing any associated transaction from being dropped out of the pool +// due to pricing constraints. +func (pool *TxPool) add(tx *types.Transaction, local bool) (replaced bool, err error) { // If the transaction is already known, discard it hash := tx.Hash() if pool.all.Get(hash) != nil { log.Trace("Discarding already known transaction", "hash", hash) return false, fmt.Errorf("known transaction: %x", hash) } + // If the transaction fails basic validation, discard it if err := pool.validateTx(tx, local); err != nil { log.Trace("Discarding invalid transaction", "hash", hash, "err", err) - invalidTxCounter.Inc(1) + invalidTxMeter.Mark(1) return false, err } + // If the transaction pool is full, discard underpriced transactions if uint64(pool.all.Count()) >= pool.config.GlobalSlots+pool.config.GlobalQueue { // If the new transaction is underpriced, don't accept it if !local && pool.priced.Underpriced(tx, pool.locals) { log.Trace("Discarding underpriced transaction", "hash", hash, "price", tx.GasPrice()) - underpricedTxCounter.Inc(1) + underpricedTxMeter.Mark(1) return false, ErrUnderpriced } // New transaction is better than our worse ones, make room for it drop := pool.priced.Discard(pool.all.Count()-int(pool.config.GlobalSlots+pool.config.GlobalQueue-1), pool.locals) for _, tx := range drop { log.Trace("Discarding freshly underpriced transaction", "hash", tx.Hash(), "price", tx.GasPrice()) - underpricedTxCounter.Inc(1) + underpricedTxMeter.Mark(1) pool.removeTx(tx.Hash(), false) } } - // If the transaction is replacing an already pending one, do directly + + // Try to replace an existing transaction in the pending pool from, _ := types.Sender(pool.signer, tx) // already validated if list := pool.pending[from]; list != nil && list.Overlaps(tx) { // Nonce already pending, check if required price bump is met inserted, old := list.Add(tx, pool.config.PriceBump) if !inserted { - pendingDiscardCounter.Inc(1) + pendingDiscardMeter.Mark(1) return false, ErrReplaceUnderpriced } // New transaction is better, replace old one if old != nil { pool.all.Remove(old.Hash()) - pool.priced.Removed() - pendingReplaceCounter.Inc(1) + pool.priced.Removed(1) + pendingReplaceMeter.Mark(1) } pool.all.Add(tx) pool.priced.Put(tx) pool.journalTx(from, tx) - + pool.queueTxEvent(tx) log.Trace("Pooled new executable transaction", "hash", hash, "from", from, "to", tx.To()) - - // We've directly injected a replacement transaction, notify subsystems - go pool.txFeed.Send(NewTxsEvent{types.Transactions{tx}}) - return old != nil, nil } + // New transaction isn't replacing a pending one, push into queue - replace, err := pool.enqueueTx(hash, tx) + replaced, err = pool.enqueueTx(hash, tx) if err != nil { return false, err } + // Mark local addresses and journal local transactions if local { if !pool.locals.contains(from) { @@ -683,10 +625,13 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { pool.locals.add(from) } } + if local || pool.locals.contains(from) { + localCounter.Inc(1) + } pool.journalTx(from, tx) log.Trace("Pooled new future transaction", "hash", hash, "from", from, "to", tx.To()) - return replace, nil + return replaced, nil } // enqueueTx inserts a new transaction into the non-executable transaction queue. @@ -701,14 +646,17 @@ func (pool *TxPool) enqueueTx(hash common.Hash, tx *types.Transaction) (bool, er inserted, old := pool.queue[from].Add(tx, pool.config.PriceBump) if !inserted { // An older transaction was better, discard this - queuedDiscardCounter.Inc(1) + queuedDiscardMeter.Mark(1) return false, ErrReplaceUnderpriced } // Discard any previous transaction and mark this if old != nil { pool.all.Remove(old.Hash()) - pool.priced.Removed() - queuedReplaceCounter.Inc(1) + pool.priced.Removed(1) + queuedReplaceMeter.Mark(1) + } else { + // Nothing was replaced, bump the queued counter + queuedCounter.Inc(1) } if pool.all.Get(hash) == nil { pool.all.Add(tx) @@ -744,17 +692,20 @@ func (pool *TxPool) promoteTx(addr common.Address, hash common.Hash, tx *types.T if !inserted { // An older transaction was better, discard this pool.all.Remove(hash) - pool.priced.Removed() + pool.priced.Removed(1) - pendingDiscardCounter.Inc(1) + pendingDiscardMeter.Mark(1) return false } // Otherwise discard any previous transaction and mark this if old != nil { pool.all.Remove(old.Hash()) - pool.priced.Removed() + pool.priced.Removed(1) - pendingReplaceCounter.Inc(1) + pendingReplaceMeter.Mark(1) + } else { + // Nothing was replaced, bump the pending counter + pendingCounter.Inc(1) } // Failsafe to work around direct pending inserts (tests) if pool.all.Get(hash) == nil { @@ -763,88 +714,88 @@ func (pool *TxPool) promoteTx(addr common.Address, hash common.Hash, tx *types.T } // Set the potentially new pending nonce and notify any subsystems of the new tx pool.beats[addr] = time.Now() - pool.pendingState.SetNonce(addr, tx.Nonce()+1) + pool.pendingNonces.set(addr, tx.Nonce()+1) return true } -// AddLocal enqueues a single transaction into the pool if it is valid, marking -// the sender as a local one in the mean time, ensuring it goes around the local -// pricing constraints. -func (pool *TxPool) AddLocal(tx *types.Transaction) error { - return pool.addTx(tx, !pool.config.NoLocals) +// AddLocals enqueues a batch of transactions into the pool if they are valid, marking the +// senders as a local ones, ensuring they go around the local pricing constraints. +// +// This method is used to add transactions from the RPC API and performs synchronous pool +// reorganization and event propagation. +func (pool *TxPool) AddLocals(txs []*types.Transaction) []error { + return pool.addTxs(txs, !pool.config.NoLocals, true) } -// AddRemote enqueues a single transaction into the pool if it is valid. If the -// sender is not among the locally tracked ones, full pricing constraints will -// apply. -func (pool *TxPool) AddRemote(tx *types.Transaction) error { - return pool.addTx(tx, false) +// AddLocal enqueues a single local transaction into the pool if it is valid. This is +// a convenience wrapper aroundd AddLocals. +func (pool *TxPool) AddLocal(tx *types.Transaction) error { + errs := pool.AddLocals([]*types.Transaction{tx}) + return errs[0] } -// AddLocals enqueues a batch of transactions into the pool if they are valid, -// marking the senders as a local ones in the mean time, ensuring they go around -// the local pricing constraints. -func (pool *TxPool) AddLocals(txs []*types.Transaction) []error { - return pool.addTxs(txs, !pool.config.NoLocals) +// AddRemotes enqueues a batch of transactions into the pool if they are valid. If the +// senders are not among the locally tracked ones, full pricing constraints will apply. +// +// This method is used to add transactions from the p2p network and does not wait for pool +// reorganization and internal event propagation. +func (pool *TxPool) AddRemotes(txs []*types.Transaction) []error { + return pool.addTxs(txs, false, false) } -// AddRemotes enqueues a batch of transactions into the pool if they are valid. -// If the senders are not among the locally tracked ones, full pricing constraints -// will apply. -func (pool *TxPool) AddRemotes(txs []*types.Transaction) []error { - return pool.addTxs(txs, false) +// This is like AddRemotes, but waits for pool reorganization. Tests use this method. +func (pool *TxPool) AddRemotesSync(txs []*types.Transaction) []error { + return pool.addTxs(txs, false, true) } -// addTx enqueues a single transaction into the pool if it is valid. -func (pool *TxPool) addTx(tx *types.Transaction, local bool) error { - pool.mu.Lock() - defer pool.mu.Unlock() +// This is like AddRemotes with a single transaction, but waits for pool reorganization. Tests use this method. +func (pool *TxPool) addRemoteSync(tx *types.Transaction) error { + errs := pool.AddRemotesSync([]*types.Transaction{tx}) + return errs[0] +} - // Try to inject the transaction and update any state - replace, err := pool.add(tx, local) - if err != nil { - return err - } - // If we added a new transaction, run promotion checks and return - if !replace { - from, _ := types.Sender(pool.signer, tx) // already validated - pool.promoteExecutables([]common.Address{from}) - } - return nil +// AddRemote enqueues a single transaction into the pool if it is valid. This is a convenience +// wrapper around AddRemotes. +// +// Deprecated: use AddRemotes +func (pool *TxPool) AddRemote(tx *types.Transaction) error { + errs := pool.AddRemotes([]*types.Transaction{tx}) + return errs[0] } // addTxs attempts to queue a batch of transactions if they are valid. -func (pool *TxPool) addTxs(txs []*types.Transaction, local bool) []error { +func (pool *TxPool) addTxs(txs []*types.Transaction, local, sync bool) []error { + // Cache senders in transactions before obtaining lock (pool.signer is immutable) + for _, tx := range txs { + types.Sender(pool.signer, tx) + } + pool.mu.Lock() - defer pool.mu.Unlock() + errs, dirtyAddrs := pool.addTxsLocked(txs, local) + pool.mu.Unlock() - return pool.addTxsLocked(txs, local) + done := pool.requestPromoteExecutables(dirtyAddrs) + if sync { + <-done + } + return errs } -// addTxsLocked attempts to queue a batch of transactions if they are valid, -// whilst assuming the transaction pool lock is already held. -func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) []error { - // Add the batch of transaction, tracking the accepted ones - dirty := make(map[common.Address]struct{}) +// addTxsLocked attempts to queue a batch of transactions if they are valid. +// The transaction pool lock must be held. +func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) ([]error, *accountSet) { + dirty := newAccountSet(pool.signer) errs := make([]error, len(txs)) - for i, tx := range txs { - var replace bool - if replace, errs[i] = pool.add(tx, local); errs[i] == nil && !replace { - from, _ := types.Sender(pool.signer, tx) // already validated - dirty[from] = struct{}{} - } - } - // Only reprocess the internal state if something was actually added - if len(dirty) > 0 { - addrs := make([]common.Address, 0, len(dirty)) - for addr := range dirty { - addrs = append(addrs, addr) + replaced, err := pool.add(tx, local) + errs[i] = err + if err == nil && !replaced { + dirty.addTx(tx) } - pool.promoteExecutables(addrs) } - return errs + validMeter.Mark(int64(len(dirty.accounts))) + return errs, dirty } // Status returns the status (unknown/pending/queued) of a batch of transactions @@ -867,8 +818,7 @@ func (pool *TxPool) Status(hashes []common.Hash) []TxStatus { return status } -// Get returns a transaction if it is contained in the pool -// and nil otherwise. +// Get returns a transaction if it is contained in the pool and nil otherwise. func (pool *TxPool) Get(hash common.Hash) *types.Transaction { return pool.all.Get(hash) } @@ -886,7 +836,10 @@ func (pool *TxPool) removeTx(hash common.Hash, outofbound bool) { // Remove it from the list of known transactions pool.all.Remove(hash) if outofbound { - pool.priced.Removed() + pool.priced.Removed(1) + } + if pool.locals.contains(addr) { + localCounter.Dec(1) } // Remove the transaction from the pending lists and reset the account nonce if pending := pool.pending[addr]; pending != nil { @@ -901,35 +854,279 @@ func (pool *TxPool) removeTx(hash common.Hash, outofbound bool) { pool.enqueueTx(tx.Hash(), tx) } // Update the account nonce if needed - if nonce := tx.Nonce(); pool.pendingState.GetNonce(addr) > nonce { - pool.pendingState.SetNonce(addr, nonce) - } + pool.pendingNonces.setIfLower(addr, tx.Nonce()) + // Reduce the pending counter + pendingCounter.Dec(int64(1 + len(invalids))) return } } // Transaction is in the future queue if future := pool.queue[addr]; future != nil { - future.Remove(tx) + if removed, _ := future.Remove(tx); removed { + // Reduce the queued counter + queuedCounter.Dec(1) + } if future.Empty() { delete(pool.queue, addr) } } } +// requestPromoteExecutables requests a pool reset to the new head block. +// The returned channel is closed when the reset has occurred. +func (pool *TxPool) requestReset(oldHead *types.Header, newHead *types.Header) chan struct{} { + select { + case pool.reqResetCh <- &txpoolResetRequest{oldHead, newHead}: + return <-pool.reorgDoneCh + case <-pool.reorgShutdownCh: + return pool.reorgShutdownCh + } +} + +// requestPromoteExecutables requests transaction promotion checks for the given addresses. +// The returned channel is closed when the promotion checks have occurred. +func (pool *TxPool) requestPromoteExecutables(set *accountSet) chan struct{} { + select { + case pool.reqPromoteCh <- set: + return <-pool.reorgDoneCh + case <-pool.reorgShutdownCh: + return pool.reorgShutdownCh + } +} + +// queueTxEvent enqueues a transaction event to be sent in the next reorg run. +func (pool *TxPool) queueTxEvent(tx *types.Transaction) { + select { + case pool.queueTxEventCh <- tx: + case <-pool.reorgShutdownCh: + } +} + +// scheduleReorgLoop schedules runs of reset and promoteExecutables. Code above should not +// call those methods directly, but request them being run using requestReset and +// requestPromoteExecutables instead. +func (pool *TxPool) scheduleReorgLoop() { + defer pool.wg.Done() + + var ( + curDone chan struct{} // non-nil while runReorg is active + nextDone = make(chan struct{}) + launchNextRun bool + reset *txpoolResetRequest + dirtyAccounts *accountSet + queuedEvents = make(map[common.Address]*txSortedMap) + ) + for { + // Launch next background reorg if needed + if curDone == nil && launchNextRun { + // Run the background reorg and announcements + go pool.runReorg(nextDone, reset, dirtyAccounts, queuedEvents) + + // Prepare everything for the next round of reorg + curDone, nextDone = nextDone, make(chan struct{}) + launchNextRun = false + + reset, dirtyAccounts = nil, nil + queuedEvents = make(map[common.Address]*txSortedMap) + } + + select { + case req := <-pool.reqResetCh: + // Reset request: update head if request is already pending. + if reset == nil { + reset = req + } else { + reset.newHead = req.newHead + } + launchNextRun = true + pool.reorgDoneCh <- nextDone + + case req := <-pool.reqPromoteCh: + // Promote request: update address set if request is already pending. + if dirtyAccounts == nil { + dirtyAccounts = req + } else { + dirtyAccounts.merge(req) + } + launchNextRun = true + pool.reorgDoneCh <- nextDone + + case tx := <-pool.queueTxEventCh: + // Queue up the event, but don't schedule a reorg. It's up to the caller to + // request one later if they want the events sent. + addr, _ := types.Sender(pool.signer, tx) + if _, ok := queuedEvents[addr]; !ok { + queuedEvents[addr] = newTxSortedMap() + } + queuedEvents[addr].Put(tx) + + case <-curDone: + curDone = nil + + case <-pool.reorgShutdownCh: + // Wait for current run to finish. + if curDone != nil { + <-curDone + } + close(nextDone) + return + } + } +} + +// runReorg runs reset and promoteExecutables on behalf of scheduleReorgLoop. +func (pool *TxPool) runReorg(done chan struct{}, reset *txpoolResetRequest, dirtyAccounts *accountSet, events map[common.Address]*txSortedMap) { + defer close(done) + + var promoteAddrs []common.Address + if dirtyAccounts != nil { + promoteAddrs = dirtyAccounts.flatten() + } + pool.mu.Lock() + if reset != nil { + // Reset from the old head to the new, rescheduling any reorged transactions + pool.reset(reset.oldHead, reset.newHead) + + // Nonces were reset, discard any events that became stale + for addr := range events { + events[addr].Forward(pool.pendingNonces.get(addr)) + if events[addr].Len() == 0 { + delete(events, addr) + } + } + // Reset needs promote for all addresses + promoteAddrs = promoteAddrs[:0] + for addr := range pool.queue { + promoteAddrs = append(promoteAddrs, addr) + } + } + // Check for pending transactions for every account that sent new ones + promoted := pool.promoteExecutables(promoteAddrs) + for _, tx := range promoted { + addr, _ := types.Sender(pool.signer, tx) + if _, ok := events[addr]; !ok { + events[addr] = newTxSortedMap() + } + events[addr].Put(tx) + } + // If a new block appeared, validate the pool of pending transactions. This will + // remove any transaction that has been included in the block or was invalidated + // because of another transaction (e.g. higher gas price). + if reset != nil { + pool.demoteUnexecutables() + } + // Ensure pool.queue and pool.pending sizes stay within the configured limits. + pool.truncatePending() + pool.truncateQueue() + + // Update all accounts to the latest known pending nonce + for addr, list := range pool.pending { + txs := list.Flatten() // Heavy but will be cached and is needed by the miner anyway + pool.pendingNonces.set(addr, txs[len(txs)-1].Nonce()+1) + } + pool.mu.Unlock() + + // Notify subsystems for newly added transactions + if len(events) > 0 { + var txs []*types.Transaction + for _, set := range events { + txs = append(txs, set.Flatten()...) + } + pool.txFeed.Send(NewTxsEvent{txs}) + } +} + +// reset retrieves the current state of the blockchain and ensures the content +// of the transaction pool is valid with regard to the chain state. +func (pool *TxPool) reset(oldHead, newHead *types.Header) { + // If we're reorging an old state, reinject all dropped transactions + var reinject types.Transactions + + if oldHead != nil && oldHead.Hash() != newHead.ParentHash { + // If the reorg is too deep, avoid doing it (will happen during fast sync) + oldNum := oldHead.Number.Uint64() + newNum := newHead.Number.Uint64() + + if depth := uint64(math.Abs(float64(oldNum) - float64(newNum))); depth > 64 { + log.Debug("Skipping deep transaction reorg", "depth", depth) + } else { + // Reorg seems shallow enough to pull in all transactions into memory + var discarded, included types.Transactions + var ( + rem = pool.chain.GetBlock(oldHead.Hash(), oldHead.Number.Uint64()) + add = pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64()) + ) + if rem == nil { + // This can happen if a setHead is performed, where we simply discard the old + // head from the chain. + // If that is the case, we don't have the lost transactions any more, and + // there's nothing to add + if newNum < oldNum { + // If the reorg ended up on a lower number, it's indicative of setHead being the cause + log.Debug("Skipping transaction reset caused by setHead", + "old", oldHead.Hash(), "oldnum", oldNum, "new", newHead.Hash(), "newnum", newNum) + } else { + // If we reorged to a same or higher number, then it's not a case of setHead + log.Warn("Transaction pool reset with missing oldhead", + "old", oldHead.Hash(), "oldnum", oldNum, "new", newHead.Hash(), "newnum", newNum) + } + return + } + for rem.NumberU64() > add.NumberU64() { + discarded = append(discarded, rem.Transactions()...) + if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { + log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) + return + } + } + for add.NumberU64() > rem.NumberU64() { + included = append(included, add.Transactions()...) + if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { + log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) + return + } + } + for rem.Hash() != add.Hash() { + discarded = append(discarded, rem.Transactions()...) + if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { + log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) + return + } + included = append(included, add.Transactions()...) + if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { + log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) + return + } + } + reinject = types.TxDifference(discarded, included) + } + } + // Initialize the internal state to the current head + if newHead == nil { + newHead = pool.chain.CurrentBlock().Header() // Special case during testing + } + statedb, err := pool.chain.StateAt(newHead.Root) + if err != nil { + log.Error("Failed to reset txpool state", "err", err) + return + } + pool.currentState = statedb + pool.pendingNonces = newTxNoncer(statedb) + pool.currentMaxGas = newHead.GasLimit + + // Inject any transactions discarded due to reorgs + log.Debug("Reinjecting stale transactions", "count", len(reinject)) + senderCacher.recover(pool.signer, reinject) + pool.addTxsLocked(reinject, false) +} + // promoteExecutables moves transactions that have become processable from the // future queue to the set of pending transactions. During this process, all // invalidated transactions (low nonce, low balance) are deleted. -func (pool *TxPool) promoteExecutables(accounts []common.Address) { +func (pool *TxPool) promoteExecutables(accounts []common.Address) []*types.Transaction { // Track the promoted transactions to broadcast them at once var promoted []*types.Transaction - // Gather all the accounts potentially needing updates - if accounts == nil { - accounts = make([]common.Address, 0, len(pool.queue)) - for addr := range pool.queue { - accounts = append(accounts, addr) - } - } // Iterate over all accounts and promote any executable transactions for _, addr := range accounts { list := pool.queue[addr] @@ -937,157 +1134,185 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { continue // Just in case someone calls with a non existing account } // Drop all transactions that are deemed too old (low nonce) - for _, tx := range list.Forward(pool.currentState.GetNonce(addr)) { + forwards := list.Forward(pool.currentState.GetNonce(addr)) + for _, tx := range forwards { hash := tx.Hash() - log.Trace("Removed old queued transaction", "hash", hash) pool.all.Remove(hash) - pool.priced.Removed() + log.Trace("Removed old queued transaction", "hash", hash) } // Drop all transactions that are too costly (low balance or out of gas) drops, _ := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) for _, tx := range drops { hash := tx.Hash() - log.Trace("Removed unpayable queued transaction", "hash", hash) pool.all.Remove(hash) - pool.priced.Removed() - queuedNofundsCounter.Inc(1) + log.Trace("Removed unpayable queued transaction", "hash", hash) } + queuedNofundsMeter.Mark(int64(len(drops))) + // Gather all executable transactions and promote them - for _, tx := range list.Ready(pool.pendingState.GetNonce(addr)) { + readies := list.Ready(pool.pendingNonces.get(addr)) + for _, tx := range readies { hash := tx.Hash() if pool.promoteTx(addr, hash, tx) { log.Trace("Promoting queued transaction", "hash", hash) promoted = append(promoted, tx) } } + queuedCounter.Dec(int64(len(readies))) + // Drop all transactions over the allowed limit + var caps types.Transactions if !pool.locals.contains(addr) { - for _, tx := range list.Cap(int(pool.config.AccountQueue)) { + caps = list.Cap(int(pool.config.AccountQueue)) + for _, tx := range caps { hash := tx.Hash() pool.all.Remove(hash) - pool.priced.Removed() - queuedRateLimitCounter.Inc(1) log.Trace("Removed cap-exceeding queued transaction", "hash", hash) } + queuedRateLimitMeter.Mark(int64(len(caps))) + } + // Mark all the items dropped as removed + pool.priced.Removed(len(forwards) + len(drops) + len(caps)) + queuedCounter.Dec(int64(len(forwards) + len(drops) + len(caps))) + if pool.locals.contains(addr) { + localCounter.Dec(int64(len(forwards) + len(drops) + len(caps))) } // Delete the entire queue entry if it became empty. if list.Empty() { delete(pool.queue, addr) } } - // Notify subsystem for new promoted transactions. - if len(promoted) > 0 { - go pool.txFeed.Send(NewTxsEvent{promoted}) - } - // If the pending limit is overflown, start equalizing allowances + return promoted +} + +// truncatePending removes transactions from the pending queue if the pool is above the +// pending limit. The algorithm tries to reduce transaction counts by an approximately +// equal number for all for accounts with many pending transactions. +func (pool *TxPool) truncatePending() { pending := uint64(0) for _, list := range pool.pending { pending += uint64(list.Len()) } - if pending > pool.config.GlobalSlots { - pendingBeforeCap := pending - // Assemble a spam order to penalize large transactors first - spammers := prque.New(nil) - for addr, list := range pool.pending { - // Only evict transactions from high rollers - if !pool.locals.contains(addr) && uint64(list.Len()) > pool.config.AccountSlots { - spammers.Push(addr, int64(list.Len())) - } - } - // Gradually drop transactions from offenders - offenders := []common.Address{} - for pending > pool.config.GlobalSlots && !spammers.Empty() { - // Retrieve the next offender if not local address - offender, _ := spammers.Pop() - offenders = append(offenders, offender.(common.Address)) - - // Equalize balances until all the same or below threshold - if len(offenders) > 1 { - // Calculate the equalization threshold for all current offenders - threshold := pool.pending[offender.(common.Address)].Len() - - // Iteratively reduce all offenders until below limit or threshold reached - for pending > pool.config.GlobalSlots && pool.pending[offenders[len(offenders)-2]].Len() > threshold { - for i := 0; i < len(offenders)-1; i++ { - list := pool.pending[offenders[i]] - for _, tx := range list.Cap(list.Len() - 1) { - // Drop the transaction from the global pools too - hash := tx.Hash() - pool.all.Remove(hash) - pool.priced.Removed() - - // Update the account nonce to the dropped transaction - if nonce := tx.Nonce(); pool.pendingState.GetNonce(offenders[i]) > nonce { - pool.pendingState.SetNonce(offenders[i], nonce) - } - log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) - } - pending-- - } - } - } + if pending <= pool.config.GlobalSlots { + return + } + + pendingBeforeCap := pending + // Assemble a spam order to penalize large transactors first + spammers := prque.New(nil) + for addr, list := range pool.pending { + // Only evict transactions from high rollers + if !pool.locals.contains(addr) && uint64(list.Len()) > pool.config.AccountSlots { + spammers.Push(addr, int64(list.Len())) } - // If still above threshold, reduce to limit or min allowance - if pending > pool.config.GlobalSlots && len(offenders) > 0 { - for pending > pool.config.GlobalSlots && uint64(pool.pending[offenders[len(offenders)-1]].Len()) > pool.config.AccountSlots { - for _, addr := range offenders { - list := pool.pending[addr] - for _, tx := range list.Cap(list.Len() - 1) { + } + // Gradually drop transactions from offenders + offenders := []common.Address{} + for pending > pool.config.GlobalSlots && !spammers.Empty() { + // Retrieve the next offender if not local address + offender, _ := spammers.Pop() + offenders = append(offenders, offender.(common.Address)) + + // Equalize balances until all the same or below threshold + if len(offenders) > 1 { + // Calculate the equalization threshold for all current offenders + threshold := pool.pending[offender.(common.Address)].Len() + + // Iteratively reduce all offenders until below limit or threshold reached + for pending > pool.config.GlobalSlots && pool.pending[offenders[len(offenders)-2]].Len() > threshold { + for i := 0; i < len(offenders)-1; i++ { + list := pool.pending[offenders[i]] + + caps := list.Cap(list.Len() - 1) + for _, tx := range caps { // Drop the transaction from the global pools too hash := tx.Hash() pool.all.Remove(hash) - pool.priced.Removed() // Update the account nonce to the dropped transaction - if nonce := tx.Nonce(); pool.pendingState.GetNonce(addr) > nonce { - pool.pendingState.SetNonce(addr, nonce) - } + pool.pendingNonces.setIfLower(offenders[i], tx.Nonce()) log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) } + pool.priced.Removed(len(caps)) + pendingCounter.Dec(int64(len(caps))) + if pool.locals.contains(offenders[i]) { + localCounter.Dec(int64(len(caps))) + } pending-- } } } - pendingRateLimitCounter.Inc(int64(pendingBeforeCap - pending)) } - // If we've queued more transactions than the hard limit, drop oldest ones + + // If still above threshold, reduce to limit or min allowance + if pending > pool.config.GlobalSlots && len(offenders) > 0 { + for pending > pool.config.GlobalSlots && uint64(pool.pending[offenders[len(offenders)-1]].Len()) > pool.config.AccountSlots { + for _, addr := range offenders { + list := pool.pending[addr] + + caps := list.Cap(list.Len() - 1) + for _, tx := range caps { + // Drop the transaction from the global pools too + hash := tx.Hash() + pool.all.Remove(hash) + + // Update the account nonce to the dropped transaction + pool.pendingNonces.setIfLower(addr, tx.Nonce()) + log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) + } + pool.priced.Removed(len(caps)) + pendingCounter.Dec(int64(len(caps))) + if pool.locals.contains(addr) { + localCounter.Dec(int64(len(caps))) + } + pending-- + } + } + } + pendingRateLimitMeter.Mark(int64(pendingBeforeCap - pending)) +} + +// truncateQueue drops the oldes transactions in the queue if the pool is above the global queue limit. +func (pool *TxPool) truncateQueue() { queued := uint64(0) for _, list := range pool.queue { queued += uint64(list.Len()) } - if queued > pool.config.GlobalQueue { - // Sort all accounts with queued transactions by heartbeat - addresses := make(addressesByHeartbeat, 0, len(pool.queue)) - for addr := range pool.queue { - if !pool.locals.contains(addr) { // don't drop locals - addresses = append(addresses, addressByHeartbeat{addr, pool.beats[addr]}) - } + if queued <= pool.config.GlobalQueue { + return + } + + // Sort all accounts with queued transactions by heartbeat + addresses := make(addressesByHeartbeat, 0, len(pool.queue)) + for addr := range pool.queue { + if !pool.locals.contains(addr) { // don't drop locals + addresses = append(addresses, addressByHeartbeat{addr, pool.beats[addr]}) } - sort.Sort(addresses) + } + sort.Sort(addresses) - // Drop transactions until the total is below the limit or only locals remain - for drop := queued - pool.config.GlobalQueue; drop > 0 && len(addresses) > 0; { - addr := addresses[len(addresses)-1] - list := pool.queue[addr.address] + // Drop transactions until the total is below the limit or only locals remain + for drop := queued - pool.config.GlobalQueue; drop > 0 && len(addresses) > 0; { + addr := addresses[len(addresses)-1] + list := pool.queue[addr.address] - addresses = addresses[:len(addresses)-1] + addresses = addresses[:len(addresses)-1] - // Drop all transactions if they are less than the overflow - if size := uint64(list.Len()); size <= drop { - for _, tx := range list.Flatten() { - pool.removeTx(tx.Hash(), true) - } - drop -= size - queuedRateLimitCounter.Inc(int64(size)) - continue - } - // Otherwise drop only last few transactions - txs := list.Flatten() - for i := len(txs) - 1; i >= 0 && drop > 0; i-- { - pool.removeTx(txs[i].Hash(), true) - drop-- - queuedRateLimitCounter.Inc(1) + // Drop all transactions if they are less than the overflow + if size := uint64(list.Len()); size <= drop { + for _, tx := range list.Flatten() { + pool.removeTx(tx.Hash(), true) } + drop -= size + queuedRateLimitMeter.Mark(int64(size)) + continue + } + // Otherwise drop only last few transactions + txs := list.Flatten() + for i := len(txs) - 1; i >= 0 && drop > 0; i-- { + pool.removeTx(txs[i].Hash(), true) + drop-- + queuedRateLimitMeter.Mark(1) } } } @@ -1101,11 +1326,11 @@ func (pool *TxPool) demoteUnexecutables() { nonce := pool.currentState.GetNonce(addr) // Drop all transactions that are deemed too old (low nonce) - for _, tx := range list.Forward(nonce) { + olds := list.Forward(nonce) + for _, tx := range olds { hash := tx.Hash() - log.Trace("Removed old pending transaction", "hash", hash) pool.all.Remove(hash) - pool.priced.Removed() + log.Trace("Removed old pending transaction", "hash", hash) } // Drop all transactions that are too costly (low balance or out of gas), and queue any invalids back for later drops, invalids := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) @@ -1113,21 +1338,28 @@ func (pool *TxPool) demoteUnexecutables() { hash := tx.Hash() log.Trace("Removed unpayable pending transaction", "hash", hash) pool.all.Remove(hash) - pool.priced.Removed() - pendingNofundsCounter.Inc(1) } + pool.priced.Removed(len(olds) + len(drops)) + pendingNofundsMeter.Mark(int64(len(drops))) + for _, tx := range invalids { hash := tx.Hash() log.Trace("Demoting pending transaction", "hash", hash) pool.enqueueTx(hash, tx) } + pendingCounter.Dec(int64(len(olds) + len(drops) + len(invalids))) + if pool.locals.contains(addr) { + localCounter.Dec(int64(len(olds) + len(drops) + len(invalids))) + } // If there's a gap in front, alert (should never happen) and postpone all transactions if list.Len() > 0 && list.txs.Get(nonce) == nil { - for _, tx := range list.Cap(0) { + gapped := list.Cap(0) + for _, tx := range gapped { hash := tx.Hash() log.Error("Demoting invalidated transaction", "hash", hash) pool.enqueueTx(hash, tx) } + pendingCounter.Dec(int64(len(gapped))) } // Delete the entire queue entry if it became empty. if list.Empty() { @@ -1159,11 +1391,15 @@ type accountSet struct { // newAccountSet creates a new address set with an associated signer for sender // derivations. -func newAccountSet(signer types.Signer) *accountSet { - return &accountSet{ +func newAccountSet(signer types.Signer, addrs ...common.Address) *accountSet { + as := &accountSet{ accounts: make(map[common.Address]struct{}), signer: signer, } + for _, addr := range addrs { + as.add(addr) + } + return as } // contains checks if a given address is contained within the set. @@ -1187,6 +1423,13 @@ func (as *accountSet) add(addr common.Address) { as.cache = nil } +// addTx adds the sender of tx into the set. +func (as *accountSet) addTx(tx *types.Transaction) { + if addr, err := types.Sender(as.signer, tx); err == nil { + as.add(addr) + } +} + // flatten returns the list of addresses within this set, also caching it for later // reuse. The returned slice should not be changed! func (as *accountSet) flatten() []common.Address { @@ -1200,6 +1443,14 @@ func (as *accountSet) flatten() []common.Address { return *as.cache } +// merge adds all addresses from the 'other' set into 'as'. +func (as *accountSet) merge(other *accountSet) { + for addr := range other.accounts { + as.accounts[addr] = struct{}{} + } + as.cache = nil +} + // txLookup is used internally by TxPool to track transactions while allowing lookup without // mutex contention. // diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index 5a59205442f5..388668ed8b0b 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -27,10 +27,10 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -78,7 +78,7 @@ func pricedTransaction(nonce uint64, gaslimit uint64, gasprice *big.Int, key *ec } func setupTxPool() (*TxPool, *ecdsa.PrivateKey) { - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} key, _ := crypto.GenerateKey() @@ -109,7 +109,7 @@ func validateTxPoolInternals(pool *TxPool) error { last = nonce } } - if nonce := pool.pendingState.GetNonce(addr); nonce != last+1 { + if nonce := pool.Nonce(addr); nonce != last+1 { return fmt.Errorf("pending nonce mismatch: have %v, want %v", nonce, last+1) } } @@ -126,7 +126,7 @@ func validateEvents(events chan NewTxsEvent, count int) error { case ev := <-events: received = append(received, ev.Txs...) case <-time.After(time.Second): - return fmt.Errorf("event #%d not fired", received) + return fmt.Errorf("event #%d not fired", len(received)) } } if len(received) > count { @@ -163,7 +163,7 @@ func (c *testChain) State() (*state.StateDB, error) { // a state change between those fetches. stdb := c.statedb if *c.trigger { - c.statedb, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + c.statedb, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) // simulate that the new head block included tx0 and tx1 c.statedb.SetNonce(c.address, 2) c.statedb.SetBalance(c.address, new(big.Int).SetUint64(params.Ether)) @@ -181,7 +181,7 @@ func TestStateChangeDuringTransactionPoolReset(t *testing.T) { var ( key, _ = crypto.GenerateKey() address = crypto.PubkeyToAddress(key.PublicKey) - statedb, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) trigger = false ) @@ -195,28 +195,27 @@ func TestStateChangeDuringTransactionPoolReset(t *testing.T) { pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() - nonce := pool.State().GetNonce(address) + nonce := pool.Nonce(address) if nonce != 0 { t.Fatalf("Invalid nonce, want 0, got %d", nonce) } - pool.AddRemotes(types.Transactions{tx0, tx1}) + pool.AddRemotesSync([]*types.Transaction{tx0, tx1}) - nonce = pool.State().GetNonce(address) + nonce = pool.Nonce(address) if nonce != 2 { t.Fatalf("Invalid nonce, want 2, got %d", nonce) } // trigger state change in the background trigger = true - - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) _, err := pool.Pending() if err != nil { t.Fatalf("Could not fetch pending transactions: %v", err) } - nonce = pool.State().GetNonce(address) + nonce = pool.Nonce(address) if nonce != 2 { t.Fatalf("Invalid nonce, want 2, got %d", nonce) } @@ -268,10 +267,10 @@ func TestTransactionQueue(t *testing.T) { tx := transaction(0, 100, key) from, _ := deriveSender(tx) pool.currentState.AddBalance(from, big.NewInt(1000)) - pool.lockedReset(nil, nil) - pool.enqueueTx(tx.Hash(), tx) + <-pool.requestReset(nil, nil) - pool.promoteExecutables([]common.Address{from}) + pool.enqueueTx(tx.Hash(), tx) + <-pool.requestPromoteExecutables(newAccountSet(pool.signer, from)) if len(pool.pending) != 1 { t.Error("expected valid txs to be 1 is", len(pool.pending)) } @@ -280,33 +279,36 @@ func TestTransactionQueue(t *testing.T) { from, _ = deriveSender(tx) pool.currentState.SetNonce(from, 2) pool.enqueueTx(tx.Hash(), tx) - pool.promoteExecutables([]common.Address{from}) + + <-pool.requestPromoteExecutables(newAccountSet(pool.signer, from)) if _, ok := pool.pending[from].txs.items[tx.Nonce()]; ok { t.Error("expected transaction to be in tx pool") } - if len(pool.queue) > 0 { t.Error("expected transaction queue to be empty. is", len(pool.queue)) } +} - pool, key = setupTxPool() +func TestTransactionQueue2(t *testing.T) { + t.Parallel() + + pool, key := setupTxPool() defer pool.Stop() tx1 := transaction(0, 100, key) tx2 := transaction(10, 100, key) tx3 := transaction(11, 100, key) - from, _ = deriveSender(tx1) + from, _ := deriveSender(tx1) pool.currentState.AddBalance(from, big.NewInt(1000)) - pool.lockedReset(nil, nil) + pool.reset(nil, nil) pool.enqueueTx(tx1.Hash(), tx1) pool.enqueueTx(tx2.Hash(), tx2) pool.enqueueTx(tx3.Hash(), tx3) pool.promoteExecutables([]common.Address{from}) - if len(pool.pending) != 1 { - t.Error("expected tx pool to be 1, got", len(pool.pending)) + t.Error("expected pending length to be 1, got", len(pool.pending)) } if pool.queue[from].Len() != 2 { t.Error("expected len(queue) == 2, got", pool.queue[from].Len()) @@ -335,11 +337,11 @@ func TestTransactionChainFork(t *testing.T) { addr := crypto.PubkeyToAddress(key.PublicKey) resetState := func() { - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) statedb.AddBalance(addr, big.NewInt(100000000000000)) pool.chain = &testBlockChain{statedb, 1000000, new(event.Feed)} - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) } resetState() @@ -364,11 +366,11 @@ func TestTransactionDoubleNonce(t *testing.T) { addr := crypto.PubkeyToAddress(key.PublicKey) resetState := func() { - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) statedb.AddBalance(addr, big.NewInt(100000000000000)) pool.chain = &testBlockChain{statedb, 1000000, new(event.Feed)} - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) } resetState() @@ -384,16 +386,17 @@ func TestTransactionDoubleNonce(t *testing.T) { if replace, err := pool.add(tx2, false); err != nil || !replace { t.Errorf("second transaction insert failed (%v) or not reported replacement (%v)", err, replace) } - pool.promoteExecutables([]common.Address{addr}) + <-pool.requestPromoteExecutables(newAccountSet(signer, addr)) if pool.pending[addr].Len() != 1 { t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) } if tx := pool.pending[addr].txs.items[0]; tx.Hash() != tx2.Hash() { t.Errorf("transaction mismatch: have %x, want %x", tx.Hash(), tx2.Hash()) } + // Add the third transaction and ensure it's not saved (smaller price) pool.add(tx3, false) - pool.promoteExecutables([]common.Address{addr}) + <-pool.requestPromoteExecutables(newAccountSet(signer, addr)) if pool.pending[addr].Len() != 1 { t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) } @@ -439,7 +442,7 @@ func TestTransactionNonceRecovery(t *testing.T) { addr := crypto.PubkeyToAddress(key.PublicKey) pool.currentState.SetNonce(addr, n) pool.currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) tx := transaction(n, 100000, key) if err := pool.AddRemote(tx); err != nil { @@ -447,8 +450,8 @@ func TestTransactionNonceRecovery(t *testing.T) { } // simulate some weird re-order of transactions and missing nonce(s) pool.currentState.SetNonce(addr, n-1) - pool.lockedReset(nil, nil) - if fn := pool.pendingState.GetNonce(addr); fn != n-1 { + <-pool.requestReset(nil, nil) + if fn := pool.Nonce(addr); fn != n-1 { t.Errorf("expected nonce to be %d, got %d", n-1, fn) } } @@ -491,7 +494,7 @@ func TestTransactionDropping(t *testing.T) { if pool.all.Count() != 6 { t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), 6) } - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) if pool.pending[account].Len() != 3 { t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), 3) } @@ -503,7 +506,7 @@ func TestTransactionDropping(t *testing.T) { } // Reduce the balance of the account, and check that invalidated transactions are dropped pool.currentState.AddBalance(account, big.NewInt(-650)) - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok { t.Errorf("funded pending transaction missing: %v", tx0) @@ -528,7 +531,7 @@ func TestTransactionDropping(t *testing.T) { } // Reduce the block gas limit, check that invalidated transactions are dropped pool.chain.(*testBlockChain).gasLimit = 100 - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok { t.Errorf("funded pending transaction missing: %v", tx0) @@ -554,7 +557,7 @@ func TestTransactionPostponing(t *testing.T) { t.Parallel() // Create the pool to test the postponing with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -584,7 +587,7 @@ func TestTransactionPostponing(t *testing.T) { txs = append(txs, tx) } } - for i, err := range pool.AddRemotes(txs) { + for i, err := range pool.AddRemotesSync(txs) { if err != nil { t.Fatalf("tx %d: failed to add transactions: %v", i, err) } @@ -599,7 +602,7 @@ func TestTransactionPostponing(t *testing.T) { if pool.all.Count() != len(txs) { t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), len(txs)) } - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) if pending := pool.pending[accs[0]].Len() + pool.pending[accs[1]].Len(); pending != len(txs) { t.Errorf("pending transaction mismatch: have %d, want %d", pending, len(txs)) } @@ -613,7 +616,7 @@ func TestTransactionPostponing(t *testing.T) { for _, addr := range accs { pool.currentState.AddBalance(addr, big.NewInt(-1)) } - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) // The first account's first transaction remains valid, check that subsequent // ones are either filtered out, or queued up for later. @@ -680,12 +683,10 @@ func TestTransactionGapFilling(t *testing.T) { defer sub.Unsubscribe() // Create a pending and a queued transaction with a nonce-gap in between - if err := pool.AddRemote(transaction(0, 100000, key)); err != nil { - t.Fatalf("failed to add pending transaction: %v", err) - } - if err := pool.AddRemote(transaction(2, 100000, key)); err != nil { - t.Fatalf("failed to add queued transaction: %v", err) - } + pool.AddRemotesSync([]*types.Transaction{ + transaction(0, 100000, key), + transaction(2, 100000, key), + }) pending, queued := pool.Stats() if pending != 1 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 1) @@ -700,7 +701,7 @@ func TestTransactionGapFilling(t *testing.T) { t.Fatalf("pool internal state corrupted: %v", err) } // Fill the nonce gap and ensure all transactions become pending - if err := pool.AddRemote(transaction(1, 100000, key)); err != nil { + if err := pool.addRemoteSync(transaction(1, 100000, key)); err != nil { t.Fatalf("failed to add gapped transaction: %v", err) } pending, queued = pool.Stats() @@ -732,7 +733,7 @@ func TestTransactionQueueAccountLimiting(t *testing.T) { // Keep queuing up transactions and make sure all above a limit are dropped for i := uint64(1); i <= testTxPoolConfig.AccountQueue+5; i++ { - if err := pool.AddRemote(transaction(i, 100000, key)); err != nil { + if err := pool.addRemoteSync(transaction(i, 100000, key)); err != nil { t.Fatalf("tx %d: failed to add transaction: %v", i, err) } if len(pool.pending) != 0 { @@ -769,7 +770,7 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -799,7 +800,7 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { nonces[addr]++ } // Import the batch and verify that limits have been enforced - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) queued := 0 for addr, list := range pool.queue { @@ -857,7 +858,7 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { evictionInterval = time.Second // Create the pool to test the non-expiration enforcement - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -932,7 +933,7 @@ func TestTransactionPendingLimiting(t *testing.T) { // Keep queuing up transactions and make sure all above a limit are dropped for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { - if err := pool.AddRemote(transaction(i, 100000, key)); err != nil { + if err := pool.addRemoteSync(transaction(i, 100000, key)); err != nil { t.Fatalf("tx %d: failed to add transaction: %v", i, err) } if pool.pending[account].Len() != int(i)+1 { @@ -953,57 +954,6 @@ func TestTransactionPendingLimiting(t *testing.T) { } } -// Tests that the transaction limits are enforced the same way irrelevant whether -// the transactions are added one by one or in batches. -func TestTransactionQueueLimitingEquivalency(t *testing.T) { testTransactionLimitingEquivalency(t, 1) } -func TestTransactionPendingLimitingEquivalency(t *testing.T) { testTransactionLimitingEquivalency(t, 0) } - -func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { - t.Parallel() - - // Add a batch of transactions to a pool one by one - pool1, key1 := setupTxPool() - defer pool1.Stop() - - account1, _ := deriveSender(transaction(0, 0, key1)) - pool1.currentState.AddBalance(account1, big.NewInt(1000000)) - - for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { - if err := pool1.AddRemote(transaction(origin+i, 100000, key1)); err != nil { - t.Fatalf("tx %d: failed to add transaction: %v", i, err) - } - } - // Add a batch of transactions to a pool in one big batch - pool2, key2 := setupTxPool() - defer pool2.Stop() - - account2, _ := deriveSender(transaction(0, 0, key2)) - pool2.currentState.AddBalance(account2, big.NewInt(1000000)) - - txs := []*types.Transaction{} - for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { - txs = append(txs, transaction(origin+i, 100000, key2)) - } - pool2.AddRemotes(txs) - - // Ensure the batch optimization honors the same pool mechanics - if len(pool1.pending) != len(pool2.pending) { - t.Errorf("pending transaction count mismatch: one-by-one algo: %d, batch algo: %d", len(pool1.pending), len(pool2.pending)) - } - if len(pool1.queue) != len(pool2.queue) { - t.Errorf("queued transaction count mismatch: one-by-one algo: %d, batch algo: %d", len(pool1.queue), len(pool2.queue)) - } - if pool1.all.Count() != pool2.all.Count() { - t.Errorf("total transaction count mismatch: one-by-one algo %d, batch algo %d", pool1.all.Count(), pool2.all.Count()) - } - if err := validateTxPoolInternals(pool1); err != nil { - t.Errorf("pool 1 internal state corrupted: %v", err) - } - if err := validateTxPoolInternals(pool2); err != nil { - t.Errorf("pool 2 internal state corrupted: %v", err) - } -} - // Tests that if the transaction count belonging to multiple accounts go above // some hard threshold, the higher transactions are dropped to prevent DOS // attacks. @@ -1011,7 +961,7 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1038,7 +988,7 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { } } // Import the batch and verify that limits have been enforced - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) pending := 0 for _, list := range pool.pending { @@ -1057,7 +1007,7 @@ func TestTransactionCapClearsFromAll(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1091,11 +1041,11 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig - config.GlobalSlots = 0 + config.GlobalSlots = 1 pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() @@ -1118,7 +1068,7 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { } } // Import the batch and verify that limits have been enforced - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) for addr, list := range pool.pending { if list.Len() != int(config.AccountSlots) { @@ -1139,7 +1089,7 @@ func TestTransactionPoolRepricing(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -1174,7 +1124,7 @@ func TestTransactionPoolRepricing(t *testing.T) { ltx := pricedTransaction(0, 100000, big.NewInt(1), keys[3]) // Import the batch and that both pending and queued transactions match up - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) pool.AddLocal(ltx) pending, queued := pool.Stats() @@ -1260,7 +1210,7 @@ func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -1274,14 +1224,14 @@ func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { } // Create transaction (both pending and queued) with a linearly growing gasprice for i := uint64(0); i < 500; i++ { - // Add pending - p_tx := pricedTransaction(i, 100000, big.NewInt(int64(i)), keys[2]) - if err := pool.AddLocal(p_tx); err != nil { + // Add pending transaction. + pendingTx := pricedTransaction(i, 100000, big.NewInt(int64(i)), keys[2]) + if err := pool.AddLocal(pendingTx); err != nil { t.Fatal(err) } - // Add queued - q_tx := pricedTransaction(i+501, 100000, big.NewInt(int64(i)), keys[2]) - if err := pool.AddLocal(q_tx); err != nil { + // Add queued transaction. + queuedTx := pricedTransaction(i+501, 100000, big.NewInt(int64(i)), keys[2]) + if err := pool.AddLocal(queuedTx); err != nil { t.Fatal(err) } } @@ -1322,7 +1272,7 @@ func TestTransactionPoolUnderpricing(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1428,7 +1378,7 @@ func TestTransactionPoolStableUnderpricing(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1454,7 +1404,7 @@ func TestTransactionPoolStableUnderpricing(t *testing.T) { for i := uint64(0); i < config.GlobalSlots; i++ { txs = append(txs, pricedTransaction(i, 100000, big.NewInt(1), keys[0])) } - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) pending, queued := pool.Stats() if pending != int(config.GlobalSlots) { @@ -1470,7 +1420,7 @@ func TestTransactionPoolStableUnderpricing(t *testing.T) { t.Fatalf("pool internal state corrupted: %v", err) } // Ensure that adding high priced transactions drops a cheap, but doesn't produce a gap - if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(3), keys[1])); err != nil { + if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(3), keys[1])); err != nil { t.Fatalf("failed to add well priced transaction: %v", err) } pending, queued = pool.Stats() @@ -1494,7 +1444,7 @@ func TestTransactionReplacement(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -1513,7 +1463,7 @@ func TestTransactionReplacement(t *testing.T) { price := int64(100) threshold := (price * (100 + int64(testTxPoolConfig.PriceBump))) / 100 - if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(1), key)); err != nil { + if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(1), key)); err != nil { t.Fatalf("failed to add original cheap pending transaction: %v", err) } if err := pool.AddRemote(pricedTransaction(0, 100001, big.NewInt(1), key)); err != ErrReplaceUnderpriced { @@ -1526,7 +1476,7 @@ func TestTransactionReplacement(t *testing.T) { t.Fatalf("cheap replacement event firing failed: %v", err) } - if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(price), key)); err != nil { + if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(price), key)); err != nil { t.Fatalf("failed to add original proper pending transaction: %v", err) } if err := pool.AddRemote(pricedTransaction(0, 100001, big.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced { @@ -1538,6 +1488,7 @@ func TestTransactionReplacement(t *testing.T) { if err := validateEvents(events, 2); err != nil { t.Fatalf("proper replacement event firing failed: %v", err) } + // Add queued transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too) if err := pool.AddRemote(pricedTransaction(2, 100000, big.NewInt(1), key)); err != nil { t.Fatalf("failed to add original cheap queued transaction: %v", err) @@ -1588,7 +1539,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { os.Remove(journal) // Create the original pool to inject transaction into the journal - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1615,7 +1566,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { if err := pool.AddLocal(pricedTransaction(2, 100000, big.NewInt(1), local)); err != nil { t.Fatalf("failed to add local transaction: %v", err) } - if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(1), remote)); err != nil { + if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(1), remote)); err != nil { t.Fatalf("failed to add remote transaction: %v", err) } pending, queued := pool.Stats() @@ -1653,7 +1604,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { } // Bump the nonce temporarily and ensure the newly invalidated transaction is removed statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 2) - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) time.Sleep(2 * config.Rejournal) pool.Stop() @@ -1686,7 +1637,7 @@ func TestTransactionStatusCheck(t *testing.T) { t.Parallel() // Create the pool to test the status retrievals with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -1707,7 +1658,7 @@ func TestTransactionStatusCheck(t *testing.T) { txs = append(txs, pricedTransaction(2, 100000, big.NewInt(1), keys[2])) // Queued only // Import the transaction and ensure they are correctly added - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) pending, queued := pool.Stats() if pending != 2 { @@ -1786,26 +1737,6 @@ func benchmarkFuturePromotion(b *testing.B, size int) { } } -// Benchmarks the speed of iterative transaction insertion. -func BenchmarkPoolInsert(b *testing.B) { - // Generate a batch of transactions to enqueue into the pool - pool, key := setupTxPool() - defer pool.Stop() - - account, _ := deriveSender(transaction(0, 0, key)) - pool.currentState.AddBalance(account, big.NewInt(1000000)) - - txs := make(types.Transactions, b.N) - for i := 0; i < b.N; i++ { - txs[i] = transaction(uint64(i), 100000, key) - } - // Benchmark importing the transactions into the queue - b.ResetTimer() - for _, tx := range txs { - pool.AddRemote(tx) - } -} - // Benchmarks the speed of batched transaction insertion. func BenchmarkPoolBatchInsert100(b *testing.B) { benchmarkPoolBatchInsert(b, 100) } func BenchmarkPoolBatchInsert1000(b *testing.B) { benchmarkPoolBatchInsert(b, 1000) } diff --git a/core/types.go b/core/types.go index d0bbaf0aa77b..4c5b74a49865 100644 --- a/core/types.go +++ b/core/types.go @@ -25,22 +25,27 @@ import ( // Validator is an interface which defines the standard for block validation. It // is only responsible for validating block contents, as the header validation is // done by the specific consensus engines. -// type Validator interface { // ValidateBody validates the given block's content. ValidateBody(block *types.Block) error // ValidateState validates the given statedb and optionally the receipts and // gas used. - ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error + ValidateState(block *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error +} + +// Prefetcher is an interface for pre-caching transaction signatures and state. +type Prefetcher interface { + // Prefetch processes the state changes according to the Ethereum rules by running + // the transaction messages using the statedb, but any changes are discarded. The + // only goal is to pre-cache transaction signatures and state trie nodes. + Prefetch(block *types.Block, statedb *state.StateDB, cfg vm.Config, interrupt *uint32) } // Processor is an interface for processing blocks using a given initial state. -// -// Process takes the block to be processed and the statedb upon which the -// initial state is based. It should return the receipts generated, amount -// of gas used in the process and return an error if any of the internal rules -// failed. type Processor interface { + // Process processes the state changes according to the Ethereum rules by running + // the transaction messages using the statedb and applying any rewards to both + // the processor (coinbase) and any included uncles. Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error) } diff --git a/core/types/block.go b/core/types/block.go index 8a21bba1e783..b0ec7fc77d68 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -19,22 +19,23 @@ package types import ( "encoding/binary" + "fmt" "io" "math/big" + "reflect" "sort" "sync/atomic" "time" - "unsafe" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" ) var ( EmptyRootHash = DeriveSha(Transactions{}) - EmptyUncleHash = CalcUncleHash(nil) + EmptyUncleHash = rlpHash([]*Header(nil)) ) // A BlockNonce is a 64-bit hash which proves (combined with the @@ -79,10 +80,10 @@ type Header struct { Number *big.Int `json:"number" gencodec:"required"` GasLimit uint64 `json:"gasLimit" gencodec:"required"` GasUsed uint64 `json:"gasUsed" gencodec:"required"` - Time *big.Int `json:"timestamp" gencodec:"required"` + Time uint64 `json:"timestamp" gencodec:"required"` Extra []byte `json:"extraData" gencodec:"required"` - MixDigest common.Hash `json:"mixHash" gencodec:"required"` - Nonce BlockNonce `json:"nonce" gencodec:"required"` + MixDigest common.Hash `json:"mixHash"` + Nonce BlockNonce `json:"nonce"` } // field type overrides for gencodec @@ -91,7 +92,7 @@ type headerMarshaling struct { Number *hexutil.Big GasLimit hexutil.Uint64 GasUsed hexutil.Uint64 - Time *hexutil.Big + Time hexutil.Uint64 Extra hexutil.Bytes Hash common.Hash `json:"hash"` // adds call to Hash() in MarshalJSON } @@ -102,14 +103,35 @@ func (h *Header) Hash() common.Hash { return rlpHash(h) } +var headerSize = common.StorageSize(reflect.TypeOf(Header{}).Size()) + // Size returns the approximate memory used by all internal contents. It is used // to approximate and limit the memory consumption of various caches. func (h *Header) Size() common.StorageSize { - return common.StorageSize(unsafe.Sizeof(*h)) + common.StorageSize(len(h.Extra)+(h.Difficulty.BitLen()+h.Number.BitLen()+h.Time.BitLen())/8) + return headerSize + common.StorageSize(len(h.Extra)+(h.Difficulty.BitLen()+h.Number.BitLen())/8) +} + +// SanityCheck checks a few basic things -- these checks are way beyond what +// any 'sane' production values should hold, and can mainly be used to prevent +// that the unbounded fields are stuffed with junk data to add processing +// overhead +func (h *Header) SanityCheck() error { + if h.Number != nil && !h.Number.IsUint64() { + return fmt.Errorf("too large block number: bitlen %d", h.Number.BitLen()) + } + if h.Difficulty != nil { + if diffLen := h.Difficulty.BitLen(); diffLen > 80 { + return fmt.Errorf("too large block difficulty: bitlen %d", diffLen) + } + } + if eLen := len(h.Extra); eLen > 100*1024 { + return fmt.Errorf("too large block extradata: size %d", eLen) + } + return nil } func rlpHash(x interface{}) (h common.Hash) { - hw := sha3.NewKeccak256() + hw := sha3.NewLegacyKeccak256() rlp.Encode(hw, x) hw.Sum(h[:0]) return h @@ -221,9 +243,6 @@ func NewBlockWithHeader(header *Header) *Block { // modifying a header variable. func CopyHeader(h *Header) *Header { cpy := *h - if cpy.Time = new(big.Int); h.Time != nil { - cpy.Time.Set(h.Time) - } if cpy.Difficulty = new(big.Int); h.Difficulty != nil { cpy.Difficulty.Set(h.Difficulty) } @@ -286,7 +305,7 @@ func (b *Block) Number() *big.Int { return new(big.Int).Set(b.header.Number) func (b *Block) GasLimit() uint64 { return b.header.GasLimit } func (b *Block) GasUsed() uint64 { return b.header.GasUsed } func (b *Block) Difficulty() *big.Int { return new(big.Int).Set(b.header.Difficulty) } -func (b *Block) Time() *big.Int { return new(big.Int).Set(b.header.Time) } +func (b *Block) Time() uint64 { return b.header.Time } func (b *Block) NumberU64() uint64 { return b.header.Number.Uint64() } func (b *Block) MixDigest() common.Hash { return b.header.MixDigest } @@ -317,6 +336,12 @@ func (b *Block) Size() common.StorageSize { return common.StorageSize(c) } +// SanityCheck can be used to prevent that unbounded fields are +// stuffed with junk data to add processing overhead +func (b *Block) SanityCheck() error { + return b.header.SanityCheck() +} + type writeCounter common.StorageSize func (c *writeCounter) Write(b []byte) (int, error) { @@ -325,6 +350,9 @@ func (c *writeCounter) Write(b []byte) (int, error) { } func CalcUncleHash(uncles []*Header) common.Hash { + if len(uncles) == 0 { + return EmptyUncleHash + } return rlpHash(uncles) } diff --git a/core/types/block_test.go b/core/types/block_test.go index a35fbc25b1ed..ff0a641e5ceb 100644 --- a/core/types/block_test.go +++ b/core/types/block_test.go @@ -18,7 +18,6 @@ package types import ( "bytes" - "fmt" "math/big" "reflect" "testing" @@ -48,15 +47,11 @@ func TestBlockEncoding(t *testing.T) { check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017")) check("Hash", block.Hash(), common.HexToHash("0a5843ac1cb04865017cb35a57b50b07084e5fcee39b5acadade33149f4fff9e")) check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4)) - check("Time", block.Time(), big.NewInt(1426516743)) + check("Time", block.Time(), uint64(1426516743)) check("Size", block.Size(), common.StorageSize(len(blockEnc))) tx1 := NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), 50000, big.NewInt(10), nil) - tx1, _ = tx1.WithSignature(HomesteadSigner{}, common.Hex2Bytes("9bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094f8a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b100")) - fmt.Println(block.Transactions()[0].Hash()) - fmt.Println(tx1.data) - fmt.Println(tx1.Hash()) check("len(Transactions)", len(block.Transactions()), 1) check("Transactions[0].Hash", block.Transactions()[0].Hash(), tx1.Hash()) @@ -68,3 +63,19 @@ func TestBlockEncoding(t *testing.T) { t.Errorf("encoded block mismatch:\ngot: %x\nwant: %x", ourBlockEnc, blockEnc) } } + +func TestUncleHash(t *testing.T) { + uncles := make([]*Header, 0) + h := CalcUncleHash(uncles) + exp := common.HexToHash("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347") + if h != exp { + t.Fatalf("empty uncle hash is wrong, got %x != %x", h, exp) + } +} +func BenchmarkUncleHash(b *testing.B) { + uncles := make([]*Header, 0) + b.ResetTimer() + for i := 0; i < b.N; i++ { + CalcUncleHash(uncles) + } +} diff --git a/core/types/gen_header_json.go b/core/types/gen_header_json.go index 1b92cd9cf44f..4212b8d94d25 100644 --- a/core/types/gen_header_json.go +++ b/core/types/gen_header_json.go @@ -13,6 +13,7 @@ import ( var _ = (*headerMarshaling)(nil) +// MarshalJSON marshals as JSON. func (h Header) MarshalJSON() ([]byte, error) { type Header struct { ParentHash common.Hash `json:"parentHash" gencodec:"required"` @@ -26,10 +27,10 @@ func (h Header) MarshalJSON() ([]byte, error) { Number *hexutil.Big `json:"number" gencodec:"required"` GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` - Time *hexutil.Big `json:"timestamp" gencodec:"required"` + Time hexutil.Uint64 `json:"timestamp" gencodec:"required"` Extra hexutil.Bytes `json:"extraData" gencodec:"required"` - MixDigest common.Hash `json:"mixHash" gencodec:"required"` - Nonce BlockNonce `json:"nonce" gencodec:"required"` + MixDigest common.Hash `json:"mixHash"` + Nonce BlockNonce `json:"nonce"` Hash common.Hash `json:"hash"` } var enc Header @@ -44,7 +45,7 @@ func (h Header) MarshalJSON() ([]byte, error) { enc.Number = (*hexutil.Big)(h.Number) enc.GasLimit = hexutil.Uint64(h.GasLimit) enc.GasUsed = hexutil.Uint64(h.GasUsed) - enc.Time = (*hexutil.Big)(h.Time) + enc.Time = hexutil.Uint64(h.Time) enc.Extra = h.Extra enc.MixDigest = h.MixDigest enc.Nonce = h.Nonce @@ -52,6 +53,7 @@ func (h Header) MarshalJSON() ([]byte, error) { return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (h *Header) UnmarshalJSON(input []byte) error { type Header struct { ParentHash *common.Hash `json:"parentHash" gencodec:"required"` @@ -65,10 +67,10 @@ func (h *Header) UnmarshalJSON(input []byte) error { Number *hexutil.Big `json:"number" gencodec:"required"` GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"` GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` - Time *hexutil.Big `json:"timestamp" gencodec:"required"` + Time *hexutil.Uint64 `json:"timestamp" gencodec:"required"` Extra *hexutil.Bytes `json:"extraData" gencodec:"required"` - MixDigest *common.Hash `json:"mixHash" gencodec:"required"` - Nonce *BlockNonce `json:"nonce" gencodec:"required"` + MixDigest *common.Hash `json:"mixHash"` + Nonce *BlockNonce `json:"nonce"` } var dec Header if err := json.Unmarshal(input, &dec); err != nil { @@ -121,18 +123,16 @@ func (h *Header) UnmarshalJSON(input []byte) error { if dec.Time == nil { return errors.New("missing required field 'timestamp' for Header") } - h.Time = (*big.Int)(dec.Time) + h.Time = uint64(*dec.Time) if dec.Extra == nil { return errors.New("missing required field 'extraData' for Header") } h.Extra = *dec.Extra - if dec.MixDigest == nil { - return errors.New("missing required field 'mixHash' for Header") + if dec.MixDigest != nil { + h.MixDigest = *dec.MixDigest } - h.MixDigest = *dec.MixDigest - if dec.Nonce == nil { - return errors.New("missing required field 'nonce' for Header") + if dec.Nonce != nil { + h.Nonce = *dec.Nonce } - h.Nonce = *dec.Nonce return nil } diff --git a/core/types/gen_log_json.go b/core/types/gen_log_json.go index 1b5ae3c653ba..6e94339478f0 100644 --- a/core/types/gen_log_json.go +++ b/core/types/gen_log_json.go @@ -12,6 +12,7 @@ import ( var _ = (*logMarshaling)(nil) +// MarshalJSON marshals as JSON. func (l Log) MarshalJSON() ([]byte, error) { type Log struct { Address common.Address `json:"address" gencodec:"required"` @@ -37,6 +38,7 @@ func (l Log) MarshalJSON() ([]byte, error) { return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (l *Log) UnmarshalJSON(input []byte) error { type Log struct { Address *common.Address `json:"address" gencodec:"required"` diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go index 5c807a4ccbe1..790ed65b5817 100644 --- a/core/types/gen_receipt_json.go +++ b/core/types/gen_receipt_json.go @@ -5,6 +5,7 @@ package types import ( "encoding/json" "errors" + "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -23,6 +24,9 @@ func (r Receipt) MarshalJSON() ([]byte, error) { TxHash common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress common.Address `json:"contractAddress"` GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + BlockHash common.Hash `json:"blockHash,omitempty"` + BlockNumber *hexutil.Big `json:"blockNumber,omitempty"` + TransactionIndex hexutil.Uint `json:"transactionIndex"` } var enc Receipt enc.PostState = r.PostState @@ -33,6 +37,9 @@ func (r Receipt) MarshalJSON() ([]byte, error) { enc.TxHash = r.TxHash enc.ContractAddress = r.ContractAddress enc.GasUsed = hexutil.Uint64(r.GasUsed) + enc.BlockHash = r.BlockHash + enc.BlockNumber = (*hexutil.Big)(r.BlockNumber) + enc.TransactionIndex = hexutil.Uint(r.TransactionIndex) return json.Marshal(&enc) } @@ -47,6 +54,9 @@ func (r *Receipt) UnmarshalJSON(input []byte) error { TxHash *common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress *common.Address `json:"contractAddress"` GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + BlockHash *common.Hash `json:"blockHash,omitempty"` + BlockNumber *hexutil.Big `json:"blockNumber,omitempty"` + TransactionIndex *hexutil.Uint `json:"transactionIndex"` } var dec Receipt if err := json.Unmarshal(input, &dec); err != nil { @@ -81,5 +91,14 @@ func (r *Receipt) UnmarshalJSON(input []byte) error { return errors.New("missing required field 'gasUsed' for Receipt") } r.GasUsed = uint64(*dec.GasUsed) + if dec.BlockHash != nil { + r.BlockHash = *dec.BlockHash + } + if dec.BlockNumber != nil { + r.BlockNumber = (*big.Int)(dec.BlockNumber) + } + if dec.TransactionIndex != nil { + r.TransactionIndex = uint(*dec.TransactionIndex) + } return nil } diff --git a/core/types/gen_tx_json.go b/core/types/gen_tx_json.go index c27da67096eb..e676058ecc4b 100644 --- a/core/types/gen_tx_json.go +++ b/core/types/gen_tx_json.go @@ -13,6 +13,7 @@ import ( var _ = (*txdataMarshaling)(nil) +// MarshalJSON marshals as JSON. func (t txdata) MarshalJSON() ([]byte, error) { type txdata struct { AccountNonce hexutil.Uint64 `json:"nonce" gencodec:"required"` @@ -40,6 +41,7 @@ func (t txdata) MarshalJSON() ([]byte, error) { return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (t *txdata) UnmarshalJSON(input []byte) error { type txdata struct { AccountNonce *hexutil.Uint64 `json:"nonce" gencodec:"required"` diff --git a/core/types/log.go b/core/types/log.go index b629b47ed53b..006f62bbf6f6 100644 --- a/core/types/log.go +++ b/core/types/log.go @@ -47,7 +47,7 @@ type Log struct { TxIndex uint `json:"transactionIndex" gencodec:"required"` // hash of the block in which the transaction was included BlockHash common.Hash `json:"blockHash"` - // index of the log in the receipt + // index of the log in the block Index uint `json:"logIndex" gencodec:"required"` // The Removed field is true if this log was reverted due to a chain reorganisation. @@ -68,7 +68,11 @@ type rlpLog struct { Data []byte } -type rlpStorageLog struct { +// rlpStorageLog is the storage encoding of a log. +type rlpStorageLog rlpLog + +// legacyRlpStorageLog is the previous storage encoding of a log including some redundant fields. +type legacyRlpStorageLog struct { Address common.Address Topics []common.Hash Data []byte @@ -101,31 +105,38 @@ type LogForStorage Log // EncodeRLP implements rlp.Encoder. func (l *LogForStorage) EncodeRLP(w io.Writer) error { return rlp.Encode(w, rlpStorageLog{ - Address: l.Address, - Topics: l.Topics, - Data: l.Data, - BlockNumber: l.BlockNumber, - TxHash: l.TxHash, - TxIndex: l.TxIndex, - BlockHash: l.BlockHash, - Index: l.Index, + Address: l.Address, + Topics: l.Topics, + Data: l.Data, }) } // DecodeRLP implements rlp.Decoder. +// +// Note some redundant fields(e.g. block number, tx hash etc) will be assembled later. func (l *LogForStorage) DecodeRLP(s *rlp.Stream) error { + blob, err := s.Raw() + if err != nil { + return err + } var dec rlpStorageLog - err := s.Decode(&dec) + err = rlp.DecodeBytes(blob, &dec) if err == nil { *l = LogForStorage{ - Address: dec.Address, - Topics: dec.Topics, - Data: dec.Data, - BlockNumber: dec.BlockNumber, - TxHash: dec.TxHash, - TxIndex: dec.TxIndex, - BlockHash: dec.BlockHash, - Index: dec.Index, + Address: dec.Address, + Topics: dec.Topics, + Data: dec.Data, + } + } else { + // Try to decode log with previous definition. + var dec legacyRlpStorageLog + err = rlp.DecodeBytes(blob, &dec) + if err == nil { + *l = LogForStorage{ + Address: dec.Address, + Topics: dec.Topics, + Data: dec.Data, + } } } return err diff --git a/core/types/receipt.go b/core/types/receipt.go index 3d1fc95aabce..a96c7525ef3b 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -18,12 +18,16 @@ package types import ( "bytes" + "errors" "fmt" "io" + "math/big" "unsafe" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" ) @@ -44,17 +48,24 @@ const ( // Receipt represents the results of a transaction. type Receipt struct { - // Consensus fields + // Consensus fields: These fields are defined by the Yellow Paper PostState []byte `json:"root"` Status uint64 `json:"status"` CumulativeGasUsed uint64 `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` - // Implementation fields (don't reorder!) + // Implementation fields: These fields are added by geth when processing a transaction. + // They are stored in the chain database. TxHash common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress common.Address `json:"contractAddress"` GasUsed uint64 `json:"gasUsed" gencodec:"required"` + + // Inclusion information: These fields provide information about the inclusion of the + // transaction corresponding to this receipt. + BlockHash common.Hash `json:"blockHash,omitempty"` + BlockNumber *big.Int `json:"blockNumber,omitempty"` + TransactionIndex uint `json:"transactionIndex"` } type receiptMarshaling struct { @@ -62,6 +73,8 @@ type receiptMarshaling struct { Status hexutil.Uint64 CumulativeGasUsed hexutil.Uint64 GasUsed hexutil.Uint64 + BlockNumber *hexutil.Big + TransactionIndex hexutil.Uint } // receiptRLP is the consensus encoding of a receipt. @@ -72,7 +85,25 @@ type receiptRLP struct { Logs []*Log } -type receiptStorageRLP struct { +// storedReceiptRLP is the storage encoding of a receipt. +type storedReceiptRLP struct { + PostStateOrStatus []byte + CumulativeGasUsed uint64 + Logs []*LogForStorage +} + +// v4StoredReceiptRLP is the storage encoding of a receipt used in database version 4. +type v4StoredReceiptRLP struct { + PostStateOrStatus []byte + CumulativeGasUsed uint64 + TxHash common.Hash + ContractAddress common.Address + Logs []*LogForStorage + GasUsed uint64 +} + +// v3StoredReceiptRLP is the original storage encoding of a receipt including some unnecessary fields. +type v3StoredReceiptRLP struct { PostStateOrStatus []byte CumulativeGasUsed uint64 Bloom Bloom @@ -156,14 +187,10 @@ type ReceiptForStorage Receipt // EncodeRLP implements rlp.Encoder, and flattens all content fields of a receipt // into an RLP stream. func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error { - enc := &receiptStorageRLP{ + enc := &storedReceiptRLP{ PostStateOrStatus: (*Receipt)(r).statusEncoding(), CumulativeGasUsed: r.CumulativeGasUsed, - Bloom: r.Bloom, - TxHash: r.TxHash, - ContractAddress: r.ContractAddress, Logs: make([]*LogForStorage, len(r.Logs)), - GasUsed: r.GasUsed, } for i, log := range r.Logs { enc.Logs[i] = (*LogForStorage)(log) @@ -174,21 +201,79 @@ func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error { // DecodeRLP implements rlp.Decoder, and loads both consensus and implementation // fields of a receipt from an RLP stream. func (r *ReceiptForStorage) DecodeRLP(s *rlp.Stream) error { - var dec receiptStorageRLP - if err := s.Decode(&dec); err != nil { + // Retrieve the entire receipt blob as we need to try multiple decoders + blob, err := s.Raw() + if err != nil { return err } - if err := (*Receipt)(r).setStatus(dec.PostStateOrStatus); err != nil { + // Try decoding from the newest format for future proofness, then the older one + // for old nodes that just upgraded. V4 was an intermediate unreleased format so + // we do need to decode it, but it's not common (try last). + if err := decodeStoredReceiptRLP(r, blob); err == nil { + return nil + } + if err := decodeV3StoredReceiptRLP(r, blob); err == nil { + return nil + } + return decodeV4StoredReceiptRLP(r, blob) +} + +func decodeStoredReceiptRLP(r *ReceiptForStorage, blob []byte) error { + var stored storedReceiptRLP + if err := rlp.DecodeBytes(blob, &stored); err != nil { return err } - // Assign the consensus fields - r.CumulativeGasUsed, r.Bloom = dec.CumulativeGasUsed, dec.Bloom - r.Logs = make([]*Log, len(dec.Logs)) - for i, log := range dec.Logs { + if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil { + return err + } + r.CumulativeGasUsed = stored.CumulativeGasUsed + r.Logs = make([]*Log, len(stored.Logs)) + for i, log := range stored.Logs { + r.Logs[i] = (*Log)(log) + } + r.Bloom = CreateBloom(Receipts{(*Receipt)(r)}) + + return nil +} + +func decodeV4StoredReceiptRLP(r *ReceiptForStorage, blob []byte) error { + var stored v4StoredReceiptRLP + if err := rlp.DecodeBytes(blob, &stored); err != nil { + return err + } + if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil { + return err + } + r.CumulativeGasUsed = stored.CumulativeGasUsed + r.TxHash = stored.TxHash + r.ContractAddress = stored.ContractAddress + r.GasUsed = stored.GasUsed + r.Logs = make([]*Log, len(stored.Logs)) + for i, log := range stored.Logs { + r.Logs[i] = (*Log)(log) + } + r.Bloom = CreateBloom(Receipts{(*Receipt)(r)}) + + return nil +} + +func decodeV3StoredReceiptRLP(r *ReceiptForStorage, blob []byte) error { + var stored v3StoredReceiptRLP + if err := rlp.DecodeBytes(blob, &stored); err != nil { + return err + } + if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil { + return err + } + r.CumulativeGasUsed = stored.CumulativeGasUsed + r.Bloom = stored.Bloom + r.TxHash = stored.TxHash + r.ContractAddress = stored.ContractAddress + r.GasUsed = stored.GasUsed + r.Logs = make([]*Log, len(stored.Logs)) + for i, log := range stored.Logs { r.Logs[i] = (*Log)(log) } - // Assign the implementation fields - r.TxHash, r.ContractAddress, r.GasUsed = dec.TxHash, dec.ContractAddress, dec.GasUsed return nil } @@ -206,3 +291,46 @@ func (r Receipts) GetRlp(i int) []byte { } return bytes } + +// DeriveFields fills the receipts with their computed fields based on consensus +// data and contextual infos like containing block and transactions. +func (r Receipts) DeriveFields(config *params.ChainConfig, hash common.Hash, number uint64, txs Transactions) error { + signer := MakeSigner(config, new(big.Int).SetUint64(number)) + + logIndex := uint(0) + if len(txs) != len(r) { + return errors.New("transaction and receipt count mismatch") + } + for i := 0; i < len(r); i++ { + // The transaction hash can be retrieved from the transaction itself + r[i].TxHash = txs[i].Hash() + + // block location fields + r[i].BlockHash = hash + r[i].BlockNumber = new(big.Int).SetUint64(number) + r[i].TransactionIndex = uint(i) + + // The contract address can be derived from the transaction itself + if txs[i].To() == nil { + // Deriving the signer is expensive, only do if it's actually needed + from, _ := Sender(signer, txs[i]) + r[i].ContractAddress = crypto.CreateAddress(from, txs[i].Nonce()) + } + // The used gas can be calculated based on previous r + if i == 0 { + r[i].GasUsed = r[i].CumulativeGasUsed + } else { + r[i].GasUsed = r[i].CumulativeGasUsed - r[i-1].CumulativeGasUsed + } + // The derived log fields can simply be set from the block and transaction + for j := 0; j < len(r[i].Logs); j++ { + r[i].Logs[j].BlockNumber = number + r[i].Logs[j].BlockHash = hash + r[i].Logs[j].TxHash = r[i].TxHash + r[i].Logs[j].TxIndex = uint(i) + r[i].Logs[j].Index = logIndex + logIndex++ + } + } + return nil +} diff --git a/core/types/receipt_test.go b/core/types/receipt_test.go new file mode 100644 index 000000000000..806b3dd2ab88 --- /dev/null +++ b/core/types/receipt_test.go @@ -0,0 +1,283 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package types + +import ( + "bytes" + "math" + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" +) + +func TestLegacyReceiptDecoding(t *testing.T) { + tests := []struct { + name string + encode func(*Receipt) ([]byte, error) + }{ + { + "StoredReceiptRLP", + encodeAsStoredReceiptRLP, + }, + { + "V4StoredReceiptRLP", + encodeAsV4StoredReceiptRLP, + }, + { + "V3StoredReceiptRLP", + encodeAsV3StoredReceiptRLP, + }, + } + + tx := NewTransaction(1, common.HexToAddress("0x1"), big.NewInt(1), 1, big.NewInt(1), nil) + receipt := &Receipt{ + Status: ReceiptStatusFailed, + CumulativeGasUsed: 1, + Logs: []*Log{ + { + Address: common.BytesToAddress([]byte{0x11}), + Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, + Data: []byte{0x01, 0x00, 0xff}, + }, + { + Address: common.BytesToAddress([]byte{0x01, 0x11}), + Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, + Data: []byte{0x01, 0x00, 0xff}, + }, + }, + TxHash: tx.Hash(), + ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), + GasUsed: 111111, + } + receipt.Bloom = CreateBloom(Receipts{receipt}) + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + enc, err := tc.encode(receipt) + if err != nil { + t.Fatalf("Error encoding receipt: %v", err) + } + var dec ReceiptForStorage + if err := rlp.DecodeBytes(enc, &dec); err != nil { + t.Fatalf("Error decoding RLP receipt: %v", err) + } + // Check whether all consensus fields are correct. + if dec.Status != receipt.Status { + t.Fatalf("Receipt status mismatch, want %v, have %v", receipt.Status, dec.Status) + } + if dec.CumulativeGasUsed != receipt.CumulativeGasUsed { + t.Fatalf("Receipt CumulativeGasUsed mismatch, want %v, have %v", receipt.CumulativeGasUsed, dec.CumulativeGasUsed) + } + if dec.Bloom != receipt.Bloom { + t.Fatalf("Bloom data mismatch, want %v, have %v", receipt.Bloom, dec.Bloom) + } + if len(dec.Logs) != len(receipt.Logs) { + t.Fatalf("Receipt log number mismatch, want %v, have %v", len(receipt.Logs), len(dec.Logs)) + } + for i := 0; i < len(dec.Logs); i++ { + if dec.Logs[i].Address != receipt.Logs[i].Address { + t.Fatalf("Receipt log %d address mismatch, want %v, have %v", i, receipt.Logs[i].Address, dec.Logs[i].Address) + } + if !reflect.DeepEqual(dec.Logs[i].Topics, receipt.Logs[i].Topics) { + t.Fatalf("Receipt log %d topics mismatch, want %v, have %v", i, receipt.Logs[i].Topics, dec.Logs[i].Topics) + } + if !bytes.Equal(dec.Logs[i].Data, receipt.Logs[i].Data) { + t.Fatalf("Receipt log %d data mismatch, want %v, have %v", i, receipt.Logs[i].Data, dec.Logs[i].Data) + } + } + }) + } +} + +func encodeAsStoredReceiptRLP(want *Receipt) ([]byte, error) { + stored := &storedReceiptRLP{ + PostStateOrStatus: want.statusEncoding(), + CumulativeGasUsed: want.CumulativeGasUsed, + Logs: make([]*LogForStorage, len(want.Logs)), + } + for i, log := range want.Logs { + stored.Logs[i] = (*LogForStorage)(log) + } + return rlp.EncodeToBytes(stored) +} + +func encodeAsV4StoredReceiptRLP(want *Receipt) ([]byte, error) { + stored := &v4StoredReceiptRLP{ + PostStateOrStatus: want.statusEncoding(), + CumulativeGasUsed: want.CumulativeGasUsed, + TxHash: want.TxHash, + ContractAddress: want.ContractAddress, + Logs: make([]*LogForStorage, len(want.Logs)), + GasUsed: want.GasUsed, + } + for i, log := range want.Logs { + stored.Logs[i] = (*LogForStorage)(log) + } + return rlp.EncodeToBytes(stored) +} + +func encodeAsV3StoredReceiptRLP(want *Receipt) ([]byte, error) { + stored := &v3StoredReceiptRLP{ + PostStateOrStatus: want.statusEncoding(), + CumulativeGasUsed: want.CumulativeGasUsed, + Bloom: want.Bloom, + TxHash: want.TxHash, + ContractAddress: want.ContractAddress, + Logs: make([]*LogForStorage, len(want.Logs)), + GasUsed: want.GasUsed, + } + for i, log := range want.Logs { + stored.Logs[i] = (*LogForStorage)(log) + } + return rlp.EncodeToBytes(stored) +} + +// Tests that receipt data can be correctly derived from the contextual infos +func TestDeriveFields(t *testing.T) { + // Create a few transactions to have receipts for + txs := Transactions{ + NewContractCreation(1, big.NewInt(1), 1, big.NewInt(1), nil), + NewTransaction(2, common.HexToAddress("0x2"), big.NewInt(2), 2, big.NewInt(2), nil), + } + // Create the corresponding receipts + receipts := Receipts{ + &Receipt{ + Status: ReceiptStatusFailed, + CumulativeGasUsed: 1, + Logs: []*Log{ + {Address: common.BytesToAddress([]byte{0x11})}, + {Address: common.BytesToAddress([]byte{0x01, 0x11})}, + }, + TxHash: txs[0].Hash(), + ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), + GasUsed: 1, + }, + &Receipt{ + PostState: common.Hash{2}.Bytes(), + CumulativeGasUsed: 3, + Logs: []*Log{ + {Address: common.BytesToAddress([]byte{0x22})}, + {Address: common.BytesToAddress([]byte{0x02, 0x22})}, + }, + TxHash: txs[1].Hash(), + ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}), + GasUsed: 2, + }, + } + // Clear all the computed fields and re-derive them + number := big.NewInt(1) + hash := common.BytesToHash([]byte{0x03, 0x14}) + + clearComputedFieldsOnReceipts(t, receipts) + if err := receipts.DeriveFields(params.TestChainConfig, hash, number.Uint64(), txs); err != nil { + t.Fatalf("DeriveFields(...) = %v, want ", err) + } + // Iterate over all the computed fields and check that they're correct + signer := MakeSigner(params.TestChainConfig, number) + + logIndex := uint(0) + for i := range receipts { + if receipts[i].TxHash != txs[i].Hash() { + t.Errorf("receipts[%d].TxHash = %s, want %s", i, receipts[i].TxHash.String(), txs[i].Hash().String()) + } + if receipts[i].BlockHash != hash { + t.Errorf("receipts[%d].BlockHash = %s, want %s", i, receipts[i].BlockHash.String(), hash.String()) + } + if receipts[i].BlockNumber.Cmp(number) != 0 { + t.Errorf("receipts[%c].BlockNumber = %s, want %s", i, receipts[i].BlockNumber.String(), number.String()) + } + if receipts[i].TransactionIndex != uint(i) { + t.Errorf("receipts[%d].TransactionIndex = %d, want %d", i, receipts[i].TransactionIndex, i) + } + if receipts[i].GasUsed != txs[i].Gas() { + t.Errorf("receipts[%d].GasUsed = %d, want %d", i, receipts[i].GasUsed, txs[i].Gas()) + } + if txs[i].To() != nil && receipts[i].ContractAddress != (common.Address{}) { + t.Errorf("receipts[%d].ContractAddress = %s, want %s", i, receipts[i].ContractAddress.String(), (common.Address{}).String()) + } + from, _ := Sender(signer, txs[i]) + contractAddress := crypto.CreateAddress(from, txs[i].Nonce()) + if txs[i].To() == nil && receipts[i].ContractAddress != contractAddress { + t.Errorf("receipts[%d].ContractAddress = %s, want %s", i, receipts[i].ContractAddress.String(), contractAddress.String()) + } + for j := range receipts[i].Logs { + if receipts[i].Logs[j].BlockNumber != number.Uint64() { + t.Errorf("receipts[%d].Logs[%d].BlockNumber = %d, want %d", i, j, receipts[i].Logs[j].BlockNumber, number.Uint64()) + } + if receipts[i].Logs[j].BlockHash != hash { + t.Errorf("receipts[%d].Logs[%d].BlockHash = %s, want %s", i, j, receipts[i].Logs[j].BlockHash.String(), hash.String()) + } + if receipts[i].Logs[j].TxHash != txs[i].Hash() { + t.Errorf("receipts[%d].Logs[%d].TxHash = %s, want %s", i, j, receipts[i].Logs[j].TxHash.String(), txs[i].Hash().String()) + } + if receipts[i].Logs[j].TxHash != txs[i].Hash() { + t.Errorf("receipts[%d].Logs[%d].TxHash = %s, want %s", i, j, receipts[i].Logs[j].TxHash.String(), txs[i].Hash().String()) + } + if receipts[i].Logs[j].TxIndex != uint(i) { + t.Errorf("receipts[%d].Logs[%d].TransactionIndex = %d, want %d", i, j, receipts[i].Logs[j].TxIndex, i) + } + if receipts[i].Logs[j].Index != logIndex { + t.Errorf("receipts[%d].Logs[%d].Index = %d, want %d", i, j, receipts[i].Logs[j].Index, logIndex) + } + logIndex++ + } + } +} + +func clearComputedFieldsOnReceipts(t *testing.T, receipts Receipts) { + t.Helper() + + for _, receipt := range receipts { + clearComputedFieldsOnReceipt(t, receipt) + } +} + +func clearComputedFieldsOnReceipt(t *testing.T, receipt *Receipt) { + t.Helper() + + receipt.TxHash = common.Hash{} + receipt.BlockHash = common.Hash{} + receipt.BlockNumber = big.NewInt(math.MaxUint32) + receipt.TransactionIndex = math.MaxUint32 + receipt.ContractAddress = common.Address{} + receipt.GasUsed = 0 + + clearComputedFieldsOnLogs(t, receipt.Logs) +} + +func clearComputedFieldsOnLogs(t *testing.T, logs []*Log) { + t.Helper() + + for _, log := range logs { + clearComputedFieldsOnLog(t, log) + } +} + +func clearComputedFieldsOnLog(t *testing.T, log *Log) { + t.Helper() + + log.BlockNumber = math.MaxUint32 + log.BlockHash = common.Hash{} + log.TxHash = common.Hash{} + log.TxIndex = math.MaxUint32 + log.Index = math.MaxUint32 +} diff --git a/core/types/transaction.go b/core/types/transaction.go index 7b53cac2c646..3eb8df0ac7c7 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -234,7 +234,7 @@ func (tx *Transaction) AsMessage(s Signer) (Message, error) { } // WithSignature returns a new transaction with the given signature. -// This signature needs to be formatted as described in the yellow paper (v+27). +// This signature needs to be in the [R || S || V] format where V is 0 or 1. func (tx *Transaction) WithSignature(signer Signer, sig []byte) (*Transaction, error) { r, s, v, err := signer.SignatureValues(tx, sig) if err != nil { @@ -252,7 +252,9 @@ func (tx *Transaction) Cost() *big.Int { return total } -func (tx *Transaction) RawSignatureValues() (*big.Int, *big.Int, *big.Int) { +// RawSignatureValues returns the V, R, S signature values of the transaction. +// The return values should not be modified by the caller. +func (tx *Transaction) RawSignatureValues() (v, r, s *big.Int) { return tx.data.V, tx.data.R, tx.data.S } diff --git a/core/types/transaction_signing.go b/core/types/transaction_signing.go index 1997755dca5c..63132048ee72 100644 --- a/core/types/transaction_signing.go +++ b/core/types/transaction_signing.go @@ -136,7 +136,7 @@ func (s EIP155Signer) Sender(tx *Transaction) (common.Address, error) { return recoverPlain(s.Hash(tx), tx.data.R, tx.data.S, V, true) } -// WithSignature returns a new transaction with the given signature. This signature +// SignatureValues returns signature values. This signature // needs to be in the [R || S || V] format where V is 0 or 1. func (s EIP155Signer) SignatureValues(tx *Transaction, sig []byte) (R, S, V *big.Int, err error) { R, S, V, err = HomesteadSigner{}.SignatureValues(tx, sig) diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go index f38d8e7177c4..7a1b6cd4d4b7 100644 --- a/core/types/transaction_test.go +++ b/core/types/transaction_test.go @@ -89,17 +89,15 @@ func TestRecipientEmpty(t *testing.T) { _, addr := defaultTestKey() tx, err := decodeTx(common.Hex2Bytes("f8498080808080011ca09b16de9d5bdee2cf56c28d16275a4da68cd30273e2525f3959f5d62557489921a0372ebd8fb3345f7db7b5a86d42e24d36e983e259b0664ceb8c227ec9af572f3d")) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } from, err := Sender(HomesteadSigner{}, tx) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } if addr != from { - t.Error("derived address doesn't match") + t.Fatal("derived address doesn't match") } } @@ -108,18 +106,15 @@ func TestRecipientNormal(t *testing.T) { tx, err := decodeTx(common.Hex2Bytes("f85d80808094000000000000000000000000000000000000000080011ca0527c0d8f5c63f7b9f41324a7c8a563ee1190bcbf0dac8ab446291bdbf32f5c79a0552c4ef0a09a04395074dab9ed34d3fbfb843c2f2546cc30fe89ec143ca94ca6")) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } from, err := Sender(HomesteadSigner{}, tx) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } - if addr != from { - t.Error("derived address doesn't match") + t.Fatal("derived address doesn't match") } } diff --git a/core/vm/analysis.go b/core/vm/analysis.go index f9c4298d3946..0ccf47b97903 100644 --- a/core/vm/analysis.go +++ b/core/vm/analysis.go @@ -16,34 +16,6 @@ package vm -import ( - "math/big" - - "github.com/ethereum/go-ethereum/common" -) - -// destinations stores one map per contract (keyed by hash of code). -// The maps contain an entry for each location of a JUMPDEST -// instruction. -type destinations map[common.Hash]bitvec - -// has checks whether code has a JUMPDEST at dest. -func (d destinations) has(codehash common.Hash, code []byte, dest *big.Int) bool { - // PC cannot go beyond len(code) and certainly can't be bigger than 63bits. - // Don't bother checking for JUMPDEST in that case. - udest := dest.Uint64() - if dest.BitLen() >= 63 || udest >= uint64(len(code)) { - return false - } - - m, analysed := d[codehash] - if !analysed { - m = codeBitmap(code) - d[codehash] = m - } - return OpCode(code[udest]) == JUMPDEST && m.codeSegment(udest) -} - // bitvec is a bit vector which maps bytes in a program. // An unset bit means the byte is an opcode, a set bit means // it's data (i.e. argument of PUSHxx). diff --git a/core/vm/analysis_test.go b/core/vm/analysis_test.go index a64f90ed9c0b..fd2d744d87f4 100644 --- a/core/vm/analysis_test.go +++ b/core/vm/analysis_test.go @@ -16,7 +16,11 @@ package vm -import "testing" +import ( + "testing" + + "github.com/ethereum/go-ethereum/crypto" +) func TestJumpDestAnalysis(t *testing.T) { tests := []struct { @@ -49,5 +53,23 @@ func TestJumpDestAnalysis(t *testing.T) { t.Fatalf("expected %x, got %02x", test.exp, ret[test.which]) } } +} +func BenchmarkJumpdestAnalysis_1200k(bench *testing.B) { + // 1.4 ms + code := make([]byte, 1200000) + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + codeBitmap(code) + } + bench.StopTimer() +} +func BenchmarkJumpdestHashing_1200k(bench *testing.B) { + // 4 ms + code := make([]byte, 1200000) + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + crypto.Keccak256Hash(code) + } + bench.StopTimer() } diff --git a/core/vm/common.go b/core/vm/common.go index 17de38decba2..d592a9410dd0 100644 --- a/core/vm/common.go +++ b/core/vm/common.go @@ -23,13 +23,31 @@ import ( "github.com/ethereum/go-ethereum/common/math" ) -// calculates the memory size required for a step -func calcMemSize(off, l *big.Int) *big.Int { - if l.Sign() == 0 { - return common.Big0 +// calcMemSize64 calculates the required memory size, and returns +// the size and whether the result overflowed uint64 +func calcMemSize64(off, l *big.Int) (uint64, bool) { + if !l.IsUint64() { + return 0, true } + return calcMemSize64WithUint(off, l.Uint64()) +} - return new(big.Int).Add(off, l) +// calcMemSize64WithUint calculates the required memory size, and returns +// the size and whether the result overflowed uint64 +// Identical to calcMemSize64, but length is a uint64 +func calcMemSize64WithUint(off *big.Int, length64 uint64) (uint64, bool) { + // if length is zero, memsize is always zero, regardless of offset + if length64 == 0 { + return 0, false + } + // Check that offset doesn't overflow + if !off.IsUint64() { + return 0, true + } + offset64 := off.Uint64() + val := offset64 + length64 + // if value < either of it's parts, then it overflowed + return val, val < offset64 } // getData returns a slice from the data based on the start and size and pads @@ -59,7 +77,7 @@ func getDataBig(data []byte, start *big.Int, size *big.Int) []byte { // bigUint64 returns the integer casted to a uint64 and returns whether it // overflowed in the process. func bigUint64(v *big.Int) (uint64, bool) { - return v.Uint64(), v.BitLen() > 64 + return v.Uint64(), !v.IsUint64() } // toWordSize returns the ceiled word size required for memory expansion. diff --git a/core/vm/contract.go b/core/vm/contract.go index 26bca689515c..20baa6e751bc 100644 --- a/core/vm/contract.go +++ b/core/vm/contract.go @@ -49,7 +49,8 @@ type Contract struct { caller ContractRef self ContractRef - jumpdests destinations // result of JUMPDEST analysis. + jumpdests map[common.Hash]bitvec // Aggregated result of JUMPDEST analysis. + analysis bitvec // Locally cached result of JUMPDEST analysis Code []byte CodeHash common.Hash @@ -58,21 +59,17 @@ type Contract struct { Gas uint64 value *big.Int - - Args []byte - - DelegateCall bool } // NewContract returns a new contract environment for the execution of EVM. func NewContract(caller ContractRef, object ContractRef, value *big.Int, gas uint64) *Contract { - c := &Contract{CallerAddress: caller.Address(), caller: caller, self: object, Args: nil} + c := &Contract{CallerAddress: caller.Address(), caller: caller, self: object} if parent, ok := caller.(*Contract); ok { // Reuse JUMPDEST analysis from parent context if available. c.jumpdests = parent.jumpdests } else { - c.jumpdests = make(destinations) + c.jumpdests = make(map[common.Hash]bitvec) } // Gas should be a pointer so it can safely be reduced through the run @@ -84,10 +81,42 @@ func NewContract(caller ContractRef, object ContractRef, value *big.Int, gas uin return c } +func (c *Contract) validJumpdest(dest *big.Int) bool { + udest := dest.Uint64() + // PC cannot go beyond len(code) and certainly can't be bigger than 63bits. + // Don't bother checking for JUMPDEST in that case. + if dest.BitLen() >= 63 || udest >= uint64(len(c.Code)) { + return false + } + // Only JUMPDESTs allowed for destinations + if OpCode(c.Code[udest]) != JUMPDEST { + return false + } + // Do we have a contract hash already? + if c.CodeHash != (common.Hash{}) { + // Does parent context have the analysis? + analysis, exist := c.jumpdests[c.CodeHash] + if !exist { + // Do the analysis and save in parent context + // We do not need to store it in c.analysis + analysis = codeBitmap(c.Code) + c.jumpdests[c.CodeHash] = analysis + } + return analysis.codeSegment(udest) + } + // We don't have the code hash, most likely a piece of initcode not already + // in state trie. In that case, we do an analysis, and save it locally, so + // we don't have to recalculate it for every JUMP instruction in the execution + // However, we don't save it within the parent context + if c.analysis == nil { + c.analysis = codeBitmap(c.Code) + } + return c.analysis.codeSegment(udest) +} + // AsDelegate sets the contract to be a delegate call and returns the current // contract (for chaining calls) func (c *Contract) AsDelegate() *Contract { - c.DelegateCall = true // NOTE: caller must, at all times be a contract. It should never happen // that caller is something other than a Contract. parent := c.caller.(*Contract) @@ -138,12 +167,6 @@ func (c *Contract) Value() *big.Int { return c.value } -// SetCode sets the code to the contract -func (c *Contract) SetCode(hash common.Hash, code []byte) { - c.Code = code - c.CodeHash = hash -} - // SetCallCode sets the code of the contract and address of the backing data // object func (c *Contract) SetCallCode(addr *common.Address, hash common.Hash, code []byte) { @@ -151,3 +174,11 @@ func (c *Contract) SetCallCode(addr *common.Address, hash common.Hash, code []by c.CodeHash = hash c.CodeAddr = addr } + +// SetCodeOptionalHash can be used to provide code, but it's optional to provide hash. +// In case hash is not provided, the jumpdest analysis will not be saved to the parent context +func (c *Contract) SetCodeOptionalHash(addr *common.Address, codeAndHash *codeAndHash) { + c.Code = codeAndHash.code + c.CodeHash = codeAndHash.hash + c.CodeAddr = addr +} diff --git a/core/vm/evm.go b/core/vm/evm.go index fc040c6216fb..d47b0093889d 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -169,6 +169,11 @@ func (evm *EVM) Cancel() { atomic.StoreInt32(&evm.abort, 1) } +// Cancelled returns true if Cancel has been called +func (evm *EVM) Cancelled() bool { + return atomic.LoadInt32(&evm.abort) == 1 +} + // Interpreter returns the current interpreter func (evm *EVM) Interpreter() Interpreter { return evm.interpreter @@ -212,12 +217,12 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas evm.StateDB.CreateAccount(addr) } evm.Transfer(evm.StateDB, caller.Address(), to.Address(), value) - // Initialise a new contract and set the code that is to be used by the EVM. // The contract is a scoped environment for this execution context only. contract := NewContract(caller, to, value, gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) + // Even if the account has no code, we need to continue because it might be a precompile start := time.Now() // Capture the tracer start/end events in debug mode @@ -267,9 +272,8 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, snapshot = evm.StateDB.Snapshot() to = AccountRef(caller.Address()) ) - // initialise a new contract and set the code that is to be used by the - // EVM. The contract is a scoped environment for this execution context - // only. + // Initialise a new contract and set the code that is to be used by the EVM. + // The contract is a scoped environment for this execution context only. contract := NewContract(caller, to, value, gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) @@ -333,12 +337,17 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte to = AccountRef(addr) snapshot = evm.StateDB.Snapshot() ) - // Initialise a new contract and set the code that is to be used by the - // EVM. The contract is a scoped environment for this execution context - // only. + // Initialise a new contract and set the code that is to be used by the EVM. + // The contract is a scoped environment for this execution context only. contract := NewContract(caller, to, new(big.Int), gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) + // We do an AddBalance of zero here, just in order to trigger a touch. + // This doesn't matter on Mainnet, where all empties are gone at the time of Byzantium, + // but is the correct thing to do and matters on other networks, in tests, and potential + // future scenarios + evm.StateDB.AddBalance(addr, bigZero) + // When an error was returned by the EVM or when setting the creation code // above we revert to the snapshot and consume any gas remaining. Additionally // when we're in Homestead this also counts for code storage gas errors. @@ -352,8 +361,20 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte return ret, contract.Gas, err } +type codeAndHash struct { + code []byte + hash common.Hash +} + +func (c *codeAndHash) Hash() common.Hash { + if c.hash == (common.Hash{}) { + c.hash = crypto.Keccak256Hash(c.code) + } + return c.hash +} + // create creates a new contract using code as deployment code. -func (evm *EVM) create(caller ContractRef, code []byte, gas uint64, value *big.Int, address common.Address) ([]byte, common.Address, uint64, error) { +func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, value *big.Int, address common.Address) ([]byte, common.Address, uint64, error) { // Depth check execution. Fail if we're trying to execute above the // limit. if evm.depth > int(params.CallCreateDepth) { @@ -378,18 +399,17 @@ func (evm *EVM) create(caller ContractRef, code []byte, gas uint64, value *big.I } evm.Transfer(evm.StateDB, caller.Address(), address, value) - // initialise a new contract and set the code that is to be used by the - // EVM. The contract is a scoped environment for this execution context - // only. + // Initialise a new contract and set the code that is to be used by the EVM. + // The contract is a scoped environment for this execution context only. contract := NewContract(caller, AccountRef(address), value, gas) - contract.SetCallCode(&address, crypto.Keccak256Hash(code), code) + contract.SetCodeOptionalHash(&address, codeAndHash) if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, address, gas, nil } if evm.vmConfig.Debug && evm.depth == 0 { - evm.vmConfig.Tracer.CaptureStart(caller.Address(), address, true, code, gas, value) + evm.vmConfig.Tracer.CaptureStart(caller.Address(), address, true, codeAndHash.code, gas, value) } start := time.Now() @@ -433,7 +453,7 @@ func (evm *EVM) create(caller ContractRef, code []byte, gas uint64, value *big.I // Create creates a new contract using code as deployment code. func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { contractAddr = crypto.CreateAddress(caller.Address(), evm.StateDB.GetNonce(caller.Address())) - return evm.create(caller, code, gas, value, contractAddr) + return evm.create(caller, &codeAndHash{code: code}, gas, value, contractAddr) } // Create2 creates a new contract using code as deployment code. @@ -441,8 +461,9 @@ func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.I // The different between Create2 with Create is Create2 uses sha3(0xff ++ msg.sender ++ salt ++ sha3(init_code))[12:] // instead of the usual sender-and-nonce-hash as the address where the contract is initialized at. func (evm *EVM) Create2(caller ContractRef, code []byte, gas uint64, endowment *big.Int, salt *big.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { - contractAddr = crypto.CreateAddress2(caller.Address(), common.BigToHash(salt), code) - return evm.create(caller, code, gas, endowment, contractAddr) + codeAndHash := &codeAndHash{code: code} + contractAddr = crypto.CreateAddress2(caller.Address(), common.BigToHash(salt), codeAndHash.Hash().Bytes()) + return evm.create(caller, codeAndHash, gas, endowment, contractAddr) } // ChainConfig returns the environment's chain configuration diff --git a/core/vm/gas.go b/core/vm/gas.go index bba7058c7e23..022a84f243c9 100644 --- a/core/vm/gas.go +++ b/core/vm/gas.go @@ -30,10 +30,6 @@ const ( GasMidStep uint64 = 8 GasSlowStep uint64 = 10 GasExtStep uint64 = 20 - - GasReturn uint64 = 0 - GasStop uint64 = 0 - GasContractByte uint64 = 200 ) // calcGas returns the actual gas cost of the call. @@ -47,11 +43,11 @@ func callGas(gasTable params.GasTable, availableGas, base uint64, callCost *big. // If the bit length exceeds 64 bit we know that the newly calculated "gas" for EIP150 // is smaller than the requested amount. Therefor we return the new gas instead // of returning an error. - if callCost.BitLen() > 64 || gas < callCost.Uint64() { + if !callCost.IsUint64() || gas < callCost.Uint64() { return gas, nil } } - if callCost.BitLen() > 64 { + if !callCost.IsUint64() { return 0, errGasUintOverflow } diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index 10b4f719a7fb..8270300ba71d 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -22,24 +22,20 @@ import ( "github.com/ethereum/go-ethereum/params" ) -// memoryGasCosts calculates the quadratic gas for memory expansion. It does so +// memoryGasCost calculates the quadratic gas for memory expansion. It does so // only for the memory region that is expanded, not the total memory. func memoryGasCost(mem *Memory, newMemSize uint64) (uint64, error) { - if newMemSize == 0 { return 0, nil } - // The maximum that will fit in a uint64 is max_word_count - 1 - // anything above that will result in an overflow. - // Additionally, a newMemSize which results in a - // newMemSizeWords larger than 0x7ffffffff will cause the square operation - // to overflow. - // The constant 0xffffffffe0 is the highest number that can be used without - // overflowing the gas calculation - if newMemSize > 0xffffffffe0 { + // The maximum that will fit in a uint64 is max_word_count - 1. Anything above + // that will result in an overflow. Additionally, a newMemSize which results in + // a newMemSizeWords larger than 0xFFFFFFFF will cause the square operation to + // overflow. The constant 0x1FFFFFFFE0 is the highest number that can be used + // without overflowing the gas calculation. + if newMemSize > 0x1FFFFFFFE0 { return 0, errGasUintOverflow } - newMemSizeWords := toWordSize(newMemSize) newMemSize = newMemSizeWords * 32 @@ -57,12 +53,6 @@ func memoryGasCost(mem *Memory, newMemSize uint64) (uint64, error) { return 0, nil } -func constGasFunc(gas uint64) gasFunc { - return func(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return gas, nil - } -} - func gasCallDataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { @@ -121,7 +111,9 @@ func gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, m current = evm.StateDB.GetState(contract.Address(), common.BigToHash(x)) ) // The legacy gas metering only takes into consideration the current state - if !evm.chainRules.IsConstantinople { + // Legacy rules should be applied if we are in Petersburg (removal of EIP-1283) + // OR Constantinople is not active + if evm.chainRules.IsPetersburg || !evm.chainRules.IsConstantinople { // This checks for 3 scenario's and calculates gas accordingly: // // 1. From a zero-value address to a non-zero value (NEW VALUE) @@ -347,6 +339,17 @@ func gasCreate2(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, if gas, overflow = math.SafeAdd(gas, params.Create2Gas); overflow { return 0, errGasUintOverflow } + wordGas, overflow := bigUint64(stack.Back(2)) + if overflow { + return 0, errGasUintOverflow + } + if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Sha3WordGas); overflow { + return 0, errGasUintOverflow + } + if gas, overflow = math.SafeAdd(gas, wordGas); overflow { + return 0, errGasUintOverflow + } + return gas, nil } @@ -369,7 +372,7 @@ func gasExp(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem gas = expByteLen * gt.ExpByte // no overflow check required. Max is 256 * ExpByte gas overflow bool ) - if gas, overflow = math.SafeAdd(gas, GasSlowStep); overflow { + if gas, overflow = math.SafeAdd(gas, params.ExpGas); overflow { return 0, errGasUintOverflow } return gas, nil @@ -508,15 +511,3 @@ func gasStaticCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stac } return gas, nil } - -func gasPush(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return GasFastestStep, nil -} - -func gasSwap(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return GasFastestStep, nil -} - -func gasDup(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return GasFastestStep, nil -} diff --git a/core/vm/gas_table_test.go b/core/vm/gas_table_test.go index 1b91aee56c66..2c1e11894fdd 100644 --- a/core/vm/gas_table_test.go +++ b/core/vm/gas_table_test.go @@ -19,18 +19,21 @@ package vm import "testing" func TestMemoryGasCost(t *testing.T) { - //size := uint64(math.MaxUint64 - 64) - size := uint64(0xffffffffe0) - v, err := memoryGasCost(&Memory{}, size) - if err != nil { - t.Error("didn't expect error:", err) + tests := []struct { + size uint64 + cost uint64 + overflow bool + }{ + {0x1fffffffe0, 36028809887088637, false}, + {0x1fffffffe1, 0, true}, } - if v != 36028899963961341 { - t.Errorf("Expected: 36028899963961341, got %d", v) - } - - _, err = memoryGasCost(&Memory{}, size+1) - if err == nil { - t.Error("expected error") + for i, tt := range tests { + v, err := memoryGasCost(&Memory{}, tt.size) + if (err == errGasUintOverflow) != tt.overflow { + t.Errorf("test %d: overflow mismatch: have %v, want %v", i, err == errGasUintOverflow, tt.overflow) + } + if v != tt.cost { + t.Errorf("test %d: gas cost mismatch: have %v, want %v", i, v, tt.cost) + } } } diff --git a/core/vm/gen_structlog.go b/core/vm/gen_structlog.go index ade3ca6318dc..726012e59ecf 100644 --- a/core/vm/gen_structlog.go +++ b/core/vm/gen_structlog.go @@ -13,20 +13,22 @@ import ( var _ = (*structLogMarshaling)(nil) +// MarshalJSON marshals as JSON. func (s StructLog) MarshalJSON() ([]byte, error) { type StructLog struct { - Pc uint64 `json:"pc"` - Op OpCode `json:"op"` - Gas math.HexOrDecimal64 `json:"gas"` - GasCost math.HexOrDecimal64 `json:"gasCost"` - Memory hexutil.Bytes `json:"memory"` - MemorySize int `json:"memSize"` - Stack []*math.HexOrDecimal256 `json:"stack"` - Storage map[common.Hash]common.Hash `json:"-"` - Depth int `json:"depth"` - Err error `json:"-"` - OpName string `json:"opName"` - ErrorString string `json:"error"` + Pc uint64 `json:"pc"` + Op OpCode `json:"op"` + Gas math.HexOrDecimal64 `json:"gas"` + GasCost math.HexOrDecimal64 `json:"gasCost"` + Memory hexutil.Bytes `json:"memory"` + MemorySize int `json:"memSize"` + Stack []*math.HexOrDecimal256 `json:"stack"` + Storage map[common.Hash]common.Hash `json:"-"` + Depth int `json:"depth"` + RefundCounter uint64 `json:"refund"` + Err error `json:"-"` + OpName string `json:"opName"` + ErrorString string `json:"error"` } var enc StructLog enc.Pc = s.Pc @@ -43,24 +45,27 @@ func (s StructLog) MarshalJSON() ([]byte, error) { } enc.Storage = s.Storage enc.Depth = s.Depth + enc.RefundCounter = s.RefundCounter enc.Err = s.Err enc.OpName = s.OpName() enc.ErrorString = s.ErrorString() return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (s *StructLog) UnmarshalJSON(input []byte) error { type StructLog struct { - Pc *uint64 `json:"pc"` - Op *OpCode `json:"op"` - Gas *math.HexOrDecimal64 `json:"gas"` - GasCost *math.HexOrDecimal64 `json:"gasCost"` - Memory *hexutil.Bytes `json:"memory"` - MemorySize *int `json:"memSize"` - Stack []*math.HexOrDecimal256 `json:"stack"` - Storage map[common.Hash]common.Hash `json:"-"` - Depth *int `json:"depth"` - Err error `json:"-"` + Pc *uint64 `json:"pc"` + Op *OpCode `json:"op"` + Gas *math.HexOrDecimal64 `json:"gas"` + GasCost *math.HexOrDecimal64 `json:"gasCost"` + Memory *hexutil.Bytes `json:"memory"` + MemorySize *int `json:"memSize"` + Stack []*math.HexOrDecimal256 `json:"stack"` + Storage map[common.Hash]common.Hash `json:"-"` + Depth *int `json:"depth"` + RefundCounter *uint64 `json:"refund"` + Err error `json:"-"` } var dec StructLog if err := json.Unmarshal(input, &dec); err != nil { @@ -96,6 +101,9 @@ func (s *StructLog) UnmarshalJSON(input []byte) error { if dec.Depth != nil { s.Depth = *dec.Depth } + if dec.RefundCounter != nil { + s.RefundCounter = *dec.RefundCounter + } if dec.Err != nil { s.Err = dec.Err } diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 4d1bd4a34286..2a062d7e772f 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -18,14 +18,13 @@ package vm import ( "errors" - "fmt" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" + "golang.org/x/crypto/sha3" ) var ( @@ -35,6 +34,7 @@ var ( errReturnDataOutOfBounds = errors.New("evm: return data out of bounds") errExecutionReverted = errors.New("evm: execution reverted") errMaxCodeSizeExceeded = errors.New("evm: max code size exceeded") + errInvalidJump = errors.New("evm: invalid jump destination") ) func opAdd(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { @@ -124,10 +124,22 @@ func opSmod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory func opExp(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { base, exponent := stack.pop(), stack.pop() - stack.push(math.Exp(base, exponent)) - - interpreter.intPool.put(base, exponent) - + // some shortcuts + cmpToOne := exponent.Cmp(big1) + if cmpToOne < 0 { // Exponent is zero + // x ^ 0 == 1 + stack.push(base.SetUint64(1)) + } else if base.Sign() == 0 { + // 0 ^ y, if y != 0, == 0 + stack.push(base.SetUint64(0)) + } else if cmpToOne == 0 { // Exponent is one + // x ^ 1 == x + stack.push(base) + } else { + stack.push(math.Exp(base, exponent)) + interpreter.intPool.put(base) + } + interpreter.intPool.put(exponent) return nil, nil } @@ -373,20 +385,27 @@ func opSAR(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory * func opSha3(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { offset, size := stack.pop(), stack.pop() data := memory.Get(offset.Int64(), size.Int64()) - hash := crypto.Keccak256(data) - evm := interpreter.evm + if interpreter.hasher == nil { + interpreter.hasher = sha3.NewLegacyKeccak256().(keccakState) + } else { + interpreter.hasher.Reset() + } + interpreter.hasher.Write(data) + interpreter.hasher.Read(interpreter.hasherBuf[:]) + + evm := interpreter.evm if evm.vmConfig.EnablePreimageRecording { - evm.StateDB.AddPreimage(common.BytesToHash(hash), data) + evm.StateDB.AddPreimage(interpreter.hasherBuf, data) } - stack.push(interpreter.intPool.get().SetBytes(hash)) + stack.push(interpreter.intPool.get().SetBytes(interpreter.hasherBuf[:])) interpreter.intPool.put(offset, size) return nil, nil } func opAddress(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - stack.push(contract.Address().Big()) + stack.push(interpreter.intPool.get().SetBytes(contract.Address().Bytes())) return nil, nil } @@ -397,12 +416,12 @@ func opBalance(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memo } func opOrigin(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - stack.push(interpreter.evm.Origin.Big()) + stack.push(interpreter.intPool.get().SetBytes(interpreter.evm.Origin.Bytes())) return nil, nil } func opCaller(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - stack.push(contract.Caller().Big()) + stack.push(interpreter.intPool.get().SetBytes(contract.Caller().Bytes())) return nil, nil } @@ -448,7 +467,7 @@ func opReturnDataCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contrac ) defer interpreter.intPool.put(memOffset, dataOffset, length, end) - if end.BitLen() > 64 || uint64(len(interpreter.returnData)) < end.Uint64() { + if !end.IsUint64() || uint64(len(interpreter.returnData)) < end.Uint64() { return nil, errReturnDataOutOfBounds } memory.Set(memOffset.Uint64(), length.Uint64(), interpreter.returnData[dataOffset.Uint64():end.Uint64()]) @@ -525,7 +544,12 @@ func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contract, // this account should be regarded as a non-existent account and zero should be returned. func opExtCodeHash(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { slot := stack.peek() - slot.SetBytes(interpreter.evm.StateDB.GetCodeHash(common.BigToAddress(slot)).Bytes()) + address := common.BigToAddress(slot) + if interpreter.evm.StateDB.Empty(address) { + slot.SetUint64(0) + } else { + slot.SetBytes(interpreter.evm.StateDB.GetCodeHash(address).Bytes()) + } return nil, nil } @@ -548,7 +572,7 @@ func opBlockhash(pc *uint64, interpreter *EVMInterpreter, contract *Contract, me } func opCoinbase(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - stack.push(interpreter.evm.Coinbase.Big()) + stack.push(interpreter.intPool.get().SetBytes(interpreter.evm.Coinbase.Bytes())) return nil, nil } @@ -620,9 +644,8 @@ func opSstore(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memor func opJump(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { pos := stack.pop() - if !contract.jumpdests.has(contract.CodeHash, contract.Code, pos) { - nop := contract.GetOp(pos.Uint64()) - return nil, fmt.Errorf("invalid jump destination (%v) %v", nop, pos) + if !contract.validJumpdest(pos) { + return nil, errInvalidJump } *pc = pos.Uint64() @@ -633,9 +656,8 @@ func opJump(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory func opJumpi(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { pos, cond := stack.pop(), stack.pop() if cond.Sign() != 0 { - if !contract.jumpdests.has(contract.CodeHash, contract.Code, pos) { - nop := contract.GetOp(pos.Uint64()) - return nil, fmt.Errorf("invalid jump destination (%v) %v", nop, pos) + if !contract.validJumpdest(pos) { + return nil, errInvalidJump } *pc = pos.Uint64() } else { @@ -687,7 +709,7 @@ func opCreate(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memor } else if suberr != nil && suberr != ErrCodeStoreOutOfGas { stack.push(interpreter.intPool.getZero()) } else { - stack.push(addr.Big()) + stack.push(interpreter.intPool.get().SetBytes(addr.Bytes())) } contract.Gas += returnGas interpreter.intPool.put(value, offset, size) @@ -715,7 +737,7 @@ func opCreate2(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memo if suberr != nil { stack.push(interpreter.intPool.getZero()) } else { - stack.push(addr.Big()) + stack.push(interpreter.intPool.get().SetBytes(addr.Bytes())) } contract.Gas += returnGas interpreter.intPool.put(endowment, offset, size, salt) @@ -888,6 +910,21 @@ func makeLog(size int) executionFunc { } } +// opPush1 is a specialized version of pushN +func opPush1(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + var ( + codeLen = uint64(len(contract.Code)) + integer = interpreter.intPool.get() + ) + *pc += 1 + if *pc < codeLen { + stack.push(integer.SetUint64(uint64(contract.Code[*pc]))) + } else { + stack.push(integer.SetUint64(0)) + } + return nil, nil +} + // make push instruction function func makePush(size uint64, pushByteSize int) executionFunc { return func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { diff --git a/core/vm/instructions_test.go b/core/vm/instructions_test.go index 48caadf1f16b..50d0a9ddae30 100644 --- a/core/vm/instructions_test.go +++ b/core/vm/instructions_test.go @@ -17,39 +17,103 @@ package vm import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" "math/big" "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" ) -type twoOperandTest struct { - x string - y string - expected string +type TwoOperandTestcase struct { + X string + Y string + Expected string } -func testTwoOperandOp(t *testing.T, tests []twoOperandTest, opFn func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error)) { +type twoOperandParams struct { + x string + y string +} + +var commonParams []*twoOperandParams +var twoOpMethods map[string]executionFunc + +func init() { + + // Params is a list of common edgecases that should be used for some common tests + params := []string{ + "0000000000000000000000000000000000000000000000000000000000000000", // 0 + "0000000000000000000000000000000000000000000000000000000000000001", // +1 + "0000000000000000000000000000000000000000000000000000000000000005", // +5 + "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", // + max -1 + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // + max + "8000000000000000000000000000000000000000000000000000000000000000", // - max + "8000000000000000000000000000000000000000000000000000000000000001", // - max+1 + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", // - 5 + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // - 1 + } + // Params are combined so each param is used on each 'side' + commonParams = make([]*twoOperandParams, len(params)*len(params)) + for i, x := range params { + for j, y := range params { + commonParams[i*len(params)+j] = &twoOperandParams{x, y} + } + } + twoOpMethods = map[string]executionFunc{ + "add": opAdd, + "sub": opSub, + "mul": opMul, + "div": opDiv, + "sdiv": opSdiv, + "mod": opMod, + "smod": opSmod, + "exp": opExp, + "signext": opSignExtend, + "lt": opLt, + "gt": opGt, + "slt": opSlt, + "sgt": opSgt, + "eq": opEq, + "and": opAnd, + "or": opOr, + "xor": opXor, + "byte": opByte, + "shl": opSHL, + "shr": opSHR, + "sar": opSAR, + } +} + +func testTwoOperandOp(t *testing.T, tests []TwoOperandTestcase, opFn executionFunc, name string) { + var ( env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) stack = newstack() pc = uint64(0) - evmInterpreter = NewEVMInterpreter(env, env.vmConfig) + evmInterpreter = env.interpreter.(*EVMInterpreter) ) - - env.interpreter = evmInterpreter + // Stuff a couple of nonzero bigints into pool, to ensure that ops do not rely on pooled integers to be zero evmInterpreter.intPool = poolOfIntPools.get() + evmInterpreter.intPool.put(big.NewInt(-1337)) + evmInterpreter.intPool.put(big.NewInt(-1337)) + evmInterpreter.intPool.put(big.NewInt(-1337)) + for i, test := range tests { - x := new(big.Int).SetBytes(common.Hex2Bytes(test.x)) - shift := new(big.Int).SetBytes(common.Hex2Bytes(test.y)) - expected := new(big.Int).SetBytes(common.Hex2Bytes(test.expected)) + x := new(big.Int).SetBytes(common.Hex2Bytes(test.X)) + y := new(big.Int).SetBytes(common.Hex2Bytes(test.Y)) + expected := new(big.Int).SetBytes(common.Hex2Bytes(test.Expected)) stack.push(x) - stack.push(shift) + stack.push(y) opFn(&pc, evmInterpreter, nil, nil, stack) actual := stack.pop() + if actual.Cmp(expected) != 0 { - t.Errorf("Testcase %d, expected %v, got %v", i, expected, actual) + t.Errorf("Testcase %v %d, %v(%x, %x): expected %x, got %x", name, i, name, x, y, expected, actual) } // Check pool usage // 1.pool is not allowed to contain anything on the stack @@ -62,7 +126,7 @@ func testTwoOperandOp(t *testing.T, tests []twoOperandTest, opFn func(pc *uint64 for evmInterpreter.intPool.pool.len() > 0 { key := evmInterpreter.intPool.get() if _, exist := poolvals[key]; exist { - t.Errorf("Testcase %d, pool contains double-entry", i) + t.Errorf("Testcase %v %d, pool contains double-entry", name, i) } poolvals[key] = struct{}{} } @@ -72,47 +136,22 @@ func testTwoOperandOp(t *testing.T, tests []twoOperandTest, opFn func(pc *uint64 } func TestByteOp(t *testing.T) { - var ( - env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) - stack = newstack() - evmInterpreter = NewEVMInterpreter(env, env.vmConfig) - ) - - env.interpreter = evmInterpreter - evmInterpreter.intPool = poolOfIntPools.get() - tests := []struct { - v string - th uint64 - expected *big.Int - }{ - {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 0, big.NewInt(0xAB)}, - {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 1, big.NewInt(0xCD)}, - {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 0, big.NewInt(0x00)}, - {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 1, big.NewInt(0xCD)}, - {"0000000000000000000000000000000000000000000000000000000000102030", 31, big.NewInt(0x30)}, - {"0000000000000000000000000000000000000000000000000000000000102030", 30, big.NewInt(0x20)}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 32, big.NewInt(0x0)}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 0xFFFFFFFFFFFFFFFF, big.NewInt(0x0)}, + tests := []TwoOperandTestcase{ + {"ABCDEF0908070605040302010000000000000000000000000000000000000000", "00", "AB"}, + {"ABCDEF0908070605040302010000000000000000000000000000000000000000", "01", "CD"}, + {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", "00", "00"}, + {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", "01", "CD"}, + {"0000000000000000000000000000000000000000000000000000000000102030", "1F", "30"}, + {"0000000000000000000000000000000000000000000000000000000000102030", "1E", "20"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "20", "00"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "FFFFFFFFFFFFFFFF", "00"}, } - pc := uint64(0) - for _, test := range tests { - val := new(big.Int).SetBytes(common.Hex2Bytes(test.v)) - th := new(big.Int).SetUint64(test.th) - stack.push(val) - stack.push(th) - opByte(&pc, evmInterpreter, nil, nil, stack) - actual := stack.pop() - if actual.Cmp(test.expected) != 0 { - t.Fatalf("Expected [%v] %v:th byte to be %v, was %v.", test.v, test.th, test.expected, actual) - } - } - poolOfIntPools.put(evmInterpreter.intPool) + testTwoOperandOp(t, tests, opByte, "byte") } func TestSHL(t *testing.T) { // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shl-shift-left - tests := []twoOperandTest{ - {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, + tests := []TwoOperandTestcase{ {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000002"}, {"0000000000000000000000000000000000000000000000000000000000000001", "ff", "8000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000001", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, @@ -124,12 +163,12 @@ func TestSHL(t *testing.T) { {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}, } - testTwoOperandOp(t, tests, opSHL) + testTwoOperandOp(t, tests, opSHL, "shl") } func TestSHR(t *testing.T) { // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shr-logical-shift-right - tests := []twoOperandTest{ + tests := []TwoOperandTestcase{ {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000000", "01", "4000000000000000000000000000000000000000000000000000000000000000"}, @@ -142,12 +181,12 @@ func TestSHR(t *testing.T) { {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, } - testTwoOperandOp(t, tests, opSHR) + testTwoOperandOp(t, tests, opSHR, "shr") } func TestSAR(t *testing.T) { // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#sar-arithmetic-shift-right - tests := []twoOperandTest{ + tests := []TwoOperandTestcase{ {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000000", "01", "c000000000000000000000000000000000000000000000000000000000000000"}, @@ -166,44 +205,58 @@ func TestSAR(t *testing.T) { {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, } - testTwoOperandOp(t, tests, opSAR) + testTwoOperandOp(t, tests, opSAR, "sar") } -func TestSGT(t *testing.T) { - tests := []twoOperandTest{ +// getResult is a convenience function to generate the expected values +func getResult(args []*twoOperandParams, opFn executionFunc) []TwoOperandTestcase { + var ( + env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) + stack = newstack() + pc = uint64(0) + interpreter = env.interpreter.(*EVMInterpreter) + ) + interpreter.intPool = poolOfIntPools.get() + result := make([]TwoOperandTestcase, len(args)) + for i, param := range args { + x := new(big.Int).SetBytes(common.Hex2Bytes(param.x)) + y := new(big.Int).SetBytes(common.Hex2Bytes(param.y)) + stack.push(x) + stack.push(y) + opFn(&pc, interpreter, nil, nil, stack) + actual := stack.pop() + result[i] = TwoOperandTestcase{param.x, param.y, fmt.Sprintf("%064x", actual)} + } + return result +} - {"0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"8000000000000000000000000000000000000000000000000000000000000001", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"8000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "0000000000000000000000000000000000000000000000000000000000000000"}, +// utility function to fill the json-file with testcases +// Enable this test to generate the 'testcases_xx.json' files +func xTestWriteExpectedValues(t *testing.T) { + for name, method := range twoOpMethods { + data, err := json.Marshal(getResult(commonParams, method)) + if err != nil { + t.Fatal(err) + } + _ = ioutil.WriteFile(fmt.Sprintf("testdata/testcases_%v.json", name), data, 0644) + if err != nil { + t.Fatal(err) + } } - testTwoOperandOp(t, tests, opSgt) -} - -func TestSLT(t *testing.T) { - tests := []twoOperandTest{ - {"0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"8000000000000000000000000000000000000000000000000000000000000001", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"8000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "0000000000000000000000000000000000000000000000000000000000000001"}, + t.Fatal("This test should not be activated") +} + +// TestJsonTestcases runs through all the testcases defined as json-files +func TestJsonTestcases(t *testing.T) { + for name := range twoOpMethods { + data, err := ioutil.ReadFile(fmt.Sprintf("testdata/testcases_%v.json", name)) + if err != nil { + t.Fatal("Failed to read file", err) + } + var testcases []TwoOperandTestcase + json.Unmarshal(data, &testcases) + testTwoOperandOp(t, testcases, twoOpMethods[name], name) } - testTwoOperandOp(t, tests, opSlt) } func opBenchmark(bench *testing.B, op func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error), args ...string) { @@ -489,3 +542,99 @@ func BenchmarkOpMstore(bench *testing.B) { } poolOfIntPools.put(evmInterpreter.intPool) } + +func BenchmarkOpSHA3(bench *testing.B) { + var ( + env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) + stack = newstack() + mem = NewMemory() + evmInterpreter = NewEVMInterpreter(env, env.vmConfig) + ) + env.interpreter = evmInterpreter + evmInterpreter.intPool = poolOfIntPools.get() + mem.Resize(32) + pc := uint64(0) + start := big.NewInt(0) + + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + stack.pushN(big.NewInt(32), start) + opSha3(&pc, evmInterpreter, nil, mem, stack) + } + poolOfIntPools.put(evmInterpreter.intPool) +} + +func TestCreate2Addreses(t *testing.T) { + type testcase struct { + origin string + salt string + code string + expected string + } + + for i, tt := range []testcase{ + { + origin: "0x0000000000000000000000000000000000000000", + salt: "0x0000000000000000000000000000000000000000", + code: "0x00", + expected: "0x4d1a2e2bb4f88f0250f26ffff098b0b30b26bf38", + }, + { + origin: "0xdeadbeef00000000000000000000000000000000", + salt: "0x0000000000000000000000000000000000000000", + code: "0x00", + expected: "0xB928f69Bb1D91Cd65274e3c79d8986362984fDA3", + }, + { + origin: "0xdeadbeef00000000000000000000000000000000", + salt: "0xfeed000000000000000000000000000000000000", + code: "0x00", + expected: "0xD04116cDd17beBE565EB2422F2497E06cC1C9833", + }, + { + origin: "0x0000000000000000000000000000000000000000", + salt: "0x0000000000000000000000000000000000000000", + code: "0xdeadbeef", + expected: "0x70f2b2914A2a4b783FaEFb75f459A580616Fcb5e", + }, + { + origin: "0x00000000000000000000000000000000deadbeef", + salt: "0xcafebabe", + code: "0xdeadbeef", + expected: "0x60f3f640a8508fC6a86d45DF051962668E1e8AC7", + }, + { + origin: "0x00000000000000000000000000000000deadbeef", + salt: "0xcafebabe", + code: "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + expected: "0x1d8bfDC5D46DC4f61D6b6115972536eBE6A8854C", + }, + { + origin: "0x0000000000000000000000000000000000000000", + salt: "0x0000000000000000000000000000000000000000", + code: "0x", + expected: "0xE33C0C7F7df4809055C3ebA6c09CFe4BaF1BD9e0", + }, + } { + + origin := common.BytesToAddress(common.FromHex(tt.origin)) + salt := common.BytesToHash(common.FromHex(tt.salt)) + code := common.FromHex(tt.code) + codeHash := crypto.Keccak256(code) + address := crypto.CreateAddress2(origin, salt, codeHash) + /* + stack := newstack() + // salt, but we don't need that for this test + stack.push(big.NewInt(int64(len(code)))) //size + stack.push(big.NewInt(0)) // memstart + stack.push(big.NewInt(0)) // value + gas, _ := gasCreate2(params.GasTable{}, nil, nil, stack, nil, 0) + fmt.Printf("Example %d\n* address `0x%x`\n* salt `0x%x`\n* init_code `0x%x`\n* gas (assuming no mem expansion): `%v`\n* result: `%s`\n\n", i,origin, salt, code, gas, address.String()) + */ + expected := common.BytesToAddress(common.FromHex(tt.expected)) + if !bytes.Equal(expected.Bytes(), address.Bytes()) { + t.Errorf("test %d: expected %s, got %s", i, expected.String(), address.String()) + } + + } +} diff --git a/core/vm/interface.go b/core/vm/interface.go index d6d4e917d647..77355f6d9c8f 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -17,19 +17,18 @@ package vm import ( + "github.com/ethereum/go-ethereum/core/state" "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" ) // StateDB is an EVM database for full state querying. type StateDB interface { - CreateAccount(common.Address) - - RawDump() state.Dump + RawDump(bool,bool,bool) state.Dump + CreateAccount(common.Address) SubBalance(common.Address, *big.Int) AddBalance(common.Address, *big.Int) GetBalance(common.Address) *big.Int @@ -66,7 +65,7 @@ type StateDB interface { AddLog(*types.Log) AddPreimage(common.Hash, []byte) - ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) + ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error } // CallContext provides a basic interface for the EVM calling conventions. The EVM diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 8e934f60e8bb..989f85f5d31b 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -18,32 +18,25 @@ package vm import ( "fmt" + "hash" "sync/atomic" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/params" ) // Config are the configuration options for the Interpreter type Config struct { - // Debug enabled debugging Interpreter options - Debug bool - // Tracer is the op code logger - Tracer Tracer - // NoRecursion disabled Interpreter call, callcode, - // delegate call and create. - NoRecursion bool - // Enable recording of SHA3/keccak preimages - EnablePreimageRecording bool - // JumpTable contains the EVM instruction table. This - // may be left uninitialised and will be set to the default - // table. - JumpTable [256]operation + Debug bool // Enables debugging + Tracer Tracer // Opcode logger + NoRecursion bool // Disables call, callcode, delegate call and create + EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages - // Type of the EWASM interpreter - EWASMInterpreter string - // Type of the EVM interpreter - EVMInterpreter string + JumpTable [256]operation // EVM instruction table, automatically populated if unset + + EWASMInterpreter string // External EWASM interpreter options + EVMInterpreter string // External EVM interpreter options } // Interpreter is used to run Ethereum based contracts and will utilise the @@ -68,12 +61,24 @@ type Interpreter interface { CanRun([]byte) bool } +// keccakState wraps sha3.state. In addition to the usual hash methods, it also supports +// Read to get a variable amount of data from the hash state. Read is faster than Sum +// because it doesn't copy the internal state, but also modifies the internal state. +type keccakState interface { + hash.Hash + Read([]byte) (int, error) +} + // EVMInterpreter represents an EVM interpreter type EVMInterpreter struct { evm *EVM cfg Config gasTable params.GasTable - intPool *intPool + + intPool *intPool + + hasher keccakState // Keccak256 hasher instance shared across opcodes + hasherBuf common.Hash // Keccak256 hasher result array shared aross opcodes readOnly bool // Whether to throw on stateful modifications returnData []byte // Last CALL's return data for subsequent reuse @@ -104,22 +109,6 @@ func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { } } -func (in *EVMInterpreter) enforceRestrictions(op OpCode, operation operation, stack *Stack) error { - if in.evm.chainRules.IsByzantium { - if in.readOnly { - // If the interpreter is operating in readonly mode, make sure no - // state-modifying operation is performed. The 3rd stack item - // for a call operation is the value. Transferring value from one - // account to the others means the state is modified and should also - // return with an error. - if operation.writes || (op == CALL && stack.Back(2).BitLen() > 0) { - return errWriteProtection - } - } - } - return nil -} - // Run loops and evaluates the contract's code with the given input data and returns // the return byte-slice and an error if one occurred. // @@ -168,6 +157,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( pcCopy uint64 // needed for the deferred Tracer gasCopy uint64 // for Tracer to log gas remaining before execution logged bool // deferred Tracer should ignore already logged steps + res []byte // result of the opcode execution function ) contract.Input = input @@ -202,19 +192,35 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( if !operation.valid { return nil, fmt.Errorf("invalid opcode 0x%x", int(op)) } - if err := operation.validateStack(stack); err != nil { - return nil, err + // Validate stack + if sLen := stack.len(); sLen < operation.minStack { + return nil, fmt.Errorf("stack underflow (%d <=> %d)", sLen, operation.minStack) + } else if sLen > operation.maxStack { + return nil, fmt.Errorf("stack limit reached %d (%d)", sLen, operation.maxStack) } // If the operation is valid, enforce and write restrictions - if err := in.enforceRestrictions(op, operation, stack); err != nil { - return nil, err + if in.readOnly && in.evm.chainRules.IsByzantium { + // If the interpreter is operating in readonly mode, make sure no + // state-modifying operation is performed. The 3rd stack item + // for a call operation is the value. Transferring value from one + // account to the others means the state is modified and should also + // return with an error. + if operation.writes || (op == CALL && stack.Back(2).Sign() != 0) { + return nil, errWriteProtection + } + } + // Static portion of gas + if !contract.UseGas(operation.constantGas) { + return nil, ErrOutOfGas } var memorySize uint64 // calculate the new memory size and expand the memory to fit // the operation + // Memory check needs to be done prior to evaluating the dynamic gas portion, + // to detect calculation overflows if operation.memorySize != nil { - memSize, overflow := bigUint64(operation.memorySize(stack)) + memSize, overflow := operation.memorySize(stack) if overflow { return nil, errGasUintOverflow } @@ -224,11 +230,14 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( return nil, errGasUintOverflow } } + // Dynamic portion of gas // consume the gas and return an error if not enough gas is available. // cost is explicitly set so that the capture state defer method can get the proper cost - cost, err = operation.gasCost(in.gasTable, in.evm, contract, stack, mem, memorySize) - if err != nil || !contract.UseGas(cost) { - return nil, ErrOutOfGas + if operation.dynamicGas != nil { + cost, err = operation.dynamicGas(in.gasTable, in.evm, contract, stack, mem, memorySize) + if err != nil || !contract.UseGas(cost) { + return nil, ErrOutOfGas + } } if memorySize > 0 { mem.Resize(memorySize) @@ -240,7 +249,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( } // execute the operation - res, err := operation.execute(&pc, in, contract, mem, stack) + res, err = operation.execute(&pc, in, contract, mem, stack) // verifyPool is a build flag. Pool verification makes sure the integrity // of the integer pool by comparing values to a default value. if verifyPool { diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index deedf70cdb7d..425436f9e50f 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -18,27 +18,30 @@ package vm import ( "errors" - "math/big" "github.com/ethereum/go-ethereum/params" ) type ( - executionFunc func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) - gasFunc func(params.GasTable, *EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64 - stackValidationFunc func(*Stack) error - memorySizeFunc func(*Stack) *big.Int + executionFunc func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) + gasFunc func(params.GasTable, *EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64 + // memorySizeFunc returns the required size, and whether the operation overflowed a uint64 + memorySizeFunc func(*Stack) (size uint64, overflow bool) ) var errGasUintOverflow = errors.New("gas uint64 overflow") type operation struct { // execute is the operation function - execute executionFunc - // gasCost is the gas function and returns the gas required for execution - gasCost gasFunc - // validateStack validates the stack (size) for the operation - validateStack stackValidationFunc + execute executionFunc + constantGas uint64 + dynamicGas gasFunc + // minStack tells how many stack items are required + minStack int + // maxStack specifies the max length the stack can have for this operation + // to not overflow the stack. + maxStack int + // memorySize returns the memory size required for the operation memorySize memorySizeFunc @@ -63,37 +66,42 @@ func newConstantinopleInstructionSet() [256]operation { // instructions that can be executed during the byzantium phase. instructionSet := newByzantiumInstructionSet() instructionSet[SHL] = operation{ - execute: opSHL, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSHL, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, } instructionSet[SHR] = operation{ - execute: opSHR, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSHR, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, } instructionSet[SAR] = operation{ - execute: opSAR, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSAR, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, } instructionSet[EXTCODEHASH] = operation{ - execute: opExtCodeHash, - gasCost: gasExtCodeHash, - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opExtCodeHash, + dynamicGas: gasExtCodeHash, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, } instructionSet[CREATE2] = operation{ - execute: opCreate2, - gasCost: gasCreate2, - validateStack: makeStackFunc(4, 1), - memorySize: memoryCreate2, - valid: true, - writes: true, - returns: true, + execute: opCreate2, + dynamicGas: gasCreate2, + minStack: minStack(4, 1), + maxStack: maxStack(4, 1), + memorySize: memoryCreate2, + valid: true, + writes: true, + returns: true, } return instructionSet } @@ -104,34 +112,38 @@ func newByzantiumInstructionSet() [256]operation { // instructions that can be executed during the homestead phase. instructionSet := newHomesteadInstructionSet() instructionSet[STATICCALL] = operation{ - execute: opStaticCall, - gasCost: gasStaticCall, - validateStack: makeStackFunc(6, 1), - memorySize: memoryStaticCall, - valid: true, - returns: true, + execute: opStaticCall, + dynamicGas: gasStaticCall, + minStack: minStack(6, 1), + maxStack: maxStack(6, 1), + memorySize: memoryStaticCall, + valid: true, + returns: true, } instructionSet[RETURNDATASIZE] = operation{ - execute: opReturnDataSize, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opReturnDataSize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, } instructionSet[RETURNDATACOPY] = operation{ - execute: opReturnDataCopy, - gasCost: gasReturnDataCopy, - validateStack: makeStackFunc(3, 0), - memorySize: memoryReturnDataCopy, - valid: true, + execute: opReturnDataCopy, + dynamicGas: gasReturnDataCopy, + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryReturnDataCopy, + valid: true, } instructionSet[REVERT] = operation{ - execute: opRevert, - gasCost: gasRevert, - validateStack: makeStackFunc(2, 0), - memorySize: memoryRevert, - valid: true, - reverts: true, - returns: true, + execute: opRevert, + dynamicGas: gasRevert, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryRevert, + valid: true, + reverts: true, + returns: true, } return instructionSet } @@ -141,12 +153,13 @@ func newByzantiumInstructionSet() [256]operation { func newHomesteadInstructionSet() [256]operation { instructionSet := newFrontierInstructionSet() instructionSet[DELEGATECALL] = operation{ - execute: opDelegateCall, - gasCost: gasDelegateCall, - validateStack: makeStackFunc(6, 1), - memorySize: memoryDelegateCall, - valid: true, - returns: true, + execute: opDelegateCall, + dynamicGas: gasDelegateCall, + minStack: minStack(6, 1), + maxStack: maxStack(6, 1), + memorySize: memoryDelegateCall, + valid: true, + returns: true, } return instructionSet } @@ -156,811 +169,940 @@ func newHomesteadInstructionSet() [256]operation { func newFrontierInstructionSet() [256]operation { return [256]operation{ STOP: { - execute: opStop, - gasCost: constGasFunc(0), - validateStack: makeStackFunc(0, 0), - halts: true, - valid: true, + execute: opStop, + constantGas: 0, + minStack: minStack(0, 0), + maxStack: maxStack(0, 0), + halts: true, + valid: true, }, ADD: { - execute: opAdd, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opAdd, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, MUL: { - execute: opMul, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opMul, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SUB: { - execute: opSub, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSub, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, DIV: { - execute: opDiv, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opDiv, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SDIV: { - execute: opSdiv, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSdiv, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, MOD: { - execute: opMod, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opMod, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SMOD: { - execute: opSmod, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSmod, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, ADDMOD: { - execute: opAddmod, - gasCost: constGasFunc(GasMidStep), - validateStack: makeStackFunc(3, 1), - valid: true, + execute: opAddmod, + constantGas: GasMidStep, + minStack: minStack(3, 1), + maxStack: maxStack(3, 1), + valid: true, }, MULMOD: { - execute: opMulmod, - gasCost: constGasFunc(GasMidStep), - validateStack: makeStackFunc(3, 1), - valid: true, + execute: opMulmod, + constantGas: GasMidStep, + minStack: minStack(3, 1), + maxStack: maxStack(3, 1), + valid: true, }, EXP: { - execute: opExp, - gasCost: gasExp, - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opExp, + dynamicGas: gasExp, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SIGNEXTEND: { - execute: opSignExtend, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSignExtend, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, LT: { - execute: opLt, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opLt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, GT: { - execute: opGt, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opGt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SLT: { - execute: opSlt, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSlt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SGT: { - execute: opSgt, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSgt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, EQ: { - execute: opEq, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opEq, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, ISZERO: { - execute: opIszero, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opIszero, + constantGas: GasFastestStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, AND: { - execute: opAnd, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opAnd, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, XOR: { - execute: opXor, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opXor, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, OR: { - execute: opOr, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opOr, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, NOT: { - execute: opNot, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opNot, + constantGas: GasFastestStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, BYTE: { - execute: opByte, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opByte, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SHA3: { - execute: opSha3, - gasCost: gasSha3, - validateStack: makeStackFunc(2, 1), - memorySize: memorySha3, - valid: true, + execute: opSha3, + dynamicGas: gasSha3, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + memorySize: memorySha3, + valid: true, }, ADDRESS: { - execute: opAddress, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opAddress, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, BALANCE: { - execute: opBalance, - gasCost: gasBalance, - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opBalance, + dynamicGas: gasBalance, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, ORIGIN: { - execute: opOrigin, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opOrigin, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CALLER: { - execute: opCaller, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCaller, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CALLVALUE: { - execute: opCallValue, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCallValue, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CALLDATALOAD: { - execute: opCallDataLoad, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opCallDataLoad, + constantGas: GasFastestStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, CALLDATASIZE: { - execute: opCallDataSize, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCallDataSize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CALLDATACOPY: { - execute: opCallDataCopy, - gasCost: gasCallDataCopy, - validateStack: makeStackFunc(3, 0), - memorySize: memoryCallDataCopy, - valid: true, + execute: opCallDataCopy, + dynamicGas: gasCallDataCopy, + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryCallDataCopy, + valid: true, }, CODESIZE: { - execute: opCodeSize, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCodeSize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CODECOPY: { - execute: opCodeCopy, - gasCost: gasCodeCopy, - validateStack: makeStackFunc(3, 0), - memorySize: memoryCodeCopy, - valid: true, + execute: opCodeCopy, + dynamicGas: gasCodeCopy, + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryCodeCopy, + valid: true, }, GASPRICE: { - execute: opGasprice, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opGasprice, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, EXTCODESIZE: { - execute: opExtCodeSize, - gasCost: gasExtCodeSize, - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opExtCodeSize, + dynamicGas: gasExtCodeSize, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, EXTCODECOPY: { - execute: opExtCodeCopy, - gasCost: gasExtCodeCopy, - validateStack: makeStackFunc(4, 0), - memorySize: memoryExtCodeCopy, - valid: true, + execute: opExtCodeCopy, + dynamicGas: gasExtCodeCopy, + minStack: minStack(4, 0), + maxStack: maxStack(4, 0), + memorySize: memoryExtCodeCopy, + valid: true, }, BLOCKHASH: { - execute: opBlockhash, - gasCost: constGasFunc(GasExtStep), - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opBlockhash, + constantGas: GasExtStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, COINBASE: { - execute: opCoinbase, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCoinbase, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, TIMESTAMP: { - execute: opTimestamp, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opTimestamp, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, NUMBER: { - execute: opNumber, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opNumber, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, DIFFICULTY: { - execute: opDifficulty, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opDifficulty, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, GASLIMIT: { - execute: opGasLimit, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opGasLimit, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, POP: { - execute: opPop, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(1, 0), - valid: true, + execute: opPop, + constantGas: GasQuickStep, + minStack: minStack(1, 0), + maxStack: maxStack(1, 0), + valid: true, }, MLOAD: { - execute: opMload, - gasCost: gasMLoad, - validateStack: makeStackFunc(1, 1), - memorySize: memoryMLoad, - valid: true, + execute: opMload, + dynamicGas: gasMLoad, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + memorySize: memoryMLoad, + valid: true, }, MSTORE: { - execute: opMstore, - gasCost: gasMStore, - validateStack: makeStackFunc(2, 0), - memorySize: memoryMStore, - valid: true, + execute: opMstore, + dynamicGas: gasMStore, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryMStore, + valid: true, }, MSTORE8: { - execute: opMstore8, - gasCost: gasMStore8, - memorySize: memoryMStore8, - validateStack: makeStackFunc(2, 0), + execute: opMstore8, + dynamicGas: gasMStore8, + memorySize: memoryMStore8, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), valid: true, }, SLOAD: { - execute: opSload, - gasCost: gasSLoad, - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opSload, + dynamicGas: gasSLoad, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, SSTORE: { - execute: opSstore, - gasCost: gasSStore, - validateStack: makeStackFunc(2, 0), - valid: true, - writes: true, + execute: opSstore, + dynamicGas: gasSStore, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + valid: true, + writes: true, }, JUMP: { - execute: opJump, - gasCost: constGasFunc(GasMidStep), - validateStack: makeStackFunc(1, 0), - jumps: true, - valid: true, + execute: opJump, + constantGas: GasMidStep, + minStack: minStack(1, 0), + maxStack: maxStack(1, 0), + jumps: true, + valid: true, }, JUMPI: { - execute: opJumpi, - gasCost: constGasFunc(GasSlowStep), - validateStack: makeStackFunc(2, 0), - jumps: true, - valid: true, + execute: opJumpi, + constantGas: GasSlowStep, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + jumps: true, + valid: true, }, PC: { - execute: opPc, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opPc, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, MSIZE: { - execute: opMsize, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opMsize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, GAS: { - execute: opGas, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opGas, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, JUMPDEST: { - execute: opJumpdest, - gasCost: constGasFunc(params.JumpdestGas), - validateStack: makeStackFunc(0, 0), - valid: true, + execute: opJumpdest, + constantGas: params.JumpdestGas, + minStack: minStack(0, 0), + maxStack: maxStack(0, 0), + valid: true, }, PUSH1: { - execute: makePush(1, 1), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opPush1, + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH2: { - execute: makePush(2, 2), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(2, 2), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH3: { - execute: makePush(3, 3), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(3, 3), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH4: { - execute: makePush(4, 4), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(4, 4), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH5: { - execute: makePush(5, 5), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(5, 5), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH6: { - execute: makePush(6, 6), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(6, 6), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH7: { - execute: makePush(7, 7), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(7, 7), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH8: { - execute: makePush(8, 8), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(8, 8), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH9: { - execute: makePush(9, 9), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(9, 9), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH10: { - execute: makePush(10, 10), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(10, 10), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH11: { - execute: makePush(11, 11), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(11, 11), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH12: { - execute: makePush(12, 12), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(12, 12), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH13: { - execute: makePush(13, 13), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(13, 13), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH14: { - execute: makePush(14, 14), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(14, 14), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH15: { - execute: makePush(15, 15), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(15, 15), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH16: { - execute: makePush(16, 16), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(16, 16), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH17: { - execute: makePush(17, 17), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(17, 17), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH18: { - execute: makePush(18, 18), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(18, 18), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH19: { - execute: makePush(19, 19), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(19, 19), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH20: { - execute: makePush(20, 20), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(20, 20), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH21: { - execute: makePush(21, 21), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(21, 21), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH22: { - execute: makePush(22, 22), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(22, 22), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH23: { - execute: makePush(23, 23), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(23, 23), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH24: { - execute: makePush(24, 24), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(24, 24), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH25: { - execute: makePush(25, 25), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(25, 25), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH26: { - execute: makePush(26, 26), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(26, 26), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH27: { - execute: makePush(27, 27), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(27, 27), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH28: { - execute: makePush(28, 28), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(28, 28), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH29: { - execute: makePush(29, 29), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(29, 29), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH30: { - execute: makePush(30, 30), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(30, 30), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH31: { - execute: makePush(31, 31), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(31, 31), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH32: { - execute: makePush(32, 32), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(32, 32), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, DUP1: { - execute: makeDup(1), - gasCost: gasDup, - validateStack: makeDupStackFunc(1), - valid: true, + execute: makeDup(1), + constantGas: GasFastestStep, + minStack: minDupStack(1), + maxStack: maxDupStack(1), + valid: true, }, DUP2: { - execute: makeDup(2), - gasCost: gasDup, - validateStack: makeDupStackFunc(2), - valid: true, + execute: makeDup(2), + constantGas: GasFastestStep, + minStack: minDupStack(2), + maxStack: maxDupStack(2), + valid: true, }, DUP3: { - execute: makeDup(3), - gasCost: gasDup, - validateStack: makeDupStackFunc(3), - valid: true, + execute: makeDup(3), + constantGas: GasFastestStep, + minStack: minDupStack(3), + maxStack: maxDupStack(3), + valid: true, }, DUP4: { - execute: makeDup(4), - gasCost: gasDup, - validateStack: makeDupStackFunc(4), - valid: true, + execute: makeDup(4), + constantGas: GasFastestStep, + minStack: minDupStack(4), + maxStack: maxDupStack(4), + valid: true, }, DUP5: { - execute: makeDup(5), - gasCost: gasDup, - validateStack: makeDupStackFunc(5), - valid: true, + execute: makeDup(5), + constantGas: GasFastestStep, + minStack: minDupStack(5), + maxStack: maxDupStack(5), + valid: true, }, DUP6: { - execute: makeDup(6), - gasCost: gasDup, - validateStack: makeDupStackFunc(6), - valid: true, + execute: makeDup(6), + constantGas: GasFastestStep, + minStack: minDupStack(6), + maxStack: maxDupStack(6), + valid: true, }, DUP7: { - execute: makeDup(7), - gasCost: gasDup, - validateStack: makeDupStackFunc(7), - valid: true, + execute: makeDup(7), + constantGas: GasFastestStep, + minStack: minDupStack(7), + maxStack: maxDupStack(7), + valid: true, }, DUP8: { - execute: makeDup(8), - gasCost: gasDup, - validateStack: makeDupStackFunc(8), - valid: true, + execute: makeDup(8), + constantGas: GasFastestStep, + minStack: minDupStack(8), + maxStack: maxDupStack(8), + valid: true, }, DUP9: { - execute: makeDup(9), - gasCost: gasDup, - validateStack: makeDupStackFunc(9), - valid: true, + execute: makeDup(9), + constantGas: GasFastestStep, + minStack: minDupStack(9), + maxStack: maxDupStack(9), + valid: true, }, DUP10: { - execute: makeDup(10), - gasCost: gasDup, - validateStack: makeDupStackFunc(10), - valid: true, + execute: makeDup(10), + constantGas: GasFastestStep, + minStack: minDupStack(10), + maxStack: maxDupStack(10), + valid: true, }, DUP11: { - execute: makeDup(11), - gasCost: gasDup, - validateStack: makeDupStackFunc(11), - valid: true, + execute: makeDup(11), + constantGas: GasFastestStep, + minStack: minDupStack(11), + maxStack: maxDupStack(11), + valid: true, }, DUP12: { - execute: makeDup(12), - gasCost: gasDup, - validateStack: makeDupStackFunc(12), - valid: true, + execute: makeDup(12), + constantGas: GasFastestStep, + minStack: minDupStack(12), + maxStack: maxDupStack(12), + valid: true, }, DUP13: { - execute: makeDup(13), - gasCost: gasDup, - validateStack: makeDupStackFunc(13), - valid: true, + execute: makeDup(13), + constantGas: GasFastestStep, + minStack: minDupStack(13), + maxStack: maxDupStack(13), + valid: true, }, DUP14: { - execute: makeDup(14), - gasCost: gasDup, - validateStack: makeDupStackFunc(14), - valid: true, + execute: makeDup(14), + constantGas: GasFastestStep, + minStack: minDupStack(14), + maxStack: maxDupStack(14), + valid: true, }, DUP15: { - execute: makeDup(15), - gasCost: gasDup, - validateStack: makeDupStackFunc(15), - valid: true, + execute: makeDup(15), + constantGas: GasFastestStep, + minStack: minDupStack(15), + maxStack: maxDupStack(15), + valid: true, }, DUP16: { - execute: makeDup(16), - gasCost: gasDup, - validateStack: makeDupStackFunc(16), - valid: true, + execute: makeDup(16), + constantGas: GasFastestStep, + minStack: minDupStack(16), + maxStack: maxDupStack(16), + valid: true, }, SWAP1: { - execute: makeSwap(1), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(2), - valid: true, + execute: makeSwap(1), + constantGas: GasFastestStep, + minStack: minSwapStack(2), + maxStack: maxSwapStack(2), + valid: true, }, SWAP2: { - execute: makeSwap(2), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(3), - valid: true, + execute: makeSwap(2), + constantGas: GasFastestStep, + minStack: minSwapStack(3), + maxStack: maxSwapStack(3), + valid: true, }, SWAP3: { - execute: makeSwap(3), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(4), - valid: true, + execute: makeSwap(3), + constantGas: GasFastestStep, + minStack: minSwapStack(4), + maxStack: maxSwapStack(4), + valid: true, }, SWAP4: { - execute: makeSwap(4), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(5), - valid: true, + execute: makeSwap(4), + constantGas: GasFastestStep, + minStack: minSwapStack(5), + maxStack: maxSwapStack(5), + valid: true, }, SWAP5: { - execute: makeSwap(5), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(6), - valid: true, + execute: makeSwap(5), + constantGas: GasFastestStep, + minStack: minSwapStack(6), + maxStack: maxSwapStack(6), + valid: true, }, SWAP6: { - execute: makeSwap(6), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(7), - valid: true, + execute: makeSwap(6), + constantGas: GasFastestStep, + minStack: minSwapStack(7), + maxStack: maxSwapStack(7), + valid: true, }, SWAP7: { - execute: makeSwap(7), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(8), - valid: true, + execute: makeSwap(7), + constantGas: GasFastestStep, + minStack: minSwapStack(8), + maxStack: maxSwapStack(8), + valid: true, }, SWAP8: { - execute: makeSwap(8), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(9), - valid: true, + execute: makeSwap(8), + constantGas: GasFastestStep, + minStack: minSwapStack(9), + maxStack: maxSwapStack(9), + valid: true, }, SWAP9: { - execute: makeSwap(9), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(10), - valid: true, + execute: makeSwap(9), + constantGas: GasFastestStep, + minStack: minSwapStack(10), + maxStack: maxSwapStack(10), + valid: true, }, SWAP10: { - execute: makeSwap(10), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(11), - valid: true, + execute: makeSwap(10), + constantGas: GasFastestStep, + minStack: minSwapStack(11), + maxStack: maxSwapStack(11), + valid: true, }, SWAP11: { - execute: makeSwap(11), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(12), - valid: true, + execute: makeSwap(11), + constantGas: GasFastestStep, + minStack: minSwapStack(12), + maxStack: maxSwapStack(12), + valid: true, }, SWAP12: { - execute: makeSwap(12), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(13), - valid: true, + execute: makeSwap(12), + constantGas: GasFastestStep, + minStack: minSwapStack(13), + maxStack: maxSwapStack(13), + valid: true, }, SWAP13: { - execute: makeSwap(13), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(14), - valid: true, + execute: makeSwap(13), + constantGas: GasFastestStep, + minStack: minSwapStack(14), + maxStack: maxSwapStack(14), + valid: true, }, SWAP14: { - execute: makeSwap(14), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(15), - valid: true, + execute: makeSwap(14), + constantGas: GasFastestStep, + minStack: minSwapStack(15), + maxStack: maxSwapStack(15), + valid: true, }, SWAP15: { - execute: makeSwap(15), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(16), - valid: true, + execute: makeSwap(15), + constantGas: GasFastestStep, + minStack: minSwapStack(16), + maxStack: maxSwapStack(16), + valid: true, }, SWAP16: { - execute: makeSwap(16), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(17), - valid: true, + execute: makeSwap(16), + constantGas: GasFastestStep, + minStack: minSwapStack(17), + maxStack: maxSwapStack(17), + valid: true, }, LOG0: { - execute: makeLog(0), - gasCost: makeGasLog(0), - validateStack: makeStackFunc(2, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(0), + dynamicGas: makeGasLog(0), + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, LOG1: { - execute: makeLog(1), - gasCost: makeGasLog(1), - validateStack: makeStackFunc(3, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(1), + dynamicGas: makeGasLog(1), + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, LOG2: { - execute: makeLog(2), - gasCost: makeGasLog(2), - validateStack: makeStackFunc(4, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(2), + dynamicGas: makeGasLog(2), + minStack: minStack(4, 0), + maxStack: maxStack(4, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, LOG3: { - execute: makeLog(3), - gasCost: makeGasLog(3), - validateStack: makeStackFunc(5, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(3), + dynamicGas: makeGasLog(3), + minStack: minStack(5, 0), + maxStack: maxStack(5, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, LOG4: { - execute: makeLog(4), - gasCost: makeGasLog(4), - validateStack: makeStackFunc(6, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(4), + dynamicGas: makeGasLog(4), + minStack: minStack(6, 0), + maxStack: maxStack(6, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, CREATE: { - execute: opCreate, - gasCost: gasCreate, - validateStack: makeStackFunc(3, 1), - memorySize: memoryCreate, - valid: true, - writes: true, - returns: true, + execute: opCreate, + dynamicGas: gasCreate, + minStack: minStack(3, 1), + maxStack: maxStack(3, 1), + memorySize: memoryCreate, + valid: true, + writes: true, + returns: true, }, CALL: { - execute: opCall, - gasCost: gasCall, - validateStack: makeStackFunc(7, 1), - memorySize: memoryCall, - valid: true, - returns: true, + execute: opCall, + dynamicGas: gasCall, + minStack: minStack(7, 1), + maxStack: maxStack(7, 1), + memorySize: memoryCall, + valid: true, + returns: true, }, CALLCODE: { - execute: opCallCode, - gasCost: gasCallCode, - validateStack: makeStackFunc(7, 1), - memorySize: memoryCall, - valid: true, - returns: true, + execute: opCallCode, + dynamicGas: gasCallCode, + minStack: minStack(7, 1), + maxStack: maxStack(7, 1), + memorySize: memoryCall, + valid: true, + returns: true, }, RETURN: { - execute: opReturn, - gasCost: gasReturn, - validateStack: makeStackFunc(2, 0), - memorySize: memoryReturn, - halts: true, - valid: true, + execute: opReturn, + dynamicGas: gasReturn, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryReturn, + halts: true, + valid: true, }, SELFDESTRUCT: { - execute: opSuicide, - gasCost: gasSuicide, - validateStack: makeStackFunc(1, 0), - halts: true, - valid: true, - writes: true, + execute: opSuicide, + dynamicGas: gasSuicide, + minStack: minStack(1, 0), + maxStack: maxStack(1, 0), + halts: true, + valid: true, + writes: true, }, } } diff --git a/core/vm/logger.go b/core/vm/logger.go index 85acb8d6d395..262ee5cc3e83 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -56,16 +56,17 @@ type LogConfig struct { // StructLog is emitted to the EVM each cycle and lists information about the current internal state // prior to the execution of the statement. type StructLog struct { - Pc uint64 `json:"pc"` - Op OpCode `json:"op"` - Gas uint64 `json:"gas"` - GasCost uint64 `json:"gasCost"` - Memory []byte `json:"memory"` - MemorySize int `json:"memSize"` - Stack []*big.Int `json:"stack"` - Storage map[common.Hash]common.Hash `json:"-"` - Depth int `json:"depth"` - Err error `json:"-"` + Pc uint64 `json:"pc"` + Op OpCode `json:"op"` + Gas uint64 `json:"gas"` + GasCost uint64 `json:"gasCost"` + Memory []byte `json:"memory"` + MemorySize int `json:"memSize"` + Stack []*big.Int `json:"stack"` + Storage map[common.Hash]common.Hash `json:"-"` + Depth int `json:"depth"` + RefundCounter uint64 `json:"refund"` + Err error `json:"-"` } // overrides for gencodec @@ -157,7 +158,7 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui ) l.changedValues[contract.Address()][address] = value } - // Copy a snapstot of the current memory state to a new buffer + // Copy a snapshot of the current memory state to a new buffer var mem []byte if !l.cfg.DisableMemory { mem = make([]byte, len(memory.Data())) @@ -176,8 +177,8 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui if !l.cfg.DisableStorage { storage = l.changedValues[contract.Address()].Copy() } - // create a new snaptshot of the EVM. - log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, storage, depth, err} + // create a new snapshot of the EVM. + log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, storage, depth, env.StateDB.GetRefund(), err} l.logs = append(l.logs, log) return nil diff --git a/core/vm/logger_json.go b/core/vm/logger_json.go new file mode 100644 index 000000000000..04a83d0660fc --- /dev/null +++ b/core/vm/logger_json.go @@ -0,0 +1,87 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "encoding/json" + "io" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" +) + +type JSONLogger struct { + encoder *json.Encoder + cfg *LogConfig +} + +// NewJSONLogger creates a new EVM tracer that prints execution steps as JSON objects +// into the provided stream. +func NewJSONLogger(cfg *LogConfig, writer io.Writer) *JSONLogger { + l := &JSONLogger{json.NewEncoder(writer), cfg} + if l.cfg == nil { + l.cfg = &LogConfig{} + } + return l +} + +func (l *JSONLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error { + return nil +} + +// CaptureState outputs state information on the logger. +func (l *JSONLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error { + log := StructLog{ + Pc: pc, + Op: op, + Gas: gas, + GasCost: cost, + MemorySize: memory.Len(), + Storage: nil, + Depth: depth, + RefundCounter: env.StateDB.GetRefund(), + Err: err, + } + if !l.cfg.DisableMemory { + log.Memory = memory.Data() + } + if !l.cfg.DisableStack { + log.Stack = stack.Data() + } + return l.encoder.Encode(log) +} + +// CaptureFault outputs state information on the logger. +func (l *JSONLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error { + return nil +} + +// CaptureEnd is triggered at end of execution. +func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { + type endLog struct { + Output string `json:"output"` + GasUsed math.HexOrDecimal64 `json:"gasUsed"` + Time time.Duration `json:"time"` + Err string `json:"error,omitempty"` + } + if err != nil { + return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, err.Error()}) + } + return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, ""}) +} diff --git a/core/vm/logger_test.go b/core/vm/logger_test.go index cdbb70dc4208..2ea7535a794d 100644 --- a/core/vm/logger_test.go +++ b/core/vm/logger_test.go @@ -21,6 +21,7 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/params" ) @@ -41,9 +42,15 @@ func (d *dummyContractRef) SetBalance(*big.Int) {} func (d *dummyContractRef) SetNonce(uint64) {} func (d *dummyContractRef) Balance() *big.Int { return new(big.Int) } +type dummyStatedb struct { + state.StateDB +} + +func (*dummyStatedb) GetRefund() uint64 { return 1337 } + func TestStoreCapture(t *testing.T) { var ( - env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) + env = NewEVM(Context{}, &dummyStatedb{}, params.TestChainConfig, Config{}) logger = NewStructLogger(nil) mem = NewMemory() stack = newstack() @@ -51,9 +58,7 @@ func TestStoreCapture(t *testing.T) { ) stack.push(big.NewInt(1)) stack.push(big.NewInt(0)) - var index common.Hash - logger.CaptureState(env, 0, SSTORE, 0, 0, mem, stack, contract, 0, nil) if len(logger.changedValues[contract.Address()]) == 0 { t.Fatalf("expected exactly 1 changed value on address %x, got %d", contract.Address(), len(logger.changedValues[contract.Address()])) diff --git a/core/vm/memory_table.go b/core/vm/memory_table.go index 8fa6c90ca7d4..4fcb41442c4e 100644 --- a/core/vm/memory_table.go +++ b/core/vm/memory_table.go @@ -16,82 +16,98 @@ package vm -import ( - "math/big" - - "github.com/ethereum/go-ethereum/common/math" -) - -func memorySha3(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(1)) +func memorySha3(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) } -func memoryCallDataCopy(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(2)) +func memoryCallDataCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(2)) } -func memoryReturnDataCopy(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(2)) +func memoryReturnDataCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(2)) } -func memoryCodeCopy(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(2)) +func memoryCodeCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(2)) } -func memoryExtCodeCopy(stack *Stack) *big.Int { - return calcMemSize(stack.Back(1), stack.Back(3)) +func memoryExtCodeCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(1), stack.Back(3)) } -func memoryMLoad(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), big.NewInt(32)) +func memoryMLoad(stack *Stack) (uint64, bool) { + return calcMemSize64WithUint(stack.Back(0), 32) } -func memoryMStore8(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), big.NewInt(1)) +func memoryMStore8(stack *Stack) (uint64, bool) { + return calcMemSize64WithUint(stack.Back(0), 1) } -func memoryMStore(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), big.NewInt(32)) +func memoryMStore(stack *Stack) (uint64, bool) { + return calcMemSize64WithUint(stack.Back(0), 32) } -func memoryCreate(stack *Stack) *big.Int { - return calcMemSize(stack.Back(1), stack.Back(2)) +func memoryCreate(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(1), stack.Back(2)) } -func memoryCreate2(stack *Stack) *big.Int { - return calcMemSize(stack.Back(1), stack.Back(2)) +func memoryCreate2(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(1), stack.Back(2)) } -func memoryCall(stack *Stack) *big.Int { - x := calcMemSize(stack.Back(5), stack.Back(6)) - y := calcMemSize(stack.Back(3), stack.Back(4)) - - return math.BigMax(x, y) +func memoryCall(stack *Stack) (uint64, bool) { + x, overflow := calcMemSize64(stack.Back(5), stack.Back(6)) + if overflow { + return 0, true + } + y, overflow := calcMemSize64(stack.Back(3), stack.Back(4)) + if overflow { + return 0, true + } + if x > y { + return x, false + } + return y, false } - -func memoryDelegateCall(stack *Stack) *big.Int { - x := calcMemSize(stack.Back(4), stack.Back(5)) - y := calcMemSize(stack.Back(2), stack.Back(3)) - - return math.BigMax(x, y) +func memoryDelegateCall(stack *Stack) (uint64, bool) { + x, overflow := calcMemSize64(stack.Back(4), stack.Back(5)) + if overflow { + return 0, true + } + y, overflow := calcMemSize64(stack.Back(2), stack.Back(3)) + if overflow { + return 0, true + } + if x > y { + return x, false + } + return y, false } -func memoryStaticCall(stack *Stack) *big.Int { - x := calcMemSize(stack.Back(4), stack.Back(5)) - y := calcMemSize(stack.Back(2), stack.Back(3)) - - return math.BigMax(x, y) +func memoryStaticCall(stack *Stack) (uint64, bool) { + x, overflow := calcMemSize64(stack.Back(4), stack.Back(5)) + if overflow { + return 0, true + } + y, overflow := calcMemSize64(stack.Back(2), stack.Back(3)) + if overflow { + return 0, true + } + if x > y { + return x, false + } + return y, false } -func memoryReturn(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(1)) +func memoryReturn(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) } -func memoryRevert(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(1)) +func memoryRevert(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) } -func memoryLog(stack *Stack) *big.Int { - mSize, mStart := stack.Back(1), stack.Back(0) - return calcMemSize(mStart, mSize) +func memoryLog(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) } diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go index cda49a34b4a7..db1f6f38222b 100644 --- a/core/vm/runtime/runtime.go +++ b/core/vm/runtime/runtime.go @@ -22,10 +22,10 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" ) @@ -99,7 +99,7 @@ func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) { setDefaults(cfg) if cfg.State == nil { - cfg.State, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + cfg.State, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) } var ( address = common.BytesToAddress([]byte("contract")) @@ -129,7 +129,7 @@ func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) { setDefaults(cfg) if cfg.State == nil { - cfg.State, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + cfg.State, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) } var ( vmenv = NewEnv(cfg) diff --git a/core/vm/runtime/runtime_test.go b/core/vm/runtime/runtime_test.go index ef664bda30cd..15f545ddcafb 100644 --- a/core/vm/runtime/runtime_test.go +++ b/core/vm/runtime/runtime_test.go @@ -23,9 +23,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" ) func TestDefaults(t *testing.T) { @@ -94,7 +95,7 @@ func TestExecute(t *testing.T) { } func TestCall(t *testing.T) { - state, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + state, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) address := common.HexToAddress("0x0a") state.SetCode(address, []byte{ byte(vm.PUSH1), 10, @@ -148,3 +149,57 @@ func BenchmarkCall(b *testing.B) { } } } +func benchmarkEVM_Create(bench *testing.B, code string) { + var ( + statedb, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) + sender = common.BytesToAddress([]byte("sender")) + receiver = common.BytesToAddress([]byte("receiver")) + ) + + statedb.CreateAccount(sender) + statedb.SetCode(receiver, common.FromHex(code)) + runtimeConfig := Config{ + Origin: sender, + State: statedb, + GasLimit: 10000000, + Difficulty: big.NewInt(0x200000), + Time: new(big.Int).SetUint64(0), + Coinbase: common.Address{}, + BlockNumber: new(big.Int).SetUint64(1), + ChainConfig: ¶ms.ChainConfig{ + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + ByzantiumBlock: new(big.Int), + ConstantinopleBlock: new(big.Int), + DAOForkBlock: new(big.Int), + DAOForkSupport: false, + EIP150Block: new(big.Int), + EIP155Block: new(big.Int), + EIP158Block: new(big.Int), + }, + EVMConfig: vm.Config{}, + } + // Warm up the intpools and stuff + bench.ResetTimer() + for i := 0; i < bench.N; i++ { + Call(receiver, []byte{}, &runtimeConfig) + } + bench.StopTimer() +} + +func BenchmarkEVM_CREATE_500(bench *testing.B) { + // initcode size 500K, repeatedly calls CREATE and then modifies the mem contents + benchmarkEVM_Create(bench, "5b6207a120600080f0600152600056") +} +func BenchmarkEVM_CREATE2_500(bench *testing.B) { + // initcode size 500K, repeatedly calls CREATE2 and then modifies the mem contents + benchmarkEVM_Create(bench, "5b586207a120600080f5600152600056") +} +func BenchmarkEVM_CREATE_1200(bench *testing.B) { + // initcode size 1200K, repeatedly calls CREATE and then modifies the mem contents + benchmarkEVM_Create(bench, "5b62124f80600080f0600152600056") +} +func BenchmarkEVM_CREATE2_1200(bench *testing.B) { + // initcode size 1200K, repeatedly calls CREATE2 and then modifies the mem contents + benchmarkEVM_Create(bench, "5b5862124f80600080f5600152600056") +} diff --git a/core/vm/stack_table.go b/core/vm/stack_table.go index a4b1cfcd896e..10c12901afdb 100644 --- a/core/vm/stack_table.go +++ b/core/vm/stack_table.go @@ -17,28 +17,26 @@ package vm import ( - "fmt" - "github.com/ethereum/go-ethereum/params" ) -func makeStackFunc(pop, push int) stackValidationFunc { - return func(stack *Stack) error { - if err := stack.require(pop); err != nil { - return err - } - - if stack.len()+push-pop > int(params.StackLimit) { - return fmt.Errorf("stack limit reached %d (%d)", stack.len(), params.StackLimit) - } - return nil - } +func minSwapStack(n int) int { + return minStack(n, n) +} +func maxSwapStack(n int) int { + return maxStack(n, n) } -func makeDupStackFunc(n int) stackValidationFunc { - return makeStackFunc(n, n+1) +func minDupStack(n int) int { + return minStack(n, n+1) +} +func maxDupStack(n int) int { + return maxStack(n, n+1) } -func makeSwapStackFunc(n int) stackValidationFunc { - return makeStackFunc(n, n) +func maxStack(pop, push int) int { + return int(params.StackLimit) + pop - push +} +func minStack(pops, push int) int { + return pops } diff --git a/core/vm/testdata/testcases_add.json b/core/vm/testdata/testcases_add.json new file mode 100644 index 000000000000..c03ae96ada40 --- /dev/null +++ b/core/vm/testdata/testcases_add.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"000000000000000000000000000000000000000000000000000000000000000a"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_and.json b/core/vm/testdata/testcases_and.json new file mode 100644 index 000000000000..aba5f2463c84 --- /dev/null +++ b/core/vm/testdata/testcases_and.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_byte.json b/core/vm/testdata/testcases_byte.json new file mode 100644 index 000000000000..88d7c7d80711 --- /dev/null +++ b/core/vm/testdata/testcases_byte.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"000000000000000000000000000000000000000000000000000000000000007f"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"000000000000000000000000000000000000000000000000000000000000007f"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000080"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000080"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_div.json b/core/vm/testdata/testcases_div.json new file mode 100644 index 000000000000..b1f9c7fbac8b --- /dev/null +++ b/core/vm/testdata/testcases_div.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"3333333333333333333333333333333333333333333333333333333333333332"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"3333333333333333333333333333333333333333333333333333333333333333"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_eq.json b/core/vm/testdata/testcases_eq.json new file mode 100644 index 000000000000..937eadb02481 --- /dev/null +++ b/core/vm/testdata/testcases_eq.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_exp.json b/core/vm/testdata/testcases_exp.json new file mode 100644 index 000000000000..61818357f8c6 --- /dev/null +++ b/core/vm/testdata/testcases_exp.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000c35"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3cb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c29"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c29"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"3333333333333333333333333333333333333333333333333333333333333333"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"58cd20afa2f05a708ede54b48d3ae685db76b3bb83cf2cf95d4e8fb00bcbe61d"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"a732df505d0fa58f7121ab4b72c5197a24894c447c30d306a2b1704ff43419e3"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"3333333333333333333333333333333333333333333333333333333333333333"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_gt.json b/core/vm/testdata/testcases_gt.json new file mode 100644 index 000000000000..637bd3f6e67b --- /dev/null +++ b/core/vm/testdata/testcases_gt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_lt.json b/core/vm/testdata/testcases_lt.json new file mode 100644 index 000000000000..55252a4de263 --- /dev/null +++ b/core/vm/testdata/testcases_lt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_mod.json b/core/vm/testdata/testcases_mod.json new file mode 100644 index 000000000000..192503f26f21 --- /dev/null +++ b/core/vm/testdata/testcases_mod.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_mul.json b/core/vm/testdata/testcases_mul.json new file mode 100644 index 000000000000..dc44c253f6ec --- /dev/null +++ b/core/vm/testdata/testcases_mul.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000019"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"800000000000000000000000000000000000000000000000000000000000000a"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"800000000000000000000000000000000000000000000000000000000000000a"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000019"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_or.json b/core/vm/testdata/testcases_or.json new file mode 100644 index 000000000000..bfa561b58595 --- /dev/null +++ b/core/vm/testdata/testcases_or.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_sar.json b/core/vm/testdata/testcases_sar.json new file mode 100644 index 000000000000..c93abbd654fa --- /dev/null +++ b/core/vm/testdata/testcases_sar.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"c000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fc00000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"c000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fc00000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_sdiv.json b/core/vm/testdata/testcases_sdiv.json new file mode 100644 index 000000000000..18cb666ab507 --- /dev/null +++ b/core/vm/testdata/testcases_sdiv.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_sgt.json b/core/vm/testdata/testcases_sgt.json new file mode 100644 index 000000000000..aa581a65492a --- /dev/null +++ b/core/vm/testdata/testcases_sgt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_shl.json b/core/vm/testdata/testcases_shl.json new file mode 100644 index 000000000000..65e9c07b77a9 --- /dev/null +++ b/core/vm/testdata/testcases_shl.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000020"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"000000000000000000000000000000000000000000000000000000000000000a"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000a0"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000020"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_shr.json b/core/vm/testdata/testcases_shr.json new file mode 100644 index 000000000000..a38491350d5d --- /dev/null +++ b/core/vm/testdata/testcases_shr.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"4000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0400000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"4000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0400000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_signext.json b/core/vm/testdata/testcases_signext.json new file mode 100644 index 000000000000..bdadd400e78c --- /dev/null +++ b/core/vm/testdata/testcases_signext.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_slt.json b/core/vm/testdata/testcases_slt.json new file mode 100644 index 000000000000..4369b96fd8f4 --- /dev/null +++ b/core/vm/testdata/testcases_slt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_smod.json b/core/vm/testdata/testcases_smod.json new file mode 100644 index 000000000000..980e0341a797 --- /dev/null +++ b/core/vm/testdata/testcases_smod.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_sub.json b/core/vm/testdata/testcases_sub.json new file mode 100644 index 000000000000..b3881a5ab624 --- /dev/null +++ b/core/vm/testdata/testcases_sub.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000007"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"000000000000000000000000000000000000000000000000000000000000000a"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_xor.json b/core/vm/testdata/testcases_xor.json new file mode 100644 index 000000000000..4cc2dddd7dfa --- /dev/null +++ b/core/vm/testdata/testcases_xor.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/crypto/bn256/cloudflare/bn256.go b/crypto/bn256/cloudflare/bn256.go index c6ea2d07e01c..38822a76bfec 100644 --- a/crypto/bn256/cloudflare/bn256.go +++ b/crypto/bn256/cloudflare/bn256.go @@ -100,6 +100,10 @@ func (e *G1) Marshal() []byte { // Each value is a 256-bit number. const numBytes = 256 / 8 + if e.p == nil { + e.p = &curvePoint{} + } + e.p.MakeAffine() ret := make([]byte, numBytes*2) if e.p.IsInfinity() { @@ -382,6 +386,11 @@ func (e *GT) Marshal() []byte { // Each value is a 256-bit number. const numBytes = 256 / 8 + if e.p == nil { + e.p = &gfP12{} + e.p.SetOne() + } + ret := make([]byte, numBytes*12) temp := &gfP{} diff --git a/crypto/bn256/cloudflare/constants.go b/crypto/bn256/cloudflare/constants.go index 5122aae64f1e..f7d2c7c001cc 100644 --- a/crypto/bn256/cloudflare/constants.go +++ b/crypto/bn256/cloudflare/constants.go @@ -13,10 +13,13 @@ func bigFromBase10(s string) *big.Int { return n } -// u is the BN parameter that determines the prime: 1868033³. +// u is the BN parameter. var u = bigFromBase10("4965661367192848881") // Order is the number of elements in both G₁ and G₂: 36u⁴+36u³+18u²+6u+1. +// Needs to be highly 2-adic for efficient SNARK key and proof generation. +// Order - 1 = 2^28 * 3^2 * 13 * 29 * 983 * 11003 * 237073 * 405928799 * 1670836401704629 * 13818364434197438864469338081. +// Refer to https://eprint.iacr.org/2013/879.pdf and https://eprint.iacr.org/2013/507.pdf for more information on these parameters. var Order = bigFromBase10("21888242871839275222246405745257275088548364400416034343698204186575808495617") // P is a prime over which we form a basic field: 36u⁴+36u³+24u²+6u+1. diff --git a/crypto/bn256/cloudflare/gfp6.go b/crypto/bn256/cloudflare/gfp6.go index 83d61b781f39..a42734911c64 100644 --- a/crypto/bn256/cloudflare/gfp6.go +++ b/crypto/bn256/cloudflare/gfp6.go @@ -5,7 +5,7 @@ package bn256 // http://eprint.iacr.org/2006/471.pdf. // gfP6 implements the field of size p⁶ as a cubic extension of gfP2 where τ³=ξ -// and ξ=i+3. +// and ξ=i+9. type gfP6 struct { x, y, z gfP2 // value is xτ² + yτ + z } diff --git a/crypto/bn256/cloudflare/main_test.go b/crypto/bn256/cloudflare/main_test.go index 0230f1b1993d..c0c85457beca 100644 --- a/crypto/bn256/cloudflare/main_test.go +++ b/crypto/bn256/cloudflare/main_test.go @@ -13,7 +13,7 @@ func TestRandomG2Marshal(t *testing.T) { t.Error(err) continue } - t.Logf("%d: %x\n", n, g2.Marshal()) + t.Logf("%v: %x\n", n, g2.Marshal()) } } diff --git a/crypto/bn256/cloudflare/mul_arm64.h b/crypto/bn256/cloudflare/mul_arm64.h index 75d52217311b..d405eb8f7287 100644 --- a/crypto/bn256/cloudflare/mul_arm64.h +++ b/crypto/bn256/cloudflare/mul_arm64.h @@ -12,7 +12,7 @@ UMULH R1, R8, c4 \ ADCS ZR, c4 \ \ - MUL R2, R5, R25 \ + MUL R2, R5, R1 \ UMULH R2, R5, R26 \ MUL R2, R6, R0 \ ADDS R0, R26 \ @@ -24,13 +24,13 @@ ADCS R0, R29 \ UMULH R2, R8, c5 \ ADCS ZR, c5 \ - ADDS R25, c1 \ + ADDS R1, c1 \ ADCS R26, c2 \ ADCS R27, c3 \ ADCS R29, c4 \ ADCS ZR, c5 \ \ - MUL R3, R5, R25 \ + MUL R3, R5, R1 \ UMULH R3, R5, R26 \ MUL R3, R6, R0 \ ADDS R0, R26 \ @@ -42,13 +42,13 @@ ADCS R0, R29 \ UMULH R3, R8, c6 \ ADCS ZR, c6 \ - ADDS R25, c2 \ + ADDS R1, c2 \ ADCS R26, c3 \ ADCS R27, c4 \ ADCS R29, c5 \ ADCS ZR, c6 \ \ - MUL R4, R5, R25 \ + MUL R4, R5, R1 \ UMULH R4, R5, R26 \ MUL R4, R6, R0 \ ADDS R0, R26 \ @@ -60,7 +60,7 @@ ADCS R0, R29 \ UMULH R4, R8, c7 \ ADCS ZR, c7 \ - ADDS R25, c3 \ + ADDS R1, c3 \ ADCS R26, c4 \ ADCS R27, c5 \ ADCS R29, c6 \ @@ -69,15 +69,15 @@ #define gfpReduce() \ \ // m = (T * N') mod R, store m in R1:R2:R3:R4 MOVD ·np+0(SB), R17 \ - MOVD ·np+8(SB), R18 \ + MOVD ·np+8(SB), R25 \ MOVD ·np+16(SB), R19 \ MOVD ·np+24(SB), R20 \ \ MUL R9, R17, R1 \ UMULH R9, R17, R2 \ - MUL R9, R18, R0 \ + MUL R9, R25, R0 \ ADDS R0, R2 \ - UMULH R9, R18, R3 \ + UMULH R9, R25, R3 \ MUL R9, R19, R0 \ ADCS R0, R3 \ UMULH R9, R19, R4 \ @@ -86,9 +86,9 @@ \ MUL R10, R17, R21 \ UMULH R10, R17, R22 \ - MUL R10, R18, R0 \ + MUL R10, R25, R0 \ ADDS R0, R22 \ - UMULH R10, R18, R23 \ + UMULH R10, R25, R23 \ MUL R10, R19, R0 \ ADCS R0, R23 \ ADDS R21, R2 \ @@ -97,7 +97,7 @@ \ MUL R11, R17, R21 \ UMULH R11, R17, R22 \ - MUL R11, R18, R0 \ + MUL R11, R25, R0 \ ADDS R0, R22 \ ADDS R21, R3 \ ADCS R22, R4 \ @@ -107,19 +107,19 @@ \ \ // m * N loadModulus(R5,R6,R7,R8) \ - mul(R17,R18,R19,R20,R21,R22,R23,R24) \ + mul(R17,R25,R19,R20,R21,R22,R23,R24) \ \ \ // Add the 512-bit intermediate to m*N - MOVD ZR, R25 \ + MOVD ZR, R0 \ ADDS R9, R17 \ - ADCS R10, R18 \ + ADCS R10, R25 \ ADCS R11, R19 \ ADCS R12, R20 \ ADCS R13, R21 \ ADCS R14, R22 \ ADCS R15, R23 \ ADCS R16, R24 \ - ADCS ZR, R25 \ + ADCS ZR, R0 \ \ \ // Our output is R21:R22:R23:R24. Reduce mod p if necessary. SUBS R5, R21, R10 \ diff --git a/crypto/bn256/google/main_test.go b/crypto/bn256/google/main_test.go index 0230f1b1993d..c0c85457beca 100644 --- a/crypto/bn256/google/main_test.go +++ b/crypto/bn256/google/main_test.go @@ -13,7 +13,7 @@ func TestRandomG2Marshal(t *testing.T) { t.Error(err) continue } - t.Logf("%d: %x\n", n, g2.Marshal()) + t.Logf("%v: %x\n", n, g2.Marshal()) } } diff --git a/crypto/crypto.go b/crypto/crypto.go index 3211957e0ab9..4567fafc729c 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -30,8 +30,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" ) var ( @@ -43,7 +43,7 @@ var errInvalidPubkey = errors.New("invalid secp256k1 public key") // Keccak256 calculates and returns the Keccak256 hash of the input data. func Keccak256(data ...[]byte) []byte { - d := sha3.NewKeccak256() + d := sha3.NewLegacyKeccak256() for _, b := range data { d.Write(b) } @@ -53,7 +53,7 @@ func Keccak256(data ...[]byte) []byte { // Keccak256Hash calculates and returns the Keccak256 hash of the input data, // converting it to an internal Hash data structure. func Keccak256Hash(data ...[]byte) (h common.Hash) { - d := sha3.NewKeccak256() + d := sha3.NewLegacyKeccak256() for _, b := range data { d.Write(b) } @@ -63,7 +63,7 @@ func Keccak256Hash(data ...[]byte) (h common.Hash) { // Keccak512 calculates and returns the Keccak512 hash of the input data. func Keccak512(data ...[]byte) []byte { - d := sha3.NewKeccak512() + d := sha3.NewLegacyKeccak512() for _, b := range data { d.Write(b) } @@ -77,9 +77,9 @@ func CreateAddress(b common.Address, nonce uint64) common.Address { } // CreateAddress2 creates an ethereum address given the address bytes, initial -// contract code and a salt. -func CreateAddress2(b common.Address, salt [32]byte, code []byte) common.Address { - return common.BytesToAddress(Keccak256([]byte{0xff}, b.Bytes(), salt[:], Keccak256(code))[12:]) +// contract code hash and a salt. +func CreateAddress2(b common.Address, salt [32]byte, inithash []byte) common.Address { + return common.BytesToAddress(Keccak256([]byte{0xff}, b.Bytes(), salt[:], inithash)[12:]) } // ToECDSA creates a private key with the given D value. diff --git a/crypto/ecies/ecies_test.go b/crypto/ecies/ecies_test.go index f33f204d5b7f..2836b8126070 100644 --- a/crypto/ecies/ecies_test.go +++ b/crypto/ecies/ecies_test.go @@ -58,12 +58,10 @@ func TestKDF(t *testing.T) { k, err := concatKDF(h, msg, nil, 64) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } if len(k) != 64 { - fmt.Printf("KDF: generated key is the wrong size (%d instead of 64\n", len(k)) - t.FailNow() + t.Fatalf("KDF: generated key is the wrong size (%d instead of 64\n", len(k)) } } @@ -93,49 +91,31 @@ func cmpPublic(pub1, pub2 PublicKey) bool { return bytes.Equal(pub1Out, pub2Out) } -// cmpPrivate returns true if the two private keys are the same. -func cmpPrivate(prv1, prv2 *PrivateKey) bool { - if prv1 == nil || prv1.D == nil { - return false - } else if prv2 == nil || prv2.D == nil { - return false - } else if prv1.D.Cmp(prv2.D) != 0 { - return false - } else { - return cmpPublic(prv1.PublicKey, prv2.PublicKey) - } -} - // Validate the ECDH component. func TestSharedKey(t *testing.T) { prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } skLen := MaxSharedKeyLength(&prv1.PublicKey) / 2 prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } sk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } sk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } if !bytes.Equal(sk1, sk2) { - fmt.Println(ErrBadSharedKeys.Error()) - t.FailNow() + t.Fatal(ErrBadSharedKeys) } } @@ -164,7 +144,7 @@ func TestSharedKeyPadding(t *testing.T) { // test shared secret generation sk1, err := prv0.GenerateShared(&prv1.PublicKey, 16, 16) if err != nil { - fmt.Println(err.Error()) + t.Log(err.Error()) } sk2, err := prv1.GenerateShared(&prv0.PublicKey, 16, 16) @@ -182,26 +162,22 @@ func TestSharedKeyPadding(t *testing.T) { func TestTooBigSharedKey(t *testing.T) { prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } _, err = prv1.GenerateShared(&prv2.PublicKey, 32, 32) if err != ErrSharedKeyTooBig { - fmt.Println("ecdh: shared key should be too large for curve") - t.FailNow() + t.Fatal("ecdh: shared key should be too large for curve") } _, err = prv2.GenerateShared(&prv1.PublicKey, 32, 32) if err != ErrSharedKeyTooBig { - fmt.Println("ecdh: shared key should be too large for curve") - t.FailNow() + t.Fatal("ecdh: shared key should be too large for curve") } } @@ -209,8 +185,7 @@ func TestTooBigSharedKey(t *testing.T) { func BenchmarkGenerateKeyP256(b *testing.B) { for i := 0; i < b.N; i++ { if _, err := GenerateKey(rand.Reader, elliptic.P256(), nil); err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } } } @@ -219,15 +194,13 @@ func BenchmarkGenerateKeyP256(b *testing.B) { func BenchmarkGenSharedKeyP256(b *testing.B) { prv, err := GenerateKey(rand.Reader, elliptic.P256(), nil) if err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } b.ResetTimer() for i := 0; i < b.N; i++ { _, err := prv.GenerateShared(&prv.PublicKey, 16, 16) if err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } } } @@ -236,15 +209,13 @@ func BenchmarkGenSharedKeyP256(b *testing.B) { func BenchmarkGenSharedKeyS256(b *testing.B) { prv, err := GenerateKey(rand.Reader, crypto.S256(), nil) if err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } b.ResetTimer() for i := 0; i < b.N; i++ { _, err := prv.GenerateShared(&prv.PublicKey, 16, 16) if err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } } } @@ -253,38 +224,32 @@ func BenchmarkGenSharedKeyS256(b *testing.B) { func TestEncryptDecrypt(t *testing.T) { prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } pt, err := prv2.Decrypt(ct, nil, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } if !bytes.Equal(pt, message) { - fmt.Println("ecies: plaintext doesn't match message") - t.FailNow() + t.Fatal("ecies: plaintext doesn't match message") } _, err = prv1.Decrypt(ct, nil, nil) if err == nil { - fmt.Println("ecies: encryption should not have succeeded") - t.FailNow() + t.Fatal("ecies: encryption should not have succeeded") } } @@ -354,50 +319,39 @@ func TestParamSelection(t *testing.T) { func testParamSelection(t *testing.T, c testCase) { params := ParamsFromCurve(c.Curve) if params == nil && c.Expected != nil { - fmt.Printf("%s (%s)\n", ErrInvalidParams.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", ErrInvalidParams.Error(), c.Name) } else if params != nil && !cmpParams(params, c.Expected) { - fmt.Printf("ecies: parameters should be invalid (%s)\n", - c.Name) - t.FailNow() + t.Fatalf("ecies: parameters should be invalid (%s)\n", c.Name) } prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Printf("%s (%s)\n", err.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", err.Error(), c.Name) } prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Printf("%s (%s)\n", err.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", err.Error(), c.Name) } message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil) if err != nil { - fmt.Printf("%s (%s)\n", err.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", err.Error(), c.Name) } pt, err := prv2.Decrypt(ct, nil, nil) if err != nil { - fmt.Printf("%s (%s)\n", err.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", err.Error(), c.Name) } if !bytes.Equal(pt, message) { - fmt.Printf("ecies: plaintext doesn't match message (%s)\n", - c.Name) - t.FailNow() + t.Fatalf("ecies: plaintext doesn't match message (%s)\n", c.Name) } _, err = prv1.Decrypt(ct, nil, nil) if err == nil { - fmt.Printf("ecies: encryption should not have succeeded (%s)\n", - c.Name) - t.FailNow() + t.Fatalf("ecies: encryption should not have succeeded (%s)\n", c.Name) } } @@ -409,23 +363,20 @@ func TestBasicKeyValidation(t *testing.T) { prv, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, &prv.PublicKey, message, nil, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } for _, b := range badBytes { ct[0] = b _, err := prv.Decrypt(ct, nil, nil) if err != ErrInvalidPublicKey { - fmt.Println("ecies: validated an invalid key") - t.FailNow() + t.Fatal("ecies: validated an invalid key") } } } @@ -463,19 +414,16 @@ func TestSharedKeyStatic(t *testing.T) { sk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } sk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } if !bytes.Equal(sk1, sk2) { - fmt.Println(ErrBadSharedKeys.Error()) - t.FailNow() + t.Fatal(ErrBadSharedKeys) } sk, _ := hex.DecodeString("167ccc13ac5e8a26b131c3446030c60fbfac6aa8e31149d0869f93626a4cdf62") diff --git a/crypto/secp256k1/curve.go b/crypto/secp256k1/curve.go index 56be235b363b..5409ee1d2cdb 100644 --- a/crypto/secp256k1/curve.go +++ b/crypto/secp256k1/curve.go @@ -310,7 +310,7 @@ var theCurve = new(BitCurve) func init() { // See SEC 2 section 2.7.1 // curve parameters taken from: - // http://www.secg.org/collateral/sec2_final.pdf + // http://www.secg.org/sec2-v2.pdf theCurve.P, _ = new(big.Int).SetString("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 0) theCurve.N, _ = new(big.Int).SetString("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 0) theCurve.B, _ = new(big.Int).SetString("0x0000000000000000000000000000000000000000000000000000000000000007", 0) diff --git a/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s b/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s index 5df561f2fc93..1e2d7ff9612d 100644 --- a/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s +++ b/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s @@ -23,7 +23,7 @@ Note: .eabi_attribute 10, 0 @ Tag_FP_arch = none .eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte .eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP - .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Agressive Speed + .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Aggressive Speed .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6 .text diff --git a/crypto/sha3/LICENSE b/crypto/sha3/LICENSE deleted file mode 100644 index 6a66aea5eafe..000000000000 --- a/crypto/sha3/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/crypto/sha3/PATENTS b/crypto/sha3/PATENTS deleted file mode 100644 index 733099041f84..000000000000 --- a/crypto/sha3/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/crypto/sha3/doc.go b/crypto/sha3/doc.go deleted file mode 100644 index 3dab530f8626..000000000000 --- a/crypto/sha3/doc.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package sha3 implements the SHA-3 fixed-output-length hash functions and -// the SHAKE variable-output-length hash functions defined by FIPS-202. -// -// Both types of hash function use the "sponge" construction and the Keccak -// permutation. For a detailed specification see http://keccak.noekeon.org/ -// -// -// Guidance -// -// If you aren't sure what function you need, use SHAKE256 with at least 64 -// bytes of output. The SHAKE instances are faster than the SHA3 instances; -// the latter have to allocate memory to conform to the hash.Hash interface. -// -// If you need a secret-key MAC (message authentication code), prepend the -// secret key to the input, hash with SHAKE256 and read at least 32 bytes of -// output. -// -// -// Security strengths -// -// The SHA3-x (x equals 224, 256, 384, or 512) functions have a security -// strength against preimage attacks of x bits. Since they only produce "x" -// bits of output, their collision-resistance is only "x/2" bits. -// -// The SHAKE-256 and -128 functions have a generic security strength of 256 and -// 128 bits against all attacks, provided that at least 2x bits of their output -// is used. Requesting more than 64 or 32 bytes of output, respectively, does -// not increase the collision-resistance of the SHAKE functions. -// -// -// The sponge construction -// -// A sponge builds a pseudo-random function from a public pseudo-random -// permutation, by applying the permutation to a state of "rate + capacity" -// bytes, but hiding "capacity" of the bytes. -// -// A sponge starts out with a zero state. To hash an input using a sponge, up -// to "rate" bytes of the input are XORed into the sponge's state. The sponge -// is then "full" and the permutation is applied to "empty" it. This process is -// repeated until all the input has been "absorbed". The input is then padded. -// The digest is "squeezed" from the sponge in the same way, except that output -// output is copied out instead of input being XORed in. -// -// A sponge is parameterized by its generic security strength, which is equal -// to half its capacity; capacity + rate is equal to the permutation's width. -// Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means -// that the security strength of a sponge instance is equal to (1600 - bitrate) / 2. -// -// -// Recommendations -// -// The SHAKE functions are recommended for most new uses. They can produce -// output of arbitrary length. SHAKE256, with an output length of at least -// 64 bytes, provides 256-bit security against all attacks. The Keccak team -// recommends it for most applications upgrading from SHA2-512. (NIST chose a -// much stronger, but much slower, sponge instance for SHA3-512.) -// -// The SHA-3 functions are "drop-in" replacements for the SHA-2 functions. -// They produce output of the same length, with the same security strengths -// against all attacks. This means, in particular, that SHA3-256 only has -// 128-bit collision resistance, because its output length is 32 bytes. -package sha3 diff --git a/crypto/sha3/hashes.go b/crypto/sha3/hashes.go deleted file mode 100644 index fa0d7b436245..000000000000 --- a/crypto/sha3/hashes.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sha3 - -// This file provides functions for creating instances of the SHA-3 -// and SHAKE hash functions, as well as utility functions for hashing -// bytes. - -import ( - "hash" -) - -// NewKeccak256 creates a new Keccak-256 hash. -func NewKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} } - -// NewKeccak512 creates a new Keccak-512 hash. -func NewKeccak512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x01} } - -// New224 creates a new SHA3-224 hash. -// Its generic security strength is 224 bits against preimage attacks, -// and 112 bits against collision attacks. -func New224() hash.Hash { return &state{rate: 144, outputLen: 28, dsbyte: 0x06} } - -// New256 creates a new SHA3-256 hash. -// Its generic security strength is 256 bits against preimage attacks, -// and 128 bits against collision attacks. -func New256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x06} } - -// New384 creates a new SHA3-384 hash. -// Its generic security strength is 384 bits against preimage attacks, -// and 192 bits against collision attacks. -func New384() hash.Hash { return &state{rate: 104, outputLen: 48, dsbyte: 0x06} } - -// New512 creates a new SHA3-512 hash. -// Its generic security strength is 512 bits against preimage attacks, -// and 256 bits against collision attacks. -func New512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x06} } - -// Sum224 returns the SHA3-224 digest of the data. -func Sum224(data []byte) (digest [28]byte) { - h := New224() - h.Write(data) - h.Sum(digest[:0]) - return -} - -// Sum256 returns the SHA3-256 digest of the data. -func Sum256(data []byte) (digest [32]byte) { - h := New256() - h.Write(data) - h.Sum(digest[:0]) - return -} - -// Sum384 returns the SHA3-384 digest of the data. -func Sum384(data []byte) (digest [48]byte) { - h := New384() - h.Write(data) - h.Sum(digest[:0]) - return -} - -// Sum512 returns the SHA3-512 digest of the data. -func Sum512(data []byte) (digest [64]byte) { - h := New512() - h.Write(data) - h.Sum(digest[:0]) - return -} diff --git a/crypto/sha3/sha3_test.go b/crypto/sha3/sha3_test.go deleted file mode 100644 index 0e33676ce64b..000000000000 --- a/crypto/sha3/sha3_test.go +++ /dev/null @@ -1,297 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sha3 - -// Tests include all the ShortMsgKATs provided by the Keccak team at -// https://github.com/gvanas/KeccakCodePackage -// -// They only include the zero-bit case of the bitwise testvectors -// published by NIST in the draft of FIPS-202. - -import ( - "bytes" - "compress/flate" - "encoding/hex" - "encoding/json" - "hash" - "os" - "strings" - "testing" -) - -const ( - testString = "brekeccakkeccak koax koax" - katFilename = "testdata/keccakKats.json.deflate" -) - -// Internal-use instances of SHAKE used to test against KATs. -func newHashShake128() hash.Hash { - return &state{rate: 168, dsbyte: 0x1f, outputLen: 512} -} -func newHashShake256() hash.Hash { - return &state{rate: 136, dsbyte: 0x1f, outputLen: 512} -} - -// testDigests contains functions returning hash.Hash instances -// with output-length equal to the KAT length for both SHA-3 and -// SHAKE instances. -var testDigests = map[string]func() hash.Hash{ - "SHA3-224": New224, - "SHA3-256": New256, - "SHA3-384": New384, - "SHA3-512": New512, - "SHAKE128": newHashShake128, - "SHAKE256": newHashShake256, -} - -// testShakes contains functions that return ShakeHash instances for -// testing the ShakeHash-specific interface. -var testShakes = map[string]func() ShakeHash{ - "SHAKE128": NewShake128, - "SHAKE256": NewShake256, -} - -// structs used to marshal JSON test-cases. -type KeccakKats struct { - Kats map[string][]struct { - Digest string `json:"digest"` - Length int64 `json:"length"` - Message string `json:"message"` - } -} - -func testUnalignedAndGeneric(t *testing.T, testf func(impl string)) { - xorInOrig, copyOutOrig := xorIn, copyOut - xorIn, copyOut = xorInGeneric, copyOutGeneric - testf("generic") - if xorImplementationUnaligned != "generic" { - xorIn, copyOut = xorInUnaligned, copyOutUnaligned - testf("unaligned") - } - xorIn, copyOut = xorInOrig, copyOutOrig -} - -// TestKeccakKats tests the SHA-3 and Shake implementations against all the -// ShortMsgKATs from https://github.com/gvanas/KeccakCodePackage -// (The testvectors are stored in keccakKats.json.deflate due to their length.) -func TestKeccakKats(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - // Read the KATs. - deflated, err := os.Open(katFilename) - if err != nil { - t.Errorf("error opening %s: %s", katFilename, err) - } - file := flate.NewReader(deflated) - dec := json.NewDecoder(file) - var katSet KeccakKats - err = dec.Decode(&katSet) - if err != nil { - t.Errorf("error decoding KATs: %s", err) - } - - // Do the KATs. - for functionName, kats := range katSet.Kats { - d := testDigests[functionName]() - for _, kat := range kats { - d.Reset() - in, err := hex.DecodeString(kat.Message) - if err != nil { - t.Errorf("error decoding KAT: %s", err) - } - d.Write(in[:kat.Length/8]) - got := strings.ToUpper(hex.EncodeToString(d.Sum(nil))) - if got != kat.Digest { - t.Errorf("function=%s, implementation=%s, length=%d\nmessage:\n %s\ngot:\n %s\nwanted:\n %s", - functionName, impl, kat.Length, kat.Message, got, kat.Digest) - t.Logf("wanted %+v", kat) - t.FailNow() - } - continue - } - } - }) -} - -// TestUnalignedWrite tests that writing data in an arbitrary pattern with -// small input buffers. -func TestUnalignedWrite(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - buf := sequentialBytes(0x10000) - for alg, df := range testDigests { - d := df() - d.Reset() - d.Write(buf) - want := d.Sum(nil) - d.Reset() - for i := 0; i < len(buf); { - // Cycle through offsets which make a 137 byte sequence. - // Because 137 is prime this sequence should exercise all corner cases. - offsets := [17]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1} - for _, j := range offsets { - if v := len(buf) - i; v < j { - j = v - } - d.Write(buf[i : i+j]) - i += j - } - } - got := d.Sum(nil) - if !bytes.Equal(got, want) { - t.Errorf("Unaligned writes, implementation=%s, alg=%s\ngot %q, want %q", impl, alg, got, want) - } - } - }) -} - -// TestAppend checks that appending works when reallocation is necessary. -func TestAppend(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - d := New224() - - for capacity := 2; capacity <= 66; capacity += 64 { - // The first time around the loop, Sum will have to reallocate. - // The second time, it will not. - buf := make([]byte, 2, capacity) - d.Reset() - d.Write([]byte{0xcc}) - buf = d.Sum(buf) - expected := "0000DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" - if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { - t.Errorf("got %s, want %s", got, expected) - } - } - }) -} - -// TestAppendNoRealloc tests that appending works when no reallocation is necessary. -func TestAppendNoRealloc(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - buf := make([]byte, 1, 200) - d := New224() - d.Write([]byte{0xcc}) - buf = d.Sum(buf) - expected := "00DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" - if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { - t.Errorf("%s: got %s, want %s", impl, got, expected) - } - }) -} - -// TestSqueezing checks that squeezing the full output a single time produces -// the same output as repeatedly squeezing the instance. -func TestSqueezing(t *testing.T) { - testUnalignedAndGeneric(t, func(impl string) { - for functionName, newShakeHash := range testShakes { - d0 := newShakeHash() - d0.Write([]byte(testString)) - ref := make([]byte, 32) - d0.Read(ref) - - d1 := newShakeHash() - d1.Write([]byte(testString)) - var multiple []byte - for range ref { - one := make([]byte, 1) - d1.Read(one) - multiple = append(multiple, one...) - } - if !bytes.Equal(ref, multiple) { - t.Errorf("%s (%s): squeezing %d bytes one at a time failed", functionName, impl, len(ref)) - } - } - }) -} - -// sequentialBytes produces a buffer of size consecutive bytes 0x00, 0x01, ..., used for testing. -func sequentialBytes(size int) []byte { - result := make([]byte, size) - for i := range result { - result[i] = byte(i) - } - return result -} - -// BenchmarkPermutationFunction measures the speed of the permutation function -// with no input data. -func BenchmarkPermutationFunction(b *testing.B) { - b.SetBytes(int64(200)) - var lanes [25]uint64 - for i := 0; i < b.N; i++ { - keccakF1600(&lanes) - } -} - -// benchmarkHash tests the speed to hash num buffers of buflen each. -func benchmarkHash(b *testing.B, h hash.Hash, size, num int) { - b.StopTimer() - h.Reset() - data := sequentialBytes(size) - b.SetBytes(int64(size * num)) - b.StartTimer() - - var state []byte - for i := 0; i < b.N; i++ { - for j := 0; j < num; j++ { - h.Write(data) - } - state = h.Sum(state[:0]) - } - b.StopTimer() - h.Reset() -} - -// benchmarkShake is specialized to the Shake instances, which don't -// require a copy on reading output. -func benchmarkShake(b *testing.B, h ShakeHash, size, num int) { - b.StopTimer() - h.Reset() - data := sequentialBytes(size) - d := make([]byte, 32) - - b.SetBytes(int64(size * num)) - b.StartTimer() - - for i := 0; i < b.N; i++ { - h.Reset() - for j := 0; j < num; j++ { - h.Write(data) - } - h.Read(d) - } -} - -func BenchmarkSha3_512_MTU(b *testing.B) { benchmarkHash(b, New512(), 1350, 1) } -func BenchmarkSha3_384_MTU(b *testing.B) { benchmarkHash(b, New384(), 1350, 1) } -func BenchmarkSha3_256_MTU(b *testing.B) { benchmarkHash(b, New256(), 1350, 1) } -func BenchmarkSha3_224_MTU(b *testing.B) { benchmarkHash(b, New224(), 1350, 1) } - -func BenchmarkShake128_MTU(b *testing.B) { benchmarkShake(b, NewShake128(), 1350, 1) } -func BenchmarkShake256_MTU(b *testing.B) { benchmarkShake(b, NewShake256(), 1350, 1) } -func BenchmarkShake256_16x(b *testing.B) { benchmarkShake(b, NewShake256(), 16, 1024) } -func BenchmarkShake256_1MiB(b *testing.B) { benchmarkShake(b, NewShake256(), 1024, 1024) } - -func BenchmarkSha3_512_1MiB(b *testing.B) { benchmarkHash(b, New512(), 1024, 1024) } - -func Example_sum() { - buf := []byte("some data to hash") - // A hash needs to be 64 bytes long to have 256-bit collision resistance. - h := make([]byte, 64) - // Compute a 64-byte hash of buf and put it in h. - ShakeSum256(h, buf) -} - -func Example_mac() { - k := []byte("this is a secret key; you should generate a strong random key that's at least 32 bytes long") - buf := []byte("and this is some data to authenticate") - // A MAC with 32 bytes of output has 256-bit security strength -- if you use at least a 32-byte-long key. - h := make([]byte, 32) - d := NewShake256() - // Write the key into the hash. - d.Write(k) - // Now write the data. - d.Write(buf) - // Read 32 bytes of output from the hash into h. - d.Read(h) -} diff --git a/crypto/sha3/testdata/keccakKats.json.deflate b/crypto/sha3/testdata/keccakKats.json.deflate deleted file mode 100644 index 62e85ae24236..000000000000 Binary files a/crypto/sha3/testdata/keccakKats.json.deflate and /dev/null differ diff --git a/crypto/signature_cgo.go b/crypto/signature_cgo.go index 340bfc221eae..aadf028d2604 100644 --- a/crypto/signature_cgo.go +++ b/crypto/signature_cgo.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build !nacl,!js,!nocgo +// +build !nacl,!js,cgo package crypto diff --git a/crypto/signature_nocgo.go b/crypto/signature_nocgo.go index e8fa18ed475d..90d072cda70e 100644 --- a/crypto/signature_nocgo.go +++ b/crypto/signature_nocgo.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build nacl js nocgo +// +build nacl js !cgo package crypto diff --git a/dashboard/assets.go b/dashboard/assets.go index f3e7cf981506..eb7a8271035c 100644 --- a/dashboard/assets.go +++ b/dashboard/assets.go @@ -2,6 +2,7 @@ // sources: // assets/index.html // assets/bundle.js +// assets/bundle.js.map package dashboard @@ -71,7 +72,7 @@ var _indexHtml = []byte(`
- + `) @@ -87,40536 +88,30631 @@ func indexHtml() (*asset, error) { } info := bindataFileInfo{name: "index.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x22, 0xc8, 0x3d, 0x86, 0x2f, 0xb4, 0x6a, 0x1f, 0xda, 0xd, 0x54, 0x14, 0xa3, 0x6e, 0x80, 0x56, 0x28, 0xea, 0x44, 0xcf, 0xf5, 0xf2, 0xe, 0xad, 0x19, 0xf5, 0x93, 0xd6, 0x8d, 0x6d, 0x2f, 0x35}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6a, 0xe4, 0x19, 0xb4, 0xf4, 0x89, 0xd3, 0x51, 0xa8, 0xde, 0x87, 0x57, 0x96, 0x17, 0x3f, 0x43, 0xa6, 0xa0, 0x7a, 0x6f, 0xba, 0xeb, 0x27, 0xcf, 0x41, 0x28, 0x6e, 0x85, 0x91, 0xa6, 0x48, 0xcf}} return a, nil } //nolint:misspell -var _bundleJs = []byte((((((((((`!function(modules) { - function __webpack_require__(moduleId) { - if (installedModules[moduleId]) return installedModules[moduleId].exports; - var module = installedModules[moduleId] = { - i: moduleId, +var _bundleJs = []byte((((`!function(e) { + var t = {}; + function n(r) { + if (t[r]) return t[r].exports; + var o = t[r] = { + i: r, l: !1, exports: {} }; - return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), - module.l = !0, module.exports; + return e[r].call(o.exports, o, o.exports, n), o.l = !0, o.exports; } - var installedModules = {}; - __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) { - __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, { - configurable: !1, + n.m = e, n.c = t, n.d = function(e, t, r) { + n.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, - get: getter + get: r }); - }, __webpack_require__.n = function(module) { - var getter = module && module.__esModule ? function() { - return module.default; - } : function() { - return module; - }; - return __webpack_require__.d(getter, "a", getter), getter; - }, __webpack_require__.o = function(object, property) { - return Object.prototype.hasOwnProperty.call(object, property); - }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 375); -}([ function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - "production" === process.env.NODE_ENV ? module.exports = __webpack_require__(376) : module.exports = __webpack_require__(377); - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - (function(process) { - if ("production" !== process.env.NODE_ENV) { - var REACT_ELEMENT_TYPE = "function" == typeof Symbol && Symbol.for && Symbol.for("react.element") || 60103, isValidElement = function(object) { - return "object" == typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE; - }; - module.exports = __webpack_require__(418)(isValidElement, !0); - } else module.exports = __webpack_require__(419)(); - }).call(exports, __webpack_require__(2)); -}, function(module, exports) { - function defaultSetTimout() { - throw new Error("setTimeout has not been defined"); - } - function defaultClearTimeout() { - throw new Error("clearTimeout has not been defined"); - } - function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) return setTimeout(fun, 0); - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) return cachedSetTimeout = setTimeout, - setTimeout(fun, 0); - try { - return cachedSetTimeout(fun, 0); - } catch (e) { - try { - return cachedSetTimeout.call(null, fun, 0); - } catch (e) { - return cachedSetTimeout.call(this, fun, 0); - } - } - } - function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) return clearTimeout(marker); - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) return cachedClearTimeout = clearTimeout, - clearTimeout(marker); - try { - return cachedClearTimeout(marker); - } catch (e) { - try { - return cachedClearTimeout.call(null, marker); - } catch (e) { - return cachedClearTimeout.call(this, marker); - } - } - } - function cleanUpNextTick() { - draining && currentQueue && (draining = !1, currentQueue.length ? queue = currentQueue.concat(queue) : queueIndex = -1, - queue.length && drainQueue()); - } - function drainQueue() { - if (!draining) { - var timeout = runTimeout(cleanUpNextTick); - draining = !0; - for (var len = queue.length; len; ) { - for (currentQueue = queue, queue = []; ++queueIndex < len; ) currentQueue && currentQueue[queueIndex].run(); - queueIndex = -1, len = queue.length; - } - currentQueue = null, draining = !1, runClearTimeout(timeout); - } - } - function Item(fun, array) { - this.fun = fun, this.array = array; - } - function noop() {} - var cachedSetTimeout, cachedClearTimeout, process = module.exports = {}; - !function() { - try { - cachedSetTimeout = "function" == typeof setTimeout ? setTimeout : defaultSetTimout; - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - cachedClearTimeout = "function" == typeof clearTimeout ? clearTimeout : defaultClearTimeout; - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } - }(); - var currentQueue, queue = [], draining = !1, queueIndex = -1; - process.nextTick = function(fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) for (var i = 1; i < arguments.length; i++) args[i - 1] = arguments[i]; - queue.push(new Item(fun, args)), 1 !== queue.length || draining || runTimeout(drainQueue); - }, Item.prototype.run = function() { - this.fun.apply(null, this.array); - }, process.title = "browser", process.browser = !0, process.env = {}, process.argv = [], - process.version = "", process.versions = {}, process.on = noop, process.addListener = noop, - process.once = noop, process.off = noop, process.removeListener = noop, process.removeAllListeners = noop, - process.emit = noop, process.prependListener = noop, process.prependOnceListener = noop, - process.listeners = function(name) { - return []; - }, process.binding = function(name) { - throw new Error("process.binding is not supported"); - }, process.cwd = function() { - return "/"; - }, process.chdir = function(dir) { - throw new Error("process.chdir is not supported"); - }, process.umask = function() { - return 0; - }; -}, function(module, exports, __webpack_require__) { - var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; - !function() { - "use strict"; - function classNames() { - for (var classes = [], i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (arg) { - var argType = typeof arg; - if ("string" === argType || "number" === argType) classes.push(arg); else if (Array.isArray(arg)) classes.push(classNames.apply(null, arg)); else if ("object" === argType) for (var key in arg) hasOwn.call(arg, key) && arg[key] && classes.push(key); - } - } - return classes.join(" "); - } - var hasOwn = {}.hasOwnProperty; - void 0 !== module && module.exports ? module.exports = classNames : (__WEBPACK_AMD_DEFINE_ARRAY__ = [], - void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = function() { - return classNames; - }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - }(); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - __webpack_require__.d(__webpack_exports__, "c", function() { - return PRESENTATION_ATTRIBUTES; - }), __webpack_require__.d(__webpack_exports__, "a", function() { - return EVENT_ATTRIBUTES; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return SCALE_TYPES; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return LEGEND_TYPES; - }), __webpack_require__.d(__webpack_exports__, "j", function() { - return getDisplayName; - }), __webpack_require__.d(__webpack_exports__, "h", function() { - return findAllByType; - }), __webpack_require__.d(__webpack_exports__, "i", function() { - return findChildByType; - }), __webpack_require__.d(__webpack_exports__, "k", function() { - return getPresentationAttributes; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return filterEventAttributes; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return filterEventsOfChild; - }), __webpack_require__.d(__webpack_exports__, "q", function() { - return validateWidthHeight; - }), __webpack_require__.d(__webpack_exports__, "n", function() { - return isSsr; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return filterSvgElements; - }), __webpack_require__.d(__webpack_exports__, "m", function() { - return isChildrenEqual; - }), __webpack_require__.d(__webpack_exports__, "p", function() { - return renderByOrder; - }), __webpack_require__.d(__webpack_exports__, "l", function() { - return getReactEventByType; - }), __webpack_require__.d(__webpack_exports__, "o", function() { - return parseChildIndex; - }); - var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isString__), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_8__PureRender__ = __webpack_require__(5), PRESENTATION_ATTRIBUTES = { - alignmentBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - angle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - baselineShift: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - clip: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - clipPath: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - clipRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - color: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - colorInterpolation: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - colorInterpolationFilters: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - colorProfile: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - colorRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - cursor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - direction: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "ltr", "rtl", "inherit" ]), - display: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - dominantBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - enableBackground: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - fill: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - fillOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]), - fillRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "nonzero", "evenodd", "inherit" ]), - filter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - floodColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - floodOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]), - font: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - fontFamily: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - fontSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - fontSizeAdjust: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - fontStretch: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "wider", "narrower", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded", "inherit" ]), - fontStyle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "italic", "oblique", "inherit" ]), - fontVariant: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "small-caps", "inherit" ]), - fontWeight: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "bold", "bolder", "lighter", 100, 200, 300, 400, 500, 600, 700, 800, 900, "inherit" ]), - glyphOrientationHorizontal: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - glyphOrientationVertical: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - imageRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "optimizeQuality", "inherit" ]), - kerning: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - letterSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - lightingColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - markerEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - markerMid: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - markerStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - mask: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - opacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - overflow: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visible", "hidden", "scroll", "auto", "inherit" ]), - pointerEvents: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visiblePainted", "visibleFill", "visibleStroke", "visible", "painted", "fill", "stroke", "all", "none", "inherit" ]), - shapeRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "crispEdges", "geometricPrecision", "inherit" ]), - stopColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - stopOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - stroke: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - strokeDasharray: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - strokeDashoffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - strokeLinecap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "butt", "round", "square", "inherit" ]), - strokeLinejoin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "miter", "round", "bevel", "inherit" ]), - strokeMiterlimit: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - strokeOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - strokeWidth: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - textAnchor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "start", "middle", "end", "inherit" ]), - textDecoration: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "none", "underline", "overline", "line-through", "blink", "inherit" ]), - textRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "optimizeLegibility", "geometricPrecision", "inherit" ]), - unicodeBidi: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "embed", "bidi-override", "inherit" ]), - visibility: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visible", "hidden", "collapse", "inherit" ]), - wordSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - writingMode: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "lr-tb", "rl-tb", "tb-rl", "lr", "rl", "tb", "inherit" ]), - transform: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, - width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - dx: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - dy: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - x: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - y: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - r: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - radius: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.array ]) - }, EVENT_ATTRIBUTES = { - onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseOver: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseOut: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onTouchEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onTouchMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onTouchStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onTouchCancel: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func - }, REACT_BROWSER_EVENT_MAP = { - click: "onClick", - mousedown: "onMouseDown", - mouseup: "onMouseUp", - mouseover: "onMouseOver", - mousemove: "onMouseMove", - mouseout: "onMouseOut", - mouseenter: "onMouseEnter", - mouseleave: "onMouseLeave", - touchcancel: "onTouchCancel", - touchend: "onTouchEnd", - touchmove: "onTouchMove", - touchstart: "onTouchStart" - }, SCALE_TYPES = [ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ], LEGEND_TYPES = [ "plainline", "line", "square", "rect", "circle", "cross", "diamond", "star", "triangle", "wye", "none" ], getDisplayName = function(Comp) { - return Comp ? "string" == typeof Comp ? Comp : Comp.displayName || Comp.name || "Component" : ""; - }, findAllByType = function(children, type) { - var result = [], types = []; - return types = __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(type) ? type.map(function(t) { - return getDisplayName(t); - }) : [ getDisplayName(type) ], __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(child) { - var childType = child && child.type && (child.type.displayName || child.type.name); - -1 !== types.indexOf(childType) && result.push(child); - }), result; - }, findChildByType = function(children, type) { - var result = findAllByType(children, type); - return result && result[0]; - }, getPresentationAttributes = function(el) { - if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null; - var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el; - if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null; - var out = null; - for (var i in props) ({}).hasOwnProperty.call(props, i) && PRESENTATION_ATTRIBUTES[i] && (out || (out = {}), - out[i] = props[i]); - return out; - }, getEventHandlerOfElement = function(originalHandler, props) { - return function(e) { - return originalHandler(props, e), null; - }; - }, filterEventAttributes = function(el, newHandler) { - var wrapCallback = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; - if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null; - var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el; - if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null; - var out = null; - for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && (out || (out = {}), - out[i] = newHandler || (wrapCallback ? getEventHandlerOfElement(props[i], props) : props[i])); - return out; - }, getEventHandlerOfChild = function(originalHandler, data, index) { - return function(e) { - return originalHandler(data, index, e), null; - }; - }, filterEventsOfChild = function(props, data, index) { - if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null; - var out = null; - for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(props[i]) && (out || (out = {}), - out[i] = getEventHandlerOfChild(props[i], data, index)); - return out; - }, validateWidthHeight = function(el) { - if (!el || !el.props) return !1; - var _el$props = el.props, width = _el$props.width, height = _el$props.height; - return !(!Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.h)(width) || width <= 0 || !Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.h)(height) || height <= 0); - }, isSsr = function() { - return !("undefined" != typeof window && window.document && window.document.createElement && window.setTimeout); - }, SVG_TAGS = [ "a", "altGlyph", "altGlyphDef", "altGlyphItem", "animate", "animateColor", "animateMotion", "animateTransform", "circle", "clipPath", "color-profile", "cursor", "defs", "desc", "ellipse", "feBlend", "feColormatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "font", "font-face", "font-face-format", "font-face-name", "font-face-url", "foreignObject", "g", "glyph", "glyphRef", "hkern", "image", "line", "lineGradient", "marker", "mask", "metadata", "missing-glyph", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tref", "tspan", "use", "view", "vkern" ], isSvgElement = function(child) { - return child && child.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(child.type) && SVG_TAGS.indexOf(child.type) >= 0; - }, filterSvgElements = function(children) { - var svgElements = []; - return __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(entry) { - entry && entry.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(entry.type) && SVG_TAGS.indexOf(entry.type) >= 0 && svgElements.push(entry); - }), svgElements; - }, isSingleChildEqual = function(nextChild, prevChild) { - if (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) return !0; - if (!__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && !__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) { - var _ref = nextChild.props || {}, nextChildren = _ref.children, nextProps = _objectWithoutProperties(_ref, [ "children" ]), _ref2 = prevChild.props || {}, prevChildren = _ref2.children, prevProps = _objectWithoutProperties(_ref2, [ "children" ]); - return nextChildren && prevChildren ? Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren) : !nextChildren && !prevChildren && Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps); - } - return !1; - }, isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) { - if (nextChildren === prevChildren) return !0; - if (__WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren) !== __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(prevChildren)) return !1; - var count = __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren); - if (0 === count) return !0; - if (1 === count) return isSingleChildEqual(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChildren) ? nextChildren[0] : nextChildren, __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChildren) ? prevChildren[0] : prevChildren); - for (var i = 0; i < count; i++) { - var nextChild = nextChildren[i], prevChild = prevChildren[i]; - if (__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChild) || __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChild)) { - if (!isChildrenEqual(nextChild, prevChild)) return !1; - } else if (!isSingleChildEqual(nextChild, prevChild)) return !1; - } - return !0; - }, renderByOrder = function(children, renderMap) { - var elements = [], record = {}; - return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(child, index) { - if (child && isSvgElement(child)) elements.push(child); else if (child && renderMap[getDisplayName(child.type)]) { - var displayName = getDisplayName(child.type), _renderMap$displayNam = renderMap[displayName], handler = _renderMap$displayNam.handler, once = _renderMap$displayNam.once; - if (once && !record[displayName] || !once) { - var results = handler(child, displayName, index); - __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(results) ? elements = [ elements ].concat(_toConsumableArray(results)) : elements.push(results), - record[displayName] = !0; - } - } - }), elements; - }, getReactEventByType = function(e) { - var type = e && e.type; - return type && REACT_BROWSER_EVENT_MAP[type] ? REACT_BROWSER_EVENT_MAP[type] : null; - }, parseChildIndex = function(child, children) { - var result = -1; - return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(entry, index) { - entry === child && (result = index); - }), result; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function shallowEqual(a, b) { - for (var key in a) if ({}.hasOwnProperty.call(a, key) && (!{}.hasOwnProperty.call(b, key) || a[key] !== b[key])) return !1; - for (var _key in b) if ({}.hasOwnProperty.call(b, _key) && !{}.hasOwnProperty.call(a, _key)) return !1; - return !0; - } - function shouldComponentUpdate(props, state) { - return !shallowEqual(props, this.props) || !shallowEqual(state, this.state); - } - function pureRenderDecorator(component) { - component.prototype.shouldComponentUpdate = shouldComponentUpdate; - } - __webpack_exports__.b = shallowEqual, __webpack_exports__.a = pureRenderDecorator; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _assign = __webpack_require__(222), _assign2 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_assign); - exports.default = _assign2.default || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0, exports.default = function(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - }; -}, function(module, exports, __webpack_require__) { - function isFunction(value) { - if (!isObject(value)) return !1; - var tag = baseGetTag(value); - return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; - } - var baseGetTag = __webpack_require__(41), isObject = __webpack_require__(32), asyncTag = "[object AsyncFunction]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", proxyTag = "[object Proxy]"; - module.exports = isFunction; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_require__.d(__webpack_exports__, "j", function() { - return mathSign; - }), __webpack_require__.d(__webpack_exports__, "i", function() { - return isPercent; - }), __webpack_require__.d(__webpack_exports__, "h", function() { - return isNumber; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return isNumOrStr; - }), __webpack_require__.d(__webpack_exports__, "k", function() { - return uniqueId; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return getPercentValue; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return getAnyElementOfObject; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return hasDuplicate; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return interpolateNumber; - }), __webpack_require__.d(__webpack_exports__, "a", function() { - return findEntryInArray; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return getLinearRegression; - }); - var __WEBPACK_IMPORTED_MODULE_0_lodash_get__ = __webpack_require__(174), __WEBPACK_IMPORTED_MODULE_0_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_get__), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__ = __webpack_require__(272), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__), __WEBPACK_IMPORTED_MODULE_4_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isString__), mathSign = function(value) { - return 0 === value ? 0 : value > 0 ? 1 : -1; - }, isPercent = function(value) { - return __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value) && value.indexOf("%") === value.length - 1; - }, isNumber = function(value) { - return __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default()(value) && !__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value); - }, isNumOrStr = function(value) { - return isNumber(value) || __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value); - }, idCounter = 0, uniqueId = function(prefix) { - var id = ++idCounter; - return "" + (prefix || "") + id; - }, getPercentValue = function(percent, totalValue) { - var defaultValue = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, validate = arguments.length > 3 && void 0 !== arguments[3] && arguments[3]; - if (!isNumber(percent) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(percent)) return defaultValue; - var value = void 0; - if (isPercent(percent)) { - var index = percent.indexOf("%"); - value = totalValue * parseFloat(percent.slice(0, index)) / 100; - } else value = +percent; - return __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value) && (value = defaultValue), - validate && value > totalValue && (value = totalValue), value; - }, getAnyElementOfObject = function(obj) { - if (!obj) return null; - var keys = Object.keys(obj); - return keys && keys.length ? obj[keys[0]] : null; - }, hasDuplicate = function(ary) { - if (!__WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default()(ary)) return !1; - for (var len = ary.length, cache = {}, i = 0; i < len; i++) { - if (cache[ary[i]]) return !0; - cache[ary[i]] = !0; - } - return !1; - }, interpolateNumber = function(numberA, numberB) { - return isNumber(numberA) && isNumber(numberB) ? function(t) { - return numberA + t * (numberB - numberA); - } : function() { - return numberB; - }; - }, findEntryInArray = function(ary, specifiedKey, specifiedValue) { - return ary && ary.length ? ary.find(function(entry) { - return entry && __WEBPACK_IMPORTED_MODULE_0_lodash_get___default()(entry, specifiedKey) === specifiedValue; - }) : null; - }, getLinearRegression = function(data) { - if (!data || !data.length) return null; - for (var len = data.length, xsum = 0, ysum = 0, xysum = 0, xxsum = 0, xmin = 1 / 0, xmax = -1 / 0, i = 0; i < len; i++) xsum += data[i].cx, - ysum += data[i].cy, xysum += data[i].cx * data[i].cy, xxsum += data[i].cx * data[i].cx, - xmin = Math.min(xmin, data[i].cx), xmax = Math.max(xmax, data[i].cx); - var a = len * xxsum != xsum * xsum ? (len * xysum - xsum * ysum) / (len * xxsum - xsum * xsum) : 0; - return { - xmin: xmin, - xmax: xmax, - a: a, - b: (ysum - a * xsum) / len - }; - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function getDefaultTheme() { - return defaultTheme || (defaultTheme = (0, _createMuiTheme2.default)()); - } - Object.defineProperty(exports, "__esModule", { + }, n.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { value: !0 - }), exports.sheetsManager = void 0; - var _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys), _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _map = __webpack_require__(440), _map2 = _interopRequireDefault(_map), _minSafeInteger = __webpack_require__(456), _minSafeInteger2 = _interopRequireDefault(_minSafeInteger), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _hoistNonReactStatics = __webpack_require__(162), _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics), _getDisplayName = __webpack_require__(244), _getDisplayName2 = _interopRequireDefault(_getDisplayName), _wrapDisplayName = __webpack_require__(79), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), _contextTypes = __webpack_require__(459), _contextTypes2 = _interopRequireDefault(_contextTypes), _jss = __webpack_require__(246), _ns = __webpack_require__(245), ns = function(obj) { - if (obj && obj.__esModule) return obj; - var newObj = {}; - if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]); - return newObj.default = obj, newObj; - }(_ns), _jssPreset = __webpack_require__(481), _jssPreset2 = _interopRequireDefault(_jssPreset), _createMuiTheme = __webpack_require__(161), _createMuiTheme2 = _interopRequireDefault(_createMuiTheme), _themeListener = __webpack_require__(160), _themeListener2 = _interopRequireDefault(_themeListener), _createGenerateClassName = __webpack_require__(494), _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName), _getStylesCreator = __webpack_require__(495), _getStylesCreator2 = _interopRequireDefault(_getStylesCreator), jss = (0, - _jss.create)((0, _jssPreset2.default)()), generateClassName = (0, _createGenerateClassName2.default)(), indexCounter = _minSafeInteger2.default, sheetsManager = exports.sheetsManager = new _map2.default(), noopTheme = {}, defaultTheme = void 0, withStyles = function(stylesOrCreator) { - var options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; - return function(Component) { - var _options$withTheme = options.withTheme, withTheme = void 0 !== _options$withTheme && _options$withTheme, _options$flip = options.flip, flip = void 0 === _options$flip ? null : _options$flip, name = options.name, styleSheetOptions = (0, - _objectWithoutProperties3.default)(options, [ "withTheme", "flip", "name" ]), stylesCreator = (0, - _getStylesCreator2.default)(stylesOrCreator), listenToTheme = stylesCreator.themingEnabled || withTheme || "string" == typeof name; - indexCounter += 1, stylesCreator.options.index = indexCounter, "production" !== process.env.NODE_ENV && (0, - _warning2.default)(indexCounter < 0, [ "Material-UI: you might have a memory leak.", "The indexCounter is not supposed to grow that much." ].join(" ")); - var WithStyles = function(_React$Component) { - function WithStyles(props, context) { - (0, _classCallCheck3.default)(this, WithStyles); - var _this = (0, _possibleConstructorReturn3.default)(this, (WithStyles.__proto__ || (0, - _getPrototypeOf2.default)(WithStyles)).call(this, props, context)); - _this.state = {}, _this.disableStylesGeneration = !1, _this.jss = null, _this.sheetOptions = null, - _this.sheetsManager = sheetsManager, _this.stylesCreatorSaved = null, _this.theme = null, - _this.unsubscribeId = null, _this.jss = _this.context[ns.jss] || jss; - var muiThemeProviderOptions = _this.context.muiThemeProviderOptions; - return muiThemeProviderOptions && (muiThemeProviderOptions.sheetsManager && (_this.sheetsManager = muiThemeProviderOptions.sheetsManager), - _this.disableStylesGeneration = muiThemeProviderOptions.disableStylesGeneration), - _this.stylesCreatorSaved = stylesCreator, _this.sheetOptions = (0, _extends3.default)({ - generateClassName: generateClassName - }, _this.context[ns.sheetOptions]), _this.theme = listenToTheme ? _themeListener2.default.initial(context) || getDefaultTheme() : noopTheme, - _this; - } - return (0, _inherits3.default)(WithStyles, _React$Component), (0, _createClass3.default)(WithStyles, [ { - key: "componentWillMount", - value: function() { - this.attach(this.theme); - } - }, { - key: "componentDidMount", - value: function() { - var _this2 = this; - listenToTheme && (this.unsubscribeId = _themeListener2.default.subscribe(this.context, function(theme) { - var oldTheme = _this2.theme; - _this2.theme = theme, _this2.attach(_this2.theme), _this2.setState({}, function() { - _this2.detach(oldTheme); - }); - })); - } - }, { - key: "componentWillReceiveProps", - value: function() { - this.stylesCreatorSaved !== stylesCreator && "production" !== process.env.NODE_ENV && (this.detach(this.theme), - this.stylesCreatorSaved = stylesCreator, this.attach(this.theme)); - } - }, { - key: "componentWillUnmount", - value: function() { - this.detach(this.theme), null !== this.unsubscribeId && _themeListener2.default.unsubscribe(this.context, this.unsubscribeId); - } - }, { - key: "attach", - value: function(theme) { - if (!this.disableStylesGeneration) { - var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved); - sheetManager || (sheetManager = new _map2.default(), this.sheetsManager.set(stylesCreatorSaved, sheetManager)); - var sheetManagerTheme = sheetManager.get(theme); - if (sheetManagerTheme || (sheetManagerTheme = { - refs: 0, - sheet: null - }, sheetManager.set(theme, sheetManagerTheme)), 0 === sheetManagerTheme.refs) { - var styles = stylesCreatorSaved.create(theme, name), meta = name; - "production" === process.env.NODE_ENV || meta || (meta = (0, _getDisplayName2.default)(Component)); - var sheet = this.jss.createStyleSheet(styles, (0, _extends3.default)({ - meta: meta, - classNamePrefix: meta, - flip: "boolean" == typeof flip ? flip : "rtl" === theme.direction, - link: !1 - }, this.sheetOptions, stylesCreatorSaved.options, { - name: name - }, styleSheetOptions)); - sheetManagerTheme.sheet = sheet, sheet.attach(); - var sheetsRegistry = this.context[ns.sheetsRegistry]; - sheetsRegistry && sheetsRegistry.add(sheet); - } - sheetManagerTheme.refs += 1; - } - } - }, { - key: "detach", - value: function(theme) { - if (!this.disableStylesGeneration) { - var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved), sheetManagerTheme = sheetManager.get(theme); - if (sheetManagerTheme.refs -= 1, 0 === sheetManagerTheme.refs) { - sheetManager.delete(theme), this.jss.removeStyleSheet(sheetManagerTheme.sheet); - var sheetsRegistry = this.context[ns.sheetsRegistry]; - sheetsRegistry && sheetsRegistry.remove(sheetManagerTheme.sheet); - } - } - } - }, { - key: "render", - value: function() { - var _this3 = this, _props = this.props, classesProp = _props.classes, innerRef = _props.innerRef, other = (0, - _objectWithoutProperties3.default)(_props, [ "classes", "innerRef" ]), classes = void 0, renderedClasses = {}; - if (!this.disableStylesGeneration) { - var sheetManager = this.sheetsManager.get(this.stylesCreatorSaved), sheetsManagerTheme = sheetManager.get(this.theme); - renderedClasses = sheetsManagerTheme.sheet.classes; - } - classes = classesProp ? (0, _extends3.default)({}, renderedClasses, (0, _keys2.default)(classesProp).reduce(function(accumulator, key) { - return "production" !== process.env.NODE_ENV && (0, _warning2.default)(renderedClasses[key] || _this3.disableStylesGeneration, [ "Material-UI: the key ` + ("`" + `" + key + "`)) + ("`" + (` provided to the classes property is not implemented in " + (0, - _getDisplayName2.default)(Component) + ".", "You can only override one of the following: " + (0, - _keys2.default)(renderedClasses).join(",") ].join("\n")), "production" !== process.env.NODE_ENV && (0, - _warning2.default)(!classesProp[key] || "string" == typeof classesProp[key], [ "Material-UI: the key ` + "`"))) + ((`" + key + "` + ("`" + ` provided to the classes property is not valid for " + (0, - _getDisplayName2.default)(Component) + ".", "You need to provide a non empty string instead of: " + classesProp[key] + "." ].join("\n")), - classesProp[key] && (accumulator[key] = renderedClasses[key] + " " + classesProp[key]), - accumulator; - }, {})) : renderedClasses; - var more = {}; - return withTheme && (more.theme = this.theme), _react2.default.createElement(Component, (0, - _extends3.default)({ - classes: classes - }, more, other, { - ref: innerRef - })); - } - } ]), WithStyles; - }(_react2.default.Component); - return WithStyles.propTypes = "production" !== process.env.NODE_ENV ? { - classes: _propTypes2.default.object, - innerRef: _propTypes2.default.func - } : {}, WithStyles.contextTypes = (0, _extends3.default)({ - muiThemeProviderOptions: _propTypes2.default.object - }, _contextTypes2.default, listenToTheme ? _themeListener2.default.contextTypes : {}), - "production" !== process.env.NODE_ENV && (WithStyles.displayName = (0, _wrapDisplayName2.default)(Component, "WithStyles")), - (0, _hoistNonReactStatics2.default)(WithStyles, Component), "production" !== process.env.NODE_ENV && (WithStyles.Naked = Component, - WithStyles.options = options), WithStyles; - }; - }; - exports.default = withStyles; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - var warning = function() {}; - "production" !== process.env.NODE_ENV && (warning = function(condition, format, args) { - var len = arguments.length; - args = new Array(len > 2 ? len - 2 : 0); - for (var key = 2; key < len; key++) args[key - 2] = arguments[key]; - if (void 0 === format) throw new Error("`)) + ("`" + (`warning(condition, format, ...args)` + "`")))) + (((` requires a warning message argument"); - if (format.length < 10 || /^[s\W]*$/.test(format)) throw new Error("The warning format should be able to uniquely identify this warning. Please, use a more descriptive format than: " + format); - if (!condition) { - var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() { - return args[argIndex++]; - }); - "undefined" != typeof console && console.error(message); - try { - throw new Error(message); - } catch (x) {} - } - }), module.exports = warning; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _defineProperty = __webpack_require__(154), _defineProperty2 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_defineProperty); - exports.default = function(obj, key, value) { - return key in obj ? (0, _defineProperty2.default)(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - }; -}, function(module, exports) { - var isArray = Array.isArray; - module.exports = isArray; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function Layer(props) { - var children = props.children, className = props.className, others = _objectWithoutProperties(props, [ "children", "className" ]), layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-layer", className); - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("g", _extends({ - className: layerClass - }, others), children); - } - var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, propTypes = { - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ]) - }; - Layer.propTypes = propTypes, __webpack_exports__.a = Layer; -}, function(module, exports, __webpack_require__) { - var global = __webpack_require__(167), core = __webpack_require__(168), hide = __webpack_require__(266), redefine = __webpack_require__(581), ctx = __webpack_require__(584), $export = function(type, name, source) { - var key, own, out, exp, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {}).prototype, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype || (exports.prototype = {}); - IS_GLOBAL && (source = name); - for (key in source) own = !IS_FORCED && target && void 0 !== target[key], out = (own ? target : source)[key], - exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && "function" == typeof out ? ctx(Function.call, out) : out, - target && redefine(target, key, out, type & $export.U), exports[key] != out && hide(exports, key, exp), - IS_PROTO && expProto[key] != out && (expProto[key] = out); - }; - global.core = core, $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8, - $export.B = 16, $export.W = 32, $export.U = 64, $export.R = 128, module.exports = $export; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _defineProperty(obj, key, value) { - return key in obj ? Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - } - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - __webpack_require__.d(__webpack_exports__, "w", function() { - return getValueByDataKey; - }), __webpack_require__.d(__webpack_exports__, "n", function() { - return getDomainOfDataByKey; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return calculateActiveTickIndex; - }), __webpack_require__.d(__webpack_exports__, "r", function() { - return getMainColorOfGraphicItem; - }), __webpack_require__.d(__webpack_exports__, "q", function() { - return getLegendProps; - }), __webpack_require__.d(__webpack_exports__, "i", function() { - return getBarSizeList; - }), __webpack_require__.d(__webpack_exports__, "h", function() { - return getBarPosition; - }), __webpack_require__.d(__webpack_exports__, "a", function() { - return appendOffsetOfLegend; - }), __webpack_require__.d(__webpack_exports__, "z", function() { - return parseErrorBarsOfAxis; - }), __webpack_require__.d(__webpack_exports__, "o", function() { - return getDomainOfItemsWithSameAxis; - }), __webpack_require__.d(__webpack_exports__, "x", function() { - return isCategorialAxis; - }), __webpack_require__.d(__webpack_exports__, "m", function() { - return getCoordinatesOfGrid; - }), __webpack_require__.d(__webpack_exports__, "u", function() { - return getTicksOfAxis; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return combineEventHandlers; - }), __webpack_require__.d(__webpack_exports__, "A", function() { - return parseScale; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return checkDomainOfScale; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return findPositionOfBar; - }), __webpack_require__.d(__webpack_exports__, "C", function() { - return truncateByDomain; - }), __webpack_require__.d(__webpack_exports__, "s", function() { - return getStackGroupsByAxisId; - }), __webpack_require__.d(__webpack_exports__, "v", function() { - return getTicksOfScale; - }), __webpack_require__.d(__webpack_exports__, "l", function() { - return getCateCoordinateOfLine; - }), __webpack_require__.d(__webpack_exports__, "k", function() { - return getCateCoordinateOfBar; - }), __webpack_require__.d(__webpack_exports__, "j", function() { - return getBaseValueOfBar; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return detectReferenceElementsDomain; - }), __webpack_require__.d(__webpack_exports__, "t", function() { - return getStackedDataOfItem; - }), __webpack_require__.d(__webpack_exports__, "p", function() { - return getDomainOfStackGroups; - }), __webpack_require__.d(__webpack_exports__, "B", function() { - return parseSpecifiedDomain; - }), __webpack_require__.d(__webpack_exports__, "D", function() { - return validateCoordinateInRange; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return getBandSizeOfAxis; - }), __webpack_require__.d(__webpack_exports__, "y", function() { - return parseDomainOfCategoryAxis; - }); - var __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__ = __webpack_require__(321), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_3_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isString__), __WEBPACK_IMPORTED_MODULE_4_lodash_max__ = __webpack_require__(841), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_max__), __WEBPACK_IMPORTED_MODULE_5_lodash_min__ = __webpack_require__(328), __WEBPACK_IMPORTED_MODULE_5_lodash_min___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_lodash_min__), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap__ = __webpack_require__(842), __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_lodash_flatMap__), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_9_lodash_get__ = __webpack_require__(174), __WEBPACK_IMPORTED_MODULE_9_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_9_lodash_get__), __WEBPACK_IMPORTED_MODULE_10_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_10_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_11_recharts_scale__ = __webpack_require__(844), __WEBPACK_IMPORTED_MODULE_12_d3_scale__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__), - __webpack_require__(331)), __WEBPACK_IMPORTED_MODULE_13_d3_shape__ = __webpack_require__(182), __WEBPACK_IMPORTED_MODULE_14__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceDot__ = __webpack_require__(364), __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceLine__ = __webpack_require__(365), __WEBPACK_IMPORTED_MODULE_17__cartesian_ReferenceArea__ = __webpack_require__(366), __WEBPACK_IMPORTED_MODULE_18__cartesian_ErrorBar__ = __webpack_require__(95), __WEBPACK_IMPORTED_MODULE_19__component_Legend__ = __webpack_require__(180), __WEBPACK_IMPORTED_MODULE_20__ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, getValueByDataKey = function(obj, dataKey, defaultValue) { - return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(obj) || __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(dataKey) ? defaultValue : Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(dataKey) ? __WEBPACK_IMPORTED_MODULE_9_lodash_get___default()(obj, dataKey, defaultValue) : __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(dataKey) ? dataKey(obj) : defaultValue; - }, getDomainOfDataByKey = function(data, key, type, filterNil) { - var flattenData = __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap___default()(data, function(entry) { - return getValueByDataKey(entry, key); - }); - if ("number" === type) { - var domain = flattenData.filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h); - return [ Math.min.apply(null, domain), Math.max.apply(null, domain) ]; - } - return (filterNil ? flattenData.filter(function(entry) { - return !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry); - }) : flattenData).map(function(entry) { - return Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(entry) ? entry : ""; - }); - }, calculateActiveTickIndex = function(coordinate, ticks, unsortedTicks, axis) { - var index = -1, len = ticks.length; - if (len > 1) { - if (axis && "angleAxis" === axis.axisType && Math.abs(Math.abs(axis.range[1] - axis.range[0]) - 360) <= 1e-6) for (var range = axis.range, i = 0; i < len; i++) { - var before = i > 0 ? unsortedTicks[i - 1].coordinate : unsortedTicks[len - 1].coordinate, cur = unsortedTicks[i].coordinate, after = i >= len - 1 ? unsortedTicks[0].coordinate : unsortedTicks[i + 1].coordinate, sameDirectionCoord = void 0; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(cur - before) !== Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(after - cur)) { - var diffInterval = []; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(after - cur) === Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(range[1] - range[0])) { - sameDirectionCoord = after; - var curInRange = cur + range[1] - range[0]; - diffInterval[0] = Math.min(curInRange, (curInRange + before) / 2), diffInterval[1] = Math.max(curInRange, (curInRange + before) / 2); - } else { - sameDirectionCoord = before; - var afterInRange = after + range[1] - range[0]; - diffInterval[0] = Math.min(cur, (afterInRange + cur) / 2), diffInterval[1] = Math.max(cur, (afterInRange + cur) / 2); - } - var sameInterval = [ Math.min(cur, (sameDirectionCoord + cur) / 2), Math.max(cur, (sameDirectionCoord + cur) / 2) ]; - if (coordinate > sameInterval[0] && coordinate <= sameInterval[1] || coordinate >= diffInterval[0] && coordinate <= diffInterval[1]) { - index = unsortedTicks[i].index; - break; - } - } else { - var min = Math.min(before, after), max = Math.max(before, after); - if (coordinate > (min + cur) / 2 && coordinate <= (max + cur) / 2) { - index = unsortedTicks[i].index; - break; - } - } - } else for (var _i = 0; _i < len; _i++) if (0 === _i && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i > 0 && _i < len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i === len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2) { - index = ticks[_i].index; - break; - } - } else index = 0; - return index; - }, getMainColorOfGraphicItem = function(item) { - var displayName = item.type.displayName, result = void 0; - switch (displayName) { - case "Line": - case "Area": - case "Radar": - result = item.props.stroke; - break; - - default: - result = item.props.fill; - } - return result; - }, getLegendProps = function(_ref) { - var children = _ref.children, formatedGraphicalItems = _ref.formatedGraphicalItems, legendWidth = _ref.legendWidth, legendContent = _ref.legendContent, legendItem = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__component_Legend__.a); - if (!legendItem) return null; - var legendData = void 0; - return legendData = legendItem.props && legendItem.props.payload ? legendItem.props && legendItem.props.payload : "children" === legendContent ? (formatedGraphicalItems || []).reduce(function(result, _ref2) { - var item = _ref2.item, props = _ref2.props, data = props.sectors || props.data || []; - return result.concat(data.map(function(entry) { - return { - type: legendItem.props.iconType || item.props.legendType, - value: entry.name, - color: entry.fill, - payload: entry - }; - })); - }, []) : (formatedGraphicalItems || []).map(function(_ref3) { - var item = _ref3.item, _item$props = item.props, dataKey = _item$props.dataKey, name = _item$props.name, legendType = _item$props.legendType; - return { - inactive: _item$props.hide, - dataKey: dataKey, - type: legendItem.props.iconType || legendType || "square", - color: getMainColorOfGraphicItem(item), - value: name || dataKey, - payload: item.props - }; - }), _extends({}, legendItem.props, __WEBPACK_IMPORTED_MODULE_19__component_Legend__.a.getWithHeight(legendItem, legendWidth), { - payload: legendData, - item: legendItem }); - }, getBarSizeList = function(_ref4) { - var globalSize = _ref4.barSize, _ref4$stackGroups = _ref4.stackGroups, stackGroups = void 0 === _ref4$stackGroups ? {} : _ref4$stackGroups; - if (!stackGroups) return {}; - for (var result = {}, numericAxisIds = Object.keys(stackGroups), i = 0, len = numericAxisIds.length; i < len; i++) for (var sgs = stackGroups[numericAxisIds[i]].stackGroups, stackIds = Object.keys(sgs), j = 0, sLen = stackIds.length; j < sLen; j++) { - var _sgs$stackIds$j = sgs[stackIds[j]], items = _sgs$stackIds$j.items, cateAxisId = _sgs$stackIds$j.cateAxisId, barItems = items.filter(function(item) { - return Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.j)(item.type).indexOf("Bar") >= 0; + }, n.t = function(e, t) { + if (1 & t && (e = n(e)), 8 & t) return e; + if (4 & t && "object" == typeof e && e && e.__esModule) return e; + var r = Object.create(null); + if (n.r(r), Object.defineProperty(r, "default", { + enumerable: !0, + value: e + }), 2 & t && "string" != typeof e) for (var o in e) n.d(r, o, function(t) { + return e[t]; + }.bind(null, o)); + return r; + }, n.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default; + } : function() { + return e; + }; + return n.d(t, "a", t), t; + }, n.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }, n.p = "", n(n.s = "./index.jsx"); +}({ + "./common.jsx": function(e, t, n) { + "use strict"; + (function(e) { + n.d(t, "b", function() { + return d; + }), n.d(t, "a", function() { + return f; + }), n.d(t, "c", function() { + return p; + }), n.d(t, "g", function() { + return h; + }), n.d(t, "f", function() { + return m; + }), n.d(t, "e", function() { + return y; + }), n.d(t, "d", function() { + return b; }); - if (barItems && barItems.length) { - var selfSize = barItems[0].props.barSize, cateId = barItems[0].props[cateAxisId]; - result[cateId] || (result[cateId] = []), result[cateId].push({ - item: barItems[0], - stackList: barItems.slice(1), - barSize: __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(selfSize) ? globalSize : selfSize - }); - } - } - return result; - }, getBarPosition = function(_ref5) { - var barGap = _ref5.barGap, barCategoryGap = _ref5.barCategoryGap, bandSize = _ref5.bandSize, _ref5$sizeList = _ref5.sizeList, sizeList = void 0 === _ref5$sizeList ? [] : _ref5$sizeList, maxBarSize = _ref5.maxBarSize, len = sizeList.length; - if (len < 1) return null; - var realBarGap = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.d)(barGap, bandSize, 0, !0), result = void 0; - if (sizeList[0].barSize === +sizeList[0].barSize) { - var useFull = !1, fullBarSize = bandSize / len, sum = sizeList.reduce(function(res, entry) { - return res + entry.barSize || 0; - }, 0); - sum += (len - 1) * realBarGap, sum >= bandSize && (sum -= (len - 1) * realBarGap, - realBarGap = 0), sum >= bandSize && fullBarSize > 0 && (useFull = !0, fullBarSize *= .9, - sum = len * fullBarSize); - var offset = (bandSize - sum) / 2 >> 0, prev = { - offset: offset - realBarGap, - size: 0 - }; - result = sizeList.reduce(function(res, entry) { - var newRes = [].concat(_toConsumableArray(res), [ { - item: entry.item, - position: { - offset: prev.offset + prev.size + realBarGap, - size: useFull ? fullBarSize : entry.barSize - } - } ]); - return prev = newRes[newRes.length - 1].position, entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) { - newRes.push({ - item: item, - position: prev + var r, o = n("./node_modules/@fortawesome/free-solid-svg-icons/index.es.js"), a = n("./node_modules/@fortawesome/free-regular-svg-icons/index.es.js"); + function i(e) { + for (var t = 1; t < arguments.length; t++) { + var n = null != arguments[t] ? arguments[t] : {}, r = Object.keys(n); + "function" == typeof Object.getOwnPropertySymbols && (r = r.concat(Object.getOwnPropertySymbols(n).filter(function(e) { + return Object.getOwnPropertyDescriptor(n, e).enumerable; + }))), r.forEach(function(t) { + s(e, t, n[t]); }); - }), newRes; - }, []); - } else { - var _offset = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.d)(barCategoryGap, bandSize, 0, !0); - bandSize - 2 * _offset - (len - 1) * realBarGap <= 0 && (realBarGap = 0); - var originalSize = (bandSize - 2 * _offset - (len - 1) * realBarGap) / len; - originalSize > 1 && (originalSize >>= 0); - var size = maxBarSize === +maxBarSize ? Math.min(originalSize, maxBarSize) : originalSize; - result = sizeList.reduce(function(res, entry, i) { - var newRes = [].concat(_toConsumableArray(res), [ { - item: entry.item, - position: { - offset: _offset + (originalSize + realBarGap) * i + (originalSize - size) / 2, - size: size - } - } ]); - return entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) { - newRes.push({ - item: item, - position: newRes[newRes.length - 1].position - }); - }), newRes; - }, []); - } - return result; - }, appendOffsetOfLegend = function(offset, items, props, legendBox) { - var children = props.children, width = props.width, height = props.height, margin = props.margin, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), legendProps = getLegendProps({ - children: children, - items: items, - legendWidth: legendWidth, - legendHeight: legendHeight - }), newOffset = offset; - if (legendProps) { - var box = legendBox || {}, align = legendProps.align, verticalAlign = legendProps.verticalAlign, layout = legendProps.layout; - ("vertical" === layout || "horizontal" === layout && "center" === verticalAlign) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(offset[align]) && (newOffset = _extends({}, offset, _defineProperty({}, align, newOffset[align] + (box.width || 0)))), - ("horizontal" === layout || "vertical" === layout && "center" === align) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(offset[verticalAlign]) && (newOffset = _extends({}, offset, _defineProperty({}, verticalAlign, newOffset[verticalAlign] + (box.height || 0)))); - } - return newOffset; - }, getDomainOfErrorBars = function(data, item, dataKey, axisType) { - var children = item.props.children, errorBars = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_18__cartesian_ErrorBar__.a).filter(function(errorBarChild) { - var direction = errorBarChild.props.direction; - return !(!__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(direction) && !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(axisType)) || axisType.indexOf(direction) >= 0; - }); - if (errorBars && errorBars.length) { - var keys = errorBars.map(function(errorBarChild) { - return errorBarChild.props.dataKey; - }); - return data.reduce(function(result, entry) { - var entryValue = getValueByDataKey(entry, dataKey, 0), mainValue = __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(entryValue) ? [ __WEBPACK_IMPORTED_MODULE_5_lodash_min___default()(entryValue), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default()(entryValue) ] : [ entryValue, entryValue ], errorDomain = keys.reduce(function(prevErrorArr, k) { - var errorValue = getValueByDataKey(entry, k, 0), lowerValue = mainValue[0] - Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[0] : errorValue), upperValue = mainValue[1] + Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[1] : errorValue); - return [ Math.min(lowerValue, prevErrorArr[0]), Math.max(upperValue, prevErrorArr[1]) ]; - }, [ 1 / 0, -1 / 0 ]); - return [ Math.min(errorDomain[0], result[0]), Math.max(errorDomain[1], result[1]) ]; - }, [ 1 / 0, -1 / 0 ]); - } - return null; - }, parseErrorBarsOfAxis = function(data, items, dataKey, axisType) { - var domains = items.map(function(item) { - return getDomainOfErrorBars(data, item, dataKey, axisType); - }).filter(function(entry) { - return !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry); - }); - return domains && domains.length ? domains.reduce(function(result, entry) { - return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ]; - }, [ 1 / 0, -1 / 0 ]) : null; - }, getDomainOfItemsWithSameAxis = function(data, items, type, filterNil) { - var domains = items.map(function(item) { - var dataKey = item.props.dataKey; - return "number" === type && dataKey ? getDomainOfErrorBars(data, item, dataKey) || getDomainOfDataByKey(data, dataKey, type, filterNil) : getDomainOfDataByKey(data, dataKey, type, filterNil); - }); - if ("number" === type) return domains.reduce(function(result, entry) { - return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ]; - }, [ 1 / 0, -1 / 0 ]); - var tag = {}; - return domains.reduce(function(result, entry) { - for (var i = 0, len = entry.length; i < len; i++) tag[entry[i]] || (tag[entry[i]] = !0, - result.push(entry[i])); - return result; - }, []); - }, isCategorialAxis = function(layout, axisType) { - return "horizontal" === layout && "xAxis" === axisType || "vertical" === layout && "yAxis" === axisType || "centric" === layout && "angleAxis" === axisType || "radial" === layout && "radiusAxis" === axisType; - }, getCoordinatesOfGrid = function(ticks, min, max) { - var hasMin = void 0, hasMax = void 0, values = ticks.map(function(entry) { - return entry.coordinate === min && (hasMin = !0), entry.coordinate === max && (hasMax = !0), - entry.coordinate; - }); - return hasMin || values.push(min), hasMax || values.push(max), values; - }, getTicksOfAxis = function(axis, isGrid, isAll) { - if (!axis) return null; - var scale = axis.scale, duplicateDomain = axis.duplicateDomain, type = axis.type, range = axis.range, offset = (isGrid || isAll) && "category" === type && scale.bandwidth ? scale.bandwidth() / 2 : 0; - return offset = "angleAxis" === axis.axisType ? 2 * Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(range[0] - range[1]) * offset : offset, - isGrid && (axis.ticks || axis.niceTicks) ? (axis.ticks || axis.niceTicks).map(function(entry) { - var scaleContent = duplicateDomain ? duplicateDomain.indexOf(entry) : entry; - return { - coordinate: scale(scaleContent) + offset, - value: entry, - offset: offset - }; - }) : axis.isCategorial && axis.categoricalDomain ? axis.categoricalDomain.map(function(entry, index) { - return { - coordinate: scale(entry), - value: entry, - index: index, - offset: offset - }; - }) : scale.ticks && !isAll ? scale.ticks(axis.tickCount).map(function(entry) { - return { - coordinate: scale(entry) + offset, - value: entry, - offset: offset - }; - }) : scale.domain().map(function(entry, index) { - return { - coordinate: scale(entry) + offset, - value: duplicateDomain ? duplicateDomain[entry] : entry, - index: index, - offset: offset - }; - }); - }, combineEventHandlers = function(defaultHandler, parentHandler, childHandler) { - var customizedHandler = void 0; - return __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(childHandler) ? customizedHandler = childHandler : __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(parentHandler) && (customizedHandler = parentHandler), - __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(defaultHandler) || customizedHandler ? function(arg1, arg2, arg3, arg4) { - __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(defaultHandler) && defaultHandler(arg1, arg2, arg3, arg4), - __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(customizedHandler) && customizedHandler(arg1, arg2, arg3, arg4); - } : null; - }, parseScale = function(axis, chartType) { - var scale = axis.scale, type = axis.type, layout = axis.layout, axisType = axis.axisType; - if ("auto" === scale) return "radial" === layout && "radiusAxis" === axisType ? { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleBand(), - realScaleType: "band" - } : "radial" === layout && "angleAxis" === axisType ? { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleLinear(), - realScaleType: "linear" - } : "category" === type && chartType && (chartType.indexOf("LineChart") >= 0 || chartType.indexOf("AreaChart") >= 0) ? { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint(), - realScaleType: "point" - } : "category" === type ? { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleBand(), - realScaleType: "band" - } : { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleLinear(), - realScaleType: "linear" - }; - if (__WEBPACK_IMPORTED_MODULE_3_lodash_isString___default()(scale)) { - var name = "scale" + scale.slice(0, 1).toUpperCase() + scale.slice(1); - return { - scale: (__WEBPACK_IMPORTED_MODULE_12_d3_scale__[name] || __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint)(), - realScaleType: __WEBPACK_IMPORTED_MODULE_12_d3_scale__[name] ? name : "point" - }; - } - return __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(scale) ? { - scale: scale - } : { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint(), - realScaleType: "point" - }; - }, checkDomainOfScale = function(scale) { - var domain = scale.domain(); - if (domain && !(domain.length <= 2)) { - var len = domain.length, range = scale.range(), min = Math.min(range[0], range[1]) - 1e-4, max = Math.max(range[0], range[1]) + 1e-4, first = scale(domain[0]), last = scale(domain[len - 1]); - (first < min || first > max || last < min || last > max) && scale.domain([ domain[0], domain[len - 1] ]); - } - }, findPositionOfBar = function(barPosition, child) { - if (!barPosition) return null; - for (var i = 0, len = barPosition.length; i < len; i++) if (barPosition[i].item === child) return barPosition[i].position; - return null; - }, truncateByDomain = function(value, domain) { - if (!domain || 2 !== domain.length || !Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(domain[0]) || !Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(domain[1])) return value; - var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]), result = [ value[0], value[1] ]; - return (!Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(value[0]) || value[0] < min) && (result[0] = min), - (!Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(value[1]) || value[1] > max) && (result[1] = max), - result[0] > max && (result[0] = max), result[1] < min && (result[1] = min), result; - }, offsetSign = function(series) { - var n = series.length; - if (!(n <= 0)) for (var j = 0, m = series[0].length; j < m; ++j) for (var positive = 0, negative = 0, i = 0; i < n; ++i) { - var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(series[i][j][1]) ? series[i][j][0] : series[i][j][1]; - value >= 0 ? (series[i][j][0] = positive, series[i][j][1] = positive + value, positive = series[i][j][1]) : (series[i][j][0] = negative, - series[i][j][1] = negative + value, negative = series[i][j][1]); - } - }, STACK_OFFSET_MAP = { - sign: offsetSign, - expand: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.o, - none: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.p, - silhouette: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.q, - wiggle: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.r - }, getStackedData = function(data, stackItems, offsetType) { - var dataKeys = stackItems.map(function(item) { - return item.props.dataKey; - }); - return Object(__WEBPACK_IMPORTED_MODULE_13_d3_shape__.n)().keys(dataKeys).value(function(d, key) { - return +getValueByDataKey(d, key, 0); - }).order(__WEBPACK_IMPORTED_MODULE_13_d3_shape__.s).offset(STACK_OFFSET_MAP[offsetType])(data); - }, getStackGroupsByAxisId = function(data, _items, numericAxisId, cateAxisId, offsetType, reverseStackOrder) { - if (!data) return null; - var items = reverseStackOrder ? _items.reverse() : _items, stackGroups = items.reduce(function(result, item) { - var _item$props2 = item.props, stackId = _item$props2.stackId; - if (_item$props2.hide) return result; - var axisId = item.props[numericAxisId], parentGroup = result[axisId] || { - hasStack: !1, - stackGroups: {} - }; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(stackId)) { - var childGroup = parentGroup.stackGroups[stackId] || { - numericAxisId: numericAxisId, - cateAxisId: cateAxisId, - items: [] - }; - childGroup.items.push(item), parentGroup.hasStack = !0, parentGroup.stackGroups[stackId] = childGroup; - } else parentGroup.stackGroups[Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.k)("_stackId_")] = { - numericAxisId: numericAxisId, - cateAxisId: cateAxisId, - items: [ item ] - }; - return _extends({}, result, _defineProperty({}, axisId, parentGroup)); - }, {}); - return Object.keys(stackGroups).reduce(function(result, axisId) { - var group = stackGroups[axisId]; - return group.hasStack && (group.stackGroups = Object.keys(group.stackGroups).reduce(function(res, stackId) { - var g = group.stackGroups[stackId]; - return _extends({}, res, _defineProperty({}, stackId, { - numericAxisId: numericAxisId, - cateAxisId: cateAxisId, - items: g.items, - stackedData: getStackedData(data, g.items, offsetType) - })); - }, {})), _extends({}, result, _defineProperty({}, axisId, group)); - }, {}); - }, calculateDomainOfTicks = function(ticks, type) { - return "number" === type ? [ Math.min.apply(null, ticks), Math.max.apply(null, ticks) ] : ticks; - }, getTicksOfScale = function(scale, opts) { - var realScaleType = opts.realScaleType, type = opts.type, tickCount = opts.tickCount, originalDomain = opts.originalDomain, allowDecimals = opts.allowDecimals, scaleType = realScaleType || opts.scale; - if ("auto" !== scaleType && "linear" !== scaleType) return null; - if (tickCount && "number" === type && originalDomain && ("auto" === originalDomain[0] || "auto" === originalDomain[1])) { - var domain = scale.domain(), tickValues = Object(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__.getNiceTickValues)(domain, tickCount, allowDecimals); - return scale.domain(calculateDomainOfTicks(tickValues, type)), { - niceTicks: tickValues - }; - } - if (tickCount && "number" === type) { - var _domain = scale.domain(); - return { - niceTicks: Object(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__.getTickValuesFixedDomain)(_domain, tickCount, allowDecimals) - }; - } - return null; - }, getCateCoordinateOfLine = function(_ref6) { - var axis = _ref6.axis, ticks = _ref6.ticks, bandSize = _ref6.bandSize, entry = _ref6.entry, index = _ref6.index; - if ("category" === axis.type) { - if (!axis.allowDuplicatedCategory && axis.dataKey && !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry[axis.dataKey])) { - var matchedTick = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.a)(ticks, "value", entry[axis.dataKey]); - if (matchedTick) return matchedTick.coordinate + bandSize / 2; - } - return ticks[index] ? ticks[index].coordinate + bandSize / 2 : null; - } - var value = getValueByDataKey(entry, axis.dataKey); - return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(value) ? null : axis.scale(value); - }, getCateCoordinateOfBar = function(_ref7) { - var axis = _ref7.axis, ticks = _ref7.ticks, offset = _ref7.offset, bandSize = _ref7.bandSize, entry = _ref7.entry, index = _ref7.index; - if ("category" === axis.type) return ticks[index] ? ticks[index].coordinate + offset : null; - var value = getValueByDataKey(entry, axis.dataKey, axis.domain[index]); - return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(value) ? null : axis.scale(value) - bandSize / 2 + offset; - }, getBaseValueOfBar = function(_ref8) { - var numericAxis = _ref8.numericAxis, domain = numericAxis.scale.domain(); - if ("number" === numericAxis.type) { - var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]); - return min <= 0 && max >= 0 ? 0 : max < 0 ? max : min; - } - return domain[0]; - }, detectReferenceElementsDomain = function(children, domain, axisId, axisType, specifiedTicks) { - var lines = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceLine__.a), dots = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceDot__.a), elements = lines.concat(dots), areas = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_17__cartesian_ReferenceArea__.a), idKey = axisType + "Id", valueKey = axisType[0], finalDomain = domain; - if (elements.length && (finalDomain = elements.reduce(function(result, el) { - if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[valueKey])) { - var value = el.props[valueKey]; - return [ Math.min(result[0], value), Math.max(result[1], value) ]; - } - return result; - }, finalDomain)), areas.length) { - var key1 = valueKey + "1", key2 = valueKey + "2"; - finalDomain = areas.reduce(function(result, el) { - if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[key1]) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[key2])) { - var value1 = el.props[key1], value2 = el.props[key2]; - return [ Math.min(result[0], value1, value2), Math.max(result[1], value1, value2) ]; - } - return result; - }, finalDomain); - } - return specifiedTicks && specifiedTicks.length && (finalDomain = specifiedTicks.reduce(function(result, tick) { - return Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(tick) ? [ Math.min(result[0], tick), Math.max(result[1], tick) ] : result; - }, finalDomain)), finalDomain; - }, getStackedDataOfItem = function(item, stackGroups) { - var stackId = item.props.stackId; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(stackId)) { - var group = stackGroups[stackId]; - if (group && group.items.length) { - for (var itemIndex = -1, i = 0, len = group.items.length; i < len; i++) if (group.items[i] === item) { - itemIndex = i; - break; } - return itemIndex >= 0 ? group.stackedData[itemIndex] : null; + return e; } - } - return null; - }, getDomainOfSingle = function(data) { - return data.reduce(function(result, entry) { - return [ Math.min.apply(null, entry.concat([ result[0] ]).filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)), Math.max.apply(null, entry.concat([ result[1] ]).filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)) ]; - }, [ 1 / 0, -1 / 0 ]); - }, getDomainOfStackGroups = function(stackGroups, startIndex, endIndex) { - return Object.keys(stackGroups).reduce(function(result, stackId) { - var group = stackGroups[stackId], stackedData = group.stackedData, domain = stackedData.reduce(function(res, entry) { - var s = getDomainOfSingle(entry.slice(startIndex, endIndex + 1)); - return [ Math.min(res[0], s[0]), Math.max(res[1], s[1]) ]; - }, [ 1 / 0, -1 / 0 ]); - return [ Math.min(domain[0], result[0]), Math.max(domain[1], result[1]) ]; - }, [ 1 / 0, -1 / 0 ]).map(function(result) { - return result === 1 / 0 || result === -1 / 0 ? 0 : result; - }); - }, MIN_VALUE_REG = /^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, MAX_VALUE_REG = /^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, parseSpecifiedDomain = function(specifiedDomain, dataDomain, allowDataOverflow) { - if (!__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(specifiedDomain)) return dataDomain; - var domain = []; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(specifiedDomain[0])) domain[0] = allowDataOverflow ? specifiedDomain[0] : Math.min(specifiedDomain[0], dataDomain[0]); else if (MIN_VALUE_REG.test(specifiedDomain[0])) { - var value = +MIN_VALUE_REG.exec(specifiedDomain[0])[1]; - domain[0] = dataDomain[0] - value; - } else __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(specifiedDomain[0]) ? domain[0] = specifiedDomain[0](dataDomain[0]) : domain[0] = dataDomain[0]; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(specifiedDomain[1])) domain[1] = allowDataOverflow ? specifiedDomain[1] : Math.max(specifiedDomain[1], dataDomain[1]); else if (MAX_VALUE_REG.test(specifiedDomain[1])) { - var _value = +MAX_VALUE_REG.exec(specifiedDomain[1])[1]; - domain[1] = dataDomain[1] + _value; - } else __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(specifiedDomain[1]) ? domain[1] = specifiedDomain[1](dataDomain[1]) : domain[1] = dataDomain[1]; - return domain; - }, validateCoordinateInRange = function(coordinate, scale) { - if (!scale) return !1; - var range = scale.range(), first = range[0], last = range[range.length - 1]; - return first <= last ? coordinate >= first && coordinate <= last : coordinate >= last && coordinate <= first; - }, getBandSizeOfAxis = function(axis, ticks) { - if (axis && axis.scale && axis.scale.bandwidth) return axis.scale.bandwidth(); - if (axis && ticks && ticks.length >= 2) { - for (var orderedTicks = __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default()(ticks, function(o) { - return o.coordinate; - }), bandSize = 1 / 0, i = 1, len = orderedTicks.length; i < len; i++) { - var cur = orderedTicks[i], prev = orderedTicks[i - 1]; - bandSize = Math.min((cur.coordinate || 0) - (prev.coordinate || 0), bandSize); - } - return bandSize === 1 / 0 ? 0 : bandSize; - } - return 0; - }, parseDomainOfCategoryAxis = function(specifiedDomain, calculatedDomain, axisChild) { - return specifiedDomain && specifiedDomain.length ? __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(specifiedDomain, __WEBPACK_IMPORTED_MODULE_9_lodash_get___default()(axisChild, "type.defaultProps.domain")) ? calculatedDomain : specifiedDomain : calculatedDomain; - }; -}, function(module, exports) { - var core = module.exports = { - version: "2.5.7" - }; - "number" == typeof __e && (__e = core); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function newInterval(floori, offseti, count, field) { - function interval(date) { - return floori(date = new Date(+date)), date; - } - return interval.floor = interval, interval.ceil = function(date) { - return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; - }, interval.round = function(date) { - var d0 = interval(date), d1 = interval.ceil(date); - return date - d0 < d1 - date ? d0 : d1; - }, interval.offset = function(date, step) { - return offseti(date = new Date(+date), null == step ? 1 : Math.floor(step)), date; - }, interval.range = function(start, stop, step) { - var previous, range = []; - if (start = interval.ceil(start), step = null == step ? 1 : Math.floor(step), !(start < stop && step > 0)) return range; - do { - range.push(previous = new Date(+start)), offseti(start, step), floori(start); - } while (previous < start && start < stop); - return range; - }, interval.filter = function(test) { - return newInterval(function(date) { - if (date >= date) for (;floori(date), !test(date); ) date.setTime(date - 1); - }, function(date, step) { - if (date >= date) if (step < 0) for (;++step <= 0; ) for (;offseti(date, -1), !test(date); ) ; else for (;--step >= 0; ) for (;offseti(date, 1), - !test(date); ) ; - }); - }, count && (interval.count = function(start, end) { - return t0.setTime(+start), t1.setTime(+end), floori(t0), floori(t1), Math.floor(count(t0, t1)); - }, interval.every = function(step) { - return step = Math.floor(step), isFinite(step) && step > 0 ? step > 1 ? interval.filter(field ? function(d) { - return field(d) % step == 0; - } : function(d) { - return interval.count(0, d) % step == 0; - }) : interval : null; - }), interval; - } - __webpack_exports__.a = newInterval; - var t0 = new Date(), t1 = new Date(); -}, function(module, exports, __webpack_require__) { - var global = __webpack_require__(24), core = __webpack_require__(17), ctx = __webpack_require__(51), hide = __webpack_require__(39), has = __webpack_require__(54), $export = function(type, name, source) { - var key, own, out, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, IS_WRAP = type & $export.W, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype, target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {}).prototype; - IS_GLOBAL && (source = name); - for (key in source) (own = !IS_FORCED && target && void 0 !== target[key]) && has(exports, key) || (out = own ? target[key] : source[key], - exports[key] = IS_GLOBAL && "function" != typeof target[key] ? source[key] : IS_BIND && own ? ctx(out, global) : IS_WRAP && target[key] == out ? function(C) { - var F = function(a, b, c) { - if (this instanceof C) { - switch (arguments.length) { - case 0: - return new C(); - - case 1: - return new C(a); - - case 2: - return new C(a, b); - } - return new C(a, b, c); - } - return C.apply(this, arguments); - }; - return F.prototype = C.prototype, F; - }(out) : IS_PROTO && "function" == typeof out ? ctx(Function.call, out) : out, IS_PROTO && ((exports.virtual || (exports.virtual = {}))[key] = out, - type & $export.R && expProto && !expProto[key] && hide(expProto, key, out))); - }; - $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8, $export.B = 16, $export.W = 32, - $export.U = 64, $export.R = 128, module.exports = $export; -}, function(module, exports) { - function isNil(value) { - return null == value; - } - module.exports = isNil; -}, function(module, exports, __webpack_require__) { - var store = __webpack_require__(151)("wks"), uid = __webpack_require__(103), Symbol = __webpack_require__(24).Symbol, USE_SYMBOL = "function" == typeof Symbol; - (module.exports = function(name) { - return store[name] || (store[name] = USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)("Symbol." + name)); - }).store = store; -}, function(module, exports, __webpack_require__) { - var anObject = __webpack_require__(52), IE8_DOM_DEFINE = __webpack_require__(224), toPrimitive = __webpack_require__(145), dP = Object.defineProperty; - exports.f = __webpack_require__(25) ? Object.defineProperty : function(O, P, Attributes) { - if (anObject(O), P = toPrimitive(P, !0), anObject(Attributes), IE8_DOM_DEFINE) try { - return dP(O, P, Attributes); - } catch (e) {} - if ("get" in Attributes || "set" in Attributes) throw TypeError("Accessors not supported!"); - return "value" in Attributes && (O[P] = Attributes.value), O; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _defineProperty(obj, key, value) { - return key in obj ? Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - } - __webpack_require__.d(__webpack_exports__, "a", function() { - return RADIAN; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return polarToCartesian; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return getMaxRadius; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return formatAxisMap; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return inRangeOfSector; - }); - var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_2__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, RADIAN = Math.PI / 180, radianToDegree = function(angleInRadian) { - return 180 * angleInRadian / Math.PI; - }, polarToCartesian = function(cx, cy, radius, angle) { - return { - x: cx + Math.cos(-RADIAN * angle) * radius, - y: cy + Math.sin(-RADIAN * angle) * radius - }; - }, getMaxRadius = function(width, height) { - var offset = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : { - top: 0, - right: 0, - bottom: 0, - left: 0 - }; - return Math.min(Math.abs(width - (offset.left || 0) - (offset.right || 0)), Math.abs(height - (offset.top || 0) - (offset.bottom || 0))) / 2; - }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) { - var width = props.width, height = props.height, startAngle = props.startAngle, endAngle = props.endAngle, cx = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.cx, width, width / 2), cy = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.cy, height, height / 2), maxRadius = getMaxRadius(width, height, offset), innerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.innerRadius, maxRadius, 0), outerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.outerRadius, maxRadius, .8 * maxRadius); - return Object.keys(axisMap).reduce(function(result, id) { - var axis = axisMap[id], domain = axis.domain, reversed = axis.reversed, range = void 0; - __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(axis.range) ? ("angleAxis" === axisType ? range = [ startAngle, endAngle ] : "radiusAxis" === axisType && (range = [ innerRadius, outerRadius ]), - reversed && (range = [ range[1], range[0] ])) : (range = axis.range, startAngle = range[0], - endAngle = range[1]); - var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.A)(axis, chartName), realScaleType = _parseScale.realScaleType, scale = _parseScale.scale; - scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.c)(scale); - var ticks = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.v)(scale, _extends({}, axis, { - realScaleType: realScaleType - })), finalAxis = _extends({}, axis, ticks, { - range: range, - radius: outerRadius, - realScaleType: realScaleType, - scale: scale, - cx: cx, - cy: cy, - innerRadius: innerRadius, - outerRadius: outerRadius, - startAngle: startAngle, - endAngle: endAngle - }); - return _extends({}, result, _defineProperty({}, id, finalAxis)); - }, {}); - }, distanceBetweenPoints = function(point, anotherPoint) { - var x1 = point.x, y1 = point.y, x2 = anotherPoint.x, y2 = anotherPoint.y; - return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); - }, getAngleOfPoint = function(_ref, _ref2) { - var x = _ref.x, y = _ref.y, cx = _ref2.cx, cy = _ref2.cy, radius = distanceBetweenPoints({ - x: x, - y: y - }, { - x: cx, - y: cy - }); - if (radius <= 0) return { - radius: radius - }; - var cos = (x - cx) / radius, angleInRadian = Math.acos(cos); - return y > cy && (angleInRadian = 2 * Math.PI - angleInRadian), { - radius: radius, - angle: radianToDegree(angleInRadian), - angleInRadian: angleInRadian - }; - }, formatAngleOfSector = function(_ref3) { - var startAngle = _ref3.startAngle, endAngle = _ref3.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360), min = Math.min(startCnt, endCnt); - return { - startAngle: startAngle - 360 * min, - endAngle: endAngle - 360 * min - }; - }, reverseFormatAngleOfSetor = function(angle, _ref4) { - var startAngle = _ref4.startAngle, endAngle = _ref4.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360); - return angle + 360 * Math.min(startCnt, endCnt); - }, inRangeOfSector = function(_ref5, sector) { - var x = _ref5.x, y = _ref5.y, _getAngleOfPoint = getAngleOfPoint({ - x: x, - y: y - }, sector), radius = _getAngleOfPoint.radius, angle = _getAngleOfPoint.angle, innerRadius = sector.innerRadius, outerRadius = sector.outerRadius; - if (radius < innerRadius || radius > outerRadius) return !1; - if (0 === radius) return !0; - var _formatAngleOfSector = formatAngleOfSector(sector), startAngle = _formatAngleOfSector.startAngle, endAngle = _formatAngleOfSector.endAngle, formatAngle = angle, inRange = void 0; - if (startAngle <= endAngle) { - for (;formatAngle > endAngle; ) formatAngle -= 360; - for (;formatAngle < startAngle; ) formatAngle += 360; - inRange = formatAngle >= startAngle && formatAngle <= endAngle; - } else { - for (;formatAngle > startAngle; ) formatAngle -= 360; - for (;formatAngle < endAngle; ) formatAngle += 360; - inRange = formatAngle >= endAngle && formatAngle <= startAngle; - } - return inRange ? _extends({}, sector, { - radius: radius, - angle: reverseFormatAngleOfSetor(formatAngle, sector) - }) : null; - }; -}, function(module, exports) { - var global = module.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")(); - "number" == typeof __g && (__g = global); -}, function(module, exports, __webpack_require__) { - module.exports = !__webpack_require__(53)(function() { - return 7 != Object.defineProperty({}, "a", { - get: function() { - return 7; - } - }).a; - }); -}, function(module, exports, __webpack_require__) { - module.exports = { - default: __webpack_require__(394), - __esModule: !0 - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0, exports.default = function(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _defineProperty = __webpack_require__(154), _defineProperty2 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_defineProperty); - exports.default = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), (0, _defineProperty2.default)(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(); -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _typeof2 = __webpack_require__(105), _typeof3 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_typeof2); - exports.default = function(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" !== (void 0 === call ? "undefined" : (0, _typeof3.default)(call)) && "function" != typeof call ? self : call; - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - exports.__esModule = !0; - var _setPrototypeOf = __webpack_require__(411), _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf), _create = __webpack_require__(415), _create2 = _interopRequireDefault(_create), _typeof2 = __webpack_require__(105), _typeof3 = _interopRequireDefault(_typeof2); - exports.default = function(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + (void 0 === superClass ? "undefined" : (0, - _typeof3.default)(superClass))); - subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (_setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass); - }; -}, function(module, exports, __webpack_require__) { - var freeGlobal = __webpack_require__(268), freeSelf = "object" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function("return this")(); - module.exports = root; -}, function(module, exports) { - function isObject(value) { - var type = typeof value; - return null != value && ("object" == type || "function" == type); - } - module.exports = isObject; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }), exports.translateStyle = exports.AnimateGroup = exports.configBezier = exports.configSpring = void 0; - var _Animate = __webpack_require__(287), _Animate2 = _interopRequireDefault(_Animate), _easing = __webpack_require__(305), _util = __webpack_require__(132), _AnimateGroup = __webpack_require__(762), _AnimateGroup2 = _interopRequireDefault(_AnimateGroup); - exports.configSpring = _easing.configSpring, exports.configBezier = _easing.configBezier, - exports.AnimateGroup = _AnimateGroup2.default, exports.translateStyle = _util.translateStyle, - exports.default = _Animate2.default; -}, function(module, exports) { - var isArray = Array.isArray; - module.exports = isArray; -}, function(module, exports) { - module.exports = function(it) { - return "object" == typeof it ? null !== it : "function" == typeof it; - }; -}, function(module, exports, __webpack_require__) { - var freeGlobal = __webpack_require__(292), freeSelf = "object" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function("return this")(); - module.exports = root; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - var __WEBPACK_IMPORTED_MODULE_0__src_bisect__ = __webpack_require__(332); - __webpack_require__.d(__webpack_exports__, "b", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_bisect__.a; - }); - var __WEBPACK_IMPORTED_MODULE_1__src_ascending__ = __webpack_require__(69); - __webpack_require__.d(__webpack_exports__, "a", function() { - return __WEBPACK_IMPORTED_MODULE_1__src_ascending__.a; - }); - var __WEBPACK_IMPORTED_MODULE_2__src_bisector__ = __webpack_require__(333); - __webpack_require__.d(__webpack_exports__, "c", function() { - return __WEBPACK_IMPORTED_MODULE_2__src_bisector__.a; - }); - var __WEBPACK_IMPORTED_MODULE_18__src_quantile__ = (__webpack_require__(848), __webpack_require__(849), - __webpack_require__(335), __webpack_require__(337), __webpack_require__(850), __webpack_require__(853), - __webpack_require__(854), __webpack_require__(341), __webpack_require__(855), __webpack_require__(856), - __webpack_require__(857), __webpack_require__(858), __webpack_require__(342), __webpack_require__(334), - __webpack_require__(859), __webpack_require__(204)); - __webpack_require__.d(__webpack_exports__, "d", function() { - return __WEBPACK_IMPORTED_MODULE_18__src_quantile__.a; - }); - var __WEBPACK_IMPORTED_MODULE_19__src_range__ = __webpack_require__(339); - __webpack_require__.d(__webpack_exports__, "e", function() { - return __WEBPACK_IMPORTED_MODULE_19__src_range__.a; - }); - var __WEBPACK_IMPORTED_MODULE_23__src_ticks__ = (__webpack_require__(860), __webpack_require__(861), - __webpack_require__(862), __webpack_require__(340)); - __webpack_require__.d(__webpack_exports__, "h", function() { - return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.a; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.b; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.c; - }); - __webpack_require__(343), __webpack_require__(336), __webpack_require__(863); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_require__.d(__webpack_exports__, "d", function() { - return durationSecond; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return durationMinute; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return durationHour; - }), __webpack_require__.d(__webpack_exports__, "a", function() { - return durationDay; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return durationWeek; - }); - var durationSecond = 1e3, durationMinute = 6e4, durationHour = 36e5, durationDay = 864e5, durationWeek = 6048e5; -}, function(module, exports, __webpack_require__) { - var dP = __webpack_require__(22), createDesc = __webpack_require__(75); - module.exports = __webpack_require__(25) ? function(object, key, value) { - return dP.f(object, key, createDesc(1, value)); - } : function(object, key, value) { - return object[key] = value, object; - }; -}, function(module, exports) { - var g; - g = function() { - return this; - }(); - try { - g = g || Function("return this")() || (0, eval)("this"); - } catch (e) { - "object" == typeof window && (g = window); - } - module.exports = g; -}, function(module, exports, __webpack_require__) { - function baseGetTag(value) { - return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); - } - var Symbol = __webpack_require__(83), getRawTag = __webpack_require__(603), objectToString = __webpack_require__(604), nullTag = "[object Null]", undefinedTag = "[object Undefined]", symToStringTag = Symbol ? Symbol.toStringTag : void 0; - module.exports = baseGetTag; -}, function(module, exports) { - function isObjectLike(value) { - return null != value && "object" == typeof value; - } - module.exports = isObjectLike; -}, function(module, exports) { - function isObjectLike(value) { - return null != value && "object" == typeof value; - } - module.exports = isObjectLike; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - function Label(props) { - var viewBox = props.viewBox, position = props.position, value = props.value, children = props.children, content = props.content, _props$className = props.className, className = void 0 === _props$className ? "" : _props$className; - if (!viewBox || __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(value) && __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(children) && !Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content) && !__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) return null; - if (Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content)) return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(content, props); - var label = void 0; - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) { - if (label = content(props), Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label)) return label; - } else label = getLabel(props); - var isPolarLabel = isPolar(viewBox), attrs = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(props); - if (isPolarLabel && ("insideStart" === position || "insideEnd" === position || "end" === position)) return renderRadialLabel(props, label, attrs); - var positionAttrs = isPolarLabel ? getAttrsOfPolarLabel(props) : getAttrsOfCartesianLabel(props); - return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__Text__.a, _extends({ - className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-label", className) - }, attrs, positionAttrs), label); - } - var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__Text__ = __webpack_require__(61), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__ = __webpack_require__(23), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, cartesianViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({ - x: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - y: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - width: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number - }), polarViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({ - cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - innerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - outerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - startAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - endAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number - }), propTypes = { - viewBox: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ cartesianViewBoxShape, polarViewBoxShape ]), - formatter: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, - value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]), - offset: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - position: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "top", "left", "right", "bottom", "inside", "outside", "insideLeft", "insideRight", "insideTop", "insideBottom", "insideTopLeft", "insideBottomLeft", "insideTopRight", "insideBottomRight", "insideStart", "insideEnd", "end", "center" ]), - children: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node ]), - className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, - content: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]) - }, defaultProps = { - offset: 5 - }, getLabel = function(props) { - var value = props.value, formatter = props.formatter, label = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(props.children) ? value : props.children; - return __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(formatter) ? formatter(label) : label; - }, getDeltaAngle = function(startAngle, endAngle) { - return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.j)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 360); - }, renderRadialLabel = function(labelProps, label, attrs) { - var position = labelProps.position, viewBox = labelProps.viewBox, offset = labelProps.offset, className = labelProps.className, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, clockWise = viewBox.clockWise, radius = (innerRadius + outerRadius) / 2, deltaAngle = getDeltaAngle(startAngle, endAngle), sign = deltaAngle >= 0 ? 1 : -1, labelAngle = void 0, direction = void 0; - "insideStart" === position ? (labelAngle = startAngle + sign * offset, direction = clockWise) : "insideEnd" === position ? (labelAngle = endAngle - sign * offset, - direction = !clockWise) : "end" === position && (labelAngle = endAngle + sign * offset, - direction = clockWise), direction = deltaAngle <= 0 ? direction : !direction; - var startPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle + 359 * (direction ? 1 : -1)), path = "M" + startPoint.x + "," + startPoint.y + "\n A" + radius + "," + radius + ",0,1," + (direction ? 0 : 1) + ",\n " + endPoint.x + "," + endPoint.y, id = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(labelProps.id) ? Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.k)("recharts-radial-line-") : labelProps.id; - return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("text", _extends({}, attrs, { - dominantBaseline: "central", - className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-radial-bar-label", className) - }), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("defs", null, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("path", { - id: id, - d: path - })), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("textPath", { - xlinkHref: "#" + id - }, label)); - }, getAttrsOfPolarLabel = function(props) { - var viewBox = props.viewBox, offset = props.offset, position = props.position, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, midAngle = (startAngle + endAngle) / 2; - if ("outside" === position) { - var _polarToCartesian = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, outerRadius + offset, midAngle), _x = _polarToCartesian.x; - return { - x: _x, - y: _polarToCartesian.y, - textAnchor: _x >= cx ? "start" : "end", - verticalAnchor: "middle" - }; - } - if ("center" === position) return { - x: cx, - y: cy, - textAnchor: "middle", - verticalAnchor: "middle" - }; - var r = (innerRadius + outerRadius) / 2, _polarToCartesian2 = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, r, midAngle); - return { - x: _polarToCartesian2.x, - y: _polarToCartesian2.y, - textAnchor: "middle", - verticalAnchor: "middle" - }; - }, getAttrsOfCartesianLabel = function(props) { - var viewBox = props.viewBox, offset = props.offset, position = props.position, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height, sign = height >= 0 ? 1 : -1; - return "top" === position ? { - x: x + width / 2, - y: y - sign * offset, - textAnchor: "middle", - verticalAnchor: "end" - } : "bottom" === position ? { - x: x + width / 2, - y: y + height + sign * offset, - textAnchor: "middle", - verticalAnchor: "start" - } : "left" === position ? { - x: x - offset, - y: y + height / 2, - textAnchor: "end", - verticalAnchor: "middle" - } : "right" === position ? { - x: x + width + offset, - y: y + height / 2, - textAnchor: "start", - verticalAnchor: "middle" - } : "insideLeft" === position ? { - x: x + offset, - y: y + height / 2, - textAnchor: "start", - verticalAnchor: "middle" - } : "insideRight" === position ? { - x: x + width - offset, - y: y + height / 2, - textAnchor: "end", - verticalAnchor: "middle" - } : "insideTop" === position ? { - x: x + width / 2, - y: y + sign * offset, - textAnchor: "middle", - verticalAnchor: "start" - } : "insideBottom" === position ? { - x: x + width / 2, - y: y + height - sign * offset, - textAnchor: "middle", - verticalAnchor: "end" - } : "insideTopLeft" === position ? { - x: x + offset, - y: y + sign * offset, - textAnchor: "start", - verticalAnchor: "start" - } : "insideTopRight" === position ? { - x: x + width - offset, - y: y + sign * offset, - textAnchor: "end", - verticalAnchor: "start" - } : "insideBottomLeft" === position ? { - x: x + offset, - y: y + height - sign * offset, - textAnchor: "start", - verticalAnchor: "end" - } : "insideBottomRight" === position ? { - x: x + width - offset, - y: y + height - sign * offset, - textAnchor: "end", - verticalAnchor: "end" - } : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(position) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.x) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.i)(position.x)) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.y) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.i)(position.y)) ? { - x: x + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.d)(position.x, width), - y: y + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.d)(position.y, height), - textAnchor: "end", - verticalAnchor: "end" - } : { - x: x + width / 2, - y: y + height / 2, - textAnchor: "middle", - verticalAnchor: "middle" - }; - }, isPolar = function(viewBox) { - return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(viewBox.cx); - }; - Label.displayName = "Label", Label.defaultProps = defaultProps, Label.propTypes = propTypes; - var parseViewBox = function(props) { - var cx = props.cx, cy = props.cy, angle = props.angle, startAngle = props.startAngle, endAngle = props.endAngle, r = props.r, radius = props.radius, innerRadius = props.innerRadius, outerRadius = props.outerRadius, x = props.x, y = props.y, top = props.top, left = props.left, width = props.width, height = props.height, clockWise = props.clockWise; - if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(width) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(height)) { - if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(y)) return { - x: x, - y: y, - width: width, - height: height - }; - if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(top) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(left)) return { - x: top, - y: left, - width: width, - height: height - }; - } - return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(y) ? { - x: x, - y: y, - width: 0, - height: 0 - } : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(cx) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(cy) ? { - cx: cx, - cy: cy, - startAngle: startAngle || angle || 0, - endAngle: endAngle || angle || 0, - innerRadius: innerRadius || 0, - outerRadius: outerRadius || radius || r || 0, - clockWise: clockWise - } : props.viewBox ? props.viewBox : {}; - }, parseLabel = function(label, viewBox) { - return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, { - key: "label-implicit", - viewBox: viewBox - }) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, { - key: "label-implicit", - viewBox: viewBox, - value: label - }) : Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, { - key: "label-implicit", - content: label, - viewBox: viewBox - }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, _extends({ - viewBox: viewBox - }, label, { - key: "label-implicit" - })) : null : null; - }, renderCallByParent = function(parentProps, viewBox) { - var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; - if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null; - var children = parentProps.children, parentViewBox = parseViewBox(parentProps), explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.h)(children, Label).map(function(child, index) { - return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(child, { - viewBox: viewBox || parentViewBox, - key: "label-" + index - }); - }); - return ckeckPropsLabel ? [ parseLabel(parentProps.label, viewBox || parentViewBox) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren; - }; - Label.parseViewBox = parseViewBox, Label.renderCallByParent = renderCallByParent, - __webpack_exports__.a = Label; -}, function(module, exports, __webpack_require__) { - function isEqual(value, other) { - return baseIsEqual(value, other); - } - var baseIsEqual = __webpack_require__(199); - module.exports = isEqual; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - var __WEBPACK_IMPORTED_MODULE_0__src_color__ = __webpack_require__(207); - __webpack_require__.d(__webpack_exports__, "a", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_color__.e; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_color__.g; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_color__.f; - }); - var __WEBPACK_IMPORTED_MODULE_1__src_lab__ = __webpack_require__(871); - __webpack_require__.d(__webpack_exports__, "e", function() { - return __WEBPACK_IMPORTED_MODULE_1__src_lab__.a; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return __WEBPACK_IMPORTED_MODULE_1__src_lab__.b; - }); - var __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__ = __webpack_require__(872); - __webpack_require__.d(__webpack_exports__, "b", function() { - return __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__.a; - }); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function LabelList(props) { - var data = props.data, valueAccessor = props.valueAccessor, dataKey = props.dataKey, clockWise = props.clockWise, id = props.id, others = _objectWithoutProperties(props, [ "data", "valueAccessor", "dataKey", "clockWise", "id" ]); - return data && data.length ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, { - className: "recharts-label-list" - }, data.map(function(entry, index) { - var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(dataKey) ? valueAccessor(entry, index) : Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.w)(entry && entry.payload, dataKey), idProps = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? {} : { - id: id + "-" + index - }; - return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__Label__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(entry), others, idProps, { - index: index, - value: value, - viewBox: __WEBPACK_IMPORTED_MODULE_7__Label__.a.parseViewBox(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(clockWise) ? entry : _extends({}, entry, { - clockWise: clockWise - })), - key: "label-" + index - })); - })) : null; - } - var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_lodash_last__ = __webpack_require__(922), __WEBPACK_IMPORTED_MODULE_3_lodash_last___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_last__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, propTypes = { - id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object), - valueAccessor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - clockWise: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool, - dataKey: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func ]) - }, defaultProps = { - valueAccessor: function(entry) { - return __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(entry.value) ? __WEBPACK_IMPORTED_MODULE_3_lodash_last___default()(entry.value) : entry.value; - } - }; - LabelList.propTypes = propTypes, LabelList.displayName = "LabelList"; - var parseLabelList = function(label, data) { - return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, { - key: "labelList-implicit", - data: data - }) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, { - key: "labelList-implicit", - data: data, - content: label - }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, _extends({ - data: data - }, label, { - key: "labelList-implicit" - })) : null : null; - }, renderCallByParent = function(parentProps, data) { - var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; - if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null; - var children = parentProps.children, explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.h)(children, LabelList).map(function(child, index) { - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(child, { - data: data, - key: "labelList-" + index - }); - }); - return ckeckPropsLabel ? [ parseLabelList(parentProps.label, data) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren; - }; - LabelList.renderCallByParent = renderCallByParent, LabelList.defaultProps = defaultProps, - __webpack_exports__.a = LabelList; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function _defineProperty(obj, key, value) { - return key in obj ? Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - } - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 + function s(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__ = __webpack_require__(321), __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_range__ = __webpack_require__(373), __WEBPACK_IMPORTED_MODULE_2_lodash_range___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_range__), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle__ = __webpack_require__(933), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_throttle__), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_7_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_classnames__), __WEBPACK_IMPORTED_MODULE_8__container_Surface__ = __webpack_require__(82), __WEBPACK_IMPORTED_MODULE_9__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__ = __webpack_require__(125), __WEBPACK_IMPORTED_MODULE_11__component_Legend__ = __webpack_require__(180), __WEBPACK_IMPORTED_MODULE_12__shape_Curve__ = __webpack_require__(71), __WEBPACK_IMPORTED_MODULE_13__shape_Cross__ = __webpack_require__(367), __WEBPACK_IMPORTED_MODULE_14__shape_Sector__ = __webpack_require__(139), __WEBPACK_IMPORTED_MODULE_15__shape_Dot__ = __webpack_require__(63), __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__ = __webpack_require__(70), __WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__ = __webpack_require__(374), __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__ = __webpack_require__(372), __WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__ = __webpack_require__(198), __WEBPACK_IMPORTED_MODULE_21__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_24__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_25__util_Events__ = __webpack_require__(934), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), ORIENT_MAP = { - xAxis: [ "bottom", "top" ], - yAxis: [ "left", "right" ] - }, originCoordinate = { - x: 0, - y: 0 - }, generateCategoricalChart = function(_ref) { - var _class, _temp, _initialiseProps, chartName = _ref.chartName, GraphicalChild = _ref.GraphicalChild, _ref$eventType = _ref.eventType, eventType = void 0 === _ref$eventType ? "axis" : _ref$eventType, axisComponents = _ref.axisComponents, legendContent = _ref.legendContent, formatAxisMap = _ref.formatAxisMap, defaultProps = _ref.defaultProps, propTypes = _ref.propTypes; - return _temp = _class = function(_Component) { - function CategoricalChartWrapper(props) { - _classCallCheck(this, CategoricalChartWrapper); - var _this = _possibleConstructorReturn(this, (CategoricalChartWrapper.__proto__ || Object.getPrototypeOf(CategoricalChartWrapper)).call(this, props)); - _initialiseProps.call(_this); - var defaultState = _this.constructor.createDefaultState(props); - return _this.state = _extends({}, defaultState, { - updateId: 0 - }, _this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({ - props: props - }, defaultState, { - updateId: 0 - }))), _this.uniqueChartId = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(props.id) ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.k)("recharts") : props.id, - props.throttleDelay && (_this.triggeredAfterMouseMove = __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default()(_this.triggeredAfterMouseMove, props.throttleDelay)), - _this; - } - return _inherits(CategoricalChartWrapper, _Component), _createClass(CategoricalChartWrapper, [ { - key: "componentDidMount", - value: function() { - __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.addListener(); - } - }, { - key: "componentWillReceiveProps", - value: function(nextProps) { - var _props = this.props, data = _props.data, children = _props.children, width = _props.width, height = _props.height, layout = _props.layout, stackOffset = _props.stackOffset, margin = _props.margin, updateId = this.state.updateId; - if (nextProps.data === data && nextProps.width === width && nextProps.height === height && nextProps.layout === layout && nextProps.stackOffset === stackOffset && Object(__WEBPACK_IMPORTED_MODULE_24__util_PureRender__.b)(nextProps.margin, margin)) { - if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.m)(nextProps.children, children)) { - var hasGlobalData = !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.data), newUpdateId = hasGlobalData ? updateId : updateId + 1, _state = this.state, dataStartIndex = _state.dataStartIndex, dataEndIndex = _state.dataEndIndex, _defaultState = _extends({}, this.constructor.createDefaultState(nextProps), { - dataEndIndex: dataEndIndex, - dataStartIndex: dataStartIndex - }); - this.setState(_extends({}, _defaultState, { - updateId: newUpdateId - }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({ - props: nextProps - }, _defaultState, { - updateId: newUpdateId - })))); - } - } else { - var defaultState = this.constructor.createDefaultState(nextProps); - this.setState(_extends({}, defaultState, { - updateId: updateId + 1 - }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({ - props: nextProps - }, defaultState, { - updateId: updateId + 1 - })))); - } - __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.addListener(), - !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.removeListener(); + (r = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : n("./node_modules/react-hot-loader/index.js")).enterModule) && r(e); + var l, u, c = [ { + id: "home", + menu: { + title: "Home", + icon: o.d } }, { - key: "componentWillUnmount", - value: function() { - __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.removeListener(), - "function" == typeof this.triggeredAfterMouseMove.cancel && this.triggeredAfterMouseMove.cancel(); + id: "chain", + menu: { + title: "Chain", + icon: o.e } }, { - key: "getAxisMap", - value: function(props, _ref2) { - var _ref2$axisType = _ref2.axisType, axisType = void 0 === _ref2$axisType ? "xAxis" : _ref2$axisType, AxisComp = _ref2.AxisComp, graphicalItems = _ref2.graphicalItems, stackGroups = _ref2.stackGroups, dataStartIndex = _ref2.dataStartIndex, dataEndIndex = _ref2.dataEndIndex, children = props.children, axisIdKey = axisType + "Id", axes = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, AxisComp), axisMap = {}; - return axes && axes.length ? axisMap = this.getAxisMapByAxes(props, { - axes: axes, - graphicalItems: graphicalItems, - axisType: axisType, - axisIdKey: axisIdKey, - stackGroups: stackGroups, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }) : graphicalItems && graphicalItems.length && (axisMap = this.getAxisMapByItems(props, { - Axis: AxisComp, - graphicalItems: graphicalItems, - axisType: axisType, - axisIdKey: axisIdKey, - stackGroups: stackGroups, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - })), axisMap; + id: "txpool", + menu: { + title: "TxPool", + icon: a.b } }, { - key: "getAxisMapByAxes", - value: function(props, _ref3) { - var _this2 = this, axes = _ref3.axes, graphicalItems = _ref3.graphicalItems, axisType = _ref3.axisType, axisIdKey = _ref3.axisIdKey, stackGroups = _ref3.stackGroups, dataStartIndex = _ref3.dataStartIndex, dataEndIndex = _ref3.dataEndIndex, layout = props.layout, children = props.children, stackOffset = props.stackOffset, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType); - return axes.reduce(function(result, child) { - var _child$props = child.props, type = _child$props.type, dataKey = _child$props.dataKey, allowDataOverflow = _child$props.allowDataOverflow, allowDuplicatedCategory = _child$props.allowDuplicatedCategory, scale = _child$props.scale, ticks = _child$props.ticks, axisId = child.props[axisIdKey], displayedData = _this2.constructor.getDisplayedData(props, { - graphicalItems: graphicalItems.filter(function(item) { - return item.props[axisIdKey] === axisId; - }), - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }), len = displayedData.length; - if (!result[axisId]) { - var domain = void 0, duplicateDomain = void 0, categoricalDomain = void 0; - if (dataKey) { - if (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, type), - "category" === type && isCategorial) { - var duplicate = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.e)(domain); - allowDuplicatedCategory && duplicate ? (duplicateDomain = domain, domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len)) : allowDuplicatedCategory || (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) { - return finalDomain.indexOf(entry) >= 0 ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]); - }, [])); - } else if ("category" === type) domain = allowDuplicatedCategory ? domain.filter(function(entry) { - return "" !== entry && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry); - }) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) { - return finalDomain.indexOf(entry) >= 0 || "" === entry || __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry) ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]); - }, []); else if ("number" === type) { - var errorBarsDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.z)(displayedData, graphicalItems.filter(function(item) { - return item.props[axisIdKey] === axisId && !item.props.hide; - }), dataKey, axisType); - errorBarsDomain && (domain = errorBarsDomain); - } - !isCategorial || "number" !== type && "auto" === scale || (categoricalDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, "category")); - } else domain = isCategorial ? __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack && "number" === type ? "expand" === stackOffset ? [ 0, 1 ] : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) { - return item.props[axisIdKey] === axisId && !item.props.hide; - }), type, !0); - return "number" === type && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType, ticks), - child.props.domain && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(child.props.domain, domain, allowDataOverflow))), - _extends({}, result, _defineProperty({}, axisId, _extends({}, child.props, { - axisType: axisType, - domain: domain, - categoricalDomain: categoricalDomain, - duplicateDomain: duplicateDomain, - originalDomain: child.props.domain, - isCategorial: isCategorial, - layout: layout - }))); - } - return result; - }, {}); + id: "network", + menu: { + title: "Network", + icon: o.c } }, { - key: "getAxisMapByItems", - value: function(props, _ref4) { - var graphicalItems = _ref4.graphicalItems, Axis = _ref4.Axis, axisType = _ref4.axisType, axisIdKey = _ref4.axisIdKey, stackGroups = _ref4.stackGroups, dataStartIndex = _ref4.dataStartIndex, dataEndIndex = _ref4.dataEndIndex, layout = props.layout, children = props.children, displayedData = this.constructor.getDisplayedData(props, { - graphicalItems: graphicalItems, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }), len = displayedData.length, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType), index = -1; - return graphicalItems.reduce(function(result, child) { - var axisId = child.props[axisIdKey]; - if (!result[axisId]) { - index++; - var domain = void 0; - return isCategorial ? domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack ? (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex), - domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)) : (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(Axis.defaultProps.domain, Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) { - return item.props[axisIdKey] === axisId && !item.props.hide; - }), "number"), Axis.defaultProps.allowDataOverflow), domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)), - _extends({}, result, _defineProperty({}, axisId, _extends({ - axisType: axisType - }, Axis.defaultProps, { - hide: !0, - orientation: ORIENT_MAP[axisType] && ORIENT_MAP[axisType][index % 2], - domain: domain, - originalDomain: Axis.defaultProps.domain, - isCategorial: isCategorial, - layout: layout - }))); - } - return result; - }, {}); + id: "system", + menu: { + title: "System", + icon: o.g } }, { - key: "getActiveCoordinate", - value: function(tooltipTicks, activeIndex, rangeObj) { - var layout = this.props.layout, entry = tooltipTicks.find(function(tick) { - return tick && tick.index === activeIndex; - }); - if (entry) { - if ("horizontal" === layout) return { - x: entry.coordinate, - y: rangeObj.y - }; - if ("vertical" === layout) return { - x: rangeObj.x, - y: entry.coordinate - }; - if ("centric" === layout) { - var _angle = entry.coordinate, _radius = rangeObj.radius; - return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, _radius, _angle), { - angle: _angle, - radius: _radius - }); - } - var radius = entry.coordinate, angle = rangeObj.angle; - return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, radius, angle), { - angle: angle, - radius: radius - }); + id: "logs", + menu: { + title: "Logs", + icon: o.f + } + } ], d = new Map(c.map(function(e) { + var t = e.id; + return [ t, i({ + id: t + }, e.menu) ]; + })), f = 200, p = .2, h = { + light: { + color: "rgba(255, 255, 255, 0.54)" + } + }, _ = [ "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi" ], m = function(e) { + for (var t = 0; e > 1024 && t < 8; t++) e /= 1024; + return e.toFixed(2).toString().concat(" ", _[t], "B"); + }, y = [ "#00FF00", "#FFFF00", "#FF7F00", "#FF0000" ], b = [ 0, 2048, 102400, 2097152 ]; + (l = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : n("./node_modules/react-hot-loader/index.js")).default) && (l.register(c, "menuSkeletons", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/common.jsx"), + l.register(d, "MENU", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/common.jsx"), + l.register(f, "DURATION", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/common.jsx"), + l.register(p, "chartStrokeWidth", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/common.jsx"), + l.register(h, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/common.jsx"), + l.register(_, "unit", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/common.jsx"), + l.register(m, "simplifyBytes", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/common.jsx"), + l.register(y, "hues", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/common.jsx"), + l.register(b, "hueScale", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/common.jsx")), + (u = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : n("./node_modules/react-hot-loader/index.js")).leaveModule) && u(e); + }).call(this, n("./node_modules/webpack/buildin/harmony-module.js")(e)); + }, + "./components/Body.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _SideBar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./components/SideBar.jsx"), _Main__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./components/Main.jsx"), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); + } + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 } - return originCoordinate; - } - }, { - key: "getMouseInfo", - value: function(event) { - if (!this.container) return null; - var containerOffset = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.b)(this.container), e = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.a)(event, containerOffset), rangeObj = this.inRange(e.chartX, e.chartY); - if (!rangeObj) return null; - var _state2 = this.state, xAxisMap = _state2.xAxisMap, yAxisMap = _state2.yAxisMap; - if ("axis" !== eventType && xAxisMap && yAxisMap) { - var xScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap).scale, yScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap).scale, xValue = xScale && xScale.invert ? xScale.invert(e.chartX) : null, yValue = yScale && yScale.invert ? yScale.invert(e.chartY) : null; - return _extends({}, e, { - xValue: xValue, - yValue: yValue - }); + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var styles = { + body: { + display: "flex", + width: "100%", + height: "92%" + } + }, Body = function(_Component) { + function Body() { + return _classCallCheck(this, Body), _possibleConstructorReturn(this, _getPrototypeOf(Body).apply(this, arguments)); + } + return _inherits(Body, _Component), _createClass(Body, [ { + key: "render", + value: function() { + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + style: styles.body + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_SideBar__WEBPACK_IMPORTED_MODULE_1__.a, { + opened: this.props.opened, + changeContent: this.props.changeContent + }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Main__WEBPACK_IMPORTED_MODULE_2__.a, { + active: this.props.active, + content: this.props.content, + shouldUpdate: this.props.shouldUpdate, + send: this.props.send + })); } - var _state3 = this.state, ticks = _state3.orderedTooltipTicks, axis = _state3.tooltipAxis, tooltipTicks = _state3.tooltipTicks, pos = this.calculateTooltipPos(rangeObj), activeIndex = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.b)(pos, ticks, tooltipTicks, axis); - if (activeIndex >= 0 && tooltipTicks) { - var activeLabel = tooltipTicks[activeIndex] && tooltipTicks[activeIndex].value, activePayload = this.getTooltipContent(activeIndex, activeLabel), activeCoordinate = this.getActiveCoordinate(ticks, activeIndex, rangeObj); - return _extends({}, e, { - activeTooltipIndex: activeIndex, - activeLabel: activeLabel, - activePayload: activePayload, - activeCoordinate: activeCoordinate - }); + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); } - return null; - } - }, { - key: "getTooltipContent", - value: function(activeIndex, activeLabel) { - var _state4 = this.state, graphicalItems = _state4.graphicalItems, tooltipAxis = _state4.tooltipAxis, displayedData = this.constructor.getDisplayedData(this.props, this.state); - return activeIndex < 0 || !graphicalItems || !graphicalItems.length || activeIndex >= displayedData.length ? null : graphicalItems.reduce(function(result, child) { - if (child.props.hide) return result; - var _child$props2 = child.props, dataKey = _child$props2.dataKey, name = _child$props2.name, unit = _child$props2.unit, formatter = _child$props2.formatter, data = _child$props2.data, payload = void 0; - return payload = tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(data || displayedData, tooltipAxis.dataKey, activeLabel) : displayedData[activeIndex], - payload ? [].concat(_toConsumableArray(result), [ _extends({}, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(child), { - dataKey: dataKey, - unit: unit, - formatter: formatter, - name: name || dataKey, - color: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(child), - value: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.w)(payload, dataKey), - payload: payload - }) ]) : result; - }, []); + } ]), Body; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = Body, reactHotLoader, leaveModule; + __webpack_exports__.a = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Body.jsx"), + reactHotLoader.register(Body, "Body", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Body.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Body.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./components/ChartRow.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/Grid/index.js"), _material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_1__), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); + } + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var styles = { + container: { + flexWrap: "nowrap", + height: "100%", + maxWidth: "100%", + margin: 0 + }, + item: { + flex: 1, + padding: 0 + } + }, ChartRow = function(_Component) { + function ChartRow() { + return _classCallCheck(this, ChartRow), _possibleConstructorReturn(this, _getPrototypeOf(ChartRow).apply(this, arguments)); + } + return _inherits(ChartRow, _Component), _createClass(ChartRow, [ { + key: "render", + value: function() { + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_1___default.a, { + container: !0, + direction: "row", + style: styles.container, + justify: "space-between" + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.Children.map(this.props.children, function(e) { + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_1___default.a, { + item: !0, + xs: !0, + style: styles.item + }, e); + })); + } + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); + } + } ]), ChartRow; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = ChartRow, reactHotLoader, leaveModule; + __webpack_exports__.a = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/ChartRow.jsx"), + reactHotLoader.register(ChartRow, "ChartRow", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/ChartRow.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/ChartRow.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./components/CustomTooltip.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + __webpack_require__.d(__webpack_exports__, "d", function() { + return multiplier; + }), __webpack_require__.d(__webpack_exports__, "e", function() { + return percentPlotter; + }), __webpack_require__.d(__webpack_exports__, "b", function() { + return bytePlotter; + }), __webpack_require__.d(__webpack_exports__, "a", function() { + return bytePerSecPlotter; + }); + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/Typography/index.js"), _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_1__), _common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./common.jsx"), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); + } + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var multiplier = function() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 1; + return function(t) { + return t * e; + }; + }, percentPlotter = function(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : multiplier(1); + return function(n) { + var r = t(n); + return "number" != typeof r ? null : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_1___default.a, { + type: "caption", + color: "inherit" + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", { + style: _common__WEBPACK_IMPORTED_MODULE_2__.g.light + }, e), " ", r.toFixed(2), " %"); + }; + }, bytePlotter = function(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : multiplier(1); + return function(n) { + var r = t(n); + return "number" != typeof r ? null : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_1___default.a, { + type: "caption", + color: "inherit" + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", { + style: _common__WEBPACK_IMPORTED_MODULE_2__.g.light + }, e), " ", Object(_common__WEBPACK_IMPORTED_MODULE_2__.f)(r)); + }; + }, bytePerSecPlotter = function(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : multiplier(1); + return function(n) { + var r = t(n); + return "number" != typeof r ? null : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_1___default.a, { + type: "caption", + color: "inherit" + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", { + style: _common__WEBPACK_IMPORTED_MODULE_2__.g.light + }, e), Object(_common__WEBPACK_IMPORTED_MODULE_2__.f)(r), "/s"); + }; + }, CustomTooltip = function(_Component) { + function CustomTooltip() { + return _classCallCheck(this, CustomTooltip), _possibleConstructorReturn(this, _getPrototypeOf(CustomTooltip).apply(this, arguments)); + } + return _inherits(CustomTooltip, _Component), _createClass(CustomTooltip, [ { + key: "render", + value: function() { + var e = this.props, t = e.active, n = e.payload, r = e.tooltip; + return !t || "function" != typeof r || !Array.isArray(n) || n.length < 1 ? null : r(n[0].value); + } + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); + } + } ]), CustomTooltip; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = CustomTooltip, reactHotLoader, leaveModule; + __webpack_exports__.c = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(multiplier, "multiplier", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/CustomTooltip.jsx"), + reactHotLoader.register(percentPlotter, "percentPlotter", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/CustomTooltip.jsx"), + reactHotLoader.register(bytePlotter, "bytePlotter", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/CustomTooltip.jsx"), + reactHotLoader.register(bytePerSecPlotter, "bytePerSecPlotter", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/CustomTooltip.jsx"), + reactHotLoader.register(CustomTooltip, "CustomTooltip", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/CustomTooltip.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/CustomTooltip.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./components/Dashboard.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), react_hot_loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/react-hot-loader/index.js"), react_hot_loader__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(react_hot_loader__WEBPACK_IMPORTED_MODULE_1__), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./node_modules/@material-ui/core/styles/withStyles.js"), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_2___default = __webpack_require__.n(_material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_2__), Header__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./components/Header.jsx"), Body__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./components/Body.jsx"), Logs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./components/Logs.jsx"), Network__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./components/Network.jsx"), _common__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./common.jsx"), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); + } + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + function _defineProperty(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + function _toConsumableArray(e) { + return _arrayWithoutHoles(e) || _iterableToArray(e) || _nonIterableSpread(); + } + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + function _iterableToArray(e) { + if (Symbol.iterator in Object(e) || "[object Arguments]" === Object.prototype.toString.call(e)) return Array.from(e); + } + function _arrayWithoutHoles(e) { + if (Array.isArray(e)) { + for (var t = 0, n = new Array(e.length); t < e.length; t++) n[t] = e[t]; + return n; + } + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var deepUpdate = function e(t, n, r) { + if (void 0 === n) return r; + if ("function" == typeof t) return t(n, r); + var o = {}; + return Object.keys(r).forEach(function(a) { + o[a] = e(t[a], n[a], r[a]); + }), o; + }, shouldUpdate = function e(t, n) { + var r = {}; + return Object.keys(n).forEach(function(o) { + r[o] = "function" == typeof t[o] || e(t[o], n[o]); + }), r; + }, replacer = function(e) { + return e; + }, appender = function(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : replacer; + return function(n, r) { + return [].concat(_toConsumableArray(r), _toConsumableArray(n.map(function(e) { + return t(e); + }))).slice(-e); + }; + }, defaultContent = function() { + return { + general: { + version: null, + commit: null + }, + home: {}, + chain: {}, + txpool: {}, + network: { + peers: { + bundles: {} + }, + diff: [] + }, + system: { + activeMemory: [], + virtualMemory: [], + networkIngress: [], + networkEgress: [], + processCPU: [], + systemCPU: [], + diskRead: [], + diskWrite: [] + }, + logs: { + chunks: [], + endTop: !1, + endBottom: !0, + topChanged: Logs__WEBPACK_IMPORTED_MODULE_5__.a, + bottomChanged: Logs__WEBPACK_IMPORTED_MODULE_5__.a + } + }; + }, updaters = { + general: { + version: replacer, + commit: replacer + }, + home: null, + chain: null, + txpool: null, + network: Object(Network__WEBPACK_IMPORTED_MODULE_6__.b)(200), + system: { + activeMemory: appender(200), + virtualMemory: appender(200), + networkIngress: appender(200), + networkEgress: appender(200), + processCPU: appender(200), + systemCPU: appender(200), + diskRead: appender(200), + diskWrite: appender(200) + }, + logs: Object(Logs__WEBPACK_IMPORTED_MODULE_5__.c)(5) + }, styles = { + dashboard: { + display: "flex", + flexFlow: "column", + width: "100%", + height: "100%", + zIndex: 1, + overflow: "hidden" } - }, { - key: "getFormatItems", - value: function(props, currentState) { - var _this3 = this, graphicalItems = currentState.graphicalItems, stackGroups = currentState.stackGroups, offset = currentState.offset, updateId = currentState.updateId, dataStartIndex = currentState.dataStartIndex, dataEndIndex = currentState.dataEndIndex, barSize = props.barSize, layout = props.layout, barGap = props.barGap, barCategoryGap = props.barCategoryGap, globalMaxBarSize = props.maxBarSize, _getAxisNameByLayout = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout.numericAxisName, cateAxisName = _getAxisNameByLayout.cateAxisName, hasBar = this.constructor.hasBar(graphicalItems), sizeList = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.i)({ - barSize: barSize, - stackGroups: stackGroups - }), formatedItems = []; - return graphicalItems.forEach(function(item, index) { - var displayedData = _this3.constructor.getDisplayedData(props, { - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }, item), _item$props = item.props, dataKey = _item$props.dataKey, childMaxBarSize = _item$props.maxBarSize, numericAxisId = item.props[numericAxisName + "Id"], cateAxisId = item.props[cateAxisName + "Id"], axisObj = axisComponents.reduce(function(result, entry) { - var _extends4, axisMap = currentState[entry.axisType + "Map"], id = item.props[entry.axisType + "Id"], axis = axisMap && axisMap[id]; - return _extends({}, result, (_extends4 = {}, _defineProperty(_extends4, entry.axisType, axis), - _defineProperty(_extends4, entry.axisType + "Ticks", Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis)), - _extends4)); - }, {}), cateAxis = axisObj[cateAxisName], cateTicks = axisObj[cateAxisName + "Ticks"], stackedData = stackGroups && stackGroups[numericAxisId] && stackGroups[numericAxisId].hasStack && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.t)(item, stackGroups[numericAxisId].stackGroups), bandSize = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(cateAxis, cateTicks), maxBarSize = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(childMaxBarSize) ? globalMaxBarSize : childMaxBarSize, barPosition = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.h)({ - barGap: barGap, - barCategoryGap: barCategoryGap, - bandSize: bandSize, - sizeList: sizeList[cateAxisId], - maxBarSize: maxBarSize - }), componsedFn = item && item.type && item.type.getComposedData; - if (componsedFn) { - var _extends5; - formatedItems.push({ - props: _extends({}, componsedFn(_extends({}, axisObj, { - displayedData: displayedData, - props: props, - dataKey: dataKey, - item: item, - bandSize: bandSize, - barPosition: barPosition, - offset: offset, - stackedData: stackedData, - layout: layout, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex, - onItemMouseLeave: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseLeave, null, item.props.onMouseLeave), - onItemMouseEnter: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseEnter, null, item.props.onMouseEnter) - })), (_extends5 = { - key: item.key || "item-" + index - }, _defineProperty(_extends5, numericAxisName, axisObj[numericAxisName]), _defineProperty(_extends5, cateAxisName, axisObj[cateAxisName]), - _defineProperty(_extends5, "animationId", updateId), _extends5)), - childIndex: Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.o)(item, props.children), - item: item + }, themeStyles = function(e) { + return { + dashboard: { + background: e.palette.background.default + } + }; + }, Dashboard = function(_Component) { + function Dashboard(e) { + var t; + return _classCallCheck(this, Dashboard), _defineProperty(_assertThisInitialized(t = _possibleConstructorReturn(this, _getPrototypeOf(Dashboard).call(this, e))), "reconnect", function() { + var e = window.location.host, n = new WebSocket("".concat("https:" === window.location.protocol ? "wss://" : "ws://").concat(e, "/api")); + n.onopen = function() { + t.setState({ + content: defaultContent(), + shouldUpdate: {}, + server: n }); - } - }), formatedItems; - } - }, { - key: "getCursorRectangle", - value: function() { - var layout = this.props.layout, _state5 = this.state, activeCoordinate = _state5.activeCoordinate, offset = _state5.offset, tooltipAxisBandSize = _state5.tooltipAxisBandSize, halfSize = tooltipAxisBandSize / 2; - return { - stroke: "none", - fill: "#ccc", - x: "horizontal" === layout ? activeCoordinate.x - halfSize : offset.left + .5, - y: "horizontal" === layout ? offset.top + .5 : activeCoordinate.y - halfSize, - width: "horizontal" === layout ? tooltipAxisBandSize : offset.width - 1, - height: "horizontal" === layout ? offset.height - 1 : tooltipAxisBandSize - }; - } - }, { - key: "getCursorPoints", - value: function() { - var layout = this.props.layout, _state6 = this.state, activeCoordinate = _state6.activeCoordinate, offset = _state6.offset, x1 = void 0, y1 = void 0, x2 = void 0, y2 = void 0; - if ("horizontal" === layout) x1 = activeCoordinate.x, x2 = x1, y1 = offset.top, - y2 = offset.top + offset.height; else if ("vertical" === layout) y1 = activeCoordinate.y, - y2 = y1, x1 = offset.left, x2 = offset.left + offset.width; else if (!__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cx) || !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cy)) { - if ("centric" !== layout) { - var _cx = activeCoordinate.cx, _cy = activeCoordinate.cy, radius = activeCoordinate.radius, startAngle = activeCoordinate.startAngle, endAngle = activeCoordinate.endAngle, startPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, startAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, endAngle); + }, n.onmessage = function(e) { + var n = JSON.parse(e.data); + n ? t.update(n) : console.error("Incoming message is ".concat(n)); + }, n.onclose = function() { + t.setState({ + server: null + }), setTimeout(t.reconnect, 3e3); + }; + }), _defineProperty(_assertThisInitialized(t), "send", function(e) { + null != t.state.server && t.state.server.send(e); + }), _defineProperty(_assertThisInitialized(t), "update", function(e) { + t.setState(function(t) { return { - points: [ startPoint, endPoint ], - cx: _cx, - cy: _cy, - radius: radius, - startAngle: startAngle, - endAngle: endAngle + content: deepUpdate(updaters, e, t.content), + shouldUpdate: shouldUpdate(updaters, e) }; - } - var cx = activeCoordinate.cx, cy = activeCoordinate.cy, innerRadius = activeCoordinate.innerRadius, outerRadius = activeCoordinate.outerRadius, angle = activeCoordinate.angle, innerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, innerRadius, angle), outerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, outerRadius, angle); - x1 = innerPoint.x, y1 = innerPoint.y, x2 = outerPoint.x, y2 = outerPoint.y; + }); + }), _defineProperty(_assertThisInitialized(t), "changeContent", function(e) { + t.setState(function(t) { + return t.active !== e ? { + active: e + } : {}; + }); + }), _defineProperty(_assertThisInitialized(t), "switchSideBar", function() { + t.setState(function(e) { + return { + sideBar: !e.sideBar + }; + }); + }), t.state = { + active: _common__WEBPACK_IMPORTED_MODULE_7__.b.get("home").id, + sideBar: !0, + content: defaultContent(), + shouldUpdate: {}, + server: null + }, t; + } + return _inherits(Dashboard, _Component), _createClass(Dashboard, [ { + key: "componentDidMount", + value: function() { + this.reconnect(); } - return [ { - x: x1, - y: y1 - }, { - x: x2, - y: y2 - } ]; + }, { + key: "render", + value: function() { + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + className: this.props.classes.dashboard, + style: styles.dashboard + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Header__WEBPACK_IMPORTED_MODULE_3__.a, { + switchSideBar: this.switchSideBar + }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Body__WEBPACK_IMPORTED_MODULE_4__.a, { + opened: this.state.sideBar, + changeContent: this.changeContent, + active: this.state.active, + content: this.state.content, + shouldUpdate: this.state.shouldUpdate, + send: this.send + })); + } + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); + } + } ]), Dashboard; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = Object(react_hot_loader__WEBPACK_IMPORTED_MODULE_1__.hot)(module)(_material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_2___default()(themeStyles)(Dashboard)), reactHotLoader, leaveModule; + __webpack_exports__.a = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(deepUpdate, "deepUpdate", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx"), + reactHotLoader.register(shouldUpdate, "shouldUpdate", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx"), + reactHotLoader.register(replacer, "replacer", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx"), + reactHotLoader.register(appender, "appender", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx"), + reactHotLoader.register(defaultContent, "defaultContent", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx"), + reactHotLoader.register(updaters, "updaters", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx"), + reactHotLoader.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx"), + reactHotLoader.register(themeStyles, "themeStyles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx"), + reactHotLoader.register(Dashboard, "Dashboard", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Dashboard.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./components/Footer.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/styles/withStyles.js"), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__), _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./node_modules/@material-ui/core/Typography/index.js"), _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_2___default = __webpack_require__.n(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_2__), _material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./node_modules/@material-ui/core/Grid/index.js"), _material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_3___default = __webpack_require__.n(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_3__), recharts_es6_component_ResponsiveContainer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./node_modules/recharts/es6/component/ResponsiveContainer.js"), recharts_es6_chart_AreaChart__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./node_modules/recharts/es6/chart/AreaChart.js"), recharts_es6_cartesian_Area__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./node_modules/recharts/es6/cartesian/Area.js"), recharts_es6_cartesian_ReferenceLine__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./node_modules/recharts/es6/cartesian/ReferenceLine.js"), recharts_es6_component_Label__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("./node_modules/recharts/es6/component/Label.js"), recharts_es6_component_Tooltip__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__("./node_modules/recharts/es6/component/Tooltip.js"), ChartRow__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__("./components/ChartRow.jsx"), CustomTooltip__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__("./components/CustomTooltip.jsx"), _common__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__("./common.jsx"), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _extends() { + return (_extends = Object.assign || function(e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); } - }, { - key: "getAxisNameByLayout", - value: function(layout) { - return "horizontal" === layout ? { - numericAxisName: "yAxis", - cateAxisName: "xAxis" - } : "vertical" === layout ? { - numericAxisName: "xAxis", - cateAxisName: "yAxis" - } : "centric" === layout ? { - numericAxisName: "radiusAxis", - cateAxisName: "angleAxis" - } : { - numericAxisName: "angleAxis", - cateAxisName: "radiusAxis" - }; + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + function _defineProperty(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var FOOTER_SYNC_ID = "footerSyncId", CPU = "cpu", MEMORY = "memory", DISK = "disk", TRAFFIC = "traffic", TOP = "Top", BOTTOM = "Bottom", cpuLabelTop = "Process load", cpuLabelBottom = "System load", memoryLabelTop = "Active memory", memoryLabelBottom = "Virtual memory", diskLabelTop = "Disk read", diskLabelBottom = "Disk write", trafficLabelTop = "Download", trafficLabelBottom = "Upload", styles = { + footer: { + maxWidth: "100%", + flexWrap: "nowrap", + margin: 0 + }, + chartRowWrapper: { + height: "100%", + padding: 0 + }, + doubleChartWrapper: { + height: "100%", + width: "99%" + }, + link: { + color: "inherit", + textDecoration: "none" } - }, { - key: "calculateTooltipPos", - value: function(rangeObj) { - var layout = this.props.layout; - return "horizontal" === layout ? rangeObj.x : "vertical" === layout ? rangeObj.y : "centric" === layout ? rangeObj.angle : rangeObj.radius; + }, themeStyles = function(e) { + return { + footer: { + backgroundColor: e.palette.grey[900], + color: e.palette.getContrastText(e.palette.grey[900]), + zIndex: e.zIndex.appBar, + height: 10 * e.spacing.unit + } + }; + }, Footer = function(_Component) { + function Footer() { + var e, t; + _classCallCheck(this, Footer); + for (var n = arguments.length, r = new Array(n), o = 0; o < n; o++) r[o] = arguments[o]; + return _defineProperty(_assertThisInitialized(t = _possibleConstructorReturn(this, (e = _getPrototypeOf(Footer)).call.apply(e, [ this ].concat(r)))), "halfHeightChart", function(e, t, n, r, o) { + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_component_ResponsiveContainer__WEBPACK_IMPORTED_MODULE_4__.a, { + width: "100%", + height: "50%" + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_chart_AreaChart__WEBPACK_IMPORTED_MODULE_5__.a, e, !t || react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_component_Tooltip__WEBPACK_IMPORTED_MODULE_9__.a, { + cursor: !1, + content: react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.c, { + tooltip: t + }) + }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_cartesian_Area__WEBPACK_IMPORTED_MODULE_6__.a, _extends({ + isAnimationActive: !1, + strokeWidth: _common__WEBPACK_IMPORTED_MODULE_12__.c, + type: "monotone" + }, n)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_cartesian_ReferenceLine__WEBPACK_IMPORTED_MODULE_7__.a, { + x: 0, + strokeWidth: 0 + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_component_Label__WEBPACK_IMPORTED_MODULE_8__.a, { + fill: n.fill, + value: r, + position: o + })))); + }), _defineProperty(_assertThisInitialized(t), "doubleChart", function(e, n, r, o) { + if (!Array.isArray(r.data) || !Array.isArray(o.data)) return null; + var a = r.default || 0, i = o.default || 0, s = "".concat(n).concat(TOP), l = "".concat(n).concat(BOTTOM); + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + style: styles.doubleChartWrapper + }, t.halfHeightChart({ + syncId: e, + data: r.data.map(function(e) { + var t = e.value; + return _defineProperty({}, s, t || a); + }), + margin: { + top: 5, + right: 5, + bottom: 0, + left: 5 + } + }, r.tooltip, { + dataKey: s, + stroke: "#8884d8", + fill: "#8884d8" + }, r.label, "insideBottomLeft"), t.halfHeightChart({ + syncId: e, + data: o.data.map(function(e) { + var t = e.value; + return _defineProperty({}, l, -t || -i); + }), + margin: { + top: 0, + right: 5, + bottom: 5, + left: 5 + } + }, o.tooltip, { + dataKey: l, + stroke: "#82ca9d", + fill: "#82ca9d" + }, o.label, "insideTopLeft")); + }), t; + } + return _inherits(Footer, _Component), _createClass(Footer, [ { + key: "shouldComponentUpdate", + value: function(e, t, n) { + return void 0 !== e.shouldUpdate.general || void 0 !== e.shouldUpdate.system; + } + }, { + key: "render", + value: function() { + var e = this.props, t = e.general, n = e.system; + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_3___default.a, { + container: !0, + className: this.props.classes.footer, + direction: "row", + alignItems: "center", + style: styles.footer + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_3___default.a, { + item: !0, + xs: !0, + style: styles.chartRowWrapper + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(ChartRow__WEBPACK_IMPORTED_MODULE_10__.a, null, this.doubleChart(FOOTER_SYNC_ID, CPU, { + data: n.processCPU, + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.e)(cpuLabelTop), + label: cpuLabelTop + }, { + data: n.systemCPU, + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.e)(cpuLabelBottom, Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.d)(-1)), + label: cpuLabelBottom + }), this.doubleChart(FOOTER_SYNC_ID, MEMORY, { + data: n.activeMemory, + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.b)(memoryLabelTop), + label: memoryLabelTop + }, { + data: n.virtualMemory, + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.b)(memoryLabelBottom, Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.d)(-1)), + label: memoryLabelBottom + }), this.doubleChart(FOOTER_SYNC_ID, DISK, { + data: n.diskRead, + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.a)(diskLabelTop), + label: diskLabelTop + }, { + data: n.diskWrite, + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.a)(diskLabelBottom, Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.d)(-1)), + label: diskLabelBottom + }), this.doubleChart(FOOTER_SYNC_ID, TRAFFIC, { + data: n.networkIngress, + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.a)(trafficLabelTop), + label: trafficLabelTop + }, { + data: n.networkEgress, + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.a)(trafficLabelBottom, Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_11__.d)(-1)), + label: trafficLabelBottom + }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_3___default.a, { + item: !0 + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_2___default.a, { + type: "caption", + color: "inherit" + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", { + style: _common__WEBPACK_IMPORTED_MODULE_12__.g.light + }, "Geth"), " ", t.version), t.commit && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_2___default.a, { + type: "caption", + color: "inherit" + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", { + style: _common__WEBPACK_IMPORTED_MODULE_12__.g.light + }, "Commit "), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", { + href: "https://github.com/ethereum/go-ethereum/commit/".concat(t.commit), + target: "_blank", + rel: "noopener noreferrer", + style: styles.link + }, t.commit.substring(0, 8))))); + } + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); + } + } ]), Footer; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default()(themeStyles)(Footer), reactHotLoader, leaveModule; + __webpack_exports__.a = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(FOOTER_SYNC_ID, "FOOTER_SYNC_ID", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(CPU, "CPU", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(MEMORY, "MEMORY", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(DISK, "DISK", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(TRAFFIC, "TRAFFIC", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(TOP, "TOP", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(BOTTOM, "BOTTOM", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(cpuLabelTop, "cpuLabelTop", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(cpuLabelBottom, "cpuLabelBottom", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(memoryLabelTop, "memoryLabelTop", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(memoryLabelBottom, "memoryLabelBottom", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(diskLabelTop, "diskLabelTop", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(diskLabelBottom, "diskLabelBottom", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(trafficLabelTop, "trafficLabelTop", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(trafficLabelBottom, "trafficLabelBottom", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(themeStyles, "themeStyles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(Footer, "Footer", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Footer.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./components/Header.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/styles/withStyles.js"), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__), _material_ui_core_AppBar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./node_modules/@material-ui/core/AppBar/index.js"), _material_ui_core_AppBar__WEBPACK_IMPORTED_MODULE_2___default = __webpack_require__.n(_material_ui_core_AppBar__WEBPACK_IMPORTED_MODULE_2__), _material_ui_core_Toolbar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./node_modules/@material-ui/core/Toolbar/index.js"), _material_ui_core_Toolbar__WEBPACK_IMPORTED_MODULE_3___default = __webpack_require__.n(_material_ui_core_Toolbar__WEBPACK_IMPORTED_MODULE_3__), _material_ui_core_IconButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./node_modules/@material-ui/core/IconButton/index.js"), _material_ui_core_IconButton__WEBPACK_IMPORTED_MODULE_4___default = __webpack_require__.n(_material_ui_core_IconButton__WEBPACK_IMPORTED_MODULE_4__), _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./node_modules/@fortawesome/react-fontawesome/index.es.js"), _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./node_modules/@fortawesome/free-solid-svg-icons/index.es.js"), _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./node_modules/@material-ui/core/Typography/index.js"), _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_7___default = __webpack_require__.n(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_7__), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); + } + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var styles = { + header: { + height: "8%" + }, + toolbar: { + height: "100%" } - }, { - key: "inRange", - value: function(x, y) { - var layout = this.props.layout; - if ("horizontal" === layout || "vertical" === layout) { - var offset = this.state.offset; - return x >= offset.left && x <= offset.left + offset.width && y >= offset.top && y <= offset.top + offset.height ? { - x: x, - y: y - } : null; + }, themeStyles = function(e) { + return { + header: { + backgroundColor: e.palette.grey[900], + color: e.palette.getContrastText(e.palette.grey[900]), + zIndex: e.zIndex.appBar + }, + toolbar: { + paddingLeft: e.spacing.unit, + paddingRight: e.spacing.unit + }, + title: { + paddingLeft: e.spacing.unit, + fontSize: 3 * e.spacing.unit } - var _state7 = this.state, angleAxisMap = _state7.angleAxisMap, radiusAxisMap = _state7.radiusAxisMap; - if (angleAxisMap && radiusAxisMap) { - var angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap); - return Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.d)({ - x: x, - y: y - }, angleAxis); + }; + }, Header = function(_Component) { + function Header() { + return _classCallCheck(this, Header), _possibleConstructorReturn(this, _getPrototypeOf(Header).apply(this, arguments)); + } + return _inherits(Header, _Component), _createClass(Header, [ { + key: "render", + value: function() { + var e = this.props.classes; + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_AppBar__WEBPACK_IMPORTED_MODULE_2___default.a, { + position: "static", + className: e.header, + style: styles.header + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Toolbar__WEBPACK_IMPORTED_MODULE_3___default.a, { + className: e.toolbar, + style: styles.toolbar + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_IconButton__WEBPACK_IMPORTED_MODULE_4___default.a, { + onClick: this.props.switchSideBar + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_5__.a, { + icon: _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_6__.a + })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_7___default.a, { + type: "title", + color: "inherit", + noWrap: !0, + className: e.title + }, "Go Ethereum Dashboard"))); } - return null; + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); + } + } ]), Header; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default()(themeStyles)(Header), reactHotLoader, leaveModule; + __webpack_exports__.a = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Header.jsx"), + reactHotLoader.register(themeStyles, "themeStyles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Header.jsx"), + reactHotLoader.register(Header, "Header", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Header.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Header.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./components/Logs.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + __webpack_require__.d(__webpack_exports__, "a", function() { + return SAME; + }), __webpack_require__.d(__webpack_exports__, "c", function() { + return inserter; + }); + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_List__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/List/index.js"), _material_ui_core_List__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_List__WEBPACK_IMPORTED_MODULE_1__), _material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./node_modules/@material-ui/core/ListItem/index.js"), _material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_2___default = __webpack_require__.n(_material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_2__), escape_html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./node_modules/escape-html/index.js"), escape_html__WEBPACK_IMPORTED_MODULE_3___default = __webpack_require__.n(escape_html__WEBPACK_IMPORTED_MODULE_3__), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); + } + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + function _defineProperty(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + function _toConsumableArray(e) { + return _arrayWithoutHoles(e) || _iterableToArray(e) || _nonIterableSpread(); + } + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + function _iterableToArray(e) { + if (Symbol.iterator in Object(e) || "[object Arguments]" === Object.prototype.toString.call(e)) return Array.from(e); + } + function _arrayWithoutHoles(e) { + if (Array.isArray(e)) { + for (var t = 0, n = new Array(e.length); t < e.length; t++) n[t] = e[t]; + return n; + } + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var requestBand = .05, fieldPadding = new Map(), createChunk = function(e) { + var t = ""; + return e.forEach(function(e) { + var n = e.t, r = e.ctx, o = e.lvl, a = e.msg, i = "#ce3c23"; + switch (o) { + case "trace": + case "trce": + o = "TRACE", i = "#3465a4"; + break; + + case "debug": + case "dbug": + o = "DEBUG", i = "#3d989b"; + break; + + case "info": + o = "INFO ", i = "#4c8f0f"; + break; + + case "warn": + o = "WARN ", i = "#b79a22"; + break; + + case "error": + case "eror": + o = "ERROR", i = "#754b70"; + break; + + case "crit": + o = "CRIT ", i = "#ce3c23"; + break; + + default: + o = ""; + } + var s = new Date(n); + if ("" !== o && s instanceof Date && !isNaN(s) && "string" == typeof a && Array.isArray(r)) { + r.length > 0 && (a += " ".repeat(Math.max(40 - a.length, 0))); + var l = "0".concat(s.getMonth() + 1).slice(-2), u = "0".concat(s.getDate()).slice(-2), c = "0".concat(s.getHours()).slice(-2), d = "0".concat(s.getMinutes()).slice(-2), f = "0".concat(s.getSeconds()).slice(-2); + t += '').concat(o, "[").concat(l, "-").concat(u, "|").concat(c, ":").concat(d, ":").concat(f, "] ").concat(a); + for (var p = 0; p < r.length; p += 2) { + var h = escape_html__WEBPACK_IMPORTED_MODULE_3___default()(r[p]), _ = escape_html__WEBPACK_IMPORTED_MODULE_3___default()(r[p + 1]), m = fieldPadding.get(h); + ("number" != typeof m || m < _.length) && (m = _.length, fieldPadding.set(h, m)); + var y = ""; + p < r.length - 2 && (y = " ".repeat(m - _.length)), t += ' ').concat(h, "=").concat(_).concat(y); + } + t += "
"; + } else t += 'Invalid log record
'; + }), t; + }, ADDED = 1, SAME = 0, REMOVED = -1, inserter = function(e) { + return function(t, n) { + if (n.topChanged = SAME, n.bottomChanged = SAME, !Array.isArray(t.chunk) || t.chunk.length < 1) return n; + Array.isArray(n.chunks) || (n.chunks = []); + var r = createChunk(t.chunk); + if (!t.source) return n.endBottom ? n.chunks.length < 1 ? [ { + content: r, + name: "00000000000000.log" + } ] : (n.chunks[n.chunks.length - 1].content += r, n.bottomChanged = ADDED, n) : n; + var o = { + content: r, + name: t.source.name + }; + return n.chunks.length > 0 && t.source.name < n.chunks[0].name ? (t.source.last && (n.endTop = !0), + n.chunks.length >= e && (n.endBottom = !1, n.chunks.splice(e - 1, n.chunks.length - e + 1), + n.bottomChanged = REMOVED), n.chunks = [ o ].concat(_toConsumableArray(n.chunks)), + n.topChanged = ADDED, n) : (t.source.last && (n.endBottom = !0), n.chunks.length >= e && (n.endTop = !1, + n.chunks.splice(0, n.chunks.length - e + 1), n.topChanged = REMOVED), n.chunks = [].concat(_toConsumableArray(n.chunks), [ o ]), + n.bottomChanged = ADDED, n); + }; + }, styles = { + logListItem: { + padding: 0, + lineHeight: 1.231 + }, + logChunk: { + color: "white", + fontFamily: "monospace", + whiteSpace: "nowrap", + width: 0 + }, + waitMsg: { + textAlign: "center", + color: "white", + fontFamily: "monospace" + } + }, Logs = function(_Component) { + function Logs(e) { + var t; + return _classCallCheck(this, Logs), _defineProperty(_assertThisInitialized(t = _possibleConstructorReturn(this, _getPrototypeOf(Logs).call(this, e))), "onScroll", function() { + if (t.state.requestAllowed && void 0 !== t.content) { + var e = t.props.content.logs; + e.chunks.length < 1 || (t.atTop() && !e.endTop ? t.sendRequest(e.chunks[0].name, !0) : t.atBottom() && !e.endBottom && t.sendRequest(e.chunks[e.chunks.length - 1].name, !1)); + } + }), _defineProperty(_assertThisInitialized(t), "sendRequest", function(e, n) { + t.setState({ + requestAllowed: !1 + }), t.props.send(JSON.stringify({ + Logs: { + Name: e, + Past: n + } + })); + }), _defineProperty(_assertThisInitialized(t), "atTop", function() { + return t.props.container.scrollTop <= t.props.container.scrollHeight * requestBand; + }), _defineProperty(_assertThisInitialized(t), "atBottom", function() { + var e = t.props.container; + return e.scrollHeight - e.scrollTop <= e.clientHeight + e.scrollHeight * requestBand; + }), _defineProperty(_assertThisInitialized(t), "beforeUpdate", function() { + var e = 0, n = t.content.children[1]; + return n && n.children[0] && (e = n.children[0].clientHeight), { + scrollTop: t.props.container.scrollTop, + firstHeight: e + }; + }), _defineProperty(_assertThisInitialized(t), "didUpdate", function(e, n, r) { + if (void 0 !== t.props.shouldUpdate.logs && void 0 !== t.content && null !== r) { + var o = t.props.content.logs, a = t.props.container; + if (!(void 0 === a || o.chunks.length < 1)) if (t.content.clientHeight < a.clientHeight) o.endTop || t.sendRequest(o.chunks[0].name, !0); else { + var i = r.scrollTop; + o.topChanged === ADDED ? i += t.content.children[1].children[0].clientHeight : o.bottomChanged === ADDED && (o.topChanged === REMOVED ? i -= r.firstHeight : t.atBottom() && o.endBottom && (i = a.scrollHeight - a.clientHeight)), + a.scrollTop = i, t.setState({ + requestAllowed: !0 + }); + } + } + }), t.content = react__WEBPACK_IMPORTED_MODULE_0___default.a.createRef(), t.state = { + requestAllowed: !0 + }, t; + } + return _inherits(Logs, _Component), _createClass(Logs, [ { + key: "componentDidMount", + value: function() { + var e = this.props.container; + if (void 0 !== e) { + e.scrollTop = e.scrollHeight - e.clientHeight; + var t = this.props.content.logs; + void 0 === this.content || t.chunks.length < 1 || this.content.clientHeight < e.clientHeight && !t.endTop && this.sendRequest(t.chunks[0].name, !0); + } + } + }, { + key: "render", + value: function() { + var e = this; + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + ref: function(t) { + e.content = t; + } + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + style: styles.waitMsg + }, this.props.content.logs.endTop ? "No more logs." : "Waiting for server..."), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_List__WEBPACK_IMPORTED_MODULE_1___default.a, null, this.props.content.logs.chunks.map(function(e, t) { + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_2___default.a, { + style: styles.logListItem, + key: t + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + style: styles.logChunk, + dangerouslySetInnerHTML: { + __html: e.content + } + })); + })), this.props.content.logs.endBottom || react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + style: styles.waitMsg + }, "Waiting for server...")); + } + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); + } + } ]), Logs; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = Logs, reactHotLoader, leaveModule; + __webpack_exports__.b = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(requestBand, "requestBand", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx"), + reactHotLoader.register(fieldPadding, "fieldPadding", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx"), + reactHotLoader.register(createChunk, "createChunk", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx"), + reactHotLoader.register(ADDED, "ADDED", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx"), + reactHotLoader.register(SAME, "SAME", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx"), + reactHotLoader.register(REMOVED, "REMOVED", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx"), + reactHotLoader.register(inserter, "inserter", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx"), + reactHotLoader.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx"), + reactHotLoader.register(Logs, "Logs", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Logs.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./components/Main.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/styles/withStyles.js"), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__), Network__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./components/Network.jsx"), Logs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./components/Logs.jsx"), Footer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./components/Footer.jsx"), _common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./common.jsx"), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); + } + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + function _defineProperty(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var styles = { + wrapper: { + display: "flex", + flexDirection: "column", + width: "100%" + }, + content: { + flex: 1, + overflow: "auto" } - }, { - key: "parseEventsOfWrapper", - value: function() { - var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), tooltipEvents = tooltipItem && "axis" === eventType ? { - onMouseEnter: this.handleMouseEnter, - onMouseMove: this.handleMouseMove, - onMouseLeave: this.handleMouseLeave, - onTouchMove: this.handleTouchMove - } : {}, outerEvents = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(this.props, this.handleOuterEvent); - return _extends({}, outerEvents, tooltipEvents); + }, themeStyles = function(e) { + return { + content: { + backgroundColor: e.palette.background.default, + padding: 3 * e.spacing.unit + } + }; + }, Main = function(_Component) { + function Main(e) { + var t; + return _classCallCheck(this, Main), _defineProperty(_assertThisInitialized(t = _possibleConstructorReturn(this, _getPrototypeOf(Main).call(this, e))), "onScroll", function() { + t.content && "function" == typeof t.content.onScroll && t.content.onScroll(); + }), t.container = react__WEBPACK_IMPORTED_MODULE_0___default.a.createRef(), t.content = react__WEBPACK_IMPORTED_MODULE_0___default.a.createRef(), + t; + } + return _inherits(Main, _Component), _createClass(Main, [ { + key: "componentDidUpdate", + value: function(e, t, n) { + this.content && "function" == typeof this.content.didUpdate && this.content.didUpdate(e, t, n); + } + }, { + key: "getSnapshotBeforeUpdate", + value: function(e, t) { + return this.content && "function" == typeof this.content.beforeUpdate ? this.content.beforeUpdate() : null; + } + }, { + key: "render", + value: function() { + var e = this, t = this.props, n = t.classes, r = t.active, o = t.content, a = t.shouldUpdate, i = null; + switch (r) { + case _common__WEBPACK_IMPORTED_MODULE_5__.b.get("home").id: + case _common__WEBPACK_IMPORTED_MODULE_5__.b.get("chain").id: + case _common__WEBPACK_IMPORTED_MODULE_5__.b.get("txpool").id: + i = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "Work in progress."); + break; + + case _common__WEBPACK_IMPORTED_MODULE_5__.b.get("network").id: + i = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Network__WEBPACK_IMPORTED_MODULE_2__.a, { + content: this.props.content.network, + container: this.container + }); + break; + + case _common__WEBPACK_IMPORTED_MODULE_5__.b.get("system").id: + i = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "Work in progress."); + break; + + case _common__WEBPACK_IMPORTED_MODULE_5__.b.get("logs").id: + i = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Logs__WEBPACK_IMPORTED_MODULE_3__.b, { + ref: function(t) { + e.content = t; + }, + container: this.container, + send: this.props.send, + content: this.props.content, + shouldUpdate: a + }); + } + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + style: styles.wrapper + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + className: n.content, + style: styles.content, + ref: function(t) { + e.container = t; + }, + onScroll: this.onScroll + }, i), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Footer__WEBPACK_IMPORTED_MODULE_4__.a, { + general: o.general, + system: o.system, + shouldUpdate: a + })); + } + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); + } + } ]), Main; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default()(themeStyles)(Main), reactHotLoader, leaveModule; + __webpack_exports__.a = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Main.jsx"), + reactHotLoader.register(themeStyles, "themeStyles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Main.jsx"), + reactHotLoader.register(Main, "Main", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Main.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Main.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./components/Network.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + __webpack_require__.d(__webpack_exports__, "b", function() { + return inserter; + }); + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_Table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/Table/index.js"), _material_ui_core_Table__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_Table__WEBPACK_IMPORTED_MODULE_1__), _material_ui_core_TableHead__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./node_modules/@material-ui/core/TableHead/index.js"), _material_ui_core_TableHead__WEBPACK_IMPORTED_MODULE_2___default = __webpack_require__.n(_material_ui_core_TableHead__WEBPACK_IMPORTED_MODULE_2__), _material_ui_core_TableBody__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./node_modules/@material-ui/core/TableBody/index.js"), _material_ui_core_TableBody__WEBPACK_IMPORTED_MODULE_3___default = __webpack_require__.n(_material_ui_core_TableBody__WEBPACK_IMPORTED_MODULE_3__), _material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./node_modules/@material-ui/core/TableRow/index.js"), _material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default = __webpack_require__.n(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4__), _material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./node_modules/@material-ui/core/TableCell/index.js"), _material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default = __webpack_require__.n(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5__), _material_ui_core_Grid_Grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./node_modules/@material-ui/core/Grid/Grid.js"), _material_ui_core_Grid_Grid__WEBPACK_IMPORTED_MODULE_6___default = __webpack_require__.n(_material_ui_core_Grid_Grid__WEBPACK_IMPORTED_MODULE_6__), _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./node_modules/@material-ui/core/Typography/index.js"), _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_7___default = __webpack_require__.n(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_7__), recharts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("./node_modules/recharts/es6/index.js"), _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__("./node_modules/@fortawesome/react-fontawesome/index.es.js"), _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__("./node_modules/@fortawesome/free-solid-svg-icons/index.es.js"), _fortawesome_free_regular_svg_icons__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__("./node_modules/@fortawesome/free-regular-svg-icons/index.es.js"), color_convert__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__("./node_modules/color-convert/index.js"), color_convert__WEBPACK_IMPORTED_MODULE_12___default = __webpack_require__.n(color_convert__WEBPACK_IMPORTED_MODULE_12__), CustomTooltip__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__("./components/CustomTooltip.jsx"), _common__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__("./common.jsx"), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _slicedToArray(e, t) { + return _arrayWithHoles(e) || _iterableToArrayLimit(e, t) || _nonIterableRest(); + } + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + function _iterableToArrayLimit(e, t) { + var n = [], r = !0, o = !1, a = void 0; + try { + for (var i, s = e[Symbol.iterator](); !(r = (i = s.next()).done) && (n.push(i.value), + !t || n.length !== t); r = !0) ; + } catch (e) { + o = !0, a = e; + } finally { + try { + r || null == s.return || s.return(); + } finally { + if (o) throw a; + } } - }, { - key: "updateStateOfAxisMapsOffsetAndStackGroups", - value: function(_ref5) { - var _this4 = this, props = _ref5.props, dataStartIndex = _ref5.dataStartIndex, dataEndIndex = _ref5.dataEndIndex, updateId = _ref5.updateId; - if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)({ - props: props - })) return null; - var children = props.children, layout = props.layout, stackOffset = props.stackOffset, data = props.data, reverseStackOrder = props.reverseStackOrder, _getAxisNameByLayout2 = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout2.numericAxisName, cateAxisName = _getAxisNameByLayout2.cateAxisName, graphicalItems = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, GraphicalChild), stackGroups = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.s)(data, graphicalItems, numericAxisName + "Id", cateAxisName + "Id", stackOffset, reverseStackOrder), axisObj = axisComponents.reduce(function(result, entry) { - var name = entry.axisType + "Map"; - return _extends({}, result, _defineProperty({}, name, _this4.getAxisMap(props, _extends({}, entry, { - graphicalItems: graphicalItems, - stackGroups: entry.axisType === numericAxisName && stackGroups, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - })))); - }, {}), offset = this.calculateOffset(_extends({}, axisObj, { - props: props, - graphicalItems: graphicalItems - })); - Object.keys(axisObj).forEach(function(key) { - axisObj[key] = formatAxisMap(props, axisObj[key], offset, key.replace("Map", ""), chartName); + return n; + } + function _arrayWithHoles(e) { + if (Array.isArray(e)) return e; + } + function _objectSpread(e) { + for (var t = 1; t < arguments.length; t++) { + var n = null != arguments[t] ? arguments[t] : {}, r = Object.keys(n); + "function" == typeof Object.getOwnPropertySymbols && (r = r.concat(Object.getOwnPropertySymbols(n).filter(function(e) { + return Object.getOwnPropertyDescriptor(n, e).enumerable; + }))), r.forEach(function(t) { + _defineProperty(e, t, n[t]); }); - var cateAxisMap = axisObj[cateAxisName + "Map"], ticksObj = this.tooltipTicksGenerator(cateAxisMap), formatedGraphicalItems = this.getFormatItems(props, _extends({}, axisObj, { - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex, - updateId: updateId, - graphicalItems: graphicalItems, - stackGroups: stackGroups, - offset: offset - })); - return _extends({ - formatedGraphicalItems: formatedGraphicalItems, - graphicalItems: graphicalItems, - offset: offset, - stackGroups: stackGroups - }, ticksObj, axisObj); } - }, { - key: "addListener", - value: function() { - __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.on(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent), - __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners + 1); + return e; + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); } - }, { - key: "removeListener", - value: function() { - __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.removeListener(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent), - __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners - 1); + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + function _defineProperty(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + function _toConsumableArray(e) { + return _arrayWithoutHoles(e) || _iterableToArray(e) || _nonIterableSpread(); + } + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + function _iterableToArray(e) { + if (Symbol.iterator in Object(e) || "[object Arguments]" === Object.prototype.toString.call(e)) return Array.from(e); + } + function _arrayWithoutHoles(e) { + if (Array.isArray(e)) { + for (var t = 0, n = new Array(e.length); t < e.length; t++) n[t] = e[t]; + return n; } - }, { - key: "calculateOffset", - value: function(_ref6) { - var props = _ref6.props, graphicalItems = _ref6.graphicalItems, _ref6$xAxisMap = _ref6.xAxisMap, xAxisMap = void 0 === _ref6$xAxisMap ? {} : _ref6$xAxisMap, _ref6$yAxisMap = _ref6.yAxisMap, yAxisMap = void 0 === _ref6$yAxisMap ? {} : _ref6$yAxisMap, width = props.width, height = props.height, children = props.children, margin = props.margin || {}, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a), legendItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_11__component_Legend__.a), offsetH = Object.keys(yAxisMap).reduce(function(result, id) { - var entry = yAxisMap[id], orientation = entry.orientation; - return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.width)); - }, { - left: margin.left || 0, - right: margin.right || 0 - }), offsetV = Object.keys(xAxisMap).reduce(function(result, id) { - var entry = xAxisMap[id], orientation = entry.orientation; - return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.height)); - }, { - top: margin.top || 0, - bottom: margin.bottom || 0 - }), offset = _extends({}, offsetV, offsetH), brushBottom = offset.bottom; - if (brushItem && (offset.bottom += brushItem.props.height || __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a.defaultProps.height), - legendItem && this.legendInstance) { - var legendBox = this.legendInstance.getBBox(); - offset = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.a)(offset, graphicalItems, props, legendBox); - } - return _extends({ - brushBottom: brushBottom - }, offset, { - width: width - offset.left - offset.right, - height: height - offset.top - offset.bottom + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var trafficChartHeight = 18, trafficChartWidth = 400, setMaxIngress = function(e, t) { + e.maxIngress = t, e.ingressGradient = [], e.ingressGradient.push({ + offset: _common__WEBPACK_IMPORTED_MODULE_14__.d[0], + color: _common__WEBPACK_IMPORTED_MODULE_14__.e[0] + }); + for (var n = 1; n < _common__WEBPACK_IMPORTED_MODULE_14__.e.length && t > _common__WEBPACK_IMPORTED_MODULE_14__.d[n]; n++) e.ingressGradient.push({ + offset: Math.floor(100 * _common__WEBPACK_IMPORTED_MODULE_14__.d[n] / t), + color: _common__WEBPACK_IMPORTED_MODULE_14__.e[n] + }); + if (--n < _common__WEBPACK_IMPORTED_MODULE_14__.e.length - 1) { + var r = color_convert__WEBPACK_IMPORTED_MODULE_12___default.a.hex.lab(_common__WEBPACK_IMPORTED_MODULE_14__.e[n]), o = 100 * (t - _common__WEBPACK_IMPORTED_MODULE_14__.d[n]) / (_common__WEBPACK_IMPORTED_MODULE_14__.d[n + 1] - _common__WEBPACK_IMPORTED_MODULE_14__.d[n]); + color_convert__WEBPACK_IMPORTED_MODULE_12___default.a.hex.lab(_common__WEBPACK_IMPORTED_MODULE_14__.e[n + 1]).forEach(function(e, t) { + r[t] = (r[t] * o + e * (100 - o)) / 100; + }), e.ingressGradient.push({ + offset: 100, + color: "#".concat(color_convert__WEBPACK_IMPORTED_MODULE_12___default.a.lab.hex(r)) }); } - }, { - key: "triggerSyncEvent", - value: function(data) { - var syncId = this.props.syncId; - __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(syncId) || __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.emit(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, syncId, this.uniqueChartId, data); + }, setMaxEgress = function(e, t) { + e.maxEgress = t, e.egressGradient = [], e.egressGradient.push({ + offset: 100 - _common__WEBPACK_IMPORTED_MODULE_14__.d[0], + color: _common__WEBPACK_IMPORTED_MODULE_14__.e[0] + }); + for (var n = 1; n < _common__WEBPACK_IMPORTED_MODULE_14__.e.length && t > _common__WEBPACK_IMPORTED_MODULE_14__.d[n]; n++) e.egressGradient.unshift({ + offset: 100 - Math.floor(100 * _common__WEBPACK_IMPORTED_MODULE_14__.d[n] / t), + color: _common__WEBPACK_IMPORTED_MODULE_14__.e[n] + }); + if (--n < _common__WEBPACK_IMPORTED_MODULE_14__.e.length - 1) { + var r = color_convert__WEBPACK_IMPORTED_MODULE_12___default.a.hex.lab(_common__WEBPACK_IMPORTED_MODULE_14__.e[n]), o = 100 * (t - _common__WEBPACK_IMPORTED_MODULE_14__.d[n]) / (_common__WEBPACK_IMPORTED_MODULE_14__.d[n + 1] - _common__WEBPACK_IMPORTED_MODULE_14__.d[n]); + color_convert__WEBPACK_IMPORTED_MODULE_12___default.a.hex.lab(_common__WEBPACK_IMPORTED_MODULE_14__.e[n + 1]).forEach(function(e, t) { + r[t] = (r[t] * o + e * (100 - o)) / 100; + }), e.egressGradient.unshift({ + offset: 0, + color: "#".concat(color_convert__WEBPACK_IMPORTED_MODULE_12___default.a.lab.hex(r)) + }); } - }, { - key: "filterFormatItem", - value: function(item, displayName, childIndex) { - for (var formatedGraphicalItems = this.state.formatedGraphicalItems, i = 0, len = formatedGraphicalItems.length; i < len; i++) { - var entry = formatedGraphicalItems[i]; - if (entry.item === item || entry.props.key === item.key || displayName === Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(entry.item.type) && childIndex === entry.childIndex) return entry; - } - return null; - } - }, { - key: "renderAxis", - value: function(axisOptions, element, displayName, index) { - var _props2 = this.props, width = _props2.width, height = _props2.height; - return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a, _extends({}, axisOptions, { - className: "recharts-" + axisOptions.axisType + " " + axisOptions.axisType, - key: element.key || displayName + "-" + index, - viewBox: { - x: 0, - y: 0, - width: width, - height: height - }, - ticksGenerator: this.axesTicksGenerator - })); - } - }, { - key: "renderLegend", - value: function() { - var _this5 = this, formatedGraphicalItems = this.state.formatedGraphicalItems, _props3 = this.props, children = _props3.children, width = _props3.width, height = _props3.height, margin = this.props.margin || {}, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), props = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.q)({ - children: children, - formatedGraphicalItems: formatedGraphicalItems, - legendWidth: legendWidth, - legendHeight: legendHeight, - legendContent: legendContent - }); - if (!props) return null; - var item = props.item, otherProps = _objectWithoutProperties(props, [ "item" ]); - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(item, _extends({}, otherProps, { - chartWidth: width, - chartHeight: height, - margin: margin, - ref: function(legend) { - _this5.legendInstance = legend; - }, - onBBoxUpdate: this.handleLegendBBoxUpdate - })); + }, setIngressChartAttributes = function(e) { + var t = 0; + e.ingress.forEach(function(e) { + var n = e.value; + n > t && (t = n); + }), setMaxIngress(e, t); + }, setEgressChartAttributes = function(e) { + var t = 0; + e.egress.forEach(function(e) { + var n = e.value; + n > t && (t = n); + }), setMaxEgress(e, t); + }, inserter = function(e) { + return function(t, n) { + return t.peers && t.peers.bundles && (n.peers = t.peers, Object.values(n.peers.bundles).forEach(function(e) { + e.knownPeers && Object.values(e.knownPeers).forEach(function(e) { + e.maxIngress || setIngressChartAttributes(e), e.maxEgress || setEgressChartAttributes(e); + }); + })), Array.isArray(t.diff) && t.diff.forEach(function(t) { + if (t.ip) { + switch (t.remove) { + case "bundle": + return void delete n.peers.bundles[t.ip]; + + case "known": + if (!t.id) return void console.error("Remove known peer event without ID", t.ip); + var r = n.peers.bundles[t.ip]; + return r && r.knownPeers && r.knownPeers[t.id] ? void delete r.knownPeers[t.id] : void console.error("No known peer to remove", t.ip, t.id); + + case "attempt": + var o = n.peers.bundles[t.ip]; + return !o || !Array.isArray(o.attempts) || o.attempts.length < 1 ? void console.error("No unknown peer to remove", t.ip) : void o.attempts.splice(0, 1); + } + n.peers.bundles[t.ip] || (n.peers.bundles[t.ip] = { + location: { + country: "", + city: "", + latitude: 0, + longitude: 0 + }, + knownPeers: {}, + attempts: [] + }); + var a = n.peers.bundles[t.ip]; + if (t.location) a.location = t.location; else { + if (!t.id) return a.attempts || (a.attempts = []), void a.attempts.push({ + connected: t.connected, + disconnected: t.disconnected + }); + a.knownPeers || (a.knownPeers = {}), a.knownPeers[t.id] || (a.knownPeers[t.id] = { + connected: [], + disconnected: [], + ingress: [], + egress: [], + active: !1 + }); + var i = a.knownPeers[t.id]; + switch (i.maxIngress || setIngressChartAttributes(i), i.maxEgress || setEgressChartAttributes(i), + t.connected && (i.connected || (console.warn("peer.connected should exist"), i.connected = []), + i.connected.push(t.connected)), t.disconnected && (i.disconnected || (console.warn("peer.disconnected should exist"), + i.disconnected = []), i.disconnected.push(t.disconnected)), t.activity) { + case "active": + i.active = !0; + break; + + case "inactive": + i.active = !1; + } + if (Array.isArray(t.ingress) && Array.isArray(t.egress)) { + var s, l; + if (t.ingress.length !== t.egress.length) return void console.error("Different traffic sample length", t); + var u = i.maxIngress; + t.ingress.forEach(function(e) { + var t = e.value; + t > u && (u = t); + }), u > i.maxIngress && setMaxIngress(i, u), (s = i.ingress).splice.apply(s, [ i.ingress.length, 0 ].concat(_toConsumableArray(t.ingress))); + var c = i.ingress.length - e; + if (c > 0) { + for (var d = 0; d < c && i.ingress[d].value < i.maxIngress; ) d++; + i.ingress.splice(0, c), d < c && setIngressChartAttributes(i); + } + var f = i.maxEgress; + t.egress.forEach(function(e) { + var t = e.value; + t > f && (f = t); + }), f > i.maxEgress && setMaxEgress(i, f), (l = i.egress).splice.apply(l, [ i.egress.length, 0 ].concat(_toConsumableArray(t.egress))); + var p = i.egress.length - e; + if (p > 0) { + for (var h = 0; h < p && i.egress[h].value < i.maxEgress; ) h++; + i.egress.splice(0, p), h < p && setEgressChartAttributes(i); + } + } + } + } else console.error("Peer event without IP", t); + }), n; + }; + }, styles = { + tableHead: { + height: "auto" + }, + tableRow: { + height: "auto" + }, + tableCell: { + paddingTop: 0, + paddingRight: 5, + paddingBottom: 0, + paddingLeft: 5, + border: "none" + } + }, Network = function(_Component) { + function Network() { + var e, t; + _classCallCheck(this, Network); + for (var n = arguments.length, r = new Array(n), o = 0; o < n; o++) r[o] = arguments[o]; + return _defineProperty(_assertThisInitialized(t = _possibleConstructorReturn(this, (e = _getPrototypeOf(Network)).call.apply(e, [ this ].concat(r)))), "formatTime", function(e) { + var t = new Date(e); + if (isNaN(t)) return ""; + var n = "0".concat(t.getMonth() + 1).slice(-2), r = "0".concat(t.getDate()).slice(-2), o = "0".concat(t.getHours()).slice(-2), a = "0".concat(t.getMinutes()).slice(-2), i = "0".concat(t.getSeconds()).slice(-2); + return "".concat(n, "/").concat(r, "/").concat(o, ":").concat(a, ":").concat(i); + }), _defineProperty(_assertThisInitialized(t), "copyToClipboard", function(e) { + return function(t) { + t.preventDefault(), navigator.clipboard.writeText(e).then(function() {}, function() { + console.error("Failed to copy node id", e); + }); + }; + }), _defineProperty(_assertThisInitialized(t), "peerTableRow", function(e, n, r, o) { + var a, i = o.ingress.map(function(e) { + return { + ingress: e.value || .001 + }; + }), s = o.egress.map(function(e) { + return { + egress: -e.value || -.001 + }; + }); + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, { + key: "known_".concat(e, "_").concat(n), + style: styles.tableRow + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, o.active ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_9__.a, { + icon: _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_10__.b, + color: "green" + }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_9__.a, { + icon: _fortawesome_free_regular_svg_icons__WEBPACK_IMPORTED_MODULE_11__.a, + style: _common__WEBPACK_IMPORTED_MODULE_14__.g.light + })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: _objectSpread({ + fontFamily: "monospace", + cursor: "copy" + }, styles.tableCell, _common__WEBPACK_IMPORTED_MODULE_14__.g.light), + onClick: t.copyToClipboard(n) + }, n.substring(0, 10)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, r.location ? (a = r.location, "".concat(a.country ? a.country : "").concat(a.city ? "/".concat(a.city) : "")) : ""), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts__WEBPACK_IMPORTED_MODULE_8__.b, { + width: trafficChartWidth, + height: trafficChartHeight, + data: i, + margin: { + top: 5, + right: 5, + bottom: 0, + left: 5 + }, + syncId: "peerIngress_".concat(e, "_").concat(n) + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("defs", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("linearGradient", { + id: "ingressGradient_".concat(e, "_").concat(n), + x1: "0", + y1: "1", + x2: "0", + y2: "0" + }, o.ingressGradient && o.ingressGradient.map(function(t, r) { + var o = t.offset, a = t.color; + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("stop", { + key: "ingressStop_".concat(e, "_").concat(n, "_").concat(r), + offset: "".concat(o, "%"), + stopColor: a + }); + }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts__WEBPACK_IMPORTED_MODULE_8__.c, { + cursor: !1, + content: react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(CustomTooltip__WEBPACK_IMPORTED_MODULE_13__.c, { + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_13__.b)("Download") + }) + }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts__WEBPACK_IMPORTED_MODULE_8__.d, { + hide: !0, + scale: "sqrt", + domain: [ .001, function(e) { + return Math.max(e, 0); + } ] + }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts__WEBPACK_IMPORTED_MODULE_8__.a, { + dataKey: "ingress", + isAnimationActive: !1, + type: "monotone", + fill: "url(#ingressGradient_".concat(e, "_").concat(n, ")"), + stroke: o.ingressGradient[o.ingressGradient.length - 1].color, + strokeWidth: _common__WEBPACK_IMPORTED_MODULE_14__.c + })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts__WEBPACK_IMPORTED_MODULE_8__.b, { + width: trafficChartWidth, + height: trafficChartHeight, + data: s, + margin: { + top: 0, + right: 5, + bottom: 5, + left: 5 + }, + syncId: "peerIngress_".concat(e, "_").concat(n) + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("defs", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("linearGradient", { + id: "egressGradient_".concat(e, "_").concat(n), + x1: "0", + y1: "1", + x2: "0", + y2: "0" + }, o.egressGradient && o.egressGradient.map(function(t, r) { + var o = t.offset, a = t.color; + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("stop", { + key: "egressStop_".concat(e, "_").concat(n, "_").concat(r), + offset: "".concat(o, "%"), + stopColor: a + }); + }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts__WEBPACK_IMPORTED_MODULE_8__.c, { + cursor: !1, + content: react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(CustomTooltip__WEBPACK_IMPORTED_MODULE_13__.c, { + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_13__.b)("Upload", Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_13__.d)(-1)) + }) + }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts__WEBPACK_IMPORTED_MODULE_8__.d, { + hide: !0, + scale: "sqrt", + domain: [ function(e) { + return Math.min(e, 0); + }, -.001 ] + }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts__WEBPACK_IMPORTED_MODULE_8__.a, { + dataKey: "egress", + isAnimationActive: !1, + type: "monotone", + fill: "url(#egressGradient_".concat(e, "_").concat(n, ")"), + stroke: o.egressGradient[0].color, + strokeWidth: _common__WEBPACK_IMPORTED_MODULE_14__.c + })))); + }), t; } - }, { - key: "renderTooltip", - value: function() { - var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a); - if (!tooltipItem) return null; - var _state8 = this.state, isTooltipActive = _state8.isTooltipActive, activeCoordinate = _state8.activeCoordinate, activePayload = _state8.activePayload, activeLabel = _state8.activeLabel, offset = _state8.offset; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(tooltipItem, { - viewBox: _extends({}, offset, { - x: offset.left, - y: offset.top - }), - active: isTooltipActive, - label: activeLabel, - payload: isTooltipActive ? activePayload : [], - coordinate: activeCoordinate + return _inherits(Network, _Component), _createClass(Network, [ { + key: "componentDidMount", + value: function() { + var e = this.props.container; + void 0 !== e && (e.scrollTop = 0); + } + }, { + key: "render", + value: function() { + var e = this; + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid_Grid__WEBPACK_IMPORTED_MODULE_6___default.a, { + container: !0, + direction: "row", + justify: "space-between" + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid_Grid__WEBPACK_IMPORTED_MODULE_6___default.a, { + item: !0 + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Table__WEBPACK_IMPORTED_MODULE_1___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableHead__WEBPACK_IMPORTED_MODULE_2___default.a, { + style: styles.tableHead + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, { + style: styles.tableRow + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, "Node ID"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, "Location"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, "Traffic"))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableBody__WEBPACK_IMPORTED_MODULE_3___default.a, null, Object.entries(this.props.content.peers.bundles).map(function(t) { + var n = _slicedToArray(t, 2), r = n[0], o = n[1]; + return !o.knownPeers || Object.keys(o.knownPeers).length < 1 ? null : Object.entries(o.knownPeers).map(function(t) { + var n = _slicedToArray(t, 2), a = n[0], i = n[1]; + return !1 === i.active ? null : e.peerTableRow(r, a, o, i); + }); + })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableBody__WEBPACK_IMPORTED_MODULE_3___default.a, null, Object.entries(this.props.content.peers.bundles).map(function(t) { + var n = _slicedToArray(t, 2), r = n[0], o = n[1]; + return !o.knownPeers || Object.keys(o.knownPeers).length < 1 ? null : Object.entries(o.knownPeers).map(function(t) { + var n = _slicedToArray(t, 2), a = n[0], i = n[1]; + return !0 === i.active ? null : e.peerTableRow(r, a, o, i); + }); + })))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid_Grid__WEBPACK_IMPORTED_MODULE_6___default.a, { + item: !0 + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_7___default.a, { + variant: "subtitle1", + gutterBottom: !0 + }, "Connection attempts"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Table__WEBPACK_IMPORTED_MODULE_1___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableHead__WEBPACK_IMPORTED_MODULE_2___default.a, { + style: styles.tableHead + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, { + style: styles.tableRow + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, "IP"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, "Location"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, "Nr"))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableBody__WEBPACK_IMPORTED_MODULE_3___default.a, null, Object.entries(this.props.content.peers.bundles).map(function(e) { + var t, n = _slicedToArray(e, 2), r = n[0], o = n[1]; + return !o.attempts || o.attempts.length < 1 ? null : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, { + key: "attempt_".concat(r), + style: styles.tableRow + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, r), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, o.location ? (t = o.location, "".concat(t.country ? t.country : "").concat(t.city ? "/".concat(t.city) : "")) : ""), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, { + style: styles.tableCell + }, Object.values(o.attempts).length)); + }))))); + } + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); + } + } ]), Network; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = Network, reactHotLoader, leaveModule; + __webpack_exports__.a = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(trafficChartHeight, "trafficChartHeight", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + reactHotLoader.register(trafficChartWidth, "trafficChartWidth", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + reactHotLoader.register(setMaxIngress, "setMaxIngress", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + reactHotLoader.register(setMaxEgress, "setMaxEgress", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + reactHotLoader.register(setIngressChartAttributes, "setIngressChartAttributes", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + reactHotLoader.register(setEgressChartAttributes, "setEgressChartAttributes", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + reactHotLoader.register(inserter, "inserter", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + reactHotLoader.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + reactHotLoader.register(Network, "Network", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./components/SideBar.jsx": function(module, __webpack_exports__, __webpack_require__) { + "use strict"; + (function(module) { + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/styles/withStyles.js"), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__), _material_ui_core_List__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./node_modules/@material-ui/core/List/index.js"), _material_ui_core_List__WEBPACK_IMPORTED_MODULE_2___default = __webpack_require__.n(_material_ui_core_List__WEBPACK_IMPORTED_MODULE_2__), _material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./node_modules/@material-ui/core/ListItem/index.js"), _material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3___default = __webpack_require__.n(_material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3__), _material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./node_modules/@material-ui/core/ListItemIcon/index.js"), _material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4___default = __webpack_require__.n(_material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4__), _material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./node_modules/@material-ui/core/ListItemText/index.js"), _material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5___default = __webpack_require__.n(_material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5__), _material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./node_modules/@material-ui/core/Icon/index.js"), _material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6___default = __webpack_require__.n(_material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6__), react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./node_modules/react-transition-group/Transition.js"), react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7___default = __webpack_require__.n(react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7__), _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("./node_modules/@fortawesome/react-fontawesome/index.es.js"), _common__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__("./common.jsx"), enterModule; + function _typeof(e) { + return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function _objectSpread(e) { + for (var t = 1; t < arguments.length; t++) { + var n = null != arguments[t] ? arguments[t] : {}, r = Object.keys(n); + "function" == typeof Object.getOwnPropertySymbols && (r = r.concat(Object.getOwnPropertySymbols(n).filter(function(e) { + return Object.getOwnPropertyDescriptor(n, e).enumerable; + }))), r.forEach(function(t) { + _defineProperty(e, t, n[t]); }); } - }, { - key: "renderActiveDot", - value: function(option, props) { - var dot = void 0; - return dot = Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(option) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(option, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_15__shape_Dot__.a, props), - __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, { - className: "recharts-active-dot", - key: props.key - }, dot); - } - }, { - key: "renderActivePoints", - value: function(_ref7) { - var item = _ref7.item, activePoint = _ref7.activePoint, basePoint = _ref7.basePoint, childIndex = _ref7.childIndex, isRange = _ref7.isRange, result = [], key = item.props.key, _item$item$props = item.item.props, activeDot = _item$item$props.activeDot, dataKey = _item$item$props.dataKey, dotProps = _extends({ - index: childIndex, - dataKey: dataKey, - cx: activePoint.x, - cy: activePoint.y, - r: 4, - fill: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(item.item), - strokeWidth: 2, - stroke: "#fff", - payload: activePoint.payload, - value: activePoint.value, - key: key + "-activePoint-" + childIndex - }, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(activeDot), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(activeDot)); - return result.push(this.renderActiveDot(activeDot, dotProps, childIndex)), basePoint ? result.push(this.renderActiveDot(activeDot, _extends({}, dotProps, { - cx: basePoint.x, - cy: basePoint.y, - key: key + "-basePoint-" + childIndex - }), childIndex)) : isRange && result.push(null), result; + return e; + } + function _classCallCheck(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); } - }, { - key: "render", - value: function() { - var _this6 = this; - if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)(this)) return null; - var _props4 = this.props, children = _props4.children, className = _props4.className, width = _props4.width, height = _props4.height, style = _props4.style, compact = _props4.compact, others = _objectWithoutProperties(_props4, [ "children", "className", "width", "height", "style", "compact" ]), attrs = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(others), map = { - CartesianGrid: { - handler: this.renderGrid, - once: !0 - }, - ReferenceArea: { - handler: this.renderReferenceElement - }, - ReferenceLine: { - handler: this.renderReferenceElement - }, - ReferenceDot: { - handler: this.renderReferenceElement - }, - XAxis: { - handler: this.renderXAxis - }, - YAxis: { - handler: this.renderYAxis - }, - Brush: { - handler: this.renderBrush, - once: !0 - }, - Bar: { - handler: this.renderGraphicChild - }, - Line: { - handler: this.renderGraphicChild - }, - Area: { - handler: this.renderGraphicChild - }, - Radar: { - handler: this.renderGraphicChild - }, - RadialBar: { - handler: this.renderGraphicChild - }, - Scatter: { - handler: this.renderGraphicChild - }, - Pie: { - handler: this.renderGraphicChild - }, - Tooltip: { - handler: this.renderCursor, - once: !0 - }, - PolarGrid: { - handler: this.renderPolarGrid, - once: !0 - }, - PolarAngleAxis: { - handler: this.renderPolarAxis - }, - PolarRadiusAxis: { - handler: this.renderPolarAxis - } - }; - if (compact) return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, { - width: width, - height: height - }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map)); - var events = this.parseEventsOfWrapper(); - return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("div", _extends({ - className: __WEBPACK_IMPORTED_MODULE_7_classnames___default()("recharts-wrapper", className), - style: _extends({}, style, { - position: "relative", - cursor: "default", - width: width, - height: height - }) - }, events, { - ref: function(node) { - _this6.container = node; + } + function _createClass(e, t, n) { + return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; + } + function _possibleConstructorReturn(e, t) { + return !t || "object" !== _typeof(t) && "function" != typeof t ? _assertThisInitialized(e) : t; + } + function _getPrototypeOf(e) { + return (_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _inherits(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && _setPrototypeOf(e, t); + } + function _setPrototypeOf(e, t) { + return (_setPrototypeOf = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + })(e, t); + } + function _defineProperty(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + enterModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).enterModule, + enterModule && enterModule(module); + var styles = { + menu: { + default: { + transition: "margin-left ".concat(_common__WEBPACK_IMPORTED_MODULE_9__.a, "ms") + }, + transition: { + entered: { + marginLeft: -200 } - }), __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, { - width: width, - height: height - }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map)), this.renderLegend(), this.renderTooltip()); - } - } ]), CategoricalChartWrapper; - }(__WEBPACK_IMPORTED_MODULE_5_react__.Component), _class.displayName = chartName, - _class.propTypes = _extends({ - syncId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]), - compact: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool, - width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object), - layout: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "horizontal", "vertical" ]), - stackOffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "sign", "expand", "none", "wiggle", "silhouette" ]), - throttleDelay: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - margin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.shape({ - top: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - right: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - bottom: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - left: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number - }), - barCategoryGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - barGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - barSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - maxBarSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, - className: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - children: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node ]), - onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - reverseStackOrder: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool, - id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string - }, propTypes), _class.defaultProps = _extends({ - layout: "horizontal", - stackOffset: "none", - barCategoryGap: "10%", - barGap: 4, - margin: { - top: 5, - right: 5, - bottom: 5, - left: 5 - }, - reverseStackOrder: !1 - }, defaultProps), _class.createDefaultState = function(props) { - var children = props.children, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a); - return { - chartX: 0, - chartY: 0, - dataStartIndex: brushItem && brushItem.props && brushItem.props.startIndex || 0, - dataEndIndex: brushItem && brushItem.props && brushItem.props.endIndex || props.data && props.data.length - 1 || 0, - activeTooltipIndex: -1, - isTooltipActive: !1 - }; - }, _class.hasBar = function(graphicalItems) { - return !(!graphicalItems || !graphicalItems.length) && graphicalItems.some(function(item) { - var name = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(item && item.type); - return name && name.indexOf("Bar") >= 0; - }); - }, _class.getDisplayedData = function(props, _ref8, item) { - var graphicalItems = _ref8.graphicalItems, dataStartIndex = _ref8.dataStartIndex, dataEndIndex = _ref8.dataEndIndex, itemsData = (graphicalItems || []).reduce(function(result, child) { - var itemData = child.props.data; - return itemData && itemData.length ? [].concat(_toConsumableArray(result), _toConsumableArray(itemData)) : result; - }, []); - if (itemsData && itemsData.length > 0) return itemsData; - if (item && item.props && item.props.data && item.props.data.length > 0) return item.props.data; - var data = props.data; - return data && data.length && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(dataStartIndex) && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(dataEndIndex) ? data.slice(dataStartIndex, dataEndIndex + 1) : []; - }, _initialiseProps = function() { - var _this7 = this; - this.handleLegendBBoxUpdate = function(box) { - if (box && _this7.legendInstance) { - var _state9 = _this7.state, dataStartIndex = _state9.dataStartIndex, dataEndIndex = _state9.dataEndIndex, updateId = _state9.updateId; - _this7.setState(_this7.updateStateOfAxisMapsOffsetAndStackGroups({ - props: _this7.props, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex, - updateId: updateId - })); - } - }, this.handleReceiveSyncEvent = function(cId, chartId, data) { - var _props5 = _this7.props, syncId = _props5.syncId, layout = _props5.layout, updateId = _this7.state.updateId; - if (syncId === cId && chartId !== _this7.uniqueChartId) { - var dataStartIndex = data.dataStartIndex, dataEndIndex = data.dataEndIndex; - if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataStartIndex) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataEndIndex)) if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.activeTooltipIndex)) _this7.setState(data); else { - var chartX = data.chartX, chartY = data.chartY, activeTooltipIndex = data.activeTooltipIndex, _state10 = _this7.state, offset = _state10.offset, tooltipTicks = _state10.tooltipTicks; - if (!offset) return; - var viewBox = _extends({}, offset, { - x: offset.left, - y: offset.top - }), validateChartX = Math.min(chartX, viewBox.x + viewBox.width), validateChartY = Math.min(chartY, viewBox.y + viewBox.height), activeLabel = tooltipTicks[activeTooltipIndex] && tooltipTicks[activeTooltipIndex].value, activePayload = _this7.getTooltipContent(activeTooltipIndex), activeCoordinate = tooltipTicks[activeTooltipIndex] ? { - x: "horizontal" === layout ? tooltipTicks[activeTooltipIndex].coordinate : validateChartX, - y: "horizontal" === layout ? validateChartY : tooltipTicks[activeTooltipIndex].coordinate - } : originCoordinate; - _this7.setState(_extends({}, data, { - activeLabel: activeLabel, - activeCoordinate: activeCoordinate, - activePayload: activePayload - })); - } else _this7.setState(_extends({ - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({ - props: _this7.props, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex, - updateId: updateId - }))); - } - }, this.handleBrushChange = function(_ref9) { - var startIndex = _ref9.startIndex, endIndex = _ref9.endIndex; - if (startIndex !== _this7.state.dataStartIndex || endIndex !== _this7.state.dataEndIndex) { - var updateId = _this7.state.updateId; - _this7.setState(function() { - return _extends({ - dataStartIndex: startIndex, - dataEndIndex: endIndex - }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({ - props: _this7.props, - dataStartIndex: startIndex, - dataEndIndex: endIndex, - updateId: updateId - })); - }), _this7.triggerSyncEvent({ - dataStartIndex: startIndex, - dataEndIndex: endIndex - }); - } - }, this.handleMouseEnter = function(e) { - var onMouseEnter = _this7.props.onMouseEnter, mouse = _this7.getMouseInfo(e); - if (mouse) { - var nextState = _extends({}, mouse, { - isTooltipActive: !0 - }); - _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseEnter) && onMouseEnter(nextState, e); + } } - }, this.triggeredAfterMouseMove = function(e) { - var onMouseMove = _this7.props.onMouseMove, mouse = _this7.getMouseInfo(e), nextState = mouse ? _extends({}, mouse, { - isTooltipActive: !0 - }) : { - isTooltipActive: !1 - }; - _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseMove) && onMouseMove(nextState, e); - }, this.handleItemMouseEnter = function(el) { - _this7.setState(function() { - return { - isTooltipActive: !0, - activeItem: el, - activePayload: el.tooltipPayload, - activeCoordinate: el.tooltipPosition || { - x: el.cx, - y: el.cy - } - }; - }); - }, this.handleItemMouseLeave = function() { - _this7.setState(function() { - return { - isTooltipActive: !1 - }; - }); - }, this.handleMouseMove = function(e) { - e && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(e.persist) && e.persist(), - _this7.triggeredAfterMouseMove(e); - }, this.handleMouseLeave = function(e) { - var onMouseLeave = _this7.props.onMouseLeave, nextState = { - isTooltipActive: !1 - }; - _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseLeave) && onMouseLeave(nextState, e); - }, this.handleOuterEvent = function(e) { - var eventName = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.l)(e); - if (eventName && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(_this7.props[eventName])) { - var mouse = _this7.getMouseInfo(e); - (0, _this7.props[eventName])(mouse, e); - } - }, this.handleClick = function(e) { - var onClick = _this7.props.onClick; - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onClick)) { - onClick(_this7.getMouseInfo(e), e); - } - }, this.handleMouseDown = function(e) { - var onMouseDown = _this7.props.onMouseDown; - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseDown)) { - onMouseDown(_this7.getMouseInfo(e), e); - } - }, this.handleMouseUp = function(e) { - var onMouseUp = _this7.props.onMouseUp; - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseUp)) { - onMouseUp(_this7.getMouseInfo(e), e); - } - }, this.handleTouchMove = function(e) { - null != e.changedTouches && e.changedTouches.length > 0 && _this7.handleMouseMove(e.changedTouches[0]); - }, this.verticalCoordinatesGenerator = function(_ref10) { - var xAxis = _ref10.xAxis, width = _ref10.width, height = _ref10.height, offset = _ref10.offset; - return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, xAxis, { - ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(xAxis, !0), - viewBox: { - x: 0, - y: 0, - width: width, - height: height - } - })), offset.left, offset.left + offset.width); - }, this.horizontalCoordinatesGenerator = function(_ref11) { - var yAxis = _ref11.yAxis, width = _ref11.width, height = _ref11.height, offset = _ref11.offset; - return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, yAxis, { - ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(yAxis, !0), - viewBox: { - x: 0, - y: 0, - width: width, - height: height - } - })), offset.top, offset.top + offset.height); - }, this.axesTicksGenerator = function(axis) { - return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !0); - }, this.tooltipTicksGenerator = function(axisMap) { - var axis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(axisMap), tooltipTicks = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !1, !0); + }, themeStyles = function(e) { return { - tooltipTicks: tooltipTicks, - orderedTooltipTicks: __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default()(tooltipTicks, function(o) { - return o.coordinate; - }), - tooltipAxis: axis, - tooltipAxisBandSize: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(axis) + list: { + background: e.palette.grey[900] + }, + listItem: { + minWidth: 7 * e.spacing.unit + }, + icon: { + fontSize: 3 * e.spacing.unit, + overflow: "unset" + } }; - }, this.renderCursor = function(element) { - var _state11 = _this7.state, isTooltipActive = _state11.isTooltipActive, activeCoordinate = _state11.activeCoordinate, activePayload = _state11.activePayload, offset = _state11.offset; - if (!(element && element.props.cursor && isTooltipActive && activeCoordinate)) return null; - var layout = _this7.props.layout, restProps = void 0, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a; - if ("ScatterChart" === chartName) restProps = activeCoordinate, cursorComp = __WEBPACK_IMPORTED_MODULE_13__shape_Cross__.a; else if ("BarChart" === chartName) restProps = _this7.getCursorRectangle(), - cursorComp = __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__.a; else if ("radial" === layout) { - var _getCursorPoints = _this7.getCursorPoints(), cx = _getCursorPoints.cx, cy = _getCursorPoints.cy, radius = _getCursorPoints.radius, startAngle = _getCursorPoints.startAngle, endAngle = _getCursorPoints.endAngle; - restProps = { - cx: cx, - cy: cy, - startAngle: startAngle, - endAngle: endAngle, - innerRadius: radius, - outerRadius: radius - }, cursorComp = __WEBPACK_IMPORTED_MODULE_14__shape_Sector__.a; - } else restProps = { - points: _this7.getCursorPoints() - }, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a; - var key = element.key || "_recharts-cursor", cursorProps = _extends({ - stroke: "#ccc" - }, offset, restProps, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(element.props.cursor), { - payload: activePayload, - key: key, - className: "recharts-tooltip-cursor" - }); - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(element.props.cursor) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element.props.cursor, cursorProps) : Object(__WEBPACK_IMPORTED_MODULE_5_react__.createElement)(cursorComp, cursorProps); - }, this.renderPolarAxis = function(element, displayName, index) { - var axisType = element.type.axisType, axisMap = _this7.state[axisType + "Map"], axisOption = axisMap[element.props[axisType + "Id"]]; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, _extends({}, axisOption, { - className: axisType, - key: element.key || displayName + "-" + index, - ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axisOption, !0) - })); - }, this.renderXAxis = function(element, displayName, index) { - var xAxisMap = _this7.state.xAxisMap, axisObj = xAxisMap[element.props.xAxisId]; - return _this7.renderAxis(axisObj, element, displayName, index); - }, this.renderYAxis = function(element, displayName, index) { - var yAxisMap = _this7.state.yAxisMap, axisObj = yAxisMap[element.props.yAxisId]; - return _this7.renderAxis(axisObj, element, displayName, index); - }, this.renderGrid = function(element) { - var _state12 = _this7.state, xAxisMap = _state12.xAxisMap, yAxisMap = _state12.yAxisMap, offset = _state12.offset, _props6 = _this7.props, width = _props6.width, height = _props6.height, xAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap), yAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap), props = element.props || {}; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { - key: element.key || "grid", - x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.x) ? props.x : offset.left, - y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.y) ? props.y : offset.top, - width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.width) ? props.width : offset.width, - height: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.height) ? props.height : offset.height, - xAxis: xAxis, - yAxis: yAxis, - offset: offset, - chartWidth: width, - chartHeight: height, - verticalCoordinatesGenerator: _this7.verticalCoordinatesGenerator, - horizontalCoordinatesGenerator: _this7.horizontalCoordinatesGenerator - }); - }, this.renderPolarGrid = function(element) { - var _state13 = _this7.state, radiusAxisMap = _state13.radiusAxisMap, angleAxisMap = _state13.angleAxisMap, radiusAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(radiusAxisMap), angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap), cx = angleAxis.cx, cy = angleAxis.cy, innerRadius = angleAxis.innerRadius, outerRadius = angleAxis.outerRadius; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { - polarAngles: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(angleAxis, !0).map(function(entry) { - return entry.coordinate; - }), - polarRadius: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(radiusAxis, !0).map(function(entry) { - return entry.coordinate; - }), - cx: cx, - cy: cy, - innerRadius: innerRadius, - outerRadius: outerRadius, - key: element.key || "polar-grid" - }); - }, this.renderBrush = function(element) { - var _props7 = _this7.props, margin = _props7.margin, data = _props7.data, _state14 = _this7.state, offset = _state14.offset, dataStartIndex = _state14.dataStartIndex, dataEndIndex = _state14.dataEndIndex, updateId = _state14.updateId; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { - key: element.key || "_recharts-brush", - onChange: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this7.handleBrushChange, null, element.props.onChange), - data: data, - x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.x) ? element.props.x : offset.left, - y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.y) ? element.props.y : offset.top + offset.height + offset.brushBottom - (margin.bottom || 0), - width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.width) ? element.props.width : offset.width, - startIndex: dataStartIndex, - endIndex: dataEndIndex, - updateId: "brush-" + updateId - }); - }, this.renderReferenceElement = function(element, displayName, index) { - if (!element) return null; - var _state15 = _this7.state, xAxisMap = _state15.xAxisMap, yAxisMap = _state15.yAxisMap, offset = _state15.offset, _element$props = element.props, xAxisId = _element$props.xAxisId, yAxisId = _element$props.yAxisId; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { - key: element.key || displayName + "-" + index, - xAxis: xAxisMap[xAxisId], - yAxis: yAxisMap[yAxisId], - viewBox: { - x: offset.left, - y: offset.top, - width: offset.width, - height: offset.height + }, SideBar = function(_Component) { + function SideBar() { + var e, t; + _classCallCheck(this, SideBar); + for (var n = arguments.length, r = new Array(n), o = 0; o < n; o++) r[o] = arguments[o]; + return _defineProperty(_assertThisInitialized(t = _possibleConstructorReturn(this, (e = _getPrototypeOf(SideBar)).call.apply(e, [ this ].concat(r)))), "clickOn", function(e) { + return function(n) { + n.preventDefault(), t.props.changeContent(e); + }; + }), _defineProperty(_assertThisInitialized(t), "menuItems", function(e) { + var n = t.props.classes, r = []; + return _common__WEBPACK_IMPORTED_MODULE_9__.b.forEach(function(o) { + r.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3___default.a, { + button: !0, + key: o.id, + onClick: t.clickOn(o.id), + className: n.listItem + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6___default.a, { + className: n.icon + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_8__.a, { + icon: o.icon + }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5___default.a, { + primary: o.title, + style: _objectSpread({}, styles.menu.default, styles.menu.transition[e], { + padding: 0 + }) + }))); + }), r; + }), _defineProperty(_assertThisInitialized(t), "menu", function(e) { + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { + className: t.props.classes.list + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_List__WEBPACK_IMPORTED_MODULE_2___default.a, null, t.menuItems(e))); + }), t; + } + return _inherits(SideBar, _Component), _createClass(SideBar, [ { + key: "shouldComponentUpdate", + value: function(e, t, n) { + return e.opened !== this.props.opened; } - }); - }, this.renderGraphicChild = function(element, displayName, index) { - var item = _this7.filterFormatItem(element, displayName, index); - if (!item) return null; - var graphicalItem = Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, item.props), _state16 = _this7.state, isTooltipActive = _state16.isTooltipActive, tooltipAxis = _state16.tooltipAxis, activeTooltipIndex = _state16.activeTooltipIndex, activeLabel = _state16.activeLabel, children = _this7.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), _item$props2 = item.props, points = _item$props2.points, isRange = _item$props2.isRange, baseLine = _item$props2.baseLine, _item$item$props2 = item.item.props, activeDot = _item$item$props2.activeDot; - if (!_item$item$props2.hide && isTooltipActive && tooltipItem && activeDot && activeTooltipIndex >= 0) { - var activePoint = void 0, basePoint = void 0; - if (tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? (activePoint = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(points, "payload." + tooltipAxis.dataKey, activeLabel), - basePoint = isRange && baseLine && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(baseLine, "payload." + tooltipAxis.dataKey, activeLabel)) : (activePoint = points[activeTooltipIndex], - basePoint = isRange && baseLine && baseLine[activeTooltipIndex]), !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activePoint)) return [ graphicalItem ].concat(_toConsumableArray(_this7.renderActivePoints({ - item: item, - activePoint: activePoint, - basePoint: basePoint, - childIndex: activeTooltipIndex, - isRange: isRange - }))); - } - return isRange ? [ graphicalItem, null, null ] : [ graphicalItem, null ]; - }; - }, _temp; - }; - __webpack_exports__.a = generateCategoricalChart; -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - function invariant(condition, format, a, b, c, d, e, f) { - if (validateFormat(format), !condition) { - var error; - if (void 0 === format) error = new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings."); else { - var args = [ a, b, c, d, e, f ], argIndex = 0; - error = new Error(format.replace(/%s/g, function() { - return args[argIndex++]; - })), error.name = "Invariant Violation"; - } - throw error.framesToPop = 1, error; - } - } - var validateFormat = function(format) {}; - "production" !== process.env.NODE_ENV && (validateFormat = function(format) { - if (void 0 === format) throw new Error("invariant requires an error message argument"); - }), module.exports = invariant; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - function makeEmptyFunction(arg) { - return function() { - return arg; + }, { + key: "render", + value: function() { + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7___default.a, { + mountOnEnter: !0, + in: this.props.opened, + timeout: { + enter: _common__WEBPACK_IMPORTED_MODULE_9__.a + } + }, this.menu); + } + }, { + key: "__reactstandin__regenerateByEval", + value: function __reactstandin__regenerateByEval(key, code) { + this[key] = eval(code); + } + } ]), SideBar; + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default()(themeStyles)(SideBar), reactHotLoader, leaveModule; + __webpack_exports__.a = _default, reactHotLoader = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).default, + reactHotLoader && (reactHotLoader.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), + reactHotLoader.register(themeStyles, "themeStyles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), + reactHotLoader.register(SideBar, "SideBar", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), + reactHotLoader.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx")), + leaveModule = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : __webpack_require__("./node_modules/react-hot-loader/index.js")).leaveModule, + leaveModule && leaveModule(module); + }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); + }, + "./index.jsx": function(e, t, n) { + "use strict"; + n.r(t), function(e) { + var t, r = n("./node_modules/react/index.js"), o = n.n(r), a = n("./node_modules/react-dom/index.js"), i = n("./node_modules/@material-ui/core/styles/MuiThemeProvider.js"), s = n.n(i), l = n("./node_modules/@material-ui/core/styles/createMuiTheme.js"), u = n.n(l), c = n("./components/Dashboard.jsx"); + (t = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : n("./node_modules/react-hot-loader/index.js")).enterModule) && t(e); + var d, f, p = u()({ + palette: { + type: "dark" + } + }), h = document.getElementById("dashboard"); + h && Object(a.render)(o.a.createElement(s.a, { + theme: p + }, o.a.createElement(c.a, null)), h), (d = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : n("./node_modules/react-hot-loader/index.js")).default) && (d.register(p, "theme", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/index.jsx"), + d.register(h, "dashboard", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/index.jsx")), + (f = ("undefined" != typeof reactHotLoaderGlobal ? reactHotLoaderGlobal : n("./node_modules/react-hot-loader/index.js")).leaveModule) && f(e); + }.call(this, n("./node_modules/webpack/buildin/harmony-module.js")(e)); + }, + "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js": function(e, t) { + e.exports = function(e) { + if (Array.isArray(e)) { + for (var t = 0, n = new Array(e.length); t < e.length; t++) n[t] = e[t]; + return n; + } + }; + }, + "./node_modules/@babel/runtime/helpers/assertThisInitialized.js": function(e, t) { + e.exports = function(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; }; - } - var emptyFunction = function() {}; - emptyFunction.thatReturns = makeEmptyFunction, emptyFunction.thatReturnsFalse = makeEmptyFunction(!1), - emptyFunction.thatReturnsTrue = makeEmptyFunction(!0), emptyFunction.thatReturnsNull = makeEmptyFunction(null), - emptyFunction.thatReturnsThis = function() { - return this; - }, emptyFunction.thatReturnsArgument = function(arg) { - return arg; - }, module.exports = emptyFunction; -}, function(module, exports, __webpack_require__) { - var aFunction = __webpack_require__(223); - module.exports = function(fn, that, length) { - if (aFunction(fn), void 0 === that) return fn; - switch (length) { - case 1: - return function(a) { - return fn.call(that, a); - }; - - case 2: - return function(a, b) { - return fn.call(that, a, b); - }; - - case 3: - return function(a, b, c) { - return fn.call(that, a, b, c); - }; - } - return function() { - return fn.apply(that, arguments); - }; - }; -}, function(module, exports, __webpack_require__) { - var isObject = __webpack_require__(35); - module.exports = function(it) { - if (!isObject(it)) throw TypeError(it + " is not an object!"); - return it; - }; -}, function(module, exports) { - module.exports = function(exec) { - try { - return !!exec(); - } catch (e) { - return !0; - } - }; -}, function(module, exports) { - var hasOwnProperty = {}.hasOwnProperty; - module.exports = function(it, key) { - return hasOwnProperty.call(it, key); - }; -}, function(module, exports, __webpack_require__) { - module.exports = { - default: __webpack_require__(421), - __esModule: !0 - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function capitalize(string) { - if ("production" !== process.env.NODE_ENV && "string" != typeof string) throw new Error("Material-UI: capitalize(string) expects a string argument."); - return string.charAt(0).toUpperCase() + string.slice(1); - } - function contains(obj, pred) { - return (0, _keys2.default)(pred).every(function(key) { - return obj.hasOwnProperty(key) && obj[key] === pred[key]; - }); - } - function findIndex(arr, pred) { - for (var predType = void 0 === pred ? "undefined" : (0, _typeof3.default)(pred), i = 0; i < arr.length; i += 1) { - if ("function" === predType && !0 == !!pred(arr[i], i, arr)) return i; - if ("object" === predType && contains(arr[i], pred)) return i; - if (-1 !== [ "string", "number", "boolean" ].indexOf(predType)) return arr.indexOf(pred); - } - return -1; - } - function find(arr, pred) { - var index = findIndex(arr, pred); - return index > -1 ? arr[index] : void 0; - } - function createChainedFunction() { - for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) funcs[_key] = arguments[_key]; - return funcs.filter(function(func) { - return null != func; - }).reduce(function(acc, func) { - return "production" !== process.env.NODE_ENV && (0, _warning2.default)("function" == typeof func, "Material-UI: invalid Argument Type, must only provide functions, undefined, or null."), - function() { - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2]; - acc.apply(this, args), func.apply(this, args); - }; - }, function() {}); - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }); - var _typeof2 = __webpack_require__(105), _typeof3 = _interopRequireDefault(_typeof2), _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys); - exports.capitalize = capitalize, exports.contains = contains, exports.findIndex = findIndex, - exports.find = find, exports.createChainedFunction = createChainedFunction; - var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning); - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : void 0; - } - var baseIsNative = __webpack_require__(611), getValue = __webpack_require__(614); - module.exports = getNative; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(x) { - return function() { - return x; + }, + "./node_modules/@babel/runtime/helpers/classCallCheck.js": function(e, t) { + e.exports = function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); }; - }; -}, function(module, exports, __webpack_require__) { - function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : void 0; - } - var baseIsNative = __webpack_require__(668), getValue = __webpack_require__(673); - module.exports = getNative; -}, function(module, exports, __webpack_require__) { - function baseGetTag(value) { - return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); - } - var Symbol = __webpack_require__(128), getRawTag = __webpack_require__(669), objectToString = __webpack_require__(670), nullTag = "[object Null]", undefinedTag = "[object Undefined]", symToStringTag = Symbol ? Symbol.toStringTag : void 0; - module.exports = baseGetTag; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__ = __webpack_require__(771), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__), __WEBPACK_IMPORTED_MODULE_4_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_4_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_classnames__), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__ = __webpack_require__(198), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); + }, + "./node_modules/@babel/runtime/helpers/createClass.js": function(e, t) { + function n(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); } } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; + e.exports = function(e, t, r) { + return t && n(e.prototype, t), r && n(e, r), e; }; - }(), BREAKING_SPACES = /[ \f\n\r\t\v\u2028\u2029]+/, calculateWordWidths = function(props) { - try { - return { - wordsWithComputedWidth: (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES)).map(function(word) { - return { - word: word, - width: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(word, props.style).width - }; - }), - spaceWidth: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(" ", props.style).width + }, + "./node_modules/@babel/runtime/helpers/defineProperty.js": function(e, t) { + e.exports = function(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + }; + }, + "./node_modules/@babel/runtime/helpers/extends.js": function(e, t) { + function n() { + return e.exports = n = Object.assign || function(e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, n.apply(this, arguments); + } + e.exports = n; + }, + "./node_modules/@babel/runtime/helpers/getPrototypeOf.js": function(e, t) { + function n(t) { + return e.exports = n = Object.setPrototypeOf ? Object.getPrototypeOf : function(e) { + return e.__proto__ || Object.getPrototypeOf(e); + }, n(t); + } + e.exports = n; + }, + "./node_modules/@babel/runtime/helpers/inherits.js": function(e, t, n) { + var r = n("./node_modules/@babel/runtime/helpers/setPrototypeOf.js"); + e.exports = function(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function"); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && r(e, t); + }; + }, + "./node_modules/@babel/runtime/helpers/interopRequireDefault.js": function(e, t) { + e.exports = function(e) { + return e && e.__esModule ? e : { + default: e }; - } catch (e) { - return null; - } - }, Text = (_temp2 = _class = function(_Component) { - function Text() { - var _ref, _temp, _this, _ret; - _classCallCheck(this, Text); - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; - return _temp = _this = _possibleConstructorReturn(this, (_ref = Text.__proto__ || Object.getPrototypeOf(Text)).call.apply(_ref, [ this ].concat(args))), - _this.state = { - wordsByLines: [] - }, _ret = _temp, _possibleConstructorReturn(_this, _ret); - } - return _inherits(Text, _Component), _createClass(Text, [ { - key: "componentWillMount", - value: function() { - this.updateWordsByLines(this.props, !0); - } - }, { - key: "componentWillReceiveProps", - value: function(nextProps) { - var needCalculate = this.props.children !== nextProps.children || this.props.style !== nextProps.style; - this.updateWordsByLines(nextProps, needCalculate); + }; + }, + "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js": function(e, t) { + e.exports = function(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) if (Object.prototype.hasOwnProperty.call(e, n)) { + var r = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(e, n) : {}; + r.get || r.set ? Object.defineProperty(t, n, r) : t[n] = e[n]; + } + return t.default = e, t; + }; + }, + "./node_modules/@babel/runtime/helpers/iterableToArray.js": function(e, t) { + e.exports = function(e) { + if (Symbol.iterator in Object(e) || "[object Arguments]" === Object.prototype.toString.call(e)) return Array.from(e); + }; + }, + "./node_modules/@babel/runtime/helpers/nonIterableSpread.js": function(e, t) { + e.exports = function() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + }; + }, + "./node_modules/@babel/runtime/helpers/objectWithoutProperties.js": function(e, t, n) { + var r = n("./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js"); + e.exports = function(e, t) { + if (null == e) return {}; + var n, o, a = r(e, t); + if (Object.getOwnPropertySymbols) { + var i = Object.getOwnPropertySymbols(e); + for (o = 0; o < i.length; o++) n = i[o], t.indexOf(n) >= 0 || Object.prototype.propertyIsEnumerable.call(e, n) && (a[n] = e[n]); } - }, { - key: "updateWordsByLines", - value: function(props, needCalculate) { - if (!props.width && !props.scaleToFit || Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.n)()) this.updateWordsWithoutCalculate(props); else { - if (needCalculate) { - var wordWidths = calculateWordWidths(props); - if (!wordWidths) return void this.updateWordsWithoutCalculate(props); - var wordsWithComputedWidth = wordWidths.wordsWithComputedWidth, spaceWidth = wordWidths.spaceWidth; - this.wordsWithComputedWidth = wordsWithComputedWidth, this.spaceWidth = spaceWidth; - } - var wordsByLines = this.calculateWordsByLines(this.wordsWithComputedWidth, this.spaceWidth, props.width); - this.setState({ - wordsByLines: wordsByLines + return a; + }; + }, + "./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js": function(e, t) { + e.exports = function(e, t) { + if (null == e) return {}; + var n, r, o = {}, a = Object.keys(e); + for (r = 0; r < a.length; r++) n = a[r], t.indexOf(n) >= 0 || (o[n] = e[n]); + return o; + }; + }, + "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js": function(e, t, n) { + var r = n("./node_modules/@babel/runtime/helpers/typeof.js"), o = n("./node_modules/@babel/runtime/helpers/assertThisInitialized.js"); + e.exports = function(e, t) { + return !t || "object" !== r(t) && "function" != typeof t ? o(e) : t; + }; + }, + "./node_modules/@babel/runtime/helpers/setPrototypeOf.js": function(e, t) { + function n(t, r) { + return e.exports = n = Object.setPrototypeOf || function(e, t) { + return e.__proto__ = t, e; + }, n(t, r); + } + e.exports = n; + }, + "./node_modules/@babel/runtime/helpers/toConsumableArray.js": function(e, t, n) { + var r = n("./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js"), o = n("./node_modules/@babel/runtime/helpers/iterableToArray.js"), a = n("./node_modules/@babel/runtime/helpers/nonIterableSpread.js"); + e.exports = function(e) { + return r(e) || o(e) || a(); + }; + }, + "./node_modules/@babel/runtime/helpers/typeof.js": function(e, t) { + function n(e) { + return (n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function r(t) { + return "function" == typeof Symbol && "symbol" === n(Symbol.iterator) ? e.exports = r = function(e) { + return n(e); + } : e.exports = r = function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : n(e); + }, r(t); + } + e.exports = r; + }, + "./node_modules/@fortawesome/fontawesome-svg-core/index.es.js": function(e, t, n) { + "use strict"; + (function(e, r) { + function o(e) { + return (o = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + })(e); + } + function a(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), + Object.defineProperty(e, r.key, r); + } + } + function i(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + function s(e) { + for (var t = 1; t < arguments.length; t++) { + var n = null != arguments[t] ? arguments[t] : {}, r = Object.keys(n); + "function" == typeof Object.getOwnPropertySymbols && (r = r.concat(Object.getOwnPropertySymbols(n).filter(function(e) { + return Object.getOwnPropertyDescriptor(n, e).enumerable; + }))), r.forEach(function(t) { + i(e, t, n[t]); }); } + return e; } - }, { - key: "updateWordsWithoutCalculate", - value: function(props) { - var words = __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES); - this.setState({ - wordsByLines: [ { - words: words - } ] + function l(e, t) { + return function(e) { + if (Array.isArray(e)) return e; + }(e) || function(e, t) { + var n = [], r = !0, o = !1, a = void 0; + try { + for (var i, s = e[Symbol.iterator](); !(r = (i = s.next()).done) && (n.push(i.value), + !t || n.length !== t); r = !0) ; + } catch (e) { + o = !0, a = e; + } finally { + try { + r || null == s.return || s.return(); + } finally { + if (o) throw a; + } + } + return n; + }(e, t) || function() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + }(); + } + n.d(t, "a", function() { + return Ce; + }), n.d(t, "b", function() { + return Te; + }); + var u = function() {}, c = {}, d = {}, f = { + mark: u, + measure: u + }; + try { + "undefined" != typeof window && (c = window), "undefined" != typeof document && (d = document), + "undefined" != typeof MutationObserver && MutationObserver, "undefined" != typeof performance && (f = performance); + } catch (e) {} + var p = (c.navigator || {}).userAgent, h = void 0 === p ? "" : p, _ = c, m = d, y = f, b = (_.document, + !!m.documentElement && !!m.head && "function" == typeof m.addEventListener && "function" == typeof m.createElement), v = (~h.indexOf("MSIE") || h.indexOf("Trident/"), + "fa"), g = "svg-inline--fa", j = "data-fa-i2svg", x = (function() { + try { + } catch (e) { + return !1; + } + }(), [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]), O = x.concat([ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]), w = ([ "xs", "sm", "lg", "fw", "ul", "li", "border", "pull-left", "pull-right", "spin", "pulse", "rotate-90", "rotate-180", "rotate-270", "flip-horizontal", "flip-vertical", "flip-both", "stack", "stack-1x", "stack-2x", "inverse", "layers", "layers-text", "layers-counter" ].concat(x.map(function(e) { + return "".concat(e, "x"); + })).concat(O.map(function(e) { + return "w-".concat(e); + })), _.FontAwesomeConfig || {}); + if (m && "function" == typeof m.querySelector) { + [ [ "data-family-prefix", "familyPrefix" ], [ "data-replacement-class", "replacementClass" ], [ "data-auto-replace-svg", "autoReplaceSvg" ], [ "data-auto-add-css", "autoAddCss" ], [ "data-auto-a11y", "autoA11y" ], [ "data-search-pseudo-elements", "searchPseudoElements" ], [ "data-observe-mutations", "observeMutations" ], [ "data-mutate-approach", "mutateApproach" ], [ "data-keep-original-source", "keepOriginalSource" ], [ "data-measure-performance", "measurePerformance" ], [ "data-show-missing-icons", "showMissingIcons" ] ].forEach(function(e) { + var t = l(e, 2), n = t[0], r = t[1], o = function(e) { + return "" === e || "false" !== e && ("true" === e || e); + }(function(e) { + var t = m.querySelector("script[" + e + "]"); + if (t) return t.getAttribute(e); + }(n)); + null != o && (w[r] = o); }); } - }, { - key: "calculateWordsByLines", - value: function(wordsWithComputedWidth, spaceWidth, lineWidth) { - var scaleToFit = this.props.scaleToFit; - return wordsWithComputedWidth.reduce(function(result, _ref2) { - var word = _ref2.word, width = _ref2.width, currentLine = result[result.length - 1]; - if (currentLine && (null == lineWidth || scaleToFit || currentLine.width + width + spaceWidth < lineWidth)) currentLine.words.push(word), - currentLine.width += width + spaceWidth; else { - var newLine = { - words: [ word ], - width: width - }; - result.push(newLine); + var E = s({}, { + familyPrefix: v, + replacementClass: g, + autoReplaceSvg: !0, + autoAddCss: !0, + autoA11y: !0, + searchPseudoElements: !1, + observeMutations: !0, + mutateApproach: "async", + keepOriginalSource: !0, + measurePerformance: !1, + showMissingIcons: !0 + }, w); + E.autoReplaceSvg || (E.observeMutations = !1); + var M = s({}, E); + _.FontAwesomeConfig = M; + var P = _ || {}; + P.___FONT_AWESOME___ || (P.___FONT_AWESOME___ = {}), P.___FONT_AWESOME___.styles || (P.___FONT_AWESOME___.styles = {}), + P.___FONT_AWESOME___.hooks || (P.___FONT_AWESOME___.hooks = {}), P.___FONT_AWESOME___.shims || (P.___FONT_AWESOME___.shims = []); + var k = P.___FONT_AWESOME___, T = []; + b && ((m.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(m.readyState) || m.addEventListener("DOMContentLoaded", function e() { + m.removeEventListener("DOMContentLoaded", e), 1, T.map(function(e) { + return e(); + }); + })); + var C, S = "pending", D = "settled", A = "fulfilled", I = "rejected", R = function() {}, L = void 0 !== e && void 0 !== e.process && "function" == typeof e.process.emit, N = void 0 === r ? setTimeout : r, B = []; + function U() { + for (var e = 0; e < B.length; e++) B[e][0](B[e][1]); + B = [], C = !1; + } + function W(e, t) { + B.push([ e, t ]), C || (C = !0, N(U, 0)); + } + function z(e) { + var t = e.owner, n = t._state, r = t._data, o = e[n], a = e.then; + if ("function" == typeof o) { + n = A; + try { + r = o(r); + } catch (e) { + q(a, e); } - return result; - }, []); + } + K(a, r) || (n === A && F(a, r), n === I && q(a, r)); } - }, { - key: "render", - value: function() { - var _props = this.props, dx = _props.dx, dy = _props.dy, textAnchor = _props.textAnchor, verticalAnchor = _props.verticalAnchor, scaleToFit = _props.scaleToFit, angle = _props.angle, lineHeight = _props.lineHeight, capHeight = _props.capHeight, className = _props.className, textProps = _objectWithoutProperties(_props, [ "dx", "dy", "textAnchor", "verticalAnchor", "scaleToFit", "angle", "lineHeight", "capHeight", "className" ]), wordsByLines = this.state.wordsByLines; - if (!Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(textProps.x) || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(textProps.y)) return null; - var x = textProps.x + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(dx) ? dx : 0), y = textProps.y + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(dy) ? dy : 0), startDy = void 0; - switch (verticalAnchor) { - case "start": - startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + capHeight + ")"); - break; - - case "middle": - startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + (wordsByLines.length - 1) / 2 + " * -" + lineHeight + " + (" + capHeight + " / 2))"); - break; - - default: - startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + (wordsByLines.length - 1) + " * -" + lineHeight + ")"); - } - var transforms = []; - if (scaleToFit) { - var lineWidth = wordsByLines[0].width; - transforms.push("scale(" + this.props.width / lineWidth + ")"); - } - return angle && transforms.push("rotate(" + angle + ", " + x + ", " + y + ")"), - transforms.length && (textProps.transform = transforms.join(" ")), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("text", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.k)(textProps), { - x: x, - y: y, - className: __WEBPACK_IMPORTED_MODULE_4_classnames___default()("recharts-text", className), - textAnchor: textAnchor - }), wordsByLines.map(function(line, index) { - return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("tspan", { - x: x, - dy: 0 === index ? startDy : lineHeight, - key: index - }, line.words.join(" ")); - })); + function K(e, t) { + var n; + try { + if (e === t) throw new TypeError("A promises callback cannot return that same promise."); + if (t && ("function" == typeof t || "object" === o(t))) { + var r = t.then; + if ("function" == typeof r) return r.call(t, function(r) { + n || (n = !0, t === r ? H(e, r) : F(e, r)); + }, function(t) { + n || (n = !0, q(e, t)); + }), !0; + } + } catch (t) { + return n || q(e, t), !0; + } + return !1; } - } ]), Text; - }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.c, { - scaleToFit: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, - angle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, - textAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "start", "middle", "end", "inherit" ]), - verticalAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "start", "middle", "end" ]), - style: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object - }), _class.defaultProps = { - x: 0, - y: 0, - lineHeight: "1em", - capHeight: "0.71em", - scaleToFit: !1, - textAnchor: "start", - verticalAnchor: "end" - }, _temp2); - __webpack_exports__.a = Text; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_require__.d(__webpack_exports__, "a", function() { - return map; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return slice; - }); - var array = Array.prototype, map = array.map, slice = array.slice; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 + function F(e, t) { + e !== t && K(e, t) || H(e, t); } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), Dot = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) { - function Dot() { - return _classCallCheck(this, Dot), _possibleConstructorReturn(this, (Dot.__proto__ || Object.getPrototypeOf(Dot)).apply(this, arguments)); - } - return _inherits(Dot, _Component), _createClass(Dot, [ { - key: "render", - value: function() { - var _props = this.props, cx = _props.cx, cy = _props.cy, r = _props.r, className = _props.className, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-dot", className); - return cx === +cx && cy === +cy && r === +r ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("circle", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.e)(this.props, null, !0), { - className: layerClass, - cx: cx, - cy: cy, - r: r - })) : null; - } - } ]), Dot; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Dot", _class2.propTypes = { - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - r: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }, _class = _temp)) || _class; - __webpack_exports__.a = Dot; -}, function(module, exports, __webpack_require__) { - var IObject = __webpack_require__(146), defined = __webpack_require__(148); - module.exports = function(it) { - return IObject(defined(it)); - }; -}, function(module, exports, __webpack_require__) { - var defined = __webpack_require__(148); - module.exports = function(it) { - return Object(defined(it)); - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }); - var _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) { - return typeof obj; - } : function(obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _toCss = __webpack_require__(163), _toCss2 = _interopRequireDefault(_toCss), _toCssValue = __webpack_require__(110), _toCssValue2 = _interopRequireDefault(_toCssValue), StyleRule = function() { - function StyleRule(key, style, options) { - _classCallCheck(this, StyleRule), this.type = "style", this.isProcessed = !1; - var sheet = options.sheet, Renderer = options.Renderer, selector = options.selector; - this.key = key, this.options = options, this.style = style, selector && (this.selectorText = selector), - this.renderer = sheet ? sheet.renderer : new Renderer(); - } - return _createClass(StyleRule, [ { - key: "prop", - value: function(name, value) { - if (void 0 === value) return this.style[name]; - if (this.style[name] === value) return this; - value = this.options.jss.plugins.onChangeValue(value, name, this); - var isEmpty = null == value || !1 === value, isDefined = name in this.style; - if (isEmpty && !isDefined) return this; - var remove = isEmpty && isDefined; - if (remove ? delete this.style[name] : this.style[name] = value, this.renderable) return remove ? this.renderer.removeProperty(this.renderable, name) : this.renderer.setProperty(this.renderable, name, value), - this; - var sheet = this.options.sheet; - return sheet && sheet.attached && (0, _warning2.default)(!1, 'Rule is not linked. Missing sheet option "link: true".'), - this; + function H(e, t) { + e._state === S && (e._state = D, e._data = t, W(V, e)); } - }, { - key: "applyTo", - value: function(renderable) { - var json = this.toJSON(); - for (var prop in json) this.renderer.setProperty(renderable, prop, json[prop]); - return this; + function q(e, t) { + e._state === S && (e._state = D, e._data = t, W(X, e)); } - }, { - key: "toJSON", - value: function() { - var json = {}; - for (var prop in this.style) { - var value = this.style[prop]; - "object" !== (void 0 === value ? "undefined" : _typeof(value)) ? json[prop] = value : Array.isArray(value) && (json[prop] = (0, - _toCssValue2.default)(value)); - } - return json; + function G(e) { + e._then = e._then.forEach(z); } - }, { - key: "toString", - value: function(options) { - var sheet = this.options.sheet, link = !!sheet && sheet.options.link, opts = link ? _extends({}, options, { - allowEmpty: !0 - }) : options; - return (0, _toCss2.default)(this.selector, this.style, opts); + function V(e) { + e._state = A, G(e); } - }, { - key: "selector", - set: function(selector) { - if (selector !== this.selectorText && (this.selectorText = selector, this.renderable)) { - if (!this.renderer.setSelector(this.renderable, selector) && this.renderable) { - var renderable = this.renderer.replaceRule(this.renderable, this); - renderable && (this.renderable = renderable); - } - } - }, - get: function() { - return this.selectorText; - } - } ]), StyleRule; - }(); - exports.default = StyleRule; -}, function(module, exports, __webpack_require__) { - function isSymbol(value) { - return "symbol" == typeof value || isObjectLike(value) && baseGetTag(value) == symbolTag; - } - var baseGetTag = __webpack_require__(41), isObjectLike = __webpack_require__(42), symbolTag = "[object Symbol]"; - module.exports = isSymbol; -}, function(module, exports) { - function identity(value) { - return value; - } - module.exports = identity; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 + function X(t) { + t._state = I, G(t), !t._handled && L && e.process.emit("unhandledRejection", t._data, t); } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_3_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react_smooth__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), getRectangePath = function(x, y, width, height, radius) { - var maxRadius = Math.min(Math.abs(width) / 2, Math.abs(height) / 2), sign = height >= 0 ? 1 : -1, clockWise = height >= 0 ? 1 : 0, path = void 0; - if (maxRadius > 0 && radius instanceof Array) { - for (var newRadius = [], i = 0; i < 4; i++) newRadius[i] = radius[i] > maxRadius ? maxRadius : radius[i]; - path = "M" + x + "," + (y + sign * newRadius[0]), newRadius[0] > 0 && (path += "A " + newRadius[0] + "," + newRadius[0] + ",0,0," + clockWise + "," + (x + newRadius[0]) + "," + y), - path += "L " + (x + width - newRadius[1]) + "," + y, newRadius[1] > 0 && (path += "A " + newRadius[1] + "," + newRadius[1] + ",0,0," + clockWise + ",\n " + (x + width) + "," + (y + sign * newRadius[1])), - path += "L " + (x + width) + "," + (y + height - sign * newRadius[2]), newRadius[2] > 0 && (path += "A " + newRadius[2] + "," + newRadius[2] + ",0,0," + clockWise + ",\n " + (x + width - newRadius[2]) + "," + (y + height)), - path += "L " + (x + newRadius[3]) + "," + (y + height), newRadius[3] > 0 && (path += "A " + newRadius[3] + "," + newRadius[3] + ",0,0," + clockWise + ",\n " + x + "," + (y + height - sign * newRadius[3])), - path += "Z"; - } else if (maxRadius > 0 && radius === +radius && radius > 0) { - var _newRadius = Math.min(maxRadius, radius); - path = "M " + x + "," + (y + sign * _newRadius) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + _newRadius) + "," + y + "\n L " + (x + width - _newRadius) + "," + y + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + width) + "," + (y + sign * _newRadius) + "\n L " + (x + width) + "," + (y + height - sign * _newRadius) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + width - _newRadius) + "," + (y + height) + "\n L " + (x + _newRadius) + "," + (y + height) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + x + "," + (y + height - sign * _newRadius) + " Z"; - } else path = "M " + x + "," + y + " h " + width + " v " + height + " h " + -width + " Z"; - return path; - }, Rectangle = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp2 = _class2 = function(_Component) { - function Rectangle() { - var _ref, _temp, _this, _ret; - _classCallCheck(this, Rectangle); - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; - return _temp = _this = _possibleConstructorReturn(this, (_ref = Rectangle.__proto__ || Object.getPrototypeOf(Rectangle)).call.apply(_ref, [ this ].concat(args))), - _this.state = { - totalLength: -1 - }, _ret = _temp, _possibleConstructorReturn(_this, _ret); - } - return _inherits(Rectangle, _Component), _createClass(Rectangle, [ { - key: "componentDidMount", - value: function() { - if (this.node && this.node.getTotalLength) try { - var totalLength = this.node.getTotalLength(); - totalLength && this.setState({ - totalLength: totalLength - }); - } catch (err) {} + function $(t) { + e.process.emit("rejectionHandled", t); } - }, { - key: "render", - value: function() { - var _this2 = this, _props = this.props, x = _props.x, y = _props.y, width = _props.width, height = _props.height, radius = _props.radius, className = _props.className, totalLength = this.state.totalLength, _props2 = this.props, animationEasing = _props2.animationEasing, animationDuration = _props2.animationDuration, animationBegin = _props2.animationBegin, isAnimationActive = _props2.isAnimationActive, isUpdateAnimationActive = _props2.isUpdateAnimationActive; - if (x !== +x || y !== +y || width !== +width || height !== +height || 0 === width || 0 === height) return null; - var layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-rectangle", className); - return isUpdateAnimationActive ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, { - canBegin: totalLength > 0, - from: { - width: width, - height: height, - x: x, - y: y - }, - to: { - width: width, - height: height, - x: x, - y: y - }, - duration: animationDuration, - animationEasing: animationEasing, - isActive: isUpdateAnimationActive - }, function(_ref2) { - var currWidth = _ref2.width, currHeight = _ref2.height, currX = _ref2.x, currY = _ref2.y; - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, { - canBegin: totalLength > 0, - from: "0px " + (-1 === totalLength ? 1 : totalLength) + "px", - to: totalLength + "px 0px", - attributeName: "strokeDasharray", - begin: animationBegin, - duration: animationDuration, - isActive: isAnimationActive, - easing: animationEasing - }, __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(_this2.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(_this2.props), { - className: layerClass, - d: getRectangePath(currX, currY, currWidth, currHeight, radius), - ref: function(node) { - _this2.node = node; - } - }))); - }) : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(this.props), { - className: layerClass, - d: getRectangePath(x, y, width, height, radius) - })); - } - } ]), Rectangle; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Rectangle", - _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.a, { - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - radius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array ]), - isAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - isUpdateAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - animationBegin: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - animationDuration: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - animationEasing: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ]) - }), _class2.defaultProps = { - x: 0, - y: 0, - width: 0, - height: 0, - radius: 0, - isAnimationActive: !1, - isUpdateAnimationActive: !1, - animationBegin: 0, - animationDuration: 1500, - animationEasing: "ease" - }, _class = _temp2)) || _class; - __webpack_exports__.a = Rectangle; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_d3_shape__ = __webpack_require__(182), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), CURVE_FACTORIES = { - curveBasisClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.c, - curveBasisOpen: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.d, - curveBasis: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.b, - curveLinearClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.f, - curveLinear: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e, - curveMonotoneX: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.g, - curveMonotoneY: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.h, - curveNatural: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.i, - curveStep: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.j, - curveStepAfter: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.k, - curveStepBefore: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.l - }, defined = function(p) { - return p.x === +p.x && p.y === +p.y; - }, getX = function(p) { - return p.x; - }, getY = function(p) { - return p.y; - }, getCurveFactory = function(type, layout) { - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(type)) return type; - var name = "curve" + type.slice(0, 1).toUpperCase() + type.slice(1); - return "curveMonotone" === name && layout ? CURVE_FACTORIES[name + ("vertical" === layout ? "Y" : "X")] : CURVE_FACTORIES[name] || __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e; - }, Curve = Object(__WEBPACK_IMPORTED_MODULE_6__util_PureRender__.a)((_temp = _class2 = function(_Component) { - function Curve() { - return _classCallCheck(this, Curve), _possibleConstructorReturn(this, (Curve.__proto__ || Object.getPrototypeOf(Curve)).apply(this, arguments)); - } - return _inherits(Curve, _Component), _createClass(Curve, [ { - key: "getPath", - value: function() { - var _props = this.props, type = _props.type, points = _props.points, baseLine = _props.baseLine, layout = _props.layout, connectNulls = _props.connectNulls, curveFactory = getCurveFactory(type, layout), formatPoints = connectNulls ? points.filter(function(entry) { - return defined(entry); - }) : points, lineFunction = void 0; - if (__WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default()(baseLine)) { - var areaPoints = formatPoints.map(function(entry, index) { - return _extends({}, entry, { - base: baseLine[index] - }); - }); - return lineFunction = "vertical" === layout ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(function(d) { - return d.base.x; - }) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(function(d) { - return d.base.y; - }), lineFunction.defined(defined).curve(curveFactory), lineFunction(areaPoints); + function Y(e) { + if ("function" != typeof e) throw new TypeError("Promise resolver " + e + " is not a function"); + if (this instanceof Y == !1) throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); + this._then = [], function(e, t) { + function n(e) { + q(t, e); + } + try { + e(function(e) { + F(t, e); + }, n); + } catch (e) { + n(e); + } + }(e, this); + } + Y.prototype = { + constructor: Y, + _state: S, + _then: null, + _data: void 0, + _handled: !1, + then: function(e, t) { + var n = { + owner: this, + then: new this.constructor(R), + fulfilled: e, + rejected: t + }; + return !t && !e || this._handled || (this._handled = !0, this._state === I && L && W($, this)), + this._state === A || this._state === I ? W(z, n) : this._then.push(n), n.then; + }, + catch: function(e) { + return this.then(null, e); + } + }, Y.all = function(e) { + if (!Array.isArray(e)) throw new TypeError("You must pass an array to Promise.all()."); + return new Y(function(t, n) { + var r = [], o = 0; + function a(e) { + return o++, function(n) { + r[e] = n, --o || t(r); + }; + } + for (var i, s = 0; s < e.length; s++) (i = e[s]) && "function" == typeof i.then ? i.then(a(s), n) : r[s] = i; + o || t(r); + }); + }, Y.race = function(e) { + if (!Array.isArray(e)) throw new TypeError("You must pass an array to Promise.race()."); + return new Y(function(t, n) { + for (var r, o = 0; o < e.length; o++) (r = e[o]) && "function" == typeof r.then ? r.then(t, n) : t(r); + }); + }, Y.resolve = function(e) { + return e && "object" === o(e) && e.constructor === Y ? e : new Y(function(t) { + t(e); + }); + }, Y.reject = function(e) { + return new Y(function(t, n) { + n(e); + }); + }; + "function" == typeof Promise && Promise; + var Q = { + size: 16, + x: 0, + y: 0, + rotate: 0, + flipX: !1, + flipY: !1 + }; + function J(e) { + if (e && b) { + var t = m.createElement("style"); + t.setAttribute("type", "text/css"), t.innerHTML = e; + for (var n = m.head.childNodes, r = null, o = n.length - 1; o > -1; o--) { + var a = n[o], i = (a.tagName || "").toUpperCase(); + [ "STYLE", "LINK" ].indexOf(i) > -1 && (r = a); + } + return m.head.insertBefore(t, r), e; } - return lineFunction = "vertical" === layout && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.m)().x(getX).y(getY), - lineFunction.defined(defined).curve(curveFactory), lineFunction(formatPoints); - } - }, { - key: "render", - value: function() { - var _props2 = this.props, className = _props2.className, points = _props2.points, path = _props2.path, pathRef = _props2.pathRef; - if (!(points && points.length || path)) return null; - var realPath = points && points.length ? this.getPath() : path; - return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.e)(this.props, null, !0), { - className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-curve", className), - d: realPath, - ref: pathRef - })); - } - } ]), Curve; - }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = "Curve", - _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.c, { - className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, - type: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "basis", "basisClosed", "basisOpen", "linear", "linearClosed", "natural", "monotoneX", "monotoneY", "monotone", "step", "stepBefore", "stepAfter" ]), __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]), - layout: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "horizontal", "vertical" ]), - baseLine: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array ]), - points: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object), - connectNulls: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool, - path: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, - pathRef: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func - }), _class2.defaultProps = { - type: "linear", - points: [], - connectNulls: !1 - }, _class = _temp)) || _class; - __webpack_exports__.a = Curve; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), - __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), XAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) { - function XAxis() { - return _classCallCheck(this, XAxis), _possibleConstructorReturn(this, (XAxis.__proto__ || Object.getPrototypeOf(XAxis)).apply(this, arguments)); - } - return _inherits(XAxis, _Component), _createClass(XAxis, [ { - key: "render", - value: function() { - return null; - } - } ]), XAxis; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "XAxis", - _class2.propTypes = { - allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - xAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "dataMin", "dataMax" ]) ])), - dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "top", "bottom" ]), - type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "number", "category" ]), - ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, - tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({ - left: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - right: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }), - allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.d), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), - tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]), - axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), - tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), - minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "preserveStart", "preserveEnd", "preserveStartEnd" ]) ]), - reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool - }, _class2.defaultProps = { - allowDecimals: !0, - hide: !1, - orientation: "bottom", - width: 0, - height: 30, - mirror: !1, - xAxisId: 0, - tickCount: 5, - type: "category", - domain: [ 0, "auto" ], - padding: { - left: 0, - right: 0 - }, - allowDataOverflow: !1, - scale: "auto", - reversed: !1, - allowDuplicatedCategory: !0 - }, _class = _temp)) || _class; - __webpack_exports__.a = XAxis; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), - __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), YAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) { - function YAxis() { - return _classCallCheck(this, YAxis), _possibleConstructorReturn(this, (YAxis.__proto__ || Object.getPrototypeOf(YAxis)).apply(this, arguments)); - } - return _inherits(YAxis, _Component), _createClass(YAxis, [ { - key: "render", - value: function() { - return null; - } - } ]), YAxis; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "YAxis", - _class2.propTypes = { - allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - yAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "dataMin", "dataMax" ]) ])), - dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), - ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, - tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "left", "right" ]), - type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "number", "category" ]), - padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({ - top: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - bottom: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }), - allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ]), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), - tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]), - axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), - tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), - minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "preserveStart", "preserveEnd", "preserveStartEnd" ]) ]), - reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool - }, _class2.defaultProps = { - allowDuplicatedCategory: !0, - allowDecimals: !0, - hide: !1, - orientation: "left", - width: 60, - height: 0, - mirror: !1, - yAxisId: 0, - tickCount: 5, - type: "number", - domain: [ 0, "auto" ], - padding: { - top: 0, - bottom: 0 - }, - allowDataOverflow: !1, - scale: "auto", - reversed: !1 - }, _class = _temp)) || _class; - __webpack_exports__.a = YAxis; -}, function(module, exports, __webpack_require__) { - "use strict"; - function toObject(val) { - if (null === val || void 0 === val) throw new TypeError("Object.assign cannot be called with null or undefined"); - return Object(val); - } - var getOwnPropertySymbols = Object.getOwnPropertySymbols, hasOwnProperty = Object.prototype.hasOwnProperty, propIsEnumerable = Object.prototype.propertyIsEnumerable; - module.exports = function() { - try { - if (!Object.assign) return !1; - var test1 = new String("abc"); - if (test1[5] = "de", "5" === Object.getOwnPropertyNames(test1)[0]) return !1; - for (var test2 = {}, i = 0; i < 10; i++) test2["_" + String.fromCharCode(i)] = i; - if ("0123456789" !== Object.getOwnPropertyNames(test2).map(function(n) { - return test2[n]; - }).join("")) return !1; - var test3 = {}; - return "abcdefghijklmnopqrst".split("").forEach(function(letter) { - test3[letter] = letter; - }), "abcdefghijklmnopqrst" === Object.keys(Object.assign({}, test3)).join(""); - } catch (err) { - return !1; - } - }() ? Object.assign : function(target, source) { - for (var from, symbols, to = toObject(target), s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - for (var key in from) hasOwnProperty.call(from, key) && (to[key] = from[key]); - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) propIsEnumerable.call(from, symbols[i]) && (to[symbols[i]] = from[symbols[i]]); - } - } - return to; - }; -}, function(module, exports) { - module.exports = function(bitmap, value) { - return { - enumerable: !(1 & bitmap), - configurable: !(2 & bitmap), - writable: !(4 & bitmap), - value: value - }; - }; -}, function(module, exports, __webpack_require__) { - var $keys = __webpack_require__(226), enumBugKeys = __webpack_require__(152); - module.exports = Object.keys || function(O) { - return $keys(O, enumBugKeys); - }; -}, function(module, exports) { - module.exports = {}; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function createBreakpoints(breakpoints) { - function up(key) { - return "@media (min-width:" + ("number" == typeof values[key] ? values[key] : key) + unit + ")"; - } - function down(key) { - var endIndex = keys.indexOf(key) + 1, upperbound = values[keys[endIndex]]; - return endIndex === keys.length ? up("xs") : "@media (max-width:" + (("number" == typeof upperbound && endIndex > 0 ? upperbound : key) - step / 100) + unit + ")"; - } - function between(start, end) { - var endIndex = keys.indexOf(end) + 1; - return endIndex === keys.length ? up(start) : "@media (min-width:" + values[start] + unit + ") and (max-width:" + (values[keys[endIndex]] - step / 100) + unit + ")"; - } - function only(key) { - return between(key, key); - } - function width(key) { - return values[key]; - } - var _breakpoints$values = breakpoints.values, values = void 0 === _breakpoints$values ? { - xs: 0, - sm: 600, - md: 960, - lg: 1280, - xl: 1920 - } : _breakpoints$values, _breakpoints$unit = breakpoints.unit, unit = void 0 === _breakpoints$unit ? "px" : _breakpoints$unit, _breakpoints$step = breakpoints.step, step = void 0 === _breakpoints$step ? 5 : _breakpoints$step, other = (0, - _objectWithoutProperties3.default)(breakpoints, [ "values", "unit", "step" ]); - return (0, _extends3.default)({ - keys: keys, - values: values, - up: up, - down: down, - between: between, - only: only, - width: width - }, other); - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }), exports.keys = void 0; - var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); - exports.default = createBreakpoints; - var keys = exports.keys = [ "xs", "sm", "md", "lg", "xl" ]; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _getDisplayName = __webpack_require__(244), _getDisplayName2 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_getDisplayName), wrapDisplayName = function(BaseComponent, hocName) { - return hocName + "(" + (0, _getDisplayName2.default)(BaseComponent) + ")"; - }; - exports.default = wrapDisplayName; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }); - var _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), _createRule = __webpack_require__(111), _createRule2 = _interopRequireDefault(_createRule), _linkRule = __webpack_require__(249), _linkRule2 = _interopRequireDefault(_linkRule), _StyleRule = __webpack_require__(66), _StyleRule2 = _interopRequireDefault(_StyleRule), _escape = __webpack_require__(467), _escape2 = _interopRequireDefault(_escape), RuleList = function() { - function RuleList(options) { - _classCallCheck(this, RuleList), this.map = {}, this.raw = {}, this.index = [], - this.options = options, this.classes = options.classes; - } - return _createClass(RuleList, [ { - key: "add", - value: function(name, decl, options) { - var _options = this.options, parent = _options.parent, sheet = _options.sheet, jss = _options.jss, Renderer = _options.Renderer, generateClassName = _options.generateClassName; - options = _extends({ - classes: this.classes, - parent: parent, - sheet: sheet, - jss: jss, - Renderer: Renderer, - generateClassName: generateClassName - }, options), !options.selector && this.classes[name] && (options.selector = "." + (0, - _escape2.default)(this.classes[name])), this.raw[name] = decl; - var rule = (0, _createRule2.default)(name, decl, options), className = void 0; - !options.selector && rule instanceof _StyleRule2.default && (className = generateClassName(rule, sheet), - rule.selector = "." + (0, _escape2.default)(className)), this.register(rule, className); - var index = void 0 === options.index ? this.index.length : options.index; - return this.index.splice(index, 0, rule), rule; - } - }, { - key: "get", - value: function(name) { - return this.map[name]; - } - }, { - key: "remove", - value: function(rule) { - this.unregister(rule), this.index.splice(this.indexOf(rule), 1); - } - }, { - key: "indexOf", - value: function(rule) { - return this.index.indexOf(rule); } - }, { - key: "process", - value: function() { - var plugins = this.options.jss.plugins; - this.index.slice(0).forEach(plugins.onProcessRule, plugins); - } - }, { - key: "register", - value: function(rule, className) { - this.map[rule.key] = rule, rule instanceof _StyleRule2.default && (this.map[rule.selector] = rule, - className && (this.classes[rule.key] = className)); + var Z = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + function ee() { + for (var e = 12, t = ""; e-- > 0; ) t += Z[62 * Math.random() | 0]; + return t; } - }, { - key: "unregister", - value: function(rule) { - delete this.map[rule.key], rule instanceof _StyleRule2.default && (delete this.map[rule.selector], - delete this.classes[rule.key]); + function te(e) { + return "".concat(e).replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(//g, ">"); } - }, { - key: "update", - value: function(name, data) { - var _options2 = this.options, plugins = _options2.jss.plugins, sheet = _options2.sheet; - if ("string" == typeof name) return void plugins.onUpdate(data, this.get(name), sheet); - for (var index = 0; index < this.index.length; index++) plugins.onUpdate(name, this.index[index], sheet); + function ne(e) { + return Object.keys(e || {}).reduce(function(t, n) { + return t + "".concat(n, ": ").concat(e[n], ";"); + }, ""); } - }, { - key: "link", - value: function(cssRules) { - for (var map = this.options.sheet.renderer.getUnescapedKeysMap(this.index), i = 0; i < cssRules.length; i++) { - var cssRule = cssRules[i], _key = this.options.sheet.renderer.getKey(cssRule); - map[_key] && (_key = map[_key]); - var rule = this.map[_key]; - rule && (0, _linkRule2.default)(rule, cssRule); - } + function re(e) { + return e.size !== Q.size || e.x !== Q.x || e.y !== Q.y || e.rotate !== Q.rotate || e.flipX || e.flipY; } - }, { - key: "toString", - value: function(options) { - for (var str = "", sheet = this.options.sheet, link = !!sheet && sheet.options.link, index = 0; index < this.index.length; index++) { - var rule = this.index[index], css = rule.toString(options); - (css || link) && (str && (str += "\n"), str += css); - } - return str; - } - } ]), RuleList; - }(); - exports.default = RuleList; -}, function(module, exports, __webpack_require__) { - "use strict"; - Object.defineProperty(exports, "__esModule", { - value: !0 - }); - var _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, menuSkeletons = [ { - id: "home", - menu: { - title: "Home", - icon: "home" - } - }, { - id: "chain", - menu: { - title: "Chain", - icon: "link" - } - }, { - id: "txpool", - menu: { - title: "TxPool", - icon: "credit-card" - } - }, { - id: "network", - menu: { - title: "Network", - icon: "globe" - } - }, { - id: "system", - menu: { - title: "System", - icon: "tachometer" - } - }, { - id: "logs", - menu: { - title: "Logs", - icon: "list" - } - } ]; - exports.MENU = new Map(menuSkeletons.map(function(_ref) { - var id = _ref.id, menu = _ref.menu; - return [ id, _extends({ - id: id - }, menu) ]; - })), exports.DURATION = 200, exports.styles = { - light: { - color: "rgba(255, 255, 255, 0.54)" - } - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function Surface(props) { - var children = props.children, width = props.width, height = props.height, viewBox = props.viewBox, className = props.className, style = props.style, others = _objectWithoutProperties(props, [ "children", "width", "height", "viewBox", "className", "style" ]), svgView = viewBox || { - width: width, - height: height, - x: 0, - y: 0 - }, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-surface", className), attrs = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others); - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("svg", _extends({}, attrs, { - className: layerClass, - width: width, - height: height, - style: style, - viewBox: svgView.x + " " + svgView.y + " " + svgView.width + " " + svgView.height, - version: "1.1" - }), children); - } - var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, propTypes = { - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired, - viewBox: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({ - x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }), - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - style: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, - children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ]) - }; - Surface.propTypes = propTypes, __webpack_exports__.a = Surface; -}, function(module, exports, __webpack_require__) { - var root = __webpack_require__(31), Symbol = root.Symbol; - module.exports = Symbol; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - var __WEBPACK_IMPORTED_MODULE_0__src_path__ = __webpack_require__(633); - __webpack_require__.d(__webpack_exports__, "a", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_path__.a; - }); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function acos(x) { - return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); - } - function asin(x) { - return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); - } - __webpack_require__.d(__webpack_exports__, "a", function() { - return abs; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return atan2; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return cos; - }), __webpack_require__.d(__webpack_exports__, "h", function() { - return max; - }), __webpack_require__.d(__webpack_exports__, "i", function() { - return min; - }), __webpack_require__.d(__webpack_exports__, "k", function() { - return sin; - }), __webpack_require__.d(__webpack_exports__, "l", function() { - return sqrt; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return epsilon; - }), __webpack_require__.d(__webpack_exports__, "j", function() { - return pi; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return halfPi; - }), __webpack_require__.d(__webpack_exports__, "m", function() { - return tau; - }), __webpack_exports__.b = acos, __webpack_exports__.c = asin; - var abs = Math.abs, atan2 = Math.atan2, cos = Math.cos, max = Math.max, min = Math.min, sin = Math.sin, sqrt = Math.sqrt, epsilon = 1e-12, pi = Math.PI, halfPi = pi / 2, tau = 2 * pi; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(series, order) { - if ((n = series.length) > 1) for (var j, s0, n, i = 1, s1 = series[order[0]], m = s1.length; i < n; ++i) for (s0 = s1, - s1 = series[order[i]], j = 0; j < m; ++j) s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(series) { - for (var n = series.length, o = new Array(n); --n >= 0; ) o[n] = n; - return o; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function Cell() { - return null; - } - var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), - __webpack_require__(4)), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }; - Cell.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__.c), - Cell.displayName = "Cell", __webpack_exports__.a = Cell; -}, function(module, exports, __webpack_require__) { - function baseIteratee(value) { - return "function" == typeof value ? value : null == value ? identity : "object" == typeof value ? isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value) : property(value); - } - var baseMatches = __webpack_require__(815), baseMatchesProperty = __webpack_require__(818), identity = __webpack_require__(68), isArray = __webpack_require__(13), property = __webpack_require__(822); - module.exports = baseIteratee; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(x) { - return null === x ? NaN : +x; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function linearish(scale) { - var domain = scale.domain; - return scale.ticks = function(count) { - var d = domain(); - return Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.h)(d[0], d[d.length - 1], null == count ? 10 : count); - }, scale.tickFormat = function(count, specifier) { - return Object(__WEBPACK_IMPORTED_MODULE_3__tickFormat__.a)(domain(), count, specifier); - }, scale.nice = function(count) { - null == count && (count = 10); - var step, d = domain(), i0 = 0, i1 = d.length - 1, start = d[i0], stop = d[i1]; - return stop < start && (step = start, start = stop, stop = step, step = i0, i0 = i1, - i1 = step), step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count), - step > 0 ? (start = Math.floor(start / step) * step, stop = Math.ceil(stop / step) * step, - step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)) : step < 0 && (start = Math.ceil(start * step) / step, - stop = Math.floor(stop * step) / step, step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)), - step > 0 ? (d[i0] = Math.floor(start / step) * step, d[i1] = Math.ceil(stop / step) * step, - domain(d)) : step < 0 && (d[i0] = Math.ceil(start * step) / step, d[i1] = Math.floor(stop * step) / step, - domain(d)), scale; - }, scale; - } - function linear() { - var scale = Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.b)(__WEBPACK_IMPORTED_MODULE_2__continuous__.c, __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.c); - return scale.copy = function() { - return Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.a)(scale, linear()); - }, linearish(scale); - } - __webpack_exports__.b = linearish, __webpack_exports__.a = linear; - var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(92), __WEBPACK_IMPORTED_MODULE_2__continuous__ = __webpack_require__(137), __WEBPACK_IMPORTED_MODULE_3__tickFormat__ = __webpack_require__(883); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - var __WEBPACK_IMPORTED_MODULE_0__src_value__ = __webpack_require__(206); - __webpack_require__.d(__webpack_exports__, "a", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_value__.a; - }); - var __WEBPACK_IMPORTED_MODULE_5__src_number__ = (__webpack_require__(349), __webpack_require__(209), - __webpack_require__(347), __webpack_require__(350), __webpack_require__(136)); - __webpack_require__.d(__webpack_exports__, "c", function() { - return __WEBPACK_IMPORTED_MODULE_5__src_number__.a; - }); - var __WEBPACK_IMPORTED_MODULE_7__src_round__ = (__webpack_require__(351), __webpack_require__(873)); - __webpack_require__.d(__webpack_exports__, "d", function() { - return __WEBPACK_IMPORTED_MODULE_7__src_round__.a; - }); - var __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__ = (__webpack_require__(352), __webpack_require__(874), - __webpack_require__(877), __webpack_require__(346), __webpack_require__(878), __webpack_require__(879), - __webpack_require__(880), __webpack_require__(881)); - __webpack_require__.d(__webpack_exports__, "b", function() { - return __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__.a; - }); - __webpack_require__(882); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function linear(a, d) { - return function(t) { - return a + t * d; - }; - } - function exponential(a, b, y) { - return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { - return Math.pow(a + t * b, y); - }; - } - function hue(a, b) { - var d = b - a; - return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a); - } - function gamma(y) { - return 1 == (y = +y) ? nogamma : function(a, b) { - return b - a ? exponential(a, b, y) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a); - }; - } - function nogamma(a, b) { - var d = b - a; - return d ? linear(a, d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a); - } - __webpack_exports__.c = hue, __webpack_exports__.b = gamma, __webpack_exports__.a = nogamma; - var __WEBPACK_IMPORTED_MODULE_0__constant__ = __webpack_require__(348); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(s) { - return s.match(/.{6}/g).map(function(x) { - return "#" + x; - }); - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 + function oe(e) { + var t = e.transform, n = e.containerWidth, r = e.iconWidth, o = { + transform: "translate(".concat(n / 2, " 256)") + }, a = "translate(".concat(32 * t.x, ", ").concat(32 * t.y, ") "), i = "scale(".concat(t.size / 16 * (t.flipX ? -1 : 1), ", ").concat(t.size / 16 * (t.flipY ? -1 : 1), ") "), s = "rotate(".concat(t.rotate, " 0 0)"); + return { + outer: o, + inner: { + transform: "".concat(a, " ").concat(i, " ").concat(s) + }, + path: { + transform: "translate(".concat(r / 2 * -1, " -256)") + } + }; } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), ErrorBar = (_temp = _class = function(_Component) { - function ErrorBar() { - return _classCallCheck(this, ErrorBar), _possibleConstructorReturn(this, (ErrorBar.__proto__ || Object.getPrototypeOf(ErrorBar)).apply(this, arguments)); - } - return _inherits(ErrorBar, _Component), _createClass(ErrorBar, [ { - key: "renderErrorBars", - value: function() { - var _props = this.props, offset = _props.offset, layout = _props.layout, width = _props.width, dataKey = _props.dataKey, data = _props.data, dataPointFormatter = _props.dataPointFormatter, xAxis = _props.xAxis, yAxis = _props.yAxis, others = _objectWithoutProperties(_props, [ "offset", "layout", "width", "dataKey", "data", "dataPointFormatter", "xAxis", "yAxis" ]), props = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others); - return data.map(function(entry, i) { - var _dataPointFormatter = dataPointFormatter(entry, dataKey), x = _dataPointFormatter.x, y = _dataPointFormatter.y, value = _dataPointFormatter.value, errorVal = _dataPointFormatter.errorVal; - if (!errorVal) return null; - var xMid = void 0, yMid = void 0, xMin = void 0, yMin = void 0, xMax = void 0, yMax = void 0, scale = void 0, coordsTop = void 0, coordsMid = void 0, coordsBot = void 0, lowBound = void 0, highBound = void 0; - return Array.isArray(errorVal) ? (lowBound = errorVal[0], highBound = errorVal[1]) : (lowBound = errorVal, - highBound = errorVal), "vertical" === layout ? (scale = xAxis.scale, xMid = value, - yMid = y + offset, xMin = scale(xMid - lowBound), yMin = yMid + width, xMax = scale(xMid + highBound), - yMax = yMid - width, coordsTop = { - x1: xMax, - y1: yMin, - x2: xMax, - y2: yMax - }, coordsMid = { - x1: xMin, - y1: yMid, - x2: xMax, - y2: yMid - }, coordsBot = { - x1: xMin, - y1: yMin, - x2: xMin, - y2: yMax - }) : "horizontal" === layout && (scale = yAxis.scale, xMid = x + offset, yMid = value, - xMin = xMid - width, xMax = xMid + width, yMin = scale(yMid - lowBound), yMax = scale(yMid + highBound), - coordsTop = { - x1: xMin, - y1: yMax, - x2: xMax, - y2: yMax - }, coordsMid = { - x1: xMid, - y1: yMin, - x2: xMid, - y2: yMax - }, coordsBot = { - x1: xMin, - y1: yMin, - x2: xMax, - y2: yMin - }), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, _extends({ - className: "recharts-errorBar", - key: i - }, props), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsTop), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsMid), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsBot)); + var ae = { + x: 0, + y: 0, + width: "100%", + height: "100%" + }; + function ie(e) { + var t = e.icons, n = t.main, r = t.mask, o = e.prefix, a = e.iconName, i = e.transform, l = e.symbol, u = e.title, c = e.extra, d = e.watchable, f = void 0 !== d && d, p = r.found ? r : n, h = p.width, _ = p.height, m = "fa-w-".concat(Math.ceil(h / _ * 16)), y = [ M.replacementClass, a ? "".concat(M.familyPrefix, "-").concat(a) : "", m ].filter(function(e) { + return -1 === c.classes.indexOf(e); + }).concat(c.classes).join(" "), b = { + children: [], + attributes: s({}, c.attributes, { + "data-prefix": o, + "data-icon": a, + class: y, + role: c.attributes.role || "img", + xmlns: "http://www.w3.org/2000/svg", + viewBox: "0 0 ".concat(h, " ").concat(_) + }) + }; + f && (b.attributes[j] = ""), u && b.children.push({ + tag: "title", + attributes: { + id: b.attributes["aria-labelledby"] || "title-".concat(ee()) + }, + children: [ u ] }); + var v = s({}, b, { + prefix: o, + iconName: a, + main: n, + mask: r, + transform: i, + symbol: l, + styles: c.styles + }), g = r.found && n.found ? function(e) { + var t = e.children, n = e.attributes, r = e.main, o = e.mask, a = e.transform, i = r.width, l = r.icon, u = o.width, c = o.icon, d = oe({ + transform: a, + containerWidth: u, + iconWidth: i + }), f = { + tag: "rect", + attributes: s({}, ae, { + fill: "white" + }) + }, p = { + tag: "g", + attributes: s({}, d.inner), + children: [ { + tag: "path", + attributes: s({}, l.attributes, d.path, { + fill: "black" + }) + } ] + }, h = { + tag: "g", + attributes: s({}, d.outer), + children: [ p ] + }, _ = "mask-".concat(ee()), m = "clip-".concat(ee()), y = { + tag: "defs", + children: [ { + tag: "clipPath", + attributes: { + id: m + }, + children: [ c ] + }, { + tag: "mask", + attributes: s({}, ae, { + id: _, + maskUnits: "userSpaceOnUse", + maskContentUnits: "userSpaceOnUse" + }), + children: [ f, h ] + } ] + }; + return t.push(y, { + tag: "rect", + attributes: s({ + fill: "currentColor", + "clip-path": "url(#".concat(m, ")"), + mask: "url(#".concat(_, ")") + }, ae) + }), { + children: t, + attributes: n + }; + }(v) : function(e) { + var t = e.children, n = e.attributes, r = e.main, o = e.transform, a = ne(e.styles); + if (a.length > 0 && (n.style = a), re(o)) { + var i = oe({ + transform: o, + containerWidth: r.width, + iconWidth: r.width + }); + t.push({ + tag: "g", + attributes: s({}, i.outer), + children: [ { + tag: "g", + attributes: s({}, i.inner), + children: [ { + tag: r.icon.tag, + children: r.icon.children, + attributes: s({}, r.icon.attributes, i.path) + } ] + } ] + }); + } else t.push(r.icon); + return { + children: t, + attributes: n + }; + }(v), x = g.children, O = g.attributes; + return v.children = x, v.attributes = O, l ? function(e) { + var t = e.prefix, n = e.iconName, r = e.children, o = e.attributes, a = e.symbol; + return [ { + tag: "svg", + attributes: { + style: "display: none;" + }, + children: [ { + tag: "symbol", + attributes: s({}, o, { + id: !0 === a ? "".concat(t, "-").concat(M.familyPrefix, "-").concat(n) : a + }), + children: r + } ] + } ]; + }(v) : function(e) { + var t = e.children, n = e.main, r = e.mask, o = e.attributes, a = e.styles, i = e.transform; + if (re(i) && n.found && !r.found) { + var l = { + x: n.width / n.height / 2, + y: .5 + }; + o.style = ne(s({}, a, { + "transform-origin": "".concat(l.x + i.x / 16, "em ").concat(l.y + i.y / 16, "em") + })); + } + return [ { + tag: "svg", + attributes: o, + children: t + } ]; + }(v); } - }, { - key: "render", - value: function() { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, { - className: "recharts-errorBars" - }, this.renderErrorBars()); - } - } ]), ErrorBar; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class.propTypes = { - dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]).isRequired, - data: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, - xAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, - yAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, - layout: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - dataPointFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - stroke: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - strokeWidth: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - offset: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }, _class.defaultProps = { - stroke: "black", - strokeWidth: 1.5, - width: 5, - offset: 0, - layout: "horizontal" - }, _temp); - __webpack_exports__.a = ErrorBar; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _defineProperty(obj, key, value) { - return key in obj ? Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - } - __webpack_require__.d(__webpack_exports__, "a", function() { - return formatAxisMap; - }); - var __WEBPACK_IMPORTED_MODULE_0__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) { - var width = props.width, height = props.height, layout = props.layout, ids = Object.keys(axisMap), steps = { - left: offset.left, - leftMirror: offset.left, - right: width - offset.right, - rightMirror: width - offset.right, - top: offset.top, - topMirror: offset.top, - bottom: height - offset.bottom, - bottomMirror: height - offset.bottom - }; - return ids.reduce(function(result, id) { - var axis = axisMap[id], orientation = axis.orientation, domain = axis.domain, _axis$padding = axis.padding, padding = void 0 === _axis$padding ? {} : _axis$padding, mirror = axis.mirror, reversed = axis.reversed, offsetKey = orientation + (mirror ? "Mirror" : ""), range = void 0, x = void 0, y = void 0, needSpace = void 0; - range = "xAxis" === axisType ? [ offset.left + (padding.left || 0), offset.left + offset.width - (padding.right || 0) ] : "yAxis" === axisType ? "horizontal" === layout ? [ offset.top + offset.height - (padding.bottom || 0), offset.top + (padding.top || 0) ] : [ offset.top + (padding.top || 0), offset.top + offset.height - (padding.bottom || 0) ] : axis.range, - reversed && (range = [ range[1], range[0] ]); - var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.A)(axis, chartName), scale = _parseScale.scale, realScaleType = _parseScale.realScaleType; - scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.c)(scale); - var ticks = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.v)(scale, _extends({}, axis, { - realScaleType: realScaleType - })); - "xAxis" === axisType ? (needSpace = "top" === orientation && !mirror || "bottom" === orientation && mirror, - x = offset.left, y = steps[offsetKey] - needSpace * axis.height) : "yAxis" === axisType && (needSpace = "left" === orientation && !mirror || "right" === orientation && mirror, - x = steps[offsetKey] - needSpace * axis.width, y = offset.top); - var finalAxis = _extends({}, axis, ticks, { - realScaleType: realScaleType, - x: x, - y: y, - scale: scale, - width: "xAxis" === axisType ? offset.width : axis.width, - height: "yAxis" === axisType ? offset.height : axis.height + var se = function() {}, le = (M.measurePerformance && y && y.mark && y.measure, + function(e, t, n, r) { + var o, a, i, s = Object.keys(e), l = s.length, u = void 0 !== r ? function(e, t) { + return function(n, r, o, a) { + return e.call(t, n, r, o, a); + }; + }(t, r) : t; + for (void 0 === n ? (o = 1, i = e[s[0]]) : (o = 0, i = n); o < l; o++) i = u(i, e[a = s[o]], a, e); + return i; }); - return finalAxis.bandSize = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.g)(finalAxis, ticks), - axis.hide || "xAxis" !== axisType ? axis.hide || (steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.width) : steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.height, - _extends({}, result, _defineProperty({}, id, finalAxis)); - }, {}); - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - var emptyObject = {}; - "production" !== process.env.NODE_ENV && Object.freeze(emptyObject), module.exports = emptyObject; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - var emptyFunction = __webpack_require__(50), warning = emptyFunction; - if ("production" !== process.env.NODE_ENV) { - var printWarning = function(format) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key]; - var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() { - return args[argIndex++]; + var ue = k.styles, ce = k.shims, de = function() { + var e = function(e) { + return le(ue, function(t, n, r) { + return t[r] = le(n, e, {}), t; + }, {}); + }; + e(function(e, t, n) { + return t[3] && (e[t[3]] = n), e; + }), e(function(e, t, n) { + var r = t[2]; + return e[n] = n, r.forEach(function(t) { + e[t] = n; + }), e; }); - "undefined" != typeof console && console.error(message); - try { - throw new Error(message); - } catch (x) {} - }; - warning = function(condition, format) { - if (void 0 === format) throw new Error("` + ("`" + `warning(condition, format, ...args)`)) + ("`" + (` requires a warning message argument"); - if (0 !== format.indexOf("Failed Composite propType: ") && !condition) { - for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2]; - printWarning.apply(void 0, [ format ].concat(args)); - } + var t = "far" in ue; + le(ce, function(e, n) { + var r = n[0], o = n[1], a = n[2]; + return "far" !== o || t || (o = "fas"), e[r] = { + prefix: o, + iconName: a + }, e; + }, {}); }; - } - module.exports = warning; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - function checkDCE() { - if ("undefined" != typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE) { - if ("production" !== process.env.NODE_ENV) throw new Error("^_^"); - try { - __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); - } catch (err) { - console.error(err); - } - } - } - "production" === process.env.NODE_ENV ? (checkDCE(), module.exports = __webpack_require__(378)) : module.exports = __webpack_require__(381); - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - function is(x, y) { - return x === y ? 0 !== x || 0 !== y || 1 / x == 1 / y : x !== x && y !== y; - } - function shallowEqual(objA, objB) { - if (is(objA, objB)) return !0; - if ("object" != typeof objA || null === objA || "object" != typeof objB || null === objB) return !1; - var keysA = Object.keys(objA), keysB = Object.keys(objB); - if (keysA.length !== keysB.length) return !1; - for (var i = 0; i < keysA.length; i++) if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) return !1; - return !0; - } - var hasOwnProperty = Object.prototype.hasOwnProperty; - module.exports = shallowEqual; -}, function(module, exports, __webpack_require__) { - var toInteger = __webpack_require__(149), min = Math.min; - module.exports = function(it) { - return it > 0 ? min(toInteger(it), 9007199254740991) : 0; - }; -}, function(module, exports) { - module.exports = !0; -}, function(module, exports) { - var id = 0, px = Math.random(); - module.exports = function(key) { - return "Symbol(".concat(void 0 === key ? "" : key, ")_", (++id + px).toString(36)); - }; -}, function(module, exports) { - exports.f = {}.propertyIsEnumerable; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - exports.__esModule = !0; - var _iterator = __webpack_require__(396), _iterator2 = _interopRequireDefault(_iterator), _symbol = __webpack_require__(404), _symbol2 = _interopRequireDefault(_symbol), _typeof = "function" == typeof _symbol2.default && "symbol" == typeof _iterator2.default ? function(obj) { - return typeof obj; - } : function(obj) { - return obj && "function" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; - }; - exports.default = "function" == typeof _symbol2.default && "symbol" === _typeof(_iterator2.default) ? function(obj) { - return void 0 === obj ? "undefined" : _typeof(obj); - } : function(obj) { - return obj && "function" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : void 0 === obj ? "undefined" : _typeof(obj); - }; -}, function(module, exports, __webpack_require__) { - var anObject = __webpack_require__(52), dPs = __webpack_require__(400), enumBugKeys = __webpack_require__(152), IE_PROTO = __webpack_require__(150)("IE_PROTO"), Empty = function() {}, createDict = function() { - var iframeDocument, iframe = __webpack_require__(225)("iframe"), i = enumBugKeys.length; - for (iframe.style.display = "none", __webpack_require__(401).appendChild(iframe), - iframe.src = "javascript:", iframeDocument = iframe.contentWindow.document, iframeDocument.open(), - iframeDocument.write("\n if (val === '') return true;\n if (val === 'false') return false;\n if (val === 'true') return true;\n return val;\n}\n\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n var attrs = [['data-family-prefix', 'familyPrefix'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-mutate-approach', 'mutateApproach'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n attrs.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n attr = _ref2[0],\n key = _ref2[1];\n\n var val = coerce(getAttrConfig(attr));\n\n if (val !== undefined && val !== null) {\n initial[key] = val;\n }\n });\n}\n\nvar _default = {\n familyPrefix: DEFAULT_FAMILY_PREFIX,\n replacementClass: DEFAULT_REPLACEMENT_CLASS,\n autoReplaceSvg: true,\n autoAddCss: true,\n autoA11y: true,\n searchPseudoElements: false,\n observeMutations: true,\n mutateApproach: 'async',\n keepOriginalSource: true,\n measurePerformance: false,\n showMissingIcons: true\n};\n\nvar _config = _objectSpread({}, _default, initial);\n\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\n\nvar config = _objectSpread({}, _config);\n\nWINDOW.FontAwesomeConfig = config;\n\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\n\nvar functions = [];\n\nvar listener = function listener() {\n DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n loaded = 1;\n functions.map(function (fn) {\n return fn();\n });\n};\n\nvar loaded = false;\n\nif (IS_DOM) {\n loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\n\nfunction domready (fn) {\n if (!IS_DOM) return;\n loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nvar PENDING = 'pending';\nvar SETTLED = 'settled';\nvar FULFILLED = 'fulfilled';\nvar REJECTED = 'rejected';\n\nvar NOOP = function NOOP() {};\n\nvar isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';\nvar asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;\nvar asyncQueue = [];\nvar asyncTimer;\n\nfunction asyncFlush() {\n // run promise callbacks\n for (var i = 0; i < asyncQueue.length; i++) {\n asyncQueue[i][0](asyncQueue[i][1]);\n } // reset async asyncQueue\n\n\n asyncQueue = [];\n asyncTimer = false;\n}\n\nfunction asyncCall(callback, arg) {\n asyncQueue.push([callback, arg]);\n\n if (!asyncTimer) {\n asyncTimer = true;\n asyncSetTimer(asyncFlush, 0);\n }\n}\n\nfunction invokeResolver(resolver, promise) {\n function resolvePromise(value) {\n resolve(promise, value);\n }\n\n function rejectPromise(reason) {\n reject(promise, reason);\n }\n\n try {\n resolver(resolvePromise, rejectPromise);\n } catch (e) {\n rejectPromise(e);\n }\n}\n\nfunction invokeCallback(subscriber) {\n var owner = subscriber.owner;\n var settled = owner._state;\n var value = owner._data;\n var callback = subscriber[settled];\n var promise = subscriber.then;\n\n if (typeof callback === 'function') {\n settled = FULFILLED;\n\n try {\n value = callback(value);\n } catch (e) {\n reject(promise, e);\n }\n }\n\n if (!handleThenable(promise, value)) {\n if (settled === FULFILLED) {\n resolve(promise, value);\n }\n\n if (settled === REJECTED) {\n reject(promise, value);\n }\n }\n}\n\nfunction handleThenable(promise, value) {\n var resolved;\n\n try {\n if (promise === value) {\n throw new TypeError('A promises callback cannot return that same promise.');\n }\n\n if (value && (typeof value === 'function' || _typeof(value) === 'object')) {\n // then should be retrieved only once\n var then = value.then;\n\n if (typeof then === 'function') {\n then.call(value, function (val) {\n if (!resolved) {\n resolved = true;\n\n if (value === val) {\n fulfill(promise, val);\n } else {\n resolve(promise, val);\n }\n }\n }, function (reason) {\n if (!resolved) {\n resolved = true;\n reject(promise, reason);\n }\n });\n return true;\n }\n }\n } catch (e) {\n if (!resolved) {\n reject(promise, e);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction resolve(promise, value) {\n if (promise === value || !handleThenable(promise, value)) {\n fulfill(promise, value);\n }\n}\n\nfunction fulfill(promise, value) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = value;\n asyncCall(publishFulfillment, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = reason;\n asyncCall(publishRejection, promise);\n }\n}\n\nfunction publish(promise) {\n promise._then = promise._then.forEach(invokeCallback);\n}\n\nfunction publishFulfillment(promise) {\n promise._state = FULFILLED;\n publish(promise);\n}\n\nfunction publishRejection(promise) {\n promise._state = REJECTED;\n publish(promise);\n\n if (!promise._handled && isNode) {\n global.process.emit('unhandledRejection', promise._data, promise);\n }\n}\n\nfunction notifyRejectionHandled(promise) {\n global.process.emit('rejectionHandled', promise);\n}\n/**\n * @class\n */\n\n\nfunction P(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('Promise resolver ' + resolver + ' is not a function');\n }\n\n if (this instanceof P === false) {\n throw new TypeError('Failed to construct \\'Promise\\': Please use the \\'new\\' operator, this object constructor cannot be called as a function.');\n }\n\n this._then = [];\n invokeResolver(resolver, this);\n}\n\nP.prototype = {\n constructor: P,\n _state: PENDING,\n _then: null,\n _data: undefined,\n _handled: false,\n then: function then(onFulfillment, onRejection) {\n var subscriber = {\n owner: this,\n then: new this.constructor(NOOP),\n fulfilled: onFulfillment,\n rejected: onRejection\n };\n\n if ((onRejection || onFulfillment) && !this._handled) {\n this._handled = true;\n\n if (this._state === REJECTED && isNode) {\n asyncCall(notifyRejectionHandled, this);\n }\n }\n\n if (this._state === FULFILLED || this._state === REJECTED) {\n // already resolved, call callback async\n asyncCall(invokeCallback, subscriber);\n } else {\n // subscribe\n this._then.push(subscriber);\n }\n\n return subscriber.then;\n },\n catch: function _catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nP.all = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.all().');\n }\n\n return new P(function (resolve, reject) {\n var results = [];\n var remaining = 0;\n\n function resolver(index) {\n remaining++;\n return function (value) {\n results[index] = value;\n\n if (! --remaining) {\n resolve(results);\n }\n };\n }\n\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolver(i), reject);\n } else {\n results[i] = promise;\n }\n }\n\n if (!remaining) {\n resolve(results);\n }\n });\n};\n\nP.race = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.race().');\n }\n\n return new P(function (resolve, reject) {\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolve, reject);\n } else {\n resolve(promise);\n }\n }\n });\n};\n\nP.resolve = function (value) {\n if (value && _typeof(value) === 'object' && value.constructor === P) {\n return value;\n }\n\n return new P(function (resolve) {\n resolve(value);\n });\n};\n\nP.reject = function (reason) {\n return new P(function (resolve, reject) {\n reject(reason);\n });\n};\n\nvar picked = typeof Promise === 'function' ? Promise : P;\n\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n size: 16,\n x: 0,\n y: 0,\n rotate: 0,\n flipX: false,\n flipY: false\n};\n\nfunction isReserved(name) {\n return ~RESERVED_CLASSES.indexOf(name);\n}\nfunction insertCss(css) {\n if (!css || !IS_DOM) {\n return;\n }\n\n var style = DOCUMENT.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n var headChildren = DOCUMENT.head.childNodes;\n var beforeChild = null;\n\n for (var i = headChildren.length - 1; i > -1; i--) {\n var child = headChildren[i];\n var tagName = (child.tagName || '').toUpperCase();\n\n if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n beforeChild = child;\n }\n }\n\n DOCUMENT.head.insertBefore(style, beforeChild);\n return css;\n}\nvar idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n var size = 12;\n var id = '';\n\n while (size-- > 0) {\n id += idPool[Math.random() * 62 | 0];\n }\n\n return id;\n}\nfunction toArray(obj) {\n var array = [];\n\n for (var i = (obj || []).length >>> 0; i--;) {\n array[i] = obj[i];\n }\n\n return array;\n}\nfunction classArray(node) {\n if (node.classList) {\n return toArray(node.classList);\n } else {\n return (node.getAttribute('class') || '').split(' ').filter(function (i) {\n return i;\n });\n }\n}\nfunction getIconName(familyPrefix, cls) {\n var parts = cls.split('-');\n var prefix = parts[0];\n var iconName = parts.slice(1).join('-');\n\n if (prefix === familyPrefix && iconName !== '' && !isReserved(iconName)) {\n return iconName;\n } else {\n return null;\n }\n}\nfunction htmlEscape(str) {\n return \"\".concat(str).replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>');\n}\nfunction joinAttributes(attributes) {\n return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n }, '').trim();\n}\nfunction joinStyles(styles) {\n return Object.keys(styles || {}).reduce(function (acc, styleName) {\n return acc + \"\".concat(styleName, \": \").concat(styles[styleName], \";\");\n }, '');\n}\nfunction transformIsMeaningful(transform) {\n return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n var transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n };\n var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n var inner = {\n transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n };\n var path = {\n transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n };\n return {\n outer: outer,\n inner: inner,\n path: path\n };\n}\nfunction transformForCss(_ref2) {\n var transform = _ref2.transform,\n _ref2$width = _ref2.width,\n width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n _ref2$height = _ref2.height,\n height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n _ref2$startCentered = _ref2.startCentered,\n startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n var val = '';\n\n if (startCentered && IS_IE) {\n val += \"translate(\".concat(transform.x / d - width / 2, \"em, \").concat(transform.y / d - height / 2, \"em) \");\n } else if (startCentered) {\n val += \"translate(calc(-50% + \".concat(transform.x / d, \"em), calc(-50% + \").concat(transform.y / d, \"em)) \");\n } else {\n val += \"translate(\".concat(transform.x / d, \"em, \").concat(transform.y / d, \"em) \");\n }\n\n val += \"scale(\".concat(transform.size / d * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d * (transform.flipY ? -1 : 1), \") \");\n val += \"rotate(\".concat(transform.rotate, \"deg) \");\n return val;\n}\n\nvar ALL_SPACE = {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%'\n};\nfunction makeIconMasking (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n mask = _ref.mask,\n transform = _ref.transform;\n var mainWidth = main.width,\n mainPath = main.icon;\n var maskWidth = mask.width,\n maskPath = mask.icon;\n var trans = transformForSvg({\n transform: transform,\n containerWidth: maskWidth,\n iconWidth: mainWidth\n });\n var maskRect = {\n tag: 'rect',\n attributes: _objectSpread({}, ALL_SPACE, {\n fill: 'white'\n })\n };\n var maskInnerGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: 'path',\n attributes: _objectSpread({}, mainPath.attributes, trans.path, {\n fill: 'black'\n })\n }]\n };\n var maskOuterGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [maskInnerGroup]\n };\n var maskId = \"mask-\".concat(nextUniqueId());\n var clipId = \"clip-\".concat(nextUniqueId());\n var maskTag = {\n tag: 'mask',\n attributes: _objectSpread({}, ALL_SPACE, {\n id: maskId,\n maskUnits: 'userSpaceOnUse',\n maskContentUnits: 'userSpaceOnUse'\n }),\n children: [maskRect, maskOuterGroup]\n };\n var defs = {\n tag: 'defs',\n children: [{\n tag: 'clipPath',\n attributes: {\n id: clipId\n },\n children: [maskPath]\n }, maskTag]\n };\n children.push(defs, {\n tag: 'rect',\n attributes: _objectSpread({\n fill: 'currentColor',\n 'clip-path': \"url(#\".concat(clipId, \")\"),\n mask: \"url(#\".concat(maskId, \")\")\n }, ALL_SPACE)\n });\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction makeIconStandard (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n transform = _ref.transform,\n styles = _ref.styles;\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n if (transformIsMeaningful(transform)) {\n var trans = transformForSvg({\n transform: transform,\n containerWidth: main.width,\n iconWidth: main.width\n });\n children.push({\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [{\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: main.icon.tag,\n children: main.icon.children,\n attributes: _objectSpread({}, main.icon.attributes, trans.path)\n }]\n }]\n });\n } else {\n children.push(main.icon);\n }\n\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction asIcon (_ref) {\n var children = _ref.children,\n main = _ref.main,\n mask = _ref.mask,\n attributes = _ref.attributes,\n styles = _ref.styles,\n transform = _ref.transform;\n\n if (transformIsMeaningful(transform) && main.found && !mask.found) {\n var width = main.width,\n height = main.height;\n var offset = {\n x: width / height / 2,\n y: 0.5\n };\n attributes['style'] = joinStyles(_objectSpread({}, styles, {\n 'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n }));\n }\n\n return [{\n tag: 'svg',\n attributes: attributes,\n children: children\n }];\n}\n\nfunction asSymbol (_ref) {\n var prefix = _ref.prefix,\n iconName = _ref.iconName,\n children = _ref.children,\n attributes = _ref.attributes,\n symbol = _ref.symbol;\n var id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.familyPrefix, \"-\").concat(iconName) : symbol;\n return [{\n tag: 'svg',\n attributes: {\n style: 'display: none;'\n },\n children: [{\n tag: 'symbol',\n attributes: _objectSpread({}, attributes, {\n id: id\n }),\n children: children\n }]\n }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n var _params$icons = params.icons,\n main = _params$icons.main,\n mask = _params$icons.mask,\n prefix = params.prefix,\n iconName = params.iconName,\n transform = params.transform,\n symbol = params.symbol,\n title = params.title,\n extra = params.extra,\n _params$watchable = params.watchable,\n watchable = _params$watchable === void 0 ? false : _params$watchable;\n\n var _ref = mask.found ? mask : main,\n width = _ref.width,\n height = _ref.height;\n\n var widthClass = \"fa-w-\".concat(Math.ceil(width / height * 16));\n var attrClass = [config.replacementClass, iconName ? \"\".concat(config.familyPrefix, \"-\").concat(iconName) : '', widthClass].filter(function (c) {\n return extra.classes.indexOf(c) === -1;\n }).concat(extra.classes).join(' ');\n var content = {\n children: [],\n attributes: _objectSpread({}, extra.attributes, {\n 'data-prefix': prefix,\n 'data-icon': iconName,\n 'class': attrClass,\n 'role': extra.attributes.role || 'img',\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n })\n };\n\n if (watchable) {\n content.attributes[DATA_FA_I2SVG] = '';\n }\n\n if (title) content.children.push({\n tag: 'title',\n attributes: {\n id: content.attributes['aria-labelledby'] || \"title-\".concat(nextUniqueId())\n },\n children: [title]\n });\n\n var args = _objectSpread({}, content, {\n prefix: prefix,\n iconName: iconName,\n main: main,\n mask: mask,\n transform: transform,\n symbol: symbol,\n styles: extra.styles\n });\n\n var _ref2 = mask.found && main.found ? makeIconMasking(args) : makeIconStandard(args),\n children = _ref2.children,\n attributes = _ref2.attributes;\n\n args.children = children;\n args.attributes = attributes;\n\n if (symbol) {\n return asSymbol(args);\n } else {\n return asIcon(args);\n }\n}\nfunction makeLayersTextAbstract(params) {\n var content = params.content,\n width = params.width,\n height = params.height,\n transform = params.transform,\n title = params.title,\n extra = params.extra,\n _params$watchable2 = params.watchable,\n watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n if (watchable) {\n attributes[DATA_FA_I2SVG] = '';\n }\n\n var styles = _objectSpread({}, extra.styles);\n\n if (transformIsMeaningful(transform)) {\n styles['transform'] = transformForCss({\n transform: transform,\n startCentered: true,\n width: width,\n height: height\n });\n styles['-webkit-transform'] = styles['transform'];\n }\n\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\nfunction makeLayersCounterAbstract(params) {\n var content = params.content,\n title = params.title,\n extra = params.extra;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n var styleString = joinStyles(extra.styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\n\nvar noop$1 = function noop() {};\n\nvar p = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n mark: noop$1,\n measure: noop$1\n};\nvar preamble = \"FA \\\"5.9.0\\\"\";\n\nvar begin = function begin(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n return function () {\n return end(name);\n };\n};\n\nvar end = function end(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n p.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\n\nvar perf = {\n begin: begin,\n end: end\n};\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n return function (a, b, c, d) {\n return func.call(thisContext, a, b, c, d);\n };\n};\n\n/**\n * # Reduce\n *\n * A fast object ` + ("`" + `.reduce()`)) + ("`" + (` implementation.\n *\n * @param {Object} subject The object to reduce over.\n * @param {Function} fn The reducer function.\n * @param {mixed} initialValue The initial value for the reducer, defaults to subject[0].\n * @param {Object} thisContext The context for the reducer.\n * @return {mixed} The final result.\n */\n\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n var keys = Object.keys(subject),\n length = keys.length,\n iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n i,\n key,\n result;\n\n if (initialValue === undefined) {\n i = 1;\n result = subject[keys[0]];\n } else {\n i = 0;\n result = initialValue;\n }\n\n for (; i < length; i++) {\n key = keys[i];\n result = iterator(result, subject[key], key, subject);\n }\n\n return result;\n};\n\nfunction toHex(unicode) {\n var result = '';\n\n for (var i = 0; i < unicode.length; i++) {\n var hex = unicode.charCodeAt(i).toString(16);\n result += ('000' + hex).slice(-4);\n }\n\n return result;\n}\n\nfunction defineIcons(prefix, icons) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _params$skipHooks = params.skipHooks,\n skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n var normalized = Object.keys(icons).reduce(function (acc, iconName) {\n var icon = icons[iconName];\n var expanded = !!icon.icon;\n\n if (expanded) {\n acc[icon.iconName] = icon.icon;\n } else {\n acc[iconName] = icon;\n }\n\n return acc;\n }, {});\n\n if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n namespace.hooks.addPack(prefix, normalized);\n } else {\n namespace.styles[prefix] = _objectSpread({}, namespace.styles[prefix] || {}, normalized);\n }\n /**\n * Font Awesome 4 used the prefix of ` + "`"))) + ((`fa` + ("`" + ` for all icons. With the introduction\n * of new styles we needed to differentiate between them. Prefix `)) + ("`" + (`fa` + "`")))) + (((` is now an alias\n * for ` + ("`" + `fas`)) + ("`" + (` so we'll easy the upgrade process for our users by automatically defining\n * this as well.\n */\n\n\n if (prefix === 'fas') {\n defineIcons('fa', icons);\n }\n}\n\nvar styles = namespace.styles,\n shims = namespace.shims;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar build = function build() {\n var lookup = function lookup(reducer) {\n return reduce(styles, function (o, style, prefix) {\n o[prefix] = reduce(style, reducer, {});\n return o;\n }, {});\n };\n\n _byUnicode = lookup(function (acc, icon, iconName) {\n if (icon[3]) {\n acc[icon[3]] = iconName;\n }\n\n return acc;\n });\n _byLigature = lookup(function (acc, icon, iconName) {\n var ligatures = icon[2];\n acc[iconName] = iconName;\n ligatures.forEach(function (ligature) {\n acc[ligature] = iconName;\n });\n return acc;\n });\n var hasRegular = 'far' in styles;\n _byOldName = reduce(shims, function (acc, shim) {\n var oldName = shim[0];\n var prefix = shim[1];\n var iconName = shim[2];\n\n if (prefix === 'far' && !hasRegular) {\n prefix = 'fas';\n }\n\n acc[oldName] = {\n prefix: prefix,\n iconName: iconName\n };\n return acc;\n }, {});\n};\nbuild();\nfunction byUnicode(prefix, unicode) {\n return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n return (_byLigature[prefix] || {})[ligature];\n}\nfunction byOldName(name) {\n return _byOldName[name] || {\n prefix: null,\n iconName: null\n };\n}\n\nvar styles$1 = namespace.styles;\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n return {\n prefix: null,\n iconName: null,\n rest: []\n };\n};\nfunction getCanonicalIcon(values) {\n return values.reduce(function (acc, cls) {\n var iconName = getIconName(config.familyPrefix, cls);\n\n if (styles$1[cls]) {\n acc.prefix = cls;\n } else if (config.autoFetchSvg && ['fas', 'far', 'fal', 'fab', 'fa'].indexOf(cls) > -1) {\n acc.prefix = cls;\n } else if (iconName) {\n var shim = acc.prefix === 'fa' ? byOldName(iconName) : {};\n acc.iconName = shim.iconName || iconName;\n acc.prefix = shim.prefix || acc.prefix;\n } else if (cls !== config.replacementClass && cls.indexOf('fa-w-') !== 0) {\n acc.rest.push(cls);\n }\n\n return acc;\n }, emptyCanonicalIcon());\n}\nfunction iconFromMapping(mapping, prefix, iconName) {\n if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n return {\n prefix: prefix,\n iconName: iconName,\n icon: mapping[prefix][iconName]\n };\n }\n}\n\nfunction toHtml(abstractNodes) {\n var tag = abstractNodes.tag,\n _abstractNodes$attrib = abstractNodes.attributes,\n attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n _abstractNodes$childr = abstractNodes.children,\n children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n\n if (typeof abstractNodes === 'string') {\n return htmlEscape(abstractNodes);\n } else {\n return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"\");\n }\n}\n\nvar noop$2 = function noop() {};\n\nfunction isWatched(node) {\n var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n return typeof i2svg === 'string';\n}\n\nfunction getMutator() {\n if (config.autoReplaceSvg === true) {\n return mutators.replace;\n }\n\n var mutator = mutators[config.autoReplaceSvg];\n return mutator || mutators.replace;\n}\n\nvar mutators = {\n replace: function replace(mutation) {\n var node = mutation[0];\n var abstract = mutation[1];\n var newOuterHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n\n if (node.parentNode && node.outerHTML) {\n node.outerHTML = newOuterHTML + (config.keepOriginalSource && node.tagName.toLowerCase() !== 'svg' ? \"\") : '');\n } else if (node.parentNode) {\n var newNode = document.createElement('span');\n node.parentNode.replaceChild(newNode, node);\n newNode.outerHTML = newOuterHTML;\n }\n },\n nest: function nest(mutation) {\n var node = mutation[0];\n var abstract = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n // Short-circuit to the standard replacement\n\n if (~classArray(node).indexOf(config.replacementClass)) {\n return mutators.replace(mutation);\n }\n\n var forSvg = new RegExp(\"\".concat(config.familyPrefix, \"-.*\"));\n delete abstract[0].attributes.style;\n var splitClasses = abstract[0].attributes.class.split(' ').reduce(function (acc, cls) {\n if (cls === config.replacementClass || cls.match(forSvg)) {\n acc.toSvg.push(cls);\n } else {\n acc.toNode.push(cls);\n }\n\n return acc;\n }, {\n toNode: [],\n toSvg: []\n });\n abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n var newInnerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.setAttribute('class', splitClasses.toNode.join(' '));\n node.setAttribute(DATA_FA_I2SVG, '');\n node.innerHTML = newInnerHTML;\n }\n};\n\nfunction performOperationSync(op) {\n op();\n}\n\nfunction perform(mutations, callback) {\n var callbackFunction = typeof callback === 'function' ? callback : noop$2;\n\n if (mutations.length === 0) {\n callbackFunction();\n } else {\n var frame = performOperationSync;\n\n if (config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n frame = WINDOW.requestAnimationFrame || performOperationSync;\n }\n\n frame(function () {\n var mutator = getMutator();\n var mark = perf.begin('mutate');\n mutations.map(mutator);\n mark();\n callbackFunction();\n });\n }\n}\nvar disabled = false;\nfunction disableObservation() {\n disabled = true;\n}\nfunction enableObservation() {\n disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n if (!MUTATION_OBSERVER) {\n return;\n }\n\n if (!config.observeMutations) {\n return;\n }\n\n var treeCallback = options.treeCallback,\n nodeCallback = options.nodeCallback,\n pseudoElementsCallback = options.pseudoElementsCallback,\n _options$observeMutat = options.observeMutationsRoot,\n observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n mo = new MUTATION_OBSERVER(function (objects) {\n if (disabled) return;\n toArray(objects).forEach(function (mutationRecord) {\n if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n if (config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target);\n }\n\n treeCallback(mutationRecord.target);\n }\n\n if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target.parentNode);\n }\n\n if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n if (mutationRecord.attributeName === 'class') {\n var _getCanonicalIcon = getCanonicalIcon(classArray(mutationRecord.target)),\n prefix = _getCanonicalIcon.prefix,\n iconName = _getCanonicalIcon.iconName;\n\n if (prefix) mutationRecord.target.setAttribute('data-prefix', prefix);\n if (iconName) mutationRecord.target.setAttribute('data-icon', iconName);\n } else {\n nodeCallback(mutationRecord.target);\n }\n }\n });\n });\n if (!IS_DOM) return;\n mo.observe(observeMutationsRoot, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true\n });\n}\nfunction disconnect() {\n if (!mo) return;\n mo.disconnect();\n}\n\nfunction styleParser (node) {\n var style = node.getAttribute('style');\n var val = [];\n\n if (style) {\n val = style.split(';').reduce(function (acc, style) {\n var styles = style.split(':');\n var prop = styles[0];\n var value = styles.slice(1);\n\n if (prop && value.length > 0) {\n acc[prop] = value.join(':').trim();\n }\n\n return acc;\n }, {});\n }\n\n return val;\n}\n\nfunction classParser (node) {\n var existingPrefix = node.getAttribute('data-prefix');\n var existingIconName = node.getAttribute('data-icon');\n var innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n var val = getCanonicalIcon(classArray(node));\n\n if (existingPrefix && existingIconName) {\n val.prefix = existingPrefix;\n val.iconName = existingIconName;\n }\n\n if (val.prefix && innerText.length > 1) {\n val.iconName = byLigature(val.prefix, node.innerText);\n } else if (val.prefix && innerText.length === 1) {\n val.iconName = byUnicode(val.prefix, toHex(node.innerText));\n }\n\n return val;\n}\n\nvar parseTransformString = function parseTransformString(transformString) {\n var transform = {\n size: 16,\n x: 0,\n y: 0,\n flipX: false,\n flipY: false,\n rotate: 0\n };\n\n if (!transformString) {\n return transform;\n } else {\n return transformString.toLowerCase().split(' ').reduce(function (acc, n) {\n var parts = n.toLowerCase().split('-');\n var first = parts[0];\n var rest = parts.slice(1).join('-');\n\n if (first && rest === 'h') {\n acc.flipX = true;\n return acc;\n }\n\n if (first && rest === 'v') {\n acc.flipY = true;\n return acc;\n }\n\n rest = parseFloat(rest);\n\n if (isNaN(rest)) {\n return acc;\n }\n\n switch (first) {\n case 'grow':\n acc.size = acc.size + rest;\n break;\n\n case 'shrink':\n acc.size = acc.size - rest;\n break;\n\n case 'left':\n acc.x = acc.x - rest;\n break;\n\n case 'right':\n acc.x = acc.x + rest;\n break;\n\n case 'up':\n acc.y = acc.y - rest;\n break;\n\n case 'down':\n acc.y = acc.y + rest;\n break;\n\n case 'rotate':\n acc.rotate = acc.rotate + rest;\n break;\n }\n\n return acc;\n }, transform);\n }\n};\nfunction transformParser (node) {\n return parseTransformString(node.getAttribute('data-fa-transform'));\n}\n\nfunction symbolParser (node) {\n var symbol = node.getAttribute('data-fa-symbol');\n return symbol === null ? false : symbol === '' ? true : symbol;\n}\n\nfunction attributesParser (node) {\n var extraAttributes = toArray(node.attributes).reduce(function (acc, attr) {\n if (acc.name !== 'class' && acc.name !== 'style') {\n acc[attr.name] = attr.value;\n }\n\n return acc;\n }, {});\n var title = node.getAttribute('title');\n\n if (config.autoA11y) {\n if (title) {\n extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(nextUniqueId());\n } else {\n extraAttributes['aria-hidden'] = 'true';\n extraAttributes['focusable'] = 'false';\n }\n }\n\n return extraAttributes;\n}\n\nfunction maskParser (node) {\n var mask = node.getAttribute('data-fa-mask');\n\n if (!mask) {\n return emptyCanonicalIcon();\n } else {\n return getCanonicalIcon(mask.split(' ').map(function (i) {\n return i.trim();\n }));\n }\n}\n\nfunction blankMeta() {\n return {\n iconName: null,\n title: null,\n prefix: null,\n transform: meaninglessTransform,\n symbol: false,\n mask: null,\n extra: {\n classes: [],\n styles: {},\n attributes: {}\n }\n };\n}\nfunction parseMeta(node) {\n var _classParser = classParser(node),\n iconName = _classParser.iconName,\n prefix = _classParser.prefix,\n extraClasses = _classParser.rest;\n\n var extraStyles = styleParser(node);\n var transform = transformParser(node);\n var symbol = symbolParser(node);\n var extraAttributes = attributesParser(node);\n var mask = maskParser(node);\n return {\n iconName: iconName,\n title: node.getAttribute('title'),\n prefix: prefix,\n transform: transform,\n symbol: symbol,\n mask: mask,\n extra: {\n classes: extraClasses,\n styles: extraStyles,\n attributes: extraAttributes\n }\n };\n}\n\nfunction MissingIcon(error) {\n this.name = 'MissingIcon';\n this.message = error || 'Icon unavailable';\n this.stack = new Error().stack;\n}\nMissingIcon.prototype = Object.create(Error.prototype);\nMissingIcon.prototype.constructor = MissingIcon;\n\nvar FILL = {\n fill: 'currentColor'\n};\nvar ANIMATION_BASE = {\n attributeType: 'XML',\n repeatCount: 'indefinite',\n dur: '2s'\n};\nvar RING = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n })\n};\n\nvar OPACITY_ANIMATE = _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'opacity'\n});\n\nvar DOT = {\n tag: 'circle',\n attributes: _objectSpread({}, FILL, {\n cx: '256',\n cy: '364',\n r: '28'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'r',\n values: '28;14;28;28;14;28;'\n })\n }, {\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;1;1;0;1;'\n })\n }]\n};\nvar QUESTION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '1',\n d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;0;0;0;1;'\n })\n }]\n};\nvar EXCLAMATION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '0',\n d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '0;0;1;1;0;0;'\n })\n }]\n};\nvar missing = {\n tag: 'g',\n children: [RING, DOT, QUESTION, EXCLAMATION]\n};\n\nvar styles$2 = namespace.styles;\nfunction findIcon(iconName, prefix) {\n return new picked(function (resolve, reject) {\n var val = {\n found: false,\n width: 512,\n height: 512,\n icon: missing\n };\n\n if (iconName && prefix && styles$2[prefix] && styles$2[prefix][iconName]) {\n var icon = styles$2[prefix][iconName];\n var width = icon[0];\n var height = icon[1];\n var vectorData = icon.slice(4);\n val = {\n found: true,\n width: width,\n height: height,\n icon: {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData[0]\n }\n }\n };\n return resolve(val);\n }\n\n if (iconName && prefix && !config.showMissingIcons) {\n reject(new MissingIcon(\"Icon is missing for prefix \".concat(prefix, \" with icon name \").concat(iconName)));\n } else {\n resolve(val);\n }\n });\n}\n\nvar styles$3 = namespace.styles;\n\nfunction generateSvgReplacementMutation(node, nodeMeta) {\n var iconName = nodeMeta.iconName,\n title = nodeMeta.title,\n prefix = nodeMeta.prefix,\n transform = nodeMeta.transform,\n symbol = nodeMeta.symbol,\n mask = nodeMeta.mask,\n extra = nodeMeta.extra;\n return new picked(function (resolve, reject) {\n picked.all([findIcon(iconName, prefix), findIcon(mask.iconName, mask.prefix)]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n main = _ref2[0],\n mask = _ref2[1];\n\n resolve([node, makeInlineSvgAbstract({\n icons: {\n main: main,\n mask: mask\n },\n prefix: prefix,\n iconName: iconName,\n transform: transform,\n symbol: symbol,\n mask: mask,\n title: title,\n extra: extra,\n watchable: true\n })]);\n });\n });\n}\n\nfunction generateLayersText(node, nodeMeta) {\n var title = nodeMeta.title,\n transform = nodeMeta.transform,\n extra = nodeMeta.extra;\n var width = null;\n var height = null;\n\n if (IS_IE) {\n var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n var boundingClientRect = node.getBoundingClientRect();\n width = boundingClientRect.width / computedFontSize;\n height = boundingClientRect.height / computedFontSize;\n }\n\n if (config.autoA11y && !title) {\n extra.attributes['aria-hidden'] = 'true';\n }\n\n return picked.resolve([node, makeLayersTextAbstract({\n content: node.innerHTML,\n width: width,\n height: height,\n transform: transform,\n title: title,\n extra: extra,\n watchable: true\n })]);\n}\n\nfunction generateMutation(node) {\n var nodeMeta = parseMeta(node);\n\n if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n return generateLayersText(node, nodeMeta);\n } else {\n return generateSvgReplacementMutation(node, nodeMeta);\n }\n}\n\nfunction onTree(root) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!IS_DOM) return;\n var htmlClassList = DOCUMENT.documentElement.classList;\n\n var hclAdd = function hclAdd(suffix) {\n return htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var hclRemove = function hclRemove(suffix) {\n return htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var prefixes = config.autoFetchSvg ? Object.keys(PREFIX_TO_STYLE) : Object.keys(styles$3);\n var prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(function (p) {\n return \".\".concat(p, \":not([\").concat(DATA_FA_I2SVG, \"])\");\n })).join(', ');\n\n if (prefixesDomQuery.length === 0) {\n return;\n }\n\n var candidates = [];\n\n try {\n candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n } catch (e) {// noop\n }\n\n if (candidates.length > 0) {\n hclAdd('pending');\n hclRemove('complete');\n } else {\n return;\n }\n\n var mark = perf.begin('onTree');\n var mutations = candidates.reduce(function (acc, node) {\n try {\n var mutation = generateMutation(node);\n\n if (mutation) {\n acc.push(mutation);\n }\n } catch (e) {\n if (!PRODUCTION) {\n if (e instanceof MissingIcon) {\n console.error(e);\n }\n }\n }\n\n return acc;\n }, []);\n return new picked(function (resolve, reject) {\n picked.all(mutations).then(function (resolvedMutations) {\n perform(resolvedMutations, function () {\n hclAdd('active');\n hclAdd('complete');\n hclRemove('pending');\n if (typeof callback === 'function') callback();\n mark();\n resolve();\n });\n }).catch(function () {\n mark();\n reject();\n });\n });\n}\nfunction onNode(node) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n generateMutation(node).then(function (mutation) {\n if (mutation) {\n perform([mutation], callback);\n }\n });\n}\n\nfunction replaceForPosition(node, position) {\n var pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n return new picked(function (resolve, reject) {\n if (node.getAttribute(pendingAttribute) !== null) {\n // This node is already being processed\n return resolve();\n }\n\n var children = toArray(node.children);\n var alreadyProcessedPseudoElement = children.filter(function (c) {\n return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n })[0];\n var styles = WINDOW.getComputedStyle(node, position);\n var fontFamily = styles.getPropertyValue('font-family').match(FONT_FAMILY_PATTERN);\n var fontWeight = styles.getPropertyValue('font-weight');\n\n if (alreadyProcessedPseudoElement && !fontFamily) {\n // If we've already processed it but the current computed style does not result in a font-family,\n // that probably means that a class name that was previously present to make the icon has been\n // removed. So we now should delete the icon.\n node.removeChild(alreadyProcessedPseudoElement);\n return resolve();\n } else if (fontFamily) {\n var content = styles.getPropertyValue('content');\n var prefix = ~['Light', 'Regular', 'Solid', 'Brands'].indexOf(fontFamily[1]) ? STYLE_TO_PREFIX[fontFamily[1].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[fontWeight];\n var hexValue = toHex(content.length === 3 ? content.substr(1, 1) : content);\n var iconName = byUnicode(prefix, hexValue);\n var iconIdentifier = iconName; // Only convert the pseudo element in this :before/:after position into an icon if we haven't\n // already done so with the same prefix and iconName\n\n if (iconName && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n node.setAttribute(pendingAttribute, iconIdentifier);\n\n if (alreadyProcessedPseudoElement) {\n // Delete the old one, since we're replacing it with a new one\n node.removeChild(alreadyProcessedPseudoElement);\n }\n\n var meta = blankMeta();\n var extra = meta.extra;\n extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n findIcon(iconName, prefix).then(function (main) {\n var abstract = makeInlineSvgAbstract(_objectSpread({}, meta, {\n icons: {\n main: main,\n mask: emptyCanonicalIcon()\n },\n prefix: prefix,\n iconName: iconIdentifier,\n extra: extra,\n watchable: true\n }));\n var element = DOCUMENT.createElement('svg');\n\n if (position === ':before') {\n node.insertBefore(element, node.firstChild);\n } else {\n node.appendChild(element);\n }\n\n element.outerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.removeAttribute(pendingAttribute);\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n } else {\n resolve();\n }\n });\n}\n\nfunction replace(node) {\n return picked.all([replaceForPosition(node, ':before'), replaceForPosition(node, ':after')]);\n}\n\nfunction processable(node) {\n return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\n\nfunction searchPseudoElements (root) {\n if (!IS_DOM) return;\n return new picked(function (resolve, reject) {\n var operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n var end = perf.begin('searchPseudoElements');\n disableObservation();\n picked.all(operations).then(function () {\n end();\n enableObservation();\n resolve();\n }).catch(function () {\n end();\n enableObservation();\n reject();\n });\n });\n}\n\nvar baseStyles = \"svg:not(:root).svg-inline--fa {\\n overflow: visible;\\n}\\n\\n.svg-inline--fa {\\n display: inline-block;\\n font-size: inherit;\\n height: 1em;\\n overflow: visible;\\n vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-lg {\\n vertical-align: -0.225em;\\n}\\n.svg-inline--fa.fa-w-1 {\\n width: 0.0625em;\\n}\\n.svg-inline--fa.fa-w-2 {\\n width: 0.125em;\\n}\\n.svg-inline--fa.fa-w-3 {\\n width: 0.1875em;\\n}\\n.svg-inline--fa.fa-w-4 {\\n width: 0.25em;\\n}\\n.svg-inline--fa.fa-w-5 {\\n width: 0.3125em;\\n}\\n.svg-inline--fa.fa-w-6 {\\n width: 0.375em;\\n}\\n.svg-inline--fa.fa-w-7 {\\n width: 0.4375em;\\n}\\n.svg-inline--fa.fa-w-8 {\\n width: 0.5em;\\n}\\n.svg-inline--fa.fa-w-9 {\\n width: 0.5625em;\\n}\\n.svg-inline--fa.fa-w-10 {\\n width: 0.625em;\\n}\\n.svg-inline--fa.fa-w-11 {\\n width: 0.6875em;\\n}\\n.svg-inline--fa.fa-w-12 {\\n width: 0.75em;\\n}\\n.svg-inline--fa.fa-w-13 {\\n width: 0.8125em;\\n}\\n.svg-inline--fa.fa-w-14 {\\n width: 0.875em;\\n}\\n.svg-inline--fa.fa-w-15 {\\n width: 0.9375em;\\n}\\n.svg-inline--fa.fa-w-16 {\\n width: 1em;\\n}\\n.svg-inline--fa.fa-w-17 {\\n width: 1.0625em;\\n}\\n.svg-inline--fa.fa-w-18 {\\n width: 1.125em;\\n}\\n.svg-inline--fa.fa-w-19 {\\n width: 1.1875em;\\n}\\n.svg-inline--fa.fa-w-20 {\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n margin-right: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n margin-left: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-border {\\n height: 1.5em;\\n}\\n.svg-inline--fa.fa-li {\\n width: 2em;\\n}\\n.svg-inline--fa.fa-fw {\\n width: 1.25em;\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.fa-layers {\\n display: inline-block;\\n height: 1em;\\n position: relative;\\n text-align: center;\\n vertical-align: -0.125em;\\n width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.fa-layers-text {\\n left: 50%;\\n top: 50%;\\n -webkit-transform: translate(-50%, -50%);\\n transform: translate(-50%, -50%);\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n background-color: #ff253a;\\n border-radius: 1em;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #fff;\\n height: 1.5em;\\n line-height: 1;\\n max-width: 5em;\\n min-width: 1.5em;\\n overflow: hidden;\\n padding: 0.25em;\\n right: 0;\\n text-overflow: ellipsis;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n bottom: 0;\\n right: 0;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom right;\\n transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n bottom: 0;\\n left: 0;\\n right: auto;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom left;\\n transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n right: 0;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n left: 0;\\n right: auto;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top left;\\n transform-origin: top left;\\n}\\n\\n.fa-lg {\\n font-size: 1.3333333333em;\\n line-height: 0.75em;\\n vertical-align: -0.0667em;\\n}\\n\\n.fa-xs {\\n font-size: 0.75em;\\n}\\n\\n.fa-sm {\\n font-size: 0.875em;\\n}\\n\\n.fa-1x {\\n font-size: 1em;\\n}\\n\\n.fa-2x {\\n font-size: 2em;\\n}\\n\\n.fa-3x {\\n font-size: 3em;\\n}\\n\\n.fa-4x {\\n font-size: 4em;\\n}\\n\\n.fa-5x {\\n font-size: 5em;\\n}\\n\\n.fa-6x {\\n font-size: 6em;\\n}\\n\\n.fa-7x {\\n font-size: 7em;\\n}\\n\\n.fa-8x {\\n font-size: 8em;\\n}\\n\\n.fa-9x {\\n font-size: 9em;\\n}\\n\\n.fa-10x {\\n font-size: 10em;\\n}\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em;\\n}\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: 2.5em;\\n padding-left: 0;\\n}\\n.fa-ul > li {\\n position: relative;\\n}\\n\\n.fa-li {\\n left: -2em;\\n position: absolute;\\n text-align: center;\\n width: 2em;\\n line-height: inherit;\\n}\\n\\n.fa-border {\\n border: solid 0.08em #eee;\\n border-radius: 0.1em;\\n padding: 0.2em 0.25em 0.15em;\\n}\\n\\n.fa-pull-left {\\n float: left;\\n}\\n\\n.fa-pull-right {\\n float: right;\\n}\\n\\n.fa.fa-pull-left,\\n.fas.fa-pull-left,\\n.far.fa-pull-left,\\n.fal.fa-pull-left,\\n.fab.fa-pull-left {\\n margin-right: 0.3em;\\n}\\n.fa.fa-pull-right,\\n.fas.fa-pull-right,\\n.far.fa-pull-right,\\n.fal.fa-pull-right,\\n.fab.fa-pull-right {\\n margin-left: 0.3em;\\n}\\n\\n.fa-spin {\\n -webkit-animation: fa-spin 2s infinite linear;\\n animation: fa-spin 2s infinite linear;\\n}\\n\\n.fa-pulse {\\n -webkit-animation: fa-spin 1s infinite steps(8);\\n animation: fa-spin 1s infinite steps(8);\\n}\\n\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n.fa-rotate-90 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1);\\n}\\n\\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1);\\n}\\n\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical,\\n:root .fa-flip-both {\\n -webkit-filter: none;\\n filter: none;\\n}\\n\\n.fa-stack {\\n display: inline-block;\\n height: 2em;\\n position: relative;\\n width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n height: 1em;\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n height: 2em;\\n width: 2.5em;\\n}\\n\\n.fa-inverse {\\n color: #fff;\\n}\\n\\n.sr-only {\\n border: 0;\\n clip: rect(0, 0, 0, 0);\\n height: 1px;\\n margin: -1px;\\n overflow: hidden;\\n padding: 0;\\n position: absolute;\\n width: 1px;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n clip: auto;\\n height: auto;\\n margin: 0;\\n overflow: visible;\\n position: static;\\n width: auto;\\n}\";\n\nfunction css () {\n var dfp = DEFAULT_FAMILY_PREFIX;\n var drc = DEFAULT_REPLACEMENT_CLASS;\n var fp = config.familyPrefix;\n var rc = config.replacementClass;\n var s = baseStyles;\n\n if (fp !== dfp || rc !== drc) {\n var dPatt = new RegExp(\"\\\\.\".concat(dfp, \"\\\\-\"), 'g');\n var rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n }\n\n return s;\n}\n\nvar Library =\n/*#__PURE__*/\nfunction () {\n function Library() {\n _classCallCheck(this, Library);\n\n this.definitions = {};\n }\n\n _createClass(Library, [{\n key: \"add\",\n value: function add() {\n var _this = this;\n\n for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n definitions[_key] = arguments[_key];\n }\n\n var additions = definitions.reduce(this._pullDefinitions, {});\n Object.keys(additions).forEach(function (key) {\n _this.definitions[key] = _objectSpread({}, _this.definitions[key] || {}, additions[key]);\n defineIcons(key, additions[key]);\n build();\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.definitions = {};\n }\n }, {\n key: \"_pullDefinitions\",\n value: function _pullDefinitions(additions, definition) {\n var normalized = definition.prefix && definition.iconName && definition.icon ? {\n 0: definition\n } : definition;\n Object.keys(normalized).map(function (key) {\n var _normalized$key = normalized[key],\n prefix = _normalized$key.prefix,\n iconName = _normalized$key.iconName,\n icon = _normalized$key.icon;\n if (!additions[prefix]) additions[prefix] = {};\n additions[prefix][iconName] = icon;\n });\n return additions;\n }\n }]);\n\n return Library;\n}();\n\nfunction prepIcon(icon) {\n var width = icon[0];\n var height = icon[1];\n var vectorData = icon.slice(4);\n return {\n found: true,\n width: width,\n height: height,\n icon: {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData[0]\n }\n }\n };\n}\n\nfunction ensureCss() {\n if (config.autoAddCss && !_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n}\n\nfunction apiObject(val, abstractCreator) {\n Object.defineProperty(val, 'abstract', {\n get: abstractCreator\n });\n Object.defineProperty(val, 'html', {\n get: function get() {\n return val.abstract.map(function (a) {\n return toHtml(a);\n });\n }\n });\n Object.defineProperty(val, 'node', {\n get: function get() {\n if (!IS_DOM) return;\n var container = DOCUMENT.createElement('div');\n container.innerHTML = val.html;\n return container.children;\n }\n });\n return val;\n}\n\nfunction findIconDefinition(iconLookup) {\n var _iconLookup$prefix = iconLookup.prefix,\n prefix = _iconLookup$prefix === void 0 ? 'fa' : _iconLookup$prefix,\n iconName = iconLookup.iconName;\n if (!iconName) return;\n return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\n\nfunction resolveIcons(next) {\n return function (maybeIconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n var mask = params.mask;\n\n if (mask) {\n mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n }\n\n return next(iconDefinition, _objectSpread({}, params, {\n mask: mask\n }));\n };\n}\n\nvar library = new Library();\nvar noAuto = function noAuto() {\n config.autoReplaceSvg = false;\n config.observeMutations = false;\n disconnect();\n};\nvar _cssInserted = false;\nvar dom = {\n i2svg: function i2svg() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (IS_DOM) {\n ensureCss();\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node,\n _params$callback = params.callback,\n callback = _params$callback === void 0 ? function () {} : _params$callback;\n\n if (config.searchPseudoElements) {\n searchPseudoElements(node);\n }\n\n return onTree(node, callback);\n } else {\n return picked.reject('Operation requires a DOM of some kind.');\n }\n },\n css: css,\n insertCss: function insertCss$$1() {\n if (!_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n },\n watch: function watch() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var autoReplaceSvgRoot = params.autoReplaceSvgRoot,\n observeMutationsRoot = params.observeMutationsRoot;\n\n if (config.autoReplaceSvg === false) {\n config.autoReplaceSvg = true;\n }\n\n config.observeMutations = true;\n domready(function () {\n autoReplace({\n autoReplaceSvgRoot: autoReplaceSvgRoot\n });\n observe({\n treeCallback: onTree,\n nodeCallback: onNode,\n pseudoElementsCallback: searchPseudoElements,\n observeMutationsRoot: observeMutationsRoot\n });\n });\n }\n};\nvar parse = {\n transform: function transform(transformString) {\n return parseTransformString(transformString);\n }\n};\nvar icon = resolveIcons(function (iconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$symbol = params.symbol,\n symbol = _params$symbol === void 0 ? false : _params$symbol,\n _params$mask = params.mask,\n mask = _params$mask === void 0 ? null : _params$mask,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n if (!iconDefinition) return;\n var prefix = iconDefinition.prefix,\n iconName = iconDefinition.iconName,\n icon = iconDefinition.icon;\n return apiObject(_objectSpread({\n type: 'icon'\n }, iconDefinition), function () {\n ensureCss();\n\n if (config.autoA11y) {\n if (title) {\n attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(nextUniqueId());\n } else {\n attributes['aria-hidden'] = 'true';\n attributes['focusable'] = 'false';\n }\n }\n\n return makeInlineSvgAbstract({\n icons: {\n main: prepIcon(icon),\n mask: mask ? prepIcon(mask.icon) : {\n found: false,\n width: null,\n height: null,\n icon: {}\n }\n },\n prefix: prefix,\n iconName: iconName,\n transform: _objectSpread({}, meaninglessTransform, transform),\n symbol: symbol,\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: classes\n }\n });\n });\n});\nvar text = function text(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform2 = params.transform,\n transform = _params$transform2 === void 0 ? meaninglessTransform : _params$transform2,\n _params$title2 = params.title,\n title = _params$title2 === void 0 ? null : _params$title2,\n _params$classes2 = params.classes,\n classes = _params$classes2 === void 0 ? [] : _params$classes2,\n _params$attributes2 = params.attributes,\n attributes = _params$attributes2 === void 0 ? {} : _params$attributes2,\n _params$styles2 = params.styles,\n styles = _params$styles2 === void 0 ? {} : _params$styles2;\n return apiObject({\n type: 'text',\n content: content\n }, function () {\n ensureCss();\n return makeLayersTextAbstract({\n content: content,\n transform: _objectSpread({}, meaninglessTransform, transform),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-text\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar counter = function counter(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$title3 = params.title,\n title = _params$title3 === void 0 ? null : _params$title3,\n _params$classes3 = params.classes,\n classes = _params$classes3 === void 0 ? [] : _params$classes3,\n _params$attributes3 = params.attributes,\n attributes = _params$attributes3 === void 0 ? {} : _params$attributes3,\n _params$styles3 = params.styles,\n styles = _params$styles3 === void 0 ? {} : _params$styles3;\n return apiObject({\n type: 'counter',\n content: content\n }, function () {\n ensureCss();\n return makeLayersCounterAbstract({\n content: content.toString(),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-counter\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar layer = function layer(assembler) {\n return apiObject({\n type: 'layer'\n }, function () {\n ensureCss();\n var children = [];\n assembler(function (args) {\n Array.isArray(args) ? args.map(function (a) {\n children = children.concat(a.abstract);\n }) : children = children.concat(args.abstract);\n });\n return [{\n tag: 'span',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-layers\")\n },\n children: children\n }];\n });\n};\nvar api = {\n noAuto: noAuto,\n config: config,\n dom: dom,\n library: library,\n parse: parse,\n findIconDefinition: findIconDefinition,\n icon: icon,\n text: text,\n counter: counter,\n layer: layer,\n toHtml: toHtml\n};\n\nvar autoReplace = function autoReplace() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n node: autoReplaceSvgRoot\n });\n};\n\nexport { icon, noAuto, config, toHtml, layer, text, counter, library, dom, parse, findIconDefinition };\n", + "var prefix = \"far\";\nvar faAddressBook = {\n prefix: 'far',\n iconName: 'address-book',\n icon: [448, 512, [], \"f2b9\", \"M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-68 304H48V48h320v416zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faAddressCard = {\n prefix: 'far',\n iconName: 'address-card',\n icon: [576, 512, [], \"f2bb\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H48V80h480v352zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2zM360 320h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8z\"]\n};\nvar faAngry = {\n prefix: 'far',\n iconName: 'angry',\n icon: [496, 512, [], \"f556\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-144c-33.6 0-65.2 14.8-86.8 40.6-8.5 10.2-7.1 25.3 3.1 33.8s25.3 7.2 33.8-3c24.8-29.7 75-29.7 99.8 0 8.1 9.7 23.2 11.9 33.8 3 10.2-8.5 11.5-23.6 3.1-33.8-21.6-25.8-53.2-40.6-86.8-40.6zm-48-72c10.3 0 19.9-6.7 23-17.1 3.8-12.7-3.4-26.1-16.1-29.9l-80-24c-12.8-3.9-26.1 3.4-29.9 16.1-3.8 12.7 3.4 26.1 16.1 29.9l28.2 8.5c-3.1 4.9-5.3 10.4-5.3 16.6 0 17.7 14.3 32 32 32s32-14.4 32-32.1zm199-54.9c-3.8-12.7-17.1-19.9-29.9-16.1l-80 24c-12.7 3.8-19.9 17.2-16.1 29.9 3.1 10.4 12.7 17.1 23 17.1 0 17.7 14.3 32 32 32s32-14.3 32-32c0-6.2-2.2-11.7-5.3-16.6l28.2-8.5c12.7-3.7 19.9-17.1 16.1-29.8z\"]\n};\nvar faArrowAltCircleDown = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-down',\n icon: [512, 512, [], \"f358\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z\"]\n};\nvar faArrowAltCircleLeft = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-left',\n icon: [512, 512, [], \"f359\", \"M8 256c0 137 111 248 248 248s248-111 248-248S393 8 256 8 8 119 8 256zm448 0c0 110.5-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56s200 89.5 200 200zm-72-20v40c0 6.6-5.4 12-12 12H256v67c0 10.7-12.9 16-20.5 8.5l-99-99c-4.7-4.7-4.7-12.3 0-17l99-99c7.6-7.6 20.5-2.2 20.5 8.5v67h116c6.6 0 12 5.4 12 12z\"]\n};\nvar faArrowAltCircleRight = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-right',\n icon: [512, 512, [], \"f35a\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"]\n};\nvar faArrowAltCircleUp = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-up',\n icon: [512, 512, [], \"f35b\", \"M256 504c137 0 248-111 248-248S393 8 256 8 8 119 8 256s111 248 248 248zm0-448c110.5 0 200 89.5 200 200s-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56zm20 328h-40c-6.6 0-12-5.4-12-12V256h-67c-10.7 0-16-12.9-8.5-20.5l99-99c4.7-4.7 12.3-4.7 17 0l99 99c7.6 7.6 2.2 20.5-8.5 20.5h-67v116c0 6.6-5.4 12-12 12z\"]\n};\nvar faBell = {\n prefix: 'far',\n iconName: 'bell',\n icon: [448, 512, [], \"f0f3\", \"M439.39 362.29c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71zM67.53 368c21.22-27.97 44.42-74.33 44.53-159.42 0-.2-.06-.38-.06-.58 0-61.86 50.14-112 112-112s112 50.14 112 112c0 .2-.06.38-.06.58.11 85.1 23.31 131.46 44.53 159.42H67.53zM224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBellSlash = {\n prefix: 'far',\n iconName: 'bell-slash',\n icon: [640, 512, [], \"f1f6\", \"M633.99 471.02L36 3.51C29.1-2.01 19.03-.9 13.51 6l-10 12.49C-2.02 25.39-.9 35.46 6 40.98l598 467.51c6.9 5.52 16.96 4.4 22.49-2.49l10-12.49c5.52-6.9 4.41-16.97-2.5-22.49zM163.53 368c16.71-22.03 34.48-55.8 41.4-110.58l-45.47-35.55c-3.27 90.73-36.47 120.68-54.84 140.42-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h279.66l-61.4-48H163.53zM320 96c61.86 0 112 50.14 112 112 0 .2-.06.38-.06.58.02 16.84 1.16 31.77 2.79 45.73l59.53 46.54c-8.31-22.13-14.34-51.49-14.34-92.85 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84c-26.02 5.41-49.45 16.94-69.13 32.72l38.17 29.84C275 103.18 296.65 96 320 96zm0 416c35.32 0 63.97-28.65 63.97-64H256.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBookmark = {\n prefix: 'far',\n iconName: 'bookmark',\n icon: [384, 512, [], \"f02e\", \"M336 0H48C21.49 0 0 21.49 0 48v464l192-112 192 112V48c0-26.51-21.49-48-48-48zm0 428.43l-144-84-144 84V54a6 6 0 0 1 6-6h276c3.314 0 6 2.683 6 5.996V428.43z\"]\n};\nvar faBuilding = {\n prefix: 'far',\n iconName: 'building',\n icon: [448, 512, [], \"f1ad\", \"M128 148v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12zm140 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-128 96h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm128 0h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-76 84v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm76 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm180 124v36H0v-36c0-6.6 5.4-12 12-12h19.5V24c0-13.3 10.7-24 24-24h337c13.3 0 24 10.7 24 24v440H436c6.6 0 12 5.4 12 12zM79.5 463H192v-67c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v67h112.5V49L80 48l-.5 415z\"]\n};\nvar faCalendar = {\n prefix: 'far',\n iconName: 'calendar',\n icon: [448, 512, [], \"f133\", \"M400 64h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V160h352v298c0 3.3-2.7 6-6 6z\"]\n};\nvar faCalendarAlt = {\n prefix: 'far',\n iconName: 'calendar-alt',\n icon: [448, 512, [], \"f073\", \"M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarCheck = {\n prefix: 'far',\n iconName: 'calendar-check',\n icon: [448, 512, [], \"f274\", \"M400 64h-48V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H160V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V160h352v298a6 6 0 0 1-6 6zm-52.849-200.65L198.842 404.519c-4.705 4.667-12.303 4.637-16.971-.068l-75.091-75.699c-4.667-4.705-4.637-12.303.068-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l44.104 44.461 111.072-110.181c4.705-4.667 12.303-4.637 16.971.068l22.536 22.718c4.667 4.705 4.636 12.303-.069 16.97z\"]\n};\nvar faCalendarMinus = {\n prefix: 'far',\n iconName: 'calendar-minus',\n icon: [448, 512, [], \"f272\", \"M124 328c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v24c0 6.6-5.4 12-12 12H124zm324-216v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarPlus = {\n prefix: 'far',\n iconName: 'calendar-plus',\n icon: [448, 512, [], \"f271\", \"M336 292v24c0 6.6-5.4 12-12 12h-76v76c0 6.6-5.4 12-12 12h-24c-6.6 0-12-5.4-12-12v-76h-76c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h76v-76c0-6.6 5.4-12 12-12h24c6.6 0 12 5.4 12 12v76h76c6.6 0 12 5.4 12 12zm112-180v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarTimes = {\n prefix: 'far',\n iconName: 'calendar-times',\n icon: [448, 512, [], \"f273\", \"M311.7 374.7l-17 17c-4.7 4.7-12.3 4.7-17 0L224 337.9l-53.7 53.7c-4.7 4.7-12.3 4.7-17 0l-17-17c-4.7-4.7-4.7-12.3 0-17l53.7-53.7-53.7-53.7c-4.7-4.7-4.7-12.3 0-17l17-17c4.7-4.7 12.3-4.7 17 0l53.7 53.7 53.7-53.7c4.7-4.7 12.3-4.7 17 0l17 17c4.7 4.7 4.7 12.3 0 17L257.9 304l53.7 53.7c4.8 4.7 4.8 12.3.1 17zM448 112v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareDown = {\n prefix: 'far',\n iconName: 'caret-square-down',\n icon: [448, 512, [], \"f150\", \"M125.1 208h197.8c10.7 0 16.1 13 8.5 20.5l-98.9 98.3c-4.7 4.7-12.2 4.7-16.9 0l-98.9-98.3c-7.7-7.5-2.3-20.5 8.4-20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareLeft = {\n prefix: 'far',\n iconName: 'caret-square-left',\n icon: [448, 512, [], \"f191\", \"M272 157.1v197.8c0 10.7-13 16.1-20.5 8.5l-98.3-98.9c-4.7-4.7-4.7-12.2 0-16.9l98.3-98.9c7.5-7.7 20.5-2.3 20.5 8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareRight = {\n prefix: 'far',\n iconName: 'caret-square-right',\n icon: [448, 512, [], \"f152\", \"M176 354.9V157.1c0-10.7 13-16.1 20.5-8.5l98.3 98.9c4.7 4.7 4.7 12.2 0 16.9l-98.3 98.9c-7.5 7.7-20.5 2.3-20.5-8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareUp = {\n prefix: 'far',\n iconName: 'caret-square-up',\n icon: [448, 512, [], \"f151\", \"M322.9 304H125.1c-10.7 0-16.1-13-8.5-20.5l98.9-98.3c4.7-4.7 12.2-4.7 16.9 0l98.9 98.3c7.7 7.5 2.3 20.5-8.4 20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faChartBar = {\n prefix: 'far',\n iconName: 'chart-bar',\n icon: [512, 512, [], \"f080\", \"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\"]\n};\nvar faCheckCircle = {\n prefix: 'far',\n iconName: 'check-circle',\n icon: [512, 512, [], \"f058\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 48c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m140.204 130.267l-22.536-22.718c-4.667-4.705-12.265-4.736-16.97-.068L215.346 303.697l-59.792-60.277c-4.667-4.705-12.265-4.736-16.97-.069l-22.719 22.536c-4.705 4.667-4.736 12.265-.068 16.971l90.781 91.516c4.667 4.705 12.265 4.736 16.97.068l172.589-171.204c4.704-4.668 4.734-12.266.067-16.971z\"]\n};\nvar faCheckSquare = {\n prefix: 'far',\n iconName: 'check-square',\n icon: [448, 512, [], \"f14a\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm0 400H48V80h352v352zm-35.864-241.724L191.547 361.48c-4.705 4.667-12.303 4.637-16.97-.068l-90.781-91.516c-4.667-4.705-4.637-12.303.069-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l59.792 60.277 141.352-140.216c4.705-4.667 12.303-4.637 16.97.068l22.536 22.718c4.667 4.706 4.637 12.304-.068 16.971z\"]\n};\nvar faCircle = {\n prefix: 'far',\n iconName: 'circle',\n icon: [512, 512, [], \"f111\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200z\"]\n};\nvar faClipboard = {\n prefix: 'far',\n iconName: 'clipboard',\n icon: [384, 512, [], \"f328\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm144 418c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h42v36c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-36h42c3.3 0 6 2.7 6 6z\"]\n};\nvar faClock = {\n prefix: 'far',\n iconName: 'clock',\n icon: [512, 512, [], \"f017\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm61.8-104.4l-84.9-61.7c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v141.7l66.8 48.6c5.4 3.9 6.5 11.4 2.6 16.8L334.6 349c-3.9 5.3-11.4 6.5-16.8 2.6z\"]\n};\nvar faClone = {\n prefix: 'far',\n iconName: 'clone',\n icon: [512, 512, [], \"f24d\", \"M464 0H144c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h320c26.51 0 48-21.49 48-48v-48h48c26.51 0 48-21.49 48-48V48c0-26.51-21.49-48-48-48zM362 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h42v224c0 26.51 21.49 48 48 48h224v42a6 6 0 0 1-6 6zm96-96H150a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h308a6 6 0 0 1 6 6v308a6 6 0 0 1-6 6z\"]\n};\nvar faClosedCaptioning = {\n prefix: 'far',\n iconName: 'closed-captioning',\n icon: [512, 512, [], \"f20a\", \"M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 336H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v276c0 3.3-2.7 6-6 6zm-211.1-85.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7zm190.4 0c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.9-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 220.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7z\"]\n};\nvar faComment = {\n prefix: 'far',\n iconName: 'comment',\n icon: [512, 512, [], \"f075\", \"M256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faCommentAlt = {\n prefix: 'far',\n iconName: 'comment-alt',\n icon: [512, 512, [], \"f27a\", \"M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 7.1 5.8 12 12 12 2.4 0 4.9-.7 7.1-2.4L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zm16 352c0 8.8-7.2 16-16 16H288l-12.8 9.6L208 428v-60H64c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16h384c8.8 0 16 7.2 16 16v288z\"]\n};\nvar faCommentDots = {\n prefix: 'far',\n iconName: 'comment-dots',\n icon: [512, 512, [], \"f4ad\", \"M144 208c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zM256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faComments = {\n prefix: 'far',\n iconName: 'comments',\n icon: [576, 512, [], \"f086\", \"M532 386.2c27.5-27.1 44-61.1 44-98.2 0-80-76.5-146.1-176.2-157.9C368.3 72.5 294.3 32 208 32 93.1 32 0 103.6 0 192c0 37 16.5 71 44 98.2-15.3 30.7-37.3 54.5-37.7 54.9-6.3 6.7-8.1 16.5-4.4 25 3.6 8.5 12 14 21.2 14 53.5 0 96.7-20.2 125.2-38.8 9.2 2.1 18.7 3.7 28.4 4.9C208.1 407.6 281.8 448 368 448c20.8 0 40.8-2.4 59.8-6.8C456.3 459.7 499.4 480 553 480c9.2 0 17.5-5.5 21.2-14 3.6-8.5 1.9-18.3-4.4-25-.4-.3-22.5-24.1-37.8-54.8zm-392.8-92.3L122.1 305c-14.1 9.1-28.5 16.3-43.1 21.4 2.7-4.7 5.4-9.7 8-14.8l15.5-31.1L77.7 256C64.2 242.6 48 220.7 48 192c0-60.7 73.3-112 160-112s160 51.3 160 112-73.3 112-160 112c-16.5 0-33-1.9-49-5.6l-19.8-4.5zM498.3 352l-24.7 24.4 15.5 31.1c2.6 5.1 5.3 10.1 8 14.8-14.6-5.1-29-12.3-43.1-21.4l-17.1-11.1-19.9 4.6c-16 3.7-32.5 5.6-49 5.6-54 0-102.2-20.1-131.3-49.7C338 339.5 416 272.9 416 192c0-3.4-.4-6.7-.7-10C479.7 196.5 528 238.8 528 288c0 28.7-16.2 50.6-29.7 64z\"]\n};\nvar faCompass = {\n prefix: 'far',\n iconName: 'compass',\n icon: [496, 512, [], \"f14e\", \"M347.94 129.86L203.6 195.83a31.938 31.938 0 0 0-15.77 15.77l-65.97 144.34c-7.61 16.65 9.54 33.81 26.2 26.2l144.34-65.97a31.938 31.938 0 0 0 15.77-15.77l65.97-144.34c7.61-16.66-9.54-33.81-26.2-26.2zm-77.36 148.72c-12.47 12.47-32.69 12.47-45.16 0-12.47-12.47-12.47-32.69 0-45.16 12.47-12.47 32.69-12.47 45.16 0 12.47 12.47 12.47 32.69 0 45.16zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faCopy = {\n prefix: 'far',\n iconName: 'copy',\n icon: [448, 512, [], \"f0c5\", \"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"]\n};\nvar faCopyright = {\n prefix: 'far',\n iconName: 'copyright',\n icon: [512, 512, [], \"f1f9\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm107.351-101.064c-9.614 9.712-45.53 41.396-104.065 41.396-82.43 0-140.484-61.425-140.484-141.567 0-79.152 60.275-139.401 139.762-139.401 55.531 0 88.738 26.62 97.593 34.779a11.965 11.965 0 0 1 1.936 15.322l-18.155 28.113c-3.841 5.95-11.966 7.282-17.499 2.921-8.595-6.776-31.814-22.538-61.708-22.538-48.303 0-77.916 35.33-77.916 80.082 0 41.589 26.888 83.692 78.277 83.692 32.657 0 56.843-19.039 65.726-27.225 5.27-4.857 13.596-4.039 17.82 1.738l19.865 27.17a11.947 11.947 0 0 1-1.152 15.518z\"]\n};\nvar faCreditCard = {\n prefix: 'far',\n iconName: 'credit-card',\n icon: [576, 512, [], \"f09d\", \"M527.9 32H48.1C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48.1 48h479.8c26.6 0 48.1-21.5 48.1-48V80c0-26.5-21.5-48-48.1-48zM54.1 80h467.8c3.3 0 6 2.7 6 6v42H48.1V86c0-3.3 2.7-6 6-6zm467.8 352H54.1c-3.3 0-6-2.7-6-6V256h479.8v170c0 3.3-2.7 6-6 6zM192 332v40c0 6.6-5.4 12-12 12h-72c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h72c6.6 0 12 5.4 12 12zm192 0v40c0 6.6-5.4 12-12 12H236c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h136c6.6 0 12 5.4 12 12z\"]\n};\nvar faDizzy = {\n prefix: 'far',\n iconName: 'dizzy',\n icon: [496, 512, [], \"f567\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-33.8-217.9c7.8-7.8 7.8-20.5 0-28.3L196.3 192l17.9-17.9c7.8-7.8 7.8-20.5 0-28.3-7.8-7.8-20.5-7.8-28.3 0L168 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.9 7.7 20.5 7.7 28.4-.2zm160-92.2c-7.8-7.8-20.5-7.8-28.3 0L328 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.8 7.8 20.5 7.8 28.3 0 7.8-7.8 7.8-20.5 0-28.3l-17.8-18 17.9-17.9c7.7-7.8 7.7-20.4 0-28.2zM248 272c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64z\"]\n};\nvar faDotCircle = {\n prefix: 'far',\n iconName: 'dot-circle',\n icon: [512, 512, [], \"f192\", \"M256 56c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m0-48C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 168c-44.183 0-80 35.817-80 80s35.817 80 80 80 80-35.817 80-80-35.817-80-80-80z\"]\n};\nvar faEdit = {\n prefix: 'far',\n iconName: 'edit',\n icon: [576, 512, [], \"f044\", \"M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z\"]\n};\nvar faEnvelope = {\n prefix: 'far',\n iconName: 'envelope',\n icon: [512, 512, [], \"f0e0\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z\"]\n};\nvar faEnvelopeOpen = {\n prefix: 'far',\n iconName: 'envelope-open',\n icon: [512, 512, [], \"f2b6\", \"M494.586 164.516c-4.697-3.883-111.723-89.95-135.251-108.657C337.231 38.191 299.437 0 256 0c-43.205 0-80.636 37.717-103.335 55.859-24.463 19.45-131.07 105.195-135.15 108.549A48.004 48.004 0 0 0 0 201.485V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V201.509a48 48 0 0 0-17.414-36.993zM464 458a6 6 0 0 1-6 6H54a6 6 0 0 1-6-6V204.347c0-1.813.816-3.526 2.226-4.665 15.87-12.814 108.793-87.554 132.364-106.293C200.755 78.88 232.398 48 256 48c23.693 0 55.857 31.369 73.41 45.389 23.573 18.741 116.503 93.493 132.366 106.316a5.99 5.99 0 0 1 2.224 4.663V458zm-31.991-187.704c4.249 5.159 3.465 12.795-1.745 16.981-28.975 23.283-59.274 47.597-70.929 56.863C336.636 362.283 299.205 400 256 400c-43.452 0-81.287-38.237-103.335-55.86-11.279-8.967-41.744-33.413-70.927-56.865-5.21-4.187-5.993-11.822-1.745-16.981l15.258-18.528c4.178-5.073 11.657-5.843 16.779-1.726 28.618 23.001 58.566 47.035 70.56 56.571C200.143 320.631 232.307 352 256 352c23.602 0 55.246-30.88 73.41-45.389 11.994-9.535 41.944-33.57 70.563-56.568 5.122-4.116 12.601-3.346 16.778 1.727l15.258 18.526z\"]\n};\nvar faEye = {\n prefix: 'far',\n iconName: 'eye',\n icon: [576, 512, [], \"f06e\", \"M288 144a110.94 110.94 0 0 0-31.24 5 55.4 55.4 0 0 1 7.24 27 56 56 0 0 1-56 56 55.4 55.4 0 0 1-27-7.24A111.71 111.71 0 1 0 288 144zm284.52 97.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400c-98.65 0-189.09-55-237.93-144C98.91 167 189.34 112 288 112s189.09 55 237.93 144C477.1 345 386.66 400 288 400z\"]\n};\nvar faEyeSlash = {\n prefix: 'far',\n iconName: 'eye-slash',\n icon: [640, 512, [], \"f070\", \"M634 471L36 3.51A16 16 0 0 0 13.51 6l-10 12.49A16 16 0 0 0 6 41l598 467.49a16 16 0 0 0 22.49-2.49l10-12.49A16 16 0 0 0 634 471zM296.79 146.47l134.79 105.38C429.36 191.91 380.48 144 320 144a112.26 112.26 0 0 0-23.21 2.47zm46.42 219.07L208.42 260.16C210.65 320.09 259.53 368 320 368a113 113 0 0 0 23.21-2.46zM320 112c98.65 0 189.09 55 237.93 144a285.53 285.53 0 0 1-44 60.2l37.74 29.5a333.7 333.7 0 0 0 52.9-75.11 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64c-36.7 0-71.71 7-104.63 18.81l46.41 36.29c18.94-4.3 38.34-7.1 58.22-7.1zm0 288c-98.65 0-189.08-55-237.93-144a285.47 285.47 0 0 1 44.05-60.19l-37.74-29.5a333.6 333.6 0 0 0-52.89 75.1 32.35 32.35 0 0 0 0 29.19C89.72 376.41 197.08 448 320 448c36.7 0 71.71-7.05 104.63-18.81l-46.41-36.28C359.28 397.2 339.89 400 320 400z\"]\n};\nvar faFile = {\n prefix: 'far',\n iconName: 'file',\n icon: [384, 512, [], \"f15b\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"]\n};\nvar faFileAlt = {\n prefix: 'far',\n iconName: 'file-alt',\n icon: [384, 512, [], \"f15c\", \"M288 248v28c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-28c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm-12 72H108c-6.6 0-12 5.4-12 12v28c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-28c0-6.6-5.4-12-12-12zm108-188.1V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V48C0 21.5 21.5 0 48 0h204.1C264.8 0 277 5.1 286 14.1L369.9 98c9 8.9 14.1 21.2 14.1 33.9zm-128-80V128h76.1L256 51.9zM336 464V176H232c-13.3 0-24-10.7-24-24V48H48v416h288z\"]\n};\nvar faFileArchive = {\n prefix: 'far',\n iconName: 'file-archive',\n icon: [384, 512, [], \"f1c6\", \"M128.3 160v32h32v-32zm64-96h-32v32h32zm-64 32v32h32V96zm64 32h-32v32h32zm177.6-30.1L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h79.7v16h32V48H208v104c0 13.3 10.7 24 24 24h104zM194.2 265.7c-1.1-5.6-6-9.7-11.8-9.7h-22.1v-32h-32v32l-19.7 97.1C102 385.6 126.8 416 160 416c33.1 0 57.9-30.2 51.5-62.6zm-33.9 124.4c-17.9 0-32.4-12.1-32.4-27s14.5-27 32.4-27 32.4 12.1 32.4 27-14.5 27-32.4 27zm32-198.1h-32v32h32z\"]\n};\nvar faFileAudio = {\n prefix: 'far',\n iconName: 'file-audio',\n icon: [384, 512, [], \"f1c7\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm144-76.024c0 10.691-12.926 16.045-20.485 8.485L136 360.486h-28c-6.627 0-12-5.373-12-12v-56c0-6.627 5.373-12 12-12h28l35.515-36.947c7.56-7.56 20.485-2.206 20.485 8.485v135.952zm41.201-47.13c9.051-9.297 9.06-24.133.001-33.439-22.149-22.752 12.235-56.246 34.395-33.481 27.198 27.94 27.212 72.444.001 100.401-21.793 22.386-56.947-10.315-34.397-33.481z\"]\n};\nvar faFileCode = {\n prefix: 'far',\n iconName: 'file-code',\n icon: [384, 512, [], \"f1c9\", \"M149.9 349.1l-.2-.2-32.8-28.9 32.8-28.9c3.6-3.2 4-8.8.8-12.4l-.2-.2-17.4-18.6c-3.4-3.6-9-3.7-12.4-.4l-57.7 54.1c-3.7 3.5-3.7 9.4 0 12.8l57.7 54.1c1.6 1.5 3.8 2.4 6 2.4 2.4 0 4.8-1 6.4-2.8l17.4-18.6c3.3-3.5 3.1-9.1-.4-12.4zm220-251.2L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h160v104c0 13.3 10.7 24 24 24h104zM209.6 214c-4.7-1.4-9.5 1.3-10.9 6L144 408.1c-1.4 4.7 1.3 9.6 6 10.9l24.4 7.1c4.7 1.4 9.6-1.4 10.9-6L240 231.9c1.4-4.7-1.3-9.6-6-10.9zm24.5 76.9l.2.2 32.8 28.9-32.8 28.9c-3.6 3.2-4 8.8-.8 12.4l.2.2 17.4 18.6c3.3 3.5 8.9 3.7 12.4.4l57.7-54.1c3.7-3.5 3.7-9.4 0-12.8l-57.7-54.1c-3.5-3.3-9.1-3.2-12.4.4l-17.4 18.6c-3.3 3.5-3.1 9.1.4 12.4z\"]\n};\nvar faFileExcel = {\n prefix: 'far',\n iconName: 'file-excel',\n icon: [384, 512, [], \"f1c3\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm212-240h-28.8c-4.4 0-8.4 2.4-10.5 6.3-18 33.1-22.2 42.4-28.6 57.7-13.9-29.1-6.9-17.3-28.6-57.7-2.1-3.9-6.2-6.3-10.6-6.3H124c-9.3 0-15 10-10.4 18l46.3 78-46.3 78c-4.7 8 1.1 18 10.4 18h28.9c4.4 0 8.4-2.4 10.5-6.3 21.7-40 23-45 28.6-57.7 14.9 30.2 5.9 15.9 28.6 57.7 2.1 3.9 6.2 6.3 10.6 6.3H260c9.3 0 15-10 10.4-18L224 320c.7-1.1 30.3-50.5 46.3-78 4.7-8-1.1-18-10.3-18z\"]\n};\nvar faFileImage = {\n prefix: 'far',\n iconName: 'file-image',\n icon: [384, 512, [], \"f1c5\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm32-48h224V288l-23.5-23.5c-4.7-4.7-12.3-4.7-17 0L176 352l-39.5-39.5c-4.7-4.7-12.3-4.7-17 0L80 352v64zm48-240c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z\"]\n};\nvar faFilePdf = {\n prefix: 'far',\n iconName: 'file-pdf',\n icon: [384, 512, [], \"f1c1\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm250.2-143.7c-12.2-12-47-8.7-64.4-6.5-17.2-10.5-28.7-25-36.8-46.3 3.9-16.1 10.1-40.6 5.4-56-4.2-26.2-37.8-23.6-42.6-5.9-4.4 16.1-.4 38.5 7 67.1-10 23.9-24.9 56-35.4 74.4-20 10.3-47 26.2-51 46.2-3.3 15.8 26 55.2 76.1-31.2 22.4-7.4 46.8-16.5 68.4-20.1 18.9 10.2 41 17 55.8 17 25.5 0 28-28.2 17.5-38.7zm-198.1 77.8c5.1-13.7 24.5-29.5 30.4-35-19 30.3-30.4 35.7-30.4 35zm81.6-190.6c7.4 0 6.7 32.1 1.8 40.8-4.4-13.9-4.3-40.8-1.8-40.8zm-24.4 136.6c9.7-16.9 18-37 24.7-54.7 8.3 15.1 18.9 27.2 30.1 35.5-20.8 4.3-38.9 13.1-54.8 19.2zm131.6-5s-5 6-37.3-7.8c35.1-2.6 40.9 5.4 37.3 7.8z\"]\n};\nvar faFilePowerpoint = {\n prefix: 'far',\n iconName: 'file-powerpoint',\n icon: [384, 512, [], \"f1c4\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm72-60V236c0-6.6 5.4-12 12-12h69.2c36.7 0 62.8 27 62.8 66.3 0 74.3-68.7 66.5-95.5 66.5V404c0 6.6-5.4 12-12 12H132c-6.6 0-12-5.4-12-12zm48.5-87.4h23c7.9 0 13.9-2.4 18.1-7.2 8.5-9.8 8.4-28.5.1-37.8-4.1-4.6-9.9-7-17.4-7h-23.9v52z\"]\n};\nvar faFileVideo = {\n prefix: 'far',\n iconName: 'file-video',\n icon: [384, 512, [], \"f1c8\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm228.687-211.303L224 305.374V268c0-11.046-8.954-20-20-20H100c-11.046 0-20 8.954-20 20v104c0 11.046 8.954 20 20 20h104c11.046 0 20-8.954 20-20v-37.374l52.687 52.674C286.704 397.318 304 390.28 304 375.986V264.011c0-14.311-17.309-21.319-27.313-11.314z\"]\n};\nvar faFileWord = {\n prefix: 'far',\n iconName: 'file-word',\n icon: [384, 512, [], \"f1c2\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm220.1-208c-5.7 0-10.6 4-11.7 9.5-20.6 97.7-20.4 95.4-21 103.5-.2-1.2-.4-2.6-.7-4.3-.8-5.1.3.2-23.6-99.5-1.3-5.4-6.1-9.2-11.7-9.2h-13.3c-5.5 0-10.3 3.8-11.7 9.1-24.4 99-24 96.2-24.8 103.7-.1-1.1-.2-2.5-.5-4.2-.7-5.2-14.1-73.3-19.1-99-1.1-5.6-6-9.7-11.8-9.7h-16.8c-7.8 0-13.5 7.3-11.7 14.8 8 32.6 26.7 109.5 33.2 136 1.3 5.4 6.1 9.1 11.7 9.1h25.2c5.5 0 10.3-3.7 11.6-9.1l17.9-71.4c1.5-6.2 2.5-12 3-17.3l2.9 17.3c.1.4 12.6 50.5 17.9 71.4 1.3 5.3 6.1 9.1 11.6 9.1h24.7c5.5 0 10.3-3.7 11.6-9.1 20.8-81.9 30.2-119 34.5-136 1.9-7.6-3.8-14.9-11.6-14.9h-15.8z\"]\n};\nvar faFlag = {\n prefix: 'far',\n iconName: 'flag',\n icon: [512, 512, [], \"f024\", \"M336.174 80c-49.132 0-93.305-32-161.913-32-31.301 0-58.303 6.482-80.721 15.168a48.04 48.04 0 0 0 2.142-20.727C93.067 19.575 74.167 1.594 51.201.104 23.242-1.71 0 20.431 0 48c0 17.764 9.657 33.262 24 41.562V496c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-83.443C109.869 395.28 143.259 384 199.826 384c49.132 0 93.305 32 161.913 32 58.479 0 101.972-22.617 128.548-39.981C503.846 367.161 512 352.051 512 335.855V95.937c0-34.459-35.264-57.768-66.904-44.117C409.193 67.309 371.641 80 336.174 80zM464 336c-21.783 15.412-60.824 32-102.261 32-59.945 0-102.002-32-161.913-32-43.361 0-96.379 9.403-127.826 24V128c21.784-15.412 60.824-32 102.261-32 59.945 0 102.002 32 161.913 32 43.271 0 96.32-17.366 127.826-32v240z\"]\n};\nvar faFlushed = {\n prefix: 'far',\n iconName: 'flushed',\n icon: [496, 512, [], \"f579\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm96-312c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-112 24c0-44.2-35.8-80-80-80s-80 35.8-80 80 35.8 80 80 80 80-35.8 80-80zm-80 48c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm160 144H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faFolder = {\n prefix: 'far',\n iconName: 'folder',\n icon: [512, 512, [], \"f07b\", \"M464 128H272l-54.63-54.63c-6-6-14.14-9.37-22.63-9.37H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm0 272H48V112h140.12l54.63 54.63c6 6 14.14 9.37 22.63 9.37H464v224z\"]\n};\nvar faFolderOpen = {\n prefix: 'far',\n iconName: 'folder-open',\n icon: [576, 512, [], \"f07c\", \"M527.9 224H480v-48c0-26.5-21.5-48-48-48H272l-64-64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h400c16.5 0 31.9-8.5 40.7-22.6l79.9-128c20-31.9-3-73.4-40.7-73.4zM48 118c0-3.3 2.7-6 6-6h134.1l64 64H426c3.3 0 6 2.7 6 6v42H152c-16.8 0-32.4 8.8-41.1 23.2L48 351.4zm400 282H72l77.2-128H528z\"]\n};\nvar faFontAwesomeLogoFull = {\n prefix: 'far',\n iconName: 'font-awesome-logo-full',\n icon: [3992, 512, [\"Font Awesome\"], \"f4e6\", \"M454.6 0H57.4C25.9 0 0 25.9 0 57.4v397.3C0 486.1 25.9 512 57.4 512h397.3c31.4 0 57.4-25.9 57.4-57.4V57.4C512 25.9 486.1 0 454.6 0zm-58.9 324.9c0 4.8-4.1 6.9-8.9 8.9-19.2 8.1-39.7 15.7-61.5 15.7-40.5 0-68.7-44.8-163.2 2.5v51.8c0 30.3-45.7 30.2-45.7 0v-250c-9-7-15-17.9-15-30.3 0-21 17.1-38.2 38.2-38.2 21 0 38.2 17.1 38.2 38.2 0 12.2-5.8 23.2-14.9 30.2v21c37.1-12 65.5-34.4 146.1-3.4 26.6 11.4 68.7-15.7 76.5-15.7 5.5 0 10.3 4.1 10.3 8.9v160.4zm432.9-174.2h-137v70.1H825c39.8 0 40.4 62.2 0 62.2H691.6v105.6c0 45.5-70.7 46.4-70.7 0V128.3c0-22 18-39.8 39.8-39.8h167.8c39.6 0 40.5 62.2.1 62.2zm191.1 23.4c-169.3 0-169.1 252.4 0 252.4 169.9 0 169.9-252.4 0-252.4zm0 196.1c-81.6 0-82.1-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm372.4 53.4c-17.5 0-31.4-13.9-31.4-31.4v-117c0-62.4-72.6-52.5-99.1-16.4v133.4c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c43.3-51.6 162.4-60.4 162.4 39.3v141.5c.3 30.4-31.5 31.4-31.7 31.4zm179.7 2.9c-44.3 0-68.3-22.9-68.3-65.8V235.2H1488c-35.6 0-36.7-55.3 0-55.3h15.5v-37.3c0-41.3 63.8-42.1 63.8 0v37.5h24.9c35.4 0 35.7 55.3 0 55.3h-24.9v108.5c0 29.6 26.1 26.3 27.4 26.3 31.4 0 52.6 56.3-22.9 56.3zM1992 123c-19.5-50.2-95.5-50-114.5 0-107.3 275.7-99.5 252.7-99.5 262.8 0 42.8 58.3 51.2 72.1 14.4l13.5-35.9H2006l13 35.9c14.2 37.7 72.1 27.2 72.1-14.4 0-10.1 5.3 6.8-99.1-262.8zm-108.9 179.1l51.7-142.9 51.8 142.9h-103.5zm591.3-85.6l-53.7 176.3c-12.4 41.2-72 41-84 0l-42.3-135.9-42.3 135.9c-12.4 40.9-72 41.2-84.5 0l-54.2-176.3c-12.5-39.4 49.8-56.1 60.2-16.9L2213 342l45.3-139.5c10.9-32.7 59.6-34.7 71.2 0l45.3 139.5 39.3-142.4c10.3-38.3 72.6-23.8 60.3 16.9zm275.4 75.1c0-42.4-33.9-117.5-119.5-117.5-73.2 0-124.4 56.3-124.4 126 0 77.2 55.3 126.4 128.5 126.4 31.7 0 93-11.5 93-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-109 8.4-115.9-43.8h148.3c16.3 0 29.3-13.4 29.3-28.9zM2571 277.7c9.5-73.4 113.9-68.6 118.6 0H2571zm316.7 148.8c-31.4 0-81.6-10.5-96.6-31.9-12.4-17 2.5-39.8 21.8-39.8 16.3 0 36.8 22.9 77.7 22.9 27.4 0 40.4-11 40.4-25.8 0-39.8-142.9-7.4-142.9-102 0-40.4 35.3-75.7 98.6-75.7 31.4 0 74.1 9.9 87.6 29.4 10.8 14.8-1.4 36.2-20.9 36.2-15.1 0-26.7-17.3-66.2-17.3-22.9 0-37.8 10.5-37.8 23.8 0 35.9 142.4 6 142.4 103.1-.1 43.7-37.4 77.1-104.1 77.1zm266.8-252.4c-169.3 0-169.1 252.4 0 252.4 170.1 0 169.6-252.4 0-252.4zm0 196.1c-81.8 0-82-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm476.9 22V268.7c0-53.8-61.4-45.8-85.7-10.5v134c0 41.3-63.8 42.1-63.8 0V268.7c0-52.1-59.5-47.4-85.7-10.1v133.6c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c9.9-14.4 41.8-37.3 78.6-37.3 35.3 0 57.7 16.4 66.7 43.8 13.9-21.8 45.8-43.8 82.6-43.8 44.3 0 70.7 23.4 70.7 72.7v145.3c.5 17.3-13.5 31.4-31.9 31.4 3.5.1-31.3 1.1-31.3-31.3zM3992 291.6c0-42.4-32.4-117.5-117.9-117.5-73.2 0-127.5 56.3-127.5 126 0 77.2 58.3 126.4 131.6 126.4 31.7 0 91.5-11.5 91.5-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-110.5 8.4-117.5-43.8h149.8c16.3 0 29.1-13.4 29.3-28.9zm-180.5-13.9c9.7-74.4 115.9-68.3 120.1 0h-120.1z\"]\n};\nvar faFrown = {\n prefix: 'far',\n iconName: 'frown',\n icon: [496, 512, [], \"f119\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 128c-40.2 0-78 17.7-103.8 48.6-8.5 10.2-7.1 25.3 3.1 33.8 10.2 8.4 25.3 7.1 33.8-3.1 16.6-19.9 41-31.4 66.9-31.4s50.3 11.4 66.9 31.4c8.1 9.7 23.1 11.9 33.8 3.1 10.2-8.5 11.5-23.6 3.1-33.8C326 321.7 288.2 304 248 304z\"]\n};\nvar faFrownOpen = {\n prefix: 'far',\n iconName: 'frown-open',\n icon: [496, 512, [], \"f57a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-48-248c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 112c-35.6 0-88.8 21.3-95.8 61.2-2 11.8 9 21.5 20.5 18.1 31.2-9.6 59.4-15.3 75.3-15.3s44.1 5.7 75.3 15.3c11.4 3.5 22.5-6.3 20.5-18.1-7-39.9-60.2-61.2-95.8-61.2z\"]\n};\nvar faFutbol = {\n prefix: 'far',\n iconName: 'futbol',\n icon: [496, 512, [], \"f1e3\", \"M483.8 179.4C449.8 74.6 352.6 8 248.1 8c-25.4 0-51.2 3.9-76.7 12.2C41.2 62.5-30.1 202.4 12.2 332.6 46.2 437.4 143.4 504 247.9 504c25.4 0 51.2-3.9 76.7-12.2 130.2-42.3 201.5-182.2 159.2-312.4zm-74.5 193.7l-52.2 6.4-43.7-60.9 24.4-75.2 71.1-22.1 38.9 36.4c-.2 30.7-7.4 61.1-21.7 89.2-4.7 9.3-10.7 17.8-16.8 26.2zm0-235.4l-10.4 53.1-70.7 22-64.2-46.5V92.5l47.4-26.2c39.2 13 73.4 38 97.9 71.4zM184.9 66.4L232 92.5v73.8l-64.2 46.5-70.6-22-10.1-52.5c24.3-33.4 57.9-58.6 97.8-71.9zM139 379.5L85.9 373c-14.4-20.1-37.3-59.6-37.8-115.3l39-36.4 71.1 22.2 24.3 74.3-43.5 61.7zm48.2 67l-22.4-48.1 43.6-61.7H287l44.3 61.7-22.4 48.1c-6.2 1.8-57.6 20.4-121.7 0z\"]\n};\nvar faGem = {\n prefix: 'far',\n iconName: 'gem',\n icon: [576, 512, [], \"f3a5\", \"M464 0H112c-4 0-7.8 2-10 5.4L2 152.6c-2.9 4.4-2.6 10.2.7 14.2l276 340.8c4.8 5.9 13.8 5.9 18.6 0l276-340.8c3.3-4.1 3.6-9.8.7-14.2L474.1 5.4C471.8 2 468.1 0 464 0zm-19.3 48l63.3 96h-68.4l-51.7-96h56.8zm-202.1 0h90.7l51.7 96H191l51.6-96zm-111.3 0h56.8l-51.7 96H68l63.3-96zm-43 144h51.4L208 352 88.3 192zm102.9 0h193.6L288 435.3 191.2 192zM368 352l68.2-160h51.4L368 352z\"]\n};\nvar faGrimace = {\n prefix: 'far',\n iconName: 'grimace',\n icon: [496, 512, [], \"f57f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm16 16H152c-26.5 0-48 21.5-48 48v32c0 26.5 21.5 48 48 48h192c26.5 0 48-21.5 48-48v-32c0-26.5-21.5-48-48-48zm-168 96h-24c-8.8 0-16-7.2-16-16v-8h40v24zm0-40h-40v-8c0-8.8 7.2-16 16-16h24v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm56 24c0 8.8-7.2 16-16 16h-24v-24h40v8zm0-24h-40v-24h24c8.8 0 16 7.2 16 16v8z\"]\n};\nvar faGrin = {\n prefix: 'far',\n iconName: 'grin',\n icon: [496, 512, [], \"f580\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faGrinAlt = {\n prefix: 'far',\n iconName: 'grin-alt',\n icon: [496, 512, [], \"f581\", \"M200.3 248c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zm128 0c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3z\"]\n};\nvar faGrinBeam = {\n prefix: 'far',\n iconName: 'grin-beam',\n icon: [496, 512, [], \"f582\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-235.9-72.9c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3zm160 0c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3z\"]\n};\nvar faGrinBeamSweat = {\n prefix: 'far',\n iconName: 'grin-beam-sweat',\n icon: [496, 512, [], \"f583\", \"M440 160c29.5 0 53.3-26.3 53.3-58.7 0-25-31.7-75.5-46.2-97.3-3.6-5.3-10.7-5.3-14.2 0-14.5 21.8-46.2 72.3-46.2 97.3 0 32.4 23.8 58.7 53.3 58.7zM248 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zm105.3-52.9c-24.6 15.7-46 12.9-46.4 12.9 6.9 20.2 10.8 41.8 10.8 64.3 0 110.3-89.7 200-200 200S48 366.3 48 256 137.7 56 248 56c39.8 0 76.8 11.8 108 31.9 1.7-9.5 6.3-24.1 17.2-45.7C336.4 20.6 293.7 8 248 8 111 8 0 119 0 256s111 248 248 248 248-111 248-248c0-27-4.4-52.9-12.4-77.2zM168 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinHearts = {\n prefix: 'far',\n iconName: 'grin-hearts',\n icon: [496, 512, [], \"f584\", \"M353.6 304.6c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-152.8-48.9c4.5 1.2 9.2-1.5 10.5-6l19.4-69.9c5.6-20.3-7.4-41.1-28.8-44.5-18.6-3-36.4 9.8-41.5 27.9l-2 7.1-7.1-1.9c-18.2-4.7-38.2 4.3-44.9 22-7.7 20.2 3.8 41.9 24.2 47.2l70.2 18.1zm188.8-65.3c-6.7-17.6-26.7-26.7-44.9-22l-7.1 1.9-2-7.1c-5-18.1-22.8-30.9-41.5-27.9-21.4 3.4-34.4 24.2-28.8 44.5l19.4 69.9c1.2 4.5 5.9 7.2 10.5 6l70.2-18.2c20.4-5.3 31.9-26.9 24.2-47.1zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200z\"]\n};\nvar faGrinSquint = {\n prefix: 'far',\n iconName: 'grin-squint',\n icon: [496, 512, [], \"f585\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-234.7-40.8c3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3l-80-48c-5.1-3-11.4-1.9-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11.1.1 15.5zm242.9 2.5c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11-.1-15.5-3.8-4.4-10.2-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48z\"]\n};\nvar faGrinSquintTears = {\n prefix: 'far',\n iconName: 'grin-squint-tears',\n icon: [512, 512, [], \"f586\", \"M117.1 384.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 479 124.3 420.8 128 395c.8-6.4-4.6-11.8-10.9-10.9zm-41.2-41.7C40.3 268 53 176.1 114.6 114.6 152.4 76.8 202.6 56 256 56c36.2 0 70.8 9.8 101.2 27.7 3.8-20.3 8-36.1 12-48.3C333.8 17.2 294.9 8 256 8 192.5 8 129.1 32.2 80.6 80.6c-74.1 74.1-91.3 183.4-52 274 12.2-4.1 27.7-8.3 47.3-12.2zm352.3-187.6c45 76.6 34.9 176.9-30.8 242.6-37.8 37.8-88 58.6-141.4 58.6-30.5 0-59.8-7-86.4-19.8-3.9 19.5-8 35-12.2 47.2 31.4 13.6 65 20.6 98.7 20.6 63.5 0 126.9-24.2 175.4-72.6 78.1-78.1 93.1-195.4 45.2-288.6-12.3 4-28.2 8.1-48.5 12zm-33.3-26.9c25.8-3.7 84-13.7 100.9-30.6 21.9-21.9 21.5-57.9-.9-80.3s-58.3-22.8-80.3-.9C397.7 33 387.7 91.2 384 117c-.8 6.4 4.6 11.8 10.9 10.9zm-187 108.3c-3-3-7.2-4.2-11.4-3.2L106 255.7c-5.7 1.4-9.5 6.7-9.1 12.6.5 5.8 5.1 10.5 10.9 11l52.3 4.8 4.8 52.3c.5 5.8 5.2 10.4 11 10.9h.9c5.5 0 10.3-3.7 11.7-9.1l22.6-90.5c1-4.2-.2-8.5-3.2-11.5zm39.7-25.1l90.5-22.6c5.7-1.4 9.5-6.7 9.1-12.6-.5-5.8-5.1-10.5-10.9-11l-52.3-4.8-4.8-52.3c-.5-5.8-5.2-10.4-11-10.9-5.6-.1-11.2 3.4-12.6 9.1L233 196.5c-1 4.1.2 8.4 3.2 11.4 5 5 11.3 3.2 11.4 3.2zm52 88.5c-29.1 29.1-59.7 52.9-83.9 65.4-9.2 4.8-10 17.5-1.7 23.4 38.9 27.7 107 6.2 143.7-30.6S416 253 388.3 214.1c-5.8-8.2-18.5-7.6-23.4 1.7-12.3 24.2-36.2 54.7-65.3 83.8z\"]\n};\nvar faGrinStars = {\n prefix: 'far',\n iconName: 'grin-stars',\n icon: [496, 512, [], \"f587\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-227.9-57.5c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.5 1.9-12.2-4.3-13.2l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6.1 34.9zm259.7-72.7l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6 34.9c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.6 1.8-12.2-4.4-13.2z\"]\n};\nvar faGrinTears = {\n prefix: 'far',\n iconName: 'grin-tears',\n icon: [640, 512, [], \"f588\", \"M117.1 256.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 351 124.3 292.8 128 267c.8-6.4-4.6-11.8-10.9-10.9zm506.7 30.6c-16.9-16.9-75.1-26.9-100.9-30.6-6.3-.9-11.7 4.5-10.8 10.8 3.7 25.8 13.7 84 30.6 100.9 21.9 21.9 57.9 21.5 80.3-.9 22.3-22.3 22.7-58.3.8-80.2zm-126.6 61.7C463.8 412.3 396.9 456 320 456c-76.9 0-143.8-43.7-177.2-107.6-12.5 37.4-25.2 43.9-28.3 46.5C159.1 460.7 234.5 504 320 504s160.9-43.3 205.5-109.1c-3.2-2.7-15.9-9.2-28.3-46.5zM122.7 224.5C137.9 129.2 220.5 56 320 56c99.5 0 182.1 73.2 197.3 168.5 2.1-.2 5.2-2.4 49.5 7C554.4 106 448.7 8 320 8S85.6 106 73.2 231.4c44.5-9.4 47.1-7.2 49.5-6.9zM320 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zM240 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinTongue = {\n prefix: 'far',\n iconName: 'grin-tongue',\n icon: [496, 512, [], \"f589\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zM168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faGrinTongueSquint = {\n prefix: 'far',\n iconName: 'grin-tongue-squint',\n icon: [496, 512, [], \"f58a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zm36.9-281.1c-3.8-4.4-10.3-5.5-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zm-162.9 45.5l-80-48c-5-3-11.4-2-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3z\"]\n};\nvar faGrinTongueWink = {\n prefix: 'far',\n iconName: 'grin-tongue-wink',\n icon: [496, 512, [], \"f58b\", \"M152 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm176-52c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3z\"]\n};\nvar faGrinWink = {\n prefix: 'far',\n iconName: 'grin-wink',\n icon: [496, 512, [], \"f58c\", \"M328 180c-25.69 0-55.88 16.92-59.86 42.12-1.75 11.22 11.5 18.24 19.83 10.84l9.55-8.48c14.81-13.19 46.16-13.19 60.97 0l9.55 8.48c8.48 7.43 21.56.25 19.83-10.84C383.88 196.92 353.69 180 328 180zm-160 60c17.67 0 32-14.33 32-32s-14.33-32-32-32-32 14.33-32 32 14.33 32 32 32zm185.55 64.64c-25.93 8.3-64.4 13.06-105.55 13.06s-79.62-4.75-105.55-13.06c-9.94-3.13-19.4 5.37-17.71 15.34C132.67 367.13 196.06 400 248 400s115.33-32.87 123.26-80.02c1.68-9.89-7.67-18.48-17.71-15.34zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faHandLizard = {\n prefix: 'far',\n iconName: 'hand-lizard',\n icon: [576, 512, [], \"f258\", \"M556.686 290.542L410.328 64.829C397.001 44.272 374.417 32 349.917 32H56C25.121 32 0 57.122 0 88v8c0 44.112 35.888 80 80 80h196.042l-18.333 48H144c-48.523 0-88 39.477-88 88 0 30.879 25.121 56 56 56h131.552c2.987 0 5.914.549 8.697 1.631L352 408.418V480h224V355.829c0-23.225-6.679-45.801-19.314-65.287zM528 432H400v-23.582c0-19.948-12.014-37.508-30.604-44.736l-99.751-38.788A71.733 71.733 0 0 0 243.552 320H112c-4.411 0-8-3.589-8-8 0-22.056 17.944-40 40-40h113.709c19.767 0 37.786-12.407 44.84-30.873l24.552-64.281c8.996-23.553-8.428-48.846-33.63-48.846H80c-17.645 0-32-14.355-32-32v-8c0-4.411 3.589-8 8-8h293.917c8.166 0 15.693 4.09 20.137 10.942l146.358 225.715A71.84 71.84 0 0 1 528 355.829V432z\"]\n};\nvar faHandPaper = {\n prefix: 'far',\n iconName: 'hand-paper',\n icon: [448, 512, [], \"f256\", \"M372.57 112.641v-10.825c0-43.612-40.52-76.691-83.039-65.546-25.629-49.5-94.09-47.45-117.982.747C130.269 26.456 89.144 57.945 89.144 102v126.13c-19.953-7.427-43.308-5.068-62.083 8.871-29.355 21.796-35.794 63.333-14.55 93.153L132.48 498.569a32 32 0 0 0 26.062 13.432h222.897c14.904 0 27.835-10.289 31.182-24.813l30.184-130.958A203.637 203.637 0 0 0 448 310.564V179c0-40.62-35.523-71.992-75.43-66.359zm27.427 197.922c0 11.731-1.334 23.469-3.965 34.886L368.707 464h-201.92L51.591 302.303c-14.439-20.27 15.023-42.776 29.394-22.605l27.128 38.079c8.995 12.626 29.031 6.287 29.031-9.283V102c0-25.645 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V67c0-25.663 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V101.125c0-25.672 36.57-24.81 36.57.691V256c0 8.837 7.163 16 16 16h6.857c8.837 0 16-7.163 16-16v-76.309c0-26.242 36.57-25.64 36.57-.691v131.563z\"]\n};\nvar faHandPeace = {\n prefix: 'far',\n iconName: 'hand-peace',\n icon: [448, 512, [], \"f25b\", \"M362.146 191.976c-13.71-21.649-38.761-34.016-65.006-30.341V74c0-40.804-32.811-74-73.141-74-40.33 0-73.14 33.196-73.14 74L160 168l-18.679-78.85C126.578 50.843 83.85 32.11 46.209 47.208 8.735 62.238-9.571 104.963 5.008 142.85l55.757 144.927c-30.557 24.956-43.994 57.809-24.733 92.218l54.853 97.999C102.625 498.97 124.73 512 148.575 512h205.702c30.744 0 57.558-21.44 64.555-51.797l27.427-118.999a67.801 67.801 0 0 0 1.729-15.203L448 256c0-44.956-43.263-77.343-85.854-64.024zM399.987 326c0 1.488-.169 2.977-.502 4.423l-27.427 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H148.575c-6.486 0-12.542-3.621-15.805-9.449l-54.854-98c-4.557-8.141-2.619-18.668 4.508-24.488l26.647-21.764a16 16 0 0 0 4.812-18.139l-64.09-166.549C37.226 92.956 84.37 74.837 96.51 106.389l59.784 155.357A16 16 0 0 0 171.227 272h11.632c8.837 0 16-7.163 16-16V74c0-34.375 50.281-34.43 50.281 0v182c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16v-28c0-25.122 36.567-25.159 36.567 0v28c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16 0-25.12 36.567-25.16 36.567 0v70z\"]\n};\nvar faHandPointDown = {\n prefix: 'far',\n iconName: 'hand-point-down',\n icon: [448, 512, [], \"f0a7\", \"M188.8 512c45.616 0 83.2-37.765 83.2-83.2v-35.647a93.148 93.148 0 0 0 22.064-7.929c22.006 2.507 44.978-3.503 62.791-15.985C409.342 368.1 448 331.841 448 269.299V248c0-60.063-40-98.512-40-127.2v-2.679c4.952-5.747 8-13.536 8-22.12V32c0-17.673-12.894-32-28.8-32H156.8C140.894 0 128 14.327 128 32v64c0 8.584 3.048 16.373 8 22.12v2.679c0 6.964-6.193 14.862-23.668 30.183l-.148.129-.146.131c-9.937 8.856-20.841 18.116-33.253 25.851C48.537 195.798 0 207.486 0 252.8c0 56.928 35.286 92 83.2 92 8.026 0 15.489-.814 22.4-2.176V428.8c0 45.099 38.101 83.2 83.2 83.2zm0-48c-18.7 0-35.2-16.775-35.2-35.2V270.4c-17.325 0-35.2 26.4-70.4 26.4-26.4 0-35.2-20.625-35.2-44 0-8.794 32.712-20.445 56.1-34.926 14.575-9.074 27.225-19.524 39.875-30.799 18.374-16.109 36.633-33.836 39.596-59.075h176.752C364.087 170.79 400 202.509 400 248v21.299c0 40.524-22.197 57.124-61.325 50.601-8.001 14.612-33.979 24.151-53.625 12.925-18.225 19.365-46.381 17.787-61.05 4.95V428.8c0 18.975-16.225 35.2-35.2 35.2zM328 64c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24z\"]\n};\nvar faHandPointLeft = {\n prefix: 'far',\n iconName: 'hand-point-left',\n icon: [512, 512, [], \"f0a5\", \"M0 220.8C0 266.416 37.765 304 83.2 304h35.647a93.148 93.148 0 0 0 7.929 22.064c-2.507 22.006 3.503 44.978 15.985 62.791C143.9 441.342 180.159 480 242.701 480H264c60.063 0 98.512-40 127.2-40h2.679c5.747 4.952 13.536 8 22.12 8h64c17.673 0 32-12.894 32-28.8V188.8c0-15.906-14.327-28.8-32-28.8h-64c-8.584 0-16.373 3.048-22.12 8H391.2c-6.964 0-14.862-6.193-30.183-23.668l-.129-.148-.131-.146c-8.856-9.937-18.116-20.841-25.851-33.253C316.202 80.537 304.514 32 259.2 32c-56.928 0-92 35.286-92 83.2 0 8.026.814 15.489 2.176 22.4H83.2C38.101 137.6 0 175.701 0 220.8zm48 0c0-18.7 16.775-35.2 35.2-35.2h158.4c0-17.325-26.4-35.2-26.4-70.4 0-26.4 20.625-35.2 44-35.2 8.794 0 20.445 32.712 34.926 56.1 9.074 14.575 19.524 27.225 30.799 39.875 16.109 18.374 33.836 36.633 59.075 39.596v176.752C341.21 396.087 309.491 432 264 432h-21.299c-40.524 0-57.124-22.197-50.601-61.325-14.612-8.001-24.151-33.979-12.925-53.625-19.365-18.225-17.787-46.381-4.95-61.05H83.2C64.225 256 48 239.775 48 220.8zM448 360c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointRight = {\n prefix: 'far',\n iconName: 'hand-point-right',\n icon: [512, 512, [], \"f0a4\", \"M428.8 137.6h-86.177a115.52 115.52 0 0 0 2.176-22.4c0-47.914-35.072-83.2-92-83.2-45.314 0-57.002 48.537-75.707 78.784-7.735 12.413-16.994 23.317-25.851 33.253l-.131.146-.129.148C135.662 161.807 127.764 168 120.8 168h-2.679c-5.747-4.952-13.536-8-22.12-8H32c-17.673 0-32 12.894-32 28.8v230.4C0 435.106 14.327 448 32 448h64c8.584 0 16.373-3.048 22.12-8h2.679c28.688 0 67.137 40 127.2 40h21.299c62.542 0 98.8-38.658 99.94-91.145 12.482-17.813 18.491-40.785 15.985-62.791A93.148 93.148 0 0 0 393.152 304H428.8c45.435 0 83.2-37.584 83.2-83.2 0-45.099-38.101-83.2-83.2-83.2zm0 118.4h-91.026c12.837 14.669 14.415 42.825-4.95 61.05 11.227 19.646 1.687 45.624-12.925 53.625 6.524 39.128-10.076 61.325-50.6 61.325H248c-45.491 0-77.21-35.913-120-39.676V215.571c25.239-2.964 42.966-21.222 59.075-39.596 11.275-12.65 21.725-25.3 30.799-39.875C232.355 112.712 244.006 80 252.8 80c23.375 0 44 8.8 44 35.2 0 35.2-26.4 53.075-26.4 70.4h158.4c18.425 0 35.2 16.5 35.2 35.2 0 18.975-16.225 35.2-35.2 35.2zM88 384c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faHandPointUp = {\n prefix: 'far',\n iconName: 'hand-point-up',\n icon: [448, 512, [], \"f0a6\", \"M105.6 83.2v86.177a115.52 115.52 0 0 0-22.4-2.176c-47.914 0-83.2 35.072-83.2 92 0 45.314 48.537 57.002 78.784 75.707 12.413 7.735 23.317 16.994 33.253 25.851l.146.131.148.129C129.807 376.338 136 384.236 136 391.2v2.679c-4.952 5.747-8 13.536-8 22.12v64c0 17.673 12.894 32 28.8 32h230.4c15.906 0 28.8-14.327 28.8-32v-64c0-8.584-3.048-16.373-8-22.12V391.2c0-28.688 40-67.137 40-127.2v-21.299c0-62.542-38.658-98.8-91.145-99.94-17.813-12.482-40.785-18.491-62.791-15.985A93.148 93.148 0 0 0 272 118.847V83.2C272 37.765 234.416 0 188.8 0c-45.099 0-83.2 38.101-83.2 83.2zm118.4 0v91.026c14.669-12.837 42.825-14.415 61.05 4.95 19.646-11.227 45.624-1.687 53.625 12.925 39.128-6.524 61.325 10.076 61.325 50.6V264c0 45.491-35.913 77.21-39.676 120H183.571c-2.964-25.239-21.222-42.966-39.596-59.075-12.65-11.275-25.3-21.725-39.875-30.799C80.712 279.645 48 267.994 48 259.2c0-23.375 8.8-44 35.2-44 35.2 0 53.075 26.4 70.4 26.4V83.2c0-18.425 16.5-35.2 35.2-35.2 18.975 0 35.2 16.225 35.2 35.2zM352 424c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointer = {\n prefix: 'far',\n iconName: 'hand-pointer',\n icon: [448, 512, [], \"f25a\", \"M358.182 179.361c-19.493-24.768-52.679-31.945-79.872-19.098-15.127-15.687-36.182-22.487-56.595-19.629V67c0-36.944-29.736-67-66.286-67S89.143 30.056 89.143 67v161.129c-19.909-7.41-43.272-5.094-62.083 8.872-29.355 21.795-35.793 63.333-14.55 93.152l109.699 154.001C134.632 501.59 154.741 512 176 512h178.286c30.802 0 57.574-21.5 64.557-51.797l27.429-118.999A67.873 67.873 0 0 0 448 326v-84c0-46.844-46.625-79.273-89.818-62.639zM80.985 279.697l27.126 38.079c8.995 12.626 29.031 6.287 29.031-9.283V67c0-25.12 36.571-25.16 36.571 0v175c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16v-35c0-25.12 36.571-25.16 36.571 0v35c0 8.836 7.163 16 16 16H272c8.837 0 16-7.164 16-16v-21c0-25.12 36.571-25.16 36.571 0v21c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16 0-25.121 36.571-25.16 36.571 0v84c0 1.488-.169 2.977-.502 4.423l-27.43 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H176c-5.769 0-11.263-2.878-14.697-7.697l-109.712-154c-14.406-20.223 14.994-42.818 29.394-22.606zM176.143 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.733 0-14-7.163-14-16zm75.428 0v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16zM327 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16z\"]\n};\nvar faHandRock = {\n prefix: 'far',\n iconName: 'hand-rock',\n icon: [512, 512, [], \"f255\", \"M408.864 79.052c-22.401-33.898-66.108-42.273-98.813-23.588-29.474-31.469-79.145-31.093-108.334-.022-47.16-27.02-108.71 5.055-110.671 60.806C44.846 105.407 0 140.001 0 187.429v56.953c0 32.741 14.28 63.954 39.18 85.634l97.71 85.081c4.252 3.702 3.11 5.573 3.11 32.903 0 17.673 14.327 32 32 32h252c17.673 0 32-14.327 32-32 0-23.513-1.015-30.745 3.982-42.37l42.835-99.656c6.094-14.177 9.183-29.172 9.183-44.568V146.963c0-52.839-54.314-88.662-103.136-67.911zM464 261.406a64.505 64.505 0 0 1-5.282 25.613l-42.835 99.655c-5.23 12.171-7.883 25.04-7.883 38.25V432H188v-10.286c0-16.37-7.14-31.977-19.59-42.817l-97.71-85.08C56.274 281.255 48 263.236 48 244.381v-56.953c0-33.208 52-33.537 52 .677v41.228a16 16 0 0 0 5.493 12.067l7 6.095A16 16 0 0 0 139 235.429V118.857c0-33.097 52-33.725 52 .677v26.751c0 8.836 7.164 16 16 16h7c8.836 0 16-7.164 16-16v-41.143c0-33.134 52-33.675 52 .677v40.466c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16v-27.429c0-33.03 52-33.78 52 .677v26.751c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16 0-33.146 52-33.613 52 .677v114.445z\"]\n};\nvar faHandScissors = {\n prefix: 'far',\n iconName: 'hand-scissors',\n icon: [512, 512, [], \"f257\", \"M256 480l70-.013c5.114 0 10.231-.583 15.203-1.729l118.999-27.427C490.56 443.835 512 417.02 512 386.277V180.575c0-23.845-13.03-45.951-34.005-57.69l-97.999-54.853c-34.409-19.261-67.263-5.824-92.218 24.733L142.85 37.008c-37.887-14.579-80.612 3.727-95.642 41.201-15.098 37.642 3.635 80.37 41.942 95.112L168 192l-94-9.141c-40.804 0-74 32.811-74 73.14 0 40.33 33.196 73.141 74 73.141h87.635c-3.675 26.245 8.692 51.297 30.341 65.006C178.657 436.737 211.044 480 256 480zm0-48.013c-25.16 0-25.12-36.567 0-36.567 8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16h-28c-25.159 0-25.122-36.567 0-36.567h28c8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16H74c-34.43 0-34.375-50.281 0-50.281h182c8.837 0 16-7.163 16-16v-11.632a16 16 0 0 0-10.254-14.933L106.389 128.51c-31.552-12.14-13.432-59.283 19.222-46.717l166.549 64.091a16.001 16.001 0 0 0 18.139-4.812l21.764-26.647c5.82-7.127 16.348-9.064 24.488-4.508l98 54.854c5.828 3.263 9.449 9.318 9.449 15.805v205.701c0 8.491-5.994 15.804-14.576 17.782l-119.001 27.427a19.743 19.743 0 0 1-4.423.502h-70z\"]\n};\nvar faHandSpock = {\n prefix: 'far',\n iconName: 'hand-spock',\n icon: [512, 512, [], \"f259\", \"M21.096 381.79l129.092 121.513a32 32 0 0 0 21.932 8.698h237.6c14.17 0 26.653-9.319 30.68-22.904l31.815-107.313A115.955 115.955 0 0 0 477 348.811v-36.839c0-4.051.476-8.104 1.414-12.045l31.73-133.41c10.099-42.412-22.316-82.738-65.544-82.525-4.144-24.856-22.543-47.165-49.85-53.992-35.803-8.952-72.227 12.655-81.25 48.75L296.599 184 274.924 52.01c-8.286-36.07-44.303-58.572-80.304-50.296-29.616 6.804-50.138 32.389-51.882 61.295-42.637.831-73.455 40.563-64.071 81.844l31.04 136.508c-27.194-22.515-67.284-19.992-91.482 5.722-25.376 26.961-24.098 69.325 2.871 94.707zm32.068-61.811l.002-.001c7.219-7.672 19.241-7.98 26.856-.813l53.012 49.894C143.225 378.649 160 371.4 160 357.406v-69.479c0-1.193-.134-2.383-.397-3.546l-34.13-150.172c-5.596-24.617 31.502-32.86 37.054-8.421l30.399 133.757a16 16 0 0 0 15.603 12.454h8.604c10.276 0 17.894-9.567 15.594-19.583l-41.62-181.153c-5.623-24.469 31.39-33.076 37.035-8.508l45.22 196.828A16 16 0 0 0 288.956 272h13.217a16 16 0 0 0 15.522-12.119l42.372-169.49c6.104-24.422 42.962-15.159 36.865 9.217L358.805 252.12c-2.521 10.088 5.115 19.88 15.522 19.88h9.694a16 16 0 0 0 15.565-12.295L426.509 146.6c5.821-24.448 42.797-15.687 36.966 8.802L431.72 288.81a100.094 100.094 0 0 0-2.72 23.162v36.839c0 6.548-.943 13.051-2.805 19.328L397.775 464h-219.31L53.978 346.836c-7.629-7.18-7.994-19.229-.814-26.857z\"]\n};\nvar faHandshake = {\n prefix: 'far',\n iconName: 'handshake',\n icon: [640, 512, [], \"f2b5\", \"M519.2 127.9l-47.6-47.6A56.252 56.252 0 0 0 432 64H205.2c-14.8 0-29.1 5.9-39.6 16.3L118 127.9H0v255.7h64c17.6 0 31.8-14.2 31.9-31.7h9.1l84.6 76.4c30.9 25.1 73.8 25.7 105.6 3.8 12.5 10.8 26 15.9 41.1 15.9 18.2 0 35.3-7.4 48.8-24 22.1 8.7 48.2 2.6 64-16.8l26.2-32.3c5.6-6.9 9.1-14.8 10.9-23h57.9c.1 17.5 14.4 31.7 31.9 31.7h64V127.9H519.2zM48 351.6c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16zm390-6.9l-26.1 32.2c-2.8 3.4-7.8 4-11.3 1.2l-23.9-19.4-30 36.5c-6 7.3-15 4.8-18 2.4l-36.8-31.5-15.6 19.2c-13.9 17.1-39.2 19.7-55.3 6.6l-97.3-88H96V175.8h41.9l61.7-61.6c2-.8 3.7-1.5 5.7-2.3H262l-38.7 35.5c-29.4 26.9-31.1 72.3-4.4 101.3 14.8 16.2 61.2 41.2 101.5 4.4l8.2-7.5 108.2 87.8c3.4 2.8 3.9 7.9 1.2 11.3zm106-40.8h-69.2c-2.3-2.8-4.9-5.4-7.7-7.7l-102.7-83.4 12.5-11.4c6.5-6 7-16.1 1-22.6L367 167.1c-6-6.5-16.1-6.9-22.6-1l-55.2 50.6c-9.5 8.7-25.7 9.4-34.6 0-9.3-9.9-8.5-25.1 1.2-33.9l65.6-60.1c7.4-6.8 17-10.5 27-10.5l83.7-.2c2.1 0 4.1.8 5.5 2.3l61.7 61.6H544v128zm48 47.7c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16z\"]\n};\nvar faHdd = {\n prefix: 'far',\n iconName: 'hdd',\n icon: [576, 512, [], \"f0a0\", \"M567.403 235.642L462.323 84.589A48 48 0 0 0 422.919 64H153.081a48 48 0 0 0-39.404 20.589L8.597 235.642A48.001 48.001 0 0 0 0 263.054V400c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V263.054c0-9.801-3-19.366-8.597-27.412zM153.081 112h269.838l77.913 112H75.168l77.913-112zM528 400H48V272h480v128zm-32-64c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32zm-96 0c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32z\"]\n};\nvar faHeart = {\n prefix: 'far',\n iconName: 'heart',\n icon: [512, 512, [], \"f004\", \"M458.4 64.3C400.6 15.7 311.3 23 256 79.3 200.7 23 111.4 15.6 53.6 64.3-21.6 127.6-10.6 230.8 43 285.5l175.4 178.7c10 10.2 23.4 15.9 37.6 15.9 14.3 0 27.6-5.6 37.6-15.8L469 285.6c53.5-54.7 64.7-157.9-10.6-221.3zm-23.6 187.5L259.4 430.5c-2.4 2.4-4.4 2.4-6.8 0L77.2 251.8c-36.5-37.2-43.9-107.6 7.3-150.7 38.9-32.7 98.9-27.8 136.5 10.5l35 35.7 35-35.7c37.8-38.5 97.8-43.2 136.5-10.6 51.1 43.1 43.5 113.9 7.3 150.8z\"]\n};\nvar faHospital = {\n prefix: 'far',\n iconName: 'hospital',\n icon: [448, 512, [], \"f0f8\", \"M128 244v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12zm140 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm-76 84v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm76 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm180 124v36H0v-36c0-6.627 5.373-12 12-12h19.5V85.035C31.5 73.418 42.245 64 55.5 64H144V24c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v40h88.5c13.255 0 24 9.418 24 21.035V464H436c6.627 0 12 5.373 12 12zM79.5 463H192v-67c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v67h112.5V112H304v24c0 13.255-10.745 24-24 24H168c-13.255 0-24-10.745-24-24v-24H79.5v351zM266 64h-26V38a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v26h-26a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h26v26a6 6 0 0 0 6 6h20a6 6 0 0 0 6-6V96h26a6 6 0 0 0 6-6V70a6 6 0 0 0-6-6z\"]\n};\nvar faHourglass = {\n prefix: 'far',\n iconName: 'hourglass',\n icon: [384, 512, [], \"f254\", \"M368 48h4c6.627 0 12-5.373 12-12V12c0-6.627-5.373-12-12-12H12C5.373 0 0 5.373 0 12v24c0 6.627 5.373 12 12 12h4c0 80.564 32.188 165.807 97.18 208C47.899 298.381 16 383.9 16 464h-4c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h360c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12h-4c0-80.564-32.188-165.807-97.18-208C336.102 213.619 368 128.1 368 48zM64 48h256c0 101.62-57.307 184-128 184S64 149.621 64 48zm256 416H64c0-101.62 57.308-184 128-184s128 82.38 128 184z\"]\n};\nvar faIdBadge = {\n prefix: 'far',\n iconName: 'id-badge',\n icon: [384, 512, [], \"f2c1\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm0 464H48V48h288v416zM144 112h96c8.8 0 16-7.2 16-16s-7.2-16-16-16h-96c-8.8 0-16 7.2-16 16s7.2 16 16 16zm48 176c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faIdCard = {\n prefix: 'far',\n iconName: 'id-card',\n icon: [576, 512, [], \"f2c2\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H303.2c.9-4.5.8 3.6.8-22.4 0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6 0 26-.2 17.9.8 22.4H48V144h480v288zm-168-80h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm-168 96c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z\"]\n};\nvar faImage = {\n prefix: 'far',\n iconName: 'image',\n icon: [512, 512, [], \"f03e\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 336H54a6 6 0 0 1-6-6V118a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v276a6 6 0 0 1-6 6zM128 152c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zM96 352h320v-80l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L192 304l-39.515-39.515c-4.686-4.686-12.284-4.686-16.971 0L96 304v48z\"]\n};\nvar faImages = {\n prefix: 'far',\n iconName: 'images',\n icon: [576, 512, [], \"f302\", \"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v48H54a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6v-10h48zm42-336H150a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6V86a6 6 0 0 0-6-6zm6-48c26.51 0 48 21.49 48 48v256c0 26.51-21.49 48-48 48H144c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h384zM264 144c0 22.091-17.909 40-40 40s-40-17.909-40-40 17.909-40 40-40 40 17.909 40 40zm-72 96l39.515-39.515c4.686-4.686 12.284-4.686 16.971 0L288 240l103.515-103.515c4.686-4.686 12.284-4.686 16.971 0L480 208v80H192v-48z\"]\n};\nvar faKeyboard = {\n prefix: 'far',\n iconName: 'keyboard',\n icon: [576, 512, [], \"f11c\", \"M528 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm8 336c0 4.411-3.589 8-8 8H48c-4.411 0-8-3.589-8-8V112c0-4.411 3.589-8 8-8h480c4.411 0 8 3.589 8 8v288zM170 270v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-336 82v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm384 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zM122 188v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-98 158v-16c0-6.627-5.373-12-12-12H180c-6.627 0-12 5.373-12 12v16c0 6.627 5.373 12 12 12h216c6.627 0 12-5.373 12-12z\"]\n};\nvar faKiss = {\n prefix: 'far',\n iconName: 'kiss',\n icon: [496, 512, [], \"f596\", \"M168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm136 132c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faKissBeam = {\n prefix: 'far',\n iconName: 'kiss-beam',\n icon: [496, 512, [], \"f597\", \"M168 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm56-148c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zm24-156c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4z\"]\n};\nvar faKissWinkHeart = {\n prefix: 'far',\n iconName: 'kiss-wink-heart',\n icon: [504, 512, [], \"f598\", \"M304 308.5c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36 21.7-9.1 35.1-23.4 35.1-36.4zm70.5-83.5l9.5 8.5c3.8 3.3 9.3 4 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 5.8 3.1 11.2.7 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0zM136 208.5c0 17.7 14.3 32 32 32s32-14.3 32-32-14.3-32-32-32-32 14.3-32 32zm365.1 194c-8-20.8-31.5-31.5-53.1-25.9l-8.4 2.2-2.3-8.4c-5.9-21.4-27-36.5-49-33-25.2 4-40.6 28.6-34 52.6l22.9 82.6c1.5 5.3 7 8.5 12.4 7.1l83-21.5c24.1-6.3 37.7-31.8 28.5-55.7zM334 436.3c-26.1 12.5-55.2 19.7-86 19.7-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200c0 22.1-3.7 43.3-10.4 63.2 9 6.4 17 14.2 22.6 23.9 6.4.1 12.6 1.4 18.6 2.9 10.9-27.9 17.1-58.2 17.1-90C496 119 385 8 248 8S0 119 0 256s111 248 248 248c35.4 0 68.9-7.5 99.4-20.9-2.5-7.3 4.3 17.2-13.4-46.8z\"]\n};\nvar faLaugh = {\n prefix: 'far',\n iconName: 'laugh',\n icon: [496, 512, [], \"f599\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 224c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm-160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughBeam = {\n prefix: 'far',\n iconName: 'laugh-beam',\n icon: [496, 512, [], \"f59a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 152c-23.8 0-52.7 29.3-56 71.4-.7 8.6 10.8 11.9 14.9 4.5l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.1-42.1-32-71.4-55.8-71.4zm-201 75.9l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.6 8.5 10.9 11.9 15.1 4.5zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughSquint = {\n prefix: 'far',\n iconName: 'laugh-squint',\n icon: [496, 512, [], \"f59b\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM343.6 196l33.6-40.3c8.6-10.3-3.8-24.8-15.4-18l-80 48c-7.8 4.7-7.8 15.9 0 20.6l80 48c11.5 6.8 24-7.6 15.4-18L343.6 196zm-209.4 58.3l80-48c7.8-4.7 7.8-15.9 0-20.6l-80-48c-11.6-6.9-24 7.7-15.4 18l33.6 40.3-33.6 40.3c-8.7 10.4 3.8 24.8 15.4 18zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughWink = {\n prefix: 'far',\n iconName: 'laugh-wink',\n icon: [496, 512, [], \"f59c\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6C68.8 359.6 48 309.4 48 256s20.8-103.6 58.6-141.4C144.4 76.8 194.6 56 248 56s103.6 20.8 141.4 58.6c37.8 37.8 58.6 88 58.6 141.4s-20.8 103.6-58.6 141.4zM328 164c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1zm-160 60c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLemon = {\n prefix: 'far',\n iconName: 'lemon',\n icon: [512, 512, [], \"f094\", \"M484.112 27.889C455.989-.233 416.108-8.057 387.059 8.865 347.604 31.848 223.504-41.111 91.196 91.197-41.277 223.672 31.923 347.472 8.866 387.058c-16.922 29.051-9.1 68.932 19.022 97.054 28.135 28.135 68.011 35.938 97.057 19.021 39.423-22.97 163.557 49.969 295.858-82.329 132.474-132.477 59.273-256.277 82.331-295.861 16.922-29.05 9.1-68.931-19.022-97.054zm-22.405 72.894c-38.8 66.609 45.6 165.635-74.845 286.08-120.44 120.443-219.475 36.048-286.076 74.843-22.679 13.207-64.035-27.241-50.493-50.488 38.8-66.609-45.6-165.635 74.845-286.08C245.573 4.702 344.616 89.086 411.219 50.292c22.73-13.24 64.005 27.288 50.488 50.491zm-169.861 8.736c1.37 10.96-6.404 20.957-17.365 22.327-54.846 6.855-135.779 87.787-142.635 142.635-1.373 10.989-11.399 18.734-22.326 17.365-10.961-1.37-18.735-11.366-17.365-22.326 9.162-73.286 104.167-168.215 177.365-177.365 10.953-1.368 20.956 6.403 22.326 17.364z\"]\n};\nvar faLifeRing = {\n prefix: 'far',\n iconName: 'life-ring',\n icon: [512, 512, [], \"f1cd\", \"M256 504c136.967 0 248-111.033 248-248S392.967 8 256 8 8 119.033 8 256s111.033 248 248 248zm-103.398-76.72l53.411-53.411c31.806 13.506 68.128 13.522 99.974 0l53.411 53.411c-63.217 38.319-143.579 38.319-206.796 0zM336 256c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zm91.28 103.398l-53.411-53.411c13.505-31.806 13.522-68.128 0-99.974l53.411-53.411c38.319 63.217 38.319 143.579 0 206.796zM359.397 84.72l-53.411 53.411c-31.806-13.505-68.128-13.522-99.973 0L152.602 84.72c63.217-38.319 143.579-38.319 206.795 0zM84.72 152.602l53.411 53.411c-13.506 31.806-13.522 68.128 0 99.974L84.72 359.398c-38.319-63.217-38.319-143.579 0-206.796z\"]\n};\nvar faLightbulb = {\n prefix: 'far',\n iconName: 'lightbulb',\n icon: [352, 512, [], \"f0eb\", \"M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z\"]\n};\nvar faListAlt = {\n prefix: 'far',\n iconName: 'list-alt',\n icon: [512, 512, [], \"f022\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v340a6 6 0 0 1-6 6zm-42-92v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm-252 12c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36z\"]\n};\nvar faMap = {\n prefix: 'far',\n iconName: 'map',\n icon: [576, 512, [], \"f279\", \"M560.02 32c-1.96 0-3.98.37-5.96 1.16L384.01 96H384L212 35.28A64.252 64.252 0 0 0 191.76 32c-6.69 0-13.37 1.05-19.81 3.14L20.12 87.95A32.006 32.006 0 0 0 0 117.66v346.32C0 473.17 7.53 480 15.99 480c1.96 0 3.97-.37 5.96-1.16L192 416l172 60.71a63.98 63.98 0 0 0 40.05.15l151.83-52.81A31.996 31.996 0 0 0 576 394.34V48.02c0-9.19-7.53-16.02-15.98-16.02zM224 90.42l128 45.19v285.97l-128-45.19V90.42zM48 418.05V129.07l128-44.53v286.2l-.64.23L48 418.05zm480-35.13l-128 44.53V141.26l.64-.24L528 93.95v288.97z\"]\n};\nvar faMeh = {\n prefix: 'far',\n iconName: 'meh',\n icon: [496, 512, [], \"f11a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm8 144H160c-13.2 0-24 10.8-24 24s10.8 24 24 24h176c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMehBlank = {\n prefix: 'far',\n iconName: 'meh-blank',\n icon: [496, 512, [], \"f5a4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faMehRollingEyes = {\n prefix: 'far',\n iconName: 'meh-rolling-eyes',\n icon: [496, 512, [], \"f5a5\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm88-304c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm0 112c-22.1 0-40-17.9-40-40 0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40zm-104-40c0-39.8-32.2-72-72-72s-72 32.2-72 72 32.2 72 72 72 72-32.2 72-72zm-112 0c0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40s-40-17.9-40-40zm192 128H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMinusSquare = {\n prefix: 'far',\n iconName: 'minus-square',\n icon: [448, 512, [], \"f146\", \"M108 284c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h232c6.6 0 12 5.4 12 12v32c0 6.6-5.4 12-12 12H108zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faMoneyBillAlt = {\n prefix: 'far',\n iconName: 'money-bill-alt',\n icon: [640, 512, [], \"f3d1\", \"M320 144c-53.02 0-96 50.14-96 112 0 61.85 42.98 112 96 112 53 0 96-50.13 96-112 0-61.86-42.98-112-96-112zm40 168c0 4.42-3.58 8-8 8h-64c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h16v-55.44l-.47.31a7.992 7.992 0 0 1-11.09-2.22l-8.88-13.31a7.992 7.992 0 0 1 2.22-11.09l15.33-10.22a23.99 23.99 0 0 1 13.31-4.03H328c4.42 0 8 3.58 8 8v88h16c4.42 0 8 3.58 8 8v16zM608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zm-16 272c-35.35 0-64 28.65-64 64H112c0-35.35-28.65-64-64-64V176c35.35 0 64-28.65 64-64h416c0 35.35 28.65 64 64 64v160z\"]\n};\nvar faMoon = {\n prefix: 'far',\n iconName: 'moon',\n icon: [512, 512, [], \"f186\", \"M279.135 512c78.756 0 150.982-35.804 198.844-94.775 28.27-34.831-2.558-85.722-46.249-77.401-82.348 15.683-158.272-47.268-158.272-130.792 0-48.424 26.06-92.292 67.434-115.836 38.745-22.05 28.999-80.788-15.022-88.919A257.936 257.936 0 0 0 279.135 0c-141.36 0-256 114.575-256 256 0 141.36 114.576 256 256 256zm0-464c12.985 0 25.689 1.201 38.016 3.478-54.76 31.163-91.693 90.042-91.693 157.554 0 113.848 103.641 199.2 215.252 177.944C402.574 433.964 344.366 464 279.135 464c-114.875 0-208-93.125-208-208s93.125-208 208-208z\"]\n};\nvar faNewspaper = {\n prefix: 'far',\n iconName: 'newspaper',\n icon: [576, 512, [], \"f1ea\", \"M552 64H112c-20.858 0-38.643 13.377-45.248 32H24c-13.255 0-24 10.745-24 24v272c0 30.928 25.072 56 56 56h496c13.255 0 24-10.745 24-24V88c0-13.255-10.745-24-24-24zM48 392V144h16v248c0 4.411-3.589 8-8 8s-8-3.589-8-8zm480 8H111.422c.374-2.614.578-5.283.578-8V112h416v288zM172 280h136c6.627 0 12-5.373 12-12v-96c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v96c0 6.627 5.373 12 12 12zm28-80h80v40h-80v-40zm-40 140v-24c0-6.627 5.373-12 12-12h136c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H172c-6.627 0-12-5.373-12-12zm192 0v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0-144v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0 72v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12z\"]\n};\nvar faObjectGroup = {\n prefix: 'far',\n iconName: 'object-group',\n icon: [512, 512, [], \"f247\", \"M500 128c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v256H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V128h12zm-52-64h32v32h-32V64zM32 64h32v32H32V64zm32 384H32v-32h32v32zm416 0h-32v-32h32v32zm-40-64h-12c-6.627 0-12 5.373-12 12v12H96v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h12v256zm-36-192h-84v-52c0-6.628-5.373-12-12-12H108c-6.627 0-12 5.372-12 12v168c0 6.628 5.373 12 12 12h84v52c0 6.628 5.373 12 12 12h200c6.627 0 12-5.372 12-12V204c0-6.628-5.373-12-12-12zm-268-24h144v112H136V168zm240 176H232v-24h76c6.627 0 12-5.372 12-12v-76h56v112z\"]\n};\nvar faObjectUngroup = {\n prefix: 'far',\n iconName: 'object-ungroup',\n icon: [576, 512, [], \"f248\", \"M564 224c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12h-88v-24h12c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v160H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h88v24h-12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V224h12zM352 64h32v32h-32V64zm0 256h32v32h-32v-32zM64 352H32v-32h32v32zm0-256H32V64h32v32zm32 216v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h12v160h-12c-6.627 0-12 5.373-12 12v12H96zm128 136h-32v-32h32v32zm280-64h-12c-6.627 0-12 5.373-12 12v12H256v-12c0-6.627-5.373-12-12-12h-12v-24h88v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12v-88h88v12c0 6.627 5.373 12 12 12h12v160zm40 64h-32v-32h32v32zm0-256h-32v-32h32v32z\"]\n};\nvar faPaperPlane = {\n prefix: 'far',\n iconName: 'paper-plane',\n icon: [512, 512, [], \"f1d8\", \"M440 6.5L24 246.4c-34.4 19.9-31.1 70.8 5.7 85.9L144 379.6V464c0 46.4 59.2 65.5 86.6 28.6l43.8-59.1 111.9 46.2c5.9 2.4 12.1 3.6 18.3 3.6 8.2 0 16.3-2.1 23.6-6.2 12.8-7.2 21.6-20 23.9-34.5l59.4-387.2c6.1-40.1-36.9-68.8-71.5-48.9zM192 464v-64.6l36.6 15.1L192 464zm212.6-28.7l-153.8-63.5L391 169.5c10.7-15.5-9.5-33.5-23.7-21.2L155.8 332.6 48 288 464 48l-59.4 387.3z\"]\n};\nvar faPauseCircle = {\n prefix: 'far',\n iconName: 'pause-circle',\n icon: [512, 512, [], \"f28b\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm96-280v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16zm-112 0v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16z\"]\n};\nvar faPlayCircle = {\n prefix: 'far',\n iconName: 'play-circle',\n icon: [512, 512, [], \"f144\", \"M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z\"]\n};\nvar faPlusSquare = {\n prefix: 'far',\n iconName: 'plus-square',\n icon: [448, 512, [], \"f0fe\", \"M352 240v32c0 6.6-5.4 12-12 12h-88v88c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-88h-88c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h88v-88c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v88h88c6.6 0 12 5.4 12 12zm96-160v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faQuestionCircle = {\n prefix: 'far',\n iconName: 'question-circle',\n icon: [512, 512, [], \"f059\", \"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z\"]\n};\nvar faRegistered = {\n prefix: 'far',\n iconName: 'registered',\n icon: [512, 512, [], \"f25d\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm110.442-81.791c-53.046-96.284-50.25-91.468-53.271-96.085 24.267-13.879 39.482-41.563 39.482-73.176 0-52.503-30.247-85.252-101.498-85.252h-78.667c-6.617 0-12 5.383-12 12V380c0 6.617 5.383 12 12 12h38.568c6.617 0 12-5.383 12-12v-83.663h31.958l47.515 89.303a11.98 11.98 0 0 0 10.593 6.36h42.81c9.14 0 14.914-9.799 10.51-17.791zM256.933 239.906h-33.875v-64.14h27.377c32.417 0 38.929 12.133 38.929 31.709-.001 20.913-11.518 32.431-32.431 32.431z\"]\n};\nvar faSadCry = {\n prefix: 'far',\n iconName: 'sad-cry',\n icon: [496, 512, [], \"f5b3\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm144 386.4V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v151.4C315.5 447 282.8 456 248 456s-67.5-9-96-24.6V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v114.4c-34.6-36-56-84.7-56-138.4 0-110.3 89.7-200 200-200s200 89.7 200 200c0 53.7-21.4 102.5-56 138.4zM205.8 234.5c4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.3 7.9 4.8 13.7 1.6zM344 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.5 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm-96 92c-30.9 0-56 28.7-56 64s25.1 64 56 64 56-28.7 56-64-25.1-64-56-64z\"]\n};\nvar faSadTear = {\n prefix: 'far',\n iconName: 'sad-tear',\n icon: [496, 512, [], \"f5b4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm8-152c-13.2 0-24 10.8-24 24s10.8 24 24 24c23.8 0 46.3 10.5 61.6 28.8 8.1 9.8 23.2 11.9 33.8 3.1 10.2-8.5 11.6-23.6 3.1-33.8C330 320.8 294.1 304 256 304zm-88-64c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-165.6 98.8C151 290.1 126 325.4 126 342.9c0 22.7 18.8 41.1 42 41.1s42-18.4 42-41.1c0-17.5-25-52.8-36.4-68.1-2.8-3.7-8.4-3.7-11.2 0z\"]\n};\nvar faSave = {\n prefix: 'far',\n iconName: 'save',\n icon: [448, 512, [], \"f0c7\", \"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 0 1 1.757 4.243V426a6 6 0 0 1-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z\"]\n};\nvar faShareSquare = {\n prefix: 'far',\n iconName: 'share-square',\n icon: [576, 512, [], \"f14d\", \"M561.938 158.06L417.94 14.092C387.926-15.922 336 5.097 336 48.032v57.198c-42.45 1.88-84.03 6.55-120.76 17.99-35.17 10.95-63.07 27.58-82.91 49.42C108.22 199.2 96 232.6 96 271.94c0 61.697 33.178 112.455 84.87 144.76 37.546 23.508 85.248-12.651 71.02-55.74-15.515-47.119-17.156-70.923 84.11-78.76V336c0 42.993 51.968 63.913 81.94 33.94l143.998-144c18.75-18.74 18.75-49.14 0-67.88zM384 336V232.16C255.309 234.082 166.492 255.35 206.31 376 176.79 357.55 144 324.08 144 271.94c0-109.334 129.14-118.947 240-119.85V48l144 144-144 144zm24.74 84.493a82.658 82.658 0 0 0 20.974-9.303c7.976-4.952 18.286.826 18.286 10.214V464c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h132c6.627 0 12 5.373 12 12v4.486c0 4.917-2.987 9.369-7.569 11.152-13.702 5.331-26.396 11.537-38.05 18.585a12.138 12.138 0 0 1-6.28 1.777H54a6 6 0 0 0-6 6v340a6 6 0 0 0 6 6h340a6 6 0 0 0 6-6v-25.966c0-5.37 3.579-10.059 8.74-11.541z\"]\n};\nvar faSmile = {\n prefix: 'far',\n iconName: 'smile',\n icon: [496, 512, [], \"f118\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm4 72.6c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.1-8.4-25.3-7.1-33.8 3.1z\"]\n};\nvar faSmileBeam = {\n prefix: 'far',\n iconName: 'smile-beam',\n icon: [496, 512, [], \"f5b8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm84-143.4c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.6-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.2-8.4-25.3-7.1-33.8 3.1zM136.5 211c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.4 1.1 7.4-.5 9.3-3.7l9.5-17zM328 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4z\"]\n};\nvar faSmileWink = {\n prefix: 'far',\n iconName: 'smile-wink',\n icon: [496, 512, [], \"f4da\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm117.8-146.4c-10.2-8.5-25.3-7.1-33.8 3.1-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-60c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1z\"]\n};\nvar faSnowflake = {\n prefix: 'far',\n iconName: 'snowflake',\n icon: [448, 512, [], \"f2dc\", \"M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z\"]\n};\nvar faSquare = {\n prefix: 'far',\n iconName: 'square',\n icon: [448, 512, [], \"f0c8\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h340c3.3 0 6 2.7 6 6v340c0 3.3-2.7 6-6 6z\"]\n};\nvar faStar = {\n prefix: 'far',\n iconName: 'star',\n icon: [576, 512, [], \"f005\", \"M528.1 171.5L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6zM388.6 312.3l23.7 138.4L288 385.4l-124.3 65.3 23.7-138.4-100.6-98 139-20.2 62.2-126 62.2 126 139 20.2-100.6 98z\"]\n};\nvar faStarHalf = {\n prefix: 'far',\n iconName: 'star-half',\n icon: [576, 512, [], \"f089\", \"M288 385.3l-124.3 65.4 23.7-138.4-100.6-98 139-20.2 62.2-126V0c-11.4 0-22.8 5.9-28.7 17.8L194 150.2 47.9 171.4c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.1 23 46 46.4 33.7L288 439.6v-54.3z\"]\n};\nvar faStickyNote = {\n prefix: 'far',\n iconName: 'sticky-note',\n icon: [448, 512, [], \"f249\", \"M448 348.106V80c0-26.51-21.49-48-48-48H48C21.49 32 0 53.49 0 80v351.988c0 26.51 21.49 48 48 48h268.118a48 48 0 0 0 33.941-14.059l83.882-83.882A48 48 0 0 0 448 348.106zm-128 80v-76.118h76.118L320 428.106zM400 80v223.988H296c-13.255 0-24 10.745-24 24v104H48V80h352z\"]\n};\nvar faStopCircle = {\n prefix: 'far',\n iconName: 'stop-circle',\n icon: [512, 512, [], \"f28d\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm296-80v160c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16z\"]\n};\nvar faSun = {\n prefix: 'far',\n iconName: 'sun',\n icon: [512, 512, [], \"f185\", \"M494.2 221.9l-59.8-40.5 13.7-71c2.6-13.2-1.6-26.8-11.1-36.4-9.6-9.5-23.2-13.7-36.2-11.1l-70.9 13.7-40.4-59.9c-15.1-22.3-51.9-22.3-67 0l-40.4 59.9-70.8-13.7C98 60.4 84.5 64.5 75 74.1c-9.5 9.6-13.7 23.1-11.1 36.3l13.7 71-59.8 40.5C6.6 229.5 0 242 0 255.5s6.7 26 17.8 33.5l59.8 40.5-13.7 71c-2.6 13.2 1.6 26.8 11.1 36.3 9.5 9.5 22.9 13.7 36.3 11.1l70.8-13.7 40.4 59.9C230 505.3 242.6 512 256 512s26-6.7 33.5-17.8l40.4-59.9 70.9 13.7c13.4 2.7 26.8-1.6 36.3-11.1 9.5-9.5 13.6-23.1 11.1-36.3l-13.7-71 59.8-40.5c11.1-7.5 17.8-20.1 17.8-33.5-.1-13.6-6.7-26.1-17.9-33.7zm-112.9 85.6l17.6 91.2-91-17.6L256 458l-51.9-77-90.9 17.6 17.6-91.2-76.8-52 76.8-52-17.6-91.2 91 17.6L256 53l51.9 76.9 91-17.6-17.6 91.1 76.8 52-76.8 52.1zM256 152c-57.3 0-104 46.7-104 104s46.7 104 104 104 104-46.7 104-104-46.7-104-104-104zm0 160c-30.9 0-56-25.1-56-56s25.1-56 56-56 56 25.1 56 56-25.1 56-56 56z\"]\n};\nvar faSurprise = {\n prefix: 'far',\n iconName: 'surprise',\n icon: [496, 512, [], \"f5c2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-176c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zm-48-72c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faThumbsDown = {\n prefix: 'far',\n iconName: 'thumbs-down',\n icon: [512, 512, [], \"f165\", \"M466.27 225.31c4.674-22.647.864-44.538-8.99-62.99 2.958-23.868-4.021-48.565-17.34-66.99C438.986 39.423 404.117 0 327 0c-7 0-15 .01-22.22.01C201.195.01 168.997 40 128 40h-10.845c-5.64-4.975-13.042-8-21.155-8H32C14.327 32 0 46.327 0 64v240c0 17.673 14.327 32 32 32h64c11.842 0 22.175-6.438 27.708-16h7.052c19.146 16.953 46.013 60.653 68.76 83.4 13.667 13.667 10.153 108.6 71.76 108.6 57.58 0 95.27-31.936 95.27-104.73 0-18.41-3.93-33.73-8.85-46.54h36.48c48.602 0 85.82-41.565 85.82-85.58 0-19.15-4.96-34.99-13.73-49.84zM64 296c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zm330.18 16.73H290.19c0 37.82 28.36 55.37 28.36 94.54 0 23.75 0 56.73-47.27 56.73-18.91-18.91-9.46-66.18-37.82-94.54C206.9 342.89 167.28 272 138.92 272H128V85.83c53.611 0 100.001-37.82 171.64-37.82h37.82c35.512 0 60.82 17.12 53.12 65.9 15.2 8.16 26.5 36.44 13.94 57.57 21.581 20.384 18.699 51.065 5.21 65.62 9.45 0 22.36 18.91 22.27 37.81-.09 18.91-16.71 37.82-37.82 37.82z\"]\n};\nvar faThumbsUp = {\n prefix: 'far',\n iconName: 'thumbs-up',\n icon: [512, 512, [], \"f164\", \"M466.27 286.69C475.04 271.84 480 256 480 236.85c0-44.015-37.218-85.58-85.82-85.58H357.7c4.92-12.81 8.85-28.13 8.85-46.54C366.55 31.936 328.86 0 271.28 0c-61.607 0-58.093 94.933-71.76 108.6-22.747 22.747-49.615 66.447-68.76 83.4H32c-17.673 0-32 14.327-32 32v240c0 17.673 14.327 32 32 32h64c14.893 0 27.408-10.174 30.978-23.95 44.509 1.001 75.06 39.94 177.802 39.94 7.22 0 15.22.01 22.22.01 77.117 0 111.986-39.423 112.94-95.33 13.319-18.425 20.299-43.122 17.34-66.99 9.854-18.452 13.664-40.343 8.99-62.99zm-61.75 53.83c12.56 21.13 1.26 49.41-13.94 57.57 7.7 48.78-17.608 65.9-53.12 65.9h-37.82c-71.639 0-118.029-37.82-171.64-37.82V240h10.92c28.36 0 67.98-70.89 94.54-97.46 28.36-28.36 18.91-75.63 37.82-94.54 47.27 0 47.27 32.98 47.27 56.73 0 39.17-28.36 56.72-28.36 94.54h103.99c21.11 0 37.73 18.91 37.82 37.82.09 18.9-12.82 37.81-22.27 37.81 13.489 14.555 16.371 45.236-5.21 65.62zM88 432c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faTimesCircle = {\n prefix: 'far',\n iconName: 'times-circle',\n icon: [512, 512, [], \"f057\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z\"]\n};\nvar faTired = {\n prefix: 'far',\n iconName: 'tired',\n icon: [496, 512, [], \"f5c8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm129.1-303.8c-3.8-4.4-10.3-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.8 1.6 15.3-2.5 3.8-4.5 3.9-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zM220 208c0-4.2-2.2-8.1-5.8-10.3l-80-48c-5-3-11.5-1.9-15.3 2.5-3.8 4.5-3.9 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.5 4.1 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3zm28 64c-45.4 0-100.9 38.3-107.8 93.3-1.5 11.8 6.9 21.6 15.5 17.9C178.4 373.5 212 368 248 368s69.6 5.5 92.3 15.2c8.5 3.7 17-6 15.5-17.9-6.9-55-62.4-93.3-107.8-93.3z\"]\n};\nvar faTrashAlt = {\n prefix: 'far',\n iconName: 'trash-alt',\n icon: [448, 512, [], \"f2ed\", \"M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z\"]\n};\nvar faUser = {\n prefix: 'far',\n iconName: 'user',\n icon: [448, 512, [], \"f007\", \"M313.6 304c-28.7 0-42.5 16-89.6 16-47.1 0-60.8-16-89.6-16C60.2 304 0 364.2 0 438.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-25.6c0-74.2-60.2-134.4-134.4-134.4zM400 464H48v-25.6c0-47.6 38.8-86.4 86.4-86.4 14.6 0 38.3 16 89.6 16 51.7 0 74.9-16 89.6-16 47.6 0 86.4 38.8 86.4 86.4V464zM224 288c79.5 0 144-64.5 144-144S303.5 0 224 0 80 64.5 80 144s64.5 144 144 144zm0-240c52.9 0 96 43.1 96 96s-43.1 96-96 96-96-43.1-96-96 43.1-96 96-96z\"]\n};\nvar faUserCircle = {\n prefix: 'far',\n iconName: 'user-circle',\n icon: [496, 512, [], \"f2bd\", \"M248 104c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96zm0 144c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-240C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-49.7 0-95.1-18.3-130.1-48.4 14.9-23 40.4-38.6 69.6-39.5 20.8 6.4 40.6 9.6 60.5 9.6s39.7-3.1 60.5-9.6c29.2 1 54.7 16.5 69.6 39.5-35 30.1-80.4 48.4-130.1 48.4zm162.7-84.1c-24.4-31.4-62.1-51.9-105.1-51.9-10.2 0-26 9.6-57.6 9.6-31.5 0-47.4-9.6-57.6-9.6-42.9 0-80.6 20.5-105.1 51.9C61.9 339.2 48 299.2 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 43.2-13.9 83.2-37.3 115.9z\"]\n};\nvar faWindowClose = {\n prefix: 'far',\n iconName: 'window-close',\n icon: [512, 512, [], \"f410\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z\"]\n};\nvar faWindowMaximize = {\n prefix: 'far',\n iconName: 'window-maximize',\n icon: [512, 512, [], \"f2d0\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V192h416v234z\"]\n};\nvar faWindowMinimize = {\n prefix: 'far',\n iconName: 'window-minimize',\n icon: [512, 512, [], \"f2d1\", \"M480 480H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h448c17.7 0 32 14.3 32 32s-14.3 32-32 32z\"]\n};\nvar faWindowRestore = {\n prefix: 'far',\n iconName: 'window-restore',\n icon: [512, 512, [], \"f2d2\", \"M464 0H144c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h48c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-96 464H48V256h320v208zm96-96h-48V144c0-26.5-21.5-48-48-48H144V48h320v320z\"]\n};\nvar _iconsCache = {\n faAddressBook: faAddressBook,\n faAddressCard: faAddressCard,\n faAngry: faAngry,\n faArrowAltCircleDown: faArrowAltCircleDown,\n faArrowAltCircleLeft: faArrowAltCircleLeft,\n faArrowAltCircleRight: faArrowAltCircleRight,\n faArrowAltCircleUp: faArrowAltCircleUp,\n faBell: faBell,\n faBellSlash: faBellSlash,\n faBookmark: faBookmark,\n faBuilding: faBuilding,\n faCalendar: faCalendar,\n faCalendarAlt: faCalendarAlt,\n faCalendarCheck: faCalendarCheck,\n faCalendarMinus: faCalendarMinus,\n faCalendarPlus: faCalendarPlus,\n faCalendarTimes: faCalendarTimes,\n faCaretSquareDown: faCaretSquareDown,\n faCaretSquareLeft: faCaretSquareLeft,\n faCaretSquareRight: faCaretSquareRight,\n faCaretSquareUp: faCaretSquareUp,\n faChartBar: faChartBar,\n faCheckCircle: faCheckCircle,\n faCheckSquare: faCheckSquare,\n faCircle: faCircle,\n faClipboard: faClipboard,\n faClock: faClock,\n faClone: faClone,\n faClosedCaptioning: faClosedCaptioning,\n faComment: faComment,\n faCommentAlt: faCommentAlt,\n faCommentDots: faCommentDots,\n faComments: faComments,\n faCompass: faCompass,\n faCopy: faCopy,\n faCopyright: faCopyright,\n faCreditCard: faCreditCard,\n faDizzy: faDizzy,\n faDotCircle: faDotCircle,\n faEdit: faEdit,\n faEnvelope: faEnvelope,\n faEnvelopeOpen: faEnvelopeOpen,\n faEye: faEye,\n faEyeSlash: faEyeSlash,\n faFile: faFile,\n faFileAlt: faFileAlt,\n faFileArchive: faFileArchive,\n faFileAudio: faFileAudio,\n faFileCode: faFileCode,\n faFileExcel: faFileExcel,\n faFileImage: faFileImage,\n faFilePdf: faFilePdf,\n faFilePowerpoint: faFilePowerpoint,\n faFileVideo: faFileVideo,\n faFileWord: faFileWord,\n faFlag: faFlag,\n faFlushed: faFlushed,\n faFolder: faFolder,\n faFolderOpen: faFolderOpen,\n faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n faFrown: faFrown,\n faFrownOpen: faFrownOpen,\n faFutbol: faFutbol,\n faGem: faGem,\n faGrimace: faGrimace,\n faGrin: faGrin,\n faGrinAlt: faGrinAlt,\n faGrinBeam: faGrinBeam,\n faGrinBeamSweat: faGrinBeamSweat,\n faGrinHearts: faGrinHearts,\n faGrinSquint: faGrinSquint,\n faGrinSquintTears: faGrinSquintTears,\n faGrinStars: faGrinStars,\n faGrinTears: faGrinTears,\n faGrinTongue: faGrinTongue,\n faGrinTongueSquint: faGrinTongueSquint,\n faGrinTongueWink: faGrinTongueWink,\n faGrinWink: faGrinWink,\n faHandLizard: faHandLizard,\n faHandPaper: faHandPaper,\n faHandPeace: faHandPeace,\n faHandPointDown: faHandPointDown,\n faHandPointLeft: faHandPointLeft,\n faHandPointRight: faHandPointRight,\n faHandPointUp: faHandPointUp,\n faHandPointer: faHandPointer,\n faHandRock: faHandRock,\n faHandScissors: faHandScissors,\n faHandSpock: faHandSpock,\n faHandshake: faHandshake,\n faHdd: faHdd,\n faHeart: faHeart,\n faHospital: faHospital,\n faHourglass: faHourglass,\n faIdBadge: faIdBadge,\n faIdCard: faIdCard,\n faImage: faImage,\n faImages: faImages,\n faKeyboard: faKeyboard,\n faKiss: faKiss,\n faKissBeam: faKissBeam,\n faKissWinkHeart: faKissWinkHeart,\n faLaugh: faLaugh,\n faLaughBeam: faLaughBeam,\n faLaughSquint: faLaughSquint,\n faLaughWink: faLaughWink,\n faLemon: faLemon,\n faLifeRing: faLifeRing,\n faLightbulb: faLightbulb,\n faListAlt: faListAlt,\n faMap: faMap,\n faMeh: faMeh,\n faMehBlank: faMehBlank,\n faMehRollingEyes: faMehRollingEyes,\n faMinusSquare: faMinusSquare,\n faMoneyBillAlt: faMoneyBillAlt,\n faMoon: faMoon,\n faNewspaper: faNewspaper,\n faObjectGroup: faObjectGroup,\n faObjectUngroup: faObjectUngroup,\n faPaperPlane: faPaperPlane,\n faPauseCircle: faPauseCircle,\n faPlayCircle: faPlayCircle,\n faPlusSquare: faPlusSquare,\n faQuestionCircle: faQuestionCircle,\n faRegistered: faRegistered,\n faSadCry: faSadCry,\n faSadTear: faSadTear,\n faSave: faSave,\n faShareSquare: faShareSquare,\n faSmile: faSmile,\n faSmileBeam: faSmileBeam,\n faSmileWink: faSmileWink,\n faSnowflake: faSnowflake,\n faSquare: faSquare,\n faStar: faStar,\n faStarHalf: faStarHalf,\n faStickyNote: faStickyNote,\n faStopCircle: faStopCircle,\n faSun: faSun,\n faSurprise: faSurprise,\n faThumbsDown: faThumbsDown,\n faThumbsUp: faThumbsUp,\n faTimesCircle: faTimesCircle,\n faTired: faTired,\n faTrashAlt: faTrashAlt,\n faUser: faUser,\n faUserCircle: faUserCircle,\n faWindowClose: faWindowClose,\n faWindowMaximize: faWindowMaximize,\n faWindowMinimize: faWindowMinimize,\n faWindowRestore: faWindowRestore\n};\n\nexport { _iconsCache as far, prefix, faAddressBook, faAddressCard, faAngry, faArrowAltCircleDown, faArrowAltCircleLeft, faArrowAltCircleRight, faArrowAltCircleUp, faBell, faBellSlash, faBookmark, faBuilding, faCalendar, faCalendarAlt, faCalendarCheck, faCalendarMinus, faCalendarPlus, faCalendarTimes, faCaretSquareDown, faCaretSquareLeft, faCaretSquareRight, faCaretSquareUp, faChartBar, faCheckCircle, faCheckSquare, faCircle, faClipboard, faClock, faClone, faClosedCaptioning, faComment, faCommentAlt, faCommentDots, faComments, faCompass, faCopy, faCopyright, faCreditCard, faDizzy, faDotCircle, faEdit, faEnvelope, faEnvelopeOpen, faEye, faEyeSlash, faFile, faFileAlt, faFileArchive, faFileAudio, faFileCode, faFileExcel, faFileImage, faFilePdf, faFilePowerpoint, faFileVideo, faFileWord, faFlag, faFlushed, faFolder, faFolderOpen, faFontAwesomeLogoFull, faFrown, faFrownOpen, faFutbol, faGem, faGrimace, faGrin, faGrinAlt, faGrinBeam, faGrinBeamSweat, faGrinHearts, faGrinSquint, faGrinSquintTears, faGrinStars, faGrinTears, faGrinTongue, faGrinTongueSquint, faGrinTongueWink, faGrinWink, faHandLizard, faHandPaper, faHandPeace, faHandPointDown, faHandPointLeft, faHandPointRight, faHandPointUp, faHandPointer, faHandRock, faHandScissors, faHandSpock, faHandshake, faHdd, faHeart, faHospital, faHourglass, faIdBadge, faIdCard, faImage, faImages, faKeyboard, faKiss, faKissBeam, faKissWinkHeart, faLaugh, faLaughBeam, faLaughSquint, faLaughWink, faLemon, faLifeRing, faLightbulb, faListAlt, faMap, faMeh, faMehBlank, faMehRollingEyes, faMinusSquare, faMoneyBillAlt, faMoon, faNewspaper, faObjectGroup, faObjectUngroup, faPaperPlane, faPauseCircle, faPlayCircle, faPlusSquare, faQuestionCircle, faRegistered, faSadCry, faSadTear, faSave, faShareSquare, faSmile, faSmileBeam, faSmileWink, faSnowflake, faSquare, faStar, faStarHalf, faStickyNote, faStopCircle, faSun, faSurprise, faThumbsDown, faThumbsUp, faTimesCircle, faTired, faTrashAlt, faUser, faUserCircle, faWindowClose, faWindowMaximize, faWindowMinimize, faWindowRestore };\n", + "var prefix = \"fas\";\nvar faAd = {\n prefix: 'fas',\n iconName: 'ad',\n icon: [512, 512, [], \"f641\", \"M157.52 272h36.96L176 218.78 157.52 272zM352 256c-13.23 0-24 10.77-24 24s10.77 24 24 24 24-10.77 24-24-10.77-24-24-24zM464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM250.58 352h-16.94c-6.81 0-12.88-4.32-15.12-10.75L211.15 320h-70.29l-7.38 21.25A16 16 0 0 1 118.36 352h-16.94c-11.01 0-18.73-10.85-15.12-21.25L140 176.12A23.995 23.995 0 0 1 162.67 160h26.66A23.99 23.99 0 0 1 212 176.13l53.69 154.62c3.61 10.4-4.11 21.25-15.11 21.25zM424 336c0 8.84-7.16 16-16 16h-16c-4.85 0-9.04-2.27-11.98-5.68-8.62 3.66-18.09 5.68-28.02 5.68-39.7 0-72-32.3-72-72s32.3-72 72-72c8.46 0 16.46 1.73 24 4.42V176c0-8.84 7.16-16 16-16h16c8.84 0 16 7.16 16 16v160z\"]\n};\nvar faAddressBook = {\n prefix: 'fas',\n iconName: 'address-book',\n icon: [448, 512, [], \"f2b9\", \"M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-228-32c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H118.4C106 384 96 375.4 96 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z\"]\n};\nvar faAddressCard = {\n prefix: 'fas',\n iconName: 'address-card',\n icon: [576, 512, [], \"f2bb\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-352 96c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H86.4C74 384 64 375.4 64 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2zM512 312c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faAdjust = {\n prefix: 'fas',\n iconName: 'adjust',\n icon: [512, 512, [], \"f042\", \"M8 256c0 136.966 111.033 248 248 248s248-111.034 248-248S392.966 8 256 8 8 119.033 8 256zm248 184V72c101.705 0 184 82.311 184 184 0 101.705-82.311 184-184 184z\"]\n};\nvar faAirFreshener = {\n prefix: 'fas',\n iconName: 'air-freshener',\n icon: [384, 512, [], \"f5d0\", \"M378.94 321.41L284.7 224h49.22c15.3 0 23.66-16.6 13.86-27.53L234.45 69.96c3.43-6.61 5.55-14 5.55-21.96 0-26.51-21.49-48-48-48s-48 21.49-48 48c0 7.96 2.12 15.35 5.55 21.96L36.22 196.47C26.42 207.4 34.78 224 50.08 224H99.3L5.06 321.41C-6.69 333.56 3.34 352 21.7 352H160v32H48c-8.84 0-16 7.16-16 16v96c0 8.84 7.16 16 16 16h288c8.84 0 16-7.16 16-16v-96c0-8.84-7.16-16-16-16H224v-32h138.3c18.36 0 28.39-18.44 16.64-30.59zM192 31.98c8.85 0 16.02 7.17 16.02 16.02 0 8.84-7.17 16.02-16.02 16.02S175.98 56.84 175.98 48c0-8.85 7.17-16.02 16.02-16.02zM304 432v32H80v-32h224z\"]\n};\nvar faAlignCenter = {\n prefix: 'fas',\n iconName: 'align-center',\n icon: [448, 512, [], \"f037\", \"M432 160H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 256H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM108.1 96h231.81A12.09 12.09 0 0 0 352 83.9V44.09A12.09 12.09 0 0 0 339.91 32H108.1A12.09 12.09 0 0 0 96 44.09V83.9A12.1 12.1 0 0 0 108.1 96zm231.81 256A12.09 12.09 0 0 0 352 339.9v-39.81A12.09 12.09 0 0 0 339.91 288H108.1A12.09 12.09 0 0 0 96 300.09v39.81a12.1 12.1 0 0 0 12.1 12.1z\"]\n};\nvar faAlignJustify = {\n prefix: 'fas',\n iconName: 'align-justify',\n icon: [448, 512, [], \"f039\", \"M432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faAlignLeft = {\n prefix: 'fas',\n iconName: 'align-left',\n icon: [448, 512, [], \"f036\", \"M12.83 352h262.34A12.82 12.82 0 0 0 288 339.17v-38.34A12.82 12.82 0 0 0 275.17 288H12.83A12.82 12.82 0 0 0 0 300.83v38.34A12.82 12.82 0 0 0 12.83 352zm0-256h262.34A12.82 12.82 0 0 0 288 83.17V44.83A12.82 12.82 0 0 0 275.17 32H12.83A12.82 12.82 0 0 0 0 44.83v38.34A12.82 12.82 0 0 0 12.83 96zM432 160H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 256H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faAlignRight = {\n prefix: 'fas',\n iconName: 'align-right',\n icon: [448, 512, [], \"f038\", \"M16 224h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm416 192H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm3.17-384H172.83A12.82 12.82 0 0 0 160 44.83v38.34A12.82 12.82 0 0 0 172.83 96h262.34A12.82 12.82 0 0 0 448 83.17V44.83A12.82 12.82 0 0 0 435.17 32zm0 256H172.83A12.82 12.82 0 0 0 160 300.83v38.34A12.82 12.82 0 0 0 172.83 352h262.34A12.82 12.82 0 0 0 448 339.17v-38.34A12.82 12.82 0 0 0 435.17 288z\"]\n};\nvar faAllergies = {\n prefix: 'fas',\n iconName: 'allergies',\n icon: [448, 512, [], \"f461\", \"M416 112c-17.6 0-32 14.4-32 32v72c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V64c0-17.6-14.4-32-32-32s-32 14.4-32 32v152c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V32c0-17.6-14.4-32-32-32s-32 14.4-32 32v184c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V64c0-17.6-14.4-32-32-32S96 46.4 96 64v241l-23.6-32.5c-13-17.9-38-21.8-55.9-8.8s-21.8 38-8.8 55.9l125.6 172.7c9 12.4 23.5 19.8 38.8 19.8h197.6c22.3 0 41.6-15.3 46.7-37l26.5-112.7c3.2-13.7 4.9-28.3 5.1-42.3V144c0-17.6-14.4-32-32-32zM176 416c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-96c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm64 128c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-96c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm64 32c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm32 64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm32-128c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faAmbulance = {\n prefix: 'fas',\n iconName: 'ambulance',\n icon: [640, 512, [], \"f0f9\", \"M624 352h-16V243.9c0-12.7-5.1-24.9-14.1-33.9L494 110.1c-9-9-21.2-14.1-33.9-14.1H416V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h16c0 53 43 96 96 96s96-43 96-96h128c0 53 43 96 96 96s96-43 96-96h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM160 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm144-248c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48zm176 248c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-208H416V144h44.1l99.9 99.9V256z\"]\n};\nvar faAmericanSignLanguageInterpreting = {\n prefix: 'fas',\n iconName: 'american-sign-language-interpreting',\n icon: [640, 512, [], \"f2a3\", \"M290.547 189.039c-20.295-10.149-44.147-11.199-64.739-3.89 42.606 0 71.208 20.475 85.578 50.576 8.576 17.899-5.148 38.071-23.617 38.071 18.429 0 32.211 20.136 23.617 38.071-14.725 30.846-46.123 50.854-80.298 50.854-.557 0-94.471-8.615-94.471-8.615l-66.406 33.347c-9.384 4.693-19.815.379-23.895-7.781L1.86 290.747c-4.167-8.615-1.111-18.897 6.946-23.621l58.072-33.069L108 159.861c6.39-57.245 34.731-109.767 79.743-146.726 11.391-9.448 28.341-7.781 37.51 3.613 9.446 11.394 7.78 28.067-3.612 37.516-12.503 10.559-23.618 22.509-32.509 35.57 21.672-14.729 46.679-24.732 74.186-28.067 14.725-1.945 28.063 8.336 29.73 23.065 1.945 14.728-8.336 28.067-23.062 29.734-16.116 1.945-31.12 7.503-44.178 15.284 26.114-5.713 58.712-3.138 88.079 11.115 13.336 6.669 18.893 22.509 12.224 35.848-6.389 13.06-22.504 18.617-35.564 12.226zm-27.229 69.472c-6.112-12.505-18.338-20.286-32.231-20.286a35.46 35.46 0 0 0-35.565 35.57c0 21.428 17.808 35.57 35.565 35.57 13.893 0 26.119-7.781 32.231-20.286 4.446-9.449 13.614-15.006 23.339-15.284-9.725-.277-18.893-5.835-23.339-15.284zm374.821-37.237c4.168 8.615 1.111 18.897-6.946 23.621l-58.071 33.069L532 352.16c-6.39 57.245-34.731 109.767-79.743 146.726-10.932 9.112-27.799 8.144-37.51-3.613-9.446-11.394-7.78-28.067 3.613-37.516 12.503-10.559 23.617-22.509 32.508-35.57-21.672 14.729-46.679 24.732-74.186 28.067-10.021 2.506-27.552-5.643-29.73-23.065-1.945-14.728 8.336-28.067 23.062-29.734 16.116-1.946 31.12-7.503 44.178-15.284-26.114 5.713-58.712 3.138-88.079-11.115-13.336-6.669-18.893-22.509-12.224-35.848 6.389-13.061 22.505-18.619 35.565-12.227 20.295 10.149 44.147 11.199 64.739 3.89-42.606 0-71.208-20.475-85.578-50.576-8.576-17.899 5.148-38.071 23.617-38.071-18.429 0-32.211-20.136-23.617-38.071 14.033-29.396 44.039-50.887 81.966-50.854l92.803 8.615 66.406-33.347c9.408-4.704 19.828-.354 23.894 7.781l44.455 88.926zm-229.227-18.618c-13.893 0-26.119 7.781-32.231 20.286-4.446 9.449-13.614 15.006-23.339 15.284 9.725.278 18.893 5.836 23.339 15.284 6.112 12.505 18.338 20.286 32.231 20.286a35.46 35.46 0 0 0 35.565-35.57c0-21.429-17.808-35.57-35.565-35.57z\"]\n};\nvar faAnchor = {\n prefix: 'fas',\n iconName: 'anchor',\n icon: [576, 512, [], \"f13d\", \"M12.971 352h32.394C67.172 454.735 181.944 512 288 512c106.229 0 220.853-57.38 242.635-160h32.394c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0l-67.029 67.029c-7.56 7.56-2.206 20.485 8.485 20.485h35.146c-20.29 54.317-84.963 86.588-144.117 94.015V256h52c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-52v-5.47c37.281-13.178 63.995-48.725 64-90.518C384.005 43.772 341.605.738 289.37.01 235.723-.739 192 42.525 192 96c0 41.798 26.716 77.35 64 90.53V192h-52c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h52v190.015c-58.936-7.399-123.82-39.679-144.117-94.015h35.146c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0L4.485 331.515C-3.074 339.074 2.28 352 12.971 352zM288 64c17.645 0 32 14.355 32 32s-14.355 32-32 32-32-14.355-32-32 14.355-32 32-32z\"]\n};\nvar faAngleDoubleDown = {\n prefix: 'fas',\n iconName: 'angle-double-down',\n icon: [320, 512, [], \"f103\", \"M143 256.3L7 120.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0L313 86.3c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.4 9.5-24.6 9.5-34 .1zm34 192l136-136c9.4-9.4 9.4-24.6 0-33.9l-22.6-22.6c-9.4-9.4-24.6-9.4-33.9 0L160 352.1l-96.4-96.4c-9.4-9.4-24.6-9.4-33.9 0L7 278.3c-9.4 9.4-9.4 24.6 0 33.9l136 136c9.4 9.5 24.6 9.5 34 .1z\"]\n};\nvar faAngleDoubleLeft = {\n prefix: 'fas',\n iconName: 'angle-double-left',\n icon: [448, 512, [], \"f100\", \"M223.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L319.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L393.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34zm-192 34l136 136c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9L127.9 256l96.4-96.4c9.4-9.4 9.4-24.6 0-33.9L201.7 103c-9.4-9.4-24.6-9.4-33.9 0l-136 136c-9.5 9.4-9.5 24.6-.1 34z\"]\n};\nvar faAngleDoubleRight = {\n prefix: 'fas',\n iconName: 'angle-double-right',\n icon: [448, 512, [], \"f101\", \"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34zm192-34l-136-136c-9.4-9.4-24.6-9.4-33.9 0l-22.6 22.6c-9.4 9.4-9.4 24.6 0 33.9l96.4 96.4-96.4 96.4c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l136-136c9.4-9.2 9.4-24.4 0-33.8z\"]\n};\nvar faAngleDoubleUp = {\n prefix: 'fas',\n iconName: 'angle-double-up',\n icon: [320, 512, [], \"f102\", \"M177 255.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 351.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 425.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1zm-34-192L7 199.7c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l96.4-96.4 96.4 96.4c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9l-136-136c-9.2-9.4-24.4-9.4-33.8 0z\"]\n};\nvar faAngleDown = {\n prefix: 'fas',\n iconName: 'angle-down',\n icon: [320, 512, [], \"f107\", \"M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z\"]\n};\nvar faAngleLeft = {\n prefix: 'fas',\n iconName: 'angle-left',\n icon: [256, 512, [], \"f104\", \"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\"]\n};\nvar faAngleRight = {\n prefix: 'fas',\n iconName: 'angle-right',\n icon: [256, 512, [], \"f105\", \"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"]\n};\nvar faAngleUp = {\n prefix: 'fas',\n iconName: 'angle-up',\n icon: [320, 512, [], \"f106\", \"M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z\"]\n};\nvar faAngry = {\n prefix: 'fas',\n iconName: 'angry',\n icon: [496, 512, [], \"f556\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM136 240c0-9.3 4.1-17.5 10.5-23.4l-31-9.3c-8.5-2.5-13.3-11.5-10.7-19.9 2.5-8.5 11.4-13.2 19.9-10.7l80 24c8.5 2.5 13.3 11.5 10.7 19.9-2.1 6.9-8.4 11.4-15.3 11.4-.5 0-1.1-.2-1.7-.2.7 2.7 1.7 5.3 1.7 8.2 0 17.7-14.3 32-32 32S136 257.7 136 240zm168 154.2c-27.8-33.4-84.2-33.4-112.1 0-13.5 16.3-38.2-4.2-24.6-20.5 20-24 49.4-37.8 80.6-37.8s60.6 13.8 80.6 37.8c13.8 16.5-11.1 36.6-24.5 20.5zm76.6-186.9l-31 9.3c6.3 5.8 10.5 14.1 10.5 23.4 0 17.7-14.3 32-32 32s-32-14.3-32-32c0-2.9.9-5.6 1.7-8.2-.6.1-1.1.2-1.7.2-6.9 0-13.2-4.5-15.3-11.4-2.5-8.5 2.3-17.4 10.7-19.9l80-24c8.4-2.5 17.4 2.3 19.9 10.7 2.5 8.5-2.3 17.4-10.8 19.9z\"]\n};\nvar faAnkh = {\n prefix: 'fas',\n iconName: 'ankh',\n icon: [320, 512, [], \"f644\", \"M296 256h-44.62C272.46 222.01 288 181.65 288 144 288 55.63 230.69 0 160 0S32 55.63 32 144c0 37.65 15.54 78.01 36.62 112H24c-13.25 0-24 10.74-24 24v32c0 13.25 10.75 24 24 24h96v152c0 13.25 10.75 24 24 24h32c13.25 0 24-10.75 24-24V336h96c13.25 0 24-10.75 24-24v-32c0-13.26-10.75-24-24-24zM160 80c29.61 0 48 24.52 48 64 0 34.66-27.14 78.14-48 100.87-20.86-22.72-48-66.21-48-100.87 0-39.48 18.39-64 48-64z\"]\n};\nvar faAppleAlt = {\n prefix: 'fas',\n iconName: 'apple-alt',\n icon: [448, 512, [], \"f5d1\", \"M350.85 129c25.97 4.67 47.27 18.67 63.92 42 14.65 20.67 24.64 46.67 29.96 78 4.67 28.67 4.32 57.33-1 86-7.99 47.33-23.97 87-47.94 119-28.64 38.67-64.59 58-107.87 58-10.66 0-22.3-3.33-34.96-10-8.66-5.33-18.31-8-28.97-8s-20.3 2.67-28.97 8c-12.66 6.67-24.3 10-34.96 10-43.28 0-79.23-19.33-107.87-58-23.97-32-39.95-71.67-47.94-119-5.32-28.67-5.67-57.33-1-86 5.32-31.33 15.31-57.33 29.96-78 16.65-23.33 37.95-37.33 63.92-42 15.98-2.67 37.95-.33 65.92 7 23.97 6.67 44.28 14.67 60.93 24 16.65-9.33 36.96-17.33 60.93-24 27.98-7.33 49.96-9.67 65.94-7zm-54.94-41c-9.32 8.67-21.65 15-36.96 19-10.66 3.33-22.3 5-34.96 5l-14.98-1c-1.33-9.33-1.33-20 0-32 2.67-24 10.32-42.33 22.97-55 9.32-8.67 21.65-15 36.96-19 10.66-3.33 22.3-5 34.96-5l14.98 1 1 15c0 12.67-1.67 24.33-4.99 35-3.99 15.33-10.31 27.67-18.98 37z\"]\n};\nvar faArchive = {\n prefix: 'fas',\n iconName: 'archive',\n icon: [512, 512, [], \"f187\", \"M32 448c0 17.7 14.3 32 32 32h384c17.7 0 32-14.3 32-32V160H32v288zm160-212c0-6.6 5.4-12 12-12h104c6.6 0 12 5.4 12 12v8c0 6.6-5.4 12-12 12H204c-6.6 0-12-5.4-12-12v-8zM480 32H32C14.3 32 0 46.3 0 64v48c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16V64c0-17.7-14.3-32-32-32z\"]\n};\nvar faArchway = {\n prefix: 'fas',\n iconName: 'archway',\n icon: [576, 512, [], \"f557\", \"M560 448h-16V96H32v352H16.02c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16H176c8.84 0 16-7.16 16-16V320c0-53.02 42.98-96 96-96s96 42.98 96 96l.02 160v16c0 8.84 7.16 16 16 16H560c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm0-448H16C7.16 0 0 7.16 0 16v32c0 8.84 7.16 16 16 16h544c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16z\"]\n};\nvar faArrowAltCircleDown = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-down',\n icon: [512, 512, [], \"f358\", \"M504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zM212 140v116h-70.9c-10.7 0-16.1 13-8.5 20.5l114.9 114.3c4.7 4.7 12.2 4.7 16.9 0l114.9-114.3c7.6-7.6 2.2-20.5-8.5-20.5H300V140c0-6.6-5.4-12-12-12h-64c-6.6 0-12 5.4-12 12z\"]\n};\nvar faArrowAltCircleLeft = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-left',\n icon: [512, 512, [], \"f359\", \"M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zm116-292H256v-70.9c0-10.7-13-16.1-20.5-8.5L121.2 247.5c-4.7 4.7-4.7 12.2 0 16.9l114.3 114.9c7.6 7.6 20.5 2.2 20.5-8.5V300h116c6.6 0 12-5.4 12-12v-64c0-6.6-5.4-12-12-12z\"]\n};\nvar faArrowAltCircleRight = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-right',\n icon: [512, 512, [], \"f35a\", \"M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zM140 300h116v70.9c0 10.7 13 16.1 20.5 8.5l114.3-114.9c4.7-4.7 4.7-12.2 0-16.9l-114.3-115c-7.6-7.6-20.5-2.2-20.5 8.5V212H140c-6.6 0-12 5.4-12 12v64c0 6.6 5.4 12 12 12z\"]\n};\nvar faArrowAltCircleUp = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-up',\n icon: [512, 512, [], \"f35b\", \"M8 256C8 119 119 8 256 8s248 111 248 248-111 248-248 248S8 393 8 256zm292 116V256h70.9c10.7 0 16.1-13 8.5-20.5L264.5 121.2c-4.7-4.7-12.2-4.7-16.9 0l-115 114.3c-7.6 7.6-2.2 20.5 8.5 20.5H212v116c0 6.6 5.4 12 12 12h64c6.6 0 12-5.4 12-12z\"]\n};\nvar faArrowCircleDown = {\n prefix: 'fas',\n iconName: 'arrow-circle-down',\n icon: [512, 512, [], \"f0ab\", \"M504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-143.6-28.9L288 302.6V120c0-13.3-10.7-24-24-24h-16c-13.3 0-24 10.7-24 24v182.6l-72.4-75.5c-9.3-9.7-24.8-9.9-34.3-.4l-10.9 11c-9.4 9.4-9.4 24.6 0 33.9L239 404.3c9.4 9.4 24.6 9.4 33.9 0l132.7-132.7c9.4-9.4 9.4-24.6 0-33.9l-10.9-11c-9.5-9.5-25-9.3-34.3.4z\"]\n};\nvar faArrowCircleLeft = {\n prefix: 'fas',\n iconName: 'arrow-circle-left',\n icon: [512, 512, [], \"f0a8\", \"M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zm28.9-143.6L209.4 288H392c13.3 0 24-10.7 24-24v-16c0-13.3-10.7-24-24-24H209.4l75.5-72.4c9.7-9.3 9.9-24.8.4-34.3l-11-10.9c-9.4-9.4-24.6-9.4-33.9 0L107.7 239c-9.4 9.4-9.4 24.6 0 33.9l132.7 132.7c9.4 9.4 24.6 9.4 33.9 0l11-10.9c9.5-9.5 9.3-25-.4-34.3z\"]\n};\nvar faArrowCircleRight = {\n prefix: 'fas',\n iconName: 'arrow-circle-right',\n icon: [512, 512, [], \"f0a9\", \"M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zm-28.9 143.6l75.5 72.4H120c-13.3 0-24 10.7-24 24v16c0 13.3 10.7 24 24 24h182.6l-75.5 72.4c-9.7 9.3-9.9 24.8-.4 34.3l11 10.9c9.4 9.4 24.6 9.4 33.9 0L404.3 273c9.4-9.4 9.4-24.6 0-33.9L271.6 106.3c-9.4-9.4-24.6-9.4-33.9 0l-11 10.9c-9.5 9.6-9.3 25.1.4 34.4z\"]\n};\nvar faArrowCircleUp = {\n prefix: 'fas',\n iconName: 'arrow-circle-up',\n icon: [512, 512, [], \"f0aa\", \"M8 256C8 119 119 8 256 8s248 111 248 248-111 248-248 248S8 393 8 256zm143.6 28.9l72.4-75.5V392c0 13.3 10.7 24 24 24h16c13.3 0 24-10.7 24-24V209.4l72.4 75.5c9.3 9.7 24.8 9.9 34.3.4l10.9-11c9.4-9.4 9.4-24.6 0-33.9L273 107.7c-9.4-9.4-24.6-9.4-33.9 0L106.3 240.4c-9.4 9.4-9.4 24.6 0 33.9l10.9 11c9.6 9.5 25.1 9.3 34.4-.4z\"]\n};\nvar faArrowDown = {\n prefix: 'fas',\n iconName: 'arrow-down',\n icon: [448, 512, [], \"f063\", \"M413.1 222.5l22.2 22.2c9.4 9.4 9.4 24.6 0 33.9L241 473c-9.4 9.4-24.6 9.4-33.9 0L12.7 278.6c-9.4-9.4-9.4-24.6 0-33.9l22.2-22.2c9.5-9.5 25-9.3 34.3.4L184 343.4V56c0-13.3 10.7-24 24-24h32c13.3 0 24 10.7 24 24v287.4l114.8-120.5c9.3-9.8 24.8-10 34.3-.4z\"]\n};\nvar faArrowLeft = {\n prefix: 'fas',\n iconName: 'arrow-left',\n icon: [448, 512, [], \"f060\", \"M257.5 445.1l-22.2 22.2c-9.4 9.4-24.6 9.4-33.9 0L7 273c-9.4-9.4-9.4-24.6 0-33.9L201.4 44.7c9.4-9.4 24.6-9.4 33.9 0l22.2 22.2c9.5 9.5 9.3 25-.4 34.3L136.6 216H424c13.3 0 24 10.7 24 24v32c0 13.3-10.7 24-24 24H136.6l120.5 114.8c9.8 9.3 10 24.8.4 34.3z\"]\n};\nvar faArrowRight = {\n prefix: 'fas',\n iconName: 'arrow-right',\n icon: [448, 512, [], \"f061\", \"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"]\n};\nvar faArrowUp = {\n prefix: 'fas',\n iconName: 'arrow-up',\n icon: [448, 512, [], \"f062\", \"M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z\"]\n};\nvar faArrowsAlt = {\n prefix: 'fas',\n iconName: 'arrows-alt',\n icon: [512, 512, [], \"f0b2\", \"M352.201 425.775l-79.196 79.196c-9.373 9.373-24.568 9.373-33.941 0l-79.196-79.196c-15.119-15.119-4.411-40.971 16.971-40.97h51.162L228 284H127.196v51.162c0 21.382-25.851 32.09-40.971 16.971L7.029 272.937c-9.373-9.373-9.373-24.569 0-33.941L86.225 159.8c15.119-15.119 40.971-4.411 40.971 16.971V228H228V127.196h-51.23c-21.382 0-32.09-25.851-16.971-40.971l79.196-79.196c9.373-9.373 24.568-9.373 33.941 0l79.196 79.196c15.119 15.119 4.411 40.971-16.971 40.971h-51.162V228h100.804v-51.162c0-21.382 25.851-32.09 40.97-16.971l79.196 79.196c9.373 9.373 9.373 24.569 0 33.941L425.773 352.2c-15.119 15.119-40.971 4.411-40.97-16.971V284H284v100.804h51.23c21.382 0 32.09 25.851 16.971 40.971z\"]\n};\nvar faArrowsAltH = {\n prefix: 'fas',\n iconName: 'arrows-alt-h',\n icon: [512, 512, [], \"f337\", \"M377.941 169.941V216H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.568 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296h243.882v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.568 0-33.941l-86.059-86.059c-15.119-15.12-40.971-4.412-40.971 16.97z\"]\n};\nvar faArrowsAltV = {\n prefix: 'fas',\n iconName: 'arrows-alt-v',\n icon: [256, 512, [], \"f338\", \"M214.059 377.941H168V134.059h46.059c21.382 0 32.09-25.851 16.971-40.971L144.971 7.029c-9.373-9.373-24.568-9.373-33.941 0L24.971 93.088c-15.119 15.119-4.411 40.971 16.971 40.971H88v243.882H41.941c-21.382 0-32.09 25.851-16.971 40.971l86.059 86.059c9.373 9.373 24.568 9.373 33.941 0l86.059-86.059c15.12-15.119 4.412-40.971-16.97-40.971z\"]\n};\nvar faAssistiveListeningSystems = {\n prefix: 'fas',\n iconName: 'assistive-listening-systems',\n icon: [512, 512, [], \"f2a2\", \"M216 260c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-44.112 35.888-80 80-80s80 35.888 80 80c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-13.234-10.767-24-24-24s-24 10.766-24 24zm24-176c-97.047 0-176 78.953-176 176 0 15.464 12.536 28 28 28s28-12.536 28-28c0-66.168 53.832-120 120-120s120 53.832 120 120c0 75.164-71.009 70.311-71.997 143.622L288 404c0 28.673-23.327 52-52 52-15.464 0-28 12.536-28 28s12.536 28 28 28c59.475 0 107.876-48.328 108-107.774.595-34.428 72-48.24 72-144.226 0-97.047-78.953-176-176-176zm-80 236c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zM32 448c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm480-187.993c0-1.518-.012-3.025-.045-4.531C510.076 140.525 436.157 38.47 327.994 1.511c-14.633-4.998-30.549 2.809-35.55 17.442-5 14.633 2.81 30.549 17.442 35.55 85.906 29.354 144.61 110.513 146.077 201.953l.003.188c.026 1.118.033 2.236.033 3.363 0 15.464 12.536 28 28 28s28.001-12.536 28.001-28zM152.971 439.029l-80-80L39.03 392.97l80 80 33.941-33.941z\"]\n};\nvar faAsterisk = {\n prefix: 'fas',\n iconName: 'asterisk',\n icon: [512, 512, [], \"f069\", \"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z\"]\n};\nvar faAt = {\n prefix: 'fas',\n iconName: 'at',\n icon: [512, 512, [], \"f1fa\", \"M256 8C118.941 8 8 118.919 8 256c0 137.059 110.919 248 248 248 48.154 0 95.342-14.14 135.408-40.223 12.005-7.815 14.625-24.288 5.552-35.372l-10.177-12.433c-7.671-9.371-21.179-11.667-31.373-5.129C325.92 429.757 291.314 440 256 440c-101.458 0-184-82.542-184-184S154.542 72 256 72c100.139 0 184 57.619 184 160 0 38.786-21.093 79.742-58.17 83.693-17.349-.454-16.91-12.857-13.476-30.024l23.433-121.11C394.653 149.75 383.308 136 368.225 136h-44.981a13.518 13.518 0 0 0-13.432 11.993l-.01.092c-14.697-17.901-40.448-21.775-59.971-21.775-74.58 0-137.831 62.234-137.831 151.46 0 65.303 36.785 105.87 96 105.87 26.984 0 57.369-15.637 74.991-38.333 9.522 34.104 40.613 34.103 70.71 34.103C462.609 379.41 504 307.798 504 232 504 95.653 394.023 8 256 8zm-21.68 304.43c-22.249 0-36.07-15.623-36.07-40.771 0-44.993 30.779-72.729 58.63-72.729 22.292 0 35.601 15.241 35.601 40.77 0 45.061-33.875 72.73-58.161 72.73z\"]\n};\nvar faAtlas = {\n prefix: 'fas',\n iconName: 'atlas',\n icon: [448, 512, [], \"f558\", \"M318.38 208h-39.09c-1.49 27.03-6.54 51.35-14.21 70.41 27.71-13.24 48.02-39.19 53.3-70.41zm0-32c-5.29-31.22-25.59-57.17-53.3-70.41 7.68 19.06 12.72 43.38 14.21 70.41h39.09zM224 97.31c-7.69 7.45-20.77 34.42-23.43 78.69h46.87c-2.67-44.26-15.75-71.24-23.44-78.69zm-41.08 8.28c-27.71 13.24-48.02 39.19-53.3 70.41h39.09c1.49-27.03 6.53-51.35 14.21-70.41zm0 172.82c-7.68-19.06-12.72-43.38-14.21-70.41h-39.09c5.28 31.22 25.59 57.17 53.3 70.41zM247.43 208h-46.87c2.66 44.26 15.74 71.24 23.43 78.69 7.7-7.45 20.78-34.43 23.44-78.69zM448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM224 64c70.69 0 128 57.31 128 128s-57.31 128-128 128S96 262.69 96 192 153.31 64 224 64zm160 384H96c-19.2 0-32-12.8-32-32s16-32 32-32h288v64z\"]\n};\nvar faAtom = {\n prefix: 'fas',\n iconName: 'atom',\n icon: [448, 512, [], \"f5d2\", \"M413.03 256c40.13-54.89 41.51-98.62 25.14-128-10.91-19.52-40.54-50.73-116.33-41.88C300.36 34.89 267.64 0 224 0s-76.36 34.89-97.84 86.12C50.43 77.34 20.73 108.48 9.83 128c-16.38 29.4-15 73.09 25.14 128-40.13 54.89-41.51 98.62-25.14 128 29.21 52.34 101.68 43.58 116.33 41.88C147.63 477.1 180.36 512 224 512s76.37-34.9 97.84-86.12c14.64 1.7 87.11 10.46 116.33-41.88 16.38-29.4 15-73.09-25.14-128zM63.38 352c-4.03-7.21-.19-24.8 14.95-48.29 6.96 6.53 14.2 12.89 21.87 19.18 1.71 13.71 4 27.08 6.76 40.08-24.56.89-39.89-4.37-43.58-10.97zm36.82-162.88c-7.66 6.29-14.9 12.65-21.87 19.18-15.13-23.5-18.97-41.09-14.95-48.3 3.41-6.14 16.39-11.47 37.92-11.47 1.71 0 3.87.3 5.69.37a472.191 472.191 0 0 0-6.79 40.22zM224 64c9.47 0 22.2 13.52 33.86 37.26-11.19 3.7-22.44 8-33.86 12.86-11.42-4.86-22.67-9.16-33.86-12.86C201.8 77.52 214.53 64 224 64zm0 384c-9.47 0-22.2-13.52-33.86-37.26 11.19-3.7 22.44-8 33.86-12.86 11.42 4.86 22.67 9.16 33.86 12.86C246.2 434.48 233.47 448 224 448zm62.5-157.33c-26.7 19.08-46.14 29.33-62.5 37.48-16.35-8.14-35.8-18.41-62.5-37.48-1.99-27.79-1.99-41.54 0-69.33 26.67-19.05 46.13-29.32 62.5-37.48 16.39 8.17 35.86 18.44 62.5 37.48 1.98 27.78 1.99 41.53 0 69.33zM384.62 352c-3.67 6.62-19 11.82-43.58 10.95 2.76-13 5.05-26.37 6.76-40.06 7.66-6.29 14.9-12.65 21.87-19.18 15.13 23.49 18.97 41.08 14.95 48.29zm-14.95-143.71c-6.96-6.53-14.2-12.89-21.87-19.18a473.535 473.535 0 0 0-6.79-40.22c1.82-.07 3.97-.37 5.69-.37 21.52 0 34.51 5.34 37.92 11.47 4.02 7.22.18 24.81-14.95 48.3zM224 224c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar faAudioDescription = {\n prefix: 'fas',\n iconName: 'audio-description',\n icon: [512, 512, [], \"f29e\", \"M162.925 238.709l8.822 30.655h-25.606l9.041-30.652c1.277-4.421 2.651-9.994 3.872-15.245 1.22 5.251 2.594 10.823 3.871 15.242zm166.474-32.099h-14.523v98.781h14.523c29.776 0 46.175-17.678 46.175-49.776 0-32.239-17.49-49.005-46.175-49.005zM512 112v288c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48zM245.459 336.139l-57.097-168A12.001 12.001 0 0 0 177 160h-35.894a12.001 12.001 0 0 0-11.362 8.139l-57.097 168C70.003 343.922 75.789 352 84.009 352h29.133a12 12 0 0 0 11.535-8.693l8.574-29.906h51.367l8.793 29.977A12 12 0 0 0 204.926 352h29.172c8.22 0 14.006-8.078 11.361-15.861zm184.701-80.525c0-58.977-37.919-95.614-98.96-95.614h-57.366c-6.627 0-12 5.373-12 12v168c0 6.627 5.373 12 12 12H331.2c61.041 0 98.96-36.933 98.96-96.386z\"]\n};\nvar faAward = {\n prefix: 'fas',\n iconName: 'award',\n icon: [384, 512, [], \"f559\", \"M97.12 362.63c-8.69-8.69-4.16-6.24-25.12-11.85-9.51-2.55-17.87-7.45-25.43-13.32L1.2 448.7c-4.39 10.77 3.81 22.47 15.43 22.03l52.69-2.01L105.56 507c8 8.44 22.04 5.81 26.43-4.96l52.05-127.62c-10.84 6.04-22.87 9.58-35.31 9.58-19.5 0-37.82-7.59-51.61-21.37zM382.8 448.7l-45.37-111.24c-7.56 5.88-15.92 10.77-25.43 13.32-21.07 5.64-16.45 3.18-25.12 11.85-13.79 13.78-32.12 21.37-51.62 21.37-12.44 0-24.47-3.55-35.31-9.58L252 502.04c4.39 10.77 18.44 13.4 26.43 4.96l36.25-38.28 52.69 2.01c11.62.44 19.82-11.27 15.43-22.03zM263 340c15.28-15.55 17.03-14.21 38.79-20.14 13.89-3.79 24.75-14.84 28.47-28.98 7.48-28.4 5.54-24.97 25.95-45.75 10.17-10.35 14.14-25.44 10.42-39.58-7.47-28.38-7.48-24.42 0-52.83 3.72-14.14-.25-29.23-10.42-39.58-20.41-20.78-18.47-17.36-25.95-45.75-3.72-14.14-14.58-25.19-28.47-28.98-27.88-7.61-24.52-5.62-44.95-26.41-10.17-10.35-25-14.4-38.89-10.61-27.87 7.6-23.98 7.61-51.9 0-13.89-3.79-28.72.25-38.89 10.61-20.41 20.78-17.05 18.8-44.94 26.41-13.89 3.79-24.75 14.84-28.47 28.98-7.47 28.39-5.54 24.97-25.95 45.75-10.17 10.35-14.15 25.44-10.42 39.58 7.47 28.36 7.48 24.4 0 52.82-3.72 14.14.25 29.23 10.42 39.59 20.41 20.78 18.47 17.35 25.95 45.75 3.72 14.14 14.58 25.19 28.47 28.98C104.6 325.96 106.27 325 121 340c13.23 13.47 33.84 15.88 49.74 5.82a39.676 39.676 0 0 1 42.53 0c15.89 10.06 36.5 7.65 49.73-5.82zM97.66 175.96c0-53.03 42.24-96.02 94.34-96.02s94.34 42.99 94.34 96.02-42.24 96.02-94.34 96.02-94.34-42.99-94.34-96.02z\"]\n};\nvar faBaby = {\n prefix: 'fas',\n iconName: 'baby',\n icon: [384, 512, [], \"f77c\", \"M192 160c44.2 0 80-35.8 80-80S236.2 0 192 0s-80 35.8-80 80 35.8 80 80 80zm-53.4 248.8l25.6-32-61.5-51.2L56.8 383c-11.4 14.2-11.7 34.4-.8 49l48 64c7.9 10.5 19.9 16 32 16 8.3 0 16.8-2.6 24-8 17.7-13.2 21.2-38.3 8-56l-29.4-39.2zm142.7-83.2l-61.5 51.2 25.6 32L216 448c-13.2 17.7-9.7 42.8 8 56 7.2 5.4 15.6 8 24 8 12.2 0 24.2-5.5 32-16l48-64c10.9-14.6 10.6-34.8-.8-49l-45.9-57.4zM376.7 145c-12.7-18.1-37.6-22.4-55.7-9.8l-40.6 28.5c-52.7 37-124.2 37-176.8 0L63 135.3C44.9 122.6 20 127 7.3 145-5.4 163.1-1 188 17 200.7l40.6 28.5c17 11.9 35.4 20.9 54.4 27.9V288h160v-30.8c19-7 37.4-16 54.4-27.9l40.6-28.5c18.1-12.8 22.4-37.7 9.7-55.8z\"]\n};\nvar faBabyCarriage = {\n prefix: 'fas',\n iconName: 'baby-carriage',\n icon: [512, 512, [], \"f77d\", \"M144.8 17c-11.3-17.8-37.2-22.8-54-9.4C35.3 51.9 0 118 0 192h256L144.8 17zM496 96h-48c-35.3 0-64 28.7-64 64v64H0c0 50.6 23 96.4 60.3 130.7C25.7 363.6 0 394.7 0 432c0 44.2 35.8 80 80 80s80-35.8 80-80c0-8.9-1.8-17.2-4.4-25.2 21.6 5.9 44.6 9.2 68.4 9.2s46.9-3.3 68.4-9.2c-2.7 8-4.4 16.3-4.4 25.2 0 44.2 35.8 80 80 80s80-35.8 80-80c0-37.3-25.7-68.4-60.3-77.3C425 320.4 448 274.6 448 224v-64h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM80 464c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zm320-32c0 17.6-14.4 32-32 32s-32-14.4-32-32 14.4-32 32-32 32 14.4 32 32z\"]\n};\nvar faBackspace = {\n prefix: 'fas',\n iconName: 'backspace',\n icon: [640, 512, [], \"f55a\", \"M576 64H205.26A63.97 63.97 0 0 0 160 82.75L9.37 233.37c-12.5 12.5-12.5 32.76 0 45.25L160 429.25c12 12 28.28 18.75 45.25 18.75H576c35.35 0 64-28.65 64-64V128c0-35.35-28.65-64-64-64zm-84.69 254.06c6.25 6.25 6.25 16.38 0 22.63l-22.62 22.62c-6.25 6.25-16.38 6.25-22.63 0L384 301.25l-62.06 62.06c-6.25 6.25-16.38 6.25-22.63 0l-22.62-22.62c-6.25-6.25-6.25-16.38 0-22.63L338.75 256l-62.06-62.06c-6.25-6.25-6.25-16.38 0-22.63l22.62-22.62c6.25-6.25 16.38-6.25 22.63 0L384 210.75l62.06-62.06c6.25-6.25 16.38-6.25 22.63 0l22.62 22.62c6.25 6.25 6.25 16.38 0 22.63L429.25 256l62.06 62.06z\"]\n};\nvar faBackward = {\n prefix: 'fas',\n iconName: 'backward',\n icon: [512, 512, [], \"f04a\", \"M11.5 280.6l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2zm256 0l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2z\"]\n};\nvar faBacon = {\n prefix: 'fas',\n iconName: 'bacon',\n icon: [576, 512, [], \"f7e5\", \"M218.92 336.39c34.89-34.89 44.2-59.7 54.05-86 10.61-28.29 21.59-57.54 61.37-97.34s69.05-50.77 97.35-61.38c23.88-9 46.64-17.68 76.79-45.37L470.81 8.91a31 31 0 0 0-40.18-2.83c-13.64 10.1-25.15 14.39-41 20.3C247 79.52 209.26 191.29 200.65 214.1c-29.75 78.83-89.55 94.68-98.72 98.09-24.86 9.26-54.73 20.38-91.07 50.36C-3 374-3.63 395 9.07 407.61l35.76 35.51C80 410.52 107 400.15 133 390.39c26.27-9.84 51.06-19.12 85.92-54zm348-232l-35.75-35.51c-35.19 32.63-62.18 43-88.25 52.79-26.26 9.85-51.06 19.16-85.95 54s-44.19 59.69-54 86C292.33 290 281.34 319.22 241.55 359s-69 50.73-97.3 61.32c-23.86 9-46.61 17.66-76.72 45.33l37.68 37.43a31 31 0 0 0 40.18 2.82c13.6-10.06 25.09-14.34 40.94-20.24 142.2-53 180-164.1 188.94-187.69C405 219.18 464.8 203.3 474 199.86c24.87-9.27 54.74-20.4 91.11-50.41 13.89-11.4 14.52-32.45 1.82-45.05z\"]\n};\nvar faBalanceScale = {\n prefix: 'fas',\n iconName: 'balance-scale',\n icon: [640, 512, [], \"f24e\", \"M256 336h-.02c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0C-2.06 328.75.02 320.33.02 336H0c0 44.18 57.31 80 128 80s128-35.82 128-80zM128 176l72 144H56l72-144zm511.98 160c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0-87.12 174.26-85.04 165.84-85.04 181.51H384c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02zM440 320l72-144 72 144H440zm88 128H352V153.25c23.51-10.29 41.16-31.48 46.39-57.25H528c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16H383.64C369.04 12.68 346.09 0 320 0s-49.04 12.68-63.64 32H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h129.61c5.23 25.76 22.87 46.96 46.39 57.25V448H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faBalanceScaleLeft = {\n prefix: 'fas',\n iconName: 'balance-scale-left',\n icon: [640, 512, [], \"f515\", \"M528 448H352V153.25c20.42-8.94 36.1-26.22 43.38-47.47l132-44.26c8.38-2.81 12.89-11.88 10.08-20.26l-10.17-30.34C524.48 2.54 515.41-1.97 507.03.84L389.11 40.37C375.3 16.36 349.69 0 320 0c-44.18 0-80 35.82-80 80 0 3.43.59 6.71 1.01 10.03l-128.39 43.05c-8.38 2.81-12.89 11.88-10.08 20.26l10.17 30.34c2.81 8.38 11.88 12.89 20.26 10.08l142.05-47.63c4.07 2.77 8.43 5.12 12.99 7.12V496c0 8.84 7.16 16 16 16h224c8.84 0 16-7.16 16-16v-32c-.01-8.84-7.17-16-16.01-16zm111.98-144c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0-87.12 174.26-85.04 165.84-85.04 181.51H384c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02zM440 288l72-144 72 144H440zm-269.07-37.51c-17.65-35.29-68.19-35.36-85.87 0C-2.06 424.75.02 416.33.02 432H0c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02c0-16.18 1.34-8.73-85.05-181.51zM56 416l72-144 72 144H56z\"]\n};\nvar faBalanceScaleRight = {\n prefix: 'fas',\n iconName: 'balance-scale-right',\n icon: [640, 512, [], \"f516\", \"M96 464v32c0 8.84 7.16 16 16 16h224c8.84 0 16-7.16 16-16V153.25c4.56-2 8.92-4.35 12.99-7.12l142.05 47.63c8.38 2.81 17.45-1.71 20.26-10.08l10.17-30.34c2.81-8.38-1.71-17.45-10.08-20.26l-128.4-43.05c.42-3.32 1.01-6.6 1.01-10.03 0-44.18-35.82-80-80-80-29.69 0-55.3 16.36-69.11 40.37L132.96.83c-8.38-2.81-17.45 1.71-20.26 10.08l-10.17 30.34c-2.81 8.38 1.71 17.45 10.08 20.26l132 44.26c7.28 21.25 22.96 38.54 43.38 47.47V448H112c-8.84 0-16 7.16-16 16zM0 304c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02c0-15.67 2.08-7.25-85.05-181.51-17.68-35.36-68.22-35.29-85.87 0C-1.32 295.27.02 287.82.02 304H0zm56-16l72-144 72 144H56zm328.02 144H384c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02c0-15.67 2.08-7.25-85.05-181.51-17.68-35.36-68.22-35.29-85.87 0-86.38 172.78-85.04 165.33-85.04 181.51zM440 416l72-144 72 144H440z\"]\n};\nvar faBan = {\n prefix: 'fas',\n iconName: 'ban',\n icon: [512, 512, [], \"f05e\", \"M256 8C119.034 8 8 119.033 8 256s111.034 248 248 248 248-111.034 248-248S392.967 8 256 8zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676zM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676z\"]\n};\nvar faBandAid = {\n prefix: 'fas',\n iconName: 'band-aid',\n icon: [640, 512, [], \"f462\", \"M0 160v192c0 35.3 28.7 64 64 64h96V96H64c-35.3 0-64 28.7-64 64zm576-64h-96v320h96c35.3 0 64-28.7 64-64V160c0-35.3-28.7-64-64-64zM192 416h256V96H192v320zm176-232c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm0 96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm-96-96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm0 96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24z\"]\n};\nvar faBarcode = {\n prefix: 'fas',\n iconName: 'barcode',\n icon: [512, 512, [], \"f02a\", \"M0 448V64h18v384H0zm26.857-.273V64H36v383.727h-9.143zm27.143 0V64h8.857v383.727H54zm44.857 0V64h8.857v383.727h-8.857zm36 0V64h17.714v383.727h-17.714zm44.857 0V64h8.857v383.727h-8.857zm18 0V64h8.857v383.727h-8.857zm18 0V64h8.857v383.727h-8.857zm35.715 0V64h18v383.727h-18zm44.857 0V64h18v383.727h-18zm35.999 0V64h18.001v383.727h-18.001zm36.001 0V64h18.001v383.727h-18.001zm26.857 0V64h18v383.727h-18zm45.143 0V64h26.857v383.727h-26.857zm35.714 0V64h9.143v383.727H476zm18 .273V64h18v384h-18z\"]\n};\nvar faBars = {\n prefix: 'fas',\n iconName: 'bars',\n icon: [448, 512, [], \"f0c9\", \"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"]\n};\nvar faBaseballBall = {\n prefix: 'fas',\n iconName: 'baseball-ball',\n icon: [496, 512, [], \"f433\", \"M368.5 363.9l28.8-13.9c11.1 22.9 26 43.2 44.1 60.9 34-42.5 54.5-96.3 54.5-154.9 0-58.5-20.4-112.2-54.2-154.6-17.8 17.3-32.6 37.1-43.6 59.5l-28.7-14.1c12.8-26 30-49 50.8-69C375.6 34.7 315 8 248 8 181.1 8 120.5 34.6 75.9 77.7c20.7 19.9 37.9 42.9 50.7 68.8l-28.7 14.1c-11-22.3-25.7-42.1-43.5-59.4C20.4 143.7 0 197.4 0 256c0 58.6 20.4 112.3 54.4 154.7 18.2-17.7 33.2-38 44.3-61l28.8 13.9c-12.9 26.7-30.3 50.3-51.5 70.7 44.5 43.1 105.1 69.7 172 69.7 66.8 0 127.3-26.5 171.9-69.5-21.1-20.4-38.5-43.9-51.4-70.6zm-228.3-32l-30.5-9.8c14.9-46.4 12.7-93.8-.6-134l30.4-10c15 45.6 18 99.9.7 153.8zm216.3-153.4l30.4 10c-13.2 40.1-15.5 87.5-.6 134l-30.5 9.8c-17.3-54-14.3-108.3.7-153.8z\"]\n};\nvar faBasketballBall = {\n prefix: 'fas',\n iconName: 'basketball-ball',\n icon: [496, 512, [], \"f434\", \"M212.3 10.3c-43.8 6.3-86.2 24.1-122.2 53.8l77.4 77.4c27.8-35.8 43.3-81.2 44.8-131.2zM248 222L405.9 64.1c-42.4-35-93.6-53.5-145.5-56.1-1.2 63.9-21.5 122.3-58.7 167.7L248 222zM56.1 98.1c-29.7 36-47.5 78.4-53.8 122.2 50-1.5 95.5-17 131.2-44.8L56.1 98.1zm272.2 204.2c45.3-37.1 103.7-57.4 167.7-58.7-2.6-51.9-21.1-103.1-56.1-145.5L282 256l46.3 46.3zM248 290L90.1 447.9c42.4 34.9 93.6 53.5 145.5 56.1 1.3-64 21.6-122.4 58.7-167.7L248 290zm191.9 123.9c29.7-36 47.5-78.4 53.8-122.2-50.1 1.6-95.5 17.1-131.2 44.8l77.4 77.4zM167.7 209.7C122.3 246.9 63.9 267.3 0 268.4c2.6 51.9 21.1 103.1 56.1 145.5L214 256l-46.3-46.3zm116 292c43.8-6.3 86.2-24.1 122.2-53.8l-77.4-77.4c-27.7 35.7-43.2 81.2-44.8 131.2z\"]\n};\nvar faBath = {\n prefix: 'fas',\n iconName: 'bath',\n icon: [512, 512, [], \"f2cd\", \"M488 256H80V112c0-17.645 14.355-32 32-32 11.351 0 21.332 5.945 27.015 14.88-16.492 25.207-14.687 59.576 6.838 83.035-4.176 4.713-4.021 11.916.491 16.428l11.314 11.314c4.686 4.686 12.284 4.686 16.971 0l95.03-95.029c4.686-4.686 4.686-12.284 0-16.971l-11.314-11.314c-4.512-4.512-11.715-4.666-16.428-.491-17.949-16.469-42.294-21.429-64.178-15.365C163.281 45.667 139.212 32 112 32c-44.112 0-80 35.888-80 80v144h-8c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h8v32c0 28.43 12.362 53.969 32 71.547V456c0 13.255 10.745 24 24 24h16c13.255 0 24-10.745 24-24v-8h256v8c0 13.255 10.745 24 24 24h16c13.255 0 24-10.745 24-24v-32.453c19.638-17.578 32-43.117 32-71.547v-32h8c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24z\"]\n};\nvar faBatteryEmpty = {\n prefix: 'fas',\n iconName: 'battery-empty',\n icon: [640, 512, [], \"f244\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48z\"]\n};\nvar faBatteryFull = {\n prefix: 'fas',\n iconName: 'battery-full',\n icon: [640, 512, [], \"f240\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-48 96H96v128h416V192z\"]\n};\nvar faBatteryHalf = {\n prefix: 'fas',\n iconName: 'battery-half',\n icon: [640, 512, [], \"f242\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-240 96H96v128h224V192z\"]\n};\nvar faBatteryQuarter = {\n prefix: 'fas',\n iconName: 'battery-quarter',\n icon: [640, 512, [], \"f243\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-336 96H96v128h128V192z\"]\n};\nvar faBatteryThreeQuarters = {\n prefix: 'fas',\n iconName: 'battery-three-quarters',\n icon: [640, 512, [], \"f241\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-144 96H96v128h320V192z\"]\n};\nvar faBed = {\n prefix: 'fas',\n iconName: 'bed',\n icon: [640, 512, [], \"f236\", \"M176 256c44.11 0 80-35.89 80-80s-35.89-80-80-80-80 35.89-80 80 35.89 80 80 80zm352-128H304c-8.84 0-16 7.16-16 16v144H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v352c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48h512v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V240c0-61.86-50.14-112-112-112z\"]\n};\nvar faBeer = {\n prefix: 'fas',\n iconName: 'beer',\n icon: [448, 512, [], \"f0fc\", \"M368 96h-48V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56v400c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24v-42.11l80.606-35.977C429.396 365.063 448 336.388 448 304.86V176c0-44.112-35.888-80-80-80zm16 208.86a16.018 16.018 0 0 1-9.479 14.611L320 343.805V160h48c8.822 0 16 7.178 16 16v128.86zM208 384c-8.836 0-16-7.164-16-16V144c0-8.836 7.164-16 16-16s16 7.164 16 16v224c0 8.836-7.164 16-16 16zm-96 0c-8.836 0-16-7.164-16-16V144c0-8.836 7.164-16 16-16s16 7.164 16 16v224c0 8.836-7.164 16-16 16z\"]\n};\nvar faBell = {\n prefix: 'fas',\n iconName: 'bell',\n icon: [448, 512, [], \"f0f3\", \"M224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64zm215.39-149.71c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71z\"]\n};\nvar faBellSlash = {\n prefix: 'fas',\n iconName: 'bell-slash',\n icon: [640, 512, [], \"f1f6\", \"M633.82 458.1l-90.62-70.05c.19-1.38.8-2.66.8-4.06.05-7.55-2.61-15.27-8.61-21.71-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84c-40.33 8.38-74.66 31.07-97.59 62.57L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.35 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.42-6.97 4.17-17.02-2.81-22.45zM157.23 251.54c-8.61 67.96-36.41 93.33-52.62 110.75-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h241.92L157.23 251.54zM320 512c35.32 0 63.97-28.65 63.97-64H256.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBezierCurve = {\n prefix: 'fas',\n iconName: 'bezier-curve',\n icon: [640, 512, [], \"f55b\", \"M368 32h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zM208 88h-84.75C113.75 64.56 90.84 48 64 48 28.66 48 0 76.65 0 112s28.66 64 64 64c26.84 0 49.75-16.56 59.25-40h79.73c-55.37 32.52-95.86 87.32-109.54 152h49.4c11.3-41.61 36.77-77.21 71.04-101.56-3.7-8.08-5.88-16.99-5.88-26.44V88zm-48 232H64c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32zM576 48c-26.84 0-49.75 16.56-59.25 40H432v72c0 9.45-2.19 18.36-5.88 26.44 34.27 24.35 59.74 59.95 71.04 101.56h49.4c-13.68-64.68-54.17-119.48-109.54-152h79.73c9.5 23.44 32.41 40 59.25 40 35.34 0 64-28.65 64-64s-28.66-64-64-64zm0 272h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32z\"]\n};\nvar faBible = {\n prefix: 'fas',\n iconName: 'bible',\n icon: [448, 512, [], \"f647\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM144 144c0-8.84 7.16-16 16-16h48V80c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v48h48c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16h-48v112c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16V192h-48c-8.84 0-16-7.16-16-16v-32zm236.8 304H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8v64z\"]\n};\nvar faBicycle = {\n prefix: 'fas',\n iconName: 'bicycle',\n icon: [640, 512, [], \"f206\", \"M512.509 192.001c-16.373-.064-32.03 2.955-46.436 8.495l-77.68-125.153A24 24 0 0 0 368.001 64h-64c-8.837 0-16 7.163-16 16v16c0 8.837 7.163 16 16 16h50.649l14.896 24H256.002v-16c0-8.837-7.163-16-16-16h-87.459c-13.441 0-24.777 10.999-24.536 24.437.232 13.044 10.876 23.563 23.995 23.563h48.726l-29.417 47.52c-13.433-4.83-27.904-7.483-42.992-7.52C58.094 191.83.412 249.012.002 319.236-.413 390.279 57.055 448 128.002 448c59.642 0 109.758-40.793 123.967-96h52.033a24 24 0 0 0 20.406-11.367L410.37 201.77l14.938 24.067c-25.455 23.448-41.385 57.081-41.307 94.437.145 68.833 57.899 127.051 126.729 127.719 70.606.685 128.181-55.803 129.255-125.996 1.086-70.941-56.526-129.72-127.476-129.996zM186.75 265.772c9.727 10.529 16.673 23.661 19.642 38.228h-43.306l23.664-38.228zM128.002 400c-44.112 0-80-35.888-80-80s35.888-80 80-80c5.869 0 11.586.653 17.099 1.859l-45.505 73.509C89.715 331.327 101.213 352 120.002 352h81.3c-12.37 28.225-40.562 48-73.3 48zm162.63-96h-35.624c-3.96-31.756-19.556-59.894-42.383-80.026L237.371 184h127.547l-74.286 120zm217.057 95.886c-41.036-2.165-74.049-35.692-75.627-76.755-.812-21.121 6.633-40.518 19.335-55.263l44.433 71.586c4.66 7.508 14.524 9.816 22.032 5.156l13.594-8.437c7.508-4.66 9.817-14.524 5.156-22.032l-44.468-71.643a79.901 79.901 0 0 1 19.858-2.497c44.112 0 80 35.888 80 80-.001 45.54-38.252 82.316-84.313 79.885z\"]\n};\nvar faBiking = {\n prefix: 'fas',\n iconName: 'biking',\n icon: [640, 512, [], \"f84a\", \"M400 96a48 48 0 1 0-48-48 48 48 0 0 0 48 48zm-4 121a31.9 31.9 0 0 0 20 7h64a32 32 0 0 0 0-64h-52.78L356 103a31.94 31.94 0 0 0-40.81.68l-112 96a32 32 0 0 0 3.08 50.92L288 305.12V416a32 32 0 0 0 64 0V288a32 32 0 0 0-14.25-26.62l-41.36-27.57 58.25-49.92zm116 39a128 128 0 1 0 128 128 128 128 0 0 0-128-128zm0 192a64 64 0 1 1 64-64 64 64 0 0 1-64 64zM128 256a128 128 0 1 0 128 128 128 128 0 0 0-128-128zm0 192a64 64 0 1 1 64-64 64 64 0 0 1-64 64z\"]\n};\nvar faBinoculars = {\n prefix: 'fas',\n iconName: 'binoculars',\n icon: [512, 512, [], \"f1e5\", \"M416 48c0-8.84-7.16-16-16-16h-64c-8.84 0-16 7.16-16 16v48h96V48zM63.91 159.99C61.4 253.84 3.46 274.22 0 404v44c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32V288h32V128H95.84c-17.63 0-31.45 14.37-31.93 31.99zm384.18 0c-.48-17.62-14.3-31.99-31.93-31.99H320v160h32v160c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-44c-3.46-129.78-61.4-150.16-63.91-244.01zM176 32h-64c-8.84 0-16 7.16-16 16v48h96V48c0-8.84-7.16-16-16-16zm48 256h64V128h-64v160z\"]\n};\nvar faBiohazard = {\n prefix: 'fas',\n iconName: 'biohazard',\n icon: [576, 512, [], \"f780\", \"M287.9 112c18.6 0 36.2 3.8 52.8 9.6 13.3-10.3 23.6-24.3 29.5-40.7-25.2-10.9-53-17-82.2-17-29.1 0-56.9 6-82.1 16.9 5.9 16.4 16.2 30.4 29.5 40.7 16.5-5.7 34-9.5 52.5-9.5zM163.6 438.7c12-11.8 20.4-26.4 24.5-42.4-32.9-26.4-54.8-65.3-58.9-109.6-8.5-2.8-17.2-4.6-26.4-4.6-7.6 0-15.2 1-22.5 3.1 4.1 62.8 35.8 118 83.3 153.5zm224.2-42.6c4.1 16 12.5 30.7 24.5 42.5 47.4-35.5 79.1-90.7 83-153.5-7.2-2-14.7-3-22.2-3-9.2 0-18 1.9-26.6 4.7-4.1 44.2-26 82.9-58.7 109.3zm113.5-205c-17.6-10.4-36.3-16.6-55.3-19.9 6-17.7 10-36.4 10-56.2 0-41-14.5-80.8-41-112.2-2.5-3-6.6-3.7-10-1.8-3.3 1.9-4.8 6-3.6 9.7 4.5 13.8 6.6 26.3 6.6 38.5 0 67.8-53.8 122.9-120 122.9S168 117 168 49.2c0-12.1 2.2-24.7 6.6-38.5 1.2-3.7-.3-7.8-3.6-9.7-3.4-1.9-7.5-1.2-10 1.8C134.6 34.2 120 74 120 115c0 19.8 3.9 38.5 10 56.2-18.9 3.3-37.7 9.5-55.3 19.9-34.6 20.5-61 53.3-74.3 92.4-1.3 3.7.2 7.7 3.5 9.8 3.3 2 7.5 1.3 10-1.6 9.4-10.8 19-19.1 29.2-25.1 57.3-33.9 130.8-13.7 163.9 45 33.1 58.7 13.4 134-43.9 167.9-10.2 6.1-22 10.4-35.8 13.4-3.7.8-6.4 4.2-6.4 8.1.1 4 2.7 7.3 6.5 8 39.7 7.8 80.6.8 115.2-19.7 18-10.6 32.9-24.5 45.3-40.1 12.4 15.6 27.3 29.5 45.3 40.1 34.6 20.5 75.5 27.5 115.2 19.7 3.8-.7 6.4-4 6.5-8 0-3.9-2.6-7.3-6.4-8.1-13.9-2.9-25.6-7.3-35.8-13.4-57.3-33.9-77-109.2-43.9-167.9s106.6-78.9 163.9-45c10.2 6.1 19.8 14.3 29.2 25.1 2.5 2.9 6.7 3.6 10 1.6s4.8-6.1 3.5-9.8c-13.1-39.1-39.5-72-74.1-92.4zm-213.4 129c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faBirthdayCake = {\n prefix: 'fas',\n iconName: 'birthday-cake',\n icon: [448, 512, [], \"f1fd\", \"M448 384c-28.02 0-31.26-32-74.5-32-43.43 0-46.825 32-74.75 32-27.695 0-31.454-32-74.75-32-42.842 0-47.218 32-74.5 32-28.148 0-31.202-32-74.75-32-43.547 0-46.653 32-74.75 32v-80c0-26.5 21.5-48 48-48h16V112h64v144h64V112h64v144h64V112h64v144h16c26.5 0 48 21.5 48 48v80zm0 128H0v-96c43.356 0 46.767-32 74.75-32 27.951 0 31.253 32 74.75 32 42.843 0 47.217-32 74.5-32 28.148 0 31.201 32 74.75 32 43.357 0 46.767-32 74.75-32 27.488 0 31.252 32 74.5 32v96zM96 96c-17.75 0-32-14.25-32-32 0-31 32-23 32-64 12 0 32 29.5 32 56s-14.25 40-32 40zm128 0c-17.75 0-32-14.25-32-32 0-31 32-23 32-64 12 0 32 29.5 32 56s-14.25 40-32 40zm128 0c-17.75 0-32-14.25-32-32 0-31 32-23 32-64 12 0 32 29.5 32 56s-14.25 40-32 40z\"]\n};\nvar faBlender = {\n prefix: 'fas',\n iconName: 'blender',\n icon: [512, 512, [], \"f517\", \"M416 384H160c-35.35 0-64 28.65-64 64v32c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-32c0-35.35-28.65-64-64-64zm-128 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm40-416h166.54L512 0H48C21.49 0 0 21.49 0 48v160c0 26.51 21.49 48 48 48h103.27l8.73 96h256l17.46-64H328c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h114.18l17.46-64H328c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h140.36l17.46-64H328c-4.42 0-8-3.58-8-8V72c0-4.42 3.58-8 8-8zM64 192V64h69.82l11.64 128H64z\"]\n};\nvar faBlenderPhone = {\n prefix: 'fas',\n iconName: 'blender-phone',\n icon: [576, 512, [], \"f6b6\", \"M392 64h166.54L576 0H192v352h288l17.46-64H392c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h114.18l17.46-64H392c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h140.36l17.46-64H392c-4.42 0-8-3.58-8-8V72c0-4.42 3.58-8 8-8zM158.8 335.01l-25.78-63.26c-2.78-6.81-9.8-10.99-17.24-10.26l-45.03 4.42c-17.28-46.94-17.65-99.78 0-147.72l45.03 4.42c7.43.73 14.46-3.46 17.24-10.26l25.78-63.26c3.02-7.39.2-15.85-6.68-20.07l-39.28-24.1C98.51-3.87 80.09-.5 68.95 11.97c-92.57 103.6-92 259.55 2.1 362.49 9.87 10.8 29.12 12.48 41.65 4.8l39.41-24.18c6.89-4.22 9.7-12.67 6.69-20.07zM480 384H192c-35.35 0-64 28.65-64 64v32c0 17.67 14.33 32 32 32h352c17.67 0 32-14.33 32-32v-32c0-35.35-28.65-64-64-64zm-144 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faBlind = {\n prefix: 'fas',\n iconName: 'blind',\n icon: [384, 512, [], \"f29d\", \"M380.15 510.837a8 8 0 0 1-10.989-2.687l-125.33-206.427a31.923 31.923 0 0 0 12.958-9.485l126.048 207.608a8 8 0 0 1-2.687 10.991zM142.803 314.338l-32.54 89.485 36.12 88.285c6.693 16.36 25.377 24.192 41.733 17.501 16.357-6.692 24.193-25.376 17.501-41.734l-62.814-153.537zM96 88c24.301 0 44-19.699 44-44S120.301 0 96 0 52 19.699 52 44s19.699 44 44 44zm154.837 169.128l-120-152c-4.733-5.995-11.75-9.108-18.837-9.112V96H80v.026c-7.146.003-14.217 3.161-18.944 9.24L0 183.766v95.694c0 13.455 11.011 24.791 24.464 24.536C37.505 303.748 48 293.1 48 280v-79.766l16-20.571v140.698L9.927 469.055c-6.04 16.609 2.528 34.969 19.138 41.009 16.602 6.039 34.968-2.524 41.009-19.138L136 309.638V202.441l-31.406-39.816a4 4 0 1 1 6.269-4.971l102.3 129.217c9.145 11.584 24.368 11.339 33.708 3.965 10.41-8.216 12.159-23.334 3.966-33.708z\"]\n};\nvar faBlog = {\n prefix: 'fas',\n iconName: 'blog',\n icon: [512, 512, [], \"f781\", \"M172.2 226.8c-14.6-2.9-28.2 8.9-28.2 23.8V301c0 10.2 7.1 18.4 16.7 22 18.2 6.8 31.3 24.4 31.3 45 0 26.5-21.5 48-48 48s-48-21.5-48-48V120c0-13.3-10.7-24-24-24H24c-13.3 0-24 10.7-24 24v248c0 89.5 82.1 160.2 175 140.7 54.4-11.4 98.3-55.4 109.7-109.7 17.4-82.9-37-157.2-112.5-172.2zM209 0c-9.2-.5-17 6.8-17 16v31.6c0 8.5 6.6 15.5 15 15.9 129.4 7 233.4 112 240.9 241.5.5 8.4 7.5 15 15.9 15h32.1c9.2 0 16.5-7.8 16-17C503.4 139.8 372.2 8.6 209 0zm.3 96c-9.3-.7-17.3 6.7-17.3 16.1v32.1c0 8.4 6.5 15.3 14.8 15.9 76.8 6.3 138 68.2 144.9 145.2.8 8.3 7.6 14.7 15.9 14.7h32.2c9.3 0 16.8-8 16.1-17.3-8.4-110.1-96.5-198.2-206.6-206.7z\"]\n};\nvar faBold = {\n prefix: 'fas',\n iconName: 'bold',\n icon: [384, 512, [], \"f032\", \"M333.49 238a122 122 0 0 0 27-65.21C367.87 96.49 308 32 233.42 32H34a16 16 0 0 0-16 16v48a16 16 0 0 0 16 16h31.87v288H34a16 16 0 0 0-16 16v48a16 16 0 0 0 16 16h209.32c70.8 0 134.14-51.75 141-122.4 4.74-48.45-16.39-92.06-50.83-119.6zM145.66 112h87.76a48 48 0 0 1 0 96h-87.76zm87.76 288h-87.76V288h87.76a56 56 0 0 1 0 112z\"]\n};\nvar faBolt = {\n prefix: 'fas',\n iconName: 'bolt',\n icon: [320, 512, [], \"f0e7\", \"M296 160H180.6l42.6-129.8C227.2 15 215.7 0 200 0H56C44 0 33.8 8.9 32.2 20.8l-32 240C-1.7 275.2 9.5 288 24 288h118.7L96.6 482.5c-3.6 15.2 8 29.5 23.3 29.5 8.4 0 16.4-4.4 20.8-12l176-304c9.3-15.9-2.2-36-20.7-36z\"]\n};\nvar faBomb = {\n prefix: 'fas',\n iconName: 'bomb',\n icon: [512, 512, [], \"f1e2\", \"M440.5 88.5l-52 52L415 167c9.4 9.4 9.4 24.6 0 33.9l-17.4 17.4c11.8 26.1 18.4 55.1 18.4 85.6 0 114.9-93.1 208-208 208S0 418.9 0 304 93.1 96 208 96c30.5 0 59.5 6.6 85.6 18.4L311 97c9.4-9.4 24.6-9.4 33.9 0l26.5 26.5 52-52 17.1 17zM500 60h-24c-6.6 0-12 5.4-12 12s5.4 12 12 12h24c6.6 0 12-5.4 12-12s-5.4-12-12-12zM440 0c-6.6 0-12 5.4-12 12v24c0 6.6 5.4 12 12 12s12-5.4 12-12V12c0-6.6-5.4-12-12-12zm33.9 55l17-17c4.7-4.7 4.7-12.3 0-17-4.7-4.7-12.3-4.7-17 0l-17 17c-4.7 4.7-4.7 12.3 0 17 4.8 4.7 12.4 4.7 17 0zm-67.8 0c4.7 4.7 12.3 4.7 17 0 4.7-4.7 4.7-12.3 0-17l-17-17c-4.7-4.7-12.3-4.7-17 0-4.7 4.7-4.7 12.3 0 17l17 17zm67.8 34c-4.7-4.7-12.3-4.7-17 0-4.7 4.7-4.7 12.3 0 17l17 17c4.7 4.7 12.3 4.7 17 0 4.7-4.7 4.7-12.3 0-17l-17-17zM112 272c0-35.3 28.7-64 64-64 8.8 0 16-7.2 16-16s-7.2-16-16-16c-52.9 0-96 43.1-96 96 0 8.8 7.2 16 16 16s16-7.2 16-16z\"]\n};\nvar faBone = {\n prefix: 'fas',\n iconName: 'bone',\n icon: [640, 512, [], \"f5d7\", \"M598.88 244.56c25.2-12.6 41.12-38.36 41.12-66.53v-7.64C640 129.3 606.7 96 565.61 96c-32.02 0-60.44 20.49-70.57 50.86-7.68 23.03-11.6 45.14-38.11 45.14H183.06c-27.38 0-31.58-25.54-38.11-45.14C134.83 116.49 106.4 96 74.39 96 33.3 96 0 129.3 0 170.39v7.64c0 28.17 15.92 53.93 41.12 66.53 9.43 4.71 9.43 18.17 0 22.88C15.92 280.04 0 305.8 0 333.97v7.64C0 382.7 33.3 416 74.38 416c32.02 0 60.44-20.49 70.57-50.86 7.68-23.03 11.6-45.14 38.11-45.14h273.87c27.38 0 31.58 25.54 38.11 45.14C505.17 395.51 533.6 416 565.61 416c41.08 0 74.38-33.3 74.38-74.39v-7.64c0-28.18-15.92-53.93-41.12-66.53-9.42-4.71-9.42-18.17.01-22.88z\"]\n};\nvar faBong = {\n prefix: 'fas',\n iconName: 'bong',\n icon: [448, 512, [], \"f55c\", \"M302.5 512c23.18 0 44.43-12.58 56-32.66C374.69 451.26 384 418.75 384 384c0-36.12-10.08-69.81-27.44-98.62L400 241.94l9.38 9.38c6.25 6.25 16.38 6.25 22.63 0l11.3-11.32c6.25-6.25 6.25-16.38 0-22.63l-52.69-52.69c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63l9.38 9.38-39.41 39.41c-11.56-11.37-24.53-21.33-38.65-29.51V63.74l15.97-.02c8.82-.01 15.97-7.16 15.98-15.98l.04-31.72C320 7.17 312.82-.01 303.97 0L80.03.26c-8.82.01-15.97 7.16-15.98 15.98l-.04 31.73c-.01 8.85 7.17 16.02 16.02 16.01L96 63.96v153.93C38.67 251.1 0 312.97 0 384c0 34.75 9.31 67.27 25.5 95.34C37.08 499.42 58.33 512 81.5 512h221zM120.06 259.43L144 245.56V63.91l96-.11v181.76l23.94 13.87c24.81 14.37 44.12 35.73 56.56 60.57h-257c12.45-24.84 31.75-46.2 56.56-60.57z\"]\n};\nvar faBook = {\n prefix: 'fas',\n iconName: 'book',\n icon: [448, 512, [], \"f02d\", \"M448 360V24c0-13.3-10.7-24-24-24H96C43 0 0 43 0 96v320c0 53 43 96 96 96h328c13.3 0 24-10.7 24-24v-16c0-7.5-3.5-14.3-8.9-18.7-4.2-15.4-4.2-59.3 0-74.7 5.4-4.3 8.9-11.1 8.9-18.6zM128 134c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm0 64c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm253.4 250H96c-17.7 0-32-14.3-32-32 0-17.6 14.4-32 32-32h285.4c-1.9 17.1-1.9 46.9 0 64z\"]\n};\nvar faBookDead = {\n prefix: 'fas',\n iconName: 'book-dead',\n icon: [448, 512, [], \"f6b7\", \"M272 136c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zm176 222.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM240 56c44.2 0 80 28.7 80 64 0 20.9-12.7 39.2-32 50.9V184c0 8.8-7.2 16-16 16h-64c-8.8 0-16-7.2-16-16v-13.1c-19.3-11.7-32-30-32-50.9 0-35.3 35.8-64 80-64zM124.8 223.3l6.3-14.7c1.7-4.1 6.4-5.9 10.5-4.2l98.3 42.1 98.4-42.1c4.1-1.7 8.8.1 10.5 4.2l6.3 14.7c1.7 4.1-.1 8.8-4.2 10.5L280.6 264l70.3 30.1c4.1 1.7 5.9 6.4 4.2 10.5l-6.3 14.7c-1.7 4.1-6.4 5.9-10.5 4.2L240 281.4l-98.3 42.2c-4.1 1.7-8.8-.1-10.5-4.2l-6.3-14.7c-1.7-4.1.1-8.8 4.2-10.5l70.4-30.1-70.5-30.3c-4.1-1.7-5.9-6.4-4.2-10.5zm256 224.7H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8zM208 136c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16z\"]\n};\nvar faBookMedical = {\n prefix: 'fas',\n iconName: 'book-medical',\n icon: [448, 512, [], \"f7e6\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16q0-9.6-9.6-19.2c-3.2-16-3.2-60.8 0-73.6q9.6-4.8 9.6-19.2zM144 168a8 8 0 0 1 8-8h56v-56a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v56h56a8 8 0 0 1 8 8v48a8 8 0 0 1-8 8h-56v56a8 8 0 0 1-8 8h-48a8 8 0 0 1-8-8v-56h-56a8 8 0 0 1-8-8zm236.8 280H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8z\"]\n};\nvar faBookOpen = {\n prefix: 'fas',\n iconName: 'book-open',\n icon: [576, 512, [], \"f518\", \"M542.22 32.05c-54.8 3.11-163.72 14.43-230.96 55.59-4.64 2.84-7.27 7.89-7.27 13.17v363.87c0 11.55 12.63 18.85 23.28 13.49 69.18-34.82 169.23-44.32 218.7-46.92 16.89-.89 30.02-14.43 30.02-30.66V62.75c.01-17.71-15.35-31.74-33.77-30.7zM264.73 87.64C197.5 46.48 88.58 35.17 33.78 32.05 15.36 31.01 0 45.04 0 62.75V400.6c0 16.24 13.13 29.78 30.02 30.66 49.49 2.6 149.59 12.11 218.77 46.95 10.62 5.35 23.21-1.94 23.21-13.46V100.63c0-5.29-2.62-10.14-7.27-12.99z\"]\n};\nvar faBookReader = {\n prefix: 'fas',\n iconName: 'book-reader',\n icon: [512, 512, [], \"f5da\", \"M352 96c0-53.02-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.98 96-96zM233.59 241.1c-59.33-36.32-155.43-46.3-203.79-49.05C13.55 191.13 0 203.51 0 219.14v222.8c0 14.33 11.59 26.28 26.49 27.05 43.66 2.29 131.99 10.68 193.04 41.43 9.37 4.72 20.48-1.71 20.48-11.87V252.56c-.01-4.67-2.32-8.95-6.42-11.46zm248.61-49.05c-48.35 2.74-144.46 12.73-203.78 49.05-4.1 2.51-6.41 6.96-6.41 11.63v245.79c0 10.19 11.14 16.63 20.54 11.9 61.04-30.72 149.32-39.11 192.97-41.4 14.9-.78 26.49-12.73 26.49-27.06V219.14c-.01-15.63-13.56-28.01-29.81-27.09z\"]\n};\nvar faBookmark = {\n prefix: 'fas',\n iconName: 'bookmark',\n icon: [384, 512, [], \"f02e\", \"M0 512V48C0 21.49 21.49 0 48 0h288c26.51 0 48 21.49 48 48v464L192 400 0 512z\"]\n};\nvar faBorderAll = {\n prefix: 'fas',\n iconName: 'border-all',\n icon: [448, 512, [], \"f84c\", \"M416 32H32A32 32 0 0 0 0 64v384a32 32 0 0 0 32 32h384a32 32 0 0 0 32-32V64a32 32 0 0 0-32-32zm-32 64v128H256V96zm-192 0v128H64V96zM64 416V288h128v128zm192 0V288h128v128z\"]\n};\nvar faBorderNone = {\n prefix: 'fas',\n iconName: 'border-none',\n icon: [448, 512, [], \"f850\", \"M240 224h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-288 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 192h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-96h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-192h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM240 320h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-192h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-96 288h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96-384h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zM48 224H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 192H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-96H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-192H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-96H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faBorderStyle = {\n prefix: 'fas',\n iconName: 'border-style',\n icon: [448, 512, [], \"f853\", \"M240 416h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm192 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96-192h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 96h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 96h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-288h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-96H32A32 32 0 0 0 0 64v400a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V96h368a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faBowlingBall = {\n prefix: 'fas',\n iconName: 'bowling-ball',\n icon: [496, 512, [], \"f436\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM120 192c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm64-96c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm48 144c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faBox = {\n prefix: 'fas',\n iconName: 'box',\n icon: [512, 512, [], \"f466\", \"M509.5 184.6L458.9 32.8C452.4 13.2 434.1 0 413.4 0H272v192h238.7c-.4-2.5-.4-5-1.2-7.4zM240 0H98.6c-20.7 0-39 13.2-45.5 32.8L2.5 184.6c-.8 2.4-.8 4.9-1.2 7.4H240V0zM0 224v240c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V224H0z\"]\n};\nvar faBoxOpen = {\n prefix: 'fas',\n iconName: 'box-open',\n icon: [640, 512, [], \"f49e\", \"M425.7 256c-16.9 0-32.8-9-41.4-23.4L320 126l-64.2 106.6c-8.7 14.5-24.6 23.5-41.5 23.5-4.5 0-9-.6-13.3-1.9L64 215v178c0 14.7 10 27.5 24.2 31l216.2 54.1c10.2 2.5 20.9 2.5 31 0L551.8 424c14.2-3.6 24.2-16.4 24.2-31V215l-137 39.1c-4.3 1.3-8.8 1.9-13.3 1.9zm212.6-112.2L586.8 41c-3.1-6.2-9.8-9.8-16.7-8.9L320 64l91.7 152.1c3.8 6.3 11.4 9.3 18.5 7.3l197.9-56.5c9.9-2.9 14.7-13.9 10.2-23.1zM53.2 41L1.7 143.8c-4.6 9.2.3 20.2 10.1 23l197.9 56.5c7.1 2 14.7-1 18.5-7.3L320 64 69.8 32.1c-6.9-.8-13.5 2.7-16.6 8.9z\"]\n};\nvar faBoxes = {\n prefix: 'fas',\n iconName: 'boxes',\n icon: [576, 512, [], \"f468\", \"M560 288h-80v96l-32-21.3-32 21.3v-96h-80c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16h224c8.8 0 16-7.2 16-16V304c0-8.8-7.2-16-16-16zm-384-64h224c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16h-80v96l-32-21.3L256 96V0h-80c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16zm64 64h-80v96l-32-21.3L96 384v-96H16c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16h224c8.8 0 16-7.2 16-16V304c0-8.8-7.2-16-16-16z\"]\n};\nvar faBraille = {\n prefix: 'fas',\n iconName: 'braille',\n icon: [640, 512, [], \"f2a1\", \"M128 256c0 35.346-28.654 64-64 64S0 291.346 0 256s28.654-64 64-64 64 28.654 64 64zM64 384c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-352C28.654 32 0 60.654 0 96s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zm160 192c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 160c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zm224 192c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 160c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zm160 192c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 160c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-320c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z\"]\n};\nvar faBrain = {\n prefix: 'fas',\n iconName: 'brain',\n icon: [576, 512, [], \"f5dc\", \"M208 0c-29.9 0-54.7 20.5-61.8 48.2-.8 0-1.4-.2-2.2-.2-35.3 0-64 28.7-64 64 0 4.8.6 9.5 1.7 14C52.5 138 32 166.6 32 200c0 12.6 3.2 24.3 8.3 34.9C16.3 248.7 0 274.3 0 304c0 33.3 20.4 61.9 49.4 73.9-.9 4.6-1.4 9.3-1.4 14.1 0 39.8 32.2 72 72 72 4.1 0 8.1-.5 12-1.2 9.6 28.5 36.2 49.2 68 49.2 39.8 0 72-32.2 72-72V64c0-35.3-28.7-64-64-64zm368 304c0-29.7-16.3-55.3-40.3-69.1 5.2-10.6 8.3-22.3 8.3-34.9 0-33.4-20.5-62-49.7-74 1-4.5 1.7-9.2 1.7-14 0-35.3-28.7-64-64-64-.8 0-1.5.2-2.2.2C422.7 20.5 397.9 0 368 0c-35.3 0-64 28.6-64 64v376c0 39.8 32.2 72 72 72 31.8 0 58.4-20.7 68-49.2 3.9.7 7.9 1.2 12 1.2 39.8 0 72-32.2 72-72 0-4.8-.5-9.5-1.4-14.1 29-12 49.4-40.6 49.4-73.9z\"]\n};\nvar faBreadSlice = {\n prefix: 'fas',\n iconName: 'bread-slice',\n icon: [576, 512, [], \"f7ec\", \"M288 0C108 0 0 93.4 0 169.14 0 199.44 24.24 224 64 224v256c0 17.67 16.12 32 36 32h376c19.88 0 36-14.33 36-32V224c39.76 0 64-24.56 64-54.86C576 93.4 468 0 288 0z\"]\n};\nvar faBriefcase = {\n prefix: 'fas',\n iconName: 'briefcase',\n icon: [512, 512, [], \"f0b1\", \"M320 336c0 8.84-7.16 16-16 16h-96c-8.84 0-16-7.16-16-16v-48H0v144c0 25.6 22.4 48 48 48h416c25.6 0 48-22.4 48-48V288H320v48zm144-208h-80V80c0-25.6-22.4-48-48-48H176c-25.6 0-48 22.4-48 48v48H48c-25.6 0-48 22.4-48 48v80h512v-80c0-25.6-22.4-48-48-48zm-144 0H192V96h128v32z\"]\n};\nvar faBriefcaseMedical = {\n prefix: 'fas',\n iconName: 'briefcase-medical',\n icon: [512, 512, [], \"f469\", \"M464 128h-80V80c0-26.5-21.5-48-48-48H176c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V176c0-26.5-21.5-48-48-48zM192 96h128v32H192V96zm160 248c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48z\"]\n};\nvar faBroadcastTower = {\n prefix: 'fas',\n iconName: 'broadcast-tower',\n icon: [640, 512, [], \"f519\", \"M150.94 192h33.73c11.01 0 18.61-10.83 14.86-21.18-4.93-13.58-7.55-27.98-7.55-42.82s2.62-29.24 7.55-42.82C203.29 74.83 195.68 64 184.67 64h-33.73c-7.01 0-13.46 4.49-15.41 11.23C130.64 92.21 128 109.88 128 128c0 18.12 2.64 35.79 7.54 52.76 1.94 6.74 8.39 11.24 15.4 11.24zM89.92 23.34C95.56 12.72 87.97 0 75.96 0H40.63c-6.27 0-12.14 3.59-14.74 9.31C9.4 45.54 0 85.65 0 128c0 24.75 3.12 68.33 26.69 118.86 2.62 5.63 8.42 9.14 14.61 9.14h34.84c12.02 0 19.61-12.74 13.95-23.37-49.78-93.32-16.71-178.15-.17-209.29zM614.06 9.29C611.46 3.58 605.6 0 599.33 0h-35.42c-11.98 0-19.66 12.66-14.02 23.25 18.27 34.29 48.42 119.42.28 209.23-5.72 10.68 1.8 23.52 13.91 23.52h35.23c6.27 0 12.13-3.58 14.73-9.29C630.57 210.48 640 170.36 640 128s-9.42-82.48-25.94-118.71zM489.06 64h-33.73c-11.01 0-18.61 10.83-14.86 21.18 4.93 13.58 7.55 27.98 7.55 42.82s-2.62 29.24-7.55 42.82c-3.76 10.35 3.85 21.18 14.86 21.18h33.73c7.02 0 13.46-4.49 15.41-11.24 4.9-16.97 7.53-34.64 7.53-52.76 0-18.12-2.64-35.79-7.54-52.76-1.94-6.75-8.39-11.24-15.4-11.24zm-116.3 100.12c7.05-10.29 11.2-22.71 11.2-36.12 0-35.35-28.63-64-63.96-64-35.32 0-63.96 28.65-63.96 64 0 13.41 4.15 25.83 11.2 36.12l-130.5 313.41c-3.4 8.15.46 17.52 8.61 20.92l29.51 12.31c8.15 3.4 17.52-.46 20.91-8.61L244.96 384h150.07l49.2 118.15c3.4 8.16 12.76 12.01 20.91 8.61l29.51-12.31c8.15-3.4 12-12.77 8.61-20.92l-130.5-313.41zM271.62 320L320 203.81 368.38 320h-96.76z\"]\n};\nvar faBroom = {\n prefix: 'fas',\n iconName: 'broom',\n icon: [640, 512, [], \"f51a\", \"M256.47 216.77l86.73 109.18s-16.6 102.36-76.57 150.12C206.66 523.85 0 510.19 0 510.19s3.8-23.14 11-55.43l94.62-112.17c3.97-4.7-.87-11.62-6.65-9.5l-60.4 22.09c14.44-41.66 32.72-80.04 54.6-97.47 59.97-47.76 163.3-40.94 163.3-40.94zM636.53 31.03l-19.86-25c-5.49-6.9-15.52-8.05-22.41-2.56l-232.48 177.8-34.14-42.97c-5.09-6.41-15.14-5.21-18.59 2.21l-25.33 54.55 86.73 109.18 58.8-12.45c8-1.69 11.42-11.2 6.34-17.6l-34.09-42.92 232.48-177.8c6.89-5.48 8.04-15.53 2.55-22.44z\"]\n};\nvar faBrush = {\n prefix: 'fas',\n iconName: 'brush',\n icon: [384, 512, [], \"f55d\", \"M352 0H32C14.33 0 0 14.33 0 32v224h384V32c0-17.67-14.33-32-32-32zM0 320c0 35.35 28.66 64 64 64h64v64c0 35.35 28.66 64 64 64s64-28.65 64-64v-64h64c35.34 0 64-28.65 64-64v-32H0v32zm192 104c13.25 0 24 10.74 24 24 0 13.25-10.75 24-24 24s-24-10.75-24-24c0-13.26 10.75-24 24-24z\"]\n};\nvar faBug = {\n prefix: 'fas',\n iconName: 'bug',\n icon: [512, 512, [], \"f188\", \"M511.988 288.9c-.478 17.43-15.217 31.1-32.653 31.1H424v16c0 21.864-4.882 42.584-13.6 61.145l60.228 60.228c12.496 12.497 12.496 32.758 0 45.255-12.498 12.497-32.759 12.496-45.256 0l-54.736-54.736C345.886 467.965 314.351 480 280 480V236c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v244c-34.351 0-65.886-12.035-90.636-32.108l-54.736 54.736c-12.498 12.497-32.759 12.496-45.256 0-12.496-12.497-12.496-32.758 0-45.255l60.228-60.228C92.882 378.584 88 357.864 88 336v-16H32.666C15.23 320 .491 306.33.013 288.9-.484 270.816 14.028 256 32 256h56v-58.745l-46.628-46.628c-12.496-12.497-12.496-32.758 0-45.255 12.498-12.497 32.758-12.497 45.256 0L141.255 160h229.489l54.627-54.627c12.498-12.497 32.758-12.497 45.256 0 12.496 12.497 12.496 32.758 0 45.255L424 197.255V256h56c17.972 0 32.484 14.816 31.988 32.9zM257 0c-61.856 0-112 50.144-112 112h224C369 50.144 318.856 0 257 0z\"]\n};\nvar faBuilding = {\n prefix: 'fas',\n iconName: 'building',\n icon: [448, 512, [], \"f1ad\", \"M436 480h-20V24c0-13.255-10.745-24-24-24H56C42.745 0 32 10.745 32 24v456H12c-6.627 0-12 5.373-12 12v20h448v-20c0-6.627-5.373-12-12-12zM128 76c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12V76zm0 96c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12v-40zm52 148h-40c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12zm76 160h-64v-84c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v84zm64-172c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40zm0-96c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40zm0-96c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12V76c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40z\"]\n};\nvar faBullhorn = {\n prefix: 'fas',\n iconName: 'bullhorn',\n icon: [576, 512, [], \"f0a1\", \"M576 240c0-23.63-12.95-44.04-32-55.12V32.01C544 23.26 537.02 0 512 0c-7.12 0-14.19 2.38-19.98 7.02l-85.03 68.03C364.28 109.19 310.66 128 256 128H64c-35.35 0-64 28.65-64 64v96c0 35.35 28.65 64 64 64h33.7c-1.39 10.48-2.18 21.14-2.18 32 0 39.77 9.26 77.35 25.56 110.94 5.19 10.69 16.52 17.06 28.4 17.06h74.28c26.05 0 41.69-29.84 25.9-50.56-16.4-21.52-26.15-48.36-26.15-77.44 0-11.11 1.62-21.79 4.41-32H256c54.66 0 108.28 18.81 150.98 52.95l85.03 68.03a32.023 32.023 0 0 0 19.98 7.02c24.92 0 32-22.78 32-32V295.13C563.05 284.04 576 263.63 576 240zm-96 141.42l-33.05-26.44C392.95 311.78 325.12 288 256 288v-96c69.12 0 136.95-23.78 190.95-66.98L480 98.58v282.84z\"]\n};\nvar faBullseye = {\n prefix: 'fas',\n iconName: 'bullseye',\n icon: [496, 512, [], \"f140\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 432c-101.69 0-184-82.29-184-184 0-101.69 82.29-184 184-184 101.69 0 184 82.29 184 184 0 101.69-82.29 184-184 184zm0-312c-70.69 0-128 57.31-128 128s57.31 128 128 128 128-57.31 128-128-57.31-128-128-128zm0 192c-35.29 0-64-28.71-64-64s28.71-64 64-64 64 28.71 64 64-28.71 64-64 64z\"]\n};\nvar faBurn = {\n prefix: 'fas',\n iconName: 'burn',\n icon: [384, 512, [], \"f46a\", \"M192 0C79.7 101.3 0 220.9 0 300.5 0 425 79 512 192 512s192-87 192-211.5c0-79.9-80.2-199.6-192-300.5zm0 448c-56.5 0-96-39-96-94.8 0-13.5 4.6-61.5 96-161.2 91.4 99.7 96 147.7 96 161.2 0 55.8-39.5 94.8-96 94.8z\"]\n};\nvar faBus = {\n prefix: 'fas',\n iconName: 'bus',\n icon: [512, 512, [], \"f207\", \"M488 128h-8V80c0-44.8-99.2-80-224-80S32 35.2 32 80v48h-8c-13.25 0-24 10.74-24 24v80c0 13.25 10.75 24 24 24h8v160c0 17.67 14.33 32 32 32v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h192v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h6.4c16 0 25.6-12.8 25.6-25.6V256h8c13.25 0 24-10.75 24-24v-80c0-13.26-10.75-24-24-24zM112 400c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm16-112c-17.67 0-32-14.33-32-32V128c0-17.67 14.33-32 32-32h256c17.67 0 32 14.33 32 32v128c0 17.67-14.33 32-32 32H128zm272 112c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faBusAlt = {\n prefix: 'fas',\n iconName: 'bus-alt',\n icon: [512, 512, [], \"f55e\", \"M488 128h-8V80c0-44.8-99.2-80-224-80S32 35.2 32 80v48h-8c-13.25 0-24 10.74-24 24v80c0 13.25 10.75 24 24 24h8v160c0 17.67 14.33 32 32 32v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h192v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h6.4c16 0 25.6-12.8 25.6-25.6V256h8c13.25 0 24-10.75 24-24v-80c0-13.26-10.75-24-24-24zM160 72c0-4.42 3.58-8 8-8h176c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H168c-4.42 0-8-3.58-8-8V72zm-48 328c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm128-112H128c-17.67 0-32-14.33-32-32v-96c0-17.67 14.33-32 32-32h112v160zm32 0V128h112c17.67 0 32 14.33 32 32v96c0 17.67-14.33 32-32 32H272zm128 112c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faBusinessTime = {\n prefix: 'fas',\n iconName: 'business-time',\n icon: [640, 512, [], \"f64a\", \"M496 224c-79.59 0-144 64.41-144 144s64.41 144 144 144 144-64.41 144-144-64.41-144-144-144zm64 150.29c0 5.34-4.37 9.71-9.71 9.71h-60.57c-5.34 0-9.71-4.37-9.71-9.71v-76.57c0-5.34 4.37-9.71 9.71-9.71h12.57c5.34 0 9.71 4.37 9.71 9.71V352h38.29c5.34 0 9.71 4.37 9.71 9.71v12.58zM496 192c5.4 0 10.72.33 16 .81V144c0-25.6-22.4-48-48-48h-80V48c0-25.6-22.4-48-48-48H176c-25.6 0-48 22.4-48 48v48H48c-25.6 0-48 22.4-48 48v80h395.12c28.6-20.09 63.35-32 100.88-32zM320 96H192V64h128v32zm6.82 224H208c-8.84 0-16-7.16-16-16v-48H0v144c0 25.6 22.4 48 48 48h291.43C327.1 423.96 320 396.82 320 368c0-16.66 2.48-32.72 6.82-48z\"]\n};\nvar faCalculator = {\n prefix: 'fas',\n iconName: 'calculator',\n icon: [448, 512, [], \"f1ec\", \"M400 0H48C22.4 0 0 22.4 0 48v416c0 25.6 22.4 48 48 48h352c25.6 0 48-22.4 48-48V48c0-25.6-22.4-48-48-48zM128 435.2c0 6.4-6.4 12.8-12.8 12.8H76.8c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm0-128c0 6.4-6.4 12.8-12.8 12.8H76.8c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm128 128c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm0-128c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm128 128c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8V268.8c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v166.4zm0-256c0 6.4-6.4 12.8-12.8 12.8H76.8c-6.4 0-12.8-6.4-12.8-12.8V76.8C64 70.4 70.4 64 76.8 64h294.4c6.4 0 12.8 6.4 12.8 12.8v102.4z\"]\n};\nvar faCalendar = {\n prefix: 'fas',\n iconName: 'calendar',\n icon: [448, 512, [], \"f133\", \"M12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm436-44v-36c0-26.5-21.5-48-48-48h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v36c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12z\"]\n};\nvar faCalendarAlt = {\n prefix: 'fas',\n iconName: 'calendar-alt',\n icon: [448, 512, [], \"f073\", \"M0 464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V192H0v272zm320-196c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zm0 128c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zM192 268c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zm0 128c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zM64 268c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12v-40zm0 128c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12v-40zM400 64h-48V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H160V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H48C21.5 64 0 85.5 0 112v48h448v-48c0-26.5-21.5-48-48-48z\"]\n};\nvar faCalendarCheck = {\n prefix: 'fas',\n iconName: 'calendar-check',\n icon: [448, 512, [], \"f274\", \"M436 160H12c-6.627 0-12-5.373-12-12v-36c0-26.51 21.49-48 48-48h48V12c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v52h128V12c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v52h48c26.51 0 48 21.49 48 48v36c0 6.627-5.373 12-12 12zM12 192h424c6.627 0 12 5.373 12 12v260c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V204c0-6.627 5.373-12 12-12zm333.296 95.947l-28.169-28.398c-4.667-4.705-12.265-4.736-16.97-.068L194.12 364.665l-45.98-46.352c-4.667-4.705-12.266-4.736-16.971-.068l-28.397 28.17c-4.705 4.667-4.736 12.265-.068 16.97l82.601 83.269c4.667 4.705 12.265 4.736 16.97.068l142.953-141.805c4.705-4.667 4.736-12.265.068-16.97z\"]\n};\nvar faCalendarDay = {\n prefix: 'fas',\n iconName: 'calendar-day',\n icon: [448, 512, [], \"f783\", \"M0 464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V192H0v272zm64-192c0-8.8 7.2-16 16-16h96c8.8 0 16 7.2 16 16v96c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16v-96zM400 64h-48V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H160V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H48C21.5 64 0 85.5 0 112v48h448v-48c0-26.5-21.5-48-48-48z\"]\n};\nvar faCalendarMinus = {\n prefix: 'fas',\n iconName: 'calendar-minus',\n icon: [448, 512, [], \"f272\", \"M436 160H12c-6.6 0-12-5.4-12-12v-36c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48v36c0 6.6-5.4 12-12 12zM12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm304 192c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H132c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h184z\"]\n};\nvar faCalendarPlus = {\n prefix: 'fas',\n iconName: 'calendar-plus',\n icon: [448, 512, [], \"f271\", \"M436 160H12c-6.6 0-12-5.4-12-12v-36c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48v36c0 6.6-5.4 12-12 12zM12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm316 140c0-6.6-5.4-12-12-12h-60v-60c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v60h-60c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h60v60c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-60h60c6.6 0 12-5.4 12-12v-40z\"]\n};\nvar faCalendarTimes = {\n prefix: 'fas',\n iconName: 'calendar-times',\n icon: [448, 512, [], \"f273\", \"M436 160H12c-6.6 0-12-5.4-12-12v-36c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48v36c0 6.6-5.4 12-12 12zM12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm257.3 160l48.1-48.1c4.7-4.7 4.7-12.3 0-17l-28.3-28.3c-4.7-4.7-12.3-4.7-17 0L224 306.7l-48.1-48.1c-4.7-4.7-12.3-4.7-17 0l-28.3 28.3c-4.7 4.7-4.7 12.3 0 17l48.1 48.1-48.1 48.1c-4.7 4.7-4.7 12.3 0 17l28.3 28.3c4.7 4.7 12.3 4.7 17 0l48.1-48.1 48.1 48.1c4.7 4.7 12.3 4.7 17 0l28.3-28.3c4.7-4.7 4.7-12.3 0-17L269.3 352z\"]\n};\nvar faCalendarWeek = {\n prefix: 'fas',\n iconName: 'calendar-week',\n icon: [448, 512, [], \"f784\", \"M0 464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V192H0v272zm64-192c0-8.8 7.2-16 16-16h288c8.8 0 16 7.2 16 16v64c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16v-64zM400 64h-48V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H160V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H48C21.5 64 0 85.5 0 112v48h448v-48c0-26.5-21.5-48-48-48z\"]\n};\nvar faCamera = {\n prefix: 'fas',\n iconName: 'camera',\n icon: [512, 512, [], \"f030\", \"M512 144v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48h88l12.3-32.9c7-18.7 24.9-31.1 44.9-31.1h125.5c20 0 37.9 12.4 44.9 31.1L376 96h88c26.5 0 48 21.5 48 48zM376 288c0-66.2-53.8-120-120-120s-120 53.8-120 120 53.8 120 120 120 120-53.8 120-120zm-32 0c0 48.5-39.5 88-88 88s-88-39.5-88-88 39.5-88 88-88 88 39.5 88 88z\"]\n};\nvar faCameraRetro = {\n prefix: 'fas',\n iconName: 'camera-retro',\n icon: [512, 512, [], \"f083\", \"M48 32C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48H48zm0 32h106c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H38c-3.3 0-6-2.7-6-6V80c0-8.8 7.2-16 16-16zm426 96H38c-3.3 0-6-2.7-6-6v-36c0-3.3 2.7-6 6-6h138l30.2-45.3c1.1-1.7 3-2.7 5-2.7H464c8.8 0 16 7.2 16 16v74c0 3.3-2.7 6-6 6zM256 424c-66.2 0-120-53.8-120-120s53.8-120 120-120 120 53.8 120 120-53.8 120-120 120zm0-208c-48.5 0-88 39.5-88 88s39.5 88 88 88 88-39.5 88-88-39.5-88-88-88zm-48 104c-8.8 0-16-7.2-16-16 0-35.3 28.7-64 64-64 8.8 0 16 7.2 16 16s-7.2 16-16 16c-17.6 0-32 14.4-32 32 0 8.8-7.2 16-16 16z\"]\n};\nvar faCampground = {\n prefix: 'fas',\n iconName: 'campground',\n icon: [640, 512, [], \"f6bb\", \"M624 448h-24.68L359.54 117.75l53.41-73.55c5.19-7.15 3.61-17.16-3.54-22.35l-25.9-18.79c-7.15-5.19-17.15-3.61-22.35 3.55L320 63.3 278.83 6.6c-5.19-7.15-15.2-8.74-22.35-3.55l-25.88 18.8c-7.15 5.19-8.74 15.2-3.54 22.35l53.41 73.55L40.68 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM320 288l116.36 160H203.64L320 288z\"]\n};\nvar faCandyCane = {\n prefix: 'fas',\n iconName: 'candy-cane',\n icon: [512, 512, [], \"f786\", \"M497.5 92C469.6 33.1 411.8 0 352.4 0c-27.9 0-56.2 7.3-81.8 22.6L243.1 39c-15.2 9.1-20.1 28.7-11 43.9l32.8 54.9c6 10 16.6 15.6 27.5 15.6 5.6 0 11.2-1.5 16.4-4.5l27.5-16.4c5.1-3.1 10.8-4.5 16.4-4.5 10.9 0 21.5 5.6 27.5 15.6 9.1 15.1 4.1 34.8-11 43.9L15.6 397.6c-15.2 9.1-20.1 28.7-11 43.9l32.8 54.9c6 10 16.6 15.6 27.5 15.6 5.6 0 11.2-1.5 16.4-4.5L428.6 301c71.7-42.9 104.6-133.5 68.9-209zm-177.7 13l-2.5 1.5L296.8 45c9.7-4.7 19.8-8.1 30.3-10.2l20.6 61.8c-9.8.8-19.4 3.3-27.9 8.4zM145.9 431.8l-60.5-38.5 30.8-18.3 60.5 38.5-30.8 18.3zm107.5-63.9l-60.5-38.5 30.8-18.3 60.5 38.5-30.8 18.3zM364.3 302l-60.5-38.5 30.8-18.3 60.5 38.5-30.8 18.3zm20.4-197.3l46-46c8.4 6.5 16 14.1 22.6 22.6L407.6 127c-5.7-9.3-13.7-16.9-22.9-22.3zm82.1 107.8l-59.5-19.8c3.2-5.3 5.8-10.9 7.4-17.1 1.1-4.5 1.7-9.1 1.8-13.6l60.4 20.1c-2.1 10.4-5.5 20.6-10.1 30.4z\"]\n};\nvar faCannabis = {\n prefix: 'fas',\n iconName: 'cannabis',\n icon: [512, 512, [], \"f55f\", \"M503.47 360.25c-1.56-.82-32.39-16.89-76.78-25.81 64.25-75.12 84.05-161.67 84.93-165.64 1.18-5.33-.44-10.9-4.3-14.77-3.03-3.04-7.12-4.7-11.32-4.7-1.14 0-2.29.12-3.44.38-3.88.85-86.54 19.59-160.58 79.76.01-1.46.01-2.93.01-4.4 0-118.79-59.98-213.72-62.53-217.7A15.973 15.973 0 0 0 256 0c-5.45 0-10.53 2.78-13.47 7.37-2.55 3.98-62.53 98.91-62.53 217.7 0 1.47.01 2.94.01 4.4-74.03-60.16-156.69-78.9-160.58-79.76-1.14-.25-2.29-.38-3.44-.38-4.2 0-8.29 1.66-11.32 4.7A15.986 15.986 0 0 0 .38 168.8c.88 3.97 20.68 90.52 84.93 165.64-44.39 8.92-75.21 24.99-76.78 25.81a16.003 16.003 0 0 0-.02 28.29c2.45 1.29 60.76 31.72 133.49 31.72 6.14 0 11.96-.1 17.5-.31-11.37 22.23-16.52 38.31-16.81 39.22-1.8 5.68-.29 11.89 3.91 16.11a16.019 16.019 0 0 0 16.1 3.99c1.83-.57 37.72-11.99 77.3-39.29V504c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8v-64.01c39.58 27.3 75.47 38.71 77.3 39.29a16.019 16.019 0 0 0 16.1-3.99c4.2-4.22 5.71-10.43 3.91-16.11-.29-.91-5.45-16.99-16.81-39.22 5.54.21 11.37.31 17.5.31 72.72 0 131.04-30.43 133.49-31.72 5.24-2.78 8.52-8.22 8.51-14.15-.01-5.94-3.29-11.39-8.53-14.15z\"]\n};\nvar faCapsules = {\n prefix: 'fas',\n iconName: 'capsules',\n icon: [576, 512, [], \"f46b\", \"M555.3 300.1L424.2 112.8C401.9 81 366.4 64 330.4 64c-22.6 0-45.5 6.7-65.5 20.7-19.7 13.8-33.7 32.8-41.5 53.8C220.5 79.2 172 32 112 32 50.1 32 0 82.1 0 144v224c0 61.9 50.1 112 112 112s112-50.1 112-112V218.9c3.3 8.6 7.3 17.1 12.8 25L368 431.2c22.2 31.8 57.7 48.8 93.8 48.8 22.7 0 45.5-6.7 65.5-20.7 51.7-36.2 64.2-107.5 28-159.2zM160 256H64V144c0-26.5 21.5-48 48-48s48 21.5 48 48v112zm194.8 44.9l-65.6-93.7c-7.7-11-10.7-24.4-8.3-37.6 2.3-13.2 9.7-24.8 20.7-32.5 8.5-6 18.5-9.1 28.8-9.1 16.5 0 31.9 8 41.3 21.5l65.6 93.7-82.5 57.7z\"]\n};\nvar faCar = {\n prefix: 'fas',\n iconName: 'car',\n icon: [512, 512, [], \"f1b9\", \"M499.99 176h-59.87l-16.64-41.6C406.38 91.63 365.57 64 319.5 64h-127c-46.06 0-86.88 27.63-103.99 70.4L71.87 176H12.01C4.2 176-1.53 183.34.37 190.91l6 24C7.7 220.25 12.5 224 18.01 224h20.07C24.65 235.73 16 252.78 16 272v48c0 16.12 6.16 30.67 16 41.93V416c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h256v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-54.07c9.84-11.25 16-25.8 16-41.93v-48c0-19.22-8.65-36.27-22.07-48H494c5.51 0 10.31-3.75 11.64-9.09l6-24c1.89-7.57-3.84-14.91-11.65-14.91zm-352.06-17.83c7.29-18.22 24.94-30.17 44.57-30.17h127c19.63 0 37.28 11.95 44.57 30.17L384 208H128l19.93-49.83zM96 319.8c-19.2 0-32-12.76-32-31.9S76.8 256 96 256s48 28.71 48 47.85-28.8 15.95-48 15.95zm320 0c-19.2 0-48 3.19-48-15.95S396.8 256 416 256s32 12.76 32 31.9-12.8 31.9-32 31.9z\"]\n};\nvar faCarAlt = {\n prefix: 'fas',\n iconName: 'car-alt',\n icon: [480, 512, [], \"f5de\", \"M438.66 212.33l-11.24-28.1-19.93-49.83C390.38 91.63 349.57 64 303.5 64h-127c-46.06 0-86.88 27.63-103.99 70.4l-19.93 49.83-11.24 28.1C17.22 221.5 0 244.66 0 272v48c0 16.12 6.16 30.67 16 41.93V416c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h256v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-54.07c9.84-11.25 16-25.8 16-41.93v-48c0-27.34-17.22-50.5-41.34-59.67zm-306.73-54.16c7.29-18.22 24.94-30.17 44.57-30.17h127c19.63 0 37.28 11.95 44.57 30.17L368 208H112l19.93-49.83zM80 319.8c-19.2 0-32-12.76-32-31.9S60.8 256 80 256s48 28.71 48 47.85-28.8 15.95-48 15.95zm320 0c-19.2 0-48 3.19-48-15.95S380.8 256 400 256s32 12.76 32 31.9-12.8 31.9-32 31.9z\"]\n};\nvar faCarBattery = {\n prefix: 'fas',\n iconName: 'car-battery',\n icon: [512, 512, [], \"f5df\", \"M480 128h-32V80c0-8.84-7.16-16-16-16h-96c-8.84 0-16 7.16-16 16v48H192V80c0-8.84-7.16-16-16-16H80c-8.84 0-16 7.16-16 16v48H32c-17.67 0-32 14.33-32 32v256c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32V160c0-17.67-14.33-32-32-32zM192 264c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h112c4.42 0 8 3.58 8 8v16zm256 0c0 4.42-3.58 8-8 8h-40v40c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-40h-40c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h40v-40c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v40h40c4.42 0 8 3.58 8 8v16z\"]\n};\nvar faCarCrash = {\n prefix: 'fas',\n iconName: 'car-crash',\n icon: [640, 512, [], \"f5e1\", \"M143.25 220.81l-12.42 46.37c-3.01 11.25-3.63 22.89-2.41 34.39l-35.2 28.98c-6.57 5.41-16.31-.43-14.62-8.77l15.44-76.68c1.06-5.26-2.66-10.28-8-10.79l-77.86-7.55c-8.47-.82-11.23-11.83-4.14-16.54l65.15-43.3c4.46-2.97 5.38-9.15 1.98-13.29L21.46 93.22c-5.41-6.57.43-16.3 8.78-14.62l76.68 15.44c5.26 1.06 10.28-2.66 10.8-8l7.55-77.86c.82-8.48 11.83-11.23 16.55-4.14l43.3 65.14c2.97 4.46 9.15 5.38 13.29 1.98l60.4-49.71c6.57-5.41 16.3.43 14.62 8.77L262.1 86.38c-2.71 3.05-5.43 6.09-7.91 9.4l-32.15 42.97-10.71 14.32c-32.73 8.76-59.18 34.53-68.08 67.74zm494.57 132.51l-12.42 46.36c-3.13 11.68-9.38 21.61-17.55 29.36a66.876 66.876 0 0 1-8.76 7l-13.99 52.23c-1.14 4.27-3.1 8.1-5.65 11.38-7.67 9.84-20.74 14.68-33.54 11.25L515 502.62c-17.07-4.57-27.2-22.12-22.63-39.19l8.28-30.91-247.28-66.26-8.28 30.91c-4.57 17.07-22.12 27.2-39.19 22.63l-30.91-8.28c-12.8-3.43-21.7-14.16-23.42-26.51-.57-4.12-.35-8.42.79-12.68l13.99-52.23a66.62 66.62 0 0 1-4.09-10.45c-3.2-10.79-3.65-22.52-.52-34.2l12.42-46.37c5.31-19.8 19.36-34.83 36.89-42.21a64.336 64.336 0 0 1 18.49-4.72l18.13-24.23 32.15-42.97c3.45-4.61 7.19-8.9 11.2-12.84 8-7.89 17.03-14.44 26.74-19.51 4.86-2.54 9.89-4.71 15.05-6.49 10.33-3.58 21.19-5.63 32.24-6.04 11.05-.41 22.31.82 33.43 3.8l122.68 32.87c11.12 2.98 21.48 7.54 30.85 13.43a111.11 111.11 0 0 1 34.69 34.5c8.82 13.88 14.64 29.84 16.68 46.99l6.36 53.29 3.59 30.05a64.49 64.49 0 0 1 22.74 29.93c4.39 11.88 5.29 25.19 1.75 38.39zM255.58 234.34c-18.55-4.97-34.21 4.04-39.17 22.53-4.96 18.49 4.11 34.12 22.65 39.09 18.55 4.97 45.54 15.51 50.49-2.98 4.96-18.49-15.43-53.67-33.97-58.64zm290.61 28.17l-6.36-53.29c-.58-4.87-1.89-9.53-3.82-13.86-5.8-12.99-17.2-23.01-31.42-26.82l-122.68-32.87a48.008 48.008 0 0 0-50.86 17.61l-32.15 42.97 172 46.08 75.29 20.18zm18.49 54.65c-18.55-4.97-53.8 15.31-58.75 33.79-4.95 18.49 23.69 22.86 42.24 27.83 18.55 4.97 34.21-4.04 39.17-22.53 4.95-18.48-4.11-34.12-22.66-39.09z\"]\n};\nvar faCarSide = {\n prefix: 'fas',\n iconName: 'car-side',\n icon: [640, 512, [], \"f5e4\", \"M544 192h-16L419.22 56.02A64.025 64.025 0 0 0 369.24 32H155.33c-26.17 0-49.7 15.93-59.42 40.23L48 194.26C20.44 201.4 0 226.21 0 256v112c0 8.84 7.16 16 16 16h48c0 53.02 42.98 96 96 96s96-42.98 96-96h128c0 53.02 42.98 96 96 96s96-42.98 96-96h48c8.84 0 16-7.16 16-16v-80c0-53.02-42.98-96-96-96zM160 432c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48zm72-240H116.93l38.4-96H232v96zm48 0V96h89.24l76.8 96H280zm200 240c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48z\"]\n};\nvar faCaretDown = {\n prefix: 'fas',\n iconName: 'caret-down',\n icon: [320, 512, [], \"f0d7\", \"M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z\"]\n};\nvar faCaretLeft = {\n prefix: 'fas',\n iconName: 'caret-left',\n icon: [192, 512, [], \"f0d9\", \"M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z\"]\n};\nvar faCaretRight = {\n prefix: 'fas',\n iconName: 'caret-right',\n icon: [192, 512, [], \"f0da\", \"M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z\"]\n};\nvar faCaretSquareDown = {\n prefix: 'fas',\n iconName: 'caret-square-down',\n icon: [448, 512, [], \"f150\", \"M448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zM92.5 220.5l123 123c4.7 4.7 12.3 4.7 17 0l123-123c7.6-7.6 2.2-20.5-8.5-20.5H101c-10.7 0-16.1 12.9-8.5 20.5z\"]\n};\nvar faCaretSquareLeft = {\n prefix: 'fas',\n iconName: 'caret-square-left',\n icon: [448, 512, [], \"f191\", \"M400 480H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48zM259.515 124.485l-123.03 123.03c-4.686 4.686-4.686 12.284 0 16.971l123.029 123.029c7.56 7.56 20.485 2.206 20.485-8.485V132.971c.001-10.691-12.925-16.045-20.484-8.486z\"]\n};\nvar faCaretSquareRight = {\n prefix: 'fas',\n iconName: 'caret-square-right',\n icon: [448, 512, [], \"f152\", \"M48 32h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48zm140.485 355.515l123.029-123.029c4.686-4.686 4.686-12.284 0-16.971l-123.029-123.03c-7.56-7.56-20.485-2.206-20.485 8.485v246.059c0 10.691 12.926 16.045 20.485 8.486z\"]\n};\nvar faCaretSquareUp = {\n prefix: 'fas',\n iconName: 'caret-square-up',\n icon: [448, 512, [], \"f151\", \"M0 432V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48zm355.515-140.485l-123.03-123.03c-4.686-4.686-12.284-4.686-16.971 0L92.485 291.515c-7.56 7.56-2.206 20.485 8.485 20.485h246.059c10.691 0 16.045-12.926 8.486-20.485z\"]\n};\nvar faCaretUp = {\n prefix: 'fas',\n iconName: 'caret-up',\n icon: [320, 512, [], \"f0d8\", \"M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z\"]\n};\nvar faCarrot = {\n prefix: 'fas',\n iconName: 'carrot',\n icon: [512, 512, [], \"f787\", \"M298.2 156.6c-52.7-25.7-114.5-10.5-150.2 32.8l55.2 55.2c6.3 6.3 6.3 16.4 0 22.6-3.1 3.1-7.2 4.7-11.3 4.7s-8.2-1.6-11.3-4.7L130.4 217 2.3 479.7c-2.9 6-3.1 13.3 0 19.7 5.4 11.1 18.9 15.7 30 10.3l133.6-65.2-49.2-49.2c-6.3-6.2-6.3-16.4 0-22.6 6.3-6.2 16.4-6.2 22.6 0l57 57 102-49.8c24-11.7 44.5-31.3 57.1-57.1 30.1-61.7 4.5-136.1-57.2-166.2zm92.1-34.9C409.8 81 399.7 32.9 360 0c-50.3 41.7-52.5 107.5-7.9 151.9l8 8c44.4 44.6 110.3 42.4 151.9-7.9-32.9-39.7-81-49.8-121.7-30.3z\"]\n};\nvar faCartArrowDown = {\n prefix: 'fas',\n iconName: 'cart-arrow-down',\n icon: [576, 512, [], \"f218\", \"M504.717 320H211.572l6.545 32h268.418c15.401 0 26.816 14.301 23.403 29.319l-5.517 24.276C523.112 414.668 536 433.828 536 456c0 31.202-25.519 56.444-56.824 55.994-29.823-.429-54.35-24.631-55.155-54.447-.44-16.287 6.085-31.049 16.803-41.548H231.176C241.553 426.165 248 440.326 248 456c0 31.813-26.528 57.431-58.67 55.938-28.54-1.325-51.751-24.385-53.251-52.917-1.158-22.034 10.436-41.455 28.051-51.586L93.883 64H24C10.745 64 0 53.255 0 40V24C0 10.745 10.745 0 24 0h102.529c11.401 0 21.228 8.021 23.513 19.19L159.208 64H551.99c15.401 0 26.816 14.301 23.403 29.319l-47.273 208C525.637 312.246 515.923 320 504.717 320zM403.029 192H360v-60c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v60h-43.029c-10.691 0-16.045 12.926-8.485 20.485l67.029 67.029c4.686 4.686 12.284 4.686 16.971 0l67.029-67.029c7.559-7.559 2.205-20.485-8.486-20.485z\"]\n};\nvar faCartPlus = {\n prefix: 'fas',\n iconName: 'cart-plus',\n icon: [576, 512, [], \"f217\", \"M504.717 320H211.572l6.545 32h268.418c15.401 0 26.816 14.301 23.403 29.319l-5.517 24.276C523.112 414.668 536 433.828 536 456c0 31.202-25.519 56.444-56.824 55.994-29.823-.429-54.35-24.631-55.155-54.447-.44-16.287 6.085-31.049 16.803-41.548H231.176C241.553 426.165 248 440.326 248 456c0 31.813-26.528 57.431-58.67 55.938-28.54-1.325-51.751-24.385-53.251-52.917-1.158-22.034 10.436-41.455 28.051-51.586L93.883 64H24C10.745 64 0 53.255 0 40V24C0 10.745 10.745 0 24 0h102.529c11.401 0 21.228 8.021 23.513 19.19L159.208 64H551.99c15.401 0 26.816 14.301 23.403 29.319l-47.273 208C525.637 312.246 515.923 320 504.717 320zM408 168h-48v-40c0-8.837-7.163-16-16-16h-16c-8.837 0-16 7.163-16 16v40h-48c-8.837 0-16 7.163-16 16v16c0 8.837 7.163 16 16 16h48v40c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-40h48c8.837 0 16-7.163 16-16v-16c0-8.837-7.163-16-16-16z\"]\n};\nvar faCashRegister = {\n prefix: 'fas',\n iconName: 'cash-register',\n icon: [512, 512, [], \"f788\", \"M511.1 378.8l-26.7-160c-2.6-15.4-15.9-26.7-31.6-26.7H208v-64h96c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16H48c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h96v64H59.1c-15.6 0-29 11.3-31.6 26.7L.8 378.7c-.6 3.5-.9 7-.9 10.5V480c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32v-90.7c.1-3.5-.2-7-.8-10.5zM280 248c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16zm-32 64h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16zm-32-80c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16zM80 80V48h192v32H80zm40 200h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16zm16 64v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16zm216 112c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h176c4.4 0 8 3.6 8 8v16zm24-112c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16zm48-80c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16z\"]\n};\nvar faCat = {\n prefix: 'fas',\n iconName: 'cat',\n icon: [512, 512, [], \"f6be\", \"M290.59 192c-20.18 0-106.82 1.98-162.59 85.95V192c0-52.94-43.06-96-96-96-17.67 0-32 14.33-32 32s14.33 32 32 32c17.64 0 32 14.36 32 32v256c0 35.3 28.7 64 64 64h176c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-32l128-96v144c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V289.86c-10.29 2.67-20.89 4.54-32 4.54-61.81 0-113.52-44.05-125.41-102.4zM448 96h-64l-64-64v134.4c0 53.02 42.98 96 96 96s96-42.98 96-96V32l-64 64zm-72 80c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm80 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z\"]\n};\nvar faCertificate = {\n prefix: 'fas',\n iconName: 'certificate',\n icon: [512, 512, [], \"f0a3\", \"M458.622 255.92l45.985-45.005c13.708-12.977 7.316-36.039-10.664-40.339l-62.65-15.99 17.661-62.015c4.991-17.838-11.829-34.663-29.661-29.671l-61.994 17.667-15.984-62.671C337.085.197 313.765-6.276 300.99 7.228L256 53.57 211.011 7.229c-12.63-13.351-36.047-7.234-40.325 10.668l-15.984 62.671-61.995-17.667C74.87 57.907 58.056 74.738 63.046 92.572l17.661 62.015-62.65 15.99C.069 174.878-6.31 197.944 7.392 210.915l45.985 45.005-45.985 45.004c-13.708 12.977-7.316 36.039 10.664 40.339l62.65 15.99-17.661 62.015c-4.991 17.838 11.829 34.663 29.661 29.671l61.994-17.667 15.984 62.671c4.439 18.575 27.696 24.018 40.325 10.668L256 458.61l44.989 46.001c12.5 13.488 35.987 7.486 40.325-10.668l15.984-62.671 61.994 17.667c17.836 4.994 34.651-11.837 29.661-29.671l-17.661-62.015 62.65-15.99c17.987-4.302 24.366-27.367 10.664-40.339l-45.984-45.004z\"]\n};\nvar faChair = {\n prefix: 'fas',\n iconName: 'chair',\n icon: [448, 512, [], \"f6c0\", \"M112 128c0-29.5 16.2-55 40-68.9V256h48V48h48v208h48V59.1c23.8 13.9 40 39.4 40 68.9v128h48V128C384 57.3 326.7 0 256 0h-64C121.3 0 64 57.3 64 128v128h48zm334.3 213.9l-10.7-32c-4.4-13.1-16.6-21.9-30.4-21.9H42.7c-13.8 0-26 8.8-30.4 21.9l-10.7 32C-5.2 362.6 10.2 384 32 384v112c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V384h256v112c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V384c21.8 0 37.2-21.4 30.3-42.1z\"]\n};\nvar faChalkboard = {\n prefix: 'fas',\n iconName: 'chalkboard',\n icon: [640, 512, [], \"f51b\", \"M96 64h448v352h64V40c0-22.06-17.94-40-40-40H72C49.94 0 32 17.94 32 40v376h64V64zm528 384H480v-64H288v64H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faChalkboardTeacher = {\n prefix: 'fas',\n iconName: 'chalkboard-teacher',\n icon: [640, 512, [], \"f51c\", \"M208 352c-2.39 0-4.78.35-7.06 1.09C187.98 357.3 174.35 360 160 360c-14.35 0-27.98-2.7-40.95-6.91-2.28-.74-4.66-1.09-7.05-1.09C49.94 352-.33 402.48 0 464.62.14 490.88 21.73 512 48 512h224c26.27 0 47.86-21.12 48-47.38.33-62.14-49.94-112.62-112-112.62zm-48-32c53.02 0 96-42.98 96-96s-42.98-96-96-96-96 42.98-96 96 42.98 96 96 96zM592 0H208c-26.47 0-48 22.25-48 49.59V96c23.42 0 45.1 6.78 64 17.8V64h352v288h-64v-64H384v64h-76.24c19.1 16.69 33.12 38.73 39.69 64H592c26.47 0 48-22.25 48-49.59V49.59C640 22.25 618.47 0 592 0z\"]\n};\nvar faChargingStation = {\n prefix: 'fas',\n iconName: 'charging-station',\n icon: [576, 512, [], \"f5e7\", \"M336 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h320c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm208-320V80c0-8.84-7.16-16-16-16s-16 7.16-16 16v48h-32V80c0-8.84-7.16-16-16-16s-16 7.16-16 16v48h-16c-8.84 0-16 7.16-16 16v32c0 35.76 23.62 65.69 56 75.93v118.49c0 13.95-9.5 26.92-23.26 29.19C431.22 402.5 416 388.99 416 372v-28c0-48.6-39.4-88-88-88h-8V64c0-35.35-28.65-64-64-64H96C60.65 0 32 28.65 32 64v352h288V304h8c22.09 0 40 17.91 40 40v24.61c0 39.67 28.92 75.16 68.41 79.01C481.71 452.05 520 416.41 520 372V251.93c32.38-10.24 56-40.17 56-75.93v-32c0-8.84-7.16-16-16-16h-16zm-283.91 47.76l-93.7 139c-2.2 3.33-6.21 5.24-10.39 5.24-7.67 0-13.47-6.28-11.67-12.92L167.35 224H108c-7.25 0-12.85-5.59-11.89-11.89l16-107C112.9 99.9 117.98 96 124 96h68c7.88 0 13.62 6.54 11.6 13.21L192 160h57.7c9.24 0 15.01 8.78 10.39 15.76z\"]\n};\nvar faChartArea = {\n prefix: 'fas',\n iconName: 'chart-area',\n icon: [512, 512, [], \"f1fe\", \"M500 384c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v308h436zM372.7 159.5L288 216l-85.3-113.7c-5.1-6.8-15.5-6.3-19.9 1L96 248v104h384l-89.9-187.8c-3.2-6.5-11.4-8.7-17.4-4.7z\"]\n};\nvar faChartBar = {\n prefix: 'fas',\n iconName: 'chart-bar',\n icon: [512, 512, [], \"f080\", \"M332.8 320h38.4c6.4 0 12.8-6.4 12.8-12.8V172.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h38.4c6.4 0 12.8-6.4 12.8-12.8V76.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-288 0h38.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h38.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zM496 384H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faChartLine = {\n prefix: 'fas',\n iconName: 'chart-line',\n icon: [512, 512, [], \"f201\", \"M496 384H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM464 96H345.94c-21.38 0-32.09 25.85-16.97 40.97l32.4 32.4L288 242.75l-73.37-73.37c-12.5-12.5-32.76-12.5-45.25 0l-68.69 68.69c-6.25 6.25-6.25 16.38 0 22.63l22.62 22.62c6.25 6.25 16.38 6.25 22.63 0L192 237.25l73.37 73.37c12.5 12.5 32.76 12.5 45.25 0l96-96 32.4 32.4c15.12 15.12 40.97 4.41 40.97-16.97V112c.01-8.84-7.15-16-15.99-16z\"]\n};\nvar faChartPie = {\n prefix: 'fas',\n iconName: 'chart-pie',\n icon: [544, 512, [], \"f200\", \"M527.79 288H290.5l158.03 158.03c6.04 6.04 15.98 6.53 22.19.68 38.7-36.46 65.32-85.61 73.13-140.86 1.34-9.46-6.51-17.85-16.06-17.85zm-15.83-64.8C503.72 103.74 408.26 8.28 288.8.04 279.68-.59 272 7.1 272 16.24V240h223.77c9.14 0 16.82-7.68 16.19-16.8zM224 288V50.71c0-9.55-8.39-17.4-17.84-16.06C86.99 51.49-4.1 155.6.14 280.37 4.5 408.51 114.83 513.59 243.03 511.98c50.4-.63 96.97-16.87 135.26-44.03 7.9-5.6 8.42-17.23 1.57-24.08L224 288z\"]\n};\nvar faCheck = {\n prefix: 'fas',\n iconName: 'check',\n icon: [512, 512, [], \"f00c\", \"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"]\n};\nvar faCheckCircle = {\n prefix: 'fas',\n iconName: 'check-circle',\n icon: [512, 512, [], \"f058\", \"M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z\"]\n};\nvar faCheckDouble = {\n prefix: 'fas',\n iconName: 'check-double',\n icon: [512, 512, [], \"f560\", \"M505 174.8l-39.6-39.6c-9.4-9.4-24.6-9.4-33.9 0L192 374.7 80.6 263.2c-9.4-9.4-24.6-9.4-33.9 0L7 302.9c-9.4 9.4-9.4 24.6 0 34L175 505c9.4 9.4 24.6 9.4 33.9 0l296-296.2c9.4-9.5 9.4-24.7.1-34zm-324.3 106c6.2 6.3 16.4 6.3 22.6 0l208-208.2c6.2-6.3 6.2-16.4 0-22.6L366.1 4.7c-6.2-6.3-16.4-6.3-22.6 0L192 156.2l-55.4-55.5c-6.2-6.3-16.4-6.3-22.6 0L68.7 146c-6.2 6.3-6.2 16.4 0 22.6l112 112.2z\"]\n};\nvar faCheckSquare = {\n prefix: 'fas',\n iconName: 'check-square',\n icon: [448, 512, [], \"f14a\", \"M400 480H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48zm-204.686-98.059l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.248-16.379-6.249-22.628 0L184 302.745l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.25 16.379 6.25 22.628.001z\"]\n};\nvar faCheese = {\n prefix: 'fas',\n iconName: 'cheese',\n icon: [512, 512, [], \"f7ef\", \"M0 288v160a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32V288zM299.83 32a32 32 0 0 0-21.13 7L0 256h512c0-119.89-94-217.8-212.17-224z\"]\n};\nvar faChess = {\n prefix: 'fas',\n iconName: 'chess',\n icon: [512, 512, [], \"f439\", \"M74 208H64a16 16 0 0 0-16 16v16a16 16 0 0 0 16 16h15.94A535.78 535.78 0 0 1 64 384h128a535.78 535.78 0 0 1-15.94-128H192a16 16 0 0 0 16-16v-16a16 16 0 0 0-16-16h-10l33.89-90.38a16 16 0 0 0-15-21.62H144V64h24a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8h-24V8a8 8 0 0 0-8-8h-16a8 8 0 0 0-8 8v24H88a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8h24v32H55.09a16 16 0 0 0-15 21.62zm173.16 251.58L224 448v-16a16 16 0 0 0-16-16H48a16 16 0 0 0-16 16v16L8.85 459.58A16 16 0 0 0 0 473.89V496a16 16 0 0 0 16 16h224a16 16 0 0 0 16-16v-22.11a16 16 0 0 0-8.84-14.31zm92.77-157.78l-3.29 82.2h126.72l-3.29-82.21 24.6-20.79A32 32 0 0 0 496 256.54V198a6 6 0 0 0-6-6h-26.38a6 6 0 0 0-6 6v26h-24.71v-26a6 6 0 0 0-6-6H373.1a6 6 0 0 0-6 6v26h-24.71v-26a6 6 0 0 0-6-6H310a6 6 0 0 0-6 6v58.6a32 32 0 0 0 11.36 24.4zM384 304a16 16 0 0 1 32 0v32h-32zm119.16 155.58L480 448v-16a16 16 0 0 0-16-16H336a16 16 0 0 0-16 16v16l-23.15 11.58a16 16 0 0 0-8.85 14.31V496a16 16 0 0 0 16 16h192a16 16 0 0 0 16-16v-22.11a16 16 0 0 0-8.84-14.31z\"]\n};\nvar faChessBishop = {\n prefix: 'fas',\n iconName: 'chess-bishop',\n icon: [320, 512, [], \"f43a\", \"M8 287.88c0 51.64 22.14 73.83 56 84.6V416h192v-43.52c33.86-10.77 56-33 56-84.6 0-30.61-10.73-67.1-26.69-102.56L185 285.65a8 8 0 0 1-11.31 0l-11.31-11.31a8 8 0 0 1 0-11.31L270.27 155.1c-20.8-37.91-46.47-72.1-70.87-92.59C213.4 59.09 224 47.05 224 32a32 32 0 0 0-32-32h-64a32 32 0 0 0-32 32c0 15 10.6 27.09 24.6 30.51C67.81 106.8 8 214.5 8 287.88zM304 448H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faChessBoard = {\n prefix: 'fas',\n iconName: 'chess-board',\n icon: [512, 512, [], \"f43c\", \"M255.9.2h-64v64h64zM0 64.17v64h64v-64zM128 .2H64v64h64zm64 255.9v64h64v-64zM0 192.12v64h64v-64zM383.85.2h-64v64h64zm128 0h-64v64h64zM128 256.1H64v64h64zM511.8 448v-64h-64v64zm0-128v-64h-64v64zM383.85 512h64v-64h-64zm128-319.88v-64h-64v64zM128 512h64v-64h-64zM0 512h64v-64H0zm255.9 0h64v-64h-64zM0 320.07v64h64v-64zm319.88-191.92v-64h-64v64zm-64 128h64v-64h-64zm-64 128v64h64v-64zm128-64h64v-64h-64zm0-127.95h64v-64h-64zm0 191.93v64h64v-64zM64 384.05v64h64v-64zm128-255.9v-64h-64v64zm191.92 255.9h64v-64h-64zm-128-191.93v-64h-64v64zm128-127.95v64h64v-64zm-128 255.9v64h64v-64zm-64-127.95H128v64h64zm191.92 64h64v-64h-64zM128 128.15H64v64h64zm0 191.92v64h64v-64z\"]\n};\nvar faChessKing = {\n prefix: 'fas',\n iconName: 'chess-king',\n icon: [448, 512, [], \"f43f\", \"M400 448H48a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h352a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm16-288H256v-48h40a8 8 0 0 0 8-8V56a8 8 0 0 0-8-8h-40V8a8 8 0 0 0-8-8h-48a8 8 0 0 0-8 8v40h-40a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8h40v48H32a32 32 0 0 0-30.52 41.54L74.56 416h298.88l73.08-214.46A32 32 0 0 0 416 160z\"]\n};\nvar faChessKnight = {\n prefix: 'fas',\n iconName: 'chess-knight',\n icon: [384, 512, [], \"f441\", \"M19 272.47l40.63 18.06a32 32 0 0 0 24.88.47l12.78-5.12a32 32 0 0 0 18.76-20.5l9.22-30.65a24 24 0 0 1 12.55-15.65L159.94 208v50.33a48 48 0 0 1-26.53 42.94l-57.22 28.65A80 80 0 0 0 32 401.48V416h319.86V224c0-106-85.92-192-191.92-192H12A12 12 0 0 0 0 44a16.9 16.9 0 0 0 1.79 7.58L16 80l-9 9a24 24 0 0 0-7 17v137.21a32 32 0 0 0 19 29.26zM52 128a20 20 0 1 1-20 20 20 20 0 0 1 20-20zm316 320H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h352a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faChessPawn = {\n prefix: 'fas',\n iconName: 'chess-pawn',\n icon: [320, 512, [], \"f443\", \"M105.1 224H80a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h16v5.49c0 44-4.14 86.6-24 122.51h176c-19.89-35.91-24-78.51-24-122.51V288h16a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-25.1c29.39-18.38 49.1-50.78 49.1-88a104 104 0 0 0-208 0c0 37.22 19.71 69.62 49.1 88zM304 448H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faChessQueen = {\n prefix: 'fas',\n iconName: 'chess-queen',\n icon: [512, 512, [], \"f445\", \"M256 112a56 56 0 1 0-56-56 56 56 0 0 0 56 56zm176 336H80a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h352a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm72.87-263.84l-28.51-15.92c-7.44-5-16.91-2.46-22.29 4.68a47.59 47.59 0 0 1-47.23 18.23C383.7 186.86 368 164.93 368 141.4a13.4 13.4 0 0 0-13.4-13.4h-38.77c-6 0-11.61 4-12.86 9.91a48 48 0 0 1-93.94 0c-1.25-5.92-6.82-9.91-12.86-9.91H157.4a13.4 13.4 0 0 0-13.4 13.4c0 25.69-19 48.75-44.67 50.49a47.5 47.5 0 0 1-41.54-19.15c-5.28-7.09-14.73-9.45-22.09-4.54l-28.57 16a16 16 0 0 0-5.44 20.47L104.24 416h303.52l102.55-211.37a16 16 0 0 0-5.44-20.47z\"]\n};\nvar faChessRook = {\n prefix: 'fas',\n iconName: 'chess-rook',\n icon: [384, 512, [], \"f447\", \"M368 32h-56a16 16 0 0 0-16 16v48h-48V48a16 16 0 0 0-16-16h-80a16 16 0 0 0-16 16v48H88.1V48a16 16 0 0 0-16-16H16A16 16 0 0 0 0 48v176l64 32c0 48.33-1.54 95-13.21 160h282.42C321.54 351 320 303.72 320 256l64-32V48a16 16 0 0 0-16-16zM224 320h-64v-64a32 32 0 0 1 64 0zm144 128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h352a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faChevronCircleDown = {\n prefix: 'fas',\n iconName: 'chevron-circle-down',\n icon: [512, 512, [], \"f13a\", \"M504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zM273 369.9l135.5-135.5c9.4-9.4 9.4-24.6 0-33.9l-17-17c-9.4-9.4-24.6-9.4-33.9 0L256 285.1 154.4 183.5c-9.4-9.4-24.6-9.4-33.9 0l-17 17c-9.4 9.4-9.4 24.6 0 33.9L239 369.9c9.4 9.4 24.6 9.4 34 0z\"]\n};\nvar faChevronCircleLeft = {\n prefix: 'fas',\n iconName: 'chevron-circle-left',\n icon: [512, 512, [], \"f137\", \"M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zM142.1 273l135.5 135.5c9.4 9.4 24.6 9.4 33.9 0l17-17c9.4-9.4 9.4-24.6 0-33.9L226.9 256l101.6-101.6c9.4-9.4 9.4-24.6 0-33.9l-17-17c-9.4-9.4-24.6-9.4-33.9 0L142.1 239c-9.4 9.4-9.4 24.6 0 34z\"]\n};\nvar faChevronCircleRight = {\n prefix: 'fas',\n iconName: 'chevron-circle-right',\n icon: [512, 512, [], \"f138\", \"M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zm113.9 231L234.4 103.5c-9.4-9.4-24.6-9.4-33.9 0l-17 17c-9.4 9.4-9.4 24.6 0 33.9L285.1 256 183.5 357.6c-9.4 9.4-9.4 24.6 0 33.9l17 17c9.4 9.4 24.6 9.4 33.9 0L369.9 273c9.4-9.4 9.4-24.6 0-34z\"]\n};\nvar faChevronCircleUp = {\n prefix: 'fas',\n iconName: 'chevron-circle-up',\n icon: [512, 512, [], \"f139\", \"M8 256C8 119 119 8 256 8s248 111 248 248-111 248-248 248S8 393 8 256zm231-113.9L103.5 277.6c-9.4 9.4-9.4 24.6 0 33.9l17 17c9.4 9.4 24.6 9.4 33.9 0L256 226.9l101.6 101.6c9.4 9.4 24.6 9.4 33.9 0l17-17c9.4-9.4 9.4-24.6 0-33.9L273 142.1c-9.4-9.4-24.6-9.4-34 0z\"]\n};\nvar faChevronDown = {\n prefix: 'fas',\n iconName: 'chevron-down',\n icon: [448, 512, [], \"f078\", \"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"]\n};\nvar faChevronLeft = {\n prefix: 'fas',\n iconName: 'chevron-left',\n icon: [320, 512, [], \"f053\", \"M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z\"]\n};\nvar faChevronRight = {\n prefix: 'fas',\n iconName: 'chevron-right',\n icon: [320, 512, [], \"f054\", \"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"]\n};\nvar faChevronUp = {\n prefix: 'fas',\n iconName: 'chevron-up',\n icon: [448, 512, [], \"f077\", \"M240.971 130.524l194.343 194.343c9.373 9.373 9.373 24.569 0 33.941l-22.667 22.667c-9.357 9.357-24.522 9.375-33.901.04L224 227.495 69.255 381.516c-9.379 9.335-24.544 9.317-33.901-.04l-22.667-22.667c-9.373-9.373-9.373-24.569 0-33.941L207.03 130.525c9.372-9.373 24.568-9.373 33.941-.001z\"]\n};\nvar faChild = {\n prefix: 'fas',\n iconName: 'child',\n icon: [384, 512, [], \"f1ae\", \"M120 72c0-39.765 32.235-72 72-72s72 32.235 72 72c0 39.764-32.235 72-72 72s-72-32.236-72-72zm254.627 1.373c-12.496-12.497-32.758-12.497-45.254 0L242.745 160H141.254L54.627 73.373c-12.496-12.497-32.758-12.497-45.254 0-12.497 12.497-12.497 32.758 0 45.255L104 213.254V480c0 17.673 14.327 32 32 32h16c17.673 0 32-14.327 32-32V368h16v112c0 17.673 14.327 32 32 32h16c17.673 0 32-14.327 32-32V213.254l94.627-94.627c12.497-12.497 12.497-32.757 0-45.254z\"]\n};\nvar faChurch = {\n prefix: 'fas',\n iconName: 'church',\n icon: [640, 512, [], \"f51d\", \"M464.46 246.68L352 179.2V128h48c8.84 0 16-7.16 16-16V80c0-8.84-7.16-16-16-16h-48V16c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v48h-48c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h48v51.2l-112.46 67.48A31.997 31.997 0 0 0 160 274.12V512h96v-96c0-35.35 28.65-64 64-64s64 28.65 64 64v96h96V274.12c0-11.24-5.9-21.66-15.54-27.44zM0 395.96V496c0 8.84 7.16 16 16 16h112V320L19.39 366.54A32.024 32.024 0 0 0 0 395.96zm620.61-29.42L512 320v192h112c8.84 0 16-7.16 16-16V395.96c0-12.8-7.63-24.37-19.39-29.42z\"]\n};\nvar faCircle = {\n prefix: 'fas',\n iconName: 'circle',\n icon: [512, 512, [], \"f111\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z\"]\n};\nvar faCircleNotch = {\n prefix: 'fas',\n iconName: 'circle-notch',\n icon: [512, 512, [], \"f1ce\", \"M288 39.056v16.659c0 10.804 7.281 20.159 17.686 23.066C383.204 100.434 440 171.518 440 256c0 101.689-82.295 184-184 184-101.689 0-184-82.295-184-184 0-84.47 56.786-155.564 134.312-177.219C216.719 75.874 224 66.517 224 55.712V39.064c0-15.709-14.834-27.153-30.046-23.234C86.603 43.482 7.394 141.206 8.003 257.332c.72 137.052 111.477 246.956 248.531 246.667C393.255 503.711 504 392.788 504 256c0-115.633-79.14-212.779-186.211-240.236C302.678 11.889 288 23.456 288 39.056z\"]\n};\nvar faCity = {\n prefix: 'fas',\n iconName: 'city',\n icon: [640, 512, [], \"f64f\", \"M616 192H480V24c0-13.26-10.74-24-24-24H312c-13.26 0-24 10.74-24 24v72h-64V16c0-8.84-7.16-16-16-16h-16c-8.84 0-16 7.16-16 16v80h-64V16c0-8.84-7.16-16-16-16H80c-8.84 0-16 7.16-16 16v80H24c-13.26 0-24 10.74-24 24v360c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V216c0-13.26-10.75-24-24-24zM128 404c0 6.63-5.37 12-12 12H76c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12H76c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12H76c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm128 192c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm160 96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12V76c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm160 288c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40z\"]\n};\nvar faClinicMedical = {\n prefix: 'fas',\n iconName: 'clinic-medical',\n icon: [576, 512, [], \"f7f2\", \"M288 115L69.47 307.71c-1.62 1.46-3.69 2.14-5.47 3.35V496a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V311.1c-1.7-1.16-3.72-1.82-5.26-3.2zm96 261a8 8 0 0 1-8 8h-56v56a8 8 0 0 1-8 8h-48a8 8 0 0 1-8-8v-56h-56a8 8 0 0 1-8-8v-48a8 8 0 0 1 8-8h56v-56a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v56h56a8 8 0 0 1 8 8zm186.69-139.72l-255.94-226a39.85 39.85 0 0 0-53.45 0l-256 226a16 16 0 0 0-1.21 22.6L25.5 282.7a16 16 0 0 0 22.6 1.21L277.42 81.63a16 16 0 0 1 21.17 0L527.91 283.9a16 16 0 0 0 22.6-1.21l21.4-23.82a16 16 0 0 0-1.22-22.59z\"]\n};\nvar faClipboard = {\n prefix: 'fas',\n iconName: 'clipboard',\n icon: [384, 512, [], \"f328\", \"M384 112v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h80c0-35.29 28.71-64 64-64s64 28.71 64 64h80c26.51 0 48 21.49 48 48zM192 40c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24m96 114v-20a6 6 0 0 0-6-6H102a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h180a6 6 0 0 0 6-6z\"]\n};\nvar faClipboardCheck = {\n prefix: 'fas',\n iconName: 'clipboard-check',\n icon: [384, 512, [], \"f46c\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm121.2 231.8l-143 141.8c-4.7 4.7-12.3 4.6-17-.1l-82.6-83.3c-4.7-4.7-4.6-12.3.1-17L99.1 285c4.7-4.7 12.3-4.6 17 .1l46 46.4 106-105.2c4.7-4.7 12.3-4.6 17 .1l28.2 28.4c4.7 4.8 4.6 12.3-.1 17z\"]\n};\nvar faClipboardList = {\n prefix: 'fas',\n iconName: 'clipboard-list',\n icon: [384, 512, [], \"f46d\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM96 424c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zm0-96c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zm0-96c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zm96-192c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm128 368c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faClock = {\n prefix: 'fas',\n iconName: 'clock',\n icon: [512, 512, [], \"f017\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm57.1 350.1L224.9 294c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12v137.7l63.5 46.2c5.4 3.9 6.5 11.4 2.6 16.8l-28.2 38.8c-3.9 5.3-11.4 6.5-16.8 2.6z\"]\n};\nvar faClone = {\n prefix: 'fas',\n iconName: 'clone',\n icon: [512, 512, [], \"f24d\", \"M464 0c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48H176c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h288M176 416c-44.112 0-80-35.888-80-80V128H48c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48v-48H176z\"]\n};\nvar faClosedCaptioning = {\n prefix: 'fas',\n iconName: 'closed-captioning',\n icon: [512, 512, [], \"f20a\", \"M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM218.1 287.7c2.8-2.5 7.1-2.1 9.2.9l19.5 27.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2.1 48 51.1 70.5 92.3 32.6zm190.4 0c2.8-2.5 7.1-2.1 9.2.9l19.5 27.7c1.7 2.4 1.5 5.6-.5 7.7-53.5 56.9-172.7 32.1-172.7-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 222.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6z\"]\n};\nvar faCloud = {\n prefix: 'fas',\n iconName: 'cloud',\n icon: [640, 512, [], \"f0c2\", \"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4z\"]\n};\nvar faCloudDownloadAlt = {\n prefix: 'fas',\n iconName: 'cloud-download-alt',\n icon: [640, 512, [], \"f381\", \"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z\"]\n};\nvar faCloudMeatball = {\n prefix: 'fas',\n iconName: 'cloud-meatball',\n icon: [512, 512, [], \"f73b\", \"M48 352c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm416 0c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm-119 11.1c4.6-14.5 1.6-30.8-9.8-42.3-11.5-11.5-27.8-14.4-42.3-9.9-7-13.5-20.7-23-36.9-23s-29.9 9.5-36.9 23c-14.5-4.6-30.8-1.6-42.3 9.9-11.5 11.5-14.4 27.8-9.9 42.3-13.5 7-23 20.7-23 36.9s9.5 29.9 23 36.9c-4.6 14.5-1.6 30.8 9.9 42.3 8.2 8.2 18.9 12.3 29.7 12.3 4.3 0 8.5-1.1 12.6-2.5 7 13.5 20.7 23 36.9 23s29.9-9.5 36.9-23c4.1 1.3 8.3 2.5 12.6 2.5 10.8 0 21.5-4.1 29.7-12.3 11.5-11.5 14.4-27.8 9.8-42.3 13.5-7 23-20.7 23-36.9s-9.5-29.9-23-36.9zM512 224c0-53-43-96-96-96-.6 0-1.1.2-1.6.2 1.1-5.2 1.6-10.6 1.6-16.2 0-44.2-35.8-80-80-80-24.6 0-46.3 11.3-61 28.8C256.4 24.8 219.3 0 176 0 114.1 0 64 50.1 64 112c0 7.3.8 14.3 2.1 21.2C27.8 145.8 0 181.5 0 224c0 53 43 96 96 96h43.4c3.6-8 8.4-15.4 14.8-21.8 13.5-13.5 31.5-21.1 50.8-21.3 13.5-13.2 31.7-20.9 51-20.9s37.5 7.7 51 20.9c19.3.2 37.3 7.8 50.8 21.3 6.4 6.4 11.3 13.8 14.8 21.8H416c53 0 96-43 96-96z\"]\n};\nvar faCloudMoon = {\n prefix: 'fas',\n iconName: 'cloud-moon',\n icon: [576, 512, [], \"f6c3\", \"M342.8 352.7c5.7-9.6 9.2-20.7 9.2-32.7 0-35.3-28.7-64-64-64-17.2 0-32.8 6.9-44.3 17.9-16.3-29.6-47.5-49.9-83.7-49.9-53 0-96 43-96 96 0 2 .5 3.8.6 5.7C27.1 338.8 0 374.1 0 416c0 53 43 96 96 96h240c44.2 0 80-35.8 80-80 0-41.9-32.3-75.8-73.2-79.3zm222.5-54.3c-93.1 17.7-178.5-53.7-178.5-147.7 0-54.2 29-104 76.1-130.8 7.3-4.1 5.4-15.1-2.8-16.7C448.4 1.1 436.7 0 425 0 319.1 0 233.1 85.9 233.1 192c0 8.5.7 16.8 1.8 25 5.9 4.3 11.6 8.9 16.7 14.2 11.4-4.7 23.7-7.2 36.4-7.2 52.9 0 96 43.1 96 96 0 3.6-.2 7.2-.6 10.7 23.6 10.8 42.4 29.5 53.5 52.6 54.4-3.4 103.7-29.3 137.1-70.4 5.3-6.5-.5-16.1-8.7-14.5z\"]\n};\nvar faCloudMoonRain = {\n prefix: 'fas',\n iconName: 'cloud-moon-rain',\n icon: [576, 512, [], \"f73c\", \"M350.5 225.5c-6.9-37.2-39.3-65.5-78.5-65.5-12.3 0-23.9 3-34.3 8-17.4-24.1-45.6-40-77.7-40-53 0-96 43-96 96 0 .5.2 1.1.2 1.6C27.6 232.9 0 265.2 0 304c0 44.2 35.8 80 80 80h256c44.2 0 80-35.8 80-80 0-39.2-28.2-71.7-65.5-78.5zm217.4-1.7c-70.4 13.3-135-40.3-135-110.8 0-40.6 21.9-78 57.5-98.1 5.5-3.1 4.1-11.4-2.1-12.5C479.6.8 470.7 0 461.8 0c-77.9 0-141.1 61.2-144.4 137.9 26.7 11.9 48.2 33.8 58.9 61.7 37.1 14.3 64 47.4 70.2 86.8 5.1.5 10 1.5 15.2 1.5 44.7 0 85.6-20.2 112.6-53.3 4.2-4.8-.2-12-6.4-10.8zM364.5 418.1c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8z\"]\n};\nvar faCloudRain = {\n prefix: 'fas',\n iconName: 'cloud-rain',\n icon: [512, 512, [], \"f73d\", \"M416 128c-.6 0-1.1.2-1.6.2 1.1-5.2 1.6-10.6 1.6-16.2 0-44.2-35.8-80-80-80-24.6 0-46.3 11.3-61 28.8C256.4 24.8 219.3 0 176 0 114.1 0 64 50.1 64 112c0 7.3.8 14.3 2.1 21.2C27.8 145.8 0 181.5 0 224c0 53 43 96 96 96h320c53 0 96-43 96-96s-43-96-96-96zM88 374.2c-12.8 44.4-40 56.4-40 87.7 0 27.7 21.5 50.1 48 50.1s48-22.4 48-50.1c0-31.4-27.2-43.1-40-87.7-2.2-8.1-13.5-8.5-16 0zm160 0c-12.8 44.4-40 56.4-40 87.7 0 27.7 21.5 50.1 48 50.1s48-22.4 48-50.1c0-31.4-27.2-43.1-40-87.7-2.2-8.1-13.5-8.5-16 0zm160 0c-12.8 44.4-40 56.4-40 87.7 0 27.7 21.5 50.1 48 50.1s48-22.4 48-50.1c0-31.4-27.2-43.1-40-87.7-2.2-8.1-13.5-8.5-16 0z\"]\n};\nvar faCloudShowersHeavy = {\n prefix: 'fas',\n iconName: 'cloud-showers-heavy',\n icon: [512, 512, [], \"f740\", \"M183.9 370.1c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm96 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm-192 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm384 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm-96 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zM416 128c-.6 0-1.1.2-1.6.2 1.1-5.2 1.6-10.6 1.6-16.2 0-44.2-35.8-80-80-80-24.6 0-46.3 11.3-61 28.8C256.4 24.8 219.3 0 176 0 114.2 0 64 50.1 64 112c0 7.3.8 14.3 2.1 21.2C27.8 145.8 0 181.5 0 224c0 53 43 96 96 96h320c53 0 96-43 96-96s-43-96-96-96z\"]\n};\nvar faCloudSun = {\n prefix: 'fas',\n iconName: 'cloud-sun',\n icon: [640, 512, [], \"f6c4\", \"M575.2 325.7c.2-1.9.8-3.7.8-5.6 0-35.3-28.7-64-64-64-12.6 0-24.2 3.8-34.1 10-17.6-38.8-56.5-66-101.9-66-61.8 0-112 50.1-112 112 0 3 .7 5.8.9 8.7-49.6 3.7-88.9 44.7-88.9 95.3 0 53 43 96 96 96h272c53 0 96-43 96-96 0-42.1-27.2-77.4-64.8-90.4zm-430.4-22.6c-43.7-43.7-43.7-114.7 0-158.3 43.7-43.7 114.7-43.7 158.4 0 9.7 9.7 16.9 20.9 22.3 32.7 9.8-3.7 20.1-6 30.7-7.5L386 81.1c4-11.9-7.3-23.1-19.2-19.2L279 91.2 237.5 8.4C232-2.8 216-2.8 210.4 8.4L169 91.2 81.1 61.9C69.3 58 58 69.3 61.9 81.1l29.3 87.8-82.8 41.5c-11.2 5.6-11.2 21.5 0 27.1l82.8 41.4-29.3 87.8c-4 11.9 7.3 23.1 19.2 19.2l76.1-25.3c6.1-12.4 14-23.7 23.6-33.5-13.1-5.4-25.4-13.4-36-24zm-4.8-79.2c0 40.8 29.3 74.8 67.9 82.3 8-4.7 16.3-8.8 25.2-11.7 5.4-44.3 31-82.5 67.4-105C287.3 160.4 258 140 224 140c-46.3 0-84 37.6-84 83.9z\"]\n};\nvar faCloudSunRain = {\n prefix: 'fas',\n iconName: 'cloud-sun-rain',\n icon: [576, 512, [], \"f743\", \"M510.5 225.5c-6.9-37.2-39.3-65.5-78.5-65.5-12.3 0-23.9 3-34.3 8-17.4-24.1-45.6-40-77.7-40-53 0-96 43-96 96 0 .5.2 1.1.2 1.6C187.6 233 160 265.2 160 304c0 44.2 35.8 80 80 80h256c44.2 0 80-35.8 80-80 0-39.2-28.2-71.7-65.5-78.5zm-386.4 34.4c-37.4-37.4-37.4-98.3 0-135.8 34.6-34.6 89.1-36.8 126.7-7.4 20-12.9 43.6-20.7 69.2-20.7.7 0 1.3.2 2 .2l8.9-26.7c3.4-10.2-6.3-19.8-16.5-16.4l-75.3 25.1-35.5-71c-4.8-9.6-18.5-9.6-23.3 0l-35.5 71-75.3-25.1c-10.2-3.4-19.8 6.3-16.4 16.5l25.1 75.3-71 35.5c-9.6 4.8-9.6 18.5 0 23.3l71 35.5-25.1 75.3c-3.4 10.2 6.3 19.8 16.5 16.5l59.2-19.7c-.2-2.4-.7-4.7-.7-7.2 0-12.5 2.3-24.5 6.2-35.9-3.6-2.7-7.1-5.2-10.2-8.3zm69.8-58c4.3-24.5 15.8-46.4 31.9-64-9.8-6.2-21.4-9.9-33.8-9.9-35.3 0-64 28.7-64 64 0 18.7 8.2 35.4 21.1 47.1 11.3-15.9 26.6-28.9 44.8-37.2zm330.6 216.2c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8z\"]\n};\nvar faCloudUploadAlt = {\n prefix: 'fas',\n iconName: 'cloud-upload-alt',\n icon: [640, 512, [], \"f382\", \"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zM393.4 288H328v112c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V288h-65.4c-14.3 0-21.4-17.2-11.3-27.3l105.4-105.4c6.2-6.2 16.4-6.2 22.6 0l105.4 105.4c10.1 10.1 2.9 27.3-11.3 27.3z\"]\n};\nvar faCocktail = {\n prefix: 'fas',\n iconName: 'cocktail',\n icon: [576, 512, [], \"f561\", \"M296 464h-56V338.78l168.74-168.73c15.52-15.52 4.53-42.05-17.42-42.05H24.68c-21.95 0-32.94 26.53-17.42 42.05L176 338.78V464h-56c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h240c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40zM432 0c-62.61 0-115.35 40.2-135.18 96h52.54c16.65-28.55 47.27-48 82.64-48 52.93 0 96 43.06 96 96s-43.07 96-96 96c-14.04 0-27.29-3.2-39.32-8.64l-35.26 35.26C379.23 279.92 404.59 288 432 288c79.53 0 144-64.47 144-144S511.53 0 432 0z\"]\n};\nvar faCode = {\n prefix: 'fas',\n iconName: 'code',\n icon: [640, 512, [], \"f121\", \"M278.9 511.5l-61-17.7c-6.4-1.8-10-8.5-8.2-14.9L346.2 8.7c1.8-6.4 8.5-10 14.9-8.2l61 17.7c6.4 1.8 10 8.5 8.2 14.9L293.8 503.3c-1.9 6.4-8.5 10.1-14.9 8.2zm-114-112.2l43.5-46.4c4.6-4.9 4.3-12.7-.8-17.2L117 256l90.6-79.7c5.1-4.5 5.5-12.3.8-17.2l-43.5-46.4c-4.5-4.8-12.1-5.1-17-.5L3.8 247.2c-5.1 4.7-5.1 12.8 0 17.5l144.1 135.1c4.9 4.6 12.5 4.4 17-.5zm327.2.6l144.1-135.1c5.1-4.7 5.1-12.8 0-17.5L492.1 112.1c-4.8-4.5-12.4-4.3-17 .5L431.6 159c-4.6 4.9-4.3 12.7.8 17.2L523 256l-90.6 79.7c-5.1 4.5-5.5 12.3-.8 17.2l43.5 46.4c4.5 4.9 12.1 5.1 17 .6z\"]\n};\nvar faCodeBranch = {\n prefix: 'fas',\n iconName: 'code-branch',\n icon: [384, 512, [], \"f126\", \"M384 144c0-44.2-35.8-80-80-80s-80 35.8-80 80c0 36.4 24.3 67.1 57.5 76.8-.6 16.1-4.2 28.5-11 36.9-15.4 19.2-49.3 22.4-85.2 25.7-28.2 2.6-57.4 5.4-81.3 16.9v-144c32.5-10.2 56-40.5 56-76.3 0-44.2-35.8-80-80-80S0 35.8 0 80c0 35.8 23.5 66.1 56 76.3v199.3C23.5 365.9 0 396.2 0 432c0 44.2 35.8 80 80 80s80-35.8 80-80c0-34-21.2-63.1-51.2-74.6 3.1-5.2 7.8-9.8 14.9-13.4 16.2-8.2 40.4-10.4 66.1-12.8 42.2-3.9 90-8.4 118.2-43.4 14-17.4 21.1-39.8 21.6-67.9 31.6-10.8 54.4-40.7 54.4-75.9zM80 64c8.8 0 16 7.2 16 16s-7.2 16-16 16-16-7.2-16-16 7.2-16 16-16zm0 384c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm224-320c8.8 0 16 7.2 16 16s-7.2 16-16 16-16-7.2-16-16 7.2-16 16-16z\"]\n};\nvar faCoffee = {\n prefix: 'fas',\n iconName: 'coffee',\n icon: [640, 512, [], \"f0f4\", \"M192 384h192c53 0 96-43 96-96h32c70.6 0 128-57.4 128-128S582.6 32 512 32H120c-13.3 0-24 10.7-24 24v232c0 53 43 96 96 96zM512 96c35.3 0 64 28.7 64 64s-28.7 64-64 64h-32V96h32zm47.7 384H48.3c-47.6 0-61-64-36-64h583.3c25 0 11.8 64-35.9 64z\"]\n};\nvar faCog = {\n prefix: 'fas',\n iconName: 'cog',\n icon: [512, 512, [], \"f013\", \"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faCogs = {\n prefix: 'fas',\n iconName: 'cogs',\n icon: [640, 512, [], \"f085\", \"M512.1 191l-8.2 14.3c-3 5.3-9.4 7.5-15.1 5.4-11.8-4.4-22.6-10.7-32.1-18.6-4.6-3.8-5.8-10.5-2.8-15.7l8.2-14.3c-6.9-8-12.3-17.3-15.9-27.4h-16.5c-6 0-11.2-4.3-12.2-10.3-2-12-2.1-24.6 0-37.1 1-6 6.2-10.4 12.2-10.4h16.5c3.6-10.1 9-19.4 15.9-27.4l-8.2-14.3c-3-5.2-1.9-11.9 2.8-15.7 9.5-7.9 20.4-14.2 32.1-18.6 5.7-2.1 12.1.1 15.1 5.4l8.2 14.3c10.5-1.9 21.2-1.9 31.7 0L552 6.3c3-5.3 9.4-7.5 15.1-5.4 11.8 4.4 22.6 10.7 32.1 18.6 4.6 3.8 5.8 10.5 2.8 15.7l-8.2 14.3c6.9 8 12.3 17.3 15.9 27.4h16.5c6 0 11.2 4.3 12.2 10.3 2 12 2.1 24.6 0 37.1-1 6-6.2 10.4-12.2 10.4h-16.5c-3.6 10.1-9 19.4-15.9 27.4l8.2 14.3c3 5.2 1.9 11.9-2.8 15.7-9.5 7.9-20.4 14.2-32.1 18.6-5.7 2.1-12.1-.1-15.1-5.4l-8.2-14.3c-10.4 1.9-21.2 1.9-31.7 0zm-10.5-58.8c38.5 29.6 82.4-14.3 52.8-52.8-38.5-29.7-82.4 14.3-52.8 52.8zM386.3 286.1l33.7 16.8c10.1 5.8 14.5 18.1 10.5 29.1-8.9 24.2-26.4 46.4-42.6 65.8-7.4 8.9-20.2 11.1-30.3 5.3l-29.1-16.8c-16 13.7-34.6 24.6-54.9 31.7v33.6c0 11.6-8.3 21.6-19.7 23.6-24.6 4.2-50.4 4.4-75.9 0-11.5-2-20-11.9-20-23.6V418c-20.3-7.2-38.9-18-54.9-31.7L74 403c-10 5.8-22.9 3.6-30.3-5.3-16.2-19.4-33.3-41.6-42.2-65.7-4-10.9.4-23.2 10.5-29.1l33.3-16.8c-3.9-20.9-3.9-42.4 0-63.4L12 205.8c-10.1-5.8-14.6-18.1-10.5-29 8.9-24.2 26-46.4 42.2-65.8 7.4-8.9 20.2-11.1 30.3-5.3l29.1 16.8c16-13.7 34.6-24.6 54.9-31.7V57.1c0-11.5 8.2-21.5 19.6-23.5 24.6-4.2 50.5-4.4 76-.1 11.5 2 20 11.9 20 23.6v33.6c20.3 7.2 38.9 18 54.9 31.7l29.1-16.8c10-5.8 22.9-3.6 30.3 5.3 16.2 19.4 33.2 41.6 42.1 65.8 4 10.9.1 23.2-10 29.1l-33.7 16.8c3.9 21 3.9 42.5 0 63.5zm-117.6 21.1c59.2-77-28.7-164.9-105.7-105.7-59.2 77 28.7 164.9 105.7 105.7zm243.4 182.7l-8.2 14.3c-3 5.3-9.4 7.5-15.1 5.4-11.8-4.4-22.6-10.7-32.1-18.6-4.6-3.8-5.8-10.5-2.8-15.7l8.2-14.3c-6.9-8-12.3-17.3-15.9-27.4h-16.5c-6 0-11.2-4.3-12.2-10.3-2-12-2.1-24.6 0-37.1 1-6 6.2-10.4 12.2-10.4h16.5c3.6-10.1 9-19.4 15.9-27.4l-8.2-14.3c-3-5.2-1.9-11.9 2.8-15.7 9.5-7.9 20.4-14.2 32.1-18.6 5.7-2.1 12.1.1 15.1 5.4l8.2 14.3c10.5-1.9 21.2-1.9 31.7 0l8.2-14.3c3-5.3 9.4-7.5 15.1-5.4 11.8 4.4 22.6 10.7 32.1 18.6 4.6 3.8 5.8 10.5 2.8 15.7l-8.2 14.3c6.9 8 12.3 17.3 15.9 27.4h16.5c6 0 11.2 4.3 12.2 10.3 2 12 2.1 24.6 0 37.1-1 6-6.2 10.4-12.2 10.4h-16.5c-3.6 10.1-9 19.4-15.9 27.4l8.2 14.3c3 5.2 1.9 11.9-2.8 15.7-9.5 7.9-20.4 14.2-32.1 18.6-5.7 2.1-12.1-.1-15.1-5.4l-8.2-14.3c-10.4 1.9-21.2 1.9-31.7 0zM501.6 431c38.5 29.6 82.4-14.3 52.8-52.8-38.5-29.6-82.4 14.3-52.8 52.8z\"]\n};\nvar faCoins = {\n prefix: 'fas',\n iconName: 'coins',\n icon: [512, 512, [], \"f51e\", \"M0 405.3V448c0 35.3 86 64 192 64s192-28.7 192-64v-42.7C342.7 434.4 267.2 448 192 448S41.3 434.4 0 405.3zM320 128c106 0 192-28.7 192-64S426 0 320 0 128 28.7 128 64s86 64 192 64zM0 300.4V352c0 35.3 86 64 192 64s192-28.7 192-64v-51.6c-41.3 34-116.9 51.6-192 51.6S41.3 334.4 0 300.4zm416 11c57.3-11.1 96-31.7 96-55.4v-42.7c-23.2 16.4-57.3 27.6-96 34.5v63.6zM192 160C86 160 0 195.8 0 240s86 80 192 80 192-35.8 192-80-86-80-192-80zm219.3 56.3c60-10.8 100.7-32 100.7-56.3v-42.7c-35.5 25.1-96.5 38.6-160.7 41.8 29.5 14.3 51.2 33.5 60 57.2z\"]\n};\nvar faColumns = {\n prefix: 'fas',\n iconName: 'columns',\n icon: [512, 512, [], \"f0db\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"]\n};\nvar faComment = {\n prefix: 'fas',\n iconName: 'comment',\n icon: [512, 512, [], \"f075\", \"M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7S4.8 480 8 480c66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32z\"]\n};\nvar faCommentAlt = {\n prefix: 'fas',\n iconName: 'comment-alt',\n icon: [512, 512, [], \"f27a\", \"M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 9.8 11.2 15.5 19.1 9.7L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64z\"]\n};\nvar faCommentDollar = {\n prefix: 'fas',\n iconName: 'comment-dollar',\n icon: [512, 512, [], \"f651\", \"M256 32C114.62 32 0 125.12 0 240c0 49.56 21.41 95.01 57.02 130.74C44.46 421.05 2.7 465.97 2.2 466.5A7.995 7.995 0 0 0 8 480c66.26 0 115.99-31.75 140.6-51.38C181.29 440.93 217.59 448 256 448c141.38 0 256-93.12 256-208S397.38 32 256 32zm24 302.44V352c0 8.84-7.16 16-16 16h-16c-8.84 0-16-7.16-16-16v-17.73c-11.42-1.35-22.28-5.19-31.78-11.46-6.22-4.11-6.82-13.11-1.55-18.38l17.52-17.52c3.74-3.74 9.31-4.24 14.11-2.03 3.18 1.46 6.66 2.22 10.26 2.22h32.78c4.66 0 8.44-3.78 8.44-8.42 0-3.75-2.52-7.08-6.12-8.11l-50.07-14.3c-22.25-6.35-40.01-24.71-42.91-47.67-4.05-32.07 19.03-59.43 49.32-63.05V128c0-8.84 7.16-16 16-16h16c8.84 0 16 7.16 16 16v17.73c11.42 1.35 22.28 5.19 31.78 11.46 6.22 4.11 6.82 13.11 1.55 18.38l-17.52 17.52c-3.74 3.74-9.31 4.24-14.11 2.03a24.516 24.516 0 0 0-10.26-2.22h-32.78c-4.66 0-8.44 3.78-8.44 8.42 0 3.75 2.52 7.08 6.12 8.11l50.07 14.3c22.25 6.36 40.01 24.71 42.91 47.67 4.05 32.06-19.03 59.42-49.32 63.04z\"]\n};\nvar faCommentDots = {\n prefix: 'fas',\n iconName: 'comment-dots',\n icon: [512, 512, [], \"f4ad\", \"M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7S4.8 480 8 480c66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32zM128 272c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faCommentMedical = {\n prefix: 'fas',\n iconName: 'comment-medical',\n icon: [512, 512, [], \"f7f5\", \"M256 32C114.62 32 0 125.12 0 240c0 49.56 21.41 95 57 130.74C44.46 421.05 2.7 466 2.2 466.5A8 8 0 0 0 8 480c66.26 0 116-31.75 140.6-51.38A304.66 304.66 0 0 0 256 448c141.39 0 256-93.12 256-208S397.39 32 256 32zm96 232a8 8 0 0 1-8 8h-56v56a8 8 0 0 1-8 8h-48a8 8 0 0 1-8-8v-56h-56a8 8 0 0 1-8-8v-48a8 8 0 0 1 8-8h56v-56a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v56h56a8 8 0 0 1 8 8z\"]\n};\nvar faCommentSlash = {\n prefix: 'fas',\n iconName: 'comment-slash',\n icon: [640, 512, [], \"f4b3\", \"M64 240c0 49.6 21.4 95 57 130.7-12.6 50.3-54.3 95.2-54.8 95.8-2.2 2.3-2.8 5.7-1.5 8.7 1.3 2.9 4.1 4.8 7.3 4.8 66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 27.4 0 53.7-3.6 78.4-10L72.9 186.4c-5.6 17.1-8.9 35-8.9 53.6zm569.8 218.1l-114.4-88.4C554.6 334.1 576 289.2 576 240c0-114.9-114.6-208-256-208-65.1 0-124.2 20.1-169.4 52.7L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3z\"]\n};\nvar faComments = {\n prefix: 'fas',\n iconName: 'comments',\n icon: [576, 512, [], \"f086\", \"M416 192c0-88.4-93.1-160-208-160S0 103.6 0 192c0 34.3 14.1 65.9 38 92-13.4 30.2-35.5 54.2-35.8 54.5-2.2 2.3-2.8 5.7-1.5 8.7S4.8 352 8 352c36.6 0 66.9-12.3 88.7-25 32.2 15.7 70.3 25 111.3 25 114.9 0 208-71.6 208-160zm122 220c23.9-26 38-57.7 38-92 0-66.9-53.5-124.2-129.3-148.1.9 6.6 1.3 13.3 1.3 20.1 0 105.9-107.7 192-240 192-10.8 0-21.3-.8-31.7-1.9C207.8 439.6 281.8 480 368 480c41 0 79.1-9.2 111.3-25 21.8 12.7 52.1 25 88.7 25 3.2 0 6.1-1.9 7.3-4.8 1.3-2.9.7-6.3-1.5-8.7-.3-.3-22.4-24.2-35.8-54.5z\"]\n};\nvar faCommentsDollar = {\n prefix: 'fas',\n iconName: 'comments-dollar',\n icon: [576, 512, [], \"f653\", \"M416 192c0-88.37-93.12-160-208-160S0 103.63 0 192c0 34.27 14.13 65.95 37.97 91.98C24.61 314.22 2.52 338.16 2.2 338.5A7.995 7.995 0 0 0 8 352c36.58 0 66.93-12.25 88.73-24.98C128.93 342.76 167.02 352 208 352c114.88 0 208-71.63 208-160zm-224 96v-16.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V96c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.05 44.44-42.67 45.07V288c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm346.01 123.99C561.87 385.96 576 354.27 576 320c0-66.94-53.49-124.2-129.33-148.07.86 6.6 1.33 13.29 1.33 20.07 0 105.87-107.66 192-240 192-10.78 0-21.32-.77-31.73-1.88C207.8 439.63 281.77 480 368 480c40.98 0 79.07-9.24 111.27-24.98C501.07 467.75 531.42 480 568 480c3.2 0 6.09-1.91 7.34-4.84 1.27-2.94.66-6.34-1.55-8.67-.31-.33-22.42-24.24-35.78-54.5z\"]\n};\nvar faCompactDisc = {\n prefix: 'fas',\n iconName: 'compact-disc',\n icon: [496, 512, [], \"f51f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM88 256H56c0-105.9 86.1-192 192-192v32c-88.2 0-160 71.8-160 160zm160 96c-53 0-96-43-96-96s43-96 96-96 96 43 96 96-43 96-96 96zm0-128c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faCompass = {\n prefix: 'fas',\n iconName: 'compass',\n icon: [496, 512, [], \"f14e\", \"M225.38 233.37c-12.5 12.5-12.5 32.76 0 45.25 12.49 12.5 32.76 12.5 45.25 0 12.5-12.5 12.5-32.76 0-45.25-12.5-12.49-32.76-12.49-45.25 0zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm126.14 148.05L308.17 300.4a31.938 31.938 0 0 1-15.77 15.77l-144.34 65.97c-16.65 7.61-33.81-9.55-26.2-26.2l65.98-144.35a31.938 31.938 0 0 1 15.77-15.77l144.34-65.97c16.65-7.6 33.8 9.55 26.19 26.2z\"]\n};\nvar faCompress = {\n prefix: 'fas',\n iconName: 'compress',\n icon: [448, 512, [], \"f066\", \"M436 192H312c-13.3 0-24-10.7-24-24V44c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v84h84c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm-276-24V44c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v84H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24zm0 300V344c0-13.3-10.7-24-24-24H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-84h84c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H312c-13.3 0-24 10.7-24 24v124c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12z\"]\n};\nvar faCompressArrowsAlt = {\n prefix: 'fas',\n iconName: 'compress-arrows-alt',\n icon: [512, 512, [], \"f78c\", \"M200 288H88c-21.4 0-32.1 25.8-17 41l32.9 31-99.2 99.3c-6.2 6.2-6.2 16.4 0 22.6l25.4 25.4c6.2 6.2 16.4 6.2 22.6 0L152 408l31.1 33c15.1 15.1 40.9 4.4 40.9-17V312c0-13.3-10.7-24-24-24zm112-64h112c21.4 0 32.1-25.9 17-41l-33-31 99.3-99.3c6.2-6.2 6.2-16.4 0-22.6L481.9 4.7c-6.2-6.2-16.4-6.2-22.6 0L360 104l-31.1-33C313.8 55.9 288 66.6 288 88v112c0 13.3 10.7 24 24 24zm96 136l33-31.1c15.1-15.1 4.4-40.9-17-40.9H312c-13.3 0-24 10.7-24 24v112c0 21.4 25.9 32.1 41 17l31-32.9 99.3 99.3c6.2 6.2 16.4 6.2 22.6 0l25.4-25.4c6.2-6.2 6.2-16.4 0-22.6L408 360zM183 71.1L152 104 52.7 4.7c-6.2-6.2-16.4-6.2-22.6 0L4.7 30.1c-6.2 6.2-6.2 16.4 0 22.6L104 152l-33 31.1C55.9 198.2 66.6 224 88 224h112c13.3 0 24-10.7 24-24V88c0-21.3-25.9-32-41-16.9z\"]\n};\nvar faConciergeBell = {\n prefix: 'fas',\n iconName: 'concierge-bell',\n icon: [512, 512, [], \"f562\", \"M288 130.54V112h16c8.84 0 16-7.16 16-16V80c0-8.84-7.16-16-16-16h-96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h16v18.54C115.49 146.11 32 239.18 32 352h448c0-112.82-83.49-205.89-192-221.46zM496 384H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faCookie = {\n prefix: 'fas',\n iconName: 'cookie',\n icon: [512, 512, [], \"f563\", \"M510.37 254.79l-12.08-76.26a132.493 132.493 0 0 0-37.16-72.95l-54.76-54.75c-19.73-19.72-45.18-32.7-72.71-37.05l-76.7-12.15c-27.51-4.36-55.69.11-80.52 12.76L107.32 49.6a132.25 132.25 0 0 0-57.79 57.8l-35.1 68.88a132.602 132.602 0 0 0-12.82 80.94l12.08 76.27a132.493 132.493 0 0 0 37.16 72.95l54.76 54.75a132.087 132.087 0 0 0 72.71 37.05l76.7 12.14c27.51 4.36 55.69-.11 80.52-12.75l69.12-35.21a132.302 132.302 0 0 0 57.79-57.8l35.1-68.87c12.71-24.96 17.2-53.3 12.82-80.96zM176 368c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm32-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm160 128c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faCookieBite = {\n prefix: 'fas',\n iconName: 'cookie-bite',\n icon: [512, 512, [], \"f564\", \"M510.52 255.82c-69.97-.85-126.47-57.69-126.47-127.86-70.17 0-127-56.49-127.86-126.45-27.26-4.14-55.13.3-79.72 12.82l-69.13 35.22a132.221 132.221 0 0 0-57.79 57.81l-35.1 68.88a132.645 132.645 0 0 0-12.82 80.95l12.08 76.27a132.521 132.521 0 0 0 37.16 72.96l54.77 54.76a132.036 132.036 0 0 0 72.71 37.06l76.71 12.15c27.51 4.36 55.7-.11 80.53-12.76l69.13-35.21a132.273 132.273 0 0 0 57.79-57.81l35.1-68.88c12.56-24.64 17.01-52.58 12.91-79.91zM176 368c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm32-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm160 128c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faCopy = {\n prefix: 'fas',\n iconName: 'copy',\n icon: [448, 512, [], \"f0c5\", \"M320 448v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V120c0-13.255 10.745-24 24-24h72v296c0 30.879 25.121 56 56 56h168zm0-344V0H152c-13.255 0-24 10.745-24 24v368c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24V128H344c-13.2 0-24-10.8-24-24zm120.971-31.029L375.029 7.029A24 24 0 0 0 358.059 0H352v96h96v-6.059a24 24 0 0 0-7.029-16.97z\"]\n};\nvar faCopyright = {\n prefix: 'fas',\n iconName: 'copyright',\n icon: [512, 512, [], \"f1f9\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm117.134 346.753c-1.592 1.867-39.776 45.731-109.851 45.731-84.692 0-144.484-63.26-144.484-145.567 0-81.303 62.004-143.401 143.762-143.401 66.957 0 101.965 37.315 103.422 38.904a12 12 0 0 1 1.238 14.623l-22.38 34.655c-4.049 6.267-12.774 7.351-18.234 2.295-.233-.214-26.529-23.88-61.88-23.88-46.116 0-73.916 33.575-73.916 76.082 0 39.602 25.514 79.692 74.277 79.692 38.697 0 65.28-28.338 65.544-28.625 5.132-5.565 14.059-5.033 18.508 1.053l24.547 33.572a12.001 12.001 0 0 1-.553 14.866z\"]\n};\nvar faCouch = {\n prefix: 'fas',\n iconName: 'couch',\n icon: [640, 512, [], \"f4b8\", \"M160 224v64h320v-64c0-35.3 28.7-64 64-64h32c0-53-43-96-96-96H160c-53 0-96 43-96 96h32c35.3 0 64 28.7 64 64zm416-32h-32c-17.7 0-32 14.3-32 32v96H128v-96c0-17.7-14.3-32-32-32H64c-35.3 0-64 28.7-64 64 0 23.6 13 44 32 55.1V432c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-16h384v16c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16V311.1c19-11.1 32-31.5 32-55.1 0-35.3-28.7-64-64-64z\"]\n};\nvar faCreditCard = {\n prefix: 'fas',\n iconName: 'credit-card',\n icon: [576, 512, [], \"f09d\", \"M0 432c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V256H0v176zm192-68c0-6.6 5.4-12 12-12h136c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H204c-6.6 0-12-5.4-12-12v-40zm-128 0c0-6.6 5.4-12 12-12h72c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12v-40zM576 80v48H0V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48z\"]\n};\nvar faCrop = {\n prefix: 'fas',\n iconName: 'crop',\n icon: [512, 512, [], \"f125\", \"M488 352h-40V109.25l59.31-59.31c6.25-6.25 6.25-16.38 0-22.63L484.69 4.69c-6.25-6.25-16.38-6.25-22.63 0L402.75 64H192v96h114.75L160 306.75V24c0-13.26-10.75-24-24-24H88C74.75 0 64 10.74 64 24v40H24C10.75 64 0 74.74 0 88v48c0 13.25 10.75 24 24 24h40v264c0 13.25 10.75 24 24 24h232v-96H205.25L352 205.25V488c0 13.25 10.75 24 24 24h48c13.25 0 24-10.75 24-24v-40h40c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"]\n};\nvar faCropAlt = {\n prefix: 'fas',\n iconName: 'crop-alt',\n icon: [512, 512, [], \"f565\", \"M488 352h-40V96c0-17.67-14.33-32-32-32H192v96h160v328c0 13.25 10.75 24 24 24h48c13.25 0 24-10.75 24-24v-40h40c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24zM160 24c0-13.26-10.75-24-24-24H88C74.75 0 64 10.74 64 24v40H24C10.75 64 0 74.74 0 88v48c0 13.25 10.75 24 24 24h40v256c0 17.67 14.33 32 32 32h224v-96H160V24z\"]\n};\nvar faCross = {\n prefix: 'fas',\n iconName: 'cross',\n icon: [384, 512, [], \"f654\", \"M352 128h-96V32c0-17.67-14.33-32-32-32h-64c-17.67 0-32 14.33-32 32v96H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h96v224c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V256h96c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32z\"]\n};\nvar faCrosshairs = {\n prefix: 'fas',\n iconName: 'crosshairs',\n icon: [512, 512, [], \"f05b\", \"M500 224h-30.364C455.724 130.325 381.675 56.276 288 42.364V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v30.364C130.325 56.276 56.276 130.325 42.364 224H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h30.364C56.276 381.675 130.325 455.724 224 469.636V500c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-30.364C381.675 455.724 455.724 381.675 469.636 288H500c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zM288 404.634V364c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40.634C165.826 392.232 119.783 346.243 107.366 288H148c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40.634C119.768 165.826 165.757 119.783 224 107.366V148c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40.634C346.174 119.768 392.217 165.757 404.634 224H364c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40.634C392.232 346.174 346.243 392.217 288 404.634zM288 256c0 17.673-14.327 32-32 32s-32-14.327-32-32c0-17.673 14.327-32 32-32s32 14.327 32 32z\"]\n};\nvar faCrow = {\n prefix: 'fas',\n iconName: 'crow',\n icon: [640, 512, [], \"f520\", \"M544 32h-16.36C513.04 12.68 490.09 0 464 0c-44.18 0-80 35.82-80 80v20.98L12.09 393.57A30.216 30.216 0 0 0 0 417.74c0 22.46 23.64 37.07 43.73 27.03L165.27 384h96.49l44.41 120.1c2.27 6.23 9.15 9.44 15.38 7.17l22.55-8.21c6.23-2.27 9.44-9.15 7.17-15.38L312.94 384H352c1.91 0 3.76-.23 5.66-.29l44.51 120.38c2.27 6.23 9.15 9.44 15.38 7.17l22.55-8.21c6.23-2.27 9.44-9.15 7.17-15.38l-41.24-111.53C485.74 352.8 544 279.26 544 192v-80l96-16c0-35.35-42.98-64-96-64zm-80 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faCrown = {\n prefix: 'fas',\n iconName: 'crown',\n icon: [640, 512, [], \"f521\", \"M528 448H112c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h416c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm64-320c-26.5 0-48 21.5-48 48 0 7.1 1.6 13.7 4.4 19.8L476 239.2c-15.4 9.2-35.3 4-44.2-11.6L350.3 85C361 76.2 368 63 368 48c0-26.5-21.5-48-48-48s-48 21.5-48 48c0 15 7 28.2 17.7 37l-81.5 142.6c-8.9 15.6-28.9 20.8-44.2 11.6l-72.3-43.4c2.7-6 4.4-12.7 4.4-19.8 0-26.5-21.5-48-48-48S0 149.5 0 176s21.5 48 48 48c2.6 0 5.2-.4 7.7-.8L128 416h384l72.3-192.8c2.5.4 5.1.8 7.7.8 26.5 0 48-21.5 48-48s-21.5-48-48-48z\"]\n};\nvar faCrutch = {\n prefix: 'fas',\n iconName: 'crutch',\n icon: [512, 512, [], \"f7f7\", \"M507.31 185.71l-181-181a16 16 0 0 0-22.62 0L281 27.31a16 16 0 0 0 0 22.63l181 181a16 16 0 0 0 22.63 0l22.62-22.63a16 16 0 0 0 .06-22.6zm-179.54 66.41l-67.89-67.89 55.1-55.1-45.25-45.25-109.67 109.67a96.08 96.08 0 0 0-25.67 46.29L106.65 360.1l-102 102a16 16 0 0 0 0 22.63l22.62 22.62a16 16 0 0 0 22.63 0l102-102 120.25-27.75a95.88 95.88 0 0 0 46.29-25.65l109.68-109.68L382.87 197zm-54.57 54.57a32 32 0 0 1-15.45 8.54l-79.3 18.32 18.3-79.3a32.22 32.22 0 0 1 8.56-15.45l9.31-9.31 67.89 67.89z\"]\n};\nvar faCube = {\n prefix: 'fas',\n iconName: 'cube',\n icon: [512, 512, [], \"f1b2\", \"M239.1 6.3l-208 78c-18.7 7-31.1 25-31.1 45v225.1c0 18.2 10.3 34.8 26.5 42.9l208 104c13.5 6.8 29.4 6.8 42.9 0l208-104c16.3-8.1 26.5-24.8 26.5-42.9V129.3c0-20-12.4-37.9-31.1-44.9l-208-78C262 2.2 250 2.2 239.1 6.3zM256 68.4l192 72v1.1l-192 78-192-78v-1.1l192-72zm32 356V275.5l160-65v133.9l-160 80z\"]\n};\nvar faCubes = {\n prefix: 'fas',\n iconName: 'cubes',\n icon: [512, 512, [], \"f1b3\", \"M488.6 250.2L392 214V105.5c0-15-9.3-28.4-23.4-33.7l-100-37.5c-8.1-3.1-17.1-3.1-25.3 0l-100 37.5c-14.1 5.3-23.4 18.7-23.4 33.7V214l-96.6 36.2C9.3 255.5 0 268.9 0 283.9V394c0 13.6 7.7 26.1 19.9 32.2l100 50c10.1 5.1 22.1 5.1 32.2 0l103.9-52 103.9 52c10.1 5.1 22.1 5.1 32.2 0l100-50c12.2-6.1 19.9-18.6 19.9-32.2V283.9c0-15-9.3-28.4-23.4-33.7zM358 214.8l-85 31.9v-68.2l85-37v73.3zM154 104.1l102-38.2 102 38.2v.6l-102 41.4-102-41.4v-.6zm84 291.1l-85 42.5v-79.1l85-38.8v75.4zm0-112l-102 41.4-102-41.4v-.6l102-38.2 102 38.2v.6zm240 112l-85 42.5v-79.1l85-38.8v75.4zm0-112l-102 41.4-102-41.4v-.6l102-38.2 102 38.2v.6z\"]\n};\nvar faCut = {\n prefix: 'fas',\n iconName: 'cut',\n icon: [448, 512, [], \"f0c4\", \"M278.06 256L444.48 89.57c4.69-4.69 4.69-12.29 0-16.97-32.8-32.8-85.99-32.8-118.79 0L210.18 188.12l-24.86-24.86c4.31-10.92 6.68-22.81 6.68-35.26 0-53.02-42.98-96-96-96S0 74.98 0 128s42.98 96 96 96c4.54 0 8.99-.32 13.36-.93L142.29 256l-32.93 32.93c-4.37-.61-8.83-.93-13.36-.93-53.02 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96c0-12.45-2.37-24.34-6.68-35.26l24.86-24.86L325.69 439.4c32.8 32.8 85.99 32.8 118.79 0 4.69-4.68 4.69-12.28 0-16.97L278.06 256zM96 160c-17.64 0-32-14.36-32-32s14.36-32 32-32 32 14.36 32 32-14.36 32-32 32zm0 256c-17.64 0-32-14.36-32-32s14.36-32 32-32 32 14.36 32 32-14.36 32-32 32z\"]\n};\nvar faDatabase = {\n prefix: 'fas',\n iconName: 'database',\n icon: [448, 512, [], \"f1c0\", \"M448 73.143v45.714C448 159.143 347.667 192 224 192S0 159.143 0 118.857V73.143C0 32.857 100.333 0 224 0s224 32.857 224 73.143zM448 176v102.857C448 319.143 347.667 352 224 352S0 319.143 0 278.857V176c48.125 33.143 136.208 48.572 224 48.572S399.874 209.143 448 176zm0 160v102.857C448 479.143 347.667 512 224 512S0 479.143 0 438.857V336c48.125 33.143 136.208 48.572 224 48.572S399.874 369.143 448 336z\"]\n};\nvar faDeaf = {\n prefix: 'fas',\n iconName: 'deaf',\n icon: [512, 512, [], \"f2a4\", \"M216 260c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-44.112 35.888-80 80-80s80 35.888 80 80c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-13.234-10.767-24-24-24s-24 10.766-24 24zm24-176c-97.047 0-176 78.953-176 176 0 15.464 12.536 28 28 28s28-12.536 28-28c0-66.168 53.832-120 120-120s120 53.832 120 120c0 75.164-71.009 70.311-71.997 143.622L288 404c0 28.673-23.327 52-52 52-15.464 0-28 12.536-28 28s12.536 28 28 28c59.475 0 107.876-48.328 108-107.774.595-34.428 72-48.24 72-144.226 0-97.047-78.953-176-176-176zm268.485-52.201L480.2 3.515c-4.687-4.686-12.284-4.686-16.971 0L376.2 90.544c-4.686 4.686-4.686 12.284 0 16.971l28.285 28.285c4.686 4.686 12.284 4.686 16.97 0l87.03-87.029c4.687-4.688 4.687-12.286 0-16.972zM168.97 314.745c-4.686-4.686-12.284-4.686-16.97 0L3.515 463.23c-4.686 4.686-4.686 12.284 0 16.971L31.8 508.485c4.687 4.686 12.284 4.686 16.971 0L197.256 360c4.686-4.686 4.686-12.284 0-16.971l-28.286-28.284z\"]\n};\nvar faDemocrat = {\n prefix: 'fas',\n iconName: 'democrat',\n icon: [640, 512, [], \"f747\", \"M637.3 256.9l-19.6-29.4c-28.2-42.3-75.3-67.5-126.1-67.5H256l-81.2-81.2c20.1-20.1 22.6-51.1 7.5-73.9-3.4-5.2-10.8-5.9-15.2-1.5l-41.8 41.8L82.4 2.4c-3.6-3.6-9.6-3-12.4 1.2-12.3 18.6-10.3 44 6.1 60.4 3.3 3.3 7.3 5.3 11.3 7.5-2.2 1.7-4.7 3.1-6.4 5.4L6.4 176.2c-7.3 9.7-8.4 22.7-3 33.5l14.3 28.6c5.4 10.8 16.5 17.7 28.6 17.7h31c8.5 0 16.6-3.4 22.6-9.4L138 212l54 108h352v-77.8c16.2 12.2 18.3 17.6 40.1 50.3 4.9 7.4 14.8 9.3 22.2 4.4l26.6-17.7c7.3-5 9.3-14.9 4.4-22.3zm-341.1-13.6l-16.5 16.1 3.9 22.7c.7 4.1-3.6 7.2-7.2 5.3L256 276.7l-20.4 10.7c-3.6 1.9-7.9-1.2-7.2-5.3l3.9-22.7-16.5-16.1c-3-2.9-1.3-7.9 2.8-8.5l22.8-3.3 10.2-20.7c1.8-3.7 7.1-3.7 9 0l10.2 20.7 22.8 3.3c4 .6 5.6 5.6 2.6 8.5zm112 0l-16.5 16.1 3.9 22.7c.7 4.1-3.6 7.2-7.2 5.3L368 276.7l-20.4 10.7c-3.6 1.9-7.9-1.2-7.2-5.3l3.9-22.7-16.5-16.1c-3-2.9-1.3-7.9 2.8-8.5l22.8-3.3 10.2-20.7c1.8-3.7 7.1-3.7 9 0l10.2 20.7 22.8 3.3c4 .6 5.6 5.6 2.6 8.5zm112 0l-16.5 16.1 3.9 22.7c.7 4.1-3.6 7.2-7.2 5.3L480 276.7l-20.4 10.7c-3.6 1.9-7.9-1.2-7.2-5.3l3.9-22.7-16.5-16.1c-3-2.9-1.3-7.9 2.8-8.5l22.8-3.3 10.2-20.7c1.8-3.7 7.1-3.7 9 0l10.2 20.7 22.8 3.3c4 .6 5.6 5.6 2.6 8.5zM192 496c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-80h160v80c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16V352H192v144z\"]\n};\nvar faDesktop = {\n prefix: 'fas',\n iconName: 'desktop',\n icon: [576, 512, [], \"f108\", \"M528 0H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h192l-16 48h-72c-13.3 0-24 10.7-24 24s10.7 24 24 24h272c13.3 0 24-10.7 24-24s-10.7-24-24-24h-72l-16-48h192c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-16 352H64V64h448v288z\"]\n};\nvar faDharmachakra = {\n prefix: 'fas',\n iconName: 'dharmachakra',\n icon: [512, 512, [], \"f655\", \"M495 225.06l-17.22 1.08c-5.27-39.49-20.79-75.64-43.86-105.84l12.95-11.43c6.92-6.11 7.25-16.79.73-23.31L426.44 64.4c-6.53-6.53-17.21-6.19-23.31.73L391.7 78.07c-30.2-23.06-66.35-38.58-105.83-43.86L286.94 17c.58-9.21-6.74-17-15.97-17h-29.94c-9.23 0-16.54 7.79-15.97 17l1.08 17.22c-39.49 5.27-75.64 20.79-105.83 43.86l-11.43-12.95c-6.11-6.92-16.79-7.25-23.31-.73L64.4 85.56c-6.53 6.53-6.19 17.21.73 23.31l12.95 11.43c-23.06 30.2-38.58 66.35-43.86 105.84L17 225.06c-9.21-.58-17 6.74-17 15.97v29.94c0 9.23 7.79 16.54 17 15.97l17.22-1.08c5.27 39.49 20.79 75.64 43.86 105.83l-12.95 11.43c-6.92 6.11-7.25 16.79-.73 23.31l21.17 21.17c6.53 6.53 17.21 6.19 23.31-.73l11.43-12.95c30.2 23.06 66.35 38.58 105.84 43.86L225.06 495c-.58 9.21 6.74 17 15.97 17h29.94c9.23 0 16.54-7.79 15.97-17l-1.08-17.22c39.49-5.27 75.64-20.79 105.84-43.86l11.43 12.95c6.11 6.92 16.79 7.25 23.31.73l21.17-21.17c6.53-6.53 6.19-17.21-.73-23.31l-12.95-11.43c23.06-30.2 38.58-66.35 43.86-105.83l17.22 1.08c9.21.58 17-6.74 17-15.97v-29.94c-.01-9.23-7.8-16.54-17.01-15.97zM281.84 98.61c24.81 4.07 47.63 13.66 67.23 27.78l-42.62 48.29c-8.73-5.44-18.32-9.54-28.62-11.95l4.01-64.12zm-51.68 0l4.01 64.12c-10.29 2.41-19.89 6.52-28.62 11.95l-42.62-48.29c19.6-14.12 42.42-23.71 67.23-27.78zm-103.77 64.33l48.3 42.61c-5.44 8.73-9.54 18.33-11.96 28.62l-64.12-4.01c4.07-24.81 13.66-47.62 27.78-67.22zm-27.78 118.9l64.12-4.01c2.41 10.29 6.52 19.89 11.95 28.62l-48.29 42.62c-14.12-19.6-23.71-42.42-27.78-67.23zm131.55 131.55c-24.81-4.07-47.63-13.66-67.23-27.78l42.61-48.3c8.73 5.44 18.33 9.54 28.62 11.96l-4 64.12zM256 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm25.84 125.39l-4.01-64.12c10.29-2.41 19.89-6.52 28.62-11.96l42.61 48.3c-19.6 14.12-42.41 23.71-67.22 27.78zm103.77-64.33l-48.29-42.62c5.44-8.73 9.54-18.32 11.95-28.62l64.12 4.01c-4.07 24.82-13.66 47.64-27.78 67.23zm-36.34-114.89c-2.41-10.29-6.52-19.89-11.96-28.62l48.3-42.61c14.12 19.6 23.71 42.42 27.78 67.23l-64.12 4z\"]\n};\nvar faDiagnoses = {\n prefix: 'fas',\n iconName: 'diagnoses',\n icon: [640, 512, [], \"f470\", \"M496 256c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zm-176-80c48.5 0 88-39.5 88-88S368.5 0 320 0s-88 39.5-88 88 39.5 88 88 88zM59.8 364c10.2 15.3 29.3 17.8 42.9 9.8 16.2-9.6 56.2-31.7 105.3-48.6V416h224v-90.7c49.1 16.8 89.1 39 105.3 48.6 13.6 8 32.7 5.3 42.9-9.8l17.8-26.7c8.8-13.2 7.6-34.6-10-45.1-11.9-7.1-29.7-17-51.1-27.4-28.1 46.1-99.4 17.8-87.7-35.1C409.3 217.2 365.1 208 320 208c-57 0-112.9 14.5-160 32.2-.2 40.2-47.6 63.3-79.2 36-11.2 6-21.3 11.6-28.7 16-17.6 10.5-18.8 31.8-10 45.1L59.8 364zM368 344c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm-96-96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm-160 8c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zm512 192H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faDice = {\n prefix: 'fas',\n iconName: 'dice',\n icon: [640, 512, [], \"f522\", \"M592 192H473.26c12.69 29.59 7.12 65.2-17 89.32L320 417.58V464c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48V240c0-26.51-21.49-48-48-48zM480 376c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm-46.37-186.7L258.7 14.37c-19.16-19.16-50.23-19.16-69.39 0L14.37 189.3c-19.16 19.16-19.16 50.23 0 69.39L189.3 433.63c19.16 19.16 50.23 19.16 69.39 0L433.63 258.7c19.16-19.17 19.16-50.24 0-69.4zM96 248c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faDiceD20 = {\n prefix: 'fas',\n iconName: 'dice-d20',\n icon: [480, 512, [], \"f6cf\", \"M106.75 215.06L1.2 370.95c-3.08 5 .1 11.5 5.93 12.14l208.26 22.07-108.64-190.1zM7.41 315.43L82.7 193.08 6.06 147.1c-2.67-1.6-6.06.32-6.06 3.43v162.81c0 4.03 5.29 5.53 7.41 2.09zM18.25 423.6l194.4 87.66c5.3 2.45 11.35-1.43 11.35-7.26v-65.67l-203.55-22.3c-4.45-.5-6.23 5.59-2.2 7.57zm81.22-257.78L179.4 22.88c4.34-7.06-3.59-15.25-10.78-11.14L17.81 110.35c-2.47 1.62-2.39 5.26.13 6.78l81.53 48.69zM240 176h109.21L253.63 7.62C250.5 2.54 245.25 0 240 0s-10.5 2.54-13.63 7.62L130.79 176H240zm233.94-28.9l-76.64 45.99 75.29 122.35c2.11 3.44 7.41 1.94 7.41-2.1V150.53c0-3.11-3.39-5.03-6.06-3.43zm-93.41 18.72l81.53-48.7c2.53-1.52 2.6-5.16.13-6.78l-150.81-98.6c-7.19-4.11-15.12 4.08-10.78 11.14l79.93 142.94zm79.02 250.21L256 438.32v65.67c0 5.84 6.05 9.71 11.35 7.26l194.4-87.66c4.03-1.97 2.25-8.06-2.2-7.56zm-86.3-200.97l-108.63 190.1 208.26-22.07c5.83-.65 9.01-7.14 5.93-12.14L373.25 215.06zM240 208H139.57L240 383.75 340.43 208H240z\"]\n};\nvar faDiceD6 = {\n prefix: 'fas',\n iconName: 'dice-d6',\n icon: [448, 512, [], \"f6d1\", \"M422.19 109.95L256.21 9.07c-19.91-12.1-44.52-12.1-64.43 0L25.81 109.95c-5.32 3.23-5.29 11.27.06 14.46L224 242.55l198.14-118.14c5.35-3.19 5.38-11.22.05-14.46zm13.84 44.63L240 271.46v223.82c0 12.88 13.39 20.91 24.05 14.43l152.16-92.48c19.68-11.96 31.79-33.94 31.79-57.7v-197.7c0-6.41-6.64-10.43-11.97-7.25zM0 161.83v197.7c0 23.77 12.11 45.74 31.79 57.7l152.16 92.47c10.67 6.48 24.05-1.54 24.05-14.43V271.46L11.97 154.58C6.64 151.4 0 155.42 0 161.83z\"]\n};\nvar faDiceFive = {\n prefix: 'fas',\n iconName: 'dice-five',\n icon: [448, 512, [], \"f523\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceFour = {\n prefix: 'fas',\n iconName: 'dice-four',\n icon: [448, 512, [], \"f524\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm192 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceOne = {\n prefix: 'fas',\n iconName: 'dice-one',\n icon: [448, 512, [], \"f525\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM224 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceSix = {\n prefix: 'fas',\n iconName: 'dice-six',\n icon: [448, 512, [], \"f526\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm192 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceThree = {\n prefix: 'fas',\n iconName: 'dice-three',\n icon: [448, 512, [], \"f527\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceTwo = {\n prefix: 'fas',\n iconName: 'dice-two',\n icon: [448, 512, [], \"f528\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm192 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDigitalTachograph = {\n prefix: 'fas',\n iconName: 'digital-tachograph',\n icon: [640, 512, [], \"f566\", \"M608 96H32c-17.67 0-32 14.33-32 32v256c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V128c0-17.67-14.33-32-32-32zM304 352c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-8c0-4.42 3.58-8 8-8h224c4.42 0 8 3.58 8 8v8zM72 288v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H80c-4.42 0-8-3.58-8-8zm64 0v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm64 0v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm64 0v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm40-64c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-48c0-8.84 7.16-16 16-16h208c8.84 0 16 7.16 16 16v48zm272 128c0 4.42-3.58 8-8 8H344c-4.42 0-8-3.58-8-8v-8c0-4.42 3.58-8 8-8h224c4.42 0 8 3.58 8 8v8z\"]\n};\nvar faDirections = {\n prefix: 'fas',\n iconName: 'directions',\n icon: [512, 512, [], \"f5eb\", \"M502.61 233.32L278.68 9.39c-12.52-12.52-32.83-12.52-45.36 0L9.39 233.32c-12.52 12.53-12.52 32.83 0 45.36l223.93 223.93c12.52 12.53 32.83 12.53 45.36 0l223.93-223.93c12.52-12.53 12.52-32.83 0-45.36zm-100.98 12.56l-84.21 77.73c-5.12 4.73-13.43 1.1-13.43-5.88V264h-96v64c0 4.42-3.58 8-8 8h-32c-4.42 0-8-3.58-8-8v-80c0-17.67 14.33-32 32-32h112v-53.73c0-6.97 8.3-10.61 13.43-5.88l84.21 77.73c3.43 3.17 3.43 8.59 0 11.76z\"]\n};\nvar faDivide = {\n prefix: 'fas',\n iconName: 'divide',\n icon: [448, 512, [], \"f529\", \"M224 352c-35.35 0-64 28.65-64 64s28.65 64 64 64 64-28.65 64-64-28.65-64-64-64zm0-192c35.35 0 64-28.65 64-64s-28.65-64-64-64-64 28.65-64 64 28.65 64 64 64zm192 48H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faDizzy = {\n prefix: 'fas',\n iconName: 'dizzy',\n icon: [496, 512, [], \"f567\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-96 206.6l-28.7 28.7c-14.8 14.8-37.8-7.5-22.6-22.6l28.7-28.7-28.7-28.7c-15-15 7.7-37.6 22.6-22.6l28.7 28.7 28.7-28.7c15-15 37.6 7.7 22.6 22.6L174.6 192l28.7 28.7c15.2 15.2-7.9 37.4-22.6 22.6L152 214.6zM248 416c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm147.3-195.3c15.2 15.2-7.9 37.4-22.6 22.6L344 214.6l-28.7 28.7c-14.8 14.8-37.8-7.5-22.6-22.6l28.7-28.7-28.7-28.7c-15-15 7.7-37.6 22.6-22.6l28.7 28.7 28.7-28.7c15-15 37.6 7.7 22.6 22.6L366.6 192l28.7 28.7z\"]\n};\nvar faDna = {\n prefix: 'fas',\n iconName: 'dna',\n icon: [448, 512, [], \"f471\", \"M.1 494.1c-1.1 9.5 6.3 17.8 15.9 17.8l32.3.1c8.1 0 14.9-5.9 16-13.9.7-4.9 1.8-11.1 3.4-18.1H380c1.6 6.9 2.9 13.2 3.5 18.1 1.1 8 7.9 14 16 13.9l32.3-.1c9.6 0 17.1-8.3 15.9-17.8-4.6-37.9-25.6-129-118.9-207.7-17.6 12.4-37.1 24.2-58.5 35.4 6.2 4.6 11.4 9.4 17 14.2H159.7c21.3-18.1 47-35.6 78.7-51.4C410.5 199.1 442.1 65.8 447.9 17.9 449 8.4 441.6.1 432 .1L399.6 0c-8.1 0-14.9 5.9-16 13.9-.7 4.9-1.8 11.1-3.4 18.1H67.8c-1.6-7-2.7-13.1-3.4-18.1-1.1-8-7.9-14-16-13.9L16.1.1C6.5.1-1 8.4.1 17.9 5.3 60.8 31.4 171.8 160 256 31.5 340.2 5.3 451.2.1 494.1zM224 219.6c-25.1-13.7-46.4-28.4-64.3-43.6h128.5c-17.8 15.2-39.1 30-64.2 43.6zM355.1 96c-5.8 10.4-12.8 21.1-21 32H114c-8.3-10.9-15.3-21.6-21-32h262.1zM92.9 416c5.8-10.4 12.8-21.1 21-32h219.4c8.3 10.9 15.4 21.6 21.2 32H92.9z\"]\n};\nvar faDog = {\n prefix: 'fas',\n iconName: 'dog',\n icon: [512, 512, [], \"f6d3\", \"M496 96h-64l-7.16-14.31A32 32 0 0 0 396.22 64H342.6l-27.28-27.28C305.23 26.64 288 33.78 288 48.03v149.84l128 45.71V208h32c35.35 0 64-28.65 64-64v-32c0-8.84-7.16-16-16-16zm-112 48c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zM96 224c-17.64 0-32-14.36-32-32 0-17.67-14.33-32-32-32S0 174.33 0 192c0 41.66 26.83 76.85 64 90.1V496c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V384h160v112c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V277.55L266.05 224H96z\"]\n};\nvar faDollarSign = {\n prefix: 'fas',\n iconName: 'dollar-sign',\n icon: [288, 512, [], \"f155\", \"M209.2 233.4l-108-31.6C88.7 198.2 80 186.5 80 173.5c0-16.3 13.2-29.5 29.5-29.5h66.3c12.2 0 24.2 3.7 34.2 10.5 6.1 4.1 14.3 3.1 19.5-2l34.8-34c7.1-6.9 6.1-18.4-1.8-24.5C238 74.8 207.4 64.1 176 64V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48h-2.5C45.8 64-5.4 118.7.5 183.6c4.2 46.1 39.4 83.6 83.8 96.6l102.5 30c12.5 3.7 21.2 15.3 21.2 28.3 0 16.3-13.2 29.5-29.5 29.5h-66.3C100 368 88 364.3 78 357.5c-6.1-4.1-14.3-3.1-19.5 2l-34.8 34c-7.1 6.9-6.1 18.4 1.8 24.5 24.5 19.2 55.1 29.9 86.5 30v48c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-48.2c46.6-.9 90.3-28.6 105.7-72.7 21.5-61.6-14.6-124.8-72.5-141.7z\"]\n};\nvar faDolly = {\n prefix: 'fas',\n iconName: 'dolly',\n icon: [576, 512, [], \"f472\", \"M294.2 277.7c18 5 34.7 13.4 49.5 24.7l161.5-53.8c8.4-2.8 12.9-11.9 10.1-20.2L454.9 47.2c-2.8-8.4-11.9-12.9-20.2-10.1l-61.1 20.4 33.1 99.4L346 177l-33.1-99.4-61.6 20.5c-8.4 2.8-12.9 11.9-10.1 20.2l53 159.4zm281 48.7L565 296c-2.8-8.4-11.9-12.9-20.2-10.1l-213.5 71.2c-17.2-22-43.6-36.4-73.5-37L158.4 21.9C154 8.8 141.8 0 128 0H16C7.2 0 0 7.2 0 16v32c0 8.8 7.2 16 16 16h88.9l92.2 276.7c-26.1 20.4-41.7 53.6-36 90.5 6.1 39.4 37.9 72.3 77.3 79.2 60.2 10.7 112.3-34.8 113.4-92.6l213.3-71.2c8.3-2.8 12.9-11.8 10.1-20.2zM256 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faDollyFlatbed = {\n prefix: 'fas',\n iconName: 'dolly-flatbed',\n icon: [640, 512, [], \"f474\", \"M208 320h384c8.8 0 16-7.2 16-16V48c0-8.8-7.2-16-16-16H448v128l-48-32-48 32V32H208c-8.8 0-16 7.2-16 16v256c0 8.8 7.2 16 16 16zm416 64H128V16c0-8.8-7.2-16-16-16H16C7.2 0 0 7.2 0 16v32c0 8.8 7.2 16 16 16h48v368c0 8.8 7.2 16 16 16h82.9c-1.8 5-2.9 10.4-2.9 16 0 26.5 21.5 48 48 48s48-21.5 48-48c0-5.6-1.2-11-2.9-16H451c-1.8 5-2.9 10.4-2.9 16 0 26.5 21.5 48 48 48s48-21.5 48-48c0-5.6-1.2-11-2.9-16H624c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faDonate = {\n prefix: 'fas',\n iconName: 'donate',\n icon: [512, 512, [], \"f4b9\", \"M256 416c114.9 0 208-93.1 208-208S370.9 0 256 0 48 93.1 48 208s93.1 208 208 208zM233.8 97.4V80.6c0-9.2 7.4-16.6 16.6-16.6h11.1c9.2 0 16.6 7.4 16.6 16.6v17c15.5.8 30.5 6.1 43 15.4 5.6 4.1 6.2 12.3 1.2 17.1L306 145.6c-3.8 3.7-9.5 3.8-14 1-5.4-3.4-11.4-5.1-17.8-5.1h-38.9c-9 0-16.3 8.2-16.3 18.3 0 8.2 5 15.5 12.1 17.6l62.3 18.7c25.7 7.7 43.7 32.4 43.7 60.1 0 34-26.4 61.5-59.1 62.4v16.8c0 9.2-7.4 16.6-16.6 16.6h-11.1c-9.2 0-16.6-7.4-16.6-16.6v-17c-15.5-.8-30.5-6.1-43-15.4-5.6-4.1-6.2-12.3-1.2-17.1l16.3-15.5c3.8-3.7 9.5-3.8 14-1 5.4 3.4 11.4 5.1 17.8 5.1h38.9c9 0 16.3-8.2 16.3-18.3 0-8.2-5-15.5-12.1-17.6l-62.3-18.7c-25.7-7.7-43.7-32.4-43.7-60.1.1-34 26.4-61.5 59.1-62.4zM480 352h-32.5c-19.6 26-44.6 47.7-73 64h63.8c5.3 0 9.6 3.6 9.6 8v16c0 4.4-4.3 8-9.6 8H73.6c-5.3 0-9.6-3.6-9.6-8v-16c0-4.4 4.3-8 9.6-8h63.8c-28.4-16.3-53.3-38-73-64H32c-17.7 0-32 14.3-32 32v96c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32v-96c0-17.7-14.3-32-32-32z\"]\n};\nvar faDoorClosed = {\n prefix: 'fas',\n iconName: 'door-closed',\n icon: [640, 512, [], \"f52a\", \"M624 448H512V50.8C512 22.78 490.47 0 464 0H175.99c-26.47 0-48 22.78-48 50.8V448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM415.99 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32c.01 17.67-14.32 32-32 32z\"]\n};\nvar faDoorOpen = {\n prefix: 'fas',\n iconName: 'door-open',\n icon: [640, 512, [], \"f52b\", \"M624 448h-80V113.45C544 86.19 522.47 64 496 64H384v64h96v384h144c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM312.24 1.01l-192 49.74C105.99 54.44 96 67.7 96 82.92V448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h336V33.18c0-21.58-19.56-37.41-39.76-32.17zM264 288c-13.25 0-24-14.33-24-32s10.75-32 24-32 24 14.33 24 32-10.75 32-24 32z\"]\n};\nvar faDotCircle = {\n prefix: 'fas',\n iconName: 'dot-circle',\n icon: [512, 512, [], \"f192\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm80 248c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80z\"]\n};\nvar faDove = {\n prefix: 'fas',\n iconName: 'dove',\n icon: [512, 512, [], \"f4ba\", \"M288 167.2v-28.1c-28.2-36.3-47.1-79.3-54.1-125.2-2.1-13.5-19-18.8-27.8-8.3-21.1 24.9-37.7 54.1-48.9 86.5 34.2 38.3 80 64.6 130.8 75.1zM400 64c-44.2 0-80 35.9-80 80.1v59.4C215.6 197.3 127 133 87 41.8c-5.5-12.5-23.2-13.2-29-.9C41.4 76 32 115.2 32 156.6c0 70.8 34.1 136.9 85.1 185.9 13.2 12.7 26.1 23.2 38.9 32.8l-143.9 36C1.4 414-3.4 426.4 2.6 435.7 20 462.6 63 508.2 155.8 512c8 .3 16-2.6 22.1-7.9l65.2-56.1H320c88.4 0 160-71.5 160-159.9V128l32-64H400zm0 96.1c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faDownload = {\n prefix: 'fas',\n iconName: 'download',\n icon: [512, 512, [], \"f019\", \"M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z\"]\n};\nvar faDraftingCompass = {\n prefix: 'fas',\n iconName: 'drafting-compass',\n icon: [512, 512, [], \"f568\", \"M457.01 344.42c-25.05 20.33-52.63 37.18-82.54 49.05l54.38 94.19 53.95 23.04c9.81 4.19 20.89-2.21 22.17-12.8l7.02-58.25-54.98-95.23zm42.49-94.56c4.86-7.67 1.89-17.99-6.05-22.39l-28.07-15.57c-7.48-4.15-16.61-1.46-21.26 5.72C403.01 281.15 332.25 320 256 320c-23.93 0-47.23-4.25-69.41-11.53l67.36-116.68c.7.02 1.34.21 2.04.21s1.35-.19 2.04-.21l51.09 88.5c31.23-8.96 59.56-25.75 82.61-48.92l-51.79-89.71C347.39 128.03 352 112.63 352 96c0-53.02-42.98-96-96-96s-96 42.98-96 96c0 16.63 4.61 32.03 12.05 45.66l-68.3 118.31c-12.55-11.61-23.96-24.59-33.68-39-4.79-7.1-13.97-9.62-21.38-5.33l-27.75 16.07c-7.85 4.54-10.63 14.9-5.64 22.47 15.57 23.64 34.69 44.21 55.98 62.02L0 439.66l7.02 58.25c1.28 10.59 12.36 16.99 22.17 12.8l53.95-23.04 70.8-122.63C186.13 377.28 220.62 384 256 384c99.05 0 190.88-51.01 243.5-134.14zM256 64c17.67 0 32 14.33 32 32s-14.33 32-32 32-32-14.33-32-32 14.33-32 32-32z\"]\n};\nvar faDragon = {\n prefix: 'fas',\n iconName: 'dragon',\n icon: [640, 512, [], \"f6d5\", \"M18.32 255.78L192 223.96l-91.28 68.69c-10.08 10.08-2.94 27.31 11.31 27.31h222.7c-9.44-26.4-14.73-54.47-14.73-83.38v-42.27l-119.73-87.6c-23.82-15.88-55.29-14.01-77.06 4.59L5.81 227.64c-12.38 10.33-3.45 30.42 12.51 28.14zm556.87 34.1l-100.66-50.31A47.992 47.992 0 0 1 448 196.65v-36.69h64l28.09 22.63c6 6 14.14 9.37 22.63 9.37h30.97a32 32 0 0 0 28.62-17.69l14.31-28.62a32.005 32.005 0 0 0-3.02-33.51l-74.53-99.38C553.02 4.7 543.54 0 533.47 0H296.02c-7.13 0-10.7 8.57-5.66 13.61L352 63.96 292.42 88.8c-5.9 2.95-5.9 11.36 0 14.31L352 127.96v108.62c0 72.08 36.03 139.39 96 179.38-195.59 6.81-344.56 41.01-434.1 60.91C5.78 478.67 0 485.88 0 494.2 0 504 7.95 512 17.76 512h499.08c63.29.01 119.61-47.56 122.99-110.76 2.52-47.28-22.73-90.4-64.64-111.36zM489.18 66.25l45.65 11.41c-2.75 10.91-12.47 18.89-24.13 18.26-12.96-.71-25.85-12.53-21.52-29.67z\"]\n};\nvar faDrawPolygon = {\n prefix: 'fas',\n iconName: 'draw-polygon',\n icon: [448, 512, [], \"f5ee\", \"M384 352c-.35 0-.67.1-1.02.1l-39.2-65.32c5.07-9.17 8.22-19.56 8.22-30.78s-3.14-21.61-8.22-30.78l39.2-65.32c.35.01.67.1 1.02.1 35.35 0 64-28.65 64-64s-28.65-64-64-64c-23.63 0-44.04 12.95-55.12 32H119.12C108.04 44.95 87.63 32 64 32 28.65 32 0 60.65 0 96c0 23.63 12.95 44.04 32 55.12v209.75C12.95 371.96 0 392.37 0 416c0 35.35 28.65 64 64 64 23.63 0 44.04-12.95 55.12-32h209.75c11.09 19.05 31.49 32 55.12 32 35.35 0 64-28.65 64-64 .01-35.35-28.64-64-63.99-64zm-288 8.88V151.12A63.825 63.825 0 0 0 119.12 128h208.36l-38.46 64.1c-.35-.01-.67-.1-1.02-.1-35.35 0-64 28.65-64 64s28.65 64 64 64c.35 0 .67-.1 1.02-.1l38.46 64.1H119.12A63.748 63.748 0 0 0 96 360.88zM272 256c0-8.82 7.18-16 16-16s16 7.18 16 16-7.18 16-16 16-16-7.18-16-16zM400 96c0 8.82-7.18 16-16 16s-16-7.18-16-16 7.18-16 16-16 16 7.18 16 16zM64 80c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16zM48 416c0-8.82 7.18-16 16-16s16 7.18 16 16-7.18 16-16 16-16-7.18-16-16zm336 16c-8.82 0-16-7.18-16-16s7.18-16 16-16 16 7.18 16 16-7.18 16-16 16z\"]\n};\nvar faDrum = {\n prefix: 'fas',\n iconName: 'drum',\n icon: [576, 512, [], \"f569\", \"M458.08 120.88l102.39-61.43c15.16-9.09 20.06-28.75 10.97-43.91C562.34.39 542.7-4.53 527.53 4.57l-160.69 96.41A629.32 629.32 0 0 0 288 96C128.94 96 0 153.31 0 224v160.83c0 30.46 24.03 58.4 64 80.37v-96.37c0-17.6 14.4-32 32-32s32 14.4 32 32v122.41c37.4 11.13 81 18.44 128 20.75V400.84c0-17.6 14.4-32 32-32s32 14.4 32 32V512c47-2.31 90.6-9.62 128-20.75V368.84c0-17.6 14.4-32 32-32s32 14.4 32 32v96.37c39.97-21.97 64-49.91 64-80.37V224.01c-.01-42.38-46.54-79.84-117.92-103.13zM288 304c-132.55 0-240-35.82-240-80s107.45-80 240-80c2.34 0 4.62.1 6.94.12l-87.41 52.44c-15.16 9.09-20.06 28.75-10.97 43.91 9.56 15.93 29.51 19.61 43.91 10.97l162.71-97.62C477.55 167.41 528 193.74 528 224.01 528 268.19 420.54 304 288 304z\"]\n};\nvar faDrumSteelpan = {\n prefix: 'fas',\n iconName: 'drum-steelpan',\n icon: [576, 512, [], \"f56a\", \"M288 32C128.94 32 0 89.31 0 160v192c0 70.69 128.94 128 288 128s288-57.31 288-128V160c0-70.69-128.94-128-288-128zm-82.99 158.36c-4.45 16.61-14.54 30.57-28.31 40.48C100.23 217.46 48 190.78 48 160c0-30.16 50.11-56.39 124.04-70.03l25.6 44.34c9.86 17.09 12.48 36.99 7.37 56.05zM288 240c-21.08 0-41.41-1-60.89-2.7 8.06-26.13 32.15-45.3 60.89-45.3s52.83 19.17 60.89 45.3C329.41 239 309.08 240 288 240zm64-144c0 35.29-28.71 64-64 64s-64-28.71-64-64V82.96c20.4-1.88 41.8-2.96 64-2.96s43.6 1.08 64 2.96V96zm46.93 134.9c-13.81-9.91-23.94-23.9-28.4-40.54-5.11-19.06-2.49-38.96 7.38-56.04l25.65-44.42C477.72 103.5 528 129.79 528 160c0 30.83-52.4 57.54-129.07 70.9z\"]\n};\nvar faDrumstickBite = {\n prefix: 'fas',\n iconName: 'drumstick-bite',\n icon: [512, 512, [], \"f6d7\", \"M462.8 49.57a169.44 169.44 0 0 0-239.5 0C187.82 85 160.13 128 160.13 192v85.83l-40.62 40.59c-9.7 9.69-24 11.07-36.78 6a60.33 60.33 0 0 0-65 98.72C33 438.39 54.24 442.7 73.85 438.21c-4.5 19.6-.18 40.83 15.1 56.1a60.35 60.35 0 0 0 98.8-65c-5.09-12.73-3.72-27 6-36.75L234.36 352h85.89a187.87 187.87 0 0 0 61.89-10c-39.64-43.89-39.83-110.23 1.05-151.07 34.38-34.36 86.76-39.46 128.74-16.8 1.3-44.96-14.81-90.28-49.13-124.56z\"]\n};\nvar faDumbbell = {\n prefix: 'fas',\n iconName: 'dumbbell',\n icon: [640, 512, [], \"f44b\", \"M104 96H56c-13.3 0-24 10.7-24 24v104H8c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h24v104c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zm528 128h-24V120c0-13.3-10.7-24-24-24h-48c-13.3 0-24 10.7-24 24v272c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V288h24c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM456 32h-48c-13.3 0-24 10.7-24 24v168H256V56c0-13.3-10.7-24-24-24h-48c-13.3 0-24 10.7-24 24v400c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V288h128v168c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24z\"]\n};\nvar faDumpster = {\n prefix: 'fas',\n iconName: 'dumpster',\n icon: [576, 512, [], \"f793\", \"M560 160c10.4 0 18-9.8 15.5-19.9l-24-96C549.7 37 543.3 32 536 32h-98.9l25.6 128H560zM272 32H171.5l-25.6 128H272V32zm132.5 0H304v128h126.1L404.5 32zM16 160h97.3l25.6-128H40c-7.3 0-13.7 5-15.5 12.1l-24 96C-2 150.2 5.6 160 16 160zm544 64h-20l4-32H32l4 32H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h28l20 160v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h320v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16l20-160h28c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faDumpsterFire = {\n prefix: 'fas',\n iconName: 'dumpster-fire',\n icon: [640, 512, [], \"f794\", \"M418.7 104.1l.2-.2-14.4-72H304v128h60.8c16.2-19.3 34.2-38.2 53.9-55.8zM272 32H171.5l-25.6 128H272V32zm189.3 72.1c18.2 16.3 35.5 33.7 51.1 51.5 5.7-5.6 11.4-11.1 17.3-16.3l21.3-19 21.3 19c1.1.9 2.1 2.1 3.1 3.1-.1-.8.2-1.5 0-2.3l-24-96C549.7 37 543.3 32 536 32h-98.9l12.3 61.5 11.9 10.6zM16 160h97.3l25.6-128H40c-7.3 0-13.7 5-15.5 12.1l-24 96C-2 150.2 5.6 160 16 160zm324.6 32H32l4 32H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h28l20 160v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208.8c-30.2-33.7-48.8-77.9-48.8-126.4 0-35.9 19.9-82.9 52.6-129.6zm210.5-28.8c-14.9 13.3-28.3 27.2-40.2 41.2-19.5-25.8-43.6-52-71-76.4-70.2 62.7-120 144.3-120 193.6 0 87.5 71.6 158.4 160 158.4s160-70.9 160-158.4c.1-36.6-37-112.2-88.8-158.4zm-18.6 229.4c-14.7 10.7-32.9 17-52.5 17-49 0-88.9-33.5-88.9-88 0-27.1 16.5-51 49.4-91.9 4.7 5.6 67.1 88.1 67.1 88.1l39.8-47c2.8 4.8 5.4 9.5 7.7 14 18.6 36.7 10.8 83.6-22.6 107.8z\"]\n};\nvar faDungeon = {\n prefix: 'fas',\n iconName: 'dungeon',\n icon: [512, 512, [], \"f6d9\", \"M128.73 195.32l-82.81-51.76c-8.04-5.02-18.99-2.17-22.93 6.45A254.19 254.19 0 0 0 .54 239.28C-.05 248.37 7.59 256 16.69 256h97.13c7.96 0 14.08-6.25 15.01-14.16 1.09-9.33 3.24-18.33 6.24-26.94 2.56-7.34.25-15.46-6.34-19.58zM319.03 8C298.86 2.82 277.77 0 256 0s-42.86 2.82-63.03 8c-9.17 2.35-13.91 12.6-10.39 21.39l37.47 104.03A16.003 16.003 0 0 0 235.1 144h41.8c6.75 0 12.77-4.23 15.05-10.58l37.47-104.03c3.52-8.79-1.22-19.03-10.39-21.39zM112 288H16c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm0 128H16c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm77.31-283.67l-36.32-90.8c-3.53-8.83-14.13-12.99-22.42-8.31a257.308 257.308 0 0 0-71.61 59.89c-6.06 7.32-3.85 18.48 4.22 23.52l82.93 51.83c6.51 4.07 14.66 2.62 20.11-2.79 5.18-5.15 10.79-9.85 16.79-14.05 6.28-4.41 9.15-12.17 6.3-19.29zM398.18 256h97.13c9.1 0 16.74-7.63 16.15-16.72a254.135 254.135 0 0 0-22.45-89.27c-3.94-8.62-14.89-11.47-22.93-6.45l-82.81 51.76c-6.59 4.12-8.9 12.24-6.34 19.58 3.01 8.61 5.15 17.62 6.24 26.94.93 7.91 7.05 14.16 15.01 14.16zm54.85-162.89a257.308 257.308 0 0 0-71.61-59.89c-8.28-4.68-18.88-.52-22.42 8.31l-36.32 90.8c-2.85 7.12.02 14.88 6.3 19.28 6 4.2 11.61 8.9 16.79 14.05 5.44 5.41 13.6 6.86 20.11 2.79l82.93-51.83c8.07-5.03 10.29-16.19 4.22-23.51zM496 288h-96c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm0 128h-96c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zM240 177.62V472c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8V177.62c-5.23-.89-10.52-1.62-16-1.62s-10.77.73-16 1.62zm-64 41.51V472c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8V189.36c-12.78 7.45-23.84 17.47-32 29.77zm128-29.77V472c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8V219.13c-8.16-12.3-19.22-22.32-32-29.77z\"]\n};\nvar faEdit = {\n prefix: 'fas',\n iconName: 'edit',\n icon: [576, 512, [], \"f044\", \"M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z\"]\n};\nvar faEgg = {\n prefix: 'fas',\n iconName: 'egg',\n icon: [384, 512, [], \"f7fb\", \"M192 0C86 0 0 214 0 320s86 192 192 192 192-86 192-192S298 0 192 0z\"]\n};\nvar faEject = {\n prefix: 'fas',\n iconName: 'eject',\n icon: [448, 512, [], \"f052\", \"M448 384v64c0 17.673-14.327 32-32 32H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h384c17.673 0 32 14.327 32 32zM48.053 320h351.886c41.651 0 63.581-49.674 35.383-80.435L259.383 47.558c-19.014-20.743-51.751-20.744-70.767 0L12.67 239.565C-15.475 270.268 6.324 320 48.053 320z\"]\n};\nvar faEllipsisH = {\n prefix: 'fas',\n iconName: 'ellipsis-h',\n icon: [512, 512, [], \"f141\", \"M328 256c0 39.8-32.2 72-72 72s-72-32.2-72-72 32.2-72 72-72 72 32.2 72 72zm104-72c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm-352 0c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z\"]\n};\nvar faEllipsisV = {\n prefix: 'fas',\n iconName: 'ellipsis-v',\n icon: [192, 512, [], \"f142\", \"M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z\"]\n};\nvar faEnvelope = {\n prefix: 'fas',\n iconName: 'envelope',\n icon: [512, 512, [], \"f0e0\", \"M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z\"]\n};\nvar faEnvelopeOpen = {\n prefix: 'fas',\n iconName: 'envelope-open',\n icon: [512, 512, [], \"f2b6\", \"M512 464c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V200.724a48 48 0 0 1 18.387-37.776c24.913-19.529 45.501-35.365 164.2-121.511C199.412 29.17 232.797-.347 256 .003c23.198-.354 56.596 29.172 73.413 41.433 118.687 86.137 139.303 101.995 164.2 121.512A48 48 0 0 1 512 200.724V464zm-65.666-196.605c-2.563-3.728-7.7-4.595-11.339-1.907-22.845 16.873-55.462 40.705-105.582 77.079-16.825 12.266-50.21 41.781-73.413 41.43-23.211.344-56.559-29.143-73.413-41.43-50.114-36.37-82.734-60.204-105.582-77.079-3.639-2.688-8.776-1.821-11.339 1.907l-9.072 13.196a7.998 7.998 0 0 0 1.839 10.967c22.887 16.899 55.454 40.69 105.303 76.868 20.274 14.781 56.524 47.813 92.264 47.573 35.724.242 71.961-32.771 92.263-47.573 49.85-36.179 82.418-59.97 105.303-76.868a7.998 7.998 0 0 0 1.839-10.967l-9.071-13.196z\"]\n};\nvar faEnvelopeOpenText = {\n prefix: 'fas',\n iconName: 'envelope-open-text',\n icon: [512, 512, [], \"f658\", \"M176 216h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16zm-16 80c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16zm96 121.13c-16.42 0-32.84-5.06-46.86-15.19L0 250.86V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V250.86L302.86 401.94c-14.02 10.12-30.44 15.19-46.86 15.19zm237.61-254.18c-8.85-6.94-17.24-13.47-29.61-22.81V96c0-26.51-21.49-48-48-48h-77.55c-3.04-2.2-5.87-4.26-9.04-6.56C312.6 29.17 279.2-.35 256 0c-23.2-.35-56.59 29.17-73.41 41.44-3.17 2.3-6 4.36-9.04 6.56H96c-26.51 0-48 21.49-48 48v44.14c-12.37 9.33-20.76 15.87-29.61 22.81A47.995 47.995 0 0 0 0 200.72v10.65l96 69.35V96h320v184.72l96-69.35v-10.65c0-14.74-6.78-28.67-18.39-37.77z\"]\n};\nvar faEnvelopeSquare = {\n prefix: 'fas',\n iconName: 'envelope-square',\n icon: [448, 512, [], \"f199\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM178.117 262.104C87.429 196.287 88.353 196.121 64 177.167V152c0-13.255 10.745-24 24-24h272c13.255 0 24 10.745 24 24v25.167c-24.371 18.969-23.434 19.124-114.117 84.938-10.5 7.655-31.392 26.12-45.883 25.894-14.503.218-35.367-18.227-45.883-25.895zM384 217.775V360c0 13.255-10.745 24-24 24H88c-13.255 0-24-10.745-24-24V217.775c13.958 10.794 33.329 25.236 95.303 70.214 14.162 10.341 37.975 32.145 64.694 32.01 26.887.134 51.037-22.041 64.72-32.025 61.958-44.965 81.325-59.406 95.283-70.199z\"]\n};\nvar faEquals = {\n prefix: 'fas',\n iconName: 'equals',\n icon: [448, 512, [], \"f52c\", \"M416 304H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32zm0-192H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faEraser = {\n prefix: 'fas',\n iconName: 'eraser',\n icon: [512, 512, [], \"f12d\", \"M497.941 273.941c18.745-18.745 18.745-49.137 0-67.882l-160-160c-18.745-18.745-49.136-18.746-67.883 0l-256 256c-18.745 18.745-18.745 49.137 0 67.882l96 96A48.004 48.004 0 0 0 144 480h356c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12H355.883l142.058-142.059zm-302.627-62.627l137.373 137.373L265.373 416H150.628l-80-80 124.686-124.686z\"]\n};\nvar faEthernet = {\n prefix: 'fas',\n iconName: 'ethernet',\n icon: [512, 512, [], \"f796\", \"M496 192h-48v-48c0-8.8-7.2-16-16-16h-48V80c0-8.8-7.2-16-16-16H144c-8.8 0-16 7.2-16 16v48H80c-8.8 0-16 7.2-16 16v48H16c-8.8 0-16 7.2-16 16v224c0 8.8 7.2 16 16 16h80V320h32v128h64V320h32v128h64V320h32v128h64V320h32v128h80c8.8 0 16-7.2 16-16V208c0-8.8-7.2-16-16-16z\"]\n};\nvar faEuroSign = {\n prefix: 'fas',\n iconName: 'euro-sign',\n icon: [320, 512, [], \"f153\", \"M310.706 413.765c-1.314-6.63-7.835-10.872-14.424-9.369-10.692 2.439-27.422 5.413-45.426 5.413-56.763 0-101.929-34.79-121.461-85.449h113.689a12 12 0 0 0 11.708-9.369l6.373-28.36c1.686-7.502-4.019-14.631-11.708-14.631H115.22c-1.21-14.328-1.414-28.287.137-42.245H261.95a12 12 0 0 0 11.723-9.434l6.512-29.755c1.638-7.484-4.061-14.566-11.723-14.566H130.184c20.633-44.991 62.69-75.03 117.619-75.03 14.486 0 28.564 2.25 37.851 4.145 6.216 1.268 12.347-2.498 14.002-8.623l11.991-44.368c1.822-6.741-2.465-13.616-9.326-14.917C290.217 34.912 270.71 32 249.635 32 152.451 32 74.03 92.252 45.075 176H12c-6.627 0-12 5.373-12 12v29.755c0 6.627 5.373 12 12 12h21.569c-1.009 13.607-1.181 29.287-.181 42.245H12c-6.627 0-12 5.373-12 12v28.36c0 6.627 5.373 12 12 12h30.114C67.139 414.692 145.264 480 249.635 480c26.301 0 48.562-4.544 61.101-7.788 6.167-1.595 10.027-7.708 8.788-13.957l-8.818-44.49z\"]\n};\nvar faExchangeAlt = {\n prefix: 'fas',\n iconName: 'exchange-alt',\n icon: [512, 512, [], \"f362\", \"M0 168v-16c0-13.255 10.745-24 24-24h360V80c0-21.367 25.899-32.042 40.971-16.971l80 80c9.372 9.373 9.372 24.569 0 33.941l-80 80C409.956 271.982 384 261.456 384 240v-48H24c-13.255 0-24-10.745-24-24zm488 152H128v-48c0-21.314-25.862-32.08-40.971-16.971l-80 80c-9.372 9.373-9.372 24.569 0 33.941l80 80C102.057 463.997 128 453.437 128 432v-48h360c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24z\"]\n};\nvar faExclamation = {\n prefix: 'fas',\n iconName: 'exclamation',\n icon: [192, 512, [], \"f12a\", \"M176 432c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zM25.26 25.199l13.6 272C39.499 309.972 50.041 320 62.83 320h66.34c12.789 0 23.331-10.028 23.97-22.801l13.6-272C167.425 11.49 156.496 0 142.77 0H49.23C35.504 0 24.575 11.49 25.26 25.199z\"]\n};\nvar faExclamationCircle = {\n prefix: 'fas',\n iconName: 'exclamation-circle',\n icon: [512, 512, [], \"f06a\", \"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z\"]\n};\nvar faExclamationTriangle = {\n prefix: 'fas',\n iconName: 'exclamation-triangle',\n icon: [576, 512, [], \"f071\", \"M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z\"]\n};\nvar faExpand = {\n prefix: 'fas',\n iconName: 'expand',\n icon: [448, 512, [], \"f065\", \"M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z\"]\n};\nvar faExpandArrowsAlt = {\n prefix: 'fas',\n iconName: 'expand-arrows-alt',\n icon: [448, 512, [], \"f31e\", \"M448 344v112a23.94 23.94 0 0 1-24 24H312c-21.39 0-32.09-25.9-17-41l36.2-36.2L224 295.6 116.77 402.9 153 439c15.09 15.1 4.39 41-17 41H24a23.94 23.94 0 0 1-24-24V344c0-21.4 25.89-32.1 41-17l36.19 36.2L184.46 256 77.18 148.7 41 185c-15.1 15.1-41 4.4-41-17V56a23.94 23.94 0 0 1 24-24h112c21.39 0 32.09 25.9 17 41l-36.2 36.2L224 216.4l107.23-107.3L295 73c-15.09-15.1-4.39-41 17-41h112a23.94 23.94 0 0 1 24 24v112c0 21.4-25.89 32.1-41 17l-36.19-36.2L263.54 256l107.28 107.3L407 327.1c15.1-15.2 41-4.5 41 16.9z\"]\n};\nvar faExternalLinkAlt = {\n prefix: 'fas',\n iconName: 'external-link-alt',\n icon: [576, 512, [], \"f35d\", \"M576 24v127.984c0 21.461-25.96 31.98-40.971 16.971l-35.707-35.709-243.523 243.523c-9.373 9.373-24.568 9.373-33.941 0l-22.627-22.627c-9.373-9.373-9.373-24.569 0-33.941L442.756 76.676l-35.703-35.705C391.982 25.9 402.656 0 424.024 0H552c13.255 0 24 10.745 24 24zM407.029 270.794l-16 16A23.999 23.999 0 0 0 384 303.765V448H64V128h264a24.003 24.003 0 0 0 16.97-7.029l16-16C376.089 89.851 365.381 64 344 64H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V287.764c0-21.382-25.852-32.09-40.971-16.97z\"]\n};\nvar faExternalLinkSquareAlt = {\n prefix: 'fas',\n iconName: 'external-link-square-alt',\n icon: [448, 512, [], \"f360\", \"M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zm-88 16H248.029c-21.313 0-32.08 25.861-16.971 40.971l31.984 31.987L67.515 364.485c-4.686 4.686-4.686 12.284 0 16.971l31.029 31.029c4.687 4.686 12.285 4.686 16.971 0l195.526-195.526 31.988 31.991C358.058 263.977 384 253.425 384 231.979V120c0-13.255-10.745-24-24-24z\"]\n};\nvar faEye = {\n prefix: 'fas',\n iconName: 'eye',\n icon: [576, 512, [], \"f06e\", \"M572.52 241.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400a144 144 0 1 1 144-144 143.93 143.93 0 0 1-144 144zm0-240a95.31 95.31 0 0 0-25.31 3.79 47.85 47.85 0 0 1-66.9 66.9A95.78 95.78 0 1 0 288 160z\"]\n};\nvar faEyeDropper = {\n prefix: 'fas',\n iconName: 'eye-dropper',\n icon: [512, 512, [], \"f1fb\", \"M50.75 333.25c-12 12-18.75 28.28-18.75 45.26V424L0 480l32 32 56-32h45.49c16.97 0 33.25-6.74 45.25-18.74l126.64-126.62-128-128L50.75 333.25zM483.88 28.12c-37.47-37.5-98.28-37.5-135.75 0l-77.09 77.09-13.1-13.1c-9.44-9.44-24.65-9.31-33.94 0l-40.97 40.97c-9.37 9.37-9.37 24.57 0 33.94l161.94 161.94c9.44 9.44 24.65 9.31 33.94 0L419.88 288c9.37-9.37 9.37-24.57 0-33.94l-13.1-13.1 77.09-77.09c37.51-37.48 37.51-98.26.01-135.75z\"]\n};\nvar faEyeSlash = {\n prefix: 'fas',\n iconName: 'eye-slash',\n icon: [640, 512, [], \"f070\", \"M320 400c-75.85 0-137.25-58.71-142.9-133.11L72.2 185.82c-13.79 17.3-26.48 35.59-36.72 55.59a32.35 32.35 0 0 0 0 29.19C89.71 376.41 197.07 448 320 448c26.91 0 52.87-4 77.89-10.46L346 397.39a144.13 144.13 0 0 1-26 2.61zm313.82 58.1l-110.55-85.44a331.25 331.25 0 0 0 81.25-102.07 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64a308.15 308.15 0 0 0-147.32 37.7L45.46 3.37A16 16 0 0 0 23 6.18L3.37 31.45A16 16 0 0 0 6.18 53.9l588.36 454.73a16 16 0 0 0 22.46-2.81l19.64-25.27a16 16 0 0 0-2.82-22.45zm-183.72-142l-39.3-30.38A94.75 94.75 0 0 0 416 256a94.76 94.76 0 0 0-121.31-92.21A47.65 47.65 0 0 1 304 192a46.64 46.64 0 0 1-1.54 10l-73.61-56.89A142.31 142.31 0 0 1 320 112a143.92 143.92 0 0 1 144 144c0 21.63-5.29 41.79-13.9 60.11z\"]\n};\nvar faFan = {\n prefix: 'fas',\n iconName: 'fan',\n icon: [512, 512, [], \"f863\", \"M352.57 128c-28.09 0-54.09 4.52-77.06 12.86l12.41-123.11C289 7.31 279.81-1.18 269.33.13 189.63 10.13 128 77.64 128 159.43c0 28.09 4.52 54.09 12.86 77.06L17.75 224.08C7.31 223-1.18 232.19.13 242.67c10 79.7 77.51 141.33 159.3 141.33 28.09 0 54.09-4.52 77.06-12.86l-12.41 123.11c-1.05 10.43 8.11 18.93 18.59 17.62 79.7-10 141.33-77.51 141.33-159.3 0-28.09-4.52-54.09-12.86-77.06l123.11 12.41c10.44 1.05 18.93-8.11 17.62-18.59-10-79.7-77.51-141.33-159.3-141.33zM256 288a32 32 0 1 1 32-32 32 32 0 0 1-32 32z\"]\n};\nvar faFastBackward = {\n prefix: 'fas',\n iconName: 'fast-backward',\n icon: [512, 512, [], \"f049\", \"M0 436V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v151.9L235.5 71.4C256.1 54.3 288 68.6 288 96v131.9L459.5 71.4C480.1 54.3 512 68.6 512 96v320c0 27.4-31.9 41.7-52.5 24.6L288 285.3V416c0 27.4-31.9 41.7-52.5 24.6L64 285.3V436c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12z\"]\n};\nvar faFastForward = {\n prefix: 'fas',\n iconName: 'fast-forward',\n icon: [512, 512, [], \"f050\", \"M512 76v360c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12V284.1L276.5 440.6c-20.6 17.2-52.5 2.8-52.5-24.6V284.1L52.5 440.6C31.9 457.8 0 443.4 0 416V96c0-27.4 31.9-41.7 52.5-24.6L224 226.8V96c0-27.4 31.9-41.7 52.5-24.6L448 226.8V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12z\"]\n};\nvar faFax = {\n prefix: 'fas',\n iconName: 'fax',\n icon: [512, 512, [], \"f1ac\", \"M64 128H32c-17.67 0-32 14.33-32 32v320c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V160c0-17.67-14.33-32-32-32zm416 32V77.25c0-8.49-3.37-16.62-9.37-22.63L425.37 9.37c-6-6-14.14-9.37-22.63-9.37H160c-17.67 0-32 14.33-32 32v448c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32V192c0-17.67-14.33-32-32-32zM288 432c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm0-128c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm128 128c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm0-128c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm16-112H176V48h208v32c0 8.84 7.16 16 16 16h32v96z\"]\n};\nvar faFeather = {\n prefix: 'fas',\n iconName: 'feather',\n icon: [512, 512, [], \"f52d\", \"M467.14 44.84c-62.55-62.48-161.67-64.78-252.28 25.73-78.61 78.52-60.98 60.92-85.75 85.66-60.46 60.39-70.39 150.83-63.64 211.17l178.44-178.25c6.26-6.25 16.4-6.25 22.65 0s6.25 16.38 0 22.63L7.04 471.03c-9.38 9.37-9.38 24.57 0 33.94 9.38 9.37 24.6 9.37 33.98 0l66.1-66.03C159.42 454.65 279 457.11 353.95 384h-98.19l147.57-49.14c49.99-49.93 36.38-36.18 46.31-46.86h-97.78l131.54-43.8c45.44-74.46 34.31-148.84-16.26-199.36z\"]\n};\nvar faFeatherAlt = {\n prefix: 'fas',\n iconName: 'feather-alt',\n icon: [512, 512, [], \"f56b\", \"M512 0C460.22 3.56 96.44 38.2 71.01 287.61c-3.09 26.66-4.84 53.44-5.99 80.24l178.87-178.69c6.25-6.25 16.4-6.25 22.65 0s6.25 16.38 0 22.63L7.04 471.03c-9.38 9.37-9.38 24.57 0 33.94 9.38 9.37 24.59 9.37 33.98 0l57.13-57.07c42.09-.14 84.15-2.53 125.96-7.36 53.48-5.44 97.02-26.47 132.58-56.54H255.74l146.79-48.88c11.25-14.89 21.37-30.71 30.45-47.12h-81.14l106.54-53.21C500.29 132.86 510.19 26.26 512 0z\"]\n};\nvar faFemale = {\n prefix: 'fas',\n iconName: 'female',\n icon: [256, 512, [], \"f182\", \"M128 0c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64S92.654 0 128 0m119.283 354.179l-48-192A24 24 0 0 0 176 144h-11.36c-22.711 10.443-49.59 10.894-73.28 0H80a24 24 0 0 0-23.283 18.179l-48 192C4.935 369.305 16.383 384 32 384h56v104c0 13.255 10.745 24 24 24h32c13.255 0 24-10.745 24-24V384h56c15.591 0 27.071-14.671 23.283-29.821z\"]\n};\nvar faFighterJet = {\n prefix: 'fas',\n iconName: 'fighter-jet',\n icon: [640, 512, [], \"f0fb\", \"M544 224l-128-16-48-16h-24L227.158 44h39.509C278.333 44 288 41.375 288 38s-9.667-6-21.333-6H152v12h16v164h-48l-66.667-80H18.667L8 138.667V208h8v16h48v2.666l-64 8v42.667l64 8V288H16v16H8v69.333L18.667 384h34.667L120 304h48v164h-16v12h114.667c11.667 0 21.333-2.625 21.333-6s-9.667-6-21.333-6h-39.509L344 320h24l48-16 128-16c96-21.333 96-26.583 96-32 0-5.417 0-10.667-96-32z\"]\n};\nvar faFile = {\n prefix: 'fas',\n iconName: 'file',\n icon: [384, 512, [], \"f15b\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm160-14.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileAlt = {\n prefix: 'fas',\n iconName: 'file-alt',\n icon: [384, 512, [], \"f15c\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm64 236c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-64c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-72v8c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm96-114.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileArchive = {\n prefix: 'fas',\n iconName: 'file-archive',\n icon: [384, 512, [], \"f1c6\", \"M377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zM128.4 336c-17.9 0-32.4 12.1-32.4 27 0 15 14.6 27 32.5 27s32.4-12.1 32.4-27-14.6-27-32.5-27zM224 136V0h-63.6v32h-32V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM95.9 32h32v32h-32zm32.3 384c-33.2 0-58-30.4-51.4-62.9L96.4 256v-32h32v-32h-32v-32h32v-32h-32V96h32V64h32v32h-32v32h32v32h-32v32h32v32h-32v32h22.1c5.7 0 10.7 4.1 11.8 9.7l17.3 87.7c6.4 32.4-18.4 62.6-51.4 62.6z\"]\n};\nvar faFileAudio = {\n prefix: 'fas',\n iconName: 'file-audio',\n icon: [384, 512, [], \"f1c7\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm-64 268c0 10.7-12.9 16-20.5 8.5L104 376H76c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h28l35.5-36.5c7.6-7.6 20.5-2.2 20.5 8.5v136zm33.2-47.6c9.1-9.3 9.1-24.1 0-33.4-22.1-22.8 12.2-56.2 34.4-33.5 27.2 27.9 27.2 72.4 0 100.4-21.8 22.3-56.9-10.4-34.4-33.5zm86-117.1c54.4 55.9 54.4 144.8 0 200.8-21.8 22.4-57-10.3-34.4-33.5 36.2-37.2 36.3-96.5 0-133.8-22.1-22.8 12.3-56.3 34.4-33.5zM384 121.9v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileCode = {\n prefix: 'fas',\n iconName: 'file-code',\n icon: [384, 512, [], \"f1c9\", \"M384 121.941V128H256V0h6.059c6.365 0 12.47 2.529 16.971 7.029l97.941 97.941A24.005 24.005 0 0 1 384 121.941zM248 160c-13.2 0-24-10.8-24-24V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248zM123.206 400.505a5.4 5.4 0 0 1-7.633.246l-64.866-60.812a5.4 5.4 0 0 1 0-7.879l64.866-60.812a5.4 5.4 0 0 1 7.633.246l19.579 20.885a5.4 5.4 0 0 1-.372 7.747L101.65 336l40.763 35.874a5.4 5.4 0 0 1 .372 7.747l-19.579 20.884zm51.295 50.479l-27.453-7.97a5.402 5.402 0 0 1-3.681-6.692l61.44-211.626a5.402 5.402 0 0 1 6.692-3.681l27.452 7.97a5.4 5.4 0 0 1 3.68 6.692l-61.44 211.626a5.397 5.397 0 0 1-6.69 3.681zm160.792-111.045l-64.866 60.812a5.4 5.4 0 0 1-7.633-.246l-19.58-20.885a5.4 5.4 0 0 1 .372-7.747L284.35 336l-40.763-35.874a5.4 5.4 0 0 1-.372-7.747l19.58-20.885a5.4 5.4 0 0 1 7.633-.246l64.866 60.812a5.4 5.4 0 0 1-.001 7.879z\"]\n};\nvar faFileContract = {\n prefix: 'fas',\n iconName: 'file-contract',\n icon: [384, 512, [], \"f56c\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM64 72c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8V72zm0 64c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zm192.81 248H304c8.84 0 16 7.16 16 16s-7.16 16-16 16h-47.19c-16.45 0-31.27-9.14-38.64-23.86-2.95-5.92-8.09-6.52-10.17-6.52s-7.22.59-10.02 6.19l-7.67 15.34a15.986 15.986 0 0 1-14.31 8.84c-.38 0-.75-.02-1.14-.05-6.45-.45-12-4.75-14.03-10.89L144 354.59l-10.61 31.88c-5.89 17.66-22.38 29.53-41 29.53H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h12.39c4.83 0 9.11-3.08 10.64-7.66l18.19-54.64c3.3-9.81 12.44-16.41 22.78-16.41s19.48 6.59 22.77 16.41l13.88 41.64c19.77-16.19 54.05-9.7 66 14.16 2.02 4.06 5.96 6.5 10.16 6.5zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileCsv = {\n prefix: 'fas',\n iconName: 'file-csv',\n icon: [384, 512, [], \"f6dd\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm-96 144c0 4.42-3.58 8-8 8h-8c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h8c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-8c-26.51 0-48-21.49-48-48v-32c0-26.51 21.49-48 48-48h8c4.42 0 8 3.58 8 8v16zm44.27 104H160c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h12.27c5.95 0 10.41-3.5 10.41-6.62 0-1.3-.75-2.66-2.12-3.84l-21.89-18.77c-8.47-7.22-13.33-17.48-13.33-28.14 0-21.3 19.02-38.62 42.41-38.62H200c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-12.27c-5.95 0-10.41 3.5-10.41 6.62 0 1.3.75 2.66 2.12 3.84l21.89 18.77c8.47 7.22 13.33 17.48 13.33 28.14.01 21.29-19 38.62-42.39 38.62zM256 264v20.8c0 20.27 5.7 40.17 16 56.88 10.3-16.7 16-36.61 16-56.88V264c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v20.8c0 35.48-12.88 68.89-36.28 94.09-3.02 3.25-7.27 5.11-11.72 5.11s-8.7-1.86-11.72-5.11c-23.4-25.2-36.28-58.61-36.28-94.09V264c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8zm121-159L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileDownload = {\n prefix: 'fas',\n iconName: 'file-download',\n icon: [384, 512, [], \"f56d\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm76.45 211.36l-96.42 95.7c-6.65 6.61-17.39 6.61-24.04 0l-96.42-95.7C73.42 337.29 80.54 320 94.82 320H160v-80c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v80h65.18c14.28 0 21.4 17.29 11.27 27.36zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileExcel = {\n prefix: 'fas',\n iconName: 'file-excel',\n icon: [384, 512, [], \"f1c3\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm60.1 106.5L224 336l60.1 93.5c5.1 8-.6 18.5-10.1 18.5h-34.9c-4.4 0-8.5-2.4-10.6-6.3C208.9 405.5 192 373 192 373c-6.4 14.8-10 20-36.6 68.8-2.1 3.9-6.1 6.3-10.5 6.3H110c-9.5 0-15.2-10.5-10.1-18.5l60.3-93.5-60.3-93.5c-5.2-8 .6-18.5 10.1-18.5h34.8c4.4 0 8.5 2.4 10.6 6.3 26.1 48.8 20 33.6 36.6 68.5 0 0 6.1-11.7 36.6-68.5 2.1-3.9 6.2-6.3 10.6-6.3H274c9.5-.1 15.2 10.4 10.1 18.4zM384 121.9v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileExport = {\n prefix: 'fas',\n iconName: 'file-export',\n icon: [576, 512, [], \"f56e\", \"M384 121.9c0-6.3-2.5-12.4-7-16.9L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128zM571 308l-95.7-96.4c-10.1-10.1-27.4-3-27.4 11.3V288h-64v64h64v65.2c0 14.3 17.3 21.4 27.4 11.3L571 332c6.6-6.6 6.6-17.4 0-24zm-379 28v-32c0-8.8 7.2-16 16-16h176V160H248c-13.2 0-24-10.8-24-24V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V352H208c-8.8 0-16-7.2-16-16z\"]\n};\nvar faFileImage = {\n prefix: 'fas',\n iconName: 'file-image',\n icon: [384, 512, [], \"f1c5\", \"M384 121.941V128H256V0h6.059a24 24 0 0 1 16.97 7.029l97.941 97.941a24.002 24.002 0 0 1 7.03 16.971zM248 160c-13.2 0-24-10.8-24-24V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248zm-135.455 16c26.51 0 48 21.49 48 48s-21.49 48-48 48-48-21.49-48-48 21.491-48 48-48zm208 240h-256l.485-48.485L104.545 328c4.686-4.686 11.799-4.201 16.485.485L160.545 368 264.06 264.485c4.686-4.686 12.284-4.686 16.971 0L320.545 304v112z\"]\n};\nvar faFileImport = {\n prefix: 'fas',\n iconName: 'file-import',\n icon: [512, 512, [], \"f56f\", \"M16 288c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h112v-64zm489-183L407.1 7c-4.5-4.5-10.6-7-17-7H384v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H152c-13.3 0-24 10.7-24 24v264h128v-65.2c0-14.3 17.3-21.4 27.4-11.3L379 308c6.6 6.7 6.6 17.4 0 24l-95.7 96.4c-10.1 10.1-27.4 3-27.4-11.3V352H128v136c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H376c-13.2 0-24-10.8-24-24z\"]\n};\nvar faFileInvoice = {\n prefix: 'fas',\n iconName: 'file-invoice',\n icon: [384, 512, [], \"f570\", \"M288 256H96v64h192v-64zm89-151L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM64 72c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8V72zm0 64c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zm256 304c0 4.42-3.58 8-8 8h-80c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16zm0-200v96c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-96c0-8.84 7.16-16 16-16h224c8.84 0 16 7.16 16 16z\"]\n};\nvar faFileInvoiceDollar = {\n prefix: 'fas',\n iconName: 'file-invoice-dollar',\n icon: [384, 512, [], \"f571\", \"M377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM64 72c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8V72zm0 80v-16c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8zm144 263.88V440c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-24.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V232c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v24.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.05 44.44-42.67 45.07z\"]\n};\nvar faFileMedical = {\n prefix: 'fas',\n iconName: 'file-medical',\n icon: [384, 512, [], \"f477\", \"M377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm64 160v48c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8z\"]\n};\nvar faFileMedicalAlt = {\n prefix: 'fas',\n iconName: 'file-medical-alt',\n icon: [448, 512, [], \"f478\", \"M288 136V0H88C74.7 0 64 10.7 64 24v232H8c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h140.9c3 0 5.8 1.7 7.2 4.4l19.9 39.8 56.8-113.7c2.9-5.9 11.4-5.9 14.3 0l34.7 69.5H352c8.8 0 16 7.2 16 16s-7.2 16-16 16h-89.9L240 275.8l-56.8 113.7c-2.9 5.9-11.4 5.9-14.3 0L134.1 320H64v168c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H312c-13.2 0-24-10.8-24-24zm153-31L343.1 7c-4.5-4.5-10.6-7-17-7H320v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFilePdf = {\n prefix: 'fas',\n iconName: 'file-pdf',\n icon: [384, 512, [], \"f1c1\", \"M181.9 256.1c-5-16-4.9-46.9-2-46.9 8.4 0 7.6 36.9 2 46.9zm-1.7 47.2c-7.7 20.2-17.3 43.3-28.4 62.7 18.3-7 39-17.2 62.9-21.9-12.7-9.6-24.9-23.4-34.5-40.8zM86.1 428.1c0 .8 13.2-5.4 34.9-40.2-6.7 6.3-29.1 24.5-34.9 40.2zM248 160h136v328c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V24C0 10.7 10.7 0 24 0h200v136c0 13.2 10.8 24 24 24zm-8 171.8c-20-12.2-33.3-29-42.7-53.8 4.5-18.5 11.6-46.6 6.2-64.2-4.7-29.4-42.4-26.5-47.8-6.8-5 18.3-.4 44.1 8.1 77-11.6 27.6-28.7 64.6-40.8 85.8-.1 0-.1.1-.2.1-27.1 13.9-73.6 44.5-54.5 68 5.6 6.9 16 10 21.5 10 17.9 0 35.7-18 61.1-61.8 25.8-8.5 54.1-19.1 79-23.2 21.7 11.8 47.1 19.5 64 19.5 29.2 0 31.2-32 19.7-43.4-13.9-13.6-54.3-9.7-73.6-7.2zM377 105L279 7c-4.5-4.5-10.6-7-17-7h-6v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-74.1 255.3c4.1-2.7-2.5-11.9-42.8-9 37.1 15.8 42.8 9 42.8 9z\"]\n};\nvar faFilePowerpoint = {\n prefix: 'fas',\n iconName: 'file-powerpoint',\n icon: [384, 512, [], \"f1c4\", \"M193.7 271.2c8.8 0 15.5 2.7 20.3 8.1 9.6 10.9 9.8 32.7-.2 44.1-4.9 5.6-11.9 8.5-21.1 8.5h-26.9v-60.7h27.9zM377 105L279 7c-4.5-4.5-10.6-7-17-7h-6v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm53 165.2c0 90.3-88.8 77.6-111.1 77.6V436c0 6.6-5.4 12-12 12h-30.8c-6.6 0-12-5.4-12-12V236.2c0-6.6 5.4-12 12-12h81c44.5 0 72.9 32.8 72.9 77z\"]\n};\nvar faFilePrescription = {\n prefix: 'fas',\n iconName: 'file-prescription',\n icon: [384, 512, [], \"f572\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm68.53 179.48l11.31 11.31c6.25 6.25 6.25 16.38 0 22.63l-29.9 29.9L304 409.38c6.25 6.25 6.25 16.38 0 22.63l-11.31 11.31c-6.25 6.25-16.38 6.25-22.63 0L240 413.25l-30.06 30.06c-6.25 6.25-16.38 6.25-22.63 0L176 432c-6.25-6.25-6.25-16.38 0-22.63l30.06-30.06L146.74 320H128v48c0 8.84-7.16 16-16 16H96c-8.84 0-16-7.16-16-16V208c0-8.84 7.16-16 16-16h80c35.35 0 64 28.65 64 64 0 24.22-13.62 45.05-33.46 55.92L240 345.38l29.9-29.9c6.25-6.25 16.38-6.25 22.63 0zM176 272h-48v-32h48c8.82 0 16 7.18 16 16s-7.18 16-16 16zm208-150.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileSignature = {\n prefix: 'fas',\n iconName: 'file-signature',\n icon: [576, 512, [], \"f573\", \"M218.17 424.14c-2.95-5.92-8.09-6.52-10.17-6.52s-7.22.59-10.02 6.19l-7.67 15.34c-6.37 12.78-25.03 11.37-29.48-2.09L144 386.59l-10.61 31.88c-5.89 17.66-22.38 29.53-41 29.53H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h12.39c4.83 0 9.11-3.08 10.64-7.66l18.19-54.64c3.3-9.81 12.44-16.41 22.78-16.41s19.48 6.59 22.77 16.41l13.88 41.64c19.75-16.19 54.06-9.7 66 14.16 1.89 3.78 5.49 5.95 9.36 6.26v-82.12l128-127.09V160H248c-13.2 0-24-10.8-24-24V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24v-40l-128-.11c-16.12-.31-30.58-9.28-37.83-23.75zM384 121.9c0-6.3-2.5-12.4-7-16.9L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1zm-96 225.06V416h68.99l161.68-162.78-67.88-67.88L288 346.96zm280.54-179.63l-31.87-31.87c-9.94-9.94-26.07-9.94-36.01 0l-27.25 27.25 67.88 67.88 27.25-27.25c9.95-9.94 9.95-26.07 0-36.01z\"]\n};\nvar faFileUpload = {\n prefix: 'fas',\n iconName: 'file-upload',\n icon: [384, 512, [], \"f574\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm65.18 216.01H224v80c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-80H94.82c-14.28 0-21.41-17.29-11.27-27.36l96.42-95.7c6.65-6.61 17.39-6.61 24.04 0l96.42 95.7c10.15 10.07 3.03 27.36-11.25 27.36zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileVideo = {\n prefix: 'fas',\n iconName: 'file-video',\n icon: [384, 512, [], \"f1c8\", \"M384 121.941V128H256V0h6.059c6.365 0 12.47 2.529 16.971 7.029l97.941 97.941A24.005 24.005 0 0 1 384 121.941zM224 136V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248c-13.2 0-24-10.8-24-24zm96 144.016v111.963c0 21.445-25.943 31.998-40.971 16.971L224 353.941V392c0 13.255-10.745 24-24 24H88c-13.255 0-24-10.745-24-24V280c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v38.059l55.029-55.013c15.011-15.01 40.971-4.491 40.971 16.97z\"]\n};\nvar faFileWord = {\n prefix: 'fas',\n iconName: 'file-word',\n icon: [384, 512, [], \"f1c2\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm57.1 120H305c7.7 0 13.4 7.1 11.7 14.7l-38 168c-1.2 5.5-6.1 9.3-11.7 9.3h-38c-5.5 0-10.3-3.8-11.6-9.1-25.8-103.5-20.8-81.2-25.6-110.5h-.5c-1.1 14.3-2.4 17.4-25.6 110.5-1.3 5.3-6.1 9.1-11.6 9.1H117c-5.6 0-10.5-3.9-11.7-9.4l-37.8-168c-1.7-7.5 4-14.6 11.7-14.6h24.5c5.7 0 10.7 4 11.8 9.7 15.6 78 20.1 109.5 21 122.2 1.6-10.2 7.3-32.7 29.4-122.7 1.3-5.4 6.1-9.1 11.7-9.1h29.1c5.6 0 10.4 3.8 11.7 9.2 24 100.4 28.8 124 29.6 129.4-.2-11.2-2.6-17.8 21.6-129.2 1-5.6 5.9-9.5 11.5-9.5zM384 121.9v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFill = {\n prefix: 'fas',\n iconName: 'fill',\n icon: [512, 512, [], \"f575\", \"M502.63 217.06L294.94 9.37C288.69 3.12 280.5 0 272.31 0s-16.38 3.12-22.62 9.37l-81.58 81.58L81.93 4.77c-6.24-6.25-16.38-6.25-22.62 0L36.69 27.38c-6.24 6.25-6.24 16.38 0 22.63l86.19 86.18-94.76 94.76c-37.49 37.49-37.49 98.26 0 135.75l117.19 117.19c18.75 18.74 43.31 28.12 67.87 28.12 24.57 0 49.13-9.37 67.88-28.12l221.57-221.57c12.49-12.5 12.49-32.76 0-45.26zm-116.22 70.97H65.93c1.36-3.84 3.57-7.98 7.43-11.83l13.15-13.15 81.61-81.61 58.61 58.6c12.49 12.49 32.75 12.49 45.24 0 12.49-12.49 12.49-32.75 0-45.24l-58.61-58.6 58.95-58.95 162.45 162.44-48.35 48.34z\"]\n};\nvar faFillDrip = {\n prefix: 'fas',\n iconName: 'fill-drip',\n icon: [576, 512, [], \"f576\", \"M512 320s-64 92.65-64 128c0 35.35 28.66 64 64 64s64-28.65 64-64-64-128-64-128zm-9.37-102.94L294.94 9.37C288.69 3.12 280.5 0 272.31 0s-16.38 3.12-22.62 9.37l-81.58 81.58L81.93 4.76c-6.25-6.25-16.38-6.25-22.62 0L36.69 27.38c-6.24 6.25-6.24 16.38 0 22.62l86.19 86.18-94.76 94.76c-37.49 37.48-37.49 98.26 0 135.75l117.19 117.19c18.74 18.74 43.31 28.12 67.87 28.12 24.57 0 49.13-9.37 67.87-28.12l221.57-221.57c12.5-12.5 12.5-32.75.01-45.25zm-116.22 70.97H65.93c1.36-3.84 3.57-7.98 7.43-11.83l13.15-13.15 81.61-81.61 58.6 58.6c12.49 12.49 32.75 12.49 45.24 0s12.49-32.75 0-45.24l-58.6-58.6 58.95-58.95 162.44 162.44-48.34 48.34z\"]\n};\nvar faFilm = {\n prefix: 'fas',\n iconName: 'film',\n icon: [512, 512, [], \"f008\", \"M488 64h-8v20c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12V64H96v20c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12V64h-8C10.7 64 0 74.7 0 88v336c0 13.3 10.7 24 24 24h8v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h320v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h8c13.3 0 24-10.7 24-24V88c0-13.3-10.7-24-24-24zM96 372c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm272 208c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm0-168c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm112 152c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40z\"]\n};\nvar faFilter = {\n prefix: 'fas',\n iconName: 'filter',\n icon: [512, 512, [], \"f0b0\", \"M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z\"]\n};\nvar faFingerprint = {\n prefix: 'fas',\n iconName: 'fingerprint',\n icon: [512, 512, [], \"f577\", \"M256.12 245.96c-13.25 0-24 10.74-24 24 1.14 72.25-8.14 141.9-27.7 211.55-2.73 9.72 2.15 30.49 23.12 30.49 10.48 0 20.11-6.92 23.09-17.52 13.53-47.91 31.04-125.41 29.48-224.52.01-13.25-10.73-24-23.99-24zm-.86-81.73C194 164.16 151.25 211.3 152.1 265.32c.75 47.94-3.75 95.91-13.37 142.55-2.69 12.98 5.67 25.69 18.64 28.36 13.05 2.67 25.67-5.66 28.36-18.64 10.34-50.09 15.17-101.58 14.37-153.02-.41-25.95 19.92-52.49 54.45-52.34 31.31.47 57.15 25.34 57.62 55.47.77 48.05-2.81 96.33-10.61 143.55-2.17 13.06 6.69 25.42 19.76 27.58 19.97 3.33 26.81-15.1 27.58-19.77 8.28-50.03 12.06-101.21 11.27-152.11-.88-55.8-47.94-101.88-104.91-102.72zm-110.69-19.78c-10.3-8.34-25.37-6.8-33.76 3.48-25.62 31.5-39.39 71.28-38.75 112 .59 37.58-2.47 75.27-9.11 112.05-2.34 13.05 6.31 25.53 19.36 27.89 20.11 3.5 27.07-14.81 27.89-19.36 7.19-39.84 10.5-80.66 9.86-121.33-.47-29.88 9.2-57.88 28-80.97 8.35-10.28 6.79-25.39-3.49-33.76zm109.47-62.33c-15.41-.41-30.87 1.44-45.78 4.97-12.89 3.06-20.87 15.98-17.83 28.89 3.06 12.89 16 20.83 28.89 17.83 11.05-2.61 22.47-3.77 34-3.69 75.43 1.13 137.73 61.5 138.88 134.58.59 37.88-1.28 76.11-5.58 113.63-1.5 13.17 7.95 25.08 21.11 26.58 16.72 1.95 25.51-11.88 26.58-21.11a929.06 929.06 0 0 0 5.89-119.85c-1.56-98.75-85.07-180.33-186.16-181.83zm252.07 121.45c-2.86-12.92-15.51-21.2-28.61-18.27-12.94 2.86-21.12 15.66-18.26 28.61 4.71 21.41 4.91 37.41 4.7 61.6-.11 13.27 10.55 24.09 23.8 24.2h.2c13.17 0 23.89-10.61 24-23.8.18-22.18.4-44.11-5.83-72.34zm-40.12-90.72C417.29 43.46 337.6 1.29 252.81.02 183.02-.82 118.47 24.91 70.46 72.94 24.09 119.37-.9 181.04.14 246.65l-.12 21.47c-.39 13.25 10.03 24.31 23.28 24.69.23.02.48.02.72.02 12.92 0 23.59-10.3 23.97-23.3l.16-23.64c-.83-52.5 19.16-101.86 56.28-139 38.76-38.8 91.34-59.67 147.68-58.86 69.45 1.03 134.73 35.56 174.62 92.39 7.61 10.86 22.56 13.45 33.42 5.86 10.84-7.62 13.46-22.59 5.84-33.43z\"]\n};\nvar faFire = {\n prefix: 'fas',\n iconName: 'fire',\n icon: [384, 512, [], \"f06d\", \"M216 23.86c0-23.8-30.65-32.77-44.15-13.04C48 191.85 224 200 224 288c0 35.63-29.11 64.46-64.85 63.99-35.17-.45-63.15-29.77-63.15-64.94v-85.51c0-21.7-26.47-32.23-41.43-16.5C27.8 213.16 0 261.33 0 320c0 105.87 86.13 192 192 192s192-86.13 192-192c0-170.29-168-193-168-296.14z\"]\n};\nvar faFireAlt = {\n prefix: 'fas',\n iconName: 'fire-alt',\n icon: [448, 512, [], \"f7e4\", \"M323.56 51.2c-20.8 19.3-39.58 39.59-56.22 59.97C240.08 73.62 206.28 35.53 168 0 69.74 91.17 0 209.96 0 281.6 0 408.85 100.29 512 224 512s224-103.15 224-230.4c0-53.27-51.98-163.14-124.44-230.4zm-19.47 340.65C282.43 407.01 255.72 416 226.86 416 154.71 416 96 368.26 96 290.75c0-38.61 24.31-72.63 72.79-130.75 6.93 7.98 98.83 125.34 98.83 125.34l58.63-66.88c4.14 6.85 7.91 13.55 11.27 19.97 27.35 52.19 15.81 118.97-33.43 153.42z\"]\n};\nvar faFireExtinguisher = {\n prefix: 'fas',\n iconName: 'fire-extinguisher',\n icon: [448, 512, [], \"f134\", \"M434.027 26.329l-168 28C254.693 56.218 256 67.8 256 72h-58.332C208.353 36.108 181.446 0 144 0c-39.435 0-66.368 39.676-52.228 76.203-52.039 13.051-75.381 54.213-90.049 90.884-4.923 12.307 1.063 26.274 13.37 31.197 12.317 4.926 26.279-1.075 31.196-13.37C75.058 112.99 106.964 120 168 120v27.076c-41.543 10.862-72 49.235-72 94.129V488c0 13.255 10.745 24 24 24h144c13.255 0 24-10.745 24-24V240c0-44.731-30.596-82.312-72-92.97V120h40c0 2.974-1.703 15.716 10.027 17.671l168 28C441.342 166.89 448 161.25 448 153.834V38.166c0-7.416-6.658-13.056-13.973-11.837zM144 72c-8.822 0-16-7.178-16-16s7.178-16 16-16 16 7.178 16 16-7.178 16-16 16z\"]\n};\nvar faFirstAid = {\n prefix: 'fas',\n iconName: 'first-aid',\n icon: [576, 512, [], \"f479\", \"M0 80v352c0 26.5 21.5 48 48 48h48V32H48C21.5 32 0 53.5 0 80zm128 400h320V32H128v448zm64-248c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48zM528 32h-48v448h48c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faFish = {\n prefix: 'fas',\n iconName: 'fish',\n icon: [576, 512, [], \"f578\", \"M327.1 96c-89.97 0-168.54 54.77-212.27 101.63L27.5 131.58c-12.13-9.18-30.24.6-27.14 14.66L24.54 256 .35 365.77c-3.1 14.06 15.01 23.83 27.14 14.66l87.33-66.05C158.55 361.23 237.13 416 327.1 416 464.56 416 576 288 576 256S464.56 96 327.1 96zm87.43 184c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24 13.26 0 24 10.74 24 24 0 13.25-10.75 24-24 24z\"]\n};\nvar faFistRaised = {\n prefix: 'fas',\n iconName: 'fist-raised',\n icon: [384, 512, [], \"f6de\", \"M255.98 160V16c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v146.93c5.02-1.78 10.34-2.93 15.97-2.93h48.03zm128 95.99c-.01-35.34-28.66-63.99-63.99-63.99H207.85c-8.78 0-15.9 7.07-15.9 15.85v.56c0 26.27 21.3 47.59 47.57 47.59h35.26c9.68 0 13.2 3.58 13.2 8v16.2c0 4.29-3.59 7.78-7.88 8-44.52 2.28-64.16 24.71-96.05 72.55l-6.31 9.47a7.994 7.994 0 0 1-11.09 2.22l-13.31-8.88a7.994 7.994 0 0 1-2.22-11.09l6.31-9.47c15.73-23.6 30.2-43.26 47.31-58.08-17.27-5.51-31.4-18.12-38.87-34.45-6.59 3.41-13.96 5.52-21.87 5.52h-32c-12.34 0-23.49-4.81-32-12.48C71.48 251.19 60.33 256 48 256H16c-5.64 0-10.97-1.15-16-2.95v77.93c0 33.95 13.48 66.5 37.49 90.51L63.99 448v64h255.98v-63.96l35.91-35.92A96.035 96.035 0 0 0 384 344.21l-.02-88.22zm-32.01-90.09V48c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v112h32c11.28 0 21.94 2.31 32 5.9zM16 224h32c8.84 0 16-7.16 16-16V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v128c0 8.84 7.16 16 16 16zm95.99 0h32c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v160c0 8.84 7.16 16 16 16z\"]\n};\nvar faFlag = {\n prefix: 'fas',\n iconName: 'flag',\n icon: [512, 512, [], \"f024\", \"M349.565 98.783C295.978 98.783 251.721 64 184.348 64c-24.955 0-47.309 4.384-68.045 12.013a55.947 55.947 0 0 0 3.586-23.562C118.117 24.015 94.806 1.206 66.338.048 34.345-1.254 8 24.296 8 56c0 19.026 9.497 35.825 24 45.945V488c0 13.255 10.745 24 24 24h16c13.255 0 24-10.745 24-24v-94.4c28.311-12.064 63.582-22.122 114.435-22.122 53.588 0 97.844 34.783 165.217 34.783 48.169 0 86.667-16.294 122.505-40.858C506.84 359.452 512 349.571 512 339.045v-243.1c0-23.393-24.269-38.87-45.485-29.016-34.338 15.948-76.454 31.854-116.95 31.854z\"]\n};\nvar faFlagCheckered = {\n prefix: 'fas',\n iconName: 'flag-checkered',\n icon: [512, 512, [], \"f11e\", \"M243.2 189.9V258c26.1 5.9 49.3 15.6 73.6 22.3v-68.2c-26-5.8-49.4-15.5-73.6-22.2zm223.3-123c-34.3 15.9-76.5 31.9-117 31.9C296 98.8 251.7 64 184.3 64c-25 0-47.3 4.4-68 12 2.8-7.3 4.1-15.2 3.6-23.6C118.1 24 94.8 1.2 66.3 0 34.3-1.3 8 24.3 8 56c0 19 9.5 35.8 24 45.9V488c0 13.3 10.7 24 24 24h16c13.3 0 24-10.7 24-24v-94.4c28.3-12.1 63.6-22.1 114.4-22.1 53.6 0 97.8 34.8 165.2 34.8 48.2 0 86.7-16.3 122.5-40.9 8.7-6 13.8-15.8 13.8-26.4V95.9c.1-23.3-24.2-38.8-45.4-29zM169.6 325.5c-25.8 2.7-50 8.2-73.6 16.6v-70.5c26.2-9.3 47.5-15 73.6-17.4zM464 191c-23.6 9.8-46.3 19.5-73.6 23.9V286c24.8-3.4 51.4-11.8 73.6-26v70.5c-25.1 16.1-48.5 24.7-73.6 27.1V286c-27 3.7-47.9 1.5-73.6-5.6v67.4c-23.9-7.4-47.3-16.7-73.6-21.3V258c-19.7-4.4-40.8-6.8-73.6-3.8v-70c-22.4 3.1-44.6 10.2-73.6 20.9v-70.5c33.2-12.2 50.1-19.8 73.6-22v71.6c27-3.7 48.4-1.3 73.6 5.7v-67.4c23.7 7.4 47.2 16.7 73.6 21.3v68.4c23.7 5.3 47.6 6.9 73.6 2.7V143c27-4.8 52.3-13.6 73.6-22.5z\"]\n};\nvar faFlagUsa = {\n prefix: 'fas',\n iconName: 'flag-usa',\n icon: [512, 512, [], \"f74d\", \"M32 0C14.3 0 0 14.3 0 32v464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V32C64 14.3 49.7 0 32 0zm267.9 303.6c-57.2-15.1-111.7-28.8-203.9 11.1V384c185.7-92.2 221.7 53.3 397.5-23.1 11.4-5 18.5-16.5 18.5-28.8v-36c-43.6 17.3-80.2 24.1-112.1 24.1-37.4-.1-68.9-8.4-100-16.6zm0-96c-57.2-15.1-111.7-28.8-203.9 11.1v61.5c94.8-37.6 154.6-22.7 212.1-7.6 57.2 15.1 111.7 28.8 203.9-11.1V200c-43.6 17.3-80.2 24.1-112.1 24.1-37.4 0-68.9-8.3-100-16.5zm9.5-125.9c51.8 15.6 97.4 29 202.6-20.1V30.8c0-25.1-26.8-38.1-49.4-26.6C291.3 91.5 305.4-62.2 96 32.4v151.9c94.8-37.5 154.6-22.7 212.1-7.6 57.2 15 111.7 28.7 203.9-11.1V96.7c-53.6 23.5-93.3 31.4-126.1 31.4s-59-7.8-85.7-15.9c-4-1.2-8.1-2.4-12.1-3.5V75.5c7.2 2 14.3 4.1 21.3 6.2zM160 128.1c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16-7.2 16-16 16zm0-55.8c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16c0 8.8-7.2 16-16 16zm64 47.9c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16c0 8.8-7.2 16-16 16zm0-55.9c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16c0 8.8-7.2 16-16 16z\"]\n};\nvar faFlask = {\n prefix: 'fas',\n iconName: 'flask',\n icon: [448, 512, [], \"f0c3\", \"M437.2 403.5L320 215V64h8c13.3 0 24-10.7 24-24V24c0-13.3-10.7-24-24-24H120c-13.3 0-24 10.7-24 24v16c0 13.3 10.7 24 24 24h8v151L10.8 403.5C-18.5 450.6 15.3 512 70.9 512h306.2c55.7 0 89.4-61.5 60.1-108.5zM137.9 320l48.2-77.6c3.7-5.2 5.8-11.6 5.8-18.4V64h64v160c0 6.9 2.2 13.2 5.8 18.4l48.2 77.6h-172z\"]\n};\nvar faFlushed = {\n prefix: 'fas',\n iconName: 'flushed',\n icon: [496, 512, [], \"f579\", \"M344 200c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-192 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM80 224c0-39.8 32.2-72 72-72s72 32.2 72 72-32.2 72-72 72-72-32.2-72-72zm232 176H184c-21.2 0-21.2-32 0-32h128c21.2 0 21.2 32 0 32zm32-104c-39.8 0-72-32.2-72-72s32.2-72 72-72 72 32.2 72 72-32.2 72-72 72z\"]\n};\nvar faFolder = {\n prefix: 'fas',\n iconName: 'folder',\n icon: [512, 512, [], \"f07b\", \"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48z\"]\n};\nvar faFolderMinus = {\n prefix: 'fas',\n iconName: 'folder-minus',\n icon: [512, 512, [], \"f65d\", \"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm-96 168c0 8.84-7.16 16-16 16H160c-8.84 0-16-7.16-16-16v-16c0-8.84 7.16-16 16-16h192c8.84 0 16 7.16 16 16v16z\"]\n};\nvar faFolderOpen = {\n prefix: 'fas',\n iconName: 'folder-open',\n icon: [576, 512, [], \"f07c\", \"M572.694 292.093L500.27 416.248A63.997 63.997 0 0 1 444.989 448H45.025c-18.523 0-30.064-20.093-20.731-36.093l72.424-124.155A64 64 0 0 1 152 256h399.964c18.523 0 30.064 20.093 20.73 36.093zM152 224h328v-48c0-26.51-21.49-48-48-48H272l-64-64H48C21.49 64 0 85.49 0 112v278.046l69.077-118.418C86.214 242.25 117.989 224 152 224z\"]\n};\nvar faFolderPlus = {\n prefix: 'fas',\n iconName: 'folder-plus',\n icon: [512, 512, [], \"f65e\", \"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm-96 168c0 8.84-7.16 16-16 16h-72v72c0 8.84-7.16 16-16 16h-16c-8.84 0-16-7.16-16-16v-72h-72c-8.84 0-16-7.16-16-16v-16c0-8.84 7.16-16 16-16h72v-72c0-8.84 7.16-16 16-16h16c8.84 0 16 7.16 16 16v72h72c8.84 0 16 7.16 16 16v16z\"]\n};\nvar faFont = {\n prefix: 'fas',\n iconName: 'font',\n icon: [448, 512, [], \"f031\", \"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z\"]\n};\nvar faFontAwesomeLogoFull = {\n prefix: 'fas',\n iconName: 'font-awesome-logo-full',\n icon: [3992, 512, [\"Font Awesome\"], \"f4e6\", \"M454.6 0H57.4C25.9 0 0 25.9 0 57.4v397.3C0 486.1 25.9 512 57.4 512h397.3c31.4 0 57.4-25.9 57.4-57.4V57.4C512 25.9 486.1 0 454.6 0zm-58.9 324.9c0 4.8-4.1 6.9-8.9 8.9-19.2 8.1-39.7 15.7-61.5 15.7-40.5 0-68.7-44.8-163.2 2.5v51.8c0 30.3-45.7 30.2-45.7 0v-250c-9-7-15-17.9-15-30.3 0-21 17.1-38.2 38.2-38.2 21 0 38.2 17.1 38.2 38.2 0 12.2-5.8 23.2-14.9 30.2v21c37.1-12 65.5-34.4 146.1-3.4 26.6 11.4 68.7-15.7 76.5-15.7 5.5 0 10.3 4.1 10.3 8.9v160.4zm432.9-174.2h-137v70.1H825c39.8 0 40.4 62.2 0 62.2H691.6v105.6c0 45.5-70.7 46.4-70.7 0V128.3c0-22 18-39.8 39.8-39.8h167.8c39.6 0 40.5 62.2.1 62.2zm191.1 23.4c-169.3 0-169.1 252.4 0 252.4 169.9 0 169.9-252.4 0-252.4zm0 196.1c-81.6 0-82.1-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm372.4 53.4c-17.5 0-31.4-13.9-31.4-31.4v-117c0-62.4-72.6-52.5-99.1-16.4v133.4c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c43.3-51.6 162.4-60.4 162.4 39.3v141.5c.3 30.4-31.5 31.4-31.7 31.4zm179.7 2.9c-44.3 0-68.3-22.9-68.3-65.8V235.2H1488c-35.6 0-36.7-55.3 0-55.3h15.5v-37.3c0-41.3 63.8-42.1 63.8 0v37.5h24.9c35.4 0 35.7 55.3 0 55.3h-24.9v108.5c0 29.6 26.1 26.3 27.4 26.3 31.4 0 52.6 56.3-22.9 56.3zM1992 123c-19.5-50.2-95.5-50-114.5 0-107.3 275.7-99.5 252.7-99.5 262.8 0 42.8 58.3 51.2 72.1 14.4l13.5-35.9H2006l13 35.9c14.2 37.7 72.1 27.2 72.1-14.4 0-10.1 5.3 6.8-99.1-262.8zm-108.9 179.1l51.7-142.9 51.8 142.9h-103.5zm591.3-85.6l-53.7 176.3c-12.4 41.2-72 41-84 0l-42.3-135.9-42.3 135.9c-12.4 40.9-72 41.2-84.5 0l-54.2-176.3c-12.5-39.4 49.8-56.1 60.2-16.9L2213 342l45.3-139.5c10.9-32.7 59.6-34.7 71.2 0l45.3 139.5 39.3-142.4c10.3-38.3 72.6-23.8 60.3 16.9zm275.4 75.1c0-42.4-33.9-117.5-119.5-117.5-73.2 0-124.4 56.3-124.4 126 0 77.2 55.3 126.4 128.5 126.4 31.7 0 93-11.5 93-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-109 8.4-115.9-43.8h148.3c16.3 0 29.3-13.4 29.3-28.9zM2571 277.7c9.5-73.4 113.9-68.6 118.6 0H2571zm316.7 148.8c-31.4 0-81.6-10.5-96.6-31.9-12.4-17 2.5-39.8 21.8-39.8 16.3 0 36.8 22.9 77.7 22.9 27.4 0 40.4-11 40.4-25.8 0-39.8-142.9-7.4-142.9-102 0-40.4 35.3-75.7 98.6-75.7 31.4 0 74.1 9.9 87.6 29.4 10.8 14.8-1.4 36.2-20.9 36.2-15.1 0-26.7-17.3-66.2-17.3-22.9 0-37.8 10.5-37.8 23.8 0 35.9 142.4 6 142.4 103.1-.1 43.7-37.4 77.1-104.1 77.1zm266.8-252.4c-169.3 0-169.1 252.4 0 252.4 170.1 0 169.6-252.4 0-252.4zm0 196.1c-81.8 0-82-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm476.9 22V268.7c0-53.8-61.4-45.8-85.7-10.5v134c0 41.3-63.8 42.1-63.8 0V268.7c0-52.1-59.5-47.4-85.7-10.1v133.6c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c9.9-14.4 41.8-37.3 78.6-37.3 35.3 0 57.7 16.4 66.7 43.8 13.9-21.8 45.8-43.8 82.6-43.8 44.3 0 70.7 23.4 70.7 72.7v145.3c.5 17.3-13.5 31.4-31.9 31.4 3.5.1-31.3 1.1-31.3-31.3zM3992 291.6c0-42.4-32.4-117.5-117.9-117.5-73.2 0-127.5 56.3-127.5 126 0 77.2 58.3 126.4 131.6 126.4 31.7 0 91.5-11.5 91.5-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-110.5 8.4-117.5-43.8h149.8c16.3 0 29.1-13.4 29.3-28.9zm-180.5-13.9c9.7-74.4 115.9-68.3 120.1 0h-120.1z\"]\n};\nvar faFootballBall = {\n prefix: 'fas',\n iconName: 'football-ball',\n icon: [496, 512, [], \"f44e\", \"M481.5 60.3c-4.8-18.2-19.1-32.5-37.3-37.4C420.3 16.5 383 8.9 339.4 8L496 164.8c-.8-43.5-8.2-80.6-14.5-104.5zm-467 391.4c4.8 18.2 19.1 32.5 37.3 37.4 23.9 6.4 61.2 14 104.8 14.9L0 347.2c.8 43.5 8.2 80.6 14.5 104.5zM4.2 283.4L220.4 500c132.5-19.4 248.8-118.7 271.5-271.4L275.6 12C143.1 31.4 26.8 130.7 4.2 283.4zm317.3-123.6c3.1-3.1 8.2-3.1 11.3 0l11.3 11.3c3.1 3.1 3.1 8.2 0 11.3l-28.3 28.3 28.3 28.3c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-28.3-28.3-22.6 22.7 28.3 28.3c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0L248 278.6l-22.6 22.6 28.3 28.3c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-28.3-28.3-28.3 28.3c-3.1 3.1-8.2 3.1-11.3 0l-11.3-11.3c-3.1-3.1-3.1-8.2 0-11.3l28.3-28.3-28.3-28.2c-3.1-3.1-3.1-8.2 0-11.3l11.3-11.3c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3 22.6-22.6-28.3-28.3c-3.1-3.1-3.1-8.2 0-11.3l11.3-11.3c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3 22.6-22.6-28.3-28.3c-3.1-3.1-3.1-8.2 0-11.3l11.3-11.3c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3 28.3-28.5z\"]\n};\nvar faForward = {\n prefix: 'fas',\n iconName: 'forward',\n icon: [512, 512, [], \"f04e\", \"M500.5 231.4l-192-160C287.9 54.3 256 68.6 256 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2zm-256 0l-192-160C31.9 54.3 0 68.6 0 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2z\"]\n};\nvar faFrog = {\n prefix: 'fas',\n iconName: 'frog',\n icon: [576, 512, [], \"f52e\", \"M446.53 97.43C439.67 60.23 407.19 32 368 32c-39.23 0-71.72 28.29-78.54 65.54C126.75 112.96-.5 250.12 0 416.98.11 451.9 29.08 480 64 480h304c8.84 0 16-7.16 16-16 0-17.67-14.33-32-32-32h-79.49l35.8-48.33c24.14-36.23 10.35-88.28-33.71-106.6-23.89-9.93-51.55-4.65-72.24 10.88l-32.76 24.59c-7.06 5.31-17.09 3.91-22.41-3.19-5.3-7.08-3.88-17.11 3.19-22.41l34.78-26.09c36.84-27.66 88.28-27.62 125.13 0 10.87 8.15 45.87 39.06 40.8 93.21L469.62 480H560c8.84 0 16-7.16 16-16 0-17.67-14.33-32-32-32h-53.63l-98.52-104.68 154.44-86.65A58.16 58.16 0 0 0 576 189.94c0-21.4-11.72-40.95-30.48-51.23-40.56-22.22-98.99-41.28-98.99-41.28zM368 136c-13.26 0-24-10.75-24-24 0-13.26 10.74-24 24-24 13.25 0 24 10.74 24 24 0 13.25-10.75 24-24 24z\"]\n};\nvar faFrown = {\n prefix: 'fas',\n iconName: 'frown',\n icon: [496, 512, [], \"f119\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm170.2 218.2C315.8 367.4 282.9 352 248 352s-67.8 15.4-90.2 42.2c-13.5 16.3-38.1-4.2-24.6-20.5C161.7 339.6 203.6 320 248 320s86.3 19.6 114.7 53.8c13.6 16.2-11 36.7-24.5 20.4z\"]\n};\nvar faFrownOpen = {\n prefix: 'fas',\n iconName: 'frown-open',\n icon: [496, 512, [], \"f57a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM136 208c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm187.3 183.3c-31.2-9.6-59.4-15.3-75.3-15.3s-44.1 5.7-75.3 15.3c-11.5 3.5-22.5-6.3-20.5-18.1 7-40 60.1-61.2 95.8-61.2s88.8 21.3 95.8 61.2c2 11.9-9.1 21.6-20.5 18.1zM328 240c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faFunnelDollar = {\n prefix: 'fas',\n iconName: 'funnel-dollar',\n icon: [640, 512, [], \"f662\", \"M433.46 165.94l101.2-111.87C554.61 34.12 540.48 0 512.26 0H31.74C3.52 0-10.61 34.12 9.34 54.07L192 256v155.92c0 12.59 5.93 24.44 16 32l79.99 60c20.86 15.64 48.47 6.97 59.22-13.57C310.8 455.38 288 406.35 288 352c0-89.79 62.05-165.17 145.46-186.06zM480 192c-88.37 0-160 71.63-160 160s71.63 160 160 160 160-71.63 160-160-71.63-160-160-160zm16 239.88V448c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-16.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V256c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.04 44.44-42.67 45.07z\"]\n};\nvar faFutbol = {\n prefix: 'fas',\n iconName: 'futbol',\n icon: [512, 512, [], \"f1e3\", \"M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zm-48 0l-.003-.282-26.064 22.741-62.679-58.5 16.454-84.355 34.303 3.072c-24.889-34.216-60.004-60.089-100.709-73.141l13.651 31.939L256 139l-74.953-41.525 13.651-31.939c-40.631 13.028-75.78 38.87-100.709 73.141l34.565-3.073 16.192 84.355-62.678 58.5-26.064-22.741-.003.282c0 43.015 13.497 83.952 38.472 117.991l7.704-33.897 85.138 10.447 36.301 77.826-29.902 17.786c40.202 13.122 84.29 13.148 124.572 0l-29.902-17.786 36.301-77.826 85.138-10.447 7.704 33.897C442.503 339.952 456 299.015 456 256zm-248.102 69.571l-29.894-91.312L256 177.732l77.996 56.527-29.622 91.312h-96.476z\"]\n};\nvar faGamepad = {\n prefix: 'fas',\n iconName: 'gamepad',\n icon: [640, 512, [], \"f11b\", \"M480 96H160C71.6 96 0 167.6 0 256s71.6 160 160 160c44.8 0 85.2-18.4 114.2-48h91.5c29 29.6 69.5 48 114.2 48 88.4 0 160-71.6 160-160S568.4 96 480 96zM256 276c0 6.6-5.4 12-12 12h-52v52c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-52H76c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h52v-52c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h52c6.6 0 12 5.4 12 12v40zm184 68c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-80c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faGasPump = {\n prefix: 'fas',\n iconName: 'gas-pump',\n icon: [512, 512, [], \"f52f\", \"M336 448H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm157.2-340.7l-81-81c-6.2-6.2-16.4-6.2-22.6 0l-11.3 11.3c-6.2 6.2-6.2 16.4 0 22.6L416 97.9V160c0 28.1 20.9 51.3 48 55.2V376c0 13.2-10.8 24-24 24s-24-10.8-24-24v-32c0-48.6-39.4-88-88-88h-8V64c0-35.3-28.7-64-64-64H96C60.7 0 32 28.7 32 64v352h288V304h8c22.1 0 40 17.9 40 40v27.8c0 37.7 27 72 64.5 75.9 43 4.3 79.5-29.5 79.5-71.7V152.6c0-17-6.8-33.3-18.8-45.3zM256 192H96V64h160v128z\"]\n};\nvar faGavel = {\n prefix: 'fas',\n iconName: 'gavel',\n icon: [512, 512, [], \"f0e3\", \"M504.971 199.362l-22.627-22.627c-9.373-9.373-24.569-9.373-33.941 0l-5.657 5.657L329.608 69.255l5.657-5.657c9.373-9.373 9.373-24.569 0-33.941L312.638 7.029c-9.373-9.373-24.569-9.373-33.941 0L154.246 131.48c-9.373 9.373-9.373 24.569 0 33.941l22.627 22.627c9.373 9.373 24.569 9.373 33.941 0l5.657-5.657 39.598 39.598-81.04 81.04-5.657-5.657c-12.497-12.497-32.758-12.497-45.255 0L9.373 412.118c-12.497 12.497-12.497 32.758 0 45.255l45.255 45.255c12.497 12.497 32.758 12.497 45.255 0l114.745-114.745c12.497-12.497 12.497-32.758 0-45.255l-5.657-5.657 81.04-81.04 39.598 39.598-5.657 5.657c-9.373 9.373-9.373 24.569 0 33.941l22.627 22.627c9.373 9.373 24.569 9.373 33.941 0l124.451-124.451c9.372-9.372 9.372-24.568 0-33.941z\"]\n};\nvar faGem = {\n prefix: 'fas',\n iconName: 'gem',\n icon: [576, 512, [], \"f3a5\", \"M485.5 0L576 160H474.9L405.7 0h79.8zm-128 0l69.2 160H149.3L218.5 0h139zm-267 0h79.8l-69.2 160H0L90.5 0zM0 192h100.7l123 251.7c1.5 3.1-2.7 5.9-5 3.3L0 192zm148.2 0h279.6l-137 318.2c-1 2.4-4.5 2.4-5.5 0L148.2 192zm204.1 251.7l123-251.7H576L357.3 446.9c-2.3 2.7-6.5-.1-5-3.2z\"]\n};\nvar faGenderless = {\n prefix: 'fas',\n iconName: 'genderless',\n icon: [288, 512, [], \"f22d\", \"M144 176c44.1 0 80 35.9 80 80s-35.9 80-80 80-80-35.9-80-80 35.9-80 80-80m0-64C64.5 112 0 176.5 0 256s64.5 144 144 144 144-64.5 144-144-64.5-144-144-144z\"]\n};\nvar faGhost = {\n prefix: 'fas',\n iconName: 'ghost',\n icon: [384, 512, [], \"f6e2\", \"M186.1.09C81.01 3.24 0 94.92 0 200.05v263.92c0 14.26 17.23 21.39 27.31 11.31l24.92-18.53c6.66-4.95 16-3.99 21.51 2.21l42.95 48.35c6.25 6.25 16.38 6.25 22.63 0l40.72-45.85c6.37-7.17 17.56-7.17 23.92 0l40.72 45.85c6.25 6.25 16.38 6.25 22.63 0l42.95-48.35c5.51-6.2 14.85-7.17 21.51-2.21l24.92 18.53c10.08 10.08 27.31 2.94 27.31-11.31V192C384 84 294.83-3.17 186.1.09zM128 224c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm128 0c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faGift = {\n prefix: 'fas',\n iconName: 'gift',\n icon: [512, 512, [], \"f06b\", \"M32 448c0 17.7 14.3 32 32 32h160V320H32v128zm256 32h160c17.7 0 32-14.3 32-32V320H288v160zm192-320h-42.1c6.2-12.1 10.1-25.5 10.1-40 0-48.5-39.5-88-88-88-41.6 0-68.5 21.3-103 68.3-34.5-47-61.4-68.3-103-68.3-48.5 0-88 39.5-88 88 0 14.5 3.8 27.9 10.1 40H32c-17.7 0-32 14.3-32 32v80c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-80c0-17.7-14.3-32-32-32zm-326.1 0c-22.1 0-40-17.9-40-40s17.9-40 40-40c19.9 0 34.6 3.3 86.1 80h-86.1zm206.1 0h-86.1c51.4-76.5 65.7-80 86.1-80 22.1 0 40 17.9 40 40s-17.9 40-40 40z\"]\n};\nvar faGifts = {\n prefix: 'fas',\n iconName: 'gifts',\n icon: [640, 512, [], \"f79c\", \"M240.6 194.1c1.9-30.8 17.3-61.2 44-79.8C279.4 103.5 268.7 96 256 96h-29.4l30.7-22c7.2-5.1 8.9-15.1 3.7-22.3l-9.3-13c-5.1-7.2-15.1-8.9-22.3-3.7l-32 22.9 11.5-30.6c3.1-8.3-1.1-17.5-9.4-20.6l-15-5.6c-8.3-3.1-17.5 1.1-20.6 9.4l-19.9 53-19.9-53.1C121 2.1 111.8-2.1 103.5 1l-15 5.6C80.2 9.7 76 19 79.2 27.2l11.5 30.6L58.6 35c-7.2-5.1-17.2-3.5-22.3 3.7l-9.3 13c-5.1 7.2-3.5 17.2 3.7 22.3l30.7 22H32c-17.7 0-32 14.3-32 32v352c0 17.7 14.3 32 32 32h168.9c-5.5-9.5-8.9-20.3-8.9-32V256c0-29.9 20.8-55 48.6-61.9zM224 480c0 17.7 14.3 32 32 32h160V384H224v96zm224 32h160c17.7 0 32-14.3 32-32v-96H448v128zm160-288h-20.4c2.6-7.6 4.4-15.5 4.4-23.8 0-35.5-27-72.2-72.1-72.2-48.1 0-75.9 47.7-87.9 75.3-12.1-27.6-39.9-75.3-87.9-75.3-45.1 0-72.1 36.7-72.1 72.2 0 8.3 1.7 16.2 4.4 23.8H256c-17.7 0-32 14.3-32 32v96h192V224h15.3l.7-.2.7.2H448v128h192v-96c0-17.7-14.3-32-32-32zm-272 0c-2.7-1.4-5.1-3-7.2-4.8-7.3-6.4-8.8-13.8-8.8-19 0-9.7 6.4-24.2 24.1-24.2 18.7 0 35.6 27.4 44.5 48H336zm199.2-4.8c-2.1 1.8-4.5 3.4-7.2 4.8h-52.6c8.8-20.3 25.8-48 44.5-48 17.7 0 24.1 14.5 24.1 24.2 0 5.2-1.5 12.6-8.8 19z\"]\n};\nvar faGlassCheers = {\n prefix: 'fas',\n iconName: 'glass-cheers',\n icon: [640, 512, [], \"f79f\", \"M639.4 433.6c-8.4-20.4-31.8-30.1-52.2-21.6l-22.1 9.2-38.7-101.9c47.9-35 64.8-100.3 34.5-152.8L474.3 16c-8-13.9-25.1-19.7-40-13.6L320 49.8 205.7 2.4c-14.9-6.2-32-.3-40 13.6L79.1 166.5C48.9 219 65.7 284.3 113.6 319.2L74.9 421.1l-22.1-9.2c-20.4-8.5-43.7 1.2-52.2 21.6-1.7 4.1.2 8.8 4.3 10.5l162.3 67.4c4.1 1.7 8.7-.2 10.4-4.3 8.4-20.4-1.2-43.8-21.6-52.3l-22.1-9.2L173.3 342c4.4.5 8.8 1.3 13.1 1.3 51.7 0 99.4-33.1 113.4-85.3l20.2-75.4 20.2 75.4c14 52.2 61.7 85.3 113.4 85.3 4.3 0 8.7-.8 13.1-1.3L506 445.6l-22.1 9.2c-20.4 8.5-30.1 31.9-21.6 52.3 1.7 4.1 6.4 6 10.4 4.3L635.1 444c4-1.7 6-6.3 4.3-10.4zM275.9 162.1l-112.1-46.5 36.5-63.4 94.5 39.2-18.9 70.7zm88.2 0l-18.9-70.7 94.5-39.2 36.5 63.4-112.1 46.5z\"]\n};\nvar faGlassMartini = {\n prefix: 'fas',\n iconName: 'glass-martini',\n icon: [512, 512, [], \"f000\", \"M502.05 57.6C523.3 36.34 508.25 0 478.2 0H33.8C3.75 0-11.3 36.34 9.95 57.6L224 271.64V464h-56c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h240c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40h-56V271.64L502.05 57.6z\"]\n};\nvar faGlassMartiniAlt = {\n prefix: 'fas',\n iconName: 'glass-martini-alt',\n icon: [512, 512, [], \"f57b\", \"M502.05 57.6C523.3 36.34 508.25 0 478.2 0H33.8C3.75 0-11.3 36.34 9.95 57.6L224 271.64V464h-56c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h240c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40h-56V271.64L502.05 57.6zM443.77 48l-48 48H116.24l-48-48h375.53z\"]\n};\nvar faGlassWhiskey = {\n prefix: 'fas',\n iconName: 'glass-whiskey',\n icon: [512, 512, [], \"f7a0\", \"M480 32H32C12.5 32-2.4 49.2.3 68.5l56 356.5c4.5 31.5 31.5 54.9 63.4 54.9h273c31.8 0 58.9-23.4 63.4-54.9l55.6-356.5C514.4 49.2 499.5 32 480 32zm-37.4 64l-30 192h-313L69.4 96h373.2z\"]\n};\nvar faGlasses = {\n prefix: 'fas',\n iconName: 'glasses',\n icon: [576, 512, [], \"f530\", \"M574.1 280.37L528.75 98.66c-5.91-23.7-21.59-44.05-43-55.81-21.44-11.73-46.97-14.11-70.19-6.33l-15.25 5.08c-8.39 2.79-12.92 11.86-10.12 20.24l5.06 15.18c2.79 8.38 11.85 12.91 20.23 10.12l13.18-4.39c10.87-3.62 23-3.57 33.16 1.73 10.29 5.37 17.57 14.56 20.37 25.82l38.46 153.82c-22.19-6.81-49.79-12.46-81.2-12.46-34.77 0-73.98 7.02-114.85 26.74h-73.18c-40.87-19.74-80.08-26.75-114.86-26.75-31.42 0-59.02 5.65-81.21 12.46l38.46-153.83c2.79-11.25 10.09-20.45 20.38-25.81 10.16-5.3 22.28-5.35 33.15-1.73l13.17 4.39c8.38 2.79 17.44-1.74 20.23-10.12l5.06-15.18c2.8-8.38-1.73-17.45-10.12-20.24l-15.25-5.08c-23.22-7.78-48.75-5.41-70.19 6.33-21.41 11.77-37.09 32.11-43 55.8L1.9 280.37A64.218 64.218 0 0 0 0 295.86v70.25C0 429.01 51.58 480 115.2 480h37.12c60.28 0 110.37-45.94 114.88-105.37l2.93-38.63h35.75l2.93 38.63C313.31 434.06 363.4 480 423.68 480h37.12c63.62 0 115.2-50.99 115.2-113.88v-70.25c0-5.23-.64-10.43-1.9-15.5zm-370.72 89.42c-1.97 25.91-24.4 46.21-51.06 46.21H115.2C86.97 416 64 393.62 64 366.11v-37.54c18.12-6.49 43.42-12.92 72.58-12.92 23.86 0 47.26 4.33 69.93 12.92l-3.13 41.22zM512 366.12c0 27.51-22.97 49.88-51.2 49.88h-37.12c-26.67 0-49.1-20.3-51.06-46.21l-3.13-41.22c22.67-8.59 46.08-12.92 69.95-12.92 29.12 0 54.43 6.44 72.55 12.93v37.54z\"]\n};\nvar faGlobe = {\n prefix: 'fas',\n iconName: 'globe',\n icon: [496, 512, [], \"f0ac\", \"M336.5 160C322 70.7 287.8 8 248 8s-74 62.7-88.5 152h177zM152 256c0 22.2 1.2 43.5 3.3 64h185.3c2.1-20.5 3.3-41.8 3.3-64s-1.2-43.5-3.3-64H155.3c-2.1 20.5-3.3 41.8-3.3 64zm324.7-96c-28.6-67.9-86.5-120.4-158-141.6 24.4 33.8 41.2 84.7 50 141.6h108zM177.2 18.4C105.8 39.6 47.8 92.1 19.3 160h108c8.7-56.9 25.5-107.8 49.9-141.6zM487.4 192H372.7c2.1 21 3.3 42.5 3.3 64s-1.2 43-3.3 64h114.6c5.5-20.5 8.6-41.8 8.6-64s-3.1-43.5-8.5-64zM120 256c0-21.5 1.2-43 3.3-64H8.6C3.2 212.5 0 233.8 0 256s3.2 43.5 8.6 64h114.6c-2-21-3.2-42.5-3.2-64zm39.5 96c14.5 89.3 48.7 152 88.5 152s74-62.7 88.5-152h-177zm159.3 141.6c71.4-21.2 129.4-73.7 158-141.6h-108c-8.8 56.9-25.6 107.8-50 141.6zM19.3 352c28.6 67.9 86.5 120.4 158 141.6-24.4-33.8-41.2-84.7-50-141.6h-108z\"]\n};\nvar faGlobeAfrica = {\n prefix: 'fas',\n iconName: 'globe-africa',\n icon: [496, 512, [], \"f57c\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm160 215.5v6.93c0 5.87-3.32 11.24-8.57 13.86l-15.39 7.7a15.485 15.485 0 0 1-15.53-.97l-18.21-12.14a15.52 15.52 0 0 0-13.5-1.81l-2.65.88c-9.7 3.23-13.66 14.79-7.99 23.3l13.24 19.86c2.87 4.31 7.71 6.9 12.89 6.9h8.21c8.56 0 15.5 6.94 15.5 15.5v11.34c0 3.35-1.09 6.62-3.1 9.3l-18.74 24.98c-1.42 1.9-2.39 4.1-2.83 6.43l-4.3 22.83c-.62 3.29-2.29 6.29-4.76 8.56a159.608 159.608 0 0 0-25 29.16l-13.03 19.55a27.756 27.756 0 0 1-23.09 12.36c-10.51 0-20.12-5.94-24.82-15.34a78.902 78.902 0 0 1-8.33-35.29V367.5c0-8.56-6.94-15.5-15.5-15.5h-25.88c-14.49 0-28.38-5.76-38.63-16a54.659 54.659 0 0 1-16-38.63v-14.06c0-17.19 8.1-33.38 21.85-43.7l27.58-20.69a54.663 54.663 0 0 1 32.78-10.93h.89c8.48 0 16.85 1.97 24.43 5.77l14.72 7.36c3.68 1.84 7.93 2.14 11.83.84l47.31-15.77c6.33-2.11 10.6-8.03 10.6-14.7 0-8.56-6.94-15.5-15.5-15.5h-10.09c-4.11 0-8.05-1.63-10.96-4.54l-6.92-6.92a15.493 15.493 0 0 0-10.96-4.54H199.5c-8.56 0-15.5-6.94-15.5-15.5v-4.4c0-7.11 4.84-13.31 11.74-15.04l14.45-3.61c3.74-.94 7-3.23 9.14-6.44l8.08-12.11c2.87-4.31 7.71-6.9 12.89-6.9h24.21c8.56 0 15.5-6.94 15.5-15.5v-21.7C359.23 71.63 422.86 131.02 441.93 208H423.5c-8.56 0-15.5 6.94-15.5 15.5z\"]\n};\nvar faGlobeAmericas = {\n prefix: 'fas',\n iconName: 'globe-americas',\n icon: [496, 512, [], \"f57d\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm82.29 357.6c-3.9 3.88-7.99 7.95-11.31 11.28-2.99 3-5.1 6.7-6.17 10.71-1.51 5.66-2.73 11.38-4.77 16.87l-17.39 46.85c-13.76 3-28 4.69-42.65 4.69v-27.38c1.69-12.62-7.64-36.26-22.63-51.25-6-6-9.37-14.14-9.37-22.63v-32.01c0-11.64-6.27-22.34-16.46-27.97-14.37-7.95-34.81-19.06-48.81-26.11-11.48-5.78-22.1-13.14-31.65-21.75l-.8-.72a114.792 114.792 0 0 1-18.06-20.74c-9.38-13.77-24.66-36.42-34.59-51.14 20.47-45.5 57.36-82.04 103.2-101.89l24.01 12.01C203.48 89.74 216 82.01 216 70.11v-11.3c7.99-1.29 16.12-2.11 24.39-2.42l28.3 28.3c6.25 6.25 6.25 16.38 0 22.63L264 112l-10.34 10.34c-3.12 3.12-3.12 8.19 0 11.31l4.69 4.69c3.12 3.12 3.12 8.19 0 11.31l-8 8a8.008 8.008 0 0 1-5.66 2.34h-8.99c-2.08 0-4.08.81-5.58 2.27l-9.92 9.65a8.008 8.008 0 0 0-1.58 9.31l15.59 31.19c2.66 5.32-1.21 11.58-7.15 11.58h-5.64c-1.93 0-3.79-.7-5.24-1.96l-9.28-8.06a16.017 16.017 0 0 0-15.55-3.1l-31.17 10.39a11.95 11.95 0 0 0-8.17 11.34c0 4.53 2.56 8.66 6.61 10.69l11.08 5.54c9.41 4.71 19.79 7.16 30.31 7.16s22.59 27.29 32 32h66.75c8.49 0 16.62 3.37 22.63 9.37l13.69 13.69a30.503 30.503 0 0 1 8.93 21.57 46.536 46.536 0 0 1-13.72 32.98zM417 274.25c-5.79-1.45-10.84-5-14.15-9.97l-17.98-26.97a23.97 23.97 0 0 1 0-26.62l19.59-29.38c2.32-3.47 5.5-6.29 9.24-8.15l12.98-6.49C440.2 193.59 448 223.87 448 256c0 8.67-.74 17.16-1.82 25.54L417 274.25z\"]\n};\nvar faGlobeAsia = {\n prefix: 'fas',\n iconName: 'globe-asia',\n icon: [496, 512, [], \"f57e\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm-11.34 240.23c-2.89 4.82-8.1 7.77-13.72 7.77h-.31c-4.24 0-8.31 1.69-11.31 4.69l-5.66 5.66c-3.12 3.12-3.12 8.19 0 11.31l5.66 5.66c3 3 4.69 7.07 4.69 11.31V304c0 8.84-7.16 16-16 16h-6.11c-6.06 0-11.6-3.42-14.31-8.85l-22.62-45.23c-2.44-4.88-8.95-5.94-12.81-2.08l-19.47 19.46c-3 3-7.07 4.69-11.31 4.69H50.81C49.12 277.55 48 266.92 48 256c0-110.28 89.72-200 200-200 21.51 0 42.2 3.51 61.63 9.82l-50.16 38.53c-5.11 3.41-4.63 11.06.86 13.81l10.83 5.41c5.42 2.71 8.84 8.25 8.84 14.31V216c0 4.42-3.58 8-8 8h-3.06c-3.03 0-5.8-1.71-7.15-4.42-1.56-3.12-5.96-3.29-7.76-.3l-17.37 28.95zM408 358.43c0 4.24-1.69 8.31-4.69 11.31l-9.57 9.57c-3 3-7.07 4.69-11.31 4.69h-15.16c-4.24 0-8.31-1.69-11.31-4.69l-13.01-13.01a26.767 26.767 0 0 0-25.42-7.04l-21.27 5.32c-1.27.32-2.57.48-3.88.48h-10.34c-4.24 0-8.31-1.69-11.31-4.69l-11.91-11.91a8.008 8.008 0 0 1-2.34-5.66v-10.2c0-3.27 1.99-6.21 5.03-7.43l39.34-15.74c1.98-.79 3.86-1.82 5.59-3.05l23.71-16.89a7.978 7.978 0 0 1 4.64-1.48h12.09c3.23 0 6.15 1.94 7.39 4.93l5.35 12.85a4 4 0 0 0 3.69 2.46h3.8c1.78 0 3.35-1.18 3.84-2.88l4.2-14.47c.5-1.71 2.06-2.88 3.84-2.88h6.06c2.21 0 4 1.79 4 4v12.93c0 2.12.84 4.16 2.34 5.66l11.91 11.91c3 3 4.69 7.07 4.69 11.31v24.6z\"]\n};\nvar faGlobeEurope = {\n prefix: 'fas',\n iconName: 'globe-europe',\n icon: [496, 512, [], \"f7a2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm200 248c0 22.5-3.9 44.2-10.8 64.4h-20.3c-4.3 0-8.4-1.7-11.4-4.8l-32-32.6c-4.5-4.6-4.5-12.1.1-16.7l12.5-12.5v-8.7c0-3-1.2-5.9-3.3-8l-9.4-9.4c-2.1-2.1-5-3.3-8-3.3h-16c-6.2 0-11.3-5.1-11.3-11.3 0-3 1.2-5.9 3.3-8l9.4-9.4c2.1-2.1 5-3.3 8-3.3h32c6.2 0 11.3-5.1 11.3-11.3v-9.4c0-6.2-5.1-11.3-11.3-11.3h-36.7c-8.8 0-16 7.2-16 16v4.5c0 6.9-4.4 13-10.9 15.2l-31.6 10.5c-3.3 1.1-5.5 4.1-5.5 7.6v2.2c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8s-3.6-8-8-8H247c-3 0-5.8 1.7-7.2 4.4l-9.4 18.7c-2.7 5.4-8.2 8.8-14.3 8.8H194c-8.8 0-16-7.2-16-16V199c0-4.2 1.7-8.3 4.7-11.3l20.1-20.1c4.6-4.6 7.2-10.9 7.2-17.5 0-3.4 2.2-6.5 5.5-7.6l40-13.3c1.7-.6 3.2-1.5 4.4-2.7l26.8-26.8c2.1-2.1 3.3-5 3.3-8 0-6.2-5.1-11.3-11.3-11.3H258l-16 16v8c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8v-20c0-2.5 1.2-4.9 3.2-6.4l28.9-21.7c1.9-.1 3.8-.3 5.7-.3C358.3 56 448 145.7 448 256zM130.1 149.1c0-3 1.2-5.9 3.3-8l25.4-25.4c2.1-2.1 5-3.3 8-3.3 6.2 0 11.3 5.1 11.3 11.3v16c0 3-1.2 5.9-3.3 8l-9.4 9.4c-2.1 2.1-5 3.3-8 3.3h-16c-6.2 0-11.3-5.1-11.3-11.3zm128 306.4v-7.1c0-8.8-7.2-16-16-16h-20.2c-10.8 0-26.7-5.3-35.4-11.8l-22.2-16.7c-11.5-8.6-18.2-22.1-18.2-36.4v-23.9c0-16 8.4-30.8 22.1-39l42.9-25.7c7.1-4.2 15.2-6.5 23.4-6.5h31.2c10.9 0 21.4 3.9 29.6 10.9l43.2 37.1h18.3c8.5 0 16.6 3.4 22.6 9.4l17.3 17.3c3.4 3.4 8.1 5.3 12.9 5.3H423c-32.4 58.9-93.8 99.5-164.9 103.1z\"]\n};\nvar faGolfBall = {\n prefix: 'fas',\n iconName: 'golf-ball',\n icon: [416, 512, [], \"f450\", \"M96 416h224c0 17.7-14.3 32-32 32h-16c-17.7 0-32 14.3-32 32v20c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-20c0-17.7-14.3-32-32-32h-16c-17.7 0-32-14.3-32-32zm320-208c0 74.2-39 139.2-97.5 176h-221C39 347.2 0 282.2 0 208 0 93.1 93.1 0 208 0s208 93.1 208 208zm-180.1 43.9c18.3 0 33.1-14.8 33.1-33.1 0-14.4-9.3-26.3-22.1-30.9 9.6 26.8-15.6 51.3-41.9 41.9 4.6 12.8 16.5 22.1 30.9 22.1zm49.1 46.9c0-14.4-9.3-26.3-22.1-30.9 9.6 26.8-15.6 51.3-41.9 41.9 4.6 12.8 16.5 22.1 30.9 22.1 18.3 0 33.1-14.9 33.1-33.1zm64-64c0-14.4-9.3-26.3-22.1-30.9 9.6 26.8-15.6 51.3-41.9 41.9 4.6 12.8 16.5 22.1 30.9 22.1 18.3 0 33.1-14.9 33.1-33.1z\"]\n};\nvar faGopuram = {\n prefix: 'fas',\n iconName: 'gopuram',\n icon: [512, 512, [], \"f664\", \"M496 352h-16V240c0-8.8-7.2-16-16-16h-16v-80c0-8.8-7.2-16-16-16h-16V16c0-8.8-7.2-16-16-16s-16 7.2-16 16v16h-64V16c0-8.8-7.2-16-16-16s-16 7.2-16 16v16h-64V16c0-8.8-7.2-16-16-16s-16 7.2-16 16v16h-64V16c0-8.8-7.2-16-16-16S96 7.2 96 16v112H80c-8.8 0-16 7.2-16 16v80H48c-8.8 0-16 7.2-16 16v112H16c-8.8 0-16 7.2-16 16v128c0 8.8 7.2 16 16 16h80V352h32V224h32v-96h32v96h-32v128h-32v160h80v-80c0-8.8 7.2-16 16-16h64c8.8 0 16 7.2 16 16v80h80V352h-32V224h-32v-96h32v96h32v128h32v160h80c8.8 0 16-7.2 16-16V368c0-8.8-7.2-16-16-16zM232 176c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v48h-48zm56 176h-64v-64c0-8.8 7.2-16 16-16h32c8.8 0 16 7.2 16 16z\"]\n};\nvar faGraduationCap = {\n prefix: 'fas',\n iconName: 'graduation-cap',\n icon: [640, 512, [], \"f19d\", \"M622.34 153.2L343.4 67.5c-15.2-4.67-31.6-4.67-46.79 0L17.66 153.2c-23.54 7.23-23.54 38.36 0 45.59l48.63 14.94c-10.67 13.19-17.23 29.28-17.88 46.9C38.78 266.15 32 276.11 32 288c0 10.78 5.68 19.85 13.86 25.65L20.33 428.53C18.11 438.52 25.71 448 35.94 448h56.11c10.24 0 17.84-9.48 15.62-19.47L82.14 313.65C90.32 307.85 96 298.78 96 288c0-11.57-6.47-21.25-15.66-26.87.76-15.02 8.44-28.3 20.69-36.72L296.6 284.5c9.06 2.78 26.44 6.25 46.79 0l278.95-85.7c23.55-7.24 23.55-38.36 0-45.6zM352.79 315.09c-28.53 8.76-52.84 3.92-65.59 0l-145.02-44.55L128 384c0 35.35 85.96 64 192 64s192-28.65 192-64l-14.18-113.47-145.03 44.56z\"]\n};\nvar faGreaterThan = {\n prefix: 'fas',\n iconName: 'greater-than',\n icon: [384, 512, [], \"f531\", \"M365.52 209.85L59.22 67.01c-16.06-7.49-35.15-.54-42.64 15.52L3.01 111.61c-7.49 16.06-.54 35.15 15.52 42.64L236.96 256.1 18.49 357.99C2.47 365.46-4.46 384.5 3.01 400.52l13.52 29C24 445.54 43.04 452.47 59.06 445l306.47-142.91a32.003 32.003 0 0 0 18.48-29v-34.23c-.01-12.45-7.21-23.76-18.49-29.01z\"]\n};\nvar faGreaterThanEqual = {\n prefix: 'fas',\n iconName: 'greater-than-equal',\n icon: [448, 512, [], \"f532\", \"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"]\n};\nvar faGrimace = {\n prefix: 'fas',\n iconName: 'grimace',\n icon: [496, 512, [], \"f57f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM144 400h-8c-17.7 0-32-14.3-32-32v-8h40v40zm0-56h-40v-8c0-17.7 14.3-32 32-32h8v40zm-8-136c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm72 192h-48v-40h48v40zm0-56h-48v-40h48v40zm64 56h-48v-40h48v40zm0-56h-48v-40h48v40zm64 56h-48v-40h48v40zm0-56h-48v-40h48v40zm-8-104c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm64 128c0 17.7-14.3 32-32 32h-8v-40h40v8zm0-24h-40v-40h8c17.7 0 32 14.3 32 32v8z\"]\n};\nvar faGrin = {\n prefix: 'fas',\n iconName: 'grin',\n icon: [496, 512, [], \"f580\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm80 256c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.3-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinAlt = {\n prefix: 'fas',\n iconName: 'grin-alt',\n icon: [496, 512, [], \"f581\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm63.7 128.7c7.6-11.4 24.7-11.7 32.7 0 12.4 18.4 15.1 36.9 15.7 55.3-.5 18.4-3.3 36.9-15.7 55.3-7.6 11.4-24.7 11.7-32.7 0-12.4-18.4-15.1-36.9-15.7-55.3.5-18.4 3.3-36.9 15.7-55.3zm-160 0c7.6-11.4 24.7-11.7 32.7 0 12.4 18.4 15.1 36.9 15.7 55.3-.5 18.4-3.3 36.9-15.7 55.3-7.6 11.4-24.7 11.7-32.7 0-12.4-18.4-15.1-36.9-15.7-55.3.5-18.4 3.3-36.9 15.7-55.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinBeam = {\n prefix: 'fas',\n iconName: 'grin-beam',\n icon: [496, 512, [], \"f582\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 144c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.3-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm-160 0c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm80 280c-60.6 0-134.5-38.3-143.8-93.3-2-11.9 9.4-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinBeamSweat = {\n prefix: 'fas',\n iconName: 'grin-beam-sweat',\n icon: [504, 512, [], \"f583\", \"M456 128c26.5 0 48-21 48-47 0-20-28.5-60.4-41.6-77.8-3.2-4.3-9.6-4.3-12.8 0C436.5 20.6 408 61 408 81c0 26 21.5 47 48 47zm0 32c-44.1 0-80-35.4-80-79 0-4.4.3-14.2 8.1-32.2C345 23.1 298.3 8 248 8 111 8 0 119 0 256s111 248 248 248 248-111 248-248c0-35.1-7.4-68.4-20.5-98.6-6.3 1.5-12.7 2.6-19.5 2.6zm-128-8c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm-160 0c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm80 280c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.2 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinHearts = {\n prefix: 'fas',\n iconName: 'grin-hearts',\n icon: [496, 512, [], \"f584\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM90.4 183.6c6.7-17.6 26.7-26.7 44.9-21.9l7.1 1.9 2-7.1c5-18.1 22.8-30.9 41.5-27.9 21.4 3.4 34.4 24.2 28.8 44.5L195.3 243c-1.2 4.5-5.9 7.2-10.5 6l-70.2-18.2c-20.4-5.4-31.9-27-24.2-47.2zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.2-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.6 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3zm133.4-201.3l-70.2 18.2c-4.5 1.2-9.2-1.5-10.5-6L281.3 173c-5.6-20.3 7.4-41.1 28.8-44.5 18.6-3 36.4 9.8 41.5 27.9l2 7.1 7.1-1.9c18.2-4.7 38.2 4.3 44.9 21.9 7.7 20.3-3.8 41.9-24.2 47.2z\"]\n};\nvar faGrinSquint = {\n prefix: 'fas',\n iconName: 'grin-squint',\n icon: [496, 512, [], \"f585\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm33.8 189.7l80-48c11.6-6.9 24 7.7 15.4 18L343.6 208l33.6 40.3c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.7-4.7-7.7-15.9 0-20.6zm-163-30c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.8 4.7 7.8 15.9 0 20.6l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.9 9.4-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.2 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinSquintTears = {\n prefix: 'fas',\n iconName: 'grin-squint-tears',\n icon: [512, 512, [], \"f586\", \"M409.6 111.9c22.6-3.2 73.5-12 88.3-26.8 19.2-19.2 18.9-50.6-.7-70.2S446-5 426.9 14.2c-14.8 14.8-23.5 65.7-26.8 88.3-.8 5.5 3.9 10.2 9.5 9.4zM102.4 400.1c-22.6 3.2-73.5 12-88.3 26.8-19.1 19.1-18.8 50.6.8 70.2s51 19.9 70.2.7c14.8-14.8 23.5-65.7 26.8-88.3.8-5.5-3.9-10.2-9.5-9.4zm311.7-256.5c-33 3.9-48.6-25.1-45.7-45.7 3.4-24 7.4-42.1 11.5-56.5C285.1-13.4 161.8-.5 80.6 80.6-.5 161.7-13.4 285 41.4 379.9c14.4-4.1 32.4-8 56.5-11.5 33.2-3.9 48.6 25.2 45.7 45.7-3.4 24-7.4 42.1-11.5 56.5 94.8 54.8 218.1 41.9 299.3-39.2s94-204.4 39.2-299.3c-14.4 4.1-32.5 8-56.5 11.5zM255.7 106c3.3-13.2 22.4-11.5 23.6 1.8l4.8 52.3 52.3 4.8c13.4 1.2 14.9 20.3 1.8 23.6l-90.5 22.6c-8.9 2.2-16.7-5.9-14.5-14.5l22.5-90.6zm-90.9 230.3L160 284l-52.3-4.8c-13.4-1.2-14.9-20.3-1.8-23.6l90.5-22.6c8.8-2.2 16.7 5.8 14.5 14.5L188.3 338c-3.1 13.2-22.2 11.7-23.5-1.7zm215.7 44.2c-29.3 29.3-75.7 50.4-116.7 50.4-18.9 0-36.6-4.5-51-14.7-9.8-6.9-8.7-21.8 2-27.2 28.3-14.6 63.9-42.4 97.8-76.3s61.7-69.6 76.3-97.8c5.4-10.5 20.2-11.9 27.3-2 32.3 45.3 7.1 124.7-35.7 167.6z\"]\n};\nvar faGrinStars = {\n prefix: 'fas',\n iconName: 'grin-stars',\n icon: [496, 512, [], \"f587\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM94.6 168.9l34.9-5 15.5-31.6c2.9-5.8 11-5.8 13.9 0l15.5 31.6 34.9 5c6.2 1 8.9 8.6 4.3 13.2l-25.4 24.6 6 34.9c1 6.2-5.3 11-11 7.9L152 233.3l-31.3 16.3c-5.7 3.1-12-1.7-11-7.9l6-34.9-25.4-24.6c-4.6-4.7-1.9-12.3 4.3-13.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3zm157.7-249.9l-25.4 24.6 6 34.9c1 6.2-5.3 11-11 7.9L344 233.3l-31.3 16.3c-5.7 3.1-12-1.7-11-7.9l6-34.9-25.4-24.6c-4.5-4.6-1.9-12.2 4.3-13.2l34.9-5 15.5-31.6c2.9-5.8 11-5.8 13.9 0l15.5 31.6 34.9 5c6.3.9 9 8.5 4.4 13.1z\"]\n};\nvar faGrinTears = {\n prefix: 'fas',\n iconName: 'grin-tears',\n icon: [640, 512, [], \"f588\", \"M102.4 256.1c-22.6 3.2-73.5 12-88.3 26.8-19.1 19.1-18.8 50.6.8 70.2s51 19.9 70.2.7c14.8-14.8 23.5-65.7 26.8-88.3.8-5.5-3.9-10.2-9.5-9.4zm523.4 26.8c-14.8-14.8-65.7-23.5-88.3-26.8-5.5-.8-10.3 3.9-9.5 9.5 3.2 22.6 12 73.5 26.8 88.3 19.2 19.2 50.6 18.9 70.2-.7s20-51.2.8-70.3zm-129.4-12.8c-3.8-26.6 19.1-49.5 45.7-45.7 8.9 1.3 16.8 2.7 24.3 4.1C552.7 104.5 447.7 8 320 8S87.3 104.5 73.6 228.5c7.5-1.4 15.4-2.8 24.3-4.1 33.2-3.9 48.6 25.3 45.7 45.7-11.8 82.3-29.9 100.4-35.8 106.4-.9.9-2 1.6-3 2.5 42.7 74.6 123 125 215.2 125s172.5-50.4 215.2-125.1c-1-.9-2.1-1.5-3-2.5-5.9-5.9-24-24-35.8-106.3zM400 152c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm-160 0c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm80 280c-60.6 0-134.5-38.3-143.8-93.3-2-11.7 9.2-21.6 20.7-17.9C227.1 330.5 272 336 320 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinTongue = {\n prefix: 'fas',\n iconName: 'grin-tongue',\n icon: [496, 512, [], \"f589\", \"M248 8C111 8 0 119 0 256c0 106.3 67 196.7 161 232-5.6-12.2-9-25.7-9-40v-45.5c-24.7-16.2-43.5-38.1-47.8-63.8-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.6 22.6 6.1 20.7 17.9-4.3 25.7-23.1 47.6-47.8 63.8V448c0 14.3-3.4 27.8-9 40 94-35.3 161-125.7 161-232C496 119 385 8 248 8zm-80 232c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm-34.9 134.6c-14.4-6.5-31.1 2.2-34.6 17.6l-1.8 7.8c-2.1 9.2-15.2 9.2-17.3 0l-1.8-7.8c-3.5-15.4-20.2-24.1-34.6-17.6-.9.4.3-.2-18.9 9.4v63c0 35.2 28 64.5 63.1 64.9 35.7.5 64.9-28.4 64.9-64v-64c-19.5-9.6-18.2-8.9-19-9.3z\"]\n};\nvar faGrinTongueSquint = {\n prefix: 'fas',\n iconName: 'grin-tongue-squint',\n icon: [496, 512, [], \"f58a\", \"M293.1 374.6c-14.4-6.5-31.1 2.2-34.6 17.6l-1.8 7.8c-2.1 9.2-15.2 9.2-17.3 0l-1.8-7.8c-3.5-15.4-20.2-24.1-34.6-17.6-.9.4.3-.2-18.9 9.4v63c0 35.2 28 64.5 63.1 64.9 35.7.5 64.9-28.4 64.9-64v-64c-19.5-9.6-18.2-8.9-19-9.3zM248 8C111 8 0 119 0 256c0 106.3 67 196.7 161 232-5.6-12.2-9-25.7-9-40v-45.5c-24.7-16.2-43.5-38.1-47.8-63.8-2-11.8 9.2-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-4.3 25.7-23.1 47.6-47.8 63.8V448c0 14.3-3.4 27.8-9 40 94-35.3 161-125.7 161-232C496 119 385 8 248 8zm-33.8 210.3l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.7 4.7 7.7 15.9 0 20.6zm163 30c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.8-4.7-7.8-15.9 0-20.6l80-48c11.7-6.9 23.9 7.7 15.4 18L343.6 208l33.6 40.3z\"]\n};\nvar faGrinTongueWink = {\n prefix: 'fas',\n iconName: 'grin-tongue-wink',\n icon: [496, 512, [], \"f58b\", \"M344 184c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256c0 106.3 67 196.7 161 232-5.6-12.2-9-25.7-9-40v-45.5c-24.7-16.2-43.5-38.1-47.8-63.8-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.1 20.7 17.9-4.3 25.7-23.1 47.6-47.8 63.8V448c0 14.3-3.4 27.8-9 40 94-35.3 161-125.7 161-232C496 119 385 8 248 8zm-56 225l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L112 233c-8.5 7.4-21.6.3-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S208 197 212 222.2c1.6 11.1-11.6 18.2-20 10.8zm152 39c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm-50.9 102.6c-14.4-6.5-31.1 2.2-34.6 17.6l-1.8 7.8c-2.1 9.2-15.2 9.2-17.3 0l-1.8-7.8c-3.5-15.4-20.2-24.1-34.6-17.6-.9.4.3-.2-18.9 9.4v63c0 35.2 28 64.5 63.1 64.9 35.7.5 64.9-28.4 64.9-64v-64c-19.5-9.6-18.2-8.9-19-9.3z\"]\n};\nvar faGrinWink = {\n prefix: 'fas',\n iconName: 'grin-wink',\n icon: [496, 512, [], \"f58c\", \"M0 256c0 137 111 248 248 248s248-111 248-248S385 8 248 8 0 119 0 256zm200-48c0 17.7-14.3 32-32 32s-32-14.3-32-32 14.3-32 32-32 32 14.3 32 32zm168 25l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L288 233c-8.3 7.4-21.6.4-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S384 197 388 222.2c1.6 11-11.5 18.2-20 10.8zm-243.1 87.8C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.3-3.7 22.6 6 20.7 17.9-9.2 55-83.2 93.3-143.8 93.3s-134.5-38.3-143.8-93.3c-2-11.9 9.3-21.6 20.7-17.9z\"]\n};\nvar faGripHorizontal = {\n prefix: 'fas',\n iconName: 'grip-horizontal',\n icon: [448, 512, [], \"f58d\", \"M96 288H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zM96 96H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32z\"]\n};\nvar faGripLines = {\n prefix: 'fas',\n iconName: 'grip-lines',\n icon: [512, 512, [], \"f7a4\", \"M496 288H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-128H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faGripLinesVertical = {\n prefix: 'fas',\n iconName: 'grip-lines-vertical',\n icon: [256, 512, [], \"f7a5\", \"M96 496V16c0-8.8-7.2-16-16-16H48c-8.8 0-16 7.2-16 16v480c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16zm128 0V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v480c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16z\"]\n};\nvar faGripVertical = {\n prefix: 'fas',\n iconName: 'grip-vertical',\n icon: [320, 512, [], \"f58e\", \"M96 32H32C14.33 32 0 46.33 0 64v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zm0 160H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm0 160H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zM288 32h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zm0 160h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm0 160h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32z\"]\n};\nvar faGuitar = {\n prefix: 'fas',\n iconName: 'guitar',\n icon: [512, 512, [], \"f7a6\", \"M502.6 54.6L457.4 9.4c-12.5-12.5-32.8-12.5-45.3 0l-67.9 67.9c-12.5 12.5-12.5 32.8 0 45.3L290 176.7c-45.4-29-100.4-28.9-133.5 4.2-9.7 9.7-16.4 21.2-20.5 33.9-6.1 18.8-23.5 33.1-42.7 34.9-24 2.3-46.3 11.6-63.4 28.8C-16.3 324.6-8 407.6 48.2 463.8c56.2 56.2 139.2 64.4 185.3 18.3 17.2-17.1 26.5-39.4 28.8-63.5 1.8-19.1 16.1-36.6 34.9-42.7 12.7-4.1 24.2-10.8 33.9-20.5 33.1-33.1 33.1-88.1 4.2-133.5l54.2-54.2c12.5 12.5 32.8 12.5 45.3 0l67.9-67.9c12.4-12.4 12.4-32.7-.1-45.2zM208 352c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faHSquare = {\n prefix: 'fas',\n iconName: 'h-square',\n icon: [448, 512, [], \"f0fd\", \"M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zm-112 48h-32c-8.837 0-16 7.163-16 16v80H160v-80c0-8.837-7.163-16-16-16h-32c-8.837 0-16 7.163-16 16v224c0 8.837 7.163 16 16 16h32c8.837 0 16-7.163 16-16v-80h128v80c0 8.837 7.163 16 16 16h32c8.837 0 16-7.163 16-16V144c0-8.837-7.163-16-16-16z\"]\n};\nvar faHamburger = {\n prefix: 'fas',\n iconName: 'hamburger',\n icon: [512, 512, [], \"f805\", \"M464 256H48a48 48 0 0 0 0 96h416a48 48 0 0 0 0-96zm16 128H32a16 16 0 0 0-16 16v16a64 64 0 0 0 64 64h352a64 64 0 0 0 64-64v-16a16 16 0 0 0-16-16zM58.64 224h394.72c34.57 0 54.62-43.9 34.82-75.88C448 83.2 359.55 32.1 256 32c-103.54.1-192 51.2-232.18 116.11C4 180.09 24.07 224 58.64 224zM384 112a16 16 0 1 1-16 16 16 16 0 0 1 16-16zM256 80a16 16 0 1 1-16 16 16 16 0 0 1 16-16zm-128 32a16 16 0 1 1-16 16 16 16 0 0 1 16-16z\"]\n};\nvar faHammer = {\n prefix: 'fas',\n iconName: 'hammer',\n icon: [576, 512, [], \"f6e3\", \"M571.31 193.94l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31-28.9-28.9c5.63-21.31.36-44.9-16.35-61.61l-45.25-45.25c-62.48-62.48-163.79-62.48-226.28 0l90.51 45.25v18.75c0 16.97 6.74 33.25 18.75 45.25l49.14 49.14c16.71 16.71 40.3 21.98 61.61 16.35l28.9 28.9-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l90.51-90.51c6.23-6.24 6.23-16.37-.02-22.62zm-286.72-15.2c-3.7-3.7-6.84-7.79-9.85-11.95L19.64 404.96c-25.57 23.88-26.26 64.19-1.53 88.93s65.05 24.05 88.93-1.53l238.13-255.07c-3.96-2.91-7.9-5.87-11.44-9.41l-49.14-49.14z\"]\n};\nvar faHamsa = {\n prefix: 'fas',\n iconName: 'hamsa',\n icon: [512, 512, [], \"f665\", \"M509.34 307.25C504.28 295.56 492.75 288 480 288h-64V80c0-22-18-40-40-40s-40 18-40 40v134c0 5.52-4.48 10-10 10h-20c-5.52 0-10-4.48-10-10V40c0-22-18-40-40-40s-40 18-40 40v174c0 5.52-4.48 10-10 10h-20c-5.52 0-10-4.48-10-10V80c0-22-18-40-40-40S96 58 96 80v208H32c-12.75 0-24.28 7.56-29.34 19.25a31.966 31.966 0 0 0 5.94 34.58l102.69 110.03C146.97 490.08 199.69 512 256 512s109.03-21.92 144.72-60.14L503.4 341.83a31.966 31.966 0 0 0 5.94-34.58zM256 416c-53.02 0-96-64-96-64s42.98-64 96-64 96 64 96 64-42.98 64-96 64zm0-96c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar faHandHolding = {\n prefix: 'fas',\n iconName: 'hand-holding',\n icon: [576, 512, [], \"f4bd\", \"M565.3 328.1c-11.8-10.7-30.2-10-42.6 0L430.3 402c-11.3 9.1-25.4 14-40 14H272c-8.8 0-16-7.2-16-16s7.2-16 16-16h78.3c15.9 0 30.7-10.9 33.3-26.6 3.3-20-12.1-37.4-31.6-37.4H192c-27 0-53.1 9.3-74.1 26.3L71.4 384H16c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h356.8c14.5 0 28.6-4.9 40-14L564 377c15.2-12.1 16.4-35.3 1.3-48.9z\"]\n};\nvar faHandHoldingHeart = {\n prefix: 'fas',\n iconName: 'hand-holding-heart',\n icon: [576, 512, [], \"f4be\", \"M275.3 250.5c7 7.4 18.4 7.4 25.5 0l108.9-114.2c31.6-33.2 29.8-88.2-5.6-118.8-30.8-26.7-76.7-21.9-104.9 7.7L288 36.9l-11.1-11.6C248.7-4.4 202.8-9.2 172 17.5c-35.3 30.6-37.2 85.6-5.6 118.8l108.9 114.2zm290 77.6c-11.8-10.7-30.2-10-42.6 0L430.3 402c-11.3 9.1-25.4 14-40 14H272c-8.8 0-16-7.2-16-16s7.2-16 16-16h78.3c15.9 0 30.7-10.9 33.3-26.6 3.3-20-12.1-37.4-31.6-37.4H192c-27 0-53.1 9.3-74.1 26.3L71.4 384H16c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h356.8c14.5 0 28.6-4.9 40-14L564 377c15.2-12.1 16.4-35.3 1.3-48.9z\"]\n};\nvar faHandHoldingUsd = {\n prefix: 'fas',\n iconName: 'hand-holding-usd',\n icon: [544, 512, [], \"f4c0\", \"M257.6 144.3l50 14.3c3.6 1 6.1 4.4 6.1 8.1 0 4.6-3.8 8.4-8.4 8.4h-32.8c-3.6 0-7.1-.8-10.3-2.2-4.8-2.2-10.4-1.7-14.1 2l-17.5 17.5c-5.3 5.3-4.7 14.3 1.5 18.4 9.5 6.3 20.3 10.1 31.8 11.5V240c0 8.8 7.2 16 16 16h16c8.8 0 16-7.2 16-16v-17.6c30.3-3.6 53.3-31 49.3-63-2.9-23-20.7-41.3-42.9-47.7l-50-14.3c-3.6-1-6.1-4.4-6.1-8.1 0-4.6 3.8-8.4 8.4-8.4h32.8c3.6 0 7.1.8 10.3 2.2 4.8 2.2 10.4 1.7 14.1-2l17.5-17.5c5.3-5.3 4.7-14.3-1.5-18.4-9.5-6.3-20.3-10.1-31.8-11.5V16c0-8.8-7.2-16-16-16h-16c-8.8 0-16 7.2-16 16v17.6c-30.3 3.6-53.3 31-49.3 63 2.9 23 20.7 41.3 42.9 47.7zm276.3 183.8c-11.2-10.7-28.5-10-40.3 0L406.4 402c-10.7 9.1-24 14-37.8 14H256.9c-8.3 0-15.1-7.2-15.1-16s6.8-16 15.1-16h73.9c15.1 0 29-10.9 31.4-26.6 3.1-20-11.5-37.4-29.8-37.4H181.3c-25.5 0-50.2 9.3-69.9 26.3L67.5 384H15.1C6.8 384 0 391.2 0 400v96c0 8.8 6.8 16 15.1 16H352c13.7 0 27-4.9 37.8-14l142.8-121c14.4-12.1 15.5-35.3 1.3-48.9z\"]\n};\nvar faHandLizard = {\n prefix: 'fas',\n iconName: 'hand-lizard',\n icon: [576, 512, [], \"f258\", \"M384 480h192V363.778a95.998 95.998 0 0 0-14.833-51.263L398.127 54.368A48 48 0 0 0 357.544 32H24C10.745 32 0 42.745 0 56v16c0 30.928 25.072 56 56 56h229.981c12.844 0 21.556 13.067 16.615 24.923l-21.41 51.385A32 32 0 0 1 251.648 224H128c-35.346 0-64 28.654-64 64v8c0 13.255 10.745 24 24 24h147.406a47.995 47.995 0 0 1 25.692 7.455l111.748 70.811A24.001 24.001 0 0 1 384 418.539V480z\"]\n};\nvar faHandMiddleFinger = {\n prefix: 'fas',\n iconName: 'hand-middle-finger',\n icon: [512, 512, [], \"f806\", \"M479.93 317.12a37.33 37.33 0 0 0-28.28-36.19L416 272v-49.59c0-11.44-9.69-21.29-23.15-23.54l-38.4-6.4C336.63 189.5 320 200.86 320 216v32a8 8 0 0 1-16 0V50c0-26.28-20.25-49.2-46.52-50A48 48 0 0 0 208 48v200a8 8 0 0 1-16 0v-32c0-15.15-16.63-26.51-34.45-23.54l-30.68 5.12c-18 3-30.87 16.12-30.87 31.38V376a8 8 0 0 1-16 0v-76l-27.36 15A37.34 37.34 0 0 0 32 348.4v73.47a37.31 37.31 0 0 0 10.93 26.39l30.93 30.93A112 112 0 0 0 153.05 512h215A112 112 0 0 0 480 400z\"]\n};\nvar faHandPaper = {\n prefix: 'fas',\n iconName: 'hand-paper',\n icon: [448, 512, [], \"f256\", \"M408.781 128.007C386.356 127.578 368 146.36 368 168.79V256h-8V79.79c0-22.43-18.356-41.212-40.781-40.783C297.488 39.423 280 57.169 280 79v177h-8V40.79C272 18.36 253.644-.422 231.219.007 209.488.423 192 18.169 192 40v216h-8V80.79c0-22.43-18.356-41.212-40.781-40.783C121.488 40.423 104 58.169 104 80v235.992l-31.648-43.519c-12.993-17.866-38.009-21.817-55.877-8.823-17.865 12.994-21.815 38.01-8.822 55.877l125.601 172.705A48 48 0 0 0 172.073 512h197.59c22.274 0 41.622-15.324 46.724-37.006l26.508-112.66a192.011 192.011 0 0 0 5.104-43.975V168c.001-21.831-17.487-39.577-39.218-39.993z\"]\n};\nvar faHandPeace = {\n prefix: 'fas',\n iconName: 'hand-peace',\n icon: [448, 512, [], \"f25b\", \"M408 216c-22.092 0-40 17.909-40 40h-8v-32c0-22.091-17.908-40-40-40s-40 17.909-40 40v32h-8V48c0-26.51-21.49-48-48-48s-48 21.49-48 48v208h-13.572L92.688 78.449C82.994 53.774 55.134 41.63 30.461 51.324 5.787 61.017-6.356 88.877 3.337 113.551l74.765 190.342-31.09 24.872c-15.381 12.306-19.515 33.978-9.741 51.081l64 112A39.998 39.998 0 0 0 136 512h240c18.562 0 34.686-12.77 38.937-30.838l32-136A39.97 39.97 0 0 0 448 336v-80c0-22.091-17.908-40-40-40z\"]\n};\nvar faHandPointDown = {\n prefix: 'fas',\n iconName: 'hand-point-down',\n icon: [384, 512, [], \"f0a7\", \"M91.826 467.2V317.966c-8.248 5.841-16.558 10.57-24.918 14.153C35.098 345.752-.014 322.222 0 288c.008-18.616 10.897-32.203 29.092-40 28.286-12.122 64.329-78.648 77.323-107.534 7.956-17.857 25.479-28.453 43.845-28.464l.001-.002h171.526c11.812 0 21.897 8.596 23.703 20.269 7.25 46.837 38.483 61.76 38.315 123.731-.007 2.724.195 13.254.195 16 0 50.654-22.122 81.574-71.263 72.6-9.297 18.597-39.486 30.738-62.315 16.45-21.177 24.645-53.896 22.639-70.944 6.299V467.2c0 24.15-20.201 44.8-43.826 44.8-23.283 0-43.826-21.35-43.826-44.8zM112 72V24c0-13.255 10.745-24 24-24h192c13.255 0 24 10.745 24 24v48c0 13.255-10.745 24-24 24H136c-13.255 0-24-10.745-24-24zm212-24c0-11.046-8.954-20-20-20s-20 8.954-20 20 8.954 20 20 20 20-8.954 20-20z\"]\n};\nvar faHandPointLeft = {\n prefix: 'fas',\n iconName: 'hand-point-left',\n icon: [512, 512, [], \"f0a5\", \"M44.8 155.826h149.234c-5.841-8.248-10.57-16.558-14.153-24.918C166.248 99.098 189.778 63.986 224 64c18.616.008 32.203 10.897 40 29.092 12.122 28.286 78.648 64.329 107.534 77.323 17.857 7.956 28.453 25.479 28.464 43.845l.002.001v171.526c0 11.812-8.596 21.897-20.269 23.703-46.837 7.25-61.76 38.483-123.731 38.315-2.724-.007-13.254.195-16 .195-50.654 0-81.574-22.122-72.6-71.263-18.597-9.297-30.738-39.486-16.45-62.315-24.645-21.177-22.639-53.896-6.299-70.944H44.8c-24.15 0-44.8-20.201-44.8-43.826 0-23.283 21.35-43.826 44.8-43.826zM440 176h48c13.255 0 24 10.745 24 24v192c0 13.255-10.745 24-24 24h-48c-13.255 0-24-10.745-24-24V200c0-13.255 10.745-24 24-24zm24 212c11.046 0 20-8.954 20-20s-8.954-20-20-20-20 8.954-20 20 8.954 20 20 20z\"]\n};\nvar faHandPointRight = {\n prefix: 'fas',\n iconName: 'hand-point-right',\n icon: [512, 512, [], \"f0a4\", \"M512 199.652c0 23.625-20.65 43.826-44.8 43.826h-99.851c16.34 17.048 18.346 49.766-6.299 70.944 14.288 22.829 2.147 53.017-16.45 62.315C353.574 425.878 322.654 448 272 448c-2.746 0-13.276-.203-16-.195-61.971.168-76.894-31.065-123.731-38.315C120.596 407.683 112 397.599 112 385.786V214.261l.002-.001c.011-18.366 10.607-35.889 28.464-43.845 28.886-12.994 95.413-49.038 107.534-77.323 7.797-18.194 21.384-29.084 40-29.092 34.222-.014 57.752 35.098 44.119 66.908-3.583 8.359-8.312 16.67-14.153 24.918H467.2c23.45 0 44.8 20.543 44.8 43.826zM96 200v192c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V200c0-13.255 10.745-24 24-24h48c13.255 0 24 10.745 24 24zM68 368c0-11.046-8.954-20-20-20s-20 8.954-20 20 8.954 20 20 20 20-8.954 20-20z\"]\n};\nvar faHandPointUp = {\n prefix: 'fas',\n iconName: 'hand-point-up',\n icon: [384, 512, [], \"f0a6\", \"M135.652 0c23.625 0 43.826 20.65 43.826 44.8v99.851c17.048-16.34 49.766-18.346 70.944 6.299 22.829-14.288 53.017-2.147 62.315 16.45C361.878 158.426 384 189.346 384 240c0 2.746-.203 13.276-.195 16 .168 61.971-31.065 76.894-38.315 123.731C343.683 391.404 333.599 400 321.786 400H150.261l-.001-.002c-18.366-.011-35.889-10.607-43.845-28.464C93.421 342.648 57.377 276.122 29.092 264 10.897 256.203.008 242.616 0 224c-.014-34.222 35.098-57.752 66.908-44.119 8.359 3.583 16.67 8.312 24.918 14.153V44.8c0-23.45 20.543-44.8 43.826-44.8zM136 416h192c13.255 0 24 10.745 24 24v48c0 13.255-10.745 24-24 24H136c-13.255 0-24-10.745-24-24v-48c0-13.255 10.745-24 24-24zm168 28c-11.046 0-20 8.954-20 20s8.954 20 20 20 20-8.954 20-20-8.954-20-20-20z\"]\n};\nvar faHandPointer = {\n prefix: 'fas',\n iconName: 'hand-pointer',\n icon: [448, 512, [], \"f25a\", \"M448 240v96c0 3.084-.356 6.159-1.063 9.162l-32 136C410.686 499.23 394.562 512 376 512H168a40.004 40.004 0 0 1-32.35-16.473l-127.997-176c-12.993-17.866-9.043-42.883 8.822-55.876 17.867-12.994 42.884-9.043 55.877 8.823L104 315.992V40c0-22.091 17.908-40 40-40s40 17.909 40 40v200h8v-40c0-22.091 17.908-40 40-40s40 17.909 40 40v40h8v-24c0-22.091 17.908-40 40-40s40 17.909 40 40v24h8c0-22.091 17.908-40 40-40s40 17.909 40 40zm-256 80h-8v96h8v-96zm88 0h-8v96h8v-96zm88 0h-8v96h8v-96z\"]\n};\nvar faHandRock = {\n prefix: 'fas',\n iconName: 'hand-rock',\n icon: [512, 512, [], \"f255\", \"M464.8 80c-26.9-.4-48.8 21.2-48.8 48h-8V96.8c0-26.3-20.9-48.3-47.2-48.8-26.9-.4-48.8 21.2-48.8 48v32h-8V80.8c0-26.3-20.9-48.3-47.2-48.8-26.9-.4-48.8 21.2-48.8 48v48h-8V96.8c0-26.3-20.9-48.3-47.2-48.8-26.9-.4-48.8 21.2-48.8 48v136l-8-7.1v-48.1c0-26.3-20.9-48.3-47.2-48.8C21.9 127.6 0 149.2 0 176v66.4c0 27.4 11.7 53.5 32.2 71.8l111.7 99.3c10.2 9.1 16.1 22.2 16.1 35.9v6.7c0 13.3 10.7 24 24 24h240c13.3 0 24-10.7 24-24v-2.9c0-12.8 2.6-25.5 7.5-37.3l49-116.3c5-11.8 7.5-24.5 7.5-37.3V128.8c0-26.3-20.9-48.4-47.2-48.8z\"]\n};\nvar faHandScissors = {\n prefix: 'fas',\n iconName: 'hand-scissors',\n icon: [512, 512, [], \"f257\", \"M216 440c0-22.092 17.909-40 40-40v-8h-32c-22.091 0-40-17.908-40-40s17.909-40 40-40h32v-8H48c-26.51 0-48-21.49-48-48s21.49-48 48-48h208v-13.572l-177.551-69.74c-24.674-9.694-36.818-37.555-27.125-62.228 9.693-24.674 37.554-36.817 62.228-27.124l190.342 74.765 24.872-31.09c12.306-15.381 33.978-19.515 51.081-9.741l112 64A40.002 40.002 0 0 1 512 168v240c0 18.562-12.77 34.686-30.838 38.937l-136 32A39.982 39.982 0 0 1 336 480h-80c-22.091 0-40-17.908-40-40z\"]\n};\nvar faHandSpock = {\n prefix: 'fas',\n iconName: 'hand-spock',\n icon: [512, 512, [], \"f259\", \"M481.3 97.1c-21.5-5.1-43.1 8.2-48.2 29.6L402.3 256h-11.1l43.6-174.3c5.4-21.4-7.7-43.1-29.1-48.5s-43.1 7.7-48.5 29.1L308.8 256h-15.1L242 31.1c-5-21.6-26.4-35-48-30.1-21.5 4.9-35 26.4-30 47.9l47.6 207h-9.8L167 103.1c-4.9-21.5-26.3-35-47.9-30.1-21.5 4.9-35 26.3-30.1 47.9l39 171.6v79.4l-60.6-57c-16.1-15.1-41.4-14.4-56.5 1.7s-14.4 41.4 1.7 56.5L146.3 499c8.9 8.4 20.7 13 32.9 13h216.7c21.3 0 40-14 46-34.4l26.2-88.3c2.6-8.9 4-18 4-27.3v-42c0-7.5.9-15 2.6-22.2L511 145.3c5-21.5-8.3-43.1-29.7-48.2z\"]\n};\nvar faHands = {\n prefix: 'fas',\n iconName: 'hands',\n icon: [640, 512, [], \"f4c2\", \"M204.8 230.4c-10.6-14.1-30.7-17-44.8-6.4-14.1 10.6-17 30.7-6.4 44.8l38.1 50.8c4.8 6.4 4.1 15.3-1.5 20.9l-12.8 12.8c-6.7 6.7-17.6 6.2-23.6-1.1L64 244.4V96c0-17.7-14.3-32-32-32S0 78.3 0 96v218.4c0 10.9 3.7 21.5 10.5 30l104.1 134.3c5 6.5 8.4 13.9 10.4 21.7 1.8 6.9 8.1 11.6 15.3 11.6H272c8.8 0 16-7.2 16-16V384c0-27.7-9-54.6-25.6-76.8l-57.6-76.8zM608 64c-17.7 0-32 14.3-32 32v148.4l-89.8 107.8c-6 7.2-17 7.7-23.6 1.1l-12.8-12.8c-5.6-5.6-6.3-14.5-1.5-20.9l38.1-50.8c10.6-14.1 7.7-34.2-6.4-44.8-14.1-10.6-34.2-7.7-44.8 6.4l-57.6 76.8C361 329.4 352 356.3 352 384v112c0 8.8 7.2 16 16 16h131.7c7.1 0 13.5-4.7 15.3-11.6 2-7.8 5.4-15.2 10.4-21.7l104.1-134.3c6.8-8.5 10.5-19.1 10.5-30V96c0-17.7-14.3-32-32-32z\"]\n};\nvar faHandsHelping = {\n prefix: 'fas',\n iconName: 'hands-helping',\n icon: [640, 512, [], \"f4c4\", \"M488 192H336v56c0 39.7-32.3 72-72 72s-72-32.3-72-72V126.4l-64.9 39C107.8 176.9 96 197.8 96 220.2v47.3l-80 46.2C.7 322.5-4.6 342.1 4.3 357.4l80 138.6c8.8 15.3 28.4 20.5 43.7 11.7L231.4 448H368c35.3 0 64-28.7 64-64h16c17.7 0 32-14.3 32-32v-64h8c13.3 0 24-10.7 24-24v-48c0-13.3-10.7-24-24-24zm147.7-37.4L555.7 16C546.9.7 527.3-4.5 512 4.3L408.6 64H306.4c-12 0-23.7 3.4-33.9 9.7L239 94.6c-9.4 5.8-15 16.1-15 27.1V248c0 22.1 17.9 40 40 40s40-17.9 40-40v-88h184c30.9 0 56 25.1 56 56v28.5l80-46.2c15.3-8.9 20.5-28.4 11.7-43.7z\"]\n};\nvar faHandshake = {\n prefix: 'fas',\n iconName: 'handshake',\n icon: [640, 512, [], \"f2b5\", \"M434.7 64h-85.9c-8 0-15.7 3-21.6 8.4l-98.3 90c-.1.1-.2.3-.3.4-16.6 15.6-16.3 40.5-2.1 56 12.7 13.9 39.4 17.6 56.1 2.7.1-.1.3-.1.4-.2l79.9-73.2c6.5-5.9 16.7-5.5 22.6 1 6 6.5 5.5 16.6-1 22.6l-26.1 23.9L504 313.8c2.9 2.4 5.5 5 7.9 7.7V128l-54.6-54.6c-5.9-6-14.1-9.4-22.6-9.4zM544 128.2v223.9c0 17.7 14.3 32 32 32h64V128.2h-96zm48 223.9c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zM0 384h64c17.7 0 32-14.3 32-32V128.2H0V384zm48-63.9c8.8 0 16 7.2 16 16s-7.2 16-16 16-16-7.2-16-16c0-8.9 7.2-16 16-16zm435.9 18.6L334.6 217.5l-30 27.5c-29.7 27.1-75.2 24.5-101.7-4.4-26.9-29.4-24.8-74.9 4.4-101.7L289.1 64h-83.8c-8.5 0-16.6 3.4-22.6 9.4L128 128v223.9h18.3l90.5 81.9c27.4 22.3 67.7 18.1 90-9.3l.2-.2 17.9 15.5c15.9 13 39.4 10.5 52.3-5.4l31.4-38.6 5.4 4.4c13.7 11.1 33.9 9.1 45-4.7l9.5-11.7c11.2-13.8 9.1-33.9-4.6-45.1z\"]\n};\nvar faHanukiah = {\n prefix: 'fas',\n iconName: 'hanukiah',\n icon: [640, 512, [], \"f6e6\", \"M232 160c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm-64 0c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm224 0c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm64 0c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm88 8c0-4.42-3.58-8-8-8h-16c-4.42 0-8 3.58-8 8v120h32V168zm-440-8c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm520 0h-32c-8.84 0-16 7.16-16 16v112c0 17.67-14.33 32-32 32H352V128c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v192H96c-17.67 0-32-14.33-32-32V176c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v112c0 53.02 42.98 96 96 96h192v64H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16H352v-64h192c53.02 0 96-42.98 96-96V176c0-8.84-7.16-16-16-16zm-16-32c13.25 0 24-11.94 24-26.67S608 48 608 48s-24 38.61-24 53.33S594.75 128 608 128zm-576 0c13.25 0 24-11.94 24-26.67S32 48 32 48 8 86.61 8 101.33 18.75 128 32 128zm288-48c13.25 0 24-11.94 24-26.67S320 0 320 0s-24 38.61-24 53.33S306.75 80 320 80zm-208 48c13.25 0 24-11.94 24-26.67S112 48 112 48s-24 38.61-24 53.33S98.75 128 112 128zm64 0c13.25 0 24-11.94 24-26.67S176 48 176 48s-24 38.61-24 53.33S162.75 128 176 128zm64 0c13.25 0 24-11.94 24-26.67S240 48 240 48s-24 38.61-24 53.33S226.75 128 240 128zm160 0c13.25 0 24-11.94 24-26.67S400 48 400 48s-24 38.61-24 53.33S386.75 128 400 128zm64 0c13.25 0 24-11.94 24-26.67S464 48 464 48s-24 38.61-24 53.33S450.75 128 464 128zm64 0c13.25 0 24-11.94 24-26.67S528 48 528 48s-24 38.61-24 53.33S514.75 128 528 128z\"]\n};\nvar faHardHat = {\n prefix: 'fas',\n iconName: 'hard-hat',\n icon: [512, 512, [], \"f807\", \"M480 288c0-80.25-49.28-148.92-119.19-177.62L320 192V80a16 16 0 0 0-16-16h-96a16 16 0 0 0-16 16v112l-40.81-81.62C81.28 139.08 32 207.75 32 288v64h448zm16 96H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h480a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faHashtag = {\n prefix: 'fas',\n iconName: 'hashtag',\n icon: [448, 512, [], \"f292\", \"M440.667 182.109l7.143-40c1.313-7.355-4.342-14.109-11.813-14.109h-74.81l14.623-81.891C377.123 38.754 371.468 32 363.997 32h-40.632a12 12 0 0 0-11.813 9.891L296.175 128H197.54l14.623-81.891C213.477 38.754 207.822 32 200.35 32h-40.632a12 12 0 0 0-11.813 9.891L132.528 128H53.432a12 12 0 0 0-11.813 9.891l-7.143 40C33.163 185.246 38.818 192 46.289 192h74.81L98.242 320H19.146a12 12 0 0 0-11.813 9.891l-7.143 40C-1.123 377.246 4.532 384 12.003 384h74.81L72.19 465.891C70.877 473.246 76.532 480 84.003 480h40.632a12 12 0 0 0 11.813-9.891L151.826 384h98.634l-14.623 81.891C234.523 473.246 240.178 480 247.65 480h40.632a12 12 0 0 0 11.813-9.891L315.472 384h79.096a12 12 0 0 0 11.813-9.891l7.143-40c1.313-7.355-4.342-14.109-11.813-14.109h-74.81l22.857-128h79.096a12 12 0 0 0 11.813-9.891zM261.889 320h-98.634l22.857-128h98.634l-22.857 128z\"]\n};\nvar faHatWizard = {\n prefix: 'fas',\n iconName: 'hat-wizard',\n icon: [512, 512, [], \"f6e8\", \"M496 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-304-64l-64-32 64-32 32-64 32 64 64 32-64 32-16 32h208l-86.41-201.63a63.955 63.955 0 0 1-1.89-45.45L416 0 228.42 107.19a127.989 127.989 0 0 0-53.46 59.15L64 416h144l-16-32zm64-224l16-32 16 32 32 16-32 16-16 32-16-32-32-16 32-16z\"]\n};\nvar faHaykal = {\n prefix: 'fas',\n iconName: 'haykal',\n icon: [512, 512, [], \"f666\", \"M496.25 202.52l-110-15.44 41.82-104.34c6.67-16.64-11.6-32.18-26.59-22.63L307.44 120 273.35 12.82C270.64 4.27 263.32 0 256 0c-7.32 0-14.64 4.27-17.35 12.82l-34.09 107.19-94.04-59.89c-14.99-9.55-33.25 5.99-26.59 22.63l41.82 104.34-110 15.43c-17.54 2.46-21.68 26.27-6.03 34.67l98.16 52.66-74.48 83.54c-10.92 12.25-1.72 30.93 13.29 30.93 1.31 0 2.67-.14 4.07-.45l108.57-23.65-4.11 112.55c-.43 11.65 8.87 19.22 18.41 19.22 5.15 0 10.39-2.21 14.2-7.18l68.18-88.9 68.18 88.9c3.81 4.97 9.04 7.18 14.2 7.18 9.54 0 18.84-7.57 18.41-19.22l-4.11-112.55 108.57 23.65c17.36 3.76 29.21-17.2 17.35-30.49l-74.48-83.54 98.16-52.66c15.64-8.39 11.5-32.2-6.04-34.66zM338.51 311.68l-51.89-11.3 1.97 53.79L256 311.68l-32.59 42.49 1.96-53.79-51.89 11.3 35.6-39.93-46.92-25.17 52.57-7.38-19.99-49.87 44.95 28.62L256 166.72l16.29 51.23 44.95-28.62-19.99 49.87 52.57 7.38-46.92 25.17 35.61 39.93z\"]\n};\nvar faHdd = {\n prefix: 'fas',\n iconName: 'hdd',\n icon: [576, 512, [], \"f0a0\", \"M576 304v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48zm-48-80a79.557 79.557 0 0 1 30.777 6.165L462.25 85.374A48.003 48.003 0 0 0 422.311 64H153.689a48 48 0 0 0-39.938 21.374L17.223 230.165A79.557 79.557 0 0 1 48 224h480zm-48 96c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm-96 0c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z\"]\n};\nvar faHeading = {\n prefix: 'fas',\n iconName: 'heading',\n icon: [512, 512, [], \"f1dc\", \"M448 96v320h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H320a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V288H160v128h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H32a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V96H32a16 16 0 0 1-16-16V48a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16h-32v128h192V96h-32a16 16 0 0 1-16-16V48a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16z\"]\n};\nvar faHeadphones = {\n prefix: 'fas',\n iconName: 'headphones',\n icon: [512, 512, [], \"f025\", \"M256 32C114.52 32 0 146.496 0 288v48a32 32 0 0 0 17.689 28.622l14.383 7.191C34.083 431.903 83.421 480 144 480h24c13.255 0 24-10.745 24-24V280c0-13.255-10.745-24-24-24h-24c-31.342 0-59.671 12.879-80 33.627V288c0-105.869 86.131-192 192-192s192 86.131 192 192v1.627C427.671 268.879 399.342 256 368 256h-24c-13.255 0-24 10.745-24 24v176c0 13.255 10.745 24 24 24h24c60.579 0 109.917-48.098 111.928-108.187l14.382-7.191A32 32 0 0 0 512 336v-48c0-141.479-114.496-256-256-256z\"]\n};\nvar faHeadphonesAlt = {\n prefix: 'fas',\n iconName: 'headphones-alt',\n icon: [512, 512, [], \"f58f\", \"M160 288h-16c-35.35 0-64 28.7-64 64.12v63.76c0 35.41 28.65 64.12 64 64.12h16c17.67 0 32-14.36 32-32.06V320.06c0-17.71-14.33-32.06-32-32.06zm208 0h-16c-17.67 0-32 14.35-32 32.06v127.88c0 17.7 14.33 32.06 32 32.06h16c35.35 0 64-28.71 64-64.12v-63.76c0-35.41-28.65-64.12-64-64.12zM256 32C112.91 32 4.57 151.13 0 288v112c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16V288c0-114.67 93.33-207.8 208-207.82 114.67.02 208 93.15 208 207.82v112c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16V288C507.43 151.13 399.09 32 256 32z\"]\n};\nvar faHeadset = {\n prefix: 'fas',\n iconName: 'headset',\n icon: [512, 512, [], \"f590\", \"M192 208c0-17.67-14.33-32-32-32h-16c-35.35 0-64 28.65-64 64v48c0 35.35 28.65 64 64 64h16c17.67 0 32-14.33 32-32V208zm176 144c35.35 0 64-28.65 64-64v-48c0-35.35-28.65-64-64-64h-16c-17.67 0-32 14.33-32 32v112c0 17.67 14.33 32 32 32h16zM256 0C113.18 0 4.58 118.83 0 256v16c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-16c0-114.69 93.31-208 208-208s208 93.31 208 208h-.12c.08 2.43.12 165.72.12 165.72 0 23.35-18.93 42.28-42.28 42.28H320c0-26.51-21.49-48-48-48h-32c-26.51 0-48 21.49-48 48s21.49 48 48 48h181.72c49.86 0 90.28-40.42 90.28-90.28V256C507.42 118.83 398.82 0 256 0z\"]\n};\nvar faHeart = {\n prefix: 'fas',\n iconName: 'heart',\n icon: [512, 512, [], \"f004\", \"M462.3 62.6C407.5 15.9 326 24.3 275.7 76.2L256 96.5l-19.7-20.3C186.1 24.3 104.5 15.9 49.7 62.6c-62.8 53.6-66.1 149.8-9.9 207.9l193.5 199.8c12.5 12.9 32.8 12.9 45.3 0l193.5-199.8c56.3-58.1 53-154.3-9.8-207.9z\"]\n};\nvar faHeartBroken = {\n prefix: 'fas',\n iconName: 'heart-broken',\n icon: [512, 512, [], \"f7a9\", \"M473.7 73.8l-2.4-2.5c-46-47-118-51.7-169.6-14.8L336 159.9l-96 64 48 128-144-144 96-64-28.6-86.5C159.7 19.6 87 24 40.7 71.4l-2.4 2.4C-10.4 123.6-12.5 202.9 31 256l212.1 218.6c7.1 7.3 18.6 7.3 25.7 0L481 255.9c43.5-53 41.4-132.3-7.3-182.1z\"]\n};\nvar faHeartbeat = {\n prefix: 'fas',\n iconName: 'heartbeat',\n icon: [512, 512, [], \"f21e\", \"M320.2 243.8l-49.7 99.4c-6 12.1-23.4 11.7-28.9-.6l-56.9-126.3-30 71.7H60.6l182.5 186.5c7.1 7.3 18.6 7.3 25.7 0L451.4 288H342.3l-22.1-44.2zM473.7 73.9l-2.4-2.5c-51.5-52.6-135.8-52.6-187.4 0L256 100l-27.9-28.5c-51.5-52.7-135.9-52.7-187.4 0l-2.4 2.4C-10.4 123.7-12.5 203 31 256h102.4l35.9-86.2c5.4-12.9 23.6-13.2 29.4-.4l58.2 129.3 49-97.9c5.9-11.8 22.7-11.8 28.6 0l27.6 55.2H481c43.5-53 41.4-132.3-7.3-182.1z\"]\n};\nvar faHelicopter = {\n prefix: 'fas',\n iconName: 'helicopter',\n icon: [640, 512, [], \"f533\", \"M304 384h272c17.67 0 32-14.33 32-32 0-123.71-100.29-224-224-224V64h176c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16H144c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h176v64H112L68.8 70.4C65.78 66.37 61.03 64 56 64H16.01C5.6 64-2.04 73.78.49 83.88L32 192l160 64 86.4 115.2A31.992 31.992 0 0 0 304 384zm112-188.49C478.55 208.3 528.03 257.44 540.79 320H416V195.51zm219.37 263.3l-22.15-22.2c-6.25-6.26-16.24-6.1-22.64.01-7.09 6.77-13.84 11.25-24.64 11.25H240c-8.84 0-16 7.18-16 16.03v32.06c0 8.85 7.16 16.03 16 16.03h325.94c14.88 0 35.3-.47 68.45-29.52 7.02-6.14 7.57-17.05.98-23.66z\"]\n};\nvar faHighlighter = {\n prefix: 'fas',\n iconName: 'highlighter',\n icon: [544, 512, [], \"f591\", \"M0 479.98L99.92 512l35.45-35.45-67.04-67.04L0 479.98zm124.61-240.01a36.592 36.592 0 0 0-10.79 38.1l13.05 42.83-50.93 50.94 96.23 96.23 50.86-50.86 42.74 13.08c13.73 4.2 28.65-.01 38.15-10.78l35.55-41.64-173.34-173.34-41.52 35.44zm403.31-160.7l-63.2-63.2c-20.49-20.49-53.38-21.52-75.12-2.35L190.55 183.68l169.77 169.78L530.27 154.4c19.18-21.74 18.15-54.63-2.35-75.13z\"]\n};\nvar faHiking = {\n prefix: 'fas',\n iconName: 'hiking',\n icon: [384, 512, [], \"f6ec\", \"M80.95 472.23c-4.28 17.16 6.14 34.53 23.28 38.81 2.61.66 5.22.95 7.8.95 14.33 0 27.37-9.7 31.02-24.23l25.24-100.97-52.78-52.78-34.56 138.22zm14.89-196.12L137 117c2.19-8.42-3.14-16.95-11.92-19.06-43.88-10.52-88.35 15.07-99.32 57.17L.49 253.24c-2.19 8.42 3.14 16.95 11.92 19.06l63.56 15.25c8.79 2.1 17.68-3.02 19.87-11.44zM368 160h-16c-8.84 0-16 7.16-16 16v16h-34.75l-46.78-46.78C243.38 134.11 228.61 128 212.91 128c-27.02 0-50.47 18.3-57.03 44.52l-26.92 107.72a32.012 32.012 0 0 0 8.42 30.39L224 397.25V480c0 17.67 14.33 32 32 32s32-14.33 32-32v-82.75c0-17.09-6.66-33.16-18.75-45.25l-46.82-46.82c.15-.5.49-.89.62-1.41l19.89-79.57 22.43 22.43c6 6 14.14 9.38 22.62 9.38h48v240c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16V176c.01-8.84-7.15-16-15.99-16zM240 96c26.51 0 48-21.49 48-48S266.51 0 240 0s-48 21.49-48 48 21.49 48 48 48z\"]\n};\nvar faHippo = {\n prefix: 'fas',\n iconName: 'hippo',\n icon: [640, 512, [], \"f6ed\", \"M581.12 96.2c-27.67-.15-52.5 17.58-76.6 26.62C489.98 88.27 455.83 64 416 64c-11.28 0-21.95 2.3-32 5.88V56c0-13.26-10.75-24-24-24h-16c-13.25 0-24 10.74-24 24v48.98C286.01 79.58 241.24 64 192 64 85.96 64 0 135.64 0 224v240c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16v-70.79C128.35 407.57 166.72 416 208 416s79.65-8.43 112-22.79V464c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V288h128v32c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-32c17.67 0 32-14.33 32-32v-92.02c0-34.09-24.79-67.59-58.88-67.78zM448 176c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z\"]\n};\nvar faHistory = {\n prefix: 'fas',\n iconName: 'history',\n icon: [512, 512, [], \"f1da\", \"M504 255.531c.253 136.64-111.18 248.372-247.82 248.468-59.015.042-113.223-20.53-155.822-54.911-11.077-8.94-11.905-25.541-1.839-35.607l11.267-11.267c8.609-8.609 22.353-9.551 31.891-1.984C173.062 425.135 212.781 440 256 440c101.705 0 184-82.311 184-184 0-101.705-82.311-184-184-184-48.814 0-93.149 18.969-126.068 49.932l50.754 50.754c10.08 10.08 2.941 27.314-11.313 27.314H24c-8.837 0-16-7.163-16-16V38.627c0-14.254 17.234-21.393 27.314-11.314l49.372 49.372C129.209 34.136 189.552 8 256 8c136.81 0 247.747 110.78 248 247.531zm-180.912 78.784l9.823-12.63c8.138-10.463 6.253-25.542-4.21-33.679L288 256.349V152c0-13.255-10.745-24-24-24h-16c-13.255 0-24 10.745-24 24v135.651l65.409 50.874c10.463 8.137 25.541 6.253 33.679-4.21z\"]\n};\nvar faHockeyPuck = {\n prefix: 'fas',\n iconName: 'hockey-puck',\n icon: [512, 512, [], \"f453\", \"M0 160c0-53 114.6-96 256-96s256 43 256 96-114.6 96-256 96S0 213 0 160zm0 82.2V352c0 53 114.6 96 256 96s256-43 256-96V242.2c-113.4 82.3-398.5 82.4-512 0z\"]\n};\nvar faHollyBerry = {\n prefix: 'fas',\n iconName: 'holly-berry',\n icon: [448, 512, [], \"f7aa\", \"M144 192c26.5 0 48-21.5 48-48s-21.5-48-48-48-48 21.5-48 48 21.5 48 48 48zm112-48c0 26.5 21.5 48 48 48s48-21.5 48-48-21.5-48-48-48-48 21.5-48 48zm-32-48c26.5 0 48-21.5 48-48S250.5 0 224 0s-48 21.5-48 48 21.5 48 48 48zm-16.2 139.1c.1-12.4-13.1-20.1-23.8-13.7-34.3 20.3-71.4 32.7-108.7 36.2-9.7.9-15.6 11.3-11.6 20.2 6.2 13.9 11.1 28.6 14.7 43.8 3.6 15.2-5.3 30.6-20.2 35.1-14.9 4.5-30.1 7.6-45.3 9.1-9.7 1-15.7 11.3-11.7 20.2 15 32.8 22.9 69.5 23 107.7.1 14.4 15.2 23.1 27.6 16 33.2-19 68.9-30.5 104.8-33.9 9.7-.9 15.6-11.3 11.6-20.2-6.2-13.9-11.1-28.6-14.7-43.8-3.6-15.2 5.3-30.6 20.2-35.1 14.9-4.5 30.1-7.6 45.3-9.1 9.7-1 15.7-11.3 11.7-20.2-15.5-34.2-23.3-72.5-22.9-112.3zM435 365.6c-15.2-1.6-30.3-4.7-45.3-9.1-14.9-4.5-23.8-19.9-20.2-35.1 3.6-15.2 8.5-29.8 14.7-43.8 4-8.9-1.9-19.3-11.6-20.2-37.3-3.5-74.4-15.9-108.7-36.2-10.7-6.3-23.9 1.4-23.8 13.7 0 1.6-.2 3.2-.2 4.9.2 33.3 7 65.7 19.9 94 5.7 12.4 5.2 26.6-.6 38.9 4.9 1.2 9.9 2.2 14.8 3.7 14.9 4.5 23.8 19.9 20.2 35.1-3.6 15.2-8.5 29.8-14.7 43.8-4 8.9 1.9 19.3 11.6 20.2 35.9 3.4 71.6 14.9 104.8 33.9 12.5 7.1 27.6-1.6 27.6-16 .2-38.2 8-75 23-107.7 4.3-8.7-1.8-19.1-11.5-20.1z\"]\n};\nvar faHome = {\n prefix: 'fas',\n iconName: 'home',\n icon: [576, 512, [], \"f015\", \"M280.37 148.26L96 300.11V464a16 16 0 0 0 16 16l112.06-.29a16 16 0 0 0 15.92-16V368a16 16 0 0 1 16-16h64a16 16 0 0 1 16 16v95.64a16 16 0 0 0 16 16.05L464 480a16 16 0 0 0 16-16V300L295.67 148.26a12.19 12.19 0 0 0-15.3 0zM571.6 251.47L488 182.56V44.05a12 12 0 0 0-12-12h-56a12 12 0 0 0-12 12v72.61L318.47 43a48 48 0 0 0-61 0L4.34 251.47a12 12 0 0 0-1.6 16.9l25.5 31A12 12 0 0 0 45.15 301l235.22-193.74a12.19 12.19 0 0 1 15.3 0L530.9 301a12 12 0 0 0 16.9-1.6l25.5-31a12 12 0 0 0-1.7-16.93z\"]\n};\nvar faHorse = {\n prefix: 'fas',\n iconName: 'horse',\n icon: [576, 512, [], \"f6f0\", \"M575.92 76.6c-.01-8.13-3.02-15.87-8.58-21.8-3.78-4.03-8.58-9.12-13.69-14.5 11.06-6.84 19.5-17.49 22.18-30.66C576.85 4.68 572.96 0 567.9 0H447.92c-70.69 0-128 57.31-128 128H160c-28.84 0-54.4 12.98-72 33.11V160c-48.53 0-88 39.47-88 88v56c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-56c0-13.22 6.87-24.39 16.78-31.68-.21 2.58-.78 5.05-.78 7.68 0 27.64 11.84 52.36 30.54 69.88l-25.72 68.6a63.945 63.945 0 0 0-2.16 37.99l24.85 99.41A15.982 15.982 0 0 0 107.02 512h65.96c10.41 0 18.05-9.78 15.52-19.88l-26.31-105.26 23.84-63.59L320 345.6V496c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V318.22c19.74-20.19 32-47.75 32-78.22 0-.22-.07-.42-.08-.64V136.89l16 7.11 18.9 37.7c7.45 14.87 25.05 21.55 40.49 15.37l32.55-13.02a31.997 31.997 0 0 0 20.12-29.74l-.06-77.71zm-64 19.4c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z\"]\n};\nvar faHorseHead = {\n prefix: 'fas',\n iconName: 'horse-head',\n icon: [512, 512, [], \"f7ab\", \"M509.8 332.5l-69.9-164.3c-14.9-41.2-50.4-71-93-79.2 18-10.6 46.3-35.9 34.2-82.3-1.3-5-7.1-7.9-12-6.1L166.9 76.3C35.9 123.4 0 238.9 0 398.8V480c0 17.7 14.3 32 32 32h236.2c23.8 0 39.3-25 28.6-46.3L256 384v-.7c-45.6-3.5-84.6-30.7-104.3-69.6-1.6-3.1-.9-6.9 1.6-9.3l12.1-12.1c3.9-3.9 10.6-2.7 12.9 2.4 14.8 33.7 48.2 57.4 87.4 57.4 17.2 0 33-5.1 46.8-13.2l46 63.9c6 8.4 15.7 13.3 26 13.3h50.3c8.5 0 16.6-3.4 22.6-9.4l45.3-39.8c8.9-9.1 11.7-22.6 7.1-34.4zM328 224c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24z\"]\n};\nvar faHospital = {\n prefix: 'fas',\n iconName: 'hospital',\n icon: [448, 512, [], \"f0f8\", \"M448 492v20H0v-20c0-6.627 5.373-12 12-12h20V120c0-13.255 10.745-24 24-24h88V24c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v72h88c13.255 0 24 10.745 24 24v360h20c6.627 0 12 5.373 12 12zM308 192h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zm-168 64h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm104 128h-40c-6.627 0-12 5.373-12 12v84h64v-84c0-6.627-5.373-12-12-12zm64-96h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zm-116 12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40zM182 96h26v26a6 6 0 0 0 6 6h20a6 6 0 0 0 6-6V96h26a6 6 0 0 0 6-6V70a6 6 0 0 0-6-6h-26V38a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v26h-26a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6z\"]\n};\nvar faHospitalAlt = {\n prefix: 'fas',\n iconName: 'hospital-alt',\n icon: [576, 512, [], \"f47d\", \"M544 96H416V32c0-17.7-14.3-32-32-32H192c-17.7 0-32 14.3-32 32v64H32c-17.7 0-32 14.3-32 32v368c0 8.8 7.2 16 16 16h544c8.8 0 16-7.2 16-16V128c0-17.7-14.3-32-32-32zM160 436c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm160 128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm16-170c0 3.3-2.7 6-6 6h-26v26c0 3.3-2.7 6-6 6h-20c-3.3 0-6-2.7-6-6v-26h-26c-3.3 0-6-2.7-6-6v-20c0-3.3 2.7-6 6-6h26V86c0-3.3 2.7-6 6-6h20c3.3 0 6 2.7 6 6v26h26c3.3 0 6 2.7 6 6v20zm144 298c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40z\"]\n};\nvar faHospitalSymbol = {\n prefix: 'fas',\n iconName: 'hospital-symbol',\n icon: [512, 512, [], \"f47e\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256 256-114.6 256-256S397.4 0 256 0zm112 376c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-88h-96v88c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V136c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v88h96v-88c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v240z\"]\n};\nvar faHotTub = {\n prefix: 'fas',\n iconName: 'hot-tub',\n icon: [512, 512, [], \"f593\", \"M414.21 177.65c1.02 8.21 7.75 14.35 15.75 14.35h16.12c9.51 0 17.08-8.57 16-18.35-4.34-39.11-22.4-74.53-50.13-97.16-17.37-14.17-28.82-36.75-31.98-62.15C378.96 6.14 372.22 0 364.23 0h-16.12c-9.51 0-17.09 8.57-16 18.35 4.34 39.11 22.4 74.53 50.13 97.16 17.36 14.17 28.82 36.75 31.97 62.14zm-108 0c1.02 8.21 7.75 14.35 15.75 14.35h16.12c9.51 0 17.08-8.57 16-18.35-4.34-39.11-22.4-74.53-50.13-97.16-17.37-14.17-28.82-36.75-31.98-62.15C270.96 6.14 264.22 0 256.23 0h-16.12c-9.51 0-17.09 8.57-16 18.35 4.34 39.11 22.4 74.53 50.13 97.16 17.36 14.17 28.82 36.75 31.97 62.14zM480 256H256l-110.93-83.2a63.99 63.99 0 0 0-38.4-12.8H64c-35.35 0-64 28.65-64 64v224c0 35.35 28.65 64 64 64h384c35.35 0 64-28.65 64-64V288c0-17.67-14.33-32-32-32zM128 440c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zm96 0c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zm96 0c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zm96 0c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zM64 128c35.35 0 64-28.65 64-64S99.35 0 64 0 0 28.65 0 64s28.65 64 64 64z\"]\n};\nvar faHotdog = {\n prefix: 'fas',\n iconName: 'hotdog',\n icon: [512, 512, [], \"f80f\", \"M488.56 23.44a80 80 0 0 0-113.12 0l-352 352a80 80 0 1 0 113.12 113.12l352-352a80 80 0 0 0 0-113.12zm-49.93 95.19c-19.6 19.59-37.52 22.67-51.93 25.14C373.76 146 364.4 147.6 352 160s-14 21.76-16.23 34.71c-2.48 14.4-5.55 32.33-25.15 51.92s-37.52 22.67-51.92 25.15C245.75 274 236.4 275.6 224 288s-14 21.75-16.23 34.7c-2.47 14.4-5.54 32.33-25.14 51.92s-37.53 22.68-51.93 25.15C117.76 402 108.4 403.6 96 416a16 16 0 0 1-22.63-22.63c19.6-19.59 37.52-22.67 51.92-25.14 13-2.22 22.3-3.82 34.71-16.23s14-21.75 16.22-34.7c2.48-14.4 5.55-32.33 25.15-51.92s37.52-22.67 51.92-25.14c13-2.22 22.3-3.83 34.7-16.23s14-21.76 16.24-34.71c2.47-14.4 5.54-32.33 25.14-51.92s37.52-22.68 51.92-25.15C394.24 110 403.59 108.41 416 96a16 16 0 0 1 22.63 22.63zM31.44 322.18L322.18 31.44l-11.54-11.55c-25-25-63.85-26.66-86.79-3.72L16.17 223.85c-22.94 22.94-21.27 61.79 3.72 86.78zm449.12-132.36L189.82 480.56l11.54 11.55c25 25 63.85 26.66 86.79 3.72l207.68-207.68c22.94-22.94 21.27-61.79-3.72-86.79z\"]\n};\nvar faHotel = {\n prefix: 'fas',\n iconName: 'hotel',\n icon: [576, 512, [], \"f594\", \"M560 64c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16H16C7.16 0 0 7.16 0 16v32c0 8.84 7.16 16 16 16h15.98v384H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h240v-80c0-8.8 7.2-16 16-16h32c8.8 0 16 7.2 16 16v80h240c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16h-16V64h16zm-304 44.8c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4zm0 96c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4zm-128-96c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4zM179.2 256h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8zM192 384c0-53.02 42.98-96 96-96s96 42.98 96 96H192zm256-140.8c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm0-96c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4z\"]\n};\nvar faHourglass = {\n prefix: 'fas',\n iconName: 'hourglass',\n icon: [384, 512, [], \"f254\", \"M360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64z\"]\n};\nvar faHourglassEnd = {\n prefix: 'fas',\n iconName: 'hourglass-end',\n icon: [384, 512, [], \"f253\", \"M360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64zM192 208c-57.787 0-104-66.518-104-144h208c0 77.945-46.51 144-104 144z\"]\n};\nvar faHourglassHalf = {\n prefix: 'fas',\n iconName: 'hourglass-half',\n icon: [384, 512, [], \"f252\", \"M360 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24zm-75.078 384H99.08c17.059-46.797 52.096-80 92.92-80 40.821 0 75.862 33.196 92.922 80zm.019-256H99.078C91.988 108.548 88 86.748 88 64h208c0 22.805-3.987 44.587-11.059 64z\"]\n};\nvar faHourglassStart = {\n prefix: 'fas',\n iconName: 'hourglass-start',\n icon: [384, 512, [], \"f251\", \"M360 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24zm-64 448H88c0-77.458 46.204-144 104-144 57.786 0 104 66.517 104 144z\"]\n};\nvar faHouseDamage = {\n prefix: 'fas',\n iconName: 'house-damage',\n icon: [576, 512, [], \"f6f1\", \"M288 114.96L69.47 307.71c-1.62 1.46-3.69 2.14-5.47 3.35V496c0 8.84 7.16 16 16 16h149.23L192 439.19l104.11-64-60.16-119.22L384 392.75l-104.11 64L319.81 512H496c8.84 0 16-7.16 16-16V311.1c-1.7-1.16-3.72-1.82-5.26-3.2L288 114.96zm282.69 121.32L512 184.45V48c0-8.84-7.16-16-16-16h-64c-8.84 0-16 7.16-16 16v51.69L314.75 10.31C307.12 3.45 297.56.01 288 0s-19.1 3.41-26.7 10.27L5.31 236.28c-6.57 5.91-7.12 16.02-1.21 22.6l21.4 23.82c5.9 6.57 16.02 7.12 22.6 1.21L277.42 81.63c6.05-5.33 15.12-5.33 21.17 0L527.91 283.9c6.57 5.9 16.69 5.36 22.6-1.21l21.4-23.82c5.9-6.57 5.36-16.69-1.22-22.59z\"]\n};\nvar faHryvnia = {\n prefix: 'fas',\n iconName: 'hryvnia',\n icon: [384, 512, [], \"f6f2\", \"M368 240c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16h-41.86c13.41-28.63 13.74-63.33-4.13-94.05C303.34 49.84 267.1 32 229.96 32h-78.82c-24.32 0-47.86 8.53-66.54 24.09L72.83 65.9c-10.18 8.49-11.56 23.62-3.07 33.8l20.49 24.59c8.49 10.19 23.62 11.56 33.81 3.07l11.73-9.78c4.32-3.6 9.77-5.57 15.39-5.57h83.62c11.69 0 21.2 9.52 21.2 21.2 0 5.91-2.48 11.58-6.81 15.58L219.7 176H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h134.37l-34.67 32H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h41.86c-13.41 28.63-13.74 63.33 4.13 94.05C80.66 462.15 116.9 480 154.04 480h78.82c24.32 0 47.86-8.53 66.54-24.09l11.77-9.81c10.18-8.49 11.56-23.62 3.07-33.8l-20.49-24.59c-8.49-10.19-23.62-11.56-33.81-3.07l-11.75 9.8a23.992 23.992 0 0 1-15.36 5.56H149.2c-11.69 0-21.2-9.52-21.2-21.2 0-5.91 2.48-11.58 6.81-15.58L164.3 336H368c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16H233.63l34.67-32H368z\"]\n};\nvar faICursor = {\n prefix: 'fas',\n iconName: 'i-cursor',\n icon: [256, 512, [], \"f246\", \"M256 52.048V12.065C256 5.496 250.726.148 244.158.066 211.621-.344 166.469.011 128 37.959 90.266.736 46.979-.114 11.913.114 5.318.157 0 5.519 0 12.114v39.645c0 6.687 5.458 12.078 12.145 11.998C38.111 63.447 96 67.243 96 112.182V224H60c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h36v112c0 44.932-56.075 48.031-83.95 47.959C5.404 447.942 0 453.306 0 459.952v39.983c0 6.569 5.274 11.917 11.842 11.999 32.537.409 77.689.054 116.158-37.894 37.734 37.223 81.021 38.073 116.087 37.845 6.595-.043 11.913-5.405 11.913-12V460.24c0-6.687-5.458-12.078-12.145-11.998C217.889 448.553 160 444.939 160 400V288h36c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-36V112.182c0-44.932 56.075-48.213 83.95-48.142 6.646.018 12.05-5.346 12.05-11.992z\"]\n};\nvar faIceCream = {\n prefix: 'fas',\n iconName: 'ice-cream',\n icon: [448, 512, [], \"f810\", \"M368 160h-.94a144 144 0 1 0-286.12 0H80a48 48 0 0 0 0 96h288a48 48 0 0 0 0-96zM195.38 493.69a31.52 31.52 0 0 0 57.24 0L352 288H96z\"]\n};\nvar faIcicles = {\n prefix: 'fas',\n iconName: 'icicles',\n icon: [512, 512, [], \"f7ad\", \"M511.4 37.9C515.1 18.2 500 0 480 0H32C10.6 0-4.8 20.7 1.4 41.2l87.1 273.4c2.5 7.2 12.7 7.2 15.1 0L140 190.5l44.2 187.3c1.9 8.3 13.7 8.3 15.6 0l46.5-196.9 34.1 133.4c2.3 7.6 13 7.6 15.3 0l45.8-172.5 66.7 363.8c1.7 8.6 14 8.6 15.7 0l87.5-467.7z\"]\n};\nvar faIcons = {\n prefix: 'fas',\n iconName: 'icons',\n icon: [512, 512, [], \"f86d\", \"M116.65 219.35a15.68 15.68 0 0 0 22.65 0l96.75-99.83c28.15-29 26.5-77.1-4.91-103.88C203.75-7.7 163-3.5 137.86 22.44L128 32.58l-9.85-10.14C93.05-3.5 52.25-7.7 24.86 15.64c-31.41 26.78-33 74.85-5 103.88zm143.92 100.49h-48l-7.08-14.24a27.39 27.39 0 0 0-25.66-17.78h-71.71a27.39 27.39 0 0 0-25.66 17.78l-7 14.24h-48A27.45 27.45 0 0 0 0 347.3v137.25A27.44 27.44 0 0 0 27.43 512h233.14A27.45 27.45 0 0 0 288 484.55V347.3a27.45 27.45 0 0 0-27.43-27.46zM144 468a52 52 0 1 1 52-52 52 52 0 0 1-52 52zm355.4-115.9h-60.58l22.36-50.75c2.1-6.65-3.93-13.21-12.18-13.21h-75.59c-6.3 0-11.66 3.9-12.5 9.1l-16.8 106.93c-1 6.3 4.88 11.89 12.5 11.89h62.31l-24.2 83c-1.89 6.65 4.2 12.9 12.23 12.9a13.26 13.26 0 0 0 10.92-5.25l92.4-138.91c4.88-6.91-1.16-15.7-10.87-15.7zM478.08.33L329.51 23.17C314.87 25.42 304 38.92 304 54.83V161.6a83.25 83.25 0 0 0-16-1.7c-35.35 0-64 21.48-64 48s28.65 48 64 48c35.2 0 63.73-21.32 64-47.66V99.66l112-17.22v47.18a83.25 83.25 0 0 0-16-1.7c-35.35 0-64 21.48-64 48s28.65 48 64 48c35.2 0 63.73-21.32 64-47.66V32c0-19.48-16-34.42-33.92-31.67z\"]\n};\nvar faIdBadge = {\n prefix: 'fas',\n iconName: 'id-badge',\n icon: [384, 512, [], \"f2c1\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM144 32h96c8.8 0 16 7.2 16 16s-7.2 16-16 16h-96c-8.8 0-16-7.2-16-16s7.2-16 16-16zm48 128c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H102.4C90 416 80 407.4 80 396.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z\"]\n};\nvar faIdCard = {\n prefix: 'fas',\n iconName: 'id-card',\n icon: [576, 512, [], \"f2c2\", \"M528 32H48C21.5 32 0 53.5 0 80v16h576V80c0-26.5-21.5-48-48-48zM0 432c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V128H0v304zm352-232c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16zm0 64c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16zm0 64c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16zM176 192c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zM67.1 396.2C75.5 370.5 99.6 352 128 352h8.2c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h8.2c28.4 0 52.5 18.5 60.9 44.2 3.2 9.9-5.2 19.8-15.6 19.8H82.7c-10.4 0-18.8-10-15.6-19.8z\"]\n};\nvar faIdCardAlt = {\n prefix: 'fas',\n iconName: 'id-card-alt',\n icon: [576, 512, [], \"f47f\", \"M528 64H384v96H192V64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM288 224c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm93.3 224H194.7c-10.4 0-18.8-10-15.6-19.8 8.3-25.6 32.4-44.2 60.9-44.2h8.2c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h8.2c28.4 0 52.5 18.5 60.9 44.2 3.2 9.8-5.2 19.8-15.6 19.8zM352 32c0-17.7-14.3-32-32-32h-64c-17.7 0-32 14.3-32 32v96h128V32z\"]\n};\nvar faIgloo = {\n prefix: 'fas',\n iconName: 'igloo',\n icon: [576, 512, [], \"f7ae\", \"M320 33.9c-10.5-1.2-21.2-1.9-32-1.9-99.8 0-187.8 50.8-239.4 128H320V33.9zM96 192H30.3C11.1 230.6 0 274 0 320h96V192zM352 39.4V160h175.4C487.2 99.9 424.8 55.9 352 39.4zM480 320h96c0-46-11.1-89.4-30.3-128H480v128zm-64 64v96h128c17.7 0 32-14.3 32-32v-96H411.5c2.6 10.3 4.5 20.9 4.5 32zm32-192H128v128h49.8c22.2-38.1 63-64 110.2-64s88 25.9 110.2 64H448V192zM0 448c0 17.7 14.3 32 32 32h128v-96c0-11.1 1.9-21.7 4.5-32H0v96zm288-160c-53 0-96 43-96 96v96h192v-96c0-53-43-96-96-96z\"]\n};\nvar faImage = {\n prefix: 'fas',\n iconName: 'image',\n icon: [512, 512, [], \"f03e\", \"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z\"]\n};\nvar faImages = {\n prefix: 'fas',\n iconName: 'images',\n icon: [576, 512, [], \"f302\", \"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v208c0 44.112 35.888 80 80 80h336zm96-80V80c0-26.51-21.49-48-48-48H144c-26.51 0-48 21.49-48 48v256c0 26.51 21.49 48 48 48h384c26.51 0 48-21.49 48-48zM256 128c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-96 144l55.515-55.515c4.686-4.686 12.284-4.686 16.971 0L272 256l135.515-135.515c4.686-4.686 12.284-4.686 16.971 0L512 208v112H160v-48z\"]\n};\nvar faInbox = {\n prefix: 'fas',\n iconName: 'inbox',\n icon: [576, 512, [], \"f01c\", \"M567.938 243.908L462.25 85.374A48.003 48.003 0 0 0 422.311 64H153.689a48 48 0 0 0-39.938 21.374L8.062 243.908A47.994 47.994 0 0 0 0 270.533V400c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V270.533a47.994 47.994 0 0 0-8.062-26.625zM162.252 128h251.497l85.333 128H376l-32 64H232l-32-64H76.918l85.334-128z\"]\n};\nvar faIndent = {\n prefix: 'fas',\n iconName: 'indent',\n icon: [448, 512, [], \"f03c\", \"M27.31 363.3l96-96a16 16 0 0 0 0-22.62l-96-96C17.27 138.66 0 145.78 0 160v192c0 14.31 17.33 21.3 27.31 11.3zM432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm3.17-128H204.83A12.82 12.82 0 0 0 192 300.83v38.34A12.82 12.82 0 0 0 204.83 352h230.34A12.82 12.82 0 0 0 448 339.17v-38.34A12.82 12.82 0 0 0 435.17 288zm0-128H204.83A12.82 12.82 0 0 0 192 172.83v38.34A12.82 12.82 0 0 0 204.83 224h230.34A12.82 12.82 0 0 0 448 211.17v-38.34A12.82 12.82 0 0 0 435.17 160zM432 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faIndustry = {\n prefix: 'fas',\n iconName: 'industry',\n icon: [512, 512, [], \"f275\", \"M475.115 163.781L336 252.309v-68.28c0-18.916-20.931-30.399-36.885-20.248L160 252.309V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56v400c0 13.255 10.745 24 24 24h464c13.255 0 24-10.745 24-24V184.029c0-18.917-20.931-30.399-36.885-20.248z\"]\n};\nvar faInfinity = {\n prefix: 'fas',\n iconName: 'infinity',\n icon: [640, 512, [], \"f534\", \"M471.1 96C405 96 353.3 137.3 320 174.6 286.7 137.3 235 96 168.9 96 75.8 96 0 167.8 0 256s75.8 160 168.9 160c66.1 0 117.8-41.3 151.1-78.6 33.3 37.3 85 78.6 151.1 78.6 93.1 0 168.9-71.8 168.9-160S564.2 96 471.1 96zM168.9 320c-40.2 0-72.9-28.7-72.9-64s32.7-64 72.9-64c38.2 0 73.4 36.1 94 64-20.4 27.6-55.9 64-94 64zm302.2 0c-38.2 0-73.4-36.1-94-64 20.4-27.6 55.9-64 94-64 40.2 0 72.9 28.7 72.9 64s-32.7 64-72.9 64z\"]\n};\nvar faInfo = {\n prefix: 'fas',\n iconName: 'info',\n icon: [192, 512, [], \"f129\", \"M20 424.229h20V279.771H20c-11.046 0-20-8.954-20-20V212c0-11.046 8.954-20 20-20h112c11.046 0 20 8.954 20 20v212.229h20c11.046 0 20 8.954 20 20V492c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20v-47.771c0-11.046 8.954-20 20-20zM96 0C56.235 0 24 32.235 24 72s32.235 72 72 72 72-32.235 72-72S135.764 0 96 0z\"]\n};\nvar faInfoCircle = {\n prefix: 'fas',\n iconName: 'info-circle',\n icon: [512, 512, [], \"f05a\", \"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"]\n};\nvar faItalic = {\n prefix: 'fas',\n iconName: 'italic',\n icon: [320, 512, [], \"f033\", \"M320 48v32a16 16 0 0 1-16 16h-62.76l-80 320H208a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H16a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h62.76l80-320H112a16 16 0 0 1-16-16V48a16 16 0 0 1 16-16h192a16 16 0 0 1 16 16z\"]\n};\nvar faJedi = {\n prefix: 'fas',\n iconName: 'jedi',\n icon: [544, 512, [], \"f669\", \"M479.99 352l58.88-58.87c3.29-16.8 5.13-34.12 5.13-51.86 0-5.81-.68-11.51-1.05-17.27H496l41.25-41.24c-14.5-64.79-52.43-123.05-107.91-162.27-2.77-1.96-5.97-2.99-9.25-2.99-5.37 0-10.41 2.71-13.49 7.24-3.05 4.49-3.64 9.99-1.61 15.09 6.55 16.46 9.86 33.73 9.86 51.31 0 45.12-21.03 86.57-57.69 113.73-4.02 2.98-6.46 7.5-6.7 12.4-.24 4.92 1.76 9.66 5.49 13.03 32.93 29.75 47.35 73.51 38.57 117.07-9.74 48.35-48.84 87.1-97.31 96.5l-2.5-65.34L321.88 397c2.98 2.06 7.39 1.69 10.02-.8a8.002 8.002 0 0 0 1.34-9.92l-20.11-33.73 42.07-8.72c3.7-.75 6.38-4.05 6.38-7.83 0-3.77-2.69-7.06-6.38-7.83l-42.07-8.73 20.13-33.77c1.92-3.23 1.34-7.31-1.38-9.91-2.7-2.55-6.97-2.89-10-.8l-30.39 20.67L279.96 7.7a7.964 7.964 0 0 0-8-7.7c-4.33 0-7.84 3.38-8 7.67l-11.52 287.97-30.39-20.66c-3.14-2.12-7.27-1.83-10 .78-2.72 2.59-3.3 6.67-1.36 9.94l20.11 33.73-42.07 8.73c-3.7.75-6.38 4.05-6.38 7.83s2.67 7.08 6.38 7.83l42.07 8.72-20.13 33.77c-1.92 3.23-1.34 7.33 1.39 9.94 2.59 2.45 7.03 2.75 10 .75l27.16-18.48-2.5 65.26c-56.94-11.64-99.89-61.89-99.89-121.92 0-35.08 14.62-67.6 41.17-91.58 3.72-3.36 5.72-8.11 5.48-13.01-.24-4.9-2.68-9.41-6.69-12.38-36.67-27.16-57.71-68.62-57.71-113.74 0-17.56 3.31-34.81 9.84-51.26 2.02-5.09 1.43-10.59-1.62-15.09-3.08-4.54-8.13-7.25-13.51-7.25-3.3 0-6.5 1.04-9.27 3-55.87 39.52-93.6 97.37-107.97 162.07L47.93 224H.72c-.63 9.92-.97 19.91-.5 29.99.62 13.43 2.54 26.53 5.11 39.41l58.6 58.6H24.02c41.25 90.23 131.13 154.94 235.1 159.71 4.3.2 8.59.29 12.85.29 110.34 0 205.35-65.83 247.98-160h-39.96z\"]\n};\nvar faJoint = {\n prefix: 'fas',\n iconName: 'joint',\n icon: [640, 512, [], \"f595\", \"M444.34 181.1c22.38 15.68 35.66 41.16 35.66 68.59V280c0 4.42 3.58 8 8 8h48c4.42 0 8-3.58 8-8v-30.31c0-43.24-21.01-83.41-56.34-108.06C463.85 125.02 448 99.34 448 70.31V8c0-4.42-3.58-8-8-8h-48c-4.42 0-8 3.58-8 8v66.4c0 43.69 24.56 81.63 60.34 106.7zM194.97 358.98C126.03 370.07 59.69 394.69 0 432c83.65 52.28 180.3 80 278.94 80h88.57L254.79 380.49c-14.74-17.2-37.45-25.11-59.82-21.51zM553.28 87.09c-5.67-3.8-9.28-9.96-9.28-16.78V8c0-4.42-3.58-8-8-8h-48c-4.42 0-8 3.58-8 8v62.31c0 22.02 10.17 43.41 28.64 55.39C550.79 153.04 576 199.54 576 249.69V280c0 4.42 3.58 8 8 8h48c4.42 0 8-3.58 8-8v-30.31c0-65.44-32.41-126.19-86.72-162.6zM360.89 352.05c-34.4.06-86.81.15-88.21.17l117.8 137.43A63.987 63.987 0 0 0 439.07 512h88.45L409.57 374.4a63.955 63.955 0 0 0-48.68-22.35zM616 352H432l117.99 137.65A63.987 63.987 0 0 0 598.58 512H616c13.25 0 24-10.75 24-24V376c0-13.26-10.75-24-24-24z\"]\n};\nvar faJournalWhills = {\n prefix: 'fas',\n iconName: 'journal-whills',\n icon: [448, 512, [], \"f66a\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM133.08 144.39l21.26 21.26c1.56 1.56 3.61 2.34 5.66 2.34s4.09-.78 5.66-2.34c3.12-3.12 3.12-8.19 0-11.31l-26.42-26.42c10-20.9 26.24-37.97 46.37-49.26C179.62 88.4 176 99.74 176 112c0 19.96 9.33 37.57 23.66 49.31C190.01 171.37 184 184.96 184 200c0 26.94 19.04 49.4 44.38 54.76l1.36-32.71-10.37 7.04c-.69.45-1.47.69-2.25.69-1 0-1.98-.38-2.75-1.09a4.006 4.006 0 0 1-.69-4.95l8.54-14.31-17.91-3.72c-1.86-.39-3.19-2.03-3.19-3.92s1.33-3.53 3.19-3.92l17.91-3.72-8.54-14.31c-.95-1.61-.67-3.67.69-4.95 1.36-1.3 3.44-1.44 5-.41l12.01 8.16L236 71.83c.09-2.14 1.86-3.83 4-3.83s3.91 1.69 4 3.83l4.68 112.29 14.2-9.65a4.067 4.067 0 0 1 5 .41 4.006 4.006 0 0 1 .69 4.95l-8.54 14.31 17.91 3.72c1.86.39 3.19 2.03 3.19 3.92s-1.33 3.53-3.19 3.92l-17.91 3.72 8.54 14.31c.95 1.61.67 3.67-.69 4.95-.77.72-1.77 1.09-2.75 1.09-.78 0-1.56-.23-2.25-.69l-12.68-8.62 1.43 34.28C276.96 249.4 296 226.94 296 200c0-15.04-6.01-28.63-15.66-38.69C294.67 149.57 304 131.96 304 112c0-12.26-3.62-23.6-9.6-33.33 20.13 11.28 36.37 28.36 46.37 49.26l-26.42 26.42c-3.12 3.12-3.12 8.19 0 11.31 1.56 1.56 3.61 2.34 5.66 2.34s4.09-.78 5.66-2.34l21.26-21.26c2.97 10.08 5.07 20.55 5.07 31.6 0 .52-.14.99-.15 1.51l-37.11 32.47a7.975 7.975 0 0 0-.75 11.28 7.97 7.97 0 0 0 6.02 2.73c1.88 0 3.75-.66 5.27-1.98l23.59-20.64C337.32 250.96 293.09 288 240 288s-97.32-37.04-108.86-86.62l23.59 20.64A7.957 7.957 0 0 0 160 224c2.22 0 4.44-.92 6.02-2.73 2.92-3.33 2.58-8.38-.75-11.28l-37.11-32.47c-.01-.52-.15-.99-.15-1.51-.01-11.06 2.09-21.53 5.07-31.62zM380.8 448H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8v64z\"]\n};\nvar faKaaba = {\n prefix: 'fas',\n iconName: 'kaaba',\n icon: [576, 512, [], \"f66b\", \"M554.12 83.51L318.36 4.93a95.962 95.962 0 0 0-60.71 0L21.88 83.51A32.006 32.006 0 0 0 0 113.87v49.01l265.02-79.51c15.03-4.5 30.92-4.5 45.98 0l265 79.51v-49.01c0-13.77-8.81-26-21.88-30.36zm-279.9 30.52L0 196.3v228.38c0 15 10.42 27.98 25.06 31.24l242.12 53.8a95.937 95.937 0 0 0 41.65 0l242.12-53.8c14.64-3.25 25.06-16.24 25.06-31.24V196.29l-274.2-82.26c-9.04-2.72-18.59-2.72-27.59 0zM128 230.11c0 3.61-2.41 6.77-5.89 7.72l-80 21.82C37.02 261.03 32 257.2 32 251.93v-16.58c0-3.61 2.41-6.77 5.89-7.72l80-21.82c5.09-1.39 10.11 2.44 10.11 7.72v16.58zm144-39.28c0 3.61-2.41 6.77-5.89 7.72l-96 26.18c-5.09 1.39-10.11-2.44-10.11-7.72v-16.58c0-3.61 2.41-6.77 5.89-7.72l96-26.18c5.09-1.39 10.11 2.44 10.11 7.72v16.58zm176 22.7c0-5.28 5.02-9.11 10.11-7.72l80 21.82c3.48.95 5.89 4.11 5.89 7.72v16.58c0 5.28-5.02 9.11-10.11 7.72l-80-21.82a7.997 7.997 0 0 1-5.89-7.72v-16.58zm-144-39.27c0-5.28 5.02-9.11 10.11-7.72l96 26.18c3.48.95 5.89 4.11 5.89 7.72v16.58c0 5.28-5.02 9.11-10.11 7.72l-96-26.18a7.997 7.997 0 0 1-5.89-7.72v-16.58z\"]\n};\nvar faKey = {\n prefix: 'fas',\n iconName: 'key',\n icon: [512, 512, [], \"f084\", \"M512 176.001C512 273.203 433.202 352 336 352c-11.22 0-22.19-1.062-32.827-3.069l-24.012 27.014A23.999 23.999 0 0 1 261.223 384H224v40c0 13.255-10.745 24-24 24h-40v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-78.059c0-6.365 2.529-12.47 7.029-16.971l161.802-161.802C163.108 213.814 160 195.271 160 176 160 78.798 238.797.001 335.999 0 433.488-.001 512 78.511 512 176.001zM336 128c0 26.51 21.49 48 48 48s48-21.49 48-48-21.49-48-48-48-48 21.49-48 48z\"]\n};\nvar faKeyboard = {\n prefix: 'fas',\n iconName: 'keyboard',\n icon: [576, 512, [], \"f11c\", \"M528 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM128 180v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm288 0v-40c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h232c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12z\"]\n};\nvar faKhanda = {\n prefix: 'fas',\n iconName: 'khanda',\n icon: [512, 512, [], \"f66d\", \"M415.81 66c-6.37-3.5-14.37-2.33-19.36 3.02a15.974 15.974 0 0 0-1.91 19.52c16.49 26.16 25.2 56.39 25.2 87.41-.19 53.25-26.77 102.69-71.27 132.41l-76.63 53.35v-20.1l44.05-36.09c3.92-4.2 5-10.09 2.81-15.28L310.85 273c33.84-19.26 56.94-55.25 56.94-96.99 0-40.79-22.02-76.13-54.59-95.71l5.22-11.44c2.34-5.53.93-11.83-3.57-16.04L255.86 0l-58.99 52.81c-4.5 4.21-5.9 10.51-3.57 16.04l5.22 11.44c-32.57 19.58-54.59 54.93-54.59 95.72 0 41.75 23.09 77.73 56.94 96.99l-7.85 17.24c-2.19 5.18-1.1 11.07 2.81 15.28l44.05 36.09v19.9l-76.59-53.33C119.02 278.62 92.44 229.19 92.26 176c0-31.08 8.71-61.31 25.2-87.47 3.87-6.16 2.4-13.77-2.59-19.08-5-5.34-13.68-6.2-20.02-2.7C16.32 109.6-22.3 205.3 13.36 295.99c7.07 17.99 17.89 34.38 30.46 49.06l55.97 65.36c4.87 5.69 13.04 7.24 19.65 3.72l79.35-42.23L228 392.23l-47.08 32.78c-1.67-.37-3.23-1.01-5.01-1.01-13.25 0-23.99 10.74-23.99 24 0 13.25 10.74 24 23.99 24 12.1 0 21.69-9.11 23.33-20.76l40.63-28.28v29.95c-9.39 5.57-15.99 15.38-15.99 27.1 0 17.67 14.32 32 31.98 32s31.98-14.33 31.98-32c0-11.71-6.61-21.52-15.99-27.1v-30.15l40.91 28.48C314.41 462.89 324 472 336.09 472c13.25 0 23.99-10.75 23.99-24 0-13.26-10.74-24-23.99-24-1.78 0-3.34.64-5.01 1.01L284 392.23l29.21-20.34 79.35 42.23c6.61 3.52 14.78 1.97 19.65-3.71l52.51-61.31c18.87-22.02 34-47.5 41.25-75.59 21.62-83.66-16.45-167.27-90.16-207.51zm-95.99 110c0 22.3-11.49 41.92-28.83 53.38l-5.65-12.41c-8.75-24.52-8.75-51.04 0-75.56l7.83-17.18c16.07 11.65 26.65 30.45 26.65 51.77zm-127.93 0c0-21.32 10.58-40.12 26.66-51.76l7.83 17.18c8.75 24.52 8.75 51.03 0 75.56l-5.65 12.41c-17.34-11.46-28.84-31.09-28.84-53.39z\"]\n};\nvar faKiss = {\n prefix: 'fas',\n iconName: 'kiss',\n icon: [496, 512, [], \"f596\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-80 232c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm136 156c0 19.2-28.7 41.5-71.5 44-8.5.8-12.1-11.8-3.6-15.4l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-6-2.5-6.1-12.2 0-14.8l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-8.6-3.6-4.8-16.5 3.6-15.4 42.8 2.5 71.5 24.8 71.5 44 0 13-13.4 27.3-35.2 36C290.6 368.7 304 383 304 396zm24-156c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faKissBeam = {\n prefix: 'fas',\n iconName: 'kiss-beam',\n icon: [496, 512, [], \"f597\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-39 219.9l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.5 8.5-10.9 12-15.1 4.5zM304 396c0 19.2-28.7 41.5-71.5 44-8.5.8-12.1-11.8-3.6-15.4l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-6-2.5-6.1-12.2 0-14.8l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-8.6-3.6-4.8-16.5 3.6-15.4 42.8 2.5 71.5 24.8 71.5 44 0 13-13.4 27.3-35.2 36C290.6 368.7 304 383 304 396zm65-168.1l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.3-15.6 4-14.9-4.5 3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.5 8.5-10.9 12-15.1 4.5z\"]\n};\nvar faKissWinkHeart = {\n prefix: 'fas',\n iconName: 'kiss-wink-heart',\n icon: [504, 512, [], \"f598\", \"M501.1 402.5c-8-20.8-31.5-31.5-53.1-25.9l-8.4 2.2-2.3-8.4c-5.9-21.4-27-36.5-49-33-25.2 4-40.6 28.6-34 52.6l22.9 82.6c1.5 5.3 7 8.5 12.4 7.1l83-21.5c24.1-6.3 37.7-31.8 28.5-55.7zm-177.6-4c-5.6-20.3-2.3-42 9-59.7 29.7-46.3 98.7-45.5 127.8 4.3 6.4.1 12.6 1.4 18.6 2.9 10.9-27.9 17.1-58.2 17.1-90C496 119 385 8 248 8S0 119 0 256s111 248 248 248c35.4 0 68.9-7.5 99.4-20.9-.3-.7-23.9-84.6-23.9-84.6zM168 240c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm120 156c0 19.2-28.7 41.5-71.5 44-8.5.8-12.1-11.8-3.6-15.4l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-6-2.5-5.7-12.3 0-14.8l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-8.8-3.7-4.6-16.6 3.6-15.4 42.8 2.5 71.5 24.8 71.5 44 0 13-13.4 27.3-35.2 36C274.6 368.7 288 383 288 396zm16-179c-8.3 7.4-21.6.4-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S400 181 404 206.2c1.7 11.1-11.3 18.3-19.8 10.8l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L304 217z\"]\n};\nvar faKiwiBird = {\n prefix: 'fas',\n iconName: 'kiwi-bird',\n icon: [576, 512, [], \"f535\", \"M575.81 217.98C572.64 157.41 518.28 112 457.63 112h-9.37c-52.82 0-104.25-16.25-147.74-46.24-41.99-28.96-96.04-41.62-153.21-28.7C129.3 41.12-.08 78.24 0 224c.04 70.95 38.68 132.8 95.99 166.01V464c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-54.26c15.36 3.96 31.4 6.26 48 6.26 5.44 0 10.68-.73 16-1.18V464c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-59.43c14.24-5.06 27.88-11.39 40.34-19.51C342.07 355.25 393.86 336 448.46 336c25.48 0 16.01-.31 23.05-.78l74.41 136.44c2.86 5.23 8.3 8.34 14.05 8.34 1.31 0 2.64-.16 3.95-.5 7.09-1.8 12.05-8.19 12.05-15.5 0 0 .14-240.24-.16-246.02zM463.97 248c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm80 153.25l-39.86-73.08c15.12-5.83 28.73-14.6 39.86-25.98v99.06z\"]\n};\nvar faLandmark = {\n prefix: 'fas',\n iconName: 'landmark',\n icon: [512, 512, [], \"f66f\", \"M501.62 92.11L267.24 2.04a31.958 31.958 0 0 0-22.47 0L10.38 92.11A16.001 16.001 0 0 0 0 107.09V144c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-36.91c0-6.67-4.14-12.64-10.38-14.98zM64 192v160H48c-8.84 0-16 7.16-16 16v48h448v-48c0-8.84-7.16-16-16-16h-16V192h-64v160h-96V192h-64v160h-96V192H64zm432 256H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faLanguage = {\n prefix: 'fas',\n iconName: 'language',\n icon: [640, 512, [], \"f1ab\", \"M152.1 236.2c-3.5-12.1-7.8-33.2-7.8-33.2h-.5s-4.3 21.1-7.8 33.2l-11.1 37.5H163zM616 96H336v320h280c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zm-24 120c0 6.6-5.4 12-12 12h-11.4c-6.9 23.6-21.7 47.4-42.7 69.9 8.4 6.4 17.1 12.5 26.1 18 5.5 3.4 7.3 10.5 4.1 16.2l-7.9 13.9c-3.4 5.9-10.9 7.8-16.7 4.3-12.6-7.8-24.5-16.1-35.4-24.9-10.9 8.7-22.7 17.1-35.4 24.9-5.8 3.5-13.3 1.6-16.7-4.3l-7.9-13.9c-3.2-5.6-1.4-12.8 4.2-16.2 9.3-5.7 18-11.7 26.1-18-7.9-8.4-14.9-17-21-25.7-4-5.7-2.2-13.6 3.7-17.1l6.5-3.9 7.3-4.3c5.4-3.2 12.4-1.7 16 3.4 5 7 10.8 14 17.4 20.9 13.5-14.2 23.8-28.9 30-43.2H412c-6.6 0-12-5.4-12-12v-16c0-6.6 5.4-12 12-12h64v-16c0-6.6 5.4-12 12-12h16c6.6 0 12 5.4 12 12v16h64c6.6 0 12 5.4 12 12zM0 120v272c0 13.3 10.7 24 24 24h280V96H24c-13.3 0-24 10.7-24 24zm58.9 216.1L116.4 167c1.7-4.9 6.2-8.1 11.4-8.1h32.5c5.1 0 9.7 3.3 11.4 8.1l57.5 169.1c2.6 7.8-3.1 15.9-11.4 15.9h-22.9a12 12 0 0 1-11.5-8.6l-9.4-31.9h-60.2l-9.1 31.8c-1.5 5.1-6.2 8.7-11.5 8.7H70.3c-8.2 0-14-8.1-11.4-15.9z\"]\n};\nvar faLaptop = {\n prefix: 'fas',\n iconName: 'laptop',\n icon: [640, 512, [], \"f109\", \"M624 416H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33.02-17.47-32.77-32H16c-8.8 0-16 7.2-16 16v16c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64v-16c0-8.8-7.2-16-16-16zM576 48c0-26.4-21.6-48-48-48H112C85.6 0 64 21.6 64 48v336h512V48zm-64 272H128V64h384v256z\"]\n};\nvar faLaptopCode = {\n prefix: 'fas',\n iconName: 'laptop-code',\n icon: [640, 512, [], \"f5fc\", \"M255.03 261.65c6.25 6.25 16.38 6.25 22.63 0l11.31-11.31c6.25-6.25 6.25-16.38 0-22.63L253.25 192l35.71-35.72c6.25-6.25 6.25-16.38 0-22.63l-11.31-11.31c-6.25-6.25-16.38-6.25-22.63 0l-58.34 58.34c-6.25 6.25-6.25 16.38 0 22.63l58.35 58.34zm96.01-11.3l11.31 11.31c6.25 6.25 16.38 6.25 22.63 0l58.34-58.34c6.25-6.25 6.25-16.38 0-22.63l-58.34-58.34c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63L386.75 192l-35.71 35.72c-6.25 6.25-6.25 16.38 0 22.63zM624 416H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33.02-17.47-32.77-32H16c-8.8 0-16 7.2-16 16v16c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64v-16c0-8.8-7.2-16-16-16zM576 48c0-26.4-21.6-48-48-48H112C85.6 0 64 21.6 64 48v336h512V48zm-64 272H128V64h384v256z\"]\n};\nvar faLaptopMedical = {\n prefix: 'fas',\n iconName: 'laptop-medical',\n icon: [640, 512, [], \"f812\", \"M232 224h56v56a8 8 0 0 0 8 8h48a8 8 0 0 0 8-8v-56h56a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8h-56v-56a8 8 0 0 0-8-8h-48a8 8 0 0 0-8 8v56h-56a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8zM576 48a48.14 48.14 0 0 0-48-48H112a48.14 48.14 0 0 0-48 48v336h512zm-64 272H128V64h384zm112 96H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33-17.47-32.77-32H16a16 16 0 0 0-16 16v16a64.19 64.19 0 0 0 64 64h512a64.19 64.19 0 0 0 64-64v-16a16 16 0 0 0-16-16z\"]\n};\nvar faLaugh = {\n prefix: 'fas',\n iconName: 'laugh',\n icon: [496, 512, [], \"f599\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 152c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm88 272h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18-8.9 71-69.5 126-142.9 126z\"]\n};\nvar faLaughBeam = {\n prefix: 'fas',\n iconName: 'laugh-beam',\n icon: [496, 512, [], \"f59a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm24 199.4c3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.8 4.1-15.1-4.5zm-160 0c3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.3 7.4-15.8 4-15.1-4.5zM398.9 306C390 377 329.4 432 256 432h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18z\"]\n};\nvar faLaughSquint = {\n prefix: 'fas',\n iconName: 'laugh-squint',\n icon: [496, 512, [], \"f59b\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm33.8 161.7l80-48c11.6-6.9 24 7.7 15.4 18L343.6 180l33.6 40.3c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.7-4.7-7.7-15.9 0-20.6zm-163-30c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.8 4.7 7.8 15.9 0 20.6l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3zM398.9 306C390 377 329.4 432 256 432h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18z\"]\n};\nvar faLaughWink = {\n prefix: 'fas',\n iconName: 'laugh-wink',\n icon: [496, 512, [], \"f59c\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm20.1 198.1c4-25.2 34.2-42.1 59.9-42.1s55.9 16.9 59.9 42.1c1.7 11.1-11.4 18.3-19.8 10.8l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L288 217c-8.4 7.4-21.6.3-19.9-10.9zM168 160c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm230.9 146C390 377 329.4 432 256 432h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18z\"]\n};\nvar faLayerGroup = {\n prefix: 'fas',\n iconName: 'layer-group',\n icon: [512, 512, [], \"f5fd\", \"M12.41 148.02l232.94 105.67c6.8 3.09 14.49 3.09 21.29 0l232.94-105.67c16.55-7.51 16.55-32.52 0-40.03L266.65 2.31a25.607 25.607 0 0 0-21.29 0L12.41 107.98c-16.55 7.51-16.55 32.53 0 40.04zm487.18 88.28l-58.09-26.33-161.64 73.27c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.51 209.97l-58.1 26.33c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 276.3c16.55-7.5 16.55-32.5 0-40zm0 127.8l-57.87-26.23-161.86 73.37c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.29 337.87 12.41 364.1c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 404.1c16.55-7.5 16.55-32.5 0-40z\"]\n};\nvar faLeaf = {\n prefix: 'fas',\n iconName: 'leaf',\n icon: [576, 512, [], \"f06c\", \"M546.2 9.7c-5.6-12.5-21.6-13-28.3-1.2C486.9 62.4 431.4 96 368 96h-80C182 96 96 182 96 288c0 7 .8 13.7 1.5 20.5C161.3 262.8 253.4 224 384 224c8.8 0 16 7.2 16 16s-7.2 16-16 16C132.6 256 26 410.1 2.4 468c-6.6 16.3 1.2 34.9 17.5 41.6 16.4 6.8 35-1.1 41.8-17.3 1.5-3.6 20.9-47.9 71.9-90.6 32.4 43.9 94 85.8 174.9 77.2C465.5 467.5 576 326.7 576 154.3c0-50.2-10.8-102.2-29.8-144.6z\"]\n};\nvar faLemon = {\n prefix: 'fas',\n iconName: 'lemon',\n icon: [512, 512, [], \"f094\", \"M489.038 22.963C465.944-.13 434.648-5.93 413.947 6.129c-58.906 34.312-181.25-53.077-321.073 86.746S40.441 355.041 6.129 413.945c-12.059 20.702-6.26 51.999 16.833 75.093 23.095 23.095 54.392 28.891 75.095 16.832 58.901-34.31 181.246 53.079 321.068-86.743S471.56 156.96 505.871 98.056c12.059-20.702 6.261-51.999-16.833-75.093zM243.881 95.522c-58.189 14.547-133.808 90.155-148.358 148.358-1.817 7.27-8.342 12.124-15.511 12.124-1.284 0-2.59-.156-3.893-.481-8.572-2.144-13.784-10.83-11.642-19.403C81.901 166.427 166.316 81.93 236.119 64.478c8.575-2.143 17.261 3.069 19.403 11.642s-3.069 17.259-11.641 19.402z\"]\n};\nvar faLessThan = {\n prefix: 'fas',\n iconName: 'less-than',\n icon: [384, 512, [], \"f536\", \"M365.46 357.74L147.04 255.89l218.47-101.88c16.02-7.47 22.95-26.51 15.48-42.53l-13.52-29C360 66.46 340.96 59.53 324.94 67L18.48 209.91a32.014 32.014 0 0 0-18.48 29v34.24c0 12.44 7.21 23.75 18.48 29l306.31 142.83c16.06 7.49 35.15.54 42.64-15.52l13.56-29.08c7.49-16.06.54-35.15-15.53-42.64z\"]\n};\nvar faLessThanEqual = {\n prefix: 'fas',\n iconName: 'less-than-equal',\n icon: [448, 512, [], \"f537\", \"M54.98 214.2l301.41 119.87c18.39 6.03 38.71-2.54 45.38-19.15l12.09-30.08c6.68-16.61-2.82-34.97-21.21-41l-175.44-68.05 175.56-68.09c18.29-6 27.74-24.27 21.1-40.79l-12.03-29.92c-6.64-16.53-26.86-25.06-45.15-19.06L54.98 137.89C41.21 142.41 32 154.5 32 168.07v15.96c0 13.56 9.21 25.65 22.98 30.17zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"]\n};\nvar faLevelDownAlt = {\n prefix: 'fas',\n iconName: 'level-down-alt',\n icon: [320, 512, [], \"f3be\", \"M313.553 392.331L209.587 504.334c-9.485 10.214-25.676 10.229-35.174 0L70.438 392.331C56.232 377.031 67.062 352 88.025 352H152V80H68.024a11.996 11.996 0 0 1-8.485-3.515l-56-56C-4.021 12.926 1.333 0 12.024 0H208c13.255 0 24 10.745 24 24v328h63.966c20.878 0 31.851 24.969 17.587 40.331z\"]\n};\nvar faLevelUpAlt = {\n prefix: 'fas',\n iconName: 'level-up-alt',\n icon: [320, 512, [], \"f3bf\", \"M313.553 119.669L209.587 7.666c-9.485-10.214-25.676-10.229-35.174 0L70.438 119.669C56.232 134.969 67.062 160 88.025 160H152v272H68.024a11.996 11.996 0 0 0-8.485 3.515l-56 56C-4.021 499.074 1.333 512 12.024 512H208c13.255 0 24-10.745 24-24V160h63.966c20.878 0 31.851-24.969 17.587-40.331z\"]\n};\nvar faLifeRing = {\n prefix: 'fas',\n iconName: 'life-ring',\n icon: [512, 512, [], \"f1cd\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm173.696 119.559l-63.399 63.399c-10.987-18.559-26.67-34.252-45.255-45.255l63.399-63.399a218.396 218.396 0 0 1 45.255 45.255zM256 352c-53.019 0-96-42.981-96-96s42.981-96 96-96 96 42.981 96 96-42.981 96-96 96zM127.559 82.304l63.399 63.399c-18.559 10.987-34.252 26.67-45.255 45.255l-63.399-63.399a218.372 218.372 0 0 1 45.255-45.255zM82.304 384.441l63.399-63.399c10.987 18.559 26.67 34.252 45.255 45.255l-63.399 63.399a218.396 218.396 0 0 1-45.255-45.255zm302.137 45.255l-63.399-63.399c18.559-10.987 34.252-26.67 45.255-45.255l63.399 63.399a218.403 218.403 0 0 1-45.255 45.255z\"]\n};\nvar faLightbulb = {\n prefix: 'fas',\n iconName: 'lightbulb',\n icon: [352, 512, [], \"f0eb\", \"M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z\"]\n};\nvar faLink = {\n prefix: 'fas',\n iconName: 'link',\n icon: [512, 512, [], \"f0c1\", \"M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z\"]\n};\nvar faLiraSign = {\n prefix: 'fas',\n iconName: 'lira-sign',\n icon: [384, 512, [], \"f195\", \"M371.994 256h-48.019C317.64 256 312 260.912 312 267.246 312 368 230.179 416 144 416V256.781l134.603-29.912A12 12 0 0 0 288 215.155v-40.976c0-7.677-7.109-13.38-14.603-11.714L144 191.219V160.78l134.603-29.912A12 12 0 0 0 288 119.154V78.179c0-7.677-7.109-13.38-14.603-11.714L144 95.219V44c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v68.997L9.397 125.131A12 12 0 0 0 0 136.845v40.976c0 7.677 7.109 13.38 14.603 11.714L64 178.558v30.439L9.397 221.131A12 12 0 0 0 0 232.845v40.976c0 7.677 7.109 13.38 14.603 11.714L64 274.558V468c0 6.627 5.373 12 12 12h79.583c134.091 0 223.255-77.834 228.408-211.592.261-6.782-5.211-12.408-11.997-12.408z\"]\n};\nvar faList = {\n prefix: 'fas',\n iconName: 'list',\n icon: [512, 512, [], \"f03a\", \"M80 368H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm0-320H16A16 16 0 0 0 0 64v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16V64a16 16 0 0 0-16-16zm0 160H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm416 176H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faListAlt = {\n prefix: 'fas',\n iconName: 'list-alt',\n icon: [512, 512, [], \"f022\", \"M464 480H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48zM128 120c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zm0 96c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zm0 96c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zm288-136v-32c0-6.627-5.373-12-12-12H204c-6.627 0-12 5.373-12 12v32c0 6.627 5.373 12 12 12h200c6.627 0 12-5.373 12-12zm0 96v-32c0-6.627-5.373-12-12-12H204c-6.627 0-12 5.373-12 12v32c0 6.627 5.373 12 12 12h200c6.627 0 12-5.373 12-12zm0 96v-32c0-6.627-5.373-12-12-12H204c-6.627 0-12 5.373-12 12v32c0 6.627 5.373 12 12 12h200c6.627 0 12-5.373 12-12z\"]\n};\nvar faListOl = {\n prefix: 'fas',\n iconName: 'list-ol',\n icon: [512, 512, [], \"f0cb\", \"M61.77 401l17.5-20.15a19.92 19.92 0 0 0 5.07-14.19v-3.31C84.34 356 80.5 352 73 352H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8h22.83a157.41 157.41 0 0 0-11 12.31l-5.61 7c-4 5.07-5.25 10.13-2.8 14.88l1.05 1.93c3 5.76 6.29 7.88 12.25 7.88h4.73c10.33 0 15.94 2.44 15.94 9.09 0 4.72-4.2 8.22-14.36 8.22a41.54 41.54 0 0 1-15.47-3.12c-6.49-3.88-11.74-3.5-15.6 3.12l-5.59 9.31c-3.72 6.13-3.19 11.72 2.63 15.94 7.71 4.69 20.38 9.44 37 9.44 34.16 0 48.5-22.75 48.5-44.12-.03-14.38-9.12-29.76-28.73-34.88zM496 224H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM16 160h64a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H64V40a8 8 0 0 0-8-8H32a8 8 0 0 0-7.14 4.42l-8 16A8 8 0 0 0 24 64h8v64H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8zm-3.91 160H80a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H41.32c3.29-10.29 48.34-18.68 48.34-56.44 0-29.06-25-39.56-44.47-39.56-21.36 0-33.8 10-40.46 18.75-4.37 5.59-3 10.84 2.8 15.37l8.58 6.88c5.61 4.56 11 2.47 16.12-2.44a13.44 13.44 0 0 1 9.46-3.84c3.33 0 9.28 1.56 9.28 8.75C51 248.19 0 257.31 0 304.59v4C0 316 5.08 320 12.09 320z\"]\n};\nvar faListUl = {\n prefix: 'fas',\n iconName: 'list-ul',\n icon: [512, 512, [], \"f0ca\", \"M48 48a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm448 16H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faLocationArrow = {\n prefix: 'fas',\n iconName: 'location-arrow',\n icon: [512, 512, [], \"f124\", \"M444.52 3.52L28.74 195.42c-47.97 22.39-31.98 92.75 19.19 92.75h175.91v175.91c0 51.17 70.36 67.17 92.75 19.19l191.9-415.78c15.99-38.39-25.59-79.97-63.97-63.97z\"]\n};\nvar faLock = {\n prefix: 'fas',\n iconName: 'lock',\n icon: [448, 512, [], \"f023\", \"M400 224h-24v-72C376 68.2 307.8 0 224 0S72 68.2 72 152v72H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48zm-104 0H152v-72c0-39.7 32.3-72 72-72s72 32.3 72 72v72z\"]\n};\nvar faLockOpen = {\n prefix: 'fas',\n iconName: 'lock-open',\n icon: [576, 512, [], \"f3c1\", \"M423.5 0C339.5.3 272 69.5 272 153.5V224H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48h-48v-71.1c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v80c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-80C576 68 507.5-.3 423.5 0z\"]\n};\nvar faLongArrowAltDown = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-down',\n icon: [256, 512, [], \"f309\", \"M168 345.941V44c0-6.627-5.373-12-12-12h-56c-6.627 0-12 5.373-12 12v301.941H41.941c-21.382 0-32.09 25.851-16.971 40.971l86.059 86.059c9.373 9.373 24.569 9.373 33.941 0l86.059-86.059c15.119-15.119 4.411-40.971-16.971-40.971H168z\"]\n};\nvar faLongArrowAltLeft = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-left',\n icon: [448, 512, [], \"f30a\", \"M134.059 296H436c6.627 0 12-5.373 12-12v-56c0-6.627-5.373-12-12-12H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.569 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296z\"]\n};\nvar faLongArrowAltRight = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-right',\n icon: [448, 512, [], \"f30b\", \"M313.941 216H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h301.941v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.569 0-33.941l-86.059-86.059c-15.119-15.119-40.971-4.411-40.971 16.971V216z\"]\n};\nvar faLongArrowAltUp = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-up',\n icon: [256, 512, [], \"f30c\", \"M88 166.059V468c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12V166.059h46.059c21.382 0 32.09-25.851 16.971-40.971l-86.059-86.059c-9.373-9.373-24.569-9.373-33.941 0l-86.059 86.059c-15.119 15.119-4.411 40.971 16.971 40.971H88z\"]\n};\nvar faLowVision = {\n prefix: 'fas',\n iconName: 'low-vision',\n icon: [576, 512, [], \"f2a8\", \"M569.344 231.631C512.96 135.949 407.81 72 288 72c-28.468 0-56.102 3.619-82.451 10.409L152.778 10.24c-7.601-10.858-22.564-13.5-33.423-5.9l-13.114 9.178c-10.86 7.601-13.502 22.566-5.9 33.426l43.131 58.395C89.449 131.73 40.228 174.683 6.682 231.581c-.01.017-.023.033-.034.05-8.765 14.875-8.964 33.528 0 48.739 38.5 65.332 99.742 115.862 172.859 141.349L55.316 244.302A272.194 272.194 0 0 1 83.61 208.39l119.4 170.58h.01l40.63 58.04a330.055 330.055 0 0 0 78.94 1.17l-189.98-271.4a277.628 277.628 0 0 1 38.777-21.563l251.836 356.544c7.601 10.858 22.564 13.499 33.423 5.9l13.114-9.178c10.86-7.601 13.502-22.567 5.9-33.426l-43.12-58.377-.007-.009c57.161-27.978 104.835-72.04 136.81-126.301a47.938 47.938 0 0 0 .001-48.739zM390.026 345.94l-19.066-27.23c24.682-32.567 27.711-76.353 8.8-111.68v.03c0 23.65-19.17 42.82-42.82 42.82-23.828 0-42.82-19.349-42.82-42.82 0-23.65 19.17-42.82 42.82-42.82h.03c-24.75-13.249-53.522-15.643-79.51-7.68l-19.068-27.237C253.758 123.306 270.488 120 288 120c75.162 0 136 60.826 136 136 0 34.504-12.833 65.975-33.974 89.94z\"]\n};\nvar faLuggageCart = {\n prefix: 'fas',\n iconName: 'luggage-cart',\n icon: [640, 512, [], \"f59d\", \"M224 320h32V96h-32c-17.67 0-32 14.33-32 32v160c0 17.67 14.33 32 32 32zm352-32V128c0-17.67-14.33-32-32-32h-32v224h32c17.67 0 32-14.33 32-32zm48 96H128V16c0-8.84-7.16-16-16-16H16C7.16 0 0 7.16 0 16v32c0 8.84 7.16 16 16 16h48v368c0 8.84 7.16 16 16 16h82.94c-1.79 5.03-2.94 10.36-2.94 16 0 26.51 21.49 48 48 48s48-21.49 48-48c0-5.64-1.15-10.97-2.94-16h197.88c-1.79 5.03-2.94 10.36-2.94 16 0 26.51 21.49 48 48 48s48-21.49 48-48c0-5.64-1.15-10.97-2.94-16H624c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM480 96V48c0-26.51-21.49-48-48-48h-96c-26.51 0-48 21.49-48 48v272h192V96zm-48 0h-96V48h96v48z\"]\n};\nvar faMagic = {\n prefix: 'fas',\n iconName: 'magic',\n icon: [512, 512, [], \"f0d0\", \"M224 96l16-32 32-16-32-16-16-32-16 32-32 16 32 16 16 32zM80 160l26.66-53.33L160 80l-53.34-26.67L80 0 53.34 53.33 0 80l53.34 26.67L80 160zm352 128l-26.66 53.33L352 368l53.34 26.67L432 448l26.66-53.33L512 368l-53.34-26.67L432 288zm70.62-193.77L417.77 9.38C411.53 3.12 403.34 0 395.15 0c-8.19 0-16.38 3.12-22.63 9.38L9.38 372.52c-12.5 12.5-12.5 32.76 0 45.25l84.85 84.85c6.25 6.25 14.44 9.37 22.62 9.37 8.19 0 16.38-3.12 22.63-9.37l363.14-363.15c12.5-12.48 12.5-32.75 0-45.24zM359.45 203.46l-50.91-50.91 86.6-86.6 50.91 50.91-86.6 86.6z\"]\n};\nvar faMagnet = {\n prefix: 'fas',\n iconName: 'magnet',\n icon: [512, 512, [], \"f076\", \"M164.07 148.1H12a12 12 0 0 1-12-12v-80a36 36 0 0 1 36-36h104a36 36 0 0 1 36 36v80a11.89 11.89 0 0 1-11.93 12zm347.93-12V56a36 36 0 0 0-36-36H372a36 36 0 0 0-36 36v80a12 12 0 0 0 12 12h152a11.89 11.89 0 0 0 12-11.9zm-164 44a12 12 0 0 0-12 12v52c0 128.1-160 127.9-160 0v-52a12 12 0 0 0-12-12H12.1a12 12 0 0 0-12 12.1c.1 21.4.6 40.3 0 53.3 0 150.6 136.17 246.6 256.75 246.6s255-96 255-246.7c-.6-12.8-.2-33 0-53.2a12 12 0 0 0-12-12.1z\"]\n};\nvar faMailBulk = {\n prefix: 'fas',\n iconName: 'mail-bulk',\n icon: [576, 512, [], \"f674\", \"M160 448c-25.6 0-51.2-22.4-64-32-64-44.8-83.2-60.8-96-70.4V480c0 17.67 14.33 32 32 32h256c17.67 0 32-14.33 32-32V345.6c-12.8 9.6-32 25.6-96 70.4-12.8 9.6-38.4 32-64 32zm128-192H32c-17.67 0-32 14.33-32 32v16c25.6 19.2 22.4 19.2 115.2 86.4 9.6 6.4 28.8 25.6 44.8 25.6s35.2-19.2 44.8-22.4c92.8-67.2 89.6-67.2 115.2-86.4V288c0-17.67-14.33-32-32-32zm256-96H224c-17.67 0-32 14.33-32 32v32h96c33.21 0 60.59 25.42 63.71 57.82l.29-.22V416h192c17.67 0 32-14.33 32-32V192c0-17.67-14.33-32-32-32zm-32 128h-64v-64h64v64zm-352-96c0-35.29 28.71-64 64-64h224V32c0-17.67-14.33-32-32-32H96C78.33 0 64 14.33 64 32v192h96v-32z\"]\n};\nvar faMale = {\n prefix: 'fas',\n iconName: 'male',\n icon: [192, 512, [], \"f183\", \"M96 0c35.346 0 64 28.654 64 64s-28.654 64-64 64-64-28.654-64-64S60.654 0 96 0m48 144h-11.36c-22.711 10.443-49.59 10.894-73.28 0H48c-26.51 0-48 21.49-48 48v136c0 13.255 10.745 24 24 24h16v136c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24V352h16c13.255 0 24-10.745 24-24V192c0-26.51-21.49-48-48-48z\"]\n};\nvar faMap = {\n prefix: 'fas',\n iconName: 'map',\n icon: [576, 512, [], \"f279\", \"M0 117.66v346.32c0 11.32 11.43 19.06 21.94 14.86L160 416V32L20.12 87.95A32.006 32.006 0 0 0 0 117.66zM192 416l192 64V96L192 32v384zM554.06 33.16L416 96v384l139.88-55.95A31.996 31.996 0 0 0 576 394.34V48.02c0-11.32-11.43-19.06-21.94-14.86z\"]\n};\nvar faMapMarked = {\n prefix: 'fas',\n iconName: 'map-marked',\n icon: [576, 512, [], \"f59f\", \"M288 0c-69.59 0-126 56.41-126 126 0 56.26 82.35 158.8 113.9 196.02 6.39 7.54 17.82 7.54 24.2 0C331.65 284.8 414 182.26 414 126 414 56.41 357.59 0 288 0zM20.12 215.95A32.006 32.006 0 0 0 0 245.66v250.32c0 11.32 11.43 19.06 21.94 14.86L160 448V214.92c-8.84-15.98-16.07-31.54-21.25-46.42L20.12 215.95zM288 359.67c-14.07 0-27.38-6.18-36.51-16.96-19.66-23.2-40.57-49.62-59.49-76.72v182l192 64V266c-18.92 27.09-39.82 53.52-59.49 76.72-9.13 10.77-22.44 16.95-36.51 16.95zm266.06-198.51L416 224v288l139.88-55.95A31.996 31.996 0 0 0 576 426.34V176.02c0-11.32-11.43-19.06-21.94-14.86z\"]\n};\nvar faMapMarkedAlt = {\n prefix: 'fas',\n iconName: 'map-marked-alt',\n icon: [576, 512, [], \"f5a0\", \"M288 0c-69.59 0-126 56.41-126 126 0 56.26 82.35 158.8 113.9 196.02 6.39 7.54 17.82 7.54 24.2 0C331.65 284.8 414 182.26 414 126 414 56.41 357.59 0 288 0zm0 168c-23.2 0-42-18.8-42-42s18.8-42 42-42 42 18.8 42 42-18.8 42-42 42zM20.12 215.95A32.006 32.006 0 0 0 0 245.66v250.32c0 11.32 11.43 19.06 21.94 14.86L160 448V214.92c-8.84-15.98-16.07-31.54-21.25-46.42L20.12 215.95zM288 359.67c-14.07 0-27.38-6.18-36.51-16.96-19.66-23.2-40.57-49.62-59.49-76.72v182l192 64V266c-18.92 27.09-39.82 53.52-59.49 76.72-9.13 10.77-22.44 16.95-36.51 16.95zm266.06-198.51L416 224v288l139.88-55.95A31.996 31.996 0 0 0 576 426.34V176.02c0-11.32-11.43-19.06-21.94-14.86z\"]\n};\nvar faMapMarker = {\n prefix: 'fas',\n iconName: 'map-marker',\n icon: [384, 512, [], \"f041\", \"M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0z\"]\n};\nvar faMapMarkerAlt = {\n prefix: 'fas',\n iconName: 'map-marker-alt',\n icon: [384, 512, [], \"f3c5\", \"M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z\"]\n};\nvar faMapPin = {\n prefix: 'fas',\n iconName: 'map-pin',\n icon: [288, 512, [], \"f276\", \"M112 316.94v156.69l22.02 33.02c4.75 7.12 15.22 7.12 19.97 0L176 473.63V316.94c-10.39 1.92-21.06 3.06-32 3.06s-21.61-1.14-32-3.06zM144 0C64.47 0 0 64.47 0 144s64.47 144 144 144 144-64.47 144-144S223.53 0 144 0zm0 76c-37.5 0-68 30.5-68 68 0 6.62-5.38 12-12 12s-12-5.38-12-12c0-50.73 41.28-92 92-92 6.62 0 12 5.38 12 12s-5.38 12-12 12z\"]\n};\nvar faMapSigns = {\n prefix: 'fas',\n iconName: 'map-signs',\n icon: [512, 512, [], \"f277\", \"M507.31 84.69L464 41.37c-6-6-14.14-9.37-22.63-9.37H288V16c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v16H56c-13.25 0-24 10.75-24 24v80c0 13.25 10.75 24 24 24h385.37c8.49 0 16.62-3.37 22.63-9.37l43.31-43.31c6.25-6.26 6.25-16.38 0-22.63zM224 496c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V384h-64v112zm232-272H288v-32h-64v32H70.63c-8.49 0-16.62 3.37-22.63 9.37L4.69 276.69c-6.25 6.25-6.25 16.38 0 22.63L48 342.63c6 6 14.14 9.37 22.63 9.37H456c13.25 0 24-10.75 24-24v-80c0-13.25-10.75-24-24-24z\"]\n};\nvar faMarker = {\n prefix: 'fas',\n iconName: 'marker',\n icon: [512, 512, [], \"f5a1\", \"M93.95 290.03A327.038 327.038 0 0 0 .17 485.11l-.03.23c-1.7 15.28 11.21 28.2 26.49 26.51a327.02 327.02 0 0 0 195.34-93.8l75.4-75.4-128.02-128.02-75.4 75.4zM485.49 26.51c-35.35-35.35-92.67-35.35-128.02 0l-21.76 21.76-36.56-36.55c-15.62-15.62-40.95-15.62-56.56 0L138.47 115.84c-6.25 6.25-6.25 16.38 0 22.63l22.62 22.62c6.25 6.25 16.38 6.25 22.63 0l87.15-87.15 19.59 19.59L191.98 192 320 320.02l165.49-165.49c35.35-35.35 35.35-92.66 0-128.02z\"]\n};\nvar faMars = {\n prefix: 'fas',\n iconName: 'mars',\n icon: [384, 512, [], \"f222\", \"M372 64h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-80.7 80.7c-22.2-14-48.5-22.1-76.7-22.1C64.5 160 0 224.5 0 304s64.5 144 144 144 144-64.5 144-144c0-28.2-8.1-54.5-22.1-76.7l80.7-80.7 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V76c0-6.6-5.4-12-12-12zM144 384c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faMarsDouble = {\n prefix: 'fas',\n iconName: 'mars-double',\n icon: [512, 512, [], \"f227\", \"M340 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-48.7 48.7C198.5 72.1 172.2 64 144 64 64.5 64 0 128.5 0 208s64.5 144 144 144 144-64.5 144-144c0-28.2-8.1-54.5-22.1-76.7l48.7-48.7 16.9 16.9c2.4 2.4 5.5 3.5 8.4 3.5 6.2 0 12.1-4.8 12.1-12V12c0-6.6-5.4-12-12-12zM144 288c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80zm356-128.1h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-48.7 48.7c-18.2-11.4-39-18.9-61.5-21.3-2.1 21.8-8.2 43.3-18.4 63.3 1.1 0 2.2-.1 3.2-.1 44.1 0 80 35.9 80 80s-35.9 80-80 80-80-35.9-80-80c0-1.1 0-2.2.1-3.2-20 10.2-41.5 16.4-63.3 18.4C168.4 455.6 229.6 512 304 512c79.5 0 144-64.5 144-144 0-28.2-8.1-54.5-22.1-76.7l48.7-48.7 16.9 16.9c2.4 2.4 5.4 3.5 8.4 3.5 6.2 0 12.1-4.8 12.1-12v-79c0-6.7-5.4-12.1-12-12.1z\"]\n};\nvar faMarsStroke = {\n prefix: 'fas',\n iconName: 'mars-stroke',\n icon: [384, 512, [], \"f229\", \"M372 64h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-17.5 17.5-14.1-14.1c-4.7-4.7-12.3-4.7-17 0L224.5 133c-4.7 4.7-4.7 12.3 0 17l14.1 14.1-18 18c-22.2-14-48.5-22.1-76.7-22.1C64.5 160 0 224.5 0 304s64.5 144 144 144 144-64.5 144-144c0-28.2-8.1-54.5-22.1-76.7l18-18 14.1 14.1c4.7 4.7 12.3 4.7 17 0l28.3-28.3c4.7-4.7 4.7-12.3 0-17L329.2 164l17.5-17.5 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V76c-.1-6.6-5.5-12-12.1-12zM144 384c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faMarsStrokeH = {\n prefix: 'fas',\n iconName: 'mars-stroke-h',\n icon: [480, 512, [], \"f22b\", \"M476.2 247.5l-55.9-55.9c-7.6-7.6-20.5-2.2-20.5 8.5V224H376v-20c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v20h-27.6c-5.8-25.6-18.7-49.9-38.6-69.8C189.6 98 98.4 98 42.2 154.2c-56.2 56.2-56.2 147.4 0 203.6 56.2 56.2 147.4 56.2 203.6 0 19.9-19.9 32.8-44.2 38.6-69.8H312v20c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-20h23.9v23.9c0 10.7 12.9 16 20.5 8.5l55.9-55.9c4.6-4.7 4.6-12.3-.1-17zm-275.6 65.1c-31.2 31.2-81.9 31.2-113.1 0-31.2-31.2-31.2-81.9 0-113.1 31.2-31.2 81.9-31.2 113.1 0 31.2 31.1 31.2 81.9 0 113.1z\"]\n};\nvar faMarsStrokeV = {\n prefix: 'fas',\n iconName: 'mars-stroke-v',\n icon: [288, 512, [], \"f22a\", \"M245.8 234.2c-19.9-19.9-44.2-32.8-69.8-38.6v-25.4h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V81.4h23.9c10.7 0 16-12.9 8.5-20.5L152.5 5.1c-4.7-4.7-12.3-4.7-17 0L79.6 61c-7.6 7.6-2.2 20.5 8.5 20.5H112v24.7H92c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h20v25.4c-25.6 5.8-49.9 18.7-69.8 38.6-56.2 56.2-56.2 147.4 0 203.6 56.2 56.2 147.4 56.2 203.6 0 56.3-56.2 56.3-147.4 0-203.6zm-45.2 158.4c-31.2 31.2-81.9 31.2-113.1 0-31.2-31.2-31.2-81.9 0-113.1 31.2-31.2 81.9-31.2 113.1 0 31.2 31.1 31.2 81.9 0 113.1z\"]\n};\nvar faMask = {\n prefix: 'fas',\n iconName: 'mask',\n icon: [640, 512, [], \"f6fa\", \"M320.67 64c-442.6 0-357.57 384-158.46 384 39.9 0 77.47-20.69 101.42-55.86l25.73-37.79c15.66-22.99 46.97-22.99 62.63 0l25.73 37.79C401.66 427.31 439.23 448 479.13 448c189.86 0 290.63-384-158.46-384zM184 308.36c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05zm272 0c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05z\"]\n};\nvar faMedal = {\n prefix: 'fas',\n iconName: 'medal',\n icon: [512, 512, [], \"f5a2\", \"M223.75 130.75L154.62 15.54A31.997 31.997 0 0 0 127.18 0H16.03C3.08 0-4.5 14.57 2.92 25.18l111.27 158.96c29.72-27.77 67.52-46.83 109.56-53.39zM495.97 0H384.82c-11.24 0-21.66 5.9-27.44 15.54l-69.13 115.21c42.04 6.56 79.84 25.62 109.56 53.38L509.08 25.18C516.5 14.57 508.92 0 495.97 0zM256 160c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm92.52 157.26l-37.93 36.96 8.97 52.22c1.6 9.36-8.26 16.51-16.65 12.09L256 393.88l-46.9 24.65c-8.4 4.45-18.25-2.74-16.65-12.09l8.97-52.22-37.93-36.96c-6.82-6.64-3.05-18.23 6.35-19.59l52.43-7.64 23.43-47.52c2.11-4.28 6.19-6.39 10.28-6.39 4.11 0 8.22 2.14 10.33 6.39l23.43 47.52 52.43 7.64c9.4 1.36 13.17 12.95 6.35 19.59z\"]\n};\nvar faMedkit = {\n prefix: 'fas',\n iconName: 'medkit',\n icon: [512, 512, [], \"f0fa\", \"M96 480h320V128h-32V80c0-26.51-21.49-48-48-48H176c-26.51 0-48 21.49-48 48v48H96v352zm96-384h128v32H192V96zm320 80v256c0 26.51-21.49 48-48 48h-16V128h16c26.51 0 48 21.49 48 48zM64 480H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v352zm288-208v32c0 8.837-7.163 16-16 16h-48v48c0 8.837-7.163 16-16 16h-32c-8.837 0-16-7.163-16-16v-48h-48c-8.837 0-16-7.163-16-16v-32c0-8.837 7.163-16 16-16h48v-48c0-8.837 7.163-16 16-16h32c8.837 0 16 7.163 16 16v48h48c8.837 0 16 7.163 16 16z\"]\n};\nvar faMeh = {\n prefix: 'fas',\n iconName: 'meh',\n icon: [496, 512, [], \"f11a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm176 192H152c-21.2 0-21.2-32 0-32h192c21.2 0 21.2 32 0 32zm-16-128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faMehBlank = {\n prefix: 'fas',\n iconName: 'meh-blank',\n icon: [496, 512, [], \"f5a4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-80 232c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faMehRollingEyes = {\n prefix: 'fas',\n iconName: 'meh-rolling-eyes',\n icon: [496, 512, [], \"f5a5\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM88 224c0-24.3 13.7-45.2 33.6-56-.7 2.6-1.6 5.2-1.6 8 0 17.7 14.3 32 32 32s32-14.3 32-32c0-2.8-.9-5.4-1.6-8 19.9 10.8 33.6 31.7 33.6 56 0 35.3-28.7 64-64 64s-64-28.7-64-64zm224 176H184c-21.2 0-21.2-32 0-32h128c21.2 0 21.2 32 0 32zm32-112c-35.3 0-64-28.7-64-64 0-24.3 13.7-45.2 33.6-56-.7 2.6-1.6 5.2-1.6 8 0 17.7 14.3 32 32 32s32-14.3 32-32c0-2.8-.9-5.4-1.6-8 19.9 10.8 33.6 31.7 33.6 56 0 35.3-28.7 64-64 64z\"]\n};\nvar faMemory = {\n prefix: 'fas',\n iconName: 'memory',\n icon: [640, 512, [], \"f538\", \"M640 130.94V96c0-17.67-14.33-32-32-32H32C14.33 64 0 78.33 0 96v34.94c18.6 6.61 32 24.19 32 45.06s-13.4 38.45-32 45.06V320h640v-98.94c-18.6-6.61-32-24.19-32-45.06s13.4-38.45 32-45.06zM224 256h-64V128h64v128zm128 0h-64V128h64v128zm128 0h-64V128h64v128zM0 448h64v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h128v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h128v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h128v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h64v-96H0v96z\"]\n};\nvar faMenorah = {\n prefix: 'fas',\n iconName: 'menorah',\n icon: [640, 512, [], \"f676\", \"M144 128h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm96 0h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm192 0h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm96 0h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm80-32c17.67 0 32-14.33 32-32S608 0 608 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S512 0 512 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S416 0 416 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S320 0 320 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S224 0 224 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S128 0 128 0 96 46.33 96 64s14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S32 0 32 0 0 46.33 0 64s14.33 32 32 32zm544 192c0 17.67-14.33 32-32 32H352V144c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v176H96c-17.67 0-32-14.33-32-32V144c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v144c0 53.02 42.98 96 96 96h192v64H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16H352v-64h192c53.02 0 96-42.98 96-96V144c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v144z\"]\n};\nvar faMercury = {\n prefix: 'fas',\n iconName: 'mercury',\n icon: [288, 512, [], \"f223\", \"M288 208c0-44.2-19.9-83.7-51.2-110.1 2.5-1.8 4.9-3.8 7.2-5.8 24.7-21.2 39.8-48.8 43.2-78.8.9-7.1-4.7-13.3-11.9-13.3h-40.5C229 0 224.1 4.1 223 9.8c-2.4 12.5-9.6 24.3-20.7 33.8C187 56.8 166.3 64 144 64s-43-7.2-58.4-20.4C74.5 34.1 67.4 22.3 64.9 9.8 63.8 4.1 58.9 0 53.2 0H12.7C5.5 0-.1 6.2.8 13.3 4.2 43.4 19.2 71 44 92.2c2.3 2 4.7 3.9 7.2 5.8C19.9 124.3 0 163.8 0 208c0 68.5 47.9 125.9 112 140.4V400H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.5 112-71.9 112-140.4zm-224 0c0-44.1 35.9-80 80-80s80 35.9 80 80-35.9 80-80 80-80-35.9-80-80z\"]\n};\nvar faMeteor = {\n prefix: 'fas',\n iconName: 'meteor',\n icon: [512, 512, [], \"f753\", \"M491.2.7C452.5 12.3 379.4 35 303.5 62c-2.1-7-4-13.5-5.6-18.6-3-9.7-13.9-14.2-22.9-9.5C232.6 56 122.2 116.5 60.6 176.4c-1.1 1-2.5 2-3.5 3C19 217.4 0 267.3 0 317.2 0 367 19 416.9 57 455c38 38 87.9 57.1 137.8 57 49.9 0 99.8-19 137.9-57.1 1-1 2-2.4 3-3.5 59.8-61.6 120.4-172.1 142.5-214.4 4.7-9 .2-19.9-9.5-22.9-5.2-1.6-11.6-3.5-18.6-5.6 27-76 49.7-149 61.3-187.7C515 8.4 503.6-3 491.2.7zM192 448c-70.7 0-128-57.3-128-128s57.3-128 128-128 128 57.3 128 128-57.3 128-128 128zm-32-192c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm48 96c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16z\"]\n};\nvar faMicrochip = {\n prefix: 'fas',\n iconName: 'microchip',\n icon: [512, 512, [], \"f2db\", \"M416 48v416c0 26.51-21.49 48-48 48H144c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h224c26.51 0 48 21.49 48 48zm96 58v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42V88h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zm0 96v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42v-48h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zm0 96v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42v-48h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zm0 96v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42v-48h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zM30 376h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6zm0-96h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6zm0-96h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6zm0-96h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6z\"]\n};\nvar faMicrophone = {\n prefix: 'fas',\n iconName: 'microphone',\n icon: [352, 512, [], \"f130\", \"M176 352c53.02 0 96-42.98 96-96V96c0-53.02-42.98-96-96-96S80 42.98 80 96v160c0 53.02 42.98 96 96 96zm160-160h-16c-8.84 0-16 7.16-16 16v48c0 74.8-64.49 134.82-140.79 127.38C96.71 376.89 48 317.11 48 250.3V208c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v40.16c0 89.64 63.97 169.55 152 181.69V464H96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71 418.47 352 344.9 352 256v-48c0-8.84-7.16-16-16-16z\"]\n};\nvar faMicrophoneAlt = {\n prefix: 'fas',\n iconName: 'microphone-alt',\n icon: [352, 512, [], \"f3c9\", \"M336 192h-16c-8.84 0-16 7.16-16 16v48c0 74.8-64.49 134.82-140.79 127.38C96.71 376.89 48 317.11 48 250.3V208c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v40.16c0 89.64 63.97 169.55 152 181.69V464H96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71 418.47 352 344.9 352 256v-48c0-8.84-7.16-16-16-16zM176 352c53.02 0 96-42.98 96-96h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H272v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H272v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H272c0-53.02-42.98-96-96-96S80 42.98 80 96v160c0 53.02 42.98 96 96 96z\"]\n};\nvar faMicrophoneAltSlash = {\n prefix: 'fas',\n iconName: 'microphone-alt-slash',\n icon: [640, 512, [], \"f539\", \"M633.82 458.1L476.26 336.33C488.74 312.21 496 284.98 496 256v-48c0-8.84-7.16-16-16-16h-16c-8.84 0-16 7.16-16 16v48c0 17.92-3.96 34.8-10.72 50.2l-26.55-20.52c3.1-9.4 5.28-19.22 5.28-29.67h-43.67l-41.4-32H416v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H416v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H416c0-53.02-42.98-96-96-96s-96 42.98-96 96v45.36L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM400 464h-56v-33.78c11.71-1.62 23.1-4.28 33.96-8.08l-50.4-38.96c-6.71.4-13.41.87-20.35.2-55.85-5.45-98.74-48.63-111.18-101.85L144 241.31v6.85c0 89.64 63.97 169.55 152 181.69V464h-56c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16z\"]\n};\nvar faMicrophoneSlash = {\n prefix: 'fas',\n iconName: 'microphone-slash',\n icon: [640, 512, [], \"f131\", \"M633.82 458.1l-157.8-121.96C488.61 312.13 496 285.01 496 256v-48c0-8.84-7.16-16-16-16h-16c-8.84 0-16 7.16-16 16v48c0 17.92-3.96 34.8-10.72 50.2l-26.55-20.52c3.1-9.4 5.28-19.22 5.28-29.67V96c0-53.02-42.98-96-96-96s-96 42.98-96 96v45.36L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM400 464h-56v-33.77c11.66-1.6 22.85-4.54 33.67-8.31l-50.11-38.73c-6.71.4-13.41.87-20.35.2-55.85-5.45-98.74-48.63-111.18-101.85L144 241.31v6.85c0 89.64 63.97 169.55 152 181.69V464h-56c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16z\"]\n};\nvar faMicroscope = {\n prefix: 'fas',\n iconName: 'microscope',\n icon: [512, 512, [], \"f610\", \"M160 320h12v16c0 8.84 7.16 16 16 16h40c8.84 0 16-7.16 16-16v-16h12c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32V16c0-8.84-7.16-16-16-16h-64c-8.84 0-16 7.16-16 16v16c-17.67 0-32 14.33-32 32v224c0 17.67 14.33 32 32 32zm304 128h-1.29C493.24 413.99 512 369.2 512 320c0-105.88-86.12-192-192-192v64c70.58 0 128 57.42 128 128s-57.42 128-128 128H48c-26.51 0-48 21.49-48 48 0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16 0-26.51-21.49-48-48-48zm-360-32h208c4.42 0 8-3.58 8-8v-16c0-4.42-3.58-8-8-8H104c-4.42 0-8 3.58-8 8v16c0 4.42 3.58 8 8 8z\"]\n};\nvar faMinus = {\n prefix: 'fas',\n iconName: 'minus',\n icon: [448, 512, [], \"f068\", \"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faMinusCircle = {\n prefix: 'fas',\n iconName: 'minus-circle',\n icon: [512, 512, [], \"f056\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zM124 296c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h264c6.6 0 12 5.4 12 12v56c0 6.6-5.4 12-12 12H124z\"]\n};\nvar faMinusSquare = {\n prefix: 'fas',\n iconName: 'minus-square',\n icon: [448, 512, [], \"f146\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM92 296c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h264c6.6 0 12 5.4 12 12v56c0 6.6-5.4 12-12 12H92z\"]\n};\nvar faMitten = {\n prefix: 'fas',\n iconName: 'mitten',\n icon: [448, 512, [], \"f7b5\", \"M368 416H48c-8.8 0-16 7.2-16 16v64c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16v-64c0-8.8-7.2-16-16-16zm57-209.1c-27.2-22.6-67.5-19-90.1 8.2l-20.9 25-29.6-128.4c-18-77.5-95.4-125.9-172.8-108C34.2 21.6-14.2 98.9 3.7 176.4L51.6 384h309l72.5-87c22.7-27.2 19-67.5-8.1-90.1z\"]\n};\nvar faMobile = {\n prefix: 'fas',\n iconName: 'mobile',\n icon: [320, 512, [], \"f10b\", \"M272 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h224c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM160 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faMobileAlt = {\n prefix: 'fas',\n iconName: 'mobile-alt',\n icon: [320, 512, [], \"f3cd\", \"M272 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h224c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM160 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm112-108c0 6.6-5.4 12-12 12H60c-6.6 0-12-5.4-12-12V60c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v312z\"]\n};\nvar faMoneyBill = {\n prefix: 'fas',\n iconName: 'money-bill',\n icon: [640, 512, [], \"f0d6\", \"M608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zM48 400v-64c35.35 0 64 28.65 64 64H48zm0-224v-64h64c0 35.35-28.65 64-64 64zm272 176c-44.19 0-80-42.99-80-96 0-53.02 35.82-96 80-96s80 42.98 80 96c0 53.03-35.83 96-80 96zm272 48h-64c0-35.35 28.65-64 64-64v64zm0-224c-35.35 0-64-28.65-64-64h64v64z\"]\n};\nvar faMoneyBillAlt = {\n prefix: 'fas',\n iconName: 'money-bill-alt',\n icon: [640, 512, [], \"f3d1\", \"M352 288h-16v-88c0-4.42-3.58-8-8-8h-13.58c-4.74 0-9.37 1.4-13.31 4.03l-15.33 10.22a7.994 7.994 0 0 0-2.22 11.09l8.88 13.31a7.994 7.994 0 0 0 11.09 2.22l.47-.31V288h-16c-4.42 0-8 3.58-8 8v16c0 4.42 3.58 8 8 8h64c4.42 0 8-3.58 8-8v-16c0-4.42-3.58-8-8-8zM608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zM48 400v-64c35.35 0 64 28.65 64 64H48zm0-224v-64h64c0 35.35-28.65 64-64 64zm272 192c-53.02 0-96-50.15-96-112 0-61.86 42.98-112 96-112s96 50.14 96 112c0 61.87-43 112-96 112zm272 32h-64c0-35.35 28.65-64 64-64v64zm0-224c-35.35 0-64-28.65-64-64h64v64z\"]\n};\nvar faMoneyBillWave = {\n prefix: 'fas',\n iconName: 'money-bill-wave',\n icon: [640, 512, [], \"f53a\", \"M621.16 54.46C582.37 38.19 543.55 32 504.75 32c-123.17-.01-246.33 62.34-369.5 62.34-30.89 0-61.76-3.92-92.65-13.72-3.47-1.1-6.95-1.62-10.35-1.62C15.04 79 0 92.32 0 110.81v317.26c0 12.63 7.23 24.6 18.84 29.46C57.63 473.81 96.45 480 135.25 480c123.17 0 246.34-62.35 369.51-62.35 30.89 0 61.76 3.92 92.65 13.72 3.47 1.1 6.95 1.62 10.35 1.62 17.21 0 32.25-13.32 32.25-31.81V83.93c-.01-12.64-7.24-24.6-18.85-29.47zM48 132.22c20.12 5.04 41.12 7.57 62.72 8.93C104.84 170.54 79 192.69 48 192.69v-60.47zm0 285v-47.78c34.37 0 62.18 27.27 63.71 61.4-22.53-1.81-43.59-6.31-63.71-13.62zM320 352c-44.19 0-80-42.99-80-96 0-53.02 35.82-96 80-96s80 42.98 80 96c0 53.03-35.83 96-80 96zm272 27.78c-17.52-4.39-35.71-6.85-54.32-8.44 5.87-26.08 27.5-45.88 54.32-49.28v57.72zm0-236.11c-30.89-3.91-54.86-29.7-55.81-61.55 19.54 2.17 38.09 6.23 55.81 12.66v48.89z\"]\n};\nvar faMoneyBillWaveAlt = {\n prefix: 'fas',\n iconName: 'money-bill-wave-alt',\n icon: [640, 512, [], \"f53b\", \"M621.16 54.46C582.37 38.19 543.55 32 504.75 32c-123.17-.01-246.33 62.34-369.5 62.34-30.89 0-61.76-3.92-92.65-13.72-3.47-1.1-6.95-1.62-10.35-1.62C15.04 79 0 92.32 0 110.81v317.26c0 12.63 7.23 24.6 18.84 29.46C57.63 473.81 96.45 480 135.25 480c123.17 0 246.34-62.35 369.51-62.35 30.89 0 61.76 3.92 92.65 13.72 3.47 1.1 6.95 1.62 10.35 1.62 17.21 0 32.25-13.32 32.25-31.81V83.93c-.01-12.64-7.24-24.6-18.85-29.47zM320 352c-44.19 0-80-42.99-80-96 0-53.02 35.82-96 80-96s80 42.98 80 96c0 53.03-35.83 96-80 96z\"]\n};\nvar faMoneyCheck = {\n prefix: 'fas',\n iconName: 'money-check',\n icon: [640, 512, [], \"f53c\", \"M0 448c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V128H0v320zm448-208c0-8.84 7.16-16 16-16h96c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16h-96c-8.84 0-16-7.16-16-16v-32zm0 120c0-4.42 3.58-8 8-8h112c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H456c-4.42 0-8-3.58-8-8v-16zM64 264c0-4.42 3.58-8 8-8h304c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zm0 96c0-4.42 3.58-8 8-8h176c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zM624 32H16C7.16 32 0 39.16 0 48v48h640V48c0-8.84-7.16-16-16-16z\"]\n};\nvar faMoneyCheckAlt = {\n prefix: 'fas',\n iconName: 'money-check-alt',\n icon: [640, 512, [], \"f53d\", \"M608 32H32C14.33 32 0 46.33 0 64v384c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zM176 327.88V344c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-16.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V152c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.05 44.44-42.67 45.07zM416 312c0 4.42-3.58 8-8 8H296c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h112c4.42 0 8 3.58 8 8v16zm160 0c0 4.42-3.58 8-8 8h-80c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16zm0-96c0 4.42-3.58 8-8 8H296c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h272c4.42 0 8 3.58 8 8v16z\"]\n};\nvar faMonument = {\n prefix: 'fas',\n iconName: 'monument',\n icon: [384, 512, [], \"f5a6\", \"M368 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h352c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-78.86-347.26a31.97 31.97 0 0 0-9.21-19.44L203.31 4.69c-6.25-6.25-16.38-6.25-22.63 0l-76.6 76.61a31.97 31.97 0 0 0-9.21 19.44L64 416h256l-30.86-315.26zM240 307.2c0 6.4-6.4 12.8-12.8 12.8h-70.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h70.4c6.4 0 12.8 6.4 12.8 12.8v38.4z\"]\n};\nvar faMoon = {\n prefix: 'fas',\n iconName: 'moon',\n icon: [512, 512, [], \"f186\", \"M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z\"]\n};\nvar faMortarPestle = {\n prefix: 'fas',\n iconName: 'mortar-pestle',\n icon: [512, 512, [], \"f5a7\", \"M501.54 60.91c17.22-17.22 12.51-46.25-9.27-57.14a35.696 35.696 0 0 0-37.37 3.37L251.09 160h151.37l99.08-99.09zM496 192H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16c0 80.98 50.2 150.11 121.13 178.32-12.76 16.87-21.72 36.8-24.95 58.69-1.46 9.92 6.04 18.98 16.07 18.98h223.5c10.03 0 17.53-9.06 16.07-18.98-3.22-21.89-12.18-41.82-24.95-58.69C429.8 406.11 480 336.98 480 256h16c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faMosque = {\n prefix: 'fas',\n iconName: 'mosque',\n icon: [640, 512, [], \"f678\", \"M0 480c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V160H0v320zm579.16-192c17.86-17.39 28.84-37.34 28.84-58.91 0-52.86-41.79-93.79-87.92-122.9-41.94-26.47-80.63-57.77-111.96-96.22L400 0l-8.12 9.97c-31.33 38.45-70.01 69.76-111.96 96.22C233.79 135.3 192 176.23 192 229.09c0 21.57 10.98 41.52 28.84 58.91h358.32zM608 320H192c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h32v-64c0-17.67 14.33-32 32-32s32 14.33 32 32v64h64v-72c0-48 48-72 48-72s48 24 48 72v72h64v-64c0-17.67 14.33-32 32-32s32 14.33 32 32v64h32c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32zM64 0S0 32 0 96v32h128V96c0-64-64-96-64-96z\"]\n};\nvar faMotorcycle = {\n prefix: 'fas',\n iconName: 'motorcycle',\n icon: [640, 512, [], \"f21c\", \"M512.9 192c-14.9-.1-29.1 2.3-42.4 6.9L437.6 144H520c13.3 0 24-10.7 24-24V88c0-13.3-10.7-24-24-24h-45.3c-6.8 0-13.3 2.9-17.8 7.9l-37.5 41.7-22.8-38C392.2 68.4 384.4 64 376 64h-80c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h66.4l19.2 32H227.9c-17.7-23.1-44.9-40-99.9-40H72.5C59 104 47.7 115 48 128.5c.2 13 10.9 23.5 24 23.5h56c24.5 0 38.7 10.9 47.8 24.8l-11.3 20.5c-13-3.9-26.9-5.7-41.3-5.2C55.9 194.5 1.6 249.6 0 317c-1.6 72.1 56.3 131 128 131 59.6 0 109.7-40.8 124-96h84.2c13.7 0 24.6-11.4 24-25.1-2.1-47.1 17.5-93.7 56.2-125l12.5 20.8c-27.6 23.7-45.1 58.9-44.8 98.2.5 69.6 57.2 126.5 126.8 127.1 71.6.7 129.8-57.5 129.2-129.1-.7-69.6-57.6-126.4-127.2-126.9zM128 400c-44.1 0-80-35.9-80-80s35.9-80 80-80c4.2 0 8.4.3 12.5 1L99 316.4c-8.8 16 2.8 35.6 21 35.6h81.3c-12.4 28.2-40.6 48-73.3 48zm463.9-75.6c-2.2 40.6-35 73.4-75.5 75.5-46.1 2.5-84.4-34.3-84.4-79.9 0-21.4 8.4-40.8 22.1-55.1l49.4 82.4c4.5 7.6 14.4 10 22 5.5l13.7-8.2c7.6-4.5 10-14.4 5.5-22l-48.6-80.9c5.2-1.1 10.5-1.6 15.9-1.6 45.6-.1 82.3 38.2 79.9 84.3z\"]\n};\nvar faMountain = {\n prefix: 'fas',\n iconName: 'mountain',\n icon: [640, 512, [], \"f6fc\", \"M634.92 462.7l-288-448C341.03 5.54 330.89 0 320 0s-21.03 5.54-26.92 14.7l-288 448a32.001 32.001 0 0 0-1.17 32.64A32.004 32.004 0 0 0 32 512h576c11.71 0 22.48-6.39 28.09-16.67a31.983 31.983 0 0 0-1.17-32.63zM320 91.18L405.39 224H320l-64 64-38.06-38.06L320 91.18z\"]\n};\nvar faMousePointer = {\n prefix: 'fas',\n iconName: 'mouse-pointer',\n icon: [320, 512, [], \"f245\", \"M302.189 329.126H196.105l55.831 135.993c3.889 9.428-.555 19.999-9.444 23.999l-49.165 21.427c-9.165 4-19.443-.571-23.332-9.714l-53.053-129.136-86.664 89.138C18.729 472.71 0 463.554 0 447.977V18.299C0 1.899 19.921-6.096 30.277 5.443l284.412 292.542c11.472 11.179 3.007 31.141-12.5 31.141z\"]\n};\nvar faMugHot = {\n prefix: 'fas',\n iconName: 'mug-hot',\n icon: [512, 512, [], \"f7b6\", \"M127.1 146.5c1.3 7.7 8 13.5 16 13.5h16.5c9.8 0 17.6-8.5 16.3-18-3.8-28.2-16.4-54.2-36.6-74.7-14.4-14.7-23.6-33.3-26.4-53.5C111.8 5.9 105 0 96.8 0H80.4C70.6 0 63 8.5 64.1 18c3.9 31.9 18 61.3 40.6 84.4 12 12.2 19.7 27.5 22.4 44.1zm112 0c1.3 7.7 8 13.5 16 13.5h16.5c9.8 0 17.6-8.5 16.3-18-3.8-28.2-16.4-54.2-36.6-74.7-14.4-14.7-23.6-33.3-26.4-53.5C223.8 5.9 217 0 208.8 0h-16.4c-9.8 0-17.5 8.5-16.3 18 3.9 31.9 18 61.3 40.6 84.4 12 12.2 19.7 27.5 22.4 44.1zM400 192H32c-17.7 0-32 14.3-32 32v192c0 53 43 96 96 96h192c53 0 96-43 96-96h16c61.8 0 112-50.2 112-112s-50.2-112-112-112zm0 160h-16v-96h16c26.5 0 48 21.5 48 48s-21.5 48-48 48z\"]\n};\nvar faMusic = {\n prefix: 'fas',\n iconName: 'music',\n icon: [512, 512, [], \"f001\", \"M511.99 32.01c0-21.71-21.1-37.01-41.6-30.51L150.4 96c-13.3 4.2-22.4 16.5-22.4 30.5v261.42c-10.05-2.38-20.72-3.92-32-3.92-53.02 0-96 28.65-96 64s42.98 64 96 64 96-28.65 96-64V214.31l256-75.02v184.63c-10.05-2.38-20.72-3.92-32-3.92-53.02 0-96 28.65-96 64s42.98 64 96 64 96-28.65 96-64l-.01-351.99z\"]\n};\nvar faNetworkWired = {\n prefix: 'fas',\n iconName: 'network-wired',\n icon: [640, 512, [], \"f6ff\", \"M640 264v-16c0-8.84-7.16-16-16-16H344v-40h72c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32H224c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h72v40H16c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h104v40H64c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h160c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32h-56v-40h304v40h-56c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h160c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32h-56v-40h104c8.84 0 16-7.16 16-16zM256 128V64h128v64H256zm-64 320H96v-64h96v64zm352 0h-96v-64h96v64z\"]\n};\nvar faNeuter = {\n prefix: 'fas',\n iconName: 'neuter',\n icon: [288, 512, [], \"f22c\", \"M288 176c0-79.5-64.5-144-144-144S0 96.5 0 176c0 68.5 47.9 125.9 112 140.4V468c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V316.4c64.1-14.5 112-71.9 112-140.4zm-144 80c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faNewspaper = {\n prefix: 'fas',\n iconName: 'newspaper',\n icon: [576, 512, [], \"f1ea\", \"M552 64H88c-13.255 0-24 10.745-24 24v8H24c-13.255 0-24 10.745-24 24v272c0 30.928 25.072 56 56 56h472c26.51 0 48-21.49 48-48V88c0-13.255-10.745-24-24-24zM56 400a8 8 0 0 1-8-8V144h16v248a8 8 0 0 1-8 8zm236-16H140c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm208 0H348c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm-208-96H140c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm208 0H348c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm0-96H140c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h360c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12z\"]\n};\nvar faNotEqual = {\n prefix: 'fas',\n iconName: 'not-equal',\n icon: [448, 512, [], \"f53e\", \"M416 208c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32h-23.88l51.87-66.81c5.37-7.02 4.04-17.06-2.97-22.43L415.61 3.3c-7.02-5.38-17.06-4.04-22.44 2.97L311.09 112H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h204.56l-74.53 96H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h55.49l-51.87 66.81c-5.37 7.01-4.04 17.05 2.97 22.43L64 508.7c7.02 5.38 17.06 4.04 22.43-2.97L168.52 400H416c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32H243.05l74.53-96H416z\"]\n};\nvar faNotesMedical = {\n prefix: 'fas',\n iconName: 'notes-medical',\n icon: [384, 512, [], \"f481\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm96 304c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48zm0-192c0 4.4-3.6 8-8 8H104c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h176c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faObjectGroup = {\n prefix: 'fas',\n iconName: 'object-group',\n icon: [512, 512, [], \"f247\", \"M480 128V96h20c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v20H64V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v40c0 6.627 5.373 12 12 12h20v320H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-20h384v20c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-20V128zM96 276V140c0-6.627 5.373-12 12-12h168c6.627 0 12 5.373 12 12v136c0 6.627-5.373 12-12 12H108c-6.627 0-12-5.373-12-12zm320 96c0 6.627-5.373 12-12 12H236c-6.627 0-12-5.373-12-12v-52h72c13.255 0 24-10.745 24-24v-72h84c6.627 0 12 5.373 12 12v136z\"]\n};\nvar faObjectUngroup = {\n prefix: 'fas',\n iconName: 'object-ungroup',\n icon: [576, 512, [], \"f248\", \"M64 320v26a6 6 0 0 1-6 6H6a6 6 0 0 1-6-6v-52a6 6 0 0 1 6-6h26V96H6a6 6 0 0 1-6-6V38a6 6 0 0 1 6-6h52a6 6 0 0 1 6 6v26h288V38a6 6 0 0 1 6-6h52a6 6 0 0 1 6 6v52a6 6 0 0 1-6 6h-26v192h26a6 6 0 0 1 6 6v52a6 6 0 0 1-6 6h-52a6 6 0 0 1-6-6v-26H64zm480-64v-32h26a6 6 0 0 0 6-6v-52a6 6 0 0 0-6-6h-52a6 6 0 0 0-6 6v26H408v72h8c13.255 0 24 10.745 24 24v64c0 13.255-10.745 24-24 24h-64c-13.255 0-24-10.745-24-24v-8H192v72h-26a6 6 0 0 0-6 6v52a6 6 0 0 0 6 6h52a6 6 0 0 0 6-6v-26h288v26a6 6 0 0 0 6 6h52a6 6 0 0 0 6-6v-52a6 6 0 0 0-6-6h-26V256z\"]\n};\nvar faOilCan = {\n prefix: 'fas',\n iconName: 'oil-can',\n icon: [640, 512, [], \"f613\", \"M629.8 160.31L416 224l-50.49-25.24a64.07 64.07 0 0 0-28.62-6.76H280v-48h56c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h56v48h-56L37.72 166.86a31.9 31.9 0 0 0-5.79-.53C14.67 166.33 0 180.36 0 198.34v94.95c0 15.46 11.06 28.72 26.28 31.48L96 337.46V384c0 17.67 14.33 32 32 32h274.63c8.55 0 16.75-3.42 22.76-9.51l212.26-214.75c1.5-1.5 2.34-3.54 2.34-5.66V168c.01-5.31-5.08-9.15-10.19-7.69zM96 288.67l-48-8.73v-62.43l48 8.73v62.43zm453.33 84.66c0 23.56 19.1 42.67 42.67 42.67s42.67-19.1 42.67-42.67S592 288 592 288s-42.67 61.77-42.67 85.33z\"]\n};\nvar faOm = {\n prefix: 'fas',\n iconName: 'om',\n icon: [512, 512, [], \"f679\", \"M360.6 60.94a10.43 10.43 0 0 0 14.76 0l21.57-21.56a10.43 10.43 0 0 0 0-14.76L375.35 3.06c-4.08-4.07-10.68-4.07-14.76 0l-21.57 21.56a10.43 10.43 0 0 0 0 14.76l21.58 21.56zM412.11 192c-26.69 0-51.77 10.39-70.64 29.25l-24.25 24.25c-6.78 6.77-15.78 10.5-25.38 10.5H245c10.54-22.1 14.17-48.11 7.73-75.23-10.1-42.55-46.36-76.11-89.52-83.19-36.15-5.93-70.9 5.04-96.01 28.78-7.36 6.96-6.97 18.85 1.12 24.93l26.15 19.63c5.72 4.3 13.66 4.32 19.2-.21 8.45-6.9 19.02-10.71 30.27-10.71 26.47 0 48.01 21.53 48.01 48s-21.54 48-48.01 48h-31.9c-11.96 0-19.74 12.58-14.39 23.28l16.09 32.17c2.53 5.06 7.6 8.1 13.17 8.55h33.03c35.3 0 64.01 28.7 64.01 64s-28.71 64-64.01 64c-96.02 0-122.35-54.02-145.15-92.03-4.53-7.55-14.77-3.58-14.79 5.22C-.09 416 41.13 512 159.94 512c70.59 0 128.02-57.42 128.02-128 0-23.42-6.78-45.1-17.81-64h21.69c26.69 0 51.77-10.39 70.64-29.25l24.25-24.25c6.78-6.77 15.78-10.5 25.38-10.5 19.78 0 35.88 16.09 35.88 35.88V392c0 13.23-18.77 24-32.01 24-39.4 0-66.67-24.24-81.82-42.89-4.77-5.87-14.2-2.54-14.2 5.02V416s0 64 96.02 64c48.54 0 96.02-39.47 96.02-88V291.88c0-55.08-44.8-99.88-99.89-99.88zm42.18-124.73c-85.55 65.12-169.05 2.75-172.58.05-6.02-4.62-14.44-4.38-20.14.55-5.74 4.92-7.27 13.17-3.66 19.8 1.61 2.95 40.37 72.34 118.8 72.34 79.92 0 98.78-31.36 101.75-37.66 1.02-2.12 1.53-4.47 1.53-6.83V80c0-13.22-15.14-20.69-25.7-12.73z\"]\n};\nvar faOtter = {\n prefix: 'fas',\n iconName: 'otter',\n icon: [640, 512, [], \"f700\", \"M608 32h-32l-13.25-13.25A63.97 63.97 0 0 0 517.49 0H497c-11.14 0-22.08 2.91-31.75 8.43L312 96h-56C149.96 96 64 181.96 64 288v1.61c0 32.75-16 62.14-39.56 84.89-18.19 17.58-28.1 43.68-23.19 71.8 6.76 38.8 42.9 65.7 82.28 65.7H192c17.67 0 32-14.33 32-32s-14.33-32-32-32H80c-8.83 0-16-7.17-16-16s7.17-16 16-16h224c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-64l149.49-80.5L448 416h80c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-28.22l-55.11-110.21L521.14 192H544c53.02 0 96-42.98 96-96V64c0-17.67-14.33-32-32-32zm-96 16c8.84 0 16 7.16 16 16s-7.16 16-16 16-16-7.16-16-16 7.16-16 16-16zm32 96h-34.96L407.2 198.84l-13.77-27.55L512 112h77.05c-6.62 18.58-24.22 32-45.05 32z\"]\n};\nvar faOutdent = {\n prefix: 'fas',\n iconName: 'outdent',\n icon: [448, 512, [], \"f03b\", \"M100.69 363.29c10 10 27.31 2.93 27.31-11.31V160c0-14.32-17.33-21.31-27.31-11.31l-96 96a16 16 0 0 0 0 22.62zM432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm3.17-128H204.83A12.82 12.82 0 0 0 192 300.83v38.34A12.82 12.82 0 0 0 204.83 352h230.34A12.82 12.82 0 0 0 448 339.17v-38.34A12.82 12.82 0 0 0 435.17 288zm0-128H204.83A12.82 12.82 0 0 0 192 172.83v38.34A12.82 12.82 0 0 0 204.83 224h230.34A12.82 12.82 0 0 0 448 211.17v-38.34A12.82 12.82 0 0 0 435.17 160zM432 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faPager = {\n prefix: 'fas',\n iconName: 'pager',\n icon: [512, 512, [], \"f815\", \"M448 64H64a64 64 0 0 0-64 64v256a64 64 0 0 0 64 64h384a64 64 0 0 0 64-64V128a64 64 0 0 0-64-64zM160 368H80a16 16 0 0 1-16-16v-16a16 16 0 0 1 16-16h80zm128-16a16 16 0 0 1-16 16h-80v-48h80a16 16 0 0 1 16 16zm160-128a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32v-64a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32z\"]\n};\nvar faPaintBrush = {\n prefix: 'fas',\n iconName: 'paint-brush',\n icon: [512, 512, [], \"f1fc\", \"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z\"]\n};\nvar faPaintRoller = {\n prefix: 'fas',\n iconName: 'paint-roller',\n icon: [512, 512, [], \"f5aa\", \"M416 128V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v96c0 17.67 14.33 32 32 32h352c17.67 0 32-14.33 32-32zm32-64v128c0 17.67-14.33 32-32 32H256c-35.35 0-64 28.65-64 64v32c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32v-32h160c53.02 0 96-42.98 96-96v-64c0-35.35-28.65-64-64-64z\"]\n};\nvar faPalette = {\n prefix: 'fas',\n iconName: 'palette',\n icon: [512, 512, [], \"f53f\", \"M204.3 5C104.9 24.4 24.8 104.3 5.2 203.4c-37 187 131.7 326.4 258.8 306.7 41.2-6.4 61.4-54.6 42.5-91.7-23.1-45.4 9.9-98.4 60.9-98.4h79.7c35.8 0 64.8-29.6 64.9-65.3C511.5 97.1 368.1-26.9 204.3 5zM96 320c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm32-128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128-64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faPallet = {\n prefix: 'fas',\n iconName: 'pallet',\n icon: [640, 512, [], \"f482\", \"M144 256h352c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16H384v128l-64-32-64 32V0H144c-8.8 0-16 7.2-16 16v224c0 8.8 7.2 16 16 16zm480 128c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h48v64H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16h-48v-64h48zm-336 64H128v-64h160v64zm224 0H352v-64h160v64z\"]\n};\nvar faPaperPlane = {\n prefix: 'fas',\n iconName: 'paper-plane',\n icon: [512, 512, [], \"f1d8\", \"M476 3.2L12.5 270.6c-18.1 10.4-15.8 35.6 2.2 43.2L121 358.4l287.3-253.2c5.5-4.9 13.3 2.6 8.6 8.3L176 407v80.5c0 23.6 28.5 32.9 42.5 15.8L282 426l124.6 52.2c14.2 6 30.4-2.9 33-18.2l72-432C515 7.8 493.3-6.8 476 3.2z\"]\n};\nvar faPaperclip = {\n prefix: 'fas',\n iconName: 'paperclip',\n icon: [448, 512, [], \"f0c6\", \"M43.246 466.142c-58.43-60.289-57.341-157.511 1.386-217.581L254.392 34c44.316-45.332 116.351-45.336 160.671 0 43.89 44.894 43.943 117.329 0 162.276L232.214 383.128c-29.855 30.537-78.633 30.111-107.982-.998-28.275-29.97-27.368-77.473 1.452-106.953l143.743-146.835c6.182-6.314 16.312-6.422 22.626-.241l22.861 22.379c6.315 6.182 6.422 16.312.241 22.626L171.427 319.927c-4.932 5.045-5.236 13.428-.648 18.292 4.372 4.634 11.245 4.711 15.688.165l182.849-186.851c19.613-20.062 19.613-52.725-.011-72.798-19.189-19.627-49.957-19.637-69.154 0L90.39 293.295c-34.763 35.56-35.299 93.12-1.191 128.313 34.01 35.093 88.985 35.137 123.058.286l172.06-175.999c6.177-6.319 16.307-6.433 22.626-.256l22.877 22.364c6.319 6.177 6.434 16.307.256 22.626l-172.06 175.998c-59.576 60.938-155.943 60.216-214.77-.485z\"]\n};\nvar faParachuteBox = {\n prefix: 'fas',\n iconName: 'parachute-box',\n icon: [512, 512, [], \"f4cd\", \"M511.9 175c-9.1-75.6-78.4-132.4-158.3-158.7C390 55.7 416 116.9 416 192h28.1L327.5 321.5c-2.5-.6-4.8-1.5-7.5-1.5h-48V192h112C384 76.8 315.1 0 256 0S128 76.8 128 192h112v128h-48c-2.7 0-5 .9-7.5 1.5L67.9 192H96c0-75.1 26-136.3 62.4-175.7C78.5 42.7 9.2 99.5.1 175c-1.1 9.1 6.8 17 16 17h8.7l136.7 151.9c-.7 2.6-1.6 5.2-1.6 8.1v128c0 17.7 14.3 32 32 32h128c17.7 0 32-14.3 32-32V352c0-2.9-.9-5.4-1.6-8.1L487.1 192h8.7c9.3 0 17.2-7.8 16.1-17z\"]\n};\nvar faParagraph = {\n prefix: 'fas',\n iconName: 'paragraph',\n icon: [448, 512, [], \"f1dd\", \"M448 48v32a16 16 0 0 1-16 16h-48v368a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V96h-32v368a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V352h-32a160 160 0 0 1 0-320h240a16 16 0 0 1 16 16z\"]\n};\nvar faParking = {\n prefix: 'fas',\n iconName: 'parking',\n icon: [448, 512, [], \"f540\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM240 320h-48v48c0 8.8-7.2 16-16 16h-32c-8.8 0-16-7.2-16-16V144c0-8.8 7.2-16 16-16h96c52.9 0 96 43.1 96 96s-43.1 96-96 96zm0-128h-48v64h48c17.6 0 32-14.4 32-32s-14.4-32-32-32z\"]\n};\nvar faPassport = {\n prefix: 'fas',\n iconName: 'passport',\n icon: [448, 512, [], \"f5ab\", \"M129.62 176h39.09c1.49-27.03 6.54-51.35 14.21-70.41-27.71 13.24-48.02 39.19-53.3 70.41zm0 32c5.29 31.22 25.59 57.17 53.3 70.41-7.68-19.06-12.72-43.38-14.21-70.41h-39.09zM224 286.69c7.69-7.45 20.77-34.42 23.43-78.69h-46.87c2.67 44.26 15.75 71.24 23.44 78.69zM200.57 176h46.87c-2.66-44.26-15.74-71.24-23.43-78.69-7.7 7.45-20.78 34.43-23.44 78.69zm64.51 102.41c27.71-13.24 48.02-39.19 53.3-70.41h-39.09c-1.49 27.03-6.53 51.35-14.21 70.41zM416 0H64C28.65 0 0 28.65 0 64v384c0 35.35 28.65 64 64 64h352c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32zm-80 416H112c-8.8 0-16-7.2-16-16s7.2-16 16-16h224c8.8 0 16 7.2 16 16s-7.2 16-16 16zm-112-96c-70.69 0-128-57.31-128-128S153.31 64 224 64s128 57.31 128 128-57.31 128-128 128zm41.08-214.41c7.68 19.06 12.72 43.38 14.21 70.41h39.09c-5.28-31.22-25.59-57.17-53.3-70.41z\"]\n};\nvar faPastafarianism = {\n prefix: 'fas',\n iconName: 'pastafarianism',\n icon: [640, 512, [], \"f67b\", \"M624.54 347.67c-32.7-12.52-57.36 4.25-75.37 16.45-17.06 11.53-23.25 14.42-31.41 11.36-8.12-3.09-10.83-9.38-15.89-29.38-3.33-13.15-7.44-29.32-17.95-42.65 2.24-2.91 4.43-5.79 6.38-8.57C500.47 304.45 513.71 312 532 312c33.95 0 50.87-25.78 62.06-42.83 10.59-16.14 15-21.17 21.94-21.17 13.25 0 24-10.75 24-24s-10.75-24-24-24c-33.95 0-50.87 25.78-62.06 42.83-10.6 16.14-15 21.17-21.94 21.17-17.31 0-37.48-61.43-97.26-101.91l17.25-34.5C485.43 125.5 512 97.98 512 64c0-35.35-28.65-64-64-64s-64 28.65-64 64c0 13.02 3.94 25.1 10.62 35.21l-18.15 36.3c-16.98-4.6-35.6-7.51-56.46-7.51s-39.49 2.91-56.46 7.51l-18.15-36.3C252.06 89.1 256 77.02 256 64c0-35.35-28.65-64-64-64s-64 28.65-64 64c0 33.98 26.56 61.5 60.02 63.6l17.25 34.5C145.68 202.44 125.15 264 108 264c-6.94 0-11.34-5.03-21.94-21.17C74.88 225.78 57.96 200 24 200c-13.25 0-24 10.75-24 24s10.75 24 24 24c6.94 0 11.34 5.03 21.94 21.17C57.13 286.22 74.05 312 108 312c18.29 0 31.53-7.55 41.7-17.11 1.95 2.79 4.14 5.66 6.38 8.57-10.51 13.33-14.62 29.5-17.95 42.65-5.06 20-7.77 26.28-15.89 29.38-8.11 3.06-14.33.17-31.41-11.36-18.03-12.2-42.72-28.92-75.37-16.45-12.39 4.72-18.59 18.58-13.87 30.97 4.72 12.41 18.61 18.61 30.97 13.88 8.16-3.09 14.34-.19 31.39 11.36 13.55 9.16 30.83 20.86 52.42 20.84 7.17 0 14.83-1.28 22.97-4.39 32.66-12.44 39.98-41.33 45.33-62.44 2.21-8.72 3.99-14.49 5.95-18.87 16.62 13.61 36.95 25.88 61.64 34.17-9.96 37-32.18 90.8-60.26 90.8-13.25 0-24 10.75-24 24s10.75 24 24 24c66.74 0 97.05-88.63 107.42-129.14 6.69.6 13.42 1.14 20.58 1.14s13.89-.54 20.58-1.14C350.95 423.37 381.26 512 448 512c13.25 0 24-10.75 24-24s-10.75-24-24-24c-27.94 0-50.21-53.81-60.22-90.81 24.69-8.29 45-20.56 61.62-34.16 1.96 4.38 3.74 10.15 5.95 18.87 5.34 21.11 12.67 50 45.33 62.44 8.14 3.11 15.8 4.39 22.97 4.39 21.59 0 38.87-11.69 52.42-20.84 17.05-11.55 23.28-14.45 31.39-11.36 12.39 4.75 26.27-1.47 30.97-13.88 4.71-12.4-1.49-26.26-13.89-30.98zM448 48c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16zm-256 0c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16z\"]\n};\nvar faPaste = {\n prefix: 'fas',\n iconName: 'paste',\n icon: [448, 512, [], \"f0ea\", \"M128 184c0-30.879 25.122-56 56-56h136V56c0-13.255-10.745-24-24-24h-80.61C204.306 12.89 183.637 0 160 0s-44.306 12.89-55.39 32H24C10.745 32 0 42.745 0 56v336c0 13.255 10.745 24 24 24h104V184zm32-144c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24zm184 248h104v200c0 13.255-10.745 24-24 24H184c-13.255 0-24-10.745-24-24V184c0-13.255 10.745-24 24-24h136v104c0 13.2 10.8 24 24 24zm104-38.059V256h-96v-96h6.059a24 24 0 0 1 16.97 7.029l65.941 65.941a24.002 24.002 0 0 1 7.03 16.971z\"]\n};\nvar faPause = {\n prefix: 'fas',\n iconName: 'pause',\n icon: [448, 512, [], \"f04c\", \"M144 479H48c-26.5 0-48-21.5-48-48V79c0-26.5 21.5-48 48-48h96c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48zm304-48V79c0-26.5-21.5-48-48-48h-96c-26.5 0-48 21.5-48 48v352c0 26.5 21.5 48 48 48h96c26.5 0 48-21.5 48-48z\"]\n};\nvar faPauseCircle = {\n prefix: 'fas',\n iconName: 'pause-circle',\n icon: [512, 512, [], \"f28b\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm-16 328c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v160zm112 0c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v160z\"]\n};\nvar faPaw = {\n prefix: 'fas',\n iconName: 'paw',\n icon: [512, 512, [], \"f1b0\", \"M256 224c-79.41 0-192 122.76-192 200.25 0 34.9 26.81 55.75 71.74 55.75 48.84 0 81.09-25.08 120.26-25.08 39.51 0 71.85 25.08 120.26 25.08 44.93 0 71.74-20.85 71.74-55.75C448 346.76 335.41 224 256 224zm-147.28-12.61c-10.4-34.65-42.44-57.09-71.56-50.13-29.12 6.96-44.29 40.69-33.89 75.34 10.4 34.65 42.44 57.09 71.56 50.13 29.12-6.96 44.29-40.69 33.89-75.34zm84.72-20.78c30.94-8.14 46.42-49.94 34.58-93.36s-46.52-72.01-77.46-63.87-46.42 49.94-34.58 93.36c11.84 43.42 46.53 72.02 77.46 63.87zm281.39-29.34c-29.12-6.96-61.15 15.48-71.56 50.13-10.4 34.65 4.77 68.38 33.89 75.34 29.12 6.96 61.15-15.48 71.56-50.13 10.4-34.65-4.77-68.38-33.89-75.34zm-156.27 29.34c30.94 8.14 65.62-20.45 77.46-63.87 11.84-43.42-3.64-85.21-34.58-93.36s-65.62 20.45-77.46 63.87c-11.84 43.42 3.64 85.22 34.58 93.36z\"]\n};\nvar faPeace = {\n prefix: 'fas',\n iconName: 'peace',\n icon: [496, 512, [], \"f67c\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm184 248c0 31.93-8.2 61.97-22.57 88.17L280 240.63V74.97c86.23 15.21 152 90.5 152 181.03zM216 437.03c-33.86-5.97-64.49-21.2-89.29-43.02L216 322.57v114.46zm64-114.46L369.29 394c-24.8 21.82-55.43 37.05-89.29 43.02V322.57zm-64-247.6v165.66L86.57 344.17C72.2 317.97 64 287.93 64 256c0-90.53 65.77-165.82 152-181.03z\"]\n};\nvar faPen = {\n prefix: 'fas',\n iconName: 'pen',\n icon: [512, 512, [], \"f304\", \"M290.74 93.24l128.02 128.02-277.99 277.99-114.14 12.6C11.35 513.54-1.56 500.62.14 485.34l12.7-114.22 277.9-277.88zm207.2-19.06l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.76 18.75-49.16 0-67.91z\"]\n};\nvar faPenAlt = {\n prefix: 'fas',\n iconName: 'pen-alt',\n icon: [512, 512, [], \"f305\", \"M497.94 74.17l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.75 18.75-49.15 0-67.91zm-246.8-20.53c-15.62-15.62-40.94-15.62-56.56 0L75.8 172.43c-6.25 6.25-6.25 16.38 0 22.62l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l101.82-101.82 22.63 22.62L93.95 290.03A327.038 327.038 0 0 0 .17 485.11l-.03.23c-1.7 15.28 11.21 28.2 26.49 26.51a327.02 327.02 0 0 0 195.34-93.8l196.79-196.79-82.77-82.77-84.85-84.85z\"]\n};\nvar faPenFancy = {\n prefix: 'fas',\n iconName: 'pen-fancy',\n icon: [512, 512, [], \"f5ac\", \"M79.18 282.94a32.005 32.005 0 0 0-20.24 20.24L0 480l4.69 4.69 92.89-92.89c-.66-2.56-1.57-5.03-1.57-7.8 0-17.67 14.33-32 32-32s32 14.33 32 32-14.33 32-32 32c-2.77 0-5.24-.91-7.8-1.57l-92.89 92.89L32 512l176.82-58.94a31.983 31.983 0 0 0 20.24-20.24l33.07-84.07-98.88-98.88-84.07 33.07zM369.25 28.32L186.14 227.81l97.85 97.85 199.49-183.11C568.4 67.48 443.73-55.94 369.25 28.32z\"]\n};\nvar faPenNib = {\n prefix: 'fas',\n iconName: 'pen-nib',\n icon: [512, 512, [], \"f5ad\", \"M136.6 138.79a64.003 64.003 0 0 0-43.31 41.35L0 460l14.69 14.69L164.8 324.58c-2.99-6.26-4.8-13.18-4.8-20.58 0-26.51 21.49-48 48-48s48 21.49 48 48-21.49 48-48 48c-7.4 0-14.32-1.81-20.58-4.8L37.31 497.31 52 512l279.86-93.29a64.003 64.003 0 0 0 41.35-43.31L416 224 288 96l-151.4 42.79zm361.34-64.62l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.75 18.75-49.15 0-67.91z\"]\n};\nvar faPenSquare = {\n prefix: 'fas',\n iconName: 'pen-square',\n icon: [448, 512, [], \"f14b\", \"M400 480H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48zM238.1 177.9L102.4 313.6l-6.3 57.1c-.8 7.6 5.6 14.1 13.3 13.3l57.1-6.3L302.2 242c2.3-2.3 2.3-6.1 0-8.5L246.7 178c-2.5-2.4-6.3-2.4-8.6-.1zM345 165.1L314.9 135c-9.4-9.4-24.6-9.4-33.9 0l-23.1 23.1c-2.3 2.3-2.3 6.1 0 8.5l55.5 55.5c2.3 2.3 6.1 2.3 8.5 0L345 199c9.3-9.3 9.3-24.5 0-33.9z\"]\n};\nvar faPencilAlt = {\n prefix: 'fas',\n iconName: 'pencil-alt',\n icon: [512, 512, [], \"f303\", \"M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z\"]\n};\nvar faPencilRuler = {\n prefix: 'fas',\n iconName: 'pencil-ruler',\n icon: [512, 512, [], \"f5ae\", \"M109.46 244.04l134.58-134.56-44.12-44.12-61.68 61.68a7.919 7.919 0 0 1-11.21 0l-11.21-11.21c-3.1-3.1-3.1-8.12 0-11.21l61.68-61.68-33.64-33.65C131.47-3.1 111.39-3.1 99 9.29L9.29 99c-12.38 12.39-12.39 32.47 0 44.86l100.17 100.18zm388.47-116.8c18.76-18.76 18.75-49.17 0-67.93l-45.25-45.25c-18.76-18.76-49.18-18.76-67.95 0l-46.02 46.01 113.2 113.2 46.02-46.03zM316.08 82.71l-297 296.96L.32 487.11c-2.53 14.49 10.09 27.11 24.59 24.56l107.45-18.84L429.28 195.9 316.08 82.71zm186.63 285.43l-33.64-33.64-61.68 61.68c-3.1 3.1-8.12 3.1-11.21 0l-11.21-11.21c-3.09-3.1-3.09-8.12 0-11.21l61.68-61.68-44.14-44.14L267.93 402.5l100.21 100.2c12.39 12.39 32.47 12.39 44.86 0l89.71-89.7c12.39-12.39 12.39-32.47 0-44.86z\"]\n};\nvar faPeopleCarry = {\n prefix: 'fas',\n iconName: 'people-carry',\n icon: [640, 512, [], \"f4ce\", \"M128 96c26.5 0 48-21.5 48-48S154.5 0 128 0 80 21.5 80 48s21.5 48 48 48zm384 0c26.5 0 48-21.5 48-48S538.5 0 512 0s-48 21.5-48 48 21.5 48 48 48zm125.7 372.1l-44-110-41.1 46.4-2 18.2 27.7 69.2c5 12.5 17 20.1 29.7 20.1 4 0 8-.7 11.9-2.3 16.4-6.6 24.4-25.2 17.8-41.6zm-34.2-209.8L585 178.1c-4.6-20-18.6-36.8-37.5-44.9-18.5-8-39-6.7-56.1 3.3-22.7 13.4-39.7 34.5-48.1 59.4L432 229.8 416 240v-96c0-8.8-7.2-16-16-16H240c-8.8 0-16 7.2-16 16v96l-16.1-10.2-11.3-33.9c-8.3-25-25.4-46-48.1-59.4-17.2-10-37.6-11.3-56.1-3.3-18.9 8.1-32.9 24.9-37.5 44.9l-18.4 80.2c-4.6 20 .7 41.2 14.4 56.7l67.2 75.9 10.1 92.6C130 499.8 143.8 512 160 512c1.2 0 2.3-.1 3.5-.2 17.6-1.9 30.2-17.7 28.3-35.3l-10.1-92.8c-1.5-13-6.9-25.1-15.6-35l-43.3-49 17.6-70.3 6.8 20.4c4.1 12.5 11.9 23.4 24.5 32.6l51.1 32.5c4.6 2.9 12.1 4.6 17.2 5h160c5.1-.4 12.6-2.1 17.2-5l51.1-32.5c12.6-9.2 20.4-20 24.5-32.6l6.8-20.4 17.6 70.3-43.3 49c-8.7 9.9-14.1 22-15.6 35l-10.1 92.8c-1.9 17.6 10.8 33.4 28.3 35.3 1.2.1 2.3.2 3.5.2 16.1 0 30-12.1 31.8-28.5l10.1-92.6 67.2-75.9c13.6-15.5 19-36.7 14.4-56.7zM46.3 358.1l-44 110c-6.6 16.4 1.4 35 17.8 41.6 16.8 6.6 35.1-1.7 41.6-17.8l27.7-69.2-2-18.2-41.1-46.4z\"]\n};\nvar faPepperHot = {\n prefix: 'fas',\n iconName: 'pepper-hot',\n icon: [512, 512, [], \"f816\", \"M330.67 263.12V173.4l-52.75-24.22C219.44 218.76 197.58 400 56 400a56 56 0 0 0 0 112c212.64 0 370.65-122.87 419.18-210.34l-37.05-38.54zm131.09-128.37C493.92 74.91 477.18 26.48 458.62 3a8 8 0 0 0-11.93-.59l-22.9 23a8.06 8.06 0 0 0-.89 10.23c6.86 10.36 17.05 35.1-1.4 72.32A142.85 142.85 0 0 0 364.34 96c-28 0-54 8.54-76.34 22.59l74.67 34.29v78.24h89.09L506.44 288c3.26-12.62 5.56-25.63 5.56-39.31a154 154 0 0 0-50.24-113.94z\"]\n};\nvar faPercent = {\n prefix: 'fas',\n iconName: 'percent',\n icon: [448, 512, [], \"f295\", \"M112 224c61.9 0 112-50.1 112-112S173.9 0 112 0 0 50.1 0 112s50.1 112 112 112zm0-160c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm224 224c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112zm0 160c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zM392.3.2l31.6-.1c19.4-.1 30.9 21.8 19.7 37.8L77.4 501.6a23.95 23.95 0 0 1-19.6 10.2l-33.4.1c-19.5 0-30.9-21.9-19.7-37.8l368-463.7C377.2 4 384.5.2 392.3.2z\"]\n};\nvar faPercentage = {\n prefix: 'fas',\n iconName: 'percentage',\n icon: [384, 512, [], \"f541\", \"M109.25 173.25c24.99-24.99 24.99-65.52 0-90.51-24.99-24.99-65.52-24.99-90.51 0-24.99 24.99-24.99 65.52 0 90.51 25 25 65.52 25 90.51 0zm256 165.49c-24.99-24.99-65.52-24.99-90.51 0-24.99 24.99-24.99 65.52 0 90.51 24.99 24.99 65.52 24.99 90.51 0 25-24.99 25-65.51 0-90.51zm-1.94-231.43l-22.62-22.62c-12.5-12.5-32.76-12.5-45.25 0L20.69 359.44c-12.5 12.5-12.5 32.76 0 45.25l22.62 22.62c12.5 12.5 32.76 12.5 45.25 0l274.75-274.75c12.5-12.49 12.5-32.75 0-45.25z\"]\n};\nvar faPersonBooth = {\n prefix: 'fas',\n iconName: 'person-booth',\n icon: [576, 512, [], \"f756\", \"M192 496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320h-64v176zm32-272h-50.9l-45.2-45.3C115.8 166.6 99.7 160 82.7 160H64c-17.1 0-33.2 6.7-45.3 18.8C6.7 190.9 0 207 0 224.1L.2 320 0 480c0 17.7 14.3 32 31.9 32 17.6 0 32-14.3 32-32l.1-100.7c.9.5 1.6 1.3 2.5 1.7l29.1 43v56c0 17.7 14.3 32 32 32s32-14.3 32-32v-56.5c0-9.9-2.3-19.8-6.7-28.6l-41.2-61.3V253l20.9 20.9c9.1 9.1 21.1 14.1 33.9 14.1H224c17.7 0 32-14.3 32-32s-14.3-32-32-32zM64 128c26.5 0 48-21.5 48-48S90.5 32 64 32 16 53.5 16 80s21.5 48 48 48zm224-96l31.5 223.1-30.9 154.6c-4.3 21.6 13 38.3 31.4 38.3 15.2 0 28-9.1 32.3-30.4.9 16.9 14.6 30.4 31.7 30.4 17.7 0 32-14.3 32-32 0 17.7 14.3 32 32 32s32-14.3 32-32V0H288v32zm-96 0v160h64V0h-32c-17.7 0-32 14.3-32 32zM544 0h-32v496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V32c0-17.7-14.3-32-32-32z\"]\n};\nvar faPhone = {\n prefix: 'fas',\n iconName: 'phone',\n icon: [512, 512, [], \"f095\", \"M493.4 24.6l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-36 76.7-98.9 140.5-177.2 177.2l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48C3.9 366.5-2 378.1.6 389.4l24 104C27.1 504.2 36.7 512 48 512c256.1 0 464-207.5 464-464 0-11.2-7.7-20.9-18.6-23.4z\"]\n};\nvar faPhoneAlt = {\n prefix: 'fas',\n iconName: 'phone-alt',\n icon: [512, 512, [], \"f879\", \"M497.39 361.8l-112-48a24 24 0 0 0-28 6.9l-49.6 60.6A370.66 370.66 0 0 1 130.6 204.11l60.6-49.6a23.94 23.94 0 0 0 6.9-28l-48-112A24.16 24.16 0 0 0 122.6.61l-104 24A24 24 0 0 0 0 48c0 256.5 207.9 464 464 464a24 24 0 0 0 23.4-18.6l24-104a24.29 24.29 0 0 0-14.01-27.6z\"]\n};\nvar faPhoneSlash = {\n prefix: 'fas',\n iconName: 'phone-slash',\n icon: [640, 512, [], \"f3dd\", \"M268.2 381.4l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48c-10.7 4.6-16.5 16.1-13.9 27.5l24 104c2.5 10.8 12.1 18.6 23.4 18.6 100.7 0 193.7-32.4 269.7-86.9l-80-61.8c-10.9 6.5-22.1 12.7-33.6 18.1zm365.6 76.7L475.1 335.5C537.9 256.4 576 156.9 576 48c0-11.2-7.7-20.9-18.6-23.4l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-12.2 26.1-27.9 50.3-46 72.8L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3z\"]\n};\nvar faPhoneSquare = {\n prefix: 'fas',\n iconName: 'phone-square',\n icon: [448, 512, [], \"f098\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM94 416c-7.033 0-13.057-4.873-14.616-11.627l-14.998-65a15 15 0 0 1 8.707-17.16l69.998-29.999a15 15 0 0 1 17.518 4.289l30.997 37.885c48.944-22.963 88.297-62.858 110.781-110.78l-37.886-30.997a15.001 15.001 0 0 1-4.289-17.518l30-69.998a15 15 0 0 1 17.16-8.707l65 14.998A14.997 14.997 0 0 1 384 126c0 160.292-129.945 290-290 290z\"]\n};\nvar faPhoneSquareAlt = {\n prefix: 'fas',\n iconName: 'phone-square-alt',\n icon: [448, 512, [], \"f87b\", \"M400 32H48A48 48 0 0 0 0 80v352a48 48 0 0 0 48 48h352a48 48 0 0 0 48-48V80a48 48 0 0 0-48-48zm-16.39 307.37l-15 65A15 15 0 0 1 354 416C194 416 64 286.29 64 126a15.7 15.7 0 0 1 11.63-14.61l65-15A18.23 18.23 0 0 1 144 96a16.27 16.27 0 0 1 13.79 9.09l30 70A17.9 17.9 0 0 1 189 181a17 17 0 0 1-5.5 11.61l-37.89 31a231.91 231.91 0 0 0 110.78 110.78l31-37.89A17 17 0 0 1 299 291a17.85 17.85 0 0 1 5.91 1.21l70 30A16.25 16.25 0 0 1 384 336a17.41 17.41 0 0 1-.39 3.37z\"]\n};\nvar faPhoneVolume = {\n prefix: 'fas',\n iconName: 'phone-volume',\n icon: [384, 512, [], \"f2a0\", \"M97.333 506.966c-129.874-129.874-129.681-340.252 0-469.933 5.698-5.698 14.527-6.632 21.263-2.422l64.817 40.513a17.187 17.187 0 0 1 6.849 20.958l-32.408 81.021a17.188 17.188 0 0 1-17.669 10.719l-55.81-5.58c-21.051 58.261-20.612 122.471 0 179.515l55.811-5.581a17.188 17.188 0 0 1 17.669 10.719l32.408 81.022a17.188 17.188 0 0 1-6.849 20.958l-64.817 40.513a17.19 17.19 0 0 1-21.264-2.422zM247.126 95.473c11.832 20.047 11.832 45.008 0 65.055-3.95 6.693-13.108 7.959-18.718 2.581l-5.975-5.726c-3.911-3.748-4.793-9.622-2.261-14.41a32.063 32.063 0 0 0 0-29.945c-2.533-4.788-1.65-10.662 2.261-14.41l5.975-5.726c5.61-5.378 14.768-4.112 18.718 2.581zm91.787-91.187c60.14 71.604 60.092 175.882 0 247.428-4.474 5.327-12.53 5.746-17.552.933l-5.798-5.557c-4.56-4.371-4.977-11.529-.93-16.379 49.687-59.538 49.646-145.933 0-205.422-4.047-4.85-3.631-12.008.93-16.379l5.798-5.557c5.022-4.813 13.078-4.394 17.552.933zm-45.972 44.941c36.05 46.322 36.108 111.149 0 157.546-4.39 5.641-12.697 6.251-17.856 1.304l-5.818-5.579c-4.4-4.219-4.998-11.095-1.285-15.931 26.536-34.564 26.534-82.572 0-117.134-3.713-4.836-3.115-11.711 1.285-15.931l5.818-5.579c5.159-4.947 13.466-4.337 17.856 1.304z\"]\n};\nvar faPhotoVideo = {\n prefix: 'fas',\n iconName: 'photo-video',\n icon: [640, 512, [], \"f87c\", \"M608 0H160a32 32 0 0 0-32 32v96h160V64h192v320h128a32 32 0 0 0 32-32V32a32 32 0 0 0-32-32zM232 103a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm352 208a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm-168 57H32a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h384a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32zM96 224a32 32 0 1 1-32 32 32 32 0 0 1 32-32zm288 224H64v-32l64-64 32 32 128-128 96 96z\"]\n};\nvar faPiggyBank = {\n prefix: 'fas',\n iconName: 'piggy-bank',\n icon: [576, 512, [], \"f4d3\", \"M560 224h-29.5c-8.8-20-21.6-37.7-37.4-52.5L512 96h-32c-29.4 0-55.4 13.5-73 34.3-7.6-1.1-15.1-2.3-23-2.3H256c-77.4 0-141.9 55-156.8 128H56c-14.8 0-26.5-13.5-23.5-28.8C34.7 215.8 45.4 208 57 208h1c3.3 0 6-2.7 6-6v-20c0-3.3-2.7-6-6-6-28.5 0-53.9 20.4-57.5 48.6C-3.9 258.8 22.7 288 56 288h40c0 52.2 25.4 98.1 64 127.3V496c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-48h128v48c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-80.7c11.8-8.9 22.3-19.4 31.3-31.3H560c8.8 0 16-7.2 16-16V240c0-8.8-7.2-16-16-16zm-128 64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zM256 96h128c5.4 0 10.7.4 15.9.8 0-.3.1-.5.1-.8 0-53-43-96-96-96s-96 43-96 96c0 2.1.5 4.1.6 6.2 15.2-3.9 31-6.2 47.4-6.2z\"]\n};\nvar faPills = {\n prefix: 'fas',\n iconName: 'pills',\n icon: [576, 512, [], \"f484\", \"M112 32C50.1 32 0 82.1 0 144v224c0 61.9 50.1 112 112 112s112-50.1 112-112V144c0-61.9-50.1-112-112-112zm48 224H64V144c0-26.5 21.5-48 48-48s48 21.5 48 48v112zm139.7-29.7c-3.5-3.5-9.4-3.1-12.3.8-45.3 62.5-40.4 150.1 15.9 206.4 56.3 56.3 143.9 61.2 206.4 15.9 4-2.9 4.3-8.8.8-12.3L299.7 226.3zm229.8-19c-56.3-56.3-143.9-61.2-206.4-15.9-4 2.9-4.3 8.8-.8 12.3l210.8 210.8c3.5 3.5 9.4 3.1 12.3-.8 45.3-62.6 40.5-150.1-15.9-206.4z\"]\n};\nvar faPizzaSlice = {\n prefix: 'fas',\n iconName: 'pizza-slice',\n icon: [512, 512, [], \"f818\", \"M158.87.15c-16.16-1.52-31.2 8.42-35.33 24.12l-14.81 56.27c187.62 5.49 314.54 130.61 322.48 317l56.94-15.78c15.72-4.36 25.49-19.68 23.62-35.9C490.89 165.08 340.78 17.32 158.87.15zm-58.47 112L.55 491.64a16.21 16.21 0 0 0 20 19.75l379-105.1c-4.27-174.89-123.08-292.14-299.15-294.1zM128 416a32 32 0 1 1 32-32 32 32 0 0 1-32 32zm48-152a32 32 0 1 1 32-32 32 32 0 0 1-32 32zm104 104a32 32 0 1 1 32-32 32 32 0 0 1-32 32z\"]\n};\nvar faPlaceOfWorship = {\n prefix: 'fas',\n iconName: 'place-of-worship',\n icon: [640, 512, [], \"f67f\", \"M620.61 366.55L512 320v192h112c8.84 0 16-7.16 16-16V395.96a32 32 0 0 0-19.39-29.41zM0 395.96V496c0 8.84 7.16 16 16 16h112V320L19.39 366.55A32 32 0 0 0 0 395.96zm464.46-149.28L416 217.6V102.63c0-8.49-3.37-16.62-9.38-22.63L331.31 4.69c-6.25-6.25-16.38-6.25-22.62 0L233.38 80c-6 6-9.38 14.14-9.38 22.63V217.6l-48.46 29.08A31.997 31.997 0 0 0 160 274.12V512h96v-96c0-35.35 28.66-64 64-64s64 28.65 64 64v96h96V274.12c0-11.24-5.9-21.66-15.54-27.44z\"]\n};\nvar faPlane = {\n prefix: 'fas',\n iconName: 'plane',\n icon: [576, 512, [], \"f072\", \"M480 192H365.71L260.61 8.06A16.014 16.014 0 0 0 246.71 0h-65.5c-10.63 0-18.3 10.17-15.38 20.39L214.86 192H112l-43.2-57.6c-3.02-4.03-7.77-6.4-12.8-6.4H16.01C5.6 128-2.04 137.78.49 147.88L32 256 .49 364.12C-2.04 374.22 5.6 384 16.01 384H56c5.04 0 9.78-2.37 12.8-6.4L112 320h102.86l-49.03 171.6c-2.92 10.22 4.75 20.4 15.38 20.4h65.5c5.74 0 11.04-3.08 13.89-8.06L365.71 320H480c35.35 0 96-28.65 96-64s-60.65-64-96-64z\"]\n};\nvar faPlaneArrival = {\n prefix: 'fas',\n iconName: 'plane-arrival',\n icon: [640, 512, [], \"f5af\", \"M624 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM44.81 205.66l88.74 80a62.607 62.607 0 0 0 25.47 13.93l287.6 78.35c26.48 7.21 54.56 8.72 81 1.36 29.67-8.27 43.44-21.21 47.25-35.71 3.83-14.5-1.73-32.71-23.37-54.96-19.28-19.82-44.35-32.79-70.83-40l-97.51-26.56L282.8 30.22c-1.51-5.81-5.95-10.35-11.66-11.91L206.05.58c-10.56-2.88-20.9 5.32-20.71 16.44l47.92 164.21-102.2-27.84-27.59-67.88c-1.93-4.89-6.01-8.57-11.02-9.93L52.72 64.75c-10.34-2.82-20.53 5-20.72 15.88l.23 101.78c.19 8.91 6.03 17.34 12.58 23.25z\"]\n};\nvar faPlaneDeparture = {\n prefix: 'fas',\n iconName: 'plane-departure',\n icon: [640, 512, [], \"f5b0\", \"M624 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM80.55 341.27c6.28 6.84 15.1 10.72 24.33 10.71l130.54-.18a65.62 65.62 0 0 0 29.64-7.12l290.96-147.65c26.74-13.57 50.71-32.94 67.02-58.31 18.31-28.48 20.3-49.09 13.07-63.65-7.21-14.57-24.74-25.27-58.25-27.45-29.85-1.94-59.54 5.92-86.28 19.48l-98.51 49.99-218.7-82.06a17.799 17.799 0 0 0-18-1.11L90.62 67.29c-10.67 5.41-13.25 19.65-5.17 28.53l156.22 98.1-103.21 52.38-72.35-36.47a17.804 17.804 0 0 0-16.07.02L9.91 230.22c-10.44 5.3-13.19 19.12-5.57 28.08l76.21 82.97z\"]\n};\nvar faPlay = {\n prefix: 'fas',\n iconName: 'play',\n icon: [448, 512, [], \"f04b\", \"M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z\"]\n};\nvar faPlayCircle = {\n prefix: 'fas',\n iconName: 'play-circle',\n icon: [512, 512, [], \"f144\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm115.7 272l-176 101c-15.8 8.8-35.7-2.5-35.7-21V152c0-18.4 19.8-29.8 35.7-21l176 107c16.4 9.2 16.4 32.9 0 42z\"]\n};\nvar faPlug = {\n prefix: 'fas',\n iconName: 'plug',\n icon: [384, 512, [], \"f1e6\", \"M256 144V32c0-17.673 14.327-32 32-32s32 14.327 32 32v112h-64zm112 16H16c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16h16v32c0 77.406 54.969 141.971 128 156.796V512h64v-99.204c73.031-14.825 128-79.39 128-156.796v-32h16c8.837 0 16-7.163 16-16v-32c0-8.837-7.163-16-16-16zm-240-16V32c0-17.673-14.327-32-32-32S64 14.327 64 32v112h64z\"]\n};\nvar faPlus = {\n prefix: 'fas',\n iconName: 'plus',\n icon: [448, 512, [], \"f067\", \"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faPlusCircle = {\n prefix: 'fas',\n iconName: 'plus-circle',\n icon: [512, 512, [], \"f055\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm144 276c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92h-92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z\"]\n};\nvar faPlusSquare = {\n prefix: 'fas',\n iconName: 'plus-square',\n icon: [448, 512, [], \"f0fe\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-32 252c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92H92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z\"]\n};\nvar faPodcast = {\n prefix: 'fas',\n iconName: 'podcast',\n icon: [448, 512, [], \"f2ce\", \"M267.429 488.563C262.286 507.573 242.858 512 224 512c-18.857 0-38.286-4.427-43.428-23.437C172.927 460.134 160 388.898 160 355.75c0-35.156 31.142-43.75 64-43.75s64 8.594 64 43.75c0 32.949-12.871 104.179-20.571 132.813zM156.867 288.554c-18.693-18.308-29.958-44.173-28.784-72.599 2.054-49.724 42.395-89.956 92.124-91.881C274.862 121.958 320 165.807 320 220c0 26.827-11.064 51.116-28.866 68.552-2.675 2.62-2.401 6.986.628 9.187 9.312 6.765 16.46 15.343 21.234 25.363 1.741 3.654 6.497 4.66 9.449 1.891 28.826-27.043 46.553-65.783 45.511-108.565-1.855-76.206-63.595-138.208-139.793-140.369C146.869 73.753 80 139.215 80 220c0 41.361 17.532 78.7 45.55 104.989 2.953 2.771 7.711 1.77 9.453-1.887 4.774-10.021 11.923-18.598 21.235-25.363 3.029-2.2 3.304-6.566.629-9.185zM224 0C100.204 0 0 100.185 0 224c0 89.992 52.602 165.647 125.739 201.408 4.333 2.118 9.267-1.544 8.535-6.31-2.382-15.512-4.342-30.946-5.406-44.339-.146-1.836-1.149-3.486-2.678-4.512-47.4-31.806-78.564-86.016-78.187-147.347.592-96.237 79.29-174.648 175.529-174.899C320.793 47.747 400 126.797 400 224c0 61.932-32.158 116.49-80.65 147.867-.999 14.037-3.069 30.588-5.624 47.23-.732 4.767 4.203 8.429 8.535 6.31C395.227 389.727 448 314.187 448 224 448 100.205 347.815 0 224 0zm0 160c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64z\"]\n};\nvar faPoll = {\n prefix: 'fas',\n iconName: 'poll',\n icon: [448, 512, [], \"f681\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM160 368c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16V240c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v128zm96 0c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16V144c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v224zm96 0c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-64c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v64z\"]\n};\nvar faPollH = {\n prefix: 'fas',\n iconName: 'poll-h',\n icon: [448, 512, [], \"f682\", \"M448 432V80c0-26.5-21.5-48-48-48H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48zM112 192c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h128c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16H112zm0 96c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h224c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16H112zm0 96c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16h-64z\"]\n};\nvar faPoo = {\n prefix: 'fas',\n iconName: 'poo',\n icon: [512, 512, [], \"f2fe\", \"M451.4 369.1C468.7 356 480 335.4 480 312c0-39.8-32.2-72-72-72h-14.1c13.4-11.7 22.1-28.8 22.1-48 0-35.3-28.7-64-64-64h-5.9c3.6-10.1 5.9-20.7 5.9-32 0-53-43-96-96-96-5.2 0-10.2.7-15.1 1.5C250.3 14.6 256 30.6 256 48c0 44.2-35.8 80-80 80h-16c-35.3 0-64 28.7-64 64 0 19.2 8.7 36.3 22.1 48H104c-39.8 0-72 32.2-72 72 0 23.4 11.3 44 28.6 57.1C26.3 374.6 0 404.1 0 440c0 39.8 32.2 72 72 72h368c39.8 0 72-32.2 72-72 0-35.9-26.3-65.4-60.6-70.9zM192 256c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm159.5 139C341 422.9 293 448 256 448s-85-25.1-95.5-53c-2-5.3 2-11 7.8-11h175.4c5.8 0 9.8 5.7 7.8 11zM320 320c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faPooStorm = {\n prefix: 'fas',\n iconName: 'poo-storm',\n icon: [448, 512, [], \"f75a\", \"M308 336h-57.7l17.3-64.9c2-7.6-3.7-15.1-11.6-15.1h-68c-6 0-11.1 4.5-11.9 10.4l-16 120c-1 7.2 4.6 13.6 11.9 13.6h59.3l-23 97.2c-1.8 7.6 4 14.8 11.7 14.8 4.2 0 8.2-2.2 10.4-6l88-152c4.6-8-1.2-18-10.4-18zm66.4-111.3c5.9-9.6 9.6-20.6 9.6-32.7 0-35.3-28.7-64-64-64h-5.9c3.6-10.1 5.9-20.7 5.9-32 0-53-43-96-96-96-5.2 0-10.2.7-15.1 1.5C218.3 14.6 224 30.6 224 48c0 44.2-35.8 80-80 80h-16c-35.3 0-64 28.7-64 64 0 12.1 3.7 23.1 9.6 32.7C32.6 228 0 262.2 0 304c0 44 36 80 80 80h48.3c.1-.6 0-1.2 0-1.8l16-120c3-21.8 21.7-38.2 43.7-38.2h68c13.8 0 26.5 6.3 34.9 17.2s11.2 24.8 7.6 38.1l-6.6 24.7h16c15.7 0 30.3 8.4 38.1 22 7.8 13.6 7.8 30.5 0 44l-8.1 14h30c44 0 80-36 80-80 .1-41.8-32.5-76-73.5-79.3z\"]\n};\nvar faPoop = {\n prefix: 'fas',\n iconName: 'poop',\n icon: [512, 512, [], \"f619\", \"M451.36 369.14C468.66 355.99 480 335.41 480 312c0-39.77-32.24-72-72-72h-14.07c13.42-11.73 22.07-28.78 22.07-48 0-35.35-28.65-64-64-64h-5.88c3.57-10.05 5.88-20.72 5.88-32 0-53.02-42.98-96-96-96-5.17 0-10.15.74-15.11 1.52C250.31 14.64 256 30.62 256 48c0 44.18-35.82 80-80 80h-16c-35.35 0-64 28.65-64 64 0 19.22 8.65 36.27 22.07 48H104c-39.76 0-72 32.23-72 72 0 23.41 11.34 43.99 28.64 57.14C26.31 374.62 0 404.12 0 440c0 39.76 32.24 72 72 72h368c39.76 0 72-32.24 72-72 0-35.88-26.31-65.38-60.64-70.86z\"]\n};\nvar faPortrait = {\n prefix: 'fas',\n iconName: 'portrait',\n icon: [384, 512, [], \"f3e0\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM192 128c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H102.4C90 384 80 375.4 80 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z\"]\n};\nvar faPoundSign = {\n prefix: 'fas',\n iconName: 'pound-sign',\n icon: [320, 512, [], \"f154\", \"M308 352h-45.495c-6.627 0-12 5.373-12 12v50.848H128V288h84c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-84v-63.556c0-32.266 24.562-57.086 61.792-57.086 23.658 0 45.878 11.505 57.652 18.849 5.151 3.213 11.888 2.051 15.688-2.685l28.493-35.513c4.233-5.276 3.279-13.005-2.119-17.081C273.124 54.56 236.576 32 187.931 32 106.026 32 48 84.742 48 157.961V224H20c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h28v128H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h296c6.627 0 12-5.373 12-12V364c0-6.627-5.373-12-12-12z\"]\n};\nvar faPowerOff = {\n prefix: 'fas',\n iconName: 'power-off',\n icon: [512, 512, [], \"f011\", \"M400 54.1c63 45 104 118.6 104 201.9 0 136.8-110.8 247.7-247.5 248C120 504.3 8.2 393 8 256.4 7.9 173.1 48.9 99.3 111.8 54.2c11.7-8.3 28-4.8 35 7.7L162.6 90c5.9 10.5 3.1 23.8-6.6 31-41.5 30.8-68 79.6-68 134.9-.1 92.3 74.5 168.1 168 168.1 91.6 0 168.6-74.2 168-169.1-.3-51.8-24.7-101.8-68.1-134-9.7-7.2-12.4-20.5-6.5-30.9l15.8-28.1c7-12.4 23.2-16.1 34.8-7.8zM296 264V24c0-13.3-10.7-24-24-24h-32c-13.3 0-24 10.7-24 24v240c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24z\"]\n};\nvar faPray = {\n prefix: 'fas',\n iconName: 'pray',\n icon: [384, 512, [], \"f683\", \"M256 128c35.35 0 64-28.65 64-64S291.35 0 256 0s-64 28.65-64 64 28.65 64 64 64zm-30.63 169.75c14.06 16.72 39 19.09 55.97 5.22l88-72.02c17.09-13.98 19.59-39.19 5.62-56.28-13.97-17.11-39.19-19.59-56.31-5.62l-57.44 47-38.91-46.31c-15.44-18.39-39.22-27.92-64-25.33-24.19 2.48-45.25 16.27-56.37 36.92l-49.37 92.03c-23.4 43.64-8.69 96.37 34.19 123.75L131.56 432H40c-22.09 0-40 17.91-40 40s17.91 40 40 40h208c34.08 0 53.77-42.79 28.28-68.28L166.42 333.86l34.8-64.87 24.15 28.76z\"]\n};\nvar faPrayingHands = {\n prefix: 'fas',\n iconName: 'praying-hands',\n icon: [640, 512, [], \"f684\", \"M272 191.91c-17.6 0-32 14.4-32 32v80c0 8.84-7.16 16-16 16s-16-7.16-16-16v-76.55c0-17.39 4.72-34.47 13.69-49.39l77.75-129.59c9.09-15.16 4.19-34.81-10.97-43.91-14.45-8.67-32.72-4.3-42.3 9.21-.2.23-.62.21-.79.48l-117.26 175.9C117.56 205.9 112 224.31 112 243.29v80.23l-90.12 30.04A31.974 31.974 0 0 0 0 383.91v96c0 10.82 8.52 32 32 32 2.69 0 5.41-.34 8.06-1.03l179.19-46.62C269.16 449.99 304 403.8 304 351.91v-128c0-17.6-14.4-32-32-32zm346.12 161.73L528 323.6v-80.23c0-18.98-5.56-37.39-16.12-53.23L394.62 14.25c-.18-.27-.59-.24-.79-.48-9.58-13.51-27.85-17.88-42.3-9.21-15.16 9.09-20.06 28.75-10.97 43.91l77.75 129.59c8.97 14.92 13.69 32 13.69 49.39V304c0 8.84-7.16 16-16 16s-16-7.16-16-16v-80c0-17.6-14.4-32-32-32s-32 14.4-32 32v128c0 51.89 34.84 98.08 84.75 112.34l179.19 46.62c2.66.69 5.38 1.03 8.06 1.03 23.48 0 32-21.18 32-32v-96c0-13.77-8.81-25.99-21.88-30.35z\"]\n};\nvar faPrescription = {\n prefix: 'fas',\n iconName: 'prescription',\n icon: [384, 512, [], \"f5b1\", \"M301.26 352l78.06-78.06c6.25-6.25 6.25-16.38 0-22.63l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0L256 306.74l-83.96-83.96C219.31 216.8 256 176.89 256 128c0-53.02-42.98-96-96-96H16C7.16 32 0 39.16 0 48v256c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-80h18.75l128 128-78.06 78.06c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0L256 397.25l78.06 78.06c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.25-6.25 6.25-16.38 0-22.63L301.26 352zM64 96h96c17.64 0 32 14.36 32 32s-14.36 32-32 32H64V96z\"]\n};\nvar faPrescriptionBottle = {\n prefix: 'fas',\n iconName: 'prescription-bottle',\n icon: [384, 512, [], \"f485\", \"M32 192h120c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H32v64h120c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H32v64h120c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H32v64c0 17.6 14.4 32 32 32h256c17.6 0 32-14.4 32-32V128H32v64zM360 0H24C10.8 0 0 10.8 0 24v48c0 13.2 10.8 24 24 24h336c13.2 0 24-10.8 24-24V24c0-13.2-10.8-24-24-24z\"]\n};\nvar faPrescriptionBottleAlt = {\n prefix: 'fas',\n iconName: 'prescription-bottle-alt',\n icon: [384, 512, [], \"f486\", \"M360 0H24C10.8 0 0 10.8 0 24v48c0 13.2 10.8 24 24 24h336c13.2 0 24-10.8 24-24V24c0-13.2-10.8-24-24-24zM32 480c0 17.6 14.4 32 32 32h256c17.6 0 32-14.4 32-32V128H32v352zm64-184c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48z\"]\n};\nvar faPrint = {\n prefix: 'fas',\n iconName: 'print',\n icon: [512, 512, [], \"f02f\", \"M448 192V77.25c0-8.49-3.37-16.62-9.37-22.63L393.37 9.37c-6-6-14.14-9.37-22.63-9.37H96C78.33 0 64 14.33 64 32v160c-35.35 0-64 28.65-64 64v112c0 8.84 7.16 16 16 16h48v96c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-96h48c8.84 0 16-7.16 16-16V256c0-35.35-28.65-64-64-64zm-64 256H128v-96h256v96zm0-224H128V64h192v48c0 8.84 7.16 16 16 16h48v96zm48 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faProcedures = {\n prefix: 'fas',\n iconName: 'procedures',\n icon: [640, 512, [], \"f487\", \"M528 224H272c-8.8 0-16 7.2-16 16v144H64V144c0-8.8-7.2-16-16-16H16c-8.8 0-16 7.2-16 16v352c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-48h512v48c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V336c0-61.9-50.1-112-112-112zM136 96h126.1l27.6 55.2c5.9 11.8 22.7 11.8 28.6 0L368 51.8 390.1 96H512c8.8 0 16-7.2 16-16s-7.2-16-16-16H409.9L382.3 8.8C376.4-3 359.6-3 353.7 8.8L304 108.2l-19.9-39.8c-1.4-2.7-4.1-4.4-7.2-4.4H136c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm24 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z\"]\n};\nvar faProjectDiagram = {\n prefix: 'fas',\n iconName: 'project-diagram',\n icon: [640, 512, [], \"f542\", \"M384 320H256c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32zM192 32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v128c0 17.67 14.33 32 32 32h95.72l73.16 128.04C211.98 300.98 232.4 288 256 288h.28L192 175.51V128h224V64H192V32zM608 0H480c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32z\"]\n};\nvar faPuzzlePiece = {\n prefix: 'fas',\n iconName: 'puzzle-piece',\n icon: [576, 512, [], \"f12e\", \"M519.442 288.651c-41.519 0-59.5 31.593-82.058 31.593C377.409 320.244 432 144 432 144s-196.288 80-196.288-3.297c0-35.827 36.288-46.25 36.288-85.985C272 19.216 243.885 0 210.539 0c-34.654 0-66.366 18.891-66.366 56.346 0 41.364 31.711 59.277 31.711 81.75C175.885 207.719 0 166.758 0 166.758v333.237s178.635 41.047 178.635-28.662c0-22.473-40-40.107-40-81.471 0-37.456 29.25-56.346 63.577-56.346 33.673 0 61.788 19.216 61.788 54.717 0 39.735-36.288 50.158-36.288 85.985 0 60.803 129.675 25.73 181.23 25.73 0 0-34.725-120.101 25.827-120.101 35.962 0 46.423 36.152 86.308 36.152C556.712 416 576 387.99 576 354.443c0-34.199-18.962-65.792-56.558-65.792z\"]\n};\nvar faQrcode = {\n prefix: 'fas',\n iconName: 'qrcode',\n icon: [448, 512, [], \"f029\", \"M0 224h192V32H0v192zM64 96h64v64H64V96zm192-64v192h192V32H256zm128 128h-64V96h64v64zM0 480h192V288H0v192zm64-128h64v64H64v-64zm352-64h32v128h-96v-32h-32v96h-64V288h96v32h64v-32zm0 160h32v32h-32v-32zm-64 0h32v32h-32v-32z\"]\n};\nvar faQuestion = {\n prefix: 'fas',\n iconName: 'question',\n icon: [384, 512, [], \"f128\", \"M202.021 0C122.202 0 70.503 32.703 29.914 91.026c-7.363 10.58-5.093 25.086 5.178 32.874l43.138 32.709c10.373 7.865 25.132 6.026 33.253-4.148 25.049-31.381 43.63-49.449 82.757-49.449 30.764 0 68.816 19.799 68.816 49.631 0 22.552-18.617 34.134-48.993 51.164-35.423 19.86-82.299 44.576-82.299 106.405V320c0 13.255 10.745 24 24 24h72.471c13.255 0 24-10.745 24-24v-5.773c0-42.86 125.268-44.645 125.268-160.627C377.504 66.256 286.902 0 202.021 0zM192 373.459c-38.196 0-69.271 31.075-69.271 69.271 0 38.195 31.075 69.27 69.271 69.27s69.271-31.075 69.271-69.271-31.075-69.27-69.271-69.27z\"]\n};\nvar faQuestionCircle = {\n prefix: 'fas',\n iconName: 'question-circle',\n icon: [512, 512, [], \"f059\", \"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zM262.655 90c-54.497 0-89.255 22.957-116.549 63.758-3.536 5.286-2.353 12.415 2.715 16.258l34.699 26.31c5.205 3.947 12.621 3.008 16.665-2.122 17.864-22.658 30.113-35.797 57.303-35.797 20.429 0 45.698 13.148 45.698 32.958 0 14.976-12.363 22.667-32.534 33.976C247.128 238.528 216 254.941 216 296v4c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12v-1.333c0-28.462 83.186-29.647 83.186-106.667 0-58.002-60.165-102-116.531-102zM256 338c-25.365 0-46 20.635-46 46 0 25.364 20.635 46 46 46s46-20.636 46-46c0-25.365-20.635-46-46-46z\"]\n};\nvar faQuidditch = {\n prefix: 'fas',\n iconName: 'quidditch',\n icon: [640, 512, [], \"f458\", \"M256.5 216.8L343.2 326s-16.6 102.4-76.6 150.1C206.7 523.8 0 510.2 0 510.2s3.8-23.1 11-55.4l94.6-112.2c4-4.7-.9-11.6-6.6-9.5l-60.4 22.1c14.4-41.7 32.7-80 54.6-97.5 59.9-47.8 163.3-40.9 163.3-40.9zm238 135c-44 0-79.8 35.8-79.8 79.9 0 44.1 35.7 79.9 79.8 79.9 44.1 0 79.8-35.8 79.8-79.9 0-44.2-35.8-79.9-79.8-79.9zM636.5 31L616.7 6c-5.5-6.9-15.5-8-22.4-2.6L361.8 181.3l-34.1-43c-5.1-6.4-15.1-5.2-18.6 2.2l-25.3 54.6 86.7 109.2 58.8-12.4c8-1.7 11.4-11.2 6.3-17.6l-34.1-42.9L634 53.5c6.9-5.5 8-15.6 2.5-22.5z\"]\n};\nvar faQuoteLeft = {\n prefix: 'fas',\n iconName: 'quote-left',\n icon: [512, 512, [], \"f10d\", \"M464 256h-80v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8c-88.4 0-160 71.6-160 160v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zm-288 0H96v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8C71.6 32 0 103.6 0 192v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\"]\n};\nvar faQuoteRight = {\n prefix: 'fas',\n iconName: 'quote-right',\n icon: [512, 512, [], \"f10e\", \"M464 32H336c-26.5 0-48 21.5-48 48v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48zm-288 0H48C21.5 32 0 53.5 0 80v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faQuran = {\n prefix: 'fas',\n iconName: 'quran',\n icon: [448, 512, [], \"f687\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM301.08 145.82c.6-1.21 1.76-1.82 2.92-1.82s2.32.61 2.92 1.82l11.18 22.65 25 3.63c2.67.39 3.74 3.67 1.81 5.56l-18.09 17.63 4.27 24.89c.36 2.11-1.31 3.82-3.21 3.82-.5 0-1.02-.12-1.52-.38L304 211.87l-22.36 11.75c-.5.26-1.02.38-1.52.38-1.9 0-3.57-1.71-3.21-3.82l4.27-24.89-18.09-17.63c-1.94-1.89-.87-5.17 1.81-5.56l24.99-3.63 11.19-22.65zm-57.89-69.01c13.67 0 27.26 2.49 40.38 7.41a6.775 6.775 0 1 1-2.38 13.12c-.67 0-3.09-.21-4.13-.21-52.31 0-94.86 42.55-94.86 94.86 0 52.3 42.55 94.86 94.86 94.86 1.03 0 3.48-.21 4.13-.21 3.93 0 6.8 3.14 6.8 6.78 0 2.98-1.94 5.51-4.62 6.42-13.07 4.87-26.59 7.34-40.19 7.34C179.67 307.19 128 255.51 128 192c0-63.52 51.67-115.19 115.19-115.19zM380.8 448H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8v64z\"]\n};\nvar faRadiation = {\n prefix: 'fas',\n iconName: 'radiation',\n icon: [496, 512, [], \"f7b9\", \"M328.2 255.8h151.6c9.1 0 16.8-7.7 16.2-16.8-5.1-75.8-44.4-142.2-102.5-184.2-7.4-5.3-17.9-2.9-22.7 4.8L290.4 188c22.6 14.3 37.8 39.2 37.8 67.8zm-37.8 67.7c-12.3 7.7-26.8 12.4-42.4 12.4-15.6 0-30-4.7-42.4-12.4L125.2 452c-4.8 7.7-2.4 18.1 5.6 22.4C165.7 493.2 205.6 504 248 504s82.3-10.8 117.2-29.6c8-4.3 10.4-14.8 5.6-22.4l-80.4-128.5zM248 303.8c26.5 0 48-21.5 48-48s-21.5-48-48-48-48 21.5-48 48 21.5 48 48 48zm-231.8-48h151.6c0-28.6 15.2-53.5 37.8-67.7L125.2 59.7c-4.8-7.7-15.3-10.2-22.7-4.8C44.4 96.9 5.1 163.3 0 239.1c-.6 9 7.1 16.7 16.2 16.7z\"]\n};\nvar faRadiationAlt = {\n prefix: 'fas',\n iconName: 'radiation-alt',\n icon: [496, 512, [], \"f7ba\", \"M312 256h79.1c9.2 0 16.9-7.7 16-16.8-4.6-43.6-27-81.8-59.5-107.8-7.6-6.1-18.8-4.5-24 3.8L281.9 202c18 11.2 30.1 31.2 30.1 54zm-97.8 54.1L172.4 377c-4.9 7.8-2.4 18.4 5.8 22.5 21.1 10.4 44.7 16.5 69.8 16.5s48.7-6.1 69.9-16.5c8.2-4.1 10.6-14.7 5.8-22.5l-41.8-66.9c-9.8 6.2-21.4 9.9-33.8 9.9s-24.1-3.7-33.9-9.9zM104.9 256H184c0-22.8 12.1-42.8 30.2-54.1l-41.7-66.8c-5.2-8.3-16.4-9.9-24-3.8-32.6 26-54.9 64.2-59.5 107.8-1.1 9.2 6.7 16.9 15.9 16.9zM248 504c137 0 248-111 248-248S385 8 248 8 0 119 0 256s111 248 248 248zm0-432c101.5 0 184 82.5 184 184s-82.5 184-184 184S64 357.5 64 256 146.5 72 248 72zm0 216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faRainbow = {\n prefix: 'fas',\n iconName: 'rainbow',\n icon: [576, 512, [], \"f75b\", \"M268.3 32.7C115.4 42.9 0 176.9 0 330.2V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320C64 186.8 180.9 80.3 317.5 97.9 430.4 112.4 512 214 512 327.8V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-165.3-140-298.6-307.7-287.3zm-5.6 96.9C166 142 96 229.1 96 326.7V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-74.8 64.5-134.8 140.8-127.4 66.5 6.5 115.2 66.2 115.2 133.1V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-114.2-100.2-205.4-217.3-190.4zm6.2 96.3c-45.6 8.9-76.9 51.5-76.9 97.9V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-17.6 14.3-32 32-32s32 14.4 32 32v144c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-59.2-53.8-106-115.1-94.1z\"]\n};\nvar faRandom = {\n prefix: 'fas',\n iconName: 'random',\n icon: [512, 512, [], \"f074\", \"M504.971 359.029c9.373 9.373 9.373 24.569 0 33.941l-80 79.984c-15.01 15.01-40.971 4.49-40.971-16.971V416h-58.785a12.004 12.004 0 0 1-8.773-3.812l-70.556-75.596 53.333-57.143L352 336h32v-39.981c0-21.438 25.943-31.998 40.971-16.971l80 79.981zM12 176h84l52.781 56.551 53.333-57.143-70.556-75.596A11.999 11.999 0 0 0 122.785 96H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12zm372 0v39.984c0 21.46 25.961 31.98 40.971 16.971l80-79.984c9.373-9.373 9.373-24.569 0-33.941l-80-79.981C409.943 24.021 384 34.582 384 56.019V96h-58.785a12.004 12.004 0 0 0-8.773 3.812L96 336H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h110.785c3.326 0 6.503-1.381 8.773-3.812L352 176h32z\"]\n};\nvar faReceipt = {\n prefix: 'fas',\n iconName: 'receipt',\n icon: [384, 512, [], \"f543\", \"M358.4 3.2L320 48 265.6 3.2a15.9 15.9 0 0 0-19.2 0L192 48 137.6 3.2a15.9 15.9 0 0 0-19.2 0L64 48 25.6 3.2C15-4.7 0 2.8 0 16v480c0 13.2 15 20.7 25.6 12.8L64 464l54.4 44.8a15.9 15.9 0 0 0 19.2 0L192 464l54.4 44.8a15.9 15.9 0 0 0 19.2 0L320 464l38.4 44.8c10.5 7.9 25.6.4 25.6-12.8V16c0-13.2-15-20.7-25.6-12.8zM320 360c0 4.4-3.6 8-8 8H72c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h240c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H72c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h240c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H72c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h240c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faRecycle = {\n prefix: 'fas',\n iconName: 'recycle',\n icon: [512, 512, [], \"f1b8\", \"M184.561 261.903c3.232 13.997-12.123 24.635-24.068 17.168l-40.736-25.455-50.867 81.402C55.606 356.273 70.96 384 96.012 384H148c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12H96.115c-75.334 0-121.302-83.048-81.408-146.88l50.822-81.388-40.725-25.448c-12.081-7.547-8.966-25.961 4.879-29.158l110.237-25.45c8.611-1.988 17.201 3.381 19.189 11.99l25.452 110.237zm98.561-182.915l41.289 66.076-40.74 25.457c-12.051 7.528-9 25.953 4.879 29.158l110.237 25.45c8.672 1.999 17.215-3.438 19.189-11.99l25.45-110.237c3.197-13.844-11.99-24.719-24.068-17.168l-40.687 25.424-41.263-66.082c-37.521-60.033-125.209-60.171-162.816 0l-17.963 28.766c-3.51 5.62-1.8 13.021 3.82 16.533l33.919 21.195c5.62 3.512 13.024 1.803 16.536-3.817l17.961-28.743c12.712-20.341 41.973-19.676 54.257-.022zM497.288 301.12l-27.515-44.065c-3.511-5.623-10.916-7.334-16.538-3.821l-33.861 21.159c-5.62 3.512-7.33 10.915-3.818 16.536l27.564 44.112c13.257 21.211-2.057 48.96-27.136 48.96H320V336.02c0-14.213-17.242-21.383-27.313-11.313l-80 79.981c-6.249 6.248-6.249 16.379 0 22.627l80 79.989C302.689 517.308 320 510.3 320 495.989V448h95.88c75.274 0 121.335-82.997 81.408-146.88z\"]\n};\nvar faRedo = {\n prefix: 'fas',\n iconName: 'redo',\n icon: [512, 512, [], \"f01e\", \"M500.33 0h-47.41a12 12 0 0 0-12 12.57l4 82.76A247.42 247.42 0 0 0 256 8C119.34 8 7.9 119.53 8 256.19 8.1 393.07 119.1 504 256 504a247.1 247.1 0 0 0 166.18-63.91 12 12 0 0 0 .48-17.43l-34-34a12 12 0 0 0-16.38-.55A176 176 0 1 1 402.1 157.8l-101.53-4.87a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12h200.33a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12z\"]\n};\nvar faRedoAlt = {\n prefix: 'fas',\n iconName: 'redo-alt',\n icon: [512, 512, [], \"f2f9\", \"M256.455 8c66.269.119 126.437 26.233 170.859 68.685l35.715-35.715C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.75c-30.864-28.899-70.801-44.907-113.23-45.273-92.398-.798-170.283 73.977-169.484 169.442C88.764 348.009 162.184 424 256 424c41.127 0 79.997-14.678 110.629-41.556 4.743-4.161 11.906-3.908 16.368.553l39.662 39.662c4.872 4.872 4.631 12.815-.482 17.433C378.202 479.813 319.926 504 256 504 119.034 504 8.001 392.967 8 256.002 7.999 119.193 119.646 7.755 256.455 8z\"]\n};\nvar faRegistered = {\n prefix: 'fas',\n iconName: 'registered',\n icon: [512, 512, [], \"f25d\", \"M285.363 207.475c0 18.6-9.831 28.431-28.431 28.431h-29.876v-56.14h23.378c28.668 0 34.929 8.773 34.929 27.709zM504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM363.411 360.414c-46.729-84.825-43.299-78.636-44.702-80.98 23.432-15.172 37.945-42.979 37.945-74.486 0-54.244-31.5-89.252-105.498-89.252h-70.667c-13.255 0-24 10.745-24 24V372c0 13.255 10.745 24 24 24h22.567c13.255 0 24-10.745 24-24v-71.663h25.556l44.129 82.937a24.001 24.001 0 0 0 21.188 12.727h24.464c18.261-.001 29.829-19.591 21.018-35.587z\"]\n};\nvar faRemoveFormat = {\n prefix: 'fas',\n iconName: 'remove-format',\n icon: [640, 512, [], \"f87d\", \"M336 416h-11.17l9.26-27.77L267 336.4 240.49 416H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm297.82 42.1L377 259.59 426.17 112H544v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16H176a16 16 0 0 0-16 16v43.9L45.46 3.38A16 16 0 0 0 23 6.19L3.37 31.46a16 16 0 0 0 2.81 22.45l588.36 454.72a16 16 0 0 0 22.46-2.81l19.64-25.27a16 16 0 0 0-2.82-22.45zM309.91 207.76L224 141.36V112h117.83z\"]\n};\nvar faReply = {\n prefix: 'fas',\n iconName: 'reply',\n icon: [512, 512, [], \"f3e5\", \"M8.309 189.836L184.313 37.851C199.719 24.546 224 35.347 224 56.015v80.053c160.629 1.839 288 34.032 288 186.258 0 61.441-39.581 122.309-83.333 154.132-13.653 9.931-33.111-2.533-28.077-18.631 45.344-145.012-21.507-183.51-176.59-185.742V360c0 20.7-24.3 31.453-39.687 18.164l-176.004-152c-11.071-9.562-11.086-26.753 0-36.328z\"]\n};\nvar faReplyAll = {\n prefix: 'fas',\n iconName: 'reply-all',\n icon: [576, 512, [], \"f122\", \"M136.309 189.836L312.313 37.851C327.72 24.546 352 35.348 352 56.015v82.763c129.182 10.231 224 52.212 224 183.548 0 61.441-39.582 122.309-83.333 154.132-13.653 9.931-33.111-2.533-28.077-18.631 38.512-123.162-3.922-169.482-112.59-182.015v84.175c0 20.701-24.3 31.453-39.687 18.164L136.309 226.164c-11.071-9.561-11.086-26.753 0-36.328zm-128 36.328L184.313 378.15C199.7 391.439 224 380.687 224 359.986v-15.818l-108.606-93.785A55.96 55.96 0 0 1 96 207.998a55.953 55.953 0 0 1 19.393-42.38L224 71.832V56.015c0-20.667-24.28-31.469-39.687-18.164L8.309 189.836c-11.086 9.575-11.071 26.767 0 36.328z\"]\n};\nvar faRepublican = {\n prefix: 'fas',\n iconName: 'republican',\n icon: [640, 512, [], \"f75e\", \"M544 192c0-88.4-71.6-160-160-160H160C71.6 32 0 103.6 0 192v64h544v-64zm-367.7-21.6l-19.8 19.3 4.7 27.3c.8 4.9-4.3 8.6-8.7 6.3L128 210.4l-24.5 12.9c-4.3 2.3-9.5-1.4-8.7-6.3l4.7-27.3-19.8-19.3c-3.6-3.5-1.6-9.5 3.3-10.2l27.4-4 12.2-24.8c2.2-4.5 8.6-4.4 10.7 0l12.2 24.8 27.4 4c5 .7 6.9 6.7 3.4 10.2zm144 0l-19.8 19.3 4.7 27.3c.8 4.9-4.3 8.6-8.7 6.3L272 210.4l-24.5 12.9c-4.3 2.3-9.5-1.4-8.7-6.3l4.7-27.3-19.8-19.3c-3.6-3.5-1.6-9.5 3.3-10.2l27.4-4 12.2-24.8c2.2-4.5 8.6-4.4 10.7 0l12.2 24.8 27.4 4c5 .7 6.9 6.7 3.4 10.2zm144 0l-19.8 19.3 4.7 27.3c.8 4.9-4.3 8.6-8.7 6.3L416 210.4l-24.5 12.9c-4.3 2.3-9.5-1.4-8.7-6.3l4.7-27.3-19.8-19.3c-3.6-3.5-1.6-9.5 3.3-10.2l27.4-4 12.2-24.8c2.2-4.5 8.6-4.4 10.7 0l12.2 24.8 27.4 4c5 .7 6.9 6.7 3.4 10.2zM624 320h-32c-8.8 0-16 7.2-16 16v64c0 8.8-7.2 16-16 16s-16-7.2-16-16V288H0v176c0 8.8 7.2 16 16 16h96c8.8 0 16-7.2 16-16v-80h192v80c0 8.8 7.2 16 16 16h96c8.8 0 16-7.2 16-16V352h32v43.3c0 41.8 30 80.1 71.6 84.3 47.8 4.9 88.4-32.7 88.4-79.6v-64c0-8.8-7.2-16-16-16z\"]\n};\nvar faRestroom = {\n prefix: 'fas',\n iconName: 'restroom',\n icon: [640, 512, [], \"f7bd\", \"M128 128c35.3 0 64-28.7 64-64S163.3 0 128 0 64 28.7 64 64s28.7 64 64 64zm384 0c35.3 0 64-28.7 64-64S547.3 0 512 0s-64 28.7-64 64 28.7 64 64 64zm127.3 226.5l-45.6-185.8c-3.3-13.5-15.5-23-29.8-24.2-15 9.7-32.8 15.5-52 15.5-19.2 0-37-5.8-52-15.5-14.3 1.2-26.5 10.7-29.8 24.2l-45.6 185.8C381 369.6 393 384 409.2 384H464v104c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V384h54.8c16.2 0 28.2-14.4 24.5-29.5zM336 0h-32c-8.8 0-16 7.2-16 16v480c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16zM180.1 144.4c-15 9.8-32.9 15.6-52.1 15.6-19.2 0-37.1-5.8-52.1-15.6C51.3 146.5 32 166.9 32 192v136c0 13.3 10.7 24 24 24h8v136c0 13.3 10.7 24 24 24h80c13.3 0 24-10.7 24-24V352h8c13.3 0 24-10.7 24-24V192c0-25.1-19.3-45.5-43.9-47.6z\"]\n};\nvar faRetweet = {\n prefix: 'fas',\n iconName: 'retweet',\n icon: [640, 512, [], \"f079\", \"M629.657 343.598L528.971 444.284c-9.373 9.372-24.568 9.372-33.941 0L394.343 343.598c-9.373-9.373-9.373-24.569 0-33.941l10.823-10.823c9.562-9.562 25.133-9.34 34.419.492L480 342.118V160H292.451a24.005 24.005 0 0 1-16.971-7.029l-16-16C244.361 121.851 255.069 96 276.451 96H520c13.255 0 24 10.745 24 24v222.118l40.416-42.792c9.285-9.831 24.856-10.054 34.419-.492l10.823 10.823c9.372 9.372 9.372 24.569-.001 33.941zm-265.138 15.431A23.999 23.999 0 0 0 347.548 352H160V169.881l40.416 42.792c9.286 9.831 24.856 10.054 34.419.491l10.822-10.822c9.373-9.373 9.373-24.569 0-33.941L144.971 67.716c-9.373-9.373-24.569-9.373-33.941 0L10.343 168.402c-9.373 9.373-9.373 24.569 0 33.941l10.822 10.822c9.562 9.562 25.133 9.34 34.419-.491L96 169.881V392c0 13.255 10.745 24 24 24h243.549c21.382 0 32.09-25.851 16.971-40.971l-16.001-16z\"]\n};\nvar faRibbon = {\n prefix: 'fas',\n iconName: 'ribbon',\n icon: [448, 512, [], \"f4d6\", \"M6.1 444.3c-9.6 10.8-7.5 27.6 4.5 35.7l68.8 27.9c9.9 6.7 23.3 5 31.3-3.8l91.8-101.9-79.2-87.9-117.2 130zm435.8 0s-292-324.6-295.4-330.1c15.4-8.4 40.2-17.9 77.5-17.9s62.1 9.5 77.5 17.9c-3.3 5.6-56 64.6-56 64.6l79.1 87.7 34.2-38c28.7-31.9 33.3-78.6 11.4-115.5l-43.7-73.5c-4.3-7.2-9.9-13.3-16.8-18-40.7-27.6-127.4-29.7-171.4 0-6.9 4.7-12.5 10.8-16.8 18l-43.6 73.2c-1.5 2.5-37.1 62.2 11.5 116L337.5 504c8 8.9 21.4 10.5 31.3 3.8l68.8-27.9c11.9-8 14-24.8 4.3-35.6z\"]\n};\nvar faRing = {\n prefix: 'fas',\n iconName: 'ring',\n icon: [512, 512, [], \"f70b\", \"M256 64C110.06 64 0 125.91 0 208v98.13C0 384.48 114.62 448 256 448s256-63.52 256-141.87V208c0-82.09-110.06-144-256-144zm0 64c106.04 0 192 35.82 192 80 0 9.26-3.97 18.12-10.91 26.39C392.15 208.21 328.23 192 256 192s-136.15 16.21-181.09 42.39C67.97 226.12 64 217.26 64 208c0-44.18 85.96-80 192-80zM120.43 264.64C155.04 249.93 201.64 240 256 240s100.96 9.93 135.57 24.64C356.84 279.07 308.93 288 256 288s-100.84-8.93-135.57-23.36z\"]\n};\nvar faRoad = {\n prefix: 'fas',\n iconName: 'road',\n icon: [576, 512, [], \"f018\", \"M573.19 402.67l-139.79-320C428.43 71.29 417.6 64 405.68 64h-97.59l2.45 23.16c.5 4.72-3.21 8.84-7.96 8.84h-29.16c-4.75 0-8.46-4.12-7.96-8.84L267.91 64h-97.59c-11.93 0-22.76 7.29-27.73 18.67L2.8 402.67C-6.45 423.86 8.31 448 30.54 448h196.84l10.31-97.68c.86-8.14 7.72-14.32 15.91-14.32h68.8c8.19 0 15.05 6.18 15.91 14.32L348.62 448h196.84c22.23 0 36.99-24.14 27.73-45.33zM260.4 135.16a8 8 0 0 1 7.96-7.16h39.29c4.09 0 7.53 3.09 7.96 7.16l4.6 43.58c.75 7.09-4.81 13.26-11.93 13.26h-40.54c-7.13 0-12.68-6.17-11.93-13.26l4.59-43.58zM315.64 304h-55.29c-9.5 0-16.91-8.23-15.91-17.68l5.07-48c.86-8.14 7.72-14.32 15.91-14.32h45.15c8.19 0 15.05 6.18 15.91 14.32l5.07 48c1 9.45-6.41 17.68-15.91 17.68z\"]\n};\nvar faRobot = {\n prefix: 'fas',\n iconName: 'robot',\n icon: [640, 512, [], \"f544\", \"M0 256v128c0 17.7 14.3 32 32 32h32V224H32c-17.7 0-32 14.3-32 32zM464 96H352V32c0-17.7-14.3-32-32-32s-32 14.3-32 32v64H176c-44.2 0-80 35.8-80 80v272c0 35.3 28.7 64 64 64h320c35.3 0 64-28.7 64-64V176c0-44.2-35.8-80-80-80zM256 416h-64v-32h64v32zm-32-120c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm128 120h-64v-32h64v32zm96 0h-64v-32h64v32zm-32-120c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm192-72h-32v192h32c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32z\"]\n};\nvar faRocket = {\n prefix: 'fas',\n iconName: 'rocket',\n icon: [512, 512, [], \"f135\", \"M505.05 19.1a15.89 15.89 0 0 0-12.2-12.2C460.65 0 435.46 0 410.36 0c-103.2 0-165.1 55.2-211.29 128H94.87A48 48 0 0 0 52 154.49l-49.42 98.8A24 24 0 0 0 24.07 288h103.77l-22.47 22.47a32 32 0 0 0 0 45.25l50.9 50.91a32 32 0 0 0 45.26 0L224 384.16V488a24 24 0 0 0 34.7 21.49l98.7-49.39a47.91 47.91 0 0 0 26.5-42.9V312.79c72.59-46.3 128-108.4 128-211.09.1-25.2.1-50.4-6.85-82.6zM384 168a40 40 0 1 1 40-40 40 40 0 0 1-40 40z\"]\n};\nvar faRoute = {\n prefix: 'fas',\n iconName: 'route',\n icon: [512, 512, [], \"f4d7\", \"M416 320h-96c-17.6 0-32-14.4-32-32s14.4-32 32-32h96s96-107 96-160-43-96-96-96-96 43-96 96c0 25.5 22.2 63.4 45.3 96H320c-52.9 0-96 43.1-96 96s43.1 96 96 96h96c17.6 0 32 14.4 32 32s-14.4 32-32 32H185.5c-16 24.8-33.8 47.7-47.3 64H416c52.9 0 96-43.1 96-96s-43.1-96-96-96zm0-256c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zM96 256c-53 0-96 43-96 96s96 160 96 160 96-107 96-160-43-96-96-96zm0 128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faRss = {\n prefix: 'fas',\n iconName: 'rss',\n icon: [448, 512, [], \"f09e\", \"M128.081 415.959c0 35.369-28.672 64.041-64.041 64.041S0 451.328 0 415.959s28.672-64.041 64.041-64.041 64.04 28.673 64.04 64.041zm175.66 47.25c-8.354-154.6-132.185-278.587-286.95-286.95C7.656 175.765 0 183.105 0 192.253v48.069c0 8.415 6.49 15.472 14.887 16.018 111.832 7.284 201.473 96.702 208.772 208.772.547 8.397 7.604 14.887 16.018 14.887h48.069c9.149.001 16.489-7.655 15.995-16.79zm144.249.288C439.596 229.677 251.465 40.445 16.503 32.01 7.473 31.686 0 38.981 0 48.016v48.068c0 8.625 6.835 15.645 15.453 15.999 191.179 7.839 344.627 161.316 352.465 352.465.353 8.618 7.373 15.453 15.999 15.453h48.068c9.034-.001 16.329-7.474 16.005-16.504z\"]\n};\nvar faRssSquare = {\n prefix: 'fas',\n iconName: 'rss-square',\n icon: [448, 512, [], \"f143\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM112 416c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm157.533 0h-34.335c-6.011 0-11.051-4.636-11.442-10.634-5.214-80.05-69.243-143.92-149.123-149.123-5.997-.39-10.633-5.431-10.633-11.441v-34.335c0-6.535 5.468-11.777 11.994-11.425 110.546 5.974 198.997 94.536 204.964 204.964.352 6.526-4.89 11.994-11.425 11.994zm103.027 0h-34.334c-6.161 0-11.175-4.882-11.427-11.038-5.598-136.535-115.204-246.161-251.76-251.76C68.882 152.949 64 147.935 64 141.774V107.44c0-6.454 5.338-11.664 11.787-11.432 167.83 6.025 302.21 141.191 308.205 308.205.232 6.449-4.978 11.787-11.432 11.787z\"]\n};\nvar faRubleSign = {\n prefix: 'fas',\n iconName: 'ruble-sign',\n icon: [384, 512, [], \"f158\", \"M239.36 320C324.48 320 384 260.542 384 175.071S324.48 32 239.36 32H76c-6.627 0-12 5.373-12 12v206.632H12c-6.627 0-12 5.373-12 12V308c0 6.627 5.373 12 12 12h52v32H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h52v52c0 6.627 5.373 12 12 12h58.56c6.627 0 12-5.373 12-12v-52H308c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12H146.56v-32h92.8zm-92.8-219.252h78.72c46.72 0 74.88 29.11 74.88 74.323 0 45.832-28.16 75.561-76.16 75.561h-77.44V100.748z\"]\n};\nvar faRuler = {\n prefix: 'fas',\n iconName: 'ruler',\n icon: [640, 512, [], \"f545\", \"M635.7 167.2L556.1 31.7c-8.8-15-28.3-20.1-43.5-11.5l-69 39.1L503.3 161c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L416 75l-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L333.2 122 278 153.3 337.8 255c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-59.7-101.7-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-27.9-47.5-55.2 31.3 59.7 101.7c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L84.9 262.9l-69 39.1C.7 310.7-4.6 329.8 4.2 344.8l79.6 135.6c8.8 15 28.3 20.1 43.5 11.5L624.1 210c15.2-8.6 20.4-27.8 11.6-42.8z\"]\n};\nvar faRulerCombined = {\n prefix: 'fas',\n iconName: 'ruler-combined',\n icon: [512, 512, [], \"f546\", \"M160 288h-56c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h56v-64h-56c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h56V96h-56c-4.42 0-8-3.58-8-8V72c0-4.42 3.58-8 8-8h56V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 2.77.91 5.24 1.57 7.8L160 329.38V288zm320 64h-32v56c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-56h-64v56c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-56h-64v56c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-56h-41.37L24.2 510.43c2.56.66 5.04 1.57 7.8 1.57h448c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32z\"]\n};\nvar faRulerHorizontal = {\n prefix: 'fas',\n iconName: 'ruler-horizontal',\n icon: [576, 512, [], \"f547\", \"M544 128h-48v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8H88c-4.42 0-8-3.58-8-8v-88H32c-17.67 0-32 14.33-32 32v192c0 17.67 14.33 32 32 32h512c17.67 0 32-14.33 32-32V160c0-17.67-14.33-32-32-32z\"]\n};\nvar faRulerVertical = {\n prefix: 'fas',\n iconName: 'ruler-vertical',\n icon: [256, 512, [], \"f548\", \"M168 416c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 17.67 14.33 32 32 32h192c17.67 0 32-14.33 32-32v-64h-88z\"]\n};\nvar faRunning = {\n prefix: 'fas',\n iconName: 'running',\n icon: [416, 512, [], \"f70c\", \"M272 96c26.51 0 48-21.49 48-48S298.51 0 272 0s-48 21.49-48 48 21.49 48 48 48zM113.69 317.47l-14.8 34.52H32c-17.67 0-32 14.33-32 32s14.33 32 32 32h77.45c19.25 0 36.58-11.44 44.11-29.09l8.79-20.52-10.67-6.3c-17.32-10.23-30.06-25.37-37.99-42.61zM384 223.99h-44.03l-26.06-53.25c-12.5-25.55-35.45-44.23-61.78-50.94l-71.08-21.14c-28.3-6.8-57.77-.55-80.84 17.14l-39.67 30.41c-14.03 10.75-16.69 30.83-5.92 44.86s30.84 16.66 44.86 5.92l39.69-30.41c7.67-5.89 17.44-8 25.27-6.14l14.7 4.37-37.46 87.39c-12.62 29.48-1.31 64.01 26.3 80.31l84.98 50.17-27.47 87.73c-5.28 16.86 4.11 34.81 20.97 40.09 3.19 1 6.41 1.48 9.58 1.48 13.61 0 26.23-8.77 30.52-22.45l31.64-101.06c5.91-20.77-2.89-43.08-21.64-54.39l-61.24-36.14 31.31-78.28 20.27 41.43c8 16.34 24.92 26.89 43.11 26.89H384c17.67 0 32-14.33 32-32s-14.33-31.99-32-31.99z\"]\n};\nvar faRupeeSign = {\n prefix: 'fas',\n iconName: 'rupee-sign',\n icon: [320, 512, [], \"f156\", \"M308 96c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v44.748c0 6.627 5.373 12 12 12h85.28c27.308 0 48.261 9.958 60.97 27.252H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h158.757c-6.217 36.086-32.961 58.632-74.757 58.632H12c-6.627 0-12 5.373-12 12v53.012c0 3.349 1.4 6.546 3.861 8.818l165.052 152.356a12.001 12.001 0 0 0 8.139 3.182h82.562c10.924 0 16.166-13.408 8.139-20.818L116.871 319.906c76.499-2.34 131.144-53.395 138.318-127.906H308c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-58.69c-3.486-11.541-8.28-22.246-14.252-32H308z\"]\n};\nvar faSadCry = {\n prefix: 'fas',\n iconName: 'sad-cry',\n icon: [496, 512, [], \"f5b3\", \"M248 8C111 8 0 119 0 256c0 90.1 48.2 168.7 120 212.1V288c0-8.8 7.2-16 16-16s16 7.2 16 16v196.7c29.5 12.4 62 19.3 96 19.3s66.5-6.9 96-19.3V288c0-8.8 7.2-16 16-16s16 7.2 16 16v180.1C447.8 424.7 496 346 496 256 496 119 385 8 248 8zm-65.5 216.5c-14.8-13.2-46.2-13.2-61 0L112 233c-3.8 3.3-9.3 4-13.7 1.6-4.4-2.4-6.9-7.4-6.1-12.4 4-25.2 34.2-42.1 59.9-42.1S208 197 212 222.2c.8 5-1.7 10-6.1 12.4-5.8 3.1-11.2.7-13.7-1.6l-9.7-8.5zM248 416c-26.5 0-48-28.7-48-64s21.5-64 48-64 48 28.7 48 64-21.5 64-48 64zm149.8-181.5c-5.8 3.1-11.2.7-13.7-1.6l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L304 233c-3.8 3.3-9.3 4-13.7 1.6-4.4-2.4-6.9-7.4-6.1-12.4 4-25.2 34.2-42.1 59.9-42.1S400 197 404 222.2c.6 4.9-1.8 9.9-6.2 12.3z\"]\n};\nvar faSadTear = {\n prefix: 'fas',\n iconName: 'sad-tear',\n icon: [496, 512, [], \"f5b4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zM152 416c-26.5 0-48-21-48-47 0-20 28.5-60.4 41.6-77.8 3.2-4.3 9.6-4.3 12.8 0C171.5 308.6 200 349 200 369c0 26-21.5 47-48 47zm16-176c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm170.2 154.2C315.8 367.4 282.9 352 248 352c-21.2 0-21.2-32 0-32 44.4 0 86.3 19.6 114.7 53.8 13.8 16.4-11.2 36.5-24.5 20.4z\"]\n};\nvar faSatellite = {\n prefix: 'fas',\n iconName: 'satellite',\n icon: [512, 512, [], \"f7bf\", \"M502.7 265l-80.3-80.4 47.8-47.9c13.1-13.1 13.1-34.4 0-47.5l-47.5-47.5c-13.1-13.1-34.4-13.1-47.5 0l-47.8 47.9-80.3-80.3C240.8 3.1 232.7 0 224.5 0S208.2 3.1 202 9.3L105.3 106c-12.4 12.4-12.4 32.6 0 45.1l80.3 80.4-9.8 9.8C122.1 217 59.6 218.6 7.3 246.7c-8.5 4.6-9.6 16.4-2.8 23.2L112 377.4l-17.8 17.8c-2.6-.7-5-1.6-7.8-1.6-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32c0-2.8-.9-5.2-1.6-7.8l17.8-17.8 107.5 107.5c6.8 6.8 18.7 5.7 23.2-2.8 28.1-52.3 29.7-114.8 5.4-168.5l9.9-9.9 80.3 80.4c6.2 6.2 14.4 9.3 22.5 9.3s16.3-3.1 22.5-9.3l96.7-96.7c12.5-12.4 12.5-32.6.1-45zm-352-136.5l73.8-73.8 68.9 68.9-73.8 73.8-68.9-68.9zm232.8 232.8l-68.9-68.9 73.8-73.8 68.9 68.9-73.8 73.8z\"]\n};\nvar faSatelliteDish = {\n prefix: 'fas',\n iconName: 'satellite-dish',\n icon: [512, 512, [], \"f7c0\", \"M188.8 345.9l27.4-27.4c2.6.7 5 1.6 7.8 1.6 17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32c0 2.8.9 5.2 1.6 7.8l-27.4 27.4L49.4 206.5c-7.3-7.3-20.1-6.1-25 3-41.8 77.8-29.9 176.7 35.7 242.3 65.6 65.6 164.6 77.5 242.3 35.7 9.2-4.9 10.4-17.7 3-25L188.8 345.9zM209 0c-9.2-.5-17 6.8-17 16v31.6c0 8.5 6.6 15.5 15 15.9 129.4 7 233.4 112 240.9 241.5.5 8.4 7.5 15 15.9 15h32.1c9.2 0 16.5-7.8 16-17C503.4 139.8 372.2 8.6 209 0zm.3 96c-9.3-.7-17.3 6.7-17.3 16.1v32.1c0 8.4 6.5 15.3 14.8 15.9 76.8 6.3 138 68.2 144.9 145.2.8 8.3 7.6 14.7 15.9 14.7h32.2c9.3 0 16.8-8 16.1-17.3-8.4-110.1-96.5-198.2-206.6-206.7z\"]\n};\nvar faSave = {\n prefix: 'fas',\n iconName: 'save',\n icon: [448, 512, [], \"f0c7\", \"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM224 416c-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64zm96-304.52V212c0 6.627-5.373 12-12 12H76c-6.627 0-12-5.373-12-12V108c0-6.627 5.373-12 12-12h228.52c3.183 0 6.235 1.264 8.485 3.515l3.48 3.48A11.996 11.996 0 0 1 320 111.48z\"]\n};\nvar faSchool = {\n prefix: 'fas',\n iconName: 'school',\n icon: [640, 512, [], \"f549\", \"M0 224v272c0 8.84 7.16 16 16 16h80V192H32c-17.67 0-32 14.33-32 32zm360-48h-24v-40c0-4.42-3.58-8-8-8h-16c-4.42 0-8 3.58-8 8v64c0 4.42 3.58 8 8 8h48c4.42 0 8-3.58 8-8v-16c0-4.42-3.58-8-8-8zm137.75-63.96l-160-106.67a32.02 32.02 0 0 0-35.5 0l-160 106.67A32.002 32.002 0 0 0 128 138.66V512h128V368c0-8.84 7.16-16 16-16h96c8.84 0 16 7.16 16 16v144h128V138.67c0-10.7-5.35-20.7-14.25-26.63zM320 256c-44.18 0-80-35.82-80-80s35.82-80 80-80 80 35.82 80 80-35.82 80-80 80zm288-64h-64v320h80c8.84 0 16-7.16 16-16V224c0-17.67-14.33-32-32-32z\"]\n};\nvar faScrewdriver = {\n prefix: 'fas',\n iconName: 'screwdriver',\n icon: [512, 512, [], \"f54a\", \"M448 0L320 96v62.06l-83.03 83.03c6.79 4.25 13.27 9.06 19.07 14.87 5.8 5.8 10.62 12.28 14.87 19.07L353.94 192H416l96-128-64-64zM128 278.59L10.92 395.67c-14.55 14.55-14.55 38.15 0 52.71l52.7 52.7c14.56 14.56 38.15 14.56 52.71 0L233.41 384c29.11-29.11 29.11-76.3 0-105.41s-76.3-29.11-105.41 0z\"]\n};\nvar faScroll = {\n prefix: 'fas',\n iconName: 'scroll',\n icon: [640, 512, [], \"f70e\", \"M48 0C21.53 0 0 21.53 0 48v64c0 8.84 7.16 16 16 16h80V48C96 21.53 74.47 0 48 0zm208 412.57V352h288V96c0-52.94-43.06-96-96-96H111.59C121.74 13.41 128 29.92 128 48v368c0 38.87 34.65 69.65 74.75 63.12C234.22 474 256 444.46 256 412.57zM288 384v32c0 52.93-43.06 96-96 96h336c61.86 0 112-50.14 112-112 0-8.84-7.16-16-16-16H288z\"]\n};\nvar faSdCard = {\n prefix: 'fas',\n iconName: 'sd-card',\n icon: [384, 512, [], \"f7c2\", \"M320 0H128L0 128v320c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zM160 160h-48V64h48v96zm80 0h-48V64h48v96zm80 0h-48V64h48v96z\"]\n};\nvar faSearch = {\n prefix: 'fas',\n iconName: 'search',\n icon: [512, 512, [], \"f002\", \"M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z\"]\n};\nvar faSearchDollar = {\n prefix: 'fas',\n iconName: 'search-dollar',\n icon: [512, 512, [], \"f688\", \"M505.04 442.66l-99.71-99.69c-4.5-4.5-10.6-7-17-7h-16.3c27.6-35.3 44-79.69 44-127.99C416.03 93.09 322.92 0 208.02 0S0 93.09 0 207.98s93.11 207.98 208.02 207.98c48.3 0 92.71-16.4 128.01-44v16.3c0 6.4 2.5 12.5 7 17l99.71 99.69c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.59.1-33.99zm-297.02-90.7c-79.54 0-144-64.34-144-143.98 0-79.53 64.35-143.98 144-143.98 79.54 0 144 64.34 144 143.98 0 79.53-64.35 143.98-144 143.98zm27.11-152.54l-45.01-13.5c-5.16-1.55-8.77-6.78-8.77-12.73 0-7.27 5.3-13.19 11.8-13.19h28.11c4.56 0 8.96 1.29 12.82 3.72 3.24 2.03 7.36 1.91 10.13-.73l11.75-11.21c3.53-3.37 3.33-9.21-.57-12.14-9.1-6.83-20.08-10.77-31.37-11.35V112c0-4.42-3.58-8-8-8h-16c-4.42 0-8 3.58-8 8v16.12c-23.63.63-42.68 20.55-42.68 45.07 0 19.97 12.99 37.81 31.58 43.39l45.01 13.5c5.16 1.55 8.77 6.78 8.77 12.73 0 7.27-5.3 13.19-11.8 13.19h-28.1c-4.56 0-8.96-1.29-12.82-3.72-3.24-2.03-7.36-1.91-10.13.73l-11.75 11.21c-3.53 3.37-3.33 9.21.57 12.14 9.1 6.83 20.08 10.77 31.37 11.35V304c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8v-16.12c23.63-.63 42.68-20.54 42.68-45.07 0-19.97-12.99-37.81-31.59-43.39z\"]\n};\nvar faSearchLocation = {\n prefix: 'fas',\n iconName: 'search-location',\n icon: [512, 512, [], \"f689\", \"M505.04 442.66l-99.71-99.69c-4.5-4.5-10.6-7-17-7h-16.3c27.6-35.3 44-79.69 44-127.99C416.03 93.09 322.92 0 208.02 0S0 93.09 0 207.98s93.11 207.98 208.02 207.98c48.3 0 92.71-16.4 128.01-44v16.3c0 6.4 2.5 12.5 7 17l99.71 99.69c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.59.1-33.99zm-297.02-90.7c-79.54 0-144-64.34-144-143.98 0-79.53 64.35-143.98 144-143.98 79.54 0 144 64.34 144 143.98 0 79.53-64.35 143.98-144 143.98zm.02-239.96c-40.78 0-73.84 33.05-73.84 73.83 0 32.96 48.26 93.05 66.75 114.86a9.24 9.24 0 0 0 14.18 0c18.49-21.81 66.75-81.89 66.75-114.86 0-40.78-33.06-73.83-73.84-73.83zm0 96c-13.26 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faSearchMinus = {\n prefix: 'fas',\n iconName: 'search-minus',\n icon: [512, 512, [], \"f010\", \"M304 192v32c0 6.6-5.4 12-12 12H124c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm201 284.7L476.7 505c-9.4 9.4-24.6 9.4-33.9 0L343 405.3c-4.5-4.5-7-10.6-7-17V372c-35.3 27.6-79.7 44-128 44C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208c0 48.3-16.4 92.7-44 128h16.3c6.4 0 12.5 2.5 17 7l99.7 99.7c9.3 9.4 9.3 24.6 0 34zM344 208c0-75.2-60.8-136-136-136S72 132.8 72 208s60.8 136 136 136 136-60.8 136-136z\"]\n};\nvar faSearchPlus = {\n prefix: 'fas',\n iconName: 'search-plus',\n icon: [512, 512, [], \"f00e\", \"M304 192v32c0 6.6-5.4 12-12 12h-56v56c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-56h-56c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h56v-56c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v56h56c6.6 0 12 5.4 12 12zm201 284.7L476.7 505c-9.4 9.4-24.6 9.4-33.9 0L343 405.3c-4.5-4.5-7-10.6-7-17V372c-35.3 27.6-79.7 44-128 44C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208c0 48.3-16.4 92.7-44 128h16.3c6.4 0 12.5 2.5 17 7l99.7 99.7c9.3 9.4 9.3 24.6 0 34zM344 208c0-75.2-60.8-136-136-136S72 132.8 72 208s60.8 136 136 136 136-60.8 136-136z\"]\n};\nvar faSeedling = {\n prefix: 'fas',\n iconName: 'seedling',\n icon: [512, 512, [], \"f4d8\", \"M64 96H0c0 123.7 100.3 224 224 224v144c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320C288 196.3 187.7 96 64 96zm384-64c-84.2 0-157.4 46.5-195.7 115.2 27.7 30.2 48.2 66.9 59 107.6C424 243.1 512 147.9 512 32h-64z\"]\n};\nvar faServer = {\n prefix: 'fas',\n iconName: 'server',\n icon: [512, 512, [], \"f233\", \"M480 160H32c-17.673 0-32-14.327-32-32V64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24z\"]\n};\nvar faShapes = {\n prefix: 'fas',\n iconName: 'shapes',\n icon: [512, 512, [], \"f61f\", \"M512 320v160c0 17.67-14.33 32-32 32H320c-17.67 0-32-14.33-32-32V320c0-17.67 14.33-32 32-32h160c17.67 0 32 14.33 32 32zm-384-64C57.31 256 0 313.31 0 384s57.31 128 128 128 128-57.31 128-128-57.31-128-128-128zm351.03-32c25.34 0 41.18-26.67 28.51-48L412.51 16c-12.67-21.33-44.35-21.33-57.02 0l-95.03 160c-12.67 21.33 3.17 48 28.51 48h190.06z\"]\n};\nvar faShare = {\n prefix: 'fas',\n iconName: 'share',\n icon: [512, 512, [], \"f064\", \"M503.691 189.836L327.687 37.851C312.281 24.546 288 35.347 288 56.015v80.053C127.371 137.907 0 170.1 0 322.326c0 61.441 39.581 122.309 83.333 154.132 13.653 9.931 33.111-2.533 28.077-18.631C66.066 312.814 132.917 274.316 288 272.085V360c0 20.7 24.3 31.453 39.687 18.164l176.004-152c11.071-9.562 11.086-26.753 0-36.328z\"]\n};\nvar faShareAlt = {\n prefix: 'fas',\n iconName: 'share-alt',\n icon: [448, 512, [], \"f1e0\", \"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.551 96.551 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.301 96.301 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96-42.981-96-96-96z\"]\n};\nvar faShareAltSquare = {\n prefix: 'fas',\n iconName: 'share-alt-square',\n icon: [448, 512, [], \"f1e1\", \"M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zM304 296c-14.562 0-27.823 5.561-37.783 14.671l-67.958-40.775a56.339 56.339 0 0 0 0-27.793l67.958-40.775C276.177 210.439 289.438 216 304 216c30.928 0 56-25.072 56-56s-25.072-56-56-56-56 25.072-56 56c0 4.797.605 9.453 1.74 13.897l-67.958 40.775C171.823 205.561 158.562 200 144 200c-30.928 0-56 25.072-56 56s25.072 56 56 56c14.562 0 27.823-5.561 37.783-14.671l67.958 40.775a56.088 56.088 0 0 0-1.74 13.897c0 30.928 25.072 56 56 56s56-25.072 56-56C360 321.072 334.928 296 304 296z\"]\n};\nvar faShareSquare = {\n prefix: 'fas',\n iconName: 'share-square',\n icon: [576, 512, [], \"f14d\", \"M568.482 177.448L424.479 313.433C409.3 327.768 384 317.14 384 295.985v-71.963c-144.575.97-205.566 35.113-164.775 171.353 4.483 14.973-12.846 26.567-25.006 17.33C155.252 383.105 120 326.488 120 269.339c0-143.937 117.599-172.5 264-173.312V24.012c0-21.174 25.317-31.768 40.479-17.448l144.003 135.988c10.02 9.463 10.028 25.425 0 34.896zM384 379.128V448H64V128h50.916a11.99 11.99 0 0 0 8.648-3.693c14.953-15.568 32.237-27.89 51.014-37.676C185.708 80.83 181.584 64 169.033 64H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48v-88.806c0-8.288-8.197-14.066-16.011-11.302a71.83 71.83 0 0 1-34.189 3.377c-7.27-1.046-13.8 4.514-13.8 11.859z\"]\n};\nvar faShekelSign = {\n prefix: 'fas',\n iconName: 'shekel-sign',\n icon: [448, 512, [], \"f20b\", \"M248 168v168c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V168c0-75.11-60.89-136-136-136H24C10.75 32 0 42.74 0 56v408c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V112h112c30.93 0 56 25.07 56 56zM432 32h-48c-8.84 0-16 7.16-16 16v296c0 30.93-25.07 56-56 56H200V176c0-8.84-7.16-16-16-16h-48c-8.84 0-16 7.16-16 16v280c0 13.25 10.75 24 24 24h168c75.11 0 136-60.89 136-136V48c0-8.84-7.16-16-16-16z\"]\n};\nvar faShieldAlt = {\n prefix: 'fas',\n iconName: 'shield-alt',\n icon: [512, 512, [], \"f3ed\", \"M466.5 83.7l-192-80a48.15 48.15 0 0 0-36.9 0l-192 80C27.7 91.1 16 108.6 16 128c0 198.5 114.5 335.7 221.5 380.3 11.8 4.9 25.1 4.9 36.9 0C360.1 472.6 496 349.3 496 128c0-19.4-11.7-36.9-29.5-44.3zM256.1 446.3l-.1-381 175.9 73.3c-3.3 151.4-82.1 261.1-175.8 307.7z\"]\n};\nvar faShip = {\n prefix: 'fas',\n iconName: 'ship',\n icon: [640, 512, [], \"f21a\", \"M496.616 372.639l70.012-70.012c16.899-16.9 9.942-45.771-12.836-53.092L512 236.102V96c0-17.673-14.327-32-32-32h-64V24c0-13.255-10.745-24-24-24H248c-13.255 0-24 10.745-24 24v40h-64c-17.673 0-32 14.327-32 32v140.102l-41.792 13.433c-22.753 7.313-29.754 36.173-12.836 53.092l70.012 70.012C125.828 416.287 85.587 448 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24 61.023 0 107.499-20.61 143.258-59.396C181.677 487.432 216.021 512 256 512h128c39.979 0 74.323-24.568 88.742-59.396C508.495 491.384 554.968 512 616 512c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24-60.817 0-101.542-31.001-119.384-75.361zM192 128h256v87.531l-118.208-37.995a31.995 31.995 0 0 0-19.584 0L192 215.531V128z\"]\n};\nvar faShippingFast = {\n prefix: 'fas',\n iconName: 'shipping-fast',\n icon: [640, 512, [], \"f48b\", \"M624 352h-16V243.9c0-12.7-5.1-24.9-14.1-33.9L494 110.1c-9-9-21.2-14.1-33.9-14.1H416V48c0-26.5-21.5-48-48-48H112C85.5 0 64 21.5 64 48v48H8c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h272c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H40c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h208c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H8c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h208c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H64v128c0 53 43 96 96 96s96-43 96-96h128c0 53 43 96 96 96s96-43 96-96h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM160 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm320 0c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-208H416V144h44.1l99.9 99.9V256z\"]\n};\nvar faShoePrints = {\n prefix: 'fas',\n iconName: 'shoe-prints',\n icon: [640, 512, [], \"f54b\", \"M192 160h32V32h-32c-35.35 0-64 28.65-64 64s28.65 64 64 64zM0 416c0 35.35 28.65 64 64 64h32V352H64c-35.35 0-64 28.65-64 64zm337.46-128c-34.91 0-76.16 13.12-104.73 32-24.79 16.38-44.52 32-104.73 32v128l57.53 15.97c26.21 7.28 53.01 13.12 80.31 15.05 32.69 2.31 65.6.67 97.58-6.2C472.9 481.3 512 429.22 512 384c0-64-84.18-96-174.54-96zM491.42 7.19C459.44.32 426.53-1.33 393.84.99c-27.3 1.93-54.1 7.77-80.31 15.04L256 32v128c60.2 0 79.94 15.62 104.73 32 28.57 18.88 69.82 32 104.73 32C555.82 224 640 192 640 128c0-45.22-39.1-97.3-148.58-120.81z\"]\n};\nvar faShoppingBag = {\n prefix: 'fas',\n iconName: 'shopping-bag',\n icon: [448, 512, [], \"f290\", \"M352 160v-32C352 57.42 294.579 0 224 0 153.42 0 96 57.42 96 128v32H0v272c0 44.183 35.817 80 80 80h288c44.183 0 80-35.817 80-80V160h-96zm-192-32c0-35.29 28.71-64 64-64s64 28.71 64 64v32H160v-32zm160 120c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zm-192 0c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24z\"]\n};\nvar faShoppingBasket = {\n prefix: 'fas',\n iconName: 'shopping-basket',\n icon: [576, 512, [], \"f291\", \"M576 216v16c0 13.255-10.745 24-24 24h-8l-26.113 182.788C514.509 462.435 494.257 480 470.37 480H105.63c-23.887 0-44.139-17.565-47.518-41.212L32 256h-8c-13.255 0-24-10.745-24-24v-16c0-13.255 10.745-24 24-24h67.341l106.78-146.821c10.395-14.292 30.407-17.453 44.701-7.058 14.293 10.395 17.453 30.408 7.058 44.701L170.477 192h235.046L326.12 82.821c-10.395-14.292-7.234-34.306 7.059-44.701 14.291-10.395 34.306-7.235 44.701 7.058L484.659 192H552c13.255 0 24 10.745 24 24zM312 392V280c0-13.255-10.745-24-24-24s-24 10.745-24 24v112c0 13.255 10.745 24 24 24s24-10.745 24-24zm112 0V280c0-13.255-10.745-24-24-24s-24 10.745-24 24v112c0 13.255 10.745 24 24 24s24-10.745 24-24zm-224 0V280c0-13.255-10.745-24-24-24s-24 10.745-24 24v112c0 13.255 10.745 24 24 24s24-10.745 24-24z\"]\n};\nvar faShoppingCart = {\n prefix: 'fas',\n iconName: 'shopping-cart',\n icon: [576, 512, [], \"f07a\", \"M528.12 301.319l47.273-208C578.806 78.301 567.391 64 551.99 64H159.208l-9.166-44.81C147.758 8.021 137.93 0 126.529 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24h69.883l70.248 343.435C147.325 417.1 136 435.222 136 456c0 30.928 25.072 56 56 56s56-25.072 56-56c0-15.674-6.447-29.835-16.824-40h209.647C430.447 426.165 424 440.326 424 456c0 30.928 25.072 56 56 56s56-25.072 56-56c0-22.172-12.888-41.332-31.579-50.405l5.517-24.276c3.413-15.018-8.002-29.319-23.403-29.319H218.117l-6.545-32h293.145c11.206 0 20.92-7.754 23.403-18.681z\"]\n};\nvar faShower = {\n prefix: 'fas',\n iconName: 'shower',\n icon: [512, 512, [], \"f2cc\", \"M389.66 135.6L231.6 293.66c-9.37 9.37-24.57 9.37-33.94 0l-11.32-11.32c-9.37-9.37-9.37-24.57 0-33.94l.11-.11c-34.03-40.21-35.16-98.94-3.39-140.38-11.97-7.55-26.14-11.91-41.3-11.91C98.88 96 64 130.88 64 173.76V480H0V173.76C0 95.59 63.59 32 141.76 32c36.93 0 70.61 14.2 95.86 37.42 35.9-11.51 76.5-4.5 106.67 21.03l.11-.11c9.37-9.37 24.57-9.37 33.94 0l11.32 11.32c9.37 9.37 9.37 24.57 0 33.94zM384 208c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm32 0c0-8.837 7.163-16 16-16s16 7.163 16 16-7.163 16-16 16-16-7.163-16-16zm96 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-160 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm48-16c8.837 0 16 7.163 16 16s-7.163 16-16 16-16-7.163-16-16 7.163-16 16-16zm80 16c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-160 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm32 0c0-8.837 7.163-16 16-16s16 7.163 16 16-7.163 16-16 16-16-7.163-16-16zm96 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-128 32c0-8.837 7.163-16 16-16s16 7.163 16 16-7.163 16-16 16-16-7.163-16-16zm96 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-96 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm64 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-32 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-32 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16z\"]\n};\nvar faShuttleVan = {\n prefix: 'fas',\n iconName: 'shuttle-van',\n icon: [640, 512, [], \"f5b6\", \"M628.88 210.65L494.39 49.27A48.01 48.01 0 0 0 457.52 32H32C14.33 32 0 46.33 0 64v288c0 17.67 14.33 32 32 32h32c0 53.02 42.98 96 96 96s96-42.98 96-96h128c0 53.02 42.98 96 96 96s96-42.98 96-96h32c17.67 0 32-14.33 32-32V241.38c0-11.23-3.94-22.1-11.12-30.73zM64 192V96h96v96H64zm96 240c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm160-240h-96V96h96v96zm160 240c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm-96-240V96h66.02l80 96H384z\"]\n};\nvar faSign = {\n prefix: 'fas',\n iconName: 'sign',\n icon: [512, 512, [], \"f4d9\", \"M496 64H128V16c0-8.8-7.2-16-16-16H80c-8.8 0-16 7.2-16 16v48H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h48v368c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V128h368c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16zM160 384h320V160H160v224z\"]\n};\nvar faSignInAlt = {\n prefix: 'fas',\n iconName: 'sign-in-alt',\n icon: [512, 512, [], \"f2f6\", \"M416 448h-84c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h84c17.7 0 32-14.3 32-32V160c0-17.7-14.3-32-32-32h-84c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h84c53 0 96 43 96 96v192c0 53-43 96-96 96zm-47-201L201 79c-15-15-41-4.5-41 17v96H24c-13.3 0-24 10.7-24 24v96c0 13.3 10.7 24 24 24h136v96c0 21.5 26 32 41 17l168-168c9.3-9.4 9.3-24.6 0-34z\"]\n};\nvar faSignLanguage = {\n prefix: 'fas',\n iconName: 'sign-language',\n icon: [448, 512, [], \"f2a7\", \"M91.434 483.987c-.307-16.018 13.109-29.129 29.13-29.129h62.293v-5.714H56.993c-16.021 0-29.437-13.111-29.13-29.129C28.16 404.491 40.835 392 56.428 392h126.429v-5.714H29.136c-16.021 0-29.437-13.111-29.13-29.129.297-15.522 12.973-28.013 28.566-28.013h154.286v-5.714H57.707c-16.021 0-29.437-13.111-29.13-29.129.297-15.522 12.973-28.013 28.566-28.013h168.566l-31.085-22.606c-12.762-9.281-15.583-27.149-6.302-39.912 9.281-12.761 27.15-15.582 39.912-6.302l123.361 89.715a34.287 34.287 0 0 1 14.12 27.728v141.136c0 15.91-10.946 29.73-26.433 33.374l-80.471 18.934a137.16 137.16 0 0 1-31.411 3.646H120c-15.593-.001-28.269-12.492-28.566-28.014zm73.249-225.701h36.423l-11.187-8.136c-18.579-13.511-20.313-40.887-3.17-56.536l-13.004-16.7c-9.843-12.641-28.43-15.171-40.88-5.088-12.065 9.771-14.133 27.447-4.553 39.75l36.371 46.71zm283.298-2.103l-5.003-152.452c-.518-15.771-13.722-28.136-29.493-27.619-15.773.518-28.137 13.722-27.619 29.493l1.262 38.415L283.565 11.019c-9.58-12.303-27.223-14.63-39.653-5.328-12.827 9.599-14.929 28.24-5.086 40.881l76.889 98.745-4.509 3.511-94.79-121.734c-9.58-12.303-27.223-14.63-39.653-5.328-12.827 9.599-14.929 28.24-5.086 40.881l94.443 121.288-4.509 3.511-77.675-99.754c-9.58-12.303-27.223-14.63-39.653-5.328-12.827 9.599-14.929 28.24-5.086 40.881l52.053 66.849c12.497-8.257 29.055-8.285 41.69.904l123.36 89.714c10.904 7.93 17.415 20.715 17.415 34.198v16.999l61.064-47.549a34.285 34.285 0 0 0 13.202-28.177z\"]\n};\nvar faSignOutAlt = {\n prefix: 'fas',\n iconName: 'sign-out-alt',\n icon: [512, 512, [], \"f2f5\", \"M497 273L329 441c-15 15-41 4.5-41-17v-96H152c-13.3 0-24-10.7-24-24v-96c0-13.3 10.7-24 24-24h136V88c0-21.4 25.9-32 41-17l168 168c9.3 9.4 9.3 24.6 0 34zM192 436v-40c0-6.6-5.4-12-12-12H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h84c6.6 0 12-5.4 12-12V76c0-6.6-5.4-12-12-12H96c-53 0-96 43-96 96v192c0 53 43 96 96 96h84c6.6 0 12-5.4 12-12z\"]\n};\nvar faSignal = {\n prefix: 'fas',\n iconName: 'signal',\n icon: [640, 512, [], \"f012\", \"M216 288h-48c-8.84 0-16 7.16-16 16v192c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V304c0-8.84-7.16-16-16-16zM88 384H40c-8.84 0-16 7.16-16 16v96c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16v-96c0-8.84-7.16-16-16-16zm256-192h-48c-8.84 0-16 7.16-16 16v288c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V208c0-8.84-7.16-16-16-16zm128-96h-48c-8.84 0-16 7.16-16 16v384c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V112c0-8.84-7.16-16-16-16zM600 0h-48c-8.84 0-16 7.16-16 16v480c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16z\"]\n};\nvar faSignature = {\n prefix: 'fas',\n iconName: 'signature',\n icon: [640, 512, [], \"f5b7\", \"M623.2 192c-51.8 3.5-125.7 54.7-163.1 71.5-29.1 13.1-54.2 24.4-76.1 24.4-22.6 0-26-16.2-21.3-51.9 1.1-8 11.7-79.2-42.7-76.1-25.1 1.5-64.3 24.8-169.5 126L192 182.2c30.4-75.9-53.2-151.5-129.7-102.8L7.4 116.3C0 121-2.2 130.9 2.5 138.4l17.2 27c4.7 7.5 14.6 9.7 22.1 4.9l58-38.9c18.4-11.7 40.7 7.2 32.7 27.1L34.3 404.1C27.5 421 37 448 64 448c8.3 0 16.5-3.2 22.6-9.4 42.2-42.2 154.7-150.7 211.2-195.8-2.2 28.5-2.1 58.9 20.6 83.8 15.3 16.8 37.3 25.3 65.5 25.3 35.6 0 68-14.6 102.3-30 33-14.8 99-62.6 138.4-65.8 8.5-.7 15.2-7.3 15.2-15.8v-32.1c.2-9.1-7.5-16.8-16.6-16.2z\"]\n};\nvar faSimCard = {\n prefix: 'fas',\n iconName: 'sim-card',\n icon: [384, 512, [], \"f7c4\", \"M0 64v384c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V128L256 0H64C28.7 0 0 28.7 0 64zm224 192h-64v-64h64v64zm96 0h-64v-64h32c17.7 0 32 14.3 32 32v32zm-64 128h64v32c0 17.7-14.3 32-32 32h-32v-64zm-96 0h64v64h-64v-64zm-96 0h64v64H96c-17.7 0-32-14.3-32-32v-32zm0-96h256v64H64v-64zm0-64c0-17.7 14.3-32 32-32h32v64H64v-32z\"]\n};\nvar faSitemap = {\n prefix: 'fas',\n iconName: 'sitemap',\n icon: [640, 512, [], \"f0e8\", \"M128 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32zm-24-80h192v48h48v-48h192v48h48v-57.59c0-21.17-17.23-38.41-38.41-38.41H344v-64h40c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32H256c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h40v64H94.41C73.23 224 56 241.23 56 262.41V320h48v-48zm264 80h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32zm240 0h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32z\"]\n};\nvar faSkating = {\n prefix: 'fas',\n iconName: 'skating',\n icon: [448, 512, [], \"f7c5\", \"M400 0c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm0 448c-8.8 0-16 7.2-16 16s-7.2 16-16 16h-96c-8.8 0-16 7.2-16 16s7.2 16 16 16h96c26.5 0 48-21.5 48-48 0-8.8-7.2-16-16-16zm-282.2 8.6c-6.2 6.2-16.4 6.3-22.6 0l-67.9-67.9c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6l67.9 67.9c9.4 9.4 21.7 14 34 14s24.6-4.7 33.9-14c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.3-22.7 0zm56.1-179.8l-93.7 93.7c-12.5 12.5-12.5 32.8 0 45.2 6.2 6.2 14.4 9.4 22.6 9.4s16.4-3.1 22.6-9.4l91.9-91.9-30.2-30.2c-5-5-9.4-10.7-13.2-16.8zM128 160h105.5l-20.1 17.2c-13.5 11.5-21.6 28.4-22.3 46.1-.7 17.8 6.1 35.2 18.7 47.7l78.2 78.2V432c0 17.7 14.3 32 32 32s32-14.3 32-32v-89.4c0-12.6-5.1-25-14.1-33.9l-61-61c.5-.4 1.2-.6 1.7-1.1l82.3-82.3c11.5-11.5 14.9-28.6 8.7-43.6-6.2-15-20.7-24.7-37-24.7H128c-17.7 0-32 14.3-32 32s14.3 32 32 32z\"]\n};\nvar faSkiing = {\n prefix: 'fas',\n iconName: 'skiing',\n icon: [512, 512, [], \"f7c9\", \"M432 96c26.5 0 48-21.5 48-48S458.5 0 432 0s-48 21.5-48 48 21.5 48 48 48zm73 356.1c-9.4-9.4-24.6-9.4-33.9 0-12.1 12.1-30.5 15.4-45.1 8.7l-135.8-70.2 49.2-73.8c12.7-19 10.2-44.5-6-60.6L293 215.7l-107-53.1c-2.9 19.9 3.4 40 17.7 54.4l75.1 75.2-45.9 68.8L35 258.7c-11.7-6-26.2-1.5-32.3 10.3-6.1 11.8-1.5 26.3 10.3 32.3l391.9 202.5c11.9 5.5 24.5 8.1 37.1 8.1 23.2 0 46-9 63-26 9.3-9.3 9.3-24.5 0-33.8zM120 91.6l-11.5 22.5c14.4 7.3 31.2 4.9 42.8-4.8l47.2 23.4c-.1.1-.1.2-.2.3l114.5 56.8 32.4-13 6.4 19.1c4 12.1 12.6 22 24 27.7l58.1 29c15.9 7.9 35 1.5 42.9-14.3 7.9-15.8 1.5-35-14.3-42.9l-52.1-26.1-17.1-51.2c-8.1-24.2-40.9-56.6-84.5-39.2l-81.2 32.5-62.5-31c.3-14.5-7.2-28.6-20.9-35.6l-11.1 21.7h-.2l-34.4-7c-1.8-.4-3.7.2-5 1.7-1.9 2.2-1.7 5.5.5 7.4l26.2 23z\"]\n};\nvar faSkiingNordic = {\n prefix: 'fas',\n iconName: 'skiing-nordic',\n icon: [576, 512, [], \"f7ca\", \"M336 96c26.5 0 48-21.5 48-48S362.5 0 336 0s-48 21.5-48 48 21.5 48 48 48zm216 320c-13.2 0-24 10.7-24 24 0 13.2-10.8 24-24 24h-69.5L460 285.6c11.7-4.7 20.1-16.2 20.1-29.6 0-17.7-14.3-32-32-32h-44L378 170.8c-12.5-25.5-35.5-44.2-61.8-50.9L245 98.7c-28.3-6.8-57.8-.5-80.8 17.1l-39.7 30.4c-14 10.7-16.7 30.8-5.9 44.9.7.9 1.7 1.3 2.4 2.1L66.9 464H24c-13.2 0-24 10.7-24 24s10.8 24 24 24h480c39.7 0 72-32.3 72-72 0-13.2-10.8-24-24-24zm-260.5 48h-96.9l43.1-91-22-13c-12.1-7.2-21.9-16.9-29.5-27.8L123.7 464H99.5l52.3-261.4c4.1-1 8.1-2.9 11.7-5.6l39.7-30.4c7.7-5.9 17.4-8 25.3-6.1l14.7 4.4-37.5 87.4c-12.6 29.5-1.3 64 26.3 80.3l85 50.2-25.5 81.2zm110.6 0h-43.6l23.6-75.5c5.9-20.8-2.9-43.1-21.6-54.4L299.3 298l31.3-78.3 20.3 41.4c8 16.3 24.9 26.9 43.1 26.9h33.3l-25.2 176z\"]\n};\nvar faSkull = {\n prefix: 'fas',\n iconName: 'skull',\n icon: [512, 512, [], \"f54c\", \"M256 0C114.6 0 0 100.3 0 224c0 70.1 36.9 132.6 94.5 173.7 9.6 6.9 15.2 18.1 13.5 29.9l-9.4 66.2c-1.4 9.6 6 18.2 15.7 18.2H192v-56c0-4.4 3.6-8 8-8h16c4.4 0 8 3.6 8 8v56h64v-56c0-4.4 3.6-8 8-8h16c4.4 0 8 3.6 8 8v56h77.7c9.7 0 17.1-8.6 15.7-18.2l-9.4-66.2c-1.7-11.7 3.8-23 13.5-29.9C475.1 356.6 512 294.1 512 224 512 100.3 397.4 0 256 0zm-96 320c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm192 0c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z\"]\n};\nvar faSkullCrossbones = {\n prefix: 'fas',\n iconName: 'skull-crossbones',\n icon: [448, 512, [], \"f714\", \"M439.15 453.06L297.17 384l141.99-69.06c7.9-3.95 11.11-13.56 7.15-21.46L432 264.85c-3.95-7.9-13.56-11.11-21.47-7.16L224 348.41 37.47 257.69c-7.9-3.95-17.51-.75-21.47 7.16L1.69 293.48c-3.95 7.9-.75 17.51 7.15 21.46L150.83 384 8.85 453.06c-7.9 3.95-11.11 13.56-7.15 21.47l14.31 28.63c3.95 7.9 13.56 11.11 21.47 7.15L224 419.59l186.53 90.72c7.9 3.95 17.51.75 21.47-7.15l14.31-28.63c3.95-7.91.74-17.52-7.16-21.47zM150 237.28l-5.48 25.87c-2.67 12.62 5.42 24.85 16.45 24.85h126.08c11.03 0 19.12-12.23 16.45-24.85l-5.5-25.87c41.78-22.41 70-62.75 70-109.28C368 57.31 303.53 0 224 0S80 57.31 80 128c0 46.53 28.22 86.87 70 109.28zM280 112c17.65 0 32 14.35 32 32s-14.35 32-32 32-32-14.35-32-32 14.35-32 32-32zm-112 0c17.65 0 32 14.35 32 32s-14.35 32-32 32-32-14.35-32-32 14.35-32 32-32z\"]\n};\nvar faSlash = {\n prefix: 'fas',\n iconName: 'slash',\n icon: [640, 512, [], \"f715\", \"M594.53 508.63L6.18 53.9c-6.97-5.42-8.23-15.47-2.81-22.45L23.01 6.18C28.43-.8 38.49-2.06 45.47 3.37L633.82 458.1c6.97 5.42 8.23 15.47 2.81 22.45l-19.64 25.27c-5.42 6.98-15.48 8.23-22.46 2.81z\"]\n};\nvar faSleigh = {\n prefix: 'fas',\n iconName: 'sleigh',\n icon: [640, 512, [], \"f7cc\", \"M612.7 350.7l-9.3-7.4c-6.9-5.5-17-4.4-22.5 2.5l-10 12.5c-5.5 6.9-4.4 17 2.5 22.5l9.3 7.4c5.9 4.7 9.2 11.7 9.2 19.2 0 13.6-11 24.6-24.6 24.6H48c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h516c39 0 73.7-29.3 75.9-68.3 1.4-23.8-8.7-46.3-27.2-61zM32 224c0 59.6 40.9 109.2 96 123.5V400h64v-48h192v48h64v-48c53 0 96-43 96-96v-96c17.7 0 32-14.3 32-32s-14.3-32-32-32h-96v64c0 35.3-28.7 64-64 64h-20.7c-65.8 0-125.9-37.2-155.3-96-29.4-58.8-89.6-96-155.3-96H32C14.3 32 0 46.3 0 64s14.3 32 32 32v128z\"]\n};\nvar faSlidersH = {\n prefix: 'fas',\n iconName: 'sliders-h',\n icon: [512, 512, [], \"f1de\", \"M496 384H160v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h80v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h336c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160h-80v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h336v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h80c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160H288V48c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h208v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16z\"]\n};\nvar faSmile = {\n prefix: 'fas',\n iconName: 'smile',\n icon: [496, 512, [], \"f118\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm194.8 170.2C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.6-16.3 11-36.7 24.6-20.5 22.4 26.9 55.2 42.2 90.2 42.2s67.8-15.4 90.2-42.2c13.4-16.2 38.1 4.2 24.6 20.5z\"]\n};\nvar faSmileBeam = {\n prefix: 'fas',\n iconName: 'smile-beam',\n icon: [496, 512, [], \"f5b8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM112 223.4c3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.3 7.4-15.8 4-15.1-4.5zm250.8 122.8C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.5-16.3 11-36.7 24.6-20.5 22.4 26.9 55.2 42.2 90.2 42.2s67.8-15.4 90.2-42.2c13.6-16.2 38.1 4.3 24.6 20.5zm6.2-118.3l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.3-15.6 4-14.9-4.5 3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.6 8.6-11 11.9-15.1 4.5z\"]\n};\nvar faSmileWink = {\n prefix: 'fas',\n iconName: 'smile-wink',\n icon: [496, 512, [], \"f4da\", \"M0 256c0 137 111 248 248 248s248-111 248-248S385 8 248 8 0 119 0 256zm200-48c0 17.7-14.3 32-32 32s-32-14.3-32-32 14.3-32 32-32 32 14.3 32 32zm158.5 16.5c-14.8-13.2-46.2-13.2-61 0L288 233c-8.3 7.4-21.6.4-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S384 197 388 222.2c1.7 11.1-11.4 18.3-19.8 10.8l-9.7-8.5zM157.8 325.8C180.2 352.7 213 368 248 368s67.8-15.4 90.2-42.2c13.6-16.2 38.1 4.2 24.6 20.5C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.5-16.3 11.2-36.7 24.6-20.4z\"]\n};\nvar faSmog = {\n prefix: 'fas',\n iconName: 'smog',\n icon: [640, 512, [], \"f75f\", \"M624 368H80c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h544c8.8 0 16-7.2 16-16v-16c0-8.8-7.2-16-16-16zm-480 96H16c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-16c0-8.8-7.2-16-16-16zm416 0H224c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h336c8.8 0 16-7.2 16-16v-16c0-8.8-7.2-16-16-16zM144 288h156.1c22.5 19.7 51.6 32 83.9 32s61.3-12.3 83.9-32H528c61.9 0 112-50.1 112-112S589.9 64 528 64c-18 0-34.7 4.6-49.7 12.1C454 31 406.8 0 352 0c-41 0-77.8 17.3-104 44.8C221.8 17.3 185 0 144 0 64.5 0 0 64.5 0 144s64.5 144 144 144z\"]\n};\nvar faSmoking = {\n prefix: 'fas',\n iconName: 'smoking',\n icon: [640, 512, [], \"f48d\", \"M632 352h-48c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8zM553.3 87.1c-5.7-3.8-9.3-10-9.3-16.8V8c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v62.3c0 22 10.2 43.4 28.6 55.4 42.2 27.3 67.4 73.8 67.4 124V280c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-30.3c0-65.5-32.4-126.2-86.7-162.6zM432 352H48c-26.5 0-48 21.5-48 48v64c0 26.5 21.5 48 48 48h384c8.8 0 16-7.2 16-16V368c0-8.8-7.2-16-16-16zm-32 112H224v-64h176v64zm87.7-322.4C463.8 125 448 99.3 448 70.3V8c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v66.4c0 43.7 24.6 81.6 60.3 106.7 22.4 15.7 35.7 41.2 35.7 68.6V280c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-30.3c0-43.3-21-83.4-56.3-108.1zM536 352h-48c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8z\"]\n};\nvar faSmokingBan = {\n prefix: 'fas',\n iconName: 'smoking-ban',\n icon: [512, 512, [], \"f54d\", \"M96 304c0 8.8 7.2 16 16 16h117.5l-96-96H112c-8.8 0-16 7.2-16 16v64zM256 0C114.6 0 0 114.6 0 256s114.6 256 256 256 256-114.6 256-256S397.4 0 256 0zm0 448c-105.9 0-192-86.1-192-192 0-41.4 13.3-79.7 35.7-111.1l267.4 267.4C335.7 434.7 297.4 448 256 448zm45.2-192H384v32h-50.8l-32-32zm111.1 111.1L365.2 320H400c8.8 0 16-7.2 16-16v-64c0-8.8-7.2-16-16-16H269.2L144.9 99.7C176.3 77.3 214.6 64 256 64c105.9 0 192 86.1 192 192 0 41.4-13.3 79.7-35.7 111.1zM320.6 128c-15.6 0-28.6-11.2-31.4-25.9-.7-3.6-4-6.1-7.7-6.1h-16.2c-5 0-8.7 4.5-8 9.4 4.6 30.9 31.2 54.6 63.3 54.6 15.6 0 28.6 11.2 31.4 25.9.7 3.6 4 6.1 7.7 6.1h16.2c5 0 8.7-4.5 8-9.4-4.6-30.9-31.2-54.6-63.3-54.6z\"]\n};\nvar faSms = {\n prefix: 'fas',\n iconName: 'sms',\n icon: [512, 512, [], \"f7cd\", \"M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7 1.3 3 4.1 4.8 7.3 4.8 66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32zM128.2 304H116c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h12.3c6 0 10.4-3.5 10.4-6.6 0-1.3-.8-2.7-2.1-3.8l-21.9-18.8c-8.5-7.2-13.3-17.5-13.3-28.1 0-21.3 19-38.6 42.4-38.6H156c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8h-12.3c-6 0-10.4 3.5-10.4 6.6 0 1.3.8 2.7 2.1 3.8l21.9 18.8c8.5 7.2 13.3 17.5 13.3 28.1.1 21.3-19 38.6-42.4 38.6zm191.8-8c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8v-68.2l-24.8 55.8c-2.9 5.9-11.4 5.9-14.3 0L224 227.8V296c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V192c0-8.8 7.2-16 16-16h16c6.1 0 11.6 3.4 14.3 8.8l17.7 35.4 17.7-35.4c2.7-5.4 8.3-8.8 14.3-8.8h16c8.8 0 16 7.2 16 16v104zm48.3 8H356c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h12.3c6 0 10.4-3.5 10.4-6.6 0-1.3-.8-2.7-2.1-3.8l-21.9-18.8c-8.5-7.2-13.3-17.5-13.3-28.1 0-21.3 19-38.6 42.4-38.6H396c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8h-12.3c-6 0-10.4 3.5-10.4 6.6 0 1.3.8 2.7 2.1 3.8l21.9 18.8c8.5 7.2 13.3 17.5 13.3 28.1.1 21.3-18.9 38.6-42.3 38.6z\"]\n};\nvar faSnowboarding = {\n prefix: 'fas',\n iconName: 'snowboarding',\n icon: [512, 512, [], \"f7ce\", \"M432 96c26.5 0 48-21.5 48-48S458.5 0 432 0s-48 21.5-48 48 21.5 48 48 48zm28.8 153.6c5.8 4.3 12.5 6.4 19.2 6.4 9.7 0 19.3-4.4 25.6-12.8 10.6-14.1 7.8-34.2-6.4-44.8l-111.4-83.5c-13.8-10.3-29.1-18.4-45.4-23.8l-63.7-21.2-26.1-52.1C244.7 2 225.5-4.4 209.7 3.5c-15.8 7.9-22.2 27.1-14.3 42.9l29.1 58.1c5.7 11.4 15.6 19.9 27.7 24l16.4 5.5-41.2 20.6c-21.8 10.9-35.4 32.8-35.4 57.2v53.1l-74.1 24.7c-16.8 5.6-25.8 23.7-20.2 40.5 1.7 5.2 4.9 9.4 8.7 12.9l-38.7-14.1c-9.7-3.5-17.4-10.6-21.8-20-5.6-12-19.9-17.2-31.9-11.6s-17.2 19.9-11.6 31.9c9.8 21 27.1 36.9 48.9 44.8l364.8 132.7c9.7 3.5 19.7 5.3 29.7 5.3 12.5 0 24.9-2.7 36.5-8.2 12-5.6 17.2-19.9 11.6-31.9S474 454.7 462 460.3c-9.3 4.4-19.8 4.8-29.5 1.3l-90.8-33.1c8.7-4.1 15.6-11.8 17.8-21.9l21.9-102c3.9-18.2-3.2-37.2-18.1-48.4l-52-39 66-30.5 83.5 62.9zm-144.4 51.7l-19.7 92c-1.5 7.1-.1 13.9 2.8 20l-169.4-61.6c2.7-.2 5.4-.4 8-1.3l85-28.4c19.6-6.5 32.8-24.8 32.8-45.5V256l60.5 45.3z\"]\n};\nvar faSnowflake = {\n prefix: 'fas',\n iconName: 'snowflake',\n icon: [448, 512, [], \"f2dc\", \"M440.3 345.2l-33.8-19.5 26-7c8.2-2.2 13.1-10.7 10.9-18.9l-4-14.9c-2.2-8.2-10.7-13.1-18.9-10.9l-70.8 19-63.9-37 63.8-36.9 70.8 19c8.2 2.2 16.7-2.7 18.9-10.9l4-14.9c2.2-8.2-2.7-16.7-10.9-18.9l-26-7 33.8-19.5c7.4-4.3 9.9-13.7 5.7-21.1L430.4 119c-4.3-7.4-13.7-9.9-21.1-5.7l-33.8 19.5 7-26c2.2-8.2-2.7-16.7-10.9-18.9l-14.9-4c-8.2-2.2-16.7 2.7-18.9 10.9l-19 70.8-62.8 36.2v-77.5l53.7-53.7c6.2-6.2 6.2-16.4 0-22.6l-11.3-11.3c-6.2-6.2-16.4-6.2-22.6 0L256 56.4V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v40.4l-19.7-19.7c-6.2-6.2-16.4-6.2-22.6 0L138.3 48c-6.3 6.2-6.3 16.4 0 22.6l53.7 53.7v77.5l-62.8-36.2-19-70.8c-2.2-8.2-10.7-13.1-18.9-10.9l-14.9 4c-8.2 2.2-13.1 10.7-10.9 18.9l7 26-33.8-19.5c-7.4-4.3-16.8-1.7-21.1 5.7L2.1 145.7c-4.3 7.4-1.7 16.8 5.7 21.1l33.8 19.5-26 7c-8.3 2.2-13.2 10.7-11 19l4 14.9c2.2 8.2 10.7 13.1 18.9 10.9l70.8-19 63.8 36.9-63.8 36.9-70.8-19c-8.2-2.2-16.7 2.7-18.9 10.9l-4 14.9c-2.2 8.2 2.7 16.7 10.9 18.9l26 7-33.8 19.6c-7.4 4.3-9.9 13.7-5.7 21.1l15.5 26.8c4.3 7.4 13.7 9.9 21.1 5.7l33.8-19.5-7 26c-2.2 8.2 2.7 16.7 10.9 18.9l14.9 4c8.2 2.2 16.7-2.7 18.9-10.9l19-70.8 62.8-36.2v77.5l-53.7 53.7c-6.3 6.2-6.3 16.4 0 22.6l11.3 11.3c6.2 6.2 16.4 6.2 22.6 0l19.7-19.7V496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-40.4l19.7 19.7c6.2 6.2 16.4 6.2 22.6 0l11.3-11.3c6.2-6.2 6.2-16.4 0-22.6L256 387.7v-77.5l62.8 36.2 19 70.8c2.2 8.2 10.7 13.1 18.9 10.9l14.9-4c8.2-2.2 13.1-10.7 10.9-18.9l-7-26 33.8 19.5c7.4 4.3 16.8 1.7 21.1-5.7l15.5-26.8c4.3-7.3 1.8-16.8-5.6-21z\"]\n};\nvar faSnowman = {\n prefix: 'fas',\n iconName: 'snowman',\n icon: [512, 512, [], \"f7d0\", \"M510.9 152.3l-5.9-14.5c-3.3-8-12.6-11.9-20.8-8.7L456 140.6v-29c0-8.6-7.2-15.6-16-15.6h-16c-8.8 0-16 7-16 15.6v46.9c0 .5.3 1 .3 1.5l-56.4 23c-5.9-10-13.3-18.9-22-26.6 13.6-16.6 22-37.4 22-60.5 0-53-43-96-96-96s-96 43-96 96c0 23.1 8.5 43.9 22 60.5-8.7 7.7-16 16.6-22 26.6l-56.4-23c.1-.5.3-1 .3-1.5v-46.9C104 103 96.8 96 88 96H72c-8.8 0-16 7-16 15.6v29l-28.1-11.5c-8.2-3.2-17.5.7-20.8 8.7l-5.9 14.5c-3.3 8 .7 17.1 8.9 20.3l135.2 55.2c-.4 4-1.2 8-1.2 12.2 0 10.1 1.7 19.6 4.2 28.9C120.9 296.4 104 334.2 104 376c0 54 28.4 100.9 70.8 127.8 9.3 5.9 20.3 8.2 31.3 8.2h99.2c13.3 0 26.3-4.1 37.2-11.7 46.5-32.3 74.4-89.4 62.9-152.6-5.5-30.2-20.5-57.6-41.6-79 2.5-9.2 4.2-18.7 4.2-28.7 0-4.2-.8-8.1-1.2-12.2L502 172.6c8.1-3.1 12.1-12.2 8.9-20.3zM224 96c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm32 272c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-88s-16-23.2-16-32 7.2-16 16-16 16 7.2 16 16-16 32-16 32zm32-56c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faSnowplow = {\n prefix: 'fas',\n iconName: 'snowplow',\n icon: [640, 512, [], \"f7d2\", \"M120 376c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm80 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm80 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm80 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm238.6 49.4c-14.5-14.5-22.6-34.1-22.6-54.6V269.2c0-20.5 8.1-40.1 22.6-54.6l36.7-36.7c6.2-6.2 6.2-16.4 0-22.6l-22.6-22.6c-6.2-6.2-16.4-6.2-22.6 0l-36.7 36.7c-26.5 26.5-41.4 62.4-41.4 99.9V288h-64v-50.9c0-8.7-1.8-17.2-5.2-25.2L364.5 29.1C356.9 11.4 339.6 0 320.3 0H176c-26.5 0-48 21.5-48 48v112h-16c-26.5 0-48 21.5-48 48v91.2C26.3 317.2 0 355.4 0 400c0 61.9 50.1 112 112 112h256c61.9 0 112-50.1 112-112 0-17.3-4.2-33.4-11.2-48H512v18.7c0 37.5 14.9 73.4 41.4 99.9l36.7 36.7c6.2 6.2 16.4 6.2 22.6 0l22.6-22.6c6.2-6.2 6.2-16.4 0-22.6l-36.7-36.7zM192 64h117.8l68.6 160H256l-64-64V64zm176 384H112c-26.5 0-48-21.5-48-48s21.5-48 48-48h256c26.5 0 48 21.5 48 48s-21.5 48-48 48z\"]\n};\nvar faSocks = {\n prefix: 'fas',\n iconName: 'socks',\n icon: [512, 512, [], \"f696\", \"M214.66 311.01L288 256V96H128v176l-86.65 64.61c-39.4 29.56-53.86 84.42-29.21 127.06C30.39 495.25 63.27 512 96.08 512c20.03 0 40.25-6.25 57.52-19.2l21.86-16.39c-29.85-55.38-13.54-125.84 39.2-165.4zM288 32c0-11.05 3.07-21.3 8.02-30.38C293.4.92 290.85 0 288 0H160c-17.67 0-32 14.33-32 32v32h160V32zM480 0H352c-17.67 0-32 14.33-32 32v32h192V32c0-17.67-14.33-32-32-32zM320 272l-86.13 64.61c-39.4 29.56-53.86 84.42-29.21 127.06 18.25 31.58 50.61 48.33 83.42 48.33 20.03 0 40.25-6.25 57.52-19.2l115.2-86.4A127.997 127.997 0 0 0 512 304V96H320v176z\"]\n};\nvar faSolarPanel = {\n prefix: 'fas',\n iconName: 'solar-panel',\n icon: [640, 512, [], \"f5ba\", \"M431.98 448.01l-47.97.05V416h-128v32.21l-47.98.05c-8.82.01-15.97 7.16-15.98 15.99l-.05 31.73c-.01 8.85 7.17 16.03 16.02 16.02l223.96-.26c8.82-.01 15.97-7.16 15.98-15.98l.04-31.73c.01-8.85-7.17-16.03-16.02-16.02zM585.2 26.74C582.58 11.31 568.99 0 553.06 0H86.93C71 0 57.41 11.31 54.79 26.74-3.32 369.16.04 348.08.03 352c-.03 17.32 14.29 32 32.6 32h574.74c18.23 0 32.51-14.56 32.59-31.79.02-4.08 3.35 16.95-54.76-325.47zM259.83 64h120.33l9.77 96H250.06l9.77-96zm-75.17 256H71.09L90.1 208h105.97l-11.41 112zm16.29-160H98.24l16.29-96h96.19l-9.77 96zm32.82 160l11.4-112h149.65l11.4 112H233.77zm195.5-256h96.19l16.29 96H439.04l-9.77-96zm26.06 256l-11.4-112H549.9l19.01 112H455.33z\"]\n};\nvar faSort = {\n prefix: 'fas',\n iconName: 'sort',\n icon: [320, 512, [], \"f0dc\", \"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41zm255-105L177 64c-9.4-9.4-24.6-9.4-33.9 0L24 183c-15.1 15.1-4.4 41 17 41h238c21.4 0 32.1-25.9 17-41z\"]\n};\nvar faSortAlphaDown = {\n prefix: 'fas',\n iconName: 'sort-alpha-down',\n icon: [448, 512, [], \"f15d\", \"M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm240-64H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 446.37V464a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 321.63V304a16 16 0 0 0-16-16zm31.06-85.38l-59.27-160A16 16 0 0 0 372.72 32h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 224h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 224H432a16 16 0 0 0 15.06-21.38zM335.61 144L352 96l16.39 48z\"]\n};\nvar faSortAlphaDownAlt = {\n prefix: 'fas',\n iconName: 'sort-alpha-down-alt',\n icon: [448, 512, [], \"f881\", \"M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm112-128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 65.63V48a16 16 0 0 0-16-16H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 190.37V208a16 16 0 0 0 16 16zm159.06 234.62l-59.27-160A16 16 0 0 0 372.72 288h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 480h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 480H432a16 16 0 0 0 15.06-21.38zM335.61 400L352 352l16.39 48z\"]\n};\nvar faSortAlphaUp = {\n prefix: 'fas',\n iconName: 'sort-alpha-up',\n icon: [448, 512, [], \"f15e\", \"M16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160zm400 128H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 446.37V464a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 321.63V304a16 16 0 0 0-16-16zm31.06-85.38l-59.27-160A16 16 0 0 0 372.72 32h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 224h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 224H432a16 16 0 0 0 15.06-21.38zM335.61 144L352 96l16.39 48z\"]\n};\nvar faSortAlphaUpAlt = {\n prefix: 'fas',\n iconName: 'sort-alpha-up-alt',\n icon: [448, 512, [], \"f882\", \"M16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160zm272 64h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 65.63V48a16 16 0 0 0-16-16H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 190.37V208a16 16 0 0 0 16 16zm159.06 234.62l-59.27-160A16 16 0 0 0 372.72 288h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 480h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 480H432a16 16 0 0 0 15.06-21.38zM335.61 400L352 352l16.39 48z\"]\n};\nvar faSortAmountDown = {\n prefix: 'fas',\n iconName: 'sort-amount-down',\n icon: [512, 512, [], \"f160\", \"M304 416h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-128-64h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.37 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm256-192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-64 128H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM496 32H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faSortAmountDownAlt = {\n prefix: 'fas',\n iconName: 'sort-amount-down-alt',\n icon: [512, 512, [], \"f884\", \"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm-64 0h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.37 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352z\"]\n};\nvar faSortAmountUp = {\n prefix: 'fas',\n iconName: 'sort-amount-up',\n icon: [512, 512, [], \"f161\", \"M304 416h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.77 160 16 160zm416 0H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-64 128H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM496 32H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faSortAmountUpAlt = {\n prefix: 'fas',\n iconName: 'sort-amount-up-alt',\n icon: [512, 512, [], \"f885\", \"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.39-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160z\"]\n};\nvar faSortDown = {\n prefix: 'fas',\n iconName: 'sort-down',\n icon: [320, 512, [], \"f0dd\", \"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41z\"]\n};\nvar faSortNumericDown = {\n prefix: 'fas',\n iconName: 'sort-numeric-down',\n icon: [448, 512, [], \"f162\", \"M304 96h16v64h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-16V48a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 304 96zm26.15 162.91a79 79 0 0 0-55 54.17c-14.25 51.05 21.21 97.77 68.85 102.53a84.07 84.07 0 0 1-20.85 12.91c-7.57 3.4-10.8 12.47-8.18 20.34l9.9 20c2.87 8.63 12.53 13.49 20.9 9.91 58-24.76 86.25-61.61 86.25-132V336c-.02-51.21-48.4-91.34-101.85-77.09zM352 356a20 20 0 1 1 20-20 20 20 0 0 1-20 20zm-176-4h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352z\"]\n};\nvar faSortNumericDownAlt = {\n prefix: 'fas',\n iconName: 'sort-numeric-down-alt',\n icon: [448, 512, [], \"f886\", \"M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm224 64h-16V304a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 304 352h16v64h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM330.17 34.91a79 79 0 0 0-55 54.17c-14.27 51.05 21.19 97.77 68.83 102.53a84.07 84.07 0 0 1-20.85 12.91c-7.57 3.4-10.8 12.47-8.18 20.34l9.9 20c2.87 8.63 12.53 13.49 20.9 9.91 58-24.77 86.25-61.61 86.25-132V112c-.02-51.21-48.4-91.34-101.85-77.09zM352 132a20 20 0 1 1 20-20 20 20 0 0 1-20 20z\"]\n};\nvar faSortNumericUp = {\n prefix: 'fas',\n iconName: 'sort-numeric-up',\n icon: [448, 512, [], \"f163\", \"M330.17 258.91a79 79 0 0 0-55 54.17c-14.27 51.05 21.19 97.77 68.83 102.53a84.07 84.07 0 0 1-20.85 12.91c-7.57 3.4-10.8 12.47-8.18 20.34l9.9 20c2.87 8.63 12.53 13.49 20.9 9.91 58-24.76 86.25-61.61 86.25-132V336c-.02-51.21-48.4-91.34-101.85-77.09zM352 356a20 20 0 1 1 20-20 20 20 0 0 1-20 20zM304 96h16v64h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-16V48a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 304 96zM107.31 36.69a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31z\"]\n};\nvar faSortNumericUpAlt = {\n prefix: 'fas',\n iconName: 'sort-numeric-up-alt',\n icon: [448, 512, [], \"f887\", \"M107.31 36.69a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31zM400 416h-16V304a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 304 352h16v64h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM330.17 34.91a79 79 0 0 0-55 54.17c-14.27 51.05 21.19 97.77 68.83 102.53a84.07 84.07 0 0 1-20.85 12.91c-7.57 3.4-10.8 12.47-8.18 20.34l9.9 20c2.87 8.63 12.53 13.49 20.9 9.91 58-24.77 86.25-61.61 86.25-132V112c-.02-51.21-48.4-91.34-101.85-77.09zM352 132a20 20 0 1 1 20-20 20 20 0 0 1-20 20z\"]\n};\nvar faSortUp = {\n prefix: 'fas',\n iconName: 'sort-up',\n icon: [320, 512, [], \"f0de\", \"M279 224H41c-21.4 0-32.1-25.9-17-41L143 64c9.4-9.4 24.6-9.4 33.9 0l119 119c15.2 15.1 4.5 41-16.9 41z\"]\n};\nvar faSpa = {\n prefix: 'fas',\n iconName: 'spa',\n icon: [576, 512, [], \"f5bb\", \"M568.25 192c-29.04.13-135.01 6.16-213.84 83-33.12 29.63-53.36 63.3-66.41 94.86-13.05-31.56-33.29-65.23-66.41-94.86-78.83-76.84-184.8-82.87-213.84-83-4.41-.02-7.79 3.4-7.75 7.82.23 27.92 7.14 126.14 88.77 199.3C172.79 480.94 256 480 288 480s115.19.95 199.23-80.88c81.64-73.17 88.54-171.38 88.77-199.3.04-4.42-3.34-7.84-7.75-7.82zM287.98 302.6c12.82-18.85 27.6-35.78 44.09-50.52 19.09-18.61 39.58-33.3 60.26-45.18-16.44-70.5-51.72-133.05-96.73-172.22-4.11-3.58-11.02-3.58-15.14 0-44.99 39.14-80.27 101.63-96.74 172.07 20.37 11.7 40.5 26.14 59.22 44.39a282.768 282.768 0 0 1 45.04 51.46z\"]\n};\nvar faSpaceShuttle = {\n prefix: 'fas',\n iconName: 'space-shuttle',\n icon: [640, 512, [], \"f197\", \"M592.604 208.244C559.735 192.836 515.777 184 472 184H186.327c-4.952-6.555-10.585-11.978-16.72-16H376C229.157 137.747 219.403 32 96.003 32H96v128H80V32c-26.51 0-48 28.654-48 64v64c-23.197 0-32 10.032-32 24v40c0 13.983 8.819 24 32 24v16c-23.197 0-32 10.032-32 24v40c0 13.983 8.819 24 32 24v64c0 35.346 21.49 64 48 64V352h16v128h.003c123.4 0 133.154-105.747 279.997-136H169.606c6.135-4.022 11.768-9.445 16.72-16H472c43.777 0 87.735-8.836 120.604-24.244C622.282 289.845 640 271.992 640 256s-17.718-33.845-47.396-47.756zM488 296a8 8 0 0 1-8-8v-64a8 8 0 0 1 8-8c31.909 0 31.942 80 0 80z\"]\n};\nvar faSpellCheck = {\n prefix: 'fas',\n iconName: 'spell-check',\n icon: [576, 512, [], \"f891\", \"M272 256h91.36c43.2 0 82-32.2 84.51-75.34a79.82 79.82 0 0 0-25.26-63.07 79.81 79.81 0 0 0 9.06-44.91C427.9 30.57 389.3 0 347 0h-75a16 16 0 0 0-16 16v224a16 16 0 0 0 16 16zm40-200h40a24 24 0 0 1 0 48h-40zm0 96h56a24 24 0 0 1 0 48h-56zM155.12 22.25A32 32 0 0 0 124.64 0H99.36a32 32 0 0 0-30.48 22.25L.59 235.73A16 16 0 0 0 16 256h24.93a16 16 0 0 0 15.42-11.73L68.29 208h87.42l11.94 36.27A16 16 0 0 0 183.07 256H208a16 16 0 0 0 15.42-20.27zM89.37 144L112 75.3l22.63 68.7zm482 132.48l-45.21-45.3a15.88 15.88 0 0 0-22.59 0l-151.5 151.5-55.41-55.5a15.88 15.88 0 0 0-22.59 0l-45.3 45.3a16 16 0 0 0 0 22.59l112 112.21a15.89 15.89 0 0 0 22.6 0l208-208.21a16 16 0 0 0-.02-22.59z\"]\n};\nvar faSpider = {\n prefix: 'fas',\n iconName: 'spider',\n icon: [576, 512, [], \"f717\", \"M151.17 167.35L177.1 176h4.67l5.22-26.12c.72-3.58 1.8-7.58 3.21-11.79l-20.29-40.58 23.8-71.39c2.79-8.38-1.73-17.44-10.12-20.24L168.42.82c-8.38-2.8-17.45 1.73-20.24 10.12l-25.89 77.68a32.04 32.04 0 0 0 1.73 24.43l27.15 54.3zm422.14 182.03l-52.75-79.12a32.002 32.002 0 0 0-26.62-14.25H416l68.99-24.36a32.03 32.03 0 0 0 16.51-12.61l53.6-80.41c4.9-7.35 2.91-17.29-4.44-22.19l-13.31-8.88c-7.35-4.9-17.29-2.91-22.19 4.44l-50.56 75.83L404.1 208H368l-10.37-51.85C355.44 145.18 340.26 96 288 96c-52.26 0-67.44 49.18-69.63 60.15L208 208h-36.1l-60.49-20.17L60.84 112c-4.9-7.35-14.83-9.34-22.19-4.44l-13.31 8.88c-7.35 4.9-9.34 14.83-4.44 22.19l53.6 80.41a32.03 32.03 0 0 0 16.51 12.61L160 256H82.06a32.02 32.02 0 0 0-26.63 14.25L2.69 349.38c-4.9 7.35-2.92 17.29 4.44 22.19l13.31 8.88c7.35 4.9 17.29 2.91 22.19-4.44l48-72h47.06l-60.83 97.33A31.988 31.988 0 0 0 72 418.3V496c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-73.11l74.08-118.53c-1.01 14.05-2.08 28.11-2.08 42.21C192 399.64 232.76 448 288 448s96-48.36 96-101.43c0-14.1-1.08-28.16-2.08-42.21L456 422.89V496c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-77.71c0-6-1.69-11.88-4.86-16.96L438.31 304h47.06l48 72c4.9 7.35 14.84 9.34 22.19 4.44l13.31-8.88c7.36-4.9 9.34-14.83 4.44-22.18zM406.09 97.51l-20.29 40.58c1.41 4.21 2.49 8.21 3.21 11.79l5.22 26.12h4.67l25.93-8.65 27.15-54.3a31.995 31.995 0 0 0 1.73-24.43l-25.89-77.68C425.03 2.56 415.96-1.98 407.58.82l-15.17 5.06c-8.38 2.8-12.91 11.86-10.12 20.24l23.8 71.39z\"]\n};\nvar faSpinner = {\n prefix: 'fas',\n iconName: 'spinner',\n icon: [512, 512, [], \"f110\", \"M304 48c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-48 368c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm208-208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zM96 256c0-26.51-21.49-48-48-48S0 229.49 0 256s21.49 48 48 48 48-21.49 48-48zm12.922 99.078c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.491-48-48-48zm294.156 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.49-48-48-48zM108.922 60.922c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.491-48-48-48z\"]\n};\nvar faSplotch = {\n prefix: 'fas',\n iconName: 'splotch',\n icon: [512, 512, [], \"f5bc\", \"M472.29 195.89l-67.06-22.95c-19.28-6.6-33.54-20.92-38.14-38.3L351.1 74.19c-11.58-43.77-76.57-57.13-109.98-22.62l-46.14 47.67c-13.26 13.71-33.54 20.93-54.2 19.31l-71.88-5.62c-52.05-4.07-86.93 44.88-59.03 82.83l38.54 52.42c11.08 15.07 12.82 33.86 4.64 50.24L24.62 355.4c-20.59 41.25 22.84 84.87 73.49 73.81l69.96-15.28c20.11-4.39 41.45 0 57.07 11.73l54.32 40.83c39.32 29.56 101.04 7.57 104.45-37.22l4.7-61.86c1.35-17.79 12.8-33.86 30.63-42.99l62-31.74c44.88-22.96 39.59-80.17-8.95-96.79z\"]\n};\nvar faSprayCan = {\n prefix: 'fas',\n iconName: 'spray-can',\n icon: [512, 512, [], \"f5bd\", \"M224 32c0-17.67-14.33-32-32-32h-64c-17.67 0-32 14.33-32 32v96h128V32zm256 96c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm-256 32H96c-53.02 0-96 42.98-96 96v224c0 17.67 14.33 32 32 32h256c17.67 0 32-14.33 32-32V256c0-53.02-42.98-96-96-96zm-64 256c-44.18 0-80-35.82-80-80s35.82-80 80-80 80 35.82 80 80-35.82 80-80 80zM480 96c17.67 0 32-14.33 32-32s-14.33-32-32-32-32 14.33-32 32 14.33 32 32 32zm-96 32c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm-96-96c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm96 0c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm96 192c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar faSquare = {\n prefix: 'fas',\n iconName: 'square',\n icon: [448, 512, [], \"f0c8\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faSquareFull = {\n prefix: 'fas',\n iconName: 'square-full',\n icon: [512, 512, [], \"f45c\", \"M512 512H0V0h512v512z\"]\n};\nvar faSquareRootAlt = {\n prefix: 'fas',\n iconName: 'square-root-alt',\n icon: [576, 512, [], \"f698\", \"M571.31 251.31l-22.62-22.62c-6.25-6.25-16.38-6.25-22.63 0L480 274.75l-46.06-46.06c-6.25-6.25-16.38-6.25-22.63 0l-22.62 22.62c-6.25 6.25-6.25 16.38 0 22.63L434.75 320l-46.06 46.06c-6.25 6.25-6.25 16.38 0 22.63l22.62 22.62c6.25 6.25 16.38 6.25 22.63 0L480 365.25l46.06 46.06c6.25 6.25 16.38 6.25 22.63 0l22.62-22.62c6.25-6.25 6.25-16.38 0-22.63L525.25 320l46.06-46.06c6.25-6.25 6.25-16.38 0-22.63zM552 0H307.65c-14.54 0-27.26 9.8-30.95 23.87l-84.79 322.8-58.41-106.1A32.008 32.008 0 0 0 105.47 224H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h43.62l88.88 163.73C168.99 503.5 186.3 512 204.94 512c17.27 0 44.44-9 54.28-41.48L357.03 96H552c13.25 0 24-10.75 24-24V24c0-13.26-10.75-24-24-24z\"]\n};\nvar faStamp = {\n prefix: 'fas',\n iconName: 'stamp',\n icon: [512, 512, [], \"f5bf\", \"M32 512h448v-64H32v64zm384-256h-66.56c-16.26 0-29.44-13.18-29.44-29.44v-9.46c0-27.37 8.88-53.41 21.46-77.72 9.11-17.61 12.9-38.39 9.05-60.42-6.77-38.78-38.47-70.7-77.26-77.45C212.62-9.04 160 37.33 160 96c0 14.16 3.12 27.54 8.69 39.58C182.02 164.43 192 194.7 192 226.49v.07c0 16.26-13.18 29.44-29.44 29.44H96c-53.02 0-96 42.98-96 96v32c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-32c0-53.02-42.98-96-96-96z\"]\n};\nvar faStar = {\n prefix: 'fas',\n iconName: 'star',\n icon: [576, 512, [], \"f005\", \"M259.3 17.8L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0z\"]\n};\nvar faStarAndCrescent = {\n prefix: 'fas',\n iconName: 'star-and-crescent',\n icon: [512, 512, [], \"f699\", \"M340.47 466.36c-1.45 0-6.89.46-9.18.46-116.25 0-210.82-94.57-210.82-210.82S215.04 45.18 331.29 45.18c2.32 0 7.7.46 9.18.46 7.13 0 13.33-5.03 14.75-12.07 1.46-7.25-2.55-14.49-9.47-17.09C316.58 5.54 286.39 0 256 0 114.84 0 0 114.84 0 256s114.84 256 256 256c30.23 0 60.28-5.49 89.32-16.32 5.96-2.02 10.28-7.64 10.28-14.26 0-8.09-6.39-15.06-15.13-15.06zm162.99-252.5l-76.38-11.1-34.16-69.21c-1.83-3.7-5.38-5.55-8.93-5.55s-7.1 1.85-8.93 5.55l-34.16 69.21-76.38 11.1c-8.17 1.18-11.43 11.22-5.52 16.99l55.27 53.87-13.05 76.07c-1.11 6.44 4.01 11.66 9.81 11.66 1.53 0 3.11-.36 4.64-1.17L384 335.37l68.31 35.91c1.53.8 3.11 1.17 4.64 1.17 5.8 0 10.92-5.23 9.81-11.66l-13.05-76.07 55.27-53.87c5.91-5.77 2.65-15.81-5.52-16.99z\"]\n};\nvar faStarHalf = {\n prefix: 'fas',\n iconName: 'star-half',\n icon: [576, 512, [], \"f089\", \"M288 0c-11.4 0-22.8 5.9-28.7 17.8L194 150.2 47.9 171.4c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.1 23 46 46.4 33.7L288 439.6V0z\"]\n};\nvar faStarHalfAlt = {\n prefix: 'fas',\n iconName: 'star-half-alt',\n icon: [536, 512, [], \"f5c0\", \"M508.55 171.51L362.18 150.2 296.77 17.81C290.89 5.98 279.42 0 267.95 0c-11.4 0-22.79 5.9-28.69 17.81l-65.43 132.38-146.38 21.29c-26.25 3.8-36.77 36.09-17.74 54.59l105.89 103-25.06 145.48C86.98 495.33 103.57 512 122.15 512c4.93 0 10-1.17 14.87-3.75l130.95-68.68 130.94 68.7c4.86 2.55 9.92 3.71 14.83 3.71 18.6 0 35.22-16.61 31.66-37.4l-25.03-145.49 105.91-102.98c19.04-18.5 8.52-50.8-17.73-54.6zm-121.74 123.2l-18.12 17.62 4.28 24.88 19.52 113.45-102.13-53.59-22.38-11.74.03-317.19 51.03 103.29 11.18 22.63 25.01 3.64 114.23 16.63-82.65 80.38z\"]\n};\nvar faStarOfDavid = {\n prefix: 'fas',\n iconName: 'star-of-david',\n icon: [464, 512, [], \"f69a\", \"M405.68 256l53.21-89.39C473.3 142.4 455.48 112 426.88 112H319.96l-55.95-93.98C256.86 6.01 244.43 0 232 0s-24.86 6.01-32.01 18.02L144.04 112H37.11c-28.6 0-46.42 30.4-32.01 54.61L58.32 256 5.1 345.39C-9.31 369.6 8.51 400 37.11 400h106.93l55.95 93.98C207.14 505.99 219.57 512 232 512s24.86-6.01 32.01-18.02L319.96 400h106.93c28.6 0 46.42-30.4 32.01-54.61L405.68 256zm-12.78-88l-19.8 33.26L353.3 168h39.6zm-52.39 88l-52.39 88H175.88l-52.39-88 52.38-88h112.25l52.39 88zM232 73.72L254.79 112h-45.57L232 73.72zM71.1 168h39.6l-19.8 33.26L71.1 168zm0 176l19.8-33.26L110.7 344H71.1zM232 438.28L209.21 400h45.57L232 438.28zM353.29 344l19.8-33.26L392.9 344h-39.61z\"]\n};\nvar faStarOfLife = {\n prefix: 'fas',\n iconName: 'star-of-life',\n icon: [480, 512, [], \"f621\", \"M471.99 334.43L336.06 256l135.93-78.43c7.66-4.42 10.28-14.2 5.86-21.86l-32.02-55.43c-4.42-7.65-14.21-10.28-21.87-5.86l-135.93 78.43V16c0-8.84-7.17-16-16.01-16h-64.04c-8.84 0-16.01 7.16-16.01 16v156.86L56.04 94.43c-7.66-4.42-17.45-1.79-21.87 5.86L2.15 155.71c-4.42 7.65-1.8 17.44 5.86 21.86L143.94 256 8.01 334.43c-7.66 4.42-10.28 14.21-5.86 21.86l32.02 55.43c4.42 7.65 14.21 10.27 21.87 5.86l135.93-78.43V496c0 8.84 7.17 16 16.01 16h64.04c8.84 0 16.01-7.16 16.01-16V339.14l135.93 78.43c7.66 4.42 17.45 1.8 21.87-5.86l32.02-55.43c4.42-7.65 1.8-17.43-5.86-21.85z\"]\n};\nvar faStepBackward = {\n prefix: 'fas',\n iconName: 'step-backward',\n icon: [448, 512, [], \"f048\", \"M64 468V44c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12v176.4l195.5-181C352.1 22.3 384 36.6 384 64v384c0 27.4-31.9 41.7-52.5 24.6L136 292.7V468c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12z\"]\n};\nvar faStepForward = {\n prefix: 'fas',\n iconName: 'step-forward',\n icon: [448, 512, [], \"f051\", \"M384 44v424c0 6.6-5.4 12-12 12h-48c-6.6 0-12-5.4-12-12V291.6l-195.5 181C95.9 489.7 64 475.4 64 448V64c0-27.4 31.9-41.7 52.5-24.6L312 219.3V44c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12z\"]\n};\nvar faStethoscope = {\n prefix: 'fas',\n iconName: 'stethoscope',\n icon: [512, 512, [], \"f0f1\", \"M447.1 112c-34.2.5-62.3 28.4-63 62.6-.5 24.3 12.5 45.6 32 56.8V344c0 57.3-50.2 104-112 104-60 0-109.2-44.1-111.9-99.2C265 333.8 320 269.2 320 192V36.6c0-11.4-8.1-21.3-19.3-23.5L237.8.5c-13-2.6-25.6 5.8-28.2 18.8L206.4 35c-2.6 13 5.8 25.6 18.8 28.2l30.7 6.1v121.4c0 52.9-42.2 96.7-95.1 97.2-53.4.5-96.9-42.7-96.9-96V69.4l30.7-6.1c13-2.6 21.4-15.2 18.8-28.2l-3.1-15.7C107.7 6.4 95.1-2 82.1.6L19.3 13C8.1 15.3 0 25.1 0 36.6V192c0 77.3 55.1 142 128.1 156.8C130.7 439.2 208.6 512 304 512c97 0 176-75.4 176-168V231.4c19.1-11.1 32-31.7 32-55.4 0-35.7-29.2-64.5-64.9-64zm.9 80c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faStickyNote = {\n prefix: 'fas',\n iconName: 'sticky-note',\n icon: [448, 512, [], \"f249\", \"M312 320h136V56c0-13.3-10.7-24-24-24H24C10.7 32 0 42.7 0 56v400c0 13.3 10.7 24 24 24h264V344c0-13.2 10.8-24 24-24zm129 55l-98 98c-4.5 4.5-10.6 7-17 7h-6V352h128v6.1c0 6.3-2.5 12.4-7 16.9z\"]\n};\nvar faStop = {\n prefix: 'fas',\n iconName: 'stop',\n icon: [448, 512, [], \"f04d\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faStopCircle = {\n prefix: 'fas',\n iconName: 'stop-circle',\n icon: [512, 512, [], \"f28d\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm96 328c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16v160z\"]\n};\nvar faStopwatch = {\n prefix: 'fas',\n iconName: 'stopwatch',\n icon: [448, 512, [], \"f2f2\", \"M432 304c0 114.9-93.1 208-208 208S16 418.9 16 304c0-104 76.3-190.2 176-205.5V64h-28c-6.6 0-12-5.4-12-12V12c0-6.6 5.4-12 12-12h120c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-28v34.5c37.5 5.8 71.7 21.6 99.7 44.6l27.5-27.5c4.7-4.7 12.3-4.7 17 0l28.3 28.3c4.7 4.7 4.7 12.3 0 17l-29.4 29.4-.6.6C419.7 223.3 432 262.2 432 304zm-176 36V188.5c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12V340c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12z\"]\n};\nvar faStore = {\n prefix: 'fas',\n iconName: 'store',\n icon: [616, 512, [], \"f54e\", \"M602 118.6L537.1 15C531.3 5.7 521 0 510 0H106C95 0 84.7 5.7 78.9 15L14 118.6c-33.5 53.5-3.8 127.9 58.8 136.4 4.5.6 9.1.9 13.7.9 29.6 0 55.8-13 73.8-33.1 18 20.1 44.3 33.1 73.8 33.1 29.6 0 55.8-13 73.8-33.1 18 20.1 44.3 33.1 73.8 33.1 29.6 0 55.8-13 73.8-33.1 18.1 20.1 44.3 33.1 73.8 33.1 4.7 0 9.2-.3 13.7-.9 62.8-8.4 92.6-82.8 59-136.4zM529.5 288c-10 0-19.9-1.5-29.5-3.8V384H116v-99.8c-9.6 2.2-19.5 3.8-29.5 3.8-6 0-12.1-.4-18-1.2-5.6-.8-11.1-2.1-16.4-3.6V480c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32V283.2c-5.4 1.6-10.8 2.9-16.4 3.6-6.1.8-12.1 1.2-18.2 1.2z\"]\n};\nvar faStoreAlt = {\n prefix: 'fas',\n iconName: 'store-alt',\n icon: [640, 512, [], \"f54f\", \"M320 384H128V224H64v256c0 17.7 14.3 32 32 32h256c17.7 0 32-14.3 32-32V224h-64v160zm314.6-241.8l-85.3-128c-6-8.9-16-14.2-26.7-14.2H117.4c-10.7 0-20.7 5.3-26.6 14.2l-85.3 128c-14.2 21.3 1 49.8 26.6 49.8H608c25.5 0 40.7-28.5 26.6-49.8zM512 496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V224h-64v272z\"]\n};\nvar faStream = {\n prefix: 'fas',\n iconName: 'stream',\n icon: [512, 512, [], \"f550\", \"M16 128h416c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16H16C7.16 32 0 39.16 0 48v64c0 8.84 7.16 16 16 16zm480 80H80c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm-64 176H16c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16z\"]\n};\nvar faStreetView = {\n prefix: 'fas',\n iconName: 'street-view',\n icon: [512, 512, [], \"f21d\", \"M367.9 329.76c-4.62 5.3-9.78 10.1-15.9 13.65v22.94c66.52 9.34 112 28.05 112 49.65 0 30.93-93.12 56-208 56S48 446.93 48 416c0-21.6 45.48-40.3 112-49.65v-22.94c-6.12-3.55-11.28-8.35-15.9-13.65C58.87 345.34 0 378.05 0 416c0 53.02 114.62 96 256 96s256-42.98 256-96c0-37.95-58.87-70.66-144.1-86.24zM256 128c35.35 0 64-28.65 64-64S291.35 0 256 0s-64 28.65-64 64 28.65 64 64 64zm-64 192v96c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-96c17.67 0 32-14.33 32-32v-96c0-26.51-21.49-48-48-48h-11.8c-11.07 5.03-23.26 8-36.2 8s-25.13-2.97-36.2-8H208c-26.51 0-48 21.49-48 48v96c0 17.67 14.33 32 32 32z\"]\n};\nvar faStrikethrough = {\n prefix: 'fas',\n iconName: 'strikethrough',\n icon: [512, 512, [], \"f0cc\", \"M496 224H293.9l-87.17-26.83A43.55 43.55 0 0 1 219.55 112h66.79A49.89 49.89 0 0 1 331 139.58a16 16 0 0 0 21.46 7.15l42.94-21.47a16 16 0 0 0 7.16-21.46l-.53-1A128 128 0 0 0 287.51 32h-68a123.68 123.68 0 0 0-123 135.64c2 20.89 10.1 39.83 21.78 56.36H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h480a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-180.24 96A43 43 0 0 1 336 356.45 43.59 43.59 0 0 1 292.45 400h-66.79A49.89 49.89 0 0 1 181 372.42a16 16 0 0 0-21.46-7.15l-42.94 21.47a16 16 0 0 0-7.16 21.46l.53 1A128 128 0 0 0 224.49 480h68a123.68 123.68 0 0 0 123-135.64 114.25 114.25 0 0 0-5.34-24.36z\"]\n};\nvar faStroopwafel = {\n prefix: 'fas',\n iconName: 'stroopwafel',\n icon: [512, 512, [], \"f551\", \"M188.12 210.74L142.86 256l45.25 45.25L233.37 256l-45.25-45.26zm113.13-22.62L256 142.86l-45.25 45.25L256 233.37l45.25-45.25zm-90.5 135.76L256 369.14l45.26-45.26L256 278.63l-45.25 45.25zM256 0C114.62 0 0 114.62 0 256s114.62 256 256 256 256-114.62 256-256S397.38 0 256 0zm186.68 295.6l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-28.29-28.29-45.25 45.25 33.94 33.94 16.97-16.97c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-16.97 16.97 16.97 16.97c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-16.97-16.97-16.97 16.97c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l16.97-16.97-33.94-33.94-45.26 45.26 28.29 28.29c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0L256 414.39l-28.29 28.29c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l28.29-28.29-45.25-45.26-33.94 33.94 16.97 16.97c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-16.97-16.97-16.97 16.97c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l16.97-16.97-16.97-16.97c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l16.97 16.97 33.94-33.94-45.25-45.25-28.29 28.29c-3.12 3.12-8.19 3.12-11.31 0L69.32 295.6c-3.12-3.12-3.12-8.19 0-11.31L97.61 256l-28.29-28.29c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l28.29 28.29 45.25-45.26-33.94-33.94-16.97 16.97c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l16.97-16.97-16.97-16.97c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l16.97 16.97 16.97-16.97c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-16.97 16.97 33.94 33.94 45.26-45.25-28.29-28.29c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0L256 97.61l28.29-28.29c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-28.29 28.29 45.26 45.25 33.94-33.94-16.97-16.97c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l16.97 16.97 16.97-16.97c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-16.97 16.97 16.97 16.97c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-16.97-16.97-33.94 33.94 45.25 45.26 28.29-28.29c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31L414.39 256l28.29 28.28a8.015 8.015 0 0 1 0 11.32zM278.63 256l45.26 45.25L369.14 256l-45.25-45.26L278.63 256z\"]\n};\nvar faSubscript = {\n prefix: 'fas',\n iconName: 'subscript',\n icon: [512, 512, [], \"f12c\", \"M496 448h-16V304a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 400 352h16v96h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM336 64h-67a16 16 0 0 0-13.14 6.87l-79.9 115-79.9-115A16 16 0 0 0 83 64H16A16 16 0 0 0 0 80v48a16 16 0 0 0 16 16h33.48l77.81 112-77.81 112H16a16 16 0 0 0-16 16v48a16 16 0 0 0 16 16h67a16 16 0 0 0 13.14-6.87l79.9-115 79.9 115A16 16 0 0 0 269 448h67a16 16 0 0 0 16-16v-48a16 16 0 0 0-16-16h-33.48l-77.81-112 77.81-112H336a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16z\"]\n};\nvar faSubway = {\n prefix: 'fas',\n iconName: 'subway',\n icon: [448, 512, [], \"f239\", \"M448 96v256c0 51.815-61.624 96-130.022 96l62.98 49.721C386.905 502.417 383.562 512 376 512H72c-7.578 0-10.892-9.594-4.957-14.279L130.022 448C61.82 448 0 403.954 0 352V96C0 42.981 64 0 128 0h192c65 0 128 42.981 128 96zM200 232V120c0-13.255-10.745-24-24-24H72c-13.255 0-24 10.745-24 24v112c0 13.255 10.745 24 24 24h104c13.255 0 24-10.745 24-24zm200 0V120c0-13.255-10.745-24-24-24H272c-13.255 0-24 10.745-24 24v112c0 13.255 10.745 24 24 24h104c13.255 0 24-10.745 24-24zm-48 56c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm-256 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"]\n};\nvar faSuitcase = {\n prefix: 'fas',\n iconName: 'suitcase',\n icon: [512, 512, [], \"f0f2\", \"M128 480h256V80c0-26.5-21.5-48-48-48H176c-26.5 0-48 21.5-48 48v400zm64-384h128v32H192V96zm320 80v256c0 26.5-21.5 48-48 48h-48V128h48c26.5 0 48 21.5 48 48zM96 480H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48h48v352z\"]\n};\nvar faSuitcaseRolling = {\n prefix: 'fas',\n iconName: 'suitcase-rolling',\n icon: [384, 512, [], \"f5c1\", \"M336 160H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h16v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16h128v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16h16c26.51 0 48-21.49 48-48V208c0-26.51-21.49-48-48-48zm-16 216c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h240c4.42 0 8 3.58 8 8v16zm0-96c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h240c4.42 0 8 3.58 8 8v16zM144 48h96v80h48V48c0-26.51-21.49-48-48-48h-96c-26.51 0-48 21.49-48 48v80h48V48z\"]\n};\nvar faSun = {\n prefix: 'fas',\n iconName: 'sun',\n icon: [512, 512, [], \"f185\", \"M256 160c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm246.4 80.5l-94.7-47.3 33.5-100.4c4.5-13.6-8.4-26.5-21.9-21.9l-100.4 33.5-47.4-94.8c-6.4-12.8-24.6-12.8-31 0l-47.3 94.7L92.7 70.8c-13.6-4.5-26.5 8.4-21.9 21.9l33.5 100.4-94.7 47.4c-12.8 6.4-12.8 24.6 0 31l94.7 47.3-33.5 100.5c-4.5 13.6 8.4 26.5 21.9 21.9l100.4-33.5 47.3 94.7c6.4 12.8 24.6 12.8 31 0l47.3-94.7 100.4 33.5c13.6 4.5 26.5-8.4 21.9-21.9l-33.5-100.4 94.7-47.3c13-6.5 13-24.7.2-31.1zm-155.9 106c-49.9 49.9-131.1 49.9-181 0-49.9-49.9-49.9-131.1 0-181 49.9-49.9 131.1-49.9 181 0 49.9 49.9 49.9 131.1 0 181z\"]\n};\nvar faSuperscript = {\n prefix: 'fas',\n iconName: 'superscript',\n icon: [512, 512, [], \"f12b\", \"M496 160h-16V16a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 400 64h16v96h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM336 64h-67a16 16 0 0 0-13.14 6.87l-79.9 115-79.9-115A16 16 0 0 0 83 64H16A16 16 0 0 0 0 80v48a16 16 0 0 0 16 16h33.48l77.81 112-77.81 112H16a16 16 0 0 0-16 16v48a16 16 0 0 0 16 16h67a16 16 0 0 0 13.14-6.87l79.9-115 79.9 115A16 16 0 0 0 269 448h67a16 16 0 0 0 16-16v-48a16 16 0 0 0-16-16h-33.48l-77.81-112 77.81-112H336a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16z\"]\n};\nvar faSurprise = {\n prefix: 'fas',\n iconName: 'surprise',\n icon: [496, 512, [], \"f5c2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM136 208c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm112 208c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm80-176c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faSwatchbook = {\n prefix: 'fas',\n iconName: 'swatchbook',\n icon: [511, 512, [], \"f5c3\", \"M479.06 320H372.29L186.15 506.51c-2.06 2.07-4.49 3.58-6.67 5.49h299.58c17.64 0 31.94-14.33 31.94-32V352c0-17.67-14.3-32-31.94-32zm-44.5-152.9l-90.33-90.51c-12.47-12.5-32.69-12.5-45.17 0l-75.5 75.65V416c0 2.96-.67 5.73-.87 8.64l211.87-212.28c12.47-12.5 12.47-32.77 0-45.26zM191.62 32c0-17.67-14.3-32-31.94-32H31.94C14.3 0 0 14.33 0 32v384c0 53.02 42.9 96 95.81 96s95.81-42.98 95.81-96V32zM95.81 440c-13.23 0-23.95-10.75-23.95-24 0-13.26 10.73-24 23.95-24s23.95 10.74 23.95 24c.01 13.25-10.72 24-23.95 24zm31.94-184H63.88v-64h63.88v64zm0-128H63.88V64h63.88v64z\"]\n};\nvar faSwimmer = {\n prefix: 'fas',\n iconName: 'swimmer',\n icon: [640, 512, [], \"f5c4\", \"M189.61 310.58c3.54 3.26 15.27 9.42 34.39 9.42s30.86-6.16 34.39-9.42c16.02-14.77 34.5-22.58 53.46-22.58h16.3c18.96 0 37.45 7.81 53.46 22.58 3.54 3.26 15.27 9.42 34.39 9.42s30.86-6.16 34.39-9.42c14.86-13.71 31.88-21.12 49.39-22.16l-112.84-80.6 18-12.86c3.64-2.58 8.28-3.52 12.62-2.61l100.35 21.53c25.91 5.53 51.44-10.97 57-36.88 5.55-25.92-10.95-51.44-36.88-57L437.68 98.47c-30.73-6.58-63.02.12-88.56 18.38l-80.02 57.17c-10.38 7.39-19.36 16.44-26.72 26.94L173.75 299c5.47 3.23 10.82 6.93 15.86 11.58zM624 352h-16c-26.04 0-45.8-8.42-56.09-17.9-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C461.8 343.58 442.04 352 416 352s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C269.8 343.58 250.04 352 224 352s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C77.8 343.58 58.04 352 32 352H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16c38.62 0 72.72-12.19 96-31.84 23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84h16c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-512-96c44.18 0 80-35.82 80-80s-35.82-80-80-80-80 35.82-80 80 35.82 80 80 80z\"]\n};\nvar faSwimmingPool = {\n prefix: 'fas',\n iconName: 'swimming-pool',\n icon: [640, 512, [], \"f5c5\", \"M624 416h-16c-26.04 0-45.8-8.42-56.09-17.9-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C461.8 407.58 442.04 416 416 416s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C269.8 407.58 250.04 416 224 416s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C77.8 407.58 58.04 416 32 416H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16c38.62 0 72.72-12.19 96-31.84 23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84h16c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-400-32v-96h192v96c19.12 0 30.86-6.16 34.39-9.42 9.17-8.46 19.2-14.34 29.61-18.07V128c0-17.64 14.36-32 32-32s32 14.36 32 32v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16c0-52.94-43.06-96-96-96s-96 43.06-96 96v96H224v-96c0-17.64 14.36-32 32-32s32 14.36 32 32v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16c0-52.94-43.06-96-96-96s-96 43.06-96 96v228.5c10.41 3.73 20.44 9.62 29.61 18.07 3.53 3.27 15.27 9.43 34.39 9.43z\"]\n};\nvar faSynagogue = {\n prefix: 'fas',\n iconName: 'synagogue',\n icon: [640, 512, [], \"f69b\", \"M70 196.51L6.67 268.29A26.643 26.643 0 0 0 0 285.93V512h128V239.58l-38-43.07c-5.31-6.01-14.69-6.01-20 0zm563.33 71.78L570 196.51c-5.31-6.02-14.69-6.02-20 0l-38 43.07V512h128V285.93c0-6.5-2.37-12.77-6.67-17.64zM339.99 7.01c-11.69-9.35-28.29-9.35-39.98 0l-128 102.4A32.005 32.005 0 0 0 160 134.4V512h96v-92.57c0-31.88 21.78-61.43 53.25-66.55C349.34 346.35 384 377.13 384 416v96h96V134.4c0-9.72-4.42-18.92-12.01-24.99l-128-102.4zm52.07 215.55c1.98 3.15-.29 7.24-4 7.24h-38.94L324 269.79c-1.85 2.95-6.15 2.95-8 0l-25.12-39.98h-38.94c-3.72 0-5.98-4.09-4-7.24l19.2-30.56-19.2-30.56c-1.98-3.15.29-7.24 4-7.24h38.94l25.12-40c1.85-2.95 6.15-2.95 8 0l25.12 39.98h38.95c3.71 0 5.98 4.09 4 7.24L372.87 192l19.19 30.56z\"]\n};\nvar faSync = {\n prefix: 'fas',\n iconName: 'sync',\n icon: [512, 512, [], \"f021\", \"M440.65 12.57l4 82.77A247.16 247.16 0 0 0 255.83 8C134.73 8 33.91 94.92 12.29 209.82A12 12 0 0 0 24.09 224h49.05a12 12 0 0 0 11.67-9.26 175.91 175.91 0 0 1 317-56.94l-101.46-4.86a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12H500a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12h-47.37a12 12 0 0 0-11.98 12.57zM255.83 432a175.61 175.61 0 0 1-146-77.8l101.8 4.87a12 12 0 0 0 12.57-12v-47.4a12 12 0 0 0-12-12H12a12 12 0 0 0-12 12V500a12 12 0 0 0 12 12h47.35a12 12 0 0 0 12-12.6l-4.15-82.57A247.17 247.17 0 0 0 255.83 504c121.11 0 221.93-86.92 243.55-201.82a12 12 0 0 0-11.8-14.18h-49.05a12 12 0 0 0-11.67 9.26A175.86 175.86 0 0 1 255.83 432z\"]\n};\nvar faSyncAlt = {\n prefix: 'fas',\n iconName: 'sync-alt',\n icon: [512, 512, [], \"f2f1\", \"M370.72 133.28C339.458 104.008 298.888 87.962 255.848 88c-77.458.068-144.328 53.178-162.791 126.85-1.344 5.363-6.122 9.15-11.651 9.15H24.103c-7.498 0-13.194-6.807-11.807-14.176C33.933 94.924 134.813 8 256 8c66.448 0 126.791 26.136 171.315 68.685L463.03 40.97C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.749zM32 296h134.059c21.382 0 32.09 25.851 16.971 40.971l-41.75 41.75c31.262 29.273 71.835 45.319 114.876 45.28 77.418-.07 144.315-53.144 162.787-126.849 1.344-5.363 6.122-9.15 11.651-9.15h57.304c7.498 0 13.194 6.807 11.807 14.176C478.067 417.076 377.187 504 256 504c-66.448 0-126.791-26.136-171.315-68.685L48.97 471.03C33.851 486.149 8 475.441 8 454.059V320c0-13.255 10.745-24 24-24z\"]\n};\nvar faSyringe = {\n prefix: 'fas',\n iconName: 'syringe',\n icon: [512, 512, [], \"f48e\", \"M201.5 174.8l55.7 55.8c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-55.7-55.8-45.3 45.3 55.8 55.8c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0L111 265.2l-26.4 26.4c-17.3 17.3-25.6 41.1-23 65.4l7.1 63.6L2.3 487c-3.1 3.1-3.1 8.2 0 11.3l11.3 11.3c3.1 3.1 8.2 3.1 11.3 0l66.3-66.3 63.6 7.1c23.9 2.6 47.9-5.4 65.4-23l181.9-181.9-135.7-135.7-64.9 65zm308.2-93.3L430.5 2.3c-3.1-3.1-8.2-3.1-11.3 0l-11.3 11.3c-3.1 3.1-3.1 8.2 0 11.3l28.3 28.3-45.3 45.3-56.6-56.6-17-17c-3.1-3.1-8.2-3.1-11.3 0l-33.9 33.9c-3.1 3.1-3.1 8.2 0 11.3l17 17L424.8 223l17 17c3.1 3.1 8.2 3.1 11.3 0l33.9-34c3.1-3.1 3.1-8.2 0-11.3l-73.5-73.5 45.3-45.3 28.3 28.3c3.1 3.1 8.2 3.1 11.3 0l11.3-11.3c3.1-3.2 3.1-8.2 0-11.4z\"]\n};\nvar faTable = {\n prefix: 'fas',\n iconName: 'table',\n icon: [512, 512, [], \"f0ce\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64v-96h160v96zm0-160H64v-96h160v96zm224 160H288v-96h160v96zm0-160H288v-96h160v96z\"]\n};\nvar faTableTennis = {\n prefix: 'fas',\n iconName: 'table-tennis',\n icon: [512, 512, [], \"f45d\", \"M496.2 296.5C527.7 218.7 512 126.2 449 63.1 365.1-21 229-21 145.1 63.1l-56 56.1 211.5 211.5c46.1-62.1 131.5-77.4 195.6-34.2zm-217.9 79.7L57.9 155.9c-27.3 45.3-21.7 105 17.3 144.1l34.5 34.6L6.7 424c-8.6 7.5-9.1 20.7-1 28.8l53.4 53.5c8 8.1 21.2 7.6 28.7-1L177.1 402l35.7 35.7c19.7 19.7 44.6 30.5 70.3 33.3-7.1-17-11-35.6-11-55.1-.1-13.8 2.5-27 6.2-39.7zM416 320c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96z\"]\n};\nvar faTablet = {\n prefix: 'fas',\n iconName: 'tablet',\n icon: [448, 512, [], \"f10a\", \"M400 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM224 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faTabletAlt = {\n prefix: 'fas',\n iconName: 'tablet-alt',\n icon: [448, 512, [], \"f3fa\", \"M400 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM224 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm176-108c0 6.6-5.4 12-12 12H60c-6.6 0-12-5.4-12-12V60c0-6.6 5.4-12 12-12h328c6.6 0 12 5.4 12 12v312z\"]\n};\nvar faTablets = {\n prefix: 'fas',\n iconName: 'tablets',\n icon: [640, 512, [], \"f490\", \"M160 192C78.9 192 12.5 250.5.1 326.7c-.8 4.8 3.3 9.3 8.3 9.3h303.3c5 0 9.1-4.5 8.3-9.3C307.5 250.5 241.1 192 160 192zm151.6 176H8.4c-5 0-9.1 4.5-8.3 9.3C12.5 453.5 78.9 512 160 512s147.5-58.5 159.9-134.7c.8-4.8-3.3-9.3-8.3-9.3zM593.4 46.6c-56.5-56.5-144.2-61.4-206.9-16-4 2.9-4.3 8.9-.8 12.3L597 254.3c3.5 3.5 9.5 3.2 12.3-.8 45.5-62.7 40.6-150.4-15.9-206.9zM363 65.7c-3.5-3.5-9.5-3.2-12.3.8-45.4 62.7-40.5 150.4 15.9 206.9 56.5 56.5 144.2 61.4 206.9 15.9 4-2.9 4.3-8.9.8-12.3L363 65.7z\"]\n};\nvar faTachometerAlt = {\n prefix: 'fas',\n iconName: 'tachometer-alt',\n icon: [576, 512, [], \"f3fd\", \"M288 32C128.94 32 0 160.94 0 320c0 52.8 14.25 102.26 39.06 144.8 5.61 9.62 16.3 15.2 27.44 15.2h443c11.14 0 21.83-5.58 27.44-15.2C561.75 422.26 576 372.8 576 320c0-159.06-128.94-288-288-288zm0 64c14.71 0 26.58 10.13 30.32 23.65-1.11 2.26-2.64 4.23-3.45 6.67l-9.22 27.67c-5.13 3.49-10.97 6.01-17.64 6.01-17.67 0-32-14.33-32-32S270.33 96 288 96zM96 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm48-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm246.77-72.41l-61.33 184C343.13 347.33 352 364.54 352 384c0 11.72-3.38 22.55-8.88 32H232.88c-5.5-9.45-8.88-20.28-8.88-32 0-33.94 26.5-61.43 59.9-63.59l61.34-184.01c4.17-12.56 17.73-19.45 30.36-15.17 12.57 4.19 19.35 17.79 15.17 30.36zm14.66 57.2l15.52-46.55c3.47-1.29 7.13-2.23 11.05-2.23 17.67 0 32 14.33 32 32s-14.33 32-32 32c-11.38-.01-20.89-6.28-26.57-15.22zM480 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faTag = {\n prefix: 'fas',\n iconName: 'tag',\n icon: [512, 512, [], \"f02b\", \"M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"]\n};\nvar faTags = {\n prefix: 'fas',\n iconName: 'tags',\n icon: [640, 512, [], \"f02c\", \"M497.941 225.941L286.059 14.059A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v204.118a48 48 0 0 0 14.059 33.941l211.882 211.882c18.744 18.745 49.136 18.746 67.882 0l204.118-204.118c18.745-18.745 18.745-49.137 0-67.882zM112 160c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm513.941 133.823L421.823 497.941c-18.745 18.745-49.137 18.745-67.882 0l-.36-.36L527.64 323.522c16.999-16.999 26.36-39.6 26.36-63.64s-9.362-46.641-26.36-63.64L331.397 0h48.721a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882z\"]\n};\nvar faTape = {\n prefix: 'fas',\n iconName: 'tape',\n icon: [640, 512, [], \"f4db\", \"M224 192c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zm400 224H380.6c41.5-40.7 67.4-97.3 67.4-160 0-123.7-100.3-224-224-224S0 132.3 0 256s100.3 224 224 224h400c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400-64c-53 0-96-43-96-96s43-96 96-96 96 43 96 96-43 96-96 96z\"]\n};\nvar faTasks = {\n prefix: 'fas',\n iconName: 'tasks',\n icon: [512, 512, [], \"f0ae\", \"M139.61 35.5a12 12 0 0 0-17 0L58.93 98.81l-22.7-22.12a12 12 0 0 0-17 0L3.53 92.41a12 12 0 0 0 0 17l47.59 47.4a12.78 12.78 0 0 0 17.61 0l15.59-15.62L156.52 69a12.09 12.09 0 0 0 .09-17zm0 159.19a12 12 0 0 0-17 0l-63.68 63.72-22.7-22.1a12 12 0 0 0-17 0L3.53 252a12 12 0 0 0 0 17L51 316.5a12.77 12.77 0 0 0 17.6 0l15.7-15.69 72.2-72.22a12 12 0 0 0 .09-16.9zM64 368c-26.49 0-48.59 21.5-48.59 48S37.53 464 64 464a48 48 0 0 0 0-96zm432 16H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faTaxi = {\n prefix: 'fas',\n iconName: 'taxi',\n icon: [512, 512, [], \"f1ba\", \"M462 241.64l-22-84.84c-9.6-35.2-41.6-60.8-76.8-60.8H352V64c0-17.67-14.33-32-32-32H192c-17.67 0-32 14.33-32 32v32h-11.2c-35.2 0-67.2 25.6-76.8 60.8l-22 84.84C21.41 248.04 0 273.47 0 304v48c0 23.63 12.95 44.04 32 55.12V448c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h256v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-40.88c19.05-11.09 32-31.5 32-55.12v-48c0-30.53-21.41-55.96-50-62.36zM96 352c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm20.55-112l17.2-66.36c2.23-8.16 9.59-13.64 15.06-13.64h214.4c5.47 0 12.83 5.48 14.85 12.86L395.45 240h-278.9zM416 352c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faTeeth = {\n prefix: 'fas',\n iconName: 'teeth',\n icon: [640, 512, [], \"f62e\", \"M544 0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h448c53.02 0 96-42.98 96-96V96c0-53.02-42.98-96-96-96zM160 368c0 26.51-21.49 48-48 48s-48-21.49-48-48v-64c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v64zm0-128c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-64c0-26.51 21.49-48 48-48s48 21.49 48 48v64zm144 120c0 30.93-25.07 56-56 56s-56-25.07-56-56v-56c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v56zm0-120c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-88c0-30.93 25.07-56 56-56s56 25.07 56 56v88zm144 120c0 30.93-25.07 56-56 56s-56-25.07-56-56v-56c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v56zm0-120c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-88c0-30.93 25.07-56 56-56s56 25.07 56 56v88zm128 128c0 26.51-21.49 48-48 48s-48-21.49-48-48v-64c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v64zm0-128c0 8.84-7.16 16-16 16h-64c-8.84 0-16-7.16-16-16v-64c0-26.51 21.49-48 48-48s48 21.49 48 48v64z\"]\n};\nvar faTeethOpen = {\n prefix: 'fas',\n iconName: 'teeth-open',\n icon: [640, 512, [], \"f62f\", \"M544 0H96C42.98 0 0 42.98 0 96v64c0 35.35 28.66 64 64 64h512c35.34 0 64-28.65 64-64V96c0-53.02-42.98-96-96-96zM160 176c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-32c0-26.51 21.49-48 48-48s48 21.49 48 48v32zm144 0c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-56c0-30.93 25.07-56 56-56s56 25.07 56 56v56zm144 0c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-56c0-30.93 25.07-56 56-56s56 25.07 56 56v56zm128 0c0 8.84-7.16 16-16 16h-64c-8.84 0-16-7.16-16-16v-32c0-26.51 21.49-48 48-48s48 21.49 48 48v32zm0 144H64c-35.34 0-64 28.65-64 64v32c0 53.02 42.98 96 96 96h448c53.02 0 96-42.98 96-96v-32c0-35.35-28.66-64-64-64zm-416 80c0 26.51-21.49 48-48 48s-48-21.49-48-48v-32c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v32zm144-8c0 30.93-25.07 56-56 56s-56-25.07-56-56v-24c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v24zm144 0c0 30.93-25.07 56-56 56s-56-25.07-56-56v-24c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v24zm128 8c0 26.51-21.49 48-48 48s-48-21.49-48-48v-32c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v32z\"]\n};\nvar faTemperatureHigh = {\n prefix: 'fas',\n iconName: 'temperature-high',\n icon: [512, 512, [], \"f769\", \"M416 0c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm0 128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm-160-16C256 50.1 205.9 0 144 0S32 50.1 32 112v166.5C12.3 303.2 0 334 0 368c0 79.5 64.5 144 144 144s144-64.5 144-144c0-34-12.3-64.9-32-89.5V112zM144 448c-44.1 0-80-35.9-80-80 0-25.5 12.2-48.9 32-63.8V112c0-26.5 21.5-48 48-48s48 21.5 48 48v192.2c19.8 14.8 32 38.3 32 63.8 0 44.1-35.9 80-80 80zm16-125.1V112c0-8.8-7.2-16-16-16s-16 7.2-16 16v210.9c-18.6 6.6-32 24.2-32 45.1 0 26.5 21.5 48 48 48s48-21.5 48-48c0-20.9-13.4-38.5-32-45.1z\"]\n};\nvar faTemperatureLow = {\n prefix: 'fas',\n iconName: 'temperature-low',\n icon: [512, 512, [], \"f76b\", \"M416 0c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm0 128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm-160-16C256 50.1 205.9 0 144 0S32 50.1 32 112v166.5C12.3 303.2 0 334 0 368c0 79.5 64.5 144 144 144s144-64.5 144-144c0-34-12.3-64.9-32-89.5V112zM144 448c-44.1 0-80-35.9-80-80 0-25.5 12.2-48.9 32-63.8V112c0-26.5 21.5-48 48-48s48 21.5 48 48v192.2c19.8 14.8 32 38.3 32 63.8 0 44.1-35.9 80-80 80zm16-125.1V304c0-8.8-7.2-16-16-16s-16 7.2-16 16v18.9c-18.6 6.6-32 24.2-32 45.1 0 26.5 21.5 48 48 48s48-21.5 48-48c0-20.9-13.4-38.5-32-45.1z\"]\n};\nvar faTenge = {\n prefix: 'fas',\n iconName: 'tenge',\n icon: [384, 512, [], \"f7d7\", \"M372 160H12c-6.6 0-12 5.4-12 12v56c0 6.6 5.4 12 12 12h140v228c0 6.6 5.4 12 12 12h56c6.6 0 12-5.4 12-12V240h140c6.6 0 12-5.4 12-12v-56c0-6.6-5.4-12-12-12zm0-128H12C5.4 32 0 37.4 0 44v56c0 6.6 5.4 12 12 12h360c6.6 0 12-5.4 12-12V44c0-6.6-5.4-12-12-12z\"]\n};\nvar faTerminal = {\n prefix: 'fas',\n iconName: 'terminal',\n icon: [640, 512, [], \"f120\", \"M257.981 272.971L63.638 467.314c-9.373 9.373-24.569 9.373-33.941 0L7.029 444.647c-9.357-9.357-9.375-24.522-.04-33.901L161.011 256 6.99 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L257.981 239.03c9.373 9.372 9.373 24.568 0 33.941zM640 456v-32c0-13.255-10.745-24-24-24H312c-13.255 0-24 10.745-24 24v32c0 13.255 10.745 24 24 24h304c13.255 0 24-10.745 24-24z\"]\n};\nvar faTextHeight = {\n prefix: 'fas',\n iconName: 'text-height',\n icon: [576, 512, [], \"f034\", \"M304 32H16A16 16 0 0 0 0 48v96a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32h56v304H80a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h160a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-40V112h56v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm256 336h-48V144h48c14.31 0 21.33-17.31 11.31-27.31l-80-80a16 16 0 0 0-22.62 0l-80 80C379.36 126 384.36 144 400 144h48v224h-48c-14.31 0-21.32 17.31-11.31 27.31l80 80a16 16 0 0 0 22.62 0l80-80C580.64 386 575.64 368 560 368z\"]\n};\nvar faTextWidth = {\n prefix: 'fas',\n iconName: 'text-width',\n icon: [448, 512, [], \"f035\", \"M432 32H16A16 16 0 0 0 0 48v80a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-16h120v112h-24a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-24V112h120v16a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm-68.69 260.69C354 283.36 336 288.36 336 304v48H112v-48c0-14.31-17.31-21.32-27.31-11.31l-80 80a16 16 0 0 0 0 22.62l80 80C94 484.64 112 479.64 112 464v-48h224v48c0 14.31 17.31 21.33 27.31 11.31l80-80a16 16 0 0 0 0-22.62z\"]\n};\nvar faTh = {\n prefix: 'fas',\n iconName: 'th',\n icon: [512, 512, [], \"f00a\", \"M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zm181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24zm-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zM181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24z\"]\n};\nvar faThLarge = {\n prefix: 'fas',\n iconName: 'th-large',\n icon: [512, 512, [], \"f009\", \"M296 32h192c13.255 0 24 10.745 24 24v160c0 13.255-10.745 24-24 24H296c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24zm-80 0H24C10.745 32 0 42.745 0 56v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zM0 296v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm296 184h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H296c-13.255 0-24 10.745-24 24v160c0 13.255 10.745 24 24 24z\"]\n};\nvar faThList = {\n prefix: 'fas',\n iconName: 'th-list',\n icon: [512, 512, [], \"f00b\", \"M149.333 216v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-80c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zM125.333 32H24C10.745 32 0 42.745 0 56v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zm80 448H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm-24-424v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24zm24 264H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24z\"]\n};\nvar faTheaterMasks = {\n prefix: 'fas',\n iconName: 'theater-masks',\n icon: [640, 512, [], \"f630\", \"M206.86 245.15c-35.88 10.45-59.95 41.2-57.53 74.1 11.4-12.72 28.81-23.7 49.9-30.92l7.63-43.18zM95.81 295L64.08 115.49c-.29-1.62.28-2.62.24-2.65 57.76-32.06 123.12-49.01 189.01-49.01 1.61 0 3.23.17 4.85.19 13.95-13.47 31.73-22.83 51.59-26 18.89-3.02 38.05-4.55 57.18-5.32-9.99-13.95-24.48-24.23-41.77-27C301.27 1.89 277.24 0 253.32 0 176.66 0 101.02 19.42 33.2 57.06 9.03 70.48-3.92 98.48 1.05 126.58l31.73 179.51c14.23 80.52 136.33 142.08 204.45 142.08 3.59 0 6.75-.46 10.01-.8-13.52-17.08-28.94-40.48-39.5-67.58-47.61-12.98-106.06-51.62-111.93-84.79zm97.55-137.46c-.73-4.12-2.23-7.87-4.07-11.4-8.25 8.91-20.67 15.75-35.32 18.32-14.65 2.58-28.67.4-39.48-5.17-.52 3.94-.64 7.98.09 12.1 3.84 21.7 24.58 36.19 46.34 32.37 21.75-3.82 36.28-24.52 32.44-46.22zM606.8 120.9c-88.98-49.38-191.43-67.41-291.98-51.35-27.31 4.36-49.08 26.26-54.04 54.36l-31.73 179.51c-15.39 87.05 95.28 196.27 158.31 207.35 63.03 11.09 204.47-53.79 219.86-140.84l31.73-179.51c4.97-28.11-7.98-56.11-32.15-69.52zm-273.24 96.8c3.84-21.7 24.58-36.19 46.34-32.36 21.76 3.83 36.28 24.52 32.45 46.22-.73 4.12-2.23 7.87-4.07 11.4-8.25-8.91-20.67-15.75-35.32-18.32-14.65-2.58-28.67-.4-39.48 5.17-.53-3.95-.65-7.99.08-12.11zm70.47 198.76c-55.68-9.79-93.52-59.27-89.04-112.9 20.6 25.54 56.21 46.17 99.49 53.78 43.28 7.61 83.82.37 111.93-16.6-14.18 51.94-66.71 85.51-122.38 75.72zm130.3-151.34c-8.25-8.91-20.68-15.75-35.33-18.32-14.65-2.58-28.67-.4-39.48 5.17-.52-3.94-.64-7.98.09-12.1 3.84-21.7 24.58-36.19 46.34-32.37 21.75 3.83 36.28 24.52 32.45 46.22-.73 4.13-2.23 7.88-4.07 11.4z\"]\n};\nvar faThermometer = {\n prefix: 'fas',\n iconName: 'thermometer',\n icon: [512, 512, [], \"f491\", \"M476.8 20.4c-37.5-30.7-95.5-26.3-131.9 10.2l-45.7 46 50.5 50.5c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-50.4-50.5-45.1 45.4 50.3 50.4c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0L209 167.4l-45.1 45.4L214 263c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-50.1-50.2L96 281.1V382L7 471c-9.4 9.4-9.4 24.6 0 33.9 9.4 9.4 24.6 9.4 33.9 0l89-89h99.9L484 162.6c34.9-34.9 42.2-101.5-7.2-142.2z\"]\n};\nvar faThermometerEmpty = {\n prefix: 'fas',\n iconName: 'thermometer-empty',\n icon: [256, 512, [], \"f2cb\", \"M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.346 28.654-64 64-64s64 28.654 64 64zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThermometerFull = {\n prefix: 'fas',\n iconName: 'thermometer-full',\n icon: [256, 512, [], \"f2c7\", \"M224 96c0-53.019-42.981-96-96-96S32 42.981 32 96v203.347C12.225 321.756.166 351.136.002 383.333c-.359 70.303 56.787 128.176 127.089 128.664.299.002.61.003.909.003 70.698 0 128-57.304 128-128 0-32.459-12.088-62.09-32-84.653V96zm-96 368l-.576-.002c-43.86-.304-79.647-36.544-79.423-80.42.173-33.98 19.266-51.652 31.999-66.08V96c0-26.467 21.533-48 48-48s48 21.533 48 48v221.498c12.63 14.312 32 32.164 32 66.502 0 44.112-35.888 80-80 80zm64-80c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V96c0-17.673 14.327-32 32-32s32 14.327 32 32v232.583c19.124 11.068 32 31.732 32 55.417z\"]\n};\nvar faThermometerHalf = {\n prefix: 'fas',\n iconName: 'thermometer-half',\n icon: [256, 512, [], \"f2c9\", \"M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V224c0-17.673 14.327-32 32-32s32 14.327 32 32v104.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThermometerQuarter = {\n prefix: 'fas',\n iconName: 'thermometer-quarter',\n icon: [256, 512, [], \"f2ca\", \"M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V288c0-17.673 14.327-32 32-32s32 14.327 32 32v40.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThermometerThreeQuarters = {\n prefix: 'fas',\n iconName: 'thermometer-three-quarters',\n icon: [256, 512, [], \"f2c8\", \"M192 384c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64 0-23.685 12.876-44.349 32-55.417V160c0-17.673 14.327-32 32-32s32 14.327 32 32v168.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThumbsDown = {\n prefix: 'fas',\n iconName: 'thumbs-down',\n icon: [512, 512, [], \"f165\", \"M0 56v240c0 13.255 10.745 24 24 24h80c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56zm40 200c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24zm272 256c-20.183 0-29.485-39.293-33.931-57.795-5.206-21.666-10.589-44.07-25.393-58.902-32.469-32.524-49.503-73.967-89.117-113.111a11.98 11.98 0 0 1-3.558-8.521V59.901c0-6.541 5.243-11.878 11.783-11.998 15.831-.29 36.694-9.079 52.651-16.178C256.189 17.598 295.709.017 343.995 0h2.844c42.777 0 93.363.413 113.774 29.737 8.392 12.057 10.446 27.034 6.148 44.632 16.312 17.053 25.063 48.863 16.382 74.757 17.544 23.432 19.143 56.132 9.308 79.469l.11.11c11.893 11.949 19.523 31.259 19.439 49.197-.156 30.352-26.157 58.098-59.553 58.098H350.723C358.03 364.34 384 388.132 384 430.548 384 504 336 512 312 512z\"]\n};\nvar faThumbsUp = {\n prefix: 'fas',\n iconName: 'thumbs-up',\n icon: [512, 512, [], \"f164\", \"M104 224H24c-13.255 0-24 10.745-24 24v240c0 13.255 10.745 24 24 24h80c13.255 0 24-10.745 24-24V248c0-13.255-10.745-24-24-24zM64 472c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zM384 81.452c0 42.416-25.97 66.208-33.277 94.548h101.723c33.397 0 59.397 27.746 59.553 58.098.084 17.938-7.546 37.249-19.439 49.197l-.11.11c9.836 23.337 8.237 56.037-9.308 79.469 8.681 25.895-.069 57.704-16.382 74.757 4.298 17.598 2.244 32.575-6.148 44.632C440.202 511.587 389.616 512 346.839 512l-2.845-.001c-48.287-.017-87.806-17.598-119.56-31.725-15.957-7.099-36.821-15.887-52.651-16.178-6.54-.12-11.783-5.457-11.783-11.998v-213.77c0-3.2 1.282-6.271 3.558-8.521 39.614-39.144 56.648-80.587 89.117-113.111 14.804-14.832 20.188-37.236 25.393-58.902C282.515 39.293 291.817 0 312 0c24 0 72 8 72 81.452z\"]\n};\nvar faThumbtack = {\n prefix: 'fas',\n iconName: 'thumbtack',\n icon: [384, 512, [], \"f08d\", \"M298.028 214.267L285.793 96H328c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H56C42.745 0 32 10.745 32 24v48c0 13.255 10.745 24 24 24h42.207L85.972 214.267C37.465 236.82 0 277.261 0 328c0 13.255 10.745 24 24 24h136v104.007c0 1.242.289 2.467.845 3.578l24 48c2.941 5.882 11.364 5.893 14.311 0l24-48a8.008 8.008 0 0 0 .845-3.578V352h136c13.255 0 24-10.745 24-24-.001-51.183-37.983-91.42-85.973-113.733z\"]\n};\nvar faTicketAlt = {\n prefix: 'fas',\n iconName: 'ticket-alt',\n icon: [576, 512, [], \"f3ff\", \"M128 160h320v192H128V160zm400 96c0 26.51 21.49 48 48 48v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c26.51 0 48-21.49 48-48s-21.49-48-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v96c-26.51 0-48 21.49-48 48zm-48-104c0-13.255-10.745-24-24-24H120c-13.255 0-24 10.745-24 24v208c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V152z\"]\n};\nvar faTimes = {\n prefix: 'fas',\n iconName: 'times',\n icon: [352, 512, [], \"f00d\", \"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z\"]\n};\nvar faTimesCircle = {\n prefix: 'fas',\n iconName: 'times-circle',\n icon: [512, 512, [], \"f057\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z\"]\n};\nvar faTint = {\n prefix: 'fas',\n iconName: 'tint',\n icon: [352, 512, [], \"f043\", \"M205.22 22.09c-7.94-28.78-49.44-30.12-58.44 0C100.01 179.85 0 222.72 0 333.91 0 432.35 78.72 512 176 512s176-79.65 176-178.09c0-111.75-99.79-153.34-146.78-311.82zM176 448c-61.75 0-112-50.25-112-112 0-8.84 7.16-16 16-16s16 7.16 16 16c0 44.11 35.89 80 80 80 8.84 0 16 7.16 16 16s-7.16 16-16 16z\"]\n};\nvar faTintSlash = {\n prefix: 'fas',\n iconName: 'tint-slash',\n icon: [640, 512, [], \"f5c7\", \"M633.82 458.1L494.97 350.78c.52-5.57 1.03-11.16 1.03-16.87 0-111.76-99.79-153.34-146.78-311.82-7.94-28.78-49.44-30.12-58.44 0-15.52 52.34-36.87 91.96-58.49 125.68L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM144 333.91C144 432.35 222.72 512 320 512c44.71 0 85.37-16.96 116.4-44.7L162.72 255.78c-11.41 23.5-18.72 48.35-18.72 78.13z\"]\n};\nvar faTired = {\n prefix: 'fas',\n iconName: 'tired',\n icon: [496, 512, [], \"f5c8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm33.8 189.7l80-48c11.6-6.9 24 7.7 15.4 18L343.6 208l33.6 40.3c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.7-4.7-7.7-15.9 0-20.6zm-163-30c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.8 4.7 7.8 15.9 0 20.6l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3zM248 288c51.9 0 115.3 43.8 123.2 106.7 1.7 13.6-8 24.6-17.7 20.4-25.9-11.1-64.4-17.4-105.5-17.4s-79.6 6.3-105.5 17.4c-9.8 4.2-19.4-7-17.7-20.4C132.7 331.8 196.1 288 248 288z\"]\n};\nvar faToggleOff = {\n prefix: 'fas',\n iconName: 'toggle-off',\n icon: [576, 512, [], \"f204\", \"M384 64H192C85.961 64 0 149.961 0 256s85.961 192 192 192h192c106.039 0 192-85.961 192-192S490.039 64 384 64zM64 256c0-70.741 57.249-128 128-128 70.741 0 128 57.249 128 128 0 70.741-57.249 128-128 128-70.741 0-128-57.249-128-128zm320 128h-48.905c65.217-72.858 65.236-183.12 0-256H384c70.741 0 128 57.249 128 128 0 70.74-57.249 128-128 128z\"]\n};\nvar faToggleOn = {\n prefix: 'fas',\n iconName: 'toggle-on',\n icon: [576, 512, [], \"f205\", \"M384 64H192C86 64 0 150 0 256s86 192 192 192h192c106 0 192-86 192-192S490 64 384 64zm0 320c-70.8 0-128-57.3-128-128 0-70.8 57.3-128 128-128 70.8 0 128 57.3 128 128 0 70.8-57.3 128-128 128z\"]\n};\nvar faToilet = {\n prefix: 'fas',\n iconName: 'toilet',\n icon: [384, 512, [], \"f7d8\", \"M368 48c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16H16C7.2 0 0 7.2 0 16v16c0 8.8 7.2 16 16 16h16v156.7C11.8 214.8 0 226.9 0 240c0 67.2 34.6 126.2 86.8 160.5l-21.4 70.2C59.1 491.2 74.5 512 96 512h192c21.5 0 36.9-20.8 30.6-41.3l-21.4-70.2C349.4 366.2 384 307.2 384 240c0-13.1-11.8-25.2-32-35.3V48h16zM80 72c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H88c-4.4 0-8-3.6-8-8V72zm112 200c-77.1 0-139.6-14.3-139.6-32s62.5-32 139.6-32 139.6 14.3 139.6 32-62.5 32-139.6 32z\"]\n};\nvar faToiletPaper = {\n prefix: 'fas',\n iconName: 'toilet-paper',\n icon: [576, 512, [], \"f71e\", \"M128 0C74.98 0 32 85.96 32 192v172.07c0 41.12-9.8 62.77-31.17 126.87C-2.62 501.3 5.09 512 16.01 512h280.92c13.77 0 26-8.81 30.36-21.88 12.83-38.48 24.71-72.4 24.71-126.05V192c0-83.6 23.67-153.52 60.44-192H128zM96 224c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm64 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm64 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm64 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zM480 0c-53.02 0-96 85.96-96 192s42.98 192 96 192 96-85.96 96-192S533.02 0 480 0zm0 256c-17.67 0-32-28.65-32-64s14.33-64 32-64 32 28.65 32 64-14.33 64-32 64z\"]\n};\nvar faToolbox = {\n prefix: 'fas',\n iconName: 'toolbox',\n icon: [512, 512, [], \"f552\", \"M502.63 214.63l-45.25-45.25c-6-6-14.14-9.37-22.63-9.37H384V80c0-26.51-21.49-48-48-48H176c-26.51 0-48 21.49-48 48v80H77.25c-8.49 0-16.62 3.37-22.63 9.37L9.37 214.63c-6 6-9.37 14.14-9.37 22.63V320h128v-16c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v16h128v-16c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v16h128v-82.75c0-8.48-3.37-16.62-9.37-22.62zM320 160H192V96h128v64zm64 208c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-16H192v16c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-16H0v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96H384v16z\"]\n};\nvar faTools = {\n prefix: 'fas',\n iconName: 'tools',\n icon: [512, 512, [], \"f7d9\", \"M501.1 395.7L384 278.6c-23.1-23.1-57.6-27.6-85.4-13.9L192 158.1V96L64 0 0 64l96 128h62.1l106.6 106.6c-13.6 27.8-9.2 62.3 13.9 85.4l117.1 117.1c14.6 14.6 38.2 14.6 52.7 0l52.7-52.7c14.5-14.6 14.5-38.2 0-52.7zM331.7 225c28.3 0 54.9 11 74.9 31l19.4 19.4c15.8-6.9 30.8-16.5 43.8-29.5 37.1-37.1 49.7-89.3 37.9-136.7-2.2-9-13.5-12.1-20.1-5.5l-74.4 74.4-67.9-11.3L334 98.9l74.4-74.4c6.6-6.6 3.4-17.9-5.7-20.2-47.4-11.7-99.6.9-136.6 37.9-28.5 28.5-41.9 66.1-41.2 103.6l82.1 82.1c8.1-1.9 16.5-2.9 24.7-2.9zm-103.9 82l-56.7-56.7L18.7 402.8c-25 25-25 65.5 0 90.5s65.5 25 90.5 0l123.6-123.6c-7.6-19.9-9.9-41.6-5-62.7zM64 472c-13.2 0-24-10.8-24-24 0-13.3 10.7-24 24-24s24 10.7 24 24c0 13.2-10.7 24-24 24z\"]\n};\nvar faTooth = {\n prefix: 'fas',\n iconName: 'tooth',\n icon: [448, 512, [], \"f5c9\", \"M443.98 96.25c-11.01-45.22-47.11-82.06-92.01-93.72-32.19-8.36-63 5.1-89.14 24.33-3.25 2.39-6.96 3.73-10.5 5.48l28.32 18.21c7.42 4.77 9.58 14.67 4.8 22.11-4.46 6.95-14.27 9.86-22.11 4.8L162.83 12.84c-20.7-10.85-43.38-16.4-66.81-10.31-44.9 11.67-81 48.5-92.01 93.72-10.13 41.62-.42 80.81 21.5 110.43 23.36 31.57 32.68 68.66 36.29 107.35 4.4 47.16 10.33 94.16 20.94 140.32l7.8 33.95c3.19 13.87 15.49 23.7 29.67 23.7 13.97 0 26.15-9.55 29.54-23.16l34.47-138.42c4.56-18.32 20.96-31.16 39.76-31.16s35.2 12.85 39.76 31.16l34.47 138.42c3.39 13.61 15.57 23.16 29.54 23.16 14.18 0 26.48-9.83 29.67-23.7l7.8-33.95c10.61-46.15 16.53-93.16 20.94-140.32 3.61-38.7 12.93-75.78 36.29-107.35 21.95-29.61 31.66-68.8 21.53-110.43z\"]\n};\nvar faTorah = {\n prefix: 'fas',\n iconName: 'torah',\n icon: [640, 512, [], \"f6a0\", \"M320.05 366.48l17.72-29.64h-35.46zm99.21-166H382.4l18.46 30.82zM48 0C21.49 0 0 14.33 0 32v448c0 17.67 21.49 32 48 32s48-14.33 48-32V32C96 14.33 74.51 0 48 0zm172.74 311.5h36.85l-18.46-30.82zm161.71 0h36.86l-18.45-30.8zM128 464h384V48H128zm66.77-278.13a21.22 21.22 0 0 1 18.48-10.71h59.45l29.13-48.71a21.13 21.13 0 0 1 18.22-10.37A20.76 20.76 0 0 1 338 126.29l29.25 48.86h59.52a21.12 21.12 0 0 1 18.1 32L415.63 256 445 305a20.69 20.69 0 0 1 .24 21.12 21.25 21.25 0 0 1-18.48 10.72h-59.47l-29.13 48.7a21.13 21.13 0 0 1-18.16 10.4 20.79 20.79 0 0 1-18-10.22l-29.25-48.88h-59.5a21.11 21.11 0 0 1-18.1-32L224.36 256 195 207a20.7 20.7 0 0 1-.23-21.13zM592 0c-26.51 0-48 14.33-48 32v448c0 17.67 21.49 32 48 32s48-14.33 48-32V32c0-17.67-21.49-32-48-32zM320 145.53l-17.78 29.62h35.46zm-62.45 55h-36.81l18.44 30.8zm29.58 111h65.79L386.09 256l-33.23-55.52h-65.79L253.9 256z\"]\n};\nvar faToriiGate = {\n prefix: 'fas',\n iconName: 'torii-gate',\n icon: [512, 512, [], \"f6a1\", \"M376.45 32h-240.9A303.17 303.17 0 0 1 0 0v96c0 17.67 14.33 32 32 32h32v64H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h48v240c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V256h256v240c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V256h48c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16h-48v-64h32c17.67 0 32-14.33 32-32V0a303.17 303.17 0 0 1-135.55 32zM128 128h96v64h-96v-64zm256 64h-96v-64h96v64z\"]\n};\nvar faTractor = {\n prefix: 'fas',\n iconName: 'tractor',\n icon: [640, 512, [], \"f722\", \"M528 336c-48.6 0-88 39.4-88 88s39.4 88 88 88 88-39.4 88-88-39.4-88-88-88zm0 112c-13.23 0-24-10.77-24-24s10.77-24 24-24 24 10.77 24 24-10.77 24-24 24zm80-288h-64v-40.2c0-14.12 4.7-27.76 13.15-38.84 4.42-5.8 3.55-14.06-1.32-19.49L534.2 37.3c-6.66-7.45-18.32-6.92-24.7.78C490.58 60.9 480 89.81 480 119.8V160H377.67L321.58 29.14A47.914 47.914 0 0 0 277.45 0H144c-26.47 0-48 21.53-48 48v146.52c-8.63-6.73-20.96-6.46-28.89 1.47L36 227.1c-8.59 8.59-8.59 22.52 0 31.11l5.06 5.06c-4.99 9.26-8.96 18.82-11.91 28.72H22c-12.15 0-22 9.85-22 22v44c0 12.15 9.85 22 22 22h7.14c2.96 9.91 6.92 19.46 11.91 28.73l-5.06 5.06c-8.59 8.59-8.59 22.52 0 31.11L67.1 476c8.59 8.59 22.52 8.59 31.11 0l5.06-5.06c9.26 4.99 18.82 8.96 28.72 11.91V490c0 12.15 9.85 22 22 22h44c12.15 0 22-9.85 22-22v-7.14c9.9-2.95 19.46-6.92 28.72-11.91l5.06 5.06c8.59 8.59 22.52 8.59 31.11 0l31.11-31.11c8.59-8.59 8.59-22.52 0-31.11l-5.06-5.06c4.99-9.26 8.96-18.82 11.91-28.72H330c12.15 0 22-9.85 22-22v-6h80.54c21.91-28.99 56.32-48 95.46-48 18.64 0 36.07 4.61 51.8 12.2l50.82-50.82c6-6 9.37-14.14 9.37-22.63V192c.01-17.67-14.32-32-31.99-32zM176 416c-44.18 0-80-35.82-80-80s35.82-80 80-80 80 35.82 80 80-35.82 80-80 80zm22-256h-38V64h106.89l41.15 96H198z\"]\n};\nvar faTrademark = {\n prefix: 'fas',\n iconName: 'trademark',\n icon: [640, 512, [], \"f25c\", \"M260.6 96H12c-6.6 0-12 5.4-12 12v43.1c0 6.6 5.4 12 12 12h85.1V404c0 6.6 5.4 12 12 12h54.3c6.6 0 12-5.4 12-12V163.1h85.1c6.6 0 12-5.4 12-12V108c.1-6.6-5.3-12-11.9-12zM640 403l-24-296c-.5-6.2-5.7-11-12-11h-65.4c-5.1 0-9.7 3.3-11.3 8.1l-43.8 127.1c-7.2 20.6-16.1 52.8-16.1 52.8h-.9s-8.9-32.2-16.1-52.8l-43.8-127.1c-1.7-4.8-6.2-8.1-11.3-8.1h-65.4c-6.2 0-11.4 4.8-12 11l-24.4 296c-.6 7 4.9 13 12 13H360c6.3 0 11.5-4.9 12-11.2l9.1-132.9c1.8-24.2 0-53.7 0-53.7h.9s10.7 33.6 17.9 53.7l30.7 84.7c1.7 4.7 6.2 7.9 11.3 7.9h50.3c5.1 0 9.6-3.2 11.3-7.9l30.7-84.7c7.2-20.1 17.9-53.7 17.9-53.7h.9s-1.8 29.5 0 53.7l9.1 132.9c.4 6.3 5.7 11.2 12 11.2H628c7 0 12.5-6 12-13z\"]\n};\nvar faTrafficLight = {\n prefix: 'fas',\n iconName: 'traffic-light',\n icon: [384, 512, [], \"f637\", \"M384 192h-64v-37.88c37.2-13.22 64-48.38 64-90.12h-64V32c0-17.67-14.33-32-32-32H96C78.33 0 64 14.33 64 32v32H0c0 41.74 26.8 76.9 64 90.12V192H0c0 41.74 26.8 76.9 64 90.12V320H0c0 42.84 28.25 78.69 66.99 91.05C79.42 468.72 130.6 512 192 512s112.58-43.28 125.01-100.95C355.75 398.69 384 362.84 384 320h-64v-37.88c37.2-13.22 64-48.38 64-90.12zM192 416c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm0-128c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm0-128c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48z\"]\n};\nvar faTrain = {\n prefix: 'fas',\n iconName: 'train',\n icon: [448, 512, [], \"f238\", \"M448 96v256c0 51.815-61.624 96-130.022 96l62.98 49.721C386.905 502.417 383.562 512 376 512H72c-7.578 0-10.892-9.594-4.957-14.279L130.022 448C61.82 448 0 403.954 0 352V96C0 42.981 64 0 128 0h192c65 0 128 42.981 128 96zm-48 136V120c0-13.255-10.745-24-24-24H72c-13.255 0-24 10.745-24 24v112c0 13.255 10.745 24 24 24h304c13.255 0 24-10.745 24-24zm-176 64c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56z\"]\n};\nvar faTram = {\n prefix: 'fas',\n iconName: 'tram',\n icon: [512, 512, [], \"f7da\", \"M288 64c17.7 0 32-14.3 32-32S305.7 0 288 0s-32 14.3-32 32 14.3 32 32 32zm223.5-12.1c-2.3-8.6-11-13.6-19.6-11.3l-480 128c-8.5 2.3-13.6 11-11.3 19.6C2.5 195.3 8.9 200 16 200c1.4 0 2.8-.2 4.1-.5L240 140.8V224H64c-17.7 0-32 14.3-32 32v224c0 17.7 14.3 32 32 32h384c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32H272v-91.7l228.1-60.8c8.6-2.3 13.6-11.1 11.4-19.6zM176 384H80v-96h96v96zm160-96h96v96h-96v-96zm-32 0v96h-96v-96h96zM192 96c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faTransgender = {\n prefix: 'fas',\n iconName: 'transgender',\n icon: [384, 512, [], \"f224\", \"M372 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-80.7 80.7C198.5 104.1 172.2 96 144 96 64.5 96 0 160.5 0 240c0 68.5 47.9 125.9 112 140.4V408H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v28c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-28h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-27.6c64.1-14.6 112-71.9 112-140.4 0-28.2-8.1-54.5-22.1-76.7l80.7-80.7 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V12c0-6.6-5.4-12-12-12zM144 320c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faTransgenderAlt = {\n prefix: 'fas',\n iconName: 'transgender-alt',\n icon: [480, 512, [], \"f225\", \"M468 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-80.7 80.7C294.5 104.1 268.2 96 240 96c-28.2 0-54.5 8.1-76.7 22.1l-16.5-16.5 19.8-19.8c4.7-4.7 4.7-12.3 0-17l-28.3-28.3c-4.7-4.7-12.3-4.7-17 0l-19.8 19.8-19-19 16.9-16.9C107.1 12.9 101.7 0 91 0H12C5.4 0 0 5.4 0 12v79c0 10.7 12.9 16 20.5 8.5l16.9-16.9 19 19-19.8 19.8c-4.7 4.7-4.7 12.3 0 17l28.3 28.3c4.7 4.7 12.3 4.7 17 0l19.8-19.8 16.5 16.5C104.1 185.5 96 211.8 96 240c0 68.5 47.9 125.9 112 140.4V408h-36c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v28c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-28h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-27.6c64.1-14.6 112-71.9 112-140.4 0-28.2-8.1-54.5-22.1-76.7l80.7-80.7 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V12c0-6.6-5.4-12-12-12zM240 320c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faTrash = {\n prefix: 'fas',\n iconName: 'trash',\n icon: [448, 512, [], \"f1f8\", \"M432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zM53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32z\"]\n};\nvar faTrashAlt = {\n prefix: 'fas',\n iconName: 'trash-alt',\n icon: [448, 512, [], \"f2ed\", \"M32 464a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128H32zm272-256a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zm-96 0a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zm-96 0a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faTrashRestore = {\n prefix: 'fas',\n iconName: 'trash-restore',\n icon: [448, 512, [], \"f829\", \"M53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32zm70.11-175.8l89.38-94.26a15.41 15.41 0 0 1 22.62 0l89.38 94.26c10.08 10.62 2.94 28.8-11.32 28.8H256v112a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V320h-57.37c-14.26 0-21.4-18.18-11.32-28.8zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faTrashRestoreAlt = {\n prefix: 'fas',\n iconName: 'trash-restore-alt',\n icon: [448, 512, [], \"f82a\", \"M32 464a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128H32zm91.31-172.8l89.38-94.26a15.41 15.41 0 0 1 22.62 0l89.38 94.26c10.08 10.62 2.94 28.8-11.32 28.8H256v112a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V320h-57.37c-14.26 0-21.4-18.18-11.32-28.8zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faTree = {\n prefix: 'fas',\n iconName: 'tree',\n icon: [384, 512, [], \"f1bb\", \"M378.31 378.49L298.42 288h30.63c9.01 0 16.98-5 20.78-13.06 3.8-8.04 2.55-17.26-3.28-24.05L268.42 160h28.89c9.1 0 17.3-5.35 20.86-13.61 3.52-8.13 1.86-17.59-4.24-24.08L203.66 4.83c-6.03-6.45-17.28-6.45-23.32 0L70.06 122.31c-6.1 6.49-7.75 15.95-4.24 24.08C69.38 154.65 77.59 160 86.69 160h28.89l-78.14 90.91c-5.81 6.78-7.06 15.99-3.27 24.04C37.97 283 45.93 288 54.95 288h30.63L5.69 378.49c-6 6.79-7.36 16.09-3.56 24.26 3.75 8.05 12 13.25 21.01 13.25H160v24.45l-30.29 48.4c-5.32 10.64 2.42 23.16 14.31 23.16h95.96c11.89 0 19.63-12.52 14.31-23.16L224 440.45V416h136.86c9.01 0 17.26-5.2 21.01-13.25 3.8-8.17 2.44-17.47-3.56-24.26z\"]\n};\nvar faTrophy = {\n prefix: 'fas',\n iconName: 'trophy',\n icon: [576, 512, [], \"f091\", \"M552 64H448V24c0-13.3-10.7-24-24-24H152c-13.3 0-24 10.7-24 24v40H24C10.7 64 0 74.7 0 88v56c0 35.7 22.5 72.4 61.9 100.7 31.5 22.7 69.8 37.1 110 41.7C203.3 338.5 240 360 240 360v72h-48c-35.3 0-64 20.7-64 56v12c0 6.6 5.4 12 12 12h296c6.6 0 12-5.4 12-12v-12c0-35.3-28.7-56-64-56h-48v-72s36.7-21.5 68.1-73.6c40.3-4.6 78.6-19 110-41.7 39.3-28.3 61.9-65 61.9-100.7V88c0-13.3-10.7-24-24-24zM99.3 192.8C74.9 175.2 64 155.6 64 144v-16h64.2c1 32.6 5.8 61.2 12.8 86.2-15.1-5.2-29.2-12.4-41.7-21.4zM512 144c0 16.1-17.7 36.1-35.3 48.8-12.5 9-26.7 16.2-41.8 21.4 7-25 11.8-53.6 12.8-86.2H512v16z\"]\n};\nvar faTruck = {\n prefix: 'fas',\n iconName: 'truck',\n icon: [640, 512, [], \"f0d1\", \"M624 352h-16V243.9c0-12.7-5.1-24.9-14.1-33.9L494 110.1c-9-9-21.2-14.1-33.9-14.1H416V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h16c0 53 43 96 96 96s96-43 96-96h128c0 53 43 96 96 96s96-43 96-96h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM160 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm320 0c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-208H416V144h44.1l99.9 99.9V256z\"]\n};\nvar faTruckLoading = {\n prefix: 'fas',\n iconName: 'truck-loading',\n icon: [640, 512, [], \"f4de\", \"M50.2 375.6c2.3 8.5 11.1 13.6 19.6 11.3l216.4-58c8.5-2.3 13.6-11.1 11.3-19.6l-49.7-185.5c-2.3-8.5-11.1-13.6-19.6-11.3L151 133.3l24.8 92.7-61.8 16.5-24.8-92.7-77.3 20.7C3.4 172.8-1.7 181.6.6 190.1l49.6 185.5zM384 0c-17.7 0-32 14.3-32 32v323.6L5.9 450c-4.3 1.2-6.8 5.6-5.6 9.8l12.6 46.3c1.2 4.3 5.6 6.8 9.8 5.6l393.7-107.4C418.8 464.1 467.6 512 528 512c61.9 0 112-50.1 112-112V0H384zm144 448c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faTruckMonster = {\n prefix: 'fas',\n iconName: 'truck-monster',\n icon: [640, 512, [], \"f63b\", \"M624 224h-16v-64c0-17.67-14.33-32-32-32h-73.6L419.22 24.02A64.025 64.025 0 0 0 369.24 0H256c-17.67 0-32 14.33-32 32v96H48c-8.84 0-16 7.16-16 16v80H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16.72c29.21-38.65 75.1-64 127.28-64s98.07 25.35 127.28 64h65.45c29.21-38.65 75.1-64 127.28-64s98.07 25.35 127.28 64H624c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-336-96V64h81.24l51.2 64H288zm304 224h-5.2c-2.2-7.33-5.07-14.28-8.65-20.89l3.67-3.67c6.25-6.25 6.25-16.38 0-22.63l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-3.67 3.67A110.85 110.85 0 0 0 512 277.2V272c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v5.2c-7.33 2.2-14.28 5.07-20.89 8.65l-3.67-3.67c-6.25-6.25-16.38-6.25-22.63 0l-22.63 22.63c-6.25 6.25-6.25 16.38 0 22.63l3.67 3.67A110.85 110.85 0 0 0 373.2 352H368c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h5.2c2.2 7.33 5.07 14.28 8.65 20.89l-3.67 3.67c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l3.67-3.67c6.61 3.57 13.57 6.45 20.9 8.65v5.2c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-5.2c7.33-2.2 14.28-5.07 20.9-8.65l3.67 3.67c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.25-6.25 6.25-16.38 0-22.63l-3.67-3.67a110.85 110.85 0 0 0 8.65-20.89h5.2c8.84 0 16-7.16 16-16v-32c-.02-8.84-7.18-16-16.02-16zm-112 80c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm-208-80h-5.2c-2.2-7.33-5.07-14.28-8.65-20.89l3.67-3.67c6.25-6.25 6.25-16.38 0-22.63l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-3.67 3.67A110.85 110.85 0 0 0 192 277.2V272c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v5.2c-7.33 2.2-14.28 5.07-20.89 8.65l-3.67-3.67c-6.25-6.25-16.38-6.25-22.63 0L58.18 304.8c-6.25 6.25-6.25 16.38 0 22.63l3.67 3.67a110.85 110.85 0 0 0-8.65 20.89H48c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h5.2c2.2 7.33 5.07 14.28 8.65 20.89l-3.67 3.67c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l3.67-3.67c6.61 3.57 13.57 6.45 20.9 8.65v5.2c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-5.2c7.33-2.2 14.28-5.07 20.9-8.65l3.67 3.67c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.25-6.25 6.25-16.38 0-22.63l-3.67-3.67a110.85 110.85 0 0 0 8.65-20.89h5.2c8.84 0 16-7.16 16-16v-32C288 359.16 280.84 352 272 352zm-112 80c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48z\"]\n};\nvar faTruckMoving = {\n prefix: 'fas',\n iconName: 'truck-moving',\n icon: [640, 512, [], \"f4df\", \"M621.3 237.3l-58.5-58.5c-12-12-28.3-18.7-45.3-18.7H480V64c0-17.7-14.3-32-32-32H32C14.3 32 0 46.3 0 64v336c0 44.2 35.8 80 80 80 26.3 0 49.4-12.9 64-32.4 14.6 19.6 37.7 32.4 64 32.4 44.2 0 80-35.8 80-80 0-5.5-.6-10.8-1.6-16h163.2c-1.1 5.2-1.6 10.5-1.6 16 0 44.2 35.8 80 80 80s80-35.8 80-80c0-5.5-.6-10.8-1.6-16H624c8.8 0 16-7.2 16-16v-85.5c0-17-6.7-33.2-18.7-45.2zM80 432c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zm128 0c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zm272-224h37.5c4.3 0 8.3 1.7 11.3 4.7l43.3 43.3H480v-48zm48 224c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32z\"]\n};\nvar faTruckPickup = {\n prefix: 'fas',\n iconName: 'truck-pickup',\n icon: [640, 512, [], \"f63c\", \"M624 288h-16v-64c0-17.67-14.33-32-32-32h-48L419.22 56.02A64.025 64.025 0 0 0 369.24 32H256c-17.67 0-32 14.33-32 32v128H64c-17.67 0-32 14.33-32 32v64H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h49.61c-.76 5.27-1.61 10.52-1.61 16 0 61.86 50.14 112 112 112s112-50.14 112-112c0-5.48-.85-10.73-1.61-16h67.23c-.76 5.27-1.61 10.52-1.61 16 0 61.86 50.14 112 112 112s112-50.14 112-112c0-5.48-.85-10.73-1.61-16H624c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM288 96h81.24l76.8 96H288V96zM176 416c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48zm288 0c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48z\"]\n};\nvar faTshirt = {\n prefix: 'fas',\n iconName: 'tshirt',\n icon: [640, 512, [], \"f553\", \"M631.2 96.5L436.5 0C416.4 27.8 371.9 47.2 320 47.2S223.6 27.8 203.5 0L8.8 96.5c-7.9 4-11.1 13.6-7.2 21.5l57.2 114.5c4 7.9 13.6 11.1 21.5 7.2l56.6-27.7c10.6-5.2 23 2.5 23 14.4V480c0 17.7 14.3 32 32 32h256c17.7 0 32-14.3 32-32V226.3c0-11.8 12.4-19.6 23-14.4l56.6 27.7c7.9 4 17.5.8 21.5-7.2L638.3 118c4-7.9.8-17.6-7.1-21.5z\"]\n};\nvar faTty = {\n prefix: 'fas',\n iconName: 'tty',\n icon: [512, 512, [], \"f1e4\", \"M5.37 103.822c138.532-138.532 362.936-138.326 501.262 0 6.078 6.078 7.074 15.496 2.583 22.681l-43.214 69.138a18.332 18.332 0 0 1-22.356 7.305l-86.422-34.569a18.335 18.335 0 0 1-11.434-18.846L351.741 90c-62.145-22.454-130.636-21.986-191.483 0l5.953 59.532a18.331 18.331 0 0 1-11.434 18.846l-86.423 34.568a18.334 18.334 0 0 1-22.356-7.305L2.787 126.502a18.333 18.333 0 0 1 2.583-22.68zM96 308v-40c0-6.627-5.373-12-12-12H44c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12H92c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zM96 500v-40c0-6.627-5.373-12-12-12H44c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm288 0v-40c0-6.627-5.373-12-12-12H140c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h232c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12z\"]\n};\nvar faTv = {\n prefix: 'fas',\n iconName: 'tv',\n icon: [640, 512, [], \"f26c\", \"M592 0H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h245.1v32h-160c-17.7 0-32 14.3-32 32s14.3 32 32 32h384c17.7 0 32-14.3 32-32s-14.3-32-32-32h-160v-32H592c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-16 352H64V64h512v288z\"]\n};\nvar faUmbrella = {\n prefix: 'fas',\n iconName: 'umbrella',\n icon: [576, 512, [], \"f0e9\", \"M575.7 280.8C547.1 144.5 437.3 62.6 320 49.9V32c0-17.7-14.3-32-32-32s-32 14.3-32 32v17.9C138.3 62.6 29.5 144.5.3 280.8c-2.2 10.1 8.5 21.3 18.7 11.4 52-55 107.7-52.4 158.6 37 5.3 9.5 14.9 8.6 19.7 0 20.2-35.4 44.9-73.2 90.7-73.2 58.5 0 88.2 68.8 90.7 73.2 4.8 8.6 14.4 9.5 19.7 0 51-89.5 107.1-91.4 158.6-37 10.3 10 20.9-1.3 18.7-11.4zM256 301.7V432c0 8.8-7.2 16-16 16-7.8 0-13.2-5.3-15.1-10.7-5.9-16.7-24.1-25.4-40.8-19.5-16.7 5.9-25.4 24.2-19.5 40.8 11.2 31.9 41.6 53.3 75.4 53.3 44.1 0 80-35.9 80-80V301.6c-9.1-7.9-19.8-13.6-32-13.6-12.3.1-22.4 4.8-32 13.7z\"]\n};\nvar faUmbrellaBeach = {\n prefix: 'fas',\n iconName: 'umbrella-beach',\n icon: [640, 512, [], \"f5ca\", \"M115.38 136.9l102.11 37.18c35.19-81.54 86.21-144.29 139-173.7-95.88-4.89-188.78 36.96-248.53 111.8-6.69 8.4-2.66 21.05 7.42 24.72zm132.25 48.16l238.48 86.83c35.76-121.38 18.7-231.66-42.63-253.98-7.4-2.7-15.13-4-23.09-4-58.02.01-128.27 69.17-172.76 171.15zM521.48 60.5c6.22 16.3 10.83 34.6 13.2 55.19 5.74 49.89-1.42 108.23-18.95 166.98l102.62 37.36c10.09 3.67 21.31-3.43 21.57-14.17 2.32-95.69-41.91-187.44-118.44-245.36zM560 447.98H321.06L386 269.5l-60.14-21.9-72.9 200.37H16c-8.84 0-16 7.16-16 16.01v32.01C0 504.83 7.16 512 16 512h544c8.84 0 16-7.17 16-16.01v-32.01c0-8.84-7.16-16-16-16z\"]\n};\nvar faUnderline = {\n prefix: 'fas',\n iconName: 'underline',\n icon: [448, 512, [], \"f0cd\", \"M32 64h32v160c0 88.22 71.78 160 160 160s160-71.78 160-160V64h32a16 16 0 0 0 16-16V16a16 16 0 0 0-16-16H272a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32v160a80 80 0 0 1-160 0V64h32a16 16 0 0 0 16-16V16a16 16 0 0 0-16-16H32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm400 384H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faUndo = {\n prefix: 'fas',\n iconName: 'undo',\n icon: [512, 512, [], \"f0e2\", \"M212.333 224.333H12c-6.627 0-12-5.373-12-12V12C0 5.373 5.373 0 12 0h48c6.627 0 12 5.373 12 12v78.112C117.773 39.279 184.26 7.47 258.175 8.007c136.906.994 246.448 111.623 246.157 248.532C504.041 393.258 393.12 504 256.333 504c-64.089 0-122.496-24.313-166.51-64.215-5.099-4.622-5.334-12.554-.467-17.42l33.967-33.967c4.474-4.474 11.662-4.717 16.401-.525C170.76 415.336 211.58 432 256.333 432c97.268 0 176-78.716 176-176 0-97.267-78.716-176-176-176-58.496 0-110.28 28.476-142.274 72.333h98.274c6.627 0 12 5.373 12 12v48c0 6.627-5.373 12-12 12z\"]\n};\nvar faUndoAlt = {\n prefix: 'fas',\n iconName: 'undo-alt',\n icon: [512, 512, [], \"f2ea\", \"M255.545 8c-66.269.119-126.438 26.233-170.86 68.685L48.971 40.971C33.851 25.851 8 36.559 8 57.941V192c0 13.255 10.745 24 24 24h134.059c21.382 0 32.09-25.851 16.971-40.971l-41.75-41.75c30.864-28.899 70.801-44.907 113.23-45.273 92.398-.798 170.283 73.977 169.484 169.442C423.236 348.009 349.816 424 256 424c-41.127 0-79.997-14.678-110.63-41.556-4.743-4.161-11.906-3.908-16.368.553L89.34 422.659c-4.872 4.872-4.631 12.815.482 17.433C133.798 479.813 192.074 504 256 504c136.966 0 247.999-111.033 248-247.998C504.001 119.193 392.354 7.755 255.545 8z\"]\n};\nvar faUniversalAccess = {\n prefix: 'fas',\n iconName: 'universal-access',\n icon: [512, 512, [], \"f29a\", \"M256 48c114.953 0 208 93.029 208 208 0 114.953-93.029 208-208 208-114.953 0-208-93.029-208-208 0-114.953 93.029-208 208-208m0-40C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 56C149.961 64 64 149.961 64 256s85.961 192 192 192 192-85.961 192-192S362.039 64 256 64zm0 44c19.882 0 36 16.118 36 36s-16.118 36-36 36-36-16.118-36-36 16.118-36 36-36zm117.741 98.023c-28.712 6.779-55.511 12.748-82.14 15.807.851 101.023 12.306 123.052 25.037 155.621 3.617 9.26-.957 19.698-10.217 23.315-9.261 3.617-19.699-.957-23.316-10.217-8.705-22.308-17.086-40.636-22.261-78.549h-9.686c-5.167 37.851-13.534 56.208-22.262 78.549-3.615 9.255-14.05 13.836-23.315 10.217-9.26-3.617-13.834-14.056-10.217-23.315 12.713-32.541 24.185-54.541 25.037-155.621-26.629-3.058-53.428-9.027-82.141-15.807-8.6-2.031-13.926-10.648-11.895-19.249s10.647-13.926 19.249-11.895c96.686 22.829 124.283 22.783 220.775 0 8.599-2.03 17.218 3.294 19.249 11.895 2.029 8.601-3.297 17.219-11.897 19.249z\"]\n};\nvar faUniversity = {\n prefix: 'fas',\n iconName: 'university',\n icon: [512, 512, [], \"f19c\", \"M496 128v16a8 8 0 0 1-8 8h-24v12c0 6.627-5.373 12-12 12H60c-6.627 0-12-5.373-12-12v-12H24a8 8 0 0 1-8-8v-16a8 8 0 0 1 4.941-7.392l232-88a7.996 7.996 0 0 1 6.118 0l232 88A8 8 0 0 1 496 128zm-24 304H40c-13.255 0-24 10.745-24 24v16a8 8 0 0 0 8 8h464a8 8 0 0 0 8-8v-16c0-13.255-10.745-24-24-24zM96 192v192H60c-6.627 0-12 5.373-12 12v20h416v-20c0-6.627-5.373-12-12-12h-36V192h-64v192h-64V192h-64v192h-64V192H96z\"]\n};\nvar faUnlink = {\n prefix: 'fas',\n iconName: 'unlink',\n icon: [512, 512, [], \"f127\", \"M304.083 405.907c4.686 4.686 4.686 12.284 0 16.971l-44.674 44.674c-59.263 59.262-155.693 59.266-214.961 0-59.264-59.265-59.264-155.696 0-214.96l44.675-44.675c4.686-4.686 12.284-4.686 16.971 0l39.598 39.598c4.686 4.686 4.686 12.284 0 16.971l-44.675 44.674c-28.072 28.073-28.072 73.75 0 101.823 28.072 28.072 73.75 28.073 101.824 0l44.674-44.674c4.686-4.686 12.284-4.686 16.971 0l39.597 39.598zm-56.568-260.216c4.686 4.686 12.284 4.686 16.971 0l44.674-44.674c28.072-28.075 73.75-28.073 101.824 0 28.072 28.073 28.072 73.75 0 101.823l-44.675 44.674c-4.686 4.686-4.686 12.284 0 16.971l39.598 39.598c4.686 4.686 12.284 4.686 16.971 0l44.675-44.675c59.265-59.265 59.265-155.695 0-214.96-59.266-59.264-155.695-59.264-214.961 0l-44.674 44.674c-4.686 4.686-4.686 12.284 0 16.971l39.597 39.598zm234.828 359.28l22.627-22.627c9.373-9.373 9.373-24.569 0-33.941L63.598 7.029c-9.373-9.373-24.569-9.373-33.941 0L7.029 29.657c-9.373 9.373-9.373 24.569 0 33.941l441.373 441.373c9.373 9.372 24.569 9.372 33.941 0z\"]\n};\nvar faUnlock = {\n prefix: 'fas',\n iconName: 'unlock',\n icon: [448, 512, [], \"f09c\", \"M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\"]\n};\nvar faUnlockAlt = {\n prefix: 'fas',\n iconName: 'unlock-alt',\n icon: [448, 512, [], \"f13e\", \"M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zM264 408c0 22.1-17.9 40-40 40s-40-17.9-40-40v-48c0-22.1 17.9-40 40-40s40 17.9 40 40v48z\"]\n};\nvar faUpload = {\n prefix: 'fas',\n iconName: 'upload',\n icon: [512, 512, [], \"f093\", \"M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z\"]\n};\nvar faUser = {\n prefix: 'fas',\n iconName: 'user',\n icon: [448, 512, [], \"f007\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUserAlt = {\n prefix: 'fas',\n iconName: 'user-alt',\n icon: [512, 512, [], \"f406\", \"M256 288c79.5 0 144-64.5 144-144S335.5 0 256 0 112 64.5 112 144s64.5 144 144 144zm128 32h-55.1c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16H128C57.3 320 0 377.3 0 448v16c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48v-16c0-70.7-57.3-128-128-128z\"]\n};\nvar faUserAltSlash = {\n prefix: 'fas',\n iconName: 'user-alt-slash',\n icon: [640, 512, [], \"f4fa\", \"M633.8 458.1L389.6 269.3C433.8 244.7 464 198.1 464 144 464 64.5 399.5 0 320 0c-67.1 0-123 46.1-139 108.2L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3zM198.4 320C124.2 320 64 380.2 64 454.4v9.6c0 26.5 21.5 48 48 48h382.2L245.8 320h-47.4z\"]\n};\nvar faUserAstronaut = {\n prefix: 'fas',\n iconName: 'user-astronaut',\n icon: [448, 512, [], \"f4fb\", \"M64 224h13.5c24.7 56.5 80.9 96 146.5 96s121.8-39.5 146.5-96H384c8.8 0 16-7.2 16-16v-96c0-8.8-7.2-16-16-16h-13.5C345.8 39.5 289.6 0 224 0S102.2 39.5 77.5 96H64c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16zm40-88c0-22.1 21.5-40 48-40h144c26.5 0 48 17.9 48 40v24c0 53-43 96-96 96h-48c-53 0-96-43-96-96v-24zm72 72l12-36 36-12-36-12-12-36-12 36-36 12 36 12 12 36zm151.6 113.4C297.7 340.7 262.2 352 224 352s-73.7-11.3-103.6-30.6C52.9 328.5 0 385 0 454.4v9.6c0 26.5 21.5 48 48 48h80v-64c0-17.7 14.3-32 32-32h128c17.7 0 32 14.3 32 32v64h80c26.5 0 48-21.5 48-48v-9.6c0-69.4-52.9-125.9-120.4-133zM272 448c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm-96 0c-8.8 0-16 7.2-16 16v48h32v-48c0-8.8-7.2-16-16-16z\"]\n};\nvar faUserCheck = {\n prefix: 'fas',\n iconName: 'user-check',\n icon: [640, 512, [], \"f4fc\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4zm323-128.4l-27.8-28.1c-4.6-4.7-12.1-4.7-16.8-.1l-104.8 104-45.5-45.8c-4.6-4.7-12.1-4.7-16.8-.1l-28.1 27.9c-4.7 4.6-4.7 12.1-.1 16.8l81.7 82.3c4.6 4.7 12.1 4.7 16.8.1l141.3-140.2c4.6-4.7 4.7-12.2.1-16.8z\"]\n};\nvar faUserCircle = {\n prefix: 'fas',\n iconName: 'user-circle',\n icon: [496, 512, [], \"f2bd\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 96c48.6 0 88 39.4 88 88s-39.4 88-88 88-88-39.4-88-88 39.4-88 88-88zm0 344c-58.7 0-111.3-26.6-146.5-68.2 18.8-35.4 55.6-59.8 98.5-59.8 2.4 0 4.8.4 7.1 1.1 13 4.2 26.6 6.9 40.9 6.9 14.3 0 28-2.7 40.9-6.9 2.3-.7 4.7-1.1 7.1-1.1 42.9 0 79.7 24.4 98.5 59.8C359.3 421.4 306.7 448 248 448z\"]\n};\nvar faUserClock = {\n prefix: 'fas',\n iconName: 'user-clock',\n icon: [640, 512, [], \"f4fd\", \"M496 224c-79.6 0-144 64.4-144 144s64.4 144 144 144 144-64.4 144-144-64.4-144-144-144zm64 150.3c0 5.3-4.4 9.7-9.7 9.7h-60.6c-5.3 0-9.7-4.4-9.7-9.7v-76.6c0-5.3 4.4-9.7 9.7-9.7h12.6c5.3 0 9.7 4.4 9.7 9.7V352h38.3c5.3 0 9.7 4.4 9.7 9.7v12.6zM320 368c0-27.8 6.7-54.1 18.2-77.5-8-1.5-16.2-2.5-24.6-2.5h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h347.1c-45.3-31.9-75.1-84.5-75.1-144zm-96-112c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128z\"]\n};\nvar faUserCog = {\n prefix: 'fas',\n iconName: 'user-cog',\n icon: [640, 512, [], \"f4fe\", \"M610.5 373.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 400.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm201.2 226.5c-2.3-1.2-4.6-2.6-6.8-3.9l-7.9 4.6c-6 3.4-12.8 5.3-19.6 5.3-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-5.5-17.7 1.9-36.4 17.9-45.7l7.9-4.6c-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-16-9.2-23.4-28-17.9-45.7.9-2.9 2.2-5.8 3.2-8.7-3.8-.3-7.5-1.2-11.4-1.2h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c10.1 0 19.5-3.2 27.2-8.5-1.2-3.8-2-7.7-2-11.8v-9.2z\"]\n};\nvar faUserEdit = {\n prefix: 'fas',\n iconName: 'user-edit',\n icon: [640, 512, [], \"f4ff\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h274.9c-2.4-6.8-3.4-14-2.6-21.3l6.8-60.9 1.2-11.1 7.9-7.9 77.3-77.3c-24.5-27.7-60-45.5-99.9-45.5zm45.3 145.3l-6.8 61c-1.1 10.2 7.5 18.8 17.6 17.6l60.9-6.8 137.9-137.9-71.7-71.7-137.9 137.8zM633 268.9L595.1 231c-9.3-9.3-24.5-9.3-33.8 0l-37.8 37.8-4.1 4.1 71.8 71.7 41.8-41.8c9.3-9.4 9.3-24.5 0-33.9z\"]\n};\nvar faUserFriends = {\n prefix: 'fas',\n iconName: 'user-friends',\n icon: [640, 512, [], \"f500\", \"M192 256c61.9 0 112-50.1 112-112S253.9 32 192 32 80 82.1 80 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C51.6 288 0 339.6 0 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zM480 256c53 0 96-43 96-96s-43-96-96-96-96 43-96 96 43 96 96 96zm48 32h-3.8c-13.9 4.8-28.6 8-44.2 8s-30.3-3.2-44.2-8H432c-20.4 0-39.2 5.9-55.7 15.4 24.4 26.3 39.7 61.2 39.7 99.8v38.4c0 2.2-.5 4.3-.6 6.4H592c26.5 0 48-21.5 48-48 0-61.9-50.1-112-112-112z\"]\n};\nvar faUserGraduate = {\n prefix: 'fas',\n iconName: 'user-graduate',\n icon: [448, 512, [], \"f501\", \"M319.4 320.6L224 416l-95.4-95.4C57.1 323.7 0 382.2 0 454.4v9.6c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-9.6c0-72.2-57.1-130.7-128.6-133.8zM13.6 79.8l6.4 1.5v58.4c-7 4.2-12 11.5-12 20.3 0 8.4 4.6 15.4 11.1 19.7L3.5 242c-1.7 6.9 2.1 14 7.6 14h41.8c5.5 0 9.3-7.1 7.6-14l-15.6-62.3C51.4 175.4 56 168.4 56 160c0-8.8-5-16.1-12-20.3V87.1l66 15.9c-8.6 17.2-14 36.4-14 57 0 70.7 57.3 128 128 128s128-57.3 128-128c0-20.6-5.3-39.8-14-57l96.3-23.2c18.2-4.4 18.2-27.1 0-31.5l-190.4-46c-13-3.1-26.7-3.1-39.7 0L13.6 48.2c-18.1 4.4-18.1 27.2 0 31.6z\"]\n};\nvar faUserInjured = {\n prefix: 'fas',\n iconName: 'user-injured',\n icon: [448, 512, [], \"f728\", \"M277.37 11.98C261.08 4.47 243.11 0 224 0c-53.69 0-99.5 33.13-118.51 80h81.19l90.69-68.02zM342.51 80c-7.9-19.47-20.67-36.2-36.49-49.52L239.99 80h102.52zM224 256c70.69 0 128-57.31 128-128 0-5.48-.95-10.7-1.61-16H97.61c-.67 5.3-1.61 10.52-1.61 16 0 70.69 57.31 128 128 128zM80 299.7V512h128.26l-98.45-221.52A132.835 132.835 0 0 0 80 299.7zM0 464c0 26.51 21.49 48 48 48V320.24C18.88 344.89 0 381.26 0 422.4V464zm256-48h-55.38l42.67 96H256c26.47 0 48-21.53 48-48s-21.53-48-48-48zm57.6-128h-16.71c-22.24 10.18-46.88 16-72.89 16s-50.65-5.82-72.89-16h-7.37l42.67 96H256c44.11 0 80 35.89 80 80 0 18.08-6.26 34.59-16.41 48H400c26.51 0 48-21.49 48-48v-41.6c0-74.23-60.17-134.4-134.4-134.4z\"]\n};\nvar faUserLock = {\n prefix: 'fas',\n iconName: 'user-lock',\n icon: [640, 512, [], \"f502\", \"M224 256A128 128 0 1 0 96 128a128 128 0 0 0 128 128zm96 64a63.08 63.08 0 0 1 8.1-30.5c-4.8-.5-9.5-1.5-14.5-1.5h-16.7a174.08 174.08 0 0 1-145.8 0h-16.7A134.43 134.43 0 0 0 0 422.4V464a48 48 0 0 0 48 48h280.9a63.54 63.54 0 0 1-8.9-32zm288-32h-32v-80a80 80 0 0 0-160 0v80h-32a32 32 0 0 0-32 32v160a32 32 0 0 0 32 32h224a32 32 0 0 0 32-32V320a32 32 0 0 0-32-32zM496 432a32 32 0 1 1 32-32 32 32 0 0 1-32 32zm32-144h-64v-80a32 32 0 0 1 64 0z\"]\n};\nvar faUserMd = {\n prefix: 'fas',\n iconName: 'user-md',\n icon: [448, 512, [], \"f0f0\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zM104 424c0 13.3 10.7 24 24 24s24-10.7 24-24-10.7-24-24-24-24 10.7-24 24zm216-135.4v49c36.5 7.4 64 39.8 64 78.4v41.7c0 7.6-5.4 14.2-12.9 15.7l-32.2 6.4c-4.3.9-8.5-1.9-9.4-6.3l-3.1-15.7c-.9-4.3 1.9-8.6 6.3-9.4l19.3-3.9V416c0-62.8-96-65.1-96 1.9v26.7l19.3 3.9c4.3.9 7.1 5.1 6.3 9.4l-3.1 15.7c-.9 4.3-5.1 7.1-9.4 6.3l-31.2-4.2c-7.9-1.1-13.8-7.8-13.8-15.9V416c0-38.6 27.5-70.9 64-78.4v-45.2c-2.2.7-4.4 1.1-6.6 1.9-18 6.3-37.3 9.8-57.4 9.8s-39.4-3.5-57.4-9.8c-7.4-2.6-14.9-4.2-22.6-5.2v81.6c23.1 6.9 40 28.1 40 53.4 0 30.9-25.1 56-56 56s-56-25.1-56-56c0-25.3 16.9-46.5 40-53.4v-80.4C48.5 301 0 355.8 0 422.4v44.8C0 491.9 20.1 512 44.8 512h358.4c24.7 0 44.8-20.1 44.8-44.8v-44.8c0-72-56.8-130.3-128-133.8z\"]\n};\nvar faUserMinus = {\n prefix: 'fas',\n iconName: 'user-minus',\n icon: [640, 512, [], \"f503\", \"M624 208H432c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h192c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400 48c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUserNinja = {\n prefix: 'fas',\n iconName: 'user-ninja',\n icon: [448, 512, [], \"f504\", \"M325.4 289.2L224 390.6 122.6 289.2C54 295.3 0 352.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-70.2-54-127.1-122.6-133.2zM32 192c27.3 0 51.8-11.5 69.2-29.7 15.1 53.9 64 93.7 122.8 93.7 70.7 0 128-57.3 128-128S294.7 0 224 0c-50.4 0-93.6 29.4-114.5 71.8C92.1 47.8 64 32 32 32c0 33.4 17.1 62.8 43.1 80-26 17.2-43.1 46.6-43.1 80zm144-96h96c17.7 0 32 14.3 32 32H144c0-17.7 14.3-32 32-32z\"]\n};\nvar faUserNurse = {\n prefix: 'fas',\n iconName: 'user-nurse',\n icon: [448, 512, [], \"f82f\", \"M57.78 288h82.36c22.51 19.68 51.62 32 83.86 32s61.35-12.32 83.86-32h82.36a16 16 0 0 0 14.28-23.18c-15.23-29.85-31.28-62.23-42.15-95.54C354.78 146.09 352 121.59 352 97.2V48L224 0 96 48v49.2c0 24.39-2.75 48.89-10.33 72.08C74.78 202.59 58.73 235 43.5 264.82A16 16 0 0 0 57.78 288zM184 71.67a5 5 0 0 1 5-5h21.67V45a5 5 0 0 1 5-5h16.66a5 5 0 0 1 5 5v21.67H259a5 5 0 0 1 5 5v16.66a5 5 0 0 1-5 5h-21.67V115a5 5 0 0 1-5 5h-16.66a5 5 0 0 1-5-5V93.33H189a5 5 0 0 1-5-5zM144 160h160v32a80 80 0 0 1-160 0zm175.41 160L224 415.39 128.59 320C57.1 323.1 0 381.6 0 453.79A58.21 58.21 0 0 0 58.21 512h331.58A58.21 58.21 0 0 0 448 453.79C448 381.6 390.9 323.1 319.41 320z\"]\n};\nvar faUserPlus = {\n prefix: 'fas',\n iconName: 'user-plus',\n icon: [640, 512, [], \"f234\", \"M624 208h-64v-64c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v64h-64c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h64v64c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-64h64c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400 48c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUserSecret = {\n prefix: 'fas',\n iconName: 'user-secret',\n icon: [448, 512, [], \"f21b\", \"M383.9 308.3l23.9-62.6c4-10.5-3.7-21.7-15-21.7h-58.5c11-18.9 17.8-40.6 17.8-64v-.3c39.2-7.8 64-19.1 64-31.7 0-13.3-27.3-25.1-70.1-33-9.2-32.8-27-65.8-40.6-82.8-9.5-11.9-25.9-15.6-39.5-8.8l-27.6 13.8c-9 4.5-19.6 4.5-28.6 0L182.1 3.4c-13.6-6.8-30-3.1-39.5 8.8-13.5 17-31.4 50-40.6 82.8-42.7 7.9-70 19.7-70 33 0 12.6 24.8 23.9 64 31.7v.3c0 23.4 6.8 45.1 17.8 64H56.3c-11.5 0-19.2 11.7-14.7 22.3l25.8 60.2C27.3 329.8 0 372.7 0 422.4v44.8C0 491.9 20.1 512 44.8 512h358.4c24.7 0 44.8-20.1 44.8-44.8v-44.8c0-48.4-25.8-90.4-64.1-114.1zM176 480l-41.6-192 49.6 32 24 40-32 120zm96 0l-32-120 24-40 49.6-32L272 480zm41.7-298.5c-3.9 11.9-7 24.6-16.5 33.4-10.1 9.3-48 22.4-64-25-2.8-8.4-15.4-8.4-18.3 0-17 50.2-56 32.4-64 25-9.5-8.8-12.7-21.5-16.5-33.4-.8-2.5-6.3-5.7-6.3-5.8v-10.8c28.3 3.6 61 5.8 96 5.8s67.7-2.1 96-5.8v10.8c-.1.1-5.6 3.2-6.4 5.8z\"]\n};\nvar faUserShield = {\n prefix: 'fas',\n iconName: 'user-shield',\n icon: [640, 512, [], \"f505\", \"M622.3 271.1l-115.2-45c-4.1-1.6-12.6-3.7-22.2 0l-115.2 45c-10.7 4.2-17.7 14-17.7 24.9 0 111.6 68.7 188.8 132.9 213.9 9.6 3.7 18 1.6 22.2 0C558.4 489.9 640 420.5 640 296c0-10.9-7-20.7-17.7-24.9zM496 462.4V273.3l95.5 37.3c-5.6 87.1-60.9 135.4-95.5 151.8zM224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm96 40c0-2.5.8-4.8 1.1-7.2-2.5-.1-4.9-.8-7.5-.8h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c6.8 0 13.3-1.5 19.2-4-54-42.9-99.2-116.7-99.2-212z\"]\n};\nvar faUserSlash = {\n prefix: 'fas',\n iconName: 'user-slash',\n icon: [640, 512, [], \"f506\", \"M633.8 458.1L362.3 248.3C412.1 230.7 448 183.8 448 128 448 57.3 390.7 0 320 0c-67.1 0-121.5 51.8-126.9 117.4L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3zM96 422.4V464c0 26.5 21.5 48 48 48h350.2L207.4 290.3C144.2 301.3 96 356 96 422.4z\"]\n};\nvar faUserTag = {\n prefix: 'fas',\n iconName: 'user-tag',\n icon: [640, 512, [], \"f507\", \"M630.6 364.9l-90.3-90.2c-12-12-28.3-18.7-45.3-18.7h-79.3c-17.7 0-32 14.3-32 32v79.2c0 17 6.7 33.2 18.7 45.2l90.3 90.2c12.5 12.5 32.8 12.5 45.3 0l92.5-92.5c12.6-12.5 12.6-32.7.1-45.2zm-182.8-21c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24c0 13.2-10.7 24-24 24zm-223.8-88c70.7 0 128-57.3 128-128C352 57.3 294.7 0 224 0S96 57.3 96 128c0 70.6 57.3 127.9 128 127.9zm127.8 111.2V294c-12.2-3.6-24.9-6.2-38.2-6.2h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 287.9 0 348.1 0 422.3v41.6c0 26.5 21.5 48 48 48h352c15.5 0 29.1-7.5 37.9-18.9l-58-58c-18.1-18.1-28.1-42.2-28.1-67.9z\"]\n};\nvar faUserTie = {\n prefix: 'fas',\n iconName: 'user-tie',\n icon: [448, 512, [], \"f508\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm95.8 32.6L272 480l-32-136 32-56h-96l32 56-32 136-47.8-191.4C56.9 292 0 350.3 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-72.1-56.9-130.4-128.2-133.8z\"]\n};\nvar faUserTimes = {\n prefix: 'fas',\n iconName: 'user-times',\n icon: [640, 512, [], \"f235\", \"M589.6 240l45.6-45.6c6.3-6.3 6.3-16.5 0-22.8l-22.8-22.8c-6.3-6.3-16.5-6.3-22.8 0L544 194.4l-45.6-45.6c-6.3-6.3-16.5-6.3-22.8 0l-22.8 22.8c-6.3 6.3-6.3 16.5 0 22.8l45.6 45.6-45.6 45.6c-6.3 6.3-6.3 16.5 0 22.8l22.8 22.8c6.3 6.3 16.5 6.3 22.8 0l45.6-45.6 45.6 45.6c6.3 6.3 16.5 6.3 22.8 0l22.8-22.8c6.3-6.3 6.3-16.5 0-22.8L589.6 240zM224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUsers = {\n prefix: 'fas',\n iconName: 'users',\n icon: [640, 512, [], \"f0c0\", \"M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z\"]\n};\nvar faUsersCog = {\n prefix: 'fas',\n iconName: 'users-cog',\n icon: [640, 512, [], \"f509\", \"M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z\"]\n};\nvar faUtensilSpoon = {\n prefix: 'fas',\n iconName: 'utensil-spoon',\n icon: [512, 512, [], \"f2e5\", \"M480.1 31.9c-55-55.1-164.9-34.5-227.8 28.5-49.3 49.3-55.1 110-28.8 160.4L9 413.2c-11.6 10.5-12.1 28.5-1 39.5L59.3 504c11 11 29.1 10.5 39.5-1.1l192.4-214.4c50.4 26.3 111.1 20.5 160.4-28.8 63-62.9 83.6-172.8 28.5-227.8z\"]\n};\nvar faUtensils = {\n prefix: 'fas',\n iconName: 'utensils',\n icon: [416, 512, [], \"f2e7\", \"M207.9 15.2c.8 4.7 16.1 94.5 16.1 128.8 0 52.3-27.8 89.6-68.9 104.6L168 486.7c.7 13.7-10.2 25.3-24 25.3H80c-13.7 0-24.7-11.5-24-25.3l12.9-238.1C27.7 233.6 0 196.2 0 144 0 109.6 15.3 19.9 16.1 15.2 19.3-5.1 61.4-5.4 64 16.3v141.2c1.3 3.4 15.1 3.2 16 0 1.4-25.3 7.9-139.2 8-141.8 3.3-20.8 44.7-20.8 47.9 0 .2 2.7 6.6 116.5 8 141.8.9 3.2 14.8 3.4 16 0V16.3c2.6-21.6 44.8-21.4 48-1.1zm119.2 285.7l-15 185.1c-1.2 14 9.9 26 23.9 26h56c13.3 0 24-10.7 24-24V24c0-13.2-10.7-24-24-24-82.5 0-221.4 178.5-64.9 300.9z\"]\n};\nvar faVectorSquare = {\n prefix: 'fas',\n iconName: 'vector-square',\n icon: [512, 512, [], \"f5cb\", \"M512 128V32c0-17.67-14.33-32-32-32h-96c-17.67 0-32 14.33-32 32H160c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v96c0 17.67 14.33 32 32 32v192c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32h192c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32V160c17.67 0 32-14.33 32-32zm-96-64h32v32h-32V64zM64 64h32v32H64V64zm32 384H64v-32h32v32zm352 0h-32v-32h32v32zm-32-96h-32c-17.67 0-32 14.33-32 32v32H160v-32c0-17.67-14.33-32-32-32H96V160h32c17.67 0 32-14.33 32-32V96h192v32c0 17.67 14.33 32 32 32h32v192z\"]\n};\nvar faVenus = {\n prefix: 'fas',\n iconName: 'venus',\n icon: [288, 512, [], \"f221\", \"M288 176c0-79.5-64.5-144-144-144S0 96.5 0 176c0 68.5 47.9 125.9 112 140.4V368H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.5 112-71.9 112-140.4zm-224 0c0-44.1 35.9-80 80-80s80 35.9 80 80-35.9 80-80 80-80-35.9-80-80z\"]\n};\nvar faVenusDouble = {\n prefix: 'fas',\n iconName: 'venus-double',\n icon: [512, 512, [], \"f226\", \"M288 176c0-79.5-64.5-144-144-144S0 96.5 0 176c0 68.5 47.9 125.9 112 140.4V368H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.5 112-71.9 112-140.4zm-224 0c0-44.1 35.9-80 80-80s80 35.9 80 80-35.9 80-80 80-80-35.9-80-80zm336 140.4V368h36c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-36v36c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-36h-36c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h36v-51.6c-21.2-4.8-40.6-14.3-57.2-27.3 14-16.7 25-36 32.1-57.1 14.5 14.8 34.7 24 57.1 24 44.1 0 80-35.9 80-80s-35.9-80-80-80c-22.3 0-42.6 9.2-57.1 24-7.1-21.1-18-40.4-32.1-57.1C303.4 43.6 334.3 32 368 32c79.5 0 144 64.5 144 144 0 68.5-47.9 125.9-112 140.4z\"]\n};\nvar faVenusMars = {\n prefix: 'fas',\n iconName: 'venus-mars',\n icon: [576, 512, [], \"f228\", \"M564 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-48.7 48.7C422.5 72.1 396.2 64 368 64c-33.7 0-64.6 11.6-89.2 30.9 14 16.7 25 36 32.1 57.1 14.5-14.8 34.7-24 57.1-24 44.1 0 80 35.9 80 80s-35.9 80-80 80c-22.3 0-42.6-9.2-57.1-24-7.1 21.1-18 40.4-32.1 57.1 24.5 19.4 55.5 30.9 89.2 30.9 79.5 0 144-64.5 144-144 0-28.2-8.1-54.5-22.1-76.7l48.7-48.7 16.9 16.9c2.4 2.4 5.4 3.5 8.4 3.5 6.2 0 12.1-4.8 12.1-12V12c0-6.6-5.4-12-12-12zM144 64C64.5 64 0 128.5 0 208c0 68.5 47.9 125.9 112 140.4V400H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.6 112-71.9 112-140.4 0-79.5-64.5-144-144-144zm0 224c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faVial = {\n prefix: 'fas',\n iconName: 'vial',\n icon: [480, 512, [], \"f492\", \"M477.7 186.1L309.5 18.3c-3.1-3.1-8.2-3.1-11.3 0l-34 33.9c-3.1 3.1-3.1 8.2 0 11.3l11.2 11.1L33 316.5c-38.8 38.7-45.1 102-9.4 143.5 20.6 24 49.5 36 78.4 35.9 26.4 0 52.8-10 72.9-30.1l246.3-245.7 11.2 11.1c3.1 3.1 8.2 3.1 11.3 0l34-33.9c3.1-3 3.1-8.1 0-11.2zM318 256H161l148-147.7 78.5 78.3L318 256z\"]\n};\nvar faVials = {\n prefix: 'fas',\n iconName: 'vials',\n icon: [640, 512, [], \"f493\", \"M72 64h24v240c0 44.1 35.9 80 80 80s80-35.9 80-80V64h24c4.4 0 8-3.6 8-8V8c0-4.4-3.6-8-8-8H72c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm72 0h64v96h-64V64zm480 384H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM360 64h24v240c0 44.1 35.9 80 80 80s80-35.9 80-80V64h24c4.4 0 8-3.6 8-8V8c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm72 0h64v96h-64V64z\"]\n};\nvar faVideo = {\n prefix: 'fas',\n iconName: 'video',\n icon: [576, 512, [], \"f03d\", \"M336.2 64H47.8C21.4 64 0 85.4 0 111.8v288.4C0 426.6 21.4 448 47.8 448h288.4c26.4 0 47.8-21.4 47.8-47.8V111.8c0-26.4-21.4-47.8-47.8-47.8zm189.4 37.7L416 177.3v157.4l109.6 75.5c21.2 14.6 50.4-.3 50.4-25.8V127.5c0-25.4-29.1-40.4-50.4-25.8z\"]\n};\nvar faVideoSlash = {\n prefix: 'fas',\n iconName: 'video-slash',\n icon: [640, 512, [], \"f4e2\", \"M633.8 458.1l-55-42.5c15.4-1.4 29.2-13.7 29.2-31.1v-257c0-25.5-29.1-40.4-50.4-25.8L448 177.3v137.2l-32-24.7v-178c0-26.4-21.4-47.8-47.8-47.8H123.9L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4L42.7 82 416 370.6l178.5 138c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.5-6.9 4.2-17-2.8-22.4zM32 400.2c0 26.4 21.4 47.8 47.8 47.8h288.4c11.2 0 21.4-4 29.6-10.5L32 154.7v245.5z\"]\n};\nvar faVihara = {\n prefix: 'fas',\n iconName: 'vihara',\n icon: [640, 512, [], \"f6a7\", \"M632.88 400.71L544 352v-64l55.16-17.69c11.79-5.9 11.79-22.72 0-28.62L480 192v-64l27.31-16.3c7.72-7.72 5.61-20.74-4.16-25.62L320 0 136.85 86.07c-9.77 4.88-11.88 17.9-4.16 25.62L160 128v64L40.84 241.69c-11.79 5.9-11.79 22.72 0 28.62L96 288v64L7.12 400.71c-5.42 3.62-7.7 9.63-7 15.29.62 5.01 3.57 9.75 8.72 12.33L64 448v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48h160v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48h160v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48l55.15-19.67c5.16-2.58 8.1-7.32 8.72-12.33.71-5.67-1.57-11.68-6.99-15.29zM224 128h192v64H224v-64zm-64 224v-64h320v64H160z\"]\n};\nvar faVoicemail = {\n prefix: 'fas',\n iconName: 'voicemail',\n icon: [640, 512, [], \"f897\", \"M496 128a144 144 0 0 0-119.74 224H263.74A144 144 0 1 0 144 416h352a144 144 0 0 0 0-288zM64 272a80 80 0 1 1 80 80 80 80 0 0 1-80-80zm432 80a80 80 0 1 1 80-80 80 80 0 0 1-80 80z\"]\n};\nvar faVolleyballBall = {\n prefix: 'fas',\n iconName: 'volleyball-ball',\n icon: [512, 512, [], \"f45f\", \"M231.39 243.48a285.56 285.56 0 0 0-22.7-105.7c-90.8 42.4-157.5 122.4-180.3 216.8a249 249 0 0 0 56.9 81.1 333.87 333.87 0 0 1 146.1-192.2zm-36.9-134.4a284.23 284.23 0 0 0-57.4-70.7c-91 49.8-144.8 152.9-125 262.2 33.4-83.1 98.4-152 182.4-191.5zm187.6 165.1c8.6-99.8-27.3-197.5-97.5-264.4-14.7-1.7-51.6-5.5-98.9 8.5A333.87 333.87 0 0 1 279.19 241a285 285 0 0 0 102.9 33.18zm-124.7 9.5a286.33 286.33 0 0 0-80.2 72.6c82 57.3 184.5 75.1 277.5 47.8a247.15 247.15 0 0 0 42.2-89.9 336.1 336.1 0 0 1-80.9 10.4c-54.6-.1-108.9-14.1-158.6-40.9zm-98.3 99.7c-15.2 26-25.7 54.4-32.1 84.2a247.07 247.07 0 0 0 289-22.1c-112.9 16.1-203.3-24.8-256.9-62.1zm180.3-360.6c55.3 70.4 82.5 161.2 74.6 253.6a286.59 286.59 0 0 0 89.7-14.2c0-2 .3-4 .3-6 0-107.8-68.7-199.1-164.6-233.4z\"]\n};\nvar faVolumeDown = {\n prefix: 'fas',\n iconName: 'volume-down',\n icon: [384, 512, [], \"f027\", \"M215.03 72.04L126.06 161H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V89.02c0-21.47-25.96-31.98-40.97-16.98zm123.2 108.08c-11.58-6.33-26.19-2.16-32.61 9.45-6.39 11.61-2.16 26.2 9.45 32.61C327.98 229.28 336 242.62 336 257c0 14.38-8.02 27.72-20.92 34.81-11.61 6.41-15.84 21-9.45 32.61 6.43 11.66 21.05 15.8 32.61 9.45 28.23-15.55 45.77-45 45.77-76.88s-17.54-61.32-45.78-76.87z\"]\n};\nvar faVolumeMute = {\n prefix: 'fas',\n iconName: 'volume-mute',\n icon: [512, 512, [], \"f6a9\", \"M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zM461.64 256l45.64-45.64c6.3-6.3 6.3-16.52 0-22.82l-22.82-22.82c-6.3-6.3-16.52-6.3-22.82 0L416 210.36l-45.64-45.64c-6.3-6.3-16.52-6.3-22.82 0l-22.82 22.82c-6.3 6.3-6.3 16.52 0 22.82L370.36 256l-45.63 45.63c-6.3 6.3-6.3 16.52 0 22.82l22.82 22.82c6.3 6.3 16.52 6.3 22.82 0L416 301.64l45.64 45.64c6.3 6.3 16.52 6.3 22.82 0l22.82-22.82c6.3-6.3 6.3-16.52 0-22.82L461.64 256z\"]\n};\nvar faVolumeOff = {\n prefix: 'fas',\n iconName: 'volume-off',\n icon: [256, 512, [], \"f026\", \"M215 71l-89 89H24a24 24 0 0 0-24 24v144a24 24 0 0 0 24 24h102.06L215 441c15 15 41 4.47 41-17V88c0-21.47-26-32-41-17z\"]\n};\nvar faVolumeUp = {\n prefix: 'fas',\n iconName: 'volume-up',\n icon: [576, 512, [], \"f028\", \"M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zm233.32-51.08c-11.17-7.33-26.18-4.24-33.51 6.95-7.34 11.17-4.22 26.18 6.95 33.51 66.27 43.49 105.82 116.6 105.82 195.58 0 78.98-39.55 152.09-105.82 195.58-11.17 7.32-14.29 22.34-6.95 33.5 7.04 10.71 21.93 14.56 33.51 6.95C528.27 439.58 576 351.33 576 256S528.27 72.43 448.35 19.97zM480 256c0-63.53-32.06-121.94-85.77-156.24-11.19-7.14-26.03-3.82-33.12 7.46s-3.78 26.21 7.41 33.36C408.27 165.97 432 209.11 432 256s-23.73 90.03-63.48 115.42c-11.19 7.14-14.5 22.07-7.41 33.36 6.51 10.36 21.12 15.14 33.12 7.46C447.94 377.94 480 319.54 480 256zm-141.77-76.87c-11.58-6.33-26.19-2.16-32.61 9.45-6.39 11.61-2.16 26.2 9.45 32.61C327.98 228.28 336 241.63 336 256c0 14.38-8.02 27.72-20.92 34.81-11.61 6.41-15.84 21-9.45 32.61 6.43 11.66 21.05 15.8 32.61 9.45 28.23-15.55 45.77-45 45.77-76.88s-17.54-61.32-45.78-76.86z\"]\n};\nvar faVoteYea = {\n prefix: 'fas',\n iconName: 'vote-yea',\n icon: [640, 512, [], \"f772\", \"M608 320h-64v64h22.4c5.3 0 9.6 3.6 9.6 8v16c0 4.4-4.3 8-9.6 8H73.6c-5.3 0-9.6-3.6-9.6-8v-16c0-4.4 4.3-8 9.6-8H96v-64H32c-17.7 0-32 14.3-32 32v96c0 17.7 14.3 32 32 32h576c17.7 0 32-14.3 32-32v-96c0-17.7-14.3-32-32-32zm-96 64V64.3c0-17.9-14.5-32.3-32.3-32.3H160.4C142.5 32 128 46.5 128 64.3V384h384zM211.2 202l25.5-25.3c4.2-4.2 11-4.2 15.2.1l41.3 41.6 95.2-94.4c4.2-4.2 11-4.2 15.2.1l25.3 25.5c4.2 4.2 4.2 11-.1 15.2L300.5 292c-4.2 4.2-11 4.2-15.2-.1l-74.1-74.7c-4.3-4.2-4.2-11 0-15.2z\"]\n};\nvar faVrCardboard = {\n prefix: 'fas',\n iconName: 'vr-cardboard',\n icon: [640, 512, [], \"f729\", \"M608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h160.22c25.19 0 48.03-14.77 58.36-37.74l27.74-61.64C286.21 331.08 302.35 320 320 320s33.79 11.08 41.68 28.62l27.74 61.64C399.75 433.23 422.6 448 447.78 448H608c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zM160 304c-35.35 0-64-28.65-64-64s28.65-64 64-64 64 28.65 64 64-28.65 64-64 64zm320 0c-35.35 0-64-28.65-64-64s28.65-64 64-64 64 28.65 64 64-28.65 64-64 64z\"]\n};\nvar faWalking = {\n prefix: 'fas',\n iconName: 'walking',\n icon: [320, 512, [], \"f554\", \"M208 96c26.5 0 48-21.5 48-48S234.5 0 208 0s-48 21.5-48 48 21.5 48 48 48zm94.5 149.1l-23.3-11.8-9.7-29.4c-14.7-44.6-55.7-75.8-102.2-75.9-36-.1-55.9 10.1-93.3 25.2-21.6 8.7-39.3 25.2-49.7 46.2L17.6 213c-7.8 15.8-1.5 35 14.2 42.9 15.6 7.9 34.6 1.5 42.5-14.3L81 228c3.5-7 9.3-12.5 16.5-15.4l26.8-10.8-15.2 60.7c-5.2 20.8.4 42.9 14.9 58.8l59.9 65.4c7.2 7.9 12.3 17.4 14.9 27.7l18.3 73.3c4.3 17.1 21.7 27.6 38.8 23.3 17.1-4.3 27.6-21.7 23.3-38.8l-22.2-89c-2.6-10.3-7.7-19.9-14.9-27.7l-45.5-49.7 17.2-68.7 5.5 16.5c5.3 16.1 16.7 29.4 31.7 37l23.3 11.8c15.6 7.9 34.6 1.5 42.5-14.3 7.7-15.7 1.4-35.1-14.3-43zM73.6 385.8c-3.2 8.1-8 15.4-14.2 21.5l-50 50.1c-12.5 12.5-12.5 32.8 0 45.3s32.7 12.5 45.2 0l59.4-59.4c6.1-6.1 10.9-13.4 14.2-21.5l13.5-33.8c-55.3-60.3-38.7-41.8-47.4-53.7l-20.7 51.5z\"]\n};\nvar faWallet = {\n prefix: 'fas',\n iconName: 'wallet',\n icon: [512, 512, [], \"f555\", \"M461.2 128H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h384c8.84 0 16-7.16 16-16 0-26.51-21.49-48-48-48H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h397.2c28.02 0 50.8-21.53 50.8-48V176c0-26.47-22.78-48-50.8-48zM416 336c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faWarehouse = {\n prefix: 'fas',\n iconName: 'warehouse',\n icon: [640, 512, [], \"f494\", \"M504 352H136.4c-4.4 0-8 3.6-8 8l-.1 48c0 4.4 3.6 8 8 8H504c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm0 96H136.1c-4.4 0-8 3.6-8 8l-.1 48c0 4.4 3.6 8 8 8h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm0-192H136.6c-4.4 0-8 3.6-8 8l-.1 48c0 4.4 3.6 8 8 8H504c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm106.5-139L338.4 3.7a48.15 48.15 0 0 0-36.9 0L29.5 117C11.7 124.5 0 141.9 0 161.3V504c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8V256c0-17.6 14.6-32 32.6-32h382.8c18 0 32.6 14.4 32.6 32v248c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8V161.3c0-19.4-11.7-36.8-29.5-44.3z\"]\n};\nvar faWater = {\n prefix: 'fas',\n iconName: 'water',\n icon: [576, 512, [], \"f773\", \"M562.1 383.9c-21.5-2.4-42.1-10.5-57.9-22.9-14.1-11.1-34.2-11.3-48.2 0-37.9 30.4-107.2 30.4-145.7-1.5-13.5-11.2-33-9.1-46.7 1.8-38 30.1-106.9 30-145.2-1.7-13.5-11.2-33.3-8.9-47.1 2-15.5 12.2-36 20.1-57.7 22.4-7.9.8-13.6 7.8-13.6 15.7v32.2c0 9.1 7.6 16.8 16.7 16 28.8-2.5 56.1-11.4 79.4-25.9 56.5 34.6 137 34.1 192 0 56.5 34.6 137 34.1 192 0 23.3 14.2 50.9 23.3 79.1 25.8 9.1.8 16.7-6.9 16.7-16v-31.6c.1-8-5.7-15.4-13.8-16.3zm0-144c-21.5-2.4-42.1-10.5-57.9-22.9-14.1-11.1-34.2-11.3-48.2 0-37.9 30.4-107.2 30.4-145.7-1.5-13.5-11.2-33-9.1-46.7 1.8-38 30.1-106.9 30-145.2-1.7-13.5-11.2-33.3-8.9-47.1 2-15.5 12.2-36 20.1-57.7 22.4-7.9.8-13.6 7.8-13.6 15.7v32.2c0 9.1 7.6 16.8 16.7 16 28.8-2.5 56.1-11.4 79.4-25.9 56.5 34.6 137 34.1 192 0 56.5 34.6 137 34.1 192 0 23.3 14.2 50.9 23.3 79.1 25.8 9.1.8 16.7-6.9 16.7-16v-31.6c.1-8-5.7-15.4-13.8-16.3zm0-144C540.6 93.4 520 85.4 504.2 73 490.1 61.9 470 61.7 456 73c-37.9 30.4-107.2 30.4-145.7-1.5-13.5-11.2-33-9.1-46.7 1.8-38 30.1-106.9 30-145.2-1.7-13.5-11.2-33.3-8.9-47.1 2-15.5 12.2-36 20.1-57.7 22.4-7.9.8-13.6 7.8-13.6 15.7v32.2c0 9.1 7.6 16.8 16.7 16 28.8-2.5 56.1-11.4 79.4-25.9 56.5 34.6 137 34.1 192 0 56.5 34.6 137 34.1 192 0 23.3 14.2 50.9 23.3 79.1 25.8 9.1.8 16.7-6.9 16.7-16v-31.6c.1-8-5.7-15.4-13.8-16.3z\"]\n};\nvar faWaveSquare = {\n prefix: 'fas',\n iconName: 'wave-square',\n icon: [640, 512, [], \"f83e\", \"M476 480H324a36 36 0 0 1-36-36V96h-96v156a36 36 0 0 1-36 36H16a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h112V68a36 36 0 0 1 36-36h152a36 36 0 0 1 36 36v348h96V260a36 36 0 0 1 36-36h140a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H512v156a36 36 0 0 1-36 36z\"]\n};\nvar faWeight = {\n prefix: 'fas',\n iconName: 'weight',\n icon: [512, 512, [], \"f496\", \"M448 64h-25.98C438.44 92.28 448 125.01 448 160c0 105.87-86.13 192-192 192S64 265.87 64 160c0-34.99 9.56-67.72 25.98-96H64C28.71 64 0 92.71 0 128v320c0 35.29 28.71 64 64 64h384c35.29 0 64-28.71 64-64V128c0-35.29-28.71-64-64-64zM256 320c88.37 0 160-71.63 160-160S344.37 0 256 0 96 71.63 96 160s71.63 160 160 160zm-.3-151.94l33.58-78.36c3.5-8.17 12.94-11.92 21.03-8.41 8.12 3.48 11.88 12.89 8.41 21l-33.67 78.55C291.73 188 296 197.45 296 208c0 22.09-17.91 40-40 40s-40-17.91-40-40c0-21.98 17.76-39.77 39.7-39.94z\"]\n};\nvar faWeightHanging = {\n prefix: 'fas',\n iconName: 'weight-hanging',\n icon: [512, 512, [], \"f5cd\", \"M510.28 445.86l-73.03-292.13c-3.8-15.19-16.44-25.72-30.87-25.72h-60.25c3.57-10.05 5.88-20.72 5.88-32 0-53.02-42.98-96-96-96s-96 42.98-96 96c0 11.28 2.3 21.95 5.88 32h-60.25c-14.43 0-27.08 10.54-30.87 25.72L1.72 445.86C-6.61 479.17 16.38 512 48.03 512h415.95c31.64 0 54.63-32.83 46.3-66.14zM256 128c-17.64 0-32-14.36-32-32s14.36-32 32-32 32 14.36 32 32-14.36 32-32 32z\"]\n};\nvar faWheelchair = {\n prefix: 'fas',\n iconName: 'wheelchair',\n icon: [512, 512, [], \"f193\", \"M496.101 385.669l14.227 28.663c3.929 7.915.697 17.516-7.218 21.445l-65.465 32.886c-16.049 7.967-35.556 1.194-43.189-15.055L331.679 320H192c-15.925 0-29.426-11.71-31.679-27.475C126.433 55.308 128.38 70.044 128 64c0-36.358 30.318-65.635 67.052-63.929 33.271 1.545 60.048 28.905 60.925 62.201.868 32.933-23.152 60.423-54.608 65.039l4.67 32.69H336c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H215.182l4.572 32H352a32 32 0 0 1 28.962 18.392L438.477 396.8l36.178-18.349c7.915-3.929 17.517-.697 21.446 7.218zM311.358 352h-24.506c-7.788 54.204-54.528 96-110.852 96-61.757 0-112-50.243-112-112 0-41.505 22.694-77.809 56.324-97.156-3.712-25.965-6.844-47.86-9.488-66.333C45.956 198.464 0 261.963 0 336c0 97.047 78.953 176 176 176 71.87 0 133.806-43.308 161.11-105.192L311.358 352z\"]\n};\nvar faWifi = {\n prefix: 'fas',\n iconName: 'wifi',\n icon: [640, 512, [], \"f1eb\", \"M634.91 154.88C457.74-8.99 182.19-8.93 5.09 154.88c-6.66 6.16-6.79 16.59-.35 22.98l34.24 33.97c6.14 6.1 16.02 6.23 22.4.38 145.92-133.68 371.3-133.71 517.25 0 6.38 5.85 16.26 5.71 22.4-.38l34.24-33.97c6.43-6.39 6.3-16.82-.36-22.98zM320 352c-35.35 0-64 28.65-64 64s28.65 64 64 64 64-28.65 64-64-28.65-64-64-64zm202.67-83.59c-115.26-101.93-290.21-101.82-405.34 0-6.9 6.1-7.12 16.69-.57 23.15l34.44 33.99c6 5.92 15.66 6.32 22.05.8 83.95-72.57 209.74-72.41 293.49 0 6.39 5.52 16.05 5.13 22.05-.8l34.44-33.99c6.56-6.46 6.33-17.06-.56-23.15z\"]\n};\nvar faWind = {\n prefix: 'fas',\n iconName: 'wind',\n icon: [512, 512, [], \"f72e\", \"M156.7 256H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h142.2c15.9 0 30.8 10.9 33.4 26.6 3.3 20-12.1 37.4-31.6 37.4-14.1 0-26.1-9.2-30.4-21.9-2.1-6.3-8.6-10.1-15.2-10.1H81.6c-9.8 0-17.7 8.8-15.9 18.4 8.6 44.1 47.6 77.6 94.2 77.6 57.1 0 102.7-50.1 95.2-108.6C249 291 205.4 256 156.7 256zM16 224h336c59.7 0 106.8-54.8 93.8-116.7-7.6-36.2-36.9-65.5-73.1-73.1-55.4-11.6-105.1 24.9-114.9 75.5-1.9 9.6 6.1 18.3 15.8 18.3h32.8c6.7 0 13.1-3.8 15.2-10.1C325.9 105.2 337.9 96 352 96c19.4 0 34.9 17.4 31.6 37.4-2.6 15.7-17.4 26.6-33.4 26.6H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16zm384 32H243.7c19.3 16.6 33.2 38.8 39.8 64H400c26.5 0 48 21.5 48 48s-21.5 48-48 48c-17.9 0-33.3-9.9-41.6-24.4-2.9-5-8.7-7.6-14.5-7.6h-33.8c-10.9 0-19 10.8-15.3 21.1 17.8 50.6 70.5 84.8 129.4 72.3 41.2-8.7 75.1-41.6 84.7-82.7C526 321.5 470.5 256 400 256z\"]\n};\nvar faWindowClose = {\n prefix: 'fas',\n iconName: 'window-close',\n icon: [512, 512, [], \"f410\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-83.6 290.5c4.8 4.8 4.8 12.6 0 17.4l-40.5 40.5c-4.8 4.8-12.6 4.8-17.4 0L256 313.3l-66.5 67.1c-4.8 4.8-12.6 4.8-17.4 0l-40.5-40.5c-4.8-4.8-4.8-12.6 0-17.4l67.1-66.5-67.1-66.5c-4.8-4.8-4.8-12.6 0-17.4l40.5-40.5c4.8-4.8 12.6-4.8 17.4 0l66.5 67.1 66.5-67.1c4.8-4.8 12.6-4.8 17.4 0l40.5 40.5c4.8 4.8 4.8 12.6 0 17.4L313.3 256l67.1 66.5z\"]\n};\nvar faWindowMaximize = {\n prefix: 'fas',\n iconName: 'window-maximize',\n icon: [512, 512, [], \"f2d0\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-16 160H64v-84c0-6.6 5.4-12 12-12h360c6.6 0 12 5.4 12 12v84z\"]\n};\nvar faWindowMinimize = {\n prefix: 'fas',\n iconName: 'window-minimize',\n icon: [512, 512, [], \"f2d1\", \"M464 352H48c-26.5 0-48 21.5-48 48v32c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48v-32c0-26.5-21.5-48-48-48z\"]\n};\nvar faWindowRestore = {\n prefix: 'fas',\n iconName: 'window-restore',\n icon: [512, 512, [], \"f2d2\", \"M512 48v288c0 26.5-21.5 48-48 48h-48V176c0-44.1-35.9-80-80-80H128V48c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zM384 176v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zm-68 28c0-6.6-5.4-12-12-12H76c-6.6 0-12 5.4-12 12v52h252v-52z\"]\n};\nvar faWineBottle = {\n prefix: 'fas',\n iconName: 'wine-bottle',\n icon: [512, 512, [], \"f72f\", \"M507.31 72.57L439.43 4.69c-6.25-6.25-16.38-6.25-22.63 0l-22.63 22.63c-6.25 6.25-6.25 16.38 0 22.63l-76.67 76.67c-46.58-19.7-102.4-10.73-140.37 27.23L18.75 312.23c-24.99 24.99-24.99 65.52 0 90.51l90.51 90.51c24.99 24.99 65.52 24.99 90.51 0l158.39-158.39c37.96-37.96 46.93-93.79 27.23-140.37l76.67-76.67c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.24-6.24 6.24-16.37-.01-22.62zM179.22 423.29l-90.51-90.51 122.04-122.04 90.51 90.51-122.04 122.04z\"]\n};\nvar faWineGlass = {\n prefix: 'fas',\n iconName: 'wine-glass',\n icon: [288, 512, [], \"f4e3\", \"M216 464h-40V346.81c68.47-15.89 118.05-79.91 111.4-154.16l-15.95-178.1C270.71 6.31 263.9 0 255.74 0H32.26c-8.15 0-14.97 6.31-15.7 14.55L.6 192.66C-6.05 266.91 43.53 330.93 112 346.82V464H72c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h208c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40z\"]\n};\nvar faWineGlassAlt = {\n prefix: 'fas',\n iconName: 'wine-glass-alt',\n icon: [288, 512, [], \"f5ce\", \"M216 464h-40V346.81c68.47-15.89 118.05-79.91 111.4-154.16l-15.95-178.1C270.71 6.31 263.9 0 255.74 0H32.26c-8.15 0-14.97 6.31-15.7 14.55L.6 192.66C-6.05 266.91 43.53 330.93 112 346.82V464H72c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h208c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40zM61.75 48h164.5l7.17 80H54.58l7.17-80z\"]\n};\nvar faWonSign = {\n prefix: 'fas',\n iconName: 'won-sign',\n icon: [576, 512, [], \"f159\", \"M564 192c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-48l18.6-80.6c1.7-7.5-4-14.7-11.7-14.7h-46.1c-5.7 0-10.6 4-11.7 9.5L450.7 128H340.8l-19.7-86c-1.3-5.5-6.1-9.3-11.7-9.3h-44c-5.6 0-10.4 3.8-11.7 9.3l-20 86H125l-17.5-85.7c-1.1-5.6-6.1-9.6-11.8-9.6H53.6c-7.7 0-13.4 7.1-11.7 14.6L60 128H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h62.3l7.2 32H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h83.9l40.9 182.6c1.2 5.5 6.1 9.4 11.7 9.4h56.8c5.6 0 10.4-3.9 11.7-9.3L259.3 288h55.1l42.4 182.7c1.3 5.4 6.1 9.3 11.7 9.3h56.8c5.6 0 10.4-3.9 11.7-9.3L479.1 288H564c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-70.1l7.4-32zM183.8 342c-6.2 25.8-6.8 47.2-7.3 47.2h-1.1s-1.7-22-6.8-47.2l-11-54h38.8zm27.5-118h-66.8l-6.5-32h80.8zm62.9 0l2-8.6c1.9-8 3.5-16 4.8-23.4h11.8c1.3 7.4 2.9 15.4 4.8 23.4l2 8.6zm130.9 118c-5.1 25.2-6.8 47.2-6.8 47.2h-1.1c-.6 0-1.1-21.4-7.3-47.2l-12.4-54h39.1zm25.2-118h-67.4l-7.3-32h81.6z\"]\n};\nvar faWrench = {\n prefix: 'fas',\n iconName: 'wrench',\n icon: [512, 512, [], \"f0ad\", \"M507.73 109.1c-2.24-9.03-13.54-12.09-20.12-5.51l-74.36 74.36-67.88-11.31-11.31-67.88 74.36-74.36c6.62-6.62 3.43-17.9-5.66-20.16-47.38-11.74-99.55.91-136.58 37.93-39.64 39.64-50.55 97.1-34.05 147.2L18.74 402.76c-24.99 24.99-24.99 65.51 0 90.5 24.99 24.99 65.51 24.99 90.5 0l213.21-213.21c50.12 16.71 107.47 5.68 147.37-34.22 37.07-37.07 49.7-89.32 37.91-136.73zM64 472c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faXRay = {\n prefix: 'fas',\n iconName: 'x-ray',\n icon: [640, 512, [], \"f497\", \"M240 384c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm160 32c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zM624 0H16C7.2 0 0 7.2 0 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16zm0 448h-48V96H64v352H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM480 248c0 4.4-3.6 8-8 8H336v32h104c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H336v32h64c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48v-16h-64v16c0 26.5-21.5 48-48 48s-48-21.5-48-48 21.5-48 48-48h64v-32H200c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h104v-32H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h136v-32H200c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h104v-24c0-4.4 3.6-8 8-8h16c4.4 0 8 3.6 8 8v24h104c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H336v32h136c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faYenSign = {\n prefix: 'fas',\n iconName: 'yen-sign',\n icon: [384, 512, [], \"f157\", \"M351.2 32h-65.3c-4.6 0-8.8 2.6-10.8 6.7l-55.4 113.2c-14.5 34.7-27.1 71.9-27.1 71.9h-1.3s-12.6-37.2-27.1-71.9L108.8 38.7c-2-4.1-6.2-6.7-10.8-6.7H32.8c-9.1 0-14.8 9.7-10.6 17.6L102.3 200H44c-6.6 0-12 5.4-12 12v32c0 6.6 5.4 12 12 12h88.2l19.8 37.2V320H44c-6.6 0-12 5.4-12 12v32c0 6.6 5.4 12 12 12h108v92c0 6.6 5.4 12 12 12h56c6.6 0 12-5.4 12-12v-92h108c6.6 0 12-5.4 12-12v-32c0-6.6-5.4-12-12-12H232v-26.8l19.8-37.2H340c6.6 0 12-5.4 12-12v-32c0-6.6-5.4-12-12-12h-58.3l80.1-150.4c4.3-7.9-1.5-17.6-10.6-17.6z\"]\n};\nvar faYinYang = {\n prefix: 'fas',\n iconName: 'yin-yang',\n icon: [496, 512, [], \"f6ad\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 376c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-128c-53.02 0-96 42.98-96 96s42.98 96 96 96c-106.04 0-192-85.96-192-192S141.96 64 248 64c53.02 0 96 42.98 96 96s-42.98 96-96 96zm0-128c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar _iconsCache = {\n faAd: faAd,\n faAddressBook: faAddressBook,\n faAddressCard: faAddressCard,\n faAdjust: faAdjust,\n faAirFreshener: faAirFreshener,\n faAlignCenter: faAlignCenter,\n faAlignJustify: faAlignJustify,\n faAlignLeft: faAlignLeft,\n faAlignRight: faAlignRight,\n faAllergies: faAllergies,\n faAmbulance: faAmbulance,\n faAmericanSignLanguageInterpreting: faAmericanSignLanguageInterpreting,\n faAnchor: faAnchor,\n faAngleDoubleDown: faAngleDoubleDown,\n faAngleDoubleLeft: faAngleDoubleLeft,\n faAngleDoubleRight: faAngleDoubleRight,\n faAngleDoubleUp: faAngleDoubleUp,\n faAngleDown: faAngleDown,\n faAngleLeft: faAngleLeft,\n faAngleRight: faAngleRight,\n faAngleUp: faAngleUp,\n faAngry: faAngry,\n faAnkh: faAnkh,\n faAppleAlt: faAppleAlt,\n faArchive: faArchive,\n faArchway: faArchway,\n faArrowAltCircleDown: faArrowAltCircleDown,\n faArrowAltCircleLeft: faArrowAltCircleLeft,\n faArrowAltCircleRight: faArrowAltCircleRight,\n faArrowAltCircleUp: faArrowAltCircleUp,\n faArrowCircleDown: faArrowCircleDown,\n faArrowCircleLeft: faArrowCircleLeft,\n faArrowCircleRight: faArrowCircleRight,\n faArrowCircleUp: faArrowCircleUp,\n faArrowDown: faArrowDown,\n faArrowLeft: faArrowLeft,\n faArrowRight: faArrowRight,\n faArrowUp: faArrowUp,\n faArrowsAlt: faArrowsAlt,\n faArrowsAltH: faArrowsAltH,\n faArrowsAltV: faArrowsAltV,\n faAssistiveListeningSystems: faAssistiveListeningSystems,\n faAsterisk: faAsterisk,\n faAt: faAt,\n faAtlas: faAtlas,\n faAtom: faAtom,\n faAudioDescription: faAudioDescription,\n faAward: faAward,\n faBaby: faBaby,\n faBabyCarriage: faBabyCarriage,\n faBackspace: faBackspace,\n faBackward: faBackward,\n faBacon: faBacon,\n faBalanceScale: faBalanceScale,\n faBalanceScaleLeft: faBalanceScaleLeft,\n faBalanceScaleRight: faBalanceScaleRight,\n faBan: faBan,\n faBandAid: faBandAid,\n faBarcode: faBarcode,\n faBars: faBars,\n faBaseballBall: faBaseballBall,\n faBasketballBall: faBasketballBall,\n faBath: faBath,\n faBatteryEmpty: faBatteryEmpty,\n faBatteryFull: faBatteryFull,\n faBatteryHalf: faBatteryHalf,\n faBatteryQuarter: faBatteryQuarter,\n faBatteryThreeQuarters: faBatteryThreeQuarters,\n faBed: faBed,\n faBeer: faBeer,\n faBell: faBell,\n faBellSlash: faBellSlash,\n faBezierCurve: faBezierCurve,\n faBible: faBible,\n faBicycle: faBicycle,\n faBiking: faBiking,\n faBinoculars: faBinoculars,\n faBiohazard: faBiohazard,\n faBirthdayCake: faBirthdayCake,\n faBlender: faBlender,\n faBlenderPhone: faBlenderPhone,\n faBlind: faBlind,\n faBlog: faBlog,\n faBold: faBold,\n faBolt: faBolt,\n faBomb: faBomb,\n faBone: faBone,\n faBong: faBong,\n faBook: faBook,\n faBookDead: faBookDead,\n faBookMedical: faBookMedical,\n faBookOpen: faBookOpen,\n faBookReader: faBookReader,\n faBookmark: faBookmark,\n faBorderAll: faBorderAll,\n faBorderNone: faBorderNone,\n faBorderStyle: faBorderStyle,\n faBowlingBall: faBowlingBall,\n faBox: faBox,\n faBoxOpen: faBoxOpen,\n faBoxes: faBoxes,\n faBraille: faBraille,\n faBrain: faBrain,\n faBreadSlice: faBreadSlice,\n faBriefcase: faBriefcase,\n faBriefcaseMedical: faBriefcaseMedical,\n faBroadcastTower: faBroadcastTower,\n faBroom: faBroom,\n faBrush: faBrush,\n faBug: faBug,\n faBuilding: faBuilding,\n faBullhorn: faBullhorn,\n faBullseye: faBullseye,\n faBurn: faBurn,\n faBus: faBus,\n faBusAlt: faBusAlt,\n faBusinessTime: faBusinessTime,\n faCalculator: faCalculator,\n faCalendar: faCalendar,\n faCalendarAlt: faCalendarAlt,\n faCalendarCheck: faCalendarCheck,\n faCalendarDay: faCalendarDay,\n faCalendarMinus: faCalendarMinus,\n faCalendarPlus: faCalendarPlus,\n faCalendarTimes: faCalendarTimes,\n faCalendarWeek: faCalendarWeek,\n faCamera: faCamera,\n faCameraRetro: faCameraRetro,\n faCampground: faCampground,\n faCandyCane: faCandyCane,\n faCannabis: faCannabis,\n faCapsules: faCapsules,\n faCar: faCar,\n faCarAlt: faCarAlt,\n faCarBattery: faCarBattery,\n faCarCrash: faCarCrash,\n faCarSide: faCarSide,\n faCaretDown: faCaretDown,\n faCaretLeft: faCaretLeft,\n faCaretRight: faCaretRight,\n faCaretSquareDown: faCaretSquareDown,\n faCaretSquareLeft: faCaretSquareLeft,\n faCaretSquareRight: faCaretSquareRight,\n faCaretSquareUp: faCaretSquareUp,\n faCaretUp: faCaretUp,\n faCarrot: faCarrot,\n faCartArrowDown: faCartArrowDown,\n faCartPlus: faCartPlus,\n faCashRegister: faCashRegister,\n faCat: faCat,\n faCertificate: faCertificate,\n faChair: faChair,\n faChalkboard: faChalkboard,\n faChalkboardTeacher: faChalkboardTeacher,\n faChargingStation: faChargingStation,\n faChartArea: faChartArea,\n faChartBar: faChartBar,\n faChartLine: faChartLine,\n faChartPie: faChartPie,\n faCheck: faCheck,\n faCheckCircle: faCheckCircle,\n faCheckDouble: faCheckDouble,\n faCheckSquare: faCheckSquare,\n faCheese: faCheese,\n faChess: faChess,\n faChessBishop: faChessBishop,\n faChessBoard: faChessBoard,\n faChessKing: faChessKing,\n faChessKnight: faChessKnight,\n faChessPawn: faChessPawn,\n faChessQueen: faChessQueen,\n faChessRook: faChessRook,\n faChevronCircleDown: faChevronCircleDown,\n faChevronCircleLeft: faChevronCircleLeft,\n faChevronCircleRight: faChevronCircleRight,\n faChevronCircleUp: faChevronCircleUp,\n faChevronDown: faChevronDown,\n faChevronLeft: faChevronLeft,\n faChevronRight: faChevronRight,\n faChevronUp: faChevronUp,\n faChild: faChild,\n faChurch: faChurch,\n faCircle: faCircle,\n faCircleNotch: faCircleNotch,\n faCity: faCity,\n faClinicMedical: faClinicMedical,\n faClipboard: faClipboard,\n faClipboardCheck: faClipboardCheck,\n faClipboardList: faClipboardList,\n faClock: faClock,\n faClone: faClone,\n faClosedCaptioning: faClosedCaptioning,\n faCloud: faCloud,\n faCloudDownloadAlt: faCloudDownloadAlt,\n faCloudMeatball: faCloudMeatball,\n faCloudMoon: faCloudMoon,\n faCloudMoonRain: faCloudMoonRain,\n faCloudRain: faCloudRain,\n faCloudShowersHeavy: faCloudShowersHeavy,\n faCloudSun: faCloudSun,\n faCloudSunRain: faCloudSunRain,\n faCloudUploadAlt: faCloudUploadAlt,\n faCocktail: faCocktail,\n faCode: faCode,\n faCodeBranch: faCodeBranch,\n faCoffee: faCoffee,\n faCog: faCog,\n faCogs: faCogs,\n faCoins: faCoins,\n faColumns: faColumns,\n faComment: faComment,\n faCommentAlt: faCommentAlt,\n faCommentDollar: faCommentDollar,\n faCommentDots: faCommentDots,\n faCommentMedical: faCommentMedical,\n faCommentSlash: faCommentSlash,\n faComments: faComments,\n faCommentsDollar: faCommentsDollar,\n faCompactDisc: faCompactDisc,\n faCompass: faCompass,\n faCompress: faCompress,\n faCompressArrowsAlt: faCompressArrowsAlt,\n faConciergeBell: faConciergeBell,\n faCookie: faCookie,\n faCookieBite: faCookieBite,\n faCopy: faCopy,\n faCopyright: faCopyright,\n faCouch: faCouch,\n faCreditCard: faCreditCard,\n faCrop: faCrop,\n faCropAlt: faCropAlt,\n faCross: faCross,\n faCrosshairs: faCrosshairs,\n faCrow: faCrow,\n faCrown: faCrown,\n faCrutch: faCrutch,\n faCube: faCube,\n faCubes: faCubes,\n faCut: faCut,\n faDatabase: faDatabase,\n faDeaf: faDeaf,\n faDemocrat: faDemocrat,\n faDesktop: faDesktop,\n faDharmachakra: faDharmachakra,\n faDiagnoses: faDiagnoses,\n faDice: faDice,\n faDiceD20: faDiceD20,\n faDiceD6: faDiceD6,\n faDiceFive: faDiceFive,\n faDiceFour: faDiceFour,\n faDiceOne: faDiceOne,\n faDiceSix: faDiceSix,\n faDiceThree: faDiceThree,\n faDiceTwo: faDiceTwo,\n faDigitalTachograph: faDigitalTachograph,\n faDirections: faDirections,\n faDivide: faDivide,\n faDizzy: faDizzy,\n faDna: faDna,\n faDog: faDog,\n faDollarSign: faDollarSign,\n faDolly: faDolly,\n faDollyFlatbed: faDollyFlatbed,\n faDonate: faDonate,\n faDoorClosed: faDoorClosed,\n faDoorOpen: faDoorOpen,\n faDotCircle: faDotCircle,\n faDove: faDove,\n faDownload: faDownload,\n faDraftingCompass: faDraftingCompass,\n faDragon: faDragon,\n faDrawPolygon: faDrawPolygon,\n faDrum: faDrum,\n faDrumSteelpan: faDrumSteelpan,\n faDrumstickBite: faDrumstickBite,\n faDumbbell: faDumbbell,\n faDumpster: faDumpster,\n faDumpsterFire: faDumpsterFire,\n faDungeon: faDungeon,\n faEdit: faEdit,\n faEgg: faEgg,\n faEject: faEject,\n faEllipsisH: faEllipsisH,\n faEllipsisV: faEllipsisV,\n faEnvelope: faEnvelope,\n faEnvelopeOpen: faEnvelopeOpen,\n faEnvelopeOpenText: faEnvelopeOpenText,\n faEnvelopeSquare: faEnvelopeSquare,\n faEquals: faEquals,\n faEraser: faEraser,\n faEthernet: faEthernet,\n faEuroSign: faEuroSign,\n faExchangeAlt: faExchangeAlt,\n faExclamation: faExclamation,\n faExclamationCircle: faExclamationCircle,\n faExclamationTriangle: faExclamationTriangle,\n faExpand: faExpand,\n faExpandArrowsAlt: faExpandArrowsAlt,\n faExternalLinkAlt: faExternalLinkAlt,\n faExternalLinkSquareAlt: faExternalLinkSquareAlt,\n faEye: faEye,\n faEyeDropper: faEyeDropper,\n faEyeSlash: faEyeSlash,\n faFan: faFan,\n faFastBackward: faFastBackward,\n faFastForward: faFastForward,\n faFax: faFax,\n faFeather: faFeather,\n faFeatherAlt: faFeatherAlt,\n faFemale: faFemale,\n faFighterJet: faFighterJet,\n faFile: faFile,\n faFileAlt: faFileAlt,\n faFileArchive: faFileArchive,\n faFileAudio: faFileAudio,\n faFileCode: faFileCode,\n faFileContract: faFileContract,\n faFileCsv: faFileCsv,\n faFileDownload: faFileDownload,\n faFileExcel: faFileExcel,\n faFileExport: faFileExport,\n faFileImage: faFileImage,\n faFileImport: faFileImport,\n faFileInvoice: faFileInvoice,\n faFileInvoiceDollar: faFileInvoiceDollar,\n faFileMedical: faFileMedical,\n faFileMedicalAlt: faFileMedicalAlt,\n faFilePdf: faFilePdf,\n faFilePowerpoint: faFilePowerpoint,\n faFilePrescription: faFilePrescription,\n faFileSignature: faFileSignature,\n faFileUpload: faFileUpload,\n faFileVideo: faFileVideo,\n faFileWord: faFileWord,\n faFill: faFill,\n faFillDrip: faFillDrip,\n faFilm: faFilm,\n faFilter: faFilter,\n faFingerprint: faFingerprint,\n faFire: faFire,\n faFireAlt: faFireAlt,\n faFireExtinguisher: faFireExtinguisher,\n faFirstAid: faFirstAid,\n faFish: faFish,\n faFistRaised: faFistRaised,\n faFlag: faFlag,\n faFlagCheckered: faFlagCheckered,\n faFlagUsa: faFlagUsa,\n faFlask: faFlask,\n faFlushed: faFlushed,\n faFolder: faFolder,\n faFolderMinus: faFolderMinus,\n faFolderOpen: faFolderOpen,\n faFolderPlus: faFolderPlus,\n faFont: faFont,\n faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n faFootballBall: faFootballBall,\n faForward: faForward,\n faFrog: faFrog,\n faFrown: faFrown,\n faFrownOpen: faFrownOpen,\n faFunnelDollar: faFunnelDollar,\n faFutbol: faFutbol,\n faGamepad: faGamepad,\n faGasPump: faGasPump,\n faGavel: faGavel,\n faGem: faGem,\n faGenderless: faGenderless,\n faGhost: faGhost,\n faGift: faGift,\n faGifts: faGifts,\n faGlassCheers: faGlassCheers,\n faGlassMartini: faGlassMartini,\n faGlassMartiniAlt: faGlassMartiniAlt,\n faGlassWhiskey: faGlassWhiskey,\n faGlasses: faGlasses,\n faGlobe: faGlobe,\n faGlobeAfrica: faGlobeAfrica,\n faGlobeAmericas: faGlobeAmericas,\n faGlobeAsia: faGlobeAsia,\n faGlobeEurope: faGlobeEurope,\n faGolfBall: faGolfBall,\n faGopuram: faGopuram,\n faGraduationCap: faGraduationCap,\n faGreaterThan: faGreaterThan,\n faGreaterThanEqual: faGreaterThanEqual,\n faGrimace: faGrimace,\n faGrin: faGrin,\n faGrinAlt: faGrinAlt,\n faGrinBeam: faGrinBeam,\n faGrinBeamSweat: faGrinBeamSweat,\n faGrinHearts: faGrinHearts,\n faGrinSquint: faGrinSquint,\n faGrinSquintTears: faGrinSquintTears,\n faGrinStars: faGrinStars,\n faGrinTears: faGrinTears,\n faGrinTongue: faGrinTongue,\n faGrinTongueSquint: faGrinTongueSquint,\n faGrinTongueWink: faGrinTongueWink,\n faGrinWink: faGrinWink,\n faGripHorizontal: faGripHorizontal,\n faGripLines: faGripLines,\n faGripLinesVertical: faGripLinesVertical,\n faGripVertical: faGripVertical,\n faGuitar: faGuitar,\n faHSquare: faHSquare,\n faHamburger: faHamburger,\n faHammer: faHammer,\n faHamsa: faHamsa,\n faHandHolding: faHandHolding,\n faHandHoldingHeart: faHandHoldingHeart,\n faHandHoldingUsd: faHandHoldingUsd,\n faHandLizard: faHandLizard,\n faHandMiddleFinger: faHandMiddleFinger,\n faHandPaper: faHandPaper,\n faHandPeace: faHandPeace,\n faHandPointDown: faHandPointDown,\n faHandPointLeft: faHandPointLeft,\n faHandPointRight: faHandPointRight,\n faHandPointUp: faHandPointUp,\n faHandPointer: faHandPointer,\n faHandRock: faHandRock,\n faHandScissors: faHandScissors,\n faHandSpock: faHandSpock,\n faHands: faHands,\n faHandsHelping: faHandsHelping,\n faHandshake: faHandshake,\n faHanukiah: faHanukiah,\n faHardHat: faHardHat,\n faHashtag: faHashtag,\n faHatWizard: faHatWizard,\n faHaykal: faHaykal,\n faHdd: faHdd,\n faHeading: faHeading,\n faHeadphones: faHeadphones,\n faHeadphonesAlt: faHeadphonesAlt,\n faHeadset: faHeadset,\n faHeart: faHeart,\n faHeartBroken: faHeartBroken,\n faHeartbeat: faHeartbeat,\n faHelicopter: faHelicopter,\n faHighlighter: faHighlighter,\n faHiking: faHiking,\n faHippo: faHippo,\n faHistory: faHistory,\n faHockeyPuck: faHockeyPuck,\n faHollyBerry: faHollyBerry,\n faHome: faHome,\n faHorse: faHorse,\n faHorseHead: faHorseHead,\n faHospital: faHospital,\n faHospitalAlt: faHospitalAlt,\n faHospitalSymbol: faHospitalSymbol,\n faHotTub: faHotTub,\n faHotdog: faHotdog,\n faHotel: faHotel,\n faHourglass: faHourglass,\n faHourglassEnd: faHourglassEnd,\n faHourglassHalf: faHourglassHalf,\n faHourglassStart: faHourglassStart,\n faHouseDamage: faHouseDamage,\n faHryvnia: faHryvnia,\n faICursor: faICursor,\n faIceCream: faIceCream,\n faIcicles: faIcicles,\n faIcons: faIcons,\n faIdBadge: faIdBadge,\n faIdCard: faIdCard,\n faIdCardAlt: faIdCardAlt,\n faIgloo: faIgloo,\n faImage: faImage,\n faImages: faImages,\n faInbox: faInbox,\n faIndent: faIndent,\n faIndustry: faIndustry,\n faInfinity: faInfinity,\n faInfo: faInfo,\n faInfoCircle: faInfoCircle,\n faItalic: faItalic,\n faJedi: faJedi,\n faJoint: faJoint,\n faJournalWhills: faJournalWhills,\n faKaaba: faKaaba,\n faKey: faKey,\n faKeyboard: faKeyboard,\n faKhanda: faKhanda,\n faKiss: faKiss,\n faKissBeam: faKissBeam,\n faKissWinkHeart: faKissWinkHeart,\n faKiwiBird: faKiwiBird,\n faLandmark: faLandmark,\n faLanguage: faLanguage,\n faLaptop: faLaptop,\n faLaptopCode: faLaptopCode,\n faLaptopMedical: faLaptopMedical,\n faLaugh: faLaugh,\n faLaughBeam: faLaughBeam,\n faLaughSquint: faLaughSquint,\n faLaughWink: faLaughWink,\n faLayerGroup: faLayerGroup,\n faLeaf: faLeaf,\n faLemon: faLemon,\n faLessThan: faLessThan,\n faLessThanEqual: faLessThanEqual,\n faLevelDownAlt: faLevelDownAlt,\n faLevelUpAlt: faLevelUpAlt,\n faLifeRing: faLifeRing,\n faLightbulb: faLightbulb,\n faLink: faLink,\n faLiraSign: faLiraSign,\n faList: faList,\n faListAlt: faListAlt,\n faListOl: faListOl,\n faListUl: faListUl,\n faLocationArrow: faLocationArrow,\n faLock: faLock,\n faLockOpen: faLockOpen,\n faLongArrowAltDown: faLongArrowAltDown,\n faLongArrowAltLeft: faLongArrowAltLeft,\n faLongArrowAltRight: faLongArrowAltRight,\n faLongArrowAltUp: faLongArrowAltUp,\n faLowVision: faLowVision,\n faLuggageCart: faLuggageCart,\n faMagic: faMagic,\n faMagnet: faMagnet,\n faMailBulk: faMailBulk,\n faMale: faMale,\n faMap: faMap,\n faMapMarked: faMapMarked,\n faMapMarkedAlt: faMapMarkedAlt,\n faMapMarker: faMapMarker,\n faMapMarkerAlt: faMapMarkerAlt,\n faMapPin: faMapPin,\n faMapSigns: faMapSigns,\n faMarker: faMarker,\n faMars: faMars,\n faMarsDouble: faMarsDouble,\n faMarsStroke: faMarsStroke,\n faMarsStrokeH: faMarsStrokeH,\n faMarsStrokeV: faMarsStrokeV,\n faMask: faMask,\n faMedal: faMedal,\n faMedkit: faMedkit,\n faMeh: faMeh,\n faMehBlank: faMehBlank,\n faMehRollingEyes: faMehRollingEyes,\n faMemory: faMemory,\n faMenorah: faMenorah,\n faMercury: faMercury,\n faMeteor: faMeteor,\n faMicrochip: faMicrochip,\n faMicrophone: faMicrophone,\n faMicrophoneAlt: faMicrophoneAlt,\n faMicrophoneAltSlash: faMicrophoneAltSlash,\n faMicrophoneSlash: faMicrophoneSlash,\n faMicroscope: faMicroscope,\n faMinus: faMinus,\n faMinusCircle: faMinusCircle,\n faMinusSquare: faMinusSquare,\n faMitten: faMitten,\n faMobile: faMobile,\n faMobileAlt: faMobileAlt,\n faMoneyBill: faMoneyBill,\n faMoneyBillAlt: faMoneyBillAlt,\n faMoneyBillWave: faMoneyBillWave,\n faMoneyBillWaveAlt: faMoneyBillWaveAlt,\n faMoneyCheck: faMoneyCheck,\n faMoneyCheckAlt: faMoneyCheckAlt,\n faMonument: faMonument,\n faMoon: faMoon,\n faMortarPestle: faMortarPestle,\n faMosque: faMosque,\n faMotorcycle: faMotorcycle,\n faMountain: faMountain,\n faMousePointer: faMousePointer,\n faMugHot: faMugHot,\n faMusic: faMusic,\n faNetworkWired: faNetworkWired,\n faNeuter: faNeuter,\n faNewspaper: faNewspaper,\n faNotEqual: faNotEqual,\n faNotesMedical: faNotesMedical,\n faObjectGroup: faObjectGroup,\n faObjectUngroup: faObjectUngroup,\n faOilCan: faOilCan,\n faOm: faOm,\n faOtter: faOtter,\n faOutdent: faOutdent,\n faPager: faPager,\n faPaintBrush: faPaintBrush,\n faPaintRoller: faPaintRoller,\n faPalette: faPalette,\n faPallet: faPallet,\n faPaperPlane: faPaperPlane,\n faPaperclip: faPaperclip,\n faParachuteBox: faParachuteBox,\n faParagraph: faParagraph,\n faParking: faParking,\n faPassport: faPassport,\n faPastafarianism: faPastafarianism,\n faPaste: faPaste,\n faPause: faPause,\n faPauseCircle: faPauseCircle,\n faPaw: faPaw,\n faPeace: faPeace,\n faPen: faPen,\n faPenAlt: faPenAlt,\n faPenFancy: faPenFancy,\n faPenNib: faPenNib,\n faPenSquare: faPenSquare,\n faPencilAlt: faPencilAlt,\n faPencilRuler: faPencilRuler,\n faPeopleCarry: faPeopleCarry,\n faPepperHot: faPepperHot,\n faPercent: faPercent,\n faPercentage: faPercentage,\n faPersonBooth: faPersonBooth,\n faPhone: faPhone,\n faPhoneAlt: faPhoneAlt,\n faPhoneSlash: faPhoneSlash,\n faPhoneSquare: faPhoneSquare,\n faPhoneSquareAlt: faPhoneSquareAlt,\n faPhoneVolume: faPhoneVolume,\n faPhotoVideo: faPhotoVideo,\n faPiggyBank: faPiggyBank,\n faPills: faPills,\n faPizzaSlice: faPizzaSlice,\n faPlaceOfWorship: faPlaceOfWorship,\n faPlane: faPlane,\n faPlaneArrival: faPlaneArrival,\n faPlaneDeparture: faPlaneDeparture,\n faPlay: faPlay,\n faPlayCircle: faPlayCircle,\n faPlug: faPlug,\n faPlus: faPlus,\n faPlusCircle: faPlusCircle,\n faPlusSquare: faPlusSquare,\n faPodcast: faPodcast,\n faPoll: faPoll,\n faPollH: faPollH,\n faPoo: faPoo,\n faPooStorm: faPooStorm,\n faPoop: faPoop,\n faPortrait: faPortrait,\n faPoundSign: faPoundSign,\n faPowerOff: faPowerOff,\n faPray: faPray,\n faPrayingHands: faPrayingHands,\n faPrescription: faPrescription,\n faPrescriptionBottle: faPrescriptionBottle,\n faPrescriptionBottleAlt: faPrescriptionBottleAlt,\n faPrint: faPrint,\n faProcedures: faProcedures,\n faProjectDiagram: faProjectDiagram,\n faPuzzlePiece: faPuzzlePiece,\n faQrcode: faQrcode,\n faQuestion: faQuestion,\n faQuestionCircle: faQuestionCircle,\n faQuidditch: faQuidditch,\n faQuoteLeft: faQuoteLeft,\n faQuoteRight: faQuoteRight,\n faQuran: faQuran,\n faRadiation: faRadiation,\n faRadiationAlt: faRadiationAlt,\n faRainbow: faRainbow,\n faRandom: faRandom,\n faReceipt: faReceipt,\n faRecycle: faRecycle,\n faRedo: faRedo,\n faRedoAlt: faRedoAlt,\n faRegistered: faRegistered,\n faRemoveFormat: faRemoveFormat,\n faReply: faReply,\n faReplyAll: faReplyAll,\n faRepublican: faRepublican,\n faRestroom: faRestroom,\n faRetweet: faRetweet,\n faRibbon: faRibbon,\n faRing: faRing,\n faRoad: faRoad,\n faRobot: faRobot,\n faRocket: faRocket,\n faRoute: faRoute,\n faRss: faRss,\n faRssSquare: faRssSquare,\n faRubleSign: faRubleSign,\n faRuler: faRuler,\n faRulerCombined: faRulerCombined,\n faRulerHorizontal: faRulerHorizontal,\n faRulerVertical: faRulerVertical,\n faRunning: faRunning,\n faRupeeSign: faRupeeSign,\n faSadCry: faSadCry,\n faSadTear: faSadTear,\n faSatellite: faSatellite,\n faSatelliteDish: faSatelliteDish,\n faSave: faSave,\n faSchool: faSchool,\n faScrewdriver: faScrewdriver,\n faScroll: faScroll,\n faSdCard: faSdCard,\n faSearch: faSearch,\n faSearchDollar: faSearchDollar,\n faSearchLocation: faSearchLocation,\n faSearchMinus: faSearchMinus,\n faSearchPlus: faSearchPlus,\n faSeedling: faSeedling,\n faServer: faServer,\n faShapes: faShapes,\n faShare: faShare,\n faShareAlt: faShareAlt,\n faShareAltSquare: faShareAltSquare,\n faShareSquare: faShareSquare,\n faShekelSign: faShekelSign,\n faShieldAlt: faShieldAlt,\n faShip: faShip,\n faShippingFast: faShippingFast,\n faShoePrints: faShoePrints,\n faShoppingBag: faShoppingBag,\n faShoppingBasket: faShoppingBasket,\n faShoppingCart: faShoppingCart,\n faShower: faShower,\n faShuttleVan: faShuttleVan,\n faSign: faSign,\n faSignInAlt: faSignInAlt,\n faSignLanguage: faSignLanguage,\n faSignOutAlt: faSignOutAlt,\n faSignal: faSignal,\n faSignature: faSignature,\n faSimCard: faSimCard,\n faSitemap: faSitemap,\n faSkating: faSkating,\n faSkiing: faSkiing,\n faSkiingNordic: faSkiingNordic,\n faSkull: faSkull,\n faSkullCrossbones: faSkullCrossbones,\n faSlash: faSlash,\n faSleigh: faSleigh,\n faSlidersH: faSlidersH,\n faSmile: faSmile,\n faSmileBeam: faSmileBeam,\n faSmileWink: faSmileWink,\n faSmog: faSmog,\n faSmoking: faSmoking,\n faSmokingBan: faSmokingBan,\n faSms: faSms,\n faSnowboarding: faSnowboarding,\n faSnowflake: faSnowflake,\n faSnowman: faSnowman,\n faSnowplow: faSnowplow,\n faSocks: faSocks,\n faSolarPanel: faSolarPanel,\n faSort: faSort,\n faSortAlphaDown: faSortAlphaDown,\n faSortAlphaDownAlt: faSortAlphaDownAlt,\n faSortAlphaUp: faSortAlphaUp,\n faSortAlphaUpAlt: faSortAlphaUpAlt,\n faSortAmountDown: faSortAmountDown,\n faSortAmountDownAlt: faSortAmountDownAlt,\n faSortAmountUp: faSortAmountUp,\n faSortAmountUpAlt: faSortAmountUpAlt,\n faSortDown: faSortDown,\n faSortNumericDown: faSortNumericDown,\n faSortNumericDownAlt: faSortNumericDownAlt,\n faSortNumericUp: faSortNumericUp,\n faSortNumericUpAlt: faSortNumericUpAlt,\n faSortUp: faSortUp,\n faSpa: faSpa,\n faSpaceShuttle: faSpaceShuttle,\n faSpellCheck: faSpellCheck,\n faSpider: faSpider,\n faSpinner: faSpinner,\n faSplotch: faSplotch,\n faSprayCan: faSprayCan,\n faSquare: faSquare,\n faSquareFull: faSquareFull,\n faSquareRootAlt: faSquareRootAlt,\n faStamp: faStamp,\n faStar: faStar,\n faStarAndCrescent: faStarAndCrescent,\n faStarHalf: faStarHalf,\n faStarHalfAlt: faStarHalfAlt,\n faStarOfDavid: faStarOfDavid,\n faStarOfLife: faStarOfLife,\n faStepBackward: faStepBackward,\n faStepForward: faStepForward,\n faStethoscope: faStethoscope,\n faStickyNote: faStickyNote,\n faStop: faStop,\n faStopCircle: faStopCircle,\n faStopwatch: faStopwatch,\n faStore: faStore,\n faStoreAlt: faStoreAlt,\n faStream: faStream,\n faStreetView: faStreetView,\n faStrikethrough: faStrikethrough,\n faStroopwafel: faStroopwafel,\n faSubscript: faSubscript,\n faSubway: faSubway,\n faSuitcase: faSuitcase,\n faSuitcaseRolling: faSuitcaseRolling,\n faSun: faSun,\n faSuperscript: faSuperscript,\n faSurprise: faSurprise,\n faSwatchbook: faSwatchbook,\n faSwimmer: faSwimmer,\n faSwimmingPool: faSwimmingPool,\n faSynagogue: faSynagogue,\n faSync: faSync,\n faSyncAlt: faSyncAlt,\n faSyringe: faSyringe,\n faTable: faTable,\n faTableTennis: faTableTennis,\n faTablet: faTablet,\n faTabletAlt: faTabletAlt,\n faTablets: faTablets,\n faTachometerAlt: faTachometerAlt,\n faTag: faTag,\n faTags: faTags,\n faTape: faTape,\n faTasks: faTasks,\n faTaxi: faTaxi,\n faTeeth: faTeeth,\n faTeethOpen: faTeethOpen,\n faTemperatureHigh: faTemperatureHigh,\n faTemperatureLow: faTemperatureLow,\n faTenge: faTenge,\n faTerminal: faTerminal,\n faTextHeight: faTextHeight,\n faTextWidth: faTextWidth,\n faTh: faTh,\n faThLarge: faThLarge,\n faThList: faThList,\n faTheaterMasks: faTheaterMasks,\n faThermometer: faThermometer,\n faThermometerEmpty: faThermometerEmpty,\n faThermometerFull: faThermometerFull,\n faThermometerHalf: faThermometerHalf,\n faThermometerQuarter: faThermometerQuarter,\n faThermometerThreeQuarters: faThermometerThreeQuarters,\n faThumbsDown: faThumbsDown,\n faThumbsUp: faThumbsUp,\n faThumbtack: faThumbtack,\n faTicketAlt: faTicketAlt,\n faTimes: faTimes,\n faTimesCircle: faTimesCircle,\n faTint: faTint,\n faTintSlash: faTintSlash,\n faTired: faTired,\n faToggleOff: faToggleOff,\n faToggleOn: faToggleOn,\n faToilet: faToilet,\n faToiletPaper: faToiletPaper,\n faToolbox: faToolbox,\n faTools: faTools,\n faTooth: faTooth,\n faTorah: faTorah,\n faToriiGate: faToriiGate,\n faTractor: faTractor,\n faTrademark: faTrademark,\n faTrafficLight: faTrafficLight,\n faTrain: faTrain,\n faTram: faTram,\n faTransgender: faTransgender,\n faTransgenderAlt: faTransgenderAlt,\n faTrash: faTrash,\n faTrashAlt: faTrashAlt,\n faTrashRestore: faTrashRestore,\n faTrashRestoreAlt: faTrashRestoreAlt,\n faTree: faTree,\n faTrophy: faTrophy,\n faTruck: faTruck,\n faTruckLoading: faTruckLoading,\n faTruckMonster: faTruckMonster,\n faTruckMoving: faTruckMoving,\n faTruckPickup: faTruckPickup,\n faTshirt: faTshirt,\n faTty: faTty,\n faTv: faTv,\n faUmbrella: faUmbrella,\n faUmbrellaBeach: faUmbrellaBeach,\n faUnderline: faUnderline,\n faUndo: faUndo,\n faUndoAlt: faUndoAlt,\n faUniversalAccess: faUniversalAccess,\n faUniversity: faUniversity,\n faUnlink: faUnlink,\n faUnlock: faUnlock,\n faUnlockAlt: faUnlockAlt,\n faUpload: faUpload,\n faUser: faUser,\n faUserAlt: faUserAlt,\n faUserAltSlash: faUserAltSlash,\n faUserAstronaut: faUserAstronaut,\n faUserCheck: faUserCheck,\n faUserCircle: faUserCircle,\n faUserClock: faUserClock,\n faUserCog: faUserCog,\n faUserEdit: faUserEdit,\n faUserFriends: faUserFriends,\n faUserGraduate: faUserGraduate,\n faUserInjured: faUserInjured,\n faUserLock: faUserLock,\n faUserMd: faUserMd,\n faUserMinus: faUserMinus,\n faUserNinja: faUserNinja,\n faUserNurse: faUserNurse,\n faUserPlus: faUserPlus,\n faUserSecret: faUserSecret,\n faUserShield: faUserShield,\n faUserSlash: faUserSlash,\n faUserTag: faUserTag,\n faUserTie: faUserTie,\n faUserTimes: faUserTimes,\n faUsers: faUsers,\n faUsersCog: faUsersCog,\n faUtensilSpoon: faUtensilSpoon,\n faUtensils: faUtensils,\n faVectorSquare: faVectorSquare,\n faVenus: faVenus,\n faVenusDouble: faVenusDouble,\n faVenusMars: faVenusMars,\n faVial: faVial,\n faVials: faVials,\n faVideo: faVideo,\n faVideoSlash: faVideoSlash,\n faVihara: faVihara,\n faVoicemail: faVoicemail,\n faVolleyballBall: faVolleyballBall,\n faVolumeDown: faVolumeDown,\n faVolumeMute: faVolumeMute,\n faVolumeOff: faVolumeOff,\n faVolumeUp: faVolumeUp,\n faVoteYea: faVoteYea,\n faVrCardboard: faVrCardboard,\n faWalking: faWalking,\n faWallet: faWallet,\n faWarehouse: faWarehouse,\n faWater: faWater,\n faWaveSquare: faWaveSquare,\n faWeight: faWeight,\n faWeightHanging: faWeightHanging,\n faWheelchair: faWheelchair,\n faWifi: faWifi,\n faWind: faWind,\n faWindowClose: faWindowClose,\n faWindowMaximize: faWindowMaximize,\n faWindowMinimize: faWindowMinimize,\n faWindowRestore: faWindowRestore,\n faWineBottle: faWineBottle,\n faWineGlass: faWineGlass,\n faWineGlassAlt: faWineGlassAlt,\n faWonSign: faWonSign,\n faWrench: faWrench,\n faXRay: faXRay,\n faYenSign: faYenSign,\n faYinYang: faYinYang\n};\n\nexport { _iconsCache as fas, prefix, faAd, faAddressBook, faAddressCard, faAdjust, faAirFreshener, faAlignCenter, faAlignJustify, faAlignLeft, faAlignRight, faAllergies, faAmbulance, faAmericanSignLanguageInterpreting, faAnchor, faAngleDoubleDown, faAngleDoubleLeft, faAngleDoubleRight, faAngleDoubleUp, faAngleDown, faAngleLeft, faAngleRight, faAngleUp, faAngry, faAnkh, faAppleAlt, faArchive, faArchway, faArrowAltCircleDown, faArrowAltCircleLeft, faArrowAltCircleRight, faArrowAltCircleUp, faArrowCircleDown, faArrowCircleLeft, faArrowCircleRight, faArrowCircleUp, faArrowDown, faArrowLeft, faArrowRight, faArrowUp, faArrowsAlt, faArrowsAltH, faArrowsAltV, faAssistiveListeningSystems, faAsterisk, faAt, faAtlas, faAtom, faAudioDescription, faAward, faBaby, faBabyCarriage, faBackspace, faBackward, faBacon, faBalanceScale, faBalanceScaleLeft, faBalanceScaleRight, faBan, faBandAid, faBarcode, faBars, faBaseballBall, faBasketballBall, faBath, faBatteryEmpty, faBatteryFull, faBatteryHalf, faBatteryQuarter, faBatteryThreeQuarters, faBed, faBeer, faBell, faBellSlash, faBezierCurve, faBible, faBicycle, faBiking, faBinoculars, faBiohazard, faBirthdayCake, faBlender, faBlenderPhone, faBlind, faBlog, faBold, faBolt, faBomb, faBone, faBong, faBook, faBookDead, faBookMedical, faBookOpen, faBookReader, faBookmark, faBorderAll, faBorderNone, faBorderStyle, faBowlingBall, faBox, faBoxOpen, faBoxes, faBraille, faBrain, faBreadSlice, faBriefcase, faBriefcaseMedical, faBroadcastTower, faBroom, faBrush, faBug, faBuilding, faBullhorn, faBullseye, faBurn, faBus, faBusAlt, faBusinessTime, faCalculator, faCalendar, faCalendarAlt, faCalendarCheck, faCalendarDay, faCalendarMinus, faCalendarPlus, faCalendarTimes, faCalendarWeek, faCamera, faCameraRetro, faCampground, faCandyCane, faCannabis, faCapsules, faCar, faCarAlt, faCarBattery, faCarCrash, faCarSide, faCaretDown, faCaretLeft, faCaretRight, faCaretSquareDown, faCaretSquareLeft, faCaretSquareRight, faCaretSquareUp, faCaretUp, faCarrot, faCartArrowDown, faCartPlus, faCashRegister, faCat, faCertificate, faChair, faChalkboard, faChalkboardTeacher, faChargingStation, faChartArea, faChartBar, faChartLine, faChartPie, faCheck, faCheckCircle, faCheckDouble, faCheckSquare, faCheese, faChess, faChessBishop, faChessBoard, faChessKing, faChessKnight, faChessPawn, faChessQueen, faChessRook, faChevronCircleDown, faChevronCircleLeft, faChevronCircleRight, faChevronCircleUp, faChevronDown, faChevronLeft, faChevronRight, faChevronUp, faChild, faChurch, faCircle, faCircleNotch, faCity, faClinicMedical, faClipboard, faClipboardCheck, faClipboardList, faClock, faClone, faClosedCaptioning, faCloud, faCloudDownloadAlt, faCloudMeatball, faCloudMoon, faCloudMoonRain, faCloudRain, faCloudShowersHeavy, faCloudSun, faCloudSunRain, faCloudUploadAlt, faCocktail, faCode, faCodeBranch, faCoffee, faCog, faCogs, faCoins, faColumns, faComment, faCommentAlt, faCommentDollar, faCommentDots, faCommentMedical, faCommentSlash, faComments, faCommentsDollar, faCompactDisc, faCompass, faCompress, faCompressArrowsAlt, faConciergeBell, faCookie, faCookieBite, faCopy, faCopyright, faCouch, faCreditCard, faCrop, faCropAlt, faCross, faCrosshairs, faCrow, faCrown, faCrutch, faCube, faCubes, faCut, faDatabase, faDeaf, faDemocrat, faDesktop, faDharmachakra, faDiagnoses, faDice, faDiceD20, faDiceD6, faDiceFive, faDiceFour, faDiceOne, faDiceSix, faDiceThree, faDiceTwo, faDigitalTachograph, faDirections, faDivide, faDizzy, faDna, faDog, faDollarSign, faDolly, faDollyFlatbed, faDonate, faDoorClosed, faDoorOpen, faDotCircle, faDove, faDownload, faDraftingCompass, faDragon, faDrawPolygon, faDrum, faDrumSteelpan, faDrumstickBite, faDumbbell, faDumpster, faDumpsterFire, faDungeon, faEdit, faEgg, faEject, faEllipsisH, faEllipsisV, faEnvelope, faEnvelopeOpen, faEnvelopeOpenText, faEnvelopeSquare, faEquals, faEraser, faEthernet, faEuroSign, faExchangeAlt, faExclamation, faExclamationCircle, faExclamationTriangle, faExpand, faExpandArrowsAlt, faExternalLinkAlt, faExternalLinkSquareAlt, faEye, faEyeDropper, faEyeSlash, faFan, faFastBackward, faFastForward, faFax, faFeather, faFeatherAlt, faFemale, faFighterJet, faFile, faFileAlt, faFileArchive, faFileAudio, faFileCode, faFileContract, faFileCsv, faFileDownload, faFileExcel, faFileExport, faFileImage, faFileImport, faFileInvoice, faFileInvoiceDollar, faFileMedical, faFileMedicalAlt, faFilePdf, faFilePowerpoint, faFilePrescription, faFileSignature, faFileUpload, faFileVideo, faFileWord, faFill, faFillDrip, faFilm, faFilter, faFingerprint, faFire, faFireAlt, faFireExtinguisher, faFirstAid, faFish, faFistRaised, faFlag, faFlagCheckered, faFlagUsa, faFlask, faFlushed, faFolder, faFolderMinus, faFolderOpen, faFolderPlus, faFont, faFontAwesomeLogoFull, faFootballBall, faForward, faFrog, faFrown, faFrownOpen, faFunnelDollar, faFutbol, faGamepad, faGasPump, faGavel, faGem, faGenderless, faGhost, faGift, faGifts, faGlassCheers, faGlassMartini, faGlassMartiniAlt, faGlassWhiskey, faGlasses, faGlobe, faGlobeAfrica, faGlobeAmericas, faGlobeAsia, faGlobeEurope, faGolfBall, faGopuram, faGraduationCap, faGreaterThan, faGreaterThanEqual, faGrimace, faGrin, faGrinAlt, faGrinBeam, faGrinBeamSweat, faGrinHearts, faGrinSquint, faGrinSquintTears, faGrinStars, faGrinTears, faGrinTongue, faGrinTongueSquint, faGrinTongueWink, faGrinWink, faGripHorizontal, faGripLines, faGripLinesVertical, faGripVertical, faGuitar, faHSquare, faHamburger, faHammer, faHamsa, faHandHolding, faHandHoldingHeart, faHandHoldingUsd, faHandLizard, faHandMiddleFinger, faHandPaper, faHandPeace, faHandPointDown, faHandPointLeft, faHandPointRight, faHandPointUp, faHandPointer, faHandRock, faHandScissors, faHandSpock, faHands, faHandsHelping, faHandshake, faHanukiah, faHardHat, faHashtag, faHatWizard, faHaykal, faHdd, faHeading, faHeadphones, faHeadphonesAlt, faHeadset, faHeart, faHeartBroken, faHeartbeat, faHelicopter, faHighlighter, faHiking, faHippo, faHistory, faHockeyPuck, faHollyBerry, faHome, faHorse, faHorseHead, faHospital, faHospitalAlt, faHospitalSymbol, faHotTub, faHotdog, faHotel, faHourglass, faHourglassEnd, faHourglassHalf, faHourglassStart, faHouseDamage, faHryvnia, faICursor, faIceCream, faIcicles, faIcons, faIdBadge, faIdCard, faIdCardAlt, faIgloo, faImage, faImages, faInbox, faIndent, faIndustry, faInfinity, faInfo, faInfoCircle, faItalic, faJedi, faJoint, faJournalWhills, faKaaba, faKey, faKeyboard, faKhanda, faKiss, faKissBeam, faKissWinkHeart, faKiwiBird, faLandmark, faLanguage, faLaptop, faLaptopCode, faLaptopMedical, faLaugh, faLaughBeam, faLaughSquint, faLaughWink, faLayerGroup, faLeaf, faLemon, faLessThan, faLessThanEqual, faLevelDownAlt, faLevelUpAlt, faLifeRing, faLightbulb, faLink, faLiraSign, faList, faListAlt, faListOl, faListUl, faLocationArrow, faLock, faLockOpen, faLongArrowAltDown, faLongArrowAltLeft, faLongArrowAltRight, faLongArrowAltUp, faLowVision, faLuggageCart, faMagic, faMagnet, faMailBulk, faMale, faMap, faMapMarked, faMapMarkedAlt, faMapMarker, faMapMarkerAlt, faMapPin, faMapSigns, faMarker, faMars, faMarsDouble, faMarsStroke, faMarsStrokeH, faMarsStrokeV, faMask, faMedal, faMedkit, faMeh, faMehBlank, faMehRollingEyes, faMemory, faMenorah, faMercury, faMeteor, faMicrochip, faMicrophone, faMicrophoneAlt, faMicrophoneAltSlash, faMicrophoneSlash, faMicroscope, faMinus, faMinusCircle, faMinusSquare, faMitten, faMobile, faMobileAlt, faMoneyBill, faMoneyBillAlt, faMoneyBillWave, faMoneyBillWaveAlt, faMoneyCheck, faMoneyCheckAlt, faMonument, faMoon, faMortarPestle, faMosque, faMotorcycle, faMountain, faMousePointer, faMugHot, faMusic, faNetworkWired, faNeuter, faNewspaper, faNotEqual, faNotesMedical, faObjectGroup, faObjectUngroup, faOilCan, faOm, faOtter, faOutdent, faPager, faPaintBrush, faPaintRoller, faPalette, faPallet, faPaperPlane, faPaperclip, faParachuteBox, faParagraph, faParking, faPassport, faPastafarianism, faPaste, faPause, faPauseCircle, faPaw, faPeace, faPen, faPenAlt, faPenFancy, faPenNib, faPenSquare, faPencilAlt, faPencilRuler, faPeopleCarry, faPepperHot, faPercent, faPercentage, faPersonBooth, faPhone, faPhoneAlt, faPhoneSlash, faPhoneSquare, faPhoneSquareAlt, faPhoneVolume, faPhotoVideo, faPiggyBank, faPills, faPizzaSlice, faPlaceOfWorship, faPlane, faPlaneArrival, faPlaneDeparture, faPlay, faPlayCircle, faPlug, faPlus, faPlusCircle, faPlusSquare, faPodcast, faPoll, faPollH, faPoo, faPooStorm, faPoop, faPortrait, faPoundSign, faPowerOff, faPray, faPrayingHands, faPrescription, faPrescriptionBottle, faPrescriptionBottleAlt, faPrint, faProcedures, faProjectDiagram, faPuzzlePiece, faQrcode, faQuestion, faQuestionCircle, faQuidditch, faQuoteLeft, faQuoteRight, faQuran, faRadiation, faRadiationAlt, faRainbow, faRandom, faReceipt, faRecycle, faRedo, faRedoAlt, faRegistered, faRemoveFormat, faReply, faReplyAll, faRepublican, faRestroom, faRetweet, faRibbon, faRing, faRoad, faRobot, faRocket, faRoute, faRss, faRssSquare, faRubleSign, faRuler, faRulerCombined, faRulerHorizontal, faRulerVertical, faRunning, faRupeeSign, faSadCry, faSadTear, faSatellite, faSatelliteDish, faSave, faSchool, faScrewdriver, faScroll, faSdCard, faSearch, faSearchDollar, faSearchLocation, faSearchMinus, faSearchPlus, faSeedling, faServer, faShapes, faShare, faShareAlt, faShareAltSquare, faShareSquare, faShekelSign, faShieldAlt, faShip, faShippingFast, faShoePrints, faShoppingBag, faShoppingBasket, faShoppingCart, faShower, faShuttleVan, faSign, faSignInAlt, faSignLanguage, faSignOutAlt, faSignal, faSignature, faSimCard, faSitemap, faSkating, faSkiing, faSkiingNordic, faSkull, faSkullCrossbones, faSlash, faSleigh, faSlidersH, faSmile, faSmileBeam, faSmileWink, faSmog, faSmoking, faSmokingBan, faSms, faSnowboarding, faSnowflake, faSnowman, faSnowplow, faSocks, faSolarPanel, faSort, faSortAlphaDown, faSortAlphaDownAlt, faSortAlphaUp, faSortAlphaUpAlt, faSortAmountDown, faSortAmountDownAlt, faSortAmountUp, faSortAmountUpAlt, faSortDown, faSortNumericDown, faSortNumericDownAlt, faSortNumericUp, faSortNumericUpAlt, faSortUp, faSpa, faSpaceShuttle, faSpellCheck, faSpider, faSpinner, faSplotch, faSprayCan, faSquare, faSquareFull, faSquareRootAlt, faStamp, faStar, faStarAndCrescent, faStarHalf, faStarHalfAlt, faStarOfDavid, faStarOfLife, faStepBackward, faStepForward, faStethoscope, faStickyNote, faStop, faStopCircle, faStopwatch, faStore, faStoreAlt, faStream, faStreetView, faStrikethrough, faStroopwafel, faSubscript, faSubway, faSuitcase, faSuitcaseRolling, faSun, faSuperscript, faSurprise, faSwatchbook, faSwimmer, faSwimmingPool, faSynagogue, faSync, faSyncAlt, faSyringe, faTable, faTableTennis, faTablet, faTabletAlt, faTablets, faTachometerAlt, faTag, faTags, faTape, faTasks, faTaxi, faTeeth, faTeethOpen, faTemperatureHigh, faTemperatureLow, faTenge, faTerminal, faTextHeight, faTextWidth, faTh, faThLarge, faThList, faTheaterMasks, faThermometer, faThermometerEmpty, faThermometerFull, faThermometerHalf, faThermometerQuarter, faThermometerThreeQuarters, faThumbsDown, faThumbsUp, faThumbtack, faTicketAlt, faTimes, faTimesCircle, faTint, faTintSlash, faTired, faToggleOff, faToggleOn, faToilet, faToiletPaper, faToolbox, faTools, faTooth, faTorah, faToriiGate, faTractor, faTrademark, faTrafficLight, faTrain, faTram, faTransgender, faTransgenderAlt, faTrash, faTrashAlt, faTrashRestore, faTrashRestoreAlt, faTree, faTrophy, faTruck, faTruckLoading, faTruckMonster, faTruckMoving, faTruckPickup, faTshirt, faTty, faTv, faUmbrella, faUmbrellaBeach, faUnderline, faUndo, faUndoAlt, faUniversalAccess, faUniversity, faUnlink, faUnlock, faUnlockAlt, faUpload, faUser, faUserAlt, faUserAltSlash, faUserAstronaut, faUserCheck, faUserCircle, faUserClock, faUserCog, faUserEdit, faUserFriends, faUserGraduate, faUserInjured, faUserLock, faUserMd, faUserMinus, faUserNinja, faUserNurse, faUserPlus, faUserSecret, faUserShield, faUserSlash, faUserTag, faUserTie, faUserTimes, faUsers, faUsersCog, faUtensilSpoon, faUtensils, faVectorSquare, faVenus, faVenusDouble, faVenusMars, faVial, faVials, faVideo, faVideoSlash, faVihara, faVoicemail, faVolleyballBall, faVolumeDown, faVolumeMute, faVolumeOff, faVolumeUp, faVoteYea, faVrCardboard, faWalking, faWallet, faWarehouse, faWater, faWaveSquare, faWeight, faWeightHanging, faWheelchair, faWifi, faWind, faWindowClose, faWindowMaximize, faWindowMinimize, faWindowRestore, faWineBottle, faWineGlass, faWineGlassAlt, faWonSign, faWrench, faXRay, faYenSign, faYinYang };\n", + "import { parse, icon } from '@fortawesome/fontawesome-svg-core';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar humps = createCommonjsModule(function (module) {\n(function(global) {\n\n var _processKeys = function(convert, obj, options) {\n if(!_isObject(obj) || _isDate(obj) || _isRegExp(obj) || _isBoolean(obj) || _isFunction(obj)) {\n return obj;\n }\n\n var output,\n i = 0,\n l = 0;\n\n if(_isArray(obj)) {\n output = [];\n for(l=obj.length; i 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (typeof element === 'string') {\n return element;\n }\n\n var children = (element.children || []).map(function (child) {\n return convert(createElement, child);\n });\n var mixins = Object.keys(element.attributes || {}).reduce(function (acc, key) {\n var val = element.attributes[key];\n\n switch (key) {\n case 'class':\n acc.attrs['className'] = val;\n delete element.attributes['class'];\n break;\n\n case 'style':\n acc.attrs['style'] = styleToObject(val);\n break;\n\n default:\n if (key.indexOf('aria-') === 0 || key.indexOf('data-') === 0) {\n acc.attrs[key.toLowerCase()] = val;\n } else {\n acc.attrs[humps.camelize(key)] = val;\n }\n\n }\n\n return acc;\n }, {\n attrs: {}\n });\n\n var _extraProps$style = extraProps.style,\n existingStyle = _extraProps$style === void 0 ? {} : _extraProps$style,\n remaining = _objectWithoutProperties(extraProps, [\"style\"]);\n\n mixins.attrs['style'] = _objectSpread({}, mixins.attrs['style'], existingStyle);\n return createElement.apply(void 0, [element.tag, _objectSpread({}, mixins.attrs, remaining)].concat(_toConsumableArray(children)));\n}\n\nvar PRODUCTION = false;\n\ntry {\n PRODUCTION = process.env.NODE_ENV === 'production';\n} catch (e) {}\n\nfunction log () {\n if (!PRODUCTION && console && typeof console.error === 'function') {\n var _console;\n\n (_console = console).error.apply(_console, arguments);\n }\n}\n\nfunction objectWithKey(key, value) {\n return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? _defineProperty({}, key, value) : {};\n}\n\nfunction classList(props) {\n var _classes;\n\n var classes = (_classes = {\n 'fa-spin': props.spin,\n 'fa-pulse': props.pulse,\n 'fa-fw': props.fixedWidth,\n 'fa-inverse': props.inverse,\n 'fa-border': props.border,\n 'fa-li': props.listItem,\n 'fa-flip-horizontal': props.flip === 'horizontal' || props.flip === 'both',\n 'fa-flip-vertical': props.flip === 'vertical' || props.flip === 'both'\n }, _defineProperty(_classes, \"fa-\".concat(props.size), props.size !== null), _defineProperty(_classes, \"fa-rotate-\".concat(props.rotation), props.rotation !== null), _defineProperty(_classes, \"fa-pull-\".concat(props.pull), props.pull !== null), _classes);\n return Object.keys(classes).map(function (key) {\n return classes[key] ? key : null;\n }).filter(function (key) {\n return key;\n });\n}\n\nfunction normalizeIconArgs(icon$$1) {\n if (icon$$1 === null) {\n return null;\n }\n\n if (_typeof(icon$$1) === 'object' && icon$$1.prefix && icon$$1.iconName) {\n return icon$$1;\n }\n\n if (Array.isArray(icon$$1) && icon$$1.length === 2) {\n return {\n prefix: icon$$1[0],\n iconName: icon$$1[1]\n };\n }\n\n if (typeof icon$$1 === 'string') {\n return {\n prefix: 'fas',\n iconName: icon$$1\n };\n }\n}\n\nfunction FontAwesomeIcon(props) {\n var iconArgs = props.icon,\n maskArgs = props.mask,\n symbol = props.symbol,\n className = props.className,\n title = props.title;\n var iconLookup = normalizeIconArgs(iconArgs);\n var classes = objectWithKey('classes', [].concat(_toConsumableArray(classList(props)), _toConsumableArray(className.split(' '))));\n var transform = objectWithKey('transform', typeof props.transform === 'string' ? parse.transform(props.transform) : props.transform);\n var mask = objectWithKey('mask', normalizeIconArgs(maskArgs));\n var renderedIcon = icon(iconLookup, _objectSpread({}, classes, transform, mask, {\n symbol: symbol,\n title: title\n }));\n\n if (!renderedIcon) {\n log('Could not find icon', iconLookup);\n return null;\n }\n\n var abstract = renderedIcon.abstract;\n var extraProps = {};\n Object.keys(props).forEach(function (key) {\n if (!FontAwesomeIcon.defaultProps.hasOwnProperty(key)) {\n extraProps[key] = props[key];\n }\n });\n return convertCurry(abstract[0], extraProps);\n}\nFontAwesomeIcon.displayName = 'FontAwesomeIcon';\nFontAwesomeIcon.propTypes = {\n border: PropTypes.bool,\n className: PropTypes.string,\n mask: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n fixedWidth: PropTypes.bool,\n inverse: PropTypes.bool,\n flip: PropTypes.oneOf(['horizontal', 'vertical', 'both']),\n icon: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n listItem: PropTypes.bool,\n pull: PropTypes.oneOf(['right', 'left']),\n pulse: PropTypes.bool,\n rotation: PropTypes.oneOf([90, 180, 270]),\n size: PropTypes.oneOf(['lg', 'xs', 'sm', '1x', '2x', '3x', '4x', '5x', '6x', '7x', '8x', '9x', '10x']),\n spin: PropTypes.bool,\n symbol: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n title: PropTypes.string,\n transform: PropTypes.oneOfType([PropTypes.string, PropTypes.object])\n};\nFontAwesomeIcon.defaultProps = {\n border: false,\n className: '',\n mask: null,\n fixedWidth: false,\n inverse: false,\n flip: null,\n icon: null,\n listItem: false,\n pull: null,\n pulse: false,\n rotation: null,\n size: null,\n spin: false,\n symbol: false,\n title: '',\n transform: null\n};\nvar convertCurry = convert.bind(null, React.createElement);\n\nexport { FontAwesomeIcon };\n", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar _Paper = _interopRequireDefault(require(\"../Paper\"));\n\n// @inheritedComponent Paper\nvar styles = function styles(theme) {\n var backgroundColorDefault = theme.palette.type === 'light' ? theme.palette.grey[100] : theme.palette.grey[900];\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n boxSizing: 'border-box',\n // Prevent padding issue with the Modal and fixed positioned AppBar.\n zIndex: theme.zIndex.appBar,\n flexShrink: 0\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`position=\"fixed\"` + ("`" + `. */\n positionFixed: {\n position: 'fixed',\n top: 0,\n left: 'auto',\n right: 0\n },\n\n /* Styles applied to the root element if `)) + (("`" + `position=\"absolute\"`) + ("`" + `. */\n positionAbsolute: {\n position: 'absolute',\n top: 0,\n left: 'auto',\n right: 0\n },\n\n /* Styles applied to the root element if `))))) + (((("`" + (`position=\"sticky\"` + "`")) + (`. */\n positionSticky: {\n position: 'sticky',\n top: 0,\n left: 'auto',\n right: 0\n },\n\n /* Styles applied to the root element if ` + ("`" + `position=\"static\"`))) + (("`" + (`. */\n positionStatic: {\n position: 'static'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`position=\"relative\"` + ("`" + `. */\n positionRelative: {\n position: 'relative'\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + (`color=\"default\"` + "`")) + (`. */\n colorDefault: {\n backgroundColor: backgroundColorDefault,\n color: theme.palette.getContrastText(backgroundColorDefault)\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"primary\"`))) + (("`" + (`. */\n colorPrimary: {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText\n },\n\n /* Styles applied to the root element if ` + "`")) + ((`color=\"secondary\"` + "`") + (`. */\n colorSecondary: {\n backgroundColor: theme.palette.secondary.main,\n color: theme.palette.secondary.contrastText\n }\n };\n};\n\nexports.styles = styles;\n\nfunction AppBar(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n color = props.color,\n position = props.position,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"color\", \"position\"]);\n var className = (0, _classnames.default)(classes.root, classes[\"position\".concat((0, _helpers.capitalize)(position))], (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'inherit'), (0, _defineProperty2.default)(_classNames, 'mui-fixed', position === 'fixed'), _classNames), classNameProp);\n return _react.default.createElement(_Paper.default, (0, _extends2.default)({\n square: true,\n component: \"header\",\n elevation: 4,\n className: className\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? AppBar.propTypes = {\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['inherit', 'primary', 'secondary', 'default']),\n\n /**\r\n * The positioning type. The behavior of the different options is described\r\n * [in the MDN web docs](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Positioning).\r\n * Note: ` + "`")))))))) + (((((((`sticky` + ("`" + ` is not universally supported and will fall back to `)) + ("`" + (`static` + "`"))) + ((` when unavailable.\r\n */\n position: _propTypes.default.oneOf(['fixed', 'absolute', 'sticky', 'static', 'relative'])\n} : void 0;\nAppBar.defaultProps = {\n color: 'primary',\n position: 'fixed'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiAppBar'\n})(AppBar);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _AppBar.default;\n }\n});\n\nvar _AppBar = _interopRequireDefault(require(\"./AppBar\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _ownerWindow = _interopRequireDefault(require(\"../utils/ownerWindow\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _NoSsr = _interopRequireDefault(require(\"../NoSsr\"));\n\nvar _focusVisible = require(\"./focusVisible\");\n\nvar _TouchRipple = _interopRequireDefault(require(\"./TouchRipple\"));\n\nvar _createRippleHandler = _interopRequireDefault(require(\"./createRippleHandler\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n // Remove grey highlight\n WebkitTapHighlightColor: 'transparent',\n backgroundColor: 'transparent',\n // Reset default value\n // We disable the focus ring for mouse, touch and keyboard users.\n outline: 'none',\n border: 0,\n margin: 0,\n // Remove the margin in Safari\n borderRadius: 0,\n padding: 0,\n // Remove the padding in Firefox\n cursor: 'pointer',\n userSelect: 'none',\n verticalAlign: 'middle',\n '-moz-appearance': 'none',\n // Reset\n '-webkit-appearance': 'none',\n // Reset\n textDecoration: 'none',\n // So we take precedent over the style of a native element.\n color: 'inherit',\n '&::-moz-focus-inner': {\n borderStyle: 'none' // Remove Firefox dotted outline.\n\n },\n '&$disabled': {\n pointerEvents: 'none',\n // Disable link interactions\n cursor: 'default'\n }\n },\n\n /* Styles applied to the root element if ` + ("`" + `disabled={true}`)) + ("`" + (`. */\n disabled: {},\n\n /* Styles applied to the root element if keyboard focused. */\n focusVisible: {}\n};\n/* istanbul ignore if */\n\nexports.styles = styles;\n\nif (process.env.NODE_ENV !== 'production' && !_react.default.createContext) {\n throw new Error('Material-UI: react@16.3.0 or greater is required.');\n}\n/**\r\n * ` + "`")))) + (((`ButtonBase` + ("`" + ` contains as few styles as possible.\r\n * It aims to be a simple building block for creating a button.\r\n * It contains a load of style reset and some focus/ripple logic.\r\n */\n\n\nvar ButtonBase =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(ButtonBase, _React$Component);\n\n function ButtonBase() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, ButtonBase);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(ButtonBase)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {};\n _this.keyDown = false;\n _this.focusVisibleCheckTime = 50;\n _this.focusVisibleMaxCheckTimes = 5;\n _this.handleMouseDown = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'MouseDown', 'start', function () {\n clearTimeout(_this.focusVisibleTimeout);\n\n if (_this.state.focusVisible) {\n _this.setState({\n focusVisible: false\n });\n }\n });\n _this.handleMouseUp = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'MouseUp', 'stop');\n _this.handleMouseLeave = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'MouseLeave', 'stop', function (event) {\n if (_this.state.focusVisible) {\n event.preventDefault();\n }\n });\n _this.handleTouchStart = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'TouchStart', 'start');\n _this.handleTouchEnd = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'TouchEnd', 'stop');\n _this.handleTouchMove = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'TouchMove', 'stop');\n _this.handleContextMenu = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'ContextMenu', 'stop');\n _this.handleBlur = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'Blur', 'stop', function () {\n clearTimeout(_this.focusVisibleTimeout);\n\n if (_this.state.focusVisible) {\n _this.setState({\n focusVisible: false\n });\n }\n });\n\n _this.onRippleRef = function (node) {\n _this.ripple = node;\n };\n\n _this.onFocusVisibleHandler = function (event) {\n _this.keyDown = false;\n\n _this.setState({\n focusVisible: true\n });\n\n if (_this.props.onFocusVisible) {\n _this.props.onFocusVisible(event);\n }\n };\n\n _this.handleKeyDown = function (event) {\n var _this$props = _this.props,\n component = _this$props.component,\n focusRipple = _this$props.focusRipple,\n onKeyDown = _this$props.onKeyDown,\n onClick = _this$props.onClick; // Check if key is already down to avoid repeats being counted as multiple activations\n\n if (focusRipple && !_this.keyDown && _this.state.focusVisible && _this.ripple && event.key === ' ') {\n _this.keyDown = true;\n event.persist();\n\n _this.ripple.stop(event, function () {\n _this.ripple.start(event);\n });\n }\n\n if (onKeyDown) {\n onKeyDown(event);\n } // Keyboard accessibility for non interactive elements\n\n\n if (event.target === event.currentTarget && component && component !== 'button' && (event.key === ' ' || event.key === 'Enter') && !(_this.button.tagName === 'A' && _this.button.href)) {\n event.preventDefault();\n\n if (onClick) {\n onClick(event);\n }\n }\n };\n\n _this.handleKeyUp = function (event) {\n if (_this.props.focusRipple && event.key === ' ' && _this.ripple && _this.state.focusVisible) {\n _this.keyDown = false;\n event.persist();\n\n _this.ripple.stop(event, function () {\n _this.ripple.pulsate(event);\n });\n }\n\n if (_this.props.onKeyUp) {\n _this.props.onKeyUp(event);\n }\n };\n\n _this.handleFocus = function (event) {\n if (_this.props.disabled) {\n return;\n } // Fix for https://github.com/facebook/react/issues/7769\n\n\n if (!_this.button) {\n _this.button = event.currentTarget;\n }\n\n event.persist();\n (0, _focusVisible.detectFocusVisible)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), _this.button, function () {\n _this.onFocusVisibleHandler(event);\n });\n\n if (_this.props.onFocus) {\n _this.props.onFocus(event);\n }\n };\n\n return _this;\n }\n\n (0, _createClass2.default)(ButtonBase, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n this.button = _reactDom.default.findDOMNode(this);\n (0, _focusVisible.listenForFocusKeys)((0, _ownerWindow.default)(this.button));\n\n if (this.props.action) {\n this.props.action({\n focusVisible: function focusVisible() {\n _this2.setState({\n focusVisible: true\n });\n\n _this2.button.focus();\n }\n });\n }\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps, prevState) {\n if (this.props.focusRipple && !this.props.disableRipple && !prevState.focusVisible && this.state.focusVisible) {\n this.ripple.pulsate();\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n clearTimeout(this.focusVisibleTimeout);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _classNames;\n\n var _this$props2 = this.props,\n action = _this$props2.action,\n buttonRef = _this$props2.buttonRef,\n centerRipple = _this$props2.centerRipple,\n children = _this$props2.children,\n classes = _this$props2.classes,\n classNameProp = _this$props2.className,\n component = _this$props2.component,\n disabled = _this$props2.disabled,\n disableRipple = _this$props2.disableRipple,\n disableTouchRipple = _this$props2.disableTouchRipple,\n focusRipple = _this$props2.focusRipple,\n focusVisibleClassName = _this$props2.focusVisibleClassName,\n onBlur = _this$props2.onBlur,\n onFocus = _this$props2.onFocus,\n onFocusVisible = _this$props2.onFocusVisible,\n onKeyDown = _this$props2.onKeyDown,\n onKeyUp = _this$props2.onKeyUp,\n onMouseDown = _this$props2.onMouseDown,\n onMouseLeave = _this$props2.onMouseLeave,\n onMouseUp = _this$props2.onMouseUp,\n onTouchEnd = _this$props2.onTouchEnd,\n onTouchMove = _this$props2.onTouchMove,\n onTouchStart = _this$props2.onTouchStart,\n tabIndex = _this$props2.tabIndex,\n TouchRippleProps = _this$props2.TouchRippleProps,\n type = _this$props2.type,\n other = (0, _objectWithoutProperties2.default)(_this$props2, [\"action\", \"buttonRef\", \"centerRipple\", \"children\", \"classes\", \"className\", \"component\", \"disabled\", \"disableRipple\", \"disableTouchRipple\", \"focusRipple\", \"focusVisibleClassName\", \"onBlur\", \"onFocus\", \"onFocusVisible\", \"onKeyDown\", \"onKeyUp\", \"onMouseDown\", \"onMouseLeave\", \"onMouseUp\", \"onTouchEnd\", \"onTouchMove\", \"onTouchStart\", \"tabIndex\", \"TouchRippleProps\", \"type\"]);\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), (0, _defineProperty2.default)(_classNames, classes.focusVisible, this.state.focusVisible), (0, _defineProperty2.default)(_classNames, focusVisibleClassName, this.state.focusVisible), _classNames), classNameProp);\n var ComponentProp = component;\n\n if (ComponentProp === 'button' && other.href) {\n ComponentProp = 'a';\n }\n\n var buttonProps = {};\n\n if (ComponentProp === 'button') {\n buttonProps.type = type || 'button';\n buttonProps.disabled = disabled;\n } else {\n buttonProps.role = 'button';\n }\n\n return _react.default.createElement(ComponentProp, (0, _extends2.default)({\n className: className,\n onBlur: this.handleBlur,\n onFocus: this.handleFocus,\n onKeyDown: this.handleKeyDown,\n onKeyUp: this.handleKeyUp,\n onMouseDown: this.handleMouseDown,\n onMouseLeave: this.handleMouseLeave,\n onMouseUp: this.handleMouseUp,\n onTouchEnd: this.handleTouchEnd,\n onTouchMove: this.handleTouchMove,\n onTouchStart: this.handleTouchStart,\n onContextMenu: this.handleContextMenu,\n ref: buttonRef,\n tabIndex: disabled ? '-1' : tabIndex\n }, buttonProps, other), children, !disableRipple && !disabled ? _react.default.createElement(_NoSsr.default, null, _react.default.createElement(_TouchRipple.default, (0, _extends2.default)({\n innerRef: this.onRippleRef,\n center: centerRipple\n }, TouchRippleProps))) : null);\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n if (typeof prevState.focusVisible === 'undefined') {\n return {\n focusVisible: false,\n lastDisabled: nextProps.disabled\n };\n } // The blur won't fire when the disabled state is set on a focused input.\n // We need to book keep the focused state manually.\n\n\n if (!prevState.prevState && nextProps.disabled && prevState.focusVisible) {\n return {\n focusVisible: false,\n lastDisabled: nextProps.disabled\n };\n }\n\n return {\n lastDisabled: nextProps.disabled\n };\n }\n }]);\n return ButtonBase;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? ButtonBase.propTypes = {\n /**\r\n * Callback fired when the component mounts.\r\n * This is useful when you want to trigger an action programmatically.\r\n * It currently only supports `)) + ("`" + (`focusVisible()` + "`"))) + ((` action.\r\n *\r\n * @param {object} actions This object contains all possible actions\r\n * that can be triggered programmatically.\r\n */\n action: _propTypes.default.func,\n\n /**\r\n * Use that property to pass a ref callback to the native button component.\r\n */\n buttonRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, the ripples will be centered.\r\n * They won't start at the cursor interaction position.\r\n */\n centerRipple: _propTypes.default.bool,\n\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + "`"))))) + ((((`true` + ("`" + `, the base button will be disabled.\r\n */\n disabled: _propTypes.default.bool,\n\n /**\r\n * If `)) + ("`" + (`true` + "`"))) + ((`, the ripple effect will be disabled.\r\n */\n disableRipple: _propTypes.default.bool,\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, the touch ripple effect will be disabled.\r\n */\n disableTouchRipple: _propTypes.default.bool,\n\n /**\r\n * If ` + "`")))) + (((`true` + ("`" + `, the base button will have a keyboard focus ripple.\r\n * `)) + ("`" + (`disableRipple` + "`"))) + ((` must also be ` + ("`" + `false`)) + (("`" + `.\r\n */\n focusRipple: _propTypes.default.bool,\n\n /**\r\n * This property can help a person know which element has the keyboard focus.\r\n * The class name will be applied when the element gain the focus through a keyboard interaction.\r\n * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).\r\n * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/master/explainer.md).\r\n * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `) + ("`" + `focus-visible`)))))) + ((((("`" + (` class to other components\r\n * if needed.\r\n */\n focusVisibleClassName: _propTypes.default.string,\n\n /**\r\n * @ignore\r\n */\n onBlur: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onClick: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onFocus: _propTypes.default.func,\n\n /**\r\n * Callback fired when the component is focused with a keyboard.\r\n * We trigger a ` + "`")) + (`onFocus` + ("`" + ` callback too.\r\n */\n onFocusVisible: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onKeyDown: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onKeyUp: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onMouseDown: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onMouseLeave: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onMouseUp: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onTouchEnd: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onTouchMove: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onTouchStart: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n role: _propTypes.default.string,\n\n /**\r\n * @ignore\r\n */\n tabIndex: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),\n\n /**\r\n * Properties applied to the `))) + (("`" + (`TouchRipple` + "`")) + (` element.\r\n */\n TouchRippleProps: _propTypes.default.object,\n\n /**\r\n * Used to control the button's purpose.\r\n * This property passes the value to the ` + ("`" + `type`)))) + ((("`" + (` attribute of the native button component.\r\n * Valid property values include ` + "`")) + (`button` + ("`" + `, `))) + (("`" + (`submit` + "`")) + ((`, and ` + "`") + (`reset` + "`"))))) + ((((`.\r\n */\n type: _propTypes.default.string\n} : void 0;\nButtonBase.defaultProps = {\n centerRipple: false,\n component: 'button',\n disableRipple: false,\n disableTouchRipple: false,\n focusRipple: false,\n tabIndex: '0',\n type: 'button'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiButtonBase'\n})(ButtonBase);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _Transition = _interopRequireDefault(require(\"react-transition-group/Transition\"));\n\n/**\r\n * @ignore - internal component.\r\n */\nvar Ripple =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(Ripple, _React$Component);\n\n function Ripple() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, Ripple);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(Ripple)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n visible: false,\n leaving: false\n };\n\n _this.handleEnter = function () {\n _this.setState({\n visible: true\n });\n };\n\n _this.handleExit = function () {\n _this.setState({\n leaving: true\n });\n };\n\n return _this;\n }\n\n (0, _createClass2.default)(Ripple, [{\n key: \"render\",\n value: function render() {\n var _classNames, _classNames2;\n\n var _this$props = this.props,\n classes = _this$props.classes,\n classNameProp = _this$props.className,\n pulsate = _this$props.pulsate,\n rippleX = _this$props.rippleX,\n rippleY = _this$props.rippleY,\n rippleSize = _this$props.rippleSize,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"classes\", \"className\", \"pulsate\", \"rippleX\", \"rippleY\", \"rippleSize\"]);\n var _this$state = this.state,\n visible = _this$state.visible,\n leaving = _this$state.leaving;\n var rippleClassName = (0, _classnames.default)(classes.ripple, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.rippleVisible, visible), (0, _defineProperty2.default)(_classNames, classes.ripplePulsate, pulsate), _classNames), classNameProp);\n var rippleStyles = {\n width: rippleSize,\n height: rippleSize,\n top: -(rippleSize / 2) + rippleY,\n left: -(rippleSize / 2) + rippleX\n };\n var childClassName = (0, _classnames.default)(classes.child, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, classes.childLeaving, leaving), (0, _defineProperty2.default)(_classNames2, classes.childPulsate, pulsate), _classNames2));\n return _react.default.createElement(_Transition.default, (0, _extends2.default)({\n onEnter: this.handleEnter,\n onExit: this.handleExit\n }, other), _react.default.createElement(\"span\", {\n className: rippleClassName,\n style: rippleStyles\n }, _react.default.createElement(\"span\", {\n className: childClassName\n })));\n }\n }]);\n return Ripple;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? Ripple.propTypes = {\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, the ripple pulsates, typically indicating the keyboard focus state of an element.\r\n */\n pulsate: _propTypes.default.bool,\n\n /**\r\n * Diameter of the ripple.\r\n */\n rippleSize: _propTypes.default.number,\n\n /**\r\n * Horizontal position of the ripple center.\r\n */\n rippleX: _propTypes.default.number,\n\n /**\r\n * Vertical position of the ripple center.\r\n */\n rippleY: _propTypes.default.number\n} : void 0;\nRipple.defaultProps = {\n pulsate: false\n};\nvar _default = Ripple;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = exports.DELAY_RIPPLE = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/toConsumableArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _TransitionGroup = _interopRequireDefault(require(\"react-transition-group/TransitionGroup\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Ripple = _interopRequireDefault(require(\"./Ripple\"));\n\nvar DURATION = 550;\nvar DELAY_RIPPLE = 80;\nexports.DELAY_RIPPLE = DELAY_RIPPLE;\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'block',\n position: 'absolute',\n overflow: 'hidden',\n borderRadius: 'inherit',\n width: '100%',\n height: '100%',\n left: 0,\n top: 0,\n pointerEvents: 'none',\n zIndex: 0\n },\n\n /* Styles applied to the internal ` + "`"))) + ((`Ripple` + ("`" + ` components `)) + ("`" + (`ripple` + "`")))) + (((` class. */\n ripple: {\n width: 50,\n height: 50,\n left: 0,\n top: 0,\n opacity: 0,\n position: 'absolute'\n },\n\n /* Styles applied to the internal ` + ("`" + `Ripple`)) + ("`" + (` components ` + "`"))) + ((`rippleVisible` + ("`" + ` class. */\n rippleVisible: {\n opacity: 0.3,\n transform: 'scale(1)',\n animation: \"mui-ripple-enter \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut),\n // Backward compatible logic between JSS v9 and v10.\n // To remove with the release of Material-UI v4\n animationName: '$mui-ripple-enter'\n },\n\n /* Styles applied to the internal `)) + (("`" + `Ripple`) + ("`" + ` components `))))))) + (((((("`" + (`ripplePulsate` + "`")) + (` class. */\n ripplePulsate: {\n animationDuration: \"\".concat(theme.transitions.duration.shorter, \"ms\")\n },\n\n /* Styles applied to the internal ` + ("`" + `Ripple`))) + (("`" + (` components ` + "`")) + (`child` + ("`" + ` class. */\n child: {\n opacity: 1,\n display: 'block',\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n backgroundColor: 'currentColor'\n },\n\n /* Styles applied to the internal `)))) + ((("`" + (`Ripple` + "`")) + (` components ` + ("`" + `childLeaving`))) + (("`" + (` class. */\n childLeaving: {\n opacity: 0,\n animation: \"mui-ripple-exit \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut),\n // Backward compatible logic between JSS v9 and v10.\n // To remove with the release of Material-UI v4\n animationName: '$mui-ripple-exit'\n },\n\n /* Styles applied to the internal ` + "`")) + (`Ripple` + ("`" + ` components `))))) + (((("`" + (`childPulsate` + "`")) + (` class. */\n childPulsate: {\n position: 'absolute',\n left: 0,\n top: 0,\n animation: \"mui-ripple-pulsate 2500ms \".concat(theme.transitions.easing.easeInOut, \" 200ms infinite\"),\n // Backward compatible logic between JSS v9 and v10.\n // To remove with the release of Material-UI v4\n animationName: '$mui-ripple-pulsate'\n },\n '@keyframes mui-ripple-enter': {\n '0%': {\n transform: 'scale(0)',\n opacity: 0.1\n },\n '100%': {\n transform: 'scale(1)',\n opacity: 0.3\n }\n },\n '@keyframes mui-ripple-exit': {\n '0%': {\n opacity: 1\n },\n '100%': {\n opacity: 0\n }\n },\n '@keyframes mui-ripple-pulsate': {\n '0%': {\n transform: 'scale(1)'\n },\n '50%': {\n transform: 'scale(0.92)'\n },\n '100%': {\n transform: 'scale(1)'\n }\n }\n };\n};\n\nexports.styles = styles;\n\nvar TouchRipple =\n/*#__PURE__*/\nfunction (_React$PureComponent) {\n (0, _inherits2.default)(TouchRipple, _React$PureComponent);\n\n function TouchRipple() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, TouchRipple);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(TouchRipple)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n nextKey: 0,\n ripples: []\n };\n\n _this.pulsate = function () {\n _this.start({}, {\n pulsate: true\n });\n };\n\n _this.start = function () {\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var cb = arguments.length > 2 ? arguments[2] : undefined;\n var _options$pulsate = options.pulsate,\n pulsate = _options$pulsate === void 0 ? false : _options$pulsate,\n _options$center = options.center,\n center = _options$center === void 0 ? _this.props.center || options.pulsate : _options$center,\n _options$fakeElement = options.fakeElement,\n fakeElement = _options$fakeElement === void 0 ? false : _options$fakeElement;\n\n if (event.type === 'mousedown' && _this.ignoringMouseDown) {\n _this.ignoringMouseDown = false;\n return;\n }\n\n if (event.type === 'touchstart') {\n _this.ignoringMouseDown = true;\n }\n\n var element = fakeElement ? null : _reactDom.default.findDOMNode((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n var rect = element ? element.getBoundingClientRect() : {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }; // Get the size of the ripple\n\n var rippleX;\n var rippleY;\n var rippleSize;\n\n if (center || event.clientX === 0 && event.clientY === 0 || !event.clientX && !event.touches) {\n rippleX = Math.round(rect.width / 2);\n rippleY = Math.round(rect.height / 2);\n } else {\n var clientX = event.clientX ? event.clientX : event.touches[0].clientX;\n var clientY = event.clientY ? event.clientY : event.touches[0].clientY;\n rippleX = Math.round(clientX - rect.left);\n rippleY = Math.round(clientY - rect.top);\n }\n\n if (center) {\n rippleSize = Math.sqrt((2 * Math.pow(rect.width, 2) + Math.pow(rect.height, 2)) / 3); // For some reason the animation is broken on Mobile Chrome if the size if even.\n\n if (rippleSize % 2 === 0) {\n rippleSize += 1;\n }\n } else {\n var sizeX = Math.max(Math.abs((element ? element.clientWidth : 0) - rippleX), rippleX) * 2 + 2;\n var sizeY = Math.max(Math.abs((element ? element.clientHeight : 0) - rippleY), rippleY) * 2 + 2;\n rippleSize = Math.sqrt(Math.pow(sizeX, 2) + Math.pow(sizeY, 2));\n } // Touche devices\n\n\n if (event.touches) {\n // Prepare the ripple effect.\n _this.startTimerCommit = function () {\n _this.startCommit({\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize,\n cb: cb\n });\n }; // Delay the execution of the ripple effect.\n\n\n _this.startTimer = setTimeout(function () {\n if (_this.startTimerCommit) {\n _this.startTimerCommit();\n\n _this.startTimerCommit = null;\n }\n }, DELAY_RIPPLE); // We have to make a tradeoff with this value.\n } else {\n _this.startCommit({\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize,\n cb: cb\n });\n }\n };\n\n _this.startCommit = function (params) {\n var pulsate = params.pulsate,\n rippleX = params.rippleX,\n rippleY = params.rippleY,\n rippleSize = params.rippleSize,\n cb = params.cb;\n\n _this.setState(function (state) {\n return {\n nextKey: state.nextKey + 1,\n ripples: [].concat((0, _toConsumableArray2.default)(state.ripples), [_react.default.createElement(_Ripple.default, {\n key: state.nextKey,\n classes: _this.props.classes,\n timeout: {\n exit: DURATION,\n enter: DURATION\n },\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize\n })])\n };\n }, cb);\n };\n\n _this.stop = function (event, cb) {\n clearTimeout(_this.startTimer);\n var ripples = _this.state.ripples; // The touch interaction occurs too quickly.\n // We still want to show ripple effect.\n\n if (event.type === 'touchend' && _this.startTimerCommit) {\n event.persist();\n\n _this.startTimerCommit();\n\n _this.startTimerCommit = null;\n _this.startTimer = setTimeout(function () {\n _this.stop(event, cb);\n });\n return;\n }\n\n _this.startTimerCommit = null;\n\n if (ripples && ripples.length) {\n _this.setState({\n ripples: ripples.slice(1)\n }, cb);\n }\n };\n\n return _this;\n }\n\n (0, _createClass2.default)(TouchRipple, [{\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n clearTimeout(this.startTimer);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n center = _this$props.center,\n classes = _this$props.classes,\n className = _this$props.className,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"center\", \"classes\", \"className\"]);\n return _react.default.createElement(_TransitionGroup.default, (0, _extends2.default)({\n component: \"span\",\n enter: true,\n exit: true,\n className: (0, _classnames.default)(classes.root, className)\n }, other), this.state.ripples);\n }\n }]);\n return TouchRipple;\n}(_react.default.PureComponent);\n\nprocess.env.NODE_ENV !== \"production\" ? TouchRipple.propTypes = {\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the ripple starts at the center of the component\r\n * rather than at the point of interaction.\r\n */\n center: _propTypes.default.bool,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string\n} : void 0;\nTouchRipple.defaultProps = {\n center: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n flip: false,\n name: 'MuiTouchRipple'\n})(TouchRipple);\n\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n/* eslint-disable import/no-mutable-exports */\nvar createRippleHandler = function createRippleHandler(instance, eventName, action, cb) {\n return function (event) {\n if (cb) {\n cb.call(instance, event);\n }\n\n var ignore = false; // Ignore events that have been ` + "`")) + (`event.preventDefault()` + ("`" + ` marked.\n\n if (event.defaultPrevented) {\n ignore = true;\n }\n\n if (instance.props.disableTouchRipple && eventName !== 'Blur') {\n ignore = true;\n }\n\n if (!ignore && instance.ripple) {\n instance.ripple[action](event);\n }\n\n if (typeof instance.props[\"on\".concat(eventName)] === 'function') {\n instance.props[\"on\".concat(eventName)](event);\n }\n\n return true;\n };\n};\n/* istanbul ignore if */\n\n\nif (typeof window === 'undefined') {\n createRippleHandler = function createRippleHandler() {\n return function () {};\n };\n}\n\nvar _default = createRippleHandler;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.detectFocusVisible = detectFocusVisible;\nexports.listenForFocusKeys = listenForFocusKeys;\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _ownerDocument = _interopRequireDefault(require(\"../utils/ownerDocument\"));\n\nvar internal = {\n focusKeyPressed: false,\n keyUpEventTimeout: -1\n};\n\nfunction findActiveElement(doc) {\n var activeElement = doc.activeElement;\n\n while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) {\n activeElement = activeElement.shadowRoot.activeElement;\n }\n\n return activeElement;\n}\n\nfunction detectFocusVisible(instance, element, callback) {\n var attempt = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(instance.focusVisibleCheckTime, 'Material-UI: missing instance.focusVisibleCheckTime.') : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(instance.focusVisibleMaxCheckTimes, 'Material-UI: missing instance.focusVisibleMaxCheckTimes.') : void 0;\n instance.focusVisibleTimeout = setTimeout(function () {\n var doc = (0, _ownerDocument.default)(element);\n var activeElement = findActiveElement(doc);\n\n if (internal.focusKeyPressed && (activeElement === element || element.contains(activeElement))) {\n callback();\n } else if (attempt < instance.focusVisibleMaxCheckTimes) {\n detectFocusVisible(instance, element, callback, attempt + 1);\n }\n }, instance.focusVisibleCheckTime);\n}\n\nvar FOCUS_KEYS = [9, // 'Tab',\n13, // 'Enter',\n27, // 'Escape',\n32, // ' ',\n37, // 'ArrowLeft',\n38, // 'ArrowUp',\n39, // 'ArrowRight',\n40];\n\nfunction isFocusKey(event) {\n // Use event.keyCode to support IE 11\n return FOCUS_KEYS.indexOf(event.keyCode) > -1;\n}\n\nvar handleKeyUpEvent = function handleKeyUpEvent(event) {\n if (isFocusKey(event)) {\n internal.focusKeyPressed = true; // Let's consider that the user is using a keyboard during a window frame of 500ms.\n\n clearTimeout(internal.keyUpEventTimeout);\n internal.keyUpEventTimeout = setTimeout(function () {\n internal.focusKeyPressed = false;\n }, 500);\n }\n};\n\nfunction listenForFocusKeys(win) {\n // The event listener will only be added once per window.\n // Duplicate event listeners will be ignored by addEventListener.\n // Also, this logic is client side only, we don't need a teardown.\n win.addEventListener('keyup', handleKeyUpEvent);\n}", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _ButtonBase.default;\n }\n});\n\nvar _ButtonBase = _interopRequireDefault(require(\"./ButtonBase\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _createBreakpoints = require(\"../styles/createBreakpoints\");\n\nvar _requirePropFactory = _interopRequireDefault(require(\"../utils/requirePropFactory\"));\n\n// A grid component using the following libs as inspiration.\n//\n// For the implementation:\n// - http://v4-alpha.getbootstrap.com/layout/flexbox-grid/\n// - https://github.com/kristoferjoseph/flexboxgrid/blob/master/src/css/flexboxgrid.css\n// - https://github.com/roylee0704/react-flexbox-grid\n// - https://material.angularjs.org/latest/layout/introduction\n//\n// Follow this flexbox Guide to better understand the underlying model:\n// - https://css-tricks.com/snippets/css/a-guide-to-flexbox/\nvar GUTTERS = [0, 8, 16, 24, 32, 40];\nvar GRID_SIZES = ['auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];\n\nfunction generateGrid(globalStyles, theme, breakpoint) {\n var styles = {};\n GRID_SIZES.forEach(function (size) {\n var key = \"grid-\".concat(breakpoint, \"-\").concat(size);\n\n if (size === true) {\n // For the auto layouting\n styles[key] = {\n flexBasis: 0,\n flexGrow: 1,\n maxWidth: '100%'\n };\n return;\n }\n\n if (size === 'auto') {\n styles[key] = {\n flexBasis: 'auto',\n flexGrow: 0,\n maxWidth: 'none'\n };\n return;\n } // Keep 7 significant numbers.\n\n\n var width = \"\".concat(Math.round(size / 12 * 10e7) / 10e5, \"%\"); // Close to the bootstrap implementation:\n // https://github.com/twbs/bootstrap/blob/8fccaa2439e97ec72a4b7dc42ccc1f649790adb0/scss/mixins/_grid.scss#L41\n\n styles[key] = {\n flexBasis: width,\n flexGrow: 0,\n maxWidth: width\n };\n }); // No need for a media query for the first size.\n\n if (breakpoint === 'xs') {\n (0, _extends2.default)(globalStyles, styles);\n } else {\n globalStyles[theme.breakpoints.up(breakpoint)] = styles;\n }\n}\n\nfunction generateGutter(theme, breakpoint) {\n var styles = {};\n GUTTERS.forEach(function (spacing, index) {\n if (index === 0) {\n // Skip the default style.\n return;\n }\n\n styles[\"spacing-\".concat(breakpoint, \"-\").concat(spacing)] = {\n margin: -spacing / 2,\n width: \"calc(100% + \".concat(spacing, \"px)\"),\n '& > $item': {\n padding: spacing / 2\n }\n };\n });\n return styles;\n} // Default CSS values\n// flex: '0 1 auto',\n// flexDirection: 'row',\n// alignItems: 'flex-start',\n// flexWrap: 'nowrap',\n// justifyContent: 'flex-start',\n\n\nvar styles = function styles(theme) {\n return (0, _extends2.default)({\n /* Styles applied to the root element if `)))) + ((("`" + (`container={true}` + "`")) + (`. */\n container: {\n boxSizing: 'border-box',\n display: 'flex',\n flexWrap: 'wrap',\n width: '100%'\n },\n\n /* Styles applied to the root element if ` + ("`" + `item={true}`))) + (("`" + (`. */\n item: {\n boxSizing: 'border-box',\n margin: '0' // For instance, it's useful when used with a ` + "`")) + ((`figure` + "`") + (` element.\n\n },\n\n /* Styles applied to the root element if ` + "`")))))) + (((((`zeroMinWidth={true}` + ("`" + `. */\n zeroMinWidth: {\n minWidth: 0\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`direction=\"column\"` + "`"))) + ((`. */\n 'direction-xs-column': {\n flexDirection: 'column'\n },\n\n /* Styles applied to the root element if ` + ("`" + `direction=\"column-reverse\"`)) + ("`" + (`. */\n 'direction-xs-column-reverse': {\n flexDirection: 'column-reverse'\n },\n\n /* Styles applied to the root element if ` + "`")))) + (((`direction=\"rwo-reverse\"` + ("`" + `. */\n 'direction-xs-row-reverse': {\n flexDirection: 'row-reverse'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`wrap=\"nowrap\"` + "`"))) + ((`. */\n 'wrap-xs-nowrap': {\n flexWrap: 'nowrap'\n },\n\n /* Styles applied to the root element if ` + ("`" + `wrap=\"reverse\"`)) + (("`" + `. */\n 'wrap-xs-wrap-reverse': {\n flexWrap: 'wrap-reverse'\n },\n\n /* Styles applied to the root element if `) + ("`" + `alignItems=\"center\"`))))) + (((("`" + (`. */\n 'align-items-xs-center': {\n alignItems: 'center'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`alignItems=\"flex-start\"` + ("`" + `. */\n 'align-items-xs-flex-start': {\n alignItems: 'flex-start'\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`alignItems=\"flex-end\"` + "`")) + (`. */\n 'align-items-xs-flex-end': {\n alignItems: 'flex-end'\n },\n\n /* Styles applied to the root element if ` + ("`" + `alignItems=\"baseline\"`)))) + ((("`" + (`. */\n 'align-items-xs-baseline': {\n alignItems: 'baseline'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`alignContent=\"center\"` + ("`" + `. */\n 'align-content-xs-center': {\n alignContent: 'center'\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`alignContent=\"flex-start\"` + "`")) + ((`. */\n 'align-content-xs-flex-start': {\n alignContent: 'flex-start'\n },\n\n /* Styles applied to the root element if ` + "`") + (`alignContent=\"flex-end\"` + "`"))))))))) + ((((((((`. */\n 'align-content-xs-flex-end': {\n alignContent: 'flex-end'\n },\n\n /* Styles applied to the root element if ` + ("`" + `alignContent=\"space-between\"`)) + ("`" + (`. */\n 'align-content-xs-space-between': {\n alignContent: 'space-between'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`alignContent=\"space-around\"` + ("`" + `. */\n 'align-content-xs-space-around': {\n alignContent: 'space-around'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`justify=\"center\"` + "`")))) + (((`. */\n 'justify-xs-center': {\n justifyContent: 'center'\n },\n\n /* Styles applied to the root element if ` + ("`" + `justify=\"flex-end\"`)) + ("`" + (`. */\n 'justify-xs-flex-end': {\n justifyContent: 'flex-end'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`justify=\"space-between\"` + ("`" + `. */\n 'justify-xs-space-between': {\n justifyContent: 'space-between'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`justify=\"space-around\"` + "`"))))) + ((((`. */\n 'justify-xs-space-around': {\n justifyContent: 'space-around'\n },\n\n /* Styles applied to the root element if ` + ("`" + `justify=\"space-evenly\"`)) + ("`" + (`. */\n 'justify-xs-space-evenly': {\n justifyContent: 'space-evenly'\n }\n }, generateGutter(theme, 'xs'), _createBreakpoints.keys.reduce(function (accumulator, key) {\n // Use side effect over immutability for better performance.\n generateGrid(accumulator, theme, key);\n return accumulator;\n }, {}));\n};\n\nexports.styles = styles;\n\nfunction Grid(props) {\n var _classNames;\n\n var alignContent = props.alignContent,\n alignItems = props.alignItems,\n classes = props.classes,\n classNameProp = props.className,\n Component = props.component,\n container = props.container,\n direction = props.direction,\n item = props.item,\n justify = props.justify,\n lg = props.lg,\n md = props.md,\n sm = props.sm,\n spacing = props.spacing,\n wrap = props.wrap,\n xl = props.xl,\n xs = props.xs,\n zeroMinWidth = props.zeroMinWidth,\n other = (0, _objectWithoutProperties2.default)(props, [\"alignContent\", \"alignItems\", \"classes\", \"className\", \"component\", \"container\", \"direction\", \"item\", \"justify\", \"lg\", \"md\", \"sm\", \"spacing\", \"wrap\", \"xl\", \"xs\", \"zeroMinWidth\"]);\n var className = (0, _classnames.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.container, container), (0, _defineProperty2.default)(_classNames, classes.item, item), (0, _defineProperty2.default)(_classNames, classes.zeroMinWidth, zeroMinWidth), (0, _defineProperty2.default)(_classNames, classes[\"spacing-xs-\".concat(String(spacing))], container && spacing !== 0), (0, _defineProperty2.default)(_classNames, classes[\"direction-xs-\".concat(String(direction))], direction !== Grid.defaultProps.direction), (0, _defineProperty2.default)(_classNames, classes[\"wrap-xs-\".concat(String(wrap))], wrap !== Grid.defaultProps.wrap), (0, _defineProperty2.default)(_classNames, classes[\"align-items-xs-\".concat(String(alignItems))], alignItems !== Grid.defaultProps.alignItems), (0, _defineProperty2.default)(_classNames, classes[\"align-content-xs-\".concat(String(alignContent))], alignContent !== Grid.defaultProps.alignContent), (0, _defineProperty2.default)(_classNames, classes[\"justify-xs-\".concat(String(justify))], justify !== Grid.defaultProps.justify), (0, _defineProperty2.default)(_classNames, classes[\"grid-xs-\".concat(String(xs))], xs !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-sm-\".concat(String(sm))], sm !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-md-\".concat(String(md))], md !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-lg-\".concat(String(lg))], lg !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-xl-\".concat(String(xl))], xl !== false), _classNames), classNameProp);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Grid.propTypes = {\n /**\r\n * Defines the ` + "`"))) + ((`align-content` + ("`" + ` style property.\r\n * It's applied for all screen sizes.\r\n */\n alignContent: _propTypes.default.oneOf(['stretch', 'center', 'flex-start', 'flex-end', 'space-between', 'space-around']),\n\n /**\r\n * Defines the `)) + ("`" + (`align-items` + "`")))) + (((` style property.\r\n * It's applied for all screen sizes.\r\n */\n alignItems: _propTypes.default.oneOf(['flex-start', 'center', 'flex-end', 'stretch', 'baseline']),\n\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, the component will have the flex *container* behavior.\r\n * You should be wrapping *items* with a *container*.\r\n */\n container: _propTypes.default.bool,\n\n /**\r\n * Defines the ` + "`"))) + ((`flex-direction` + ("`" + ` style property.\r\n * It is applied for all screen sizes.\r\n */\n direction: _propTypes.default.oneOf(['row', 'row-reverse', 'column', 'column-reverse']),\n\n /**\r\n * If `)) + (("`" + `true`) + ("`" + `, the component will have the flex *item* behavior.\r\n * You should be wrapping *items* with a *container*.\r\n */\n item: _propTypes.default.bool,\n\n /**\r\n * Defines the `)))))) + ((((("`" + (`justify-content` + "`")) + (` style property.\r\n * It is applied for all screen sizes.\r\n */\n justify: _propTypes.default.oneOf(['flex-start', 'center', 'flex-end', 'space-between', 'space-around', 'space-evenly']),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the ` + ("`" + `lg`))) + (("`" + (` breakpoint and wider screens if not overridden.\r\n */\n lg: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the ` + "`")) + (`md` + ("`" + ` breakpoint and wider screens if not overridden.\r\n */\n md: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the `)))) + ((("`" + (`sm` + "`")) + (` breakpoint and wider screens if not overridden.\r\n */\n sm: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the space between the type ` + ("`" + `item`))) + (("`" + (` component.\r\n * It can only be used on a type ` + "`")) + ((`container` + "`") + (` component.\r\n */\n spacing: _propTypes.default.oneOf(GUTTERS),\n\n /**\r\n * Defines the ` + "`"))))) + ((((`flex-wrap` + ("`" + ` style property.\r\n * It's applied for all screen sizes.\r\n */\n wrap: _propTypes.default.oneOf(['nowrap', 'wrap', 'wrap-reverse']),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the `)) + ("`" + (`xl` + "`"))) + ((` breakpoint and wider screens.\r\n */\n xl: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for all the screen sizes with the lowest priority.\r\n */\n xs: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, it sets ` + "`")))) + (((`min-width: 0` + ("`" + ` on the item.\r\n * Refer to the limitations section of the documentation to better understand the use case.\r\n */\n zeroMinWidth: _propTypes.default.bool\n} : void 0;\nGrid.defaultProps = {\n alignContent: 'stretch',\n alignItems: 'stretch',\n component: 'div',\n container: false,\n direction: 'row',\n item: false,\n justify: 'flex-start',\n lg: false,\n md: false,\n sm: false,\n spacing: 0,\n wrap: 'wrap',\n xl: false,\n xs: false,\n zeroMinWidth: false\n};\nvar StyledGrid = (0, _withStyles.default)(styles, {\n name: 'MuiGrid'\n})(Grid);\n\nif (process.env.NODE_ENV !== 'production') {\n var requireProp = (0, _requirePropFactory.default)('Grid');\n StyledGrid.propTypes = (0, _extends2.default)({}, StyledGrid.propTypes, {\n alignContent: requireProp('container'),\n alignItems: requireProp('container'),\n direction: requireProp('container'),\n justify: requireProp('container'),\n lg: requireProp('item'),\n md: requireProp('item'),\n sm: requireProp('item'),\n spacing: requireProp('container'),\n wrap: requireProp('container'),\n xs: requireProp('item'),\n zeroMinWidth: requireProp('zeroMinWidth')\n });\n}\n\nvar _default = StyledGrid;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Grid.default;\n }\n});\n\nvar _Grid = _interopRequireDefault(require(\"./Grid\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n userSelect: 'none',\n fontSize: 24,\n width: '1em',\n height: '1em',\n // Chrome fix for https://bugs.chromium.org/p/chromium/issues/detail?id=820541\n // To remove at some point.\n overflow: 'hidden',\n flexShrink: 0\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`color=\"primary\"` + "`"))) + ((`. */\n colorPrimary: {\n color: theme.palette.primary.main\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"secondary\"`)) + (("`" + `. */\n colorSecondary: {\n color: theme.palette.secondary.main\n },\n\n /* Styles applied to the root element if `) + ("`" + `color=\"action\"`))))))) + (((((("`" + (`. */\n colorAction: {\n color: theme.palette.action.active\n },\n\n /* Styles applied to the root element if ` + "`")) + (`color=\"error\"` + ("`" + `. */\n colorError: {\n color: theme.palette.error.main\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`color=\"disabled\"` + "`")) + (`. */\n colorDisabled: {\n color: theme.palette.action.disabled\n },\n fontSizeInherit: {\n fontSize: 'inherit'\n },\n\n /* Styles applied to the root element if ` + ("`" + `fontSize=\"small\"`)))) + ((("`" + (`. */\n fontSizeSmall: {\n fontSize: 20\n },\n\n /* Styles applied to the root element if ` + "`")) + (`fontSize=\"large\"` + ("`" + `. */\n fontSizeLarge: {\n fontSize: 36\n }\n };\n};\n\nexports.styles = styles;\n\nfunction Icon(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n className = props.className,\n color = props.color,\n Component = props.component,\n fontSize = props.fontSize,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"fontSize\"]);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)('material-icons', classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes[\"fontSize\".concat((0, _helpers.capitalize)(fontSize))], fontSize !== 'default'), _classNames), className),\n \"aria-hidden\": \"true\"\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Icon.propTypes = {\n /**\r\n * The name of the icon font ligature.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['inherit', 'primary', 'secondary', 'action', 'error', 'disabled']),\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * The fontSize applied to the icon. Defaults to 24px, but can be configure to inherit font size.\r\n */\n fontSize: _propTypes.default.oneOf(['inherit', 'default', 'small', 'large'])\n} : void 0;\nIcon.defaultProps = {\n color: 'inherit',\n component: 'span',\n fontSize: 'default'\n};\nIcon.muiName = 'Icon';\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiIcon'\n})(Icon);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Icon.default;\n }\n});\n\nvar _Icon = _interopRequireDefault(require(\"./Icon\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _colorManipulator = require(\"../styles/colorManipulator\");\n\nvar _ButtonBase = _interopRequireDefault(require(\"../ButtonBase\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\n// @inheritedComponent ButtonBase\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n textAlign: 'center',\n flex: '0 0 auto',\n fontSize: theme.typography.pxToRem(24),\n padding: 12,\n borderRadius: '50%',\n overflow: 'visible',\n // Explicitly set the default value to solve a bug on IE 11.\n color: theme.palette.action.active,\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.shortest\n }),\n '&:hover': {\n backgroundColor: (0, _colorManipulator.fade)(theme.palette.action.active, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n },\n '&$disabled': {\n backgroundColor: 'transparent'\n }\n },\n '&$disabled': {\n color: theme.palette.action.disabled\n }\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`color=\"inherit\"` + "`")) + (`. */\n colorInherit: {\n color: 'inherit'\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"primary\"`))))) + (((("`" + (`. */\n colorPrimary: {\n color: theme.palette.primary.main,\n '&:hover': {\n backgroundColor: (0, _colorManipulator.fade)(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n\n /* Styles applied to the root element if ` + "`")) + (`color=\"secondary\"` + ("`" + `. */\n colorSecondary: {\n color: theme.palette.secondary.main,\n '&:hover': {\n backgroundColor: (0, _colorManipulator.fade)(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`disabled={true}` + "`")) + (`. */\n disabled: {},\n\n /* Styles applied to the children container element. */\n label: {\n width: '100%',\n display: 'flex',\n alignItems: 'inherit',\n justifyContent: 'inherit'\n }\n };\n};\n/**\r\n * Refer to the [Icons](/style/icons/) section of the documentation\r\n * regarding the available icon options.\r\n */\n\n\nexports.styles = styles;\n\nfunction IconButton(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n className = props.className,\n color = props.color,\n disabled = props.disabled,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"color\", \"disabled\"]);\n return _react.default.createElement(_ButtonBase.default, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'default'), (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), _classNames), className),\n centerRipple: true,\n focusRipple: true,\n disabled: disabled\n }, other), _react.default.createElement(\"span\", {\n className: classes.label\n }, children));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? IconButton.propTypes = {\n /**\r\n * The icon element.\r\n */\n children: (0, _utils.chainPropTypes)(_propTypes.default.node, function (props) {\n var found = _react.default.Children.toArray(props.children).some(function (child) {\n return _react.default.isValidElement(child) && child.props.onClick;\n });\n\n if (found) {\n return new Error(['Material-UI: you are providing an onClick event listener ' + 'to a child of a button element.', 'Firefox will never trigger the event.', 'You should move the onClick listener to the parent button element.', 'https://github.com/mui-org/material-ui/issues/13957', // Change error message slightly on every check to prevent caching when testing\n // which would not trigger console errors on subsequent fails\n process.env.NODE_ENV === 'test' ? Date.now() : ''].join('\\n'));\n }\n\n return null;\n }),\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['default', 'inherit', 'primary', 'secondary']),\n\n /**\r\n * If ` + ("`" + `true`)))) + ((("`" + (`, the button will be disabled.\r\n */\n disabled: _propTypes.default.bool,\n\n /**\r\n * If ` + "`")) + (`true` + ("`" + `, the ripple will be disabled.\r\n */\n disableRipple: _propTypes.default.bool\n} : void 0;\nIconButton.defaultProps = {\n color: 'default',\n disabled: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiIconButton'\n})(IconButton);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _IconButton.default;\n }\n});\n\nvar _IconButton = _interopRequireDefault(require(\"./IconButton\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _ListContext = _interopRequireDefault(require(\"./ListContext\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n position: 'relative'\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`disablePadding={false}` + "`")) + ((`. */\n padding: {\n paddingTop: 8,\n paddingBottom: 8\n },\n\n /* Styles applied to the root element if ` + "`") + (`dense={true}` + "`")))))) + (((((` & ` + ("`" + `disablePadding={false}`)) + ("`" + (`. */\n dense: {\n paddingTop: 4,\n paddingBottom: 4\n },\n\n /* Styles applied to the root element if a ` + "`"))) + ((`subheader` + ("`" + ` is provided. */\n subheader: {\n paddingTop: 0\n }\n};\nexports.styles = styles;\n\nfunction List(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n className = props.className,\n Component = props.component,\n dense = props.dense,\n disablePadding = props.disablePadding,\n subheader = props.subheader,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"component\", \"dense\", \"disablePadding\", \"subheader\"]);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.dense, dense && !disablePadding), (0, _defineProperty2.default)(_classNames, classes.padding, !disablePadding), (0, _defineProperty2.default)(_classNames, classes.subheader, subheader), _classNames), className)\n }, other), _react.default.createElement(_ListContext.default.Provider, {\n value: {\n dense: dense\n }\n }, subheader, children));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? List.propTypes = {\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If `)) + ("`" + (`true` + "`")))) + (((`, compact vertical padding designed for keyboard and mouse input will be used for\r\n * the list and list items. The property is available to descendant components as the\r\n * ` + ("`" + `dense`)) + ("`" + (` context.\r\n */\n dense: _propTypes.default.bool,\n\n /**\r\n * If ` + "`"))) + ((`true` + ("`" + `, vertical padding will be removed from the list.\r\n */\n disablePadding: _propTypes.default.bool,\n\n /**\r\n * The content of the subheader, normally `)) + (("`" + `ListSubheader`) + ("`" + `.\r\n */\n subheader: _propTypes.default.node\n} : void 0;\nList.defaultProps = {\n component: 'ul',\n dense: false,\n disablePadding: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiList'\n})(List);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\n/**\r\n * @ignore - internal component.\r\n */\nvar ListContext = _react.default.createContext({});\n\nvar _default = ListContext;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _List.default;\n }\n});\n\nvar _List = _interopRequireDefault(require(\"./List\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _ButtonBase = _interopRequireDefault(require(\"../ButtonBase\"));\n\nvar _reactHelpers = require(\"../utils/reactHelpers\");\n\nvar _MergeListContext = _interopRequireDefault(require(\"./MergeListContext\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the (normally root) `))))) + (((("`" + (`component` + "`")) + (` element. May be wrapped by a ` + ("`" + `container`))) + (("`" + (`. */\n root: {\n display: 'flex',\n justifyContent: 'flex-start',\n alignItems: 'center',\n position: 'relative',\n textDecoration: 'none',\n width: '100%',\n boxSizing: 'border-box',\n textAlign: 'left',\n paddingTop: 11,\n // To use 10px in v4\n paddingBottom: 11,\n // To use 10px in v4\n '&$selected, &$selected:hover, &$selected:focus': {\n backgroundColor: theme.palette.action.selected\n }\n },\n\n /* Styles applied to the ` + "`")) + (`container` + ("`" + ` element if `)))) + ((("`" + (`children` + "`")) + (` includes ` + ("`" + `ListItemSecondaryAction`))) + (("`" + (`. */\n container: {\n position: 'relative'\n },\n // To remove in v4\n\n /* Styles applied to the ` + "`")) + ((`component` + "`") + (`'s ` + "`")))))))) + (((((((`focusVisibleClassName` + ("`" + ` property if `)) + ("`" + (`button={true}` + "`"))) + ((`. */\n focusVisible: {},\n\n /* Legacy styles applied to the root element. Use ` + ("`" + `root`)) + ("`" + (` instead. */\n default: {},\n\n /* Styles applied to the ` + "`")))) + (((`component` + ("`" + ` element if `)) + ("`" + (`dense={true}` + "`"))) + ((` or ` + ("`" + `children`)) + ("`" + (` includes ` + "`"))))) + ((((`Avatar` + ("`" + `. */\n dense: {\n paddingTop: 8,\n paddingBottom: 8\n },\n\n /* Styles applied to the `)) + ("`" + (`component` + "`"))) + ((` element if ` + ("`" + `alignItems=\"flex-start\"`)) + ("`" + (`. */\n alignItemsFlexStart: {\n alignItems: 'flex-start'\n },\n\n /* Styles applied to the inner ` + "`")))) + (((`component` + ("`" + ` element if `)) + ("`" + (`disabled={true}` + "`"))) + ((`. */\n disabled: {\n opacity: 0.5\n },\n\n /* Styles applied to the inner ` + ("`" + `component`)) + (("`" + ` element if `) + ("`" + `divider={true}`)))))) + ((((("`" + (`. */\n divider: {\n borderBottom: \"1px solid \".concat(theme.palette.divider),\n backgroundClip: 'padding-box'\n },\n\n /* Styles applied to the inner ` + "`")) + (`component` + ("`" + ` element if `))) + (("`" + (`disableGutters={false}` + "`")) + (`. */\n gutters: {\n paddingLeft: 16,\n paddingRight: 16\n },\n\n /* Styles applied to the inner ` + ("`" + `component`)))) + ((("`" + (` element if ` + "`")) + (`button={true}` + ("`" + `. */\n button: {\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.shortest\n }),\n '&:hover': {\n textDecoration: 'none',\n backgroundColor: theme.palette.action.hover,\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n },\n '&:focus': {\n backgroundColor: theme.palette.action.hover\n }\n },\n\n /* Styles applied to the `))) + (("`" + (`component` + "`")) + ((` element if ` + "`") + (`children` + "`"))))) + ((((` includes ` + ("`" + `ListItemSecondaryAction`)) + ("`" + (`. */\n secondaryAction: {\n // Add some space to avoid collision as ` + "`"))) + ((`ListItemSecondaryAction` + ("`" + `\n // is absolutely positioned.\n paddingRight: 32\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`selected={true}` + "`")))) + (((`. */\n selected: {}\n };\n};\n/**\r\n * Uses an additional container component if ` + ("`" + `ListItemSecondaryAction`)) + ("`" + (` is the last child.\r\n */\n\n\nexports.styles = styles;\n\nfunction ListItem(props) {\n var alignItems = props.alignItems,\n button = props.button,\n childrenProp = props.children,\n classes = props.classes,\n classNameProp = props.className,\n componentProp = props.component,\n ContainerComponent = props.ContainerComponent,\n _props$ContainerProps = props.ContainerProps;\n _props$ContainerProps = _props$ContainerProps === void 0 ? {} : _props$ContainerProps;\n var ContainerClassName = _props$ContainerProps.className,\n ContainerProps = (0, _objectWithoutProperties2.default)(_props$ContainerProps, [\"className\"]),\n denseProp = props.dense,\n disabled = props.disabled,\n disableGutters = props.disableGutters,\n divider = props.divider,\n focusVisibleClassName = props.focusVisibleClassName,\n selected = props.selected,\n other = (0, _objectWithoutProperties2.default)(props, [\"alignItems\", \"button\", \"children\", \"classes\", \"className\", \"component\", \"ContainerComponent\", \"ContainerProps\", \"dense\", \"disabled\", \"disableGutters\", \"divider\", \"focusVisibleClassName\", \"selected\"]);\n return _react.default.createElement(_MergeListContext.default, {\n dense: denseProp,\n alignItems: alignItems\n }, function (_ref) {\n var _classNames;\n\n var dense = _ref.dense;\n\n var children = _react.default.Children.toArray(childrenProp);\n\n var hasAvatar = children.some(function (value) {\n return (0, _reactHelpers.isMuiElement)(value, ['ListItemAvatar']);\n });\n var hasSecondaryAction = children.length && (0, _reactHelpers.isMuiElement)(children[children.length - 1], ['ListItemSecondaryAction']);\n var className = (0, _classnames.default)(classes.root, classes.default, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.dense, dense || hasAvatar), (0, _defineProperty2.default)(_classNames, classes.gutters, !disableGutters), (0, _defineProperty2.default)(_classNames, classes.divider, divider), (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), (0, _defineProperty2.default)(_classNames, classes.button, button), (0, _defineProperty2.default)(_classNames, classes.alignItemsFlexStart, alignItems === 'flex-start'), (0, _defineProperty2.default)(_classNames, classes.secondaryAction, hasSecondaryAction), (0, _defineProperty2.default)(_classNames, classes.selected, selected), _classNames), classNameProp);\n var componentProps = (0, _extends2.default)({\n className: className,\n disabled: disabled\n }, other);\n var Component = componentProp || 'li';\n\n if (button) {\n componentProps.component = componentProp || 'div';\n componentProps.focusVisibleClassName = (0, _classnames.default)(classes.focusVisible, focusVisibleClassName);\n Component = _ButtonBase.default;\n }\n\n if (hasSecondaryAction) {\n // Use div by default.\n Component = !componentProps.component && !componentProp ? 'div' : Component; // Avoid nesting of li > li.\n\n if (ContainerComponent === 'li') {\n if (Component === 'li') {\n Component = 'div';\n } else if (componentProps.component === 'li') {\n componentProps.component = 'div';\n }\n }\n\n return _react.default.createElement(ContainerComponent, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.container, ContainerClassName)\n }, ContainerProps), _react.default.createElement(Component, componentProps, children), children.pop());\n }\n\n return _react.default.createElement(Component, componentProps, children);\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? ListItem.propTypes = {\n /**\r\n * Defines the ` + "`"))) + ((`align-items` + ("`" + ` style property.\r\n */\n alignItems: _propTypes.default.oneOf(['flex-start', 'center']),\n\n /**\r\n * If `)) + (("`" + `true`) + ("`" + `, the list item will be a button (using `))))))) + (((((("`" + (`ButtonBase` + "`")) + (`).\r\n */\n button: _propTypes.default.bool,\n\n /**\r\n * The content of the component. If a ` + ("`" + `ListItemSecondaryAction`))) + (("`" + (` is used it must\r\n * be the last child.\r\n */\n children: (0, _utils.chainPropTypes)(_propTypes.default.node, function (props) {\n var children = _react.default.Children.toArray(props.children); // React.Children.toArray(props.children).findLastIndex(isListItemSecondaryAction)\n\n\n var secondaryActionIndex = -1;\n\n for (var i = children.length - 1; i >= 0; i -= 1) {\n var child = children[i];\n\n if ((0, _reactHelpers.isMuiElement)(child, ['ListItemSecondaryAction'])) {\n secondaryActionIndex = i;\n break;\n }\n } // is ListItemSecondaryAction the last child of ListItem\n\n\n if (secondaryActionIndex !== -1 && secondaryActionIndex !== children.length - 1) {\n return new Error('Material-UI: you used an element after ListItemSecondaryAction. ' + 'For ListItem to detect that it has a secondary action ' + \"you must pass it has the last children to ListItem.\".concat(process.env.NODE_ENV === 'test' ? Date.now() : ''));\n }\n\n return null;\n }),\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n * By default, it's a ` + "`")) + (`li` + ("`" + ` when `)))) + ((("`" + (`button` + "`")) + (` is ` + ("`" + `false`))) + (("`" + (` and a ` + "`")) + ((`div` + "`") + (` when ` + "`"))))) + ((((`button` + ("`" + ` is `)) + ("`" + (`true` + "`"))) + ((`.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * The container component used when a ` + ("`" + `ListItemSecondaryAction`)) + ("`" + (` is the last child.\r\n */\n ContainerComponent: _utils.componentPropType,\n\n /**\r\n * Properties applied to the container component if used.\r\n */\n ContainerProps: _propTypes.default.object,\n\n /**\r\n * If ` + "`")))) + (((`true` + ("`" + `, compact vertical padding designed for keyboard and mouse input will be used.\r\n */\n dense: _propTypes.default.bool,\n\n /**\r\n * If `)) + ("`" + (`true` + "`"))) + ((`, the list item will be disabled.\r\n */\n disabled: _propTypes.default.bool,\n\n /**\r\n * If ` + ("`" + `true`)) + (("`" + `, the left and right padding is removed.\r\n */\n disableGutters: _propTypes.default.bool,\n\n /**\r\n * If `) + ("`" + `true`)))))) + ((((("`" + (`, a 1px light border is added to the bottom of the list item.\r\n */\n divider: _propTypes.default.bool,\n\n /**\r\n * @ignore\r\n */\n focusVisibleClassName: _propTypes.default.string,\n\n /**\r\n * Use to apply selected styling.\r\n */\n selected: _propTypes.default.bool\n} : void 0;\nListItem.defaultProps = {\n alignItems: 'center',\n button: false,\n ContainerComponent: 'li',\n dense: false,\n disabled: false,\n disableGutters: false,\n divider: false,\n selected: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiListItem'\n})(ListItem);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _ListContext = _interopRequireDefault(require(\"../List/ListContext\"));\n\n/**\r\n * @ignore - internal component.\r\n *\r\n * Consumes a context and passes that context merged with its props.\r\n */\nfunction MergeListContext(props) {\n var alignItems = props.alignItems,\n children = props.children,\n dense = props.dense;\n return _react.default.createElement(_ListContext.default.Consumer, null, function (context) {\n var childContext = {\n dense: dense || context.dense || false,\n alignItems: alignItems\n };\n return _react.default.createElement(_ListContext.default.Provider, {\n value: childContext\n }, children(childContext));\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? MergeListContext.propTypes = {\n alignItems: _propTypes.default.oneOf(['flex-start', 'center']).isRequired,\n children: _propTypes.default.func.isRequired,\n dense: _propTypes.default.bool.isRequired\n} : void 0;\nvar _default = MergeListContext;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _ListItem.default;\n }\n});\n\nvar _ListItem = _interopRequireDefault(require(\"./ListItem\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n marginRight: 16,\n color: theme.palette.action.active,\n flexShrink: 0,\n display: 'inline-flex'\n }\n };\n};\n/**\r\n * A simple wrapper to apply ` + "`")) + (`List` + ("`" + ` styles to an `))) + (("`" + (`Icon` + "`")) + (` or ` + ("`" + `SvgIcon`)))) + ((("`" + (`.\r\n */\n\n\nexports.styles = styles;\n\nfunction ListItemIcon(props) {\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\"]);\n return _react.default.createElement(\"div\", (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, classNameProp)\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? ListItemIcon.propTypes = {\n /**\r\n * The content of the component, normally ` + "`")) + (`Icon` + ("`" + `, `))) + (("`" + (`SvgIcon` + "`")) + ((`,\r\n * or a ` + "`") + (`@material-ui/icons` + "`"))))) + ((((` SVG icon element.\r\n */\n children: _propTypes.default.element.isRequired,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string\n} : void 0;\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiListItemIcon'\n})(ListItemIcon);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _ListItemIcon.default;\n }\n});\n\nvar _ListItemIcon = _interopRequireDefault(require(\"./ListItemIcon\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Typography = _interopRequireDefault(require(\"../Typography\"));\n\nvar _ListContext = _interopRequireDefault(require(\"../List/ListContext\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n flex: '1 1 auto',\n minWidth: 0,\n padding: '0 16px',\n '&:first-child': {\n paddingLeft: 0\n }\n },\n\n /* Styles applied to the root element if ` + ("`" + `inset={true}`)) + ("`" + (`. */\n inset: {\n '&:first-child': {\n paddingLeft: 56\n }\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`context.dense` + ("`" + ` is `)) + ("`" + (`true` + "`")))) + (((`. */\n dense: {\n fontSize: theme.typography.pxToRem(13)\n },\n\n /* Styles applied to the primary ` + ("`" + `Typography`)) + ("`" + (` component. */\n primary: {\n '&$textDense': {\n fontSize: 'inherit'\n }\n },\n\n /* Styles applied to the secondary ` + "`"))) + ((`Typography` + ("`" + ` component. */\n secondary: {\n '&$textDense': {\n fontSize: 'inherit'\n }\n },\n\n /* Styles applied to the `)) + (("`" + `Typography`) + ("`" + ` components if `)))))))))) + ((((((((("`" + (`context.dense` + "`")) + (` is ` + ("`" + `true`))) + (("`" + (`. */\n textDense: {}\n };\n};\n\nexports.styles = styles;\n\nfunction ListItemText(props) {\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n disableTypography = props.disableTypography,\n inset = props.inset,\n primaryProp = props.primary,\n primaryTypographyProps = props.primaryTypographyProps,\n secondaryProp = props.secondary,\n secondaryTypographyProps = props.secondaryTypographyProps,\n theme = props.theme,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"disableTypography\", \"inset\", \"primary\", \"primaryTypographyProps\", \"secondary\", \"secondaryTypographyProps\", \"theme\"]);\n return _react.default.createElement(_ListContext.default.Consumer, null, function (_ref) {\n var _classNames3;\n\n var dense = _ref.dense;\n var primary = primaryProp != null ? primaryProp : children;\n\n if (primary != null && primary.type !== _Typography.default && !disableTypography) {\n primary = _react.default.createElement(_Typography.default, (0, _extends2.default)({\n variant: theme.typography.useNextVariants ? 'body1' : 'subheading',\n className: (0, _classnames.default)(classes.primary, (0, _defineProperty2.default)({}, classes.textDense, dense)),\n component: \"span\"\n }, primaryTypographyProps), primary);\n }\n\n var secondary = secondaryProp;\n\n if (secondary != null && secondary.type !== _Typography.default && !disableTypography) {\n secondary = _react.default.createElement(_Typography.default, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.secondary, (0, _defineProperty2.default)({}, classes.textDense, dense)),\n color: \"textSecondary\"\n }, secondaryTypographyProps), secondary);\n }\n\n return _react.default.createElement(\"div\", (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, (_classNames3 = {}, (0, _defineProperty2.default)(_classNames3, classes.dense, dense), (0, _defineProperty2.default)(_classNames3, classes.inset, inset), _classNames3), classNameProp)\n }, other), primary, secondary);\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? ListItemText.propTypes = {\n /**\r\n * Alias for the ` + "`")) + (`primary` + ("`" + ` property.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * If `)))) + ((("`" + (`true` + "`")) + (`, the children won't be wrapped by a Typography component.\r\n * This can be useful to render an alternative Typography variant by wrapping\r\n * the ` + ("`" + `children`))) + (("`" + (` (or ` + "`")) + (`primary` + ("`" + `) text, and optional `))))) + (((("`" + (`secondary` + "`")) + (` text\r\n * with the Typography component.\r\n */\n disableTypography: _propTypes.default.bool,\n\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the children will be indented.\r\n * This should be used if there is no left avatar or left icon.\r\n */\n inset: _propTypes.default.bool,\n\n /**\r\n * The main content element.\r\n */\n primary: _propTypes.default.node,\n\n /**\r\n * These props will be forwarded to the primary typography component\r\n * (as long as disableTypography is not ` + "`")) + (`true` + ("`" + `).\r\n */\n primaryTypographyProps: _propTypes.default.object,\n\n /**\r\n * The secondary content element.\r\n */\n secondary: _propTypes.default.node,\n\n /**\r\n * These props will be forwarded to the secondary typography component\r\n * (as long as disableTypography is not `)))) + ((("`" + (`true` + "`")) + (`).\r\n */\n secondaryTypographyProps: _propTypes.default.object,\n\n /**\r\n * @ignore\r\n */\n theme: _propTypes.default.object.isRequired\n} : void 0;\nListItemText.defaultProps = {\n disableTypography: false,\n inset: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiListItemText',\n withTheme: true\n})(ListItemText);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _ListItemText.default;\n }\n});\n\nvar _ListItemText = _interopRequireDefault(require(\"./ListItemText\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\n/**\r\n * NoSsr purposely removes components from the subject of Server Side Rendering (SSR).\r\n *\r\n * This component can be useful in a variety of situations:\r\n * - Escape hatch for broken dependencies not supporting SSR.\r\n * - Improve the time-to-first paint on the client by only rendering above the fold.\r\n * - Reduce the rendering time on the server.\r\n * - Under too heavy server load, you can turn on service degradation.\r\n */\nvar NoSsr =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(NoSsr, _React$Component);\n\n function NoSsr() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, NoSsr);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(NoSsr)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.mounted = false;\n _this.state = {\n mounted: false\n };\n return _this;\n }\n\n (0, _createClass2.default)(NoSsr, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n this.mounted = true;\n\n if (this.props.defer) {\n // Wondering why we use two RAFs? Check this video out:\n // https://www.youtube.com/watch?v=cCOL7MC4Pl0\n //\n // The componentDidMount() method is called after the DOM nodes are inserted.\n // The UI might not have rendering the changes. We request a frame.\n requestAnimationFrame(function () {\n // The browser should be about to render the DOM nodes\n // that React committed at this point.\n // We don't want to interrupt. Let's wait the next frame.\n requestAnimationFrame(function () {\n // The UI is up-to-date at this point.\n // We can continue rendering the children.\n if (_this2.mounted) {\n _this2.setState({\n mounted: true\n });\n }\n });\n });\n } else {\n this.setState({\n mounted: true\n });\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.mounted = false;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n children = _this$props.children,\n fallback = _this$props.fallback;\n return this.state.mounted ? children : fallback;\n }\n }]);\n return NoSsr;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? NoSsr.propTypes = {\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the component will not only prevent server-side rendering.\r\n * It will also defer the rendering of the children into a different screen frame.\r\n */\n defer: _propTypes.default.bool,\n\n /**\r\n * The fallback content to display.\r\n */\n fallback: _propTypes.default.node\n} : void 0;\n\nif (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== \"production\" ? NoSsr.propTypes = (0, _utils.exactProp)(NoSsr.propTypes) : void 0;\n}\n\nNoSsr.defaultProps = {\n defer: false,\n fallback: null\n};\nvar _default = NoSsr;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _NoSsr.default;\n }\n});\n\nvar _NoSsr = _interopRequireDefault(require(\"./NoSsr\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar styles = function styles(theme) {\n var elevations = {};\n theme.shadows.forEach(function (shadow, index) {\n elevations[\"elevation\".concat(index)] = {\n boxShadow: shadow\n };\n });\n return (0, _extends2.default)({\n /* Styles applied to the root element. */\n root: {\n backgroundColor: theme.palette.background.paper\n },\n\n /* Styles applied to the root element if ` + "`")) + ((`square={false}` + "`") + (`. */\n rounded: {\n borderRadius: theme.shape.borderRadius\n }\n }, elevations);\n};\n\nexports.styles = styles;\n\nfunction Paper(props) {\n var classes = props.classes,\n classNameProp = props.className,\n Component = props.component,\n square = props.square,\n elevation = props.elevation,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\", \"square\", \"elevation\"]);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(elevation >= 0 && elevation < 25, \"Material-UI: this elevation ` + "`")))))) + (((((`\".concat(elevation, \"` + ("`" + ` is not implemented.\")) : void 0;\n var className = (0, _classnames.default)(classes.root, classes[\"elevation\".concat(elevation)], (0, _defineProperty2.default)({}, classes.rounded, !square), classNameProp);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Paper.propTypes = {\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * Shadow depth, corresponds to `)) + ("`" + (`dp` + "`"))) + ((` in the spec.\r\n * It's accepting values between 0 and 24 inclusive.\r\n */\n elevation: _propTypes.default.number,\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, rounded corners are disabled.\r\n */\n square: _propTypes.default.bool\n} : void 0;\nPaper.defaultProps = {\n component: 'div',\n elevation: 2,\n square: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiPaper'\n})(Paper);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Paper.default;\n }\n});\n\nvar _Paper = _interopRequireDefault(require(\"./Paper\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _TableContext = _interopRequireDefault(require(\"./TableContext\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'table',\n fontFamily: theme.typography.fontFamily,\n width: '100%',\n borderCollapse: 'collapse',\n borderSpacing: 0\n }\n };\n};\n\nexports.styles = styles;\n\nvar Table =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(Table, _React$Component);\n\n function Table() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, Table);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(Table)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.memoizedContextValue = {};\n return _this;\n }\n\n (0, _createClass2.default)(Table, [{\n key: \"useMemo\",\n // To replace with the corresponding Hook once Material-UI v4 is out:\n // https://reactjs.org/docs/hooks-reference.html#usememo\n value: function useMemo(contextValue) {\n var objectKeys = Object.keys(contextValue);\n\n for (var i = 0; i < objectKeys.length; i += 1) {\n var objectKey = objectKeys[i];\n\n if (contextValue[objectKey] !== this.memoizedContextValue[objectKey]) {\n this.memoizedContextValue = contextValue;\n break;\n }\n }\n\n return this.memoizedContextValue;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n classes = _this$props.classes,\n className = _this$props.className,\n Component = _this$props.component,\n padding = _this$props.padding,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"classes\", \"className\", \"component\", \"padding\"]);\n return _react.default.createElement(_TableContext.default.Provider, {\n value: this.useMemo({\n padding: padding\n })\n }, _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, className)\n }, other)));\n }\n }]);\n return Table;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? Table.propTypes = {\n /**\r\n * The content of the table, normally ` + "`")))) + (((`TableHead` + ("`" + ` and `)) + ("`" + (`TableBody` + "`"))) + ((`.\r\n */\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * Allows TableCells to inherit padding of the Table.\r\n */\n padding: _propTypes.default.oneOf(['default', 'checkbox', 'dense', 'none'])\n} : void 0;\nTable.defaultProps = {\n component: 'table',\n padding: 'default'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTable'\n})(Table);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\n/**\r\n * @ignore - internal component.\r\n */\nvar TableContext = _react.default.createContext();\n\nvar _default = TableContext;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\n/**\r\n * @ignore - internal component.\r\n */\nvar Tablelvl2Context = _react.default.createContext();\n\nvar _default = Tablelvl2Context;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Table.default;\n }\n});\n\nvar _Table = _interopRequireDefault(require(\"./Table\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'table-row-group'\n }\n};\nexports.styles = styles;\nvar contextValue = {\n variant: 'body'\n};\n\nfunction TableBody(props) {\n var classes = props.classes,\n className = props.className,\n Component = props.component,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\"]);\n return _react.default.createElement(_Tablelvl2Context.default.Provider, {\n value: contextValue\n }, _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, className)\n }, other)));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableBody.propTypes = {\n /**\r\n * The content of the component, normally ` + ("`" + `TableRow`)) + (("`" + `.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType\n} : void 0;\nTableBody.defaultProps = {\n component: 'tbody'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableBody'\n})(TableBody);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _TableBody.default;\n }\n});\n\nvar _TableBody = _interopRequireDefault(require(\"./TableBody\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar _deprecatedPropType = _interopRequireDefault(require(\"../utils/deprecatedPropType\"));\n\nvar _colorManipulator = require(\"../styles/colorManipulator\");\n\nvar _TableContext = _interopRequireDefault(require(\"../Table/TableContext\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'table-cell',\n verticalAlign: 'inherit',\n // Workaround for a rendering bug with spanned columns in Chrome 62.0.\n // Removes the alpha (sets it to 1), and lightens or darkens the theme color.\n borderBottom: \"1px solid\\n \".concat(theme.palette.type === 'light' ? (0, _colorManipulator.lighten)((0, _colorManipulator.fade)(theme.palette.divider, 1), 0.88) : (0, _colorManipulator.darken)((0, _colorManipulator.fade)(theme.palette.divider, 1), 0.68)),\n textAlign: 'left',\n padding: '4px 56px 4px 24px',\n '&:last-child': {\n paddingRight: 24\n }\n },\n\n /* Styles applied to the root element if `) + ("`" + `variant=\"head\"`))))) + (((("`" + (` or ` + "`")) + (`context.table.head` + ("`" + `. */\n head: {\n color: theme.palette.text.secondary,\n fontSize: theme.typography.pxToRem(12),\n fontWeight: theme.typography.fontWeightMedium\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"body\"` + "`")) + (` or ` + ("`" + `context.table.body`)))) + ((("`" + (`. */\n body: {\n color: theme.palette.text.primary,\n fontSize: theme.typography.pxToRem(13),\n fontWeight: theme.typography.fontWeightRegular\n },\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"footer\"` + ("`" + ` or `))) + (("`" + (`context.table.footer` + "`")) + ((`. */\n footer: {\n borderBottom: 0,\n color: theme.palette.text.secondary,\n fontSize: theme.typography.pxToRem(12)\n },\n\n /* Styles applied to the root element if ` + "`") + (`numeric={true}` + "`"))))))) + ((((((`. */\n numeric: {\n textAlign: 'right',\n flexDirection: 'row-reverse' // can be dynamically inherited at runtime by contents\n\n },\n\n /* Styles applied to the root element if ` + ("`" + `padding=\"dense\"`)) + ("`" + (`. */\n paddingDense: {\n paddingRight: 24\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`padding=\"checkbox\"` + ("`" + `. */\n paddingCheckbox: {\n padding: '0 12px',\n '&:last-child': {\n paddingRight: 12\n }\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`padding=\"none\"` + "`")))) + (((`. */\n paddingNone: {\n padding: 0,\n '&:last-child': {\n padding: 0\n }\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"left\"`)) + ("`" + (`. */\n alignLeft: {\n textAlign: 'left'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`align=\"center\"` + ("`" + `. */\n alignCenter: {\n textAlign: 'center'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`align=\"right\"` + "`"))))) + ((((`. */\n alignRight: {\n textAlign: 'right',\n flexDirection: 'row-reverse'\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"justify\"`)) + ("`" + (`. */\n alignJustify: {\n textAlign: 'justify'\n }\n };\n};\n\nexports.styles = styles;\n\nfunction TableCell(props) {\n var align = props.align,\n children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n component = props.component,\n sortDirection = props.sortDirection,\n _props$numeric = props.numeric,\n numeric = _props$numeric === void 0 ? false : _props$numeric,\n paddingProp = props.padding,\n scopeProp = props.scope,\n variant = props.variant,\n other = (0, _objectWithoutProperties2.default)(props, [\"align\", \"children\", \"classes\", \"className\", \"component\", \"sortDirection\", \"numeric\", \"padding\", \"scope\", \"variant\"]);\n return _react.default.createElement(_TableContext.default.Consumer, null, function (table) {\n return _react.default.createElement(_Tablelvl2Context.default.Consumer, null, function (tablelvl2) {\n var _classNames;\n\n var Component;\n\n if (component) {\n Component = component;\n } else {\n Component = tablelvl2 && tablelvl2.variant === 'head' ? 'th' : 'td';\n }\n\n var scope = scopeProp;\n\n if (!scope && tablelvl2 && tablelvl2.variant === 'head') {\n scope = 'col';\n }\n\n var padding = paddingProp || (table && table.padding ? table.padding : 'default');\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.head, variant ? variant === 'head' : tablelvl2 && tablelvl2.variant === 'head'), (0, _defineProperty2.default)(_classNames, classes.body, variant ? variant === 'body' : tablelvl2 && tablelvl2.variant === 'body'), (0, _defineProperty2.default)(_classNames, classes.footer, variant ? variant === 'footer' : tablelvl2 && tablelvl2.variant === 'footer'), (0, _defineProperty2.default)(_classNames, classes[\"align\".concat((0, _helpers.capitalize)(align))], align !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes.numeric, numeric), (0, _defineProperty2.default)(_classNames, classes[\"padding\".concat((0, _helpers.capitalize)(padding))], padding !== 'default'), _classNames), classNameProp);\n var ariaSort = null;\n\n if (sortDirection) {\n ariaSort = sortDirection === 'asc' ? 'ascending' : 'descending';\n }\n\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className,\n \"aria-sort\": ariaSort,\n scope: scope\n }, other), children);\n });\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableCell.propTypes = {\n /**\r\n * Set the text-align on the table cell content.\r\n *\r\n * Monetary or generally number fields **should be right aligned** as that allows\r\n * you to add them up quickly in your head without having to worry about decimals.\r\n */\n align: _propTypes.default.oneOf(['inherit', 'left', 'center', 'right', 'justify']),\n\n /**\r\n * The table cell contents.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + "`"))) + ((`true` + ("`" + `, content will align to the right.\r\n */\n numeric: (0, _deprecatedPropType.default)(_propTypes.default.bool, 'Instead, use the `)) + ("`" + (`align` + "`")))) + (((` property.'),\n\n /**\r\n * Sets the padding applied to the cell.\r\n * By default, the Table parent component set the value.\r\n */\n padding: _propTypes.default.oneOf(['default', 'checkbox', 'dense', 'none']),\n\n /**\r\n * Set scope attribute.\r\n */\n scope: _propTypes.default.string,\n\n /**\r\n * Set aria-sort direction.\r\n */\n sortDirection: _propTypes.default.oneOf(['asc', 'desc', false]),\n\n /**\r\n * Specify the cell type.\r\n * By default, the TableHead, TableBody or TableFooter parent component set the value.\r\n */\n variant: _propTypes.default.oneOf(['head', 'body', 'footer'])\n} : void 0;\nTableCell.defaultProps = {\n align: 'inherit'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableCell'\n})(TableCell);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _TableCell.default;\n }\n});\n\nvar _TableCell = _interopRequireDefault(require(\"./TableCell\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'table-header-group'\n }\n};\nexports.styles = styles;\nvar contextValue = {\n variant: 'head'\n};\n\nfunction TableHead(props) {\n var classes = props.classes,\n className = props.className,\n Component = props.component,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\"]);\n return _react.default.createElement(_Tablelvl2Context.default.Provider, {\n value: contextValue\n }, _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, className)\n }, other)));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableHead.propTypes = {\n /**\r\n * The content of the component, normally ` + ("`" + `TableRow`)) + ("`" + (`.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType\n} : void 0;\nTableHead.defaultProps = {\n component: 'thead'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableHead'\n})(TableHead);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _TableHead.default;\n }\n});\n\nvar _TableHead = _interopRequireDefault(require(\"./TableHead\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n color: 'inherit',\n display: 'table-row',\n height: 48,\n verticalAlign: 'middle',\n // We disable the focus ring for mouse, touch and keyboard users.\n outline: 'none',\n '&$selected': {\n backgroundColor: theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.04)' // grey[100]\n : 'rgba(255, 255, 255, 0.08)'\n },\n '&$hover:hover': {\n backgroundColor: theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.07)' // grey[200]\n : 'rgba(255, 255, 255, 0.14)'\n }\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`selected={true}` + ("`" + `. */\n selected: {},\n\n /* Styles applied to the root element if `)) + (("`" + `hover={true}`) + ("`" + `. */\n hover: {},\n\n /* Styles applied to the root element if table variant = 'head'. */\n head: {\n height: 56\n },\n\n /* Styles applied to the root element if table variant = 'footer'. */\n footer: {\n height: 56\n }\n };\n};\n/**\r\n * Will automatically set dynamic row height\r\n * based on the material table element parent (head, body, etc).\r\n */\n\n\nexports.styles = styles;\n\nfunction TableRow(props) {\n var classes = props.classes,\n classNameProp = props.className,\n Component = props.component,\n hover = props.hover,\n selected = props.selected,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\", \"hover\", \"selected\"]);\n return _react.default.createElement(_Tablelvl2Context.default.Consumer, null, function (tablelvl2) {\n var _classNames;\n\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.head, tablelvl2 && tablelvl2.variant === 'head'), (0, _defineProperty2.default)(_classNames, classes.footer, tablelvl2 && tablelvl2.variant === 'footer'), (0, _defineProperty2.default)(_classNames, classes.hover, hover), (0, _defineProperty2.default)(_classNames, classes.selected, selected), _classNames), classNameProp);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableRow.propTypes = {\n /**\r\n * Should be valid children such as `)))))) + ((((("`" + (`TableCell` + "`")) + (`.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the table row will shade on hover.\r\n */\n hover: _propTypes.default.bool,\n\n /**\r\n * If ` + "`")) + (`true` + ("`" + `, the table row will have the selected shading.\r\n */\n selected: _propTypes.default.bool\n} : void 0;\nTableRow.defaultProps = {\n component: 'tr',\n hover: false,\n selected: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableRow'\n})(TableRow);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _TableRow.default;\n }\n});\n\nvar _TableRow = _interopRequireDefault(require(\"./TableRow\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center'\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + (`disableGutters={false}` + "`")) + (`. */\n gutters: theme.mixins.gutters(),\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"regular\"`))) + (("`" + (`. */\n regular: theme.mixins.toolbar,\n\n /* Styles applied to the root element if ` + "`")) + ((`variant=\"dense\"` + "`") + (`. */\n dense: {\n minHeight: 48\n }\n };\n};\n\nexports.styles = styles;\n\nfunction Toolbar(props) {\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n disableGutters = props.disableGutters,\n variant = props.variant,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"disableGutters\", \"variant\"]);\n var className = (0, _classnames.default)(classes.root, classes[variant], (0, _defineProperty2.default)({}, classes.gutters, !disableGutters), classNameProp);\n return _react.default.createElement(\"div\", (0, _extends2.default)({\n className: className\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Toolbar.propTypes = {\n /**\r\n * Toolbar children, usually a mixture of ` + "`"))))) + ((((`IconButton` + ("`" + `, `)) + ("`" + (`Button` + "`"))) + ((` and ` + ("`" + `Typography`)) + ("`" + (`.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * If ` + "`")))) + (((`true` + ("`" + `, disables gutter padding.\r\n */\n disableGutters: _propTypes.default.bool,\n\n /**\r\n * The variant to use.\r\n */\n variant: _propTypes.default.oneOf(['regular', 'dense'])\n} : void 0;\nToolbar.defaultProps = {\n disableGutters: false,\n variant: 'regular'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiToolbar'\n})(Toolbar);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Toolbar.default;\n }\n});\n\nvar _Toolbar = _interopRequireDefault(require(\"./Toolbar\"));", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'block',\n margin: 0\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`variant=\"display4\"` + "`"))) + ((`. */\n display4: theme.typography.display4,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"display3\"`)) + (("`" + `. */\n display3: theme.typography.display3,\n\n /* Styles applied to the root element if `) + ("`" + `variant=\"display2\"`)))))))) + ((((((("`" + (`. */\n display2: theme.typography.display2,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"display1\"` + ("`" + `. */\n display1: theme.typography.display1,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"headline\"` + "`")) + (`. */\n headline: theme.typography.headline,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"title\"`)))) + ((("`" + (`. */\n title: theme.typography.title,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"subheading\"` + ("`" + `. */\n subheading: theme.typography.subheading,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"body2\"` + "`")) + (`. */\n body2: theme.typography.body2,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"body1\"`))))) + (((("`" + (`. */\n body1: theme.typography.body1,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"caption\"` + ("`" + `. */\n caption: theme.typography.caption,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"button\"` + "`")) + (`. */\n button: theme.typography.button,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"h1\"`)))) + ((("`" + (`. */\n h1: theme.typography.h1,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"h2\"` + ("`" + `. */\n h2: theme.typography.h2,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"h3\"` + "`")) + ((`. */\n h3: theme.typography.h3,\n\n /* Styles applied to the root element if ` + "`") + (`variant=\"h4\"` + "`")))))) + (((((`. */\n h4: theme.typography.h4,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"h5\"`)) + ("`" + (`. */\n h5: theme.typography.h5,\n\n /* Styles applied to the root element if ` + "`"))) + ((`variant=\"h6\"` + ("`" + `. */\n h6: theme.typography.h6,\n\n /* Styles applied to the root element if `)) + ("`" + (`variant=\"subtitle1\"` + "`")))) + (((`. */\n subtitle1: theme.typography.subtitle1,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"subtitle2\"`)) + ("`" + (`. */\n subtitle2: theme.typography.subtitle2,\n\n /* Styles applied to the root element if ` + "`"))) + ((`variant=\"overline\"` + ("`" + `. */\n overline: theme.typography.overline,\n\n /* Styles applied to the root element if `)) + (("`" + `variant=\"srOnly\"`) + ("`" + `. Only accessible to screen readers. */\n srOnly: {\n position: 'absolute',\n height: 1,\n width: 1,\n overflow: 'hidden'\n },\n\n /* Styles applied to the root element if `))))) + (((("`" + (`align=\"left\"` + "`")) + (`. */\n alignLeft: {\n textAlign: 'left'\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"center\"`))) + (("`" + (`. */\n alignCenter: {\n textAlign: 'center'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`align=\"right\"` + ("`" + `. */\n alignRight: {\n textAlign: 'right'\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + (`align=\"justify\"` + "`")) + (`. */\n alignJustify: {\n textAlign: 'justify'\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"nowrap\"`))) + (("`" + (`. */\n noWrap: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n },\n\n /* Styles applied to the root element if ` + "`")) + ((`gutterBottom={true}` + "`") + (`. */\n gutterBottom: {\n marginBottom: '0.35em'\n },\n\n /* Styles applied to the root element if ` + "`"))))))) + ((((((`paragraph={true}` + ("`" + `. */\n paragraph: {\n marginBottom: 16\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`color=\"inherit\"` + "`"))) + ((`. */\n colorInherit: {\n color: 'inherit'\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"primary\"`)) + ("`" + (`. */\n colorPrimary: {\n color: theme.palette.primary.main\n },\n\n /* Styles applied to the root element if ` + "`")))) + (((`color=\"secondary\"` + ("`" + `. */\n colorSecondary: {\n color: theme.palette.secondary.main\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`color=\"textPrimary\"` + "`"))) + ((`. */\n colorTextPrimary: {\n color: theme.palette.text.primary\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"textSecondary\"`)) + (("`" + `. */\n colorTextSecondary: {\n color: theme.palette.text.secondary\n },\n\n /* Styles applied to the root element if `) + ("`" + `color=\"error\"`))))) + (((("`" + (`. */\n colorError: {\n color: theme.palette.error.main\n },\n\n /* Styles applied to the root element if ` + "`")) + (`inline={true}` + ("`" + `. */\n inline: {\n display: 'inline'\n }\n };\n};\n\nexports.styles = styles;\nvar nextVariants = {\n display4: 'h1',\n display3: 'h2',\n display2: 'h3',\n display1: 'h4',\n headline: 'h5',\n title: 'h6',\n subheading: 'subtitle1'\n};\n\nfunction getVariant(theme, variantProp) {\n var typography = theme.typography;\n var variant = variantProp;\n\n if (!variant) {\n variant = typography.useNextVariants ? 'body2' : 'body1';\n } // complete v2 switch\n\n\n if (typography.useNextVariants) {\n variant = nextVariants[variant] || variant;\n }\n\n return variant;\n}\n\nvar defaultHeadlineMapping = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n subtitle1: 'h6',\n subtitle2: 'h6',\n body1: 'p',\n body2: 'p',\n // deprecated\n display4: 'h1',\n display3: 'h1',\n display2: 'h1',\n display1: 'h1',\n headline: 'h1',\n title: 'h2',\n subheading: 'h3'\n};\n\nfunction Typography(props) {\n var _classNames;\n\n var align = props.align,\n classes = props.classes,\n classNameProp = props.className,\n color = props.color,\n componentProp = props.component,\n gutterBottom = props.gutterBottom,\n headlineMapping = props.headlineMapping,\n inline = props.inline,\n internalDeprecatedVariant = props.internalDeprecatedVariant,\n noWrap = props.noWrap,\n paragraph = props.paragraph,\n theme = props.theme,\n variantProp = props.variant,\n other = (0, _objectWithoutProperties2.default)(props, [\"align\", \"classes\", \"className\", \"color\", \"component\", \"gutterBottom\", \"headlineMapping\", \"inline\", \"internalDeprecatedVariant\", \"noWrap\", \"paragraph\", \"theme\", \"variant\"]);\n var variant = getVariant(theme, variantProp);\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[variant], variant !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'default'), (0, _defineProperty2.default)(_classNames, classes.noWrap, noWrap), (0, _defineProperty2.default)(_classNames, classes.gutterBottom, gutterBottom), (0, _defineProperty2.default)(_classNames, classes.paragraph, paragraph), (0, _defineProperty2.default)(_classNames, classes[\"align\".concat((0, _helpers.capitalize)(align))], align !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes.inline, inline), _classNames), classNameProp);\n var Component = componentProp || (paragraph ? 'p' : headlineMapping[variant] || defaultHeadlineMapping[variant]) || 'span';\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Typography.propTypes = {\n /**\r\n * Set the text-align on the component.\r\n */\n align: _propTypes.default.oneOf(['inherit', 'left', 'center', 'right', 'justify']),\n\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['default', 'error', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary']),\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n * By default, it maps the variant to a good default headline component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If `))) + (("`" + (`true` + "`")) + (`, the text will have a bottom margin.\r\n */\n gutterBottom: _propTypes.default.bool,\n\n /**\r\n * We are empirically mapping the variant property to a range of different DOM element types.\r\n * For instance, subtitle1 to ` + ("`" + `
`)))) + ((("`" + (`.\r\n * If you wish to change that mapping, you can provide your own.\r\n * Alternatively, you can use the ` + "`")) + (`component` + ("`" + ` property.\r\n * The default mapping is the following:\r\n */\n headlineMapping: _propTypes.default.object,\n\n /**\r\n * Controls whether the Typography is inline or not.\r\n */\n inline: _propTypes.default.bool,\n\n /**\r\n * A deprecated variant is used from an internal component. Users don't need\r\n * a deprecation warning here if they switched to the v2 theme. They already\r\n * get the mapping that will be applied in the next major release.\r\n *\r\n * @internal\r\n */\n internalDeprecatedVariant: _propTypes.default.bool,\n\n /**\r\n * If `))) + (("`" + (`true` + "`")) + ((`, the text will not wrap, but instead will truncate with an ellipsis.\r\n */\n noWrap: _propTypes.default.bool,\n\n /**\r\n * If ` + "`") + (`true` + "`")))))) + (((((`, the text will have a bottom margin.\r\n */\n paragraph: _propTypes.default.bool,\n\n /**\r\n * @ignore\r\n */\n theme: _propTypes.default.object.isRequired,\n\n /**\r\n * Applies the theme typography styles.\r\n * Use ` + ("`" + `body1`)) + ("`" + (` as the default value with the legacy implementation and ` + "`"))) + ((`body2` + ("`" + ` with the new one.\r\n */\n variant: (0, _utils.chainPropTypes)(_propTypes.default.oneOf(['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption', 'button', 'overline', 'srOnly', 'inherit', // deprecated\n 'display4', 'display3', 'display2', 'display1', 'headline', 'title', 'subheading']), function (props) {\n var deprecatedVariants = ['display4', 'display3', 'display2', 'display1', 'headline', 'title', 'subheading'];\n\n if (props.theme.typography.useNextVariants && !props.internalDeprecatedVariant && deprecatedVariants.indexOf(props.variant) !== -1) {\n return new Error('Material-UI: you are using a deprecated typography variant: ' + \"`)) + ("`" + (`\".concat(props.variant, \"` + "`")))) + (((` that will be removed in the next major release.\\n\") + 'Please read the migration guide under https://material-ui.com/style/typography#migration-to-typography-v2.');\n }\n\n return null;\n })\n} : void 0;\nTypography.defaultProps = {\n align: 'inherit',\n color: 'default',\n gutterBottom: false,\n headlineMapping: defaultHeadlineMapping,\n inline: false,\n noWrap: false,\n paragraph: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTypography',\n withTheme: true\n})(Typography);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Typography.default;\n }\n});\n\nvar _Typography = _interopRequireDefault(require(\"./Typography\"));", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar common = {\n black: '#000',\n white: '#fff'\n};\nvar _default = common;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar grey = {\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#eeeeee',\n 300: '#e0e0e0',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n A100: '#d5d5d5',\n A200: '#aaaaaa',\n A400: '#303030',\n A700: '#616161'\n};\nvar _default = grey;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar indigo = {\n 50: '#e8eaf6',\n 100: '#c5cae9',\n 200: '#9fa8da',\n 300: '#7986cb',\n 400: '#5c6bc0',\n 500: '#3f51b5',\n 600: '#3949ab',\n 700: '#303f9f',\n 800: '#283593',\n 900: '#1a237e',\n A100: '#8c9eff',\n A200: '#536dfe',\n A400: '#3d5afe',\n A700: '#304ffe'\n};\nvar _default = indigo;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar pink = {\n 50: '#fce4ec',\n 100: '#f8bbd0',\n 200: '#f48fb1',\n 300: '#f06292',\n 400: '#ec407a',\n 500: '#e91e63',\n 600: '#d81b60',\n 700: '#c2185b',\n 800: '#ad1457',\n 900: '#880e4f',\n A100: '#ff80ab',\n A200: '#ff4081',\n A400: '#f50057',\n A700: '#c51162'\n};\nvar _default = pink;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar red = {\n 50: '#ffebee',\n 100: '#ffcdd2',\n 200: '#ef9a9a',\n 300: '#e57373',\n 400: '#ef5350',\n 500: '#f44336',\n 600: '#e53935',\n 700: '#d32f2f',\n 800: '#c62828',\n 900: '#b71c1c',\n A100: '#ff8a80',\n A200: '#ff5252',\n A400: '#ff1744',\n A700: '#d50000'\n};\nvar _default = red;\nexports.default = _default;", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar UNMOUNTED = 'unmounted';\nexports.UNMOUNTED = UNMOUNTED;\nvar EXITED = 'exited';\nexports.EXITED = EXITED;\nvar ENTERING = 'entering';\nexports.ENTERING = ENTERING;\nvar ENTERED = 'entered';\nexports.ENTERED = ENTERED;\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: ` + ("`" + `Transition`)) + ("`" + (` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [` + "`"))) + ((`CSSTransition` + ("`" + `](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `)) + (("`" + `Transition`) + ("`" + `, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `))))) + (((("`" + (`Transition` + "`")) + (` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ` + ("`" + "`"))) + (("`" + (`jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: ` + "`")) + (`opacity ${duration}ms ease-in-out` + ("`" + `,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 0 },\n * entered: { opacity: 1 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {state => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * `)))) + ((("`" + ("`" + "`")) + (`\n *\n * There are 4 main states a Transition can be in:\n * - ` + ("`" + `'entering'`))) + (("`" + (`\n * - ` + "`")) + ((`'entered'` + "`") + (`\n * - ` + "`"))))))))) + ((((((((`'exiting'` + ("`" + `\n * - `)) + ("`" + (`'exited'` + "`"))) + ((`\n *\n * Transition state is toggled via the ` + ("`" + `in`)) + ("`" + (` prop. When ` + "`")))) + (((`true` + ("`" + ` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `)) + ("`" + (`'entering'` + "`"))) + ((` for the duration of the\n * transition and then to the ` + ("`" + `'entered'`)) + ("`" + (` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ` + "`"))))) + (((("`" + ("`" + `jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n *
\n * \n * {state => (\n * // ...\n * )}\n * \n * \n *
\n * );\n * }\n * `)) + ("`" + ("`" + "`"))) + ((`\n *\n * When the button is clicked the component will shift to the ` + ("`" + `'entering'`)) + ("`" + (` state\n * and stay there for 500ms (the value of ` + "`")))) + (((`timeout` + ("`" + `) before it finally switches\n * to `)) + ("`" + (`'entered'` + "`"))) + ((`.\n *\n * When ` + ("`" + `in`)) + (("`" + ` is `) + ("`" + `false`)))))) + ((((("`" + (` the same thing happens except the state moves from\n * ` + "`")) + (`'exiting'` + ("`" + ` to `))) + (("`" + (`'exited'` + "`")) + (`.\n */\n\nexports.EXITING = EXITING;\n\nvar Transition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context.transitionGroup; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n var _proto = Transition.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: null // allows for nested Transitions\n\n };\n };\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n }; // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n var node = _reactDom.default.findDOMNode(this);\n\n if (nextStatus === ENTERING) {\n this.performEnter(node, mounting);\n } else {\n this.performExit(node);\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(node, mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node);\n });\n return;\n }\n\n this.props.onEnter(node, appearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(node, appearing);\n\n _this2.onTransitionEnd(node, enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node, appearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit(node) {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts(); // no exit animation skip right to EXITED\n\n if (!exit) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n return;\n }\n\n this.props.onExit(node);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(node);\n\n _this3.onTransitionEnd(node, timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {\n this.setNextCallback(handler);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n this.props.addEndListener(node, this.nextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\"]); // filter props for Transtition\n\n\n delete childProps.in;\n delete childProps.mountOnEnter;\n delete childProps.unmountOnExit;\n delete childProps.appear;\n delete childProps.enter;\n delete childProps.exit;\n delete childProps.timeout;\n delete childProps.addEndListener;\n delete childProps.onEnter;\n delete childProps.onEntering;\n delete childProps.onEntered;\n delete childProps.onExit;\n delete childProps.onExiting;\n delete childProps.onExited;\n\n if (typeof children === 'function') {\n return children(status, childProps);\n }\n\n var child = _react.default.Children.only(children);\n\n return _react.default.cloneElement(child, childProps);\n };\n\n return Transition;\n}(_react.default.Component);\n\nTransition.contextTypes = {\n transitionGroup: PropTypes.object\n};\nTransition.childContextTypes = {\n transitionGroup: function transitionGroup() {}\n};\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A ` + ("`" + `function`)))) + ((("`" + (` child can be used instead of a React element. This function is\n * called with the current transition status (` + "`")) + (`'entering'` + ("`" + `, `))) + (("`" + (`'entered'` + "`")) + ((`,\n * ` + "`") + (`'exiting'` + "`"))))) + ((((`, ` + ("`" + `'exited'`)) + ("`" + (`, ` + "`"))) + ((`'unmounted'` + ("`" + `), which can be used to apply context\n * specific props to a component.\n *\n * `)) + ("`" + ("`" + "`")))) + (((`jsx\n * \n * {state => (\n * \n * )}\n * \n * ` + "`"))) + (("`" + ("`" + `\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent `)) + (("`" + `Transition`) + ("`" + ` component. If you want to \"lazy mount\" the component on the\n * first `))))))) + (((((("`" + (`in={true}` + "`")) + (` you can set ` + ("`" + `mountOnEnter`))) + (("`" + (`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify ` + "`")) + (`unmountOnExit` + ("`" + `.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `)))) + ((("`" + (`'exited'` + "`")) + (` state.\n * Set ` + ("`" + `unmountOnExit`))) + (("`" + (` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * Normally a component is not transitioned if it is shown when the ` + "`")) + (`` + ("`" + ` component mounts.\n * If you want to transition on the first mount set `))))) + (((("`" + (`appear` + "`")) + (` to ` + ("`" + `true`))) + (("`" + (`, and the\n * component will transition in as soon as the ` + "`")) + (`` + ("`" + ` mounts.\n *\n * > Note: there are no specific \"appear\" states. `)))) + ((("`" + (`appear` + "`")) + (` only adds an additional ` + ("`" + `enter`))) + (("`" + (` transition.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless ` + "`")) + ((`addEndListener` + "`") + (` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ` + "`")))))) + ((((("`" + ("`" + `jsx\n * timeout={500}\n * `)) + ("`" + ("`" + "`"))) + ((`\n *\n * or individually:\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ` + "`")))) + ((("`" + ("`" + `\n *\n * - `)) + ("`" + (`appear` + "`"))) + ((` defaults to the value of ` + ("`" + `enter`)) + (("`" + `\n * - `) + ("`" + `enter`))))) + (((("`" + (` defaults to ` + "`")) + (`0` + ("`" + `\n * - `))) + (("`" + (`exit` + "`")) + (` defaults to ` + ("`" + `0`)))) + ((("`" + (`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = _PropTypes.timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a ` + "`")) + (`done` + ("`" + ` callback. Allows for more fine grained transition end\n * logic. **Note:** Timeouts are still used as a fallback if provided.\n *\n * `))) + (("`" + ("`" + "`")) + ((`jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ` + "`") + ("`" + "`")))))))) + (((((((`\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * ` + ("`" + `isAppearing`)) + ("`" + (` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * ` + "`"))) + ((`isAppearing` + ("`" + ` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `)) + ("`" + (`isAppearing` + "`")))) + (((` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func // Name the function so it is clearer in the documentation\n\n} : {};\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = 0;\nTransition.EXITED = 1;\nTransition.ENTERING = 2;\nTransition.ENTERED = 3;\nTransition.EXITING = 4;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(Transition);\n\nexports.default = _default;", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _ChildMapping = require(\"./utils/ChildMapping\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nvar values = Object.values || function (obj) {\n return Object.keys(obj).map(function (k) {\n return obj[k];\n });\n};\n\nvar defaultProps = {\n component: 'div',\n childFactory: function childFactory(child) {\n return child;\n }\n /**\n * The ` + ("`" + ``)) + ("`" + (` component manages a set of transition components\n * (` + "`"))) + ((`` + ("`" + ` and `)) + ("`" + (`` + "`"))))) + ((((`) in a list. Like with the transition\n * components, ` + ("`" + ``)) + ("`" + (` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * ` + "`"))) + ((`in` + ("`" + ` prop is toggled automatically by the `)) + ("`" + (`` + "`")))) + (((`.\n *\n * Note that ` + ("`" + ``)) + ("`" + (` does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\n};\n\nvar TransitionGroup =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(TransitionGroup, _React$Component);\n\n function TransitionGroup(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n\n var handleExited = _this.handleExited.bind(_assertThisInitialized(_assertThisInitialized(_this))); // Initial children should all be entering, dependent on appear\n\n\n _this.state = {\n handleExited: handleExited,\n firstRender: true\n };\n return _this;\n }\n\n var _proto = TransitionGroup.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: {\n isMounting: !this.appeared\n }\n };\n };\n\n _proto.componentDidMount = function componentDidMount() {\n this.appeared = true;\n this.mounted = true;\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.mounted = false;\n };\n\n TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n var prevChildMapping = _ref.children,\n handleExited = _ref.handleExited,\n firstRender = _ref.firstRender;\n return {\n children: firstRender ? (0, _ChildMapping.getInitialChildMapping)(nextProps, handleExited) : (0, _ChildMapping.getNextChildMapping)(nextProps, prevChildMapping, handleExited),\n firstRender: false\n };\n };\n\n _proto.handleExited = function handleExited(child, node) {\n var currentChildMapping = (0, _ChildMapping.getChildMapping)(this.props.children);\n if (child.key in currentChildMapping) return;\n\n if (child.props.onExited) {\n child.props.onExited(node);\n }\n\n if (this.mounted) {\n this.setState(function (state) {\n var children = _extends({}, state.children);\n\n delete children[child.key];\n return {\n children: children\n };\n });\n }\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n Component = _this$props.component,\n childFactory = _this$props.childFactory,\n props = _objectWithoutPropertiesLoose(_this$props, [\"component\", \"childFactory\"]);\n\n var children = values(this.state.children).map(childFactory);\n delete props.appear;\n delete props.enter;\n delete props.exit;\n\n if (Component === null) {\n return children;\n }\n\n return _react.default.createElement(Component, props, children);\n };\n\n return TransitionGroup;\n}(_react.default.Component);\n\nTransitionGroup.childContextTypes = {\n transitionGroup: _propTypes.default.object.isRequired\n};\nTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * ` + "`"))) + ((`` + ("`" + ` renders a `)) + (("`" + `
`) + ("`" + ` by default. You can change this\n * behavior by providing a `)))))) + ((((("`" + (`component` + "`")) + (` prop.\n * If you use React v16+ and would like to avoid a wrapping ` + ("`" + `
`))) + (("`" + (` element\n * you can pass in ` + "`")) + (`component={null}` + ("`" + `. This is useful if the wrapping div\n * borks your css styles.\n */\n component: _propTypes.default.any,\n\n /**\n * A set of `)))) + ((("`" + (`` + "`")) + (` components, that are toggled ` + ("`" + `in`))) + (("`" + (` and out as they\n * leave. the ` + "`")) + ((`` + "`") + (` will inject specific transition props, so\n * remember to spread them through if you are wrapping the ` + "`"))))) + ((((`` + ("`" + ` as\n * with our `)) + ("`" + (`` + "`"))) + ((` example.\n *\n * While this component is meant for multiple ` + ("`" + `Transition`)) + ("`" + (` or ` + "`")))) + (((`CSSTransition` + ("`" + `\n * children, sometimes you may want to have a single transition child with\n * content that you want to be transitioned out and in when you change it\n * (e.g. routes, images etc.) In that case you can change the `)) + ("`" + (`key` + "`"))) + ((` prop of\n * the transition child as you change its content, this will cause\n * ` + ("`" + `TransitionGroup`)) + (("`" + ` to transition the child out and back in.\n */\n children: _propTypes.default.node,\n\n /**\n * A convenience prop that enables or disables appear animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n appear: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables enter animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n enter: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables exit animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n exit: _propTypes.default.bool,\n\n /**\n * You may need to apply reactive updates to a child as it is exiting.\n * This is generally done by using `) + ("`" + `cloneElement`))))))) + (((((("`" + (` however in the case of an exiting\n * child the element has already been removed and not accessible to the consumer.\n *\n * If you do need to update a child as it leaves you can provide a ` + "`")) + (`childFactory` + ("`" + `\n * to wrap every child, even the ones that are leaving.\n *\n * @type Function(child: ReactElement) -> ReactElement\n */\n childFactory: _propTypes.default.func\n} : {};\nTransitionGroup.defaultProps = defaultProps;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(TransitionGroup);\n\nexports.default = _default;\nmodule.exports = exports[\"default\"];", + "\"use strict\";\n\nexports.__esModule = true;\nexports.getChildMapping = getChildMapping;\nexports.mergeChildMappings = mergeChildMappings;\nexports.getInitialChildMapping = getInitialChildMapping;\nexports.getNextChildMapping = getNextChildMapping;\n\nvar _react = require(\"react\");\n\n/**\n * Given `))) + (("`" + (`this.props.children` + "`")) + (`, return an object mapping key to child.\n *\n * @param {*} children ` + ("`" + `this.props.children`)))) + ((("`" + (`\n * @return {object} Mapping of key to child\n */\nfunction getChildMapping(children, mapFn) {\n var mapper = function mapper(child) {\n return mapFn && (0, _react.isValidElement)(child) ? mapFn(child) : child;\n };\n\n var result = Object.create(null);\n if (children) _react.Children.map(children, function (c) {\n return c;\n }).forEach(function (child) {\n // run the map function here instead so that the key is the computed one\n result[child.key] = mapper(child);\n });\n return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * ` + "`")) + (`ReactTransitionChildMapping.getChildMapping()` + ("`" + `.\n * @param {object} next next children as returned from\n * `))) + (("`" + (`ReactTransitionChildMapping.getChildMapping()` + "`")) + ((`.\n * @return {object} a key set that contains all keys in ` + "`") + (`prev` + "`"))))) + ((((` and all keys\n * in ` + ("`" + `next`)) + ("`" + (` in a reasonable order.\n */\n\n\nfunction mergeChildMappings(prev, next) {\n prev = prev || {};\n next = next || {};\n\n function getValueForKey(key) {\n return key in next ? next[key] : prev[key];\n } // For each key of ` + "`"))) + ((`next` + ("`" + `, the list of keys to insert before that key in\n // the combined list\n\n\n var nextKeysPending = Object.create(null);\n var pendingKeys = [];\n\n for (var prevKey in prev) {\n if (prevKey in next) {\n if (pendingKeys.length) {\n nextKeysPending[prevKey] = pendingKeys;\n pendingKeys = [];\n }\n } else {\n pendingKeys.push(prevKey);\n }\n }\n\n var i;\n var childMapping = {};\n\n for (var nextKey in next) {\n if (nextKeysPending[nextKey]) {\n for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n var pendingNextKey = nextKeysPending[nextKey][i];\n childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n }\n }\n\n childMapping[nextKey] = getValueForKey(nextKey);\n } // Finally, add the keys which didn't appear before any key in `)) + ("`" + (`next` + "`")))) + (((`\n\n\n for (i = 0; i < pendingKeys.length; i++) {\n childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n }\n\n return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nfunction getInitialChildMapping(props, onExited) {\n return getChildMapping(props.children, function (child) {\n return (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n appear: getProp(child, 'appear', props),\n enter: getProp(child, 'enter', props),\n exit: getProp(child, 'exit', props)\n });\n });\n}\n\nfunction getNextChildMapping(nextProps, prevChildMapping, onExited) {\n var nextChildMapping = getChildMapping(nextProps.children);\n var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n Object.keys(children).forEach(function (key) {\n var child = children[key];\n if (!(0, _react.isValidElement)(child)) return;\n var hasPrev = key in prevChildMapping;\n var hasNext = key in nextChildMapping;\n var prevChild = prevChildMapping[key];\n var isLeaving = (0, _react.isValidElement)(prevChild) && !prevChild.props.in; // item is new (entering)\n\n if (hasNext && (!hasPrev || isLeaving)) {\n // console.log('entering', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n } else if (!hasNext && hasPrev && !isLeaving) {\n // item is old (exiting)\n // console.log('leaving', key)\n children[key] = (0, _react.cloneElement)(child, {\n in: false\n });\n } else if (hasNext && hasPrev && (0, _react.isValidElement)(prevChild)) {\n // item hasn't changed transition states\n // copy over the last transition props;\n // console.log('unchanged', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: prevChild.props.in,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n }\n });\n return children;\n}", + "\"use strict\";\n\nexports.__esModule = true;\nexports.classNamesShape = exports.timeoutsShape = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar timeoutsShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({\n enter: _propTypes.default.number,\n exit: _propTypes.default.number,\n appear: _propTypes.default.number\n}).isRequired]) : null;\nexports.timeoutsShape = timeoutsShape;\nvar classNamesShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({\n enter: _propTypes.default.string,\n exit: _propTypes.default.string,\n active: _propTypes.default.string\n}), _propTypes.default.shape({\n enter: _propTypes.default.string,\n enterDone: _propTypes.default.string,\n enterActive: _propTypes.default.string,\n exit: _propTypes.default.string,\n exitDone: _propTypes.default.string,\n exitActive: _propTypes.default.string\n})]) : null;\nexports.classNamesShape = classNamesShape;", + "\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.MuiThemeProviderOld = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _brcast = _interopRequireDefault(require(\"brcast\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _themeListener = _interopRequireWildcard(require(\"./themeListener\"));\n\n/* eslint-disable no-underscore-dangle */\n\n/**\r\n * This component takes a ` + ("`" + `theme`)) + ("`" + (` property.\r\n * It makes the ` + "`"))) + ((`theme` + ("`" + ` available down the React tree thanks to React context.\r\n * This component should preferably be used at **the root of your component tree**.\r\n */\nvar MuiThemeProviderOld =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(MuiThemeProviderOld, _React$Component);\n\n // We are not using the React state in order to avoid unnecessary rerender.\n function MuiThemeProviderOld(props, context) {\n var _this;\n\n (0, _classCallCheck2.default)(this, MuiThemeProviderOld);\n _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(MuiThemeProviderOld).call(this)); // Get the outer theme from the context, can be null\n\n _this.broadcast = (0, _brcast.default)();\n _this.outerTheme = _themeListener.default.initial(context); // Propagate the theme so it can be accessed by the children\n\n _this.broadcast.setState(_this.mergeOuterLocalTheme(props.theme));\n\n return _this;\n }\n\n (0, _createClass2.default)(MuiThemeProviderOld, [{\n key: \"getChildContext\",\n value: function getChildContext() {\n var _ref;\n\n var _this$props = this.props,\n disableStylesGeneration = _this$props.disableStylesGeneration,\n sheetsCache = _this$props.sheetsCache,\n sheetsManager = _this$props.sheetsManager;\n var muiThemeProviderOptions = this.context.muiThemeProviderOptions || {};\n\n if (disableStylesGeneration !== undefined) {\n muiThemeProviderOptions.disableStylesGeneration = disableStylesGeneration;\n }\n\n if (sheetsCache !== undefined) {\n muiThemeProviderOptions.sheetsCache = sheetsCache;\n }\n\n if (sheetsManager !== undefined) {\n muiThemeProviderOptions.sheetsManager = sheetsManager;\n }\n\n return _ref = {}, (0, _defineProperty2.default)(_ref, _themeListener.CHANNEL, this.broadcast), (0, _defineProperty2.default)(_ref, \"muiThemeProviderOptions\", muiThemeProviderOptions), _ref;\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n // Subscribe on the outer theme, if present\n this.unsubscribeId = _themeListener.default.subscribe(this.context, function (outerTheme) {\n _this2.outerTheme = outerTheme; // Forward the parent theme update to the children\n\n _this2.broadcast.setState(_this2.mergeOuterLocalTheme(_this2.props.theme));\n });\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps) {\n // Propagate a local theme update\n if (this.props.theme !== prevProps.theme) {\n this.broadcast.setState(this.mergeOuterLocalTheme(this.props.theme));\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n if (this.unsubscribeId !== null) {\n _themeListener.default.unsubscribe(this.context, this.unsubscribeId);\n }\n } // Simple merge between the outer theme and the local theme\n\n }, {\n key: \"mergeOuterLocalTheme\",\n value: function mergeOuterLocalTheme(localTheme) {\n // To support composition of theme.\n if (typeof localTheme === 'function') {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(this.outerTheme, ['Material-UI: you are providing a theme function property ' + 'to the MuiThemeProvider component:', ' outerTheme} />', 'However, no outer theme is present.', 'Make sure a theme is already injected higher in the React tree ' + 'or provide a theme object.'].join('\\n')) : void 0;\n return localTheme(this.outerTheme);\n }\n\n if (!this.outerTheme) {\n return localTheme;\n }\n\n return (0, _extends2.default)({}, this.outerTheme, localTheme);\n }\n }, {\n key: \"render\",\n value: function render() {\n // TODO move the sheetsManager property to a different component.\n // warning(\n // typeof window !== 'undefined' || this.props.sheetsManager,\n // [\n // 'Material-UI: you need to provide a sheetsManager to the MuiThemeProvider ' +\n // 'when rendering on the server.',\n // 'If you do not, you might experience a memory leak',\n // ].join('\\n'),\n // );\n return this.props.children;\n }\n }]);\n return MuiThemeProviderOld;\n}(_react.default.Component);\n\nexports.MuiThemeProviderOld = MuiThemeProviderOld;\nprocess.env.NODE_ENV !== \"production\" ? MuiThemeProviderOld.propTypes = {\n /**\r\n * You can wrap a node.\r\n */\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * You can disable the generation of the styles with this option.\r\n * It can be useful when traversing the React tree outside of the HTML\r\n * rendering step on the server.\r\n * Let's say you are using react-apollo to extract all\r\n * the queries made by the interface server-side.\r\n * You can significantly speed up the traversal with this property.\r\n */\n disableStylesGeneration: _propTypes.default.bool,\n\n /**\r\n * @ignore\r\n *\r\n * In beta.\r\n */\n sheetsCache: _propTypes.default.object,\n\n /**\r\n * The sheetsManager is used to deduplicate style sheet injection in the page.\r\n * It's deduplicating using the (theme, styles) couple.\r\n * On the server, you should provide a new instance for each request.\r\n */\n sheetsManager: _propTypes.default.object,\n\n /**\r\n * A theme object.\r\n */\n theme: _propTypes.default.oneOfType([_propTypes.default.object, _propTypes.default.func]).isRequired\n} : void 0;\n\nif (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== \"production\" ? MuiThemeProviderOld.propTypes = (0, _utils.exactProp)(MuiThemeProviderOld.propTypes) : void 0;\n}\n\nMuiThemeProviderOld.childContextTypes = (0, _extends2.default)({}, _themeListener.default.contextTypes, {\n muiThemeProviderOptions: _propTypes.default.object\n});\nMuiThemeProviderOld.contextTypes = (0, _extends2.default)({}, _themeListener.default.contextTypes, {\n muiThemeProviderOptions: _propTypes.default.object\n});\n/* istanbul ignore if */\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__) {\n _utils.ponyfillGlobal.__MUI_STYLES__ = {};\n}\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__.MuiThemeProvider) {\n _utils.ponyfillGlobal.__MUI_STYLES__.MuiThemeProvider = MuiThemeProviderOld;\n}\n\nvar _default = _utils.ponyfillGlobal.__MUI_STYLES__.MuiThemeProvider;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertHexToRGB = convertHexToRGB;\nexports.rgbToHex = rgbToHex;\nexports.decomposeColor = decomposeColor;\nexports.recomposeColor = recomposeColor;\nexports.getContrastRatio = getContrastRatio;\nexports.getLuminance = getLuminance;\nexports.emphasize = emphasize;\nexports.fade = fade;\nexports.darken = darken;\nexports.lighten = lighten;\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\n/* eslint-disable no-use-before-define */\n\n/**\r\n * Returns a number whose value is limited to the given range.\r\n *\r\n * @param {number} value The value to be clamped\r\n * @param {number} min The lower boundary of the output range\r\n * @param {number} max The upper boundary of the output range\r\n * @returns {number} A number in the range [min, max]\r\n */\nfunction clamp(value) {\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(value >= min && value <= max, \"Material-UI: the value provided \".concat(value, \" is out of range [\").concat(min, \", \").concat(max, \"].\")) : void 0;\n\n if (value < min) {\n return min;\n }\n\n if (value > max) {\n return max;\n }\n\n return value;\n}\n/**\r\n * Converts a color from CSS hex format to CSS rgb format.\r\n *\r\n * @param {string} color - Hex color, i.e. #nnn or #nnnnnn\r\n * @returns {string} A CSS rgb color string\r\n */\n\n\nfunction convertHexToRGB(color) {\n color = color.substr(1);\n var re = new RegExp(\".{1,\".concat(color.length / 3, \"}\"), 'g');\n var colors = color.match(re);\n\n if (colors && colors[0].length === 1) {\n colors = colors.map(function (n) {\n return n + n;\n });\n }\n\n return colors ? \"rgb(\".concat(colors.map(function (n) {\n return parseInt(n, 16);\n }).join(', '), \")\") : '';\n}\n/**\r\n * Converts a color from CSS rgb format to CSS hex format.\r\n *\r\n * @param {string} color - RGB color, i.e. rgb(n, n, n)\r\n * @returns {string} A CSS rgb color string, i.e. #nnnnnn\r\n */\n\n\nfunction rgbToHex(color) {\n // Pass hex straight through\n if (color.indexOf('#') === 0) {\n return color;\n }\n\n function intToHex(c) {\n var hex = c.toString(16);\n return hex.length === 1 ? \"0\".concat(hex) : hex;\n }\n\n var _decomposeColor = decomposeColor(color),\n values = _decomposeColor.values;\n\n values = values.map(function (n) {\n return intToHex(n);\n });\n return \"#\".concat(values.join(''));\n}\n/**\r\n * Returns an object with the type and values of a color.\r\n *\r\n * Note: Does not support rgb % values.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @returns {object} - A MUI color object: {type: string, values: number[]}\r\n */\n\n\nfunction decomposeColor(color) {\n if (color.charAt(0) === '#') {\n return decomposeColor(convertHexToRGB(color));\n }\n\n var marker = color.indexOf('(');\n var type = color.substring(0, marker);\n var values = color.substring(marker + 1, color.length - 1).split(',');\n values = values.map(function (value) {\n return parseFloat(value);\n });\n\n if (process.env.NODE_ENV !== 'production') {\n if (['rgb', 'rgba', 'hsl', 'hsla'].indexOf(type) === -1) {\n throw new Error([\"Material-UI: unsupported `)) + (("`" + `\".concat(color, \"`) + ("`" + ` color.\"), 'We support the following formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla().'].join('\\n'));\n }\n }\n\n return {\n type: type,\n values: values\n };\n}\n/**\r\n * Converts a color object with type and values to a string.\r\n *\r\n * @param {object} color - Decomposed color\r\n * @param {string} color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla'\r\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\r\n * @returns {string} A CSS color string\r\n */\n\n\nfunction recomposeColor(color) {\n var type = color.type;\n var values = color.values;\n\n if (type.indexOf('rgb') !== -1) {\n // Only convert the first 3 values to int (i.e. not alpha)\n values = values.map(function (n, i) {\n return i < 3 ? parseInt(n, 10) : n;\n });\n }\n\n if (type.indexOf('hsl') !== -1) {\n values[1] = \"\".concat(values[1], \"%\");\n values[2] = \"\".concat(values[2], \"%\");\n }\n\n return \"\".concat(color.type, \"(\").concat(values.join(', '), \")\");\n}\n/**\r\n * Calculates the contrast ratio between two colors.\r\n *\r\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\r\n *\r\n * @param {string} foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {string} background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @returns {number} A contrast ratio value in the range 0 - 21.\r\n */\n\n\nfunction getContrastRatio(foreground, background) {\n var lumA = getLuminance(foreground);\n var lumB = getLuminance(background);\n return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n/**\r\n * The relative brightness of any point in a color space,\r\n * normalized to 0 for darkest black and 1 for lightest white.\r\n *\r\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @returns {number} The relative brightness of the color in the range 0 - 1\r\n */\n\n\nfunction getLuminance(color) {\n var decomposedColor = decomposeColor(color);\n\n if (decomposedColor.type.indexOf('rgb') !== -1) {\n var rgb = decomposedColor.values.map(function (val) {\n val /= 255; // normalized\n\n return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n }); // Truncate at 3 digits\n\n return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3));\n } // else if (decomposedColor.type.indexOf('hsl') !== -1)\n\n\n return decomposedColor.values[2] / 100;\n}\n/**\r\n * Darken or lighten a colour, depending on its luminance.\r\n * Light colors are darkened, dark colors are lightened.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} coefficient=0.15 - multiplier in the range 0 - 1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction emphasize(color) {\n var coefficient = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.15;\n return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n/**\r\n * Set the absolute transparency of a color.\r\n * Any existing alpha values are overwritten.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} value - value to set the alpha channel to in the range 0 -1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction fade(color, value) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(color, \"Material-UI: missing color argument in fade(\".concat(color, \", \").concat(value, \").\")) : void 0;\n if (!color) return color;\n color = decomposeColor(color);\n value = clamp(value);\n\n if (color.type === 'rgb' || color.type === 'hsl') {\n color.type += 'a';\n }\n\n color.values[3] = value;\n return recomposeColor(color);\n}\n/**\r\n * Darkens a color.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} coefficient - multiplier in the range 0 - 1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction darken(color, coefficient) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(color, \"Material-UI: missing color argument in darken(\".concat(color, \", \").concat(coefficient, \").\")) : void 0;\n if (!color) return color;\n color = decomposeColor(color);\n coefficient = clamp(coefficient);\n\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] *= 1 - coefficient;\n } else if (color.type.indexOf('rgb') !== -1) {\n for (var i = 0; i < 3; i += 1) {\n color.values[i] *= 1 - coefficient;\n }\n }\n\n return recomposeColor(color);\n}\n/**\r\n * Lightens a color.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} coefficient - multiplier in the range 0 - 1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction lighten(color, coefficient) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(color, \"Material-UI: missing color argument in lighten(\".concat(color, \", \").concat(coefficient, \").\")) : void 0;\n if (!color) return color;\n color = decomposeColor(color);\n coefficient = clamp(coefficient);\n\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] += (100 - color.values[2]) * coefficient;\n } else if (color.type.indexOf('rgb') !== -1) {\n for (var i = 0; i < 3; i += 1) {\n color.values[i] += (255 - color.values[i]) * coefficient;\n }\n }\n\n return recomposeColor(color);\n}", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createBreakpoints;\nexports.keys = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\n// Sorted ASC by size. That's important.\n// It can't be configured as it's used statically for propTypes.\nvar keys = ['xs', 'sm', 'md', 'lg', 'xl']; // Keep in mind that @media is inclusive by the CSS specification.\n\nexports.keys = keys;\n\nfunction createBreakpoints(breakpoints) {\n var _breakpoints$values = breakpoints.values,\n values = _breakpoints$values === void 0 ? {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920\n } : _breakpoints$values,\n _breakpoints$unit = breakpoints.unit,\n unit = _breakpoints$unit === void 0 ? 'px' : _breakpoints$unit,\n _breakpoints$step = breakpoints.step,\n step = _breakpoints$step === void 0 ? 5 : _breakpoints$step,\n other = (0, _objectWithoutProperties2.default)(breakpoints, [\"values\", \"unit\", \"step\"]);\n\n function up(key) {\n var value = typeof values[key] === 'number' ? values[key] : key;\n return \"@media (min-width:\".concat(value).concat(unit, \")\");\n }\n\n function down(key) {\n var endIndex = keys.indexOf(key) + 1;\n var upperbound = values[keys[endIndex]];\n\n if (endIndex === keys.length) {\n // xl down applies to all sizes\n return up('xs');\n }\n\n var value = typeof upperbound === 'number' && endIndex > 0 ? upperbound : key;\n return \"@media (max-width:\".concat(value - step / 100).concat(unit, \")\");\n }\n\n function between(start, end) {\n var endIndex = keys.indexOf(end) + 1;\n\n if (endIndex === keys.length) {\n return up(start);\n }\n\n return \"@media (min-width:\".concat(values[start]).concat(unit, \") and \") + \"(max-width:\".concat(values[keys[endIndex]] - step / 100).concat(unit, \")\");\n }\n\n function only(key) {\n return between(key, key);\n }\n\n function width(key) {\n return values[key];\n }\n\n return (0, _extends2.default)({\n keys: keys,\n values: values,\n up: up,\n down: down,\n between: between,\n only: only,\n width: width\n }, other);\n}", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createGenerateClassName;\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar escapeRegex = /([[\\].#*$><+~=|^:(),\"'`)))))) + ((((("`" + (`\\s])/g;\n\nfunction safePrefix(classNamePrefix) {\n var prefix = String(classNamePrefix);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(prefix.length < 256, \"Material-UI: the class name prefix is too long: \".concat(prefix, \".\")) : void 0; // Sanitize the string as will be used to prefix the generated class name.\n\n return prefix.replace(escapeRegex, '-');\n} // Returns a function which generates unique class names based on counters.\n// When new generator function is created, rule counter is reset.\n// We need to reset the rule counter for SSR for each request.\n//\n// It's inspired by\n// https://github.com/cssinjs/jss/blob/4e6a05dd3f7b6572fdd3ab216861d9e446c20331/src/utils/createGenerateClassName.js\n\n\nfunction createGenerateClassName() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _options$dangerouslyU = options.dangerouslyUseGlobalCSS,\n dangerouslyUseGlobalCSS = _options$dangerouslyU === void 0 ? false : _options$dangerouslyU,\n _options$productionPr = options.productionPrefix,\n productionPrefix = _options$productionPr === void 0 ? 'jss' : _options$productionPr,\n _options$seed = options.seed,\n seed = _options$seed === void 0 ? '' : _options$seed;\n var ruleCounter = 0;\n return function (rule, styleSheet) {\n ruleCounter += 1;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(ruleCounter < 1e10, ['Material-UI: you might have a memory leak.', 'The ruleCounter is not supposed to grow that much.'].join('')) : void 0;\n\n if (dangerouslyUseGlobalCSS && styleSheet && styleSheet.options.name) {\n return \"\".concat(safePrefix(styleSheet.options.name), \"-\").concat(rule.key);\n }\n\n if (process.env.NODE_ENV === 'production') {\n return \"\".concat(productionPrefix).concat(seed).concat(ruleCounter);\n } // Help with debuggability.\n\n\n if (styleSheet && styleSheet.options.classNamePrefix) {\n return \"\".concat(safePrefix(styleSheet.options.classNamePrefix), \"-\").concat(rule.key, \"-\").concat(seed).concat(ruleCounter);\n }\n\n return \"\".concat(rule.key, \"-\").concat(seed).concat(ruleCounter);\n };\n}", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createMixins;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends3 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nfunction createMixins(breakpoints, spacing, mixins) {\n var _toolbar;\n\n return (0, _extends3.default)({\n gutters: function gutters() {\n var styles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return (0, _extends3.default)({\n paddingLeft: spacing.unit * 2,\n paddingRight: spacing.unit * 2\n }, styles, (0, _defineProperty2.default)({}, breakpoints.up('sm'), (0, _extends3.default)({\n paddingLeft: spacing.unit * 3,\n paddingRight: spacing.unit * 3\n }, styles[breakpoints.up('sm')])));\n },\n toolbar: (_toolbar = {\n minHeight: 56\n }, (0, _defineProperty2.default)(_toolbar, \"\".concat(breakpoints.up('xs'), \" and (orientation: landscape)\"), {\n minHeight: 48\n }), (0, _defineProperty2.default)(_toolbar, breakpoints.up('sm'), {\n minHeight: 64\n }), _toolbar)\n }, mixins);\n}", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\nvar _isPlainObject = _interopRequireDefault(require(\"is-plain-object\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _createBreakpoints = _interopRequireDefault(require(\"./createBreakpoints\"));\n\nvar _createMixins = _interopRequireDefault(require(\"./createMixins\"));\n\nvar _createPalette = _interopRequireDefault(require(\"./createPalette\"));\n\nvar _createTypography = _interopRequireDefault(require(\"./createTypography\"));\n\nvar _shadows = _interopRequireDefault(require(\"./shadows\"));\n\nvar _shape = _interopRequireDefault(require(\"./shape\"));\n\nvar _spacing = _interopRequireDefault(require(\"./spacing\"));\n\nvar _transitions = _interopRequireDefault(require(\"./transitions\"));\n\nvar _zIndex = _interopRequireDefault(require(\"./zIndex\"));\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\nfunction createMuiTheme() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _options$breakpoints = options.breakpoints,\n breakpointsInput = _options$breakpoints === void 0 ? {} : _options$breakpoints,\n _options$mixins = options.mixins,\n mixinsInput = _options$mixins === void 0 ? {} : _options$mixins,\n _options$palette = options.palette,\n paletteInput = _options$palette === void 0 ? {} : _options$palette,\n shadowsInput = options.shadows,\n _options$spacing = options.spacing,\n spacingInput = _options$spacing === void 0 ? {} : _options$spacing,\n _options$typography = options.typography,\n typographyInput = _options$typography === void 0 ? {} : _options$typography,\n other = (0, _objectWithoutProperties2.default)(options, [\"breakpoints\", \"mixins\", \"palette\", \"shadows\", \"spacing\", \"typography\"]);\n var palette = (0, _createPalette.default)(paletteInput);\n var breakpoints = (0, _createBreakpoints.default)(breakpointsInput);\n var spacing = (0, _extends2.default)({}, _spacing.default, spacingInput);\n var muiTheme = (0, _extends2.default)({\n breakpoints: breakpoints,\n direction: 'ltr',\n mixins: (0, _createMixins.default)(breakpoints, spacing, mixinsInput),\n overrides: {},\n // Inject custom styles\n palette: palette,\n props: {},\n // Inject custom properties\n shadows: shadowsInput || _shadows.default,\n typography: (0, _createTypography.default)(palette, typographyInput)\n }, (0, _deepmerge.default)({\n shape: _shape.default,\n spacing: spacing,\n transitions: _transitions.default,\n zIndex: _zIndex.default\n }, other, {\n isMergeableObject: _isPlainObject.default\n }));\n\n if (process.env.NODE_ENV !== 'production') {\n var statesWarning = ['disabled', 'focused', 'selected', 'checked'];\n\n var traverse = function traverse(node, parentKey) {\n var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var key; // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n for (key in node) {\n var child = node[key];\n\n if (depth === 1) {\n if (key.indexOf('Mui') === 0 && child) {\n traverse(child, key, depth + 1);\n }\n } else if (statesWarning.indexOf(key) !== -1 && Object.keys(child).length > 0) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(false, [\"Material-UI: the ` + "`")) + (`\".concat(parentKey, \"` + ("`" + ` component increases \") + \"the CSS specificity of the `))) + (("`" + (`\".concat(key, \"` + "`")) + (` internal state.\"), 'You can not override it like this: ', JSON.stringify(node, null, 2), '', 'Instead, you need to use the $ruleName syntax:', JSON.stringify((0, _defineProperty2.default)({}, \"&$\".concat(key), child), null, 2), '', 'https://material-ui.com/customization/overrides#internal-states'].join('\\n')) : void 0;\n }\n }\n };\n\n traverse(other.overrides);\n }\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(muiTheme.shadows.length === 25, 'Material-UI: the shadows array provided to createMuiTheme should support 25 elevations.') : void 0;\n return muiTheme;\n}\n\nvar _default = createMuiTheme;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createPalette;\nexports.dark = exports.light = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\nvar _indigo = _interopRequireDefault(require(\"../colors/indigo\"));\n\nvar _pink = _interopRequireDefault(require(\"../colors/pink\"));\n\nvar _grey = _interopRequireDefault(require(\"../colors/grey\"));\n\nvar _red = _interopRequireDefault(require(\"../colors/red\"));\n\nvar _common = _interopRequireDefault(require(\"../colors/common\"));\n\nvar _colorManipulator = require(\"./colorManipulator\");\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\nvar light = {\n // The colors used to style the text.\n text: {\n // The most important text.\n primary: 'rgba(0, 0, 0, 0.87)',\n // Secondary text.\n secondary: 'rgba(0, 0, 0, 0.54)',\n // Disabled text have even lower visual prominence.\n disabled: 'rgba(0, 0, 0, 0.38)',\n // Text hints.\n hint: 'rgba(0, 0, 0, 0.38)'\n },\n // The color used to divide different elements.\n divider: 'rgba(0, 0, 0, 0.12)',\n // The background colors used to style the surfaces.\n // Consistency between these values is important.\n background: {\n paper: _common.default.white,\n default: _grey.default[50]\n },\n // The colors used to style the action elements.\n action: {\n // The color of an active action like an icon button.\n active: 'rgba(0, 0, 0, 0.54)',\n // The color of an hovered action.\n hover: 'rgba(0, 0, 0, 0.08)',\n hoverOpacity: 0.08,\n // The color of a selected action.\n selected: 'rgba(0, 0, 0, 0.14)',\n // The color of a disabled action.\n disabled: 'rgba(0, 0, 0, 0.26)',\n // The background color of a disabled action.\n disabledBackground: 'rgba(0, 0, 0, 0.12)'\n }\n};\nexports.light = light;\nvar dark = {\n text: {\n primary: _common.default.white,\n secondary: 'rgba(255, 255, 255, 0.7)',\n disabled: 'rgba(255, 255, 255, 0.5)',\n hint: 'rgba(255, 255, 255, 0.5)',\n icon: 'rgba(255, 255, 255, 0.5)'\n },\n divider: 'rgba(255, 255, 255, 0.12)',\n background: {\n paper: _grey.default[800],\n default: '#303030'\n },\n action: {\n active: _common.default.white,\n hover: 'rgba(255, 255, 255, 0.1)',\n hoverOpacity: 0.1,\n selected: 'rgba(255, 255, 255, 0.2)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)'\n }\n};\nexports.dark = dark;\n\nfunction addLightOrDark(intent, direction, shade, tonalOffset) {\n if (!intent[direction]) {\n if (intent.hasOwnProperty(shade)) {\n intent[direction] = intent[shade];\n } else if (direction === 'light') {\n intent.light = (0, _colorManipulator.lighten)(intent.main, tonalOffset);\n } else if (direction === 'dark') {\n intent.dark = (0, _colorManipulator.darken)(intent.main, tonalOffset * 1.5);\n }\n }\n}\n\nfunction createPalette(palette) {\n var _palette$primary = palette.primary,\n primary = _palette$primary === void 0 ? {\n light: _indigo.default[300],\n main: _indigo.default[500],\n dark: _indigo.default[700]\n } : _palette$primary,\n _palette$secondary = palette.secondary,\n secondary = _palette$secondary === void 0 ? {\n light: _pink.default.A200,\n main: _pink.default.A400,\n dark: _pink.default.A700\n } : _palette$secondary,\n _palette$error = palette.error,\n error = _palette$error === void 0 ? {\n light: _red.default[300],\n main: _red.default[500],\n dark: _red.default[700]\n } : _palette$error,\n _palette$type = palette.type,\n type = _palette$type === void 0 ? 'light' : _palette$type,\n _palette$contrastThre = palette.contrastThreshold,\n contrastThreshold = _palette$contrastThre === void 0 ? 3 : _palette$contrastThre,\n _palette$tonalOffset = palette.tonalOffset,\n tonalOffset = _palette$tonalOffset === void 0 ? 0.2 : _palette$tonalOffset,\n other = (0, _objectWithoutProperties2.default)(palette, [\"primary\", \"secondary\", \"error\", \"type\", \"contrastThreshold\", \"tonalOffset\"]);\n\n function getContrastText(background) {\n // Use the same logic as\n // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59\n // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54\n var contrastText = (0, _colorManipulator.getContrastRatio)(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n\n if (process.env.NODE_ENV !== 'production') {\n var contrast = (0, _colorManipulator.getContrastRatio)(background, contrastText);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(contrast >= 3, [\"Material-UI: the contrast ratio of \".concat(contrast, \":1 for \").concat(contrastText, \" on \").concat(background), 'falls below the WACG recommended absolute minimum contrast ratio of 3:1.', 'https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast'].join('\\n')) : void 0;\n }\n\n return contrastText;\n }\n\n function augmentColor(color) {\n var mainShade = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;\n var lightShade = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 300;\n var darkShade = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 700;\n\n if (!color.main && color[mainShade]) {\n color.main = color[mainShade];\n }\n\n if (process.env.NODE_ENV !== 'production' && !color.main) {\n throw new Error(['Material-UI: the color provided to augmentColor(color) is invalid.', \"The color object needs to have a ` + ("`" + `main`)))) + ((("`" + (` property or a ` + "`")) + (`\".concat(mainShade, \"` + ("`" + ` property.\")].join('\\n'));\n }\n\n addLightOrDark(color, 'light', lightShade, tonalOffset);\n addLightOrDark(color, 'dark', darkShade, tonalOffset);\n\n if (!color.contrastText) {\n color.contrastText = getContrastText(color.main);\n }\n\n return color;\n }\n\n augmentColor(primary);\n augmentColor(secondary, 'A400', 'A200', 'A700');\n augmentColor(error);\n var types = {\n dark: dark,\n light: light\n };\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(types[type], \"Material-UI: the palette type `))) + (("`" + (`\".concat(type, \"` + "`")) + ((` is not supported.\")) : void 0;\n var paletteOutput = (0, _deepmerge.default)((0, _extends2.default)({\n // A collection of common colors.\n common: _common.default,\n // The palette type, can be light or dark.\n type: type,\n // The colors used to represent primary interface elements for a user.\n primary: primary,\n // The colors used to represent secondary interface elements for a user.\n secondary: secondary,\n // The colors used to represent interface elements that the user should be made aware of.\n error: error,\n // The grey colors.\n grey: _grey.default,\n // Used by ` + "`") + (`getContrastText()` + "`"))))) + ((((` to maximize the contrast between the background and\n // the text.\n contrastThreshold: contrastThreshold,\n // Take a background color and return the color of the text to maximize the contrast.\n getContrastText: getContrastText,\n // Generate a rich color object.\n augmentColor: augmentColor,\n // Used by the functions below to shift a color's luminance by approximately\n // two indexes within its tonal palette.\n // E.g., shift from Red 500 to Red 300 or Red 700.\n tonalOffset: tonalOffset\n }, types[type]), other, {\n clone: false // No need to clone deep\n\n });\n return paletteOutput;\n}", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createTypography;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\nfunction round(value) {\n return Math.round(value * 1e5) / 1e5;\n}\n\nvar caseAllCaps = {\n textTransform: 'uppercase'\n};\nvar defaultFontFamily = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\n/**\r\n * @see @link{https://material.io/design/typography/the-type-system.html}\r\n * @see @link{https://material.io/design/typography/understanding-typography.html}\r\n */\n\nfunction createTypography(palette, typography) {\n var _ref = typeof typography === 'function' ? typography(palette) : typography,\n _ref$fontFamily = _ref.fontFamily,\n fontFamily = _ref$fontFamily === void 0 ? defaultFontFamily : _ref$fontFamily,\n _ref$fontSize = _ref.fontSize,\n fontSize = _ref$fontSize === void 0 ? 14 : _ref$fontSize,\n _ref$fontWeightLight = _ref.fontWeightLight,\n fontWeightLight = _ref$fontWeightLight === void 0 ? 300 : _ref$fontWeightLight,\n _ref$fontWeightRegula = _ref.fontWeightRegular,\n fontWeightRegular = _ref$fontWeightRegula === void 0 ? 400 : _ref$fontWeightRegula,\n _ref$fontWeightMedium = _ref.fontWeightMedium,\n fontWeightMedium = _ref$fontWeightMedium === void 0 ? 500 : _ref$fontWeightMedium,\n _ref$htmlFontSize = _ref.htmlFontSize,\n htmlFontSize = _ref$htmlFontSize === void 0 ? 16 : _ref$htmlFontSize,\n _ref$useNextVariants = _ref.useNextVariants,\n useNextVariants = _ref$useNextVariants === void 0 ? Boolean(_utils.ponyfillGlobal.__MUI_USE_NEXT_TYPOGRAPHY_VARIANTS__) : _ref$useNextVariants,\n _ref$suppressWarning = _ref.suppressWarning,\n suppressWarning = _ref$suppressWarning === void 0 ? false : _ref$suppressWarning,\n allVariants = _ref.allVariants,\n other = (0, _objectWithoutProperties2.default)(_ref, [\"fontFamily\", \"fontSize\", \"fontWeightLight\", \"fontWeightRegular\", \"fontWeightMedium\", \"htmlFontSize\", \"useNextVariants\", \"suppressWarning\", \"allVariants\"]);\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(useNextVariants || suppressWarning, 'Material-UI: you are using the deprecated typography variants ' + 'that will be removed in the next major release.' + '\\nPlease read the migration guide under https://material-ui.com/style/typography#migration-to-typography-v2') : void 0;\n var coef = fontSize / 14;\n\n var pxToRem = function pxToRem(size) {\n return \"\".concat(size / htmlFontSize * coef, \"rem\");\n };\n\n var buildVariant = function buildVariant(fontWeight, size, lineHeight, letterSpacing, casing) {\n return (0, _extends2.default)({\n color: palette.text.primary,\n fontFamily: fontFamily,\n fontWeight: fontWeight,\n fontSize: pxToRem(size),\n // Unitless following http://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/\n lineHeight: lineHeight\n }, fontFamily === defaultFontFamily ? {\n letterSpacing: \"\".concat(round(letterSpacing / size), \"em\")\n } : {}, casing, allVariants);\n };\n\n var nextVariants = {\n h1: buildVariant(fontWeightLight, 96, 1, -1.5),\n h2: buildVariant(fontWeightLight, 60, 1, -0.5),\n h3: buildVariant(fontWeightRegular, 48, 1.04, 0),\n h4: buildVariant(fontWeightRegular, 34, 1.17, 0.25),\n h5: buildVariant(fontWeightRegular, 24, 1.33, 0),\n h6: buildVariant(fontWeightMedium, 20, 1.6, 0.15),\n subtitle1: buildVariant(fontWeightRegular, 16, 1.75, 0.15),\n subtitle2: buildVariant(fontWeightMedium, 14, 1.57, 0.1),\n body1Next: buildVariant(fontWeightRegular, 16, 1.5, 0.15),\n body2Next: buildVariant(fontWeightRegular, 14, 1.5, 0.15),\n buttonNext: buildVariant(fontWeightMedium, 14, 1.75, 0.4, caseAllCaps),\n captionNext: buildVariant(fontWeightRegular, 12, 1.66, 0.4),\n overline: buildVariant(fontWeightRegular, 12, 2.66, 1, caseAllCaps)\n }; // To remove in v4\n\n var oldVariants = {\n display4: (0, _extends2.default)({\n fontSize: pxToRem(112),\n fontWeight: fontWeightLight,\n fontFamily: fontFamily,\n letterSpacing: '-.04em',\n lineHeight: \"\".concat(round(128 / 112), \"em\"),\n marginLeft: '-.04em',\n color: palette.text.secondary\n }, allVariants),\n display3: (0, _extends2.default)({\n fontSize: pxToRem(56),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n letterSpacing: '-.02em',\n lineHeight: \"\".concat(round(73 / 56), \"em\"),\n marginLeft: '-.02em',\n color: palette.text.secondary\n }, allVariants),\n display2: (0, _extends2.default)({\n fontSize: pxToRem(45),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(51 / 45), \"em\"),\n marginLeft: '-.02em',\n color: palette.text.secondary\n }, allVariants),\n display1: (0, _extends2.default)({\n fontSize: pxToRem(34),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(41 / 34), \"em\"),\n color: palette.text.secondary\n }, allVariants),\n headline: (0, _extends2.default)({\n fontSize: pxToRem(24),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(32.5 / 24), \"em\"),\n color: palette.text.primary\n }, allVariants),\n title: (0, _extends2.default)({\n fontSize: pxToRem(21),\n fontWeight: fontWeightMedium,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(24.5 / 21), \"em\"),\n color: palette.text.primary\n }, allVariants),\n subheading: (0, _extends2.default)({\n fontSize: pxToRem(16),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(24 / 16), \"em\"),\n color: palette.text.primary\n }, allVariants),\n body2: (0, _extends2.default)({\n fontSize: pxToRem(14),\n fontWeight: fontWeightMedium,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(24 / 14), \"em\"),\n color: palette.text.primary\n }, allVariants),\n body1: (0, _extends2.default)({\n fontSize: pxToRem(14),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(20.5 / 14), \"em\"),\n color: palette.text.primary\n }, allVariants),\n caption: (0, _extends2.default)({\n fontSize: pxToRem(12),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(16.5 / 12), \"em\"),\n color: palette.text.secondary\n }, allVariants),\n button: (0, _extends2.default)({\n fontSize: pxToRem(14),\n textTransform: 'uppercase',\n fontWeight: fontWeightMedium,\n fontFamily: fontFamily,\n color: palette.text.primary\n }, allVariants)\n };\n return (0, _deepmerge.default)((0, _extends2.default)({\n pxToRem: pxToRem,\n round: round,\n fontFamily: fontFamily,\n fontSize: fontSize,\n fontWeightLight: fontWeightLight,\n fontWeightRegular: fontWeightRegular,\n fontWeightMedium: fontWeightMedium\n }, oldVariants, nextVariants, useNextVariants ? {\n body1: nextVariants.body1Next,\n body2: nextVariants.body2Next,\n button: nextVariants.buttonNext,\n caption: nextVariants.captionNext\n } : {}, {\n useNextVariants: useNextVariants\n }), other, {\n clone: false // No need to clone deep\n\n });\n}", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/typeof\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\n// Support for the jss-expand plugin.\nfunction arrayMerge(destination, source) {\n return source;\n}\n\nfunction getStylesCreator(stylesOrCreator) {\n var themingEnabled = typeof stylesOrCreator === 'function';\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)((0, _typeof2.default)(stylesOrCreator) === 'object' || themingEnabled, ['Material-UI: the first argument provided to withStyles() is invalid.', 'You need to provide a function generating the styles or a styles object.'].join('\\n')) : void 0;\n\n function create(theme, name) {\n var styles = themingEnabled ? stylesOrCreator(theme) : stylesOrCreator;\n\n if (!name || !theme.overrides || !theme.overrides[name]) {\n return styles;\n }\n\n var overrides = theme.overrides[name];\n var stylesWithOverrides = (0, _extends2.default)({}, styles);\n Object.keys(overrides).forEach(function (key) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(stylesWithOverrides[key], ['Material-UI: you are trying to override a style that does not exist.', \"Fix the ` + ("`" + `\".concat(key, \"`)) + ("`" + (` key of ` + "`"))) + ((`theme.overrides.\").concat(name, \"` + ("`" + `.\")].join('\\n')) : void 0;\n stylesWithOverrides[key] = (0, _deepmerge.default)(stylesWithOverrides[key], overrides[key], {\n arrayMerge: arrayMerge\n });\n });\n return stylesWithOverrides;\n }\n\n return {\n create: create,\n options: {},\n themingEnabled: themingEnabled\n };\n}\n\nvar _default = getStylesCreator;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n/* eslint-disable no-restricted-syntax */\nfunction getThemeProps(params) {\n var theme = params.theme,\n name = params.name,\n props = params.props;\n\n if (!theme.props || !name || !theme.props[name]) {\n return props;\n } // Resolve default props, code borrow from React source.\n // https://github.com/facebook/react/blob/15a8f031838a553e41c0b66eb1bcf1da8448104d/packages/react/src/ReactElement.js#L221\n\n\n var defaultProps = theme.props[name];\n var propName;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n\n return props;\n}\n\nvar _default = getThemeProps;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _jssGlobal = _interopRequireDefault(require(\"jss-global\"));\n\nvar _jssNested = _interopRequireDefault(require(\"jss-nested\"));\n\nvar _jssCamelCase = _interopRequireDefault(require(\"jss-camel-case\"));\n\nvar _jssDefaultUnit = _interopRequireDefault(require(\"jss-default-unit\"));\n\nvar _jssVendorPrefixer = _interopRequireDefault(require(\"jss-vendor-prefixer\"));\n\nvar _jssPropsSort = _interopRequireDefault(require(\"jss-props-sort\"));\n\n// Subset of jss-preset-default with only the plugins the Material-UI components are using.\nfunction jssPreset() {\n return {\n plugins: [(0, _jssGlobal.default)(), (0, _jssNested.default)(), (0, _jssCamelCase.default)(), (0, _jssDefaultUnit.default)(), // Disable the vendor prefixer server-side, it does nothing.\n // This way, we can get a performance boost.\n // In the documentation, we are using `)) + ("`" + (`autoprefixer` + "`")))) + (((` to solve this problem.\n typeof window === 'undefined' ? null : (0, _jssVendorPrefixer.default)(), (0, _jssPropsSort.default)()]\n };\n}\n\nvar _default = jssPreset;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nfunction mergeClasses() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var baseClasses = options.baseClasses,\n newClasses = options.newClasses,\n Component = options.Component;\n\n if (!newClasses) {\n return baseClasses;\n }\n\n var nextClasses = (0, _extends2.default)({}, baseClasses);\n\n if (process.env.NODE_ENV !== 'production' && typeof newClasses === 'string') {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(false, [\"Material-UI: the value ` + ("`" + `\".concat(newClasses, \"`)) + ("`" + (` \") + \"provided to the classes property of \".concat((0, _utils.getDisplayName)(Component), \" is incorrect.\"), 'You might want to use the className property instead.'].join('\\n')) : void 0;\n return baseClasses;\n }\n\n Object.keys(newClasses).forEach(function (key) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(baseClasses[key] || !newClasses[key], [\"Material-UI: the key ` + "`"))) + ((`\".concat(key, \"` + ("`" + ` \") + \"provided to the classes property is not implemented in \".concat((0, _utils.getDisplayName)(Component), \".\"), \"You can only override one of the following: \".concat(Object.keys(baseClasses).join(','), \".\")].join('\\n')) : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(!newClasses[key] || typeof newClasses[key] === 'string', [\"Material-UI: the key `)) + (("`" + `\".concat(key, \"`) + ("`" + ` \") + \"provided to the classes property is not valid for \".concat((0, _utils.getDisplayName)(Component), \".\"), \"You need to provide a non empty string instead of: \".concat(newClasses[key], \".\")].join('\\n')) : void 0;\n\n if (newClasses[key]) {\n nextClasses[key] = \"\".concat(baseClasses[key], \" \").concat(newClasses[key]);\n }\n });\n return nextClasses;\n}\n\nvar _default = mergeClasses;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n// Used https://github.com/thinkloop/multi-key-cache as inspiration\nvar multiKeyStore = {\n set: function set(cache, key1, key2, value) {\n var subCache = cache.get(key1);\n\n if (!subCache) {\n subCache = new Map();\n cache.set(key1, subCache);\n }\n\n subCache.set(key2, value);\n },\n get: function get(cache, key1, key2) {\n var subCache = cache.get(key1);\n return subCache ? subCache.get(key2) : undefined;\n },\n delete: function _delete(cache, key1, key2) {\n var subCache = cache.get(key1);\n subCache.delete(key2);\n }\n};\nvar _default = multiKeyStore;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n// Share the same values than in\n// https://github.com/cssinjs/jss/blob/master/packages/react-jss/src/ns.js\nvar ns = {\n jss: '64a55d578f856d258dc345b094a2a2b3',\n sheetsRegistry: 'd4bd0baacbc52bbd48bbb9eb24344ecd',\n sheetOptions: '6fc570d6bd61383819d0f9e7407c452d'\n};\nvar _default = ns;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar shadowKeyUmbraOpacity = 0.2;\nvar shadowKeyPenumbraOpacity = 0.14;\nvar shadowAmbientShadowOpacity = 0.12;\n\nfunction createShadow() {\n return [\"\".concat(arguments.length <= 0 ? undefined : arguments[0], \"px \").concat(arguments.length <= 1 ? undefined : arguments[1], \"px \").concat(arguments.length <= 2 ? undefined : arguments[2], \"px \").concat(arguments.length <= 3 ? undefined : arguments[3], \"px rgba(0,0,0,\").concat(shadowKeyUmbraOpacity, \")\"), \"\".concat(arguments.length <= 4 ? undefined : arguments[4], \"px \").concat(arguments.length <= 5 ? undefined : arguments[5], \"px \").concat(arguments.length <= 6 ? undefined : arguments[6], \"px \").concat(arguments.length <= 7 ? undefined : arguments[7], \"px rgba(0,0,0,\").concat(shadowKeyPenumbraOpacity, \")\"), \"\".concat(arguments.length <= 8 ? undefined : arguments[8], \"px \").concat(arguments.length <= 9 ? undefined : arguments[9], \"px \").concat(arguments.length <= 10 ? undefined : arguments[10], \"px \").concat(arguments.length <= 11 ? undefined : arguments[11], \"px rgba(0,0,0,\").concat(shadowAmbientShadowOpacity, \")\")].join(',');\n}\n\nvar shadows = ['none', createShadow(0, 1, 3, 0, 0, 1, 1, 0, 0, 2, 1, -1), createShadow(0, 1, 5, 0, 0, 2, 2, 0, 0, 3, 1, -2), createShadow(0, 1, 8, 0, 0, 3, 4, 0, 0, 3, 3, -2), createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8)];\nvar _default = shadows;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar shape = {\n borderRadius: 4\n};\nvar _default = shape;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar spacing = {\n // All components align to an 8dp square baseline grid for mobile, tablet, and desktop.\n // https://material.io/design/layout/understanding-layout.html#pixel-density\n unit: 8\n};\nvar _default = spacing;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.CHANNEL = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\n// Same value used by react-jss\nvar CHANNEL = '__THEMING__';\nexports.CHANNEL = CHANNEL;\nvar themeListener = {\n contextTypes: (0, _defineProperty2.default)({}, CHANNEL, function () {}),\n initial: function initial(context) {\n if (!context[CHANNEL]) {\n return null;\n }\n\n return context[CHANNEL].getState();\n },\n subscribe: function subscribe(context, cb) {\n if (!context[CHANNEL]) {\n return null;\n }\n\n return context[CHANNEL].subscribe(cb);\n },\n unsubscribe: function unsubscribe(context, subscriptionId) {\n if (context[CHANNEL]) {\n context[CHANNEL].unsubscribe(subscriptionId);\n }\n }\n};\nvar _default = themeListener;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.isNumber = exports.isString = exports.formatMs = exports.duration = exports.easing = void 0;\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\n/* eslint-disable no-restricted-globals */\n// Follow https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves\n// to learn the context in which each easing should be used.\nvar easing = {\n // This is the most common easing curve.\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n // Objects enter the screen at full velocity from off-screen and\n // slowly decelerate to a resting point.\n easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n // The sharp curve is used by objects that may return to the screen at any time.\n sharp: 'cubic-bezier(0.4, 0, 0.6, 1)'\n}; // Follow https://material.io/guidelines/motion/duration-easing.html#duration-easing-common-durations\n// to learn when use what timing\n\nexports.easing = easing;\nvar duration = {\n shortest: 150,\n shorter: 200,\n short: 250,\n // most basic recommended timing\n standard: 300,\n // this is to be used in complex animations\n complex: 375,\n // recommended when something is entering screen\n enteringScreen: 225,\n // recommended when something is leaving screen\n leavingScreen: 195\n};\nexports.duration = duration;\n\nvar formatMs = function formatMs(milliseconds) {\n return \"\".concat(Math.round(milliseconds), \"ms\");\n};\n\nexports.formatMs = formatMs;\n\nvar isString = function isString(value) {\n return typeof value === 'string';\n};\n\nexports.isString = isString;\n\nvar isNumber = function isNumber(value) {\n return !isNaN(parseFloat(value));\n};\n/**\r\n * @param {string|Array} props\r\n * @param {object} param\r\n * @param {string} param.prop\r\n * @param {number} param.duration\r\n * @param {string} param.easing\r\n * @param {number} param.delay\r\n */\n\n\nexports.isNumber = isNumber;\nvar _default = {\n easing: easing,\n duration: duration,\n create: function create() {\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['all'];\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _options$duration = options.duration,\n durationOption = _options$duration === void 0 ? duration.standard : _options$duration,\n _options$easing = options.easing,\n easingOption = _options$easing === void 0 ? easing.easeInOut : _options$easing,\n _options$delay = options.delay,\n delay = _options$delay === void 0 ? 0 : _options$delay,\n other = (0, _objectWithoutProperties2.default)(options, [\"duration\", \"easing\", \"delay\"]);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(isString(props) || Array.isArray(props), 'Material-UI: argument \"props\" must be a string or Array.') : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(isNumber(durationOption) || isString(durationOption), \"Material-UI: argument \\\"duration\\\" must be a number or a string but found \".concat(durationOption, \".\")) : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(isString(easingOption), 'Material-UI: argument \"easing\" must be a string.') : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(isNumber(delay) || isString(delay), 'Material-UI: argument \"delay\" must be a number or a string.') : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(Object.keys(other).length === 0, \"Material-UI: unrecognized argument(s) [\".concat(Object.keys(other).join(','), \"]\")) : void 0;\n return (Array.isArray(props) ? props : [props]).map(function (animatedProp) {\n return \"\".concat(animatedProp, \" \").concat(typeof durationOption === 'string' ? durationOption : formatMs(durationOption), \" \").concat(easingOption, \" \").concat(typeof delay === 'string' ? delay : formatMs(delay));\n }).join(',');\n },\n getAutoHeightDuration: function getAutoHeightDuration(height) {\n if (!height) {\n return 0;\n }\n\n var constant = height / 36; // https://www.wolframalpha.com/input/?i=(4+%2B+15+*+(x+%2F+36+)+**+0.25+%2B+(x+%2F+36)+%2F+5)+*+10\n\n return Math.round((4 + 15 * Math.pow(constant, 0.25) + constant / 5) * 10);\n }\n};\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.sheetsManager = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends3 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _hoistNonReactStatics = _interopRequireDefault(require(\"hoist-non-react-statics\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _jss = require(\"jss\");\n\nvar _reactJssContext = _interopRequireDefault(require(\"./reactJssContext\"));\n\nvar _jssPreset = _interopRequireDefault(require(\"./jssPreset\"));\n\nvar _mergeClasses = _interopRequireDefault(require(\"./mergeClasses\"));\n\nvar _multiKeyStore = _interopRequireDefault(require(\"./multiKeyStore\"));\n\nvar _createMuiTheme = _interopRequireDefault(require(\"./createMuiTheme\"));\n\nvar _themeListener = _interopRequireDefault(require(\"./themeListener\"));\n\nvar _createGenerateClassName = _interopRequireDefault(require(\"./createGenerateClassName\"));\n\nvar _getStylesCreator = _interopRequireDefault(require(\"./getStylesCreator\"));\n\nvar _getThemeProps = _interopRequireDefault(require(\"./getThemeProps\"));\n\n/* eslint-disable no-underscore-dangle */\n// Default JSS instance.\nvar jss = (0, _jss.create)((0, _jssPreset.default)()); // Use a singleton or the provided one by the context.\n//\n// The counter-based approach doesn't tolerate any mistake.\n// It's much safer to use the same counter everywhere.\n\nvar generateClassName = (0, _createGenerateClassName.default)(); // Global index counter to preserve source order.\n// We create the style sheet during at the creation of the component,\n// children are handled after the parents, so the order of style elements would be parent->child.\n// It is a problem though when a parent passes a className\n// which needs to override any child's styles.\n// StyleSheet of the child has a higher specificity, because of the source order.\n// So our solution is to render sheets them in the reverse order child->sheet, so\n// that parent has a higher specificity.\n\nvar indexCounter = -10e10; // Exported for test purposes\n\nvar sheetsManager = new Map(); // We use the same empty object to ref count the styles that don't need a theme object.\n\nexports.sheetsManager = sheetsManager;\nvar noopTheme = {}; // In order to have self-supporting components, we rely on default theme when not provided.\n\nvar defaultTheme = (0, _createMuiTheme.default)({\n typography: {\n suppressWarning: true\n }\n}); // Link a style sheet with a component.\n// It does not modify the component passed to it;\n// instead, it returns a new component, with a `))))))))))) + (((((((((("`" + (`classes` + "`")) + (` property.\n\nvar withStylesOld = function withStylesOld(stylesOrCreator) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return function (Component) {\n var _extends2;\n\n var _options$withTheme = options.withTheme,\n withTheme = _options$withTheme === void 0 ? false : _options$withTheme,\n _options$flip = options.flip,\n flip = _options$flip === void 0 ? null : _options$flip,\n name = options.name,\n styleSheetOptions = (0, _objectWithoutProperties2.default)(options, [\"withTheme\", \"flip\", \"name\"]);\n var stylesCreator = (0, _getStylesCreator.default)(stylesOrCreator);\n var listenToTheme = stylesCreator.themingEnabled || typeof name === 'string' || withTheme;\n indexCounter += 1;\n stylesCreator.options.index = indexCounter;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(indexCounter < 0, ['Material-UI: you might have a memory leak.', 'The indexCounter is not supposed to grow that much.'].join('\\n')) : void 0;\n\n var WithStyles =\n /*#__PURE__*/\n function (_React$Component) {\n (0, _inherits2.default)(WithStyles, _React$Component);\n\n function WithStyles(props, context) {\n var _this;\n\n (0, _classCallCheck2.default)(this, WithStyles);\n _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(WithStyles).call(this, props, context));\n _this.jss = context[_reactJssContext.default.jss] || jss;\n _this.sheetsManager = sheetsManager;\n _this.unsubscribeId = null;\n var muiThemeProviderOptions = context.muiThemeProviderOptions;\n\n if (muiThemeProviderOptions) {\n if (muiThemeProviderOptions.sheetsManager) {\n _this.sheetsManager = muiThemeProviderOptions.sheetsManager;\n }\n\n _this.sheetsCache = muiThemeProviderOptions.sheetsCache;\n _this.disableStylesGeneration = muiThemeProviderOptions.disableStylesGeneration;\n } // Attach the stylesCreator to the instance of the component as in the context\n // of react-hot-loader the hooks can be executed in a different closure context:\n // https://github.com/gaearon/react-hot-loader/blob/master/src/patch.dev.js#L107\n\n\n _this.stylesCreatorSaved = stylesCreator;\n _this.sheetOptions = (0, _extends3.default)({\n generateClassName: generateClassName\n }, context[_reactJssContext.default.sheetOptions]); // We use || as the function call is lazy evaluated.\n\n _this.theme = listenToTheme ? _themeListener.default.initial(context) || defaultTheme : noopTheme;\n\n _this.attach(_this.theme);\n\n _this.cacheClasses = {\n // Cache for the finalized classes value.\n value: null,\n // Cache for the last used classes prop pointer.\n lastProp: null,\n // Cache for the last used rendered classes pointer.\n lastJSS: {}\n };\n return _this;\n }\n\n (0, _createClass2.default)(WithStyles, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n if (!listenToTheme) {\n return;\n }\n\n this.unsubscribeId = _themeListener.default.subscribe(this.context, function (theme) {\n var oldTheme = _this2.theme;\n _this2.theme = theme;\n\n _this2.attach(_this2.theme); // Rerender the component so the underlying component gets the theme update.\n // By theme update we mean receiving and applying the new class names.\n\n\n _this2.setState({}, function () {\n _this2.detach(oldTheme);\n });\n });\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n // react-hot-loader specific logic\n if (this.stylesCreatorSaved === stylesCreator || process.env.NODE_ENV === 'production') {\n return;\n }\n\n this.detach(this.theme);\n this.stylesCreatorSaved = stylesCreator;\n this.attach(this.theme);\n this.forceUpdate();\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.detach(this.theme);\n\n if (this.unsubscribeId !== null) {\n _themeListener.default.unsubscribe(this.context, this.unsubscribeId);\n }\n }\n }, {\n key: \"getClasses\",\n value: function getClasses() {\n if (this.disableStylesGeneration) {\n return this.props.classes || {};\n } // Tracks if either the rendered classes or classes prop has changed,\n // requiring the generation of a new finalized classes object.\n\n\n var generate = false;\n\n var sheetManager = _multiKeyStore.default.get(this.sheetsManager, this.stylesCreatorSaved, this.theme);\n\n if (sheetManager.sheet.classes !== this.cacheClasses.lastJSS) {\n this.cacheClasses.lastJSS = sheetManager.sheet.classes;\n generate = true;\n }\n\n if (this.props.classes !== this.cacheClasses.lastProp) {\n this.cacheClasses.lastProp = this.props.classes;\n generate = true;\n }\n\n if (generate) {\n this.cacheClasses.value = (0, _mergeClasses.default)({\n baseClasses: this.cacheClasses.lastJSS,\n newClasses: this.props.classes,\n Component: Component\n });\n }\n\n return this.cacheClasses.value;\n }\n }, {\n key: \"attach\",\n value: function attach(theme) {\n if (this.disableStylesGeneration) {\n return;\n }\n\n var stylesCreatorSaved = this.stylesCreatorSaved;\n\n var sheetManager = _multiKeyStore.default.get(this.sheetsManager, stylesCreatorSaved, theme);\n\n if (!sheetManager) {\n sheetManager = {\n refs: 0,\n sheet: null\n };\n\n _multiKeyStore.default.set(this.sheetsManager, stylesCreatorSaved, theme, sheetManager);\n }\n\n if (sheetManager.refs === 0) {\n var sheet;\n\n if (this.sheetsCache) {\n sheet = _multiKeyStore.default.get(this.sheetsCache, stylesCreatorSaved, theme);\n }\n\n if (!sheet) {\n sheet = this.createSheet(theme);\n sheet.attach();\n\n if (this.sheetsCache) {\n _multiKeyStore.default.set(this.sheetsCache, stylesCreatorSaved, theme, sheet);\n }\n }\n\n sheetManager.sheet = sheet;\n var sheetsRegistry = this.context[_reactJssContext.default.sheetsRegistry];\n\n if (sheetsRegistry) {\n sheetsRegistry.add(sheet);\n }\n }\n\n sheetManager.refs += 1;\n }\n }, {\n key: \"createSheet\",\n value: function createSheet(theme) {\n var styles = this.stylesCreatorSaved.create(theme, name);\n var meta = name;\n\n if (process.env.NODE_ENV !== 'production' && !meta) {\n // Provide a better DX outside production.\n meta = (0, _utils.getDisplayName)(Component);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(typeof meta === 'string', ['Material-UI: the component displayName is invalid. It needs to be a string.', \"Please fix the following component: \".concat(Component, \".\")].join('\\n')) : void 0;\n }\n\n var sheet = this.jss.createStyleSheet(styles, (0, _extends3.default)({\n meta: meta,\n classNamePrefix: meta,\n flip: typeof flip === 'boolean' ? flip : theme.direction === 'rtl',\n link: false\n }, this.sheetOptions, this.stylesCreatorSaved.options, {\n name: name || Component.displayName\n }, styleSheetOptions));\n return sheet;\n }\n }, {\n key: \"detach\",\n value: function detach(theme) {\n if (this.disableStylesGeneration) {\n return;\n }\n\n var sheetManager = _multiKeyStore.default.get(this.sheetsManager, this.stylesCreatorSaved, theme);\n\n sheetManager.refs -= 1;\n\n if (sheetManager.refs === 0) {\n _multiKeyStore.default.delete(this.sheetsManager, this.stylesCreatorSaved, theme);\n\n this.jss.removeStyleSheet(sheetManager.sheet);\n var sheetsRegistry = this.context[_reactJssContext.default.sheetsRegistry];\n\n if (sheetsRegistry) {\n sheetsRegistry.remove(sheetManager.sheet);\n }\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n classes = _this$props.classes,\n innerRef = _this$props.innerRef,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"classes\", \"innerRef\"]);\n var more = (0, _getThemeProps.default)({\n theme: this.theme,\n name: name,\n props: other\n }); // Provide the theme to the wrapped component.\n // So we don't have to use the ` + ("`" + `withTheme()`))) + (("`" + (` Higher-order Component.\n\n if (withTheme && !more.theme) {\n more.theme = this.theme;\n }\n\n return _react.default.createElement(Component, (0, _extends3.default)({}, more, {\n classes: this.getClasses(),\n ref: innerRef\n }));\n }\n }]);\n return WithStyles;\n }(_react.default.Component);\n\n process.env.NODE_ENV !== \"production\" ? WithStyles.propTypes = {\n /**\r\n * Override or extend the styles applied to the component.\r\n */\n classes: _propTypes.default.object,\n\n /**\r\n * Use that property to pass a ref callback to the decorated component.\r\n */\n innerRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object])\n } : void 0;\n WithStyles.contextTypes = (0, _extends3.default)((_extends2 = {\n muiThemeProviderOptions: _propTypes.default.object\n }, (0, _defineProperty2.default)(_extends2, _reactJssContext.default.jss, _propTypes.default.object), (0, _defineProperty2.default)(_extends2, _reactJssContext.default.sheetOptions, _propTypes.default.object), (0, _defineProperty2.default)(_extends2, _reactJssContext.default.sheetsRegistry, _propTypes.default.object), _extends2), listenToTheme ? _themeListener.default.contextTypes : {});\n\n if (process.env.NODE_ENV !== 'production') {\n WithStyles.displayName = \"WithStyles(\".concat((0, _utils.getDisplayName)(Component), \")\");\n }\n\n (0, _hoistNonReactStatics.default)(WithStyles, Component);\n\n if (process.env.NODE_ENV !== 'production') {\n // Exposed for test purposes.\n WithStyles.Naked = Component;\n WithStyles.options = options;\n }\n\n return WithStyles;\n };\n};\n/* istanbul ignore if */\n\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__) {\n _utils.ponyfillGlobal.__MUI_STYLES__ = {};\n}\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__.withStyles) {\n _utils.ponyfillGlobal.__MUI_STYLES__.withStyles = withStylesOld;\n}\n\nvar _default = function _default(styles, options) {\n return _utils.ponyfillGlobal.__MUI_STYLES__.withStyles(styles, (0, _extends3.default)({\n defaultTheme: defaultTheme\n }, options));\n};\n\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n// We need to centralize the zIndex definitions as they work\n// like global values in the browser.\nvar zIndex = {\n mobileStepper: 1000,\n appBar: 1100,\n drawer: 1200,\n modal: 1300,\n snackbar: 1400,\n tooltip: 1500\n};\nvar _default = zIndex;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction deprecatedPropType(validator, reason) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n return function (props, propName, componentName, location, propFullName) {\n var componentNameSafe = componentName || '<>';\n var propFullNameSafe = propFullName || propName;\n\n if (typeof props[propName] !== 'undefined') {\n return new Error(\"The \".concat(location, \" ` + "`")) + (`\").concat(propFullNameSafe, \"` + ("`" + ` of \") + \"`)))) + ((("`" + (`\".concat(componentNameSafe, \"` + "`")) + (` is deprecated. \").concat(reason));\n }\n\n return null;\n };\n}\n\nvar _default = deprecatedPropType;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.capitalize = capitalize;\nexports.contains = contains;\nexports.findIndex = findIndex;\nexports.find = find;\nexports.createChainedFunction = createChainedFunction;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/typeof\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\n// It should to be noted that this function isn't equivalent to ` + ("`" + `text-transform: capitalize`))) + (("`" + (`.\n//\n// A strict capitalization should uppercase the first letter of each word a the sentence.\n// We only handle the first word.\nfunction capitalize(string) {\n if (process.env.NODE_ENV !== 'production' && typeof string !== 'string') {\n throw new Error('Material-UI: capitalize(string) expects a string argument.');\n }\n\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nfunction contains(obj, pred) {\n return Object.keys(pred).every(function (key) {\n return obj.hasOwnProperty(key) && obj[key] === pred[key];\n });\n}\n\nfunction findIndex(arr, pred) {\n var predType = (0, _typeof2.default)(pred);\n\n for (var i = 0; i < arr.length; i += 1) {\n if (predType === 'function' && !!pred(arr[i], i, arr) === true) {\n return i;\n }\n\n if (predType === 'object' && contains(arr[i], pred)) {\n return i;\n }\n\n if (['string', 'number', 'boolean'].indexOf(predType) !== -1) {\n return arr.indexOf(pred);\n }\n }\n\n return -1;\n}\n\nfunction find(arr, pred) {\n var index = findIndex(arr, pred);\n return index > -1 ? arr[index] : undefined;\n}\n/**\r\n * Safe chained function\r\n *\r\n * Will only create a new function if needed,\r\n * otherwise will pass back existing functions or null.\r\n *\r\n * @param {function} functions to chain\r\n * @returns {function|null}\r\n */\n\n\nfunction createChainedFunction() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n return funcs.reduce(function (acc, func) {\n if (func == null) {\n return acc;\n }\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(typeof func === 'function', 'Material-UI: invalid Argument Type, must only provide functions, undefined, or null.') : void 0;\n return function chainedFunction() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n acc.apply(this, args);\n func.apply(this, args);\n };\n }, function () {});\n}", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction ownerDocument(node) {\n return node && node.ownerDocument || document;\n}\n\nvar _default = ownerDocument;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _ownerDocument = _interopRequireDefault(require(\"./ownerDocument\"));\n\nfunction ownerWindow(node) {\n var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window;\n var doc = (0, _ownerDocument.default)(node);\n return doc.defaultView || doc.parentView || fallback;\n}\n\nvar _default = ownerWindow;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.cloneElementWithClassName = cloneElementWithClassName;\nexports.cloneChildrenWithClassName = cloneChildrenWithClassName;\nexports.isMuiElement = isMuiElement;\nexports.setRef = setRef;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nfunction cloneElementWithClassName(child, className) {\n return _react.default.cloneElement(child, {\n className: (0, _classnames.default)(child.props.className, className)\n });\n}\n\nfunction cloneChildrenWithClassName(children, className) {\n return _react.default.Children.map(children, function (child) {\n return _react.default.isValidElement(child) && cloneElementWithClassName(child, className);\n });\n}\n\nfunction isMuiElement(element, muiNames) {\n return _react.default.isValidElement(element) && muiNames.indexOf(element.type.muiName) !== -1;\n}\n\nfunction setRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction requirePropFactory(componentNameInError) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n var requireProp = function requireProp(requiredProp) {\n return function (props, propName, componentName, location, propFullName) {\n var propFullNameSafe = propFullName || propName;\n\n if (typeof props[propName] !== 'undefined' && !props[requiredProp]) {\n return new Error(\"The property ` + "`")) + (`\".concat(propFullNameSafe, \"` + ("`" + ` of \") + \"`))))) + (((("`" + (`\".concat(componentNameInError, \"` + "`")) + (` must be used on ` + ("`" + `\").concat(requiredProp, \"`))) + (("`" + (`.\"));\n }\n\n return null;\n };\n };\n\n return requireProp;\n}\n\nvar _default = requirePropFactory;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction chainPropTypes(propType1, propType2) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n return function validate() {\n return propType1.apply(void 0, arguments) || propType2.apply(void 0, arguments);\n };\n}\n\nvar _default = chainPropTypes;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/typeof\"));\n\nvar _reactIs = require(\"react-is\");\n\n/**\n * A factory that returns a propTypes validator that only accepts values that\n * are also accepted by React.createElement\n * e.g. \"div\", functional, class components, forwardRef etc.\n *\n * @param {boolean} isRequired If ` + "`")) + (`true` + ("`" + ` returns a validator\n * that will throw if nullish values are passed\n */\nfunction createComponentProp(isRequired) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n return function componentPropType(props, key, componentName, location, propFullName) {\n var prop = props[key];\n var propName = propFullName || key;\n var message;\n\n if (prop == null) {\n if (isRequired) {\n message = \"The \".concat(location, \" `)))) + ((("`" + (`\").concat(propName, \"` + "`")) + (` is marked as required in ` + ("`" + `\").concat(componentName, \"`))) + (("`" + (`, \") + \"but its value is ` + "`")) + ((`\".concat((0, _typeof2.default)(prop), \"` + "`") + (`.\");\n }\n } else if (!(0, _reactIs.isValidElementType)(prop)) {\n var preciseType = (0, _typeof2.default)(prop);\n message = \"Invalid \".concat(location, \" ` + "`")))))) + (((((`\").concat(propName, \"` + ("`" + ` of type `)) + ("`" + (`\").concat(preciseType, \"` + "`"))) + ((` \") + \"supplied to ` + ("`" + `\".concat(componentName, \"`)) + ("`" + (`, expected a component.\");\n }\n\n if (message != null) {\n // change error message slightly on every check to prevent caching when testing\n // which would not trigger console errors on subsequent fails\n return new Error(\"\".concat(message).concat(process.env.NODE_ENV === 'test' ? Date.now() : ''));\n }\n\n return null;\n };\n}\n\nvar componentPropType = createComponentProp(false);\ncomponentPropType.isRequired = createComponentProp(true);\nvar _default = componentPropType;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.specialProperty = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends3 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\n// This module is based on https://github.com/airbnb/prop-types-exact repository.\n// However, in order to reduce the number of dependencies and to remove some extra safe checks\n// the module was forked.\n// Only exported for test purposes.\nvar specialProperty = \"exact-prop: \\u200B\";\nexports.specialProperty = specialProperty;\n\nfunction exactProp(propTypes) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return propTypes;\n }\n\n return (0, _extends3.default)({}, propTypes, (0, _defineProperty2.default)({}, specialProperty, function (props) {\n var unsupportedProps = Object.keys(props).filter(function (prop) {\n return !propTypes.hasOwnProperty(prop);\n });\n\n if (unsupportedProps.length > 0) {\n return new Error(\"The following properties are not supported: \".concat(unsupportedProps.map(function (prop) {\n return \"` + "`")))) + (((`\".concat(prop, \"` + ("`" + `\");\n }).join(', '), \". Please remove them.\"));\n }\n\n return null;\n }));\n}\n\nvar _default = exactProp;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getFunctionName = getFunctionName;\nexports.default = void 0;\n// Fork of recompose/getDisplayName with added IE 11 support\n// Simplified polyfill for IE 11 support\n// https://github.com/JamesMGreene/Function.name/blob/58b314d4a983110c3682f1228f845d39ccca1817/Function.name.js#L3\nvar fnNameMatchRegex = /^\\s*function(?:\\s|\\s*\\/\\*.*\\*\\/\\s*)+([^(\\s/]*)\\s*/;\n\nfunction getFunctionName(fn) {\n var match = \"\".concat(fn).match(fnNameMatchRegex);\n var name = match && match[1];\n return name || '';\n}\n\nfunction getDisplayName(Component) {\n if (typeof Component === 'string') {\n return Component;\n }\n\n if (!Component) {\n return undefined;\n }\n\n return Component.displayName || Component.name || getFunctionName(Component) || 'Component';\n}\n\nvar _default = getDisplayName;\nexports.default = _default;", + "/** @license Material-UI v3.0.0-alpha.3\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nexport { default as componentPropType } from './componentPropType';\nexport { default as chainPropTypes } from './chainPropTypes';\nexport { default as exactProp } from './exactProp';\nexport { default as getDisplayName } from './getDisplayName';\nexport { default as ponyfillGlobal } from './ponyfillGlobal';\n", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n/* eslint-disable */\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar _default = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\n\nexports.default = _default;", + "module.exports = balanced;\nfunction balanced(a, b, str) {\n if (a instanceof RegExp) a = maybeMatch(a, str);\n if (b instanceof RegExp) b = maybeMatch(b, str);\n\n var r = range(a, b, str);\n\n return r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + a.length, r[1]),\n post: str.slice(r[1] + b.length)\n };\n}\n\nfunction maybeMatch(reg, str) {\n var m = str.match(reg);\n return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n var begs, beg, left, right, result;\n var ai = str.indexOf(a);\n var bi = str.indexOf(b, ai + 1);\n var i = ai;\n\n if (ai >= 0 && bi > 0) {\n begs = [];\n left = str.length;\n\n while (i >= 0 && !result) {\n if (i == ai) {\n begs.push(i);\n ai = str.indexOf(a, i + 1);\n } else if (begs.length == 1) {\n result = [ begs.pop(), bi ];\n } else {\n beg = begs.pop();\n if (beg < left) {\n left = beg;\n right = bi;\n }\n\n bi = str.indexOf(b, i + 1);\n }\n\n i = ai < bi && ai >= 0 ? ai : bi;\n }\n\n if (begs.length) {\n result = [ left, right ];\n }\n }\n\n return result;\n}\n", + "function createBroadcast (initialState) {\n var listeners = {};\n var id = 1;\n var _state = initialState;\n\n function getState () {\n return _state\n }\n\n function setState (state) {\n _state = state;\n var keys = Object.keys(listeners);\n var i = 0;\n var len = keys.length;\n for (; i < len; i++) {\n // if a listener gets unsubscribed during setState we just skip it\n if (listeners[keys[i]]) { listeners[keys[i]](state); }\n }\n }\n\n // subscribe to changes and return the subscriptionId\n function subscribe (listener) {\n if (typeof listener !== 'function') {\n throw new Error('listener must be a function.')\n }\n var currentId = id;\n listeners[currentId] = listener;\n id += 1;\n return currentId\n }\n\n // remove subscription by removing the listener function\n function unsubscribe (id) {\n listeners[id] = undefined;\n }\n\n return { getState: getState, setState: setState, subscribe: subscribe, unsubscribe: unsubscribe }\n}\n\nexport default createBroadcast;\n", + "/*!\n Copyright (c) 2017 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg) && arg.length) {\n\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\tif (inner) {\n\t\t\t\t\tclasses.push(inner);\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n", + "/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `)) + ("`" + (`typeof` + "`"))) + ((` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n", + "const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n", + "const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property ` + ("`" + `.conversion`)) + (("`" + ` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n", + "'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n", + "require('../modules/es6.math.acosh');\nrequire('../modules/es6.math.asinh');\nrequire('../modules/es6.math.atanh');\nrequire('../modules/es6.math.cbrt');\nrequire('../modules/es6.math.clz32');\nrequire('../modules/es6.math.cosh');\nrequire('../modules/es6.math.expm1');\nrequire('../modules/es6.math.fround');\nrequire('../modules/es6.math.hypot');\nrequire('../modules/es6.math.imul');\nrequire('../modules/es6.math.log10');\nrequire('../modules/es6.math.log1p');\nrequire('../modules/es6.math.log2');\nrequire('../modules/es6.math.sign');\nrequire('../modules/es6.math.sinh');\nrequire('../modules/es6.math.tanh');\nrequire('../modules/es6.math.trunc');\nmodule.exports = require('../modules/_core').Math;\n", + "require('../modules/es6.number.constructor');\nrequire('../modules/es6.number.to-fixed');\nrequire('../modules/es6.number.to-precision');\nrequire('../modules/es6.number.epsilon');\nrequire('../modules/es6.number.is-finite');\nrequire('../modules/es6.number.is-integer');\nrequire('../modules/es6.number.is-nan');\nrequire('../modules/es6.number.is-safe-integer');\nrequire('../modules/es6.number.max-safe-integer');\nrequire('../modules/es6.number.min-safe-integer');\nrequire('../modules/es6.number.parse-float');\nrequire('../modules/es6.number.parse-int');\nmodule.exports = require('../modules/_core').Number;\n", + "module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n", + "var cof = require('./_cof');\nmodule.exports = function (it, msg) {\n if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n return +it;\n};\n", + "var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n", + "// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n", + "var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n", + "var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n", + "// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n", + "// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n", + "// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n", + "var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n", + "// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n", + "var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `) + ("`" + `library`))))) + (((("`" + (`\nmodule.exports = $export;\n", + "module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n", + "// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n", + "var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n", + "var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n", + "var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n", + "module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n", + "var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n", + "// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n", + "// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n", + "module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n", + "module.exports = false;\n", + "// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n", + "// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n", + "// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n", + "// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n", + "// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake ` + "`")) + (`null` + ("`" + ` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n", + "var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n", + "var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n", + "var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n", + "// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n", + "var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n", + "// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n", + "exports.f = {}.propertyIsEnumerable;\n", + "var $parseFloat = require('./_global').parseFloat;\nvar $trim = require('./_string-trim').trim;\n\nmodule.exports = 1 / $parseFloat(require('./_string-ws') + '-0') !== -Infinity ? function parseFloat(str) {\n var string = $trim(String(str), 3);\n var result = $parseFloat(string);\n return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n", + "var $parseInt = require('./_global').parseInt;\nvar $trim = require('./_string-trim').trim;\nvar ws = require('./_string-ws');\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n", + "module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n", + "var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n", + "// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n", + "var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n", + "var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n", + "'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n", + "var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n", + "module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n", + "var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n", + "// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n", + "// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n", + "// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n", + "// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n", + "var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n", + "// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n", + "// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n", + "// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n", + "// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n", + "// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n", + "// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n", + "// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n", + "// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n", + "// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n", + "// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n", + "// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n", + "// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n", + "// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n", + "// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n", + "// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n", + "// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n", + "// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n", + "'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\n}\n", + "// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n", + "// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n", + "// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n", + "// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n", + "// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n", + "// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n", + "// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n", + "var $export = require('./_export');\nvar $parseFloat = require('./_parse-float');\n// 20.1.2.12 Number.parseFloat(string)\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });\n", + "var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 20.1.2.13 Number.parseInt(string, radix)\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });\n", + "'use strict';\nvar $export = require('./_export');\nvar toInteger = require('./_to-integer');\nvar aNumberValue = require('./_a-number-value');\nvar repeat = require('./_string-repeat');\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function (n, c) {\n var i = -1;\n var c2 = c;\n while (++i < 6) {\n c2 += n * data[i];\n data[i] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n};\nvar divide = function (n) {\n var i = 6;\n var c = 0;\n while (--i >= 0) {\n c += data[i];\n data[i] = floor(c / n);\n c = (c % n) * 1e7;\n }\n};\nvar numToString = function () {\n var i = 6;\n var s = '';\n while (--i >= 0) {\n if (s !== '' || i === 0 || data[i] !== 0) {\n var t = String(data[i]);\n s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n }\n } return s;\n};\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !require('./_fails')(function () {\n // V8 ~ Android 4.3-\n $toFixed.call({});\n})), 'Number', {\n toFixed: function toFixed(fractionDigits) {\n var x = aNumberValue(this, ERROR);\n var f = toInteger(fractionDigits);\n var s = '';\n var m = ZERO;\n var e, z, j, k;\n if (f < 0 || f > 20) throw RangeError(ERROR);\n // eslint-disable-next-line no-self-compare\n if (x != x) return 'NaN';\n if (x <= -1e21 || x >= 1e21) return String(x);\n if (x < 0) {\n s = '-';\n x = -x;\n }\n if (x > 1e-21) {\n e = log(x * pow(2, 69, 1)) - 69;\n z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = f;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n m = numToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n m = numToString() + repeat.call(ZERO, f);\n }\n }\n if (f > 0) {\n k = m.length;\n m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n } else {\n m = s + m;\n } return m;\n }\n});\n", + "'use strict';\nvar $export = require('./_export');\nvar $fails = require('./_fails');\nvar aNumberValue = require('./_a-number-value');\nvar $toPrecision = 1.0.toPrecision;\n\n$export($export.P + $export.F * ($fails(function () {\n // IE7-\n return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n // V8 ~ Android 4.3-\n $toPrecision.call({});\n})), 'Number', {\n toPrecision: function toPrecision(precision) {\n var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n }\n});\n", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = camelize;\nvar regExp = /[-\\s]+(.)?/g;\n\n/**\n * Convert dash separated strings to camel cased.\n *\n * @param {String} str\n * @return {String}\n */\nfunction camelize(str) {\n return str.replace(regExp, toUpper);\n}\n\nfunction toUpper(match, c) {\n return c ? c.toUpperCase() : '';\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.supportedValue = exports.supportedProperty = exports.prefix = undefined;\n\nvar _prefix = require('./prefix');\n\nvar _prefix2 = _interopRequireDefault(_prefix);\n\nvar _supportedProperty = require('./supported-property');\n\nvar _supportedProperty2 = _interopRequireDefault(_supportedProperty);\n\nvar _supportedValue = require('./supported-value');\n\nvar _supportedValue2 = _interopRequireDefault(_supportedValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nexports['default'] = {\n prefix: _prefix2['default'],\n supportedProperty: _supportedProperty2['default'],\n supportedValue: _supportedValue2['default']\n}; /**\n * CSS Vendor prefix detection and property feature testing.\n *\n * @copyright Oleg Slobodskoi 2015\n * @website https://github.com/jsstyles/css-vendor\n * @license MIT\n */\n\nexports.prefix = _prefix2['default'];\nexports.supportedProperty = _supportedProperty2['default'];\nexports.supportedValue = _supportedValue2['default'];", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar js = ''; /**\n * Export javascript style and css style vendor prefixes.\n * Based on \"transform\" support test.\n */\n\nvar css = '';\n\n// We should not do anything if required serverside.\nif (_isInBrowser2['default']) {\n // Order matters. We need to check Webkit the last one because\n // other vendors use to add Webkit prefixes to some properties\n var jsCssMap = {\n Moz: '-moz-',\n // IE did it wrong again ...\n ms: '-ms-',\n O: '-o-',\n Webkit: '-webkit-'\n };\n var style = document.createElement('p').style;\n var testProp = 'Transform';\n\n for (var key in jsCssMap) {\n if (key + testProp in style) {\n js = key;\n css = jsCssMap[key];\n break;\n }\n }\n}\n\n/**\n * Vendor prefix string for the current browser.\n *\n * @type {{js: String, css: String}}\n * @api public\n */\nexports['default'] = { js: js, css: css };", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = supportedProperty;\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nvar _prefix = require('./prefix');\n\nvar _prefix2 = _interopRequireDefault(_prefix);\n\nvar _camelize = require('./camelize');\n\nvar _camelize2 = _interopRequireDefault(_camelize);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar el = void 0;\nvar cache = {};\n\nif (_isInBrowser2['default']) {\n el = document.createElement('p');\n\n /**\n * We test every property on vendor prefix requirement.\n * Once tested, result is cached. It gives us up to 70% perf boost.\n * http://jsperf.com/element-style-object-access-vs-plain-object\n *\n * Prefill cache with known css properties to reduce amount of\n * properties we need to feature test at runtime.\n * http://davidwalsh.name/vendor-prefix\n */\n var computed = window.getComputedStyle(document.documentElement, '');\n for (var key in computed) {\n if (!isNaN(key)) cache[computed[key]] = computed[key];\n }\n}\n\n/**\n * Test if a property is supported, returns supported property with vendor\n * prefix if required. Returns `))) + (("`" + (`false` + "`")) + (` if not supported.\n *\n * @param {String} prop dash separated\n * @return {String|Boolean}\n * @api public\n */\nfunction supportedProperty(prop) {\n // For server-side rendering.\n if (!el) return prop;\n\n // We have not tested this prop yet, lets do the test.\n if (cache[prop] != null) return cache[prop];\n\n // Camelization is required because we can't test using\n // css syntax for e.g. in FF.\n // Test if property is supported as it is.\n if ((0, _camelize2['default'])(prop) in el.style) {\n cache[prop] = prop;\n }\n // Test if property is supported with vendor prefix.\n else if (_prefix2['default'].js + (0, _camelize2['default'])('-' + prop) in el.style) {\n cache[prop] = _prefix2['default'].css + prop;\n } else {\n cache[prop] = false;\n }\n\n return cache[prop];\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = supportedValue;\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nvar _prefix = require('./prefix');\n\nvar _prefix2 = _interopRequireDefault(_prefix);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar cache = {};\nvar el = void 0;\n\nif (_isInBrowser2['default']) el = document.createElement('p');\n\n/**\n * Returns prefixed value if needed. Returns ` + ("`" + `false`)))) + ((("`" + (` if value is not supported.\n *\n * @param {String} property\n * @param {String} value\n * @return {String|Boolean}\n * @api public\n */\nfunction supportedValue(property, value) {\n // For server-side rendering.\n if (!el) return value;\n\n // It is a string or a number as a string like '1'.\n // We want only prefixable values here.\n if (typeof value !== 'string' || !isNaN(parseInt(value, 10))) return value;\n\n var cacheKey = property + value;\n\n if (cache[cacheKey] != null) return cache[cacheKey];\n\n // IE can even throw an error in some cases, for e.g. style.content = 'bar'\n try {\n // Test value as it is.\n el.style[property] = value;\n } catch (err) {\n cache[cacheKey] = false;\n return false;\n }\n\n // Value is supported as it is.\n if (el.style[property] !== '') {\n cache[cacheKey] = value;\n } else {\n // Test value with vendor prefix.\n value = _prefix2['default'].css + value;\n\n // Hardcode test to convert \"flex\" to \"-ms-flexbox\" for IE10.\n if (value === '-ms-flex') value = '-ms-flexbox';\n\n el.style[property] = value;\n\n // Value is supported with vendor prefix.\n if (el.style[property] !== '') cache[cacheKey] = value;\n }\n\n if (!cache[cacheKey]) cache[cacheKey] = false;\n\n // Reset style value.\n el.style[property] = '';\n\n return cache[cacheKey];\n}", + "export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n", + "import ascending from \"./ascending\";\n\nexport default function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n", + "import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n", + "import {pair} from \"./pairs\";\n\nexport default function(values0, values1, reduce) {\n var n0 = values0.length,\n n1 = values1.length,\n values = new Array(n0 * n1),\n i0,\n i1,\n i,\n value0;\n\n if (reduce == null) reduce = pair;\n\n for (i0 = i = 0; i0 < n0; ++i0) {\n for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n values[i] = reduce(value0, values1[i1]);\n }\n }\n\n return values;\n}\n", + "export default function(x) {\n return x === null ? NaN : +x;\n}\n", + "var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n", + "export default function(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n", + "var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n", + "export default function(values) {\n return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n}\n", + "import number from \"./number\";\n\nexport default function(values, p, valueof) {\n if (valueof == null) valueof = number;\n if (!(n = values.length)) return;\n if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = +valueof(values[i0], i0, values),\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\n return value0 + (value1 - value0) * (i - i0);\n}\n", + "export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n constructor: Map,\n has: function(key) {\n return (prefix + key) in this;\n },\n get: function(key) {\n return this[prefix + key];\n },\n set: function(key, value) {\n this[prefix + key] = value;\n return this;\n },\n remove: function(key) {\n var property = prefix + key;\n return property in this && delete this[property];\n },\n clear: function() {\n for (var property in this) if (property[0] === prefix) delete this[property];\n },\n keys: function() {\n var keys = [];\n for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n return keys;\n },\n values: function() {\n var values = [];\n for (var property in this) if (property[0] === prefix) values.push(this[property]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n return entries;\n },\n size: function() {\n var size = 0;\n for (var property in this) if (property[0] === prefix) ++size;\n return size;\n },\n empty: function() {\n for (var property in this) if (property[0] === prefix) return false;\n return true;\n },\n each: function(f) {\n for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n }\n};\n\nfunction map(object, f) {\n var map = new Map;\n\n // Copy constructor.\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n // Index array by numeric index or specified key function.\n else if (Array.isArray(object)) {\n var i = -1,\n n = object.length,\n o;\n\n if (f == null) while (++i < n) map.set(i, object[i]);\n else while (++i < n) map.set(f(o = object[i], i, object), o);\n }\n\n // Convert object to map.\n else if (object) for (var key in object) map.set(key, object[key]);\n\n return map;\n}\n\nexport default map;\n", + "import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n constructor: Set,\n has: proto.has,\n add: function(value) {\n value += \"\";\n this[prefix + value] = value;\n return this;\n },\n remove: proto.remove,\n clear: proto.clear,\n values: proto.keys,\n size: proto.size,\n empty: proto.empty,\n each: proto.each\n};\n\nfunction set(object, f) {\n var set = new Set;\n\n // Copy constructor.\n if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n // Otherwise, assume it’s an array.\n else if (object) {\n var i = -1, n = object.length;\n if (f == null) while (++i < n) set.add(object[i]);\n else while (++i < n) set.add(f(object[i], i, object));\n }\n\n return set;\n}\n\nexport default set;\n", + "var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n", + "import {map} from \"d3-collection\";\nimport {slice} from \"./array\";\n\nexport var implicit = {name: \"implicit\"};\n\nexport default function ordinal(range) {\n var index = map(),\n domain = [],\n unknown = implicit;\n\n range = range == null ? [] : slice.call(range);\n\n function scale(d) {\n var key = d + \"\", i = index.get(key);\n if (!i) {\n if (unknown !== implicit) return unknown;\n index.set(key, i = domain.push(d));\n }\n return range[(i - 1) % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = map();\n var i = -1, n = _.length, d, key;\n while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal()\n .domain(domain)\n .range(range)\n .unknown(unknown);\n };\n\n return scale;\n}\n", + "import {range as sequence} from \"d3-array\";\nimport ordinal from \"./ordinal\";\n\nexport default function band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n range = [0, 1],\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = range[1] < range[0],\n start = range[reverse - 0],\n stop = range[1 - reverse];\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = sequence(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = [+_[0], +_[1]], round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band()\n .domain(domain())\n .range(range)\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return rescale();\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nexport function point() {\n return pointish(band().paddingInner(1));\n}\n", + "export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n", + "import define, {extend} from \"./define\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex3 = /^#([0-9a-f]{3})$/,\n reHex6 = /^#([0-9a-f]{6})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: function() {\n return this.rgb().hex();\n },\n toString: function() {\n return this.rgb() + \"\";\n }\n});\n\nexport default function color(format) {\n var m;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00\n : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format])\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (0 <= this.r && this.r <= 255)\n && (0 <= this.g && this.g <= 255)\n && (0 <= this.b && this.b <= 255)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: function() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n },\n toString: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n", + "export var deg2rad = Math.PI / 180;\nexport var rad2deg = 180 / Math.PI;\n", + "import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\n// https://beta.observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * deg2rad;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n }\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter: function(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker: function(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb: function() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * rad2deg;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter: function(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker: function(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb: function() {\n return labConvert(this).rgb();\n }\n}));\n", + "import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n", + "export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", + "export default function(x) {\n return function() {\n return x;\n };\n}\n", + "import constant from \"./constant\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n", + "import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis\";\nimport basisClosed from \"./basisClosed\";\nimport nogamma, {gamma} from \"./color\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n", + "import {basis} from \"./basis\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", + "export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return a + b * t;\n };\n}\n", + "import number from \"./number\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n", + "import decompose, {identity} from \"./decompose\";\n\nvar cssNode,\n cssRoot,\n cssView,\n svgNode;\n\nexport function parseCss(value) {\n if (value === \"none\") return identity;\n if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n cssNode.style.transform = value;\n value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n cssRoot.removeChild(cssNode);\n value = value.slice(7, -1).split(\",\");\n return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n", + "import {color} from \"d3-color\";\nimport rgb from \"./rgb\";\nimport array from \"./array\";\nimport date from \"./date\";\nimport number from \"./number\";\nimport object from \"./object\";\nimport string from \"./string\";\nimport constant from \"./constant\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : Array.isArray(b) ? array\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n", + "export default function(a, b) {\n var d = new Date;\n return a = +a, b -= a, function(t) {\n return d.setTime(a + b * t), d;\n };\n}\n", + "import value from \"./value\";\n\nexport default function(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n", + "import value from \"./value\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n", + "export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return Math.round(a + b * t);\n };\n}\n", + "var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n", + "import number from \"../number\";\nimport {parseCss, parseSvg} from \"./parse\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n", + "var rho = Math.SQRT2,\n rho2 = 2,\n rho4 = 4,\n epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\n// p0 = [ux0, uy0, w0]\n// p1 = [ux1, uy1, w1]\nexport default function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000;\n\n return i;\n}\n", + "import {hsl as colorHsl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hsl(hue) {\n return function(start, end) {\n var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hsl(hue);\nexport var hslLong = hsl(color);\n", + "import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n", + "import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n", + "export default function(interpolator, n) {\n var samples = new Array(n);\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n return samples;\n}\n", + "export default function(x) {\n return function() {\n return x;\n };\n}\n", + "export default function(x) {\n return +x;\n}\n", + "import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function deinterpolateLinear(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(b);\n}\n\nfunction deinterpolateClamp(deinterpolate) {\n return function(a, b) {\n var d = deinterpolate(a = +a, b = +b);\n return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };\n };\n}\n\nfunction reinterpolateClamp(reinterpolate) {\n return function(a, b) {\n var r = reinterpolate(a = +a, b = +b);\n return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };\n };\n}\n\nfunction bimap(domain, range, deinterpolate, reinterpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);\n else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, deinterpolate, reinterpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = deinterpolate(domain[i], domain[i + 1]);\n r[i] = reinterpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp());\n}\n\n// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].\nexport default function continuous(deinterpolate, reinterpolate) {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n clamp = false,\n piecewise,\n output,\n input;\n\n function rescale() {\n piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);\n }\n\n scale.invert = function(y) {\n return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = map.call(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = slice.call(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, rescale()) : clamp;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n return rescale();\n}\n", + "// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nexport default function(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n", + "import formatDecimal from \"./formatDecimal\";\n\nexport default function(x) {\n return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n}\n", + "// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n return new FormatSpecifier(specifier);\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n this.fill = match[1] || \" \";\n this.align = match[2] || \">\";\n this.sign = match[3] || \"-\";\n this.symbol = match[4] || \"\";\n this.zero = !!match[5];\n this.width = match[6] && +match[6];\n this.comma = !!match[7];\n this.precision = match[8] && +match[8].slice(1);\n this.trim = !!match[9];\n this.type = match[10] || \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width == null ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision == null ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n", + "// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n", + "import formatDecimal from \"./formatDecimal\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n", + "import formatLocale from \"./locale\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n decimal: \".\",\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n", + "import formatDecimal from \"./formatDecimal\";\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n", + "import formatPrefixAuto from \"./formatPrefixAuto\";\nimport formatRounded from \"./formatRounded\";\n\nexport default {\n \"%\": function(x, p) { return (x * 100).toFixed(p); },\n \"b\": function(x) { return Math.round(x).toString(2); },\n \"c\": function(x) { return x + \"\"; },\n \"d\": function(x) { return Math.round(x).toString(10); },\n \"e\": function(x, p) { return x.toExponential(p); },\n \"f\": function(x, p) { return x.toFixed(p); },\n \"g\": function(x, p) { return x.toPrecision(p); },\n \"o\": function(x) { return Math.round(x).toString(8); },\n \"p\": function(x, p) { return formatRounded(x * 100, p); },\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n \"x\": function(x) { return Math.round(x).toString(16); }\n};\n", + "export default function(x) {\n return x;\n}\n", + "import exponent from \"./exponent\";\nimport formatGroup from \"./formatGroup\";\nimport formatNumerals from \"./formatNumerals\";\nimport formatSpecifier from \"./formatSpecifier\";\nimport formatTrim from \"./formatTrim\";\nimport formatTypes from \"./formatTypes\";\nimport {prefixExponent} from \"./formatPrefixAuto\";\nimport identity from \"./identity\";\n\nvar prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity,\n currency = locale.currency,\n decimal = locale.decimal,\n numerals = locale.numerals ? formatNumerals(locale.numerals) : identity,\n percent = locale.percent || \"%\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currency[0] : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currency[1] : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision == null ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Perform the initial formatting.\n var valueNegative = value < 0;\n value = formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero during formatting, treat as positive.\n if (valueNegative && +value === 0) valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : \"-\") : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n", + "export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n", + "export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n", + "import exponent from \"./exponent\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n", + "import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function(domain, count, specifier) {\n var start = domain[0],\n stop = domain[domain.length - 1],\n step = tickStep(start, stop, count == null ? 10 : count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n", + "import exponent from \"./exponent\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n", + "import exponent from \"./exponent\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n", + "import {ticks, tickIncrement} from \"d3-array\";\nimport {interpolateNumber as reinterpolate} from \"d3-interpolate\";\nimport {default as continuous, copy, deinterpolateLinear as deinterpolate} from \"./continuous\";\nimport tickFormat from \"./tickFormat\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n return tickFormat(domain(), count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain(),\n i0 = 0,\n i1 = d.length - 1,\n start = d[i0],\n stop = d[i1],\n step;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n\n step = tickIncrement(start, stop, count);\n\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n step = tickIncrement(start, stop, count);\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n step = tickIncrement(start, stop, count);\n }\n\n if (step > 0) {\n d[i0] = Math.floor(start / step) * step;\n d[i1] = Math.ceil(stop / step) * step;\n domain(d);\n } else if (step < 0) {\n d[i0] = Math.ceil(start * step) / step;\n d[i1] = Math.floor(stop * step) / step;\n domain(d);\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous(deinterpolate, reinterpolate);\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n return linearish(scale);\n}\n", + "import {map} from \"./array\";\nimport {linearish} from \"./linear\";\nimport number from \"./number\";\n\nexport default function identity() {\n var domain = [0, 1];\n\n function scale(x) {\n return +x;\n }\n\n scale.invert = scale;\n\n scale.domain = scale.range = function(_) {\n return arguments.length ? (domain = map.call(_, number), scale) : domain.slice();\n };\n\n scale.copy = function() {\n return identity().domain(domain);\n };\n\n return linearish(scale);\n}\n", + "export default function(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n", + "import {ticks} from \"d3-array\";\nimport {format} from \"d3-format\";\nimport constant from \"./constant\";\nimport nice from \"./nice\";\nimport {default as continuous, copy} from \"./continuous\";\n\nfunction deinterpolate(a, b) {\n return (b = Math.log(b / a))\n ? function(x) { return Math.log(x / a) / b; }\n : constant(b);\n}\n\nfunction reinterpolate(a, b) {\n return a < 0\n ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }\n : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };\n}\n\nfunction pow10(x) {\n return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\n\nfunction powp(base) {\n return base === 10 ? pow10\n : base === Math.E ? Math.exp\n : function(x) { return Math.pow(base, x); };\n}\n\nfunction logp(base) {\n return base === Math.E ? Math.log\n : base === 10 && Math.log10\n || base === 2 && Math.log2\n || (base = Math.log(base), function(x) { return Math.log(x) / base; });\n}\n\nfunction reflect(f) {\n return function(x) {\n return -f(-x);\n };\n}\n\nexport default function log() {\n var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),\n domain = scale.domain,\n base = 10,\n logs = logp(10),\n pows = powp(10);\n\n function rescale() {\n logs = logp(base), pows = powp(base);\n if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);\n return scale;\n }\n\n scale.base = function(_) {\n return arguments.length ? (base = +_, rescale()) : base;\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.ticks = function(count) {\n var d = domain(),\n u = d[0],\n v = d[d.length - 1],\n r;\n\n if (r = v < u) i = u, u = v, v = i;\n\n var i = logs(u),\n j = logs(v),\n p,\n k,\n t,\n n = count == null ? 10 : +count,\n z = [];\n\n if (!(base % 1) && j - i < n) {\n i = Math.round(i) - 1, j = Math.round(j) + 1;\n if (u > 0) for (; i < j; ++i) {\n for (k = 1, p = pows(i); k < base; ++k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n } else for (; i < j; ++i) {\n for (k = base - 1, p = pows(i); k >= 1; --k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n }\n } else {\n z = ticks(i, j, Math.min(j - i, n)).map(pows);\n }\n\n return r ? z.reverse() : z;\n };\n\n scale.tickFormat = function(count, specifier) {\n if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n if (typeof specifier !== \"function\") specifier = format(specifier);\n if (count === Infinity) return specifier;\n if (count == null) count = 10;\n var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n return function(d) {\n var i = d / pows(Math.round(logs(d)));\n if (i * base < base - 0.5) i *= base;\n return i <= k ? specifier(d) : \"\";\n };\n };\n\n scale.nice = function() {\n return domain(nice(domain(), {\n floor: function(x) { return pows(Math.floor(logs(x))); },\n ceil: function(x) { return pows(Math.ceil(logs(x))); }\n }));\n };\n\n scale.copy = function() {\n return copy(scale, log().base(base));\n };\n\n return scale;\n}\n", + "import constant from \"./constant\";\nimport {linearish} from \"./linear\";\nimport {default as continuous, copy} from \"./continuous\";\n\nfunction raise(x, exponent) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n}\n\nexport default function pow() {\n var exponent = 1,\n scale = continuous(deinterpolate, reinterpolate),\n domain = scale.domain;\n\n function deinterpolate(a, b) {\n return (b = raise(b, exponent) - (a = raise(a, exponent)))\n ? function(x) { return (raise(x, exponent) - a) / b; }\n : constant(b);\n }\n\n function reinterpolate(a, b) {\n b = raise(b, exponent) - (a = raise(a, exponent));\n return function(t) { return raise(a + b * t, 1 / exponent); };\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, domain(domain())) : exponent;\n };\n\n scale.copy = function() {\n return copy(scale, pow().exponent(exponent));\n };\n\n return linearish(scale);\n}\n\nexport function sqrt() {\n return pow().exponent(0.5);\n}\n", + "import {ascending, bisect, quantile as threshold} from \"d3-array\";\nimport {slice} from \"./array\";\n\nexport default function quantile() {\n var domain = [],\n range = [],\n thresholds = [];\n\n function rescale() {\n var i = 0, n = Math.max(1, range.length);\n thresholds = new Array(n - 1);\n while (++i < n) thresholds[i - 1] = threshold(domain, i / n);\n return scale;\n }\n\n function scale(x) {\n if (!isNaN(x = +x)) return range[bisect(thresholds, x)];\n }\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN] : [\n i > 0 ? thresholds[i - 1] : domain[0],\n i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n ];\n };\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [];\n for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\n domain.sort(ascending);\n return rescale();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.quantiles = function() {\n return thresholds.slice();\n };\n\n scale.copy = function() {\n return quantile()\n .domain(domain)\n .range(range);\n };\n\n return scale;\n}\n", + "import {bisect} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {linearish} from \"./linear\";\n\nexport default function quantize() {\n var x0 = 0,\n x1 = 1,\n n = 1,\n domain = [0.5],\n range = [0, 1];\n\n function scale(x) {\n if (x <= x) return range[bisect(domain, x, 0, n)];\n }\n\n function rescale() {\n var i = -1;\n domain = new Array(n);\n while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n return scale;\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];\n };\n\n scale.range = function(_) {\n return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN]\n : i < 1 ? [x0, domain[0]]\n : i >= n ? [domain[n - 1], x1]\n : [domain[i - 1], domain[i]];\n };\n\n scale.copy = function() {\n return quantize()\n .domain([x0, x1])\n .range(range);\n };\n\n return linearish(scale);\n}\n", + "import {bisect} from \"d3-array\";\nimport {slice} from \"./array\";\n\nexport default function threshold() {\n var domain = [0.5],\n range = [0, 1],\n n = 1;\n\n function scale(x) {\n if (x <= x) return range[bisect(domain, x, 0, n)];\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return [domain[i - 1], domain[i]];\n };\n\n scale.copy = function() {\n return threshold()\n .domain(domain)\n .range(range);\n };\n\n return scale;\n}\n", + "var t0 = new Date,\n t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = new Date(+date)), date;\n }\n\n interval.floor = interval;\n\n interval.ceil = function(date) {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = function(date) {\n var d0 = interval(date),\n d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = function(date, step) {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = function(start, stop, step) {\n var range = [], previous;\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = function(test) {\n return newInterval(function(date) {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, function(date, step) {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = function(start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = function(step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? function(d) { return field(d) % step === 0; }\n : function(d) { return interval.count(0, d) % step === 0; });\n };\n }\n\n return interval;\n}\n", + "import interval from \"./interval\";\n\nvar millisecond = interval(function() {\n // noop\n}, function(date, step) {\n date.setTime(+date + step);\n}, function(start, end) {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return interval(function(date) {\n date.setTime(Math.floor(date / k) * k);\n }, function(date, step) {\n date.setTime(+date + step * k);\n }, function(start, end) {\n return (end - start) / k;\n });\n};\n\nexport default millisecond;\nexport var milliseconds = millisecond.range;\n", + "export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n", + "import interval from \"./interval\";\nimport {durationSecond} from \"./duration\";\n\nvar second = interval(function(date) {\n date.setTime(date - date.getMilliseconds());\n}, function(date, step) {\n date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n return (end - start) / durationSecond;\n}, function(date) {\n return date.getUTCSeconds();\n});\n\nexport default second;\nexport var seconds = second.range;\n", + "import interval from \"./interval\";\nimport {durationMinute, durationSecond} from \"./duration\";\n\nvar minute = interval(function(date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getMinutes();\n});\n\nexport default minute;\nexport var minutes = minute.range;\n", + "import interval from \"./interval\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration\";\n\nvar hour = interval(function(date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getHours();\n});\n\nexport default hour;\nexport var hours = hour.range;\n", + "import interval from \"./interval\";\nimport {durationDay, durationMinute} from \"./duration\";\n\nvar day = interval(function(date) {\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setDate(date.getDate() + step);\n}, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n", + "import interval from \"./interval\";\nimport {durationMinute, durationWeek} from \"./duration\";\n\nfunction weekday(i) {\n return interval(function(date) {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n", + "import interval from \"./interval\";\n\nvar month = interval(function(date) {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n return date.getMonth();\n});\n\nexport default month;\nexport var months = month.range;\n", + "import interval from \"./interval\";\n\nvar year = interval(function(date) {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n return end.getFullYear() - start.getFullYear();\n}, function(date) {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport default year;\nexport var years = year.range;\n", + "import interval from \"./interval\";\nimport {durationMinute} from \"./duration\";\n\nvar utcMinute = interval(function(date) {\n date.setUTCSeconds(0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getUTCMinutes();\n});\n\nexport default utcMinute;\nexport var utcMinutes = utcMinute.range;\n", + "import interval from \"./interval\";\nimport {durationHour} from \"./duration\";\n\nvar utcHour = interval(function(date) {\n date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getUTCHours();\n});\n\nexport default utcHour;\nexport var utcHours = utcHour.range;\n", + "import interval from \"./interval\";\nimport {durationDay} from \"./duration\";\n\nvar utcDay = interval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n return (end - start) / durationDay;\n}, function(date) {\n return date.getUTCDate() - 1;\n});\n\nexport default utcDay;\nexport var utcDays = utcDay.range;\n", + "import interval from \"./interval\";\nimport {durationWeek} from \"./duration\";\n\nfunction utcWeekday(i) {\n return interval(function(date) {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function(start, end) {\n return (end - start) / durationWeek;\n });\n}\n\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\n\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;\n", + "import interval from \"./interval\";\n\nvar utcMonth = interval(function(date) {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n return date.getUTCMonth();\n});\n\nexport default utcMonth;\nexport var utcMonths = utcMonth.range;\n", + "import interval from \"./interval\";\n\nvar utcYear = interval(function(date) {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport default utcYear;\nexport var utcYears = utcYear.range;\n", + "import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newYear(y) {\n return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, newDate) {\n return function(string) {\n var d = newYear(1900),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newYear(d.y)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = newDate(newYear(d.y)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return newDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", localDate);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier, utcDate);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n var map = {}, i = -1, n = names.length;\n while (++i < n) map[names[i].toLowerCase()] = i;\n return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatWeekNumberISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n", + "import formatLocale from \"./locale\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n", + "import {utcFormat} from \"./defaultLocale\";\n\nexport var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n ? formatIsoNative\n : utcFormat(isoSpecifier);\n\nexport default formatIso;\n", + "import {isoSpecifier} from \"./isoFormat\";\nimport {utcParse} from \"./defaultLocale\";\n\nfunction parseIsoNative(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n ? parseIsoNative\n : utcParse(isoSpecifier);\n\nexport default parseIso;\n", + "import {bisector, tickStep} from \"d3-array\";\nimport {interpolateNumber as reinterpolate} from \"d3-interpolate\";\nimport {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport {map} from \"./array\";\nimport {default as continuous, copy, deinterpolateLinear as deinterpolate} from \"./continuous\";\nimport nice from \"./nice\";\n\nvar durationSecond = 1000,\n durationMinute = durationSecond * 60,\n durationHour = durationMinute * 60,\n durationDay = durationHour * 24,\n durationWeek = durationDay * 7,\n durationMonth = durationDay * 30,\n durationYear = durationDay * 365;\n\nfunction date(t) {\n return new Date(t);\n}\n\nfunction number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n var scale = continuous(deinterpolate, reinterpolate),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(\".%L\"),\n formatSecond = format(\":%S\"),\n formatMinute = format(\"%I:%M\"),\n formatHour = format(\"%I %p\"),\n formatDay = format(\"%a %d\"),\n formatWeek = format(\"%b %d\"),\n formatMonth = format(\"%B\"),\n formatYear = format(\"%Y\");\n\n var tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n function tickInterval(interval, start, stop, step) {\n if (interval == null) interval = 10;\n\n // If a desired tick count is specified, pick a reasonable tick interval\n // based on the extent of the domain and a rough estimate of tick size.\n // Otherwise, assume interval is already a time interval and use it.\n if (typeof interval === \"number\") {\n var target = Math.abs(stop - start) / interval,\n i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n if (i === tickIntervals.length) {\n step = tickStep(start / durationYear, stop / durationYear, interval);\n interval = year;\n } else if (i) {\n i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n step = i[1];\n interval = i[0];\n } else {\n step = Math.max(tickStep(start, stop, interval), 1);\n interval = millisecond;\n }\n }\n\n return step == null ? interval : interval.every(step);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(map.call(_, number)) : domain().map(date);\n };\n\n scale.ticks = function(interval, step) {\n var d = domain(),\n t0 = d[0],\n t1 = d[d.length - 1],\n r = t1 < t0,\n t;\n if (r) t = t0, t0 = t1, t1 = t;\n t = tickInterval(interval, t0, t1, step);\n t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n return r ? t.reverse() : t;\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval, step) {\n var d = domain();\n return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n ? domain(nice(d, interval))\n : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n };\n\n return scale;\n}\n\nexport default function() {\n return calendar(timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);\n}\n", + "import {calendar} from \"./time\";\nimport {utcFormat} from \"d3-time-format\";\nimport {utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcMillisecond} from \"d3-time\";\n\nexport default function() {\n return calendar(utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcMillisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);\n}\n", + "import {linearish} from \"./linear\";\n\nexport default function sequential(interpolator) {\n var x0 = 0,\n x1 = 1,\n k10 = 1,\n clamp = false;\n\n function scale(x) {\n var t = (x - x0) * k10;\n return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], k10 = x0 === x1 ? 0 : 1 / (x1 - x0), scale) : [x0, x1];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n scale.copy = function() {\n return sequential(interpolator).domain([x0, x1]).clamp(clamp);\n };\n\n return linearish(scale);\n}\n", + "import {linearish} from \"./linear\";\n\nexport default function diverging(interpolator) {\n var x0 = 0,\n x1 = 0.5,\n x2 = 1,\n k10 = 1,\n k21 = 1,\n clamp = false;\n\n function scale(x) {\n var t = 0.5 + ((x = +x) - x1) * (x < x1 ? k10 : k21);\n return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], x2 = +_[2], k10 = x0 === x1 ? 0 : 0.5 / (x1 - x0), k21 = x1 === x2 ? 0 : 0.5 / (x2 - x1), scale) : [x0, x1, x2];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n scale.copy = function() {\n return diverging(interpolator).domain([x0, x1, x2]).clamp(clamp);\n };\n\n return linearish(scale);\n}\n", + "export {\n default as scaleBand,\n point as scalePoint\n} from \"./band\";\n\nexport {\n default as scaleIdentity\n} from \"./identity\";\n\nexport {\n default as scaleLinear\n} from \"./linear\";\n\nexport {\n default as scaleLog\n} from \"./log\";\n\nexport {\n default as scaleOrdinal,\n implicit as scaleImplicit\n} from \"./ordinal\";\n\nexport {\n default as scalePow,\n sqrt as scaleSqrt\n} from \"./pow\";\n\nexport {\n default as scaleQuantile\n} from \"./quantile\";\n\nexport {\n default as scaleQuantize\n} from \"./quantize\";\n\nexport {\n default as scaleThreshold\n} from \"./threshold\";\n\nexport {\n default as scaleTime\n} from \"./time\";\n\nexport {\n default as scaleUtc\n} from \"./utcTime\";\n\nexport {\n default as scaleSequential\n} from \"./sequential\";\n\nexport {\n default as scaleDiverging\n} from \"./diverging\";\n", + "var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n", + "export default function(x) {\n return function constant() {\n return x;\n };\n}\n", + "export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n", + "function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n", + "export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n", + "import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport curveLinear from \"./curve/linear\";\nimport {x as pointX, y as pointY} from \"./point\";\n\nexport default function() {\n var x = pointX,\n y = pointY,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n function line(data) {\n var i,\n n = data.length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n", + "import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport curveLinear from \"./curve/linear\";\nimport line from \"./line\";\nimport {x as pointX, y as pointY} from \"./point\";\n\nexport default function() {\n var x0 = pointX,\n x1 = null,\n y0 = constant(0),\n y1 = pointY,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n function area(data) {\n var i,\n j,\n k,\n n = data.length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n function arealine() {\n return line().defined(defined).curve(curve).context(context);\n }\n\n area.x = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n };\n\n area.x0 = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n };\n\n area.x1 = function(_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n };\n\n area.y = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n };\n\n area.y0 = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n };\n\n area.y1 = function(_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n };\n\n area.lineX0 =\n area.lineY0 = function() {\n return arealine().x(x0).y(y0);\n };\n\n area.lineY1 = function() {\n return arealine().x(x0).y(y1);\n };\n\n area.lineX1 = function() {\n return arealine().x(x1).y(y0);\n };\n\n area.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n };\n\n area.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n\n area.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n\n return area;\n}\n", + "import curveLinear from \"./linear\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n", + "import curveRadial, {curveRadialLinear} from \"./curve/radial\";\nimport line from \"./line\";\n\nexport function lineRadial(l) {\n var c = l.curve;\n\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n\n l.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return l;\n}\n\nexport default function() {\n return lineRadial(line().curve(curveRadialLinear));\n}\n", + "export var slice = Array.prototype.slice;\n", + "import {pi, tau} from \"../math\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n", + "export default {\n draw: function(context, size) {\n var r = Math.sqrt(size / 5) / 2;\n context.moveTo(-3 * r, -r);\n context.lineTo(-r, -r);\n context.lineTo(-r, -3 * r);\n context.lineTo(r, -3 * r);\n context.lineTo(r, -r);\n context.lineTo(3 * r, -r);\n context.lineTo(3 * r, r);\n context.lineTo(r, r);\n context.lineTo(r, 3 * r);\n context.lineTo(-r, 3 * r);\n context.lineTo(-r, r);\n context.lineTo(-3 * r, r);\n context.closePath();\n }\n};\n", + "var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n", + "import {pi, tau} from \"../math\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n", + "export default {\n draw: function(context, size) {\n var w = Math.sqrt(size),\n x = -w / 2;\n context.rect(x, x, w, w);\n }\n};\n", + "var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n", + "var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n", + "import {path} from \"d3-path\";\nimport circle from \"./symbol/circle\";\nimport cross from \"./symbol/cross\";\nimport diamond from \"./symbol/diamond\";\nimport star from \"./symbol/star\";\nimport square from \"./symbol/square\";\nimport triangle from \"./symbol/triangle\";\nimport wye from \"./symbol/wye\";\nimport constant from \"./constant\";\n\nexport var symbols = [\n circle,\n cross,\n diamond,\n square,\n star,\n triangle,\n wye\n];\n\nexport default function() {\n var type = constant(circle),\n size = constant(64),\n context = null;\n\n function symbol() {\n var buffer;\n if (!context) context = buffer = path();\n type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n symbol.type = function(_) {\n return arguments.length ? (type = typeof _ === \"function\" ? _ : constant(_), symbol) : type;\n };\n\n symbol.size = function(_) {\n return arguments.length ? (size = typeof _ === \"function\" ? _ : constant(+_), symbol) : size;\n };\n\n symbol.context = function(_) {\n return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n };\n\n return symbol;\n}\n", + "export default function() {}\n", + "export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n", + "import noop from \"../noop\";\nimport {point} from \"./basis\";\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisClosed(context);\n}\n", + "import {point} from \"./basis\";\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisOpen(context);\n}\n", + "import {Basis} from \"./basis\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n", + "export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n", + "import noop from \"../noop\";\nimport {point} from \"./cardinal\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n", + "import {point} from \"./cardinal\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n", + "import {epsilon} from \"../math\";\nimport {Cardinal} from \"./cardinal\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n", + "import {CardinalClosed} from \"./cardinalClosed\";\nimport noop from \"../noop\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n", + "import {CardinalOpen} from \"./cardinalOpen\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n", + "import noop from \"../noop\";\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nexport default function(context) {\n return new LinearClosed(context);\n}\n", + "function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n", + "function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n", + "function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n", + "export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n", + "export default function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n", + "import {slice} from \"./array\";\nimport constant from \"./constant\";\nimport offsetNone from \"./offset/none\";\nimport orderNone from \"./order/none\";\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nexport default function() {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n\n function stack(data) {\n var kz = keys.apply(this, arguments),\n i,\n m = data.length,\n n = kz.length,\n sz = new Array(n),\n oz;\n\n for (i = 0; i < n; ++i) {\n for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n si[j] = sij = [0, +value(data[j], ki, j, data)];\n sij.data = data[j];\n }\n si.key = ki;\n }\n\n for (i = 0, oz = order(sz); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n\n return stack;\n}\n", + "import none from \"./none\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n }\n none(series, order);\n}\n", + "import none from \"./none\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n s0[j][1] += s0[j][0] = -y / 2;\n }\n none(series, order);\n}\n", + "import none from \"./none\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n var si = series[order[i]],\n sij0 = si[j][1] || 0,\n sij1 = si[j - 1][1] || 0,\n s3 = (sij0 - sij1) / 2;\n for (var k = 0; k < i; ++k) {\n var sk = series[order[k]],\n skj0 = sk[j][1] || 0,\n skj1 = sk[j - 1][1] || 0;\n s3 += skj0 - skj1;\n }\n s1 += sij0, s2 += s3 * sij0;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n if (s1) y -= s2 / s1;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n none(series, order);\n}\n", + "export {default as arc} from \"./arc\";\nexport {default as area} from \"./area\";\nexport {default as line} from \"./line\";\nexport {default as pie} from \"./pie\";\nexport {default as areaRadial, default as radialArea} from \"./areaRadial\"; // Note: radialArea is deprecated!\nexport {default as lineRadial, default as radialLine} from \"./lineRadial\"; // Note: radialLine is deprecated!\nexport {default as pointRadial} from \"./pointRadial\";\nexport {linkHorizontal, linkVertical, linkRadial} from \"./link/index\";\n\nexport {default as symbol, symbols} from \"./symbol\";\nexport {default as symbolCircle} from \"./symbol/circle\";\nexport {default as symbolCross} from \"./symbol/cross\";\nexport {default as symbolDiamond} from \"./symbol/diamond\";\nexport {default as symbolSquare} from \"./symbol/square\";\nexport {default as symbolStar} from \"./symbol/star\";\nexport {default as symbolTriangle} from \"./symbol/triangle\";\nexport {default as symbolWye} from \"./symbol/wye\";\n\nexport {default as curveBasisClosed} from \"./curve/basisClosed\";\nexport {default as curveBasisOpen} from \"./curve/basisOpen\";\nexport {default as curveBasis} from \"./curve/basis\";\nexport {default as curveBundle} from \"./curve/bundle\";\nexport {default as curveCardinalClosed} from \"./curve/cardinalClosed\";\nexport {default as curveCardinalOpen} from \"./curve/cardinalOpen\";\nexport {default as curveCardinal} from \"./curve/cardinal\";\nexport {default as curveCatmullRomClosed} from \"./curve/catmullRomClosed\";\nexport {default as curveCatmullRomOpen} from \"./curve/catmullRomOpen\";\nexport {default as curveCatmullRom} from \"./curve/catmullRom\";\nexport {default as curveLinearClosed} from \"./curve/linearClosed\";\nexport {default as curveLinear} from \"./curve/linear\";\nexport {monotoneX as curveMonotoneX, monotoneY as curveMonotoneY} from \"./curve/monotone\";\nexport {default as curveNatural} from \"./curve/natural\";\nexport {default as curveStep, stepAfter as curveStepAfter, stepBefore as curveStepBefore} from \"./curve/step\";\n\nexport {default as stack} from \"./stack\";\nexport {default as stackOffsetExpand} from \"./offset/expand\";\nexport {default as stackOffsetDiverging} from \"./offset/diverging\";\nexport {default as stackOffsetNone} from \"./offset/none\";\nexport {default as stackOffsetSilhouette} from \"./offset/silhouette\";\nexport {default as stackOffsetWiggle} from \"./offset/wiggle\";\nexport {default as stackOrderAscending} from \"./order/ascending\";\nexport {default as stackOrderDescending} from \"./order/descending\";\nexport {default as stackOrderInsideOut} from \"./order/insideOut\";\nexport {default as stackOrderNone} from \"./order/none\";\nexport {default as stackOrderReverse} from \"./order/reverse\";\n", + "/*! decimal.js-light v2.5.0 https://github.com/MikeMcl/decimal.js-light/LICENCE */\r\n;(function (globalScope) {\r\n 'use strict';\r\n\r\n\r\n /*\r\n * decimal.js-light v2.5.0\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js-light\r\n * Copyright (c) 2018 Michael Mclaughlin \r\n * MIT Expat Licence\r\n */\r\n\r\n\r\n // ----------------------------------- EDITABLE DEFAULTS ------------------------------------ //\r\n\r\n\r\n // The limit on the value of ` + "`")) + (`precision` + ("`" + `, and on the value of the first argument to\r\n // `))) + (("`" + (`toDecimalPlaces` + "`")) + ((`, ` + "`") + (`toExponential` + "`"))))))) + ((((((`, ` + ("`" + `toFixed`)) + ("`" + (`, ` + "`"))) + ((`toPrecision` + ("`" + ` and `)) + ("`" + (`toSignificantDigits` + "`")))) + (((`.\r\n var MAX_DIGITS = 1e9, // 0 to 1e9\r\n\r\n\r\n // The initial configuration properties of the Decimal constructor.\r\n Decimal = {\r\n\r\n // These values must be integers within the stated ranges (inclusive).\r\n // Most of these values can be changed during run-time using ` + ("`" + `Decimal.config`)) + ("`" + (`.\r\n\r\n // The maximum number of significant digits of the result of a calculation or base conversion.\r\n // E.g. ` + "`"))) + ((`Decimal.config({ precision: 20 });` + ("`" + `\r\n precision: 20, // 1 to MAX_DIGITS\r\n\r\n // The rounding mode used by default by `)) + ("`" + (`toInteger` + "`"))))) + ((((`, ` + ("`" + `toDecimalPlaces`)) + ("`" + (`, ` + "`"))) + ((`toExponential` + ("`" + `,\r\n // `)) + ("`" + (`toFixed` + "`")))) + (((`, ` + ("`" + `toPrecision`)) + ("`" + (` and ` + "`"))) + ((`toSignificantDigits` + ("`" + `.\r\n //\r\n // ROUND_UP 0 Away from zero.\r\n // ROUND_DOWN 1 Towards zero.\r\n // ROUND_CEIL 2 Towards +Infinity.\r\n // ROUND_FLOOR 3 Towards -Infinity.\r\n // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n //\r\n // E.g.\r\n // `)) + (("`" + `Decimal.rounding = 4;`) + ("`" + `\r\n // `)))))) + ((((("`" + (`Decimal.rounding = Decimal.ROUND_HALF_UP;` + "`")) + (`\r\n rounding: 4, // 0 to 8\r\n\r\n // The exponent value at and beneath which ` + ("`" + `toString`))) + (("`" + (` returns exponential notation.\r\n // JavaScript numbers: -7\r\n toExpNeg: -7, // 0 to -MAX_E\r\n\r\n // The exponent value at and above which ` + "`")) + (`toString` + ("`" + ` returns exponential notation.\r\n // JavaScript numbers: 21\r\n toExpPos: 21, // 0 to MAX_E\r\n\r\n // The natural logarithm of 10.\r\n // 115 digits\r\n LN10: '2.302585092994045684017991454684364207601101488628772976033327900967572609677352480235997205089598298341967784042286'\r\n },\r\n\r\n\r\n // ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n external = true,\r\n\r\n decimalError = '[DecimalError] ',\r\n invalidArgument = decimalError + 'Invalid argument: ',\r\n exponentOutOfRange = decimalError + 'Exponent out of range: ',\r\n\r\n mathfloor = Math.floor,\r\n mathpow = Math.pow,\r\n\r\n isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n ONE,\r\n BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n MAX_E = mathfloor(MAX_SAFE_INTEGER / LOG_BASE), // 1286742750677284\r\n\r\n // Decimal.prototype object\r\n P = {};\r\n\r\n\r\n // Decimal prototype methods\r\n\r\n\r\n /*\r\n * absoluteValue abs\r\n * comparedTo cmp\r\n * decimalPlaces dp\r\n * dividedBy div\r\n * dividedToIntegerBy idiv\r\n * equals eq\r\n * exponent\r\n * greaterThan gt\r\n * greaterThanOrEqualTo gte\r\n * isInteger isint\r\n * isNegative isneg\r\n * isPositive ispos\r\n * isZero\r\n * lessThan lt\r\n * lessThanOrEqualTo lte\r\n * logarithm log\r\n * minus sub\r\n * modulo mod\r\n * naturalExponential exp\r\n * naturalLogarithm ln\r\n * negated neg\r\n * plus add\r\n * precision sd\r\n * squareRoot sqrt\r\n * times mul\r\n * toDecimalPlaces todp\r\n * toExponential\r\n * toFixed\r\n * toInteger toint\r\n * toNumber\r\n * toPower pow\r\n * toPrecision\r\n * toSignificantDigits tosd\r\n * toString\r\n * valueOf val\r\n */\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new this.constructor(this);\r\n if (x.s) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this Decimal is greater than the value of `)))) + ((("`" + (`y` + "`")) + (`,\r\n * -1 if the value of this Decimal is less than the value of ` + ("`" + `y`))) + (("`" + (`,\r\n * 0 if they have the same value\r\n *\r\n */\r\n P.comparedTo = P.cmp = function (y) {\r\n var i, j, xdL, ydL,\r\n x = this;\r\n\r\n y = new x.constructor(y);\r\n\r\n // Signs differ?\r\n if (x.s !== y.s) return x.s || -y.s;\r\n\r\n // Compare exponents.\r\n if (x.e !== y.e) return x.e > y.e ^ x.s < 0 ? 1 : -1;\r\n\r\n xdL = x.d.length;\r\n ydL = y.d.length;\r\n\r\n // Compare digit by digit.\r\n for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n if (x.d[i] !== y.d[i]) return x.d[i] > y.d[i] ^ x.s < 0 ? 1 : -1;\r\n }\r\n\r\n // Compare lengths.\r\n return xdL === ydL ? 0 : xdL > ydL ^ x.s < 0 ? 1 : -1;\r\n };\r\n\r\n\r\n /*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\n P.decimalPlaces = P.dp = function () {\r\n var x = this,\r\n w = x.d.length - 1,\r\n dp = (w - x.e) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n w = x.d[w];\r\n if (w) for (; w % 10 == 0; w /= 10) dp--;\r\n\r\n return dp < 0 ? 0 : dp;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal divided by ` + "`")) + ((`y` + "`") + (`, truncated to\r\n * ` + "`"))))) + ((((`precision` + ("`" + ` significant digits.\r\n *\r\n */\r\n P.dividedBy = P.div = function (y) {\r\n return divide(this, new this.constructor(y));\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `)) + ("`" + (`y` + "`"))) + ((`, truncated to ` + ("`" + `precision`)) + ("`" + (` significant digits.\r\n *\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return round(divide(x, new Ctor(y), 0, 1), Ctor.precision);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is equal to the value of ` + "`")))) + (((`y` + ("`" + `, otherwise return false.\r\n *\r\n */\r\n P.equals = P.eq = function (y) {\r\n return !this.cmp(y);\r\n };\r\n\r\n\r\n /*\r\n * Return the (base 10) exponent value of this Decimal (this.e is the base 10000000 exponent).\r\n *\r\n */\r\n P.exponent = function () {\r\n return getBase10Exponent(this);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is greater than the value of `)) + ("`" + (`y` + "`"))) + ((`, otherwise return\r\n * false.\r\n *\r\n */\r\n P.greaterThan = P.gt = function (y) {\r\n return this.cmp(y) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is greater than or equal to the value of ` + ("`" + `y`)) + (("`" + `,\r\n * otherwise return false.\r\n *\r\n */\r\n P.greaterThanOrEqualTo = P.gte = function (y) {\r\n return this.cmp(y) >= 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\n P.isInteger = P.isint = function () {\r\n return this.e > this.d.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\n P.isNegative = P.isneg = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\n P.isPositive = P.ispos = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is 0, otherwise return false.\r\n *\r\n */\r\n P.isZero = function () {\r\n return this.s === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is less than `) + ("`" + `y`)))))))) + ((((((("`" + (`, otherwise return false.\r\n *\r\n */\r\n P.lessThan = P.lt = function (y) {\r\n return this.cmp(y) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is less than or equal to ` + "`")) + (`y` + ("`" + `, otherwise return false.\r\n *\r\n */\r\n P.lessThanOrEqualTo = P.lte = function (y) {\r\n return this.cmp(y) < 1;\r\n };\r\n\r\n\r\n /*\r\n * Return the logarithm of the value of this Decimal to the specified base, truncated to\r\n * `))) + (("`" + (`precision` + "`")) + (` significant digits.\r\n *\r\n * If no base is specified, return log[10](x).\r\n *\r\n * log[base](x) = ln(x) / ln(base)\r\n *\r\n * The maximum error of the result is 1 ulp (unit in the last place).\r\n *\r\n * [base] {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\n P.logarithm = P.log = function (base) {\r\n var r,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision,\r\n wpr = pr + 5;\r\n\r\n // Default base is 10.\r\n if (base === void 0) {\r\n base = new Ctor(10);\r\n } else {\r\n base = new Ctor(base);\r\n\r\n // log[-b](x) = NaN\r\n // log[0](x) = NaN\r\n // log[1](x) = NaN\r\n if (base.s < 1 || base.eq(ONE)) throw Error(decimalError + 'NaN');\r\n }\r\n\r\n // log[b](-x) = NaN\r\n // log[b](0) = -Infinity\r\n if (x.s < 1) throw Error(decimalError + (x.s ? 'NaN' : '-Infinity'));\r\n\r\n // log[b](1) = 0\r\n if (x.eq(ONE)) return new Ctor(0);\r\n\r\n external = false;\r\n r = divide(ln(x, wpr), ln(base, wpr), wpr);\r\n external = true;\r\n\r\n return round(r, pr);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal minus ` + ("`" + `y`)))) + ((("`" + (`, truncated to\r\n * ` + "`")) + (`precision` + ("`" + ` significant digits.\r\n *\r\n */\r\n P.minus = P.sub = function (y) {\r\n var x = this;\r\n y = new x.constructor(y);\r\n return x.s == y.s ? subtract(x, y) : add(x, (y.s = -y.s, y));\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal modulo `))) + (("`" + (`y` + "`")) + (`, truncated to\r\n * ` + ("`" + `precision`))))) + (((("`" + (` significant digits.\r\n *\r\n */\r\n P.modulo = P.mod = function (y) {\r\n var q,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n y = new Ctor(y);\r\n\r\n // x % 0 = NaN\r\n if (!y.s) throw Error(decimalError + 'NaN');\r\n\r\n // Return x if x is 0.\r\n if (!x.s) return round(new Ctor(x), pr);\r\n\r\n // Prevent rounding of intermediate calculations.\r\n external = false;\r\n q = divide(x, y, 0, 1).times(y);\r\n external = true;\r\n\r\n return x.minus(q);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, truncated to ` + "`")) + (`precision` + ("`" + `\r\n * significant digits.\r\n *\r\n */\r\n P.naturalExponential = P.exp = function () {\r\n return exp(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * truncated to `))) + (("`" + (`precision` + "`")) + (` significant digits.\r\n *\r\n */\r\n P.naturalLogarithm = P.ln = function () {\r\n return ln(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\n P.negated = P.neg = function () {\r\n var x = new this.constructor(this);\r\n x.s = -x.s || 0;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal plus ` + ("`" + `y`)))) + ((("`" + (`, truncated to\r\n * ` + "`")) + (`precision` + ("`" + ` significant digits.\r\n *\r\n */\r\n P.plus = P.add = function (y) {\r\n var x = this;\r\n y = new x.constructor(y);\r\n return x.s == y.s ? add(x, y) : subtract(x, (y.s = -y.s, y));\r\n };\r\n\r\n\r\n /*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\n P.precision = P.sd = function (z) {\r\n var e, sd, w,\r\n x = this;\r\n\r\n if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n e = getBase10Exponent(x) + 1;\r\n w = x.d.length - 1;\r\n sd = w * LOG_BASE + 1;\r\n w = x.d[w];\r\n\r\n // If non-zero...\r\n if (w) {\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n for (; w % 10 == 0; w /= 10) sd--;\r\n\r\n // Add the number of digits of the first word.\r\n for (w = x.d[0]; w >= 10; w /= 10) sd++;\r\n }\r\n\r\n return z && e > sd ? e : sd;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the square root of this Decimal, truncated to `))) + (("`" + (`precision` + "`")) + ((`\r\n * significant digits.\r\n *\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var e, n, pr, r, s, t, wpr,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n // Negative or zero?\r\n if (x.s < 1) {\r\n if (!x.s) return new Ctor(0);\r\n\r\n // sqrt(-x) = NaN\r\n throw Error(decimalError + 'NaN');\r\n }\r\n\r\n e = getBase10Exponent(x);\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+x);\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = digitsToString(x.d);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(n);\r\n e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '1e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n pr = Ctor.precision;\r\n s = wpr = pr + 3;\r\n\r\n // Newton-Raphson iteration.\r\n for (;;) {\r\n t = r;\r\n r = t.plus(divide(x, t, wpr + 2)).times(0.5);\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === (n = digitsToString(r.d)).slice(0, wpr)) {\r\n n = n.slice(wpr - 3, wpr + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n if (s == wpr && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n round(t, pr + 1, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n } else if (n != '9999') {\r\n break;\r\n }\r\n\r\n wpr += 4;\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return round(r, pr);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal times ` + "`") + (`y` + "`")))))) + (((((`, truncated to\r\n * ` + ("`" + `precision`)) + ("`" + (` significant digits.\r\n *\r\n */\r\n P.times = P.mul = function (y) {\r\n var carry, e, i, k, r, rL, t, xdL, ydL,\r\n x = this,\r\n Ctor = x.constructor,\r\n xd = x.d,\r\n yd = (y = new Ctor(y)).d;\r\n\r\n // Return 0 if either is 0.\r\n if (!x.s || !y.s) return new Ctor(0);\r\n\r\n y.s *= x.s;\r\n e = x.e + y.e;\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Ensure xd points to the longer array.\r\n if (xdL < ydL) {\r\n r = xd;\r\n xd = yd;\r\n yd = r;\r\n rL = xdL;\r\n xdL = ydL;\r\n ydL = rL;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n r = [];\r\n rL = xdL + ydL;\r\n for (i = rL; i--;) r.push(0);\r\n\r\n // Multiply!\r\n for (i = ydL; --i >= 0;) {\r\n carry = 0;\r\n for (k = xdL + i; k > i;) {\r\n t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n r[k--] = t % BASE | 0;\r\n carry = t / BASE | 0;\r\n }\r\n\r\n r[k] = (r[k] + carry) % BASE | 0;\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; !r[--rL];) r.pop();\r\n\r\n if (carry) ++e;\r\n else r.shift();\r\n\r\n y.d = r;\r\n y.e = e;\r\n\r\n return external ? round(y, Ctor.precision) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of ` + "`"))) + ((`dp` + ("`" + `\r\n * decimal places using rounding mode `)) + ("`" + (`rm` + "`")))) + (((` or ` + ("`" + `rounding`)) + ("`" + (` if ` + "`"))) + ((`rm` + ("`" + ` is omitted.\r\n *\r\n * If `)) + (("`" + `dp`) + ("`" + ` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toDecimalPlaces = P.todp = function (dp, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n if (dp === void 0) return x;\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n return round(x, dp + getBase10Exponent(x) + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `))))) + (((("`" + (`dp` + "`")) + (` fixed decimal places using rounding mode ` + ("`" + `rounding`))) + (("`" + (`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toExponential = function (dp, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = toString(x, true);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = round(new Ctor(x), dp + 1, rm);\r\n str = toString(x, true, dp + 1);\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * ` + "`")) + (`dp` + ("`" + ` fixed decimal places and rounded using rounding mode `)))) + ((("`" + (`rm` + "`")) + (` or ` + ("`" + `rounding`))) + (("`" + (` if ` + "`")) + ((`rm` + "`") + (` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\n P.toFixed = function (dp, rm) {\r\n var str, y,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) return toString(x);\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n y = round(new Ctor(x), dp + getBase10Exponent(x) + 1, rm);\r\n str = toString(y.abs(), false, dp + getBase10Exponent(y) + 1);\r\n\r\n // To determine whether to add the minus sign look at the value before it was rounded,\r\n // i.e. look at ` + "`"))))))) + ((((((`x` + ("`" + ` rather than `)) + ("`" + (`y` + "`"))) + ((`.\r\n return x.isneg() && !x.isZero() ? '-' + str : str;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode ` + ("`" + `rounding`)) + ("`" + (`.\r\n *\r\n */\r\n P.toInteger = P.toint = function () {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return round(new Ctor(x), getBase10Exponent(x) + 1, Ctor.rounding);\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this Decimal converted to a number primitive.\r\n *\r\n */\r\n P.toNumber = function () {\r\n return +this;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power ` + "`")))) + (((`y` + ("`" + `,\r\n * truncated to `)) + ("`" + (`precision` + "`"))) + ((` significant digits.\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n * x^y = exp(y*ln(x))\r\n *\r\n * The maximum error is 1 ulp (unit in last place).\r\n *\r\n * y {number|string|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\n P.toPower = P.pow = function (y) {\r\n var e, k, pr, r, sign, yIsInt,\r\n x = this,\r\n Ctor = x.constructor,\r\n guard = 12,\r\n yn = +(y = new Ctor(y));\r\n\r\n // pow(x, 0) = 1\r\n if (!y.s) return new Ctor(ONE);\r\n\r\n x = new Ctor(x);\r\n\r\n // pow(0, y > 0) = 0\r\n // pow(0, y < 0) = Infinity\r\n if (!x.s) {\r\n if (y.s < 1) throw Error(decimalError + 'Infinity');\r\n return x;\r\n }\r\n\r\n // pow(1, y) = 1\r\n if (x.eq(ONE)) return x;\r\n\r\n pr = Ctor.precision;\r\n\r\n // pow(x, 1) = x\r\n if (y.eq(ONE)) return round(x, pr);\r\n\r\n e = y.e;\r\n k = y.d.length - 1;\r\n yIsInt = e >= k;\r\n sign = x.s;\r\n\r\n if (!yIsInt) {\r\n\r\n // pow(x < 0, y non-integer) = NaN\r\n if (sign < 0) throw Error(decimalError + 'NaN');\r\n\r\n // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n } else if ((k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n r = new Ctor(ONE);\r\n\r\n // Max k of 9007199254740991 takes 53 loop iterations.\r\n // Maximum digits array length; leaves [28, 34] guard digits.\r\n e = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n external = false;\r\n\r\n for (;;) {\r\n if (k % 2) {\r\n r = r.times(x);\r\n truncate(r.d, e);\r\n }\r\n\r\n k = mathfloor(k / 2);\r\n if (k === 0) break;\r\n\r\n x = x.times(x);\r\n truncate(x.d, e);\r\n }\r\n\r\n external = true;\r\n\r\n return y.s < 0 ? new Ctor(ONE).div(r) : round(r, pr);\r\n }\r\n\r\n // Result is negative if x is negative and the last digit of integer y is odd.\r\n sign = sign < 0 && y.d[Math.max(e, k)] & 1 ? -1 : 1;\r\n\r\n x.s = 1;\r\n external = false;\r\n r = y.times(ln(x, pr + guard));\r\n external = true;\r\n r = exp(r);\r\n r.s = sign;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal rounded to ` + ("`" + `sd`)) + ("`" + (` significant digits\r\n * using rounding mode ` + "`"))))) + ((((`rounding` + ("`" + `.\r\n *\r\n * Return exponential notation if `)) + ("`" + (`sd` + "`"))) + ((` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n var e, str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n e = getBase10Exponent(x);\r\n str = toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = round(new Ctor(x), sd, rm);\r\n e = getBase10Exponent(x);\r\n str = toString(x, sd <= e || e <= Ctor.toExpNeg, sd);\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of ` + ("`" + `sd`)) + ("`" + (`\r\n * significant digits using rounding mode ` + "`")))) + (((`rm` + ("`" + `, or to `)) + ("`" + (`precision` + "`"))) + ((` and ` + ("`" + `rounding`)) + (("`" + ` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toSignificantDigits = P.tosd = function (sd, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n }\r\n\r\n return round(new Ctor(x), sd, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `) + ("`" + `toExpPos`)))))) + ((((("`" + (`, or a negative exponent equal to or less than ` + "`")) + (`toExpNeg` + ("`" + `.\r\n *\r\n */\r\n P.toString = P.valueOf = P.val = P.toJSON = function () {\r\n var x = this,\r\n e = getBase10Exponent(x),\r\n Ctor = x.constructor;\r\n\r\n return toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\r\n };\r\n\r\n\r\n // Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n /*\r\n * add P.minus, P.plus\r\n * checkInt32 P.todp, P.toExponential, P.toFixed, P.toPrecision, P.tosd\r\n * digitsToString P.log, P.sqrt, P.pow, toString, exp, ln\r\n * divide P.div, P.idiv, P.log, P.mod, P.sqrt, exp, ln\r\n * exp P.exp, P.pow\r\n * getBase10Exponent P.exponent, P.sd, P.toint, P.sqrt, P.todp, P.toFixed, P.toPrecision,\r\n * P.toString, divide, round, toString, exp, ln\r\n * getLn10 P.log, ln\r\n * getZeroString digitsToString, toString\r\n * ln P.log, P.ln, P.pow, exp\r\n * parseDecimal Decimal\r\n * round P.abs, P.idiv, P.log, P.minus, P.mod, P.neg, P.plus, P.toint, P.sqrt,\r\n * P.times, P.todp, P.toExponential, P.toFixed, P.pow, P.toPrecision, P.tosd,\r\n * divide, getLn10, exp, ln\r\n * subtract P.minus, P.plus\r\n * toString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf\r\n * truncate P.pow\r\n *\r\n * Throws: P.log, P.mod, P.sd, P.sqrt, P.pow, checkInt32, divide, round,\r\n * getLn10, exp, ln, parseDecimal, Decimal, config\r\n */\r\n\r\n\r\n function add(x, y) {\r\n var carry, d, e, i, k, len, xd, yd,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n // If either is zero...\r\n if (!x.s || !y.s) {\r\n\r\n // Return x if y is zero.\r\n // Return y if y is non-zero.\r\n if (!y.s) y = new Ctor(x);\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n k = x.e;\r\n e = y.e;\r\n xd = xd.slice();\r\n i = k - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (i) {\r\n if (i < 0) {\r\n d = xd;\r\n i = -i;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = k;\r\n len = xd.length;\r\n }\r\n\r\n // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n k = Math.ceil(pr / LOG_BASE);\r\n len = k > len ? k + 1 : len + 1;\r\n\r\n if (i > len) {\r\n i = len;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n d.reverse();\r\n for (; i--;) d.push(0);\r\n d.reverse();\r\n }\r\n\r\n len = xd.length;\r\n i = yd.length;\r\n\r\n // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n if (len - i < 0) {\r\n i = len;\r\n d = yd;\r\n yd = xd;\r\n xd = d;\r\n }\r\n\r\n // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n for (carry = 0; i;) {\r\n carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n xd[i] %= BASE;\r\n }\r\n\r\n if (carry) {\r\n xd.unshift(carry);\r\n ++e;\r\n }\r\n\r\n // Remove trailing zeros.\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n y.d = xd;\r\n y.e = e;\r\n\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n\r\n function checkInt32(i, min, max) {\r\n if (i !== ~~i || i < min || i > max) {\r\n throw Error(invalidArgument + i);\r\n }\r\n }\r\n\r\n\r\n function digitsToString(d) {\r\n var i, k, ws,\r\n indexOfLastWord = d.length - 1,\r\n str = '',\r\n w = d[0];\r\n\r\n if (indexOfLastWord > 0) {\r\n str += w;\r\n for (i = 1; i < indexOfLastWord; i++) {\r\n ws = d[i] + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n str += ws;\r\n }\r\n\r\n w = d[i];\r\n ws = w + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n } else if (w === 0) {\r\n return '0';\r\n }\r\n\r\n // Remove trailing zeros of last w.\r\n for (; w % 10 === 0;) w /= 10;\r\n\r\n return str + w;\r\n }\r\n\r\n\r\n var divide = (function () {\r\n\r\n // Assumes non-zero x and k, and hence non-zero result.\r\n function multiplyInteger(x, k) {\r\n var temp,\r\n carry = 0,\r\n i = x.length;\r\n\r\n for (x = x.slice(); i--;) {\r\n temp = x[i] * k + carry;\r\n x[i] = temp % BASE | 0;\r\n carry = temp / BASE | 0;\r\n }\r\n\r\n if (carry) x.unshift(carry);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, r;\r\n\r\n if (aL != bL) {\r\n r = aL > bL ? 1 : -1;\r\n } else {\r\n for (i = r = 0; i < aL; i++) {\r\n if (a[i] != b[i]) {\r\n r = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function subtract(a, b, aL) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * BASE + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1;) a.shift();\r\n }\r\n\r\n return function (x, y, pr, dp) {\r\n var cmp, e, i, k, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz,\r\n Ctor = x.constructor,\r\n sign = x.s == y.s ? 1 : -1,\r\n xd = x.d,\r\n yd = y.d;\r\n\r\n // Either 0?\r\n if (!x.s) return new Ctor(x);\r\n if (!y.s) throw Error(decimalError + 'Division by zero');\r\n\r\n e = x.e - y.e;\r\n yL = yd.length;\r\n xL = xd.length;\r\n q = new Ctor(sign);\r\n qd = q.d = [];\r\n\r\n // Result exponent may be one less than e.\r\n for (i = 0; yd[i] == (xd[i] || 0); ) ++i;\r\n if (yd[i] > (xd[i] || 0)) --e;\r\n\r\n if (pr == null) {\r\n sd = pr = Ctor.precision;\r\n } else if (dp) {\r\n sd = pr + (getBase10Exponent(x) - getBase10Exponent(y)) + 1;\r\n } else {\r\n sd = pr;\r\n }\r\n\r\n if (sd < 0) return new Ctor(0);\r\n\r\n // Convert precision in number of base 10 digits to base 1e7 digits.\r\n sd = sd / LOG_BASE + 2 | 0;\r\n i = 0;\r\n\r\n // divisor < 1e7\r\n if (yL == 1) {\r\n k = 0;\r\n yd = yd[0];\r\n sd++;\r\n\r\n // k is the carry.\r\n for (; (i < xL || k) && sd--; i++) {\r\n t = k * BASE + (xd[i] || 0);\r\n qd[i] = t / yd | 0;\r\n k = t % yd | 0;\r\n }\r\n\r\n // divisor >= 1e7\r\n } else {\r\n\r\n // Normalise xd and yd so highest order digit of yd is >= BASE/2\r\n k = BASE / (yd[0] + 1) | 0;\r\n\r\n if (k > 1) {\r\n yd = multiplyInteger(yd, k);\r\n xd = multiplyInteger(xd, k);\r\n yL = yd.length;\r\n xL = xd.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xd.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL;) rem[remL++] = 0;\r\n\r\n yz = yd.slice();\r\n yz.unshift(0);\r\n yd0 = yd[0];\r\n\r\n if (yd[1] >= BASE / 2) ++yd0;\r\n\r\n do {\r\n k = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, k.\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * BASE + (rem[1] || 0);\r\n\r\n // k will be how many times the divisor goes into the current remainder.\r\n k = rem0 / yd0 | 0;\r\n\r\n // Algorithm:\r\n // 1. product = divisor * trial digit (k)\r\n // 2. if product > remainder: product -= divisor, k--\r\n // 3. remainder -= product\r\n // 4. if product was < remainder at 2:\r\n // 5. compare new remainder and divisor\r\n // 6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n if (k > 1) {\r\n if (k >= BASE) k = BASE - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiplyInteger(yd, k);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n cmp = compare(prod, rem, prodL, remL);\r\n\r\n // product > remainder.\r\n if (cmp == 1) {\r\n k--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yd, prodL);\r\n }\r\n } else {\r\n\r\n // cmp is -1.\r\n // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n if (k == 0) cmp = k = 1;\r\n prod = yd.slice();\r\n }\r\n\r\n prodL = prod.length;\r\n if (prodL < remL) prod.unshift(0);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL);\r\n\r\n // If product was < previous remainder.\r\n if (cmp == -1) {\r\n remL = rem.length;\r\n\r\n // Compare divisor and new remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n if (cmp < 1) {\r\n k++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yd, remL);\r\n }\r\n }\r\n\r\n remL = rem.length;\r\n } else if (cmp === 0) {\r\n k++;\r\n rem = [0];\r\n } // if cmp === 1, k will be 0\r\n\r\n // Add the next digit, k, to the result array.\r\n qd[i++] = k;\r\n\r\n // Update the remainder.\r\n if (cmp && rem[0]) {\r\n rem[remL++] = xd[xi] || 0;\r\n } else {\r\n rem = [xd[xi]];\r\n remL = 1;\r\n }\r\n\r\n } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n }\r\n\r\n // Leading zero?\r\n if (!qd[0]) qd.shift();\r\n\r\n q.e = e;\r\n\r\n return round(q, dp ? pr + getBase10Exponent(q) + 1 : pr);\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural exponential of `))) + (("`" + (`x` + "`")) + (` truncated to ` + ("`" + `sd`)))) + ((("`" + (`\r\n * significant digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n * Repeat x = x / 32, k += 5, until |x| < 0.1\r\n * exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n * exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n */\r\n function exp(x, sd) {\r\n var denominator, guard, pow, sum, t, wpr,\r\n i = 0,\r\n k = 0,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n if (getBase10Exponent(x) > 16) throw Error(exponentOutOfRange + getBase10Exponent(x));\r\n\r\n // exp(0) = 1\r\n if (!x.s) return new Ctor(ONE);\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n t = new Ctor(0.03125);\r\n\r\n while (x.abs().gte(0.1)) {\r\n x = x.times(t); // x = x / 2^5\r\n k += 5;\r\n }\r\n\r\n // Estimate the precision increase necessary to ensure the first 4 rounding digits are correct.\r\n guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n wpr += guard;\r\n denominator = pow = sum = new Ctor(ONE);\r\n Ctor.precision = wpr;\r\n\r\n for (;;) {\r\n pow = round(pow.times(x), wpr);\r\n denominator = denominator.times(++i);\r\n t = sum.plus(divide(pow, denominator, wpr));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n while (k--) sum = round(sum.times(sum), wpr);\r\n Ctor.precision = pr;\r\n return sd == null ? (external = true, round(sum, pr)) : sum;\r\n }\r\n\r\n sum = t;\r\n }\r\n }\r\n\r\n\r\n // Calculate the base 10 exponent from the base 1e7 exponent.\r\n function getBase10Exponent(x) {\r\n var e = x.e * LOG_BASE,\r\n w = x.d[0];\r\n\r\n // Add the number of digits of the first word of the digits array.\r\n for (; w >= 10; w /= 10) e++;\r\n return e;\r\n }\r\n\r\n\r\n function getLn10(Ctor, sd, pr) {\r\n\r\n if (sd > Ctor.LN10.sd()) {\r\n\r\n\r\n // Reset global state in case the exception is caught.\r\n external = true;\r\n if (pr) Ctor.precision = pr;\r\n throw Error(decimalError + 'LN10 precision limit exceeded');\r\n }\r\n\r\n return round(new Ctor(Ctor.LN10), sd);\r\n }\r\n\r\n\r\n function getZeroString(k) {\r\n var zs = '';\r\n for (; k--;) zs += '0';\r\n return zs;\r\n }\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural logarithm of ` + "`")) + (`x` + ("`" + ` truncated to `))) + (("`" + (`sd` + "`")) + ((` significant\r\n * digits.\r\n *\r\n * ln(n) is non-terminating (n != 1)\r\n *\r\n */\r\n function ln(y, sd) {\r\n var c, c0, denominator, e, numerator, sum, t, wpr, x2,\r\n n = 1,\r\n guard = 10,\r\n x = y,\r\n xd = x.d,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n // ln(-x) = NaN\r\n // ln(0) = -Infinity\r\n if (x.s < 1) throw Error(decimalError + (x.s ? 'NaN' : '-Infinity'));\r\n\r\n // ln(1) = 0\r\n if (x.eq(ONE)) return new Ctor(0);\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n if (x.eq(10)) {\r\n if (sd == null) external = true;\r\n return getLn10(Ctor, wpr);\r\n }\r\n\r\n wpr += guard;\r\n Ctor.precision = wpr;\r\n c = digitsToString(xd);\r\n c0 = c.charAt(0);\r\n e = getBase10Exponent(x);\r\n\r\n if (Math.abs(e) < 1.5e15) {\r\n\r\n // Argument reduction.\r\n // The series converges faster the closer the argument is to 1, so using\r\n // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b\r\n // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n // later be divided by this number, then separate out the power of 10 using\r\n // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n // max n is 6 (gives 0.7 - 1.3)\r\n while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n x = x.times(y);\r\n c = digitsToString(x.d);\r\n c0 = c.charAt(0);\r\n n++;\r\n }\r\n\r\n e = getBase10Exponent(x);\r\n\r\n if (c0 > 1) {\r\n x = new Ctor('0.' + c);\r\n e++;\r\n } else {\r\n x = new Ctor(c0 + '.' + c.slice(1));\r\n }\r\n } else {\r\n\r\n // The argument reduction method above may result in overflow if the argument y is a massive\r\n // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n x = ln(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n\r\n Ctor.precision = pr;\r\n return sd == null ? (external = true, round(x, pr)) : x;\r\n }\r\n\r\n // x is reduced to a value near 1.\r\n\r\n // Taylor series.\r\n // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n // where x = (y - 1)/(y + 1) (|x| < 1)\r\n sum = numerator = x = divide(x.minus(ONE), x.plus(ONE), wpr);\r\n x2 = round(x.times(x), wpr);\r\n denominator = 3;\r\n\r\n for (;;) {\r\n numerator = round(numerator.times(x2), wpr);\r\n t = sum.plus(divide(numerator, new Ctor(denominator), wpr));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n sum = sum.times(2);\r\n\r\n // Reverse the argument reduction.\r\n if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n sum = divide(sum, new Ctor(n), wpr);\r\n\r\n Ctor.precision = pr;\r\n return sd == null ? (external = true, round(sum, pr)) : sum;\r\n }\r\n\r\n sum = t;\r\n denominator += 2;\r\n }\r\n }\r\n\r\n\r\n /*\r\n * Parse the value of a new Decimal ` + "`") + (`x` + "`"))))) + ((((` from string ` + ("`" + `str`)) + ("`" + (`.\r\n */\r\n function parseDecimal(x, str) {\r\n var e, i, len;\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48;) ++i;\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(len - 1) === 48;) --len;\r\n str = str.slice(i, len);\r\n\r\n if (str) {\r\n len -= i;\r\n e = e - i - 1;\r\n x.e = mathfloor(e / LOG_BASE);\r\n x.d = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first word of the digits array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE;\r\n\r\n if (i < len) {\r\n if (i) x.d.push(+str.slice(0, i));\r\n for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n str = str.slice(i);\r\n i = LOG_BASE - str.length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--;) str += '0';\r\n x.d.push(+str);\r\n\r\n if (external && (x.e > MAX_E || x.e < -MAX_E)) throw Error(exponentOutOfRange + e);\r\n } else {\r\n\r\n // Zero.\r\n x.s = 0;\r\n x.e = 0;\r\n x.d = [0];\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n /*\r\n * Round ` + "`"))) + ((`x` + ("`" + ` to `)) + ("`" + (`sd` + "`")))) + (((` significant digits, using rounding mode ` + ("`" + `rm`)) + ("`" + (` if present (truncate otherwise).\r\n */\r\n function round(x, sd, rm) {\r\n var i, j, k, n, rd, doRound, w, xdi,\r\n xd = x.d;\r\n\r\n // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // w: the word of xd which contains the rounding digit, a base 1e7 number.\r\n // xdi: the index of w within xd.\r\n // n: the number of digits of w.\r\n // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n // they had leading zeros)\r\n // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n // Get the length of the first word of the digits array xd.\r\n for (n = 1, k = xd[0]; k >= 10; k /= 10) n++;\r\n i = sd - n;\r\n\r\n // Is the rounding digit in the first word of xd?\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n w = xd[xdi = 0];\r\n } else {\r\n xdi = Math.ceil((i + 1) / LOG_BASE);\r\n k = xd.length;\r\n if (xdi >= k) return x;\r\n w = k = xd[xdi];\r\n\r\n // Get the number of digits of w.\r\n for (n = 1; k >= 10; k /= 10) n++;\r\n\r\n // Get the index of rd within w.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within w, adjusted for leading zeros.\r\n // The number of leading zeros of w is given by LOG_BASE - n.\r\n j = i - LOG_BASE + n;\r\n }\r\n\r\n if (rm !== void 0) {\r\n k = mathpow(10, n - j - 1);\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = w / k % 10 | 0;\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n doRound = sd < 0 || xd[xdi + 1] !== void 0 || w % k;\r\n\r\n // The expression ` + "`"))) + ((`w % mathpow(10, n - j - 1)` + ("`" + ` returns all the digits of w to the right of the\r\n // digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression will give\r\n // 714.\r\n\r\n doRound = rm < 4\r\n ? (rd || doRound) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || doRound || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? w / mathpow(10, n - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n }\r\n\r\n if (sd < 1 || !xd[0]) {\r\n if (doRound) {\r\n k = getBase10Exponent(x);\r\n xd.length = 1;\r\n\r\n // Convert sd to decimal places.\r\n sd = sd - k - 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n x.e = mathfloor(-sd / LOG_BASE) || 0;\r\n } else {\r\n xd.length = 1;\r\n\r\n // Zero.\r\n xd[0] = x.e = x.s = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xd.length = xdi;\r\n k = 1;\r\n xdi--;\r\n } else {\r\n xd.length = xdi + 1;\r\n k = mathpow(10, LOG_BASE - i);\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of w.\r\n xd[xdi] = j > 0 ? (w / mathpow(10, n - j) % mathpow(10, j) | 0) * k : 0;\r\n }\r\n\r\n if (doRound) {\r\n for (;;) {\r\n\r\n // Is the digit to be rounded up in the first word of xd?\r\n if (xdi == 0) {\r\n if ((xd[0] += k) == BASE) {\r\n xd[0] = 1;\r\n ++x.e;\r\n }\r\n\r\n break;\r\n } else {\r\n xd[xdi] += k;\r\n if (xd[xdi] != BASE) break;\r\n xd[xdi--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n\r\n if (external && (x.e > MAX_E || x.e < -MAX_E)) {\r\n throw Error(exponentOutOfRange + getBase10Exponent(x));\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function subtract(x, y) {\r\n var d, e, i, j, k, len, xd, xe, xLTy, yd,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n // Return y negated if x is zero.\r\n // Return x if y is zero and x is non-zero.\r\n if (!x.s || !y.s) {\r\n if (y.s) y.s = -y.s;\r\n else y = new Ctor(x);\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n\r\n // x and y are non-zero numbers with the same sign.\r\n\r\n e = y.e;\r\n xe = x.e;\r\n xd = xd.slice();\r\n k = xe - e;\r\n\r\n // If exponents differ...\r\n if (k) {\r\n xLTy = k < 0;\r\n\r\n if (xLTy) {\r\n d = xd;\r\n k = -k;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = xe;\r\n len = xd.length;\r\n }\r\n\r\n // Numbers with massively different exponents would result in a very high number of zeros\r\n // needing to be prepended, but this can be avoided while still ensuring correct rounding by\r\n // limiting the number of zeros to `)) + (("`" + `Math.ceil(pr / LOG_BASE) + 2`) + ("`" + `.\r\n i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n if (k > i) {\r\n k = i;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents.\r\n d.reverse();\r\n for (i = k; i--;) d.push(0);\r\n d.reverse();\r\n\r\n // Base 1e7 exponents equal.\r\n } else {\r\n\r\n // Check digits to determine which is the bigger number.\r\n\r\n i = xd.length;\r\n len = yd.length;\r\n xLTy = i < len;\r\n if (xLTy) len = i;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (xd[i] != yd[i]) {\r\n xLTy = xd[i] < yd[i];\r\n break;\r\n }\r\n }\r\n\r\n k = 0;\r\n }\r\n\r\n if (xLTy) {\r\n d = xd;\r\n xd = yd;\r\n yd = d;\r\n y.s = -y.s;\r\n }\r\n\r\n len = xd.length;\r\n\r\n // Append zeros to xd if shorter.\r\n // Don't add zeros to yd if shorter as subtraction only needs to start at yd length.\r\n for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n // Subtract yd from xd.\r\n for (i = yd.length; i > k;) {\r\n if (xd[--i] < yd[i]) {\r\n for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n --xd[j];\r\n xd[i] += BASE;\r\n }\r\n\r\n xd[i] -= yd[i];\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] === 0;) xd.pop();\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n // Zero?\r\n if (!xd[0]) return new Ctor(0);\r\n\r\n y.d = xd;\r\n y.e = e;\r\n\r\n //return external && xd.length >= pr / LOG_BASE ? round(y, pr) : y;\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n\r\n function toString(x, isExp, sd) {\r\n var k,\r\n e = getBase10Exponent(x),\r\n str = digitsToString(x.d),\r\n len = str.length;\r\n\r\n if (isExp) {\r\n if (sd && (k = sd - len) > 0) {\r\n str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n } else if (len > 1) {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n\r\n str = str + (e < 0 ? 'e' : 'e+') + e;\r\n } else if (e < 0) {\r\n str = '0.' + getZeroString(-e - 1) + str;\r\n if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n } else if (e >= len) {\r\n str += getZeroString(e + 1 - len);\r\n if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n } else {\r\n if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n if (sd && (k = sd - len) > 0) {\r\n if (e + 1 === len) str += '.';\r\n str += getZeroString(k);\r\n }\r\n }\r\n\r\n return x.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Does not strip trailing zeros.\r\n function truncate(arr, len) {\r\n if (arr.length > len) {\r\n arr.length = len;\r\n return true;\r\n }\r\n }\r\n\r\n\r\n // Decimal methods\r\n\r\n\r\n /*\r\n * clone\r\n * config/set\r\n */\r\n\r\n\r\n /*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\n function clone(obj) {\r\n var i, p, ps;\r\n\r\n /*\r\n * The Decimal constructor and exported function.\r\n * Return a new Decimal instance.\r\n *\r\n * value {number|string|Decimal} A numeric value.\r\n *\r\n */\r\n function Decimal(value) {\r\n var x = this;\r\n\r\n // Decimal called without new.\r\n if (!(x instanceof Decimal)) return new Decimal(value);\r\n\r\n // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n // which points to Object.\r\n x.constructor = Decimal;\r\n\r\n // Duplicate.\r\n if (value instanceof Decimal) {\r\n x.s = value.s;\r\n x.e = value.e;\r\n x.d = (value = value.d) ? value.slice() : value;\r\n return;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n\r\n // Reject Infinity/NaN.\r\n if (value * 0 !== 0) {\r\n throw Error(invalidArgument + value);\r\n }\r\n\r\n if (value > 0) {\r\n x.s = 1;\r\n } else if (value < 0) {\r\n value = -value;\r\n x.s = -1;\r\n } else {\r\n x.s = 0;\r\n x.e = 0;\r\n x.d = [0];\r\n return;\r\n }\r\n\r\n // Fast path for small integers.\r\n if (value === ~~value && value < 1e7) {\r\n x.e = 0;\r\n x.d = [value];\r\n return;\r\n }\r\n\r\n return parseDecimal(x, value.toString());\r\n } else if (typeof value !== 'string') {\r\n throw Error(invalidArgument + value);\r\n }\r\n\r\n // Minus sign?\r\n if (value.charCodeAt(0) === 45) {\r\n value = value.slice(1);\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n if (isDecimal.test(value)) parseDecimal(x, value);\r\n else throw Error(invalidArgument + value);\r\n }\r\n\r\n Decimal.prototype = P;\r\n\r\n Decimal.ROUND_UP = 0;\r\n Decimal.ROUND_DOWN = 1;\r\n Decimal.ROUND_CEIL = 2;\r\n Decimal.ROUND_FLOOR = 3;\r\n Decimal.ROUND_HALF_UP = 4;\r\n Decimal.ROUND_HALF_DOWN = 5;\r\n Decimal.ROUND_HALF_EVEN = 6;\r\n Decimal.ROUND_HALF_CEIL = 7;\r\n Decimal.ROUND_HALF_FLOOR = 8;\r\n\r\n Decimal.clone = clone;\r\n Decimal.config = Decimal.set = config;\r\n\r\n if (obj === void 0) obj = {};\r\n if (obj) {\r\n ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'LN10'];\r\n for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n }\r\n\r\n Decimal.config(obj);\r\n\r\n return Decimal;\r\n }\r\n\r\n\r\n /*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `))))))))) + (((((((("`" + (`obj` + "`")) + (` is an object with one or more of the following properties,\r\n *\r\n * precision {number}\r\n * rounding {number}\r\n * toExpNeg {number}\r\n * toExpPos {number}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\n function config(obj) {\r\n if (!obj || typeof obj !== 'object') {\r\n throw Error(decimalError + 'Object expected');\r\n }\r\n var i, p, v,\r\n ps = [\r\n 'precision', 1, MAX_DIGITS,\r\n 'rounding', 0, 8,\r\n 'toExpNeg', -1 / 0, 0,\r\n 'toExpPos', 0, 1 / 0\r\n ];\r\n\r\n for (i = 0; i < ps.length; i += 3) {\r\n if ((v = obj[p = ps[i]]) !== void 0) {\r\n if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n if ((v = obj[p = 'LN10']) !== void 0) {\r\n if (v == Math.LN10) this[p] = new this(v);\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n\r\n // Create and configure initial Decimal constructor.\r\n Decimal = clone(Decimal);\r\n\r\n Decimal['default'] = Decimal.Decimal = Decimal;\r\n\r\n // Internal constant.\r\n ONE = new Decimal(1);\r\n\r\n\r\n // Export.\r\n\r\n\r\n // AMD.\r\n if (typeof define == 'function' && define.amd) {\r\n define(function () {\r\n return Decimal;\r\n });\r\n\r\n // Node and other environments that support module.exports.\r\n } else if (typeof module != 'undefined' && module.exports) {\r\n module.exports = Decimal;\r\n\r\n // Browser.\r\n } else {\r\n if (!globalScope) {\r\n globalScope = typeof self != 'undefined' && self && self.self == self\r\n ? self : Function('return this')();\r\n }\r\n\r\n globalScope.Decimal = Decimal;\r\n }\r\n})(this);\r\n", + "(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.deepmerge = factory());\n}(this, (function () { 'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tObject.keys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tObject.keys(source).forEach(function(key) {\n\t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nreturn deepmerge_1;\n\n})));\n", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = addClass;\n\nvar _hasClass = _interopRequireDefault(require(\"./hasClass\"));\n\nfunction addClass(element, className) {\n if (element.classList) element.classList.add(className);else if (!(0, _hasClass.default)(element, className)) if (typeof element.className === 'string') element.className = element.className + ' ' + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + ' ' + className);\n}\n\nmodule.exports = exports[\"default\"];", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = hasClass;\n\nfunction hasClass(element, className) {\n if (element.classList) return !!className && element.classList.contains(className);else return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}\n\nmodule.exports = exports[\"default\"];", + "'use strict';\n\nfunction replaceClassName(origClass, classToRemove) {\n return origClass.replace(new RegExp('(^|\\\\s)' + classToRemove + '(?:\\\\s|$)', 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n\nmodule.exports = function removeClass(element, className) {\n if (element.classList) element.classList.remove(className);else if (typeof element.className === 'string') element.className = replaceClassName(element.className, className);else element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n};", + "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", + "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the ` + ("`" + `throw`))) + (("`" + (` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign ` + "`")) + (`events` + ("`" + ` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = $getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n var args = [];\n for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n ReflectApply(this.listener, this.target, args);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n", + "'use strict';\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar ReactIs = require('react-is');\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\n\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\n\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\n\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\n\nvar TYPE_STATICS = {};\nTYPE_STATICS[ReactIs.ForwardRef] = FORWARD_REF_STATICS;\n\nfunction getStatics(component) {\n if (ReactIs.isMemo(component)) {\n return MEMO_STATICS;\n }\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\n\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n\n return targetComponent;\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n", + "/* eslint-disable no-var, prefer-template */\nvar uppercasePattern = /[A-Z]/g\nvar msPattern = /^ms-/\nvar cache = {}\n\nfunction toHyphenLower(match) {\n return '-' + match.toLowerCase()\n}\n\nfunction hyphenateStyleName(name) {\n if (cache.hasOwnProperty(name)) {\n return cache[name]\n }\n\n var hName = name.replace(uppercasePattern, toHyphenLower)\n return (cache[name] = msPattern.test(hName) ? '-' + hName : hName)\n}\n\nexport default hyphenateStyleName\n", + "var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexport var isBrowser = (typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\" && (typeof document === \"undefined\" ? \"undefined\" : _typeof(document)) === 'object' && document.nodeType === 9;\n\nexport default isBrowser;\n", + "/*!\n * is-plain-object \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isObject = require('isobject');\n\nfunction isObjectObject(o) {\n return isObject(o) === true\n && Object.prototype.toString.call(o) === '[object Object]';\n}\n\nmodule.exports = function isPlainObject(o) {\n var ctor,prot;\n\n if (isObjectObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (typeof ctor !== 'function') return false;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObjectObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n};\n", + "/*!\n * isobject \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function isObject(val) {\n return val != null && typeof val === 'object' && Array.isArray(val) === false;\n};\n", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = camelCase;\n\nvar _hyphenateStyleName = require('hyphenate-style-name');\n\nvar _hyphenateStyleName2 = _interopRequireDefault(_hyphenateStyleName);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Convert camel cased property names to dash separated.\n *\n * @param {Object} style\n * @return {Object}\n */\nfunction convertCase(style) {\n var converted = {};\n\n for (var prop in style) {\n converted[(0, _hyphenateStyleName2['default'])(prop)] = style[prop];\n }\n\n if (style.fallbacks) {\n if (Array.isArray(style.fallbacks)) converted.fallbacks = style.fallbacks.map(convertCase);else converted.fallbacks = convertCase(style.fallbacks);\n }\n\n return converted;\n}\n\n/**\n * Allow camel cased property names by converting them back to dasherized.\n *\n * @param {Rule} rule\n */\nfunction camelCase() {\n function onProcessStyle(style) {\n if (Array.isArray(style)) {\n // Handle rules like @font-face, which can have multiple styles in an array\n for (var index = 0; index < style.length; index++) {\n style[index] = convertCase(style[index]);\n }\n return style;\n }\n\n return convertCase(style);\n }\n\n function onChangeValue(value, prop, rule) {\n var hyphenatedProp = (0, _hyphenateStyleName2['default'])(prop);\n\n // There was no camel case in place\n if (prop === hyphenatedProp) return value;\n\n rule.prop(hyphenatedProp, value);\n\n // Core will ignore that property value we set the proper one above.\n return null;\n }\n\n return { onProcessStyle: onProcessStyle, onChangeValue: onChangeValue };\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/**\n * Generated jss-default-unit CSS property units\n *\n * @type object\n */\nexports['default'] = {\n 'animation-delay': 'ms',\n 'animation-duration': 'ms',\n 'background-position': 'px',\n 'background-position-x': 'px',\n 'background-position-y': 'px',\n 'background-size': 'px',\n border: 'px',\n 'border-bottom': 'px',\n 'border-bottom-left-radius': 'px',\n 'border-bottom-right-radius': 'px',\n 'border-bottom-width': 'px',\n 'border-left': 'px',\n 'border-left-width': 'px',\n 'border-radius': 'px',\n 'border-right': 'px',\n 'border-right-width': 'px',\n 'border-spacing': 'px',\n 'border-top': 'px',\n 'border-top-left-radius': 'px',\n 'border-top-right-radius': 'px',\n 'border-top-width': 'px',\n 'border-width': 'px',\n 'border-after-width': 'px',\n 'border-before-width': 'px',\n 'border-end-width': 'px',\n 'border-horizontal-spacing': 'px',\n 'border-start-width': 'px',\n 'border-vertical-spacing': 'px',\n bottom: 'px',\n 'box-shadow': 'px',\n 'column-gap': 'px',\n 'column-rule': 'px',\n 'column-rule-width': 'px',\n 'column-width': 'px',\n 'flex-basis': 'px',\n 'font-size': 'px',\n 'font-size-delta': 'px',\n height: 'px',\n left: 'px',\n 'letter-spacing': 'px',\n 'logical-height': 'px',\n 'logical-width': 'px',\n margin: 'px',\n 'margin-after': 'px',\n 'margin-before': 'px',\n 'margin-bottom': 'px',\n 'margin-left': 'px',\n 'margin-right': 'px',\n 'margin-top': 'px',\n 'max-height': 'px',\n 'max-width': 'px',\n 'margin-end': 'px',\n 'margin-start': 'px',\n 'mask-position-x': 'px',\n 'mask-position-y': 'px',\n 'mask-size': 'px',\n 'max-logical-height': 'px',\n 'max-logical-width': 'px',\n 'min-height': 'px',\n 'min-width': 'px',\n 'min-logical-height': 'px',\n 'min-logical-width': 'px',\n motion: 'px',\n 'motion-offset': 'px',\n outline: 'px',\n 'outline-offset': 'px',\n 'outline-width': 'px',\n padding: 'px',\n 'padding-bottom': 'px',\n 'padding-left': 'px',\n 'padding-right': 'px',\n 'padding-top': 'px',\n 'padding-after': 'px',\n 'padding-before': 'px',\n 'padding-end': 'px',\n 'padding-start': 'px',\n 'perspective-origin-x': '%',\n 'perspective-origin-y': '%',\n perspective: 'px',\n right: 'px',\n 'shape-margin': 'px',\n size: 'px',\n 'text-indent': 'px',\n 'text-stroke': 'px',\n 'text-stroke-width': 'px',\n top: 'px',\n 'transform-origin': '%',\n 'transform-origin-x': '%',\n 'transform-origin-y': '%',\n 'transform-origin-z': '%',\n 'transition-delay': 'ms',\n 'transition-duration': 'ms',\n 'vertical-align': 'px',\n width: 'px',\n 'word-spacing': 'px',\n // Not existing properties.\n // Used to avoid issues with jss-expand intergration.\n 'box-shadow-x': 'px',\n 'box-shadow-y': 'px',\n 'box-shadow-blur': 'px',\n 'box-shadow-spread': 'px',\n 'font-line-height': 'px',\n 'text-shadow-x': 'px',\n 'text-shadow-y': 'px',\n 'text-shadow-blur': 'px'\n};", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports['default'] = defaultUnit;\n\nvar _defaultUnits = require('./defaultUnits');\n\nvar _defaultUnits2 = _interopRequireDefault(_defaultUnits);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Clones the object and adds a camel cased property version.\n */\nfunction addCamelCasedVersion(obj) {\n var regExp = /(-[a-z])/g;\n var replace = function replace(str) {\n return str[1].toUpperCase();\n };\n var newObj = {};\n for (var key in obj) {\n newObj[key] = obj[key];\n newObj[key.replace(regExp, replace)] = obj[key];\n }\n return newObj;\n}\n\nvar units = addCamelCasedVersion(_defaultUnits2['default']);\n\n/**\n * Recursive deep style passing function\n *\n * @param {String} current property\n * @param {(Object|Array|Number|String)} property value\n * @param {Object} options\n * @return {(Object|Array|Number|String)} resulting value\n */\nfunction iterate(prop, value, options) {\n if (!value) return value;\n\n var convertedValue = value;\n\n var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n if (type === 'object' && Array.isArray(value)) type = 'array';\n\n switch (type) {\n case 'object':\n if (prop === 'fallbacks') {\n for (var innerProp in value) {\n value[innerProp] = iterate(innerProp, value[innerProp], options);\n }\n break;\n }\n for (var _innerProp in value) {\n value[_innerProp] = iterate(prop + '-' + _innerProp, value[_innerProp], options);\n }\n break;\n case 'array':\n for (var i = 0; i < value.length; i++) {\n value[i] = iterate(prop, value[i], options);\n }\n break;\n case 'number':\n if (value !== 0) {\n convertedValue = value + (options[prop] || units[prop] || '');\n }\n break;\n default:\n break;\n }\n\n return convertedValue;\n}\n\n/**\n * Add unit to numeric values.\n */\nfunction defaultUnit() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n var camelCasedOptions = addCamelCasedVersion(options);\n\n function onProcessStyle(style, rule) {\n if (rule.type !== 'style') return style;\n\n for (var prop in style) {\n style[prop] = iterate(prop, style[prop], camelCasedOptions);\n }\n\n return style;\n }\n\n function onChangeValue(value, prop) {\n return iterate(prop, value, camelCasedOptions);\n }\n\n return { onProcessStyle: onProcessStyle, onChangeValue: onChangeValue };\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports['default'] = jssGlobal;\n\nvar _jss = require('jss');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar propKey = '@global';\nvar prefixKey = '@global ';\n\nvar GlobalContainerRule = function () {\n function GlobalContainerRule(key, styles, options) {\n _classCallCheck(this, GlobalContainerRule);\n\n this.type = 'global';\n\n this.key = key;\n this.options = options;\n this.rules = new _jss.RuleList(_extends({}, options, {\n parent: this\n }));\n\n for (var selector in styles) {\n this.rules.add(selector, styles[selector], { selector: selector });\n }\n\n this.rules.process();\n }\n\n /**\n * Get a rule.\n */\n\n\n _createClass(GlobalContainerRule, [{\n key: 'getRule',\n value: function getRule(name) {\n return this.rules.get(name);\n }\n\n /**\n * Create and register rule, run plugins.\n */\n\n }, {\n key: 'addRule',\n value: function addRule(name, style, options) {\n var rule = this.rules.add(name, style, options);\n this.options.jss.plugins.onProcessRule(rule);\n return rule;\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.rules.indexOf(rule);\n }\n\n /**\n * Generates a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString() {\n return this.rules.toString();\n }\n }]);\n\n return GlobalContainerRule;\n}();\n\nvar GlobalPrefixedRule = function () {\n function GlobalPrefixedRule(name, style, options) {\n _classCallCheck(this, GlobalPrefixedRule);\n\n this.name = name;\n this.options = options;\n var selector = name.substr(prefixKey.length);\n this.rule = options.jss.createRule(selector, style, _extends({}, options, {\n parent: this,\n selector: selector\n }));\n }\n\n _createClass(GlobalPrefixedRule, [{\n key: 'toString',\n value: function toString(options) {\n return this.rule.toString(options);\n }\n }]);\n\n return GlobalPrefixedRule;\n}();\n\nvar separatorRegExp = /\\s*,\\s*/g;\n\nfunction addScope(selector, scope) {\n var parts = selector.split(separatorRegExp);\n var scoped = '';\n for (var i = 0; i < parts.length; i++) {\n scoped += scope + ' ' + parts[i].trim();\n if (parts[i + 1]) scoped += ', ';\n }\n return scoped;\n}\n\nfunction handleNestedGlobalContainerRule(rule) {\n var options = rule.options,\n style = rule.style;\n\n var rules = style[propKey];\n\n if (!rules) return;\n\n for (var name in rules) {\n options.sheet.addRule(name, rules[name], _extends({}, options, {\n selector: addScope(name, rule.selector)\n }));\n }\n\n delete style[propKey];\n}\n\nfunction handlePrefixedGlobalRule(rule) {\n var options = rule.options,\n style = rule.style;\n\n for (var prop in style) {\n if (prop.substr(0, propKey.length) !== propKey) continue;\n\n var selector = addScope(prop.substr(propKey.length), rule.selector);\n options.sheet.addRule(selector, style[prop], _extends({}, options, {\n selector: selector\n }));\n delete style[prop];\n }\n}\n\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\nfunction jssGlobal() {\n function onCreateRule(name, styles, options) {\n if (name === propKey) {\n return new GlobalContainerRule(name, styles, options);\n }\n\n if (name[0] === '@' && name.substr(0, prefixKey.length) === prefixKey) {\n return new GlobalPrefixedRule(name, styles, options);\n }\n\n var parent = options.parent;\n\n\n if (parent) {\n if (parent.type === 'global' || parent.options.parent.type === 'global') {\n options.global = true;\n }\n }\n\n if (options.global) options.selector = name;\n\n return null;\n }\n\n function onProcessRule(rule) {\n if (rule.type !== 'style') return;\n\n handleNestedGlobalContainerRule(rule);\n handlePrefixedGlobalRule(rule);\n }\n\n return { onCreateRule: onCreateRule, onProcessRule: onProcessRule };\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.default = jssNested;\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar separatorRegExp = /\\s*,\\s*/g;\nvar parentRegExp = /&/g;\nvar refRegExp = /\\$([\\w-]+)/g;\n\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\nfunction jssNested() {\n // Get a function to be used for $ref replacement.\n function getReplaceRef(container) {\n return function (match, key) {\n var rule = container.getRule(key);\n if (rule) return rule.selector;\n (0, _warning2.default)(false, '[JSS] Could not find the referenced rule %s in %s.', key, container.options.meta || container);\n return key;\n };\n }\n\n var hasAnd = function hasAnd(str) {\n return str.indexOf('&') !== -1;\n };\n\n function replaceParentRefs(nestedProp, parentProp) {\n var parentSelectors = parentProp.split(separatorRegExp);\n var nestedSelectors = nestedProp.split(separatorRegExp);\n\n var result = '';\n\n for (var i = 0; i < parentSelectors.length; i++) {\n var parent = parentSelectors[i];\n\n for (var j = 0; j < nestedSelectors.length; j++) {\n var nested = nestedSelectors[j];\n if (result) result += ', ';\n // Replace all & by the parent or prefix & with the parent.\n result += hasAnd(nested) ? nested.replace(parentRegExp, parent) : parent + ' ' + nested;\n }\n }\n\n return result;\n }\n\n function getOptions(rule, container, options) {\n // Options has been already created, now we only increase index.\n if (options) return _extends({}, options, { index: options.index + 1 });\n\n var nestingLevel = rule.options.nestingLevel;\n\n nestingLevel = nestingLevel === undefined ? 1 : nestingLevel + 1;\n\n return _extends({}, rule.options, {\n nestingLevel: nestingLevel,\n index: container.indexOf(rule) + 1\n });\n }\n\n function onProcessStyle(style, rule) {\n if (rule.type !== 'style') return style;\n var container = rule.options.parent;\n var options = void 0;\n var replaceRef = void 0;\n for (var prop in style) {\n var isNested = hasAnd(prop);\n var isNestedConditional = prop[0] === '@';\n\n if (!isNested && !isNestedConditional) continue;\n\n options = getOptions(rule, container, options);\n\n if (isNested) {\n var selector = replaceParentRefs(prop, rule.selector\n // Lazily create the ref replacer function just once for\n // all nested rules within the sheet.\n );if (!replaceRef) replaceRef = getReplaceRef(container\n // Replace all $refs.\n );selector = selector.replace(refRegExp, replaceRef);\n\n container.addRule(selector, style[prop], _extends({}, options, { selector: selector }));\n } else if (isNestedConditional) {\n container\n // Place conditional right after the parent rule to ensure right ordering.\n .addRule(prop, null, options).addRule(rule.key, style[prop], { selector: rule.selector });\n }\n\n delete style[prop];\n }\n\n return style;\n }\n\n return { onProcessStyle: onProcessStyle };\n}", + "/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '`)))) + ((("`" + (`warning(condition, format, ...args)` + "`")) + (` requires a warning ' +\n 'message argument'\n );\n }\n\n if (format.length < 10 || (/^[s\\W]*$/).test(format)) {\n throw new Error(\n 'The warning format should be able to uniquely identify this ' +\n 'warning. Please, use a more descriptive format than: ' + format\n );\n }\n\n if (!condition) {\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch(x) {}\n }\n };\n}\n\nmodule.exports = warning;\n", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = jssPropsSort;\n/**\n * Sort props by length.\n */\nfunction jssPropsSort() {\n function sort(prop0, prop1) {\n return prop0.length - prop1.length;\n }\n\n function onProcessStyle(style, rule) {\n if (rule.type !== 'style') return style;\n\n var newStyle = {};\n var props = Object.keys(style).sort(sort);\n for (var prop in props) {\n newStyle[props[prop]] = style[props[prop]];\n }\n return newStyle;\n }\n\n return { onProcessStyle: onProcessStyle };\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = jssVendorPrefixer;\n\nvar _cssVendor = require('css-vendor');\n\nvar vendor = _interopRequireWildcard(_cssVendor);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\n/**\n * Add vendor prefix to a property name when needed.\n *\n * @param {Rule} rule\n * @api public\n */\nfunction jssVendorPrefixer() {\n function onProcessRule(rule) {\n if (rule.type === 'keyframes') {\n rule.key = '@' + vendor.prefix.css + rule.key.substr(1);\n }\n }\n\n function onProcessStyle(style, rule) {\n if (rule.type !== 'style') return style;\n\n for (var prop in style) {\n var value = style[prop];\n\n var changeProp = false;\n var supportedProp = vendor.supportedProperty(prop);\n if (supportedProp && supportedProp !== prop) changeProp = true;\n\n var changeValue = false;\n var supportedValue = vendor.supportedValue(supportedProp, value);\n if (supportedValue && supportedValue !== value) changeValue = true;\n\n if (changeProp || changeValue) {\n if (changeProp) delete style[prop];\n style[supportedProp || prop] = supportedValue || value;\n }\n }\n\n return style;\n }\n\n function onChangeValue(value, prop) {\n return vendor.supportedValue(prop, value);\n }\n\n return { onProcessRule: onProcessRule, onProcessStyle: onProcessStyle, onChangeValue: onChangeValue };\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nvar _StyleSheet = require('./StyleSheet');\n\nvar _StyleSheet2 = _interopRequireDefault(_StyleSheet);\n\nvar _PluginsRegistry = require('./PluginsRegistry');\n\nvar _PluginsRegistry2 = _interopRequireDefault(_PluginsRegistry);\n\nvar _rules = require('./plugins/rules');\n\nvar _rules2 = _interopRequireDefault(_rules);\n\nvar _observables = require('./plugins/observables');\n\nvar _observables2 = _interopRequireDefault(_observables);\n\nvar _functions = require('./plugins/functions');\n\nvar _functions2 = _interopRequireDefault(_functions);\n\nvar _sheets = require('./sheets');\n\nvar _sheets2 = _interopRequireDefault(_sheets);\n\nvar _StyleRule = require('./rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _createGenerateClassName = require('./utils/createGenerateClassName');\n\nvar _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName);\n\nvar _createRule2 = require('./utils/createRule');\n\nvar _createRule3 = _interopRequireDefault(_createRule2);\n\nvar _DomRenderer = require('./renderers/DomRenderer');\n\nvar _DomRenderer2 = _interopRequireDefault(_DomRenderer);\n\nvar _VirtualRenderer = require('./renderers/VirtualRenderer');\n\nvar _VirtualRenderer2 = _interopRequireDefault(_VirtualRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar defaultPlugins = _rules2['default'].concat([_observables2['default'], _functions2['default']]);\n\nvar instanceCounter = 0;\n\nvar Jss = function () {\n function Jss(options) {\n _classCallCheck(this, Jss);\n\n this.id = instanceCounter++;\n this.version = \"9.8.7\";\n this.plugins = new _PluginsRegistry2['default']();\n this.options = {\n createGenerateClassName: _createGenerateClassName2['default'],\n Renderer: _isInBrowser2['default'] ? _DomRenderer2['default'] : _VirtualRenderer2['default'],\n plugins: []\n };\n this.generateClassName = (0, _createGenerateClassName2['default'])();\n\n // eslint-disable-next-line prefer-spread\n this.use.apply(this, defaultPlugins);\n this.setup(options);\n }\n\n _createClass(Jss, [{\n key: 'setup',\n value: function setup() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (options.createGenerateClassName) {\n this.options.createGenerateClassName = options.createGenerateClassName;\n // $FlowFixMe\n this.generateClassName = options.createGenerateClassName();\n }\n\n if (options.insertionPoint != null) this.options.insertionPoint = options.insertionPoint;\n if (options.virtual || options.Renderer) {\n this.options.Renderer = options.Renderer || (options.virtual ? _VirtualRenderer2['default'] : _DomRenderer2['default']);\n }\n\n // eslint-disable-next-line prefer-spread\n if (options.plugins) this.use.apply(this, options.plugins);\n\n return this;\n }\n\n /**\n * Create a Style Sheet.\n */\n\n }, {\n key: 'createStyleSheet',\n value: function createStyleSheet(styles) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var index = options.index;\n if (typeof index !== 'number') {\n index = _sheets2['default'].index === 0 ? 0 : _sheets2['default'].index + 1;\n }\n var sheet = new _StyleSheet2['default'](styles, _extends({}, options, {\n jss: this,\n generateClassName: options.generateClassName || this.generateClassName,\n insertionPoint: this.options.insertionPoint,\n Renderer: this.options.Renderer,\n index: index\n }));\n this.plugins.onProcessSheet(sheet);\n\n return sheet;\n }\n\n /**\n * Detach the Style Sheet and remove it from the registry.\n */\n\n }, {\n key: 'removeStyleSheet',\n value: function removeStyleSheet(sheet) {\n sheet.detach();\n _sheets2['default'].remove(sheet);\n return this;\n }\n\n /**\n * Create a rule without a Style Sheet.\n */\n\n }, {\n key: 'createRule',\n value: function createRule(name) {\n var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n // Enable rule without name for inline styles.\n if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n options = style;\n style = name;\n name = undefined;\n }\n\n // Cast from RuleFactoryOptions to RuleOptions\n // https://stackoverflow.com/questions/41328728/force-casting-in-flow\n var ruleOptions = options;\n\n ruleOptions.jss = this;\n ruleOptions.Renderer = this.options.Renderer;\n if (!ruleOptions.generateClassName) ruleOptions.generateClassName = this.generateClassName;\n if (!ruleOptions.classes) ruleOptions.classes = {};\n var rule = (0, _createRule3['default'])(name, style, ruleOptions);\n\n if (!ruleOptions.selector && rule instanceof _StyleRule2['default']) {\n rule.selector = '.' + ruleOptions.generateClassName(rule);\n }\n\n this.plugins.onProcessRule(rule);\n\n return rule;\n }\n\n /**\n * Register plugin. Passed function will be invoked with a rule instance.\n */\n\n }, {\n key: 'use',\n value: function use() {\n var _this = this;\n\n for (var _len = arguments.length, plugins = Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n\n plugins.forEach(function (plugin) {\n // Avoids applying same plugin twice, at least based on ref.\n if (_this.options.plugins.indexOf(plugin) === -1) {\n _this.options.plugins.push(plugin);\n _this.plugins.use(plugin);\n }\n });\n\n return this;\n }\n }]);\n\n return Jss;\n}();\n\nexports['default'] = Jss;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar PluginsRegistry = function () {\n function PluginsRegistry() {\n _classCallCheck(this, PluginsRegistry);\n\n this.hooks = {\n onCreateRule: [],\n onProcessRule: [],\n onProcessStyle: [],\n onProcessSheet: [],\n onChangeValue: [],\n onUpdate: []\n\n /**\n * Call ` + ("`" + `onCreateRule`))) + (("`" + (` hooks and return an object if returned by a hook.\n */\n };\n }\n\n _createClass(PluginsRegistry, [{\n key: 'onCreateRule',\n value: function onCreateRule(name, decl, options) {\n for (var i = 0; i < this.hooks.onCreateRule.length; i++) {\n var rule = this.hooks.onCreateRule[i](name, decl, options);\n if (rule) return rule;\n }\n return null;\n }\n\n /**\n * Call ` + "`")) + (`onProcessRule` + ("`" + ` hooks.\n */\n\n }, {\n key: 'onProcessRule',\n value: function onProcessRule(rule) {\n if (rule.isProcessed) return;\n var sheet = rule.options.sheet;\n\n for (var i = 0; i < this.hooks.onProcessRule.length; i++) {\n this.hooks.onProcessRule[i](rule, sheet);\n }\n\n // $FlowFixMe\n if (rule.style) this.onProcessStyle(rule.style, rule, sheet);\n\n rule.isProcessed = true;\n }\n\n /**\n * Call `))))) + (((("`" + (`onProcessStyle` + "`")) + (` hooks.\n */\n\n }, {\n key: 'onProcessStyle',\n value: function onProcessStyle(style, rule, sheet) {\n var nextStyle = style;\n\n for (var i = 0; i < this.hooks.onProcessStyle.length; i++) {\n nextStyle = this.hooks.onProcessStyle[i](nextStyle, rule, sheet);\n // $FlowFixMe\n rule.style = nextStyle;\n }\n }\n\n /**\n * Call ` + ("`" + `onProcessSheet`))) + (("`" + (` hooks.\n */\n\n }, {\n key: 'onProcessSheet',\n value: function onProcessSheet(sheet) {\n for (var i = 0; i < this.hooks.onProcessSheet.length; i++) {\n this.hooks.onProcessSheet[i](sheet);\n }\n }\n\n /**\n * Call ` + "`")) + (`onUpdate` + ("`" + ` hooks.\n */\n\n }, {\n key: 'onUpdate',\n value: function onUpdate(data, rule, sheet) {\n for (var i = 0; i < this.hooks.onUpdate.length; i++) {\n this.hooks.onUpdate[i](data, rule, sheet);\n }\n }\n\n /**\n * Call `)))) + ((("`" + (`onChangeValue` + "`")) + (` hooks.\n */\n\n }, {\n key: 'onChangeValue',\n value: function onChangeValue(value, prop, rule) {\n var processedValue = value;\n for (var i = 0; i < this.hooks.onChangeValue.length; i++) {\n processedValue = this.hooks.onChangeValue[i](processedValue, prop, rule);\n }\n return processedValue;\n }\n\n /**\n * Register a plugin.\n * If function is passed, it is a shortcut for ` + ("`" + `{onProcessRule}`))) + (("`" + (`.\n */\n\n }, {\n key: 'use',\n value: function use(plugin) {\n for (var name in plugin) {\n if (this.hooks[name]) this.hooks[name].push(plugin[name]);else (0, _warning2['default'])(false, '[JSS] Unknown hook \"%s\".', name);\n }\n }\n }]);\n\n return PluginsRegistry;\n}();\n\nexports['default'] = PluginsRegistry;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _createRule = require('./utils/createRule');\n\nvar _createRule2 = _interopRequireDefault(_createRule);\n\nvar _linkRule = require('./utils/linkRule');\n\nvar _linkRule2 = _interopRequireDefault(_linkRule);\n\nvar _StyleRule = require('./rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _escape = require('./utils/escape');\n\nvar _escape2 = _interopRequireDefault(_escape);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Contains rules objects and allows adding/removing etc.\n * Is used for e.g. by ` + "`")) + ((`StyleSheet` + "`") + (` or ` + "`")))))) + (((((`ConditionalRule` + ("`" + `.\n */\nvar RuleList = function () {\n\n // Original styles object.\n function RuleList(options) {\n var _this = this;\n\n _classCallCheck(this, RuleList);\n\n this.map = {};\n this.raw = {};\n this.index = [];\n\n this.update = function (name, data) {\n var _options = _this.options,\n plugins = _options.jss.plugins,\n sheet = _options.sheet;\n\n if (typeof name === 'string') {\n plugins.onUpdate(data, _this.get(name), sheet);\n } else {\n for (var index = 0; index < _this.index.length; index++) {\n plugins.onUpdate(name, _this.index[index], sheet);\n }\n }\n };\n\n this.options = options;\n this.classes = options.classes;\n }\n\n /**\n * Create and register rule.\n *\n * Will not render after Style Sheet was rendered the first time.\n */\n\n\n // Used to ensure correct rules order.\n\n // Rules registry for access by .get() method.\n // It contains the same rule registered by name and by selector.\n\n\n _createClass(RuleList, [{\n key: 'add',\n value: function add(name, decl, options) {\n var _options2 = this.options,\n parent = _options2.parent,\n sheet = _options2.sheet,\n jss = _options2.jss,\n Renderer = _options2.Renderer,\n generateClassName = _options2.generateClassName;\n\n\n options = _extends({\n classes: this.classes,\n parent: parent,\n sheet: sheet,\n jss: jss,\n Renderer: Renderer,\n generateClassName: generateClassName\n }, options);\n\n if (!options.selector && this.classes[name]) {\n options.selector = '.' + (0, _escape2['default'])(this.classes[name]);\n }\n\n this.raw[name] = decl;\n\n var rule = (0, _createRule2['default'])(name, decl, options);\n\n var className = void 0;\n\n if (!options.selector && rule instanceof _StyleRule2['default']) {\n className = generateClassName(rule, sheet);\n rule.selector = '.' + (0, _escape2['default'])(className);\n }\n\n this.register(rule, className);\n\n var index = options.index === undefined ? this.index.length : options.index;\n this.index.splice(index, 0, rule);\n\n return rule;\n }\n\n /**\n * Get a rule.\n */\n\n }, {\n key: 'get',\n value: function get(name) {\n return this.map[name];\n }\n\n /**\n * Delete a rule.\n */\n\n }, {\n key: 'remove',\n value: function remove(rule) {\n this.unregister(rule);\n this.index.splice(this.indexOf(rule), 1);\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.index.indexOf(rule);\n }\n\n /**\n * Run `)) + ("`" + (`onProcessRule()` + "`"))) + ((` plugins on every rule.\n */\n\n }, {\n key: 'process',\n value: function process() {\n var plugins = this.options.jss.plugins;\n // We need to clone array because if we modify the index somewhere else during a loop\n // we end up with very hard-to-track-down side effects.\n\n this.index.slice(0).forEach(plugins.onProcessRule, plugins);\n }\n\n /**\n * Register a rule in ` + ("`" + `.map`)) + ("`" + (` and ` + "`")))) + (((`.classes` + ("`" + ` maps.\n */\n\n }, {\n key: 'register',\n value: function register(rule, className) {\n this.map[rule.key] = rule;\n if (rule instanceof _StyleRule2['default']) {\n this.map[rule.selector] = rule;\n if (className) this.classes[rule.key] = className;\n }\n }\n\n /**\n * Unregister a rule.\n */\n\n }, {\n key: 'unregister',\n value: function unregister(rule) {\n delete this.map[rule.key];\n if (rule instanceof _StyleRule2['default']) {\n delete this.map[rule.selector];\n delete this.classes[rule.key];\n }\n }\n\n /**\n * Update the function values with a new data.\n */\n\n }, {\n key: 'link',\n\n\n /**\n * Link renderable rules with CSSRuleList.\n */\n value: function link(cssRules) {\n var map = this.options.sheet.renderer.getUnescapedKeysMap(this.index);\n\n for (var i = 0; i < cssRules.length; i++) {\n var cssRule = cssRules[i];\n var _key = this.options.sheet.renderer.getKey(cssRule);\n if (map[_key]) _key = map[_key];\n var rule = this.map[_key];\n if (rule) (0, _linkRule2['default'])(rule, cssRule);\n }\n }\n\n /**\n * Convert rules to a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString(options) {\n var str = '';\n var sheet = this.options.sheet;\n\n var link = sheet ? sheet.options.link : false;\n\n for (var index = 0; index < this.index.length; index++) {\n var rule = this.index[index];\n var css = rule.toString(options);\n\n // No need to render an empty rule.\n if (!css && !link) continue;\n\n if (str) str += '\\n';\n str += css;\n }\n\n return str;\n }\n }]);\n\n return RuleList;\n}();\n\nexports['default'] = RuleList;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * SheetsManager is like a WeakMap which is designed to count StyleSheet\n * instances and attach/detach automatically.\n */\nvar SheetsManager = function () {\n function SheetsManager() {\n _classCallCheck(this, SheetsManager);\n\n this.sheets = [];\n this.refs = [];\n this.keys = [];\n }\n\n _createClass(SheetsManager, [{\n key: 'get',\n value: function get(key) {\n var index = this.keys.indexOf(key);\n return this.sheets[index];\n }\n }, {\n key: 'add',\n value: function add(key, sheet) {\n var sheets = this.sheets,\n refs = this.refs,\n keys = this.keys;\n\n var index = sheets.indexOf(sheet);\n\n if (index !== -1) return index;\n\n sheets.push(sheet);\n refs.push(0);\n keys.push(key);\n\n return sheets.length - 1;\n }\n }, {\n key: 'manage',\n value: function manage(key) {\n var index = this.keys.indexOf(key);\n var sheet = this.sheets[index];\n if (this.refs[index] === 0) sheet.attach();\n this.refs[index]++;\n if (!this.keys[index]) this.keys.splice(index, 0, key);\n return sheet;\n }\n }, {\n key: 'unmanage',\n value: function unmanage(key) {\n var index = this.keys.indexOf(key);\n if (index === -1) {\n // eslint-ignore-next-line no-console\n (0, _warning2['default'])(false, \"SheetsManager: can't find sheet to unmanage\");\n return;\n }\n if (this.refs[index] > 0) {\n this.refs[index]--;\n if (this.refs[index] === 0) this.sheets[index].detach();\n }\n }\n }, {\n key: 'size',\n get: function get() {\n return this.keys.length;\n }\n }]);\n\n return SheetsManager;\n}();\n\nexports['default'] = SheetsManager;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Sheets registry to access them all at one place.\n */\nvar SheetsRegistry = function () {\n function SheetsRegistry() {\n _classCallCheck(this, SheetsRegistry);\n\n this.registry = [];\n }\n\n _createClass(SheetsRegistry, [{\n key: 'add',\n\n\n /**\n * Register a Style Sheet.\n */\n value: function add(sheet) {\n var registry = this.registry;\n var index = sheet.options.index;\n\n\n if (registry.indexOf(sheet) !== -1) return;\n\n if (registry.length === 0 || index >= this.index) {\n registry.push(sheet);\n return;\n }\n\n // Find a position.\n for (var i = 0; i < registry.length; i++) {\n if (registry[i].options.index > index) {\n registry.splice(i, 0, sheet);\n return;\n }\n }\n }\n\n /**\n * Reset the registry.\n */\n\n }, {\n key: 'reset',\n value: function reset() {\n this.registry = [];\n }\n\n /**\n * Remove a Style Sheet.\n */\n\n }, {\n key: 'remove',\n value: function remove(sheet) {\n var index = this.registry.indexOf(sheet);\n this.registry.splice(index, 1);\n }\n\n /**\n * Convert all attached sheets to a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString(options) {\n return this.registry.filter(function (sheet) {\n return sheet.attached;\n }).map(function (sheet) {\n return sheet.toString(options);\n }).join('\\n');\n }\n }, {\n key: 'index',\n\n\n /**\n * Current highest index number.\n */\n get: function get() {\n return this.registry.length === 0 ? 0 : this.registry[this.registry.length - 1].options.index;\n }\n }]);\n\n return SheetsRegistry;\n}();\n\nexports['default'] = SheetsRegistry;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _linkRule = require('./utils/linkRule');\n\nvar _linkRule2 = _interopRequireDefault(_linkRule);\n\nvar _RuleList = require('./RuleList');\n\nvar _RuleList2 = _interopRequireDefault(_RuleList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable-next-line no-use-before-define */\nvar StyleSheet = function () {\n function StyleSheet(styles, options) {\n var _this = this;\n\n _classCallCheck(this, StyleSheet);\n\n this.update = function (name, data) {\n if (typeof name === 'string') {\n _this.rules.update(name, data);\n } else {\n _this.rules.update(name);\n }\n return _this;\n };\n\n this.attached = false;\n this.deployed = false;\n this.linked = false;\n this.classes = {};\n this.options = _extends({}, options, {\n sheet: this,\n parent: this,\n classes: this.classes\n });\n this.renderer = new options.Renderer(this);\n this.rules = new _RuleList2['default'](this.options);\n\n for (var _name in styles) {\n this.rules.add(_name, styles[_name]);\n }\n\n this.rules.process();\n }\n\n /**\n * Attach renderable to the render tree.\n */\n\n\n _createClass(StyleSheet, [{\n key: 'attach',\n value: function attach() {\n if (this.attached) return this;\n if (!this.deployed) this.deploy();\n this.renderer.attach();\n if (!this.linked && this.options.link) this.link();\n this.attached = true;\n return this;\n }\n\n /**\n * Remove renderable from render tree.\n */\n\n }, {\n key: 'detach',\n value: function detach() {\n if (!this.attached) return this;\n this.renderer.detach();\n this.attached = false;\n return this;\n }\n\n /**\n * Add a rule to the current stylesheet.\n * Will insert a rule also after the stylesheet has been rendered first time.\n */\n\n }, {\n key: 'addRule',\n value: function addRule(name, decl, options) {\n var queue = this.queue;\n\n // Plugins can create rules.\n // In order to preserve the right order, we need to queue all `)) + ("`" + (`.addRule` + "`"))) + ((` calls,\n // which happen after the first ` + ("`" + `rules.add()`)) + (("`" + ` call.\n\n if (this.attached && !queue) this.queue = [];\n\n var rule = this.rules.add(name, decl, options);\n this.options.jss.plugins.onProcessRule(rule);\n\n if (this.attached) {\n if (!this.deployed) return rule;\n // Don't insert rule directly if there is no stringified version yet.\n // It will be inserted all together when .attach is called.\n if (queue) queue.push(rule);else {\n this.insertRule(rule);\n if (this.queue) {\n this.queue.forEach(this.insertRule, this);\n this.queue = undefined;\n }\n }\n return rule;\n }\n\n // We can't add rules to a detached style node.\n // We will redeploy the sheet once user will attach it.\n this.deployed = false;\n\n return rule;\n }\n\n /**\n * Insert rule into the StyleSheet\n */\n\n }, {\n key: 'insertRule',\n value: function insertRule(rule) {\n var renderable = this.renderer.insertRule(rule);\n if (renderable && this.options.link) (0, _linkRule2['default'])(rule, renderable);\n }\n\n /**\n * Create and add rules.\n * Will render also after Style Sheet was rendered the first time.\n */\n\n }, {\n key: 'addRules',\n value: function addRules(styles, options) {\n var added = [];\n for (var _name2 in styles) {\n added.push(this.addRule(_name2, styles[_name2], options));\n }\n return added;\n }\n\n /**\n * Get a rule by name.\n */\n\n }, {\n key: 'getRule',\n value: function getRule(name) {\n return this.rules.get(name);\n }\n\n /**\n * Delete a rule by name.\n * Returns `) + ("`" + `true`))))) + (((("`" + (`: if rule has been deleted from the DOM.\n */\n\n }, {\n key: 'deleteRule',\n value: function deleteRule(name) {\n var rule = this.rules.get(name);\n\n if (!rule) return false;\n\n this.rules.remove(rule);\n\n if (this.attached && rule.renderable) {\n return this.renderer.deleteRule(rule.renderable);\n }\n\n return true;\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.rules.indexOf(rule);\n }\n\n /**\n * Deploy pure CSS string to a renderable.\n */\n\n }, {\n key: 'deploy',\n value: function deploy() {\n this.renderer.deploy();\n this.deployed = true;\n return this;\n }\n\n /**\n * Link renderable CSS rules from sheet with their corresponding models.\n */\n\n }, {\n key: 'link',\n value: function link() {\n var cssRules = this.renderer.getRules();\n\n // Is undefined when VirtualRenderer is used.\n if (cssRules) this.rules.link(cssRules);\n this.linked = true;\n return this;\n }\n\n /**\n * Update the function values with a new data.\n */\n\n }, {\n key: 'toString',\n\n\n /**\n * Convert rules to a CSS string.\n */\n value: function toString(options) {\n return this.rules.toString(options);\n }\n }]);\n\n return StyleSheet;\n}();\n\nexports['default'] = StyleSheet;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.create = exports.createGenerateClassName = exports.sheets = exports.RuleList = exports.SheetsManager = exports.SheetsRegistry = exports.toCssValue = exports.getDynamicStyles = undefined;\n\nvar _getDynamicStyles = require('./utils/getDynamicStyles');\n\nObject.defineProperty(exports, 'getDynamicStyles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getDynamicStyles)['default'];\n }\n});\n\nvar _toCssValue = require('./utils/toCssValue');\n\nObject.defineProperty(exports, 'toCssValue', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toCssValue)['default'];\n }\n});\n\nvar _SheetsRegistry = require('./SheetsRegistry');\n\nObject.defineProperty(exports, 'SheetsRegistry', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_SheetsRegistry)['default'];\n }\n});\n\nvar _SheetsManager = require('./SheetsManager');\n\nObject.defineProperty(exports, 'SheetsManager', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_SheetsManager)['default'];\n }\n});\n\nvar _RuleList = require('./RuleList');\n\nObject.defineProperty(exports, 'RuleList', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_RuleList)['default'];\n }\n});\n\nvar _sheets = require('./sheets');\n\nObject.defineProperty(exports, 'sheets', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_sheets)['default'];\n }\n});\n\nvar _createGenerateClassName = require('./utils/createGenerateClassName');\n\nObject.defineProperty(exports, 'createGenerateClassName', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_createGenerateClassName)['default'];\n }\n});\n\nvar _Jss = require('./Jss');\n\nvar _Jss2 = _interopRequireDefault(_Jss);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Creates a new instance of Jss.\n */\nvar create = exports.create = function create(options) {\n return new _Jss2['default'](options);\n};\n\n/**\n * A global Jss instance.\n */\nexports['default'] = create();", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _RuleList = require('../RuleList');\n\nvar _RuleList2 = _interopRequireDefault(_RuleList);\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _createRule = require('../utils/createRule');\n\nvar _createRule2 = _interopRequireDefault(_createRule);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// A symbol replacement.\nvar now = Date.now();\n\nvar fnValuesNs = 'fnValues' + now;\nvar fnStyleNs = 'fnStyle' + ++now;\n\nexports['default'] = {\n onCreateRule: function onCreateRule(name, decl, options) {\n if (typeof decl !== 'function') return null;\n var rule = (0, _createRule2['default'])(name, {}, options);\n rule[fnStyleNs] = decl;\n return rule;\n },\n onProcessStyle: function onProcessStyle(style, rule) {\n var fn = {};\n for (var prop in style) {\n var value = style[prop];\n if (typeof value !== 'function') continue;\n delete style[prop];\n fn[prop] = value;\n }\n rule = rule;\n rule[fnValuesNs] = fn;\n return style;\n },\n onUpdate: function onUpdate(data, rule) {\n // It is a rules container like for e.g. ConditionalRule.\n if (rule.rules instanceof _RuleList2['default']) {\n rule.rules.update(data);\n return;\n }\n if (!(rule instanceof _StyleRule2['default'])) return;\n\n rule = rule;\n\n // If we have a fn values map, it is a rule with function values.\n if (rule[fnValuesNs]) {\n for (var prop in rule[fnValuesNs]) {\n rule.prop(prop, rule[fnValuesNs][prop](data));\n }\n }\n\n rule = rule;\n\n var fnStyle = rule[fnStyleNs];\n\n // If we have a style function, the entire rule is dynamic and style object\n // will be returned from that function.\n if (fnStyle) {\n var style = fnStyle(data);\n for (var _prop in style) {\n rule.prop(_prop, style[_prop]);\n }\n }\n }\n};", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _createRule = require('../utils/createRule');\n\nvar _createRule2 = _interopRequireDefault(_createRule);\n\nvar _isObservable = require('../utils/isObservable');\n\nvar _isObservable2 = _interopRequireDefault(_isObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nexports['default'] = {\n onCreateRule: function onCreateRule(name, decl, options) {\n if (!(0, _isObservable2['default'])(decl)) return null;\n\n // Cast ` + "`")) + (`decl` + ("`" + ` to `))) + (("`" + (`Observable` + "`")) + (`, since it passed the type guard.\n var style$ = decl;\n\n var rule = (0, _createRule2['default'])(name, {}, options);\n\n // TODO\n // Call ` + ("`" + `stream.subscribe()`)))) + ((("`" + (` returns a subscription, which should be explicitly\n // unsubscribed from when we know this sheet is no longer needed.\n style$.subscribe(function (style) {\n for (var prop in style) {\n rule.prop(prop, style[prop]);\n }\n });\n\n return rule;\n },\n onProcessRule: function onProcessRule(rule) {\n if (!(rule instanceof _StyleRule2['default'])) return;\n var styleRule = rule;\n var style = styleRule.style;\n\n var _loop = function _loop(prop) {\n var value = style[prop];\n if (!(0, _isObservable2['default'])(value)) return 'continue';\n delete style[prop];\n value.subscribe({\n next: function next(nextValue) {\n styleRule.prop(prop, nextValue);\n }\n });\n };\n\n for (var prop in style) {\n var _ret = _loop(prop);\n\n if (_ret === 'continue') continue;\n }\n }\n};", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _SimpleRule = require('../rules/SimpleRule');\n\nvar _SimpleRule2 = _interopRequireDefault(_SimpleRule);\n\nvar _KeyframesRule = require('../rules/KeyframesRule');\n\nvar _KeyframesRule2 = _interopRequireDefault(_KeyframesRule);\n\nvar _ConditionalRule = require('../rules/ConditionalRule');\n\nvar _ConditionalRule2 = _interopRequireDefault(_ConditionalRule);\n\nvar _FontFaceRule = require('../rules/FontFaceRule');\n\nvar _FontFaceRule2 = _interopRequireDefault(_FontFaceRule);\n\nvar _ViewportRule = require('../rules/ViewportRule');\n\nvar _ViewportRule2 = _interopRequireDefault(_ViewportRule);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar classes = {\n '@charset': _SimpleRule2['default'],\n '@import': _SimpleRule2['default'],\n '@namespace': _SimpleRule2['default'],\n '@keyframes': _KeyframesRule2['default'],\n '@media': _ConditionalRule2['default'],\n '@supports': _ConditionalRule2['default'],\n '@font-face': _FontFaceRule2['default'],\n '@viewport': _ViewportRule2['default'],\n '@-ms-viewport': _ViewportRule2['default']\n\n /**\n * Generate plugins which will register all rules.\n */\n};\nvar plugins = Object.keys(classes).map(function (key) {\n // https://jsperf.com/indexof-vs-substr-vs-regex-at-the-beginning-3\n var re = new RegExp('^' + key);\n var RuleClass = classes[key];\n var onCreateRule = function onCreateRule(name, decl, options) {\n return re.test(name) ? new RuleClass(name, decl, options) : null;\n };\n return { onCreateRule: onCreateRule };\n});\n\nexports['default'] = plugins;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _sheets = require('../sheets');\n\nvar _sheets2 = _interopRequireDefault(_sheets);\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _toCssValue = require('../utils/toCssValue');\n\nvar _toCssValue2 = _interopRequireDefault(_toCssValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Cache the value from the first time a function is called.\n */\nvar memoize = function memoize(fn) {\n var value = void 0;\n return function () {\n if (!value) value = fn();\n return value;\n };\n};\n\n/**\n * Get a style property value.\n */\nfunction getPropertyValue(cssRule, prop) {\n try {\n return cssRule.style.getPropertyValue(prop);\n } catch (err) {\n // IE may throw if property is unknown.\n return '';\n }\n}\n\n/**\n * Set a style property.\n */\nfunction setProperty(cssRule, prop, value) {\n try {\n var cssValue = value;\n\n if (Array.isArray(value)) {\n cssValue = (0, _toCssValue2['default'])(value, true);\n\n if (value[value.length - 1] === '!important') {\n cssRule.style.setProperty(prop, cssValue, 'important');\n return true;\n }\n }\n\n cssRule.style.setProperty(prop, cssValue);\n } catch (err) {\n // IE may throw if property is unknown.\n return false;\n }\n return true;\n}\n\n/**\n * Remove a style property.\n */\nfunction removeProperty(cssRule, prop) {\n try {\n cssRule.style.removeProperty(prop);\n } catch (err) {\n (0, _warning2['default'])(false, '[JSS] DOMException \"%s\" was thrown. Tried to remove property \"%s\".', err.message, prop);\n }\n}\n\nvar CSSRuleTypes = {\n STYLE_RULE: 1,\n KEYFRAMES_RULE: 7\n\n /**\n * Get the CSS Rule key.\n */\n\n};var getKey = function () {\n var extractKey = function extractKey(cssText) {\n var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n return cssText.substr(from, cssText.indexOf('{') - 1);\n };\n\n return function (cssRule) {\n if (cssRule.type === CSSRuleTypes.STYLE_RULE) return cssRule.selectorText;\n if (cssRule.type === CSSRuleTypes.KEYFRAMES_RULE) {\n var name = cssRule.name;\n\n if (name) return '@keyframes ' + name;\n\n // There is no rule.name in the following browsers:\n // - IE 9\n // - Safari 7.1.8\n // - Mobile Safari 9.0.0\n var cssText = cssRule.cssText;\n\n return '@' + extractKey(cssText, cssText.indexOf('keyframes'));\n }\n\n // Conditionals.\n return extractKey(cssRule.cssText);\n };\n}();\n\n/**\n * Set the selector.\n */\nfunction setSelector(cssRule, selectorText) {\n cssRule.selectorText = selectorText;\n\n // Return false if setter was not successful.\n // Currently works in chrome only.\n return cssRule.selectorText === selectorText;\n}\n\n/**\n * Gets the ` + "`")) + (`head` + ("`" + ` element upon the first call and caches it.\n */\nvar getHead = memoize(function () {\n return document.head || document.getElementsByTagName('head')[0];\n});\n\n/**\n * Gets a map of rule keys, where the property is an unescaped key and value\n * is a potentially escaped one.\n * It is used to identify CSS rules and the corresponding JSS rules. As an identifier\n * for CSSStyleRule we normally use `))) + (("`" + (`selectorText` + "`")) + ((`. Though if original selector text\n * contains escaped code points e.g. ` + "`") + (`:not(#\\\\20)` + "`"))))))) + ((((((`, CSSOM will compile it to ` + ("`" + `:not(# )`)) + ("`" + (`\n * and so CSS rule's ` + "`"))) + ((`selectorText` + ("`" + ` won't match JSS rule selector.\n *\n * https://www.w3.org/International/questions/qa-escapes#cssescapes\n */\nvar getUnescapedKeysMap = function () {\n var style = void 0;\n var isAttached = false;\n\n return function (rules) {\n var map = {};\n // https://github.com/facebook/flow/issues/2696\n if (!style) style = document.createElement('style');\n for (var i = 0; i < rules.length; i++) {\n var rule = rules[i];\n if (!(rule instanceof _StyleRule2['default'])) continue;\n var selector = rule.selector;\n // Only unescape selector over CSSOM if it contains a back slash.\n\n if (selector && selector.indexOf('\\\\') !== -1) {\n // Lazilly attach when needed.\n if (!isAttached) {\n getHead().appendChild(style);\n isAttached = true;\n }\n style.textContent = selector + ' {}';\n var _style = style,\n sheet = _style.sheet;\n\n if (sheet) {\n var cssRules = sheet.cssRules;\n\n if (cssRules) map[cssRules[0].selectorText] = rule.key;\n }\n }\n }\n if (isAttached) {\n getHead().removeChild(style);\n isAttached = false;\n }\n return map;\n };\n}();\n\n/**\n * Find attached sheet with an index higher than the passed one.\n */\nfunction findHigherSheet(registry, options) {\n for (var i = 0; i < registry.length; i++) {\n var sheet = registry[i];\n if (sheet.attached && sheet.options.index > options.index && sheet.options.insertionPoint === options.insertionPoint) {\n return sheet;\n }\n }\n return null;\n}\n\n/**\n * Find attached sheet with the highest index.\n */\nfunction findHighestSheet(registry, options) {\n for (var i = registry.length - 1; i >= 0; i--) {\n var sheet = registry[i];\n if (sheet.attached && sheet.options.insertionPoint === options.insertionPoint) {\n return sheet;\n }\n }\n return null;\n}\n\n/**\n * Find a comment with \"jss\" inside.\n */\nfunction findCommentNode(text) {\n var head = getHead();\n for (var i = 0; i < head.childNodes.length; i++) {\n var node = head.childNodes[i];\n if (node.nodeType === 8 && node.nodeValue.trim() === text) {\n return node;\n }\n }\n return null;\n}\n\n/**\n * Find a node before which we can insert the sheet.\n */\nfunction findPrevNode(options) {\n var registry = _sheets2['default'].registry;\n\n\n if (registry.length > 0) {\n // Try to insert before the next higher sheet.\n var sheet = findHigherSheet(registry, options);\n if (sheet) return sheet.renderer.element;\n\n // Otherwise insert after the last attached.\n sheet = findHighestSheet(registry, options);\n if (sheet) return sheet.renderer.element.nextElementSibling;\n }\n\n // Try to find a comment placeholder if registry is empty.\n var insertionPoint = options.insertionPoint;\n\n if (insertionPoint && typeof insertionPoint === 'string') {\n var comment = findCommentNode(insertionPoint);\n if (comment) return comment.nextSibling;\n // If user specifies an insertion point and it can't be found in the document -\n // bad specificity issues may appear.\n (0, _warning2['default'])(insertionPoint === 'jss', '[JSS] Insertion point \"%s\" not found.', insertionPoint);\n }\n\n return null;\n}\n\n/**\n * Insert style element into the DOM.\n */\nfunction insertStyle(style, options) {\n var insertionPoint = options.insertionPoint;\n\n var prevNode = findPrevNode(options);\n\n if (prevNode) {\n var parentNode = prevNode.parentNode;\n\n if (parentNode) parentNode.insertBefore(style, prevNode);\n return;\n }\n\n // Works with iframes and any node types.\n if (insertionPoint && typeof insertionPoint.nodeType === 'number') {\n // https://stackoverflow.com/questions/41328728/force-casting-in-flow\n var insertionPointElement = insertionPoint;\n var _parentNode = insertionPointElement.parentNode;\n\n if (_parentNode) _parentNode.insertBefore(style, insertionPointElement.nextSibling);else (0, _warning2['default'])(false, '[JSS] Insertion point is not in the DOM.');\n return;\n }\n\n getHead().insertBefore(style, prevNode);\n}\n\n/**\n * Read jss nonce setting from the page if the user has set it.\n */\nvar getNonce = memoize(function () {\n var node = document.querySelector('meta[property=\"csp-nonce\"]');\n return node ? node.getAttribute('content') : null;\n});\n\nvar DomRenderer = function () {\n function DomRenderer(sheet) {\n _classCallCheck(this, DomRenderer);\n\n this.getPropertyValue = getPropertyValue;\n this.setProperty = setProperty;\n this.removeProperty = removeProperty;\n this.setSelector = setSelector;\n this.getKey = getKey;\n this.getUnescapedKeysMap = getUnescapedKeysMap;\n this.hasInsertedRules = false;\n\n // There is no sheet when the renderer is used from a standalone StyleRule.\n if (sheet) _sheets2['default'].add(sheet);\n\n this.sheet = sheet;\n\n var _ref = this.sheet ? this.sheet.options : {},\n media = _ref.media,\n meta = _ref.meta,\n element = _ref.element;\n\n this.element = element || document.createElement('style');\n this.element.setAttribute('data-jss', '');\n if (media) this.element.setAttribute('media', media);\n if (meta) this.element.setAttribute('data-meta', meta);\n var nonce = getNonce();\n if (nonce) this.element.setAttribute('nonce', nonce);\n }\n\n /**\n * Insert style element into render tree.\n */\n\n\n // HTMLStyleElement needs fixing https://github.com/facebook/flow/issues/2696\n\n\n _createClass(DomRenderer, [{\n key: 'attach',\n value: function attach() {\n // In the case the element node is external and it is already in the DOM.\n if (this.element.parentNode || !this.sheet) return;\n\n // When rules are inserted using `)) + ("`" + (`insertRule` + "`")))) + (((` API, after ` + ("`" + `sheet.detach().attach()`)) + ("`" + (`\n // browsers remove those rules.\n // TODO figure out if its a bug and if it is known.\n // Workaround is to redeploy the sheet before attaching as a string.\n if (this.hasInsertedRules) {\n this.deploy();\n this.hasInsertedRules = false;\n }\n\n insertStyle(this.element, this.sheet.options);\n }\n\n /**\n * Remove style element from render tree.\n */\n\n }, {\n key: 'detach',\n value: function detach() {\n this.element.parentNode.removeChild(this.element);\n }\n\n /**\n * Inject CSS string into element.\n */\n\n }, {\n key: 'deploy',\n value: function deploy() {\n if (!this.sheet) return;\n this.element.textContent = '\\n' + this.sheet.toString() + '\\n';\n }\n\n /**\n * Insert a rule into element.\n */\n\n }, {\n key: 'insertRule',\n value: function insertRule(rule, index) {\n var sheet = this.element.sheet;\n var cssRules = sheet.cssRules;\n\n var str = rule.toString();\n if (!index) index = cssRules.length;\n\n if (!str) return false;\n\n try {\n sheet.insertRule(str, index);\n } catch (err) {\n (0, _warning2['default'])(false, '[JSS] Can not insert an unsupported rule \\n\\r%s', rule);\n return false;\n }\n this.hasInsertedRules = true;\n\n return cssRules[index];\n }\n\n /**\n * Delete a rule.\n */\n\n }, {\n key: 'deleteRule',\n value: function deleteRule(cssRule) {\n var sheet = this.element.sheet;\n\n var index = this.indexOf(cssRule);\n if (index === -1) return false;\n sheet.deleteRule(index);\n return true;\n }\n\n /**\n * Get index of a CSS Rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(cssRule) {\n var cssRules = this.element.sheet.cssRules;\n\n for (var _index = 0; _index < cssRules.length; _index++) {\n if (cssRule === cssRules[_index]) return _index;\n }\n return -1;\n }\n\n /**\n * Generate a new CSS rule and replace the existing one.\n */\n\n }, {\n key: 'replaceRule',\n value: function replaceRule(cssRule, rule) {\n var index = this.indexOf(cssRule);\n var newCssRule = this.insertRule(rule, index);\n this.element.sheet.deleteRule(index);\n return newCssRule;\n }\n\n /**\n * Get all rules elements.\n */\n\n }, {\n key: 'getRules',\n value: function getRules() {\n return this.element.sheet.cssRules;\n }\n }]);\n\n return DomRenderer;\n}();\n\nexports['default'] = DomRenderer;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable class-methods-use-this */\n\n/**\n * Rendering backend to do nothing in nodejs.\n */\nvar VirtualRenderer = function () {\n function VirtualRenderer() {\n _classCallCheck(this, VirtualRenderer);\n }\n\n _createClass(VirtualRenderer, [{\n key: 'setProperty',\n value: function setProperty() {\n return true;\n }\n }, {\n key: 'getPropertyValue',\n value: function getPropertyValue() {\n return '';\n }\n }, {\n key: 'removeProperty',\n value: function removeProperty() {}\n }, {\n key: 'setSelector',\n value: function setSelector() {\n return true;\n }\n }, {\n key: 'getKey',\n value: function getKey() {\n return '';\n }\n }, {\n key: 'attach',\n value: function attach() {}\n }, {\n key: 'detach',\n value: function detach() {}\n }, {\n key: 'deploy',\n value: function deploy() {}\n }, {\n key: 'insertRule',\n value: function insertRule() {\n return false;\n }\n }, {\n key: 'deleteRule',\n value: function deleteRule() {\n return true;\n }\n }, {\n key: 'replaceRule',\n value: function replaceRule() {\n return false;\n }\n }, {\n key: 'getRules',\n value: function getRules() {}\n }, {\n key: 'indexOf',\n value: function indexOf() {\n return -1;\n }\n }]);\n\n return VirtualRenderer;\n}();\n\nexports['default'] = VirtualRenderer;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _RuleList = require('../RuleList');\n\nvar _RuleList2 = _interopRequireDefault(_RuleList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Conditional rule for @media, @supports\n */\nvar ConditionalRule = function () {\n function ConditionalRule(key, styles, options) {\n _classCallCheck(this, ConditionalRule);\n\n this.type = 'conditional';\n this.isProcessed = false;\n\n this.key = key;\n this.options = options;\n this.rules = new _RuleList2['default'](_extends({}, options, { parent: this }));\n\n for (var name in styles) {\n this.rules.add(name, styles[name]);\n }\n\n this.rules.process();\n }\n\n /**\n * Get a rule.\n */\n\n\n _createClass(ConditionalRule, [{\n key: 'getRule',\n value: function getRule(name) {\n return this.rules.get(name);\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.rules.indexOf(rule);\n }\n\n /**\n * Create and register rule, run plugins.\n */\n\n }, {\n key: 'addRule',\n value: function addRule(name, style, options) {\n var rule = this.rules.add(name, style, options);\n this.options.jss.plugins.onProcessRule(rule);\n return rule;\n }\n\n /**\n * Generates a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { indent: 1 };\n\n var inner = this.rules.toString(options);\n return inner ? this.key + ' {\\n' + inner + '\\n}' : '';\n }\n }]);\n\n return ConditionalRule;\n}();\n\nexports['default'] = ConditionalRule;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _toCss = require('../utils/toCss');\n\nvar _toCss2 = _interopRequireDefault(_toCss);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar FontFaceRule = function () {\n function FontFaceRule(key, style, options) {\n _classCallCheck(this, FontFaceRule);\n\n this.type = 'font-face';\n this.isProcessed = false;\n\n this.key = key;\n this.style = style;\n this.options = options;\n }\n\n /**\n * Generates a CSS string.\n */\n\n\n _createClass(FontFaceRule, [{\n key: 'toString',\n value: function toString(options) {\n if (Array.isArray(this.style)) {\n var str = '';\n for (var index = 0; index < this.style.length; index++) {\n str += (0, _toCss2['default'])(this.key, this.style[index]);\n if (this.style[index + 1]) str += '\\n';\n }\n return str;\n }\n\n return (0, _toCss2['default'])(this.key, this.style, options);\n }\n }]);\n\n return FontFaceRule;\n}();\n\nexports['default'] = FontFaceRule;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _RuleList = require('../RuleList');\n\nvar _RuleList2 = _interopRequireDefault(_RuleList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Rule for @keyframes\n */\nvar KeyframesRule = function () {\n function KeyframesRule(key, frames, options) {\n _classCallCheck(this, KeyframesRule);\n\n this.type = 'keyframes';\n this.isProcessed = false;\n\n this.key = key;\n this.options = options;\n this.rules = new _RuleList2['default'](_extends({}, options, { parent: this }));\n\n for (var name in frames) {\n this.rules.add(name, frames[name], _extends({}, this.options, {\n parent: this,\n selector: name\n }));\n }\n\n this.rules.process();\n }\n\n /**\n * Generates a CSS string.\n */\n\n\n _createClass(KeyframesRule, [{\n key: 'toString',\n value: function toString() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { indent: 1 };\n\n var inner = this.rules.toString(options);\n if (inner) inner += '\\n';\n return this.key + ' {\\n' + inner + '}';\n }\n }]);\n\n return KeyframesRule;\n}();\n\nexports['default'] = KeyframesRule;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar SimpleRule = function () {\n function SimpleRule(key, value, options) {\n _classCallCheck(this, SimpleRule);\n\n this.type = 'simple';\n this.isProcessed = false;\n\n this.key = key;\n this.value = value;\n this.options = options;\n }\n\n /**\n * Generates a CSS string.\n */\n // eslint-disable-next-line no-unused-vars\n\n\n _createClass(SimpleRule, [{\n key: 'toString',\n value: function toString(options) {\n if (Array.isArray(this.value)) {\n var str = '';\n for (var index = 0; index < this.value.length; index++) {\n str += this.key + ' ' + this.value[index] + ';';\n if (this.value[index + 1]) str += '\\n';\n }\n return str;\n }\n\n return this.key + ' ' + this.value + ';';\n }\n }]);\n\n return SimpleRule;\n}();\n\nexports['default'] = SimpleRule;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _toCss = require('../utils/toCss');\n\nvar _toCss2 = _interopRequireDefault(_toCss);\n\nvar _toCssValue = require('../utils/toCssValue');\n\nvar _toCssValue2 = _interopRequireDefault(_toCssValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar StyleRule = function () {\n function StyleRule(key, style, options) {\n _classCallCheck(this, StyleRule);\n\n this.type = 'style';\n this.isProcessed = false;\n var sheet = options.sheet,\n Renderer = options.Renderer,\n selector = options.selector;\n\n this.key = key;\n this.options = options;\n this.style = style;\n if (selector) this.selectorText = selector;\n this.renderer = sheet ? sheet.renderer : new Renderer();\n }\n\n /**\n * Set selector string.\n * Attention: use this with caution. Most browsers didn't implement\n * selectorText setter, so this may result in rerendering of entire Style Sheet.\n */\n\n\n _createClass(StyleRule, [{\n key: 'prop',\n\n\n /**\n * Get or set a style property.\n */\n value: function prop(name, value) {\n // It's a getter.\n if (value === undefined) return this.style[name];\n\n // Don't do anything if the value has not changed.\n if (this.style[name] === value) return this;\n\n value = this.options.jss.plugins.onChangeValue(value, name, this);\n\n var isEmpty = value == null || value === false;\n var isDefined = name in this.style;\n\n // Value is empty and wasn't defined before.\n if (isEmpty && !isDefined) return this;\n\n // We are going to remove this value.\n var remove = isEmpty && isDefined;\n\n if (remove) delete this.style[name];else this.style[name] = value;\n\n // Renderable is defined if StyleSheet option ` + "`"))) + ((`link` + ("`" + ` is true.\n if (this.renderable) {\n if (remove) this.renderer.removeProperty(this.renderable, name);else this.renderer.setProperty(this.renderable, name, value);\n return this;\n }\n\n var sheet = this.options.sheet;\n\n if (sheet && sheet.attached) {\n (0, _warning2['default'])(false, 'Rule is not linked. Missing sheet option \"link: true\".');\n }\n return this;\n }\n\n /**\n * Apply rule to an element inline.\n */\n\n }, {\n key: 'applyTo',\n value: function applyTo(renderable) {\n var json = this.toJSON();\n for (var prop in json) {\n this.renderer.setProperty(renderable, prop, json[prop]);\n }return this;\n }\n\n /**\n * Returns JSON representation of the rule.\n * Fallbacks are not supported.\n * Useful for inline styles.\n */\n\n }, {\n key: 'toJSON',\n value: function toJSON() {\n var json = {};\n for (var prop in this.style) {\n var value = this.style[prop];\n if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object') json[prop] = value;else if (Array.isArray(value)) json[prop] = (0, _toCssValue2['default'])(value);\n }\n return json;\n }\n\n /**\n * Generates a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString(options) {\n var sheet = this.options.sheet;\n\n var link = sheet ? sheet.options.link : false;\n var opts = link ? _extends({}, options, { allowEmpty: true }) : options;\n return (0, _toCss2['default'])(this.selector, this.style, opts);\n }\n }, {\n key: 'selector',\n set: function set(selector) {\n if (selector === this.selectorText) return;\n\n this.selectorText = selector;\n\n if (!this.renderable) return;\n\n var hasChanged = this.renderer.setSelector(this.renderable, selector);\n\n // If selector setter is not implemented, rerender the rule.\n if (!hasChanged && this.renderable) {\n var renderable = this.renderer.replaceRule(this.renderable, this);\n if (renderable) this.renderable = renderable;\n }\n }\n\n /**\n * Get selector string.\n */\n ,\n get: function get() {\n return this.selectorText;\n }\n }]);\n\n return StyleRule;\n}();\n\nexports['default'] = StyleRule;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _toCss = require('../utils/toCss');\n\nvar _toCss2 = _interopRequireDefault(_toCss);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ViewportRule = function () {\n function ViewportRule(key, style, options) {\n _classCallCheck(this, ViewportRule);\n\n this.type = 'viewport';\n this.isProcessed = false;\n\n this.key = key;\n this.style = style;\n this.options = options;\n }\n\n /**\n * Generates a CSS string.\n */\n\n\n _createClass(ViewportRule, [{\n key: 'toString',\n value: function toString(options) {\n return (0, _toCss2['default'])(this.key, this.style, options);\n }\n }]);\n\n return ViewportRule;\n}();\n\nexports['default'] = ViewportRule;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _SheetsRegistry = require('./SheetsRegistry');\n\nvar _SheetsRegistry2 = _interopRequireDefault(_SheetsRegistry);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * This is a global sheets registry. Only DomRenderer will add sheets to it.\n * On the server one should use an own SheetsRegistry instance and add the\n * sheets to it, because you need to make sure to create a new registry for\n * each request in order to not leak sheets across requests.\n */\nexports['default'] = new _SheetsRegistry2['default']();", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports['default'] = cloneStyle;\n\nvar _isObservable = require('./isObservable');\n\nvar _isObservable2 = _interopRequireDefault(_isObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar isArray = Array.isArray;\nfunction cloneStyle(style) {\n // Support empty values in case user ends up with them by accident.\n if (style == null) return style;\n\n // Support string value for SimpleRule.\n var typeOfStyle = typeof style === 'undefined' ? 'undefined' : _typeof(style);\n\n if (typeOfStyle === 'string' || typeOfStyle === 'number' || typeOfStyle === 'function') {\n return style;\n }\n\n // Support array for FontFaceRule.\n if (isArray(style)) return style.map(cloneStyle);\n\n // Support Observable styles. Observables are immutable, so we don't need to\n // copy them.\n if ((0, _isObservable2['default'])(style)) return style;\n\n var newStyle = {};\n for (var name in style) {\n var value = style[name];\n if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n newStyle[name] = cloneStyle(value);\n continue;\n }\n newStyle[name] = value;\n }\n\n return newStyle;\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _StyleSheet = require('../StyleSheet');\n\nvar _StyleSheet2 = _interopRequireDefault(_StyleSheet);\n\nvar _moduleId = require('./moduleId');\n\nvar _moduleId2 = _interopRequireDefault(_moduleId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar maxRules = 1e10;\n\n\nvar env = process.env.NODE_ENV;\n\n/**\n * Returns a function which generates unique class names based on counters.\n * When new generator function is created, rule counter is reseted.\n * We need to reset the rule counter for SSR for each request.\n */\n\nexports['default'] = function () {\n var ruleCounter = 0;\n var defaultPrefix = env === 'production' ? 'c' : '';\n\n return function (rule, sheet) {\n ruleCounter += 1;\n\n if (ruleCounter > maxRules) {\n (0, _warning2['default'])(false, '[JSS] You might have a memory leak. Rule counter is at %s.', ruleCounter);\n }\n\n var prefix = defaultPrefix;\n var jssId = '';\n\n if (sheet) {\n prefix = sheet.options.classNamePrefix || defaultPrefix;\n if (sheet.options.jss.id != null) jssId += sheet.options.jss.id;\n }\n\n if (env === 'production') {\n return '' + prefix + _moduleId2['default'] + jssId + ruleCounter;\n }\n\n return prefix + rule.key + '-' + _moduleId2['default'] + (jssId && '-' + jssId) + '-' + ruleCounter;\n };\n};", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = createRule;\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _cloneStyle = require('../utils/cloneStyle');\n\nvar _cloneStyle2 = _interopRequireDefault(_cloneStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Create a rule instance.\n */\nfunction createRule() {\n var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'unnamed';\n var decl = arguments[1];\n var options = arguments[2];\n var jss = options.jss;\n\n var declCopy = (0, _cloneStyle2['default'])(decl);\n\n var rule = jss.plugins.onCreateRule(name, declCopy, options);\n if (rule) return rule;\n\n // It is an at-rule and it has no instance.\n if (name[0] === '@') {\n (0, _warning2['default'])(false, '[JSS] Unknown at-rule %s', name);\n }\n\n return new _StyleRule2['default'](name, declCopy, options);\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar CSS = global.CSS;\n\nvar env = process.env.NODE_ENV;\n\nvar escapeRegex = /([[\\].#*$><+~=|^:(),\"'`)) + ("`" + (`])/g;\n\nexports['default'] = function (str) {\n // We don't need to escape it in production, because we are not using user's\n // input for selectors, we are generating a valid selector.\n if (env === 'production') return str;\n\n if (!CSS || !CSS.escape) {\n return str.replace(escapeRegex, '\\\\$1');\n }\n\n return CSS.escape(str);\n};", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports['default'] = getDynamicStyles;\n/**\n * Extracts a styles object with only props that contain function values.\n */\nfunction getDynamicStyles(styles) {\n var to = null;\n\n for (var key in styles) {\n var value = styles[key];\n var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n\n if (type === 'function') {\n if (!to) to = {};\n to[key] = value;\n } else if (type === 'object' && value !== null && !Array.isArray(value)) {\n var extracted = getDynamicStyles(value);\n if (extracted) {\n if (!to) to = {};\n to[key] = extracted;\n }\n }\n }\n\n return to;\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _symbolObservable = require('symbol-observable');\n\nvar _symbolObservable2 = _interopRequireDefault(_symbolObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nexports['default'] = function (value) {\n return value && value[_symbolObservable2['default']] && value === value[_symbolObservable2['default']]();\n};", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = linkRule;\n/**\n * Link rule with CSSStyleRule and nested rules with corresponding nested cssRules if both exists.\n */\nfunction linkRule(rule, cssRule) {\n rule.renderable = cssRule;\n if (rule.rules && cssRule.cssRules) rule.rules.link(cssRule.cssRules);\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar ns = '2f1acc6c3a606b082e5eef5e54414ffb';\nif (global[ns] == null) global[ns] = 0;\n\n// Bundle may contain multiple JSS versions at the same time. In order to identify\n// the current version with just one short number and use it for classes generation\n// we use a counter. Also it is more accurate, because user can manually reevaluate\n// the module.\nexports['default'] = global[ns]++;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = toCss;\n\nvar _toCssValue = require('./toCssValue');\n\nvar _toCssValue2 = _interopRequireDefault(_toCssValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Indent a string.\n * http://jsperf.com/array-join-vs-for\n */\nfunction indentStr(str, indent) {\n var result = '';\n for (var index = 0; index < indent; index++) {\n result += ' ';\n }return result + str;\n}\n\n/**\n * Converts a Rule to CSS string.\n */\n\nfunction toCss(selector, style) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var result = '';\n\n if (!style) return result;\n\n var _options$indent = options.indent,\n indent = _options$indent === undefined ? 0 : _options$indent;\n var fallbacks = style.fallbacks;\n\n\n indent++;\n\n // Apply fallbacks first.\n if (fallbacks) {\n // Array syntax {fallbacks: [{prop: value}]}\n if (Array.isArray(fallbacks)) {\n for (var index = 0; index < fallbacks.length; index++) {\n var fallback = fallbacks[index];\n for (var prop in fallback) {\n var value = fallback[prop];\n if (value != null) {\n result += '\\n' + indentStr(prop + ': ' + (0, _toCssValue2['default'])(value) + ';', indent);\n }\n }\n }\n } else {\n // Object syntax {fallbacks: {prop: value}}\n for (var _prop in fallbacks) {\n var _value = fallbacks[_prop];\n if (_value != null) {\n result += '\\n' + indentStr(_prop + ': ' + (0, _toCssValue2['default'])(_value) + ';', indent);\n }\n }\n }\n }\n\n for (var _prop2 in style) {\n var _value2 = style[_prop2];\n if (_value2 != null && _prop2 !== 'fallbacks') {\n result += '\\n' + indentStr(_prop2 + ': ' + (0, _toCssValue2['default'])(_value2) + ';', indent);\n }\n }\n\n // Allow empty style in this case, because properties will be added dynamically.\n if (!result && !options.allowEmpty) return result;\n\n indent--;\n result = indentStr(selector + ' {' + result + '\\n', indent) + indentStr('}', indent);\n\n return result;\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = toCssValue;\nvar join = function join(value, by) {\n var result = '';\n for (var i = 0; i < value.length; i++) {\n // Remove !important from the value, it will be readded later.\n if (value[i] === '!important') break;\n if (result) result += by;\n result += value[i];\n }\n return result;\n};\n\n/**\n * Converts array values to string.\n *\n * ` + "`"))))) + ((((`margin: [['5px', '10px']]` + ("`" + ` > `)) + ("`" + (`margin: 5px 10px;` + "`"))) + ((`\n * ` + ("`" + `border: ['1px', '2px']`)) + ("`" + (` > ` + "`")))) + (((`border: 1px, 2px;` + ("`" + `\n * `)) + ("`" + (`margin: [['5px', '10px'], '!important']` + "`"))) + ((` > ` + ("`" + `margin: 5px 10px !important;`)) + (("`" + `\n * `) + ("`" + `color: ['red', !important]`)))))) + ((((("`" + (` > ` + "`")) + (`color: red !important;` + ("`" + `\n */\nfunction toCssValue(value) {\n var ignoreImportant = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!Array.isArray(value)) return value;\n\n var cssValue = '';\n\n // Support space separated values via `))) + (("`" + (`[['5px', '10px']]` + "`")) + (`.\n if (Array.isArray(value[0])) {\n for (var i = 0; i < value.length; i++) {\n if (value[i] === '!important') break;\n if (cssValue) cssValue += ', ';\n cssValue += join(value[i], ' ');\n }\n } else cssValue = join(value, ', ');\n\n // Add !important, because it was ignored.\n if (!ignoreImportant && value[value.length - 1] === '!important') {\n cssValue += ' !important';\n }\n\n return cssValue;\n}", + "/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '` + ("`" + `warning(condition, format, ...args)`)))) + ((("`" + (` requires a warning ' +\n 'message argument'\n );\n }\n\n if (format.length < 10 || (/^[s\\W]*$/).test(format)) {\n throw new Error(\n 'The warning format should be able to uniquely identify this ' +\n 'warning. Please, use a more descriptive format than: ' + format\n );\n }\n\n if (!condition) {\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch(x) {}\n }\n };\n}\n\nmodule.exports = warning;\n", + "/**\n * lodash (Custom Build) \n * Build: ` + "`")) + (`lodash modularize exports=\"npm\" -o ./` + ("`" + `\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `))) + (("`" + (`TypeError` + "`")) + ((` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various ` + "`") + (`Number` + "`"))))) + ((((` constants. */\nvar NAN = 0 / 0;\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on ` + "`"))) + ((`root` + ("`" + `. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `)) + ("`" + (`global` + "`")))) + (((` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable ` + ("`" + `self`)) + ("`" + (`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [` + "`"))) + ((`toStringTag` + ("`" + `](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `)) + (("`" + `lodash`) + ("`" + ` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `)))))))) + ((((((("`" + (`func` + "`")) + (` until after ` + ("`" + `wait`))) + (("`" + (`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a ` + "`")) + (`cancel` + ("`" + ` method to cancel\n * delayed `)))) + ((("`" + (`func` + "`")) + (` invocations and a ` + ("`" + `flush`))) + (("`" + (` method to immediately invoke them.\n * Provide ` + "`")) + (`options` + ("`" + ` to indicate whether `))))) + (((("`" + (`func` + "`")) + (` should be invoked on the\n * leading and/or trailing edge of the ` + ("`" + `wait`))) + (("`" + (` timeout. The ` + "`")) + (`func` + ("`" + ` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `)))) + ((("`" + (`func` + "`")) + (`\n * invocation.\n *\n * **Note:** If ` + ("`" + `leading`))) + (("`" + (` and ` + "`")) + ((`trailing` + "`") + (` options are ` + "`")))))) + (((((`true` + ("`" + `, `)) + ("`" + (`func` + "`"))) + ((` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the ` + ("`" + `wait`)) + ("`" + (` timeout.\n *\n * If ` + "`")))) + (((`wait` + ("`" + ` is `)) + ("`" + (`0` + "`"))) + ((` and ` + ("`" + `leading`)) + (("`" + ` is `) + ("`" + `false`))))) + (((("`" + (`, ` + "`")) + (`func` + ("`" + ` invocation is deferred\n * until to the next tick, similar to `))) + (("`" + (`setTimeout` + "`")) + (` with a timeout of ` + ("`" + `0`)))) + ((("`" + (`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`")) + (`_.debounce` + ("`" + ` and `))) + (("`" + (`_.throttle` + "`")) + ((`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time ` + "`") + (`func` + "`"))))))) + ((((((` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke ` + ("`" + `sendMail`)) + ("`" + (` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure ` + "`"))) + ((`batchLog` + ("`" + ` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `)) + ("`" + (`maxWait` + "`")))) + (((` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the ` + ("`" + `maxWait`)) + ("`" + (` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have ` + "`"))) + ((`lastArgs` + ("`" + ` which means `)) + (("`" + `func`) + ("`" + ` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `))))) + (((("`" + (`value` + "`")) + (` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of ` + ("`" + `Object`))) + (("`" + (`. (e.g. arrays, functions, objects, regexes, ` + "`")) + (`new Number(0)` + ("`" + `, and `)))) + ((("`" + (`new String('')` + "`")) + (`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + ((`value` + "`") + (` is an object, else ` + "`")))))) + (((((`false` + ("`" + `.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `)) + ("`" + (`value` + "`"))) + ((` is object-like. A value is object-like if it's not ` + ("`" + `null`)) + ("`" + (`\n * and has a ` + "`")))) + (((`typeof` + ("`" + ` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + (("`" + ` is object-like, else `) + ("`" + `false`))))) + (((("`" + (`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is classified as a `))) + (("`" + (`Symbol` + "`")) + (` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)))) + ((("`" + (` if ` + "`")) + (`value` + ("`" + ` is a symbol, else `))) + (("`" + (`false` + "`")) + ((`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts ` + "`") + (`value` + "`")))))))))) + (((((((((` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n", + "/**\n * lodash (Custom Build) \n * Build: ` + ("`" + `lodash modularize exports=\"npm\" -o ./`)) + ("`" + (`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the ` + "`"))) + ((`TypeError` + ("`" + ` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `)) + ("`" + (`Number` + "`")))) + (((` constants. */\nvar NAN = 0 / 0;\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on ` + "`"))) + ((`root` + ("`" + `. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `)) + ("`" + (`global` + "`"))))) + ((((` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable ` + ("`" + `self`)) + ("`" + (`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [` + "`"))) + ((`toStringTag` + ("`" + `](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `)) + ("`" + (`lodash` + "`")))) + (((` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking ` + ("`" + `func`)) + ("`" + (` until after ` + "`"))) + ((`wait` + ("`" + `\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `)) + (("`" + `cancel`) + ("`" + ` method to cancel\n * delayed `)))))) + ((((("`" + (`func` + "`")) + (` invocations and a ` + ("`" + `flush`))) + (("`" + (` method to immediately invoke them.\n * Provide ` + "`")) + (`options` + ("`" + ` to indicate whether `)))) + ((("`" + (`func` + "`")) + (` should be invoked on the\n * leading and/or trailing edge of the ` + ("`" + `wait`))) + (("`" + (` timeout. The ` + "`")) + ((`func` + "`") + (` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last ` + "`"))))) + ((((`func` + ("`" + `\n * invocation.\n *\n * **Note:** If `)) + ("`" + (`leading` + "`"))) + ((` and ` + ("`" + `trailing`)) + ("`" + (` options are ` + "`")))) + (((`true` + ("`" + `, `)) + ("`" + (`func` + "`"))) + ((` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the ` + ("`" + `wait`)) + (("`" + ` timeout.\n *\n * If `) + ("`" + `wait`))))))) + (((((("`" + (` is ` + "`")) + (`0` + ("`" + ` and `))) + (("`" + (`leading` + "`")) + (` is ` + ("`" + `false`)))) + ((("`" + (`, ` + "`")) + (`func` + ("`" + ` invocation is deferred\n * until to the next tick, similar to `))) + (("`" + (`setTimeout` + "`")) + (` with a timeout of ` + ("`" + `0`))))) + (((("`" + (`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`")) + (`_.debounce` + ("`" + ` and `))) + (("`" + (`_.throttle` + "`")) + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time ` + ("`" + `func`)))) + ((("`" + (` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke ` + "`")) + (`sendMail` + ("`" + ` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `))) + (("`" + (`batchLog` + "`")) + ((` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any ` + "`") + (`maxWait` + "`")))))) + (((((` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the ` + ("`" + `maxWait`)) + ("`" + (` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have ` + "`"))) + ((`lastArgs` + ("`" + ` which means `)) + ("`" + (`func` + "`")))) + (((` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes ` + ("`" + `func`)) + ("`" + (` at most once per\n * every ` + "`"))) + ((`wait` + ("`" + ` milliseconds. The throttled function comes with a `)) + (("`" + `cancel`) + ("`" + `\n * method to cancel delayed `))))) + (((("`" + (`func` + "`")) + (` invocations and a ` + ("`" + `flush`))) + (("`" + (` method to\n * immediately invoke them. Provide ` + "`")) + (`options` + ("`" + ` to indicate whether `)))) + ((("`" + (`func` + "`")) + (`\n * should be invoked on the leading and/or trailing edge of the ` + ("`" + `wait`))) + (("`" + (`\n * timeout. The ` + "`")) + ((`func` + "`") + (` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last ` + "`")))))))) + (((((((`func` + ("`" + ` invocation.\n *\n * **Note:** If `)) + ("`" + (`leading` + "`"))) + ((` and ` + ("`" + `trailing`)) + ("`" + (` options are ` + "`")))) + (((`true` + ("`" + `, `)) + ("`" + (`func` + "`"))) + ((` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the ` + ("`" + `wait`)) + ("`" + (` timeout.\n *\n * If ` + "`"))))) + ((((`wait` + ("`" + ` is `)) + ("`" + (`0` + "`"))) + ((` and ` + ("`" + `leading`)) + ("`" + (` is ` + "`")))) + (((`false` + ("`" + `, `)) + ("`" + (`func` + "`"))) + ((` invocation is deferred\n * until to the next tick, similar to ` + ("`" + `setTimeout`)) + (("`" + ` with a timeout of `) + ("`" + `0`)))))) + ((((("`" + (`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`")) + (`_.throttle` + ("`" + ` and `))) + (("`" + (`_.debounce` + "`")) + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke ` + ("`" + `renewToken`)))) + ((("`" + (` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `))) + (("`" + (`Object` + "`")) + ((`. (e.g. arrays, functions, objects, regexes, ` + "`") + (`new Number(0)` + "`"))))) + ((((`, and ` + ("`" + `new String('')`)) + ("`" + (`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + ("`" + (`value` + "`")))) + (((` is an object, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is object-like. A value is object-like if it's not `)) + (("`" + `null`) + ("`" + `\n * and has a `))))))) + (((((("`" + (`typeof` + "`")) + (` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is object-like, else `)))) + ((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is classified as a ` + "`")) + ((`Symbol` + "`") + (` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))))) + ((((`true` + ("`" + ` if `)) + ("`" + (`value` + "`"))) + ((` is a symbol, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts ` + "`")))) + (((`value` + ("`" + ` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n", + "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n", + "var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `)) + ("`" + (`Hash` + "`"))) + ((`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n", + "var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to ` + ("`" + `ListCache`)) + (("`" + `.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n", + "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n", + "var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `) + ("`" + `MapCache`)))))) + ((((("`" + (`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n", + "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n", + "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n", + "var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to ` + "`")) + (`SetCache` + ("`" + `.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n", + "var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `))) + (("`" + (`Stack` + "`")) + (`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n", + "var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n", + "var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n", + "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n", + "/**\n * A faster alternative to ` + ("`" + `Function#apply`)))) + ((("`" + (`, this function invokes ` + "`")) + (`func` + ("`" + `\n * with the `))) + (("`" + (`this` + "`")) + ((` binding of ` + "`") + (`thisArg` + "`"))))) + ((((` and the arguments of ` + ("`" + `args`)) + ("`" + (`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The ` + "`"))) + ((`this` + ("`" + ` binding of `)) + ("`" + (`func` + "`")))) + (((`.\n * @param {Array} args The arguments to invoke ` + ("`" + `func`)) + ("`" + (` with.\n * @returns {*} Returns the result of ` + "`"))) + ((`func` + ("`" + `.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n", + "/**\n * A specialized version of `)) + (("`" + `_.every`) + ("`" + ` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `))))))))) + (((((((("`" + (`true` + "`")) + (` if all elements pass the predicate check,\n * else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = arrayEvery;\n", + "/**\n * A specialized version of ` + "`")) + (`_.filter` + ("`" + ` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n", + "var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `)))) + ((("`" + (`_.includes` + "`")) + (` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`target` + ("`" + ` is found, else `))))) + (((("`" + (`false` + "`")) + (`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n", + "/**\n * This function is like ` + ("`" + `arrayIncludes`))) + (("`" + (` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `)))) + ((("`" + (`target` + "`")) + (` is found, else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n", + "var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like ` + "`")) + ((`value` + "`") + (`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable ` + "`")))))) + (((((`arguments.length` + ("`" + ` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n", + "/**\n * A specialized version of `)) + ("`" + (`_.map` + "`"))) + ((` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n", + "/**\n * Appends the elements of ` + ("`" + `values`)) + ("`" + (` to ` + "`")))) + (((`array` + ("`" + `.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `)) + ("`" + (`array` + "`"))) + ((`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n", + "/**\n * A specialized version of ` + ("`" + `_.some`)) + (("`" + ` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `) + ("`" + `true`))))) + (((("`" + (` if any element passes the predicate check,\n * else ` + "`")) + (`false` + ("`" + `.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n", + "var eq = require('./eq');\n\n/**\n * Gets the index at which the `))) + (("`" + (`key` + "`")) + (` is found in ` + ("`" + `array`)))) + ((("`" + (` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else ` + "`")) + (`-1` + ("`" + `.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n", + "var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `))) + (("`" + (`assignValue` + "`")) + ((` and ` + "`") + (`assignMergeValue` + "`"))))))) + ((((((` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n", + "var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of ` + ("`" + `_.forEach`)) + ("`" + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns ` + "`"))) + ((`collection` + ("`" + `.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n", + "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `)) + ("`" + (`_.every` + "`")))) + (((` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if all elements pass the predicate check,\n * else ` + "`"))) + ((`false` + ("`" + `\n */\nfunction baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n}\n\nmodule.exports = baseEvery;\n", + "var isSymbol = require('./isSymbol');\n\n/**\n * The base implementation of methods like `)) + ("`" + (`_.max` + "`"))))) + ((((` and ` + ("`" + `_.min`)) + ("`" + (` which accepts a\n * ` + "`"))) + ((`comparator` + ("`" + ` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseExtremum;\n", + "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `)) + ("`" + (`_.filter` + "`")))) + (((` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n}\n\nmodule.exports = baseFilter;\n", + "/**\n * The base implementation of ` + ("`" + `_.findIndex`)) + ("`" + (` and ` + "`"))) + ((`_.findLastIndex` + ("`" + ` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `)) + (("`" + `-1`) + ("`" + `.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n", + "var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `)))))) + ((((("`" + (`_.flatten` + "`")) + (` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass ` + ("`" + `predicate`))) + (("`" + (` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n", + "var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of ` + "`")) + (`baseForOwn` + ("`" + ` which iterates over `)))) + ((("`" + (`object` + "`")) + (`\n * properties returned by ` + ("`" + `keysFunc`))) + (("`" + (` and invokes ` + "`")) + ((`iteratee` + "`") + (` for each property.\n * Iteratee functions may exit iteration early by explicitly returning ` + "`"))))) + ((((`false` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `)) + ("`" + (`object` + "`"))) + ((`.\n * @returns {Object} Returns ` + ("`" + `object`)) + ("`" + (`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n", + "var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of ` + "`")))) + (((`_.forOwn` + ("`" + ` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `)) + ("`" + (`object` + "`"))) + ((`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n", + "var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of ` + ("`" + `_.get`)) + (("`" + ` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n", + "var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `) + ("`" + `getAllKeys`)))))))) + ((((((("`" + (` and ` + "`")) + (`getAllKeysIn` + ("`" + ` which uses\n * `))) + (("`" + (`keysFunc` + "`")) + (` and ` + ("`" + `symbolsFunc`)))) + ((("`" + (` to get the enumerable property names and\n * symbols of ` + "`")) + (`object` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `))) + (("`" + (`object` + "`")) + (`.\n * @param {Function} symbolsFunc The function to get the symbols of ` + ("`" + `object`))))) + (((("`" + (`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n", + "var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** ` + "`")) + (`Object#toString` + ("`" + ` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `))) + (("`" + (`getTag` + "`")) + (` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the ` + ("`" + `toStringTag`)))) + ((("`" + (`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n", + "/**\n * The base implementation of ` + "`")) + (`_.gt` + ("`" + ` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `))) + (("`" + (`true` + "`")) + ((` if ` + "`") + (`value` + "`")))))) + (((((` is greater than ` + ("`" + `other`)) + ("`" + (`,\n * else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nmodule.exports = baseGt;\n", + "/**\n * The base implementation of `)) + ("`" + (`_.hasIn` + "`")))) + (((` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`"))) + ((`key` + ("`" + ` exists, else `)) + (("`" + `false`) + ("`" + `.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n", + "var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `))))) + (((("`" + (`_.indexOf` + "`")) + (` without ` + ("`" + `fromIndex`))) + (("`" + (` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else ` + "`")) + (`-1` + ("`" + `.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n", + "var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n arrayMap = require('./_arrayMap'),\n baseUnary = require('./_baseUnary'),\n cacheHas = require('./_cacheHas');\n\n/* Built-in method references for those with the same name as other `)))) + ((("`" + (`lodash` + "`")) + (` methods. */\nvar nativeMin = Math.min;\n\n/**\n * The base implementation of methods like ` + ("`" + `_.intersection`))) + (("`" + (`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\nfunction baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseIntersection;\n", + "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + "`")) + ((`Object#toString` + "`") + (` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of ` + "`"))))))) + ((((((`_.isArguments` + ("`" + `.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + ("`" + (` is an ` + "`")))) + (((`arguments` + ("`" + ` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n", + "var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `)) + ("`" + (`_.isEqual` + "`"))) + ((` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed ` + ("`" + `value`)) + (("`" + ` and `) + ("`" + `other`))))) + (((("`" + (` objects.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if the values are equivalent, else `))) + (("`" + (`false` + "`")) + (`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n", + "var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** ` + ("`" + `Object#toString`)))) + ((("`" + (` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of ` + "`")) + (`baseIsEqual` + ("`" + ` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `))) + (("`" + (`baseIsEqual` + "`")) + ((` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed ` + "`") + (`object` + "`")))))) + (((((` and ` + ("`" + `other`)) + ("`" + (` objects.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if the objects are equivalent, else `)) + ("`" + (`false` + "`")))) + (((`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n", + "var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of ` + ("`" + `_.isMatch`)) + ("`" + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + (("`" + `object`) + ("`" + ` is a match, else `))))) + (((("`" + (`false` + "`")) + (`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n", + "/**\n * The base implementation of ` + ("`" + `_.isNaN`))) + (("`" + (` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `)))) + ((("`" + (`value` + "`")) + (` is ` + ("`" + `NaN`))) + (("`" + (`, else ` + "`")) + ((`false` + "`") + (`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n", + "var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match ` + "`")))))))))))) + (((((((((((`RegExp` + ("`" + `\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `)) + ("`" + (`_.isNative` + "`"))) + ((` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`")))) + (((`value` + ("`" + ` is a native function,\n * else `)) + ("`" + (`false` + "`"))) + ((`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n", + "var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify ` + "`"))))) + ((((`toStringTag` + ("`" + ` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `)) + ("`" + (`_.isTypedArray` + "`"))) + ((` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`")))) + (((`value` + ("`" + ` is a typed array, else `)) + ("`" + (`false` + "`"))) + ((`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n", + "var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of ` + ("`" + `_.iteratee`)) + (("`" + `.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `) + ("`" + `typeof`)))))) + ((((("`" + (` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n", + "var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of ` + "`")) + (`_.keys` + ("`" + ` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n", + "/**\n * The base implementation of `))) + (("`" + (`_.lt` + "`")) + (` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns ` + ("`" + `true`)))) + ((("`" + (` if ` + "`")) + (`value` + ("`" + ` is less than `))) + (("`" + (`other` + "`")) + ((`,\n * else ` + "`") + (`false` + "`"))))) + ((((`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nmodule.exports = baseLt;\n", + "var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of ` + ("`" + `_.map`)) + ("`" + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n", + "var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of ` + "`"))) + ((`_.matches` + ("`" + ` which doesn't clone `)) + ("`" + (`source` + "`")))) + (((`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n", + "var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of ` + ("`" + `_.matchesProperty`)) + ("`" + (` which doesn't clone ` + "`"))) + ((`srcValue` + ("`" + `.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n", + "var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n baseSortBy = require('./_baseSortBy'),\n baseUnary = require('./_baseUnary'),\n compareMultiple = require('./_compareMultiple'),\n identity = require('./identity');\n\n/**\n * The base implementation of `)) + (("`" + `_.orderBy`) + ("`" + ` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `))))))) + (((((("`" + (`iteratees` + "`")) + (`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n", + "/**\n * The base implementation of ` + ("`" + `_.property`))) + (("`" + (` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n", + "var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of ` + "`")) + (`baseProperty` + ("`" + ` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n", + "/* Built-in method references for those with the same name as other `)))) + ((("`" + (`lodash` + "`")) + (` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * The base implementation of ` + ("`" + `_.range`))) + (("`" + (` and ` + "`")) + (`_.rangeRight` + ("`" + ` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n}\n\nmodule.exports = baseRange;\n", + "var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `))))) + (((("`" + (`_.rest` + "`")) + (` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n", + "var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of ` + ("`" + `setToString`))) + (("`" + (` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The ` + "`")) + (`toString` + ("`" + ` result.\n * @returns {Function} Returns `)))) + ((("`" + (`func` + "`")) + (`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n", + "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of ` + ("`" + `_.some`))) + (("`" + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if any element passes the predicate check,\n * else ` + "`")))))) + (((((`false` + ("`" + `.\n */\nfunction baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n}\n\nmodule.exports = baseSome;\n", + "/**\n * The base implementation of `)) + ("`" + (`_.sortBy` + "`"))) + ((` which uses ` + ("`" + `comparer`)) + ("`" + (` to define the\n * sort order of ` + "`")))) + (((`array` + ("`" + ` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `)) + ("`" + (`array` + "`"))) + ((`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n", + "/**\n * The base implementation of ` + ("`" + `_.times`)) + (("`" + ` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `) + ("`" + `iteratee`))))) + (((("`" + (`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n", + "var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various ` + "`")) + (`Number` + ("`" + ` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `))) + (("`" + (`_.toString` + "`")) + (` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n", + "/**\n * The base implementation of ` + ("`" + `_.unary`)))) + ((("`" + (` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n", + "var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of ` + "`")) + (`_.uniqBy` + ("`" + ` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n", + "/**\n * Checks if a `))) + (("`" + (`cache` + "`")) + ((` value for ` + "`") + (`key` + "`")))))))) + (((((((` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if an entry for ` + "`"))) + ((`key` + ("`" + ` exists, else `)) + ("`" + (`false` + "`")))) + (((`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n", + "var isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Casts ` + ("`" + `value`)) + ("`" + (` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\nfunction castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n}\n\nmodule.exports = castArrayLikeObject;\n", + "var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts ` + "`"))) + ((`value` + ("`" + ` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n", + "var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `)) + ("`" + (`value` + "`"))))) + ((((`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n", + "var compareAscending = require('./_compareAscending');\n\n/**\n * Used by ` + ("`" + `_.orderBy`)) + ("`" + (` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If ` + "`"))) + ((`orders` + ("`" + ` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `)) + ("`" + (`object` + "`")))) + (((`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an ` + ("`" + `Array#sort`)) + ("`" + (` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // ` + "`"))) + ((`object` + ("`" + ` and `)) + (("`" + `other`) + ("`" + `. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n", + "var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n", + "var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `)))))) + ((((("`" + (`baseEach` + "`")) + (` or ` + ("`" + `baseEachRight`))) + (("`" + (` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n", + "/**\n * Creates a base function for methods like ` + "`")) + (`_.forIn` + ("`" + ` and `)))) + ((("`" + (`_.forOwn` + "`")) + (`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n", + "var baseIteratee = require('./_baseIteratee'),\n isArrayLike = require('./isArrayLike'),\n keys = require('./keys');\n\n/**\n * Creates a ` + ("`" + `_.find`))) + (("`" + (` or ` + "`")) + ((`_.findLast` + "`") + (` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nmodule.exports = createFind;\n", + "var baseRange = require('./_baseRange'),\n isIterateeCall = require('./_isIterateeCall'),\n toFinite = require('./toFinite');\n\n/**\n * Creates a ` + "`"))))) + ((((`_.range` + ("`" + ` or `)) + ("`" + (`_.rangeRight` + "`"))) + ((` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\nfunction createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of ` + ("`" + `-0`)) + ("`" + (` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n}\n\nmodule.exports = createRange;\n", + "var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various ` + "`")))) + (((`Number` + ("`" + ` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `)) + ("`" + (`values` + "`"))) + ((`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n", + "var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n", + "var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of ` + ("`" + `baseIsEqualDeep`)) + (("`" + ` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `) + ("`" + `baseIsEqual`))))))) + (((((("`" + (` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed ` + "`")) + (`array` + ("`" + ` and `))) + (("`" + (`other` + "`")) + (` objects.\n * @returns {boolean} Returns ` + ("`" + `true`)))) + ((("`" + (` if the arrays are equivalent, else ` + "`")) + (`false` + ("`" + `.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n", + "var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `))) + (("`" + (`Object#toString` + "`")) + (` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of ` + ("`" + `baseIsEqualDeep`))))) + (((("`" + (` for comparing objects of\n * the same ` + "`")) + (`toStringTag` + ("`" + `.\n *\n * **Note:** This function only supports comparing values with tags of\n * `))) + (("`" + (`Boolean` + "`")) + (`, ` + ("`" + `Date`)))) + ((("`" + (`, ` + "`")) + (`Error` + ("`" + `, `))) + (("`" + (`Number` + "`")) + ((`, ` + "`") + (`RegExp` + "`")))))) + (((((`, or ` + ("`" + `String`)) + ("`" + (`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The ` + "`"))) + ((`toStringTag` + ("`" + ` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `)) + ("`" + (`baseIsEqual` + "`")))) + (((` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed ` + ("`" + `object`)) + ("`" + (` and ` + "`"))) + ((`other` + ("`" + ` objects.\n * @returns {boolean} Returns `)) + (("`" + `true`) + ("`" + ` if the objects are equivalent, else `))))) + (((("`" + (`false` + "`")) + (`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to ` + ("`" + `1`))) + (("`" + (` or ` + "`")) + (`0` + ("`" + ` and dates to milliseconds.\n // Invalid dates are coerced to `)))) + ((("`" + (`NaN` + "`")) + (`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n", + "var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of ` + ("`" + `baseIsEqualDeep`))) + (("`" + (` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See ` + "`")) + ((`baseIsEqual` + "`") + (` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed ` + "`"))))))))) + ((((((((`object` + ("`" + ` and `)) + ("`" + (`other` + "`"))) + ((` objects.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if the objects are equivalent, else ` + "`")))) + (((`false` + ("`" + `.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `)) + ("`" + (`Object` + "`"))) + ((` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n", + "/** Detect free variable ` + ("`" + `global`)) + ("`" + (` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n", + "var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of ` + "`"))))) + ((((`object` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n", + "var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `)) + ("`" + (`map` + "`"))) + ((`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n", + "var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of ` + ("`" + `object`)) + ("`" + (`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of ` + "`")))) + (((`object` + ("`" + `.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n", + "var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `)) + ("`" + (`key` + "`"))) + ((` of ` + ("`" + `object`)) + (("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `) + ("`" + `undefined`)))))) + ((((("`" + (`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n", + "var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n", + "var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [` + "`")) + (`toStringTag` + ("`" + `](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `))) + (("`" + (`baseGetTag` + "`")) + (` which ignores ` + ("`" + `Symbol.toStringTag`)))) + ((("`" + (` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw ` + "`")) + (`toStringTag` + ("`" + `.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n", + "var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `))) + (("`" + (`lodash` + "`")) + ((` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of ` + "`") + (`object` + "`"))))) + ((((`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n", + "var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the ` + "`"))) + ((`toStringTag` + ("`" + ` of `)) + ("`" + (`value` + "`")))) + (((`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the ` + ("`" + `toStringTag`)) + ("`" + (`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n", + "/**\n * Gets the value at ` + "`"))) + ((`key` + ("`" + ` of `)) + (("`" + `object`) + ("`" + `.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n", + "var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `))))))) + (((((("`" + (`path` + "`")) + (` exists on ` + ("`" + `object`))) + (("`" + (`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `)))) + ((("`" + (`path` + "`")) + (` exists, else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n", + "var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n", + "/**\n * Removes ` + "`")) + (`key` + ("`" + ` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `))))) + (((("`" + (`true` + "`")) + (` if the entry was removed, else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n", + "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for ` + "`")) + (`undefined` + ("`" + ` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `)))) + ((("`" + (`key` + "`")) + (`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n", + "var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for ` + ("`" + `key`))) + (("`" + (` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if an entry for ` + "`")))))) + (((((`key` + ("`" + ` exists, else `)) + ("`" + (`false` + "`"))) + ((`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n", + "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for ` + ("`" + `undefined`)) + ("`" + (` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash ` + "`")))) + (((`key` + ("`" + ` to `)) + ("`" + (`value` + "`"))) + ((`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n", + "var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if ` + ("`" + `value`)) + (("`" + ` is a flattenable `) + ("`" + `arguments`))))) + (((("`" + (` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `))) + (("`" + (`value` + "`")) + (` is flattenable, else ` + ("`" + `false`)))) + ((("`" + (`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n", + "/** Used as references for various ` + "`")) + (`Number` + ("`" + ` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `))) + (("`" + (`value` + "`")) + ((` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns ` + "`") + (`true` + "`")))))))) + (((((((` if ` + ("`" + `value`)) + ("`" + (` is a valid index, else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n", + "var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`")))) + (((` if the arguments are from an iteratee call,\n * else ` + ("`" + `false`)) + ("`" + (`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n", + "var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))))) + ((((` if ` + ("`" + `value`)) + ("`" + (` is a property name, else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n", + "/**\n * Checks if `)) + ("`" + (`value` + "`")))) + (((` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`"))) + ((`value` + ("`" + ` is suitable, else `)) + (("`" + `false`) + ("`" + `.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n", + "var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `)))))) + ((((("`" + (`func` + "`")) + (` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`func` + ("`" + ` is masked, else `)))) + ((("`" + (`false` + "`")) + (`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n", + "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if ` + "`"))))) + ((((`value` + ("`" + ` is a prototype, else `)) + ("`" + (`false` + "`"))) + ((`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n", + "var isObject = require('./isObject');\n\n/**\n * Checks if ` + ("`" + `value`)) + ("`" + (` is suitable for strict equality comparisons, i.e. ` + "`")))) + (((`===` + ("`" + `.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + (("`" + ` if suitable for strict\n * equality comparisons, else `) + ("`" + `false`))))))) + (((((("`" + (`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n", + "/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n", + "var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes ` + "`")) + (`key` + ("`" + ` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `))) + (("`" + (`true` + "`")) + (` if the entry was removed, else ` + ("`" + `false`)))) + ((("`" + (`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n", + "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for ` + "`")) + (`key` + ("`" + `.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n", + "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `))) + (("`" + (`key` + "`")) + ((` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns ` + "`") + (`true` + "`"))))) + ((((` if an entry for ` + ("`" + `key`)) + ("`" + (` exists, else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n", + "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `)) + ("`" + (`key` + "`")))) + (((` to ` + ("`" + `value`)) + ("`" + (`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n", + "var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n", + "var getMapData = require('./_getMapData');\n\n/**\n * Removes ` + "`"))) + ((`key` + ("`" + ` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `)) + (("`" + `true`) + ("`" + ` if the entry was removed, else `)))))) + ((((("`" + (`false` + "`")) + (`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n", + "var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for ` + ("`" + `key`))) + (("`" + (`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n", + "var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for ` + "`")) + (`key` + ("`" + ` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `)))) + ((("`" + (`true` + "`")) + (` if an entry for ` + ("`" + `key`))) + (("`" + (` exists, else ` + "`")) + ((`false` + "`") + (`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n", + "var getMapData = require('./_getMapData');\n\n/**\n * Sets the map ` + "`"))))) + ((((`key` + ("`" + ` to `)) + ("`" + (`value` + "`"))) + ((`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n", + "/**\n * Converts ` + ("`" + `map`)) + ("`" + (` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n", + "/**\n * A specialized version of ` + "`")))) + (((`matchesProperty` + ("`" + ` for source values suitable\n * for strict equality comparisons, i.e. `)) + ("`" + (`===` + "`"))) + ((`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n", + "var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of ` + ("`" + `_.memoize`)) + (("`" + ` which clears the memoized function's\n * cache when it exceeds `) + ("`" + `MAX_MEMOIZE_SIZE`)))))))))) + ((((((((("`" + (`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n", + "var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n", + "var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other ` + "`")) + (`lodash` + ("`" + ` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n", + "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `))) + (("`" + (`exports` + "`")) + (`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable ` + ("`" + `module`)))) + ((("`" + (`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension ` + "`")) + (`module.exports` + ("`" + `. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `))) + (("`" + (`process` + "`")) + (` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use ` + ("`" + `util.types`))))) + (((("`" + (` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy ` + "`")) + (`process.binding('util')` + ("`" + ` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n", + "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`))) + (("`" + (`toStringTag` + "`")) + (`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts ` + ("`" + `value`)))) + ((("`" + (` to a string using ` + "`")) + (`Object.prototype.toString` + ("`" + `.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n", + "/**\n * Creates a unary function that invokes `))) + (("`" + (`func` + "`")) + ((` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n", + "var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other ` + "`") + (`lodash` + "`")))))) + (((((` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of ` + ("`" + `baseRest`)) + ("`" + (` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n", + "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable ` + "`"))) + ((`self` + ("`" + `. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n", + "/** Used to stand-in for `)) + ("`" + (`undefined` + "`")))) + (((` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds ` + ("`" + `value`)) + ("`" + (` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n", + "/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `)) + (("`" + `true`) + ("`" + ` if `))))) + (((("`" + (`value` + "`")) + (` is found, else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n", + "/**\n * Converts ` + "`")) + (`set` + ("`" + ` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n", + "var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `)))) + ((("`" + (`toString` + "`")) + (` method of ` + ("`" + `func`))) + (("`" + (` to return ` + "`")) + ((`string` + "`") + (`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The ` + "`"))))))) + ((((((`toString` + ("`" + ` result.\n * @returns {Function} Returns `)) + ("`" + (`func` + "`"))) + ((`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n", + "/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other ` + ("`" + `lodash`)) + ("`" + (` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke ` + "`")))) + (((`identity` + ("`" + ` instead\n * of `)) + ("`" + (`func` + "`"))) + ((` when it's called ` + ("`" + `HOT_COUNT`)) + ("`" + (` or more times in ` + "`"))))) + ((((`HOT_SPAN` + ("`" + `\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n", + "var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n", + "/**\n * Removes `)) + ("`" + (`key` + "`"))) + ((` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if the entry was removed, else ` + "`")))) + (((`false` + ("`" + `.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n", + "/**\n * Gets the stack value for `)) + ("`" + (`key` + "`"))) + ((`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n", + "/**\n * Checks if a stack value for ` + ("`" + `key`)) + (("`" + ` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `) + ("`" + `true`)))))) + ((((("`" + (` if an entry for ` + "`")) + (`key` + ("`" + ` exists, else `))) + (("`" + (`false` + "`")) + (`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n", + "var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack ` + ("`" + `key`)))) + ((("`" + (` to ` + "`")) + (`value` + ("`" + `.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n", + "/**\n * A specialized version of `))) + (("`" + (`_.indexOf` + "`")) + ((` which performs strict equality\n * comparisons of values, i.e. ` + "`") + (`===` + "`"))))) + ((((`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else ` + ("`" + `-1`)) + ("`" + (`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n", + "var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts ` + "`"))) + ((`string` + ("`" + ` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n", + "var isSymbol = require('./isSymbol');\n\n/** Used as references for various `)) + ("`" + (`Number` + "`")))) + (((` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts ` + ("`" + `value`)) + ("`" + (` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n", + "/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts ` + "`"))) + ((`func` + ("`" + ` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n", + "/**\n * Creates a function that returns `)) + (("`" + `value`) + ("`" + `.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n", + "var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `)))))))) + ((((((("`" + (`lodash` + "`")) + (` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking ` + ("`" + `func`))) + (("`" + (` until after ` + "`")) + (`wait` + ("`" + `\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `)))) + ((("`" + (`cancel` + "`")) + (` method to cancel\n * delayed ` + ("`" + `func`))) + (("`" + (` invocations and a ` + "`")) + (`flush` + ("`" + ` method to immediately invoke them.\n * Provide `))))) + (((("`" + (`options` + "`")) + (` to indicate whether ` + ("`" + `func`))) + (("`" + (` should be invoked on the\n * leading and/or trailing edge of the ` + "`")) + (`wait` + ("`" + ` timeout. The `)))) + ((("`" + (`func` + "`")) + (` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last ` + ("`" + `func`))) + (("`" + (`\n * invocation.\n *\n * **Note:** If ` + "`")) + ((`leading` + "`") + (` and ` + "`")))))) + (((((`trailing` + ("`" + ` options are `)) + ("`" + (`true` + "`"))) + ((`, ` + ("`" + `func`)) + ("`" + (` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the ` + "`")))) + (((`wait` + ("`" + ` timeout.\n *\n * If `)) + ("`" + (`wait` + "`"))) + ((` is ` + ("`" + `0`)) + (("`" + ` and `) + ("`" + `leading`))))) + (((("`" + (` is ` + "`")) + (`false` + ("`" + `, `))) + (("`" + (`func` + "`")) + (` invocation is deferred\n * until to the next tick, similar to ` + ("`" + `setTimeout`)))) + ((("`" + (` with a timeout of ` + "`")) + (`0` + ("`" + `.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `))) + (("`" + (`_.debounce` + "`")) + ((` and ` + "`") + (`_.throttle` + "`"))))))) + ((((((`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time ` + ("`" + `func`)) + ("`" + (` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke ` + "`"))) + ((`sendMail` + ("`" + ` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `)) + ("`" + (`batchLog` + "`")))) + (((` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any ` + ("`" + `maxWait`)) + ("`" + (` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the ` + "`"))) + ((`maxWait` + ("`" + ` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `)) + (("`" + `lastArgs`) + ("`" + ` which means `))))) + (((("`" + (`func` + "`")) + (` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n", + "/**\n * Performs a\n * [` + ("`" + `SameValueZero`))) + (("`" + (`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if the values are equivalent, else `)))) + ((("`" + (`false` + "`")) + (`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n", + "var arrayEvery = require('./_arrayEvery'),\n baseEvery = require('./_baseEvery'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if ` + ("`" + `predicate`))) + (("`" + (` returns truthy for **all** elements of ` + "`")) + ((`collection` + "`") + (`.\n * Iteration is stopped once ` + "`")))))) + (((((`predicate` + ("`" + ` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `)) + ("`" + (`true` + "`"))) + ((` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like ` + ("`" + `_.map`)) + ("`" + (`.\n * @returns {boolean} Returns ` + "`")))) + (((`true` + ("`" + ` if all elements pass the predicate check,\n * else `)) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The ` + ("`" + `_.matches`)) + (("`" + ` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `) + ("`" + `_.matchesProperty`))))) + (((("`" + (` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The ` + "`")) + (`_.property` + ("`" + ` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = every;\n", + "var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `))) + (("`" + (`collection` + "`")) + (`, returning an array of all elements\n * ` + ("`" + `predicate`)))) + ((("`" + (` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike ` + "`")) + (`_.remove` + ("`" + `, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `))) + (("`" + (`_.matches` + "`")) + ((` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The ` + "`") + (`_.matchesProperty` + "`"))))))))) + ((((((((` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The ` + ("`" + `_.property`)) + ("`" + (` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n", + "var createFind = require('./_createFind'),\n findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of ` + "`"))) + ((`collection` + ("`" + `, returning the first element\n * `)) + ("`" + (`predicate` + "`")))) + (((` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else ` + ("`" + `undefined`)) + ("`" + (`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The ` + "`"))) + ((`_.matches` + ("`" + ` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `)) + ("`" + (`_.matchesProperty` + "`"))))) + ((((` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The ` + ("`" + `_.property`)) + ("`" + (` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n", + "var baseFindIndex = require('./_baseFindIndex'),\n baseIteratee = require('./_baseIteratee'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other ` + "`"))) + ((`lodash` + ("`" + ` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `)) + ("`" + (`_.find` + "`")))) + (((` except that it returns the index of the first\n * element ` + ("`" + `predicate`)) + ("`" + (` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else ` + "`"))) + ((`-1` + ("`" + `.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `)) + (("`" + `_.matches`) + ("`" + ` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `)))))) + ((((("`" + (`_.matchesProperty` + "`")) + (` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The ` + ("`" + `_.property`))) + (("`" + (` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n", + "var baseFlatten = require('./_baseFlatten'),\n map = require('./map');\n\n/**\n * Creates a flattened array of values by running each element in ` + "`")) + (`collection` + ("`" + `\n * thru `)))) + ((("`" + (`iteratee` + "`")) + (` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n}\n\nmodule.exports = flatMap;\n", + "var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at ` + ("`" + `path`))) + (("`" + (` of ` + "`")) + ((`object` + "`") + (`. If the resolved value is\n * ` + "`"))))) + ((((`undefined` + ("`" + `, the `)) + ("`" + (`defaultValue` + "`"))) + ((` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for ` + ("`" + `undefined`)) + ("`" + (` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n", + "var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if ` + "`")))) + (((`path` + ("`" + ` is a direct or inherited property of `)) + ("`" + (`object` + "`"))) + ((`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + (("`" + ` if `) + ("`" + `path`))))))) + (((((("`" + (` exists, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n", + "/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `))) + (("`" + (`value` + "`")) + (`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n", + "var arrayMap = require('./_arrayMap'),\n baseIntersection = require('./_baseIntersection'),\n baseRest = require('./_baseRest'),\n castArrayLikeObject = require('./_castArrayLikeObject');\n\n/**\n * Creates an array of unique values that are included in all given arrays\n * using [` + ("`" + `SameValueZero`)))) + ((("`" + (`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\nvar intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n});\n\nmodule.exports = intersection;\n", + "var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is likely an `))) + (("`" + (`arguments` + "`")) + (` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))))) + (((("`" + (` if ` + "`")) + (`value` + ("`" + ` is an `))) + (("`" + (`arguments` + "`")) + (` object,\n * else ` + ("`" + `false`)))) + ((("`" + (`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n", + "/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is classified as an `))) + (("`" + (`Array` + "`")) + ((` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`") + (`true` + "`")))))) + (((((` if ` + ("`" + `value`)) + ("`" + (` is an array, else ` + "`"))) + ((`false` + ("`" + `.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n", + "var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `)) + ("`" + (`value` + "`")))) + (((` is array-like. A value is considered array-like if it's\n * not a function and has a ` + ("`" + `value.length`)) + ("`" + (` that's an integer greater than or\n * equal to ` + "`"))) + ((`0` + ("`" + ` and less than or equal to `)) + (("`" + `Number.MAX_SAFE_INTEGER`) + ("`" + `.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `))))) + (((("`" + (`true` + "`")) + (` if ` + ("`" + `value`))) + (("`" + (` is array-like, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n", + "var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `)))) + ((("`" + (`_.isArrayLike` + "`")) + (` except that it also checks if ` + ("`" + `value`))) + (("`" + (`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if ` + "`")))))))) + (((((((`value` + ("`" + ` is an array-like object,\n * else `)) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n", + "var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable ` + ("`" + `exports`)) + ("`" + (`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable ` + "`")))) + (((`module` + ("`" + `. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `)) + ("`" + (`module.exports` + "`"))) + ((`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other ` + ("`" + `lodash`)) + ("`" + (` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if ` + "`"))))) + ((((`value` + ("`" + ` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + ("`" + (` is a buffer, else ` + "`")))) + (((`false` + ("`" + `.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n", + "var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `)) + ("`" + (`Object` + "`"))) + ((` objects, regexes,\n * sets, strings, symbols, and typed arrays. ` + ("`" + `Object`)) + (("`" + ` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `) + ("`" + `===`)))))) + ((((("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if the values are equivalent, else `))) + (("`" + (`false` + "`")) + (`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n", + "var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** ` + ("`" + `Object#toString`)))) + ((("`" + (` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is classified as a `))) + (("`" + (`Function` + "`")) + ((` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`") + (`true` + "`"))))) + ((((` if ` + ("`" + `value`)) + ("`" + (` is a function, else ` + "`"))) + ((`false` + ("`" + `.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `)) + ("`" + (`Object#toString` + "`")))) + (((` avoids issues with the ` + ("`" + `typeof`)) + ("`" + (` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n", + "/** Used as references for various ` + "`"))) + ((`Number` + ("`" + ` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `)) + (("`" + `value`) + ("`" + ` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`))))))) + (((((("`" + (`ToLength` + "`")) + (`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is a valid length, else `)))) + ((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n", + "var isNumber = require('./isNumber');\n\n/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is ` + "`")) + ((`NaN` + "`") + (`.\n *\n * **Note:** This method is based on\n * [` + "`"))))) + ((((`Number.isNaN` + ("`" + `](https://mdn.io/Number/isNaN) and is not the same as\n * global [`)) + ("`" + (`isNaN` + "`"))) + ((`](https://mdn.io/isNaN) which returns ` + ("`" + `true`)) + ("`" + (` for\n * ` + "`")))) + (((`undefined` + ("`" + ` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + (("`" + ` is `) + ("`" + `NaN`)))))) + ((((("`" + (`, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\nfunction isNaN(value) {\n // An `))) + (("`" + (`NaN` + "`")) + (` primitive is the only value that is not equal to itself.\n // Perform the ` + ("`" + `toStringTag`)))) + ((("`" + (` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n}\n\nmodule.exports = isNaN;\n", + "/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is `))) + (("`" + (`null` + "`")) + ((` or ` + "`") + (`undefined` + "`"))))) + ((((`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`"))) + ((`value` + ("`" + ` is nullish, else `)) + ("`" + (`false` + "`")))) + (((`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\nfunction isNil(value) {\n return value == null;\n}\n\nmodule.exports = isNil;\n", + "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is classified as a `)) + (("`" + `Number`) + ("`" + ` primitive or object.\n *\n * **Note:** To exclude `))))))))))) + (((((((((("`" + (`Infinity` + "`")) + (`, ` + ("`" + `-Infinity`))) + (("`" + (`, and ` + "`")) + (`NaN` + ("`" + `, which are\n * classified as numbers, use the `)))) + ((("`" + (`_.isFinite` + "`")) + (` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is a number, else `))))) + (((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nmodule.exports = isNumber;\n", + "/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of ` + "`")) + (`Object` + ("`" + `. (e.g. arrays, functions, objects, regexes, `)))) + ((("`" + (`new Number(0)` + "`")) + (`, and ` + ("`" + `new String('')`))) + (("`" + (`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if ` + "`")))))) + (((((`value` + ("`" + ` is an object, else `)) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n", + "/**\n * Checks if ` + ("`" + `value`)) + ("`" + (` is object-like. A value is object-like if it's not ` + "`")))) + (((`null` + ("`" + `\n * and has a `)) + ("`" + (`typeof` + "`"))) + ((` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + (("`" + ` if `) + ("`" + `value`))))) + (((("`" + (` is object-like, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n", + "var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `))) + (("`" + (`Object#toString` + "`")) + (` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the ` + ("`" + `Object`)))) + ((("`" + (` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is a plain object, that is, an object created by the\n * `))) + (("`" + (`Object` + "`")) + ((` constructor or one with a ` + "`") + (`[[Prototype]]` + "`"))))))) + ((((((` of ` + ("`" + `null`)) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + ("`" + (`value` + "`")))) + (((` is a plain object, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n", + "var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + "`"))) + ((`Object#toString` + ("`" + ` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `)) + ("`" + (`value` + "`"))))) + ((((` is classified as a ` + ("`" + `String`)) + ("`" + (` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + ("`" + (`value` + "`")))) + (((` is a string, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n", + "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + "`"))) + ((`Object#toString` + ("`" + ` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `)) + (("`" + `value`) + ("`" + ` is classified as a `)))))) + ((((("`" + (`Symbol` + "`")) + (` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is a symbol, else `)))) + ((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n", + "var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if ` + "`"))))) + ((((`value` + ("`" + ` is a typed array, else `)) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n", + "var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of ` + ("`" + `object`)) + ("`" + (`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n", + "/**\n * Gets the last element of ` + "`")))) + (((`array` + ("`" + `.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `)) + ("`" + (`array` + "`"))) + ((`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n", + "var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in ` + ("`" + `collection`)) + (("`" + ` thru\n * `) + ("`" + `iteratee`)))))))) + ((((((("`" + (`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * ` + "`")) + (`_.every` + ("`" + `, `))) + (("`" + (`_.filter` + "`")) + (`, ` + ("`" + `_.map`)))) + ((("`" + (`, ` + "`")) + (`_.mapValues` + ("`" + `, `))) + (("`" + (`_.reject` + "`")) + (`, and ` + ("`" + `_.some`))))) + (((("`" + (`.\n *\n * The guarded methods are:\n * ` + "`")) + (`ary` + ("`" + `, `))) + (("`" + (`chunk` + "`")) + (`, ` + ("`" + `curry`)))) + ((("`" + (`, ` + "`")) + (`curryRight` + ("`" + `, `))) + (("`" + (`drop` + "`")) + ((`, ` + "`") + (`dropRight` + "`")))))) + (((((`, ` + ("`" + `every`)) + ("`" + (`,\n * ` + "`"))) + ((`fill` + ("`" + `, `)) + ("`" + (`invert` + "`")))) + (((`, ` + ("`" + `parseInt`)) + ("`" + (`, ` + "`"))) + ((`random` + ("`" + `, `)) + (("`" + `range`) + ("`" + `, `))))) + (((("`" + (`rangeRight` + "`")) + (`, ` + ("`" + `repeat`))) + (("`" + (`,\n * ` + "`")) + (`sampleSize` + ("`" + `, `)))) + ((("`" + (`slice` + "`")) + (`, ` + ("`" + `some`))) + (("`" + (`, ` + "`")) + ((`sortBy` + "`") + (`, ` + "`"))))))) + ((((((`split` + ("`" + `, `)) + ("`" + (`take` + "`"))) + ((`, ` + ("`" + `takeRight`)) + ("`" + (`,\n * ` + "`")))) + (((`template` + ("`" + `, `)) + ("`" + (`trim` + "`"))) + ((`, ` + ("`" + `trimEnd`)) + (("`" + `, `) + ("`" + `trimStart`))))) + (((("`" + (`, and ` + "`")) + (`words` + ("`" + `\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `))) + (("`" + (`_.property` + "`")) + (` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n", + "var baseAssignValue = require('./_baseAssignValue'),\n baseForOwn = require('./_baseForOwn'),\n baseIteratee = require('./_baseIteratee');\n\n/**\n * Creates an object with the same keys as ` + ("`" + `object`)))) + ((("`" + (` and values generated\n * by running each own enumerable string keyed property of ` + "`")) + (`object` + ("`" + ` thru\n * `))) + (("`" + (`iteratee` + "`")) + ((`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The ` + "`") + (`_.property` + "`")))))) + (((((` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n var result = {};\n iteratee = baseIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n}\n\nmodule.exports = mapValues;\n", + "var baseExtremum = require('./_baseExtremum'),\n baseGt = require('./_baseGt'),\n identity = require('./identity');\n\n/**\n * Computes the maximum value of ` + ("`" + `array`)) + ("`" + (`. If ` + "`"))) + ((`array` + ("`" + ` is empty or falsey,\n * `)) + ("`" + (`undefined` + "`")))) + (((` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n}\n\nmodule.exports = max;\n", + "var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of ` + ("`" + `func`)) + ("`" + (`. If ` + "`"))) + ((`resolver` + ("`" + ` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `)) + (("`" + `func`) + ("`" + `\n * is invoked with the `))))) + (((("`" + (`this` + "`")) + (` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the ` + ("`" + `cache`))) + (("`" + (` property on the memoized\n * function. Its creation may be customized by replacing the ` + "`")) + (`_.memoize.Cache` + ("`" + `\n * constructor with one whose instances implement the\n * [`)))) + ((("`" + (`Map` + "`")) + (`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of ` + ("`" + `clear`))) + (("`" + (`, ` + "`")) + ((`delete` + "`") + (`, ` + "`"))))))))) + ((((((((`get` + ("`" + `, `)) + ("`" + (`has` + "`"))) + ((`, and ` + ("`" + `set`)) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace ` + "`")))) + (((`_.memoize.Cache` + ("`" + `.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `)) + ("`" + (`MapCache` + "`"))) + ((`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n", + "var baseExtremum = require('./_baseExtremum'),\n baseLt = require('./_baseLt'),\n identity = require('./identity');\n\n/**\n * Computes the minimum value of ` + ("`" + `array`)) + ("`" + (`. If ` + "`"))))) + ((((`array` + ("`" + ` is empty or falsey,\n * `)) + ("`" + (`undefined` + "`"))) + ((` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nmodule.exports = min;\n", + "/**\n * This method returns ` + ("`" + `undefined`)) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n", + "var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n", + "var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at ` + "`")))) + (((`path` + ("`" + ` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n", + "var createRange = require('./_createRange');\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `)) + ("`" + (`start` + "`"))) + ((` up to, but not including, ` + ("`" + `end`)) + (("`" + `. A step of `) + ("`" + `-1`)))))) + ((((("`" + (` is used if a negative\n * ` + "`")) + (`start` + ("`" + ` is specified without an `))) + (("`" + (`end` + "`")) + (` or ` + ("`" + `step`)))) + ((("`" + (`. If ` + "`")) + (`end` + ("`" + ` is not specified,\n * it's set to `))) + (("`" + (`start` + "`")) + ((` with ` + "`") + (`start` + "`"))))) + ((((` then set to ` + ("`" + `0`)) + ("`" + (`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\nvar range = createRange();\n\nmodule.exports = range;\n", + "var arraySome = require('./_arraySome'),\n baseIteratee = require('./_baseIteratee'),\n baseSome = require('./_baseSome'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if ` + "`"))) + ((`predicate` + ("`" + ` returns truthy for **any** element of `)) + ("`" + (`collection` + "`")))) + (((`.\n * Iteration is stopped once ` + ("`" + `predicate`)) + ("`" + (` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like ` + "`"))) + ((`_.map` + ("`" + `.\n * @returns {boolean} Returns `)) + (("`" + `true`) + ("`" + ` if any element passes the predicate check,\n * else `))))))) + (((((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The ` + ("`" + `_.matches`))) + (("`" + (` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The ` + "`")) + (`_.matchesProperty` + ("`" + ` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `)))) + ((("`" + (`_.property` + "`")) + (` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\nfunction some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = some;\n", + "var baseFlatten = require('./_baseFlatten'),\n baseOrderBy = require('./_baseOrderBy'),\n baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n", + "/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n", + "/**\n * This method returns ` + ("`" + `false`))) + (("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n", + "var debounce = require('./debounce'),\n isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `))))) + (((("`" + (`func` + "`")) + (` at most once per\n * every ` + ("`" + `wait`))) + (("`" + (` milliseconds. The throttled function comes with a ` + "`")) + (`cancel` + ("`" + `\n * method to cancel delayed `)))) + ((("`" + (`func` + "`")) + (` invocations and a ` + ("`" + `flush`))) + (("`" + (` method to\n * immediately invoke them. Provide ` + "`")) + ((`options` + "`") + (` to indicate whether ` + "`")))))) + (((((`func` + ("`" + `\n * should be invoked on the leading and/or trailing edge of the `)) + ("`" + (`wait` + "`"))) + ((`\n * timeout. The ` + ("`" + `func`)) + ("`" + (` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last ` + "`")))) + (((`func` + ("`" + ` invocation.\n *\n * **Note:** If `)) + ("`" + (`leading` + "`"))) + ((` and ` + ("`" + `trailing`)) + (("`" + ` options are `) + ("`" + `true`))))) + (((("`" + (`, ` + "`")) + (`func` + ("`" + ` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `))) + (("`" + (`wait` + "`")) + (` timeout.\n *\n * If ` + ("`" + `wait`)))) + ((("`" + (` is ` + "`")) + (`0` + ("`" + ` and `))) + (("`" + (`leading` + "`")) + ((` is ` + "`") + (`false` + "`")))))))) + (((((((`, ` + ("`" + `func`)) + ("`" + (` invocation is deferred\n * until to the next tick, similar to ` + "`"))) + ((`setTimeout` + ("`" + ` with a timeout of `)) + ("`" + (`0` + "`")))) + (((`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + ("`" + `_.throttle`)) + ("`" + (` and ` + "`"))) + ((`_.debounce` + ("`" + `.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `)) + ("`" + (`renewToken` + "`"))))) + ((((` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n", + "var toNumber = require('./toNumber');\n\n/** Used as references for various ` + ("`" + `Number`)) + ("`" + (` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts ` + "`"))) + ((`value` + ("`" + ` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n", + "var toFinite = require('./toFinite');\n\n/**\n * Converts `)) + ("`" + (`value` + "`")))) + (((` to an integer.\n *\n * **Note:** This method is loosely based on\n * [` + ("`" + `ToInteger`)) + ("`" + (`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n", + "var isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various ` + "`"))) + ((`Number` + ("`" + ` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `)) + (("`" + `root`) + ("`" + `. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `)))))) + ((((("`" + (`value` + "`")) + (` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n", + "var baseToString = require('./_baseToString');\n\n/**\n * Converts ` + ("`" + `value`))) + (("`" + (` to a string. An empty string is returned for ` + "`")) + (`null` + ("`" + `\n * and `)))) + ((("`" + (`undefined` + "`")) + (` values. The sign of ` + ("`" + `-0`))) + (("`" + (` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n", + "var baseIteratee = require('./_baseIteratee'),\n baseUniq = require('./_baseUniq');\n\n/**\n * This method is like ` + "`")) + ((`_.uniq` + "`") + (` except that it accepts ` + "`"))))) + ((((`iteratee` + ("`" + ` which is\n * invoked for each element in `)) + ("`" + (`array` + "`"))) + ((` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The ` + ("`" + `_.property`)) + ("`" + (` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n", + "var Mexp=require('./postfix_evaluator.js');\r\nMexp.prototype.formulaEval = function () {\r\n\t\"use strict\";\r\n\tvar stack=[],pop1,pop2,pop3;\r\n\tvar disp=[];\r\n\tvar temp='';\r\n\tvar arr=this.value;\r\n\tfor(var i=0;i\"+pop2.value+\"\"+arr[i].show+\"\"+pop1.value+\"\",type:10});\r\n\t\t\telse disp.push({value:(pop2.type!=1?\"(\":\"\")+pop2.value+(pop2.type!=1?\")\":\"\")+\"\"+pop1.value+\"\",type:1});\r\n\t\t}\r\n\t\telse if(arr[i].type===2||arr[i].type===9){\r\n\t\t\tpop1=disp.pop();\r\n\t\t\tpop2=disp.pop();\r\n\t\t\tdisp.push({value:(pop2.type!=1?\"(\":\"\")+pop2.value+(pop2.type!=1?\")\":\"\")+arr[i].show+(pop1.type!=1?\"(\":\"\")+pop1.value+(pop1.type!=1?\")\":\"\"),type:arr[i].type});\r\n\t\t}\r\n\t\telse if(arr[i].type===12){\r\n\t\t\tpop1=disp.pop();\r\n\t\t\tpop2=disp.pop();\r\n\t\t\tpop3=disp.pop();\r\n\t\t\tdisp.push({value:arr[i].show+\"(\"+pop3.value+\",\"+pop2.value+\",\"+pop1.value+\")\",type:12});\r\n\t\t}\r\n\t}\r\n\treturn disp[0].value;\r\n};\r\nmodule.exports=Mexp;", + "var Mexp=require('./math_function.js');\r\n\tfunction inc(arr,val){\r\n\t\tfor(var i=0;i(newAr.length-2)?newAr.length-1:inpStr.length-i);x>0;x--){\r\n\t\t\t\tfor(y=0;yprep)stack.push(elem);\r\n\t\t\t\telse {\r\n\t\t\t\t\twhile(prep>=pre&&!flag||flag&&pre1) {\r\n\t\tthrow(new Mexp.exception(\"Uncaught Syntax error\"));\r\n\t}\r\n\treturn stack[0].value>1000000000000000?\"Infinity\":parseFloat(stack[0].value.toFixed(15));\r\n};\r\nMexp.eval=function(str,tokens,obj){\r\n\tif (typeof tokens===\"undefined\") {\r\n\t\treturn this.lex(str).toPostfix().postfixEval();\r\n\t}\r\n\telse if (typeof obj===\"undefined\") {\r\n\t\tif (typeof tokens.length!==\"undefined\") \r\n\t\t\treturn this.lex(str,tokens).toPostfix().postfixEval();\r\n\t\telse\r\n\t\t\treturn this.lex(str).toPostfix().postfixEval(tokens);\r\n\t}\r\n\telse\r\n\t\treturn this.lex(str,tokens).toPostfix().postfixEval(obj);\r\n};\r\nmodule.exports=Mexp;", + "/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n", + "// Generated by CoffeeScript 1.12.2\n(function() {\n var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;\n\n if ((typeof performance !== \"undefined\" && performance !== null) && performance.now) {\n module.exports = function() {\n return performance.now();\n };\n } else if ((typeof process !== \"undefined\" && process !== null) && process.hrtime) {\n module.exports = function() {\n return (getNanoSeconds() - nodeLoadTime) / 1e6;\n };\n hrtime = process.hrtime;\n getNanoSeconds = function() {\n var hr;\n hr = hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n moduleLoadTime = getNanoSeconds();\n upTime = process.uptime() * 1e9;\n nodeLoadTime = moduleLoadTime - upTime;\n } else if (Date.now) {\n module.exports = function() {\n return Date.now() - loadTime;\n };\n loadTime = Date.now();\n } else {\n module.exports = function() {\n return new Date().getTime() - loadTime;\n };\n loadTime = new Date().getTime();\n }\n\n}).call(this);\n\n//# sourceMappingURL=performance-now.js.map\n", + "// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the ` + "`")))) + (((`prop-types` + ("`" + ` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `)) + ("`" + (`./factoryWithTypeCheckers.js` + "`"))) + ((`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using ` + ("`" + `prop-types`)) + (("`" + ` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `) + ("`" + `prop-types`))))))) + (((((("`" + (` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n", + "var now = require('performance-now')\n , root = typeof window === 'undefined' ? global : window\n , vendors = ['moz', 'webkit']\n , suffix = 'AnimationFrame'\n , raf = root['request' + suffix]\n , caf = root['cancel' + suffix] || root['cancelRequest' + suffix]\n\nfor(var i = 0; !raf && i < vendors.length; i++) {\n raf = root[vendors[i] + 'Request' + suffix]\n caf = root[vendors[i] + 'Cancel' + suffix]\n || root[vendors[i] + 'CancelRequest' + suffix]\n}\n\n// Some versions of FF have rAF but not cAF\nif(!raf || !caf) {\n var last = 0\n , id = 0\n , queue = []\n , frameDuration = 1000 / 60\n\n raf = function(callback) {\n if(queue.length === 0) {\n var _now = now()\n , next = Math.max(0, frameDuration - (_now - last))\n last = next + _now\n setTimeout(function() {\n var cp = queue.slice(0)\n // Clear queue here to prevent\n // callbacks from appending listeners\n // to the current frame's queue\n queue.length = 0\n for(var i = 0; i < cp.length; i++) {\n if(!cp[i].cancelled) {\n try{\n cp[i].callback(last)\n } catch(e) {\n setTimeout(function() { throw e }, 0)\n }\n }\n }\n }, Math.round(next))\n }\n queue.push({\n handle: ++id,\n callback: callback,\n cancelled: false\n })\n return id\n }\n\n caf = function(handle) {\n for(var i = 0; i < queue.length; i++) {\n if(queue[i].handle === handle) {\n queue[i].cancelled = true\n }\n }\n }\n}\n\nmodule.exports = function(fn) {\n // Wrap in a new function to prevent\n // ` + "`")) + (`cancel` + ("`" + ` potentially being assigned\n // to the native rAF function\n return raf.call(root, fn)\n}\nmodule.exports.cancel = function() {\n caf.apply(root, arguments)\n}\nmodule.exports.polyfill = function(object) {\n if (!object) {\n object = root;\n }\n object.requestAnimationFrame = raf\n object.cancelAnimationFrame = caf\n}\n", + "/** @license React v16.8.4\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),n=require(\"object-assign\"),r=require(\"scheduler\");function ba(a,b,c,d,e,f,g,h){if(!a){a=void 0;if(void 0===b)a=Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var l=[c,d,e,f,g,h],k=0;a=Error(b.replace(/%s/g,function(){return l[k++]}));a.name=\"Invariant Violation\"}a.framesToPop=1;throw a;}}\nfunction x(a){for(var b=arguments.length-1,c=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,d=0;dthis.eventPool.length&&this.eventPool.push(a)}\nfunction hb(a){a.eventPool=[];a.getPooled=ib;a.release=jb}var kb=y.extend({data:null}),lb=y.extend({data:null}),mb=[9,13,27,32],nb=Ra&&\"CompositionEvent\"in window,ob=null;Ra&&\"documentMode\"in document&&(ob=document.documentMode);\nvar pb=Ra&&\"TextEvent\"in window&&!ob,qb=Ra&&(!nb||ob&&8=ob),rb=String.fromCharCode(32),sb={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},tb=!1;\nfunction ub(a,b){switch(a){case \"keyup\":return-1!==mb.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function vb(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var wb=!1;function xb(a,b){switch(a){case \"compositionend\":return vb(b);case \"keypress\":if(32!==b.which)return null;tb=!0;return rb;case \"textInput\":return a=b.data,a===rb&&tb?null:a;default:return null}}\nfunction yb(a,b){if(wb)return\"compositionend\"===a||!nb&&ub(a,b)?(a=eb(),db=cb=bb=null,wb=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1b}return!1}function C(a,b,c,d,e){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b}var D={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){D[a]=new C(a,0,!1,a,null)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];D[b]=new C(b,1,!1,a[1],null)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){D[a]=new C(a,2,!1,a.toLowerCase(),null)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){D[a]=new C(a,2,!1,a,null)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){D[a]=new C(a,3,!1,a.toLowerCase(),null)});[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){D[a]=new C(a,3,!0,a,null)});\n[\"capture\",\"download\"].forEach(function(a){D[a]=new C(a,4,!1,a,null)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){D[a]=new C(a,6,!1,a,null)});[\"rowSpan\",\"start\"].forEach(function(a){D[a]=new C(a,5,!1,a.toLowerCase(),null)});var rc=/[\\-:]([a-z])/g;function sc(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(rc,\nsc);D[b]=new C(b,1,!1,a,null)});\"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(rc,sc);D[b]=new C(b,1,!1,a,\"http://www.w3.org/1999/xlink\")});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(rc,sc);D[b]=new C(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\")});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){D[a]=new C(a,1,!1,a.toLowerCase(),null)});\nfunction tc(a,b,c,d){var e=D.hasOwnProperty(b)?D[b]:null;var f=null!==e?0===e.type:d?!1:!(2zd.length&&zd.push(a)}}}var Fd={},Gd=0,Hd=\"_reactListenersID\"+(\"\"+Math.random()).slice(2);\nfunction Id(a){Object.prototype.hasOwnProperty.call(a,Hd)||(a[Hd]=Gd++,Fd[a[Hd]]={});return Fd[a[Hd]]}function Jd(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function Kd(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Ld(a,b){var c=Kd(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Kd(c)}}function Md(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Md(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Nd(){for(var a=window,b=Jd();b instanceof a.HTMLIFrameElement;){try{a=b.contentDocument.defaultView}catch(c){break}b=Jd(a.document)}return b}function Od(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Pd(){var a=Nd();if(Od(a)){if(\"selectionStart\"in a)var b={start:a.selectionStart,end:a.selectionEnd};else a:{b=(b=a.ownerDocument)&&b.defaultView||window;var c=b.getSelection&&b.getSelection();if(c&&0!==c.rangeCount){b=c.anchorNode;var d=c.anchorOffset,e=c.focusNode;c=c.focusOffset;try{b.nodeType,e.nodeType}catch(A){b=null;break a}var f=0,g=-1,h=-1,l=0,k=0,m=a,p=null;b:for(;;){for(var t;;){m!==b||0!==d&&3!==m.nodeType||(g=f+d);m!==e||0!==c&&3!==m.nodeType||(h=f+c);3===m.nodeType&&(f+=m.nodeValue.length);\nif(null===(t=m.firstChild))break;p=m;m=t}for(;;){if(m===a)break b;p===b&&++l===d&&(g=f);p===e&&++k===c&&(h=f);if(null!==(t=m.nextSibling))break;m=p;p=m.parentNode}m=t}b=-1===g||-1===h?null:{start:g,end:h}}else b=null}b=b||{start:0,end:0}}else b=null;return{focusedElem:a,selectionRange:b}}\nfunction Qd(a){var b=Nd(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Md(c.ownerDocument.documentElement,c)){if(null!==d&&Od(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ld(c,f);var g=Ld(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Sd={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},Td=null,Ud=null,Vd=null,Wd=!1;\nfunction Xd(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(Wd||null==Td||Td!==Jd(c))return null;c=Td;\"selectionStart\"in c&&Od(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Vd&&dd(Vd,c)?null:(Vd=c,a=y.getPooled(Sd.select,Ud,a,b),a.type=\"select\",a.target=Td,Qa(a),a)}\nvar Yd={eventTypes:Sd,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=Id(e);f=sa.onSelect;for(var g=0;g=b.length?void 0:x(\"93\"),b=b[0]),c=b),null==c&&(c=\"\"));a._wrapperState={initialValue:uc(c)}}\nfunction de(a,b){var c=uc(b.value),d=uc(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function ee(a){var b=a.textContent;b===a._wrapperState.initialValue&&(a.value=b)}var fe={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction ge(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function he(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?ge(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar ie=void 0,je=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==fe.svg||\"innerHTML\"in a)a.innerHTML=b;else{ie=ie||document.createElement(\"div\");ie.innerHTML=\"\"+b+\"\";for(b=ie.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ke(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar le={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},me=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(le).forEach(function(a){me.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);le[b]=le[a]})});function ne(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||le.hasOwnProperty(a)&&le[a]?(\"\"+b).trim():b+\"px\"}\nfunction oe(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=ne(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var pe=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction qe(a,b){b&&(pe[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML?x(\"137\",a,\"\"):void 0),null!=b.dangerouslySetInnerHTML&&(null!=b.children?x(\"60\"):void 0,\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML?void 0:x(\"61\")),null!=b.style&&\"object\"!==typeof b.style?x(\"62\",\"\"):void 0)}\nfunction re(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}\nfunction se(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Id(a);b=sa[b];for(var d=0;dGe||(a.current=Fe[Ge],Fe[Ge]=null,Ge--)}function G(a,b){Ge++;Fe[Ge]=a.current;a.current=b}var He={},H={current:He},I={current:!1},Ie=He;\nfunction Je(a,b){var c=a.type.contextTypes;if(!c)return He;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function J(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Ke(a){F(I,a);F(H,a)}function Le(a){F(I,a);F(H,a)}\nfunction Me(a,b,c){H.current!==He?x(\"168\"):void 0;G(H,b,a);G(I,c,a)}function Ne(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)e in a?void 0:x(\"108\",ic(b)||\"Unknown\",e);return n({},c,d)}function Oe(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||He;Ie=H.current;G(H,b,a);G(I,I.current,a);return!0}\nfunction Pe(a,b,c){var d=a.stateNode;d?void 0:x(\"169\");c?(b=Ne(a,b,Ie),d.__reactInternalMemoizedMergedChildContext=b,F(I,a),F(H,a),G(H,b,a)):F(I,a);G(I,c,a)}var Qe=null,Re=null;function Se(a){return function(b){try{return a(b)}catch(c){}}}\nfunction Te(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Qe=Se(function(a){return b.onCommitFiberRoot(c,a)});Re=Se(function(a){return b.onCommitFiberUnmount(c,a)})}catch(d){}return!0}\nfunction Ue(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.contextDependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function K(a,b,c,d){return new Ue(a,b,c,d)}\nfunction Ve(a){a=a.prototype;return!(!a||!a.isReactComponent)}function We(a){if(\"function\"===typeof a)return Ve(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===cc)return 11;if(a===ec)return 14}return 2}\nfunction Xe(a,b){var c=a.alternate;null===c?(c=K(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;c.contextDependencies=a.contextDependencies;c.sibling=a.sibling;\nc.index=a.index;c.ref=a.ref;return c}\nfunction Ye(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)Ve(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case Xb:return Ze(c.children,e,f,b);case bc:return $e(c,e|3,f,b);case Yb:return $e(c,e|2,f,b);case Zb:return a=K(12,c,b,e|4),a.elementType=Zb,a.type=Zb,a.expirationTime=f,a;case dc:return a=K(13,c,b,e),a.elementType=dc,a.type=dc,a.expirationTime=f,a;default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case $b:g=10;break a;case ac:g=9;break a;case cc:g=11;break a;case ec:g=\n14;break a;case fc:g=16;d=null;break a}x(\"130\",null==a?a:typeof a,\"\")}b=K(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Ze(a,b,c,d){a=K(7,a,d,b);a.expirationTime=c;return a}function $e(a,b,c,d){a=K(8,a,d,b);b=0===(b&1)?Yb:bc;a.elementType=b;a.type=b;a.expirationTime=c;return a}function af(a,b,c){a=K(6,a,null,b);a.expirationTime=c;return a}\nfunction bf(a,b,c){b=K(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}function cf(a,b){a.didError=!1;var c=a.earliestPendingTime;0===c?a.earliestPendingTime=a.latestPendingTime=b:cb&&(a.latestPendingTime=b);df(b,a)}\nfunction ef(a,b){a.didError=!1;if(0===b)a.earliestPendingTime=0,a.latestPendingTime=0,a.earliestSuspendedTime=0,a.latestSuspendedTime=0,a.latestPingedTime=0;else{bb?a.earliestPendingTime=a.latestPendingTime=0:a.earliestPendingTime>b&&(a.earliestPendingTime=a.latestPendingTime));c=a.earliestSuspendedTime;0===c?cf(a,b):bc&&cf(a,b)}df(0,a)}function ff(a,b){a.didError=!1;a.latestPingedTime>=b&&(a.latestPingedTime=0);var c=a.earliestPendingTime,d=a.latestPendingTime;c===b?a.earliestPendingTime=d===b?a.latestPendingTime=0:d:d===b&&(a.latestPendingTime=c);c=a.earliestSuspendedTime;d=a.latestSuspendedTime;0===c?a.earliestSuspendedTime=a.latestSuspendedTime=b:cb&&(a.latestSuspendedTime=b);df(b,a)}\nfunction gf(a,b){var c=a.earliestPendingTime;a=a.earliestSuspendedTime;c>b&&(b=c);a>b&&(b=a);return b}function df(a,b){var c=b.earliestSuspendedTime,d=b.latestSuspendedTime,e=b.earliestPendingTime,f=b.latestPingedTime;e=0!==e?e:f;0===e&&(0===a||da&&(a=c);b.nextExpirationTimeToWorkOn=e;b.expirationTime=a}function L(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}\nfunction hf(a){var b=a._result;switch(a._status){case 1:return b;case 2:throw b;case 0:throw b;default:a._status=0;b=a._ctor;b=b();b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)});switch(a._status){case 1:return a._result;case 2:throw a._result;}a._result=b;throw b;}}var jf=(new aa.Component).refs;\nfunction kf(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}\nvar tf={isMounted:function(a){return(a=a._reactInternalFiber)?2===ed(a):!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=lf();d=mf(d,a);var e=nf(d);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);of();pf(a,e);qf(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=lf();d=mf(d,a);var e=nf(d);e.tag=rf;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);of();pf(a,e);qf(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=lf();c=mf(c,a);var d=nf(c);d.tag=\nsf;void 0!==b&&null!==b&&(d.callback=b);of();pf(a,d);qf(a,c)}};function uf(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!dd(c,d)||!dd(e,f):!0}\nfunction vf(a,b,c){var d=!1,e=He;var f=b.contextType;\"object\"===typeof f&&null!==f?f=M(f):(e=J(b)?Ie:H.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Je(a,e):He);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=tf;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction wf(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&tf.enqueueReplaceState(b,b.state,null)}\nfunction xf(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=jf;var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=M(f):(f=J(b)?Ie:H.current,e.context=Je(a,f));f=a.updateQueue;null!==f&&(yf(a,f,c,e,d),e.state=a.memoizedState);f=b.getDerivedStateFromProps;\"function\"===typeof f&&(kf(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==\ntypeof e.componentWillMount||(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&tf.enqueueReplaceState(e,e.state,null),f=a.updateQueue,null!==f&&(yf(a,f,c,e,d),e.state=a.memoizedState));\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var zf=Array.isArray;\nfunction Af(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;var d=void 0;c&&(1!==c.tag?x(\"309\"):void 0,d=c.stateNode);d?void 0:x(\"147\",a);var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===jf&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}\"string\"!==typeof a?x(\"284\"):void 0;c._owner?void 0:x(\"290\",a)}return a}\nfunction Bf(a,b){\"textarea\"!==a.type&&x(\"31\",\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\")}\nfunction Cf(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=Xe(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,du?(B=q,q=null):B=q.sibling;var w=t(e,q,h[u],k);if(null===w){null===q&&(q=B);break}a&&\nq&&null===w.alternate&&b(e,q);g=f(w,g,u);null===m?l=w:m.sibling=w;m=w;q=B}if(u===h.length)return c(e,q),l;if(null===q){for(;uu?(B=q,q=null):B=q.sibling;var v=t(e,q,w.value,k);if(null===v){q||(q=B);break}a&&q&&null===v.alternate&&b(e,q);g=f(v,g,u);null===m?l=v:m.sibling=v;m=v;q=B}if(w.done)return c(e,q),l;if(null===q){for(;!w.done;u++,w=h.next())w=p(e,w.value,k),null!==w&&(g=f(w,g,u),null===m?l=w:m.sibling=w,m=w);return l}for(q=d(e,q);!w.done;u++,w=h.next())w=A(q,e,u,w.value,k),null!==w&&(a&&null!==w.alternate&&q.delete(null===w.key?u:\nw.key),g=f(w,g,u),null===m?l=w:m.sibling=w,m=w);a&&q.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===Xb&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Vb:a:{l=f.key;for(k=d;null!==k;){if(k.key===l)if(7===k.tag?f.type===Xb:k.elementType===f.type){c(a,k.sibling);d=e(k,f.type===Xb?f.props.children:f.props,h);d.ref=Af(a,k,f);d.return=a;a=d;break a}else{c(a,k);break}else b(a,k);k=\nk.sibling}f.type===Xb?(d=Ze(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Ye(f.type,f.key,f.props,null,a.mode,h),h.ref=Af(a,d,f),h.return=a,a=h)}return g(a);case Wb:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=bf(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\n\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=a,a=d):(c(a,d),d=af(f,a.mode,h),d.return=a,a=d),g(a);if(zf(f))return v(a,d,f,h);if(hc(f))return R(a,d,f,h);l&&Bf(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 0:h=a.type,x(\"152\",h.displayName||h.name||\"Component\")}return c(a,d)}}var Df=Cf(!0),Ef=Cf(!1),Ff={},N={current:Ff},Gf={current:Ff},Hf={current:Ff};function If(a){a===Ff?x(\"174\"):void 0;return a}\nfunction Jf(a,b){G(Hf,b,a);G(Gf,a,a);G(N,Ff,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:he(null,\"\");break;default:c=8===c?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=he(b,c)}F(N,a);G(N,b,a)}function Kf(a){F(N,a);F(Gf,a);F(Hf,a)}function Lf(a){If(Hf.current);var b=If(N.current);var c=he(b,a.type);b!==c&&(G(Gf,a,a),G(N,c,a))}function Mf(a){Gf.current===a&&(F(N,a),F(Gf,a))}\nvar Nf=0,Of=2,Pf=4,Qf=8,Rf=16,Sf=32,Tf=64,Uf=128,Vf=Tb.ReactCurrentDispatcher,Wf=0,Xf=null,O=null,P=null,Yf=null,Q=null,Zf=null,$f=0,ag=null,bg=0,cg=!1,dg=null,eg=0;function fg(){x(\"307\")}function gg(a,b){if(null===b)return!1;for(var c=0;c$f&&($f=m)):f=l.eagerReducer===a?l.eagerState:a(f,l.action);g=l;l=l.next}while(null!==l&&l!==d);k||(h=g,e=f);bd(f,b.memoizedState)||(qg=!0);b.memoizedState=f;b.baseUpdate=h;b.baseState=e;c.eagerReducer=a;c.eagerState=f}return[b.memoizedState,c.dispatch]}\nfunction rg(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};null===ag?(ag={lastEffect:null},ag.lastEffect=a.next=a):(b=ag.lastEffect,null===b?ag.lastEffect=a.next=a:(c=b.next,b.next=a,a.next=c,ag.lastEffect=a));return a}function sg(a,b,c,d){var e=mg();bg|=a;e.memoizedState=rg(b,c,void 0,void 0===d?null:d)}\nfunction tg(a,b,c,d){var e=ng();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&gg(d,g.deps)){rg(Nf,c,f,d);return}}bg|=a;e.memoizedState=rg(b,c,f,d)}function ug(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function vg(){}\nfunction wg(a,b,c){25>eg?void 0:x(\"301\");var d=a.alternate;if(a===Xf||null!==d&&d===Xf)if(cg=!0,a={expirationTime:Wf,action:c,eagerReducer:null,eagerState:null,next:null},null===dg&&(dg=new Map),c=dg.get(b),void 0===c)dg.set(b,a);else{for(b=c;null!==b.next;)b=b.next;b.next=a}else{of();var e=lf();e=mf(e,a);var f={expirationTime:e,action:c,eagerReducer:null,eagerState:null,next:null},g=b.last;if(null===g)f.next=f;else{var h=g.next;null!==h&&(f.next=h);g.next=f}b.last=f;if(0===a.expirationTime&&(null===\nd||0===d.expirationTime)&&(d=b.eagerReducer,null!==d))try{var l=b.eagerState,k=d(l,c);f.eagerReducer=d;f.eagerState=k;if(bd(k,l))return}catch(m){}finally{}qf(a,e)}}\nvar kg={readContext:M,useCallback:fg,useContext:fg,useEffect:fg,useImperativeHandle:fg,useLayoutEffect:fg,useMemo:fg,useReducer:fg,useRef:fg,useState:fg,useDebugValue:fg},ig={readContext:M,useCallback:function(a,b){mg().memoizedState=[a,void 0===b?null:b];return a},useContext:M,useEffect:function(a,b){return sg(516,Uf|Tf,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return sg(4,Pf|Sf,ug.bind(null,b,a),c)},useLayoutEffect:function(a,b){return sg(4,Pf|Sf,a,b)},\nuseMemo:function(a,b){var c=mg();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=mg();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={last:null,dispatch:null,eagerReducer:a,eagerState:b};a=a.dispatch=wg.bind(null,Xf,a);return[d.memoizedState,a]},useRef:function(a){var b=mg();a={current:a};return b.memoizedState=a},useState:function(a){var b=mg();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={last:null,dispatch:null,eagerReducer:og,\neagerState:a};a=a.dispatch=wg.bind(null,Xf,a);return[b.memoizedState,a]},useDebugValue:vg},jg={readContext:M,useCallback:function(a,b){var c=ng();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&gg(b,d[1]))return d[0];c.memoizedState=[a,b];return a},useContext:M,useEffect:function(a,b){return tg(516,Uf|Tf,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return tg(4,Pf|Sf,ug.bind(null,b,a),c)},useLayoutEffect:function(a,b){return tg(4,Pf|Sf,a,b)},\nuseMemo:function(a,b){var c=ng();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&gg(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a},useReducer:pg,useRef:function(){return ng().memoizedState},useState:function(a){return pg(og,a)},useDebugValue:vg},xg=null,yg=null,zg=!1;\nfunction Ag(a,b){var c=K(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function Bg(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction Cg(a){if(zg){var b=yg;if(b){var c=b;if(!Bg(a,b)){b=De(c);if(!b||!Bg(a,b)){a.effectTag|=2;zg=!1;xg=a;return}Ag(xg,c)}xg=a;yg=Ee(b)}else a.effectTag|=2,zg=!1,xg=a}}function Dg(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&18!==a.tag;)a=a.return;xg=a}function Eg(a){if(a!==xg)return!1;if(!zg)return Dg(a),zg=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!xe(b,a.memoizedProps))for(b=yg;b;)Ag(a,b),b=De(b);Dg(a);yg=xg?De(a.stateNode):null;return!0}function Fg(){yg=xg=null;zg=!1}\nvar Gg=Tb.ReactCurrentOwner,qg=!1;function S(a,b,c,d){b.child=null===a?Ef(b,null,c,d):Df(b,a.child,c,d)}function Hg(a,b,c,d,e){c=c.render;var f=b.ref;Ig(b,e);d=hg(a,b,c,d,f,e);if(null!==a&&!qg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),Jg(a,b,e);b.effectTag|=1;S(a,b,d,e);return b.child}\nfunction Kg(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!Ve(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,Lg(a,b,g,d,e,f);a=Ye(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e=c)return Sg(a,b,c);b=Jg(a,b,c);return null!==b?b.sibling:null}}return Jg(a,b,c)}}else qg=!1;b.expirationTime=0;switch(b.tag){case 2:d=\nb.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;var e=Je(b,H.current);Ig(b,c);e=hg(null,b,d,a,e,c);b.effectTag|=1;if(\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;lg();if(J(d)){var f=!0;Oe(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;var g=d.getDerivedStateFromProps;\"function\"===typeof g&&kf(b,d,g,a);e.updater=tf;b.stateNode=e;e._reactInternalFiber=b;xf(b,d,a,c);b=Qg(null,b,d,!0,f,\nc)}else b.tag=0,S(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);f=b.pendingProps;a=hf(e);b.type=a;e=b.tag=We(a);f=L(a,f);g=void 0;switch(e){case 0:g=Mg(null,b,a,f,c);break;case 1:g=Og(null,b,a,f,c);break;case 11:g=Hg(null,b,a,f,c);break;case 14:g=Kg(null,b,a,L(a.type,f),d,c);break;default:x(\"306\",a,\"\")}return g;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:L(d,e),Mg(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,\ne=b.elementType===d?e:L(d,e),Og(a,b,d,e,c);case 3:Rg(b);d=b.updateQueue;null===d?x(\"282\"):void 0;e=b.memoizedState;e=null!==e?e.element:null;yf(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)Fg(),b=Jg(a,b,c);else{e=b.stateNode;if(e=(null===a||null===a.child)&&e.hydrate)yg=Ee(b.stateNode.containerInfo),xg=b,e=zg=!0;e?(b.effectTag|=2,b.child=Ef(b,null,d,c)):(S(a,b,d,c),Fg());b=b.child}return b;case 5:return Lf(b),null===a&&Cg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,\ng=e.children,xe(d,e)?g=null:null!==f&&xe(d,f)&&(b.effectTag|=16),Ng(a,b),1!==c&&b.mode&1&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(S(a,b,g,c),b=b.child),b;case 6:return null===a&&Cg(b),null;case 13:return Sg(a,b,c);case 4:return Jf(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Df(b,null,d,c):S(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:L(d,e),Hg(a,b,d,e,c);case 7:return S(a,b,b.pendingProps,c),b.child;case 8:return S(a,b,b.pendingProps.children,\nc),b.child;case 12:return S(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;Ug(b,f);if(null!==g){var h=g.value;f=bd(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!I.current){b=Jg(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var l=h.contextDependencies;if(null!==l){g=h.child;for(var k=l.first;null!==k;){if(k.context===d&&0!==\n(k.observedBits&f)){1===h.tag&&(k=nf(c),k.tag=sf,pf(h,k));h.expirationTime=b&&(qg=!0);a.contextDependencies=null}\nfunction M(a,b){if(Yg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)Yg=a,b=1073741823;b={context:a,observedBits:b,next:null};null===Xg?(null===Wg?x(\"308\"):void 0,Xg=b,Wg.contextDependencies={first:b,expirationTime:0}):Xg=Xg.next=b}return a._currentValue}var $g=0,rf=1,sf=2,ah=3,Pg=!1;function bh(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}\nfunction ch(a){return{baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function nf(a){return{expirationTime:a,tag:$g,payload:null,callback:null,next:null,nextEffect:null}}function dh(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}\nfunction pf(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=bh(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=bh(a.memoizedState),e=c.updateQueue=bh(c.memoizedState)):d=a.updateQueue=ch(e):null===e&&(e=c.updateQueue=ch(d));null===e||d===e?dh(d,b):null===d.lastUpdate||null===e.lastUpdate?(dh(d,b),dh(e,b)):(dh(d,b),e.lastUpdate=b)}\nfunction eh(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=bh(a.memoizedState):fh(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=b,c.lastCapturedUpdate=b)}function fh(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=ch(b));return b}\nfunction gh(a,b,c,d,e,f){switch(c.tag){case rf:return a=c.payload,\"function\"===typeof a?a.call(f,d,e):a;case ah:a.effectTag=a.effectTag&-2049|64;case $g:a=c.payload;e=\"function\"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return n({},d,e);case sf:Pg=!0}return d}\nfunction yf(a,b,c,d,e){Pg=!1;b=fh(a,b);for(var f=b.baseState,g=null,h=0,l=b.firstUpdate,k=f;null!==l;){var m=l.expirationTime;md?e:d);Ih.current=null;d=void 0;1c?b:c;0===b&&(Fh=null);$h(a,b)}\nfunction ai(a){for(;;){var b=a.alternate,c=a.return,d=a.sibling;if(0===(a.effectTag&1024)){T=a;a:{var e=b;b=a;var f=U;var g=b.pendingProps;switch(b.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:J(b.type)&&Ke(b);break;case 3:Kf(b);Le(b);g=b.stateNode;g.pendingContext&&(g.context=g.pendingContext,g.pendingContext=null);if(null===e||null===e.child)Eg(b),b.effectTag&=-3;mh(b);break;case 5:Mf(b);var h=If(Hf.current);f=b.type;if(null!==e&&null!=b.stateNode)nh(e,b,f,g,h),e.ref!==b.ref&&(b.effectTag|=\n128);else if(g){var l=If(N.current);if(Eg(b)){g=b;e=g.stateNode;var k=g.type,m=g.memoizedProps,p=h;e[Fa]=g;e[Ga]=m;f=void 0;h=k;switch(h){case \"iframe\":case \"object\":E(\"load\",e);break;case \"video\":case \"audio\":for(k=0;k\\x3c/script>\",k=e.removeChild(e.firstChild)):\"string\"===typeof p.is?k=k.createElement(e,{is:p.is}):(k=k.createElement(e),\"select\"===e&&p.multiple&&(k.multiple=!0)):k=k.createElementNS(l,e);e=k;e[Fa]=m;e[Ga]=g;lh(e,b,!1,!1);p=e;k=f;m=g;var t=h,A=re(k,m);switch(k){case \"iframe\":case \"object\":E(\"load\",\np);h=m;break;case \"video\":case \"audio\":for(h=0;hg&&(g=e),h>g&&(g=h),f=f.sibling;b.childExpirationTime=g}if(null!==T)return T;null!==c&&0===(c.effectTag&1024)&&(null===c.firstEffect&&\n(c.firstEffect=a.firstEffect),null!==a.lastEffect&&(null!==c.lastEffect&&(c.lastEffect.nextEffect=a.firstEffect),c.lastEffect=a.lastEffect),1=v)t=0;else if(-1===t||v component higher in the tree to provide a loading indicator or placeholder to display.\"+jc(k))}Nh=!0;m=jh(m,k);h=l;do{switch(h.tag){case 3:h.effectTag|=2048;h.expirationTime=g;g=Ch(h,m,g);eh(h,g);break a;case 1:if(t=m,A=h.type,k=h.stateNode,0===(h.effectTag&64)&&(\"function\"===typeof A.getDerivedStateFromError||null!==k&&\"function\"===typeof k.componentDidCatch&&(null===Fh||!Fh.has(k)))){h.effectTag|=2048;\nh.expirationTime=g;g=Eh(h,t,g);eh(h,g);break a}}h=h.return}while(null!==h)}T=ai(f);continue}}}break}while(1);Kh=!1;Hh.current=c;Yg=Xg=Wg=null;lg();if(e)Lh=null,a.finishedWork=null;else if(null!==T)a.finishedWork=null;else{c=a.current.alternate;null===c?x(\"281\"):void 0;Lh=null;if(Nh){e=a.latestPendingTime;f=a.latestSuspendedTime;g=a.latestPingedTime;if(0!==e&&eb?0:b)):(a.pendingCommitExpirationTime=d,a.finishedWork=c)}}\nfunction sh(a,b){for(var c=a.return;null!==c;){switch(c.tag){case 1:var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Fh||!Fh.has(d))){a=jh(b,a);a=Eh(c,a,1073741823);pf(c,a);qf(c,1073741823);return}break;case 3:a=jh(b,a);a=Ch(c,a,1073741823);pf(c,a);qf(c,1073741823);return}c=c.return}3===a.tag&&(c=jh(b,a),c=Ch(a,c,1073741823),pf(a,c),qf(a,1073741823))}\nfunction mf(a,b){var c=r.unstable_getCurrentPriorityLevel(),d=void 0;if(0===(b.mode&1))d=1073741823;else if(Kh&&!Oh)d=U;else{switch(c){case r.unstable_ImmediatePriority:d=1073741823;break;case r.unstable_UserBlockingPriority:d=1073741822-10*(((1073741822-a+15)/10|0)+1);break;case r.unstable_NormalPriority:d=1073741822-25*(((1073741822-a+500)/25|0)+1);break;case r.unstable_LowPriority:case r.unstable_IdlePriority:d=1;break;default:x(\"313\")}null!==Lh&&d===U&&--d}c===r.unstable_UserBlockingPriority&&\n(0===gi||d=d){a.didError=!1;b=a.latestPingedTime;if(0===b||b>c)a.latestPingedTime=c;df(c,a);c=a.expirationTime;0!==c&&Xh(a,c)}}function Ah(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=lf();b=mf(b,a);a=hi(a,b);null!==a&&(cf(a,b),b=a.expirationTime,0!==b&&Xh(a,b))}\nfunction hi(a,b){a.expirationTimeU&&Sh(),cf(a,b),Kh&&!Oh&&Lh===a||Xh(a,a.expirationTime),ii>ji&&(ii=0,x(\"185\")))}function ki(a,b,c,d,e){return r.unstable_runWithPriority(r.unstable_ImmediatePriority,function(){return a(b,c,d,e)})}var li=null,Y=null,mi=0,ni=void 0,W=!1,oi=null,Z=0,gi=0,pi=!1,qi=null,X=!1,ri=!1,si=null,ti=r.unstable_now(),ui=1073741822-(ti/10|0),vi=ui,ji=50,ii=0,wi=null;function xi(){ui=1073741822-((r.unstable_now()-ti)/10|0)}\nfunction yi(a,b){if(0!==mi){if(ba.expirationTime&&(a.expirationTime=b);W||(X?ri&&(oi=a,Z=1073741823,Di(a,1073741823,!1)):1073741823===b?Yh(1073741823,!1):yi(a,b))}\nfunction Ci(){var a=0,b=null;if(null!==Y)for(var c=Y,d=li;null!==d;){var e=d.expirationTime;if(0===e){null===c||null===Y?x(\"244\"):void 0;if(d===d.nextScheduledRoot){li=Y=d.nextScheduledRoot=null;break}else if(d===li)li=e=d.nextScheduledRoot,Y.nextScheduledRoot=e,d.nextScheduledRoot=null;else if(d===Y){Y=c;Y.nextScheduledRoot=li;d.nextScheduledRoot=null;break}else c.nextScheduledRoot=d.nextScheduledRoot,d.nextScheduledRoot=null;d=c.nextScheduledRoot}else{e>a&&(a=e,b=d);if(d===Y)break;if(1073741823===\na)break;c=d;d=d.nextScheduledRoot}}oi=b;Z=a}var Ei=!1;function di(){return Ei?!0:r.unstable_shouldYield()?Ei=!0:!1}function zi(){try{if(!di()&&null!==li){xi();var a=li;do{var b=a.expirationTime;0!==b&&ui<=b&&(a.nextExpirationTimeToWorkOn=ui);a=a.nextScheduledRoot}while(a!==li)}Yh(0,!0)}finally{Ei=!1}}\nfunction Yh(a,b){Ci();if(b)for(xi(),vi=ui;null!==oi&&0!==Z&&a<=Z&&!(Ei&&ui>Z);)Di(oi,Z,ui>Z),Ci(),xi(),vi=ui;else for(;null!==oi&&0!==Z&&a<=Z;)Di(oi,Z,!1),Ci();b&&(mi=0,ni=null);0!==Z&&yi(oi,Z);ii=0;wi=null;if(null!==si)for(a=si,si=null,b=0;b=c&&(null===si?si=[d]:si.push(d),d._defer)){a.finishedWork=b;a.expirationTime=0;return}a.finishedWork=null;a===wi?ii++:(wi=a,ii=0);r.unstable_runWithPriority(r.unstable_ImmediatePriority,function(){Zh(a,b)})}function Dh(a){null===oi?x(\"246\"):void 0;oi.expirationTime=0;pi||(pi=!0,qi=a)}function Gi(a,b){var c=X;X=!0;try{return a(b)}finally{(X=c)||W||Yh(1073741823,!1)}}\nfunction Hi(a,b){if(X&&!ri){ri=!0;try{return a(b)}finally{ri=!1}}return a(b)}function Ii(a,b,c){X||W||0===gi||(Yh(gi,!1),gi=0);var d=X;X=!0;try{return r.unstable_runWithPriority(r.unstable_UserBlockingPriority,function(){return a(b,c)})}finally{(X=d)||W||Yh(1073741823,!1)}}\nfunction Ji(a,b,c,d,e){var f=b.current;a:if(c){c=c._reactInternalFiber;b:{2===ed(c)&&1===c.tag?void 0:x(\"170\");var g=c;do{switch(g.tag){case 3:g=g.stateNode.context;break b;case 1:if(J(g.type)){g=g.stateNode.__reactInternalMemoizedMergedChildContext;break b}}g=g.return}while(null!==g);x(\"171\");g=void 0}if(1===c.tag){var h=c.type;if(J(h)){c=Ne(c,h,g);break a}}c=g}else c=He;null===b.context?b.context=c:b.pendingContext=c;b=e;e=nf(d);e.payload={element:a};b=void 0===b?null:b;null!==b&&(e.callback=b);\nof();pf(f,e);qf(f,d);return d}function Ki(a,b,c,d){var e=b.current,f=lf();e=mf(f,e);return Ji(a,b,c,e,d)}function Li(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function Mi(a,b,c){var d=3=Jh&&(b=Jh-1);this._expirationTime=Jh=b;this._root=a;this._callbacks=this._next=null;this._hasChildren=this._didComplete=!1;this._children=null;this._defer=!0}Ni.prototype.render=function(a){this._defer?void 0:x(\"250\");this._hasChildren=!0;this._children=a;var b=this._root._internalRoot,c=this._expirationTime,d=new Oi;Ji(a,b,null,c,d._onCommit);return d};\nNi.prototype.then=function(a){if(this._didComplete)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nNi.prototype.commit=function(){var a=this._root._internalRoot,b=a.firstBatch;this._defer&&null!==b?void 0:x(\"251\");if(this._hasChildren){var c=this._expirationTime;if(b!==this){this._hasChildren&&(c=this._expirationTime=b._expirationTime,this.render(this._children));for(var d=null,e=b;e!==this;)d=e,e=e._next;null===d?x(\"251\"):void 0;d._next=e._next;this._next=b;a.firstBatch=this}this._defer=!1;Bi(a,c);b=this._next;this._next=null;b=a.firstBatch=b;null!==b&&b._hasChildren&&b.render(b._children)}else this._next=\nnull,this._defer=!1};Ni.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var a=this._callbacks;if(null!==a)for(var b=0;b=b;)c=d,d=d._next;a._next=d;null!==c&&(c._next=a)}return a};function Qi(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}Gb=Gi;Hb=Ii;Ib=function(){W||0===gi||(Yh(gi,!1),gi=0)};\nfunction Ri(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new Pi(a,!1,b)}\nfunction Si(a,b,c,d,e){var f=c._reactRootContainer;if(f){if(\"function\"===typeof e){var g=e;e=function(){var a=Li(f._internalRoot);g.call(a)}}null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)}else{f=c._reactRootContainer=Ri(c,d);if(\"function\"===typeof e){var h=e;e=function(){var a=Li(f._internalRoot);h.call(a)}}Hi(function(){null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)})}return Li(f._internalRoot)}\nfunction Ti(a,b){var c=2 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var currTime = -1;\n\n var shouldUpdate = function shouldUpdate(now) {\n if (currTime < 0) {\n currTime = now;\n }\n\n if (now - currTime > timeout) {\n callback(now);\n currTime = -1;\n } else {\n raf(shouldUpdate);\n }\n };\n\n raf(shouldUpdate);\n}", + "function _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nimport setRafTimeout from './setRafTimeout';\nexport default function createAnimateManager() {\n var currStyle = {};\n\n var handleChange = function handleChange() {\n return null;\n };\n\n var shouldStop = false;\n\n var setStyle = function setStyle(_style) {\n if (shouldStop) {\n return;\n }\n\n if (Array.isArray(_style)) {\n if (!_style.length) {\n return;\n }\n\n var styles = _style;\n\n var _styles = _toArray(styles),\n curr = _styles[0],\n restStyles = _styles.slice(1);\n\n if (typeof curr === 'number') {\n setRafTimeout(setStyle.bind(null, restStyles), curr);\n return;\n }\n\n setStyle(curr);\n setRafTimeout(setStyle.bind(null, restStyles));\n return;\n }\n\n if (_typeof(_style) === 'object') {\n currStyle = _style;\n handleChange(currStyle);\n }\n\n if (typeof _style === 'function') {\n _style();\n }\n };\n\n return {\n stop: function stop() {\n shouldStop = true;\n },\n start: function start(style) {\n shouldStop = false;\n setStyle(style);\n },\n subscribe: function subscribe(_handleChange) {\n handleChange = _handleChange;\n return function () {\n handleChange = function handleChange() {\n return null;\n };\n };\n }\n };\n}", + "import _isPlainObject from \"lodash/isPlainObject\";\nimport _isEqual from \"lodash/isEqual\";\nimport _isArray from \"lodash/isArray\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction shallowEqual(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (_typeof(objA) !== 'object' || objA === null || _typeof(objB) !== 'object' || objB === null) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n var bHasOwnProperty = hasOwnProperty.bind(objB);\n\n for (var i = 0; i < keysA.length; i++) {\n var keyA = keysA[i];\n\n if (objA[keyA] === objB[keyA]) {\n continue;\n } // special diff with Array or Object\n\n\n if (_isArray(objA[keyA])) {\n if (!_isArray(objB[keyA]) || objA[keyA].length !== objB[keyA].length) {\n return false;\n } else if (!_isEqual(objA[keyA], objB[keyA])) {\n return false;\n }\n } else if (_isPlainObject(objA[keyA])) {\n if (!_isPlainObject(objB[keyA]) || !_isEqual(objA[keyA], objB[keyA])) {\n return false;\n }\n } else if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction shallowCompare(instance, nextProps, nextState) {\n return !shallowEqual(instance.props, nextProps) || !shallowEqual(instance.state, nextState);\n}\n\nfunction shouldComponentUpdate(nextProps, nextState) {\n return shallowCompare(this, nextProps, nextState);\n}\n/* eslint-disable no-param-reassign */\n\n\nfunction pureRenderDecorator(component) {\n component.prototype.shouldComponentUpdate = shouldComponentUpdate;\n}\n\nexport { shallowEqual };\nexport default pureRenderDecorator;", + "import _intersection from \"lodash/intersection\";\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/* eslint no-console: 0 */\nvar PREFIX_LIST = ['Webkit', 'Moz', 'O', 'ms'];\nvar IN_LINE_PREFIX_LIST = ['-webkit-', '-moz-', '-o-', '-ms-'];\nvar IN_COMPATIBLE_PROPERTY = ['transform', 'transformOrigin', 'transition'];\nexport var getIntersectionKeys = function getIntersectionKeys(preObj, nextObj) {\n return _intersection(Object.keys(preObj), Object.keys(nextObj));\n};\nexport var identity = function identity(param) {\n return param;\n};\n/*\n * @description: convert camel case to dash case\n * string => string\n */\n\nexport var getDashCase = function getDashCase(name) {\n return name.replace(/([A-Z])/g, function (v) {\n return \"-\".concat(v.toLowerCase());\n });\n};\n/*\n * @description: add compatible style prefix\n * (string, string) => object\n */\n\nexport var generatePrefixStyle = function generatePrefixStyle(name, value) {\n if (IN_COMPATIBLE_PROPERTY.indexOf(name) === -1) {\n return _defineProperty({}, name, value);\n }\n\n var isTransition = name === 'transition';\n var camelName = name.replace(/(\\w)/, function (v) {\n return v.toUpperCase();\n });\n var styleVal = value;\n return PREFIX_LIST.reduce(function (result, property, i) {\n if (isTransition) {\n styleVal = value.replace(/(transform|transform-origin)/gim, \"\".concat(IN_LINE_PREFIX_LIST[i], \"$1\"));\n }\n\n return _objectSpread({}, result, _defineProperty({}, property + camelName, styleVal));\n }, {});\n};\nexport var log = function log() {\n var _console;\n\n (_console = console).log.apply(_console, arguments);\n};\n/*\n * @description: log the value of a varible\n * string => any => any\n */\n\nexport var debug = function debug(name) {\n return function (item) {\n log(name, item);\n return item;\n };\n};\n/*\n * @description: log name, args, return value of a function\n * function => function\n */\n\nexport var debugf = function debugf(tag, f) {\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var res = f.apply(void 0, args);\n var name = tag || f.name || 'anonymous function';\n var argNames = \"(\".concat(args.map(JSON.stringify).join(', '), \")\");\n log(\"\".concat(name, \": \").concat(argNames, \" => \").concat(JSON.stringify(res)));\n return res;\n };\n};\n/*\n * @description: map object on every element in this object.\n * (function, object) => object\n */\n\nexport var mapObject = function mapObject(fn, obj) {\n return Object.keys(obj).reduce(function (res, key) {\n return _objectSpread({}, res, _defineProperty({}, key, fn(key, obj[key])));\n }, {});\n};\n/*\n * @description: add compatible prefix to style\n * object => object\n */\n\nexport var translateStyle = function translateStyle(style) {\n return Object.keys(style).reduce(function (res, key) {\n return _objectSpread({}, res, generatePrefixStyle(key, res[key]));\n }, style);\n};\nexport var compose = function compose() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n if (!args.length) {\n return identity;\n }\n\n var fns = args.reverse(); // first function can receive multiply arguments\n\n var firstFn = fns[0];\n var tailsFn = fns.slice(1);\n return function () {\n return tailsFn.reduce(function (res, fn) {\n return fn(res);\n }, firstFn.apply(void 0, arguments));\n };\n};\nexport var getTransitionVal = function getTransitionVal(props, duration, easing) {\n return props.map(function (prop) {\n return \"\".concat(getDashCase(prop), \" \").concat(duration, \"ms \").concat(easing);\n }).join(',');\n};\nvar isDev = process.env.NODE_ENV !== 'production';\nexport var warn = function warn(condition, format, a, b, c, d, e, f) {\n if (isDev && typeof console !== 'undefined' && console.warn) {\n if (format === undefined) {\n console.warn('LogUtils requires an error message argument');\n }\n\n if (!condition) {\n if (format === undefined) {\n console.warn('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n console.warn(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n }\n }\n }\n};", + "function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nimport { warn } from './util';\nvar ACCURACY = 1e-4;\n\nvar cubicBezierFactor = function cubicBezierFactor(c1, c2) {\n return [0, 3 * c1, 3 * c2 - 6 * c1, 3 * c1 - 3 * c2 + 1];\n};\n\nvar multyTime = function multyTime(params, t) {\n return params.map(function (param, i) {\n return param * Math.pow(t, i);\n }).reduce(function (pre, curr) {\n return pre + curr;\n });\n};\n\nvar cubicBezier = function cubicBezier(c1, c2) {\n return function (t) {\n var params = cubicBezierFactor(c1, c2);\n return multyTime(params, t);\n };\n};\n\nvar derivativeCubicBezier = function derivativeCubicBezier(c1, c2) {\n return function (t) {\n var params = cubicBezierFactor(c1, c2);\n\n var newParams = _toConsumableArray(params.map(function (param, i) {\n return param * i;\n }).slice(1)).concat([0]);\n\n return multyTime(newParams, t);\n };\n}; // calculate cubic-bezier using Newton's method\n\n\nexport var configBezier = function configBezier() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var x1 = args[0],\n y1 = args[1],\n x2 = args[2],\n y2 = args[3];\n\n if (args.length === 1) {\n switch (args[0]) {\n case 'linear':\n x1 = 0.0;\n y1 = 0.0;\n x2 = 1.0;\n y2 = 1.0;\n break;\n\n case 'ease':\n x1 = 0.25;\n y1 = 0.1;\n x2 = 0.25;\n y2 = 1.0;\n break;\n\n case 'ease-in':\n x1 = 0.42;\n y1 = 0.0;\n x2 = 1.0;\n y2 = 1.0;\n break;\n\n case 'ease-out':\n x1 = 0.42;\n y1 = 0.0;\n x2 = 0.58;\n y2 = 1.0;\n break;\n\n case 'ease-in-out':\n x1 = 0.0;\n y1 = 0.0;\n x2 = 0.58;\n y2 = 1.0;\n break;\n\n default:\n warn(false, '[configBezier]: arguments should be one of ' + 'oneOf \\'linear\\', \\'ease\\', \\'ease-in\\', \\'ease-out\\', ' + '\\'ease-in-out\\', instead received %s', args);\n }\n }\n\n warn([x1, x2, y1, y2].every(function (num) {\n return typeof num === 'number' && num >= 0 && num <= 1;\n }), '[configBezier]: arguments should be x1, y1, x2, y2 of [0, 1] instead received %s', args);\n var curveX = cubicBezier(x1, x2);\n var curveY = cubicBezier(y1, y2);\n var derCurveX = derivativeCubicBezier(x1, x2);\n\n var rangeValue = function rangeValue(value) {\n if (value > 1) {\n return 1;\n } else if (value < 0) {\n return 0;\n }\n\n return value;\n };\n\n var bezier = function bezier(_t) {\n var t = _t > 1 ? 1 : _t;\n var x = t;\n\n for (var i = 0; i < 8; ++i) {\n var evalT = curveX(x) - t;\n var derVal = derCurveX(x);\n\n if (Math.abs(evalT - t) < ACCURACY || derVal < ACCURACY) {\n return curveY(x);\n }\n\n x = rangeValue(x - evalT / derVal);\n }\n\n return curveY(x);\n };\n\n bezier.isStepper = false;\n return bezier;\n};\nexport var configSpring = function configSpring() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _config$stiff = config.stiff,\n stiff = _config$stiff === void 0 ? 100 : _config$stiff,\n _config$damping = config.damping,\n damping = _config$damping === void 0 ? 8 : _config$damping,\n _config$dt = config.dt,\n dt = _config$dt === void 0 ? 17 : _config$dt;\n\n var stepper = function stepper(currX, destX, currV) {\n var FSpring = -(currX - destX) * stiff;\n var FDamping = currV * damping;\n var newV = currV + (FSpring - FDamping) * dt / 1000;\n var newX = currV * dt / 1000 + currX;\n\n if (Math.abs(newX - destX) < ACCURACY && Math.abs(newV) < ACCURACY) {\n return [destX, 0];\n }\n\n return [newX, newV];\n };\n\n stepper.isStepper = true;\n stepper.dt = dt;\n return stepper;\n};\nexport var configEasing = function configEasing() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var easing = args[0];\n\n if (typeof easing === 'string') {\n switch (easing) {\n case 'ease':\n case 'ease-in-out':\n case 'ease-out':\n case 'ease-in':\n case 'linear':\n return configBezier(easing);\n\n case 'spring':\n return configSpring();\n\n default:\n warn(false, '[configEasing]: first argument should be one of \\'ease\\', \\'ease-in\\', ' + '\\'ease-out\\', \\'ease-in-out\\', \\'linear\\' and \\'spring\\', instead received %s', args);\n }\n }\n\n if (typeof easing === 'function') {\n return easing;\n }\n\n warn(false, '[configEasing]: first argument type should be function or ' + 'string, instead received %s', args);\n return null;\n};", + "import _filter from \"lodash/filter\";\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nimport raf, { cancel as caf } from 'raf';\nimport { getIntersectionKeys, mapObject } from './util';\n\nvar alpha = function alpha(begin, end, k) {\n return begin + (end - begin) * k;\n};\n\nvar needContinue = function needContinue(_ref) {\n var from = _ref.from,\n to = _ref.to;\n return from !== to;\n};\n/*\n * @description: cal new from value and velocity in each stepper\n * @return: { [styleProperty]: { from, to, velocity } }\n */\n\n\nvar calStepperVals = function calStepperVals(easing, preVals, steps) {\n var nextStepVals = mapObject(function (key, val) {\n if (needContinue(val)) {\n var _easing = easing(val.from, val.to, val.velocity),\n _easing2 = _slicedToArray(_easing, 2),\n newX = _easing2[0],\n newV = _easing2[1];\n\n return _objectSpread({}, val, {\n from: newX,\n velocity: newV\n });\n }\n\n return val;\n }, preVals);\n\n if (steps < 1) {\n return mapObject(function (key, val) {\n if (needContinue(val)) {\n return _objectSpread({}, val, {\n velocity: alpha(val.velocity, nextStepVals[key].velocity, steps),\n from: alpha(val.from, nextStepVals[key].from, steps)\n });\n }\n\n return val;\n }, preVals);\n }\n\n return calStepperVals(easing, nextStepVals, steps - 1);\n}; // configure update function\n\n\nexport default (function (from, to, easing, duration, render) {\n var interKeys = getIntersectionKeys(from, to);\n var timingStyle = interKeys.reduce(function (res, key) {\n return _objectSpread({}, res, _defineProperty({}, key, [from[key], to[key]]));\n }, {});\n var stepperStyle = interKeys.reduce(function (res, key) {\n return _objectSpread({}, res, _defineProperty({}, key, {\n from: from[key],\n velocity: 0,\n to: to[key]\n }));\n }, {});\n var cafId = -1;\n var preTime;\n var beginTime;\n\n var update = function update() {\n return null;\n };\n\n var getCurrStyle = function getCurrStyle() {\n return mapObject(function (key, val) {\n return val.from;\n }, stepperStyle);\n };\n\n var shouldStopAnimation = function shouldStopAnimation() {\n return !_filter(stepperStyle, needContinue).length;\n }; // stepper timing function like spring\n\n\n var stepperUpdate = function stepperUpdate(now) {\n if (!preTime) {\n preTime = now;\n }\n\n var deltaTime = now - preTime;\n var steps = deltaTime / easing.dt;\n stepperStyle = calStepperVals(easing, stepperStyle, steps); // get union set and add compatible prefix\n\n render(_objectSpread({}, from, to, getCurrStyle(stepperStyle)));\n preTime = now;\n\n if (!shouldStopAnimation()) {\n cafId = raf(update);\n }\n }; // t => val timing function like cubic-bezier\n\n\n var timingUpdate = function timingUpdate(now) {\n if (!beginTime) {\n beginTime = now;\n }\n\n var t = (now - beginTime) / duration;\n var currStyle = mapObject(function (key, val) {\n return alpha.apply(void 0, _toConsumableArray(val).concat([easing(t)]));\n }, timingStyle); // get union set and add compatible prefix\n\n render(_objectSpread({}, from, to, currStyle));\n\n if (t < 1) {\n cafId = raf(update);\n } else {\n var finalStyle = mapObject(function (key, val) {\n return alpha.apply(void 0, _toConsumableArray(val).concat([easing(1)]));\n }, timingStyle);\n render(_objectSpread({}, from, to, finalStyle));\n }\n };\n\n update = easing.isStepper ? stepperUpdate : timingUpdate; // return start animation method\n\n return function () {\n raf(update); // return stop animation method\n\n return function () {\n caf(cafId);\n };\n };\n});", + "import _isEqual from \"lodash/isEqual\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nimport React, { Component, cloneElement, Children } from 'react';\nimport PropTypes from 'prop-types';\nimport createAnimateManager from './AnimateManager';\nimport pureRender from './PureRender';\nimport { configEasing } from './easing';\nimport configUpdate from './configUpdate';\nimport { getTransitionVal, identity, translateStyle } from './util';\n\nvar Animate = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Animate, _Component);\n\n function Animate(props, context) {\n var _this;\n\n _classCallCheck(this, Animate);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Animate).call(this, props, context));\n var _this$props = _this.props,\n isActive = _this$props.isActive,\n attributeName = _this$props.attributeName,\n from = _this$props.from,\n to = _this$props.to,\n steps = _this$props.steps,\n children = _this$props.children;\n _this.handleStyleChange = _this.handleStyleChange.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.changeStyle = _this.changeStyle.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n\n if (!isActive) {\n _this.state = {\n style: {}\n }; // if children is a function and animation is not active, set style to 'to'\n\n if (typeof children === 'function') {\n _this.state = {\n style: to\n };\n }\n\n return _possibleConstructorReturn(_this);\n }\n\n if (steps && steps.length) {\n _this.state = {\n style: steps[0].style\n };\n } else if (from) {\n if (typeof children === 'function') {\n _this.state = {\n style: from\n };\n return _possibleConstructorReturn(_this);\n }\n\n _this.state = {\n style: attributeName ? _defineProperty({}, attributeName, from) : from\n };\n } else {\n _this.state = {\n style: {}\n };\n }\n\n return _this;\n }\n\n _createClass(Animate, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this$props2 = this.props,\n isActive = _this$props2.isActive,\n canBegin = _this$props2.canBegin;\n this.mounted = true;\n\n if (!isActive || !canBegin) {\n return;\n }\n\n this.runAnimation(this.props);\n }\n }, {\n key: \"componentWillReceiveProps\",\n value: function componentWillReceiveProps(nextProps) {\n var isActive = nextProps.isActive,\n canBegin = nextProps.canBegin,\n attributeName = nextProps.attributeName,\n shouldReAnimate = nextProps.shouldReAnimate;\n\n if (!canBegin) {\n return;\n }\n\n if (!isActive) {\n this.setState({\n style: attributeName ? _defineProperty({}, attributeName, nextProps.to) : nextProps.to\n });\n return;\n }\n\n if (_isEqual(this.props.to, nextProps.to) && this.props.canBegin && this.props.isActive) {\n return;\n }\n\n var isTriggered = !this.props.canBegin || !this.props.isActive;\n\n if (this.manager) {\n this.manager.stop();\n }\n\n if (this.stopJSAnimation) {\n this.stopJSAnimation();\n }\n\n var from = isTriggered || shouldReAnimate ? nextProps.from : this.props.to;\n this.setState({\n style: attributeName ? _defineProperty({}, attributeName, from) : from\n });\n this.runAnimation(_objectSpread({}, nextProps, {\n from: from,\n begin: 0\n }));\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.mounted = false;\n\n if (this.unSubscribe) {\n this.unSubscribe();\n }\n\n if (this.manager) {\n this.manager.stop();\n this.manager = null;\n }\n\n if (this.stopJSAnimation) {\n this.stopJSAnimation();\n }\n }\n }, {\n key: \"runJSAnimation\",\n value: function runJSAnimation(props) {\n var _this2 = this;\n\n var from = props.from,\n to = props.to,\n duration = props.duration,\n easing = props.easing,\n begin = props.begin,\n onAnimationEnd = props.onAnimationEnd,\n onAnimationStart = props.onAnimationStart;\n var startAnimation = configUpdate(from, to, configEasing(easing), duration, this.changeStyle);\n\n var finalStartAnimation = function finalStartAnimation() {\n _this2.stopJSAnimation = startAnimation();\n };\n\n this.manager.start([onAnimationStart, begin, finalStartAnimation, duration, onAnimationEnd]);\n }\n }, {\n key: \"runStepAnimation\",\n value: function runStepAnimation(props) {\n var _this3 = this;\n\n var steps = props.steps,\n begin = props.begin,\n onAnimationStart = props.onAnimationStart;\n var _steps$ = steps[0],\n initialStyle = _steps$.style,\n _steps$$duration = _steps$.duration,\n initialTime = _steps$$duration === void 0 ? 0 : _steps$$duration;\n\n var addStyle = function addStyle(sequence, nextItem, index) {\n if (index === 0) {\n return sequence;\n }\n\n var duration = nextItem.duration,\n _nextItem$easing = nextItem.easing,\n easing = _nextItem$easing === void 0 ? 'ease' : _nextItem$easing,\n style = nextItem.style,\n nextProperties = nextItem.properties,\n onAnimationEnd = nextItem.onAnimationEnd;\n var preItem = index > 0 ? steps[index - 1] : nextItem;\n var properties = nextProperties || Object.keys(style);\n\n if (typeof easing === 'function' || easing === 'spring') {\n return _toConsumableArray(sequence).concat([_this3.runJSAnimation.bind(_this3, {\n from: preItem.style,\n to: style,\n duration: duration,\n easing: easing\n }), duration]);\n }\n\n var transition = getTransitionVal(properties, duration, easing);\n\n var newStyle = _objectSpread({}, preItem.style, style, {\n transition: transition\n });\n\n return _toConsumableArray(sequence).concat([newStyle, duration, onAnimationEnd]).filter(identity);\n };\n\n return this.manager.start([onAnimationStart].concat(_toConsumableArray(steps.reduce(addStyle, [initialStyle, Math.max(initialTime, begin)])), [props.onAnimationEnd]));\n }\n }, {\n key: \"runAnimation\",\n value: function runAnimation(props) {\n if (!this.manager) {\n this.manager = createAnimateManager();\n }\n\n var begin = props.begin,\n duration = props.duration,\n attributeName = props.attributeName,\n propsTo = props.to,\n easing = props.easing,\n onAnimationStart = props.onAnimationStart,\n onAnimationEnd = props.onAnimationEnd,\n steps = props.steps,\n children = props.children;\n var manager = this.manager;\n this.unSubscribe = manager.subscribe(this.handleStyleChange);\n\n if (typeof easing === 'function' || typeof children === 'function' || easing === 'spring') {\n this.runJSAnimation(props);\n return;\n }\n\n if (steps.length > 1) {\n this.runStepAnimation(props);\n return;\n }\n\n var to = attributeName ? _defineProperty({}, attributeName, propsTo) : propsTo;\n var transition = getTransitionVal(Object.keys(to), duration, easing);\n manager.start([onAnimationStart, begin, _objectSpread({}, to, {\n transition: transition\n }), duration, onAnimationEnd]);\n }\n }, {\n key: \"handleStyleChange\",\n value: function handleStyleChange(style) {\n this.changeStyle(style);\n }\n }, {\n key: \"changeStyle\",\n value: function changeStyle(style) {\n if (this.mounted) {\n this.setState({\n style: style\n });\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props3 = this.props,\n children = _this$props3.children,\n begin = _this$props3.begin,\n duration = _this$props3.duration,\n attributeName = _this$props3.attributeName,\n easing = _this$props3.easing,\n isActive = _this$props3.isActive,\n steps = _this$props3.steps,\n from = _this$props3.from,\n to = _this$props3.to,\n canBegin = _this$props3.canBegin,\n onAnimationEnd = _this$props3.onAnimationEnd,\n shouldReAnimate = _this$props3.shouldReAnimate,\n onAnimationReStart = _this$props3.onAnimationReStart,\n others = _objectWithoutProperties(_this$props3, [\"children\", \"begin\", \"duration\", \"attributeName\", \"easing\", \"isActive\", \"steps\", \"from\", \"to\", \"canBegin\", \"onAnimationEnd\", \"shouldReAnimate\", \"onAnimationReStart\"]);\n\n var count = Children.count(children);\n var stateStyle = translateStyle(this.state.style);\n\n if (typeof children === 'function') {\n return children(stateStyle);\n }\n\n if (!isActive || count === 0) {\n return children;\n }\n\n var cloneContainer = function cloneContainer(container) {\n var _container$props = container.props,\n _container$props$styl = _container$props.style,\n style = _container$props$styl === void 0 ? {} : _container$props$styl,\n className = _container$props.className;\n var res = cloneElement(container, _objectSpread({}, others, {\n style: _objectSpread({}, style, stateStyle),\n className: className\n }));\n return res;\n };\n\n if (count === 1) {\n return cloneContainer(Children.only(children));\n }\n\n return React.createElement(\"div\", null, Children.map(children, function (child) {\n return cloneContainer(child);\n }));\n }\n }]);\n\n return Animate;\n}(Component), _class2.displayName = 'Animate', _class2.propTypes = {\n from: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),\n to: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),\n attributeName: PropTypes.string,\n // animation duration\n duration: PropTypes.number,\n begin: PropTypes.number,\n easing: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),\n steps: PropTypes.arrayOf(PropTypes.shape({\n duration: PropTypes.number.isRequired,\n style: PropTypes.object.isRequired,\n easing: PropTypes.oneOfType([PropTypes.oneOf(['ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear']), PropTypes.func]),\n // transition css properties(dash case), optional\n properties: PropTypes.arrayOf('string'),\n onAnimationEnd: PropTypes.func\n })),\n children: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),\n isActive: PropTypes.bool,\n canBegin: PropTypes.bool,\n onAnimationEnd: PropTypes.func,\n // decide if it should reanimate with initial from style when props change\n shouldReAnimate: PropTypes.bool,\n onAnimationStart: PropTypes.func,\n onAnimationReStart: PropTypes.func\n}, _class2.defaultProps = {\n begin: 0,\n duration: 1000,\n from: '',\n to: '',\n attributeName: '',\n easing: 'ease',\n isActive: true,\n canBegin: true,\n steps: [],\n onAnimationEnd: function onAnimationEnd() {},\n onAnimationStart: function onAnimationStart() {}\n}, _temp)) || _class;\n\nexport default Animate;", + "import _isNumber from \"lodash/isNumber\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nimport React, { Component, Children } from 'react';\nimport { Transition } from 'react-transition-group';\nimport PropTypes from 'prop-types';\nimport Animate from './Animate';\n\nvar parseDurationOfSingleTransition = function parseDurationOfSingleTransition() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var steps = options.steps,\n duration = options.duration;\n\n if (steps && steps.length) {\n return steps.reduce(function (result, entry) {\n return result + (_isNumber(entry.duration) && entry.duration > 0 ? entry.duration : 0);\n }, 0);\n }\n\n if (_isNumber(duration)) {\n return duration;\n }\n\n return 0;\n};\n\nvar AnimateGroupChild =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(AnimateGroupChild, _Component);\n\n function AnimateGroupChild() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, AnimateGroupChild);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(AnimateGroupChild)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n isActive: false\n };\n\n _this.handleEnter = function (node, isAppearing) {\n var _this$props = _this.props,\n appearOptions = _this$props.appearOptions,\n enterOptions = _this$props.enterOptions;\n\n _this.handleStyleActive(isAppearing ? appearOptions : enterOptions);\n };\n\n _this.handleExit = function () {\n _this.handleStyleActive(_this.props.leaveOptions);\n };\n\n return _this;\n }\n\n _createClass(AnimateGroupChild, [{\n key: \"handleStyleActive\",\n value: function handleStyleActive(style) {\n if (style) {\n var onAnimationEnd = style.onAnimationEnd ? function () {\n style.onAnimationEnd();\n } : null;\n this.setState(_objectSpread({}, style, {\n onAnimationEnd: onAnimationEnd,\n isActive: true\n }));\n }\n }\n }, {\n key: \"parseTimeout\",\n value: function parseTimeout() {\n var _this$props2 = this.props,\n appearOptions = _this$props2.appearOptions,\n enterOptions = _this$props2.enterOptions,\n leaveOptions = _this$props2.leaveOptions;\n return parseDurationOfSingleTransition(appearOptions) + parseDurationOfSingleTransition(enterOptions) + parseDurationOfSingleTransition(leaveOptions);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var _this$props3 = this.props,\n children = _this$props3.children,\n appearOptions = _this$props3.appearOptions,\n enterOptions = _this$props3.enterOptions,\n leaveOptions = _this$props3.leaveOptions,\n props = _objectWithoutProperties(_this$props3, [\"children\", \"appearOptions\", \"enterOptions\", \"leaveOptions\"]);\n\n return React.createElement(Transition, _extends({}, props, {\n onEnter: this.handleEnter,\n onExit: this.handleExit,\n timeout: this.parseTimeout()\n }), function () {\n return React.createElement(Animate, _this2.state, Children.only(children));\n });\n }\n }]);\n\n return AnimateGroupChild;\n}(Component);\n\nAnimateGroupChild.propTypes = {\n appearOptions: PropTypes.object,\n enterOptions: PropTypes.object,\n leaveOptions: PropTypes.object,\n children: PropTypes.element\n};\nexport default AnimateGroupChild;", + "import React, { Children } from 'react';\nimport { TransitionGroup } from 'react-transition-group';\nimport PropTypes from 'prop-types';\nimport AnimateGroupChild from './AnimateGroupChild';\n\nfunction AnimateGroup(props) {\n var component = props.component,\n children = props.children,\n appear = props.appear,\n enter = props.enter,\n leave = props.leave;\n return React.createElement(TransitionGroup, {\n component: component\n }, Children.map(children, function (child, index) {\n return React.createElement(AnimateGroupChild, {\n appearOptions: appear,\n enterOptions: enter,\n leaveOptions: leave,\n key: \"child-\".concat(index)\n }, child);\n }));\n}\n\nAnimateGroup.propTypes = {\n appear: PropTypes.object,\n enter: PropTypes.object,\n leave: PropTypes.object,\n children: PropTypes.oneOfType([PropTypes.array, PropTypes.element]),\n component: PropTypes.any\n};\nAnimateGroup.defaultProps = {\n component: 'span'\n};\nexport default AnimateGroup;", + "import Animate from './Animate';\nimport { configBezier, configSpring } from './easing';\nimport { translateStyle } from './util';\nimport AnimateGroup from './AnimateGroup';\nexport { configSpring, configBezier, AnimateGroup, translateStyle };\nexport default Animate;", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _addClass = _interopRequireDefault(require(\"dom-helpers/class/addClass\"));\n\nvar _removeClass = _interopRequireDefault(require(\"dom-helpers/class/removeClass\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _Transition = _interopRequireDefault(require(\"./Transition\"));\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar addClass = function addClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return (0, _addClass.default)(node, c);\n });\n};\n\nvar removeClass = function removeClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return (0, _removeClass.default)(node, c);\n });\n};\n/**\n * A transition component inspired by the excellent\n * [ng-animate](http://www.nganimate.org/) library, you should use it if you're\n * using CSS transitions or animations. It's built upon the\n * [`))) + (("`" + (`Transition` + "`")) + (`](https://reactcommunity.org/react-transition-group/transition)\n * component, so it inherits all of its props.\n *\n * ` + ("`" + `CSSTransition`)))) + ((("`" + (` applies a pair of class names during the ` + "`")) + (`appear` + ("`" + `, `))) + (("`" + (`enter` + "`")) + ((`,\n * and ` + "`") + (`exit` + "`"))))) + ((((` states of the transition. The first class is applied and then a\n * second ` + ("`" + `*-active`)) + ("`" + (` class in order to activate the CSSS transition. After the\n * transition, matching ` + "`"))) + ((`*-done` + ("`" + ` class names are applied to persist the\n * transition state.\n *\n * `)) + ("`" + ("`" + "`")))) + (((`jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n *
\n * \n *
\n * {\"I'll receive my-node-* classes\"}\n *
\n *
\n * \n *
\n * );\n * }\n * ` + ("`" + "`")) + ("`" + (`\n *\n * When the ` + "`"))) + ((`in` + ("`" + ` prop is set to `)) + (("`" + `true`) + ("`" + `, the child component will first receive\n * the class `)))))) + ((((("`" + (`example-enter` + "`")) + (`, then the ` + ("`" + `example-enter-active`))) + (("`" + (` will be added in\n * the next tick. ` + "`")) + (`CSSTransition` + ("`" + ` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `)))) + ((("`" + (`example-enter-active` + "`")) + (`. This is an important trick\n * because it allows us to transition between ` + ("`" + `example-enter`))) + (("`" + (` and\n * ` + "`")) + ((`example-enter-active` + "`") + (` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ` + "`"))))) + (((("`" + ("`" + `css\n * .my-node-enter {\n * opacity: 0;\n * }\n * .my-node-enter-active {\n * opacity: 1;\n * transition: opacity 200ms;\n * }\n * .my-node-exit {\n * opacity: 1;\n * }\n * .my-node-exit-active {\n * opacity: 0;\n * transition: opacity: 200ms;\n * }\n * `)) + ("`" + ("`" + "`"))) + ((`\n *\n * ` + ("`" + `*-active`)) + ("`" + (` classes represent which styles you want to animate **to**.\n */\n\n\nvar CSSTransition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(CSSTransition, _React$Component);\n\n function CSSTransition() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n\n _this.onEnter = function (node, appearing) {\n var _this$getClassNames = _this.getClassNames(appearing ? 'appear' : 'enter'),\n className = _this$getClassNames.className;\n\n _this.removeClasses(node, 'exit');\n\n addClass(node, className);\n\n if (_this.props.onEnter) {\n _this.props.onEnter(node, appearing);\n }\n };\n\n _this.onEntering = function (node, appearing) {\n var _this$getClassNames2 = _this.getClassNames(appearing ? 'appear' : 'enter'),\n activeClassName = _this$getClassNames2.activeClassName;\n\n _this.reflowAndAddClass(node, activeClassName);\n\n if (_this.props.onEntering) {\n _this.props.onEntering(node, appearing);\n }\n };\n\n _this.onEntered = function (node, appearing) {\n var appearClassName = _this.getClassNames('appear').doneClassName;\n\n var enterClassName = _this.getClassNames('enter').doneClassName;\n\n var doneClassName = appearing ? appearClassName + \" \" + enterClassName : enterClassName;\n\n _this.removeClasses(node, appearing ? 'appear' : 'enter');\n\n addClass(node, doneClassName);\n\n if (_this.props.onEntered) {\n _this.props.onEntered(node, appearing);\n }\n };\n\n _this.onExit = function (node) {\n var _this$getClassNames3 = _this.getClassNames('exit'),\n className = _this$getClassNames3.className;\n\n _this.removeClasses(node, 'appear');\n\n _this.removeClasses(node, 'enter');\n\n addClass(node, className);\n\n if (_this.props.onExit) {\n _this.props.onExit(node);\n }\n };\n\n _this.onExiting = function (node) {\n var _this$getClassNames4 = _this.getClassNames('exit'),\n activeClassName = _this$getClassNames4.activeClassName;\n\n _this.reflowAndAddClass(node, activeClassName);\n\n if (_this.props.onExiting) {\n _this.props.onExiting(node);\n }\n };\n\n _this.onExited = function (node) {\n var _this$getClassNames5 = _this.getClassNames('exit'),\n doneClassName = _this$getClassNames5.doneClassName;\n\n _this.removeClasses(node, 'exit');\n\n addClass(node, doneClassName);\n\n if (_this.props.onExited) {\n _this.props.onExited(node);\n }\n };\n\n _this.getClassNames = function (type) {\n var classNames = _this.props.classNames;\n var isStringClassNames = typeof classNames === 'string';\n var prefix = isStringClassNames && classNames ? classNames + '-' : '';\n var className = isStringClassNames ? prefix + type : classNames[type];\n var activeClassName = isStringClassNames ? className + '-active' : classNames[type + 'Active'];\n var doneClassName = isStringClassNames ? className + '-done' : classNames[type + 'Done'];\n return {\n className: className,\n activeClassName: activeClassName,\n doneClassName: doneClassName\n };\n };\n\n return _this;\n }\n\n var _proto = CSSTransition.prototype;\n\n _proto.removeClasses = function removeClasses(node, type) {\n var _this$getClassNames6 = this.getClassNames(type),\n className = _this$getClassNames6.className,\n activeClassName = _this$getClassNames6.activeClassName,\n doneClassName = _this$getClassNames6.doneClassName;\n\n className && removeClass(node, className);\n activeClassName && removeClass(node, activeClassName);\n doneClassName && removeClass(node, doneClassName);\n };\n\n _proto.reflowAndAddClass = function reflowAndAddClass(node, className) {\n // This is for to force a repaint,\n // which is necessary in order to transition styles when adding a class name.\n if (className) {\n /* eslint-disable no-unused-expressions */\n node && node.scrollTop;\n /* eslint-enable no-unused-expressions */\n\n addClass(node, className);\n }\n };\n\n _proto.render = function render() {\n var props = _extends({}, this.props);\n\n delete props.classNames;\n return _react.default.createElement(_Transition.default, _extends({}, props, {\n onEnter: this.onEnter,\n onEntered: this.onEntered,\n onEntering: this.onEntering,\n onExit: this.onExit,\n onExiting: this.onExiting,\n onExited: this.onExited\n }));\n };\n\n return CSSTransition;\n}(_react.default.Component);\n\nCSSTransition.defaultProps = {\n classNames: ''\n};\nCSSTransition.propTypes = process.env.NODE_ENV !== \"production\" ? _extends({}, _Transition.default.propTypes, {\n /**\n * The animation classNames applied to the component as it enters, exits or\n * has finished the transition. A single name can be provided and it will be\n * suffixed for each stage: e.g.\n *\n * ` + "`")))) + (((`classNames=\"fade\"` + ("`" + ` applies `)) + ("`" + (`fade-enter` + "`"))) + ((`, ` + ("`" + `fade-enter-active`)) + (("`" + `,\n * `) + ("`" + `fade-enter-done`)))))))))) + ((((((((("`" + (`, ` + "`")) + (`fade-exit` + ("`" + `, `))) + (("`" + (`fade-exit-active` + "`")) + (`, ` + ("`" + `fade-exit-done`)))) + ((("`" + (`,\n * ` + "`")) + (`fade-appear` + ("`" + `, `))) + (("`" + (`fade-appear-active` + "`")) + (`, and ` + ("`" + `fade-appear-done`))))) + (((("`" + (`.\n *\n * **Note**: ` + "`")) + (`fade-appear-done` + ("`" + ` and `))) + (("`" + (`fade-enter-done` + "`")) + (` will _both_ be applied.\n * This allows you to define different behavior for when appearing is done and\n * when regular entering is done, using selectors like\n * ` + ("`" + `.fade-enter-done:not(.fade-appear-done)`)))) + ((("`" + (`. For example, you could apply an\n * epic entrance animation when element first appears in the DOM using\n * [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n * simply use ` + "`")) + (`fade-enter-done` + ("`" + ` for defining both cases.\n *\n * Each individual classNames can also be specified independently like:\n *\n * `))) + (("`" + ("`" + "`")) + ((`js\n * classNames={{\n * appear: 'my-appear',\n * appearActive: 'my-active-appear',\n * appearDone: 'my-done-appear',\n * enter: 'my-enter',\n * enterActive: 'my-active-enter',\n * enterDone: 'my-done-enter',\n * exit: 'my-exit',\n * exitActive: 'my-active-exit',\n * exitDone: 'my-done-exit',\n * }}\n * ` + "`") + ("`" + "`")))))) + (((((`\n *\n * If you want to set these classes using CSS Modules:\n *\n * ` + ("`" + "`")) + ("`" + (`js\n * import styles from './styles.css';\n * ` + "`"))) + (("`" + ("`" + `\n *\n * you might want to use camelCase in your CSS file, that way could simply\n * spread them instead of listing them one by one:\n *\n * `)) + ("`" + ("`" + "`")))) + (((`js\n * classNames={{ ...styles }}\n * ` + ("`" + "`")) + ("`" + (`\n *\n * @type {string | {\n * appear?: string,\n * appearActive?: string,\n * appearDone?: string,\n * enter?: string,\n * enterActive?: string,\n * enterDone?: string,\n * exit?: string,\n * exitActive?: string,\n * exitDone?: string,\n * }}\n */\n classNames: _PropTypes.classNamesShape,\n\n /**\n * A ` + "`"))) + ((`` + ("`" + ` callback fired immediately after the 'enter' or 'appear' class is\n * applied.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEnter: PropTypes.func,\n\n /**\n * A `)) + (("`" + ``) + ("`" + ` callback fired immediately after the 'enter-active' or\n * 'appear-active' class is applied.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * A `))))) + (((("`" + (`` + "`")) + (` callback fired immediately after the 'enter' or\n * 'appear' classes are **removed** and the ` + ("`" + `done`))) + (("`" + (` class is added to the DOM node.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntered: PropTypes.func,\n\n /**\n * A ` + "`")) + (`` + ("`" + ` callback fired immediately after the 'exit' class is\n * applied.\n *\n * @type Function(node: HtmlElement)\n */\n onExit: PropTypes.func,\n\n /**\n * A `)))) + ((("`" + (`` + "`")) + (` callback fired immediately after the 'exit-active' is applied.\n *\n * @type Function(node: HtmlElement)\n */\n onExiting: PropTypes.func,\n\n /**\n * A ` + ("`" + ``))) + (("`" + (` callback fired immediately after the 'exit' classes\n * are **removed** and the ` + "`")) + ((`exit-done` + "`") + (` class is added to the DOM node.\n *\n * @type Function(node: HtmlElement)\n */\n onExited: PropTypes.func\n}) : {};\nvar _default = CSSTransition;\nexports.default = _default;\nmodule.exports = exports[\"default\"];", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = require(\"react-dom\");\n\nvar _TransitionGroup = _interopRequireDefault(require(\"./TransitionGroup\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\n/**\n * The ` + "`"))))))) + ((((((`` + ("`" + ` component is a specialized `)) + ("`" + (`Transition` + "`"))) + ((` component\n * that animates between two children.\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * \n *
I appear first
\n *
I replace the above
\n *
\n * ` + "`")))) + ((("`" + ("`" + `\n */\nvar ReplaceTransition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(ReplaceTransition, _React$Component);\n\n function ReplaceTransition() {\n var _this;\n\n for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n _args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;\n\n _this.handleEnter = function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _this.handleLifecycle('onEnter', 0, args);\n };\n\n _this.handleEntering = function () {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return _this.handleLifecycle('onEntering', 0, args);\n };\n\n _this.handleEntered = function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return _this.handleLifecycle('onEntered', 0, args);\n };\n\n _this.handleExit = function () {\n for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n\n return _this.handleLifecycle('onExit', 1, args);\n };\n\n _this.handleExiting = function () {\n for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n\n return _this.handleLifecycle('onExiting', 1, args);\n };\n\n _this.handleExited = function () {\n for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n args[_key7] = arguments[_key7];\n }\n\n return _this.handleLifecycle('onExited', 1, args);\n };\n\n return _this;\n }\n\n var _proto = ReplaceTransition.prototype;\n\n _proto.handleLifecycle = function handleLifecycle(handler, idx, originalArgs) {\n var _child$props;\n\n var children = this.props.children;\n\n var child = _react.default.Children.toArray(children)[idx];\n\n if (child.props[handler]) (_child$props = child.props)[handler].apply(_child$props, originalArgs);\n if (this.props[handler]) this.props[handler]((0, _reactDom.findDOMNode)(this));\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n children = _this$props.children,\n inProp = _this$props.in,\n props = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\"]);\n\n var _React$Children$toArr = _react.default.Children.toArray(children),\n first = _React$Children$toArr[0],\n second = _React$Children$toArr[1];\n\n delete props.onEnter;\n delete props.onEntering;\n delete props.onEntered;\n delete props.onExit;\n delete props.onExiting;\n delete props.onExited;\n return _react.default.createElement(_TransitionGroup.default, props, inProp ? _react.default.cloneElement(first, {\n key: 'first',\n onEnter: this.handleEnter,\n onEntering: this.handleEntering,\n onEntered: this.handleEntered\n }) : _react.default.cloneElement(second, {\n key: 'second',\n onEnter: this.handleExit,\n onEntering: this.handleExiting,\n onEntered: this.handleExited\n }));\n };\n\n return ReplaceTransition;\n}(_react.default.Component);\n\nReplaceTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n in: _propTypes.default.bool.isRequired,\n children: function children(props, propName) {\n if (_react.default.Children.count(props[propName]) !== 2) return new Error(\"\\\"\" + propName + \"\\\" must be exactly two transition components.\");\n return null;\n }\n} : {};\nvar _default = ReplaceTransition;\nexports.default = _default;\nmodule.exports = exports[\"default\"];", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar UNMOUNTED = 'unmounted';\nexports.UNMOUNTED = UNMOUNTED;\nvar EXITED = 'exited';\nexports.EXITED = EXITED;\nvar ENTERING = 'entering';\nexports.ENTERING = ENTERING;\nvar ENTERED = 'entered';\nexports.ENTERED = ENTERED;\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `)) + ("`" + (`Transition` + "`"))) + ((` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [` + ("`" + `CSSTransition`)) + ("`" + (`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of ` + "`"))))) + ((((`Transition` + ("`" + `, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `)) + ("`" + (`Transition` + "`"))) + ((` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: ` + "`")))) + (((`opacity ${duration}ms ease-in-out` + ("`" + `,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 0 },\n * entered: { opacity: 1 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {state => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * `)) + ("`" + ("`" + "`"))) + ((`\n *\n * There are 4 main states a Transition can be in:\n * - ` + ("`" + `'entering'`)) + (("`" + `\n * - `) + ("`" + `'entered'`)))))) + ((((("`" + (`\n * - ` + "`")) + (`'exiting'` + ("`" + `\n * - `))) + (("`" + (`'exited'` + "`")) + (`\n *\n * Transition state is toggled via the ` + ("`" + `in`)))) + ((("`" + (` prop. When ` + "`")) + (`true` + ("`" + ` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `))) + (("`" + (`'entering'` + "`")) + ((` for the duration of the\n * transition and then to the ` + "`") + (`'entered'` + "`"))))) + ((((` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n *
\n * \n * {state => (\n * // ...\n * )}\n * \n * \n *
\n * );\n * }\n * ` + "`"))) + (("`" + ("`" + `\n *\n * When the button is clicked the component will shift to the `)) + ("`" + (`'entering'` + "`")))) + (((` state\n * and stay there for 500ms (the value of ` + ("`" + `timeout`)) + ("`" + (`) before it finally switches\n * to ` + "`"))) + ((`'entered'` + ("`" + `.\n *\n * When `)) + (("`" + `in`) + ("`" + ` is `)))))))) + ((((((("`" + (`false` + "`")) + (` the same thing happens except the state moves from\n * ` + ("`" + `'exiting'`))) + (("`" + (` to ` + "`")) + (`'exited'` + ("`" + `.\n */\n\nexports.EXITING = EXITING;\n\nvar Transition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context.transitionGroup; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n var _proto = Transition.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: null // allows for nested Transitions\n\n };\n };\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n }; // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n var node = _reactDom.default.findDOMNode(this);\n\n if (nextStatus === ENTERING) {\n this.performEnter(node, mounting);\n } else {\n this.performExit(node);\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(node, mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node);\n });\n return;\n }\n\n this.props.onEnter(node, appearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(node, appearing);\n\n _this2.onTransitionEnd(node, enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node, appearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit(node) {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts(); // no exit animation skip right to EXITED\n\n if (!exit) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n return;\n }\n\n this.props.onExit(node);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(node);\n\n _this3.onTransitionEnd(node, timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {\n this.setNextCallback(handler);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n this.props.addEndListener(node, this.nextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\"]); // filter props for Transtition\n\n\n delete childProps.in;\n delete childProps.mountOnEnter;\n delete childProps.unmountOnExit;\n delete childProps.appear;\n delete childProps.enter;\n delete childProps.exit;\n delete childProps.timeout;\n delete childProps.addEndListener;\n delete childProps.onEnter;\n delete childProps.onEntering;\n delete childProps.onEntered;\n delete childProps.onExit;\n delete childProps.onExiting;\n delete childProps.onExited;\n\n if (typeof children === 'function') {\n return children(status, childProps);\n }\n\n var child = _react.default.Children.only(children);\n\n return _react.default.cloneElement(child, childProps);\n };\n\n return Transition;\n}(_react.default.Component);\n\nTransition.contextTypes = {\n transitionGroup: PropTypes.object\n};\nTransition.childContextTypes = {\n transitionGroup: function transitionGroup() {}\n};\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A `)))) + ((("`" + (`function` + "`")) + (` child can be used instead of a React element. This function is\n * called with the current transition status (` + ("`" + `'entering'`))) + (("`" + (`, ` + "`")) + (`'entered'` + ("`" + `,\n * `))))) + (((("`" + (`'exiting'` + "`")) + (`, ` + ("`" + `'exited'`))) + (("`" + (`, ` + "`")) + (`'unmounted'` + ("`" + `), which can be used to apply context\n * specific props to a component.\n *\n * `)))) + ((("`" + ("`" + "`")) + (`jsx\n * \n * {state => (\n * \n * )}\n * \n * ` + "`")) + (("`" + "`") + (`\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent ` + "`")))))) + (((((`Transition` + ("`" + ` component. If you want to \"lazy mount\" the component on the\n * first `)) + ("`" + (`in={true}` + "`"))) + ((` you can set ` + ("`" + `mountOnEnter`)) + ("`" + (`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify ` + "`")))) + (((`unmountOnExit` + ("`" + `.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `)) + ("`" + (`'exited'` + "`"))) + ((` state.\n * Set ` + ("`" + `unmountOnExit`)) + (("`" + ` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * Normally a component is not transitioned if it is shown when the `) + ("`" + ``))))) + (((("`" + (` component mounts.\n * If you want to transition on the first mount set ` + "`")) + (`appear` + ("`" + ` to `))) + (("`" + (`true` + "`")) + (`, and the\n * component will transition in as soon as the ` + ("`" + ``)))) + ((("`" + (` mounts.\n *\n * > Note: there are no specific \"appear\" states. ` + "`")) + (`appear` + ("`" + ` only adds an additional `))) + (("`" + (`enter` + "`")) + ((` transition.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless ` + "`") + (`addEndListener` + "`"))))))) + ((((((` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * timeout={500}\n * ` + "`"))) + (("`" + ("`" + `\n *\n * or individually:\n *\n * `)) + ("`" + ("`" + "`")))) + (((`jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ` + ("`" + "`")) + ("`" + (`\n *\n * - ` + "`"))) + ((`appear` + ("`" + ` defaults to the value of `)) + (("`" + `enter`) + ("`" + `\n * - `))))) + (((("`" + (`enter` + "`")) + (` defaults to ` + ("`" + `0`))) + (("`" + (`\n * - ` + "`")) + (`exit` + ("`" + ` defaults to `)))) + ((("`" + (`0` + "`")) + (`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = _PropTypes.timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a ` + ("`" + `done`))) + (("`" + (` callback. Allows for more fine grained transition end\n * logic. **Note:** Timeouts are still used as a fallback if provided.\n *\n * ` + "`")) + (("`" + "`") + (`jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ` + "`")))))) + ((((("`" + ("`" + `\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * `)) + ("`" + (`isAppearing` + "`"))) + ((` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * ` + ("`" + `isAppearing`)) + ("`" + (` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * ` + "`")))) + (((`isAppearing` + ("`" + ` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func // Name the function so it is clearer in the documentation\n\n} : {};\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = 0;\nTransition.EXITED = 1;\nTransition.ENTERING = 2;\nTransition.ENTERED = 3;\nTransition.EXITING = 4;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(Transition);\n\nexports.default = _default;", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _ChildMapping = require(\"./utils/ChildMapping\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nvar values = Object.values || function (obj) {\n return Object.keys(obj).map(function (k) {\n return obj[k];\n });\n};\n\nvar defaultProps = {\n component: 'div',\n childFactory: function childFactory(child) {\n return child;\n }\n /**\n * The `)) + ("`" + (`` + "`"))) + ((` component manages a set of transition components\n * (` + ("`" + ``)) + (("`" + ` and `) + ("`" + ``))))) + (((("`" + (`) in a list. Like with the transition\n * components, ` + "`")) + (`` + ("`" + ` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * `))) + (("`" + (`in` + "`")) + (` prop is toggled automatically by the ` + ("`" + ``)))) + ((("`" + (`.\n *\n * Note that ` + "`")) + (`` + ("`" + ` does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\n};\n\nvar TransitionGroup =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(TransitionGroup, _React$Component);\n\n function TransitionGroup(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n\n var handleExited = _this.handleExited.bind(_assertThisInitialized(_assertThisInitialized(_this))); // Initial children should all be entering, dependent on appear\n\n\n _this.state = {\n handleExited: handleExited,\n firstRender: true\n };\n return _this;\n }\n\n var _proto = TransitionGroup.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: {\n isMounting: !this.appeared\n }\n };\n };\n\n _proto.componentDidMount = function componentDidMount() {\n this.appeared = true;\n this.mounted = true;\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.mounted = false;\n };\n\n TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n var prevChildMapping = _ref.children,\n handleExited = _ref.handleExited,\n firstRender = _ref.firstRender;\n return {\n children: firstRender ? (0, _ChildMapping.getInitialChildMapping)(nextProps, handleExited) : (0, _ChildMapping.getNextChildMapping)(nextProps, prevChildMapping, handleExited),\n firstRender: false\n };\n };\n\n _proto.handleExited = function handleExited(child, node) {\n var currentChildMapping = (0, _ChildMapping.getChildMapping)(this.props.children);\n if (child.key in currentChildMapping) return;\n\n if (child.props.onExited) {\n child.props.onExited(node);\n }\n\n if (this.mounted) {\n this.setState(function (state) {\n var children = _extends({}, state.children);\n\n delete children[child.key];\n return {\n children: children\n };\n });\n }\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n Component = _this$props.component,\n childFactory = _this$props.childFactory,\n props = _objectWithoutPropertiesLoose(_this$props, [\"component\", \"childFactory\"]);\n\n var children = values(this.state.children).map(childFactory);\n delete props.appear;\n delete props.enter;\n delete props.exit;\n\n if (Component === null) {\n return children;\n }\n\n return _react.default.createElement(Component, props, children);\n };\n\n return TransitionGroup;\n}(_react.default.Component);\n\nTransitionGroup.childContextTypes = {\n transitionGroup: _propTypes.default.object.isRequired\n};\nTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * `))) + (("`" + (`` + "`")) + ((` renders a ` + "`") + (`
` + "`"))))))))) + ((((((((` by default. You can change this\n * behavior by providing a ` + ("`" + `component`)) + ("`" + (` prop.\n * If you use React v16+ and would like to avoid a wrapping ` + "`"))) + ((`
` + ("`" + ` element\n * you can pass in `)) + ("`" + (`component={null}` + "`")))) + (((`. This is useful if the wrapping div\n * borks your css styles.\n */\n component: _propTypes.default.any,\n\n /**\n * A set of ` + ("`" + ``)) + ("`" + (` components, that are toggled ` + "`"))) + ((`in` + ("`" + ` and out as they\n * leave. the `)) + ("`" + (`` + "`"))))) + ((((` will inject specific transition props, so\n * remember to spread them through if you are wrapping the ` + ("`" + ``)) + ("`" + (` as\n * with our ` + "`"))) + ((`` + ("`" + ` example.\n *\n * While this component is meant for multiple `)) + ("`" + (`Transition` + "`")))) + (((` or ` + ("`" + `CSSTransition`)) + ("`" + (`\n * children, sometimes you may want to have a single transition child with\n * content that you want to be transitioned out and in when you change it\n * (e.g. routes, images etc.) In that case you can change the ` + "`"))) + ((`key` + ("`" + ` prop of\n * the transition child as you change its content, this will cause\n * `)) + (("`" + `TransitionGroup`) + ("`" + ` to transition the child out and back in.\n */\n children: _propTypes.default.node,\n\n /**\n * A convenience prop that enables or disables appear animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n appear: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables enter animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n enter: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables exit animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n exit: _propTypes.default.bool,\n\n /**\n * You may need to apply reactive updates to a child as it is exiting.\n * This is generally done by using `)))))) + ((((("`" + (`cloneElement` + "`")) + (` however in the case of an exiting\n * child the element has already been removed and not accessible to the consumer.\n *\n * If you do need to update a child as it leaves you can provide a ` + ("`" + `childFactory`))) + (("`" + (`\n * to wrap every child, even the ones that are leaving.\n *\n * @type Function(child: ReactElement) -> ReactElement\n */\n childFactory: _propTypes.default.func\n} : {};\nTransitionGroup.defaultProps = defaultProps;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(TransitionGroup);\n\nexports.default = _default;\nmodule.exports = exports[\"default\"];", + "\"use strict\";\n\nvar _CSSTransition = _interopRequireDefault(require(\"./CSSTransition\"));\n\nvar _ReplaceTransition = _interopRequireDefault(require(\"./ReplaceTransition\"));\n\nvar _TransitionGroup = _interopRequireDefault(require(\"./TransitionGroup\"));\n\nvar _Transition = _interopRequireDefault(require(\"./Transition\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = {\n Transition: _Transition.default,\n TransitionGroup: _TransitionGroup.default,\n ReplaceTransition: _ReplaceTransition.default,\n CSSTransition: _CSSTransition.default\n};", + "\"use strict\";\n\nexports.__esModule = true;\nexports.getChildMapping = getChildMapping;\nexports.mergeChildMappings = mergeChildMappings;\nexports.getInitialChildMapping = getInitialChildMapping;\nexports.getNextChildMapping = getNextChildMapping;\n\nvar _react = require(\"react\");\n\n/**\n * Given ` + "`")) + (`this.props.children` + ("`" + `, return an object mapping key to child.\n *\n * @param {*} children `)))) + ((("`" + (`this.props.children` + "`")) + (`\n * @return {object} Mapping of key to child\n */\nfunction getChildMapping(children, mapFn) {\n var mapper = function mapper(child) {\n return mapFn && (0, _react.isValidElement)(child) ? mapFn(child) : child;\n };\n\n var result = Object.create(null);\n if (children) _react.Children.map(children, function (c) {\n return c;\n }).forEach(function (child) {\n // run the map function here instead so that the key is the computed one\n result[child.key] = mapper(child);\n });\n return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * ` + ("`" + `ReactTransitionChildMapping.getChildMapping()`))) + (("`" + (`.\n * @param {object} next next children as returned from\n * ` + "`")) + ((`ReactTransitionChildMapping.getChildMapping()` + "`") + (`.\n * @return {object} a key set that contains all keys in ` + "`"))))) + ((((`prev` + ("`" + ` and all keys\n * in `)) + ("`" + (`next` + "`"))) + ((` in a reasonable order.\n */\n\n\nfunction mergeChildMappings(prev, next) {\n prev = prev || {};\n next = next || {};\n\n function getValueForKey(key) {\n return key in next ? next[key] : prev[key];\n } // For each key of ` + ("`" + `next`)) + ("`" + (`, the list of keys to insert before that key in\n // the combined list\n\n\n var nextKeysPending = Object.create(null);\n var pendingKeys = [];\n\n for (var prevKey in prev) {\n if (prevKey in next) {\n if (pendingKeys.length) {\n nextKeysPending[prevKey] = pendingKeys;\n pendingKeys = [];\n }\n } else {\n pendingKeys.push(prevKey);\n }\n }\n\n var i;\n var childMapping = {};\n\n for (var nextKey in next) {\n if (nextKeysPending[nextKey]) {\n for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n var pendingNextKey = nextKeysPending[nextKey][i];\n childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n }\n }\n\n childMapping[nextKey] = getValueForKey(nextKey);\n } // Finally, add the keys which didn't appear before any key in ` + "`")))) + (((`next` + ("`" + `\n\n\n for (i = 0; i < pendingKeys.length; i++) {\n childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n }\n\n return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nfunction getInitialChildMapping(props, onExited) {\n return getChildMapping(props.children, function (child) {\n return (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n appear: getProp(child, 'appear', props),\n enter: getProp(child, 'enter', props),\n exit: getProp(child, 'exit', props)\n });\n });\n}\n\nfunction getNextChildMapping(nextProps, prevChildMapping, onExited) {\n var nextChildMapping = getChildMapping(nextProps.children);\n var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n Object.keys(children).forEach(function (key) {\n var child = children[key];\n if (!(0, _react.isValidElement)(child)) return;\n var hasPrev = key in prevChildMapping;\n var hasNext = key in nextChildMapping;\n var prevChild = prevChildMapping[key];\n var isLeaving = (0, _react.isValidElement)(prevChild) && !prevChild.props.in; // item is new (entering)\n\n if (hasNext && (!hasPrev || isLeaving)) {\n // console.log('entering', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n } else if (!hasNext && hasPrev && !isLeaving) {\n // item is old (exiting)\n // console.log('leaving', key)\n children[key] = (0, _react.cloneElement)(child, {\n in: false\n });\n } else if (hasNext && hasPrev && (0, _react.isValidElement)(prevChild)) {\n // item hasn't changed transition states\n // copy over the last transition props;\n // console.log('unchanged', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: prevChild.props.in,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n }\n });\n return children;\n}", + "\"use strict\";\n\nexports.__esModule = true;\nexports.classNamesShape = exports.timeoutsShape = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar timeoutsShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({\n enter: _propTypes.default.number,\n exit: _propTypes.default.number,\n appear: _propTypes.default.number\n}).isRequired]) : null;\nexports.timeoutsShape = timeoutsShape;\nvar classNamesShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({\n enter: _propTypes.default.string,\n exit: _propTypes.default.string,\n active: _propTypes.default.string\n}), _propTypes.default.shape({\n enter: _propTypes.default.string,\n enterDone: _propTypes.default.string,\n enterActive: _propTypes.default.string,\n exit: _propTypes.default.string,\n exitDone: _propTypes.default.string,\n exitActive: _propTypes.default.string\n})]) : null;\nexports.classNamesShape = classNamesShape;", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar UNMOUNTED = 'unmounted';\nexports.UNMOUNTED = UNMOUNTED;\nvar EXITED = 'exited';\nexports.EXITED = EXITED;\nvar ENTERING = 'entering';\nexports.ENTERING = ENTERING;\nvar ENTERED = 'entered';\nexports.ENTERED = ENTERED;\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * By default the `)) + ("`" + (`Transition` + "`"))) + ((` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the components.\n * It's up to you to give meaning and effect to those states. For example we can\n * add styles to a component when it enters or exits:\n *\n * ` + ("`" + "`")) + (("`" + `jsx\n * import Transition from 'react-transition-group/Transition';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: `) + ("`" + `opacity ${duration}ms ease-in-out`))))))) + (((((("`" + (`,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 0 },\n * entered: { opacity: 1 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {(state) => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * ` + "`")) + ("`" + ("`" + `\n *\n * As noted the `))) + (("`" + (`Transition` + "`")) + (` component doesn't _do_ anything by itself to its child component.\n * What it does do is track transition states over time so you can update the\n * component (such as by adding styles or classes) when it changes states.\n *\n * There are 4 main states a Transition can be in:\n * - ` + ("`" + `'entering'`)))) + ((("`" + (`\n * - ` + "`")) + (`'entered'` + ("`" + `\n * - `))) + (("`" + (`'exiting'` + "`")) + (`\n * - ` + ("`" + `'exited'`))))) + (((("`" + (`\n *\n * Transition state is toggled via the ` + "`")) + (`in` + ("`" + ` prop. When `))) + (("`" + (`true` + "`")) + (` the component begins the\n * \"Enter\" stage. During this stage, the component will shift from its current transition state,\n * to ` + ("`" + `'entering'`)))) + ((("`" + (` for the duration of the transition and then to the ` + "`")) + (`'entered'` + ("`" + ` stage once\n * it's complete. Let's take the following example:\n *\n * `))) + (("`" + ("`" + "`")) + ((`jsx\n * state = { in: false };\n *\n * toggleEnterState = () => {\n * this.setState({ in: true });\n * }\n *\n * render() {\n * return (\n *
\n * \n * \n *
\n * );\n * }\n * ` + "`") + ("`" + "`")))))) + (((((`\n *\n * When the button is clicked the component will shift to the ` + ("`" + `'entering'`)) + ("`" + (` state and\n * stay there for 500ms (the value of ` + "`"))) + ((`timeout` + ("`" + `) before it finally switches to `)) + ("`" + (`'entered'` + "`")))) + (((`.\n *\n * When ` + ("`" + `in`)) + ("`" + (` is ` + "`"))) + ((`false` + ("`" + ` the same thing happens except the state moves from `)) + (("`" + `'exiting'`) + ("`" + ` to `))))) + (((("`" + (`'exited'` + "`")) + (`.\n *\n * ## Timing\n *\n * Timing is often the trickiest part of animation, mistakes can result in slight delays\n * that are hard to pin down. A common example is when you want to add an exit transition,\n * you should set the desired final styles when the state is ` + ("`" + `'exiting'`))) + (("`" + (`. That's when the\n * transition to those styles will start and, if you matched the ` + "`")) + (`timeout` + ("`" + ` prop with the\n * CSS Transition duration, it will end exactly when the state changes to `)))) + ((("`" + (`'exited'` + "`")) + (`.\n *\n * > **Note**: For simpler transitions the ` + ("`" + `Transition`))) + (("`" + (` component might be enough, but\n * > take into account that it's platform-agnostic, while the ` + "`")) + ((`CSSTransition` + "`") + (` component\n * > [forces reflows](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * > in order to make more complex transitions more predictable. For example, even though\n * > classes ` + "`")))))))) + (((((((`example-enter` + ("`" + ` and `)) + ("`" + (`example-enter-active` + "`"))) + ((` are applied immediately one after\n * > another, you can still transition from one to the other because of the forced reflow\n * > (read [this issue](https://github.com/reactjs/react-transition-group/issues/159#issuecomment-322761171)\n * > for more info). Take this into account when choosing between ` + ("`" + `Transition`)) + ("`" + (` and\n * > ` + "`")))) + (((`CSSTransition` + ("`" + `.\n */\n\nexports.EXITING = EXITING;\n\nvar Transition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context.transitionGroup; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n var _proto = Transition.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: null // allows for nested Transitions\n\n };\n };\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n }; // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n var node = _reactDom.default.findDOMNode(this);\n\n if (nextStatus === ENTERING) {\n this.performEnter(node, mounting);\n } else {\n this.performExit(node);\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(node, mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node);\n });\n return;\n }\n\n this.props.onEnter(node, appearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(node, appearing);\n\n _this2.onTransitionEnd(node, enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node, appearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit(node) {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts(); // no exit animation skip right to EXITED\n\n if (!exit) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n return;\n }\n\n this.props.onExit(node);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(node);\n\n _this3.onTransitionEnd(node, timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {\n this.setNextCallback(handler);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n this.props.addEndListener(node, this.nextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\"]); // filter props for Transtition\n\n\n delete childProps.in;\n delete childProps.mountOnEnter;\n delete childProps.unmountOnExit;\n delete childProps.appear;\n delete childProps.enter;\n delete childProps.exit;\n delete childProps.timeout;\n delete childProps.addEndListener;\n delete childProps.onEnter;\n delete childProps.onEntering;\n delete childProps.onEntered;\n delete childProps.onExit;\n delete childProps.onExiting;\n delete childProps.onExited;\n\n if (typeof children === 'function') {\n return children(status, childProps);\n }\n\n var child = _react.default.Children.only(children);\n\n return _react.default.cloneElement(child, childProps);\n };\n\n return Transition;\n}(_react.default.Component);\n\nTransition.contextTypes = {\n transitionGroup: PropTypes.object\n};\nTransition.childContextTypes = {\n transitionGroup: function transitionGroup() {}\n};\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A `)) + ("`" + (`function` + "`"))) + ((` child can be used instead of a React element.\n * This function is called with the current transition status\n * ('entering', 'entered', 'exiting', 'exited', 'unmounted'), which can be used\n * to apply context specific props to a component.\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * \n * {(status) => (\n * \n * )}\n * \n * `)) + ("`" + ("`" + "`"))) + ((`\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent ` + ("`" + `Transition`)) + ("`" + (` component. If you want to \"lazy mount\" the component on the\n * first ` + "`")))) + (((`in={true}` + ("`" + ` you can set `)) + ("`" + (`mountOnEnter` + "`"))) + ((`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify ` + ("`" + `unmountOnExit`)) + (("`" + `.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `) + ("`" + `'exited'`)))))) + ((((("`" + (` state.\n * Set ` + "`")) + (`unmountOnExit` + ("`" + ` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * Normally a component is not transitioned if it is shown when the `))) + (("`" + (`` + "`")) + (` component mounts.\n * If you want to transition on the first mount set ` + ("`" + `appear`)))) + ((("`" + (` to ` + "`")) + (`true` + ("`" + `, and the\n * component will transition in as soon as the `))) + (("`" + (`` + "`")) + ((` mounts.\n *\n * > Note: there are no specific \"appear\" states. ` + "`") + (`appear` + "`"))))) + ((((` only adds an additional ` + ("`" + `enter`)) + ("`" + (` transition.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless ` + "`"))) + ((`addEndListener` + ("`" + ` is provided\n *\n * You may specify a single timeout for all transitions like: `)) + ("`" + (`timeout={500}` + "`")))) + (((`,\n * or individually like:\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * timeout={{\n * enter: 300,\n * exit: 500,\n * appear: 500,\n * }}\n * ` + "`"))) + (("`" + ("`" + `\n *\n * If the value of `)) + (("`" + `appear`) + ("`" + ` is not set, then the value from enter is taken.\n *\n * If the `))))))) + (((((("`" + (`enter` + "`")) + (` or ` + ("`" + `exit`))) + (("`" + (` value is ` + "`")) + (`null` + ("`" + ` or `)))) + ((("`" + (`undefined` + "`")) + (`, then the timer is set to ` + ("`" + `0`))) + (("`" + (`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = process.env.NODE_ENV !== \"production\" ? _PropTypes.timeoutsShape : {};;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a ` + "`")) + ((`done` + "`") + (` callback. Allows for more fine grained transition end\n * logic. **Note:** Timeouts are still used as a fallback if provided.\n *\n * ` + "`"))))) + (((("`" + ("`" + `jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * `)) + ("`" + ("`" + "`"))) + ((`\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * ` + ("`" + `isAppearing`)) + ("`" + (` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * ` + "`")))) + (((`isAppearing` + ("`" + ` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `)) + ("`" + (`isAppearing` + "`"))) + ((` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func // Name the function so it is clearer in the documentation\n\n} : {};\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = 0;\nTransition.EXITED = 1;\nTransition.ENTERING = 2;\nTransition.ENTERED = 3;\nTransition.EXITING = 4;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(Transition);\n\nexports.default = _default;", + "\"use strict\";\n\nexports.__esModule = true;\nexports.classNamesShape = exports.timeoutsShape = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar timeoutsShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({\n enter: _propTypes.default.number,\n exit: _propTypes.default.number,\n appear: _propTypes.default.number\n}).isRequired]) : null;\nexports.timeoutsShape = timeoutsShape;\nvar classNamesShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({\n enter: _propTypes.default.string,\n exit: _propTypes.default.string,\n active: _propTypes.default.string\n}), _propTypes.default.shape({\n enter: _propTypes.default.string,\n enterDone: _propTypes.default.string,\n enterActive: _propTypes.default.string,\n exit: _propTypes.default.string,\n exitDone: _propTypes.default.string,\n exitActive: _propTypes.default.string\n})]) : null;\nexports.classNamesShape = classNamesShape;", + "/** @license React v16.8.4\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var k=require(\"object-assign\"),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.concurrent_mode\"):60111,y=n?Symbol.for(\"react.forward_ref\"):60112,z=n?Symbol.for(\"react.suspense\"):60113,aa=n?Symbol.for(\"react.memo\"):\n60115,ba=n?Symbol.for(\"react.lazy\"):60116,A=\"function\"===typeof Symbol&&Symbol.iterator;function ca(a,b,d,c,e,g,h,f){if(!a){a=void 0;if(void 0===b)a=Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var l=[d,c,e,g,h,f],m=0;a=Error(b.replace(/%s/g,function(){return l[m++]}));a.name=\"Invariant Violation\"}a.framesToPop=1;throw a;}}\nfunction B(a){for(var b=arguments.length-1,d=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=0;cP.length&&P.push(a)}\nfunction S(a,b,d,c){var e=typeof a;if(\"undefined\"===e||\"boolean\"===e)a=null;var g=!1;if(null===a)g=!0;else switch(e){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return d(c,a,\"\"===b?\".\"+T(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var h=0;h max) {\n validMin = max;\n validMax = min;\n }\n\n return [validMin, validMax];\n}\n/**\n * Calculate the step which is easy to understand between ticks, like 10, 20, 25\n *\n * @param {Decimal} roughStep The rough step calculated by deviding the\n * difference by the tickCount\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @param {Integer} correctionFactor A correction factor\n * @return {Decimal} The step which is easy to understand between two ticks\n */\n\n\nfunction getFormatStep(roughStep, allowDecimals, correctionFactor) {\n if (roughStep.lte(0)) {\n return new _decimal.default(0);\n }\n\n var digitCount = _arithmetic.default.getDigitCount(roughStep.toNumber()); // The ratio between the rough step and the smallest number which has a bigger\n // order of magnitudes than the rough step\n\n\n var digitCountValue = new _decimal.default(10).pow(digitCount);\n var stepRatio = roughStep.div(digitCountValue); // When an integer and a float multiplied, the accuracy of result may be wrong\n\n var stepRatioScale = digitCount !== 1 ? 0.05 : 0.1;\n var amendStepRatio = new _decimal.default(Math.ceil(stepRatio.div(stepRatioScale).toNumber())).add(correctionFactor).mul(stepRatioScale);\n var formatStep = amendStepRatio.mul(digitCountValue);\n return allowDecimals ? formatStep : new _decimal.default(Math.ceil(formatStep));\n}\n/**\n * calculate the ticks when the minimum value equals to the maximum value\n *\n * @param {Number} value The minimum valuue which is also the maximum value\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @return {Array} ticks\n */\n\n\nfunction getTickOfSingleValue(value, tickCount, allowDecimals) {\n var step = 1; // calculate the middle value of ticks\n\n var middle = new _decimal.default(value);\n\n if (!middle.isint() && allowDecimals) {\n var absVal = Math.abs(value);\n\n if (absVal < 1) {\n // The step should be a float number when the difference is smaller than 1\n step = new _decimal.default(10).pow(_arithmetic.default.getDigitCount(value) - 1);\n middle = new _decimal.default(Math.floor(middle.div(step).toNumber())).mul(step);\n } else if (absVal > 1) {\n // Return the maximum integer which is smaller than 'value' when 'value' is greater than 1\n middle = new _decimal.default(Math.floor(value));\n }\n } else if (value === 0) {\n middle = new _decimal.default(Math.floor((tickCount - 1) / 2));\n } else if (!allowDecimals) {\n middle = new _decimal.default(Math.floor(value));\n }\n\n var middleIndex = Math.floor((tickCount - 1) / 2);\n var fn = (0, _utils.compose)((0, _utils.map)(function (n) {\n return middle.add(new _decimal.default(n - middleIndex).mul(step)).toNumber();\n }), _utils.range);\n return fn(0, tickCount);\n}\n/**\n * Calculate the step\n *\n * @param {Number} min The minimum value of an interval\n * @param {Number} max The maximum value of an interval\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @param {Number} correctionFactor A correction factor\n * @return {Object} The step, minimum value of ticks, maximum value of ticks\n */\n\n\nfunction calculateStep(min, max, tickCount, allowDecimals) {\n var correctionFactor = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n\n // dirty hack (for recharts' test)\n if (!Number.isFinite((max - min) / (tickCount - 1))) {\n return {\n step: new _decimal.default(0),\n tickMin: new _decimal.default(0),\n tickMax: new _decimal.default(0)\n };\n } // The step which is easy to understand between two ticks\n\n\n var step = getFormatStep(new _decimal.default(max).sub(min).div(tickCount - 1), allowDecimals, correctionFactor); // A medial value of ticks\n\n var middle; // When 0 is inside the interval, 0 should be a tick\n\n if (min <= 0 && max >= 0) {\n middle = new _decimal.default(0);\n } else {\n // calculate the middle value\n middle = new _decimal.default(min).add(max).div(2); // minus modulo value\n\n middle = middle.sub(new _decimal.default(middle).mod(step));\n }\n\n var belowCount = Math.ceil(middle.sub(min).div(step).toNumber());\n var upCount = Math.ceil(new _decimal.default(max).sub(middle).div(step).toNumber());\n var scaleCount = belowCount + upCount + 1;\n\n if (scaleCount > tickCount) {\n // When more ticks need to cover the interval, step should be bigger.\n return calculateStep(min, max, tickCount, allowDecimals, correctionFactor + 1);\n }\n\n if (scaleCount < tickCount) {\n // When less ticks can cover the interval, we should add some additional ticks\n upCount = max > 0 ? upCount + (tickCount - scaleCount) : upCount;\n belowCount = max > 0 ? belowCount : belowCount + (tickCount - scaleCount);\n }\n\n return {\n step: step,\n tickMin: middle.sub(new _decimal.default(belowCount).mul(step)),\n tickMax: middle.add(new _decimal.default(upCount).mul(step))\n };\n}\n/**\n * Calculate the ticks of an interval, the count of ticks will be guraranteed\n *\n * @param {Number} min, max min: The minimum value, max: The maximum value\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @return {Array} ticks\n */\n\n\nfunction getNiceTickValuesFn(_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n min = _ref4[0],\n max = _ref4[1];\n\n var tickCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;\n var allowDecimals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n // More than two ticks should be return\n var count = Math.max(tickCount, 2);\n\n var _getValidInterval = getValidInterval([min, max]),\n _getValidInterval2 = _slicedToArray(_getValidInterval, 2),\n cormin = _getValidInterval2[0],\n cormax = _getValidInterval2[1];\n\n if (cormin === -Infinity || cormax === Infinity) {\n var _values = cormax === Infinity ? [cormin].concat(_toConsumableArray((0, _utils.range)(0, tickCount - 1).map(function () {\n return Infinity;\n }))) : _toConsumableArray((0, _utils.range)(0, tickCount - 1).map(function () {\n return -Infinity;\n })).concat([cormax]);\n\n return min > max ? (0, _utils.reverse)(_values) : _values;\n }\n\n if (cormin === cormax) {\n return getTickOfSingleValue(cormin, tickCount, allowDecimals);\n } // Get the step between two ticks\n\n\n var _calculateStep = calculateStep(cormin, cormax, count, allowDecimals),\n step = _calculateStep.step,\n tickMin = _calculateStep.tickMin,\n tickMax = _calculateStep.tickMax;\n\n var values = _arithmetic.default.rangeStep(tickMin, tickMax.add(new _decimal.default(0.1).mul(step)), step);\n\n return min > max ? (0, _utils.reverse)(values) : values;\n}\n/**\n * Calculate the ticks of an interval, the count of ticks won't be guraranteed\n *\n * @param {Number} min, max min: The minimum value, max: The maximum value\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @return {Array} ticks\n */\n\n\nfunction getTickValuesFn(_ref5) {\n var _ref6 = _slicedToArray(_ref5, 2),\n min = _ref6[0],\n max = _ref6[1];\n\n var tickCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;\n var allowDecimals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n // More than two ticks should be return\n var count = Math.max(tickCount, 2);\n\n var _getValidInterval3 = getValidInterval([min, max]),\n _getValidInterval4 = _slicedToArray(_getValidInterval3, 2),\n cormin = _getValidInterval4[0],\n cormax = _getValidInterval4[1];\n\n if (cormin === -Infinity || cormax === Infinity) {\n return [min, max];\n }\n\n if (cormin === cormax) {\n return getTickOfSingleValue(cormin, tickCount, allowDecimals);\n }\n\n var step = getFormatStep(new _decimal.default(cormax).sub(cormin).div(count - 1), allowDecimals, 0);\n var fn = (0, _utils.compose)((0, _utils.map)(function (n) {\n return new _decimal.default(cormin).add(new _decimal.default(n).mul(step)).toNumber();\n }), _utils.range);\n var values = fn(0, count).filter(function (entry) {\n return entry >= cormin && entry <= cormax;\n });\n return min > max ? (0, _utils.reverse)(values) : values;\n}\n/**\n * Calculate the ticks of an interval, the count of ticks won't be guraranteed,\n * but the domain will be guaranteed\n *\n * @param {Number} min, max min: The minimum value, max: The maximum value\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @return {Array} ticks\n */\n\n\nfunction getTickValuesFixedDomainFn(_ref7, tickCount) {\n var _ref8 = _slicedToArray(_ref7, 2),\n min = _ref8[0],\n max = _ref8[1];\n\n var allowDecimals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n // More than two ticks should be return\n var _getValidInterval5 = getValidInterval([min, max]),\n _getValidInterval6 = _slicedToArray(_getValidInterval5, 2),\n cormin = _getValidInterval6[0],\n cormax = _getValidInterval6[1];\n\n if (cormin === -Infinity || cormax === Infinity) {\n return [min, max];\n }\n\n if (cormin === cormax) {\n return [cormin];\n }\n\n var count = Math.max(tickCount, 2);\n var step = getFormatStep(new _decimal.default(cormax).sub(cormin).div(count - 1), allowDecimals, 0);\n\n var values = _toConsumableArray(_arithmetic.default.rangeStep(new _decimal.default(cormin), new _decimal.default(cormax).sub(new _decimal.default(0.99).mul(step)), step)).concat([cormax]);\n\n return min > max ? (0, _utils.reverse)(values) : values;\n}\n\nvar getNiceTickValues = (0, _utils.memoize)(getNiceTickValuesFn);\nexports.getNiceTickValues = getNiceTickValues;\nvar getTickValues = (0, _utils.memoize)(getTickValuesFn);\nexports.getTickValues = getTickValues;\nvar getTickValuesFixedDomain = (0, _utils.memoize)(getTickValuesFixedDomainFn);\nexports.getTickValuesFixedDomain = getTickValuesFixedDomain;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"getTickValues\", {\n enumerable: true,\n get: function get() {\n return _getNiceTickValues.getTickValues;\n }\n});\nObject.defineProperty(exports, \"getNiceTickValues\", {\n enumerable: true,\n get: function get() {\n return _getNiceTickValues.getNiceTickValues;\n }\n});\nObject.defineProperty(exports, \"getTickValuesFixedDomain\", {\n enumerable: true,\n get: function get() {\n return _getNiceTickValues.getTickValuesFixedDomain;\n }\n});\n\nvar _getNiceTickValues = require(\"./getNiceTickValues\");", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _decimal = _interopRequireDefault(require(\"decimal.js-light\"));\n\nvar _utils = require(\"./utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @fileOverview 一些公用的运算方法\n * @author xile611\n * @date 2015-09-17\n */\n\n/**\n * 获取数值的位数\n * 其中绝对值属于区间[0.1, 1), 得到的值为0\n * 绝对值属于区间[0.01, 0.1),得到的位数为 -1\n * 绝对值属于区间[0.001, 0.01),得到的位数为 -2\n *\n * @param {Number} value 数值\n * @return {Integer} 位数\n */\nfunction getDigitCount(value) {\n var result;\n\n if (value === 0) {\n result = 1;\n } else {\n result = Math.floor(new _decimal.default(value).abs().log(10).toNumber()) + 1;\n }\n\n return result;\n}\n/**\n * 按照固定的步长获取[start, end)这个区间的数据\n * 并且需要处理js计算精度的问题\n *\n * @param {Decimal} start 起点\n * @param {Decimal} end 终点,不包含该值\n * @param {Decimal} step 步长\n * @return {Array} 若干数值\n */\n\n\nfunction rangeStep(start, end, step) {\n var num = new _decimal.default(start);\n var result = [];\n\n while (num.lt(end)) {\n result.push(num.toNumber());\n num = num.add(step);\n }\n\n return result;\n}\n/**\n * 对数值进行线性插值\n *\n * @param {Number} a 定义域的极点\n * @param {Number} b 定义域的极点\n * @param {Number} t [0, 1]内的某个值\n * @return {Number} 定义域内的某个值\n */\n\n\nvar interpolateNumber = (0, _utils.curry)(function (a, b, t) {\n var newA = +a;\n var newB = +b;\n return newA + t * (newB - newA);\n});\n/**\n * 线性插值的逆运算\n *\n * @param {Number} a 定义域的极点\n * @param {Number} b 定义域的极点\n * @param {Number} x 可以认为是插值后的一个输出值\n * @return {Number} 当x在 a ~ b这个范围内时,返回值属于[0, 1]\n */\n\nvar uninterpolateNumber = (0, _utils.curry)(function (a, b, x) {\n var diff = b - +a;\n diff = diff || Infinity;\n return (x - a) / diff;\n});\n/**\n * 线性插值的逆运算,并且有截断的操作\n *\n * @param {Number} a 定义域的极点\n * @param {Number} b 定义域的极点\n * @param {Number} x 可以认为是插值后的一个输出值\n * @return {Number} 当x在 a ~ b这个区间内时,返回值属于[0, 1],\n * 当x不在 a ~ b这个区间时,会截断到 a ~ b 这个区间\n */\n\nvar uninterpolateTruncation = (0, _utils.curry)(function (a, b, x) {\n var diff = b - +a;\n diff = diff || Infinity;\n return Math.max(0, Math.min(1, (x - a) / diff));\n});\nvar _default = {\n rangeStep: rangeStep,\n getDigitCount: getDigitCount,\n interpolateNumber: interpolateNumber,\n uninterpolateNumber: uninterpolateNumber,\n uninterpolateTruncation: uninterpolateTruncation\n};\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.memoize = exports.reverse = exports.compose = exports.map = exports.range = exports.curry = exports.PLACE_HOLDER = void 0;\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nvar identity = function identity(i) {\n return i;\n};\n\nvar PLACE_HOLDER = {\n '@@functional/placeholder': true\n};\nexports.PLACE_HOLDER = PLACE_HOLDER;\n\nvar isPlaceHolder = function isPlaceHolder(val) {\n return val === PLACE_HOLDER;\n};\n\nvar curry0 = function curry0(fn) {\n return function _curried() {\n if (arguments.length === 0 || arguments.length === 1 && isPlaceHolder(arguments.length <= 0 ? undefined : arguments[0])) {\n return _curried;\n }\n\n return fn.apply(void 0, arguments);\n };\n};\n\nvar curryN = function curryN(n, fn) {\n if (n === 1) {\n return fn;\n }\n\n return curry0(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var argsLength = args.filter(function (arg) {\n return arg !== PLACE_HOLDER;\n }).length;\n\n if (argsLength >= n) {\n return fn.apply(void 0, args);\n }\n\n return curryN(n - argsLength, curry0(function () {\n for (var _len2 = arguments.length, restArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n restArgs[_key2] = arguments[_key2];\n }\n\n var newArgs = args.map(function (arg) {\n return isPlaceHolder(arg) ? restArgs.shift() : arg;\n });\n return fn.apply(void 0, _toConsumableArray(newArgs).concat(restArgs));\n }));\n });\n};\n\nvar curry = function curry(fn) {\n return curryN(fn.length, fn);\n};\n\nexports.curry = curry;\n\nvar range = function range(begin, end) {\n var arr = [];\n\n for (var i = begin; i < end; ++i) {\n arr[i - begin] = i;\n }\n\n return arr;\n};\n\nexports.range = range;\nvar map = curry(function (fn, arr) {\n if (Array.isArray(arr)) {\n return arr.map(fn);\n }\n\n return Object.keys(arr).map(function (key) {\n return arr[key];\n }).map(fn);\n});\nexports.map = map;\n\nvar compose = function compose() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n if (!args.length) {\n return identity;\n }\n\n var fns = args.reverse(); // first function can receive multiply arguments\n\n var firstFn = fns[0];\n var tailsFn = fns.slice(1);\n return function () {\n return tailsFn.reduce(function (res, fn) {\n return fn(res);\n }, firstFn.apply(void 0, arguments));\n };\n};\n\nexports.compose = compose;\n\nvar reverse = function reverse(arr) {\n if (Array.isArray(arr)) {\n return arr.reverse();\n } // can be string\n\n\n return arr.split('').reverse.join('');\n};\n\nexports.reverse = reverse;\n\nvar memoize = function memoize(fn) {\n var lastArgs = null;\n var lastResult = null;\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n if (lastArgs && args.every(function (val, i) {\n return val === lastArgs[i];\n })) {\n return lastResult;\n }\n\n lastArgs = args;\n lastResult = fn.apply(void 0, args);\n return lastResult;\n };\n};\n\nexports.memoize = memoize;", + "import _isEqual from \"lodash/isEqual\";\nimport _isNaN from \"lodash/isNaN\";\nimport _isFunction from \"lodash/isFunction\";\nimport _get from \"lodash/get\";\nimport _isNil from \"lodash/isNil\";\nimport _isArray from \"lodash/isArray\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Area\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Animate from 'react-smooth';\nimport Curve from '../shape/Curve';\nimport Dot from '../shape/Dot';\nimport Layer from '../container/Layer';\nimport LabelList from '../component/LabelList';\nimport pureRender from '../util/PureRender';\nimport { PRESENTATION_ATTRIBUTES, EVENT_ATTRIBUTES, LEGEND_TYPES, getPresentationAttributes, isSsr, filterEventAttributes } from '../util/ReactUtils';\nimport { isNumber, uniqueId, interpolateNumber } from '../util/DataUtils';\nimport { getCateCoordinateOfLine, getValueByDataKey } from '../util/ChartUtils';\n\nvar Area = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Area, _Component);\n\n function Area() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, Area);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Area)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n isAnimationFinished: true\n };\n _this.id = uniqueId('recharts-area-');\n\n _this.cachePrevData = function (points, baseLine) {\n _this.setState({\n prevPoints: points,\n prevBaseLine: baseLine\n });\n };\n\n _this.handleAnimationEnd = function () {\n var onAnimationEnd = _this.props.onAnimationEnd;\n\n _this.setState({\n isAnimationFinished: true\n });\n\n if (_isFunction(onAnimationEnd)) {\n onAnimationEnd();\n }\n };\n\n _this.handleAnimationStart = function () {\n var onAnimationStart = _this.props.onAnimationStart;\n\n _this.setState({\n isAnimationFinished: false\n });\n\n if (_isFunction(onAnimationStart)) {\n onAnimationStart();\n }\n };\n\n return _this;\n }\n\n _createClass(Area, [{\n key: \"componentWillReceiveProps\",\n value: function componentWillReceiveProps(nextProps) {\n var _this$props = this.props,\n animationId = _this$props.animationId,\n points = _this$props.points,\n baseLine = _this$props.baseLine;\n\n if (nextProps.animationId !== animationId) {\n this.cachePrevData(points, baseLine);\n }\n }\n }, {\n key: \"renderDots\",\n value: function renderDots(needClip, clipPathId) {\n var _this2 = this;\n\n var isAnimationActive = this.props.isAnimationActive;\n var isAnimationFinished = this.state.isAnimationFinished;\n\n if (isAnimationActive && !isAnimationFinished) {\n return null;\n }\n\n var _this$props2 = this.props,\n dot = _this$props2.dot,\n points = _this$props2.points,\n dataKey = _this$props2.dataKey;\n var areaProps = getPresentationAttributes(this.props);\n var customDotProps = getPresentationAttributes(dot);\n var dotEvents = filterEventAttributes(dot);\n var dots = points.map(function (entry, i) {\n var dotProps = _objectSpread({\n key: \"dot-\".concat(i),\n r: 3\n }, areaProps, customDotProps, dotEvents, {\n dataKey: dataKey,\n cx: entry.x,\n cy: entry.y,\n index: i,\n value: entry.value,\n payload: entry.payload\n });\n\n return _this2.constructor.renderDotItem(dot, dotProps);\n });\n var dotsProps = {\n clipPath: needClip ? \"url(#clipPath-\".concat(clipPathId, \")\") : null\n };\n return React.createElement(Layer, _extends({\n className: \"recharts-area-dots\"\n }, dotsProps), dots);\n }\n }, {\n key: \"renderHorizontalRect\",\n value: function renderHorizontalRect(alpha) {\n var _this$props3 = this.props,\n baseLine = _this$props3.baseLine,\n points = _this$props3.points,\n strokeWidth = _this$props3.strokeWidth;\n var startX = points[0].x;\n var endX = points[points.length - 1].x;\n var width = alpha * Math.abs(startX - endX);\n var maxY = Math.max.apply(null, points.map(function (entry) {\n return entry.y || 0;\n }));\n\n if (isNumber(baseLine)) {\n maxY = Math.max(baseLine, maxY);\n } else if (baseLine && _isArray(baseLine) && baseLine.length) {\n maxY = Math.max(Math.max.apply(null, baseLine.map(function (entry) {\n return entry.y || 0;\n })), maxY);\n }\n\n if (isNumber(maxY)) {\n return React.createElement(\"rect\", {\n x: startX < endX ? startX : startX - width,\n y: 0,\n width: width,\n height: parseInt(maxY + (strokeWidth || 1), 10)\n });\n }\n\n return null;\n }\n }, {\n key: \"renderVerticalRect\",\n value: function renderVerticalRect(alpha) {\n var _this$props4 = this.props,\n baseLine = _this$props4.baseLine,\n points = _this$props4.points,\n strokeWidth = _this$props4.strokeWidth;\n var startY = points[0].y;\n var endY = points[points.length - 1].y;\n var height = alpha * Math.abs(startY - endY);\n var maxX = Math.max.apply(null, points.map(function (entry) {\n return entry.x || 0;\n }));\n\n if (isNumber(baseLine)) {\n maxX = Math.max(baseLine, maxX);\n } else if (baseLine && _isArray(baseLine) && baseLine.length) {\n maxX = Math.max(Math.max.apply(null, baseLine.map(function (entry) {\n return entry.x || 0;\n })), maxX);\n }\n\n if (isNumber(maxX)) {\n return React.createElement(\"rect\", {\n x: 0,\n y: startY < endY ? startY : startY - height,\n width: maxX + (strokeWidth || 1),\n height: parseInt(height, 10)\n });\n }\n\n return null;\n }\n }, {\n key: \"renderClipRect\",\n value: function renderClipRect(alpha) {\n var layout = this.props.layout;\n\n if (layout === 'vertical') {\n return this.renderVerticalRect(alpha);\n }\n\n return this.renderHorizontalRect(alpha);\n }\n }, {\n key: \"renderAreaStatically\",\n value: function renderAreaStatically(points, baseLine, needClip, clipPathId) {\n var _this$props5 = this.props,\n layout = _this$props5.layout,\n type = _this$props5.type,\n stroke = _this$props5.stroke,\n connectNulls = _this$props5.connectNulls,\n isRange = _this$props5.isRange;\n return React.createElement(Layer, {\n clipPath: needClip ? \"url(#clipPath-\".concat(clipPathId, \")\") : null\n }, React.createElement(Curve, _extends({}, this.props, {\n points: points,\n baseLine: baseLine,\n stroke: \"none\",\n className: \"recharts-area-area\"\n })), stroke !== 'none' && React.createElement(Curve, _extends({}, getPresentationAttributes(this.props), {\n className: \"recharts-area-curve\",\n layout: layout,\n type: type,\n connectNulls: connectNulls,\n fill: \"none\",\n points: points\n })), stroke !== 'none' && isRange && React.createElement(Curve, _extends({}, getPresentationAttributes(this.props), {\n className: \"recharts-area-curve\",\n layout: layout,\n type: type,\n connectNulls: connectNulls,\n fill: \"none\",\n points: baseLine\n })));\n }\n }, {\n key: \"renderAreaWithAnimation\",\n value: function renderAreaWithAnimation(needClip, clipPathId) {\n var _this3 = this;\n\n var _this$props6 = this.props,\n points = _this$props6.points,\n baseLine = _this$props6.baseLine,\n isAnimationActive = _this$props6.isAnimationActive,\n animationBegin = _this$props6.animationBegin,\n animationDuration = _this$props6.animationDuration,\n animationEasing = _this$props6.animationEasing,\n animationId = _this$props6.animationId;\n var _this$state = this.state,\n prevPoints = _this$state.prevPoints,\n prevBaseLine = _this$state.prevBaseLine; // const clipPathId = _.isNil(id) ? this.id : id;\n\n return React.createElement(Animate, {\n begin: animationBegin,\n duration: animationDuration,\n isActive: isAnimationActive,\n easing: animationEasing,\n from: {\n t: 0\n },\n to: {\n t: 1\n },\n key: \"area-\".concat(animationId),\n onAnimationEnd: this.handleAnimationEnd,\n onAnimationStart: this.handleAnimationStart\n }, function (_ref) {\n var t = _ref.t;\n\n if (prevPoints) {\n var prevPointsDiffFactor = prevPoints.length / points.length; // update animtaion\n\n var stepPoints = points.map(function (entry, index) {\n var prevPointIndex = Math.floor(index * prevPointsDiffFactor);\n\n if (prevPoints[prevPointIndex]) {\n var prev = prevPoints[prevPointIndex];\n var interpolatorX = interpolateNumber(prev.x, entry.x);\n var interpolatorY = interpolateNumber(prev.y, entry.y);\n return _objectSpread({}, entry, {\n x: interpolatorX(t),\n y: interpolatorY(t)\n });\n }\n\n return entry;\n });\n var stepBaseLine;\n\n if (isNumber(baseLine)) {\n var interpolator = interpolateNumber(prevBaseLine, baseLine);\n stepBaseLine = interpolator(t);\n } else if (_isNil(baseLine) || _isNaN(baseLine)) {\n var _interpolator = interpolateNumber(prevBaseLine, 0);\n\n stepBaseLine = _interpolator(t);\n } else {\n stepBaseLine = baseLine.map(function (entry, index) {\n var prevPointIndex = Math.floor(index * prevPointsDiffFactor);\n\n if (prevBaseLine[prevPointIndex]) {\n var prev = prevBaseLine[prevPointIndex];\n var interpolatorX = interpolateNumber(prev.x, entry.x);\n var interpolatorY = interpolateNumber(prev.y, entry.y);\n return _objectSpread({}, entry, {\n x: interpolatorX(t),\n y: interpolatorY(t)\n });\n }\n\n return entry;\n });\n }\n\n return _this3.renderAreaStatically(stepPoints, stepBaseLine, needClip, clipPathId);\n }\n\n return React.createElement(Layer, null, React.createElement(\"defs\", null, React.createElement(\"clipPath\", {\n id: \"animationClipPath-\".concat(clipPathId)\n }, _this3.renderClipRect(t))), React.createElement(Layer, {\n clipPath: \"url(#animationClipPath-\".concat(clipPathId, \")\")\n }, _this3.renderAreaStatically(points, baseLine, needClip, clipPathId)));\n });\n }\n }, {\n key: \"renderArea\",\n value: function renderArea(needClip, clipPathId) {\n var _this$props7 = this.props,\n points = _this$props7.points,\n baseLine = _this$props7.baseLine,\n isAnimationActive = _this$props7.isAnimationActive;\n var _this$state2 = this.state,\n prevPoints = _this$state2.prevPoints,\n prevBaseLine = _this$state2.prevBaseLine,\n totalLength = _this$state2.totalLength;\n\n if (isAnimationActive && points && points.length && (!prevPoints && totalLength > 0 || !_isEqual(prevPoints, points) || !_isEqual(prevBaseLine, baseLine))) {\n return this.renderAreaWithAnimation(needClip, clipPathId);\n }\n\n return this.renderAreaStatically(points, baseLine, needClip, clipPathId);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props8 = this.props,\n hide = _this$props8.hide,\n dot = _this$props8.dot,\n points = _this$props8.points,\n className = _this$props8.className,\n top = _this$props8.top,\n left = _this$props8.left,\n xAxis = _this$props8.xAxis,\n yAxis = _this$props8.yAxis,\n width = _this$props8.width,\n height = _this$props8.height,\n isAnimationActive = _this$props8.isAnimationActive,\n id = _this$props8.id;\n\n if (hide || !points || !points.length) {\n return null;\n }\n\n var isAnimationFinished = this.state.isAnimationFinished;\n var hasSinglePoint = points.length === 1;\n var layerClass = classNames('recharts-area', className);\n var needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow;\n var clipPathId = _isNil(id) ? this.id : id;\n return React.createElement(Layer, {\n className: layerClass\n }, needClip ? React.createElement(\"defs\", null, React.createElement(\"clipPath\", {\n id: \"clipPath-\".concat(clipPathId)\n }, React.createElement(\"rect\", {\n x: left,\n y: top,\n width: width,\n height: parseInt(height, 10)\n }))) : null, !hasSinglePoint ? this.renderArea(needClip, clipPathId) : null, (dot || hasSinglePoint) && this.renderDots(needClip, clipPathId), (!isAnimationActive || isAnimationFinished) && LabelList.renderCallByParent(this.props, points));\n }\n }]);\n\n return Area;\n}(Component), _class2.displayName = 'Area', _class2.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, EVENT_ATTRIBUTES, {\n className: PropTypes.string,\n dataKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func]).isRequired,\n type: PropTypes.oneOfType([PropTypes.oneOf(['basis', 'basisClosed', 'basisOpen', 'linear', 'linearClosed', 'natural', 'monotoneX', 'monotoneY', 'monotone', 'step', 'stepBefore', 'stepAfter']), PropTypes.func]),\n unit: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n name: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n yAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n xAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n yAxis: PropTypes.object,\n xAxis: PropTypes.object,\n stackId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n legendType: PropTypes.oneOf(LEGEND_TYPES),\n connectNulls: PropTypes.bool,\n activeDot: PropTypes.oneOfType([PropTypes.object, PropTypes.element, PropTypes.func, PropTypes.bool]),\n // dot configuration\n dot: PropTypes.oneOfType([PropTypes.func, PropTypes.element, PropTypes.object, PropTypes.bool]),\n label: PropTypes.oneOfType([PropTypes.func, PropTypes.element, PropTypes.object, PropTypes.bool]),\n hide: PropTypes.bool,\n // have curve configuration\n layout: PropTypes.oneOf(['horizontal', 'vertical']),\n baseLine: PropTypes.oneOfType([PropTypes.number, PropTypes.array]),\n isRange: PropTypes.bool,\n points: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.array])\n })),\n onAnimationStart: PropTypes.func,\n onAnimationEnd: PropTypes.func,\n animationId: PropTypes.number,\n isAnimationActive: PropTypes.bool,\n animationBegin: PropTypes.number,\n animationDuration: PropTypes.number,\n animationEasing: PropTypes.oneOf(['ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear']),\n id: PropTypes.string\n}), _class2.defaultProps = {\n stroke: '#3182bd',\n fill: '#3182bd',\n fillOpacity: 0.6,\n xAxisId: 0,\n yAxisId: 0,\n legendType: 'line',\n connectNulls: false,\n // points of area\n points: [],\n dot: false,\n activeDot: true,\n hide: false,\n isAnimationActive: !isSsr(),\n animationBegin: 0,\n animationDuration: 1500,\n animationEasing: 'ease'\n}, _class2.getBaseValue = function (props, xAxis, yAxis) {\n var layout = props.layout,\n baseValue = props.baseValue;\n\n if (isNumber(baseValue)) {\n return baseValue;\n }\n\n var numericAxis = layout === 'horizontal' ? yAxis : xAxis;\n var domain = numericAxis.scale.domain();\n\n if (numericAxis.type === 'number') {\n var max = Math.max(domain[0], domain[1]);\n var min = Math.min(domain[0], domain[1]);\n\n if (baseValue === 'dataMin') {\n return min;\n }\n\n if (baseValue === 'dataMax') {\n return max;\n }\n\n return max < 0 ? max : Math.max(Math.min(domain[0], domain[1]), 0);\n }\n\n if (baseValue === 'dataMin') {\n return domain[0];\n }\n\n if (baseValue === 'dataMax') {\n return domain[1];\n }\n\n return domain[0];\n}, _class2.getComposedData = function (_ref2) {\n var props = _ref2.props,\n xAxis = _ref2.xAxis,\n yAxis = _ref2.yAxis,\n xAxisTicks = _ref2.xAxisTicks,\n yAxisTicks = _ref2.yAxisTicks,\n bandSize = _ref2.bandSize,\n dataKey = _ref2.dataKey,\n stackedData = _ref2.stackedData,\n dataStartIndex = _ref2.dataStartIndex,\n displayedData = _ref2.displayedData,\n offset = _ref2.offset;\n var layout = props.layout;\n var hasStack = stackedData && stackedData.length;\n var baseValue = Area.getBaseValue(props, xAxis, yAxis);\n var isRange = false;\n var points = displayedData.map(function (entry, index) {\n var value;\n\n if (hasStack) {\n value = stackedData[dataStartIndex + index];\n } else {\n value = getValueByDataKey(entry, dataKey);\n\n if (!_isArray(value)) {\n value = [baseValue, value];\n } else {\n isRange = true;\n }\n }\n\n if (layout === 'horizontal') {\n return {\n x: getCateCoordinateOfLine({\n axis: xAxis,\n ticks: xAxisTicks,\n bandSize: bandSize,\n entry: entry,\n index: index\n }),\n y: _isNil(value[1]) ? null : yAxis.scale(value[1]),\n value: value,\n payload: entry\n };\n }\n\n return {\n x: _isNil(value[1]) ? null : xAxis.scale(value[1]),\n y: getCateCoordinateOfLine({\n axis: yAxis,\n ticks: yAxisTicks,\n bandSize: bandSize,\n entry: entry,\n index: index\n }),\n value: value,\n payload: entry\n };\n });\n var baseLine;\n\n if (hasStack || isRange) {\n baseLine = points.map(function (entry) {\n if (layout === 'horizontal') {\n return {\n x: entry.x,\n y: !_isNil(_get(entry, 'value[0]')) ? yAxis.scale(_get(entry, 'value[0]')) : null\n };\n }\n\n return {\n x: !_isNil(_get(entry, 'value[0]')) ? xAxis.scale(_get(entry, 'value[0]')) : null,\n y: entry.y\n };\n });\n } else if (layout === 'horizontal') {\n baseLine = yAxis.scale(baseValue);\n } else {\n baseLine = xAxis.scale(baseValue);\n }\n\n return _objectSpread({\n points: points,\n baseLine: baseLine,\n layout: layout,\n isRange: isRange\n }, offset);\n}, _class2.renderDotItem = function (option, props) {\n var dotItem;\n\n if (React.isValidElement(option)) {\n dotItem = React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n dotItem = option(props);\n } else {\n dotItem = React.createElement(Dot, _extends({}, props, {\n className: \"recharts-area-dot\"\n }));\n }\n\n return dotItem;\n}, _temp)) || _class;\n\nexport default Area;", + "function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar PREFIX_LIST = ['Webkit', 'Moz', 'O', 'ms'];\nexport var generatePrefixStyle = function generatePrefixStyle(name, value) {\n if (!name) {\n return null;\n }\n\n var camelName = name.replace(/(\\w)/, function (v) {\n return v.toUpperCase();\n });\n var result = PREFIX_LIST.reduce(function (res, entry) {\n return _objectSpread({}, res, _defineProperty({}, entry + camelName, value));\n }, {});\n result[name] = value;\n return result;\n};", + "import _range from \"lodash/range\";\nimport _isFunction from \"lodash/isFunction\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\n * @fileOverview Brush\n */\nimport React, { Component, Children } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { scalePoint } from 'd3-scale';\nimport { getValueByDataKey } from '../util/ChartUtils';\nimport pureRender from '../util/PureRender';\nimport Layer from '../container/Layer';\nimport Text from '../component/Text';\nimport { isNumber } from '../util/DataUtils';\nimport { generatePrefixStyle } from '../util/CssPrefixUtils';\n\nvar Brush = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Brush, _Component);\n\n function Brush(props) {\n var _this;\n\n _classCallCheck(this, Brush);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Brush).call(this, props));\n\n _this.handleDrag = function (e) {\n if (_this.leaveTimer) {\n clearTimeout(_this.leaveTimer);\n _this.leaveTimer = null;\n }\n\n if (_this.state.isTravellerMoving) {\n _this.handleTravellerMove(e);\n } else if (_this.state.isSlideMoving) {\n _this.handleSlideDrag(e);\n }\n };\n\n _this.handleTouchMove = function (e) {\n if (e.changedTouches != null && e.changedTouches.length > 0) {\n _this.handleDrag(e.changedTouches[0]);\n }\n };\n\n _this.handleDragEnd = function () {\n _this.setState({\n isTravellerMoving: false,\n isSlideMoving: false\n });\n };\n\n _this.handleLeaveWrapper = function () {\n if (_this.state.isTravellerMoving || _this.state.isSlideMoving) {\n _this.leaveTimer = setTimeout(_this.handleDragEnd, _this.props.leaveTimeOut);\n }\n };\n\n _this.handleEnterSlideOrTraveller = function () {\n _this.setState({\n isTextActive: true\n });\n };\n\n _this.handleLeaveSlideOrTraveller = function () {\n _this.setState({\n isTextActive: false\n });\n };\n\n _this.handleSlideDragStart = function (e) {\n var event = e.changedTouches && e.changedTouches.length ? e.changedTouches[0] : e;\n\n _this.setState({\n isTravellerMoving: false,\n isSlideMoving: true,\n slideMoveStartX: event.pageX\n });\n };\n\n _this.travellerDragStartHandlers = {\n startX: _this.handleTravellerDragStart.bind(_assertThisInitialized(_assertThisInitialized(_this)), 'startX'),\n endX: _this.handleTravellerDragStart.bind(_assertThisInitialized(_assertThisInitialized(_this)), 'endX')\n };\n _this.state = props.data && props.data.length ? _this.updateScale(props) : {};\n return _this;\n }\n\n _createClass(Brush, [{\n key: \"componentWillReceiveProps\",\n value: function componentWillReceiveProps(nextProps) {\n var _this2 = this;\n\n var _this$props = this.props,\n data = _this$props.data,\n width = _this$props.width,\n x = _this$props.x,\n travellerWidth = _this$props.travellerWidth,\n updateId = _this$props.updateId;\n\n if ((nextProps.data !== data || nextProps.updateId !== updateId) && nextProps.data && nextProps.data.length) {\n this.setState(this.updateScale(nextProps));\n } else if (nextProps.width !== width || nextProps.x !== x || nextProps.travellerWidth !== travellerWidth) {\n this.scale.range([nextProps.x, nextProps.x + nextProps.width - nextProps.travellerWidth]);\n this.scaleValues = this.scale.domain().map(function (entry) {\n return _this2.scale(entry);\n });\n this.setState({\n startX: this.scale(nextProps.startIndex),\n endX: this.scale(nextProps.endIndex)\n });\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.scale = null;\n this.scaleValues = null;\n\n if (this.leaveTimer) {\n clearTimeout(this.leaveTimer);\n this.leaveTimer = null;\n }\n }\n }, {\n key: \"getIndex\",\n value: function getIndex(_ref) {\n var startX = _ref.startX,\n endX = _ref.endX;\n var _this$props2 = this.props,\n gap = _this$props2.gap,\n data = _this$props2.data;\n var lastIndex = data.length - 1;\n var min = Math.min(startX, endX);\n var max = Math.max(startX, endX);\n var minIndex = this.constructor.getIndexInRange(this.scaleValues, min);\n var maxIndex = this.constructor.getIndexInRange(this.scaleValues, max);\n return {\n startIndex: minIndex - minIndex % gap,\n endIndex: maxIndex === lastIndex ? lastIndex : maxIndex - maxIndex % gap\n };\n }\n }, {\n key: \"getTextOfTick\",\n value: function getTextOfTick(index) {\n var _this$props3 = this.props,\n data = _this$props3.data,\n tickFormatter = _this$props3.tickFormatter,\n dataKey = _this$props3.dataKey;\n var text = getValueByDataKey(data[index], dataKey, index);\n return _isFunction(tickFormatter) ? tickFormatter(text) : text;\n }\n }, {\n key: \"handleSlideDrag\",\n value: function handleSlideDrag(e) {\n var _this$state = this.state,\n slideMoveStartX = _this$state.slideMoveStartX,\n startX = _this$state.startX,\n endX = _this$state.endX;\n var _this$props4 = this.props,\n x = _this$props4.x,\n width = _this$props4.width,\n travellerWidth = _this$props4.travellerWidth,\n startIndex = _this$props4.startIndex,\n endIndex = _this$props4.endIndex,\n onChange = _this$props4.onChange;\n var delta = e.pageX - slideMoveStartX;\n\n if (delta > 0) {\n delta = Math.min(delta, x + width - travellerWidth - endX, x + width - travellerWidth - startX);\n } else if (delta < 0) {\n delta = Math.max(delta, x - startX, x - endX);\n }\n\n var newIndex = this.getIndex({\n startX: startX + delta,\n endX: endX + delta\n });\n\n if ((newIndex.startIndex !== startIndex || newIndex.endIndex !== endIndex) && onChange) {\n onChange(newIndex);\n }\n\n this.setState({\n startX: startX + delta,\n endX: endX + delta,\n slideMoveStartX: e.pageX\n });\n }\n }, {\n key: \"handleTravellerDragStart\",\n value: function handleTravellerDragStart(id, e) {\n var event = e.changedTouches && e.changedTouches.length ? e.changedTouches[0] : e;\n this.setState({\n isSlideMoving: false,\n isTravellerMoving: true,\n movingTravellerId: id,\n brushMoveStartX: event.pageX\n });\n }\n }, {\n key: \"handleTravellerMove\",\n value: function handleTravellerMove(e) {\n var _this$setState;\n\n var _this$state2 = this.state,\n brushMoveStartX = _this$state2.brushMoveStartX,\n movingTravellerId = _this$state2.movingTravellerId,\n endX = _this$state2.endX,\n startX = _this$state2.startX;\n var prevValue = this.state[movingTravellerId];\n var _this$props5 = this.props,\n x = _this$props5.x,\n width = _this$props5.width,\n travellerWidth = _this$props5.travellerWidth,\n onChange = _this$props5.onChange,\n gap = _this$props5.gap,\n data = _this$props5.data;\n var params = {\n startX: this.state.startX,\n endX: this.state.endX\n };\n var delta = e.pageX - brushMoveStartX;\n\n if (delta > 0) {\n delta = Math.min(delta, x + width - travellerWidth - prevValue);\n } else if (delta < 0) {\n delta = Math.max(delta, x - prevValue);\n }\n\n params[movingTravellerId] = prevValue + delta;\n var newIndex = this.getIndex(params);\n var startIndex = newIndex.startIndex,\n endIndex = newIndex.endIndex;\n\n var isFullGap = function isFullGap() {\n var lastIndex = data.length - 1;\n\n if (movingTravellerId === 'startX' && (endX > startX ? startIndex % gap === 0 : endIndex % gap === 0) || endX < startX && endIndex === lastIndex || movingTravellerId === 'endX' && (endX > startX ? endIndex % gap === 0 : startIndex % gap === 0) || endX > startX && endIndex === lastIndex) {\n return true;\n }\n\n return false;\n };\n\n this.setState((_this$setState = {}, _defineProperty(_this$setState, movingTravellerId, prevValue + delta), _defineProperty(_this$setState, \"brushMoveStartX\", e.pageX), _this$setState), function () {\n if (onChange) {\n if (isFullGap()) {\n onChange(newIndex);\n }\n }\n });\n }\n }, {\n key: \"updateScale\",\n value: function updateScale(props) {\n var _this3 = this;\n\n var data = props.data,\n startIndex = props.startIndex,\n endIndex = props.endIndex,\n x = props.x,\n width = props.width,\n travellerWidth = props.travellerWidth;\n var len = data.length;\n this.scale = scalePoint().domain(_range(0, len)).range([x, x + width - travellerWidth]);\n this.scaleValues = this.scale.domain().map(function (entry) {\n return _this3.scale(entry);\n });\n return {\n isTextActive: false,\n isSlideMoving: false,\n isTravellerMoving: false,\n startX: this.scale(startIndex),\n endX: this.scale(endIndex)\n };\n }\n }, {\n key: \"renderBackground\",\n value: function renderBackground() {\n var _this$props6 = this.props,\n x = _this$props6.x,\n y = _this$props6.y,\n width = _this$props6.width,\n height = _this$props6.height,\n fill = _this$props6.fill,\n stroke = _this$props6.stroke;\n return React.createElement(\"rect\", {\n stroke: stroke,\n fill: fill,\n x: x,\n y: y,\n width: width,\n height: height\n });\n }\n }, {\n key: \"renderPanorama\",\n value: function renderPanorama() {\n var _this$props7 = this.props,\n x = _this$props7.x,\n y = _this$props7.y,\n width = _this$props7.width,\n height = _this$props7.height,\n data = _this$props7.data,\n children = _this$props7.children,\n padding = _this$props7.padding;\n var chartElement = Children.only(children);\n\n if (!chartElement) {\n return null;\n }\n\n return React.cloneElement(chartElement, {\n x: x,\n y: y,\n width: width,\n height: height,\n margin: padding,\n compact: true,\n data: data\n });\n }\n }, {\n key: \"renderTraveller\",\n value: function renderTraveller(travellerX, id) {\n var _this$props8 = this.props,\n y = _this$props8.y,\n travellerWidth = _this$props8.travellerWidth,\n height = _this$props8.height,\n stroke = _this$props8.stroke;\n var lineY = Math.floor(y + height / 2) - 1;\n var x = Math.max(travellerX, this.props.x);\n return React.createElement(Layer, {\n className: \"recharts-brush-traveller\",\n onMouseEnter: this.handleEnterSlideOrTraveller,\n onMouseLeave: this.handleLeaveSlideOrTraveller,\n onMouseDown: this.travellerDragStartHandlers[id],\n onTouchStart: this.travellerDragStartHandlers[id],\n style: {\n cursor: 'col-resize'\n }\n }, React.createElement(\"rect\", {\n x: x,\n y: y,\n width: travellerWidth,\n height: height,\n fill: stroke,\n stroke: \"none\"\n }), React.createElement(\"line\", {\n x1: x + 1,\n y1: lineY,\n x2: x + travellerWidth - 1,\n y2: lineY,\n fill: \"none\",\n stroke: \"#fff\"\n }), React.createElement(\"line\", {\n x1: x + 1,\n y1: lineY + 2,\n x2: x + travellerWidth - 1,\n y2: lineY + 2,\n fill: \"none\",\n stroke: \"#fff\"\n }));\n }\n }, {\n key: \"renderSlide\",\n value: function renderSlide(startX, endX) {\n var _this$props9 = this.props,\n y = _this$props9.y,\n height = _this$props9.height,\n stroke = _this$props9.stroke;\n return React.createElement(\"rect\", {\n className: \"recharts-brush-slide\",\n onMouseEnter: this.handleEnterSlideOrTraveller,\n onMouseLeave: this.handleLeaveSlideOrTraveller,\n onMouseDown: this.handleSlideDragStart,\n onTouchStart: this.handleSlideDragStart,\n style: {\n cursor: 'move'\n },\n stroke: \"none\",\n fill: stroke,\n fillOpacity: 0.2,\n x: Math.min(startX, endX),\n y: y,\n width: Math.abs(endX - startX),\n height: height\n });\n }\n }, {\n key: \"renderText\",\n value: function renderText() {\n var _this$props10 = this.props,\n startIndex = _this$props10.startIndex,\n endIndex = _this$props10.endIndex,\n y = _this$props10.y,\n height = _this$props10.height,\n travellerWidth = _this$props10.travellerWidth,\n stroke = _this$props10.stroke;\n var _this$state3 = this.state,\n startX = _this$state3.startX,\n endX = _this$state3.endX;\n var offset = 5;\n var attrs = {\n pointerEvents: 'none',\n fill: stroke\n };\n return React.createElement(Layer, {\n className: \"recharts-brush-texts\"\n }, React.createElement(Text, _extends({\n textAnchor: \"end\",\n verticalAnchor: \"middle\",\n x: Math.min(startX, endX) - offset,\n y: y + height / 2\n }, attrs), this.getTextOfTick(startIndex)), React.createElement(Text, _extends({\n textAnchor: \"start\",\n verticalAnchor: \"middle\",\n x: Math.max(startX, endX) + travellerWidth + offset,\n y: y + height / 2\n }, attrs), this.getTextOfTick(endIndex)));\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props11 = this.props,\n data = _this$props11.data,\n className = _this$props11.className,\n children = _this$props11.children,\n x = _this$props11.x,\n y = _this$props11.y,\n width = _this$props11.width,\n height = _this$props11.height;\n var _this$state4 = this.state,\n startX = _this$state4.startX,\n endX = _this$state4.endX,\n isTextActive = _this$state4.isTextActive,\n isSlideMoving = _this$state4.isSlideMoving,\n isTravellerMoving = _this$state4.isTravellerMoving;\n\n if (!data || !data.length || !isNumber(x) || !isNumber(y) || !isNumber(width) || !isNumber(height) || width <= 0 || height <= 0) {\n return null;\n }\n\n var layerClass = classNames('recharts-brush', className);\n var isPanoramic = React.Children.count(children) === 1;\n var style = generatePrefixStyle('userSelect', 'none');\n return React.createElement(Layer, {\n className: layerClass,\n onMouseMove: this.handleDrag,\n onMouseLeave: this.handleLeaveWrapper,\n onMouseUp: this.handleDragEnd,\n onTouchEnd: this.handleDragEnd,\n onTouchMove: this.handleTouchMove,\n style: style\n }, this.renderBackground(), isPanoramic && this.renderPanorama(), this.renderSlide(startX, endX), this.renderTraveller(startX, 'startX'), this.renderTraveller(endX, 'endX'), (isTextActive || isSlideMoving || isTravellerMoving) && this.renderText());\n }\n }], [{\n key: \"getIndexInRange\",\n value: function getIndexInRange(range, x) {\n var len = range.length;\n var start = 0;\n var end = len - 1;\n\n while (end - start > 1) {\n var middle = Math.floor((start + end) / 2);\n\n if (range[middle] > x) {\n end = middle;\n } else {\n start = middle;\n }\n }\n\n return x >= range[end] ? end : start;\n }\n }]);\n\n return Brush;\n}(Component), _class2.displayName = 'Brush', _class2.propTypes = {\n className: PropTypes.string,\n fill: PropTypes.string,\n stroke: PropTypes.string,\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number.isRequired,\n travellerWidth: PropTypes.number,\n gap: PropTypes.number,\n padding: PropTypes.shape({\n top: PropTypes.number,\n right: PropTypes.number,\n bottom: PropTypes.number,\n left: PropTypes.number\n }),\n dataKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func]),\n data: PropTypes.array,\n startIndex: PropTypes.number,\n endIndex: PropTypes.number,\n tickFormatter: PropTypes.func,\n children: PropTypes.node,\n onChange: PropTypes.func,\n updateId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n leaveTimeOut: PropTypes.number\n}, _class2.defaultProps = {\n height: 40,\n travellerWidth: 5,\n gap: 1,\n fill: '#fff',\n stroke: '#666',\n padding: {\n top: 1,\n right: 1,\n bottom: 1,\n left: 1\n },\n leaveTimeOut: 1000\n}, _temp)) || _class;\n\nexport default Brush;", + "import _isFunction from \"lodash/isFunction\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Cartesian Axis\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { shallowEqual } from '../util/PureRender';\nimport { getStringSize } from '../util/DOMUtils';\nimport Layer from '../container/Layer';\nimport Text from '../component/Text';\nimport Label from '../component/Label';\nimport { isSsr, PRESENTATION_ATTRIBUTES, EVENT_ATTRIBUTES, getPresentationAttributes, filterEventsOfChild } from '../util/ReactUtils';\nimport { isNumber, mathSign } from '../util/DataUtils';\n\nvar CartesianAxis =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(CartesianAxis, _Component);\n\n function CartesianAxis() {\n _classCallCheck(this, CartesianAxis);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(CartesianAxis).apply(this, arguments));\n }\n\n _createClass(CartesianAxis, [{\n key: \"shouldComponentUpdate\",\n value: function shouldComponentUpdate(_ref, state) {\n var viewBox = _ref.viewBox,\n restProps = _objectWithoutProperties(_ref, [\"viewBox\"]);\n\n // props.viewBox is sometimes generated every time -\n // check that specially as object equality is likely to fail\n var _this$props = this.props,\n viewBoxOld = _this$props.viewBox,\n restPropsOld = _objectWithoutProperties(_this$props, [\"viewBox\"]);\n\n return !shallowEqual(viewBox, viewBoxOld) || !shallowEqual(restProps, restPropsOld) || !shallowEqual(state, this.state);\n }\n /**\n * Calculate the coordinates of endpoints in ticks\n * @param {Object} data The data of a simple tick\n * @return {Object} (x1, y1): The coordinate of endpoint close to tick text\n * (x2, y2): The coordinate of endpoint close to axis\n */\n\n }, {\n key: \"getTickLineCoord\",\n value: function getTickLineCoord(data) {\n var _this$props2 = this.props,\n x = _this$props2.x,\n y = _this$props2.y,\n width = _this$props2.width,\n height = _this$props2.height,\n orientation = _this$props2.orientation,\n tickSize = _this$props2.tickSize,\n mirror = _this$props2.mirror,\n tickMargin = _this$props2.tickMargin;\n var x1, x2, y1, y2, tx, ty;\n var sign = mirror ? -1 : 1;\n var finalTickSize = data.tickSize || tickSize;\n var tickCoord = isNumber(data.tickCoord) ? data.tickCoord : data.coordinate;\n\n switch (orientation) {\n case 'top':\n x1 = x2 = data.coordinate;\n y2 = y + !mirror * height;\n y1 = y2 - sign * finalTickSize;\n ty = y1 - sign * tickMargin;\n tx = tickCoord;\n break;\n\n case 'left':\n y1 = y2 = data.coordinate;\n x2 = x + !mirror * width;\n x1 = x2 - sign * finalTickSize;\n tx = x1 - sign * tickMargin;\n ty = tickCoord;\n break;\n\n case 'right':\n y1 = y2 = data.coordinate;\n x2 = x + mirror * width;\n x1 = x2 + sign * finalTickSize;\n tx = x1 + sign * tickMargin;\n ty = tickCoord;\n break;\n\n default:\n x1 = x2 = data.coordinate;\n y2 = y + mirror * height;\n y1 = y2 + sign * finalTickSize;\n ty = y1 + sign * tickMargin;\n tx = tickCoord;\n break;\n }\n\n return {\n line: {\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n },\n tick: {\n x: tx,\n y: ty\n }\n };\n }\n }, {\n key: \"getTickTextAnchor\",\n value: function getTickTextAnchor() {\n var _this$props3 = this.props,\n orientation = _this$props3.orientation,\n mirror = _this$props3.mirror;\n var textAnchor;\n\n switch (orientation) {\n case 'left':\n textAnchor = mirror ? 'start' : 'end';\n break;\n\n case 'right':\n textAnchor = mirror ? 'end' : 'start';\n break;\n\n default:\n textAnchor = 'middle';\n break;\n }\n\n return textAnchor;\n }\n }, {\n key: \"getTickVerticalAnchor\",\n value: function getTickVerticalAnchor() {\n var _this$props4 = this.props,\n orientation = _this$props4.orientation,\n mirror = _this$props4.mirror;\n var verticalAnchor = 'end';\n\n switch (orientation) {\n case 'left':\n case 'right':\n verticalAnchor = 'middle';\n break;\n\n case 'top':\n verticalAnchor = mirror ? 'start' : 'end';\n break;\n\n default:\n verticalAnchor = mirror ? 'end' : 'start';\n break;\n }\n\n return verticalAnchor;\n }\n }, {\n key: \"renderAxisLine\",\n value: function renderAxisLine() {\n var _this$props5 = this.props,\n x = _this$props5.x,\n y = _this$props5.y,\n width = _this$props5.width,\n height = _this$props5.height,\n orientation = _this$props5.orientation,\n axisLine = _this$props5.axisLine,\n mirror = _this$props5.mirror;\n\n var props = _objectSpread({}, getPresentationAttributes(this.props), {\n fill: 'none'\n }, getPresentationAttributes(axisLine));\n\n if (orientation === 'top' || orientation === 'bottom') {\n var needHeight = orientation === 'top' && !mirror || orientation === 'bottom' && mirror;\n props = _objectSpread({}, props, {\n x1: x,\n y1: y + needHeight * height,\n x2: x + width,\n y2: y + needHeight * height\n });\n } else {\n var needWidth = orientation === 'left' && !mirror || orientation === 'right' && mirror;\n props = _objectSpread({}, props, {\n x1: x + needWidth * width,\n y1: y,\n x2: x + needWidth * width,\n y2: y + height\n });\n }\n\n return React.createElement(\"line\", _extends({\n className: \"recharts-cartesian-axis-line\"\n }, props));\n }\n }, {\n key: \"renderTicks\",\n\n /**\n * render the ticks\n * @param {Array} ticks The ticks to actually render (overrides what was passed in props)\n * @return {ReactComponent} renderedTicks\n */\n value: function renderTicks(ticks) {\n var _this = this;\n\n var _this$props6 = this.props,\n tickLine = _this$props6.tickLine,\n stroke = _this$props6.stroke,\n tick = _this$props6.tick,\n tickFormatter = _this$props6.tickFormatter,\n unit = _this$props6.unit;\n var finalTicks = CartesianAxis.getTicks(_objectSpread({}, this.props, {\n ticks: ticks\n }));\n var textAnchor = this.getTickTextAnchor();\n var verticalAnchor = this.getTickVerticalAnchor();\n var axisProps = getPresentationAttributes(this.props);\n var customTickProps = getPresentationAttributes(tick);\n\n var tickLineProps = _objectSpread({}, axisProps, {\n fill: 'none'\n }, getPresentationAttributes(tickLine));\n\n var items = finalTicks.map(function (entry, i) {\n var _this$getTickLineCoor = _this.getTickLineCoord(entry),\n lineCoord = _this$getTickLineCoor.line,\n tickCoord = _this$getTickLineCoor.tick;\n\n var tickProps = _objectSpread({\n textAnchor: textAnchor,\n verticalAnchor: verticalAnchor\n }, axisProps, {\n stroke: 'none',\n fill: stroke\n }, customTickProps, tickCoord, {\n index: i,\n payload: entry,\n visibleTicksCount: finalTicks.length\n });\n\n return React.createElement(Layer, _extends({\n className: \"recharts-cartesian-axis-tick\",\n key: \"tick-\".concat(i)\n }, filterEventsOfChild(_this.props, entry, i)), tickLine && React.createElement(\"line\", _extends({\n className: \"recharts-cartesian-axis-tick-line\"\n }, tickLineProps, lineCoord)), tick && _this.constructor.renderTickItem(tick, tickProps, \"\".concat(_isFunction(tickFormatter) ? tickFormatter(entry.value) : entry.value).concat(unit || '')));\n });\n return React.createElement(\"g\", {\n className: \"recharts-cartesian-axis-ticks\"\n }, items);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props7 = this.props,\n axisLine = _this$props7.axisLine,\n width = _this$props7.width,\n height = _this$props7.height,\n ticksGenerator = _this$props7.ticksGenerator,\n className = _this$props7.className,\n hide = _this$props7.hide;\n\n if (hide) {\n return null;\n }\n\n var _this$props8 = this.props,\n ticks = _this$props8.ticks,\n noTicksProps = _objectWithoutProperties(_this$props8, [\"ticks\"]);\n\n var finalTicks = ticks;\n\n if (_isFunction(ticksGenerator)) {\n finalTicks = ticks && ticks.length > 0 ? ticksGenerator(this.props) : ticksGenerator(noTicksProps);\n }\n\n if (width <= 0 || height <= 0 || !finalTicks || !finalTicks.length) {\n return null;\n }\n\n return React.createElement(Layer, {\n className: classNames('recharts-cartesian-axis', className)\n }, axisLine && this.renderAxisLine(), this.renderTicks(finalTicks), Label.renderCallByParent(this.props));\n }\n }], [{\n key: \"getTicks\",\n value: function getTicks(props) {\n var tick = props.tick,\n ticks = props.ticks,\n viewBox = props.viewBox,\n minTickGap = props.minTickGap,\n orientation = props.orientation,\n interval = props.interval,\n tickFormatter = props.tickFormatter,\n unit = props.unit;\n\n if (!ticks || !ticks.length || !tick) {\n return [];\n }\n\n if (isNumber(interval) || isSsr()) {\n return CartesianAxis.getNumberIntervalTicks(ticks, isNumber(interval) ? interval : 0);\n }\n\n if (interval === 'preserveStartEnd') {\n return CartesianAxis.getTicksStart({\n ticks: ticks,\n tickFormatter: tickFormatter,\n viewBox: viewBox,\n orientation: orientation,\n minTickGap: minTickGap,\n unit: unit\n }, true);\n }\n\n if (interval === 'preserveStart') {\n return CartesianAxis.getTicksStart({\n ticks: ticks,\n tickFormatter: tickFormatter,\n viewBox: viewBox,\n orientation: orientation,\n minTickGap: minTickGap,\n unit: unit\n });\n }\n\n return CartesianAxis.getTicksEnd({\n ticks: ticks,\n tickFormatter: tickFormatter,\n viewBox: viewBox,\n orientation: orientation,\n minTickGap: minTickGap,\n unit: unit\n });\n }\n }, {\n key: \"getNumberIntervalTicks\",\n value: function getNumberIntervalTicks(ticks, interval) {\n return ticks.filter(function (entry, i) {\n return i % (interval + 1) === 0;\n });\n }\n }, {\n key: \"getTicksStart\",\n value: function getTicksStart(_ref2, preserveEnd) {\n var ticks = _ref2.ticks,\n tickFormatter = _ref2.tickFormatter,\n viewBox = _ref2.viewBox,\n orientation = _ref2.orientation,\n minTickGap = _ref2.minTickGap,\n unit = _ref2.unit;\n var x = viewBox.x,\n y = viewBox.y,\n width = viewBox.width,\n height = viewBox.height;\n var sizeKey = orientation === 'top' || orientation === 'bottom' ? 'width' : 'height';\n var result = (ticks || []).slice(); // we need add the width of 'unit' only when sizeKey === 'width'\n\n var unitSize = unit && sizeKey === 'width' ? getStringSize(unit)[sizeKey] : 0;\n var len = result.length;\n var sign = len >= 2 ? mathSign(result[1].coordinate - result[0].coordinate) : 1;\n var start, end;\n\n if (sign === 1) {\n start = sizeKey === 'width' ? x : y;\n end = sizeKey === 'width' ? x + width : y + height;\n } else {\n start = sizeKey === 'width' ? x + width : y + height;\n end = sizeKey === 'width' ? x : y;\n }\n\n if (preserveEnd) {\n // Try to guarantee the tail to be displayed\n var tail = ticks[len - 1];\n var tailContent = _isFunction(tickFormatter) ? tickFormatter(tail.value) : tail.value;\n var tailSize = getStringSize(tailContent)[sizeKey] + unitSize;\n var tailGap = sign * (tail.coordinate + sign * tailSize / 2 - end);\n result[len - 1] = tail = _objectSpread({}, tail, {\n tickCoord: tailGap > 0 ? tail.coordinate - tailGap * sign : tail.coordinate\n });\n var isTailShow = sign * (tail.tickCoord - sign * tailSize / 2 - start) >= 0 && sign * (tail.tickCoord + sign * tailSize / 2 - end) <= 0;\n\n if (isTailShow) {\n end = tail.tickCoord - sign * (tailSize / 2 + minTickGap);\n result[len - 1] = _objectSpread({}, tail, {\n isShow: true\n });\n }\n }\n\n var count = preserveEnd ? len - 1 : len;\n\n for (var i = 0; i < count; i++) {\n var entry = result[i];\n var content = _isFunction(tickFormatter) ? tickFormatter(entry.value) : entry.value;\n var size = getStringSize(content)[sizeKey] + unitSize;\n\n if (i === 0) {\n var gap = sign * (entry.coordinate - sign * size / 2 - start);\n result[i] = entry = _objectSpread({}, entry, {\n tickCoord: gap < 0 ? entry.coordinate - gap * sign : entry.coordinate\n });\n } else {\n result[i] = entry = _objectSpread({}, entry, {\n tickCoord: entry.coordinate\n });\n }\n\n var isShow = sign * (entry.tickCoord - sign * size / 2 - start) >= 0 && sign * (entry.tickCoord + sign * size / 2 - end) <= 0;\n\n if (isShow) {\n start = entry.tickCoord + sign * (size / 2 + minTickGap);\n result[i] = _objectSpread({}, entry, {\n isShow: true\n });\n }\n }\n\n return result.filter(function (entry) {\n return entry.isShow;\n });\n }\n }, {\n key: \"getTicksEnd\",\n value: function getTicksEnd(_ref3) {\n var ticks = _ref3.ticks,\n tickFormatter = _ref3.tickFormatter,\n viewBox = _ref3.viewBox,\n orientation = _ref3.orientation,\n minTickGap = _ref3.minTickGap,\n unit = _ref3.unit;\n var x = viewBox.x,\n y = viewBox.y,\n width = viewBox.width,\n height = viewBox.height;\n var sizeKey = orientation === 'top' || orientation === 'bottom' ? 'width' : 'height'; // we need add the width of 'unit' only when sizeKey === 'width'\n\n var unitSize = unit && sizeKey === 'width' ? getStringSize(unit)[sizeKey] : 0;\n var result = (ticks || []).slice();\n var len = result.length;\n var sign = len >= 2 ? mathSign(result[1].coordinate - result[0].coordinate) : 1;\n var start, end;\n\n if (sign === 1) {\n start = sizeKey === 'width' ? x : y;\n end = sizeKey === 'width' ? x + width : y + height;\n } else {\n start = sizeKey === 'width' ? x + width : y + height;\n end = sizeKey === 'width' ? x : y;\n }\n\n for (var i = len - 1; i >= 0; i--) {\n var entry = result[i];\n var content = _isFunction(tickFormatter) ? tickFormatter(entry.value) : entry.value;\n var size = getStringSize(content)[sizeKey] + unitSize;\n\n if (i === len - 1) {\n var gap = sign * (entry.coordinate + sign * size / 2 - end);\n result[i] = entry = _objectSpread({}, entry, {\n tickCoord: gap > 0 ? entry.coordinate - gap * sign : entry.coordinate\n });\n } else {\n result[i] = entry = _objectSpread({}, entry, {\n tickCoord: entry.coordinate\n });\n }\n\n var isShow = sign * (entry.tickCoord - sign * size / 2 - start) >= 0 && sign * (entry.tickCoord + sign * size / 2 - end) <= 0;\n\n if (isShow) {\n end = entry.tickCoord - sign * (size / 2 + minTickGap);\n result[i] = _objectSpread({}, entry, {\n isShow: true\n });\n }\n }\n\n return result.filter(function (entry) {\n return entry.isShow;\n });\n }\n }, {\n key: \"renderTickItem\",\n value: function renderTickItem(option, props, value) {\n var tickItem;\n\n if (React.isValidElement(option)) {\n tickItem = React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n tickItem = option(props);\n } else {\n tickItem = React.createElement(Text, _extends({}, props, {\n className: \"recharts-cartesian-axis-tick-value\"\n }), value);\n }\n\n return tickItem;\n }\n }]);\n\n return CartesianAxis;\n}(Component);\n\nCartesianAxis.displayName = 'CartesianAxis';\nCartesianAxis.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, EVENT_ATTRIBUTES, {\n className: PropTypes.string,\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number,\n orientation: PropTypes.oneOf(['top', 'bottom', 'left', 'right']),\n // The viewBox of svg\n viewBox: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number\n }),\n tick: PropTypes.oneOfType([PropTypes.bool, PropTypes.func, PropTypes.object, PropTypes.element]),\n axisLine: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),\n tickLine: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),\n mirror: PropTypes.bool,\n tickMargin: PropTypes.number.isRequired,\n minTickGap: PropTypes.number,\n ticks: PropTypes.array,\n tickSize: PropTypes.number,\n stroke: PropTypes.string,\n tickFormatter: PropTypes.func,\n ticksGenerator: PropTypes.func,\n interval: PropTypes.oneOfType([PropTypes.number, PropTypes.oneOf(['preserveStart', 'preserveEnd', 'preserveStartEnd'])])\n});\nCartesianAxis.defaultProps = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n viewBox: {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n },\n // The orientation of axis\n orientation: 'bottom',\n // The ticks\n ticks: [],\n stroke: '#666',\n tickLine: true,\n axisLine: true,\n tick: true,\n mirror: false,\n minTickGap: 5,\n // The width or height of tick\n tickSize: 6,\n tickMargin: 2,\n interval: 'preserveEnd'\n};\nexport default CartesianAxis;", + "function _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Render a group of error bar\n*/\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Layer from '../container/Layer';\nimport { getPresentationAttributes } from '../util/ReactUtils';\n\nvar ErrorBar =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(ErrorBar, _Component);\n\n function ErrorBar() {\n _classCallCheck(this, ErrorBar);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(ErrorBar).apply(this, arguments));\n }\n\n _createClass(ErrorBar, [{\n key: \"renderErrorBars\",\n value: function renderErrorBars() {\n var _this$props = this.props,\n offset = _this$props.offset,\n layout = _this$props.layout,\n width = _this$props.width,\n dataKey = _this$props.dataKey,\n data = _this$props.data,\n dataPointFormatter = _this$props.dataPointFormatter,\n xAxis = _this$props.xAxis,\n yAxis = _this$props.yAxis,\n others = _objectWithoutProperties(_this$props, [\"offset\", \"layout\", \"width\", \"dataKey\", \"data\", \"dataPointFormatter\", \"xAxis\", \"yAxis\"]);\n\n var props = getPresentationAttributes(others);\n return data.map(function (entry, i) {\n var _dataPointFormatter = dataPointFormatter(entry, dataKey),\n x = _dataPointFormatter.x,\n y = _dataPointFormatter.y,\n value = _dataPointFormatter.value,\n errorVal = _dataPointFormatter.errorVal;\n\n if (!errorVal) {\n return null;\n }\n\n var xMid, yMid, xMin, yMin, xMax, yMax, scale, coordsTop, coordsMid, coordsBot, lowBound, highBound;\n\n if (Array.isArray(errorVal)) {\n var _errorVal = _slicedToArray(errorVal, 2);\n\n lowBound = _errorVal[0];\n highBound = _errorVal[1];\n } else {\n lowBound = highBound = errorVal;\n }\n\n if (layout === 'vertical') {\n scale = xAxis.scale;\n xMid = value;\n yMid = y + offset;\n xMin = scale(xMid - lowBound);\n yMin = yMid + width;\n xMax = scale(xMid + highBound);\n yMax = yMid - width;\n coordsTop = {\n x1: xMax,\n y1: yMin,\n x2: xMax,\n y2: yMax\n };\n coordsMid = {\n x1: xMin,\n y1: yMid,\n x2: xMax,\n y2: yMid\n };\n coordsBot = {\n x1: xMin,\n y1: yMin,\n x2: xMin,\n y2: yMax\n };\n } else if (layout === 'horizontal') {\n scale = yAxis.scale;\n xMid = x + offset;\n yMid = value;\n xMin = xMid - width;\n xMax = xMid + width;\n yMin = scale(yMid - lowBound);\n yMax = scale(yMid + highBound);\n coordsTop = {\n x1: xMin,\n y1: yMax,\n x2: xMax,\n y2: yMax\n };\n coordsMid = {\n x1: xMid,\n y1: yMin,\n x2: xMid,\n y2: yMax\n };\n coordsBot = {\n x1: xMin,\n y1: yMin,\n x2: xMax,\n y2: yMin\n };\n }\n\n return React.createElement(Layer, _extends({\n className: \"recharts-errorBar\",\n key: \"bar-\".concat(i)\n }, props), React.createElement(\"line\", coordsTop), React.createElement(\"line\", coordsMid), React.createElement(\"line\", coordsBot));\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n return React.createElement(Layer, {\n className: \"recharts-errorBars\"\n }, this.renderErrorBars());\n }\n }]);\n\n return ErrorBar;\n}(Component);\n\nErrorBar.propTypes = {\n dataKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func]).isRequired,\n data: PropTypes.array,\n xAxis: PropTypes.object,\n yAxis: PropTypes.object,\n layout: PropTypes.string,\n dataPointFormatter: PropTypes.func,\n stroke: PropTypes.string,\n strokeWidth: PropTypes.number,\n width: PropTypes.number,\n offset: PropTypes.number\n};\nErrorBar.defaultProps = {\n stroke: 'black',\n strokeWidth: 1.5,\n width: 5,\n offset: 0,\n layout: 'horizontal'\n};\nexport default ErrorBar;", + "import _isFunction from \"lodash/isFunction\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Reference Line\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport Layer from '../container/Layer';\nimport Label from '../component/Label';\nimport { LabeledScaleHelper, rectWithPoints } from '../util/CartesianUtils';\nimport { ifOverflowMatches } from '../util/ChartUtils';\nimport { isNumOrStr } from '../util/DataUtils';\nimport { warn } from '../util/LogUtils';\nimport { PRESENTATION_ATTRIBUTES } from '../util/ReactUtils';\nimport Rectangle from '../shape/Rectangle';\n\nvar ReferenceArea = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(ReferenceArea, _Component);\n\n function ReferenceArea() {\n _classCallCheck(this, ReferenceArea);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(ReferenceArea).apply(this, arguments));\n }\n\n _createClass(ReferenceArea, [{\n key: \"getRect\",\n value: function getRect(hasX1, hasX2, hasY1, hasY2) {\n var _this$props = this.props,\n xValue1 = _this$props.x1,\n xValue2 = _this$props.x2,\n yValue1 = _this$props.y1,\n yValue2 = _this$props.y2,\n xAxis = _this$props.xAxis,\n yAxis = _this$props.yAxis;\n var scale = LabeledScaleHelper.create({\n x: xAxis.scale,\n y: yAxis.scale\n });\n var p1 = {\n x: hasX1 ? scale.x.apply(xValue1) : scale.x.rangeMin,\n y: hasY1 ? scale.y.apply(yValue1) : scale.y.rangeMin\n };\n var p2 = {\n x: hasX2 ? scale.x.apply(xValue2) : scale.x.rangeMax,\n y: hasY2 ? scale.y.apply(yValue2) : scale.y.rangeMax\n };\n\n if (ifOverflowMatches(this.props, 'discard') && (!scale.isInRange(p1) || !scale.isInRange(p2))) {\n return null;\n }\n\n return rectWithPoints(p1, p2);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n x1 = _this$props2.x1,\n x2 = _this$props2.x2,\n y1 = _this$props2.y1,\n y2 = _this$props2.y2,\n className = _this$props2.className,\n alwaysShow = _this$props2.alwaysShow,\n clipPathId = _this$props2.clipPathId;\n warn(alwaysShow === undefined, 'The alwaysShow prop is deprecated. Please use ifOverflow=\"extendDomain\" instead.');\n var hasX1 = isNumOrStr(x1);\n var hasX2 = isNumOrStr(x2);\n var hasY1 = isNumOrStr(y1);\n var hasY2 = isNumOrStr(y2);\n\n if (!hasX1 && !hasX2 && !hasY1 && !hasY2) {\n return null;\n }\n\n var rect = this.getRect(hasX1, hasX2, hasY1, hasY2);\n\n if (!rect) {\n return null;\n }\n\n var shape = this.props.shape;\n var clipPath = ifOverflowMatches(this.props, 'hidden') ? \"url(#\".concat(clipPathId, \")\") : undefined;\n return React.createElement(Layer, {\n className: classNames('recharts-reference-area', className)\n }, this.constructor.renderRect(shape, _objectSpread({\n clipPath: clipPath\n }, this.props, rect)), Label.renderCallByParent(this.props, rect));\n }\n }], [{\n key: \"renderRect\",\n value: function renderRect(option, props) {\n var rect;\n\n if (React.isValidElement(option)) {\n rect = React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n rect = option(props);\n } else {\n rect = React.createElement(Rectangle, _extends({}, props, {\n className: \"recharts-reference-area-rect\"\n }));\n }\n\n return rect;\n }\n }]);\n\n return ReferenceArea;\n}(Component), _class2.displayName = 'ReferenceArea', _class2.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, {\n viewBox: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number\n }),\n xAxis: PropTypes.object,\n yAxis: PropTypes.object,\n isFront: PropTypes.bool,\n alwaysShow: PropTypes.bool,\n ifOverflow: PropTypes.oneOf(['hidden', 'visible', 'discard', 'extendDomain']),\n x1: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n x2: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n y1: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n y2: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n className: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n yAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n xAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n shape: PropTypes.oneOfType([PropTypes.func, PropTypes.element])\n}), _class2.defaultProps = {\n isFront: false,\n ifOverflow: 'discard',\n xAxisId: 0,\n yAxisId: 0,\n r: 10,\n fill: '#ccc',\n fillOpacity: 0.5,\n stroke: 'none',\n strokeWidth: 1\n}, _temp)) || _class;\n\nexport default ReferenceArea;", + "import _isFunction from \"lodash/isFunction\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Reference Dot\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport Layer from '../container/Layer';\nimport Dot from '../shape/Dot';\nimport { PRESENTATION_ATTRIBUTES, EVENT_ATTRIBUTES, getPresentationAttributes, filterEventAttributes } from '../util/ReactUtils';\nimport Label from '../component/Label';\nimport { isNumOrStr } from '../util/DataUtils';\nimport { ifOverflowMatches } from '../util/ChartUtils';\nimport { LabeledScaleHelper } from '../util/CartesianUtils';\nimport { warn } from '../util/LogUtils';\n\nvar ReferenceDot = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(ReferenceDot, _Component);\n\n function ReferenceDot() {\n _classCallCheck(this, ReferenceDot);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(ReferenceDot).apply(this, arguments));\n }\n\n _createClass(ReferenceDot, [{\n key: \"getCoordinate\",\n value: function getCoordinate() {\n var _this$props = this.props,\n x = _this$props.x,\n y = _this$props.y,\n xAxis = _this$props.xAxis,\n yAxis = _this$props.yAxis;\n var scales = LabeledScaleHelper.create({\n x: xAxis.scale,\n y: yAxis.scale\n });\n var result = scales.apply({\n x: x,\n y: y\n }, {\n bandAware: true\n });\n\n if (ifOverflowMatches(this.props, 'discard') && !scales.isInRange(result)) {\n return null;\n }\n\n return result;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n x = _this$props2.x,\n y = _this$props2.y,\n r = _this$props2.r,\n alwaysShow = _this$props2.alwaysShow,\n clipPathId = _this$props2.clipPathId;\n var isX = isNumOrStr(x);\n var isY = isNumOrStr(y);\n warn(alwaysShow === undefined, 'The alwaysShow prop is deprecated. Please use ifOverflow=\"extendDomain\" instead.');\n\n if (!isX || !isY) {\n return null;\n }\n\n var coordinate = this.getCoordinate();\n\n if (!coordinate) {\n return null;\n }\n\n var cx = coordinate.x,\n cy = coordinate.y;\n var _this$props3 = this.props,\n shape = _this$props3.shape,\n className = _this$props3.className;\n var clipPath = ifOverflowMatches(this.props, 'hidden') ? \"url(#\".concat(clipPathId, \")\") : undefined;\n\n var dotProps = _objectSpread({\n clipPath: clipPath\n }, getPresentationAttributes(this.props), filterEventAttributes(this.props), {\n cx: cx,\n cy: cy\n });\n\n return React.createElement(Layer, {\n className: classNames('recharts-reference-dot', className)\n }, this.constructor.renderDot(shape, dotProps), Label.renderCallByParent(this.props, {\n x: cx - r,\n y: cy - r,\n width: 2 * r,\n height: 2 * r\n }));\n }\n }], [{\n key: \"renderDot\",\n value: function renderDot(option, props) {\n var dot;\n\n if (React.isValidElement(option)) {\n dot = React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n dot = option(props);\n } else {\n dot = React.createElement(Dot, _extends({}, props, {\n cx: props.cx,\n cy: props.cy,\n className: \"recharts-reference-dot-dot\"\n }));\n }\n\n return dot;\n }\n }]);\n\n return ReferenceDot;\n}(Component), _class2.displayName = 'ReferenceDot', _class2.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, EVENT_ATTRIBUTES, {\n r: PropTypes.number,\n xAxis: PropTypes.shape({\n scale: PropTypes.func\n }),\n yAxis: PropTypes.shape({\n scale: PropTypes.func\n }),\n isFront: PropTypes.bool,\n alwaysShow: PropTypes.bool,\n ifOverflow: PropTypes.oneOf(['hidden', 'visible', 'discard', 'extendDomain']),\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n y: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n className: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n yAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n xAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n shape: PropTypes.oneOfType([PropTypes.func, PropTypes.element]),\n clipPathId: PropTypes.string\n}), _class2.defaultProps = {\n isFront: false,\n ifOverflow: 'discard',\n xAxisId: 0,\n yAxisId: 0,\n r: 10,\n fill: '#fff',\n stroke: '#ccc',\n fillOpacity: 1,\n strokeWidth: 1\n}, _temp)) || _class;\n\nexport default ReferenceDot;", + "import _some from \"lodash/some\";\nimport _isFunction from \"lodash/isFunction\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\n/**\n * @fileOverview Reference Line\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport Layer from '../container/Layer';\nimport { PRESENTATION_ATTRIBUTES, getPresentationAttributes, filterEventAttributes } from '../util/ReactUtils';\nimport Label from '../component/Label';\nimport { ifOverflowMatches } from '../util/ChartUtils';\nimport { isNumOrStr } from '../util/DataUtils';\nimport { LabeledScaleHelper, rectWithCoords } from '../util/CartesianUtils';\nimport { warn } from '../util/LogUtils';\n\nvar renderLine = function renderLine(option, props) {\n var line;\n\n if (React.isValidElement(option)) {\n line = React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n line = option(props);\n } else {\n line = React.createElement(\"line\", _extends({}, props, {\n className: \"recharts-reference-line-line\"\n }));\n }\n\n return line;\n};\n\nvar ReferenceLine = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(ReferenceLine, _Component);\n\n function ReferenceLine() {\n _classCallCheck(this, ReferenceLine);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(ReferenceLine).apply(this, arguments));\n }\n\n _createClass(ReferenceLine, [{\n key: \"getEndPoints\",\n value: function getEndPoints(scales, isFixedX, isFixedY, isSegment) {\n var _this$props$viewBox = this.props.viewBox,\n x = _this$props$viewBox.x,\n y = _this$props$viewBox.y,\n width = _this$props$viewBox.width,\n height = _this$props$viewBox.height;\n\n if (isFixedY) {\n var _this$props = this.props,\n yCoord = _this$props.y,\n orientation = _this$props.yAxis.orientation;\n var coord = scales.y.apply(yCoord, {\n bandAware: true\n });\n\n if (ifOverflowMatches(this.props, 'discard') && !scales.y.isInRange(coord)) {\n return null;\n }\n\n var points = [{\n x: x + width,\n y: coord\n }, {\n x: x,\n y: coord\n }];\n return orientation === 'left' ? points.reverse() : points;\n }\n\n if (isFixedX) {\n var _this$props2 = this.props,\n xCoord = _this$props2.x,\n _orientation = _this$props2.xAxis.orientation;\n\n var _coord = scales.x.apply(xCoord, {\n bandAware: true\n });\n\n if (ifOverflowMatches(this.props, 'discard') && !scales.x.isInRange(_coord)) {\n return null;\n }\n\n var _points = [{\n x: _coord,\n y: y + height\n }, {\n x: _coord,\n y: y\n }];\n return _orientation === 'top' ? _points.reverse() : _points;\n }\n\n if (isSegment) {\n var segment = this.props.segment;\n\n var _points2 = segment.map(function (p) {\n return scales.apply(p, {\n bandAware: true\n });\n });\n\n if (ifOverflowMatches(this.props, 'discard') && _some(_points2, function (p) {\n return !scales.isInRange(p);\n })) {\n return null;\n }\n\n return _points2;\n }\n\n return null;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props3 = this.props,\n fixedX = _this$props3.x,\n fixedY = _this$props3.y,\n segment = _this$props3.segment,\n xAxis = _this$props3.xAxis,\n yAxis = _this$props3.yAxis,\n shape = _this$props3.shape,\n className = _this$props3.className,\n alwaysShow = _this$props3.alwaysShow,\n clipPathId = _this$props3.clipPathId;\n warn(alwaysShow === undefined, 'The alwaysShow prop is deprecated. Please use ifOverflow=\"extendDomain\" instead.');\n var scales = LabeledScaleHelper.create({\n x: xAxis.scale,\n y: yAxis.scale\n });\n var isX = isNumOrStr(fixedX);\n var isY = isNumOrStr(fixedY);\n var isSegment = segment && segment.length === 2;\n var endPoints = this.getEndPoints(scales, isX, isY, isSegment);\n\n if (!endPoints) {\n return null;\n }\n\n var _endPoints = _slicedToArray(endPoints, 2),\n _endPoints$ = _endPoints[0],\n x1 = _endPoints$.x,\n y1 = _endPoints$.y,\n _endPoints$2 = _endPoints[1],\n x2 = _endPoints$2.x,\n y2 = _endPoints$2.y;\n\n var clipPath = ifOverflowMatches(this.props, 'hidden') ? \"url(#\".concat(clipPathId, \")\") : undefined;\n\n var props = _objectSpread({\n clipPath: clipPath\n }, getPresentationAttributes(this.props), filterEventAttributes(this.props), {\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n });\n\n return React.createElement(Layer, {\n className: classNames('recharts-reference-line', className)\n }, renderLine(shape, props), Label.renderCallByParent(this.props, rectWithCoords({\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n })));\n }\n }]);\n\n return ReferenceLine;\n}(Component), _class2.displayName = 'ReferenceLine', _class2.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, {\n viewBox: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number\n }),\n xAxis: PropTypes.object,\n yAxis: PropTypes.object,\n isFront: PropTypes.bool,\n alwaysShow: PropTypes.bool,\n ifOverflow: PropTypes.oneOf(['hidden', 'visible', 'discard', 'extendDomain']),\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n y: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n segment: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n y: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n })),\n className: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n yAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n xAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n shape: PropTypes.func\n}), _class2.defaultProps = {\n isFront: false,\n ifOverflow: 'discard',\n xAxisId: 0,\n yAxisId: 0,\n fill: 'none',\n stroke: '#ccc',\n fillOpacity: 1,\n strokeWidth: 1\n}, _temp)) || _class;\n\nexport default ReferenceLine;", + "var _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview X Axis\n */\nimport { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport pureRender from '../util/PureRender';\nimport { SCALE_TYPES } from '../util/ReactUtils';\n\nvar XAxis = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(XAxis, _Component);\n\n function XAxis() {\n _classCallCheck(this, XAxis);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(XAxis).apply(this, arguments));\n }\n\n _createClass(XAxis, [{\n key: \"render\",\n value: function render() {\n return null;\n }\n }]);\n\n return XAxis;\n}(Component), _class2.displayName = 'XAxis', _class2.propTypes = {\n allowDecimals: PropTypes.bool,\n allowDuplicatedCategory: PropTypes.bool,\n hide: PropTypes.bool,\n // The name of data displayed in the axis\n name: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n // The unit of data displayed in the axis\n unit: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n // The unique id of x-axis\n xAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n domain: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func, PropTypes.oneOf(['auto', 'dataMin', 'dataMax'])])),\n // The key of data displayed in the axis\n dataKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func]),\n // The width of axis which is usually calculated internally\n width: PropTypes.number,\n // The height of axis, which need to be setted by user\n height: PropTypes.number,\n mirror: PropTypes.bool,\n // The orientation of axis\n orientation: PropTypes.oneOf(['top', 'bottom']),\n type: PropTypes.oneOf(['number', 'category']),\n // Ticks can be any type when the axis is the type of category\n // Ticks must be numbers when the axis is the type of number\n ticks: PropTypes.array,\n // The count of ticks\n tickCount: PropTypes.number,\n // The formatter function of tick\n tickFormatter: PropTypes.func,\n padding: PropTypes.shape({\n left: PropTypes.number,\n right: PropTypes.number\n }),\n allowDataOverflow: PropTypes.bool,\n scale: PropTypes.oneOfType([PropTypes.oneOf(SCALE_TYPES), PropTypes.func]),\n tick: PropTypes.oneOfType([PropTypes.bool, PropTypes.func, PropTypes.object, PropTypes.element]),\n axisLine: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),\n tickLine: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),\n minTickGap: PropTypes.number,\n tickSize: PropTypes.number,\n interval: PropTypes.oneOfType([PropTypes.number, PropTypes.oneOf(['preserveStart', 'preserveEnd', 'preserveStartEnd'])]),\n reversed: PropTypes.bool\n}, _class2.defaultProps = {\n allowDecimals: true,\n hide: false,\n orientation: 'bottom',\n width: 0,\n height: 30,\n mirror: false,\n xAxisId: 0,\n tickCount: 5,\n type: 'category',\n domain: [0, 'auto'],\n padding: {\n left: 0,\n right: 0\n },\n allowDataOverflow: false,\n scale: 'auto',\n reversed: false,\n allowDuplicatedCategory: true\n}, _temp)) || _class;\n\nexport default XAxis;", + "var _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Y Axis\n */\nimport { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport pureRender from '../util/PureRender';\n\nvar YAxis = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(YAxis, _Component);\n\n function YAxis() {\n _classCallCheck(this, YAxis);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(YAxis).apply(this, arguments));\n }\n\n _createClass(YAxis, [{\n key: \"render\",\n value: function render() {\n return null;\n }\n }]);\n\n return YAxis;\n}(Component), _class2.displayName = 'YAxis', _class2.propTypes = {\n allowDecimals: PropTypes.bool,\n allowDuplicatedCategory: PropTypes.bool,\n hide: PropTypes.bool,\n // The name of data displayed in the axis\n name: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n // The unit of data displayed in the axis\n unit: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n // The unique id of y-axis\n yAxisId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n domain: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func, PropTypes.oneOf(['auto', 'dataMin', 'dataMax'])])),\n // The key of data displayed in the axis\n dataKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func]),\n // Ticks can be any type when the axis is the type of category\n // Ticks must be numbers when the axis is the type of number\n ticks: PropTypes.array,\n // The count of ticks\n tickCount: PropTypes.number,\n // The formatter function of tick\n tickFormatter: PropTypes.func,\n // The width of axis, which need to be setted by user\n width: PropTypes.number,\n // The height of axis which is usually calculated in Chart\n height: PropTypes.number,\n mirror: PropTypes.bool,\n // The orientation of axis\n orientation: PropTypes.oneOf(['left', 'right']),\n type: PropTypes.oneOf(['number', 'category']),\n padding: PropTypes.shape({\n top: PropTypes.number,\n bottom: PropTypes.number\n }),\n allowDataOverflow: PropTypes.bool,\n scale: PropTypes.oneOfType([PropTypes.oneOf(['auto', 'linear', 'pow', 'sqrt', 'log', 'identity', 'time', 'band', 'point', 'ordinal', 'quantile', 'quantize', 'utc', 'sequential', 'threshold']), PropTypes.func]),\n tick: PropTypes.oneOfType([PropTypes.bool, PropTypes.func, PropTypes.object, PropTypes.element]),\n axisLine: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),\n tickLine: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),\n minTickGap: PropTypes.number,\n tickSize: PropTypes.number,\n interval: PropTypes.oneOfType([PropTypes.number, PropTypes.oneOf(['preserveStart', 'preserveEnd', 'preserveStartEnd'])]),\n reversed: PropTypes.bool\n}, _class2.defaultProps = {\n allowDuplicatedCategory: true,\n allowDecimals: true,\n hide: false,\n orientation: 'left',\n width: 60,\n height: 0,\n mirror: false,\n yAxisId: 0,\n tickCount: 5,\n type: 'number',\n domain: [0, 'auto'],\n padding: {\n top: 0,\n bottom: 0\n },\n allowDataOverflow: false,\n scale: 'auto',\n reversed: false\n}, _temp)) || _class;\n\nexport default YAxis;", + "import EventEmitter from 'events';\nvar eventCenter = new EventEmitter();\n\nif (eventCenter.setMaxListeners) {\n eventCenter.setMaxListeners(10);\n}\n\nexport { eventCenter };\nexport var SYNC_EVENT = 'recharts.syncMouseEvents';", + "import _every from \"lodash/every\";\nimport _find from \"lodash/find\";\nimport _sortBy from \"lodash/sortBy\";\nimport _isFunction from \"lodash/isFunction\";\nimport _range from \"lodash/range\";\nimport _throttle from \"lodash/throttle\";\nimport _isNil from \"lodash/isNil\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nimport React, { Component, cloneElement, isValidElement, createElement } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Surface from '../container/Surface';\nimport Layer from '../container/Layer';\nimport Tooltip from '../component/Tooltip';\nimport Legend from '../component/Legend';\nimport Curve from '../shape/Curve';\nimport Cross from '../shape/Cross';\nimport Sector from '../shape/Sector';\nimport Dot from '../shape/Dot';\nimport Rectangle from '../shape/Rectangle';\nimport { findAllByType, findChildByType, getDisplayName, parseChildIndex, getPresentationAttributes, validateWidthHeight, isChildrenEqual, renderByOrder, getReactEventByType, filterEventAttributes } from '../util/ReactUtils';\nimport CartesianAxis from '../cartesian/CartesianAxis';\nimport Brush from '../cartesian/Brush';\nimport { getOffset, calculateChartCoordinate } from '../util/DOMUtils';\nimport { getAnyElementOfObject, hasDuplicate, uniqueId, isNumber, findEntryInArray } from '../util/DataUtils';\nimport { calculateActiveTickIndex, getMainColorOfGraphicItem, getBarSizeList, getBarPosition, appendOffsetOfLegend, getLegendProps, combineEventHandlers, getTicksOfAxis, getCoordinatesOfGrid, getStackedDataOfItem, parseErrorBarsOfAxis, getBandSizeOfAxis, getStackGroupsByAxisId, getValueByDataKey, isCategorialAxis, getDomainOfItemsWithSameAxis, getDomainOfStackGroups, getDomainOfDataByKey, detectReferenceElementsDomain, parseSpecifiedDomain, parseDomainOfCategoryAxis } from '../util/ChartUtils';\nimport { inRangeOfSector, polarToCartesian } from '../util/PolarUtils';\nimport { shallowEqual } from '../util/PureRender';\nimport { eventCenter, SYNC_EVENT } from '../util/Events';\nvar ORIENT_MAP = {\n xAxis: ['bottom', 'top'],\n yAxis: ['left', 'right']\n};\nvar originCoordinate = {\n x: 0,\n y: 0\n};\n\nvar generateCategoricalChart = function generateCategoricalChart(_ref) {\n var chartName = _ref.chartName,\n GraphicalChild = _ref.GraphicalChild,\n _ref$eventType = _ref.eventType,\n eventType = _ref$eventType === void 0 ? 'axis' : _ref$eventType,\n axisComponents = _ref.axisComponents,\n legendContent = _ref.legendContent,\n formatAxisMap = _ref.formatAxisMap,\n defaultProps = _ref.defaultProps,\n propTypes = _ref.propTypes;\n\n var CategoricalChartWrapper =\n /*#__PURE__*/\n function (_Component) {\n _inherits(CategoricalChartWrapper, _Component);\n\n /**\n * Returns default, reset state for the categorical chart.\n * @param {Object} props Props object to use when creating the default state\n * @return {Object} Whole new state\n */\n function CategoricalChartWrapper(_props) {\n var _this;\n\n _classCallCheck(this, CategoricalChartWrapper);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(CategoricalChartWrapper).call(this, _props));\n\n _this.handleLegendBBoxUpdate = function (box) {\n if (box && _this.legendInstance) {\n var _this$state = _this.state,\n dataStartIndex = _this$state.dataStartIndex,\n dataEndIndex = _this$state.dataEndIndex,\n updateId = _this$state.updateId;\n\n _this.setState(_this.updateStateOfAxisMapsOffsetAndStackGroups({\n props: _this.props,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex,\n updateId: updateId\n }));\n }\n };\n\n _this.handleReceiveSyncEvent = function (cId, chartId, data) {\n var _this$props = _this.props,\n syncId = _this$props.syncId,\n layout = _this$props.layout;\n var updateId = _this.state.updateId;\n\n if (syncId === cId && chartId !== _this.uniqueChartId) {\n var dataStartIndex = data.dataStartIndex,\n dataEndIndex = data.dataEndIndex;\n\n if (!_isNil(data.dataStartIndex) || !_isNil(data.dataEndIndex)) {\n _this.setState(_objectSpread({\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n }, _this.updateStateOfAxisMapsOffsetAndStackGroups({\n props: _this.props,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex,\n updateId: updateId\n })));\n } else if (!_isNil(data.activeTooltipIndex)) {\n var chartX = data.chartX,\n chartY = data.chartY,\n activeTooltipIndex = data.activeTooltipIndex;\n var _this$state2 = _this.state,\n offset = _this$state2.offset,\n tooltipTicks = _this$state2.tooltipTicks;\n\n if (!offset) {\n return;\n }\n\n var viewBox = _objectSpread({}, offset, {\n x: offset.left,\n y: offset.top\n }); // When a categotical chart is combined with another chart, the value of chartX\n // and chartY may beyond the boundaries.\n\n\n var validateChartX = Math.min(chartX, viewBox.x + viewBox.width);\n var validateChartY = Math.min(chartY, viewBox.y + viewBox.height);\n var activeLabel = tooltipTicks[activeTooltipIndex] && tooltipTicks[activeTooltipIndex].value;\n\n var activePayload = _this.getTooltipContent(activeTooltipIndex);\n\n var activeCoordinate = tooltipTicks[activeTooltipIndex] ? {\n x: layout === 'horizontal' ? tooltipTicks[activeTooltipIndex].coordinate : validateChartX,\n y: layout === 'horizontal' ? validateChartY : tooltipTicks[activeTooltipIndex].coordinate\n } : originCoordinate;\n\n _this.setState(_objectSpread({}, data, {\n activeLabel: activeLabel,\n activeCoordinate: activeCoordinate,\n activePayload: activePayload\n }));\n } else {\n _this.setState(data);\n }\n }\n };\n\n _this.handleBrushChange = function (_ref2) {\n var startIndex = _ref2.startIndex,\n endIndex = _ref2.endIndex;\n\n // Only trigger changes if the extents of the brush have actually changed\n if (startIndex !== _this.state.dataStartIndex || endIndex !== _this.state.dataEndIndex) {\n var updateId = _this.state.updateId;\n\n _this.setState(function () {\n return _objectSpread({\n dataStartIndex: startIndex,\n dataEndIndex: endIndex\n }, _this.updateStateOfAxisMapsOffsetAndStackGroups({\n props: _this.props,\n dataStartIndex: startIndex,\n dataEndIndex: endIndex,\n updateId: updateId\n }));\n });\n\n _this.triggerSyncEvent({\n dataStartIndex: startIndex,\n dataEndIndex: endIndex\n });\n }\n };\n\n _this.handleMouseEnter = function (e) {\n var onMouseEnter = _this.props.onMouseEnter;\n\n var mouse = _this.getMouseInfo(e);\n\n if (mouse) {\n var nextState = _objectSpread({}, mouse, {\n isTooltipActive: true\n });\n\n _this.setState(nextState);\n\n _this.triggerSyncEvent(nextState);\n\n if (_isFunction(onMouseEnter)) {\n onMouseEnter(nextState, e);\n }\n }\n };\n\n _this.triggeredAfterMouseMove = function (e) {\n var onMouseMove = _this.props.onMouseMove;\n\n var mouse = _this.getMouseInfo(e);\n\n var nextState = mouse ? _objectSpread({}, mouse, {\n isTooltipActive: true\n }) : {\n isTooltipActive: false\n };\n\n _this.setState(nextState);\n\n _this.triggerSyncEvent(nextState);\n\n if (_isFunction(onMouseMove)) {\n onMouseMove(nextState, e);\n }\n };\n\n _this.handleItemMouseEnter = function (el) {\n _this.setState(function () {\n return {\n isTooltipActive: true,\n activeItem: el,\n activePayload: el.tooltipPayload,\n activeCoordinate: el.tooltipPosition || {\n x: el.cx,\n y: el.cy\n }\n };\n });\n };\n\n _this.handleItemMouseLeave = function () {\n _this.setState(function () {\n return {\n isTooltipActive: false\n };\n });\n };\n\n _this.handleMouseMove = function (e) {\n if (e && _isFunction(e.persist)) {\n e.persist();\n }\n\n _this.triggeredAfterMouseMove(e);\n };\n\n _this.handleMouseLeave = function (e) {\n var onMouseLeave = _this.props.onMouseLeave;\n var nextState = {\n isTooltipActive: false\n };\n\n _this.setState(nextState);\n\n _this.triggerSyncEvent(nextState);\n\n if (_isFunction(onMouseLeave)) {\n onMouseLeave(nextState, e);\n }\n };\n\n _this.handleOuterEvent = function (e) {\n var eventName = getReactEventByType(e);\n\n if (eventName && _isFunction(_this.props[eventName])) {\n var mouse = _this.getMouseInfo(e);\n\n var handler = _this.props[eventName];\n handler(mouse, e);\n }\n };\n\n _this.handleClick = function (e) {\n var onClick = _this.props.onClick;\n\n if (_isFunction(onClick)) {\n var mouse = _this.getMouseInfo(e);\n\n onClick(mouse, e);\n }\n };\n\n _this.handleMouseDown = function (e) {\n var onMouseDown = _this.props.onMouseDown;\n\n if (_isFunction(onMouseDown)) {\n var mouse = _this.getMouseInfo(e);\n\n onMouseDown(mouse, e);\n }\n };\n\n _this.handleMouseUp = function (e) {\n var onMouseUp = _this.props.onMouseUp;\n\n if (_isFunction(onMouseUp)) {\n var mouse = _this.getMouseInfo(e);\n\n onMouseUp(mouse, e);\n }\n };\n\n _this.handleTouchMove = function (e) {\n if (e.changedTouches != null && e.changedTouches.length > 0) {\n _this.handleMouseMove(e.changedTouches[0]);\n }\n };\n\n _this.handleTouchStart = function (e) {\n if (e.changedTouches != null && e.changedTouches.length > 0) {\n _this.handleMouseDown(e.changedTouches[0]);\n }\n };\n\n _this.handleTouchEnd = function (e) {\n if (e.changedTouches != null && e.changedTouches.length > 0) {\n _this.handleMouseUp(e.changedTouches[0]);\n }\n };\n\n _this.verticalCoordinatesGenerator = function (_ref3) {\n var xAxis = _ref3.xAxis,\n width = _ref3.width,\n height = _ref3.height,\n offset = _ref3.offset;\n return getCoordinatesOfGrid(CartesianAxis.getTicks(_objectSpread({}, CartesianAxis.defaultProps, xAxis, {\n ticks: getTicksOfAxis(xAxis, true),\n viewBox: {\n x: 0,\n y: 0,\n width: width,\n height: height\n }\n })), offset.left, offset.left + offset.width);\n };\n\n _this.horizontalCoordinatesGenerator = function (_ref4) {\n var yAxis = _ref4.yAxis,\n width = _ref4.width,\n height = _ref4.height,\n offset = _ref4.offset;\n return getCoordinatesOfGrid(CartesianAxis.getTicks(_objectSpread({}, CartesianAxis.defaultProps, yAxis, {\n ticks: getTicksOfAxis(yAxis, true),\n viewBox: {\n x: 0,\n y: 0,\n width: width,\n height: height\n }\n })), offset.top, offset.top + offset.height);\n };\n\n _this.axesTicksGenerator = function (axis) {\n return getTicksOfAxis(axis, true);\n };\n\n _this.tooltipTicksGenerator = function (axisMap) {\n var axis = getAnyElementOfObject(axisMap);\n var tooltipTicks = getTicksOfAxis(axis, false, true);\n return {\n tooltipTicks: tooltipTicks,\n orderedTooltipTicks: _sortBy(tooltipTicks, function (o) {\n return o.coordinate;\n }),\n tooltipAxis: axis,\n tooltipAxisBandSize: getBandSizeOfAxis(axis)\n };\n };\n\n _this.renderCursor = function (element) {\n var _this$state3 = _this.state,\n isTooltipActive = _this$state3.isTooltipActive,\n activeCoordinate = _this$state3.activeCoordinate,\n activePayload = _this$state3.activePayload,\n offset = _this$state3.offset;\n\n if (!element || !element.props.cursor || !isTooltipActive || !activeCoordinate) {\n return null;\n }\n\n var layout = _this.props.layout;\n var restProps;\n var cursorComp = Curve;\n\n if (chartName === 'ScatterChart') {\n restProps = activeCoordinate;\n cursorComp = Cross;\n } else if (chartName === 'BarChart') {\n restProps = _this.getCursorRectangle();\n cursorComp = Rectangle;\n } else if (layout === 'radial') {\n var _this$getCursorPoints = _this.getCursorPoints(),\n cx = _this$getCursorPoints.cx,\n cy = _this$getCursorPoints.cy,\n radius = _this$getCursorPoints.radius,\n startAngle = _this$getCursorPoints.startAngle,\n endAngle = _this$getCursorPoints.endAngle;\n\n restProps = {\n cx: cx,\n cy: cy,\n startAngle: startAngle,\n endAngle: endAngle,\n innerRadius: radius,\n outerRadius: radius\n };\n cursorComp = Sector;\n } else {\n restProps = {\n points: _this.getCursorPoints()\n };\n cursorComp = Curve;\n }\n\n var key = element.key || '_recharts-cursor';\n\n var cursorProps = _objectSpread({\n stroke: '#ccc',\n pointerEvents: 'none'\n }, offset, restProps, getPresentationAttributes(element.props.cursor), {\n payload: activePayload,\n key: key,\n className: 'recharts-tooltip-cursor'\n });\n\n return isValidElement(element.props.cursor) ? cloneElement(element.props.cursor, cursorProps) : createElement(cursorComp, cursorProps);\n };\n\n _this.renderPolarAxis = function (element, displayName, index) {\n var axisType = element.type.axisType;\n\n var axisMap = _this.state[\"\".concat(axisType, \"Map\")];\n\n var axisOption = axisMap[element.props[\"\".concat(axisType, \"Id\")]];\n return cloneElement(element, _objectSpread({}, axisOption, {\n className: axisType,\n key: element.key || \"\".concat(displayName, \"-\").concat(index),\n ticks: getTicksOfAxis(axisOption, true)\n }));\n };\n\n _this.renderXAxis = function (element, displayName, index) {\n var xAxisMap = _this.state.xAxisMap;\n var axisObj = xAxisMap[element.props.xAxisId];\n return _this.renderAxis(axisObj, element, displayName, index);\n };\n\n _this.renderYAxis = function (element, displayName, index) {\n var yAxisMap = _this.state.yAxisMap;\n var axisObj = yAxisMap[element.props.yAxisId];\n return _this.renderAxis(axisObj, element, displayName, index);\n };\n\n _this.renderGrid = function (element) {\n var _this$state4 = _this.state,\n xAxisMap = _this$state4.xAxisMap,\n yAxisMap = _this$state4.yAxisMap,\n offset = _this$state4.offset;\n var _this$props2 = _this.props,\n width = _this$props2.width,\n height = _this$props2.height;\n var xAxis = getAnyElementOfObject(xAxisMap);\n\n var yAxisWithFiniteDomain = _find(yAxisMap, function (axis) {\n return _every(axis.domain, Number.isFinite);\n });\n\n var yAxis = yAxisWithFiniteDomain || getAnyElementOfObject(yAxisMap);\n var props = element.props || {};\n return cloneElement(element, {\n key: element.key || 'grid',\n x: isNumber(props.x) ? props.x : offset.left,\n y: isNumber(props.y) ? props.y : offset.top,\n width: isNumber(props.width) ? props.width : offset.width,\n height: isNumber(props.height) ? props.height : offset.height,\n xAxis: xAxis,\n yAxis: yAxis,\n offset: offset,\n chartWidth: width,\n chartHeight: height,\n verticalCoordinatesGenerator: props.verticalCoordinatesGenerator || _this.verticalCoordinatesGenerator,\n horizontalCoordinatesGenerator: props.horizontalCoordinatesGenerator || _this.horizontalCoordinatesGenerator\n });\n };\n\n _this.renderPolarGrid = function (element) {\n var _this$state5 = _this.state,\n radiusAxisMap = _this$state5.radiusAxisMap,\n angleAxisMap = _this$state5.angleAxisMap;\n var radiusAxis = getAnyElementOfObject(radiusAxisMap);\n var angleAxis = getAnyElementOfObject(angleAxisMap);\n var cx = angleAxis.cx,\n cy = angleAxis.cy,\n innerRadius = angleAxis.innerRadius,\n outerRadius = angleAxis.outerRadius;\n return cloneElement(element, {\n polarAngles: getTicksOfAxis(angleAxis, true).map(function (entry) {\n return entry.coordinate;\n }),\n polarRadius: getTicksOfAxis(radiusAxis, true).map(function (entry) {\n return entry.coordinate;\n }),\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n key: element.key || 'polar-grid'\n });\n };\n\n _this.renderBrush = function (element) {\n var _this$props3 = _this.props,\n margin = _this$props3.margin,\n data = _this$props3.data;\n var _this$state6 = _this.state,\n offset = _this$state6.offset,\n dataStartIndex = _this$state6.dataStartIndex,\n dataEndIndex = _this$state6.dataEndIndex,\n updateId = _this$state6.updateId; // TODO: update brush when children update\n\n return cloneElement(element, {\n key: element.key || '_recharts-brush',\n onChange: combineEventHandlers(_this.handleBrushChange, null, element.props.onChange),\n data: data,\n x: isNumber(element.props.x) ? element.props.x : offset.left,\n y: isNumber(element.props.y) ? element.props.y : offset.top + offset.height + offset.brushBottom - (margin.bottom || 0),\n width: isNumber(element.props.width) ? element.props.width : offset.width,\n startIndex: dataStartIndex,\n endIndex: dataEndIndex,\n updateId: \"brush-\".concat(updateId)\n });\n };\n\n _this.renderReferenceElement = function (element, displayName, index) {\n if (!element) {\n return null;\n }\n\n var _assertThisInitialize = _assertThisInitialized(_assertThisInitialized(_this)),\n clipPathId = _assertThisInitialize.clipPathId;\n\n var _this$state7 = _this.state,\n xAxisMap = _this$state7.xAxisMap,\n yAxisMap = _this$state7.yAxisMap,\n offset = _this$state7.offset;\n var _element$props = element.props,\n xAxisId = _element$props.xAxisId,\n yAxisId = _element$props.yAxisId;\n return cloneElement(element, {\n key: element.key || \"\".concat(displayName, \"-\").concat(index),\n xAxis: xAxisMap[xAxisId],\n yAxis: yAxisMap[yAxisId],\n viewBox: {\n x: offset.left,\n y: offset.top,\n width: offset.width,\n height: offset.height\n },\n clipPathId: clipPathId\n });\n };\n\n _this.renderGraphicChild = function (element, displayName, index) {\n var item = _this.filterFormatItem(element, displayName, index);\n\n if (!item) {\n return null;\n }\n\n var graphicalItem = cloneElement(element, item.props);\n var _this$state8 = _this.state,\n isTooltipActive = _this$state8.isTooltipActive,\n tooltipAxis = _this$state8.tooltipAxis,\n activeTooltipIndex = _this$state8.activeTooltipIndex,\n activeLabel = _this$state8.activeLabel;\n var children = _this.props.children;\n var tooltipItem = findChildByType(children, Tooltip);\n var _item$props = item.props,\n points = _item$props.points,\n isRange = _item$props.isRange,\n baseLine = _item$props.baseLine;\n var _item$item$props = item.item.props,\n activeDot = _item$item$props.activeDot,\n hide = _item$item$props.hide;\n var hasActive = !hide && isTooltipActive && tooltipItem && activeDot && activeTooltipIndex >= 0;\n\n if (hasActive) {\n var activePoint, basePoint;\n\n if (tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory) {\n activePoint = findEntryInArray(points, \"payload.\".concat(tooltipAxis.dataKey), activeLabel);\n basePoint = isRange && baseLine && findEntryInArray(baseLine, \"payload.\".concat(tooltipAxis.dataKey), activeLabel);\n } else {\n activePoint = points[activeTooltipIndex];\n basePoint = isRange && baseLine && baseLine[activeTooltipIndex];\n }\n\n if (!_isNil(activePoint)) {\n return [graphicalItem].concat(_toConsumableArray(_this.renderActivePoints({\n item: item,\n activePoint: activePoint,\n basePoint: basePoint,\n childIndex: activeTooltipIndex,\n isRange: isRange\n })));\n }\n }\n\n if (isRange) {\n return [graphicalItem, null, null];\n }\n\n return [graphicalItem, null];\n };\n\n var defaultState = _this.constructor.createDefaultState(_props);\n\n var _updateId = 0;\n _this.state = _objectSpread({}, defaultState, {\n updateId: 0\n }, _this.updateStateOfAxisMapsOffsetAndStackGroups(_objectSpread({\n props: _props\n }, defaultState, {\n updateId: _updateId\n })));\n _this.uniqueChartId = _isNil(_props.id) ? uniqueId('recharts') : _props.id;\n _this.clipPathId = \"\".concat(_this.uniqueChartId, \"-clip\");\n\n if (_props.throttleDelay) {\n _this.triggeredAfterMouseMove = _throttle(_this.triggeredAfterMouseMove, _props.throttleDelay);\n }\n\n return _this;\n }\n /* eslint-disable react/no-did-mount-set-state */\n\n\n _createClass(CategoricalChartWrapper, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n if (!_isNil(this.props.syncId)) {\n this.addListener();\n }\n }\n }, {\n key: \"componentWillReceiveProps\",\n value: function componentWillReceiveProps(nextProps) {\n var _this2 = this;\n\n var _this$props4 = this.props,\n data = _this$props4.data,\n children = _this$props4.children,\n width = _this$props4.width,\n height = _this$props4.height,\n layout = _this$props4.layout,\n stackOffset = _this$props4.stackOffset,\n margin = _this$props4.margin;\n var updateId = this.state.updateId;\n\n if (nextProps.data !== data || nextProps.width !== width || nextProps.height !== height || nextProps.layout !== layout || nextProps.stackOffset !== stackOffset || !shallowEqual(nextProps.margin, margin)) {\n var defaultState = this.constructor.createDefaultState(nextProps);\n this.setState(_objectSpread({}, defaultState, {\n updateId: updateId + 1\n }, this.updateStateOfAxisMapsOffsetAndStackGroups(_objectSpread({\n props: nextProps\n }, defaultState, {\n updateId: updateId + 1\n }))));\n } else if (!isChildrenEqual(nextProps.children, children)) {\n // update configuration in chilren\n var hasGlobalData = !_isNil(nextProps.data);\n var newUpdateId = hasGlobalData ? updateId : updateId + 1;\n this.setState(function (prevState) {\n return _objectSpread({\n updateId: newUpdateId\n }, _this2.updateStateOfAxisMapsOffsetAndStackGroups(_objectSpread({\n props: nextProps\n }, prevState, {\n updateId: newUpdateId\n })));\n });\n } // add syncId\n\n\n if (_isNil(this.props.syncId) && !_isNil(nextProps.syncId)) {\n this.addListener();\n } // remove syncId\n\n\n if (!_isNil(this.props.syncId) && _isNil(nextProps.syncId)) {\n this.removeListener();\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n if (!_isNil(this.props.syncId)) {\n this.removeListener();\n }\n\n if (typeof this.triggeredAfterMouseMove.cancel === 'function') {\n this.triggeredAfterMouseMove.cancel();\n }\n }\n /**\n * Get the configuration of all x-axis or y-axis\n * @param {Object} props Latest props\n * @param {String} axisType The type of axis\n * @param {Array} graphicalItems The instances of item\n * @param {Object} stackGroups The items grouped by axisId and stackId\n * @param {Number} dataStartIndex The start index of the data series when a brush is applied\n * @param {Number} dataEndIndex The end index of the data series when a brush is applied\n * @return {Object} Configuration\n */\n\n }, {\n key: \"getAxisMap\",\n value: function getAxisMap(props, _ref5) {\n var _ref5$axisType = _ref5.axisType,\n axisType = _ref5$axisType === void 0 ? 'xAxis' : _ref5$axisType,\n AxisComp = _ref5.AxisComp,\n graphicalItems = _ref5.graphicalItems,\n stackGroups = _ref5.stackGroups,\n dataStartIndex = _ref5.dataStartIndex,\n dataEndIndex = _ref5.dataEndIndex;\n var children = props.children;\n var axisIdKey = \"\".concat(axisType, \"Id\"); // Get all the instance of Axis\n\n var axes = findAllByType(children, AxisComp);\n var axisMap = {};\n\n if (axes && axes.length) {\n axisMap = this.getAxisMapByAxes(props, {\n axes: axes,\n graphicalItems: graphicalItems,\n axisType: axisType,\n axisIdKey: axisIdKey,\n stackGroups: stackGroups,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n });\n } else if (graphicalItems && graphicalItems.length) {\n axisMap = this.getAxisMapByItems(props, {\n Axis: AxisComp,\n graphicalItems: graphicalItems,\n axisType: axisType,\n axisIdKey: axisIdKey,\n stackGroups: stackGroups,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n });\n }\n\n return axisMap;\n }\n /**\n * Get the configuration of axis by the options of axis instance\n * @param {Object} props Latest props\n * @param {Array} axes The instance of axes\n * @param {Array} graphicalItems The instances of item\n * @param {String} axisType The type of axis, xAxis - x-axis, yAxis - y-axis\n * @param {String} axisIdKey The unique id of an axis\n * @param {Object} stackGroups The items grouped by axisId and stackId\n * @param {Number} dataStartIndex The start index of the data series when a brush is applied\n * @param {Number} dataEndIndex The end index of the data series when a brush is applied\n * @return {Object} Configuration\n */\n\n }, {\n key: \"getAxisMapByAxes\",\n value: function getAxisMapByAxes(props, _ref6) {\n var _this3 = this;\n\n var axes = _ref6.axes,\n graphicalItems = _ref6.graphicalItems,\n axisType = _ref6.axisType,\n axisIdKey = _ref6.axisIdKey,\n stackGroups = _ref6.stackGroups,\n dataStartIndex = _ref6.dataStartIndex,\n dataEndIndex = _ref6.dataEndIndex;\n var layout = props.layout,\n children = props.children,\n stackOffset = props.stackOffset;\n var isCategorial = isCategorialAxis(layout, axisType); // Eliminate duplicated axes\n\n var axisMap = axes.reduce(function (result, child) {\n var _child$props = child.props,\n type = _child$props.type,\n dataKey = _child$props.dataKey,\n allowDataOverflow = _child$props.allowDataOverflow,\n allowDuplicatedCategory = _child$props.allowDuplicatedCategory,\n scale = _child$props.scale,\n ticks = _child$props.ticks;\n var axisId = child.props[axisIdKey];\n\n var displayedData = _this3.constructor.getDisplayedData(props, {\n graphicalItems: graphicalItems.filter(function (item) {\n return item.props[axisIdKey] === axisId;\n }),\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n });\n\n var len = displayedData.length;\n\n if (!result[axisId]) {\n var domain, duplicateDomain, categoricalDomain;\n\n if (dataKey) {\n domain = getDomainOfDataByKey(displayedData, dataKey, type);\n\n if (type === 'category' && isCategorial) {\n var duplicate = hasDuplicate(domain);\n\n if (allowDuplicatedCategory && duplicate) {\n duplicateDomain = domain; // When category axis has duplicated text, serial numbers are used to generate scale\n\n domain = _range(0, len);\n } else if (!allowDuplicatedCategory) {\n // remove duplicated category\n domain = parseDomainOfCategoryAxis(child.props.domain, domain, child).reduce(function (finalDomain, entry) {\n return finalDomain.indexOf(entry) >= 0 ? finalDomain : _toConsumableArray(finalDomain).concat([entry]);\n }, []);\n }\n } else if (type === 'category') {\n if (!allowDuplicatedCategory) {\n domain = parseDomainOfCategoryAxis(child.props.domain, domain, child).reduce(function (finalDomain, entry) {\n return finalDomain.indexOf(entry) >= 0 || entry === '' || _isNil(entry) ? finalDomain : _toConsumableArray(finalDomain).concat([entry]);\n }, []);\n } else {\n // eliminate undefined or null or empty string\n domain = domain.filter(function (entry) {\n return entry !== '' && !_isNil(entry);\n });\n }\n } else if (type === 'number') {\n var errorBarsDomain = parseErrorBarsOfAxis(displayedData, graphicalItems.filter(function (item) {\n return item.props[axisIdKey] === axisId && !item.props.hide;\n }), dataKey, axisType);\n\n if (errorBarsDomain) {\n domain = errorBarsDomain;\n }\n }\n\n if (isCategorial && (type === 'number' || scale !== 'auto')) {\n categoricalDomain = getDomainOfDataByKey(displayedData, dataKey, 'category');\n }\n } else if (isCategorial) {\n domain = _range(0, len);\n } else if (stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack && type === 'number') {\n // when stackOffset is 'expand', the domain may be calculated as [0, 1.000000000002]\n domain = stackOffset === 'expand' ? [0, 1] : getDomainOfStackGroups(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex);\n } else {\n domain = getDomainOfItemsWithSameAxis(displayedData, graphicalItems.filter(function (item) {\n return item.props[axisIdKey] === axisId && !item.props.hide;\n }), type, true);\n }\n\n if (type === 'number') {\n // To detect wether there is any reference lines whose props alwaysShow is true\n domain = detectReferenceElementsDomain(children, domain, axisId, axisType, ticks);\n\n if (child.props.domain) {\n domain = parseSpecifiedDomain(child.props.domain, domain, allowDataOverflow);\n }\n }\n\n return _objectSpread({}, result, _defineProperty({}, axisId, _objectSpread({}, child.props, {\n axisType: axisType,\n domain: domain,\n categoricalDomain: categoricalDomain,\n duplicateDomain: duplicateDomain,\n originalDomain: child.props.domain,\n isCategorial: isCategorial,\n layout: layout\n })));\n }\n\n return result;\n }, {});\n return axisMap;\n }\n /**\n * Get the configuration of axis by the options of item,\n * this kind of axis does not display in chart\n * @param {Object} props Latest props\n * @param {Array} graphicalItems The instances of item\n * @param {ReactElement} Axis Axis Component\n * @param {String} axisType The type of axis, xAxis - x-axis, yAxis - y-axis\n * @param {String} axisIdKey The unique id of an axis\n * @param {Object} stackGroups The items grouped by axisId and stackId\n * @param {Number} dataStartIndex The start index of the data series when a brush is applied\n * @param {Number} dataEndIndex The end index of the data series when a brush is applied\n * @return {Object} Configuration\n */\n\n }, {\n key: \"getAxisMapByItems\",\n value: function getAxisMapByItems(props, _ref7) {\n var graphicalItems = _ref7.graphicalItems,\n Axis = _ref7.Axis,\n axisType = _ref7.axisType,\n axisIdKey = _ref7.axisIdKey,\n stackGroups = _ref7.stackGroups,\n dataStartIndex = _ref7.dataStartIndex,\n dataEndIndex = _ref7.dataEndIndex;\n var layout = props.layout,\n children = props.children;\n var displayedData = this.constructor.getDisplayedData(props, {\n graphicalItems: graphicalItems,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n });\n var len = displayedData.length;\n var isCategorial = isCategorialAxis(layout, axisType);\n var index = -1; // The default type of x-axis is category axis,\n // The default contents of x-axis is the serial numbers of data\n // The default type of y-axis is number axis\n // The default contents of y-axis is the domain of data\n\n var axisMap = graphicalItems.reduce(function (result, child) {\n var axisId = child.props[axisIdKey];\n\n if (!result[axisId]) {\n index++;\n var domain;\n\n if (isCategorial) {\n domain = _range(0, len);\n } else if (stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack) {\n domain = getDomainOfStackGroups(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex);\n domain = detectReferenceElementsDomain(children, domain, axisId, axisType);\n } else {\n domain = parseSpecifiedDomain(Axis.defaultProps.domain, getDomainOfItemsWithSameAxis(displayedData, graphicalItems.filter(function (item) {\n return item.props[axisIdKey] === axisId && !item.props.hide;\n }), 'number'), Axis.defaultProps.allowDataOverflow);\n domain = detectReferenceElementsDomain(children, domain, axisId, axisType);\n }\n\n return _objectSpread({}, result, _defineProperty({}, axisId, _objectSpread({\n axisType: axisType\n }, Axis.defaultProps, {\n hide: true,\n orientation: ORIENT_MAP[axisType] && ORIENT_MAP[axisType][index % 2],\n domain: domain,\n originalDomain: Axis.defaultProps.domain,\n isCategorial: isCategorial,\n layout: layout // specify scale when no Axis\n // scale: isCategorial ? 'band' : 'linear',\n\n })));\n }\n\n return result;\n }, {});\n return axisMap;\n }\n }, {\n key: \"getActiveCoordinate\",\n value: function getActiveCoordinate(tooltipTicks, activeIndex, rangeObj) {\n var layout = this.props.layout;\n var entry = tooltipTicks.find(function (tick) {\n return tick && tick.index === activeIndex;\n });\n\n if (entry) {\n if (layout === 'horizontal') {\n return {\n x: entry.coordinate,\n y: rangeObj.y\n };\n }\n\n if (layout === 'vertical') {\n return {\n x: rangeObj.x,\n y: entry.coordinate\n };\n }\n\n if (layout === 'centric') {\n var _angle = entry.coordinate;\n var _radius = rangeObj.radius;\n return _objectSpread({}, rangeObj, polarToCartesian(rangeObj.cx, rangeObj.cy, _radius, _angle), {\n angle: _angle,\n radius: _radius\n });\n }\n\n var radius = entry.coordinate;\n var angle = rangeObj.angle;\n return _objectSpread({}, rangeObj, polarToCartesian(rangeObj.cx, rangeObj.cy, radius, angle), {\n angle: angle,\n radius: radius\n });\n }\n\n return originCoordinate;\n }\n /**\n * Get the information of mouse in chart, return null when the mouse is not in the chart\n * @param {Object} event The event object\n * @return {Object} Mouse data\n */\n\n }, {\n key: \"getMouseInfo\",\n value: function getMouseInfo(event) {\n if (!this.container) {\n return null;\n }\n\n var containerOffset = getOffset(this.container);\n var e = calculateChartCoordinate(event, containerOffset);\n var rangeObj = this.inRange(e.chartX, e.chartY);\n\n if (!rangeObj) {\n return null;\n }\n\n var _this$state9 = this.state,\n xAxisMap = _this$state9.xAxisMap,\n yAxisMap = _this$state9.yAxisMap;\n\n if (eventType !== 'axis' && xAxisMap && yAxisMap) {\n var xScale = getAnyElementOfObject(xAxisMap).scale;\n var yScale = getAnyElementOfObject(yAxisMap).scale;\n var xValue = xScale && xScale.invert ? xScale.invert(e.chartX) : null;\n var yValue = yScale && yScale.invert ? yScale.invert(e.chartY) : null;\n return _objectSpread({}, e, {\n xValue: xValue,\n yValue: yValue\n });\n }\n\n var _this$state10 = this.state,\n ticks = _this$state10.orderedTooltipTicks,\n axis = _this$state10.tooltipAxis,\n tooltipTicks = _this$state10.tooltipTicks;\n var pos = this.calculateTooltipPos(rangeObj);\n var activeIndex = calculateActiveTickIndex(pos, ticks, tooltipTicks, axis);\n\n if (activeIndex >= 0 && tooltipTicks) {\n var activeLabel = tooltipTicks[activeIndex] && tooltipTicks[activeIndex].value;\n var activePayload = this.getTooltipContent(activeIndex, activeLabel);\n var activeCoordinate = this.getActiveCoordinate(ticks, activeIndex, rangeObj);\n return _objectSpread({}, e, {\n activeTooltipIndex: activeIndex,\n activeLabel: activeLabel,\n activePayload: activePayload,\n activeCoordinate: activeCoordinate\n });\n }\n\n return null;\n }\n /**\n * Get the content to be displayed in the tooltip\n * @param {Number} activeIndex Active index of data\n * @param {String} activeLabel Active label of data\n * @return {Array} The content of tooltip\n */\n\n }, {\n key: \"getTooltipContent\",\n value: function getTooltipContent(activeIndex, activeLabel) {\n var _this$state11 = this.state,\n graphicalItems = _this$state11.graphicalItems,\n tooltipAxis = _this$state11.tooltipAxis;\n var displayedData = this.constructor.getDisplayedData(this.props, this.state);\n\n if (activeIndex < 0 || !graphicalItems || !graphicalItems.length || activeIndex >= displayedData.length) {\n return null;\n } // get data by activeIndex when the axis don't allow duplicated category\n\n\n return graphicalItems.reduce(function (result, child) {\n var hide = child.props.hide;\n\n if (hide) {\n return result;\n }\n\n var _child$props2 = child.props,\n dataKey = _child$props2.dataKey,\n name = _child$props2.name,\n unit = _child$props2.unit,\n formatter = _child$props2.formatter,\n data = _child$props2.data;\n var payload;\n\n if (tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory) {\n // graphic child has data props\n payload = findEntryInArray(data || displayedData, tooltipAxis.dataKey, activeLabel);\n } else {\n payload = displayedData[activeIndex];\n }\n\n if (!payload) {\n return result;\n }\n\n return _toConsumableArray(result).concat([_objectSpread({}, getPresentationAttributes(child), {\n dataKey: dataKey,\n unit: unit,\n formatter: formatter,\n name: name || dataKey,\n color: getMainColorOfGraphicItem(child),\n value: getValueByDataKey(payload, dataKey),\n payload: payload\n })]);\n }, []);\n }\n }, {\n key: \"getFormatItems\",\n value: function getFormatItems(props, currentState) {\n var _this4 = this;\n\n var graphicalItems = currentState.graphicalItems,\n stackGroups = currentState.stackGroups,\n offset = currentState.offset,\n updateId = currentState.updateId,\n dataStartIndex = currentState.dataStartIndex,\n dataEndIndex = currentState.dataEndIndex;\n var barSize = props.barSize,\n layout = props.layout,\n barGap = props.barGap,\n barCategoryGap = props.barCategoryGap,\n globalMaxBarSize = props.maxBarSize;\n\n var _this$constructor$get = this.constructor.getAxisNameByLayout(layout),\n numericAxisName = _this$constructor$get.numericAxisName,\n cateAxisName = _this$constructor$get.cateAxisName;\n\n var hasBar = this.constructor.hasBar(graphicalItems);\n var sizeList = hasBar && getBarSizeList({\n barSize: barSize,\n stackGroups: stackGroups\n });\n var formatedItems = [];\n graphicalItems.forEach(function (item, index) {\n var displayedData = _this4.constructor.getDisplayedData(props, {\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n }, item);\n\n var _item$props2 = item.props,\n dataKey = _item$props2.dataKey,\n childMaxBarSize = _item$props2.maxBarSize;\n var numericAxisId = item.props[\"\".concat(numericAxisName, \"Id\")];\n var cateAxisId = item.props[\"\".concat(cateAxisName, \"Id\")];\n var axisObj = axisComponents.reduce(function (result, entry) {\n var _objectSpread4;\n\n var axisMap = currentState[\"\".concat(entry.axisType, \"Map\")];\n var id = item.props[\"\".concat(entry.axisType, \"Id\")];\n var axis = axisMap && axisMap[id];\n return _objectSpread({}, result, (_objectSpread4 = {}, _defineProperty(_objectSpread4, entry.axisType, axis), _defineProperty(_objectSpread4, \"\".concat(entry.axisType, \"Ticks\"), getTicksOfAxis(axis)), _objectSpread4));\n }, {});\n var cateAxis = axisObj[cateAxisName];\n var cateTicks = axisObj[\"\".concat(cateAxisName, \"Ticks\")];\n var stackedData = stackGroups && stackGroups[numericAxisId] && stackGroups[numericAxisId].hasStack && getStackedDataOfItem(item, stackGroups[numericAxisId].stackGroups);\n var bandSize = getBandSizeOfAxis(cateAxis, cateTicks);\n var maxBarSize = _isNil(childMaxBarSize) ? globalMaxBarSize : childMaxBarSize;\n var barPosition = hasBar && getBarPosition({\n barGap: barGap,\n barCategoryGap: barCategoryGap,\n bandSize: bandSize,\n sizeList: sizeList[cateAxisId],\n maxBarSize: maxBarSize\n });\n var componsedFn = item && item.type && item.type.getComposedData;\n\n if (componsedFn) {\n var _objectSpread5;\n\n formatedItems.push({\n props: _objectSpread({}, componsedFn(_objectSpread({}, axisObj, {\n displayedData: displayedData,\n props: props,\n dataKey: dataKey,\n item: item,\n bandSize: bandSize,\n barPosition: barPosition,\n offset: offset,\n stackedData: stackedData,\n layout: layout,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex,\n onItemMouseLeave: combineEventHandlers(_this4.handleItemMouseLeave, null, item.props.onMouseLeave),\n onItemMouseEnter: combineEventHandlers(_this4.handleItemMouseEnter, null, item.props.onMouseEnter)\n })), (_objectSpread5 = {\n key: item.key || \"item-\".concat(index)\n }, _defineProperty(_objectSpread5, numericAxisName, axisObj[numericAxisName]), _defineProperty(_objectSpread5, cateAxisName, axisObj[cateAxisName]), _defineProperty(_objectSpread5, \"animationId\", updateId), _objectSpread5)),\n childIndex: parseChildIndex(item, props.children),\n item: item\n });\n }\n });\n return formatedItems;\n }\n }, {\n key: \"getCursorRectangle\",\n value: function getCursorRectangle() {\n var layout = this.props.layout;\n var _this$state12 = this.state,\n activeCoordinate = _this$state12.activeCoordinate,\n offset = _this$state12.offset,\n tooltipAxisBandSize = _this$state12.tooltipAxisBandSize;\n var halfSize = tooltipAxisBandSize / 2;\n return {\n stroke: 'none',\n fill: '#ccc',\n x: layout === 'horizontal' ? activeCoordinate.x - halfSize : offset.left + 0.5,\n y: layout === 'horizontal' ? offset.top + 0.5 : activeCoordinate.y - halfSize,\n width: layout === 'horizontal' ? tooltipAxisBandSize : offset.width - 1,\n height: layout === 'horizontal' ? offset.height - 1 : tooltipAxisBandSize\n };\n }\n }, {\n key: \"getCursorPoints\",\n value: function getCursorPoints() {\n var layout = this.props.layout;\n var _this$state13 = this.state,\n activeCoordinate = _this$state13.activeCoordinate,\n offset = _this$state13.offset;\n var x1, y1, x2, y2;\n\n if (layout === 'horizontal') {\n x1 = activeCoordinate.x;\n x2 = x1;\n y1 = offset.top;\n y2 = offset.top + offset.height;\n } else if (layout === 'vertical') {\n y1 = activeCoordinate.y;\n y2 = y1;\n x1 = offset.left;\n x2 = offset.left + offset.width;\n } else if (!_isNil(activeCoordinate.cx) || !_isNil(activeCoordinate.cy)) {\n if (layout === 'centric') {\n var cx = activeCoordinate.cx,\n cy = activeCoordinate.cy,\n innerRadius = activeCoordinate.innerRadius,\n outerRadius = activeCoordinate.outerRadius,\n angle = activeCoordinate.angle;\n var innerPoint = polarToCartesian(cx, cy, innerRadius, angle);\n var outerPoint = polarToCartesian(cx, cy, outerRadius, angle);\n x1 = innerPoint.x;\n y1 = innerPoint.y;\n x2 = outerPoint.x;\n y2 = outerPoint.y;\n } else {\n var _cx = activeCoordinate.cx,\n _cy = activeCoordinate.cy,\n radius = activeCoordinate.radius,\n startAngle = activeCoordinate.startAngle,\n endAngle = activeCoordinate.endAngle;\n var startPoint = polarToCartesian(_cx, _cy, radius, startAngle);\n var endPoint = polarToCartesian(_cx, _cy, radius, endAngle);\n return {\n points: [startPoint, endPoint],\n cx: _cx,\n cy: _cy,\n radius: radius,\n startAngle: startAngle,\n endAngle: endAngle\n };\n }\n }\n\n return [{\n x: x1,\n y: y1\n }, {\n x: x2,\n y: y2\n }];\n }\n }, {\n key: \"calculateTooltipPos\",\n value: function calculateTooltipPos(rangeObj) {\n var layout = this.props.layout;\n\n if (layout === 'horizontal') {\n return rangeObj.x;\n }\n\n if (layout === 'vertical') {\n return rangeObj.y;\n }\n\n if (layout === 'centric') {\n return rangeObj.angle;\n }\n\n return rangeObj.radius;\n }\n }, {\n key: \"inRange\",\n value: function inRange(x, y) {\n var layout = this.props.layout;\n\n if (layout === 'horizontal' || layout === 'vertical') {\n var offset = this.state.offset;\n var isInRange = x >= offset.left && x <= offset.left + offset.width && y >= offset.top && y <= offset.top + offset.height;\n return isInRange ? {\n x: x,\n y: y\n } : null;\n }\n\n var _this$state14 = this.state,\n angleAxisMap = _this$state14.angleAxisMap,\n radiusAxisMap = _this$state14.radiusAxisMap;\n\n if (angleAxisMap && radiusAxisMap) {\n var angleAxis = getAnyElementOfObject(angleAxisMap);\n return inRangeOfSector({\n x: x,\n y: y\n }, angleAxis);\n }\n\n return null;\n }\n }, {\n key: \"parseEventsOfWrapper\",\n value: function parseEventsOfWrapper() {\n var children = this.props.children;\n var tooltipItem = findChildByType(children, Tooltip);\n var tooltipEvents = tooltipItem && eventType === 'axis' ? {\n onMouseEnter: this.handleMouseEnter,\n onMouseMove: this.handleMouseMove,\n onMouseLeave: this.handleMouseLeave,\n onTouchMove: this.handleTouchMove,\n onTouchStart: this.handleTouchStart,\n onTouchEnd: this.handleTouchEnd\n } : {};\n var outerEvents = filterEventAttributes(this.props, this.handleOuterEvent);\n return _objectSpread({}, outerEvents, tooltipEvents);\n }\n /**\n * The AxisMaps are expensive to render on large data sets\n * so provide the ability to store them in state and only update them when necessary\n * they are dependent upon the start and end index of\n * the brush so it's important that this method is called _after_\n * the state is updated with any new start/end indices\n *\n * @param {Object} props The props object to be used for updating the axismaps\n * @param {Number} dataStartIndex The start index of the data series when a brush is applied\n * @param {Number} dataEndIndex The end index of the data series when a brush is applied\n * @param {Number} updateId The update id\n * @return {Object} state New state to set\n */\n\n }, {\n key: \"updateStateOfAxisMapsOffsetAndStackGroups\",\n value: function updateStateOfAxisMapsOffsetAndStackGroups(_ref8) {\n var _this5 = this;\n\n var props = _ref8.props,\n dataStartIndex = _ref8.dataStartIndex,\n dataEndIndex = _ref8.dataEndIndex,\n updateId = _ref8.updateId;\n\n if (!validateWidthHeight({\n props: props\n })) {\n return null;\n }\n\n var children = props.children,\n layout = props.layout,\n stackOffset = props.stackOffset,\n data = props.data,\n reverseStackOrder = props.reverseStackOrder;\n\n var _this$constructor$get2 = this.constructor.getAxisNameByLayout(layout),\n numericAxisName = _this$constructor$get2.numericAxisName,\n cateAxisName = _this$constructor$get2.cateAxisName;\n\n var graphicalItems = findAllByType(children, GraphicalChild);\n var stackGroups = getStackGroupsByAxisId(data, graphicalItems, \"\".concat(numericAxisName, \"Id\"), \"\".concat(cateAxisName, \"Id\"), stackOffset, reverseStackOrder);\n var axisObj = axisComponents.reduce(function (result, entry) {\n var name = \"\".concat(entry.axisType, \"Map\");\n return _objectSpread({}, result, _defineProperty({}, name, _this5.getAxisMap(props, _objectSpread({}, entry, {\n graphicalItems: graphicalItems,\n stackGroups: entry.axisType === numericAxisName && stackGroups,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n }))));\n }, {});\n var offset = this.calculateOffset(_objectSpread({}, axisObj, {\n props: props,\n graphicalItems: graphicalItems\n }));\n Object.keys(axisObj).forEach(function (key) {\n axisObj[key] = formatAxisMap(props, axisObj[key], offset, key.replace('Map', ''), chartName);\n });\n var cateAxisMap = axisObj[\"\".concat(cateAxisName, \"Map\")];\n var ticksObj = this.tooltipTicksGenerator(cateAxisMap);\n var formatedGraphicalItems = this.getFormatItems(props, _objectSpread({}, axisObj, {\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex,\n updateId: updateId,\n graphicalItems: graphicalItems,\n stackGroups: stackGroups,\n offset: offset\n }));\n return _objectSpread({\n formatedGraphicalItems: formatedGraphicalItems,\n graphicalItems: graphicalItems,\n offset: offset,\n stackGroups: stackGroups\n }, ticksObj, axisObj);\n }\n /* eslint-disable no-underscore-dangle */\n\n }, {\n key: \"addListener\",\n value: function addListener() {\n eventCenter.on(SYNC_EVENT, this.handleReceiveSyncEvent);\n\n if (eventCenter.setMaxListeners && eventCenter._maxListeners) {\n eventCenter.setMaxListeners(eventCenter._maxListeners + 1);\n }\n }\n }, {\n key: \"removeListener\",\n value: function removeListener() {\n eventCenter.removeListener(SYNC_EVENT, this.handleReceiveSyncEvent);\n\n if (eventCenter.setMaxListeners && eventCenter._maxListeners) {\n eventCenter.setMaxListeners(eventCenter._maxListeners - 1);\n }\n }\n /**\n * Calculate the offset of main part in the svg element\n * @param {Object} props Latest props\n * @param {Array} graphicalItems The instances of item\n * @param {Object} xAxisMap The configuration of x-axis\n * @param {Object} yAxisMap The configuration of y-axis\n * @return {Object} The offset of main part in the svg element\n */\n\n }, {\n key: \"calculateOffset\",\n value: function calculateOffset(_ref9) {\n var props = _ref9.props,\n graphicalItems = _ref9.graphicalItems,\n _ref9$xAxisMap = _ref9.xAxisMap,\n xAxisMap = _ref9$xAxisMap === void 0 ? {} : _ref9$xAxisMap,\n _ref9$yAxisMap = _ref9.yAxisMap,\n yAxisMap = _ref9$yAxisMap === void 0 ? {} : _ref9$yAxisMap;\n var width = props.width,\n height = props.height,\n children = props.children;\n var margin = props.margin || {};\n var brushItem = findChildByType(children, Brush);\n var legendItem = findChildByType(children, Legend);\n var offsetH = Object.keys(yAxisMap).reduce(function (result, id) {\n var entry = yAxisMap[id];\n var orientation = entry.orientation;\n\n if (!entry.mirror && !entry.hide) {\n return _objectSpread({}, result, _defineProperty({}, orientation, result[orientation] + entry.width));\n }\n\n return result;\n }, {\n left: margin.left || 0,\n right: margin.right || 0\n });\n var offsetV = Object.keys(xAxisMap).reduce(function (result, id) {\n var entry = xAxisMap[id];\n var orientation = entry.orientation;\n\n if (!entry.mirror && !entry.hide) {\n return _objectSpread({}, result, _defineProperty({}, orientation, result[orientation] + entry.height));\n }\n\n return result;\n }, {\n top: margin.top || 0,\n bottom: margin.bottom || 0\n });\n\n var offset = _objectSpread({}, offsetV, offsetH);\n\n var brushBottom = offset.bottom;\n\n if (brushItem) {\n offset.bottom += brushItem.props.height || Brush.defaultProps.height;\n }\n\n if (legendItem && this.legendInstance) {\n var legendBox = this.legendInstance.getBBox();\n offset = appendOffsetOfLegend(offset, graphicalItems, props, legendBox);\n }\n\n return _objectSpread({\n brushBottom: brushBottom\n }, offset, {\n width: width - offset.left - offset.right,\n height: height - offset.top - offset.bottom\n });\n }\n }, {\n key: \"triggerSyncEvent\",\n value: function triggerSyncEvent(data) {\n var syncId = this.props.syncId;\n\n if (!_isNil(syncId)) {\n eventCenter.emit(SYNC_EVENT, syncId, this.uniqueChartId, data);\n }\n }\n }, {\n key: \"filterFormatItem\",\n value: function filterFormatItem(item, displayName, childIndex) {\n var formatedGraphicalItems = this.state.formatedGraphicalItems;\n\n for (var i = 0, len = formatedGraphicalItems.length; i < len; i++) {\n var entry = formatedGraphicalItems[i];\n\n if (entry.item === item || entry.props.key === item.key || displayName === getDisplayName(entry.item.type) && childIndex === entry.childIndex) {\n return entry;\n }\n }\n\n return null;\n }\n }, {\n key: \"renderAxis\",\n\n /**\n * Draw axis\n * @param {Object} axisOptions The options of axis\n * @param {Object} element The axis element\n * @param {String} displayName The display name of axis\n * @param {Number} index The index of element\n * @return {ReactElement} The instance of x-axes\n */\n value: function renderAxis(axisOptions, element, displayName, index) {\n var _this$props5 = this.props,\n width = _this$props5.width,\n height = _this$props5.height;\n return React.createElement(CartesianAxis, _extends({}, axisOptions, {\n className: \"recharts-\".concat(axisOptions.axisType, \" \").concat(axisOptions.axisType),\n key: element.key || \"\".concat(displayName, \"-\").concat(index),\n viewBox: {\n x: 0,\n y: 0,\n width: width,\n height: height\n },\n ticksGenerator: this.axesTicksGenerator\n }));\n }\n /**\n * Draw grid\n * @param {ReactElement} element the grid item\n * @return {ReactElement} The instance of grid\n */\n\n }, {\n key: \"renderLegend\",\n\n /**\n * Draw legend\n * @return {ReactElement} The instance of Legend\n */\n value: function renderLegend() {\n var _this6 = this;\n\n var formatedGraphicalItems = this.state.formatedGraphicalItems;\n var _this$props6 = this.props,\n children = _this$props6.children,\n width = _this$props6.width,\n height = _this$props6.height;\n var margin = this.props.margin || {};\n var legendWidth = width - (margin.left || 0) - (margin.right || 0);\n var legendHeight = height - (margin.top || 0) - (margin.bottom || 0);\n var props = getLegendProps({\n children: children,\n formatedGraphicalItems: formatedGraphicalItems,\n legendWidth: legendWidth,\n legendHeight: legendHeight,\n legendContent: legendContent\n });\n\n if (!props) {\n return null;\n }\n\n var item = props.item,\n otherProps = _objectWithoutProperties(props, [\"item\"]);\n\n return cloneElement(item, _objectSpread({}, otherProps, {\n chartWidth: width,\n chartHeight: height,\n margin: margin,\n ref: function ref(legend) {\n _this6.legendInstance = legend;\n },\n onBBoxUpdate: this.handleLegendBBoxUpdate\n }));\n }\n /**\n * Draw Tooltip\n * @return {ReactElement} The instance of Tooltip\n */\n\n }, {\n key: \"renderTooltip\",\n value: function renderTooltip() {\n var children = this.props.children;\n var tooltipItem = findChildByType(children, Tooltip);\n\n if (!tooltipItem) {\n return null;\n }\n\n var _this$state15 = this.state,\n isTooltipActive = _this$state15.isTooltipActive,\n activeCoordinate = _this$state15.activeCoordinate,\n activePayload = _this$state15.activePayload,\n activeLabel = _this$state15.activeLabel,\n offset = _this$state15.offset;\n return cloneElement(tooltipItem, {\n viewBox: _objectSpread({}, offset, {\n x: offset.left,\n y: offset.top\n }),\n active: isTooltipActive,\n label: activeLabel,\n payload: isTooltipActive ? activePayload : [],\n coordinate: activeCoordinate\n });\n }\n }, {\n key: \"renderActivePoints\",\n value: function renderActivePoints(_ref10) {\n var item = _ref10.item,\n activePoint = _ref10.activePoint,\n basePoint = _ref10.basePoint,\n childIndex = _ref10.childIndex,\n isRange = _ref10.isRange;\n var result = [];\n var key = item.props.key;\n var _item$item$props2 = item.item.props,\n activeDot = _item$item$props2.activeDot,\n dataKey = _item$item$props2.dataKey;\n\n var dotProps = _objectSpread({\n index: childIndex,\n dataKey: dataKey,\n cx: activePoint.x,\n cy: activePoint.y,\n r: 4,\n fill: getMainColorOfGraphicItem(item.item),\n strokeWidth: 2,\n stroke: '#fff',\n payload: activePoint.payload,\n value: activePoint.value,\n key: \"\".concat(key, \"-activePoint-\").concat(childIndex)\n }, getPresentationAttributes(activeDot), filterEventAttributes(activeDot));\n\n result.push(this.constructor.renderActiveDot(activeDot, dotProps, childIndex));\n\n if (basePoint) {\n result.push(this.constructor.renderActiveDot(activeDot, _objectSpread({}, dotProps, {\n cx: basePoint.x,\n cy: basePoint.y,\n key: \"\".concat(key, \"-basePoint-\").concat(childIndex)\n }), childIndex));\n } else if (isRange) {\n result.push(null);\n }\n\n return result;\n }\n }, {\n key: \"renderClipPath\",\n value: function renderClipPath() {\n var clipPathId = this.clipPathId;\n var _this$state$offset = this.state.offset,\n left = _this$state$offset.left,\n top = _this$state$offset.top,\n height = _this$state$offset.height,\n width = _this$state$offset.width;\n return React.createElement(\"defs\", null, React.createElement(\"clipPath\", {\n id: clipPathId\n }, React.createElement(\"rect\", {\n x: left,\n y: top,\n height: height,\n width: width\n })));\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this7 = this;\n\n if (!validateWidthHeight(this)) {\n return null;\n }\n\n var _this$props7 = this.props,\n children = _this$props7.children,\n className = _this$props7.className,\n width = _this$props7.width,\n height = _this$props7.height,\n style = _this$props7.style,\n compact = _this$props7.compact,\n others = _objectWithoutProperties(_this$props7, [\"children\", \"className\", \"width\", \"height\", \"style\", \"compact\"]);\n\n var attrs = getPresentationAttributes(others);\n var map = {\n CartesianGrid: {\n handler: this.renderGrid,\n once: true\n },\n ReferenceArea: {\n handler: this.renderReferenceElement\n },\n ReferenceLine: {\n handler: this.renderReferenceElement\n },\n ReferenceDot: {\n handler: this.renderReferenceElement\n },\n XAxis: {\n handler: this.renderXAxis\n },\n YAxis: {\n handler: this.renderYAxis\n },\n Brush: {\n handler: this.renderBrush,\n once: true\n },\n Bar: {\n handler: this.renderGraphicChild\n },\n Line: {\n handler: this.renderGraphicChild\n },\n Area: {\n handler: this.renderGraphicChild\n },\n Radar: {\n handler: this.renderGraphicChild\n },\n RadialBar: {\n handler: this.renderGraphicChild\n },\n Scatter: {\n handler: this.renderGraphicChild\n },\n Pie: {\n handler: this.renderGraphicChild\n },\n Funnel: {\n handler: this.renderGraphicChild\n },\n Tooltip: {\n handler: this.renderCursor,\n once: true\n },\n PolarGrid: {\n handler: this.renderPolarGrid,\n once: true\n },\n PolarAngleAxis: {\n handler: this.renderPolarAxis\n },\n PolarRadiusAxis: {\n handler: this.renderPolarAxis\n }\n }; // The \"compact\" mode is mainly used as the panorama within Brush\n\n if (compact) {\n return React.createElement(Surface, _extends({}, attrs, {\n width: width,\n height: height\n }), this.renderClipPath(), renderByOrder(children, map));\n }\n\n var events = this.parseEventsOfWrapper();\n return React.createElement(\"div\", _extends({\n className: classNames('recharts-wrapper', className),\n style: _objectSpread({\n position: 'relative',\n cursor: 'default',\n width: width,\n height: height\n }, style)\n }, events, {\n ref: function ref(node) {\n _this7.container = node;\n }\n }), React.createElement(Surface, _extends({}, attrs, {\n width: width,\n height: height\n }), this.renderClipPath(), renderByOrder(children, map)), this.renderLegend(), this.renderTooltip());\n }\n }], [{\n key: \"getAxisNameByLayout\",\n value: function getAxisNameByLayout(layout) {\n if (layout === 'horizontal') {\n return {\n numericAxisName: 'yAxis',\n cateAxisName: 'xAxis'\n };\n }\n\n if (layout === 'vertical') {\n return {\n numericAxisName: 'xAxis',\n cateAxisName: 'yAxis'\n };\n }\n\n if (layout === 'centric') {\n return {\n numericAxisName: 'radiusAxis',\n cateAxisName: 'angleAxis'\n };\n }\n\n return {\n numericAxisName: 'angleAxis',\n cateAxisName: 'radiusAxis'\n };\n }\n }, {\n key: \"renderActiveDot\",\n value: function renderActiveDot(option, props) {\n var dot;\n\n if (isValidElement(option)) {\n dot = cloneElement(option, props);\n } else if (_isFunction(option)) {\n dot = option(props);\n } else {\n dot = React.createElement(Dot, props);\n }\n\n return React.createElement(Layer, {\n className: \"recharts-active-dot\",\n key: props.key\n }, dot);\n }\n }]);\n\n return CategoricalChartWrapper;\n }(Component);\n\n CategoricalChartWrapper.displayName = chartName;\n CategoricalChartWrapper.propTypes = _objectSpread({\n syncId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n compact: PropTypes.bool,\n width: PropTypes.number,\n height: PropTypes.number,\n data: PropTypes.arrayOf(PropTypes.object),\n layout: PropTypes.oneOf(['horizontal', 'vertical']),\n stackOffset: PropTypes.oneOf(['sign', 'expand', 'none', 'wiggle', 'silhouette']),\n throttleDelay: PropTypes.number,\n margin: PropTypes.shape({\n top: PropTypes.number,\n right: PropTypes.number,\n bottom: PropTypes.number,\n left: PropTypes.number\n }),\n barCategoryGap: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n barGap: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n barSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n maxBarSize: PropTypes.number,\n style: PropTypes.object,\n className: PropTypes.string,\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),\n defaultShowTooltip: PropTypes.bool,\n onClick: PropTypes.func,\n onMouseLeave: PropTypes.func,\n onMouseEnter: PropTypes.func,\n onMouseMove: PropTypes.func,\n onMouseDown: PropTypes.func,\n onMouseUp: PropTypes.func,\n reverseStackOrder: PropTypes.bool,\n id: PropTypes.string\n }, propTypes);\n CategoricalChartWrapper.defaultProps = _objectSpread({\n layout: 'horizontal',\n stackOffset: 'none',\n barCategoryGap: '10%',\n barGap: 4,\n margin: {\n top: 5,\n right: 5,\n bottom: 5,\n left: 5\n },\n reverseStackOrder: false\n }, defaultProps);\n\n CategoricalChartWrapper.createDefaultState = function (props) {\n var children = props.children,\n defaultShowTooltip = props.defaultShowTooltip;\n var brushItem = findChildByType(children, Brush);\n var startIndex = brushItem && brushItem.props && brushItem.props.startIndex || 0;\n var endIndex = brushItem && brushItem.props && brushItem.props.endIndex || props.data && props.data.length - 1 || 0;\n return {\n chartX: 0,\n chartY: 0,\n dataStartIndex: startIndex,\n dataEndIndex: endIndex,\n activeTooltipIndex: -1,\n isTooltipActive: !_isNil(defaultShowTooltip) ? defaultShowTooltip : false\n };\n };\n\n CategoricalChartWrapper.hasBar = function (graphicalItems) {\n if (!graphicalItems || !graphicalItems.length) {\n return false;\n }\n\n return graphicalItems.some(function (item) {\n var name = getDisplayName(item && item.type);\n return name && name.indexOf('Bar') >= 0;\n });\n };\n\n CategoricalChartWrapper.getDisplayedData = function (props, _ref11, item) {\n var graphicalItems = _ref11.graphicalItems,\n dataStartIndex = _ref11.dataStartIndex,\n dataEndIndex = _ref11.dataEndIndex;\n var itemsData = (graphicalItems || []).reduce(function (result, child) {\n var itemData = child.props.data;\n\n if (itemData && itemData.length) {\n return _toConsumableArray(result).concat(_toConsumableArray(itemData));\n }\n\n return result;\n }, []);\n\n if (itemsData && itemsData.length > 0) {\n return itemsData;\n }\n\n if (item && item.props && item.props.data && item.props.data.length > 0) {\n return item.props.data;\n }\n\n var data = props.data;\n\n if (data && data.length && isNumber(dataStartIndex) && isNumber(dataEndIndex)) {\n return data.slice(dataStartIndex, dataEndIndex + 1);\n }\n\n return [];\n };\n\n return CategoricalChartWrapper;\n};\n\nexport default generateCategoricalChart;", + "/**\n * @fileOverview Area Chart\n */\nimport generateCategoricalChart from './generateCategoricalChart';\nimport Area from '../cartesian/Area';\nimport XAxis from '../cartesian/XAxis';\nimport YAxis from '../cartesian/YAxis';\nimport { formatAxisMap } from '../util/CartesianUtils';\nexport default generateCategoricalChart({\n chartName: 'AreaChart',\n GraphicalChild: Area,\n axisComponents: [{\n axisType: 'xAxis',\n AxisComp: XAxis\n }, {\n axisType: 'yAxis',\n AxisComp: YAxis\n }],\n formatAxisMap: formatAxisMap\n});", + "import _isObject from \"lodash/isObject\";\nimport _isFunction from \"lodash/isFunction\";\nimport _isNil from \"lodash/isNil\";\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport React, { cloneElement, isValidElement } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Text from './Text';\nimport { PRESENTATION_ATTRIBUTES, getPresentationAttributes, findAllByType } from '../util/ReactUtils';\nimport { isNumOrStr, isNumber, isPercent, getPercentValue, uniqueId, mathSign } from '../util/DataUtils';\nimport { polarToCartesian } from '../util/PolarUtils';\nvar cartesianViewBoxShape = PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number\n});\nvar polarViewBoxShape = PropTypes.shape({\n cx: PropTypes.number,\n cy: PropTypes.number,\n innerRadius: PropTypes.number,\n outerRadius: PropTypes.number,\n startAngle: PropTypes.number,\n endAngle: PropTypes.number\n});\n\nvar propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, {\n viewBox: PropTypes.oneOfType([cartesianViewBoxShape, polarViewBoxShape]),\n formatter: PropTypes.func,\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n offset: PropTypes.number,\n position: PropTypes.oneOf(['top', 'left', 'right', 'bottom', 'inside', 'outside', 'insideLeft', 'insideRight', 'insideTop', 'insideBottom', 'insideTopLeft', 'insideBottomLeft', 'insideTopRight', 'insideBottomRight', 'insideStart', 'insideEnd', 'end', 'center', 'centerTop', 'centerBottom']),\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),\n className: PropTypes.string,\n content: PropTypes.oneOfType([PropTypes.element, PropTypes.func])\n});\n\nvar defaultProps = {\n offset: 5\n};\n\nvar getLabel = function getLabel(props) {\n var value = props.value,\n formatter = props.formatter;\n var label = _isNil(props.children) ? value : props.children;\n\n if (_isFunction(formatter)) {\n return formatter(label);\n }\n\n return label;\n};\n\nvar getDeltaAngle = function getDeltaAngle(startAngle, endAngle) {\n var sign = mathSign(endAngle - startAngle);\n var deltaAngle = Math.min(Math.abs(endAngle - startAngle), 360);\n return sign * deltaAngle;\n};\n\nvar renderRadialLabel = function renderRadialLabel(labelProps, label, attrs) {\n var position = labelProps.position,\n viewBox = labelProps.viewBox,\n offset = labelProps.offset,\n className = labelProps.className;\n var cx = viewBox.cx,\n cy = viewBox.cy,\n innerRadius = viewBox.innerRadius,\n outerRadius = viewBox.outerRadius,\n startAngle = viewBox.startAngle,\n endAngle = viewBox.endAngle,\n clockWise = viewBox.clockWise;\n var radius = (innerRadius + outerRadius) / 2;\n var deltaAngle = getDeltaAngle(startAngle, endAngle);\n var sign = deltaAngle >= 0 ? 1 : -1;\n var labelAngle, direction;\n\n if (position === 'insideStart') {\n labelAngle = startAngle + sign * offset;\n direction = clockWise;\n } else if (position === 'insideEnd') {\n labelAngle = endAngle - sign * offset;\n direction = !clockWise;\n } else if (position === 'end') {\n labelAngle = endAngle + sign * offset;\n direction = clockWise;\n }\n\n direction = deltaAngle <= 0 ? direction : !direction;\n var startPoint = polarToCartesian(cx, cy, radius, labelAngle);\n var endPoint = polarToCartesian(cx, cy, radius, labelAngle + (direction ? 1 : -1) * 359);\n var path = \"M\".concat(startPoint.x, \",\").concat(startPoint.y, \"\\n A\").concat(radius, \",\").concat(radius, \",0,1,\").concat(direction ? 0 : 1, \",\\n \").concat(endPoint.x, \",\").concat(endPoint.y);\n var id = _isNil(labelProps.id) ? uniqueId('recharts-radial-line-') : labelProps.id;\n return React.createElement(\"text\", _extends({}, attrs, {\n dominantBaseline: \"central\",\n className: classNames('recharts-radial-bar-label', className)\n }), React.createElement(\"defs\", null, React.createElement(\"path\", {\n id: id,\n d: path\n })), React.createElement(\"textPath\", {\n xlinkHref: \"#\".concat(id)\n }, label));\n};\n\nvar getAttrsOfPolarLabel = function getAttrsOfPolarLabel(props) {\n var viewBox = props.viewBox,\n offset = props.offset,\n position = props.position;\n var cx = viewBox.cx,\n cy = viewBox.cy,\n innerRadius = viewBox.innerRadius,\n outerRadius = viewBox.outerRadius,\n startAngle = viewBox.startAngle,\n endAngle = viewBox.endAngle;\n var midAngle = (startAngle + endAngle) / 2;\n\n if (position === 'outside') {\n var _polarToCartesian = polarToCartesian(cx, cy, outerRadius + offset, midAngle),\n _x = _polarToCartesian.x,\n _y = _polarToCartesian.y;\n\n return {\n x: _x,\n y: _y,\n textAnchor: _x >= cx ? 'start' : 'end',\n verticalAnchor: 'middle'\n };\n }\n\n if (position === 'center') {\n return {\n x: cx,\n y: cy,\n textAnchor: 'middle',\n verticalAnchor: 'middle'\n };\n }\n\n if (position === 'centerTop') {\n return {\n x: cx,\n y: cy,\n textAnchor: 'middle',\n verticalAnchor: 'start'\n };\n }\n\n if (position === 'centerBottom') {\n return {\n x: cx,\n y: cy,\n textAnchor: 'middle',\n verticalAnchor: 'end'\n };\n }\n\n var r = (innerRadius + outerRadius) / 2;\n\n var _polarToCartesian2 = polarToCartesian(cx, cy, r, midAngle),\n x = _polarToCartesian2.x,\n y = _polarToCartesian2.y;\n\n return {\n x: x,\n y: y,\n textAnchor: 'middle',\n verticalAnchor: 'middle'\n };\n};\n\nvar getAttrsOfCartesianLabel = function getAttrsOfCartesianLabel(props) {\n var viewBox = props.viewBox,\n offset = props.offset,\n position = props.position;\n var x = viewBox.x,\n y = viewBox.y,\n width = viewBox.width,\n height = viewBox.height;\n var sign = height >= 0 ? 1 : -1;\n\n if (position === 'top') {\n return {\n x: x + width / 2,\n y: y - sign * offset,\n textAnchor: 'middle',\n verticalAnchor: sign > 0 ? 'end' : 'start'\n };\n }\n\n if (position === 'bottom') {\n return {\n x: x + width / 2,\n y: y + height + sign * offset,\n textAnchor: 'middle',\n verticalAnchor: 'start'\n };\n }\n\n if (position === 'left') {\n return {\n x: x - offset,\n y: y + height / 2,\n textAnchor: 'end',\n verticalAnchor: 'middle'\n };\n }\n\n if (position === 'right') {\n return {\n x: x + width + offset,\n y: y + height / 2,\n textAnchor: 'start',\n verticalAnchor: 'middle'\n };\n }\n\n if (position === 'insideLeft') {\n return {\n x: x + offset,\n y: y + height / 2,\n textAnchor: 'start',\n verticalAnchor: 'middle'\n };\n }\n\n if (position === 'insideRight') {\n return {\n x: x + width - offset,\n y: y + height / 2,\n textAnchor: 'end',\n verticalAnchor: 'middle'\n };\n }\n\n if (position === 'insideTop') {\n return {\n x: x + width / 2,\n y: y + sign * offset,\n textAnchor: 'middle',\n verticalAnchor: 'start'\n };\n }\n\n if (position === 'insideBottom') {\n return {\n x: x + width / 2,\n y: y + height - sign * offset,\n textAnchor: 'middle',\n verticalAnchor: 'end'\n };\n }\n\n if (position === 'insideTopLeft') {\n return {\n x: x + offset,\n y: y + sign * offset,\n textAnchor: 'start',\n verticalAnchor: 'start'\n };\n }\n\n if (position === 'insideTopRight') {\n return {\n x: x + width - offset,\n y: y + sign * offset,\n textAnchor: 'end',\n verticalAnchor: 'start'\n };\n }\n\n if (position === 'insideBottomLeft') {\n return {\n x: x + offset,\n y: y + height - sign * offset,\n textAnchor: 'start',\n verticalAnchor: 'end'\n };\n }\n\n if (position === 'insideBottomRight') {\n return {\n x: x + width - offset,\n y: y + height - sign * offset,\n textAnchor: 'end',\n verticalAnchor: 'end'\n };\n }\n\n if (_isObject(position) && (isNumber(position.x) || isPercent(position.x)) && (isNumber(position.y) || isPercent(position.y))) {\n return {\n x: x + getPercentValue(position.x, width),\n y: y + getPercentValue(position.y, height),\n textAnchor: 'end',\n verticalAnchor: 'end'\n };\n }\n\n return {\n x: x + width / 2,\n y: y + height / 2,\n textAnchor: 'middle',\n verticalAnchor: 'middle'\n };\n};\n\nvar isPolar = function isPolar(viewBox) {\n return isNumber(viewBox.cx);\n};\n\nfunction Label(props) {\n var viewBox = props.viewBox,\n position = props.position,\n value = props.value,\n children = props.children,\n content = props.content,\n _props$className = props.className,\n className = _props$className === void 0 ? '' : _props$className;\n\n if (!viewBox || _isNil(value) && _isNil(children) && !isValidElement(content) && !_isFunction(content)) {\n return null;\n }\n\n if (isValidElement(content)) {\n return cloneElement(content, props);\n }\n\n var label;\n\n if (_isFunction(content)) {\n label = content(props);\n\n if (isValidElement(label)) {\n return label;\n }\n } else {\n label = getLabel(props);\n }\n\n var isPolarLabel = isPolar(viewBox);\n var attrs = getPresentationAttributes(props);\n\n if (isPolarLabel && (position === 'insideStart' || position === 'insideEnd' || position === 'end')) {\n return renderRadialLabel(props, label, attrs);\n }\n\n var positionAttrs = isPolarLabel ? getAttrsOfPolarLabel(props) : getAttrsOfCartesianLabel(props);\n return React.createElement(Text, _extends({\n className: classNames('recharts-label', className)\n }, attrs, positionAttrs), label);\n}\n\nLabel.displayName = 'Label';\nLabel.defaultProps = defaultProps;\nLabel.propTypes = propTypes;\n\nvar parseViewBox = function parseViewBox(props) {\n var cx = props.cx,\n cy = props.cy,\n angle = props.angle,\n startAngle = props.startAngle,\n endAngle = props.endAngle,\n r = props.r,\n radius = props.radius,\n innerRadius = props.innerRadius,\n outerRadius = props.outerRadius,\n x = props.x,\n y = props.y,\n top = props.top,\n left = props.left,\n width = props.width,\n height = props.height,\n clockWise = props.clockWise;\n\n if (isNumber(width) && isNumber(height)) {\n if (isNumber(x) && isNumber(y)) {\n return {\n x: x,\n y: y,\n width: width,\n height: height\n };\n }\n\n if (isNumber(top) && isNumber(left)) {\n return {\n x: top,\n y: left,\n width: width,\n height: height\n };\n }\n }\n\n if (isNumber(x) && isNumber(y)) {\n return {\n x: x,\n y: y,\n width: 0,\n height: 0\n };\n }\n\n if (isNumber(cx) && isNumber(cy)) {\n return {\n cx: cx,\n cy: cy,\n startAngle: startAngle || angle || 0,\n endAngle: endAngle || angle || 0,\n innerRadius: innerRadius || 0,\n outerRadius: outerRadius || radius || r || 0,\n clockWise: clockWise\n };\n }\n\n if (props.viewBox) {\n return props.viewBox;\n }\n\n return {};\n};\n\nvar parseLabel = function parseLabel(label, viewBox) {\n if (!label) {\n return null;\n }\n\n if (label === true) {\n return React.createElement(Label, {\n key: \"label-implicit\",\n viewBox: viewBox\n });\n }\n\n if (isNumOrStr(label)) {\n return React.createElement(Label, {\n key: \"label-implicit\",\n viewBox: viewBox,\n value: label\n });\n }\n\n if (isValidElement(label) || _isFunction(label)) {\n return React.createElement(Label, {\n key: \"label-implicit\",\n content: label,\n viewBox: viewBox\n });\n }\n\n if (_isObject(label)) {\n return React.createElement(Label, _extends({\n viewBox: viewBox\n }, label, {\n key: \"label-implicit\"\n }));\n }\n\n return null;\n};\n\nvar renderCallByParent = function renderCallByParent(parentProps, viewBox) {\n var ckeckPropsLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) {\n return null;\n }\n\n var children = parentProps.children;\n var parentViewBox = parseViewBox(parentProps);\n var explicitChilren = findAllByType(children, Label).map(function (child, index) {\n return cloneElement(child, {\n viewBox: viewBox || parentViewBox,\n key: \"label-\".concat(index)\n });\n });\n\n if (!ckeckPropsLabel) {\n return explicitChilren;\n }\n\n var implicitLabel = parseLabel(parentProps.label, viewBox || parentViewBox);\n return [implicitLabel].concat(_toConsumableArray(explicitChilren));\n};\n\nLabel.parseViewBox = parseViewBox;\nLabel.renderCallByParent = renderCallByParent;\nexport default Label;", + "import _isObject from \"lodash/isObject\";\nimport _isFunction from \"lodash/isFunction\";\nimport _isNil from \"lodash/isNil\";\nimport _last from \"lodash/last\";\nimport _isArray from \"lodash/isArray\";\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React, { cloneElement } from 'react';\nimport PropTypes from 'prop-types';\nimport Label from './Label';\nimport Layer from '../container/Layer';\nimport { getPresentationAttributes, findAllByType } from '../util/ReactUtils';\nimport { getValueByDataKey } from '../util/ChartUtils';\nvar propTypes = {\n id: PropTypes.string,\n data: PropTypes.arrayOf(PropTypes.object),\n valueAccessor: PropTypes.func,\n clockWise: PropTypes.bool,\n dataKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func])\n};\nvar defaultProps = {\n valueAccessor: function valueAccessor(entry) {\n return _isArray(entry.value) ? _last(entry.value) : entry.value;\n }\n};\n\nfunction LabelList(props) {\n var data = props.data,\n valueAccessor = props.valueAccessor,\n dataKey = props.dataKey,\n clockWise = props.clockWise,\n id = props.id,\n others = _objectWithoutProperties(props, [\"data\", \"valueAccessor\", \"dataKey\", \"clockWise\", \"id\"]);\n\n if (!data || !data.length) {\n return null;\n }\n\n return React.createElement(Layer, {\n className: \"recharts-label-list\"\n }, data.map(function (entry, index) {\n var value = _isNil(dataKey) ? valueAccessor(entry, index) : getValueByDataKey(entry && entry.payload, dataKey);\n var idProps = _isNil(id) ? {} : {\n id: \"\".concat(id, \"-\").concat(index)\n };\n return React.createElement(Label, _extends({}, getPresentationAttributes(entry), others, idProps, {\n index: index,\n value: value,\n viewBox: Label.parseViewBox(_isNil(clockWise) ? entry : _objectSpread({}, entry, {\n clockWise: clockWise\n })),\n key: \"label-\".concat(index)\n }));\n }));\n}\n\nLabelList.propTypes = propTypes;\nLabelList.displayName = 'LabelList';\n\nvar parseLabelList = function parseLabelList(label, data) {\n if (!label) {\n return null;\n }\n\n if (label === true) {\n return React.createElement(LabelList, {\n key: \"labelList-implicit\",\n data: data\n });\n }\n\n if (React.isValidElement(label) || _isFunction(label)) {\n return React.createElement(LabelList, {\n key: \"labelList-implicit\",\n data: data,\n content: label\n });\n }\n\n if (_isObject(label)) {\n return React.createElement(LabelList, _extends({\n data: data\n }, label, {\n key: \"labelList-implicit\"\n }));\n }\n\n return null;\n};\n\nvar renderCallByParent = function renderCallByParent(parentProps, data) {\n var ckeckPropsLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) {\n return null;\n }\n\n var children = parentProps.children;\n var explicitChilren = findAllByType(children, LabelList).map(function (child, index) {\n return cloneElement(child, {\n data: data,\n key: \"labelList-\".concat(index)\n });\n });\n\n if (!ckeckPropsLabel) {\n return explicitChilren;\n }\n\n var implicitLabelList = parseLabelList(parentProps.label, data);\n return [implicitLabelList].concat(_toConsumableArray(explicitChilren));\n};\n\nLabelList.renderCallByParent = renderCallByParent;\nLabelList.defaultProps = defaultProps;\nexport default LabelList;", + "var _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Default Legend Content\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport Surface from '../container/Surface';\nimport Symbols from '../shape/Symbols';\nimport { filterEventsOfChild, LEGEND_TYPES } from '../util/ReactUtils';\nvar SIZE = 32;\nvar ICON_TYPES = LEGEND_TYPES.filter(function (type) {\n return type !== 'none';\n});\n\nvar DefaultLegendContent = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(DefaultLegendContent, _Component);\n\n function DefaultLegendContent() {\n _classCallCheck(this, DefaultLegendContent);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(DefaultLegendContent).apply(this, arguments));\n }\n\n _createClass(DefaultLegendContent, [{\n key: \"renderIcon\",\n\n /**\n * Render the path of icon\n * @param {Object} data Data of each legend item\n * @return {String} Path element\n */\n value: function renderIcon(data) {\n var inactiveColor = this.props.inactiveColor;\n var halfSize = SIZE / 2;\n var sixthSize = SIZE / 6;\n var thirdSize = SIZE / 3;\n var color = data.inactive ? inactiveColor : data.color;\n\n if (data.type === 'plainline') {\n return React.createElement(\"line\", {\n strokeWidth: 4,\n fill: \"none\",\n stroke: color,\n strokeDasharray: data.payload.strokeDasharray,\n x1: 0,\n y1: halfSize,\n x2: SIZE,\n y2: halfSize,\n className: \"recharts-legend-icon\"\n });\n }\n\n if (data.type === 'line') {\n return React.createElement(\"path\", {\n strokeWidth: 4,\n fill: \"none\",\n stroke: color,\n d: \"M0,\".concat(halfSize, \"h\").concat(thirdSize, \"\\n A\").concat(sixthSize, \",\").concat(sixthSize, \",0,1,1,\").concat(2 * thirdSize, \",\").concat(halfSize, \"\\n H\").concat(SIZE, \"M\").concat(2 * thirdSize, \",\").concat(halfSize, \"\\n A\").concat(sixthSize, \",\").concat(sixthSize, \",0,1,1,\").concat(thirdSize, \",\").concat(halfSize),\n className: \"recharts-legend-icon\"\n });\n }\n\n if (data.type === 'rect') {\n return React.createElement(\"path\", {\n stroke: \"none\",\n fill: color,\n d: \"M0,\".concat(SIZE / 8, \"h\").concat(SIZE, \"v\").concat(SIZE * 3 / 4, \"h\").concat(-SIZE, \"z\"),\n className: \"recharts-legend-icon\"\n });\n }\n\n return React.createElement(Symbols, {\n fill: color,\n cx: halfSize,\n cy: halfSize,\n size: SIZE,\n sizeType: \"diameter\",\n type: data.type\n });\n }\n /**\n * Draw items of legend\n * @return {ReactElement} Items\n */\n\n }, {\n key: \"renderItems\",\n value: function renderItems() {\n var _this = this;\n\n var _this$props = this.props,\n payload = _this$props.payload,\n iconSize = _this$props.iconSize,\n layout = _this$props.layout,\n formatter = _this$props.formatter;\n var viewBox = {\n x: 0,\n y: 0,\n width: SIZE,\n height: SIZE\n };\n var itemStyle = {\n display: layout === 'horizontal' ? 'inline-block' : 'block',\n marginRight: 10\n };\n var svgStyle = {\n display: 'inline-block',\n verticalAlign: 'middle',\n marginRight: 4\n };\n return payload.map(function (entry, i) {\n var _classNames;\n\n var finalFormatter = entry.formatter || formatter;\n var className = classNames((_classNames = {\n 'recharts-legend-item': true\n }, _defineProperty(_classNames, \"legend-item-\".concat(i), true), _defineProperty(_classNames, \"inactive\", entry.inactive), _classNames));\n\n if (entry.type === 'none') {\n return null;\n }\n\n return React.createElement(\"li\", _extends({\n className: className,\n style: itemStyle,\n key: \"legend-item-\".concat(i)\n }, filterEventsOfChild(_this.props, entry, i)), React.createElement(Surface, {\n width: iconSize,\n height: iconSize,\n viewBox: viewBox,\n style: svgStyle\n }, _this.renderIcon(entry)), React.createElement(\"span\", {\n className: \"recharts-legend-item-text\"\n }, finalFormatter ? finalFormatter(entry.value, entry, i) : entry.value));\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n payload = _this$props2.payload,\n layout = _this$props2.layout,\n align = _this$props2.align;\n\n if (!payload || !payload.length) {\n return null;\n }\n\n var finalStyle = {\n padding: 0,\n margin: 0,\n textAlign: layout === 'horizontal' ? align : 'left'\n };\n return React.createElement(\"ul\", {\n className: \"recharts-default-legend\",\n style: finalStyle\n }, this.renderItems());\n }\n }]);\n\n return DefaultLegendContent;\n}(Component), _class2.displayName = 'Legend', _class2.propTypes = {\n content: PropTypes.element,\n iconSize: PropTypes.number,\n iconType: PropTypes.oneOf(ICON_TYPES),\n layout: PropTypes.oneOf(['horizontal', 'vertical']),\n align: PropTypes.oneOf(['center', 'left', 'right']),\n verticalAlign: PropTypes.oneOf(['top', 'bottom', 'middle']),\n payload: PropTypes.arrayOf(PropTypes.shape({\n value: PropTypes.any,\n id: PropTypes.any,\n type: PropTypes.oneOf(LEGEND_TYPES)\n })),\n inactiveColor: PropTypes.string,\n formatter: PropTypes.func,\n onMouseEnter: PropTypes.func,\n onMouseLeave: PropTypes.func,\n onClick: PropTypes.func\n}, _class2.defaultProps = {\n iconSize: 14,\n layout: 'horizontal',\n align: 'center',\n verticalAlign: 'middle',\n inactiveColor: '#ccc'\n}, _temp)) || _class;\n\nexport default DefaultLegendContent;", + "import _isFunction from \"lodash/isFunction\";\nimport _uniqBy from \"lodash/uniqBy\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Legend\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport pureRender from '../util/PureRender';\nimport DefaultLegendContent from './DefaultLegendContent';\nimport { isNumber } from '../util/DataUtils';\nimport { LEGEND_TYPES } from '../util/ReactUtils';\n\nvar defaultUniqBy = function defaultUniqBy(entry) {\n return entry.value;\n};\n\nvar getUniqPaylod = function getUniqPaylod(option, payload) {\n if (option === true) {\n return _uniqBy(payload, defaultUniqBy);\n }\n\n if (_isFunction(option)) {\n return _uniqBy(payload, option);\n }\n\n return payload;\n};\n\nvar renderContent = function renderContent(content, props) {\n if (React.isValidElement(content)) {\n return React.cloneElement(content, props);\n }\n\n if (_isFunction(content)) {\n return content(props);\n }\n\n return React.createElement(DefaultLegendContent, props);\n};\n\nvar EPS = 1;\nvar ICON_TYPES = LEGEND_TYPES.filter(function (type) {\n return type !== 'none';\n});\n\nvar Legend = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Legend, _Component);\n\n function Legend() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, Legend);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Legend)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n boxWidth: -1,\n boxHeight: -1\n };\n return _this;\n }\n\n _createClass(Legend, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.updateBBox();\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n this.updateBBox();\n }\n }, {\n key: \"getBBox\",\n value: function getBBox() {\n var _this$state = this.state,\n boxWidth = _this$state.boxWidth,\n boxHeight = _this$state.boxHeight;\n\n if (boxWidth >= 0 && boxHeight >= 0) {\n return {\n width: boxWidth,\n height: boxHeight\n };\n }\n\n return null;\n }\n }, {\n key: \"getDefaultPosition\",\n value: function getDefaultPosition(style) {\n var _this$props = this.props,\n layout = _this$props.layout,\n align = _this$props.align,\n verticalAlign = _this$props.verticalAlign,\n margin = _this$props.margin,\n chartWidth = _this$props.chartWidth,\n chartHeight = _this$props.chartHeight;\n var hPos, vPos;\n\n if (!style || (style.left === undefined || style.left === null) && (style.right === undefined || style.right === null)) {\n if (align === 'center' && layout === 'vertical') {\n var box = this.getBBox() || {\n width: 0\n };\n hPos = {\n left: ((chartWidth || 0) - box.width) / 2\n };\n } else {\n hPos = align === 'right' ? {\n right: margin && margin.right || 0\n } : {\n left: margin && margin.left || 0\n };\n }\n }\n\n if (!style || (style.top === undefined || style.top === null) && (style.bottom === undefined || style.bottom === null)) {\n if (verticalAlign === 'middle') {\n var _box = this.getBBox() || {\n height: 0\n };\n\n vPos = {\n top: ((chartHeight || 0) - _box.height) / 2\n };\n } else {\n vPos = verticalAlign === 'bottom' ? {\n bottom: margin && margin.bottom || 0\n } : {\n top: margin && margin.top || 0\n };\n }\n }\n\n return _objectSpread({}, hPos, vPos);\n }\n }, {\n key: \"updateBBox\",\n value: function updateBBox() {\n var _this$state2 = this.state,\n boxWidth = _this$state2.boxWidth,\n boxHeight = _this$state2.boxHeight;\n var onBBoxUpdate = this.props.onBBoxUpdate;\n\n if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) {\n var box = this.wrapperNode.getBoundingClientRect();\n\n if (Math.abs(box.width - boxWidth) > EPS || Math.abs(box.height - boxHeight) > EPS) {\n this.setState({\n boxWidth: box.width,\n boxHeight: box.height\n }, function () {\n if (onBBoxUpdate) {\n onBBoxUpdate(box);\n }\n });\n }\n } else if (boxWidth !== -1 || boxHeight !== -1) {\n this.setState({\n boxWidth: -1,\n boxHeight: -1\n }, function () {\n if (onBBoxUpdate) {\n onBBoxUpdate(null);\n }\n });\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var _this$props2 = this.props,\n content = _this$props2.content,\n width = _this$props2.width,\n height = _this$props2.height,\n wrapperStyle = _this$props2.wrapperStyle,\n paylodUniqBy = _this$props2.paylodUniqBy,\n payload = _this$props2.payload;\n\n var outerStyle = _objectSpread({\n position: 'absolute',\n width: width || 'auto',\n height: height || 'auto'\n }, this.getDefaultPosition(wrapperStyle), wrapperStyle);\n\n return React.createElement(\"div\", {\n className: \"recharts-legend-wrapper\",\n style: outerStyle,\n ref: function ref(node) {\n _this2.wrapperNode = node;\n }\n }, renderContent(content, _objectSpread({}, this.props, {\n payload: getUniqPaylod(paylodUniqBy, payload)\n })));\n }\n }], [{\n key: \"getWithHeight\",\n value: function getWithHeight(item, chartWidth) {\n var layout = item.props.layout;\n\n if (layout === 'vertical' && isNumber(item.props.height)) {\n return {\n height: item.props.height\n };\n }\n\n if (layout === 'horizontal') {\n return {\n width: item.props.width || chartWidth\n };\n }\n\n return null;\n }\n }]);\n\n return Legend;\n}(Component), _class2.displayName = 'Legend', _class2.propTypes = {\n content: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),\n wrapperStyle: PropTypes.object,\n chartWidth: PropTypes.number,\n chartHeight: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number,\n iconSize: PropTypes.number,\n iconType: PropTypes.oneOf(ICON_TYPES),\n layout: PropTypes.oneOf(['horizontal', 'vertical']),\n align: PropTypes.oneOf(['center', 'left', 'right']),\n verticalAlign: PropTypes.oneOf(['top', 'bottom', 'middle']),\n margin: PropTypes.shape({\n top: PropTypes.number,\n left: PropTypes.number,\n bottom: PropTypes.number,\n right: PropTypes.number\n }),\n payload: PropTypes.arrayOf(PropTypes.shape({\n value: PropTypes.any,\n id: PropTypes.any,\n type: PropTypes.oneOf(LEGEND_TYPES)\n })),\n paylodUniqBy: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]),\n formatter: PropTypes.func,\n onMouseEnter: PropTypes.func,\n onMouseLeave: PropTypes.func,\n onClick: PropTypes.func,\n onBBoxUpdate: PropTypes.func\n}, _class2.defaultProps = {\n iconSize: 14,\n layout: 'horizontal',\n align: 'center',\n verticalAlign: 'bottom'\n}, _temp)) || _class;\n\nexport default Legend;", + "import _debounce from \"lodash/debounce\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Wrapper component to make charts adapt to the size of parent * DOM\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport ReactResizeDetector from 'react-resize-detector';\nimport { isPercent } from '../util/DataUtils';\nimport { warn } from '../util/LogUtils';\n\nvar ResponsiveContainer =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(ResponsiveContainer, _Component);\n\n function ResponsiveContainer(props) {\n var _this;\n\n _classCallCheck(this, ResponsiveContainer);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ResponsiveContainer).call(this, props));\n\n _this.updateDimensionsImmediate = function () {\n if (!_this.mounted) {\n return;\n }\n\n var newSize = _this.getContainerSize();\n\n if (newSize) {\n var _this$state = _this.state,\n oldWidth = _this$state.containerWidth,\n oldHeight = _this$state.containerHeight;\n var containerWidth = newSize.containerWidth,\n containerHeight = newSize.containerHeight;\n\n if (containerWidth !== oldWidth || containerHeight !== oldHeight) {\n _this.setState({\n containerWidth: containerWidth,\n containerHeight: containerHeight\n });\n }\n }\n };\n\n _this.state = {\n containerWidth: -1,\n containerHeight: -1\n };\n _this.handleResize = props.debounce > 0 ? _debounce(_this.updateDimensionsImmediate, props.debounce) : _this.updateDimensionsImmediate;\n return _this;\n }\n /* eslint-disable react/no-did-mount-set-state */\n\n\n _createClass(ResponsiveContainer, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.mounted = true;\n var size = this.getContainerSize();\n\n if (size) {\n this.setState(size);\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.mounted = false;\n }\n }, {\n key: \"getContainerSize\",\n value: function getContainerSize() {\n if (!this.container) {\n return null;\n }\n\n return {\n containerWidth: this.container.clientWidth,\n containerHeight: this.container.clientHeight\n };\n }\n }, {\n key: \"renderChart\",\n value: function renderChart() {\n var _this$state2 = this.state,\n containerWidth = _this$state2.containerWidth,\n containerHeight = _this$state2.containerHeight;\n\n if (containerWidth < 0 || containerHeight < 0) {\n return null;\n }\n\n var _this$props = this.props,\n aspect = _this$props.aspect,\n width = _this$props.width,\n height = _this$props.height,\n minWidth = _this$props.minWidth,\n minHeight = _this$props.minHeight,\n maxHeight = _this$props.maxHeight,\n children = _this$props.children;\n warn(isPercent(width) || isPercent(height), \"The width(%s) and height(%s) are both fixed numbers,\\n maybe you don't need to use a ResponsiveContainer.\", width, height);\n warn(!aspect || aspect > 0, 'The aspect(%s) must be greater than zero.', aspect);\n var calculatedWidth = isPercent(width) ? containerWidth : width;\n var calculatedHeight = isPercent(height) ? containerHeight : height;\n\n if (aspect && aspect > 0) {\n // Preserve the desired aspect ratio\n calculatedHeight = calculatedWidth / aspect; // if maxHeight is set, overwrite if calculatedHeight is greater than maxHeight\n\n if (maxHeight && calculatedHeight > maxHeight) {\n calculatedHeight = maxHeight;\n }\n }\n\n warn(calculatedWidth > 0 || calculatedHeight > 0, \"The width(%s) and height(%s) of chart should be greater than 0,\\n please check the style of container, or the props width(%s) and height(%s),\\n or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the\\n height and width.\", calculatedWidth, calculatedHeight, width, height, minWidth, minHeight, aspect);\n return React.cloneElement(children, {\n width: calculatedWidth,\n height: calculatedHeight\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var _this$props2 = this.props,\n minWidth = _this$props2.minWidth,\n minHeight = _this$props2.minHeight,\n width = _this$props2.width,\n height = _this$props2.height,\n maxHeight = _this$props2.maxHeight,\n id = _this$props2.id,\n className = _this$props2.className;\n var style = {\n width: width,\n height: height,\n minWidth: minWidth,\n minHeight: minHeight,\n maxHeight: maxHeight\n };\n return React.createElement(\"div\", {\n id: id,\n className: classNames('recharts-responsive-container', className),\n style: style,\n ref: function ref(node) {\n _this2.container = node;\n }\n }, this.renderChart(), React.createElement(ReactResizeDetector, {\n handleWidth: true,\n handleHeight: true,\n onResize: this.handleResize\n }));\n }\n }]);\n\n return ResponsiveContainer;\n}(Component);\n\nResponsiveContainer.displayName = 'ResponsiveContainer';\nResponsiveContainer.propTypes = {\n aspect: PropTypes.number,\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n minHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n minWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n maxHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n children: PropTypes.node.isRequired,\n debounce: PropTypes.number,\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n className: PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n};\nResponsiveContainer.defaultProps = {\n width: '100%',\n height: '100%',\n debounce: 0\n};\nexport default ResponsiveContainer;", + "import _isNil from \"lodash/isNil\";\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport reduceCSSCalc from 'reduce-css-calc';\nimport classNames from 'classnames';\nimport { isNumber, isNumOrStr } from '../util/DataUtils';\nimport { PRESENTATION_ATTRIBUTES, getPresentationAttributes, isSsr } from '../util/ReactUtils';\nimport { getStringSize } from '../util/DOMUtils';\nvar BREAKING_SPACES = /[ \\f\\n\\r\\t\\v\\u2028\\u2029]+/;\n\nvar calculateWordWidths = function calculateWordWidths(props) {\n try {\n var words = !_isNil(props.children) ? props.children.toString().split(BREAKING_SPACES) : [];\n var wordsWithComputedWidth = words.map(function (word) {\n return {\n word: word,\n width: getStringSize(word, props.style).width\n };\n });\n var spaceWidth = getStringSize(\"\\xA0\", props.style).width;\n return {\n wordsWithComputedWidth: wordsWithComputedWidth,\n spaceWidth: spaceWidth\n };\n } catch (e) {\n return null;\n }\n};\n\nvar Text =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Text, _Component);\n\n function Text() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, Text);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Text)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n wordsByLines: []\n };\n return _this;\n }\n\n _createClass(Text, [{\n key: \"componentWillMount\",\n value: function componentWillMount() {\n this.updateWordsByLines(this.props, true);\n }\n }, {\n key: \"componentWillReceiveProps\",\n value: function componentWillReceiveProps(nextProps) {\n var needCalculate = this.props.children !== nextProps.children || this.props.style !== nextProps.style;\n this.updateWordsByLines(nextProps, needCalculate);\n }\n }, {\n key: \"updateWordsByLines\",\n value: function updateWordsByLines(props, needCalculate) {\n // Only perform calculations if using features that require them (multiline, scaleToFit)\n if ((props.width || props.scaleToFit) && !isSsr()) {\n if (needCalculate) {\n var wordWidths = calculateWordWidths(props);\n\n if (wordWidths) {\n var wordsWithComputedWidth = wordWidths.wordsWithComputedWidth,\n spaceWidth = wordWidths.spaceWidth;\n this.wordsWithComputedWidth = wordsWithComputedWidth;\n this.spaceWidth = spaceWidth;\n } else {\n this.updateWordsWithoutCalculate(props);\n return;\n }\n }\n\n var wordsByLines = this.calculateWordsByLines(this.wordsWithComputedWidth, this.spaceWidth, props.width);\n this.setState({\n wordsByLines: wordsByLines\n });\n } else {\n this.updateWordsWithoutCalculate(props);\n }\n }\n }, {\n key: \"updateWordsWithoutCalculate\",\n value: function updateWordsWithoutCalculate(props) {\n var words = !_isNil(props.children) ? props.children.toString().split(BREAKING_SPACES) : [];\n this.setState({\n wordsByLines: [{\n words: words\n }]\n });\n }\n }, {\n key: \"calculateWordsByLines\",\n value: function calculateWordsByLines(wordsWithComputedWidth, spaceWidth, lineWidth) {\n var scaleToFit = this.props.scaleToFit;\n return wordsWithComputedWidth.reduce(function (result, _ref) {\n var word = _ref.word,\n width = _ref.width;\n var currentLine = result[result.length - 1];\n\n if (currentLine && (lineWidth == null || scaleToFit || currentLine.width + width + spaceWidth < lineWidth)) {\n // Word can be added to an existing line\n currentLine.words.push(word);\n currentLine.width += width + spaceWidth;\n } else {\n // Add first word to line or word is too long to scaleToFit on existing line\n var newLine = {\n words: [word],\n width: width\n };\n result.push(newLine);\n }\n\n return result;\n }, []);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n dx = _this$props.dx,\n dy = _this$props.dy,\n textAnchor = _this$props.textAnchor,\n verticalAnchor = _this$props.verticalAnchor,\n scaleToFit = _this$props.scaleToFit,\n angle = _this$props.angle,\n lineHeight = _this$props.lineHeight,\n capHeight = _this$props.capHeight,\n className = _this$props.className,\n textProps = _objectWithoutProperties(_this$props, [\"dx\", \"dy\", \"textAnchor\", \"verticalAnchor\", \"scaleToFit\", \"angle\", \"lineHeight\", \"capHeight\", \"className\"]);\n\n var wordsByLines = this.state.wordsByLines;\n\n if (!isNumOrStr(textProps.x) || !isNumOrStr(textProps.y)) {\n return null;\n }\n\n var x = textProps.x + (isNumber(dx) ? dx : 0);\n var y = textProps.y + (isNumber(dy) ? dy : 0);\n var startDy;\n\n switch (verticalAnchor) {\n case 'start':\n startDy = reduceCSSCalc(\"calc(\".concat(capHeight, \")\"));\n break;\n\n case 'middle':\n startDy = reduceCSSCalc(\"calc(\".concat((wordsByLines.length - 1) / 2, \" * -\").concat(lineHeight, \" + (\").concat(capHeight, \" / 2))\"));\n break;\n\n default:\n startDy = reduceCSSCalc(\"calc(\".concat(wordsByLines.length - 1, \" * -\").concat(lineHeight, \")\"));\n break;\n }\n\n var transforms = [];\n\n if (scaleToFit) {\n var lineWidth = wordsByLines[0].width;\n transforms.push(\"scale(\".concat(this.props.width / lineWidth, \")\"));\n }\n\n if (angle) {\n transforms.push(\"rotate(\".concat(angle, \", \").concat(x, \", \").concat(y, \")\"));\n }\n\n if (transforms.length) {\n textProps.transform = transforms.join(' ');\n }\n\n return React.createElement(\"text\", _extends({}, getPresentationAttributes(textProps), {\n x: x,\n y: y,\n className: classNames('recharts-text', className),\n textAnchor: textAnchor\n }), wordsByLines.map(function (line, index) {\n return React.createElement(\"tspan\", {\n x: x,\n dy: index === 0 ? startDy : lineHeight,\n key: index\n }, line.words.join(' '));\n }));\n }\n }]);\n\n return Text;\n}(Component);\n\nText.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, {\n scaleToFit: PropTypes.bool,\n angle: PropTypes.number,\n textAnchor: PropTypes.oneOf(['start', 'middle', 'end', 'inherit']),\n verticalAnchor: PropTypes.oneOf(['start', 'middle', 'end']),\n style: PropTypes.object\n});\nText.defaultProps = {\n x: 0,\n y: 0,\n lineHeight: '1em',\n capHeight: '0.71em',\n // Magic number from d3\n scaleToFit: false,\n textAnchor: 'start',\n verticalAnchor: 'end' // Maintain compat with existing charts / default SVG behavior\n\n};\nexport default Text;", + "import _isArray from \"lodash/isArray\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport { isNumOrStr } from '../util/DataUtils';\n\nvar defaultFormatter = function defaultFormatter(value) {\n return _isArray(value) && isNumOrStr(value[0]) && isNumOrStr(value[1]) ? value.join(' ~ ') : value;\n};\n\nvar DefaultTooltipContent = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(DefaultTooltipContent, _Component);\n\n function DefaultTooltipContent() {\n _classCallCheck(this, DefaultTooltipContent);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(DefaultTooltipContent).apply(this, arguments));\n }\n\n _createClass(DefaultTooltipContent, [{\n key: \"renderContent\",\n value: function renderContent() {\n var _this$props = this.props,\n payload = _this$props.payload,\n separator = _this$props.separator,\n formatter = _this$props.formatter,\n itemStyle = _this$props.itemStyle,\n itemSorter = _this$props.itemSorter;\n\n if (payload && payload.length) {\n var listStyle = {\n padding: 0,\n margin: 0\n };\n var items = payload.sort(itemSorter).map(function (entry, i) {\n var finalItemStyle = _objectSpread({\n display: 'block',\n paddingTop: 4,\n paddingBottom: 4,\n color: entry.color || '#000'\n }, itemStyle);\n\n var finalFormatter = entry.formatter || formatter || defaultFormatter;\n var name = entry.name,\n value = entry.value;\n\n if (finalFormatter) {\n var formatted = finalFormatter(value, name, entry, i);\n\n if (Array.isArray(formatted)) {\n var _formatted = _slicedToArray(formatted, 2);\n\n value = _formatted[0];\n name = _formatted[1];\n } else {\n value = formatted;\n }\n }\n\n return React.createElement(\"li\", {\n className: \"recharts-tooltip-item\",\n key: \"tooltip-item-\".concat(i),\n style: finalItemStyle\n }, isNumOrStr(name) ? React.createElement(\"span\", {\n className: \"recharts-tooltip-item-name\"\n }, name) : null, isNumOrStr(name) ? React.createElement(\"span\", {\n className: \"recharts-tooltip-item-separator\"\n }, separator) : null, React.createElement(\"span\", {\n className: \"recharts-tooltip-item-value\"\n }, value), React.createElement(\"span\", {\n className: \"recharts-tooltip-item-unit\"\n }, entry.unit || ''));\n });\n return React.createElement(\"ul\", {\n className: \"recharts-tooltip-item-list\",\n style: listStyle\n }, items);\n }\n\n return null;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n wrapperClassName = _this$props2.wrapperClassName,\n contentStyle = _this$props2.contentStyle,\n labelClassName = _this$props2.labelClassName,\n labelStyle = _this$props2.labelStyle,\n label = _this$props2.label,\n labelFormatter = _this$props2.labelFormatter;\n\n var finalStyle = _objectSpread({\n margin: 0,\n padding: 10,\n backgroundColor: '#fff',\n border: '1px solid #ccc',\n whiteSpace: 'nowrap'\n }, contentStyle);\n\n var finalLabelStyle = _objectSpread({\n margin: 0\n }, labelStyle);\n\n var hasLabel = isNumOrStr(label);\n var finalLabel = hasLabel ? label : '';\n var wrapperCN = classNames('recharts-default-tooltip', wrapperClassName);\n var labelCN = classNames('recharts-tooltip-label', labelClassName);\n\n if (hasLabel && labelFormatter) {\n finalLabel = labelFormatter(label);\n }\n\n return React.createElement(\"div\", {\n className: wrapperCN,\n style: finalStyle\n }, React.createElement(\"p\", {\n className: labelCN,\n style: finalLabelStyle\n }, finalLabel), this.renderContent());\n }\n }]);\n\n return DefaultTooltipContent;\n}(Component), _class2.displayName = 'DefaultTooltipContent', _class2.propTypes = {\n separator: PropTypes.string,\n wrapperClassName: PropTypes.string,\n labelClassName: PropTypes.string,\n formatter: PropTypes.func,\n contentStyle: PropTypes.object,\n itemStyle: PropTypes.object,\n labelStyle: PropTypes.object,\n labelFormatter: PropTypes.func,\n label: PropTypes.any,\n payload: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.any,\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.array]),\n unit: PropTypes.any\n })),\n itemSorter: PropTypes.func\n}, _class2.defaultProps = {\n separator: ' : ',\n contentStyle: {},\n itemStyle: {},\n labelStyle: {}\n}, _temp)) || _class;\n\nexport default DefaultTooltipContent;", + "import _isNil from \"lodash/isNil\";\nimport _isFunction from \"lodash/isFunction\";\nimport _uniqBy from \"lodash/uniqBy\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Tooltip\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { translateStyle } from 'react-smooth';\nimport classNames from 'classnames';\nimport DefaultTooltipContent from './DefaultTooltipContent';\nimport { isSsr } from '../util/ReactUtils';\nimport { isNumber } from '../util/DataUtils';\nimport pureRender from '../util/PureRender';\nvar CLS_PREFIX = 'recharts-tooltip-wrapper';\nvar EPS = 1;\n\nvar defaultUniqBy = function defaultUniqBy(entry) {\n return entry.dataKey;\n};\n\nvar getUniqPaylod = function getUniqPaylod(option, payload) {\n if (option === true) {\n return _uniqBy(payload, defaultUniqBy);\n }\n\n if (_isFunction(option)) {\n return _uniqBy(payload, option);\n }\n\n return payload;\n};\n\nvar propTypes = {\n content: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),\n viewBox: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number\n }),\n active: PropTypes.bool,\n separator: PropTypes.string,\n formatter: PropTypes.func,\n offset: PropTypes.number,\n itemStyle: PropTypes.object,\n labelStyle: PropTypes.object,\n wrapperStyle: PropTypes.object,\n contentStyle: PropTypes.object,\n cursor: PropTypes.oneOfType([PropTypes.bool, PropTypes.element, PropTypes.object]),\n coordinate: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number\n }),\n position: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number\n }),\n label: PropTypes.any,\n payload: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.any,\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.array]),\n unit: PropTypes.any\n })),\n paylodUniqBy: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]),\n isAnimationActive: PropTypes.bool,\n animationDuration: PropTypes.number,\n animationEasing: PropTypes.oneOf(['ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear']),\n itemSorter: PropTypes.func,\n filterNull: PropTypes.bool,\n useTranslate3d: PropTypes.bool\n};\nvar defaultProps = {\n active: false,\n offset: 10,\n viewBox: {\n x1: 0,\n x2: 0,\n y1: 0,\n y2: 0\n },\n coordinate: {\n x: 0,\n y: 0\n },\n cursorStyle: {},\n separator: ' : ',\n wrapperStyle: {},\n contentStyle: {},\n itemStyle: {},\n labelStyle: {},\n cursor: true,\n isAnimationActive: !isSsr(),\n animationEasing: 'ease',\n animationDuration: 400,\n itemSorter: function itemSorter() {\n return -1;\n },\n filterNull: true,\n useTranslate3d: false\n};\n\nvar renderContent = function renderContent(content, props) {\n if (React.isValidElement(content)) {\n return React.cloneElement(content, props);\n }\n\n if (_isFunction(content)) {\n return content(props);\n }\n\n return React.createElement(DefaultTooltipContent, props);\n};\n\nvar Tooltip = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Tooltip, _Component);\n\n function Tooltip() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, Tooltip);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Tooltip)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n boxWidth: -1,\n boxHeight: -1\n };\n return _this;\n }\n\n _createClass(Tooltip, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.updateBBox();\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n this.updateBBox();\n }\n }, {\n key: \"updateBBox\",\n value: function updateBBox() {\n var _this$state = this.state,\n boxWidth = _this$state.boxWidth,\n boxHeight = _this$state.boxHeight;\n\n if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) {\n var box = this.wrapperNode.getBoundingClientRect();\n\n if (Math.abs(box.width - boxWidth) > EPS || Math.abs(box.height - boxHeight) > EPS) {\n this.setState({\n boxWidth: box.width,\n boxHeight: box.height\n });\n }\n } else if (boxWidth !== -1 || boxHeight !== -1) {\n this.setState({\n boxWidth: -1,\n boxHeight: -1\n });\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _classNames,\n _this2 = this;\n\n var _this$props = this.props,\n payload = _this$props.payload,\n isAnimationActive = _this$props.isAnimationActive,\n animationDuration = _this$props.animationDuration,\n animationEasing = _this$props.animationEasing,\n filterNull = _this$props.filterNull,\n paylodUniqBy = _this$props.paylodUniqBy;\n var finalPayload = getUniqPaylod(paylodUniqBy, filterNull && payload && payload.length ? payload.filter(function (entry) {\n return !_isNil(entry.value);\n }) : payload);\n var hasPayload = finalPayload && finalPayload.length;\n var _this$props2 = this.props,\n content = _this$props2.content,\n viewBox = _this$props2.viewBox,\n coordinate = _this$props2.coordinate,\n position = _this$props2.position,\n active = _this$props2.active,\n offset = _this$props2.offset,\n wrapperStyle = _this$props2.wrapperStyle;\n\n var outerStyle = _objectSpread({\n pointerEvents: 'none',\n visibility: active && hasPayload ? 'visible' : 'hidden',\n position: 'absolute',\n top: 0\n }, wrapperStyle);\n\n var translateX, translateY;\n\n if (position && isNumber(position.x) && isNumber(position.y)) {\n translateX = position.x;\n translateY = position.y;\n } else {\n var _this$state2 = this.state,\n boxWidth = _this$state2.boxWidth,\n boxHeight = _this$state2.boxHeight;\n\n if (boxWidth > 0 && boxHeight > 0 && coordinate) {\n translateX = position && isNumber(position.x) ? position.x : Math.max(coordinate.x + boxWidth + offset > viewBox.x + viewBox.width ? coordinate.x - boxWidth - offset : coordinate.x + offset, viewBox.x);\n translateY = position && isNumber(position.y) ? position.y : Math.max(coordinate.y + boxHeight + offset > viewBox.y + viewBox.height ? coordinate.y - boxHeight - offset : coordinate.y + offset, viewBox.y);\n } else {\n outerStyle.visibility = 'hidden';\n }\n }\n\n outerStyle = _objectSpread({}, outerStyle, translateStyle({\n transform: this.props.useTranslate3d ? \"translate3d(\".concat(translateX, \"px, \").concat(translateY, \"px, 0)\") : \"translate(\".concat(translateX, \"px, \").concat(translateY, \"px)\")\n }));\n\n if (isAnimationActive && active) {\n outerStyle = _objectSpread({}, outerStyle, translateStyle({\n transition: \"transform \".concat(animationDuration, \"ms \").concat(animationEasing)\n }));\n }\n\n var cls = classNames(CLS_PREFIX, (_classNames = {}, _defineProperty(_classNames, \"\".concat(CLS_PREFIX, \"-right\"), isNumber(translateX) && coordinate && isNumber(coordinate.x) && translateX >= coordinate.x), _defineProperty(_classNames, \"\".concat(CLS_PREFIX, \"-left\"), isNumber(translateX) && coordinate && isNumber(coordinate.x) && translateX < coordinate.x), _defineProperty(_classNames, \"\".concat(CLS_PREFIX, \"-bottom\"), isNumber(translateY) && coordinate && isNumber(coordinate.y) && translateY >= coordinate.y), _defineProperty(_classNames, \"\".concat(CLS_PREFIX, \"-top\"), isNumber(translateY) && coordinate && isNumber(coordinate.y) && translateY < coordinate.y), _classNames));\n return React.createElement(\"div\", {\n className: cls,\n style: outerStyle,\n ref: function ref(node) {\n _this2.wrapperNode = node;\n }\n }, renderContent(content, _objectSpread({}, this.props, {\n payload: finalPayload\n })));\n }\n }]);\n\n return Tooltip;\n}(Component), _class2.displayName = 'Tooltip', _class2.propTypes = propTypes, _class2.defaultProps = defaultProps, _temp)) || _class;\n\nexport default Tooltip;", + "function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/**\n * @fileOverview Layer\n */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nvar propTypes = {\n className: PropTypes.string,\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])\n};\n\nfunction Layer(props) {\n var children = props.children,\n className = props.className,\n others = _objectWithoutProperties(props, [\"children\", \"className\"]);\n\n var layerClass = classNames('recharts-layer', className);\n return React.createElement(\"g\", _extends({\n className: layerClass\n }, others), children);\n}\n\nLayer.propTypes = propTypes;\nexport default Layer;", + "function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/**\n * @fileOverview Surface\n */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { getPresentationAttributes } from '../util/ReactUtils';\nvar propTypes = {\n width: PropTypes.number.isRequired,\n height: PropTypes.number.isRequired,\n viewBox: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number\n }),\n className: PropTypes.string,\n style: PropTypes.object,\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])\n};\n\nfunction Surface(props) {\n var children = props.children,\n width = props.width,\n height = props.height,\n viewBox = props.viewBox,\n className = props.className,\n style = props.style,\n others = _objectWithoutProperties(props, [\"children\", \"width\", \"height\", \"viewBox\", \"className\", \"style\"]);\n\n var svgView = viewBox || {\n width: width,\n height: height,\n x: 0,\n y: 0\n };\n var layerClass = classNames('recharts-surface', className);\n var attrs = getPresentationAttributes(others);\n return React.createElement(\"svg\", _extends({}, attrs, {\n className: layerClass,\n width: width,\n height: height,\n style: style,\n viewBox: \"\".concat(svgView.x, \" \").concat(svgView.y, \" \").concat(svgView.width, \" \").concat(svgView.height),\n version: \"1.1\"\n }), children);\n}\n\nSurface.propTypes = propTypes;\nexport default Surface;", + "import 'core-js/es6/math';\nimport 'core-js/es6/number';\n/* eslint no-proto: 0 */\n\nvar testObject = {};\n\nif (!(Object.setPrototypeOf || testObject.__proto__)) {\n var nativeGetPrototypeOf = Object.getPrototypeOf;\n\n Object.getPrototypeOf = function (object) {\n if (object.__proto__) {\n return object.__proto__;\n }\n\n return nativeGetPrototypeOf.call(Object, object);\n };\n}", + "import './polyfill';\nimport _Surface from './container/Surface';\nexport { _Surface as Surface };\nimport _Layer from './container/Layer';\nexport { _Layer as Layer };\nimport _Legend from './component/Legend';\nexport { _Legend as Legend };\nimport _Tooltip from './component/Tooltip';\nexport { _Tooltip as Tooltip };\nimport _ResponsiveContainer from './component/ResponsiveContainer';\nexport { _ResponsiveContainer as ResponsiveContainer };\nimport _Cell from './component/Cell';\nexport { _Cell as Cell };\nimport _Text from './component/Text';\nexport { _Text as Text };\nimport _Label from './component/Label';\nexport { _Label as Label };\nimport _LabelList from './component/LabelList';\nexport { _LabelList as LabelList };\nimport _Sector from './shape/Sector';\nexport { _Sector as Sector };\nimport _Curve from './shape/Curve';\nexport { _Curve as Curve };\nimport _Rectangle from './shape/Rectangle';\nexport { _Rectangle as Rectangle };\nimport _Polygon from './shape/Polygon';\nexport { _Polygon as Polygon };\nimport _Dot from './shape/Dot';\nexport { _Dot as Dot };\nimport _Cross from './shape/Cross';\nexport { _Cross as Cross };\nimport _Symbols from './shape/Symbols';\nexport { _Symbols as Symbols };\nimport _PolarGrid from './polar/PolarGrid';\nexport { _PolarGrid as PolarGrid };\nimport _PolarRadiusAxis from './polar/PolarRadiusAxis';\nexport { _PolarRadiusAxis as PolarRadiusAxis };\nimport _PolarAngleAxis from './polar/PolarAngleAxis';\nexport { _PolarAngleAxis as PolarAngleAxis };\nimport _Pie from './polar/Pie';\nexport { _Pie as Pie };\nimport _Radar from './polar/Radar';\nexport { _Radar as Radar };\nimport _RadialBar from './polar/RadialBar';\nexport { _RadialBar as RadialBar };\nimport _Brush from './cartesian/Brush';\nexport { _Brush as Brush };\nimport _ReferenceLine from './cartesian/ReferenceLine';\nexport { _ReferenceLine as ReferenceLine };\nimport _ReferenceDot from './cartesian/ReferenceDot';\nexport { _ReferenceDot as ReferenceDot };\nimport _ReferenceArea from './cartesian/ReferenceArea';\nexport { _ReferenceArea as ReferenceArea };\nimport _CartesianAxis from './cartesian/CartesianAxis';\nexport { _CartesianAxis as CartesianAxis };\nimport _CartesianGrid from './cartesian/CartesianGrid';\nexport { _CartesianGrid as CartesianGrid };\nimport _Line from './cartesian/Line';\nexport { _Line as Line };\nimport _Area from './cartesian/Area';\nexport { _Area as Area };\nimport _Bar from './cartesian/Bar';\nexport { _Bar as Bar };\nimport _Scatter from './cartesian/Scatter';\nexport { _Scatter as Scatter };\nimport _XAxis from './cartesian/XAxis';\nexport { _XAxis as XAxis };\nimport _YAxis from './cartesian/YAxis';\nexport { _YAxis as YAxis };\nimport _ZAxis from './cartesian/ZAxis';\nexport { _ZAxis as ZAxis };\nimport _ErrorBar from './cartesian/ErrorBar';\nexport { _ErrorBar as ErrorBar };\nimport _LineChart from './chart/LineChart';\nexport { _LineChart as LineChart };\nimport _BarChart from './chart/BarChart';\nexport { _BarChart as BarChart };\nimport _PieChart from './chart/PieChart';\nexport { _PieChart as PieChart };\nimport _Treemap from './chart/Treemap';\nexport { _Treemap as Treemap };\nimport _Sankey from './chart/Sankey';\nexport { _Sankey as Sankey };\nimport _RadarChart from './chart/RadarChart';\nexport { _RadarChart as RadarChart };\nimport _ScatterChart from './chart/ScatterChart';\nexport { _ScatterChart as ScatterChart };\nimport _AreaChart from './chart/AreaChart';\nexport { _AreaChart as AreaChart };\nimport _RadialBarChart from './chart/RadialBarChart';\nexport { _RadialBarChart as RadialBarChart };\nimport _ComposedChart from './chart/ComposedChart';\nexport { _ComposedChart as ComposedChart };\nimport _Funnel from './numberAxis/Funnel';\nexport { _Funnel as Funnel };\nimport _FunnelChart from './chart/FunnelChart';\nexport { _FunnelChart as FunnelChart };\nimport _Trapezoid from './shape/Trapezoid';\nexport { _Trapezoid as Trapezoid };", + "var _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Cross\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport { isNumber } from '../util/DataUtils';\nimport { PRESENTATION_ATTRIBUTES, getPresentationAttributes } from '../util/ReactUtils';\n\nvar Cross = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Cross, _Component);\n\n function Cross() {\n _classCallCheck(this, Cross);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Cross).apply(this, arguments));\n }\n\n _createClass(Cross, [{\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n x = _this$props.x,\n y = _this$props.y,\n width = _this$props.width,\n height = _this$props.height,\n top = _this$props.top,\n left = _this$props.left,\n className = _this$props.className;\n\n if (!isNumber(x) || !isNumber(y) || !isNumber(width) || !isNumber(height) || !isNumber(top) || !isNumber(left)) {\n return null;\n }\n\n return React.createElement(\"path\", _extends({}, getPresentationAttributes(this.props), {\n className: classNames('recharts-cross', className),\n d: this.constructor.getPath(x, y, width, height, top, left)\n }));\n }\n }], [{\n key: \"getPath\",\n value: function getPath(x, y, width, height, top, left) {\n return \"M\".concat(x, \",\").concat(top, \"v\").concat(height, \"M\").concat(left, \",\").concat(y, \"h\").concat(width);\n }\n }]);\n\n return Cross;\n}(Component), _class2.displayName = 'Cross', _class2.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, {\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number,\n top: PropTypes.number,\n left: PropTypes.number,\n className: PropTypes.string\n}), _class2.defaultProps = {\n x: 0,\n y: 0,\n top: 0,\n left: 0,\n width: 0,\n height: 0\n}, _temp)) || _class;\n\nexport default Cross;", + "import _isArray from \"lodash/isArray\";\nimport _isFunction from \"lodash/isFunction\";\n\nvar _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Curve\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { line as shapeLine, area as shapeArea, curveBasisClosed, curveBasisOpen, curveBasis, curveLinearClosed, curveLinear, curveMonotoneX, curveMonotoneY, curveNatural, curveStep, curveStepAfter, curveStepBefore } from 'd3-shape';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport { PRESENTATION_ATTRIBUTES, getPresentationAttributes, filterEventAttributes } from '../util/ReactUtils';\nimport { isNumber } from '../util/DataUtils';\nvar CURVE_FACTORIES = {\n curveBasisClosed: curveBasisClosed,\n curveBasisOpen: curveBasisOpen,\n curveBasis: curveBasis,\n curveLinearClosed: curveLinearClosed,\n curveLinear: curveLinear,\n curveMonotoneX: curveMonotoneX,\n curveMonotoneY: curveMonotoneY,\n curveNatural: curveNatural,\n curveStep: curveStep,\n curveStepAfter: curveStepAfter,\n curveStepBefore: curveStepBefore\n};\n\nvar defined = function defined(p) {\n return p.x === +p.x && p.y === +p.y;\n};\n\nvar getX = function getX(p) {\n return p.x;\n};\n\nvar getY = function getY(p) {\n return p.y;\n};\n\nvar getCurveFactory = function getCurveFactory(type, layout) {\n if (_isFunction(type)) {\n return type;\n }\n\n var name = \"curve\".concat(type.slice(0, 1).toUpperCase()).concat(type.slice(1));\n\n if (name === 'curveMonotone' && layout) {\n return CURVE_FACTORIES[\"\".concat(name).concat(layout === 'vertical' ? 'Y' : 'X')];\n }\n\n return CURVE_FACTORIES[name] || curveLinear;\n};\n\nvar Curve = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Curve, _Component);\n\n function Curve() {\n _classCallCheck(this, Curve);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Curve).apply(this, arguments));\n }\n\n _createClass(Curve, [{\n key: \"getPath\",\n\n /**\n * Calculate the path of curve\n * @return {String} path\n */\n value: function getPath() {\n var _this$props = this.props,\n type = _this$props.type,\n points = _this$props.points,\n baseLine = _this$props.baseLine,\n layout = _this$props.layout,\n connectNulls = _this$props.connectNulls;\n var curveFactory = getCurveFactory(type, layout);\n var formatPoints = connectNulls ? points.filter(function (entry) {\n return defined(entry);\n }) : points;\n var lineFunction;\n\n if (_isArray(baseLine)) {\n var formatBaseLine = connectNulls ? baseLine.filter(function (base) {\n return defined(base);\n }) : baseLine;\n var areaPoints = formatPoints.map(function (entry, index) {\n return _objectSpread({}, entry, {\n base: formatBaseLine[index]\n });\n });\n\n if (layout === 'vertical') {\n lineFunction = shapeArea().y(getY).x1(getX).x0(function (d) {\n return d.base.x;\n });\n } else {\n lineFunction = shapeArea().x(getX).y1(getY).y0(function (d) {\n return d.base.y;\n });\n }\n\n lineFunction.defined(defined).curve(curveFactory);\n return lineFunction(areaPoints);\n }\n\n if (layout === 'vertical' && isNumber(baseLine)) {\n lineFunction = shapeArea().y(getY).x1(getX).x0(baseLine);\n } else if (isNumber(baseLine)) {\n lineFunction = shapeArea().x(getX).y1(getY).y0(baseLine);\n } else {\n lineFunction = shapeLine().x(getX).y(getY);\n }\n\n lineFunction.defined(defined).curve(curveFactory);\n return lineFunction(formatPoints);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n className = _this$props2.className,\n points = _this$props2.points,\n path = _this$props2.path,\n pathRef = _this$props2.pathRef;\n\n if ((!points || !points.length) && !path) {\n return null;\n }\n\n var realPath = points && points.length ? this.getPath() : path;\n return React.createElement(\"path\", _extends({}, getPresentationAttributes(this.props), filterEventAttributes(this.props, null, true), {\n className: classNames('recharts-curve', className),\n d: realPath,\n ref: pathRef\n }));\n }\n }]);\n\n return Curve;\n}(Component), _class2.displayName = 'Curve', _class2.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, {\n className: PropTypes.string,\n type: PropTypes.oneOfType([PropTypes.oneOf(['basis', 'basisClosed', 'basisOpen', 'linear', 'linearClosed', 'natural', 'monotoneX', 'monotoneY', 'monotone', 'step', 'stepBefore', 'stepAfter']), PropTypes.func]),\n layout: PropTypes.oneOf(['horizontal', 'vertical']),\n baseLine: PropTypes.oneOfType([PropTypes.number, PropTypes.array]),\n points: PropTypes.arrayOf(PropTypes.object),\n connectNulls: PropTypes.bool,\n path: PropTypes.string,\n pathRef: PropTypes.func\n}), _class2.defaultProps = {\n type: 'linear',\n points: [],\n connectNulls: false\n}, _temp)) || _class;\n\nexport default Curve;", + "var _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Dot\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport { getPresentationAttributes, filterEventAttributes } from '../util/ReactUtils';\n\nvar Dot = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Dot, _Component);\n\n function Dot() {\n _classCallCheck(this, Dot);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Dot).apply(this, arguments));\n }\n\n _createClass(Dot, [{\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n cx = _this$props.cx,\n cy = _this$props.cy,\n r = _this$props.r,\n className = _this$props.className;\n var layerClass = classNames('recharts-dot', className);\n\n if (cx === +cx && cy === +cy && r === +r) {\n return React.createElement(\"circle\", _extends({}, getPresentationAttributes(this.props), filterEventAttributes(this.props, null, true), {\n className: layerClass,\n cx: cx,\n cy: cy,\n r: r\n }));\n }\n\n return null;\n }\n }]);\n\n return Dot;\n}(Component), _class2.displayName = 'Dot', _class2.propTypes = {\n className: PropTypes.string,\n cx: PropTypes.number,\n cy: PropTypes.number,\n r: PropTypes.number\n}, _temp)) || _class;\n\nexport default Dot;", + "var _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Rectangle\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Animate from 'react-smooth';\nimport pureRender from '../util/PureRender';\nimport { PRESENTATION_ATTRIBUTES, EVENT_ATTRIBUTES, getPresentationAttributes, filterEventAttributes } from '../util/ReactUtils';\n\nvar getRectangePath = function getRectangePath(x, y, width, height, radius) {\n var maxRadius = Math.min(Math.abs(width) / 2, Math.abs(height) / 2);\n var ySign = height >= 0 ? 1 : -1;\n var xSign = width >= 0 ? 1 : -1;\n var clockWise = height >= 0 && width >= 0 || height < 0 && width < 0 ? 1 : 0;\n var path;\n\n if (maxRadius > 0 && radius instanceof Array) {\n var newRadius = [];\n\n for (var i = 0, len = 4; i < len; i++) {\n newRadius[i] = radius[i] > maxRadius ? maxRadius : radius[i];\n }\n\n path = \"M\".concat(x, \",\").concat(y + ySign * newRadius[0]);\n\n if (newRadius[0] > 0) {\n path += \"A \".concat(newRadius[0], \",\").concat(newRadius[0], \",0,0,\").concat(clockWise, \",\").concat(x + xSign * newRadius[0], \",\").concat(y);\n }\n\n path += \"L \".concat(x + width - xSign * newRadius[1], \",\").concat(y);\n\n if (newRadius[1] > 0) {\n path += \"A \".concat(newRadius[1], \",\").concat(newRadius[1], \",0,0,\").concat(clockWise, \",\\n \").concat(x + width, \",\").concat(y + ySign * newRadius[1]);\n }\n\n path += \"L \".concat(x + width, \",\").concat(y + height - ySign * newRadius[2]);\n\n if (newRadius[2] > 0) {\n path += \"A \".concat(newRadius[2], \",\").concat(newRadius[2], \",0,0,\").concat(clockWise, \",\\n \").concat(x + width - xSign * newRadius[2], \",\").concat(y + height);\n }\n\n path += \"L \".concat(x + xSign * newRadius[3], \",\").concat(y + height);\n\n if (newRadius[3] > 0) {\n path += \"A \".concat(newRadius[3], \",\").concat(newRadius[3], \",0,0,\").concat(clockWise, \",\\n \").concat(x, \",\").concat(y + height - ySign * newRadius[3]);\n }\n\n path += 'Z';\n } else if (maxRadius > 0 && radius === +radius && radius > 0) {\n var _newRadius = Math.min(maxRadius, radius);\n\n path = \"M \".concat(x, \",\").concat(y + ySign * _newRadius, \"\\n A \").concat(_newRadius, \",\").concat(_newRadius, \",0,0,\").concat(clockWise, \",\").concat(x + xSign * _newRadius, \",\").concat(y, \"\\n L \").concat(x + width - xSign * _newRadius, \",\").concat(y, \"\\n A \").concat(_newRadius, \",\").concat(_newRadius, \",0,0,\").concat(clockWise, \",\").concat(x + width, \",\").concat(y + ySign * _newRadius, \"\\n L \").concat(x + width, \",\").concat(y + height - ySign * _newRadius, \"\\n A \").concat(_newRadius, \",\").concat(_newRadius, \",0,0,\").concat(clockWise, \",\").concat(x + width - xSign * _newRadius, \",\").concat(y + height, \"\\n L \").concat(x + xSign * _newRadius, \",\").concat(y + height, \"\\n A \").concat(_newRadius, \",\").concat(_newRadius, \",0,0,\").concat(clockWise, \",\").concat(x, \",\").concat(y + height - ySign * _newRadius, \" Z\");\n } else {\n path = \"M \".concat(x, \",\").concat(y, \" h \").concat(width, \" v \").concat(height, \" h \").concat(-width, \" Z\");\n }\n\n return path;\n};\n\nvar Rectangle = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Rectangle, _Component);\n\n function Rectangle() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, Rectangle);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Rectangle)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n totalLength: -1\n };\n return _this;\n }\n\n _createClass(Rectangle, [{\n key: \"componentDidMount\",\n\n /* eslint-disable react/no-did-mount-set-state */\n value: function componentDidMount() {\n if (this.node && this.node.getTotalLength) {\n try {\n var totalLength = this.node.getTotalLength();\n\n if (totalLength) {\n this.setState({\n totalLength: totalLength\n });\n }\n } catch (err) {// calculate total length error\n }\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var _this$props = this.props,\n x = _this$props.x,\n y = _this$props.y,\n width = _this$props.width,\n height = _this$props.height,\n radius = _this$props.radius,\n className = _this$props.className;\n var totalLength = this.state.totalLength;\n var _this$props2 = this.props,\n animationEasing = _this$props2.animationEasing,\n animationDuration = _this$props2.animationDuration,\n animationBegin = _this$props2.animationBegin,\n isAnimationActive = _this$props2.isAnimationActive,\n isUpdateAnimationActive = _this$props2.isUpdateAnimationActive;\n\n if (x !== +x || y !== +y || width !== +width || height !== +height || width === 0 || height === 0) {\n return null;\n }\n\n var layerClass = classNames('recharts-rectangle', className);\n\n if (!isUpdateAnimationActive) {\n return React.createElement(\"path\", _extends({}, getPresentationAttributes(this.props), filterEventAttributes(this.props), {\n className: layerClass,\n d: getRectangePath(x, y, width, height, radius)\n }));\n }\n\n return React.createElement(Animate, {\n canBegin: totalLength > 0,\n from: {\n width: width,\n height: height,\n x: x,\n y: y\n },\n to: {\n width: width,\n height: height,\n x: x,\n y: y\n },\n duration: animationDuration,\n animationEasing: animationEasing,\n isActive: isUpdateAnimationActive\n }, function (_ref) {\n var currWidth = _ref.width,\n currHeight = _ref.height,\n currX = _ref.x,\n currY = _ref.y;\n return React.createElement(Animate, {\n canBegin: totalLength > 0,\n from: \"0px \".concat(totalLength === -1 ? 1 : totalLength, \"px\"),\n to: \"\".concat(totalLength, \"px 0px\"),\n attributeName: \"strokeDasharray\",\n begin: animationBegin,\n duration: animationDuration,\n isActive: isAnimationActive,\n easing: animationEasing\n }, React.createElement(\"path\", _extends({}, getPresentationAttributes(_this2.props), filterEventAttributes(_this2.props), {\n className: layerClass,\n d: getRectangePath(currX, currY, currWidth, currHeight, radius),\n ref: function ref(node) {\n _this2.node = node;\n }\n })));\n });\n }\n }]);\n\n return Rectangle;\n}(Component), _class2.displayName = 'Rectangle', _class2.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, EVENT_ATTRIBUTES, {\n className: PropTypes.string,\n x: PropTypes.number,\n y: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number,\n radius: PropTypes.oneOfType([PropTypes.number, PropTypes.array]),\n isAnimationActive: PropTypes.bool,\n isUpdateAnimationActive: PropTypes.bool,\n animationBegin: PropTypes.number,\n animationDuration: PropTypes.number,\n animationEasing: PropTypes.oneOf(['ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear'])\n}), _class2.defaultProps = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n // The radius of border\n // The radius of four corners when radius is a number\n // The radius of left-top, right-top, right-bottom, left-bottom when radius is an array\n radius: 0,\n isAnimationActive: false,\n isUpdateAnimationActive: false,\n animationBegin: 0,\n animationDuration: 1500,\n animationEasing: 'ease'\n}, _temp)) || _class;\n\nexport default Rectangle;", + "var _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Sector\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport { PRESENTATION_ATTRIBUTES, getPresentationAttributes, filterEventAttributes } from '../util/ReactUtils';\nimport { polarToCartesian, RADIAN } from '../util/PolarUtils';\nimport { getPercentValue, mathSign } from '../util/DataUtils';\n\nvar getDeltaAngle = function getDeltaAngle(startAngle, endAngle) {\n var sign = mathSign(endAngle - startAngle);\n var deltaAngle = Math.min(Math.abs(endAngle - startAngle), 359.999);\n return sign * deltaAngle;\n};\n\nvar getTangentCircle = function getTangentCircle(_ref) {\n var cx = _ref.cx,\n cy = _ref.cy,\n radius = _ref.radius,\n angle = _ref.angle,\n sign = _ref.sign,\n isExternal = _ref.isExternal,\n cornerRadius = _ref.cornerRadius;\n var centerRadius = cornerRadius * (isExternal ? 1 : -1) + radius;\n var theta = Math.asin(cornerRadius / centerRadius) / RADIAN;\n var centerAngle = angle + sign * theta;\n var center = polarToCartesian(cx, cy, centerRadius, centerAngle); // The coordinate of point which is tangent to the circle\n\n var circleTangency = polarToCartesian(cx, cy, radius, centerAngle); // The coordinate of point which is tangent to the radius line\n\n var lineTangency = polarToCartesian(cx, cy, centerRadius * Math.cos(theta * RADIAN), angle);\n return {\n center: center,\n circleTangency: circleTangency,\n lineTangency: lineTangency,\n theta: theta\n };\n};\n\nvar getSectorPath = function getSectorPath(_ref2) {\n var cx = _ref2.cx,\n cy = _ref2.cy,\n innerRadius = _ref2.innerRadius,\n outerRadius = _ref2.outerRadius,\n startAngle = _ref2.startAngle,\n endAngle = _ref2.endAngle;\n var angle = getDeltaAngle(startAngle, endAngle); // When the angle of sector equals to 360, star point and end point coincide\n\n var tempEndAngle = startAngle + angle;\n var outerStartPoint = polarToCartesian(cx, cy, outerRadius, startAngle);\n var outerEndPoint = polarToCartesian(cx, cy, outerRadius, tempEndAngle);\n var path = \"M \".concat(outerStartPoint.x, \",\").concat(outerStartPoint.y, \"\\n A \").concat(outerRadius, \",\").concat(outerRadius, \",0,\\n \").concat(+(Math.abs(angle) > 180), \",\").concat(+(startAngle > tempEndAngle), \",\\n \").concat(outerEndPoint.x, \",\").concat(outerEndPoint.y, \"\\n \");\n\n if (innerRadius > 0) {\n var innerStartPoint = polarToCartesian(cx, cy, innerRadius, startAngle);\n var innerEndPoint = polarToCartesian(cx, cy, innerRadius, tempEndAngle);\n path += \"L \".concat(innerEndPoint.x, \",\").concat(innerEndPoint.y, \"\\n A \").concat(innerRadius, \",\").concat(innerRadius, \",0,\\n \").concat(+(Math.abs(angle) > 180), \",\").concat(+(startAngle <= tempEndAngle), \",\\n \").concat(innerStartPoint.x, \",\").concat(innerStartPoint.y, \" Z\");\n } else {\n path += \"L \".concat(cx, \",\").concat(cy, \" Z\");\n }\n\n return path;\n};\n\nvar getSectorWithCorner = function getSectorWithCorner(_ref3) {\n var cx = _ref3.cx,\n cy = _ref3.cy,\n innerRadius = _ref3.innerRadius,\n outerRadius = _ref3.outerRadius,\n cornerRadius = _ref3.cornerRadius,\n startAngle = _ref3.startAngle,\n endAngle = _ref3.endAngle;\n var sign = mathSign(endAngle - startAngle);\n\n var _getTangentCircle = getTangentCircle({\n cx: cx,\n cy: cy,\n radius: outerRadius,\n angle: startAngle,\n sign: sign,\n cornerRadius: cornerRadius\n }),\n soct = _getTangentCircle.circleTangency,\n solt = _getTangentCircle.lineTangency,\n sot = _getTangentCircle.theta;\n\n var _getTangentCircle2 = getTangentCircle({\n cx: cx,\n cy: cy,\n radius: outerRadius,\n angle: endAngle,\n sign: -sign,\n cornerRadius: cornerRadius\n }),\n eoct = _getTangentCircle2.circleTangency,\n eolt = _getTangentCircle2.lineTangency,\n eot = _getTangentCircle2.theta;\n\n var outerArcAngle = Math.abs(startAngle - endAngle) - sot - eot;\n\n if (outerArcAngle < 0) {\n return getSectorPath({\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n }\n\n var path = \"M \".concat(solt.x, \",\").concat(solt.y, \"\\n A\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,\").concat(+(sign < 0), \",\").concat(soct.x, \",\").concat(soct.y, \"\\n A\").concat(outerRadius, \",\").concat(outerRadius, \",0,\").concat(+(outerArcAngle > 180), \",\").concat(+(sign < 0), \",\").concat(eoct.x, \",\").concat(eoct.y, \"\\n A\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,\").concat(+(sign < 0), \",\").concat(eolt.x, \",\").concat(eolt.y, \"\\n \");\n\n if (innerRadius > 0) {\n var _getTangentCircle3 = getTangentCircle({\n cx: cx,\n cy: cy,\n radius: innerRadius,\n angle: startAngle,\n sign: sign,\n isExternal: true,\n cornerRadius: cornerRadius\n }),\n sict = _getTangentCircle3.circleTangency,\n silt = _getTangentCircle3.lineTangency,\n sit = _getTangentCircle3.theta;\n\n var _getTangentCircle4 = getTangentCircle({\n cx: cx,\n cy: cy,\n radius: innerRadius,\n angle: endAngle,\n sign: -sign,\n isExternal: true,\n cornerRadius: cornerRadius\n }),\n eict = _getTangentCircle4.circleTangency,\n eilt = _getTangentCircle4.lineTangency,\n eit = _getTangentCircle4.theta;\n\n var innerArcAngle = Math.abs(startAngle - endAngle) - sit - eit;\n\n if (innerArcAngle < 0) {\n return \"\".concat(path, \"L\").concat(cx, \",\").concat(cy, \"Z\");\n }\n\n path += \"L\".concat(eilt.x, \",\").concat(eilt.y, \"\\n A\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,\").concat(+(sign < 0), \",\").concat(eict.x, \",\").concat(eict.y, \"\\n A\").concat(innerRadius, \",\").concat(innerRadius, \",0,\").concat(+(innerArcAngle > 180), \",\").concat(+(sign > 0), \",\").concat(sict.x, \",\").concat(sict.y, \"\\n A\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,\").concat(+(sign < 0), \",\").concat(silt.x, \",\").concat(silt.y, \"Z\");\n } else {\n path += \"L\".concat(cx, \",\").concat(cy, \"Z\");\n }\n\n return path;\n};\n\nvar Sector = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Sector, _Component);\n\n function Sector() {\n _classCallCheck(this, Sector);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Sector).apply(this, arguments));\n }\n\n _createClass(Sector, [{\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n cx = _this$props.cx,\n cy = _this$props.cy,\n innerRadius = _this$props.innerRadius,\n outerRadius = _this$props.outerRadius,\n cornerRadius = _this$props.cornerRadius,\n startAngle = _this$props.startAngle,\n endAngle = _this$props.endAngle,\n className = _this$props.className;\n\n if (outerRadius < innerRadius || startAngle === endAngle) {\n return null;\n }\n\n var layerClass = classNames('recharts-sector', className);\n var deltaRadius = outerRadius - innerRadius;\n var cr = getPercentValue(cornerRadius, deltaRadius, 0, true);\n var path;\n\n if (cr > 0 && Math.abs(startAngle - endAngle) < 360) {\n path = getSectorWithCorner({\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n cornerRadius: Math.min(cr, deltaRadius / 2),\n startAngle: startAngle,\n endAngle: endAngle\n });\n } else {\n path = getSectorPath({\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n }\n\n return React.createElement(\"path\", _extends({}, getPresentationAttributes(this.props), filterEventAttributes(this.props), {\n className: layerClass,\n d: path\n }));\n }\n }]);\n\n return Sector;\n}(Component), _class2.displayName = 'Sector', _class2.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, {\n className: PropTypes.string,\n cx: PropTypes.number,\n cy: PropTypes.number,\n innerRadius: PropTypes.number,\n outerRadius: PropTypes.number,\n startAngle: PropTypes.number,\n endAngle: PropTypes.number,\n cornerRadius: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n}), _class2.defaultProps = {\n cx: 0,\n cy: 0,\n innerRadius: 0,\n outerRadius: 0,\n startAngle: 0,\n endAngle: 0,\n cornerRadius: 0\n}, _temp)) || _class;\n\nexport default Sector;", + "var _class, _class2, _temp;\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n * @fileOverview Curve\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { symbol as shapeSymbol, symbolCircle, symbolCross, symbolDiamond, symbolSquare, symbolStar, symbolTriangle, symbolWye } from 'd3-shape';\nimport classNames from 'classnames';\nimport pureRender from '../util/PureRender';\nimport { PRESENTATION_ATTRIBUTES, getPresentationAttributes, filterEventAttributes } from '../util/ReactUtils';\nvar SYMBOL_FACTORIES = {\n symbolCircle: symbolCircle,\n symbolCross: symbolCross,\n symbolDiamond: symbolDiamond,\n symbolSquare: symbolSquare,\n symbolStar: symbolStar,\n symbolTriangle: symbolTriangle,\n symbolWye: symbolWye\n};\nvar RADIAN = Math.PI / 180;\n\nvar getSymbolFactory = function getSymbolFactory(type) {\n var name = \"symbol\".concat(type.slice(0, 1).toUpperCase()).concat(type.slice(1));\n return SYMBOL_FACTORIES[name] || symbolCircle;\n};\n\nvar calculateAreaSize = function calculateAreaSize(size, sizeType, type) {\n if (sizeType === 'area') {\n return size;\n }\n\n switch (type) {\n case 'cross':\n return 5 * size * size / 9;\n\n case 'diamond':\n return 0.5 * size * size / Math.sqrt(3);\n\n case 'square':\n return size * size;\n\n case 'star':\n {\n var angle = 18 * RADIAN;\n return 1.25 * size * size * (Math.tan(angle) - Math.tan(angle * 2) * Math.pow(Math.tan(angle), 2));\n }\n\n case 'triangle':\n return Math.sqrt(3) * size * size / 4;\n\n case 'wye':\n return (21 - 10 * Math.sqrt(3)) * size * size / 8;\n\n default:\n return Math.PI * size * size / 4;\n }\n};\n\nvar Symbols = pureRender(_class = (_temp = _class2 =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Symbols, _Component);\n\n function Symbols() {\n _classCallCheck(this, Symbols);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Symbols).apply(this, arguments));\n }\n\n _createClass(Symbols, [{\n key: \"getPath\",\n\n /**\n * Calculate the path of curve\n * @return {String} path\n */\n value: function getPath() {\n var _this$props = this.props,\n size = _this$props.size,\n sizeType = _this$props.sizeType,\n type = _this$props.type;\n var symbolFactory = getSymbolFactory(type);\n var symbol = shapeSymbol().type(symbolFactory).size(calculateAreaSize(size, sizeType, type));\n return symbol();\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n className = _this$props2.className,\n cx = _this$props2.cx,\n cy = _this$props2.cy,\n size = _this$props2.size;\n\n if (cx === +cx && cy === +cy && size === +size) {\n return React.createElement(\"path\", _extends({}, getPresentationAttributes(this.props), filterEventAttributes(this.props), {\n className: classNames('recharts-symbols', className),\n transform: \"translate(\".concat(cx, \", \").concat(cy, \")\"),\n d: this.getPath()\n }));\n }\n\n return null;\n }\n }]);\n\n return Symbols;\n}(Component), _class2.displayName = 'Symbols', _class2.propTypes = _objectSpread({}, PRESENTATION_ATTRIBUTES, {\n className: PropTypes.string,\n type: PropTypes.oneOf(['circle', 'cross', 'diamond', 'square', 'star', 'triangle', 'wye']),\n cx: PropTypes.number,\n cy: PropTypes.number,\n size: PropTypes.number,\n sizeType: PropTypes.oneOf(['area', 'diameter'])\n}), _class2.defaultProps = {\n type: 'circle',\n size: 64,\n sizeType: 'area'\n}, _temp)) || _class;\n\nexport default Symbols;", + "import _every from \"lodash/every\";\nimport _mapValues from \"lodash/mapValues\";\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport { getTicksOfScale, parseScale, checkDomainOfScale, getBandSizeOfAxis } from './ChartUtils';\n/**\n * Calculate the scale function, position, width, height of axes\n * @param {Object} props Latest props\n * @param {Object} axisMap The configuration of axes\n * @param {Object} offset The offset of main part in the svg element\n * @param {String} axisType The type of axes, x-axis or y-axis\n * @param {String} chartName The name of chart\n * @return {Object} Configuration\n */\n\nexport var formatAxisMap = function formatAxisMap(props, axisMap, offset, axisType, chartName) {\n var width = props.width,\n height = props.height,\n layout = props.layout;\n var ids = Object.keys(axisMap);\n var steps = {\n left: offset.left,\n leftMirror: offset.left,\n right: width - offset.right,\n rightMirror: width - offset.right,\n top: offset.top,\n topMirror: offset.top,\n bottom: height - offset.bottom,\n bottomMirror: height - offset.bottom\n };\n return ids.reduce(function (result, id) {\n var axis = axisMap[id];\n var orientation = axis.orientation,\n domain = axis.domain,\n _axis$padding = axis.padding,\n padding = _axis$padding === void 0 ? {} : _axis$padding,\n mirror = axis.mirror,\n reversed = axis.reversed;\n var offsetKey = \"\".concat(orientation).concat(mirror ? 'Mirror' : '');\n var range, x, y, needSpace;\n\n if (axisType === 'xAxis') {\n range = [offset.left + (padding.left || 0), offset.left + offset.width - (padding.right || 0)];\n } else if (axisType === 'yAxis') {\n range = layout === 'horizontal' ? [offset.top + offset.height - (padding.bottom || 0), offset.top + (padding.top || 0)] : [offset.top + (padding.top || 0), offset.top + offset.height - (padding.bottom || 0)];\n } else {\n range = axis.range;\n }\n\n if (reversed) {\n range = [range[1], range[0]];\n }\n\n var _parseScale = parseScale(axis, chartName),\n scale = _parseScale.scale,\n realScaleType = _parseScale.realScaleType;\n\n scale.domain(domain).range(range);\n checkDomainOfScale(scale);\n var ticks = getTicksOfScale(scale, _objectSpread({}, axis, {\n realScaleType: realScaleType\n }));\n\n if (axisType === 'xAxis') {\n needSpace = orientation === 'top' && !mirror || orientation === 'bottom' && mirror;\n x = offset.left;\n y = steps[offsetKey] - needSpace * axis.height;\n } else if (axisType === 'yAxis') {\n needSpace = orientation === 'left' && !mirror || orientation === 'right' && mirror;\n x = steps[offsetKey] - needSpace * axis.width;\n y = offset.top;\n }\n\n var finalAxis = _objectSpread({}, axis, ticks, {\n realScaleType: realScaleType,\n x: x,\n y: y,\n scale: scale,\n width: axisType === 'xAxis' ? offset.width : axis.width,\n height: axisType === 'yAxis' ? offset.height : axis.height\n });\n\n finalAxis.bandSize = getBandSizeOfAxis(finalAxis, ticks);\n\n if (!axis.hide && axisType === 'xAxis') {\n steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.height;\n } else if (!axis.hide) {\n steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.width;\n }\n\n return _objectSpread({}, result, _defineProperty({}, id, finalAxis));\n }, {});\n};\nexport var rectWithPoints = function rectWithPoints(_ref, _ref2) {\n var x1 = _ref.x,\n y1 = _ref.y;\n var x2 = _ref2.x,\n y2 = _ref2.y;\n return {\n x: Math.min(x1, x2),\n y: Math.min(y1, y2),\n width: Math.abs(x2 - x1),\n height: Math.abs(y2 - y1)\n };\n};\n/**\n * Compute the x, y, width, and height of a box from two reference points.\n * @param {Object} coords x1, x2, y1, and y2\n * @return {Object} object\n */\n\nexport var rectWithCoords = function rectWithCoords(_ref3) {\n var x1 = _ref3.x1,\n y1 = _ref3.y1,\n x2 = _ref3.x2,\n y2 = _ref3.y2;\n return rectWithPoints({\n x: x1,\n y: y1\n }, {\n x: x2,\n y: y2\n });\n};\nexport var ScaleHelper =\n/*#__PURE__*/\nfunction () {\n _createClass(ScaleHelper, null, [{\n key: \"create\",\n value: function create(obj) {\n return new ScaleHelper(obj);\n }\n }]);\n\n function ScaleHelper(scale) {\n _classCallCheck(this, ScaleHelper);\n\n this.scale = scale;\n }\n\n _createClass(ScaleHelper, [{\n key: \"apply\",\n value: function apply(value) {\n var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n bandAware = _ref4.bandAware;\n\n if (value === undefined) {\n return undefined;\n }\n\n if (bandAware) {\n var offset = this.bandwidth ? this.bandwidth() / 2 : 0;\n return this.scale(value) + offset;\n }\n\n return this.scale(value);\n }\n }, {\n key: \"isInRange\",\n value: function isInRange(value) {\n var range = this.range();\n var first = range[0];\n var last = range[range.length - 1];\n return first <= last ? value >= first && value <= last : value >= last && value <= first;\n }\n }, {\n key: \"domain\",\n get: function get() {\n return this.scale.domain;\n }\n }, {\n key: \"range\",\n get: function get() {\n return this.scale.range;\n }\n }, {\n key: \"rangeMin\",\n get: function get() {\n return this.range()[0];\n }\n }, {\n key: \"rangeMax\",\n get: function get() {\n return this.range()[1];\n }\n }, {\n key: \"bandwidth\",\n get: function get() {\n return this.scale.bandwidth;\n }\n }]);\n\n return ScaleHelper;\n}();\nScaleHelper.EPS = 1e-4;\nexport var LabeledScaleHelper =\n/*#__PURE__*/\nfunction () {\n _createClass(LabeledScaleHelper, null, [{\n key: \"create\",\n value: function create(obj) {\n return new this(obj);\n }\n }]);\n\n function LabeledScaleHelper(scales) {\n _classCallCheck(this, LabeledScaleHelper);\n\n this.scales = _mapValues(scales, ScaleHelper.create);\n Object.assign(this, this.scales);\n }\n\n _createClass(LabeledScaleHelper, [{\n key: \"apply\",\n value: function apply(coords) {\n var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n bandAware = _ref5.bandAware;\n\n var scales = this.scales;\n return _mapValues(coords, function (value, label) {\n return scales[label].apply(value, {\n bandAware: bandAware\n });\n });\n }\n }, {\n key: \"isInRange\",\n value: function isInRange(coords) {\n var scales = this.scales;\n return _every(coords, function (value, label) {\n return scales[label].isInRange(value);\n });\n }\n }]);\n\n return LabeledScaleHelper;\n}();", + "import _isEqual from \"lodash/isEqual\";\nimport _sortBy from \"lodash/sortBy\";\nimport _isNaN from \"lodash/isNaN\";\nimport _isString from \"lodash/isString\";\nimport _max from \"lodash/max\";\nimport _min from \"lodash/min\";\nimport _isArray from \"lodash/isArray\";\nimport _flatMap from \"lodash/flatMap\";\nimport _isFunction from \"lodash/isFunction\";\nimport _get from \"lodash/get\";\nimport _isNil from \"lodash/isNil\";\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport { getNiceTickValues, getTickValuesFixedDomain } from 'recharts-scale';\nimport * as d3Scales from 'd3-scale';\nimport { stack as shapeStack, stackOrderNone, stackOffsetExpand, stackOffsetNone, stackOffsetSilhouette, stackOffsetWiggle } from 'd3-shape';\nimport { isNumOrStr, uniqueId, isNumber, getPercentValue, mathSign, findEntryInArray } from './DataUtils';\nimport ReferenceDot from '../cartesian/ReferenceDot';\nimport ReferenceLine from '../cartesian/ReferenceLine';\nimport ReferenceArea from '../cartesian/ReferenceArea';\nimport ErrorBar from '../cartesian/ErrorBar';\nimport Legend from '../component/Legend';\nimport { findAllByType, findChildByType, getDisplayName } from './ReactUtils';\nexport var getValueByDataKey = function getValueByDataKey(obj, dataKey, defaultValue) {\n if (_isNil(obj) || _isNil(dataKey)) {\n return defaultValue;\n }\n\n if (isNumOrStr(dataKey)) {\n return _get(obj, dataKey, defaultValue);\n }\n\n if (_isFunction(dataKey)) {\n return dataKey(obj);\n }\n\n return defaultValue;\n};\n/**\n * Get domain of data by key\n * @param {Array} data The data displayed in the chart\n * @param {String} key The unique key of a group of data\n * @param {String} type The type of axis\n * @param {Boolean} filterNil Whether or not filter nil values\n * @return {Array} Domain of data\n */\n\nexport var getDomainOfDataByKey = function getDomainOfDataByKey(data, key, type, filterNil) {\n var flattenData = _flatMap(data, function (entry) {\n return getValueByDataKey(entry, key);\n });\n\n if (type === 'number') {\n var domain = flattenData.filter(function (entry) {\n return isNumber(entry) || parseFloat(entry, 10);\n });\n return [Math.min.apply(null, domain), Math.max.apply(null, domain)];\n }\n\n var validateData = filterNil ? flattenData.filter(function (entry) {\n return !_isNil(entry);\n }) : flattenData;\n return validateData.map(function (entry) {\n return isNumOrStr(entry) ? entry : '';\n });\n};\nexport var calculateActiveTickIndex = function calculateActiveTickIndex(coordinate, ticks, unsortedTicks, axis) {\n var index = -1;\n var len = ticks.length;\n\n if (len > 1) {\n if (axis && axis.axisType === 'angleAxis' && Math.abs(Math.abs(axis.range[1] - axis.range[0]) - 360) <= 1e-6) {\n var range = axis.range; // ticks are distributed in a circle\n\n for (var i = 0; i < len; i++) {\n var before = i > 0 ? unsortedTicks[i - 1].coordinate : unsortedTicks[len - 1].coordinate;\n var cur = unsortedTicks[i].coordinate;\n var after = i >= len - 1 ? unsortedTicks[0].coordinate : unsortedTicks[i + 1].coordinate;\n var sameDirectionCoord = void 0;\n\n if (mathSign(cur - before) !== mathSign(after - cur)) {\n var diffInterval = [];\n\n if (mathSign(after - cur) === mathSign(range[1] - range[0])) {\n sameDirectionCoord = after;\n var curInRange = cur + range[1] - range[0];\n diffInterval[0] = Math.min(curInRange, (curInRange + before) / 2);\n diffInterval[1] = Math.max(curInRange, (curInRange + before) / 2);\n } else {\n sameDirectionCoord = before;\n var afterInRange = after + range[1] - range[0];\n diffInterval[0] = Math.min(cur, (afterInRange + cur) / 2);\n diffInterval[1] = Math.max(cur, (afterInRange + cur) / 2);\n }\n\n var sameInterval = [Math.min(cur, (sameDirectionCoord + cur) / 2), Math.max(cur, (sameDirectionCoord + cur) / 2)];\n\n if (coordinate > sameInterval[0] && coordinate <= sameInterval[1] || coordinate >= diffInterval[0] && coordinate <= diffInterval[1]) {\n index = unsortedTicks[i].index;\n break;\n }\n } else {\n var min = Math.min(before, after);\n var max = Math.max(before, after);\n\n if (coordinate > (min + cur) / 2 && coordinate <= (max + cur) / 2) {\n index = unsortedTicks[i].index;\n break;\n }\n }\n }\n } else {\n // ticks are distributed in a single direction\n for (var _i = 0; _i < len; _i++) {\n if (_i === 0 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i > 0 && _i < len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i === len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2) {\n index = ticks[_i].index;\n break;\n }\n }\n }\n } else {\n index = 0;\n }\n\n return index;\n};\n/**\n * Get the main color of each graphic item\n * @param {ReactElement} item A graphic item\n * @return {String} Color\n */\n\nexport var getMainColorOfGraphicItem = function getMainColorOfGraphicItem(item) {\n var displayName = item.type.displayName;\n var result;\n\n switch (displayName) {\n case 'Line':\n case 'Area':\n case 'Radar':\n result = item.props.stroke;\n break;\n\n default:\n result = item.props.fill;\n break;\n }\n\n return result;\n};\nexport var getLegendProps = function getLegendProps(_ref) {\n var children = _ref.children,\n formatedGraphicalItems = _ref.formatedGraphicalItems,\n legendWidth = _ref.legendWidth,\n legendContent = _ref.legendContent;\n var legendItem = findChildByType(children, Legend);\n\n if (!legendItem) {\n return null;\n }\n\n var legendData;\n\n if (legendItem.props && legendItem.props.payload) {\n legendData = legendItem.props && legendItem.props.payload;\n } else if (legendContent === 'children') {\n legendData = (formatedGraphicalItems || []).reduce(function (result, _ref2) {\n var item = _ref2.item,\n props = _ref2.props;\n var data = props.sectors || props.data || [];\n return result.concat(data.map(function (entry) {\n return {\n type: legendItem.props.iconType || item.props.legendType,\n value: entry.name,\n color: entry.fill,\n payload: entry\n };\n }));\n }, []);\n } else {\n legendData = (formatedGraphicalItems || []).map(function (_ref3) {\n var item = _ref3.item;\n var _item$props = item.props,\n dataKey = _item$props.dataKey,\n name = _item$props.name,\n legendType = _item$props.legendType,\n hide = _item$props.hide;\n return {\n inactive: hide,\n dataKey: dataKey,\n type: legendItem.props.iconType || legendType || 'square',\n color: getMainColorOfGraphicItem(item),\n value: name || dataKey,\n payload: item.props\n };\n });\n }\n\n return _objectSpread({}, legendItem.props, Legend.getWithHeight(legendItem, legendWidth), {\n payload: legendData,\n item: legendItem\n });\n};\n/**\n * Calculate the size of all groups for stacked bar graph\n * @param {Object} stackGroups The items grouped by axisId and stackId\n * @return {Object} The size of all groups\n */\n\nexport var getBarSizeList = function getBarSizeList(_ref4) {\n var globalSize = _ref4.barSize,\n _ref4$stackGroups = _ref4.stackGroups,\n stackGroups = _ref4$stackGroups === void 0 ? {} : _ref4$stackGroups;\n\n if (!stackGroups) {\n return {};\n }\n\n var result = {};\n var numericAxisIds = Object.keys(stackGroups);\n\n for (var i = 0, len = numericAxisIds.length; i < len; i++) {\n var sgs = stackGroups[numericAxisIds[i]].stackGroups;\n var stackIds = Object.keys(sgs);\n\n for (var j = 0, sLen = stackIds.length; j < sLen; j++) {\n var _sgs$stackIds$j = sgs[stackIds[j]],\n items = _sgs$stackIds$j.items,\n cateAxisId = _sgs$stackIds$j.cateAxisId;\n var barItems = items.filter(function (item) {\n return getDisplayName(item.type).indexOf('Bar') >= 0;\n });\n\n if (barItems && barItems.length) {\n var selfSize = barItems[0].props.barSize;\n var cateId = barItems[0].props[cateAxisId];\n\n if (!result[cateId]) {\n result[cateId] = [];\n }\n\n result[cateId].push({\n item: barItems[0],\n stackList: barItems.slice(1),\n barSize: _isNil(selfSize) ? globalSize : selfSize\n });\n }\n }\n }\n\n return result;\n};\n/**\n * Calculate the size of each bar and the gap between two bars\n * @param {Number} bandSize The size of each category\n * @param {sizeList} sizeList The size of all groups\n * @param {maxBarSize} maxBarSize The maximum size of bar\n * @return {Number} The size of each bar and the gap between two bars\n */\n\nexport var getBarPosition = function getBarPosition(_ref5) {\n var barGap = _ref5.barGap,\n barCategoryGap = _ref5.barCategoryGap,\n bandSize = _ref5.bandSize,\n _ref5$sizeList = _ref5.sizeList,\n sizeList = _ref5$sizeList === void 0 ? [] : _ref5$sizeList,\n maxBarSize = _ref5.maxBarSize;\n var len = sizeList.length;\n if (len < 1) return null;\n var realBarGap = getPercentValue(barGap, bandSize, 0, true);\n var result; // whether or not is barSize setted by user\n\n if (sizeList[0].barSize === +sizeList[0].barSize) {\n var useFull = false;\n var fullBarSize = bandSize / len;\n var sum = sizeList.reduce(function (res, entry) {\n return res + entry.barSize || 0;\n }, 0);\n sum += (len - 1) * realBarGap;\n\n if (sum >= bandSize) {\n sum -= (len - 1) * realBarGap;\n realBarGap = 0;\n }\n\n if (sum >= bandSize && fullBarSize > 0) {\n useFull = true;\n fullBarSize *= 0.9;\n sum = len * fullBarSize;\n }\n\n var offset = (bandSize - sum) / 2 >> 0;\n var prev = {\n offset: offset - realBarGap,\n size: 0\n };\n result = sizeList.reduce(function (res, entry) {\n var newRes = _toConsumableArray(res).concat([{\n item: entry.item,\n position: {\n offset: prev.offset + prev.size + realBarGap,\n size: useFull ? fullBarSize : entry.barSize\n }\n }]);\n\n prev = newRes[newRes.length - 1].position;\n\n if (entry.stackList && entry.stackList.length) {\n entry.stackList.forEach(function (item) {\n newRes.push({\n item: item,\n position: prev\n });\n });\n }\n\n return newRes;\n }, []);\n } else {\n var _offset = getPercentValue(barCategoryGap, bandSize, 0, true);\n\n if (bandSize - 2 * _offset - (len - 1) * realBarGap <= 0) {\n realBarGap = 0;\n }\n\n var originalSize = (bandSize - 2 * _offset - (len - 1) * realBarGap) / len;\n\n if (originalSize > 1) {\n originalSize >>= 0;\n }\n\n var size = maxBarSize === +maxBarSize ? Math.min(originalSize, maxBarSize) : originalSize;\n result = sizeList.reduce(function (res, entry, i) {\n var newRes = _toConsumableArray(res).concat([{\n item: entry.item,\n position: {\n offset: _offset + (originalSize + realBarGap) * i + (originalSize - size) / 2,\n size: size\n }\n }]);\n\n if (entry.stackList && entry.stackList.length) {\n entry.stackList.forEach(function (item) {\n newRes.push({\n item: item,\n position: newRes[newRes.length - 1].position\n });\n });\n }\n\n return newRes;\n }, []);\n }\n\n return result;\n};\nexport var appendOffsetOfLegend = function appendOffsetOfLegend(offset, items, props, legendBox) {\n var children = props.children,\n width = props.width,\n height = props.height,\n margin = props.margin;\n var legendWidth = width - (margin.left || 0) - (margin.right || 0);\n var legendHeight = height - (margin.top || 0) - (margin.bottom || 0);\n var legendProps = getLegendProps({\n children: children,\n items: items,\n legendWidth: legendWidth,\n legendHeight: legendHeight\n });\n var newOffset = offset;\n\n if (legendProps) {\n var box = legendBox || {};\n var align = legendProps.align,\n verticalAlign = legendProps.verticalAlign,\n layout = legendProps.layout;\n\n if ((layout === 'vertical' || layout === 'horizontal' && verticalAlign === 'center') && isNumber(offset[align])) {\n newOffset = _objectSpread({}, offset, _defineProperty({}, align, newOffset[align] + (box.width || 0)));\n }\n\n if ((layout === 'horizontal' || layout === 'vertical' && align === 'center') && isNumber(offset[verticalAlign])) {\n newOffset = _objectSpread({}, offset, _defineProperty({}, verticalAlign, newOffset[verticalAlign] + (box.height || 0)));\n }\n }\n\n return newOffset;\n};\nexport var getDomainOfErrorBars = function getDomainOfErrorBars(data, item, dataKey, axisType) {\n var children = item.props.children;\n var errorBars = findAllByType(children, ErrorBar).filter(function (errorBarChild) {\n var direction = errorBarChild.props.direction;\n return _isNil(direction) || _isNil(axisType) ? true : axisType.indexOf(direction) >= 0;\n });\n\n if (errorBars && errorBars.length) {\n var keys = errorBars.map(function (errorBarChild) {\n return errorBarChild.props.dataKey;\n });\n return data.reduce(function (result, entry) {\n var entryValue = getValueByDataKey(entry, dataKey, 0);\n var mainValue = _isArray(entryValue) ? [_min(entryValue), _max(entryValue)] : [entryValue, entryValue];\n var errorDomain = keys.reduce(function (prevErrorArr, k) {\n var errorValue = getValueByDataKey(entry, k, 0);\n var lowerValue = mainValue[0] - Math.abs(_isArray(errorValue) ? errorValue[0] : errorValue);\n var upperValue = mainValue[1] + Math.abs(_isArray(errorValue) ? errorValue[1] : errorValue);\n return [Math.min(lowerValue, prevErrorArr[0]), Math.max(upperValue, prevErrorArr[1])];\n }, [Infinity, -Infinity]);\n return [Math.min(errorDomain[0], result[0]), Math.max(errorDomain[1], result[1])];\n }, [Infinity, -Infinity]);\n }\n\n return null;\n};\nexport var parseErrorBarsOfAxis = function parseErrorBarsOfAxis(data, items, dataKey, axisType) {\n var domains = items.map(function (item) {\n return getDomainOfErrorBars(data, item, dataKey, axisType);\n }).filter(function (entry) {\n return !_isNil(entry);\n });\n\n if (domains && domains.length) {\n return domains.reduce(function (result, entry) {\n return [Math.min(result[0], entry[0]), Math.max(result[1], entry[1])];\n }, [Infinity, -Infinity]);\n }\n\n return null;\n};\n/**\n * Get domain of data by the configuration of item element\n * @param {Array} data The data displayed in the chart\n * @param {Array} items The instances of item\n * @param {String} type The type of axis, number - Number Axis, category - Category Axis\n * @param {Boolean} filterNil Whether or not filter nil values\n * @return {Array} Domain\n */\n\nexport var getDomainOfItemsWithSameAxis = function getDomainOfItemsWithSameAxis(data, items, type, filterNil) {\n var domains = items.map(function (item) {\n var dataKey = item.props.dataKey;\n\n if (type === 'number' && dataKey) {\n return getDomainOfErrorBars(data, item, dataKey) || getDomainOfDataByKey(data, dataKey, type, filterNil);\n }\n\n return getDomainOfDataByKey(data, dataKey, type, filterNil);\n });\n\n if (type === 'number') {\n // Calculate the domain of number axis\n return domains.reduce(function (result, entry) {\n return [Math.min(result[0], entry[0]), Math.max(result[1], entry[1])];\n }, [Infinity, -Infinity]);\n }\n\n var tag = {}; // Get the union set of category axis\n\n return domains.reduce(function (result, entry) {\n for (var i = 0, len = entry.length; i < len; i++) {\n if (!tag[entry[i]]) {\n tag[entry[i]] = true;\n result.push(entry[i]);\n }\n }\n\n return result;\n }, []);\n};\nexport var isCategorialAxis = function isCategorialAxis(layout, axisType) {\n return layout === 'horizontal' && axisType === 'xAxis' || layout === 'vertical' && axisType === 'yAxis' || layout === 'centric' && axisType === 'angleAxis' || layout === 'radial' && axisType === 'radiusAxis';\n};\n/**\n * Calculate the Coordinates of grid\n * @param {Array} ticks The ticks in axis\n * @param {Number} min The minimun value of axis\n * @param {Number} max The maximun value of axis\n * @return {Array} Coordinates\n */\n\nexport var getCoordinatesOfGrid = function getCoordinatesOfGrid(ticks, min, max) {\n var hasMin, hasMax;\n var values = ticks.map(function (entry) {\n if (entry.coordinate === min) {\n hasMin = true;\n }\n\n if (entry.coordinate === max) {\n hasMax = true;\n }\n\n return entry.coordinate;\n });\n\n if (!hasMin) {\n values.push(min);\n }\n\n if (!hasMax) {\n values.push(max);\n }\n\n return values;\n};\n/**\n * Get the ticks of an axis\n * @param {Object} axis The configuration of an axis\n * @param {Boolean} isGrid Whether or not are the ticks in grid\n * @param {Boolean} isAll Return the ticks of all the points or not\n * @return {Array} Ticks\n */\n\nexport var getTicksOfAxis = function getTicksOfAxis(axis, isGrid, isAll) {\n if (!axis) return null;\n var scale = axis.scale;\n var duplicateDomain = axis.duplicateDomain,\n type = axis.type,\n range = axis.range;\n var offset = (isGrid || isAll) && type === 'category' && scale.bandwidth ? scale.bandwidth() / 2 : 0;\n offset = axis.axisType === 'angleAxis' ? mathSign(range[0] - range[1]) * 2 * offset : offset; // The ticks setted by user should only affect the ticks adjacent to axis line\n\n if (isGrid && (axis.ticks || axis.niceTicks)) {\n return (axis.ticks || axis.niceTicks).map(function (entry) {\n var scaleContent = duplicateDomain ? duplicateDomain.indexOf(entry) : entry;\n return {\n coordinate: scale(scaleContent) + offset,\n value: entry,\n offset: offset\n };\n });\n }\n\n if (axis.isCategorial && axis.categoricalDomain) {\n return axis.categoricalDomain.map(function (entry, index) {\n return {\n coordinate: scale(entry),\n value: entry,\n index: index,\n offset: offset\n };\n });\n }\n\n if (scale.ticks && !isAll) {\n return scale.ticks(axis.tickCount).map(function (entry) {\n return {\n coordinate: scale(entry) + offset,\n value: entry,\n offset: offset\n };\n });\n } // When axis has duplicated text, serial numbers are used to generate scale\n\n\n return scale.domain().map(function (entry, index) {\n return {\n coordinate: scale(entry) + offset,\n value: duplicateDomain ? duplicateDomain[entry] : entry,\n index: index,\n offset: offset\n };\n });\n};\n/**\n * combine the handlers\n * @param {Function} defaultHandler Internal private handler\n * @param {Function} parentHandler Handler function specified in parent component\n * @param {Function} childHandler Handler function specified in child component\n * @return {Function} The combined handler\n */\n\nexport var combineEventHandlers = function combineEventHandlers(defaultHandler, parentHandler, childHandler) {\n var customizedHandler;\n\n if (_isFunction(childHandler)) {\n customizedHandler = childHandler;\n } else if (_isFunction(parentHandler)) {\n customizedHandler = parentHandler;\n }\n\n if (_isFunction(defaultHandler) || customizedHandler) {\n return function (arg1, arg2, arg3, arg4) {\n if (_isFunction(defaultHandler)) {\n defaultHandler(arg1, arg2, arg3, arg4);\n }\n\n if (_isFunction(customizedHandler)) {\n customizedHandler(arg1, arg2, arg3, arg4);\n }\n };\n }\n\n return null;\n};\n/**\n * Parse the scale function of axis\n * @param {Object} axis The option of axis\n * @param {String} chartType The displayName of chart\n * @return {Function} The scale funcion\n */\n\nexport var parseScale = function parseScale(axis, chartType) {\n var scale = axis.scale,\n type = axis.type,\n layout = axis.layout,\n axisType = axis.axisType;\n\n if (scale === 'auto') {\n if (layout === 'radial' && axisType === 'radiusAxis') {\n return {\n scale: d3Scales.scaleBand(),\n realScaleType: 'band'\n };\n }\n\n if (layout === 'radial' && axisType === 'angleAxis') {\n return {\n scale: d3Scales.scaleLinear(),\n realScaleType: 'linear'\n };\n }\n\n if (type === 'category' && chartType && (chartType.indexOf('LineChart') >= 0 || chartType.indexOf('AreaChart') >= 0)) {\n return {\n scale: d3Scales.scalePoint(),\n realScaleType: 'point'\n };\n }\n\n if (type === 'category') {\n return {\n scale: d3Scales.scaleBand(),\n realScaleType: 'band'\n };\n }\n\n return {\n scale: d3Scales.scaleLinear(),\n realScaleType: 'linear'\n };\n }\n\n if (_isString(scale)) {\n var name = \"scale\".concat(scale.slice(0, 1).toUpperCase()).concat(scale.slice(1));\n return {\n scale: (d3Scales[name] || d3Scales.scalePoint)(),\n realScaleType: d3Scales[name] ? name : 'point'\n };\n }\n\n return _isFunction(scale) ? {\n scale: scale\n } : {\n scale: d3Scales.scalePoint(),\n realScaleType: 'point'\n };\n};\nvar EPS = 1e-4;\nexport var checkDomainOfScale = function checkDomainOfScale(scale) {\n var domain = scale.domain();\n\n if (!domain || domain.length <= 2) {\n return;\n }\n\n var len = domain.length;\n var range = scale.range();\n var min = Math.min(range[0], range[1]) - EPS;\n var max = Math.max(range[0], range[1]) + EPS;\n var first = scale(domain[0]);\n var last = scale(domain[len - 1]);\n\n if (first < min || first > max || last < min || last > max) {\n scale.domain([domain[0], domain[len - 1]]);\n }\n};\nexport var findPositionOfBar = function findPositionOfBar(barPosition, child) {\n if (!barPosition) {\n return null;\n }\n\n for (var i = 0, len = barPosition.length; i < len; i++) {\n if (barPosition[i].item === child) {\n return barPosition[i].position;\n }\n }\n\n return null;\n};\nexport var truncateByDomain = function truncateByDomain(value, domain) {\n if (!domain || domain.length !== 2 || !isNumber(domain[0]) || !isNumber(domain[1])) {\n return value;\n }\n\n var min = Math.min(domain[0], domain[1]);\n var max = Math.max(domain[0], domain[1]);\n var result = [value[0], value[1]];\n\n if (!isNumber(value[0]) || value[0] < min) {\n result[0] = min;\n }\n\n if (!isNumber(value[1]) || value[1] > max) {\n result[1] = max;\n }\n\n if (result[0] > max) {\n result[0] = max;\n }\n\n if (result[1] < min) {\n result[1] = min;\n }\n\n return result;\n};\n/* eslint no-param-reassign: 0 */\n\nexport var offsetSign = function offsetSign(series) {\n var n = series.length;\n\n if (n <= 0) {\n return;\n }\n\n for (var j = 0, m = series[0].length; j < m; ++j) {\n var positive = 0;\n var negative = 0;\n\n for (var i = 0; i < n; ++i) {\n var value = _isNaN(series[i][j][1]) ? series[i][j][0] : series[i][j][1];\n /* eslint-disable prefer-destructuring */\n\n if (value >= 0) {\n series[i][j][0] = positive;\n series[i][j][1] = positive + value;\n positive = series[i][j][1];\n } else {\n series[i][j][0] = negative;\n series[i][j][1] = negative + value;\n negative = series[i][j][1];\n }\n /* eslint-enable prefer-destructuring */\n\n }\n }\n};\nvar STACK_OFFSET_MAP = {\n sign: offsetSign,\n expand: stackOffsetExpand,\n none: stackOffsetNone,\n silhouette: stackOffsetSilhouette,\n wiggle: stackOffsetWiggle\n};\nexport var getStackedData = function getStackedData(data, stackItems, offsetType) {\n var dataKeys = stackItems.map(function (item) {\n return item.props.dataKey;\n });\n var stack = shapeStack().keys(dataKeys).value(function (d, key) {\n return +getValueByDataKey(d, key, 0);\n }).order(stackOrderNone).offset(STACK_OFFSET_MAP[offsetType]);\n return stack(data);\n};\nexport var getStackGroupsByAxisId = function getStackGroupsByAxisId(data, _items, numericAxisId, cateAxisId, offsetType, reverseStackOrder) {\n if (!data) {\n return null;\n } // reversing items to affect render order (for layering)\n\n\n var items = reverseStackOrder ? _items.reverse() : _items;\n var stackGroups = items.reduce(function (result, item) {\n var _item$props2 = item.props,\n stackId = _item$props2.stackId,\n hide = _item$props2.hide;\n\n if (hide) {\n return result;\n }\n\n var axisId = item.props[numericAxisId];\n var parentGroup = result[axisId] || {\n hasStack: false,\n stackGroups: {}\n };\n\n if (isNumOrStr(stackId)) {\n var childGroup = parentGroup.stackGroups[stackId] || {\n numericAxisId: numericAxisId,\n cateAxisId: cateAxisId,\n items: []\n };\n childGroup.items.push(item);\n parentGroup.hasStack = true;\n parentGroup.stackGroups[stackId] = childGroup;\n } else {\n parentGroup.stackGroups[uniqueId('_stackId_')] = {\n numericAxisId: numericAxisId,\n cateAxisId: cateAxisId,\n items: [item]\n };\n }\n\n return _objectSpread({}, result, _defineProperty({}, axisId, parentGroup));\n }, {});\n return Object.keys(stackGroups).reduce(function (result, axisId) {\n var group = stackGroups[axisId];\n\n if (group.hasStack) {\n group.stackGroups = Object.keys(group.stackGroups).reduce(function (res, stackId) {\n var g = group.stackGroups[stackId];\n return _objectSpread({}, res, _defineProperty({}, stackId, {\n numericAxisId: numericAxisId,\n cateAxisId: cateAxisId,\n items: g.items,\n stackedData: getStackedData(data, g.items, offsetType)\n }));\n }, {});\n }\n\n return _objectSpread({}, result, _defineProperty({}, axisId, group));\n }, {});\n};\n/**\n * get domain of ticks\n * @param {Array} ticks Ticks of axis\n * @param {String} type The type of axis\n * @return {Array} domain\n */\n\nexport var calculateDomainOfTicks = function calculateDomainOfTicks(ticks, type) {\n if (type === 'number') {\n return [Math.min.apply(null, ticks), Math.max.apply(null, ticks)];\n }\n\n return ticks;\n};\n/**\n * Configure the scale function of axis\n * @param {Object} scale The scale function\n * @param {Object} opts The configuration of axis\n * @return {Object} null\n */\n\nexport var getTicksOfScale = function getTicksOfScale(scale, opts) {\n var realScaleType = opts.realScaleType,\n type = opts.type,\n tickCount = opts.tickCount,\n originalDomain = opts.originalDomain,\n allowDecimals = opts.allowDecimals;\n var scaleType = realScaleType || opts.scale;\n\n if (scaleType !== 'auto' && scaleType !== 'linear') {\n return null;\n }\n\n if (tickCount && type === 'number' && originalDomain && (originalDomain[0] === 'auto' || originalDomain[1] === 'auto')) {\n // Calculate the ticks by the number of grid when the axis is a number axis\n var domain = scale.domain();\n var tickValues = getNiceTickValues(domain, tickCount, allowDecimals);\n scale.domain(calculateDomainOfTicks(tickValues, type));\n return {\n niceTicks: tickValues\n };\n }\n\n if (tickCount && type === 'number') {\n var _domain = scale.domain();\n\n var _tickValues = getTickValuesFixedDomain(_domain, tickCount, allowDecimals);\n\n return {\n niceTicks: _tickValues\n };\n }\n\n return null;\n};\nexport var getCateCoordinateOfLine = function getCateCoordinateOfLine(_ref6) {\n var axis = _ref6.axis,\n ticks = _ref6.ticks,\n bandSize = _ref6.bandSize,\n entry = _ref6.entry,\n index = _ref6.index,\n dataKey = _ref6.dataKey;\n\n if (axis.type === 'category') {\n // find coordinate of category axis by the value of category\n if (!axis.allowDuplicatedCategory && axis.dataKey && !_isNil(entry[axis.dataKey])) {\n var matchedTick = findEntryInArray(ticks, 'value', entry[axis.dataKey]);\n\n if (matchedTick) {\n return matchedTick.coordinate + bandSize / 2;\n }\n }\n\n return ticks[index] ? ticks[index].coordinate + bandSize / 2 : null;\n }\n\n var value = getValueByDataKey(entry, !_isNil(dataKey) ? dataKey : axis.dataKey);\n return !_isNil(value) ? axis.scale(value) : null;\n};\nexport var getCateCoordinateOfBar = function getCateCoordinateOfBar(_ref7) {\n var axis = _ref7.axis,\n ticks = _ref7.ticks,\n offset = _ref7.offset,\n bandSize = _ref7.bandSize,\n entry = _ref7.entry,\n index = _ref7.index;\n\n if (axis.type === 'category') {\n return ticks[index] ? ticks[index].coordinate + offset : null;\n }\n\n var value = getValueByDataKey(entry, axis.dataKey, axis.domain[index]);\n return !_isNil(value) ? axis.scale(value) - bandSize / 2 + offset : null;\n};\nexport var getBaseValueOfBar = function getBaseValueOfBar(_ref8) {\n var numericAxis = _ref8.numericAxis;\n var domain = numericAxis.scale.domain();\n\n if (numericAxis.type === 'number') {\n var min = Math.min(domain[0], domain[1]);\n var max = Math.max(domain[0], domain[1]);\n\n if (min <= 0 && max >= 0) {\n return 0;\n }\n\n if (max < 0) {\n return max;\n }\n\n return min;\n }\n\n return domain[0];\n};\nexport var ifOverflowMatches = function ifOverflowMatches(props, value) {\n var alwaysShow = props.alwaysShow;\n var ifOverflow = props.ifOverflow;\n\n if (alwaysShow) {\n ifOverflow = 'extendDomain';\n }\n\n return ifOverflow === value;\n};\nexport var detectReferenceElementsDomain = function detectReferenceElementsDomain(children, domain, axisId, axisType, specifiedTicks) {\n var lines = findAllByType(children, ReferenceLine);\n var dots = findAllByType(children, ReferenceDot);\n var elements = lines.concat(dots);\n var areas = findAllByType(children, ReferenceArea);\n var idKey = \"\".concat(axisType, \"Id\");\n var valueKey = axisType[0];\n var finalDomain = domain;\n\n if (elements.length) {\n finalDomain = elements.reduce(function (result, el) {\n if (el.props[idKey] === axisId && ifOverflowMatches(el.props, 'extendDomain') && isNumber(el.props[valueKey])) {\n var value = el.props[valueKey];\n return [Math.min(result[0], value), Math.max(result[1], value)];\n }\n\n return result;\n }, finalDomain);\n }\n\n if (areas.length) {\n var key1 = \"\".concat(valueKey, \"1\");\n var key2 = \"\".concat(valueKey, \"2\");\n finalDomain = areas.reduce(function (result, el) {\n if (el.props[idKey] === axisId && ifOverflowMatches(el.props, 'extendDomain') && isNumber(el.props[key1]) && isNumber(el.props[key2])) {\n var value1 = el.props[key1];\n var value2 = el.props[key2];\n return [Math.min(result[0], value1, value2), Math.max(result[1], value1, value2)];\n }\n\n return result;\n }, finalDomain);\n }\n\n if (specifiedTicks && specifiedTicks.length) {\n finalDomain = specifiedTicks.reduce(function (result, tick) {\n if (isNumber(tick)) {\n return [Math.min(result[0], tick), Math.max(result[1], tick)];\n }\n\n return result;\n }, finalDomain);\n }\n\n return finalDomain;\n};\nexport var getStackedDataOfItem = function getStackedDataOfItem(item, stackGroups) {\n var stackId = item.props.stackId;\n\n if (isNumOrStr(stackId)) {\n var group = stackGroups[stackId];\n\n if (group && group.items.length) {\n var itemIndex = -1;\n\n for (var i = 0, len = group.items.length; i < len; i++) {\n if (group.items[i] === item) {\n itemIndex = i;\n break;\n }\n }\n\n return itemIndex >= 0 ? group.stackedData[itemIndex] : null;\n }\n }\n\n return null;\n};\n\nvar getDomainOfSingle = function getDomainOfSingle(data) {\n return data.reduce(function (result, entry) {\n return [Math.min.apply(null, entry.concat([result[0]]).filter(isNumber)), Math.max.apply(null, entry.concat([result[1]]).filter(isNumber))];\n }, [Infinity, -Infinity]);\n};\n\nexport var getDomainOfStackGroups = function getDomainOfStackGroups(stackGroups, startIndex, endIndex) {\n return Object.keys(stackGroups).reduce(function (result, stackId) {\n var group = stackGroups[stackId];\n var stackedData = group.stackedData;\n var domain = stackedData.reduce(function (res, entry) {\n var s = getDomainOfSingle(entry.slice(startIndex, endIndex + 1));\n return [Math.min(res[0], s[0]), Math.max(res[1], s[1])];\n }, [Infinity, -Infinity]);\n return [Math.min(domain[0], result[0]), Math.max(domain[1], result[1])];\n }, [Infinity, -Infinity]).map(function (result) {\n return result === Infinity || result === -Infinity ? 0 : result;\n });\n};\nexport var MIN_VALUE_REG = /^dataMin[\\s]*-[\\s]*([0-9]+([.]{1}[0-9]+){0,1})$/;\nexport var MAX_VALUE_REG = /^dataMax[\\s]*\\+[\\s]*([0-9]+([.]{1}[0-9]+){0,1})$/;\nexport var parseSpecifiedDomain = function parseSpecifiedDomain(specifiedDomain, dataDomain, allowDataOverflow) {\n if (!_isArray(specifiedDomain)) {\n return dataDomain;\n }\n\n var domain = [];\n /* eslint-disable prefer-destructuring */\n\n if (isNumber(specifiedDomain[0])) {\n domain[0] = allowDataOverflow ? specifiedDomain[0] : Math.min(specifiedDomain[0], dataDomain[0]);\n } else if (MIN_VALUE_REG.test(specifiedDomain[0])) {\n var value = +MIN_VALUE_REG.exec(specifiedDomain[0])[1];\n domain[0] = dataDomain[0] - value;\n } else if (_isFunction(specifiedDomain[0])) {\n domain[0] = specifiedDomain[0](dataDomain[0]);\n } else {\n domain[0] = dataDomain[0];\n }\n\n if (isNumber(specifiedDomain[1])) {\n domain[1] = allowDataOverflow ? specifiedDomain[1] : Math.max(specifiedDomain[1], dataDomain[1]);\n } else if (MAX_VALUE_REG.test(specifiedDomain[1])) {\n var _value = +MAX_VALUE_REG.exec(specifiedDomain[1])[1];\n\n domain[1] = dataDomain[1] + _value;\n } else if (_isFunction(specifiedDomain[1])) {\n domain[1] = specifiedDomain[1](dataDomain[1]);\n } else {\n domain[1] = dataDomain[1];\n }\n /* eslint-enable prefer-destructuring */\n\n\n return domain;\n};\n/**\n * Calculate the size between two category\n * @param {Object} axis The options of axis\n * @param {Array} ticks The ticks of axis\n * @return {Number} Size\n */\n\nexport var getBandSizeOfAxis = function getBandSizeOfAxis(axis, ticks) {\n if (axis && axis.scale && axis.scale.bandwidth) {\n return axis.scale.bandwidth();\n }\n\n if (axis && ticks && ticks.length >= 2) {\n var orderedTicks = _sortBy(ticks, function (o) {\n return o.coordinate;\n });\n\n var bandSize = Infinity;\n\n for (var i = 1, len = orderedTicks.length; i < len; i++) {\n var cur = orderedTicks[i];\n var prev = orderedTicks[i - 1];\n bandSize = Math.min((cur.coordinate || 0) - (prev.coordinate || 0), bandSize);\n }\n\n return bandSize === Infinity ? 0 : bandSize;\n }\n\n return 0;\n};\n/**\n * parse the domain of a category axis when a domain is specified\n * @param {Array} specifiedDomain The domain specified by users\n * @param {Array} calculatedDomain The domain calculated by dateKey\n * @param {ReactElement} axisChild The axis element\n * @returns {Array} domains\n */\n\nexport var parseDomainOfCategoryAxis = function parseDomainOfCategoryAxis(specifiedDomain, calculatedDomain, axisChild) {\n if (!specifiedDomain || !specifiedDomain.length) {\n return calculatedDomain;\n }\n\n if (_isEqual(specifiedDomain, _get(axisChild, 'type.defaultProps.domain'))) {\n return calculatedDomain;\n }\n\n return specifiedDomain;\n};", + "function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nimport { isSsr } from './ReactUtils';\nvar stringCache = {\n widthCache: {},\n cacheCount: 0\n};\nvar MAX_CACHE_NUM = 2000;\nvar SPAN_STYLE = {\n position: 'absolute',\n top: '-20000px',\n left: 0,\n padding: 0,\n margin: 0,\n border: 'none',\n whiteSpace: 'pre'\n};\nvar STYLE_LIST = ['minWidth', 'maxWidth', 'width', 'minHeight', 'maxHeight', 'height', 'top', 'left', 'fontSize', 'lineHeight', 'padding', 'margin', 'paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom'];\nvar MEASUREMENT_SPAN_ID = 'recharts_measurement_span';\n\nfunction autoCompleteStyle(name, value) {\n if (STYLE_LIST.indexOf(name) >= 0 && value === +value) {\n return \"\".concat(value, \"px\");\n }\n\n return value;\n}\n\nfunction camelToMiddleLine(text) {\n var strs = text.split('');\n var formatStrs = strs.reduce(function (result, entry) {\n if (entry === entry.toUpperCase()) {\n return _toConsumableArray(result).concat(['-', entry.toLowerCase()]);\n }\n\n return _toConsumableArray(result).concat([entry]);\n }, []);\n return formatStrs.join('');\n}\n\nexport var getStyleString = function getStyleString(style) {\n return Object.keys(style).reduce(function (result, s) {\n return \"\".concat(result).concat(camelToMiddleLine(s), \":\").concat(autoCompleteStyle(s, style[s]), \";\");\n }, '');\n};\nexport var getStringSize = function getStringSize(text) {\n var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (text === undefined || text === null || isSsr()) {\n return {\n width: 0,\n height: 0\n };\n }\n\n var str = \"\".concat(text);\n var styleString = getStyleString(style);\n var cacheKey = \"\".concat(str, \"-\").concat(styleString);\n\n if (stringCache.widthCache[cacheKey]) {\n return stringCache.widthCache[cacheKey];\n }\n\n try {\n var measurementSpan = document.getElementById(MEASUREMENT_SPAN_ID);\n\n if (!measurementSpan) {\n measurementSpan = document.createElement('span');\n measurementSpan.setAttribute('id', MEASUREMENT_SPAN_ID);\n document.body.appendChild(measurementSpan);\n } // Need to use CSS Object Model (CSSOM) to be able to comply with Content Security Policy (CSP)\n // https://en.wikipedia.org/wiki/Content_Security_Policy\n\n\n var measurementSpanStyle = _objectSpread({}, SPAN_STYLE, style);\n\n Object.keys(measurementSpanStyle).map(function (styleKey) {\n measurementSpan.style[styleKey] = measurementSpanStyle[styleKey];\n return styleKey;\n });\n measurementSpan.textContent = str;\n var rect = measurementSpan.getBoundingClientRect();\n var result = {\n width: rect.width,\n height: rect.height\n };\n stringCache.widthCache[cacheKey] = result;\n\n if (++stringCache.cacheCount > MAX_CACHE_NUM) {\n stringCache.cacheCount = 0;\n stringCache.widthCache = {};\n }\n\n return result;\n } catch (e) {\n return {\n width: 0,\n height: 0\n };\n }\n};\nexport var getOffset = function getOffset(el) {\n var html = el.ownerDocument.documentElement;\n var box = {\n top: 0,\n left: 0\n }; // If we don't have gBCR, just use 0,0 rather than error\n // BlackBerry 5, iOS 3 (original iPhone)\n\n if (typeof el.getBoundingClientRect !== 'undefined') {\n box = el.getBoundingClientRect();\n }\n\n return {\n top: box.top + window.pageYOffset - html.clientTop,\n left: box.left + window.pageXOffset - html.clientLeft\n };\n};\n/**\n * Calculate coordinate of cursor in chart\n * @param {Object} event Event object\n * @param {Object} offset The offset of main part in the svg element\n * @return {Object} {chartX, chartY}\n */\n\nexport var calculateChartCoordinate = function calculateChartCoordinate(event, offset) {\n return {\n chartX: Math.round(event.pageX - offset.left),\n chartY: Math.round(event.pageY - offset.top)\n };\n};", + "import _get from \"lodash/get\";\nimport _isArray from \"lodash/isArray\";\nimport _isNaN from \"lodash/isNaN\";\nimport _isNumber from \"lodash/isNumber\";\nimport _isString from \"lodash/isString\";\nexport var mathSign = function mathSign(value) {\n if (value === 0) {\n return 0;\n }\n\n if (value > 0) {\n return 1;\n }\n\n return -1;\n};\nexport var isPercent = function isPercent(value) {\n return _isString(value) && value.indexOf('%') === value.length - 1;\n};\nexport var isNumber = function isNumber(value) {\n return _isNumber(value) && !_isNaN(value);\n};\nexport var isNumOrStr = function isNumOrStr(value) {\n return isNumber(value) || _isString(value);\n};\nvar idCounter = 0;\nexport var uniqueId = function uniqueId(prefix) {\n var id = ++idCounter;\n return \"\".concat(prefix || '').concat(id);\n};\n/**\n * Get percent value of a total value\n * @param {Number|String} percent A percent\n * @param {Number} totalValue Total value\n * @param {NUmber} defaultValue The value returned when percent is undefined or invalid\n * @param {Boolean} validate If set to be true, the result will be validated\n * @return {Number} value\n */\n\nexport var getPercentValue = function getPercentValue(percent, totalValue) {\n var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var validate = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (!isNumber(percent) && !_isString(percent)) {\n return defaultValue;\n }\n\n var value;\n\n if (isPercent(percent)) {\n var index = percent.indexOf('%');\n value = totalValue * parseFloat(percent.slice(0, index)) / 100;\n } else {\n value = +percent;\n }\n\n if (_isNaN(value)) {\n value = defaultValue;\n }\n\n if (validate && value > totalValue) {\n value = totalValue;\n }\n\n return value;\n};\nexport var getAnyElementOfObject = function getAnyElementOfObject(obj) {\n if (!obj) {\n return null;\n }\n\n var keys = Object.keys(obj);\n\n if (keys && keys.length) {\n return obj[keys[0]];\n }\n\n return null;\n};\nexport var hasDuplicate = function hasDuplicate(ary) {\n if (!_isArray(ary)) {\n return false;\n }\n\n var len = ary.length;\n var cache = {};\n\n for (var i = 0; i < len; i++) {\n if (!cache[ary[i]]) {\n cache[ary[i]] = true;\n } else {\n return true;\n }\n }\n\n return false;\n};\nexport var interpolateNumber = function interpolateNumber(numberA, numberB) {\n if (isNumber(numberA) && isNumber(numberB)) {\n return function (t) {\n return numberA + t * (numberB - numberA);\n };\n }\n\n return function () {\n return numberB;\n };\n};\nexport var findEntryInArray = function findEntryInArray(ary, specifiedKey, specifiedValue) {\n if (!ary || !ary.length) {\n return null;\n }\n\n return ary.find(function (entry) {\n return entry && _get(entry, specifiedKey) === specifiedValue;\n });\n};\n/**\n * The least square linear regression\n * @param {Array} data The array of points\n * @returns {Object} The domain of x, and the parameter of linear function\n */\n\nexport var getLinearRegression = function getLinearRegression(data) {\n if (!data || !data.length) {\n return null;\n }\n\n var len = data.length;\n var xsum = 0;\n var ysum = 0;\n var xysum = 0;\n var xxsum = 0;\n var xmin = Infinity;\n var xmax = -Infinity;\n\n for (var i = 0; i < len; i++) {\n xsum += data[i].cx;\n ysum += data[i].cy;\n xysum += data[i].cx * data[i].cy;\n xxsum += data[i].cx * data[i].cx;\n xmin = Math.min(xmin, data[i].cx);\n xmax = Math.max(xmax, data[i].cx);\n }\n\n var a = len * xxsum !== xsum * xsum ? (len * xysum - xsum * ysum) / (len * xxsum - xsum * xsum) : 0;\n return {\n xmin: xmin,\n xmax: xmax,\n a: a,\n b: (ysum - a * xsum) / len\n };\n};", + "/* eslint no-console: 0 */\nvar isDev = process.env.NODE_ENV !== 'production';\nexport var warn = function warn(condition, format, a, b, c, d, e, f) {\n if (isDev && typeof console !== 'undefined' && console.warn) {\n if (format === undefined) {\n console.warn('LogUtils requires an error message argument');\n }\n\n if (!condition) {\n if (format === undefined) {\n console.warn('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n console.warn(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n }\n }\n }\n};", + "import _isNil from \"lodash/isNil\";\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nimport { getPercentValue } from './DataUtils';\nimport { parseScale, checkDomainOfScale, getTicksOfScale } from './ChartUtils';\nexport var RADIAN = Math.PI / 180;\nexport var degreeToRadian = function degreeToRadian(angle) {\n return angle * Math.PI / 180;\n};\nexport var radianToDegree = function radianToDegree(angleInRadian) {\n return angleInRadian * 180 / Math.PI;\n};\nexport var polarToCartesian = function polarToCartesian(cx, cy, radius, angle) {\n return {\n x: cx + Math.cos(-RADIAN * angle) * radius,\n y: cy + Math.sin(-RADIAN * angle) * radius\n };\n};\nexport var getMaxRadius = function getMaxRadius(width, height) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n return Math.min(Math.abs(width - (offset.left || 0) - (offset.right || 0)), Math.abs(height - (offset.top || 0) - (offset.bottom || 0))) / 2;\n};\n/**\n * Calculate the scale function, position, width, height of axes\n * @param {Object} props Latest props\n * @param {Object} axisMap The configuration of axes\n * @param {Object} offset The offset of main part in the svg element\n * @param {Object} axisType The type of axes, radius-axis or angle-axis\n * @param {String} chartName The name of chart\n * @return {Object} Configuration\n */\n\nexport var formatAxisMap = function formatAxisMap(props, axisMap, offset, axisType, chartName) {\n var width = props.width,\n height = props.height;\n var startAngle = props.startAngle,\n endAngle = props.endAngle;\n var cx = getPercentValue(props.cx, width, width / 2);\n var cy = getPercentValue(props.cy, height, height / 2);\n var maxRadius = getMaxRadius(width, height, offset);\n var innerRadius = getPercentValue(props.innerRadius, maxRadius, 0);\n var outerRadius = getPercentValue(props.outerRadius, maxRadius, maxRadius * 0.8);\n var ids = Object.keys(axisMap);\n return ids.reduce(function (result, id) {\n var axis = axisMap[id];\n var domain = axis.domain,\n reversed = axis.reversed;\n var range;\n\n if (_isNil(axis.range)) {\n if (axisType === 'angleAxis') {\n range = [startAngle, endAngle];\n } else if (axisType === 'radiusAxis') {\n range = [innerRadius, outerRadius];\n }\n\n if (reversed) {\n range = [range[1], range[0]];\n }\n } else {\n range = axis.range;\n var _range = range;\n\n var _range2 = _slicedToArray(_range, 2);\n\n startAngle = _range2[0];\n endAngle = _range2[1];\n }\n\n var _parseScale = parseScale(axis, chartName),\n realScaleType = _parseScale.realScaleType,\n scale = _parseScale.scale;\n\n scale.domain(domain).range(range);\n checkDomainOfScale(scale);\n var ticks = getTicksOfScale(scale, _objectSpread({}, axis, {\n realScaleType: realScaleType\n }));\n\n var finalAxis = _objectSpread({}, axis, ticks, {\n range: range,\n radius: outerRadius,\n realScaleType: realScaleType,\n scale: scale,\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n\n return _objectSpread({}, result, _defineProperty({}, id, finalAxis));\n }, {});\n};\nexport var distanceBetweenPoints = function distanceBetweenPoints(point, anotherPoint) {\n var x1 = point.x,\n y1 = point.y;\n var x2 = anotherPoint.x,\n y2 = anotherPoint.y;\n return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));\n};\nexport var getAngleOfPoint = function getAngleOfPoint(_ref, _ref2) {\n var x = _ref.x,\n y = _ref.y;\n var cx = _ref2.cx,\n cy = _ref2.cy;\n var radius = distanceBetweenPoints({\n x: x,\n y: y\n }, {\n x: cx,\n y: cy\n });\n\n if (radius <= 0) {\n return {\n radius: radius\n };\n }\n\n var cos = (x - cx) / radius;\n var angleInRadian = Math.acos(cos);\n\n if (y > cy) {\n angleInRadian = 2 * Math.PI - angleInRadian;\n }\n\n return {\n radius: radius,\n angle: radianToDegree(angleInRadian),\n angleInRadian: angleInRadian\n };\n};\nexport var formatAngleOfSector = function formatAngleOfSector(_ref3) {\n var startAngle = _ref3.startAngle,\n endAngle = _ref3.endAngle;\n var startCnt = Math.floor(startAngle / 360);\n var endCnt = Math.floor(endAngle / 360);\n var min = Math.min(startCnt, endCnt);\n return {\n startAngle: startAngle - min * 360,\n endAngle: endAngle - min * 360\n };\n};\n\nvar reverseFormatAngleOfSetor = function reverseFormatAngleOfSetor(angle, _ref4) {\n var startAngle = _ref4.startAngle,\n endAngle = _ref4.endAngle;\n var startCnt = Math.floor(startAngle / 360);\n var endCnt = Math.floor(endAngle / 360);\n var min = Math.min(startCnt, endCnt);\n return angle + min * 360;\n};\n\nexport var inRangeOfSector = function inRangeOfSector(_ref5, sector) {\n var x = _ref5.x,\n y = _ref5.y;\n\n var _getAngleOfPoint = getAngleOfPoint({\n x: x,\n y: y\n }, sector),\n radius = _getAngleOfPoint.radius,\n angle = _getAngleOfPoint.angle;\n\n var innerRadius = sector.innerRadius,\n outerRadius = sector.outerRadius;\n\n if (radius < innerRadius || radius > outerRadius) {\n return false;\n }\n\n if (radius === 0) {\n return true;\n }\n\n var _formatAngleOfSector = formatAngleOfSector(sector),\n startAngle = _formatAngleOfSector.startAngle,\n endAngle = _formatAngleOfSector.endAngle;\n\n var formatAngle = angle;\n var inRange;\n\n if (startAngle <= endAngle) {\n while (formatAngle > endAngle) {\n formatAngle -= 360;\n }\n\n while (formatAngle < startAngle) {\n formatAngle += 360;\n }\n\n inRange = formatAngle >= startAngle && formatAngle <= endAngle;\n } else {\n while (formatAngle > startAngle) {\n formatAngle -= 360;\n }\n\n while (formatAngle < endAngle) {\n formatAngle += 360;\n }\n\n inRange = formatAngle >= endAngle && formatAngle <= startAngle;\n }\n\n if (inRange) {\n return _objectSpread({}, sector, {\n radius: radius,\n angle: reverseFormatAngleOfSetor(formatAngle, sector)\n });\n }\n\n return null;\n};", + "export function shallowEqual(a, b) {\n /* eslint-disable no-restricted-syntax */\n for (var key in a) {\n if ({}.hasOwnProperty.call(a, key) && (!{}.hasOwnProperty.call(b, key) || a[key] !== b[key])) {\n return false;\n }\n }\n\n for (var _key in b) {\n if ({}.hasOwnProperty.call(b, _key) && !{}.hasOwnProperty.call(a, _key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction shouldComponentUpdate(props, state) {\n return !shallowEqual(props, this.props) || !shallowEqual(state, this.state);\n}\n\nexport default function pureRenderDecorator(component) {\n // eslint-disable-next-line no-param-reassign\n component.prototype.shouldComponentUpdate = shouldComponentUpdate;\n}", + "import _isNil from \"lodash/isNil\";\nimport _isString from \"lodash/isString\";\nimport _isObject from \"lodash/isObject\";\nimport _isFunction from \"lodash/isFunction\";\nimport _isArray from \"lodash/isArray\";\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React, { Children } from 'react';\nimport PropTypes from 'prop-types';\nimport { isNumber } from './DataUtils';\nimport { shallowEqual } from './PureRender';\nexport var PRESENTATION_ATTRIBUTES = {\n 'aria-current': PropTypes.string,\n // state\n 'aria-details': PropTypes.any,\n 'aria-disabled': PropTypes.any,\n // state\n 'aria-hidden': PropTypes.any,\n // state\n 'aria-invalid': PropTypes.any,\n // state\n 'aria-keyshortcuts': PropTypes.any,\n 'aria-label': PropTypes.any,\n 'aria-roledescription': PropTypes.any,\n // Widget Attributes\n 'aria-autocomplete': PropTypes.any,\n 'aria-checked': PropTypes.any,\n 'aria-expanded': PropTypes.any,\n 'aria-haspopup': PropTypes.any,\n 'aria-level': PropTypes.any,\n 'aria-modal': PropTypes.any,\n 'aria-multiline': PropTypes.any,\n 'aria-multiselectable': PropTypes.any,\n 'aria-orientation': PropTypes.any,\n 'aria-placeholder': PropTypes.any,\n 'aria-pressed': PropTypes.any,\n 'aria-readonly': PropTypes.any,\n 'aria-required': PropTypes.any,\n 'aria-selected': PropTypes.any,\n 'aria-sort': PropTypes.any,\n 'aria-valuemax': PropTypes.any,\n 'aria-valuemin': PropTypes.any,\n 'aria-valuenow': PropTypes.any,\n 'aria-valuetext': PropTypes.any,\n // Live Region Attributes\n 'aria-atomic': PropTypes.any,\n 'aria-busy': PropTypes.any,\n 'aria-live': PropTypes.any,\n 'aria-relevant': PropTypes.any,\n // Drag-and-Drop Attributes\n 'aria-dropeffect': PropTypes.any,\n 'aria-grabbed': PropTypes.any,\n // Relationship Attributes\n 'aria-activedescendant': PropTypes.any,\n 'aria-colcount': PropTypes.any,\n 'aria-colindex': PropTypes.any,\n 'aria-colspan': PropTypes.any,\n 'aria-controls': PropTypes.any,\n 'aria-describedby': PropTypes.any,\n 'aria-errormessage': PropTypes.any,\n 'aria-flowto': PropTypes.any,\n 'aria-labelledby': PropTypes.any,\n 'aria-owns': PropTypes.any,\n 'aria-posinset': PropTypes.any,\n 'aria-rowcount': PropTypes.any,\n 'aria-rowindex': PropTypes.any,\n 'aria-rowspan': PropTypes.any,\n 'aria-setsize': PropTypes.any,\n alignmentBaseline: PropTypes.string,\n angle: PropTypes.number,\n baselineShift: PropTypes.string,\n clip: PropTypes.string,\n clipPath: PropTypes.string,\n clipRule: PropTypes.string,\n color: PropTypes.string,\n colorInterpolation: PropTypes.string,\n colorInterpolationFilters: PropTypes.string,\n colorProfile: PropTypes.string,\n colorRendering: PropTypes.string,\n cursor: PropTypes.string,\n direction: PropTypes.oneOf(['ltr', 'rtl', 'inherit']),\n display: PropTypes.string,\n dominantBaseline: PropTypes.string,\n enableBackground: PropTypes.string,\n fill: PropTypes.string,\n fillOpacity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n fillRule: PropTypes.oneOf(['nonzero', 'evenodd', 'inherit']),\n filter: PropTypes.string,\n floodColor: PropTypes.string,\n floodOpacity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n font: PropTypes.string,\n fontFamily: PropTypes.string,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n fontSizeAdjust: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n fontStretch: PropTypes.oneOf(['normal', 'wider', 'narrower', 'ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', 'inherit']),\n fontStyle: PropTypes.oneOf(['normal', 'italic', 'oblique', 'inherit']),\n fontVariant: PropTypes.oneOf(['normal', 'small-caps', 'inherit']),\n fontWeight: PropTypes.oneOf(['normal', 'bold', 'bolder', 'lighter', 100, 200, 300, 400, 500, 600, 700, 800, 900, 'inherit']),\n glyphOrientationHorizontal: PropTypes.string,\n glyphOrientationVertical: PropTypes.string,\n imageRendering: PropTypes.oneOf(['auto', 'optimizeSpeed', 'optimizeQuality', 'inherit']),\n kerning: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n letterSpacing: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n lightingColor: PropTypes.string,\n lineHeight: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n markerEnd: PropTypes.string,\n markerMid: PropTypes.string,\n markerStart: PropTypes.string,\n mask: PropTypes.string,\n opacity: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n overflow: PropTypes.oneOf(['visible', 'hidden', 'scroll', 'auto', 'inherit']),\n pointerEvents: PropTypes.oneOf(['visiblePainted', 'visibleFill', 'visibleStroke', 'visible', 'painted', 'fill', 'stroke', 'all', 'none', 'inherit']),\n shapeRendering: PropTypes.oneOf(['auto', 'optimizeSpeed', 'crispEdges', 'geometricPrecision', 'inherit']),\n stopColor: PropTypes.string,\n stopOpacity: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n stroke: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeDasharray: PropTypes.string,\n strokeDashoffset: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeLinecap: PropTypes.oneOf(['butt', 'round', 'square', 'inherit']),\n strokeLinejoin: PropTypes.oneOf(['miter', 'round', 'bevel', 'inherit']),\n strokeMiterlimit: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeOpacity: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeWidth: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textAnchor: PropTypes.oneOf(['start', 'middle', 'end', 'inherit']),\n textDecoration: PropTypes.oneOf(['none', 'underline', 'overline', 'line-through', 'blink', 'inherit']),\n textRendering: PropTypes.oneOf(['auto', 'optimizeSpeed', 'optimizeLegibility', 'geometricPrecision', 'inherit']),\n unicodeBidi: PropTypes.oneOf(['normal', 'embed', 'bidi-override', 'inherit']),\n visibility: PropTypes.oneOf(['visible', 'hidden', 'collapse', 'inherit']),\n wordSpacing: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n writingMode: PropTypes.oneOf(['lr-tb', 'rl-tb', 'tb-rl', 'lr', 'rl', 'tb', 'inherit']),\n transform: PropTypes.string,\n role: PropTypes.string,\n focusable: PropTypes.string,\n tabIndex: PropTypes.string,\n style: PropTypes.object,\n width: PropTypes.number,\n height: PropTypes.number,\n dx: PropTypes.number,\n dy: PropTypes.number,\n x: PropTypes.number,\n y: PropTypes.number,\n r: PropTypes.number,\n // The radius of Rectangle\n radius: PropTypes.oneOfType([PropTypes.number, PropTypes.array])\n};\nexport var EVENT_ATTRIBUTES = {\n onClick: PropTypes.func,\n onMouseDown: PropTypes.func,\n onMouseUp: PropTypes.func,\n onMouseOver: PropTypes.func,\n onMouseMove: PropTypes.func,\n onMouseOut: PropTypes.func,\n onMouseEnter: PropTypes.func,\n onMouseLeave: PropTypes.func,\n onTouchEnd: PropTypes.func,\n onTouchMove: PropTypes.func,\n onTouchStart: PropTypes.func,\n onTouchCancel: PropTypes.func\n};\nvar REACT_BROWSER_EVENT_MAP = {\n click: 'onClick',\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mouseover: 'onMouseOver',\n mousemove: 'onMouseMove',\n mouseout: 'onMouseOut',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n touchcancel: 'onTouchCancel',\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n};\nexport var SCALE_TYPES = ['auto', 'linear', 'pow', 'sqrt', 'log', 'identity', 'time', 'band', 'point', 'ordinal', 'quantile', 'quantize', 'utc', 'sequential', 'threshold'];\nexport var LEGEND_TYPES = ['plainline', 'line', 'square', 'rect', 'circle', 'cross', 'diamond', 'star', 'triangle', 'wye', 'none'];\n/**\n * Get the display name of a component\n * @param {Object} Comp Specified Component\n * @return {String} Display name of Component\n */\n\nexport var getDisplayName = function getDisplayName(Comp) {\n if (typeof Comp === 'string') {\n return Comp;\n }\n\n if (!Comp) {\n return '';\n }\n\n return Comp.displayName || Comp.name || 'Component';\n};\n/*\n * Find and return all matched children by type. ` + ("`" + `type`)) + (("`" + ` can be a React element class or\n * string\n */\n\nexport var findAllByType = function findAllByType(children, type) {\n var result = [];\n var types = [];\n\n if (_isArray(type)) {\n types = type.map(function (t) {\n return getDisplayName(t);\n });\n } else {\n types = [getDisplayName(type)];\n }\n\n React.Children.forEach(children, function (child) {\n var childType = child && child.type && (child.type.displayName || child.type.name);\n\n if (types.indexOf(childType) !== -1) {\n result.push(child);\n }\n });\n return result;\n};\n/*\n * Return the first matched child by type, return null otherwise.\n * `) + ("`" + `type`)))))) + ((((("`" + (` can be a React element class or string.\n */\n\nexport var findChildByType = function findChildByType(children, type) {\n var result = findAllByType(children, type);\n return result && result[0];\n};\n/*\n * Create a new array of children excluding the ones matched the type\n */\n\nexport var withoutType = function withoutType(children, type) {\n var newChildren = [];\n var types;\n\n if (_isArray(type)) {\n types = type.map(function (t) {\n return getDisplayName(t);\n });\n } else {\n types = [getDisplayName(type)];\n }\n\n React.Children.forEach(children, function (child) {\n if (child && child.type && child.type.displayName && types.indexOf(child.type.displayName) !== -1) {\n return;\n }\n\n newChildren.push(child);\n });\n return newChildren;\n};\n/**\n * get all the presentation attribute of svg element\n * @param {Object} el A react element or the props of a react element\n * @return {Object} attributes or null\n */\n\nexport var getPresentationAttributes = function getPresentationAttributes(el) {\n if (!el || _isFunction(el)) {\n return null;\n }\n\n var props = React.isValidElement(el) ? el.props : el;\n\n if (!_isObject(props)) {\n return null;\n }\n\n var out = null; // eslint-disable-next-line no-restricted-syntax\n\n for (var i in props) {\n if ({}.hasOwnProperty.call(props, i) && PRESENTATION_ATTRIBUTES[i]) {\n if (!out) out = {};\n out[i] = props[i];\n }\n }\n\n return out;\n};\n\nvar getEventHandlerOfElement = function getEventHandlerOfElement(originalHandler, props) {\n return function (e) {\n originalHandler(props, e);\n return null;\n };\n};\n/**\n * get all the event attribute of svg element\n * @param {Object} el A react element or the props of a react element\n * @param {Function} newHandler New handler of event\n * @param {Boolean} wrapCallback Wrap callback and return more parameters or not\n * @return {Object} attributes or null\n */\n\n\nexport var filterEventAttributes = function filterEventAttributes(el, newHandler) {\n var wrapCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (!el || _isFunction(el)) {\n return null;\n }\n\n var props = React.isValidElement(el) ? el.props : el;\n\n if (!_isObject(props)) {\n return null;\n }\n\n var out = null; // eslint-disable-next-line no-restricted-syntax\n\n for (var i in props) {\n if ({}.hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i]) {\n if (!out) out = {};\n out[i] = newHandler || (wrapCallback ? getEventHandlerOfElement(props[i], props) : props[i]);\n }\n }\n\n return out;\n};\n\nvar getEventHandlerOfChild = function getEventHandlerOfChild(originalHandler, data, index) {\n return function (e) {\n originalHandler(data, index, e);\n return null;\n };\n};\n\nexport var filterEventsOfChild = function filterEventsOfChild(props, data, index) {\n if (!_isObject(props)) {\n return null;\n }\n\n var out = null; // eslint-disable-next-line no-restricted-syntax\n\n for (var i in props) {\n if ({}.hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && _isFunction(props[i])) {\n if (!out) out = {};\n out[i] = getEventHandlerOfChild(props[i], data, index);\n }\n }\n\n return out;\n};\n/**\n * validate the width and height props of a chart element\n * @param {Object} el A chart element\n * @return {Boolean} true If the props width and height are number, and greater than 0\n */\n\nexport var validateWidthHeight = function validateWidthHeight(el) {\n if (!el || !el.props) {\n return false;\n }\n\n var _el$props = el.props,\n width = _el$props.width,\n height = _el$props.height;\n\n if (!isNumber(width) || width <= 0 || !isNumber(height) || height <= 0) {\n return false;\n }\n\n return true;\n};\nexport var isSsr = function isSsr() {\n return !(typeof window !== 'undefined' && window.document && window.document.createElement && window.setTimeout);\n};\nvar SVG_TAGS = ['a', 'altGlyph', 'altGlyphDef', 'altGlyphItem', 'animate', 'animateColor', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'color-profile', 'cursor', 'defs', 'desc', 'ellipse', 'feBlend', 'feColormatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'font', 'font-face', 'font-face-format', 'font-face-name', 'font-face-url', 'foreignObject', 'g', 'glyph', 'glyphRef', 'hkern', 'image', 'line', 'lineGradient', 'marker', 'mask', 'metadata', 'missing-glyph', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'script', 'set', 'stop', 'style', 'svg', 'switch', 'symbol', 'text', 'textPath', 'title', 'tref', 'tspan', 'use', 'view', 'vkern'];\n\nvar isSvgElement = function isSvgElement(child) {\n return child && child.type && _isString(child.type) && SVG_TAGS.indexOf(child.type) >= 0;\n};\n/**\n * Filter all the svg elements of children\n * @param {Array} children The children of a react element\n * @return {Array} All the svg elements\n */\n\n\nexport var filterSvgElements = function filterSvgElements(children) {\n var svgElements = [];\n React.Children.forEach(children, function (entry) {\n if (entry && entry.type && _isString(entry.type) && SVG_TAGS.indexOf(entry.type) >= 0) {\n svgElements.push(entry);\n }\n });\n return svgElements;\n};\nexport var isSingleChildEqual = function isSingleChildEqual(nextChild, prevChild) {\n if (_isNil(nextChild) && _isNil(prevChild)) {\n return true;\n }\n\n if (!_isNil(nextChild) && !_isNil(prevChild)) {\n var _ref = nextChild.props || {},\n nextChildren = _ref.children,\n nextProps = _objectWithoutProperties(_ref, [\"children\"]);\n\n var _ref2 = prevChild.props || {},\n prevChildren = _ref2.children,\n prevProps = _objectWithoutProperties(_ref2, [\"children\"]);\n\n if (nextChildren && prevChildren) {\n // eslint-disable-next-line no-use-before-define\n return shallowEqual(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren);\n }\n\n if (!nextChildren && !prevChildren) {\n return shallowEqual(nextProps, prevProps);\n }\n\n return false;\n }\n\n return false;\n};\n/**\n * Wether props of children changed\n * @param {Object} nextChildren The latest children\n * @param {Object} prevChildren The prev children\n * @return {Boolean} equal or not\n */\n\nexport var isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) {\n if (nextChildren === prevChildren) {\n return true;\n }\n\n if (Children.count(nextChildren) !== Children.count(prevChildren)) {\n return false;\n }\n\n var count = Children.count(nextChildren);\n\n if (count === 0) {\n return true;\n }\n\n if (count === 1) {\n return isSingleChildEqual(_isArray(nextChildren) ? nextChildren[0] : nextChildren, _isArray(prevChildren) ? prevChildren[0] : prevChildren);\n }\n\n for (var i = 0; i < count; i++) {\n var nextChild = nextChildren[i];\n var prevChild = prevChildren[i];\n\n if (_isArray(nextChild) || _isArray(prevChild)) {\n if (!isChildrenEqual(nextChild, prevChild)) {\n return false;\n }\n } else if (!isSingleChildEqual(nextChild, prevChild)) {\n return false;\n }\n }\n\n return true;\n};\nexport var renderByOrder = function renderByOrder(children, renderMap) {\n var elements = [];\n var record = {};\n Children.forEach(children, function (child, index) {\n if (child && isSvgElement(child)) {\n elements.push(child);\n } else if (child && renderMap[getDisplayName(child.type)]) {\n var displayName = getDisplayName(child.type);\n var _renderMap$displayNam = renderMap[displayName],\n handler = _renderMap$displayNam.handler,\n once = _renderMap$displayNam.once;\n\n if (once && !record[displayName] || !once) {\n var results = handler(child, displayName, index);\n\n if (_isArray(results)) {\n elements = [elements].concat(_toConsumableArray(results));\n } else {\n elements.push(results);\n }\n\n record[displayName] = true;\n }\n }\n });\n return elements;\n};\nexport var getReactEventByType = function getReactEventByType(e) {\n var type = e && e.type;\n\n if (type && REACT_BROWSER_EVENT_MAP[type]) {\n return REACT_BROWSER_EVENT_MAP[type];\n }\n\n return null;\n};\nexport var parseChildIndex = function parseChildIndex(child, children) {\n var result = -1;\n Children.forEach(children, function (entry, index) {\n if (entry === child) {\n result = index;\n }\n });\n return result;\n};", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the ` + "`")) + (`prop-types` + ("`" + ` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `))) + (("`" + (`./factoryWithTypeCheckers.js` + "`")) + (`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim\n };\n\n ReactPropTypes.checkPropTypes = emptyFunction;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&\n Symbol.for &&\n Symbol.for('react.element')) ||\n 0xeac7;\n\n var isValidElement = function(object) {\n return typeof object === 'object' &&\n object !== null &&\n object.$$typeof === REACT_ELEMENT_TYPE;\n };\n\n // By explicitly using ` + ("`" + `prop-types`)))) + ((("`" + (` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(isValidElement, throwOnDirectAccess);\n} else {\n // By explicitly using ` + "`")) + (`prop-types` + ("`" + ` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n", + "/**\n * Module dependencies\n */\nvar balanced = require(\"balanced-match\")\nvar reduceFunctionCall = require(\"reduce-function-call\")\nvar mexp = require(\"math-expression-evaluator\")\n\n/**\n * Constantes\n */\nvar MAX_STACK = 100 // should be enough for a single calc()...\nvar NESTED_CALC_RE = /(\\+|\\-|\\*|\\\\|[^a-z]|)(\\s*)(\\()/g\n\n/**\n * Global variables\n */\nvar stack\n\n/**\n * Expose reduceCSSCalc plugin\n *\n * @type {Function}\n */\nmodule.exports = reduceCSSCalc\n\n/**\n * Reduce CSS calc() in a string, whenever it's possible\n *\n * @param {String} value css input\n */\nfunction reduceCSSCalc(value, decimalPrecision) {\n stack = 0\n decimalPrecision = Math.pow(10, decimalPrecision === undefined ? 5 : decimalPrecision)\n\n // Allow calc() on multiple lines\n value = value.replace(/\\n+/g, \" \")\n\n /**\n * Evaluates an expression\n *\n * @param {String} expression\n * @returns {String}\n */\n function evaluateExpression (expression, functionIdentifier, call) {\n if (stack++ > MAX_STACK) {\n stack = 0\n throw new Error(\"Call stack overflow for \" + call)\n }\n\n if (expression === \"\") {\n throw new Error(functionIdentifier + \"(): '\" + call + \"' must contain a non-whitespace string\")\n }\n\n expression = evaluateNestedExpression(expression, call)\n\n var units = getUnitsInExpression(expression)\n\n // If the expression contains multiple units or CSS variables,\n // then let the expression be (i.e. browser calc())\n if (units.length > 1 || expression.indexOf(\"var(\") > -1) {\n return functionIdentifier + \"(\" + expression + \")\"\n }\n\n var unit = units[0] || \"\"\n\n if (unit === \"%\") {\n // Convert percentages to numbers, to handle expressions like: 50% * 50% (will become: 25%):\n // console.log(expression)\n expression = expression.replace(/\\b[0-9\\.]+%/g, function(percent) {\n return parseFloat(percent.slice(0, -1)) * 0.01\n })\n }\n\n // Remove units in expression:\n var toEvaluate = expression.replace(new RegExp(unit, \"gi\"), \"\")\n var result\n\n try {\n result = mexp.eval(toEvaluate)\n }\n catch (e) {\n return functionIdentifier + \"(\" + expression + \")\"\n }\n\n // Transform back to a percentage result:\n if (unit === \"%\") {\n result *= 100\n }\n\n // adjust rounding shit\n // (0.1 * 0.2 === 0.020000000000000004)\n if (functionIdentifier.length || unit === \"%\") {\n result = Math.round(result * decimalPrecision) / decimalPrecision\n }\n\n // Add unit\n result += unit\n\n return result\n }\n\n /**\n * Evaluates nested expressions\n *\n * @param {String} expression\n * @returns {String}\n */\n function evaluateNestedExpression(expression, call) {\n // Remove the calc part from nested expressions to ensure\n // better browser compatibility\n expression = expression.replace(/((?:\\-[a-z]+\\-)?calc)/g, \"\")\n var evaluatedPart = \"\"\n var nonEvaluatedPart = expression\n var matches\n while ((matches = NESTED_CALC_RE.exec(nonEvaluatedPart))) {\n if (matches[0].index > 0) {\n evaluatedPart += nonEvaluatedPart.substring(0, matches[0].index)\n }\n\n var balancedExpr = balanced(\"(\", \")\", nonEvaluatedPart.substring([0].index))\n if (balancedExpr.body === \"\") {\n throw new Error(\"'\" + expression + \"' must contain a non-whitespace string\")\n }\n\n var evaluated = evaluateExpression(balancedExpr.body, \"\", call)\n\n evaluatedPart += balancedExpr.pre + evaluated\n nonEvaluatedPart = balancedExpr.post\n }\n\n return evaluatedPart + nonEvaluatedPart\n }\n\n return reduceFunctionCall(value, /((?:\\-[a-z]+\\-)?calc)\\(/, evaluateExpression)\n}\n\n/**\n * Checks what units are used in an expression\n *\n * @param {String} expression\n * @returns {Array}\n */\n\nfunction getUnitsInExpression(expression) {\n var uniqueUnits = []\n var uniqueLowerCaseUnits = []\n var unitRegEx = /[\\.0-9]([%a-z]+)/gi\n var matches = unitRegEx.exec(expression)\n\n while (matches) {\n if (!matches || !matches[1]) {\n continue\n }\n\n if (uniqueLowerCaseUnits.indexOf(matches[1].toLowerCase()) === -1) {\n uniqueUnits.push(matches[1])\n uniqueLowerCaseUnits.push(matches[1].toLowerCase())\n }\n\n matches = unitRegEx.exec(expression)\n }\n\n return uniqueUnits\n}\n", + "/*\n * Module dependencies\n */\nvar balanced = require(\"balanced-match\")\n\n/**\n * Expose `))) + (("`" + (`reduceFunctionCall` + "`")) + ((`\n *\n * @type {Function}\n */\nmodule.exports = reduceFunctionCall\n\n/**\n * Walkthrough all expressions, evaluate them and insert them into the declaration\n *\n * @param {Array} expressions\n * @param {Object} declaration\n */\n\nfunction reduceFunctionCall(string, functionRE, callback) {\n var call = string\n return getFunctionCalls(string, functionRE).reduce(function(string, obj) {\n return string.replace(obj.functionIdentifier + \"(\" + obj.matches.body + \")\", evalFunctionCall(obj.matches.body, obj.functionIdentifier, callback, call, functionRE))\n }, string)\n}\n\n/**\n * Parses expressions in a value\n *\n * @param {String} value\n * @returns {Array}\n * @api private\n */\n\nfunction getFunctionCalls(call, functionRE) {\n var expressions = []\n\n var fnRE = typeof functionRE === \"string\" ? new RegExp(\"\\\\b(\" + functionRE + \")\\\\(\") : functionRE\n do {\n var searchMatch = fnRE.exec(call)\n if (!searchMatch) {\n return expressions\n }\n if (searchMatch[1] === undefined) {\n throw new Error(\"Missing the first couple of parenthesis to get the function identifier in \" + functionRE)\n }\n var fn = searchMatch[1]\n var startIndex = searchMatch.index\n var matches = balanced(\"(\", \")\", call.substring(startIndex))\n\n if (!matches || matches.start !== searchMatch[0].length - 1) {\n throw new SyntaxError(fn + \"(): missing closing ')' in the value '\" + call + \"'\")\n }\n\n expressions.push({matches: matches, functionIdentifier: fn})\n call = matches.post\n }\n while (fnRE.test(call))\n\n return expressions\n}\n\n/**\n * Evaluates an expression\n *\n * @param {String} expression\n * @returns {String}\n * @api private\n */\n\nfunction evalFunctionCall (string, functionIdentifier, callback, call, functionRE) {\n // allow recursivity\n return callback(reduceFunctionCall(string, functionRE, callback), functionIdentifier, call)\n}\n", + "/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\r\n/* eslint-disable require-jsdoc, valid-jsdoc */\r\nvar MapShim = (function () {\r\n if (typeof Map !== 'undefined') {\r\n return Map;\r\n }\r\n /**\r\n * Returns index in provided array that matches the specified key.\r\n *\r\n * @param {Array} arr\r\n * @param {*} key\r\n * @returns {number}\r\n */\r\n function getIndex(arr, key) {\r\n var result = -1;\r\n arr.some(function (entry, index) {\r\n if (entry[0] === key) {\r\n result = index;\r\n return true;\r\n }\r\n return false;\r\n });\r\n return result;\r\n }\r\n return /** @class */ (function () {\r\n function class_1() {\r\n this.__entries__ = [];\r\n }\r\n Object.defineProperty(class_1.prototype, \"size\", {\r\n /**\r\n * @returns {boolean}\r\n */\r\n get: function () {\r\n return this.__entries__.length;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @param {*} key\r\n * @returns {*}\r\n */\r\n class_1.prototype.get = function (key) {\r\n var index = getIndex(this.__entries__, key);\r\n var entry = this.__entries__[index];\r\n return entry && entry[1];\r\n };\r\n /**\r\n * @param {*} key\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\n class_1.prototype.set = function (key, value) {\r\n var index = getIndex(this.__entries__, key);\r\n if (~index) {\r\n this.__entries__[index][1] = value;\r\n }\r\n else {\r\n this.__entries__.push([key, value]);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.delete = function (key) {\r\n var entries = this.__entries__;\r\n var index = getIndex(entries, key);\r\n if (~index) {\r\n entries.splice(index, 1);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.has = function (key) {\r\n return !!~getIndex(this.__entries__, key);\r\n };\r\n /**\r\n * @returns {void}\r\n */\r\n class_1.prototype.clear = function () {\r\n this.__entries__.splice(0);\r\n };\r\n /**\r\n * @param {Function} callback\r\n * @param {*} [ctx=null]\r\n * @returns {void}\r\n */\r\n class_1.prototype.forEach = function (callback, ctx) {\r\n if (ctx === void 0) { ctx = null; }\r\n for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\r\n var entry = _a[_i];\r\n callback.call(ctx, entry[1], entry[0]);\r\n }\r\n };\r\n return class_1;\r\n }());\r\n})();\n\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;\n\n// Returns global object of a current environment.\r\nvar global$1 = (function () {\r\n if (typeof global !== 'undefined' && global.Math === Math) {\r\n return global;\r\n }\r\n if (typeof self !== 'undefined' && self.Math === Math) {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined' && window.Math === Math) {\r\n return window;\r\n }\r\n // eslint-disable-next-line no-new-func\r\n return Function('return this')();\r\n})();\n\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\r\nvar requestAnimationFrame$1 = (function () {\r\n if (typeof requestAnimationFrame === 'function') {\r\n // It's required to use a bounded function because IE sometimes throws\r\n // an \"Invalid calling object\" error if rAF is invoked without the global\r\n // object on the left hand side.\r\n return requestAnimationFrame.bind(global$1);\r\n }\r\n return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };\r\n})();\n\n// Defines minimum timeout before adding a trailing call.\r\nvar trailingTimeout = 2;\r\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\r\nfunction throttle (callback, delay) {\r\n var leadingCall = false, trailingCall = false, lastCallTime = 0;\r\n /**\r\n * Invokes the original callback function and schedules new invocation if\r\n * the \"proxy\" was called during current request.\r\n *\r\n * @returns {void}\r\n */\r\n function resolvePending() {\r\n if (leadingCall) {\r\n leadingCall = false;\r\n callback();\r\n }\r\n if (trailingCall) {\r\n proxy();\r\n }\r\n }\r\n /**\r\n * Callback invoked after the specified delay. It will further postpone\r\n * invocation of the original function delegating it to the\r\n * requestAnimationFrame.\r\n *\r\n * @returns {void}\r\n */\r\n function timeoutCallback() {\r\n requestAnimationFrame$1(resolvePending);\r\n }\r\n /**\r\n * Schedules invocation of the original function.\r\n *\r\n * @returns {void}\r\n */\r\n function proxy() {\r\n var timeStamp = Date.now();\r\n if (leadingCall) {\r\n // Reject immediately following calls.\r\n if (timeStamp - lastCallTime < trailingTimeout) {\r\n return;\r\n }\r\n // Schedule new call to be in invoked when the pending one is resolved.\r\n // This is important for \"transitions\" which never actually start\r\n // immediately so there is a chance that we might miss one if change\r\n // happens amids the pending invocation.\r\n trailingCall = true;\r\n }\r\n else {\r\n leadingCall = true;\r\n trailingCall = false;\r\n setTimeout(timeoutCallback, delay);\r\n }\r\n lastCallTime = timeStamp;\r\n }\r\n return proxy;\r\n}\n\n// Minimum delay before invoking the update of observers.\r\nvar REFRESH_DELAY = 20;\r\n// A list of substrings of CSS properties used to find transition events that\r\n// might affect dimensions of observed elements.\r\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];\r\n// Check if MutationObserver is available.\r\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\r\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\r\nvar ResizeObserverController = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserverController.\r\n *\r\n * @private\r\n */\r\n function ResizeObserverController() {\r\n /**\r\n * Indicates whether DOM listeners have been added.\r\n *\r\n * @private {boolean}\r\n */\r\n this.connected_ = false;\r\n /**\r\n * Tells that controller has subscribed for Mutation Events.\r\n *\r\n * @private {boolean}\r\n */\r\n this.mutationEventsAdded_ = false;\r\n /**\r\n * Keeps reference to the instance of MutationObserver.\r\n *\r\n * @private {MutationObserver}\r\n */\r\n this.mutationsObserver_ = null;\r\n /**\r\n * A list of connected observers.\r\n *\r\n * @private {Array}\r\n */\r\n this.observers_ = [];\r\n this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\r\n this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\r\n }\r\n /**\r\n * Adds observer to observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be added.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.addObserver = function (observer) {\r\n if (!~this.observers_.indexOf(observer)) {\r\n this.observers_.push(observer);\r\n }\r\n // Add listeners if they haven't been added yet.\r\n if (!this.connected_) {\r\n this.connect_();\r\n }\r\n };\r\n /**\r\n * Removes observer from observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.removeObserver = function (observer) {\r\n var observers = this.observers_;\r\n var index = observers.indexOf(observer);\r\n // Remove observer if it's present in registry.\r\n if (~index) {\r\n observers.splice(index, 1);\r\n }\r\n // Remove listeners if controller has no connected observers.\r\n if (!observers.length && this.connected_) {\r\n this.disconnect_();\r\n }\r\n };\r\n /**\r\n * Invokes the update of observers. It will continue running updates insofar\r\n * it detects changes.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.refresh = function () {\r\n var changesDetected = this.updateObservers_();\r\n // Continue running updates if changes have been detected as there might\r\n // be future ones caused by CSS transitions.\r\n if (changesDetected) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Updates every observer from observers list and notifies them of queued\r\n * entries.\r\n *\r\n * @private\r\n * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n * dimensions of it's elements.\r\n */\r\n ResizeObserverController.prototype.updateObservers_ = function () {\r\n // Collect observers that have active observations.\r\n var activeObservers = this.observers_.filter(function (observer) {\r\n return observer.gatherActive(), observer.hasActive();\r\n });\r\n // Deliver notifications in a separate cycle in order to avoid any\r\n // collisions between observers, e.g. when multiple instances of\r\n // ResizeObserver are tracking the same element and the callback of one\r\n // of them changes content dimensions of the observed target. Sometimes\r\n // this may result in notifications being blocked for the rest of observers.\r\n activeObservers.forEach(function (observer) { return observer.broadcastActive(); });\r\n return activeObservers.length > 0;\r\n };\r\n /**\r\n * Initializes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.connect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already added.\r\n if (!isBrowser || this.connected_) {\r\n return;\r\n }\r\n // Subscription to the \"Transitionend\" event is used as a workaround for\r\n // delayed transitions. This way it's possible to capture at least the\r\n // final state of an element.\r\n document.addEventListener('transitionend', this.onTransitionEnd_);\r\n window.addEventListener('resize', this.refresh);\r\n if (mutationObserverSupported) {\r\n this.mutationsObserver_ = new MutationObserver(this.refresh);\r\n this.mutationsObserver_.observe(document, {\r\n attributes: true,\r\n childList: true,\r\n characterData: true,\r\n subtree: true\r\n });\r\n }\r\n else {\r\n document.addEventListener('DOMSubtreeModified', this.refresh);\r\n this.mutationEventsAdded_ = true;\r\n }\r\n this.connected_ = true;\r\n };\r\n /**\r\n * Removes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.disconnect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already removed.\r\n if (!isBrowser || !this.connected_) {\r\n return;\r\n }\r\n document.removeEventListener('transitionend', this.onTransitionEnd_);\r\n window.removeEventListener('resize', this.refresh);\r\n if (this.mutationsObserver_) {\r\n this.mutationsObserver_.disconnect();\r\n }\r\n if (this.mutationEventsAdded_) {\r\n document.removeEventListener('DOMSubtreeModified', this.refresh);\r\n }\r\n this.mutationsObserver_ = null;\r\n this.mutationEventsAdded_ = false;\r\n this.connected_ = false;\r\n };\r\n /**\r\n * \"Transitionend\" event handler.\r\n *\r\n * @private\r\n * @param {TransitionEvent} event\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\r\n var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;\r\n // Detect whether transition may affect dimensions of an element.\r\n var isReflowProperty = transitionKeys.some(function (key) {\r\n return !!~propertyName.indexOf(key);\r\n });\r\n if (isReflowProperty) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Returns instance of the ResizeObserverController.\r\n *\r\n * @returns {ResizeObserverController}\r\n */\r\n ResizeObserverController.getInstance = function () {\r\n if (!this.instance_) {\r\n this.instance_ = new ResizeObserverController();\r\n }\r\n return this.instance_;\r\n };\r\n /**\r\n * Holds reference to the controller's instance.\r\n *\r\n * @private {ResizeObserverController}\r\n */\r\n ResizeObserverController.instance_ = null;\r\n return ResizeObserverController;\r\n}());\n\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\r\nvar defineConfigurable = (function (target, props) {\r\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n Object.defineProperty(target, key, {\r\n value: props[key],\r\n enumerable: false,\r\n writable: false,\r\n configurable: true\r\n });\r\n }\r\n return target;\r\n});\n\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\r\nvar getWindowOf = (function (target) {\r\n // Assume that the element is an instance of Node, which means that it\r\n // has the \"ownerDocument\" property from which we can retrieve a\r\n // corresponding global object.\r\n var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;\r\n // Return the local global object if it's not possible extract one from\r\n // provided element.\r\n return ownerGlobal || global$1;\r\n});\n\n// Placeholder of an empty content rectangle.\r\nvar emptyRect = createRectInit(0, 0, 0, 0);\r\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\r\nfunction toFloat(value) {\r\n return parseFloat(value) || 0;\r\n}\r\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\r\nfunction getBordersSize(styles) {\r\n var positions = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n positions[_i - 1] = arguments[_i];\r\n }\r\n return positions.reduce(function (size, position) {\r\n var value = styles['border-' + position + '-width'];\r\n return size + toFloat(value);\r\n }, 0);\r\n}\r\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\r\nfunction getPaddings(styles) {\r\n var positions = ['top', 'right', 'bottom', 'left'];\r\n var paddings = {};\r\n for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\r\n var position = positions_1[_i];\r\n var value = styles['padding-' + position];\r\n paddings[position] = toFloat(value);\r\n }\r\n return paddings;\r\n}\r\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n * to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getSVGContentRect(target) {\r\n var bbox = target.getBBox();\r\n return createRectInit(0, 0, bbox.width, bbox.height);\r\n}\r\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getHTMLElementContentRect(target) {\r\n // Client width & height properties can't be\r\n // used exclusively as they provide rounded values.\r\n var clientWidth = target.clientWidth, clientHeight = target.clientHeight;\r\n // By this condition we can catch all non-replaced inline, hidden and\r\n // detached elements. Though elements with width & height properties less\r\n // than 0.5 will be discarded as well.\r\n //\r\n // Without it we would need to implement separate methods for each of\r\n // those cases and it's not possible to perform a precise and performance\r\n // effective test for hidden elements. E.g. even jQuery's ':visible' filter\r\n // gives wrong results for elements with width & height less than 0.5.\r\n if (!clientWidth && !clientHeight) {\r\n return emptyRect;\r\n }\r\n var styles = getWindowOf(target).getComputedStyle(target);\r\n var paddings = getPaddings(styles);\r\n var horizPad = paddings.left + paddings.right;\r\n var vertPad = paddings.top + paddings.bottom;\r\n // Computed styles of width & height are being used because they are the\r\n // only dimensions available to JS that contain non-rounded values. It could\r\n // be possible to utilize the getBoundingClientRect if only it's data wasn't\r\n // affected by CSS transformations let alone paddings, borders and scroll bars.\r\n var width = toFloat(styles.width), height = toFloat(styles.height);\r\n // Width & height include paddings and borders when the 'border-box' box\r\n // model is applied (except for IE).\r\n if (styles.boxSizing === 'border-box') {\r\n // Following conditions are required to handle Internet Explorer which\r\n // doesn't include paddings and borders to computed CSS dimensions.\r\n //\r\n // We can say that if CSS dimensions + paddings are equal to the \"client\"\r\n // properties then it's either IE, and thus we don't need to subtract\r\n // anything, or an element merely doesn't have paddings/borders styles.\r\n if (Math.round(width + horizPad) !== clientWidth) {\r\n width -= getBordersSize(styles, 'left', 'right') + horizPad;\r\n }\r\n if (Math.round(height + vertPad) !== clientHeight) {\r\n height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\r\n }\r\n }\r\n // Following steps can't be applied to the document's root element as its\r\n // client[Width/Height] properties represent viewport area of the window.\r\n // Besides, it's as well not necessary as the itself neither has\r\n // rendered scroll bars nor it can be clipped.\r\n if (!isDocumentElement(target)) {\r\n // In some browsers (only in Firefox, actually) CSS width & height\r\n // include scroll bars size which can be removed at this step as scroll\r\n // bars are the only difference between rounded dimensions + paddings\r\n // and \"client\" properties, though that is not always true in Chrome.\r\n var vertScrollbar = Math.round(width + horizPad) - clientWidth;\r\n var horizScrollbar = Math.round(height + vertPad) - clientHeight;\r\n // Chrome has a rather weird rounding of \"client\" properties.\r\n // E.g. for an element with content width of 314.2px it sometimes gives\r\n // the client width of 315px and for the width of 314.7px it may give\r\n // 314px. And it doesn't happen all the time. So just ignore this delta\r\n // as a non-relevant.\r\n if (Math.abs(vertScrollbar) !== 1) {\r\n width -= vertScrollbar;\r\n }\r\n if (Math.abs(horizScrollbar) !== 1) {\r\n height -= horizScrollbar;\r\n }\r\n }\r\n return createRectInit(paddings.left, paddings.top, width, height);\r\n}\r\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nvar isSVGGraphicsElement = (function () {\r\n // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\r\n // interface.\r\n if (typeof SVGGraphicsElement !== 'undefined') {\r\n return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };\r\n }\r\n // If it's so, then check that element is at least an instance of the\r\n // SVGElement and that it has the \"getBBox\" method.\r\n // eslint-disable-next-line no-extra-parens\r\n return function (target) { return (target instanceof getWindowOf(target).SVGElement &&\r\n typeof target.getBBox === 'function'); };\r\n})();\r\n/**\r\n * Checks whether provided element is a document element ().\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nfunction isDocumentElement(target) {\r\n return target === getWindowOf(target).document.documentElement;\r\n}\r\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getContentRect(target) {\r\n if (!isBrowser) {\r\n return emptyRect;\r\n }\r\n if (isSVGGraphicsElement(target)) {\r\n return getSVGContentRect(target);\r\n }\r\n return getHTMLElementContentRect(target);\r\n}\r\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\r\nfunction createReadOnlyRect(_a) {\r\n var x = _a.x, y = _a.y, width = _a.width, height = _a.height;\r\n // If DOMRectReadOnly is available use it as a prototype for the rectangle.\r\n var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\r\n var rect = Object.create(Constr.prototype);\r\n // Rectangle's properties are not writable and non-enumerable.\r\n defineConfigurable(rect, {\r\n x: x, y: y, width: width, height: height,\r\n top: y,\r\n right: x + width,\r\n bottom: height + y,\r\n left: x\r\n });\r\n return rect;\r\n}\r\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction createRectInit(x, y, width, height) {\r\n return { x: x, y: y, width: width, height: height };\r\n}\n\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\r\nvar ResizeObservation = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObservation.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n */\r\n function ResizeObservation(target) {\r\n /**\r\n * Broadcasted width of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastWidth = 0;\r\n /**\r\n * Broadcasted height of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastHeight = 0;\r\n /**\r\n * Reference to the last observed content rectangle.\r\n *\r\n * @private {DOMRectInit}\r\n */\r\n this.contentRect_ = createRectInit(0, 0, 0, 0);\r\n this.target = target;\r\n }\r\n /**\r\n * Updates content rectangle and tells whether it's width or height properties\r\n * have changed since the last broadcast.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObservation.prototype.isActive = function () {\r\n var rect = getContentRect(this.target);\r\n this.contentRect_ = rect;\r\n return (rect.width !== this.broadcastWidth ||\r\n rect.height !== this.broadcastHeight);\r\n };\r\n /**\r\n * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n * from the corresponding properties of the last observed content rectangle.\r\n *\r\n * @returns {DOMRectInit} Last observed content rectangle.\r\n */\r\n ResizeObservation.prototype.broadcastRect = function () {\r\n var rect = this.contentRect_;\r\n this.broadcastWidth = rect.width;\r\n this.broadcastHeight = rect.height;\r\n return rect;\r\n };\r\n return ResizeObservation;\r\n}());\n\nvar ResizeObserverEntry = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObserverEntry.\r\n *\r\n * @param {Element} target - Element that is being observed.\r\n * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n */\r\n function ResizeObserverEntry(target, rectInit) {\r\n var contentRect = createReadOnlyRect(rectInit);\r\n // According to the specification following properties are not writable\r\n // and are also not enumerable in the native implementation.\r\n //\r\n // Property accessors are not being used as they'd require to define a\r\n // private WeakMap storage which may cause memory leaks in browsers that\r\n // don't support this type of collections.\r\n defineConfigurable(this, { target: target, contentRect: contentRect });\r\n }\r\n return ResizeObserverEntry;\r\n}());\n\nvar ResizeObserverSPI = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n * when one of the observed elements changes it's content dimensions.\r\n * @param {ResizeObserverController} controller - Controller instance which\r\n * is responsible for the updates of observer.\r\n * @param {ResizeObserver} callbackCtx - Reference to the public\r\n * ResizeObserver instance which will be passed to callback function.\r\n */\r\n function ResizeObserverSPI(callback, controller, callbackCtx) {\r\n /**\r\n * Collection of resize observations that have detected changes in dimensions\r\n * of elements.\r\n *\r\n * @private {Array}\r\n */\r\n this.activeObservations_ = [];\r\n /**\r\n * Registry of the ResizeObservation instances.\r\n *\r\n * @private {Map}\r\n */\r\n this.observations_ = new MapShim();\r\n if (typeof callback !== 'function') {\r\n throw new TypeError('The callback provided as parameter 1 is not a function.');\r\n }\r\n this.callback_ = callback;\r\n this.controller_ = controller;\r\n this.callbackCtx_ = callbackCtx;\r\n }\r\n /**\r\n * Starts observing provided element.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.observe = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is already being observed.\r\n if (observations.has(target)) {\r\n return;\r\n }\r\n observations.set(target, new ResizeObservation(target));\r\n this.controller_.addObserver(this);\r\n // Force the update of observations.\r\n this.controller_.refresh();\r\n };\r\n /**\r\n * Stops observing provided element.\r\n *\r\n * @param {Element} target - Element to stop observing.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.unobserve = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is not being observed.\r\n if (!observations.has(target)) {\r\n return;\r\n }\r\n observations.delete(target);\r\n if (!observations.size) {\r\n this.controller_.removeObserver(this);\r\n }\r\n };\r\n /**\r\n * Stops observing all elements.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.disconnect = function () {\r\n this.clearActive();\r\n this.observations_.clear();\r\n this.controller_.removeObserver(this);\r\n };\r\n /**\r\n * Collects observation instances the associated element of which has changed\r\n * it's content rectangle.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.gatherActive = function () {\r\n var _this = this;\r\n this.clearActive();\r\n this.observations_.forEach(function (observation) {\r\n if (observation.isActive()) {\r\n _this.activeObservations_.push(observation);\r\n }\r\n });\r\n };\r\n /**\r\n * Invokes initial callback function with a list of ResizeObserverEntry\r\n * instances collected from active resize observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.broadcastActive = function () {\r\n // Do nothing if observer doesn't have active observations.\r\n if (!this.hasActive()) {\r\n return;\r\n }\r\n var ctx = this.callbackCtx_;\r\n // Create ResizeObserverEntry instance for every active observation.\r\n var entries = this.activeObservations_.map(function (observation) {\r\n return new ResizeObserverEntry(observation.target, observation.broadcastRect());\r\n });\r\n this.callback_.call(ctx, entries, ctx);\r\n this.clearActive();\r\n };\r\n /**\r\n * Clears the collection of active observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.clearActive = function () {\r\n this.activeObservations_.splice(0);\r\n };\r\n /**\r\n * Tells whether observer has active observations.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObserverSPI.prototype.hasActive = function () {\r\n return this.activeObservations_.length > 0;\r\n };\r\n return ResizeObserverSPI;\r\n}());\n\n// Registry of internal observers. If WeakMap is not available use current shim\r\n// for the Map collection as it has all required methods and because WeakMap\r\n// can't be fully polyfilled anyway.\r\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\r\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\r\nvar ResizeObserver = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n * dimensions of the observed elements change.\r\n */\r\n function ResizeObserver(callback) {\r\n if (!(this instanceof ResizeObserver)) {\r\n throw new TypeError('Cannot call a class as a function.');\r\n }\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n var controller = ResizeObserverController.getInstance();\r\n var observer = new ResizeObserverSPI(callback, controller, this);\r\n observers.set(this, observer);\r\n }\r\n return ResizeObserver;\r\n}());\r\n// Expose public methods of ResizeObserver.\r\n[\r\n 'observe',\r\n 'unobserve',\r\n 'disconnect'\r\n].forEach(function (method) {\r\n ResizeObserver.prototype[method] = function () {\r\n var _a;\r\n return (_a = observers.get(this))[method].apply(_a, arguments);\r\n };\r\n});\n\nvar index = (function () {\r\n // Export existing implementation if available.\r\n if (typeof global$1.ResizeObserver !== 'undefined') {\r\n return global$1.ResizeObserver;\r\n }\r\n return ResizeObserver;\r\n})();\n\nexport default index;\n", + "/** @license React v0.13.6\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';Object.defineProperty(exports,\"__esModule\",{value:!0});var d=null,e=!1,g=3,k=-1,l=-1,m=!1,n=!1;function p(){if(!m){var a=d.expirationTime;n?q():n=!0;r(t,a)}}\nfunction u(){var a=d,b=d.next;if(d===b)d=null;else{var c=d.previous;d=c.next=b;b.previous=c}a.next=a.previous=null;c=a.callback;b=a.expirationTime;a=a.priorityLevel;var f=g,Q=l;g=a;l=b;try{var h=c()}finally{g=f,l=Q}if(\"function\"===typeof h)if(h={callback:h,priorityLevel:a,expirationTime:b,next:null,previous:null},null===d)d=h.next=h.previous=h;else{c=null;a=d;do{if(a.expirationTime>=b){c=a;break}a=a.next}while(a!==d);null===c?c=d:c===d&&(d=h,p());b=c.previous;b.next=c.previous=h;h.next=c;h.previous=\nb}}function v(){if(-1===k&&null!==d&&1===d.priorityLevel){m=!0;try{do u();while(null!==d&&1===d.priorityLevel)}finally{m=!1,null!==d?p():n=!1}}}function t(a){m=!0;var b=e;e=a;try{if(a)for(;null!==d;){var c=exports.unstable_now();if(d.expirationTime<=c){do u();while(null!==d&&d.expirationTime<=c)}else break}else if(null!==d){do u();while(null!==d&&!w())}}finally{m=!1,e=b,null!==d?p():n=!1,v()}}\nvar x=Date,y=\"function\"===typeof setTimeout?setTimeout:void 0,z=\"function\"===typeof clearTimeout?clearTimeout:void 0,A=\"function\"===typeof requestAnimationFrame?requestAnimationFrame:void 0,B=\"function\"===typeof cancelAnimationFrame?cancelAnimationFrame:void 0,C,D;function E(a){C=A(function(b){z(D);a(b)});D=y(function(){B(C);a(exports.unstable_now())},100)}\nif(\"object\"===typeof performance&&\"function\"===typeof performance.now){var F=performance;exports.unstable_now=function(){return F.now()}}else exports.unstable_now=function(){return x.now()};var r,q,w,G=null;\"undefined\"!==typeof window?G=window:\"undefined\"!==typeof global&&(G=global);\nif(G&&G._schedMock){var H=G._schedMock;r=H[0];q=H[1];w=H[2];exports.unstable_now=H[3]}else if(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var I=null,J=function(a){if(null!==I)try{I(a)}finally{I=null}};r=function(a){null!==I?setTimeout(r,0,a):(I=a,setTimeout(J,0,!1))};q=function(){I=null};w=function(){return!1}}else{\"undefined\"!==typeof console&&(\"function\"!==typeof A&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"),\n\"function\"!==typeof B&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"));var K=null,L=!1,M=-1,N=!1,O=!1,P=0,R=33,S=33;w=function(){return P<=exports.unstable_now()};var T=new MessageChannel,U=T.port2;T.port1.onmessage=function(){L=!1;var a=K,b=M;K=null;M=-1;var c=exports.unstable_now(),f=!1;if(0>=P-c)if(-1!==b&&b<=c)f=!0;else{N||(N=!0,E(V));K=a;M=b;return}if(null!==a){O=!0;try{a(f)}finally{O=!1}}};\nvar V=function(a){if(null!==K){E(V);var b=a-P+S;bb&&(b=8),S=bb?U.postMessage(void 0):N||(N=!0,E(V))};q=function(){K=null;L=!1;M=-1}}exports.unstable_ImmediatePriority=1;exports.unstable_UserBlockingPriority=2;exports.unstable_NormalPriority=3;exports.unstable_IdlePriority=5;exports.unstable_LowPriority=4;\nexports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=g,f=k;g=a;k=exports.unstable_now();try{return b()}finally{g=c,k=f,v()}};exports.unstable_next=function(a){switch(g){case 1:case 2:case 3:var b=3;break;default:b=g}var c=g,f=k;g=b;k=exports.unstable_now();try{return a()}finally{g=c,k=f,v()}};\nexports.unstable_scheduleCallback=function(a,b){var c=-1!==k?k:exports.unstable_now();if(\"object\"===typeof b&&null!==b&&\"number\"===typeof b.timeout)b=c+b.timeout;else switch(g){case 1:b=c+-1;break;case 2:b=c+250;break;case 5:b=c+1073741823;break;case 4:b=c+1E4;break;default:b=c+5E3}a={callback:a,priorityLevel:g,expirationTime:b,next:null,previous:null};if(null===d)d=a.next=a.previous=a,p();else{c=null;var f=d;do{if(f.expirationTime>b){c=f;break}f=f.next}while(f!==d);null===c?c=d:c===d&&(d=a,p());\nb=c.previous;b.next=c.previous=a;a.next=c;a.previous=b}return a};exports.unstable_cancelCallback=function(a){var b=a.next;if(null!==b){if(b===a)d=null;else{a===d&&(d=b);var c=a.previous;c.next=b;b.previous=c}a.next=a.previous=null}};exports.unstable_wrapCallback=function(a){var b=g;return function(){var c=g,f=k;g=b;k=exports.unstable_now();try{return a.apply(this,arguments)}finally{g=c,k=f,v()}}};exports.unstable_getCurrentPriorityLevel=function(){return g};\nexports.unstable_shouldYield=function(){return!e&&(null!==d&&d.expirationTime element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var script = doc.createElement(\"script\");\n script.onreadystatechange = function () {\n runIfPresent(handle);\n script.onreadystatechange = null;\n html.removeChild(script);\n script = null;\n };\n html.appendChild(script);\n };\n }\n\n function installSetTimeoutImplementation() {\n registerImmediate = function(handle) {\n setTimeout(runIfPresent, 0, handle);\n };\n }\n\n // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n // Don't get fooled by e.g. browserify environments.\n if ({}.toString.call(global.process) === \"[object process]\") {\n // For Node.js before 0.9\n installNextTickImplementation();\n\n } else if (canUsePostMessage()) {\n // For non-IE10 modern browsers\n installPostMessageImplementation();\n\n } else if (global.MessageChannel) {\n // For web workers, where supported\n installMessageChannelImplementation();\n\n } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n // For IE 6–8\n installReadyStateChangeImplementation();\n\n } else {\n // For older browsers\n installSetTimeoutImplementation();\n }\n\n attachTo.setImmediate = setImmediate;\n attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n", + "/* global window */\nimport ponyfill from './ponyfill.js';\n\nvar root;\n\nif (typeof self !== 'undefined') {\n root = self;\n} else if (typeof window !== 'undefined') {\n root = window;\n} else if (typeof global !== 'undefined') {\n root = global;\n} else if (typeof module !== 'undefined') {\n root = module;\n} else {\n root = Function('return this')();\n}\n\nvar result = ponyfill(root);\nexport default result;\n", + "export default function symbolObservablePonyfill(root) {\n\tvar result;\n\tvar Symbol = root.Symbol;\n\n\tif (typeof Symbol === 'function') {\n\t\tif (Symbol.observable) {\n\t\t\tresult = Symbol.observable;\n\t\t} else {\n\t\t\tresult = Symbol('observable');\n\t\t\tSymbol.observable = result;\n\t\t}\n\t} else {\n\t\tresult = '@@observable';\n\t}\n\n\treturn result;\n};\n", + "var scope = (typeof global !== \"undefined\" && global) ||\n (typeof self !== \"undefined\" && self) ||\n window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object ` + ("`" + `setimmediate`)) + ("`" + (` was\n// able to install onto. Search each possibility in the same order as the\n// ` + "`"))) + ((`setimmediate` + ("`" + ` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n (typeof global !== \"undefined\" && global.setImmediate) ||\n (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n (typeof global !== \"undefined\" && global.clearImmediate) ||\n (this && this.clearImmediate);\n", + "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar warning = function() {};\n\nif (__DEV__) {\n var printWarning = function printWarning(format, args) {\n var len = arguments.length;\n args = new Array(len > 1 ? len - 1 : 0);\n for (var key = 1; key < len; key++) {\n args[key - 1] = arguments[key];\n }\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n }\n\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '`)) + (("`" + `warning(condition, format, ...args)`) + ("`" + ` requires a warning ' +\n 'message argument'\n );\n }\n if (!condition) {\n printWarning.apply(null, [format].concat(args));\n }\n };\n}\n\nmodule.exports = warning;\n", + "var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n", + "module.exports = function(originalModule) {\n\tif (!originalModule.webpackPolyfill) {\n\t\tvar module = Object.create(originalModule);\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"exports\", {\n\t\t\tenumerable: true\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n", + "module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n" + ], + "sourceRoot": "" +}`)))))))))))))) + +func bundleJsMapBytes() ([]byte, error) { + return _bundleJsMap, nil +} + +func bundleJsMap() (*asset, error) { + bytes, err := bundleJsMapBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "bundle.js.map", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd0, 0xf7, 0xf2, 0xa1, 0x8e, 0xb5, 0x7a, 0xcc, 0xd9, 0x76, 0x54, 0x30, 0x90, 0x93, 0xc7, 0x1, 0x62, 0xa7, 0xda, 0x4c, 0x74, 0x3f, 0x7f, 0x6e, 0x42, 0x8c, 0x2d, 0x47, 0x58, 0x3d, 0xbc, 0x3e}} return a, nil } @@ -40727,6 +38571,8 @@ var _bindata = map[string]func() (*asset, error){ "index.html": indexHtml, "bundle.js": bundleJs, + + "bundle.js.map": bundleJsMap, } // AssetDir returns the file names below a certain @@ -40770,8 +38616,9 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "bundle.js": {bundleJs, map[string]*bintree{}}, - "index.html": {indexHtml, map[string]*bintree{}}, + "bundle.js": {bundleJs, map[string]*bintree{}}, + "bundle.js.map": {bundleJsMap, map[string]*bintree{}}, + "index.html": {indexHtml, map[string]*bintree{}}, }} // RestoreAsset restores an asset under the given directory. diff --git a/dashboard/assets/.eslintignore b/dashboard/assets/.eslintignore new file mode 100644 index 000000000000..565bf83e7679 --- /dev/null +++ b/dashboard/assets/.eslintignore @@ -0,0 +1,3 @@ +node_modules/* #ignored by default +flow-typed/* +bundle.js diff --git a/dashboard/assets/.eslintrc b/dashboard/assets/.eslintrc index ab7a3a0392f7..923d6f5de937 100644 --- a/dashboard/assets/.eslintrc +++ b/dashboard/assets/.eslintrc @@ -16,71 +16,66 @@ // React syntax style mostly according to https://github.com/airbnb/javascript/tree/master/react { - 'env': { - 'browser': true, - 'node': true, - 'es6': true, + "env": { + "browser": true, + "node": true, + "es6": true }, - 'parser': 'babel-eslint', - 'parserOptions': { - 'sourceType': 'module', - 'ecmaVersion': 6, - 'ecmaFeatures': { - 'jsx': true, + "parser": "babel-eslint", + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 6, + "ecmaFeatures": { + "jsx": true } }, - 'extends': 'airbnb', - 'plugins': [ - 'flowtype', - 'react', + "extends": [ + "eslint:recommended", + "airbnb", + "plugin:flowtype/recommended", + "plugin:react/recommended" ], - 'rules': { - 'no-tabs': 'off', - 'indent': ['error', 'tab'], - 'react/jsx-indent': ['error', 'tab'], - 'react/jsx-indent-props': ['error', 'tab'], - 'react/prefer-stateless-function': 'off', - 'jsx-quotes': ['error', 'prefer-single'], - 'no-plusplus': 'off', - 'no-console': ['error', { allow: ['error'] }], - + "plugins": [ + "flowtype", + "react" + ], + "rules": { + "no-tabs": "off", + "indent": ["error", "tab"], + "react/jsx-indent": ["error", "tab"], + "react/jsx-indent-props": ["error", "tab"], + "react/prefer-stateless-function": "off", + "react/destructuring-assignment": ["error", "always", {"ignoreClassFields": true}], + "jsx-quotes": ["error", "prefer-single"], + "no-plusplus": "off", + "no-console": ["error", { "allow": ["error"] }], // Specifies the maximum length of a line. - 'max-len': ['warn', 120, 2, { - 'ignoreUrls': true, - 'ignoreComments': false, - 'ignoreRegExpLiterals': true, - 'ignoreStrings': true, - 'ignoreTemplateLiterals': true, + "max-len": ["warn", 120, 2, { + "ignoreUrls": true, + "ignoreComments": false, + "ignoreRegExpLiterals": true, + "ignoreStrings": true, + "ignoreTemplateLiterals": true }], // Enforces consistent spacing between keys and values in object literal properties. - 'key-spacing': ['error', {'align': { - 'beforeColon': false, - 'afterColon': true, - 'on': 'value' + "key-spacing": ["error", {"align": { + "beforeColon": false, + "afterColon": true, + "on": "value" }}], // Prohibits padding inside curly braces. - 'object-curly-spacing': ['error', 'never'], - 'no-use-before-define': 'off', // messageAPI - 'default-case': 'off', - - 'flowtype/boolean-style': ['error', 'boolean'], - 'flowtype/define-flow-type': 'warn', - 'flowtype/generic-spacing': ['error', 'never'], - 'flowtype/no-primitive-constructor-types': 'error', - 'flowtype/no-weak-types': 'error', - 'flowtype/object-type-delimiter': ['error', 'comma'], - 'flowtype/require-valid-file-annotation': 'error', - 'flowtype/semi': ['error', 'always'], - 'flowtype/space-after-type-colon': ['error', 'always'], - 'flowtype/space-before-generic-bracket': ['error', 'never'], - 'flowtype/space-before-type-colon': ['error', 'never'], - 'flowtype/union-intersection-spacing': ['error', 'always'], - 'flowtype/use-flow-type': 'warn', - 'flowtype/valid-syntax': 'warn', + "object-curly-spacing": ["error", "never"], + "no-use-before-define": "off", // message types + "default-case": "off" }, - 'settings': { - 'flowtype': { - 'onlyFilesWithFlowAnnotation': true, + "settings": { + "import/resolver": { + "node": { + "paths": ["components"] // import './components/Component' -> import 'Component' + } + }, + "flowtype": { + "onlyFilesWithFlowAnnotation": true } - }, + } } diff --git a/dashboard/assets/.flowconfig b/dashboard/assets/.flowconfig index 8051ae5de50d..9104d62a537d 100644 --- a/dashboard/assets/.flowconfig +++ b/dashboard/assets/.flowconfig @@ -7,3 +7,5 @@ node_modules/jss/flow-typed [options] include_warnings=true +module.system.node.resolve_dirname=node_modules +module.system.node.resolve_dirname=components diff --git a/dashboard/assets/common.jsx b/dashboard/assets/common.jsx index ed2f411fc6a5..f2750ee33bb7 100644 --- a/dashboard/assets/common.jsx +++ b/dashboard/assets/common.jsx @@ -16,43 +16,46 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +import {faHome, faLink, faGlobeEurope, faTachometerAlt, faList} from '@fortawesome/free-solid-svg-icons'; +import {faCreditCard} from '@fortawesome/free-regular-svg-icons'; + type ProvidedMenuProp = {|title: string, icon: string|}; const menuSkeletons: Array<{|id: string, menu: ProvidedMenuProp|}> = [ { id: 'home', menu: { title: 'Home', - icon: 'home', + icon: faHome, }, }, { id: 'chain', menu: { title: 'Chain', - icon: 'link', + icon: faLink, }, }, { id: 'txpool', menu: { title: 'TxPool', - icon: 'credit-card', + icon: faCreditCard, }, }, { id: 'network', menu: { title: 'Network', - icon: 'globe', + icon: faGlobeEurope, }, }, { id: 'system', menu: { title: 'System', - icon: 'tachometer', + icon: faTachometerAlt, }, }, { id: 'logs', menu: { title: 'Logs', - icon: 'list', + icon: faList, }, }, ]; @@ -64,8 +67,26 @@ export const MENU: Map = new Map(menuSkeletons.map(({id, export const DURATION = 200; +export const chartStrokeWidth = 0.2; + export const styles = { light: { color: 'rgba(255, 255, 255, 0.54)', }, }; + +// unit contains the units for the bytePlotter. +export const unit = ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi']; + +// simplifyBytes returns the simplified version of the given value followed by the unit. +export const simplifyBytes = (x: number) => { + let i = 0; + for (; x > 1024 && i < 8; i++) { + x /= 1024; + } + return x.toFixed(2).toString().concat(' ', unit[i], 'B'); +}; + +// hues contains predefined colors for gradient stop colors. +export const hues = ['#00FF00', '#FFFF00', '#FF7F00', '#FF0000']; +export const hueScale = [0, 2048, 102400, 2097152]; diff --git a/dashboard/assets/components/ChartRow.jsx b/dashboard/assets/components/ChartRow.jsx index 1075346fe40a..08da823cf29d 100644 --- a/dashboard/assets/components/ChartRow.jsx +++ b/dashboard/assets/components/ChartRow.jsx @@ -19,7 +19,7 @@ import React, {Component} from 'react'; import type {ChildrenArray} from 'react'; -import Grid from 'material-ui/Grid'; +import Grid from '@material-ui/core/Grid'; // styles contains the constant styles of the component. const styles = { @@ -33,7 +33,7 @@ const styles = { flex: 1, padding: 0, }, -} +}; export type Props = { children: ChildrenArray>, diff --git a/dashboard/assets/components/CustomTooltip.jsx b/dashboard/assets/components/CustomTooltip.jsx index f597c1caf2c8..52d005e54bbe 100644 --- a/dashboard/assets/components/CustomTooltip.jsx +++ b/dashboard/assets/components/CustomTooltip.jsx @@ -18,8 +18,8 @@ import React, {Component} from 'react'; -import Typography from 'material-ui/Typography'; -import {styles} from '../common'; +import Typography from '@material-ui/core/Typography'; +import {styles, simplifyBytes} from '../common'; // multiplier multiplies a number by another. export const multiplier = (by: number = 1) => (x: number) => x * by; @@ -37,18 +37,6 @@ export const percentPlotter = (text: string, mapper: (T => T) = multiplier(1) ); }; -// unit contains the units for the bytePlotter. -const unit = ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi']; - -// simplifyBytes returns the simplified version of the given value followed by the unit. -const simplifyBytes = (x: number) => { - let i = 0; - for (; x > 1024 && i < 8; i++) { - x /= 1024; - } - return x.toFixed(2).toString().concat(' ', unit[i], 'B'); -}; - // bytePlotter renders a tooltip, which displays the payload as a byte value. export const bytePlotter = (text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => { const p = mapper(payload); @@ -70,7 +58,8 @@ export const bytePerSecPlotter = (text: string, mapper: (T => T) = multiplier } return ( - {text} {simplifyBytes(p)}/s + {text} + {simplifyBytes(p)}/s ); }; diff --git a/dashboard/assets/components/Dashboard.jsx b/dashboard/assets/components/Dashboard.jsx index 63c2186ada88..944d50090717 100644 --- a/dashboard/assets/components/Dashboard.jsx +++ b/dashboard/assets/components/Dashboard.jsx @@ -17,14 +17,16 @@ // along with the go-ethereum library. If not, see . import React, {Component} from 'react'; +import {hot} from 'react-hot-loader'; -import withStyles from 'material-ui/styles/withStyles'; +import withStyles from '@material-ui/core/styles/withStyles'; -import Header from './Header'; -import Body from './Body'; +import Header from 'Header'; +import Body from 'Body'; +import {inserter as logInserter, SAME} from 'Logs'; +import {inserter as peerInserter} from 'Network'; import {MENU} from '../common'; import type {Content} from '../types/content'; -import {inserter as logInserter} from './Logs'; // deepUpdate updates an object corresponding to the given update data, which has // the shape of the same structure as the original object. updater also has the same @@ -37,7 +39,6 @@ import {inserter as logInserter} from './Logs'; // of the update. const deepUpdate = (updater: Object, update: Object, prev: Object): $Shape => { if (typeof update === 'undefined') { - // TODO (kurkomisi): originally this was deep copy, investigate it. return prev; } if (typeof updater === 'function') { @@ -88,8 +89,13 @@ const defaultContent: () => Content = () => ({ home: {}, chain: {}, txpool: {}, - network: {}, - system: { + network: { + peers: { + bundles: {}, + }, + diff: [], + }, + system: { activeMemory: [], virtualMemory: [], networkIngress: [], @@ -103,8 +109,8 @@ const defaultContent: () => Content = () => ({ chunks: [], endTop: false, endBottom: true, - topChanged: 0, - bottomChanged: 0, + topChanged: SAME, + bottomChanged: SAME, }, }); @@ -119,7 +125,7 @@ const updaters = { home: null, chain: null, txpool: null, - network: null, + network: peerInserter(200), system: { activeMemory: appender(200), virtualMemory: appender(200), @@ -186,8 +192,8 @@ class Dashboard extends Component { // reconnect establishes a websocket connection with the server, listens for incoming messages // and tries to reconnect on connection loss. reconnect = () => { - // PROD is defined by webpack. - const server = new WebSocket(`${((window.location.protocol === 'https:') ? 'wss://' : 'ws://')}${PROD ? window.location.host : 'localhost:8080'}/api`); + const host = process.env.NODE_ENV === 'production' ? window.location.host : 'localhost:8080'; + const server = new WebSocket(`${((window.location.protocol === 'https:') ? 'wss://' : 'ws://')}${host}/api`); server.onopen = () => { this.setState({content: defaultContent(), shouldUpdate: {}, server}); }; @@ -249,4 +255,4 @@ class Dashboard extends Component { } } -export default withStyles(themeStyles)(Dashboard); +export default hot(module)(withStyles(themeStyles)(Dashboard)); diff --git a/dashboard/assets/components/Footer.jsx b/dashboard/assets/components/Footer.jsx index 20830cbba86e..a5cab08aabe4 100644 --- a/dashboard/assets/components/Footer.jsx +++ b/dashboard/assets/components/Footer.jsx @@ -18,14 +18,19 @@ import React, {Component} from 'react'; -import withStyles from 'material-ui/styles/withStyles'; -import Typography from 'material-ui/Typography'; -import Grid from 'material-ui/Grid'; -import {ResponsiveContainer, AreaChart, Area, Tooltip} from 'recharts'; - -import ChartRow from './ChartRow'; -import CustomTooltip, {bytePlotter, bytePerSecPlotter, percentPlotter, multiplier} from './CustomTooltip'; -import {styles as commonStyles} from '../common'; +import withStyles from '@material-ui/core/styles/withStyles'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import ResponsiveContainer from 'recharts/es6/component/ResponsiveContainer'; +import AreaChart from 'recharts/es6/chart/AreaChart'; +import Area from 'recharts/es6/cartesian/Area'; +import ReferenceLine from 'recharts/es6/cartesian/ReferenceLine'; +import Label from 'recharts/es6/component/Label'; +import Tooltip from 'recharts/es6/component/Tooltip'; + +import ChartRow from 'ChartRow'; +import CustomTooltip, {bytePlotter, bytePerSecPlotter, percentPlotter, multiplier} from 'CustomTooltip'; +import {chartStrokeWidth, styles as commonStyles} from '../common'; import type {General, System} from '../types/content'; const FOOTER_SYNC_ID = 'footerSyncId'; @@ -38,6 +43,15 @@ const TRAFFIC = 'traffic'; const TOP = 'Top'; const BOTTOM = 'Bottom'; +const cpuLabelTop = 'Process load'; +const cpuLabelBottom = 'System load'; +const memoryLabelTop = 'Active memory'; +const memoryLabelBottom = 'Virtual memory'; +const diskLabelTop = 'Disk read'; +const diskLabelBottom = 'Disk write'; +const trafficLabelTop = 'Download'; +const trafficLabelBottom = 'Upload'; + // styles contains the constant styles of the component. const styles = { footer: { @@ -53,6 +67,10 @@ const styles = { height: '100%', width: '99%', }, + link: { + color: 'inherit', + textDecoration: 'none', + }, }; // themeStyles returns the styles generated from the theme for the component. @@ -73,18 +91,23 @@ export type Props = { shouldUpdate: Object, }; +type State = {}; + // Footer renders the footer of the dashboard. -class Footer extends Component { - shouldComponentUpdate(nextProps) { +class Footer extends Component { + shouldComponentUpdate(nextProps: Readonly, nextState: Readonly, nextContext: any) { return typeof nextProps.shouldUpdate.general !== 'undefined' || typeof nextProps.shouldUpdate.system !== 'undefined'; } // halfHeightChart renders an area chart with half of the height of its parent. - halfHeightChart = (chartProps, tooltip, areaProps) => ( + halfHeightChart = (chartProps, tooltip, areaProps, label, position) => ( - + {!tooltip || (} />)} - + + + ); @@ -111,6 +134,8 @@ class Footer extends Component { }, topChart.tooltip, {dataKey: topKey, stroke: topColor, fill: topColor}, + topChart.label, + 'insideBottomLeft', )} {this.halfHeightChart( { @@ -120,6 +145,8 @@ class Footer extends Component { }, bottomChart.tooltip, {dataKey: bottomKey, stroke: bottomColor, fill: bottomColor}, + bottomChart.label, + 'insideTopLeft', )}
); @@ -135,37 +162,42 @@ class Footer extends Component { {this.doubleChart( FOOTER_SYNC_ID, CPU, - {data: system.processCPU, tooltip: percentPlotter('Process load')}, - {data: system.systemCPU, tooltip: percentPlotter('System load', multiplier(-1))}, + {data: system.processCPU, tooltip: percentPlotter(cpuLabelTop), label: cpuLabelTop}, + {data: system.systemCPU, tooltip: percentPlotter(cpuLabelBottom, multiplier(-1)), label: cpuLabelBottom}, )} {this.doubleChart( FOOTER_SYNC_ID, MEMORY, - {data: system.activeMemory, tooltip: bytePlotter('Active memory')}, - {data: system.virtualMemory, tooltip: bytePlotter('Virtual memory', multiplier(-1))}, + {data: system.activeMemory, tooltip: bytePlotter(memoryLabelTop), label: memoryLabelTop}, + {data: system.virtualMemory, tooltip: bytePlotter(memoryLabelBottom, multiplier(-1)), label: memoryLabelBottom}, )} {this.doubleChart( FOOTER_SYNC_ID, DISK, - {data: system.diskRead, tooltip: bytePerSecPlotter('Disk read')}, - {data: system.diskWrite, tooltip: bytePerSecPlotter('Disk write', multiplier(-1))}, + {data: system.diskRead, tooltip: bytePerSecPlotter(diskLabelTop), label: diskLabelTop}, + {data: system.diskWrite, tooltip: bytePerSecPlotter(diskLabelBottom, multiplier(-1)), label: diskLabelBottom}, )} {this.doubleChart( FOOTER_SYNC_ID, TRAFFIC, - {data: system.networkIngress, tooltip: bytePerSecPlotter('Download')}, - {data: system.networkEgress, tooltip: bytePerSecPlotter('Upload', multiplier(-1))}, + {data: system.networkIngress, tooltip: bytePerSecPlotter(trafficLabelTop), label: trafficLabelTop}, + {data: system.networkEgress, tooltip: bytePerSecPlotter(trafficLabelBottom, multiplier(-1)), label: trafficLabelBottom}, )} - + Geth {general.version} {general.commit && ( {'Commit '} -
+ {general.commit.substring(0, 8)} diff --git a/dashboard/assets/components/Header.jsx b/dashboard/assets/components/Header.jsx index 43bd2bede2db..063e82d0ad87 100644 --- a/dashboard/assets/components/Header.jsx +++ b/dashboard/assets/components/Header.jsx @@ -18,13 +18,13 @@ import React, {Component} from 'react'; -import withStyles from 'material-ui/styles/withStyles'; -import AppBar from 'material-ui/AppBar'; -import Toolbar from 'material-ui/Toolbar'; -import IconButton from 'material-ui/IconButton'; -import Icon from 'material-ui/Icon'; -import MenuIcon from 'material-ui-icons/Menu'; -import Typography from 'material-ui/Typography'; +import withStyles from '@material-ui/core/styles/withStyles'; +import AppBar from '@material-ui/core/AppBar'; +import Toolbar from '@material-ui/core/Toolbar'; +import IconButton from '@material-ui/core/IconButton'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faBars} from '@fortawesome/free-solid-svg-icons'; +import Typography from '@material-ui/core/Typography'; // styles contains the constant styles of the component. const styles = { @@ -67,9 +67,7 @@ class Header extends Component { - - - + Go Ethereum Dashboard diff --git a/dashboard/assets/components/Logs.jsx b/dashboard/assets/components/Logs.jsx index 57d6328d35f9..3359287d4673 100644 --- a/dashboard/assets/components/Logs.jsx +++ b/dashboard/assets/components/Logs.jsx @@ -18,7 +18,8 @@ import React, {Component} from 'react'; -import List, {ListItem} from 'material-ui/List'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; import escapeHtml from 'escape-html'; import type {Record, Content, LogsMessage, Logs as LogsType} from '../types/content'; @@ -104,9 +105,9 @@ const createChunk = (records: Array) => { // ADDED, SAME and REMOVED are used to track the change of the log chunk array. // The scroll position is set using these values. -const ADDED = 1; -const SAME = 0; -const REMOVED = -1; +export const ADDED = 1; +export const SAME = 0; +export const REMOVED = -1; // inserter is a state updater function for the main component, which inserts the new log chunk into the chunk array. // limit is the maximum length of the chunk array, used in order to prevent the browser from OOM. @@ -166,7 +167,7 @@ export const inserter = (limit: number) => (update: LogsMessage, prev: LogsType) // styles contains the constant styles of the component. const styles = { logListItem: { - padding: 0, + padding: 0, lineHeight: 1.231, }, logChunk: { @@ -251,15 +252,15 @@ class Logs extends Component { // atBottom checks if the scroll position it at the bottom of the container. atBottom = () => { const {container} = this.props; - return container.scrollHeight - container.scrollTop <= - container.clientHeight + container.scrollHeight * requestBand; + return container.scrollHeight - container.scrollTop + <= container.clientHeight + container.scrollHeight * requestBand; }; // beforeUpdate is called by the parent component, saves the previous scroll position // and the height of the first log chunk, which can be deleted during the insertion. beforeUpdate = () => { let firstHeight = 0; - let chunkList = this.content.children[1]; + const chunkList = this.content.children[1]; if (chunkList && chunkList.children[0]) { firstHeight = chunkList.children[0].clientHeight; } diff --git a/dashboard/assets/components/Main.jsx b/dashboard/assets/components/Main.jsx index 0018aaf75fbb..5bb13abd4941 100644 --- a/dashboard/assets/components/Main.jsx +++ b/dashboard/assets/components/Main.jsx @@ -18,11 +18,12 @@ import React, {Component} from 'react'; -import withStyles from 'material-ui/styles/withStyles'; +import withStyles from '@material-ui/core/styles/withStyles'; +import Network from 'Network'; +import Logs from 'Logs'; +import Footer from 'Footer'; import {MENU} from '../common'; -import Logs from './Logs'; -import Footer from './Footer'; import type {Content} from '../types/content'; // styles contains the constant styles of the component. @@ -33,7 +34,7 @@ const styles = { width: '100%', }, content: { - flex: 1, + flex: 1, overflow: 'auto', }, }; @@ -54,21 +55,16 @@ export type Props = { send: string => void, }; +type State = {}; + // Main renders the chosen content. -class Main extends Component { +class Main extends Component { constructor(props) { super(props); this.container = React.createRef(); this.content = React.createRef(); } - getSnapshotBeforeUpdate() { - if (this.content && typeof this.content.beforeUpdate === 'function') { - return this.content.beforeUpdate(); - } - return null; - } - componentDidUpdate(prevProps, prevState, snapshot) { if (this.content && typeof this.content.didUpdate === 'function') { this.content.didUpdate(prevProps, prevState, snapshot); @@ -81,6 +77,13 @@ class Main extends Component { } }; + getSnapshotBeforeUpdate(prevProps: Readonly

, prevState: Readonly) { + if (this.content && typeof this.content.beforeUpdate === 'function') { + return this.content.beforeUpdate(); + } + return null; + } + render() { const { classes, active, content, shouldUpdate, @@ -89,9 +92,20 @@ class Main extends Component { let children = null; switch (active) { case MENU.get('home').id: + children =

Work in progress.
; + break; case MENU.get('chain').id: + children =
Work in progress.
; + break; case MENU.get('txpool').id: + children =
Work in progress.
; + break; case MENU.get('network').id: + children = ; + break; case MENU.get('system').id: children =
Work in progress.
; break; diff --git a/dashboard/assets/components/Network.jsx b/dashboard/assets/components/Network.jsx new file mode 100644 index 000000000000..3a52892eede5 --- /dev/null +++ b/dashboard/assets/components/Network.jsx @@ -0,0 +1,529 @@ +// @flow + +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +import React, {Component} from 'react'; + +import Table from '@material-ui/core/Table'; +import TableHead from '@material-ui/core/TableHead'; +import TableBody from '@material-ui/core/TableBody'; +import TableRow from '@material-ui/core/TableRow'; +import TableCell from '@material-ui/core/TableCell'; +import Grid from '@material-ui/core/Grid/Grid'; +import Typography from '@material-ui/core/Typography'; +import {AreaChart, Area, Tooltip, YAxis} from 'recharts'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faCircle as fasCircle} from '@fortawesome/free-solid-svg-icons'; +import {faCircle as farCircle} from '@fortawesome/free-regular-svg-icons'; +import convert from 'color-convert'; + +import CustomTooltip, {bytePlotter, multiplier} from 'CustomTooltip'; +import type {Network as NetworkType, PeerEvent} from '../types/content'; +import {styles as commonStyles, chartStrokeWidth, hues, hueScale} from '../common'; + +// Peer chart dimensions. +const trafficChartHeight = 18; +const trafficChartWidth = 400; + +// setMaxIngress adjusts the peer chart's gradient values based on the given value. +const setMaxIngress = (peer, value) => { + peer.maxIngress = value; + peer.ingressGradient = []; + peer.ingressGradient.push({offset: hueScale[0], color: hues[0]}); + let i = 1; + for (; i < hues.length && value > hueScale[i]; i++) { + peer.ingressGradient.push({offset: Math.floor(hueScale[i] * 100 / value), color: hues[i]}); + } + i--; + if (i < hues.length - 1) { + // Usually the maximum value gets between two points on the predefined + // color scale (e.g. 123KB is somewhere between 100KB (#FFFF00) and + // 1MB (#FF0000)), and the charts need to be comparable by the colors, + // so we have to calculate the last hue using the maximum value and the + // surrounding hues in order to avoid the uniformity of the top colors + // on the charts. For this reason the two hues are translated into the + // CIELAB color space, and the top color will be their weighted average + // (CIELAB is perceptually uniform, meaning that any point on the line + // between two pure color points is also a pure color, so the weighted + // average will not lose from the saturation). + // + // In case the maximum value is greater than the biggest predefined + // scale value, the top of the chart will have uniform color. + const lastHue = convert.hex.lab(hues[i]); + const proportion = (value - hueScale[i]) * 100 / (hueScale[i + 1] - hueScale[i]); + convert.hex.lab(hues[i + 1]).forEach((val, j) => { + lastHue[j] = (lastHue[j] * proportion + val * (100 - proportion)) / 100; + }); + peer.ingressGradient.push({offset: 100, color: `#${convert.lab.hex(lastHue)}`}); + } +}; + +// setMaxEgress adjusts the peer chart's gradient values based on the given value. +// In case of the egress the chart is upside down, so the gradients need to be +// calculated inversely compared to the ingress. +const setMaxEgress = (peer, value) => { + peer.maxEgress = value; + peer.egressGradient = []; + peer.egressGradient.push({offset: 100 - hueScale[0], color: hues[0]}); + let i = 1; + for (; i < hues.length && value > hueScale[i]; i++) { + peer.egressGradient.unshift({offset: 100 - Math.floor(hueScale[i] * 100 / value), color: hues[i]}); + } + i--; + if (i < hues.length - 1) { + // Calculate the last hue. + const lastHue = convert.hex.lab(hues[i]); + const proportion = (value - hueScale[i]) * 100 / (hueScale[i + 1] - hueScale[i]); + convert.hex.lab(hues[i + 1]).forEach((val, j) => { + lastHue[j] = (lastHue[j] * proportion + val * (100 - proportion)) / 100; + }); + peer.egressGradient.unshift({offset: 0, color: `#${convert.lab.hex(lastHue)}`}); + } +}; + + +// setIngressChartAttributes searches for the maximum value of the ingress +// samples, and adjusts the peer chart's gradient values accordingly. +const setIngressChartAttributes = (peer) => { + let max = 0; + peer.ingress.forEach(({value}) => { + if (value > max) { + max = value; + } + }); + setMaxIngress(peer, max); +}; + +// setEgressChartAttributes searches for the maximum value of the egress +// samples, and adjusts the peer chart's gradient values accordingly. +const setEgressChartAttributes = (peer) => { + let max = 0; + peer.egress.forEach(({value}) => { + if (value > max) { + max = value; + } + }); + setMaxEgress(peer, max); +}; + +// inserter is a state updater function for the main component, which handles the peers. +export const inserter = (sampleLimit: number) => (update: NetworkType, prev: NetworkType) => { + // The first message contains the metered peer history. + if (update.peers && update.peers.bundles) { + prev.peers = update.peers; + Object.values(prev.peers.bundles).forEach((bundle) => { + if (bundle.knownPeers) { + Object.values(bundle.knownPeers).forEach((peer) => { + if (!peer.maxIngress) { + setIngressChartAttributes(peer); + } + if (!peer.maxEgress) { + setEgressChartAttributes(peer); + } + }); + } + }); + } + if (Array.isArray(update.diff)) { + update.diff.forEach((event: PeerEvent) => { + if (!event.ip) { + console.error('Peer event without IP', event); + return; + } + switch (event.remove) { + case 'bundle': { + delete prev.peers.bundles[event.ip]; + return; + } + case 'known': { + if (!event.id) { + console.error('Remove known peer event without ID', event.ip); + return; + } + const bundle = prev.peers.bundles[event.ip]; + if (!bundle || !bundle.knownPeers || !bundle.knownPeers[event.id]) { + console.error('No known peer to remove', event.ip, event.id); + return; + } + delete bundle.knownPeers[event.id]; + return; + } + case 'attempt': { + const bundle = prev.peers.bundles[event.ip]; + if (!bundle || !Array.isArray(bundle.attempts) || bundle.attempts.length < 1) { + console.error('No unknown peer to remove', event.ip); + return; + } + bundle.attempts.splice(0, 1); + return; + } + } + if (!prev.peers.bundles[event.ip]) { + prev.peers.bundles[event.ip] = { + location: { + country: '', + city: '', + latitude: 0, + longitude: 0, + }, + knownPeers: {}, + attempts: [], + }; + } + const bundle = prev.peers.bundles[event.ip]; + if (event.location) { + bundle.location = event.location; + return; + } + if (!event.id) { + if (!bundle.attempts) { + bundle.attempts = []; + } + bundle.attempts.push({ + connected: event.connected, + disconnected: event.disconnected, + }); + return; + } + if (!bundle.knownPeers) { + bundle.knownPeers = {}; + } + if (!bundle.knownPeers[event.id]) { + bundle.knownPeers[event.id] = { + connected: [], + disconnected: [], + ingress: [], + egress: [], + active: false, + }; + } + const peer = bundle.knownPeers[event.id]; + if (!peer.maxIngress) { + setIngressChartAttributes(peer); + } + if (!peer.maxEgress) { + setEgressChartAttributes(peer); + } + if (event.connected) { + if (!peer.connected) { + console.warn('peer.connected should exist'); + peer.connected = []; + } + peer.connected.push(event.connected); + } + if (event.disconnected) { + if (!peer.disconnected) { + console.warn('peer.disconnected should exist'); + peer.disconnected = []; + } + peer.disconnected.push(event.disconnected); + } + switch (event.activity) { + case 'active': + peer.active = true; + break; + case 'inactive': + peer.active = false; + break; + } + if (Array.isArray(event.ingress) && Array.isArray(event.egress)) { + if (event.ingress.length !== event.egress.length) { + console.error('Different traffic sample length', event); + return; + } + // Check if there is a new maximum value, and reset the colors in case. + let maxIngress = peer.maxIngress; + event.ingress.forEach(({value}) => { + if (value > maxIngress) { + maxIngress = value; + } + }); + if (maxIngress > peer.maxIngress) { + setMaxIngress(peer, maxIngress); + } + // Push the new values. + peer.ingress.splice(peer.ingress.length, 0, ...event.ingress); + const ingressDiff = peer.ingress.length - sampleLimit; + if (ingressDiff > 0) { + // Check if the maximum value is in the beginning. + let i = 0; + while (i < ingressDiff && peer.ingress[i].value < peer.maxIngress) { + i++; + } + // Remove the old values from the beginning. + peer.ingress.splice(0, ingressDiff); + if (i < ingressDiff) { + // Reset the colors if the maximum value leaves the chart. + setIngressChartAttributes(peer); + } + } + // Check if there is a new maximum value, and reset the colors in case. + let maxEgress = peer.maxEgress; + event.egress.forEach(({value}) => { + if (value > maxEgress) { + maxEgress = value; + } + }); + if (maxEgress > peer.maxEgress) { + setMaxEgress(peer, maxEgress); + } + // Push the new values. + peer.egress.splice(peer.egress.length, 0, ...event.egress); + const egressDiff = peer.egress.length - sampleLimit; + if (egressDiff > 0) { + // Check if the maximum value is in the beginning. + let i = 0; + while (i < egressDiff && peer.egress[i].value < peer.maxEgress) { + i++; + } + // Remove the old values from the beginning. + peer.egress.splice(0, egressDiff); + if (i < egressDiff) { + // Reset the colors if the maximum value leaves the chart. + setEgressChartAttributes(peer); + } + } + } + }); + } + return prev; +}; + +// styles contains the constant styles of the component. +const styles = { + tableHead: { + height: 'auto', + }, + tableRow: { + height: 'auto', + }, + tableCell: { + paddingTop: 0, + paddingRight: 5, + paddingBottom: 0, + paddingLeft: 5, + border: 'none', + }, +}; + +export type Props = { + container: Object, + content: NetworkType, + shouldUpdate: Object, +}; + +type State = {}; + +// Network renders the network page. +class Network extends Component { + componentDidMount() { + const {container} = this.props; + if (typeof container === 'undefined') { + return; + } + container.scrollTop = 0; + } + + formatTime = (t: string) => { + const time = new Date(t); + if (isNaN(time)) { + return ''; + } + const month = `0${time.getMonth() + 1}`.slice(-2); + const date = `0${time.getDate()}`.slice(-2); + const hours = `0${time.getHours()}`.slice(-2); + const minutes = `0${time.getMinutes()}`.slice(-2); + const seconds = `0${time.getSeconds()}`.slice(-2); + return `${month}/${date}/${hours}:${minutes}:${seconds}`; + }; + + copyToClipboard = (id) => (event) => { + event.preventDefault(); + navigator.clipboard.writeText(id).then(() => {}, () => { + console.error("Failed to copy node id", id); + }); + }; + + peerTableRow = (ip, id, bundle, peer) => { + const ingressValues = peer.ingress.map(({value}) => ({ingress: value || 0.001})); + const egressValues = peer.egress.map(({value}) => ({egress: -value || -0.001})); + + return ( + + + {peer.active + ? + : + } + + + {id.substring(0, 10)} + + + {bundle.location ? (() => { + const l = bundle.location; + return `${l.country ? l.country : ''}${l.city ? `/${l.city}` : ''}`; + })() : ''} + + + + + + {peer.ingressGradient + && peer.ingressGradient.map(({offset, color}, i) => ( + + ))} + + + } /> + Math.max(dataMax, 0)]} /> + + + + + + {peer.egressGradient + && peer.egressGradient.map(({offset, color}, i) => ( + + ))} + + + } /> + Math.min(dataMin, 0), -0.001]} /> + + + + + ); + }; + + render() { + return ( + + + + + + + Node ID + Location + Traffic + + + + {Object.entries(this.props.content.peers.bundles).map(([ip, bundle]) => { + if (!bundle.knownPeers || Object.keys(bundle.knownPeers).length < 1) { + return null; + } + return Object.entries(bundle.knownPeers).map(([id, peer]) => { + if (peer.active === false) { + return null; + } + return this.peerTableRow(ip, id, bundle, peer); + }); + })} + + + {Object.entries(this.props.content.peers.bundles).map(([ip, bundle]) => { + if (!bundle.knownPeers || Object.keys(bundle.knownPeers).length < 1) { + return null; + } + return Object.entries(bundle.knownPeers).map(([id, peer]) => { + if (peer.active === true) { + return null; + } + return this.peerTableRow(ip, id, bundle, peer); + }); + })} + +
+
+ + + Connection attempts + + + + + IP + Location + Nr + + + + {Object.entries(this.props.content.peers.bundles).map(([ip, bundle]) => { + if (!bundle.attempts || bundle.attempts.length < 1) { + return null; + } + return ( + + {ip} + + {bundle.location ? (() => { + const l = bundle.location; + return `${l.country ? l.country : ''}${l.city ? `/${l.city}` : ''}`; + })() : ''} + + + {Object.values(bundle.attempts).length} + + + ); + })} + +
+
+
+ ); + } +} + +export default Network; diff --git a/dashboard/assets/components/SideBar.jsx b/dashboard/assets/components/SideBar.jsx index 463d6cb40fb3..301e458d17ab 100644 --- a/dashboard/assets/components/SideBar.jsx +++ b/dashboard/assets/components/SideBar.jsx @@ -18,11 +18,14 @@ import React, {Component} from 'react'; -import withStyles from 'material-ui/styles/withStyles'; -import List, {ListItem, ListItemIcon, ListItemText} from 'material-ui/List'; -import Icon from 'material-ui/Icon'; +import withStyles from '@material-ui/core/styles/withStyles'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import Icon from '@material-ui/core/Icon'; import Transition from 'react-transition-group/Transition'; -import {Icon as FontAwesome} from 'react-fa'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {MENU, DURATION} from '../common'; @@ -48,6 +51,7 @@ const themeStyles = theme => ({ }, icon: { fontSize: theme.spacing.unit * 3, + overflow: 'unset', }, }); @@ -57,9 +61,11 @@ export type Props = { changeContent: string => void, }; +type State = {} + // SideBar renders the sidebar of the dashboard. -class SideBar extends Component { - shouldComponentUpdate(nextProps) { +class SideBar extends Component { + shouldComponentUpdate(nextProps: Readonly, nextState: Readonly, nextContext: any) { return nextProps.opened !== this.props.opened; } @@ -78,7 +84,7 @@ class SideBar extends Component { - + content + .replace(/src.*url(?!.*url.*(\.eot)).*(\.eot)[^;]*;/, '') + .replace(/url(?!.*url.*(\.eot)).*(\.eot)[^,]*,/, '') + .replace(/url(?!.*url.*(\.ttf)).*(\.ttf)[^,]*,/, '') + .replace(/,[^,]*url(?!.*url.*(\.svg)).*(\.svg)[^;]*;/, ';'); diff --git a/dashboard/assets/index.html b/dashboard/assets/index.html index 1211d1521b62..fbfb7f004e14 100644 --- a/dashboard/assets/index.html +++ b/dashboard/assets/index.html @@ -21,6 +21,6 @@
- + diff --git a/dashboard/assets/index.jsx b/dashboard/assets/index.jsx index 4ee567b01bd1..a08911aa8aeb 100644 --- a/dashboard/assets/index.jsx +++ b/dashboard/assets/index.jsx @@ -19,12 +19,15 @@ import React from 'react'; import {render} from 'react-dom'; -import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; -import createMuiTheme from 'material-ui/styles/createMuiTheme'; +import MuiThemeProvider from '@material-ui/core/styles/MuiThemeProvider'; +import createMuiTheme from '@material-ui/core/styles/createMuiTheme'; import Dashboard from './components/Dashboard'; const theme: Object = createMuiTheme({ + // typography: { + // useNextVariants: true, + // }, palette: { type: 'dark', }, diff --git a/dashboard/assets/package.json b/dashboard/assets/package.json index fb1a68e5b52b..626ed288b827 100644 --- a/dashboard/assets/package.json +++ b/dashboard/assets/package.json @@ -1,48 +1,65 @@ { + "private": true, "dependencies": { - "babel-core": "^6.26.0", - "babel-eslint": "^8.2.1", - "babel-loader": "^7.1.2", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators-legacy": "^1.3.4", - "babel-plugin-transform-flow-strip-types": "^6.22.0", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-preset-env": "^1.6.1", - "babel-preset-react": "^6.24.1", - "babel-preset-stage-0": "^6.24.1", - "babel-runtime": "^6.26.0", - "classnames": "^2.2.5", - "css-loader": "^0.28.9", + "@babel/core": "7.3.4", + "@babel/plugin-proposal-class-properties": "7.3.4", + "@babel/plugin-proposal-function-bind": "7.2.0", + "@babel/plugin-transform-flow-strip-types": "7.3.4", + "@babel/preset-env": "7.3.4", + "@babel/preset-react": "^7.0.0", + "@babel/preset-stage-0": "^7.0.0", + "@fortawesome/fontawesome-free-regular": "^5.0.13", + "@fortawesome/fontawesome-svg-core": "^1.2.15", + "@fortawesome/free-regular-svg-icons": "^5.7.2", + "@fortawesome/free-solid-svg-icons": "^5.7.2", + "@fortawesome/react-fontawesome": "^0.1.4", + "@material-ui/core": "3.9.2", + "@material-ui/icons": "3.0.2", + "babel-eslint": "10.0.1", + "babel-loader": "8.0.5", + "classnames": "^2.2.6", + "color-convert": "^2.0.0", + "css-loader": "2.1.1", "escape-html": "^1.0.3", - "eslint": "^4.16.0", - "eslint-config-airbnb": "^16.1.0", - "eslint-loader": "^2.0.0", - "eslint-plugin-flowtype": "^2.41.0", - "eslint-plugin-import": "^2.8.0", - "eslint-plugin-jsx-a11y": "^6.0.3", - "eslint-plugin-react": "^7.5.1", - "file-loader": "^1.1.6", - "flow-bin": "^0.63.1", - "flow-bin-loader": "^1.0.2", - "flow-typed": "^2.2.3", - "material-ui": "^1.0.0-beta.30", - "material-ui-icons": "^1.0.0-beta.17", + "eslint": "5.15.1", + "eslint-config-airbnb": "^17.0.0", + "eslint-loader": "2.1.2", + "eslint-plugin-flowtype": "3.4.2", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-jsx-a11y": "6.2.1", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.0.1", + "eslint-plugin-react": "7.12.4", + "file-loader": "3.0.1", + "flow-bin": "0.94.0", + "flow-bin-loader": "^1.0.3", + "flow-typed": "^2.5.1", + "js-beautify": "1.9.0", "path": "^0.12.7", - "react": "^16.2.0", - "react-dom": "^16.2.0", - "react-fa": "^5.0.0", - "react-transition-group": "^2.2.1", - "recharts": "^1.0.0-beta.9", - "style-loader": "^0.19.1", + "react": "16.8.4", + "react-dom": "16.8.4", + "react-hot-loader": "4.8.0", + "react-transition-group": "2.6.1", + "recharts": "1.5.0", + "style-loader": "0.23.1", + "terser-webpack-plugin": "^1.2.3", "url": "^0.11.0", - "url-loader": "^0.6.2", - "webpack": "^3.10.0", - "webpack-dev-server": "^2.11.1" + "url-loader": "1.1.2", + "webpack": "4.29.6", + "webpack-cli": "3.2.3", + "webpack-dashboard": "3.0.0", + "webpack-dev-server": "3.2.1", + "webpack-merge": "4.2.1" }, "scripts": { - "build": "NODE_ENV=production webpack", - "stats": "webpack --profile --json > stats.json", - "dev": "webpack-dev-server --port 8081", - "flow": "flow-typed install" - } + "build": "webpack --config webpack.config.prod.js", + "stats": "webpack --config webpack.config.prod.js --profile --json > stats.json", + "dev": "webpack-dev-server --open --config webpack.config.dev.js", + "dash": "webpack-dashboard -- yarn dev", + "install-flow": "flow-typed install", + "flow": "flow status --show-all-errors", + "eslint": "eslint **/*" + }, + "sideEffects": false, + "license": "LGPL-3.0-or-later" } diff --git a/dashboard/assets/types/content.jsx b/dashboard/assets/types/content.jsx index ff82c3572d05..3086d44244bc 100644 --- a/dashboard/assets/types/content.jsx +++ b/dashboard/assets/types/content.jsx @@ -29,7 +29,6 @@ export type Content = { export type ChartEntries = Array; export type ChartEntry = { - time: Date, value: number, }; @@ -51,7 +50,50 @@ export type TxPool = { }; export type Network = { - /* TODO (kurkomisi) */ + peers: Peers, + diff: Array +}; + +export type PeerEvent = { + ip: string, + id: string, + remove: string, + location: GeoLocation, + connected: Date, + disconnected: Date, + ingress: ChartEntries, + egress: ChartEntries, + activity: string, +}; + +export type Peers = { + bundles: {[string]: PeerBundle}, +}; + +export type PeerBundle = { + location: GeoLocation, + knownPeers: {[string]: KnownPeer}, + attempts: Array, +}; + +export type KnownPeer = { + connected: Array, + disconnected: Array, + ingress: Array, + egress: Array, + active: boolean, +}; + +export type UnknownPeer = { + connected: Date, + disconnected: Date, +}; + +export type GeoLocation = { + country: string, + city: string, + latitude: number, + longitude: number, }; export type System = { diff --git a/dashboard/assets/webpack.config.common.js b/dashboard/assets/webpack.config.common.js new file mode 100644 index 000000000000..364c04f9d87b --- /dev/null +++ b/dashboard/assets/webpack.config.common.js @@ -0,0 +1,85 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +const path = require('path'); + +module.exports = { + target: 'web', + entry: { + bundle: './index', + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, ''), + sourceMapFilename: '[file].map', + }, + resolve: { + modules: [ + 'node_modules', + path.resolve(__dirname, 'components'), // import './components/Component' -> import 'Component' + ], + extensions: ['.js', '.jsx'], + }, + module: { + rules: [ + { + test: /\.jsx$/, // regexp for JSX files + exclude: /node_modules/, + use: [ // order: from bottom to top + { + loader: 'babel-loader', + options: { + presets: [ // order: from bottom to top + '@babel/env', + '@babel/react', + ], + plugins: [ // order: from top to bottom + '@babel/proposal-function-bind', // instead of stage 0 + '@babel/proposal-class-properties', // static defaultProps + '@babel/transform-flow-strip-types', + 'react-hot-loader/babel', + ], + }, + }, + // 'eslint-loader', // show errors in the console + ], + }, + { + test: /\.css$/, + oneOf: [ + { + test: /font-awesome/, + use: [ + 'style-loader', + 'css-loader', + path.resolve(__dirname, './fa-only-woff-loader.js'), + ], + }, + { + use: [ + 'style-loader', + 'css-loader', + ], + }, + ], + }, + { + test: /\.woff2?$/, // font-awesome icons + use: 'url-loader', + }, + ], + }, +}; diff --git a/dashboard/assets/webpack.config.dev.js b/dashboard/assets/webpack.config.dev.js new file mode 100644 index 000000000000..288d13fbf2f2 --- /dev/null +++ b/dashboard/assets/webpack.config.dev.js @@ -0,0 +1,35 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +const webpack = require('webpack'); +const merge = require('webpack-merge'); +const WebpackDashboard = require('webpack-dashboard/plugin'); +const common = require('./webpack.config.common.js'); + +module.exports = merge(common, { + mode: 'development', + plugins: [ + new WebpackDashboard(), + new webpack.HotModuleReplacementPlugin(), + ], + // devtool: 'eval', + devtool: 'source-map', + devServer: { + port: 8081, + hot: true, + compress: true, + }, +}); diff --git a/dashboard/assets/webpack.config.js b/dashboard/assets/webpack.config.js deleted file mode 100644 index f58d35ad1e38..000000000000 --- a/dashboard/assets/webpack.config.js +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -const webpack = require('webpack'); -const path = require('path'); - -module.exports = { - resolve: { - extensions: ['.js', '.jsx'], - }, - entry: './index', - output: { - path: path.resolve(__dirname, ''), - filename: 'bundle.js', - }, - plugins: [ - new webpack.optimize.UglifyJsPlugin({ - comments: false, - mangle: false, - beautify: true, - }), - new webpack.DefinePlugin({ - PROD: process.env.NODE_ENV === 'production', - }), - ], - module: { - rules: [ - { - test: /\.jsx$/, // regexp for JSX files - exclude: /node_modules/, - use: [ // order: from bottom to top - { - loader: 'babel-loader', - options: { - plugins: [ // order: from top to bottom - // 'transform-decorators-legacy', // @withStyles, @withTheme - 'transform-class-properties', // static defaultProps - 'transform-flow-strip-types', - ], - presets: [ // order: from bottom to top - 'env', - 'react', - 'stage-0', - ], - }, - }, - // 'eslint-loader', // show errors not only in the editor, but also in the console - ], - }, - { - test: /font-awesome\.css$/, - use: [ - 'style-loader', - 'css-loader', - path.resolve(__dirname, './fa-only-woff-loader.js'), - ], - }, - { - test: /\.woff2?$/, // font-awesome icons - use: 'url-loader', - }, - ], - }, -}; diff --git a/dashboard/assets/webpack.config.prod.js b/dashboard/assets/webpack.config.prod.js new file mode 100644 index 000000000000..a047ba5e2192 --- /dev/null +++ b/dashboard/assets/webpack.config.prod.js @@ -0,0 +1,41 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +const TerserPlugin = require('terser-webpack-plugin'); +const merge = require('webpack-merge'); +const common = require('./webpack.config.common.js'); + +module.exports = merge(common, { + mode: 'production', + devtool: 'source-map', + optimization: { + minimize: true, + namedModules: true, // Module names instead of numbers - resolves the large diff problem. + minimizer: [ + new TerserPlugin({ + cache: true, + parallel: true, + sourceMap: true, + terserOptions: { + output: { + comments: false, + beautify: true, + }, + }, + }), + ], + }, +}); diff --git a/dashboard/assets/yarn.lock b/dashboard/assets/yarn.lock index 10277c988235..0fdf5593cddf 100644 --- a/dashboard/assets/yarn.lock +++ b/dashboard/assets/yarn.lock @@ -2,1115 +2,1354 @@ # yarn lockfile v1 -"@babel/code-frame@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" - dependencies: - "@babel/highlight" "7.0.0-beta.44" +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" + integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.3.4" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.3.4" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" -"@babel/generator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" +"@babel/generator@^7.3.4", "@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/types" "^7.4.4" jsesc "^2.5.1" - lodash "^4.2.0" + lodash "^4.17.11" source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-function-name@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.44" - "@babel/template" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" + "@babel/types" "^7.0.0" -"@babel/helper-get-function-arity@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-create-class-features-plugin@^7.3.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz#fc3d690af6554cc9efc607364a82d48f58736dba" + integrity sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" -"@babel/highlight@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -"@babel/template@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - lodash "^4.2.0" - -"@babel/traverse@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/generator" "7.0.0-beta.44" - "@babel/helper-function-name" "7.0.0-beta.44" - "@babel/helper-split-export-declaration" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - debug "^3.1.0" - globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.2.0" + "@babel/types" "^7.0.0" -"@babel/types@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== dependencies: - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^2.0.0" + "@babel/types" "^7.4.4" -"@types/jss@^9.3.0": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@types/jss/-/jss-9.5.0.tgz#65d9b5c61f1e95ad3acd53e9a8b2d2342aa917e8" - dependencies: - csstype "^1.6.0" - -"@types/react-transition-group@^2.0.6": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-2.0.7.tgz#2847292d54c5685d982ae5a3ecb6960946689d87" +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== dependencies: - "@types/react" "*" - -"@types/react@*": - version "16.0.40" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.40.tgz#caabc2296886f40b67f6fc80f0f3464476461df9" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + "@babel/types" "^7.0.0" -accepts@~1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" + "@babel/types" "^7.0.0" -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== dependencies: - acorn "^4.0.3" + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== dependencies: - acorn "^3.0.4" + "@babel/types" "^7.0.0" -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - -acorn@^5.0.0, acorn@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.0.tgz#1abb587fbf051f94e3de20e6b26ef910b1828298" - -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - -ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" + lodash "^4.17.11" -ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" -ajv@^6.0.1, ajv@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.0.tgz#afac295bbaa0152449e522742e4547c1ae9328d2" +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== dependencies: - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" + "@babel/types" "^7.4.4" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" -ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" +"@babel/helpers@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" + integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== + dependencies: + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +"@babel/parser@^7.0.0", "@babel/parser@^7.3.4", "@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +"@babel/plugin-proposal-class-properties@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.4.tgz#410f5173b3dc45939f9ab30ca26684d72901405e" + integrity sha512-lUf8D3HLs4yYlAo8zjuneLvfxN7qfKv1Yzbj5vjqaqMJxgJA3Ipwp4VUJ+OrOdz53Wbww6ahwB8UhB2HQyLotA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.3.4" + "@babel/helper-plugin-utils" "^7.0.0" -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" +"@babel/plugin-proposal-function-bind@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.2.0.tgz#94dc2cdc505cafc4e225c0014335a01648056bf7" + integrity sha512-qOFJ/eX1Is78sywwTxDcsntLOdb5ZlHVVqUz5xznq8ldAfOVIyZzp1JE2rzHnaksZIhrqMrwIpQL/qcEprnVbw== dependencies: - color-convert "^1.9.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-function-bind" "^7.2.0" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" +"@babel/plugin-proposal-object-rest-spread@^7.3.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== dependencies: - sprintf-js "~1.0.2" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" -aria-query@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" + "@babel/helper-plugin-utils" "^7.0.0" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" +"@babel/plugin-syntax-flow@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" + integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== dependencies: - arr-flatten "^1.0.1" + "@babel/helper-plugin-utils" "^7.0.0" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" +"@babel/plugin-syntax-function-bind@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.2.0.tgz#68fe85b0c0da67125f87bf239c68051b06c66309" + integrity sha512-/WzU1lLU2l0wDfB42Wkg6tahrmtBbiD8C4H6EGSX0M4GAjzN6JiOpq/Uh8G6GSoR6lPMvhjM0MNiV6znj6y/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-flatten@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" +"@babel/plugin-transform-async-to-generator@^7.3.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== dependencies: - array-uniq "^1.0.1" + "@babel/helper-plugin-utils" "^7.0.0" -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" +"@babel/plugin-transform-block-scoping@^7.3.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +"@babel/plugin-transform-classes@^7.3.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +"@babel/plugin-transform-flow-strip-types@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.3.4.tgz#00156236defb7dedddc2d3c9477dcc01a4494327" + integrity sha512-PmQC9R7DwpBFA+7ATKMyzViz3zCaMNouzZMPZN2K5PnbBbtL3AXFYTkDk+Hey5crQq2A90UG5Uthz0mel+XZrA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" +"@babel/plugin-transform-for-of@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" +"@babel/plugin-transform-function-name@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== dependencies: - util "0.10.3" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -ast-types-flow@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" -async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +"@babel/plugin-transform-modules-systemjs@^7.3.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" + integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" -async@^2.1.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== dependencies: - lodash "^4.14.0" + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" -atob@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" +"@babel/plugin-transform-new-target@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" +"@babel/plugin-transform-parameters@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" + integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + dependencies: + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-regenerator@^7.3.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/polyfill@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.4.tgz#78801cf3dbe657844eeabf31c1cae3828051e893" + integrity sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + +"@babel/preset-env@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1" + integrity sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.3.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.3.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.3.4" + "@babel/plugin-transform-classes" "^7.3.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.3.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.3.4" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" -axobject-query@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" +"@babel/preset-react@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== dependencies: - ast-types-flow "0.0.7" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + +"@babel/preset-stage-0@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-stage-0/-/preset-stage-0-7.0.0.tgz#999aaec79ee8f0a763042c68c06539c97c6e0646" + integrity sha512-FBMd0IiARPtH5aaOFUVki6evHiJQiY0pFy7fizyRF7dtwc+el3nwpzvhb9qBNzceG1OIJModG1xpE0DDFjPXwA== + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" + integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.3.4", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== dependencies: - chalk "^1.1.3" esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-eslint@^8.2.1: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.3.tgz#1a2e6681cc9bc4473c32899e59915e19cd6733cf" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/traverse" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - eslint-scope "~3.7.1" - eslint-visitor-keys "^1.0.0" + lodash "^4.17.11" + to-fast-properties "^2.0.0" -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" +"@fortawesome/fontawesome-common-types@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.1.7.tgz#4336c4b06d0b5608ff1215464b66fcf9f4795284" + integrity sha512-ego8jRVSHfq/iq4KRZJKQeUAdi3ZjGNrqw4oPN3fNdvTBnLCSntwVCnc37bsAJP9UB8MhrTfPnZYxkv2vpS4pg== -babel-helper-bindify-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" +"@fortawesome/fontawesome-common-types@^0.2.19": + version "0.2.19" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.19.tgz#754a0f85e1290858152e1c05700ab502b11197f1" + integrity sha512-nd2Ul/CUs8U9sjofQYAALzOGpgkVJQgEhIJnOHaoyVR/LeC3x2mVg4eB910a4kS6WgLPebAY0M2fApEI497raQ== -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" +"@fortawesome/fontawesome-free-regular@^5.0.13": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free-regular/-/fontawesome-free-regular-5.0.13.tgz#eb78c30184e3f456a423a1dcfa0f682f7b50de4a" + integrity sha512-36lz9Idww1L4QaaTcv7GZiOeIP9emJFDUsedvRovI10kmwyd6rN0PKkIjnq0FB4foLhX4Rou8vnbCCmjtqiLug== dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@fortawesome/fontawesome-common-types" "^0.1.7" -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" +"@fortawesome/fontawesome-svg-core@^1.2.15": + version "1.2.19" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.19.tgz#0eca1ce9285c3d99e6e340633ee8f615f9d1a2e0" + integrity sha512-D4ICXg9oU08eF9o7Or392gPpjmwwgJu8ecCFusthbID95CLVXOgIyd4mOKD9Nud5Ckz+Ty59pqkNtThDKR0erA== dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" + "@fortawesome/fontawesome-common-types" "^0.2.19" -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" +"@fortawesome/free-regular-svg-icons@^5.7.2": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.9.0.tgz#b16b325bdcdf51abebc547313cb75c3ef722ca04" + integrity sha512-6ZO0jLhk/Yrso0u5pXeYYSfZiHCNoCF7SgtqStdlEX8WtWD4IOfAB1N+MlSnMo12P5KR4cmucX/K0NCOPrhJwg== dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@fortawesome/fontawesome-common-types" "^0.2.19" -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" +"@fortawesome/free-solid-svg-icons@^5.7.2": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.9.0.tgz#1c73e7bac17417d23f934d83f7fff5b100a7fda9" + integrity sha512-U8YXPfWcSozsCW0psCtlRGKjjRs5+Am5JJwLOUmVHFZbIEWzaz4YbP84EoPwUsVmSAKrisu3QeNcVOtmGml0Xw== dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" + "@fortawesome/fontawesome-common-types" "^0.2.19" -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" +"@fortawesome/react-fontawesome@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.4.tgz#18d61d9b583ca289a61aa7dccc05bd164d6bc9ad" + integrity sha512-GwmxQ+TK7PEdfSwvxtGnMCqrfEm0/HbRHArbUudsYiy9KzVCwndxa2KMcfyTQ8El0vROrq8gOOff09RF1oQe8g== dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + humps "^2.0.1" + prop-types "^15.5.10" -babel-helper-explode-class@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" +"@material-ui/core@3.9.2": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-3.9.2.tgz#41ed1a470e981d199829eb5d9317a671c66a6f7d" + integrity sha512-aukR3mSH3g115St2OnqoeMRtmxzxxx+Mch7pFKRV3Tz3URExBlZwOolimjxKZpG4LGec8HlhREawafLsDzjVWQ== dependencies: - babel-helper-bindify-decorators "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@babel/runtime" "^7.2.0" + "@material-ui/system" "^3.0.0-alpha.0" + "@material-ui/utils" "^3.0.0-alpha.2" + "@types/jss" "^9.5.6" + "@types/react-transition-group" "^2.0.8" + brcast "^3.0.1" + classnames "^2.2.5" + csstype "^2.5.2" + debounce "^1.1.0" + deepmerge "^3.0.0" + dom-helpers "^3.2.1" + hoist-non-react-statics "^3.2.1" + is-plain-object "^2.0.4" + jss "^9.8.7" + jss-camel-case "^6.0.0" + jss-default-unit "^8.0.2" + jss-global "^3.0.0" + jss-nested "^6.0.1" + jss-props-sort "^6.0.0" + jss-vendor-prefixer "^7.0.0" + normalize-scroll-left "^0.1.2" + popper.js "^1.14.1" + prop-types "^15.6.0" + react-event-listener "^0.6.2" + react-transition-group "^2.2.1" + recompose "0.28.0 - 0.30.0" + warning "^4.0.1" -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" +"@material-ui/icons@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-3.0.2.tgz#d67a6dd1ec8312d3a88ec97944a63daeef24fe10" + integrity sha512-QY/3gJnObZQ3O/e6WjH+0ah2M3MOgLOzCy8HTUoUx9B6dDrS18vP7Ycw3qrDEKlB6q1KNxy6CZHm5FCauWGy2g== dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@babel/runtime" "^7.2.0" + recompose "0.28.0 - 0.30.0" -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" +"@material-ui/system@^3.0.0-alpha.0": + version "3.0.0-alpha.2" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-3.0.0-alpha.2.tgz#096e80c8bb0f70aea435b9e38ea7749ee77b4e46" + integrity sha512-odmxQ0peKpP7RQBQ8koly06YhsPzcoVib1vByVPBH4QhwqBXuYoqlCjt02846fYspAqkrWzjxnWUD311EBbxOA== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@babel/runtime" "^7.2.0" + deepmerge "^3.0.0" + prop-types "^15.6.0" + warning "^4.0.1" -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" +"@material-ui/utils@^3.0.0-alpha.2": + version "3.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-3.0.0-alpha.3.tgz#836c62ea46f5ffc6f0b5ea05ab814704a86908b1" + integrity sha512-rwMdMZptX0DivkqBuC+Jdq7BYTXwqKai5G5ejPpuEDKpWzi1Oxp+LygGw329FrKpuKeiqpcymlqJTjmy+quWng== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@babel/runtime" "^7.2.0" + prop-types "^15.6.0" + react-is "^16.6.3" -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" +"@most/multicast@^1.2.5": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@most/multicast/-/multicast-1.3.0.tgz#e01574840df634478ac3fabd164c6e830fb3b966" + integrity sha512-DWH8AShgp5bXn+auGzf5tzPxvpmEvQJd0CNsApOci1LDF4eAEcnw4HQOr2Jaa+L92NbDYFKBSXxll+i7r1ikvw== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@most/prelude" "^1.4.0" -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" +"@most/prelude@^1.4.0": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@most/prelude/-/prelude-1.7.2.tgz#be4ed406518d4c8c220e45c39fa7251365425b73" + integrity sha512-GM5ec7+xpkuXiCMyzhyENgH/xZ8t0nAMDBY0QOsVVD6TrZYjJKUnW1eaI18HHX8W+COWMwWR9c0zoPiBp9+tUg== + +"@octokit/rest@^15.12.1": + version "15.18.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.1.tgz#ec7fb0f8775ef64dc095fae6635411d3fbff9b62" + integrity sha512-g2tecjp2TEtYV8bKAFvfQtu+W29HM7ektmWmw8zrMy9/XCKDEYRErR2YvvhN9+IxkLC4O3lDqYP4b6WgsL6Utw== dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" + before-after-hook "^1.1.0" + btoa-lite "^1.0.0" + debug "^3.1.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.0" lodash "^4.17.4" + node-fetch "^2.1.1" + universal-user-agent "^2.0.0" + url-template "^2.0.8" -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" + integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" +"@types/jss@^9.5.6": + version "9.5.8" + resolved "https://registry.yarnpkg.com/@types/jss/-/jss-9.5.8.tgz#258391f42211c042fc965508d505cbdc579baa5b" + integrity sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA== dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + csstype "^2.0.0" + indefinite-observable "^1.0.1" -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" +"@types/prop-types@*": + version "15.7.1" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.1.tgz#f1a11e7babb0c3cad68100be381d1e064c68f1f6" + integrity sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg== -babel-loader@^7.1.2: - version "7.1.4" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015" +"@types/react-transition-group@^2.0.8": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-2.9.2.tgz#c48cf2a11977c8b4ff539a1c91d259eaa627028d" + integrity sha512-5Fv2DQNO+GpdPZcxp2x/OQG/H19A01WlmpjVD9cKvVFmoVLOZ9LvBgSWG6pSXIU4og5fgbvGPaCV5+VGkWAEHA== dependencies: - find-cache-dir "^1.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" + "@types/react" "*" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" +"@types/react@*": + version "16.8.19" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.19.tgz#629154ef05e2e1985cdde94477deefd823ad9be3" + integrity sha512-QzEzjrd1zFzY9cDlbIiFvdr+YUmefuuRYrPxmkwG0UQv5XF35gFIi7a95m1bNVcFU0VimxSZ5QVGSiBmlggQXQ== dependencies: - babel-runtime "^6.22.0" + "@types/prop-types" "*" + csstype "^2.2.0" -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" -babel-plugin-syntax-class-constructor-call@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== -babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== -babel-plugin-syntax-do-expressions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== -babel-plugin-syntax-export-extensions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== -babel-plugin-syntax-function-bind@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" -babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== -babel-plugin-transform-async-generator-functions@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.22.0" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" -babel-plugin-transform-class-constructor-call@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== dependencies: - babel-plugin-syntax-class-constructor-call "^6.18.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" -babel-plugin-transform-decorators-legacy@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz#741b58f6c5bce9e6027e0882d9c994f04f366925" +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== dependencies: - babel-plugin-syntax-decorators "^6.1.18" - babel-runtime "^6.2.0" - babel-template "^6.3.0" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" -babel-plugin-transform-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" - dependencies: - babel-helper-explode-class "^6.24.1" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -babel-plugin-transform-do-expressions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" - dependencies: - babel-plugin-syntax-do-expressions "^6.8.0" - babel-runtime "^6.22.0" +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: - babel-runtime "^6.22.0" + mime-types "~2.1.24" + negotiator "0.6.2" -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" +acorn@^6.0.5, acorn@^6.0.7: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" +agent-base@4, agent-base@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + es6-promisify "^5.0.0" -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" +ajv-keywords@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" + integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" +ajv@^6.1.0, ajv@^6.9.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== dependencies: - babel-runtime "^6.22.0" + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + color-convert "^1.9.0" -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - babel-runtime "^6.22.0" + micromatch "^3.1.4" + normalize-path "^2.1.1" -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: - babel-runtime "^6.22.0" + delegates "^1.0.0" + readable-stream "^2.0.6" -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: - babel-runtime "^6.22.0" + sprintf-js "~1.0.2" -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" + ast-types-flow "0.0.7" + commander "^2.11.0" -babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -babel-plugin-transform-export-extensions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" - dependencies: - babel-plugin-syntax-export-extensions "^6.8.0" - babel-runtime "^6.22.0" +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -babel-plugin-transform-function-bind@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" - dependencies: - babel-plugin-syntax-function-bind "^6.8.0" - babel-runtime "^6.22.0" +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -babel-plugin-transform-react-display-name@^6.23.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= dependencies: - babel-runtime "^6.22.0" + define-properties "^1.1.2" + es-abstract "^1.7.0" -babel-plugin-transform-react-jsx-self@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" + array-uniq "^1.0.1" -babel-plugin-transform-react-jsx-source@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -babel-plugin-transform-runtime@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - dependencies: - babel-runtime "^6.22.0" +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" + object-assign "^4.1.1" + util "0.10.3" -babel-preset-env@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -babel-preset-flow@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" - dependencies: - babel-plugin-transform-flow-strip-types "^6.22.0" - -babel-preset-react@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" - dependencies: - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-react-display-name "^6.23.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - babel-preset-flow "^6.23.0" - -babel-preset-stage-0@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" - dependencies: - babel-plugin-transform-do-expressions "^6.22.0" - babel-plugin-transform-function-bind "^6.22.0" - babel-preset-stage-1 "^6.24.1" - -babel-preset-stage-1@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" - dependencies: - babel-plugin-transform-class-constructor-call "^6.24.1" - babel-plugin-transform-export-extensions "^6.22.0" - babel-preset-stage-2 "^6.24.1" - -babel-preset-stage-2@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.24.1" - babel-plugin-transform-decorators "^6.24.1" - babel-preset-stage-3 "^6.24.1" - -babel-preset-stage-3@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-generator-functions "^6.24.1" - babel-plugin-transform-async-to-generator "^6.24.1" - babel-plugin-transform-exponentiation-operator "^6.24.1" - babel-plugin-transform-object-rest-spread "^6.22.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +axobject-query@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" + integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" + ast-types-flow "0.0.7" -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" +babel-eslint@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" + integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ== dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" -babylon@7.0.0-beta.44: - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" +babel-loader@8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33" + integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + util.promisify "^1.0.0" -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= base64-js@^1.0.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801" + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1123,56 +1362,83 @@ base@^0.11.1: batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" +before-after-hook@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" + integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= dependencies: - tweetnacl "^0.14.3" + callsite "1.0.0" -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" +big-integer@^1.6.17: + version "1.6.44" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.44.tgz#4ee9ae5f5839fc11ade338fea216b4513454a539" + integrity sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -"binary@>= 0.3.0 < 1": +binary@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= dependencies: buffers "~0.1.1" chainsaw "~0.1.0" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +bluebird@^3.5.3: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + +bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -body-parser@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== dependencies: - bytes "3.0.0" + bytes "3.1.0" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= dependencies: array-flatten "^2.1.0" deep-equal "^1.0.1" @@ -1181,38 +1447,24 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.0, braces@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" - define-property "^1.0.0" extend-shallow "^2.0.1" fill-range "^4.0.0" isobject "^3.0.1" - kind-of "^6.0.2" repeat-element "^1.1.2" snapdragon "^0.8.1" snapdragon-node "^2.0.1" @@ -1222,14 +1474,17 @@ braces@^2.3.0, braces@^2.3.1: brcast@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/brcast/-/brcast-3.0.1.tgz#6256a8349b20de9eed44257a9b24d71493cd48dd" + integrity sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg== brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1239,24 +1494,28 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: safe-buffer "^5.0.1" browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" evp_bytestokey "^1.0.0" browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1264,6 +1523,7 @@ browserify-rsa@^4.0.0: browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" @@ -1276,34 +1536,48 @@ browserify-sign@^4.0.0: browserify-zlib@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" +browserslist@^4.3.4: + version "4.6.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.2.tgz#574c665950915c2ac73a4594b8537a9eba26203f" + integrity sha512-2neU/V0giQy9h3XMPwLhEY3+Ao0uHSwHvU8Q1Ea6AgLVL1sXbX3dzPrJ8NWe5Hi4PoTkCYXOtVR9rfRLI0J/8Q== dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" + caniuse-lite "^1.0.30000974" + electron-to-chromium "^1.3.150" + node-releases "^1.1.23" -browserslist@^2.1.2: - version "2.11.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" - dependencies: - caniuse-lite "^1.0.30000792" - electron-to-chromium "^1.3.30" +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof-polyfill@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz#a9fb806ce8145d5428510ce72f278bb363a638bf" + integrity sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8= buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1312,22 +1586,47 @@ buffer@^4.3.0: buffers@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - -builtin-modules@^1.0.0, builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^11.3.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1339,98 +1638,55 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" + integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000811" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000811.tgz#19efb9238393d40078332c34485c818d641c4305" - -caniuse-lite@^1.0.30000792: - version "1.0.30000811" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000811.tgz#0b6e40f2efccc27bd3cb52f91ee7ca4673d77d10" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" +camelcase@^5.0.0, camelcase@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chain-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" +caniuse-lite@^1.0.30000974: + version "1.0.30000974" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8" + integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww== chainsaw@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= dependencies: traverse ">=0.3.0 <0.4" -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.1.0, chalk@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1439,279 +1695,336 @@ chalk@^2.1.0, chalk@^2.3.1: change-emitter@^0.1.2: version "0.1.6" resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" + integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= chokidar@^2.0.0, chokidar@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7" + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== dependencies: anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" + async-each "^1.0.1" + braces "^2.3.2" glob-parent "^3.1.0" - inherits "^2.0.1" + inherits "^2.0.3" is-binary-path "^1.0.0" is-glob "^4.0.0" - normalize-path "^2.1.1" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +chrome-trace-event@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - dependencies: - chalk "^1.1.3" - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" isobject "^3.0.0" static-extend "^0.1.1" -classnames@2.2.5, classnames@^2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" +classnames@^2.2.5, classnames@^2.2.6, classnames@~2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + string-width "^2.1.1" + strip-ansi "^4.0.0" wrap-ansi "^2.0.0" -clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" +clone-response@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= dependencies: - q "^1.1.2" + mimic-response "^1.0.0" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - dependencies: - color-name "^1.1.1" - -color-name@^1.0.0, color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "^1.0.0" + color-name "1.1.3" -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" +color-convert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.0.tgz#9851ac61cc0d3898a8a3088650d5bf447bf69d97" + integrity sha512-hzTicsCJIHdxih9+2aLR1tNGZX5qSJGRHDPVwSY26tVrEf55XNajLOBWz2UuWSIergszA09/bqnOiHyqx9fxQg== dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" + color-name "~1.1.4" -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -colors@^1.1.2, colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" +colors@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== -commander@^2.11.0: - version "2.14.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" +commander@^2.11.0, commander@^2.15.1, commander@^2.19.0, commander@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-emitter@^1.2.1: +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compressible@~2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +compressible@~2.0.16: + version "2.0.17" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" + integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== dependencies: - mime-db ">= 1.33.0 < 2" + mime-db ">= 1.40.0 < 2" compression@^1.5.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: - accepts "~1.3.4" + accepts "~1.3.5" bytes "3.0.0" - compressible "~2.0.13" + compressible "~2.0.16" debug "2.6.9" - on-headers "~1.0.1" - safe-buffer "5.1.1" + on-headers "~1.0.2" + safe-buffer "5.1.2" vary "~1.1.2" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26" +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: + buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" +config-chain@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + connect-history-api-fallback@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= dependencies: date-now "^0.1.4" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -core-js@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-js@^2.6.5: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== -core-js@^2.4.0, core-js@^2.5.0: +core-js@~2.5.1: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0" create-hash@^1.1.0, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" - ripemd160 "^2.0.0" + md5.js "^1.3.4" + ripemd160 "^2.0.1" sha.js "^2.4.0" create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -1720,27 +2033,35 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -1754,262 +2075,241 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - -css-loader@^0.28.9: - version "0.28.10" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.10.tgz#40282e79230f7bcb4e483efa631d670b735ebf42" - dependencies: - babel-code-frame "^6.26.0" - css-selector-tokenizer "^0.7.0" - cssnano "^3.10.0" - icss-utils "^2.1.0" - loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - object-assign "^4.1.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.2.0" - postcss-modules-local-by-default "^1.2.0" - postcss-modules-scope "^1.1.0" - postcss-modules-values "^1.3.0" +css-loader@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea" + integrity sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w== + dependencies: + camelcase "^5.2.0" + icss-utils "^4.1.0" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.14" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^2.0.6" + postcss-modules-scope "^2.1.0" + postcss-modules-values "^2.0.0" postcss-value-parser "^3.3.0" - source-list-map "^2.0.0" - -css-selector-tokenizer@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" - dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" - regexpu-core "^1.0.0" + schema-utils "^1.0.0" css-vendor@^0.3.8: version "0.3.8" resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-0.3.8.tgz#6421cfd3034ce664fe7673972fd0119fc28941fa" + integrity sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo= dependencies: is-in-browser "^1.0.2" -cssesc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" - -cssnano@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - dependencies: - clap "^1.0.9" - source-map "^0.5.3" +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^1.6.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-1.8.2.tgz#2c0f16da08b99f13fe7fbb242e87d1a19dbe77a7" +csstype@^2.0.0, csstype@^2.2.0, csstype@^2.5.2: + version "2.6.5" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.5.tgz#1cd1dff742ebf4d7c991470ae71e12bb6751e034" + integrity sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= d3-array@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.1.tgz#d1ca33de2f6ac31efadb8e050a021d7e2396d5dc" + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== d3-collection@1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2" + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== d3-color@1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b" + version "1.2.3" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.2.3.tgz#6c67bb2af6df3cc8d79efcc4d3a3e83e28c8048f" + integrity sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw== d3-format@1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.2.2.tgz#1a39c479c8a57fe5051b2e67a3bee27061a74e7a" + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.3.2.tgz#6a96b5e31bcb98122a30863f7d92365c00603562" + integrity sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ== -d3-interpolate@1, d3-interpolate@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6" +d3-interpolate@1, d3-interpolate@~1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.3.2.tgz#417d3ebdeb4bc4efcc8fd4361c55e4040211fd68" + integrity sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w== dependencies: d3-color "1" d3-path@1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764" + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.7.tgz#8de7cd693a75ac0b5480d3abaccd94793e58aae8" + integrity sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA== -d3-scale@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.6.tgz#bce19da80d3a0cf422c9543ae3322086220b34ed" +d3-scale@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.1.2.tgz#4e932b7b60182aee9073ede8764c98423e5f9a94" + integrity sha512-bESpd64ylaKzCDzvULcmHKZTlzA/6DGSVwx7QSDj/EnX9cpSevsdiwdHFYI9ouo9tNBbV3v5xztHS2uFeOzh8Q== dependencies: d3-array "^1.2.0" d3-collection "1" - d3-color "1" d3-format "1" d3-interpolate "1" d3-time "1" d3-time-format "2" -d3-shape@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777" +d3-shape@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.3.tgz#3dad9b593e7297adac19b1f34a6821940968d7d6" + integrity sha512-mdrQ+V3jdEAa5k9clSEhCNFtq+pdky25PBGjocUgAI0AUbu/Esq4x6bdFcjkNura87Wqp1pd3dfZh6uJ+XojlA== dependencies: d3-path "1" d3-time-format@2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.1.tgz#85b7cdfbc9ffca187f14d3c456ffda268081bb31" + version "2.1.3" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.3.tgz#ae06f8e0126a9d60d6364eac5b1533ae1bac826b" + integrity sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA== dependencies: d3-time "1" d3-time@1: - version "1.0.8" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.8.tgz#dbd2d6007bf416fe67a76d17947b784bffea1e84" - -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - -damerau-levenshtein@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" + version "1.0.11" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.11.tgz#1d831a3e25cd189eb256c17770a666368762bbce" + integrity sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" +damerau-levenshtein@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz#780cf7144eb2e8dbd1c3bb83ae31100ccc31a414" + integrity sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA== date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +debounce@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" + integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.1.0: +debug@3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== + dependencies: + xregexp "4.0.0" + +decimal.js-light@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.0.tgz#ca7faf504c799326df94b0ab920424fdfc125348" + integrity sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg== decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decompress-response@^3.2.0: +decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= dependencies: mimic-response "^1.0.0" deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" +deepmerge@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.2.0.tgz#58ef463a57c08d376547f8869fdc5bcee957f44e" + integrity sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow== -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= dependencies: globby "^6.1.0" is-path-cwd "^1.0.0" @@ -2018,25 +2318,20 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -depd@~1.1.1: +depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -2044,24 +2339,27 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -detect-node@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" @@ -2070,10 +2368,12 @@ diffie-hellman@^5.0.0: dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -2081,55 +2381,95 @@ dns-packet@^1.3.1: dns-txt@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= dependencies: buffer-indexof "^1.0.0" doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= dependencies: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.2, doctrine@^2.1.0: +doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" -dom-helpers@^3.2.0, dom-helpers@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-helpers@^3.2.1, dom-helpers@^3.3.1, dom-helpers@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== dependencies: - jsbn "~0.1.0" + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +editorconfig@^0.15.2: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30: - version "1.3.34" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.34.tgz#d93498f40391bb0c16a603d8241b9951404157ed" +electron-to-chromium@^1.3.150: + version "1.3.157" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.157.tgz#6211d69e8c4ee18df8c84e74e8644bcafc09486c" + integrity sha512-vxGi3lOGqlupuogZxJOMfu+Q1vaOlG6XbsblWw8XnUZSr/ptbt3D6jhHT5LJPZuFUpKhbEo1u4QipivSory1Kg== elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2139,154 +2479,171 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -emoji-regex@^6.1.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" +emoji-regex@^7.0.1, emoji-regex@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.1: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" -enhanced-resolve@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +engine.io-client@~3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.2.tgz#04e068798d75beda14375a264bb3d742d7bc33aa" + integrity sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ== + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.3.2.tgz#18cbc8b6f36e9461c5c0f81df2b830de16058a59" + integrity sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w== + dependencies: + accepts "~1.3.4" + base64id "1.0.0" + cookie "0.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~6.1.0" + +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" + tapable "^1.0.0" -errno@^0.1.3: +errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== dependencies: prr "~1.0.1" error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.7.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.39" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.39.tgz#fca21b67559277ca4ac1a1ed7048b107b6f76d87" - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - -es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" +es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: - d "1" - es5-ext "~0.10.14" + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" + es6-promise "^4.0.3" escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-config-airbnb-base@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" +eslint-config-airbnb-base@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz#b5a1b480b80dfad16433d6c4ad84e6605052c05c" + integrity sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw== dependencies: eslint-restricted-globals "^0.1.1" + object.assign "^4.1.0" + object.entries "^1.0.4" -eslint-config-airbnb@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz#2546bfb02cc9fe92284bf1723ccf2e87bc45ca46" +eslint-config-airbnb@^17.0.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-17.1.0.tgz#3964ed4bc198240315ff52030bf8636f42bc4732" + integrity sha512-R9jw28hFfEQnpPau01NO5K/JWMGLi6aymiF6RsnMURjTk+MqZKllCqGK/0tOvHkPi/NWSSOU2Ced/GX++YxLnw== dependencies: - eslint-config-airbnb-base "^12.1.0" + eslint-config-airbnb-base "^13.1.0" + object.assign "^4.1.0" + object.entries "^1.0.4" -eslint-import-resolver-node@^0.3.1: +eslint-import-resolver-node@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== dependencies: debug "^2.6.9" resolve "^1.5.0" -eslint-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.0.0.tgz#d136619b5c684e36531ffc28c60a56e404608f5d" +eslint-loader@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.1.2.tgz#453542a1230d6ffac90e4e7cb9cadba9d851be68" + integrity sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg== dependencies: loader-fs-cache "^1.0.0" loader-utils "^1.0.2" @@ -2294,175 +2651,226 @@ eslint-loader@^2.0.0: object-hash "^1.1.4" rimraf "^2.6.1" -eslint-module-utils@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" +eslint-module-utils@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" + integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== dependencies: debug "^2.6.8" - pkg-dir "^1.0.0" + pkg-dir "^2.0.0" -eslint-plugin-flowtype@^2.41.0: - version "2.46.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.46.1.tgz#c4f81d580cd89c82bc3a85a1ccf4ae3a915143a4" +eslint-plugin-es@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" + integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== dependencies: - lodash "^4.15.0" + eslint-utils "^1.3.0" + regexpp "^2.0.1" -eslint-plugin-import@^2.8.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz#26002efbfca5989b7288ac047508bd24f217b169" +eslint-plugin-flowtype@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.4.2.tgz#55475e10b05fd714d60bceebbbed596cb8706b16" + integrity sha512-sv6O6fiN3dIwhU4qRxfcyIpbKGVvsxwIQ6vgBLudpQKjH1rEyEFEOjGzGEUBTQP9J8LdTZm37OjiqZ0ZeFOa6g== + dependencies: + lodash "^4.17.11" + +eslint-plugin-import@2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz#97ac3e75d0791c4fac0e15ef388510217be7f66f" + integrity sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A== dependencies: - builtin-modules "^1.1.1" contains-path "^0.1.0" - debug "^2.6.8" + debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.1.1" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.3.0" + has "^1.0.3" + lodash "^4.17.11" + minimatch "^3.0.4" read-pkg-up "^2.0.0" + resolve "^1.9.0" -eslint-plugin-jsx-a11y@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz#54583d1ae442483162e040e13cc31865465100e5" +eslint-plugin-jsx-a11y@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz#4ebba9f339b600ff415ae4166e3e2e008831cf0c" + integrity sha512-cjN2ObWrRz0TTw7vEcGQrx+YltMvZoOEx4hWU8eEERDnBIU00OTq7Vr+jA7DFKxiwLNv4tTh5Pq2GUNEa8b6+w== dependencies: - aria-query "^0.7.0" + aria-query "^3.0.0" array-includes "^3.0.3" - ast-types-flow "0.0.7" - axobject-query "^0.1.0" - damerau-levenshtein "^1.0.0" - emoji-regex "^6.1.0" - jsx-ast-utils "^2.0.0" + ast-types-flow "^0.0.7" + axobject-query "^2.0.2" + damerau-levenshtein "^1.0.4" + emoji-regex "^7.0.2" + has "^1.0.3" + jsx-ast-utils "^2.0.1" -eslint-plugin-react@^7.5.1: - version "7.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz#f606c719dbd8a1a2b3d25c16299813878cca0160" +eslint-plugin-node@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz#55ae3560022863d141fa7a11799532340a685964" + integrity sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w== dependencies: - doctrine "^2.0.2" - has "^1.0.1" + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^5.0.2" + minimatch "^3.0.4" + resolve "^1.8.1" + semver "^5.5.0" + +eslint-plugin-promise@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz#2d074b653f35a23d1ba89d8e976a985117d1c6a2" + integrity sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg== + +eslint-plugin-react@7.12.4: + version "7.12.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz#b1ecf26479d61aee650da612e425c53a99f48c8c" + integrity sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" jsx-ast-utils "^2.0.1" - prop-types "^15.6.0" + object.fromentries "^2.0.0" + prop-types "^15.6.2" + resolve "^1.9.0" eslint-restricted-globals@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" + integrity sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc= -eslint-scope@^3.7.1, eslint-scope@~3.7.1: +eslint-scope@3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.0, eslint-scope@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-utils@^1.3.0, eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^4.16.0: - version "4.18.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45" +eslint@5.15.1: + version "5.15.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.15.1.tgz#8266b089fd5391e0009a047050795b1d73664524" + integrity sha512-NTcm6vQ+PTgN3UBsALw5BMhgO6i5EpIjQF/Xb5tIh3sk9QhrFafujUOczGz4J24JBlzWclSB9Vmx8d+9Z6bFCg== dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.2" + eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" - espree "^3.5.2" - esquery "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" esutils "^2.0.2" - file-entry-cache "^2.0.0" + file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" + inquirer "^6.2.2" + js-yaml "^3.12.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" + lodash "^4.17.11" + minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" path-is-inside "^1.0.2" - pluralize "^7.0.0" progress "^2.0.0" - require-uncached "^1.0.3" - semver "^5.3.0" + regexpp "^2.0.1" + semver "^5.5.1" strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" -espree@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== dependencies: - acorn "^5.4.0" - acorn-jsx "^3.0.0" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" +eventemitter3@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== -eventsource@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== dependencies: - original ">=0.0.5" + original "^1.0.0" evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" @@ -2470,6 +2878,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -2479,15 +2888,23 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: - is-posix-bracket "^0.1.0" + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -2497,81 +2914,77 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: - fill-range "^2.1.0" + homedir-polyfill "^1.0.1" express@^4.16.2: - version "4.16.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== dependencies: - accepts "~1.3.4" + accepts "~1.3.7" array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" + body-parser "1.19.0" + content-disposition "0.5.3" content-type "~1.0.4" - cookie "0.3.1" + cookie "0.4.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" + depd "~1.1.2" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.1.0" + finalhandler "~1.1.2" fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" - parseurl "~1.3.2" + parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.2" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.1" - serve-static "1.13.1" - setprototypeof "1.1.0" - statuses "~1.3.1" - type-is "~1.6.15" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -external-editor@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" + chardet "^0.7.0" + iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -2582,45 +2995,39 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -fastparse@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" -faye-websocket@~0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" +faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== dependencies: websocket-driver ">=0.5.1" -fbjs@^0.8.1, fbjs@^0.8.16: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" +fbjs@^0.8.1: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -2628,82 +3035,85 @@ fbjs@^0.8.1, fbjs@^0.8.16: object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.9" + ua-parser-js "^0.7.18" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" + flat-cache "^2.0.1" -file-loader@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" +file-loader@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" + integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== dependencies: loader-utils "^1.0.2" - schema-utils "^0.4.5" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + schema-utils "^1.0.0" -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" + parseurl "~1.3.3" + statuses "~1.5.0" unpipe "~1.0.0" find-cache-dir@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= dependencies: commondir "^1.0.1" mkdirp "^0.5.1" pkg-dir "^1.0.0" -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" + make-dir "^2.0.0" + pkg-dir "^3.0.0" find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -2711,150 +3121,185 @@ find-up@^1.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" + locate-path "^3.0.0" -flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" -flow-bin-loader@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flow-bin-loader/-/flow-bin-loader-1.0.3.tgz#1b95260437bea24786a5abc022ef3efa02df77c5" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" -flow-bin@^0.63.1: - version "0.63.1" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.63.1.tgz#ab00067c197169a5fb5b4996c8f6927b06694828" +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== -flow-typed@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.3.0.tgz#0f8604faab60691b885024e16ec0e3256e3b680e" - dependencies: - babel-polyfill "^6.26.0" - colors "^1.1.2" - fs-extra "^5.0.0" - github "0.2.4" - glob "^7.1.2" - got "^7.1.0" - md5 "^2.1.0" +flow-bin-loader@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flow-bin-loader/-/flow-bin-loader-1.0.3.tgz#1b95260437bea24786a5abc022ef3efa02df77c5" + integrity sha512-JgbydYGf7/Di8Jq4Az3+58g8lreabVdzI3IZQFICpQSH+yK8Uhgc1+Os5rnFBUfAQuhx3imUjpfOjaTLlz8M5A== + +flow-bin@0.94.0: + version "0.94.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.94.0.tgz#b5d58fe7559705b73a18229f97edfc3ab6ffffcb" + integrity sha512-DYF7r9CJ/AksfmmB4+q+TyLMoeQPRnqtF1Pk7KY3zgfkB/nVuA3nXyzqgsIPIvnMSiFEXQcFK4z+iPxSLckZhQ== + +flow-typed@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.5.2.tgz#967e83c762a1cbfcd52eebaece1ade77944f1714" + integrity sha512-RrHRmp/Bof1vDG1AqBcwuyxMMoezkl7TxvimA5c6GKZOOb1fkkRZ81S+1qAuvb4rUka5fLlFomKCnpMnCsgP+g== + dependencies: + "@babel/polyfill" "^7.0.0" + "@octokit/rest" "^15.12.1" + colors "^1.3.2" + fs-extra "^7.0.0" + glob "^7.1.3" + got "^8.3.2" + md5 "^2.2.1" mkdirp "^0.5.1" rimraf "^2.6.2" - semver "^5.5.0" - table "^4.0.2" + semver "^5.5.1" + table "^5.0.2" through "^2.3.8" - unzip "^0.1.11" - which "^1.3.0" - yargs "^4.2.0" - -font-awesome@^4.3.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + unzipper "^0.9.3" + which "^1.3.1" + yargs "^12.0.2" -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: - for-in "^1.0.1" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + inherits "^2.0.3" + readable-stream "^2.3.6" -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" +follow-redirects@^1.0.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" + integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" + debug "^3.2.6" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fp-ts@^1.0.0, fp-ts@^1.0.1: + version "1.18.2" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.18.2.tgz#b9a7025174e1a59bc43b485b3a0ca6f78e371d01" + integrity sha512-kznerusCuG5dUt0bH6eiQHVp2fstPiSlyzGb//rYgMMxCuromWEoVS0riH++86vyJm9Nv1B+pbe6udDx1tqjfA== fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-extra@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" +from2@^2.1.0, from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" +fs-minipass@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" + minipass "^2.2.1" -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -"fstream@>= 0.1.30 < 1": - version "0.1.31" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988" +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: - graceful-fs "~3.0.2" - inherits "~2.0.0" - mkdirp "0.5" - rimraf "2" + nan "^2.12.1" + node-pre-gyp "^0.12.0" -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" +fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.1: +function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -2866,56 +3311,39 @@ gauge@~2.7.3: wide-align "^1.1.0" get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-stream@^3.0.0: +get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -github@0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/github/-/github-0.2.4.tgz#24fa7f0e13fa11b946af91134c51982a91ce538b" - dependencies: - mime "^1.2.11" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob@^7.0.3, glob@^7.1.2, glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2924,39 +3352,43 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: - min-document "^2.19.0" - process "~0.5.1" - -globals@^11.0.1: - version "11.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" -globals@^11.1.0: - version "11.5.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" +global@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0, globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -2964,85 +3396,93 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" +got@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" + integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== dependencies: - decompress-response "^3.2.0" + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" duplexer3 "^0.1.4" get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" isurl "^1.0.0-alpha5" lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@~3.0.2: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - dependencies: - natives "^1.1.0" - -handle-thing@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" +handle-thing@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" +handlebars@^4.0.11: + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + isarray "2.0.1" -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== dependencies: has-symbol-support-x "^1.4.1" has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3051,6 +3491,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3059,198 +3500,261 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - inherits "^2.0.1" + function-bind "^1.1.1" hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" + minimalistic-assert "^1.0.1" hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - hoist-non-react-statics@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz#d2ca2dfc19c5a91c5a6615ce8e564ef0347e2a40" + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" +hoist-non-react-statics@^3.2.1, hoist-non-react-statics@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" + integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" + react-is "^16.7.0" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= dependencies: inherits "^2.0.1" obuf "^1.0.0" readable-stream "^2.0.1" wbuf "^1.1.0" -html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" - html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.6.2, http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" +http-errors@1.7.2, http-errors@~1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: - depd "1.1.1" + depd "~1.1.2" inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" http-parser-js@>=0.4.0: - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + version "0.5.0" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" + integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== -http-proxy-middleware@~0.17.4: - version "0.17.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== dependencies: - http-proxy "^1.16.2" - is-glob "^3.1.0" - lodash "^4.17.2" - micromatch "^2.3.11" + agent-base "4" + debug "3.1.0" -http-proxy@^1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" +http-proxy-middleware@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" +http-proxy@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -hyphenate-style-name@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b" +https-proxy-agent@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" -iconv-lite@0.4.19, iconv-lite@^0.4.17: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +humps@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa" + integrity sha1-3QLqYIG9BWjcXQcxhEY5V7qe+ao= + +hyphenate-style-name@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" + integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== -iconv-lite@~0.4.13: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= -icss-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" +icss-utils@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== dependencies: - postcss "^6.0.1" + postcss "^7.0.14" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ignore@^3.3.3: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: - pkg-dir "^2.0.0" + minimatch "^3.0.4" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" + integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== + +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" resolve-cwd "^2.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" +indefinite-observable@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-1.0.2.tgz#0a328793ab2385d4b9dca23eaab4afe6936a73f8" + integrity sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA== dependencies: - repeating "^2.0.0" + symbol-observable "1.2.0" indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -3258,121 +3762,176 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" +inquirer@^6.2.2: + version "6.3.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" + integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" + ansi-escapes "^3.2.0" + chalk "^2.4.2" cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^2.0.4" + external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.3.0" + lodash "^4.17.11" mute-stream "0.0.7" run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" + rxjs "^6.4.0" string-width "^2.1.0" - strip-ansi "^4.0.0" + strip-ansi "^5.1.0" through "^2.3.6" -internal-ip@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" +inspectpack@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/inspectpack/-/inspectpack-4.2.1.tgz#8e1893feb5293458c9d587cb2a8ec70be2e79dd4" + integrity sha512-3kraYZ9tfxNYXzBsRTNvluj1oJKlJ6wkD+TZ6Vk9CNI1SZcQ5H/9yskuq1Yzha1Cn/wEX/Qw+g+tSLIP5iGXhg== dependencies: - meow "^3.3.0" + chalk "^2.4.0" + io-ts "^1.0.5" + io-ts-reporters "^0.0.20" + pify "^3.0.0" + semver-compare "^1.0.0" + yargs "^11.0.0" -interpret@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" +internal-ip@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +interpret@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -invariant@^2.2.0, invariant@^2.2.2: +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + +invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +io-ts-reporters@^0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/io-ts-reporters/-/io-ts-reporters-0.0.20.tgz#2b8cbb6a2bc4562dae6917a3a413fa2c9851a644" + integrity sha512-ZGyPkto96U8exipqA915ZqxIJsaFLavgZIQOEgg4Pa8qgq1Hl9ZKBtN708ZXPzlAGR/jxofrD4QNT8SHowIDVA== + dependencies: + fp-ts "^1.0.1" + io-ts "^1.0.2" + +io-ts@^1.0.2, io-ts@^1.0.5: + version "1.8.6" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.8.6.tgz#43930e025b88bbb317cb193bd9af784322a6fed6" + integrity sha512-0V0gbEfW5FnlEL++hO+j1cbxSvhH3f/i5Puz5AjmN6Q071vJONWTuOHttMSe60gi4DBHBTd2eHbSnHv37ptTnQ== + dependencies: + fp-ts "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" +ipaddr.js@1.9.0, ipaddr.js@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -3381,465 +3940,389 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-function@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= dependencies: has "^1.0.1" -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - -is-retry-allowed@^1.0.0: +is-retry-allowed@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + has-symbols "^1.0.0" -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== dependencies: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -js-base64@^2.1.9: - version "2.4.3" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" +js-beautify@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.9.0.tgz#2562fcdee340f9f962ae2ec4a8a40e7aaa6d964f" + integrity sha512-P0skmY4IDjfLiVrx+GLDeme8w5G0R1IGXgccVU5HP2VM3lRblH7qN2LTea5vZAxrDjpZBD0Jv+ahpjwVcbz/rw== + dependencies: + config-chain "^1.1.12" + editorconfig "^0.15.2" + glob "^7.1.3" + mkdirp "~0.5.0" + nopt "~4.0.1" -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== -js-yaml@^3.9.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" +js-yaml@^3.12.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + esprima "^4.0.0" jsesc@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-loader@^0.5.4: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== -json-stable-stringify@^1.0.1: +json5@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + minimist "^1.2.0" -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jss-camel-case@^6.0.0, jss-camel-case@^6.1.0: +jss-camel-case@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/jss-camel-case/-/jss-camel-case-6.1.0.tgz#ccb1ff8d6c701c02a1fed6fb6fb6b7896e11ce44" + integrity sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ== dependencies: hyphenate-style-name "^1.0.2" -jss-compose@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/jss-compose/-/jss-compose-5.0.0.tgz#ce01b2e4521d65c37ea42cf49116e5f7ab596484" - dependencies: - warning "^3.0.0" - jss-default-unit@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/jss-default-unit/-/jss-default-unit-8.0.2.tgz#cc1e889bae4c0b9419327b314ab1c8e2826890e6" - -jss-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/jss-expand/-/jss-expand-5.1.0.tgz#b1ad74ec18631f34f65a2124fcfceb6400610e3d" - -jss-extend@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/jss-extend/-/jss-extend-6.2.0.tgz#4af09d0b72fb98ee229970f8ca852fec1ca2a8dc" - dependencies: - warning "^3.0.0" + integrity sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg== jss-global@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/jss-global/-/jss-global-3.0.0.tgz#e19e5c91ab2b96353c227e30aa2cbd938cdaafa2" + integrity sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q== jss-nested@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/jss-nested/-/jss-nested-6.0.1.tgz#ef992b79d6e8f63d939c4397b9d99b5cbbe824ca" + integrity sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA== dependencies: warning "^3.0.0" -jss-preset-default@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jss-preset-default/-/jss-preset-default-4.3.0.tgz#7bc91b0b282492557d36ed4e5c6d7c8cb3154bb8" - dependencies: - jss-camel-case "^6.1.0" - jss-compose "^5.0.0" - jss-default-unit "^8.0.2" - jss-expand "^5.1.0" - jss-extend "^6.2.0" - jss-global "^3.0.0" - jss-nested "^6.0.1" - jss-props-sort "^6.0.0" - jss-template "^1.0.1" - jss-vendor-prefixer "^7.0.0" - jss-props-sort@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/jss-props-sort/-/jss-props-sort-6.0.0.tgz#9105101a3b5071fab61e2d85ea74cc22e9b16323" - -jss-template@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/jss-template/-/jss-template-1.0.1.tgz#09aed9d86cc547b07f53ef355d7e1777f7da430a" - dependencies: - warning "^3.0.0" + integrity sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g== jss-vendor-prefixer@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz#0166729650015ef19d9f02437c73667231605c71" + integrity sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA== dependencies: css-vendor "^0.3.8" -jss@^9.3.2, jss@^9.3.3: - version "9.8.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.0.tgz#77830def563870103f8671ed31ce3a3d2f32aa2b" +jss@^9.8.7: + version "9.8.7" + resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.7.tgz#ed9763fc0f2f0260fc8260dac657af61e622ce05" + integrity sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ== dependencies: is-in-browser "^1.1.3" symbol-observable "^1.1.0" warning "^3.0.0" -jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" +jsx-ast-utils@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz#0ee4e2c971fb9601c67b5641b71be80faecf0b36" + integrity sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA== dependencies: array-includes "^3.0.3" -keycode@^2.1.9: - version "2.1.9" - resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.1.9.tgz#964a23c54e4889405b4861a5c9f0480d45141dfa" +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" + integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== + dependencies: + json-buffer "3.0.0" killable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lazy-cache@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - dependencies: - set-getter "^0.1.0" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -3847,170 +4330,150 @@ load-json-file@^2.0.0: strip-bom "^3.0.0" loader-fs-cache@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc" + version "1.0.2" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" + integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== dependencies: find-cache-dir "^0.1.1" mkdirp "0.5.1" loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== dependencies: - big.js "^3.1.3" + big.js "^5.2.2" emojis-list "^2.0.0" - json5 "^0.5.0" + json5 "^1.0.1" locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" +lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.4, lodash@~4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.3.0, lodash@~4.17.4: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" +loglevel@^1.4.1: + version "1.6.3" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.3.tgz#77f2eb64be55a404c9fd04ad16d57c1d6d6b1280" + integrity sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA== -lodash@^4.17.4, lodash@^4.2.0: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" -loglevel@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= -longest@^1.0.1: +lowercase-keys@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" +lru-cache@^4.0.1, lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: - js-tokens "^3.0.0" + pseudomap "^1.0.2" + yallist "^2.1.2" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" + yallist "^3.0.2" -lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" +macos-release@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" + integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== -lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" + pify "^4.0.1" + semver "^5.6.0" -macaddress@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== dependencies: - pify "^3.0.0" + p-defer "^1.0.0" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -"match-stream@>= 0.0.2 < 1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" - dependencies: - buffers "~0.1.1" - readable-stream "~1.0.0" - -material-ui-icons@^1.0.0-beta.17: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/material-ui-icons/-/material-ui-icons-1.0.0-beta.35.tgz#f795fafa385918ef7c88ee382e5e5bf4401f008c" - dependencies: - recompose "^0.26.0" - -material-ui@^1.0.0-beta.30: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-1.0.0-beta.35.tgz#eeac6be307c0469943c7686e5c6bd4eaa6b1b563" - dependencies: - "@types/jss" "^9.3.0" - "@types/react-transition-group" "^2.0.6" - babel-runtime "^6.26.0" - brcast "^3.0.1" - classnames "^2.2.5" - deepmerge "^2.0.1" - dom-helpers "^3.2.1" - hoist-non-react-statics "^2.3.1" - jss "^9.3.3" - jss-camel-case "^6.0.0" - jss-default-unit "^8.0.2" - jss-global "^3.0.0" - jss-nested "^6.0.1" - jss-props-sort "^6.0.0" - jss-vendor-prefixer "^7.0.0" - keycode "^2.1.9" - lodash "^4.2.0" - normalize-scroll-left "^0.1.2" - prop-types "^15.6.0" - react-event-listener "^0.5.1" - react-jss "^8.1.0" - react-popper "^0.8.0" - react-scrollbar-size "^2.0.2" - react-transition-group "^2.2.1" - recompose "^0.26.0" - scroll "^2.0.3" - warning "^3.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" -md5@^2.1.0: +md5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= dependencies: charenc "~0.0.1" crypt "~0.0.1" @@ -4019,64 +4482,46 @@ md5@^2.1.0: media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: mimic-fn "^1.0.0" -memory-fs@^0.4.0, memory-fs@~0.4.1: +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.4: - version "3.1.9" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89" +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -4090,93 +4535,183 @@ micromatch@^3.1.4: object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" - to-regex "^3.0.1" + to-regex "^3.0.2" miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.33.0 < 2", mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" +mime-db@1.40.0, "mime-db@>= 1.40.0 < 2": + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" +mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== dependencies: - mime-db "~1.33.0" - -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + mime-db "1.40.0" -mime@^1.2.11, mime@^1.4.1, mime@^1.5.0: +mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.0.3, mime@^2.4.2: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-response@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= dependencies: dom-walk "^0.1.0" -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.2.1, minipass@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" +most@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/most/-/most-1.7.3.tgz#406c31a66d73aa16957816fdf96965e27df84f1a" + integrity sha512-mk68SM/ptK8WSo3l03raXcWy02Hl7jbzxVozMuvyYxohn4yteh2THhl3+XABF5cunWE8eXHAsLbv+RCJI5y+jg== + dependencies: + "@most/multicast" "^1.2.5" + "@most/prelude" "^1.4.0" + symbol-observable "^1.0.2" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= multicast-dns@^6.0.1: version "6.2.3" resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== dependencies: dns-packet "^1.3.1" thunky "^1.0.2" @@ -4184,21 +4719,23 @@ multicast-dns@^6.0.1: mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.3.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866" +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" - is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" @@ -4206,36 +4743,62 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -natives@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.1.tgz#011acce1f7cbd87f7ba6b3093d6cd9392be1c574" - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" -neo-async@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f" +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +neo-blessed@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/neo-blessed/-/neo-blessed-0.2.0.tgz#30f9495fdd104494402b62c6273a9c9b82de4f2b" + integrity sha512-C2kC4K+G2QnNQFXUIxTQvqmrdSIzGTX1ZRKeDW6ChmvPRw8rTkTEJzbEQHiHy06d36PCl/yMOCjquCRV8SpSQw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" -node-forge@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300" +node-fetch@^2.1.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" + integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -4244,7 +4807,7 @@ node-libs-browser@^2.0.0: constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^1.0.0" + events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" path-browserify "0.0.0" @@ -4258,165 +4821,242 @@ node-libs-browser@^2.0.0: timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.10.3" + util "^0.11.0" vm-browserify "0.0.4" -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" - hawk "3.1.3" mkdirp "^0.5.1" + needle "^2.2.1" nopt "^4.0.1" + npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" + tar "^4" -nopt@^4.0.1: +node-releases@^1.1.23: + version "1.1.23" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.23.tgz#de7409f72de044a2fa59c097f436ba89c39997f0" + integrity sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w== + dependencies: + semver "^5.3.0" + +nopt@^4.0.1, nopt@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-scroll-left@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz#6b79691ba79eb5fb107fa5edfbdc06b55caee2aa" + integrity sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg== -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" gauge "~2.7.3" set-blocking "~2.0.0" -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" object-hash@^1.1.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.2.0.tgz#e96af0e96981996a1d47f88ead8f74f1ebc4422b" + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" + integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +object.fromentries@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" + integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.11.0" + function-bind "^1.1.1" + has "^1.0.1" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" -obuf@^1.0.0, obuf@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" -on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.3: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" opn@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== dependencies: is-wsl "^1.1.0" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -4425,182 +5065,272 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -original@>=0.0.5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== dependencies: - url-parse "1.0.x" + url-parse "^1.4.3" os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: execa "^0.7.0" lcid "^1.0.0" mem "^1.1.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-name@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -"over@>= 0.0.5 < 1": - version "0.0.5" - resolved "https://registry.yarnpkg.com/over/-/over-0.0.5.tgz#f29852e70fd7e25f360e013a8ec44c82aedb5708" +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== p-limit@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== dependencies: p-finally "^1.0.0" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" parse-asn1@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" + safe-buffer "^5.1.1" parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" -parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= dependencies: pify "^2.0.0" path@^0.12.7: version "0.12.7" resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" + integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= dependencies: process "^0.11.1" util "^0.10.3" pbkdf2@^3.0.3: - version "3.0.14" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -4608,684 +5338,525 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= dependencies: - find-up "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - -popper.js@^1.12.9: - version "1.12.9" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.12.9.tgz#0dfbc2dff96c451bb332edcfcfaaf566d331d5b3" - -portfinder@^1.0.9: - version "1.0.13" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" - dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" - dependencies: - postcss "^5.0.4" - uniqid "^4.0.0" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-modules-extract-imports@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" - dependencies: - postcss "^6.0.1" + find-up "^1.0.0" -postcss-modules-local-by-default@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" + find-up "^2.1.0" -postcss-modules-scope@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" + find-up "^3.0.0" -postcss-modules-values@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" +popper.js@^1.14.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2" + integrity sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA== -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" +portfinder@^1.0.9: + version "1.0.20" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== dependencies: - postcss "^5.0.5" + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" + postcss "^7.0.5" -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" +postcss-modules-local-by-default@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz#dd9953f6dd476b5fd1ef2d8830c8929760b56e63" + integrity sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA== dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + postcss-value-parser "^3.3.1" -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" +postcss-modules-scope@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb" + integrity sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A== dependencies: - postcss "^5.0.4" + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" +postcss-modules-values@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" + integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w== dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" + icss-replace-symbols "^1.1.0" + postcss "^7.0.6" -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" +postcss-selector-parser@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== dependencies: - flatten "^1.0.2" + cssesc "^3.0.0" indexes-of "^1.0.1" uniq "^1.0.1" -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" +postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss@^6.0.1: - version "6.0.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.19.tgz#76a78386f670b9d9494a655bf23ac012effd1555" +postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" + integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== dependencies: - chalk "^2.3.1" + chalk "^2.4.2" source-map "^0.6.1" - supports-color "^5.2.0" + supports-color "^6.1.0" prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.0, prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== process@^0.11.1, process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" -prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" +prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +prop-types@~15.6.0: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== dependencies: - fbjs "^0.8.16" loose-envify "^1.3.1" object-assign "^4.1.1" -proxy-addr@~2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== dependencies: forwarded "~0.1.2" - ipaddr.js "1.6.0" + ipaddr.js "1.9.0" prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" + safe-buffer "^5.1.2" -"pullstream@>= 0.4.1 < 1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/pullstream/-/pullstream-0.4.1.tgz#d6fb3bf5aed697e831150eb1002c25a3f8ae1314" +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== dependencies: - over ">= 0.0.5 < 1" - readable-stream "~1.0.31" - setimmediate ">= 1.0.2 < 2" - slice-stream ">= 1.0.0 < 2" + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4, punycode@^1.4.1: +punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - -qs@6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== dependencies: + decode-uri-component "^0.2.0" object-assign "^4.1.0" strict-uri-encode "^1.0.0" querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -querystringify@0.0.x: - version "0.0.4" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" - -querystringify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== -raf@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" +raf@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.0" -rafl@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rafl/-/rafl-1.2.2.tgz#fe930f758211020d47e38815f5196a8be4150740" - dependencies: - global "~4.3.0" - -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.0.3, range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.1.7: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - deep-extend "~0.4.0" + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@^16.2.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.0.tgz#099f067dd5827ce36a29eaf9a6cdc7cbf6216b1e" +react-dom@16.8.4: + version "16.8.4" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.4.tgz#1061a8e01a2b3b0c8160037441c3bf00a0e3bc48" + integrity sha512-Ob2wK7XG2tUDt7ps7LtLzGYYB6DXMCLj0G5fO6WeEICtT4/HdpOi7W/xLzZnR6RCG1tYza60nMdqtxzA8FaPJQ== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.13.4" -react-event-listener@^0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.5.3.tgz#a8b492596ad601865314fcc2c18cb87b6ce3876e" +react-event-listener@^0.6.2: + version "0.6.6" + resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" + integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== dependencies: - babel-runtime "^6.26.0" - fbjs "^0.8.16" + "@babel/runtime" "^7.2.0" prop-types "^15.6.0" - warning "^3.0.0" - -react-fa@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/react-fa/-/react-fa-5.0.0.tgz#d571732856c6cb2c155c46daef018ba67a75b973" - dependencies: - font-awesome "^4.3.0" - prop-types "^15.5.8" + warning "^4.0.1" -react-jss@^8.1.0: - version "8.3.3" - resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-8.3.3.tgz#677a57569d3e4f5099fcdeafeddd8d2c62ab5977" +react-hot-loader@4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.8.0.tgz#0b7c7dd9407415e23eb8246fdd28b0b839f54cb6" + integrity sha512-HY9F0vITYSVmXhAR6tPkMk240nxmoH8+0rca9iO2B82KVguiCiBJkieS0Wb4CeSIzLWecYx3iOcq8dcbnp0bxA== dependencies: - hoist-non-react-statics "^2.3.1" - jss "^9.3.2" - jss-preset-default "^4.3.0" - prop-types "^15.6.0" - theming "^1.3.0" + fast-levenshtein "^2.0.6" + global "^4.3.0" + hoist-non-react-statics "^3.3.0" + loader-utils "^1.1.0" + lodash "^4.17.11" + prop-types "^15.6.1" + react-lifecycles-compat "^3.0.4" + shallowequal "^1.0.2" + source-map "^0.7.3" + +react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + +react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-popper@^0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-0.8.2.tgz#092095ff13933211d3856d9f325511ec3a42f12c" +react-resize-detector@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-2.3.0.tgz#57bad1ae26a28a62a2ddb678ba6ffdf8fa2b599c" + integrity sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ== dependencies: - popper.js "^1.12.9" + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" prop-types "^15.6.0" + resize-observer-polyfill "^1.5.0" -react-resize-detector@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-1.1.0.tgz#4a9831fa3caad32230478dd0185cbd2aa91a5ebf" - dependencies: - prop-types "^15.5.10" - -react-scrollbar-size@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/react-scrollbar-size/-/react-scrollbar-size-2.1.0.tgz#105e797135cab92b1f9e16f00071db7f29f80754" +react-smooth@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-1.0.2.tgz#f7a2d932ece8db898646078c3c97f3e9533e0486" + integrity sha512-pIGzL1g9VGAsRsdZQokIK0vrCkcdKtnOnS1gyB2rrowdLy69lNSWoIjCTWAfgbiYvria8tm5hEZqj+jwXMkV4A== dependencies: - babel-runtime "^6.26.0" + lodash "~4.17.4" prop-types "^15.6.0" - react-event-listener "^0.5.1" - stifle "^1.0.2" + raf "^3.4.0" + react-transition-group "^2.5.0" -react-smooth@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-1.0.0.tgz#b29dbebddddb06d21b5b08962167fb9eac1897d8" +react-transition-group@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.6.1.tgz#abf4a95e2f13fb9ba83a970a896fedbc5c4856a2" + integrity sha512-9DHwCy0aOYEe35frlEN68N9ut/THDQBLnVoQuKTvzF4/s3tk7lqkefCqxK2Nv96fOh6JXk6tQtliygk6tl3bQA== dependencies: - lodash "~4.17.4" - prop-types "^15.6.0" - raf "^3.2.0" - react-transition-group "^2.2.1" + dom-helpers "^3.3.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" -react-transition-group@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.2.1.tgz#e9fb677b79e6455fd391b03823afe84849df4a10" +react-transition-group@^2.2.1, react-transition-group@^2.5.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== dependencies: - chain-function "^1.0.0" - classnames "^2.2.5" - dom-helpers "^3.2.0" - loose-envify "^1.3.1" - prop-types "^15.5.8" - warning "^3.0.0" + dom-helpers "^3.4.0" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" -react@^16.2.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.4.0.tgz#402c2db83335336fba1962c08b98c6272617d585" +react@16.8.4: + version "16.8.4" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.4.tgz#fdf7bd9ae53f03a9c4cd1a371432c206be1c4768" + integrity sha512-0GQ6gFXfUH7aZcjGVymlPOASTuSjlQL4ZtVC5YKH+3JL6bBLCVO21DknzmaPlI90LN253ojj02nsapy+j7wIjg== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" + prop-types "^15.6.2" + scheduler "^0.13.4" read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: find-up "^2.0.0" read-pkg "^2.0.0" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= dependencies: load-json-file "^2.0.0" normalize-package-data "^2.3.2" path-type "^2.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readable-stream@^2.2.9: - version "2.3.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~2.0.0" safe-buffer "~5.1.1" - string_decoder "~1.0.3" + string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@~1.0.0, readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" +readable-stream@^3.0.6: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" -recharts-scale@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.3.2.tgz#dac7621714a4765d152cb2adbc30c73b831208c9" - -recharts@^1.0.0-beta.9: - version "1.0.0-beta.10" - resolved "https://registry.yarnpkg.com/recharts/-/recharts-1.0.0-beta.10.tgz#d3cd15df6b7879d5968da3c942b5fcdaf2504fe1" +recharts-scale@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.2.tgz#b66315d985cd9b80d5f7d977a5aab9a305abc354" + integrity sha512-p/cKt7j17D1CImLgX2f5+6IXLbRHGUQkogIp06VUoci/XkhOQiGSzUrsD1uRmiI7jha4u8XNFOjkHkzzBPivMg== dependencies: - classnames "2.2.5" - core-js "2.5.1" - d3-interpolate "^1.1.5" - d3-scale "1.0.6" - d3-shape "1.2.0" - lodash "~4.17.4" - prop-types "^15.6.0" - react-resize-detector "1.1.0" - react-smooth "1.0.0" - recharts-scale "0.3.2" - reduce-css-calc "1.3.0" + decimal.js-light "^2.4.1" -recompose@^0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.26.0.tgz#9babff039cb72ba5bd17366d55d7232fbdfb2d30" - dependencies: +recharts@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-1.5.0.tgz#ecb4f015cec5b1284294954b7906c7c2ec6e25be" + integrity sha512-bsKJRvh4NepPJlXoI4L9oRKhrv59W7fjs6qTqk6le9MFAywe8EYiW/t07RDQHBVIj6icb+UdSFsHxEo8c5AcTg== + dependencies: + classnames "~2.2.5" + core-js "~2.5.1" + d3-interpolate "~1.3.0" + d3-scale "~2.1.0" + d3-shape "~1.2.0" + lodash "~4.17.5" + prop-types "~15.6.0" + react-resize-detector "~2.3.0" + react-smooth "~1.0.0" + recharts-scale "^0.4.2" + reduce-css-calc "~1.3.0" + +"recompose@0.28.0 - 0.30.0": + version "0.30.0" + resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0" + integrity sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w== + dependencies: + "@babel/runtime" "^7.0.0" change-emitter "^0.1.2" fbjs "^0.8.1" hoist-non-react-statics "^2.3.1" + react-lifecycles-compat "^3.0.2" symbol-observable "^1.0.4" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -reduce-css-calc@1.3.0, reduce-css-calc@^1.2.6: +reduce-css-calc@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= dependencies: balanced-match "^0.4.2" math-expression-evaluator "^1.2.14" @@ -5294,159 +5865,159 @@ reduce-css-calc@1.3.0, reduce-css-calc@^1.2.6: reduce-function-call@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + integrity sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk= dependencies: balanced-match "^0.4.2" -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" +regenerate-unicode-properties@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpu-core@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0: +requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resize-observer-polyfill@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" -resolve-from@^1.0.0: +resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" +resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" + +responselike@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -5454,114 +6025,133 @@ restore-cursor@^2.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" +rimraf@2, rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: - glob "^7.0.5" + glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: - hash-base "^2.0.0" + hash-base "^3.0.0" inherits "^2.0.1" run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: - rx-lite "*" + aproba "^1.1.1" -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" +rxjs@^6.4.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" + integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== + dependencies: + tslib "^1.9.0" -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-buffer@5.1.2, safe-buffer@>=5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@~1.2.1: +sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -schema-utils@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" +scheduler@^0.13.4: + version "0.13.6" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" + integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== dependencies: - ajv "^5.0.0" + loose-envify "^1.1.0" + object-assign "^4.1.1" -schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: ajv "^6.1.0" + ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -scroll@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/scroll/-/scroll-2.0.3.tgz#0951b785544205fd17753bc3d294738ba16fc2ab" - dependencies: - rafl "~1.2.1" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selfsigned@^1.9.1: - version "1.10.2" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.2.tgz#b4449580d99929b65b10a48389301a6592088758" + version "1.10.4" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" + integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== dependencies: - node-forge "0.7.1" + node-forge "0.7.5" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -send@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== dependencies: debug "2.6.9" - depd "~1.1.1" + depd "~1.1.2" destroy "~1.0.4" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" + integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== serve-index@^1.7.2: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= dependencies: accepts "~1.3.4" batch "0.6.1" @@ -5571,32 +6161,25 @@ serve-index@^1.7.2: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== dependencies: - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.1" + parseurl "~1.3.3" + send "0.17.1" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-getter@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" - dependencies: - to-object-path "^0.3.0" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -5606,64 +6189,76 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" is-plain-object "^2.0.3" split-string "^3.0.1" -"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.4, setimmediate@^1.0.5: +setimmediate@^1.0.4, setimmediate@^1.0.5, setimmediate@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.10" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b" + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" +shallowequal@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -"slice-stream@>= 1.0.0 < 2": - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0" - dependencies: - readable-stream "~1.0.31" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -5672,12 +6267,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -5686,498 +6283,566 @@ snapdragon@^0.8.1: map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" - use "^2.0.0" + use "^3.1.0" + +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= + +socket.io-client@2.2.0, socket.io-client@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" + integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~3.1.0" + engine.io-client "~3.3.1" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.3.0" + to-array "0.1.4" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" +socket.io-parser@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" + integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== dependencies: - hoek "2.x.x" + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" -sockjs-client@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" +socket.io@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.2.0.tgz#f0f633161ef6712c972b307598ecd08c9b1b4d5b" + integrity sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w== + dependencies: + debug "~4.1.0" + engine.io "~3.3.1" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.2.0" + socket.io-parser "~3.3.0" + +sockjs-client@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" + integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg== dependencies: - debug "^2.6.6" - eventsource "0.1.6" - faye-websocket "~0.11.0" - inherits "^2.0.1" + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" json3 "^3.3.2" - url-parse "^1.1.8" + url-parse "^1.4.3" sockjs@0.3.19: version "0.3.19" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== dependencies: faye-websocket "^0.10.0" uuid "^3.0.1" -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= dependencies: is-plain-obj "^1.0.0" source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: - atob "^2.0.0" + atob "^2.1.1" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" +source-map-support@~0.5.10: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: - source-map "^0.5.6" + buffer-from "^1.0.0" + source-map "^0.6.0" source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== -spdy-transport@^2.0.18: - version "2.0.20" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: - debug "^2.6.8" - detect-node "^2.0.3" + debug "^4.1.0" + detect-node "^2.0.4" hpack.js "^2.1.6" - obuf "^1.1.1" - readable-stream "^2.2.9" - safe-buffer "^5.0.1" - wbuf "^1.7.2" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" -spdy@^3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" +spdy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52" + integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q== dependencies: - debug "^2.6.8" - handle-thing "^1.2.5" + debug "^4.1.0" + handle-thing "^2.0.0" http-deceiver "^1.2.7" - safe-buffer "^5.0.1" select-hose "^2.0.0" - spdy-transport "^2.0.18" + spdy-transport "^3.0.0" split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" + figgy-pudding "^3.5.1" static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2": - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -stifle@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stifle/-/stifle-1.0.4.tgz#8b3bcdf52419b0a9c79e35adadce50123c1d8e99" +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + stream-http@^2.7.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.3.3" + readable-stream "^2.3.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -string-width@^1.0.1, string-width@^1.0.2: +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@^1.0.0, string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: - safe-buffer "~5.1.0" + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: - is-utf8 "^0.2.0" + ansi-regex "^4.1.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -style-loader@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.1.tgz#591ffc80bcefe268b77c5d9ebc0505d772619f85" - dependencies: - loader-utils "^1.0.2" - schema-utils "^0.3.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - -supports-color@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" +style-loader@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== dependencies: - has-flag "^2.0.0" + loader-utils "^1.1.0" + schema-utils "^1.0.0" -supports-color@^5.1.0, supports-color@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -symbol-observable@^1.0.4, symbol-observable@^1.1.0: +symbol-observable@1.2.0, symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" +table@^5.0.2, table@^5.2.3: + version "5.4.0" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.0.tgz#d772a3216e68829920a41a32c18eda286c95d780" + integrity sha512-nHFDrxmbrkU7JAFKqKbDJXfzrX2UBsWmrieXFTGxiI5e4ncg3VqsZeI4EzNmX0ncp4XNGVeoxIWJXfCIXwrsvw== dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" -table@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^4: + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.5" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz#69aa22426299f4b5b3775cbed8cb2c5d419aa1d4" + integrity sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg== dependencies: - ajv "^6.0.1" - ajv-keywords "^3.0.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -tapable@^0.2.7: - version "0.2.8" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + cacache "^11.3.2" + find-cache-dir "^2.0.0" + is-wsl "^1.1.0" + loader-utils "^1.2.3" + schema-utils "^1.0.0" + serialize-javascript "^1.7.0" + source-map "^0.6.1" + terser "^4.0.0" + webpack-sources "^1.3.0" + worker-farm "^1.7.0" -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" +terser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.0.0.tgz#ef356f6f359a963e2cc675517f21c1c382877374" + integrity sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA== dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" -text-table@~0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -theming@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/theming/-/theming-1.3.0.tgz#286d5bae80be890d0adc645e5ca0498723725bdc" +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: - brcast "^3.0.1" - is-function "^1.0.1" - is-plain-object "^2.0.1" - prop-types "^15.5.8" + readable-stream "~2.3.6" + xtend "~4.0.1" through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= thunky@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" - -time-stamp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" + version "1.0.3" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" + integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== -timed-out@^4.0.0: +timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae" + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== dependencies: setimmediate "^1.0.4" tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" -to-regex@^3.0.1: +to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@~2.3.0: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - dependencies: - punycode "^1.4.1" +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== "traverse@>=0.3.0 <0.4": version "0.3.9" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" -type-is@~1.6.15: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" - mime-types "~2.1.18" + mime-types "~2.1.24" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -ua-parser-js@^0.7.9: - version "0.7.18" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" +ua-parser-js@^0.7.18: + version "0.7.20" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" + integrity sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw== -uglify-js@^2.8.29: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" +uglify-js@^3.1.4: + version "3.6.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" + commander "~2.20.0" + source-map "~0.6.1" -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== -uglifyjs-webpack-plugin@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== dependencies: - source-map "^0.5.6" - uglify-js "^2.8.29" - webpack-sources "^1.0.1" + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -6187,119 +6852,179 @@ union-value@^1.0.0: uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= -uniqid@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: - macaddress "^0.2.8" + unique-slug "^2.0.0" -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universal-user-agent@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" + integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== + dependencies: + os-name "^3.0.0" universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" -unzip@^0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/unzip/-/unzip-0.1.11.tgz#89749c63b058d7d90d619f86b98aa1535d3b97f0" - dependencies: - binary ">= 0.3.0 < 1" - fstream ">= 0.1.30 < 1" - match-stream ">= 0.0.2 < 1" - pullstream ">= 0.4.1 < 1" - readable-stream "~1.0.31" - setimmediate ">= 1.0.1 < 2" +unzipper@^0.9.3: + version "0.9.15" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.9.15.tgz#97d99203dad17698ee39882483c14e4845c7549c" + integrity sha512-2aaUvO4RAeHDvOCuEtth7jrHFaCKTSXPqUkXwADaLBzGbgZGzUDccoEdJ5lW+3RmfpOZYNx0Rw6F6PUzM6caIA== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "^1.0.12" + listenercount "~1.0.1" + readable-stream "~2.3.6" + setimmediate "~1.0.4" + +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== -upath@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d" +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-loader@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7" +url-loader@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" + integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg== dependencies: - loader-utils "^1.0.2" - mime "^1.4.1" - schema-utils "^0.3.0" + loader-utils "^1.1.0" + mime "^2.0.3" + schema-utils "^1.0.0" -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= dependencies: - prepend-http "^1.0.1" + prepend-http "^2.0.0" -url-parse@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== dependencies: - querystringify "0.0.x" - requires-port "1.0.x" + querystringify "^2.1.1" + requires-port "^1.0.0" -url-parse@^1.1.8: - version "1.2.0" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986" - dependencies: - querystringify "~1.0.0" - requires-port "~1.0.0" +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" -use@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" - dependencies: - define-property "^0.2.5" - isobject "^3.0.0" - lazy-cache "^2.0.2" +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" -util@0.10.3, util@^0.10.3: +util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.0, uuid@^3.0.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +uuid@^3.0.1, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +v8-compile-cache@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -6307,179 +7032,242 @@ validate-npm-package-license@^3.0.1: vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - -vendors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= dependencies: indexof "0.0.1" warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= dependencies: loose-envify "^1.0.0" -watchpack@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed" +warning@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" -wbuf@^1.1.0, wbuf@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" -webpack-dev-middleware@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" +webpack-cli@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.2.3.tgz#13653549adfd8ccd920ad7be1ef868bacc22e346" + integrity sha512-Ik3SjV6uJtWIAN5jp5ZuBMWEAaP5E4V78XJ2nI+paFPh8v4HPSwo/myN0r29Xc/6ZKnd2IdrAlpSgNOu2CDQ6Q== + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.0" + findup-sync "^2.0.0" + global-modules "^1.0.0" + import-local "^2.0.0" + interpret "^1.1.0" + loader-utils "^1.1.0" + supports-color "^5.5.0" + v8-compile-cache "^2.0.2" + yargs "^12.0.4" + +webpack-dashboard@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/webpack-dashboard/-/webpack-dashboard-3.0.0.tgz#14b2374841efd9b28d0368f07a38bc1af43970e1" + integrity sha512-OtqccZJLR9CPbn86p6iwXWrseh944AkNj0AzrNvC7j4x+yHjmX1dlDpyo1f35GwY6F9eBWpMffUoGeWrFjLNUA== + dependencies: + commander "^2.15.1" + cross-spawn "^6.0.5" + filesize "^3.6.1" + handlebars "^4.0.11" + inspectpack "^4.0.0" + most "^1.7.3" + neo-blessed "^0.2.0" + socket.io "^2.1.1" + socket.io-client "^2.1.1" + +webpack-dev-middleware@^3.5.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz#ef751d25f4e9a5c8a35da600c5fda3582b5c6cff" + integrity sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA== dependencies: - memory-fs "~0.4.1" - mime "^1.5.0" - path-is-absolute "^1.0.0" - range-parser "^1.0.3" - time-stamp "^2.0.0" + memory-fs "^0.4.1" + mime "^2.4.2" + range-parser "^1.2.1" + webpack-log "^2.0.0" -webpack-dev-server@^2.11.1: - version "2.11.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz#1f4f4c78bf1895378f376815910812daf79a216f" +webpack-dev-server@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz#1b45ce3ecfc55b6ebe5e36dab2777c02bc508c4e" + integrity sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw== dependencies: ansi-html "0.0.7" - array-includes "^3.0.3" bonjour "^3.5.0" chokidar "^2.0.0" compression "^1.5.2" connect-history-api-fallback "^1.3.0" - debug "^3.1.0" + debug "^4.1.1" del "^3.0.0" express "^4.16.2" html-entities "^1.2.0" - http-proxy-middleware "~0.17.4" - import-local "^1.0.0" - internal-ip "1.2.0" + http-proxy-middleware "^0.19.1" + import-local "^2.0.0" + internal-ip "^4.2.0" ip "^1.1.5" killable "^1.0.0" loglevel "^1.4.1" opn "^5.1.0" portfinder "^1.0.9" + schema-utils "^1.0.0" selfsigned "^1.9.1" + semver "^5.6.0" serve-index "^1.7.2" sockjs "0.3.19" - sockjs-client "1.1.4" - spdy "^3.4.1" + sockjs-client "1.3.0" + spdy "^4.0.0" strip-ansi "^3.0.0" - supports-color "^5.1.0" - webpack-dev-middleware "1.12.2" - yargs "6.6.0" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.5.1" + webpack-log "^2.0.0" + yargs "12.0.2" -webpack-sources@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4" + integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw== + dependencies: + lodash "^4.17.5" + +webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^3.10.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894" - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" +webpack@4.29.6: + version "4.29.6" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.6.tgz#66bf0ec8beee4d469f8b598d3988ff9d8d90e955" + integrity sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" memory-fs "~0.4.1" + micromatch "^3.1.8" mkdirp "~0.5.0" + neo-async "^2.5.0" node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" - webpack-sources "^1.0.1" - yargs "^8.0.2" + schema-utils "^1.0.0" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" websocket-driver@>=0.5.1: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + version "0.7.1" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.1.tgz#d58fa3269f51e480f5af051db7f5c5c1a1092d20" + integrity sha512-EC4YX5LEHtiB1XjaCh6++35jGaFmhT7687pySyCfPX9bB8Quw7+Fpx8gSCpkD78tPjalxuoOm8TtTz8K4dAQEg== dependencies: http-parser-js ">=0.4.0" + safe-buffer ">=5.1.1" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== whatwg-fetch@>=0.10.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" +which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.2" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + string-width "^1.0.2 || 2" -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" +windows-release@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" + integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== + dependencies: + execa "^1.0.0" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -6487,104 +7275,134 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" -xtend@^4.0.0: +ws@~6.1.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== + dependencies: + async-limiter "~1.0.0" + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== + +xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" + camelcase "^4.1.0" -yargs-parser@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== dependencies: - camelcase "^3.0.0" + camelcase "^5.0.0" + decamelize "^1.2.0" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= dependencies: camelcase "^4.1.0" -yargs@6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" +yargs@12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" + cliui "^4.0.0" + decamelize "^2.0.0" + find-up "^3.0.0" get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" + os-locale "^3.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^4.2.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" -yargs@^4.2.0: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" +yargs@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== dependencies: - cliui "^3.2.0" + cliui "^4.0.0" decamelize "^1.1.1" + find-up "^2.1.0" get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" + os-locale "^2.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" + string-width "^2.0.0" + which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^2.4.1" + yargs-parser "^9.0.2" -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" +yargs@^12.0.2, yargs@^12.0.4: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" + os-locale "^3.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= diff --git a/dashboard/dashboard.go b/dashboard/dashboard.go index 3ba92ac73eb0..d69a750f101e 100644 --- a/dashboard/dashboard.go +++ b/dashboard/dashboard.go @@ -18,8 +18,10 @@ package dashboard //go:generate yarn --cwd ./assets install //go:generate yarn --cwd ./assets build -//go:generate go-bindata -nometadata -o assets.go -prefix assets -nocompress -pkg dashboard assets/index.html assets/bundle.js +//go:generate yarn --cwd ./assets js-beautify -f bundle.js.map -r -w 1 +//go:generate go-bindata -nometadata -o assets.go -prefix assets -nocompress -pkg dashboard assets/index.html assets/bundle.js assets/bundle.js.map //go:generate sh -c "sed 's#var _bundleJs#//nolint:misspell\\\n&#' assets.go > assets.go.tmp && mv assets.go.tmp assets.go" +//go:generate sh -c "sed 's#var _bundleJsMap#//nolint:misspell\\\n&#' assets.go > assets.go.tmp && mv assets.go.tmp assets.go" //go:generate sh -c "sed 's#var _indexHtml#//nolint:misspell\\\n&#' assets.go > assets.go.tmp && mv assets.go.tmp assets.go" //go:generate gofmt -w -s assets.go @@ -27,16 +29,13 @@ import ( "fmt" "net" "net/http" - "runtime" "sync" "sync/atomic" "time" "io" - "github.com/elastic/gosigar" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" @@ -45,31 +44,29 @@ import ( ) const ( - activeMemorySampleLimit = 200 // Maximum number of active memory data samples - virtualMemorySampleLimit = 200 // Maximum number of virtual memory data samples - networkIngressSampleLimit = 200 // Maximum number of network ingress data samples - networkEgressSampleLimit = 200 // Maximum number of network egress data samples - processCPUSampleLimit = 200 // Maximum number of process cpu data samples - systemCPUSampleLimit = 200 // Maximum number of system cpu data samples - diskReadSampleLimit = 200 // Maximum number of disk read data samples - diskWriteSampleLimit = 200 // Maximum number of disk write data samples + sampleLimit = 200 // Maximum number of data samples ) -var nextID uint32 // Next connection id - // Dashboard contains the dashboard internals. type Dashboard struct { - config *Config + config *Config // Configuration values for the dashboard + + listener net.Listener // Network listener listening for dashboard clients + conns map[uint32]*client // Currently live websocket connections + nextConnID uint32 // Next connection id + + history *Message // Stored historical data - listener net.Listener - conns map[uint32]*client // Currently live websocket connections - history *Message - lock sync.RWMutex // Lock protecting the dashboard's internals + lock sync.Mutex // Lock protecting the dashboard's internals + sysLock sync.RWMutex // Lock protecting the stored system data + peerLock sync.RWMutex // Lock protecting the stored peer data + logLock sync.RWMutex // Lock protecting the stored log data - logdir string + geodb *geoDB // geoip database instance for IP to geographical information conversions + logdir string // Directory containing the log files quit chan chan error // Channel used for graceful exit - wg sync.WaitGroup + wg sync.WaitGroup // Wait group used to close the data collector threads } // client represents active websocket connection with a remote browser. @@ -96,14 +93,14 @@ func New(config *Config, commit string, logdir string) *Dashboard { Version: fmt.Sprintf("v%d.%d.%d%s", params.VersionMajor, params.VersionMinor, params.VersionPatch, versionMeta), }, System: &SystemMessage{ - ActiveMemory: emptyChartEntries(now, activeMemorySampleLimit, config.Refresh), - VirtualMemory: emptyChartEntries(now, virtualMemorySampleLimit, config.Refresh), - NetworkIngress: emptyChartEntries(now, networkIngressSampleLimit, config.Refresh), - NetworkEgress: emptyChartEntries(now, networkEgressSampleLimit, config.Refresh), - ProcessCPU: emptyChartEntries(now, processCPUSampleLimit, config.Refresh), - SystemCPU: emptyChartEntries(now, systemCPUSampleLimit, config.Refresh), - DiskRead: emptyChartEntries(now, diskReadSampleLimit, config.Refresh), - DiskWrite: emptyChartEntries(now, diskWriteSampleLimit, config.Refresh), + ActiveMemory: emptyChartEntries(now, sampleLimit), + VirtualMemory: emptyChartEntries(now, sampleLimit), + NetworkIngress: emptyChartEntries(now, sampleLimit), + NetworkEgress: emptyChartEntries(now, sampleLimit), + ProcessCPU: emptyChartEntries(now, sampleLimit), + SystemCPU: emptyChartEntries(now, sampleLimit), + DiskRead: emptyChartEntries(now, sampleLimit), + DiskWrite: emptyChartEntries(now, sampleLimit), }, }, logdir: logdir, @@ -111,12 +108,10 @@ func New(config *Config, commit string, logdir string) *Dashboard { } // emptyChartEntries returns a ChartEntry array containing limit number of empty samples. -func emptyChartEntries(t time.Time, limit int, refresh time.Duration) ChartEntries { +func emptyChartEntries(t time.Time, limit int) ChartEntries { ce := make(ChartEntries, limit) for i := 0; i < limit; i++ { - ce[i] = &ChartEntry{ - Time: t.Add(-time.Duration(i) * refresh), - } + ce[i] = new(ChartEntry) } return ce } @@ -132,9 +127,10 @@ func (db *Dashboard) APIs() []rpc.API { return nil } func (db *Dashboard) Start(server *p2p.Server) error { log.Info("Starting dashboard") - db.wg.Add(2) - go db.collectData() + db.wg.Add(3) + go db.collectSystemData() go db.streamLogs() + go db.collectPeerData() http.HandleFunc("/", db.webHandler) http.Handle("/api", websocket.Handler(db.apiHandler)) @@ -160,7 +156,7 @@ func (db *Dashboard) Stop() error { } // Close the collectors. errc := make(chan error, 1) - for i := 0; i < 2; i++ { + for i := 0; i < 3; i++ { db.quit <- errc if err := <-errc; err != nil { errs = append(errs, err) @@ -206,7 +202,7 @@ func (db *Dashboard) webHandler(w http.ResponseWriter, r *http.Request) { // apiHandler handles requests for the dashboard. func (db *Dashboard) apiHandler(conn *websocket.Conn) { - id := atomic.AddUint32(&nextID, 1) + id := atomic.AddUint32(&db.nextConnID, 1) client := &client{ conn: conn, msg: make(chan *Message, 128), @@ -233,10 +229,21 @@ func (db *Dashboard) apiHandler(conn *websocket.Conn) { } }() - db.lock.Lock() // Send the past data. - client.msg <- deepcopy.Copy(db.history).(*Message) + db.sysLock.RLock() + db.peerLock.RLock() + db.logLock.RLock() + + h := deepcopy.Copy(db.history).(*Message) + + db.sysLock.RUnlock() + db.peerLock.RUnlock() + db.logLock.RUnlock() + + client.msg <- h + // Start tracking the connection and drop at connection loss. + db.lock.Lock() db.conns[id] = client db.lock.Unlock() defer func() { @@ -259,136 +266,6 @@ func (db *Dashboard) apiHandler(conn *websocket.Conn) { } } -// meterCollector returns a function, which retrieves a specific meter. -func meterCollector(name string) func() int64 { - if metric := metrics.DefaultRegistry.Get(name); metric != nil { - m := metric.(metrics.Meter) - return func() int64 { - return m.Count() - } - } - return func() int64 { - return 0 - } -} - -// collectData collects the required data to plot on the dashboard. -func (db *Dashboard) collectData() { - defer db.wg.Done() - - systemCPUUsage := gosigar.Cpu{} - systemCPUUsage.Get() - var ( - mem runtime.MemStats - - collectNetworkIngress = meterCollector("p2p/InboundTraffic") - collectNetworkEgress = meterCollector("p2p/OutboundTraffic") - collectDiskRead = meterCollector("eth/db/chaindata/disk/read") - collectDiskWrite = meterCollector("eth/db/chaindata/disk/write") - - prevNetworkIngress = collectNetworkIngress() - prevNetworkEgress = collectNetworkEgress() - prevProcessCPUTime = getProcessCPUTime() - prevSystemCPUUsage = systemCPUUsage - prevDiskRead = collectDiskRead() - prevDiskWrite = collectDiskWrite() - - frequency = float64(db.config.Refresh / time.Second) - numCPU = float64(runtime.NumCPU()) - ) - - for { - select { - case errc := <-db.quit: - errc <- nil - return - case <-time.After(db.config.Refresh): - systemCPUUsage.Get() - var ( - curNetworkIngress = collectNetworkIngress() - curNetworkEgress = collectNetworkEgress() - curProcessCPUTime = getProcessCPUTime() - curSystemCPUUsage = systemCPUUsage - curDiskRead = collectDiskRead() - curDiskWrite = collectDiskWrite() - - deltaNetworkIngress = float64(curNetworkIngress - prevNetworkIngress) - deltaNetworkEgress = float64(curNetworkEgress - prevNetworkEgress) - deltaProcessCPUTime = curProcessCPUTime - prevProcessCPUTime - deltaSystemCPUUsage = curSystemCPUUsage.Delta(prevSystemCPUUsage) - deltaDiskRead = curDiskRead - prevDiskRead - deltaDiskWrite = curDiskWrite - prevDiskWrite - ) - prevNetworkIngress = curNetworkIngress - prevNetworkEgress = curNetworkEgress - prevProcessCPUTime = curProcessCPUTime - prevSystemCPUUsage = curSystemCPUUsage - prevDiskRead = curDiskRead - prevDiskWrite = curDiskWrite - - now := time.Now() - - runtime.ReadMemStats(&mem) - activeMemory := &ChartEntry{ - Time: now, - Value: float64(mem.Alloc) / frequency, - } - virtualMemory := &ChartEntry{ - Time: now, - Value: float64(mem.Sys) / frequency, - } - networkIngress := &ChartEntry{ - Time: now, - Value: deltaNetworkIngress / frequency, - } - networkEgress := &ChartEntry{ - Time: now, - Value: deltaNetworkEgress / frequency, - } - processCPU := &ChartEntry{ - Time: now, - Value: deltaProcessCPUTime / frequency / numCPU * 100, - } - systemCPU := &ChartEntry{ - Time: now, - Value: float64(deltaSystemCPUUsage.Sys+deltaSystemCPUUsage.User) / frequency / numCPU, - } - diskRead := &ChartEntry{ - Time: now, - Value: float64(deltaDiskRead) / frequency, - } - diskWrite := &ChartEntry{ - Time: now, - Value: float64(deltaDiskWrite) / frequency, - } - sys := db.history.System - db.lock.Lock() - sys.ActiveMemory = append(sys.ActiveMemory[1:], activeMemory) - sys.VirtualMemory = append(sys.VirtualMemory[1:], virtualMemory) - sys.NetworkIngress = append(sys.NetworkIngress[1:], networkIngress) - sys.NetworkEgress = append(sys.NetworkEgress[1:], networkEgress) - sys.ProcessCPU = append(sys.ProcessCPU[1:], processCPU) - sys.SystemCPU = append(sys.SystemCPU[1:], systemCPU) - sys.DiskRead = append(sys.DiskRead[1:], diskRead) - sys.DiskWrite = append(sys.DiskWrite[1:], diskWrite) - db.lock.Unlock() - - db.sendToAll(&Message{ - System: &SystemMessage{ - ActiveMemory: ChartEntries{activeMemory}, - VirtualMemory: ChartEntries{virtualMemory}, - NetworkIngress: ChartEntries{networkIngress}, - NetworkEgress: ChartEntries{networkEgress}, - ProcessCPU: ChartEntries{processCPU}, - SystemCPU: ChartEntries{systemCPU}, - DiskRead: ChartEntries{diskRead}, - DiskWrite: ChartEntries{diskWrite}, - }, - }) - } - } -} - // sendToAll sends the given message to the active dashboards. func (db *Dashboard) sendToAll(msg *Message) { db.lock.Lock() diff --git a/dashboard/geoip.go b/dashboard/geoip.go new file mode 100644 index 000000000000..9ca627d4f994 --- /dev/null +++ b/dashboard/geoip.go @@ -0,0 +1,98 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package dashboard + +import ( + "net" + "time" + + "github.com/apilayer/freegeoip" +) + +// geoDBInfo contains all the geographical information we could extract based on an IP +// address. +type geoDBInfo struct { + Country struct { + Names struct { + English string `maxminddb:"en" json:"en,omitempty"` + } `maxminddb:"names" json:"names,omitempty"` + } `maxminddb:"country" json:"country,omitempty"` + City struct { + Names struct { + English string `maxminddb:"en" json:"en,omitempty"` + } `maxminddb:"names" json:"names,omitempty"` + } `maxminddb:"city" json:"city,omitempty"` + Location struct { + Latitude float64 `maxminddb:"latitude" json:"latitude,omitempty"` + Longitude float64 `maxminddb:"longitude" json:"longitude,omitempty"` + } `maxminddb:"location" json:"location,omitempty"` +} + +// geoLocation contains geographical information. +type geoLocation struct { + Country string `json:"country,omitempty"` + City string `json:"city,omitempty"` + Latitude float64 `json:"latitude,omitempty"` + Longitude float64 `json:"longitude,omitempty"` +} + +// geoDB represents a geoip database that can be queried for IP to geographical +// information conversions. +type geoDB struct { + geodb *freegeoip.DB +} + +// Open creates a new geoip database with an up-to-date database from the internet. +func openGeoDB() (*geoDB, error) { + // Initiate a geoip database to cross reference locations + db, err := freegeoip.OpenURL(freegeoip.MaxMindDB, 24*time.Hour, time.Hour) + if err != nil { + return nil, err + } + // Wait until the database is updated to the latest data + select { + case <-db.NotifyOpen(): + case err := <-db.NotifyError(): + return nil, err + } + // Assemble and return our custom wrapper + return &geoDB{geodb: db}, nil +} + +// Close terminates the database background updater. +func (db *geoDB) close() error { + db.geodb.Close() + return nil +} + +// Lookup converts an IP address to a geographical location. +func (db *geoDB) lookup(ip net.IP) *geoDBInfo { + result := new(geoDBInfo) + db.geodb.Lookup(ip, result) + return result +} + +// Location retrieves the geographical location of the given IP address. +func (db *geoDB) location(ip string) *geoLocation { + location := db.lookup(net.ParseIP(ip)) + return &geoLocation{ + Country: location.Country.Names.English, + City: location.City.Names.English, + Latitude: location.Location.Latitude, + Longitude: location.Location.Longitude, + } +} diff --git a/dashboard/log.go b/dashboard/log.go index 5d852d60a4db..be7732695c39 100644 --- a/dashboard/log.go +++ b/dashboard/log.go @@ -94,13 +94,13 @@ func (db *Dashboard) handleLogRequest(r *LogsRequest, c *client) { // The last file is continuously updated, and its chunks are streamed, // so in order to avoid log record duplication on the client side, it is // handled differently. Its actual content is always saved in the history. - db.lock.Lock() + db.logLock.RLock() if db.history.Logs != nil { c.msg <- &Message{ - Logs: db.history.Logs, + Logs: deepcopy.Copy(db.history.Logs).(*LogsMessage), } } - db.lock.Unlock() + db.logLock.RUnlock() return case fileNames[idx] == r.Name: idx++ @@ -174,7 +174,7 @@ func (db *Dashboard) streamLogs() { log.Warn("Problem with file", "name", opened.Name(), "err", err) return } - db.lock.Lock() + db.logLock.Lock() db.history.Logs = &LogsMessage{ Source: &LogFile{ Name: fi.Name(), @@ -182,7 +182,7 @@ func (db *Dashboard) streamLogs() { }, Chunk: emptyChunk, } - db.lock.Unlock() + db.logLock.Unlock() watcher := make(chan notify.EventInfo, 10) if err := notify.Watch(db.logdir, watcher, notify.Create); err != nil { @@ -240,10 +240,10 @@ loop: log.Warn("Problem with file", "name", opened.Name(), "err", err) break loop } - db.lock.Lock() + db.logLock.Lock() db.history.Logs.Source.Name = fi.Name() db.history.Logs.Chunk = emptyChunk - db.lock.Unlock() + db.logLock.Unlock() case <-ticker.C: // Send log updates to the client. if opened == nil { log.Warn("The last log file is not opened") @@ -266,7 +266,7 @@ loop: var l *LogsMessage // Update the history. - db.lock.Lock() + db.logLock.Lock() if bytes.Equal(db.history.Logs.Chunk, emptyChunk) { db.history.Logs.Chunk = chunk l = deepcopy.Copy(db.history.Logs).(*LogsMessage) @@ -278,7 +278,7 @@ loop: db.history.Logs.Chunk = b l = &LogsMessage{Chunk: chunk} } - db.lock.Unlock() + db.logLock.Unlock() db.sendToAll(&Message{Logs: l}) case errc = <-db.quit: diff --git a/dashboard/message.go b/dashboard/message.go index 46856b9e6eed..797b210fa839 100644 --- a/dashboard/message.go +++ b/dashboard/message.go @@ -18,7 +18,6 @@ package dashboard import ( "encoding/json" - "time" ) type Message struct { @@ -34,8 +33,7 @@ type Message struct { type ChartEntries []*ChartEntry type ChartEntry struct { - Time time.Time `json:"time,omitempty"` - Value float64 `json:"value,omitempty"` + Value float64 `json:"value"` } type GeneralMessage struct { @@ -55,10 +53,14 @@ type TxPoolMessage struct { /* TODO (kurkomisi) */ } +// NetworkMessage contains information about the peers +// organized based on their IP address and node ID. type NetworkMessage struct { - /* TODO (kurkomisi) */ + Peers *peerContainer `json:"peers,omitempty"` // Peer tree. + Diff []*peerEvent `json:"diff,omitempty"` // Events that change the peer tree. } +// SystemMessage contains the metered system data samples. type SystemMessage struct { ActiveMemory ChartEntries `json:"activeMemory,omitempty"` VirtualMemory ChartEntries `json:"virtualMemory,omitempty"` @@ -70,7 +72,7 @@ type SystemMessage struct { DiskWrite ChartEntries `json:"diskWrite,omitempty"` } -// LogsMessage wraps up a log chunk. If Source isn't present, the chunk is a stream chunk. +// LogsMessage wraps up a log chunk. If 'Source' isn't present, the chunk is a stream chunk. type LogsMessage struct { Source *LogFile `json:"source,omitempty"` // Attributes of the log file. Chunk json.RawMessage `json:"chunk"` // Contains log records. @@ -87,6 +89,7 @@ type Request struct { Logs *LogsRequest `json:"logs,omitempty"` } +// LogsRequest contains the attributes of the log file the client wants to receive. type LogsRequest struct { Name string `json:"name"` // The request handler searches for log file based on this file name. Past bool `json:"past"` // Denotes whether the client wants the previous or the next file. diff --git a/dashboard/peers.go b/dashboard/peers.go new file mode 100644 index 000000000000..334302cc120e --- /dev/null +++ b/dashboard/peers.go @@ -0,0 +1,552 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package dashboard + +import ( + "container/list" + "strings" + "time" + + "github.com/ethereum/go-ethereum/metrics" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" +) + +const ( + eventBufferLimit = 128 // Maximum number of buffered peer events. + knownPeerLimit = 100 // Maximum number of stored peers, which successfully made the handshake. + attemptLimit = 200 // Maximum number of stored peers, which failed to make the handshake. + + // eventLimit is the maximum number of the dashboard's custom peer events, + // that are collected between two metering period and sent to the clients + // as one message. + // TODO (kurkomisi): Limit the number of events. + eventLimit = knownPeerLimit << 2 +) + +// peerContainer contains information about the node's peers. This data structure +// maintains the metered peer data based on the different behaviours of the peers. +// +// Every peer has an IP address, and the peers that manage to make the handshake +// (known peers) have node IDs too. There can appear more peers with the same IP, +// therefore the peer container data structure is a tree consisting of a map of +// maps, where the first key groups the peers by IP, while the second one groups +// them by the node ID. The known peers can be active if their connection is still +// open, or inactive otherwise. The peers failing before the handshake (unknown +// peers) only have IP addresses, so their connection attempts are stored as part +// of the value of the outer map. +// +// Another criteria is to limit the number of metered peers so that +// they don't fill the memory. The selection order is based on the +// peers activity: the peers that are inactive for the longest time +// are thrown first. For the selection a fifo list is used which is +// linked to the bottom of the peer tree in a way that every activity +// of the peer pushes the peer to the end of the list, so the inactive +// ones come to the front. When a peer has some activity, it is removed +// from and reinserted into the list. When the length of the list reaches +// the limit, the first element is removed from the list, as well as from +// the tree. +// +// The active peers have priority over the inactive ones, therefore +// they have their own list. The separation makes it sure that the +// inactive peers are always removed before the active ones. +// +// The peers that don't manage to make handshake are not inserted into the list, +// only their connection attempts are appended to the array belonging to their IP. +// In order to keep the fifo principle, a super array contains the order of the +// attempts, and when the overall count reaches the limit, the earliest attempt is +// removed from the beginning of its array. +// +// This data structure makes it possible to marshal the peer +// history simply by passing it to the JSON marshaler. +type peerContainer struct { + // Bundles is the outer map using the peer's IP address as key. + Bundles map[string]*peerBundle `json:"bundles,omitempty"` + + activeCount int // Number of the still connected peers + + // inactivePeers contains the peers with closed connection in chronological order. + inactivePeers *list.List + + // attemptOrder is the super array containing the IP addresses, from which + // the peers attempted to connect then failed before/during the handshake. + // Its values are appended in chronological order, which means that the + // oldest attempt is at the beginning of the array. When the first element + // is removed, the first element of the related bundle's attempt array is + // removed too, ensuring that always the latest attempts are stored. + attemptOrder []string + + // geodb is the geoip database used to retrieve the peers' geographical location. + geodb *geoDB +} + +// newPeerContainer returns a new instance of the peer container. +func newPeerContainer(geodb *geoDB) *peerContainer { + return &peerContainer{ + Bundles: make(map[string]*peerBundle), + inactivePeers: list.New(), + attemptOrder: make([]string, 0, attemptLimit), + geodb: geodb, + } +} + +// bundle inserts a new peer bundle into the map, if the peer belonging +// to the given IP wasn't metered so far. In this case retrieves the location of +// the IP address from the database and creates a corresponding peer event. +// Returns the bundle belonging to the given IP and the events occurring during +// the initialization. +func (pc *peerContainer) bundle(ip string) (*peerBundle, []*peerEvent) { + var events []*peerEvent + if _, ok := pc.Bundles[ip]; !ok { + location := pc.geodb.location(ip) + events = append(events, &peerEvent{ + IP: ip, + Location: location, + }) + pc.Bundles[ip] = &peerBundle{ + Location: location, + KnownPeers: make(map[string]*knownPeer), + } + } + return pc.Bundles[ip], events +} + +// extendKnown handles the events of the successfully connected peers. +// Returns the events occurring during the extension. +func (pc *peerContainer) extendKnown(event *peerEvent) []*peerEvent { + bundle, events := pc.bundle(event.IP) + peer, peerEvents := bundle.knownPeer(event.IP, event.ID) + events = append(events, peerEvents...) + // Append the connect and the disconnect events to + // the corresponding arrays keeping the limit. + switch { + case event.Connected != nil: + peer.Connected = append(peer.Connected, event.Connected) + if first := len(peer.Connected) - sampleLimit; first > 0 { + peer.Connected = peer.Connected[first:] + } + peer.Active = true + events = append(events, &peerEvent{ + Activity: Active, + IP: peer.ip, + ID: peer.id, + }) + pc.activeCount++ + if peer.listElement != nil { + _ = pc.inactivePeers.Remove(peer.listElement) + peer.listElement = nil + } + case event.Disconnected != nil: + peer.Disconnected = append(peer.Disconnected, event.Disconnected) + if first := len(peer.Disconnected) - sampleLimit; first > 0 { + peer.Disconnected = peer.Disconnected[first:] + } + peer.Active = false + events = append(events, &peerEvent{ + Activity: Inactive, + IP: peer.ip, + ID: peer.id, + }) + pc.activeCount-- + if peer.listElement != nil { + // If the peer is already in the list, remove and reinsert it. + _ = pc.inactivePeers.Remove(peer.listElement) + } + // Insert the peer into the list. + peer.listElement = pc.inactivePeers.PushBack(peer) + } + for pc.inactivePeers.Len() > 0 && pc.activeCount+pc.inactivePeers.Len() > knownPeerLimit { + // While the count of the known peers is greater than the limit, + // remove the first element from the inactive peer list and from the map. + if removedPeer, ok := pc.inactivePeers.Remove(pc.inactivePeers.Front()).(*knownPeer); ok { + events = append(events, pc.removeKnown(removedPeer.ip, removedPeer.id)...) + } else { + log.Warn("Failed to parse the removed peer") + } + } + if pc.activeCount > knownPeerLimit { + log.Warn("Number of active peers is greater than the limit") + } + return events +} + +// handleAttempt handles the events of the peers failing before/during the handshake. +// Returns the events occurring during the extension. +func (pc *peerContainer) handleAttempt(event *peerEvent) []*peerEvent { + bundle, events := pc.bundle(event.IP) + bundle.Attempts = append(bundle.Attempts, &peerAttempt{ + Connected: *event.Connected, + Disconnected: *event.Disconnected, + }) + pc.attemptOrder = append(pc.attemptOrder, event.IP) + for len(pc.attemptOrder) > attemptLimit { + // While the length of the connection attempt order array is greater + // than the limit, remove the first element from the involved peer's + // array and also from the super array. + events = append(events, pc.removeAttempt(pc.attemptOrder[0])...) + pc.attemptOrder = pc.attemptOrder[1:] + } + return events +} + +// peerBundle contains the peers belonging to a given IP address. +type peerBundle struct { + // Location contains the geographical location based on the bundle's IP address. + Location *geoLocation `json:"location,omitempty"` + + // KnownPeers is the inner map of the metered peer + // maintainer data structure using the node ID as key. + KnownPeers map[string]*knownPeer `json:"knownPeers,omitempty"` + + // Attempts contains the failed connection attempts of the + // peers belonging to a given IP address in chronological order. + Attempts []*peerAttempt `json:"attempts,omitempty"` +} + +// removeKnown removes the known peer belonging to the +// given IP address and node ID from the peer tree. +func (pc *peerContainer) removeKnown(ip, id string) (events []*peerEvent) { + // TODO (kurkomisi): Remove peers that don't have traffic samples anymore. + if bundle, ok := pc.Bundles[ip]; ok { + if _, ok := bundle.KnownPeers[id]; ok { + events = append(events, &peerEvent{ + Remove: RemoveKnown, + IP: ip, + ID: id, + }) + delete(bundle.KnownPeers, id) + } else { + log.Warn("No peer to remove", "ip", ip, "id", id) + } + if len(bundle.KnownPeers) < 1 && len(bundle.Attempts) < 1 { + events = append(events, &peerEvent{ + Remove: RemoveBundle, + IP: ip, + }) + delete(pc.Bundles, ip) + } + } else { + log.Warn("No bundle to remove", "ip", ip) + } + return events +} + +// removeAttempt removes the peer attempt belonging to the +// given IP address and node ID from the peer tree. +func (pc *peerContainer) removeAttempt(ip string) (events []*peerEvent) { + if bundle, ok := pc.Bundles[ip]; ok { + if len(bundle.Attempts) > 0 { + events = append(events, &peerEvent{ + Remove: RemoveAttempt, + IP: ip, + }) + bundle.Attempts = bundle.Attempts[1:] + } + if len(bundle.Attempts) < 1 && len(bundle.KnownPeers) < 1 { + events = append(events, &peerEvent{ + Remove: RemoveBundle, + IP: ip, + }) + delete(pc.Bundles, ip) + } + } + return events +} + +// knownPeer inserts a new peer into the map, if the peer belonging +// to the given IP address and node ID wasn't metered so far. Returns the peer +// belonging to the given IP and ID as well as the events occurring during the +// initialization. +func (bundle *peerBundle) knownPeer(ip, id string) (*knownPeer, []*peerEvent) { + var events []*peerEvent + if _, ok := bundle.KnownPeers[id]; !ok { + now := time.Now() + ingress := emptyChartEntries(now, sampleLimit) + egress := emptyChartEntries(now, sampleLimit) + events = append(events, &peerEvent{ + IP: ip, + ID: id, + Ingress: append([]*ChartEntry{}, ingress...), + Egress: append([]*ChartEntry{}, egress...), + }) + bundle.KnownPeers[id] = &knownPeer{ + ip: ip, + id: id, + Ingress: ingress, + Egress: egress, + } + } + return bundle.KnownPeers[id], events +} + +// knownPeer contains the metered data of a particular peer. +type knownPeer struct { + // Connected contains the timestamps of the peer's connection events. + Connected []*time.Time `json:"connected,omitempty"` + + // Disconnected contains the timestamps of the peer's disconnection events. + Disconnected []*time.Time `json:"disconnected,omitempty"` + + // Ingress and Egress contain the peer's traffic samples, which are collected + // periodically from the metrics registry. + // + // A peer can connect multiple times, and we want to visualize the time + // passed between two connections, so after the first connection a 0 value + // is appended to the traffic arrays even if the peer is inactive until the + // peer is removed. + Ingress ChartEntries `json:"ingress,omitempty"` + Egress ChartEntries `json:"egress,omitempty"` + + Active bool `json:"active"` // Denotes if the peer is still connected. + + listElement *list.Element // Pointer to the peer element in the list. + ip, id string // The IP and the ID by which the peer can be accessed in the tree. + prevIngress float64 + prevEgress float64 +} + +// peerAttempt contains a failed peer connection attempt's attributes. +type peerAttempt struct { + // Connected contains the timestamp of the connection attempt's moment. + Connected time.Time `json:"connected"` + + // Disconnected contains the timestamp of the + // moment when the connection attempt failed. + Disconnected time.Time `json:"disconnected"` +} + +type RemovedPeerType string +type ActivityType string + +const ( + RemoveKnown RemovedPeerType = "known" + RemoveAttempt RemovedPeerType = "attempt" + RemoveBundle RemovedPeerType = "bundle" + + Active ActivityType = "active" + Inactive ActivityType = "inactive" +) + +// peerEvent contains the attributes of a peer event. +type peerEvent struct { + IP string `json:"ip,omitempty"` // IP address of the peer. + ID string `json:"id,omitempty"` // Node ID of the peer. + Remove RemovedPeerType `json:"remove,omitempty"` // Type of the peer that is to be removed. + Location *geoLocation `json:"location,omitempty"` // Geographical location of the peer. + Connected *time.Time `json:"connected,omitempty"` // Timestamp of the connection moment. + Disconnected *time.Time `json:"disconnected,omitempty"` // Timestamp of the disonnection moment. + Ingress ChartEntries `json:"ingress,omitempty"` // Ingress samples. + Egress ChartEntries `json:"egress,omitempty"` // Egress samples. + Activity ActivityType `json:"activity,omitempty"` // Connection status change. +} + +// trafficMap is a container for the periodically collected peer traffic. +type trafficMap map[string]map[string]float64 + +// insert inserts a new value to the traffic map. Overwrites +// the value at the given ip and id if that already exists. +func (m *trafficMap) insert(ip, id string, val float64) { + if _, ok := (*m)[ip]; !ok { + (*m)[ip] = make(map[string]float64) + } + (*m)[ip][id] = val +} + +// collectPeerData gathers data about the peers and sends it to the clients. +func (db *Dashboard) collectPeerData() { + defer db.wg.Done() + + // Open the geodb database for IP to geographical information conversions. + var err error + db.geodb, err = openGeoDB() + if err != nil { + log.Warn("Failed to open geodb", "err", err) + return + } + defer db.geodb.close() + + peerCh := make(chan p2p.MeteredPeerEvent, eventBufferLimit) // Peer event channel. + subPeer := p2p.SubscribeMeteredPeerEvent(peerCh) // Subscribe to peer events. + defer subPeer.Unsubscribe() // Unsubscribe at the end. + + ticker := time.NewTicker(db.config.Refresh) + defer ticker.Stop() + + type registryFunc func(name string, i interface{}) + type collectorFunc func(traffic *trafficMap) registryFunc + + // trafficCollector generates a function that can be passed to + // the prefixed peer registry in order to collect the metered + // traffic data from each peer meter. + trafficCollector := func(prefix string) collectorFunc { + // This part makes is possible to collect the + // traffic data into a map from outside. + return func(traffic *trafficMap) registryFunc { + // The function which can be passed to the registry. + return func(name string, i interface{}) { + if m, ok := i.(metrics.Meter); ok { + // The name of the meter has the format: / + if k := strings.Split(strings.TrimPrefix(name, prefix), "/"); len(k) == 2 { + traffic.insert(k[0], k[1], float64(m.Count())) + } else { + log.Warn("Invalid meter name", "name", name, "prefix", prefix) + } + } else { + log.Warn("Invalid meter type", "name", name) + } + } + } + } + collectIngress := trafficCollector(p2p.MetricsInboundTraffic + "/") + collectEgress := trafficCollector(p2p.MetricsOutboundTraffic + "/") + + peers := newPeerContainer(db.geodb) + db.peerLock.Lock() + db.history.Network = &NetworkMessage{ + Peers: peers, + } + db.peerLock.Unlock() + + // newPeerEvents contains peer events, which trigger operations that + // will be executed on the peer tree after a metering period. + newPeerEvents := make([]*peerEvent, 0, eventLimit) + ingress, egress := new(trafficMap), new(trafficMap) + *ingress, *egress = make(trafficMap), make(trafficMap) + + for { + select { + case event := <-peerCh: + now := time.Now() + switch event.Type { + case p2p.PeerConnected: + connected := now.Add(-event.Elapsed) + newPeerEvents = append(newPeerEvents, &peerEvent{ + IP: event.IP.String(), + ID: event.ID.String(), + Connected: &connected, + }) + case p2p.PeerDisconnected: + ip, id := event.IP.String(), event.ID.String() + newPeerEvents = append(newPeerEvents, &peerEvent{ + IP: ip, + ID: id, + Disconnected: &now, + }) + // The disconnect event comes with the last metered traffic count, + // because after the disconnection the peer's meter is removed + // from the registry. It can happen, that between two metering + // period the same peer disconnects multiple times, and appending + // all the samples to the traffic arrays would shift the metering, + // so only the last metering is stored, overwriting the previous one. + ingress.insert(ip, id, float64(event.Ingress)) + egress.insert(ip, id, float64(event.Egress)) + case p2p.PeerHandshakeFailed: + connected := now.Add(-event.Elapsed) + newPeerEvents = append(newPeerEvents, &peerEvent{ + IP: event.IP.String(), + Connected: &connected, + Disconnected: &now, + }) + default: + log.Error("Unknown metered peer event type", "type", event.Type) + } + case <-ticker.C: + // Collect the traffic samples from the registry. + p2p.PeerIngressRegistry.Each(collectIngress(ingress)) + p2p.PeerEgressRegistry.Each(collectEgress(egress)) + + // Protect 'peers', because it is part of the history. + db.peerLock.Lock() + + var diff []*peerEvent + for i := 0; i < len(newPeerEvents); i++ { + if newPeerEvents[i].IP == "" { + log.Warn("Peer event without IP", "event", *newPeerEvents[i]) + continue + } + diff = append(diff, newPeerEvents[i]) + // There are two main branches of peer events coming from the event + // feed, one belongs to the known peers, one to the unknown peers. + // If the event has node ID, it belongs to a known peer, otherwise + // to an unknown one, which is considered as connection attempt. + // + // The extension can produce additional peer events, such + // as remove, location and initial samples events. + if newPeerEvents[i].ID == "" { + diff = append(diff, peers.handleAttempt(newPeerEvents[i])...) + continue + } + diff = append(diff, peers.extendKnown(newPeerEvents[i])...) + } + // Update the peer tree using the traffic maps. + for ip, bundle := range peers.Bundles { + for id, peer := range bundle.KnownPeers { + // Value is 0 if the traffic map doesn't have the + // entry corresponding to the given IP and ID. + curIngress, curEgress := (*ingress)[ip][id], (*egress)[ip][id] + deltaIngress, deltaEgress := curIngress, curEgress + if deltaIngress >= peer.prevIngress { + deltaIngress -= peer.prevIngress + } + if deltaEgress >= peer.prevEgress { + deltaEgress -= peer.prevEgress + } + peer.prevIngress, peer.prevEgress = curIngress, curEgress + i := &ChartEntry{ + Value: deltaIngress, + } + e := &ChartEntry{ + Value: deltaEgress, + } + peer.Ingress = append(peer.Ingress, i) + peer.Egress = append(peer.Egress, e) + if first := len(peer.Ingress) - sampleLimit; first > 0 { + peer.Ingress = peer.Ingress[first:] + } + if first := len(peer.Egress) - sampleLimit; first > 0 { + peer.Egress = peer.Egress[first:] + } + // Creating the traffic sample events. + diff = append(diff, &peerEvent{ + IP: ip, + ID: id, + Ingress: ChartEntries{i}, + Egress: ChartEntries{e}, + }) + } + } + db.peerLock.Unlock() + + if len(diff) > 0 { + db.sendToAll(&Message{Network: &NetworkMessage{ + Diff: diff, + }}) + } + // Clear the traffic maps, and the event array, + // prepare them for the next metering. + *ingress, *egress = make(trafficMap), make(trafficMap) + newPeerEvents = newPeerEvents[:0] + case err := <-subPeer.Err(): + log.Warn("Peer subscription error", "err", err) + return + case errc := <-db.quit: + errc <- nil + return + } + } +} diff --git a/dashboard/system.go b/dashboard/system.go new file mode 100644 index 000000000000..5b90a17ef849 --- /dev/null +++ b/dashboard/system.go @@ -0,0 +1,146 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package dashboard + +import ( + "runtime" + "time" + + "github.com/elastic/gosigar" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/p2p" +) + +// meterCollector returns a function, which retrieves the count of a specific meter. +func meterCollector(name string) func() int64 { + if meter := metrics.Get(name); meter != nil { + m := meter.(metrics.Meter) + return func() int64 { + return m.Count() + } + } + return func() int64 { + return 0 + } +} + +// collectSystemData gathers data about the system and sends it to the clients. +func (db *Dashboard) collectSystemData() { + defer db.wg.Done() + + systemCPUUsage := gosigar.Cpu{} + systemCPUUsage.Get() + var ( + mem runtime.MemStats + + collectNetworkIngress = meterCollector(p2p.MetricsInboundTraffic) + collectNetworkEgress = meterCollector(p2p.MetricsOutboundTraffic) + collectDiskRead = meterCollector("eth/db/chaindata/disk/read") + collectDiskWrite = meterCollector("eth/db/chaindata/disk/write") + + prevNetworkIngress = collectNetworkIngress() + prevNetworkEgress = collectNetworkEgress() + prevProcessCPUTime = getProcessCPUTime() + prevSystemCPUUsage = systemCPUUsage + prevDiskRead = collectDiskRead() + prevDiskWrite = collectDiskWrite() + + frequency = float64(db.config.Refresh / time.Second) + numCPU = float64(runtime.NumCPU()) + ) + + for { + select { + case errc := <-db.quit: + errc <- nil + return + case <-time.After(db.config.Refresh): + systemCPUUsage.Get() + var ( + curNetworkIngress = collectNetworkIngress() + curNetworkEgress = collectNetworkEgress() + curProcessCPUTime = getProcessCPUTime() + curSystemCPUUsage = systemCPUUsage + curDiskRead = collectDiskRead() + curDiskWrite = collectDiskWrite() + + deltaNetworkIngress = float64(curNetworkIngress - prevNetworkIngress) + deltaNetworkEgress = float64(curNetworkEgress - prevNetworkEgress) + deltaProcessCPUTime = curProcessCPUTime - prevProcessCPUTime + deltaSystemCPUUsage = curSystemCPUUsage.Delta(prevSystemCPUUsage) + deltaDiskRead = curDiskRead - prevDiskRead + deltaDiskWrite = curDiskWrite - prevDiskWrite + ) + prevNetworkIngress = curNetworkIngress + prevNetworkEgress = curNetworkEgress + prevProcessCPUTime = curProcessCPUTime + prevSystemCPUUsage = curSystemCPUUsage + prevDiskRead = curDiskRead + prevDiskWrite = curDiskWrite + + runtime.ReadMemStats(&mem) + activeMemory := &ChartEntry{ + Value: float64(mem.Alloc) / frequency, + } + virtualMemory := &ChartEntry{ + Value: float64(mem.Sys) / frequency, + } + networkIngress := &ChartEntry{ + Value: deltaNetworkIngress / frequency, + } + networkEgress := &ChartEntry{ + Value: deltaNetworkEgress / frequency, + } + processCPU := &ChartEntry{ + Value: deltaProcessCPUTime / frequency / numCPU * 100, + } + systemCPU := &ChartEntry{ + Value: float64(deltaSystemCPUUsage.Sys+deltaSystemCPUUsage.User) / frequency / numCPU, + } + diskRead := &ChartEntry{ + Value: float64(deltaDiskRead) / frequency, + } + diskWrite := &ChartEntry{ + Value: float64(deltaDiskWrite) / frequency, + } + db.sysLock.Lock() + sys := db.history.System + sys.ActiveMemory = append(sys.ActiveMemory[1:], activeMemory) + sys.VirtualMemory = append(sys.VirtualMemory[1:], virtualMemory) + sys.NetworkIngress = append(sys.NetworkIngress[1:], networkIngress) + sys.NetworkEgress = append(sys.NetworkEgress[1:], networkEgress) + sys.ProcessCPU = append(sys.ProcessCPU[1:], processCPU) + sys.SystemCPU = append(sys.SystemCPU[1:], systemCPU) + sys.DiskRead = append(sys.DiskRead[1:], diskRead) + sys.DiskWrite = append(sys.DiskWrite[1:], diskWrite) + db.sysLock.Unlock() + + db.sendToAll(&Message{ + System: &SystemMessage{ + ActiveMemory: ChartEntries{activeMemory}, + VirtualMemory: ChartEntries{virtualMemory}, + NetworkIngress: ChartEntries{networkIngress}, + NetworkEgress: ChartEntries{networkEgress}, + ProcessCPU: ChartEntries{processCPU}, + SystemCPU: ChartEntries{systemCPU}, + DiskRead: ChartEntries{diskRead}, + DiskWrite: ChartEntries{diskWrite}, + }, + }) + } + } +} diff --git a/docs/audits/2017-04-25_Geth-audit_Truesec.pdf b/docs/audits/2017-04-25_Geth-audit_Truesec.pdf new file mode 100644 index 000000000000..702dc99567f3 Binary files /dev/null and b/docs/audits/2017-04-25_Geth-audit_Truesec.pdf differ diff --git a/docs/audits/2018-09-14_Clef-audit_NCC.pdf b/docs/audits/2018-09-14_Clef-audit_NCC.pdf new file mode 100644 index 000000000000..1a5c66f178af Binary files /dev/null and b/docs/audits/2018-09-14_Clef-audit_NCC.pdf differ diff --git a/eth/api.go b/eth/api.go index 3ec3afb81e14..98c2f5874f04 100644 --- a/eth/api.go +++ b/eth/api.go @@ -35,7 +35,6 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/internal/ethapi" - "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/trie" @@ -70,7 +69,7 @@ func (api *PublicEthereumAPI) Hashrate() hexutil.Uint64 { // ChainId is the EIP-155 replay-protection chain id for the current ethereum chain config. func (api *PublicEthereumAPI) ChainId() hexutil.Uint64 { chainID := new(big.Int) - if config := api.e.chainConfig; config.IsEIP155(api.e.blockchain.CurrentBlock().Number()) { + if config := api.e.blockchain.Config(); config.IsEIP155(api.e.blockchain.CurrentBlock().Number()) { chainID = config.ChainID } return (hexutil.Uint64)(chainID.Uint64()) @@ -267,7 +266,7 @@ func (api *PublicDebugAPI) DumpBlock(blockNr rpc.BlockNumber) (state.Dump, error // both the pending block as well as the pending state from // the miner and operate on those _, stateDb := api.eth.miner.Pending() - return stateDb.RawDump(), nil + return stateDb.RawDump(false, false, true), nil } var block *types.Block if blockNr == rpc.LatestBlockNumber { @@ -282,20 +281,19 @@ func (api *PublicDebugAPI) DumpBlock(blockNr rpc.BlockNumber) (state.Dump, error if err != nil { return state.Dump{}, err } - return stateDb.RawDump(), nil + return stateDb.RawDump(false, false, true), nil } // PrivateDebugAPI is the collection of Ethereum full node APIs exposed over // the private debugging endpoint. type PrivateDebugAPI struct { - config *params.ChainConfig - eth *Ethereum + eth *Ethereum } // NewPrivateDebugAPI creates a new API definition for the full node-related // private debug methods of the Ethereum service. -func NewPrivateDebugAPI(config *params.ChainConfig, eth *Ethereum) *PrivateDebugAPI { - return &PrivateDebugAPI{config: config, eth: eth} +func NewPrivateDebugAPI(eth *Ethereum) *PrivateDebugAPI { + return &PrivateDebugAPI{eth: eth} } // Preimage is a debug API function that returns the preimage for a sha3 hash, if known. @@ -336,6 +334,72 @@ func (api *PrivateDebugAPI) GetBadBlocks(ctx context.Context) ([]*BadBlockArgs, return results, nil } +// AccountRangeResult returns a mapping from the hash of an account addresses +// to its preimage. It will return the JSON null if no preimage is found. +// Since a query can return a limited amount of results, a "next" field is +// also present for paging. +type AccountRangeResult struct { + Accounts map[common.Hash]*common.Address `json:"accounts"` + Next common.Hash `json:"next"` +} + +func accountRange(st state.Trie, start *common.Hash, maxResults int) (AccountRangeResult, error) { + if start == nil { + start = &common.Hash{0} + } + it := trie.NewIterator(st.NodeIterator(start.Bytes())) + result := AccountRangeResult{Accounts: make(map[common.Hash]*common.Address), Next: common.Hash{}} + + if maxResults > AccountRangeMaxResults { + maxResults = AccountRangeMaxResults + } + + for i := 0; i < maxResults && it.Next(); i++ { + if preimage := st.GetKey(it.Key); preimage != nil { + addr := &common.Address{} + addr.SetBytes(preimage) + result.Accounts[common.BytesToHash(it.Key)] = addr + } else { + result.Accounts[common.BytesToHash(it.Key)] = nil + } + } + + if it.Next() { + result.Next = common.BytesToHash(it.Key) + } + + return result, nil +} + +// AccountRangeMaxResults is the maximum number of results to be returned per call +const AccountRangeMaxResults = 256 + +// AccountRange enumerates all accounts in the latest state +func (api *PrivateDebugAPI) AccountRange(ctx context.Context, start *common.Hash, maxResults int) (AccountRangeResult, error) { + var statedb *state.StateDB + var err error + block := api.eth.blockchain.CurrentBlock() + + if len(block.Transactions()) == 0 { + statedb, err = api.computeStateDB(block, defaultTraceReexec) + if err != nil { + return AccountRangeResult{}, err + } + } else { + _, _, statedb, err = api.computeTxEnv(block.Hash(), len(block.Transactions())-1, 0) + if err != nil { + return AccountRangeResult{}, err + } + } + + trie, err := statedb.Database().OpenTrie(block.Header().Root) + if err != nil { + return AccountRangeResult{}, err + } + + return accountRange(trie, start, maxResults) +} + // StorageRangeResult is the result of a debug_storageRangeAt API call. type StorageRangeResult struct { Storage storageMap `json:"storage"` @@ -444,16 +508,16 @@ func (api *PrivateDebugAPI) getModifiedAccounts(startBlock, endBlock *types.Bloc if startBlock.Number().Uint64() >= endBlock.Number().Uint64() { return nil, fmt.Errorf("start block height (%d) must be less than end block height (%d)", startBlock.Number().Uint64(), endBlock.Number().Uint64()) } + triedb := api.eth.BlockChain().StateCache().TrieDB() - oldTrie, err := trie.NewSecure(startBlock.Root(), trie.NewDatabase(api.eth.chainDb), 0) + oldTrie, err := trie.NewSecure(startBlock.Root(), triedb) if err != nil { return nil, err } - newTrie, err := trie.NewSecure(endBlock.Root(), trie.NewDatabase(api.eth.chainDb), 0) + newTrie, err := trie.NewSecure(endBlock.Root(), triedb) if err != nil { return nil, err } - diff, _ := trie.NewDifferenceIterator(oldTrie.NodeIterator([]byte{}), newTrie.NodeIterator([]byte{})) iter := trie.NewIterator(diff) diff --git a/eth/api_backend.go b/eth/api_backend.go index 8748d444fa6b..708e5afaf0e3 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -18,6 +18,7 @@ package eth import ( "context" + "errors" "math/big" "github.com/ethereum/go-ethereum/accounts" @@ -25,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" @@ -38,13 +40,14 @@ import ( // EthAPIBackend implements ethapi.Backend for full nodes type EthAPIBackend struct { - eth *Ethereum - gpo *gasprice.Oracle + extRPCEnabled bool + eth *Ethereum + gpo *gasprice.Oracle } // ChainConfig returns the active chain configuration. func (b *EthAPIBackend) ChainConfig() *params.ChainConfig { - return b.eth.chainConfig + return b.eth.blockchain.Config() } func (b *EthAPIBackend) CurrentBlock() *types.Block { @@ -56,51 +59,58 @@ func (b *EthAPIBackend) SetHead(number uint64) { b.eth.blockchain.SetHead(number) } -func (b *EthAPIBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) { +func (b *EthAPIBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) { // Pending block is only known by the miner - if blockNr == rpc.PendingBlockNumber { + if number == rpc.PendingBlockNumber { block := b.eth.miner.PendingBlock() return block.Header(), nil } // Otherwise resolve and return the block - if blockNr == rpc.LatestBlockNumber { + if number == rpc.LatestBlockNumber { return b.eth.blockchain.CurrentBlock().Header(), nil } - return b.eth.blockchain.GetHeaderByNumber(uint64(blockNr)), nil + return b.eth.blockchain.GetHeaderByNumber(uint64(number)), nil } func (b *EthAPIBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { return b.eth.blockchain.GetHeaderByHash(hash), nil } -func (b *EthAPIBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) { +func (b *EthAPIBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) { // Pending block is only known by the miner - if blockNr == rpc.PendingBlockNumber { + if number == rpc.PendingBlockNumber { block := b.eth.miner.PendingBlock() return block, nil } // Otherwise resolve and return the block - if blockNr == rpc.LatestBlockNumber { + if number == rpc.LatestBlockNumber { return b.eth.blockchain.CurrentBlock(), nil } - return b.eth.blockchain.GetBlockByNumber(uint64(blockNr)), nil + return b.eth.blockchain.GetBlockByNumber(uint64(number)), nil } -func (b *EthAPIBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) { +func (b *EthAPIBackend) StateAndHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*state.StateDB, *types.Header, error) { // Pending state is only known by the miner - if blockNr == rpc.PendingBlockNumber { + if number == rpc.PendingBlockNumber { block, state := b.eth.miner.Pending() return state, block.Header(), nil } // Otherwise resolve the block number and return its state - header, err := b.HeaderByNumber(ctx, blockNr) - if header == nil || err != nil { + header, err := b.HeaderByNumber(ctx, number) + if err != nil { return nil, nil, err } + if header == nil { + return nil, nil, errors.New("header not found") + } stateDb, err := b.eth.BlockChain().StateAt(header.Root) return stateDb, header, err } +func (b *EthAPIBackend) GetHeader(ctx context.Context, hash common.Hash) *types.Header { + return b.eth.blockchain.GetHeaderByHash(hash) +} + func (b *EthAPIBackend) GetBlock(ctx context.Context, hash common.Hash) (*types.Block, error) { return b.eth.blockchain.GetBlockByHash(hash), nil } @@ -125,12 +135,12 @@ func (b *EthAPIBackend) GetTd(blockHash common.Hash) *big.Int { return b.eth.blockchain.GetTdByHash(blockHash) } -func (b *EthAPIBackend) GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header, vmCfg vm.Config) (*vm.EVM, func() error, error) { +func (b *EthAPIBackend) GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header) (*vm.EVM, func() error, error) { state.SetBalance(msg.From(), math.MaxBig256) vmError := func() error { return nil } context := core.NewEVMContext(msg, header, b.eth.BlockChain(), nil) - return vm.NewEVM(context, state, b.eth.chainConfig, vmCfg), vmError, nil + return vm.NewEVM(context, state, b.eth.blockchain.Config(), *b.eth.blockchain.GetVMConfig()), vmError, nil } func (b *EthAPIBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { @@ -173,8 +183,13 @@ func (b *EthAPIBackend) GetPoolTransaction(hash common.Hash) *types.Transaction return b.eth.txPool.Get(hash) } +func (b *EthAPIBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { + tx, blockHash, blockNumber, index := rawdb.ReadTransaction(b.eth.ChainDb(), txHash) + return tx, blockHash, blockNumber, index, nil +} + func (b *EthAPIBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) { - return b.eth.txPool.State().GetNonce(addr), nil + return b.eth.txPool.Nonce(addr), nil } func (b *EthAPIBackend) Stats() (pending int, queued int) { @@ -213,6 +228,14 @@ func (b *EthAPIBackend) AccountManager() *accounts.Manager { return b.eth.AccountManager() } +func (b *EthAPIBackend) ExtRPCEnabled() bool { + return b.extRPCEnabled +} + +func (b *EthAPIBackend) RPCGasCap() *big.Int { + return b.eth.config.RPCGasCap +} + func (b *EthAPIBackend) BloomStatus() (uint64, uint64) { sections, _, _ := b.eth.bloomIndexer.Sections() return params.BloomBitsBlocks, sections diff --git a/eth/api_test.go b/eth/api_test.go index 47b062a40c46..1e7c489c3295 100644 --- a/eth/api_test.go +++ b/eth/api_test.go @@ -17,21 +17,178 @@ package eth import ( + "bytes" + "fmt" + "math/big" "reflect" + "sort" "testing" "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/crypto" ) var dumper = spew.ConfigState{Indent: " "} +func accountRangeTest(t *testing.T, trie *state.Trie, statedb *state.StateDB, start *common.Hash, requestedNum int, expectedNum int) AccountRangeResult { + result, err := accountRange(*trie, start, requestedNum) + if err != nil { + t.Fatal(err) + } + + if len(result.Accounts) != expectedNum { + t.Fatalf("expected %d results. Got %d", expectedNum, len(result.Accounts)) + } + + for _, address := range result.Accounts { + if address == nil { + t.Fatalf("null address returned") + } + if !statedb.Exist(*address) { + t.Fatalf("account not found in state %s", address.Hex()) + } + } + + return result +} + +type resultHash []*common.Hash + +func (h resultHash) Len() int { return len(h) } +func (h resultHash) Swap(i, j int) { h[i], h[j] = h[j], h[i] } +func (h resultHash) Less(i, j int) bool { return bytes.Compare(h[i].Bytes(), h[j].Bytes()) < 0 } + +func TestAccountRange(t *testing.T) { + var ( + statedb = state.NewDatabase(rawdb.NewMemoryDatabase()) + state, _ = state.New(common.Hash{}, statedb) + addrs = [AccountRangeMaxResults * 2]common.Address{} + m = map[common.Address]bool{} + ) + + for i := range addrs { + hash := common.HexToHash(fmt.Sprintf("%x", i)) + addr := common.BytesToAddress(crypto.Keccak256Hash(hash.Bytes()).Bytes()) + addrs[i] = addr + state.SetBalance(addrs[i], big.NewInt(1)) + if _, ok := m[addr]; ok { + t.Fatalf("bad") + } else { + m[addr] = true + } + } + + state.Commit(true) + root := state.IntermediateRoot(true) + + trie, err := statedb.OpenTrie(root) + if err != nil { + t.Fatal(err) + } + + t.Logf("test getting number of results less than max") + accountRangeTest(t, &trie, state, &common.Hash{0x0}, AccountRangeMaxResults/2, AccountRangeMaxResults/2) + + t.Logf("test getting number of results greater than max %d", AccountRangeMaxResults) + accountRangeTest(t, &trie, state, &common.Hash{0x0}, AccountRangeMaxResults*2, AccountRangeMaxResults) + + t.Logf("test with empty 'start' hash") + accountRangeTest(t, &trie, state, nil, AccountRangeMaxResults, AccountRangeMaxResults) + + t.Logf("test pagination") + + // test pagination + firstResult := accountRangeTest(t, &trie, state, &common.Hash{0x0}, AccountRangeMaxResults, AccountRangeMaxResults) + + t.Logf("test pagination 2") + secondResult := accountRangeTest(t, &trie, state, &firstResult.Next, AccountRangeMaxResults, AccountRangeMaxResults) + + hList := make(resultHash, 0) + for h1, addr1 := range firstResult.Accounts { + h := &common.Hash{} + h.SetBytes(h1.Bytes()) + hList = append(hList, h) + for h2, addr2 := range secondResult.Accounts { + // Make sure that the hashes aren't the same + if bytes.Equal(h1.Bytes(), h2.Bytes()) { + t.Fatalf("pagination test failed: results should not overlap") + } + + // If either address is nil, then it makes no sense to compare + // them as they might be two different accounts. + if addr1 == nil || addr2 == nil { + continue + } + + // Since the two hashes are different, they should not have + // the same preimage, but let's check anyway in case there + // is a bug in the (hash, addr) map generation code. + if bytes.Equal(addr1.Bytes(), addr2.Bytes()) { + t.Fatalf("pagination test failed: addresses should not repeat") + } + } + } + + // Test to see if it's possible to recover from the middle of the previous + // set and get an even split between the first and second sets. + t.Logf("test random access pagination") + sort.Sort(hList) + middleH := hList[AccountRangeMaxResults/2] + middleResult := accountRangeTest(t, &trie, state, middleH, AccountRangeMaxResults, AccountRangeMaxResults) + innone, infirst, insecond := 0, 0, 0 + for h := range middleResult.Accounts { + if _, ok := firstResult.Accounts[h]; ok { + infirst++ + } else if _, ok := secondResult.Accounts[h]; ok { + insecond++ + } else { + innone++ + } + } + if innone != 0 { + t.Fatalf("%d hashes in the 'middle' set were neither in the first not the second set", innone) + } + if infirst != AccountRangeMaxResults/2 { + t.Fatalf("Imbalance in the number of first-test results: %d != %d", infirst, AccountRangeMaxResults/2) + } + if insecond != AccountRangeMaxResults/2 { + t.Fatalf("Imbalance in the number of second-test results: %d != %d", insecond, AccountRangeMaxResults/2) + } +} + +func TestEmptyAccountRange(t *testing.T) { + var ( + statedb = state.NewDatabase(rawdb.NewMemoryDatabase()) + state, _ = state.New(common.Hash{}, statedb) + ) + + state.Commit(true) + root := state.IntermediateRoot(true) + + trie, err := statedb.OpenTrie(root) + if err != nil { + t.Fatal(err) + } + + results, err := accountRange(trie, &common.Hash{0x0}, AccountRangeMaxResults) + if err != nil { + t.Fatalf("Empty results should not trigger an error: %v", err) + } + if results.Next != common.HexToHash("0") { + t.Fatalf("Empty results should not return a second page") + } + if len(results.Accounts) != 0 { + t.Fatalf("Empty state should not return addresses: %v", results.Accounts) + } +} + func TestStorageRangeAt(t *testing.T) { // Create a state where account 0x010000... has a few storage entries. var ( - state, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + state, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) addr = common.Address{0x01} keys = []common.Hash{ // hashes of Keys of storage common.HexToHash("340dd630ad21bf010b4e676dbfa9ba9a02175262d1fa356232cfde6cb5b47ef2"), diff --git a/eth/api_tracer.go b/eth/api_tracer.go index 5b7f168ec23a..ce211cbd99ef 100644 --- a/eth/api_tracer.go +++ b/eth/api_tracer.go @@ -17,11 +17,13 @@ package eth import ( + "bufio" "bytes" "context" "errors" "fmt" "io/ioutil" + "os" "runtime" "sync" "time" @@ -60,6 +62,13 @@ type TraceConfig struct { Reexec *uint64 } +// StdTraceConfig holds extra parameters to standard-json trace functions. +type StdTraceConfig struct { + *vm.LogConfig + Reexec *uint64 + TxHash common.Hash +} + // txTraceResult is the result of a single transaction trace. type txTraceResult struct { Result interface{} `json:"result,omitempty"` // Trace results produced by the tracer @@ -138,7 +147,7 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl // Ensure we have a valid starting state before doing any work origin := start.NumberU64() - database := state.NewDatabase(api.eth.ChainDb()) + database := state.NewDatabaseWithCache(api.eth.ChainDb(), 16) // Chain tracing will probably start at genesis if number := start.NumberU64(); number > 0 { start = api.eth.blockchain.GetBlock(start.ParentHash(), start.NumberU64()-1) @@ -192,7 +201,7 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl // Fetch and execute the next block trace tasks for task := range tasks { - signer := types.MakeSigner(api.config, task.block.Number()) + signer := types.MakeSigner(api.eth.blockchain.Config(), task.block.Number()) // Trace all the transactions contained within for i, tx := range task.block.Transactions() { @@ -205,7 +214,8 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl log.Warn("Tracing failed", "hash", tx.Hash(), "block", task.block.NumberU64(), "err", err) break } - task.statedb.Finalise(true) + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + task.statedb.Finalise(api.eth.blockchain.Config().IsEIP158(task.block.Number())) task.results[i] = &txTraceResult{Result: res} } // Stream the result back to the user or abort on teardown @@ -285,7 +295,7 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl break } // Finalize the state so any modifications are written to the trie - root, err := statedb.Commit(true) + root, err := statedb.Commit(api.eth.blockchain.Config().IsEIP158(block.Number())) if err != nil { failed = err break @@ -366,7 +376,7 @@ func (api *PrivateDebugAPI) TraceBlockByNumber(ctx context.Context, number rpc.B func (api *PrivateDebugAPI) TraceBlockByHash(ctx context.Context, hash common.Hash, config *TraceConfig) ([]*txTraceResult, error) { block := api.eth.blockchain.GetBlockByHash(hash) if block == nil { - return nil, fmt.Errorf("block #%x not found", hash) + return nil, fmt.Errorf("block %#x not found", hash) } return api.traceBlock(ctx, block, config) } @@ -391,6 +401,43 @@ func (api *PrivateDebugAPI) TraceBlockFromFile(ctx context.Context, file string, return api.TraceBlock(ctx, blob, config) } +// TraceBadBlockByHash returns the structured logs created during the execution of +// EVM against a block pulled from the pool of bad ones and returns them as a JSON +// object. +func (api *PrivateDebugAPI) TraceBadBlock(ctx context.Context, hash common.Hash, config *TraceConfig) ([]*txTraceResult, error) { + blocks := api.eth.blockchain.BadBlocks() + for _, block := range blocks { + if block.Hash() == hash { + return api.traceBlock(ctx, block, config) + } + } + return nil, fmt.Errorf("bad block %#x not found", hash) +} + +// StandardTraceBlockToFile dumps the structured logs created during the +// execution of EVM to the local file system and returns a list of files +// to the caller. +func (api *PrivateDebugAPI) StandardTraceBlockToFile(ctx context.Context, hash common.Hash, config *StdTraceConfig) ([]string, error) { + block := api.eth.blockchain.GetBlockByHash(hash) + if block == nil { + return nil, fmt.Errorf("block %#x not found", hash) + } + return api.standardTraceBlockToFile(ctx, block, config) +} + +// StandardTraceBadBlockToFile dumps the structured logs created during the +// execution of EVM against a block pulled from the pool of bad ones to the +// local file system and returns a list of files to the caller. +func (api *PrivateDebugAPI) StandardTraceBadBlockToFile(ctx context.Context, hash common.Hash, config *StdTraceConfig) ([]string, error) { + blocks := api.eth.blockchain.BadBlocks() + for _, block := range blocks { + if block.Hash() == hash { + return api.standardTraceBlockToFile(ctx, block, config) + } + } + return nil, fmt.Errorf("bad block %#x not found", hash) +} + // traceBlock configures a new tracer according to the provided configuration, and // executes all the transactions contained within. The return value will be one item // per transaction, dependent on the requestd tracer. @@ -401,7 +448,7 @@ func (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, } parent := api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1) if parent == nil { - return nil, fmt.Errorf("parent %x not found", block.ParentHash()) + return nil, fmt.Errorf("parent %#x not found", block.ParentHash()) } reexec := defaultTraceReexec if config != nil && config.Reexec != nil { @@ -413,7 +460,7 @@ func (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, } // Execute all the transaction contained within the block concurrently var ( - signer = types.MakeSigner(api.config, block.Number()) + signer = types.MakeSigner(api.eth.blockchain.Config(), block.Number()) txs = block.Transactions() results = make([]*txTraceResult, len(txs)) @@ -454,13 +501,14 @@ func (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, msg, _ := tx.AsMessage(signer) vmctx := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil) - vmenv := vm.NewEVM(vmctx, statedb, api.config, vm.Config{}) + vmenv := vm.NewEVM(vmctx, statedb, api.eth.blockchain.Config(), vm.Config{}) if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { failed = err break } // Finalize the state so any modifications are written to the trie - statedb.Finalise(true) + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + statedb.Finalise(vmenv.ChainConfig().IsEIP158(block.Number())) } close(jobs) pend.Wait() @@ -472,6 +520,116 @@ func (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, return results, nil } +// standardTraceBlockToFile configures a new tracer which uses standard JSON output, +// and traces either a full block or an individual transaction. The return value will +// be one filename per transaction traced. +func (api *PrivateDebugAPI) standardTraceBlockToFile(ctx context.Context, block *types.Block, config *StdTraceConfig) ([]string, error) { + // If we're tracing a single transaction, make sure it's present + if config != nil && config.TxHash != (common.Hash{}) { + if !containsTx(block, config.TxHash) { + return nil, fmt.Errorf("transaction %#x not found in block", config.TxHash) + } + } + // Create the parent state database + if err := api.eth.engine.VerifyHeader(api.eth.blockchain, block.Header(), true); err != nil { + return nil, err + } + parent := api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1) + if parent == nil { + return nil, fmt.Errorf("parent %#x not found", block.ParentHash()) + } + reexec := defaultTraceReexec + if config != nil && config.Reexec != nil { + reexec = *config.Reexec + } + statedb, err := api.computeStateDB(parent, reexec) + if err != nil { + return nil, err + } + // Retrieve the tracing configurations, or use default values + var ( + logConfig vm.LogConfig + txHash common.Hash + ) + if config != nil { + if config.LogConfig != nil { + logConfig = *config.LogConfig + } + txHash = config.TxHash + } + logConfig.Debug = true + + // Execute transaction, either tracing all or just the requested one + var ( + signer = types.MakeSigner(api.eth.blockchain.Config(), block.Number()) + dumps []string + ) + for i, tx := range block.Transactions() { + // Prepare the trasaction for un-traced execution + var ( + msg, _ = tx.AsMessage(signer) + vmctx = core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil) + + vmConf vm.Config + dump *os.File + writer *bufio.Writer + err error + ) + // If the transaction needs tracing, swap out the configs + if tx.Hash() == txHash || txHash == (common.Hash{}) { + // Generate a unique temporary file to dump it into + prefix := fmt.Sprintf("block_%#x-%d-%#x-", block.Hash().Bytes()[:4], i, tx.Hash().Bytes()[:4]) + + dump, err = ioutil.TempFile(os.TempDir(), prefix) + if err != nil { + return nil, err + } + dumps = append(dumps, dump.Name()) + + // Swap out the noop logger to the standard tracer + writer = bufio.NewWriter(dump) + vmConf = vm.Config{ + Debug: true, + Tracer: vm.NewJSONLogger(&logConfig, writer), + EnablePreimageRecording: true, + } + } + // Execute the transaction and flush any traces to disk + vmenv := vm.NewEVM(vmctx, statedb, api.eth.blockchain.Config(), vmConf) + _, _, _, err = core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())) + if writer != nil { + writer.Flush() + } + if dump != nil { + dump.Close() + log.Info("Wrote standard trace", "file", dump.Name()) + } + if err != nil { + return dumps, err + } + // Finalize the state so any modifications are written to the trie + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + statedb.Finalise(vmenv.ChainConfig().IsEIP158(block.Number())) + + // If we've traced the transaction we were looking for, abort + if tx.Hash() == txHash { + break + } + } + return dumps, nil +} + +// containsTx reports whether the transaction with a certain hash +// is contained within the specified block. +func containsTx(block *types.Block, hash common.Hash) bool { + for _, tx := range block.Transactions() { + if tx.Hash() == hash { + return true + } + } + return false +} + // computeStateDB retrieves the state database associated with a certain block. // If no state is locally available for the given block, a number of blocks are // attempted to be reexecuted to generate the desired state. @@ -483,7 +641,7 @@ func (api *PrivateDebugAPI) computeStateDB(block *types.Block, reexec uint64) (* } // Otherwise try to reexec blocks until we find a state or reach our limit origin := block.NumberU64() - database := state.NewDatabase(api.eth.ChainDb()) + database := state.NewDatabaseWithCache(api.eth.ChainDb(), 16) for i := uint64(0); i < reexec; i++ { block = api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1) @@ -497,7 +655,7 @@ func (api *PrivateDebugAPI) computeStateDB(block *types.Block, reexec uint64) (* if err != nil { switch err.(type) { case *trie.MissingNodeError: - return nil, errors.New("required historical state unavailable") + return nil, fmt.Errorf("required historical state unavailable (reexec=%d)", reexec) default: return nil, err } @@ -511,7 +669,7 @@ func (api *PrivateDebugAPI) computeStateDB(block *types.Block, reexec uint64) (* for block.NumberU64() < origin { // Print progress logs if long enough time elapsed if time.Since(logged) > 8*time.Second { - log.Info("Regenerating historical state", "block", block.NumberU64()+1, "target", origin, "elapsed", time.Since(start)) + log.Info("Regenerating historical state", "block", block.NumberU64()+1, "target", origin, "remaining", origin-block.NumberU64()-1, "elapsed", time.Since(start)) logged = time.Now() } // Retrieve the next block to regenerate and process it @@ -520,15 +678,15 @@ func (api *PrivateDebugAPI) computeStateDB(block *types.Block, reexec uint64) (* } _, _, _, err := api.eth.blockchain.Processor().Process(block, statedb, vm.Config{}) if err != nil { - return nil, err + return nil, fmt.Errorf("processing block %d failed: %v", block.NumberU64(), err) } // Finalize the state so any modifications are written to the trie - root, err := statedb.Commit(true) + root, err := statedb.Commit(api.eth.blockchain.Config().IsEIP158(block.Number())) if err != nil { return nil, err } if err := statedb.Reset(root); err != nil { - return nil, err + return nil, fmt.Errorf("state reset after block %d failed: %v", block.NumberU64(), err) } database.TrieDB().Reference(root, common.Hash{}) if proot != (common.Hash{}) { @@ -547,7 +705,7 @@ func (api *PrivateDebugAPI) TraceTransaction(ctx context.Context, hash common.Ha // Retrieve the transaction and assemble its EVM context tx, blockHash, _, index := rawdb.ReadTransaction(api.eth.ChainDb(), hash) if tx == nil { - return nil, fmt.Errorf("transaction %x not found", hash) + return nil, fmt.Errorf("transaction %#x not found", hash) } reexec := defaultTraceReexec if config != nil && config.Reexec != nil { @@ -598,7 +756,7 @@ func (api *PrivateDebugAPI) traceTx(ctx context.Context, message core.Message, v tracer = vm.NewStructLogger(config.LogConfig) } // Run the transaction with tracing enabled. - vmenv := vm.NewEVM(vmctx, statedb, api.config, vm.Config{Debug: true, Tracer: tracer}) + vmenv := vm.NewEVM(vmctx, statedb, api.eth.blockchain.Config(), vm.Config{Debug: true, Tracer: tracer}) ret, gas, failed, err := core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas())) if err != nil { @@ -627,18 +785,23 @@ func (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int, ree // Create the parent state database block := api.eth.blockchain.GetBlockByHash(blockHash) if block == nil { - return nil, vm.Context{}, nil, fmt.Errorf("block %x not found", blockHash) + return nil, vm.Context{}, nil, fmt.Errorf("block %#x not found", blockHash) } parent := api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1) if parent == nil { - return nil, vm.Context{}, nil, fmt.Errorf("parent %x not found", block.ParentHash()) + return nil, vm.Context{}, nil, fmt.Errorf("parent %#x not found", block.ParentHash()) } statedb, err := api.computeStateDB(parent, reexec) if err != nil { return nil, vm.Context{}, nil, err } + + if txIndex == 0 && len(block.Transactions()) == 0 { + return nil, vm.Context{}, statedb, nil + } + // Recompute transactions up to the target index. - signer := types.MakeSigner(api.config, block.Number()) + signer := types.MakeSigner(api.eth.blockchain.Config(), block.Number()) for idx, tx := range block.Transactions() { // Assemble the transaction call message and return if the requested offset @@ -648,12 +811,13 @@ func (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int, ree return msg, context, statedb, nil } // Not yet the searched for transaction, execute on top of the current state - vmenv := vm.NewEVM(context, statedb, api.config, vm.Config{}) + vmenv := vm.NewEVM(context, statedb, api.eth.blockchain.Config(), vm.Config{}) if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil { - return nil, vm.Context{}, nil, fmt.Errorf("tx %x failed: %v", tx.Hash(), err) + return nil, vm.Context{}, nil, fmt.Errorf("transaction %#x failed: %v", tx.Hash(), err) } // Ensure any modifications are committed to the state - statedb.Finalise(true) + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + statedb.Finalise(vmenv.ChainConfig().IsEIP158(block.Number())) } - return nil, vm.Context{}, nil, fmt.Errorf("tx index %d out of range for block %x", txIndex, blockHash) + return nil, vm.Context{}, nil, fmt.Errorf("transaction index %d out of range for block %#x", txIndex, blockHash) } diff --git a/eth/backend.go b/eth/backend.go index b555b064ad98..dc4ff8ade8db 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -26,6 +26,7 @@ import ( "sync/atomic" "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" @@ -46,6 +47,7 @@ import ( "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" @@ -54,17 +56,20 @@ import ( type LesServer interface { Start(srvr *p2p.Server) Stop() + APIs() []rpc.API Protocols() []p2p.Protocol SetBloomBitsIndexer(bbIndexer *core.ChainIndexer) + SetContractBackend(bind.ContractBackend) } // Ethereum implements the Ethereum full node service. type Ethereum struct { - config *Config - chainConfig *params.ChainConfig + config *Config // Channel for shutting down the service - shutdownChan chan bool // Channel for shutting down the Ethereum + shutdownChan chan bool + + server *p2p.Server // Handlers txPool *core.TxPool @@ -99,6 +104,14 @@ func (s *Ethereum) AddLesServer(ls LesServer) { ls.SetBloomBitsIndexer(s.bloomIndexer) } +// SetClient sets a rpc client which connecting to our local node. +func (s *Ethereum) SetContractBackend(backend bind.ContractBackend) { + // Pass the rpc client to les server if it is enabled. + if s.lesServer != nil { + s.lesServer.SetContractBackend(backend) + } +} + // New creates a new Ethereum object (including the // initialisation of the common Ethereum object) func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { @@ -109,12 +122,18 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if !config.SyncMode.IsValid() { return nil, fmt.Errorf("invalid sync mode %d", config.SyncMode) } - if config.MinerGasPrice == nil || config.MinerGasPrice.Cmp(common.Big0) <= 0 { - log.Warn("Sanitizing invalid miner gas price", "provided", config.MinerGasPrice, "updated", DefaultConfig.MinerGasPrice) - config.MinerGasPrice = new(big.Int).Set(DefaultConfig.MinerGasPrice) + if config.Miner.GasPrice == nil || config.Miner.GasPrice.Cmp(common.Big0) <= 0 { + log.Warn("Sanitizing invalid miner gas price", "provided", config.Miner.GasPrice, "updated", DefaultConfig.Miner.GasPrice) + config.Miner.GasPrice = new(big.Int).Set(DefaultConfig.Miner.GasPrice) + } + if config.NoPruning && config.TrieDirtyCache > 0 { + config.TrieCleanCache += config.TrieDirtyCache + config.TrieDirtyCache = 0 } + log.Info("Allocated trie memory caches", "clean", common.StorageSize(config.TrieCleanCache)*1024*1024, "dirty", common.StorageSize(config.TrieDirtyCache)*1024*1024) + // Assemble the Ethereum object - chainDb, err := CreateDB(ctx, config, "chaindata") + chainDb, err := ctx.OpenDatabaseWithFreezer("chaindata", config.DatabaseCache, config.DatabaseHandles, config.DatabaseFreezer, "eth/db/chaindata/") if err != nil { return nil, err } @@ -127,26 +146,31 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { eth := &Ethereum{ config: config, chainDb: chainDb, - chainConfig: chainConfig, eventMux: ctx.EventMux, accountManager: ctx.AccountManager, - engine: CreateConsensusEngine(ctx, chainConfig, &config.Ethash, config.MinerNotify, config.MinerNoverify, chainDb), + engine: CreateConsensusEngine(ctx, chainConfig, &config.Ethash, config.Miner.Notify, config.Miner.Noverify, chainDb), shutdownChan: make(chan bool), networkID: config.NetworkId, - gasPrice: config.MinerGasPrice, - etherbase: config.Etherbase, + gasPrice: config.Miner.GasPrice, + etherbase: config.Miner.Etherbase, bloomRequests: make(chan chan *bloombits.Retrieval), bloomIndexer: NewBloomIndexer(chainDb, params.BloomBitsBlocks, params.BloomConfirms), } - log.Info("Initialising Ethereum protocol", "versions", ProtocolVersions, "network", config.NetworkId) + bcVersion := rawdb.ReadDatabaseVersion(chainDb) + var dbVer = "" + if bcVersion != nil { + dbVer = fmt.Sprintf("%d", *bcVersion) + } + log.Info("Initialising Ethereum protocol", "versions", ProtocolVersions, "network", config.NetworkId, "dbversion", dbVer) if !config.SkipBcVersionCheck { - bcVersion := rawdb.ReadDatabaseVersion(chainDb) - if bcVersion != core.BlockChainVersion && bcVersion != 0 { - return nil, fmt.Errorf("Blockchain DB version mismatch (%d / %d).\n", bcVersion, core.BlockChainVersion) + if bcVersion != nil && *bcVersion > core.BlockChainVersion { + return nil, fmt.Errorf("database version is v%d, Geth %s only supports v%d", *bcVersion, params.VersionWithMeta, core.BlockChainVersion) + } else if bcVersion == nil || *bcVersion < core.BlockChainVersion { + log.Warn("Upgrade blockchain database version", "from", dbVer, "to", core.BlockChainVersion) + rawdb.WriteDatabaseVersion(chainDb, core.BlockChainVersion) } - rawdb.WriteDatabaseVersion(chainDb, core.BlockChainVersion) } var ( vmConfig = vm.Config{ @@ -154,9 +178,15 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { EWASMInterpreter: config.EWASMInterpreter, EVMInterpreter: config.EVMInterpreter, } - cacheConfig = &core.CacheConfig{Disabled: config.NoPruning, TrieNodeLimit: config.TrieCache, TrieTimeLimit: config.TrieTimeout} + cacheConfig = &core.CacheConfig{ + TrieCleanLimit: config.TrieCleanCache, + TrieCleanNoPrefetch: config.NoPrefetch, + TrieDirtyLimit: config.TrieDirtyCache, + TrieDirtyDisabled: config.NoPruning, + TrieTimeLimit: config.TrieTimeout, + } ) - eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, eth.chainConfig, eth.engine, vmConfig, eth.shouldPreserve) + eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, chainConfig, eth.engine, vmConfig, eth.shouldPreserve) if err != nil { return nil, err } @@ -171,19 +201,24 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if config.TxPool.Journal != "" { config.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal) } - eth.txPool = core.NewTxPool(config.TxPool, eth.chainConfig, eth.blockchain) + eth.txPool = core.NewTxPool(config.TxPool, chainConfig, eth.blockchain) - if eth.protocolManager, err = NewProtocolManager(eth.chainConfig, config.SyncMode, config.NetworkId, eth.eventMux, eth.txPool, eth.engine, eth.blockchain, chainDb); err != nil { + // Permit the downloader to use the trie cache allowance during fast sync + cacheLimit := cacheConfig.TrieCleanLimit + cacheConfig.TrieDirtyLimit + checkpoint := config.Checkpoint + if checkpoint == nil { + checkpoint = params.TrustedCheckpoints[genesisHash] + } + if eth.protocolManager, err = NewProtocolManager(chainConfig, checkpoint, config.SyncMode, config.NetworkId, eth.eventMux, eth.txPool, eth.engine, eth.blockchain, chainDb, cacheLimit, config.Whitelist); err != nil { return nil, err } + eth.miner = miner.New(eth, &config.Miner, chainConfig, eth.EventMux(), eth.engine, eth.isLocalBlock) + eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) - eth.miner = miner.New(eth, eth.chainConfig, eth.EventMux(), eth.engine, config.MinerRecommit, config.MinerGasFloor, config.MinerGasCeil, eth.isLocalBlock) - eth.miner.SetExtra(makeExtraData(config.MinerExtraData)) - - eth.APIBackend = &EthAPIBackend{eth, nil} + eth.APIBackend = &EthAPIBackend{ctx.ExtRPCEnabled(), eth, nil} gpoParams := config.GPO if gpoParams.Default == nil { - gpoParams.Default = config.MinerGasPrice + gpoParams.Default = config.Miner.GasPrice } eth.APIBackend.gpo = gasprice.NewOracle(eth.APIBackend, gpoParams) @@ -207,18 +242,6 @@ func makeExtraData(extra []byte) []byte { return extra } -// CreateDB creates the chain database. -func CreateDB(ctx *node.ServiceContext, config *Config, name string) (ethdb.Database, error) { - db, err := ctx.OpenDatabase(name, config.DatabaseCache, config.DatabaseHandles) - if err != nil { - return nil, err - } - if db, ok := db.(*ethdb.LDBDatabase); ok { - db.Meter("eth/db/chaindata/") - } - return db, nil -} - // CreateConsensusEngine creates the required type of consensus engine instance for an Ethereum service func CreateConsensusEngine(ctx *node.ServiceContext, chainConfig *params.ChainConfig, config *ethash.Config, notify []string, noverify bool, db ethdb.Database) consensus.Engine { // If proof-of-authority is requested, set it up @@ -255,9 +278,18 @@ func CreateConsensusEngine(ctx *node.ServiceContext, chainConfig *params.ChainCo func (s *Ethereum) APIs() []rpc.API { apis := ethapi.GetAPIs(s.APIBackend) + // Append any APIs exposed explicitly by the les server + if s.lesServer != nil { + apis = append(apis, s.lesServer.APIs()...) + } // Append any APIs exposed explicitly by the consensus engine apis = append(apis, s.engine.APIs(s.BlockChain())...) + // Append any APIs exposed explicitly by the les server + if s.lesServer != nil { + apis = append(apis, s.lesServer.APIs()...) + } + // Append all the local APIs and return return append(apis, []rpc.API{ { @@ -297,7 +329,7 @@ func (s *Ethereum) APIs() []rpc.API { }, { Namespace: "debug", Version: "1.0", - Service: NewPrivateDebugAPI(s.chainConfig, s), + Service: NewPrivateDebugAPI(s), }, { Namespace: "net", Version: "1.0", @@ -432,7 +464,7 @@ func (s *Ethereum) StartMining(threads int) error { log.Error("Etherbase account unavailable locally", "err", err) return fmt.Errorf("signer missing: %v", err) } - clique.Authorize(eb, wallet.SignHash) + clique.Authorize(eb, wallet.SignData) } // If mining is started, we can disable the transaction rejection mechanism // introduced to speed sync times. @@ -467,22 +499,31 @@ func (s *Ethereum) EventMux() *event.TypeMux { return s.eventMux } func (s *Ethereum) Engine() consensus.Engine { return s.engine } func (s *Ethereum) ChainDb() ethdb.Database { return s.chainDb } func (s *Ethereum) IsListening() bool { return true } // Always listening -func (s *Ethereum) EthVersion() int { return int(s.protocolManager.SubProtocols[0].Version) } +func (s *Ethereum) EthVersion() int { return int(ProtocolVersions[0]) } func (s *Ethereum) NetVersion() uint64 { return s.networkID } func (s *Ethereum) Downloader() *downloader.Downloader { return s.protocolManager.downloader } +func (s *Ethereum) Synced() bool { return atomic.LoadUint32(&s.protocolManager.acceptTxs) == 1 } +func (s *Ethereum) ArchiveMode() bool { return s.config.NoPruning } // Protocols implements node.Service, returning all the currently configured // network protocols to start. func (s *Ethereum) Protocols() []p2p.Protocol { - if s.lesServer == nil { - return s.protocolManager.SubProtocols + protos := make([]p2p.Protocol, len(ProtocolVersions)) + for i, vsn := range ProtocolVersions { + protos[i] = s.protocolManager.makeProtocol(vsn) + protos[i].Attributes = []enr.Entry{s.currentEthEntry()} } - return append(s.protocolManager.SubProtocols, s.lesServer.Protocols()...) + if s.lesServer != nil { + protos = append(protos, s.lesServer.Protocols()...) + } + return protos } // Start implements node.Service, starting all internal goroutines needed by the // Ethereum protocol implementation. func (s *Ethereum) Start(srvr *p2p.Server) error { + s.startEthEntryUpdate(srvr.LocalNode()) + // Start the bloom bits servicing goroutines s.startBloomHandlers(params.BloomBitsBlocks) diff --git a/eth/bloombits.go b/eth/bloombits.go index c7bb561402ef..9a31997d6002 100644 --- a/eth/bloombits.go +++ b/eth/bloombits.go @@ -102,7 +102,7 @@ func NewBloomIndexer(db ethdb.Database, size, confirms uint64) *core.ChainIndexe db: db, size: size, } - table := ethdb.NewTable(db, string(rawdb.BloomBitsIndexPrefix)) + table := rawdb.NewTable(db, string(rawdb.BloomBitsIndexPrefix)) return core.NewChainIndexer(db, table, backend, size, confirms, bloomThrottling, "bloombits") } diff --git a/eth/config.go b/eth/config.go index efbaafb6a2d3..688787227600 100644 --- a/eth/config.go +++ b/eth/config.go @@ -25,11 +25,11 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/params" ) @@ -43,16 +43,19 @@ var DefaultConfig = Config{ DatasetsInMem: 1, DatasetsOnDisk: 2, }, - NetworkId: 1, - LightPeers: 100, - DatabaseCache: 768, - TrieCache: 256, - TrieTimeout: 60 * time.Minute, - MinerGasFloor: 8000000, - MinerGasCeil: 8000000, - MinerGasPrice: big.NewInt(params.GWei), - MinerRecommit: 3 * time.Second, - + NetworkId: 1, + LightPeers: 100, + UltraLightFraction: 75, + DatabaseCache: 512, + TrieCleanCache: 256, + TrieDirtyCache: 256, + TrieTimeout: 60 * time.Minute, + Miner: miner.Config{ + GasFloor: 8000000, + GasCeil: 8000000, + GasPrice: big.NewInt(params.GWei), + Recommit: 3 * time.Second, + }, TxPool: core.DefaultTxPoolConfig, GPO: gasprice.Config{ Blocks: 20, @@ -67,14 +70,21 @@ func init() { home = user.HomeDir } } - if runtime.GOOS == "windows" { - DefaultConfig.Ethash.DatasetDir = filepath.Join(home, "AppData", "Ethash") + if runtime.GOOS == "darwin" { + DefaultConfig.Ethash.DatasetDir = filepath.Join(home, "Library", "Ethash") + } else if runtime.GOOS == "windows" { + localappdata := os.Getenv("LOCALAPPDATA") + if localappdata != "" { + DefaultConfig.Ethash.DatasetDir = filepath.Join(localappdata, "Ethash") + } else { + DefaultConfig.Ethash.DatasetDir = filepath.Join(home, "AppData", "Local", "Ethash") + } } else { DefaultConfig.Ethash.DatasetDir = filepath.Join(home, ".ethash") } } -//go:generate gencodec -type Config -field-override configMarshaling -formats toml -out gen_config.go +//go:generate gencodec -type Config -formats toml -out gen_config.go type Config struct { // The genesis block, which is inserted if the database is empty. @@ -84,28 +94,36 @@ type Config struct { // Protocol options NetworkId uint64 // Network ID to use for selecting peers to connect to SyncMode downloader.SyncMode - NoPruning bool + + NoPruning bool // Whether to disable pruning and flush everything to disk + NoPrefetch bool // Whether to disable prefetching and only load state on demand + + // Whitelist of required block number -> hash values to accept + Whitelist map[uint64]common.Hash `toml:"-"` // Light client options - LightServ int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests - LightPeers int `toml:",omitempty"` // Maximum number of LES client peers + LightServ int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests + LightIngress int `toml:",omitempty"` // Incoming bandwidth limit for light servers + LightEgress int `toml:",omitempty"` // Outgoing bandwidth limit for light servers + LightPeers int `toml:",omitempty"` // Maximum number of LES client peers + + // Ultra Light client options + UltraLightServers []string `toml:",omitempty"` // List of trusted ultra light servers + UltraLightFraction int `toml:",omitempty"` // Percentage of trusted servers to accept an announcement + UltraLightOnlyAnnounce bool `toml:",omitempty"` // Whether to only announce headers, or also serve them // Database options SkipBcVersionCheck bool `toml:"-"` DatabaseHandles int `toml:"-"` DatabaseCache int - TrieCache int - TrieTimeout time.Duration - - // Mining-related options - Etherbase common.Address `toml:",omitempty"` - MinerNotify []string `toml:",omitempty"` - MinerExtraData []byte `toml:",omitempty"` - MinerGasFloor uint64 - MinerGasCeil uint64 - MinerGasPrice *big.Int - MinerRecommit time.Duration - MinerNoverify bool + DatabaseFreezer string + + TrieCleanCache int + TrieDirtyCache int + TrieTimeout time.Duration + + // Mining options + Miner miner.Config // Ethash options Ethash ethash.Config @@ -122,12 +140,18 @@ type Config struct { // Miscellaneous options DocRoot string `toml:"-"` - // Type of the EWASM interpreter ("" for detault) + // Type of the EWASM interpreter ("" for default) EWASMInterpreter string + // Type of the EVM interpreter ("" for default) EVMInterpreter string -} -type configMarshaling struct { - MinerExtraData hexutil.Bytes + // RPCGasCap is the global gas cap for eth-call variants. + RPCGasCap *big.Int `toml:",omitempty"` + + // Checkpoint is a hardcoded checkpoint which can be nil. + Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` + + // CheckpointOracle is the configuration for checkpoint oracle. + CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` } diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 805195034b9b..edd0eb4d9538 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -25,7 +25,7 @@ import ( "sync/atomic" "time" - ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" @@ -34,6 +34,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" ) var ( @@ -45,20 +46,23 @@ var ( MaxReceiptFetch = 256 // Amount of transaction receipts to allow fetching per request MaxStateFetch = 384 // Amount of node state values to allow fetching per request - MaxForkAncestry = 3 * params.EpochDuration // Maximum chain reorganisation - rttMinEstimate = 2 * time.Second // Minimum round-trip time to target for download requests - rttMaxEstimate = 20 * time.Second // Maximum round-trip time to target for download requests - rttMinConfidence = 0.1 // Worse confidence factor in our estimated RTT value - ttlScaling = 3 // Constant scaling factor for RTT -> TTL conversion - ttlLimit = time.Minute // Maximum TTL allowance to prevent reaching crazy timeouts + rttMinEstimate = 2 * time.Second // Minimum round-trip time to target for download requests + rttMaxEstimate = 20 * time.Second // Maximum round-trip time to target for download requests + rttMinConfidence = 0.1 // Worse confidence factor in our estimated RTT value + ttlScaling = 3 // Constant scaling factor for RTT -> TTL conversion + ttlLimit = time.Minute // Maximum TTL allowance to prevent reaching crazy timeouts qosTuningPeers = 5 // Number of peers to tune based on (best peers) qosConfidenceCap = 10 // Number of peers above which not to modify RTT confidence qosTuningImpact = 0.25 // Impact that a new tuning target has on the previous value - maxQueuedHeaders = 32 * 1024 // [eth/62] Maximum number of headers to queue for import (DOS protection) - maxHeadersProcess = 2048 // Number of header download results to import at once into the chain - maxResultsProcess = 2048 // Number of content download results to import at once into the chain + maxQueuedHeaders = 32 * 1024 // [eth/62] Maximum number of headers to queue for import (DOS protection) + maxHeadersProcess = 2048 // Number of header download results to import at once into the chain + maxResultsProcess = 2048 // Number of content download results to import at once into the chain + maxForkAncestry uint64 = params.ImmutabilityThreshold // Maximum chain reorganisation (locally redeclared so tests can reduce it) + + reorgProtThreshold = 48 // Threshold number of recent blocks to disable mini reorg protection + reorgProtHeaderDelay = 2 // Number of headers to delay delivering to cover mini reorgs fsHeaderCheckFrequency = 100 // Verification frequency of the downloaded headers during fast sync fsHeaderSafetyNet = 2048 // Number of headers to discard in case a chain violation is detected @@ -72,36 +76,40 @@ var ( errUnknownPeer = errors.New("peer is unknown or unhealthy") errBadPeer = errors.New("action from bad peer ignored") errStallingPeer = errors.New("peer is stalling") + errUnsyncedPeer = errors.New("unsynced peer") errNoPeers = errors.New("no peers to keep download active") errTimeout = errors.New("timeout") errEmptyHeaderSet = errors.New("empty header set by peer") errPeersUnavailable = errors.New("no peers available or all tried for download") errInvalidAncestor = errors.New("retrieved ancestor is invalid") errInvalidChain = errors.New("retrieved hash chain is invalid") - errInvalidBlock = errors.New("retrieved block is invalid") errInvalidBody = errors.New("retrieved block body is invalid") errInvalidReceipt = errors.New("retrieved receipt is invalid") - errCancelBlockFetch = errors.New("block download canceled (requested)") - errCancelHeaderFetch = errors.New("block header download canceled (requested)") - errCancelBodyFetch = errors.New("block body download canceled (requested)") - errCancelReceiptFetch = errors.New("receipt download canceled (requested)") errCancelStateFetch = errors.New("state data download canceled (requested)") - errCancelHeaderProcessing = errors.New("header processing canceled (requested)") errCancelContentProcessing = errors.New("content processing canceled (requested)") + errCanceled = errors.New("syncing canceled (requested)") errNoSyncActive = errors.New("no sync active") errTooOld = errors.New("peer doesn't speak recent enough protocol version (need version >= 62)") ) type Downloader struct { + // WARNING: The `rttEstimate` and `rttConfidence` fields are accessed atomically. + // On 32 bit platforms, only 64-bit aligned fields can be atomic. The struct is + // guaranteed to be so aligned, so take advantage of that. For more information, + // see https://golang.org/pkg/sync/atomic/#pkg-note-BUG. + rttEstimate uint64 // Round trip time to target for download requests + rttConfidence uint64 // Confidence in the estimated RTT (unit: millionths to allow atomic ops) + mode SyncMode // Synchronisation mode defining the strategy used (per sync cycle) mux *event.TypeMux // Event multiplexer to announce sync operation events - queue *queue // Scheduler for selecting the hashes to download - peers *peerSet // Set of active peers from which download can proceed - stateDB ethdb.Database + checkpoint uint64 // Checkpoint block number to enforce head against (e.g. fast sync) + genesis uint64 // Genesis block number to limit sync to (e.g. light client CHT) + queue *queue // Scheduler for selecting the hashes to download + peers *peerSet // Set of active peers from which download can proceed - rttEstimate uint64 // Round trip time to target for download requests - rttConfidence uint64 // Confidence in the estimated RTT (unit: millionths to allow atomic ops) + stateDB ethdb.Database // Database to state sync into (and deduplicate via) + stateBloom *trie.SyncBloom // Bloom filter for fast trie node existence checks // Statistics syncStatsChainOrigin uint64 // Origin block number where syncing started at @@ -120,6 +128,7 @@ type Downloader struct { synchronising int32 notified int32 committed int32 + ancientLimit uint64 // The maximum block number which can be regarded as ancient data. // Channels headerCh chan dataPack // [eth/62] Channel receiving inbound block headers @@ -178,6 +187,9 @@ type BlockChain interface { // HasBlock verifies a block's presence in the local chain. HasBlock(common.Hash, uint64) bool + // HasFastBlock verifies a fast block's presence in the local chain. + HasFastBlock(common.Hash, uint64) bool + // GetBlockByHash retrieves a block from the local chain. GetBlockByHash(common.Hash) *types.Block @@ -194,19 +206,19 @@ type BlockChain interface { InsertChain(types.Blocks) (int, error) // InsertReceiptChain inserts a batch of receipts into the local chain. - InsertReceiptChain(types.Blocks, []types.Receipts) (int, error) + InsertReceiptChain(types.Blocks, []types.Receipts, uint64) (int, error) } // New creates a new downloader to fetch hashes and blocks from remote peers. -func New(mode SyncMode, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { +func New(checkpoint uint64, stateDb ethdb.Database, stateBloom *trie.SyncBloom, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { if lightchain == nil { lightchain = chain } - dl := &Downloader{ - mode: mode, stateDB: stateDb, + stateBloom: stateBloom, mux: mux, + checkpoint: checkpoint, queue: newQueue(), peers: newPeerSet(), rttEstimate: uint64(rttMaxEstimate), @@ -246,13 +258,15 @@ func (d *Downloader) Progress() ethereum.SyncProgress { defer d.syncStatsLock.RUnlock() current := uint64(0) - switch d.mode { - case FullSync: + switch { + case d.blockchain != nil && d.mode == FullSync: current = d.blockchain.CurrentBlock().NumberU64() - case FastSync: + case d.blockchain != nil && d.mode == FastSync: current = d.blockchain.CurrentFastBlock().NumberU64() - case LightSync: + case d.lightchain != nil: current = d.lightchain.CurrentHeader().Number.Uint64() + default: + log.Error("Unknown downloader chain/mode combo", "light", d.lightchain != nil, "full", d.blockchain != nil, "mode", d.mode) } return ethereum.SyncProgress{ StartingBlock: d.syncStatsChainOrigin, @@ -300,14 +314,6 @@ func (d *Downloader) UnregisterPeer(id string) error { } d.queue.Revoke(id) - // If this peer was the master peer, abort sync immediately - d.cancelLock.RLock() - master := id == d.cancelPeer - d.cancelLock.RUnlock() - - if master { - d.cancel() - } return nil } @@ -317,9 +323,9 @@ func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode err := d.synchronise(id, head, td, mode) switch err { case nil: - case errBusy: + case errBusy, errCanceled: - case errTimeout, errBadPeer, errStallingPeer, + case errTimeout, errBadPeer, errStallingPeer, errUnsyncedPeer, errEmptyHeaderSet, errPeersUnavailable, errTooOld, errInvalidAncestor, errInvalidChain: log.Warn("Synchronisation failed, dropping peer", "peer", id, "err", err) @@ -354,6 +360,12 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode if atomic.CompareAndSwapInt32(&d.notified, 0, 1) { log.Info("Block synchronisation started") } + // If we are already full syncing, but have a fast-sync bloom filter laying + // around, make sure it does't use memory any more. This is a special case + // when the user attempts to fast sync a new empty network. + if mode == FullSync && d.stateBloom != nil { + d.stateBloom.Close() + } // Reset the queue, peer set and wake channels to clean any internal leftover state d.queue.Reset() d.peers.Reset() @@ -408,7 +420,8 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I if err != nil { d.mux.Post(FailedEvent{err}) } else { - d.mux.Post(DoneEvent{}) + latest := d.lightchain.CurrentHeader() + d.mux.Post(DoneEvent{latest}) } }() if p.version < 62 { @@ -417,7 +430,7 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I log.Debug("Synchronising with the network", "peer", p.id, "eth", p.version, "head", hash, "td", td, "mode", d.mode) defer func(start time.Time) { - log.Debug("Synchronisation terminated", "elapsed", time.Since(start)) + log.Debug("Synchronisation terminated", "elapsed", common.PrettyDuration(time.Since(start))) }(time.Now()) // Look up the sync boundaries: the common ancestor and the target block @@ -427,7 +440,7 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I } height := latest.Number.Uint64() - origin, err := d.findAncestor(p, height) + origin, err := d.findAncestor(p, latest) if err != nil { return err } @@ -454,12 +467,49 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I if d.mode == FastSync && pivot != 0 { d.committed = 0 } + if d.mode == FastSync { + // Set the ancient data limitation. + // If we are running fast sync, all block data older than ancientLimit will be + // written to the ancient store. More recent data will be written to the active + // database and will wait for the freezer to migrate. + // + // If there is a checkpoint available, then calculate the ancientLimit through + // that. Otherwise calculate the ancient limit through the advertised height + // of the remote peer. + // + // The reason for picking checkpoint first is that a malicious peer can give us + // a fake (very high) height, forcing the ancient limit to also be very high. + // The peer would start to feed us valid blocks until head, resulting in all of + // the blocks might be written into the ancient store. A following mini-reorg + // could cause issues. + if d.checkpoint != 0 && d.checkpoint > maxForkAncestry+1 { + d.ancientLimit = d.checkpoint + } else if height > maxForkAncestry+1 { + d.ancientLimit = height - maxForkAncestry - 1 + } + frozen, _ := d.stateDB.Ancients() // Ignore the error here since light client can also hit here. + // If a part of blockchain data has already been written into active store, + // disable the ancient style insertion explicitly. + if origin >= frozen && frozen != 0 { + d.ancientLimit = 0 + log.Info("Disabling direct-ancient mode", "origin", origin, "ancient", frozen-1) + } else if d.ancientLimit > 0 { + log.Debug("Enabling direct-ancient mode", "ancient", d.ancientLimit) + } + // Rewind the ancient store and blockchain if reorg happens. + if origin+1 < frozen { + var hashes []common.Hash + for i := origin + 1; i < d.lightchain.CurrentHeader().Number.Uint64(); i++ { + hashes = append(hashes, rawdb.ReadCanonicalHash(d.stateDB, i)) + } + d.lightchain.Rollback(hashes) + } + } // Initiate the sync using a concurrent header and content retrieval algorithm d.queue.Prepare(origin+1, d.mode) if d.syncInitHook != nil { d.syncInitHook(origin, height) } - fetchers := []func() error{ func() error { return d.fetchHeaders(p, origin+1, pivot) }, // Headers are always retrieved func() error { return d.fetchBodies(origin + 1) }, // Bodies are retrieved during normal and fast sync @@ -492,7 +542,7 @@ func (d *Downloader) spawnSync(fetchers []func() error) error { // it has processed the queue. d.queue.Close() } - if err = <-errc; err != nil { + if err = <-errc; err != nil && err != errCanceled { break } } @@ -523,6 +573,9 @@ func (d *Downloader) cancel() { func (d *Downloader) Cancel() { d.cancel() d.cancelWg.Wait() + + d.ancientLimit = 0 + log.Debug("Reset ancient limit to zero") } // Terminate interrupts the downloader, canceling all pending operations. @@ -555,7 +608,7 @@ func (d *Downloader) fetchHeight(p *peerConnection) (*types.Header, error) { for { select { case <-d.cancelCh: - return nil, errCancelBlockFetch + return nil, errCanceled case packet := <-d.headerCh: // Discard anything not from the origin peer @@ -570,6 +623,10 @@ func (d *Downloader) fetchHeight(p *peerConnection) (*types.Header, error) { return nil, errBadPeer } head := headers[0] + if (d.mode == FastSync || d.mode == LightSync) && head.Number.Uint64() < d.checkpoint { + p.log.Warn("Remote head below checkpoint", "number", head.Number, "hash", head.Hash()) + return nil, errUnsyncedPeer + } p.log.Debug("Remote head header identified", "number", head.Number, "hash", head.Hash()) return head, nil @@ -584,41 +641,109 @@ func (d *Downloader) fetchHeight(p *peerConnection) (*types.Header, error) { } } -// findAncestor tries to locate the common ancestor link of the local chain and -// a remote peers blockchain. In the general case when our node was in sync and -// on the correct chain, checking the top N links should already get us a match. -// In the rare scenario when we ended up on a long reorganisation (i.e. none of -// the head links match), we do a binary search to find the common ancestor. -func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, error) { - // Figure out the valid ancestor range to prevent rewrite attacks - floor, ceil := int64(-1), d.lightchain.CurrentHeader().Number.Uint64() - - if d.mode == FullSync { - ceil = d.blockchain.CurrentBlock().NumberU64() - } else if d.mode == FastSync { - ceil = d.blockchain.CurrentFastBlock().NumberU64() +// calculateRequestSpan calculates what headers to request from a peer when trying to determine the +// common ancestor. +// It returns parameters to be used for peer.RequestHeadersByNumber: +// from - starting block number +// count - number of headers to request +// skip - number of headers to skip +// and also returns 'max', the last block which is expected to be returned by the remote peers, +// given the (from,count,skip) +func calculateRequestSpan(remoteHeight, localHeight uint64) (int64, int, int, uint64) { + var ( + from int + count int + MaxCount = MaxHeaderFetch / 16 + ) + // requestHead is the highest block that we will ask for. If requestHead is not offset, + // the highest block that we will get is 16 blocks back from head, which means we + // will fetch 14 or 15 blocks unnecessarily in the case the height difference + // between us and the peer is 1-2 blocks, which is most common + requestHead := int(remoteHeight) - 1 + if requestHead < 0 { + requestHead = 0 } - if ceil >= MaxForkAncestry { - floor = int64(ceil - MaxForkAncestry) + // requestBottom is the lowest block we want included in the query + // Ideally, we want to include just below own head + requestBottom := int(localHeight - 1) + if requestBottom < 0 { + requestBottom = 0 + } + totalSpan := requestHead - requestBottom + span := 1 + totalSpan/MaxCount + if span < 2 { + span = 2 + } + if span > 16 { + span = 16 } - p.log.Debug("Looking for common ancestor", "local", ceil, "remote", height) - // Request the topmost blocks to short circuit binary ancestor lookup - head := ceil - if head > height { - head = height + count = 1 + totalSpan/span + if count > MaxCount { + count = MaxCount + } + if count < 2 { + count = 2 } - from := int64(head) - int64(MaxHeaderFetch) + from = requestHead - (count-1)*span if from < 0 { from = 0 } - // Span out with 15 block gaps into the future to catch bad head reports - limit := 2 * MaxHeaderFetch / 16 - count := 1 + int((int64(ceil)-from)/16) - if count > limit { - count = limit + max := from + (count-1)*span + return int64(from), count, span - 1, uint64(max) +} + +// findAncestor tries to locate the common ancestor link of the local chain and +// a remote peers blockchain. In the general case when our node was in sync and +// on the correct chain, checking the top N links should already get us a match. +// In the rare scenario when we ended up on a long reorganisation (i.e. none of +// the head links match), we do a binary search to find the common ancestor. +func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) (uint64, error) { + // Figure out the valid ancestor range to prevent rewrite attacks + var ( + floor = int64(-1) + localHeight uint64 + remoteHeight = remoteHeader.Number.Uint64() + ) + switch d.mode { + case FullSync: + localHeight = d.blockchain.CurrentBlock().NumberU64() + case FastSync: + localHeight = d.blockchain.CurrentFastBlock().NumberU64() + default: + localHeight = d.lightchain.CurrentHeader().Number.Uint64() + } + p.log.Debug("Looking for common ancestor", "local", localHeight, "remote", remoteHeight) + + // Recap floor value for binary search + if localHeight >= maxForkAncestry { + // We're above the max reorg threshold, find the earliest fork point + floor = int64(localHeight - maxForkAncestry) + } + // If we're doing a light sync, ensure the floor doesn't go below the CHT, as + // all headers before that point will be missing. + if d.mode == LightSync { + // If we dont know the current CHT position, find it + if d.genesis == 0 { + header := d.lightchain.CurrentHeader() + for header != nil { + d.genesis = header.Number.Uint64() + if floor >= int64(d.genesis)-1 { + break + } + header = d.lightchain.GetHeaderByHash(header.ParentHash) + } + } + // We already know the "genesis" block number, cap floor to that + if floor < int64(d.genesis)-1 { + floor = int64(d.genesis) - 1 + } } - go p.peer.RequestHeadersByNumber(uint64(from), count, 15, false) + + from, count, skip, max := calculateRequestSpan(remoteHeight, localHeight) + + p.log.Trace("Span searching for common ancestor", "count", count, "from", from, "skip", skip) + go p.peer.RequestHeadersByNumber(uint64(from), count, skip, false) // Wait for the remote response to the head fetch number, hash := uint64(0), common.Hash{} @@ -629,7 +754,7 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err for finished := false; !finished; { select { case <-d.cancelCh: - return 0, errCancelHeaderFetch + return 0, errCanceled case packet := <-d.headerCh: // Discard anything not from the origin peer @@ -644,9 +769,10 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err return 0, errEmptyHeaderSet } // Make sure the peer's reply conforms to the request - for i := 0; i < len(headers); i++ { - if number := headers[i].Number.Int64(); number != from+int64(i)*16 { - p.log.Warn("Head headers broke chain ordering", "index", i, "requested", from+int64(i)*16, "received", number) + for i, header := range headers { + expectNumber := from + int64(i)*int64(skip+1) + if number := header.Number.Int64(); number != expectNumber { + p.log.Warn("Head headers broke chain ordering", "index", i, "requested", expectNumber, "received", number) return 0, errInvalidChain } } @@ -654,20 +780,24 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err finished = true for i := len(headers) - 1; i >= 0; i-- { // Skip any headers that underflow/overflow our requested set - if headers[i].Number.Int64() < from || headers[i].Number.Uint64() > ceil { + if headers[i].Number.Int64() < from || headers[i].Number.Uint64() > max { continue } // Otherwise check if we already know the header or not h := headers[i].Hash() n := headers[i].Number.Uint64() - if (d.mode == FullSync && d.blockchain.HasBlock(h, n)) || (d.mode != FullSync && d.lightchain.HasHeader(h, n)) { - number, hash = n, h - // If every header is known, even future ones, the peer straight out lied about its head - if number > height && i == limit-1 { - p.log.Warn("Lied about chain head", "reported", height, "found", number) - return 0, errStallingPeer - } + var known bool + switch d.mode { + case FullSync: + known = d.blockchain.HasBlock(h, n) + case FastSync: + known = d.blockchain.HasFastBlock(h, n) + default: + known = d.lightchain.HasHeader(h, n) + } + if known { + number, hash = n, h break } } @@ -691,10 +821,12 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err return number, nil } // Ancestor not found, we need to binary search over our chain - start, end := uint64(0), head + start, end := uint64(0), remoteHeight if floor > 0 { start = uint64(floor) } + p.log.Trace("Binary searching for common ancestor", "start", start, "end", end) + for start+1 < end { // Split our chain interval in two, and request the hash to cross check check := (start + end) / 2 @@ -708,7 +840,7 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err for arrived := false; !arrived; { select { case <-d.cancelCh: - return 0, errCancelHeaderFetch + return 0, errCanceled case packer := <-d.headerCh: // Discard anything not from the origin peer @@ -727,7 +859,17 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err // Modify the search interval based on the response h := headers[0].Hash() n := headers[0].Number.Uint64() - if (d.mode == FullSync && !d.blockchain.HasBlock(h, n)) || (d.mode != FullSync && !d.lightchain.HasHeader(h, n)) { + + var known bool + switch d.mode { + case FullSync: + known = d.blockchain.HasBlock(h, n) + case FastSync: + known = d.blockchain.HasFastBlock(h, n) + default: + known = d.lightchain.HasHeader(h, n) + } + if !known { end = check break } @@ -737,6 +879,7 @@ func (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, err return 0, errBadPeer } start = check + hash = h case <-timeout: p.log.Debug("Waiting for search header timed out", "elapsed", ttl) @@ -792,12 +935,13 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) } } // Start pulling the header chain skeleton until all is done + ancestor := from getHeaders(from) for { select { case <-d.cancelCh: - return errCancelHeaderFetch + return errCanceled case packet := <-d.headerCh: // Make sure the active peer is giving us the skeleton headers @@ -824,7 +968,7 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) getHeaders(from) continue case <-d.cancelCh: - return errCancelHeaderFetch + return errCanceled } } // Pivot done (or not in fast sync) and no more headers, terminate the process @@ -833,7 +977,7 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) case d.headerProcCh <- nil: return nil case <-d.cancelCh: - return errCancelHeaderFetch + return errCanceled } } headers := packet.(*headerPack).headers @@ -847,6 +991,36 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) } headers = filled[proced:] from += uint64(proced) + } else { + // If we're closing in on the chain head, but haven't yet reached it, delay + // the last few headers so mini reorgs on the head don't cause invalid hash + // chain errors. + if n := len(headers); n > 0 { + // Retrieve the current head we're at + var head uint64 + if d.mode == LightSync { + head = d.lightchain.CurrentHeader().Number.Uint64() + } else { + head = d.blockchain.CurrentFastBlock().NumberU64() + if full := d.blockchain.CurrentBlock().NumberU64(); head < full { + head = full + } + } + // If the head is below the common ancestor, we're actually deduplicating + // already existing chain segments, so use the ancestor as the fake head. + // Otherwise we might end up delaying header deliveries pointlessly. + if head < ancestor { + head = ancestor + } + // If the head is way older than this batch, delay the last few headers + if head+uint64(reorgProtThreshold) < headers[n-1].Number.Uint64() { + delay := reorgProtHeaderDelay + if delay > n { + delay = n + } + headers = headers[:n-delay] + } + } } // Insert all the new headers and fetch the next batch if len(headers) > 0 { @@ -854,11 +1028,21 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) select { case d.headerProcCh <- headers: case <-d.cancelCh: - return errCancelHeaderFetch + return errCanceled } from += uint64(len(headers)) + getHeaders(from) + } else { + // No headers delivered, or all of them being delayed, sleep a bit and retry + p.log.Trace("All headers delayed, waiting") + select { + case <-time.After(fsHeaderContCheck): + getHeaders(from) + continue + case <-d.cancelCh: + return errCanceled + } } - getHeaders(from) case <-timeout.C: if d.dropPeer == nil { @@ -915,7 +1099,7 @@ func (d *Downloader) fillHeaderSkeleton(from uint64, skeleton []*types.Header) ( capacity = func(p *peerConnection) int { return p.HeaderCapacity(d.requestRTT()) } setIdle = func(p *peerConnection, accepted int) { p.SetHeadersIdle(accepted) } ) - err := d.fetchParts(errCancelHeaderFetch, d.headerCh, deliver, d.queue.headerContCh, expire, + err := d.fetchParts(d.headerCh, deliver, d.queue.headerContCh, expire, d.queue.PendingHeaders, d.queue.InFlightHeaders, throttle, reserve, nil, fetch, d.queue.CancelHeaders, capacity, d.peers.HeaderIdlePeers, setIdle, "headers") @@ -941,7 +1125,7 @@ func (d *Downloader) fetchBodies(from uint64) error { capacity = func(p *peerConnection) int { return p.BlockCapacity(d.requestRTT()) } setIdle = func(p *peerConnection, accepted int) { p.SetBodiesIdle(accepted) } ) - err := d.fetchParts(errCancelBodyFetch, d.bodyCh, deliver, d.bodyWakeCh, expire, + err := d.fetchParts(d.bodyCh, deliver, d.bodyWakeCh, expire, d.queue.PendingBlocks, d.queue.InFlightBlocks, d.queue.ShouldThrottleBlocks, d.queue.ReserveBodies, d.bodyFetchHook, fetch, d.queue.CancelBodies, capacity, d.peers.BodyIdlePeers, setIdle, "bodies") @@ -965,7 +1149,7 @@ func (d *Downloader) fetchReceipts(from uint64) error { capacity = func(p *peerConnection) int { return p.ReceiptCapacity(d.requestRTT()) } setIdle = func(p *peerConnection, accepted int) { p.SetReceiptsIdle(accepted) } ) - err := d.fetchParts(errCancelReceiptFetch, d.receiptCh, deliver, d.receiptWakeCh, expire, + err := d.fetchParts(d.receiptCh, deliver, d.receiptWakeCh, expire, d.queue.PendingReceipts, d.queue.InFlightReceipts, d.queue.ShouldThrottleReceipts, d.queue.ReserveReceipts, d.receiptFetchHook, fetch, d.queue.CancelReceipts, capacity, d.peers.ReceiptIdlePeers, setIdle, "receipts") @@ -998,7 +1182,7 @@ func (d *Downloader) fetchReceipts(from uint64) error { // - idle: network callback to retrieve the currently (type specific) idle peers that can be assigned tasks // - setIdle: network callback to set a peer back to idle and update its estimated capacity (traffic shaping) // - kind: textual label of the type being downloaded to display in log mesages -func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliver func(dataPack) (int, error), wakeCh chan bool, +func (d *Downloader) fetchParts(deliveryCh chan dataPack, deliver func(dataPack) (int, error), wakeCh chan bool, expire func() map[string]int, pending func() int, inFlight func() bool, throttle func() bool, reserve func(*peerConnection, int) (*fetchRequest, bool, error), fetchHook func([]*types.Header), fetch func(*peerConnection, *fetchRequest) error, cancel func(*fetchRequest), capacity func(*peerConnection) int, idle func() ([]*peerConnection, int), setIdle func(*peerConnection, int), kind string) error { @@ -1014,7 +1198,7 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv for { select { case <-d.cancelCh: - return errCancel + return errCanceled case packet := <-deliveryCh: // If the peer was previously banned and failed to deliver its pack @@ -1085,12 +1269,23 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv setIdle(peer, 0) } else { peer.log.Debug("Stalling delivery, dropping", "type", kind) + if d.dropPeer == nil { // The dropPeer method is nil when `--copydb` is used for a local copy. // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored peer.log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", pid) } else { d.dropPeer(pid) + + // If this peer was the master peer, abort sync immediately + d.cancelLock.RLock() + master := pid == d.cancelPeer + d.cancelLock.RUnlock() + + if master { + d.cancel() + return errTimeout + } } } } @@ -1163,7 +1358,7 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv // queue until the stream ends or a failure occurs. func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) error { // Keep a count of uncertain headers to roll back - rollback := []*types.Header{} + var rollback []*types.Header defer func() { if len(rollback) > 0 { // Flatten the headers and roll them back @@ -1195,7 +1390,7 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er for { select { case <-d.cancelCh: - return errCancelHeaderProcessing + return errCanceled case headers := <-d.headerProcCh: // Terminate header processing if we synced up @@ -1209,7 +1404,7 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er } // If no headers were retrieved at all, the peer violated its TD promise that it had a // better chain compared to ours. The only exception is if its promised blocks were - // already imported by other means (e.g. fecher): + // already imported by other means (e.g. fetcher): // // R , L : Both at block 10 // R: Mine block 11, and propagate it to L @@ -1244,12 +1439,11 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er } // Otherwise split the chunk of headers into batches and process them gotHeaders = true - for len(headers) > 0 { // Terminate if something failed in between processing chunks select { case <-d.cancelCh: - return errCancelHeaderProcessing + return errCanceled default: } // Select the next chunk of headers to import @@ -1258,11 +1452,10 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er limit = len(headers) } chunk := headers[:limit] - // In case of header only syncing, validate the chunk immediately if d.mode == FastSync || d.mode == LightSync { // Collect the yet unknown headers to mark them as uncertain - unknown := make([]*types.Header, 0, len(headers)) + unknown := make([]*types.Header, 0, len(chunk)) for _, header := range chunk { if !d.lightchain.HasHeader(header.Hash(), header.Number.Uint64()) { unknown = append(unknown, header) @@ -1293,7 +1486,7 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er for d.queue.PendingBlocks() >= maxQueuedHeaders || d.queue.PendingReceipts() >= maxQueuedHeaders { select { case <-d.cancelCh: - return errCancelHeaderProcessing + return errCanceled case <-time.After(time.Second): } } @@ -1307,7 +1500,6 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er headers = headers[limit:] origin += uint64(limit) } - // Update the highest block number we know if a higher one is found. d.syncStatsLock.Lock() if d.syncStatsChainHeight < origin { @@ -1363,7 +1555,15 @@ func (d *Downloader) importBlockResults(results []*fetchResult) error { blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles) } if index, err := d.blockchain.InsertChain(blocks); err != nil { - log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err) + if index < len(results) { + log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err) + } else { + // The InsertChain method in blockchain.go will sometimes return an out-of-bounds index, + // when it needs to preprocess blocks to import a sidechain. + // The importer will put together a new list of blocks to import, which is a superset + // of the blocks delivered from the downloader, and the indexing will be off. + log.Debug("Downloaded item processing failed on sidechain import", "index", index, "err", err) + } return errInvalidChain } return nil @@ -1377,8 +1577,8 @@ func (d *Downloader) processFastSyncContent(latest *types.Header) error { stateSync := d.syncState(latest.Root) defer stateSync.Cancel() go func() { - if err := stateSync.Wait(); err != nil && err != errCancelStateFetch { - d.queue.Close() // wake up WaitResults + if err := stateSync.Wait(); err != nil && err != errCancelStateFetch && err != errCanceled { + d.queue.Close() // wake up Results } }() // Figure out the ideal pivot block. Note, that this goalpost may move if the @@ -1405,7 +1605,8 @@ func (d *Downloader) processFastSyncContent(latest *types.Header) error { // If sync failed, stop select { case <-d.cancelCh: - return stateSync.Cancel() + stateSync.Cancel() + return errCanceled default: } } @@ -1435,8 +1636,8 @@ func (d *Downloader) processFastSyncContent(latest *types.Header) error { stateSync = d.syncState(P.Header.Root) defer stateSync.Cancel() go func() { - if err := stateSync.Wait(); err != nil && err != errCancelStateFetch { - d.queue.Close() // wake up WaitResults + if err := stateSync.Wait(); err != nil && err != errCancelStateFetch && err != errCanceled { + d.queue.Close() // wake up Results } }() oldPivot = P @@ -1505,7 +1706,7 @@ func (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *state blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles) receipts[i] = result.Receipts } - if index, err := d.blockchain.InsertReceiptChain(blocks, receipts); err != nil { + if index, err := d.blockchain.InsertReceiptChain(blocks, receipts, d.ancientLimit); err != nil { log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err) return errInvalidChain } @@ -1515,13 +1716,24 @@ func (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *state func (d *Downloader) commitPivotBlock(result *fetchResult) error { block := types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles) log.Debug("Committing fast sync pivot as new head", "number", block.Number(), "hash", block.Hash()) - if _, err := d.blockchain.InsertReceiptChain([]*types.Block{block}, []types.Receipts{result.Receipts}); err != nil { + + // Commit the pivot block as the new head, will require full sync from here on + if _, err := d.blockchain.InsertReceiptChain([]*types.Block{block}, []types.Receipts{result.Receipts}, d.ancientLimit); err != nil { return err } if err := d.blockchain.FastSyncCommitHead(block.Hash()); err != nil { return err } atomic.StoreInt32(&d.committed, 1) + + // If we had a bloom filter for the state sync, deallocate it now. Note, we only + // deallocate internally, but keep the empty wrapper. This ensures that if we do + // a rollback after committing the pivot and restarting fast sync, we don't end + // up using a nil bloom. Empty bloom is fine, it just returns that it does not + // have the info we need, so reach down to the database instead. + if d.stateBloom != nil { + d.stateBloom.Close() + } return nil } diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index d1a9a8694b77..b23043b1c003 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -20,30 +20,24 @@ import ( "errors" "fmt" "math/big" + "strings" "sync" "sync/atomic" "testing" "time" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/consensus/ethash" - "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" ) -var ( - testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - testAddress = crypto.PubkeyToAddress(testKey.PublicKey) -) - // Reduce some of the parameters to make the tester faster. func init() { - MaxForkAncestry = uint64(10000) + maxForkAncestry = 10000 blockCacheItems = 1024 fsHeaderContCheck = 500 * time.Millisecond } @@ -55,6 +49,7 @@ type downloadTester struct { genesis *types.Block // Genesis blocks used by the tester and peers stateDb ethdb.Database // Database used by the tester for syncing from peers peerDb ethdb.Database // Database of the peers containing all data + peers map[string]*downloadTesterPeer ownHashes []common.Hash // Hash chain belonging to the tester ownHeaders map[common.Hash]*types.Header // Headers belonging to the tester @@ -62,129 +57,39 @@ type downloadTester struct { ownReceipts map[common.Hash]types.Receipts // Receipts belonging to the tester ownChainTd map[common.Hash]*big.Int // Total difficulties of the blocks in the local chain - peerHashes map[string][]common.Hash // Hash chain belonging to different test peers - peerHeaders map[string]map[common.Hash]*types.Header // Headers belonging to different test peers - peerBlocks map[string]map[common.Hash]*types.Block // Blocks belonging to different test peers - peerReceipts map[string]map[common.Hash]types.Receipts // Receipts belonging to different test peers - peerChainTds map[string]map[common.Hash]*big.Int // Total difficulties of the blocks in the peer chains - - peerMissingStates map[string]map[common.Hash]bool // State entries that fast sync should not return + ancientHeaders map[common.Hash]*types.Header // Ancient headers belonging to the tester + ancientBlocks map[common.Hash]*types.Block // Ancient blocks belonging to the tester + ancientReceipts map[common.Hash]types.Receipts // Ancient receipts belonging to the tester + ancientChainTd map[common.Hash]*big.Int // Ancient total difficulties of the blocks in the local chain lock sync.RWMutex } // newTester creates a new downloader test mocker. func newTester() *downloadTester { - testdb := ethdb.NewMemDatabase() - genesis := core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000)) - tester := &downloadTester{ - genesis: genesis, - peerDb: testdb, - ownHashes: []common.Hash{genesis.Hash()}, - ownHeaders: map[common.Hash]*types.Header{genesis.Hash(): genesis.Header()}, - ownBlocks: map[common.Hash]*types.Block{genesis.Hash(): genesis}, - ownReceipts: map[common.Hash]types.Receipts{genesis.Hash(): nil}, - ownChainTd: map[common.Hash]*big.Int{genesis.Hash(): genesis.Difficulty()}, - peerHashes: make(map[string][]common.Hash), - peerHeaders: make(map[string]map[common.Hash]*types.Header), - peerBlocks: make(map[string]map[common.Hash]*types.Block), - peerReceipts: make(map[string]map[common.Hash]types.Receipts), - peerChainTds: make(map[string]map[common.Hash]*big.Int), - peerMissingStates: make(map[string]map[common.Hash]bool), - } - tester.stateDb = ethdb.NewMemDatabase() - tester.stateDb.Put(genesis.Root().Bytes(), []byte{0x00}) - - tester.downloader = New(FullSync, tester.stateDb, new(event.TypeMux), tester, nil, tester.dropPeer) - + genesis: testGenesis, + peerDb: testDB, + peers: make(map[string]*downloadTesterPeer), + ownHashes: []common.Hash{testGenesis.Hash()}, + ownHeaders: map[common.Hash]*types.Header{testGenesis.Hash(): testGenesis.Header()}, + ownBlocks: map[common.Hash]*types.Block{testGenesis.Hash(): testGenesis}, + ownReceipts: map[common.Hash]types.Receipts{testGenesis.Hash(): nil}, + ownChainTd: map[common.Hash]*big.Int{testGenesis.Hash(): testGenesis.Difficulty()}, + + // Initialize ancient store with test genesis block + ancientHeaders: map[common.Hash]*types.Header{testGenesis.Hash(): testGenesis.Header()}, + ancientBlocks: map[common.Hash]*types.Block{testGenesis.Hash(): testGenesis}, + ancientReceipts: map[common.Hash]types.Receipts{testGenesis.Hash(): nil}, + ancientChainTd: map[common.Hash]*big.Int{testGenesis.Hash(): testGenesis.Difficulty()}, + } + tester.stateDb = rawdb.NewMemoryDatabase() + tester.stateDb.Put(testGenesis.Root().Bytes(), []byte{0x00}) + + tester.downloader = New(0, tester.stateDb, trie.NewSyncBloom(1, tester.stateDb), new(event.TypeMux), tester, nil, tester.dropPeer) return tester } -// makeChain creates a chain of n blocks starting at and including parent. -// the returned hash chain is ordered head->parent. In addition, every 3rd block -// contains a transaction and every 5th an uncle to allow testing correct block -// reassembly. -func (dl *downloadTester) makeChain(n int, seed byte, parent *types.Block, parentReceipts types.Receipts, heavy bool) ([]common.Hash, map[common.Hash]*types.Header, map[common.Hash]*types.Block, map[common.Hash]types.Receipts) { - // Generate the block chain - blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), dl.peerDb, n, func(i int, block *core.BlockGen) { - block.SetCoinbase(common.Address{seed}) - - // If a heavy chain is requested, delay blocks to raise difficulty - if heavy { - block.OffsetTime(-1) - } - // If the block number is multiple of 3, send a bonus transaction to the miner - if parent == dl.genesis && i%3 == 0 { - signer := types.MakeSigner(params.TestChainConfig, block.Number()) - tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, big.NewInt(1000), params.TxGas, nil, nil), signer, testKey) - if err != nil { - panic(err) - } - block.AddTx(tx) - } - // If the block number is a multiple of 5, add a bonus uncle to the block - if i > 0 && i%5 == 0 { - block.AddUncle(&types.Header{ - ParentHash: block.PrevBlock(i - 1).Hash(), - Number: big.NewInt(block.Number().Int64() - 1), - }) - } - }) - // Convert the block-chain into a hash-chain and header/block maps - hashes := make([]common.Hash, n+1) - hashes[len(hashes)-1] = parent.Hash() - - headerm := make(map[common.Hash]*types.Header, n+1) - headerm[parent.Hash()] = parent.Header() - - blockm := make(map[common.Hash]*types.Block, n+1) - blockm[parent.Hash()] = parent - - receiptm := make(map[common.Hash]types.Receipts, n+1) - receiptm[parent.Hash()] = parentReceipts - - for i, b := range blocks { - hashes[len(hashes)-i-2] = b.Hash() - headerm[b.Hash()] = b.Header() - blockm[b.Hash()] = b - receiptm[b.Hash()] = receipts[i] - } - return hashes, headerm, blockm, receiptm -} - -// makeChainFork creates two chains of length n, such that h1[:f] and -// h2[:f] are different but have a common suffix of length n-f. -func (dl *downloadTester) makeChainFork(n, f int, parent *types.Block, parentReceipts types.Receipts, balanced bool) ([]common.Hash, []common.Hash, map[common.Hash]*types.Header, map[common.Hash]*types.Header, map[common.Hash]*types.Block, map[common.Hash]*types.Block, map[common.Hash]types.Receipts, map[common.Hash]types.Receipts) { - // Create the common suffix - hashes, headers, blocks, receipts := dl.makeChain(n-f, 0, parent, parentReceipts, false) - - // Create the forks, making the second heavier if non balanced forks were requested - hashes1, headers1, blocks1, receipts1 := dl.makeChain(f, 1, blocks[hashes[0]], receipts[hashes[0]], false) - hashes1 = append(hashes1, hashes[1:]...) - - heavy := false - if !balanced { - heavy = true - } - hashes2, headers2, blocks2, receipts2 := dl.makeChain(f, 2, blocks[hashes[0]], receipts[hashes[0]], heavy) - hashes2 = append(hashes2, hashes[1:]...) - - for hash, header := range headers { - headers1[hash] = header - headers2[hash] = header - } - for hash, block := range blocks { - blocks1[hash] = block - blocks2[hash] = block - } - for hash, receipt := range receipts { - receipts1[hash] = receipt - receipts2[hash] = receipt - } - return hashes1, hashes2, headers1, headers2, blocks1, blocks2, receipts1, receipts2 -} - // terminate aborts any operations on the embedded downloader and releases all // held resources. func (dl *downloadTester) terminate() { @@ -194,13 +99,10 @@ func (dl *downloadTester) terminate() { // sync starts synchronizing with a remote peer, blocking until it completes. func (dl *downloadTester) sync(id string, td *big.Int, mode SyncMode) error { dl.lock.RLock() - hash := dl.peerHashes[id][0] + hash := dl.peers[id].chain.headBlock().Hash() // If no particular TD was requested, load from the peer's blockchain if td == nil { - td = big.NewInt(1) - if diff, ok := dl.peerChainTds[id][hash]; ok { - td = diff - } + td = dl.peers[id].chain.td(hash) } dl.lock.RUnlock() @@ -226,11 +128,27 @@ func (dl *downloadTester) HasBlock(hash common.Hash, number uint64) bool { return dl.GetBlockByHash(hash) != nil } +// HasFastBlock checks if a block is present in the testers canonical chain. +func (dl *downloadTester) HasFastBlock(hash common.Hash, number uint64) bool { + dl.lock.RLock() + defer dl.lock.RUnlock() + + if _, ok := dl.ancientReceipts[hash]; ok { + return true + } + _, ok := dl.ownReceipts[hash] + return ok +} + // GetHeader retrieves a header from the testers canonical chain. func (dl *downloadTester) GetHeaderByHash(hash common.Hash) *types.Header { dl.lock.RLock() defer dl.lock.RUnlock() + header := dl.ancientHeaders[hash] + if header != nil { + return header + } return dl.ownHeaders[hash] } @@ -239,6 +157,10 @@ func (dl *downloadTester) GetBlockByHash(hash common.Hash) *types.Block { dl.lock.RLock() defer dl.lock.RUnlock() + block := dl.ancientBlocks[hash] + if block != nil { + return block + } return dl.ownBlocks[hash] } @@ -248,6 +170,9 @@ func (dl *downloadTester) CurrentHeader() *types.Header { defer dl.lock.RUnlock() for i := len(dl.ownHashes) - 1; i >= 0; i-- { + if header := dl.ancientHeaders[dl.ownHashes[i]]; header != nil { + return header + } if header := dl.ownHeaders[dl.ownHashes[i]]; header != nil { return header } @@ -261,6 +186,12 @@ func (dl *downloadTester) CurrentBlock() *types.Block { defer dl.lock.RUnlock() for i := len(dl.ownHashes) - 1; i >= 0; i-- { + if block := dl.ancientBlocks[dl.ownHashes[i]]; block != nil { + if _, err := dl.stateDb.Get(block.Root().Bytes()); err == nil { + return block + } + return block + } if block := dl.ownBlocks[dl.ownHashes[i]]; block != nil { if _, err := dl.stateDb.Get(block.Root().Bytes()); err == nil { return block @@ -276,6 +207,9 @@ func (dl *downloadTester) CurrentFastBlock() *types.Block { defer dl.lock.RUnlock() for i := len(dl.ownHashes) - 1; i >= 0; i-- { + if block := dl.ancientBlocks[dl.ownHashes[i]]; block != nil { + return block + } if block := dl.ownBlocks[dl.ownHashes[i]]; block != nil { return block } @@ -287,7 +221,7 @@ func (dl *downloadTester) CurrentFastBlock() *types.Block { func (dl *downloadTester) FastSyncCommitHead(hash common.Hash) error { // For now only check that the state trie is correct if block := dl.GetBlockByHash(hash); block != nil { - _, err := trie.NewSecure(block.Root(), trie.NewDatabase(dl.stateDb), 0) + _, err := trie.NewSecure(block.Root(), trie.NewDatabase(dl.stateDb)) return err } return fmt.Errorf("non existent block: %x", hash[:4]) @@ -298,11 +232,14 @@ func (dl *downloadTester) GetTd(hash common.Hash, number uint64) *big.Int { dl.lock.RLock() defer dl.lock.RUnlock() + if td := dl.ancientChainTd[hash]; td != nil { + return td + } return dl.ownChainTd[hash] } // InsertHeaderChain injects a new batch of headers into the simulated chain. -func (dl *downloadTester) InsertHeaderChain(headers []*types.Header, checkFreq int) (int, error) { +func (dl *downloadTester) InsertHeaderChain(headers []*types.Header, checkFreq int) (i int, err error) { dl.lock.Lock() defer dl.lock.Unlock() @@ -331,7 +268,7 @@ func (dl *downloadTester) InsertHeaderChain(headers []*types.Header, checkFreq i } // InsertChain injects a new batch of blocks into the simulated chain. -func (dl *downloadTester) InsertChain(blocks types.Blocks) (int, error) { +func (dl *downloadTester) InsertChain(blocks types.Blocks) (i int, err error) { dl.lock.Lock() defer dl.lock.Unlock() @@ -346,6 +283,7 @@ func (dl *downloadTester) InsertChain(blocks types.Blocks) (int, error) { dl.ownHeaders[block.Hash()] = block.Header() } dl.ownBlocks[block.Hash()] = block + dl.ownReceipts[block.Hash()] = make(types.Receipts, 0) dl.stateDb.Put(block.Root().Bytes(), []byte{0x00}) dl.ownChainTd[block.Hash()] = new(big.Int).Add(dl.ownChainTd[block.ParentHash()], block.Difficulty()) } @@ -353,7 +291,7 @@ func (dl *downloadTester) InsertChain(blocks types.Blocks) (int, error) { } // InsertReceiptChain injects a new batch of receipts into the simulated chain. -func (dl *downloadTester) InsertReceiptChain(blocks types.Blocks, receipts []types.Receipts) (int, error) { +func (dl *downloadTester) InsertReceiptChain(blocks types.Blocks, receipts []types.Receipts, ancientLimit uint64) (i int, err error) { dl.lock.Lock() defer dl.lock.Unlock() @@ -361,11 +299,25 @@ func (dl *downloadTester) InsertReceiptChain(blocks types.Blocks, receipts []typ if _, ok := dl.ownHeaders[blocks[i].Hash()]; !ok { return i, errors.New("unknown owner") } - if _, ok := dl.ownBlocks[blocks[i].ParentHash()]; !ok { - return i, errors.New("unknown parent") + if _, ok := dl.ancientBlocks[blocks[i].ParentHash()]; !ok { + if _, ok := dl.ownBlocks[blocks[i].ParentHash()]; !ok { + return i, errors.New("unknown parent") + } + } + if blocks[i].NumberU64() <= ancientLimit { + dl.ancientBlocks[blocks[i].Hash()] = blocks[i] + dl.ancientReceipts[blocks[i].Hash()] = receipts[i] + + // Migrate from active db to ancient db + dl.ancientHeaders[blocks[i].Hash()] = blocks[i].Header() + dl.ancientChainTd[blocks[i].Hash()] = new(big.Int).Add(dl.ancientChainTd[blocks[i].ParentHash()], blocks[i].Difficulty()) + + delete(dl.ownHeaders, blocks[i].Hash()) + delete(dl.ownChainTd, blocks[i].Hash()) + } else { + dl.ownBlocks[blocks[i].Hash()] = blocks[i] + dl.ownReceipts[blocks[i].Hash()] = receipts[i] } - dl.ownBlocks[blocks[i].Hash()] = blocks[i] - dl.ownReceipts[blocks[i].Hash()] = receipts[i] } return len(blocks), nil } @@ -383,64 +335,22 @@ func (dl *downloadTester) Rollback(hashes []common.Hash) { delete(dl.ownHeaders, hashes[i]) delete(dl.ownReceipts, hashes[i]) delete(dl.ownBlocks, hashes[i]) + + delete(dl.ancientChainTd, hashes[i]) + delete(dl.ancientHeaders, hashes[i]) + delete(dl.ancientReceipts, hashes[i]) + delete(dl.ancientBlocks, hashes[i]) } } // newPeer registers a new block download source into the downloader. -func (dl *downloadTester) newPeer(id string, version int, hashes []common.Hash, headers map[common.Hash]*types.Header, blocks map[common.Hash]*types.Block, receipts map[common.Hash]types.Receipts) error { - return dl.newSlowPeer(id, version, hashes, headers, blocks, receipts, 0) -} - -// newSlowPeer registers a new block download source into the downloader, with a -// specific delay time on processing the network packets sent to it, simulating -// potentially slow network IO. -func (dl *downloadTester) newSlowPeer(id string, version int, hashes []common.Hash, headers map[common.Hash]*types.Header, blocks map[common.Hash]*types.Block, receipts map[common.Hash]types.Receipts, delay time.Duration) error { +func (dl *downloadTester) newPeer(id string, version int, chain *testChain) error { dl.lock.Lock() defer dl.lock.Unlock() - var err = dl.downloader.RegisterPeer(id, version, &downloadTesterPeer{dl: dl, id: id, delay: delay}) - if err == nil { - // Assign the owned hashes, headers and blocks to the peer (deep copy) - dl.peerHashes[id] = make([]common.Hash, len(hashes)) - copy(dl.peerHashes[id], hashes) - - dl.peerHeaders[id] = make(map[common.Hash]*types.Header) - dl.peerBlocks[id] = make(map[common.Hash]*types.Block) - dl.peerReceipts[id] = make(map[common.Hash]types.Receipts) - dl.peerChainTds[id] = make(map[common.Hash]*big.Int) - dl.peerMissingStates[id] = make(map[common.Hash]bool) - - genesis := hashes[len(hashes)-1] - if header := headers[genesis]; header != nil { - dl.peerHeaders[id][genesis] = header - dl.peerChainTds[id][genesis] = header.Difficulty - } - if block := blocks[genesis]; block != nil { - dl.peerBlocks[id][genesis] = block - dl.peerChainTds[id][genesis] = block.Difficulty() - } - - for i := len(hashes) - 2; i >= 0; i-- { - hash := hashes[i] - - if header, ok := headers[hash]; ok { - dl.peerHeaders[id][hash] = header - if _, ok := dl.peerHeaders[id][header.ParentHash]; ok { - dl.peerChainTds[id][hash] = new(big.Int).Add(header.Difficulty, dl.peerChainTds[id][header.ParentHash]) - } - } - if block, ok := blocks[hash]; ok { - dl.peerBlocks[id][hash] = block - if _, ok := dl.peerBlocks[id][block.ParentHash()]; ok { - dl.peerChainTds[id][hash] = new(big.Int).Add(block.Difficulty(), dl.peerChainTds[id][block.ParentHash()]) - } - } - if receipt, ok := receipts[hash]; ok { - dl.peerReceipts[id][hash] = receipt - } - } - } - return err + peer := &downloadTesterPeer{dl: dl, id: id, chain: chain} + dl.peers[id] = peer + return dl.downloader.RegisterPeer(id, version, peer) } // dropPeer simulates a hard peer removal from the connection pool. @@ -448,89 +358,48 @@ func (dl *downloadTester) dropPeer(id string) { dl.lock.Lock() defer dl.lock.Unlock() - delete(dl.peerHashes, id) - delete(dl.peerHeaders, id) - delete(dl.peerBlocks, id) - delete(dl.peerChainTds, id) - + delete(dl.peers, id) dl.downloader.UnregisterPeer(id) } type downloadTesterPeer struct { - dl *downloadTester - id string - delay time.Duration - lock sync.RWMutex -} - -// setDelay is a thread safe setter for the network delay value. -func (dlp *downloadTesterPeer) setDelay(delay time.Duration) { - dlp.lock.Lock() - defer dlp.lock.Unlock() - - dlp.delay = delay -} - -// waitDelay is a thread safe way to sleep for the configured time. -func (dlp *downloadTesterPeer) waitDelay() { - dlp.lock.RLock() - delay := dlp.delay - dlp.lock.RUnlock() - - time.Sleep(delay) + dl *downloadTester + id string + lock sync.RWMutex + chain *testChain + missingStates map[common.Hash]bool // State entries that fast sync should not return } // Head constructs a function to retrieve a peer's current head hash // and total difficulty. func (dlp *downloadTesterPeer) Head() (common.Hash, *big.Int) { - dlp.dl.lock.RLock() - defer dlp.dl.lock.RUnlock() - - return dlp.dl.peerHashes[dlp.id][0], nil + b := dlp.chain.headBlock() + return b.Hash(), dlp.chain.td(b.Hash()) } // RequestHeadersByHash constructs a GetBlockHeaders function based on a hashed // origin; associated with a particular peer in the download tester. The returned // function can be used to retrieve batches of headers from the particular peer. func (dlp *downloadTesterPeer) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool) error { - // Find the canonical number of the hash - dlp.dl.lock.RLock() - number := uint64(0) - for num, hash := range dlp.dl.peerHashes[dlp.id] { - if hash == origin { - number = uint64(len(dlp.dl.peerHashes[dlp.id]) - num - 1) - break - } + if reverse { + panic("reverse header requests not supported") } - dlp.dl.lock.RUnlock() - // Use the absolute header fetcher to satisfy the query - return dlp.RequestHeadersByNumber(number, amount, skip, reverse) + result := dlp.chain.headersByHash(origin, amount, skip) + go dlp.dl.downloader.DeliverHeaders(dlp.id, result) + return nil } // RequestHeadersByNumber constructs a GetBlockHeaders function based on a numbered // origin; associated with a particular peer in the download tester. The returned // function can be used to retrieve batches of headers from the particular peer. func (dlp *downloadTesterPeer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error { - dlp.waitDelay() - - dlp.dl.lock.RLock() - defer dlp.dl.lock.RUnlock() - - // Gather the next batch of headers - hashes := dlp.dl.peerHashes[dlp.id] - headers := dlp.dl.peerHeaders[dlp.id] - result := make([]*types.Header, 0, amount) - for i := 0; i < amount && len(hashes)-int(origin)-1-i*(skip+1) >= 0; i++ { - if header, ok := headers[hashes[len(hashes)-int(origin)-1-i*(skip+1)]]; ok { - result = append(result, header) - } + if reverse { + panic("reverse header requests not supported") } - // Delay delivery a bit to allow attacks to unfold - go func() { - time.Sleep(time.Millisecond) - dlp.dl.downloader.DeliverHeaders(dlp.id, result) - }() + + result := dlp.chain.headersByNumber(origin, amount, skip) + go dlp.dl.downloader.DeliverHeaders(dlp.id, result) return nil } @@ -538,24 +407,8 @@ func (dlp *downloadTesterPeer) RequestHeadersByNumber(origin uint64, amount int, // peer in the download tester. The returned function can be used to retrieve // batches of block bodies from the particularly requested peer. func (dlp *downloadTesterPeer) RequestBodies(hashes []common.Hash) error { - dlp.waitDelay() - - dlp.dl.lock.RLock() - defer dlp.dl.lock.RUnlock() - - blocks := dlp.dl.peerBlocks[dlp.id] - - transactions := make([][]*types.Transaction, 0, len(hashes)) - uncles := make([][]*types.Header, 0, len(hashes)) - - for _, hash := range hashes { - if block, ok := blocks[hash]; ok { - transactions = append(transactions, block.Transactions()) - uncles = append(uncles, block.Uncles()) - } - } - go dlp.dl.downloader.DeliverBodies(dlp.id, transactions, uncles) - + txs, uncles := dlp.chain.bodies(hashes) + go dlp.dl.downloader.DeliverBodies(dlp.id, txs, uncles) return nil } @@ -563,21 +416,8 @@ func (dlp *downloadTesterPeer) RequestBodies(hashes []common.Hash) error { // peer in the download tester. The returned function can be used to retrieve // batches of block receipts from the particularly requested peer. func (dlp *downloadTesterPeer) RequestReceipts(hashes []common.Hash) error { - dlp.waitDelay() - - dlp.dl.lock.RLock() - defer dlp.dl.lock.RUnlock() - - receipts := dlp.dl.peerReceipts[dlp.id] - - results := make([][]*types.Receipt, 0, len(hashes)) - for _, hash := range hashes { - if receipt, ok := receipts[hash]; ok { - results = append(results, receipt) - } - } - go dlp.dl.downloader.DeliverReceipts(dlp.id, results) - + receipts := dlp.chain.receipts(hashes) + go dlp.dl.downloader.DeliverReceipts(dlp.id, receipts) return nil } @@ -585,75 +425,57 @@ func (dlp *downloadTesterPeer) RequestReceipts(hashes []common.Hash) error { // peer in the download tester. The returned function can be used to retrieve // batches of node state data from the particularly requested peer. func (dlp *downloadTesterPeer) RequestNodeData(hashes []common.Hash) error { - dlp.waitDelay() - dlp.dl.lock.RLock() defer dlp.dl.lock.RUnlock() results := make([][]byte, 0, len(hashes)) for _, hash := range hashes { if data, err := dlp.dl.peerDb.Get(hash.Bytes()); err == nil { - if !dlp.dl.peerMissingStates[dlp.id][hash] { + if !dlp.missingStates[hash] { results = append(results, data) } } } go dlp.dl.downloader.DeliverNodeData(dlp.id, results) - return nil } // assertOwnChain checks if the local chain contains the correct number of items // of the various chain components. func assertOwnChain(t *testing.T, tester *downloadTester, length int) { + // Mark this method as a helper to report errors at callsite, not in here + t.Helper() + assertOwnForkedChain(t, tester, 1, []int{length}) } // assertOwnForkedChain checks if the local forked chain contains the correct // number of items of the various chain components. func assertOwnForkedChain(t *testing.T, tester *downloadTester, common int, lengths []int) { + // Mark this method as a helper to report errors at callsite, not in here + t.Helper() + // Initialize the counters for the first fork - headers, blocks, receipts := lengths[0], lengths[0], lengths[0]-fsMinFullBlocks + headers, blocks, receipts := lengths[0], lengths[0], lengths[0] - if receipts < 0 { - receipts = 1 - } // Update the counters for each subsequent fork for _, length := range lengths[1:] { headers += length - common blocks += length - common - receipts += length - common - fsMinFullBlocks + receipts += length - common } - switch tester.downloader.mode { - case FullSync: - receipts = 1 - case LightSync: + if tester.downloader.mode == LightSync { blocks, receipts = 1, 1 } - if hs := len(tester.ownHeaders); hs != headers { + if hs := len(tester.ownHeaders) + len(tester.ancientHeaders) - 1; hs != headers { t.Fatalf("synchronised headers mismatch: have %v, want %v", hs, headers) } - if bs := len(tester.ownBlocks); bs != blocks { + if bs := len(tester.ownBlocks) + len(tester.ancientBlocks) - 1; bs != blocks { t.Fatalf("synchronised blocks mismatch: have %v, want %v", bs, blocks) } - if rs := len(tester.ownReceipts); rs != receipts { + if rs := len(tester.ownReceipts) + len(tester.ancientReceipts) - 1; rs != receipts { t.Fatalf("synchronised receipts mismatch: have %v, want %v", rs, receipts) } - // Verify the state trie too for fast syncs - /*if tester.downloader.mode == FastSync { - pivot := uint64(0) - var index int - if pivot := int(tester.downloader.queue.fastSyncPivot); pivot < common { - index = pivot - } else { - index = len(tester.ownHashes) - lengths[len(lengths)-1] + int(tester.downloader.queue.fastSyncPivot) - } - if index > 0 { - if statedb, err := state.New(tester.ownHeaders[tester.ownHashes[index]].Root, state.NewDatabase(trie.NewDatabase(tester.stateDb))); statedb == nil || err != nil { - t.Fatalf("state reconstruction failed: %v", err) - } - } - }*/ } // Tests that simple synchronization against a canonical chain works correctly. @@ -673,16 +495,14 @@ func testCanonicalSynchronisation(t *testing.T, protocol int, mode SyncMode) { defer tester.terminate() // Create a small enough block chain to download - targetBlocks := blockCacheItems - 15 - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) - - tester.newPeer("peer", protocol, hashes, headers, blocks, receipts) + chain := testChainBase.shorten(blockCacheItems - 15) + tester.newPeer("peer", protocol, chain) // Synchronise with the peer and make sure all relevant data was retrieved if err := tester.sync("peer", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, targetBlocks+1) + assertOwnChain(t, tester, chain.len()) } // Tests that if a large batch of blocks are being downloaded, it is throttled @@ -699,10 +519,8 @@ func testThrottling(t *testing.T, protocol int, mode SyncMode) { defer tester.terminate() // Create a long block chain to download and the tester - targetBlocks := 8 * blockCacheItems - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) - - tester.newPeer("peer", protocol, hashes, headers, blocks, receipts) + targetBlocks := testChainBase.len() - 1 + tester.newPeer("peer", protocol, testChainBase) // Wrap the importer to allow stepping blocked, proceed := uint32(0), make(chan struct{}) @@ -734,9 +552,7 @@ func testThrottling(t *testing.T, protocol int, mode SyncMode) { cached = len(tester.downloader.queue.blockDonePool) if mode == FastSync { if receipts := len(tester.downloader.queue.receiptDonePool); receipts < cached { - //if tester.downloader.queue.resultCache[receipts].Header.Number.Uint64() < tester.downloader.queue.fastSyncPivot { cached = receipts - //} } } frozen = int(atomic.LoadUint32(&blocked)) @@ -744,7 +560,7 @@ func testThrottling(t *testing.T, protocol int, mode SyncMode) { tester.downloader.queue.lock.Unlock() tester.lock.Unlock() - if cached == blockCacheItems || retrieved+cached+frozen == targetBlocks+1 { + if cached == blockCacheItems || cached == blockCacheItems-reorgProtHeaderDelay || retrieved+cached+frozen == targetBlocks+1 || retrieved+cached+frozen == targetBlocks+1-reorgProtHeaderDelay { break } } @@ -754,7 +570,7 @@ func testThrottling(t *testing.T, protocol int, mode SyncMode) { tester.lock.RLock() retrieved = len(tester.ownBlocks) tester.lock.RUnlock() - if cached != blockCacheItems && retrieved+cached+frozen != targetBlocks+1 { + if cached != blockCacheItems && cached != blockCacheItems-reorgProtHeaderDelay && retrieved+cached+frozen != targetBlocks+1 && retrieved+cached+frozen != targetBlocks+1-reorgProtHeaderDelay { t.Fatalf("block count mismatch: have %v, want %v (owned %v, blocked %v, target %v)", cached, blockCacheItems, retrieved, frozen, targetBlocks+1) } // Permit the blocked blocks to import @@ -786,24 +602,22 @@ func testForkedSync(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - // Create a long enough forked chain - common, fork := MaxHashFetch, 2*MaxHashFetch - hashesA, hashesB, headersA, headersB, blocksA, blocksB, receiptsA, receiptsB := tester.makeChainFork(common+fork, fork, tester.genesis, nil, true) - - tester.newPeer("fork A", protocol, hashesA, headersA, blocksA, receiptsA) - tester.newPeer("fork B", protocol, hashesB, headersB, blocksB, receiptsB) + chainA := testChainForkLightA.shorten(testChainBase.len() + 80) + chainB := testChainForkLightB.shorten(testChainBase.len() + 80) + tester.newPeer("fork A", protocol, chainA) + tester.newPeer("fork B", protocol, chainB) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("fork A", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, common+fork+1) + assertOwnChain(t, tester, chainA.len()) // Synchronise with the second peer and make sure that fork is pulled too if err := tester.sync("fork B", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnForkedChain(t, tester, common+1, []int{common + fork + 1, common + fork + 1}) + assertOwnForkedChain(t, tester, testChainBase.len(), []int{chainA.len(), chainB.len()}) } // Tests that synchronising against a much shorter but much heavyer fork works @@ -821,24 +635,22 @@ func testHeavyForkedSync(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - // Create a long enough forked chain - common, fork := MaxHashFetch, 4*MaxHashFetch - hashesA, hashesB, headersA, headersB, blocksA, blocksB, receiptsA, receiptsB := tester.makeChainFork(common+fork, fork, tester.genesis, nil, false) - - tester.newPeer("light", protocol, hashesA, headersA, blocksA, receiptsA) - tester.newPeer("heavy", protocol, hashesB[fork/2:], headersB, blocksB, receiptsB) + chainA := testChainForkLightA.shorten(testChainBase.len() + 80) + chainB := testChainForkHeavy.shorten(testChainBase.len() + 80) + tester.newPeer("light", protocol, chainA) + tester.newPeer("heavy", protocol, chainB) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("light", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, common+fork+1) + assertOwnChain(t, tester, chainA.len()) // Synchronise with the second peer and make sure that fork is pulled too if err := tester.sync("heavy", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnForkedChain(t, tester, common+1, []int{common + fork + 1, common + fork/2 + 1}) + assertOwnForkedChain(t, tester, testChainBase.len(), []int{chainA.len(), chainB.len()}) } // Tests that chain forks are contained within a certain interval of the current @@ -857,18 +669,16 @@ func testBoundedForkedSync(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - // Create a long enough forked chain - common, fork := 13, int(MaxForkAncestry+17) - hashesA, hashesB, headersA, headersB, blocksA, blocksB, receiptsA, receiptsB := tester.makeChainFork(common+fork, fork, tester.genesis, nil, true) - - tester.newPeer("original", protocol, hashesA, headersA, blocksA, receiptsA) - tester.newPeer("rewriter", protocol, hashesB, headersB, blocksB, receiptsB) + chainA := testChainForkLightA + chainB := testChainForkLightB + tester.newPeer("original", protocol, chainA) + tester.newPeer("rewriter", protocol, chainB) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("original", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, common+fork+1) + assertOwnChain(t, tester, chainA.len()) // Synchronise with the second peer and ensure that the fork is rejected to being too old if err := tester.sync("rewriter", nil, mode); err != errInvalidAncestor { @@ -893,17 +703,16 @@ func testBoundedHeavyForkedSync(t *testing.T, protocol int, mode SyncMode) { defer tester.terminate() // Create a long enough forked chain - common, fork := 13, int(MaxForkAncestry+17) - hashesA, hashesB, headersA, headersB, blocksA, blocksB, receiptsA, receiptsB := tester.makeChainFork(common+fork, fork, tester.genesis, nil, false) - - tester.newPeer("original", protocol, hashesA, headersA, blocksA, receiptsA) - tester.newPeer("heavy-rewriter", protocol, hashesB[MaxForkAncestry-17:], headersB, blocksB, receiptsB) // Root the fork below the ancestor limit + chainA := testChainForkLightA + chainB := testChainForkHeavy + tester.newPeer("original", protocol, chainA) + tester.newPeer("heavy-rewriter", protocol, chainB) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("original", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, common+fork+1) + assertOwnChain(t, tester, chainA.len()) // Synchronise with the second peer and ensure that the fork is rejected to being too old if err := tester.sync("heavy-rewriter", nil, mode); err != errInvalidAncestor { @@ -924,7 +733,7 @@ func TestInactiveDownloader62(t *testing.T) { t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) } if err := tester.downloader.DeliverBodies("bad peer", [][]*types.Transaction{}, [][]*types.Header{}); err != errNoSyncActive { - t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) + t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) } } @@ -962,17 +771,8 @@ func testCancel(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - // Create a small enough block chain to download and the tester - targetBlocks := blockCacheItems - 15 - if targetBlocks >= MaxHashFetch { - targetBlocks = MaxHashFetch - 15 - } - if targetBlocks >= MaxHeaderFetch { - targetBlocks = MaxHeaderFetch - 15 - } - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) - - tester.newPeer("peer", protocol, hashes, headers, blocks, receipts) + chain := testChainBase.shorten(MaxHeaderFetch) + tester.newPeer("peer", protocol, chain) // Make sure canceling works with a pristine downloader tester.downloader.Cancel() @@ -1005,17 +805,16 @@ func testMultiSynchronisation(t *testing.T, protocol int, mode SyncMode) { // Create various peers with various parts of the chain targetPeers := 8 - targetBlocks := targetPeers*blockCacheItems - 15 - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) + chain := testChainBase.shorten(targetPeers * 100) for i := 0; i < targetPeers; i++ { id := fmt.Sprintf("peer #%d", i) - tester.newPeer(id, protocol, hashes[i*blockCacheItems:], headers, blocks, receipts) + tester.newPeer(id, protocol, chain.shorten(chain.len()/(i+1))) } if err := tester.sync("peer #0", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, targetBlocks+1) + assertOwnChain(t, tester, chain.len()) } // Tests that synchronisations behave well in multi-version protocol environments @@ -1034,24 +833,23 @@ func testMultiProtoSync(t *testing.T, protocol int, mode SyncMode) { defer tester.terminate() // Create a small enough block chain to download - targetBlocks := blockCacheItems - 15 - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) + chain := testChainBase.shorten(blockCacheItems - 15) // Create peers of every type - tester.newPeer("peer 62", 62, hashes, headers, blocks, nil) - tester.newPeer("peer 63", 63, hashes, headers, blocks, receipts) - tester.newPeer("peer 64", 64, hashes, headers, blocks, receipts) + tester.newPeer("peer 62", 62, chain) + tester.newPeer("peer 63", 63, chain) + tester.newPeer("peer 64", 64, chain) // Synchronise with the requested peer and make sure all blocks were retrieved if err := tester.sync(fmt.Sprintf("peer %d", protocol), nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, targetBlocks+1) + assertOwnChain(t, tester, chain.len()) // Check that no peers have been dropped off for _, version := range []int{62, 63, 64} { peer := fmt.Sprintf("peer %d", version) - if _, ok := tester.peerHashes[peer]; !ok { + if _, ok := tester.peers[peer]; !ok { t.Errorf("%s dropped", peer) } } @@ -1073,10 +871,8 @@ func testEmptyShortCircuit(t *testing.T, protocol int, mode SyncMode) { defer tester.terminate() // Create a block chain to download - targetBlocks := 2*blockCacheItems - 15 - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) - - tester.newPeer("peer", protocol, hashes, headers, blocks, receipts) + chain := testChainBase + tester.newPeer("peer", protocol, chain) // Instrument the downloader to signal body requests bodiesHave, receiptsHave := int32(0), int32(0) @@ -1090,16 +886,16 @@ func testEmptyShortCircuit(t *testing.T, protocol int, mode SyncMode) { if err := tester.sync("peer", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, targetBlocks+1) + assertOwnChain(t, tester, chain.len()) // Validate the number of block bodies that should have been requested bodiesNeeded, receiptsNeeded := 0, 0 - for _, block := range blocks { + for _, block := range chain.blockm { if mode != LightSync && block != tester.genesis && (len(block.Transactions()) > 0 || len(block.Uncles()) > 0) { bodiesNeeded++ } } - for _, receipt := range receipts { + for _, receipt := range chain.receiptm { if mode == FastSync && len(receipt) > 0 { receiptsNeeded++ } @@ -1127,24 +923,20 @@ func testMissingHeaderAttack(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - // Create a small enough block chain to download - targetBlocks := blockCacheItems - 15 - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) - - // Attempt a full sync with an attacker feeding gapped headers - tester.newPeer("attack", protocol, hashes, headers, blocks, receipts) - missing := targetBlocks / 2 - delete(tester.peerHeaders["attack"], hashes[missing]) + chain := testChainBase.shorten(blockCacheItems - 15) + brokenChain := chain.shorten(chain.len()) + delete(brokenChain.headerm, brokenChain.chain[brokenChain.len()/2]) + tester.newPeer("attack", protocol, brokenChain) if err := tester.sync("attack", nil, mode); err == nil { t.Fatalf("succeeded attacker synchronisation") } // Synchronise with the valid peer and make sure sync succeeds - tester.newPeer("valid", protocol, hashes, headers, blocks, receipts) + tester.newPeer("valid", protocol, chain) if err := tester.sync("valid", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, targetBlocks+1) + assertOwnChain(t, tester, chain.len()) } // Tests that if requested headers are shifted (i.e. first is missing), the queue @@ -1162,25 +954,24 @@ func testShiftedHeaderAttack(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - // Create a small enough block chain to download - targetBlocks := blockCacheItems - 15 - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) + chain := testChainBase.shorten(blockCacheItems - 15) // Attempt a full sync with an attacker feeding shifted headers - tester.newPeer("attack", protocol, hashes, headers, blocks, receipts) - delete(tester.peerHeaders["attack"], hashes[len(hashes)-2]) - delete(tester.peerBlocks["attack"], hashes[len(hashes)-2]) - delete(tester.peerReceipts["attack"], hashes[len(hashes)-2]) - + brokenChain := chain.shorten(chain.len()) + delete(brokenChain.headerm, brokenChain.chain[1]) + delete(brokenChain.blockm, brokenChain.chain[1]) + delete(brokenChain.receiptm, brokenChain.chain[1]) + tester.newPeer("attack", protocol, brokenChain) if err := tester.sync("attack", nil, mode); err == nil { t.Fatalf("succeeded attacker synchronisation") } + // Synchronise with the valid peer and make sure sync succeeds - tester.newPeer("valid", protocol, hashes, headers, blocks, receipts) + tester.newPeer("valid", protocol, chain) if err := tester.sync("valid", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, targetBlocks+1) + assertOwnChain(t, tester, chain.len()) } // Tests that upon detecting an invalid header, the recent ones are rolled back @@ -1198,13 +989,14 @@ func testInvalidHeaderRollback(t *testing.T, protocol int, mode SyncMode) { // Create a small enough block chain to download targetBlocks := 3*fsHeaderSafetyNet + 256 + fsMinFullBlocks - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) + chain := testChainBase.shorten(targetBlocks) // Attempt to sync with an attacker that feeds junk during the fast sync phase. // This should result in the last fsHeaderSafetyNet headers being rolled back. - tester.newPeer("fast-attack", protocol, hashes, headers, blocks, receipts) missing := fsHeaderSafetyNet + MaxHeaderFetch + 1 - delete(tester.peerHeaders["fast-attack"], hashes[len(hashes)-missing]) + fastAttackChain := chain.shorten(chain.len()) + delete(fastAttackChain.headerm, fastAttackChain.chain[missing]) + tester.newPeer("fast-attack", protocol, fastAttackChain) if err := tester.sync("fast-attack", nil, mode); err == nil { t.Fatalf("succeeded fast attacker synchronisation") @@ -1212,13 +1004,15 @@ func testInvalidHeaderRollback(t *testing.T, protocol int, mode SyncMode) { if head := tester.CurrentHeader().Number.Int64(); int(head) > MaxHeaderFetch { t.Errorf("rollback head mismatch: have %v, want at most %v", head, MaxHeaderFetch) } + // Attempt to sync with an attacker that feeds junk during the block import phase. // This should result in both the last fsHeaderSafetyNet number of headers being // rolled back, and also the pivot point being reverted to a non-block status. - tester.newPeer("block-attack", protocol, hashes, headers, blocks, receipts) missing = 3*fsHeaderSafetyNet + MaxHeaderFetch + 1 - delete(tester.peerHeaders["fast-attack"], hashes[len(hashes)-missing]) // Make sure the fast-attacker doesn't fill in - delete(tester.peerHeaders["block-attack"], hashes[len(hashes)-missing]) + blockAttackChain := chain.shorten(chain.len()) + delete(fastAttackChain.headerm, fastAttackChain.chain[missing]) // Make sure the fast-attacker doesn't fill in + delete(blockAttackChain.headerm, blockAttackChain.chain[missing]) + tester.newPeer("block-attack", protocol, blockAttackChain) if err := tester.sync("block-attack", nil, mode); err == nil { t.Fatalf("succeeded block attacker synchronisation") @@ -1231,19 +1025,18 @@ func testInvalidHeaderRollback(t *testing.T, protocol int, mode SyncMode) { t.Errorf("fast sync pivot block #%d not rolled back", head) } } + // Attempt to sync with an attacker that withholds promised blocks after the // fast sync pivot point. This could be a trial to leave the node with a bad // but already imported pivot block. - tester.newPeer("withhold-attack", protocol, hashes, headers, blocks, receipts) - missing = 3*fsHeaderSafetyNet + MaxHeaderFetch + 1 - + withholdAttackChain := chain.shorten(chain.len()) + tester.newPeer("withhold-attack", protocol, withholdAttackChain) tester.downloader.syncInitHook = func(uint64, uint64) { - for i := missing; i <= len(hashes); i++ { - delete(tester.peerHeaders["withhold-attack"], hashes[len(hashes)-i]) + for i := missing; i < withholdAttackChain.len(); i++ { + delete(withholdAttackChain.headerm, withholdAttackChain.chain[i]) } tester.downloader.syncInitHook = nil } - if err := tester.sync("withhold-attack", nil, mode); err == nil { t.Fatalf("succeeded withholding attacker synchronisation") } @@ -1255,20 +1048,21 @@ func testInvalidHeaderRollback(t *testing.T, protocol int, mode SyncMode) { t.Errorf("fast sync pivot block #%d not rolled back", head) } } - // Synchronise with the valid peer and make sure sync succeeds. Since the last - // rollback should also disable fast syncing for this process, verify that we - // did a fresh full sync. Note, we can't assert anything about the receipts - // since we won't purge the database of them, hence we can't use assertOwnChain. - tester.newPeer("valid", protocol, hashes, headers, blocks, receipts) + + // synchronise with the valid peer and make sure sync succeeds. Since the last rollback + // should also disable fast syncing for this process, verify that we did a fresh full + // sync. Note, we can't assert anything about the receipts since we won't purge the + // database of them, hence we can't use assertOwnChain. + tester.newPeer("valid", protocol, chain) if err := tester.sync("valid", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - if hs := len(tester.ownHeaders); hs != len(headers) { - t.Fatalf("synchronised headers mismatch: have %v, want %v", hs, len(headers)) + if hs := len(tester.ownHeaders); hs != chain.len() { + t.Fatalf("synchronised headers mismatch: have %v, want %v", hs, chain.len()) } if mode != LightSync { - if bs := len(tester.ownBlocks); bs != len(blocks) { - t.Fatalf("synchronised blocks mismatch: have %v, want %v", bs, len(blocks)) + if bs := len(tester.ownBlocks); bs != chain.len() { + t.Fatalf("synchronised blocks mismatch: have %v, want %v", bs, chain.len()) } } } @@ -1288,9 +1082,8 @@ func testHighTDStarvationAttack(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - hashes, headers, blocks, receipts := tester.makeChain(0, 0, tester.genesis, nil, false) - tester.newPeer("attack", protocol, []common.Hash{hashes[0]}, headers, blocks, receipts) - + chain := testChainBase.shorten(1) + tester.newPeer("attack", protocol, chain) if err := tester.sync("attack", big.NewInt(1000000), mode); err != errStallingPeer { t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errStallingPeer) } @@ -1314,40 +1107,36 @@ func testBlockHeaderAttackerDropping(t *testing.T, protocol int) { {errUnknownPeer, false}, // Peer is unknown, was already dropped, don't double drop {errBadPeer, true}, // Peer was deemed bad for some reason, drop it {errStallingPeer, true}, // Peer was detected to be stalling, drop it + {errUnsyncedPeer, true}, // Peer was detected to be unsynced, drop it {errNoPeers, false}, // No peers to download from, soft race, no issue {errTimeout, true}, // No hashes received in due time, drop the peer {errEmptyHeaderSet, true}, // No headers were returned as a response, drop as it's a dead end {errPeersUnavailable, true}, // Nobody had the advertised blocks, drop the advertiser {errInvalidAncestor, true}, // Agreed upon ancestor is not acceptable, drop the chain rewriter {errInvalidChain, true}, // Hash chain was detected as invalid, definitely drop - {errInvalidBlock, false}, // A bad peer was detected, but not the sync origin {errInvalidBody, false}, // A bad peer was detected, but not the sync origin {errInvalidReceipt, false}, // A bad peer was detected, but not the sync origin - {errCancelBlockFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop - {errCancelHeaderFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop - {errCancelBodyFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop - {errCancelReceiptFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop - {errCancelHeaderProcessing, false}, // Synchronisation was canceled, origin may be innocent, don't drop {errCancelContentProcessing, false}, // Synchronisation was canceled, origin may be innocent, don't drop } // Run the tests and check disconnection status tester := newTester() defer tester.terminate() + chain := testChainBase.shorten(1) for i, tt := range tests { // Register a new peer and ensure it's presence id := fmt.Sprintf("test %d", i) - if err := tester.newPeer(id, protocol, []common.Hash{tester.genesis.Hash()}, nil, nil, nil); err != nil { + if err := tester.newPeer(id, protocol, chain); err != nil { t.Fatalf("test %d: failed to register new peer: %v", i, err) } - if _, ok := tester.peerHashes[id]; !ok { + if _, ok := tester.peers[id]; !ok { t.Fatalf("test %d: registered peer not found", i) } // Simulate a synchronisation and check the required result tester.downloader.synchroniseMock = func(string, common.Hash) error { return tt.result } tester.downloader.Synchronise(id, tester.genesis.Hash(), big.NewInt(1000), FullSync) - if _, ok := tester.peerHashes[id]; !ok != tt.drop { + if _, ok := tester.peers[id]; !ok != tt.drop { t.Errorf("test %d: peer drop mismatch for %v: have %v, want %v", i, tt.result, !ok, tt.drop) } } @@ -1367,10 +1156,7 @@ func testSyncProgress(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - - // Create a small enough block chain to download - targetBlocks := blockCacheItems - 15 - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) + chain := testChainBase.shorten(blockCacheItems - 15) // Set a sync init hook to catch progress changes starting := make(chan struct{}) @@ -1380,12 +1166,10 @@ func testSyncProgress(t *testing.T, protocol int, mode SyncMode) { starting <- struct{}{} <-progress } - // Retrieve the sync progress and ensure they are zero (pristine sync) - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock != 0 || progress.HighestBlock != 0 { - t.Fatalf("Pristine progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, 0, 0) - } + checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) + // Synchronise half the blocks and check initial progress - tester.newPeer("peer-half", protocol, hashes[targetBlocks/2:], headers, blocks, receipts) + tester.newPeer("peer-half", protocol, chain.shorten(chain.len()/2)) pending := new(sync.WaitGroup) pending.Add(1) @@ -1396,16 +1180,15 @@ func testSyncProgress(t *testing.T, protocol int, mode SyncMode) { } }() <-starting - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock != 0 || progress.HighestBlock != uint64(targetBlocks/2+1) { - t.Fatalf("Initial progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, 0, targetBlocks/2+1) - } + checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ + HighestBlock: uint64(chain.len()/2 - 1), + }) progress <- struct{}{} pending.Wait() // Synchronise all the blocks and check continuation progress - tester.newPeer("peer-full", protocol, hashes, headers, blocks, receipts) + tester.newPeer("peer-full", protocol, chain) pending.Add(1) - go func() { defer pending.Done() if err := tester.sync("peer-full", nil, mode); err != nil { @@ -1413,15 +1196,31 @@ func testSyncProgress(t *testing.T, protocol int, mode SyncMode) { } }() <-starting - if progress := tester.downloader.Progress(); progress.StartingBlock != uint64(targetBlocks/2+1) || progress.CurrentBlock != uint64(targetBlocks/2+1) || progress.HighestBlock != uint64(targetBlocks) { - t.Fatalf("Completing progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, targetBlocks/2+1, targetBlocks/2+1, targetBlocks) - } + checkProgress(t, tester.downloader, "completing", ethereum.SyncProgress{ + StartingBlock: uint64(chain.len()/2 - 1), + CurrentBlock: uint64(chain.len()/2 - 1), + HighestBlock: uint64(chain.len() - 1), + }) + + // Check final progress after successful sync progress <- struct{}{} pending.Wait() + checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ + StartingBlock: uint64(chain.len()/2 - 1), + CurrentBlock: uint64(chain.len() - 1), + HighestBlock: uint64(chain.len() - 1), + }) +} - // Check final progress after successful sync - if progress := tester.downloader.Progress(); progress.StartingBlock != uint64(targetBlocks/2+1) || progress.CurrentBlock != uint64(targetBlocks) || progress.HighestBlock != uint64(targetBlocks) { - t.Fatalf("Final progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, targetBlocks/2+1, targetBlocks, targetBlocks) +func checkProgress(t *testing.T, d *Downloader, stage string, want ethereum.SyncProgress) { + // Mark this method as a helper to report errors at callsite, not in here + t.Helper() + + p := d.Progress() + p.KnownStates, p.PulledStates = 0, 0 + want.KnownStates, want.PulledStates = 0, 0 + if p != want { + t.Fatalf("%s progress mismatch:\nhave %+v\nwant %+v", stage, p, want) } } @@ -1440,10 +1239,8 @@ func testForkedSyncProgress(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - - // Create a forked chain to simulate origin revertal - common, fork := MaxHashFetch, 2*MaxHashFetch - hashesA, hashesB, headersA, headersB, blocksA, blocksB, receiptsA, receiptsB := tester.makeChainFork(common+fork, fork, tester.genesis, nil, true) + chainA := testChainForkLightA.shorten(testChainBase.len() + MaxHashFetch) + chainB := testChainForkLightB.shorten(testChainBase.len() + MaxHashFetch) // Set a sync init hook to catch progress changes starting := make(chan struct{}) @@ -1453,15 +1250,12 @@ func testForkedSyncProgress(t *testing.T, protocol int, mode SyncMode) { starting <- struct{}{} <-progress } - // Retrieve the sync progress and ensure they are zero (pristine sync) - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock != 0 || progress.HighestBlock != 0 { - t.Fatalf("Pristine progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, 0, 0) - } + checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) + // Synchronise with one of the forks and check progress - tester.newPeer("fork A", protocol, hashesA, headersA, blocksA, receiptsA) + tester.newPeer("fork A", protocol, chainA) pending := new(sync.WaitGroup) pending.Add(1) - go func() { defer pending.Done() if err := tester.sync("fork A", nil, mode); err != nil { @@ -1469,9 +1263,10 @@ func testForkedSyncProgress(t *testing.T, protocol int, mode SyncMode) { } }() <-starting - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock != 0 || progress.HighestBlock != uint64(len(hashesA)-1) { - t.Fatalf("Initial progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, 0, len(hashesA)-1) - } + + checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ + HighestBlock: uint64(chainA.len() - 1), + }) progress <- struct{}{} pending.Wait() @@ -1479,9 +1274,8 @@ func testForkedSyncProgress(t *testing.T, protocol int, mode SyncMode) { tester.downloader.syncStatsChainOrigin = tester.downloader.syncStatsChainHeight // Synchronise with the second fork and check progress resets - tester.newPeer("fork B", protocol, hashesB, headersB, blocksB, receiptsB) + tester.newPeer("fork B", protocol, chainB) pending.Add(1) - go func() { defer pending.Done() if err := tester.sync("fork B", nil, mode); err != nil { @@ -1489,16 +1283,20 @@ func testForkedSyncProgress(t *testing.T, protocol int, mode SyncMode) { } }() <-starting - if progress := tester.downloader.Progress(); progress.StartingBlock != uint64(common) || progress.CurrentBlock != uint64(len(hashesA)-1) || progress.HighestBlock != uint64(len(hashesB)-1) { - t.Fatalf("Forking progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, common, len(hashesA)-1, len(hashesB)-1) - } - progress <- struct{}{} - pending.Wait() + checkProgress(t, tester.downloader, "forking", ethereum.SyncProgress{ + StartingBlock: uint64(testChainBase.len()) - 1, + CurrentBlock: uint64(chainA.len() - 1), + HighestBlock: uint64(chainB.len() - 1), + }) // Check final progress after successful sync - if progress := tester.downloader.Progress(); progress.StartingBlock != uint64(common) || progress.CurrentBlock != uint64(len(hashesB)-1) || progress.HighestBlock != uint64(len(hashesB)-1) { - t.Fatalf("Final progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, common, len(hashesB)-1, len(hashesB)-1) - } + progress <- struct{}{} + pending.Wait() + checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ + StartingBlock: uint64(testChainBase.len()) - 1, + CurrentBlock: uint64(chainB.len() - 1), + HighestBlock: uint64(chainB.len() - 1), + }) } // Tests that if synchronisation is aborted due to some failure, then the progress @@ -1516,10 +1314,7 @@ func testFailedSyncProgress(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - - // Create a small enough block chain to download - targetBlocks := blockCacheItems - 15 - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false) + chain := testChainBase.shorten(blockCacheItems - 15) // Set a sync init hook to catch progress changes starting := make(chan struct{}) @@ -1529,20 +1324,18 @@ func testFailedSyncProgress(t *testing.T, protocol int, mode SyncMode) { starting <- struct{}{} <-progress } - // Retrieve the sync progress and ensure they are zero (pristine sync) - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock != 0 || progress.HighestBlock != 0 { - t.Fatalf("Pristine progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, 0, 0) - } + checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) + // Attempt a full sync with a faulty peer - tester.newPeer("faulty", protocol, hashes, headers, blocks, receipts) - missing := targetBlocks / 2 - delete(tester.peerHeaders["faulty"], hashes[missing]) - delete(tester.peerBlocks["faulty"], hashes[missing]) - delete(tester.peerReceipts["faulty"], hashes[missing]) + brokenChain := chain.shorten(chain.len()) + missing := brokenChain.len() / 2 + delete(brokenChain.headerm, brokenChain.chain[missing]) + delete(brokenChain.blockm, brokenChain.chain[missing]) + delete(brokenChain.receiptm, brokenChain.chain[missing]) + tester.newPeer("faulty", protocol, brokenChain) pending := new(sync.WaitGroup) pending.Add(1) - go func() { defer pending.Done() if err := tester.sync("faulty", nil, mode); err == nil { @@ -1550,16 +1343,17 @@ func testFailedSyncProgress(t *testing.T, protocol int, mode SyncMode) { } }() <-starting - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock != 0 || progress.HighestBlock != uint64(targetBlocks) { - t.Fatalf("Initial progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, 0, targetBlocks) - } + checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ + HighestBlock: uint64(brokenChain.len() - 1), + }) progress <- struct{}{} pending.Wait() + afterFailedSync := tester.downloader.Progress() - // Synchronise with a good peer and check that the progress origin remind the same after a failure - tester.newPeer("valid", protocol, hashes, headers, blocks, receipts) + // Synchronise with a good peer and check that the progress origin remind the same + // after a failure + tester.newPeer("valid", protocol, chain) pending.Add(1) - go func() { defer pending.Done() if err := tester.sync("valid", nil, mode); err != nil { @@ -1567,16 +1361,15 @@ func testFailedSyncProgress(t *testing.T, protocol int, mode SyncMode) { } }() <-starting - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock > uint64(targetBlocks/2) || progress.HighestBlock != uint64(targetBlocks) { - t.Fatalf("Completing progress mismatch: have %v/%v/%v, want %v/0-%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, targetBlocks/2, targetBlocks) - } - progress <- struct{}{} - pending.Wait() + checkProgress(t, tester.downloader, "completing", afterFailedSync) // Check final progress after successful sync - if progress := tester.downloader.Progress(); progress.StartingBlock > uint64(targetBlocks/2) || progress.CurrentBlock != uint64(targetBlocks) || progress.HighestBlock != uint64(targetBlocks) { - t.Fatalf("Final progress mismatch: have %v/%v/%v, want 0-%v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, targetBlocks/2, targetBlocks, targetBlocks) - } + progress <- struct{}{} + pending.Wait() + checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ + CurrentBlock: uint64(chain.len() - 1), + HighestBlock: uint64(chain.len() - 1), + }) } // Tests that if an attacker fakes a chain height, after the attack is detected, @@ -1593,34 +1386,27 @@ func testFakedSyncProgress(t *testing.T, protocol int, mode SyncMode) { tester := newTester() defer tester.terminate() - - // Create a small block chain - targetBlocks := blockCacheItems - 15 - hashes, headers, blocks, receipts := tester.makeChain(targetBlocks+3, 0, tester.genesis, nil, false) + chain := testChainBase.shorten(blockCacheItems - 15) // Set a sync init hook to catch progress changes starting := make(chan struct{}) progress := make(chan struct{}) - tester.downloader.syncInitHook = func(origin, latest uint64) { starting <- struct{}{} <-progress } - // Retrieve the sync progress and ensure they are zero (pristine sync) - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock != 0 || progress.HighestBlock != 0 { - t.Fatalf("Pristine progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, 0, 0) - } - // Create and sync with an attacker that promises a higher chain than available - tester.newPeer("attack", protocol, hashes, headers, blocks, receipts) - for i := 1; i < 3; i++ { - delete(tester.peerHeaders["attack"], hashes[i]) - delete(tester.peerBlocks["attack"], hashes[i]) - delete(tester.peerReceipts["attack"], hashes[i]) + checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) + + // Create and sync with an attacker that promises a higher chain than available. + brokenChain := chain.shorten(chain.len()) + numMissing := 5 + for i := brokenChain.len() - 2; i > brokenChain.len()-numMissing; i-- { + delete(brokenChain.headerm, brokenChain.chain[i]) } + tester.newPeer("attack", protocol, brokenChain) pending := new(sync.WaitGroup) pending.Add(1) - go func() { defer pending.Done() if err := tester.sync("attack", nil, mode); err == nil { @@ -1628,14 +1414,17 @@ func testFakedSyncProgress(t *testing.T, protocol int, mode SyncMode) { } }() <-starting - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock != 0 || progress.HighestBlock != uint64(targetBlocks+3) { - t.Fatalf("Initial progress mismatch: have %v/%v/%v, want %v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, 0, targetBlocks+3) - } + checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ + HighestBlock: uint64(brokenChain.len() - 1), + }) progress <- struct{}{} pending.Wait() + afterFailedSync := tester.downloader.Progress() - // Synchronise with a good peer and check that the progress height has been reduced to the true value - tester.newPeer("valid", protocol, hashes[3:], headers, blocks, receipts) + // Synchronise with a good peer and check that the progress height has been reduced to + // the true value. + validChain := chain.shorten(chain.len() - numMissing) + tester.newPeer("valid", protocol, validChain) pending.Add(1) go func() { @@ -1645,23 +1434,25 @@ func testFakedSyncProgress(t *testing.T, protocol int, mode SyncMode) { } }() <-starting - if progress := tester.downloader.Progress(); progress.StartingBlock != 0 || progress.CurrentBlock > uint64(targetBlocks) || progress.HighestBlock != uint64(targetBlocks) { - t.Fatalf("Completing progress mismatch: have %v/%v/%v, want %v/0-%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, 0, targetBlocks, targetBlocks) - } + checkProgress(t, tester.downloader, "completing", ethereum.SyncProgress{ + CurrentBlock: afterFailedSync.CurrentBlock, + HighestBlock: uint64(validChain.len() - 1), + }) + + // Check final progress after successful sync. progress <- struct{}{} pending.Wait() - - // Check final progress after successful sync - if progress := tester.downloader.Progress(); progress.StartingBlock > uint64(targetBlocks) || progress.CurrentBlock != uint64(targetBlocks) || progress.HighestBlock != uint64(targetBlocks) { - t.Fatalf("Final progress mismatch: have %v/%v/%v, want 0-%v/%v/%v", progress.StartingBlock, progress.CurrentBlock, progress.HighestBlock, targetBlocks, targetBlocks, targetBlocks) - } + checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ + CurrentBlock: uint64(validChain.len() - 1), + HighestBlock: uint64(validChain.len() - 1), + }) } // This test reproduces an issue where unexpected deliveries would // block indefinitely if they arrived at the right time. -// We use data driven subtests to manage this so that it will be parallel on its own -// and not with the other tests, avoiding intermittent failures. func TestDeliverHeadersHang(t *testing.T) { + t.Parallel() + testCases := []struct { protocol int syncMode SyncMode @@ -1675,15 +1466,38 @@ func TestDeliverHeadersHang(t *testing.T) { } for _, tc := range testCases { t.Run(fmt.Sprintf("protocol %d mode %v", tc.protocol, tc.syncMode), func(t *testing.T) { + t.Parallel() testDeliverHeadersHang(t, tc.protocol, tc.syncMode) }) } } +func testDeliverHeadersHang(t *testing.T, protocol int, mode SyncMode) { + master := newTester() + defer master.terminate() + chain := testChainBase.shorten(15) + + for i := 0; i < 200; i++ { + tester := newTester() + tester.peerDb = master.peerDb + tester.newPeer("peer", protocol, chain) + + // Whenever the downloader requests headers, flood it with + // a lot of unrequested header deliveries. + tester.downloader.peers.peers["peer"].peer = &floodingTestPeer{ + peer: tester.downloader.peers.peers["peer"].peer, + tester: tester, + } + if err := tester.sync("peer", nil, mode); err != nil { + t.Errorf("test %d: sync failed: %v", i, err) + } + tester.terminate() + } +} + type floodingTestPeer struct { peer Peer tester *downloadTester - pend sync.WaitGroup } func (ftp *floodingTestPeer) Head() (common.Hash, *big.Int) { return ftp.peer.Head() } @@ -1702,23 +1516,29 @@ func (ftp *floodingTestPeer) RequestNodeData(hashes []common.Hash) error { func (ftp *floodingTestPeer) RequestHeadersByNumber(from uint64, count, skip int, reverse bool) error { deliveriesDone := make(chan struct{}, 500) - for i := 0; i < cap(deliveriesDone); i++ { + for i := 0; i < cap(deliveriesDone)-1; i++ { peer := fmt.Sprintf("fake-peer%d", i) - ftp.pend.Add(1) - go func() { ftp.tester.downloader.DeliverHeaders(peer, []*types.Header{{}, {}, {}, {}}) deliveriesDone <- struct{}{} - ftp.pend.Done() }() } - // Deliver the actual requested headers. - go ftp.peer.RequestHeadersByNumber(from, count, skip, reverse) + // None of the extra deliveries should block. timeout := time.After(60 * time.Second) + launched := false for i := 0; i < cap(deliveriesDone); i++ { select { case <-deliveriesDone: + if !launched { + // Start delivering the requested headers + // after one of the flooding responses has arrived. + go func() { + ftp.peer.RequestHeadersByNumber(from, count, skip, reverse) + deliveriesDone <- struct{}{} + }() + launched = true + } case <-timeout: panic("blocked") } @@ -1726,30 +1546,113 @@ func (ftp *floodingTestPeer) RequestHeadersByNumber(from uint64, count, skip int return nil } -func testDeliverHeadersHang(t *testing.T, protocol int, mode SyncMode) { +func TestRemoteHeaderRequestSpan(t *testing.T) { + testCases := []struct { + remoteHeight uint64 + localHeight uint64 + expected []int + }{ + // Remote is way higher. We should ask for the remote head and go backwards + {1500, 1000, + []int{1323, 1339, 1355, 1371, 1387, 1403, 1419, 1435, 1451, 1467, 1483, 1499}, + }, + {15000, 13006, + []int{14823, 14839, 14855, 14871, 14887, 14903, 14919, 14935, 14951, 14967, 14983, 14999}, + }, + //Remote is pretty close to us. We don't have to fetch as many + {1200, 1150, + []int{1149, 1154, 1159, 1164, 1169, 1174, 1179, 1184, 1189, 1194, 1199}, + }, + // Remote is equal to us (so on a fork with higher td) + // We should get the closest couple of ancestors + {1500, 1500, + []int{1497, 1499}, + }, + // We're higher than the remote! Odd + {1000, 1500, + []int{997, 999}, + }, + // Check some weird edgecases that it behaves somewhat rationally + {0, 1500, + []int{0, 2}, + }, + {6000000, 0, + []int{5999823, 5999839, 5999855, 5999871, 5999887, 5999903, 5999919, 5999935, 5999951, 5999967, 5999983, 5999999}, + }, + {0, 0, + []int{0, 2}, + }, + } + reqs := func(from, count, span int) []int { + var r []int + num := from + for len(r) < count { + r = append(r, num) + num += span + 1 + } + return r + } + for i, tt := range testCases { + from, count, span, max := calculateRequestSpan(tt.remoteHeight, tt.localHeight) + data := reqs(int(from), count, span) + + if max != uint64(data[len(data)-1]) { + t.Errorf("test %d: wrong last value %d != %d", i, data[len(data)-1], max) + } + failed := false + if len(data) != len(tt.expected) { + failed = true + t.Errorf("test %d: length wrong, expected %d got %d", i, len(tt.expected), len(data)) + } else { + for j, n := range data { + if n != tt.expected[j] { + failed = true + break + } + } + } + if failed { + res := strings.Replace(fmt.Sprint(data), " ", ",", -1) + exp := strings.Replace(fmt.Sprint(tt.expected), " ", ",", -1) + t.Logf("got: %v\n", res) + t.Logf("exp: %v\n", exp) + t.Errorf("test %d: wrong values", i) + } + } +} + +// Tests that peers below a pre-configured checkpoint block are prevented from +// being fast-synced from, avoiding potential cheap eclipse attacks. +func TestCheckpointEnforcement62(t *testing.T) { testCheckpointEnforcement(t, 62, FullSync) } +func TestCheckpointEnforcement63Full(t *testing.T) { testCheckpointEnforcement(t, 63, FullSync) } +func TestCheckpointEnforcement63Fast(t *testing.T) { testCheckpointEnforcement(t, 63, FastSync) } +func TestCheckpointEnforcement64Full(t *testing.T) { testCheckpointEnforcement(t, 64, FullSync) } +func TestCheckpointEnforcement64Fast(t *testing.T) { testCheckpointEnforcement(t, 64, FastSync) } +func TestCheckpointEnforcement64Light(t *testing.T) { testCheckpointEnforcement(t, 64, LightSync) } + +func testCheckpointEnforcement(t *testing.T, protocol int, mode SyncMode) { t.Parallel() - master := newTester() - defer master.terminate() + // Create a new tester with a particular hard coded checkpoint block + tester := newTester() + defer tester.terminate() - hashes, headers, blocks, receipts := master.makeChain(5, 0, master.genesis, nil, false) - for i := 0; i < 200; i++ { - tester := newTester() - tester.peerDb = master.peerDb + tester.downloader.checkpoint = uint64(fsMinFullBlocks) + 256 + chain := testChainBase.shorten(int(tester.downloader.checkpoint) - 1) - tester.newPeer("peer", protocol, hashes, headers, blocks, receipts) - // Whenever the downloader requests headers, flood it with - // a lot of unrequested header deliveries. - tester.downloader.peers.peers["peer"].peer = &floodingTestPeer{ - peer: tester.downloader.peers.peers["peer"].peer, - tester: tester, - } - if err := tester.sync("peer", nil, mode); err != nil { - t.Errorf("test %d: sync failed: %v", i, err) - } - tester.terminate() + // Attempt to sync with the peer and validate the result + tester.newPeer("peer", protocol, chain) - // Flush all goroutines to prevent messing with subsequent tests - tester.downloader.peers.peers["peer"].peer.(*floodingTestPeer).pend.Wait() + var expect error + if mode == FastSync || mode == LightSync { + expect = errUnsyncedPeer + } + if err := tester.sync("peer", nil, mode); err != expect { + t.Fatalf("block sync error mismatch: have %v, want %v", err, expect) + } + if mode == FastSync || mode == LightSync { + assertOwnChain(t, tester, 1) + } else { + assertOwnChain(t, tester, chain.len()) } } diff --git a/eth/downloader/events.go b/eth/downloader/events.go index 64905b8f2ac7..25255a3a72e5 100644 --- a/eth/downloader/events.go +++ b/eth/downloader/events.go @@ -16,6 +16,10 @@ package downloader -type DoneEvent struct{} +import "github.com/ethereum/go-ethereum/core/types" + +type DoneEvent struct { + Latest *types.Header +} type StartEvent struct{} type FailedEvent struct{ Err error } diff --git a/eth/downloader/fakepeer.go b/eth/downloader/fakepeer.go index 59832facaaa3..3ec90bc9ef08 100644 --- a/eth/downloader/fakepeer.go +++ b/eth/downloader/fakepeer.go @@ -141,7 +141,7 @@ func (p *FakePeer) RequestBodies(hashes []common.Hash) error { func (p *FakePeer) RequestReceipts(hashes []common.Hash) error { var receipts [][]*types.Receipt for _, hash := range hashes { - receipts = append(receipts, rawdb.ReadReceipts(p.db, hash, *p.hc.GetBlockNumber(hash))) + receipts = append(receipts, rawdb.ReadRawReceipts(p.db, hash, *p.hc.GetBlockNumber(hash))) } p.dl.DeliverReceipts(p.id, receipts) return nil diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index 428a60f8a109..60f86d0e14cf 100644 --- a/eth/downloader/peer.go +++ b/eth/downloader/peer.go @@ -229,13 +229,6 @@ func (p *peerConnection) SetHeadersIdle(delivered int) { p.setIdle(p.headerStarted, delivered, &p.headerThroughput, &p.headerIdle) } -// SetBlocksIdle sets the peer to idle, allowing it to execute new block retrieval -// requests. Its estimated block retrieval throughput is updated with that measured -// just now. -func (p *peerConnection) SetBlocksIdle(delivered int) { - p.setIdle(p.blockStarted, delivered, &p.blockThroughput, &p.blockIdle) -} - // SetBodiesIdle sets the peer to idle, allowing it to execute block body retrieval // requests. Its estimated body retrieval throughput is updated with that measured // just now. diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go index a0e8a6d48c2d..7c339538110a 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -143,7 +143,7 @@ func (q *queue) Reset() { q.resultOffset = 0 } -// Close marks the end of the sync, unblocking WaitResults. +// Close marks the end of the sync, unblocking Results. // It may be called even if the queue is already closed. func (q *queue) Close() { q.lock.Lock() @@ -325,7 +325,7 @@ func (q *queue) Schedule(headers []*types.Header, from uint64) []*types.Header { } // Make sure no duplicate requests are executed if _, ok := q.blockTaskPool[hash]; ok { - log.Warn("Header already scheduled for block fetch", "number", header.Number, "hash", hash) + log.Warn("Header already scheduled for block fetch", "number", header.Number, "hash", hash) continue } if _, ok := q.receiptTaskPool[hash]; ok { @@ -545,7 +545,7 @@ func (q *queue) reserveHeaders(p *peerConnection, count int, taskPool map[common taskQueue.Push(header, -int64(header.Number.Uint64())) } if progress { - // Wake WaitResults, resultCache was modified + // Wake Results, resultCache was modified q.active.Signal() } // Assemble and return the block download request @@ -664,12 +664,11 @@ func (q *queue) expire(timeout time.Duration, pendPool map[string]*fetchRequest, } // Add the peer to the expiry report along the number of failed requests expiries[id] = len(request.Headers) + + // Remove the expired requests from the pending pool directly + delete(pendPool, id) } } - // Remove the expired requests from the pending pool - for id := range expiries { - delete(pendPool, id) - } return expiries } @@ -857,7 +856,7 @@ func (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header, taskQ taskQueue.Push(header, -int64(header.Number.Uint64())) } } - // Wake up WaitResults + // Wake up Results if accepted > 0 { q.active.Signal() } diff --git a/eth/downloader/statesync.go b/eth/downloader/statesync.go index 8d33dfec74e7..b422557d58c8 100644 --- a/eth/downloader/statesync.go +++ b/eth/downloader/statesync.go @@ -25,10 +25,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/trie" + "golang.org/x/crypto/sha3" ) // stateReq represents a batch of state fetch requests grouped together into @@ -59,6 +59,7 @@ type stateSyncStats struct { // syncState starts downloading state with the given root hash. func (d *Downloader) syncState(root common.Hash) *stateSync { + // Create the state sync s := newStateSync(d, root) select { case d.stateSyncStart <- s: @@ -152,7 +153,7 @@ func (d *Downloader) runStateSync(s *stateSync) *stateSync { finished = append(finished, req) delete(active, pack.PeerId()) - // Handle dropped peer connections: + // Handle dropped peer connections: case p := <-peerDrop: // Skip if no request is currently pending req := active[p.id] @@ -239,8 +240,8 @@ type stateTask struct { func newStateSync(d *Downloader, root common.Hash) *stateSync { return &stateSync{ d: d, - sched: state.NewStateSync(root, d.stateDB), - keccak: sha3.NewKeccak256(), + sched: state.NewStateSync(root, d.stateDB, d.stateBloom), + keccak: sha3.NewLegacyKeccak256(), tasks: make(map[common.Hash]*stateTask), deliver: make(chan *stateReq), cancel: make(chan struct{}), @@ -301,7 +302,7 @@ func (s *stateSync) loop() (err error) { return errCancelStateFetch case <-s.d.cancelCh: - return errCancelStateFetch + return errCanceled case req := <-s.deliver: // Response, disconnect or timeout triggered, drop the peer if stalling @@ -310,14 +311,31 @@ func (s *stateSync) loop() (err error) { // 2 items are the minimum requested, if even that times out, we've no use of // this peer at the moment. log.Warn("Stalling state sync, dropping peer", "peer", req.peer.id) - s.d.dropPeer(req.peer.id) + if s.d.dropPeer == nil { + // The dropPeer method is nil when `--copydb` is used for a local copy. + // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored + req.peer.log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", req.peer.id) + } else { + s.d.dropPeer(req.peer.id) + + // If this peer was the master peer, abort sync immediately + s.d.cancelLock.RLock() + master := req.peer.id == s.d.cancelPeer + s.d.cancelLock.RUnlock() + + if master { + s.d.cancel() + return errTimeout + } + } } // Process all the received blobs and check for stale delivery - if err = s.process(req); err != nil { + delivered, err := s.process(req) + if err != nil { log.Warn("Node data write error", "err", err) return err } - req.peer.SetNodeDataIdle(len(req.response)) + req.peer.SetNodeDataIdle(delivered) } } return nil @@ -397,10 +415,11 @@ func (s *stateSync) fillTasks(n int, req *stateReq) { // process iterates over a batch of delivered state data, injecting each item // into a running state sync, re-queuing any items that were requested but not -// delivered. -func (s *stateSync) process(req *stateReq) error { +// delivered. Returns whether the peer actually managed to deliver anything of +// value, and any error that occurred. +func (s *stateSync) process(req *stateReq) (int, error) { // Collect processing stats and update progress if valid data was received - duplicate, unexpected := 0, 0 + duplicate, unexpected, successful := 0, 0, 0 defer func(start time.Time) { if duplicate > 0 || unexpected > 0 { @@ -409,25 +428,21 @@ func (s *stateSync) process(req *stateReq) error { }(time.Now()) // Iterate over all the delivered data and inject one-by-one into the trie - progress := false - for _, blob := range req.response { - prog, hash, err := s.processNodeData(blob) + _, hash, err := s.processNodeData(blob) switch err { case nil: s.numUncommitted++ s.bytesUncommitted += len(blob) - progress = progress || prog + successful++ case trie.ErrNotRequested: unexpected++ case trie.ErrAlreadyProcessed: duplicate++ default: - return fmt.Errorf("invalid state node %s: %v", hash.TerminalString(), err) - } - if _, ok := req.tasks[hash]; ok { - delete(req.tasks, hash) + return successful, fmt.Errorf("invalid state node %s: %v", hash.TerminalString(), err) } + delete(req.tasks, hash) } // Put unfulfilled tasks back into the retry queue npeers := s.d.peers.Len() @@ -441,12 +456,12 @@ func (s *stateSync) process(req *stateReq) error { // If we've requested the node too many times already, it may be a malicious // sync where nobody has the right data. Abort. if len(task.attempts) >= npeers { - return fmt.Errorf("state node %s failed with all peers (%d tries, %d peers)", hash.TerminalString(), len(task.attempts), npeers) + return successful, fmt.Errorf("state node %s failed with all peers (%d tries, %d peers)", hash.TerminalString(), len(task.attempts), npeers) } // Missing item, place into the retry queue. s.tasks[hash] = task } - return nil + return successful, nil } // processNodeData tries to inject a trie node data blob delivered from a remote diff --git a/eth/downloader/testchain_test.go b/eth/downloader/testchain_test.go new file mode 100644 index 000000000000..f410152f5b00 --- /dev/null +++ b/eth/downloader/testchain_test.go @@ -0,0 +1,221 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package downloader + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" +) + +// Test chain parameters. +var ( + testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + testAddress = crypto.PubkeyToAddress(testKey.PublicKey) + testDB = rawdb.NewMemoryDatabase() + testGenesis = core.GenesisBlockForTesting(testDB, testAddress, big.NewInt(1000000000)) +) + +// The common prefix of all test chains: +var testChainBase = newTestChain(blockCacheItems+200, testGenesis) + +// Different forks on top of the base chain: +var testChainForkLightA, testChainForkLightB, testChainForkHeavy *testChain + +func init() { + var forkLen = int(maxForkAncestry + 50) + var wg sync.WaitGroup + wg.Add(3) + go func() { testChainForkLightA = testChainBase.makeFork(forkLen, false, 1); wg.Done() }() + go func() { testChainForkLightB = testChainBase.makeFork(forkLen, false, 2); wg.Done() }() + go func() { testChainForkHeavy = testChainBase.makeFork(forkLen, true, 3); wg.Done() }() + wg.Wait() +} + +type testChain struct { + genesis *types.Block + chain []common.Hash + headerm map[common.Hash]*types.Header + blockm map[common.Hash]*types.Block + receiptm map[common.Hash][]*types.Receipt + tdm map[common.Hash]*big.Int +} + +// newTestChain creates a blockchain of the given length. +func newTestChain(length int, genesis *types.Block) *testChain { + tc := new(testChain).copy(length) + tc.genesis = genesis + tc.chain = append(tc.chain, genesis.Hash()) + tc.headerm[tc.genesis.Hash()] = tc.genesis.Header() + tc.tdm[tc.genesis.Hash()] = tc.genesis.Difficulty() + tc.blockm[tc.genesis.Hash()] = tc.genesis + tc.generate(length-1, 0, genesis, false) + return tc +} + +// makeFork creates a fork on top of the test chain. +func (tc *testChain) makeFork(length int, heavy bool, seed byte) *testChain { + fork := tc.copy(tc.len() + length) + fork.generate(length, seed, tc.headBlock(), heavy) + return fork +} + +// shorten creates a copy of the chain with the given length. It panics if the +// length is longer than the number of available blocks. +func (tc *testChain) shorten(length int) *testChain { + if length > tc.len() { + panic(fmt.Errorf("can't shorten test chain to %d blocks, it's only %d blocks long", length, tc.len())) + } + return tc.copy(length) +} + +func (tc *testChain) copy(newlen int) *testChain { + cpy := &testChain{ + genesis: tc.genesis, + headerm: make(map[common.Hash]*types.Header, newlen), + blockm: make(map[common.Hash]*types.Block, newlen), + receiptm: make(map[common.Hash][]*types.Receipt, newlen), + tdm: make(map[common.Hash]*big.Int, newlen), + } + for i := 0; i < len(tc.chain) && i < newlen; i++ { + hash := tc.chain[i] + cpy.chain = append(cpy.chain, tc.chain[i]) + cpy.tdm[hash] = tc.tdm[hash] + cpy.blockm[hash] = tc.blockm[hash] + cpy.headerm[hash] = tc.headerm[hash] + cpy.receiptm[hash] = tc.receiptm[hash] + } + return cpy +} + +// generate creates a chain of n blocks starting at and including parent. +// the returned hash chain is ordered head->parent. In addition, every 22th block +// contains a transaction and every 5th an uncle to allow testing correct block +// reassembly. +func (tc *testChain) generate(n int, seed byte, parent *types.Block, heavy bool) { + // start := time.Now() + // defer func() { fmt.Printf("test chain generated in %v\n", time.Since(start)) }() + + blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), testDB, n, func(i int, block *core.BlockGen) { + block.SetCoinbase(common.Address{seed}) + // If a heavy chain is requested, delay blocks to raise difficulty + if heavy { + block.OffsetTime(-1) + } + // Include transactions to the miner to make blocks more interesting. + if parent == tc.genesis && i%22 == 0 { + signer := types.MakeSigner(params.TestChainConfig, block.Number()) + tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, big.NewInt(1000), params.TxGas, nil, nil), signer, testKey) + if err != nil { + panic(err) + } + block.AddTx(tx) + } + // if the block number is a multiple of 5, add a bonus uncle to the block + if i > 0 && i%5 == 0 { + block.AddUncle(&types.Header{ + ParentHash: block.PrevBlock(i - 1).Hash(), + Number: big.NewInt(block.Number().Int64() - 1), + }) + } + }) + + // Convert the block-chain into a hash-chain and header/block maps + td := new(big.Int).Set(tc.td(parent.Hash())) + for i, b := range blocks { + td := td.Add(td, b.Difficulty()) + hash := b.Hash() + tc.chain = append(tc.chain, hash) + tc.blockm[hash] = b + tc.headerm[hash] = b.Header() + tc.receiptm[hash] = receipts[i] + tc.tdm[hash] = new(big.Int).Set(td) + } +} + +// len returns the total number of blocks in the chain. +func (tc *testChain) len() int { + return len(tc.chain) +} + +// headBlock returns the head of the chain. +func (tc *testChain) headBlock() *types.Block { + return tc.blockm[tc.chain[len(tc.chain)-1]] +} + +// td returns the total difficulty of the given block. +func (tc *testChain) td(hash common.Hash) *big.Int { + return tc.tdm[hash] +} + +// headersByHash returns headers in ascending order from the given hash. +func (tc *testChain) headersByHash(origin common.Hash, amount int, skip int) []*types.Header { + num, _ := tc.hashToNumber(origin) + return tc.headersByNumber(num, amount, skip) +} + +// headersByNumber returns headers in ascending order from the given number. +func (tc *testChain) headersByNumber(origin uint64, amount int, skip int) []*types.Header { + result := make([]*types.Header, 0, amount) + for num := origin; num < uint64(len(tc.chain)) && len(result) < amount; num += uint64(skip) + 1 { + if header, ok := tc.headerm[tc.chain[int(num)]]; ok { + result = append(result, header) + } + } + return result +} + +// receipts returns the receipts of the given block hashes. +func (tc *testChain) receipts(hashes []common.Hash) [][]*types.Receipt { + results := make([][]*types.Receipt, 0, len(hashes)) + for _, hash := range hashes { + if receipt, ok := tc.receiptm[hash]; ok { + results = append(results, receipt) + } + } + return results +} + +// bodies returns the block bodies of the given block hashes. +func (tc *testChain) bodies(hashes []common.Hash) ([][]*types.Transaction, [][]*types.Header) { + transactions := make([][]*types.Transaction, 0, len(hashes)) + uncles := make([][]*types.Header, 0, len(hashes)) + for _, hash := range hashes { + if block, ok := tc.blockm[hash]; ok { + transactions = append(transactions, block.Transactions()) + uncles = append(uncles, block.Uncles()) + } + } + return transactions, uncles +} + +func (tc *testChain) hashToNumber(target common.Hash) (uint64, bool) { + for num, hash := range tc.chain { + if hash == target { + return uint64(num), true + } + } + return 0, false +} diff --git a/eth/enr_entry.go b/eth/enr_entry.go new file mode 100644 index 000000000000..d9e7b95784a2 --- /dev/null +++ b/eth/enr_entry.go @@ -0,0 +1,61 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package eth + +import ( + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/forkid" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rlp" +) + +// ethEntry is the "eth" ENR entry which advertises eth protocol +// on the discovery network. +type ethEntry struct { + ForkID forkid.ID // Fork identifier per EIP-2124 + + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` +} + +// ENRKey implements enr.Entry. +func (e ethEntry) ENRKey() string { + return "eth" +} + +func (eth *Ethereum) startEthEntryUpdate(ln *enode.LocalNode) { + var newHead = make(chan core.ChainHeadEvent, 10) + sub := eth.blockchain.SubscribeChainHeadEvent(newHead) + + go func() { + defer sub.Unsubscribe() + for { + select { + case <-newHead: + ln.Set(eth.currentEthEntry()) + case <-sub.Err(): + // Would be nice to sync with eth.Stop, but there is no + // good way to do that. + return + } + } + }() +} + +func (eth *Ethereum) currentEthEntry() *ethEntry { + return ðEntry{ForkID: forkid.NewID(eth.blockchain)} +} diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index f0b5e8064bc2..28c532d9bdad 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -110,7 +110,6 @@ type Fetcher struct { notify chan *announce inject chan *inject - blockFilter chan chan []*types.Block headerFilter chan chan *headerFilterTask bodyFilter chan chan *bodyFilterTask @@ -150,7 +149,6 @@ func New(getBlock blockRetrievalFn, verifyHeader headerVerifierFn, broadcastBloc return &Fetcher{ notify: make(chan *announce), inject: make(chan *inject), - blockFilter: make(chan chan []*types.Block), headerFilter: make(chan chan *headerFilterTask), bodyFilter: make(chan chan *bodyFilterTask), done: make(chan common.Hash), @@ -687,7 +685,7 @@ func (f *Fetcher) forgetHash(hash common.Hash) { // Remove all pending announces and decrement DOS counters for _, announce := range f.announced[hash] { f.announces[announce.origin]-- - if f.announces[announce.origin] == 0 { + if f.announces[announce.origin] <= 0 { delete(f.announces, announce.origin) } } @@ -698,7 +696,7 @@ func (f *Fetcher) forgetHash(hash common.Hash) { // Remove any pending fetches and decrement the DOS counters if announce := f.fetching[hash]; announce != nil { f.announces[announce.origin]-- - if f.announces[announce.origin] == 0 { + if f.announces[announce.origin] <= 0 { delete(f.announces, announce.origin) } delete(f.fetching, hash) @@ -707,7 +705,7 @@ func (f *Fetcher) forgetHash(hash common.Hash) { // Remove any pending completion requests and decrement the DOS counters for _, announce := range f.fetched[hash] { f.announces[announce.origin]-- - if f.announces[announce.origin] == 0 { + if f.announces[announce.origin] <= 0 { delete(f.announces, announce.origin) } } @@ -716,7 +714,7 @@ func (f *Fetcher) forgetHash(hash common.Hash) { // Remove any pending completions and decrement the DOS counters if announce := f.completing[hash]; announce != nil { f.announces[announce.origin]-- - if f.announces[announce.origin] == 0 { + if f.announces[announce.origin] <= 0 { delete(f.announces, announce.origin) } delete(f.completing, hash) diff --git a/eth/fetcher/fetcher_test.go b/eth/fetcher/fetcher_test.go index 3d4f0d1e592b..83172c5348f4 100644 --- a/eth/fetcher/fetcher_test.go +++ b/eth/fetcher/fetcher_test.go @@ -27,14 +27,14 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" ) var ( - testdb = ethdb.NewMemDatabase() + testdb = rawdb.NewMemoryDatabase() testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") testAddress = crypto.PubkeyToAddress(testKey.PublicKey) genesis = core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000)) @@ -244,7 +244,7 @@ func verifyImportEvent(t *testing.T, imported chan *types.Block, arrive bool) { select { case <-imported: t.Fatalf("import invoked") - case <-time.After(10 * time.Millisecond): + case <-time.After(20 * time.Millisecond): } } } diff --git a/eth/filters/bench_test.go b/eth/filters/bench_test.go index c5f681e024b9..fc7e6f5273ce 100644 --- a/eth/filters/bench_test.go +++ b/eth/filters/bench_test.go @@ -17,7 +17,6 @@ package filters import ( - "bytes" "context" "fmt" "testing" @@ -65,9 +64,9 @@ const benchFilterCnt = 2000 func benchmarkBloomBits(b *testing.B, sectionSize uint64) { benchDataDir := node.DefaultDataDir() + "/geth/chaindata" - fmt.Println("Running bloombits benchmark section size:", sectionSize) + b.Log("Running bloombits benchmark section size:", sectionSize) - db, err := ethdb.NewLDBDatabase(benchDataDir, 128, 1024) + db, err := rawdb.NewLevelDBDatabase(benchDataDir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", benchDataDir, err) } @@ -77,7 +76,7 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { } clearBloomBits(db) - fmt.Println("Generating bloombits data...") + b.Log("Generating bloombits data...") headNum := rawdb.ReadHeaderNumber(db, head) if headNum == nil || *headNum < sectionSize+512 { b.Fatalf("not enough blocks for running a benchmark") @@ -112,16 +111,16 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { rawdb.WriteBloomBits(db, uint(i), sectionIdx, sectionHead, comp) } //if sectionIdx%50 == 0 { - // fmt.Println(" section", sectionIdx, "/", cnt) + // b.Log(" section", sectionIdx, "/", cnt) //} } d := time.Since(start) - fmt.Println("Finished generating bloombits data") - fmt.Println(" ", d, "total ", d/time.Duration(cnt*sectionSize), "per block") - fmt.Println(" data size:", dataSize, " compressed size:", compSize, " compression ratio:", float64(compSize)/float64(dataSize)) + b.Log("Finished generating bloombits data") + b.Log(" ", d, "total ", d/time.Duration(cnt*sectionSize), "per block") + b.Log(" data size:", dataSize, " compressed size:", compSize, " compression ratio:", float64(compSize)/float64(dataSize)) - fmt.Println("Running filter benchmarks...") + b.Log("Running filter benchmarks...") start = time.Now() mux := new(event.TypeMux) var backend *testBackend @@ -129,7 +128,7 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { for i := 0; i < benchFilterCnt; i++ { if i%20 == 0 { db.Close() - db, _ = ethdb.NewLDBDatabase(benchDataDir, 128, 1024) + db, _ = rawdb.NewLevelDBDatabase(benchDataDir, 128, 1024, "") backend = &testBackend{mux, db, cnt, new(event.Feed), new(event.Feed), new(event.Feed), new(event.Feed)} } var addr common.Address @@ -141,42 +140,26 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { } } d = time.Since(start) - fmt.Println("Finished running filter benchmarks") - fmt.Println(" ", d, "total ", d/time.Duration(benchFilterCnt), "per address", d*time.Duration(1000000)/time.Duration(benchFilterCnt*cnt*sectionSize), "per million blocks") + b.Log("Finished running filter benchmarks") + b.Log(" ", d, "total ", d/time.Duration(benchFilterCnt), "per address", d*time.Duration(1000000)/time.Duration(benchFilterCnt*cnt*sectionSize), "per million blocks") db.Close() } -func forEachKey(db ethdb.Database, startPrefix, endPrefix []byte, fn func(key []byte)) { - it := db.(*ethdb.LDBDatabase).NewIterator() - it.Seek(startPrefix) - for it.Valid() { - key := it.Key() - cmpLen := len(key) - if len(endPrefix) < cmpLen { - cmpLen = len(endPrefix) - } - if bytes.Compare(key[:cmpLen], endPrefix) == 1 { - break - } - fn(common.CopyBytes(key)) - it.Next() - } - it.Release() -} - var bloomBitsPrefix = []byte("bloomBits-") func clearBloomBits(db ethdb.Database) { fmt.Println("Clearing bloombits data...") - forEachKey(db, bloomBitsPrefix, bloomBitsPrefix, func(key []byte) { - db.Delete(key) - }) + it := db.NewIteratorWithPrefix(bloomBitsPrefix) + for it.Next() { + db.Delete(it.Key()) + } + it.Release() } func BenchmarkNoBloomBits(b *testing.B) { benchDataDir := node.DefaultDataDir() + "/geth/chaindata" - fmt.Println("Running benchmark without bloombits") - db, err := ethdb.NewLDBDatabase(benchDataDir, 128, 1024) + b.Log("Running benchmark without bloombits") + db, err := rawdb.NewLevelDBDatabase(benchDataDir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", benchDataDir, err) } @@ -188,14 +171,14 @@ func BenchmarkNoBloomBits(b *testing.B) { clearBloomBits(db) - fmt.Println("Running filter benchmarks...") + b.Log("Running filter benchmarks...") start := time.Now() mux := new(event.TypeMux) backend := &testBackend{mux, db, 0, new(event.Feed), new(event.Feed), new(event.Feed), new(event.Feed)} filter := NewRangeFilter(backend, 0, int64(*headNum), []common.Address{{}}, nil) filter.Logs(context.Background()) d := time.Since(start) - fmt.Println("Finished running filter benchmarks") - fmt.Println(" ", d, "total ", d*time.Duration(1000000)/time.Duration(*headNum+1), "per million blocks") + b.Log("Finished running filter benchmarks") + b.Log(" ", d, "total ", d*time.Duration(1000000)/time.Duration(*headNum+1), "per million blocks") db.Close() } diff --git a/eth/filters/filter_system_test.go b/eth/filters/filter_system_test.go index e71080b1ab5e..93cb43123f70 100644 --- a/eth/filters/filter_system_test.go +++ b/eth/filters/filter_system_test.go @@ -85,7 +85,7 @@ func (b *testBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*type func (b *testBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { if number := rawdb.ReadHeaderNumber(b.db, hash); number != nil { - return rawdb.ReadReceipts(b.db, hash, *number), nil + return rawdb.ReadReceipts(b.db, hash, *number, params.TestChainConfig), nil } return nil, nil } @@ -95,7 +95,7 @@ func (b *testBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*types if number == nil { return nil, nil } - receipts := rawdb.ReadReceipts(b.db, hash, *number) + receipts := rawdb.ReadReceipts(b.db, hash, *number, params.TestChainConfig) logs := make([][]*types.Log, len(receipts)) for i, receipt := range receipts { @@ -161,7 +161,7 @@ func TestBlockSubscription(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -218,7 +218,7 @@ func TestPendingTxFilter(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -278,7 +278,7 @@ func TestPendingTxFilter(t *testing.T) { func TestLogFilterCreation(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -327,7 +327,7 @@ func TestInvalidLogFilterCreation(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -354,7 +354,7 @@ func TestInvalidLogFilterCreation(t *testing.T) { func TestInvalidGetLogsRequest(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -384,7 +384,7 @@ func TestLogFilter(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -503,7 +503,7 @@ func TestPendingLogsSubscription(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) diff --git a/eth/filters/filter_test.go b/eth/filters/filter_test.go index 396a03d611c6..eafa19cdfa22 100644 --- a/eth/filters/filter_test.go +++ b/eth/filters/filter_test.go @@ -29,7 +29,6 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -51,7 +50,7 @@ func BenchmarkFilters(b *testing.B) { defer os.RemoveAll(dir) var ( - db, _ = ethdb.NewLDBDatabase(dir, 0, 0) + db, _ = rawdb.NewLevelDBDatabase(dir, 0, 0, "") mux = new(event.TypeMux) txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) @@ -110,7 +109,7 @@ func TestFilters(t *testing.T) { defer os.RemoveAll(dir) var ( - db, _ = ethdb.NewLDBDatabase(dir, 0, 0) + db, _ = rawdb.NewLevelDBDatabase(dir, 0, 0, "") mux = new(event.TypeMux) txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) @@ -139,6 +138,7 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(1, common.HexToAddress("0x1"), big.NewInt(1), 1, big.NewInt(1), nil)) case 2: receipt := types.NewReceipt(nil, false, 0) receipt.Logs = []*types.Log{ @@ -148,6 +148,8 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(2, common.HexToAddress("0x2"), big.NewInt(2), 2, big.NewInt(2), nil)) + case 998: receipt := types.NewReceipt(nil, false, 0) receipt.Logs = []*types.Log{ @@ -157,6 +159,7 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(998, common.HexToAddress("0x998"), big.NewInt(998), 998, big.NewInt(998), nil)) case 999: receipt := types.NewReceipt(nil, false, 0) receipt.Logs = []*types.Log{ @@ -166,6 +169,7 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(999, common.HexToAddress("0x999"), big.NewInt(999), 999, big.NewInt(999), nil)) } }) for i, block := range chain { diff --git a/eth/gen_config.go b/eth/gen_config.go index d401a917d2fb..bc4b55b120fa 100644 --- a/eth/gen_config.go +++ b/eth/gen_config.go @@ -7,15 +7,14 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/params" ) -var _ = (*configMarshaling)(nil) - // MarshalTOML marshals as TOML. func (c Config) MarshalTOML() (interface{}, error) { type Config struct { @@ -23,52 +22,66 @@ func (c Config) MarshalTOML() (interface{}, error) { NetworkId uint64 SyncMode downloader.SyncMode NoPruning bool - LightServ int `toml:",omitempty"` - LightPeers int `toml:",omitempty"` - SkipBcVersionCheck bool `toml:"-"` - DatabaseHandles int `toml:"-"` + NoPrefetch bool + Whitelist map[uint64]common.Hash `toml:"-"` + LightServ int `toml:",omitempty"` + LightIngress int `toml:",omitempty"` + LightEgress int `toml:",omitempty"` + LightPeers int `toml:",omitempty"` + UltraLightServers []string `toml:",omitempty"` + UltraLightFraction int `toml:",omitempty"` + UltraLightOnlyAnnounce bool `toml:",omitempty"` + SkipBcVersionCheck bool `toml:"-"` + DatabaseHandles int `toml:"-"` DatabaseCache int - TrieCache int + DatabaseFreezer string + TrieCleanCache int + TrieDirtyCache int TrieTimeout time.Duration - Etherbase common.Address `toml:",omitempty"` - MinerNotify []string `toml:",omitempty"` - MinerExtraData hexutil.Bytes `toml:",omitempty"` - MinerGasFloor uint64 - MinerGasCeil uint64 - MinerGasPrice *big.Int - MinerRecommit time.Duration - MinerNoverify bool + Miner miner.Config Ethash ethash.Config TxPool core.TxPoolConfig GPO gasprice.Config EnablePreimageRecording bool DocRoot string `toml:"-"` + EWASMInterpreter string + EVMInterpreter string + RPCGasCap *big.Int `toml:",omitempty"` + Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` + CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` } var enc Config enc.Genesis = c.Genesis enc.NetworkId = c.NetworkId enc.SyncMode = c.SyncMode enc.NoPruning = c.NoPruning + enc.NoPrefetch = c.NoPrefetch + enc.Whitelist = c.Whitelist enc.LightServ = c.LightServ + enc.LightIngress = c.LightIngress + enc.LightEgress = c.LightEgress enc.LightPeers = c.LightPeers + enc.UltraLightServers = c.UltraLightServers + enc.UltraLightFraction = c.UltraLightFraction + enc.UltraLightOnlyAnnounce = c.UltraLightOnlyAnnounce enc.SkipBcVersionCheck = c.SkipBcVersionCheck enc.DatabaseHandles = c.DatabaseHandles enc.DatabaseCache = c.DatabaseCache - enc.TrieCache = c.TrieCache + enc.DatabaseFreezer = c.DatabaseFreezer + enc.TrieCleanCache = c.TrieCleanCache + enc.TrieDirtyCache = c.TrieDirtyCache enc.TrieTimeout = c.TrieTimeout - enc.Etherbase = c.Etherbase - enc.MinerNotify = c.MinerNotify - enc.MinerExtraData = c.MinerExtraData - enc.MinerGasFloor = c.MinerGasFloor - enc.MinerGasCeil = c.MinerGasCeil - enc.MinerGasPrice = c.MinerGasPrice - enc.MinerRecommit = c.MinerRecommit - enc.MinerNoverify = c.MinerNoverify + enc.Miner = c.Miner enc.Ethash = c.Ethash enc.TxPool = c.TxPool enc.GPO = c.GPO enc.EnablePreimageRecording = c.EnablePreimageRecording enc.DocRoot = c.DocRoot + enc.EWASMInterpreter = c.EWASMInterpreter + enc.EVMInterpreter = c.EVMInterpreter + enc.RPCGasCap = c.RPCGasCap + enc.Checkpoint = c.Checkpoint + enc.CheckpointOracle = c.CheckpointOracle return &enc, nil } @@ -79,26 +92,33 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { NetworkId *uint64 SyncMode *downloader.SyncMode NoPruning *bool - LightServ *int `toml:",omitempty"` - LightPeers *int `toml:",omitempty"` - SkipBcVersionCheck *bool `toml:"-"` - DatabaseHandles *int `toml:"-"` + NoPrefetch *bool + Whitelist map[uint64]common.Hash `toml:"-"` + LightServ *int `toml:",omitempty"` + LightIngress *int `toml:",omitempty"` + LightEgress *int `toml:",omitempty"` + LightPeers *int `toml:",omitempty"` + UltraLightServers []string `toml:",omitempty"` + UltraLightFraction *int `toml:",omitempty"` + UltraLightOnlyAnnounce *bool `toml:",omitempty"` + SkipBcVersionCheck *bool `toml:"-"` + DatabaseHandles *int `toml:"-"` DatabaseCache *int - TrieCache *int + DatabaseFreezer *string + TrieCleanCache *int + TrieDirtyCache *int TrieTimeout *time.Duration - Etherbase *common.Address `toml:",omitempty"` - MinerNotify []string `toml:",omitempty"` - MinerExtraData *hexutil.Bytes `toml:",omitempty"` - MinerGasFloor *uint64 - MinerGasCeil *uint64 - MinerGasPrice *big.Int - MinerRecommit *time.Duration - MinerNoverify *bool + Miner *miner.Config Ethash *ethash.Config TxPool *core.TxPoolConfig GPO *gasprice.Config EnablePreimageRecording *bool DocRoot *string `toml:"-"` + EWASMInterpreter *string + EVMInterpreter *string + RPCGasCap *big.Int `toml:",omitempty"` + Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` + CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` } var dec Config if err := unmarshal(&dec); err != nil { @@ -116,12 +136,33 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.NoPruning != nil { c.NoPruning = *dec.NoPruning } + if dec.NoPrefetch != nil { + c.NoPrefetch = *dec.NoPrefetch + } + if dec.Whitelist != nil { + c.Whitelist = dec.Whitelist + } if dec.LightServ != nil { c.LightServ = *dec.LightServ } + if dec.LightIngress != nil { + c.LightIngress = *dec.LightIngress + } + if dec.LightEgress != nil { + c.LightEgress = *dec.LightEgress + } if dec.LightPeers != nil { c.LightPeers = *dec.LightPeers } + if dec.UltraLightServers != nil { + c.UltraLightServers = dec.UltraLightServers + } + if dec.UltraLightFraction != nil { + c.UltraLightFraction = *dec.UltraLightFraction + } + if dec.UltraLightOnlyAnnounce != nil { + c.UltraLightOnlyAnnounce = *dec.UltraLightOnlyAnnounce + } if dec.SkipBcVersionCheck != nil { c.SkipBcVersionCheck = *dec.SkipBcVersionCheck } @@ -131,35 +172,20 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.DatabaseCache != nil { c.DatabaseCache = *dec.DatabaseCache } - if dec.TrieCache != nil { - c.TrieCache = *dec.TrieCache - } - if dec.TrieTimeout != nil { - c.TrieTimeout = *dec.TrieTimeout - } - if dec.Etherbase != nil { - c.Etherbase = *dec.Etherbase - } - if dec.MinerNotify != nil { - c.MinerNotify = dec.MinerNotify - } - if dec.MinerExtraData != nil { - c.MinerExtraData = *dec.MinerExtraData + if dec.DatabaseFreezer != nil { + c.DatabaseFreezer = *dec.DatabaseFreezer } - if dec.MinerGasFloor != nil { - c.MinerGasFloor = *dec.MinerGasFloor + if dec.TrieCleanCache != nil { + c.TrieCleanCache = *dec.TrieCleanCache } - if dec.MinerGasCeil != nil { - c.MinerGasCeil = *dec.MinerGasCeil + if dec.TrieDirtyCache != nil { + c.TrieDirtyCache = *dec.TrieDirtyCache } - if dec.MinerGasPrice != nil { - c.MinerGasPrice = dec.MinerGasPrice - } - if dec.MinerRecommit != nil { - c.MinerRecommit = *dec.MinerRecommit + if dec.TrieTimeout != nil { + c.TrieTimeout = *dec.TrieTimeout } - if dec.MinerNoverify != nil { - c.MinerNoverify = *dec.MinerNoverify + if dec.Miner != nil { + c.Miner = *dec.Miner } if dec.Ethash != nil { c.Ethash = *dec.Ethash @@ -176,5 +202,20 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.DocRoot != nil { c.DocRoot = *dec.DocRoot } + if dec.EWASMInterpreter != nil { + c.EWASMInterpreter = *dec.EWASMInterpreter + } + if dec.EVMInterpreter != nil { + c.EVMInterpreter = *dec.EVMInterpreter + } + if dec.RPCGasCap != nil { + c.RPCGasCap = dec.RPCGasCap + } + if dec.Checkpoint != nil { + c.Checkpoint = dec.Checkpoint + } + if dec.CheckpointOracle != nil { + c.CheckpointOracle = dec.CheckpointOracle + } return nil } diff --git a/eth/handler.go b/eth/handler.go index 1f62d820ec6e..4ce2d1c82f94 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -28,7 +28,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" - "github.com/ethereum/go-ethereum/consensus/misc" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/downloader" @@ -40,6 +39,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) const ( @@ -55,13 +55,9 @@ const ( ) var ( - daoChallengeTimeout = 15 * time.Second // Time allowance for a node to reply to the DAO handshake challenge + syncChallengeTimeout = 15 * time.Second // Time allowance for a node to reply to the sync progress challenge ) -// errIncompatibleConfig is returned if the requested protocols and configs are -// not compatible (low protocol version restrictions and high requirements). -var errIncompatibleConfig = errors.New("incompatible configuration") - func errResp(code errCode, format string, v ...interface{}) error { return fmt.Errorf("%v - %v", code, fmt.Sprintf(format, v...)) } @@ -72,22 +68,24 @@ type ProtocolManager struct { fastSync uint32 // Flag whether fast sync is enabled (gets disabled if we already have blocks) acceptTxs uint32 // Flag whether we're considered synchronised (enables transaction processing) - txpool txPool - blockchain *core.BlockChain - chainconfig *params.ChainConfig - maxPeers int + checkpointNumber uint64 // Block number for the sync progress validator to cross reference + checkpointHash common.Hash // Block hash for the sync progress validator to cross reference + + txpool txPool + blockchain *core.BlockChain + maxPeers int downloader *downloader.Downloader fetcher *fetcher.Fetcher peers *peerSet - SubProtocols []p2p.Protocol - eventMux *event.TypeMux txsCh chan core.NewTxsEvent txsSub event.Subscription minedBlockSub *event.TypeMuxSubscription + whitelist map[uint64]common.Hash + // channels for fetcher, syncer, txsyncLoop newPeerCh chan *peer txsyncCh chan *txsync @@ -101,69 +99,59 @@ type ProtocolManager struct { // NewProtocolManager returns a new Ethereum sub protocol manager. The Ethereum sub protocol manages peers capable // with the Ethereum network. -func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, networkID uint64, mux *event.TypeMux, txpool txPool, engine consensus.Engine, blockchain *core.BlockChain, chaindb ethdb.Database) (*ProtocolManager, error) { +func NewProtocolManager(config *params.ChainConfig, checkpoint *params.TrustedCheckpoint, mode downloader.SyncMode, networkID uint64, mux *event.TypeMux, txpool txPool, engine consensus.Engine, blockchain *core.BlockChain, chaindb ethdb.Database, cacheLimit int, whitelist map[uint64]common.Hash) (*ProtocolManager, error) { // Create the protocol manager with the base fields manager := &ProtocolManager{ networkID: networkID, eventMux: mux, txpool: txpool, blockchain: blockchain, - chainconfig: config, peers: newPeerSet(), + whitelist: whitelist, newPeerCh: make(chan *peer), noMorePeers: make(chan struct{}), txsyncCh: make(chan *txsync), quitSync: make(chan struct{}), } - // Figure out whether to allow fast sync or not - if mode == downloader.FastSync && blockchain.CurrentBlock().NumberU64() > 0 { - log.Warn("Blockchain not empty, fast sync disabled") - mode = downloader.FullSync + if mode == downloader.FullSync { + // The database seems empty as the current block is the genesis. Yet the fast + // block is ahead, so fast sync was enabled for this node at a certain point. + // The scenarios where this can happen is + // * if the user manually (or via a bad block) rolled back a fast sync node + // below the sync point. + // * the last fast sync is not finished while user specifies a full sync this + // time. But we don't have any recent state for full sync. + // In these cases however it's safe to reenable fast sync. + fullBlock, fastBlock := blockchain.CurrentBlock(), blockchain.CurrentFastBlock() + if fullBlock.NumberU64() == 0 && fastBlock.NumberU64() > 0 { + manager.fastSync = uint32(1) + log.Warn("Switch sync mode from full sync to fast sync") + } + } else { + if blockchain.CurrentBlock().NumberU64() > 0 { + // Print warning log if database is not empty to run fast sync. + log.Warn("Switch sync mode from fast sync to full sync") + } else { + // If fast sync was requested and our database is empty, grant it + manager.fastSync = uint32(1) + } } - if mode == downloader.FastSync { - manager.fastSync = uint32(1) + // If we have trusted checkpoints, enforce them on the chain + if checkpoint != nil { + manager.checkpointNumber = (checkpoint.SectionIndex+1)*params.CHTFrequency - 1 + manager.checkpointHash = checkpoint.SectionHead } - // Initiate a sub-protocol for every implemented version we can handle - manager.SubProtocols = make([]p2p.Protocol, 0, len(ProtocolVersions)) - for i, version := range ProtocolVersions { - // Skip protocol version if incompatible with the mode of operation - if mode == downloader.FastSync && version < eth63 { - continue - } - // Compatible; initialise the sub-protocol - version := version // Closure for the run - manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{ - Name: ProtocolName, - Version: version, - Length: ProtocolLengths[i], - Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - peer := manager.newPeer(int(version), p, rw) - select { - case manager.newPeerCh <- peer: - manager.wg.Add(1) - defer manager.wg.Done() - return manager.handle(peer) - case <-manager.quitSync: - return p2p.DiscQuitting - } - }, - NodeInfo: func() interface{} { - return manager.NodeInfo() - }, - PeerInfo: func(id enode.ID) interface{} { - if p := manager.peers.Peer(fmt.Sprintf("%x", id[:8])); p != nil { - return p.Info() - } - return nil - }, - }) - } - if len(manager.SubProtocols) == 0 { - return nil, errIncompatibleConfig + + // Construct the downloader (long sync) and its backing state bloom if fast + // sync is requested. The downloader is responsible for deallocating the state + // bloom when it's done. + var stateBloom *trie.SyncBloom + if atomic.LoadUint32(&manager.fastSync) == 1 { + stateBloom = trie.NewSyncBloom(uint64(cacheLimit), chaindb) } - // Construct the different synchronisation mechanisms - manager.downloader = downloader.New(mode, chaindb, manager.eventMux, blockchain, nil, manager.removePeer) + manager.downloader = downloader.New(manager.checkpointNumber, chaindb, stateBloom, manager.eventMux, blockchain, nil, manager.removePeer) + // Construct the fetcher (short sync) validator := func(header *types.Header) error { return engine.VerifyHeader(blockchain, header, true) } @@ -171,19 +159,69 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne return blockchain.CurrentBlock().NumberU64() } inserter := func(blocks types.Blocks) (int, error) { - // If fast sync is running, deny importing weird blocks + // If sync hasn't reached the checkpoint yet, deny importing weird blocks. + // + // Ideally we would also compare the head block's timestamp and similarly reject + // the propagated block if the head is too old. Unfortunately there is a corner + // case when starting new networks, where the genesis might be ancient (0 unix) + // which would prevent full nodes from accepting it. + if manager.blockchain.CurrentBlock().NumberU64() < manager.checkpointNumber { + log.Warn("Unsynced yet, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash()) + return 0, nil + } + // If fast sync is running, deny importing weird blocks. This is a problematic + // clause when starting up a new network, because fast-syncing miners might not + // accept each others' blocks until a restart. Unfortunately we haven't figured + // out a way yet where nodes can decide unilaterally whether the network is new + // or not. This should be fixed if we figure out a solution. if atomic.LoadUint32(&manager.fastSync) == 1 { - log.Warn("Discarded bad propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash()) + log.Warn("Fast syncing, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash()) return 0, nil } - atomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import - return manager.blockchain.InsertChain(blocks) + n, err := manager.blockchain.InsertChain(blocks) + if err == nil { + atomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import + } + return n, err } manager.fetcher = fetcher.New(blockchain.GetBlockByHash, validator, manager.BroadcastBlock, heighter, inserter, manager.removePeer) return manager, nil } +func (pm *ProtocolManager) makeProtocol(version uint) p2p.Protocol { + length, ok := protocolLengths[version] + if !ok { + panic("makeProtocol for unknown version") + } + + return p2p.Protocol{ + Name: protocolName, + Version: version, + Length: length, + Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { + peer := pm.newPeer(int(version), p, rw) + select { + case pm.newPeerCh <- peer: + pm.wg.Add(1) + defer pm.wg.Done() + return pm.handle(peer) + case <-pm.quitSync: + return p2p.DiscQuitting + } + }, + NodeInfo: func() interface{} { + return pm.NodeInfo() + }, + PeerInfo: func(id enode.ID) interface{} { + if p := pm.peers.Peer(fmt.Sprintf("%x", id[:8])); p != nil { + return p.Info() + } + return nil + }, + } +} + func (pm *ProtocolManager) removePeer(id string) { // Short circuit if the peer was already removed peer := pm.peers.Peer(id) @@ -288,26 +326,32 @@ func (pm *ProtocolManager) handle(p *peer) error { // after this will be sent via broadcasts. pm.syncTransactions(p) - // If we're DAO hard-fork aware, validate any remote peer with regard to the hard-fork - if daoBlock := pm.chainconfig.DAOForkBlock; daoBlock != nil { - // Request the peer's DAO fork header for extra-data validation - if err := p.RequestHeadersByNumber(daoBlock.Uint64(), 1, 0, false); err != nil { + // If we have a trusted CHT, reject all peers below that (avoid fast sync eclipse) + if pm.checkpointHash != (common.Hash{}) { + // Request the peer's checkpoint header for chain height/weight validation + if err := p.RequestHeadersByNumber(pm.checkpointNumber, 1, 0, false); err != nil { return err } // Start a timer to disconnect if the peer doesn't reply in time - p.forkDrop = time.AfterFunc(daoChallengeTimeout, func() { - p.Log().Debug("Timed out DAO fork-check, dropping") + p.syncDrop = time.AfterFunc(syncChallengeTimeout, func() { + p.Log().Warn("Checkpoint challenge timed out, dropping", "addr", p.RemoteAddr(), "type", p.Name()) pm.removePeer(p.id) }) // Make sure it's cleaned up if the peer dies off defer func() { - if p.forkDrop != nil { - p.forkDrop.Stop() - p.forkDrop = nil + if p.syncDrop != nil { + p.syncDrop.Stop() + p.syncDrop = nil } }() } - // main loop. handle incoming messages. + // If we have any explicit whitelist block hashes, request them + for number := range pm.whitelist { + if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil { + return err + } + } + // Handle incoming messages until the connection is torn down for { if err := pm.handleMsg(p); err != nil { p.Log().Debug("Ethereum message handling failed", "err", err) @@ -324,8 +368,8 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err != nil { return err } - if msg.Size > ProtocolMaxMsgSize { - return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, ProtocolMaxMsgSize) + if msg.Size > protocolMaxMsgSize { + return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, protocolMaxMsgSize) } defer msg.Discard() @@ -429,43 +473,43 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&headers); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - // If no headers were received, but we're expending a DAO fork check, maybe it's that - if len(headers) == 0 && p.forkDrop != nil { - // Possibly an empty reply to the fork header checks, sanity check TDs - verifyDAO := true - - // If we already have a DAO header, we can check the peer's TD against it. If - // the peer's ahead of this, it too must have a reply to the DAO check - if daoHeader := pm.blockchain.GetHeaderByNumber(pm.chainconfig.DAOForkBlock.Uint64()); daoHeader != nil { - if _, td := p.Head(); td.Cmp(pm.blockchain.GetTd(daoHeader.Hash(), daoHeader.Number.Uint64())) >= 0 { - verifyDAO = false - } - } - // If we're seemingly on the same chain, disable the drop timer - if verifyDAO { - p.Log().Debug("Seems to be on the same side of the DAO fork") - p.forkDrop.Stop() - p.forkDrop = nil - return nil + // If no headers were received, but we're expencting a checkpoint header, consider it that + if len(headers) == 0 && p.syncDrop != nil { + // Stop the timer either way, decide later to drop or not + p.syncDrop.Stop() + p.syncDrop = nil + + // If we're doing a fast sync, we must enforce the checkpoint block to avoid + // eclipse attacks. Unsynced nodes are welcome to connect after we're done + // joining the network + if atomic.LoadUint32(&pm.fastSync) == 1 { + p.Log().Warn("Dropping unsynced node during fast sync", "addr", p.RemoteAddr(), "type", p.Name()) + return errors.New("unsynced node cannot serve fast sync") } } // Filter out any explicitly requested headers, deliver the rest to the downloader filter := len(headers) == 1 if filter { - // If it's a potential DAO fork check, validate against the rules - if p.forkDrop != nil && pm.chainconfig.DAOForkBlock.Cmp(headers[0].Number) == 0 { - // Disable the fork drop timer - p.forkDrop.Stop() - p.forkDrop = nil + // If it's a potential sync progress check, validate the content and advertised chain weight + if p.syncDrop != nil && headers[0].Number.Uint64() == pm.checkpointNumber { + // Disable the sync drop timer + p.syncDrop.Stop() + p.syncDrop = nil // Validate the header and either drop the peer or continue - if err := misc.VerifyDAOHeaderExtraData(pm.chainconfig, headers[0]); err != nil { - p.Log().Debug("Verified to be on the other side of the DAO fork, dropping") - return err + if headers[0].Hash() != pm.checkpointHash { + return errors.New("checkpoint hash mismatch") } - p.Log().Debug("Verified to be on the same side of the DAO fork") return nil } + // Otherwise if it's a whitelisted block, validate against the set + if want, ok := pm.whitelist[headers[0].Number.Uint64()]; ok { + if hash := headers[0].Hash(); want != hash { + p.Log().Info("Whitelist mismatch, dropping peer", "number", headers[0].Number.Uint64(), "hash", hash, "want", want) + return errors.New("whitelist block mismatch") + } + p.Log().Debug("Whitelist block verified", "number", headers[0].Number.Uint64(), "hash", want) + } // Irrelevant of the fork checks, send the header to the fetcher just in case headers = pm.fetcher.FilterHeaders(p.id, headers, time.Now()) } @@ -640,6 +684,9 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&request); err != nil { return errResp(ErrDecode, "%v: %v", msg, err) } + if err := request.sanityCheck(); err != nil { + return err + } request.Block.ReceivedAt = msg.ReceivedAt request.Block.ReceivedFrom = p @@ -653,12 +700,12 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { trueHead = request.Block.ParentHash() trueTD = new(big.Int).Sub(request.TD, request.Block.Difficulty()) ) - // Update the peers total difficulty if better than the previous + // Update the peer's total difficulty if better than the previous if _, td := p.Head(); trueTD.Cmp(td) > 0 { p.SetHead(trueHead, trueTD) // Schedule a sync if above ours. Note, this will not fire a sync for a gap of - // a singe block (as the true TD is below the propagated block), however this + // a single block (as the true TD is below the propagated block), however this // scenario should easily be covered by the fetcher. currentBlock := pm.blockchain.CurrentBlock() if trueTD.Cmp(pm.blockchain.GetTd(currentBlock.Hash(), currentBlock.NumberU64())) > 0 { diff --git a/eth/handler_test.go b/eth/handler_test.go index 7811cd480483..0f1672fd4498 100644 --- a/eth/handler_test.go +++ b/eth/handler_test.go @@ -27,46 +27,17 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" ) -// Tests that protocol versions and modes of operations are matched up properly. -func TestProtocolCompatibility(t *testing.T) { - // Define the compatibility chart - tests := []struct { - version uint - mode downloader.SyncMode - compatible bool - }{ - {61, downloader.FullSync, true}, {62, downloader.FullSync, true}, {63, downloader.FullSync, true}, - {61, downloader.FastSync, false}, {62, downloader.FastSync, false}, {63, downloader.FastSync, true}, - } - // Make sure anything we screw up is restored - backup := ProtocolVersions - defer func() { ProtocolVersions = backup }() - - // Try all available compatibility configs and check for errors - for i, tt := range tests { - ProtocolVersions = []uint{tt.version} - - pm, _, err := newTestProtocolManager(tt.mode, 0, nil, nil) - if pm != nil { - defer pm.Stop() - } - if (err == nil && !tt.compatible) || (err != nil && tt.compatible) { - t.Errorf("test %d: compatibility mismatch: have error %v, want compatibility %v", i, err, tt.compatible) - } - } -} - // Tests that block headers can be retrieved from a remote chain based on user queries. func TestGetBlockHeaders62(t *testing.T) { testGetBlockHeaders(t, 62) } func TestGetBlockHeaders63(t *testing.T) { testGetBlockHeaders(t, 63) } @@ -344,11 +315,15 @@ func testGetNodeData(t *testing.T, protocol int) { // Fetch for now the entire chain db hashes := []common.Hash{} - for _, key := range db.Keys() { - if len(key) == len(common.Hash{}) { + + it := db.NewIterator() + for it.Next() { + if key := it.Key(); len(key) == common.HashLength { hashes = append(hashes, common.BytesToHash(key)) } } + it.Release() + p2p.Send(peer.app, 0x0d, hashes) msg, err := peer.app.ReadMsg() if err != nil { @@ -367,7 +342,7 @@ func testGetNodeData(t *testing.T, protocol int) { t.Errorf("data hash mismatch: have %x, want %x", hash, want) } } - statedb := ethdb.NewMemDatabase() + statedb := rawdb.NewMemoryDatabase() for i := 0; i < len(data); i++ { statedb.Put(hashes[i].Bytes(), data[i]) } @@ -449,79 +424,125 @@ func testGetReceipt(t *testing.T, protocol int) { } } -// Tests that post eth protocol handshake, DAO fork-enabled clients also execute -// a DAO "challenge" verifying each others' DAO fork headers to ensure they're on -// compatible chains. -func TestDAOChallengeNoVsNo(t *testing.T) { testDAOChallenge(t, false, false, false) } -func TestDAOChallengeNoVsPro(t *testing.T) { testDAOChallenge(t, false, true, false) } -func TestDAOChallengeProVsNo(t *testing.T) { testDAOChallenge(t, true, false, false) } -func TestDAOChallengeProVsPro(t *testing.T) { testDAOChallenge(t, true, true, false) } -func TestDAOChallengeNoVsTimeout(t *testing.T) { testDAOChallenge(t, false, false, true) } -func TestDAOChallengeProVsTimeout(t *testing.T) { testDAOChallenge(t, true, true, true) } - -func testDAOChallenge(t *testing.T, localForked, remoteForked bool, timeout bool) { - // Reduce the DAO handshake challenge timeout - if timeout { - defer func(old time.Duration) { daoChallengeTimeout = old }(daoChallengeTimeout) - daoChallengeTimeout = 500 * time.Millisecond - } - // Create a DAO aware protocol manager +// Tests that post eth protocol handshake, clients perform a mutual checkpoint +// challenge to validate each other's chains. Hash mismatches, or missing ones +// during a fast sync should lead to the peer getting dropped. +func TestCheckpointChallenge(t *testing.T) { + tests := []struct { + syncmode downloader.SyncMode + checkpoint bool + timeout bool + empty bool + match bool + drop bool + }{ + // If checkpointing is not enabled locally, don't challenge and don't drop + {downloader.FullSync, false, false, false, false, false}, + {downloader.FastSync, false, false, false, false, false}, + + // If checkpointing is enabled locally and remote response is empty, only drop during fast sync + {downloader.FullSync, true, false, true, false, false}, + {downloader.FastSync, true, false, true, false, true}, // Special case, fast sync, unsynced peer + + // If checkpointing is enabled locally and remote response mismatches, always drop + {downloader.FullSync, true, false, false, false, true}, + {downloader.FastSync, true, false, false, false, true}, + + // If checkpointing is enabled locally and remote response matches, never drop + {downloader.FullSync, true, false, false, true, false}, + {downloader.FastSync, true, false, false, true, false}, + + // If checkpointing is enabled locally and remote times out, always drop + {downloader.FullSync, true, true, false, true, true}, + {downloader.FastSync, true, true, false, true, true}, + } + for _, tt := range tests { + t.Run(fmt.Sprintf("sync %v checkpoint %v timeout %v empty %v match %v", tt.syncmode, tt.checkpoint, tt.timeout, tt.empty, tt.match), func(t *testing.T) { + testCheckpointChallenge(t, tt.syncmode, tt.checkpoint, tt.timeout, tt.empty, tt.match, tt.drop) + }) + } +} + +func testCheckpointChallenge(t *testing.T, syncmode downloader.SyncMode, checkpoint bool, timeout bool, empty bool, match bool, drop bool) { + // Reduce the checkpoint handshake challenge timeout + defer func(old time.Duration) { syncChallengeTimeout = old }(syncChallengeTimeout) + syncChallengeTimeout = 250 * time.Millisecond + + // Initialize a chain and generate a fake CHT if checkpointing is enabled var ( - evmux = new(event.TypeMux) - pow = ethash.NewFaker() - db = ethdb.NewMemDatabase() - config = ¶ms.ChainConfig{DAOForkBlock: big.NewInt(1), DAOForkSupport: localForked} - gspec = &core.Genesis{Config: config} - genesis = gspec.MustCommit(db) + db = rawdb.NewMemoryDatabase() + config = new(params.ChainConfig) ) - blockchain, err := core.NewBlockChain(db, nil, config, pow, vm.Config{}, nil) + (&core.Genesis{Config: config}).MustCommit(db) // Commit genesis block + // If checkpointing is enabled, create and inject a fake CHT and the corresponding + // chllenge response. + var response *types.Header + var cht *params.TrustedCheckpoint + if checkpoint { + index := uint64(rand.Intn(500)) + number := (index+1)*params.CHTFrequency - 1 + response = &types.Header{Number: big.NewInt(int64(number)), Extra: []byte("valid")} + + cht = ¶ms.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: response.Hash(), + } + } + // Create a checkpoint aware protocol manager + blockchain, err := core.NewBlockChain(db, nil, config, ethash.NewFaker(), vm.Config{}, nil) if err != nil { t.Fatalf("failed to create new blockchain: %v", err) } - pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, evmux, new(testTxPool), pow, blockchain, db) + pm, err := NewProtocolManager(config, cht, syncmode, DefaultConfig.NetworkId, new(event.TypeMux), new(testTxPool), ethash.NewFaker(), blockchain, db, 1, nil) if err != nil { t.Fatalf("failed to start test protocol manager: %v", err) } pm.Start(1000) defer pm.Stop() - // Connect a new peer and check that we receive the DAO challenge + // Connect a new peer and check that we receive the checkpoint challenge peer, _ := newTestPeer("peer", eth63, pm, true) defer peer.close() - challenge := &getBlockHeadersData{ - Origin: hashOrNumber{Number: config.DAOForkBlock.Uint64()}, - Amount: 1, - Skip: 0, - Reverse: false, - } - if err := p2p.ExpectMsg(peer.app, GetBlockHeadersMsg, challenge); err != nil { - t.Fatalf("challenge mismatch: %v", err) - } - // Create a block to reply to the challenge if no timeout is simulated - if !timeout { - blocks, _ := core.GenerateChain(¶ms.ChainConfig{}, genesis, ethash.NewFaker(), db, 1, func(i int, block *core.BlockGen) { - if remoteForked { - block.SetExtra(params.DAOForkBlockExtra) + if checkpoint { + challenge := &getBlockHeadersData{ + Origin: hashOrNumber{Number: response.Number.Uint64()}, + Amount: 1, + Skip: 0, + Reverse: false, + } + if err := p2p.ExpectMsg(peer.app, GetBlockHeadersMsg, challenge); err != nil { + t.Fatalf("challenge mismatch: %v", err) + } + // Create a block to reply to the challenge if no timeout is simulated + if !timeout { + if empty { + if err := p2p.Send(peer.app, BlockHeadersMsg, []*types.Header{}); err != nil { + t.Fatalf("failed to answer challenge: %v", err) + } + } else if match { + if err := p2p.Send(peer.app, BlockHeadersMsg, []*types.Header{response}); err != nil { + t.Fatalf("failed to answer challenge: %v", err) + } + } else { + if err := p2p.Send(peer.app, BlockHeadersMsg, []*types.Header{{Number: response.Number}}); err != nil { + t.Fatalf("failed to answer challenge: %v", err) + } } - }) - if err := p2p.Send(peer.app, BlockHeadersMsg, []*types.Header{blocks[0].Header()}); err != nil { - t.Fatalf("failed to answer challenge: %v", err) } - time.Sleep(100 * time.Millisecond) // Sleep to avoid the verification racing with the drops - } else { - // Otherwise wait until the test timeout passes - time.Sleep(daoChallengeTimeout + 500*time.Millisecond) } - // Verify that depending on fork side, the remote peer is maintained or dropped - if localForked == remoteForked && !timeout { - if peers := pm.peers.Len(); peers != 1 { - t.Fatalf("peer count mismatch: have %d, want %d", peers, 1) - } - } else { + // Wait until the test timeout passes to ensure proper cleanup + time.Sleep(syncChallengeTimeout + 100*time.Millisecond) + + // Verify that the remote peer is maintained or dropped + if drop { if peers := pm.peers.Len(); peers != 0 { t.Fatalf("peer count mismatch: have %d, want %d", peers, 0) } + } else { + if peers := pm.peers.Len(); peers != 1 { + t.Fatalf("peer count mismatch: have %d, want %d", peers, 1) + } } } @@ -550,7 +571,7 @@ func testBroadcastBlock(t *testing.T, totalPeers, broadcastExpected int) { var ( evmux = new(event.TypeMux) pow = ethash.NewFaker() - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() config = ¶ms.ChainConfig{} gspec = &core.Genesis{Config: config} genesis = gspec.MustCommit(db) @@ -559,7 +580,7 @@ func testBroadcastBlock(t *testing.T, totalPeers, broadcastExpected int) { if err != nil { t.Fatalf("failed to create new blockchain: %v", err) } - pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, evmux, new(testTxPool), pow, blockchain, db) + pm, err := NewProtocolManager(config, nil, downloader.FullSync, DefaultConfig.NetworkId, evmux, new(testTxPool), pow, blockchain, db, 1, nil) if err != nil { t.Fatalf("failed to start test protocol manager: %v", err) } @@ -585,7 +606,7 @@ func testBroadcastBlock(t *testing.T, totalPeers, broadcastExpected int) { } }(peer) } - timeoutCh := time.NewTimer(time.Millisecond * 100).C + timeout := time.After(300 * time.Millisecond) var receivedCount int outer: for { @@ -597,7 +618,7 @@ outer: if receivedCount == totalPeers { break outer } - case <-timeoutCh: + case <-timeout: break outer } } diff --git a/eth/helper_test.go b/eth/helper_test.go index 4e38a129e0f1..1482e99c4e10 100644 --- a/eth/helper_test.go +++ b/eth/helper_test.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" @@ -49,11 +50,11 @@ var ( // newTestProtocolManager creates a new protocol manager for testing purposes, // with the given number of blocks already known, and potential notification // channels for different events. -func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, *ethdb.MemDatabase, error) { +func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, ethdb.Database, error) { var ( evmux = new(event.TypeMux) engine = ethash.NewFaker() - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec = &core.Genesis{ Config: params.TestChainConfig, Alloc: core.GenesisAlloc{testBank: {Balance: big.NewInt(1000000)}}, @@ -65,8 +66,7 @@ func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func if _, err := blockchain.InsertChain(chain); err != nil { panic(err) } - - pm, err := NewProtocolManager(gspec.Config, mode, DefaultConfig.NetworkId, evmux, &testTxPool{added: newtx}, engine, blockchain, db) + pm, err := NewProtocolManager(gspec.Config, nil, mode, DefaultConfig.NetworkId, evmux, &testTxPool{added: newtx}, engine, blockchain, db, 1, nil) if err != nil { return nil, nil, err } @@ -78,7 +78,7 @@ func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func // with the given number of blocks already known, and potential notification // channels for different events. In case of an error, the constructor force- // fails the test. -func newTestProtocolManagerMust(t *testing.T, mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, *ethdb.MemDatabase) { +func newTestProtocolManagerMust(t *testing.T, mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, ethdb.Database) { pm, db, err := newTestProtocolManager(mode, blocks, generator, newtx) if err != nil { t.Fatalf("Failed to create protocol manager: %v", err) diff --git a/eth/peer.go b/eth/peer.go index b5f4508559f8..814c787b8c2b 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -79,7 +79,7 @@ type peer struct { rw p2p.MsgReadWriter version int // Protocol version negotiated - forkDrop *time.Timer // Timed connection dropper if forks aren't validated in time + syncDrop *time.Timer // Timed connection dropper if sync progress isn't validated in time head common.Hash td *big.Int @@ -196,9 +196,13 @@ func (p *peer) MarkTransaction(hash common.Hash) { // SendTransactions sends transactions to the peer and includes the hashes // in its transaction hash set for future reference. func (p *peer) SendTransactions(txs types.Transactions) error { + // Mark all the transactions as known, but ensure we don't overflow our limits for _, tx := range txs { p.knownTxs.Add(tx.Hash()) } + for p.knownTxs.Cardinality() >= maxKnownTxs { + p.knownTxs.Pop() + } return p2p.Send(p.rw, TxMsg, txs) } @@ -207,9 +211,13 @@ func (p *peer) SendTransactions(txs types.Transactions) error { func (p *peer) AsyncSendTransactions(txs []*types.Transaction) { select { case p.queuedTxs <- txs: + // Mark all the transactions as known, but ensure we don't overflow our limits for _, tx := range txs { p.knownTxs.Add(tx.Hash()) } + for p.knownTxs.Cardinality() >= maxKnownTxs { + p.knownTxs.Pop() + } default: p.Log().Debug("Dropping transaction propagation", "count", len(txs)) } @@ -218,9 +226,13 @@ func (p *peer) AsyncSendTransactions(txs []*types.Transaction) { // SendNewBlockHashes announces the availability of a number of blocks through // a hash notification. func (p *peer) SendNewBlockHashes(hashes []common.Hash, numbers []uint64) error { + // Mark all the block hashes as known, but ensure we don't overflow our limits for _, hash := range hashes { p.knownBlocks.Add(hash) } + for p.knownBlocks.Cardinality() >= maxKnownBlocks { + p.knownBlocks.Pop() + } request := make(newBlockHashesData, len(hashes)) for i := 0; i < len(hashes); i++ { request[i].Hash = hashes[i] @@ -235,7 +247,11 @@ func (p *peer) SendNewBlockHashes(hashes []common.Hash, numbers []uint64) error func (p *peer) AsyncSendNewBlockHash(block *types.Block) { select { case p.queuedAnns <- block: + // Mark all the block hash as known, but ensure we don't overflow our limits p.knownBlocks.Add(block.Hash()) + for p.knownBlocks.Cardinality() >= maxKnownBlocks { + p.knownBlocks.Pop() + } default: p.Log().Debug("Dropping block announcement", "number", block.NumberU64(), "hash", block.Hash()) } @@ -243,7 +259,11 @@ func (p *peer) AsyncSendNewBlockHash(block *types.Block) { // SendNewBlock propagates an entire block to a remote peer. func (p *peer) SendNewBlock(block *types.Block, td *big.Int) error { + // Mark all the block hash as known, but ensure we don't overflow our limits p.knownBlocks.Add(block.Hash()) + for p.knownBlocks.Cardinality() >= maxKnownBlocks { + p.knownBlocks.Pop() + } return p2p.Send(p.rw, NewBlockMsg, []interface{}{block, td}) } @@ -252,7 +272,11 @@ func (p *peer) SendNewBlock(block *types.Block, td *big.Int) error { func (p *peer) AsyncSendNewBlock(block *types.Block, td *big.Int) { select { case p.queuedProps <- &propEvent{block: block, td: td}: + // Mark all the block hash as known, but ensure we don't overflow our limits p.knownBlocks.Add(block.Hash()) + for p.knownBlocks.Cardinality() >= maxKnownBlocks { + p.knownBlocks.Pop() + } default: p.Log().Debug("Dropping block propagation", "number", block.NumberU64(), "hash", block.Hash()) } @@ -370,8 +394,8 @@ func (p *peer) readStatus(network uint64, status *statusData, genesis common.Has if msg.Code != StatusMsg { return errResp(ErrNoStatusMsg, "first msg has code %x (!= %x)", msg.Code, StatusMsg) } - if msg.Size > ProtocolMaxMsgSize { - return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, ProtocolMaxMsgSize) + if msg.Size > protocolMaxMsgSize { + return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, protocolMaxMsgSize) } // Decode the handshake and make sure everything matches if err := msg.Decode(&status); err != nil { diff --git a/eth/protocol.go b/eth/protocol.go index 0e90e6a2eff2..de0c979d89b8 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -34,16 +34,16 @@ const ( eth63 = 63 ) -// ProtocolName is the official short name of the protocol used during capability negotiation. -var ProtocolName = "eth" +// protocolName is the official short name of the protocol used during capability negotiation. +const protocolName = "eth" -// ProtocolVersions are the upported versions of the eth protocol (first is primary). -var ProtocolVersions = []uint{eth63, eth62} +// ProtocolVersions are the supported versions of the eth protocol (first is primary). +var ProtocolVersions = []uint{eth63} -// ProtocolLengths are the number of implemented message corresponding to different protocol versions. -var ProtocolLengths = []uint64{17, 8} +// protocolLengths are the number of implemented message corresponding to different protocol versions. +var protocolLengths = map[uint]uint64{eth63: 17, eth62: 8} -const ProtocolMaxMsgSize = 10 * 1024 * 1024 // Maximum cap on the size of a protocol message +const protocolMaxMsgSize = 10 * 1024 * 1024 // Maximum cap on the size of a protocol message // eth protocol message codes const ( @@ -173,6 +173,19 @@ type newBlockData struct { TD *big.Int } +// sanityCheck verifies that the values are reasonable, as a DoS protection +func (request *newBlockData) sanityCheck() error { + if err := request.Block.SanityCheck(); err != nil { + return err + } + //TD at mainnet block #7753254 is 76 bits. If it becomes 100 million times + // larger, it will still fit within 100 bits + if tdlen := request.TD.BitLen(); tdlen > 100 { + return fmt.Errorf("too large block TD: bitlen %d", tdlen) + } + return nil +} + // blockBody represents the data content of a single block. type blockBody struct { Transactions []*types.Transaction // Transactions contained within a block diff --git a/eth/protocol_test.go b/eth/protocol_test.go index aa43dfa9204e..e817d673a6f0 100644 --- a/eth/protocol_test.go +++ b/eth/protocol_test.go @@ -64,7 +64,7 @@ func testStatusMsgErrors(t *testing.T, protocol int) { }, { code: StatusMsg, data: statusData{uint32(protocol), 999, td, head.Hash(), genesis.Hash()}, - wantError: errResp(ErrNetworkIdMismatch, "999 (!= 1)"), + wantError: errResp(ErrNetworkIdMismatch, "999 (!= %d)", DefaultConfig.NetworkId), }, { code: StatusMsg, data: statusData{uint32(protocol), DefaultConfig.NetworkId, td, head.Hash(), common.Hash{3}}, diff --git a/eth/sync.go b/eth/sync.go index bfcfb6716ec7..9e180ee200f7 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -179,23 +179,13 @@ func (pm *ProtocolManager) synchronise(peer *peer) { if atomic.LoadUint32(&pm.fastSync) == 1 { // Fast sync was explicitly requested, and explicitly granted mode = downloader.FastSync - } else if currentBlock.NumberU64() == 0 && pm.blockchain.CurrentFastBlock().NumberU64() > 0 { - // The database seems empty as the current block is the genesis. Yet the fast - // block is ahead, so fast sync was enabled for this node at a certain point. - // The only scenario where this can happen is if the user manually (or via a - // bad block) rolled back a fast sync node below the sync point. In this case - // however it's safe to reenable fast sync. - atomic.StoreUint32(&pm.fastSync, 1) - mode = downloader.FastSync } - if mode == downloader.FastSync { // Make sure the peer's total difficulty we are synchronizing is higher. if pm.blockchain.GetTdByHash(pm.blockchain.CurrentFastBlock().Hash()).Cmp(pTd) >= 0 { return } } - // Run the sync cycle, and disable fast sync if we've went past the pivot block if err := pm.downloader.Synchronise(peer.id, pHead, pTd, mode); err != nil { return @@ -204,8 +194,17 @@ func (pm *ProtocolManager) synchronise(peer *peer) { log.Info("Fast sync complete, auto disabling") atomic.StoreUint32(&pm.fastSync, 0) } - atomic.StoreUint32(&pm.acceptTxs, 1) // Mark initial sync done - if head := pm.blockchain.CurrentBlock(); head.NumberU64() > 0 { + // If we've successfully finished a sync cycle and passed any required checkpoint, + // enable accepting transactions from the network. + head := pm.blockchain.CurrentBlock() + if head.NumberU64() >= pm.checkpointNumber { + // Checkpoint passed, sanity check the timestamp to have a fallback mechanism + // for non-checkpointed (number = 0) private networks. + if head.Time() >= uint64(time.Now().AddDate(0, -1, 0).Unix()) { + atomic.StoreUint32(&pm.acceptTxs, 1) + } + } + if head.NumberU64() > 0 { // We've completed a sync cycle, notify all peers of new state. This path is // essential in star-topology networks where a gateway node needs to notify // all its out-of-date peers of the availability of a new block. This failure diff --git a/eth/tracers/internal/tracers/assets.go b/eth/tracers/internal/tracers/assets.go index 04dd6fe89f57..d0a0bf7c1a19 100644 --- a/eth/tracers/internal/tracers/assets.go +++ b/eth/tracers/internal/tracers/assets.go @@ -1,14 +1,14 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: -// 4byte_tracer.js -// bigram_tracer.js -// call_tracer.js -// evmdis_tracer.js -// noop_tracer.js -// opcount_tracer.js -// prestate_tracer.js -// trigram_tracer.js -// unigram_tracer.js +// 4byte_tracer.js (2.933kB) +// bigram_tracer.js (1.712kB) +// call_tracer.js (8.643kB) +// evmdis_tracer.js (4.194kB) +// noop_tracer.js (1.271kB) +// opcount_tracer.js (1.372kB) +// prestate_tracer.js (4.234kB) +// trigram_tracer.js (1.788kB) +// unigram_tracer.js (1.51kB) package tracers @@ -28,7 +28,7 @@ import ( func bindataRead(data []byte, name string) ([]byte, error) { gz, err := gzip.NewReader(bytes.NewBuffer(data)) if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %v", name, err) } var buf bytes.Buffer @@ -36,7 +36,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %v", name, err) } if clErr != nil { return nil, err @@ -117,7 +117,7 @@ func bigram_tracerJs() (*asset, error) { return a, nil } -var _call_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x59\xdf\x6f\x1b\x37\xf2\x7f\x96\xfe\x8a\x49\x1e\x6a\x09\x51\x24\x27\xe9\xb7\x5f\xc0\xae\x7a\xd0\x39\x4a\x6a\xc0\x8d\x03\x5b\x69\x10\x04\x79\xa0\x76\x67\x25\xd6\x5c\x72\x4b\x72\x2d\xef\xa5\xfe\xdf\x0f\x33\xe4\xae\x56\x3f\xec\xe8\x7a\xb8\x43\xef\x45\xd0\x2e\x67\x86\xc3\x99\xcf\xfc\xe2\x8e\x46\x70\x66\x8a\xca\xca\xc5\xd2\xc3\xcb\xe3\x17\xff\x0f\xb3\x25\xc2\xc2\x3c\x47\xbf\x44\x8b\x65\x0e\x93\xd2\x2f\x8d\x75\xdd\xd1\x08\x66\x4b\xe9\x20\x93\x0a\x41\x3a\x28\x84\xf5\x60\x32\xf0\x5b\xf4\x4a\xce\xad\xb0\xd5\xb0\x3b\x1a\x05\x9e\xbd\xcb\x24\x21\xb3\x88\xe0\x4c\xe6\x57\xc2\xe2\x09\x54\xa6\x84\x44\x68\xb0\x98\x4a\xe7\xad\x9c\x97\x1e\x41\x7a\x10\x3a\x1d\x19\x0b\xb9\x49\x65\x56\x91\x48\xe9\xa1\xd4\x29\x5a\xde\xda\xa3\xcd\x5d\xad\xc7\xdb\x77\x1f\xe0\x02\x9d\x43\x0b\x6f\x51\xa3\x15\x0a\xde\x97\x73\x25\x13\xb8\x90\x09\x6a\x87\x20\x1c\x14\xf4\xc6\x2d\x31\x85\x39\x8b\x23\xc6\x37\xa4\xca\x75\x54\x05\xde\x98\x52\xa7\xc2\x4b\xa3\x07\x80\x92\x34\x87\x5b\xb4\x4e\x1a\x0d\xaf\xea\xad\xa2\xc0\x01\x18\x4b\x42\x7a\xc2\xd3\x01\x2c\x98\x82\xf8\xfa\x20\x74\x05\x4a\xf8\x35\xeb\x01\x06\x59\x9f\x3b\x05\xa9\x79\x9b\xa5\x29\x10\xfc\x52\x78\x3a\xf5\x4a\x2a\x05\x73\x84\xd2\x61\x56\xaa\x01\x49\x9b\x97\x1e\x3e\x9e\xcf\x7e\xbe\xfc\x30\x83\xc9\xbb\x4f\xf0\x71\x72\x75\x35\x79\x37\xfb\x74\x0a\x2b\xe9\x97\xa6\xf4\x80\xb7\x18\x44\xc9\xbc\x50\x12\x53\x58\x09\x6b\x85\xf6\x15\x98\x8c\x24\xfc\x32\xbd\x3a\xfb\x79\xf2\x6e\x36\xf9\xfb\xf9\xc5\xf9\xec\x13\x18\x0b\x6f\xce\x67\xef\xa6\xd7\xd7\xf0\xe6\xf2\x0a\x26\xf0\x7e\x72\x35\x3b\x3f\xfb\x70\x31\xb9\x82\xf7\x1f\xae\xde\x5f\x5e\x4f\x87\x70\x8d\xa4\x15\x12\xff\xb7\x6d\x9e\xb1\xf7\x2c\x42\x8a\x5e\x48\xe5\x6a\x4b\x7c\x32\x25\xb8\xa5\x29\x55\x0a\x4b\x71\x8b\x60\x31\x41\x79\x8b\x29\x08\x48\x4c\x51\x1d\xec\x54\x92\x25\x94\xd1\x0b\x3e\xf3\x83\x80\x84\xf3\x0c\xb4\xf1\x03\x70\x88\xf0\xe3\xd2\xfb\xe2\x64\x34\x5a\xad\x56\xc3\x85\x2e\x87\xc6\x2e\x46\x2a\x88\x73\xa3\x9f\x86\x5d\x92\x99\x08\xa5\x66\x56\x24\x68\xc9\x39\x02\xb2\x92\xcc\xaf\xcc\x4a\x83\xb7\x42\x3b\x91\x90\xab\xe9\x7f\xc2\x60\x14\x1e\xf0\x8e\x9e\xbc\x23\xd0\x82\xc5\xc2\x58\xfa\xaf\x54\x8d\x33\xa9\x3d\x5a\x2d\x14\xcb\x76\x90\x8b\x14\x61\x5e\x81\x68\x0b\x1c\xb4\x0f\x43\x30\x0a\xee\x06\xa9\x33\x63\x73\x86\xe5\xb0\xfb\xb5\xdb\x89\x1a\x3a\x2f\x92\x1b\x52\x90\xe4\x27\xa5\xb5\xa8\x3d\x99\xb2\xb4\x4e\xde\x22\x93\x40\xa0\x89\xf6\x9c\xfe\xfa\x0b\xe0\x1d\x26\x65\x90\xd4\x69\x84\x9c\xc0\xe7\xaf\xf7\x5f\x06\x5d\x16\x9d\xa2\x4b\x50\xa7\x98\xf2\xf9\x6e\x1c\xac\x96\x6c\x51\x58\xe1\xd1\x2d\xc2\x6f\xa5\xf3\x2d\x9a\xcc\x9a\x1c\x84\x06\x53\x12\xe2\xdb\xd6\x91\xda\x1b\x16\x28\xe8\xbf\x46\xcb\x1a\x0d\xbb\x9d\x86\xf9\x04\x32\xa1\x1c\xc6\x7d\x9d\xc7\x82\x4e\x23\xf5\xad\xb9\x21\xc9\xc6\x12\x84\x6d\x05\xa6\x48\x4c\x1a\x83\x81\xce\xd1\x1c\x03\xdd\xb0\xdb\x21\xbe\x13\xc8\x4a\xcd\xdb\xf6\x94\x59\x0c\x20\x9d\xf7\xe1\x6b\xb7\x43\x62\xcf\x44\xe1\x4b\x8b\x6c\x4f\xb4\xd6\x58\x07\x32\xcf\x31\x95\xc2\xa3\xaa\xba\x9d\xce\xad\xb0\x61\x01\xc6\xa0\xcc\x62\xb8\x40\x3f\xa5\xc7\x5e\xff\xb4\xdb\xe9\xc8\x0c\x7a\x61\xf5\xc9\x78\xcc\xd9\x27\x93\x1a\xd3\x20\xbe\xe3\x97\xd2\x0d\x33\x51\x2a\xdf\xec\x4b\x4c\x1d\x8b\xbe\xb4\x9a\xfe\xde\x07\x2d\x3e\x22\x18\xad\x2a\x48\x28\xcb\x88\x39\x85\xa7\xab\x9c\xc7\x3c\x1e\xce\x0d\x20\x13\x8e\x4c\x28\x33\x58\x21\x14\x16\x9f\x27\x4b\x24\xdf\xe9\x04\xa3\x96\xae\x72\xec\xd4\x31\xd0\x6e\x43\x53\x0c\xbd\x79\x57\xe6\x73\xb4\xbd\x3e\x7c\x07\xc7\x77\xd9\x71\x1f\xc6\x63\xfe\x53\xeb\x1e\x79\xa2\xbe\x24\xc5\x14\xf1\xa0\xcc\x7f\xed\xad\xd4\x8b\x70\xd6\xa8\xeb\x79\x06\x02\x34\xae\x20\x31\x9a\x41\x4d\x5e\x99\xa3\xd4\x0b\x48\x2c\x0a\x8f\xe9\x00\x44\x9a\x82\x37\x01\x79\x0d\xce\x36\xb7\x84\xef\xbe\xe3\xbd\xc6\x70\x74\x76\x35\x9d\xcc\xa6\x47\x2d\x25\xa4\xbe\xcc\xb2\xa8\x07\xf3\x0e\x0b\xc4\x9b\xde\x8b\xfe\xf0\x56\xa8\x12\x2f\xb3\xa0\x51\xa4\x9d\xea\x14\xc6\x91\xe7\xd9\x36\xcf\xcb\x0d\x1e\x62\x1a\x8d\x60\xe2\x1c\xe6\x73\x85\xbb\xb1\x17\x83\x93\xe3\xd4\x79\x4a\x4e\x04\xb4\xc4\xe4\x85\x42\x02\x50\xbd\x6b\xb4\x34\x6b\xdc\xf1\x55\x81\x27\x00\x00\xa6\x18\xf0\x0b\x82\x3d\xbf\xf0\xe6\x67\xbc\x63\x77\xd4\xd6\x22\x00\x4d\xd2\xd4\xa2\x73\xbd\x7e\x3f\x90\x4b\x5d\x94\xfe\x64\x83\x3c\xc7\xdc\xd8\x6a\xe8\x28\xf7\xf4\xf8\x68\x83\x70\xd2\x9a\x67\x21\xdc\xb9\x26\x9e\x08\xca\xb7\xc2\xf5\xd6\x4b\x67\xc6\xf9\x93\x7a\x89\x1e\xea\x35\xb6\x05\xb1\x1d\x1d\xdf\x1d\xed\x5a\xeb\xb8\xbf\x76\xfa\x8b\x1f\xfa\xc4\x72\x7f\xda\x40\xb9\xc9\x08\xc3\xa2\x74\xcb\x1e\x23\x67\xbd\xba\x8e\xfa\x31\x78\x5b\xe2\x5e\xa4\x33\x7a\x76\x91\xe3\x50\x65\x94\x36\xbc\x2d\x13\x46\xd0\x42\x70\x52\xe1\xa0\x16\x94\x64\x5d\x39\x67\x9b\x7b\x63\x1e\x04\xd2\xf5\xf4\xe2\xcd\xeb\xe9\xf5\xec\xea\xc3\xd9\xac\x0d\x27\x85\x99\x27\xa5\x36\xcf\xa0\x50\x2f\xfc\x92\xf5\x27\x71\x9b\xab\x9f\x89\xe7\xf9\x8b\x2f\xe1\x0d\x8c\xf7\x44\x77\xe7\x71\x0e\xf8\xfc\x85\x65\xdf\xef\x9a\x6f\x93\x34\x18\xf3\x6b\x00\x91\x29\xee\xdb\x39\x62\x4f\xd8\xe5\xe8\x97\x26\xe5\x3c\x98\x88\x90\x4a\x6b\x2b\xa6\x46\xe3\xc1\xc1\xd7\xab\xa3\x6f\x72\x71\x71\x04\x7f\xfc\x01\xad\xe7\xb3\xcb\xd7\xd3\xf6\xbb\xd7\xd3\x8b\xe9\xdb\xc9\x6c\xba\x4d\x7b\x3d\x9b\xcc\xce\xcf\xf8\x6d\x3f\x5a\x65\x34\x82\xeb\x1b\x59\x70\x42\xe5\x34\x65\xf2\x82\x3b\xc3\x46\x5f\x37\x00\xbf\x34\xd4\x73\xd9\x58\x2f\x32\xa1\x93\x3a\x8f\xbb\xda\x69\xde\x90\xcb\x4c\x1d\x2b\xbb\xa9\xa0\x0d\xd4\x7e\xe3\x46\xe9\xde\x5b\x8c\x9b\xa6\x3d\x6f\x6a\xbd\xd6\x06\x0d\x1e\xe1\x5c\xc7\x49\xa6\x77\xf8\x21\xe1\x6f\x70\x0c\x27\xf0\x22\x66\x92\x47\x52\xd5\x4b\x78\x46\xe2\xff\x44\xc2\x7a\xb5\x87\xf3\xaf\x99\xb6\xbc\x61\xe2\x9a\xdc\x9b\xff\x7e\x3a\x33\xa5\xbf\xcc\xb2\x13\xd8\x36\xe2\xf7\x3b\x46\x6c\xe8\x2f\x50\xef\xd2\xff\xdf\x0e\xfd\x3a\xf5\x11\xaa\x4c\x01\x4f\x76\x20\x12\x12\xcf\x93\xad\x38\x88\xc6\xe5\x6e\x86\xa5\xc1\xf8\x81\x64\xfb\x72\x13\xc3\x0f\x65\x8b\x7f\x2b\xd9\xee\xed\xca\xa8\xf7\xda\xec\xbb\x06\x60\xd1\x5b\x89\xb7\x34\x59\x1d\x39\x16\x49\xfd\xa9\x59\x09\x9d\xe0\x10\x3e\x62\x90\xa8\x11\x39\xb9\xc4\x7e\x96\xda\x11\x6e\xf1\xa8\x27\x8d\x93\x09\x43\x4c\x70\xdb\x69\x11\x72\x51\xd1\x64\x92\x95\xfa\xa6\x82\x85\x70\x90\x56\x5a\xe4\x32\x71\x41\x1e\xf7\xb2\x16\x17\xc2\xb2\x58\x8b\xbf\x97\xe8\x68\xcc\x21\x20\x8b\xc4\x97\x42\xa9\x0a\x16\x92\x66\x15\xe2\xee\xbd\x7c\x75\x7c\x0c\xce\xcb\x02\x75\x3a\x80\x1f\x5e\x8d\x7e\xf8\x1e\x6c\xa9\xb0\x3f\xec\xb6\xd2\x78\x73\xd4\xe8\x0d\x5a\x88\xe8\x79\x8d\x85\x5f\xf6\xfa\xf0\xd3\x03\xf5\xe0\x81\xe4\xbe\x97\x16\x9e\xc3\x8b\x2f\x43\xd2\x6b\xbc\x81\xdb\xe0\x49\x40\xe5\x30\x4a\xa3\xf9\xee\xf2\xf5\x65\xef\x46\x58\xa1\xc4\x1c\xfb\x27\x3c\xef\xb1\xad\x56\x22\x36\xfc\xe4\x14\x28\x94\x90\x1a\x44\x92\x98\x52\x7b\x32\x7c\xdd\xbb\xab\x8a\xf2\xfb\x91\xaf\xe5\xf1\x68\x24\x92\x04\x9d\xab\xd3\x3d\x7b\x8d\xd4\x11\x39\x71\x83\xd4\x4e\xa6\xd8\xf2\x0a\x65\x07\xc3\xa9\x39\x52\xd0\xe4\x58\x0b\xcc\x8d\xa3\x4d\xe6\x08\x2b\x4b\x73\x86\x93\x3a\xe1\x41\x3b\x45\xb2\xb6\x03\xa3\x41\x80\x32\x3c\xdd\x73\x8c\x83\xb0\x0b\x37\x0c\xf9\x9e\xb6\xa5\x9c\xa3\xcd\x6a\xb8\x09\xe4\x36\x54\xb9\xa3\xdf\x6a\x07\x34\xe0\x9d\x74\x9e\x1b\x48\xd2\x52\x3a\x08\x48\x96\x7a\x31\x80\xc2\x14\x9c\xa7\x0f\xec\x25\xaf\xa6\xbf\x4e\xaf\x9a\xe2\x7f\xb8\x13\xeb\x16\xff\x69\x33\x01\x81\xa5\xf1\xc2\x63\xfa\x74\x4f\xcf\xbe\x07\x50\xe3\x07\x00\x45\xf2\xd7\xb5\xf1\x7d\xeb\x38\x4a\x38\xbf\x76\xcc\x02\xc3\xf8\xd2\x56\xc0\x95\xca\xbb\xad\xdc\xbd\x9d\x1c\x4c\x51\x57\x08\x52\x8a\xd3\x0e\x25\xf6\x3d\x9d\x75\x34\xb8\x6f\x03\x4f\x40\xa0\x69\x25\x00\x5e\xaf\x3b\x34\x11\x72\x3e\x6b\x68\x4a\x4f\x4e\xa7\x2a\xbd\x4e\x71\x0b\xe1\x3e\x38\xf6\x6d\x4c\x72\x73\xb9\x38\xd7\xbe\x57\x2f\x9e\x6b\x78\x0e\xf5\x03\xa5\x6e\x78\xbe\x11\x2b\x7b\x72\x60\x27\x45\x85\x1e\x61\x2d\xe2\x14\xb6\x5e\x91\xa0\x70\x68\x36\x8d\x45\xbf\x5b\x82\x8f\xa3\x34\x32\xcb\x13\x8b\x7e\x88\xbf\x97\x42\xb9\xde\x71\xd3\x12\x84\x13\x78\xc3\x45\x6c\xdc\x94\xb1\xba\xce\x11\xcf\x46\x93\x11\x05\x06\xb6\x68\x8d\x9a\x2d\x9d\x87\xda\x94\xe2\xa3\x12\xa2\x88\x98\x1c\x1a\x8f\x45\xf8\xed\xeb\x32\x3b\x6d\x02\x78\xda\x94\xfd\x4c\x48\x55\x5a\x7c\x7a\x0a\x7b\x92\x8b\x2b\x6d\x26\x12\xf6\xa5\x43\xe0\x11\xd4\x81\x33\x39\x2e\xcd\x2a\x28\xb0\x2f\x45\xed\x82\xa3\xc1\xc1\x56\x91\xe0\xbb\x14\xe1\xa0\x74\x62\x81\x2d\x70\x34\x06\xaf\x1d\xb5\x77\x2e\xfe\xd3\xd0\x79\xd6\x3c\x7e\x03\x45\x61\x97\x6f\x42\xe3\x31\x6c\xec\xf5\xf2\x4e\x2f\x53\x13\x71\x47\xd3\x7a\xa8\x55\x0d\x0d\x47\x83\x9c\x7f\xc5\xef\xff\x19\xc7\x07\xcf\xc7\xdf\x43\x03\x6d\x9b\x36\x9c\x71\x93\x38\x9c\x74\xdd\xc4\x7c\x1b\x05\xcd\xea\x43\x00\x78\xa8\x3f\x22\xa8\xea\xdf\x30\xf1\x6b\xb8\x72\x4b\x43\x4f\x85\xc5\x5b\x69\x4a\xaa\x56\xf8\xbf\x34\xff\x35\xfd\xdd\x7d\xb7\x73\x1f\xef\xbc\xd8\x7d\xed\x4b\xaf\xd5\x32\xde\xd9\x86\xd6\xa8\x55\x2b\x0c\x17\xd2\x78\x15\x96\x85\xdb\xd4\x0e\xf3\x3f\x72\xf9\x15\xe3\xdd\x9b\x82\x6a\x7f\x2c\x45\xca\xa2\x48\xab\xa6\xfa\x0d\x42\xd7\x01\x4b\xa1\xd3\x38\x79\x88\x34\x95\x24\x8f\xb1\x48\x1a\x8a\x85\x90\xba\xbb\xd7\x8c\xdf\x2c\xb9\xfb\x90\xb1\xd3\xc8\xb6\xab\x66\x9c\x18\x69\xbc\x63\x8d\xbb\x07\x54\xc7\xad\x58\xda\xbe\xc7\x8b\x57\x81\x46\xbb\x32\xe7\xb6\x17\xc4\xad\x90\x4a\xd0\xa8\xc5\xed\x94\x4e\x21\x51\x28\x74\xb8\xbd\xc7\xcc\x9b\x5b\xb4\xae\x7b\x00\xc8\xff\x0c\xc6\xb7\x92\x63\xfd\x18\xcd\x71\x78\xcc\x1e\x1a\xb1\xe1\xf8\x6f\x94\xf0\x3e\xc2\xab\x65\xde\x10\x59\xd2\xf3\x87\x1d\xd4\xbe\x7b\x58\x48\x71\x83\x44\x34\x3f\xc1\x71\xab\x09\xff\xab\x04\xd9\x2e\xc4\x2e\x9a\x66\x2c\x1e\xde\x1b\x33\x00\x85\x82\x47\xa2\xfa\xb3\x4b\xdd\x7c\x3e\x36\xa1\xd5\xd1\x1b\xda\xb7\x9d\xf0\xe5\x4b\xac\x25\xd6\xd7\x1d\xa1\x8f\x9f\x23\x6a\x90\x1e\xad\xa0\xe1\x87\xd0\x15\xbf\x14\x90\x96\x8e\xc5\xb1\x5f\x24\x05\x5d\x14\x1c\xaf\xed\xa9\x3e\x4b\xbd\x18\x76\x3b\xe1\x7d\x2b\xde\x13\x7f\xb7\x8e\xf7\x50\x0c\x99\x33\x5e\x00\x34\xf3\x7f\xe2\xef\xb8\x67\xe4\x19\x79\xeb\x12\x80\xd6\xe8\x55\x18\xa0\xb7\x46\x7e\x66\x8c\x63\xff\xf6\xcd\x22\xad\xf1\xbb\x0d\x80\x33\xe9\x42\xb8\x20\x66\x2b\x24\xfc\xdd\x6e\x44\xd4\x0c\x14\x0c\x27\xfb\x19\x68\x69\x0f\xd3\xd6\x35\x04\x11\xf3\xab\xb0\x1a\x0a\xfb\x49\x7b\x35\xbc\x8a\x07\x95\x79\xcb\x36\x32\x67\xdb\xdc\x9f\xee\x4f\x72\xc7\x35\x1e\xf7\x27\x33\xb2\x79\x03\xd8\x07\x58\xdb\x83\xc5\x2e\xc9\x63\xa9\x92\xa5\xd7\x99\xed\x01\x56\x96\xde\x6a\x3d\xfc\xdd\xe1\x22\x1b\xe2\xb6\x8a\x1b\x34\xfb\x84\xc4\x3c\x13\xe9\x82\x65\x6b\x01\x01\xd5\x41\x57\x46\xb4\xfc\x07\x46\x89\xed\xf8\xa9\x97\xc0\x62\xf8\xb0\xc0\x0d\x29\x85\x8f\x99\x73\xf1\x2f\x1d\xcd\x8c\xeb\xb8\x48\xd1\x49\x8b\x29\x64\x12\x55\x0a\x26\x45\xcb\x13\xe9\x6f\xce\xe8\xf0\x09\x09\xad\x24\x89\xe1\x53\x59\xf8\x6a\xcd\x1f\xf0\xb4\x4c\xd0\x57\x90\xa1\xe0\x6f\x41\xde\x40\x21\x9c\x83\x1c\x05\xcd\xa0\x59\xa9\x54\x05\xc6\xa6\x48\xc2\x9b\xa1\x8c\x42\xd2\x40\xe9\xd0\x3a\x58\x2d\x4d\x2c\x93\xdc\xa5\x15\xd4\x74\x4a\x3f\x88\xf7\x2e\xd2\x15\x4a\x54\x20\x3d\x95\xe4\x78\xa8\x76\x94\x36\x1f\x60\xf8\x2b\x8e\xa1\xaa\xbb\x1b\xa2\xf5\x5c\xb7\x19\xa3\xfc\x9a\x9e\x36\xa3\x33\xce\x35\x9b\x71\xb9\xbe\x91\xda\x0c\xc2\xba\x6c\x6c\x46\x5a\xbb\x08\x6d\x86\x13\xaf\xf0\xd3\x66\x20\xb5\xfa\x65\x5e\x60\x70\x34\x0c\xfc\xb4\x15\x5a\xac\x65\x8c\xad\xf0\xb9\xb1\x21\xe7\xa7\x41\x04\x0c\x79\xb1\x47\xc6\xb9\xc1\x8a\x32\x71\xb0\x51\xab\xac\x84\x17\x9f\x6f\xb0\xfa\xb2\xbf\x8a\x44\x38\xb6\xe8\x9a\xb2\x51\x43\x3a\xac\x3d\x12\xc8\x8d\x16\x72\x7c\x7c\x0a\xf2\xc7\x36\x43\x5d\xf9\x40\x3e\x7b\x56\xef\xd9\x5e\xff\x2c\xbf\xd4\xd1\xd9\x20\x7e\x6b\xbd\xbf\xa1\x51\x8c\x91\x40\x43\x41\xd1\xbd\xef\xfe\x33\x00\x00\xff\xff\xb5\x25\x8b\x4d\x94\x21\x00\x00") +var _call_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x59\x5f\x6f\x1b\xb7\xb2\x7f\x96\x3e\xc5\x24\x0f\xb5\x84\x28\x92\x93\xf4\xf6\x02\x76\xd5\x0b\x5d\x47\x49\x0d\xb8\x71\x60\x2b\x0d\x82\x20\x0f\xd4\xee\xac\xc4\x9a\x4b\x6e\x49\xae\xe4\x3d\xa9\xbf\xfb\xc1\x0c\xb9\xab\xd5\x1f\x3b\x6e\x0f\xce\x41\xcf\x8b\xa0\x5d\xce\x0c\x87\x33\xbf\xf9\xc7\x1d\x8d\xe0\xcc\x14\x95\x95\x8b\xa5\x87\x97\xc7\x2f\xfe\x17\x66\x4b\x84\x85\x79\x8e\x7e\x89\x16\xcb\x1c\x26\xa5\x5f\x1a\xeb\xba\xa3\x11\xcc\x96\xd2\x41\x26\x15\x82\x74\x50\x08\xeb\xc1\x64\xe0\x77\xe8\x95\x9c\x5b\x61\xab\x61\x77\x34\x0a\x3c\x07\x97\x49\x42\x66\x11\xc1\x99\xcc\xaf\x85\xc5\x13\xa8\x4c\x09\x89\xd0\x60\x31\x95\xce\x5b\x39\x2f\x3d\x82\xf4\x20\x74\x3a\x32\x16\x72\x93\xca\xac\x22\x91\xd2\x43\xa9\x53\xb4\xbc\xb5\x47\x9b\xbb\x5a\x8f\xb7\xef\x3e\xc0\x05\x3a\x87\x16\xde\xa2\x46\x2b\x14\xbc\x2f\xe7\x4a\x26\x70\x21\x13\xd4\x0e\x41\x38\x28\xe8\x8d\x5b\x62\x0a\x73\x16\x47\x8c\x6f\x48\x95\xeb\xa8\x0a\xbc\x31\xa5\x4e\x85\x97\x46\x0f\x00\x25\x69\x0e\x2b\xb4\x4e\x1a\x0d\xaf\xea\xad\xa2\xc0\x01\x18\x4b\x42\x7a\xc2\xd3\x01\x2c\x98\x82\xf8\xfa\x20\x74\x05\x4a\xf8\x0d\xeb\x23\x0c\xb2\x39\x77\x0a\x52\xf3\x36\x4b\x53\x20\xf8\xa5\xf0\x74\xea\xb5\x54\x0a\xe6\x08\xa5\xc3\xac\x54\x03\x92\x36\x2f\x3d\x7c\x3c\x9f\xfd\x7c\xf9\x61\x06\x93\x77\x9f\xe0\xe3\xe4\xea\x6a\xf2\x6e\xf6\xe9\x14\xd6\xd2\x2f\x4d\xe9\x01\x57\x18\x44\xc9\xbc\x50\x12\x53\x58\x0b\x6b\x85\xf6\x15\x98\x8c\x24\xfc\x32\xbd\x3a\xfb\x79\xf2\x6e\x36\xf9\xff\xf3\x8b\xf3\xd9\x27\x30\x16\xde\x9c\xcf\xde\x4d\xaf\xaf\xe1\xcd\xe5\x15\x4c\xe0\xfd\xe4\x6a\x76\x7e\xf6\xe1\x62\x72\x05\xef\x3f\x5c\xbd\xbf\xbc\x9e\x0e\xe1\x1a\x49\x2b\x24\xfe\x6f\xdb\x3c\x63\xef\x59\x84\x14\xbd\x90\xca\xd5\x96\xf8\x64\x4a\x70\x4b\x53\xaa\x14\x96\x62\x85\x60\x31\x41\xb9\xc2\x14\x04\x24\xa6\xa8\x1e\xed\x54\x92\x25\x94\xd1\x0b\x3e\xf3\xbd\x80\x84\xf3\x0c\xb4\xf1\x03\x70\x88\xf0\xe3\xd2\xfb\xe2\x64\x34\x5a\xaf\xd7\xc3\x85\x2e\x87\xc6\x2e\x46\x2a\x88\x73\xa3\x9f\x86\x5d\x92\x99\x08\xa5\x66\x56\x24\x68\xc9\x39\x02\xb2\x92\xcc\xaf\xcc\x5a\x83\xb7\x42\x3b\x91\x90\xab\xe9\x7f\xc2\x60\x14\x1e\xf0\x96\x9e\xbc\x23\xd0\x82\xc5\xc2\x58\xfa\xaf\x54\x8d\x33\xa9\x3d\x5a\x2d\x14\xcb\x76\x90\x8b\x14\x61\x5e\x81\x68\x0b\x1c\xb4\x0f\x43\x30\x0a\xee\x06\xa9\x33\x63\x73\x86\xe5\xb0\xfb\xb5\xdb\x89\x1a\x3a\x2f\x92\x1b\x52\x90\xe4\x27\xa5\xb5\xa8\x3d\x99\xb2\xb4\x4e\xae\x90\x49\x20\xd0\x44\x7b\x4e\x7f\xfd\x05\xf0\x16\x93\x32\x48\xea\x34\x42\x4e\xe0\xf3\xd7\xbb\x2f\x83\x2e\x8b\x4e\xd1\x25\xa8\x53\x4c\xf9\x7c\x37\x0e\xd6\x4b\xb6\x28\xac\xf1\x68\x85\xf0\x5b\xe9\x7c\x8b\x26\xb3\x26\x07\xa1\xc1\x94\x84\xf8\xb6\x75\xa4\xf6\x86\x05\x0a\xfa\xaf\xd1\xb2\x46\xc3\x6e\xa7\x61\x3e\x81\x4c\x28\x87\x71\x5f\xe7\xb1\xa0\xd3\x48\xbd\x32\x37\x24\xd9\x58\x82\xb0\xad\xc0\x14\x89\x49\x63\x30\xd0\x39\x9a\x63\xa0\x1b\x76\x3b\xc4\x77\x02\x59\xa9\x79\xdb\x9e\x32\x8b\x01\xa4\xf3\x3e\x7c\xed\x76\x48\xec\x99\x28\x7c\x69\x91\xed\x89\xd6\x1a\xeb\x40\xe6\x39\xa6\x52\x78\x54\x55\xb7\xd3\x59\x09\x1b\x16\x60\x0c\xca\x2c\x86\x0b\xf4\x53\x7a\xec\xf5\x4f\xbb\x9d\x8e\xcc\xa0\x17\x56\x9f\x8c\xc7\x9c\x7d\x32\xa9\x31\x0d\xe2\x3b\x7e\x29\xdd\x30\x13\xa5\xf2\xcd\xbe\xc4\xd4\xb1\xe8\x4b\xab\xe9\xef\x5d\xd0\xe2\x23\x82\xd1\xaa\x82\x84\xb2\x8c\x98\x53\x78\xba\xca\x79\xcc\xe3\xe1\xdc\x00\x32\xe1\xc8\x84\x32\x83\x35\x42\x61\xf1\x79\xb2\x44\xf2\x9d\x4e\x30\x6a\xe9\x2a\xc7\x4e\x1d\x03\xed\x36\x34\xc5\xd0\x9b\x77\x65\x3e\x47\xdb\xeb\xc3\x77\x70\x7c\x9b\x1d\xf7\x61\x3c\xe6\x3f\xb5\xee\x91\x27\xea\x4b\x52\x4c\x11\x0f\xca\xfc\xd7\xde\x4a\xbd\x08\x67\x8d\xba\x9e\x67\x20\x40\xe3\x1a\x12\xa3\x19\xd4\xe4\x95\x39\x4a\xbd\x80\xc4\xa2\xf0\x98\x0e\x40\xa4\x29\x78\x13\x90\xd7\xe0\x6c\x7b\x4b\xf8\xee\x3b\xe8\xd1\x66\x63\x38\x3a\xbb\x9a\x4e\x66\xd3\x23\xf8\xe3\x0f\x08\x6f\x9e\x86\x37\x2f\x9f\xf6\x5b\x9a\x49\x7d\x99\x65\x51\x39\x16\x38\x2c\x10\x6f\x7a\x2f\xfa\xc3\x95\x50\x25\x5e\x66\x41\xcd\x48\x3b\xd5\x29\x8c\x23\xcf\xb3\x5d\x9e\x97\x5b\x3c\xc4\x34\x1a\xc1\xc4\x39\xcc\xe7\x0a\xf7\x03\x32\x46\x2c\x07\xaf\xf3\x94\xb1\x08\x7d\x89\xc9\x0b\x85\x84\xaa\x7a\xd7\x68\x7e\xd6\xb8\xe3\xab\x02\x4f\x00\x00\x4c\x31\xe0\x17\x14\x0b\xfc\xc2\x9b\x9f\xf1\x96\x7d\x54\x9b\x90\x50\x35\x49\x53\x8b\xce\xf5\xfa\xfd\x40\x2e\x75\x51\xfa\x93\x2d\xf2\x1c\x73\x63\xab\xa1\xa3\x84\xd4\xe3\xa3\x0d\xc2\x49\x6b\x9e\x85\x70\xe7\x9a\x78\x22\x52\xdf\x0a\xd7\xdb\x2c\x9d\x19\xe7\x4f\xea\x25\x7a\xa8\xd7\xd8\x16\xc4\x76\x74\x7c\x7b\xb4\x6f\xad\xe3\xfe\x06\x09\x2f\x7e\xe8\x13\xcb\xdd\x69\x83\xef\x26\x4d\x0c\x8b\xd2\x2d\x7b\x0c\xa7\xcd\xea\x26\x15\x8c\xc1\xdb\x12\x0f\xc2\x9f\x21\xb5\x0f\x27\x87\x2a\xa3\x5c\xe2\x6d\x99\x30\xac\x16\x82\x33\x0d\x47\xba\xa0\xcc\xeb\xca\x39\xdb\xdc\x1b\xb3\x8f\xae\x08\xae\xeb\xe9\xc5\x9b\xd7\xd3\xeb\xd9\xd5\x87\xb3\xd9\x51\x0b\x4e\x0a\x33\x4f\x4a\x6d\x9f\x41\xa1\x5e\xf8\x25\xeb\x4f\xe2\xb6\x57\x3f\x13\xcf\xf3\x17\x5f\xc2\x1b\x18\x1f\x08\xf9\xce\xc3\x1c\xf0\xf9\x0b\xcb\xbe\xdb\x37\xdf\x36\x69\x30\xe6\xd7\x00\x22\x53\xdc\xb5\x13\xc7\x81\x58\xcc\xd1\x2f\x4d\xca\xc9\x31\x11\x21\xbf\xd6\x56\x4c\x8d\xc6\x3f\x1f\x91\x93\x8b\x8b\x56\x3c\xf2\xf3\xd9\xe5\xeb\x76\x8c\x1e\xbd\x9e\x5e\x4c\xdf\x4e\x66\xd3\x5d\xda\xeb\xd9\x64\x76\x7e\xc6\x6f\xeb\xf0\x1d\x8d\xe0\xfa\x46\x16\x9c\x65\x39\x77\x99\xbc\xe0\x76\xb1\xd1\xd7\x0d\xc0\x2f\x0d\x35\x62\x36\x16\x91\x4c\xe8\xa4\x4e\xee\xae\x76\x9a\x37\xe4\x32\x53\xc7\xca\x7e\x2a\x68\x03\xb5\xdf\xb8\x51\xba\xf7\x16\xe3\xa6\x69\xcf\x9b\x5a\xaf\x8d\x41\x83\x47\x38\x01\x72\x92\xe9\x3d\xfe\x90\xf0\x7f\x70\x0c\x27\xf0\x22\x66\x92\x07\x52\xd5\x4b\x78\x46\xe2\xff\x42\xc2\x7a\x75\x80\xf3\xef\x99\xb6\xbc\x61\xe2\x9a\xdc\x9b\xff\x7c\x3a\x33\xa5\xbf\xcc\xb2\x13\xd8\x35\xe2\xf7\x7b\x46\x6c\xe8\x2f\x50\xef\xd3\xff\xcf\x1e\xfd\x26\xf5\x11\xaa\x4c\x01\x4f\xf6\x20\x12\x12\xcf\x93\x9d\x38\x88\xc6\xe5\x16\x87\xa5\xc1\xf8\x9e\x64\xfb\x72\x1b\xc3\xf7\x65\x8b\x7f\x29\xd9\x1e\x6c\xd5\xa8\x21\xdb\x6e\xc6\x06\x60\xd1\x5b\x89\x2b\x1a\xb7\x8e\x1c\x8b\xa4\xa6\xd5\xac\x85\x4e\x70\x08\x1f\x31\x48\xd4\x88\x9c\x5c\x62\x93\x4b\x3d\x0a\xf7\x7d\xd4\xa8\xc6\x71\x85\x21\x26\xb8\x17\xb5\x08\xb9\xa8\x68\x5c\xc9\x4a\x7d\x53\xc1\x42\x38\x48\x2b\x2d\x72\x99\xb8\x20\x8f\x1b\x5c\x8b\x0b\x61\x59\xac\xc5\xdf\x4b\x74\x34\xfb\x10\x90\x45\xe2\x4b\xa1\x54\x05\x0b\x49\x03\x0c\x71\xf7\x5e\xbe\x3a\x3e\x06\xe7\x65\x81\x3a\x1d\xc0\x0f\xaf\x46\x3f\x7c\x0f\xb6\x54\xd8\x1f\x76\x5b\x69\xbc\x39\x6a\xf4\x06\x2d\x44\xf4\xbc\xc6\xc2\x2f\x7b\x7d\xf8\xe9\x9e\x7a\x70\x4f\x72\x3f\x48\x0b\xcf\xe1\xc5\x97\x21\xe9\x35\xde\xc2\x6d\xf0\x24\xa0\x72\x18\xa5\xd1\xd0\x77\xf9\xfa\xb2\x77\x23\xac\x50\x62\x8e\xfd\x13\x1e\x02\xd9\x56\x6b\x11\xa7\x00\x72\x0a\x14\x4a\x48\x0d\x22\x49\x4c\xa9\x3d\x19\xbe\x6e\xe8\x55\x45\xf9\xfd\xc8\xd7\xf2\x78\x5e\x12\x49\x82\xce\xd5\xe9\x9e\xbd\x46\xea\x88\x9c\xb8\x41\x6a\x27\x53\x6c\x79\x85\xb2\x83\xe1\xd4\x1c\x29\x68\x9c\xac\x05\xe6\xc6\xd1\x26\x73\x84\xb5\xa5\xe1\xc3\x49\x9d\xf0\xf4\x9d\x22\x59\xdb\x81\xd1\x20\x40\x19\x1e\xf9\x39\xc6\x41\xd8\x85\x1b\x86\x7c\x4f\xdb\x52\xce\xd1\x66\x3d\xdc\x06\x72\x1b\xaa\xdc\xe6\xef\xb4\x03\x1a\xf0\x56\x3a\xcf\x5d\x25\x69\x29\x1d\x04\x24\x4b\xbd\x18\x40\x61\x0a\xce\xd3\xdf\x2a\x67\x31\x59\x5f\x4d\x7f\x9d\x5e\x35\xc5\xff\xf1\x4e\xac\xfb\xfe\xa7\xcd\x58\x04\x96\x66\x0e\x8f\xe9\xd3\x03\x8d\xfc\x01\x40\x8d\xef\x01\x14\xc9\xdf\xd4\xc6\xf7\xad\xe3\x28\xe1\xfc\xc6\x31\x0b\x0c\x33\x4d\x5b\x01\x57\x2a\xef\x76\x72\xf7\x6e\x72\x30\x45\x5d\x21\x48\x29\x4e\x3b\x94\xd8\x77\xbb\xed\xad\x85\x4d\xd3\xbd\xc1\xe7\x79\xcb\xc6\x6b\x6e\xb9\x02\x51\x2b\x35\xf0\x7a\xdd\xbb\x89\x50\x0d\x58\x77\x53\x7a\x82\x03\xd5\xef\x4d\xf2\x5b\x08\xf7\xc1\xb1\xd7\x63\xfa\x9b\xcb\xc5\xb9\xf6\xbd\x7a\xf1\x5c\xc3\x73\xa8\x1f\x28\xa9\xc3\xf3\xad\x28\x3a\x90\x1d\x3b\x29\x2a\xf4\x08\x1b\x11\xa7\xb0\xf3\x8a\x04\x05\x73\xb0\xd1\x2c\xfa\xfd\xe2\x7c\x1c\xa5\x91\xc1\x9e\x58\xf4\x43\xfc\xbd\x14\xca\xf5\x8e\x9b\x66\x21\x9c\xc0\x1b\x2e\x6f\xe3\xa6\xc0\xd5\x15\x90\x78\xb6\xda\x8f\x28\x30\xb0\x45\x6b\xd4\x6c\xe9\x3c\x54\xad\x14\x1f\x94\x10\x45\xc4\xb4\xd1\xf8\x32\x02\xf3\x50\xff\xd9\x69\x13\xc0\xd3\xa6\x21\xc8\x84\x54\xa5\xc5\xa7\xa7\x70\x20\xed\xb8\xd2\x66\x22\x61\x5f\x3a\x04\x9e\x58\x1d\x38\x93\xe3\xd2\xac\x83\x02\x87\x92\xd7\x3e\x38\x1a\x1c\xec\x94\x0f\xbe\x7a\x11\x0e\x4a\x27\x16\xd8\x02\x47\x63\xf0\xda\x51\x07\xc7\xe8\xbf\x0c\x9d\x67\xcd\xe3\x37\x50\x14\x76\xf9\x26\x34\x1e\xc2\xc6\x41\x2f\xef\x75\x39\x35\x11\xf7\x3a\xad\x87\x5a\xd5\xd0\x8a\x34\xc8\xf9\x33\x7e\xff\xf7\x38\x3e\x78\x3e\xfe\x3e\x36\xd0\x76\x69\xc3\x19\xb7\x89\xc3\x49\x37\xed\xcd\xb7\x51\xd0\xac\xde\x07\x80\xfb\x3a\x27\x82\xaa\xfe\x0d\x13\xbf\x81\x2b\x37\x3b\xf4\x54\x58\x5c\x49\x53\x52\x1d\xc3\xff\xa6\xc9\xb0\xe9\xfc\xee\xba\x9d\xbb\x78\x45\xc6\xee\x6b\xdf\x91\xad\x97\xf1\x8a\x37\x34\x4d\xad\x2a\x62\xb8\xc4\xc6\x9b\xb3\x2c\x5c\xbe\x76\x98\xff\x81\xbb\xb2\x18\xef\xde\x14\xd4\x15\xc4\x22\xa5\x2c\x8a\xb4\x6a\xea\xe2\x20\xf4\x23\xb0\x14\x3a\x8d\x33\x89\x48\x53\x49\xf2\x18\x8b\xa4\xa1\x58\x08\xa9\xbb\x07\xcd\xf8\xcd\x62\x7c\x08\x19\x7b\x2d\x6e\xbb\x9e\xc6\x59\x92\x06\x3f\xd6\xb8\xfb\x88\xba\xb9\x13\x4b\xbb\xd7\x7e\xf1\xe6\xd0\x68\x57\xe6\xdc\x10\x83\x58\x09\xa9\x04\x0d\x61\xdc\x68\xe9\x14\x12\x85\x42\x87\xcb\x7e\xcc\xbc\x59\xa1\x75\xdd\x47\x80\xfc\xaf\x60\x7c\x27\x39\xd6\x8f\xd1\x1c\x8f\x8f\xd9\xc7\x46\x6c\x38\xfe\x1b\x25\xbc\x8f\xf0\x6a\x99\x37\x44\x96\xf4\xfc\x1d\x08\xb5\xef\x3e\x2e\xa4\xb8\x75\x22\x9a\x9f\xe0\xb8\xd5\x9e\xff\x5d\x82\x6c\x1f\x62\x17\x4d\x9b\x16\x0f\xef\x8d\x19\x80\x42\xc1\xc3\x52\xfd\x95\xa6\x6e\x4b\x1f\x9a\xdd\xea\xe8\x0d\x8d\xdd\x5e\xf8\xf2\xf5\xd6\x12\xeb\x8b\x90\xd0\xe1\xcf\x11\x35\x48\x8f\x56\xd0\x58\x44\xe8\x8a\x1f\x16\x48\x4b\xc7\xe2\xd8\x2f\x92\x82\x2e\x0a\x8e\xb7\xfc\x54\x9f\xa5\x5e\x0c\xbb\x9d\xf0\xbe\x15\xef\x89\xbf\xdd\xc4\x7b\x28\x86\xcc\x19\xaf\x06\x9a\x9b\x81\xc4\xdf\x72\xd3\xc8\xd3\xf3\xce\xf5\x00\xad\xd1\xab\x30\x5a\xef\x5c\x06\x30\x63\xbc\x10\xd8\xbd\x73\xa4\x35\x7e\xb7\x05\x70\x26\x5d\x08\x17\xc4\xec\x84\x84\xbf\xdd\x8f\x88\x9a\x81\x82\xe1\xe4\x30\x03\x2d\x1d\x60\xda\xb9\xa0\x20\x62\x7e\x15\x56\x43\x61\x3f\x69\xaf\x86\x57\xf1\xa0\x32\x6f\xd9\x46\xe6\x6c\x9b\xbb\xd3\xc3\x49\xee\xb8\xc6\xe3\xe1\x64\x46\x36\x6f\x00\x7b\x0f\x6b\x7b\xe4\xd8\x27\x79\x28\x55\xb2\xf4\x3a\xb3\xdd\xc3\xca\xd2\x5b\xad\x87\xbf\x7d\xbc\xc8\x86\xb8\xad\xe2\x16\xcd\x21\x21\x31\xcf\x44\xba\x60\xd9\x5a\x40\x40\x75\xd0\x95\x11\x2d\xff\x81\x51\x62\x3b\x7e\xea\x25\xb0\x18\xbe\x43\x70\x43\x4a\xe1\x63\xe6\x5c\xfc\x4b\x47\xd3\xe4\x26\x2e\x52\x74\xd2\x62\x0a\x99\x44\x95\x82\x49\xd1\xf2\xac\xfa\x9b\x33\x3a\x7c\x71\x42\x2b\x49\x62\xf8\xb2\x16\x3e\x72\xf3\xf7\x3e\x2d\x13\xf4\x15\x64\x28\xf8\xd3\x91\x37\x50\x08\xe7\x20\x47\x41\xd3\x69\x56\x2a\x55\x81\xb1\x29\x92\xf0\x66\x5c\xa3\x90\x34\x50\x3a\xb4\x0e\xd6\x4b\x13\xcb\x24\x77\x69\x05\x35\x9d\xd2\x0f\xe2\x8d\x8c\x74\x85\x12\x15\x48\x4f\x25\x39\x1e\xaa\x1d\xa5\xcd\xf7\x1a\xfe\xe8\x63\xa8\xea\xee\x87\x68\x3d\xd8\x6d\xc7\x28\xbf\xa6\xa7\xed\xe8\x8c\x73\xcd\x76\x5c\x6e\xee\xaa\xb6\x83\xb0\x2e\x1b\xdb\x91\xd6\x2e\x42\xdb\xe1\xc4\x2b\xfc\xb4\x1d\x48\xad\x7e\x99\x17\x18\x1c\x0d\x03\x3f\xed\x84\x16\x6b\x19\x63\x2b\x7c\x9d\x6c\xc8\xf9\x69\x10\x01\x43\x5e\xec\x91\x71\x6e\xb0\xa2\x4c\x1c\x6c\xd4\x2a\x2b\xe1\xc5\xe7\x1b\xac\xbe\x1c\xae\x22\x11\x8e\x2d\xba\xa6\x6c\xd4\x90\x0e\x6b\x0f\x04\x72\xa3\x85\x1c\x1f\x9f\x82\xfc\xb1\xcd\x50\x57\x3e\x90\xcf\x9e\xd5\x7b\xb6\xd7\x3f\xcb\x2f\x75\x74\x36\x88\xdf\x59\xef\x6f\x69\x14\x63\x24\xd0\x50\x50\x74\xef\xba\xff\x0c\x00\x00\xff\xff\x00\x24\x55\x1f\xc3\x21\x00\x00") func call_tracerJsBytes() ([]byte, error) { return bindataRead( @@ -133,7 +133,7 @@ func call_tracerJs() (*asset, error) { } info := bindataFileInfo{name: "call_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0xb3, 0xb6, 0xe8, 0x19, 0xc3, 0xa, 0xce, 0xfd, 0x50, 0x84, 0xf7, 0x8a, 0xc5, 0x99, 0x10, 0x58, 0xc4, 0x69, 0xfb, 0x8, 0xad, 0x67, 0xea, 0x12, 0x38, 0xcb, 0xd, 0x2a, 0x94, 0xa1, 0x70}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe9, 0xef, 0x68, 0xda, 0xd8, 0x9, 0xf5, 0xd5, 0x71, 0xa8, 0x8a, 0xfb, 0x30, 0xe8, 0xf0, 0x72, 0x14, 0x36, 0x6b, 0x62, 0x5a, 0x4e, 0xff, 0x16, 0xdc, 0xd3, 0x2c, 0x68, 0x7b, 0x79, 0x9f, 0xd3}} return a, nil } @@ -197,7 +197,7 @@ func opcount_tracerJs() (*asset, error) { return a, nil } -var _prestate_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x57\xdd\x6f\x1b\xb9\x11\x7f\xde\xfd\x2b\xa6\x7e\x91\x84\x53\x56\xce\x15\xb8\x02\x72\x5d\x60\xa3\x28\x89\x00\x9d\x6d\x48\x4a\x5d\xf7\x70\x0f\x5c\x72\x76\xc5\x13\x45\x2e\x48\xae\x3e\x10\xf8\x7f\x2f\x86\xfb\x21\xcb\x67\x27\x6e\xeb\x27\x2f\x39\xfc\xcd\xf7\x6f\x46\xa3\x11\x4c\x4c\x79\xb4\xb2\x58\x7b\xf8\xf9\xf2\xfd\xdf\x60\xb5\x46\x28\xcc\x3b\xf4\x6b\xb4\x58\x6d\x21\xad\xfc\xda\x58\x17\x8f\x46\xb0\x5a\x4b\x07\xb9\x54\x08\xd2\x41\xc9\xac\x07\x93\x83\x7f\x26\xaf\x64\x66\x99\x3d\x26\xf1\x68\x54\xbf\x79\xf1\x9a\x10\x72\x8b\x08\xce\xe4\x7e\xcf\x2c\x8e\xe1\x68\x2a\xe0\x4c\x83\x45\x21\x9d\xb7\x32\xab\x3c\x82\xf4\xc0\xb4\x18\x19\x0b\x5b\x23\x64\x7e\x24\x48\xe9\xa1\xd2\x02\x6d\x50\xed\xd1\x6e\x5d\x6b\xc7\xe7\x9b\xaf\x30\x47\xe7\xd0\xc2\x67\xd4\x68\x99\x82\xbb\x2a\x53\x92\xc3\x5c\x72\xd4\x0e\x81\x39\x28\xe9\xc4\xad\x51\x40\x16\xe0\xe8\xe1\x27\x32\x65\xd9\x98\x02\x9f\x4c\xa5\x05\xf3\xd2\xe8\x21\xa0\x24\xcb\x61\x87\xd6\x49\xa3\xe1\xaf\xad\xaa\x06\x70\x08\xc6\x12\x48\x9f\x79\x72\xc0\x82\x29\xe9\xdd\x00\x98\x3e\x82\x62\xfe\xf4\xf4\x0d\x01\x39\xf9\x2d\x40\xea\xa0\x66\x6d\x4a\x04\xbf\x66\x9e\xbc\xde\x4b\xa5\x20\x43\xa8\x1c\xe6\x95\x1a\x12\x5a\x56\x79\xb8\x9f\xad\xbe\xdc\x7e\x5d\x41\x7a\xf3\x00\xf7\xe9\x62\x91\xde\xac\x1e\xae\x60\x2f\xfd\xda\x54\x1e\x70\x87\x35\x94\xdc\x96\x4a\xa2\x80\x3d\xb3\x96\x69\x7f\x04\x93\x13\xc2\xaf\xd3\xc5\xe4\x4b\x7a\xb3\x4a\x3f\xcc\xe6\xb3\xd5\x03\x18\x0b\x9f\x66\xab\x9b\xe9\x72\x09\x9f\x6e\x17\x90\xc2\x5d\xba\x58\xcd\x26\x5f\xe7\xe9\x02\xee\xbe\x2e\xee\x6e\x97\xd3\x04\x96\x48\x56\x21\xbd\xff\x71\xcc\xf3\x90\x3d\x8b\x20\xd0\x33\xa9\x5c\x1b\x89\x07\x53\x81\x5b\x9b\x4a\x09\x58\xb3\x1d\x82\x45\x8e\x72\x87\x02\x18\x70\x53\x1e\xdf\x9c\x54\xc2\x62\xca\xe8\x22\xf8\xfc\x6a\x41\xc2\x2c\x07\x6d\xfc\x10\x1c\x22\xfc\x7d\xed\x7d\x39\x1e\x8d\xf6\xfb\x7d\x52\xe8\x2a\x31\xb6\x18\xa9\x1a\xce\x8d\xfe\x91\xc4\x84\x59\x5a\x74\x9e\x79\x5c\x59\xc6\xd1\x82\xa9\x7c\x59\x79\x07\xae\xca\x73\xc9\x25\x6a\x0f\x52\xe7\xc6\x6e\x43\xa5\x80\x37\xc0\x2d\x32\x8f\xc0\x40\x19\xce\x14\xe0\x01\x79\x15\xee\xea\x48\x87\x72\xb5\x4c\x3b\xc6\xc3\x69\x6e\xcd\x96\x7c\xad\x9c\xa7\x7f\x9c\xc3\x6d\xa6\x50\x40\x81\x1a\x9d\x74\x90\x29\xc3\x37\x49\xfc\x2d\x8e\x9e\x18\x43\x75\x12\x3c\x6c\x84\x42\x6d\xec\xb1\x67\x11\xb2\x4a\x2a\x21\x75\x91\xc4\x51\x2b\x3d\x06\x5d\x29\x35\x8c\x03\x84\x32\x66\x53\x95\x29\xe7\xa6\x0a\xb6\xff\x81\xdc\xd7\x60\xae\x44\x2e\x73\x2a\x0e\xd6\xdd\x7a\x13\xae\x3a\xbd\x26\x23\xf9\x24\x8e\xce\x60\xc6\x90\x57\x3a\xb8\xd3\x67\x42\xd8\x21\x88\x6c\xf0\x2d\x8e\xa2\x1d\xb3\x84\x05\xd7\xe0\xcd\x17\x3c\x84\xcb\xc1\x55\x1c\x45\x32\x87\xbe\x5f\x4b\x97\xb4\xc0\xbf\x31\xce\x7f\x87\xeb\xeb\xeb\xd0\xd4\xb9\xd4\x28\x06\x40\x10\xd1\x4b\x62\xf5\x4d\x94\x31\xc5\x34\xc7\x31\xf4\x2e\x0f\x3d\xf8\x09\x44\x96\x14\xe8\x3f\xd4\xa7\xb5\xb2\xc4\x9b\xa5\xb7\x52\x17\xfd\xf7\xbf\x0c\x86\xe1\x95\x36\xe1\x0d\x34\xe2\x37\xa6\x13\xae\xef\xb9\x11\xe1\xba\xb1\xb9\x96\x9a\x18\xd1\x08\x35\x52\xce\x1b\xcb\x0a\x1c\xc3\xb7\x47\xfa\x7e\x24\xaf\x1e\xe3\xe8\xf1\x2c\xca\xcb\x5a\xe8\x95\x28\x37\x10\x80\xda\xdb\xae\xce\x0b\x49\x9d\xfa\x34\x01\x01\xef\x7b\x49\x58\xb6\xa6\x3c\x4b\xc2\x06\x8f\x3f\xce\x04\x5d\x48\x71\xe8\x2e\x36\x78\x1c\x5c\xc5\xaf\xa6\x28\x69\x8c\xfe\x4d\x8a\xc3\xcb\xf9\x22\xc0\x1d\x53\x1d\x60\x1d\xbf\x25\x21\x9c\xec\x1a\x04\xdd\x41\x07\xc9\xfe\xe5\x1a\x2e\x2e\x0f\x97\xff\xe7\xdf\x45\x63\xc1\x0b\x25\xf3\xcc\xec\x37\x98\xf6\x78\x9e\x4f\x8b\xae\x52\x9e\xda\x4e\xea\x9d\xd9\x10\x81\xae\x29\x4f\x4a\x85\xd4\x98\x92\xaa\xc6\xd5\x0c\x96\x21\x6a\x90\x1e\x2d\x23\x0a\x37\x3b\xb4\x34\xbd\xc0\xa2\xaf\xac\x76\x5d\x3a\x73\xa9\x99\x6a\x81\x9b\xec\x7b\xcb\x78\xdd\xbb\xf5\xf9\x93\x9c\x72\x7f\x08\xd9\x0c\x3e\x8e\x46\x90\x7a\x20\x3f\xa1\x34\x52\xfb\x21\xec\x11\x34\xa2\x20\x02\x12\x28\x2a\xee\x03\x5e\x6f\xc7\x54\x85\xbd\x9a\x64\x88\xaa\xc3\x53\x53\xd1\x44\x7a\x42\x42\xc3\x60\xe0\xd6\xec\xc2\xa8\xcd\x18\xdf\x40\xd3\xf8\xc6\xca\x42\xea\xb8\x89\xe9\x59\xd3\x93\x45\x09\x01\x07\xb3\x42\xcd\x50\xee\xe9\xe4\x43\xc8\x7f\x26\x8b\x99\xf6\xcf\x8a\xa8\x8e\x7c\xfb\x74\xf0\x7b\xd2\x34\x71\xe2\x88\x78\xfb\x3f\x0f\x86\xf0\xfe\x97\xae\x32\xbd\x21\x28\xf8\x31\x98\x37\xaf\x43\xc5\xcf\x2b\xe2\xe5\x67\x41\x0d\x31\xc9\x4f\x41\x6b\xe2\xaa\x8c\xd2\x51\xfb\x19\xe2\x78\xce\x26\x57\xdf\xc1\x3d\xf7\xad\xc5\x6d\x42\x93\x30\x21\x5e\x07\xad\x53\xf4\x11\xb9\xc5\x2d\x4d\x17\xca\x02\x67\x4a\xa1\xed\x39\x08\xdc\x35\x6c\xca\x29\xe4\x0b\xb7\xa5\x3f\xb6\x33\xc7\x33\x5b\xa0\x77\x3f\x36\x2c\xe0\xbc\x7b\xd7\x52\x71\x08\xc5\xb1\x44\xb8\xbe\x86\xde\x64\x31\x4d\x57\xd3\x5e\xd3\x4c\xa3\x11\xdc\x63\xd8\xc8\x32\x25\x33\xa1\x8e\x20\x50\xa1\xc7\xda\x2e\xa3\x43\x88\x3a\x6a\x1a\xd2\x6a\x45\x4b\x0f\x1e\xa4\xf3\x52\x17\x50\x33\xd6\x9e\xe6\x7b\x03\x17\x7a\x84\xb3\xca\x51\xb5\x3e\x1b\x86\xde\xd0\x66\x63\x91\xf8\x8d\xe6\x50\x68\x37\xa6\x64\xb7\x09\xe5\xd2\x3a\x0f\xa5\x62\x1c\x13\xc2\xeb\x8c\x79\x3d\xbf\x0d\x33\x93\xea\x45\x68\xc1\x00\x74\x1a\xb4\x4c\xd1\xa0\x26\xf5\x0e\xfa\x2d\xc6\x20\x8e\x22\xdb\x4a\x3f\xc1\xbe\x3a\x51\x82\xf3\x58\x3e\x25\x04\x5a\x70\x70\x87\x44\xe5\x81\x0d\xea\xa1\x4c\xba\xfe\xf9\x6b\xb3\x05\xa0\x4b\xe2\x88\xde\x3d\xe9\x6b\x65\x8a\xf3\xbe\x16\x75\x58\x78\x65\x2d\xe5\xbf\x1b\x05\x39\xf5\xf8\x1f\x95\xf3\x14\x53\x4b\xe1\x69\xd8\xe2\x25\xb2\x0e\xd4\x4c\x53\x7f\xf0\xe7\x21\x4a\xf3\x33\xcc\x2b\x52\xd7\x4c\xcb\x7a\xab\x2c\x8d\x47\xed\x25\x53\xea\x48\x79\xd8\x5b\x5a\xa7\x68\x81\x1a\x82\x93\x24\x15\x18\x27\x88\x4a\xcd\x55\x25\xea\x32\x08\x75\xdc\xe0\xb9\x60\xf3\xf9\x1e\xb6\x45\xe7\x58\x81\x09\x55\x52\x2e\x0f\xcd\x26\xab\xa1\x57\x93\x5c\x7f\xd0\x4b\x3a\x23\xcf\x29\x46\x99\x22\x69\x8b\x8c\xb8\x3a\x15\xc2\xa2\x73\xfd\x41\xc3\x39\x5d\x66\xef\xd7\xa8\x29\xf8\xa0\x71\x0f\xdd\x8a\xc4\x38\xa7\x95\x51\x0c\x81\x09\x41\xd4\xf6\x6c\x9d\x89\xa3\xc8\xed\xa5\xe7\x6b\x08\x9a\x4c\x79\xea\xc5\x41\x53\xff\x9c\x39\x84\x8b\xe9\xbf\x56\x93\xdb\x8f\xd3\xc9\xed\xdd\xc3\xc5\x18\xce\xce\x96\xb3\x7f\x4f\xbb\xb3\x0f\xe9\x3c\xbd\x99\x4c\x2f\xc6\xa7\x39\x74\xee\x90\x37\xad\x0b\xa4\xd0\x79\xc6\x37\x49\x89\xb8\xe9\x5f\x9e\xf3\xc0\xc9\xc1\x28\xca\x2c\xb2\xcd\xd5\xc9\x98\xba\x41\x1b\x1d\x2d\xe5\xc2\x35\xbc\x1a\xac\xab\xd7\xad\x99\x34\xf2\xfd\x96\xc8\x4f\x2b\x51\xa0\x8a\xef\xda\x91\xce\xe7\x9d\xe7\xf4\x41\xe1\xe8\x0e\x3e\x4e\xe7\xd3\xcf\xe9\x6a\x7a\x26\xb5\x5c\xa5\xab\xd9\xa4\x3e\xfa\xaf\x43\xf4\xfe\xcd\x21\xea\x2d\x97\xab\xdb\xc5\xb4\x37\x6e\xbe\xe6\xb7\xe9\xc7\xde\x9f\x14\x36\x7b\xd3\xf7\x8a\xcc\x9b\x7b\x63\xc5\xff\x92\xab\x27\xbb\x43\xce\x5e\x5a\x1d\x02\x09\x71\x5f\x3d\xfb\x89\x00\x4c\xb7\xfc\x91\xd7\x3f\x93\xa2\xf0\xfe\x45\xc6\x78\x8c\x1f\xe3\xff\x04\x00\x00\xff\xff\xb5\x44\x89\xaf\xbc\x0f\x00\x00") +var _prestate_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x57\xdd\x6f\xdb\x38\x12\x7f\x96\xfe\x8a\x41\x5f\x6c\xa3\xae\xdc\x64\x81\x3d\xc0\xb9\x1c\xa0\xba\x6e\x1b\x20\x9b\x04\xb6\x7b\xb9\xdc\x62\x1f\x28\x72\x24\x73\x4d\x93\x02\x49\xd9\xf1\x15\xf9\xdf\x0f\x43\x7d\xf8\xa3\x49\xd3\xdd\x37\x9b\x1c\xfe\xe6\xfb\x37\xa3\xd1\x08\x26\xa6\xdc\x59\x59\x2c\x3d\x9c\xbf\x3f\xfb\x07\x2c\x96\x08\x85\x79\x87\x7e\x89\x16\xab\x35\xa4\x95\x5f\x1a\xeb\xe2\xd1\x08\x16\x4b\xe9\x20\x97\x0a\x41\x3a\x28\x99\xf5\x60\x72\xf0\x27\xf2\x4a\x66\x96\xd9\x5d\x12\x8f\x46\xf5\x9b\x67\xaf\x09\x21\xb7\x88\xe0\x4c\xee\xb7\xcc\xe2\x18\x76\xa6\x02\xce\x34\x58\x14\xd2\x79\x2b\xb3\xca\x23\x48\x0f\x4c\x8b\x91\xb1\xb0\x36\x42\xe6\x3b\x82\x94\x1e\x2a\x2d\xd0\x06\xd5\x1e\xed\xda\xb5\x76\x7c\xbe\xf9\x0a\xd7\xe8\x1c\x5a\xf8\x8c\x1a\x2d\x53\x70\x57\x65\x4a\x72\xb8\x96\x1c\xb5\x43\x60\x0e\x4a\x3a\x71\x4b\x14\x90\x05\x38\x7a\xf8\x89\x4c\x99\x37\xa6\xc0\x27\x53\x69\xc1\xbc\x34\x7a\x08\x28\xc9\x72\xd8\xa0\x75\xd2\x68\xf8\xa5\x55\xd5\x00\x0e\xc1\x58\x02\xe9\x33\x4f\x0e\x58\x30\x25\xbd\x1b\x00\xd3\x3b\x50\xcc\xef\x9f\xfe\x44\x40\xf6\x7e\x0b\x90\x3a\xa8\x59\x9a\x12\xc1\x2f\x99\x27\xaf\xb7\x52\x29\xc8\x10\x2a\x87\x79\xa5\x86\x84\x96\x55\x1e\xee\xaf\x16\x5f\x6e\xbf\x2e\x20\xbd\x79\x80\xfb\x74\x36\x4b\x6f\x16\x0f\x17\xb0\x95\x7e\x69\x2a\x0f\xb8\xc1\x1a\x4a\xae\x4b\x25\x51\xc0\x96\x59\xcb\xb4\xdf\x81\xc9\x09\xe1\xb7\xe9\x6c\xf2\x25\xbd\x59\xa4\x1f\xae\xae\xaf\x16\x0f\x60\x2c\x7c\xba\x5a\xdc\x4c\xe7\x73\xf8\x74\x3b\x83\x14\xee\xd2\xd9\xe2\x6a\xf2\xf5\x3a\x9d\xc1\xdd\xd7\xd9\xdd\xed\x7c\x9a\xc0\x1c\xc9\x2a\xa4\xf7\xaf\xc7\x3c\x0f\xd9\xb3\x08\x02\x3d\x93\xca\xb5\x91\x78\x30\x15\xb8\xa5\xa9\x94\x80\x25\xdb\x20\x58\xe4\x28\x37\x28\x80\x01\x37\xe5\xee\xa7\x93\x4a\x58\x4c\x19\x5d\x04\x9f\x5f\x2c\x48\xb8\xca\x41\x1b\x3f\x04\x87\x08\xff\x5c\x7a\x5f\x8e\x47\xa3\xed\x76\x9b\x14\xba\x4a\x8c\x2d\x46\xaa\x86\x73\xa3\x7f\x25\x31\x61\x96\x16\x9d\x67\x1e\x17\x96\x71\xb4\x60\x2a\x5f\x56\xde\x81\xab\xf2\x5c\x72\x89\xda\x83\xd4\xb9\xb1\xeb\x50\x29\xe0\x0d\x70\x8b\xcc\x23\x30\x50\x86\x33\x05\xf8\x88\xbc\x0a\x77\x75\xa4\x43\xb9\x5a\xa6\x1d\xe3\xe1\x34\xb7\x66\x4d\xbe\x56\xce\xd3\x0f\xe7\x70\x9d\x29\x14\x50\xa0\x46\x27\x1d\x64\xca\xf0\x55\x12\x7f\x8b\xa3\x03\x63\xa8\x4e\x82\x87\x8d\x50\xa8\x8d\x2d\xf6\x2c\x42\x56\x49\x25\xa4\x2e\x92\x38\x6a\xa5\xc7\xa0\x2b\xa5\x86\x71\x80\x50\xc6\xac\xaa\x32\xe5\xdc\x54\xc1\xf6\x3f\x91\xfb\x1a\xcc\x95\xc8\x65\x4e\xc5\xc1\xba\x5b\x6f\xc2\x55\xa7\xd7\x64\x24\x9f\xc4\xd1\x11\xcc\x18\xf2\x4a\x07\x77\xfa\x4c\x08\x3b\x04\x91\x0d\xbe\xc5\x51\xb4\x61\x96\xb0\xe0\x12\xbc\xf9\x82\x8f\xe1\x72\x70\x11\x47\x91\xcc\xa1\xef\x97\xd2\x25\x2d\xf0\xef\x8c\xf3\x3f\xe0\xf2\xf2\x32\x34\x75\x2e\x35\x8a\x01\x10\x44\xf4\x9c\x58\x7d\x13\x65\x4c\x31\xcd\x71\x0c\xbd\xf7\x8f\x3d\x78\x0b\x22\x4b\x0a\xf4\x1f\xea\xd3\x5a\x59\xe2\xcd\xdc\x5b\xa9\x8b\xfe\xd9\xaf\x83\x61\x78\xa5\x4d\x78\x03\x8d\xf8\x8d\xe9\x84\xeb\x7b\x6e\x44\xb8\x6e\x6c\xae\xa5\x26\x46\x34\x42\x8d\x94\xf3\xc6\xb2\x02\xc7\xf0\xed\x89\xfe\x3f\x91\x57\x4f\x71\xf4\x74\x14\xe5\x79\x2d\xf4\x42\x94\x1b\x08\x40\xed\x6d\x57\xe7\x85\xa4\x4e\x3d\x4c\x40\xc0\xfb\x51\x12\xe6\xad\x29\x27\x49\x58\xe1\xee\xf5\x4c\xd0\x85\x14\x8f\xdd\xc5\x0a\x77\x83\x8b\xf8\xc5\x14\x25\x8d\xd1\xbf\x4b\xf1\xf8\xb3\xf9\x3a\x79\x73\x14\xd7\x39\x49\xed\xed\x1d\x0c\x4e\xe2\x68\xd1\x55\xca\x53\xb9\x4b\xbd\x31\x2b\x22\xae\x25\xc5\x47\xa9\x10\x12\x53\x52\xb6\x5c\xcd\x1c\x19\xa2\x06\xe9\xd1\x32\xa2\x4e\xb3\x41\x4b\x53\x03\x2c\xfa\xca\x6a\xd7\x85\x31\x97\x9a\xa9\x16\xb8\x89\xba\xb7\x8c\xd7\x3d\x53\x9f\x1f\xc4\x92\xfb\xc7\x10\xc5\xe0\xdd\x68\x04\xa9\x07\x72\x11\x4a\x23\xb5\x1f\xc2\x16\x41\x23\x0a\x6a\x7c\x81\xa2\xe2\x3e\xe0\xf5\x36\x4c\x55\xd8\xab\x9b\x9b\x28\x32\x3c\x35\x15\x4d\x82\x83\xe6\x1f\x06\x03\xd7\x66\x13\x46\x5c\xc6\xf8\x0a\x9a\x86\x33\x56\x16\x52\xc7\x4d\x38\x8f\x9a\x8d\x2c\x4a\x08\x38\x98\x15\x72\x45\x49\xa4\x93\x0f\x4c\xc1\x25\x64\xb2\xb8\xd2\xfe\x24\x79\x75\xd0\xdb\xa7\x83\x3f\x92\xa6\x79\x12\x47\x84\xd7\x3f\x1f\x0c\xe1\xec\xd7\xae\x22\xbc\x21\x28\x78\x1d\xcc\x9b\x97\xa1\xe2\xd3\x62\x78\xfe\x59\x50\x43\x1d\xfc\x36\x68\x4d\x5c\x95\x51\x3a\x6a\x3f\x43\x1c\x8f\xbb\xf8\xe2\x07\xb8\xc7\xbe\xb5\xb8\x4d\x68\x12\x26\xc4\xcb\xa0\x75\x8a\x3e\x22\xb7\xb8\x26\x56\xa7\x2c\x70\xa6\x14\xda\x9e\x83\xc0\x19\xc3\xa6\x9c\x42\xbe\x70\x5d\xfa\x5d\xcb\xf5\x9e\xd9\x02\xbd\x7b\xdd\xb0\x80\xf3\xee\x5d\x4b\x81\x21\x14\xbb\x12\xe1\xf2\x12\x7a\x93\xd9\x34\x5d\x4c\x7b\x4d\x1b\x8d\x46\x70\x8f\x61\x13\xca\x94\xcc\x84\xda\x81\x40\x85\x1e\x6b\xbb\x8c\x0e\x21\xea\x28\x61\x48\x2b\x0d\x2d\x1b\xf8\x28\x9d\x97\xba\x80\x9a\x29\xb6\x34\x57\x1b\xb8\xd0\x23\x9c\x55\x8e\xaa\xf5\x64\x08\x79\x43\x1b\x85\x45\xe2\x15\xe2\xff\xd0\x6e\x4c\xc9\x6e\x03\xc9\xa5\x75\x1e\x4a\xc5\x38\x26\x84\xd7\x19\xf3\x72\x7e\x9b\x4e\x26\xd5\xb3\xd0\x82\x01\x68\x3f\xe0\x98\xa2\x01\x49\xea\x1d\xf4\x5b\x8c\x41\x1c\x45\xb6\x95\x3e\xc0\xbe\xd8\x53\x82\xf3\x58\x1e\x12\x02\x2d\x16\xb8\x41\xa2\xd0\xc0\x06\xf5\x30\x24\x5d\xff\xfe\xad\x99\xbe\xe8\x92\x38\xa2\x77\x07\x7d\xad\x4c\x71\xdc\xd7\xa2\x0e\x0b\xaf\xac\xa5\xfc\x77\x14\x9c\x53\x8f\xff\x59\x39\x4f\x31\xb5\x14\x9e\x86\x2d\x9e\x23\xc9\x40\x89\x34\x6d\x07\xdf\x93\x21\xcd\xad\x30\x27\x48\x5d\x33\xa5\xea\x6d\xae\x34\x1e\xb5\x97\x4c\xa9\x1d\xe5\x61\x6b\x69\x8d\xa1\xc5\x65\x08\x4e\x92\x54\x60\x9c\x20\x2a\x35\x57\x95\xa8\xcb\x20\xd4\x71\x83\xe7\x82\xcd\xc7\xfb\xcf\x1a\x9d\x63\x05\x26\x54\x49\xb9\x7c\x6c\x36\x48\x0d\xbd\x9a\xe4\xfa\x83\x5e\xd2\x19\x79\x4c\x31\xca\x14\x49\x5b\x64\x44\xd3\xa9\x10\x16\x9d\xeb\x0f\x1a\xce\xe9\x32\x7b\xbf\x44\x4d\xc1\x07\x8d\x5b\xe8\x56\x13\xc6\x39\xad\x6a\x62\x08\x4c\x08\xa2\xb6\x93\x35\x22\x8e\x22\xb7\x95\x9e\x2f\x21\x68\x32\xe5\xbe\x17\x07\x4d\xfd\x73\xe6\x10\xde\x4c\xff\xb3\x98\xdc\x7e\x9c\x4e\x6e\xef\x1e\xde\x8c\xe1\xe8\x6c\x7e\xf5\xdf\x69\x77\xf6\x21\xbd\x4e\x6f\x26\xd3\x37\xe3\x30\x9b\x9f\x71\xc8\x9b\xd6\x05\x52\xe8\x3c\xe3\xab\xa4\x44\x5c\xf5\xdf\x1f\xf3\xc0\xde\xc1\x28\xca\x2c\xb2\xd5\xc5\xde\x98\xba\x41\x1b\x1d\x2d\xe5\xc2\x25\xbc\x18\xac\x8b\x97\xad\x99\x34\xf2\xfd\x96\xc8\xf7\xab\x48\xa0\x8a\xd7\xed\x38\xff\xcb\x86\x84\xde\x61\x7c\x35\x06\xc7\x14\x6d\xc0\xf2\x7f\xf4\xe5\x92\xe7\x0e\xfd\x10\x50\x0b\xb3\x25\xe6\xeb\x50\xeb\x9b\x06\xf7\x20\x64\x67\x83\x9a\x41\x6f\xf3\xfe\xa0\x13\x26\xb0\xef\x45\xcf\x9f\x13\x45\x2d\xe0\xb2\x45\x7f\x1b\x5e\xbe\x1e\xa8\xf3\x26\x52\x27\x0a\x7e\x39\xd9\xf0\xc2\xfd\x1a\xd7\xc6\xee\x9a\x71\x74\xe0\xdf\x8f\xa3\x9a\x5e\x5f\x77\xf5\x44\x7f\xa8\xc8\xba\x83\x8f\xd3\xeb\xe9\xe7\x74\x31\x3d\x92\x9a\x2f\xd2\xc5\xd5\xa4\x3e\xfa\xcb\x85\x77\xf6\xd3\x85\xd7\x9b\xcf\x17\xb7\xb3\x69\x6f\xdc\xfc\xbb\xbe\x4d\x3f\xf6\xbe\x53\xd8\x6c\x81\x3f\x6a\x5d\x6f\xee\x8d\x15\x7f\xa7\x03\x0e\x36\xb2\x9c\x3d\xb7\x90\x05\x6a\xe7\xbe\x3a\xf9\xe0\x01\xa6\x5b\x56\xce\xeb\x8f\xbe\x28\xbc\x7f\x96\x87\x9f\xe2\xa7\xf8\xff\x01\x00\x00\xff\xff\xb1\x28\x85\x2a\x8a\x10\x00\x00") func prestate_tracerJsBytes() ([]byte, error) { return bindataRead( @@ -213,7 +213,7 @@ func prestate_tracerJs() (*asset, error) { } info := bindataFileInfo{name: "prestate_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd0, 0xd5, 0x5, 0x92, 0xed, 0xf4, 0x69, 0x2e, 0x14, 0x48, 0x35, 0x67, 0xcc, 0xf2, 0x3e, 0xc7, 0xf, 0x18, 0x22, 0x7a, 0x4d, 0x6f, 0x31, 0xad, 0x3c, 0x92, 0x77, 0xb4, 0x1, 0x2a, 0xd3, 0x7c}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe9, 0x79, 0x70, 0x4f, 0xc5, 0x78, 0x57, 0x63, 0x6f, 0x5, 0x31, 0xce, 0x3e, 0x5d, 0xbd, 0x71, 0x4, 0x46, 0x78, 0xcd, 0x1d, 0xcd, 0xb9, 0xd8, 0x10, 0xff, 0xe6, 0xc5, 0x59, 0xb9, 0x25, 0x6e}} return a, nil } diff --git a/eth/tracers/internal/tracers/call_tracer.js b/eth/tracers/internal/tracers/call_tracer.js index 83495b1574e9..f8b383cd96e4 100644 --- a/eth/tracers/internal/tracers/call_tracer.js +++ b/eth/tracers/internal/tracers/call_tracer.js @@ -38,7 +38,7 @@ var op = log.op.toString(); } // If a new contract is being created, add to the call stack - if (syscall && op == 'CREATE') { + if (syscall && (op == 'CREATE' || op == "CREATE2")) { var inOff = log.stack.peek(1).valueOf(); var inEnd = inOff + log.stack.peek(2).valueOf(); @@ -116,7 +116,7 @@ // Pop off the last call and get the execution results var call = this.callstack.pop(); - if (call.type == 'CREATE') { + if (call.type == 'CREATE' || call.type == "CREATE2") { // If the call was a CREATE, retrieve the contract address and output code call.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost - log.getGas()).toString(16); delete call.gasIn; delete call.gasCost; diff --git a/eth/tracers/internal/tracers/evmdis_tracer.js b/eth/tracers/internal/tracers/evmdis_tracer.js index 2790e0fd527c..bb19777aba91 100644 --- a/eth/tracers/internal/tracers/evmdis_tracer.js +++ b/eth/tracers/internal/tracers/evmdis_tracer.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// evmdisTracer returns sufficent information from a trace to perform evmdis-style +// evmdisTracer returns sufficient information from a trace to perform evmdis-style // disassembly. { stack: [{ops: []}], diff --git a/eth/tracers/internal/tracers/prestate_tracer.js b/eth/tracers/internal/tracers/prestate_tracer.js index 99f71d2c3363..e0a22bf157d3 100644 --- a/eth/tracers/internal/tracers/prestate_tracer.js +++ b/eth/tracers/internal/tracers/prestate_tracer.js @@ -40,10 +40,7 @@ var idx = toHex(key); if (this.prestate[acc].storage[idx] === undefined) { - var val = toHex(db.getState(addr, key)); - if (val != "0x0000000000000000000000000000000000000000000000000000000000000000") { - this.prestate[acc].storage[idx] = toHex(db.getState(addr, key)); - } + this.prestate[acc].storage[idx] = toHex(db.getState(addr, key)); } }, @@ -89,6 +86,14 @@ var from = log.contract.getAddress(); this.lookupAccount(toContract(from, db.getNonce(from)), db); break; + case "CREATE2": + var from = log.contract.getAddress(); + // stack: salt, size, offset, endowment + var offset = log.stack.peek(1).valueOf() + var size = log.stack.peek(2).valueOf() + var end = offset + size + this.lookupAccount(toContract2(from, log.stack.peek(3).toString(16), log.memory.slice(offset, end)), db); + break; case "CALL": case "CALLCODE": case "DELEGATECALL": case "STATICCALL": this.lookupAccount(toAddress(log.stack.peek(1).toString(16)), db); break; diff --git a/eth/tracers/internal/tracers/tracers.go b/eth/tracers/internal/tracers/tracers.go index dcf0d49daee8..2e40975bb9ef 100644 --- a/eth/tracers/internal/tracers/tracers.go +++ b/eth/tracers/internal/tracers/tracers.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -//go:generate go-bindata -nometadata -o assets.go -pkg tracers -ignore ((tracers)|(assets)).go ./... +//go:generate go-bindata -nometadata -o assets.go -pkg tracers -ignore tracers.go -ignore assets.go ./... //go:generate gofmt -s -w assets.go // Package tracers contains the actual JavaScript tracer assets. diff --git a/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json b/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json index b8a4cdd23359..d1c8ac913c54 100644 --- a/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json +++ b/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json @@ -65,7 +65,7 @@ "value": "0x0" } ], - "error": "invalid jump destination (PUSH1) 0", + "error": "evm: invalid jump destination", "from": "0xe4a13bc304682a903e9472f469c33801dd18d9e8", "gas": "0x435c8", "gasUsed": "0x435c8", diff --git a/eth/tracers/testdata/call_tracer_throw.json b/eth/tracers/testdata/call_tracer_throw.json index 60d4d1071d02..d66f1ffa61de 100644 --- a/eth/tracers/testdata/call_tracer_throw.json +++ b/eth/tracers/testdata/call_tracer_throw.json @@ -50,7 +50,7 @@ }, "input": "0xf88b8206668504a817c8008303d09094c212e03b9e060e36facad5fd8f4435412ca22e6b80a451a34eb8000000000000000000000000000000000000000000000027fad02094277c000029a0692a3b4e7b2842f8dd7832e712c21e09f451f416c8976d5b8d02e8c0c2b4bea9a07645e90fc421b63dd755767fd93d3c03b4ec0c4d8fafa059558d08cf11d59750", "result": { - "error": "invalid jump destination (PUSH1) 2", + "error": "evm: invalid jump destination", "from": "0x70c9217d814985faef62b124420f8dfbddd96433", "gas": "0x37b38", "gasUsed": "0x37b38", diff --git a/eth/tracers/tracer.go b/eth/tracers/tracer.go index b519236f2d00..9d6701868c72 100644 --- a/eth/tracers/tracer.go +++ b/eth/tracers/tracer.go @@ -290,11 +290,12 @@ type Tracer struct { contractWrapper *contractWrapper // Wrapper around the contract object dbWrapper *dbWrapper // Wrapper around the VM environment - pcValue *uint // Swappable pc value wrapped by a log accessor - gasValue *uint // Swappable gas value wrapped by a log accessor - costValue *uint // Swappable cost value wrapped by a log accessor - depthValue *uint // Swappable depth value wrapped by a log accessor - errorValue *string // Swappable error value wrapped by a log accessor + pcValue *uint // Swappable pc value wrapped by a log accessor + gasValue *uint // Swappable gas value wrapped by a log accessor + costValue *uint // Swappable cost value wrapped by a log accessor + depthValue *uint // Swappable depth value wrapped by a log accessor + errorValue *string // Swappable error value wrapped by a log accessor + refundValue *uint // Swappable refund value wrapped by a log accessor ctx map[string]interface{} // Transaction context gathered throughout execution err error // Error, if one has occurred @@ -323,6 +324,7 @@ func New(code string) (*Tracer, error) { gasValue: new(uint), costValue: new(uint), depthValue: new(uint), + refundValue: new(uint), } // Set up builtins for this environment tracer.vm.PushGlobalGoFunction("toHex", func(ctx *duktape.Context) int { @@ -365,6 +367,28 @@ func New(code string) (*Tracer, error) { copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) return 1 }) + tracer.vm.PushGlobalGoFunction("toContract2", func(ctx *duktape.Context) int { + var from common.Address + if ptr, size := ctx.GetBuffer(-3); ptr != nil { + from = common.BytesToAddress(makeSlice(ptr, size)) + } else { + from = common.HexToAddress(ctx.GetString(-3)) + } + // Retrieve salt hex string from js stack + salt := common.HexToHash(ctx.GetString(-2)) + // Retrieve code slice from js stack + var code []byte + if ptr, size := ctx.GetBuffer(-1); ptr != nil { + code = common.CopyBytes(makeSlice(ptr, size)) + } else { + code = common.FromHex(ctx.GetString(-1)) + } + codeHash := crypto.Keccak256(code) + ctx.Pop3() + contract := crypto.CreateAddress2(from, salt, codeHash) + copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) + return 1 + }) tracer.vm.PushGlobalGoFunction("isPrecompiled", func(ctx *duktape.Context) int { _, ok := vm.PrecompiledContractsByzantium[common.BytesToAddress(popSlice(ctx))] ctx.PushBoolean(ok) @@ -442,6 +466,9 @@ func New(code string) (*Tracer, error) { tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.depthValue); return 1 }) tracer.vm.PutPropString(logObject, "getDepth") + tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.refundValue); return 1 }) + tracer.vm.PutPropString(logObject, "getRefund") + tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { if tracer.errorValue != nil { ctx.PushString(*tracer.errorValue) @@ -527,6 +554,7 @@ func (jst *Tracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost *jst.gasValue = uint(gas) *jst.costValue = uint(cost) *jst.depthValue = uint(depth) + *jst.refundValue = uint(env.StateDB.GetRefund()) jst.errorValue = nil if err != nil { diff --git a/eth/tracers/tracer_test.go b/eth/tracers/tracer_test.go index 58b62472451c..a45a121159d8 100644 --- a/eth/tracers/tracer_test.go +++ b/eth/tracers/tracer_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" ) @@ -43,8 +44,14 @@ func (account) ReturnGas(*big.Int) {} func (account) SetCode(common.Hash, []byte) {} func (account) ForEachStorage(cb func(key, value common.Hash) bool) {} +type dummyStatedb struct { + state.StateDB +} + +func (*dummyStatedb) GetRefund() uint64 { return 1337 } + func runTrace(tracer *Tracer) (json.RawMessage, error) { - env := vm.NewEVM(vm.Context{BlockNumber: big.NewInt(1)}, nil, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) + env := vm.NewEVM(vm.Context{BlockNumber: big.NewInt(1)}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) contract := vm.NewContract(account{}, account{}, big.NewInt(0), 10000) contract.Code = []byte{byte(vm.PUSH1), 0x1, byte(vm.PUSH1), 0x1, 0x0} @@ -126,7 +133,7 @@ func TestHaltBetweenSteps(t *testing.T) { t.Fatal(err) } - env := vm.NewEVM(vm.Context{BlockNumber: big.NewInt(1)}, nil, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) + env := vm.NewEVM(vm.Context{BlockNumber: big.NewInt(1)}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) contract := vm.NewContract(&account{}, &account{}, big.NewInt(0), 0) tracer.CaptureState(env, 0, 0, 0, 0, nil, nil, contract, 0, nil) diff --git a/eth/tracers/tracers_test.go b/eth/tracers/tracers_test.go index d25fc459a1d0..69eb80a5c53a 100644 --- a/eth/tracers/tracers_test.go +++ b/eth/tracers/tracers_test.go @@ -17,6 +17,8 @@ package tracers import ( + "crypto/ecdsa" + "crypto/rand" "encoding/json" "io/ioutil" "math/big" @@ -29,9 +31,11 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/tests" ) @@ -116,6 +120,85 @@ type callTracerTest struct { Result *callTrace `json:"result"` } +func TestPrestateTracerCreate2(t *testing.T) { + unsignedTx := types.NewTransaction(1, common.HexToAddress("0x00000000000000000000000000000000deadbeef"), + new(big.Int), 5000000, big.NewInt(1), []byte{}) + + privateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), rand.Reader) + if err != nil { + t.Fatalf("err %v", err) + } + signer := types.NewEIP155Signer(big.NewInt(1)) + tx, err := types.SignTx(unsignedTx, signer, privateKeyECDSA) + if err != nil { + t.Fatalf("err %v", err) + } + /** + This comes from one of the test-vectors on the Skinny Create2 - EIP + + address 0x00000000000000000000000000000000deadbeef + salt 0x00000000000000000000000000000000000000000000000000000000cafebabe + init_code 0xdeadbeef + gas (assuming no mem expansion): 32006 + result: 0x60f3f640a8508fC6a86d45DF051962668E1e8AC7 + */ + origin, _ := signer.Sender(tx) + context := vm.Context{ + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + Origin: origin, + Coinbase: common.Address{}, + BlockNumber: new(big.Int).SetUint64(8000000), + Time: new(big.Int).SetUint64(5), + Difficulty: big.NewInt(0x30000), + GasLimit: uint64(6000000), + GasPrice: big.NewInt(1), + } + alloc := core.GenesisAlloc{} + + // The code pushes 'deadbeef' into memory, then the other params, and calls CREATE2, then returns + // the address + alloc[common.HexToAddress("0x00000000000000000000000000000000deadbeef")] = core.GenesisAccount{ + Nonce: 1, + Code: hexutil.MustDecode("0x63deadbeef60005263cafebabe6004601c6000F560005260206000F3"), + Balance: big.NewInt(1), + } + alloc[origin] = core.GenesisAccount{ + Nonce: 1, + Code: []byte{}, + Balance: big.NewInt(500000000000000), + } + statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), alloc) + + // Create the tracer, the EVM environment and run it + tracer, err := New("prestateTracer") + if err != nil { + t.Fatalf("failed to create call tracer: %v", err) + } + evm := vm.NewEVM(context, statedb, params.MainnetChainConfig, vm.Config{Debug: true, Tracer: tracer}) + + msg, err := tx.AsMessage(signer) + if err != nil { + t.Fatalf("failed to prepare transaction for tracing: %v", err) + } + st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas())) + if _, _, _, err = st.TransitionDb(); err != nil { + t.Fatalf("failed to execute transaction: %v", err) + } + // Retrieve the trace result and compare against the etalon + res, err := tracer.GetResult() + if err != nil { + t.Fatalf("failed to retrieve trace result: %v", err) + } + ret := make(map[string]interface{}) + if err := json.Unmarshal(res, &ret); err != nil { + t.Fatalf("failed to unmarshal trace result: %v", err) + } + if _, has := ret["0x60f3f640a8508fc6a86d45df051962668e1e8ac7"]; !has { + t.Fatalf("Expected 0x60f3f640a8508fc6a86d45df051962668e1e8ac7 in result") + } +} + // Iterates over all the input-output datasets in the tracer test harness and // runs the JavaScript tracers against them. func TestCallTracer(t *testing.T) { @@ -159,7 +242,7 @@ func TestCallTracer(t *testing.T) { GasLimit: uint64(test.Context.GasLimit), GasPrice: tx.GasPrice(), } - statedb := tests.MakePreState(ethdb.NewMemDatabase(), test.Genesis.Alloc) + statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc) // Create the tracer, the EVM environment and run it tracer, err := New("callTracer") @@ -185,8 +268,9 @@ func TestCallTracer(t *testing.T) { if err := json.Unmarshal(res, ret); err != nil { t.Fatalf("failed to unmarshal trace result: %v", err) } + if !reflect.DeepEqual(ret, test.Result) { - t.Fatalf("trace mismatch: have %+v, want %+v", ret, test.Result) + t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, test.Result) } }) } diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index b40837c8cc61..0a6f73ab5165 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -61,6 +61,16 @@ func (ec *Client) Close() { // Blockchain Access +// ChainId retrieves the current chain ID for transaction replay protection. +func (ec *Client) ChainID(ctx context.Context) (*big.Int, error) { + var result hexutil.Big + err := ec.c.CallContext(ctx, &result, "eth_chainId") + if err != nil { + return nil, err + } + return (*big.Int)(&result), err +} + // BlockByHash returns the given full block. // // Note that loading full blocks requires two requests. Use HeaderByHash @@ -241,12 +251,13 @@ func (ec *Client) TransactionCount(ctx context.Context, blockHash common.Hash) ( func (ec *Client) TransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error) { var json *rpcTransaction err := ec.c.CallContext(ctx, &json, "eth_getTransactionByBlockHashAndIndex", blockHash, hexutil.Uint64(index)) - if err == nil { - if json == nil { - return nil, ethereum.NotFound - } else if _, r, _ := json.tx.RawSignatureValues(); r == nil { - return nil, fmt.Errorf("server returned transaction without signature") - } + if err != nil { + return nil, err + } + if json == nil { + return nil, ethereum.NotFound + } else if _, r, _ := json.tx.RawSignatureValues(); r == nil { + return nil, fmt.Errorf("server returned transaction without signature") } if json.From != nil && json.BlockHash != nil { setSenderFromServer(json.tx, *json.From, *json.BlockHash) @@ -365,26 +376,42 @@ func (ec *Client) NonceAt(ctx context.Context, account common.Address, blockNumb // FilterLogs executes a filter query. func (ec *Client) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) { var result []types.Log - err := ec.c.CallContext(ctx, &result, "eth_getLogs", toFilterArg(q)) + arg, err := toFilterArg(q) + if err != nil { + return nil, err + } + err = ec.c.CallContext(ctx, &result, "eth_getLogs", arg) return result, err } // SubscribeFilterLogs subscribes to the results of a streaming filter query. func (ec *Client) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { - return ec.c.EthSubscribe(ctx, ch, "logs", toFilterArg(q)) + arg, err := toFilterArg(q) + if err != nil { + return nil, err + } + return ec.c.EthSubscribe(ctx, ch, "logs", arg) } -func toFilterArg(q ethereum.FilterQuery) interface{} { +func toFilterArg(q ethereum.FilterQuery) (interface{}, error) { arg := map[string]interface{}{ - "fromBlock": toBlockNumArg(q.FromBlock), - "toBlock": toBlockNumArg(q.ToBlock), - "address": q.Addresses, - "topics": q.Topics, + "address": q.Addresses, + "topics": q.Topics, } - if q.FromBlock == nil { - arg["fromBlock"] = "0x0" + if q.BlockHash != nil { + arg["blockHash"] = *q.BlockHash + if q.FromBlock != nil || q.ToBlock != nil { + return nil, fmt.Errorf("cannot specify both BlockHash and FromBlock/ToBlock") + } + } else { + if q.FromBlock == nil { + arg["fromBlock"] = "0x0" + } else { + arg["fromBlock"] = toBlockNumArg(q.FromBlock) + } + arg["toBlock"] = toBlockNumArg(q.ToBlock) } - return arg + return arg, nil } // Pending State diff --git a/ethclient/ethclient_test.go b/ethclient/ethclient_test.go index 178eb2be9828..3576d4870e66 100644 --- a/ethclient/ethclient_test.go +++ b/ethclient/ethclient_test.go @@ -16,7 +16,26 @@ package ethclient -import "github.com/ethereum/go-ethereum" +import ( + "context" + "errors" + "fmt" + "math/big" + "reflect" + "testing" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" +) // Verify that Client implements the ethereum interfaces. var ( @@ -32,3 +51,287 @@ var ( // _ = ethereum.PendingStateEventer(&Client{}) _ = ethereum.PendingContractCaller(&Client{}) ) + +func TestToFilterArg(t *testing.T) { + blockHashErr := fmt.Errorf("cannot specify both BlockHash and FromBlock/ToBlock") + addresses := []common.Address{ + common.HexToAddress("0xD36722ADeC3EdCB29c8e7b5a47f352D701393462"), + } + blockHash := common.HexToHash( + "0xeb94bb7d78b73657a9d7a99792413f50c0a45c51fc62bdcb08a53f18e9a2b4eb", + ) + + for _, testCase := range []struct { + name string + input ethereum.FilterQuery + output interface{} + err error + }{ + { + "without BlockHash", + ethereum.FilterQuery{ + Addresses: addresses, + FromBlock: big.NewInt(1), + ToBlock: big.NewInt(2), + Topics: [][]common.Hash{}, + }, + map[string]interface{}{ + "address": addresses, + "fromBlock": "0x1", + "toBlock": "0x2", + "topics": [][]common.Hash{}, + }, + nil, + }, + { + "with nil fromBlock and nil toBlock", + ethereum.FilterQuery{ + Addresses: addresses, + Topics: [][]common.Hash{}, + }, + map[string]interface{}{ + "address": addresses, + "fromBlock": "0x0", + "toBlock": "latest", + "topics": [][]common.Hash{}, + }, + nil, + }, + { + "with blockhash", + ethereum.FilterQuery{ + Addresses: addresses, + BlockHash: &blockHash, + Topics: [][]common.Hash{}, + }, + map[string]interface{}{ + "address": addresses, + "blockHash": blockHash, + "topics": [][]common.Hash{}, + }, + nil, + }, + { + "with blockhash and from block", + ethereum.FilterQuery{ + Addresses: addresses, + BlockHash: &blockHash, + FromBlock: big.NewInt(1), + Topics: [][]common.Hash{}, + }, + nil, + blockHashErr, + }, + { + "with blockhash and to block", + ethereum.FilterQuery{ + Addresses: addresses, + BlockHash: &blockHash, + ToBlock: big.NewInt(1), + Topics: [][]common.Hash{}, + }, + nil, + blockHashErr, + }, + { + "with blockhash and both from / to block", + ethereum.FilterQuery{ + Addresses: addresses, + BlockHash: &blockHash, + FromBlock: big.NewInt(1), + ToBlock: big.NewInt(2), + Topics: [][]common.Hash{}, + }, + nil, + blockHashErr, + }, + } { + t.Run(testCase.name, func(t *testing.T) { + output, err := toFilterArg(testCase.input) + if (testCase.err == nil) != (err == nil) { + t.Fatalf("expected error %v but got %v", testCase.err, err) + } + if testCase.err != nil { + if testCase.err.Error() != err.Error() { + t.Fatalf("expected error %v but got %v", testCase.err, err) + } + } else if !reflect.DeepEqual(testCase.output, output) { + t.Fatalf("expected filter arg %v but got %v", testCase.output, output) + } + }) + } +} + +var ( + testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + testAddr = crypto.PubkeyToAddress(testKey.PublicKey) + testBalance = big.NewInt(2e10) +) + +func newTestBackend(t *testing.T) (*node.Node, []*types.Block) { + // Generate test chain. + genesis, blocks := generateTestChain() + + // Start Ethereum service. + var ethservice *eth.Ethereum + n, err := node.New(&node.Config{}) + n.Register(func(ctx *node.ServiceContext) (node.Service, error) { + config := ð.Config{Genesis: genesis} + config.Ethash.PowMode = ethash.ModeFake + ethservice, err = eth.New(ctx, config) + return ethservice, err + }) + + // Import the test chain. + if err := n.Start(); err != nil { + t.Fatalf("can't start test node: %v", err) + } + if _, err := ethservice.BlockChain().InsertChain(blocks[1:]); err != nil { + t.Fatalf("can't import test blocks: %v", err) + } + return n, blocks +} + +func generateTestChain() (*core.Genesis, []*types.Block) { + db := rawdb.NewMemoryDatabase() + config := params.AllEthashProtocolChanges + genesis := &core.Genesis{ + Config: config, + Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, + ExtraData: []byte("test genesis"), + Timestamp: 9000, + } + generate := func(i int, g *core.BlockGen) { + g.OffsetTime(5) + g.SetExtra([]byte("test")) + } + gblock := genesis.ToBlock(db) + engine := ethash.NewFaker() + blocks, _ := core.GenerateChain(config, gblock, engine, db, 1, generate) + blocks = append([]*types.Block{gblock}, blocks...) + return genesis, blocks +} + +func TestHeader(t *testing.T) { + backend, chain := newTestBackend(t) + client, _ := backend.Attach() + defer backend.Stop() + defer client.Close() + + tests := map[string]struct { + block *big.Int + want *types.Header + wantErr error + }{ + "genesis": { + block: big.NewInt(0), + want: chain[0].Header(), + }, + "first_block": { + block: big.NewInt(1), + want: chain[1].Header(), + }, + "future_block": { + block: big.NewInt(1000000000), + want: nil, + }, + } + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + ec := NewClient(client) + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + + got, err := ec.HeaderByNumber(ctx, tt.block) + if tt.wantErr != nil && (err == nil || err.Error() != tt.wantErr.Error()) { + t.Fatalf("HeaderByNumber(%v) error = %q, want %q", tt.block, err, tt.wantErr) + } + if got != nil && got.Number.Sign() == 0 { + got.Number = big.NewInt(0) // hack to make DeepEqual work + } + if !reflect.DeepEqual(got, tt.want) { + t.Fatalf("HeaderByNumber(%v)\n = %v\nwant %v", tt.block, got, tt.want) + } + }) + } +} + +func TestBalanceAt(t *testing.T) { + backend, _ := newTestBackend(t) + client, _ := backend.Attach() + defer backend.Stop() + defer client.Close() + + tests := map[string]struct { + account common.Address + block *big.Int + want *big.Int + wantErr error + }{ + "valid_account": { + account: testAddr, + block: big.NewInt(1), + want: testBalance, + }, + "non_existent_account": { + account: common.Address{1}, + block: big.NewInt(1), + want: big.NewInt(0), + }, + "future_block": { + account: testAddr, + block: big.NewInt(1000000000), + want: big.NewInt(0), + wantErr: errors.New("header not found"), + }, + } + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + ec := NewClient(client) + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + + got, err := ec.BalanceAt(ctx, tt.account, tt.block) + if tt.wantErr != nil && (err == nil || err.Error() != tt.wantErr.Error()) { + t.Fatalf("BalanceAt(%x, %v) error = %q, want %q", tt.account, tt.block, err, tt.wantErr) + } + if got.Cmp(tt.want) != 0 { + t.Fatalf("BalanceAt(%x, %v) = %v, want %v", tt.account, tt.block, got, tt.want) + } + }) + } +} + +func TestTransactionInBlockInterrupted(t *testing.T) { + backend, _ := newTestBackend(t) + client, _ := backend.Attach() + defer backend.Stop() + defer client.Close() + + ec := NewClient(client) + ctx, cancel := context.WithCancel(context.Background()) + cancel() + tx, err := ec.TransactionInBlock(ctx, common.Hash{1}, 1) + if tx != nil { + t.Fatal("transaction should be nil") + } + if err == nil { + t.Fatal("error should not be nil") + } +} + +func TestChainID(t *testing.T) { + backend, _ := newTestBackend(t) + client, _ := backend.Attach() + defer backend.Stop() + defer client.Close() + ec := NewClient(client) + + id, err := ec.ChainID(context.Background()) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if id == nil || id.Cmp(params.AllEthashProtocolChanges.ChainID) != 0 { + t.Fatalf("ChainID returned wrong number: %+v", id) + } +} diff --git a/ethdb/.gitignore b/ethdb/.gitignore deleted file mode 100644 index f725d58d14f7..000000000000 --- a/ethdb/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. -# -# If you find yourself ignoring temporary files generated by your text editor -# or operating system, you probably want to add a global ignore instead: -# git config --global core.excludesfile ~/.gitignore_global - -/tmp -*/**/*un~ -*un~ -.DS_Store -*/**/.DS_Store - diff --git a/ethdb/batch.go b/ethdb/batch.go new file mode 100644 index 000000000000..e261415bff9d --- /dev/null +++ b/ethdb/batch.go @@ -0,0 +1,46 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package ethdb + +// IdealBatchSize defines the size of the data batches should ideally add in one +// write. +const IdealBatchSize = 100 * 1024 + +// Batch is a write-only database that commits changes to its host database +// when Write is called. A batch cannot be used concurrently. +type Batch interface { + KeyValueWriter + + // ValueSize retrieves the amount of data queued up for writing. + ValueSize() int + + // Write flushes any accumulated data to disk. + Write() error + + // Reset resets the batch for reuse. + Reset() + + // Replay replays the batch contents. + Replay(w KeyValueWriter) error +} + +// Batcher wraps the NewBatch method of a backing data store. +type Batcher interface { + // NewBatch creates a write-only database that buffers changes to its host db + // until a final write is called. + NewBatch() Batch +} diff --git a/ethdb/database.go b/ethdb/database.go index 99abd09b9963..0dc14624b98e 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -14,437 +14,118 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +// Package ethdb defines the interfaces for an Ethereum data store. package ethdb -import ( - "fmt" - "strconv" - "strings" - "sync" - "time" +import "io" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/filter" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) +// KeyValueReader wraps the Has and Get method of a backing data store. +type KeyValueReader interface { + // Has retrieves if a key is present in the key-value data store. + Has(key []byte) (bool, error) -const ( - writePauseWarningThrottler = 1 * time.Minute -) - -var OpenFileLimit = 64 - -type LDBDatabase struct { - fn string // filename for reporting - db *leveldb.DB // LevelDB instance - - compTimeMeter metrics.Meter // Meter for measuring the total time spent in database compaction - compReadMeter metrics.Meter // Meter for measuring the data read during compaction - compWriteMeter metrics.Meter // Meter for measuring the data written during compaction - writeDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction - writeDelayMeter metrics.Meter // Meter for measuring the write delay duration due to database compaction - diskReadMeter metrics.Meter // Meter for measuring the effective amount of data read - diskWriteMeter metrics.Meter // Meter for measuring the effective amount of data written - - quitLock sync.Mutex // Mutex protecting the quit channel access - quitChan chan chan error // Quit channel to stop the metrics collection before closing the database - - log log.Logger // Contextual logger tracking the database path -} - -// NewLDBDatabase returns a LevelDB wrapped object. -func NewLDBDatabase(file string, cache int, handles int) (*LDBDatabase, error) { - logger := log.New("database", file) - - // Ensure we have some minimal caching and file guarantees - if cache < 16 { - cache = 16 - } - if handles < 16 { - handles = 16 - } - logger.Info("Allocated cache and file handles", "cache", cache, "handles", handles) - - // Open the db and recover any potential corruptions - db, err := leveldb.OpenFile(file, &opt.Options{ - OpenFilesCacheCapacity: handles, - BlockCacheCapacity: cache / 2 * opt.MiB, - WriteBuffer: cache / 4 * opt.MiB, // Two of these are used internally - Filter: filter.NewBloomFilter(10), - }) - if _, corrupted := err.(*errors.ErrCorrupted); corrupted { - db, err = leveldb.RecoverFile(file, nil) - } - // (Re)check for errors and abort if opening of the db failed - if err != nil { - return nil, err - } - return &LDBDatabase{ - fn: file, - db: db, - log: logger, - }, nil -} - -// Path returns the path to the database directory. -func (db *LDBDatabase) Path() string { - return db.fn -} - -// Put puts the given key / value to the queue -func (db *LDBDatabase) Put(key []byte, value []byte) error { - return db.db.Put(key, value, nil) -} - -func (db *LDBDatabase) Has(key []byte) (bool, error) { - return db.db.Has(key, nil) -} - -// Get returns the given key if it's present. -func (db *LDBDatabase) Get(key []byte) ([]byte, error) { - dat, err := db.db.Get(key, nil) - if err != nil { - return nil, err - } - return dat, nil -} - -// Delete deletes the key from the queue and database -func (db *LDBDatabase) Delete(key []byte) error { - return db.db.Delete(key, nil) + // Get retrieves the given key if it's present in the key-value data store. + Get(key []byte) ([]byte, error) } -func (db *LDBDatabase) NewIterator() iterator.Iterator { - return db.db.NewIterator(nil, nil) -} +// KeyValueWriter wraps the Put method of a backing data store. +type KeyValueWriter interface { + // Put inserts the given value into the key-value data store. + Put(key []byte, value []byte) error -// NewIteratorWithPrefix returns a iterator to iterate over subset of database content with a particular prefix. -func (db *LDBDatabase) NewIteratorWithPrefix(prefix []byte) iterator.Iterator { - return db.db.NewIterator(util.BytesPrefix(prefix), nil) + // Delete removes the key from the key-value data store. + Delete(key []byte) error } -func (db *LDBDatabase) Close() { - // Stop the metrics collection to avoid internal database races - db.quitLock.Lock() - defer db.quitLock.Unlock() - - if db.quitChan != nil { - errc := make(chan error) - db.quitChan <- errc - if err := <-errc; err != nil { - db.log.Error("Metrics collection failed", "err", err) - } - db.quitChan = nil - } - err := db.db.Close() - if err == nil { - db.log.Info("Database closed") - } else { - db.log.Error("Failed to close database", "err", err) - } +// Stater wraps the Stat method of a backing data store. +type Stater interface { + // Stat returns a particular internal stat of the database. + Stat(property string) (string, error) } -func (db *LDBDatabase) LDB() *leveldb.DB { - return db.db +// Compacter wraps the Compact method of a backing data store. +type Compacter interface { + // Compact flattens the underlying data store for the given key range. In essence, + // deleted and overwritten versions are discarded, and the data is rearranged to + // reduce the cost of operations needed to access them. + // + // A nil start is treated as a key before all keys in the data store; a nil limit + // is treated as a key after all keys in the data store. If both is nil then it + // will compact entire data store. + Compact(start []byte, limit []byte) error } -// Meter configures the database metrics collectors and -func (db *LDBDatabase) Meter(prefix string) { - // Initialize all the metrics collector at the requested prefix - db.compTimeMeter = metrics.NewRegisteredMeter(prefix+"compact/time", nil) - db.compReadMeter = metrics.NewRegisteredMeter(prefix+"compact/input", nil) - db.compWriteMeter = metrics.NewRegisteredMeter(prefix+"compact/output", nil) - db.diskReadMeter = metrics.NewRegisteredMeter(prefix+"disk/read", nil) - db.diskWriteMeter = metrics.NewRegisteredMeter(prefix+"disk/write", nil) - db.writeDelayMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/duration", nil) - db.writeDelayNMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/counter", nil) - - // Create a quit channel for the periodic collector and run it - db.quitLock.Lock() - db.quitChan = make(chan chan error) - db.quitLock.Unlock() - - go db.meter(3 * time.Second) +// KeyValueStore contains all the methods required to allow handling different +// key-value data stores backing the high level database. +type KeyValueStore interface { + KeyValueReader + KeyValueWriter + Batcher + Iteratee + Stater + Compacter + io.Closer } -// meter periodically retrieves internal leveldb counters and reports them to -// the metrics subsystem. -// -// This is how a stats table look like (currently): -// Compactions -// Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB) -// -------+------------+---------------+---------------+---------------+--------------- -// 0 | 0 | 0.00000 | 1.27969 | 0.00000 | 12.31098 -// 1 | 85 | 109.27913 | 28.09293 | 213.92493 | 214.26294 -// 2 | 523 | 1000.37159 | 7.26059 | 66.86342 | 66.77884 -// 3 | 570 | 1113.18458 | 0.00000 | 0.00000 | 0.00000 -// -// This is how the write delay look like (currently): -// DelayN:5 Delay:406.604657ms Paused: false -// -// This is how the iostats look like (currently): -// Read(MB):3895.04860 Write(MB):3654.64712 -func (db *LDBDatabase) meter(refresh time.Duration) { - // Create the counters to store current and previous compaction values - compactions := make([][]float64, 2) - for i := 0; i < 2; i++ { - compactions[i] = make([]float64, 3) - } - // Create storage for iostats. - var iostats [2]float64 - - // Create storage and warning log tracer for write delay. - var ( - delaystats [2]int64 - lastWritePaused time.Time - ) - - var ( - errc chan error - merr error - ) +// AncientReader contains the methods required to read from immutable ancient data. +type AncientReader interface { + // HasAncient returns an indicator whether the specified data exists in the + // ancient store. + HasAncient(kind string, number uint64) (bool, error) - // Iterate ad infinitum and collect the stats - for i := 1; errc == nil && merr == nil; i++ { - // Retrieve the database stats - stats, err := db.db.GetProperty("leveldb.stats") - if err != nil { - db.log.Error("Failed to read database stats", "err", err) - merr = err - continue - } - // Find the compaction table, skip the header - lines := strings.Split(stats, "\n") - for len(lines) > 0 && strings.TrimSpace(lines[0]) != "Compactions" { - lines = lines[1:] - } - if len(lines) <= 3 { - db.log.Error("Compaction table not found") - merr = errors.New("compaction table not found") - continue - } - lines = lines[3:] + // Ancient retrieves an ancient binary blob from the append-only immutable files. + Ancient(kind string, number uint64) ([]byte, error) - // Iterate over all the table rows, and accumulate the entries - for j := 0; j < len(compactions[i%2]); j++ { - compactions[i%2][j] = 0 - } - for _, line := range lines { - parts := strings.Split(line, "|") - if len(parts) != 6 { - break - } - for idx, counter := range parts[3:] { - value, err := strconv.ParseFloat(strings.TrimSpace(counter), 64) - if err != nil { - db.log.Error("Compaction entry parsing failed", "err", err) - merr = err - continue - } - compactions[i%2][idx] += value - } - } - // Update all the requested meters - if db.compTimeMeter != nil { - db.compTimeMeter.Mark(int64((compactions[i%2][0] - compactions[(i-1)%2][0]) * 1000 * 1000 * 1000)) - } - if db.compReadMeter != nil { - db.compReadMeter.Mark(int64((compactions[i%2][1] - compactions[(i-1)%2][1]) * 1024 * 1024)) - } - if db.compWriteMeter != nil { - db.compWriteMeter.Mark(int64((compactions[i%2][2] - compactions[(i-1)%2][2]) * 1024 * 1024)) - } + // Ancients returns the ancient item numbers in the ancient store. + Ancients() (uint64, error) - // Retrieve the write delay statistic - writedelay, err := db.db.GetProperty("leveldb.writedelay") - if err != nil { - db.log.Error("Failed to read database write delay statistic", "err", err) - merr = err - continue - } - var ( - delayN int64 - delayDuration string - duration time.Duration - paused bool - ) - if n, err := fmt.Sscanf(writedelay, "DelayN:%d Delay:%s Paused:%t", &delayN, &delayDuration, &paused); n != 3 || err != nil { - db.log.Error("Write delay statistic not found") - merr = err - continue - } - duration, err = time.ParseDuration(delayDuration) - if err != nil { - db.log.Error("Failed to parse delay duration", "err", err) - merr = err - continue - } - if db.writeDelayNMeter != nil { - db.writeDelayNMeter.Mark(delayN - delaystats[0]) - } - if db.writeDelayMeter != nil { - db.writeDelayMeter.Mark(duration.Nanoseconds() - delaystats[1]) - } - // If a warning that db is performing compaction has been displayed, any subsequent - // warnings will be withheld for one minute not to overwhelm the user. - if paused && delayN-delaystats[0] == 0 && duration.Nanoseconds()-delaystats[1] == 0 && - time.Now().After(lastWritePaused.Add(writePauseWarningThrottler)) { - db.log.Warn("Database compacting, degraded performance") - lastWritePaused = time.Now() - } - delaystats[0], delaystats[1] = delayN, duration.Nanoseconds() - - // Retrieve the database iostats. - ioStats, err := db.db.GetProperty("leveldb.iostats") - if err != nil { - db.log.Error("Failed to read database iostats", "err", err) - merr = err - continue - } - var nRead, nWrite float64 - parts := strings.Split(ioStats, " ") - if len(parts) < 2 { - db.log.Error("Bad syntax of ioStats", "ioStats", ioStats) - merr = fmt.Errorf("bad syntax of ioStats %s", ioStats) - continue - } - if n, err := fmt.Sscanf(parts[0], "Read(MB):%f", &nRead); n != 1 || err != nil { - db.log.Error("Bad syntax of read entry", "entry", parts[0]) - merr = err - continue - } - if n, err := fmt.Sscanf(parts[1], "Write(MB):%f", &nWrite); n != 1 || err != nil { - db.log.Error("Bad syntax of write entry", "entry", parts[1]) - merr = err - continue - } - if db.diskReadMeter != nil { - db.diskReadMeter.Mark(int64((nRead - iostats[0]) * 1024 * 1024)) - } - if db.diskWriteMeter != nil { - db.diskWriteMeter.Mark(int64((nWrite - iostats[1]) * 1024 * 1024)) - } - iostats[0], iostats[1] = nRead, nWrite - - // Sleep a bit, then repeat the stats collection - select { - case errc = <-db.quitChan: - // Quit requesting, stop hammering the database - case <-time.After(refresh): - // Timeout, gather a new set of stats - } - } - - if errc == nil { - errc = <-db.quitChan - } - errc <- merr + // AncientSize returns the ancient size of the specified category. + AncientSize(kind string) (uint64, error) } -func (db *LDBDatabase) NewBatch() Batch { - return &ldbBatch{db: db.db, b: new(leveldb.Batch)} -} +// AncientWriter contains the methods required to write to immutable ancient data. +type AncientWriter interface { + // AppendAncient injects all binary blobs belong to block at the end of the + // append-only immutable table files. + AppendAncient(number uint64, hash, header, body, receipt, td []byte) error -type ldbBatch struct { - db *leveldb.DB - b *leveldb.Batch - size int -} - -func (b *ldbBatch) Put(key, value []byte) error { - b.b.Put(key, value) - b.size += len(value) - return nil -} - -func (b *ldbBatch) Delete(key []byte) error { - b.b.Delete(key) - b.size += 1 - return nil -} - -func (b *ldbBatch) Write() error { - return b.db.Write(b.b, nil) -} - -func (b *ldbBatch) ValueSize() int { - return b.size -} - -func (b *ldbBatch) Reset() { - b.b.Reset() - b.size = 0 -} - -type table struct { - db Database - prefix string -} - -// NewTable returns a Database object that prefixes all keys with a given -// string. -func NewTable(db Database, prefix string) Database { - return &table{ - db: db, - prefix: prefix, - } -} - -func (dt *table) Put(key []byte, value []byte) error { - return dt.db.Put(append([]byte(dt.prefix), key...), value) -} - -func (dt *table) Has(key []byte) (bool, error) { - return dt.db.Has(append([]byte(dt.prefix), key...)) -} - -func (dt *table) Get(key []byte) ([]byte, error) { - return dt.db.Get(append([]byte(dt.prefix), key...)) -} - -func (dt *table) Delete(key []byte) error { - return dt.db.Delete(append([]byte(dt.prefix), key...)) -} - -func (dt *table) Close() { - // Do nothing; don't close the underlying DB. -} - -type tableBatch struct { - batch Batch - prefix string -} - -// NewTableBatch returns a Batch object which prefixes all keys with a given string. -func NewTableBatch(db Database, prefix string) Batch { - return &tableBatch{db.NewBatch(), prefix} -} - -func (dt *table) NewBatch() Batch { - return &tableBatch{dt.db.NewBatch(), dt.prefix} -} + // TruncateAncients discards all but the first n ancient data from the ancient store. + TruncateAncients(n uint64) error -func (tb *tableBatch) Put(key, value []byte) error { - return tb.batch.Put(append([]byte(tb.prefix), key...), value) + // Sync flushes all in-memory ancient store data to disk. + Sync() error } -func (tb *tableBatch) Delete(key []byte) error { - return tb.batch.Delete(append([]byte(tb.prefix), key...)) +// Reader contains the methods required to read data from both key-value as well as +// immutable ancient data. +type Reader interface { + KeyValueReader + AncientReader } -func (tb *tableBatch) Write() error { - return tb.batch.Write() +// Writer contains the methods required to write data to both key-value as well as +// immutable ancient data. +type Writer interface { + KeyValueWriter + AncientWriter } -func (tb *tableBatch) ValueSize() int { - return tb.batch.ValueSize() +// AncientStore contains all the methods required to allow handling different +// ancient data stores backing immutable chain data store. +type AncientStore interface { + AncientReader + AncientWriter + io.Closer } -func (tb *tableBatch) Reset() { - tb.batch.Reset() +// Database contains all the methods required by the high level database to not +// only access the key-value data store but also the chain freezer. +type Database interface { + Reader + Writer + Batcher + Iteratee + Stater + Compacter + io.Closer } diff --git a/ethdb/database_test.go b/ethdb/database_test.go deleted file mode 100644 index 74675cbe63c3..000000000000 --- a/ethdb/database_test.go +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethdb_test - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "strconv" - "sync" - "testing" - - "github.com/ethereum/go-ethereum/ethdb" -) - -func newTestLDB() (*ethdb.LDBDatabase, func()) { - dirname, err := ioutil.TempDir(os.TempDir(), "ethdb_test_") - if err != nil { - panic("failed to create test file: " + err.Error()) - } - db, err := ethdb.NewLDBDatabase(dirname, 0, 0) - if err != nil { - panic("failed to create test database: " + err.Error()) - } - - return db, func() { - db.Close() - os.RemoveAll(dirname) - } -} - -var test_values = []string{"", "a", "1251", "\x00123\x00"} - -func TestLDB_PutGet(t *testing.T) { - db, remove := newTestLDB() - defer remove() - testPutGet(db, t) -} - -func TestMemoryDB_PutGet(t *testing.T) { - testPutGet(ethdb.NewMemDatabase(), t) -} - -func testPutGet(db ethdb.Database, t *testing.T) { - t.Parallel() - - for _, k := range test_values { - err := db.Put([]byte(k), nil) - if err != nil { - t.Fatalf("put failed: %v", err) - } - } - - for _, k := range test_values { - data, err := db.Get([]byte(k)) - if err != nil { - t.Fatalf("get failed: %v", err) - } - if len(data) != 0 { - t.Fatalf("get returned wrong result, got %q expected nil", string(data)) - } - } - - _, err := db.Get([]byte("non-exist-key")) - if err == nil { - t.Fatalf("expect to return a not found error") - } - - for _, v := range test_values { - err := db.Put([]byte(v), []byte(v)) - if err != nil { - t.Fatalf("put failed: %v", err) - } - } - - for _, v := range test_values { - data, err := db.Get([]byte(v)) - if err != nil { - t.Fatalf("get failed: %v", err) - } - if !bytes.Equal(data, []byte(v)) { - t.Fatalf("get returned wrong result, got %q expected %q", string(data), v) - } - } - - for _, v := range test_values { - err := db.Put([]byte(v), []byte("?")) - if err != nil { - t.Fatalf("put override failed: %v", err) - } - } - - for _, v := range test_values { - data, err := db.Get([]byte(v)) - if err != nil { - t.Fatalf("get failed: %v", err) - } - if !bytes.Equal(data, []byte("?")) { - t.Fatalf("get returned wrong result, got %q expected ?", string(data)) - } - } - - for _, v := range test_values { - orig, err := db.Get([]byte(v)) - if err != nil { - t.Fatalf("get failed: %v", err) - } - orig[0] = byte(0xff) - data, err := db.Get([]byte(v)) - if err != nil { - t.Fatalf("get failed: %v", err) - } - if !bytes.Equal(data, []byte("?")) { - t.Fatalf("get returned wrong result, got %q expected ?", string(data)) - } - } - - for _, v := range test_values { - err := db.Delete([]byte(v)) - if err != nil { - t.Fatalf("delete %q failed: %v", v, err) - } - } - - for _, v := range test_values { - _, err := db.Get([]byte(v)) - if err == nil { - t.Fatalf("got deleted value %q", v) - } - } -} - -func TestLDB_ParallelPutGet(t *testing.T) { - db, remove := newTestLDB() - defer remove() - testParallelPutGet(db, t) -} - -func TestMemoryDB_ParallelPutGet(t *testing.T) { - testParallelPutGet(ethdb.NewMemDatabase(), t) -} - -func testParallelPutGet(db ethdb.Database, t *testing.T) { - const n = 8 - var pending sync.WaitGroup - - pending.Add(n) - for i := 0; i < n; i++ { - go func(key string) { - defer pending.Done() - err := db.Put([]byte(key), []byte("v"+key)) - if err != nil { - panic("put failed: " + err.Error()) - } - }(strconv.Itoa(i)) - } - pending.Wait() - - pending.Add(n) - for i := 0; i < n; i++ { - go func(key string) { - defer pending.Done() - data, err := db.Get([]byte(key)) - if err != nil { - panic("get failed: " + err.Error()) - } - if !bytes.Equal(data, []byte("v"+key)) { - panic(fmt.Sprintf("get failed, got %q expected %q", []byte(data), []byte("v"+key))) - } - }(strconv.Itoa(i)) - } - pending.Wait() - - pending.Add(n) - for i := 0; i < n; i++ { - go func(key string) { - defer pending.Done() - err := db.Delete([]byte(key)) - if err != nil { - panic("delete failed: " + err.Error()) - } - }(strconv.Itoa(i)) - } - pending.Wait() - - pending.Add(n) - for i := 0; i < n; i++ { - go func(key string) { - defer pending.Done() - _, err := db.Get([]byte(key)) - if err == nil { - panic("get succeeded") - } - }(strconv.Itoa(i)) - } - pending.Wait() -} diff --git a/ethdb/interface.go b/ethdb/interface.go deleted file mode 100644 index af13557798cf..000000000000 --- a/ethdb/interface.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethdb - -// Code using batches should try to add this much data to the batch. -// The value was determined empirically. -const IdealBatchSize = 100 * 1024 - -// Putter wraps the database write operation supported by both batches and regular databases. -type Putter interface { - Put(key []byte, value []byte) error -} - -// Deleter wraps the database delete operation supported by both batches and regular databases. -type Deleter interface { - Delete(key []byte) error -} - -// Database wraps all database operations. All methods are safe for concurrent use. -type Database interface { - Putter - Deleter - Get(key []byte) ([]byte, error) - Has(key []byte) (bool, error) - Close() - NewBatch() Batch -} - -// Batch is a write-only database that commits changes to its host database -// when Write is called. Batch cannot be used concurrently. -type Batch interface { - Putter - Deleter - ValueSize() int // amount of data in the batch - Write() error - // Reset resets the batch for reuse - Reset() -} diff --git a/ethdb/iterator.go b/ethdb/iterator.go new file mode 100644 index 000000000000..419e9bdfc21f --- /dev/null +++ b/ethdb/iterator.go @@ -0,0 +1,66 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package ethdb + +// Iterator iterates over a database's key/value pairs in ascending key order. +// +// When it encounters an error any seek will return false and will yield no key/ +// value pairs. The error can be queried by calling the Error method. Calling +// Release is still necessary. +// +// An iterator must be released after use, but it is not necessary to read an +// iterator until exhaustion. An iterator is not safe for concurrent use, but it +// is safe to use multiple iterators concurrently. +type Iterator interface { + // Next moves the iterator to the next key/value pair. It returns whether the + // iterator is exhausted. + Next() bool + + // Error returns any accumulated error. Exhausting all the key/value pairs + // is not considered to be an error. + Error() error + + // Key returns the key of the current key/value pair, or nil if done. The caller + // should not modify the contents of the returned slice, and its contents may + // change on the next call to Next. + Key() []byte + + // Value returns the value of the current key/value pair, or nil if done. The + // caller should not modify the contents of the returned slice, and its contents + // may change on the next call to Next. + Value() []byte + + // Release releases associated resources. Release should always succeed and can + // be called multiple times without causing error. + Release() +} + +// Iteratee wraps the NewIterator methods of a backing data store. +type Iteratee interface { + // NewIterator creates a binary-alphabetical iterator over the entire keyspace + // contained within the key-value database. + NewIterator() Iterator + + // NewIteratorWithStart creates a binary-alphabetical iterator over a subset of + // database content starting at a particular initial key (or after, if it does + // not exist). + NewIteratorWithStart(start []byte) Iterator + + // NewIteratorWithPrefix creates a binary-alphabetical iterator over a subset + // of database content with a particular key prefix. + NewIteratorWithPrefix(prefix []byte) Iterator +} diff --git a/ethdb/leveldb/leveldb.go b/ethdb/leveldb/leveldb.go new file mode 100644 index 000000000000..aba6593c7a06 --- /dev/null +++ b/ethdb/leveldb/leveldb.go @@ -0,0 +1,458 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// +build !js + +// Package leveldb implements the key-value database layer based on LevelDB. +package leveldb + +import ( + "fmt" + "strconv" + "strings" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/errors" + "github.com/syndtr/goleveldb/leveldb/filter" + "github.com/syndtr/goleveldb/leveldb/opt" + "github.com/syndtr/goleveldb/leveldb/util" +) + +const ( + // degradationWarnInterval specifies how often warning should be printed if the + // leveldb database cannot keep up with requested writes. + degradationWarnInterval = time.Minute + + // minCache is the minimum amount of memory in megabytes to allocate to leveldb + // read and write caching, split half and half. + minCache = 16 + + // minHandles is the minimum number of files handles to allocate to the open + // database files. + minHandles = 16 + + // metricsGatheringInterval specifies the interval to retrieve leveldb database + // compaction, io and pause stats to report to the user. + metricsGatheringInterval = 3 * time.Second +) + +// Database is a persistent key-value store. Apart from basic data storage +// functionality it also supports batch writes and iterating over the keyspace in +// binary-alphabetical order. +type Database struct { + fn string // filename for reporting + db *leveldb.DB // LevelDB instance + + compTimeMeter metrics.Meter // Meter for measuring the total time spent in database compaction + compReadMeter metrics.Meter // Meter for measuring the data read during compaction + compWriteMeter metrics.Meter // Meter for measuring the data written during compaction + writeDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction + writeDelayMeter metrics.Meter // Meter for measuring the write delay duration due to database compaction + diskSizeGauge metrics.Gauge // Gauge for tracking the size of all the levels in the database + diskReadMeter metrics.Meter // Meter for measuring the effective amount of data read + diskWriteMeter metrics.Meter // Meter for measuring the effective amount of data written + + quitLock sync.Mutex // Mutex protecting the quit channel access + quitChan chan chan error // Quit channel to stop the metrics collection before closing the database + + log log.Logger // Contextual logger tracking the database path +} + +// New returns a wrapped LevelDB object. The namespace is the prefix that the +// metrics reporting should use for surfacing internal stats. +func New(file string, cache int, handles int, namespace string) (*Database, error) { + // Ensure we have some minimal caching and file guarantees + if cache < minCache { + cache = minCache + } + if handles < minHandles { + handles = minHandles + } + logger := log.New("database", file) + logger.Info("Allocated cache and file handles", "cache", common.StorageSize(cache*1024*1024), "handles", handles) + + // Open the db and recover any potential corruptions + db, err := leveldb.OpenFile(file, &opt.Options{ + OpenFilesCacheCapacity: handles, + BlockCacheCapacity: cache / 2 * opt.MiB, + WriteBuffer: cache / 4 * opt.MiB, // Two of these are used internally + Filter: filter.NewBloomFilter(10), + }) + if _, corrupted := err.(*errors.ErrCorrupted); corrupted { + db, err = leveldb.RecoverFile(file, nil) + } + if err != nil { + return nil, err + } + // Assemble the wrapper with all the registered metrics + ldb := &Database{ + fn: file, + db: db, + log: logger, + quitChan: make(chan chan error), + } + ldb.compTimeMeter = metrics.NewRegisteredMeter(namespace+"compact/time", nil) + ldb.compReadMeter = metrics.NewRegisteredMeter(namespace+"compact/input", nil) + ldb.compWriteMeter = metrics.NewRegisteredMeter(namespace+"compact/output", nil) + ldb.diskSizeGauge = metrics.NewRegisteredGauge(namespace+"disk/size", nil) + ldb.diskReadMeter = metrics.NewRegisteredMeter(namespace+"disk/read", nil) + ldb.diskWriteMeter = metrics.NewRegisteredMeter(namespace+"disk/write", nil) + ldb.writeDelayMeter = metrics.NewRegisteredMeter(namespace+"compact/writedelay/duration", nil) + ldb.writeDelayNMeter = metrics.NewRegisteredMeter(namespace+"compact/writedelay/counter", nil) + + // Start up the metrics gathering and return + go ldb.meter(metricsGatheringInterval) + return ldb, nil +} + +// Close stops the metrics collection, flushes any pending data to disk and closes +// all io accesses to the underlying key-value store. +func (db *Database) Close() error { + db.quitLock.Lock() + defer db.quitLock.Unlock() + + if db.quitChan != nil { + errc := make(chan error) + db.quitChan <- errc + if err := <-errc; err != nil { + db.log.Error("Metrics collection failed", "err", err) + } + db.quitChan = nil + } + return db.db.Close() +} + +// Has retrieves if a key is present in the key-value store. +func (db *Database) Has(key []byte) (bool, error) { + return db.db.Has(key, nil) +} + +// Get retrieves the given key if it's present in the key-value store. +func (db *Database) Get(key []byte) ([]byte, error) { + dat, err := db.db.Get(key, nil) + if err != nil { + return nil, err + } + return dat, nil +} + +// Put inserts the given value into the key-value store. +func (db *Database) Put(key []byte, value []byte) error { + return db.db.Put(key, value, nil) +} + +// Delete removes the key from the key-value store. +func (db *Database) Delete(key []byte) error { + return db.db.Delete(key, nil) +} + +// NewBatch creates a write-only key-value store that buffers changes to its host +// database until a final write is called. +func (db *Database) NewBatch() ethdb.Batch { + return &batch{ + db: db.db, + b: new(leveldb.Batch), + } +} + +// NewIterator creates a binary-alphabetical iterator over the entire keyspace +// contained within the leveldb database. +func (db *Database) NewIterator() ethdb.Iterator { + return db.db.NewIterator(new(util.Range), nil) +} + +// NewIteratorWithStart creates a binary-alphabetical iterator over a subset of +// database content starting at a particular initial key (or after, if it does +// not exist). +func (db *Database) NewIteratorWithStart(start []byte) ethdb.Iterator { + return db.db.NewIterator(&util.Range{Start: start}, nil) +} + +// NewIteratorWithPrefix creates a binary-alphabetical iterator over a subset +// of database content with a particular key prefix. +func (db *Database) NewIteratorWithPrefix(prefix []byte) ethdb.Iterator { + return db.db.NewIterator(util.BytesPrefix(prefix), nil) +} + +// Stat returns a particular internal stat of the database. +func (db *Database) Stat(property string) (string, error) { + return db.db.GetProperty(property) +} + +// Compact flattens the underlying data store for the given key range. In essence, +// deleted and overwritten versions are discarded, and the data is rearranged to +// reduce the cost of operations needed to access them. +// +// A nil start is treated as a key before all keys in the data store; a nil limit +// is treated as a key after all keys in the data store. If both is nil then it +// will compact entire data store. +func (db *Database) Compact(start []byte, limit []byte) error { + return db.db.CompactRange(util.Range{Start: start, Limit: limit}) +} + +// Path returns the path to the database directory. +func (db *Database) Path() string { + return db.fn +} + +// meter periodically retrieves internal leveldb counters and reports them to +// the metrics subsystem. +// +// This is how a LevelDB stats table looks like (currently): +// Compactions +// Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB) +// -------+------------+---------------+---------------+---------------+--------------- +// 0 | 0 | 0.00000 | 1.27969 | 0.00000 | 12.31098 +// 1 | 85 | 109.27913 | 28.09293 | 213.92493 | 214.26294 +// 2 | 523 | 1000.37159 | 7.26059 | 66.86342 | 66.77884 +// 3 | 570 | 1113.18458 | 0.00000 | 0.00000 | 0.00000 +// +// This is how the write delay look like (currently): +// DelayN:5 Delay:406.604657ms Paused: false +// +// This is how the iostats look like (currently): +// Read(MB):3895.04860 Write(MB):3654.64712 +func (db *Database) meter(refresh time.Duration) { + // Create the counters to store current and previous compaction values + compactions := make([][]float64, 2) + for i := 0; i < 2; i++ { + compactions[i] = make([]float64, 4) + } + // Create storage for iostats. + var iostats [2]float64 + + // Create storage and warning log tracer for write delay. + var ( + delaystats [2]int64 + lastWritePaused time.Time + ) + + var ( + errc chan error + merr error + ) + + // Iterate ad infinitum and collect the stats + for i := 1; errc == nil && merr == nil; i++ { + // Retrieve the database stats + stats, err := db.db.GetProperty("leveldb.stats") + if err != nil { + db.log.Error("Failed to read database stats", "err", err) + merr = err + continue + } + // Find the compaction table, skip the header + lines := strings.Split(stats, "\n") + for len(lines) > 0 && strings.TrimSpace(lines[0]) != "Compactions" { + lines = lines[1:] + } + if len(lines) <= 3 { + db.log.Error("Compaction leveldbTable not found") + merr = errors.New("compaction leveldbTable not found") + continue + } + lines = lines[3:] + + // Iterate over all the leveldbTable rows, and accumulate the entries + for j := 0; j < len(compactions[i%2]); j++ { + compactions[i%2][j] = 0 + } + for _, line := range lines { + parts := strings.Split(line, "|") + if len(parts) != 6 { + break + } + for idx, counter := range parts[2:] { + value, err := strconv.ParseFloat(strings.TrimSpace(counter), 64) + if err != nil { + db.log.Error("Compaction entry parsing failed", "err", err) + merr = err + continue + } + compactions[i%2][idx] += value + } + } + // Update all the requested meters + if db.diskSizeGauge != nil { + db.diskSizeGauge.Update(int64(compactions[i%2][0] * 1024 * 1024)) + } + if db.compTimeMeter != nil { + db.compTimeMeter.Mark(int64((compactions[i%2][1] - compactions[(i-1)%2][1]) * 1000 * 1000 * 1000)) + } + if db.compReadMeter != nil { + db.compReadMeter.Mark(int64((compactions[i%2][2] - compactions[(i-1)%2][2]) * 1024 * 1024)) + } + if db.compWriteMeter != nil { + db.compWriteMeter.Mark(int64((compactions[i%2][3] - compactions[(i-1)%2][3]) * 1024 * 1024)) + } + // Retrieve the write delay statistic + writedelay, err := db.db.GetProperty("leveldb.writedelay") + if err != nil { + db.log.Error("Failed to read database write delay statistic", "err", err) + merr = err + continue + } + var ( + delayN int64 + delayDuration string + duration time.Duration + paused bool + ) + if n, err := fmt.Sscanf(writedelay, "DelayN:%d Delay:%s Paused:%t", &delayN, &delayDuration, &paused); n != 3 || err != nil { + db.log.Error("Write delay statistic not found") + merr = err + continue + } + duration, err = time.ParseDuration(delayDuration) + if err != nil { + db.log.Error("Failed to parse delay duration", "err", err) + merr = err + continue + } + if db.writeDelayNMeter != nil { + db.writeDelayNMeter.Mark(delayN - delaystats[0]) + } + if db.writeDelayMeter != nil { + db.writeDelayMeter.Mark(duration.Nanoseconds() - delaystats[1]) + } + // If a warning that db is performing compaction has been displayed, any subsequent + // warnings will be withheld for one minute not to overwhelm the user. + if paused && delayN-delaystats[0] == 0 && duration.Nanoseconds()-delaystats[1] == 0 && + time.Now().After(lastWritePaused.Add(degradationWarnInterval)) { + db.log.Warn("Database compacting, degraded performance") + lastWritePaused = time.Now() + } + delaystats[0], delaystats[1] = delayN, duration.Nanoseconds() + + // Retrieve the database iostats. + ioStats, err := db.db.GetProperty("leveldb.iostats") + if err != nil { + db.log.Error("Failed to read database iostats", "err", err) + merr = err + continue + } + var nRead, nWrite float64 + parts := strings.Split(ioStats, " ") + if len(parts) < 2 { + db.log.Error("Bad syntax of ioStats", "ioStats", ioStats) + merr = fmt.Errorf("bad syntax of ioStats %s", ioStats) + continue + } + if n, err := fmt.Sscanf(parts[0], "Read(MB):%f", &nRead); n != 1 || err != nil { + db.log.Error("Bad syntax of read entry", "entry", parts[0]) + merr = err + continue + } + if n, err := fmt.Sscanf(parts[1], "Write(MB):%f", &nWrite); n != 1 || err != nil { + db.log.Error("Bad syntax of write entry", "entry", parts[1]) + merr = err + continue + } + if db.diskReadMeter != nil { + db.diskReadMeter.Mark(int64((nRead - iostats[0]) * 1024 * 1024)) + } + if db.diskWriteMeter != nil { + db.diskWriteMeter.Mark(int64((nWrite - iostats[1]) * 1024 * 1024)) + } + iostats[0], iostats[1] = nRead, nWrite + + // Sleep a bit, then repeat the stats collection + select { + case errc = <-db.quitChan: + // Quit requesting, stop hammering the database + case <-time.After(refresh): + // Timeout, gather a new set of stats + } + } + + if errc == nil { + errc = <-db.quitChan + } + errc <- merr +} + +// batch is a write-only leveldb batch that commits changes to its host database +// when Write is called. A batch cannot be used concurrently. +type batch struct { + db *leveldb.DB + b *leveldb.Batch + size int +} + +// Put inserts the given value into the batch for later committing. +func (b *batch) Put(key, value []byte) error { + b.b.Put(key, value) + b.size += len(value) + return nil +} + +// Delete inserts the a key removal into the batch for later committing. +func (b *batch) Delete(key []byte) error { + b.b.Delete(key) + b.size++ + return nil +} + +// ValueSize retrieves the amount of data queued up for writing. +func (b *batch) ValueSize() int { + return b.size +} + +// Write flushes any accumulated data to disk. +func (b *batch) Write() error { + return b.db.Write(b.b, nil) +} + +// Reset resets the batch for reuse. +func (b *batch) Reset() { + b.b.Reset() + b.size = 0 +} + +// Replay replays the batch contents. +func (b *batch) Replay(w ethdb.KeyValueWriter) error { + return b.b.Replay(&replayer{writer: w}) +} + +// replayer is a small wrapper to implement the correct replay methods. +type replayer struct { + writer ethdb.KeyValueWriter + failure error +} + +// Put inserts the given value into the key-value data store. +func (r *replayer) Put(key, value []byte) { + // If the replay already failed, stop executing ops + if r.failure != nil { + return + } + r.failure = r.writer.Put(key, value) +} + +// Delete removes the key from the key-value data store. +func (r *replayer) Delete(key []byte) { + // If the replay already failed, stop executing ops + if r.failure != nil { + return + } + r.failure = r.writer.Delete(key) +} diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go deleted file mode 100644 index 727f2f7ca35d..000000000000 --- a/ethdb/memory_database.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethdb - -import ( - "errors" - "sync" - - "github.com/ethereum/go-ethereum/common" -) - -/* - * This is a test memory database. Do not use for any production it does not get persisted - */ -type MemDatabase struct { - db map[string][]byte - lock sync.RWMutex -} - -func NewMemDatabase() *MemDatabase { - return &MemDatabase{ - db: make(map[string][]byte), - } -} - -func NewMemDatabaseWithCap(size int) *MemDatabase { - return &MemDatabase{ - db: make(map[string][]byte, size), - } -} - -func (db *MemDatabase) Put(key []byte, value []byte) error { - db.lock.Lock() - defer db.lock.Unlock() - - db.db[string(key)] = common.CopyBytes(value) - return nil -} - -func (db *MemDatabase) Has(key []byte) (bool, error) { - db.lock.RLock() - defer db.lock.RUnlock() - - _, ok := db.db[string(key)] - return ok, nil -} - -func (db *MemDatabase) Get(key []byte) ([]byte, error) { - db.lock.RLock() - defer db.lock.RUnlock() - - if entry, ok := db.db[string(key)]; ok { - return common.CopyBytes(entry), nil - } - return nil, errors.New("not found") -} - -func (db *MemDatabase) Keys() [][]byte { - db.lock.RLock() - defer db.lock.RUnlock() - - keys := [][]byte{} - for key := range db.db { - keys = append(keys, []byte(key)) - } - return keys -} - -func (db *MemDatabase) Delete(key []byte) error { - db.lock.Lock() - defer db.lock.Unlock() - - delete(db.db, string(key)) - return nil -} - -func (db *MemDatabase) Close() {} - -func (db *MemDatabase) NewBatch() Batch { - return &memBatch{db: db} -} - -func (db *MemDatabase) Len() int { return len(db.db) } - -type kv struct { - k, v []byte - del bool -} - -type memBatch struct { - db *MemDatabase - writes []kv - size int -} - -func (b *memBatch) Put(key, value []byte) error { - b.writes = append(b.writes, kv{common.CopyBytes(key), common.CopyBytes(value), false}) - b.size += len(value) - return nil -} - -func (b *memBatch) Delete(key []byte) error { - b.writes = append(b.writes, kv{common.CopyBytes(key), nil, true}) - b.size += 1 - return nil -} - -func (b *memBatch) Write() error { - b.db.lock.Lock() - defer b.db.lock.Unlock() - - for _, kv := range b.writes { - if kv.del { - delete(b.db.db, string(kv.k)) - continue - } - b.db.db[string(kv.k)] = kv.v - } - return nil -} - -func (b *memBatch) ValueSize() int { - return b.size -} - -func (b *memBatch) Reset() { - b.writes = b.writes[:0] - b.size = 0 -} diff --git a/ethdb/memorydb/memorydb.go b/ethdb/memorydb/memorydb.go new file mode 100644 index 000000000000..70eb8964dd0c --- /dev/null +++ b/ethdb/memorydb/memorydb.go @@ -0,0 +1,343 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package memorydb implements the key-value database layer based on memory maps. +package memorydb + +import ( + "errors" + "sort" + "strings" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" +) + +var ( + // errMemorydbClosed is returned if a memory database was already closed at the + // invocation of a data access operation. + errMemorydbClosed = errors.New("database closed") + + // errMemorydbNotFound is returned if a key is requested that is not found in + // the provided memory database. + errMemorydbNotFound = errors.New("not found") +) + +// Database is an ephemeral key-value store. Apart from basic data storage +// functionality it also supports batch writes and iterating over the keyspace in +// binary-alphabetical order. +type Database struct { + db map[string][]byte + lock sync.RWMutex +} + +// New returns a wrapped map with all the required database interface methods +// implemented. +func New() *Database { + return &Database{ + db: make(map[string][]byte), + } +} + +// NewWithCap returns a wrapped map pre-allocated to the provided capcity with +// all the required database interface methods implemented. +func NewWithCap(size int) *Database { + return &Database{ + db: make(map[string][]byte, size), + } +} + +// Close deallocates the internal map and ensures any consecutive data access op +// failes with an error. +func (db *Database) Close() error { + db.lock.Lock() + defer db.lock.Unlock() + + db.db = nil + return nil +} + +// Has retrieves if a key is present in the key-value store. +func (db *Database) Has(key []byte) (bool, error) { + db.lock.RLock() + defer db.lock.RUnlock() + + if db.db == nil { + return false, errMemorydbClosed + } + _, ok := db.db[string(key)] + return ok, nil +} + +// Get retrieves the given key if it's present in the key-value store. +func (db *Database) Get(key []byte) ([]byte, error) { + db.lock.RLock() + defer db.lock.RUnlock() + + if db.db == nil { + return nil, errMemorydbClosed + } + if entry, ok := db.db[string(key)]; ok { + return common.CopyBytes(entry), nil + } + return nil, errMemorydbNotFound +} + +// Put inserts the given value into the key-value store. +func (db *Database) Put(key []byte, value []byte) error { + db.lock.Lock() + defer db.lock.Unlock() + + if db.db == nil { + return errMemorydbClosed + } + db.db[string(key)] = common.CopyBytes(value) + return nil +} + +// Delete removes the key from the key-value store. +func (db *Database) Delete(key []byte) error { + db.lock.Lock() + defer db.lock.Unlock() + + if db.db == nil { + return errMemorydbClosed + } + delete(db.db, string(key)) + return nil +} + +// NewBatch creates a write-only key-value store that buffers changes to its host +// database until a final write is called. +func (db *Database) NewBatch() ethdb.Batch { + return &batch{ + db: db, + } +} + +// NewIterator creates a binary-alphabetical iterator over the entire keyspace +// contained within the memory database. +func (db *Database) NewIterator() ethdb.Iterator { + return db.NewIteratorWithStart(nil) +} + +// NewIteratorWithStart creates a binary-alphabetical iterator over a subset of +// database content starting at a particular initial key (or after, if it does +// not exist). +func (db *Database) NewIteratorWithStart(start []byte) ethdb.Iterator { + db.lock.RLock() + defer db.lock.RUnlock() + + var ( + st = string(start) + keys = make([]string, 0, len(db.db)) + values = make([][]byte, 0, len(db.db)) + ) + // Collect the keys from the memory database corresponding to the given start + for key := range db.db { + if key >= st { + keys = append(keys, key) + } + } + // Sort the items and retrieve the associated values + sort.Strings(keys) + for _, key := range keys { + values = append(values, db.db[key]) + } + return &iterator{ + keys: keys, + values: values, + } +} + +// NewIteratorWithPrefix creates a binary-alphabetical iterator over a subset +// of database content with a particular key prefix. +func (db *Database) NewIteratorWithPrefix(prefix []byte) ethdb.Iterator { + db.lock.RLock() + defer db.lock.RUnlock() + + var ( + pr = string(prefix) + keys = make([]string, 0, len(db.db)) + values = make([][]byte, 0, len(db.db)) + ) + // Collect the keys from the memory database corresponding to the given prefix + for key := range db.db { + if strings.HasPrefix(key, pr) { + keys = append(keys, key) + } + } + // Sort the items and retrieve the associated values + sort.Strings(keys) + for _, key := range keys { + values = append(values, db.db[key]) + } + return &iterator{ + keys: keys, + values: values, + } +} + +// Stat returns a particular internal stat of the database. +func (db *Database) Stat(property string) (string, error) { + return "", errors.New("unknown property") +} + +// Compact is not supported on a memory database. +func (db *Database) Compact(start []byte, limit []byte) error { + return errors.New("unsupported operation") +} + +// Len returns the number of entries currently present in the memory database. +// +// Note, this method is only used for testing (i.e. not public in general) and +// does not have explicit checks for closed-ness to allow simpler testing code. +func (db *Database) Len() int { + db.lock.RLock() + defer db.lock.RUnlock() + + return len(db.db) +} + +// keyvalue is a key-value tuple tagged with a deletion field to allow creating +// memory-database write batches. +type keyvalue struct { + key []byte + value []byte + delete bool +} + +// batch is a write-only memory batch that commits changes to its host +// database when Write is called. A batch cannot be used concurrently. +type batch struct { + db *Database + writes []keyvalue + size int +} + +// Put inserts the given value into the batch for later committing. +func (b *batch) Put(key, value []byte) error { + b.writes = append(b.writes, keyvalue{common.CopyBytes(key), common.CopyBytes(value), false}) + b.size += len(value) + return nil +} + +// Delete inserts the a key removal into the batch for later committing. +func (b *batch) Delete(key []byte) error { + b.writes = append(b.writes, keyvalue{common.CopyBytes(key), nil, true}) + b.size += 1 + return nil +} + +// ValueSize retrieves the amount of data queued up for writing. +func (b *batch) ValueSize() int { + return b.size +} + +// Write flushes any accumulated data to the memory database. +func (b *batch) Write() error { + b.db.lock.Lock() + defer b.db.lock.Unlock() + + for _, keyvalue := range b.writes { + if keyvalue.delete { + delete(b.db.db, string(keyvalue.key)) + continue + } + b.db.db[string(keyvalue.key)] = keyvalue.value + } + return nil +} + +// Reset resets the batch for reuse. +func (b *batch) Reset() { + b.writes = b.writes[:0] + b.size = 0 +} + +// Replay replays the batch contents. +func (b *batch) Replay(w ethdb.KeyValueWriter) error { + for _, keyvalue := range b.writes { + if keyvalue.delete { + if err := w.Delete(keyvalue.key); err != nil { + return err + } + continue + } + if err := w.Put(keyvalue.key, keyvalue.value); err != nil { + return err + } + } + return nil +} + +// iterator can walk over the (potentially partial) keyspace of a memory key +// value store. Internally it is a deep copy of the entire iterated state, +// sorted by keys. +type iterator struct { + inited bool + keys []string + values [][]byte +} + +// Next moves the iterator to the next key/value pair. It returns whether the +// iterator is exhausted. +func (it *iterator) Next() bool { + // If the iterator was not yet initialized, do it now + if !it.inited { + it.inited = true + return len(it.keys) > 0 + } + // Iterator already initialize, advance it + if len(it.keys) > 0 { + it.keys = it.keys[1:] + it.values = it.values[1:] + } + return len(it.keys) > 0 +} + +// Error returns any accumulated error. Exhausting all the key/value pairs +// is not considered to be an error. A memory iterator cannot encounter errors. +func (it *iterator) Error() error { + return nil +} + +// Key returns the key of the current key/value pair, or nil if done. The caller +// should not modify the contents of the returned slice, and its contents may +// change on the next call to Next. +func (it *iterator) Key() []byte { + if len(it.keys) > 0 { + return []byte(it.keys[0]) + } + return nil +} + +// Value returns the value of the current key/value pair, or nil if done. The +// caller should not modify the contents of the returned slice, and its contents +// may change on the next call to Next. +func (it *iterator) Value() []byte { + if len(it.values) > 0 { + return it.values[0] + } + return nil +} + +// Release releases associated resources. Release should always succeed and can +// be called multiple times without causing error. +func (it *iterator) Release() { + it.keys, it.values = nil, nil +} diff --git a/ethdb/memorydb/memorydb_test.go b/ethdb/memorydb/memorydb_test.go new file mode 100644 index 000000000000..325c065c13ab --- /dev/null +++ b/ethdb/memorydb/memorydb_test.go @@ -0,0 +1,100 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package memorydb + +import ( + "bytes" + "testing" +) + +// Tests that key-value iteration on top of a memory database works. +func TestMemoryDBIterator(t *testing.T) { + tests := []struct { + content map[string]string + prefix string + order []string + }{ + // Empty databases should be iterable + {map[string]string{}, "", nil}, + {map[string]string{}, "non-existent-prefix", nil}, + + // Single-item databases should be iterable + {map[string]string{"key": "val"}, "", []string{"key"}}, + {map[string]string{"key": "val"}, "k", []string{"key"}}, + {map[string]string{"key": "val"}, "l", nil}, + + // Multi-item databases should be fully iterable + { + map[string]string{"k1": "v1", "k5": "v5", "k2": "v2", "k4": "v4", "k3": "v3"}, + "", + []string{"k1", "k2", "k3", "k4", "k5"}, + }, + { + map[string]string{"k1": "v1", "k5": "v5", "k2": "v2", "k4": "v4", "k3": "v3"}, + "k", + []string{"k1", "k2", "k3", "k4", "k5"}, + }, + { + map[string]string{"k1": "v1", "k5": "v5", "k2": "v2", "k4": "v4", "k3": "v3"}, + "l", + nil, + }, + // Multi-item databases should be prefix-iterable + { + map[string]string{ + "ka1": "va1", "ka5": "va5", "ka2": "va2", "ka4": "va4", "ka3": "va3", + "kb1": "vb1", "kb5": "vb5", "kb2": "vb2", "kb4": "vb4", "kb3": "vb3", + }, + "ka", + []string{"ka1", "ka2", "ka3", "ka4", "ka5"}, + }, + { + map[string]string{ + "ka1": "va1", "ka5": "va5", "ka2": "va2", "ka4": "va4", "ka3": "va3", + "kb1": "vb1", "kb5": "vb5", "kb2": "vb2", "kb4": "vb4", "kb3": "vb3", + }, + "kc", + nil, + }, + } + for i, tt := range tests { + // Create the key-value data store + db := New() + for key, val := range tt.content { + if err := db.Put([]byte(key), []byte(val)); err != nil { + t.Fatalf("test %d: failed to insert item %s:%s into database: %v", i, key, val, err) + } + } + // Iterate over the database with the given configs and verify the results + it, idx := db.NewIteratorWithPrefix([]byte(tt.prefix)), 0 + for it.Next() { + if !bytes.Equal(it.Key(), []byte(tt.order[idx])) { + t.Errorf("test %d: item %d: key mismatch: have %s, want %s", i, idx, string(it.Key()), tt.order[idx]) + } + if !bytes.Equal(it.Value(), []byte(tt.content[tt.order[idx]])) { + t.Errorf("test %d: item %d: value mismatch: have %s, want %s", i, idx, string(it.Value()), tt.content[tt.order[idx]]) + } + idx++ + } + if err := it.Error(); err != nil { + t.Errorf("test %d: iteration failed: %v", i, err) + } + if idx != len(tt.order) { + t.Errorf("test %d: iteration terminated prematurely: have %d, want %d", i, idx, len(tt.order)) + } + } +} diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go index 9f3d7237e9b8..f9284722cf83 100644 --- a/ethstats/ethstats.go +++ b/ethstats/ethstats.go @@ -23,7 +23,7 @@ import ( "errors" "fmt" "math/big" - "net" + "net/http" "regexp" "runtime" "strconv" @@ -41,7 +41,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/rpc" - "golang.org/x/net/websocket" + "github.com/gorilla/websocket" ) const ( @@ -200,21 +200,21 @@ func (s *Service) loop() { path := fmt.Sprintf("%s/api", s.host) urls := []string{path} - if !strings.Contains(path, "://") { // url.Parse and url.IsAbs is unsuitable (https://github.com/golang/go/issues/19779) + // url.Parse and url.IsAbs is unsuitable (https://github.com/golang/go/issues/19779) + if !strings.Contains(path, "://") { urls = []string{"wss://" + path, "ws://" + path} } // Establish a websocket connection to the server on any supported URL var ( - conf *websocket.Config conn *websocket.Conn err error ) + dialer := websocket.Dialer{HandshakeTimeout: 5 * time.Second} + header := make(http.Header) + header.Set("origin", "http://localhost") for _, url := range urls { - if conf, err = websocket.NewConfig(url, "http://localhost/"); err != nil { - continue - } - conf.Dialer = &net.Dialer{Timeout: 5 * time.Second} - if conn, err = websocket.DialConfig(conf); err == nil { + conn, _, err = dialer.Dial(url, header) + if err == nil { break } } @@ -284,7 +284,7 @@ func (s *Service) readLoop(conn *websocket.Conn) { for { // Retrieve the next generic network packet and bail out on error var msg map[string][]interface{} - if err := websocket.JSON.Receive(conn, &msg); err != nil { + if err := conn.ReadJSON(&msg); err != nil { log.Warn("Failed to decode stats server message", "err", err) return } @@ -399,12 +399,12 @@ func (s *Service) login(conn *websocket.Conn) error { login := map[string][]interface{}{ "emit": {"hello", auth}, } - if err := websocket.JSON.Send(conn, login); err != nil { + if err := conn.WriteJSON(login); err != nil { return err } // Retrieve the remote ack or connection termination var ack map[string][]string - if err := websocket.JSON.Receive(conn, &ack); err != nil || len(ack["emit"]) != 1 || ack["emit"][0] != "ready" { + if err := conn.ReadJSON(&ack); err != nil || len(ack["emit"]) != 1 || ack["emit"][0] != "ready" { return errors.New("unauthorized") } return nil @@ -441,7 +441,7 @@ func (s *Service) reportLatency(conn *websocket.Conn) error { "clientTime": start.String(), }}, } - if err := websocket.JSON.Send(conn, ping); err != nil { + if err := conn.WriteJSON(ping); err != nil { return err } // Wait for the pong request to arrive back @@ -463,7 +463,7 @@ func (s *Service) reportLatency(conn *websocket.Conn) error { "latency": latency, }}, } - return websocket.JSON.Send(conn, stats) + return conn.WriteJSON(stats) } // blockStats is the information to report about individual blocks. @@ -514,7 +514,7 @@ func (s *Service) reportBlock(conn *websocket.Conn, block *types.Block) error { report := map[string][]interface{}{ "emit": {"block", stats}, } - return websocket.JSON.Send(conn, report) + return conn.WriteJSON(report) } // assembleBlockStats retrieves any required metadata to report a single block @@ -557,7 +557,7 @@ func (s *Service) assembleBlockStats(block *types.Block) *blockStats { Number: header.Number, Hash: header.Hash(), ParentHash: header.ParentHash, - Timestamp: header.Time, + Timestamp: new(big.Int).SetUint64(header.Time), Miner: author, GasUsed: header.GasUsed, GasLimit: header.GasLimit, @@ -628,7 +628,7 @@ func (s *Service) reportHistory(conn *websocket.Conn, list []uint64) error { report := map[string][]interface{}{ "emit": {"history", stats}, } - return websocket.JSON.Send(conn, report) + return conn.WriteJSON(report) } // pendStats is the information to report about pending transactions. @@ -658,7 +658,7 @@ func (s *Service) reportPending(conn *websocket.Conn) error { report := map[string][]interface{}{ "emit": {"pending", stats}, } - return websocket.JSON.Send(conn, report) + return conn.WriteJSON(report) } // nodeStats is the information to report about the local node. @@ -713,5 +713,5 @@ func (s *Service) reportStats(conn *websocket.Conn) error { report := map[string][]interface{}{ "emit": {"stats", stats}, } - return websocket.JSON.Send(conn, report) + return conn.WriteJSON(report) } diff --git a/event/event_test.go b/event/event_test.go index a12945a47102..2be357ba2d64 100644 --- a/event/event_test.go +++ b/event/event_test.go @@ -141,7 +141,7 @@ func TestMuxConcurrent(t *testing.T) { } } -func emptySubscriber(mux *TypeMux, types ...interface{}) { +func emptySubscriber(mux *TypeMux) { s := mux.Subscribe(testEvent(0)) go func() { for range s.Chan() { @@ -182,9 +182,9 @@ func BenchmarkPost1000(b *testing.B) { func BenchmarkPostConcurrent(b *testing.B) { var mux = new(TypeMux) defer mux.Stop() - emptySubscriber(mux, testEvent(0)) - emptySubscriber(mux, testEvent(0)) - emptySubscriber(mux, testEvent(0)) + emptySubscriber(mux) + emptySubscriber(mux) + emptySubscriber(mux) var wg sync.WaitGroup poster := func() { diff --git a/event/filter/filter.go b/event/filter/filter.go deleted file mode 100644 index a6fe46d6a060..000000000000 --- a/event/filter/filter.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package filter implements event filters. -package filter - -import "reflect" - -type Filter interface { - Compare(Filter) bool - Trigger(data interface{}) -} - -type FilterEvent struct { - filter Filter - data interface{} -} - -type Filters struct { - id int - watchers map[int]Filter - ch chan FilterEvent - - quit chan struct{} -} - -func New() *Filters { - return &Filters{ - ch: make(chan FilterEvent), - watchers: make(map[int]Filter), - quit: make(chan struct{}), - } -} - -func (f *Filters) Start() { - go f.loop() -} - -func (f *Filters) Stop() { - close(f.quit) -} - -func (f *Filters) Notify(filter Filter, data interface{}) { - f.ch <- FilterEvent{filter, data} -} - -func (f *Filters) Install(watcher Filter) int { - f.watchers[f.id] = watcher - f.id++ - - return f.id - 1 -} - -func (f *Filters) Uninstall(id int) { - delete(f.watchers, id) -} - -func (f *Filters) loop() { -out: - for { - select { - case <-f.quit: - break out - case event := <-f.ch: - for _, watcher := range f.watchers { - if reflect.TypeOf(watcher) == reflect.TypeOf(event.filter) { - if watcher.Compare(event.filter) { - watcher.Trigger(event.data) - } - } - } - } - } -} - -func (f *Filters) Match(a, b Filter) bool { - return reflect.TypeOf(a) == reflect.TypeOf(b) && a.Compare(b) -} - -func (f *Filters) Get(i int) Filter { - return f.watchers[i] -} diff --git a/event/filter/filter_test.go b/event/filter/filter_test.go deleted file mode 100644 index dcc91124537f..000000000000 --- a/event/filter/filter_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package filter - -import ( - "testing" - "time" -) - -// Simple test to check if baseline matching/mismatching filtering works. -func TestFilters(t *testing.T) { - fm := New() - fm.Start() - - // Register two filters to catch posted data - first := make(chan struct{}) - fm.Install(Generic{ - Str1: "hello", - Fn: func(data interface{}) { - first <- struct{}{} - }, - }) - second := make(chan struct{}) - fm.Install(Generic{ - Str1: "hello1", - Str2: "hello", - Fn: func(data interface{}) { - second <- struct{}{} - }, - }) - // Post an event that should only match the first filter - fm.Notify(Generic{Str1: "hello"}, true) - fm.Stop() - - // Ensure only the mathcing filters fire - select { - case <-first: - case <-time.After(100 * time.Millisecond): - t.Error("matching filter timed out") - } - select { - case <-second: - t.Error("mismatching filter fired") - case <-time.After(100 * time.Millisecond): - } -} diff --git a/event/filter/generic_filter.go b/event/filter/generic_filter.go deleted file mode 100644 index d679b8bfa89e..000000000000 --- a/event/filter/generic_filter.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package filter - -type Generic struct { - Str1, Str2, Str3 string - Data map[string]struct{} - - Fn func(data interface{}) -} - -// self = registered, f = incoming -func (self Generic) Compare(f Filter) bool { - var strMatch, dataMatch = true, true - - filter := f.(Generic) - if (len(self.Str1) > 0 && filter.Str1 != self.Str1) || - (len(self.Str2) > 0 && filter.Str2 != self.Str2) || - (len(self.Str3) > 0 && filter.Str3 != self.Str3) { - strMatch = false - } - - for k := range self.Data { - if _, ok := filter.Data[k]; !ok { - return false - } - } - - return strMatch && dataMatch -} - -func (self Generic) Trigger(data interface{}) { - self.Fn(data) -} diff --git a/graphql/graphiql.go b/graphql/graphiql.go new file mode 100644 index 000000000000..483d4cea3b4e --- /dev/null +++ b/graphql/graphiql.go @@ -0,0 +1,120 @@ +// The MIT License (MIT) +// +// Copyright (c) 2016 Muhammed Thanish +// +// 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. + +package graphql + +import ( + "bytes" + "fmt" + "net/http" +) + +// GraphiQL is an in-browser IDE for exploring GraphiQL APIs. +// This handler returns GraphiQL when requested. +// +// For more information, see https://github.com/graphql/graphiql. +type GraphiQL struct{} + +func respond(w http.ResponseWriter, body []byte, code int) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("X-Content-Type-Options", "nosniff") + w.WriteHeader(code) + _, _ = w.Write(body) +} + +func errorJSON(msg string) []byte { + buf := bytes.Buffer{} + fmt.Fprintf(&buf, `{"error": "%s"}`, msg) + return buf.Bytes() +} + +func (h GraphiQL) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + respond(w, errorJSON("only GET requests are supported"), http.StatusMethodNotAllowed) + return + } + + w.Write(graphiql) +} + +var graphiql = []byte(` + + + + + + + + + + + +
Loading...
+ + + +`) diff --git a/graphql/graphql.go b/graphql/graphql.go new file mode 100644 index 000000000000..561a1d93600f --- /dev/null +++ b/graphql/graphql.go @@ -0,0 +1,1137 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package graphql provides a GraphQL interface to Ethereum node data. +package graphql + +import ( + "context" + "errors" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/filters" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" +) + +var OnlyOnMainChainError = errors.New("This operation is only available for blocks on the canonical chain.") +var BlockInvariantError = errors.New("Block objects must be instantiated with at least one of num or hash.") + +// Account represents an Ethereum account at a particular block. +type Account struct { + backend ethapi.Backend + address common.Address + blockNumber rpc.BlockNumber +} + +// getState fetches the StateDB object for an account. +func (a *Account) getState(ctx context.Context) (*state.StateDB, error) { + state, _, err := a.backend.StateAndHeaderByNumber(ctx, a.blockNumber) + return state, err +} + +func (a *Account) Address(ctx context.Context) (common.Address, error) { + return a.address, nil +} + +func (a *Account) Balance(ctx context.Context) (hexutil.Big, error) { + state, err := a.getState(ctx) + if err != nil { + return hexutil.Big{}, err + } + + return hexutil.Big(*state.GetBalance(a.address)), nil +} + +func (a *Account) TransactionCount(ctx context.Context) (hexutil.Uint64, error) { + state, err := a.getState(ctx) + if err != nil { + return 0, err + } + + return hexutil.Uint64(state.GetNonce(a.address)), nil +} + +func (a *Account) Code(ctx context.Context) (hexutil.Bytes, error) { + state, err := a.getState(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + + return hexutil.Bytes(state.GetCode(a.address)), nil +} + +func (a *Account) Storage(ctx context.Context, args struct{ Slot common.Hash }) (common.Hash, error) { + state, err := a.getState(ctx) + if err != nil { + return common.Hash{}, err + } + + return state.GetState(a.address, args.Slot), nil +} + +// Log represents an individual log message. All arguments are mandatory. +type Log struct { + backend ethapi.Backend + transaction *Transaction + log *types.Log +} + +func (l *Log) Transaction(ctx context.Context) *Transaction { + return l.transaction +} + +func (l *Log) Account(ctx context.Context, args BlockNumberArgs) *Account { + return &Account{ + backend: l.backend, + address: l.log.Address, + blockNumber: args.Number(), + } +} + +func (l *Log) Index(ctx context.Context) int32 { + return int32(l.log.Index) +} + +func (l *Log) Topics(ctx context.Context) []common.Hash { + return l.log.Topics +} + +func (l *Log) Data(ctx context.Context) hexutil.Bytes { + return hexutil.Bytes(l.log.Data) +} + +// Transaction represents an Ethereum transaction. +// backend and hash are mandatory; all others will be fetched when required. +type Transaction struct { + backend ethapi.Backend + hash common.Hash + tx *types.Transaction + block *Block + index uint64 +} + +// resolve returns the internal transaction object, fetching it if needed. +func (t *Transaction) resolve(ctx context.Context) (*types.Transaction, error) { + if t.tx == nil { + tx, blockHash, _, index := rawdb.ReadTransaction(t.backend.ChainDb(), t.hash) + if tx != nil { + t.tx = tx + t.block = &Block{ + backend: t.backend, + hash: blockHash, + canonical: unknown, + } + t.index = index + } else { + t.tx = t.backend.GetPoolTransaction(t.hash) + } + } + return t.tx, nil +} + +func (tx *Transaction) Hash(ctx context.Context) common.Hash { + return tx.hash +} + +func (t *Transaction) InputData(ctx context.Context) (hexutil.Bytes, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return hexutil.Bytes{}, err + } + return hexutil.Bytes(tx.Data()), nil +} + +func (t *Transaction) Gas(ctx context.Context) (hexutil.Uint64, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return 0, err + } + return hexutil.Uint64(tx.Gas()), nil +} + +func (t *Transaction) GasPrice(ctx context.Context) (hexutil.Big, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return hexutil.Big{}, err + } + return hexutil.Big(*tx.GasPrice()), nil +} + +func (t *Transaction) Value(ctx context.Context) (hexutil.Big, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return hexutil.Big{}, err + } + return hexutil.Big(*tx.Value()), nil +} + +func (t *Transaction) Nonce(ctx context.Context) (hexutil.Uint64, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return 0, err + } + return hexutil.Uint64(tx.Nonce()), nil +} + +func (t *Transaction) To(ctx context.Context, args BlockNumberArgs) (*Account, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return nil, err + } + + to := tx.To() + if to == nil { + return nil, nil + } + + return &Account{ + backend: t.backend, + address: *to, + blockNumber: args.Number(), + }, nil +} + +func (t *Transaction) From(ctx context.Context, args BlockNumberArgs) (*Account, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return nil, err + } + + var signer types.Signer = types.FrontierSigner{} + if tx.Protected() { + signer = types.NewEIP155Signer(tx.ChainId()) + } + from, _ := types.Sender(signer, tx) + + return &Account{ + backend: t.backend, + address: from, + blockNumber: args.Number(), + }, nil +} + +func (t *Transaction) Block(ctx context.Context) (*Block, error) { + if _, err := t.resolve(ctx); err != nil { + return nil, err + } + return t.block, nil +} + +func (t *Transaction) Index(ctx context.Context) (*int32, error) { + if _, err := t.resolve(ctx); err != nil { + return nil, err + } + if t.block == nil { + return nil, nil + } + index := int32(t.index) + return &index, nil +} + +// getReceipt returns the receipt associated with this transaction, if any. +func (t *Transaction) getReceipt(ctx context.Context) (*types.Receipt, error) { + if _, err := t.resolve(ctx); err != nil { + return nil, err + } + + if t.block == nil { + return nil, nil + } + + receipts, err := t.block.resolveReceipts(ctx) + if err != nil { + return nil, err + } + + return receipts[t.index], nil +} + +func (t *Transaction) Status(ctx context.Context) (*hexutil.Uint64, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil { + return nil, err + } + + ret := hexutil.Uint64(receipt.Status) + return &ret, nil +} + +func (t *Transaction) GasUsed(ctx context.Context) (*hexutil.Uint64, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil { + return nil, err + } + + ret := hexutil.Uint64(receipt.GasUsed) + return &ret, nil +} + +func (t *Transaction) CumulativeGasUsed(ctx context.Context) (*hexutil.Uint64, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil { + return nil, err + } + + ret := hexutil.Uint64(receipt.CumulativeGasUsed) + return &ret, nil +} + +func (t *Transaction) CreatedContract(ctx context.Context, args BlockNumberArgs) (*Account, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil || receipt.ContractAddress == (common.Address{}) { + return nil, err + } + + return &Account{ + backend: t.backend, + address: receipt.ContractAddress, + blockNumber: args.Number(), + }, nil +} + +func (t *Transaction) Logs(ctx context.Context) (*[]*Log, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil { + return nil, err + } + + ret := make([]*Log, 0, len(receipt.Logs)) + for _, log := range receipt.Logs { + ret = append(ret, &Log{ + backend: t.backend, + transaction: t, + log: log, + }) + } + return &ret, nil +} + +type BlockType int + +const ( + unknown BlockType = iota + isCanonical + notCanonical +) + +// Block represents an Ethereum block. +// backend, and either num or hash are mandatory. All other fields are lazily fetched +// when required. +type Block struct { + backend ethapi.Backend + num *rpc.BlockNumber + hash common.Hash + header *types.Header + block *types.Block + receipts []*types.Receipt + canonical BlockType // Indicates if this block is on the main chain or not. +} + +func (b *Block) onMainChain(ctx context.Context) error { + if b.canonical == unknown { + header, err := b.resolveHeader(ctx) + if err != nil { + return err + } + canonHeader, err := b.backend.HeaderByNumber(ctx, rpc.BlockNumber(header.Number.Uint64())) + if err != nil { + return err + } + if header.Hash() == canonHeader.Hash() { + b.canonical = isCanonical + } else { + b.canonical = notCanonical + } + } + if b.canonical != isCanonical { + return OnlyOnMainChainError + } + return nil +} + +// resolve returns the internal Block object representing this block, fetching +// it if necessary. +func (b *Block) resolve(ctx context.Context) (*types.Block, error) { + if b.block != nil { + return b.block, nil + } + + var err error + if b.hash != (common.Hash{}) { + b.block, err = b.backend.GetBlock(ctx, b.hash) + } else { + b.block, err = b.backend.BlockByNumber(ctx, *b.num) + } + if b.block != nil { + b.header = b.block.Header() + } + return b.block, err +} + +// resolveHeader returns the internal Header object for this block, fetching it +// if necessary. Call this function instead of `resolve` unless you need the +// additional data (transactions and uncles). +func (b *Block) resolveHeader(ctx context.Context) (*types.Header, error) { + if b.num == nil && b.hash == (common.Hash{}) { + return nil, BlockInvariantError + } + + if b.header == nil { + if _, err := b.resolve(ctx); err != nil { + return nil, err + } + } + return b.header, nil +} + +// resolveReceipts returns the list of receipts for this block, fetching them +// if necessary. +func (b *Block) resolveReceipts(ctx context.Context) ([]*types.Receipt, error) { + if b.receipts == nil { + hash := b.hash + if hash == (common.Hash{}) { + header, err := b.resolveHeader(ctx) + if err != nil { + return nil, err + } + hash = header.Hash() + } + + receipts, err := b.backend.GetReceipts(ctx, hash) + if err != nil { + return nil, err + } + b.receipts = []*types.Receipt(receipts) + } + return b.receipts, nil +} + +func (b *Block) Number(ctx context.Context) (hexutil.Uint64, error) { + if b.num == nil || *b.num == rpc.LatestBlockNumber { + header, err := b.resolveHeader(ctx) + if err != nil { + return 0, err + } + num := rpc.BlockNumber(header.Number.Uint64()) + b.num = &num + } + return hexutil.Uint64(*b.num), nil +} + +func (b *Block) Hash(ctx context.Context) (common.Hash, error) { + if b.hash == (common.Hash{}) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + b.hash = header.Hash() + } + return b.hash, nil +} + +func (b *Block) GasLimit(ctx context.Context) (hexutil.Uint64, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return 0, err + } + return hexutil.Uint64(header.GasLimit), nil +} + +func (b *Block) GasUsed(ctx context.Context) (hexutil.Uint64, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return 0, err + } + return hexutil.Uint64(header.GasUsed), nil +} + +func (b *Block) Parent(ctx context.Context) (*Block, error) { + // If the block hasn't been fetched, and we'll need it, fetch it. + if b.num == nil && b.hash != (common.Hash{}) && b.header == nil { + if _, err := b.resolve(ctx); err != nil { + return nil, err + } + } + + if b.header != nil && b.block.NumberU64() > 0 { + num := rpc.BlockNumber(b.header.Number.Uint64() - 1) + return &Block{ + backend: b.backend, + num: &num, + hash: b.header.ParentHash, + canonical: unknown, + }, nil + } + if b.num != nil && *b.num != 0 { + num := *b.num - 1 + return &Block{ + backend: b.backend, + num: &num, + canonical: isCanonical, + }, nil + } + return nil, nil +} + +func (b *Block) Difficulty(ctx context.Context) (hexutil.Big, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Big{}, err + } + return hexutil.Big(*header.Difficulty), nil +} + +func (b *Block) Timestamp(ctx context.Context) (hexutil.Uint64, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return 0, err + } + return hexutil.Uint64(header.Time), nil +} + +func (b *Block) Nonce(ctx context.Context) (hexutil.Bytes, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + return hexutil.Bytes(header.Nonce[:]), nil +} + +func (b *Block) MixHash(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.MixDigest, nil +} + +func (b *Block) TransactionsRoot(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.TxHash, nil +} + +func (b *Block) StateRoot(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.Root, nil +} + +func (b *Block) ReceiptsRoot(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.ReceiptHash, nil +} + +func (b *Block) OmmerHash(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.UncleHash, nil +} + +func (b *Block) OmmerCount(ctx context.Context) (*int32, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + count := int32(len(block.Uncles())) + return &count, err +} + +func (b *Block) Ommers(ctx context.Context) (*[]*Block, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + + ret := make([]*Block, 0, len(block.Uncles())) + for _, uncle := range block.Uncles() { + blockNumber := rpc.BlockNumber(uncle.Number.Uint64()) + ret = append(ret, &Block{ + backend: b.backend, + num: &blockNumber, + hash: uncle.Hash(), + header: uncle, + canonical: notCanonical, + }) + } + return &ret, nil +} + +func (b *Block) ExtraData(ctx context.Context) (hexutil.Bytes, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + return hexutil.Bytes(header.Extra), nil +} + +func (b *Block) LogsBloom(ctx context.Context) (hexutil.Bytes, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + return hexutil.Bytes(header.Bloom.Bytes()), nil +} + +func (b *Block) TotalDifficulty(ctx context.Context) (hexutil.Big, error) { + h := b.hash + if h == (common.Hash{}) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Big{}, err + } + h = header.Hash() + } + + return hexutil.Big(*b.backend.GetTd(h)), nil +} + +// BlockNumberArgs encapsulates arguments to accessors that specify a block number. +type BlockNumberArgs struct { + Block *hexutil.Uint64 +} + +// Number returns the provided block number, or rpc.LatestBlockNumber if none +// was provided. +func (a BlockNumberArgs) Number() rpc.BlockNumber { + if a.Block != nil { + return rpc.BlockNumber(*a.Block) + } + return rpc.LatestBlockNumber +} + +func (b *Block) Miner(ctx context.Context, args BlockNumberArgs) (*Account, error) { + block, err := b.resolve(ctx) + if err != nil { + return nil, err + } + + return &Account{ + backend: b.backend, + address: block.Coinbase(), + blockNumber: args.Number(), + }, nil +} + +func (b *Block) TransactionCount(ctx context.Context) (*int32, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + count := int32(len(block.Transactions())) + return &count, err +} + +func (b *Block) Transactions(ctx context.Context) (*[]*Transaction, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + + ret := make([]*Transaction, 0, len(block.Transactions())) + for i, tx := range block.Transactions() { + ret = append(ret, &Transaction{ + backend: b.backend, + hash: tx.Hash(), + tx: tx, + block: b, + index: uint64(i), + }) + } + return &ret, nil +} + +func (b *Block) TransactionAt(ctx context.Context, args struct{ Index int32 }) (*Transaction, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + + txes := block.Transactions() + if args.Index < 0 || int(args.Index) >= len(txes) { + return nil, nil + } + + tx := txes[args.Index] + return &Transaction{ + backend: b.backend, + hash: tx.Hash(), + tx: tx, + block: b, + index: uint64(args.Index), + }, nil +} + +func (b *Block) OmmerAt(ctx context.Context, args struct{ Index int32 }) (*Block, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + + uncles := block.Uncles() + if args.Index < 0 || int(args.Index) >= len(uncles) { + return nil, nil + } + + uncle := uncles[args.Index] + blockNumber := rpc.BlockNumber(uncle.Number.Uint64()) + return &Block{ + backend: b.backend, + num: &blockNumber, + hash: uncle.Hash(), + header: uncle, + canonical: notCanonical, + }, nil +} + +// BlockFilterCriteria encapsulates criteria passed to a `logs` accessor inside +// a block. +type BlockFilterCriteria struct { + Addresses *[]common.Address // restricts matches to events created by specific contracts + + // The Topic list restricts matches to particular event topics. Each event has a list + // of topics. Topics matches a prefix of that list. An empty element slice matches any + // topic. Non-empty elements represent an alternative that matches any of the + // contained topics. + // + // Examples: + // {} or nil matches any topic list + // {{A}} matches topic A in first position + // {{}, {B}} matches any topic in first position, B in second position + // {{A}, {B}} matches topic A in first position, B in second position + // {{A, B}}, {C, D}} matches topic (A OR B) in first position, (C OR D) in second position + Topics *[][]common.Hash +} + +// runFilter accepts a filter and executes it, returning all its results as +// `Log` objects. +func runFilter(ctx context.Context, be ethapi.Backend, filter *filters.Filter) ([]*Log, error) { + logs, err := filter.Logs(ctx) + if err != nil || logs == nil { + return nil, err + } + + ret := make([]*Log, 0, len(logs)) + for _, log := range logs { + ret = append(ret, &Log{ + backend: be, + transaction: &Transaction{backend: be, hash: log.TxHash}, + log: log, + }) + } + return ret, nil +} + +func (b *Block) Logs(ctx context.Context, args struct{ Filter BlockFilterCriteria }) ([]*Log, error) { + var addresses []common.Address + if args.Filter.Addresses != nil { + addresses = *args.Filter.Addresses + } + + var topics [][]common.Hash + if args.Filter.Topics != nil { + topics = *args.Filter.Topics + } + + hash := b.hash + if hash == (common.Hash{}) { + block, err := b.resolve(ctx) + if err != nil { + return nil, err + } + hash = block.Hash() + } + + // Construct the range filter + filter := filters.NewBlockFilter(b.backend, hash, addresses, topics) + + // Run the filter and return all the logs + return runFilter(ctx, b.backend, filter) +} + +func (b *Block) Account(ctx context.Context, args struct { + Address common.Address +}) (*Account, error) { + err := b.onMainChain(ctx) + if err != nil { + return nil, err + } + + if b.num == nil { + _, err := b.resolveHeader(ctx) + if err != nil { + return nil, err + } + } + + return &Account{ + backend: b.backend, + address: args.Address, + blockNumber: *b.num, + }, nil +} + +// CallData encapsulates arguments to `call` or `estimateGas`. +// All arguments are optional. +type CallData struct { + From *common.Address // The Ethereum address the call is from. + To *common.Address // The Ethereum address the call is to. + Gas *hexutil.Uint64 // The amount of gas provided for the call. + GasPrice *hexutil.Big // The price of each unit of gas, in wei. + Value *hexutil.Big // The value sent along with the call. + Data *hexutil.Bytes // Any data sent with the call. +} + +// CallResult encapsulates the result of an invocation of the `call` accessor. +type CallResult struct { + data hexutil.Bytes // The return data from the call + gasUsed hexutil.Uint64 // The amount of gas used + status hexutil.Uint64 // The return status of the call - 0 for failure or 1 for success. +} + +func (c *CallResult) Data() hexutil.Bytes { + return c.data +} + +func (c *CallResult) GasUsed() hexutil.Uint64 { + return c.gasUsed +} + +func (c *CallResult) Status() hexutil.Uint64 { + return c.status +} + +func (b *Block) Call(ctx context.Context, args struct { + Data ethapi.CallArgs +}) (*CallResult, error) { + err := b.onMainChain(ctx) + if err != nil { + return nil, err + } + + if b.num == nil { + _, err := b.resolveHeader(ctx) + if err != nil { + return nil, err + } + } + + result, gas, failed, err := ethapi.DoCall(ctx, b.backend, args.Data, *b.num, vm.Config{}, 5*time.Second, b.backend.RPCGasCap()) + status := hexutil.Uint64(1) + if failed { + status = 0 + } + return &CallResult{ + data: hexutil.Bytes(result), + gasUsed: hexutil.Uint64(gas), + status: status, + }, err +} + +func (b *Block) EstimateGas(ctx context.Context, args struct { + Data ethapi.CallArgs +}) (hexutil.Uint64, error) { + err := b.onMainChain(ctx) + if err != nil { + return hexutil.Uint64(0), err + } + + if b.num == nil { + _, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Uint64(0), err + } + } + + gas, err := ethapi.DoEstimateGas(ctx, b.backend, args.Data, *b.num, b.backend.RPCGasCap()) + return gas, err +} + +type Pending struct { + backend ethapi.Backend +} + +func (p *Pending) TransactionCount(ctx context.Context) (int32, error) { + txs, err := p.backend.GetPoolTransactions() + return int32(len(txs)), err +} + +func (p *Pending) Transactions(ctx context.Context) (*[]*Transaction, error) { + txs, err := p.backend.GetPoolTransactions() + if err != nil { + return nil, err + } + + ret := make([]*Transaction, 0, len(txs)) + for i, tx := range txs { + ret = append(ret, &Transaction{ + backend: p.backend, + hash: tx.Hash(), + tx: tx, + index: uint64(i), + }) + } + return &ret, nil +} + +func (p *Pending) Account(ctx context.Context, args struct { + Address common.Address +}) *Account { + return &Account{ + backend: p.backend, + address: args.Address, + blockNumber: rpc.PendingBlockNumber, + } +} + +func (p *Pending) Call(ctx context.Context, args struct { + Data ethapi.CallArgs +}) (*CallResult, error) { + result, gas, failed, err := ethapi.DoCall(ctx, p.backend, args.Data, rpc.PendingBlockNumber, vm.Config{}, 5*time.Second, p.backend.RPCGasCap()) + status := hexutil.Uint64(1) + if failed { + status = 0 + } + return &CallResult{ + data: hexutil.Bytes(result), + gasUsed: hexutil.Uint64(gas), + status: status, + }, err +} + +func (p *Pending) EstimateGas(ctx context.Context, args struct { + Data ethapi.CallArgs +}) (hexutil.Uint64, error) { + return ethapi.DoEstimateGas(ctx, p.backend, args.Data, rpc.PendingBlockNumber, p.backend.RPCGasCap()) +} + +// Resolver is the top-level object in the GraphQL hierarchy. +type Resolver struct { + backend ethapi.Backend +} + +func (r *Resolver) Block(ctx context.Context, args struct { + Number *hexutil.Uint64 + Hash *common.Hash +}) (*Block, error) { + var block *Block + if args.Number != nil { + num := rpc.BlockNumber(uint64(*args.Number)) + block = &Block{ + backend: r.backend, + num: &num, + canonical: isCanonical, + } + } else if args.Hash != nil { + block = &Block{ + backend: r.backend, + hash: *args.Hash, + canonical: unknown, + } + } else { + num := rpc.LatestBlockNumber + block = &Block{ + backend: r.backend, + num: &num, + canonical: isCanonical, + } + } + + // Resolve the block; if it doesn't exist, return nil. + b, err := block.resolve(ctx) + if err != nil { + return nil, err + } else if b == nil { + return nil, nil + } + return block, nil +} + +func (r *Resolver) Blocks(ctx context.Context, args struct { + From hexutil.Uint64 + To *hexutil.Uint64 +}) ([]*Block, error) { + from := rpc.BlockNumber(args.From) + + var to rpc.BlockNumber + if args.To != nil { + to = rpc.BlockNumber(*args.To) + } else { + to = rpc.BlockNumber(r.backend.CurrentBlock().Number().Int64()) + } + + if to < from { + return []*Block{}, nil + } + + ret := make([]*Block, 0, to-from+1) + for i := from; i <= to; i++ { + num := i + ret = append(ret, &Block{ + backend: r.backend, + num: &num, + canonical: isCanonical, + }) + } + return ret, nil +} + +func (r *Resolver) Pending(ctx context.Context) *Pending { + return &Pending{r.backend} +} + +func (r *Resolver) Transaction(ctx context.Context, args struct{ Hash common.Hash }) (*Transaction, error) { + tx := &Transaction{ + backend: r.backend, + hash: args.Hash, + } + + // Resolve the transaction; if it doesn't exist, return nil. + t, err := tx.resolve(ctx) + if err != nil { + return nil, err + } else if t == nil { + return nil, nil + } + return tx, nil +} + +func (r *Resolver) SendRawTransaction(ctx context.Context, args struct{ Data hexutil.Bytes }) (common.Hash, error) { + tx := new(types.Transaction) + if err := rlp.DecodeBytes(args.Data, tx); err != nil { + return common.Hash{}, err + } + hash, err := ethapi.SubmitTransaction(ctx, r.backend, tx) + return hash, err +} + +// FilterCriteria encapsulates the arguments to `logs` on the root resolver object. +type FilterCriteria struct { + FromBlock *hexutil.Uint64 // beginning of the queried range, nil means genesis block + ToBlock *hexutil.Uint64 // end of the range, nil means latest block + Addresses *[]common.Address // restricts matches to events created by specific contracts + + // The Topic list restricts matches to particular event topics. Each event has a list + // of topics. Topics matches a prefix of that list. An empty element slice matches any + // topic. Non-empty elements represent an alternative that matches any of the + // contained topics. + // + // Examples: + // {} or nil matches any topic list + // {{A}} matches topic A in first position + // {{}, {B}} matches any topic in first position, B in second position + // {{A}, {B}} matches topic A in first position, B in second position + // {{A, B}}, {C, D}} matches topic (A OR B) in first position, (C OR D) in second position + Topics *[][]common.Hash +} + +func (r *Resolver) Logs(ctx context.Context, args struct{ Filter FilterCriteria }) ([]*Log, error) { + // Convert the RPC block numbers into internal representations + begin := rpc.LatestBlockNumber.Int64() + if args.Filter.FromBlock != nil { + begin = int64(*args.Filter.FromBlock) + } + end := rpc.LatestBlockNumber.Int64() + if args.Filter.ToBlock != nil { + end = int64(*args.Filter.ToBlock) + } + + var addresses []common.Address + if args.Filter.Addresses != nil { + addresses = *args.Filter.Addresses + } + + var topics [][]common.Hash + if args.Filter.Topics != nil { + topics = *args.Filter.Topics + } + + // Construct the range filter + filter := filters.NewRangeFilter(filters.Backend(r.backend), begin, end, addresses, topics) + return runFilter(ctx, r.backend, filter) +} + +func (r *Resolver) GasPrice(ctx context.Context) (hexutil.Big, error) { + price, err := r.backend.SuggestPrice(ctx) + return hexutil.Big(*price), err +} + +func (r *Resolver) ProtocolVersion(ctx context.Context) (int32, error) { + return int32(r.backend.ProtocolVersion()), nil +} + +// SyncState represents the synchronisation status returned from the `syncing` accessor. +type SyncState struct { + progress ethereum.SyncProgress +} + +func (s *SyncState) StartingBlock() hexutil.Uint64 { + return hexutil.Uint64(s.progress.StartingBlock) +} + +func (s *SyncState) CurrentBlock() hexutil.Uint64 { + return hexutil.Uint64(s.progress.CurrentBlock) +} + +func (s *SyncState) HighestBlock() hexutil.Uint64 { + return hexutil.Uint64(s.progress.HighestBlock) +} + +func (s *SyncState) PulledStates() *hexutil.Uint64 { + ret := hexutil.Uint64(s.progress.PulledStates) + return &ret +} + +func (s *SyncState) KnownStates() *hexutil.Uint64 { + ret := hexutil.Uint64(s.progress.KnownStates) + return &ret +} + +// Syncing returns false in case the node is currently not syncing with the network. It can be up to date or has not +// yet received the latest block headers from its pears. In case it is synchronizing: +// - startingBlock: block number this node started to synchronise from +// - currentBlock: block number this node is currently importing +// - highestBlock: block number of the highest block header this node has received from peers +// - pulledStates: number of state entries processed until now +// - knownStates: number of known state entries that still need to be pulled +func (r *Resolver) Syncing() (*SyncState, error) { + progress := r.backend.Downloader().Progress() + + // Return not syncing if the synchronisation already completed + if progress.CurrentBlock >= progress.HighestBlock { + return nil, nil + } + // Otherwise gather the block sync stats + return &SyncState{progress}, nil +} diff --git a/graphql/graphql_test.go b/graphql/graphql_test.go new file mode 100644 index 000000000000..40b13187f496 --- /dev/null +++ b/graphql/graphql_test.go @@ -0,0 +1,28 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package graphql + +import ( + "testing" +) + +func TestBuildSchema(t *testing.T) { + // Make sure the schema can be parsed and matched up to the object model. + if _, err := newHandler(nil); err != nil { + t.Errorf("Could not construct GraphQL handler: %v", err) + } +} diff --git a/graphql/schema.go b/graphql/schema.go new file mode 100644 index 000000000000..525b9e1e5a88 --- /dev/null +++ b/graphql/schema.go @@ -0,0 +1,320 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package graphql + +const schema string = ` + # Bytes32 is a 32 byte binary string, represented as 0x-prefixed hexadecimal. + scalar Bytes32 + # Address is a 20 byte Ethereum address, represented as 0x-prefixed hexadecimal. + scalar Address + # Bytes is an arbitrary length binary string, represented as 0x-prefixed hexadecimal. + # An empty byte string is represented as '0x'. Byte strings must have an even number of hexadecimal nybbles. + scalar Bytes + # BigInt is a large integer. Input is accepted as either a JSON number or as a string. + # Strings may be either decimal or 0x-prefixed hexadecimal. Output values are all + # 0x-prefixed hexadecimal. + scalar BigInt + # Long is a 64 bit unsigned integer. + scalar Long + + schema { + query: Query + mutation: Mutation + } + + # Account is an Ethereum account at a particular block. + type Account { + # Address is the address owning the account. + address: Address! + # Balance is the balance of the account, in wei. + balance: BigInt! + # TransactionCount is the number of transactions sent from this account, + # or in the case of a contract, the number of contracts created. Otherwise + # known as the nonce. + transactionCount: Long! + # Code contains the smart contract code for this account, if the account + # is a (non-self-destructed) contract. + code: Bytes! + # Storage provides access to the storage of a contract account, indexed + # by its 32 byte slot identifier. + storage(slot: Bytes32!): Bytes32! + } + + # Log is an Ethereum event log. + type Log { + # Index is the index of this log in the block. + index: Int! + # Account is the account which generated this log - this will always + # be a contract account. + account(block: Long): Account! + # Topics is a list of 0-4 indexed topics for the log. + topics: [Bytes32!]! + # Data is unindexed data for this log. + data: Bytes! + # Transaction is the transaction that generated this log entry. + transaction: Transaction! + } + + # Transaction is an Ethereum transaction. + type Transaction { + # Hash is the hash of this transaction. + hash: Bytes32! + # Nonce is the nonce of the account this transaction was generated with. + nonce: Long! + # Index is the index of this transaction in the parent block. This will + # be null if the transaction has not yet been mined. + index: Int + # From is the account that sent this transaction - this will always be + # an externally owned account. + from(block: Long): Account! + # To is the account the transaction was sent to. This is null for + # contract-creating transactions. + to(block: Long): Account + # Value is the value, in wei, sent along with this transaction. + value: BigInt! + # GasPrice is the price offered to miners for gas, in wei per unit. + gasPrice: BigInt! + # Gas is the maximum amount of gas this transaction can consume. + gas: Long! + # InputData is the data supplied to the target of the transaction. + inputData: Bytes! + # Block is the block this transaction was mined in. This will be null if + # the transaction has not yet been mined. + block: Block + + # Status is the return status of the transaction. This will be 1 if the + # transaction succeeded, or 0 if it failed (due to a revert, or due to + # running out of gas). If the transaction has not yet been mined, this + # field will be null. + status: Long + # GasUsed is the amount of gas that was used processing this transaction. + # If the transaction has not yet been mined, this field will be null. + gasUsed: Long + # CumulativeGasUsed is the total gas used in the block up to and including + # this transaction. If the transaction has not yet been mined, this field + # will be null. + cumulativeGasUsed: Long + # CreatedContract is the account that was created by a contract creation + # transaction. If the transaction was not a contract creation transaction, + # or it has not yet been mined, this field will be null. + createdContract(block: Long): Account + # Logs is a list of log entries emitted by this transaction. If the + # transaction has not yet been mined, this field will be null. + logs: [Log!] + } + + # BlockFilterCriteria encapsulates log filter criteria for a filter applied + # to a single block. + input BlockFilterCriteria { + # Addresses is list of addresses that are of interest. If this list is + # empty, results will not be filtered by address. + addresses: [Address!] + # Topics list restricts matches to particular event topics. Each event has a list + # of topics. Topics matches a prefix of that list. An empty element array matches any + # topic. Non-empty elements represent an alternative that matches any of the + # contained topics. + # + # Examples: + # - [] or nil matches any topic list + # - [[A]] matches topic A in first position + # - [[], [B]] matches any topic in first position, B in second position + # - [[A], [B]] matches topic A in first position, B in second position + # - [[A, B]], [C, D]] matches topic (A OR B) in first position, (C OR D) in second position + topics: [[Bytes32!]!] + } + + # Block is an Ethereum block. + type Block { + # Number is the number of this block, starting at 0 for the genesis block. + number: Long! + # Hash is the block hash of this block. + hash: Bytes32! + # Parent is the parent block of this block. + parent: Block + # Nonce is the block nonce, an 8 byte sequence determined by the miner. + nonce: Bytes! + # TransactionsRoot is the keccak256 hash of the root of the trie of transactions in this block. + transactionsRoot: Bytes32! + # TransactionCount is the number of transactions in this block. if + # transactions are not available for this block, this field will be null. + transactionCount: Int + # StateRoot is the keccak256 hash of the state trie after this block was processed. + stateRoot: Bytes32! + # ReceiptsRoot is the keccak256 hash of the trie of transaction receipts in this block. + receiptsRoot: Bytes32! + # Miner is the account that mined this block. + miner(block: Long): Account! + # ExtraData is an arbitrary data field supplied by the miner. + extraData: Bytes! + # GasLimit is the maximum amount of gas that was available to transactions in this block. + gasLimit: Long! + # GasUsed is the amount of gas that was used executing transactions in this block. + gasUsed: Long! + # Timestamp is the unix timestamp at which this block was mined. + timestamp: Long! + # LogsBloom is a bloom filter that can be used to check if a block may + # contain log entries matching a filter. + logsBloom: Bytes! + # MixHash is the hash that was used as an input to the PoW process. + mixHash: Bytes32! + # Difficulty is a measure of the difficulty of mining this block. + difficulty: BigInt! + # TotalDifficulty is the sum of all difficulty values up to and including + # this block. + totalDifficulty: BigInt! + # OmmerCount is the number of ommers (AKA uncles) associated with this + # block. If ommers are unavailable, this field will be null. + ommerCount: Int + # Ommers is a list of ommer (AKA uncle) blocks associated with this block. + # If ommers are unavailable, this field will be null. Depending on your + # node, the transactions, transactionAt, transactionCount, ommers, + # ommerCount and ommerAt fields may not be available on any ommer blocks. + ommers: [Block] + # OmmerAt returns the ommer (AKA uncle) at the specified index. If ommers + # are unavailable, or the index is out of bounds, this field will be null. + ommerAt(index: Int!): Block + # OmmerHash is the keccak256 hash of all the ommers (AKA uncles) + # associated with this block. + ommerHash: Bytes32! + # Transactions is a list of transactions associated with this block. If + # transactions are unavailable for this block, this field will be null. + transactions: [Transaction!] + # TransactionAt returns the transaction at the specified index. If + # transactions are unavailable for this block, or if the index is out of + # bounds, this field will be null. + transactionAt(index: Int!): Transaction + # Logs returns a filtered set of logs from this block. + logs(filter: BlockFilterCriteria!): [Log!]! + # Account fetches an Ethereum account at the current block's state. + account(address: Address!): Account! + # Call executes a local call operation at the current block's state. + call(data: CallData!): CallResult + # EstimateGas estimates the amount of gas that will be required for + # successful execution of a transaction at the current block's state. + estimateGas(data: CallData!): Long! + } + + # CallData represents the data associated with a local contract call. + # All fields are optional. + input CallData { + # From is the address making the call. + from: Address + # To is the address the call is sent to. + to: Address + # Gas is the amount of gas sent with the call. + gas: Long + # GasPrice is the price, in wei, offered for each unit of gas. + gasPrice: BigInt + # Value is the value, in wei, sent along with the call. + value: BigInt + # Data is the data sent to the callee. + data: Bytes + } + + # CallResult is the result of a local call operation. + type CallResult { + # Data is the return data of the called contract. + data: Bytes! + # GasUsed is the amount of gas used by the call, after any refunds. + gasUsed: Long! + # Status is the result of the call - 1 for success or 0 for failure. + status: Long! + } + + # FilterCriteria encapsulates log filter criteria for searching log entries. + input FilterCriteria { + # FromBlock is the block at which to start searching, inclusive. Defaults + # to the latest block if not supplied. + fromBlock: Long + # ToBlock is the block at which to stop searching, inclusive. Defaults + # to the latest block if not supplied. + toBlock: Long + # Addresses is a list of addresses that are of interest. If this list is + # empty, results will not be filtered by address. + addresses: [Address!] + # Topics list restricts matches to particular event topics. Each event has a list + # of topics. Topics matches a prefix of that list. An empty element array matches any + # topic. Non-empty elements represent an alternative that matches any of the + # contained topics. + # + # Examples: + # - [] or nil matches any topic list + # - [[A]] matches topic A in first position + # - [[], [B]] matches any topic in first position, B in second position + # - [[A], [B]] matches topic A in first position, B in second position + # - [[A, B]], [C, D]] matches topic (A OR B) in first position, (C OR D) in second position + topics: [[Bytes32!]!] + } + + # SyncState contains the current synchronisation state of the client. + type SyncState{ + # StartingBlock is the block number at which synchronisation started. + startingBlock: Long! + # CurrentBlock is the point at which synchronisation has presently reached. + currentBlock: Long! + # HighestBlock is the latest known block number. + highestBlock: Long! + # PulledStates is the number of state entries fetched so far, or null + # if this is not known or not relevant. + pulledStates: Long + # KnownStates is the number of states the node knows of so far, or null + # if this is not known or not relevant. + knownStates: Long + } + + # Pending represents the current pending state. + type Pending { + # TransactionCount is the number of transactions in the pending state. + transactionCount: Int! + # Transactions is a list of transactions in the current pending state. + transactions: [Transaction!] + # Account fetches an Ethereum account for the pending state. + account(address: Address!): Account! + # Call executes a local call operation for the pending state. + call(data: CallData!): CallResult + # EstimateGas estimates the amount of gas that will be required for + # successful execution of a transaction for the pending state. + estimateGas(data: CallData!): Long! + } + + type Query { + # Block fetches an Ethereum block by number or by hash. If neither is + # supplied, the most recent known block is returned. + block(number: Long, hash: Bytes32): Block + # Blocks returns all the blocks between two numbers, inclusive. If + # to is not supplied, it defaults to the most recent known block. + blocks(from: Long!, to: Long): [Block!]! + # Pending returns the current pending state. + pending: Pending! + # Transaction returns a transaction specified by its hash. + transaction(hash: Bytes32!): Transaction + # Logs returns log entries matching the provided filter. + logs(filter: FilterCriteria!): [Log!]! + # GasPrice returns the node's estimate of a gas price sufficient to + # ensure a transaction is mined in a timely fashion. + gasPrice: BigInt! + # ProtocolVersion returns the current wire protocol version number. + protocolVersion: Int! + # Syncing returns information on the current synchronisation state. + syncing: SyncState + } + + type Mutation { + # SendRawTransaction sends an RLP-encoded transaction to the network. + sendRawTransaction(data: Bytes!): Bytes32! + } +` diff --git a/graphql/service.go b/graphql/service.go new file mode 100644 index 000000000000..f64075680634 --- /dev/null +++ b/graphql/service.go @@ -0,0 +1,103 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package graphql + +import ( + "fmt" + "net" + "net/http" + + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" + "github.com/graph-gophers/graphql-go" + "github.com/graph-gophers/graphql-go/relay" +) + +// Service encapsulates a GraphQL service. +type Service struct { + endpoint string // The host:port endpoint for this service. + cors []string // Allowed CORS domains + vhosts []string // Recognised vhosts + timeouts rpc.HTTPTimeouts // Timeout settings for HTTP requests. + backend ethapi.Backend // The backend that queries will operate onn. + handler http.Handler // The `http.Handler` used to answer queries. + listener net.Listener // The listening socket. +} + +// New constructs a new GraphQL service instance. +func New(backend ethapi.Backend, endpoint string, cors, vhosts []string, timeouts rpc.HTTPTimeouts) (*Service, error) { + return &Service{ + endpoint: endpoint, + cors: cors, + vhosts: vhosts, + timeouts: timeouts, + backend: backend, + }, nil +} + +// Protocols returns the list of protocols exported by this service. +func (s *Service) Protocols() []p2p.Protocol { return nil } + +// APIs returns the list of APIs exported by this service. +func (s *Service) APIs() []rpc.API { return nil } + +// Start is called after all services have been constructed and the networking +// layer was also initialized to spawn any goroutines required by the service. +func (s *Service) Start(server *p2p.Server) error { + var err error + s.handler, err = newHandler(s.backend) + if err != nil { + return err + } + if s.listener, err = net.Listen("tcp", s.endpoint); err != nil { + return err + } + go rpc.NewHTTPServer(s.cors, s.vhosts, s.timeouts, s.handler).Serve(s.listener) + log.Info("GraphQL endpoint opened", "url", fmt.Sprintf("http://%s", s.endpoint)) + return nil +} + +// newHandler returns a new `http.Handler` that will answer GraphQL queries. +// It additionally exports an interactive query browser on the / endpoint. +func newHandler(backend ethapi.Backend) (http.Handler, error) { + q := Resolver{backend} + + s, err := graphql.ParseSchema(schema, &q) + if err != nil { + return nil, err + } + h := &relay.Handler{Schema: s} + + mux := http.NewServeMux() + mux.Handle("/", GraphiQL{}) + mux.Handle("/graphql", h) + mux.Handle("/graphql/", h) + return mux, nil +} + +// Stop terminates all goroutines belonging to the service, blocking until they +// are all terminated. +func (s *Service) Stop() error { + if s.listener != nil { + s.listener.Close() + s.listener = nil + log.Info("GraphQL endpoint closed", "url", fmt.Sprintf("http://%s", s.endpoint)) + } + return nil +} diff --git a/interfaces.go b/interfaces.go index 26b0fcbc1743..1ff31f96b6a6 100644 --- a/interfaces.go +++ b/interfaces.go @@ -144,9 +144,9 @@ type FilterQuery struct { // Examples: // {} or nil matches any topic list // {{A}} matches topic A in first position - // {{}, {B}} matches any topic in first position, B in second position - // {{A}, {B}} matches topic A in first position, B in second position - // {{A, B}}, {C, D}} matches topic (A OR B) in first position, (C OR D) in second position + // {{}, {B}} matches any topic in first position AND B in second position + // {{A}, {B}} matches topic A in first position AND B in second position + // {{A, B}, {C, D}} matches topic (A OR B) in first position AND (C OR D) in second position Topics [][]common.Hash } diff --git a/internal/build/azure.go b/internal/build/azure.go index 086dff2c4a8a..786284265082 100644 --- a/internal/build/azure.go +++ b/internal/build/azure.go @@ -22,7 +22,7 @@ import ( "net/url" "os" - "github.com/Azure/azure-storage-blob-go/2018-03-28/azblob" + "github.com/Azure/azure-storage-blob-go/azblob" ) // AzureBlobstoreConfig is an authentication and configuration struct containing @@ -45,7 +45,11 @@ func AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) return nil } // Create an authenticated client against the Azure cloud - credential := azblob.NewSharedKeyCredential(config.Account, config.Token) + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return err + } + pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) @@ -67,7 +71,11 @@ func AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) // AzureBlobstoreList lists all the files contained within an azure blobstore. func AzureBlobstoreList(config AzureBlobstoreConfig) ([]azblob.BlobItem, error) { - credential := azblob.NewSharedKeyCredential(config.Account, config.Token) + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return nil, err + } + pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) @@ -95,7 +103,11 @@ func AzureBlobstoreDelete(config AzureBlobstoreConfig, blobs []azblob.BlobItem) return nil } // Create an authenticated client against the Azure cloud - credential := azblob.NewSharedKeyCredential(config.Account, config.Token) + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return err + } + pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) diff --git a/internal/build/env.go b/internal/build/env.go index b553e0ed8068..95f00035dce4 100644 --- a/internal/build/env.go +++ b/internal/build/env.go @@ -20,7 +20,9 @@ import ( "flag" "fmt" "os" + "strconv" "strings" + "time" ) var ( @@ -35,17 +37,17 @@ var ( // Environment contains metadata provided by the build environment. type Environment struct { - Name string // name of the environment - Repo string // name of GitHub repo - Commit, Branch, Tag string // Git info - Buildnum string - IsPullRequest bool - IsCronJob bool + Name string // name of the environment + Repo string // name of GitHub repo + Commit, Date, Branch, Tag string // Git info + Buildnum string + IsPullRequest bool + IsCronJob bool } func (env Environment) String() string { - return fmt.Sprintf("%s env (commit:%s branch:%s tag:%s buildnum:%s pr:%t)", - env.Name, env.Commit, env.Branch, env.Tag, env.Buildnum, env.IsPullRequest) + return fmt.Sprintf("%s env (commit:%s date:%s branch:%s tag:%s buildnum:%s pr:%t)", + env.Name, env.Commit, env.Date, env.Branch, env.Tag, env.Buildnum, env.IsPullRequest) } // Env returns metadata about the current CI environment, falling back to LocalEnv @@ -53,10 +55,15 @@ func (env Environment) String() string { func Env() Environment { switch { case os.Getenv("CI") == "true" && os.Getenv("TRAVIS") == "true": + commit := os.Getenv("TRAVIS_PULL_REQUEST_SHA") + if commit == "" { + commit = os.Getenv("TRAVIS_COMMIT") + } return Environment{ Name: "travis", Repo: os.Getenv("TRAVIS_REPO_SLUG"), - Commit: os.Getenv("TRAVIS_COMMIT"), + Commit: commit, + Date: getDate(commit), Branch: os.Getenv("TRAVIS_BRANCH"), Tag: os.Getenv("TRAVIS_TAG"), Buildnum: os.Getenv("TRAVIS_BUILD_NUMBER"), @@ -64,10 +71,15 @@ func Env() Environment { IsCronJob: os.Getenv("TRAVIS_EVENT_TYPE") == "cron", } case os.Getenv("CI") == "True" && os.Getenv("APPVEYOR") == "True": + commit := os.Getenv("APPVEYOR_PULL_REQUEST_HEAD_COMMIT") + if commit == "" { + commit = os.Getenv("APPVEYOR_REPO_COMMIT") + } return Environment{ Name: "appveyor", Repo: os.Getenv("APPVEYOR_REPO_NAME"), - Commit: os.Getenv("APPVEYOR_REPO_COMMIT"), + Commit: commit, + Date: getDate(commit), Branch: os.Getenv("APPVEYOR_REPO_BRANCH"), Tag: os.Getenv("APPVEYOR_REPO_TAG_NAME"), Buildnum: os.Getenv("APPVEYOR_BUILD_NUMBER"), @@ -84,14 +96,15 @@ func LocalEnv() Environment { env := applyEnvFlags(Environment{Name: "local", Repo: "ethereum/go-ethereum"}) head := readGitFile("HEAD") - if splits := strings.Split(head, " "); len(splits) == 2 { - head = splits[1] + if fields := strings.Fields(head); len(fields) == 2 { + head = fields[1] } else { return env } if env.Commit == "" { env.Commit = readGitFile(head) } + env.Date = getDate(env.Commit) if env.Branch == "" { if head != "HEAD" { env.Branch = strings.TrimPrefix(head, "refs/heads/") @@ -107,6 +120,21 @@ func firstLine(s string) string { return strings.Split(s, "\n")[0] } +func getDate(commit string) string { + if commit == "" { + return "" + } + out := RunGit("show", "-s", "--format=%ct", commit) + if out == "" { + return "" + } + date, err := strconv.ParseInt(strings.TrimSpace(out), 10, 64) + if err != nil { + panic(fmt.Sprintf("failed to parse git commit date: %v", err)) + } + return time.Unix(date, 0).Format("20060102") +} + func applyEnvFlags(env Environment) Environment { if !flag.Parsed() { panic("you need to call flag.Parse before Env or LocalEnv") diff --git a/internal/build/util.go b/internal/build/util.go index 195bdb404b8b..971d948c44e5 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -68,13 +68,14 @@ func RunGit(args ...string) string { cmd := exec.Command("git", args...) var stdout, stderr bytes.Buffer cmd.Stdout, cmd.Stderr = &stdout, &stderr - if err := cmd.Run(); err == exec.ErrNotFound { - if !warnedAboutGit { - log.Println("Warning: can't find 'git' in PATH") - warnedAboutGit = true + if err := cmd.Run(); err != nil { + if e, ok := err.(*exec.Error); ok && e.Err == exec.ErrNotFound { + if !warnedAboutGit { + log.Println("Warning: can't find 'git' in PATH") + warnedAboutGit = true + } + return "" } - return "" - } else if err != nil { log.Fatal(strings.Join(cmd.Args, " "), ": ", err, "\n", stderr.String()) } return strings.TrimSpace(stdout.String()) @@ -143,9 +144,9 @@ func CopyFile(dst, src string, mode os.FileMode) { // so that go commands executed by build use the same version of Go as the 'host' that runs // build code. e.g. // -// /usr/lib/go-1.11/bin/go run build/ci.go ... +// /usr/lib/go-1.12.1/bin/go run build/ci.go ... // -// runs using go 1.11 and invokes go 1.11 tools from the same GOROOT. This is also important +// runs using go 1.12.1 and invokes go 1.12.1 tools from the same GOROOT. This is also important // because runtime.Version checks on the host should match the tools that are run. func GoTool(tool string, args ...string) *exec.Cmd { args = append([]string{tool}, args...) @@ -177,3 +178,34 @@ func ExpandPackagesNoVendor(patterns []string) []string { } return patterns } + +// UploadSFTP uploads files to a remote host using the sftp command line tool. +// The destination host may be specified either as [user@]host[: or as a URI in +// the form sftp://[user@]host[:port]. +func UploadSFTP(identityFile, host, dir string, files []string) error { + sftp := exec.Command("sftp") + sftp.Stdout = nil + sftp.Stderr = os.Stderr + if identityFile != "" { + sftp.Args = append(sftp.Args, "-i", identityFile) + } + sftp.Args = append(sftp.Args, host) + fmt.Println(">>>", strings.Join(sftp.Args, " ")) + if *DryRunFlag { + return nil + } + + stdin, err := sftp.StdinPipe() + if err != nil { + return fmt.Errorf("can't create stdin pipe for sftp: %v", err) + } + if err := sftp.Start(); err != nil { + return err + } + in := io.MultiWriter(stdin, os.Stdout) + for _, f := range files { + fmt.Fprintln(in, "put", f, path.Join(dir, filepath.Base(f))) + } + stdin.Close() + return sftp.Wait() +} diff --git a/internal/cmdtest/test_cmd.go b/internal/cmdtest/test_cmd.go index 20e82ec2a92e..f8b1b43c0119 100644 --- a/internal/cmdtest/test_cmd.go +++ b/internal/cmdtest/test_cmd.go @@ -27,6 +27,7 @@ import ( "regexp" "strings" "sync" + "syscall" "testing" "text/template" "time" @@ -50,6 +51,8 @@ type TestCmd struct { stdout *bufio.Reader stdin io.WriteCloser stderr *testlogger + // Err will contain the process exit error or interrupt signal error + Err error } // Run exec's the current binary using name as argv[0] which will trigger the @@ -182,11 +185,25 @@ func (tt *TestCmd) ExpectExit() { } func (tt *TestCmd) WaitExit() { - tt.cmd.Wait() + tt.Err = tt.cmd.Wait() } func (tt *TestCmd) Interrupt() { - tt.cmd.Process.Signal(os.Interrupt) + tt.Err = tt.cmd.Process.Signal(os.Interrupt) +} + +// ExitStatus exposes the process' OS exit code +// It will only return a valid value after the process has finished. +func (tt *TestCmd) ExitStatus() int { + if tt.Err != nil { + exitErr := tt.Err.(*exec.ExitError) + if exitErr != nil { + if status, ok := exitErr.Sys().(syscall.WaitStatus); ok { + return status.ExitStatus() + } + } + } + return 0 } // StderrText returns any stderr output written so far. diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 8016ebe3d7f4..8b0489e7ab78 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -28,9 +28,11 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/accounts/scwallet" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" @@ -42,8 +44,7 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/util" + "github.com/tyler-smith/go-bip39" ) const ( @@ -217,7 +218,7 @@ func NewPrivateAccountAPI(b Backend, nonceLock *AddrLocker) *PrivateAccountAPI { } } -// ListAccounts will return a list of addresses for accounts this node manages. +// listAccounts will return a list of addresses for accounts this node manages. func (s *PrivateAccountAPI) ListAccounts() []common.Address { addresses := make([]common.Address, 0) // return [] instead of nil if empty for _, wallet := range s.am.Wallets() { @@ -293,6 +294,9 @@ func (s *PrivateAccountAPI) DeriveAccount(url string, path string, pin *bool) (a func (s *PrivateAccountAPI) NewAccount(password string) (common.Address, error) { acc, err := fetchKeystore(s.am).NewAccount(password) if err == nil { + log.Info("Your new key was generated", "address", acc.Address) + log.Warn("Please backup your key file!", "path", acc.URL.Path) + log.Warn("Please remember your password!") return acc.Address, nil } return common.Address{}, err @@ -317,7 +321,14 @@ func (s *PrivateAccountAPI) ImportRawKey(privkey string, password string) (commo // UnlockAccount will unlock the account associated with the given address with // the given password for duration seconds. If duration is nil it will use a // default of 300 seconds. It returns an indication if the account was unlocked. -func (s *PrivateAccountAPI) UnlockAccount(addr common.Address, password string, duration *uint64) (bool, error) { +func (s *PrivateAccountAPI) UnlockAccount(ctx context.Context, addr common.Address, password string, duration *uint64) (bool, error) { + // When the API is exposed by external RPC(http, ws etc), unless the user + // explicitly specifies to allow the insecure account unlocking, otherwise + // it is disabled. + if s.b.ExtRPCEnabled() && !s.b.AccountManager().Config().InsecureUnlockAllowed { + return false, errors.New("account unlock with HTTP access is forbidden") + } + const max = uint64(time.Duration(math.MaxInt64) / time.Second) var d time.Duration if duration == nil { @@ -328,6 +339,9 @@ func (s *PrivateAccountAPI) UnlockAccount(addr common.Address, password string, d = time.Duration(*duration) * time.Second } err := fetchKeystore(s.am).TimedUnlock(accounts.Account{Address: addr}, password, d) + if err != nil { + log.Warn("Failed account unlock attempt", "address", addr, "err", err) + } return err == nil, err } @@ -336,10 +350,10 @@ func (s *PrivateAccountAPI) LockAccount(addr common.Address) bool { return fetchKeystore(s.am).Lock(addr) == nil } -// signTransactions sets defaults and signs the given transaction +// signTransaction sets defaults and signs the given transaction // NOTE: the caller needs to ensure that the nonceLock is held, if applicable, // and release it after the transaction has been submitted to the tx pool -func (s *PrivateAccountAPI) signTransaction(ctx context.Context, args SendTxArgs, passwd string) (*types.Transaction, error) { +func (s *PrivateAccountAPI) signTransaction(ctx context.Context, args *SendTxArgs, passwd string) (*types.Transaction, error) { // Look up the wallet containing the requested signer account := accounts.Account{Address: args.From} wallet, err := s.am.Find(account) @@ -353,11 +367,7 @@ func (s *PrivateAccountAPI) signTransaction(ctx context.Context, args SendTxArgs // Assemble the transaction and sign with the wallet tx := args.toTransaction() - var chainID *big.Int - if config := s.b.ChainConfig(); config.IsEIP155(s.b.CurrentBlock().Number()) { - chainID = config.ChainID - } - return wallet.SignTxWithPassphrase(account, passwd, tx, chainID) + return wallet.SignTxWithPassphrase(account, passwd, tx, s.b.ChainConfig().ChainID) } // SendTransaction will create a transaction from the given arguments and @@ -370,11 +380,12 @@ func (s *PrivateAccountAPI) SendTransaction(ctx context.Context, args SendTxArgs s.nonceLock.LockAddr(args.From) defer s.nonceLock.UnlockAddr(args.From) } - signed, err := s.signTransaction(ctx, args, passwd) + signed, err := s.signTransaction(ctx, &args, passwd) if err != nil { + log.Warn("Failed transaction send attempt", "from", args.From, "to", args.To, "value", args.Value.ToInt(), "err", err) return common.Hash{}, err } - return submitTransaction(ctx, s.b, signed) + return SubmitTransaction(ctx, s.b, signed) } // SignTransaction will create a transaction from the given arguments and @@ -393,8 +404,9 @@ func (s *PrivateAccountAPI) SignTransaction(ctx context.Context, args SendTxArgs if args.Nonce == nil { return nil, fmt.Errorf("nonce not specified") } - signed, err := s.signTransaction(ctx, args, passwd) + signed, err := s.signTransaction(ctx, &args, passwd) if err != nil { + log.Warn("Failed transaction sign attempt", "from", args.From, "to", args.To, "value", args.Value.ToInt(), "err", err) return nil, err } data, err := rlp.EncodeToBytes(signed) @@ -404,18 +416,6 @@ func (s *PrivateAccountAPI) SignTransaction(ctx context.Context, args SendTxArgs return &SignTransactionResult{data, signed}, nil } -// signHash is a helper function that calculates a hash for the given message that can be -// safely used to calculate a signature from. -// -// The hash is calulcated as -// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). -// -// This gives context to the signed message and prevents signing of transactions. -func signHash(data []byte) []byte { - msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data) - return crypto.Keccak256([]byte(msg)) -} - // Sign calculates an Ethereum ECDSA signature for: // keccack256("\x19Ethereum Signed Message:\n" + len(message) + message)) // @@ -434,8 +434,9 @@ func (s *PrivateAccountAPI) Sign(ctx context.Context, data hexutil.Bytes, addr c return nil, err } // Assemble sign the data with the wallet - signature, err := wallet.SignHashWithPassphrase(account, passwd, signHash(data)) + signature, err := wallet.SignTextWithPassphrase(account, passwd, data) if err != nil { + log.Warn("Failed data sign attempt", "address", addr, "err", err) return nil, err } signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper @@ -461,7 +462,7 @@ func (s *PrivateAccountAPI) EcRecover(ctx context.Context, data, sig hexutil.Byt } sig[64] -= 27 // Transform yellow paper V from 27/28 to 0/1 - rpk, err := crypto.SigToPub(signHash(data), sig) + rpk, err := crypto.SigToPub(accounts.TextHash(data), sig) if err != nil { return common.Address{}, err } @@ -474,6 +475,48 @@ func (s *PrivateAccountAPI) SignAndSendTransaction(ctx context.Context, args Sen return s.SendTransaction(ctx, args, passwd) } +// InitializeWallet initializes a new wallet at the provided URL, by generating and returning a new private key. +func (s *PrivateAccountAPI) InitializeWallet(ctx context.Context, url string) (string, error) { + wallet, err := s.am.Wallet(url) + if err != nil { + return "", err + } + + entropy, err := bip39.NewEntropy(256) + if err != nil { + return "", err + } + + mnemonic, err := bip39.NewMnemonic(entropy) + if err != nil { + return "", err + } + + seed := bip39.NewSeed(mnemonic, "") + + switch wallet := wallet.(type) { + case *scwallet.Wallet: + return mnemonic, wallet.Initialize(seed) + default: + return "", fmt.Errorf("Specified wallet does not support initialization") + } +} + +// Unpair deletes a pairing between wallet and geth. +func (s *PrivateAccountAPI) Unpair(ctx context.Context, url string, pin string) error { + wallet, err := s.am.Wallet(url) + if err != nil { + return err + } + + switch wallet := wallet.(type) { + case *scwallet.Wallet: + return wallet.Unpair([]byte(pin)) + default: + return fmt.Errorf("Specified wallet does not support pairing") + } +} + // PublicBlockChainAPI provides an API to access the Ethereum blockchain. // It offers only methods that operate on public data that is freely available to anyone. type PublicBlockChainAPI struct { @@ -485,6 +528,11 @@ func NewPublicBlockChainAPI(b Backend) *PublicBlockChainAPI { return &PublicBlockChainAPI{b} } +// ChainId returns the chainID value for transaction replay protection. +func (s *PublicBlockChainAPI) ChainId() *hexutil.Big { + return (*hexutil.Big)(s.b.ChainConfig().ChainID) +} + // BlockNumber returns the block number of the chain head. func (s *PublicBlockChainAPI) BlockNumber() hexutil.Uint64 { header, _ := s.b.HeaderByNumber(context.Background(), rpc.LatestBlockNumber) // latest header should always be available @@ -502,13 +550,109 @@ func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Add return (*hexutil.Big)(state.GetBalance(address)), state.Error() } -// GetBlockByNumber returns the requested block. When blockNr is -1 the chain head is returned. When fullTx is true all -// transactions in the block are returned in full detail, otherwise only the transaction hash is returned. -func (s *PublicBlockChainAPI) GetBlockByNumber(ctx context.Context, blockNr rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) { - block, err := s.b.BlockByNumber(ctx, blockNr) - if block != nil { - response, err := s.rpcOutputBlock(block, true, fullTx) - if err == nil && blockNr == rpc.PendingBlockNumber { +// Result structs for GetProof +type AccountResult struct { + Address common.Address `json:"address"` + AccountProof []string `json:"accountProof"` + Balance *hexutil.Big `json:"balance"` + CodeHash common.Hash `json:"codeHash"` + Nonce hexutil.Uint64 `json:"nonce"` + StorageHash common.Hash `json:"storageHash"` + StorageProof []StorageResult `json:"storageProof"` +} +type StorageResult struct { + Key string `json:"key"` + Value *hexutil.Big `json:"value"` + Proof []string `json:"proof"` +} + +// GetProof returns the Merkle-proof for a given account and optionally some storage keys. +func (s *PublicBlockChainAPI) GetProof(ctx context.Context, address common.Address, storageKeys []string, blockNr rpc.BlockNumber) (*AccountResult, error) { + state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) + if state == nil || err != nil { + return nil, err + } + + storageTrie := state.StorageTrie(address) + storageHash := types.EmptyRootHash + codeHash := state.GetCodeHash(address) + storageProof := make([]StorageResult, len(storageKeys)) + + // if we have a storageTrie, (which means the account exists), we can update the storagehash + if storageTrie != nil { + storageHash = storageTrie.Hash() + } else { + // no storageTrie means the account does not exist, so the codeHash is the hash of an empty bytearray. + codeHash = crypto.Keccak256Hash(nil) + } + + // create the proof for the storageKeys + for i, key := range storageKeys { + if storageTrie != nil { + proof, storageError := state.GetStorageProof(address, common.HexToHash(key)) + if storageError != nil { + return nil, storageError + } + storageProof[i] = StorageResult{key, (*hexutil.Big)(state.GetState(address, common.HexToHash(key)).Big()), common.ToHexArray(proof)} + } else { + storageProof[i] = StorageResult{key, &hexutil.Big{}, []string{}} + } + } + + // create the accountProof + accountProof, proofErr := state.GetProof(address) + if proofErr != nil { + return nil, proofErr + } + + return &AccountResult{ + Address: address, + AccountProof: common.ToHexArray(accountProof), + Balance: (*hexutil.Big)(state.GetBalance(address)), + CodeHash: codeHash, + Nonce: hexutil.Uint64(state.GetNonce(address)), + StorageHash: storageHash, + StorageProof: storageProof, + }, state.Error() +} + +// GetHeaderByNumber returns the requested canonical block header. +// * When blockNr is -1 the chain head is returned. +// * When blockNr is -2 the pending chain head is returned. +func (s *PublicBlockChainAPI) GetHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (map[string]interface{}, error) { + header, err := s.b.HeaderByNumber(ctx, number) + if header != nil && err == nil { + response := s.rpcMarshalHeader(header) + if number == rpc.PendingBlockNumber { + // Pending header need to nil out a few fields + for _, field := range []string{"hash", "nonce", "miner"} { + response[field] = nil + } + } + return response, err + } + return nil, err +} + +// GetHeaderByHash returns the requested header by hash. +func (s *PublicBlockChainAPI) GetHeaderByHash(ctx context.Context, hash common.Hash) map[string]interface{} { + header := s.b.GetHeader(ctx, hash) + if header != nil { + return s.rpcMarshalHeader(header) + } + return nil +} + +// GetBlockByNumber returns the requested canonical block. +// * When blockNr is -1 the chain head is returned. +// * When blockNr is -2 the pending chain head is returned. +// * When fullTx is true all transactions in the block are returned, otherwise +// only the transaction hash is returned. +func (s *PublicBlockChainAPI) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) { + block, err := s.b.BlockByNumber(ctx, number) + if block != nil && err == nil { + response, err := s.rpcMarshalBlock(block, true, fullTx) + if err == nil && number == rpc.PendingBlockNumber { // Pending blocks need to nil out a few fields for _, field := range []string{"hash", "nonce", "miner"} { response[field] = nil @@ -521,10 +665,10 @@ func (s *PublicBlockChainAPI) GetBlockByNumber(ctx context.Context, blockNr rpc. // GetBlockByHash returns the requested block. When fullTx is true all transactions in the block are returned in full // detail, otherwise only the transaction hash is returned. -func (s *PublicBlockChainAPI) GetBlockByHash(ctx context.Context, blockHash common.Hash, fullTx bool) (map[string]interface{}, error) { - block, err := s.b.GetBlock(ctx, blockHash) +func (s *PublicBlockChainAPI) GetBlockByHash(ctx context.Context, hash common.Hash, fullTx bool) (map[string]interface{}, error) { + block, err := s.b.GetBlock(ctx, hash) if block != nil { - return s.rpcOutputBlock(block, true, fullTx) + return s.rpcMarshalBlock(block, true, fullTx) } return nil, err } @@ -540,7 +684,7 @@ func (s *PublicBlockChainAPI) GetUncleByBlockNumberAndIndex(ctx context.Context, return nil, nil } block = types.NewBlockWithHeader(uncles[index]) - return s.rpcOutputBlock(block, false, false) + return s.rpcMarshalBlock(block, false, false) } return nil, err } @@ -556,7 +700,7 @@ func (s *PublicBlockChainAPI) GetUncleByBlockHashAndIndex(ctx context.Context, b return nil, nil } block = types.NewBlockWithHeader(uncles[index]) - return s.rpcOutputBlock(block, false, false) + return s.rpcMarshalBlock(block, false, false) } return nil, err } @@ -603,41 +747,58 @@ func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.A // CallArgs represents the arguments for a call. type CallArgs struct { - From common.Address `json:"from"` + From *common.Address `json:"from"` To *common.Address `json:"to"` - Gas hexutil.Uint64 `json:"gas"` - GasPrice hexutil.Big `json:"gasPrice"` - Value hexutil.Big `json:"value"` - Data hexutil.Bytes `json:"data"` + Gas *hexutil.Uint64 `json:"gas"` + GasPrice *hexutil.Big `json:"gasPrice"` + Value *hexutil.Big `json:"value"` + Data *hexutil.Bytes `json:"data"` } -func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config, timeout time.Duration) ([]byte, uint64, bool, error) { +func DoCall(ctx context.Context, b Backend, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config, timeout time.Duration, globalGasCap *big.Int) ([]byte, uint64, bool, error) { defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) - state, header, err := s.b.StateAndHeaderByNumber(ctx, blockNr) + state, header, err := b.StateAndHeaderByNumber(ctx, blockNr) if state == nil || err != nil { return nil, 0, false, err } // Set sender address or use a default if none specified - addr := args.From - if addr == (common.Address{}) { - if wallets := s.b.AccountManager().Wallets(); len(wallets) > 0 { + var addr common.Address + if args.From == nil { + if wallets := b.AccountManager().Wallets(); len(wallets) > 0 { if accounts := wallets[0].Accounts(); len(accounts) > 0 { addr = accounts[0].Address } } + } else { + addr = *args.From } // Set default gas & gas price if none were set - gas, gasPrice := uint64(args.Gas), args.GasPrice.ToInt() - if gas == 0 { - gas = math.MaxUint64 / 2 + gas := uint64(math.MaxUint64 / 2) + if args.Gas != nil { + gas = uint64(*args.Gas) + } + if globalGasCap != nil && globalGasCap.Uint64() < gas { + log.Warn("Caller gas above allowance, capping", "requested", gas, "cap", globalGasCap) + gas = globalGasCap.Uint64() + } + gasPrice := new(big.Int).SetUint64(defaultGasPrice) + if args.GasPrice != nil { + gasPrice = args.GasPrice.ToInt() + } + + value := new(big.Int) + if args.Value != nil { + value = args.Value.ToInt() } - if gasPrice.Sign() == 0 { - gasPrice = new(big.Int).SetUint64(defaultGasPrice) + + var data []byte + if args.Data != nil { + data = []byte(*args.Data) } // Create new call message - msg := types.NewMessage(addr, args.To, 0, args.Value.ToInt(), gas, gasPrice, args.Data, false) + msg := types.NewMessage(addr, args.To, 0, value, gas, gasPrice, data, false) // Setup context so it may be cancelled the call has completed // or, in case of unmetered gas, setup a context with a timeout. @@ -652,7 +813,7 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr defer cancel() // Get a new instance of the EVM. - evm, vmError, err := s.b.GetEVM(ctx, msg, state, header, vmCfg) + evm, vmError, err := b.GetEVM(ctx, msg, state, header) if err != nil { return nil, 0, false, err } @@ -670,42 +831,48 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr if err := vmError(); err != nil { return nil, 0, false, err } + // If the timer caused an abort, return an appropriate error message + if evm.Cancelled() { + return nil, 0, false, fmt.Errorf("execution aborted (timeout = %v)", timeout) + } return res, gas, failed, err } // Call executes the given transaction on the state for the given block number. // It doesn't make and changes in the state/blockchain and is useful to execute and retrieve values. func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber) (hexutil.Bytes, error) { - result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{}, 5*time.Second) + result, _, _, err := DoCall(ctx, s.b, args, blockNr, vm.Config{}, 5*time.Second, s.b.RPCGasCap()) return (hexutil.Bytes)(result), err } -// EstimateGas returns an estimate of the amount of gas needed to execute the -// given transaction against the current pending block. -func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (hexutil.Uint64, error) { +func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNr rpc.BlockNumber, gasCap *big.Int) (hexutil.Uint64, error) { // Binary search the gas requirement, as it may be higher than the amount used var ( lo uint64 = params.TxGas - 1 hi uint64 cap uint64 ) - if uint64(args.Gas) >= params.TxGas { - hi = uint64(args.Gas) + if args.Gas != nil && uint64(*args.Gas) >= params.TxGas { + hi = uint64(*args.Gas) } else { - // Retrieve the current pending block to act as the gas ceiling - block, err := s.b.BlockByNumber(ctx, rpc.PendingBlockNumber) + // Retrieve the block to act as the gas ceiling + block, err := b.BlockByNumber(ctx, blockNr) if err != nil { return 0, err } hi = block.GasLimit() } + if gasCap != nil && hi > gasCap.Uint64() { + log.Warn("Caller gas above allowance, capping", "requested", hi, "cap", gasCap) + hi = gasCap.Uint64() + } cap = hi // Create a helper to check if a gas allowance results in an executable transaction executable := func(gas uint64) bool { - args.Gas = hexutil.Uint64(gas) + args.Gas = (*hexutil.Uint64)(&gas) - _, _, failed, err := s.doCall(ctx, args, rpc.PendingBlockNumber, vm.Config{}, 0) + _, _, failed, err := DoCall(ctx, b, args, rpc.PendingBlockNumber, vm.Config{}, 0, gasCap) if err != nil || failed { return false } @@ -723,12 +890,18 @@ func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (h // Reject the transaction as invalid if it still fails at the highest allowance if hi == cap { if !executable(hi) { - return 0, fmt.Errorf("gas required exceeds allowance or always failing transaction") + return 0, fmt.Errorf("gas required exceeds allowance (%d) or always failing transaction", cap) } } return hexutil.Uint64(hi), nil } +// EstimateGas returns an estimate of the amount of gas needed to execute the +// given transaction against the current pending block. +func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (hexutil.Uint64, error) { + return DoEstimateGas(ctx, s.b, args, rpc.PendingBlockNumber, s.b.RPCGasCap()) +} + // ExecutionResult groups all structured logs emitted by the EVM // while replaying a transaction in debug mode as well as transaction // execution status, the amount of gas used and the return value @@ -753,7 +926,7 @@ type StructLogRes struct { Storage *map[string]string `json:"storage,omitempty"` } -// formatLogs formats EVM returned structured logs for json output +// FormatLogs formats EVM returned structured logs for json output func FormatLogs(logs []vm.StructLog) []StructLogRes { formatted := make([]StructLogRes, len(logs)) for index, trace := range logs { @@ -790,14 +963,11 @@ func FormatLogs(logs []vm.StructLog) []StructLogRes { return formatted } -// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are -// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain -// transaction hashes. -func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { - head := b.Header() // copies the header once - fields := map[string]interface{}{ +// RPCMarshalHeader converts the given header to the RPC output . +func RPCMarshalHeader(head *types.Header) map[string]interface{} { + return map[string]interface{}{ "number": (*hexutil.Big)(head.Number), - "hash": b.Hash(), + "hash": head.Hash(), "parentHash": head.ParentHash, "nonce": head.Nonce, "mixHash": head.MixDigest, @@ -807,13 +977,21 @@ func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]inter "miner": head.Coinbase, "difficulty": (*hexutil.Big)(head.Difficulty), "extraData": hexutil.Bytes(head.Extra), - "size": hexutil.Uint64(b.Size()), + "size": hexutil.Uint64(head.Size()), "gasLimit": hexutil.Uint64(head.GasLimit), "gasUsed": hexutil.Uint64(head.GasUsed), - "timestamp": (*hexutil.Big)(head.Time), + "timestamp": hexutil.Uint64(head.Time), "transactionsRoot": head.TxHash, "receiptsRoot": head.ReceiptHash, } +} + +// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are +// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain +// transaction hashes. +func RPCMarshalBlock(block *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { + fields := RPCMarshalHeader(block.Header()) + fields["size"] = block.Size() if inclTx { formatTx := func(tx *types.Transaction) (interface{}, error) { @@ -821,10 +999,10 @@ func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]inter } if fullTx { formatTx = func(tx *types.Transaction) (interface{}, error) { - return newRPCTransactionFromBlockHash(b, tx.Hash()), nil + return newRPCTransactionFromBlockHash(block, tx.Hash()), nil } } - txs := b.Transactions() + txs := block.Transactions() transactions := make([]interface{}, len(txs)) var err error for i, tx := range txs { @@ -834,8 +1012,7 @@ func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]inter } fields["transactions"] = transactions } - - uncles := b.Uncles() + uncles := block.Uncles() uncleHashes := make([]common.Hash, len(uncles)) for i, uncle := range uncles { uncleHashes[i] = uncle.Hash() @@ -845,9 +1022,17 @@ func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]inter return fields, nil } -// rpcOutputBlock uses the generalized output filler, then adds the total difficulty field, which requires +// rpcMarshalHeader uses the generalized output filler, then adds the total difficulty field, which requires +// a `PublicBlockchainAPI`. +func (s *PublicBlockChainAPI) rpcMarshalHeader(header *types.Header) map[string]interface{} { + fields := RPCMarshalHeader(header) + fields["totalDifficulty"] = (*hexutil.Big)(s.b.GetTd(header.Hash())) + return fields +} + +// rpcMarshalBlock uses the generalized output filler, then adds the total difficulty field, which requires // a `PublicBlockchainAPI`. -func (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { +func (s *PublicBlockChainAPI) rpcMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { fields, err := RPCMarshalBlock(b, inclTx, fullTx) if err != nil { return nil, err @@ -1002,6 +1187,15 @@ func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockHashAndIndex(ctx cont // GetTransactionCount returns the number of transactions the given address has sent for the given block number func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (*hexutil.Uint64, error) { + // Ask transaction pool for the nonce which includes pending transactions + if blockNr == rpc.PendingBlockNumber { + nonce, err := s.b.GetPoolNonce(ctx, address) + if err != nil { + return nil, err + } + return (*hexutil.Uint64)(&nonce), nil + } + // Resolve block number and use its state to ask for the nonce state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) if state == nil || err != nil { return nil, err @@ -1011,25 +1205,32 @@ func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, addr } // GetTransactionByHash returns the transaction for the given hash -func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) *RPCTransaction { +func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) (*RPCTransaction, error) { // Try to return an already finalized transaction - if tx, blockHash, blockNumber, index := rawdb.ReadTransaction(s.b.ChainDb(), hash); tx != nil { - return newRPCTransaction(tx, blockHash, blockNumber, index) + tx, blockHash, blockNumber, index, err := s.b.GetTransaction(ctx, hash) + if err != nil { + return nil, err + } + if tx != nil { + return newRPCTransaction(tx, blockHash, blockNumber, index), nil } // No finalized transaction, try to retrieve it from the pool if tx := s.b.GetPoolTransaction(hash); tx != nil { - return newRPCPendingTransaction(tx) + return newRPCPendingTransaction(tx), nil } + // Transaction unknown, return as such - return nil + return nil, nil } // GetRawTransactionByHash returns the bytes of the transaction for the given hash. func (s *PublicTransactionPoolAPI) GetRawTransactionByHash(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) { - var tx *types.Transaction - // Retrieve a finalized transaction, or a pooled otherwise - if tx, _, _, _ = rawdb.ReadTransaction(s.b.ChainDb(), hash); tx == nil { + tx, _, _, _, err := s.b.GetTransaction(ctx, hash) + if err != nil { + return nil, err + } + if tx == nil { if tx = s.b.GetPoolTransaction(hash); tx == nil { // Transaction not found anywhere, abort return nil, nil @@ -1100,11 +1301,7 @@ func (s *PublicTransactionPoolAPI) sign(addr common.Address, tx *types.Transacti return nil, err } // Request the wallet to sign the transaction - var chainID *big.Int - if config := s.b.ChainConfig(); config.IsEIP155(s.b.CurrentBlock().Number()) { - chainID = config.ChainID - } - return wallet.SignTx(account, tx, chainID) + return wallet.SignTx(account, tx, s.b.ChainConfig().ChainID) } // SendTxArgs represents the arguments to sumbit a new transaction into the transaction pool. @@ -1123,10 +1320,6 @@ type SendTxArgs struct { // setDefaults is a helper function that fills in default values for unspecified tx fields. func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error { - if args.Gas == nil { - args.Gas = new(hexutil.Uint64) - *(*uint64)(args.Gas) = 90000 - } if args.GasPrice == nil { price, err := b.SuggestPrice(ctx) if err != nil { @@ -1159,15 +1352,37 @@ func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error { return errors.New(`contract creation without any data provided`) } } + // Estimate the gas usage if necessary. + if args.Gas == nil { + // For backwards-compatibility reason, we try both input and data + // but input is preferred. + input := args.Input + if input == nil { + input = args.Data + } + callArgs := CallArgs{ + From: &args.From, // From shouldn't be nil + To: args.To, + GasPrice: args.GasPrice, + Value: args.Value, + Data: input, + } + estimated, err := DoEstimateGas(ctx, b, callArgs, rpc.PendingBlockNumber, b.RPCGasCap()) + if err != nil { + return err + } + args.Gas = &estimated + log.Trace("Estimate gas usage automatically", "gas", args.Gas) + } return nil } func (args *SendTxArgs) toTransaction() *types.Transaction { var input []byte - if args.Data != nil { - input = *args.Data - } else if args.Input != nil { + if args.Input != nil { input = *args.Input + } else if args.Data != nil { + input = *args.Data } if args.To == nil { return types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) @@ -1175,8 +1390,8 @@ func (args *SendTxArgs) toTransaction() *types.Transaction { return types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) } -// submitTransaction is a helper function that submits tx to txPool and logs a message. -func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (common.Hash, error) { +// SubmitTransaction is a helper function that submits tx to txPool and logs a message. +func SubmitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (common.Hash, error) { if err := b.SendTx(ctx, tx); err != nil { return common.Hash{}, err } @@ -1197,7 +1412,6 @@ func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (c // SendTransaction creates a transaction for the given argument, sign it and submit it to the // transaction pool. func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args SendTxArgs) (common.Hash, error) { - // Look up the wallet containing the requested signer account := accounts.Account{Address: args.From} @@ -1220,15 +1434,11 @@ func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args Sen // Assemble the transaction and sign with the wallet tx := args.toTransaction() - var chainID *big.Int - if config := s.b.ChainConfig(); config.IsEIP155(s.b.CurrentBlock().Number()) { - chainID = config.ChainID - } - signed, err := wallet.SignTx(account, tx, chainID) + signed, err := wallet.SignTx(account, tx, s.b.ChainConfig().ChainID) if err != nil { return common.Hash{}, err } - return submitTransaction(ctx, s.b, signed) + return SubmitTransaction(ctx, s.b, signed) } // SendRawTransaction will add the signed transaction to the transaction pool. @@ -1238,7 +1448,7 @@ func (s *PublicTransactionPoolAPI) SendRawTransaction(ctx context.Context, encod if err := rlp.DecodeBytes(encodedTx, tx); err != nil { return common.Hash{}, err } - return submitTransaction(ctx, s.b, tx) + return SubmitTransaction(ctx, s.b, tx) } // Sign calculates an ECDSA signature for: @@ -1259,7 +1469,7 @@ func (s *PublicTransactionPoolAPI) Sign(addr common.Address, data hexutil.Bytes) return nil, err } // Sign the requested hash with the wallet - signature, err := wallet.SignHash(account, signHash(data)) + signature, err := wallet.SignText(account, data) if err == nil { signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper } @@ -1395,6 +1605,45 @@ func (api *PublicDebugAPI) GetBlockRlp(ctx context.Context, number uint64) (stri return fmt.Sprintf("%x", encoded), nil } +// TestSignCliqueBlock fetches the given block number, and attempts to sign it as a clique header with the +// given address, returning the address of the recovered signature +// +// This is a temporary method to debug the externalsigner integration, +// TODO: Remove this method when the integration is mature +func (api *PublicDebugAPI) TestSignCliqueBlock(ctx context.Context, address common.Address, number uint64) (common.Address, error) { + block, _ := api.b.BlockByNumber(ctx, rpc.BlockNumber(number)) + if block == nil { + return common.Address{}, fmt.Errorf("block #%d not found", number) + } + header := block.Header() + header.Extra = make([]byte, 32+65) + encoded := clique.CliqueRLP(header) + + // Look up the wallet containing the requested signer + account := accounts.Account{Address: address} + wallet, err := api.b.AccountManager().Find(account) + if err != nil { + return common.Address{}, err + } + + signature, err := wallet.SignData(account, accounts.MimetypeClique, encoded) + if err != nil { + return common.Address{}, err + } + sealHash := clique.SealHash(header).Bytes() + log.Info("test signing of clique block", + "Sealhash", fmt.Sprintf("%x", sealHash), + "signature", fmt.Sprintf("%x", signature)) + pubkey, err := crypto.Ecrecover(sealHash, signature) + if err != nil { + return common.Address{}, err + } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) + + return signer, nil +} + // PrintBlock retrieves a block and returns its pretty printed form. func (api *PublicDebugAPI) PrintBlock(ctx context.Context, number uint64) (string, error) { block, _ := api.b.BlockByNumber(ctx, rpc.BlockNumber(number)) @@ -1425,33 +1674,22 @@ func NewPrivateDebugAPI(b Backend) *PrivateDebugAPI { return &PrivateDebugAPI{b: b} } -// ChaindbProperty returns leveldb properties of the chain database. +// ChaindbProperty returns leveldb properties of the key-value database. func (api *PrivateDebugAPI) ChaindbProperty(property string) (string, error) { - ldb, ok := api.b.ChainDb().(interface { - LDB() *leveldb.DB - }) - if !ok { - return "", fmt.Errorf("chaindbProperty does not work for memory databases") - } if property == "" { property = "leveldb.stats" } else if !strings.HasPrefix(property, "leveldb.") { property = "leveldb." + property } - return ldb.LDB().GetProperty(property) + return api.b.ChainDb().Stat(property) } +// ChaindbCompact flattens the entire key-value database into a single level, +// removing all unused slots and merging all keys. func (api *PrivateDebugAPI) ChaindbCompact() error { - ldb, ok := api.b.ChainDb().(interface { - LDB() *leveldb.DB - }) - if !ok { - return fmt.Errorf("chaindbCompact does not work for memory databases") - } for b := byte(0); b < 255; b++ { log.Info("Compacting chain database", "range", fmt.Sprintf("0x%0.2X-0x%0.2X", b, b+1)) - err := ldb.LDB().CompactRange(util.Range{Start: []byte{b}, Limit: []byte{b + 1}}) - if err != nil { + if err := api.b.ChainDb().Compact([]byte{b}, []byte{b + 1}); err != nil { log.Error("Database compaction failed", "err", err) return err } diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index c9ffe230c601..0869d986cb27 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -24,6 +24,7 @@ import ( "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" @@ -44,22 +45,27 @@ type Backend interface { ChainDb() ethdb.Database EventMux() *event.TypeMux AccountManager() *accounts.Manager + ExtRPCEnabled() bool + RPCGasCap() *big.Int // global gas cap for eth_call over rpc: DoS protection - // BlockChain API + // Blockchain API SetHead(number uint64) - HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) - BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) - StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) - GetBlock(ctx context.Context, blockHash common.Hash) (*types.Block, error) - GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) - GetTd(blockHash common.Hash) *big.Int - GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header, vmCfg vm.Config) (*vm.EVM, func() error, error) + HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) + HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) + BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) + StateAndHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*state.StateDB, *types.Header, error) + GetHeader(ctx context.Context, hash common.Hash) *types.Header + GetBlock(ctx context.Context, hash common.Hash) (*types.Block, error) + GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) + GetTd(hash common.Hash) *big.Int + GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header) (*vm.EVM, func() error, error) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription - // TxPool API + // Transaction pool API SendTx(ctx context.Context, signedTx *types.Transaction) error + GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) GetPoolTransactions() (types.Transactions, error) GetPoolTransaction(txHash common.Hash) *types.Transaction GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) @@ -67,6 +73,13 @@ type Backend interface { TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription + // Filter API + BloomStatus() (uint64, uint64) + GetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error) + ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) + SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription + SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription + ChainConfig() *params.ChainConfig CurrentBlock() *types.Block } diff --git a/internal/jsre/deps/web3.js b/internal/jsre/deps/web3.js index df920bb1d389..07418d05631a 100644 --- a/internal/jsre/deps/web3.js +++ b/internal/jsre/deps/web3.js @@ -2231,7 +2231,7 @@ var toTwosComplement = function (number) { * Checks if the given string is strictly an address * * @method isStrictAddress - * @param {String} address the given HEX adress + * @param {String} address the given HEX address * @return {Boolean} */ var isStrictAddress = function (address) { @@ -2242,7 +2242,7 @@ var isStrictAddress = function (address) { * Checks if the given string is an address * * @method isAddress - * @param {String} address the given HEX adress + * @param {String} address the given HEX address * @return {Boolean} */ var isAddress = function (address) { @@ -2262,7 +2262,7 @@ var isAddress = function (address) { * Checks if the given string is a checksummed address * * @method isChecksumAddress - * @param {String} address the given HEX adress + * @param {String} address the given HEX address * @return {Boolean} */ var isChecksumAddress = function (address) { @@ -2285,7 +2285,7 @@ var isChecksumAddress = function (address) { * Makes a checksum address * * @method toChecksumAddress - * @param {String} address the given HEX adress + * @param {String} address the given HEX address * @return {String} */ var toChecksumAddress = function (address) { @@ -3003,7 +3003,7 @@ var ContractFactory = function (eth, abi) { if (callback) { - // wait for the contract address adn check if the code was deployed + // wait for the contract address and check if the code was deployed this.eth.sendTransaction(options, function (err, hash) { if (err) { callback(err); @@ -6735,7 +6735,7 @@ var transferToAddress = function (eth, from, to, value, callback) { * @method deposit * @param {String} from * @param {String} to - * @param {Value} value to be transfered + * @param {Value} value to be transferred * @param {String} client unique identifier * @param {Function} callback, callback */ diff --git a/internal/jsre/jsre.go b/internal/jsre/jsre.go index 4c7664f1ccbd..1b3528a03617 100644 --- a/internal/jsre/jsre.go +++ b/internal/jsre/jsre.go @@ -32,8 +32,8 @@ import ( ) var ( - BigNumber_JS = deps.MustAsset("bignumber.js") - Web3_JS = deps.MustAsset("web3.js") + BignumberJs = deps.MustAsset("bignumber.js") + Web3Js = deps.MustAsset("web3.js") ) /* diff --git a/internal/testlog/testlog.go b/internal/testlog/testlog.go new file mode 100644 index 000000000000..c5a6114d16aa --- /dev/null +++ b/internal/testlog/testlog.go @@ -0,0 +1,46 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package testlog provides a log handler for unit tests. +package testlog + +import ( + "testing" + + "github.com/ethereum/go-ethereum/log" +) + +// Logger returns a logger which logs to the unit test log of t. +func Logger(t *testing.T, level log.Lvl) log.Logger { + l := log.New() + l.SetHandler(Handler(t, level)) + return l +} + +// Handler returns a log handler which logs to the unit test log of t. +func Handler(t *testing.T, level log.Lvl) log.Handler { + return log.LvlFilterHandler(level, &handler{t, log.TerminalFormat(false)}) +} + +type handler struct { + t *testing.T + fmt log.Format +} + +func (h *handler) Log(r *log.Record) error { + h.t.Logf("%s", h.fmt.Format(r)) + return nil +} diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index bf4b7808f7ff..4a5d4b4ddbb0 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -18,22 +18,24 @@ package web3ext var Modules = map[string]string{ - "admin": Admin_JS, - "chequebook": Chequebook_JS, - "clique": Clique_JS, - "ethash": Ethash_JS, - "debug": Debug_JS, - "eth": Eth_JS, - "miner": Miner_JS, - "net": Net_JS, - "personal": Personal_JS, - "rpc": RPC_JS, - "shh": Shh_JS, - "swarmfs": SWARMFS_JS, - "txpool": TxPool_JS, + "accounting": AccountingJs, + "admin": AdminJs, + "chequebook": ChequebookJs, + "clique": CliqueJs, + "ethash": EthashJs, + "debug": DebugJs, + "eth": EthJs, + "miner": MinerJs, + "net": NetJs, + "personal": PersonalJs, + "rpc": RpcJs, + "shh": ShhJs, + "swarmfs": SwarmfsJs, + "txpool": TxpoolJs, + "les": LESJs, } -const Chequebook_JS = ` +const ChequebookJs = ` web3._extend({ property: 'chequebook', methods: [ @@ -64,7 +66,7 @@ web3._extend({ }); ` -const Clique_JS = ` +const CliqueJs = ` web3._extend({ property: 'clique', methods: [ @@ -110,7 +112,7 @@ web3._extend({ }); ` -const Ethash_JS = ` +const EthashJs = ` web3._extend({ property: 'ethash', methods: [ @@ -138,7 +140,7 @@ web3._extend({ }); ` -const Admin_JS = ` +const AdminJs = ` web3._extend({ property: 'admin', methods: [ @@ -216,7 +218,7 @@ web3._extend({ }); ` -const Debug_JS = ` +const DebugJs = ` web3._extend({ property: 'debug', methods: [ @@ -230,6 +232,12 @@ web3._extend({ call: 'debug_getBlockRlp', params: 1 }), + new web3._extend.Method({ + name: 'testSignCliqueBlock', + call: 'debug_testSignCliqueBlock', + params: 2, + inputFormatters: [web3._extend.formatters.inputAddressFormatter, null], + }), new web3._extend.Method({ name: 'setHead', call: 'debug_setHead', @@ -255,11 +263,6 @@ web3._extend({ name: 'chaindbCompact', call: 'debug_chaindbCompact', }), - new web3._extend.Method({ - name: 'metrics', - call: 'debug_metrics', - params: 1 - }), new web3._extend.Method({ name: 'verbosity', call: 'debug_verbosity', @@ -378,6 +381,24 @@ web3._extend({ params: 2, inputFormatter: [null, null] }), + new web3._extend.Method({ + name: 'traceBadBlock', + call: 'debug_traceBadBlock', + params: 1, + inputFormatter: [null] + }), + new web3._extend.Method({ + name: 'standardTraceBadBlockToFile', + call: 'debug_standardTraceBadBlockToFile', + params: 2, + inputFormatter: [null, null] + }), + new web3._extend.Method({ + name: 'standardTraceBlockToFile', + call: 'debug_standardTraceBlockToFile', + params: 2, + inputFormatter: [null, null] + }), new web3._extend.Method({ name: 'traceBlockByNumber', call: 'debug_traceBlockByNumber', @@ -429,7 +450,7 @@ web3._extend({ }); ` -const Eth_JS = ` +const EthJs = ` web3._extend({ property: 'eth', methods: [ @@ -462,6 +483,26 @@ web3._extend({ params: 1, inputFormatter: [web3._extend.formatters.inputTransactionFormatter] }), + new web3._extend.Method({ + name: 'getHeaderByNumber', + call: 'eth_getHeaderByNumber', + params: 1 + }), + new web3._extend.Method({ + name: 'getHeaderByHash', + call: 'eth_getHeaderByHash', + params: 1 + }), + new web3._extend.Method({ + name: 'getBlockByNumber', + call: 'eth_getBlockByNumber', + params: 2 + }), + new web3._extend.Method({ + name: 'getBlockByHash', + call: 'eth_getBlockByHash', + params: 2 + }), new web3._extend.Method({ name: 'getRawTransaction', call: 'eth_getRawTransactionByHash', @@ -475,6 +516,12 @@ web3._extend({ params: 2, inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.utils.toHex] }), + new web3._extend.Method({ + name: 'getProof', + call: 'eth_getProof', + params: 3, + inputFormatter: [web3._extend.formatters.inputAddressFormatter, null, web3._extend.formatters.inputBlockNumberFormatter] + }), ], properties: [ new web3._extend.Property({ @@ -493,7 +540,7 @@ web3._extend({ }); ` -const Miner_JS = ` +const MinerJs = ` web3._extend({ property: 'miner', methods: [ @@ -538,7 +585,7 @@ web3._extend({ }); ` -const Net_JS = ` +const NetJs = ` web3._extend({ property: 'net', methods: [], @@ -551,7 +598,7 @@ web3._extend({ }); ` -const Personal_JS = ` +const PersonalJs = ` web3._extend({ property: 'personal', methods: [ @@ -587,6 +634,16 @@ web3._extend({ params: 2, inputFormatter: [web3._extend.formatters.inputTransactionFormatter, null] }), + new web3._extend.Method({ + name: 'unpair', + call: 'personal_unpair', + params: 2 + }), + new web3._extend.Method({ + name: 'initializeWallet', + call: 'personal_initializeWallet', + params: 1 + }) ], properties: [ new web3._extend.Property({ @@ -597,7 +654,7 @@ web3._extend({ }) ` -const RPC_JS = ` +const RpcJs = ` web3._extend({ property: 'rpc', methods: [], @@ -610,7 +667,7 @@ web3._extend({ }); ` -const Shh_JS = ` +const ShhJs = ` web3._extend({ property: 'shh', methods: [ @@ -630,7 +687,7 @@ web3._extend({ }); ` -const SWARMFS_JS = ` +const SwarmfsJs = ` web3._extend({ property: 'swarmfs', methods: @@ -654,7 +711,7 @@ web3._extend({ }); ` -const TxPool_JS = ` +const TxpoolJs = ` web3._extend({ property: 'txpool', methods: [], @@ -680,3 +737,72 @@ web3._extend({ ] }); ` + +const AccountingJs = ` +web3._extend({ + property: 'accounting', + methods: [ + new web3._extend.Property({ + name: 'balance', + getter: 'account_balance' + }), + new web3._extend.Property({ + name: 'balanceCredit', + getter: 'account_balanceCredit' + }), + new web3._extend.Property({ + name: 'balanceDebit', + getter: 'account_balanceDebit' + }), + new web3._extend.Property({ + name: 'bytesCredit', + getter: 'account_bytesCredit' + }), + new web3._extend.Property({ + name: 'bytesDebit', + getter: 'account_bytesDebit' + }), + new web3._extend.Property({ + name: 'msgCredit', + getter: 'account_msgCredit' + }), + new web3._extend.Property({ + name: 'msgDebit', + getter: 'account_msgDebit' + }), + new web3._extend.Property({ + name: 'peerDrops', + getter: 'account_peerDrops' + }), + new web3._extend.Property({ + name: 'selfDrops', + getter: 'account_selfDrops' + }), + ] +}); +` + +const LESJs = ` +web3._extend({ + property: 'les', + methods: + [ + new web3._extend.Method({ + name: 'getCheckpoint', + call: 'les_getCheckpoint', + params: 1 + }), + ], + properties: + [ + new web3._extend.Property({ + name: 'latestCheckpoint', + getter: 'les_latestCheckpoint' + }), + new web3._extend.Property({ + name: 'checkpointContractAddress', + getter: 'les_getCheckpointContractAddress' + }), + ] +}); +` diff --git a/les/api.go b/les/api.go new file mode 100644 index 000000000000..e20f72cad0ce --- /dev/null +++ b/les/api.go @@ -0,0 +1,84 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "errors" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var ( + errNoCheckpoint = errors.New("no local checkpoint provided") + errNotActivated = errors.New("checkpoint registrar is not activated") +) + +// PrivateLightAPI provides an API to access the LES light server or light client. +type PrivateLightAPI struct { + backend *lesCommons + reg *checkpointOracle +} + +// NewPrivateLightAPI creates a new LES service API. +func NewPrivateLightAPI(backend *lesCommons, reg *checkpointOracle) *PrivateLightAPI { + return &PrivateLightAPI{ + backend: backend, + reg: reg, + } +} + +// LatestCheckpoint returns the latest local checkpoint package. +// +// The checkpoint package consists of 4 strings: +// result[0], hex encoded latest section index +// result[1], 32 bytes hex encoded latest section head hash +// result[2], 32 bytes hex encoded latest section canonical hash trie root hash +// result[3], 32 bytes hex encoded latest section bloom trie root hash +func (api *PrivateLightAPI) LatestCheckpoint() ([4]string, error) { + var res [4]string + cp := api.backend.latestLocalCheckpoint() + if cp.Empty() { + return res, errNoCheckpoint + } + res[0] = hexutil.EncodeUint64(cp.SectionIndex) + res[1], res[2], res[3] = cp.SectionHead.Hex(), cp.CHTRoot.Hex(), cp.BloomRoot.Hex() + return res, nil +} + +// GetLocalCheckpoint returns the specific local checkpoint package. +// +// The checkpoint package consists of 3 strings: +// result[0], 32 bytes hex encoded latest section head hash +// result[1], 32 bytes hex encoded latest section canonical hash trie root hash +// result[2], 32 bytes hex encoded latest section bloom trie root hash +func (api *PrivateLightAPI) GetCheckpoint(index uint64) ([3]string, error) { + var res [3]string + cp := api.backend.getLocalCheckpoint(index) + if cp.Empty() { + return res, errNoCheckpoint + } + res[0], res[1], res[2] = cp.SectionHead.Hex(), cp.CHTRoot.Hex(), cp.BloomRoot.Hex() + return res, nil +} + +// GetCheckpointContractAddress returns the contract contract address in hex format. +func (api *PrivateLightAPI) GetCheckpointContractAddress() (string, error) { + if api.reg == nil { + return "", errNotActivated + } + return api.reg.config.Address.Hex(), nil +} diff --git a/les/api_backend.go b/les/api_backend.go index aa748a4ea140..f1ac8ed5a5cf 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -18,6 +18,7 @@ package les import ( "context" + "errors" "math/big" "github.com/ethereum/go-ethereum/accounts" @@ -39,8 +40,9 @@ import ( ) type LesApiBackend struct { - eth *LightEthereum - gpo *gasprice.Oracle + extRPCEnabled bool + eth *LightEthereum + gpo *gasprice.Oracle } func (b *LesApiBackend) ChainConfig() *params.ChainConfig { @@ -56,35 +58,42 @@ func (b *LesApiBackend) SetHead(number uint64) { b.eth.blockchain.SetHead(number) } -func (b *LesApiBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) { - if blockNr == rpc.LatestBlockNumber || blockNr == rpc.PendingBlockNumber { +func (b *LesApiBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) { + if number == rpc.LatestBlockNumber || number == rpc.PendingBlockNumber { return b.eth.blockchain.CurrentHeader(), nil } - return b.eth.blockchain.GetHeaderByNumberOdr(ctx, uint64(blockNr)) + return b.eth.blockchain.GetHeaderByNumberOdr(ctx, uint64(number)) } func (b *LesApiBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { return b.eth.blockchain.GetHeaderByHash(hash), nil } -func (b *LesApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) { - header, err := b.HeaderByNumber(ctx, blockNr) +func (b *LesApiBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) { + header, err := b.HeaderByNumber(ctx, number) if header == nil || err != nil { return nil, err } return b.GetBlock(ctx, header.Hash()) } -func (b *LesApiBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) { - header, err := b.HeaderByNumber(ctx, blockNr) - if header == nil || err != nil { +func (b *LesApiBackend) StateAndHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*state.StateDB, *types.Header, error) { + header, err := b.HeaderByNumber(ctx, number) + if err != nil { return nil, nil, err } + if header == nil { + return nil, nil, errors.New("header not found") + } return light.NewState(ctx, header, b.eth.odr), header, nil } -func (b *LesApiBackend) GetBlock(ctx context.Context, blockHash common.Hash) (*types.Block, error) { - return b.eth.blockchain.GetBlockByHash(ctx, blockHash) +func (b *LesApiBackend) GetHeader(ctx context.Context, hash common.Hash) *types.Header { + return b.eth.blockchain.GetHeaderByHash(hash) +} + +func (b *LesApiBackend) GetBlock(ctx context.Context, hash common.Hash) (*types.Block, error) { + return b.eth.blockchain.GetBlockByHash(ctx, hash) } func (b *LesApiBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { @@ -105,10 +114,10 @@ func (b *LesApiBackend) GetTd(hash common.Hash) *big.Int { return b.eth.blockchain.GetTdByHash(hash) } -func (b *LesApiBackend) GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header, vmCfg vm.Config) (*vm.EVM, func() error, error) { +func (b *LesApiBackend) GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header) (*vm.EVM, func() error, error) { state.SetBalance(msg.From(), math.MaxBig256) context := core.NewEVMContext(msg, header, b.eth.blockchain, nil) - return vm.NewEVM(context, state, b.eth.chainConfig, vmCfg), state.Error, nil + return vm.NewEVM(context, state, b.eth.chainConfig, vm.Config{}), state.Error, nil } func (b *LesApiBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error { @@ -127,6 +136,10 @@ func (b *LesApiBackend) GetPoolTransaction(txHash common.Hash) *types.Transactio return b.eth.txPool.GetTransaction(txHash) } +func (b *LesApiBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { + return light.GetTransaction(ctx, b.eth.odr, txHash) +} + func (b *LesApiBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) { return b.eth.txPool.GetNonce(ctx, addr) } @@ -187,6 +200,14 @@ func (b *LesApiBackend) AccountManager() *accounts.Manager { return b.eth.accountManager } +func (b *LesApiBackend) ExtRPCEnabled() bool { + return b.extRPCEnabled +} + +func (b *LesApiBackend) RPCGasCap() *big.Int { + return b.eth.config.RPCGasCap +} + func (b *LesApiBackend) BloomStatus() (uint64, uint64) { if b.eth.bloomIndexer == nil { return 0, 0 diff --git a/les/api_test.go b/les/api_test.go new file mode 100644 index 000000000000..8b39a4e17699 --- /dev/null +++ b/les/api_test.go @@ -0,0 +1,524 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "context" + "errors" + "flag" + "io/ioutil" + "math/rand" + "os" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" + "github.com/mattn/go-colorable" +) + +/* +This test is not meant to be a part of the automatic testing process because it +runs for a long time and also requires a large database in order to do a meaningful +request performance test. When testServerDataDir is empty, the test is skipped. +*/ + +const ( + testServerDataDir = "" // should always be empty on the master branch + testServerCapacity = 200 + testMaxClients = 10 + testTolerance = 0.1 + minRelCap = 0.2 +) + +func TestCapacityAPI3(t *testing.T) { + testCapacityAPI(t, 3) +} + +func TestCapacityAPI6(t *testing.T) { + testCapacityAPI(t, 6) +} + +func TestCapacityAPI10(t *testing.T) { + testCapacityAPI(t, 10) +} + +// testCapacityAPI runs an end-to-end simulation test connecting one server with +// a given number of clients. It sets different priority capacities to all clients +// except a randomly selected one which runs in free client mode. All clients send +// similar requests at the maximum allowed rate and the test verifies whether the +// ratio of processed requests is close enough to the ratio of assigned capacities. +// Running multiple rounds with different settings ensures that changing capacity +// while connected and going back and forth between free and priority mode with +// the supplied API calls is also thoroughly tested. +func testCapacityAPI(t *testing.T, clientCount int) { + if testServerDataDir == "" { + // Skip test if no data dir specified + return + } + + for !testSim(t, 1, clientCount, []string{testServerDataDir}, nil, func(ctx context.Context, net *simulations.Network, servers []*simulations.Node, clients []*simulations.Node) bool { + if len(servers) != 1 { + t.Fatalf("Invalid number of servers: %d", len(servers)) + } + server := servers[0] + + clientRpcClients := make([]*rpc.Client, len(clients)) + + serverRpcClient, err := server.Client() + if err != nil { + t.Fatalf("Failed to obtain rpc client: %v", err) + } + headNum, headHash := getHead(ctx, t, serverRpcClient) + totalCap := getTotalCap(ctx, t, serverRpcClient) + minCap := getMinCap(ctx, t, serverRpcClient) + testCap := totalCap * 3 / 4 + t.Logf("Server testCap: %d minCap: %d head number: %d head hash: %064x\n", testCap, minCap, headNum, headHash) + reqMinCap := uint64(float64(testCap) * minRelCap / (minRelCap + float64(len(clients)-1))) + if minCap > reqMinCap { + t.Fatalf("Minimum client capacity (%d) bigger than required minimum for this test (%d)", minCap, reqMinCap) + } + + freeIdx := rand.Intn(len(clients)) + freeCap := getFreeCap(ctx, t, serverRpcClient) + + for i, client := range clients { + var err error + clientRpcClients[i], err = client.Client() + if err != nil { + t.Fatalf("Failed to obtain rpc client: %v", err) + } + + t.Log("connecting client", i) + if i != freeIdx { + setCapacity(ctx, t, serverRpcClient, client.ID(), testCap/uint64(len(clients))) + } + net.Connect(client.ID(), server.ID()) + + for { + select { + case <-ctx.Done(): + t.Fatalf("Timeout") + default: + } + num, hash := getHead(ctx, t, clientRpcClients[i]) + if num == headNum && hash == headHash { + t.Log("client", i, "synced") + break + } + time.Sleep(time.Millisecond * 200) + } + } + + var wg sync.WaitGroup + stop := make(chan struct{}) + + reqCount := make([]uint64, len(clientRpcClients)) + + for i, c := range clientRpcClients { + wg.Add(1) + i, c := i, c + go func() { + queue := make(chan struct{}, 100) + var count uint64 + for { + select { + case queue <- struct{}{}: + select { + case <-stop: + wg.Done() + return + case <-ctx.Done(): + wg.Done() + return + default: + wg.Add(1) + go func() { + ok := testRequest(ctx, t, c) + wg.Done() + <-queue + if ok { + count++ + atomic.StoreUint64(&reqCount[i], count) + } + }() + } + case <-stop: + wg.Done() + return + case <-ctx.Done(): + wg.Done() + return + } + } + }() + } + + processedSince := func(start []uint64) []uint64 { + res := make([]uint64, len(reqCount)) + for i := range reqCount { + res[i] = atomic.LoadUint64(&reqCount[i]) + if start != nil { + res[i] -= start[i] + } + } + return res + } + + weights := make([]float64, len(clients)) + for c := 0; c < 5; c++ { + setCapacity(ctx, t, serverRpcClient, clients[freeIdx].ID(), freeCap) + freeIdx = rand.Intn(len(clients)) + var sum float64 + for i := range clients { + if i == freeIdx { + weights[i] = 0 + } else { + weights[i] = rand.Float64()*(1-minRelCap) + minRelCap + } + sum += weights[i] + } + for i, client := range clients { + weights[i] *= float64(testCap-freeCap-100) / sum + capacity := uint64(weights[i]) + if i != freeIdx && capacity < getCapacity(ctx, t, serverRpcClient, client.ID()) { + setCapacity(ctx, t, serverRpcClient, client.ID(), capacity) + } + } + setCapacity(ctx, t, serverRpcClient, clients[freeIdx].ID(), 0) + for i, client := range clients { + capacity := uint64(weights[i]) + if i != freeIdx && capacity > getCapacity(ctx, t, serverRpcClient, client.ID()) { + setCapacity(ctx, t, serverRpcClient, client.ID(), capacity) + } + } + weights[freeIdx] = float64(freeCap) + for i := range clients { + weights[i] /= float64(testCap) + } + + time.Sleep(flowcontrol.DecParamDelay) + t.Log("Starting measurement") + t.Logf("Relative weights:") + for i := range clients { + t.Logf(" %f", weights[i]) + } + t.Log() + start := processedSince(nil) + for { + select { + case <-ctx.Done(): + t.Fatalf("Timeout") + default: + } + + totalCap = getTotalCap(ctx, t, serverRpcClient) + if totalCap < testCap { + t.Log("Total capacity underrun") + close(stop) + wg.Wait() + return false + } + + processed := processedSince(start) + var avg uint64 + t.Logf("Processed") + for i, p := range processed { + t.Logf(" %d", p) + processed[i] = uint64(float64(p) / weights[i]) + avg += processed[i] + } + avg /= uint64(len(processed)) + + if avg >= 10000 { + var maxDev float64 + for _, p := range processed { + dev := float64(int64(p-avg)) / float64(avg) + t.Logf(" %7.4f", dev) + if dev < 0 { + dev = -dev + } + if dev > maxDev { + maxDev = dev + } + } + t.Logf(" max deviation: %f totalCap: %d\n", maxDev, totalCap) + if maxDev <= testTolerance { + t.Log("success") + break + } + } else { + t.Log() + } + time.Sleep(time.Millisecond * 200) + } + } + + close(stop) + wg.Wait() + + for i, count := range reqCount { + t.Log("client", i, "processed", count) + } + return true + }) { + t.Log("restarting test") + } +} + +func getHead(ctx context.Context, t *testing.T, client *rpc.Client) (uint64, common.Hash) { + res := make(map[string]interface{}) + if err := client.CallContext(ctx, &res, "eth_getBlockByNumber", "latest", false); err != nil { + t.Fatalf("Failed to obtain head block: %v", err) + } + numStr, ok := res["number"].(string) + if !ok { + t.Fatalf("RPC block number field invalid") + } + num, err := hexutil.DecodeUint64(numStr) + if err != nil { + t.Fatalf("Failed to decode RPC block number: %v", err) + } + hashStr, ok := res["hash"].(string) + if !ok { + t.Fatalf("RPC block number field invalid") + } + hash := common.HexToHash(hashStr) + return num, hash +} + +func testRequest(ctx context.Context, t *testing.T, client *rpc.Client) bool { + //res := make(map[string]interface{}) + var res string + var addr common.Address + rand.Read(addr[:]) + c, _ := context.WithTimeout(ctx, time.Second*12) + // if err := client.CallContext(ctx, &res, "eth_getProof", addr, nil, "latest"); err != nil { + err := client.CallContext(c, &res, "eth_getBalance", addr, "latest") + if err != nil { + t.Log("request error:", err) + } + return err == nil +} + +func setCapacity(ctx context.Context, t *testing.T, server *rpc.Client, clientID enode.ID, cap uint64) { + if err := server.CallContext(ctx, nil, "les_setClientCapacity", clientID, cap); err != nil { + t.Fatalf("Failed to set client capacity: %v", err) + } +} + +func getCapacity(ctx context.Context, t *testing.T, server *rpc.Client, clientID enode.ID) uint64 { + var s string + if err := server.CallContext(ctx, &s, "les_getClientCapacity", clientID); err != nil { + t.Fatalf("Failed to get client capacity: %v", err) + } + cap, err := hexutil.DecodeUint64(s) + if err != nil { + t.Fatalf("Failed to decode client capacity: %v", err) + } + return cap +} + +func getTotalCap(ctx context.Context, t *testing.T, server *rpc.Client) uint64 { + var s string + if err := server.CallContext(ctx, &s, "les_totalCapacity"); err != nil { + t.Fatalf("Failed to query total capacity: %v", err) + } + total, err := hexutil.DecodeUint64(s) + if err != nil { + t.Fatalf("Failed to decode total capacity: %v", err) + } + return total +} + +func getMinCap(ctx context.Context, t *testing.T, server *rpc.Client) uint64 { + var s string + if err := server.CallContext(ctx, &s, "les_minimumCapacity"); err != nil { + t.Fatalf("Failed to query minimum capacity: %v", err) + } + min, err := hexutil.DecodeUint64(s) + if err != nil { + t.Fatalf("Failed to decode minimum capacity: %v", err) + } + return min +} + +func getFreeCap(ctx context.Context, t *testing.T, server *rpc.Client) uint64 { + var s string + if err := server.CallContext(ctx, &s, "les_freeClientCapacity"); err != nil { + t.Fatalf("Failed to query free client capacity: %v", err) + } + free, err := hexutil.DecodeUint64(s) + if err != nil { + t.Fatalf("Failed to decode free client capacity: %v", err) + } + return free +} + +func init() { + flag.Parse() + // register the Delivery service which will run as a devp2p + // protocol when using the exec adapter + adapters.RegisterServices(services) + + log.PrintOrigins(true) + log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) +} + +var ( + adapter = flag.String("adapter", "exec", "type of simulation: sim|socket|exec|docker") + loglevel = flag.Int("loglevel", 0, "verbosity of logs") + nodes = flag.Int("nodes", 0, "number of nodes") +) + +var services = adapters.Services{ + "lesclient": newLesClientService, + "lesserver": newLesServerService, +} + +func NewNetwork() (*simulations.Network, func(), error) { + adapter, adapterTeardown, err := NewAdapter(*adapter, services) + if err != nil { + return nil, adapterTeardown, err + } + defaultService := "streamer" + net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ + ID: "0", + DefaultService: defaultService, + }) + teardown := func() { + adapterTeardown() + net.Shutdown() + } + + return net, teardown, nil +} + +func NewAdapter(adapterType string, services adapters.Services) (adapter adapters.NodeAdapter, teardown func(), err error) { + teardown = func() {} + switch adapterType { + case "sim": + adapter = adapters.NewSimAdapter(services) + // case "socket": + // adapter = adapters.NewSocketAdapter(services) + case "exec": + baseDir, err0 := ioutil.TempDir("", "les-test") + if err0 != nil { + return nil, teardown, err0 + } + teardown = func() { os.RemoveAll(baseDir) } + adapter = adapters.NewExecAdapter(baseDir) + /*case "docker": + adapter, err = adapters.NewDockerAdapter() + if err != nil { + return nil, teardown, err + }*/ + default: + return nil, teardown, errors.New("adapter needs to be one of sim, socket, exec, docker") + } + return adapter, teardown, nil +} + +func testSim(t *testing.T, serverCount, clientCount int, serverDir, clientDir []string, test func(ctx context.Context, net *simulations.Network, servers []*simulations.Node, clients []*simulations.Node) bool) bool { + net, teardown, err := NewNetwork() + defer teardown() + if err != nil { + t.Fatalf("Failed to create network: %v", err) + } + timeout := 1800 * time.Second + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + servers := make([]*simulations.Node, serverCount) + clients := make([]*simulations.Node, clientCount) + + for i := range clients { + clientconf := adapters.RandomNodeConfig() + clientconf.Services = []string{"lesclient"} + if len(clientDir) == clientCount { + clientconf.DataDir = clientDir[i] + } + client, err := net.NewNodeWithConfig(clientconf) + if err != nil { + t.Fatalf("Failed to create client: %v", err) + } + clients[i] = client + } + + for i := range servers { + serverconf := adapters.RandomNodeConfig() + serverconf.Services = []string{"lesserver"} + if len(serverDir) == serverCount { + serverconf.DataDir = serverDir[i] + } + server, err := net.NewNodeWithConfig(serverconf) + if err != nil { + t.Fatalf("Failed to create server: %v", err) + } + servers[i] = server + } + + for _, client := range clients { + if err := net.Start(client.ID()); err != nil { + t.Fatalf("Failed to start client node: %v", err) + } + } + for _, server := range servers { + if err := net.Start(server.ID()); err != nil { + t.Fatalf("Failed to start server node: %v", err) + } + } + + return test(ctx, net, servers, clients) +} + +func newLesClientService(ctx *adapters.ServiceContext) (node.Service, error) { + config := eth.DefaultConfig + config.SyncMode = downloader.LightSync + config.Ethash.PowMode = ethash.ModeFake + return New(ctx.NodeContext, &config) +} + +func newLesServerService(ctx *adapters.ServiceContext) (node.Service, error) { + config := eth.DefaultConfig + config.SyncMode = downloader.FullSync + config.LightServ = testServerCapacity + config.LightPeers = testMaxClients + ethereum, err := eth.New(ctx.NodeContext, &config) + if err != nil { + return nil, err + } + + server, err := NewLesServer(ethereum, &config) + if err != nil { + return nil, err + } + ethereum.AddLesServer(server) + return ethereum, nil +} diff --git a/les/backend.go b/les/backend.go index a3474a6830eb..c067afaea60a 100644 --- a/les/backend.go +++ b/les/backend.go @@ -23,8 +23,10 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/mclock" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/bloombits" @@ -42,14 +44,13 @@ import ( "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/discv5" "github.com/ethereum/go-ethereum/params" - rpc "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/rpc" ) type LightEthereum struct { lesCommons odr *LesOdr - relay *LesTxRelay chainConfig *params.ChainConfig // Channel for shutting down the service shutdownChan chan bool @@ -61,6 +62,7 @@ type LightEthereum struct { serverPool *serverPool reqDist *requestDistributor retriever *retrieveManager + relay *lesTxRelay bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests bloomIndexer *core.ChainIndexer @@ -78,7 +80,7 @@ type LightEthereum struct { } func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { - chainDb, err := eth.CreateDB(ctx, config, "lightchaindata") + chainDb, err := ctx.OpenDatabase("lightchaindata", config.DatabaseCache, config.DatabaseHandles, "eth/db/chaindata/") if err != nil { return nil, err } @@ -100,7 +102,7 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { chainConfig: chainConfig, eventMux: ctx.EventMux, peers: peers, - reqDist: newRequestDistributor(peers, quitSync), + reqDist: newRequestDistributor(peers, quitSync, &mclock.System{}), accountManager: ctx.AccountManager, engine: eth.CreateConsensusEngine(ctx, chainConfig, &config.Ethash, nil, false, chainDb), shutdownChan: make(chan bool), @@ -108,19 +110,22 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { bloomRequests: make(chan chan *bloombits.Retrieval), bloomIndexer: eth.NewBloomIndexer(chainDb, params.BloomBitsBlocksClient, params.HelperTrieConfirmations), } - - leth.relay = NewLesTxRelay(peers, leth.reqDist) - leth.serverPool = newServerPool(chainDb, quitSync, &leth.wg) + leth.serverPool = newServerPool(chainDb, quitSync, &leth.wg, leth.config.UltraLightServers) leth.retriever = newRetrieveManager(peers, leth.reqDist, leth.serverPool) + leth.relay = newLesTxRelay(peers, leth.retriever) leth.odr = NewLesOdr(chainDb, light.DefaultClientIndexerConfig, leth.retriever) - leth.chtIndexer = light.NewChtIndexer(chainDb, leth.odr, params.CHTFrequencyClient, params.HelperTrieConfirmations) + leth.chtIndexer = light.NewChtIndexer(chainDb, leth.odr, params.CHTFrequency, params.HelperTrieConfirmations) leth.bloomTrieIndexer = light.NewBloomTrieIndexer(chainDb, leth.odr, params.BloomBitsBlocksClient, params.BloomTrieFrequency) leth.odr.SetIndexers(leth.chtIndexer, leth.bloomTrieIndexer, leth.bloomIndexer) + checkpoint := config.Checkpoint + if checkpoint == nil { + checkpoint = params.TrustedCheckpoints[genesisHash] + } // Note: NewLightChain adds the trusted checkpoint so it needs an ODR with // indexers already set but not started yet - if leth.blockchain, err = light.NewLightChain(leth.odr, leth.chainConfig, leth.engine); err != nil { + if leth.blockchain, err = light.NewLightChain(leth.odr, leth.chainConfig, leth.engine, checkpoint); err != nil { return nil, err } // Note: AddChildIndexer starts the update process for the child @@ -136,23 +141,32 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { } leth.txPool = light.NewTxPool(leth.chainConfig, leth.blockchain, leth.relay) - if leth.protocolManager, err = NewProtocolManager(leth.chainConfig, light.DefaultClientIndexerConfig, true, config.NetworkId, leth.eventMux, leth.engine, leth.peers, leth.blockchain, nil, chainDb, leth.odr, leth.relay, leth.serverPool, quitSync, &leth.wg); err != nil { - return nil, err - } - leth.ApiBackend = &LesApiBackend{leth, nil} + leth.ApiBackend = &LesApiBackend{ctx.ExtRPCEnabled(), leth, nil} + gpoParams := config.GPO if gpoParams.Default == nil { - gpoParams.Default = config.MinerGasPrice + gpoParams.Default = config.Miner.GasPrice } leth.ApiBackend.gpo = gasprice.NewOracle(leth.ApiBackend, gpoParams) + + oracle := config.CheckpointOracle + if oracle == nil { + oracle = params.CheckpointOracles[genesisHash] + } + registrar := newCheckpointOracle(oracle, leth.getLocalCheckpoint) + if leth.protocolManager, err = NewProtocolManager(leth.chainConfig, checkpoint, light.DefaultClientIndexerConfig, config.UltraLightServers, config.UltraLightFraction, true, config.NetworkId, leth.eventMux, leth.peers, leth.blockchain, nil, chainDb, leth.odr, leth.serverPool, registrar, quitSync, &leth.wg, nil); err != nil { + return nil, err + } + if leth.protocolManager.ulc != nil { + log.Warn("Ultra light client is enabled", "servers", len(config.UltraLightServers), "fraction", config.UltraLightFraction) + leth.blockchain.DisableCheckFreq() + } return leth, nil } func lesTopic(genesisHash common.Hash, protocolVersion uint) discv5.Topic { var name string switch protocolVersion { - case lpv1: - name = "LES" case lpv2: name = "LES2" default: @@ -165,12 +179,12 @@ type LightDummyAPI struct{} // Etherbase is the address that mining rewards will be send to func (s *LightDummyAPI) Etherbase() (common.Address, error) { - return common.Address{}, fmt.Errorf("not supported") + return common.Address{}, fmt.Errorf("mining is not supported in light mode") } // Coinbase is the address that mining rewards will be send to (alias for Etherbase) func (s *LightDummyAPI) Coinbase() (common.Address, error) { - return common.Address{}, fmt.Errorf("not supported") + return common.Address{}, fmt.Errorf("mining is not supported in light mode") } // Hashrate returns the POW hashrate @@ -207,6 +221,11 @@ func (s *LightEthereum) APIs() []rpc.API { Version: "1.0", Service: s.netRPCService, Public: true, + }, { + Namespace: "les", + Version: "1.0", + Service: NewPrivateLightAPI(&s.lesCommons, s.protocolManager.reg), + Public: false, }, }...) } @@ -245,6 +264,7 @@ func (s *LightEthereum) Start(srvr *p2p.Server) error { // Ethereum protocol. func (s *LightEthereum) Stop() error { s.odr.Stop() + s.relay.Stop() s.bloomIndexer.Close() s.chtIndexer.Close() s.blockchain.Stop() @@ -260,3 +280,12 @@ func (s *LightEthereum) Stop() error { return nil } + +// SetClient sets the rpc client and binds the registrar contract. +func (s *LightEthereum) SetContractBackend(backend bind.ContractBackend) { + // Short circuit if registrar is nil + if s.protocolManager.reg == nil { + return + } + s.protocolManager.reg.start(backend) +} diff --git a/les/benchmark.go b/les/benchmark.go new file mode 100644 index 000000000000..74dfcf7c9e1f --- /dev/null +++ b/les/benchmark.go @@ -0,0 +1,352 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "encoding/binary" + "fmt" + "math/big" + "math/rand" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" +) + +// requestBenchmark is an interface for different randomized request generators +type requestBenchmark interface { + // init initializes the generator for generating the given number of randomized requests + init(pm *ProtocolManager, count int) error + // request initiates sending a single request to the given peer + request(peer *peer, index int) error +} + +// benchmarkBlockHeaders implements requestBenchmark +type benchmarkBlockHeaders struct { + amount, skip int + reverse, byHash bool + offset, randMax int64 + hashes []common.Hash +} + +func (b *benchmarkBlockHeaders) init(pm *ProtocolManager, count int) error { + d := int64(b.amount-1) * int64(b.skip+1) + b.offset = 0 + b.randMax = pm.blockchain.CurrentHeader().Number.Int64() + 1 - d + if b.randMax < 0 { + return fmt.Errorf("chain is too short") + } + if b.reverse { + b.offset = d + } + if b.byHash { + b.hashes = make([]common.Hash, count) + for i := range b.hashes { + b.hashes[i] = rawdb.ReadCanonicalHash(pm.chainDb, uint64(b.offset+rand.Int63n(b.randMax))) + } + } + return nil +} + +func (b *benchmarkBlockHeaders) request(peer *peer, index int) error { + if b.byHash { + return peer.RequestHeadersByHash(0, 0, b.hashes[index], b.amount, b.skip, b.reverse) + } else { + return peer.RequestHeadersByNumber(0, 0, uint64(b.offset+rand.Int63n(b.randMax)), b.amount, b.skip, b.reverse) + } +} + +// benchmarkBodiesOrReceipts implements requestBenchmark +type benchmarkBodiesOrReceipts struct { + receipts bool + hashes []common.Hash +} + +func (b *benchmarkBodiesOrReceipts) init(pm *ProtocolManager, count int) error { + randMax := pm.blockchain.CurrentHeader().Number.Int64() + 1 + b.hashes = make([]common.Hash, count) + for i := range b.hashes { + b.hashes[i] = rawdb.ReadCanonicalHash(pm.chainDb, uint64(rand.Int63n(randMax))) + } + return nil +} + +func (b *benchmarkBodiesOrReceipts) request(peer *peer, index int) error { + if b.receipts { + return peer.RequestReceipts(0, 0, []common.Hash{b.hashes[index]}) + } else { + return peer.RequestBodies(0, 0, []common.Hash{b.hashes[index]}) + } +} + +// benchmarkProofsOrCode implements requestBenchmark +type benchmarkProofsOrCode struct { + code bool + headHash common.Hash +} + +func (b *benchmarkProofsOrCode) init(pm *ProtocolManager, count int) error { + b.headHash = pm.blockchain.CurrentHeader().Hash() + return nil +} + +func (b *benchmarkProofsOrCode) request(peer *peer, index int) error { + key := make([]byte, 32) + rand.Read(key) + if b.code { + return peer.RequestCode(0, 0, []CodeReq{{BHash: b.headHash, AccKey: key}}) + } else { + return peer.RequestProofs(0, 0, []ProofReq{{BHash: b.headHash, Key: key}}) + } +} + +// benchmarkHelperTrie implements requestBenchmark +type benchmarkHelperTrie struct { + bloom bool + reqCount int + sectionCount, headNum uint64 +} + +func (b *benchmarkHelperTrie) init(pm *ProtocolManager, count int) error { + if b.bloom { + b.sectionCount, b.headNum, _ = pm.server.bloomTrieIndexer.Sections() + } else { + b.sectionCount, _, _ = pm.server.chtIndexer.Sections() + b.headNum = b.sectionCount*params.CHTFrequency - 1 + } + if b.sectionCount == 0 { + return fmt.Errorf("no processed sections available") + } + return nil +} + +func (b *benchmarkHelperTrie) request(peer *peer, index int) error { + reqs := make([]HelperTrieReq, b.reqCount) + + if b.bloom { + bitIdx := uint16(rand.Intn(2048)) + for i := range reqs { + key := make([]byte, 10) + binary.BigEndian.PutUint16(key[:2], bitIdx) + binary.BigEndian.PutUint64(key[2:], uint64(rand.Int63n(int64(b.sectionCount)))) + reqs[i] = HelperTrieReq{Type: htBloomBits, TrieIdx: b.sectionCount - 1, Key: key} + } + } else { + for i := range reqs { + key := make([]byte, 8) + binary.BigEndian.PutUint64(key[:], uint64(rand.Int63n(int64(b.headNum)))) + reqs[i] = HelperTrieReq{Type: htCanonical, TrieIdx: b.sectionCount - 1, Key: key, AuxReq: auxHeader} + } + } + + return peer.RequestHelperTrieProofs(0, 0, reqs) +} + +// benchmarkTxSend implements requestBenchmark +type benchmarkTxSend struct { + txs types.Transactions +} + +func (b *benchmarkTxSend) init(pm *ProtocolManager, count int) error { + key, _ := crypto.GenerateKey() + addr := crypto.PubkeyToAddress(key.PublicKey) + signer := types.NewEIP155Signer(big.NewInt(18)) + b.txs = make(types.Transactions, count) + + for i := range b.txs { + data := make([]byte, txSizeCostLimit) + rand.Read(data) + tx, err := types.SignTx(types.NewTransaction(0, addr, new(big.Int), 0, new(big.Int), data), signer, key) + if err != nil { + panic(err) + } + b.txs[i] = tx + } + return nil +} + +func (b *benchmarkTxSend) request(peer *peer, index int) error { + enc, _ := rlp.EncodeToBytes(types.Transactions{b.txs[index]}) + return peer.SendTxs(0, 0, enc) +} + +// benchmarkTxStatus implements requestBenchmark +type benchmarkTxStatus struct{} + +func (b *benchmarkTxStatus) init(pm *ProtocolManager, count int) error { + return nil +} + +func (b *benchmarkTxStatus) request(peer *peer, index int) error { + var hash common.Hash + rand.Read(hash[:]) + return peer.RequestTxStatus(0, 0, []common.Hash{hash}) +} + +// benchmarkSetup stores measurement data for a single benchmark type +type benchmarkSetup struct { + req requestBenchmark + totalCount int + totalTime, avgTime time.Duration + maxInSize, maxOutSize uint32 + err error +} + +// runBenchmark runs a benchmark cycle for all benchmark types in the specified +// number of passes +func (pm *ProtocolManager) runBenchmark(benchmarks []requestBenchmark, passCount int, targetTime time.Duration) []*benchmarkSetup { + setup := make([]*benchmarkSetup, len(benchmarks)) + for i, b := range benchmarks { + setup[i] = &benchmarkSetup{req: b} + } + for i := 0; i < passCount; i++ { + log.Info("Running benchmark", "pass", i+1, "total", passCount) + todo := make([]*benchmarkSetup, len(benchmarks)) + copy(todo, setup) + for len(todo) > 0 { + // select a random element + index := rand.Intn(len(todo)) + next := todo[index] + todo[index] = todo[len(todo)-1] + todo = todo[:len(todo)-1] + + if next.err == nil { + // calculate request count + count := 50 + if next.totalTime > 0 { + count = int(uint64(next.totalCount) * uint64(targetTime) / uint64(next.totalTime)) + } + if err := pm.measure(next, count); err != nil { + next.err = err + } + } + } + } + log.Info("Benchmark completed") + + for _, s := range setup { + if s.err == nil { + s.avgTime = s.totalTime / time.Duration(s.totalCount) + } + } + return setup +} + +// meteredPipe implements p2p.MsgReadWriter and remembers the largest single +// message size sent through the pipe +type meteredPipe struct { + rw p2p.MsgReadWriter + maxSize uint32 +} + +func (m *meteredPipe) ReadMsg() (p2p.Msg, error) { + return m.rw.ReadMsg() +} + +func (m *meteredPipe) WriteMsg(msg p2p.Msg) error { + if msg.Size > m.maxSize { + m.maxSize = msg.Size + } + return m.rw.WriteMsg(msg) +} + +// measure runs a benchmark for a single type in a single pass, with the given +// number of requests +func (pm *ProtocolManager) measure(setup *benchmarkSetup, count int) error { + clientPipe, serverPipe := p2p.MsgPipe() + clientMeteredPipe := &meteredPipe{rw: clientPipe} + serverMeteredPipe := &meteredPipe{rw: serverPipe} + var id enode.ID + rand.Read(id[:]) + clientPeer := pm.newPeer(lpv2, NetworkId, p2p.NewPeer(id, "client", nil), clientMeteredPipe) + serverPeer := pm.newPeer(lpv2, NetworkId, p2p.NewPeer(id, "server", nil), serverMeteredPipe) + serverPeer.sendQueue = newExecQueue(count) + serverPeer.announceType = announceTypeNone + serverPeer.fcCosts = make(requestCostTable) + c := &requestCosts{} + for code := range requests { + serverPeer.fcCosts[code] = c + } + serverPeer.fcParams = flowcontrol.ServerParams{BufLimit: 1, MinRecharge: 1} + serverPeer.fcClient = flowcontrol.NewClientNode(pm.server.fcManager, serverPeer.fcParams) + defer serverPeer.fcClient.Disconnect() + + if err := setup.req.init(pm, count); err != nil { + return err + } + + errCh := make(chan error, 10) + start := mclock.Now() + + go func() { + for i := 0; i < count; i++ { + if err := setup.req.request(clientPeer, i); err != nil { + errCh <- err + return + } + } + }() + go func() { + for i := 0; i < count; i++ { + if err := pm.handleMsg(serverPeer); err != nil { + errCh <- err + return + } + } + }() + go func() { + for i := 0; i < count; i++ { + msg, err := clientPipe.ReadMsg() + if err != nil { + errCh <- err + return + } + var i interface{} + msg.Decode(&i) + } + // at this point we can be sure that the other two + // goroutines finished successfully too + close(errCh) + }() + select { + case err := <-errCh: + if err != nil { + return err + } + case <-pm.quitSync: + clientPipe.Close() + serverPipe.Close() + return fmt.Errorf("Benchmark cancelled") + } + + setup.totalTime += time.Duration(mclock.Now() - start) + setup.totalCount += count + setup.maxInSize = clientMeteredPipe.maxSize + setup.maxOutSize = serverMeteredPipe.maxSize + clientPipe.Close() + serverPipe.Close() + return nil +} diff --git a/les/checkpointoracle.go b/les/checkpointoracle.go new file mode 100644 index 000000000000..4695fbc16ced --- /dev/null +++ b/les/checkpointoracle.go @@ -0,0 +1,158 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "encoding/binary" + "sync/atomic" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +// checkpointOracle is responsible for offering the latest stable checkpoint +// generated and announced by the contract admins on-chain. The checkpoint is +// verified by clients locally during the checkpoint syncing. +type checkpointOracle struct { + config *params.CheckpointOracleConfig + contract *checkpointoracle.CheckpointOracle + + // Whether the contract backend is set. + running int32 + + getLocal func(uint64) params.TrustedCheckpoint // Function used to retrieve local checkpoint + syncDoneHook func() // Function used to notify that light syncing has completed. +} + +// newCheckpointOracle returns a checkpoint registrar handler. +func newCheckpointOracle(config *params.CheckpointOracleConfig, getLocal func(uint64) params.TrustedCheckpoint) *checkpointOracle { + if config == nil { + log.Info("Checkpoint registrar is not enabled") + return nil + } + if config.Address == (common.Address{}) || uint64(len(config.Signers)) < config.Threshold { + log.Warn("Invalid checkpoint registrar config") + return nil + } + log.Info("Configured checkpoint registrar", "address", config.Address, "signers", len(config.Signers), "threshold", config.Threshold) + + return &checkpointOracle{ + config: config, + getLocal: getLocal, + } +} + +// start binds the registrar contract and start listening to the +// newCheckpointEvent for the server side. +func (reg *checkpointOracle) start(backend bind.ContractBackend) { + contract, err := checkpointoracle.NewCheckpointOracle(reg.config.Address, backend) + if err != nil { + log.Error("Oracle contract binding failed", "err", err) + return + } + if !atomic.CompareAndSwapInt32(®.running, 0, 1) { + log.Error("Already bound and listening to registrar") + return + } + reg.contract = contract +} + +// isRunning returns an indicator whether the registrar is running. +func (reg *checkpointOracle) isRunning() bool { + return atomic.LoadInt32(®.running) == 1 +} + +// stableCheckpoint returns the stable checkpoint which was generated by local +// indexers and announced by trusted signers. +func (reg *checkpointOracle) stableCheckpoint() (*params.TrustedCheckpoint, uint64) { + // Retrieve the latest checkpoint from the contract, abort if empty + latest, hash, height, err := reg.contract.Contract().GetLatestCheckpoint(nil) + if err != nil || (latest == 0 && hash == [32]byte{}) { + return nil, 0 + } + local := reg.getLocal(latest) + + // The following scenarios may occur: + // + // * local node is out of sync so that it doesn't have the + // checkpoint which registered in the contract. + // * local checkpoint doesn't match with the registered one. + // + // In both cases, server won't send the **stable** checkpoint + // to the client(no worry, client can use hardcoded one instead). + if local.HashEqual(common.Hash(hash)) { + return &local, height.Uint64() + } + return nil, 0 +} + +// verifySigners recovers the signer addresses according to the signature and +// checks whether there are enough approvals to finalize the checkpoint. +func (reg *checkpointOracle) verifySigners(index uint64, hash [32]byte, signatures [][]byte) (bool, []common.Address) { + // Short circuit if the given signatures doesn't reach the threshold. + if len(signatures) < int(reg.config.Threshold) { + return false, nil + } + var ( + signers []common.Address + checked = make(map[common.Address]struct{}) + ) + for i := 0; i < len(signatures); i++ { + if len(signatures[i]) != 65 { + continue + } + // EIP 191 style signatures + // + // Arguments when calculating hash to validate + // 1: byte(0x19) - the initial 0x19 byte + // 2: byte(0) - the version byte (data with intended validator) + // 3: this - the validator address + // -- Application specific data + // 4 : checkpoint section_index (uint64) + // 5 : checkpoint hash (bytes32) + // hash = keccak256(checkpoint_index, section_head, cht_root, bloom_root) + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, index) + data := append([]byte{0x19, 0x00}, append(reg.config.Address.Bytes(), append(buf, hash[:]...)...)...) + signatures[i][64] -= 27 // Transform V from 27/28 to 0/1 according to the yellow paper for verification. + pubkey, err := crypto.Ecrecover(crypto.Keccak256(data), signatures[i]) + if err != nil { + return false, nil + } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) + if _, exist := checked[signer]; exist { + continue + } + for _, s := range reg.config.Signers { + if s == signer { + signers = append(signers, signer) + checked[signer] = struct{}{} + } + } + } + threshold := reg.config.Threshold + if uint64(len(signers)) < threshold { + log.Warn("Not enough signers to approve checkpoint", "signers", len(signers), "threshold", threshold) + return false, nil + } + return true, signers +} diff --git a/les/commons.go b/les/commons.go index 21fb25714afc..7eaf39c843a0 100644 --- a/les/commons.go +++ b/les/commons.go @@ -64,7 +64,7 @@ func (c *lesCommons) makeProtocols(versions []uint) []p2p.Protocol { return c.protocolManager.runPeer(version, p, rw) }, PeerInfo: func(id enode.ID) interface{} { - if p := c.protocolManager.peers.Peer(fmt.Sprintf("%x", id[:8])); p != nil { + if p := c.protocolManager.peers.Peer(fmt.Sprintf("%x", id.Bytes())); p != nil { return p.Info() } return nil @@ -76,36 +76,6 @@ func (c *lesCommons) makeProtocols(versions []uint) []p2p.Protocol { // nodeInfo retrieves some protocol metadata about the running host node. func (c *lesCommons) nodeInfo() interface{} { - var cht params.TrustedCheckpoint - sections, _, _ := c.chtIndexer.Sections() - sections2, _, _ := c.bloomTrieIndexer.Sections() - - if !c.protocolManager.lightSync { - // convert to client section size if running in server mode - sections /= c.iConfig.PairChtSize / c.iConfig.ChtSize - } - - if sections2 < sections { - sections = sections2 - } - if sections > 0 { - sectionIndex := sections - 1 - sectionHead := c.bloomTrieIndexer.SectionHead(sectionIndex) - var chtRoot common.Hash - if c.protocolManager.lightSync { - chtRoot = light.GetChtRoot(c.chainDb, sectionIndex, sectionHead) - } else { - idxV2 := (sectionIndex+1)*c.iConfig.PairChtSize/c.iConfig.ChtSize - 1 - chtRoot = light.GetChtRoot(c.chainDb, idxV2, sectionHead) - } - cht = params.TrustedCheckpoint{ - SectionIndex: sectionIndex, - SectionHead: sectionHead, - CHTRoot: chtRoot, - BloomRoot: light.GetBloomTrieRoot(c.chainDb, sectionIndex, sectionHead), - } - } - chain := c.protocolManager.blockchain head := chain.CurrentHeader() hash := head.Hash() @@ -115,6 +85,38 @@ func (c *lesCommons) nodeInfo() interface{} { Genesis: chain.Genesis().Hash(), Config: chain.Config(), Head: chain.CurrentHeader().Hash(), - CHT: cht, + CHT: c.latestLocalCheckpoint(), + } +} + +// latestLocalCheckpoint finds the common stored section index and returns a set of +// post-processed trie roots (CHT and BloomTrie) associated with +// the appropriate section index and head hash as a local checkpoint package. +func (c *lesCommons) latestLocalCheckpoint() params.TrustedCheckpoint { + sections, _, _ := c.chtIndexer.Sections() + sections2, _, _ := c.bloomTrieIndexer.Sections() + // Cap the section index if the two sections are not consistent. + if sections > sections2 { + sections = sections2 + } + if sections == 0 { + // No checkpoint information can be provided. + return params.TrustedCheckpoint{} + } + return c.getLocalCheckpoint(sections - 1) +} + +// getLocalCheckpoint returns a set of post-processed trie roots (CHT and BloomTrie) +// associated with the appropriate head hash by specific section index. +// +// The returned checkpoint is only the checkpoint generated by the local indexers, +// not the stable checkpoint registered in the registrar contract. +func (c *lesCommons) getLocalCheckpoint(index uint64) params.TrustedCheckpoint { + sectionHead := c.chtIndexer.SectionHead(index) + return params.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: sectionHead, + CHTRoot: light.GetChtRoot(c.chainDb, index, sectionHead), + BloomRoot: light.GetBloomTrieRoot(c.chainDb, index, sectionHead), } } diff --git a/les/costtracker.go b/les/costtracker.go new file mode 100644 index 000000000000..d1bb172e407e --- /dev/null +++ b/les/costtracker.go @@ -0,0 +1,474 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "encoding/binary" + "math" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/log" +) + +const makeCostStats = false // make request cost statistics during operation + +var ( + // average request cost estimates based on serving time + reqAvgTimeCost = requestCostTable{ + GetBlockHeadersMsg: {150000, 30000}, + GetBlockBodiesMsg: {0, 700000}, + GetReceiptsMsg: {0, 1000000}, + GetCodeMsg: {0, 450000}, + GetProofsV2Msg: {0, 600000}, + GetHelperTrieProofsMsg: {0, 1000000}, + SendTxV2Msg: {0, 450000}, + GetTxStatusMsg: {0, 250000}, + } + // maximum incoming message size estimates + reqMaxInSize = requestCostTable{ + GetBlockHeadersMsg: {40, 0}, + GetBlockBodiesMsg: {0, 40}, + GetReceiptsMsg: {0, 40}, + GetCodeMsg: {0, 80}, + GetProofsV2Msg: {0, 80}, + GetHelperTrieProofsMsg: {0, 20}, + SendTxV2Msg: {0, 16500}, + GetTxStatusMsg: {0, 50}, + } + // maximum outgoing message size estimates + reqMaxOutSize = requestCostTable{ + GetBlockHeadersMsg: {0, 556}, + GetBlockBodiesMsg: {0, 100000}, + GetReceiptsMsg: {0, 200000}, + GetCodeMsg: {0, 50000}, + GetProofsV2Msg: {0, 4000}, + GetHelperTrieProofsMsg: {0, 4000}, + SendTxV2Msg: {0, 100}, + GetTxStatusMsg: {0, 100}, + } + // request amounts that have to fit into the minimum buffer size minBufferMultiplier times + minBufferReqAmount = map[uint64]uint64{ + GetBlockHeadersMsg: 192, + GetBlockBodiesMsg: 1, + GetReceiptsMsg: 1, + GetCodeMsg: 1, + GetProofsV2Msg: 1, + GetHelperTrieProofsMsg: 16, + SendTxV2Msg: 8, + GetTxStatusMsg: 64, + } + minBufferMultiplier = 3 +) + +const ( + maxCostFactor = 2 // ratio of maximum and average cost estimates + gfUsageThreshold = 0.5 + gfUsageTC = time.Second + gfRaiseTC = time.Second * 200 + gfDropTC = time.Second * 50 + gfDbKey = "_globalCostFactorV3" +) + +// costTracker is responsible for calculating costs and cost estimates on the +// server side. It continuously updates the global cost factor which is defined +// as the number of cost units per nanosecond of serving time in a single thread. +// It is based on statistics collected during serving requests in high-load periods +// and practically acts as a one-dimension request price scaling factor over the +// pre-defined cost estimate table. +// +// The reason for dynamically maintaining the global factor on the server side is: +// the estimated time cost of the request is fixed(hardcoded) but the configuration +// of the machine running the server is really different. Therefore, the request serving +// time in different machine will vary greatly. And also, the request serving time +// in same machine may vary greatly with different request pressure. +// +// In order to more effectively limit resources, we apply the global factor to serving +// time to make the result as close as possible to the estimated time cost no matter +// the server is slow or fast. And also we scale the totalRecharge with global factor +// so that fast server can serve more requests than estimation and slow server can +// reduce request pressure. +// +// Instead of scaling the cost values, the real value of cost units is changed by +// applying the factor to the serving times. This is more convenient because the +// changes in the cost factor can be applied immediately without always notifying +// the clients about the changed cost tables. +type costTracker struct { + db ethdb.Database + stopCh chan chan struct{} + + inSizeFactor float64 + outSizeFactor float64 + factor float64 + utilTarget float64 + minBufLimit uint64 + + gfLock sync.RWMutex + reqInfoCh chan reqInfo + totalRechargeCh chan uint64 + + stats map[uint64][]uint64 // Used for testing purpose. +} + +// newCostTracker creates a cost tracker and loads the cost factor statistics from the database. +// It also returns the minimum capacity that can be assigned to any peer. +func newCostTracker(db ethdb.Database, config *eth.Config) (*costTracker, uint64) { + utilTarget := float64(config.LightServ) * flowcontrol.FixedPointMultiplier / 100 + ct := &costTracker{ + db: db, + stopCh: make(chan chan struct{}), + reqInfoCh: make(chan reqInfo, 100), + utilTarget: utilTarget, + } + if config.LightIngress > 0 { + ct.inSizeFactor = utilTarget / float64(config.LightIngress) + } + if config.LightEgress > 0 { + ct.outSizeFactor = utilTarget / float64(config.LightEgress) + } + if makeCostStats { + ct.stats = make(map[uint64][]uint64) + for code := range reqAvgTimeCost { + ct.stats[code] = make([]uint64, 10) + } + } + ct.gfLoop() + costList := ct.makeCostList(ct.globalFactor() * 1.25) + for _, c := range costList { + amount := minBufferReqAmount[c.MsgCode] + cost := c.BaseCost + amount*c.ReqCost + if cost > ct.minBufLimit { + ct.minBufLimit = cost + } + } + ct.minBufLimit *= uint64(minBufferMultiplier) + return ct, (ct.minBufLimit-1)/bufLimitRatio + 1 +} + +// stop stops the cost tracker and saves the cost factor statistics to the database +func (ct *costTracker) stop() { + stopCh := make(chan struct{}) + ct.stopCh <- stopCh + <-stopCh + if makeCostStats { + ct.printStats() + } +} + +// makeCostList returns upper cost estimates based on the hardcoded cost estimate +// tables and the optionally specified incoming/outgoing bandwidth limits +func (ct *costTracker) makeCostList(globalFactor float64) RequestCostList { + maxCost := func(avgTimeCost, inSize, outSize uint64) uint64 { + cost := avgTimeCost * maxCostFactor + inSizeCost := uint64(float64(inSize) * ct.inSizeFactor * globalFactor) + if inSizeCost > cost { + cost = inSizeCost + } + outSizeCost := uint64(float64(outSize) * ct.outSizeFactor * globalFactor) + if outSizeCost > cost { + cost = outSizeCost + } + return cost + } + var list RequestCostList + for code, data := range reqAvgTimeCost { + baseCost := maxCost(data.baseCost, reqMaxInSize[code].baseCost, reqMaxOutSize[code].baseCost) + reqCost := maxCost(data.reqCost, reqMaxInSize[code].reqCost, reqMaxOutSize[code].reqCost) + if ct.minBufLimit != 0 { + // if minBufLimit is set then always enforce maximum request cost <= minBufLimit + maxCost := baseCost + reqCost*minBufferReqAmount[code] + if maxCost > ct.minBufLimit { + mul := 0.999 * float64(ct.minBufLimit) / float64(maxCost) + baseCost = uint64(float64(baseCost) * mul) + reqCost = uint64(float64(reqCost) * mul) + } + } + + list = append(list, requestCostListItem{ + MsgCode: code, + BaseCost: baseCost, + ReqCost: reqCost, + }) + } + return list +} + +// reqInfo contains the estimated time cost and the actual request serving time +// which acts as a feed source to update factor maintained by costTracker. +type reqInfo struct { + // avgTimeCost is the estimated time cost corresponding to maxCostTable. + avgTimeCost float64 + + // servingTime is the CPU time corresponding to the actual processing of + // the request. + servingTime float64 +} + +// gfLoop starts an event loop which updates the global cost factor which is +// calculated as a weighted average of the average estimate / serving time ratio. +// The applied weight equals the serving time if gfUsage is over a threshold, +// zero otherwise. gfUsage is the recent average serving time per time unit in +// an exponential moving window. This ensures that statistics are collected only +// under high-load circumstances where the measured serving times are relevant. +// The total recharge parameter of the flow control system which controls the +// total allowed serving time per second but nominated in cost units, should +// also be scaled with the cost factor and is also updated by this loop. +func (ct *costTracker) gfLoop() { + var ( + factor, totalRecharge float64 + gfLog, recentTime, recentAvg float64 + + lastUpdate, expUpdate = mclock.Now(), mclock.Now() + ) + + // Load historical cost factor statistics from the database. + data, _ := ct.db.Get([]byte(gfDbKey)) + if len(data) == 8 { + gfLog = math.Float64frombits(binary.BigEndian.Uint64(data[:])) + } + ct.factor = math.Exp(gfLog) + factor, totalRecharge = ct.factor, ct.utilTarget*ct.factor + + // In order to perform factor data statistics under the high request pressure, + // we only adjust factor when recent factor usage beyond the threshold. + threshold := gfUsageThreshold * float64(gfUsageTC) * ct.utilTarget / flowcontrol.FixedPointMultiplier + + go func() { + saveCostFactor := func() { + var data [8]byte + binary.BigEndian.PutUint64(data[:], math.Float64bits(gfLog)) + ct.db.Put([]byte(gfDbKey), data[:]) + log.Debug("global cost factor saved", "value", factor) + } + saveTicker := time.NewTicker(time.Minute * 10) + + for { + select { + case r := <-ct.reqInfoCh: + requestServedMeter.Mark(int64(r.servingTime)) + requestEstimatedMeter.Mark(int64(r.avgTimeCost / factor)) + requestServedTimer.Update(time.Duration(r.servingTime)) + relativeCostHistogram.Update(int64(r.avgTimeCost / factor / r.servingTime)) + + now := mclock.Now() + dt := float64(now - expUpdate) + expUpdate = now + exp := math.Exp(-dt / float64(gfUsageTC)) + + // calculate factor correction until now, based on previous values + var gfCorr float64 + max := recentTime + if recentAvg > max { + max = recentAvg + } + // we apply continuous correction when MAX(recentTime, recentAvg) > threshold + if max > threshold { + // calculate correction time between last expUpdate and now + if max*exp >= threshold { + gfCorr = dt + } else { + gfCorr = math.Log(max/threshold) * float64(gfUsageTC) + } + // calculate log(factor) correction with the right direction and time constant + if recentTime > recentAvg { + // drop factor if actual serving times are larger than average estimates + gfCorr /= -float64(gfDropTC) + } else { + // raise factor if actual serving times are smaller than average estimates + gfCorr /= float64(gfRaiseTC) + } + } + // update recent cost values with current request + recentTime = recentTime*exp + r.servingTime + recentAvg = recentAvg*exp + r.avgTimeCost/factor + + if gfCorr != 0 { + // Apply the correction to factor + gfLog += gfCorr + factor = math.Exp(gfLog) + // Notify outside modules the new factor and totalRecharge. + if time.Duration(now-lastUpdate) > time.Second { + totalRecharge, lastUpdate = ct.utilTarget*factor, now + ct.gfLock.Lock() + ct.factor = factor + ch := ct.totalRechargeCh + ct.gfLock.Unlock() + if ch != nil { + select { + case ct.totalRechargeCh <- uint64(totalRecharge): + default: + } + } + log.Debug("global cost factor updated", "factor", factor) + } + } + recentServedGauge.Update(int64(recentTime)) + recentEstimatedGauge.Update(int64(recentAvg)) + totalRechargeGauge.Update(int64(totalRecharge)) + + case <-saveTicker.C: + saveCostFactor() + + case stopCh := <-ct.stopCh: + saveCostFactor() + close(stopCh) + return + } + } + }() +} + +// globalFactor returns the current value of the global cost factor +func (ct *costTracker) globalFactor() float64 { + ct.gfLock.RLock() + defer ct.gfLock.RUnlock() + + return ct.factor +} + +// totalRecharge returns the current total recharge parameter which is used by +// flowcontrol.ClientManager and is scaled by the global cost factor +func (ct *costTracker) totalRecharge() uint64 { + ct.gfLock.RLock() + defer ct.gfLock.RUnlock() + + return uint64(ct.factor * ct.utilTarget) +} + +// subscribeTotalRecharge returns all future updates to the total recharge value +// through a channel and also returns the current value +func (ct *costTracker) subscribeTotalRecharge(ch chan uint64) uint64 { + ct.gfLock.Lock() + defer ct.gfLock.Unlock() + + ct.totalRechargeCh = ch + return uint64(ct.factor * ct.utilTarget) +} + +// updateStats updates the global cost factor and (if enabled) the real cost vs. +// average estimate statistics +func (ct *costTracker) updateStats(code, amount, servingTime, realCost uint64) { + avg := reqAvgTimeCost[code] + avgTimeCost := avg.baseCost + amount*avg.reqCost + select { + case ct.reqInfoCh <- reqInfo{float64(avgTimeCost), float64(servingTime)}: + default: + } + if makeCostStats { + realCost <<= 4 + l := 0 + for l < 9 && realCost > avgTimeCost { + l++ + realCost >>= 1 + } + atomic.AddUint64(&ct.stats[code][l], 1) + } +} + +// realCost calculates the final cost of a request based on actual serving time, +// incoming and outgoing message size +// +// Note: message size is only taken into account if bandwidth limitation is applied +// and the cost based on either message size is greater than the cost based on +// serving time. A maximum of the three costs is applied instead of their sum +// because the three limited resources (serving thread time and i/o bandwidth) can +// also be maxed out simultaneously. +func (ct *costTracker) realCost(servingTime uint64, inSize, outSize uint32) uint64 { + cost := float64(servingTime) + inSizeCost := float64(inSize) * ct.inSizeFactor + if inSizeCost > cost { + cost = inSizeCost + } + outSizeCost := float64(outSize) * ct.outSizeFactor + if outSizeCost > cost { + cost = outSizeCost + } + return uint64(cost * ct.globalFactor()) +} + +// printStats prints the distribution of real request cost relative to the average estimates +func (ct *costTracker) printStats() { + if ct.stats == nil { + return + } + for code, arr := range ct.stats { + log.Info("Request cost statistics", "code", code, "1/16", arr[0], "1/8", arr[1], "1/4", arr[2], "1/2", arr[3], "1", arr[4], "2", arr[5], "4", arr[6], "8", arr[7], "16", arr[8], ">16", arr[9]) + } +} + +type ( + // requestCostTable assigns a cost estimate function to each request type + // which is a linear function of the requested amount + // (cost = baseCost + reqCost * amount) + requestCostTable map[uint64]*requestCosts + requestCosts struct { + baseCost, reqCost uint64 + } + + // RequestCostList is a list representation of request costs which is used for + // database storage and communication through the network + RequestCostList []requestCostListItem + requestCostListItem struct { + MsgCode, BaseCost, ReqCost uint64 + } +) + +// getMaxCost calculates the estimated cost for a given request type and amount +func (table requestCostTable) getMaxCost(code, amount uint64) uint64 { + costs := table[code] + return costs.baseCost + amount*costs.reqCost +} + +// decode converts a cost list to a cost table +func (list RequestCostList) decode(protocolLength uint64) requestCostTable { + table := make(requestCostTable) + for _, e := range list { + if e.MsgCode < protocolLength { + table[e.MsgCode] = &requestCosts{ + baseCost: e.BaseCost, + reqCost: e.ReqCost, + } + } + } + return table +} + +// testCostList returns a dummy request cost list used by tests +func testCostList(testCost uint64) RequestCostList { + cl := make(RequestCostList, len(reqAvgTimeCost)) + var max uint64 + for code := range reqAvgTimeCost { + if code > max { + max = code + } + } + i := 0 + for code := uint64(0); code <= max; code++ { + if _, ok := reqAvgTimeCost[code]; ok { + cl[i].MsgCode = code + cl[i].BaseCost = testCost + cl[i].ReqCost = 0 + i++ + } + } + return cl +} diff --git a/les/distributor.go b/les/distributor.go index f90765b624b4..9235adc03fd0 100644 --- a/les/distributor.go +++ b/les/distributor.go @@ -14,20 +14,21 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package les import ( "container/list" "sync" "time" + + "github.com/ethereum/go-ethereum/common/mclock" ) // requestDistributor implements a mechanism that distributes requests to // suitable peers, obeying flow control rules and prioritizing them in creation // order (even when a resend is necessary). type requestDistributor struct { + clock mclock.Clock reqQueue *list.List lastReqOrder uint64 peers map[distPeer]struct{} @@ -61,14 +62,16 @@ type distReq struct { canSend func(distPeer) bool request func(distPeer) func() - reqOrder uint64 - sentChn chan distPeer - element *list.Element + reqOrder uint64 + sentChn chan distPeer + element *list.Element + waitForPeers mclock.AbsTime } // newRequestDistributor creates a new request distributor -func newRequestDistributor(peers *peerSet, stopChn chan struct{}) *requestDistributor { +func newRequestDistributor(peers *peerSet, stopChn chan struct{}, clock mclock.Clock) *requestDistributor { d := &requestDistributor{ + clock: clock, reqQueue: list.New(), loopChn: make(chan struct{}, 2), stopChn: stopChn, @@ -104,7 +107,11 @@ func (d *requestDistributor) registerTestPeer(p distPeer) { // distMaxWait is the maximum waiting time after which further necessary waiting // times are recalculated based on new feedback from the servers -const distMaxWait = time.Millisecond * 10 +const distMaxWait = time.Millisecond * 50 + +// waitForPeers is the time window in which a request does not fail even if it +// has no suitable peers to send to at the moment +const waitForPeers = time.Second * 3 // main event loop func (d *requestDistributor) loop() { @@ -148,7 +155,7 @@ func (d *requestDistributor) loop() { wait = distMaxWait } go func() { - time.Sleep(wait) + d.clock.Sleep(wait) d.loopChn <- struct{}{} }() break loop @@ -177,8 +184,6 @@ func (d *requestDistributor) nextRequest() (distPeer, *distReq, time.Duration) { checkedPeers := make(map[distPeer]struct{}) elem := d.reqQueue.Front() var ( - bestPeer distPeer - bestReq *distReq bestWait time.Duration sel *weightedRandomSelect ) @@ -186,9 +191,18 @@ func (d *requestDistributor) nextRequest() (distPeer, *distReq, time.Duration) { d.peerLock.RLock() defer d.peerLock.RUnlock() - for (len(d.peers) > 0 || elem == d.reqQueue.Front()) && elem != nil { + peerCount := len(d.peers) + for (len(checkedPeers) < peerCount || elem == d.reqQueue.Front()) && elem != nil { req := elem.Value.(*distReq) canSend := false + now := d.clock.Now() + if req.waitForPeers > now { + canSend = true + wait := time.Duration(req.waitForPeers - now) + if bestWait == 0 || wait < bestWait { + bestWait = wait + } + } for peer := range d.peers { if _, ok := checkedPeers[peer]; !ok && peer.canQueue() && req.canSend(peer) { canSend = true @@ -200,9 +214,7 @@ func (d *requestDistributor) nextRequest() (distPeer, *distReq, time.Duration) { } sel.update(selectPeerItem{peer: peer, req: req, weight: int64(bufRemain*1000000) + 1}) } else { - if bestReq == nil || wait < bestWait { - bestPeer = peer - bestReq = req + if bestWait == 0 || wait < bestWait { bestWait = wait } } @@ -221,7 +233,7 @@ func (d *requestDistributor) nextRequest() (distPeer, *distReq, time.Duration) { c := sel.choose().(selectPeerItem) return c.peer, c.req, 0 } - return bestPeer, bestReq, bestWait + return nil, nil, bestWait } // queue adds a request to the distribution queue, returns a channel where the @@ -235,6 +247,7 @@ func (d *requestDistributor) queue(r *distReq) chan distPeer { if r.reqOrder == 0 { d.lastReqOrder++ r.reqOrder = d.lastReqOrder + r.waitForPeers = d.clock.Now() + mclock.AbsTime(waitForPeers) } back := d.reqQueue.Back() diff --git a/les/distributor_test.go b/les/distributor_test.go index 2891bcab4980..d2247212cd85 100644 --- a/les/distributor_test.go +++ b/les/distributor_test.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package les import ( @@ -23,6 +21,8 @@ import ( "sync" "testing" "time" + + "github.com/ethereum/go-ethereum/common/mclock" ) type testDistReq struct { @@ -87,7 +87,7 @@ const ( testDistBufLimit = 10000000 testDistMaxCost = 1000000 testDistPeerCount = 5 - testDistReqCount = 50000 + testDistReqCount = 5000 testDistMaxResendCount = 3 ) @@ -121,7 +121,7 @@ func testRequestDistributor(t *testing.T, resend bool) { stop := make(chan struct{}) defer close(stop) - dist := newRequestDistributor(nil, stop) + dist := newRequestDistributor(nil, stop, &mclock.System{}) var peers [testDistPeerCount]*testDistPeer for i := range peers { peers[i] = &testDistPeer{} diff --git a/les/execqueue.go b/les/execqueue.go index 614721bf0dd8..e0c88a990f07 100644 --- a/les/execqueue.go +++ b/les/execqueue.go @@ -44,7 +44,7 @@ func (q *execQueue) loop() { func (q *execQueue) waitNext(drop bool) (f func()) { q.mu.Lock() - if drop { + if drop && len(q.funcs) > 0 { // Remove the function that just executed. We do this here instead of when // dequeuing so len(q.funcs) includes the function that is running. q.funcs = append(q.funcs[:0], q.funcs[1:]...) @@ -84,6 +84,13 @@ func (q *execQueue) queue(f func()) bool { return ok } +// clear drops all queued functions +func (q *execQueue) clear() { + q.mu.Lock() + q.funcs = q.funcs[:0] + q.mu.Unlock() +} + // quit stops the exec queue. // quit waits for the current execution to finish before returning. func (q *execQueue) quit() { diff --git a/les/fetcher.go b/les/fetcher.go index f0d3b188dbbd..76e4f076a744 100644 --- a/les/fetcher.go +++ b/les/fetcher.go @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( @@ -43,7 +42,7 @@ const ( type lightFetcher struct { pm *ProtocolManager odr *LesOdr - chain *light.LightChain + chain lightChain lock sync.Mutex // lock protects access to the fetcher's internal state variables except sent requests maxConfirmedTd *big.Int @@ -52,11 +51,20 @@ type lightFetcher struct { syncing bool syncDone chan *peer - reqMu sync.RWMutex // reqMu protects access to sent header fetch requests - requested map[uint64]fetchRequest - deliverChn chan fetchResponse - timeoutChn chan uint64 - requestChn chan bool // true if initiated from outside + reqMu sync.RWMutex // reqMu protects access to sent header fetch requests + requested map[uint64]fetchRequest + deliverChn chan fetchResponse + timeoutChn chan uint64 + requestTriggered bool + requestTrigger chan struct{} + lastTrustedHeader *types.Header +} + +// lightChain extends the BlockChain interface by locking. +type lightChain interface { + BlockChain + LockChain() + UnlockChain() } // fetcherPeerInfo holds fetcher-specific information about each active peer @@ -115,7 +123,7 @@ func newLightFetcher(pm *ProtocolManager) *lightFetcher { deliverChn: make(chan fetchResponse, 100), requested: make(map[uint64]fetchRequest), timeoutChn: make(chan uint64), - requestChn: make(chan bool, 100), + requestTrigger: make(chan struct{}, 1), syncDone: make(chan *peer), maxConfirmedTd: big.NewInt(0), } @@ -128,48 +136,47 @@ func newLightFetcher(pm *ProtocolManager) *lightFetcher { // syncLoop is the main event loop of the light fetcher func (f *lightFetcher) syncLoop() { - requesting := false defer f.pm.wg.Done() for { select { case <-f.pm.quitSync: return - // when a new announce is received, request loop keeps running until - // no further requests are necessary or possible - case newAnnounce := <-f.requestChn: + // request loop keeps running until no further requests are necessary or possible + case <-f.requestTrigger: f.lock.Lock() - s := requesting - requesting = false var ( - rq *distReq - reqID uint64 + rq *distReq + reqID uint64 + syncing bool ) - if !f.syncing && !(newAnnounce && s) { - rq, reqID = f.nextRequest() + if !f.syncing { + rq, reqID, syncing = f.nextRequest() } - syncing := f.syncing + f.requestTriggered = rq != nil f.lock.Unlock() if rq != nil { - requesting = true - _, ok := <-f.pm.reqDist.queue(rq) - if !ok { - f.requestChn <- false - } - - if !syncing { - go func() { - time.Sleep(softRequestTimeout) - f.reqMu.Lock() - req, ok := f.requested[reqID] - if ok { - req.timeout = true - f.requested[reqID] = req - } - f.reqMu.Unlock() - // keep starting new requests while possible - f.requestChn <- false - }() + if _, ok := <-f.pm.reqDist.queue(rq); ok { + if syncing { + f.lock.Lock() + f.syncing = true + f.lock.Unlock() + } else { + go func() { + time.Sleep(softRequestTimeout) + f.reqMu.Lock() + req, ok := f.requested[reqID] + if ok { + req.timeout = true + f.requested[reqID] = req + } + f.reqMu.Unlock() + // keep starting new requests while possible + f.requestTrigger <- struct{}{} + }() + } + } else { + f.requestTrigger <- struct{}{} } } case reqID := <-f.timeoutChn: @@ -209,6 +216,7 @@ func (f *lightFetcher) syncLoop() { f.checkSyncedHeaders(p) f.syncing = false f.lock.Unlock() + f.requestTrigger <- struct{}{} // f.requestTriggered is always true here } } } @@ -223,7 +231,6 @@ func (f *lightFetcher) registerPeer(p *peer) { f.lock.Lock() defer f.lock.Unlock() - f.peers[p] = &fetcherPeerInfo{nodeByHash: make(map[common.Hash]*fetcherTreeNode)} } @@ -276,8 +283,10 @@ func (f *lightFetcher) announce(p *peer, head *announceData) { fp.nodeCnt = 0 fp.nodeByHash = make(map[common.Hash]*fetcherTreeNode) } + // check if the node count is too high to add new nodes, discard oldest ones if necessary if n != nil { - // check if the node count is too high to add new nodes, discard oldest ones if necessary + // n is now the reorg common ancestor, add a new branch of nodes + // check if the node count is too high to add new nodes locked := false for uint64(fp.nodeCnt)+head.Number-n.number > maxNodeCount && fp.root != nil { if !locked { @@ -321,6 +330,7 @@ func (f *lightFetcher) announce(p *peer, head *announceData) { fp.nodeByHash[n.hash] = n } } + if n == nil { // could not find reorg common ancestor or had to delete entire tree, a new root and a resync is needed if fp.root != nil { @@ -340,7 +350,10 @@ func (f *lightFetcher) announce(p *peer, head *announceData) { fp.lastAnnounced = n p.lock.Unlock() f.checkUpdateStats(p, nil) - f.requestChn <- true + if !f.requestTriggered { + f.requestTriggered = true + f.requestTrigger <- struct{}{} + } } // peerHasBlock returns true if we can assume the peer knows the given block @@ -405,102 +418,149 @@ func (f *lightFetcher) requestedID(reqID uint64) bool { // nextRequest selects the peer and announced head to be requested next, amount // to be downloaded starting from the head backwards is also returned -func (f *lightFetcher) nextRequest() (*distReq, uint64) { +func (f *lightFetcher) nextRequest() (*distReq, uint64, bool) { var ( - bestHash common.Hash - bestAmount uint64 + bestHash common.Hash + bestAmount uint64 + bestTd *big.Int + bestSyncing bool ) - bestTd := f.maxConfirmedTd - bestSyncing := false + bestHash, bestAmount, bestTd, bestSyncing = f.findBestRequest() + + if bestTd == f.maxConfirmedTd { + return nil, 0, false + } + + var rq *distReq + reqID := genReqID() + if bestSyncing { + rq = f.newFetcherDistReqForSync(bestHash) + } else { + rq = f.newFetcherDistReq(bestHash, reqID, bestAmount) + } + return rq, reqID, bestSyncing +} + +// findBestRequest finds the best head to request that has been announced by but not yet requested from a known peer. +// It also returns the announced Td (which should be verified after fetching the head), +// the necessary amount to request and whether a downloader sync is necessary instead of a normal header request. +func (f *lightFetcher) findBestRequest() (bestHash common.Hash, bestAmount uint64, bestTd *big.Int, bestSyncing bool) { + bestTd = f.maxConfirmedTd + bestSyncing = false for p, fp := range f.peers { for hash, n := range fp.nodeByHash { - if !f.checkKnownNode(p, n) && !n.requested && (bestTd == nil || n.td.Cmp(bestTd) >= 0) { - amount := f.requestAmount(p, n) - if bestTd == nil || n.td.Cmp(bestTd) > 0 || amount < bestAmount { - bestHash = hash - bestAmount = amount - bestTd = n.td - bestSyncing = fp.bestConfirmed == nil || fp.root == nil || !f.checkKnownNode(p, fp.root) - } + if f.checkKnownNode(p, n) || n.requested { + continue + } + + //if ulc mode is disabled, isTrustedHash returns true + amount := f.requestAmount(p, n) + if (bestTd == nil || n.td.Cmp(bestTd) > 0 || amount < bestAmount) && (f.isTrustedHash(hash) || f.maxConfirmedTd.Int64() == 0) { + bestHash = hash + bestTd = n.td + bestAmount = amount + bestSyncing = fp.bestConfirmed == nil || fp.root == nil || !f.checkKnownNode(p, fp.root) } } } - if bestTd == f.maxConfirmedTd { - return nil, 0 + return +} + +// isTrustedHash checks if the block can be trusted by the minimum trusted fraction. +func (f *lightFetcher) isTrustedHash(hash common.Hash) bool { + // If ultra light cliet mode is disabled, trust all hashes + if f.pm.ulc == nil { + return true + } + // Ultra light enabled, only trust after enough confirmations + var agreed int + for peer, info := range f.peers { + if peer.trusted && info.nodeByHash[hash] != nil { + agreed++ + } } + return 100*agreed/len(f.pm.ulc.keys) >= f.pm.ulc.fraction +} - f.syncing = bestSyncing +func (f *lightFetcher) newFetcherDistReqForSync(bestHash common.Hash) *distReq { + return &distReq{ + getCost: func(dp distPeer) uint64 { + return 0 + }, + canSend: func(dp distPeer) bool { + p := dp.(*peer) + f.lock.Lock() + defer f.lock.Unlock() - var rq *distReq - reqID := genReqID() - if f.syncing { - rq = &distReq{ - getCost: func(dp distPeer) uint64 { - return 0 - }, - canSend: func(dp distPeer) bool { - p := dp.(*peer) - f.lock.Lock() - defer f.lock.Unlock() - - fp := f.peers[p] - return fp != nil && fp.nodeByHash[bestHash] != nil - }, - request: func(dp distPeer) func() { - go func() { - p := dp.(*peer) - p.Log().Debug("Synchronisation started") - f.pm.synchronise(p) - f.syncDone <- p - }() - return nil - }, - } - } else { - rq = &distReq{ - getCost: func(dp distPeer) uint64 { - p := dp.(*peer) - return p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount)) - }, - canSend: func(dp distPeer) bool { + if p.onlyAnnounce { + return false + } + fp := f.peers[p] + return fp != nil && fp.nodeByHash[bestHash] != nil + }, + request: func(dp distPeer) func() { + if f.pm.ulc != nil { + // Keep last trusted header before sync + f.setLastTrustedHeader(f.chain.CurrentHeader()) + } + go func() { p := dp.(*peer) - f.lock.Lock() - defer f.lock.Unlock() + p.Log().Debug("Synchronisation started") + f.pm.synchronise(p) + f.syncDone <- p + }() + return nil + }, + } +} - fp := f.peers[p] - if fp == nil { - return false - } +// newFetcherDistReq creates a new request for the distributor. +func (f *lightFetcher) newFetcherDistReq(bestHash common.Hash, reqID uint64, bestAmount uint64) *distReq { + return &distReq{ + getCost: func(dp distPeer) uint64 { + p := dp.(*peer) + return p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount)) + }, + canSend: func(dp distPeer) bool { + p := dp.(*peer) + f.lock.Lock() + defer f.lock.Unlock() + + if p.onlyAnnounce { + return false + } + fp := f.peers[p] + if fp == nil { + return false + } + n := fp.nodeByHash[bestHash] + return n != nil && !n.requested + }, + request: func(dp distPeer) func() { + p := dp.(*peer) + f.lock.Lock() + fp := f.peers[p] + if fp != nil { n := fp.nodeByHash[bestHash] - return n != nil && !n.requested - }, - request: func(dp distPeer) func() { - p := dp.(*peer) - f.lock.Lock() - fp := f.peers[p] - if fp != nil { - n := fp.nodeByHash[bestHash] - if n != nil { - n.requested = true - } + if n != nil { + n.requested = true } - f.lock.Unlock() - - cost := p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount)) - p.fcServer.QueueRequest(reqID, cost) - f.reqMu.Lock() - f.requested[reqID] = fetchRequest{hash: bestHash, amount: bestAmount, peer: p, sent: mclock.Now()} - f.reqMu.Unlock() - go func() { - time.Sleep(hardRequestTimeout) - f.timeoutChn <- reqID - }() - return func() { p.RequestHeadersByHash(reqID, cost, bestHash, int(bestAmount), 0, true) } - }, - } + } + f.lock.Unlock() + + cost := p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount)) + p.fcServer.QueuedRequest(reqID, cost) + f.reqMu.Lock() + f.requested[reqID] = fetchRequest{hash: bestHash, amount: bestAmount, peer: p, sent: mclock.Now()} + f.reqMu.Unlock() + go func() { + time.Sleep(hardRequestTimeout) + f.timeoutChn <- reqID + }() + return func() { p.RequestHeadersByHash(reqID, cost, bestHash, int(bestAmount), 0, true) } + }, } - return rq, reqID } // deliverHeaders delivers header download request responses for processing @@ -518,6 +578,7 @@ func (f *lightFetcher) processResponse(req fetchRequest, resp fetchResponse) boo for i, header := range resp.headers { headers[int(req.amount)-1-i] = header } + if _, err := f.chain.InsertHeaderChain(headers, 1); err != nil { if err == consensus.ErrFutureBlock { return true @@ -542,6 +603,7 @@ func (f *lightFetcher) processResponse(req fetchRequest, resp fetchResponse) boo // downloaded and validated batch or headers func (f *lightFetcher) newHeaders(headers []*types.Header, tds []*big.Int) { var maxTd *big.Int + for p, fp := range f.peers { if !f.checkAnnouncedHeaders(fp, headers, tds) { p.Log().Debug("Inconsistent announcement") @@ -551,6 +613,7 @@ func (f *lightFetcher) newHeaders(headers []*types.Header, tds []*big.Int) { maxTd = fp.confirmedTd } } + if maxTd != nil { f.updateMaxConfirmedTd(maxTd) } @@ -638,22 +701,66 @@ func (f *lightFetcher) checkSyncedHeaders(p *peer) { p.Log().Debug("Unknown peer to check sync headers") return } - n := fp.lastAnnounced - var td *big.Int - for n != nil { - if td = f.chain.GetTd(n.hash, n.number); td != nil { + var ( + node = fp.lastAnnounced + td *big.Int + ) + if f.pm.ulc != nil { + // Roll back untrusted blocks + h, unapproved := f.lastTrustedTreeNode(p) + f.chain.Rollback(unapproved) + node = fp.nodeByHash[h.Hash()] + } + // Find last valid block + for node != nil { + if td = f.chain.GetTd(node.hash, node.number); td != nil { break } - n = n.parent + node = node.parent } - // now n is the latest downloaded header after syncing - if n == nil { + // Now node is the latest downloaded/approved header after syncing + if node == nil { p.Log().Debug("Synchronisation failed") go f.pm.removePeer(p.id) - } else { - header := f.chain.GetHeader(n.hash, n.number) - f.newHeaders([]*types.Header{header}, []*big.Int{td}) + return } + header := f.chain.GetHeader(node.hash, node.number) + f.newHeaders([]*types.Header{header}, []*big.Int{td}) +} + +// lastTrustedTreeNode return last approved treeNode and a list of unapproved hashes +func (f *lightFetcher) lastTrustedTreeNode(p *peer) (*types.Header, []common.Hash) { + unapprovedHashes := make([]common.Hash, 0) + current := f.chain.CurrentHeader() + + if f.lastTrustedHeader == nil { + return current, unapprovedHashes + } + + canonical := f.chain.CurrentHeader() + if canonical.Number.Uint64() > f.lastTrustedHeader.Number.Uint64() { + canonical = f.chain.GetHeaderByNumber(f.lastTrustedHeader.Number.Uint64()) + } + commonAncestor := rawdb.FindCommonAncestor(f.pm.chainDb, canonical, f.lastTrustedHeader) + if commonAncestor == nil { + log.Error("Common ancestor of last trusted header and canonical header is nil", "canonical hash", canonical.Hash(), "trusted hash", f.lastTrustedHeader.Hash()) + return current, unapprovedHashes + } + + for current.Hash() == commonAncestor.Hash() { + if f.isTrustedHash(current.Hash()) { + break + } + unapprovedHashes = append(unapprovedHashes, current.Hash()) + current = f.chain.GetHeader(current.ParentHash, current.Number.Uint64()-1) + } + return current, unapprovedHashes +} + +func (f *lightFetcher) setLastTrustedHeader(h *types.Header) { + f.lock.Lock() + defer f.lock.Unlock() + f.lastTrustedHeader = h } // checkKnownNode checks if a block tree node is known (downloaded and validated) @@ -745,6 +852,7 @@ func (f *lightFetcher) updateMaxConfirmedTd(td *big.Int) { if f.lastUpdateStats != nil { f.lastUpdateStats.next = newEntry } + f.lastUpdateStats = newEntry for p := range f.peers { f.checkUpdateStats(p, newEntry) @@ -767,6 +875,7 @@ func (f *lightFetcher) checkUpdateStats(p *peer, newEntry *updateStatsEntry) { p.Log().Debug("Unknown peer to check update stats") return } + if newEntry != nil && fp.firstUpdateStats == nil { fp.firstUpdateStats = newEntry } diff --git a/les/fetcher_test.go b/les/fetcher_test.go new file mode 100644 index 000000000000..c6faabd66d88 --- /dev/null +++ b/les/fetcher_test.go @@ -0,0 +1,168 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "math/big" + "testing" + + "net" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +func TestFetcherULCPeerSelector(t *testing.T) { + id1 := newNodeID(t).ID() + id2 := newNodeID(t).ID() + id3 := newNodeID(t).ID() + id4 := newNodeID(t).ID() + + ftn1 := &fetcherTreeNode{ + hash: common.HexToHash("1"), + td: big.NewInt(1), + } + ftn2 := &fetcherTreeNode{ + hash: common.HexToHash("2"), + td: big.NewInt(2), + parent: ftn1, + } + ftn3 := &fetcherTreeNode{ + hash: common.HexToHash("3"), + td: big.NewInt(3), + parent: ftn2, + } + lf := lightFetcher{ + pm: &ProtocolManager{ + ulc: &ulc{ + keys: map[string]bool{ + id1.String(): true, + id2.String(): true, + id3.String(): true, + id4.String(): true, + }, + fraction: 70, + }, + }, + maxConfirmedTd: ftn1.td, + + peers: map[*peer]*fetcherPeerInfo{ + { + id: "peer1", + Peer: p2p.NewPeer(id1, "peer1", []p2p.Cap{}), + trusted: true, + }: { + nodeByHash: map[common.Hash]*fetcherTreeNode{ + ftn1.hash: ftn1, + ftn2.hash: ftn2, + }, + }, + { + Peer: p2p.NewPeer(id2, "peer2", []p2p.Cap{}), + id: "peer2", + trusted: true, + }: { + nodeByHash: map[common.Hash]*fetcherTreeNode{ + ftn1.hash: ftn1, + ftn2.hash: ftn2, + }, + }, + { + id: "peer3", + Peer: p2p.NewPeer(id3, "peer3", []p2p.Cap{}), + trusted: true, + }: { + nodeByHash: map[common.Hash]*fetcherTreeNode{ + ftn1.hash: ftn1, + ftn2.hash: ftn2, + ftn3.hash: ftn3, + }, + }, + { + id: "peer4", + Peer: p2p.NewPeer(id4, "peer4", []p2p.Cap{}), + trusted: true, + }: { + nodeByHash: map[common.Hash]*fetcherTreeNode{ + ftn1.hash: ftn1, + }, + }, + }, + chain: &lightChainStub{ + tds: map[common.Hash]*big.Int{}, + headers: map[common.Hash]*types.Header{ + ftn1.hash: {}, + ftn2.hash: {}, + ftn3.hash: {}, + }, + }, + } + bestHash, bestAmount, bestTD, sync := lf.findBestRequest() + + if bestTD == nil { + t.Fatal("Empty result") + } + + if bestTD.Cmp(ftn2.td) != 0 { + t.Fatal("bad td", bestTD) + } + if bestHash != ftn2.hash { + t.Fatal("bad hash", bestTD) + } + + _, _ = bestAmount, sync +} + +type lightChainStub struct { + BlockChain + tds map[common.Hash]*big.Int + headers map[common.Hash]*types.Header + insertHeaderChainAssertFunc func(chain []*types.Header, checkFreq int) (int, error) +} + +func (l *lightChainStub) GetHeader(hash common.Hash, number uint64) *types.Header { + if h, ok := l.headers[hash]; ok { + return h + } + + return nil +} + +func (l *lightChainStub) LockChain() {} +func (l *lightChainStub) UnlockChain() {} + +func (l *lightChainStub) GetTd(hash common.Hash, number uint64) *big.Int { + if td, ok := l.tds[hash]; ok { + return td + } + return nil +} + +func (l *lightChainStub) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) { + return l.insertHeaderChainAssertFunc(chain, checkFreq) +} + +func newNodeID(t *testing.T) *enode.Node { + key, err := crypto.GenerateKey() + if err != nil { + t.Fatal("generate key err:", err) + } + return enode.NewV4(&key.PublicKey, net.IP{}, 35000, 35000) +} diff --git a/les/flowcontrol/control.go b/les/flowcontrol/control.go index d50eb809cc97..490013677c63 100644 --- a/les/flowcontrol/control.go +++ b/les/flowcontrol/control.go @@ -18,167 +18,412 @@ package flowcontrol import ( + "fmt" "sync" "time" "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/log" ) -const fcTimeConst = time.Millisecond +const ( + // fcTimeConst is the time constant applied for MinRecharge during linear + // buffer recharge period + fcTimeConst = time.Millisecond + // DecParamDelay is applied at server side when decreasing capacity in order to + // avoid a buffer underrun error due to requests sent by the client before + // receiving the capacity update announcement + DecParamDelay = time.Second * 2 + // keepLogs is the duration of keeping logs; logging is not used if zero + keepLogs = 0 +) +// ServerParams are the flow control parameters specified by a server for a client +// +// Note: a server can assign different amounts of capacity to each client by giving +// different parameters to them. type ServerParams struct { BufLimit, MinRecharge uint64 } +// scheduledUpdate represents a delayed flow control parameter update +type scheduledUpdate struct { + time mclock.AbsTime + params ServerParams +} + +// ClientNode is the flow control system's representation of a client +// (used in server mode only) type ClientNode struct { - params *ServerParams - bufValue uint64 - lastTime mclock.AbsTime - lock sync.Mutex - cm *ClientManager - cmNode *cmNode + params ServerParams + bufValue int64 + lastTime mclock.AbsTime + updateSchedule []scheduledUpdate + sumCost uint64 // sum of req costs received from this client + accepted map[uint64]uint64 // value = sumCost after accepting the given req + connected bool + lock sync.Mutex + cm *ClientManager + log *logger + cmNodeFields } -func NewClientNode(cm *ClientManager, params *ServerParams) *ClientNode { +// NewClientNode returns a new ClientNode +func NewClientNode(cm *ClientManager, params ServerParams) *ClientNode { node := &ClientNode{ - cm: cm, - params: params, - bufValue: params.BufLimit, - lastTime: mclock.Now(), + cm: cm, + params: params, + bufValue: int64(params.BufLimit), + lastTime: cm.clock.Now(), + accepted: make(map[uint64]uint64), + connected: true, + } + if keepLogs > 0 { + node.log = newLogger(keepLogs) } - node.cmNode = cm.addNode(node) + cm.connect(node) return node } -func (peer *ClientNode) Remove(cm *ClientManager) { - cm.removeNode(peer.cmNode) +// Disconnect should be called when a client is disconnected +func (node *ClientNode) Disconnect() { + node.lock.Lock() + defer node.lock.Unlock() + + node.connected = false + node.cm.disconnect(node) +} + +// BufferStatus returns the current buffer value and limit +func (node *ClientNode) BufferStatus() (uint64, uint64) { + node.lock.Lock() + defer node.lock.Unlock() + + if !node.connected { + return 0, 0 + } + now := node.cm.clock.Now() + node.update(now) + node.cm.updateBuffer(node, 0, now) + bv := node.bufValue + if bv < 0 { + bv = 0 + } + return uint64(bv), node.params.BufLimit +} + +// OneTimeCost subtracts the given amount from the node's buffer. +// +// Note: this call can take the buffer into the negative region internally. +// In this case zero buffer value is returned by exported calls and no requests +// are accepted. +func (node *ClientNode) OneTimeCost(cost uint64) { + node.lock.Lock() + defer node.lock.Unlock() + + now := node.cm.clock.Now() + node.update(now) + node.bufValue -= int64(cost) + node.cm.updateBuffer(node, -int64(cost), now) +} + +// Freeze notifies the client manager about a client freeze event in which case +// the total capacity allowance is slightly reduced. +func (node *ClientNode) Freeze() { + node.lock.Lock() + frozenCap := node.params.MinRecharge + node.lock.Unlock() + node.cm.reduceTotalCapacity(frozenCap) } -func (peer *ClientNode) recalcBV(time mclock.AbsTime) { - dt := uint64(time - peer.lastTime) - if time < peer.lastTime { +// update recalculates the buffer value at a specified time while also performing +// scheduled flow control parameter updates if necessary +func (node *ClientNode) update(now mclock.AbsTime) { + for len(node.updateSchedule) > 0 && node.updateSchedule[0].time <= now { + node.recalcBV(node.updateSchedule[0].time) + node.updateParams(node.updateSchedule[0].params, now) + node.updateSchedule = node.updateSchedule[1:] + } + node.recalcBV(now) +} + +// recalcBV recalculates the buffer value at a specified time +func (node *ClientNode) recalcBV(now mclock.AbsTime) { + dt := uint64(now - node.lastTime) + if now < node.lastTime { dt = 0 } - peer.bufValue += peer.params.MinRecharge * dt / uint64(fcTimeConst) - if peer.bufValue > peer.params.BufLimit { - peer.bufValue = peer.params.BufLimit + node.bufValue += int64(node.params.MinRecharge * dt / uint64(fcTimeConst)) + if node.bufValue > int64(node.params.BufLimit) { + node.bufValue = int64(node.params.BufLimit) } - peer.lastTime = time + if node.log != nil { + node.log.add(now, fmt.Sprintf("updated bv=%d MRR=%d BufLimit=%d", node.bufValue, node.params.MinRecharge, node.params.BufLimit)) + } + node.lastTime = now } -func (peer *ClientNode) AcceptRequest() (uint64, bool) { - peer.lock.Lock() - defer peer.lock.Unlock() +// UpdateParams updates the flow control parameters of a client node +func (node *ClientNode) UpdateParams(params ServerParams) { + node.lock.Lock() + defer node.lock.Unlock() - time := mclock.Now() - peer.recalcBV(time) - return peer.bufValue, peer.cm.accept(peer.cmNode, time) + now := node.cm.clock.Now() + node.update(now) + if params.MinRecharge >= node.params.MinRecharge { + node.updateSchedule = nil + node.updateParams(params, now) + } else { + for i, s := range node.updateSchedule { + if params.MinRecharge >= s.params.MinRecharge { + s.params = params + node.updateSchedule = node.updateSchedule[:i+1] + return + } + } + node.updateSchedule = append(node.updateSchedule, scheduledUpdate{time: now + mclock.AbsTime(DecParamDelay), params: params}) + } +} + +// updateParams updates the flow control parameters of the node +func (node *ClientNode) updateParams(params ServerParams, now mclock.AbsTime) { + diff := int64(params.BufLimit - node.params.BufLimit) + if diff > 0 { + node.bufValue += diff + } else if node.bufValue > int64(params.BufLimit) { + node.bufValue = int64(params.BufLimit) + } + node.cm.updateParams(node, params, now) } -func (peer *ClientNode) RequestProcessed(cost uint64) (bv, realCost uint64) { - peer.lock.Lock() - defer peer.lock.Unlock() +// AcceptRequest returns whether a new request can be accepted and the missing +// buffer amount if it was rejected due to a buffer underrun. If accepted, maxCost +// is deducted from the flow control buffer. +func (node *ClientNode) AcceptRequest(reqID, index, maxCost uint64) (accepted bool, bufShort uint64, priority int64) { + node.lock.Lock() + defer node.lock.Unlock() - time := mclock.Now() - peer.recalcBV(time) - peer.bufValue -= cost - peer.recalcBV(time) - rcValue, rcost := peer.cm.processed(peer.cmNode, time) - if rcValue < peer.params.BufLimit { - bv := peer.params.BufLimit - rcValue - if bv > peer.bufValue { - peer.bufValue = bv + now := node.cm.clock.Now() + node.update(now) + if int64(maxCost) > node.bufValue { + if node.log != nil { + node.log.add(now, fmt.Sprintf("rejected reqID=%d bv=%d maxCost=%d", reqID, node.bufValue, maxCost)) + node.log.dump(now) } + return false, maxCost - uint64(node.bufValue), 0 } - return peer.bufValue, rcost + node.bufValue -= int64(maxCost) + node.sumCost += maxCost + if node.log != nil { + node.log.add(now, fmt.Sprintf("accepted reqID=%d bv=%d maxCost=%d sumCost=%d", reqID, node.bufValue, maxCost, node.sumCost)) + } + node.accepted[index] = node.sumCost + return true, 0, node.cm.accepted(node, maxCost, now) +} + +// RequestProcessed should be called when the request has been processed +func (node *ClientNode) RequestProcessed(reqID, index, maxCost, realCost uint64) uint64 { + node.lock.Lock() + defer node.lock.Unlock() + + now := node.cm.clock.Now() + node.update(now) + node.cm.processed(node, maxCost, realCost, now) + bv := node.bufValue + int64(node.sumCost-node.accepted[index]) + if node.log != nil { + node.log.add(now, fmt.Sprintf("processed reqID=%d bv=%d maxCost=%d realCost=%d sumCost=%d oldSumCost=%d reportedBV=%d", reqID, node.bufValue, maxCost, realCost, node.sumCost, node.accepted[index], bv)) + } + delete(node.accepted, index) + if bv < 0 { + return 0 + } + return uint64(bv) } +// ServerNode is the flow control system's representation of a server +// (used in client mode only) type ServerNode struct { + clock mclock.Clock bufEstimate uint64 + bufRecharge bool lastTime mclock.AbsTime - params *ServerParams + params ServerParams sumCost uint64 // sum of req costs sent to this server pending map[uint64]uint64 // value = sumCost after sending the given req + log *logger lock sync.RWMutex } -func NewServerNode(params *ServerParams) *ServerNode { - return &ServerNode{ +// NewServerNode returns a new ServerNode +func NewServerNode(params ServerParams, clock mclock.Clock) *ServerNode { + node := &ServerNode{ + clock: clock, bufEstimate: params.BufLimit, - lastTime: mclock.Now(), + bufRecharge: false, + lastTime: clock.Now(), params: params, pending: make(map[uint64]uint64), } + if keepLogs > 0 { + node.log = newLogger(keepLogs) + } + return node } -func (peer *ServerNode) recalcBLE(time mclock.AbsTime) { - dt := uint64(time - peer.lastTime) - if time < peer.lastTime { - dt = 0 - } - peer.bufEstimate += peer.params.MinRecharge * dt / uint64(fcTimeConst) - if peer.bufEstimate > peer.params.BufLimit { - peer.bufEstimate = peer.params.BufLimit +// UpdateParams updates the flow control parameters of the node +func (node *ServerNode) UpdateParams(params ServerParams) { + node.lock.Lock() + defer node.lock.Unlock() + + node.recalcBLE(mclock.Now()) + if params.BufLimit > node.params.BufLimit { + node.bufEstimate += params.BufLimit - node.params.BufLimit + } else { + if node.bufEstimate > params.BufLimit { + node.bufEstimate = params.BufLimit + } } - peer.lastTime = time + node.params = params } -// safetyMargin is added to the flow control waiting time when estimated buffer value is low -const safetyMargin = time.Millisecond - -func (peer *ServerNode) canSend(maxCost uint64) (time.Duration, float64) { - peer.recalcBLE(mclock.Now()) - maxCost += uint64(safetyMargin) * peer.params.MinRecharge / uint64(fcTimeConst) - if maxCost > peer.params.BufLimit { - maxCost = peer.params.BufLimit +// recalcBLE recalculates the lowest estimate for the client's buffer value at +// the given server at the specified time +func (node *ServerNode) recalcBLE(now mclock.AbsTime) { + if now < node.lastTime { + return } - if peer.bufEstimate >= maxCost { - return 0, float64(peer.bufEstimate-maxCost) / float64(peer.params.BufLimit) + if node.bufRecharge { + dt := uint64(now - node.lastTime) + node.bufEstimate += node.params.MinRecharge * dt / uint64(fcTimeConst) + if node.bufEstimate >= node.params.BufLimit { + node.bufEstimate = node.params.BufLimit + node.bufRecharge = false + } + } + node.lastTime = now + if node.log != nil { + node.log.add(now, fmt.Sprintf("updated bufEst=%d MRR=%d BufLimit=%d", node.bufEstimate, node.params.MinRecharge, node.params.BufLimit)) } - return time.Duration((maxCost - peer.bufEstimate) * uint64(fcTimeConst) / peer.params.MinRecharge), 0 } +// safetyMargin is added to the flow control waiting time when estimated buffer value is low +const safetyMargin = time.Millisecond + // CanSend returns the minimum waiting time required before sending a request // with the given maximum estimated cost. Second return value is the relative // estimated buffer level after sending the request (divided by BufLimit). -func (peer *ServerNode) CanSend(maxCost uint64) (time.Duration, float64) { - peer.lock.RLock() - defer peer.lock.RUnlock() +func (node *ServerNode) CanSend(maxCost uint64) (time.Duration, float64) { + node.lock.RLock() + defer node.lock.RUnlock() - return peer.canSend(maxCost) + now := node.clock.Now() + node.recalcBLE(now) + maxCost += uint64(safetyMargin) * node.params.MinRecharge / uint64(fcTimeConst) + if maxCost > node.params.BufLimit { + maxCost = node.params.BufLimit + } + if node.bufEstimate >= maxCost { + relBuf := float64(node.bufEstimate-maxCost) / float64(node.params.BufLimit) + if node.log != nil { + node.log.add(now, fmt.Sprintf("canSend bufEst=%d maxCost=%d true relBuf=%f", node.bufEstimate, maxCost, relBuf)) + } + return 0, relBuf + } + timeLeft := time.Duration((maxCost - node.bufEstimate) * uint64(fcTimeConst) / node.params.MinRecharge) + if node.log != nil { + node.log.add(now, fmt.Sprintf("canSend bufEst=%d maxCost=%d false timeLeft=%v", node.bufEstimate, maxCost, timeLeft)) + } + return timeLeft, 0 } -// QueueRequest should be called when the request has been assigned to the given +// QueuedRequest should be called when the request has been assigned to the given // server node, before putting it in the send queue. It is mandatory that requests -// are sent in the same order as the QueueRequest calls are made. -func (peer *ServerNode) QueueRequest(reqID, maxCost uint64) { - peer.lock.Lock() - defer peer.lock.Unlock() +// are sent in the same order as the QueuedRequest calls are made. +func (node *ServerNode) QueuedRequest(reqID, maxCost uint64) { + node.lock.Lock() + defer node.lock.Unlock() - peer.bufEstimate -= maxCost - peer.sumCost += maxCost - peer.pending[reqID] = peer.sumCost + now := node.clock.Now() + node.recalcBLE(now) + // Note: we do not know when requests actually arrive to the server so bufRecharge + // is not turned on here if buffer was full; in this case it is going to be turned + // on by the first reply's bufValue feedback + if node.bufEstimate >= maxCost { + node.bufEstimate -= maxCost + } else { + log.Error("Queued request with insufficient buffer estimate") + node.bufEstimate = 0 + } + node.sumCost += maxCost + node.pending[reqID] = node.sumCost + if node.log != nil { + node.log.add(now, fmt.Sprintf("queued reqID=%d bufEst=%d maxCost=%d sumCost=%d", reqID, node.bufEstimate, maxCost, node.sumCost)) + } } -// GotReply adjusts estimated buffer value according to the value included in +// ReceivedReply adjusts estimated buffer value according to the value included in // the latest request reply. -func (peer *ServerNode) GotReply(reqID, bv uint64) { +func (node *ServerNode) ReceivedReply(reqID, bv uint64) { + node.lock.Lock() + defer node.lock.Unlock() - peer.lock.Lock() - defer peer.lock.Unlock() - - if bv > peer.params.BufLimit { - bv = peer.params.BufLimit + now := node.clock.Now() + node.recalcBLE(now) + if bv > node.params.BufLimit { + bv = node.params.BufLimit } - sc, ok := peer.pending[reqID] + sc, ok := node.pending[reqID] if !ok { return } - delete(peer.pending, reqID) - cc := peer.sumCost - sc - peer.bufEstimate = 0 + delete(node.pending, reqID) + cc := node.sumCost - sc + newEstimate := uint64(0) if bv > cc { - peer.bufEstimate = bv - cc + newEstimate = bv - cc + } + if newEstimate > node.bufEstimate { + // Note: we never reduce the buffer estimate based on the reported value because + // this can only happen because of the delayed delivery of the latest reply. + // The lowest estimate based on the previous reply can still be considered valid. + node.bufEstimate = newEstimate + } + + node.bufRecharge = node.bufEstimate < node.params.BufLimit + node.lastTime = now + if node.log != nil { + node.log.add(now, fmt.Sprintf("received reqID=%d bufEst=%d reportedBv=%d sumCost=%d oldSumCost=%d", reqID, node.bufEstimate, bv, node.sumCost, sc)) + } +} + +// ResumeFreeze cleans all pending requests and sets the buffer estimate to the +// reported value after resuming from a frozen state +func (node *ServerNode) ResumeFreeze(bv uint64) { + node.lock.Lock() + defer node.lock.Unlock() + + for reqID := range node.pending { + delete(node.pending, reqID) + } + now := node.clock.Now() + node.recalcBLE(now) + if bv > node.params.BufLimit { + bv = node.params.BufLimit + } + node.bufEstimate = bv + node.bufRecharge = node.bufEstimate < node.params.BufLimit + node.lastTime = now + if node.log != nil { + node.log.add(now, fmt.Sprintf("unfreeze bv=%d sumCost=%d", bv, node.sumCost)) + } +} + +// DumpLogs dumps the event log if logging is used +func (node *ServerNode) DumpLogs() { + node.lock.Lock() + defer node.lock.Unlock() + + if node.log != nil { + node.log.dump(node.clock.Now()) } - peer.lastTime = mclock.Now() } diff --git a/les/flowcontrol/logger.go b/les/flowcontrol/logger.go new file mode 100644 index 000000000000..428d7fbf22c9 --- /dev/null +++ b/les/flowcontrol/logger.go @@ -0,0 +1,65 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package flowcontrol + +import ( + "fmt" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +// logger collects events in string format and discards events older than the +// "keep" parameter +type logger struct { + events map[uint64]logEvent + writePtr, delPtr uint64 + keep time.Duration +} + +// logEvent describes a single event +type logEvent struct { + time mclock.AbsTime + event string +} + +// newLogger creates a new logger +func newLogger(keep time.Duration) *logger { + return &logger{ + events: make(map[uint64]logEvent), + keep: keep, + } +} + +// add adds a new event and discards old events if possible +func (l *logger) add(now mclock.AbsTime, event string) { + keepAfter := now - mclock.AbsTime(l.keep) + for l.delPtr < l.writePtr && l.events[l.delPtr].time <= keepAfter { + delete(l.events, l.delPtr) + l.delPtr++ + } + l.events[l.writePtr] = logEvent{now, event} + l.writePtr++ +} + +// dump prints all stored events +func (l *logger) dump(now mclock.AbsTime) { + for i := l.delPtr; i < l.writePtr; i++ { + e := l.events[i] + fmt.Println(time.Duration(e.time-now), e.event) + } +} diff --git a/les/flowcontrol/manager.go b/les/flowcontrol/manager.go index 28cc6f0fe763..d6d0b1adde5a 100644 --- a/les/flowcontrol/manager.go +++ b/les/flowcontrol/manager.go @@ -14,211 +14,449 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package flowcontrol implements a client side flow control mechanism package flowcontrol import ( + "fmt" + "math" "sync" "time" "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/common/prque" ) -const rcConst = 1000000 +// cmNodeFields are ClientNode fields used by the client manager +// Note: these fields are locked by the client manager's mutex +type cmNodeFields struct { + corrBufValue int64 // buffer value adjusted with the extra recharge amount + rcLastIntValue int64 // past recharge integrator value when corrBufValue was last updated + rcFullIntValue int64 // future recharge integrator value when corrBufValue will reach maximum + queueIndex int // position in the recharge queue (-1 if not queued) +} + +// FixedPointMultiplier is applied to the recharge integrator and the recharge curve. +// +// Note: fixed point arithmetic is required for the integrator because it is a +// constantly increasing value that can wrap around int64 limits (which behavior is +// also supported by the priority queue). A floating point value would gradually lose +// precision in this application. +// The recharge curve and all recharge values are encoded as fixed point because +// sumRecharge is frequently updated by adding or subtracting individual recharge +// values and perfect precision is required. +const FixedPointMultiplier = 1000000 + +var ( + capacityDropFactor = 0.1 + capacityRaiseTC = 1 / (3 * float64(time.Hour)) // time constant for raising the capacity factor + capacityRaiseThresholdRatio = 1.125 // total/connected capacity ratio threshold for raising the capacity factor +) -type cmNode struct { - node *ClientNode - lastUpdate mclock.AbsTime - serving, recharging bool - rcWeight uint64 - rcValue, rcDelta, startValue int64 - finishRecharge mclock.AbsTime +// ClientManager controls the capacity assigned to the clients of a server. +// Since ServerParams guarantee a safe lower estimate for processable requests +// even in case of all clients being active, ClientManager calculates a +// corrigated buffer value and usually allows a higher remaining buffer value +// to be returned with each reply. +type ClientManager struct { + clock mclock.Clock + lock sync.Mutex + enabledCh chan struct{} + stop chan chan struct{} + + curve PieceWiseLinear + sumRecharge, totalRecharge, totalConnected uint64 + logTotalCap, totalCapacity float64 + logTotalCapRaiseLimit float64 + minLogTotalCap, maxLogTotalCap float64 + capacityRaiseThreshold uint64 + capLastUpdate mclock.AbsTime + totalCapacityCh chan uint64 + + // recharge integrator is increasing in each moment with a rate of + // (totalRecharge / sumRecharge)*FixedPointMultiplier or 0 if sumRecharge==0 + rcLastUpdate mclock.AbsTime // last time the recharge integrator was updated + rcLastIntValue int64 // last updated value of the recharge integrator + // recharge queue is a priority queue with currently recharging client nodes + // as elements. The priority value is rcFullIntValue which allows to quickly + // determine which client will first finish recharge. + rcQueue *prque.Prque } -func (node *cmNode) update(time mclock.AbsTime) { - dt := int64(time - node.lastUpdate) - node.rcValue += node.rcDelta * dt / rcConst - node.lastUpdate = time - if node.recharging && time >= node.finishRecharge { - node.recharging = false - node.rcDelta = 0 - node.rcValue = 0 +// NewClientManager returns a new client manager. +// Client manager enhances flow control performance by allowing client buffers +// to recharge quicker than the minimum guaranteed recharge rate if possible. +// The sum of all minimum recharge rates (sumRecharge) is updated each time +// a clients starts or finishes buffer recharging. Then an adjusted total +// recharge rate is calculated using a piecewise linear recharge curve: +// +// totalRecharge = curve(sumRecharge) +// (totalRecharge >= sumRecharge is enforced) +// +// Then the "bonus" buffer recharge is distributed between currently recharging +// clients proportionally to their minimum recharge rates. +// +// Note: total recharge is proportional to the average number of parallel running +// serving threads. A recharge value of 1000000 corresponds to one thread in average. +// The maximum number of allowed serving threads should always be considerably +// higher than the targeted average number. +// +// Note 2: although it is possible to specify a curve allowing the total target +// recharge starting from zero sumRecharge, it makes sense to add a linear ramp +// starting from zero in order to not let a single low-priority client use up +// the entire server capacity and thus ensure quick availability for others at +// any moment. +func NewClientManager(curve PieceWiseLinear, clock mclock.Clock) *ClientManager { + cm := &ClientManager{ + clock: clock, + rcQueue: prque.New(func(a interface{}, i int) { a.(*ClientNode).queueIndex = i }), + capLastUpdate: clock.Now(), + stop: make(chan chan struct{}), } + if curve != nil { + cm.SetRechargeCurve(curve) + } + go func() { + // regularly recalculate and update total capacity + for { + select { + case <-time.After(time.Minute): + cm.lock.Lock() + cm.updateTotalCapacity(cm.clock.Now(), true) + cm.lock.Unlock() + case stop := <-cm.stop: + close(stop) + return + } + } + }() + return cm } -func (node *cmNode) set(serving bool, simReqCnt, sumWeight uint64) { - if node.serving && !serving { - node.recharging = true - sumWeight += node.rcWeight - } - node.serving = serving - if node.recharging && serving { - node.recharging = false - sumWeight -= node.rcWeight +// Stop stops the client manager +func (cm *ClientManager) Stop() { + stop := make(chan struct{}) + cm.stop <- stop + <-stop +} + +// SetRechargeCurve updates the recharge curve +func (cm *ClientManager) SetRechargeCurve(curve PieceWiseLinear) { + cm.lock.Lock() + defer cm.lock.Unlock() + + now := cm.clock.Now() + cm.updateRecharge(now) + cm.curve = curve + if len(curve) > 0 { + cm.totalRecharge = curve[len(curve)-1].Y + } else { + cm.totalRecharge = 0 } +} - node.rcDelta = 0 - if serving { - node.rcDelta = int64(rcConst / simReqCnt) +// SetCapacityRaiseThreshold sets a threshold value used for raising capFactor. +// Either if the difference between total allowed and connected capacity is less +// than this threshold or if their ratio is less than capacityRaiseThresholdRatio +// then capFactor is allowed to slowly raise. +func (cm *ClientManager) SetCapacityLimits(min, max, raiseThreshold uint64) { + if min < 1 { + min = 1 } - if node.recharging { - node.rcDelta = -int64(node.node.cm.rcRecharge * node.rcWeight / sumWeight) - node.finishRecharge = node.lastUpdate + mclock.AbsTime(node.rcValue*rcConst/(-node.rcDelta)) + cm.minLogTotalCap = math.Log(float64(min)) + if max < 1 { + max = 1 } + cm.maxLogTotalCap = math.Log(float64(max)) + cm.logTotalCap = cm.maxLogTotalCap + cm.capacityRaiseThreshold = raiseThreshold + cm.refreshCapacity() } -type ClientManager struct { - lock sync.Mutex - nodes map[*cmNode]struct{} - simReqCnt, sumWeight, rcSumValue uint64 - maxSimReq, maxRcSum uint64 - rcRecharge uint64 - resumeQueue chan chan bool - time mclock.AbsTime +// connect should be called when a client is connected, before passing it to any +// other ClientManager function +func (cm *ClientManager) connect(node *ClientNode) { + cm.lock.Lock() + defer cm.lock.Unlock() + + now := cm.clock.Now() + cm.updateRecharge(now) + node.corrBufValue = int64(node.params.BufLimit) + node.rcLastIntValue = cm.rcLastIntValue + node.queueIndex = -1 + cm.updateTotalCapacity(now, true) + cm.totalConnected += node.params.MinRecharge + cm.updateRaiseLimit() } -func NewClientManager(rcTarget, maxSimReq, maxRcSum uint64) *ClientManager { - cm := &ClientManager{ - nodes: make(map[*cmNode]struct{}), - resumeQueue: make(chan chan bool), - rcRecharge: rcConst * rcConst / (100*rcConst/rcTarget - rcConst), - maxSimReq: maxSimReq, - maxRcSum: maxRcSum, - } - go cm.queueProc() - return cm +// disconnect should be called when a client is disconnected +func (cm *ClientManager) disconnect(node *ClientNode) { + cm.lock.Lock() + defer cm.lock.Unlock() + + now := cm.clock.Now() + cm.updateRecharge(cm.clock.Now()) + cm.updateTotalCapacity(now, true) + cm.totalConnected -= node.params.MinRecharge + cm.updateRaiseLimit() } -func (self *ClientManager) Stop() { - self.lock.Lock() - defer self.lock.Unlock() +// accepted is called when a request with given maximum cost is accepted. +// It returns a priority indicator for the request which is used to determine placement +// in the serving queue. Older requests have higher priority by default. If the client +// is almost out of buffer, request priority is reduced. +func (cm *ClientManager) accepted(node *ClientNode, maxCost uint64, now mclock.AbsTime) (priority int64) { + cm.lock.Lock() + defer cm.lock.Unlock() - // signal any waiting accept routines to return false - self.nodes = make(map[*cmNode]struct{}) - close(self.resumeQueue) + cm.updateNodeRc(node, -int64(maxCost), &node.params, now) + rcTime := (node.params.BufLimit - uint64(node.corrBufValue)) * FixedPointMultiplier / node.params.MinRecharge + return -int64(now) - int64(rcTime) } -func (self *ClientManager) addNode(cnode *ClientNode) *cmNode { - time := mclock.Now() - node := &cmNode{ - node: cnode, - lastUpdate: time, - finishRecharge: time, - rcWeight: 1, +// processed updates the client buffer according to actual request cost after +// serving has been finished. +// +// Note: processed should always be called for all accepted requests +func (cm *ClientManager) processed(node *ClientNode, maxCost, realCost uint64, now mclock.AbsTime) { + if realCost > maxCost { + realCost = maxCost } - self.lock.Lock() - defer self.lock.Unlock() + cm.updateBuffer(node, int64(maxCost-realCost), now) +} + +// updateBuffer recalulates the corrected buffer value, adds the given value to it +// and updates the node's actual buffer value if possible +func (cm *ClientManager) updateBuffer(node *ClientNode, add int64, now mclock.AbsTime) { + cm.lock.Lock() + defer cm.lock.Unlock() - self.nodes[node] = struct{}{} - self.update(mclock.Now()) - return node + cm.updateNodeRc(node, add, &node.params, now) + if node.corrBufValue > node.bufValue { + if node.log != nil { + node.log.add(now, fmt.Sprintf("corrected bv=%d oldBv=%d", node.corrBufValue, node.bufValue)) + } + node.bufValue = node.corrBufValue + } } -func (self *ClientManager) removeNode(node *cmNode) { - self.lock.Lock() - defer self.lock.Unlock() +// updateParams updates the flow control parameters of a client node +func (cm *ClientManager) updateParams(node *ClientNode, params ServerParams, now mclock.AbsTime) { + cm.lock.Lock() + defer cm.lock.Unlock() - time := mclock.Now() - self.stop(node, time) - delete(self.nodes, node) - self.update(time) + cm.updateRecharge(now) + cm.updateTotalCapacity(now, true) + cm.totalConnected += params.MinRecharge - node.params.MinRecharge + cm.updateRaiseLimit() + cm.updateNodeRc(node, 0, ¶ms, now) } -// recalc sumWeight -func (self *ClientManager) updateNodes(time mclock.AbsTime) (rce bool) { - var sumWeight, rcSum uint64 - for node := range self.nodes { - rc := node.recharging - node.update(time) - if rc && !node.recharging { - rce = true - } - if node.recharging { - sumWeight += node.rcWeight - } - rcSum += uint64(node.rcValue) +// updateRaiseLimit recalculates the limiting value until which logTotalCap +// can be raised when no client freeze events occur +func (cm *ClientManager) updateRaiseLimit() { + if cm.capacityRaiseThreshold == 0 { + cm.logTotalCapRaiseLimit = 0 + return + } + limit := float64(cm.totalConnected + cm.capacityRaiseThreshold) + limit2 := float64(cm.totalConnected) * capacityRaiseThresholdRatio + if limit2 > limit { + limit = limit2 + } + if limit < 1 { + limit = 1 } - self.sumWeight = sumWeight - self.rcSumValue = rcSum - return + cm.logTotalCapRaiseLimit = math.Log(limit) } -func (self *ClientManager) update(time mclock.AbsTime) { - for { - firstTime := time - for node := range self.nodes { - if node.recharging && node.finishRecharge < firstTime { - firstTime = node.finishRecharge - } +// updateRecharge updates the recharge integrator and checks the recharge queue +// for nodes with recently filled buffers +func (cm *ClientManager) updateRecharge(now mclock.AbsTime) { + lastUpdate := cm.rcLastUpdate + cm.rcLastUpdate = now + // updating is done in multiple steps if node buffers are filled and sumRecharge + // is decreased before the given target time + for cm.sumRecharge > 0 { + sumRecharge := cm.sumRecharge + if sumRecharge > cm.totalRecharge { + sumRecharge = cm.totalRecharge } - if self.updateNodes(firstTime) { - for node := range self.nodes { - if node.recharging { - node.set(node.serving, self.simReqCnt, self.sumWeight) - } - } - } else { - self.time = time + bonusRatio := float64(1) + v := cm.curve.ValueAt(sumRecharge) + s := float64(sumRecharge) + if v > s && s > 0 { + bonusRatio = v / s + } + dt := now - lastUpdate + // fetch the client that finishes first + rcqNode := cm.rcQueue.PopItem().(*ClientNode) // if sumRecharge > 0 then the queue cannot be empty + // check whether it has already finished + dtNext := mclock.AbsTime(float64(rcqNode.rcFullIntValue-cm.rcLastIntValue) / bonusRatio) + if dt < dtNext { + // not finished yet, put it back, update integrator according + // to current bonusRatio and return + cm.rcQueue.Push(rcqNode, -rcqNode.rcFullIntValue) + cm.rcLastIntValue += int64(bonusRatio * float64(dt)) return } + lastUpdate += dtNext + // finished recharging, update corrBufValue and sumRecharge if necessary and do next step + if rcqNode.corrBufValue < int64(rcqNode.params.BufLimit) { + rcqNode.corrBufValue = int64(rcqNode.params.BufLimit) + cm.sumRecharge -= rcqNode.params.MinRecharge + } + cm.rcLastIntValue = rcqNode.rcFullIntValue } } -func (self *ClientManager) canStartReq() bool { - return self.simReqCnt < self.maxSimReq && self.rcSumValue < self.maxRcSum +// updateNodeRc updates a node's corrBufValue and adds an external correction value. +// It also adds or removes the rcQueue entry and updates ServerParams and sumRecharge if necessary. +func (cm *ClientManager) updateNodeRc(node *ClientNode, bvc int64, params *ServerParams, now mclock.AbsTime) { + cm.updateRecharge(now) + wasFull := true + if node.corrBufValue != int64(node.params.BufLimit) { + wasFull = false + node.corrBufValue += (cm.rcLastIntValue - node.rcLastIntValue) * int64(node.params.MinRecharge) / FixedPointMultiplier + if node.corrBufValue > int64(node.params.BufLimit) { + node.corrBufValue = int64(node.params.BufLimit) + } + node.rcLastIntValue = cm.rcLastIntValue + } + node.corrBufValue += bvc + diff := int64(params.BufLimit - node.params.BufLimit) + if diff > 0 { + node.corrBufValue += diff + } + isFull := false + if node.corrBufValue >= int64(params.BufLimit) { + node.corrBufValue = int64(params.BufLimit) + isFull = true + } + if !wasFull { + cm.sumRecharge -= node.params.MinRecharge + } + if params != &node.params { + node.params = *params + } + if !isFull { + cm.sumRecharge += node.params.MinRecharge + if node.queueIndex != -1 { + cm.rcQueue.Remove(node.queueIndex) + } + node.rcLastIntValue = cm.rcLastIntValue + node.rcFullIntValue = cm.rcLastIntValue + (int64(node.params.BufLimit)-node.corrBufValue)*FixedPointMultiplier/int64(node.params.MinRecharge) + cm.rcQueue.Push(node, -node.rcFullIntValue) + } } -func (self *ClientManager) queueProc() { - for rc := range self.resumeQueue { - for { - time.Sleep(time.Millisecond * 10) - self.lock.Lock() - self.update(mclock.Now()) - cs := self.canStartReq() - self.lock.Unlock() - if cs { - break - } - } - close(rc) +// reduceTotalCapacity reduces the total capacity allowance in case of a client freeze event +func (cm *ClientManager) reduceTotalCapacity(frozenCap uint64) { + cm.lock.Lock() + defer cm.lock.Unlock() + + ratio := float64(1) + if frozenCap < cm.totalConnected { + ratio = float64(frozenCap) / float64(cm.totalConnected) } + now := cm.clock.Now() + cm.updateTotalCapacity(now, false) + cm.logTotalCap -= capacityDropFactor * ratio + if cm.logTotalCap < cm.minLogTotalCap { + cm.logTotalCap = cm.minLogTotalCap + } + cm.updateTotalCapacity(now, true) } -func (self *ClientManager) accept(node *cmNode, time mclock.AbsTime) bool { - self.lock.Lock() - defer self.lock.Unlock() +// updateTotalCapacity updates the total capacity factor. The capacity factor allows +// the total capacity of the system to go over the allowed total recharge value +// if clients go to frozen state sufficiently rarely. +// The capacity factor is dropped instantly by a small amount if a clients is frozen. +// It is raised slowly (with a large time constant) if the total connected capacity +// is close to the total allowed amount and no clients are frozen. +func (cm *ClientManager) updateTotalCapacity(now mclock.AbsTime, refresh bool) { + dt := now - cm.capLastUpdate + cm.capLastUpdate = now - self.update(time) - if !self.canStartReq() { - resume := make(chan bool) - self.lock.Unlock() - self.resumeQueue <- resume - <-resume - self.lock.Lock() - if _, ok := self.nodes[node]; !ok { - return false // reject if node has been removed or manager has been stopped + if cm.logTotalCap < cm.logTotalCapRaiseLimit { + cm.logTotalCap += capacityRaiseTC * float64(dt) + if cm.logTotalCap > cm.logTotalCapRaiseLimit { + cm.logTotalCap = cm.logTotalCapRaiseLimit } } - self.simReqCnt++ - node.set(true, self.simReqCnt, self.sumWeight) - node.startValue = node.rcValue - self.update(self.time) - return true + if cm.logTotalCap > cm.maxLogTotalCap { + cm.logTotalCap = cm.maxLogTotalCap + } + if refresh { + cm.refreshCapacity() + } } -func (self *ClientManager) stop(node *cmNode, time mclock.AbsTime) { - if node.serving { - self.update(time) - self.simReqCnt-- - node.set(false, self.simReqCnt, self.sumWeight) - self.update(time) +// refreshCapacity recalculates the total capacity value and sends an update to the subscription +// channel if the relative change of the value since the last update is more than 0.1 percent +func (cm *ClientManager) refreshCapacity() { + totalCapacity := math.Exp(cm.logTotalCap) + if totalCapacity >= cm.totalCapacity*0.999 && totalCapacity <= cm.totalCapacity*1.001 { + return } + cm.totalCapacity = totalCapacity + if cm.totalCapacityCh != nil { + select { + case cm.totalCapacityCh <- uint64(cm.totalCapacity): + default: + } + } +} + +// SubscribeTotalCapacity returns all future updates to the total capacity value +// through a channel and also returns the current value +func (cm *ClientManager) SubscribeTotalCapacity(ch chan uint64) uint64 { + cm.lock.Lock() + defer cm.lock.Unlock() + + cm.totalCapacityCh = ch + return uint64(cm.totalCapacity) } -func (self *ClientManager) processed(node *cmNode, time mclock.AbsTime) (rcValue, rcCost uint64) { - self.lock.Lock() - defer self.lock.Unlock() +// PieceWiseLinear is used to describe recharge curves +type PieceWiseLinear []struct{ X, Y uint64 } - self.stop(node, time) - return uint64(node.rcValue), uint64(node.rcValue - node.startValue) +// ValueAt returns the curve's value at a given point +func (pwl PieceWiseLinear) ValueAt(x uint64) float64 { + l := 0 + h := len(pwl) + if h == 0 { + return 0 + } + for h != l { + m := (l + h) / 2 + if x > pwl[m].X { + l = m + 1 + } else { + h = m + } + } + if l == 0 { + return float64(pwl[0].Y) + } + l-- + if h == len(pwl) { + return float64(pwl[l].Y) + } + dx := pwl[h].X - pwl[l].X + if dx < 1 { + return float64(pwl[l].Y) + } + return float64(pwl[l].Y) + float64(pwl[h].Y-pwl[l].Y)*float64(x-pwl[l].X)/float64(dx) +} + +// Valid returns true if the X coordinates of the curve points are non-strictly monotonic +func (pwl PieceWiseLinear) Valid() bool { + var lastX uint64 + for _, i := range pwl { + if i.X < lastX { + return false + } + lastX = i.X + } + return true } diff --git a/les/flowcontrol/manager_test.go b/les/flowcontrol/manager_test.go new file mode 100644 index 000000000000..9d2f88763614 --- /dev/null +++ b/les/flowcontrol/manager_test.go @@ -0,0 +1,125 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package flowcontrol + +import ( + "math/rand" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +type testNode struct { + node *ClientNode + bufLimit, capacity uint64 + waitUntil mclock.AbsTime + index, totalCost uint64 +} + +const ( + testMaxCost = 1000000 + testLength = 100000 +) + +// testConstantTotalCapacity simulates multiple request sender nodes and verifies +// whether the total amount of served requests matches the expected value based on +// the total capacity and the duration of the test. +// Some nodes are sending requests occasionally so that their buffer should regularly +// reach the maximum while other nodes (the "max capacity nodes") are sending at the +// maximum permitted rate. The max capacity nodes are changed multiple times during +// a single test. +func TestConstantTotalCapacity(t *testing.T) { + testConstantTotalCapacity(t, 10, 1, 0) + testConstantTotalCapacity(t, 10, 1, 1) + testConstantTotalCapacity(t, 30, 1, 0) + testConstantTotalCapacity(t, 30, 2, 3) + testConstantTotalCapacity(t, 100, 1, 0) + testConstantTotalCapacity(t, 100, 3, 5) + testConstantTotalCapacity(t, 100, 5, 10) +} + +func testConstantTotalCapacity(t *testing.T, nodeCount, maxCapacityNodes, randomSend int) { + clock := &mclock.Simulated{} + nodes := make([]*testNode, nodeCount) + var totalCapacity uint64 + for i := range nodes { + nodes[i] = &testNode{capacity: uint64(50000 + rand.Intn(100000))} + totalCapacity += nodes[i].capacity + } + m := NewClientManager(PieceWiseLinear{{0, totalCapacity}}, clock) + for _, n := range nodes { + n.bufLimit = n.capacity * 6000 + n.node = NewClientNode(m, ServerParams{BufLimit: n.bufLimit, MinRecharge: n.capacity}) + } + maxNodes := make([]int, maxCapacityNodes) + for i := range maxNodes { + // we don't care if some indexes are selected multiple times + // in that case we have fewer max nodes + maxNodes[i] = rand.Intn(nodeCount) + } + + var sendCount int + for i := 0; i < testLength; i++ { + now := clock.Now() + for _, idx := range maxNodes { + for nodes[idx].send(t, now) { + } + } + if rand.Intn(testLength) < maxCapacityNodes*3 { + maxNodes[rand.Intn(maxCapacityNodes)] = rand.Intn(nodeCount) + } + + sendCount += randomSend + failCount := randomSend * 10 + for sendCount > 0 && failCount > 0 { + if nodes[rand.Intn(nodeCount)].send(t, now) { + sendCount-- + } else { + failCount-- + } + } + clock.Run(time.Millisecond) + } + + var totalCost uint64 + for _, n := range nodes { + totalCost += n.totalCost + } + ratio := float64(totalCost) / float64(totalCapacity) / testLength + if ratio < 0.98 || ratio > 1.02 { + t.Errorf("totalCost/totalCapacity/testLength ratio incorrect (expected: 1, got: %f)", ratio) + } + +} + +func (n *testNode) send(t *testing.T, now mclock.AbsTime) bool { + if now < n.waitUntil { + return false + } + n.index++ + if ok, _, _ := n.node.AcceptRequest(0, n.index, testMaxCost); !ok { + t.Fatalf("Rejected request after expected waiting time has passed") + } + rcost := uint64(rand.Int63n(testMaxCost)) + bv := n.node.RequestProcessed(0, n.index, testMaxCost, rcost) + if bv < testMaxCost { + n.waitUntil = now + mclock.AbsTime((testMaxCost-bv)*1001000/n.capacity) + } + n.totalCost += rcost + return true +} diff --git a/les/freeclient.go b/les/freeclient.go index 5ee607be8fb7..08613e6ce03d 100644 --- a/les/freeclient.go +++ b/les/freeclient.go @@ -1,4 +1,4 @@ -// Copyright 2016 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -14,12 +14,12 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( "io" "math" + "net" "sync" "time" @@ -44,12 +44,15 @@ import ( // value for the client. Currently the LES protocol manager uses IP addresses // (without port address) to identify clients. type freeClientPool struct { - db ethdb.Database - lock sync.Mutex - clock mclock.Clock - closed bool + db ethdb.Database + lock sync.Mutex + clock mclock.Clock + closed bool + removePeer func(string) connectedLimit, totalLimit int + freeClientCap uint64 + connectedCap uint64 addressMap map[string]*freeClientPoolEntry connPool, disconnPool *prque.Prque @@ -64,15 +67,16 @@ const ( ) // newFreeClientPool creates a new free client pool -func newFreeClientPool(db ethdb.Database, connectedLimit, totalLimit int, clock mclock.Clock) *freeClientPool { +func newFreeClientPool(db ethdb.Database, freeClientCap uint64, totalLimit int, clock mclock.Clock, removePeer func(string)) *freeClientPool { pool := &freeClientPool{ - db: db, - clock: clock, - addressMap: make(map[string]*freeClientPoolEntry), - connPool: prque.New(poolSetIndex), - disconnPool: prque.New(poolSetIndex), - connectedLimit: connectedLimit, - totalLimit: totalLimit, + db: db, + clock: clock, + addressMap: make(map[string]*freeClientPoolEntry), + connPool: prque.New(poolSetIndex), + disconnPool: prque.New(poolSetIndex), + freeClientCap: freeClientCap, + totalLimit: totalLimit, + removePeer: removePeer, } pool.loadFromDb() return pool @@ -85,22 +89,48 @@ func (f *freeClientPool) stop() { f.lock.Unlock() } +// freeClientId returns a string identifier for the peer. Multiple peers with the +// same identifier can not be in the free client pool simultaneously. +func freeClientId(p *peer) string { + if addr, ok := p.RemoteAddr().(*net.TCPAddr); ok { + if addr.IP.IsLoopback() { + // using peer id instead of loopback ip address allows multiple free + // connections from local machine to own server + return p.id + } else { + return addr.IP.String() + } + } + return "" +} + +// registerPeer implements clientPool +func (f *freeClientPool) registerPeer(p *peer) { + if freeId := freeClientId(p); freeId != "" { + if !f.connect(freeId, p.id) { + f.removePeer(p.id) + } + } +} + // connect should be called after a successful handshake. If the connection was // rejected, there is no need to call disconnect. -// -// Note: the disconnectFn callback should not block. -func (f *freeClientPool) connect(address string, disconnectFn func()) bool { +func (f *freeClientPool) connect(address, id string) bool { f.lock.Lock() defer f.lock.Unlock() if f.closed { return false } + if f.connectedLimit == 0 { + log.Debug("Client rejected", "address", address) + return false + } e := f.addressMap[address] now := f.clock.Now() var recentUsage int64 if e == nil { - e = &freeClientPoolEntry{address: address, index: -1} + e = &freeClientPoolEntry{address: address, index: -1, id: id} f.addressMap[address] = e } else { if e.connected { @@ -115,30 +145,38 @@ func (f *freeClientPool) connect(address string, disconnectFn func()) bool { i := f.connPool.PopItem().(*freeClientPoolEntry) if e.linUsage+int64(connectedBias)-i.linUsage < 0 { // kick it out and accept the new client - f.connPool.Remove(i.index) - f.calcLogUsage(i, now) - i.connected = false - f.disconnPool.Push(i, -i.logUsage) - log.Debug("Client kicked out", "address", i.address) - i.disconnectFn() + f.dropClient(i, now) + clientKickedMeter.Mark(1) + f.connectedCap -= f.freeClientCap } else { // keep the old client and reject the new one f.connPool.Push(i, i.linUsage) log.Debug("Client rejected", "address", address) + clientRejectedMeter.Mark(1) return false } } f.disconnPool.Remove(e.index) e.connected = true - e.disconnectFn = disconnectFn + e.id = id f.connPool.Push(e, e.linUsage) if f.connPool.Size()+f.disconnPool.Size() > f.totalLimit { f.disconnPool.Pop() } + f.connectedCap += f.freeClientCap + totalConnectedGauge.Update(int64(f.connectedCap)) + clientConnectedMeter.Mark(1) log.Debug("Client accepted", "address", address) return true } +// unregisterPeer implements clientPool +func (f *freeClientPool) unregisterPeer(p *peer) { + if freeId := freeClientId(p); freeId != "" { + f.disconnect(freeId) + } +} + // disconnect should be called when a connection is terminated. If the disconnection // was initiated by the pool itself using disconnectFn then calling disconnect is // not necessary but permitted. @@ -149,20 +187,55 @@ func (f *freeClientPool) disconnect(address string) { if f.closed { return } + // Short circuit if the peer hasn't been registered. e := f.addressMap[address] + if e == nil { + return + } now := f.clock.Now() if !e.connected { log.Debug("Client already disconnected", "address", address) return } - f.connPool.Remove(e.index) f.calcLogUsage(e, now) e.connected = false f.disconnPool.Push(e, -e.logUsage) + f.connectedCap -= f.freeClientCap + totalConnectedGauge.Update(int64(f.connectedCap)) log.Debug("Client disconnected", "address", address) } +// setConnLimit sets the maximum number of free client slots and also drops +// some peers if necessary +func (f *freeClientPool) setLimits(count int, totalCap uint64) { + f.lock.Lock() + defer f.lock.Unlock() + + f.connectedLimit = int(totalCap / f.freeClientCap) + if count < f.connectedLimit { + f.connectedLimit = count + } + now := mclock.Now() + for f.connPool.Size() > f.connectedLimit { + i := f.connPool.PopItem().(*freeClientPoolEntry) + f.dropClient(i, now) + f.connectedCap -= f.freeClientCap + } + totalConnectedGauge.Update(int64(f.connectedCap)) +} + +// dropClient disconnects a client and also moves it from the connected to the +// disconnected pool +func (f *freeClientPool) dropClient(i *freeClientPoolEntry, now mclock.AbsTime) { + f.connPool.Remove(i.index) + f.calcLogUsage(i, now) + i.connected = false + f.disconnPool.Push(i, -i.logUsage) + log.Debug("Client kicked out", "address", i.address) + f.removePeer(i.id) +} + // logOffset calculates the time-dependent offset for the logarithmic // representation of recent usage func (f *freeClientPool) logOffset(now mclock.AbsTime) int64 { @@ -245,7 +318,7 @@ func (f *freeClientPool) saveToDb() { // even though they are close to each other at any time they may wrap around int64 // limits over time. Comparison should be performed accordingly. type freeClientPoolEntry struct { - address string + address, id string connected bool disconnectFn func() linUsage, logUsage int64 diff --git a/les/freeclient_test.go b/les/freeclient_test.go index e95abc7aad01..5c4f58560428 100644 --- a/les/freeclient_test.go +++ b/les/freeclient_test.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -14,18 +14,17 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package les import ( "fmt" "math/rand" + "strconv" "testing" "time" "github.com/ethereum/go-ethereum/common/mclock" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/core/rawdb" ) func TestFreeClientPoolL10C100(t *testing.T) { @@ -44,32 +43,38 @@ const testFreeClientPoolTicks = 500000 func testFreeClientPool(t *testing.T, connLimit, clientCount int) { var ( - clock mclock.Simulated - db = ethdb.NewMemDatabase() - pool = newFreeClientPool(db, connLimit, 10000, &clock) - connected = make([]bool, clientCount) - connTicks = make([]int, clientCount) - disconnCh = make(chan int, clientCount) - ) - peerId := func(i int) string { - return fmt.Sprintf("test peer #%d", i) - } - disconnFn := func(i int) func() { - return func() { + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + connected = make([]bool, clientCount) + connTicks = make([]int, clientCount) + disconnCh = make(chan int, clientCount) + peerAddress = func(i int) string { + return fmt.Sprintf("addr #%d", i) + } + peerId = func(i int) string { + return fmt.Sprintf("id #%d", i) + } + disconnFn = func(id string) { + i, err := strconv.Atoi(id[4:]) + if err != nil { + panic(err) + } disconnCh <- i } - } + pool = newFreeClientPool(db, 1, 10000, &clock, disconnFn) + ) + pool.setLimits(connLimit, uint64(connLimit)) // pool should accept new peers up to its connected limit for i := 0; i < connLimit; i++ { - if pool.connect(peerId(i), disconnFn(i)) { + if pool.connect(peerAddress(i), peerId(i)) { connected[i] = true } else { t.Fatalf("Test peer #%d rejected", i) } } // since all accepted peers are new and should not be kicked out, the next one should be rejected - if pool.connect(peerId(connLimit), disconnFn(connLimit)) { + if pool.connect(peerAddress(connLimit), peerId(connLimit)) { connected[connLimit] = true t.Fatalf("Peer accepted over connected limit") } @@ -80,11 +85,11 @@ func testFreeClientPool(t *testing.T, connLimit, clientCount int) { i := rand.Intn(clientCount) if connected[i] { - pool.disconnect(peerId(i)) + pool.disconnect(peerAddress(i)) connected[i] = false connTicks[i] += tickCounter } else { - if pool.connect(peerId(i), disconnFn(i)) { + if pool.connect(peerAddress(i), peerId(i)) { connected[i] = true connTicks[i] -= tickCounter } @@ -93,7 +98,7 @@ func testFreeClientPool(t *testing.T, connLimit, clientCount int) { for { select { case i := <-disconnCh: - pool.disconnect(peerId(i)) + pool.disconnect(peerAddress(i)) if connected[i] { connTicks[i] += tickCounter connected[i] = false @@ -119,20 +124,21 @@ func testFreeClientPool(t *testing.T, connLimit, clientCount int) { } // a previously unknown peer should be accepted now - if !pool.connect("newPeer", func() {}) { + if !pool.connect("newAddr", "newId") { t.Fatalf("Previously unknown peer rejected") } // close and restart pool pool.stop() - pool = newFreeClientPool(db, connLimit, 10000, &clock) + pool = newFreeClientPool(db, 1, 10000, &clock, disconnFn) + pool.setLimits(connLimit, uint64(connLimit)) // try connecting all known peers (connLimit should be filled up) for i := 0; i < clientCount; i++ { - pool.connect(peerId(i), func() {}) + pool.connect(peerAddress(i), peerId(i)) } // expect pool to remember known nodes and kick out one of them to accept a new one - if !pool.connect("newPeer2", func() {}) { + if !pool.connect("newAddr2", "newId2") { t.Errorf("Previously unknown peer rejected after restarting pool") } pool.stop() diff --git a/les/handler.go b/les/handler.go index 19ccbcd2b602..53e2911e4f12 100644 --- a/les/handler.go +++ b/les/handler.go @@ -14,21 +14,19 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( "encoding/binary" "encoding/json" + "errors" "fmt" "math/big" - "net" "sync" + "sync/atomic" "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/mclock" - "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" @@ -45,6 +43,8 @@ import ( "github.com/ethereum/go-ethereum/trie" ) +var errTooManyInvalidRequest = errors.New("too many invalid requests made") + const ( softResponseLimit = 2 * 1024 * 1024 // Target maximum size of returned blocks, headers or node data. estHeaderRlpSize = 500 // Approximate size of an RLP encoded block header @@ -74,7 +74,7 @@ type BlockChain interface { GetHeaderByHash(hash common.Hash) *types.Header CurrentHeader() *types.Header GetTd(hash common.Hash, number uint64) *big.Int - State() (*state.StateDB, error) + StateCache() state.Database InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) Rollback(chain []common.Hash) GetHeaderByNumber(number uint64) *types.Header @@ -85,49 +85,58 @@ type BlockChain interface { type txPool interface { AddRemotes(txs []*types.Transaction) []error + AddRemotesSync(txs []*types.Transaction) []error Status(hashes []common.Hash) []core.TxStatus } type ProtocolManager struct { - lightSync bool - txpool txPool - txrelay *LesTxRelay - networkId uint64 + // Configs chainConfig *params.ChainConfig iConfig *light.IndexerConfig - blockchain BlockChain - chainDb ethdb.Database - odr *LesOdr - server *LesServer - serverPool *serverPool - clientPool *freeClientPool - lesTopic discv5.Topic - reqDist *requestDistributor - retriever *retrieveManager - - downloader *downloader.Downloader - fetcher *lightFetcher - peers *peerSet - maxPeers int - eventMux *event.TypeMux + client bool // The indicator whether the node is light client + maxPeers int // The maximum number peers allowed to connect. + networkId uint64 // The identity of network. + + txpool txPool + txrelay *lesTxRelay + blockchain BlockChain + chainDb ethdb.Database + odr *LesOdr + server *LesServer + serverPool *serverPool + lesTopic discv5.Topic + reqDist *requestDistributor + retriever *retrieveManager + servingQueue *servingQueue + downloader *downloader.Downloader + fetcher *lightFetcher + ulc *ulc + peers *peerSet + checkpoint *params.TrustedCheckpoint + reg *checkpointOracle // If reg == nil, it means the checkpoint registrar is not activated // channels for fetcher, syncer, txsyncLoop newPeerCh chan *peer quitSync chan struct{} noMorePeers chan struct{} - // wait group is used for graceful shutdowns during downloading - // and processing - wg *sync.WaitGroup + wg *sync.WaitGroup + eventMux *event.TypeMux + + // Callbacks + synced func() bool + + // Testing fields + addTxsSync bool } // NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable // with the ethereum network. -func NewProtocolManager(chainConfig *params.ChainConfig, indexerConfig *light.IndexerConfig, lightSync bool, networkId uint64, mux *event.TypeMux, engine consensus.Engine, peers *peerSet, blockchain BlockChain, txpool txPool, chainDb ethdb.Database, odr *LesOdr, txrelay *LesTxRelay, serverPool *serverPool, quitSync chan struct{}, wg *sync.WaitGroup) (*ProtocolManager, error) { +func NewProtocolManager(chainConfig *params.ChainConfig, checkpoint *params.TrustedCheckpoint, indexerConfig *light.IndexerConfig, ulcServers []string, ulcFraction int, client bool, networkId uint64, mux *event.TypeMux, peers *peerSet, blockchain BlockChain, txpool txPool, chainDb ethdb.Database, odr *LesOdr, serverPool *serverPool, registrar *checkpointOracle, quitSync chan struct{}, wg *sync.WaitGroup, synced func() bool) (*ProtocolManager, error) { // Create the protocol manager with the base fields manager := &ProtocolManager{ - lightSync: lightSync, + client: client, eventMux: mux, blockchain: blockchain, chainConfig: chainConfig, @@ -136,30 +145,42 @@ func NewProtocolManager(chainConfig *params.ChainConfig, indexerConfig *light.In odr: odr, networkId: networkId, txpool: txpool, - txrelay: txrelay, serverPool: serverPool, + reg: registrar, peers: peers, newPeerCh: make(chan *peer), quitSync: quitSync, wg: wg, noMorePeers: make(chan struct{}), + checkpoint: checkpoint, + synced: synced, } if odr != nil { manager.retriever = odr.retriever manager.reqDist = odr.retriever.dist } + if ulcServers != nil { + ulc, err := newULC(ulcServers, ulcFraction) + if err != nil { + log.Warn("Failed to initialize ultra light client", "err", err) + } else { + manager.ulc = ulc + } + } removePeer := manager.removePeer if disableClientRemovePeer { removePeer = func(id string) {} } - - if lightSync { - manager.downloader = downloader.New(downloader.LightSync, chainDb, manager.eventMux, nil, blockchain, removePeer) + if client { + var checkpointNumber uint64 + if checkpoint != nil { + checkpointNumber = (checkpoint.SectionIndex+1)*params.CHTFrequency - 1 + } + manager.downloader = downloader.New(checkpointNumber, chainDb, nil, manager.eventMux, nil, blockchain, removePeer) manager.peers.notify((*downloaderPeerNotify)(manager)) manager.fetcher = newLightFetcher(manager) } - return manager, nil } @@ -170,11 +191,9 @@ func (pm *ProtocolManager) removePeer(id string) { func (pm *ProtocolManager) Start(maxPeers int) { pm.maxPeers = maxPeers - - if pm.lightSync { + if pm.client { go pm.syncer() } else { - pm.clientPool = newFreeClientPool(pm.chainDb, maxPeers, 10000, mclock.System{}) go func() { for range pm.newPeerCh { } @@ -192,8 +211,9 @@ func (pm *ProtocolManager) Stop() { pm.noMorePeers <- struct{}{} close(pm.quitSync) // quits syncer, fetcher - if pm.clientPool != nil { - pm.clientPool.stop() + + if pm.servingQueue != nil { + pm.servingQueue.stop() } // Disconnect existing sessions. @@ -234,7 +254,11 @@ func (pm *ProtocolManager) runPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWrit } func (pm *ProtocolManager) newPeer(pv int, nv uint64, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { - return newPeer(pv, nv, p, newMeteredMsgWriter(rw)) + var trusted bool + if pm.ulc != nil { + trusted = pm.ulc.trusted(p.ID()) + } + return newPeer(pv, nv, trusted, p, newMeteredMsgWriter(rw)) } // handle is the callback invoked to manage the life cycle of a les peer. When @@ -242,10 +266,15 @@ func (pm *ProtocolManager) newPeer(pv int, nv uint64, p *p2p.Peer, rw p2p.MsgRea func (pm *ProtocolManager) handle(p *peer) error { // Ignore maxPeers if this is a trusted peer // In server mode we try to check into the client pool after handshake - if pm.lightSync && pm.peers.Len() >= pm.maxPeers && !p.Peer.Info().Network.Trusted { + if pm.client && pm.peers.Len() >= pm.maxPeers && !p.Peer.Info().Network.Trusted { + clientRejectedMeter.Mark(1) return p2p.DiscTooManyPeers } - + // Reject light clients if server is not synced. + if !pm.client && !pm.synced() { + clientRejectedMeter.Mark(1) + return p2p.DiscRequested + } p.Log().Debug("Light Ethereum peer connected", "name", p.Name()) // Execute the LES handshake @@ -258,37 +287,31 @@ func (pm *ProtocolManager) handle(p *peer) error { ) if err := p.Handshake(td, hash, number, genesis.Hash(), pm.server); err != nil { p.Log().Debug("Light Ethereum handshake failed", "err", err) + clientErrorMeter.Mark(1) return err } - - if !pm.lightSync && !p.Peer.Info().Network.Trusted { - addr, ok := p.RemoteAddr().(*net.TCPAddr) - // test peer address is not a tcp address, don't use client pool if can not typecast - if ok { - id := addr.IP.String() - if !pm.clientPool.connect(id, func() { go pm.removePeer(p.id) }) { - return p2p.DiscTooManyPeers - } - defer pm.clientPool.disconnect(id) - } + if p.fcClient != nil { + defer p.fcClient.Disconnect() } if rw, ok := p.rw.(*meteredMsgReadWriter); ok { rw.Init(p.version) } + // Register the peer locally if err := pm.peers.Register(p); err != nil { + clientErrorMeter.Mark(1) p.Log().Error("Light Ethereum peer registration failed", "err", err) return err } + connectedAt := time.Now() defer func() { - if pm.server != nil && pm.server.fcManager != nil && p.fcClient != nil { - p.fcClient.Remove(pm.server.fcManager) - } pm.removePeer(p.id) + connectionTimer.UpdateSince(connectedAt) }() + // Register the peer in the downloader. If the downloader considers it banned, we disconnect - if pm.lightSync { + if pm.client { p.lock.Lock() head := p.headInfo p.lock.Unlock() @@ -300,35 +323,26 @@ func (pm *ProtocolManager) handle(p *peer) error { pm.serverPool.registered(p.poolEntry) } } - - stop := make(chan struct{}) - defer close(stop) - go func() { - // new block announce loop - for { - select { - case announce := <-p.announceChn: - p.SendAnnounce(announce) - case <-stop: - return - } - } - }() - // main loop. handle incoming messages. for { if err := pm.handleMsg(p); err != nil { p.Log().Debug("Light Ethereum message handling failed", "err", err) + if p.fcServer != nil { + p.fcServer.DumpLogs() + } return err } } } -var reqList = []uint64{GetBlockHeadersMsg, GetBlockBodiesMsg, GetCodeMsg, GetReceiptsMsg, GetProofsV1Msg, SendTxMsg, SendTxV2Msg, GetTxStatusMsg, GetHeaderProofsMsg, GetProofsV2Msg, GetHelperTrieProofsMsg} - // handleMsg is invoked whenever an inbound message is received from a remote // peer. The remote connection is torn down upon returning any error. func (pm *ProtocolManager) handleMsg(p *peer) error { + select { + case err := <-p.errCh: + return err + default: + } // Read the next message from the remote peer, and ensure it's fully consumed msg, err := p.rw.ReadMsg() if err != nil { @@ -336,21 +350,47 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } p.Log().Trace("Light Ethereum message arrived", "code", msg.Code, "bytes", msg.Size) - costs := p.fcCosts[msg.Code] - reject := func(reqCnt, maxCnt uint64) bool { - if p.fcClient == nil || reqCnt > maxCnt { - return true + p.responseCount++ + responseCount := p.responseCount + var ( + maxCost uint64 + task *servingTask + ) + + accept := func(reqID, reqCnt, maxCnt uint64) bool { + inSizeCost := func() uint64 { + if pm.server.costTracker != nil { + return pm.server.costTracker.realCost(0, msg.Size, 0) + } + return 0 + } + if p.isFrozen() || reqCnt == 0 || p.fcClient == nil || reqCnt > maxCnt { + p.fcClient.OneTimeCost(inSizeCost()) + return false + } + maxCost = p.fcCosts.getMaxCost(msg.Code, reqCnt) + gf := float64(1) + if pm.server.costTracker != nil { + gf = pm.server.costTracker.globalFactor() + if gf < 0.001 { + p.Log().Error("Invalid global cost factor", "globalFactor", gf) + gf = 1 + } } - bufValue, _ := p.fcClient.AcceptRequest() - cost := costs.baseCost + reqCnt*costs.reqCost - if cost > pm.server.defParams.BufLimit { - cost = pm.server.defParams.BufLimit + maxTime := uint64(float64(maxCost) / gf) + + if accepted, bufShort, servingPriority := p.fcClient.AcceptRequest(reqID, responseCount, maxCost); !accepted { + p.freezeClient() + p.Log().Warn("Request came too early", "remaining", common.PrettyDuration(time.Duration(bufShort*1000000/p.fcParams.MinRecharge))) + p.fcClient.OneTimeCost(inSizeCost()) + return false + } else { + task = pm.servingQueue.newTask(p, maxTime, servingPriority) } - if cost > bufValue { - recharge := time.Duration((cost - bufValue) * 1000000 / pm.server.defParams.MinRecharge) - p.Log().Error("Request came too early", "recharge", common.PrettyDuration(recharge)) + if task.start() { return true } + p.fcClient.RequestProcessed(reqID, responseCount, maxCost, inSizeCost()) return false } @@ -361,6 +401,40 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { var deliverMsg *Msg + sendResponse := func(reqID, amount uint64, reply *reply, servingTime uint64) { + p.responseLock.Lock() + defer p.responseLock.Unlock() + + if p.isFrozen() { + amount = 0 + reply = nil + } + var replySize uint32 + if reply != nil { + replySize = reply.size() + } + var realCost uint64 + if pm.server.costTracker != nil { + realCost = pm.server.costTracker.realCost(servingTime, msg.Size, replySize) + if amount != 0 { + pm.server.costTracker.updateStats(msg.Code, amount, servingTime, realCost) + } + } else { + realCost = maxCost + } + bv := p.fcClient.RequestProcessed(reqID, responseCount, maxCost, realCost) + if reply != nil { + p.queueSend(func() { + if err := reply.send(bv); err != nil { + select { + case p.errCh <- err: + default: + } + } + }) + } + } + // Handle the message depending on its contents switch msg.Code { case StatusMsg: @@ -371,26 +445,35 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { // Block header query, collect the requested headers and reply case AnnounceMsg: p.Log().Trace("Received announce message") - if p.requestAnnounceType == announceTypeNone { - return errResp(ErrUnexpectedResponse, "") - } - var req announceData if err := msg.Decode(&req); err != nil { return errResp(ErrDecode, "%v: %v", msg, err) } + if err := req.sanityCheck(); err != nil { + return err + } + update, size := req.Update.decode() + if p.rejectUpdate(size) { + return errResp(ErrRequestRejected, "") + } + p.updateFlowControl(update) - if p.requestAnnounceType == announceTypeSigned { - if err := req.checkSignature(p.ID()); err != nil { - p.Log().Trace("Invalid announcement signature", "err", err) - return err + if req.Hash != (common.Hash{}) { + if p.announceType == announceTypeNone { + return errResp(ErrUnexpectedResponse, "") + } + if p.announceType == announceTypeSigned { + if err := req.checkSignature(p.ID(), update); err != nil { + p.Log().Trace("Invalid announcement signature", "err", err) + return err + } + p.Log().Trace("Valid announcement signature") } - p.Log().Trace("Valid announcement signature") - } - p.Log().Trace("Announce message content", "number", req.Number, "hash", req.Hash, "td", req.Td, "reorg", req.ReorgDepth) - if pm.fetcher != nil { - pm.fetcher.announce(p, &req) + p.Log().Trace("Announce message content", "number", req.Number, "hash", req.Hash, "td", req.Td, "reorg", req.ReorgDepth) + if pm.fetcher != nil { + pm.fetcher.announce(p, &req) + } } case GetBlockHeadersMsg: @@ -405,94 +488,95 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } query := req.Query - if reject(query.Amount, MaxHeaderFetch) { - return errResp(ErrRequestRejected, "") - } - - hashMode := query.Origin.Hash != (common.Hash{}) - first := true - maxNonCanonical := uint64(100) + if accept(req.ReqID, query.Amount, MaxHeaderFetch) { + go func() { + hashMode := query.Origin.Hash != (common.Hash{}) + first := true + maxNonCanonical := uint64(100) - // Gather headers until the fetch or network limits is reached - var ( - bytes common.StorageSize - headers []*types.Header - unknown bool - ) - for !unknown && len(headers) < int(query.Amount) && bytes < softResponseLimit { - // Retrieve the next header satisfying the query - var origin *types.Header - if hashMode { - if first { - first = false - origin = pm.blockchain.GetHeaderByHash(query.Origin.Hash) - if origin != nil { - query.Origin.Number = origin.Number.Uint64() - } - } else { - origin = pm.blockchain.GetHeader(query.Origin.Hash, query.Origin.Number) - } - } else { - origin = pm.blockchain.GetHeaderByNumber(query.Origin.Number) - } - if origin == nil { - break - } - headers = append(headers, origin) - bytes += estHeaderRlpSize - - // Advance to the next header of the query - switch { - case hashMode && query.Reverse: - // Hash based traversal towards the genesis block - ancestor := query.Skip + 1 - if ancestor == 0 { - unknown = true - } else { - query.Origin.Hash, query.Origin.Number = pm.blockchain.GetAncestor(query.Origin.Hash, query.Origin.Number, ancestor, &maxNonCanonical) - unknown = (query.Origin.Hash == common.Hash{}) - } - case hashMode && !query.Reverse: - // Hash based traversal towards the leaf block + // Gather headers until the fetch or network limits is reached var ( - current = origin.Number.Uint64() - next = current + query.Skip + 1 + bytes common.StorageSize + headers []*types.Header + unknown bool ) - if next <= current { - infos, _ := json.MarshalIndent(p.Peer.Info(), "", " ") - p.Log().Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", query.Skip, "next", next, "attacker", infos) - unknown = true - } else { - if header := pm.blockchain.GetHeaderByNumber(next); header != nil { - nextHash := header.Hash() - expOldHash, _ := pm.blockchain.GetAncestor(nextHash, next, query.Skip+1, &maxNonCanonical) - if expOldHash == query.Origin.Hash { - query.Origin.Hash, query.Origin.Number = nextHash, next + for !unknown && len(headers) < int(query.Amount) && bytes < softResponseLimit { + if !first && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + // Retrieve the next header satisfying the query + var origin *types.Header + if hashMode { + if first { + origin = pm.blockchain.GetHeaderByHash(query.Origin.Hash) + if origin != nil { + query.Origin.Number = origin.Number.Uint64() + } } else { - unknown = true + origin = pm.blockchain.GetHeader(query.Origin.Hash, query.Origin.Number) } } else { - unknown = true + origin = pm.blockchain.GetHeaderByNumber(query.Origin.Number) } + if origin == nil { + atomic.AddUint32(&p.invalidCount, 1) + break + } + headers = append(headers, origin) + bytes += estHeaderRlpSize + + // Advance to the next header of the query + switch { + case hashMode && query.Reverse: + // Hash based traversal towards the genesis block + ancestor := query.Skip + 1 + if ancestor == 0 { + unknown = true + } else { + query.Origin.Hash, query.Origin.Number = pm.blockchain.GetAncestor(query.Origin.Hash, query.Origin.Number, ancestor, &maxNonCanonical) + unknown = (query.Origin.Hash == common.Hash{}) + } + case hashMode && !query.Reverse: + // Hash based traversal towards the leaf block + var ( + current = origin.Number.Uint64() + next = current + query.Skip + 1 + ) + if next <= current { + infos, _ := json.MarshalIndent(p.Peer.Info(), "", " ") + p.Log().Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", query.Skip, "next", next, "attacker", infos) + unknown = true + } else { + if header := pm.blockchain.GetHeaderByNumber(next); header != nil { + nextHash := header.Hash() + expOldHash, _ := pm.blockchain.GetAncestor(nextHash, next, query.Skip+1, &maxNonCanonical) + if expOldHash == query.Origin.Hash { + query.Origin.Hash, query.Origin.Number = nextHash, next + } else { + unknown = true + } + } else { + unknown = true + } + } + case query.Reverse: + // Number based traversal towards the genesis block + if query.Origin.Number >= query.Skip+1 { + query.Origin.Number -= query.Skip + 1 + } else { + unknown = true + } + case !query.Reverse: + // Number based traversal towards the leaf block + query.Origin.Number += query.Skip + 1 + } + first = false } - case query.Reverse: - // Number based traversal towards the genesis block - if query.Origin.Number >= query.Skip+1 { - query.Origin.Number -= query.Skip + 1 - } else { - unknown = true - } - - case !query.Reverse: - // Number based traversal towards the leaf block - query.Origin.Number += query.Skip + 1 - } + sendResponse(req.ReqID, query.Amount, p.ReplyBlockHeaders(req.ReqID, headers), task.done()) + }() } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + query.Amount*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, query.Amount, rcost) - return p.SendBlockHeaders(req.ReqID, bv, headers) - case BlockHeadersMsg: if pm.downloader == nil { return errResp(ErrUnexpectedResponse, "") @@ -507,7 +591,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&resp); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - p.fcServer.GotReply(resp.ReqID, resp.BV) + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) if pm.fetcher != nil && pm.fetcher.requestedID(resp.ReqID) { pm.fetcher.deliverHeaders(p, resp.ReqID, resp.Headers) } else { @@ -533,24 +617,30 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { bodies []rlp.RawValue ) reqCnt := len(req.Hashes) - if reject(uint64(reqCnt), MaxBodyFetch) { - return errResp(ErrRequestRejected, "") - } - for _, hash := range req.Hashes { - if bytes >= softResponseLimit { - break - } - // Retrieve the requested block body, stopping if enough was found - if number := rawdb.ReadHeaderNumber(pm.chainDb, hash); number != nil { - if data := rawdb.ReadBodyRLP(pm.chainDb, hash, *number); len(data) != 0 { - bodies = append(bodies, data) - bytes += len(data) + if accept(req.ReqID, uint64(reqCnt), MaxBodyFetch) { + go func() { + for i, hash := range req.Hashes { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + // Retrieve the requested block body, stopping if enough was found + if bytes >= softResponseLimit { + break + } + number := rawdb.ReadHeaderNumber(pm.chainDb, hash) + if number == nil { + atomic.AddUint32(&p.invalidCount, 1) + continue + } + if data := rawdb.ReadBodyRLP(pm.chainDb, hash, *number); len(data) != 0 { + bodies = append(bodies, data) + bytes += len(data) + } } - } + sendResponse(req.ReqID, uint64(reqCnt), p.ReplyBlockBodiesRLP(req.ReqID, bodies), task.done()) + }() } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendBlockBodiesRLP(req.ReqID, bv, bodies) case BlockBodiesMsg: if pm.odr == nil { @@ -566,7 +656,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&resp); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - p.fcServer.GotReply(resp.ReqID, resp.BV) + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) deliverMsg = &Msg{ MsgType: MsgBlockBodies, ReqID: resp.ReqID, @@ -589,33 +679,55 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { data [][]byte ) reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxCodeFetch) { - return errResp(ErrRequestRejected, "") - } - for _, req := range req.Reqs { - // Retrieve the requested state entry, stopping if enough was found - if number := rawdb.ReadHeaderNumber(pm.chainDb, req.BHash); number != nil { - if header := rawdb.ReadHeader(pm.chainDb, req.BHash, *number); header != nil { - statedb, err := pm.blockchain.State() + if accept(req.ReqID, uint64(reqCnt), MaxCodeFetch) { + go func() { + for i, request := range req.Reqs { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + // Look up the root hash belonging to the request + number := rawdb.ReadHeaderNumber(pm.chainDb, request.BHash) + if number == nil { + p.Log().Warn("Failed to retrieve block num for code", "hash", request.BHash) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + header := rawdb.ReadHeader(pm.chainDb, request.BHash, *number) + if header == nil { + p.Log().Warn("Failed to retrieve header for code", "block", *number, "hash", request.BHash) + continue + } + // Refuse to search stale state data in the database since looking for + // a non-exist key is kind of expensive. + local := pm.blockchain.CurrentHeader().Number.Uint64() + if !pm.server.archiveMode && header.Number.Uint64()+core.TriesInMemory <= local { + p.Log().Debug("Reject stale code request", "number", header.Number.Uint64(), "head", local) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + triedb := pm.blockchain.StateCache().TrieDB() + + account, err := pm.getAccount(triedb, header.Root, common.BytesToHash(request.AccKey)) if err != nil { + p.Log().Warn("Failed to retrieve account for code", "block", header.Number, "hash", header.Hash(), "account", common.BytesToHash(request.AccKey), "err", err) + atomic.AddUint32(&p.invalidCount, 1) continue } - account, err := pm.getAccount(statedb, header.Root, common.BytesToHash(req.AccKey)) + code, err := triedb.Node(common.BytesToHash(account.CodeHash)) if err != nil { + p.Log().Warn("Failed to retrieve account code", "block", header.Number, "hash", header.Hash(), "account", common.BytesToHash(request.AccKey), "codehash", common.BytesToHash(account.CodeHash), "err", err) continue } - code, _ := statedb.Database().TrieDB().Node(common.BytesToHash(account.CodeHash)) - + // Accumulate the code and abort if enough data was retrieved data = append(data, code) if bytes += len(code); bytes >= softResponseLimit { break } } - } + sendResponse(req.ReqID, uint64(reqCnt), p.ReplyCode(req.ReqID, data), task.done()) + }() } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendCode(req.ReqID, bv, data) case CodeMsg: if pm.odr == nil { @@ -631,7 +743,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&resp); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - p.fcServer.GotReply(resp.ReqID, resp.BV) + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) deliverMsg = &Msg{ MsgType: MsgCode, ReqID: resp.ReqID, @@ -654,34 +766,40 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { receipts []rlp.RawValue ) reqCnt := len(req.Hashes) - if reject(uint64(reqCnt), MaxReceiptFetch) { - return errResp(ErrRequestRejected, "") - } - for _, hash := range req.Hashes { - if bytes >= softResponseLimit { - break - } - // Retrieve the requested block's receipts, skipping if unknown to us - var results types.Receipts - if number := rawdb.ReadHeaderNumber(pm.chainDb, hash); number != nil { - results = rawdb.ReadReceipts(pm.chainDb, hash, *number) - } - if results == nil { - if header := pm.blockchain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash { - continue + if accept(req.ReqID, uint64(reqCnt), MaxReceiptFetch) { + go func() { + for i, hash := range req.Hashes { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + if bytes >= softResponseLimit { + break + } + // Retrieve the requested block's receipts, skipping if unknown to us + var results types.Receipts + number := rawdb.ReadHeaderNumber(pm.chainDb, hash) + if number == nil { + atomic.AddUint32(&p.invalidCount, 1) + continue + } + results = rawdb.ReadRawReceipts(pm.chainDb, hash, *number) + if results == nil { + if header := pm.blockchain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash { + continue + } + } + // If known, encode and queue for response packet + if encoded, err := rlp.EncodeToBytes(results); err != nil { + log.Error("Failed to encode receipt", "err", err) + } else { + receipts = append(receipts, encoded) + bytes += len(encoded) + } } - } - // If known, encode and queue for response packet - if encoded, err := rlp.EncodeToBytes(results); err != nil { - log.Error("Failed to encode receipt", "err", err) - } else { - receipts = append(receipts, encoded) - bytes += len(encoded) - } + sendResponse(req.ReqID, uint64(reqCnt), p.ReplyReceiptsRLP(req.ReqID, receipts), task.done()) + }() } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendReceiptsRLP(req.ReqID, bv, receipts) case ReceiptsMsg: if pm.odr == nil { @@ -697,15 +815,15 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&resp); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - p.fcServer.GotReply(resp.ReqID, resp.BV) + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) deliverMsg = &Msg{ MsgType: MsgReceipts, ReqID: resp.ReqID, Obj: resp.Receipts, } - case GetProofsV1Msg: - p.Log().Trace("Received proofs request") + case GetProofsV2Msg: + p.Log().Trace("Received les/2 proofs request") // Decode the retrieval message var req struct { ReqID uint64 @@ -716,128 +834,88 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } // Gather state data until the fetch or network limits is reached var ( - bytes int - proofs proofsData + lastBHash common.Hash + root common.Hash ) reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxProofsFetch) { - return errResp(ErrRequestRejected, "") - } - for _, req := range req.Reqs { - // Retrieve the requested state entry, stopping if enough was found - if number := rawdb.ReadHeaderNumber(pm.chainDb, req.BHash); number != nil { - if header := rawdb.ReadHeader(pm.chainDb, req.BHash, *number); header != nil { - statedb, err := pm.blockchain.State() - if err != nil { + if accept(req.ReqID, uint64(reqCnt), MaxProofsFetch) { + go func() { + nodes := light.NewNodeSet() + + for i, request := range req.Reqs { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + // Look up the root hash belonging to the request + var ( + number *uint64 + header *types.Header + trie state.Trie + ) + if request.BHash != lastBHash { + root, lastBHash = common.Hash{}, request.BHash + + if number = rawdb.ReadHeaderNumber(pm.chainDb, request.BHash); number == nil { + p.Log().Warn("Failed to retrieve block num for proof", "hash", request.BHash) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + if header = rawdb.ReadHeader(pm.chainDb, request.BHash, *number); header == nil { + p.Log().Warn("Failed to retrieve header for proof", "block", *number, "hash", request.BHash) + continue + } + // Refuse to search stale state data in the database since looking for + // a non-exist key is kind of expensive. + local := pm.blockchain.CurrentHeader().Number.Uint64() + if !pm.server.archiveMode && header.Number.Uint64()+core.TriesInMemory <= local { + p.Log().Debug("Reject stale trie request", "number", header.Number.Uint64(), "head", local) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + root = header.Root + } + // If a header lookup failed (non existent), ignore subsequent requests for the same header + if root == (common.Hash{}) { + atomic.AddUint32(&p.invalidCount, 1) continue } - var trie state.Trie - if len(req.AccKey) > 0 { - account, err := pm.getAccount(statedb, header.Root, common.BytesToHash(req.AccKey)) + // Open the account or storage trie for the request + statedb := pm.blockchain.StateCache() + + switch len(request.AccKey) { + case 0: + // No account key specified, open an account trie + trie, err = statedb.OpenTrie(root) + if trie == nil || err != nil { + p.Log().Warn("Failed to open storage trie for proof", "block", header.Number, "hash", header.Hash(), "root", root, "err", err) + continue + } + default: + // Account key specified, open a storage trie + account, err := pm.getAccount(statedb.TrieDB(), root, common.BytesToHash(request.AccKey)) if err != nil { + p.Log().Warn("Failed to retrieve account for proof", "block", header.Number, "hash", header.Hash(), "account", common.BytesToHash(request.AccKey), "err", err) + atomic.AddUint32(&p.invalidCount, 1) continue } - trie, _ = statedb.Database().OpenStorageTrie(common.BytesToHash(req.AccKey), account.Root) - } else { - trie, _ = statedb.Database().OpenTrie(header.Root) - } - if trie != nil { - var proof light.NodeList - trie.Prove(req.Key, 0, &proof) - - proofs = append(proofs, proof) - if bytes += proof.DataSize(); bytes >= softResponseLimit { - break + trie, err = statedb.OpenStorageTrie(common.BytesToHash(request.AccKey), account.Root) + if trie == nil || err != nil { + p.Log().Warn("Failed to open storage trie for proof", "block", header.Number, "hash", header.Hash(), "account", common.BytesToHash(request.AccKey), "root", account.Root, "err", err) + continue } } - } - } - } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendProofs(req.ReqID, bv, proofs) - - case GetProofsV2Msg: - p.Log().Trace("Received les/2 proofs request") - // Decode the retrieval message - var req struct { - ReqID uint64 - Reqs []ProofReq - } - if err := msg.Decode(&req); err != nil { - return errResp(ErrDecode, "msg %v: %v", msg, err) - } - // Gather state data until the fetch or network limits is reached - var ( - lastBHash common.Hash - statedb *state.StateDB - root common.Hash - ) - reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxProofsFetch) { - return errResp(ErrRequestRejected, "") - } - - nodes := light.NewNodeSet() - - for _, req := range req.Reqs { - // Look up the state belonging to the request - if statedb == nil || req.BHash != lastBHash { - statedb, root, lastBHash = nil, common.Hash{}, req.BHash - - if number := rawdb.ReadHeaderNumber(pm.chainDb, req.BHash); number != nil { - if header := rawdb.ReadHeader(pm.chainDb, req.BHash, *number); header != nil { - statedb, _ = pm.blockchain.State() - root = header.Root + // Prove the user's request from the account or stroage trie + if err := trie.Prove(request.Key, request.FromLevel, nodes); err != nil { + p.Log().Warn("Failed to prove state request", "block", header.Number, "hash", header.Hash(), "err", err) + continue + } + if nodes.DataSize() >= softResponseLimit { + break } } - } - if statedb == nil { - continue - } - // Pull the account or storage trie of the request - var trie state.Trie - if len(req.AccKey) > 0 { - account, err := pm.getAccount(statedb, root, common.BytesToHash(req.AccKey)) - if err != nil { - continue - } - trie, _ = statedb.Database().OpenStorageTrie(common.BytesToHash(req.AccKey), account.Root) - } else { - trie, _ = statedb.Database().OpenTrie(root) - } - if trie == nil { - continue - } - // Prove the user's request from the account or stroage trie - trie.Prove(req.Key, req.FromLevel, nodes) - if nodes.DataSize() >= softResponseLimit { - break - } - } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendProofsV2(req.ReqID, bv, nodes.NodeList()) - - case ProofsV1Msg: - if pm.odr == nil { - return errResp(ErrUnexpectedResponse, "") - } - - p.Log().Trace("Received proofs response") - // A batch of merkle proofs arrived to one of our previous requests - var resp struct { - ReqID, BV uint64 - Data []light.NodeList - } - if err := msg.Decode(&resp); err != nil { - return errResp(ErrDecode, "msg %v: %v", msg, err) - } - p.fcServer.GotReply(resp.ReqID, resp.BV) - deliverMsg = &Msg{ - MsgType: MsgProofsV1, - ReqID: resp.ReqID, - Obj: resp.Data, + sendResponse(req.ReqID, uint64(reqCnt), p.ReplyProofsV2(req.ReqID, nodes.NodeList()), task.done()) + }() } case ProofsV2Msg: @@ -854,58 +932,13 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&resp); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - p.fcServer.GotReply(resp.ReqID, resp.BV) + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) deliverMsg = &Msg{ MsgType: MsgProofsV2, ReqID: resp.ReqID, Obj: resp.Data, } - case GetHeaderProofsMsg: - p.Log().Trace("Received headers proof request") - // Decode the retrieval message - var req struct { - ReqID uint64 - Reqs []ChtReq - } - if err := msg.Decode(&req); err != nil { - return errResp(ErrDecode, "msg %v: %v", msg, err) - } - // Gather state data until the fetch or network limits is reached - var ( - bytes int - proofs []ChtResp - ) - reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxHelperTrieProofsFetch) { - return errResp(ErrRequestRejected, "") - } - trieDb := trie.NewDatabase(ethdb.NewTable(pm.chainDb, light.ChtTablePrefix)) - for _, req := range req.Reqs { - if header := pm.blockchain.GetHeaderByNumber(req.BlockNum); header != nil { - sectionHead := rawdb.ReadCanonicalHash(pm.chainDb, req.ChtNum*pm.iConfig.ChtSize-1) - if root := light.GetChtRoot(pm.chainDb, req.ChtNum-1, sectionHead); root != (common.Hash{}) { - trie, err := trie.New(root, trieDb) - if err != nil { - continue - } - var encNumber [8]byte - binary.BigEndian.PutUint64(encNumber[:], req.BlockNum) - - var proof light.NodeList - trie.Prove(encNumber[:], 0, &proof) - - proofs = append(proofs, ChtResp{Header: header, Proof: proof}) - if bytes += proof.DataSize() + estHeaderRlpSize; bytes >= softResponseLimit { - break - } - } - } - } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendHeaderProofs(req.ReqID, bv, proofs) - case GetHelperTrieProofsMsg: p.Log().Trace("Received helper trie proof request") // Decode the retrieval message @@ -922,69 +955,52 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { auxData [][]byte ) reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxHelperTrieProofsFetch) { - return errResp(ErrRequestRejected, "") - } - - var ( - lastIdx uint64 - lastType uint - root common.Hash - auxTrie *trie.Trie - ) - nodes := light.NewNodeSet() - for _, req := range req.Reqs { - if auxTrie == nil || req.Type != lastType || req.TrieIdx != lastIdx { - auxTrie, lastType, lastIdx = nil, req.Type, req.TrieIdx - - var prefix string - if root, prefix = pm.getHelperTrie(req.Type, req.TrieIdx); root != (common.Hash{}) { - auxTrie, _ = trie.New(root, trie.NewDatabase(ethdb.NewTable(pm.chainDb, prefix))) - } - } - if req.AuxReq == auxRoot { - var data []byte - if root != (common.Hash{}) { - data = root[:] - } - auxData = append(auxData, data) - auxBytes += len(data) - } else { - if auxTrie != nil { - auxTrie.Prove(req.Key, req.FromLevel, nodes) - } - if req.AuxReq != 0 { - data := pm.getHelperTrieAuxData(req) - auxData = append(auxData, data) - auxBytes += len(data) - } - } - if nodes.DataSize()+auxBytes >= softResponseLimit { - break - } - } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendHelperTrieProofs(req.ReqID, bv, HelperTrieResps{Proofs: nodes.NodeList(), AuxData: auxData}) + if accept(req.ReqID, uint64(reqCnt), MaxHelperTrieProofsFetch) { + go func() { - case HeaderProofsMsg: - if pm.odr == nil { - return errResp(ErrUnexpectedResponse, "") - } + var ( + lastIdx uint64 + lastType uint + root common.Hash + auxTrie *trie.Trie + ) + nodes := light.NewNodeSet() + for i, request := range req.Reqs { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + if auxTrie == nil || request.Type != lastType || request.TrieIdx != lastIdx { + auxTrie, lastType, lastIdx = nil, request.Type, request.TrieIdx - p.Log().Trace("Received headers proof response") - var resp struct { - ReqID, BV uint64 - Data []ChtResp - } - if err := msg.Decode(&resp); err != nil { - return errResp(ErrDecode, "msg %v: %v", msg, err) - } - p.fcServer.GotReply(resp.ReqID, resp.BV) - deliverMsg = &Msg{ - MsgType: MsgHeaderProofs, - ReqID: resp.ReqID, - Obj: resp.Data, + var prefix string + if root, prefix = pm.getHelperTrie(request.Type, request.TrieIdx); root != (common.Hash{}) { + auxTrie, _ = trie.New(root, trie.NewDatabase(rawdb.NewTable(pm.chainDb, prefix))) + } + } + if request.AuxReq == auxRoot { + var data []byte + if root != (common.Hash{}) { + data = root[:] + } + auxData = append(auxData, data) + auxBytes += len(data) + } else { + if auxTrie != nil { + auxTrie.Prove(request.Key, request.FromLevel, nodes) + } + if request.AuxReq != 0 { + data := pm.getHelperTrieAuxData(request) + auxData = append(auxData, data) + auxBytes += len(data) + } + } + if nodes.DataSize()+auxBytes >= softResponseLimit { + break + } + } + sendResponse(req.ReqID, uint64(reqCnt), p.ReplyHelperTrieProofs(req.ReqID, HelperTrieResps{Proofs: nodes.NodeList(), AuxData: auxData}), task.done()) + }() } case HelperTrieProofsMsg: @@ -1001,31 +1017,13 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { return errResp(ErrDecode, "msg %v: %v", msg, err) } - p.fcServer.GotReply(resp.ReqID, resp.BV) + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) deliverMsg = &Msg{ MsgType: MsgHelperTrieProofs, ReqID: resp.ReqID, Obj: resp.Data, } - case SendTxMsg: - if pm.txpool == nil { - return errResp(ErrRequestRejected, "") - } - // Transactions arrived, parse all of them and deliver to the pool - var txs []*types.Transaction - if err := msg.Decode(&txs); err != nil { - return errResp(ErrDecode, "msg %v: %v", msg, err) - } - reqCnt := len(txs) - if reject(uint64(reqCnt), MaxTxSend) { - return errResp(ErrRequestRejected, "") - } - pm.txpool.AddRemotes(txs) - - _, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - case SendTxV2Msg: if pm.txpool == nil { return errResp(ErrRequestRejected, "") @@ -1039,30 +1037,33 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { return errResp(ErrDecode, "msg %v: %v", msg, err) } reqCnt := len(req.Txs) - if reject(uint64(reqCnt), MaxTxSend) { - return errResp(ErrRequestRejected, "") - } - - hashes := make([]common.Hash, len(req.Txs)) - for i, tx := range req.Txs { - hashes[i] = tx.Hash() - } - stats := pm.txStatus(hashes) - for i, stat := range stats { - if stat.Status == core.TxStatusUnknown { - if errs := pm.txpool.AddRemotes([]*types.Transaction{req.Txs[i]}); errs[0] != nil { - stats[i].Error = errs[0].Error() - continue + if accept(req.ReqID, uint64(reqCnt), MaxTxSend) { + go func() { + stats := make([]light.TxStatus, len(req.Txs)) + for i, tx := range req.Txs { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + hash := tx.Hash() + stats[i] = pm.txStatus(hash) + if stats[i].Status == core.TxStatusUnknown { + addFn := pm.txpool.AddRemotes + // Add txs synchronously for testing purpose + if pm.addTxsSync { + addFn = pm.txpool.AddRemotesSync + } + if errs := addFn([]*types.Transaction{tx}); errs[0] != nil { + stats[i].Error = errs[0].Error() + continue + } + stats[i] = pm.txStatus(hash) + } } - stats[i] = pm.txStatus([]common.Hash{hashes[i]})[0] - } + sendResponse(req.ReqID, uint64(reqCnt), p.ReplyTxStatus(req.ReqID, stats), task.done()) + }() } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - - return p.SendTxStatus(req.ReqID, bv, stats) - case GetTxStatusMsg: if pm.txpool == nil { return errResp(ErrUnexpectedResponse, "") @@ -1076,13 +1077,19 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { return errResp(ErrDecode, "msg %v: %v", msg, err) } reqCnt := len(req.Hashes) - if reject(uint64(reqCnt), MaxTxStatus) { - return errResp(ErrRequestRejected, "") + if accept(req.ReqID, uint64(reqCnt), MaxTxStatus) { + go func() { + stats := make([]light.TxStatus, len(req.Hashes)) + for i, hash := range req.Hashes { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + stats[i] = pm.txStatus(hash) + } + sendResponse(req.ReqID, uint64(reqCnt), p.ReplyTxStatus(req.ReqID, stats), task.done()) + }() } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - - return p.SendTxStatus(req.ReqID, bv, pm.txStatus(req.Hashes)) case TxStatusMsg: if pm.odr == nil { @@ -1092,13 +1099,40 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { p.Log().Trace("Received tx status response") var resp struct { ReqID, BV uint64 - Status []txStatus + Status []light.TxStatus } if err := msg.Decode(&resp); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - p.fcServer.GotReply(resp.ReqID, resp.BV) + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) + + p.Log().Trace("Received helper trie proof response") + deliverMsg = &Msg{ + MsgType: MsgTxStatus, + ReqID: resp.ReqID, + Obj: resp.Status, + } + + case StopMsg: + if pm.odr == nil { + return errResp(ErrUnexpectedResponse, "") + } + p.freezeServer(true) + pm.retriever.frozen(p) + p.Log().Warn("Service stopped") + + case ResumeMsg: + if pm.odr == nil { + return errResp(ErrUnexpectedResponse, "") + } + var bv uint64 + if err := msg.Decode(&bv); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + p.fcServer.ResumeFreeze(bv) + p.freezeServer(false) + p.Log().Warn("Service resumed") default: p.Log().Trace("Received unknown message", "code", msg.Code) @@ -1114,12 +1148,17 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } } } + // If the client has made too much invalid request(e.g. request a non-exist data), + // reject them to prevent SPAM attack. + if atomic.LoadUint32(&p.invalidCount) > maxRequestErrors { + return errTooManyInvalidRequest + } return nil } // getAccount retrieves an account from the state based at root. -func (pm *ProtocolManager) getAccount(statedb *state.StateDB, root, hash common.Hash) (state.Account, error) { - trie, err := trie.New(root, statedb.Database().TrieDB()) +func (pm *ProtocolManager) getAccount(triedb *trie.Database, root, hash common.Hash) (state.Account, error) { + trie, err := trie.New(root, triedb) if err != nil { return state.Account{}, err } @@ -1138,9 +1177,8 @@ func (pm *ProtocolManager) getAccount(statedb *state.StateDB, root, hash common. func (pm *ProtocolManager) getHelperTrie(id uint, idx uint64) (common.Hash, string) { switch id { case htCanonical: - idxV1 := (idx+1)*(pm.iConfig.PairChtSize/pm.iConfig.ChtSize) - 1 - sectionHead := rawdb.ReadCanonicalHash(pm.chainDb, (idxV1+1)*pm.iConfig.ChtSize-1) - return light.GetChtRoot(pm.chainDb, idxV1, sectionHead), light.ChtTablePrefix + sectionHead := rawdb.ReadCanonicalHash(pm.chainDb, (idx+1)*pm.iConfig.ChtSize-1) + return light.GetChtRoot(pm.chainDb, idx, sectionHead), light.ChtTablePrefix case htBloomBits: sectionHead := rawdb.ReadCanonicalHash(pm.chainDb, (idx+1)*pm.iConfig.BloomTrieSize-1) return light.GetBloomTrieRoot(pm.chainDb, idx, sectionHead), light.BloomTrieTablePrefix @@ -1158,21 +1196,17 @@ func (pm *ProtocolManager) getHelperTrieAuxData(req HelperTrieReq) []byte { return nil } -func (pm *ProtocolManager) txStatus(hashes []common.Hash) []txStatus { - stats := make([]txStatus, len(hashes)) - for i, stat := range pm.txpool.Status(hashes) { - // Save the status we've got from the transaction pool - stats[i].Status = stat - - // If the transaction is unknown to the pool, try looking it up locally - if stat == core.TxStatusUnknown { - if block, number, index := rawdb.ReadTxLookupEntry(pm.chainDb, hashes[i]); block != (common.Hash{}) { - stats[i].Status = core.TxStatusIncluded - stats[i].Lookup = &rawdb.TxLookupEntry{BlockHash: block, BlockIndex: number, Index: index} - } +func (pm *ProtocolManager) txStatus(hash common.Hash) light.TxStatus { + var stat light.TxStatus + stat.Status = pm.txpool.Status([]common.Hash{hash})[0] + // If the transaction is unknown to the pool, try looking it up locally + if stat.Status == core.TxStatusUnknown { + if tx, blockHash, blockNumber, txIndex := rawdb.ReadTransaction(pm.chainDb, hash); tx != nil { + stat.Status = core.TxStatusIncluded + stat.Lookup = &rawdb.LegacyTxLookupEntry{BlockHash: blockHash, BlockIndex: blockNumber, Index: txIndex} } } - return stats + return stat } // downloaderPeerNotify implements peerSetNotify @@ -1200,7 +1234,7 @@ func (pc *peerConnection) RequestHeadersByHash(origin common.Hash, amount int, s request: func(dp distPeer) func() { peer := dp.(*peer) cost := peer.GetRequestCost(GetBlockHeadersMsg, amount) - peer.fcServer.QueueRequest(reqID, cost) + peer.fcServer.QueuedRequest(reqID, cost) return func() { peer.RequestHeadersByHash(reqID, cost, origin, amount, skip, reverse) } }, } @@ -1224,7 +1258,7 @@ func (pc *peerConnection) RequestHeadersByNumber(origin uint64, amount int, skip request: func(dp distPeer) func() { peer := dp.(*peer) cost := peer.GetRequestCost(GetBlockHeadersMsg, amount) - peer.fcServer.QueueRequest(reqID, cost) + peer.fcServer.QueuedRequest(reqID, cost) return func() { peer.RequestHeadersByNumber(reqID, cost, origin, amount, skip, reverse) } }, } diff --git a/les/handler_test.go b/les/handler_test.go index 43be7f41b11d..dae583f6df3d 100644 --- a/les/handler_test.go +++ b/les/handler_test.go @@ -24,13 +24,13 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/light" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" @@ -47,7 +47,6 @@ func expectResponse(r p2p.MsgReader, msgcode, reqID, bv uint64, data interface{} } // Tests that block headers can be retrieved from a remote chain based on user queries. -func TestGetBlockHeadersLes1(t *testing.T) { testGetBlockHeaders(t, 1) } func TestGetBlockHeadersLes2(t *testing.T) { testGetBlockHeaders(t, 2) } func testGetBlockHeaders(t *testing.T, protocol int) { @@ -160,7 +159,7 @@ func testGetBlockHeaders(t *testing.T, protocol int) { var reqID uint64 for i, tt := range tests { // Collect the headers to expect in the response - headers := []*types.Header{} + var headers []*types.Header for _, hash := range tt.expect { headers = append(headers, bc.GetHeaderByHash(hash)) } @@ -175,7 +174,6 @@ func testGetBlockHeaders(t *testing.T, protocol int) { } // Tests that block contents can be retrieved from a remote chain based on their hashes. -func TestGetBlockBodiesLes1(t *testing.T) { testGetBlockBodies(t, 1) } func TestGetBlockBodiesLes2(t *testing.T) { testGetBlockBodies(t, 2) } func testGetBlockBodies(t *testing.T, protocol int) { @@ -214,8 +212,9 @@ func testGetBlockBodies(t *testing.T, protocol int) { var reqID uint64 for i, tt := range tests { // Collect the hashes to request, and the response to expect - hashes, seen := []common.Hash{}, make(map[int64]bool) - bodies := []*types.Body{} + var hashes []common.Hash + seen := make(map[int64]bool) + var bodies []*types.Body for j := 0; j < tt.random; j++ { for { @@ -250,7 +249,6 @@ func testGetBlockBodies(t *testing.T, protocol int) { } // Tests that the contract codes can be retrieved based on account addresses. -func TestGetCodeLes1(t *testing.T) { testGetCode(t, 1) } func TestGetCodeLes2(t *testing.T) { testGetCode(t, 2) } func testGetCode(t *testing.T, protocol int) { @@ -261,7 +259,6 @@ func testGetCode(t *testing.T, protocol int) { var codereqs []*CodeReq var codes [][]byte - for i := uint64(0); i <= bc.CurrentBlock().NumberU64(); i++ { header := bc.GetHeaderByNumber(i) req := &CodeReq{ @@ -281,8 +278,32 @@ func testGetCode(t *testing.T, protocol int) { } } +// Tests that the stale contract codes can't be retrieved based on account addresses. +func TestGetStaleCodeLes2(t *testing.T) { testGetStaleCode(t, 2) } +func TestGetStaleCodeLes3(t *testing.T) { testGetStaleCode(t, 3) } + +func testGetStaleCode(t *testing.T, protocol int) { + server, tearDown := newServerEnv(t, core.TriesInMemory+4, protocol, nil) + defer tearDown() + bc := server.pm.blockchain.(*core.BlockChain) + + check := func(number uint64, expected [][]byte) { + req := &CodeReq{ + BHash: bc.GetHeaderByNumber(number).Hash(), + AccKey: crypto.Keccak256(testContractAddr[:]), + } + cost := server.tPeer.GetRequestCost(GetCodeMsg, 1) + sendRequest(server.tPeer.app, GetCodeMsg, 42, cost, []*CodeReq{req}) + if err := expectResponse(server.tPeer.app, CodeMsg, 42, testBufLimit, expected); err != nil { + t.Errorf("codes mismatch: %v", err) + } + } + check(0, [][]byte{}) // Non-exist contract + check(testContractDeployed, [][]byte{}) // Stale contract + check(bc.CurrentHeader().Number.Uint64(), [][]byte{testContractCodeDeployed}) // Fresh contract +} + // Tests that the transaction receipts can be retrieved based on hashes. -func TestGetReceiptLes1(t *testing.T) { testGetReceipt(t, 1) } func TestGetReceiptLes2(t *testing.T) { testGetReceipt(t, 2) } func testGetReceipt(t *testing.T, protocol int) { @@ -292,12 +313,13 @@ func testGetReceipt(t *testing.T, protocol int) { bc := server.pm.blockchain.(*core.BlockChain) // Collect the hashes to request, and the response to expect - hashes, receipts := []common.Hash{}, []types.Receipts{} + var receipts []types.Receipts + var hashes []common.Hash for i := uint64(0); i <= bc.CurrentBlock().NumberU64(); i++ { block := bc.GetBlockByNumber(i) hashes = append(hashes, block.Hash()) - receipts = append(receipts, rawdb.ReadReceipts(server.db, block.Hash(), block.NumberU64())) + receipts = append(receipts, rawdb.ReadRawReceipts(server.db, block.Hash(), block.NumberU64())) } // Send the hash request and verify the response cost := server.tPeer.GetRequestCost(GetReceiptsMsg, len(hashes)) @@ -308,7 +330,6 @@ func testGetReceipt(t *testing.T, protocol int) { } // Tests that trie merkle proofs can be retrieved -func TestGetProofsLes1(t *testing.T) { testGetProofs(t, 1) } func TestGetProofsLes2(t *testing.T) { testGetProofs(t, 2) } func testGetProofs(t *testing.T, protocol int) { @@ -317,17 +338,13 @@ func testGetProofs(t *testing.T, protocol int) { defer tearDown() bc := server.pm.blockchain.(*core.BlockChain) - var ( - proofreqs []ProofReq - proofsV1 [][]rlp.RawValue - ) + var proofreqs []ProofReq proofsV2 := light.NewNodeSet() - accounts := []common.Address{testBankAddress, acc1Addr, acc2Addr, {}} + accounts := []common.Address{bankAddr, userAddr1, userAddr2, {}} for i := uint64(0); i <= bc.CurrentBlock().NumberU64(); i++ { header := bc.GetHeaderByNumber(i) - root := header.Root - trie, _ := trie.New(root, trie.NewDatabase(server.db)) + trie, _ := trie.New(header.Root, trie.NewDatabase(server.db)) for _, acc := range accounts { req := ProofReq{ @@ -335,112 +352,98 @@ func testGetProofs(t *testing.T, protocol int) { Key: crypto.Keccak256(acc[:]), } proofreqs = append(proofreqs, req) - - switch protocol { - case 1: - var proof light.NodeList - trie.Prove(crypto.Keccak256(acc[:]), 0, &proof) - proofsV1 = append(proofsV1, proof) - case 2: - trie.Prove(crypto.Keccak256(acc[:]), 0, proofsV2) - } + trie.Prove(crypto.Keccak256(acc[:]), 0, proofsV2) } } // Send the proof request and verify the response - switch protocol { - case 1: - cost := server.tPeer.GetRequestCost(GetProofsV1Msg, len(proofreqs)) - sendRequest(server.tPeer.app, GetProofsV1Msg, 42, cost, proofreqs) - if err := expectResponse(server.tPeer.app, ProofsV1Msg, 42, testBufLimit, proofsV1); err != nil { - t.Errorf("proofs mismatch: %v", err) + cost := server.tPeer.GetRequestCost(GetProofsV2Msg, len(proofreqs)) + sendRequest(server.tPeer.app, GetProofsV2Msg, 42, cost, proofreqs) + if err := expectResponse(server.tPeer.app, ProofsV2Msg, 42, testBufLimit, proofsV2.NodeList()); err != nil { + t.Errorf("proofs mismatch: %v", err) + } +} + +// Tests that the stale contract codes can't be retrieved based on account addresses. +func TestGetStaleProofLes2(t *testing.T) { testGetStaleProof(t, 2) } +func TestGetStaleProofLes3(t *testing.T) { testGetStaleProof(t, 3) } + +func testGetStaleProof(t *testing.T, protocol int) { + server, tearDown := newServerEnv(t, core.TriesInMemory+4, protocol, nil) + defer tearDown() + bc := server.pm.blockchain.(*core.BlockChain) + + check := func(number uint64, wantOK bool) { + var ( + header = bc.GetHeaderByNumber(number) + account = crypto.Keccak256(userAddr1.Bytes()) + ) + req := &ProofReq{ + BHash: header.Hash(), + Key: account, } - case 2: - cost := server.tPeer.GetRequestCost(GetProofsV2Msg, len(proofreqs)) - sendRequest(server.tPeer.app, GetProofsV2Msg, 42, cost, proofreqs) - if err := expectResponse(server.tPeer.app, ProofsV2Msg, 42, testBufLimit, proofsV2.NodeList()); err != nil { - t.Errorf("proofs mismatch: %v", err) + cost := server.tPeer.GetRequestCost(GetProofsV2Msg, 1) + sendRequest(server.tPeer.app, GetProofsV2Msg, 42, cost, []*ProofReq{req}) + + var expected []rlp.RawValue + if wantOK { + proofsV2 := light.NewNodeSet() + t, _ := trie.New(header.Root, trie.NewDatabase(server.db)) + t.Prove(account, 0, proofsV2) + expected = proofsV2.NodeList() + } + if err := expectResponse(server.tPeer.app, ProofsV2Msg, 42, testBufLimit, expected); err != nil { + t.Errorf("codes mismatch: %v", err) } } + check(0, false) // Non-exist proof + check(2, false) // Stale proof + check(bc.CurrentHeader().Number.Uint64(), true) // Fresh proof } // Tests that CHT proofs can be correctly retrieved. -func TestGetCHTProofsLes1(t *testing.T) { testGetCHTProofs(t, 1) } func TestGetCHTProofsLes2(t *testing.T) { testGetCHTProofs(t, 2) } func testGetCHTProofs(t *testing.T, protocol int) { config := light.TestServerIndexerConfig - frequency := config.ChtSize - if protocol == 2 { - frequency = config.PairChtSize - } waitIndexers := func(cIndexer, bIndexer, btIndexer *core.ChainIndexer) { - expectSections := frequency / config.ChtSize for { cs, _, _ := cIndexer.Sections() - bs, _, _ := bIndexer.Sections() - if cs >= expectSections && bs >= expectSections { + if cs >= 1 { break } time.Sleep(10 * time.Millisecond) } } - server, tearDown := newServerEnv(t, int(frequency+config.ChtConfirms), protocol, waitIndexers) + server, tearDown := newServerEnv(t, int(config.ChtSize+config.ChtConfirms), protocol, waitIndexers) defer tearDown() bc := server.pm.blockchain.(*core.BlockChain) // Assemble the proofs from the different protocols - header := bc.GetHeaderByNumber(frequency - 1) + header := bc.GetHeaderByNumber(config.ChtSize - 1) rlp, _ := rlp.EncodeToBytes(header) key := make([]byte, 8) - binary.BigEndian.PutUint64(key, frequency-1) + binary.BigEndian.PutUint64(key, config.ChtSize-1) - proofsV1 := []ChtResp{{ - Header: header, - }} proofsV2 := HelperTrieResps{ AuxData: [][]byte{rlp}, } - switch protocol { - case 1: - root := light.GetChtRoot(server.db, 0, bc.GetHeaderByNumber(frequency-1).Hash()) - trie, _ := trie.New(root, trie.NewDatabase(ethdb.NewTable(server.db, light.ChtTablePrefix))) - - var proof light.NodeList - trie.Prove(key, 0, &proof) - proofsV1[0].Proof = proof - - case 2: - root := light.GetChtRoot(server.db, (frequency/config.ChtSize)-1, bc.GetHeaderByNumber(frequency-1).Hash()) - trie, _ := trie.New(root, trie.NewDatabase(ethdb.NewTable(server.db, light.ChtTablePrefix))) - trie.Prove(key, 0, &proofsV2.Proofs) - } + root := light.GetChtRoot(server.db, 0, bc.GetHeaderByNumber(config.ChtSize-1).Hash()) + trie, _ := trie.New(root, trie.NewDatabase(rawdb.NewTable(server.db, light.ChtTablePrefix))) + trie.Prove(key, 0, &proofsV2.Proofs) // Assemble the requests for the different protocols - requestsV1 := []ChtReq{{ - ChtNum: frequency / config.ChtSize, - BlockNum: frequency - 1, - }} requestsV2 := []HelperTrieReq{{ Type: htCanonical, - TrieIdx: frequency/config.PairChtSize - 1, + TrieIdx: 0, Key: key, AuxReq: auxHeader, }} // Send the proof request and verify the response - switch protocol { - case 1: - cost := server.tPeer.GetRequestCost(GetHeaderProofsMsg, len(requestsV1)) - sendRequest(server.tPeer.app, GetHeaderProofsMsg, 42, cost, requestsV1) - if err := expectResponse(server.tPeer.app, HeaderProofsMsg, 42, testBufLimit, proofsV1); err != nil { - t.Errorf("proofs mismatch: %v", err) - } - case 2: - cost := server.tPeer.GetRequestCost(GetHelperTrieProofsMsg, len(requestsV2)) - sendRequest(server.tPeer.app, GetHelperTrieProofsMsg, 42, cost, requestsV2) - if err := expectResponse(server.tPeer.app, HelperTrieProofsMsg, 42, testBufLimit, proofsV2); err != nil { - t.Errorf("proofs mismatch: %v", err) - } + cost := server.tPeer.GetRequestCost(GetHelperTrieProofsMsg, len(requestsV2)) + sendRequest(server.tPeer.app, GetHelperTrieProofsMsg, 42, cost, requestsV2) + if err := expectResponse(server.tPeer.app, HelperTrieProofsMsg, 42, testBufLimit, proofsV2); err != nil { + t.Errorf("proofs mismatch: %v", err) } } @@ -450,10 +453,8 @@ func TestGetBloombitsProofs(t *testing.T) { waitIndexers := func(cIndexer, bIndexer, btIndexer *core.ChainIndexer) { for { - cs, _, _ := cIndexer.Sections() - bs, _, _ := bIndexer.Sections() bts, _, _ := btIndexer.Sections() - if cs >= 8 && bs >= 8 && bts >= 1 { + if bts >= 1 { break } time.Sleep(10 * time.Millisecond) @@ -480,7 +481,7 @@ func TestGetBloombitsProofs(t *testing.T) { var proofs HelperTrieResps root := light.GetBloomTrieRoot(server.db, 0, bc.GetHeaderByNumber(config.BloomTrieSize-1).Hash()) - trie, _ := trie.New(root, trie.NewDatabase(ethdb.NewTable(server.db, light.BloomTrieTablePrefix))) + trie, _ := trie.New(root, trie.NewDatabase(rawdb.NewTable(server.db, light.BloomTrieTablePrefix))) trie.Prove(key, 0, &proofs.Proofs) // Send the proof request and verify the response @@ -493,28 +494,30 @@ func TestGetBloombitsProofs(t *testing.T) { } func TestTransactionStatusLes2(t *testing.T) { - db := ethdb.NewMemDatabase() - pm := newTestProtocolManagerMust(t, false, 0, nil, nil, nil, db) - chain := pm.blockchain.(*core.BlockChain) + server, tearDown := newServerEnv(t, 0, 2, nil) + defer tearDown() + server.pm.addTxsSync = true + + chain := server.pm.blockchain.(*core.BlockChain) config := core.DefaultTxPoolConfig config.Journal = "" txpool := core.NewTxPool(config, params.TestChainConfig, chain) - pm.txpool = txpool - peer, _ := newTestPeer(t, "peer", 2, pm, true) + server.pm.txpool = txpool + peer, _ := newTestPeer(t, "peer", 2, server.pm, true, 0) defer peer.close() var reqID uint64 - test := func(tx *types.Transaction, send bool, expStatus txStatus) { + test := func(tx *types.Transaction, send bool, expStatus light.TxStatus) { reqID++ if send { - cost := peer.GetRequestCost(SendTxV2Msg, 1) - sendRequest(peer.app, SendTxV2Msg, reqID, cost, types.Transactions{tx}) + cost := server.tPeer.GetRequestCost(SendTxV2Msg, 1) + sendRequest(server.tPeer.app, SendTxV2Msg, reqID, cost, types.Transactions{tx}) } else { - cost := peer.GetRequestCost(GetTxStatusMsg, 1) - sendRequest(peer.app, GetTxStatusMsg, reqID, cost, []common.Hash{tx.Hash()}) + cost := server.tPeer.GetRequestCost(GetTxStatusMsg, 1) + sendRequest(server.tPeer.app, GetTxStatusMsg, reqID, cost, []common.Hash{tx.Hash()}) } - if err := expectResponse(peer.app, TxStatusMsg, reqID, testBufLimit, []txStatus{expStatus}); err != nil { + if err := expectResponse(server.tPeer.app, TxStatusMsg, reqID, testBufLimit, []light.TxStatus{expStatus}); err != nil { t.Errorf("transaction status mismatch") } } @@ -522,24 +525,24 @@ func TestTransactionStatusLes2(t *testing.T) { signer := types.HomesteadSigner{} // test error status by sending an underpriced transaction - tx0, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, testBankKey) - test(tx0, true, txStatus{Status: core.TxStatusUnknown, Error: core.ErrUnderpriced.Error()}) + tx0, _ := types.SignTx(types.NewTransaction(0, userAddr1, big.NewInt(10000), params.TxGas, nil, nil), signer, bankKey) + test(tx0, true, light.TxStatus{Status: core.TxStatusUnknown, Error: core.ErrUnderpriced.Error()}) - tx1, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, testBankKey) - test(tx1, false, txStatus{Status: core.TxStatusUnknown}) // query before sending, should be unknown - test(tx1, true, txStatus{Status: core.TxStatusPending}) // send valid processable tx, should return pending - test(tx1, true, txStatus{Status: core.TxStatusPending}) // adding it again should not return an error + tx1, _ := types.SignTx(types.NewTransaction(0, userAddr1, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, bankKey) + test(tx1, false, light.TxStatus{Status: core.TxStatusUnknown}) // query before sending, should be unknown + test(tx1, true, light.TxStatus{Status: core.TxStatusPending}) // send valid processable tx, should return pending + test(tx1, true, light.TxStatus{Status: core.TxStatusPending}) // adding it again should not return an error - tx2, _ := types.SignTx(types.NewTransaction(1, acc1Addr, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, testBankKey) - tx3, _ := types.SignTx(types.NewTransaction(2, acc1Addr, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, testBankKey) + tx2, _ := types.SignTx(types.NewTransaction(1, userAddr1, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, bankKey) + tx3, _ := types.SignTx(types.NewTransaction(2, userAddr1, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, bankKey) // send transactions in the wrong order, tx3 should be queued - test(tx3, true, txStatus{Status: core.TxStatusQueued}) - test(tx2, true, txStatus{Status: core.TxStatusPending}) + test(tx3, true, light.TxStatus{Status: core.TxStatusQueued}) + test(tx2, true, light.TxStatus{Status: core.TxStatusPending}) // query again, now tx3 should be pending too - test(tx3, false, txStatus{Status: core.TxStatusPending}) + test(tx3, false, light.TxStatus{Status: core.TxStatusPending}) // generate and add a block with tx1 and tx2 included - gchain, _ := core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), db, 1, func(i int, block *core.BlockGen) { + gchain, _ := core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), server.db, 1, func(i int, block *core.BlockGen) { block.AddTx(tx1) block.AddTx(tx2) }) @@ -558,12 +561,12 @@ func TestTransactionStatusLes2(t *testing.T) { } // check if their status is included now - block1hash := rawdb.ReadCanonicalHash(db, 1) - test(tx1, false, txStatus{Status: core.TxStatusIncluded, Lookup: &rawdb.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 0}}) - test(tx2, false, txStatus{Status: core.TxStatusIncluded, Lookup: &rawdb.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}}) + block1hash := rawdb.ReadCanonicalHash(server.db, 1) + test(tx1, false, light.TxStatus{Status: core.TxStatusIncluded, Lookup: &rawdb.LegacyTxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 0}}) + test(tx2, false, light.TxStatus{Status: core.TxStatusIncluded, Lookup: &rawdb.LegacyTxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}}) // create a reorg that rolls them back - gchain, _ = core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), db, 2, func(i int, block *core.BlockGen) {}) + gchain, _ = core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), server.db, 2, func(i int, block *core.BlockGen) {}) if _, err := chain.InsertChain(gchain); err != nil { panic(err) } @@ -578,6 +581,55 @@ func TestTransactionStatusLes2(t *testing.T) { t.Fatalf("pending count mismatch: have %d, want 3", pending) } // check if their status is pending again - test(tx1, false, txStatus{Status: core.TxStatusPending}) - test(tx2, false, txStatus{Status: core.TxStatusPending}) + test(tx1, false, light.TxStatus{Status: core.TxStatusPending}) + test(tx2, false, light.TxStatus{Status: core.TxStatusPending}) +} + +func TestStopResumeLes3(t *testing.T) { + db := rawdb.NewMemoryDatabase() + clock := &mclock.Simulated{} + testCost := testBufLimit / 10 + pm, _, err := newTestProtocolManager(false, 0, nil, nil, nil, db, nil, 0, testCost, clock) + if err != nil { + t.Fatalf("Failed to create protocol manager: %v", err) + } + peer, _ := newTestPeer(t, "peer", 3, pm, true, testCost) + defer peer.close() + + expBuf := testBufLimit + var reqID uint64 + + header := pm.blockchain.CurrentHeader() + req := func() { + reqID++ + sendRequest(peer.app, GetBlockHeadersMsg, reqID, testCost, &getBlockHeadersData{Origin: hashOrNumber{Hash: header.Hash()}, Amount: 1}) + } + + for i := 1; i <= 5; i++ { + // send requests while we still have enough buffer and expect a response + for expBuf >= testCost { + req() + expBuf -= testCost + if err := expectResponse(peer.app, BlockHeadersMsg, reqID, expBuf, []*types.Header{header}); err != nil { + t.Fatalf("expected response and failed: %v", err) + } + } + // send some more requests in excess and expect a single StopMsg + c := i + for c > 0 { + req() + c-- + } + if err := p2p.ExpectMsg(peer.app, StopMsg, nil); err != nil { + t.Errorf("expected StopMsg and failed: %v", err) + } + // wait until the buffer is recharged by half of the limit + wait := testBufLimit / testBufRecharge / 2 + clock.Run(time.Millisecond * time.Duration(wait)) + // expect a ResumeMsg with the partially recharged buffer value + expBuf += testBufRecharge * wait + if err := p2p.ExpectMsg(peer.app, ResumeMsg, expBuf); err != nil { + t.Errorf("expected ResumeMsg and failed: %v", err) + } + } } diff --git a/les/helper_test.go b/les/helper_test.go index b46d41f174c8..fb9117ad1e17 100644 --- a/les/helper_test.go +++ b/les/helper_test.go @@ -20,17 +20,22 @@ package les import ( + "context" "crypto/rand" "math/big" "sync" "testing" "time" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle/contract" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethdb" @@ -43,14 +48,14 @@ import ( ) var ( - testBankKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - testBankAddress = crypto.PubkeyToAddress(testBankKey.PublicKey) - testBankFunds = big.NewInt(1000000000000000000) + bankKey, _ = crypto.GenerateKey() + bankAddr = crypto.PubkeyToAddress(bankKey.PublicKey) + bankFunds = big.NewInt(1000000000000000000) - acc1Key, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") - acc2Key, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") - acc1Addr = crypto.PubkeyToAddress(acc1Key.PublicKey) - acc2Addr = crypto.PubkeyToAddress(acc2Key.PublicKey) + userKey1, _ = crypto.GenerateKey() + userKey2, _ = crypto.GenerateKey() + userAddr1 = crypto.PubkeyToAddress(userKey1.PublicKey) + userAddr2 = crypto.PubkeyToAddress(userKey2.PublicKey) testContractCode = common.Hex2Bytes("606060405260cc8060106000396000f360606040526000357c01000000000000000000000000000000000000000000000000000000009004806360cd2685146041578063c16431b914606b57603f565b005b6055600480803590602001909190505060a9565b6040518082815260200191505060405180910390f35b60886004808035906020019091908035906020019091905050608a565b005b80600060005083606481101560025790900160005b50819055505b5050565b6000600060005082606481101560025790900160005b5054905060c7565b91905056") testContractAddr common.Address @@ -58,9 +63,23 @@ var ( testContractDeployed = uint64(2) testEventEmitterCode = common.Hex2Bytes("60606040523415600e57600080fd5b7f57050ab73f6b9ebdd9f76b8d4997793f48cf956e965ee070551b9ca0bb71584e60405160405180910390a160358060476000396000f3006060604052600080fd00a165627a7a723058203f727efcad8b5811f8cb1fc2620ce5e8c63570d697aef968172de296ea3994140029") - testEventEmitterAddr common.Address - testBufLimit = uint64(100) + // Checkpoint registrar relative + registrarAddr common.Address + signerKey, _ = crypto.GenerateKey() + signerAddr = crypto.PubkeyToAddress(signerKey.PublicKey) +) + +var ( + // The block frequency for creating checkpoint(only used in test) + sectionSize = big.NewInt(512) + + // The number of confirmations needed to generate a checkpoint(only used in test). + processConfirms = big.NewInt(4) + + // + testBufLimit = uint64(1000000) + testBufRecharge = uint64(1000) ) /* @@ -78,134 +97,166 @@ contract test { } */ -func testChainGen(i int, block *core.BlockGen) { - signer := types.HomesteadSigner{} - - switch i { - case 0: - // In block 1, the test bank sends account #1 some ether. - tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, testBankKey) - block.AddTx(tx) - case 1: - // In block 2, the test bank sends some more ether to account #1. - // acc1Addr passes it on to account #2. - // acc1Addr creates a test contract. - // acc1Addr creates a test event. - nonce := block.TxNonce(acc1Addr) - - tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, testBankKey) - tx2, _ := types.SignTx(types.NewTransaction(nonce, acc2Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, acc1Key) - tx3, _ := types.SignTx(types.NewContractCreation(nonce+1, big.NewInt(0), 200000, big.NewInt(0), testContractCode), signer, acc1Key) - testContractAddr = crypto.CreateAddress(acc1Addr, nonce+1) - tx4, _ := types.SignTx(types.NewContractCreation(nonce+2, big.NewInt(0), 200000, big.NewInt(0), testEventEmitterCode), signer, acc1Key) - testEventEmitterAddr = crypto.CreateAddress(acc1Addr, nonce+2) - block.AddTx(tx1) - block.AddTx(tx2) - block.AddTx(tx3) - block.AddTx(tx4) - case 2: - // Block 3 is empty but was mined by account #2. - block.SetCoinbase(acc2Addr) - block.SetExtra([]byte("yeehaw")) - data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001") - tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), 100000, nil, data), signer, testBankKey) - block.AddTx(tx) - case 3: - // Block 4 includes blocks 2 and 3 as uncle headers (with modified extra data). - b2 := block.PrevBlock(1).Header() - b2.Extra = []byte("foo") - block.AddUncle(b2) - b3 := block.PrevBlock(2).Header() - b3.Extra = []byte("foo") - block.AddUncle(b3) - data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002") - tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), 100000, nil, data), signer, testBankKey) - block.AddTx(tx) +// prepareTestchain pre-commits specified number customized blocks into chain. +func prepareTestchain(n int, backend *backends.SimulatedBackend) { + var ( + ctx = context.Background() + signer = types.HomesteadSigner{} + ) + for i := 0; i < n; i++ { + switch i { + case 0: + // deploy checkpoint contract + registrarAddr, _, _, _ = contract.DeployCheckpointOracle(bind.NewKeyedTransactor(bankKey), backend, []common.Address{signerAddr}, sectionSize, processConfirms, big.NewInt(1)) + // bankUser transfers some ether to user1 + nonce, _ := backend.PendingNonceAt(ctx, bankAddr) + tx, _ := types.SignTx(types.NewTransaction(nonce, userAddr1, big.NewInt(10000), params.TxGas, nil, nil), signer, bankKey) + backend.SendTransaction(ctx, tx) + case 1: + bankNonce, _ := backend.PendingNonceAt(ctx, bankAddr) + userNonce1, _ := backend.PendingNonceAt(ctx, userAddr1) + + // bankUser transfers more ether to user1 + tx1, _ := types.SignTx(types.NewTransaction(bankNonce, userAddr1, big.NewInt(1000), params.TxGas, nil, nil), signer, bankKey) + backend.SendTransaction(ctx, tx1) + + // user1 relays ether to user2 + tx2, _ := types.SignTx(types.NewTransaction(userNonce1, userAddr2, big.NewInt(1000), params.TxGas, nil, nil), signer, userKey1) + backend.SendTransaction(ctx, tx2) + + // user1 deploys a test contract + tx3, _ := types.SignTx(types.NewContractCreation(userNonce1+1, big.NewInt(0), 200000, big.NewInt(0), testContractCode), signer, userKey1) + backend.SendTransaction(ctx, tx3) + testContractAddr = crypto.CreateAddress(userAddr1, userNonce1+1) + + // user1 deploys a event contract + tx4, _ := types.SignTx(types.NewContractCreation(userNonce1+2, big.NewInt(0), 200000, big.NewInt(0), testEventEmitterCode), signer, userKey1) + backend.SendTransaction(ctx, tx4) + case 2: + // bankUser transfer some ether to signer + bankNonce, _ := backend.PendingNonceAt(ctx, bankAddr) + tx1, _ := types.SignTx(types.NewTransaction(bankNonce, signerAddr, big.NewInt(1000000000), params.TxGas, nil, nil), signer, bankKey) + backend.SendTransaction(ctx, tx1) + + // invoke test contract + data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001") + tx2, _ := types.SignTx(types.NewTransaction(bankNonce+1, testContractAddr, big.NewInt(0), 100000, nil, data), signer, bankKey) + backend.SendTransaction(ctx, tx2) + case 3: + // invoke test contract + bankNonce, _ := backend.PendingNonceAt(ctx, bankAddr) + data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002") + tx, _ := types.SignTx(types.NewTransaction(bankNonce, testContractAddr, big.NewInt(0), 100000, nil, data), signer, bankKey) + backend.SendTransaction(ctx, tx) + } + backend.Commit() } } // testIndexers creates a set of indexers with specified params for testing purpose. -func testIndexers(db ethdb.Database, odr light.OdrBackend, iConfig *light.IndexerConfig) (*core.ChainIndexer, *core.ChainIndexer, *core.ChainIndexer) { - chtIndexer := light.NewChtIndexer(db, odr, iConfig.ChtSize, iConfig.ChtConfirms) - bloomIndexer := eth.NewBloomIndexer(db, iConfig.BloomSize, iConfig.BloomConfirms) - bloomTrieIndexer := light.NewBloomTrieIndexer(db, odr, iConfig.BloomSize, iConfig.BloomTrieSize) - bloomIndexer.AddChildIndexer(bloomTrieIndexer) - return chtIndexer, bloomIndexer, bloomTrieIndexer -} - -func testRCL() RequestCostList { - cl := make(RequestCostList, len(reqList)) - for i, code := range reqList { - cl[i].MsgCode = code - cl[i].BaseCost = 0 - cl[i].ReqCost = 0 - } - return cl +func testIndexers(db ethdb.Database, odr light.OdrBackend, config *light.IndexerConfig) []*core.ChainIndexer { + var indexers [3]*core.ChainIndexer + indexers[0] = light.NewChtIndexer(db, odr, config.ChtSize, config.ChtConfirms) + indexers[1] = eth.NewBloomIndexer(db, config.BloomSize, config.BloomConfirms) + indexers[2] = light.NewBloomTrieIndexer(db, odr, config.BloomSize, config.BloomTrieSize) + // make bloomTrieIndexer as a child indexer of bloom indexer. + indexers[1].AddChildIndexer(indexers[2]) + return indexers[:] } // newTestProtocolManager creates a new protocol manager for testing purposes, // with the given number of blocks already known, potential notification // channels for different events and relative chain indexers array. -func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *core.BlockGen), odr *LesOdr, peers *peerSet, db ethdb.Database) (*ProtocolManager, error) { +func newTestProtocolManager(lightSync bool, blocks int, odr *LesOdr, indexers []*core.ChainIndexer, peers *peerSet, db ethdb.Database, ulcServers []string, ulcFraction int, testCost uint64, clock mclock.Clock) (*ProtocolManager, *backends.SimulatedBackend, error) { var ( evmux = new(event.TypeMux) engine = ethash.NewFaker() gspec = core.Genesis{ - Config: params.TestChainConfig, - Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}, + Config: params.AllEthashProtocolChanges, + Alloc: core.GenesisAlloc{bankAddr: {Balance: bankFunds}}, } - genesis = gspec.MustCommit(db) - chain BlockChain + pool txPool + chain BlockChain + exitCh = make(chan struct{}) ) + gspec.MustCommit(db) if peers == nil { peers = newPeerSet() } + // create a simulation backend and pre-commit several customized block to the database. + simulation := backends.NewSimulatedBackendWithDatabase(db, gspec.Alloc, 100000000) + prepareTestchain(blocks, simulation) + // initialize empty chain for light client or pre-committed chain for server. if lightSync { - chain, _ = light.NewLightChain(odr, gspec.Config, engine) + chain, _ = light.NewLightChain(odr, gspec.Config, engine, nil) } else { - blockchain, _ := core.NewBlockChain(db, nil, gspec.Config, engine, vm.Config{}, nil) - gchain, _ := core.GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, blocks, generator) - if _, err := blockchain.InsertChain(gchain); err != nil { - panic(err) - } - chain = blockchain + chain = simulation.Blockchain() + config := core.DefaultTxPoolConfig + config.Journal = "" + pool = core.NewTxPool(config, gspec.Config, simulation.Blockchain()) } + // Create contract registrar indexConfig := light.TestServerIndexerConfig if lightSync { indexConfig = light.TestClientIndexerConfig } - pm, err := NewProtocolManager(gspec.Config, indexConfig, lightSync, NetworkId, evmux, engine, peers, chain, nil, db, odr, nil, nil, make(chan struct{}), new(sync.WaitGroup)) + config := ¶ms.CheckpointOracleConfig{ + Address: crypto.CreateAddress(bankAddr, 0), + Signers: []common.Address{signerAddr}, + Threshold: 1, + } + var reg *checkpointOracle + if indexers != nil { + getLocal := func(index uint64) params.TrustedCheckpoint { + chtIndexer := indexers[0] + sectionHead := chtIndexer.SectionHead(index) + return params.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: sectionHead, + CHTRoot: light.GetChtRoot(db, index, sectionHead), + BloomRoot: light.GetBloomTrieRoot(db, index, sectionHead), + } + } + reg = newCheckpointOracle(config, getLocal) + } + pm, err := NewProtocolManager(gspec.Config, nil, indexConfig, ulcServers, ulcFraction, lightSync, NetworkId, evmux, peers, chain, pool, db, odr, nil, reg, exitCh, new(sync.WaitGroup), func() bool { return true }) if err != nil { - return nil, err + return nil, nil, err + } + // Registrar initialization could failed if checkpoint contract is not specified. + if pm.reg != nil { + pm.reg.start(simulation) } + // Set up les server stuff. if !lightSync { - srv := &LesServer{lesCommons: lesCommons{protocolManager: pm}} + srv := &LesServer{lesCommons: lesCommons{protocolManager: pm, chainDb: db}} pm.server = srv + pm.servingQueue = newServingQueue(int64(time.Millisecond*10), 1) + pm.servingQueue.setThreads(4) - srv.defParams = &flowcontrol.ServerParams{ + srv.defParams = flowcontrol.ServerParams{ BufLimit: testBufLimit, - MinRecharge: 1, + MinRecharge: testBufRecharge, } - - srv.fcManager = flowcontrol.NewClientManager(50, 10, 1000000000) - srv.fcCostStats = newCostStats(nil) + srv.testCost = testCost + srv.fcManager = flowcontrol.NewClientManager(nil, clock) } pm.Start(1000) - return pm, nil + return pm, simulation, nil } // newTestProtocolManagerMust creates a new protocol manager for testing purposes, -// with the given number of blocks already known, potential notification -// channels for different events and relative chain indexers array. In case of an error, the constructor force- -// fails the test. -func newTestProtocolManagerMust(t *testing.T, lightSync bool, blocks int, generator func(int, *core.BlockGen), odr *LesOdr, peers *peerSet, db ethdb.Database) *ProtocolManager { - pm, err := newTestProtocolManager(lightSync, blocks, generator, odr, peers, db) +// with the given number of blocks already known, potential notification channels +// for different events and relative chain indexers array. In case of an error, the +// constructor force-fails the test. +func newTestProtocolManagerMust(t *testing.T, lightSync bool, blocks int, odr *LesOdr, indexers []*core.ChainIndexer, peers *peerSet, db ethdb.Database, ulcServers []string, ulcFraction int) (*ProtocolManager, *backends.SimulatedBackend) { + pm, backend, err := newTestProtocolManager(lightSync, blocks, odr, indexers, peers, db, ulcServers, ulcFraction, 0, &mclock.System{}) if err != nil { t.Fatalf("Failed to create protocol manager: %v", err) } - return pm + return pm, backend } // testPeer is a simulated peer to allow testing direct network calls. @@ -216,7 +267,7 @@ type testPeer struct { } // newTestPeer creates a new peer registered at the given protocol manager. -func newTestPeer(t *testing.T, name string, version int, pm *ProtocolManager, shake bool) (*testPeer, <-chan error) { +func newTestPeer(t *testing.T, name string, version int, pm *ProtocolManager, shake bool, testCost uint64) (*testPeer, <-chan error) { // Create a message pipe to communicate through app, net := p2p.MsgPipe() @@ -248,7 +299,7 @@ func newTestPeer(t *testing.T, name string, version int, pm *ProtocolManager, sh head = pm.blockchain.CurrentHeader() td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64()) ) - tp.handshake(t, td, head.Hash(), head.Number.Uint64(), genesis.Hash()) + tp.handshake(t, td, head.Hash(), head.Number.Uint64(), genesis.Hash(), testCost) } return tp, errc } @@ -288,7 +339,7 @@ func newTestPeerPair(name string, version int, pm, pm2 *ProtocolManager) (*peer, // handshake simulates a trivial handshake that expects the same state from the // remote side as we are simulating locally. -func (p *testPeer) handshake(t *testing.T, td *big.Int, head common.Hash, headNum uint64, genesis common.Hash) { +func (p *testPeer) handshake(t *testing.T, td *big.Int, head common.Hash, headNum uint64, genesis common.Hash, testCost uint64) { var expList keyValueList expList = expList.add("protocolVersion", uint64(p.version)) expList = expList.add("networkId", uint64(NetworkId)) @@ -301,10 +352,11 @@ func (p *testPeer) handshake(t *testing.T, td *big.Int, head common.Hash, headNu expList = expList.add("serveHeaders", nil) expList = expList.add("serveChainSince", uint64(0)) expList = expList.add("serveStateSince", uint64(0)) + expList = expList.add("serveRecentState", uint64(core.TriesInMemory-4)) expList = expList.add("txRelay", nil) expList = expList.add("flowControl/BL", testBufLimit) - expList = expList.add("flowControl/MRR", uint64(1)) - expList = expList.add("flowControl/MRC", testRCL()) + expList = expList.add("flowControl/MRR", testBufRecharge) + expList = expList.add("flowControl/MRC", testCostList(testCost)) if err := p2p.ExpectMsg(p.app, StatusMsg, expList); err != nil { t.Fatalf("status recv: %v", err) @@ -313,9 +365,9 @@ func (p *testPeer) handshake(t *testing.T, td *big.Int, head common.Hash, headNu t.Fatalf("status send: %v", err) } - p.fcServerParams = &flowcontrol.ServerParams{ + p.fcParams = flowcontrol.ServerParams{ BufLimit: testBufLimit, - MinRecharge: 1, + MinRecharge: testBufRecharge, } } @@ -327,11 +379,13 @@ func (p *testPeer) close() { // TestEntity represents a network entity for testing with necessary auxiliary fields. type TestEntity struct { - db ethdb.Database - rPeer *peer - tPeer *testPeer - peers *peerSet - pm *ProtocolManager + db ethdb.Database + rPeer *peer + tPeer *testPeer + peers *peerSet + pm *ProtocolManager + backend *backends.SimulatedBackend + // Indexers chtIndexer *core.ChainIndexer bloomIndexer *core.ChainIndexer @@ -340,12 +394,13 @@ type TestEntity struct { // newServerEnv creates a server testing environment with a connected test peer for testing purpose. func newServerEnv(t *testing.T, blocks int, protocol int, waitIndexers func(*core.ChainIndexer, *core.ChainIndexer, *core.ChainIndexer)) (*TestEntity, func()) { - db := ethdb.NewMemDatabase() - cIndexer, bIndexer, btIndexer := testIndexers(db, nil, light.TestServerIndexerConfig) + db := rawdb.NewMemoryDatabase() + indexers := testIndexers(db, nil, light.TestServerIndexerConfig) - pm := newTestProtocolManagerMust(t, false, blocks, testChainGen, nil, nil, db) - peer, _ := newTestPeer(t, "peer", protocol, pm, true) + pm, b := newTestProtocolManagerMust(t, false, blocks, nil, indexers, nil, db, nil, 0) + peer, _ := newTestPeer(t, "peer", protocol, pm, true, 0) + cIndexer, bIndexer, btIndexer := indexers[0], indexers[1], indexers[2] cIndexer.Start(pm.blockchain.(*core.BlockChain)) bIndexer.Start(pm.blockchain.(*core.BlockChain)) @@ -358,6 +413,7 @@ func newServerEnv(t *testing.T, blocks int, protocol int, waitIndexers func(*cor db: db, tPeer: peer, pm: pm, + backend: b, chtIndexer: cIndexer, bloomIndexer: bIndexer, bloomTrieIndexer: btIndexer, @@ -372,19 +428,23 @@ func newServerEnv(t *testing.T, blocks int, protocol int, waitIndexers func(*cor // newClientServerEnv creates a client/server arch environment with a connected les server and light client pair // for testing purpose. func newClientServerEnv(t *testing.T, blocks int, protocol int, waitIndexers func(*core.ChainIndexer, *core.ChainIndexer, *core.ChainIndexer), newPeer bool) (*TestEntity, *TestEntity, func()) { - db, ldb := ethdb.NewMemDatabase(), ethdb.NewMemDatabase() + db, ldb := rawdb.NewMemoryDatabase(), rawdb.NewMemoryDatabase() peers, lPeers := newPeerSet(), newPeerSet() - dist := newRequestDistributor(lPeers, make(chan struct{})) + dist := newRequestDistributor(lPeers, make(chan struct{}), &mclock.System{}) rm := newRetrieveManager(lPeers, dist, nil) odr := NewLesOdr(ldb, light.TestClientIndexerConfig, rm) - cIndexer, bIndexer, btIndexer := testIndexers(db, nil, light.TestServerIndexerConfig) - lcIndexer, lbIndexer, lbtIndexer := testIndexers(ldb, odr, light.TestClientIndexerConfig) + indexers := testIndexers(db, nil, light.TestServerIndexerConfig) + lIndexers := testIndexers(ldb, odr, light.TestClientIndexerConfig) + + cIndexer, bIndexer, btIndexer := indexers[0], indexers[1], indexers[2] + lcIndexer, lbIndexer, lbtIndexer := lIndexers[0], lIndexers[1], lIndexers[2] + odr.SetIndexers(lcIndexer, lbtIndexer, lbIndexer) - pm := newTestProtocolManagerMust(t, false, blocks, testChainGen, nil, peers, db) - lpm := newTestProtocolManagerMust(t, true, 0, nil, odr, lPeers, ldb) + pm, b := newTestProtocolManagerMust(t, false, blocks, nil, indexers, peers, db, nil, 0) + lpm, lb := newTestProtocolManagerMust(t, true, 0, odr, lIndexers, lPeers, ldb, nil, 0) startIndexers := func(clientMode bool, pm *ProtocolManager) { if clientMode { @@ -424,6 +484,7 @@ func newClientServerEnv(t *testing.T, blocks int, protocol int, waitIndexers fun pm: pm, rPeer: peer, peers: peers, + backend: b, chtIndexer: cIndexer, bloomIndexer: bIndexer, bloomTrieIndexer: btIndexer, @@ -432,6 +493,7 @@ func newClientServerEnv(t *testing.T, blocks int, protocol int, waitIndexers fun pm: lpm, rPeer: lPeer, peers: lPeers, + backend: lb, chtIndexer: lcIndexer, bloomIndexer: lbIndexer, bloomTrieIndexer: lbtIndexer, diff --git a/les/metrics.go b/les/metrics.go index c282a62a1aed..4c6737a4e8f0 100644 --- a/les/metrics.go +++ b/les/metrics.go @@ -22,46 +22,31 @@ import ( ) var ( - /* propTxnInPacketsMeter = metrics.NewMeter("eth/prop/txns/in/packets") - propTxnInTrafficMeter = metrics.NewMeter("eth/prop/txns/in/traffic") - propTxnOutPacketsMeter = metrics.NewMeter("eth/prop/txns/out/packets") - propTxnOutTrafficMeter = metrics.NewMeter("eth/prop/txns/out/traffic") - propHashInPacketsMeter = metrics.NewMeter("eth/prop/hashes/in/packets") - propHashInTrafficMeter = metrics.NewMeter("eth/prop/hashes/in/traffic") - propHashOutPacketsMeter = metrics.NewMeter("eth/prop/hashes/out/packets") - propHashOutTrafficMeter = metrics.NewMeter("eth/prop/hashes/out/traffic") - propBlockInPacketsMeter = metrics.NewMeter("eth/prop/blocks/in/packets") - propBlockInTrafficMeter = metrics.NewMeter("eth/prop/blocks/in/traffic") - propBlockOutPacketsMeter = metrics.NewMeter("eth/prop/blocks/out/packets") - propBlockOutTrafficMeter = metrics.NewMeter("eth/prop/blocks/out/traffic") - reqHashInPacketsMeter = metrics.NewMeter("eth/req/hashes/in/packets") - reqHashInTrafficMeter = metrics.NewMeter("eth/req/hashes/in/traffic") - reqHashOutPacketsMeter = metrics.NewMeter("eth/req/hashes/out/packets") - reqHashOutTrafficMeter = metrics.NewMeter("eth/req/hashes/out/traffic") - reqBlockInPacketsMeter = metrics.NewMeter("eth/req/blocks/in/packets") - reqBlockInTrafficMeter = metrics.NewMeter("eth/req/blocks/in/traffic") - reqBlockOutPacketsMeter = metrics.NewMeter("eth/req/blocks/out/packets") - reqBlockOutTrafficMeter = metrics.NewMeter("eth/req/blocks/out/traffic") - reqHeaderInPacketsMeter = metrics.NewMeter("eth/req/headers/in/packets") - reqHeaderInTrafficMeter = metrics.NewMeter("eth/req/headers/in/traffic") - reqHeaderOutPacketsMeter = metrics.NewMeter("eth/req/headers/out/packets") - reqHeaderOutTrafficMeter = metrics.NewMeter("eth/req/headers/out/traffic") - reqBodyInPacketsMeter = metrics.NewMeter("eth/req/bodies/in/packets") - reqBodyInTrafficMeter = metrics.NewMeter("eth/req/bodies/in/traffic") - reqBodyOutPacketsMeter = metrics.NewMeter("eth/req/bodies/out/packets") - reqBodyOutTrafficMeter = metrics.NewMeter("eth/req/bodies/out/traffic") - reqStateInPacketsMeter = metrics.NewMeter("eth/req/states/in/packets") - reqStateInTrafficMeter = metrics.NewMeter("eth/req/states/in/traffic") - reqStateOutPacketsMeter = metrics.NewMeter("eth/req/states/out/packets") - reqStateOutTrafficMeter = metrics.NewMeter("eth/req/states/out/traffic") - reqReceiptInPacketsMeter = metrics.NewMeter("eth/req/receipts/in/packets") - reqReceiptInTrafficMeter = metrics.NewMeter("eth/req/receipts/in/traffic") - reqReceiptOutPacketsMeter = metrics.NewMeter("eth/req/receipts/out/packets") - reqReceiptOutTrafficMeter = metrics.NewMeter("eth/req/receipts/out/traffic")*/ miscInPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets", nil) miscInTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic", nil) miscOutPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets", nil) miscOutTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic", nil) + + connectionTimer = metrics.NewRegisteredTimer("les/connectionTime", nil) + + totalConnectedGauge = metrics.NewRegisteredGauge("les/server/totalConnected", nil) + totalCapacityGauge = metrics.NewRegisteredGauge("les/server/totalCapacity", nil) + totalRechargeGauge = metrics.NewRegisteredGauge("les/server/totalRecharge", nil) + blockProcessingTimer = metrics.NewRegisteredTimer("les/server/blockProcessingTime", nil) + requestServedTimer = metrics.NewRegisteredTimer("les/server/requestServed", nil) + requestServedMeter = metrics.NewRegisteredMeter("les/server/totalRequestServed", nil) + requestEstimatedMeter = metrics.NewRegisteredMeter("les/server/totalRequestEstimated", nil) + relativeCostHistogram = metrics.NewRegisteredHistogram("les/server/relativeCost", nil, metrics.NewExpDecaySample(1028, 0.015)) + recentServedGauge = metrics.NewRegisteredGauge("les/server/recentRequestServed", nil) + recentEstimatedGauge = metrics.NewRegisteredGauge("les/server/recentRequestEstimated", nil) + sqServedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/served", nil) + sqQueuedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/queued", nil) + clientConnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/connected", nil) + clientRejectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/rejected", nil) + clientKickedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/kicked", nil) + // clientDisconnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/disconnected", nil) + clientFreezeMeter = metrics.NewRegisteredMeter("les/server/clientEvent/freeze", nil) + clientErrorMeter = metrics.NewRegisteredMeter("les/server/clientEvent/error", nil) ) // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of diff --git a/les/odr.go b/les/odr.go index 9def05a67608..a26c06680b96 100644 --- a/les/odr.go +++ b/les/odr.go @@ -84,10 +84,9 @@ const ( MsgBlockBodies = iota MsgCode MsgReceipts - MsgProofsV1 MsgProofsV2 - MsgHeaderProofs MsgHelperTrieProofs + MsgTxStatus ) // Msg encodes a LES message that delivers reply data for a request @@ -109,12 +108,15 @@ func (odr *LesOdr) Retrieve(ctx context.Context, req light.OdrRequest) (err erro }, canSend: func(dp distPeer) bool { p := dp.(*peer) - return lreq.CanSend(p) + if !p.onlyAnnounce { + return lreq.CanSend(p) + } + return false }, request: func(dp distPeer) func() { p := dp.(*peer) cost := lreq.GetCost(p) - p.fcServer.QueueRequest(reqID, cost) + p.fcServer.QueuedRequest(reqID, cost) return func() { lreq.Request(reqID, p) } }, } diff --git a/les/odr_requests.go b/les/odr_requests.go index 0f2e5dd9ecd4..3c4dd7090fc0 100644 --- a/les/odr_requests.go +++ b/les/odr_requests.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package les import ( @@ -68,6 +66,8 @@ func LesRequest(req light.OdrRequest) LesOdrRequest { return (*ChtRequest)(r) case *light.BloomRequest: return (*BloomRequest)(r) + case *light.TxStatusRequest: + return (*TxStatusRequest)(r) default: return nil } @@ -166,11 +166,13 @@ func (r *ReceiptsRequest) Validate(db ethdb.Database, msg *Msg) error { receipt := receipts[0] // Retrieve our stored header and validate receipt content against it - header := rawdb.ReadHeader(db, r.Hash, r.Number) - if header == nil { + if r.Header == nil { + r.Header = rawdb.ReadHeader(db, r.Hash, r.Number) + } + if r.Header == nil { return errHeaderUnavailable } - if header.ReceiptHash != types.DeriveSha(receipt) { + if r.Header.ReceiptHash != types.DeriveSha(receipt) { return errReceiptHashMismatch } // Validations passed, store and return @@ -190,14 +192,7 @@ type TrieRequest light.TrieRequest // GetCost returns the cost of the given ODR request according to the serving // peer's cost table (implementation of LesOdrRequest) func (r *TrieRequest) GetCost(peer *peer) uint64 { - switch peer.version { - case lpv1: - return peer.GetRequestCost(GetProofsV1Msg, 1) - case lpv2: - return peer.GetRequestCost(GetProofsV2Msg, 1) - default: - panic(nil) - } + return peer.GetRequestCost(GetProofsV2Msg, 1) } // CanSend tells if a certain peer is suitable for serving the given request @@ -222,38 +217,22 @@ func (r *TrieRequest) Request(reqID uint64, peer *peer) error { func (r *TrieRequest) Validate(db ethdb.Database, msg *Msg) error { log.Debug("Validating trie proof", "root", r.Id.Root, "key", r.Key) - switch msg.MsgType { - case MsgProofsV1: - proofs := msg.Obj.([]light.NodeList) - if len(proofs) != 1 { - return errInvalidEntryCount - } - nodeSet := proofs[0].NodeSet() - // Verify the proof and store if checks out - if _, _, err := trie.VerifyProof(r.Id.Root, r.Key, nodeSet); err != nil { - return fmt.Errorf("merkle proof verification failed: %v", err) - } - r.Proof = nodeSet - return nil - - case MsgProofsV2: - proofs := msg.Obj.(light.NodeList) - // Verify the proof and store if checks out - nodeSet := proofs.NodeSet() - reads := &readTraceDB{db: nodeSet} - if _, _, err := trie.VerifyProof(r.Id.Root, r.Key, reads); err != nil { - return fmt.Errorf("merkle proof verification failed: %v", err) - } - // check if all nodes have been read by VerifyProof - if len(reads.reads) != nodeSet.KeyCount() { - return errUselessNodes - } - r.Proof = nodeSet - return nil - - default: + if msg.MsgType != MsgProofsV2 { return errInvalidMessageType } + proofs := msg.Obj.(light.NodeList) + // Verify the proof and store if checks out + nodeSet := proofs.NodeSet() + reads := &readTraceDB{db: nodeSet} + if _, _, err := trie.VerifyProof(r.Id.Root, r.Key, reads); err != nil { + return fmt.Errorf("merkle proof verification failed: %v", err) + } + // check if all nodes have been read by VerifyProof + if len(reads.reads) != nodeSet.KeyCount() { + return errUselessNodes + } + r.Proof = nodeSet + return nil } type CodeReq struct { @@ -332,32 +311,13 @@ type HelperTrieResps struct { // describes all responses, not just a single one AuxData [][]byte } -// legacy LES/1 -type ChtReq struct { - ChtNum, BlockNum uint64 - FromLevel uint -} - -// legacy LES/1 -type ChtResp struct { - Header *types.Header - Proof []rlp.RawValue -} - // ODR request type for requesting headers by Canonical Hash Trie, see LesOdrRequest interface type ChtRequest light.ChtRequest // GetCost returns the cost of the given ODR request according to the serving // peer's cost table (implementation of LesOdrRequest) func (r *ChtRequest) GetCost(peer *peer) uint64 { - switch peer.version { - case lpv1: - return peer.GetRequestCost(GetHeaderProofsMsg, 1) - case lpv2: - return peer.GetRequestCost(GetHelperTrieProofsMsg, 1) - default: - panic(nil) - } + return peer.GetRequestCost(GetHelperTrieProofsMsg, 1) } // CanSend tells if a certain peer is suitable for serving the given request @@ -365,7 +325,11 @@ func (r *ChtRequest) CanSend(peer *peer) bool { peer.lock.RLock() defer peer.lock.RUnlock() - return peer.headInfo.Number >= r.Config.ChtConfirms && r.ChtNum <= (peer.headInfo.Number-r.Config.ChtConfirms)/r.Config.ChtSize + if r.Untrusted { + return peer.headInfo.Number >= r.BlockNum && peer.id == r.PeerId + } else { + return peer.headInfo.Number >= r.Config.ChtConfirms && r.ChtNum <= (peer.headInfo.Number-r.Config.ChtConfirms)/r.Config.ChtSize + } } // Request sends an ODR request to the LES network (implementation of LesOdrRequest) @@ -379,21 +343,7 @@ func (r *ChtRequest) Request(reqID uint64, peer *peer) error { Key: encNum[:], AuxReq: auxHeader, } - switch peer.version { - case lpv1: - var reqsV1 ChtReq - if req.Type != htCanonical || req.AuxReq != auxHeader || len(req.Key) != 8 { - return fmt.Errorf("Request invalid in LES/1 mode") - } - blockNum := binary.BigEndian.Uint64(req.Key) - // convert HelperTrie request to old CHT request - reqsV1 = ChtReq{ChtNum: (req.TrieIdx + 1) * (r.Config.ChtSize / r.Config.PairChtSize), BlockNum: blockNum, FromLevel: req.FromLevel} - return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []ChtReq{reqsV1}) - case lpv2: - return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []HelperTrieReq{req}) - default: - panic(nil) - } + return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []HelperTrieReq{req}) } // Valid processes an ODR request reply message from the LES network @@ -402,49 +352,28 @@ func (r *ChtRequest) Request(reqID uint64, peer *peer) error { func (r *ChtRequest) Validate(db ethdb.Database, msg *Msg) error { log.Debug("Validating CHT", "cht", r.ChtNum, "block", r.BlockNum) - switch msg.MsgType { - case MsgHeaderProofs: // LES/1 backwards compatibility - proofs := msg.Obj.([]ChtResp) - if len(proofs) != 1 { - return errInvalidEntryCount - } - proof := proofs[0] - - // Verify the CHT - var encNumber [8]byte - binary.BigEndian.PutUint64(encNumber[:], r.BlockNum) - - value, _, err := trie.VerifyProof(r.ChtRoot, encNumber[:], light.NodeList(proof.Proof).NodeSet()) - if err != nil { - return err - } - var node light.ChtNode - if err := rlp.DecodeBytes(value, &node); err != nil { - return err - } - if node.Hash != proof.Header.Hash() { - return errCHTHashMismatch - } - // Verifications passed, store and return - r.Header = proof.Header - r.Proof = light.NodeList(proof.Proof).NodeSet() - r.Td = node.Td - case MsgHelperTrieProofs: - resp := msg.Obj.(HelperTrieResps) - if len(resp.AuxData) != 1 { - return errInvalidEntryCount - } - nodeSet := resp.Proofs.NodeSet() - headerEnc := resp.AuxData[0] - if len(headerEnc) == 0 { - return errHeaderUnavailable - } - header := new(types.Header) - if err := rlp.DecodeBytes(headerEnc, header); err != nil { - return errHeaderUnavailable - } + if msg.MsgType != MsgHelperTrieProofs { + return errInvalidMessageType + } + resp := msg.Obj.(HelperTrieResps) + if len(resp.AuxData) != 1 { + return errInvalidEntryCount + } + nodeSet := resp.Proofs.NodeSet() + headerEnc := resp.AuxData[0] + if len(headerEnc) == 0 { + return errHeaderUnavailable + } + header := new(types.Header) + if err := rlp.DecodeBytes(headerEnc, header); err != nil { + return errHeaderUnavailable + } - // Verify the CHT + // Verify the CHT + // Note: For untrusted CHT request, there is no proof response but + // header data. + var node light.ChtNode + if !r.Untrusted { var encNumber [8]byte binary.BigEndian.PutUint64(encNumber[:], r.BlockNum) @@ -457,7 +386,6 @@ func (r *ChtRequest) Validate(db ethdb.Database, msg *Msg) error { return errUselessNodes } - var node light.ChtNode if err := rlp.DecodeBytes(value, &node); err != nil { return err } @@ -467,13 +395,12 @@ func (r *ChtRequest) Validate(db ethdb.Database, msg *Msg) error { if r.BlockNum != header.Number.Uint64() { return errCHTNumberMismatch } - // Verifications passed, store and return - r.Header = header - r.Proof = nodeSet - r.Td = node.Td - default: - return errInvalidMessageType } + // Verifications passed, store and return + r.Header = header + r.Proof = nodeSet + r.Td = node.Td // For untrusted request, td here is nil, todo improve the les/2 protocol + return nil } @@ -557,10 +484,48 @@ func (r *BloomRequest) Validate(db ethdb.Database, msg *Msg) error { return nil } +// TxStatusRequest is the ODR request type for transaction status +type TxStatusRequest light.TxStatusRequest + +// GetCost returns the cost of the given ODR request according to the serving +// peer's cost table (implementation of LesOdrRequest) +func (r *TxStatusRequest) GetCost(peer *peer) uint64 { + return peer.GetRequestCost(GetTxStatusMsg, len(r.Hashes)) +} + +// CanSend tells if a certain peer is suitable for serving the given request +func (r *TxStatusRequest) CanSend(peer *peer) bool { + return peer.version >= lpv2 +} + +// Request sends an ODR request to the LES network (implementation of LesOdrRequest) +func (r *TxStatusRequest) Request(reqID uint64, peer *peer) error { + peer.Log().Debug("Requesting transaction status", "count", len(r.Hashes)) + return peer.RequestTxStatus(reqID, r.GetCost(peer), r.Hashes) +} + +// Valid processes an ODR request reply message from the LES network +// returns true and stores results in memory if the message was a valid reply +// to the request (implementation of LesOdrRequest) +func (r *TxStatusRequest) Validate(db ethdb.Database, msg *Msg) error { + log.Debug("Validating transaction status", "count", len(r.Hashes)) + + // Ensure we have a correct message with a single block body + if msg.MsgType != MsgTxStatus { + return errInvalidMessageType + } + status := msg.Obj.([]light.TxStatus) + if len(status) != len(r.Hashes) { + return errInvalidEntryCount + } + r.Status = status + return nil +} + // readTraceDB stores the keys of database reads. We use this to check that received node // sets contain only the trie nodes necessary to make proofs pass. type readTraceDB struct { - db trie.DatabaseReader + db ethdb.KeyValueReader reads map[string]struct{} } diff --git a/les/odr_test.go b/les/odr_test.go index ac81fbcf02fd..1e8a5f8b46f7 100644 --- a/les/odr_test.go +++ b/les/odr_test.go @@ -38,9 +38,7 @@ import ( type odrTestFn func(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte -func TestOdrGetBlockLes1(t *testing.T) { testOdr(t, 1, 1, odrGetBlock) } - -func TestOdrGetBlockLes2(t *testing.T) { testOdr(t, 2, 1, odrGetBlock) } +func TestOdrGetBlockLes2(t *testing.T) { testOdr(t, 2, 1, true, odrGetBlock) } func odrGetBlock(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte { var block *types.Block @@ -56,15 +54,13 @@ func odrGetBlock(ctx context.Context, db ethdb.Database, config *params.ChainCon return rlp } -func TestOdrGetReceiptsLes1(t *testing.T) { testOdr(t, 1, 1, odrGetReceipts) } - -func TestOdrGetReceiptsLes2(t *testing.T) { testOdr(t, 2, 1, odrGetReceipts) } +func TestOdrGetReceiptsLes2(t *testing.T) { testOdr(t, 2, 1, true, odrGetReceipts) } func odrGetReceipts(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte { var receipts types.Receipts if bc != nil { if number := rawdb.ReadHeaderNumber(db, bhash); number != nil { - receipts = rawdb.ReadReceipts(db, bhash, *number) + receipts = rawdb.ReadReceipts(db, bhash, *number, config) } } else { if number := rawdb.ReadHeaderNumber(db, bhash); number != nil { @@ -78,13 +74,11 @@ func odrGetReceipts(ctx context.Context, db ethdb.Database, config *params.Chain return rlp } -func TestOdrAccountsLes1(t *testing.T) { testOdr(t, 1, 1, odrAccounts) } - -func TestOdrAccountsLes2(t *testing.T) { testOdr(t, 2, 1, odrAccounts) } +func TestOdrAccountsLes2(t *testing.T) { testOdr(t, 2, 1, true, odrAccounts) } func odrAccounts(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte { dummyAddr := common.HexToAddress("1234567812345678123456781234567812345678") - acc := []common.Address{testBankAddress, acc1Addr, acc2Addr, dummyAddr} + acc := []common.Address{bankAddr, userAddr1, userAddr2, dummyAddr} var ( res []byte @@ -108,9 +102,7 @@ func odrAccounts(ctx context.Context, db ethdb.Database, config *params.ChainCon return res } -func TestOdrContractCallLes1(t *testing.T) { testOdr(t, 1, 2, odrContractCall) } - -func TestOdrContractCallLes2(t *testing.T) { testOdr(t, 2, 2, odrContractCall) } +func TestOdrContractCallLes2(t *testing.T) { testOdr(t, 2, 2, true, odrContractCall) } type callmsg struct { types.Message @@ -129,7 +121,7 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai statedb, err := state.New(header.Root, state.NewDatabase(db)) if err == nil { - from := statedb.GetOrNewStateObject(testBankAddress) + from := statedb.GetOrNewStateObject(bankAddr) from.SetBalance(math.MaxBig256) msg := callmsg{types.NewMessage(from.Address(), &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false)} @@ -145,8 +137,8 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai } else { header := lc.GetHeaderByHash(bhash) state := light.NewState(ctx, header, lc.Odr()) - state.SetBalance(testBankAddress, math.MaxBig256) - msg := callmsg{types.NewMessage(testBankAddress, &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false)} + state.SetBalance(bankAddr, math.MaxBig256) + msg := callmsg{types.NewMessage(bankAddr, &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false)} context := core.NewEVMContext(msg, header, lc, nil) vmenv := vm.NewEVM(context, state, config, vm.Config{}) gp := new(core.GasPool).AddGas(math.MaxUint64) @@ -159,14 +151,41 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai return res } +func TestOdrTxStatusLes2(t *testing.T) { testOdr(t, 2, 1, false, odrTxStatus) } + +func odrTxStatus(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte { + var txs types.Transactions + if bc != nil { + block := bc.GetBlockByHash(bhash) + txs = block.Transactions() + } else { + if block, _ := lc.GetBlockByHash(ctx, bhash); block != nil { + btxs := block.Transactions() + txs = make(types.Transactions, len(btxs)) + for i, tx := range btxs { + var err error + txs[i], _, _, _, err = light.GetTransaction(ctx, lc.Odr(), tx.Hash()) + if err != nil { + return nil + } + } + } + } + rlp, _ := rlp.EncodeToBytes(txs) + return rlp +} + // testOdr tests odr requests whose validation guaranteed by block headers. -func testOdr(t *testing.T, protocol int, expFail uint64, fn odrTestFn) { +func testOdr(t *testing.T, protocol int, expFail uint64, checkCached bool, fn odrTestFn) { // Assemble the test environment server, client, tearDown := newClientServerEnv(t, 4, protocol, nil, true) defer tearDown() client.pm.synchronise(client.rPeer) test := func(expFail uint64) { + // Mark this as a helper to put the failures at the correct lines + t.Helper() + for i := uint64(0); i <= server.pm.blockchain.CurrentHeader().Number.Uint64(); i++ { bhash := rawdb.ReadCanonicalHash(server.db, i) b1 := fn(light.NoOdr, server.db, server.pm.chainConfig, server.pm.blockchain.(*core.BlockChain), nil, bhash) @@ -178,10 +197,10 @@ func testOdr(t *testing.T, protocol int, expFail uint64, fn odrTestFn) { eq := bytes.Equal(b1, b2) exp := i < expFail if exp && !eq { - t.Errorf("odr mismatch") + t.Fatalf("odr mismatch: have %x, want %x", b2, b1) } if !exp && eq { - t.Errorf("unexpected odr match") + t.Fatalf("unexpected odr match") } } } @@ -190,6 +209,7 @@ func testOdr(t *testing.T, protocol int, expFail uint64, fn odrTestFn) { client.peers.Unregister(client.rPeer.id) time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed test(expFail) + // expect all retrievals to pass client.peers.Register(client.rPeer) time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed @@ -197,8 +217,10 @@ func testOdr(t *testing.T, protocol int, expFail uint64, fn odrTestFn) { client.rPeer.hasBlock = func(common.Hash, uint64, bool) bool { return true } client.peers.lock.Unlock() test(5) - // still expect all retrievals to pass, now data should be cached locally - client.peers.Unregister(client.rPeer.id) - time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed - test(5) + if checkCached { + // still expect all retrievals to pass, now data should be cached locally + client.peers.Unregister(client.rPeer.id) + time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed + test(5) + } } diff --git a/les/peer.go b/les/peer.go index 678384f0eb46..1aa1613b0e7d 100644 --- a/les/peer.go +++ b/les/peer.go @@ -14,33 +14,56 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( "errors" "fmt" "math/big" + "math/rand" "sync" + "sync/atomic" "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/les/flowcontrol" "github.com/ethereum/go-ethereum/light" "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" ) var ( - errClosed = errors.New("peer set is closed") - errAlreadyRegistered = errors.New("peer is already registered") - errNotRegistered = errors.New("peer is not registered") - errInvalidHelpTrieReq = errors.New("invalid help trie request") + errClosed = errors.New("peer set is closed") + errAlreadyRegistered = errors.New("peer is already registered") + errNotRegistered = errors.New("peer is not registered") ) -const maxResponseErrors = 50 // number of invalid responses tolerated (makes the protocol less brittle but still avoids spam) +const ( + maxRequestErrors = 20 // number of invalid requests tolerated (makes the protocol less brittle but still avoids spam) + maxResponseErrors = 50 // number of invalid responses tolerated (makes the protocol less brittle but still avoids spam) +) + +// capacity limitation for parameter updates +const ( + allowedUpdateBytes = 100000 // initial/maximum allowed update size + allowedUpdateRate = time.Millisecond * 10 // time constant for recharging one byte of allowance +) + +const ( + freezeTimeBase = time.Millisecond * 700 // fixed component of client freeze time + freezeTimeRandom = time.Millisecond * 600 // random component of client freeze time + freezeCheckPeriod = time.Millisecond * 100 // buffer value recheck period after initial freeze time has elapsed +) + +// if the total encoded size of a sent transaction batch is over txSizeCostLimit +// per transaction then the request cost is calculated as proportional to the +// encoded size instead of the transaction count +const txSizeCostLimit = 0x4000 const ( announceTypeNone = iota @@ -50,47 +73,135 @@ const ( type peer struct { *p2p.Peer - rw p2p.MsgReadWriter version int // Protocol version negotiated network uint64 // Network ID being on - announceType, requestAnnounceType uint64 + announceType uint64 + + // Checkpoint relative fields + checkpoint params.TrustedCheckpoint + checkpointNumber uint64 id string headInfo *announceData lock sync.RWMutex - announceChn chan announceData - sendQueue *execQueue + sendQueue *execQueue + + errCh chan error + // responseLock ensures that responses are queued in the same order as + // RequestProcessed is called + responseLock sync.Mutex + responseCount uint64 + invalidCount uint32 poolEntry *poolEntry hasBlock func(common.Hash, uint64, bool) bool responseErrors int + updateCounter uint64 + updateTime mclock.AbsTime + frozen uint32 // 1 if client is in frozen state - fcClient *flowcontrol.ClientNode // nil if the peer is server only - fcServer *flowcontrol.ServerNode // nil if the peer is client only - fcServerParams *flowcontrol.ServerParams - fcCosts requestCostTable -} + fcClient *flowcontrol.ClientNode // nil if the peer is server only + fcServer *flowcontrol.ServerNode // nil if the peer is client only + fcParams flowcontrol.ServerParams + fcCosts requestCostTable -func newPeer(version int, network uint64, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { - id := p.ID() + trusted bool + onlyAnnounce bool + chainSince, chainRecent uint64 + stateSince, stateRecent uint64 +} +func newPeer(version int, network uint64, trusted bool, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { return &peer{ - Peer: p, - rw: rw, - version: version, - network: network, - id: fmt.Sprintf("%x", id[:8]), - announceChn: make(chan announceData, 20), + Peer: p, + rw: rw, + version: version, + network: network, + id: fmt.Sprintf("%x", p.ID().Bytes()), + trusted: trusted, + errCh: make(chan error, 1), + } +} + +// rejectUpdate returns true if a parameter update has to be rejected because +// the size and/or rate of updates exceed the capacity limitation +func (p *peer) rejectUpdate(size uint64) bool { + now := mclock.Now() + if p.updateCounter == 0 { + p.updateTime = now + } else { + dt := now - p.updateTime + r := uint64(dt / mclock.AbsTime(allowedUpdateRate)) + if p.updateCounter > r { + p.updateCounter -= r + p.updateTime += mclock.AbsTime(allowedUpdateRate * time.Duration(r)) + } else { + p.updateCounter = 0 + p.updateTime = now + } + } + p.updateCounter += size + return p.updateCounter > allowedUpdateBytes +} + +// freezeClient temporarily puts the client in a frozen state which means all +// unprocessed and subsequent requests are dropped. Unfreezing happens automatically +// after a short time if the client's buffer value is at least in the slightly positive +// region. The client is also notified about being frozen/unfrozen with a Stop/Resume +// message. +func (p *peer) freezeClient() { + if p.version < lpv3 { + // if Stop/Resume is not supported then just drop the peer after setting + // its frozen status permanently + atomic.StoreUint32(&p.frozen, 1) + p.Peer.Disconnect(p2p.DiscUselessPeer) + return + } + if atomic.SwapUint32(&p.frozen, 1) == 0 { + go func() { + p.SendStop() + time.Sleep(freezeTimeBase + time.Duration(rand.Int63n(int64(freezeTimeRandom)))) + for { + bufValue, bufLimit := p.fcClient.BufferStatus() + if bufLimit == 0 { + return + } + if bufValue <= bufLimit/8 { + time.Sleep(freezeCheckPeriod) + } else { + atomic.StoreUint32(&p.frozen, 0) + p.SendResume(bufValue) + break + } + } + }() } } +// freezeServer processes Stop/Resume messages from the given server +func (p *peer) freezeServer(frozen bool) { + var f uint32 + if frozen { + f = 1 + } + if atomic.SwapUint32(&p.frozen, f) != f && frozen { + p.sendQueue.clear() + } +} + +// isFrozen returns true if the client is frozen or the server has put our +// client in frozen state +func (p *peer) isFrozen() bool { + return atomic.LoadUint32(&p.frozen) != 0 +} + func (p *peer) canQueue() bool { - return p.sendQueue.canQueue() + return p.sendQueue.canQueue() && !p.isFrozen() } func (p *peer) queueSend(f func()) { @@ -143,6 +254,20 @@ func (p *peer) waitBefore(maxCost uint64) (time.Duration, float64) { return p.fcServer.CanSend(maxCost) } +// updateCapacity updates the request serving capacity assigned to a given client +// and also sends an announcement about the updated flow control parameters +func (p *peer) updateCapacity(cap uint64) { + p.responseLock.Lock() + defer p.responseLock.Unlock() + + p.fcParams = flowcontrol.ServerParams{MinRecharge: cap, BufLimit: cap * bufLimitRatio} + p.fcClient.UpdateParams(p.fcParams) + var kvList keyValueList + kvList = kvList.add("flowControl/MRR", cap) + kvList = kvList.add("flowControl/BL", cap*bufLimitRatio) + p.queueSend(func() { p.SendAnnounce(announceData{Update: kvList}) }) +} + func sendRequest(w p2p.MsgWriter, msgcode, reqID, cost uint64, data interface{}) error { type req struct { ReqID uint64 @@ -151,31 +276,81 @@ func sendRequest(w p2p.MsgWriter, msgcode, reqID, cost uint64, data interface{}) return p2p.Send(w, msgcode, req{reqID, data}) } -func sendResponse(w p2p.MsgWriter, msgcode, reqID, bv uint64, data interface{}) error { +// reply struct represents a reply with the actual data already RLP encoded and +// only the bv (buffer value) missing. This allows the serving mechanism to +// calculate the bv value which depends on the data size before sending the reply. +type reply struct { + w p2p.MsgWriter + msgcode, reqID uint64 + data rlp.RawValue +} + +// send sends the reply with the calculated buffer value +func (r *reply) send(bv uint64) error { type resp struct { ReqID, BV uint64 - Data interface{} + Data rlp.RawValue } - return p2p.Send(w, msgcode, resp{reqID, bv, data}) + return p2p.Send(r.w, r.msgcode, resp{r.reqID, bv, r.data}) +} + +// size returns the RLP encoded size of the message data +func (r *reply) size() uint32 { + return uint32(len(r.data)) } func (p *peer) GetRequestCost(msgcode uint64, amount int) uint64 { p.lock.RLock() defer p.lock.RUnlock() - cost := p.fcCosts[msgcode].baseCost + p.fcCosts[msgcode].reqCost*uint64(amount) - if cost > p.fcServerParams.BufLimit { - cost = p.fcServerParams.BufLimit + costs := p.fcCosts[msgcode] + if costs == nil { + return 0 + } + cost := costs.baseCost + costs.reqCost*uint64(amount) + if cost > p.fcParams.BufLimit { + cost = p.fcParams.BufLimit + } + return cost +} + +func (p *peer) GetTxRelayCost(amount, size int) uint64 { + p.lock.RLock() + defer p.lock.RUnlock() + + costs := p.fcCosts[SendTxV2Msg] + if costs == nil { + return 0 + } + cost := costs.baseCost + costs.reqCost*uint64(amount) + sizeCost := costs.baseCost + costs.reqCost*uint64(size)/txSizeCostLimit + if sizeCost > cost { + cost = sizeCost + } + + if cost > p.fcParams.BufLimit { + cost = p.fcParams.BufLimit } return cost } // HasBlock checks if the peer has a given block func (p *peer) HasBlock(hash common.Hash, number uint64, hasState bool) bool { + var head, since, recent uint64 p.lock.RLock() + if p.headInfo != nil { + head = p.headInfo.Number + } + if hasState { + since = p.stateSince + recent = p.stateRecent + } else { + since = p.chainSince + recent = p.chainRecent + } hasBlock := p.hasBlock p.lock.RUnlock() - return hasBlock != nil && hasBlock(hash, number, hasState) + return head >= number && number >= since && (recent == 0 || number+recent+4 > head) && hasBlock != nil && hasBlock(hash, number, hasState) } // SendAnnounce announces the availability of a number of blocks through @@ -184,52 +359,59 @@ func (p *peer) SendAnnounce(request announceData) error { return p2p.Send(p.rw, AnnounceMsg, request) } -// SendBlockHeaders sends a batch of block headers to the remote peer. -func (p *peer) SendBlockHeaders(reqID, bv uint64, headers []*types.Header) error { - return sendResponse(p.rw, BlockHeadersMsg, reqID, bv, headers) +// SendStop notifies the client about being in frozen state +func (p *peer) SendStop() error { + return p2p.Send(p.rw, StopMsg, struct{}{}) } -// SendBlockBodiesRLP sends a batch of block contents to the remote peer from -// an already RLP encoded format. -func (p *peer) SendBlockBodiesRLP(reqID, bv uint64, bodies []rlp.RawValue) error { - return sendResponse(p.rw, BlockBodiesMsg, reqID, bv, bodies) +// SendResume notifies the client about getting out of frozen state +func (p *peer) SendResume(bv uint64) error { + return p2p.Send(p.rw, ResumeMsg, bv) } -// SendCodeRLP sends a batch of arbitrary internal data, corresponding to the -// hashes requested. -func (p *peer) SendCode(reqID, bv uint64, data [][]byte) error { - return sendResponse(p.rw, CodeMsg, reqID, bv, data) +// ReplyBlockHeaders creates a reply with a batch of block headers +func (p *peer) ReplyBlockHeaders(reqID uint64, headers []*types.Header) *reply { + data, _ := rlp.EncodeToBytes(headers) + return &reply{p.rw, BlockHeadersMsg, reqID, data} } -// SendReceiptsRLP sends a batch of transaction receipts, corresponding to the -// ones requested from an already RLP encoded format. -func (p *peer) SendReceiptsRLP(reqID, bv uint64, receipts []rlp.RawValue) error { - return sendResponse(p.rw, ReceiptsMsg, reqID, bv, receipts) +// ReplyBlockBodiesRLP creates a reply with a batch of block contents from +// an already RLP encoded format. +func (p *peer) ReplyBlockBodiesRLP(reqID uint64, bodies []rlp.RawValue) *reply { + data, _ := rlp.EncodeToBytes(bodies) + return &reply{p.rw, BlockBodiesMsg, reqID, data} } -// SendProofs sends a batch of legacy LES/1 merkle proofs, corresponding to the ones requested. -func (p *peer) SendProofs(reqID, bv uint64, proofs proofsData) error { - return sendResponse(p.rw, ProofsV1Msg, reqID, bv, proofs) +// ReplyCode creates a reply with a batch of arbitrary internal data, corresponding to the +// hashes requested. +func (p *peer) ReplyCode(reqID uint64, codes [][]byte) *reply { + data, _ := rlp.EncodeToBytes(codes) + return &reply{p.rw, CodeMsg, reqID, data} } -// SendProofsV2 sends a batch of merkle proofs, corresponding to the ones requested. -func (p *peer) SendProofsV2(reqID, bv uint64, proofs light.NodeList) error { - return sendResponse(p.rw, ProofsV2Msg, reqID, bv, proofs) +// ReplyReceiptsRLP creates a reply with a batch of transaction receipts, corresponding to the +// ones requested from an already RLP encoded format. +func (p *peer) ReplyReceiptsRLP(reqID uint64, receipts []rlp.RawValue) *reply { + data, _ := rlp.EncodeToBytes(receipts) + return &reply{p.rw, ReceiptsMsg, reqID, data} } -// SendHeaderProofs sends a batch of legacy LES/1 header proofs, corresponding to the ones requested. -func (p *peer) SendHeaderProofs(reqID, bv uint64, proofs []ChtResp) error { - return sendResponse(p.rw, HeaderProofsMsg, reqID, bv, proofs) +// ReplyProofsV2 creates a reply with a batch of merkle proofs, corresponding to the ones requested. +func (p *peer) ReplyProofsV2(reqID uint64, proofs light.NodeList) *reply { + data, _ := rlp.EncodeToBytes(proofs) + return &reply{p.rw, ProofsV2Msg, reqID, data} } -// SendHelperTrieProofs sends a batch of HelperTrie proofs, corresponding to the ones requested. -func (p *peer) SendHelperTrieProofs(reqID, bv uint64, resp HelperTrieResps) error { - return sendResponse(p.rw, HelperTrieProofsMsg, reqID, bv, resp) +// ReplyHelperTrieProofs creates a reply with a batch of HelperTrie proofs, corresponding to the ones requested. +func (p *peer) ReplyHelperTrieProofs(reqID uint64, resp HelperTrieResps) *reply { + data, _ := rlp.EncodeToBytes(resp) + return &reply{p.rw, HelperTrieProofsMsg, reqID, data} } -// SendTxStatus sends a batch of transaction status records, corresponding to the ones requested. -func (p *peer) SendTxStatus(reqID, bv uint64, stats []txStatus) error { - return sendResponse(p.rw, TxStatusMsg, reqID, bv, stats) +// ReplyTxStatus creates a reply with a batch of transaction status records, corresponding to the ones requested. +func (p *peer) ReplyTxStatus(reqID uint64, stats []light.TxStatus) *reply { + data, _ := rlp.EncodeToBytes(stats) + return &reply{p.rw, TxStatusMsg, reqID, data} } // RequestHeadersByHash fetches a batch of blocks' headers corresponding to the @@ -269,36 +451,13 @@ func (p *peer) RequestReceipts(reqID, cost uint64, hashes []common.Hash) error { // RequestProofs fetches a batch of merkle proofs from a remote node. func (p *peer) RequestProofs(reqID, cost uint64, reqs []ProofReq) error { p.Log().Debug("Fetching batch of proofs", "count", len(reqs)) - switch p.version { - case lpv1: - return sendRequest(p.rw, GetProofsV1Msg, reqID, cost, reqs) - case lpv2: - return sendRequest(p.rw, GetProofsV2Msg, reqID, cost, reqs) - default: - panic(nil) - } + return sendRequest(p.rw, GetProofsV2Msg, reqID, cost, reqs) } // RequestHelperTrieProofs fetches a batch of HelperTrie merkle proofs from a remote node. -func (p *peer) RequestHelperTrieProofs(reqID, cost uint64, data interface{}) error { - switch p.version { - case lpv1: - reqs, ok := data.([]ChtReq) - if !ok { - return errInvalidHelpTrieReq - } - p.Log().Debug("Fetching batch of header proofs", "count", len(reqs)) - return sendRequest(p.rw, GetHeaderProofsMsg, reqID, cost, reqs) - case lpv2: - reqs, ok := data.([]HelperTrieReq) - if !ok { - return errInvalidHelpTrieReq - } - p.Log().Debug("Fetching batch of HelperTrie proofs", "count", len(reqs)) - return sendRequest(p.rw, GetHelperTrieProofsMsg, reqID, cost, reqs) - default: - panic(nil) - } +func (p *peer) RequestHelperTrieProofs(reqID, cost uint64, reqs []HelperTrieReq) error { + p.Log().Debug("Fetching batch of HelperTrie proofs", "count", len(reqs)) + return sendRequest(p.rw, GetHelperTrieProofsMsg, reqID, cost, reqs) } // RequestTxStatus fetches a batch of transaction status records from a remote node. @@ -307,17 +466,10 @@ func (p *peer) RequestTxStatus(reqID, cost uint64, txHashes []common.Hash) error return sendRequest(p.rw, GetTxStatusMsg, reqID, cost, txHashes) } -// SendTxStatus sends a batch of transactions to be added to the remote transaction pool. -func (p *peer) SendTxs(reqID, cost uint64, txs types.Transactions) error { - p.Log().Debug("Fetching batch of transactions", "count", len(txs)) - switch p.version { - case lpv1: - return p2p.Send(p.rw, SendTxMsg, txs) // old message format does not include reqID - case lpv2: - return sendRequest(p.rw, SendTxV2Msg, reqID, cost, txs) - default: - panic(nil) - } +// SendTxStatus creates a reply with a batch of transactions to be added to the remote transaction pool. +func (p *peer) SendTxs(reqID, cost uint64, txs rlp.RawValue) error { + p.Log().Debug("Sending batch of transactions", "size", len(txs)) + return sendRequest(p.rw, SendTxV2Msg, reqID, cost, txs) } type keyValueEntry struct { @@ -340,12 +492,14 @@ func (l keyValueList) add(key string, val interface{}) keyValueList { return append(l, entry) } -func (l keyValueList) decode() keyValueMap { +func (l keyValueList) decode() (keyValueMap, uint64) { m := make(keyValueMap) + var size uint64 for _, entry := range l { m[entry.Key] = entry.Value + size += uint64(len(entry.Key)) + uint64(len(entry.Value)) + 8 } - return m + return m, size } func (m keyValueMap) get(key string, val interface{}) error { @@ -401,24 +555,56 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis send = send.add("headNum", headNum) send = send.add("genesisHash", genesis) if server != nil { - send = send.add("serveHeaders", nil) - send = send.add("serveChainSince", uint64(0)) - send = send.add("serveStateSince", uint64(0)) - send = send.add("txRelay", nil) + if !server.onlyAnnounce { + send = send.add("serveHeaders", nil) + send = send.add("serveChainSince", uint64(0)) + send = send.add("serveStateSince", uint64(0)) + + // If local ethereum node is running in archive mode, advertise ourselves we have + // all version state data. Otherwise only recent state is available. + stateRecent := uint64(core.TriesInMemory - 4) + if server.archiveMode { + stateRecent = 0 + } + send = send.add("serveRecentState", stateRecent) + send = send.add("txRelay", nil) + } send = send.add("flowControl/BL", server.defParams.BufLimit) send = send.add("flowControl/MRR", server.defParams.MinRecharge) - list := server.fcCostStats.getCurrentList() - send = send.add("flowControl/MRC", list) - p.fcCosts = list.decode() + var costList RequestCostList + if server.costTracker != nil { + costList = server.costTracker.makeCostList(server.costTracker.globalFactor()) + } else { + costList = testCostList(server.testCost) + } + send = send.add("flowControl/MRC", costList) + p.fcCosts = costList.decode(ProtocolLengths[uint(p.version)]) + p.fcParams = server.defParams + + if server.protocolManager != nil && server.protocolManager.reg != nil && server.protocolManager.reg.isRunning() { + cp, height := server.protocolManager.reg.stableCheckpoint() + if cp != nil { + send = send.add("checkpoint/value", cp) + send = send.add("checkpoint/registerHeight", height) + } + } } else { - p.requestAnnounceType = announceTypeSimple // set to default until "very light" client mode is implemented - send = send.add("announceType", p.requestAnnounceType) + //on client node + p.announceType = announceTypeSimple + if p.trusted { + p.announceType = announceTypeSigned + } + send = send.add("announceType", p.announceType) } + recvList, err := p.sendReceiveHandshake(send) if err != nil { return err } - recv := recvList.decode() + recv, size := recvList.decode() + if p.rejectUpdate(size) { + return errResp(ErrRequestRejected, "") + } var rGenesis, rHash common.Hash var rVersion, rNetwork, rNum uint64 @@ -452,45 +638,96 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis if int(rVersion) != p.version { return errResp(ErrProtocolVersionMismatch, "%d (!= %d)", rVersion, p.version) } + if server != nil { // until we have a proper peer connectivity API, allow LES connection to other servers /*if recv.get("serveStateSince", nil) == nil { return errResp(ErrUselessPeer, "wanted client, got server") }*/ if recv.get("announceType", &p.announceType) != nil { + //set default announceType on server side p.announceType = announceTypeSimple } p.fcClient = flowcontrol.NewClientNode(server.fcManager, server.defParams) } else { - if recv.get("serveChainSince", nil) != nil { - return errResp(ErrUselessPeer, "peer cannot serve chain") + //mark OnlyAnnounce server if "serveHeaders", "serveChainSince", "serveStateSince" or "txRelay" fields don't exist + if recv.get("serveChainSince", &p.chainSince) != nil { + p.onlyAnnounce = true + } + if recv.get("serveRecentChain", &p.chainRecent) != nil { + p.chainRecent = 0 + } + if recv.get("serveStateSince", &p.stateSince) != nil { + p.onlyAnnounce = true } - if recv.get("serveStateSince", nil) != nil { - return errResp(ErrUselessPeer, "peer cannot serve state") + if recv.get("serveRecentState", &p.stateRecent) != nil { + p.stateRecent = 0 } if recv.get("txRelay", nil) != nil { - return errResp(ErrUselessPeer, "peer cannot relay transactions") + p.onlyAnnounce = true } - params := &flowcontrol.ServerParams{} - if err := recv.get("flowControl/BL", ¶ms.BufLimit); err != nil { + + if p.onlyAnnounce && !p.trusted { + return errResp(ErrUselessPeer, "peer cannot serve requests") + } + + var sParams flowcontrol.ServerParams + if err := recv.get("flowControl/BL", &sParams.BufLimit); err != nil { return err } - if err := recv.get("flowControl/MRR", ¶ms.MinRecharge); err != nil { + if err := recv.get("flowControl/MRR", &sParams.MinRecharge); err != nil { return err } var MRC RequestCostList if err := recv.get("flowControl/MRC", &MRC); err != nil { return err } - p.fcServerParams = params - p.fcServer = flowcontrol.NewServerNode(params) - p.fcCosts = MRC.decode() + p.fcParams = sParams + p.fcServer = flowcontrol.NewServerNode(sParams, &mclock.System{}) + p.fcCosts = MRC.decode(ProtocolLengths[uint(p.version)]) + + recv.get("checkpoint/value", &p.checkpoint) + recv.get("checkpoint/registerHeight", &p.checkpointNumber) + + if !p.onlyAnnounce { + for msgCode := range reqAvgTimeCost { + if p.fcCosts[msgCode] == nil { + return errResp(ErrUselessPeer, "peer does not support message %d", msgCode) + } + } + } } - p.headInfo = &announceData{Td: rTd, Hash: rHash, Number: rNum} return nil } +// updateFlowControl updates the flow control parameters belonging to the server +// node if the announced key/value set contains relevant fields +func (p *peer) updateFlowControl(update keyValueMap) { + if p.fcServer == nil { + return + } + params := p.fcParams + updateParams := false + if update.get("flowControl/BL", ¶ms.BufLimit) == nil { + updateParams = true + } + if update.get("flowControl/MRR", ¶ms.MinRecharge) == nil { + updateParams = true + } + if updateParams { + p.fcParams = params + p.fcServer.UpdateParams(params) + } + var MRC RequestCostList + if update.get("flowControl/MRC", &MRC) == nil { + costUpdate := MRC.decode(ProtocolLengths[uint(p.version)]) + for code, cost := range costUpdate { + p.fcCosts[code] = cost + } + } +} + // String implements fmt.Stringer. func (p *peer) String() string { return fmt.Sprintf("Peer %s [%s]", p.id, @@ -576,8 +813,10 @@ func (ps *peerSet) Unregister(id string) error { for _, n := range peers { n.unregisterPeer(p) } + p.sendQueue.quit() p.Peer.Disconnect(p2p.DiscUselessPeer) + return nil } } diff --git a/les/peer_test.go b/les/peer_test.go new file mode 100644 index 000000000000..ba8a79fe296c --- /dev/null +++ b/les/peer_test.go @@ -0,0 +1,306 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rlp" +) + +const ( + test_networkid = 10 + protocol_version = lpv2 +) + +var ( + hash = common.HexToHash("some string") + genesis = common.HexToHash("genesis hash") + headNum = uint64(1234) + td = big.NewInt(123) +) + +//ulc connects to trusted peer and send announceType=announceTypeSigned +func TestPeerHandshakeSetAnnounceTypeToAnnounceTypeSignedForTrustedPeer(t *testing.T) { + id := newNodeID(t).ID() + + //peer to connect(on ulc side) + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocol_version, + trusted: true, + rw: &rwStub{ + WriteHook: func(recvList keyValueList) { + //checking that ulc sends to peer allowedRequests=onlyAnnounceRequests and announceType = announceTypeSigned + recv, _ := recvList.decode() + var reqType uint64 + + err := recv.get("announceType", &reqType) + if err != nil { + t.Fatal(err) + } + + if reqType != announceTypeSigned { + t.Fatal("Expected announceTypeSigned") + } + }, + ReadHook: func(l keyValueList) keyValueList { + l = l.add("serveHeaders", nil) + l = l.add("serveChainSince", uint64(0)) + l = l.add("serveStateSince", uint64(0)) + l = l.add("txRelay", nil) + l = l.add("flowControl/BL", uint64(0)) + l = l.add("flowControl/MRR", uint64(0)) + l = l.add("flowControl/MRC", testCostList(0)) + + return l + }, + }, + network: test_networkid, + } + + err := p.Handshake(td, hash, headNum, genesis, nil) + if err != nil { + t.Fatalf("Handshake error: %s", err) + } + + if p.announceType != announceTypeSigned { + t.Fatal("Incorrect announceType") + } +} + +func TestPeerHandshakeAnnounceTypeSignedForTrustedPeersPeerNotInTrusted(t *testing.T) { + id := newNodeID(t).ID() + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocol_version, + rw: &rwStub{ + WriteHook: func(recvList keyValueList) { + //checking that ulc sends to peer allowedRequests=noRequests and announceType != announceTypeSigned + recv, _ := recvList.decode() + var reqType uint64 + + err := recv.get("announceType", &reqType) + if err != nil { + t.Fatal(err) + } + + if reqType == announceTypeSigned { + t.Fatal("Expected not announceTypeSigned") + } + }, + ReadHook: func(l keyValueList) keyValueList { + l = l.add("serveHeaders", nil) + l = l.add("serveChainSince", uint64(0)) + l = l.add("serveStateSince", uint64(0)) + l = l.add("txRelay", nil) + l = l.add("flowControl/BL", uint64(0)) + l = l.add("flowControl/MRR", uint64(0)) + l = l.add("flowControl/MRC", testCostList(0)) + + return l + }, + }, + network: test_networkid, + } + + err := p.Handshake(td, hash, headNum, genesis, nil) + if err != nil { + t.Fatal(err) + } + if p.announceType == announceTypeSigned { + t.Fatal("Incorrect announceType") + } +} + +func TestPeerHandshakeDefaultAllRequests(t *testing.T) { + id := newNodeID(t).ID() + + s := generateLesServer() + + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocol_version, + rw: &rwStub{ + ReadHook: func(l keyValueList) keyValueList { + l = l.add("announceType", uint64(announceTypeSigned)) + l = l.add("allowedRequests", uint64(0)) + + return l + }, + }, + network: test_networkid, + } + + err := p.Handshake(td, hash, headNum, genesis, s) + if err != nil { + t.Fatal(err) + } + + if p.onlyAnnounce { + t.Fatal("Incorrect announceType") + } +} + +func TestPeerHandshakeServerSendOnlyAnnounceRequestsHeaders(t *testing.T) { + id := newNodeID(t).ID() + + s := generateLesServer() + s.onlyAnnounce = true + + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocol_version, + rw: &rwStub{ + ReadHook: func(l keyValueList) keyValueList { + l = l.add("announceType", uint64(announceTypeSigned)) + + return l + }, + WriteHook: func(l keyValueList) { + for _, v := range l { + if v.Key == "serveHeaders" || + v.Key == "serveChainSince" || + v.Key == "serveStateSince" || + v.Key == "txRelay" { + t.Fatalf("%v exists", v.Key) + } + } + }, + }, + network: test_networkid, + } + + err := p.Handshake(td, hash, headNum, genesis, s) + if err != nil { + t.Fatal(err) + } +} +func TestPeerHandshakeClientReceiveOnlyAnnounceRequestsHeaders(t *testing.T) { + id := newNodeID(t).ID() + + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocol_version, + rw: &rwStub{ + ReadHook: func(l keyValueList) keyValueList { + l = l.add("flowControl/BL", uint64(0)) + l = l.add("flowControl/MRR", uint64(0)) + l = l.add("flowControl/MRC", RequestCostList{}) + + l = l.add("announceType", uint64(announceTypeSigned)) + + return l + }, + }, + network: test_networkid, + trusted: true, + } + + err := p.Handshake(td, hash, headNum, genesis, nil) + if err != nil { + t.Fatal(err) + } + + if !p.onlyAnnounce { + t.Fatal("onlyAnnounce must be true") + } +} + +func TestPeerHandshakeClientReturnErrorOnUselessPeer(t *testing.T) { + id := newNodeID(t).ID() + + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocol_version, + rw: &rwStub{ + ReadHook: func(l keyValueList) keyValueList { + l = l.add("flowControl/BL", uint64(0)) + l = l.add("flowControl/MRR", uint64(0)) + l = l.add("flowControl/MRC", RequestCostList{}) + + l = l.add("announceType", uint64(announceTypeSigned)) + + return l + }, + }, + network: test_networkid, + } + + err := p.Handshake(td, hash, headNum, genesis, nil) + if err == nil { + t.FailNow() + } +} + +func generateLesServer() *LesServer { + s := &LesServer{ + defParams: flowcontrol.ServerParams{ + BufLimit: uint64(300000000), + MinRecharge: uint64(50000), + }, + fcManager: flowcontrol.NewClientManager(nil, &mclock.System{}), + } + return s +} + +type rwStub struct { + ReadHook func(l keyValueList) keyValueList + WriteHook func(l keyValueList) +} + +func (s *rwStub) ReadMsg() (p2p.Msg, error) { + payload := keyValueList{} + payload = payload.add("protocolVersion", uint64(protocol_version)) + payload = payload.add("networkId", uint64(test_networkid)) + payload = payload.add("headTd", td) + payload = payload.add("headHash", hash) + payload = payload.add("headNum", headNum) + payload = payload.add("genesisHash", genesis) + + if s.ReadHook != nil { + payload = s.ReadHook(payload) + } + + size, p, err := rlp.EncodeToReader(payload) + if err != nil { + return p2p.Msg{}, err + } + + return p2p.Msg{ + Size: uint32(size), + Payload: p, + }, nil +} + +func (s *rwStub) WriteMsg(m p2p.Msg) error { + recvList := keyValueList{} + if err := m.Decode(&recvList); err != nil { + return err + } + + if s.WriteHook != nil { + s.WriteHook(recvList) + } + + return nil +} diff --git a/les/protocol.go b/les/protocol.go index 0b24f5aedb64..5fdf32b74a6a 100644 --- a/les/protocol.go +++ b/les/protocol.go @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( @@ -25,8 +24,6 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/rlp" @@ -34,19 +31,19 @@ import ( // Constants to match up protocol versions and messages const ( - lpv1 = 1 lpv2 = 2 + lpv3 = 3 ) // Supported versions of the les protocol (first is primary) var ( - ClientProtocolVersions = []uint{lpv2, lpv1} - ServerProtocolVersions = []uint{lpv2, lpv1} + ClientProtocolVersions = []uint{lpv2, lpv3} + ServerProtocolVersions = []uint{lpv2, lpv3} AdvertiseProtocolVersions = []uint{lpv2} // clients are searching for the first advertised protocol in the list ) // Number of implemented message corresponding to different protocol versions. -var ProtocolLengths = map[uint]uint64{lpv1: 15, lpv2: 22} +var ProtocolLengths = map[uint]uint64{lpv2: 22, lpv3: 24} const ( NetworkId = 1 @@ -55,7 +52,7 @@ const ( // les protocol message codes const ( - // Protocol messages belonging to LPV1 + // Protocol messages inherited from LPV1 StatusMsg = 0x00 AnnounceMsg = 0x01 GetBlockHeadersMsg = 0x02 @@ -64,14 +61,9 @@ const ( BlockBodiesMsg = 0x05 GetReceiptsMsg = 0x06 ReceiptsMsg = 0x07 - GetProofsV1Msg = 0x08 - ProofsV1Msg = 0x09 GetCodeMsg = 0x0a CodeMsg = 0x0b - SendTxMsg = 0x0c - GetHeaderProofsMsg = 0x0d - HeaderProofsMsg = 0x0e - // Protocol messages belonging to LPV2 + // Protocol messages introduced in LPV2 GetProofsV2Msg = 0x0f ProofsV2Msg = 0x10 GetHelperTrieProofsMsg = 0x11 @@ -79,8 +71,27 @@ const ( SendTxV2Msg = 0x13 GetTxStatusMsg = 0x14 TxStatusMsg = 0x15 + // Protocol messages introduced in LPV3 + StopMsg = 0x16 + ResumeMsg = 0x17 ) +type requestInfo struct { + name string + maxCount uint64 +} + +var requests = map[uint64]requestInfo{ + GetBlockHeadersMsg: {"GetBlockHeaders", MaxHeaderFetch}, + GetBlockBodiesMsg: {"GetBlockBodies", MaxBodyFetch}, + GetReceiptsMsg: {"GetReceipts", MaxReceiptFetch}, + GetCodeMsg: {"GetCode", MaxCodeFetch}, + GetProofsV2Msg: {"GetProofsV2", MaxProofsFetch}, + GetHelperTrieProofsMsg: {"GetHelperTrieProofs", MaxHelperTrieProofsFetch}, + SendTxV2Msg: {"SendTxV2", MaxTxSend}, + GetTxStatusMsg: {"GetTxStatus", MaxTxStatus}, +} + type errCode int const ( @@ -138,6 +149,14 @@ type announceData struct { Update keyValueList } +// sanityCheck verifies that the values are reasonable, as a DoS protection +func (a *announceData) sanityCheck() error { + if tdlen := a.Td.BitLen(); tdlen > 100 { + return fmt.Errorf("too large block TD: bitlen %d", tdlen) + } + return nil +} + // sign adds a signature to the block announcement by the given privKey func (a *announceData) sign(privKey *ecdsa.PrivateKey) { rlp, _ := rlp.EncodeToBytes(announceBlock{a.Hash, a.Number, a.Td}) @@ -146,9 +165,9 @@ func (a *announceData) sign(privKey *ecdsa.PrivateKey) { } // checkSignature verifies if the block announcement has a valid signature by the given pubKey -func (a *announceData) checkSignature(id enode.ID) error { +func (a *announceData) checkSignature(id enode.ID, update keyValueMap) error { var sig []byte - if err := a.Update.decode().get("sign", &sig); err != nil { + if err := update.get("sign", &sig); err != nil { return err } rlp, _ := rlp.EncodeToBytes(announceBlock{a.Hash, a.Number, a.Td}) @@ -218,9 +237,3 @@ type CodeData []struct { } type proofsData [][]rlp.RawValue - -type txStatus struct { - Status core.TxStatus - Lookup *rawdb.TxLookupEntry `rlp:"nil"` - Error string -} diff --git a/les/randselect.go b/les/randselect.go index 1cc1d3d3e0ea..8efe0c94d397 100644 --- a/les/randselect.go +++ b/les/randselect.go @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( diff --git a/les/request_test.go b/les/request_test.go index c9c18519828c..42a63c351e1e 100644 --- a/les/request_test.go +++ b/les/request_test.go @@ -28,7 +28,7 @@ import ( "github.com/ethereum/go-ethereum/light" ) -var testBankSecureTrieKey = secAddr(testBankAddress) +var testBankSecureTrieKey = secAddr(bankAddr) func secAddr(addr common.Address) []byte { return crypto.Keccak256(addr[:]) @@ -36,24 +36,18 @@ func secAddr(addr common.Address) []byte { type accessTestFn func(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest -func TestBlockAccessLes1(t *testing.T) { testAccess(t, 1, tfBlockAccess) } - func TestBlockAccessLes2(t *testing.T) { testAccess(t, 2, tfBlockAccess) } func tfBlockAccess(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest { return &light.BlockRequest{Hash: bhash, Number: number} } -func TestReceiptsAccessLes1(t *testing.T) { testAccess(t, 1, tfReceiptsAccess) } - func TestReceiptsAccessLes2(t *testing.T) { testAccess(t, 2, tfReceiptsAccess) } func tfReceiptsAccess(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest { return &light.ReceiptsRequest{Hash: bhash, Number: number} } -func TestTrieEntryAccessLes1(t *testing.T) { testAccess(t, 1, tfTrieEntryAccess) } - func TestTrieEntryAccessLes2(t *testing.T) { testAccess(t, 2, tfTrieEntryAccess) } func tfTrieEntryAccess(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest { @@ -63,8 +57,6 @@ func tfTrieEntryAccess(db ethdb.Database, bhash common.Hash, number uint64) ligh return nil } -func TestCodeAccessLes1(t *testing.T) { testAccess(t, 1, tfCodeAccess) } - func TestCodeAccessLes2(t *testing.T) { testAccess(t, 2, tfCodeAccess) } func tfCodeAccess(db ethdb.Database, bhash common.Hash, num uint64) light.OdrRequest { diff --git a/les/retrieve.go b/les/retrieve.go index d77cfea74e07..d17a02e1ae89 100644 --- a/les/retrieve.go +++ b/les/retrieve.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package les import ( @@ -80,8 +78,8 @@ type sentReq struct { // after which delivered is set to true, the validity of the response is sent on the // valid channel and no more responses are accepted. type sentReqToPeer struct { - delivered bool - valid chan bool + delivered, frozen bool + event chan int } // reqPeerEvent is sent by the request-from-peer goroutine (tryRequest) to the @@ -97,6 +95,7 @@ const ( rpHardTimeout rpDeliveredValid rpDeliveredInvalid + rpNotDelivered ) // newRetrieveManager creates the retrieve manager @@ -151,7 +150,7 @@ func (rm *retrieveManager) sendReq(reqID uint64, req *distReq, val validatorFunc req.request = func(p distPeer) func() { // before actually sending the request, put an entry into the sentTo map r.lock.Lock() - r.sentTo[p] = sentReqToPeer{false, make(chan bool, 1)} + r.sentTo[p] = sentReqToPeer{delivered: false, frozen: false, event: make(chan int, 1)} r.lock.Unlock() return request(p) } @@ -175,6 +174,17 @@ func (rm *retrieveManager) deliver(peer distPeer, msg *Msg) error { return errResp(ErrUnexpectedResponse, "reqID = %v", msg.ReqID) } +// frozen is called by the LES protocol manager when a server has suspended its service and we +// should not expect an answer for the requests already sent there +func (rm *retrieveManager) frozen(peer distPeer) { + rm.lock.RLock() + defer rm.lock.RUnlock() + + for _, req := range rm.sentReqs { + req.frozen(peer) + } +} + // reqStateFn represents a state of the retrieve loop state machine type reqStateFn func() reqStateFn @@ -217,7 +227,7 @@ func (r *sentReq) stateRequesting() reqStateFn { go r.tryRequest() r.lastReqQueued = true return r.stateRequesting - case rpDeliveredInvalid: + case rpDeliveredInvalid, rpNotDelivered: // if it was the last sent request (set to nil by update) then start a new one if !r.lastReqQueued && r.lastReqSentTo == nil { go r.tryRequest() @@ -279,7 +289,7 @@ func (r *sentReq) update(ev reqPeerEvent) { r.reqSrtoCount++ case rpHardTimeout: r.reqSrtoCount-- - case rpDeliveredValid, rpDeliveredInvalid: + case rpDeliveredValid, rpDeliveredInvalid, rpNotDelivered: if ev.peer == r.lastReqSentTo { r.lastReqSentTo = nil } else { @@ -345,12 +355,13 @@ func (r *sentReq) tryRequest() { }() select { - case ok := <-s.valid: - if ok { - r.eventsCh <- reqPeerEvent{rpDeliveredValid, p} - } else { - r.eventsCh <- reqPeerEvent{rpDeliveredInvalid, p} + case event := <-s.event: + if event == rpNotDelivered { + r.lock.Lock() + delete(r.sentTo, p) + r.lock.Unlock() } + r.eventsCh <- reqPeerEvent{event, p} return case <-time.After(softRequestTimeout): srto = true @@ -358,12 +369,13 @@ func (r *sentReq) tryRequest() { } select { - case ok := <-s.valid: - if ok { - r.eventsCh <- reqPeerEvent{rpDeliveredValid, p} - } else { - r.eventsCh <- reqPeerEvent{rpDeliveredInvalid, p} + case event := <-s.event: + if event == rpNotDelivered { + r.lock.Lock() + delete(r.sentTo, p) + r.lock.Unlock() } + r.eventsCh <- reqPeerEvent{event, p} case <-time.After(hardRequestTimeout): hrto = true r.eventsCh <- reqPeerEvent{rpHardTimeout, p} @@ -379,15 +391,37 @@ func (r *sentReq) deliver(peer distPeer, msg *Msg) error { if !ok || s.delivered { return errResp(ErrUnexpectedResponse, "reqID = %v", msg.ReqID) } + if s.frozen { + return nil + } valid := r.validate(peer, msg) == nil - r.sentTo[peer] = sentReqToPeer{true, s.valid} - s.valid <- valid + r.sentTo[peer] = sentReqToPeer{delivered: true, frozen: false, event: s.event} + if valid { + s.event <- rpDeliveredValid + } else { + s.event <- rpDeliveredInvalid + } if !valid { return errResp(ErrInvalidResponse, "reqID = %v", msg.ReqID) } return nil } +// frozen sends a "not delivered" event to the peer event channel belonging to the +// given peer if the request has been sent there, causing the state machine to not +// expect an answer and potentially even send the request to the same peer again +// when canSend allows it. +func (r *sentReq) frozen(peer distPeer) { + r.lock.Lock() + defer r.lock.Unlock() + + s, ok := r.sentTo[peer] + if ok && !s.delivered && !s.frozen { + r.sentTo[peer] = sentReqToPeer{delivered: false, frozen: true, event: s.event} + s.event <- rpNotDelivered + } +} + // stop stops the retrieval process and sets an error code that will be returned // by getError func (r *sentReq) stop(err error) { diff --git a/les/server.go b/les/server.go index 2fa0456d695d..0795baf9fd14 100644 --- a/les/server.go +++ b/les/server.go @@ -14,105 +14,206 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( "crypto/ecdsa" - "encoding/binary" - "math" "sync" + "time" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/les/flowcontrol" "github.com/ethereum/go-ethereum/light" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/discv5" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" ) +const bufLimitRatio = 6000 // fixed bufLimit/MRR ratio + type LesServer struct { lesCommons - fcManager *flowcontrol.ClientManager // nil if our node is client only - fcCostStats *requestCostStats - defParams *flowcontrol.ServerParams - lesTopics []discv5.Topic - privateKey *ecdsa.PrivateKey - quitSync chan struct{} -} + archiveMode bool // Flag whether the ethereum node runs in archive mode. -func NewLesServer(eth *eth.Ethereum, config *eth.Config) (*LesServer, error) { - quitSync := make(chan struct{}) - pm, err := NewProtocolManager(eth.BlockChain().Config(), light.DefaultServerIndexerConfig, false, config.NetworkId, eth.EventMux(), eth.Engine(), newPeerSet(), eth.BlockChain(), eth.TxPool(), eth.ChainDb(), nil, nil, nil, quitSync, new(sync.WaitGroup)) - if err != nil { - return nil, err - } + fcManager *flowcontrol.ClientManager // nil if our node is client only + costTracker *costTracker + testCost uint64 + defParams flowcontrol.ServerParams + lesTopics []discv5.Topic + privateKey *ecdsa.PrivateKey + quitSync chan struct{} + onlyAnnounce bool + thcNormal, thcBlockProcessing int // serving thread count for normal operation and block processing mode + + maxPeers int + minCapacity, freeClientCap uint64 + freeClientPool *freeClientPool +} + +func NewLesServer(e *eth.Ethereum, config *eth.Config) (*LesServer, error) { lesTopics := make([]discv5.Topic, len(AdvertiseProtocolVersions)) for i, pv := range AdvertiseProtocolVersions { - lesTopics[i] = lesTopic(eth.BlockChain().Genesis().Hash(), pv) + lesTopics[i] = lesTopic(e.BlockChain().Genesis().Hash(), pv) } - + quitSync := make(chan struct{}) srv := &LesServer{ lesCommons: lesCommons{ config: config, - chainDb: eth.ChainDb(), iConfig: light.DefaultServerIndexerConfig, - chtIndexer: light.NewChtIndexer(eth.ChainDb(), nil, params.CHTFrequencyServer, params.HelperTrieProcessConfirmations), - bloomTrieIndexer: light.NewBloomTrieIndexer(eth.ChainDb(), nil, params.BloomBitsBlocks, params.BloomTrieFrequency), - protocolManager: pm, + chainDb: e.ChainDb(), + chtIndexer: light.NewChtIndexer(e.ChainDb(), nil, params.CHTFrequency, params.HelperTrieProcessConfirmations), + bloomTrieIndexer: light.NewBloomTrieIndexer(e.ChainDb(), nil, params.BloomBitsBlocks, params.BloomTrieFrequency), }, - quitSync: quitSync, - lesTopics: lesTopics, + archiveMode: e.ArchiveMode(), + quitSync: quitSync, + lesTopics: lesTopics, + onlyAnnounce: config.UltraLightOnlyAnnounce, } + srv.costTracker, srv.minCapacity = newCostTracker(e.ChainDb(), config) logger := log.New() - - chtV1SectionCount, _, _ := srv.chtIndexer.Sections() // indexer still uses LES/1 4k section size for backwards server compatibility - chtV2SectionCount := chtV1SectionCount / (params.CHTFrequencyClient / params.CHTFrequencyServer) - if chtV2SectionCount != 0 { - // convert to LES/2 section - chtLastSection := chtV2SectionCount - 1 - // convert last LES/2 section index back to LES/1 index for chtIndexer.SectionHead - chtLastSectionV1 := (chtLastSection+1)*(params.CHTFrequencyClient/params.CHTFrequencyServer) - 1 - chtSectionHead := srv.chtIndexer.SectionHead(chtLastSectionV1) - chtRoot := light.GetChtRoot(pm.chainDb, chtLastSectionV1, chtSectionHead) - logger.Info("Loaded CHT", "section", chtLastSection, "head", chtSectionHead, "root", chtRoot) + srv.thcNormal = config.LightServ * 4 / 100 + if srv.thcNormal < 4 { + srv.thcNormal = 4 } - bloomTrieSectionCount, _, _ := srv.bloomTrieIndexer.Sections() - if bloomTrieSectionCount != 0 { - bloomTrieLastSection := bloomTrieSectionCount - 1 - bloomTrieSectionHead := srv.bloomTrieIndexer.SectionHead(bloomTrieLastSection) - bloomTrieRoot := light.GetBloomTrieRoot(pm.chainDb, bloomTrieLastSection, bloomTrieSectionHead) - logger.Info("Loaded bloom trie", "section", bloomTrieLastSection, "head", bloomTrieSectionHead, "root", bloomTrieRoot) + srv.thcBlockProcessing = config.LightServ/100 + 1 + srv.fcManager = flowcontrol.NewClientManager(nil, &mclock.System{}) + + checkpoint := srv.latestLocalCheckpoint() + if !checkpoint.Empty() { + logger.Info("Loaded latest checkpoint", "section", checkpoint.SectionIndex, "head", checkpoint.SectionHead, + "chtroot", checkpoint.CHTRoot, "bloomroot", checkpoint.BloomRoot) } - srv.chtIndexer.Start(eth.BlockChain()) - pm.server = srv + srv.chtIndexer.Start(e.BlockChain()) - srv.defParams = &flowcontrol.ServerParams{ - BufLimit: 300000000, - MinRecharge: 50000, + oracle := config.CheckpointOracle + if oracle == nil { + oracle = params.CheckpointOracles[e.BlockChain().Genesis().Hash()] } - srv.fcManager = flowcontrol.NewClientManager(uint64(config.LightServ), 10, 1000000000) - srv.fcCostStats = newCostStats(eth.ChainDb()) + registrar := newCheckpointOracle(oracle, srv.getLocalCheckpoint) + // TODO(rjl493456442) Checkpoint is useless for les server, separate handler for client and server. + pm, err := NewProtocolManager(e.BlockChain().Config(), nil, light.DefaultServerIndexerConfig, config.UltraLightServers, config.UltraLightFraction, false, config.NetworkId, e.EventMux(), newPeerSet(), e.BlockChain(), e.TxPool(), e.ChainDb(), nil, nil, registrar, quitSync, new(sync.WaitGroup), e.Synced) + if err != nil { + return nil, err + } + srv.protocolManager = pm + pm.servingQueue = newServingQueue(int64(time.Millisecond*10), float64(config.LightServ)/100) + pm.server = srv + return srv, nil } +func (s *LesServer) APIs() []rpc.API { + return []rpc.API{ + { + Namespace: "les", + Version: "1.0", + Service: NewPrivateLightAPI(&s.lesCommons, s.protocolManager.reg), + Public: false, + }, + } +} + +// startEventLoop starts an event handler loop that updates the recharge curve of +// the client manager and adjusts the client pool's size according to the total +// capacity updates coming from the client manager +func (s *LesServer) startEventLoop() { + s.protocolManager.wg.Add(1) + + var ( + processing, procLast bool + procStarted time.Time + ) + blockProcFeed := make(chan bool, 100) + s.protocolManager.blockchain.(*core.BlockChain).SubscribeBlockProcessingEvent(blockProcFeed) + totalRechargeCh := make(chan uint64, 100) + totalRecharge := s.costTracker.subscribeTotalRecharge(totalRechargeCh) + totalCapacityCh := make(chan uint64, 100) + updateRecharge := func() { + if processing { + if !procLast { + procStarted = time.Now() + } + s.protocolManager.servingQueue.setThreads(s.thcBlockProcessing) + s.fcManager.SetRechargeCurve(flowcontrol.PieceWiseLinear{{0, 0}, {totalRecharge, totalRecharge}}) + } else { + if procLast { + blockProcessingTimer.UpdateSince(procStarted) + } + s.protocolManager.servingQueue.setThreads(s.thcNormal) + s.fcManager.SetRechargeCurve(flowcontrol.PieceWiseLinear{{0, 0}, {totalRecharge / 16, totalRecharge / 2}, {totalRecharge / 2, totalRecharge / 2}, {totalRecharge, totalRecharge}}) + } + procLast = processing + } + updateRecharge() + totalCapacity := s.fcManager.SubscribeTotalCapacity(totalCapacityCh) + s.freeClientPool.setLimits(s.maxPeers, totalCapacity) + + var maxFreePeers uint64 + go func() { + for { + select { + case processing = <-blockProcFeed: + updateRecharge() + case totalRecharge = <-totalRechargeCh: + updateRecharge() + case totalCapacity = <-totalCapacityCh: + totalCapacityGauge.Update(int64(totalCapacity)) + newFreePeers := totalCapacity / s.freeClientCap + if newFreePeers < maxFreePeers && newFreePeers < uint64(s.maxPeers) { + log.Warn("Reduced total capacity", "maxFreePeers", newFreePeers) + } + maxFreePeers = newFreePeers + s.freeClientPool.setLimits(s.maxPeers, totalCapacity) + case <-s.protocolManager.quitSync: + s.protocolManager.wg.Done() + return + } + } + }() +} + func (s *LesServer) Protocols() []p2p.Protocol { return s.makeProtocols(ServerProtocolVersions) } // Start starts the LES server func (s *LesServer) Start(srvr *p2p.Server) { + s.maxPeers = s.config.LightPeers + totalRecharge := s.costTracker.totalRecharge() + if s.maxPeers > 0 { + s.freeClientCap = s.minCapacity //totalRecharge / uint64(s.maxPeers) + if s.freeClientCap < s.minCapacity { + s.freeClientCap = s.minCapacity + } + if s.freeClientCap > 0 { + s.defParams = flowcontrol.ServerParams{ + BufLimit: s.freeClientCap * bufLimitRatio, + MinRecharge: s.freeClientCap, + } + } + } + + maxCapacity := s.freeClientCap * uint64(s.maxPeers) + if totalRecharge > maxCapacity { + maxCapacity = totalRecharge + } + s.fcManager.SetCapacityLimits(s.freeClientCap, maxCapacity, s.freeClientCap*2) + s.freeClientPool = newFreeClientPool(s.chainDb, s.freeClientCap, 10000, mclock.System{}, func(id string) { go s.protocolManager.removePeer(id) }) + s.protocolManager.peers.notify(s.freeClientPool) + + s.startEventLoop() s.protocolManager.Start(s.config.LightPeers) if srvr.DiscV5 != nil { for _, topic := range s.lesTopics { @@ -134,191 +235,27 @@ func (s *LesServer) SetBloomBitsIndexer(bloomIndexer *core.ChainIndexer) { bloomIndexer.AddChildIndexer(s.bloomTrieIndexer) } +// SetClient sets the rpc client and starts running checkpoint contract if it is not yet watched. +func (s *LesServer) SetContractBackend(backend bind.ContractBackend) { + if s.protocolManager.reg != nil { + s.protocolManager.reg.start(backend) + } +} + // Stop stops the LES service func (s *LesServer) Stop() { + s.fcManager.Stop() s.chtIndexer.Close() // bloom trie indexer is closed by parent bloombits indexer - s.fcCostStats.store() - s.fcManager.Stop() go func() { <-s.protocolManager.noMorePeers }() + s.freeClientPool.stop() + s.costTracker.stop() s.protocolManager.Stop() } -type requestCosts struct { - baseCost, reqCost uint64 -} - -type requestCostTable map[uint64]*requestCosts - -type RequestCostList []struct { - MsgCode, BaseCost, ReqCost uint64 -} - -func (list RequestCostList) decode() requestCostTable { - table := make(requestCostTable) - for _, e := range list { - table[e.MsgCode] = &requestCosts{ - baseCost: e.BaseCost, - reqCost: e.ReqCost, - } - } - return table -} - -type linReg struct { - sumX, sumY, sumXX, sumXY float64 - cnt uint64 -} - -const linRegMaxCnt = 100000 - -func (l *linReg) add(x, y float64) { - if l.cnt >= linRegMaxCnt { - sub := float64(l.cnt+1-linRegMaxCnt) / linRegMaxCnt - l.sumX -= l.sumX * sub - l.sumY -= l.sumY * sub - l.sumXX -= l.sumXX * sub - l.sumXY -= l.sumXY * sub - l.cnt = linRegMaxCnt - 1 - } - l.cnt++ - l.sumX += x - l.sumY += y - l.sumXX += x * x - l.sumXY += x * y -} - -func (l *linReg) calc() (b, m float64) { - if l.cnt == 0 { - return 0, 0 - } - cnt := float64(l.cnt) - d := cnt*l.sumXX - l.sumX*l.sumX - if d < 0.001 { - return l.sumY / cnt, 0 - } - m = (cnt*l.sumXY - l.sumX*l.sumY) / d - b = (l.sumY / cnt) - (m * l.sumX / cnt) - return b, m -} - -func (l *linReg) toBytes() []byte { - var arr [40]byte - binary.BigEndian.PutUint64(arr[0:8], math.Float64bits(l.sumX)) - binary.BigEndian.PutUint64(arr[8:16], math.Float64bits(l.sumY)) - binary.BigEndian.PutUint64(arr[16:24], math.Float64bits(l.sumXX)) - binary.BigEndian.PutUint64(arr[24:32], math.Float64bits(l.sumXY)) - binary.BigEndian.PutUint64(arr[32:40], l.cnt) - return arr[:] -} - -func linRegFromBytes(data []byte) *linReg { - if len(data) != 40 { - return nil - } - l := &linReg{} - l.sumX = math.Float64frombits(binary.BigEndian.Uint64(data[0:8])) - l.sumY = math.Float64frombits(binary.BigEndian.Uint64(data[8:16])) - l.sumXX = math.Float64frombits(binary.BigEndian.Uint64(data[16:24])) - l.sumXY = math.Float64frombits(binary.BigEndian.Uint64(data[24:32])) - l.cnt = binary.BigEndian.Uint64(data[32:40]) - return l -} - -type requestCostStats struct { - lock sync.RWMutex - db ethdb.Database - stats map[uint64]*linReg -} - -type requestCostStatsRlp []struct { - MsgCode uint64 - Data []byte -} - -var rcStatsKey = []byte("_requestCostStats") - -func newCostStats(db ethdb.Database) *requestCostStats { - stats := make(map[uint64]*linReg) - for _, code := range reqList { - stats[code] = &linReg{cnt: 100} - } - - if db != nil { - data, err := db.Get(rcStatsKey) - var statsRlp requestCostStatsRlp - if err == nil { - err = rlp.DecodeBytes(data, &statsRlp) - } - if err == nil { - for _, r := range statsRlp { - if stats[r.MsgCode] != nil { - if l := linRegFromBytes(r.Data); l != nil { - stats[r.MsgCode] = l - } - } - } - } - } - - return &requestCostStats{ - db: db, - stats: stats, - } -} - -func (s *requestCostStats) store() { - s.lock.Lock() - defer s.lock.Unlock() - - statsRlp := make(requestCostStatsRlp, len(reqList)) - for i, code := range reqList { - statsRlp[i].MsgCode = code - statsRlp[i].Data = s.stats[code].toBytes() - } - - if data, err := rlp.EncodeToBytes(statsRlp); err == nil { - s.db.Put(rcStatsKey, data) - } -} - -func (s *requestCostStats) getCurrentList() RequestCostList { - s.lock.Lock() - defer s.lock.Unlock() - - list := make(RequestCostList, len(reqList)) - //fmt.Println("RequestCostList") - for idx, code := range reqList { - b, m := s.stats[code].calc() - //fmt.Println(code, s.stats[code].cnt, b/1000000, m/1000000) - if m < 0 { - b += m - m = 0 - } - if b < 0 { - b = 0 - } - - list[idx].MsgCode = code - list[idx].BaseCost = uint64(b * 2) - list[idx].ReqCost = uint64(m * 2) - } - return list -} - -func (s *requestCostStats) update(msgCode, reqCnt, cost uint64) { - s.lock.Lock() - defer s.lock.Unlock() - - c, ok := s.stats[msgCode] - if !ok || reqCnt == 0 { - return - } - c.add(float64(reqCnt), float64(cost)) -} - +// todo(rjl493456442) separate client and server implementation. func (pm *ProtocolManager) blockLoop() { pm.wg.Add(1) headCh := make(chan core.ChainHeadEvent, 10) @@ -352,27 +289,17 @@ func (pm *ProtocolManager) blockLoop() { ) for _, p := range peers { + p := p switch p.announceType { - case announceTypeSimple: - select { - case p.announceChn <- announce: - default: - pm.removePeer(p.id) - } - + p.queueSend(func() { p.SendAnnounce(announce) }) case announceTypeSigned: if !signed { signedAnnounce = announce signedAnnounce.sign(pm.server.privateKey) signed = true } - - select { - case p.announceChn <- signedAnnounce: - default: - pm.removePeer(p.id) - } + p.queueSend(func() { p.SendAnnounce(signedAnnounce) }) } } } diff --git a/les/serverpool.go b/les/serverpool.go index 0fe6e49b61cc..3e8cdee4104d 100644 --- a/les/serverpool.go +++ b/les/serverpool.go @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( @@ -126,22 +125,22 @@ type serverPool struct { discNodes chan *enode.Node discLookups chan bool + trustedNodes map[enode.ID]*enode.Node entries map[enode.ID]*poolEntry timeout, enableRetry chan *poolEntry adjustStats chan poolStatAdjust - connCh chan *connReq - disconnCh chan *disconnReq - registerCh chan *registerReq - knownQueue, newQueue poolEntryQueue knownSelect, newSelect *weightedRandomSelect knownSelected, newSelected int fastDiscover bool + connCh chan *connReq + disconnCh chan *disconnReq + registerCh chan *registerReq } // newServerPool creates a new serverPool instance -func newServerPool(db ethdb.Database, quit chan struct{}, wg *sync.WaitGroup) *serverPool { +func newServerPool(db ethdb.Database, quit chan struct{}, wg *sync.WaitGroup, trustedNodes []string) *serverPool { pool := &serverPool{ db: db, quit: quit, @@ -156,7 +155,9 @@ func newServerPool(db ethdb.Database, quit chan struct{}, wg *sync.WaitGroup) *s knownSelect: newWeightedRandomSelect(), newSelect: newWeightedRandomSelect(), fastDiscover: true, + trustedNodes: parseTrustedNodes(trustedNodes), } + pool.knownQueue = newPoolEntryQueue(maxKnownEntries, pool.removeEntry) pool.newQueue = newPoolEntryQueue(maxNewEntries, pool.removeEntry) return pool @@ -168,6 +169,7 @@ func (pool *serverPool) start(server *p2p.Server, topic discv5.Topic) { pool.dbKey = append([]byte("serverPool/"), []byte(topic)...) pool.wg.Add(1) pool.loadNodes() + pool.connectToTrustedNodes() if pool.server.DiscV5 != nil { pool.discSetPeriod = make(chan time.Duration, 1) @@ -337,8 +339,10 @@ func (pool *serverPool) eventLoop() { } case node := <-pool.discNodes: - entry := pool.findOrNewNode(node) - pool.updateCheckDial(entry) + if pool.trustedNodes[node.ID()] == nil { + entry := pool.findOrNewNode(node) + pool.updateCheckDial(entry) + } case conv := <-pool.discLookups: if conv { @@ -355,29 +359,34 @@ func (pool *serverPool) eventLoop() { } case req := <-pool.connCh: - // Handle peer connection requests. - entry := pool.entries[req.p.ID()] - if entry == nil { - entry = pool.findOrNewNode(req.node) - } - if entry.state == psConnected || entry.state == psRegistered { + if pool.trustedNodes[req.p.ID()] != nil { + // ignore trusted nodes req.result <- nil - continue - } - pool.connWg.Add(1) - entry.peer = req.p - entry.state = psConnected - addr := &poolEntryAddress{ - ip: req.node.IP(), - port: uint16(req.node.TCP()), - lastSeen: mclock.Now(), + } else { + // Handle peer connection requests. + entry := pool.entries[req.p.ID()] + if entry == nil { + entry = pool.findOrNewNode(req.node) + } + if entry.state == psConnected || entry.state == psRegistered { + req.result <- nil + continue + } + pool.connWg.Add(1) + entry.peer = req.p + entry.state = psConnected + addr := &poolEntryAddress{ + ip: req.node.IP(), + port: uint16(req.node.TCP()), + lastSeen: mclock.Now(), + } + entry.lastConnected = addr + entry.addr = make(map[string]*poolEntryAddress) + entry.addr[addr.strKey()] = addr + entry.addrSelect = *newWeightedRandomSelect() + entry.addrSelect.update(addr) + req.result <- entry } - entry.lastConnected = addr - entry.addr = make(map[string]*poolEntryAddress) - entry.addr[addr.strKey()] = addr - entry.addrSelect = *newWeightedRandomSelect() - entry.addrSelect.update(addr) - req.result <- entry case req := <-pool.registerCh: // Handle peer registration requests. @@ -470,9 +479,40 @@ func (pool *serverPool) loadNodes() { "response", fmt.Sprintf("%v/%v", time.Duration(e.responseStats.avg), e.responseStats.weight), "timeout", fmt.Sprintf("%v/%v", e.timeoutStats.avg, e.timeoutStats.weight)) pool.entries[e.node.ID()] = e - pool.knownQueue.setLatest(e) - pool.knownSelect.update((*knownEntry)(e)) + if pool.trustedNodes[e.node.ID()] == nil { + pool.knownQueue.setLatest(e) + pool.knownSelect.update((*knownEntry)(e)) + } + } +} + +// connectToTrustedNodes adds trusted server nodes as static trusted peers. +// +// Note: trusted nodes are not handled by the server pool logic, they are not +// added to either the known or new selection pools. They are connected/reconnected +// by p2p.Server whenever possible. +func (pool *serverPool) connectToTrustedNodes() { + //connect to trusted nodes + for _, node := range pool.trustedNodes { + pool.server.AddTrustedPeer(node) + pool.server.AddPeer(node) + log.Debug("Added trusted node", "id", node.ID().String()) + } +} + +// parseTrustedNodes returns valid and parsed enodes +func parseTrustedNodes(trustedNodes []string) map[enode.ID]*enode.Node { + nodes := make(map[enode.ID]*enode.Node) + + for _, node := range trustedNodes { + node, err := enode.Parse(enode.ValidSchemes, node) + if err != nil { + log.Warn("Trusted node URL invalid", "enode", node, "err", err) + continue + } + nodes[node.ID()] = node } + return nodes } // saveNodes saves known nodes and their statistics into the database. Nodes are @@ -683,7 +723,7 @@ func (e *poolEntry) DecodeRLP(s *rlp.Stream) error { } func encodePubkey64(pub *ecdsa.PublicKey) []byte { - return crypto.FromECDSAPub(pub)[:1] + return crypto.FromECDSAPub(pub)[1:] } func decodePubkey64(b []byte) (*ecdsa.PublicKey, error) { diff --git a/les/servingqueue.go b/les/servingqueue.go new file mode 100644 index 000000000000..8842cf9e9d55 --- /dev/null +++ b/les/servingqueue.go @@ -0,0 +1,378 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "sort" + "sync" + "sync/atomic" + + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/common/prque" +) + +// servingQueue allows running tasks in a limited number of threads and puts the +// waiting tasks in a priority queue +type servingQueue struct { + recentTime, queuedTime, servingTimeDiff uint64 + burstLimit, burstDropLimit uint64 + burstDecRate float64 + lastUpdate mclock.AbsTime + + queueAddCh, queueBestCh chan *servingTask + stopThreadCh, quit chan struct{} + setThreadsCh chan int + + wg sync.WaitGroup + threadCount int // number of currently running threads + queue *prque.Prque // priority queue for waiting or suspended tasks + best *servingTask // the highest priority task (not included in the queue) + suspendBias int64 // priority bias against suspending an already running task +} + +// servingTask represents a request serving task. Tasks can be implemented to +// run in multiple steps, allowing the serving queue to suspend execution between +// steps if higher priority tasks are entered. The creator of the task should +// set the following fields: +// +// - priority: greater value means higher priority; values can wrap around the int64 range +// - run: execute a single step; return true if finished +// - after: executed after run finishes or returns an error, receives the total serving time +type servingTask struct { + sq *servingQueue + servingTime, timeAdded, maxTime, expTime uint64 + peer *peer + priority int64 + biasAdded bool + token runToken + tokenCh chan runToken +} + +// runToken received by servingTask.start allows the task to run. Closing the +// channel by servingTask.stop signals the thread controller to allow a new task +// to start running. +type runToken chan struct{} + +// start blocks until the task can start and returns true if it is allowed to run. +// Returning false means that the task should be cancelled. +func (t *servingTask) start() bool { + if t.peer.isFrozen() { + return false + } + t.tokenCh = make(chan runToken, 1) + select { + case t.sq.queueAddCh <- t: + case <-t.sq.quit: + return false + } + select { + case t.token = <-t.tokenCh: + case <-t.sq.quit: + return false + } + if t.token == nil { + return false + } + t.servingTime -= uint64(mclock.Now()) + return true +} + +// done signals the thread controller about the task being finished and returns +// the total serving time of the task in nanoseconds. +func (t *servingTask) done() uint64 { + t.servingTime += uint64(mclock.Now()) + close(t.token) + diff := t.servingTime - t.timeAdded + t.timeAdded = t.servingTime + if t.expTime > diff { + t.expTime -= diff + atomic.AddUint64(&t.sq.servingTimeDiff, t.expTime) + } else { + t.expTime = 0 + } + return t.servingTime +} + +// waitOrStop can be called during the execution of the task. It blocks if there +// is a higher priority task waiting (a bias is applied in favor of the currently +// running task). Returning true means that the execution can be resumed. False +// means the task should be cancelled. +func (t *servingTask) waitOrStop() bool { + t.done() + if !t.biasAdded { + t.priority += t.sq.suspendBias + t.biasAdded = true + } + return t.start() +} + +// newServingQueue returns a new servingQueue +func newServingQueue(suspendBias int64, utilTarget float64) *servingQueue { + sq := &servingQueue{ + queue: prque.New(nil), + suspendBias: suspendBias, + queueAddCh: make(chan *servingTask, 100), + queueBestCh: make(chan *servingTask), + stopThreadCh: make(chan struct{}), + quit: make(chan struct{}), + setThreadsCh: make(chan int, 10), + burstLimit: uint64(utilTarget * bufLimitRatio * 1200000), + burstDropLimit: uint64(utilTarget * bufLimitRatio * 1000000), + burstDecRate: utilTarget, + lastUpdate: mclock.Now(), + } + sq.wg.Add(2) + go sq.queueLoop() + go sq.threadCountLoop() + return sq +} + +// newTask creates a new task with the given priority +func (sq *servingQueue) newTask(peer *peer, maxTime uint64, priority int64) *servingTask { + return &servingTask{ + sq: sq, + peer: peer, + maxTime: maxTime, + expTime: maxTime, + priority: priority, + } +} + +// threadController is started in multiple goroutines and controls the execution +// of tasks. The number of active thread controllers equals the allowed number of +// concurrently running threads. It tries to fetch the highest priority queued +// task first. If there are no queued tasks waiting then it can directly catch +// run tokens from the token channel and allow the corresponding tasks to run +// without entering the priority queue. +func (sq *servingQueue) threadController() { + for { + token := make(runToken) + select { + case best := <-sq.queueBestCh: + best.tokenCh <- token + case <-sq.stopThreadCh: + sq.wg.Done() + return + case <-sq.quit: + sq.wg.Done() + return + } + <-token + select { + case <-sq.stopThreadCh: + sq.wg.Done() + return + case <-sq.quit: + sq.wg.Done() + return + default: + } + } +} + +type ( + // peerTasks lists the tasks received from a given peer when selecting peers to freeze + peerTasks struct { + peer *peer + list []*servingTask + sumTime uint64 + priority float64 + } + // peerList is a sortable list of peerTasks + peerList []*peerTasks +) + +func (l peerList) Len() int { + return len(l) +} + +func (l peerList) Less(i, j int) bool { + return l[i].priority < l[j].priority +} + +func (l peerList) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +// freezePeers selects the peers with the worst priority queued tasks and freezes +// them until burstTime goes under burstDropLimit or all peers are frozen +func (sq *servingQueue) freezePeers() { + peerMap := make(map[*peer]*peerTasks) + var peerList peerList + if sq.best != nil { + sq.queue.Push(sq.best, sq.best.priority) + } + sq.best = nil + for sq.queue.Size() > 0 { + task := sq.queue.PopItem().(*servingTask) + tasks := peerMap[task.peer] + if tasks == nil { + bufValue, bufLimit := task.peer.fcClient.BufferStatus() + if bufLimit < 1 { + bufLimit = 1 + } + tasks = &peerTasks{ + peer: task.peer, + priority: float64(bufValue) / float64(bufLimit), // lower value comes first + } + peerMap[task.peer] = tasks + peerList = append(peerList, tasks) + } + tasks.list = append(tasks.list, task) + tasks.sumTime += task.expTime + } + sort.Sort(peerList) + drop := true + for _, tasks := range peerList { + if drop { + tasks.peer.freezeClient() + tasks.peer.fcClient.Freeze() + sq.queuedTime -= tasks.sumTime + sqQueuedGauge.Update(int64(sq.queuedTime)) + clientFreezeMeter.Mark(1) + drop = sq.recentTime+sq.queuedTime > sq.burstDropLimit + for _, task := range tasks.list { + task.tokenCh <- nil + } + } else { + for _, task := range tasks.list { + sq.queue.Push(task, task.priority) + } + } + } + if sq.queue.Size() > 0 { + sq.best = sq.queue.PopItem().(*servingTask) + } +} + +// updateRecentTime recalculates the recent serving time value +func (sq *servingQueue) updateRecentTime() { + subTime := atomic.SwapUint64(&sq.servingTimeDiff, 0) + now := mclock.Now() + dt := now - sq.lastUpdate + sq.lastUpdate = now + if dt > 0 { + subTime += uint64(float64(dt) * sq.burstDecRate) + } + if sq.recentTime > subTime { + sq.recentTime -= subTime + } else { + sq.recentTime = 0 + } +} + +// addTask inserts a task into the priority queue +func (sq *servingQueue) addTask(task *servingTask) { + if sq.best == nil { + sq.best = task + } else if task.priority > sq.best.priority { + sq.queue.Push(sq.best, sq.best.priority) + sq.best = task + } else { + sq.queue.Push(task, task.priority) + } + sq.updateRecentTime() + sq.queuedTime += task.expTime + sqServedGauge.Update(int64(sq.recentTime)) + sqQueuedGauge.Update(int64(sq.queuedTime)) + if sq.recentTime+sq.queuedTime > sq.burstLimit { + sq.freezePeers() + } +} + +// queueLoop is an event loop running in a goroutine. It receives tasks from queueAddCh +// and always tries to send the highest priority task to queueBestCh. Successfully sent +// tasks are removed from the queue. +func (sq *servingQueue) queueLoop() { + for { + if sq.best != nil { + expTime := sq.best.expTime + select { + case task := <-sq.queueAddCh: + sq.addTask(task) + case sq.queueBestCh <- sq.best: + sq.updateRecentTime() + sq.queuedTime -= expTime + sq.recentTime += expTime + sqServedGauge.Update(int64(sq.recentTime)) + sqQueuedGauge.Update(int64(sq.queuedTime)) + if sq.queue.Size() == 0 { + sq.best = nil + } else { + sq.best, _ = sq.queue.PopItem().(*servingTask) + } + case <-sq.quit: + sq.wg.Done() + return + } + } else { + select { + case task := <-sq.queueAddCh: + sq.addTask(task) + case <-sq.quit: + sq.wg.Done() + return + } + } + } +} + +// threadCountLoop is an event loop running in a goroutine. It adjusts the number +// of active thread controller goroutines. +func (sq *servingQueue) threadCountLoop() { + var threadCountTarget int + for { + for threadCountTarget > sq.threadCount { + sq.wg.Add(1) + go sq.threadController() + sq.threadCount++ + } + if threadCountTarget < sq.threadCount { + select { + case threadCountTarget = <-sq.setThreadsCh: + case sq.stopThreadCh <- struct{}{}: + sq.threadCount-- + case <-sq.quit: + sq.wg.Done() + return + } + } else { + select { + case threadCountTarget = <-sq.setThreadsCh: + case <-sq.quit: + sq.wg.Done() + return + } + } + } +} + +// setThreads sets the allowed processing thread count, suspending tasks as soon as +// possible if necessary. +func (sq *servingQueue) setThreads(threadCount int) { + select { + case sq.setThreadsCh <- threadCount: + case <-sq.quit: + return + } +} + +// stop stops task processing as soon as possible and shuts down the serving queue. +func (sq *servingQueue) stop() { + close(sq.quit) + sq.wg.Wait() +} diff --git a/les/sync.go b/les/sync.go index 1ac645585203..54fd81c2c2ff 100644 --- a/les/sync.go +++ b/les/sync.go @@ -18,11 +18,29 @@ package les import ( "context" + "errors" "time" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/log" +) + +var errInvalidCheckpoint = errors.New("invalid advertised checkpoint") + +const ( + // lightSync starts syncing from the current highest block. + // If the chain is empty, syncing the entire header chain. + lightSync = iota + + // legacyCheckpointSync starts syncing from a hardcoded checkpoint. + legacyCheckpointSync + + // checkpointSync starts syncing from a checkpoint signed by trusted + // signer or hardcoded checkpoint for compatibility. + checkpointSync ) // syncer is responsible for periodically synchronising with the network, both @@ -54,26 +72,141 @@ func (pm *ProtocolManager) syncer() { } } -func (pm *ProtocolManager) needToSync(peerHead blockInfo) bool { - head := pm.blockchain.CurrentHeader() - currentTd := rawdb.ReadTd(pm.chainDb, head.Hash(), head.Number.Uint64()) - return currentTd != nil && peerHead.Td.Cmp(currentTd) > 0 +// validateCheckpoint verifies the advertised checkpoint by peer is valid or not. +// +// Each network has several hard-coded checkpoint signer addresses. Only the +// checkpoint issued by the specified signer is considered valid. +// +// In addition to the checkpoint registered in the registrar contract, there are +// several legacy hardcoded checkpoints in our codebase. These checkpoints are +// also considered as valid. +func (pm *ProtocolManager) validateCheckpoint(peer *peer) error { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + // Fetch the block header corresponding to the checkpoint registration. + cp := peer.checkpoint + header, err := light.GetUntrustedHeaderByNumber(ctx, pm.odr, peer.checkpointNumber, peer.id) + if err != nil { + return err + } + // Fetch block logs associated with the block header. + logs, err := light.GetUntrustedBlockLogs(ctx, pm.odr, header) + if err != nil { + return err + } + events := pm.reg.contract.LookupCheckpointEvents(logs, cp.SectionIndex, cp.Hash()) + if len(events) == 0 { + return errInvalidCheckpoint + } + var ( + index = events[0].Index + hash = events[0].CheckpointHash + signatures [][]byte + ) + for _, event := range events { + signatures = append(signatures, append(event.R[:], append(event.S[:], event.V)...)) + } + valid, signers := pm.reg.verifySigners(index, hash, signatures) + if !valid { + return errInvalidCheckpoint + } + log.Warn("Verified advertised checkpoint", "peer", peer.id, "signers", len(signers)) + return nil } -// synchronise tries to sync up our local block chain with a remote peer. +// synchronise tries to sync up our local chain with a remote peer. func (pm *ProtocolManager) synchronise(peer *peer) { - // Short circuit if no peers are available + // Short circuit if the peer is nil. if peer == nil { return } - // Make sure the peer's TD is higher than our own. - if !pm.needToSync(peer.headBlockInfo()) { + latest := pm.blockchain.CurrentHeader() + currentTd := rawdb.ReadTd(pm.chainDb, latest.Hash(), latest.Number.Uint64()) + if currentTd != nil && peer.headBlockInfo().Td.Cmp(currentTd) < 0 { return } + // Recap the checkpoint. + // + // The light client may be connected to several different versions of the server. + // (1) Old version server which can not provide stable checkpoint in the handshake packet. + // => Use hardcoded checkpoint or empty checkpoint + // (2) New version server but simple checkpoint syncing is not enabled(e.g. mainnet, new testnet or private network) + // => Use hardcoded checkpoint or empty checkpoint + // (3) New version server but the provided stable checkpoint is even lower than the hardcoded one. + // => Use hardcoded checkpoint + // (4) New version server with valid and higher stable checkpoint + // => Use provided checkpoint + var checkpoint = &peer.checkpoint + var hardcoded bool + if pm.checkpoint != nil && pm.checkpoint.SectionIndex >= peer.checkpoint.SectionIndex { + checkpoint = pm.checkpoint // Use the hardcoded one. + hardcoded = true + } + // Determine whether we should run checkpoint syncing or normal light syncing. + // + // Here has four situations that we will disable the checkpoint syncing: + // + // 1. The checkpoint is empty + // 2. The latest head block of the local chain is above the checkpoint. + // 3. The checkpoint is hardcoded(recap with local hardcoded checkpoint) + // 4. For some networks the checkpoint syncing is not activated. + mode := checkpointSync + switch { + case checkpoint.Empty(): + mode = lightSync + log.Debug("Disable checkpoint syncing", "reason", "empty checkpoint") + case latest.Number.Uint64() >= (checkpoint.SectionIndex+1)*pm.iConfig.ChtSize-1: + mode = lightSync + log.Debug("Disable checkpoint syncing", "reason", "local chain beyond the checkpoint") + case hardcoded: + mode = legacyCheckpointSync + log.Debug("Disable checkpoint syncing", "reason", "checkpoint is hardcoded") + case pm.reg == nil || !pm.reg.isRunning(): + mode = legacyCheckpointSync + log.Debug("Disable checkpoint syncing", "reason", "checkpoint syncing is not activated") + } + // Notify testing framework if syncing has completed(for testing purpose). + defer func() { + if pm.reg != nil && pm.reg.syncDoneHook != nil { + pm.reg.syncDoneHook() + } + }() + start := time.Now() + if mode == checkpointSync || mode == legacyCheckpointSync { + // Validate the advertised checkpoint + if mode == legacyCheckpointSync { + checkpoint = pm.checkpoint + } else if mode == checkpointSync { + if err := pm.validateCheckpoint(peer); err != nil { + log.Debug("Failed to validate checkpoint", "reason", err) + pm.removePeer(peer.id) + return + } + pm.blockchain.(*light.LightChain).AddTrustedCheckpoint(checkpoint) + } + log.Debug("Checkpoint syncing start", "peer", peer.id, "checkpoint", checkpoint.SectionIndex) - ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) - defer cancel() - pm.blockchain.(*light.LightChain).SyncCht(ctx) - pm.downloader.Synchronise(peer.id, peer.Head(), peer.Td(), downloader.LightSync) + // Fetch the start point block header. + // + // For the ethash consensus engine, the start header is the block header + // of the checkpoint. + // + // For the clique consensus engine, the start header is the block header + // of the latest epoch covered by checkpoint. + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() + if !checkpoint.Empty() && !pm.blockchain.(*light.LightChain).SyncCheckpoint(ctx, checkpoint) { + log.Debug("Sync checkpoint failed") + pm.removePeer(peer.id) + return + } + } + // Fetch the remaining block headers based on the current chain header. + if err := pm.downloader.Synchronise(peer.id, peer.Head(), peer.Td(), downloader.LightSync); err != nil { + log.Debug("Synchronise failed", "reason", err) + return + } + log.Debug("Synchronise finished", "elapsed", common.PrettyDuration(time.Since(start))) } diff --git a/les/sync_test.go b/les/sync_test.go new file mode 100644 index 000000000000..3a75d6856dd5 --- /dev/null +++ b/les/sync_test.go @@ -0,0 +1,134 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "fmt" + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/params" +) + +// Test light syncing which will download all headers from genesis. +func TestLightSyncingLes2(t *testing.T) { testCheckpointSyncing(t, 2, 0) } +func TestLightSyncingLes3(t *testing.T) { testCheckpointSyncing(t, 3, 0) } + +// Test legacy checkpoint syncing which will download tail headers +// based on a hardcoded checkpoint. +func TestLegacyCheckpointSyncingLes2(t *testing.T) { testCheckpointSyncing(t, 2, 1) } +func TestLegacyCheckpointSyncingLes3(t *testing.T) { testCheckpointSyncing(t, 3, 1) } + +// Test checkpoint syncing which will download tail headers based +// on a verified checkpoint. +func TestCheckpointSyncingLes2(t *testing.T) { testCheckpointSyncing(t, 2, 2) } +func TestCheckpointSyncingLes3(t *testing.T) { testCheckpointSyncing(t, 3, 2) } + +func testCheckpointSyncing(t *testing.T, protocol int, syncMode int) { + config := light.TestServerIndexerConfig + + waitIndexers := func(cIndexer, bIndexer, btIndexer *core.ChainIndexer) { + for { + cs, _, _ := cIndexer.Sections() + bts, _, _ := btIndexer.Sections() + if cs >= 1 && bts >= 1 { + break + } + time.Sleep(10 * time.Millisecond) + } + } + // Generate 512+4 blocks (totally 1 CHT sections) + server, client, tearDown := newClientServerEnv(t, int(config.ChtSize+config.ChtConfirms), protocol, waitIndexers, false) + defer tearDown() + + expected := config.ChtSize + config.ChtConfirms + + // Checkpoint syncing or legacy checkpoint syncing. + if syncMode == 1 || syncMode == 2 { + // Assemble checkpoint 0 + s, _, head := server.chtIndexer.Sections() + cp := ¶ms.TrustedCheckpoint{ + SectionIndex: 0, + SectionHead: head, + CHTRoot: light.GetChtRoot(server.db, s-1, head), + BloomRoot: light.GetBloomTrieRoot(server.db, s-1, head), + } + if syncMode == 1 { + // Register the assembled checkpoint as hardcoded one. + client.pm.checkpoint = cp + client.pm.blockchain.(*light.LightChain).AddTrustedCheckpoint(cp) + } else { + // Register the assembled checkpoint into oracle. + header := server.backend.Blockchain().CurrentHeader() + + data := append([]byte{0x19, 0x00}, append(registrarAddr.Bytes(), append([]byte{0, 0, 0, 0, 0, 0, 0, 0}, cp.Hash().Bytes()...)...)...) + sig, _ := crypto.Sign(crypto.Keccak256(data), signerKey) + sig[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper + if _, err := server.pm.reg.contract.RegisterCheckpoint(bind.NewKeyedTransactor(signerKey), cp.SectionIndex, cp.Hash().Bytes(), new(big.Int).Sub(header.Number, big.NewInt(1)), header.ParentHash, [][]byte{sig}); err != nil { + t.Error("register checkpoint failed", err) + } + server.backend.Commit() + + // Wait for the checkpoint registration + for { + _, hash, _, err := server.pm.reg.contract.Contract().GetLatestCheckpoint(nil) + if err != nil || hash == [32]byte{} { + time.Sleep(100 * time.Millisecond) + continue + } + break + } + expected += 1 + } + } + + done := make(chan error) + client.pm.reg.syncDoneHook = func() { + header := client.pm.blockchain.CurrentHeader() + if header.Number.Uint64() == expected { + done <- nil + } else { + done <- fmt.Errorf("blockchain length mismatch, want %d, got %d", expected, header.Number) + } + } + + // Create connected peer pair. + peer, err1, lPeer, err2 := newTestPeerPair("peer", protocol, server.pm, client.pm) + select { + case <-time.After(time.Millisecond * 100): + case err := <-err1: + t.Fatalf("peer 1 handshake error: %v", err) + case err := <-err2: + t.Fatalf("peer 2 handshake error: %v", err) + } + server.rPeer, client.rPeer = peer, lPeer + + select { + case err := <-done: + if err != nil { + t.Error("sync failed", err) + } + return + case <-time.NewTimer(10 * time.Second).C: + t.Error("checkpoint syncing timeout") + } +} diff --git a/les/txrelay.go b/les/txrelay.go index 7a02cc837e67..49195161b71c 100644 --- a/les/txrelay.go +++ b/les/txrelay.go @@ -17,10 +17,12 @@ package les import ( + "context" "sync" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" ) type ltrInfo struct { @@ -28,36 +30,42 @@ type ltrInfo struct { sentTo map[*peer]struct{} } -type LesTxRelay struct { +type lesTxRelay struct { txSent map[common.Hash]*ltrInfo txPending map[common.Hash]struct{} ps *peerSet peerList []*peer peerStartPos int lock sync.RWMutex + stop chan struct{} - reqDist *requestDistributor + retriever *retrieveManager } -func NewLesTxRelay(ps *peerSet, reqDist *requestDistributor) *LesTxRelay { - r := &LesTxRelay{ +func newLesTxRelay(ps *peerSet, retriever *retrieveManager) *lesTxRelay { + r := &lesTxRelay{ txSent: make(map[common.Hash]*ltrInfo), txPending: make(map[common.Hash]struct{}), ps: ps, - reqDist: reqDist, + retriever: retriever, + stop: make(chan struct{}), } ps.notify(r) return r } -func (self *LesTxRelay) registerPeer(p *peer) { +func (self *lesTxRelay) Stop() { + close(self.stop) +} + +func (self *lesTxRelay) registerPeer(p *peer) { self.lock.Lock() defer self.lock.Unlock() self.peerList = self.ps.AllPeers() } -func (self *LesTxRelay) unregisterPeer(p *peer) { +func (self *lesTxRelay) unregisterPeer(p *peer) { self.lock.Lock() defer self.lock.Unlock() @@ -66,7 +74,7 @@ func (self *LesTxRelay) unregisterPeer(p *peer) { // send sends a list of transactions to at most a given number of peers at // once, never resending any particular transaction to the same peer twice -func (self *LesTxRelay) send(txs types.Transactions, count int) { +func (self *lesTxRelay) send(txs types.Transactions, count int) { sendTo := make(map[*peer]types.Transactions) self.peerStartPos++ // rotate the starting position of the peer list @@ -113,35 +121,36 @@ func (self *LesTxRelay) send(txs types.Transactions, count int) { for p, list := range sendTo { pp := p ll := list + enc, _ := rlp.EncodeToBytes(ll) reqID := genReqID() rq := &distReq{ getCost: func(dp distPeer) uint64 { peer := dp.(*peer) - return peer.GetRequestCost(SendTxMsg, len(ll)) + return peer.GetTxRelayCost(len(ll), len(enc)) }, canSend: func(dp distPeer) bool { - return dp.(*peer) == pp + return !dp.(*peer).onlyAnnounce && dp.(*peer) == pp }, request: func(dp distPeer) func() { peer := dp.(*peer) - cost := peer.GetRequestCost(SendTxMsg, len(ll)) - peer.fcServer.QueueRequest(reqID, cost) - return func() { peer.SendTxs(reqID, cost, ll) } + cost := peer.GetTxRelayCost(len(ll), len(enc)) + peer.fcServer.QueuedRequest(reqID, cost) + return func() { peer.SendTxs(reqID, cost, enc) } }, } - self.reqDist.queue(rq) + go self.retriever.retrieve(context.Background(), reqID, rq, func(p distPeer, msg *Msg) error { return nil }, self.stop) } } -func (self *LesTxRelay) Send(txs types.Transactions) { +func (self *lesTxRelay) Send(txs types.Transactions) { self.lock.Lock() defer self.lock.Unlock() self.send(txs, 3) } -func (self *LesTxRelay) NewHead(head common.Hash, mined []common.Hash, rollback []common.Hash) { +func (self *lesTxRelay) NewHead(head common.Hash, mined []common.Hash, rollback []common.Hash) { self.lock.Lock() defer self.lock.Unlock() @@ -164,7 +173,7 @@ func (self *LesTxRelay) NewHead(head common.Hash, mined []common.Hash, rollback } } -func (self *LesTxRelay) Discard(hashes []common.Hash) { +func (self *lesTxRelay) Discard(hashes []common.Hash) { self.lock.Lock() defer self.lock.Unlock() diff --git a/les/ulc.go b/les/ulc.go new file mode 100644 index 000000000000..b97217e79663 --- /dev/null +++ b/les/ulc.go @@ -0,0 +1,54 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "errors" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +type ulc struct { + keys map[string]bool + fraction int +} + +// newULC creates and returns an ultra light client instance. +func newULC(servers []string, fraction int) (*ulc, error) { + keys := make(map[string]bool) + for _, id := range servers { + node, err := enode.Parse(enode.ValidSchemes, id) + if err != nil { + log.Warn("Failed to parse trusted server", "id", id, "err", err) + continue + } + keys[node.ID().String()] = true + } + if len(keys) == 0 { + return nil, errors.New("no trusted servers") + } + return &ulc{ + keys: keys, + fraction: fraction, + }, nil +} + +// trusted return an indicator that whether the specified peer is trusted. +func (u *ulc) trusted(p enode.ID) bool { + return u.keys[p.String()] +} diff --git a/les/ulc_test.go b/les/ulc_test.go new file mode 100644 index 000000000000..7e9f0b6dbed0 --- /dev/null +++ b/les/ulc_test.go @@ -0,0 +1,219 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package les + +import ( + "crypto/ecdsa" + "fmt" + "math/big" + "net" + "reflect" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +func TestULCSyncWithOnePeer(t *testing.T) { + f := newFullPeerPair(t, 1, 4) + l := newLightPeer(t, []string{f.Node.String()}, 100) + + if reflect.DeepEqual(f.PM.blockchain.CurrentHeader().Hash(), l.PM.blockchain.CurrentHeader().Hash()) { + t.Fatal("blocks are equal") + } + _, _, err := connectPeers(f, l, 2) + if err != nil { + t.Fatal(err) + } + l.PM.fetcher.lock.Lock() + l.PM.fetcher.nextRequest() + l.PM.fetcher.lock.Unlock() + + if !reflect.DeepEqual(f.PM.blockchain.CurrentHeader().Hash(), l.PM.blockchain.CurrentHeader().Hash()) { + t.Fatal("sync doesn't work") + } +} + +func TestULCReceiveAnnounce(t *testing.T) { + f := newFullPeerPair(t, 1, 4) + l := newLightPeer(t, []string{f.Node.String()}, 100) + fPeer, lPeer, err := connectPeers(f, l, 2) + if err != nil { + t.Fatal(err) + } + l.PM.synchronise(fPeer) + + //check that the sync is finished correctly + if !reflect.DeepEqual(f.PM.blockchain.CurrentHeader().Hash(), l.PM.blockchain.CurrentHeader().Hash()) { + t.Fatal("sync doesn't work") + } + l.PM.peers.lock.Lock() + if len(l.PM.peers.peers) == 0 { + t.Fatal("peer list should not be empty") + } + l.PM.peers.lock.Unlock() + + time.Sleep(time.Second) + //send a signed announce message(payload doesn't matter) + td := f.PM.blockchain.GetTd(l.PM.blockchain.CurrentHeader().Hash(), l.PM.blockchain.CurrentHeader().Number.Uint64()) + announce := announceData{ + Number: l.PM.blockchain.CurrentHeader().Number.Uint64() + 1, + Td: td.Add(td, big.NewInt(1)), + } + announce.sign(f.Key) + lPeer.SendAnnounce(announce) +} + +func TestULCShouldNotSyncWithTwoPeersOneHaveEmptyChain(t *testing.T) { + f1 := newFullPeerPair(t, 1, 4) + f2 := newFullPeerPair(t, 2, 0) + l := newLightPeer(t, []string{f1.Node.String(), f2.Node.String()}, 100) + _, _, err := connectPeers(f1, l, 2) + if err != nil { + t.Fatal(err) + } + _, _, err = connectPeers(f2, l, 2) + if err != nil { + t.Fatal(err) + } + l.PM.fetcher.lock.Lock() + l.PM.fetcher.nextRequest() + l.PM.fetcher.lock.Unlock() + + if reflect.DeepEqual(f2.PM.blockchain.CurrentHeader().Hash(), l.PM.blockchain.CurrentHeader().Hash()) { + t.Fatal("Incorrect hash: second peer has empty chain") + } +} + +func TestULCShouldNotSyncWithThreePeersOneHaveEmptyChain(t *testing.T) { + f1 := newFullPeerPair(t, 1, 3) + f2 := newFullPeerPair(t, 2, 4) + f3 := newFullPeerPair(t, 3, 0) + + l := newLightPeer(t, []string{f1.Node.String(), f2.Node.String(), f3.Node.String()}, 60) + _, _, err := connectPeers(f1, l, 2) + if err != nil { + t.Fatal(err) + } + _, _, err = connectPeers(f2, l, 2) + if err != nil { + t.Fatal(err) + } + _, _, err = connectPeers(f3, l, 2) + if err != nil { + t.Fatal(err) + } + l.PM.fetcher.lock.Lock() + l.PM.fetcher.nextRequest() + l.PM.fetcher.lock.Unlock() + + if !reflect.DeepEqual(f1.PM.blockchain.CurrentHeader().Hash(), l.PM.blockchain.CurrentHeader().Hash()) { + t.Fatal("Incorrect hash") + } +} + +type pairPeer struct { + Name string + Node *enode.Node + PM *ProtocolManager + Key *ecdsa.PrivateKey +} + +func connectPeers(full, light pairPeer, version int) (*peer, *peer, error) { + // Create a message pipe to communicate through + app, net := p2p.MsgPipe() + + peerLight := full.PM.newPeer(version, NetworkId, p2p.NewPeer(light.Node.ID(), light.Name, nil), net) + peerFull := light.PM.newPeer(version, NetworkId, p2p.NewPeer(full.Node.ID(), full.Name, nil), app) + + // Start the peerLight on a new thread + errc1 := make(chan error, 1) + errc2 := make(chan error, 1) + go func() { + select { + case light.PM.newPeerCh <- peerFull: + errc1 <- light.PM.handle(peerFull) + case <-light.PM.quitSync: + errc1 <- p2p.DiscQuitting + } + }() + go func() { + select { + case full.PM.newPeerCh <- peerLight: + errc2 <- full.PM.handle(peerLight) + case <-full.PM.quitSync: + errc2 <- p2p.DiscQuitting + } + }() + + select { + case <-time.After(time.Millisecond * 100): + case err := <-errc1: + return nil, nil, fmt.Errorf("peerLight handshake error: %v", err) + case err := <-errc2: + return nil, nil, fmt.Errorf("peerFull handshake error: %v", err) + } + + return peerFull, peerLight, nil +} + +// newFullPeerPair creates node with full sync mode +func newFullPeerPair(t *testing.T, index int, numberOfblocks int) pairPeer { + db := rawdb.NewMemoryDatabase() + + pmFull, _ := newTestProtocolManagerMust(t, false, numberOfblocks, nil, nil, nil, db, nil, 0) + + peerPairFull := pairPeer{ + Name: "full node", + PM: pmFull, + } + key, err := crypto.GenerateKey() + if err != nil { + t.Fatal("generate key err:", err) + } + peerPairFull.Key = key + peerPairFull.Node = enode.NewV4(&key.PublicKey, net.ParseIP("127.0.0.1"), 35000, 35000) + return peerPairFull +} + +// newLightPeer creates node with light sync mode +func newLightPeer(t *testing.T, ulcServers []string, ulcFraction int) pairPeer { + peers := newPeerSet() + dist := newRequestDistributor(peers, make(chan struct{}), &mclock.System{}) + rm := newRetrieveManager(peers, dist, nil) + ldb := rawdb.NewMemoryDatabase() + + odr := NewLesOdr(ldb, light.DefaultClientIndexerConfig, rm) + + pmLight, _ := newTestProtocolManagerMust(t, true, 0, odr, nil, peers, ldb, ulcServers, ulcFraction) + peerPairLight := pairPeer{ + Name: "ulc node", + PM: pmLight, + } + key, err := crypto.GenerateKey() + if err != nil { + t.Fatal("generate key err:", err) + } + peerPairLight.Key = key + peerPairLight.Node = enode.NewV4(&key.PublicKey, net.IP{}, 35000, 35000) + return peerPairLight +} diff --git a/light/lightchain.go b/light/lightchain.go index 8e2734c2d943..7f64d1c28bbe 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +// Package light implements on-demand retrieval capable state and chain objects +// for the Ethereum Light Client. package light import ( @@ -35,7 +37,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" - "github.com/hashicorp/golang-lru" + lru "github.com/hashicorp/golang-lru" ) var ( @@ -50,6 +52,7 @@ type LightChain struct { hc *core.HeaderChain indexerConfig *IndexerConfig chainDb ethdb.Database + engine consensus.Engine odr OdrBackend chainFeed event.Feed chainSideFeed event.Feed @@ -57,26 +60,24 @@ type LightChain struct { scope event.SubscriptionScope genesisBlock *types.Block - mu sync.RWMutex - chainmu sync.RWMutex - bodyCache *lru.Cache // Cache for the most recent block bodies bodyRLPCache *lru.Cache // Cache for the most recent block bodies in RLP encoded format blockCache *lru.Cache // Cache for the most recent entire blocks + chainmu sync.RWMutex // protects header inserts quit chan struct{} - running int32 // running must be called automically - // procInterrupt must be atomically called - procInterrupt int32 // interrupt signaler for block processing - wg sync.WaitGroup + wg sync.WaitGroup - engine consensus.Engine + // Atomic boolean switches: + running int32 // whether LightChain is running or stopped + procInterrupt int32 // interrupts chain insert + disableCheckFreq int32 // disables header verification } // NewLightChain returns a fully initialised light chain using information // available in the database. It initialises the default Ethereum header // validator. -func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus.Engine) (*LightChain, error) { +func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus.Engine, checkpoint *params.TrustedCheckpoint) (*LightChain, error) { bodyCache, _ := lru.New(bodyCacheLimit) bodyRLPCache, _ := lru.New(bodyCacheLimit) blockCache, _ := lru.New(blockCacheLimit) @@ -100,8 +101,8 @@ func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus. if bc.genesisBlock == nil { return nil, core.ErrNoGenesis } - if cp, ok := trustedCheckpoints[bc.genesisBlock.Hash()]; ok { - bc.addTrustedCheckpoint(cp) + if checkpoint != nil { + bc.AddTrustedCheckpoint(checkpoint) } if err := bc.loadLastState(); err != nil { return nil, err @@ -117,228 +118,227 @@ func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus. return bc, nil } -// addTrustedCheckpoint adds a trusted checkpoint to the blockchain -func (self *LightChain) addTrustedCheckpoint(cp *params.TrustedCheckpoint) { - if self.odr.ChtIndexer() != nil { - StoreChtRoot(self.chainDb, cp.SectionIndex, cp.SectionHead, cp.CHTRoot) - self.odr.ChtIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) +// AddTrustedCheckpoint adds a trusted checkpoint to the blockchain +func (lc *LightChain) AddTrustedCheckpoint(cp *params.TrustedCheckpoint) { + if lc.odr.ChtIndexer() != nil { + StoreChtRoot(lc.chainDb, cp.SectionIndex, cp.SectionHead, cp.CHTRoot) + lc.odr.ChtIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) } - if self.odr.BloomTrieIndexer() != nil { - StoreBloomTrieRoot(self.chainDb, cp.SectionIndex, cp.SectionHead, cp.BloomRoot) - self.odr.BloomTrieIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) + if lc.odr.BloomTrieIndexer() != nil { + StoreBloomTrieRoot(lc.chainDb, cp.SectionIndex, cp.SectionHead, cp.BloomRoot) + lc.odr.BloomTrieIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) } - if self.odr.BloomIndexer() != nil { - self.odr.BloomIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) + if lc.odr.BloomIndexer() != nil { + lc.odr.BloomIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) } - log.Info("Added trusted checkpoint", "chain", cp.Name, "block", (cp.SectionIndex+1)*self.indexerConfig.ChtSize-1, "hash", cp.SectionHead) + log.Info("Added trusted checkpoint", "block", (cp.SectionIndex+1)*lc.indexerConfig.ChtSize-1, "hash", cp.SectionHead) } -func (self *LightChain) getProcInterrupt() bool { - return atomic.LoadInt32(&self.procInterrupt) == 1 +func (lc *LightChain) getProcInterrupt() bool { + return atomic.LoadInt32(&lc.procInterrupt) == 1 } // Odr returns the ODR backend of the chain -func (self *LightChain) Odr() OdrBackend { - return self.odr +func (lc *LightChain) Odr() OdrBackend { + return lc.odr } // loadLastState loads the last known chain state from the database. This method // assumes that the chain manager mutex is held. -func (self *LightChain) loadLastState() error { - if head := rawdb.ReadHeadHeaderHash(self.chainDb); head == (common.Hash{}) { +func (lc *LightChain) loadLastState() error { + if head := rawdb.ReadHeadHeaderHash(lc.chainDb); head == (common.Hash{}) { // Corrupt or empty database, init from scratch - self.Reset() + lc.Reset() } else { - if header := self.GetHeaderByHash(head); header != nil { - self.hc.SetCurrentHeader(header) + if header := lc.GetHeaderByHash(head); header != nil { + lc.hc.SetCurrentHeader(header) } } // Issue a status log and return - header := self.hc.CurrentHeader() - headerTd := self.GetTd(header.Hash(), header.Number.Uint64()) - log.Info("Loaded most recent local header", "number", header.Number, "hash", header.Hash(), "td", headerTd, "age", common.PrettyAge(time.Unix(header.Time.Int64(), 0))) + header := lc.hc.CurrentHeader() + headerTd := lc.GetTd(header.Hash(), header.Number.Uint64()) + log.Info("Loaded most recent local header", "number", header.Number, "hash", header.Hash(), "td", headerTd, "age", common.PrettyAge(time.Unix(int64(header.Time), 0))) return nil } // SetHead rewinds the local chain to a new head. Everything above the new // head will be deleted and the new one set. -func (bc *LightChain) SetHead(head uint64) { - bc.mu.Lock() - defer bc.mu.Unlock() +func (lc *LightChain) SetHead(head uint64) error { + lc.chainmu.Lock() + defer lc.chainmu.Unlock() - bc.hc.SetHead(head, nil) - bc.loadLastState() + lc.hc.SetHead(head, nil, nil) + return lc.loadLastState() } // GasLimit returns the gas limit of the current HEAD block. -func (self *LightChain) GasLimit() uint64 { - return self.hc.CurrentHeader().GasLimit +func (lc *LightChain) GasLimit() uint64 { + return lc.hc.CurrentHeader().GasLimit } // Reset purges the entire blockchain, restoring it to its genesis state. -func (bc *LightChain) Reset() { - bc.ResetWithGenesisBlock(bc.genesisBlock) +func (lc *LightChain) Reset() { + lc.ResetWithGenesisBlock(lc.genesisBlock) } // ResetWithGenesisBlock purges the entire blockchain, restoring it to the // specified genesis state. -func (bc *LightChain) ResetWithGenesisBlock(genesis *types.Block) { +func (lc *LightChain) ResetWithGenesisBlock(genesis *types.Block) { // Dump the entire block chain and purge the caches - bc.SetHead(0) + lc.SetHead(0) - bc.mu.Lock() - defer bc.mu.Unlock() + lc.chainmu.Lock() + defer lc.chainmu.Unlock() // Prepare the genesis block and reinitialise the chain - rawdb.WriteTd(bc.chainDb, genesis.Hash(), genesis.NumberU64(), genesis.Difficulty()) - rawdb.WriteBlock(bc.chainDb, genesis) + rawdb.WriteTd(lc.chainDb, genesis.Hash(), genesis.NumberU64(), genesis.Difficulty()) + rawdb.WriteBlock(lc.chainDb, genesis) - bc.genesisBlock = genesis - bc.hc.SetGenesis(bc.genesisBlock.Header()) - bc.hc.SetCurrentHeader(bc.genesisBlock.Header()) + lc.genesisBlock = genesis + lc.hc.SetGenesis(lc.genesisBlock.Header()) + lc.hc.SetCurrentHeader(lc.genesisBlock.Header()) } // Accessors // Engine retrieves the light chain's consensus engine. -func (bc *LightChain) Engine() consensus.Engine { return bc.engine } +func (lc *LightChain) Engine() consensus.Engine { return lc.engine } // Genesis returns the genesis block -func (bc *LightChain) Genesis() *types.Block { - return bc.genesisBlock +func (lc *LightChain) Genesis() *types.Block { + return lc.genesisBlock } -// State returns a new mutable state based on the current HEAD block. -func (bc *LightChain) State() (*state.StateDB, error) { - return nil, errors.New("not implemented, needs client/server interface split") +func (lc *LightChain) StateCache() state.Database { + panic("not implemented") } // GetBody retrieves a block body (transactions and uncles) from the database // or ODR service by hash, caching it if found. -func (self *LightChain) GetBody(ctx context.Context, hash common.Hash) (*types.Body, error) { +func (lc *LightChain) GetBody(ctx context.Context, hash common.Hash) (*types.Body, error) { // Short circuit if the body's already in the cache, retrieve otherwise - if cached, ok := self.bodyCache.Get(hash); ok { + if cached, ok := lc.bodyCache.Get(hash); ok { body := cached.(*types.Body) return body, nil } - number := self.hc.GetBlockNumber(hash) + number := lc.hc.GetBlockNumber(hash) if number == nil { return nil, errors.New("unknown block") } - body, err := GetBody(ctx, self.odr, hash, *number) + body, err := GetBody(ctx, lc.odr, hash, *number) if err != nil { return nil, err } // Cache the found body for next time and return - self.bodyCache.Add(hash, body) + lc.bodyCache.Add(hash, body) return body, nil } // GetBodyRLP retrieves a block body in RLP encoding from the database or // ODR service by hash, caching it if found. -func (self *LightChain) GetBodyRLP(ctx context.Context, hash common.Hash) (rlp.RawValue, error) { +func (lc *LightChain) GetBodyRLP(ctx context.Context, hash common.Hash) (rlp.RawValue, error) { // Short circuit if the body's already in the cache, retrieve otherwise - if cached, ok := self.bodyRLPCache.Get(hash); ok { + if cached, ok := lc.bodyRLPCache.Get(hash); ok { return cached.(rlp.RawValue), nil } - number := self.hc.GetBlockNumber(hash) + number := lc.hc.GetBlockNumber(hash) if number == nil { return nil, errors.New("unknown block") } - body, err := GetBodyRLP(ctx, self.odr, hash, *number) + body, err := GetBodyRLP(ctx, lc.odr, hash, *number) if err != nil { return nil, err } // Cache the found body for next time and return - self.bodyRLPCache.Add(hash, body) + lc.bodyRLPCache.Add(hash, body) return body, nil } // HasBlock checks if a block is fully present in the database or not, caching // it if present. -func (bc *LightChain) HasBlock(hash common.Hash, number uint64) bool { - blk, _ := bc.GetBlock(NoOdr, hash, number) +func (lc *LightChain) HasBlock(hash common.Hash, number uint64) bool { + blk, _ := lc.GetBlock(NoOdr, hash, number) return blk != nil } // GetBlock retrieves a block from the database or ODR service by hash and number, // caching it if found. -func (self *LightChain) GetBlock(ctx context.Context, hash common.Hash, number uint64) (*types.Block, error) { +func (lc *LightChain) GetBlock(ctx context.Context, hash common.Hash, number uint64) (*types.Block, error) { // Short circuit if the block's already in the cache, retrieve otherwise - if block, ok := self.blockCache.Get(hash); ok { + if block, ok := lc.blockCache.Get(hash); ok { return block.(*types.Block), nil } - block, err := GetBlock(ctx, self.odr, hash, number) + block, err := GetBlock(ctx, lc.odr, hash, number) if err != nil { return nil, err } // Cache the found block for next time and return - self.blockCache.Add(block.Hash(), block) + lc.blockCache.Add(block.Hash(), block) return block, nil } // GetBlockByHash retrieves a block from the database or ODR service by hash, // caching it if found. -func (self *LightChain) GetBlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { - number := self.hc.GetBlockNumber(hash) +func (lc *LightChain) GetBlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + number := lc.hc.GetBlockNumber(hash) if number == nil { return nil, errors.New("unknown block") } - return self.GetBlock(ctx, hash, *number) + return lc.GetBlock(ctx, hash, *number) } // GetBlockByNumber retrieves a block from the database or ODR service by // number, caching it (associated with its hash) if found. -func (self *LightChain) GetBlockByNumber(ctx context.Context, number uint64) (*types.Block, error) { - hash, err := GetCanonicalHash(ctx, self.odr, number) +func (lc *LightChain) GetBlockByNumber(ctx context.Context, number uint64) (*types.Block, error) { + hash, err := GetCanonicalHash(ctx, lc.odr, number) if hash == (common.Hash{}) || err != nil { return nil, err } - return self.GetBlock(ctx, hash, number) + return lc.GetBlock(ctx, hash, number) } // Stop stops the blockchain service. If any imports are currently in progress // it will abort them using the procInterrupt. -func (bc *LightChain) Stop() { - if !atomic.CompareAndSwapInt32(&bc.running, 0, 1) { +func (lc *LightChain) Stop() { + if !atomic.CompareAndSwapInt32(&lc.running, 0, 1) { return } - close(bc.quit) - atomic.StoreInt32(&bc.procInterrupt, 1) + close(lc.quit) + atomic.StoreInt32(&lc.procInterrupt, 1) - bc.wg.Wait() + lc.wg.Wait() log.Info("Blockchain manager stopped") } // Rollback is designed to remove a chain of links from the database that aren't // certain enough to be valid. -func (self *LightChain) Rollback(chain []common.Hash) { - self.mu.Lock() - defer self.mu.Unlock() +func (lc *LightChain) Rollback(chain []common.Hash) { + lc.chainmu.Lock() + defer lc.chainmu.Unlock() for i := len(chain) - 1; i >= 0; i-- { hash := chain[i] - if head := self.hc.CurrentHeader(); head.Hash() == hash { - self.hc.SetCurrentHeader(self.GetHeader(head.ParentHash, head.Number.Uint64()-1)) + if head := lc.hc.CurrentHeader(); head.Hash() == hash { + lc.hc.SetCurrentHeader(lc.GetHeader(head.ParentHash, head.Number.Uint64()-1)) } } } // postChainEvents iterates over the events generated by a chain insertion and // posts them into the event feed. -func (self *LightChain) postChainEvents(events []interface{}) { +func (lc *LightChain) postChainEvents(events []interface{}) { for _, event := range events { switch ev := event.(type) { case core.ChainEvent: - if self.CurrentHeader().Hash() == ev.Hash { - self.chainHeadFeed.Send(core.ChainHeadEvent{Block: ev.Block}) + if lc.CurrentHeader().Hash() == ev.Hash { + lc.chainHeadFeed.Send(core.ChainHeadEvent{Block: ev.Block}) } - self.chainFeed.Send(ev) + lc.chainFeed.Send(ev) case core.ChainSideEvent: - self.chainSideFeed.Send(ev) + lc.chainSideFeed.Send(ev) } } } @@ -354,28 +354,25 @@ func (self *LightChain) postChainEvents(events []interface{}) { // // In the case of a light chain, InsertHeaderChain also creates and posts light // chain events when necessary. -func (self *LightChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) { +func (lc *LightChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) { + if atomic.LoadInt32(&lc.disableCheckFreq) == 1 { + checkFreq = 0 + } start := time.Now() - if i, err := self.hc.ValidateHeaderChain(chain, checkFreq); err != nil { + if i, err := lc.hc.ValidateHeaderChain(chain, checkFreq); err != nil { return i, err } // Make sure only one thread manipulates the chain at once - self.chainmu.Lock() - defer func() { - self.chainmu.Unlock() - time.Sleep(time.Millisecond * 10) // ugly hack; do not hog chain lock in case syncing is CPU-limited by validation - }() + lc.chainmu.Lock() + defer lc.chainmu.Unlock() - self.wg.Add(1) - defer self.wg.Done() + lc.wg.Add(1) + defer lc.wg.Done() var events []interface{} whFunc := func(header *types.Header) error { - self.mu.Lock() - defer self.mu.Unlock() - - status, err := self.hc.WriteHeader(header) + status, err := lc.hc.WriteHeader(header) switch status { case core.CanonStatTy: @@ -388,51 +385,51 @@ func (self *LightChain) InsertHeaderChain(chain []*types.Header, checkFreq int) } return err } - i, err := self.hc.InsertHeaderChain(chain, whFunc, start) - self.postChainEvents(events) + i, err := lc.hc.InsertHeaderChain(chain, whFunc, start) + lc.postChainEvents(events) return i, err } // CurrentHeader retrieves the current head header of the canonical chain. The // header is retrieved from the HeaderChain's internal cache. -func (self *LightChain) CurrentHeader() *types.Header { - return self.hc.CurrentHeader() +func (lc *LightChain) CurrentHeader() *types.Header { + return lc.hc.CurrentHeader() } // GetTd retrieves a block's total difficulty in the canonical chain from the // database by hash and number, caching it if found. -func (self *LightChain) GetTd(hash common.Hash, number uint64) *big.Int { - return self.hc.GetTd(hash, number) +func (lc *LightChain) GetTd(hash common.Hash, number uint64) *big.Int { + return lc.hc.GetTd(hash, number) } // GetTdByHash retrieves a block's total difficulty in the canonical chain from the // database by hash, caching it if found. -func (self *LightChain) GetTdByHash(hash common.Hash) *big.Int { - return self.hc.GetTdByHash(hash) +func (lc *LightChain) GetTdByHash(hash common.Hash) *big.Int { + return lc.hc.GetTdByHash(hash) } // GetHeader retrieves a block header from the database by hash and number, // caching it if found. -func (self *LightChain) GetHeader(hash common.Hash, number uint64) *types.Header { - return self.hc.GetHeader(hash, number) +func (lc *LightChain) GetHeader(hash common.Hash, number uint64) *types.Header { + return lc.hc.GetHeader(hash, number) } // GetHeaderByHash retrieves a block header from the database by hash, caching it if // found. -func (self *LightChain) GetHeaderByHash(hash common.Hash) *types.Header { - return self.hc.GetHeaderByHash(hash) +func (lc *LightChain) GetHeaderByHash(hash common.Hash) *types.Header { + return lc.hc.GetHeaderByHash(hash) } // HasHeader checks if a block header is present in the database or not, caching // it if present. -func (bc *LightChain) HasHeader(hash common.Hash, number uint64) bool { - return bc.hc.HasHeader(hash, number) +func (lc *LightChain) HasHeader(hash common.Hash, number uint64) bool { + return lc.hc.HasHeader(hash, number) } // GetBlockHashesFromHash retrieves a number of block hashes starting at a given // hash, fetching towards the genesis block. -func (self *LightChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash { - return self.hc.GetBlockHashesFromHash(hash, max) +func (lc *LightChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash { + return lc.hc.GetBlockHashesFromHash(hash, max) } // GetAncestor retrieves the Nth ancestor of a given block. It assumes that either the given block or @@ -440,56 +437,56 @@ func (self *LightChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []c // number of blocks to be individually checked before we reach the canonical chain. // // Note: ancestor == 0 returns the same block, 1 returns its parent and so on. -func (bc *LightChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { - bc.chainmu.Lock() - defer bc.chainmu.Unlock() +func (lc *LightChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { + lc.chainmu.RLock() + defer lc.chainmu.RUnlock() - return bc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical) + return lc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical) } // GetHeaderByNumber retrieves a block header from the database by number, // caching it (associated with its hash) if found. -func (self *LightChain) GetHeaderByNumber(number uint64) *types.Header { - return self.hc.GetHeaderByNumber(number) +func (lc *LightChain) GetHeaderByNumber(number uint64) *types.Header { + return lc.hc.GetHeaderByNumber(number) } // GetHeaderByNumberOdr retrieves a block header from the database or network // by number, caching it (associated with its hash) if found. -func (self *LightChain) GetHeaderByNumberOdr(ctx context.Context, number uint64) (*types.Header, error) { - if header := self.hc.GetHeaderByNumber(number); header != nil { +func (lc *LightChain) GetHeaderByNumberOdr(ctx context.Context, number uint64) (*types.Header, error) { + if header := lc.hc.GetHeaderByNumber(number); header != nil { return header, nil } - return GetHeaderByNumber(ctx, self.odr, number) + return GetHeaderByNumber(ctx, lc.odr, number) } // Config retrieves the header chain's chain configuration. -func (self *LightChain) Config() *params.ChainConfig { return self.hc.Config() } +func (lc *LightChain) Config() *params.ChainConfig { return lc.hc.Config() } -func (self *LightChain) SyncCht(ctx context.Context) bool { - // If we don't have a CHT indexer, abort - if self.odr.ChtIndexer() == nil { - return false - } - // Ensure the remote CHT head is ahead of us - head := self.CurrentHeader().Number.Uint64() - sections, _, _ := self.odr.ChtIndexer().Sections() - - latest := sections*self.indexerConfig.ChtSize - 1 - if clique := self.hc.Config().Clique; clique != nil { +// SyncCheckpoint fetches the checkpoint point block header according to +// the checkpoint provided by the remote peer. +// +// Note if we are running the clique, fetches the last epoch snapshot header +// which covered by checkpoint. +func (lc *LightChain) SyncCheckpoint(ctx context.Context, checkpoint *params.TrustedCheckpoint) bool { + // Ensure the remote checkpoint head is ahead of us + head := lc.CurrentHeader().Number.Uint64() + + latest := (checkpoint.SectionIndex+1)*lc.indexerConfig.ChtSize - 1 + if clique := lc.hc.Config().Clique; clique != nil { latest -= latest % clique.Epoch // epoch snapshot for clique } if head >= latest { - return false + return true } // Retrieve the latest useful header and update to it - if header, err := GetHeaderByNumber(ctx, self.odr, latest); header != nil && err == nil { - self.mu.Lock() - defer self.mu.Unlock() + if header, err := GetHeaderByNumber(ctx, lc.odr, latest); header != nil && err == nil { + lc.chainmu.Lock() + defer lc.chainmu.Unlock() // Ensure the chain didn't move past the latest block while retrieving it - if self.hc.CurrentHeader().Number.Uint64() < header.Number.Uint64() { - log.Info("Updated latest header based on CHT", "number", header.Number, "hash", header.Hash(), "age", common.PrettyAge(time.Unix(header.Time.Int64(), 0))) - self.hc.SetCurrentHeader(header) + if lc.hc.CurrentHeader().Number.Uint64() < header.Number.Uint64() { + log.Info("Updated latest header based on CHT", "number", header.Number, "hash", header.Hash(), "age", common.PrettyAge(time.Unix(int64(header.Time), 0))) + lc.hc.SetCurrentHeader(header) } return true } @@ -498,38 +495,48 @@ func (self *LightChain) SyncCht(ctx context.Context) bool { // LockChain locks the chain mutex for reading so that multiple canonical hashes can be // retrieved while it is guaranteed that they belong to the same version of the chain -func (self *LightChain) LockChain() { - self.chainmu.RLock() +func (lc *LightChain) LockChain() { + lc.chainmu.RLock() } // UnlockChain unlocks the chain mutex -func (self *LightChain) UnlockChain() { - self.chainmu.RUnlock() +func (lc *LightChain) UnlockChain() { + lc.chainmu.RUnlock() } // SubscribeChainEvent registers a subscription of ChainEvent. -func (self *LightChain) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { - return self.scope.Track(self.chainFeed.Subscribe(ch)) +func (lc *LightChain) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { + return lc.scope.Track(lc.chainFeed.Subscribe(ch)) } // SubscribeChainHeadEvent registers a subscription of ChainHeadEvent. -func (self *LightChain) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { - return self.scope.Track(self.chainHeadFeed.Subscribe(ch)) +func (lc *LightChain) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { + return lc.scope.Track(lc.chainHeadFeed.Subscribe(ch)) } // SubscribeChainSideEvent registers a subscription of ChainSideEvent. -func (self *LightChain) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { - return self.scope.Track(self.chainSideFeed.Subscribe(ch)) +func (lc *LightChain) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { + return lc.scope.Track(lc.chainSideFeed.Subscribe(ch)) } // SubscribeLogsEvent implements the interface of filters.Backend // LightChain does not send logs events, so return an empty subscription. -func (self *LightChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { - return self.scope.Track(new(event.Feed).Subscribe(ch)) +func (lc *LightChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { + return lc.scope.Track(new(event.Feed).Subscribe(ch)) } // SubscribeRemovedLogsEvent implements the interface of filters.Backend // LightChain does not send core.RemovedLogsEvent, so return an empty subscription. -func (self *LightChain) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { - return self.scope.Track(new(event.Feed).Subscribe(ch)) +func (lc *LightChain) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { + return lc.scope.Track(new(event.Feed).Subscribe(ch)) +} + +// DisableCheckFreq disables header validation. This is used for ultralight mode. +func (lc *LightChain) DisableCheckFreq() { + atomic.StoreInt32(&lc.disableCheckFreq, 1) +} + +// EnableCheckFreq enables header validation. +func (lc *LightChain) EnableCheckFreq() { + atomic.StoreInt32(&lc.disableCheckFreq, 0) } diff --git a/light/lightchain_test.go b/light/lightchain_test.go index d45c0656d928..70d2e70c189d 100644 --- a/light/lightchain_test.go +++ b/light/lightchain_test.go @@ -52,10 +52,10 @@ func makeHeaderChain(parent *types.Header, n int, db ethdb.Database, seed int) [ // chain. Depending on the full flag, if creates either a full block chain or a // header only chain. func newCanonical(n int) (ethdb.Database, *LightChain, error) { - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() gspec := core.Genesis{Config: params.TestChainConfig} genesis := gspec.MustCommit(db) - blockchain, _ := NewLightChain(&dummyOdr{db: db, indexerConfig: TestClientIndexerConfig}, gspec.Config, ethash.NewFaker()) + blockchain, _ := NewLightChain(&dummyOdr{db: db, indexerConfig: TestClientIndexerConfig}, gspec.Config, ethash.NewFaker(), nil) // Create and inject the requested chain if n == 0 { @@ -69,13 +69,13 @@ func newCanonical(n int) (ethdb.Database, *LightChain, error) { // newTestLightChain creates a LightChain that doesn't validate anything. func newTestLightChain() *LightChain { - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() gspec := &core.Genesis{ Difficulty: big.NewInt(1), Config: params.TestChainConfig, } gspec.MustCommit(db) - lc, err := NewLightChain(&dummyOdr{db: db}, gspec.Config, ethash.NewFullFaker()) + lc, err := NewLightChain(&dummyOdr{db: db}, gspec.Config, ethash.NewFullFaker(), nil) if err != nil { panic(err) } @@ -122,10 +122,10 @@ func testHeaderChainImport(chain []*types.Header, lightchain *LightChain) error return err } // Manually insert the header into the database, but don't reorganize (allows subsequent testing) - lightchain.mu.Lock() + lightchain.chainmu.Lock() rawdb.WriteTd(lightchain.chainDb, header.Hash(), header.Number.Uint64(), new(big.Int).Add(header.Difficulty, lightchain.GetTdByHash(header.ParentHash))) rawdb.WriteHeader(lightchain.chainDb, header) - lightchain.mu.Unlock() + lightchain.chainmu.Unlock() } return nil } @@ -344,7 +344,7 @@ func TestReorgBadHeaderHashes(t *testing.T) { defer func() { delete(core.BadHashes, headers[3].Hash()) }() // Create a new LightChain and check that it rolled back the state. - ncm, err := NewLightChain(&dummyOdr{db: bc.chainDb}, params.TestChainConfig, ethash.NewFaker()) + ncm, err := NewLightChain(&dummyOdr{db: bc.chainDb}, params.TestChainConfig, ethash.NewFaker(), nil) if err != nil { t.Fatalf("failed to create new chain manager: %v", err) } diff --git a/light/nodeset.go b/light/nodeset.go index 6f25219c1305..3662596785c7 100644 --- a/light/nodeset.go +++ b/light/nodeset.go @@ -60,6 +60,15 @@ func (db *NodeSet) Put(key []byte, value []byte) error { return nil } +// Delete removes a node from the set +func (db *NodeSet) Delete(key []byte) error { + db.lock.Lock() + defer db.lock.Unlock() + + delete(db.nodes, string(key)) + return nil +} + // Get returns a stored node func (db *NodeSet) Get(key []byte) ([]byte, error) { db.lock.RLock() @@ -106,7 +115,7 @@ func (db *NodeSet) NodeList() NodeList { } // Store writes the contents of the set to the given database -func (db *NodeSet) Store(target ethdb.Putter) { +func (db *NodeSet) Store(target ethdb.KeyValueWriter) { db.lock.RLock() defer db.lock.RUnlock() @@ -115,11 +124,11 @@ func (db *NodeSet) Store(target ethdb.Putter) { } } -// NodeList stores an ordered list of trie nodes. It implements ethdb.Putter. +// NodeList stores an ordered list of trie nodes. It implements ethdb.KeyValueWriter. type NodeList []rlp.RawValue // Store writes the contents of the list to the given database -func (n NodeList) Store(db ethdb.Putter) { +func (n NodeList) Store(db ethdb.KeyValueWriter) { for _, node := range n { db.Put(crypto.Keccak256(node), node) } @@ -138,6 +147,11 @@ func (n *NodeList) Put(key []byte, value []byte) error { return nil } +// Delete panics as there's no reason to remove a node from the list. +func (n *NodeList) Delete(key []byte) error { + panic("not supported") +} + // DataSize returns the aggregated data size of nodes in the list func (n NodeList) DataSize() int { var size int diff --git a/light/odr.go b/light/odr.go index 900be05440cc..907712ede74f 100644 --- a/light/odr.go +++ b/light/odr.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package light import ( @@ -124,19 +122,25 @@ func (req *BlockRequest) StoreResult(db ethdb.Database) { // ReceiptsRequest is the ODR request type for retrieving block bodies type ReceiptsRequest struct { OdrRequest - Hash common.Hash - Number uint64 - Receipts types.Receipts + Untrusted bool // Indicator whether the result retrieved is trusted or not + Hash common.Hash + Number uint64 + Header *types.Header + Receipts types.Receipts } // StoreResult stores the retrieved data in local database func (req *ReceiptsRequest) StoreResult(db ethdb.Database) { - rawdb.WriteReceipts(db, req.Hash, req.Number, req.Receipts) + if !req.Untrusted { + rawdb.WriteReceipts(db, req.Hash, req.Number, req.Receipts) + } } // ChtRequest is the ODR request type for state/storage trie entries type ChtRequest struct { OdrRequest + Untrusted bool // Indicator whether the result retrieved is trusted or not + PeerId string // The specified peer id from which to retrieve data. Config *IndexerConfig ChtNum, BlockNum uint64 ChtRoot common.Hash @@ -149,9 +153,11 @@ type ChtRequest struct { func (req *ChtRequest) StoreResult(db ethdb.Database) { hash, num := req.Header.Hash(), req.Header.Number.Uint64() - rawdb.WriteHeader(db, req.Header) - rawdb.WriteTd(db, hash, num, req.Td) - rawdb.WriteCanonicalHash(db, hash, num) + if !req.Untrusted { + rawdb.WriteHeader(db, req.Header) + rawdb.WriteTd(db, hash, num, req.Td) + rawdb.WriteCanonicalHash(db, hash, num) + } } // BloomRequest is the ODR request type for retrieving bloom filters from a CHT structure @@ -177,3 +183,20 @@ func (req *BloomRequest) StoreResult(db ethdb.Database) { rawdb.WriteBloomBits(db, req.BitIdx, sectionIdx, sectionHead, req.BloomBits[i]) } } + +// TxStatus describes the status of a transaction +type TxStatus struct { + Status core.TxStatus + Lookup *rawdb.LegacyTxLookupEntry `rlp:"nil"` + Error string +} + +// TxStatusRequest is the ODR request type for retrieving transaction status +type TxStatusRequest struct { + OdrRequest + Hashes []common.Hash + Status []TxStatus +} + +// StoreResult stores the retrieved data in local database +func (req *TxStatusRequest) StoreResult(db ethdb.Database) {} diff --git a/light/odr_test.go b/light/odr_test.go index 3da7b3055e3d..debd5544c312 100644 --- a/light/odr_test.go +++ b/light/odr_test.go @@ -79,7 +79,7 @@ func (odr *testOdr) Retrieve(ctx context.Context, req OdrRequest) error { case *ReceiptsRequest: number := rawdb.ReadHeaderNumber(odr.sdb, req.Hash) if number != nil { - req.Receipts = rawdb.ReadReceipts(odr.sdb, req.Hash, *number) + req.Receipts = rawdb.ReadRawReceipts(odr.sdb, req.Hash, *number) } case *TrieRequest: t, _ := trie.New(req.Id.Root, trie.NewDatabase(odr.sdb)) @@ -99,7 +99,7 @@ func (odr *testOdr) IndexerConfig() *IndexerConfig { type odrTestFn func(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc *LightChain, bhash common.Hash) ([]byte, error) -func TestOdrGetBlockLes1(t *testing.T) { testChainOdr(t, 1, odrGetBlock) } +func TestOdrGetBlockLes2(t *testing.T) { testChainOdr(t, 1, odrGetBlock) } func odrGetBlock(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc *LightChain, bhash common.Hash) ([]byte, error) { var block *types.Block @@ -115,14 +115,14 @@ func odrGetBlock(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc return rlp, nil } -func TestOdrGetReceiptsLes1(t *testing.T) { testChainOdr(t, 1, odrGetReceipts) } +func TestOdrGetReceiptsLes2(t *testing.T) { testChainOdr(t, 1, odrGetReceipts) } func odrGetReceipts(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc *LightChain, bhash common.Hash) ([]byte, error) { var receipts types.Receipts if bc != nil { number := rawdb.ReadHeaderNumber(db, bhash) if number != nil { - receipts = rawdb.ReadReceipts(db, bhash, *number) + receipts = rawdb.ReadReceipts(db, bhash, *number, bc.Config()) } } else { number := rawdb.ReadHeaderNumber(db, bhash) @@ -137,7 +137,7 @@ func odrGetReceipts(ctx context.Context, db ethdb.Database, bc *core.BlockChain, return rlp, nil } -func TestOdrAccountsLes1(t *testing.T) { testChainOdr(t, 1, odrAccounts) } +func TestOdrAccountsLes2(t *testing.T) { testChainOdr(t, 1, odrAccounts) } func odrAccounts(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc *LightChain, bhash common.Hash) ([]byte, error) { dummyAddr := common.HexToAddress("1234567812345678123456781234567812345678") @@ -161,7 +161,7 @@ func odrAccounts(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc return res, st.Error() } -func TestOdrContractCallLes1(t *testing.T) { testChainOdr(t, 1, odrContractCall) } +func TestOdrContractCallLes2(t *testing.T) { testChainOdr(t, 1, odrContractCall) } type callmsg struct { types.Message @@ -250,8 +250,8 @@ func testChainGen(i int, block *core.BlockGen) { func testChainOdr(t *testing.T, protocol int, fn odrTestFn) { var ( - sdb = ethdb.NewMemDatabase() - ldb = ethdb.NewMemDatabase() + sdb = rawdb.NewMemoryDatabase() + ldb = rawdb.NewMemoryDatabase() gspec = core.Genesis{Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}} genesis = gspec.MustCommit(sdb) ) @@ -264,7 +264,7 @@ func testChainOdr(t *testing.T, protocol int, fn odrTestFn) { } odr := &testOdr{sdb: sdb, ldb: ldb, indexerConfig: TestClientIndexerConfig} - lightchain, err := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker()) + lightchain, err := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker(), nil) if err != nil { t.Fatal(err) } diff --git a/light/odr_util.go b/light/odr_util.go index 073f0d64296b..82e33bb78fa9 100644 --- a/light/odr_util.go +++ b/light/odr_util.go @@ -28,7 +28,7 @@ import ( "github.com/ethereum/go-ethereum/rlp" ) -var sha3_nil = crypto.Keccak256Hash(nil) +var sha3Nil = crypto.Keccak256Hash(nil) func GetHeaderByNumber(ctx context.Context, odr OdrBackend, number uint64) (*types.Header, error) { db := odr.Database() @@ -69,6 +69,16 @@ func GetHeaderByNumber(ctx context.Context, odr OdrBackend, number uint64) (*typ return r.Header, nil } +// GetUntrustedHeaderByNumber fetches specified block header without correctness checking. +// Note this function should only be used in light client checkpoint syncing. +func GetUntrustedHeaderByNumber(ctx context.Context, odr OdrBackend, number uint64, peerId string) (*types.Header, error) { + r := &ChtRequest{BlockNum: number, ChtNum: number / odr.IndexerConfig().ChtSize, Untrusted: true, PeerId: peerId, Config: odr.IndexerConfig()} + if err := odr.Retrieve(ctx, r); err != nil { + return nil, err + } + return r.Header, nil +} + func GetCanonicalHash(ctx context.Context, odr OdrBackend, number uint64) (common.Hash, error) { hash := rawdb.ReadCanonicalHash(odr.Database(), number) if (hash != common.Hash{}) { @@ -127,8 +137,8 @@ func GetBlock(ctx context.Context, odr OdrBackend, hash common.Hash, number uint // GetBlockReceipts retrieves the receipts generated by the transactions included // in a block given by its hash. func GetBlockReceipts(ctx context.Context, odr OdrBackend, hash common.Hash, number uint64) (types.Receipts, error) { - // Retrieve the potentially incomplete receipts from disk or network - receipts := rawdb.ReadReceipts(odr.Database(), hash, number) + // Assume receipts are already stored locally and attempt to retrieve. + receipts := rawdb.ReadRawReceipts(odr.Database(), hash, number) if receipts == nil { r := &ReceiptsRequest{Hash: hash, Number: number} if err := odr.Retrieve(ctx, r); err != nil { @@ -145,7 +155,7 @@ func GetBlockReceipts(ctx context.Context, odr OdrBackend, hash common.Hash, num genesis := rawdb.ReadCanonicalHash(odr.Database(), 0) config := rawdb.ReadChainConfig(odr.Database(), genesis) - if err := core.SetReceiptsData(config, block, receipts); err != nil { + if err := receipts.DeriveFields(config, block.Hash(), block.NumberU64(), block.Transactions()); err != nil { return nil, err } rawdb.WriteReceipts(odr.Database(), hash, number, receipts) @@ -157,13 +167,33 @@ func GetBlockReceipts(ctx context.Context, odr OdrBackend, hash common.Hash, num // block given by its hash. func GetBlockLogs(ctx context.Context, odr OdrBackend, hash common.Hash, number uint64) ([][]*types.Log, error) { // Retrieve the potentially incomplete receipts from disk or network - receipts := rawdb.ReadReceipts(odr.Database(), hash, number) + receipts, err := GetBlockReceipts(ctx, odr, hash, number) + if err != nil { + return nil, err + } + // Return the logs without deriving any computed fields on the receipts + logs := make([][]*types.Log, len(receipts)) + for i, receipt := range receipts { + logs[i] = receipt.Logs + } + return logs, nil +} + +// GetUntrustedBlockLogs retrieves the logs generated by the transactions included in a +// block. The retrieved logs are regarded as untrusted and will not be stored in the +// database. This function should only be used in light client checkpoint syncing. +func GetUntrustedBlockLogs(ctx context.Context, odr OdrBackend, header *types.Header) ([][]*types.Log, error) { + // Retrieve the potentially incomplete receipts from disk or network + hash, number := header.Hash(), header.Number.Uint64() + receipts := rawdb.ReadRawReceipts(odr.Database(), hash, number) if receipts == nil { - r := &ReceiptsRequest{Hash: hash, Number: number} + r := &ReceiptsRequest{Hash: hash, Number: number, Header: header, Untrusted: true} if err := odr.Retrieve(ctx, r); err != nil { return nil, err } receipts = r.Receipts + // Untrusted receipts won't be stored in the database. Therefore + // derived fields computation is unnecessary. } // Return the logs without deriving any computed fields on the receipts logs := make([][]*types.Log, len(receipts)) @@ -232,3 +262,23 @@ func GetBloomBits(ctx context.Context, odr OdrBackend, bitIdx uint, sectionIdxLi return result, nil } } + +// GetTransaction retrieves a canonical transaction by hash and also returns its position in the chain +func GetTransaction(ctx context.Context, odr OdrBackend, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { + r := &TxStatusRequest{Hashes: []common.Hash{txHash}} + if err := odr.Retrieve(ctx, r); err != nil || r.Status[0].Status != core.TxStatusIncluded { + return nil, common.Hash{}, 0, 0, err + } else { + pos := r.Status[0].Lookup + // first ensure that we have the header, otherwise block body retrieval will fail + // also verify if this is a canonical block by getting the header by number and checking its hash + if header, err := GetHeaderByNumber(ctx, odr, pos.BlockIndex); err != nil || header.Hash() != pos.BlockHash { + return nil, common.Hash{}, 0, 0, err + } + if body, err := GetBody(ctx, odr, pos.BlockHash, pos.BlockIndex); err != nil || uint64(len(body.Transactions)) <= pos.Index || body.Transactions[pos.Index].Hash() != txHash { + return nil, common.Hash{}, 0, 0, err + } else { + return body.Transactions[pos.Index], pos.BlockHash, pos.BlockIndex, pos.Index, nil + } + } +} diff --git a/light/postprocess.go b/light/postprocess.go index 2f8cb73ab1d4..bf632a4496c5 100644 --- a/light/postprocess.go +++ b/light/postprocess.go @@ -41,9 +41,6 @@ type IndexerConfig struct { // The block frequency for creating CHTs. ChtSize uint64 - // A special auxiliary field represents client's chtsize for server config, otherwise represents server's chtsize. - PairChtSize uint64 - // The number of confirmations needed to generate/accept a canonical hash help trie. ChtConfirms uint64 @@ -64,8 +61,7 @@ type IndexerConfig struct { var ( // DefaultServerIndexerConfig wraps a set of configs as a default indexer config for server side. DefaultServerIndexerConfig = &IndexerConfig{ - ChtSize: params.CHTFrequencyServer, - PairChtSize: params.CHTFrequencyClient, + ChtSize: params.CHTFrequency, ChtConfirms: params.HelperTrieProcessConfirmations, BloomSize: params.BloomBitsBlocks, BloomConfirms: params.BloomConfirms, @@ -74,8 +70,7 @@ var ( } // DefaultClientIndexerConfig wraps a set of configs as a default indexer config for client side. DefaultClientIndexerConfig = &IndexerConfig{ - ChtSize: params.CHTFrequencyClient, - PairChtSize: params.CHTFrequencyServer, + ChtSize: params.CHTFrequency, ChtConfirms: params.HelperTrieConfirmations, BloomSize: params.BloomBitsBlocksClient, BloomConfirms: params.HelperTrieConfirmations, @@ -84,38 +79,29 @@ var ( } // TestServerIndexerConfig wraps a set of configs as a test indexer config for server side. TestServerIndexerConfig = &IndexerConfig{ - ChtSize: 256, - PairChtSize: 2048, - ChtConfirms: 16, - BloomSize: 256, - BloomConfirms: 16, - BloomTrieSize: 2048, - BloomTrieConfirms: 16, + ChtSize: 512, + ChtConfirms: 4, + BloomSize: 64, + BloomConfirms: 4, + BloomTrieSize: 512, + BloomTrieConfirms: 4, } // TestClientIndexerConfig wraps a set of configs as a test indexer config for client side. TestClientIndexerConfig = &IndexerConfig{ - ChtSize: 2048, - PairChtSize: 256, - ChtConfirms: 128, - BloomSize: 2048, - BloomConfirms: 128, - BloomTrieSize: 2048, - BloomTrieConfirms: 128, + ChtSize: 512, + ChtConfirms: 32, + BloomSize: 512, + BloomConfirms: 32, + BloomTrieSize: 512, + BloomTrieConfirms: 32, } ) -// trustedCheckpoints associates each known checkpoint with the genesis hash of the chain it belongs to -var trustedCheckpoints = map[common.Hash]*params.TrustedCheckpoint{ - params.MainnetGenesisHash: params.MainnetTrustedCheckpoint, - params.TestnetGenesisHash: params.TestnetTrustedCheckpoint, - params.RinkebyGenesisHash: params.RinkebyTrustedCheckpoint, -} - var ( ErrNoTrustedCht = errors.New("no trusted canonical hash trie") ErrNoTrustedBloomTrie = errors.New("no trusted bloom trie") ErrNoHeader = errors.New("header not found") - chtPrefix = []byte("chtRoot-") // chtPrefix + chtNum (uint64 big endian) -> trie root hash + chtPrefix = []byte("chtRootV2-") // chtPrefix + chtNum (uint64 big endian) -> trie root hash ChtTablePrefix = "cht-" ) @@ -126,7 +112,6 @@ type ChtNode struct { } // GetChtRoot reads the CHT root associated to the given section from the database -// Note that sectionIdx is specified according to LES/1 CHT section size. func GetChtRoot(db ethdb.Database, sectionIdx uint64, sectionHead common.Hash) common.Hash { var encNumber [8]byte binary.BigEndian.PutUint64(encNumber[:], sectionIdx) @@ -135,7 +120,6 @@ func GetChtRoot(db ethdb.Database, sectionIdx uint64, sectionHead common.Hash) c } // StoreChtRoot writes the CHT root associated to the given section into the database -// Note that sectionIdx is specified according to LES/1 CHT section size. func StoreChtRoot(db ethdb.Database, sectionIdx uint64, sectionHead, root common.Hash) { var encNumber [8]byte binary.BigEndian.PutUint64(encNumber[:], sectionIdx) @@ -154,15 +138,15 @@ type ChtIndexerBackend struct { // NewChtIndexer creates a Cht chain indexer func NewChtIndexer(db ethdb.Database, odr OdrBackend, size, confirms uint64) *core.ChainIndexer { - trieTable := ethdb.NewTable(db, ChtTablePrefix) + trieTable := rawdb.NewTable(db, ChtTablePrefix) backend := &ChtIndexerBackend{ diskdb: db, odr: odr, trieTable: trieTable, - triedb: trie.NewDatabase(trieTable), + triedb: trie.NewDatabaseWithCache(trieTable, 1), // Use a tiny cache only to keep memory down sectionSize: size, } - return core.NewChainIndexer(db, ethdb.NewTable(db, "chtIndex-"), backend, size, confirms, time.Millisecond*100, "cht") + return core.NewChainIndexer(db, rawdb.NewTable(db, "chtIndexV2-"), backend, size, confirms, time.Millisecond*100, "cht") } // fetchMissingNodes tries to retrieve the last entry of the latest trusted CHT from the @@ -234,9 +218,7 @@ func (c *ChtIndexerBackend) Commit() error { } c.triedb.Commit(root, false) - if ((c.section+1)*c.sectionSize)%params.CHTFrequencyClient == 0 { - log.Info("Storing CHT", "section", c.section*c.sectionSize/params.CHTFrequencyClient, "head", fmt.Sprintf("%064x", c.lastHash), "root", fmt.Sprintf("%064x", root)) - } + log.Info("Storing CHT", "section", c.section, "head", fmt.Sprintf("%064x", c.lastHash), "root", fmt.Sprintf("%064x", root)) StoreChtRoot(c.diskdb, c.section, c.lastHash, root) return nil } @@ -276,18 +258,18 @@ type BloomTrieIndexerBackend struct { // NewBloomTrieIndexer creates a BloomTrie chain indexer func NewBloomTrieIndexer(db ethdb.Database, odr OdrBackend, parentSize, size uint64) *core.ChainIndexer { - trieTable := ethdb.NewTable(db, BloomTrieTablePrefix) + trieTable := rawdb.NewTable(db, BloomTrieTablePrefix) backend := &BloomTrieIndexerBackend{ diskdb: db, odr: odr, trieTable: trieTable, - triedb: trie.NewDatabase(trieTable), + triedb: trie.NewDatabaseWithCache(trieTable, 1), // Use a tiny cache only to keep memory down parentSize: parentSize, size: size, } backend.bloomTrieRatio = size / parentSize backend.sectionHeads = make([]common.Hash, backend.bloomTrieRatio) - return core.NewChainIndexer(db, ethdb.NewTable(db, "bltIndex-"), backend, size, 0, time.Millisecond*100, "bloomtrie") + return core.NewChainIndexer(db, rawdb.NewTable(db, "bltIndex-"), backend, size, 0, time.Millisecond*100, "bloomtrie") } // fetchMissingNodes tries to retrieve the last entries of the latest trusted bloom trie from the diff --git a/light/trie.go b/light/trie.go index c07e99461cb2..e512bf6f9562 100644 --- a/light/trie.go +++ b/light/trie.go @@ -67,7 +67,7 @@ func (db *odrDatabase) CopyTrie(t state.Trie) state.Trie { } func (db *odrDatabase) ContractCode(addrHash, codeHash common.Hash) ([]byte, error) { - if codeHash == sha3_nil { + if codeHash == sha3Nil { return nil, nil } if code, err := db.backend.Database().Get(codeHash[:]); err == nil { @@ -108,7 +108,7 @@ func (t *odrTrie) TryGet(key []byte) ([]byte, error) { func (t *odrTrie) TryUpdate(key, value []byte) error { key = crypto.Keccak256(key) return t.do(key, func() error { - return t.trie.TryDelete(key) + return t.trie.TryUpdate(key, value) }) } @@ -141,7 +141,7 @@ func (t *odrTrie) GetKey(sha []byte) []byte { return nil } -func (t *odrTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { +func (t *odrTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error { return errors.New("not implemented, needs client/server interface split") } diff --git a/light/trie_test.go b/light/trie_test.go index 51ce9017a365..4919f89641eb 100644 --- a/light/trie_test.go +++ b/light/trie_test.go @@ -25,17 +25,17 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" ) func TestNodeIterator(t *testing.T) { var ( - fulldb = ethdb.NewMemDatabase() - lightdb = ethdb.NewMemDatabase() + fulldb = rawdb.NewMemoryDatabase() + lightdb = rawdb.NewMemoryDatabase() gspec = core.Genesis{Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}} genesis = gspec.MustCommit(fulldb) ) @@ -64,7 +64,7 @@ func diffTries(t1, t2 state.Trie) error { spew.Dump(i2) return fmt.Errorf("tries have different keys %x, %x", i1.Key, i2.Key) } - if !bytes.Equal(i2.Value, i2.Value) { + if !bytes.Equal(i1.Value, i2.Value) { return fmt.Errorf("tries differ at key %x", i1.Key) } } diff --git a/light/txpool.go b/light/txpool.go index 767a797bdcec..e945ef2ec178 100644 --- a/light/txpool.go +++ b/light/txpool.go @@ -390,81 +390,81 @@ func (pool *TxPool) validateTx(ctx context.Context, tx *types.Transaction) error // add validates a new transaction and sets its state pending if processable. // It also updates the locally stored nonce if necessary. -func (self *TxPool) add(ctx context.Context, tx *types.Transaction) error { +func (pool *TxPool) add(ctx context.Context, tx *types.Transaction) error { hash := tx.Hash() - if self.pending[hash] != nil { + if pool.pending[hash] != nil { return fmt.Errorf("Known transaction (%x)", hash[:4]) } - err := self.validateTx(ctx, tx) + err := pool.validateTx(ctx, tx) if err != nil { return err } - if _, ok := self.pending[hash]; !ok { - self.pending[hash] = tx + if _, ok := pool.pending[hash]; !ok { + pool.pending[hash] = tx nonce := tx.Nonce() + 1 - addr, _ := types.Sender(self.signer, tx) - if nonce > self.nonce[addr] { - self.nonce[addr] = nonce + addr, _ := types.Sender(pool.signer, tx) + if nonce > pool.nonce[addr] { + pool.nonce[addr] = nonce } // Notify the subscribers. This event is posted in a goroutine // because it's possible that somewhere during the post "Remove transaction" // gets called which will then wait for the global tx pool lock and deadlock. - go self.txFeed.Send(core.NewTxsEvent{Txs: types.Transactions{tx}}) + go pool.txFeed.Send(core.NewTxsEvent{Txs: types.Transactions{tx}}) } // Print a log message if low enough level is set - log.Debug("Pooled new transaction", "hash", hash, "from", log.Lazy{Fn: func() common.Address { from, _ := types.Sender(self.signer, tx); return from }}, "to", tx.To()) + log.Debug("Pooled new transaction", "hash", hash, "from", log.Lazy{Fn: func() common.Address { from, _ := types.Sender(pool.signer, tx); return from }}, "to", tx.To()) return nil } // Add adds a transaction to the pool if valid and passes it to the tx relay // backend -func (self *TxPool) Add(ctx context.Context, tx *types.Transaction) error { - self.mu.Lock() - defer self.mu.Unlock() +func (pool *TxPool) Add(ctx context.Context, tx *types.Transaction) error { + pool.mu.Lock() + defer pool.mu.Unlock() data, err := rlp.EncodeToBytes(tx) if err != nil { return err } - if err := self.add(ctx, tx); err != nil { + if err := pool.add(ctx, tx); err != nil { return err } //fmt.Println("Send", tx.Hash()) - self.relay.Send(types.Transactions{tx}) + pool.relay.Send(types.Transactions{tx}) - self.chainDb.Put(tx.Hash().Bytes(), data) + pool.chainDb.Put(tx.Hash().Bytes(), data) return nil } // AddTransactions adds all valid transactions to the pool and passes them to // the tx relay backend -func (self *TxPool) AddBatch(ctx context.Context, txs []*types.Transaction) { - self.mu.Lock() - defer self.mu.Unlock() +func (pool *TxPool) AddBatch(ctx context.Context, txs []*types.Transaction) { + pool.mu.Lock() + defer pool.mu.Unlock() var sendTx types.Transactions for _, tx := range txs { - if err := self.add(ctx, tx); err == nil { + if err := pool.add(ctx, tx); err == nil { sendTx = append(sendTx, tx) } } if len(sendTx) > 0 { - self.relay.Send(sendTx) + pool.relay.Send(sendTx) } } // GetTransaction returns a transaction if it is contained in the pool // and nil otherwise. -func (tp *TxPool) GetTransaction(hash common.Hash) *types.Transaction { +func (pool *TxPool) GetTransaction(hash common.Hash) *types.Transaction { // check the txs first - if tx, ok := tp.pending[hash]; ok { + if tx, ok := pool.pending[hash]; ok { return tx } return nil @@ -472,13 +472,13 @@ func (tp *TxPool) GetTransaction(hash common.Hash) *types.Transaction { // GetTransactions returns all currently processable transactions. // The returned slice may be modified by the caller. -func (self *TxPool) GetTransactions() (txs types.Transactions, err error) { - self.mu.RLock() - defer self.mu.RUnlock() +func (pool *TxPool) GetTransactions() (txs types.Transactions, err error) { + pool.mu.RLock() + defer pool.mu.RUnlock() - txs = make(types.Transactions, len(self.pending)) + txs = make(types.Transactions, len(pool.pending)) i := 0 - for _, tx := range self.pending { + for _, tx := range pool.pending { txs[i] = tx i++ } @@ -487,14 +487,14 @@ func (self *TxPool) GetTransactions() (txs types.Transactions, err error) { // Content retrieves the data content of the transaction pool, returning all the // pending as well as queued transactions, grouped by account and nonce. -func (self *TxPool) Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { - self.mu.RLock() - defer self.mu.RUnlock() +func (pool *TxPool) Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { + pool.mu.RLock() + defer pool.mu.RUnlock() // Retrieve all the pending transactions and sort by account and by nonce pending := make(map[common.Address]types.Transactions) - for _, tx := range self.pending { - account, _ := types.Sender(self.signer, tx) + for _, tx := range pool.pending { + account, _ := types.Sender(pool.signer, tx) pending[account] = append(pending[account], tx) } // There are no queued transactions in a light pool, just return an empty map @@ -503,20 +503,20 @@ func (self *TxPool) Content() (map[common.Address]types.Transactions, map[common } // RemoveTransactions removes all given transactions from the pool. -func (self *TxPool) RemoveTransactions(txs types.Transactions) { - self.mu.Lock() - defer self.mu.Unlock() +func (pool *TxPool) RemoveTransactions(txs types.Transactions) { + pool.mu.Lock() + defer pool.mu.Unlock() var hashes []common.Hash - batch := self.chainDb.NewBatch() + batch := pool.chainDb.NewBatch() for _, tx := range txs { hash := tx.Hash() - delete(self.pending, hash) + delete(pool.pending, hash) batch.Delete(hash.Bytes()) hashes = append(hashes, hash) } batch.Write() - self.relay.Discard(hashes) + pool.relay.Discard(hashes) } // RemoveTx removes the transaction with the given hash from the pool. diff --git a/light/txpool_test.go b/light/txpool_test.go index ce77573efd81..0996bd7c9cc0 100644 --- a/light/txpool_test.go +++ b/light/txpool_test.go @@ -26,9 +26,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" ) @@ -81,8 +81,8 @@ func TestTxPool(t *testing.T) { } var ( - sdb = ethdb.NewMemDatabase() - ldb = ethdb.NewMemDatabase() + sdb = rawdb.NewMemoryDatabase() + ldb = rawdb.NewMemoryDatabase() gspec = core.Genesis{Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}} genesis = gspec.MustCommit(sdb) ) @@ -100,7 +100,7 @@ func TestTxPool(t *testing.T) { discard: make(chan int, 1), mined: make(chan int, 1), } - lightchain, _ := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker()) + lightchain, _ := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker(), nil) txPermanent = 50 pool := NewTxPool(params.TestChainConfig, lightchain, relay) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) diff --git a/log/format.go b/log/format.go index 7902b296e6e9..a1b5dac62953 100644 --- a/log/format.go +++ b/log/format.go @@ -14,10 +14,11 @@ import ( ) const ( - timeFormat = "2006-01-02T15:04:05-0700" - termTimeFormat = "01-02|15:04:05.000" - floatFormat = 'f' - termMsgJust = 40 + timeFormat = "2006-01-02T15:04:05-0700" + termTimeFormat = "01-02|15:04:05.000" + floatFormat = 'f' + termMsgJust = 40 + termCtxMaxPadding = 40 ) // locationTrims are trimmed for display to avoid unwieldy log lines. @@ -175,7 +176,7 @@ func logfmt(buf *bytes.Buffer, ctx []interface{}, color int, term bool) { fieldPaddingLock.RUnlock() length := utf8.RuneCountInString(v) - if padding < length { + if padding < length && length <= termCtxMaxPadding { padding = length fieldPaddingLock.Lock() @@ -189,7 +190,7 @@ func logfmt(buf *bytes.Buffer, ctx []interface{}, color int, term bool) { buf.WriteByte('=') } buf.WriteString(v) - if i < len(ctx)-2 { + if i < len(ctx)-2 && padding > length { buf.Write(bytes.Repeat([]byte{' '}, padding-length)) } } diff --git a/metrics/counter.go b/metrics/counter.go index c7f2b4bd3aa3..2f78c90d5c64 100644 --- a/metrics/counter.go +++ b/metrics/counter.go @@ -1,6 +1,8 @@ package metrics -import "sync/atomic" +import ( + "sync/atomic" +) // Counters hold an int64 value that can be incremented and decremented. type Counter interface { @@ -20,6 +22,17 @@ func GetOrRegisterCounter(name string, r Registry) Counter { return r.GetOrRegister(name, NewCounter).(Counter) } +// GetOrRegisterCounterForced returns an existing Counter or constructs and registers a +// new Counter no matter the global switch is enabled or not. +// Be sure to unregister the counter from the registry once it is of no use to +// allow for garbage collection. +func GetOrRegisterCounterForced(name string, r Registry) Counter { + if nil == r { + r = DefaultRegistry + } + return r.GetOrRegister(name, NewCounterForced).(Counter) +} + // NewCounter constructs a new StandardCounter. func NewCounter() Counter { if !Enabled { @@ -28,6 +41,12 @@ func NewCounter() Counter { return &StandardCounter{0} } +// NewCounterForced constructs a new StandardCounter and returns it no matter if +// the global switch is enabled or not. +func NewCounterForced() Counter { + return &StandardCounter{0} +} + // NewRegisteredCounter constructs and registers a new StandardCounter. func NewRegisteredCounter(name string, r Registry) Counter { c := NewCounter() @@ -38,6 +57,19 @@ func NewRegisteredCounter(name string, r Registry) Counter { return c } +// NewRegisteredCounterForced constructs and registers a new StandardCounter +// and launches a goroutine no matter the global switch is enabled or not. +// Be sure to unregister the counter from the registry once it is of no use to +// allow for garbage collection. +func NewRegisteredCounterForced(name string, r Registry) Counter { + c := NewCounterForced() + if nil == r { + r = DefaultRegistry + } + r.Register(name, c) + return c +} + // CounterSnapshot is a read-only copy of another Counter. type CounterSnapshot int64 diff --git a/metrics/cpu.go b/metrics/cpu.go new file mode 100644 index 000000000000..3278d81616a3 --- /dev/null +++ b/metrics/cpu.go @@ -0,0 +1,36 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package metrics + +import "github.com/elastic/gosigar" + +// CPUStats is the system and process CPU stats. +type CPUStats struct { + GlobalTime int64 // Time spent by the CPU working on all processes + GlobalWait int64 // Time spent by waiting on disk for all processes + LocalTime int64 // Time spent by the CPU working on this process +} + +// ReadCPUStats retrieves the current CPU stats. +func ReadCPUStats(stats *CPUStats) { + global := gosigar.Cpu{} + global.Get() + + stats.GlobalTime = int64(global.User + global.Nice + global.Sys) + stats.GlobalWait = int64(global.Wait) + stats.LocalTime = getProcessCPUTime() +} diff --git a/metrics/cpu_syscall.go b/metrics/cpu_syscall.go new file mode 100644 index 000000000000..e245453e824f --- /dev/null +++ b/metrics/cpu_syscall.go @@ -0,0 +1,35 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// +build !windows + +package metrics + +import ( + "syscall" + + "github.com/ethereum/go-ethereum/log" +) + +// getProcessCPUTime retrieves the process' CPU time since program startup. +func getProcessCPUTime() int64 { + var usage syscall.Rusage + if err := syscall.Getrusage(syscall.RUSAGE_SELF, &usage); err != nil { + log.Warn("Failed to retrieve CPU time", "err", err) + return 0 + } + return int64(usage.Utime.Sec+usage.Stime.Sec)*100 + int64(usage.Utime.Usec+usage.Stime.Usec)/10000 //nolint:unconvert +} diff --git a/metrics/cpu_windows.go b/metrics/cpu_windows.go new file mode 100644 index 000000000000..fb29a52a82c1 --- /dev/null +++ b/metrics/cpu_windows.go @@ -0,0 +1,23 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package metrics + +// getProcessCPUTime returns 0 on Windows as there is no system call to resolve +// the actual process' CPU time. +func getProcessCPUTime() int64 { + return 0 +} diff --git a/metrics/exp/exp.go b/metrics/exp/exp.go index 325a193c77a6..55820f1aab2f 100644 --- a/metrics/exp/exp.go +++ b/metrics/exp/exp.go @@ -9,6 +9,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/metrics/prometheus" ) type exp struct { @@ -42,6 +43,7 @@ func Exp(r metrics.Registry) { // http.HandleFunc("/debug/vars", e.expHandler) // haven't found an elegant way, so just use a different endpoint http.Handle("/debug/metrics", h) + http.Handle("/debug/metrics/prometheus", prometheus.Handler(r)) } // ExpHandler will return an expvar powered metrics handler. diff --git a/metrics/influxdb/influxdb.go b/metrics/influxdb/influxdb.go index 31a5c21b5f34..6619915fdba3 100644 --- a/metrics/influxdb/influxdb.go +++ b/metrics/influxdb/influxdb.go @@ -58,11 +58,40 @@ func InfluxDBWithTags(r metrics.Registry, d time.Duration, url, database, userna rep.run() } +// InfluxDBWithTagsOnce runs once an InfluxDB reporter and post the given metrics.Registry with the specified tags +func InfluxDBWithTagsOnce(r metrics.Registry, url, database, username, password, namespace string, tags map[string]string) error { + u, err := uurl.Parse(url) + if err != nil { + return fmt.Errorf("Unable to parse InfluxDB. url: %s, err: %v", url, err) + } + + rep := &reporter{ + reg: r, + url: *u, + database: database, + username: username, + password: password, + namespace: namespace, + tags: tags, + cache: make(map[string]int64), + } + if err := rep.makeClient(); err != nil { + return fmt.Errorf("Unable to make InfluxDB client. err: %v", err) + } + + if err := rep.send(); err != nil { + return fmt.Errorf("Unable to send to InfluxDB. err: %v", err) + } + + return nil +} + func (r *reporter) makeClient() (err error) { r.client, err = client.NewClient(client.Config{ URL: r.url, Username: r.username, Password: r.password, + Timeout: 10 * time.Second, }) return diff --git a/metrics/metrics.go b/metrics/metrics.go index 2a2b804e7c96..8ab4e28f2c79 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -15,24 +15,41 @@ import ( ) // Enabled is checked by the constructor functions for all of the -// standard metrics. If it is true, the metric returned is a stub. +// standard metrics. If it is true, the metric returned is a stub. // // This global kill-switch helps quantify the observer effect and makes // for less cluttered pprof profiles. -var Enabled bool = false +var Enabled = false -// MetricsEnabledFlag is the CLI flag name to use to enable metrics collections. -const MetricsEnabledFlag = "metrics" -const DashboardEnabledFlag = "dashboard" +// EnabledExpensive is a soft-flag meant for external packages to check if costly +// metrics gathering is allowed or not. The goal is to separate standard metrics +// for health monitoring and debug metrics that might impact runtime performance. +var EnabledExpensive = false + +// enablerFlags is the CLI flag names to use to enable metrics collections. +var enablerFlags = []string{"metrics", "dashboard"} + +// expensiveEnablerFlags is the CLI flag names to use to enable metrics collections. +var expensiveEnablerFlags = []string{"metrics.expensive"} // Init enables or disables the metrics system. Since we need this to run before // any other code gets to create meters and timers, we'll actually do an ugly hack // and peek into the command line args for the metrics flag. func init() { for _, arg := range os.Args { - if flag := strings.TrimLeft(arg, "-"); flag == MetricsEnabledFlag || flag == DashboardEnabledFlag { - log.Info("Enabling metrics collection") - Enabled = true + flag := strings.TrimLeft(arg, "-") + + for _, enabler := range enablerFlags { + if !Enabled && flag == enabler { + log.Info("Enabling metrics collection") + Enabled = true + } + } + for _, enabler := range expensiveEnablerFlags { + if !EnabledExpensive && flag == enabler { + log.Info("Enabling expensive metrics collection") + EnabledExpensive = true + } } } } @@ -44,41 +61,56 @@ func CollectProcessMetrics(refresh time.Duration) { if !Enabled { return } + refreshFreq := int64(refresh / time.Second) + // Create the various data collectors + cpuStats := make([]*CPUStats, 2) memstats := make([]*runtime.MemStats, 2) diskstats := make([]*DiskStats, 2) for i := 0; i < len(memstats); i++ { + cpuStats[i] = new(CPUStats) memstats[i] = new(runtime.MemStats) diskstats[i] = new(DiskStats) } // Define the various metrics to collect - memAllocs := GetOrRegisterMeter("system/memory/allocs", DefaultRegistry) - memFrees := GetOrRegisterMeter("system/memory/frees", DefaultRegistry) - memInuse := GetOrRegisterMeter("system/memory/inuse", DefaultRegistry) - memPauses := GetOrRegisterMeter("system/memory/pauses", DefaultRegistry) - - var diskReads, diskReadBytes, diskWrites, diskWriteBytes Meter - var diskReadBytesCounter, diskWriteBytesCounter Counter - if err := ReadDiskStats(diskstats[0]); err == nil { - diskReads = GetOrRegisterMeter("system/disk/readcount", DefaultRegistry) - diskReadBytes = GetOrRegisterMeter("system/disk/readdata", DefaultRegistry) - diskReadBytesCounter = GetOrRegisterCounter("system/disk/readbytes", DefaultRegistry) - diskWrites = GetOrRegisterMeter("system/disk/writecount", DefaultRegistry) - diskWriteBytes = GetOrRegisterMeter("system/disk/writedata", DefaultRegistry) + var ( + cpuSysLoad = GetOrRegisterGauge("system/cpu/sysload", DefaultRegistry) + cpuSysWait = GetOrRegisterGauge("system/cpu/syswait", DefaultRegistry) + cpuProcLoad = GetOrRegisterGauge("system/cpu/procload", DefaultRegistry) + cpuThreads = GetOrRegisterGauge("system/cpu/threads", DefaultRegistry) + cpuGoroutines = GetOrRegisterGauge("system/cpu/goroutines", DefaultRegistry) + + memPauses = GetOrRegisterMeter("system/memory/pauses", DefaultRegistry) + memAllocs = GetOrRegisterMeter("system/memory/allocs", DefaultRegistry) + memFrees = GetOrRegisterMeter("system/memory/frees", DefaultRegistry) + memHeld = GetOrRegisterGauge("system/memory/held", DefaultRegistry) + memUsed = GetOrRegisterGauge("system/memory/used", DefaultRegistry) + + diskReads = GetOrRegisterMeter("system/disk/readcount", DefaultRegistry) + diskReadBytes = GetOrRegisterMeter("system/disk/readdata", DefaultRegistry) + diskReadBytesCounter = GetOrRegisterCounter("system/disk/readbytes", DefaultRegistry) + diskWrites = GetOrRegisterMeter("system/disk/writecount", DefaultRegistry) + diskWriteBytes = GetOrRegisterMeter("system/disk/writedata", DefaultRegistry) diskWriteBytesCounter = GetOrRegisterCounter("system/disk/writebytes", DefaultRegistry) - } else { - log.Debug("Failed to read disk metrics", "err", err) - } + ) // Iterate loading the different stats and updating the meters for i := 1; ; i++ { location1 := i % 2 location2 := (i - 1) % 2 + ReadCPUStats(cpuStats[location1]) + cpuSysLoad.Update((cpuStats[location1].GlobalTime - cpuStats[location2].GlobalTime) / refreshFreq) + cpuSysWait.Update((cpuStats[location1].GlobalWait - cpuStats[location2].GlobalWait) / refreshFreq) + cpuProcLoad.Update((cpuStats[location1].LocalTime - cpuStats[location2].LocalTime) / refreshFreq) + cpuThreads.Update(int64(threadCreateProfile.Count())) + cpuGoroutines.Update(int64(runtime.NumGoroutine())) + runtime.ReadMemStats(memstats[location1]) + memPauses.Mark(int64(memstats[location1].PauseTotalNs - memstats[location2].PauseTotalNs)) memAllocs.Mark(int64(memstats[location1].Mallocs - memstats[location2].Mallocs)) memFrees.Mark(int64(memstats[location1].Frees - memstats[location2].Frees)) - memInuse.Mark(int64(memstats[location1].Alloc - memstats[location2].Alloc)) - memPauses.Mark(int64(memstats[location1].PauseTotalNs - memstats[location2].PauseTotalNs)) + memHeld.Update(int64(memstats[location1].HeapSys - memstats[location1].HeapReleased)) + memUsed.Update(int64(memstats[location1].Alloc)) if ReadDiskStats(diskstats[location1]) == nil { diskReads.Mark(diskstats[location1].ReadCount - diskstats[location2].ReadCount) diff --git a/metrics/opentsdb.go b/metrics/opentsdb.go index df7f152ed2eb..3fde55454ba9 100644 --- a/metrics/opentsdb.go +++ b/metrics/opentsdb.go @@ -10,7 +10,7 @@ import ( "time" ) -var shortHostName string = "" +var shortHostName = "" // OpenTSDBConfig provides a container with configuration parameters for // the OpenTSDB exporter diff --git a/metrics/prometheus/collector.go b/metrics/prometheus/collector.go new file mode 100644 index 000000000000..8350fa2aaf31 --- /dev/null +++ b/metrics/prometheus/collector.go @@ -0,0 +1,115 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package prometheus + +import ( + "bytes" + "fmt" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/metrics" +) + +var ( + typeGaugeTpl = "# TYPE %s gauge\n" + typeCounterTpl = "# TYPE %s counter\n" + typeSummaryTpl = "# TYPE %s summary\n" + keyValueTpl = "%s %v\n\n" + keyQuantileTagValueTpl = "%s {quantile=\"%s\"} %v\n\n" +) + +// collector is a collection of byte buffers that aggregate Prometheus reports +// for different metric types. +type collector struct { + buff *bytes.Buffer +} + +// newCollector createa a new Prometheus metric aggregator. +func newCollector() *collector { + return &collector{ + buff: &bytes.Buffer{}, + } +} + +func (c *collector) addCounter(name string, m metrics.Counter) { + c.writeGaugeCounter(name, m.Count()) +} + +func (c *collector) addGauge(name string, m metrics.Gauge) { + c.writeGaugeCounter(name, m.Value()) +} + +func (c *collector) addGaugeFloat64(name string, m metrics.GaugeFloat64) { + c.writeGaugeCounter(name, m.Value()) +} + +func (c *collector) addHistogram(name string, m metrics.Histogram) { + pv := []float64{0.5, 0.75, 0.95, 0.99, 0.999, 0.9999} + ps := m.Percentiles(pv) + c.writeSummaryCounter(name, m.Count()) + for i := range pv { + c.writeSummaryPercentile(name, strconv.FormatFloat(pv[i], 'f', -1, 64), ps[i]) + } +} + +func (c *collector) addMeter(name string, m metrics.Meter) { + c.writeGaugeCounter(name, m.Count()) +} + +func (c *collector) addTimer(name string, m metrics.Timer) { + pv := []float64{0.5, 0.75, 0.95, 0.99, 0.999, 0.9999} + ps := m.Percentiles(pv) + c.writeSummaryCounter(name, m.Count()) + for i := range pv { + c.writeSummaryPercentile(name, strconv.FormatFloat(pv[i], 'f', -1, 64), ps[i]) + } +} + +func (c *collector) addResettingTimer(name string, m metrics.ResettingTimer) { + if len(m.Values()) <= 0 { + return + } + ps := m.Percentiles([]float64{50, 95, 99}) + val := m.Values() + c.writeSummaryCounter(name, len(val)) + c.writeSummaryPercentile(name, "0.50", ps[0]) + c.writeSummaryPercentile(name, "0.95", ps[1]) + c.writeSummaryPercentile(name, "0.99", ps[2]) +} + +func (c *collector) writeGaugeCounter(name string, value interface{}) { + name = mutateKey(name) + c.buff.WriteString(fmt.Sprintf(typeGaugeTpl, name)) + c.buff.WriteString(fmt.Sprintf(keyValueTpl, name, value)) +} + +func (c *collector) writeSummaryCounter(name string, value interface{}) { + name = mutateKey(name + "_count") + c.buff.WriteString(fmt.Sprintf(typeCounterTpl, name)) + c.buff.WriteString(fmt.Sprintf(keyValueTpl, name, value)) +} + +func (c *collector) writeSummaryPercentile(name, p string, value interface{}) { + name = mutateKey(name) + c.buff.WriteString(fmt.Sprintf(typeSummaryTpl, name)) + c.buff.WriteString(fmt.Sprintf(keyQuantileTagValueTpl, name, p, value)) +} + +func mutateKey(key string) string { + return strings.Replace(key, "/", "_", -1) +} diff --git a/metrics/prometheus/prometheus.go b/metrics/prometheus/prometheus.go new file mode 100644 index 000000000000..9ad5ec7e9929 --- /dev/null +++ b/metrics/prometheus/prometheus.go @@ -0,0 +1,68 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Package prometheus exposes go-metrics into a Prometheus format. +package prometheus + +import ( + "fmt" + "net/http" + "sort" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" +) + +// Handler returns an HTTP handler which dump metrics in Prometheus format. +func Handler(reg metrics.Registry) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Gather and pre-sort the metrics to avoid random listings + var names []string + reg.Each(func(name string, i interface{}) { + names = append(names, name) + }) + sort.Strings(names) + + // Aggregate all the metris into a Prometheus collector + c := newCollector() + + for _, name := range names { + i := reg.Get(name) + + switch m := i.(type) { + case metrics.Counter: + c.addCounter(name, m.Snapshot()) + case metrics.Gauge: + c.addGauge(name, m.Snapshot()) + case metrics.GaugeFloat64: + c.addGaugeFloat64(name, m.Snapshot()) + case metrics.Histogram: + c.addHistogram(name, m.Snapshot()) + case metrics.Meter: + c.addMeter(name, m.Snapshot()) + case metrics.Timer: + c.addTimer(name, m.Snapshot()) + case metrics.ResettingTimer: + c.addResettingTimer(name, m.Snapshot()) + default: + log.Warn("Unknown Prometheus metric type", "type", fmt.Sprintf("%T", i)) + } + } + w.Header().Add("Content-Type", "text/plain") + w.Header().Add("Content-Length", fmt.Sprint(c.buff.Len())) + w.Write(c.buff.Bytes()) + }) +} diff --git a/metrics/registry.go b/metrics/registry.go index cc34c9dfd2c8..c5435adf2402 100644 --- a/metrics/registry.go +++ b/metrics/registry.go @@ -311,7 +311,11 @@ func (r *PrefixedRegistry) UnregisterAll() { r.underlying.UnregisterAll() } -var DefaultRegistry Registry = NewRegistry() +var ( + DefaultRegistry = NewRegistry() + EphemeralRegistry = NewRegistry() + AccountingRegistry = NewRegistry() // registry used in swarm +) // Call the given function for each registered metric. func Each(f func(string, interface{})) { diff --git a/miner/miner.go b/miner/miner.go index 5218c12107d3..ab97b0c03855 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -19,10 +19,12 @@ package miner import ( "fmt" + "math/big" "sync/atomic" "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" @@ -39,6 +41,18 @@ type Backend interface { TxPool() *core.TxPool } +// Config is the configuration parameters of mining. +type Config struct { + Etherbase common.Address `toml:",omitempty"` // Public address for block mining rewards (default = first account) + Notify []string `toml:",omitempty"` // HTTP URL list to be notified of new work packages(only useful in ethash). + ExtraData hexutil.Bytes `toml:",omitempty"` // Block extra data set by the miner + GasFloor uint64 // Target gas floor for mined blocks. + GasCeil uint64 // Target gas ceiling for mined blocks. + GasPrice *big.Int // Minimum gas price for mining a transaction + Recommit time.Duration // The time interval for miner to re-create mining work. + Noverify bool // Disable remote mining solution verification(only useful in ethash). +} + // Miner creates blocks and searches for proof-of-work values. type Miner struct { mux *event.TypeMux @@ -52,13 +66,13 @@ type Miner struct { shouldStart int32 // should start indicates whether we should start after sync } -func New(eth Backend, config *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, recommit time.Duration, gasFloor, gasCeil uint64, isLocalBlock func(block *types.Block) bool) *Miner { +func New(eth Backend, config *Config, chainConfig *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, isLocalBlock func(block *types.Block) bool) *Miner { miner := &Miner{ eth: eth, mux: mux, engine: engine, exitCh: make(chan struct{}), - worker: newWorker(config, engine, eth, mux, recommit, gasFloor, gasCeil, isLocalBlock), + worker: newWorker(config, chainConfig, engine, eth, mux, isLocalBlock), canStart: 1, } go miner.update() diff --git a/miner/stress_clique.go b/miner/stress_clique.go index 8961091d5612..7f5db2e520b0 100644 --- a/miner/stress_clique.go +++ b/miner/stress_clique.go @@ -22,7 +22,6 @@ package main import ( "bytes" "crypto/ecdsa" - "fmt" "io/ioutil" "math/big" "math/rand" @@ -40,7 +39,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/params" ) @@ -62,32 +61,26 @@ func main() { var ( nodes []*node.Node - enodes []string + enodes []*enode.Node ) for _, sealer := range sealers { // Start the node and wait until it's up - node, err := makeSealer(genesis, enodes) + node, err := makeSealer(genesis) if err != nil { panic(err) } - defer node.Stop() + defer node.Close() for node.Server().NodeInfo().Ports.Listener == 0 { time.Sleep(250 * time.Millisecond) } // Connect the node to al the previous ones - for _, enode := range enodes { - enode, err := discover.ParseNode(enode) - if err != nil { - panic(err) - } - node.Server().AddPeer(enode) + for _, n := range enodes { + node.Server().AddPeer(n) } - // Start tracking the node and it's enode url + // Start tracking the node and it's enode nodes = append(nodes, node) - - enode := fmt.Sprintf("enode://%s@127.0.0.1:%d", node.Server().NodeInfo().ID, node.Server().NodeInfo().Ports.Listener) - enodes = append(enodes, enode) + enodes = append(enodes, node.Server().Self()) // Inject the signer key and start sealing with it store := node.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) @@ -177,7 +170,7 @@ func makeGenesis(faucets []*ecdsa.PrivateKey, sealers []*ecdsa.PrivateKey) *core return genesis } -func makeSealer(genesis *core.Genesis, nodes []string) (*node.Node, error) { +func makeSealer(genesis *core.Genesis) (*node.Node, error) { // Define the basic configurations for the Ethereum node datadir, _ := ioutil.TempDir("", "") @@ -206,10 +199,12 @@ func makeSealer(genesis *core.Genesis, nodes []string) (*node.Node, error) { DatabaseHandles: 256, TxPool: core.DefaultTxPoolConfig, GPO: eth.DefaultConfig.GPO, - MinerGasFloor: genesis.GasLimit * 9 / 10, - MinerGasCeil: genesis.GasLimit * 11 / 10, - MinerGasPrice: big.NewInt(1), - MinerRecommit: time.Second, + Miner: Config{ + GasFloor: genesis.GasLimit * 9 / 10, + GasCeil: genesis.GasLimit * 11 / 10, + GasPrice: big.NewInt(1), + Recommit: time.Second, + }, }) }); err != nil { return nil, err diff --git a/miner/stress_ethash.go b/miner/stress_ethash.go index 5ed11d73a5b3..7d4a7d24f7dd 100644 --- a/miner/stress_ethash.go +++ b/miner/stress_ethash.go @@ -21,7 +21,6 @@ package main import ( "crypto/ecdsa" - "fmt" "io/ioutil" "math/big" "math/rand" @@ -41,7 +40,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/params" ) @@ -62,32 +61,26 @@ func main() { var ( nodes []*node.Node - enodes []string + enodes []*enode.Node ) for i := 0; i < 4; i++ { // Start the node and wait until it's up - node, err := makeMiner(genesis, enodes) + node, err := makeMiner(genesis) if err != nil { panic(err) } - defer node.Stop() + defer node.Close() for node.Server().NodeInfo().Ports.Listener == 0 { time.Sleep(250 * time.Millisecond) } // Connect the node to al the previous ones - for _, enode := range enodes { - enode, err := discover.ParseNode(enode) - if err != nil { - panic(err) - } - node.Server().AddPeer(enode) + for _, n := range enodes { + node.Server().AddPeer(n) } - // Start tracking the node and it's enode url + // Start tracking the node and it's enode nodes = append(nodes, node) - - enode := fmt.Sprintf("enode://%s@127.0.0.1:%d", node.Server().NodeInfo().ID, node.Server().NodeInfo().Ports.Listener) - enodes = append(enodes, enode) + enodes = append(enodes, node.Server().Self()) // Inject the signer key and start sealing with it store := node.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) @@ -155,7 +148,7 @@ func makeGenesis(faucets []*ecdsa.PrivateKey) *core.Genesis { return genesis } -func makeMiner(genesis *core.Genesis, nodes []string) (*node.Node, error) { +func makeMiner(genesis *core.Genesis) (*node.Node, error) { // Define the basic configurations for the Ethereum node datadir, _ := ioutil.TempDir("", "") @@ -186,10 +179,12 @@ func makeMiner(genesis *core.Genesis, nodes []string) (*node.Node, error) { TxPool: core.DefaultTxPoolConfig, GPO: eth.DefaultConfig.GPO, Ethash: eth.DefaultConfig.Ethash, - MinerGasFloor: genesis.GasLimit * 9 / 10, - MinerGasCeil: genesis.GasLimit * 11 / 10, - MinerGasPrice: big.NewInt(1), - MinerRecommit: time.Second, + Miner: Config{ + GasFloor: genesis.GasLimit * 9 / 10, + GasCeil: genesis.GasLimit * 11 / 10, + GasPrice: big.NewInt(1), + Recommit: time.Second, + }, }) }); err != nil { return nil, err diff --git a/miner/worker.go b/miner/worker.go index 8579c5c84b57..4a9528c39565 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -31,7 +31,6 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" @@ -123,13 +122,11 @@ type intervalAdjust struct { // worker is the main object which takes care of submitting new work to consensus engine // and gathering the sealing result. type worker struct { - config *params.ChainConfig - engine consensus.Engine - eth Backend - chain *core.BlockChain - - gasFloor uint64 - gasCeil uint64 + config *Config + chainConfig *params.ChainConfig + engine consensus.Engine + eth Backend + chain *core.BlockChain // Subscriptions mux *event.TypeMux @@ -179,15 +176,14 @@ type worker struct { resubmitHook func(time.Duration, time.Duration) // Method to call upon updating resubmitting interval. } -func newWorker(config *params.ChainConfig, engine consensus.Engine, eth Backend, mux *event.TypeMux, recommit time.Duration, gasFloor, gasCeil uint64, isLocalBlock func(*types.Block) bool) *worker { +func newWorker(config *Config, chainConfig *params.ChainConfig, engine consensus.Engine, eth Backend, mux *event.TypeMux, isLocalBlock func(*types.Block) bool) *worker { worker := &worker{ config: config, + chainConfig: chainConfig, engine: engine, eth: eth, mux: mux, chain: eth.BlockChain(), - gasFloor: gasFloor, - gasCeil: gasCeil, isLocalBlock: isLocalBlock, localUncles: make(map[common.Hash]*types.Block), remoteUncles: make(map[common.Hash]*types.Block), @@ -211,6 +207,7 @@ func newWorker(config *params.ChainConfig, engine consensus.Engine, eth Backend, worker.chainSideSub = eth.BlockChain().SubscribeChainSideEvent(worker.chainSideCh) // Sanitize recommit interval if the user-specified one is too short. + recommit := worker.config.Recommit if recommit < minRecommitInterval { log.Warn("Sanitizing miner recommit interval", "provided", recommit, "updated", minRecommitInterval) recommit = minRecommitInterval @@ -355,7 +352,7 @@ func (w *worker) newWorkLoop(recommit time.Duration) { case <-timer.C: // If mining is running resubmit a new work cycle periodically to pull in // higher priced transactions. Disable this overhead for pending blocks. - if w.isRunning() && (w.config.Clique == nil || w.config.Clique.Period > 0) { + if w.isRunning() && (w.chainConfig.Clique == nil || w.chainConfig.Clique.Period > 0) { // Short circuit if no new transaction arrives. if atomic.LoadInt32(&w.newTxs) == 0 { timer.Reset(recommit) @@ -456,6 +453,10 @@ func (w *worker) mainLoop() { // already included in the current mining block. These transactions will // be automatically eliminated. if !w.isRunning() && w.current != nil { + // If block is already full, abort + if gp := w.current.gasPool; gp != nil && gp.Gas() < params.TxGas { + continue + } w.mu.RLock() coinbase := w.coinbase w.mu.RUnlock() @@ -466,12 +467,18 @@ func (w *worker) mainLoop() { txs[acc] = append(txs[acc], tx) } txset := types.NewTransactionsByPriceAndNonce(w.current.signer, txs) + tcount := w.current.tcount w.commitTransactions(txset, coinbase, nil) - w.updateSnapshot() + // Only update the snapshot if any new transactons were added + // to the pending block + if tcount != w.current.tcount { + w.updateSnapshot() + } } else { - // If we're mining, but nothing is being processed, wake on new transactions - if w.config.Clique != nil && w.config.Clique.Period == 0 { - w.commitNewWork(nil, false, time.Now().Unix()) + // If clique is running in dev mode(period is 0), disable + // advance sealing here. + if w.chainConfig.Clique != nil && w.chainConfig.Clique.Period == 0 { + w.commitNewWork(nil, true, time.Now().Unix()) } } atomic.AddInt32(&w.newTxs, int32(len(ev.Txs))) @@ -567,6 +574,11 @@ func (w *worker) resultLoop() { logs []*types.Log ) for i, receipt := range task.receipts { + // add block location fields + receipt.BlockHash = hash + receipt.BlockNumber = block.Number() + receipt.TransactionIndex = uint(i) + receipts[i] = new(types.Receipt) *receipts[i] = *receipt // Update the block hash in all logs since it is now available and not when the @@ -614,7 +626,7 @@ func (w *worker) makeCurrent(parent *types.Block, header *types.Header) error { return err } env := &environment{ - signer: types.NewEIP155Signer(w.config.ChainID), + signer: types.NewEIP155Signer(w.chainConfig.ChainID), state: state, ancestors: mapset.NewSet(), family: mapset.NewSet(), @@ -692,7 +704,7 @@ func (w *worker) updateSnapshot() { func (w *worker) commitTransaction(tx *types.Transaction, coinbase common.Address) ([]*types.Log, error) { snap := w.current.state.Snapshot() - receipt, _, err := core.ApplyTransaction(w.config, w.chain, &coinbase, w.current.gasPool, w.current.state, w.current.header, tx, &w.current.header.GasUsed, vm.Config{}) + receipt, _, err := core.ApplyTransaction(w.chainConfig, w.chain, &coinbase, w.current.gasPool, w.current.state, w.current.header, tx, &w.current.header.GasUsed, *w.chain.GetVMConfig()) if err != nil { w.current.state.RevertToSnapshot(snap) return nil, err @@ -753,8 +765,8 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin from, _ := types.Sender(w.current.signer, tx) // Check whether the tx is replay protected. If we're not in the EIP155 hf // phase, start ignoring the sender until we do. - if tx.Protected() && !w.config.IsEIP155(w.current.header.Number) { - log.Trace("Ignoring reply protected transaction", "hash", tx.Hash(), "eip155", w.config.EIP155Block) + if tx.Protected() && !w.chainConfig.IsEIP155(w.current.header.Number) { + log.Trace("Ignoring reply protected transaction", "hash", tx.Hash(), "eip155", w.chainConfig.EIP155Block) txs.Pop() continue @@ -824,8 +836,8 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) tstart := time.Now() parent := w.chain.CurrentBlock() - if parent.Time().Cmp(new(big.Int).SetInt64(timestamp)) >= 0 { - timestamp = parent.Time().Int64() + 1 + if parent.Time() >= uint64(timestamp) { + timestamp = int64(parent.Time() + 1) } // this will ensure we're not going off too far in the future if now := time.Now().Unix(); timestamp > now+1 { @@ -838,9 +850,9 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) header := &types.Header{ ParentHash: parent.Hash(), Number: num.Add(num, common.Big1), - GasLimit: core.CalcGasLimit(parent, w.gasFloor, w.gasCeil), + GasLimit: core.CalcGasLimit(parent, w.config.GasFloor, w.config.GasCeil), Extra: w.extra, - Time: big.NewInt(timestamp), + Time: uint64(timestamp), } // Only set the coinbase if our consensus engine is running (avoid spurious block rewards) if w.isRunning() { @@ -855,12 +867,12 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) return } // If we are care about TheDAO hard-fork check whether to override the extra-data or not - if daoBlock := w.config.DAOForkBlock; daoBlock != nil { + if daoBlock := w.chainConfig.DAOForkBlock; daoBlock != nil { // Check whether the block is among the fork extra-override range limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange) if header.Number.Cmp(daoBlock) >= 0 && header.Number.Cmp(limit) < 0 { // Depending whether we support or oppose the fork, override differently - if w.config.DAOForkSupport { + if w.chainConfig.DAOForkSupport { header.Extra = common.CopyBytes(params.DAOForkBlockExtra) } else if bytes.Equal(header.Extra, params.DAOForkBlockExtra) { header.Extra = []byte{} // If miner opposes, don't let it use the reserved extra-data @@ -875,7 +887,7 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) } // Create the current work task and check any fork transitions needed env := w.current - if w.config.DAOForkSupport && w.config.DAOForkBlock != nil && w.config.DAOForkBlock.Cmp(header.Number) == 0 { + if w.chainConfig.DAOForkSupport && w.chainConfig.DAOForkBlock != nil && w.chainConfig.DAOForkBlock.Cmp(header.Number) == 0 { misc.ApplyDAOHardFork(env.state) } // Accumulate the uncles for the current block @@ -953,7 +965,7 @@ func (w *worker) commit(uncles []*types.Header, interval func(), update bool, st *receipts[i] = *l } s := w.current.state.Copy() - block, err := w.engine.Finalize(w.chain, w.current.header, s, w.current.txs, uncles, w.current.receipts) + block, err := w.engine.FinalizeAndAssemble(w.chain, w.current.header, s, w.current.txs, uncles, w.current.receipts) if err != nil { return err } diff --git a/miner/worker_test.go b/miner/worker_test.go index db0ff4340f60..7fa9a5f98425 100644 --- a/miner/worker_test.go +++ b/miner/worker_test.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" @@ -51,6 +52,12 @@ var ( // Test transactions pendingTxs []*types.Transaction newTxs []*types.Transaction + + testConfig = &Config{ + Recommit: time.Second, + GasFloor: params.GenesisGasLimit, + GasCeil: params.GenesisGasLimit, + } ) func init() { @@ -79,7 +86,7 @@ type testWorkerBackend struct { func newTestWorkerBackend(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine, n int) *testWorkerBackend { var ( - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec = core.Genesis{ Config: chainConfig, Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}, @@ -133,7 +140,7 @@ func (b *testWorkerBackend) PostChainEvents(events []interface{}) { func newTestWorker(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine, blocks int) (*worker, *testWorkerBackend) { backend := newTestWorkerBackend(t, chainConfig, engine, blocks) backend.txPool.AddLocals(pendingTxs) - w := newWorker(chainConfig, engine, backend, new(event.TypeMux), time.Second, params.GenesisGasLimit, params.GenesisGasLimit, nil) + w := newWorker(testConfig, chainConfig, engine, backend, new(event.TypeMux), nil) w.setEtherbase(testBankAddress) return w, backend } @@ -142,7 +149,7 @@ func TestPendingStateAndBlockEthash(t *testing.T) { testPendingStateAndBlock(t, ethashChainConfig, ethash.NewFaker()) } func TestPendingStateAndBlockClique(t *testing.T) { - testPendingStateAndBlock(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, ethdb.NewMemDatabase())) + testPendingStateAndBlock(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase())) } func testPendingStateAndBlock(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine) { @@ -174,7 +181,7 @@ func TestEmptyWorkEthash(t *testing.T) { testEmptyWork(t, ethashChainConfig, ethash.NewFaker()) } func TestEmptyWorkClique(t *testing.T) { - testEmptyWork(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, ethdb.NewMemDatabase())) + testEmptyWork(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase())) } func testEmptyWork(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine) { @@ -224,7 +231,7 @@ func testEmptyWork(t *testing.T, chainConfig *params.ChainConfig, engine consens for i := 0; i < 2; i += 1 { select { case <-taskCh: - case <-time.NewTimer(time.Second).C: + case <-time.NewTimer(2 * time.Second).C: t.Error("new task timeout") } } @@ -291,7 +298,7 @@ func TestRegenerateMiningBlockEthash(t *testing.T) { } func TestRegenerateMiningBlockClique(t *testing.T) { - testRegenerateMiningBlock(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, ethdb.NewMemDatabase())) + testRegenerateMiningBlock(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase())) } func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine) { @@ -356,7 +363,7 @@ func TestAdjustIntervalEthash(t *testing.T) { } func TestAdjustIntervalClique(t *testing.T) { - testAdjustInterval(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, ethdb.NewMemDatabase())) + testAdjustInterval(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase())) } func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine) { @@ -390,12 +397,12 @@ func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine co case 1: origin := float64(3 * time.Second.Nanoseconds()) estimate := origin*(1-intervalAdjustRatio) + intervalAdjustRatio*(origin/0.8+intervalAdjustBias) - wantMinInterval, wantRecommitInterval = 3*time.Second, time.Duration(int(estimate))*time.Nanosecond + wantMinInterval, wantRecommitInterval = 3*time.Second, time.Duration(estimate)*time.Nanosecond case 2: estimate := result[index-1] min := float64(3 * time.Second.Nanoseconds()) estimate = estimate*(1-intervalAdjustRatio) + intervalAdjustRatio*(min-intervalAdjustBias) - wantMinInterval, wantRecommitInterval = 3*time.Second, time.Duration(int(estimate))*time.Nanosecond + wantMinInterval, wantRecommitInterval = 3*time.Second, time.Duration(estimate)*time.Nanosecond case 3: wantMinInterval, wantRecommitInterval = time.Second, time.Second } diff --git a/mobile/big.go b/mobile/big.go index dd7b158786a8..86ea93245aab 100644 --- a/mobile/big.go +++ b/mobile/big.go @@ -84,6 +84,13 @@ func (bi *BigInt) SetString(x string, base int) { // BigInts represents a slice of big ints. type BigInts struct{ bigints []*big.Int } +// NewBigInts creates a slice of uninitialized big numbers. +func NewBigInts(size int) *BigInts { + return &BigInts{ + bigints: make([]*big.Int, size), + } +} + // Size returns the number of big ints in the slice. func (bi *BigInts) Size() int { return len(bi.bigints) diff --git a/mobile/bind.go b/mobile/bind.go index d6e621a258fd..90ecdf82c414 100644 --- a/mobile/bind.go +++ b/mobile/bind.go @@ -19,27 +19,30 @@ package geth import ( + "errors" "math/big" "strings" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" ) -// Signer is an interaface defining the callback when a contract requires a +// Signer is an interface defining the callback when a contract requires a // method to sign the transaction before submission. type Signer interface { Sign(*Address, *Transaction) (tx *Transaction, _ error) } -type signer struct { +type MobileSigner struct { sign bind.SignerFn } -func (s *signer) Sign(addr *Address, unsignedTx *Transaction) (signedTx *Transaction, _ error) { - sig, err := s.sign(types.HomesteadSigner{}, addr.address, unsignedTx.tx) +func (s *MobileSigner) Sign(addr *Address, unsignedTx *Transaction) (signedTx *Transaction, _ error) { + sig, err := s.sign(types.EIP155Signer{}, addr.address, unsignedTx.tx) if err != nil { return nil, err } @@ -73,6 +76,35 @@ type TransactOpts struct { opts bind.TransactOpts } +// NewTransactOpts creates a new option set for contract transaction. +func NewTransactOpts() *TransactOpts { + return new(TransactOpts) +} + +// NewKeyedTransactor is a utility method to easily create a transaction signer +// from a single private key. +func NewKeyedTransactOpts(keyJson []byte, passphrase string) (*TransactOpts, error) { + key, err := keystore.DecryptKey(keyJson, passphrase) + if err != nil { + return nil, err + } + keyAddr := crypto.PubkeyToAddress(key.PrivateKey.PublicKey) + opts := bind.TransactOpts{ + From: keyAddr, + Signer: func(signer types.Signer, address common.Address, tx *types.Transaction) (*types.Transaction, error) { + if address != keyAddr { + return nil, errors.New("not authorized to sign this account") + } + signature, err := crypto.Sign(signer.Hash(tx).Bytes(), key.PrivateKey) + if err != nil { + return nil, err + } + return tx.WithSignature(signer, signature) + }, + } + return &TransactOpts{opts}, nil +} + func (opts *TransactOpts) GetFrom() *Address { return &Address{opts.opts.From} } func (opts *TransactOpts) GetNonce() int64 { return opts.opts.Nonce.Int64() } func (opts *TransactOpts) GetValue() *BigInt { return &BigInt{opts.opts.Value} } diff --git a/mobile/common.go b/mobile/common.go index 047d8e1f65c7..d7e0457261a0 100644 --- a/mobile/common.go +++ b/mobile/common.go @@ -25,6 +25,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ) // Hash represents the 32 byte Keccak256 hash of arbitrary data. @@ -228,3 +229,13 @@ func (a *Addresses) Set(index int, address *Address) error { func (a *Addresses) Append(address *Address) { a.addresses = append(a.addresses, address.address) } + +// EncodeToHex encodes b as a hex string with 0x prefix. +func EncodeToHex(b []byte) string { + return hexutil.Encode(b) +} + +// DecodeFromHex decodes a hex string with 0x prefix. +func DecodeFromHex(s string) ([]byte, error) { + return hexutil.Decode(s) +} diff --git a/mobile/context.go b/mobile/context.go index f1fff9011471..76b4c54642a6 100644 --- a/mobile/context.go +++ b/mobile/context.go @@ -24,7 +24,7 @@ import ( "time" ) -// Context carries a deadline, a cancelation signal, and other values across API +// Context carries a deadline, a cancellation signal, and other values across API // boundaries. type Context struct { context context.Context diff --git a/mobile/geth.go b/mobile/geth.go index e3e2e905da37..edcbfdbdbe55 100644 --- a/mobile/geth.go +++ b/mobile/geth.go @@ -131,6 +131,7 @@ func NewNode(datadir string, config *NodeConfig) (stack *Node, _ error) { MaxPeers: config.MaxPeers, }, } + rawStack, err := node.New(nodeConf) if err != nil { return nil, err @@ -188,6 +189,12 @@ func NewNode(datadir string, config *NodeConfig) (stack *Node, _ error) { return &Node{rawStack}, nil } +// Close terminates a running node along with all it's services, tearing internal +// state doen too. It's not possible to restart a closed node. +func (n *Node) Close() error { + return n.node.Close() +} + // Start creates a live P2P node and starts running it. func (n *Node) Start() error { return n.node.Start() diff --git a/mobile/interface.go b/mobile/interface.go index ac0c26088a7b..d5200d5b1b82 100644 --- a/mobile/interface.go +++ b/mobile/interface.go @@ -42,26 +42,82 @@ func NewInterface() *Interface { return new(Interface) } -func (i *Interface) SetBool(b bool) { i.object = &b } -func (i *Interface) SetBools(bs []bool) { i.object = &bs } -func (i *Interface) SetString(str string) { i.object = &str } -func (i *Interface) SetStrings(strs *Strings) { i.object = &strs.strs } -func (i *Interface) SetBinary(binary []byte) { b := common.CopyBytes(binary); i.object = &b } -func (i *Interface) SetBinaries(binaries [][]byte) { i.object = &binaries } -func (i *Interface) SetAddress(address *Address) { i.object = &address.address } -func (i *Interface) SetAddresses(addrs *Addresses) { i.object = &addrs.addresses } -func (i *Interface) SetHash(hash *Hash) { i.object = &hash.hash } -func (i *Interface) SetHashes(hashes *Hashes) { i.object = &hashes.hashes } -func (i *Interface) SetInt8(n int8) { i.object = &n } -func (i *Interface) SetInt16(n int16) { i.object = &n } -func (i *Interface) SetInt32(n int32) { i.object = &n } -func (i *Interface) SetInt64(n int64) { i.object = &n } -func (i *Interface) SetUint8(bigint *BigInt) { n := uint8(bigint.bigint.Uint64()); i.object = &n } -func (i *Interface) SetUint16(bigint *BigInt) { n := uint16(bigint.bigint.Uint64()); i.object = &n } -func (i *Interface) SetUint32(bigint *BigInt) { n := uint32(bigint.bigint.Uint64()); i.object = &n } -func (i *Interface) SetUint64(bigint *BigInt) { n := bigint.bigint.Uint64(); i.object = &n } -func (i *Interface) SetBigInt(bigint *BigInt) { i.object = &bigint.bigint } -func (i *Interface) SetBigInts(bigints *BigInts) { i.object = &bigints.bigints } +func (i *Interface) SetBool(b bool) { i.object = &b } +func (i *Interface) SetBools(bs *Bools) { i.object = &bs.bools } +func (i *Interface) SetString(str string) { i.object = &str } +func (i *Interface) SetStrings(strs *Strings) { i.object = &strs.strs } +func (i *Interface) SetBinary(binary []byte) { b := common.CopyBytes(binary); i.object = &b } +func (i *Interface) SetBinaries(binaries *Binaries) { i.object = &binaries.binaries } +func (i *Interface) SetAddress(address *Address) { i.object = &address.address } +func (i *Interface) SetAddresses(addrs *Addresses) { i.object = &addrs.addresses } +func (i *Interface) SetHash(hash *Hash) { i.object = &hash.hash } +func (i *Interface) SetHashes(hashes *Hashes) { i.object = &hashes.hashes } +func (i *Interface) SetInt8(n int8) { i.object = &n } +func (i *Interface) SetInt16(n int16) { i.object = &n } +func (i *Interface) SetInt32(n int32) { i.object = &n } +func (i *Interface) SetInt64(n int64) { i.object = &n } +func (i *Interface) SetInt8s(bigints *BigInts) { + ints := make([]int8, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, int8(bi.Int64())) + } + i.object = &ints +} +func (i *Interface) SetInt16s(bigints *BigInts) { + ints := make([]int16, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, int16(bi.Int64())) + } + i.object = &ints +} +func (i *Interface) SetInt32s(bigints *BigInts) { + ints := make([]int32, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, int32(bi.Int64())) + } + i.object = &ints +} +func (i *Interface) SetInt64s(bigints *BigInts) { + ints := make([]int64, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, bi.Int64()) + } + i.object = &ints +} +func (i *Interface) SetUint8(bigint *BigInt) { n := uint8(bigint.bigint.Uint64()); i.object = &n } +func (i *Interface) SetUint16(bigint *BigInt) { n := uint16(bigint.bigint.Uint64()); i.object = &n } +func (i *Interface) SetUint32(bigint *BigInt) { n := uint32(bigint.bigint.Uint64()); i.object = &n } +func (i *Interface) SetUint64(bigint *BigInt) { n := bigint.bigint.Uint64(); i.object = &n } +func (i *Interface) SetUint8s(bigints *BigInts) { + ints := make([]uint8, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, uint8(bi.Uint64())) + } + i.object = &ints +} +func (i *Interface) SetUint16s(bigints *BigInts) { + ints := make([]uint16, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, uint16(bi.Uint64())) + } + i.object = &ints +} +func (i *Interface) SetUint32s(bigints *BigInts) { + ints := make([]uint32, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, uint32(bi.Uint64())) + } + i.object = &ints +} +func (i *Interface) SetUint64s(bigints *BigInts) { + ints := make([]uint64, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, bi.Uint64()) + } + i.object = &ints +} +func (i *Interface) SetBigInt(bigint *BigInt) { i.object = &bigint.bigint } +func (i *Interface) SetBigInts(bigints *BigInts) { i.object = &bigints.bigints } func (i *Interface) SetDefaultBool() { i.object = new(bool) } func (i *Interface) SetDefaultBools() { i.object = new([]bool) } @@ -74,22 +130,30 @@ func (i *Interface) SetDefaultAddresses() { i.object = new([]common.Address) } func (i *Interface) SetDefaultHash() { i.object = new(common.Hash) } func (i *Interface) SetDefaultHashes() { i.object = new([]common.Hash) } func (i *Interface) SetDefaultInt8() { i.object = new(int8) } +func (i *Interface) SetDefaultInt8s() { i.object = new([]int8) } func (i *Interface) SetDefaultInt16() { i.object = new(int16) } +func (i *Interface) SetDefaultInt16s() { i.object = new([]int16) } func (i *Interface) SetDefaultInt32() { i.object = new(int32) } +func (i *Interface) SetDefaultInt32s() { i.object = new([]int32) } func (i *Interface) SetDefaultInt64() { i.object = new(int64) } +func (i *Interface) SetDefaultInt64s() { i.object = new([]int64) } func (i *Interface) SetDefaultUint8() { i.object = new(uint8) } +func (i *Interface) SetDefaultUint8s() { i.object = new([]uint8) } func (i *Interface) SetDefaultUint16() { i.object = new(uint16) } +func (i *Interface) SetDefaultUint16s() { i.object = new([]uint16) } func (i *Interface) SetDefaultUint32() { i.object = new(uint32) } +func (i *Interface) SetDefaultUint32s() { i.object = new([]uint32) } func (i *Interface) SetDefaultUint64() { i.object = new(uint64) } +func (i *Interface) SetDefaultUint64s() { i.object = new([]uint64) } func (i *Interface) SetDefaultBigInt() { i.object = new(*big.Int) } func (i *Interface) SetDefaultBigInts() { i.object = new([]*big.Int) } func (i *Interface) GetBool() bool { return *i.object.(*bool) } -func (i *Interface) GetBools() []bool { return *i.object.(*[]bool) } +func (i *Interface) GetBools() *Bools { return &Bools{*i.object.(*[]bool)} } func (i *Interface) GetString() string { return *i.object.(*string) } func (i *Interface) GetStrings() *Strings { return &Strings{*i.object.(*[]string)} } func (i *Interface) GetBinary() []byte { return *i.object.(*[]byte) } -func (i *Interface) GetBinaries() [][]byte { return *i.object.(*[][]byte) } +func (i *Interface) GetBinaries() *Binaries { return &Binaries{*i.object.(*[][]byte)} } func (i *Interface) GetAddress() *Address { return &Address{*i.object.(*common.Address)} } func (i *Interface) GetAddresses() *Addresses { return &Addresses{*i.object.(*[]common.Address)} } func (i *Interface) GetHash() *Hash { return &Hash{*i.object.(*common.Hash)} } @@ -98,6 +162,38 @@ func (i *Interface) GetInt8() int8 { return *i.object.(*int8) } func (i *Interface) GetInt16() int16 { return *i.object.(*int16) } func (i *Interface) GetInt32() int32 { return *i.object.(*int32) } func (i *Interface) GetInt64() int64 { return *i.object.(*int64) } +func (i *Interface) GetInt8s() *BigInts { + val := i.object.(*[]int8) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetInt64(int64(v))}) + } + return bigints +} +func (i *Interface) GetInt16s() *BigInts { + val := i.object.(*[]int16) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetInt64(int64(v))}) + } + return bigints +} +func (i *Interface) GetInt32s() *BigInts { + val := i.object.(*[]int32) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetInt64(int64(v))}) + } + return bigints +} +func (i *Interface) GetInt64s() *BigInts { + val := i.object.(*[]int64) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetInt64(v)}) + } + return bigints +} func (i *Interface) GetUint8() *BigInt { return &BigInt{new(big.Int).SetUint64(uint64(*i.object.(*uint8)))} } @@ -110,6 +206,38 @@ func (i *Interface) GetUint32() *BigInt { func (i *Interface) GetUint64() *BigInt { return &BigInt{new(big.Int).SetUint64(*i.object.(*uint64))} } +func (i *Interface) GetUint8s() *BigInts { + val := i.object.(*[]uint8) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetUint64(uint64(v))}) + } + return bigints +} +func (i *Interface) GetUint16s() *BigInts { + val := i.object.(*[]uint16) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetUint64(uint64(v))}) + } + return bigints +} +func (i *Interface) GetUint32s() *BigInts { + val := i.object.(*[]uint32) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetUint64(uint64(v))}) + } + return bigints +} +func (i *Interface) GetUint64s() *BigInts { + val := i.object.(*[]uint64) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetUint64(v)}) + } + return bigints +} func (i *Interface) GetBigInt() *BigInt { return &BigInt{*i.object.(**big.Int)} } func (i *Interface) GetBigInts() *BigInts { return &BigInts{*i.object.(*[]*big.Int)} } @@ -120,9 +248,7 @@ type Interfaces struct { // NewInterfaces creates a slice of uninitialized interfaces. func NewInterfaces(size int) *Interfaces { - return &Interfaces{ - objects: make([]interface{}, size), - } + return &Interfaces{objects: make([]interface{}, size)} } // Size returns the number of interfaces in the slice. @@ -131,11 +257,13 @@ func (i *Interfaces) Size() int { } // Get returns the bigint at the given index from the slice. +// Notably the returned value can be changed without affecting the +// interfaces itself. func (i *Interfaces) Get(index int) (iface *Interface, _ error) { if index < 0 || index >= len(i.objects) { return nil, errors.New("index out of bounds") } - return &Interface{i.objects[index]}, nil + return &Interface{object: i.objects[index]}, nil } // Set sets the big int at the given index in the slice. diff --git a/mobile/interface_test.go b/mobile/interface_test.go new file mode 100644 index 000000000000..4bd1af47aa1d --- /dev/null +++ b/mobile/interface_test.go @@ -0,0 +1,90 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package geth + +import ( + "fmt" + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" +) + +func TestInterfaceGetSet(t *testing.T) { + var tests = []struct { + method string + input interface{} + expect interface{} + }{ + {"Bool", true, true}, + {"Bool", false, false}, + {"Bools", &Bools{[]bool{false, true}}, &Bools{[]bool{false, true}}}, + {"String", "go-ethereum", "go-ethereum"}, + {"Strings", &Strings{strs: []string{"hello", "world"}}, &Strings{strs: []string{"hello", "world"}}}, + {"Binary", []byte{0x01, 0x02}, []byte{0x01, 0x02}}, + {"Binaries", &Binaries{[][]byte{{0x01, 0x02}, {0x03, 0x04}}}, &Binaries{[][]byte{{0x01, 0x02}, {0x03, 0x04}}}}, + {"Address", &Address{common.HexToAddress("deadbeef")}, &Address{common.HexToAddress("deadbeef")}}, + {"Addresses", &Addresses{[]common.Address{common.HexToAddress("deadbeef"), common.HexToAddress("cafebabe")}}, &Addresses{[]common.Address{common.HexToAddress("deadbeef"), common.HexToAddress("cafebabe")}}}, + {"Hash", &Hash{common.HexToHash("deadbeef")}, &Hash{common.HexToHash("deadbeef")}}, + {"Hashes", &Hashes{[]common.Hash{common.HexToHash("deadbeef"), common.HexToHash("cafebabe")}}, &Hashes{[]common.Hash{common.HexToHash("deadbeef"), common.HexToHash("cafebabe")}}}, + {"Int8", int8(1), int8(1)}, + {"Int16", int16(1), int16(1)}, + {"Int32", int32(1), int32(1)}, + {"Int64", int64(1), int64(1)}, + {"Int8s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Int16s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Int32s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Int64s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Uint8", NewBigInt(1), NewBigInt(1)}, + {"Uint16", NewBigInt(1), NewBigInt(1)}, + {"Uint32", NewBigInt(1), NewBigInt(1)}, + {"Uint64", NewBigInt(1), NewBigInt(1)}, + {"Uint8s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Uint16s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Uint32s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Uint64s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"BigInt", NewBigInt(1), NewBigInt(1)}, + {"BigInts", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + } + + args := NewInterfaces(len(tests)) + + callFn := func(receiver interface{}, method string, arg interface{}) interface{} { + rval := reflect.ValueOf(receiver) + rval.MethodByName(fmt.Sprintf("Set%s", method)).Call([]reflect.Value{reflect.ValueOf(arg)}) + res := rval.MethodByName(fmt.Sprintf("Get%s", method)).Call(nil) + if len(res) > 0 { + return res[0].Interface() + } + return nil + } + + for index, c := range tests { + // In theory the change of iface shouldn't effect the args value + iface, _ := args.Get(index) + result := callFn(iface, c.method, c.input) + if !reflect.DeepEqual(result, c.expect) { + t.Errorf("Interface get/set mismatch, want %v, got %v", c.expect, result) + } + // Check whether the underlying value in args is still zero + iface, _ = args.Get(index) + if iface.object != nil { + t.Error("Get operation is not write safe") + } + } +} diff --git a/mobile/primitives.go b/mobile/primitives.go index 5c6617fa475e..7e1ab26ef039 100644 --- a/mobile/primitives.go +++ b/mobile/primitives.go @@ -21,6 +21,8 @@ package geth import ( "errors" "fmt" + + "github.com/ethereum/go-ethereum/common" ) // Strings represents s slice of strs. @@ -52,3 +54,63 @@ func (s *Strings) Set(index int, str string) error { func (s *Strings) String() string { return fmt.Sprintf("%v", s.strs) } + +// Bools represents a slice of bool. +type Bools struct{ bools []bool } + +// Size returns the number of bool in the slice. +func (bs *Bools) Size() int { + return len(bs.bools) +} + +// Get returns the bool at the given index from the slice. +func (bs *Bools) Get(index int) (b bool, _ error) { + if index < 0 || index >= len(bs.bools) { + return false, errors.New("index out of bounds") + } + return bs.bools[index], nil +} + +// Set sets the bool at the given index in the slice. +func (bs *Bools) Set(index int, b bool) error { + if index < 0 || index >= len(bs.bools) { + return errors.New("index out of bounds") + } + bs.bools[index] = b + return nil +} + +// String implements the Stringer interface. +func (bs *Bools) String() string { + return fmt.Sprintf("%v", bs.bools) +} + +// Binaries represents a slice of byte slice +type Binaries struct{ binaries [][]byte } + +// Size returns the number of byte slice in the slice. +func (bs *Binaries) Size() int { + return len(bs.binaries) +} + +// Get returns the byte slice at the given index from the slice. +func (bs *Binaries) Get(index int) (binary []byte, _ error) { + if index < 0 || index >= len(bs.binaries) { + return nil, errors.New("index out of bounds") + } + return common.CopyBytes(bs.binaries[index]), nil +} + +// Set sets the byte slice at the given index in the slice. +func (bs *Binaries) Set(index int, binary []byte) error { + if index < 0 || index >= len(bs.binaries) { + return errors.New("index out of bounds") + } + bs.binaries[index] = common.CopyBytes(binary) + return nil +} + +// String implements the Stringer interface. +func (bs *Binaries) String() string { + return fmt.Sprintf("%v", bs.binaries) +} diff --git a/mobile/shhclient.go b/mobile/shhclient.go index a069c9bd4042..90a8b83c39f9 100644 --- a/mobile/shhclient.go +++ b/mobile/shhclient.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify diff --git a/mobile/types.go b/mobile/types.go index 443d07ea9329..b9c44c25d7a9 100644 --- a/mobile/types.go +++ b/mobile/types.go @@ -109,7 +109,7 @@ func (h *Header) GetDifficulty() *BigInt { return &BigInt{h.header.Difficulty} } func (h *Header) GetNumber() int64 { return h.header.Number.Int64() } func (h *Header) GetGasLimit() int64 { return int64(h.header.GasLimit) } func (h *Header) GetGasUsed() int64 { return int64(h.header.GasUsed) } -func (h *Header) GetTime() int64 { return h.header.Time.Int64() } +func (h *Header) GetTime() int64 { return int64(h.header.Time) } func (h *Header) GetExtra() []byte { return h.header.Extra } func (h *Header) GetMixDigest() *Hash { return &Hash{h.header.MixDigest} } func (h *Header) GetNonce() *Nonce { return &Nonce{h.header.Nonce} } @@ -180,7 +180,7 @@ func (b *Block) GetDifficulty() *BigInt { return &BigInt{b.block.Difficu func (b *Block) GetNumber() int64 { return b.block.Number().Int64() } func (b *Block) GetGasLimit() int64 { return int64(b.block.GasLimit()) } func (b *Block) GetGasUsed() int64 { return int64(b.block.GasUsed()) } -func (b *Block) GetTime() int64 { return b.block.Time().Int64() } +func (b *Block) GetTime() int64 { return int64(b.block.Time()) } func (b *Block) GetExtra() []byte { return b.block.Extra() } func (b *Block) GetMixDigest() *Hash { return &Hash{b.block.MixDigest()} } func (b *Block) GetNonce() int64 { return int64(b.block.Nonce()) } @@ -197,8 +197,18 @@ type Transaction struct { tx *types.Transaction } -// NewTransaction creates a new transaction with the given properties. +// NewContractCreation creates a new transaction for deploying a new contract with +// the given properties. +func NewContractCreation(nonce int64, amount *BigInt, gasLimit int64, gasPrice *BigInt, data []byte) *Transaction { + return &Transaction{types.NewContractCreation(uint64(nonce), amount.bigint, uint64(gasLimit), gasPrice.bigint, common.CopyBytes(data))} +} + +// NewTransaction creates a new transaction with the given properties. Contracts +// can be created by transacting with a nil recipient. func NewTransaction(nonce int64, to *Address, amount *BigInt, gasLimit int64, gasPrice *BigInt, data []byte) *Transaction { + if to == nil { + return &Transaction{types.NewContractCreation(uint64(nonce), amount.bigint, uint64(gasLimit), gasPrice.bigint, common.CopyBytes(data))} + } return &Transaction{types.NewTransaction(uint64(nonce), to.address, amount.bigint, uint64(gasLimit), gasPrice.bigint, common.CopyBytes(data))} } diff --git a/node/api.go b/node/api.go index 6e36e505d12f..66cd1dde3354 100644 --- a/node/api.go +++ b/node/api.go @@ -20,11 +20,9 @@ import ( "context" "fmt" "strings" - "time" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/rpc" @@ -51,7 +49,7 @@ func (api *PrivateAdminAPI) AddPeer(url string) (bool, error) { return false, ErrNodeStopped } // Try to add the url as a static peer and return - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { return false, fmt.Errorf("invalid enode: %v", err) } @@ -67,7 +65,7 @@ func (api *PrivateAdminAPI) RemovePeer(url string) (bool, error) { return false, ErrNodeStopped } // Try to remove the url as a static peer and return - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { return false, fmt.Errorf("invalid enode: %v", err) } @@ -82,7 +80,7 @@ func (api *PrivateAdminAPI) AddTrustedPeer(url string) (bool, error) { if server == nil { return false, ErrNodeStopped } - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { return false, fmt.Errorf("invalid enode: %v", err) } @@ -98,7 +96,7 @@ func (api *PrivateAdminAPI) RemoveTrustedPeer(url string) (bool, error) { if server == nil { return false, ErrNodeStopped } - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { return false, fmt.Errorf("invalid enode: %v", err) } @@ -297,151 +295,6 @@ func (api *PublicAdminAPI) Datadir() string { return api.node.DataDir() } -// PublicDebugAPI is the collection of debugging related API methods exposed over -// both secure and unsecure RPC channels. -type PublicDebugAPI struct { - node *Node // Node interfaced by this API -} - -// NewPublicDebugAPI creates a new API definition for the public debug methods -// of the node itself. -func NewPublicDebugAPI(node *Node) *PublicDebugAPI { - return &PublicDebugAPI{node: node} -} - -// Metrics retrieves all the known system metric collected by the node. -func (api *PublicDebugAPI) Metrics(raw bool) (map[string]interface{}, error) { - // Create a rate formatter - units := []string{"", "K", "M", "G", "T", "E", "P"} - round := func(value float64, prec int) string { - unit := 0 - for value >= 1000 { - unit, value, prec = unit+1, value/1000, 2 - } - return fmt.Sprintf(fmt.Sprintf("%%.%df%s", prec, units[unit]), value) - } - format := func(total float64, rate float64) string { - return fmt.Sprintf("%s (%s/s)", round(total, 0), round(rate, 2)) - } - // Iterate over all the metrics, and just dump for now - counters := make(map[string]interface{}) - metrics.DefaultRegistry.Each(func(name string, metric interface{}) { - // Create or retrieve the counter hierarchy for this metric - root, parts := counters, strings.Split(name, "/") - for _, part := range parts[:len(parts)-1] { - if _, ok := root[part]; !ok { - root[part] = make(map[string]interface{}) - } - root = root[part].(map[string]interface{}) - } - name = parts[len(parts)-1] - - // Fill the counter with the metric details, formatting if requested - if raw { - switch metric := metric.(type) { - case metrics.Counter: - root[name] = map[string]interface{}{ - "Overall": float64(metric.Count()), - } - - case metrics.Meter: - root[name] = map[string]interface{}{ - "AvgRate01Min": metric.Rate1(), - "AvgRate05Min": metric.Rate5(), - "AvgRate15Min": metric.Rate15(), - "MeanRate": metric.RateMean(), - "Overall": float64(metric.Count()), - } - - case metrics.Timer: - root[name] = map[string]interface{}{ - "AvgRate01Min": metric.Rate1(), - "AvgRate05Min": metric.Rate5(), - "AvgRate15Min": metric.Rate15(), - "MeanRate": metric.RateMean(), - "Overall": float64(metric.Count()), - "Percentiles": map[string]interface{}{ - "5": metric.Percentile(0.05), - "20": metric.Percentile(0.2), - "50": metric.Percentile(0.5), - "80": metric.Percentile(0.8), - "95": metric.Percentile(0.95), - }, - } - - case metrics.ResettingTimer: - t := metric.Snapshot() - ps := t.Percentiles([]float64{5, 20, 50, 80, 95}) - root[name] = map[string]interface{}{ - "Measurements": len(t.Values()), - "Mean": t.Mean(), - "Percentiles": map[string]interface{}{ - "5": ps[0], - "20": ps[1], - "50": ps[2], - "80": ps[3], - "95": ps[4], - }, - } - - default: - root[name] = "Unknown metric type" - } - } else { - switch metric := metric.(type) { - case metrics.Counter: - root[name] = map[string]interface{}{ - "Overall": float64(metric.Count()), - } - - case metrics.Meter: - root[name] = map[string]interface{}{ - "Avg01Min": format(metric.Rate1()*60, metric.Rate1()), - "Avg05Min": format(metric.Rate5()*300, metric.Rate5()), - "Avg15Min": format(metric.Rate15()*900, metric.Rate15()), - "Overall": format(float64(metric.Count()), metric.RateMean()), - } - - case metrics.Timer: - root[name] = map[string]interface{}{ - "Avg01Min": format(metric.Rate1()*60, metric.Rate1()), - "Avg05Min": format(metric.Rate5()*300, metric.Rate5()), - "Avg15Min": format(metric.Rate15()*900, metric.Rate15()), - "Overall": format(float64(metric.Count()), metric.RateMean()), - "Maximum": time.Duration(metric.Max()).String(), - "Minimum": time.Duration(metric.Min()).String(), - "Percentiles": map[string]interface{}{ - "5": time.Duration(metric.Percentile(0.05)).String(), - "20": time.Duration(metric.Percentile(0.2)).String(), - "50": time.Duration(metric.Percentile(0.5)).String(), - "80": time.Duration(metric.Percentile(0.8)).String(), - "95": time.Duration(metric.Percentile(0.95)).String(), - }, - } - - case metrics.ResettingTimer: - t := metric.Snapshot() - ps := t.Percentiles([]float64{5, 20, 50, 80, 95}) - root[name] = map[string]interface{}{ - "Measurements": len(t.Values()), - "Mean": time.Duration(t.Mean()).String(), - "Percentiles": map[string]interface{}{ - "5": time.Duration(ps[0]).String(), - "20": time.Duration(ps[1]).String(), - "50": time.Duration(ps[2]).String(), - "80": time.Duration(ps[3]).String(), - "95": time.Duration(ps[4]).String(), - }, - } - - default: - root[name] = "Unknown metric type" - } - } - }) - return counters, nil -} - // PublicWeb3API offers helper utils type PublicWeb3API struct { stack *Node diff --git a/node/config.go b/node/config.go index 8f10f4f613d7..1905ac7fa591 100644 --- a/node/config.go +++ b/node/config.go @@ -24,9 +24,12 @@ import ( "path/filepath" "runtime" "strings" + "sync" "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/external" "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/accounts/scwallet" "github.com/ethereum/go-ethereum/accounts/usbwallet" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" @@ -79,13 +82,22 @@ type Config struct { // is created by New and destroyed when the node is stopped. KeyStoreDir string `toml:",omitempty"` + // ExternalSigner specifies an external URI for a clef-type signer + ExternalSigner string `toml:"omitempty"` + // UseLightweightKDF lowers the memory and CPU requirements of the key store // scrypt KDF at the expense of security. UseLightweightKDF bool `toml:",omitempty"` + // InsecureUnlockAllowed allows user to unlock accounts in unsafe http environment. + InsecureUnlockAllowed bool `toml:",omitempty"` + // NoUSB disables hardware wallet monitoring and connectivity. NoUSB bool `toml:",omitempty"` + // SmartCardDaemonPath is the path to the smartcard daemon's socket + SmartCardDaemonPath string `toml:",omitempty"` + // IPCPath is the requested location to place the IPC endpoint. If the path is // a simple file name, it is placed inside the data directory (or on the root // pipe path on Windows), whereas if it's a resolvable path name (absolute or @@ -150,8 +162,35 @@ type Config struct { // private APIs to untrusted users is a major security risk. WSExposeAll bool `toml:",omitempty"` + // GraphQLHost is the host interface on which to start the GraphQL server. If this + // field is empty, no GraphQL API endpoint will be started. + GraphQLHost string `toml:",omitempty"` + + // GraphQLPort is the TCP port number on which to start the GraphQL server. The + // default zero value is/ valid and will pick a port number randomly (useful + // for ephemeral nodes). + GraphQLPort int `toml:",omitempty"` + + // GraphQLCors is the Cross-Origin Resource Sharing header to send to requesting + // clients. Please be aware that CORS is a browser enforced security, it's fully + // useless for custom HTTP clients. + GraphQLCors []string `toml:",omitempty"` + + // GraphQLVirtualHosts is the list of virtual hostnames which are allowed on incoming requests. + // This is by default {'localhost'}. Using this prevents attacks like + // DNS rebinding, which bypasses SOP by simply masquerading as being within the same + // origin. These attacks do not utilize CORS, since they are not cross-domain. + // By explicitly checking the Host-header, the server will not allow requests + // made against the server with a malicious host domain. + // Requests using ip address directly are not affected + GraphQLVirtualHosts []string `toml:",omitempty"` + // Logger is a custom logger to use with the p2p.Server. Logger log.Logger `toml:",omitempty"` + + staticNodesWarning bool + trustedNodesWarning bool + oldGethResourceWarning bool } // IPCEndpoint resolves an IPC endpoint based on a configured value, taking into @@ -208,6 +247,15 @@ func (c *Config) HTTPEndpoint() string { return fmt.Sprintf("%s:%d", c.HTTPHost, c.HTTPPort) } +// GraphQLEndpoint resolves a GraphQL endpoint based on the configured host interface +// and port parameters. +func (c *Config) GraphQLEndpoint() string { + if c.GraphQLHost == "" { + return "" + } + return fmt.Sprintf("%s:%d", c.GraphQLHost, c.GraphQLPort) +} + // DefaultHTTPEndpoint returns the HTTP endpoint used by default. func DefaultHTTPEndpoint() string { config := &Config{HTTPHost: DefaultHTTPHost, HTTPPort: DefaultHTTPPort} @@ -229,6 +277,12 @@ func DefaultWSEndpoint() string { return config.WSEndpoint() } +// ExtRPCEnabled returns the indicator whether node enables the external +// RPC(http, ws or graphql). +func (c *Config) ExtRPCEnabled() bool { + return c.HTTPHost != "" || c.WSHost != "" || c.GraphQLHost != "" +} + // NodeName returns the devp2p node identifier. func (c *Config) NodeName() string { name := c.name() @@ -263,8 +317,8 @@ var isOldGethResource = map[string]bool{ "chaindata": true, "nodes": true, "nodekey": true, - "static-nodes.json": true, - "trusted-nodes.json": true, + "static-nodes.json": false, // no warning for these because they have their + "trusted-nodes.json": false, // own separate warning. } // ResolvePath resolves path in the instance directory. @@ -277,13 +331,15 @@ func (c *Config) ResolvePath(path string) string { } // Backwards-compatibility: ensure that data directory files created // by geth 1.4 are used if they exist. - if c.name() == "geth" && isOldGethResource[path] { + if warn, isOld := isOldGethResource[path]; isOld { oldpath := "" - if c.Name == "geth" { + if c.name() == "geth" { oldpath = filepath.Join(c.DataDir, path) } if oldpath != "" && common.FileExist(oldpath) { - // TODO: print warning + if warn { + c.warnOnce(&c.oldGethResourceWarning, "Using deprecated resource file %s, please move this file to the 'geth' subdirectory of datadir.", oldpath) + } return oldpath } } @@ -337,17 +393,17 @@ func (c *Config) NodeKey() *ecdsa.PrivateKey { // StaticNodes returns a list of node enode URLs configured as static nodes. func (c *Config) StaticNodes() []*enode.Node { - return c.parsePersistentNodes(c.ResolvePath(datadirStaticNodes)) + return c.parsePersistentNodes(&c.staticNodesWarning, c.ResolvePath(datadirStaticNodes)) } // TrustedNodes returns a list of node enode URLs configured as trusted nodes. func (c *Config) TrustedNodes() []*enode.Node { - return c.parsePersistentNodes(c.ResolvePath(datadirTrustedNodes)) + return c.parsePersistentNodes(&c.trustedNodesWarning, c.ResolvePath(datadirTrustedNodes)) } // parsePersistentNodes parses a list of discovery node URLs loaded from a .json // file from within the data directory. -func (c *Config) parsePersistentNodes(path string) []*enode.Node { +func (c *Config) parsePersistentNodes(w *bool, path string) []*enode.Node { // Short circuit if no node config is present if c.DataDir == "" { return nil @@ -355,10 +411,12 @@ func (c *Config) parsePersistentNodes(path string) []*enode.Node { if _, err := os.Stat(path); err != nil { return nil } + c.warnOnce(w, "Found deprecated node list file %s, please use the TOML config file instead.", path) + // Load the nodes from the config file. var nodelist []string if err := common.LoadJSON(path, &nodelist); err != nil { - log.Error(fmt.Sprintf("Can't load node file %s: %v", path, err)) + log.Error(fmt.Sprintf("Can't load node list file: %v", err)) return nil } // Interpret the list as a discovery node array @@ -367,7 +425,7 @@ func (c *Config) parsePersistentNodes(path string) []*enode.Node { if url == "" { continue } - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { log.Error(fmt.Sprintf("Node URL %s: %v\n", url, err)) continue @@ -421,22 +479,67 @@ func makeAccountManager(conf *Config) (*accounts.Manager, string, error) { return nil, "", err } // Assemble the account manager and supported backends - backends := []accounts.Backend{ - keystore.NewKeyStore(keydir, scryptN, scryptP), - } - if !conf.NoUSB { - // Start a USB hub for Ledger hardware wallets - if ledgerhub, err := usbwallet.NewLedgerHub(); err != nil { - log.Warn(fmt.Sprintf("Failed to start Ledger hub, disabling: %v", err)) + var backends []accounts.Backend + if len(conf.ExternalSigner) > 0 { + log.Info("Using external signer", "url", conf.ExternalSigner) + if extapi, err := external.NewExternalBackend(conf.ExternalSigner); err == nil { + backends = append(backends, extapi) } else { - backends = append(backends, ledgerhub) + return nil, "", fmt.Errorf("error connecting to external signer: %v", err) } - // Start a USB hub for Trezor hardware wallets - if trezorhub, err := usbwallet.NewTrezorHub(); err != nil { - log.Warn(fmt.Sprintf("Failed to start Trezor hub, disabling: %v", err)) - } else { - backends = append(backends, trezorhub) + } + if len(backends) == 0 { + // For now, we're using EITHER external signer OR local signers. + // If/when we implement some form of lockfile for USB and keystore wallets, + // we can have both, but it's very confusing for the user to see the same + // accounts in both externally and locally, plus very racey. + backends = append(backends, keystore.NewKeyStore(keydir, scryptN, scryptP)) + if !conf.NoUSB { + // Start a USB hub for Ledger hardware wallets + if ledgerhub, err := usbwallet.NewLedgerHub(); err != nil { + log.Warn(fmt.Sprintf("Failed to start Ledger hub, disabling: %v", err)) + } else { + backends = append(backends, ledgerhub) + } + // Start a USB hub for Trezor hardware wallets (HID version) + if trezorhub, err := usbwallet.NewTrezorHubWithHID(); err != nil { + log.Warn(fmt.Sprintf("Failed to start HID Trezor hub, disabling: %v", err)) + } else { + backends = append(backends, trezorhub) + } + // Start a USB hub for Trezor hardware wallets (WebUSB version) + if trezorhub, err := usbwallet.NewTrezorHubWithWebUSB(); err != nil { + log.Warn(fmt.Sprintf("Failed to start WebUSB Trezor hub, disabling: %v", err)) + } else { + backends = append(backends, trezorhub) + } + } + if len(conf.SmartCardDaemonPath) > 0 { + // Start a smart card hub + if schub, err := scwallet.NewHub(conf.SmartCardDaemonPath, scwallet.Scheme, keydir); err != nil { + log.Warn(fmt.Sprintf("Failed to start smart card hub, disabling: %v", err)) + } else { + backends = append(backends, schub) + } } } - return accounts.NewManager(backends...), ephemeral, nil + + return accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: conf.InsecureUnlockAllowed}, backends...), ephemeral, nil +} + +var warnLock sync.Mutex + +func (c *Config) warnOnce(w *bool, format string, args ...interface{}) { + warnLock.Lock() + defer warnLock.Unlock() + + if *w { + return + } + l := c.Logger + if l == nil { + l = log.Root() + } + l.Warn(fmt.Sprintf(format, args...)) + *w = true } diff --git a/node/config_test.go b/node/config_test.go index b81d3d612025..00c24a239123 100644 --- a/node/config_test.go +++ b/node/config_test.go @@ -38,14 +38,22 @@ func TestDatadirCreation(t *testing.T) { } defer os.RemoveAll(dir) - if _, err := New(&Config{DataDir: dir}); err != nil { + node, err := New(&Config{DataDir: dir}) + if err != nil { t.Fatalf("failed to create stack with existing datadir: %v", err) } + if err := node.Close(); err != nil { + t.Fatalf("failed to close node: %v", err) + } // Generate a long non-existing datadir path and check that it gets created by a node dir = filepath.Join(dir, "a", "b", "c", "d", "e", "f") - if _, err := New(&Config{DataDir: dir}); err != nil { + node, err = New(&Config{DataDir: dir}) + if err != nil { t.Fatalf("failed to create stack with creatable datadir: %v", err) } + if err := node.Close(); err != nil { + t.Fatalf("failed to close node: %v", err) + } if _, err := os.Stat(dir); err != nil { t.Fatalf("freshly created datadir not accessible: %v", err) } @@ -57,8 +65,12 @@ func TestDatadirCreation(t *testing.T) { defer os.Remove(file.Name()) dir = filepath.Join(file.Name(), "invalid/path") - if _, err := New(&Config{DataDir: dir}); err == nil { + node, err = New(&Config{DataDir: dir}) + if err == nil { t.Fatalf("protocol stack created with an invalid datadir") + if err := node.Close(); err != nil { + t.Fatalf("failed to close node: %v", err) + } } } diff --git a/node/defaults.go b/node/defaults.go index c1376dba0f33..f84a5d547998 100644 --- a/node/defaults.go +++ b/node/defaults.go @@ -28,24 +28,28 @@ import ( ) const ( - DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server - DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server - DefaultWSHost = "localhost" // Default host interface for the websocket RPC server - DefaultWSPort = 8546 // Default TCP port for the websocket RPC server + DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server + DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server + DefaultWSHost = "localhost" // Default host interface for the websocket RPC server + DefaultWSPort = 8546 // Default TCP port for the websocket RPC server + DefaultGraphQLHost = "localhost" // Default host interface for the GraphQL server + DefaultGraphQLPort = 8547 // Default TCP port for the GraphQL server ) // DefaultConfig contains reasonable default settings. var DefaultConfig = Config{ - DataDir: DefaultDataDir(), - HTTPPort: DefaultHTTPPort, - HTTPModules: []string{"net", "web3"}, - HTTPVirtualHosts: []string{"localhost"}, - HTTPTimeouts: rpc.DefaultHTTPTimeouts, - WSPort: DefaultWSPort, - WSModules: []string{"net", "web3"}, + DataDir: DefaultDataDir(), + HTTPPort: DefaultHTTPPort, + HTTPModules: []string{"net", "web3"}, + HTTPVirtualHosts: []string{"localhost"}, + HTTPTimeouts: rpc.DefaultHTTPTimeouts, + WSPort: DefaultWSPort, + WSModules: []string{"net", "web3"}, + GraphQLPort: DefaultGraphQLPort, + GraphQLVirtualHosts: []string{"localhost"}, P2P: p2p.Config{ ListenAddr: ":30303", - MaxPeers: 25, + MaxPeers: 50, NAT: nat.Any(), }, } @@ -56,11 +60,20 @@ func DefaultDataDir() string { // Try to place the data folder in the user's home dir home := homeDir() if home != "" { - if runtime.GOOS == "darwin" { + switch runtime.GOOS { + case "darwin": return filepath.Join(home, "Library", "Ethereum") - } else if runtime.GOOS == "windows" { - return filepath.Join(home, "AppData", "Roaming", "Ethereum") - } else { + case "windows": + // We used to put everything in %HOME%\AppData\Roaming, but this caused + // problems with non-typical setups. If this fallback location exists and + // is non-empty, use it, otherwise DTRT and check %LOCALAPPDATA%. + fallback := filepath.Join(home, "AppData", "Roaming", "Ethereum") + appdata := windowsAppData() + if appdata == "" || isNonEmptyDir(fallback) { + return fallback + } + return filepath.Join(appdata, "Ethereum") + default: return filepath.Join(home, ".ethereum") } } @@ -68,6 +81,27 @@ func DefaultDataDir() string { return "" } +func windowsAppData() string { + v := os.Getenv("LOCALAPPDATA") + if v == "" { + // Windows XP and below don't have LocalAppData. Crash here because + // we don't support Windows XP and undefining the variable will cause + // other issues. + panic("environment variable LocalAppData is undefined") + } + return v +} + +func isNonEmptyDir(dir string) bool { + f, err := os.Open(dir) + if err != nil { + return false + } + names, _ := f.Readdir(1) + f.Close() + return len(names) > 0 +} + func homeDir() string { if home := os.Getenv("HOME"); home != "" { return home diff --git a/node/node.go b/node/node.go index ada3837217ab..c9c27d826239 100644 --- a/node/node.go +++ b/node/node.go @@ -27,13 +27,14 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/internal/debug" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/rpc" - "github.com/prometheus/prometheus/util/flock" + "github.com/prometheus/tsdb/fileutil" ) // Node is a container on which services can be registered. @@ -42,8 +43,8 @@ type Node struct { config *Config accman *accounts.Manager - ephemeralKeystore string // if non-empty, the key directory that will be removed by Stop - instanceDirLock flock.Releaser // prevents concurrent use of instance directory + ephemeralKeystore string // if non-empty, the key directory that will be removed by Stop + instanceDirLock fileutil.Releaser // prevents concurrent use of instance directory serverConfig p2p.Config server *p2p.Server // Currently running P2P networking layer @@ -121,6 +122,29 @@ func New(conf *Config) (*Node, error) { }, nil } +// Close stops the Node and releases resources acquired in +// Node constructor New. +func (n *Node) Close() error { + var errs []error + + // Terminate all subsystems and collect any errors + if err := n.Stop(); err != nil && err != ErrNodeStopped { + errs = append(errs, err) + } + if err := n.accman.Close(); err != nil { + errs = append(errs, err) + } + // Report any errors that might have occurred + switch len(errs) { + case 0: + return nil + case 1: + return errs[0] + default: + return fmt.Errorf("%v", errs) + } +} + // Register injects a new service into the node's stack. The service created by // the passed constructor must be unique in its type with regard to sibling ones. func (n *Node) Register(constructor ServiceConstructor) error { @@ -197,7 +221,7 @@ func (n *Node) Start() error { return convertFileLockError(err) } // Start each of the services - started := []reflect.Type{} + var started []reflect.Type for kind, service := range services { // Start the next service, stopping all previous upon failure if err := service.Start(running); err != nil { @@ -223,10 +247,14 @@ func (n *Node) Start() error { n.services = services n.server = running n.stop = make(chan struct{}) - return nil } +// Config returns the configuration of node. +func (n *Node) Config() *Config { + return n.config +} + func (n *Node) openDataDir() error { if n.config.DataDir == "" { return nil // ephemeral @@ -238,7 +266,7 @@ func (n *Node) openDataDir() error { } // Lock the instance directory to prevent concurrent use by another instance as well as // accidental use of the instance directory as a database. - release, _, err := flock.New(filepath.Join(instdir, "LOCK")) + release, _, err := fileutil.Flock(filepath.Join(instdir, "LOCK")) if err != nil { return convertFileLockError(err) } @@ -287,7 +315,7 @@ func (n *Node) startInProc(apis []rpc.API) error { if err := handler.RegisterName(api.Namespace, api.Service); err != nil { return err } - n.log.Debug("InProc registered", "service", api.Service, "namespace", api.Namespace) + n.log.Debug("InProc registered", "namespace", api.Namespace) } n.inprocHandler = handler return nil @@ -322,7 +350,7 @@ func (n *Node) stopIPC() { n.ipcListener.Close() n.ipcListener = nil - n.log.Info("IPC endpoint closed", "endpoint", n.ipcEndpoint) + n.log.Info("IPC endpoint closed", "url", n.ipcEndpoint) } if n.ipcHandler != nil { n.ipcHandler.Stop() @@ -549,11 +577,23 @@ func (n *Node) IPCEndpoint() string { // HTTPEndpoint retrieves the current HTTP endpoint used by the protocol stack. func (n *Node) HTTPEndpoint() string { + n.lock.Lock() + defer n.lock.Unlock() + + if n.httpListener != nil { + return n.httpListener.Addr().String() + } return n.httpEndpoint } // WSEndpoint retrieves the current WS endpoint used by the protocol stack. func (n *Node) WSEndpoint() string { + n.lock.Lock() + defer n.lock.Unlock() + + if n.wsListener != nil { + return n.wsListener.Addr().String() + } return n.wsEndpoint } @@ -566,11 +606,31 @@ func (n *Node) EventMux() *event.TypeMux { // OpenDatabase opens an existing database with the given name (or creates one if no // previous can be found) from within the node's instance directory. If the node is // ephemeral, a memory database is returned. -func (n *Node) OpenDatabase(name string, cache, handles int) (ethdb.Database, error) { +func (n *Node) OpenDatabase(name string, cache, handles int, namespace string) (ethdb.Database, error) { if n.config.DataDir == "" { - return ethdb.NewMemDatabase(), nil + return rawdb.NewMemoryDatabase(), nil } - return ethdb.NewLDBDatabase(n.config.ResolvePath(name), cache, handles) + return rawdb.NewLevelDBDatabase(n.config.ResolvePath(name), cache, handles, namespace) +} + +// OpenDatabaseWithFreezer opens an existing database with the given name (or +// creates one if no previous can be found) from within the node's data directory, +// also attaching a chain freezer to it that moves ancient chain data from the +// database to immutable append-only files. If the node is an ephemeral one, a +// memory database is returned. +func (n *Node) OpenDatabaseWithFreezer(name string, cache, handles int, freezer, namespace string) (ethdb.Database, error) { + if n.config.DataDir == "" { + return rawdb.NewMemoryDatabase(), nil + } + root := n.config.ResolvePath(name) + + switch { + case freezer == "": + freezer = filepath.Join(root, "ancient") + case !filepath.IsAbs(freezer): + freezer = n.config.ResolvePath(freezer) + } + return rawdb.NewLevelDBDatabaseWithFreezer(root, cache, handles, freezer, namespace) } // ResolvePath returns the absolute path of a resource in the instance directory. @@ -594,11 +654,6 @@ func (n *Node) apis() []rpc.API { Namespace: "debug", Version: "1.0", Service: debug.Handler, - }, { - Namespace: "debug", - Version: "1.0", - Service: NewPublicDebugAPI(n), - Public: true, }, { Namespace: "web3", Version: "1.0", diff --git a/node/node_example_test.go b/node/node_example_test.go index ee06f4065c37..57b18855f1ed 100644 --- a/node/node_example_test.go +++ b/node/node_example_test.go @@ -46,6 +46,8 @@ func ExampleService() { if err != nil { log.Fatalf("Failed to create network node: %v", err) } + defer stack.Close() + // Create and register a simple network service. This is done through the definition // of a node.ServiceConstructor that will instantiate a node.Service. The reason for // the factory method approach is to support service restarts without relying on the diff --git a/node/node_test.go b/node/node_test.go index e51900bd1e7b..c464771cd807 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -46,6 +46,8 @@ func TestNodeLifeCycle(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Ensure that a stopped node can be stopped again for i := 0; i < 3; i++ { if err := stack.Stop(); err != ErrNodeStopped { @@ -88,6 +90,8 @@ func TestNodeUsedDataDir(t *testing.T) { if err != nil { t.Fatalf("failed to create original protocol stack: %v", err) } + defer original.Close() + if err := original.Start(); err != nil { t.Fatalf("failed to start original protocol stack: %v", err) } @@ -98,6 +102,8 @@ func TestNodeUsedDataDir(t *testing.T) { if err != nil { t.Fatalf("failed to create duplicate protocol stack: %v", err) } + defer duplicate.Close() + if err := duplicate.Start(); err != ErrDatadirUsed { t.Fatalf("duplicate datadir failure mismatch: have %v, want %v", err, ErrDatadirUsed) } @@ -109,6 +115,8 @@ func TestServiceRegistry(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of unique services and ensure they start successfully services := []ServiceConstructor{NewNoopServiceA, NewNoopServiceB, NewNoopServiceC} for i, constructor := range services { @@ -141,6 +149,8 @@ func TestServiceLifeCycle(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of life-cycle instrumented services services := map[string]InstrumentingWrapper{ "A": InstrumentedServiceMakerA, @@ -191,6 +201,8 @@ func TestServiceRestarts(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Define a service that does not support restarts var ( running bool @@ -239,6 +251,8 @@ func TestServiceConstructionAbortion(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Define a batch of good services services := map[string]InstrumentingWrapper{ "A": InstrumentedServiceMakerA, @@ -286,6 +300,8 @@ func TestServiceStartupAbortion(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of good services services := map[string]InstrumentingWrapper{ "A": InstrumentedServiceMakerA, @@ -339,6 +355,8 @@ func TestServiceTerminationGuarantee(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of good services services := map[string]InstrumentingWrapper{ "A": InstrumentedServiceMakerA, @@ -414,6 +432,8 @@ func TestServiceRetrieval(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + if err := stack.Register(NewNoopService); err != nil { t.Fatalf("noop service registration failed: %v", err) } @@ -449,14 +469,16 @@ func TestProtocolGather(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of services with some configured number of protocols services := map[string]struct { Count int Maker InstrumentingWrapper }{ - "Zero Protocols": {0, InstrumentedServiceMakerA}, - "Single Protocol": {1, InstrumentedServiceMakerB}, - "Many Protocols": {25, InstrumentedServiceMakerC}, + "zero": {0, InstrumentedServiceMakerA}, + "one": {1, InstrumentedServiceMakerB}, + "many": {10, InstrumentedServiceMakerC}, } for id, config := range services { protocols := make([]p2p.Protocol, config.Count) @@ -480,7 +502,7 @@ func TestProtocolGather(t *testing.T) { defer stack.Stop() protocols := stack.Server().Protocols - if len(protocols) != 26 { + if len(protocols) != 11 { t.Fatalf("mismatching number of protocols launched: have %d, want %d", len(protocols), 26) } for id, config := range services { @@ -505,6 +527,8 @@ func TestAPIGather(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of services with some configured APIs calls := make(chan string, 1) makeAPI := func(result string) *OneMethodAPI { diff --git a/node/service.go b/node/service.go index 6a96d9b1e15d..4dea00995c44 100644 --- a/node/service.go +++ b/node/service.go @@ -17,9 +17,11 @@ package node import ( + "path/filepath" "reflect" "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/p2p" @@ -39,15 +41,31 @@ type ServiceContext struct { // OpenDatabase opens an existing database with the given name (or creates one // if no previous can be found) from within the node's data directory. If the // node is an ephemeral one, a memory database is returned. -func (ctx *ServiceContext) OpenDatabase(name string, cache int, handles int) (ethdb.Database, error) { +func (ctx *ServiceContext) OpenDatabase(name string, cache int, handles int, namespace string) (ethdb.Database, error) { if ctx.config.DataDir == "" { - return ethdb.NewMemDatabase(), nil + return rawdb.NewMemoryDatabase(), nil } - db, err := ethdb.NewLDBDatabase(ctx.config.ResolvePath(name), cache, handles) - if err != nil { - return nil, err + return rawdb.NewLevelDBDatabase(ctx.config.ResolvePath(name), cache, handles, namespace) +} + +// OpenDatabaseWithFreezer opens an existing database with the given name (or +// creates one if no previous can be found) from within the node's data directory, +// also attaching a chain freezer to it that moves ancient chain data from the +// database to immutable append-only files. If the node is an ephemeral one, a +// memory database is returned. +func (ctx *ServiceContext) OpenDatabaseWithFreezer(name string, cache int, handles int, freezer string, namespace string) (ethdb.Database, error) { + if ctx.config.DataDir == "" { + return rawdb.NewMemoryDatabase(), nil } - return db, nil + root := ctx.config.ResolvePath(name) + + switch { + case freezer == "": + freezer = filepath.Join(root, "ancient") + case !filepath.IsAbs(freezer): + freezer = ctx.config.ResolvePath(freezer) + } + return rawdb.NewLevelDBDatabaseWithFreezer(root, cache, handles, freezer, namespace) } // ResolvePath resolves a user path into the data directory if that was relative @@ -67,6 +85,12 @@ func (ctx *ServiceContext) Service(service interface{}) error { return ErrServiceUnknown } +// ExtRPCEnabled returns the indicator whether node enables the external +// RPC(http, ws or graphql). +func (ctx *ServiceContext) ExtRPCEnabled() bool { + return ctx.config.ExtRPCEnabled() +} + // ServiceConstructor is the function signature of the constructors needed to be // registered for service instantiation. type ServiceConstructor func(ctx *ServiceContext) (Service, error) diff --git a/node/service_test.go b/node/service_test.go index a7ae439e0a90..63004a51ab58 100644 --- a/node/service_test.go +++ b/node/service_test.go @@ -39,7 +39,7 @@ func TestContextDatabases(t *testing.T) { } // Request the opening/creation of a database and ensure it persists to disk ctx := &ServiceContext{config: &Config{Name: "unit-test", DataDir: dir}} - db, err := ctx.OpenDatabase("persistent", 0, 0) + db, err := ctx.OpenDatabase("persistent", 0, 0, "") if err != nil { t.Fatalf("failed to open persistent database: %v", err) } @@ -50,7 +50,7 @@ func TestContextDatabases(t *testing.T) { } // Request th opening/creation of an ephemeral database and ensure it's not persisted ctx = &ServiceContext{config: &Config{DataDir: ""}} - db, err = ctx.OpenDatabase("ephemeral", 0, 0) + db, err = ctx.OpenDatabase("ephemeral", 0, 0, "") if err != nil { t.Fatalf("failed to open ephemeral database: %v", err) } @@ -67,6 +67,7 @@ func TestContextServices(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() // Define a verifier that ensures a NoopA is before it and NoopB after verifier := func(ctx *ServiceContext) (Service, error) { var objA *NoopServiceA diff --git a/p2p/dial.go b/p2p/dial.go index 359cdbcbba06..8dee5063f1d5 100644 --- a/p2p/dial.go +++ b/p2p/dial.go @@ -17,7 +17,6 @@ package p2p import ( - "container/heap" "errors" "fmt" "net" @@ -29,9 +28,10 @@ import ( ) const ( - // This is the amount of time spent waiting in between - // redialing a certain node. - dialHistoryExpiration = 30 * time.Second + // This is the amount of time spent waiting in between redialing a certain node. The + // limit is a bit higher than inboundThrottleTime to prevent failing dials in small + // private networks. + dialHistoryExpiration = inboundThrottleTime + 5*time.Second // Discovery lookups are throttled and can only run // once every few seconds. @@ -65,41 +65,32 @@ func (t TCPDialer) Dial(dest *enode.Node) (net.Conn, error) { } // dialstate schedules dials and discovery lookups. -// it get's a chance to compute new tasks on every iteration +// It gets a chance to compute new tasks on every iteration // of the main loop in Server.run. type dialstate struct { maxDynDials int ntab discoverTable netrestrict *netutil.Netlist + self enode.ID + bootnodes []*enode.Node // default dials when there are no peers + log log.Logger + start time.Time // time when the dialer was first used lookupRunning bool dialing map[enode.ID]connFlag lookupBuf []*enode.Node // current discovery lookup results randomNodes []*enode.Node // filled from Table static map[enode.ID]*dialTask - hist *dialHistory - - start time.Time // time when the dialer was first used - bootnodes []*enode.Node // default dials when there are no peers + hist expHeap } type discoverTable interface { - Self() *enode.Node Close() Resolve(*enode.Node) *enode.Node LookupRandom() []*enode.Node ReadRandomNodes([]*enode.Node) int } -// the dial history remembers recent dials. -type dialHistory []pastDial - -// pastDial is an entry in the dial history. -type pastDial struct { - id enode.ID - exp time.Time -} - type task interface { Do(*Server) } @@ -126,19 +117,23 @@ type waitExpireTask struct { time.Duration } -func newDialState(static []*enode.Node, bootnodes []*enode.Node, ntab discoverTable, maxdyn int, netrestrict *netutil.Netlist) *dialstate { +func newDialState(self enode.ID, ntab discoverTable, maxdyn int, cfg *Config) *dialstate { s := &dialstate{ maxDynDials: maxdyn, ntab: ntab, - netrestrict: netrestrict, + self: self, + netrestrict: cfg.NetRestrict, + log: cfg.Logger, static: make(map[enode.ID]*dialTask), dialing: make(map[enode.ID]connFlag), - bootnodes: make([]*enode.Node, len(bootnodes)), + bootnodes: make([]*enode.Node, len(cfg.BootstrapNodes)), randomNodes: make([]*enode.Node, maxdyn/2), - hist: new(dialHistory), } - copy(s.bootnodes, bootnodes) - for _, n := range static { + copy(s.bootnodes, cfg.BootstrapNodes) + if s.log == nil { + s.log = log.Root() + } + for _, n := range cfg.StaticNodes { s.addStatic(n) } return s @@ -153,9 +148,6 @@ func (s *dialstate) addStatic(n *enode.Node) { func (s *dialstate) removeStatic(n *enode.Node) { // This removes a task so future attempts to connect will not be made. delete(s.static, n.ID()) - // This removes a previous dial timestamp so that application - // can force a server to reconnect with chosen peer immediately. - s.hist.remove(n.ID()) } func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Time) []task { @@ -166,7 +158,7 @@ func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Ti var newtasks []task addDial := func(flag connFlag, n *enode.Node) bool { if err := s.checkDial(n, peers); err != nil { - log.Trace("Skipping dial candidate", "id", n.ID(), "addr", &net.TCPAddr{IP: n.IP(), Port: n.TCP()}, "err", err) + s.log.Trace("Skipping dial candidate", "id", n.ID(), "addr", &net.TCPAddr{IP: n.IP(), Port: n.TCP()}, "err", err) return false } s.dialing[n.ID()] = flag @@ -195,7 +187,7 @@ func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Ti err := s.checkDial(t.dest, peers) switch err { case errNotWhitelisted, errSelf: - log.Warn("Removing static dial candidate", "id", t.dest.ID, "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}, "err", err) + s.log.Warn("Removing static dial candidate", "id", t.dest.ID, "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}, "err", err) delete(s.static, t.dest.ID()) case nil: s.dialing[id] = t.flags @@ -245,7 +237,7 @@ func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Ti // This should prevent cases where the dialer logic is not ticked // because there are no pending events. if nRunning == 0 && len(newtasks) == 0 && s.hist.Len() > 0 { - t := &waitExpireTask{s.hist.min().exp.Sub(now)} + t := &waitExpireTask{s.hist.nextExpiry().Sub(now)} newtasks = append(newtasks, t) } return newtasks @@ -266,11 +258,11 @@ func (s *dialstate) checkDial(n *enode.Node, peers map[enode.ID]*Peer) error { return errAlreadyDialing case peers[n.ID()] != nil: return errAlreadyConnected - case s.ntab != nil && n.ID() == s.ntab.Self().ID(): + case n.ID() == s.self: return errSelf case s.netrestrict != nil && !s.netrestrict.Contains(n.IP()): return errNotWhitelisted - case s.hist.contains(n.ID()): + case s.hist.contains(string(n.ID().Bytes())): return errRecentlyDialed } return nil @@ -279,7 +271,7 @@ func (s *dialstate) checkDial(n *enode.Node, peers map[enode.ID]*Peer) error { func (s *dialstate) taskDone(t task, now time.Time) { switch t := t.(type) { case *dialTask: - s.hist.add(t.dest.ID(), now.Add(dialHistoryExpiration)) + s.hist.add(string(t.dest.ID().Bytes()), now.Add(dialHistoryExpiration)) delete(s.dialing, t.dest.ID()) case *discoverTask: s.lookupRunning = false @@ -295,7 +287,7 @@ func (t *dialTask) Do(srv *Server) { } err := t.dial(srv, t.dest) if err != nil { - log.Trace("Dial error", "task", t, "err", err) + srv.log.Trace("Dial error", "task", t, "err", err) // Try resolving the ID of static nodes if dialing failed. if _, ok := err.(*dialError); ok && t.flags&staticDialedConn != 0 { if t.resolve(srv) { @@ -313,7 +305,7 @@ func (t *dialTask) Do(srv *Server) { // The backoff delay resets when the node is found. func (t *dialTask) resolve(srv *Server) bool { if srv.ntab == nil { - log.Debug("Can't resolve node", "id", t.dest.ID, "err", "discovery is disabled") + srv.log.Debug("Can't resolve node", "id", t.dest.ID, "err", "discovery is disabled") return false } if t.resolveDelay == 0 { @@ -329,13 +321,13 @@ func (t *dialTask) resolve(srv *Server) bool { if t.resolveDelay > maxResolveDelay { t.resolveDelay = maxResolveDelay } - log.Debug("Resolving node failed", "id", t.dest.ID, "newdelay", t.resolveDelay) + srv.log.Debug("Resolving node failed", "id", t.dest.ID, "newdelay", t.resolveDelay) return false } // The node was found. t.resolveDelay = initialResolveDelay t.dest = resolved - log.Debug("Resolved node", "id", t.dest.ID, "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}) + srv.log.Debug("Resolved node", "id", t.dest.ID, "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}) return true } @@ -349,7 +341,7 @@ func (t *dialTask) dial(srv *Server, dest *enode.Node) error { if err != nil { return &dialError{err} } - mfd := newMeteredConn(fd, false) + mfd := newMeteredConn(fd, false, dest.IP()) return srv.SetupConn(mfd, t.flags, dest) } @@ -384,49 +376,3 @@ func (t waitExpireTask) Do(*Server) { func (t waitExpireTask) String() string { return fmt.Sprintf("wait for dial hist expire (%v)", t.Duration) } - -// Use only these methods to access or modify dialHistory. -func (h dialHistory) min() pastDial { - return h[0] -} -func (h *dialHistory) add(id enode.ID, exp time.Time) { - heap.Push(h, pastDial{id, exp}) - -} -func (h *dialHistory) remove(id enode.ID) bool { - for i, v := range *h { - if v.id == id { - heap.Remove(h, i) - return true - } - } - return false -} -func (h dialHistory) contains(id enode.ID) bool { - for _, v := range h { - if v.id == id { - return true - } - } - return false -} -func (h *dialHistory) expire(now time.Time) { - for h.Len() > 0 && h.min().exp.Before(now) { - heap.Pop(h) - } -} - -// heap.Interface boilerplate -func (h dialHistory) Len() int { return len(h) } -func (h dialHistory) Less(i, j int) bool { return h[i].exp.Before(h[j].exp) } -func (h dialHistory) Swap(i, j int) { h[i], h[j] = h[j], h[i] } -func (h *dialHistory) Push(x interface{}) { - *h = append(*h, x.(pastDial)) -} -func (h *dialHistory) Pop() interface{} { - old := *h - n := len(old) - x := old[n-1] - *h = old[0 : n-1] - return x -} diff --git a/p2p/dial_test.go b/p2p/dial_test.go index 2de2c59995ff..de8fc4a6e3e6 100644 --- a/p2p/dial_test.go +++ b/p2p/dial_test.go @@ -20,10 +20,13 @@ import ( "encoding/binary" "net" "reflect" + "strings" "testing" "time" "github.com/davecgh/go-spew/spew" + "github.com/ethereum/go-ethereum/internal/testlog" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/p2p/netutil" @@ -67,10 +70,10 @@ func runDialTest(t *testing.T, test dialtest) { new := test.init.newTasks(running, pm(round.peers), vtime) if !sametasks(new, round.new) { - t.Errorf("round %d: new tasks mismatch:\ngot %v\nwant %v\nstate: %v\nrunning: %v\n", + t.Errorf("ERROR round %d: got %v\nwant %v\nstate: %v\nrunning: %v", i, spew.Sdump(new), spew.Sdump(round.new), spew.Sdump(test.init), spew.Sdump(running)) } - t.Log("tasks:", spew.Sdump(new)) + t.Logf("round %d new tasks: %s", i, strings.TrimSpace(spew.Sdump(new))) // Time advances by 16 seconds on every round. vtime = vtime.Add(16 * time.Second) @@ -88,8 +91,9 @@ func (t fakeTable) ReadRandomNodes(buf []*enode.Node) int { return copy(buf, t) // This test checks that dynamic dials are launched from discovery results. func TestDialStateDynDial(t *testing.T) { + config := &Config{Logger: testlog.Logger(t, log.LvlTrace)} runDialTest(t, dialtest{ - init: newDialState(nil, nil, fakeTable{}, 5, nil), + init: newDialState(enode.ID{}, fakeTable{}, 5, config), rounds: []round{ // A discovery query is launched. { @@ -153,7 +157,7 @@ func TestDialStateDynDial(t *testing.T) { &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, }, new: []task{ - &waitExpireTask{Duration: 14 * time.Second}, + &waitExpireTask{Duration: 19 * time.Second}, }, }, // In this round, the peer with id 2 drops off. The query @@ -223,10 +227,13 @@ func TestDialStateDynDial(t *testing.T) { // Tests that bootnodes are dialed if no peers are connectd, but not otherwise. func TestDialStateDynDialBootnode(t *testing.T) { - bootnodes := []*enode.Node{ - newNode(uintID(1), nil), - newNode(uintID(2), nil), - newNode(uintID(3), nil), + config := &Config{ + BootstrapNodes: []*enode.Node{ + newNode(uintID(1), nil), + newNode(uintID(2), nil), + newNode(uintID(3), nil), + }, + Logger: testlog.Logger(t, log.LvlTrace), } table := fakeTable{ newNode(uintID(4), nil), @@ -236,7 +243,7 @@ func TestDialStateDynDialBootnode(t *testing.T) { newNode(uintID(8), nil), } runDialTest(t, dialtest{ - init: newDialState(nil, bootnodes, table, 5, nil), + init: newDialState(enode.ID{}, table, 5, config), rounds: []round{ // 2 dynamic dials attempted, bootnodes pending fallback interval { @@ -259,25 +266,24 @@ func TestDialStateDynDialBootnode(t *testing.T) { { new: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, }, }, // No dials succeed, 2nd bootnode is attempted { done: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, }, new: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(2), nil)}, + &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, + &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, }, }, // No dials succeed, 3rd bootnode is attempted { done: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(2), nil)}, + &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, }, new: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(3), nil)}, @@ -288,21 +294,19 @@ func TestDialStateDynDialBootnode(t *testing.T) { done: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(3), nil)}, }, - new: []task{ - &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, - }, + new: []task{}, }, // Random dial succeeds, no more bootnodes are attempted { + new: []task{ + &waitExpireTask{3 * time.Second}, + }, peers: []*Peer{ {rw: &conn{flags: dynDialedConn, node: newNode(uintID(4), nil)}}, }, done: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, }, }, }, @@ -324,7 +328,7 @@ func TestDialStateDynDialFromTable(t *testing.T) { } runDialTest(t, dialtest{ - init: newDialState(nil, nil, table, 10, nil), + init: newDialState(enode.ID{}, table, 10, &Config{Logger: testlog.Logger(t, log.LvlTrace)}), rounds: []round{ // 5 out of 8 of the nodes returned by ReadRandomNodes are dialed. { @@ -430,7 +434,7 @@ func TestDialStateNetRestrict(t *testing.T) { restrict.Add("127.0.2.0/24") runDialTest(t, dialtest{ - init: newDialState(nil, nil, table, 10, restrict), + init: newDialState(enode.ID{}, table, 10, &Config{NetRestrict: restrict}), rounds: []round{ { new: []task{ @@ -444,16 +448,18 @@ func TestDialStateNetRestrict(t *testing.T) { // This test checks that static dials are launched. func TestDialStateStaticDial(t *testing.T) { - wantStatic := []*enode.Node{ - newNode(uintID(1), nil), - newNode(uintID(2), nil), - newNode(uintID(3), nil), - newNode(uintID(4), nil), - newNode(uintID(5), nil), + config := &Config{ + StaticNodes: []*enode.Node{ + newNode(uintID(1), nil), + newNode(uintID(2), nil), + newNode(uintID(3), nil), + newNode(uintID(4), nil), + newNode(uintID(5), nil), + }, + Logger: testlog.Logger(t, log.LvlTrace), } - runDialTest(t, dialtest{ - init: newDialState(wantStatic, nil, fakeTable{}, 0, nil), + init: newDialState(enode.ID{}, fakeTable{}, 0, config), rounds: []round{ // Static dials are launched for the nodes that // aren't yet connected. @@ -495,7 +501,7 @@ func TestDialStateStaticDial(t *testing.T) { &dialTask{flags: staticDialedConn, dest: newNode(uintID(5), nil)}, }, new: []task{ - &waitExpireTask{Duration: 14 * time.Second}, + &waitExpireTask{Duration: 19 * time.Second}, }, }, // Wait a round for dial history to expire, no new tasks should spawn. @@ -511,6 +517,9 @@ func TestDialStateStaticDial(t *testing.T) { // If a static node is dropped, it should be immediately redialed, // irrespective whether it was originally static or dynamic. { + done: []task{ + &waitExpireTask{Duration: 19 * time.Second}, + }, peers: []*Peer{ {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, {rw: &conn{flags: staticDialedConn, node: newNode(uintID(3), nil)}}, @@ -518,67 +527,24 @@ func TestDialStateStaticDial(t *testing.T) { }, new: []task{ &dialTask{flags: staticDialedConn, dest: newNode(uintID(2), nil)}, - &dialTask{flags: staticDialedConn, dest: newNode(uintID(4), nil)}, }, }, }, }) } -// This test checks that static peers will be redialed immediately if they were re-added to a static list. -func TestDialStaticAfterReset(t *testing.T) { - wantStatic := []*enode.Node{ - newNode(uintID(1), nil), - newNode(uintID(2), nil), - } - - rounds := []round{ - // Static dials are launched for the nodes that aren't yet connected. - { - peers: nil, - new: []task{ - &dialTask{flags: staticDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: staticDialedConn, dest: newNode(uintID(2), nil)}, - }, - }, - // No new dial tasks, all peers are connected. - { - peers: []*Peer{ - {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, - }, - done: []task{ - &dialTask{flags: staticDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: staticDialedConn, dest: newNode(uintID(2), nil)}, - }, - new: []task{ - &waitExpireTask{Duration: 30 * time.Second}, - }, - }, - } - dTest := dialtest{ - init: newDialState(wantStatic, nil, fakeTable{}, 0, nil), - rounds: rounds, - } - runDialTest(t, dTest) - for _, n := range wantStatic { - dTest.init.removeStatic(n) - dTest.init.addStatic(n) - } - // without removing peers they will be considered recently dialed - runDialTest(t, dTest) -} - // This test checks that past dials are not retried for some time. func TestDialStateCache(t *testing.T) { - wantStatic := []*enode.Node{ - newNode(uintID(1), nil), - newNode(uintID(2), nil), - newNode(uintID(3), nil), + config := &Config{ + StaticNodes: []*enode.Node{ + newNode(uintID(1), nil), + newNode(uintID(2), nil), + newNode(uintID(3), nil), + }, + Logger: testlog.Logger(t, log.LvlTrace), } - runDialTest(t, dialtest{ - init: newDialState(wantStatic, nil, fakeTable{}, 0, nil), + init: newDialState(enode.ID{}, fakeTable{}, 0, config), rounds: []round{ // Static dials are launched for the nodes that // aren't yet connected. @@ -606,28 +572,37 @@ func TestDialStateCache(t *testing.T) { // entry to expire. { peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, }, done: []task{ &dialTask{flags: staticDialedConn, dest: newNode(uintID(3), nil)}, }, new: []task{ - &waitExpireTask{Duration: 14 * time.Second}, + &waitExpireTask{Duration: 19 * time.Second}, }, }, // Still waiting for node 3's entry to expire in the cache. { peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, + }, + }, + { + peers: []*Peer{ + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, }, }, // The cache entry for node 3 has expired and is retried. { + done: []task{ + &waitExpireTask{Duration: 19 * time.Second}, + }, peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, }, new: []task{ &dialTask{flags: staticDialedConn, dest: newNode(uintID(3), nil)}, @@ -638,9 +613,13 @@ func TestDialStateCache(t *testing.T) { } func TestDialResolve(t *testing.T) { + config := &Config{ + Logger: testlog.Logger(t, log.LvlTrace), + Dialer: TCPDialer{&net.Dialer{Deadline: time.Now().Add(-5 * time.Minute)}}, + } resolved := newNode(uintID(1), net.IP{127, 0, 55, 234}) table := &resolveMock{answer: resolved} - state := newDialState(nil, nil, table, 0, nil) + state := newDialState(enode.ID{}, table, 0, config) // Check that the task is generated with an incomplete ID. dest := newNode(uintID(1), nil) @@ -651,8 +630,7 @@ func TestDialResolve(t *testing.T) { } // Now run the task, it should resolve the ID once. - config := Config{Dialer: TCPDialer{&net.Dialer{Deadline: time.Now().Add(-5 * time.Minute)}}} - srv := &Server{ntab: table, Config: config} + srv := &Server{ntab: table, log: config.Logger, Config: *config} tasks[0].Do(srv) if !reflect.DeepEqual(table.resolveCalls, []*enode.Node{dest}) { t.Fatalf("wrong resolve calls, got %v", table.resolveCalls) diff --git a/p2p/discover/common.go b/p2p/discover/common.go new file mode 100644 index 000000000000..3c080359fdf8 --- /dev/null +++ b/p2p/discover/common.go @@ -0,0 +1,57 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package discover + +import ( + "crypto/ecdsa" + "net" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/netutil" +) + +type UDPConn interface { + ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) + WriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error) + Close() error + LocalAddr() net.Addr +} + +// Config holds Table-related settings. +type Config struct { + // These settings are required and configure the UDP listener: + PrivateKey *ecdsa.PrivateKey + + // These settings are optional: + NetRestrict *netutil.Netlist // network whitelist + Bootnodes []*enode.Node // list of bootstrap nodes + Unhandled chan<- ReadPacket // unhandled packets are sent on this channel + Log log.Logger // if set, log messages go here +} + +// ListenUDP starts listening for discovery packets on the given UDP socket. +func ListenUDP(c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { + return ListenV4(c, ln, cfg) +} + +// ReadPacket is a packet that couldn't be handled. Those packets are sent to the unhandled +// channel if configured. +type ReadPacket struct { + Data []byte + Addr *net.UDPAddr +} diff --git a/p2p/discover/node.go b/p2p/discover/node.go index 7ddf04fe8be2..a7d9ce7368c0 100644 --- a/p2p/discover/node.go +++ b/p2p/discover/node.go @@ -25,7 +25,6 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/p2p/enode" ) @@ -33,7 +32,8 @@ import ( // The fields of Node may not be modified. type node struct { enode.Node - addedAt time.Time // time when the node was added to the table + addedAt time.Time // time when the node was added to the table + livenessChecks uint // how often liveness was checked } type encPubkey [64]byte @@ -63,7 +63,7 @@ func (e encPubkey) id() enode.ID { // recoverNodeKey computes the public key used to sign the // given hash from the signature. func recoverNodeKey(hash, sig []byte) (key encPubkey, err error) { - pubkey, err := secp256k1.RecoverPubkey(hash, sig) + pubkey, err := crypto.Ecrecover(hash, sig) if err != nil { return key, err } diff --git a/p2p/discover/table.go b/p2p/discover/table.go index 7a3e41de1872..e5a5793e358f 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -23,7 +23,6 @@ package discover import ( - "crypto/ecdsa" crand "crypto/rand" "encoding/binary" "fmt" @@ -34,7 +33,6 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/netutil" @@ -55,15 +53,17 @@ const ( bucketIPLimit, bucketSubnet = 2, 24 // at most 2 addresses from the same /24 tableIPLimit, tableSubnet = 10, 24 - maxFindnodeFailures = 5 // Nodes exceeding this limit are dropped - refreshInterval = 30 * time.Minute - revalidateInterval = 10 * time.Second - copyNodesInterval = 30 * time.Second - seedMinTableTime = 5 * time.Minute - seedCount = 30 - seedMaxAge = 5 * 24 * time.Hour + refreshInterval = 30 * time.Minute + revalidateInterval = 10 * time.Second + copyNodesInterval = 30 * time.Second + seedMinTableTime = 5 * time.Minute + seedCount = 30 + seedMaxAge = 5 * 24 * time.Hour ) +// Table is the 'node table', a Kademlia-like index of neighbor nodes. The table keeps +// itself up-to-date by verifying the liveness of neighbors and requesting their node +// records when announcements of a new record version are received. type Table struct { mutex sync.Mutex // protects buckets, bucket content, nursery, rand buckets [nBuckets]*bucket // index of known nodes by distance @@ -71,25 +71,24 @@ type Table struct { rand *mrand.Rand // source of randomness, periodically reseeded ips netutil.DistinctNetSet + log log.Logger db *enode.DB // database of known nodes + net transport refreshReq chan chan struct{} initDone chan struct{} closeReq chan struct{} closed chan struct{} nodeAddedHook func(*node) // for testing - - net transport - self *node // metadata of the local node } -// transport is implemented by the UDP transport. -// it is an interface so we can test without opening lots of UDP -// sockets and without generating a private key. +// transport is implemented by the UDP transports. type transport interface { - ping(enode.ID, *net.UDPAddr) error - findnode(toid enode.ID, addr *net.UDPAddr, target encPubkey) ([]*node, error) - close() + Self() *enode.Node + RequestENR(*enode.Node) (*enode.Node, error) + lookupRandom() []*enode.Node + lookupSelf() []*enode.Node + ping(*enode.Node) (seq uint64, err error) } // bucket contains nodes, ordered by their last activity. the entry @@ -100,17 +99,17 @@ type bucket struct { ips netutil.DistinctNetSet } -func newTable(t transport, self *enode.Node, db *enode.DB, bootnodes []*enode.Node) (*Table, error) { +func newTable(t transport, db *enode.DB, bootnodes []*enode.Node, log log.Logger) (*Table, error) { tab := &Table{ net: t, db: db, - self: wrapNode(self), refreshReq: make(chan chan struct{}), initDone: make(chan struct{}), closeReq: make(chan struct{}), closed: make(chan struct{}), rand: mrand.New(mrand.NewSource(0)), ips: netutil.DistinctNetSet{Subnet: tableSubnet, Limit: tableIPLimit}, + log: log, } if err := tab.setFallbackNodes(bootnodes); err != nil { return nil, err @@ -123,10 +122,13 @@ func newTable(t transport, self *enode.Node, db *enode.DB, bootnodes []*enode.No tab.seedRand() tab.loadSeedNodes() - go tab.loop() return tab, nil } +func (tab *Table) self() *enode.Node { + return tab.net.Self() +} + func (tab *Table) seedRand() { var b [8]byte crand.Read(b[:]) @@ -136,11 +138,6 @@ func (tab *Table) seedRand() { tab.mutex.Unlock() } -// Self returns the local node. -func (tab *Table) Self() *enode.Node { - return unwrapNode(tab.self) -} - // ReadRandomNodes fills the given slice with random nodes from the table. The results // are guaranteed to be unique for a single invocation, no node will appear twice. func (tab *Table) ReadRandomNodes(buf []*enode.Node) (n int) { @@ -150,45 +147,38 @@ func (tab *Table) ReadRandomNodes(buf []*enode.Node) (n int) { tab.mutex.Lock() defer tab.mutex.Unlock() - // Find all non-empty buckets and get a fresh slice of their entries. - var buckets [][]*node + var nodes []*enode.Node for _, b := range &tab.buckets { - if len(b.entries) > 0 { - buckets = append(buckets, b.entries) + for _, n := range b.entries { + nodes = append(nodes, unwrapNode(n)) } } - if len(buckets) == 0 { - return 0 + // Shuffle. + for i := 0; i < len(nodes); i++ { + j := tab.rand.Intn(len(nodes)) + nodes[i], nodes[j] = nodes[j], nodes[i] } - // Shuffle the buckets. - for i := len(buckets) - 1; i > 0; i-- { - j := tab.rand.Intn(len(buckets)) - buckets[i], buckets[j] = buckets[j], buckets[i] - } - // Move head of each bucket into buf, removing buckets that become empty. - var i, j int - for ; i < len(buf); i, j = i+1, (j+1)%len(buckets) { - b := buckets[j] - buf[i] = unwrapNode(b[0]) - buckets[j] = b[1:] - if len(b) == 1 { - buckets = append(buckets[:j], buckets[j+1:]...) - } - if len(buckets) == 0 { - break + return copy(buf, nodes) +} + +// getNode returns the node with the given ID or nil if it isn't in the table. +func (tab *Table) getNode(id enode.ID) *enode.Node { + tab.mutex.Lock() + defer tab.mutex.Unlock() + + b := tab.bucket(id) + for _, e := range b.entries { + if e.ID() == id { + return unwrapNode(e) } } - return i + 1 + return nil } -// Close terminates the network listener and flushes the node database. -func (tab *Table) Close() { - select { - case <-tab.closed: - // already closed. - case tab.closeReq <- struct{}{}: - <-tab.closed // wait for refreshLoop to end. - } +// close terminates the network listener and flushes the node database. +func (tab *Table) close() { + close(tab.closeReq) + <-tab.closed } // setFallbackNodes sets the initial points of contact. These nodes @@ -214,134 +204,24 @@ func (tab *Table) isInitDone() bool { } } -// Resolve searches for a specific node with the given ID. -// It returns nil if the node could not be found. -func (tab *Table) Resolve(n *enode.Node) *enode.Node { - // If the node is present in the local table, no - // network interaction is required. - hash := n.ID() - tab.mutex.Lock() - cl := tab.closest(hash, 1) - tab.mutex.Unlock() - if len(cl.entries) > 0 && cl.entries[0].ID() == hash { - return unwrapNode(cl.entries[0]) - } - // Otherwise, do a network lookup. - result := tab.lookup(encodePubkey(n.Pubkey()), true) - for _, n := range result { - if n.ID() == hash { - return unwrapNode(n) - } - } - return nil -} - -// LookupRandom finds random nodes in the network. -func (tab *Table) LookupRandom() []*enode.Node { - var target encPubkey - crand.Read(target[:]) - return unwrapNodes(tab.lookup(target, true)) -} - -// lookup performs a network search for nodes close to the given target. It approaches the -// target by querying nodes that are closer to it on each iteration. The given target does -// not need to be an actual node identifier. -func (tab *Table) lookup(targetKey encPubkey, refreshIfEmpty bool) []*node { - var ( - target = enode.ID(crypto.Keccak256Hash(targetKey[:])) - asked = make(map[enode.ID]bool) - seen = make(map[enode.ID]bool) - reply = make(chan []*node, alpha) - pendingQueries = 0 - result *nodesByDistance - ) - // don't query further if we hit ourself. - // unlikely to happen often in practice. - asked[tab.self.ID()] = true - - for { - tab.mutex.Lock() - // generate initial result set - result = tab.closest(target, bucketSize) - tab.mutex.Unlock() - if len(result.entries) > 0 || !refreshIfEmpty { - break - } - // The result set is empty, all nodes were dropped, refresh. - // We actually wait for the refresh to complete here. The very - // first query will hit this case and run the bootstrapping - // logic. - <-tab.refresh() - refreshIfEmpty = false - } - - for { - // ask the alpha closest nodes that we haven't asked yet - for i := 0; i < len(result.entries) && pendingQueries < alpha; i++ { - n := result.entries[i] - if !asked[n.ID()] { - asked[n.ID()] = true - pendingQueries++ - go tab.findnode(n, targetKey, reply) - } - } - if pendingQueries == 0 { - // we have asked all closest nodes, stop the search - break - } - // wait for the next reply - for _, n := range <-reply { - if n != nil && !seen[n.ID()] { - seen[n.ID()] = true - result.push(n, bucketSize) - } - } - pendingQueries-- - } - return result.entries -} - -func (tab *Table) findnode(n *node, targetKey encPubkey, reply chan<- []*node) { - fails := tab.db.FindFails(n.ID()) - r, err := tab.net.findnode(n.ID(), n.addr(), targetKey) - if err != nil || len(r) == 0 { - fails++ - tab.db.UpdateFindFails(n.ID(), fails) - log.Trace("Findnode failed", "id", n.ID(), "failcount", fails, "err", err) - if fails >= maxFindnodeFailures { - log.Trace("Too many findnode failures, dropping", "id", n.ID(), "failcount", fails) - tab.delete(n) - } - } else if fails > 0 { - tab.db.UpdateFindFails(n.ID(), fails-1) - } - - // Grab as many nodes as possible. Some of them might not be alive anymore, but we'll - // just remove those again during revalidation. - for _, n := range r { - tab.add(n) - } - reply <- r -} - func (tab *Table) refresh() <-chan struct{} { done := make(chan struct{}) select { case tab.refreshReq <- done: - case <-tab.closed: + case <-tab.closeReq: close(done) } return done } -// loop schedules refresh, revalidate runs and coordinates shutdown. +// loop schedules runs of doRefresh, doRevalidate and copyLiveNodes. func (tab *Table) loop() { var ( revalidate = time.NewTimer(tab.nextRevalidateTime()) refresh = time.NewTicker(refreshInterval) copyNodes = time.NewTicker(copyNodesInterval) - revalidateDone = make(chan struct{}) refreshDone = make(chan struct{}) // where doRefresh reports completion + revalidateDone chan struct{} // where doRevalidate reports completion waiting = []chan struct{}{tab.initDone} // holds waiting callers while doRefresh runs ) defer refresh.Stop() @@ -372,9 +252,11 @@ loop: } waiting, refreshDone = nil, nil case <-revalidate.C: + revalidateDone = make(chan struct{}) go tab.doRevalidate(revalidateDone) case <-revalidateDone: revalidate.Reset(tab.nextRevalidateTime()) + revalidateDone = nil case <-copyNodes.C: go tab.copyLiveNodes() case <-tab.closeReq: @@ -382,21 +264,20 @@ loop: } } - if tab.net != nil { - tab.net.close() - } if refreshDone != nil { <-refreshDone } for _, ch := range waiting { close(ch) } + if revalidateDone != nil { + <-revalidateDone + } close(tab.closed) } -// doRefresh performs a lookup for a random target to keep buckets -// full. seed nodes are inserted if the table is empty (initial -// bootstrap or discarded faulty peers). +// doRefresh performs a lookup for a random target to keep buckets full. seed nodes are +// inserted if the table is empty (initial bootstrap or discarded faulty peers). func (tab *Table) doRefresh(done chan struct{}) { defer close(done) @@ -406,11 +287,7 @@ func (tab *Table) doRefresh(done chan struct{}) { tab.loadSeedNodes() // Run self lookup to discover new neighbor nodes. - // We can only do this if we have a secp256k1 identity. - var key ecdsa.PublicKey - if err := tab.self.Load((*enode.Secp256k1)(&key)); err == nil { - tab.lookup(encodePubkey(&key), false) - } + tab.net.lookupSelf() // The Kademlia paper specifies that the bucket refresh should // perform a lookup in the least recently used bucket. We cannot @@ -419,9 +296,7 @@ func (tab *Table) doRefresh(done chan struct{}) { // sha3 preimage that falls into a chosen bucket. // We perform a few lookups with a random target instead. for i := 0; i < 3; i++ { - var target encPubkey - crand.Read(target[:]) - tab.lookup(target, false) + tab.net.lookupRandom() } } @@ -430,14 +305,14 @@ func (tab *Table) loadSeedNodes() { seeds = append(seeds, tab.nursery...) for i := range seeds { seed := seeds[i] - age := log.Lazy{Fn: func() interface{} { return time.Since(tab.db.LastPongReceived(seed.ID())) }} - log.Debug("Found seed node in database", "id", seed.ID(), "addr", seed.addr(), "age", age) - tab.add(seed) + age := log.Lazy{Fn: func() interface{} { return time.Since(tab.db.LastPongReceived(seed.ID(), seed.IP())) }} + tab.log.Trace("Found seed node in database", "id", seed.ID(), "addr", seed.addr(), "age", age) + tab.addSeenNode(seed) } } -// doRevalidate checks that the last node in a random bucket is still live -// and replaces or deletes the node if it isn't. +// doRevalidate checks that the last node in a random bucket is still live and replaces or +// deletes the node if it isn't. func (tab *Table) doRevalidate(done chan<- struct{}) { defer func() { done <- struct{}{} }() @@ -448,23 +323,34 @@ func (tab *Table) doRevalidate(done chan<- struct{}) { } // Ping the selected node and wait for a pong. - err := tab.net.ping(last.ID(), last.addr()) + remoteSeq, err := tab.net.ping(unwrapNode(last)) + + // Also fetch record if the node replied and returned a higher sequence number. + if last.Seq() < remoteSeq { + n, err := tab.net.RequestENR(unwrapNode(last)) + if err != nil { + tab.log.Debug("ENR request failed", "id", last.ID(), "addr", last.addr(), "err", err) + } else { + last = &node{Node: *n, addedAt: last.addedAt, livenessChecks: last.livenessChecks} + } + } tab.mutex.Lock() defer tab.mutex.Unlock() b := tab.buckets[bi] if err == nil { // The node responded, move it to the front. - log.Debug("Revalidated node", "b", bi, "id", last.ID()) - b.bump(last) + last.livenessChecks++ + tab.log.Debug("Revalidated node", "b", bi, "id", last.ID(), "checks", last.livenessChecks) + tab.bumpInBucket(b, last) return } // No reply received, pick a replacement or delete the node if there aren't // any replacements. if r := tab.replace(b, last); r != nil { - log.Debug("Replaced dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "r", r.ID(), "rip", r.IP()) + tab.log.Debug("Replaced dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "checks", last.livenessChecks, "r", r.ID(), "rip", r.IP()) } else { - log.Debug("Removed dead node", "b", bi, "id", last.ID(), "ip", last.IP()) + tab.log.Debug("Removed dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "checks", last.livenessChecks) } } @@ -499,7 +385,7 @@ func (tab *Table) copyLiveNodes() { now := time.Now() for _, b := range &tab.buckets { for _, n := range b.entries { - if now.Sub(n.addedAt) >= seedMinTableTime { + if n.livenessChecks > 0 && now.Sub(n.addedAt) >= seedMinTableTime { tab.db.UpdateNode(unwrapNode(n)) } } @@ -508,20 +394,27 @@ func (tab *Table) copyLiveNodes() { // closest returns the n nodes in the table that are closest to the // given id. The caller must hold tab.mutex. -func (tab *Table) closest(target enode.ID, nresults int) *nodesByDistance { +func (tab *Table) closest(target enode.ID, nresults int, checklive bool) *nodesByDistance { // This is a very wasteful way to find the closest nodes but // obviously correct. I believe that tree-based buckets would make // this easier to implement efficiently. close := &nodesByDistance{target: target} for _, b := range &tab.buckets { for _, n := range b.entries { + if checklive && n.livenessChecks == 0 { + continue + } close.push(n, nresults) } } return close } +// len returns the number of nodes in the table. func (tab *Table) len() (n int) { + tab.mutex.Lock() + defer tab.mutex.Unlock() + for _, b := range &tab.buckets { n += len(b.entries) } @@ -530,59 +423,87 @@ func (tab *Table) len() (n int) { // bucket returns the bucket for the given node ID hash. func (tab *Table) bucket(id enode.ID) *bucket { - d := enode.LogDist(tab.self.ID(), id) + d := enode.LogDist(tab.self().ID(), id) if d <= bucketMinDistance { return tab.buckets[0] } return tab.buckets[d-bucketMinDistance-1] } -// add attempts to add the given node to its corresponding bucket. If the bucket has space -// available, adding the node succeeds immediately. Otherwise, the node is added if the -// least recently active node in the bucket does not respond to a ping packet. +// addSeenNode adds a node which may or may not be live to the end of a bucket. If the +// bucket has space available, adding the node succeeds immediately. Otherwise, the node is +// added to the replacements list. // // The caller must not hold tab.mutex. -func (tab *Table) add(n *node) { - if n.ID() == tab.self.ID() { +func (tab *Table) addSeenNode(n *node) { + if n.ID() == tab.self().ID() { return } tab.mutex.Lock() defer tab.mutex.Unlock() b := tab.bucket(n.ID()) - if !tab.bumpOrAdd(b, n) { - // Node is not in table. Add it to the replacement list. + if contains(b.entries, n.ID()) { + // Already in bucket, don't add. + return + } + if len(b.entries) >= bucketSize { + // Bucket full, maybe add as replacement. tab.addReplacement(b, n) + return + } + if !tab.addIP(b, n.IP()) { + // Can't add: IP limit reached. + return + } + // Add to end of bucket: + b.entries = append(b.entries, n) + b.replacements = deleteNode(b.replacements, n) + n.addedAt = time.Now() + if tab.nodeAddedHook != nil { + tab.nodeAddedHook(n) } } -// addThroughPing adds the given node to the table. Compared to plain -// 'add' there is an additional safety measure: if the table is still -// initializing the node is not added. This prevents an attack where the -// table could be filled by just sending ping repeatedly. +// addVerifiedNode adds a node whose existence has been verified recently to the front of a +// bucket. If the node is already in the bucket, it is moved to the front. If the bucket +// has no space, the node is added to the replacements list. +// +// There is an additional safety measure: if the table is still initializing the node +// is not added. This prevents an attack where the table could be filled by just sending +// ping repeatedly. // // The caller must not hold tab.mutex. -func (tab *Table) addThroughPing(n *node) { +func (tab *Table) addVerifiedNode(n *node) { if !tab.isInitDone() { return } - tab.add(n) -} + if n.ID() == tab.self().ID() { + return + } -// stuff adds nodes the table to the end of their corresponding bucket -// if the bucket is not full. The caller must not hold tab.mutex. -func (tab *Table) stuff(nodes []*node) { tab.mutex.Lock() defer tab.mutex.Unlock() - - for _, n := range nodes { - if n.ID() == tab.self.ID() { - continue // don't add self - } - b := tab.bucket(n.ID()) - if len(b.entries) < bucketSize { - tab.bumpOrAdd(b, n) - } + b := tab.bucket(n.ID()) + if tab.bumpInBucket(b, n) { + // Already in bucket, moved to front. + return + } + if len(b.entries) >= bucketSize { + // Bucket full, maybe add as replacement. + tab.addReplacement(b, n) + return + } + if !tab.addIP(b, n.IP()) { + // Can't add: IP limit reached. + return + } + // Add to front of bucket. + b.entries, _ = pushNode(b.entries, n, bucketSize) + b.replacements = deleteNode(b.replacements, n) + n.addedAt = time.Now() + if tab.nodeAddedHook != nil { + tab.nodeAddedHook(n) } } @@ -599,11 +520,11 @@ func (tab *Table) addIP(b *bucket, ip net.IP) bool { return true } if !tab.ips.Add(ip) { - log.Debug("IP exceeds table limit", "ip", ip) + tab.log.Debug("IP exceeds table limit", "ip", ip) return false } if !b.ips.Add(ip) { - log.Debug("IP exceeds bucket limit", "ip", ip) + tab.log.Debug("IP exceeds bucket limit", "ip", ip) tab.ips.Remove(ip) return false } @@ -654,12 +575,21 @@ func (tab *Table) replace(b *bucket, last *node) *node { return r } -// bump moves the given node to the front of the bucket entry list +// bumpInBucket moves the given node to the front of the bucket entry list // if it is contained in that list. -func (b *bucket) bump(n *node) bool { +func (tab *Table) bumpInBucket(b *bucket, n *node) bool { for i := range b.entries { if b.entries[i].ID() == n.ID() { - // move it to the front + if !n.IP().Equal(b.entries[i].IP()) { + // Endpoint has changed, ensure that the new IP fits into table limits. + tab.removeIP(b, b.entries[i].IP()) + if !tab.addIP(b, n.IP()) { + // It doesn't, put the previous one back. + tab.addIP(b, b.entries[i].IP()) + return false + } + } + // Move it to the front. copy(b.entries[1:], b.entries[:i]) b.entries[0] = n return true @@ -668,29 +598,20 @@ func (b *bucket) bump(n *node) bool { return false } -// bumpOrAdd moves n to the front of the bucket entry list or adds it if the list isn't -// full. The return value is true if n is in the bucket. -func (tab *Table) bumpOrAdd(b *bucket, n *node) bool { - if b.bump(n) { - return true - } - if len(b.entries) >= bucketSize || !tab.addIP(b, n.IP()) { - return false - } - b.entries, _ = pushNode(b.entries, n, bucketSize) - b.replacements = deleteNode(b.replacements, n) - n.addedAt = time.Now() - if tab.nodeAddedHook != nil { - tab.nodeAddedHook(n) - } - return true -} - func (tab *Table) deleteInBucket(b *bucket, n *node) { b.entries = deleteNode(b.entries, n) tab.removeIP(b, n.IP()) } +func contains(ns []*node, id enode.ID) bool { + for _, n := range ns { + if n.ID() == id { + return true + } + } + return false +} + // pushNode adds n to the front of list, keeping at most max items. func pushNode(list []*node, n *node, max int) ([]*node, *node) { if len(list) < max { @@ -712,8 +633,7 @@ func deleteNode(list []*node, n *node) []*node { return list } -// nodesByDistance is a list of nodes, ordered by -// distance to target. +// nodesByDistance is a list of nodes, ordered by distance to target. type nodesByDistance struct { entries []*node target enode.ID diff --git a/p2p/discover/table_test.go b/p2p/discover/table_test.go index e8631024b6ca..895c284b270b 100644 --- a/p2p/discover/table_test.go +++ b/p2p/discover/table_test.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/netutil" ) func TestTable_pingReplace(t *testing.T) { @@ -50,8 +51,8 @@ func TestTable_pingReplace(t *testing.T) { func testPingReplace(t *testing.T, newNodeIsResponding, lastInBucketIsResponding bool) { transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() + defer tab.close() <-tab.initDone @@ -64,7 +65,7 @@ func testPingReplace(t *testing.T, newNodeIsResponding, lastInBucketIsResponding // its bucket if it is unresponsive. Revalidate again to ensure that transport.dead[last.ID()] = !lastInBucketIsResponding transport.dead[pingSender.ID()] = !newNodeIsResponding - tab.add(pingSender) + tab.addSeenNode(pingSender) tab.doRevalidate(make(chan struct{}, 1)) tab.doRevalidate(make(chan struct{}, 1)) @@ -114,10 +115,14 @@ func TestBucket_bumpNoDuplicates(t *testing.T) { } prop := func(nodes []*node, bumps []int) (ok bool) { + tab, db := newTestTable(newPingRecorder()) + defer db.Close() + defer tab.close() + b := &bucket{entries: make([]*node, len(nodes))} copy(b.entries, nodes) for i, pos := range bumps { - b.bump(b.entries[pos]) + tab.bumpInBucket(b, b.entries[pos]) if hasDuplicates(b.entries) { t.Logf("bucket has duplicates after %d/%d bumps:", i+1, len(bumps)) for _, n := range b.entries { @@ -126,6 +131,7 @@ func TestBucket_bumpNoDuplicates(t *testing.T) { return false } } + checkIPLimitInvariant(t, tab) return true } if err := quick.Check(prop, cfg); err != nil { @@ -137,33 +143,51 @@ func TestBucket_bumpNoDuplicates(t *testing.T) { func TestTable_IPLimit(t *testing.T) { transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() + defer tab.close() for i := 0; i < tableIPLimit+1; i++ { - n := nodeAtDistance(tab.self.ID(), i, net.IP{172, 0, 1, byte(i)}) - tab.add(n) + n := nodeAtDistance(tab.self().ID(), i, net.IP{172, 0, 1, byte(i)}) + tab.addSeenNode(n) } if tab.len() > tableIPLimit { t.Errorf("too many nodes in table") } + checkIPLimitInvariant(t, tab) } // This checks that the per-bucket IP limit is applied correctly. func TestTable_BucketIPLimit(t *testing.T) { transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() + defer tab.close() d := 3 for i := 0; i < bucketIPLimit+1; i++ { - n := nodeAtDistance(tab.self.ID(), d, net.IP{172, 0, 1, byte(i)}) - tab.add(n) + n := nodeAtDistance(tab.self().ID(), d, net.IP{172, 0, 1, byte(i)}) + tab.addSeenNode(n) } if tab.len() > bucketIPLimit { t.Errorf("too many nodes in table") } + checkIPLimitInvariant(t, tab) +} + +// checkIPLimitInvariant checks that ip limit sets contain an entry for every +// node in the table and no extra entries. +func checkIPLimitInvariant(t *testing.T, tab *Table) { + t.Helper() + + tabset := netutil.DistinctNetSet{Subnet: tableSubnet, Limit: tableIPLimit} + for _, b := range tab.buckets { + for _, n := range b.entries { + tabset.Add(n.IP()) + } + } + if tabset.String() != tab.ips.String() { + t.Errorf("table IP set is incorrect:\nhave: %v\nwant: %v", tab.ips, tabset) + } } func TestTable_closest(t *testing.T) { @@ -173,12 +197,12 @@ func TestTable_closest(t *testing.T) { // for any node table, Target and N transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() - tab.stuff(test.All) + defer tab.close() + fillTable(tab, test.All) // check that closest(Target, N) returns nodes - result := tab.closest(test.Target, test.N).entries + result := tab.closest(test.Target, test.N, false).entries if hasDuplicates(result) { t.Errorf("result contains duplicates") return false @@ -234,13 +258,13 @@ func TestTable_ReadRandomNodesGetAll(t *testing.T) { test := func(buf []*enode.Node) bool { transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() + defer tab.close() <-tab.initDone for i := 0; i < len(buf); i++ { ld := cfg.Rand.Intn(len(tab.buckets)) - tab.stuff([]*node{nodeAtDistance(tab.self.ID(), ld, intIP(ld))}) + fillTable(tab, []*node{nodeAtDistance(tab.self().ID(), ld, intIP(ld))}) } gotN := tab.ReadRandomNodes(buf) if gotN != tab.len() { @@ -272,296 +296,104 @@ func (*closeTest) Generate(rand *rand.Rand, size int) reflect.Value { N: rand.Intn(bucketSize), } for _, id := range gen([]enode.ID{}, rand).([]enode.ID) { - n := enode.SignNull(new(enr.Record), id) - t.All = append(t.All, wrapNode(n)) + r := new(enr.Record) + r.Set(enr.IP(genIP(rand))) + n := wrapNode(enode.SignNull(r, id)) + n.livenessChecks = 1 + t.All = append(t.All, n) } return reflect.ValueOf(t) } -func TestTable_Lookup(t *testing.T) { - tab, db := newTestTable(lookupTestnet) - defer tab.Close() +func TestTable_addVerifiedNode(t *testing.T) { + tab, db := newTestTable(newPingRecorder()) + <-tab.initDone defer db.Close() + defer tab.close() - // lookup on empty table returns no nodes - if results := tab.lookup(lookupTestnet.target, false); len(results) > 0 { - t.Fatalf("lookup on empty table returned %d results: %#v", len(results), results) - } - // seed table with initial node (otherwise lookup will terminate immediately) - seedKey, _ := decodePubkey(lookupTestnet.dists[256][0]) - seed := wrapNode(enode.NewV4(seedKey, net.IP{}, 0, 256)) - tab.stuff([]*node{seed}) - - results := tab.lookup(lookupTestnet.target, true) - t.Logf("results:") - for _, e := range results { - t.Logf(" ld=%d, %x", enode.LogDist(lookupTestnet.targetSha, e.ID()), e.ID().Bytes()) - } - if len(results) != bucketSize { - t.Errorf("wrong number of results: got %d, want %d", len(results), bucketSize) - } - if hasDuplicates(results) { - t.Errorf("result set contains duplicate entries") + // Insert two nodes. + n1 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 1}) + n2 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 2}) + tab.addSeenNode(n1) + tab.addSeenNode(n2) + + // Verify bucket content: + bcontent := []*node{n1, n2} + if !reflect.DeepEqual(tab.bucket(n1.ID()).entries, bcontent) { + t.Fatalf("wrong bucket content: %v", tab.bucket(n1.ID()).entries) } - if !sortedByDistanceTo(lookupTestnet.targetSha, results) { - t.Errorf("result set not sorted by distance to target") + + // Add a changed version of n2. + newrec := n2.Record() + newrec.Set(enr.IP{99, 99, 99, 99}) + newn2 := wrapNode(enode.SignNull(newrec, n2.ID())) + tab.addVerifiedNode(newn2) + + // Check that bucket is updated correctly. + newBcontent := []*node{newn2, n1} + if !reflect.DeepEqual(tab.bucket(n1.ID()).entries, newBcontent) { + t.Fatalf("wrong bucket content after update: %v", tab.bucket(n1.ID()).entries) } - // TODO: check result nodes are actually closest + checkIPLimitInvariant(t, tab) } -// This is the test network for the Lookup test. -// The nodes were obtained by running testnet.mine with a random NodeID as target. -var lookupTestnet = &preminedTestnet{ - target: hexEncPubkey("166aea4f556532c6d34e8b740e5d314af7e9ac0ca79833bd751d6b665f12dfd38ec563c363b32f02aef4a80b44fd3def94612d497b99cb5f17fd24de454927ec"), - targetSha: enode.HexID("5c944ee51c5ae9f72a95eccb8aed0374eecb5119d720cbea6813e8e0d6ad9261"), - dists: [257][]encPubkey{ - 240: { - hexEncPubkey("2001ad5e3e80c71b952161bc0186731cf5ffe942d24a79230a0555802296238e57ea7a32f5b6f18564eadc1c65389448481f8c9338df0a3dbd18f708cbc2cbcb"), - hexEncPubkey("6ba3f4f57d084b6bf94cc4555b8c657e4a8ac7b7baf23c6874efc21dd1e4f56b7eb2721e07f5242d2f1d8381fc8cae535e860197c69236798ba1ad231b105794"), - }, - 244: { - hexEncPubkey("696ba1f0a9d55c59246f776600542a9e6432490f0cd78f8bb55a196918df2081a9b521c3c3ba48e465a75c10768807717f8f689b0b4adce00e1c75737552a178"), - }, - 246: { - hexEncPubkey("d6d32178bdc38416f46ffb8b3ec9e4cb2cfff8d04dd7e4311a70e403cb62b10be1b447311b60b4f9ee221a8131fc2cbd45b96dd80deba68a949d467241facfa8"), - hexEncPubkey("3ea3d04a43a3dfb5ac11cffc2319248cf41b6279659393c2f55b8a0a5fc9d12581a9d97ef5d8ff9b5abf3321a290e8f63a4f785f450dc8a672aba3ba2ff4fdab"), - hexEncPubkey("2fc897f05ae585553e5c014effd3078f84f37f9333afacffb109f00ca8e7a3373de810a3946be971cbccdfd40249f9fe7f322118ea459ac71acca85a1ef8b7f4"), - }, - 247: { - hexEncPubkey("3155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32"), - hexEncPubkey("312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069db"), - hexEncPubkey("38643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aac"), - hexEncPubkey("8dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df73"), - hexEncPubkey("8b58c6073dd98bbad4e310b97186c8f822d3a5c7d57af40e2136e88e315afd115edb27d2d0685a908cfe5aa49d0debdda6e6e63972691d6bd8c5af2d771dd2a9"), - hexEncPubkey("2cbb718b7dc682da19652e7d9eb4fefaf7b7147d82c1c2b6805edf77b85e29fde9f6da195741467ff2638dc62c8d3e014ea5686693c15ed0080b6de90354c137"), - hexEncPubkey("e84027696d3f12f2de30a9311afea8fbd313c2360daff52bb5fc8c7094d5295758bec3134e4eef24e4cdf377b40da344993284628a7a346eba94f74160998feb"), - hexEncPubkey("f1357a4f04f9d33753a57c0b65ba20a5d8777abbffd04e906014491c9103fb08590e45548d37aa4bd70965e2e81ddba94f31860348df01469eec8c1829200a68"), - hexEncPubkey("4ab0a75941b12892369b4490a1928c8ca52a9ad6d3dffbd1d8c0b907bc200fe74c022d011ec39b64808a39c0ca41f1d3254386c3e7733e7044c44259486461b6"), - hexEncPubkey("d45150a72dc74388773e68e03133a3b5f51447fe91837d566706b3c035ee4b56f160c878c6273394daee7f56cc398985269052f22f75a8057df2fe6172765354"), - }, - 248: { - hexEncPubkey("6aadfce366a189bab08ac84721567483202c86590642ea6d6a14f37ca78d82bdb6509eb7b8b2f6f63c78ae3ae1d8837c89509e41497d719b23ad53dd81574afa"), - hexEncPubkey("a605ecfd6069a4cf4cf7f5840e5bc0ce10d23a3ac59e2aaa70c6afd5637359d2519b4524f56fc2ca180cdbebe54262f720ccaae8c1b28fd553c485675831624d"), - hexEncPubkey("29701451cb9448ca33fc33680b44b840d815be90146eb521641efbffed0859c154e8892d3906eae9934bfacee72cd1d2fa9dd050fd18888eea49da155ab0efd2"), - hexEncPubkey("3ed426322dee7572b08592e1e079f8b6c6b30e10e6243edd144a6a48fdbdb83df73a6e41b1143722cb82604f2203a32758610b5d9544f44a1a7921ba001528c1"), - hexEncPubkey("b2e2a2b7fdd363572a3256e75435fab1da3b16f7891a8bd2015f30995dae665d7eabfd194d87d99d5df628b4bbc7b04e5b492c596422dd8272746c7a1b0b8e4f"), - hexEncPubkey("0c69c9756162c593e85615b814ce57a2a8ca2df6c690b9c4e4602731b61e1531a3bbe3f7114271554427ffabea80ad8f36fa95a49fa77b675ae182c6ccac1728"), - hexEncPubkey("8d28be21d5a97b0876442fa4f5e5387f5bf3faad0b6f13b8607b64d6e448c0991ca28dd7fe2f64eb8eadd7150bff5d5666aa6ed868b84c71311f4ba9a38569dd"), - hexEncPubkey("2c677e1c64b9c9df6359348a7f5f33dc79e22f0177042486d125f8b6ca7f0dc756b1f672aceee5f1746bcff80aaf6f92a8dc0c9fbeb259b3fa0da060de5ab7e8"), - hexEncPubkey("3994880f94a8678f0cd247a43f474a8af375d2a072128da1ad6cae84a244105ff85e94fc7d8496f639468de7ee998908a91c7e33ef7585fff92e984b210941a1"), - hexEncPubkey("b45a9153c08d002a48090d15d61a7c7dad8c2af85d4ff5bd36ce23a9a11e0709bf8d56614c7b193bc028c16cbf7f20dfbcc751328b64a924995d47b41e452422"), - hexEncPubkey("057ab3a9e53c7a84b0f3fc586117a525cdd18e313f52a67bf31798d48078e325abe5cfee3f6c2533230cb37d0549289d692a29dd400e899b8552d4b928f6f907"), - hexEncPubkey("0ddf663d308791eb92e6bd88a2f8cb45e4f4f35bb16708a0e6ff7f1362aa6a73fedd0a1b1557fb3365e38e1b79d6918e2fae2788728b70c9ab6b51a3b94a4338"), - hexEncPubkey("f637e07ff50cc1e3731735841c4798411059f2023abcf3885674f3e8032531b0edca50fd715df6feb489b6177c345374d64f4b07d257a7745de393a107b013a5"), - hexEncPubkey("e24ec7c6eec094f63c7b3239f56d311ec5a3e45bc4e622a1095a65b95eea6fe13e29f3b6b7a2cbfe40906e3989f17ac834c3102dd0cadaaa26e16ee06d782b72"), - hexEncPubkey("b76ea1a6fd6506ef6e3506a4f1f60ed6287fff8114af6141b2ff13e61242331b54082b023cfea5b3083354a4fb3f9eb8be01fb4a518f579e731a5d0707291a6b"), - hexEncPubkey("9b53a37950ca8890ee349b325032d7b672cab7eced178d3060137b24ef6b92a43977922d5bdfb4a3409a2d80128e02f795f9dae6d7d99973ad0e23a2afb8442f"), - }, - 249: { - hexEncPubkey("675ae65567c3c72c50c73bc0fd4f61f202ea5f93346ca57b551de3411ccc614fad61cb9035493af47615311b9d44ee7a161972ee4d77c28fe1ec029d01434e6a"), - hexEncPubkey("8eb81408389da88536ae5800392b16ef5109d7ea132c18e9a82928047ecdb502693f6e4a4cdd18b54296caf561db937185731456c456c98bfe7de0baf0eaa495"), - hexEncPubkey("2adba8b1612a541771cb93a726a38a4b88e97b18eced2593eb7daf82f05a5321ca94a72cc780c306ff21e551a932fc2c6d791e4681907b5ceab7f084c3fa2944"), - hexEncPubkey("b1b4bfbda514d9b8f35b1c28961da5d5216fe50548f4066f69af3b7666a3b2e06eac646735e963e5c8f8138a2fb95af15b13b23ff00c6986eccc0efaa8ee6fb4"), - hexEncPubkey("d2139281b289ad0e4d7b4243c4364f5c51aac8b60f4806135de06b12b5b369c9e43a6eb494eab860d115c15c6fbb8c5a1b0e382972e0e460af395b8385363de7"), - hexEncPubkey("4a693df4b8fc5bdc7cec342c3ed2e228d7c5b4ab7321ddaa6cccbeb45b05a9f1d95766b4002e6d4791c2deacb8a667aadea6a700da28a3eea810a30395701bbc"), - hexEncPubkey("ab41611195ec3c62bb8cd762ee19fb182d194fd141f4a66780efbef4b07ce916246c022b841237a3a6b512a93431157edd221e854ed2a259b72e9c5351f44d0c"), - hexEncPubkey("68e8e26099030d10c3c703ae7045c0a48061fb88058d853b3e67880014c449d4311014da99d617d3150a20f1a3da5e34bf0f14f1c51fe4dd9d58afd222823176"), - hexEncPubkey("3fbcacf546fb129cd70fc48de3b593ba99d3c473798bc309292aca280320e0eacc04442c914cad5c4cf6950345ba79b0d51302df88285d4e83ee3fe41339eee7"), - hexEncPubkey("1d4a623659f7c8f80b6c3939596afdf42e78f892f682c768ad36eb7bfba402dbf97aea3a268f3badd8fe7636be216edf3d67ee1e08789ebbc7be625056bd7109"), - hexEncPubkey("a283c474ab09da02bbc96b16317241d0627646fcc427d1fe790b76a7bf1989ced90f92101a973047ae9940c92720dffbac8eff21df8cae468a50f72f9e159417"), - hexEncPubkey("dbf7e5ad7f87c3dfecae65d87c3039e14ed0bdc56caf00ce81931073e2e16719d746295512ff7937a15c3b03603e7c41a4f9df94fcd37bb200dd8f332767e9cb"), - hexEncPubkey("caaa070a26692f64fc77f30d7b5ae980d419b4393a0f442b1c821ef58c0862898b0d22f74a4f8c5d83069493e3ec0b92f17dc1fe6e4cd437c1ec25039e7ce839"), - hexEncPubkey("874cc8d1213beb65c4e0e1de38ef5d8165235893ac74ab5ea937c885eaab25c8d79dad0456e9fd3e9450626cac7e107b004478fb59842f067857f39a47cee695"), - hexEncPubkey("d94193f236105010972f5df1b7818b55846592a0445b9cdc4eaed811b8c4c0f7c27dc8cc9837a4774656d6b34682d6d329d42b6ebb55da1d475c2474dc3dfdf4"), - hexEncPubkey("edd9af6aded4094e9785637c28fccbd3980cbe28e2eb9a411048a23c2ace4bd6b0b7088a7817997b49a3dd05fc6929ca6c7abbb69438dbdabe65e971d2a794b2"), - }, - 250: { - hexEncPubkey("53a5bd1215d4ab709ae8fdc2ced50bba320bced78bd9c5dc92947fb402250c914891786db0978c898c058493f86fc68b1c5de8a5cb36336150ac7a88655b6c39"), - hexEncPubkey("b7f79e3ab59f79262623c9ccefc8f01d682323aee56ffbe295437487e9d5acaf556a9c92e1f1c6a9601f2b9eb6b027ae1aeaebac71d61b9b78e88676efd3e1a3"), - hexEncPubkey("d374bf7e8d7ffff69cc00bebff38ef5bc1dcb0a8d51c1a3d70e61ac6b2e2d6617109254b0ac224354dfbf79009fe4239e09020c483cc60c071e00b9238684f30"), - hexEncPubkey("1e1eac1c9add703eb252eb991594f8f5a173255d526a855fab24ae57dc277e055bc3c7a7ae0b45d437c4f47a72d97eb7b126f2ba344ba6c0e14b2c6f27d4b1e6"), - hexEncPubkey("ae28953f63d4bc4e706712a59319c111f5ff8f312584f65d7436b4cd3d14b217b958f8486bad666b4481fe879019fb1f767cf15b3e3e2711efc33b56d460448a"), - hexEncPubkey("934bb1edf9c7a318b82306aca67feb3d6b434421fa275d694f0b4927afd8b1d3935b727fd4ff6e3d012e0c82f1824385174e8c6450ade59c2a43281a4b3446b6"), - hexEncPubkey("9eef3f28f70ce19637519a0916555bf76d26de31312ac656cf9d3e379899ea44e4dd7ffcce923b4f3563f8a00489a34bd6936db0cbb4c959d32c49f017e07d05"), - hexEncPubkey("82200872e8f871c48f1fad13daec6478298099b591bb3dbc4ef6890aa28ebee5860d07d70be62f4c0af85085a90ae8179ee8f937cf37915c67ea73e704b03ee7"), - hexEncPubkey("6c75a5834a08476b7fc37ff3dc2011dc3ea3b36524bad7a6d319b18878fad813c0ba76d1f4555cacd3890c865438c21f0e0aed1f80e0a157e642124c69f43a11"), - hexEncPubkey("995b873742206cb02b736e73a88580c2aacb0bd4a3c97a647b647bcab3f5e03c0e0736520a8b3600da09edf4248991fb01091ec7ff3ec7cdc8a1beae011e7aae"), - hexEncPubkey("c773a056594b5cdef2e850d30891ff0e927c3b1b9c35cd8e8d53a1017001e237468e1ece3ae33d612ca3e6abb0a9169aa352e9dcda358e5af2ad982b577447db"), - hexEncPubkey("2b46a5f6923f475c6be99ec6d134437a6d11f6bb4b4ac6bcd94572fa1092639d1c08aeefcb51f0912f0a060f71d4f38ee4da70ecc16010b05dd4a674aab14c3a"), - hexEncPubkey("af6ab501366debbaa0d22e20e9688f32ef6b3b644440580fd78de4fe0e99e2a16eb5636bbae0d1c259df8ddda77b35b9a35cbc36137473e9c68fbc9d203ba842"), - hexEncPubkey("c9f6f2dd1a941926f03f770695bda289859e85fabaf94baaae20b93e5015dc014ba41150176a36a1884adb52f405194693e63b0c464a6891cc9cc1c80d450326"), - hexEncPubkey("5b116f0751526868a909b61a30b0c5282c37df6925cc03ddea556ef0d0602a9595fd6c14d371f8ed7d45d89918a032dcd22be4342a8793d88fdbeb3ca3d75bd7"), - hexEncPubkey("50f3222fb6b82481c7c813b2172e1daea43e2710a443b9c2a57a12bd160dd37e20f87aa968c82ad639af6972185609d47036c0d93b4b7269b74ebd7073221c10"), - }, - 251: { - hexEncPubkey("9b8f702a62d1bee67bedfeb102eca7f37fa1713e310f0d6651cc0c33ea7c5477575289ccd463e5a2574a00a676a1fdce05658ba447bb9d2827f0ba47b947e894"), - hexEncPubkey("b97532eb83054ed054b4abdf413bb30c00e4205545c93521554dbe77faa3cfaa5bd31ef466a107b0b34a71ec97214c0c83919720142cddac93aa7a3e928d4708"), - hexEncPubkey("2f7a5e952bfb67f2f90b8441b5fadc9ee13b1dcde3afeeb3dd64bf937f86663cc5c55d1fa83952b5422763c7df1b7f2794b751c6be316ebc0beb4942e65ab8c1"), - hexEncPubkey("42c7483781727051a0b3660f14faf39e0d33de5e643702ae933837d036508ab856ce7eec8ec89c4929a4901256e5233a3d847d5d4893f91bcf21835a9a880fee"), - hexEncPubkey("873bae27bf1dc854408fba94046a53ab0c965cebe1e4e12290806fc62b88deb1f4a47f9e18f78fc0e7913a0c6e42ac4d0fc3a20cea6bc65f0c8a0ca90b67521e"), - hexEncPubkey("a7e3a370bbd761d413f8d209e85886f68bf73d5c3089b2dc6fa42aab1ecb5162635497eed95dee2417f3c9c74a3e76319625c48ead2e963c7de877cd4551f347"), - hexEncPubkey("528597534776a40df2addaaea15b6ff832ce36b9748a265768368f657e76d58569d9f30dbb91e91cf0ae7efe8f402f17aa0ae15f5c55051ba03ba830287f4c42"), - hexEncPubkey("461d8bd4f13c3c09031fdb84f104ed737a52f630261463ce0bdb5704259bab4b737dda688285b8444dbecaecad7f50f835190b38684ced5e90c54219e5adf1bc"), - hexEncPubkey("6ec50c0be3fd232737090fc0111caaf0bb6b18f72be453428087a11a97fd6b52db0344acbf789a689bd4f5f50f79017ea784f8fd6fe723ad6ae675b9e3b13e21"), - hexEncPubkey("12fc5e2f77a83fdcc727b79d8ae7fe6a516881138d3011847ee136b400fed7cfba1f53fd7a9730253c7aa4f39abeacd04f138417ba7fcb0f36cccc3514e0dab6"), - hexEncPubkey("4fdbe75914ccd0bce02101606a1ccf3657ec963e3b3c20239d5fec87673fe446d649b4f15f1fe1a40e6cfbd446dda2d31d40bb602b1093b8fcd5f139ba0eb46a"), - hexEncPubkey("3753668a0f6281e425ea69b52cb2d17ab97afbe6eb84cf5d25425bc5e53009388857640668fadd7c110721e6047c9697803bd8a6487b43bb343bfa32ebf24039"), - hexEncPubkey("2e81b16346637dec4410fd88e527346145b9c0a849dbf2628049ac7dae016c8f4305649d5659ec77f1e8a0fac0db457b6080547226f06283598e3740ad94849a"), - hexEncPubkey("802c3cc27f91c89213223d758f8d2ecd41135b357b6d698f24d811cdf113033a81c38e0bdff574a5c005b00a8c193dc2531f8c1fa05fa60acf0ab6f2858af09f"), - hexEncPubkey("fcc9a2e1ac3667026ff16192876d1813bb75abdbf39b929a92863012fe8b1d890badea7a0de36274d5c1eb1e8f975785532c50d80fd44b1a4b692f437303393f"), - hexEncPubkey("6d8b3efb461151dd4f6de809b62726f5b89e9b38e9ba1391967f61cde844f7528fecf821b74049207cee5a527096b31f3ad623928cd3ce51d926fa345a6b2951"), - }, - 252: { - hexEncPubkey("f1ae93157cc48c2075dd5868fbf523e79e06caf4b8198f352f6e526680b78ff4227263de92612f7d63472bd09367bb92a636fff16fe46ccf41614f7a72495c2a"), - hexEncPubkey("587f482d111b239c27c0cb89b51dd5d574db8efd8de14a2e6a1400c54d4567e77c65f89c1da52841212080b91604104768350276b6682f2f961cdaf4039581c7"), - hexEncPubkey("e3f88274d35cefdaabdf205afe0e80e936cc982b8e3e47a84ce664c413b29016a4fb4f3a3ebae0a2f79671f8323661ed462bf4390af94c424dc8ace0c301b90f"), - hexEncPubkey("0ddc736077da9a12ba410dc5ea63cbcbe7659dd08596485b2bff3435221f82c10d263efd9af938e128464be64a178b7cd22e19f400d5802f4c9df54bf89f2619"), - hexEncPubkey("784aa34d833c6ce63fcc1279630113c3272e82c4ae8c126c5a52a88ac461b6baeed4244e607b05dc14e5b2f41c70a273c3804dea237f14f7a1e546f6d1309d14"), - hexEncPubkey("f253a2c354ee0e27cfcae786d726753d4ad24be6516b279a936195a487de4a59dbc296accf20463749ff55293263ed8c1b6365eecb248d44e75e9741c0d18205"), - hexEncPubkey("a1910b80357b3ad9b4593e0628922939614dc9056a5fbf477279c8b2c1d0b4b31d89a0c09d0d41f795271d14d3360ef08a3f821e65e7e1f56c07a36afe49c7c5"), - hexEncPubkey("f1168552c2efe541160f0909b0b4a9d6aeedcf595cdf0e9b165c97e3e197471a1ee6320e93389edfba28af6eaf10de98597ad56e7ab1b504ed762451996c3b98"), - hexEncPubkey("b0c8e5d2c8634a7930e1a6fd082e448c6cf9d2d8b7293558b59238815a4df926c286bf297d2049f14e8296a6eb3256af614ec1812c4f2bbe807673b58bf14c8c"), - hexEncPubkey("0fb346076396a38badc342df3679b55bd7f40a609ab103411fe45082c01f12ea016729e95914b2b5540e987ff5c9b133e85862648e7f36abdfd23100d248d234"), - hexEncPubkey("f736e0cc83417feaa280d9483f5d4d72d1b036cd0c6d9cbdeb8ac35ceb2604780de46dddaa32a378474e1d5ccdf79b373331c30c7911ade2ae32f98832e5de1f"), - hexEncPubkey("8b02991457602f42b38b342d3f2259ae4100c354b3843885f7e4e07bd644f64dab94bb7f38a3915f8b7f11d8e3f81c28e07a0078cf79d7397e38a7b7e0c857e2"), - hexEncPubkey("9221d9f04a8a184993d12baa91116692bb685f887671302999d69300ad103eb2d2c75a09d8979404c6dd28f12362f58a1a43619c493d9108fd47588a23ce5824"), - hexEncPubkey("652797801744dada833fff207d67484742eea6835d695925f3e618d71b68ec3c65bdd85b4302b2cdcb835ad3f94fd00d8da07e570b41bc0d2bcf69a8de1b3284"), - hexEncPubkey("d84f06fe64debc4cd0625e36d19b99014b6218375262cc2209202bdbafd7dffcc4e34ce6398e182e02fd8faeed622c3e175545864902dfd3d1ac57647cddf4c6"), - hexEncPubkey("d0ed87b294f38f1d741eb601020eeec30ac16331d05880fe27868f1e454446de367d7457b41c79e202eaf9525b029e4f1d7e17d85a55f83a557c005c68d7328a"), - }, - 253: { - hexEncPubkey("ad4485e386e3cc7c7310366a7c38fb810b8896c0d52e55944bfd320ca294e7912d6c53c0a0cf85e7ce226e92491d60430e86f8f15cda0161ed71893fb4a9e3a1"), - hexEncPubkey("36d0e7e5b7734f98c6183eeeb8ac5130a85e910a925311a19c4941b1290f945d4fc3996b12ef4966960b6fa0fb29b1604f83a0f81bd5fd6398d2e1a22e46af0c"), - hexEncPubkey("7d307d8acb4a561afa23bdf0bd945d35c90245e26345ec3a1f9f7df354222a7cdcb81339c9ed6744526c27a1a0c8d10857e98df942fa433602facac71ac68a31"), - hexEncPubkey("d97bf55f88c83fae36232661af115d66ca600fc4bd6d1fb35ff9bb4dad674c02cf8c8d05f317525b5522250db58bb1ecafb7157392bf5aa61b178c61f098d995"), - hexEncPubkey("7045d678f1f9eb7a4613764d17bd5698796494d0bf977b16f2dbc272b8a0f7858a60805c022fc3d1fe4f31c37e63cdaca0416c0d053ef48a815f8b19121605e0"), - hexEncPubkey("14e1f21418d445748de2a95cd9a8c3b15b506f86a0acabd8af44bb968ce39885b19c8822af61b3dd58a34d1f265baec30e3ae56149dc7d2aa4a538f7319f69c8"), - hexEncPubkey("b9453d78281b66a4eac95a1546017111eaaa5f92a65d0de10b1122940e92b319728a24edf4dec6acc412321b1c95266d39c7b3a5d265c629c3e49a65fb022c09"), - hexEncPubkey("e8a49248419e3824a00d86af422f22f7366e2d4922b304b7169937616a01d9d6fa5abf5cc01061a352dc866f48e1fa2240dbb453d872b1d7be62bdfc1d5e248c"), - hexEncPubkey("bebcff24b52362f30e0589ee573ce2d86f073d58d18e6852a592fa86ceb1a6c9b96d7fb9ec7ed1ed98a51b6743039e780279f6bb49d0a04327ac7a182d9a56f6"), - hexEncPubkey("d0835e5a4291db249b8d2fca9f503049988180c7d247bedaa2cf3a1bad0a76709360a85d4f9a1423b2cbc82bb4d94b47c0cde20afc430224834c49fe312a9ae3"), - hexEncPubkey("6b087fe2a2da5e4f0b0f4777598a4a7fb66bf77dbd5bfc44e8a7eaa432ab585a6e226891f56a7d4f5ed11a7c57b90f1661bba1059590ca4267a35801c2802913"), - hexEncPubkey("d901e5bde52d1a0f4ddf010a686a53974cdae4ebe5c6551b3c37d6b6d635d38d5b0e5f80bc0186a2c7809dbf3a42870dd09643e68d32db896c6da8ba734579e7"), - hexEncPubkey("96419fb80efae4b674402bb969ebaab86c1274f29a83a311e24516d36cdf148fe21754d46c97688cdd7468f24c08b13e4727c29263393638a3b37b99ff60ebca"), - hexEncPubkey("7b9c1889ae916a5d5abcdfb0aaedcc9c6f9eb1c1a4f68d0c2d034fe79ac610ce917c3abc670744150fa891bfcd8ab14fed6983fca964de920aa393fa7b326748"), - hexEncPubkey("7a369b2b8962cc4c65900be046482fbf7c14f98a135bbbae25152c82ad168fb2097b3d1429197cf46d3ce9fdeb64808f908a489cc6019725db040060fdfe5405"), - hexEncPubkey("47bcae48288da5ecc7f5058dfa07cf14d89d06d6e449cb946e237aa6652ea050d9f5a24a65efdc0013ccf232bf88670979eddef249b054f63f38da9d7796dbd8"), - }, - 254: { - hexEncPubkey("099739d7abc8abd38ecc7a816c521a1168a4dbd359fa7212a5123ab583ffa1cf485a5fed219575d6475dbcdd541638b2d3631a6c7fce7474e7fe3cba1d4d5853"), - hexEncPubkey("c2b01603b088a7182d0cf7ef29fb2b04c70acb320fccf78526bf9472e10c74ee70b3fcfa6f4b11d167bd7d3bc4d936b660f2c9bff934793d97cb21750e7c3d31"), - hexEncPubkey("20e4d8f45f2f863e94b45548c1ef22a11f7d36f263e4f8623761e05a64c4572379b000a52211751e2561b0f14f4fc92dd4130410c8ccc71eb4f0e95a700d4ca9"), - hexEncPubkey("27f4a16cc085e72d86e25c98bd2eca173eaaee7565c78ec5a52e9e12b2211f35de81b5b45e9195de2ebfe29106742c59112b951a04eb7ae48822911fc1f9389e"), - hexEncPubkey("55db5ee7d98e7f0b1c3b9d5be6f2bc619a1b86c3cdd513160ad4dcf267037a5fffad527ac15d50aeb32c59c13d1d4c1e567ebbf4de0d25236130c8361f9aac63"), - hexEncPubkey("883df308b0130fc928a8559fe50667a0fff80493bc09685d18213b2db241a3ad11310ed86b0ef662b3ce21fc3d9aa7f3fc24b8d9afe17c7407e9afd3345ae548"), - hexEncPubkey("c7af968cc9bc8200c3ee1a387405f7563be1dce6710a3439f42ea40657d0eae9d2b3c16c42d779605351fcdece4da637b9804e60ca08cfb89aec32c197beffa6"), - hexEncPubkey("3e66f2b788e3ff1d04106b80597915cd7afa06c405a7ae026556b6e583dca8e05cfbab5039bb9a1b5d06083ffe8de5780b1775550e7218f5e98624bf7af9a0a8"), - hexEncPubkey("4fc7f53764de3337fdaec0a711d35d3a923e72fa65025444d12230b3552ed43d9b2d1ad08ccb11f2d50c58809e6dd74dde910e195294fca3b47ae5a3967cc479"), - hexEncPubkey("bafdfdcf6ccaa989436752fa97c77477b6baa7deb374b16c095492c529eb133e8e2f99e1977012b64767b9d34b2cf6d2048ed489bd822b5139b523f6a423167b"), - hexEncPubkey("7f5d78008a4312fe059104ce80202c82b8915c2eb4411c6b812b16f7642e57c00f2c9425121f5cbac4257fe0b3e81ef5dea97ea2dbaa98f6a8b6fd4d1e5980bb"), - hexEncPubkey("598c37fe78f922751a052f463aeb0cb0bc7f52b7c2a4cf2da72ec0931c7c32175d4165d0f8998f7320e87324ac3311c03f9382a5385c55f0407b7a66b2acd864"), - hexEncPubkey("f758c4136e1c148777a7f3275a76e2db0b2b04066fd738554ec398c1c6cc9fb47e14a3b4c87bd47deaeab3ffd2110514c3855685a374794daff87b605b27ee2e"), - hexEncPubkey("0307bb9e4fd865a49dcf1fe4333d1b944547db650ab580af0b33e53c4fef6c789531110fac801bbcbce21fc4d6f61b6d5b24abdf5b22e3030646d579f6dca9c2"), - hexEncPubkey("82504b6eb49bb2c0f91a7006ce9cefdbaf6df38706198502c2e06601091fc9dc91e4f15db3410d45c6af355bc270b0f268d3dff560f956985c7332d4b10bd1ed"), - hexEncPubkey("b39b5b677b45944ceebe76e76d1f051de2f2a0ec7b0d650da52135743e66a9a5dba45f638258f9a7545d9a790c7fe6d3fdf82c25425c7887323e45d27d06c057"), - }, - 255: { - hexEncPubkey("5c4d58d46e055dd1f093f81ee60a675e1f02f54da6206720adee4dccef9b67a31efc5c2a2949c31a04ee31beadc79aba10da31440a1f9ff2a24093c63c36d784"), - hexEncPubkey("ea72161ffdd4b1e124c7b93b0684805f4c4b58d617ed498b37a145c670dbc2e04976f8785583d9c805ffbf343c31d492d79f841652bbbd01b61ed85640b23495"), - hexEncPubkey("51caa1d93352d47a8e531692a3612adac1e8ac68d0a200d086c1c57ae1e1a91aa285ab242e8c52ef9d7afe374c9485b122ae815f1707b875569d0433c1c3ce85"), - hexEncPubkey("c08397d5751b47bd3da044b908be0fb0e510d3149574dff7aeab33749b023bb171b5769990fe17469dbebc100bc150e798aeda426a2dcc766699a225fddd75c6"), - hexEncPubkey("0222c1c194b749736e593f937fad67ee348ac57287a15c7e42877aa38a9b87732a408bca370f812efd0eedbff13e6d5b854bf3ba1dec431a796ed47f32552b09"), - hexEncPubkey("03d859cd46ef02d9bfad5268461a6955426845eef4126de6be0fa4e8d7e0727ba2385b78f1a883a8239e95ebb814f2af8379632c7d5b100688eebc5841209582"), - hexEncPubkey("64d5004b7e043c39ff0bd10cb20094c287721d5251715884c280a612b494b3e9e1c64ba6f67614994c7d969a0d0c0295d107d53fc225d47c44c4b82852d6f960"), - hexEncPubkey("b0a5eefb2dab6f786670f35bf9641eefe6dd87fd3f1362bcab4aaa792903500ab23d88fae68411372e0813b057535a601d46e454323745a948017f6063a47b1f"), - hexEncPubkey("0cc6df0a3433d448b5684d2a3ffa9d1a825388177a18f44ad0008c7bd7702f1ec0fc38b83506f7de689c3b6ecb552599927e29699eed6bb867ff08f80068b287"), - hexEncPubkey("50772f7b8c03a4e153355fbbf79c8a80cf32af656ff0c7873c99911099d04a0dae0674706c357e0145ad017a0ade65e6052cb1b0d574fcd6f67da3eee0ace66b"), - hexEncPubkey("1ae37829c9ef41f8b508b82259ebac76b1ed900d7a45c08b7970f25d2d48ddd1829e2f11423a18749940b6dab8598c6e416cef0efd47e46e51f29a0bc65b37cd"), - hexEncPubkey("ba973cab31c2af091fc1644a93527d62b2394999e2b6ccbf158dd5ab9796a43d408786f1803ef4e29debfeb62fce2b6caa5ab2b24d1549c822a11c40c2856665"), - hexEncPubkey("bc413ad270dd6ea25bddba78f3298b03b8ba6f8608ac03d06007d4116fa78ef5a0cfe8c80155089382fc7a193243ee5500082660cb5d7793f60f2d7d18650964"), - hexEncPubkey("5a6a9ef07634d9eec3baa87c997b529b92652afa11473dfee41ef7037d5c06e0ddb9fe842364462d79dd31cff8a59a1b8d5bc2b810dea1d4cbbd3beb80ecec83"), - hexEncPubkey("f492c6ee2696d5f682f7f537757e52744c2ae560f1090a07024609e903d334e9e174fc01609c5a229ddbcac36c9d21adaf6457dab38a25bfd44f2f0ee4277998"), - hexEncPubkey("459e4db99298cb0467a90acee6888b08bb857450deac11015cced5104853be5adce5b69c740968bc7f931495d671a70cad9f48546d7cd203357fe9af0e8d2164"), - }, - 256: { - hexEncPubkey("a8593af8a4aef7b806b5197612017951bac8845a1917ca9a6a15dd6086d608505144990b245785c4cd2d67a295701c7aac2aa18823fb0033987284b019656268"), - hexEncPubkey("d2eebef914928c3aad77fc1b2a495f52d2294acf5edaa7d8a530b540f094b861a68fe8348a46a7c302f08ab609d85912a4968eacfea0740847b29421b4795d9e"), - hexEncPubkey("b14bfcb31495f32b650b63cf7d08492e3e29071fdc73cf2da0da48d4b191a70ba1a65f42ad8c343206101f00f8a48e8db4b08bf3f622c0853e7323b250835b91"), - hexEncPubkey("7feaee0d818c03eb30e4e0bf03ade0f3c21ca38e938a761aa1781cf70bda8cc5cd631a6cc53dd44f1d4a6d3e2dae6513c6c66ee50cb2f0e9ad6f7e319b309fd9"), - hexEncPubkey("4ca3b657b139311db8d583c25dd5963005e46689e1317620496cc64129c7f3e52870820e0ec7941d28809311df6db8a2867bbd4f235b4248af24d7a9c22d1232"), - hexEncPubkey("1181defb1d16851d42dd951d84424d6bd1479137f587fa184d5a8152be6b6b16ed08bcdb2c2ed8539bcde98c80c432875f9f724737c316a2bd385a39d3cab1d8"), - hexEncPubkey("d9dd818769fa0c3ec9f553c759b92476f082817252a04a47dc1777740b1731d280058c66f982812f173a294acf4944a85ba08346e2de153ba3ba41ce8a62cb64"), - hexEncPubkey("bd7c4f8a9e770aa915c771b15e107ca123d838762da0d3ffc53aa6b53e9cd076cffc534ec4d2e4c334c683f1f5ea72e0e123f6c261915ed5b58ac1b59f003d88"), - hexEncPubkey("3dd5739c73649d510456a70e9d6b46a855864a4a3f744e088fd8c8da11b18e4c9b5f2d7da50b1c147b2bae5ca9609ae01f7a3cdea9dce34f80a91d29cd82f918"), - hexEncPubkey("f0d7df1efc439b4bcc0b762118c1cfa99b2a6143a9f4b10e3c9465125f4c9fca4ab88a2504169bbcad65492cf2f50da9dd5d077c39574a944f94d8246529066b"), - hexEncPubkey("dd598b9ba441448e5fb1a6ec6c5f5aa9605bad6e223297c729b1705d11d05f6bfd3d41988b694681ae69bb03b9a08bff4beab5596503d12a39bffb5cd6e94c7c"), - hexEncPubkey("3fce284ac97e567aebae681b15b7a2b6df9d873945536335883e4bbc26460c064370537f323fd1ada828ea43154992d14ac0cec0940a2bd2a3f42ec156d60c83"), - hexEncPubkey("7c8dfa8c1311cb14fb29a8ac11bca23ecc115e56d9fcf7b7ac1db9066aa4eb39f8b1dabf46e192a65be95ebfb4e839b5ab4533fef414921825e996b210dd53bd"), - hexEncPubkey("cafa6934f82120456620573d7f801390ed5e16ed619613a37e409e44ab355ef755e83565a913b48a9466db786f8d4fbd590bfec474c2524d4a2608d4eafd6abd"), - hexEncPubkey("9d16600d0dd310d77045769fed2cb427f32db88cd57d86e49390c2ba8a9698cfa856f775be2013237226e7bf47b248871cf865d23015937d1edeb20db5e3e760"), - hexEncPubkey("17be6b6ba54199b1d80eff866d348ea11d8a4b341d63ad9a6681d3ef8a43853ac564d153eb2a8737f0afc9ab320f6f95c55aa11aaa13bbb1ff422fd16bdf8188"), - }, - }, -} +func TestTable_addSeenNode(t *testing.T) { + tab, db := newTestTable(newPingRecorder()) + <-tab.initDone + defer db.Close() + defer tab.close() -type preminedTestnet struct { - target encPubkey - targetSha enode.ID // sha3(target) - dists [hashBits + 1][]encPubkey -} + // Insert two nodes. + n1 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 1}) + n2 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 2}) + tab.addSeenNode(n1) + tab.addSeenNode(n2) -func (tn *preminedTestnet) findnode(toid enode.ID, toaddr *net.UDPAddr, target encPubkey) ([]*node, error) { - // current log distance is encoded in port number - // fmt.Println("findnode query at dist", toaddr.Port) - if toaddr.Port == 0 { - panic("query to node at distance 0") + // Verify bucket content: + bcontent := []*node{n1, n2} + if !reflect.DeepEqual(tab.bucket(n1.ID()).entries, bcontent) { + t.Fatalf("wrong bucket content: %v", tab.bucket(n1.ID()).entries) } - next := toaddr.Port - 1 - var result []*node - for i, ekey := range tn.dists[toaddr.Port] { - key, _ := decodePubkey(ekey) - node := wrapNode(enode.NewV4(key, net.ParseIP("127.0.0.1"), i, next)) - result = append(result, node) + + // Add a changed version of n2. + newrec := n2.Record() + newrec.Set(enr.IP{99, 99, 99, 99}) + newn2 := wrapNode(enode.SignNull(newrec, n2.ID())) + tab.addSeenNode(newn2) + + // Check that bucket content is unchanged. + if !reflect.DeepEqual(tab.bucket(n1.ID()).entries, bcontent) { + t.Fatalf("wrong bucket content after update: %v", tab.bucket(n1.ID()).entries) } - return result, nil + checkIPLimitInvariant(t, tab) } -func (*preminedTestnet) close() {} -func (*preminedTestnet) waitping(from enode.ID) error { return nil } -func (*preminedTestnet) ping(toid enode.ID, toaddr *net.UDPAddr) error { return nil } - -// mine generates a testnet struct literal with nodes at -// various distances to the given target. -func (tn *preminedTestnet) mine(target encPubkey) { - tn.target = target - tn.targetSha = tn.target.id() - found := 0 - for found < bucketSize*10 { - k := newkey() - key := encodePubkey(&k.PublicKey) - ld := enode.LogDist(tn.targetSha, key.id()) - if len(tn.dists[ld]) < bucketSize { - tn.dists[ld] = append(tn.dists[ld], key) - fmt.Println("found ID with ld", ld) - found++ - } - } - fmt.Println("&preminedTestnet{") - fmt.Printf(" target: %#v,\n", tn.target) - fmt.Printf(" targetSha: %#v,\n", tn.targetSha) - fmt.Printf(" dists: [%d][]encPubkey{\n", len(tn.dists)) - for ld, ns := range tn.dists { - if len(ns) == 0 { - continue - } - fmt.Printf(" %d: []encPubkey{\n", ld) - for _, n := range ns { - fmt.Printf(" hexEncPubkey(\"%x\"),\n", n[:]) - } - fmt.Println(" },") +// This test checks that ENR updates happen during revalidation. If a node in the table +// announces a new sequence number, the new record should be pulled. +func TestTable_revalidateSyncRecord(t *testing.T) { + transport := newPingRecorder() + tab, db := newTestTable(transport) + <-tab.initDone + defer db.Close() + defer tab.close() + + // Insert a node. + var r enr.Record + r.Set(enr.IP(net.IP{127, 0, 0, 1})) + id := enode.ID{1} + n1 := wrapNode(enode.SignNull(&r, id)) + tab.addSeenNode(n1) + + // Update the node record. + r.Set(enr.WithEntry("foo", "bar")) + n2 := enode.SignNull(&r, id) + transport.updateRecord(n2) + + tab.doRevalidate(make(chan struct{}, 1)) + intable := tab.getNode(id) + if !reflect.DeepEqual(intable, n2) { + t.Fatalf("table contains old record with seq %d, want seq %d", intable.Seq(), n2.Seq()) } - fmt.Println(" },") - fmt.Println("}") } // gen wraps quick.Value so it's easier to use. @@ -574,6 +406,12 @@ func gen(typ interface{}, rand *rand.Rand) interface{} { return v.Interface() } +func genIP(rand *rand.Rand) net.IP { + ip := make(net.IP, 4) + rand.Read(ip) + return ip +} + func quickcfg() *quick.Config { return &quick.Config{ MaxCount: 5000, diff --git a/p2p/discover/table_util_test.go b/p2p/discover/table_util_test.go index 05ae0b6c0786..2292055e160d 100644 --- a/p2p/discover/table_util_test.go +++ b/p2p/discover/table_util_test.go @@ -1,4 +1,4 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -22,18 +22,27 @@ import ( "fmt" "math/rand" "net" + "sort" "sync" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" ) -func newTestTable(t transport) (*Table, *enode.DB) { +var nullNode *enode.Node + +func init() { var r enr.Record r.Set(enr.IP{0, 0, 0, 0}) - n := enode.SignNull(&r, enode.ID{}) + nullNode = enode.SignNull(&r, enode.ID{}) +} + +func newTestTable(t transport) (*Table, *enode.DB) { db, _ := enode.OpenDB("") - tab, _ := newTable(t, n, db, nil) + tab, _ := newTable(t, db, nil, log.Root()) + go tab.loop() return tab, db } @@ -70,47 +79,81 @@ func intIP(i int) net.IP { // fillBucket inserts nodes into the given bucket until it is full. func fillBucket(tab *Table, n *node) (last *node) { - ld := enode.LogDist(tab.self.ID(), n.ID()) + ld := enode.LogDist(tab.self().ID(), n.ID()) b := tab.bucket(n.ID()) for len(b.entries) < bucketSize { - b.entries = append(b.entries, nodeAtDistance(tab.self.ID(), ld, intIP(ld))) + b.entries = append(b.entries, nodeAtDistance(tab.self().ID(), ld, intIP(ld))) } return b.entries[bucketSize-1] } +// fillTable adds nodes the table to the end of their corresponding bucket +// if the bucket is not full. The caller must not hold tab.mutex. +func fillTable(tab *Table, nodes []*node) { + for _, n := range nodes { + tab.addSeenNode(n) + } +} + type pingRecorder struct { mu sync.Mutex dead, pinged map[enode.ID]bool + records map[enode.ID]*enode.Node + n *enode.Node } func newPingRecorder() *pingRecorder { + var r enr.Record + r.Set(enr.IP{0, 0, 0, 0}) + n := enode.SignNull(&r, enode.ID{}) + return &pingRecorder{ - dead: make(map[enode.ID]bool), - pinged: make(map[enode.ID]bool), + dead: make(map[enode.ID]bool), + pinged: make(map[enode.ID]bool), + records: make(map[enode.ID]*enode.Node), + n: n, } } -func (t *pingRecorder) findnode(toid enode.ID, toaddr *net.UDPAddr, target encPubkey) ([]*node, error) { - return nil, nil +// setRecord updates a node record. Future calls to ping and +// requestENR will return this record. +func (t *pingRecorder) updateRecord(n *enode.Node) { + t.mu.Lock() + defer t.mu.Unlock() + t.records[n.ID()] = n } -func (t *pingRecorder) waitping(from enode.ID) error { - return nil // remote always pings -} +// Stubs to satisfy the transport interface. +func (t *pingRecorder) Self() *enode.Node { return nullNode } +func (t *pingRecorder) lookupSelf() []*enode.Node { return nil } +func (t *pingRecorder) lookupRandom() []*enode.Node { return nil } +func (t *pingRecorder) close() {} -func (t *pingRecorder) ping(toid enode.ID, toaddr *net.UDPAddr) error { +// ping simulates a ping request. +func (t *pingRecorder) ping(n *enode.Node) (seq uint64, err error) { t.mu.Lock() defer t.mu.Unlock() - t.pinged[toid] = true - if t.dead[toid] { - return errTimeout - } else { - return nil + t.pinged[n.ID()] = true + if t.dead[n.ID()] { + return 0, errTimeout } + if t.records[n.ID()] != nil { + seq = t.records[n.ID()].Seq() + } + return seq, nil } -func (t *pingRecorder) close() {} +// requestENR simulates an ENR request. +func (t *pingRecorder) RequestENR(n *enode.Node) (*enode.Node, error) { + t.mu.Lock() + defer t.mu.Unlock() + + if t.dead[n.ID()] || t.records[n.ID()] == nil { + return nil, errTimeout + } + return t.records[n.ID()], nil +} func hasDuplicates(slice []*node) bool { seen := make(map[enode.ID]bool) @@ -126,24 +169,22 @@ func hasDuplicates(slice []*node) bool { return false } -func contains(ns []*node, id enode.ID) bool { - for _, n := range ns { - if n.ID() == id { - return true - } - } - return false +func sortedByDistanceTo(distbase enode.ID, slice []*node) bool { + return sort.SliceIsSorted(slice, func(i, j int) bool { + return enode.DistCmp(distbase, slice[i].ID(), slice[j].ID()) < 0 + }) } -func sortedByDistanceTo(distbase enode.ID, slice []*node) bool { - var last enode.ID - for i, e := range slice { - if i > 0 && enode.DistCmp(distbase, e.ID(), last) < 0 { - return false - } - last = e.ID() +func hexEncPrivkey(h string) *ecdsa.PrivateKey { + b, err := hex.DecodeString(h) + if err != nil { + panic(err) + } + key, err := crypto.ToECDSA(b) + if err != nil { + panic(err) } - return true + return key } func hexEncPubkey(h string) (ret encPubkey) { @@ -157,11 +198,3 @@ func hexEncPubkey(h string) (ret encPubkey) { copy(ret[:], b) return ret } - -func hexPubkey(h string) *ecdsa.PublicKey { - k, err := decodePubkey(hexEncPubkey(h)) - if err != nil { - panic(err) - } - return k -} diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go deleted file mode 100644 index 45fcce282c76..000000000000 --- a/p2p/discover/udp.go +++ /dev/null @@ -1,711 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package discover - -import ( - "bytes" - "container/list" - "crypto/ecdsa" - "errors" - "fmt" - "net" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/nat" - "github.com/ethereum/go-ethereum/p2p/netutil" - "github.com/ethereum/go-ethereum/rlp" -) - -// Errors -var ( - errPacketTooSmall = errors.New("too small") - errBadHash = errors.New("bad hash") - errExpired = errors.New("expired") - errUnsolicitedReply = errors.New("unsolicited reply") - errUnknownNode = errors.New("unknown node") - errTimeout = errors.New("RPC timeout") - errClockWarp = errors.New("reply deadline too far in the future") - errClosed = errors.New("socket closed") -) - -// Timeouts -const ( - respTimeout = 500 * time.Millisecond - expiration = 20 * time.Second - bondExpiration = 24 * time.Hour - - ntpFailureThreshold = 32 // Continuous timeouts after which to check NTP - ntpWarningCooldown = 10 * time.Minute // Minimum amount of time to pass before repeating NTP warning - driftThreshold = 10 * time.Second // Allowed clock drift before warning user -) - -// RPC packet types -const ( - pingPacket = iota + 1 // zero is 'reserved' - pongPacket - findnodePacket - neighborsPacket -) - -// RPC request structures -type ( - ping struct { - Version uint - From, To rpcEndpoint - Expiration uint64 - // Ignore additional fields (for forward compatibility). - Rest []rlp.RawValue `rlp:"tail"` - } - - // pong is the reply to ping. - pong struct { - // This field should mirror the UDP envelope address - // of the ping packet, which provides a way to discover the - // the external address (after NAT). - To rpcEndpoint - - ReplyTok []byte // This contains the hash of the ping packet. - Expiration uint64 // Absolute timestamp at which the packet becomes invalid. - // Ignore additional fields (for forward compatibility). - Rest []rlp.RawValue `rlp:"tail"` - } - - // findnode is a query for nodes close to the given target. - findnode struct { - Target encPubkey - Expiration uint64 - // Ignore additional fields (for forward compatibility). - Rest []rlp.RawValue `rlp:"tail"` - } - - // reply to findnode - neighbors struct { - Nodes []rpcNode - Expiration uint64 - // Ignore additional fields (for forward compatibility). - Rest []rlp.RawValue `rlp:"tail"` - } - - rpcNode struct { - IP net.IP // len 4 for IPv4 or 16 for IPv6 - UDP uint16 // for discovery protocol - TCP uint16 // for RLPx protocol - ID encPubkey - } - - rpcEndpoint struct { - IP net.IP // len 4 for IPv4 or 16 for IPv6 - UDP uint16 // for discovery protocol - TCP uint16 // for RLPx protocol - } -) - -func makeEndpoint(addr *net.UDPAddr, tcpPort uint16) rpcEndpoint { - ip := addr.IP.To4() - if ip == nil { - ip = addr.IP.To16() - } - return rpcEndpoint{IP: ip, UDP: uint16(addr.Port), TCP: tcpPort} -} - -func (t *udp) nodeFromRPC(sender *net.UDPAddr, rn rpcNode) (*node, error) { - if rn.UDP <= 1024 { - return nil, errors.New("low port") - } - if err := netutil.CheckRelayIP(sender.IP, rn.IP); err != nil { - return nil, err - } - if t.netrestrict != nil && !t.netrestrict.Contains(rn.IP) { - return nil, errors.New("not contained in netrestrict whitelist") - } - key, err := decodePubkey(rn.ID) - if err != nil { - return nil, err - } - n := wrapNode(enode.NewV4(key, rn.IP, int(rn.TCP), int(rn.UDP))) - err = n.ValidateComplete() - return n, err -} - -func nodeToRPC(n *node) rpcNode { - var key ecdsa.PublicKey - var ekey encPubkey - if err := n.Load((*enode.Secp256k1)(&key)); err == nil { - ekey = encodePubkey(&key) - } - return rpcNode{ID: ekey, IP: n.IP(), UDP: uint16(n.UDP()), TCP: uint16(n.TCP())} -} - -type packet interface { - handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error - name() string -} - -type conn interface { - ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) - WriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error) - Close() error - LocalAddr() net.Addr -} - -// udp implements the RPC protocol. -type udp struct { - conn conn - netrestrict *netutil.Netlist - priv *ecdsa.PrivateKey - ourEndpoint rpcEndpoint - - addpending chan *pending - gotreply chan reply - - closing chan struct{} - nat nat.Interface - - *Table -} - -// pending represents a pending reply. -// -// some implementations of the protocol wish to send more than one -// reply packet to findnode. in general, any neighbors packet cannot -// be matched up with a specific findnode packet. -// -// our implementation handles this by storing a callback function for -// each pending reply. incoming packets from a node are dispatched -// to all the callback functions for that node. -type pending struct { - // these fields must match in the reply. - from enode.ID - ptype byte - - // time when the request must complete - deadline time.Time - - // callback is called when a matching reply arrives. if it returns - // true, the callback is removed from the pending reply queue. - // if it returns false, the reply is considered incomplete and - // the callback will be invoked again for the next matching reply. - callback func(resp interface{}) (done bool) - - // errc receives nil when the callback indicates completion or an - // error if no further reply is received within the timeout. - errc chan<- error -} - -type reply struct { - from enode.ID - ptype byte - data interface{} - // loop indicates whether there was - // a matching request by sending on this channel. - matched chan<- bool -} - -// ReadPacket is sent to the unhandled channel when it could not be processed -type ReadPacket struct { - Data []byte - Addr *net.UDPAddr -} - -// Config holds Table-related settings. -type Config struct { - // These settings are required and configure the UDP listener: - PrivateKey *ecdsa.PrivateKey - - // These settings are optional: - AnnounceAddr *net.UDPAddr // local address announced in the DHT - NodeDBPath string // if set, the node database is stored at this filesystem location - NetRestrict *netutil.Netlist // network whitelist - Bootnodes []*enode.Node // list of bootstrap nodes - Unhandled chan<- ReadPacket // unhandled packets are sent on this channel -} - -// ListenUDP returns a new table that listens for UDP packets on laddr. -func ListenUDP(c conn, cfg Config) (*Table, error) { - tab, _, err := newUDP(c, cfg) - if err != nil { - return nil, err - } - log.Info("UDP listener up", "self", tab.self) - return tab, nil -} - -func newUDP(c conn, cfg Config) (*Table, *udp, error) { - realaddr := c.LocalAddr().(*net.UDPAddr) - if cfg.AnnounceAddr != nil { - realaddr = cfg.AnnounceAddr - } - self := enode.NewV4(&cfg.PrivateKey.PublicKey, realaddr.IP, realaddr.Port, realaddr.Port) - db, err := enode.OpenDB(cfg.NodeDBPath) - if err != nil { - return nil, nil, err - } - - udp := &udp{ - conn: c, - priv: cfg.PrivateKey, - netrestrict: cfg.NetRestrict, - closing: make(chan struct{}), - gotreply: make(chan reply), - addpending: make(chan *pending), - } - // TODO: separate TCP port - udp.ourEndpoint = makeEndpoint(realaddr, uint16(realaddr.Port)) - tab, err := newTable(udp, self, db, cfg.Bootnodes) - if err != nil { - return nil, nil, err - } - udp.Table = tab - - go udp.loop() - go udp.readLoop(cfg.Unhandled) - return udp.Table, udp, nil -} - -func (t *udp) close() { - close(t.closing) - t.conn.Close() - t.db.Close() - // TODO: wait for the loops to end. -} - -// ping sends a ping message to the given node and waits for a reply. -func (t *udp) ping(toid enode.ID, toaddr *net.UDPAddr) error { - return <-t.sendPing(toid, toaddr, nil) -} - -// sendPing sends a ping message to the given node and invokes the callback -// when the reply arrives. -func (t *udp) sendPing(toid enode.ID, toaddr *net.UDPAddr, callback func()) <-chan error { - req := &ping{ - Version: 4, - From: t.ourEndpoint, - To: makeEndpoint(toaddr, 0), // TODO: maybe use known TCP port from DB - Expiration: uint64(time.Now().Add(expiration).Unix()), - } - packet, hash, err := encodePacket(t.priv, pingPacket, req) - if err != nil { - errc := make(chan error, 1) - errc <- err - return errc - } - errc := t.pending(toid, pongPacket, func(p interface{}) bool { - ok := bytes.Equal(p.(*pong).ReplyTok, hash) - if ok && callback != nil { - callback() - } - return ok - }) - t.write(toaddr, req.name(), packet) - return errc -} - -func (t *udp) waitping(from enode.ID) error { - return <-t.pending(from, pingPacket, func(interface{}) bool { return true }) -} - -// findnode sends a findnode request to the given node and waits until -// the node has sent up to k neighbors. -func (t *udp) findnode(toid enode.ID, toaddr *net.UDPAddr, target encPubkey) ([]*node, error) { - // If we haven't seen a ping from the destination node for a while, it won't remember - // our endpoint proof and reject findnode. Solicit a ping first. - if time.Since(t.db.LastPingReceived(toid)) > bondExpiration { - t.ping(toid, toaddr) - t.waitping(toid) - } - - nodes := make([]*node, 0, bucketSize) - nreceived := 0 - errc := t.pending(toid, neighborsPacket, func(r interface{}) bool { - reply := r.(*neighbors) - for _, rn := range reply.Nodes { - nreceived++ - n, err := t.nodeFromRPC(toaddr, rn) - if err != nil { - log.Trace("Invalid neighbor node received", "ip", rn.IP, "addr", toaddr, "err", err) - continue - } - nodes = append(nodes, n) - } - return nreceived >= bucketSize - }) - t.send(toaddr, findnodePacket, &findnode{ - Target: target, - Expiration: uint64(time.Now().Add(expiration).Unix()), - }) - return nodes, <-errc -} - -// pending adds a reply callback to the pending reply queue. -// see the documentation of type pending for a detailed explanation. -func (t *udp) pending(id enode.ID, ptype byte, callback func(interface{}) bool) <-chan error { - ch := make(chan error, 1) - p := &pending{from: id, ptype: ptype, callback: callback, errc: ch} - select { - case t.addpending <- p: - // loop will handle it - case <-t.closing: - ch <- errClosed - } - return ch -} - -func (t *udp) handleReply(from enode.ID, ptype byte, req packet) bool { - matched := make(chan bool, 1) - select { - case t.gotreply <- reply{from, ptype, req, matched}: - // loop will handle it - return <-matched - case <-t.closing: - return false - } -} - -// loop runs in its own goroutine. it keeps track of -// the refresh timer and the pending reply queue. -func (t *udp) loop() { - var ( - plist = list.New() - timeout = time.NewTimer(0) - nextTimeout *pending // head of plist when timeout was last reset - contTimeouts = 0 // number of continuous timeouts to do NTP checks - ntpWarnTime = time.Unix(0, 0) - ) - <-timeout.C // ignore first timeout - defer timeout.Stop() - - resetTimeout := func() { - if plist.Front() == nil || nextTimeout == plist.Front().Value { - return - } - // Start the timer so it fires when the next pending reply has expired. - now := time.Now() - for el := plist.Front(); el != nil; el = el.Next() { - nextTimeout = el.Value.(*pending) - if dist := nextTimeout.deadline.Sub(now); dist < 2*respTimeout { - timeout.Reset(dist) - return - } - // Remove pending replies whose deadline is too far in the - // future. These can occur if the system clock jumped - // backwards after the deadline was assigned. - nextTimeout.errc <- errClockWarp - plist.Remove(el) - } - nextTimeout = nil - timeout.Stop() - } - - for { - resetTimeout() - - select { - case <-t.closing: - for el := plist.Front(); el != nil; el = el.Next() { - el.Value.(*pending).errc <- errClosed - } - return - - case p := <-t.addpending: - p.deadline = time.Now().Add(respTimeout) - plist.PushBack(p) - - case r := <-t.gotreply: - var matched bool - for el := plist.Front(); el != nil; el = el.Next() { - p := el.Value.(*pending) - if p.from == r.from && p.ptype == r.ptype { - matched = true - // Remove the matcher if its callback indicates - // that all replies have been received. This is - // required for packet types that expect multiple - // reply packets. - if p.callback(r.data) { - p.errc <- nil - plist.Remove(el) - } - // Reset the continuous timeout counter (time drift detection) - contTimeouts = 0 - } - } - r.matched <- matched - - case now := <-timeout.C: - nextTimeout = nil - - // Notify and remove callbacks whose deadline is in the past. - for el := plist.Front(); el != nil; el = el.Next() { - p := el.Value.(*pending) - if now.After(p.deadline) || now.Equal(p.deadline) { - p.errc <- errTimeout - plist.Remove(el) - contTimeouts++ - } - } - // If we've accumulated too many timeouts, do an NTP time sync check - if contTimeouts > ntpFailureThreshold { - if time.Since(ntpWarnTime) >= ntpWarningCooldown { - ntpWarnTime = time.Now() - go checkClockDrift() - } - contTimeouts = 0 - } - } - } -} - -const ( - macSize = 256 / 8 - sigSize = 520 / 8 - headSize = macSize + sigSize // space of packet frame data -) - -var ( - headSpace = make([]byte, headSize) - - // Neighbors replies are sent across multiple packets to - // stay below the 1280 byte limit. We compute the maximum number - // of entries by stuffing a packet until it grows too large. - maxNeighbors int -) - -func init() { - p := neighbors{Expiration: ^uint64(0)} - maxSizeNode := rpcNode{IP: make(net.IP, 16), UDP: ^uint16(0), TCP: ^uint16(0)} - for n := 0; ; n++ { - p.Nodes = append(p.Nodes, maxSizeNode) - size, _, err := rlp.EncodeToReader(p) - if err != nil { - // If this ever happens, it will be caught by the unit tests. - panic("cannot encode: " + err.Error()) - } - if headSize+size+1 >= 1280 { - maxNeighbors = n - break - } - } -} - -func (t *udp) send(toaddr *net.UDPAddr, ptype byte, req packet) ([]byte, error) { - packet, hash, err := encodePacket(t.priv, ptype, req) - if err != nil { - return hash, err - } - return hash, t.write(toaddr, req.name(), packet) -} - -func (t *udp) write(toaddr *net.UDPAddr, what string, packet []byte) error { - _, err := t.conn.WriteToUDP(packet, toaddr) - log.Trace(">> "+what, "addr", toaddr, "err", err) - return err -} - -func encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) (packet, hash []byte, err error) { - b := new(bytes.Buffer) - b.Write(headSpace) - b.WriteByte(ptype) - if err := rlp.Encode(b, req); err != nil { - log.Error("Can't encode discv4 packet", "err", err) - return nil, nil, err - } - packet = b.Bytes() - sig, err := crypto.Sign(crypto.Keccak256(packet[headSize:]), priv) - if err != nil { - log.Error("Can't sign discv4 packet", "err", err) - return nil, nil, err - } - copy(packet[macSize:], sig) - // add the hash to the front. Note: this doesn't protect the - // packet in any way. Our public key will be part of this hash in - // The future. - hash = crypto.Keccak256(packet[macSize:]) - copy(packet, hash) - return packet, hash, nil -} - -// readLoop runs in its own goroutine. it handles incoming UDP packets. -func (t *udp) readLoop(unhandled chan<- ReadPacket) { - defer t.conn.Close() - if unhandled != nil { - defer close(unhandled) - } - // Discovery packets are defined to be no larger than 1280 bytes. - // Packets larger than this size will be cut at the end and treated - // as invalid because their hash won't match. - buf := make([]byte, 1280) - for { - nbytes, from, err := t.conn.ReadFromUDP(buf) - if netutil.IsTemporaryError(err) { - // Ignore temporary read errors. - log.Debug("Temporary UDP read error", "err", err) - continue - } else if err != nil { - // Shut down the loop for permament errors. - log.Debug("UDP read error", "err", err) - return - } - if t.handlePacket(from, buf[:nbytes]) != nil && unhandled != nil { - select { - case unhandled <- ReadPacket{buf[:nbytes], from}: - default: - } - } - } -} - -func (t *udp) handlePacket(from *net.UDPAddr, buf []byte) error { - packet, fromID, hash, err := decodePacket(buf) - if err != nil { - log.Debug("Bad discv4 packet", "addr", from, "err", err) - return err - } - err = packet.handle(t, from, fromID, hash) - log.Trace("<< "+packet.name(), "addr", from, "err", err) - return err -} - -func decodePacket(buf []byte) (packet, encPubkey, []byte, error) { - if len(buf) < headSize+1 { - return nil, encPubkey{}, nil, errPacketTooSmall - } - hash, sig, sigdata := buf[:macSize], buf[macSize:headSize], buf[headSize:] - shouldhash := crypto.Keccak256(buf[macSize:]) - if !bytes.Equal(hash, shouldhash) { - return nil, encPubkey{}, nil, errBadHash - } - fromKey, err := recoverNodeKey(crypto.Keccak256(buf[headSize:]), sig) - if err != nil { - return nil, fromKey, hash, err - } - - var req packet - switch ptype := sigdata[0]; ptype { - case pingPacket: - req = new(ping) - case pongPacket: - req = new(pong) - case findnodePacket: - req = new(findnode) - case neighborsPacket: - req = new(neighbors) - default: - return nil, fromKey, hash, fmt.Errorf("unknown type: %d", ptype) - } - s := rlp.NewStream(bytes.NewReader(sigdata[1:]), 0) - err = s.Decode(req) - return req, fromKey, hash, err -} - -func (req *ping) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error { - if expired(req.Expiration) { - return errExpired - } - key, err := decodePubkey(fromKey) - if err != nil { - return fmt.Errorf("invalid public key: %v", err) - } - t.send(from, pongPacket, &pong{ - To: makeEndpoint(from, req.From.TCP), - ReplyTok: mac, - Expiration: uint64(time.Now().Add(expiration).Unix()), - }) - n := wrapNode(enode.NewV4(key, from.IP, int(req.From.TCP), from.Port)) - t.handleReply(n.ID(), pingPacket, req) - if time.Since(t.db.LastPongReceived(n.ID())) > bondExpiration { - t.sendPing(n.ID(), from, func() { t.addThroughPing(n) }) - } else { - t.addThroughPing(n) - } - t.db.UpdateLastPingReceived(n.ID(), time.Now()) - return nil -} - -func (req *ping) name() string { return "PING/v4" } - -func (req *pong) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error { - if expired(req.Expiration) { - return errExpired - } - fromID := fromKey.id() - if !t.handleReply(fromID, pongPacket, req) { - return errUnsolicitedReply - } - t.db.UpdateLastPongReceived(fromID, time.Now()) - return nil -} - -func (req *pong) name() string { return "PONG/v4" } - -func (req *findnode) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error { - if expired(req.Expiration) { - return errExpired - } - fromID := fromKey.id() - if time.Since(t.db.LastPongReceived(fromID)) > bondExpiration { - // No endpoint proof pong exists, we don't process the packet. This prevents an - // attack vector where the discovery protocol could be used to amplify traffic in a - // DDOS attack. A malicious actor would send a findnode request with the IP address - // and UDP port of the target as the source address. The recipient of the findnode - // packet would then send a neighbors packet (which is a much bigger packet than - // findnode) to the victim. - return errUnknownNode - } - target := enode.ID(crypto.Keccak256Hash(req.Target[:])) - t.mutex.Lock() - closest := t.closest(target, bucketSize).entries - t.mutex.Unlock() - - p := neighbors{Expiration: uint64(time.Now().Add(expiration).Unix())} - var sent bool - // Send neighbors in chunks with at most maxNeighbors per packet - // to stay below the 1280 byte limit. - for _, n := range closest { - if netutil.CheckRelayIP(from.IP, n.IP()) == nil { - p.Nodes = append(p.Nodes, nodeToRPC(n)) - } - if len(p.Nodes) == maxNeighbors { - t.send(from, neighborsPacket, &p) - p.Nodes = p.Nodes[:0] - sent = true - } - } - if len(p.Nodes) > 0 || !sent { - t.send(from, neighborsPacket, &p) - } - return nil -} - -func (req *findnode) name() string { return "FINDNODE/v4" } - -func (req *neighbors) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error { - if expired(req.Expiration) { - return errExpired - } - if !t.handleReply(fromKey.id(), neighborsPacket, req) { - return errUnsolicitedReply - } - return nil -} - -func (req *neighbors) name() string { return "NEIGHBORS/v4" } - -func expired(ts uint64) bool { - return time.Unix(int64(ts), 0).Before(time.Now()) -} diff --git a/p2p/discover/udp_test.go b/p2p/discover/udp_test.go deleted file mode 100644 index da95c4f5c42a..000000000000 --- a/p2p/discover/udp_test.go +++ /dev/null @@ -1,566 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package discover - -import ( - "bytes" - "crypto/ecdsa" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "io" - "math/rand" - "net" - "path/filepath" - "reflect" - "runtime" - "sync" - "testing" - "time" - - "github.com/davecgh/go-spew/spew" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/rlp" -) - -func init() { - spew.Config.DisableMethods = true -} - -// shared test variables -var ( - futureExp = uint64(time.Now().Add(10 * time.Hour).Unix()) - testTarget = encPubkey{0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1} - testRemote = rpcEndpoint{IP: net.ParseIP("1.1.1.1").To4(), UDP: 1, TCP: 2} - testLocalAnnounced = rpcEndpoint{IP: net.ParseIP("2.2.2.2").To4(), UDP: 3, TCP: 4} - testLocal = rpcEndpoint{IP: net.ParseIP("3.3.3.3").To4(), UDP: 5, TCP: 6} -) - -type udpTest struct { - t *testing.T - pipe *dgramPipe - table *Table - udp *udp - sent [][]byte - localkey, remotekey *ecdsa.PrivateKey - remoteaddr *net.UDPAddr -} - -func newUDPTest(t *testing.T) *udpTest { - test := &udpTest{ - t: t, - pipe: newpipe(), - localkey: newkey(), - remotekey: newkey(), - remoteaddr: &net.UDPAddr{IP: net.IP{10, 0, 1, 99}, Port: 30303}, - } - test.table, test.udp, _ = newUDP(test.pipe, Config{PrivateKey: test.localkey}) - // Wait for initial refresh so the table doesn't send unexpected findnode. - <-test.table.initDone - return test -} - -// handles a packet as if it had been sent to the transport. -func (test *udpTest) packetIn(wantError error, ptype byte, data packet) error { - enc, _, err := encodePacket(test.remotekey, ptype, data) - if err != nil { - return test.errorf("packet (%d) encode error: %v", ptype, err) - } - test.sent = append(test.sent, enc) - if err = test.udp.handlePacket(test.remoteaddr, enc); err != wantError { - return test.errorf("error mismatch: got %q, want %q", err, wantError) - } - return nil -} - -// waits for a packet to be sent by the transport. -// validate should have type func(*udpTest, X) error, where X is a packet type. -func (test *udpTest) waitPacketOut(validate interface{}) ([]byte, error) { - dgram := test.pipe.waitPacketOut() - p, _, hash, err := decodePacket(dgram) - if err != nil { - return hash, test.errorf("sent packet decode error: %v", err) - } - fn := reflect.ValueOf(validate) - exptype := fn.Type().In(0) - if reflect.TypeOf(p) != exptype { - return hash, test.errorf("sent packet type mismatch, got: %v, want: %v", reflect.TypeOf(p), exptype) - } - fn.Call([]reflect.Value{reflect.ValueOf(p)}) - return hash, nil -} - -func (test *udpTest) errorf(format string, args ...interface{}) error { - _, file, line, ok := runtime.Caller(2) // errorf + waitPacketOut - if ok { - file = filepath.Base(file) - } else { - file = "???" - line = 1 - } - err := fmt.Errorf(format, args...) - fmt.Printf("\t%s:%d: %v\n", file, line, err) - test.t.Fail() - return err -} - -func TestUDP_packetErrors(t *testing.T) { - test := newUDPTest(t) - defer test.table.Close() - - test.packetIn(errExpired, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4}) - test.packetIn(errUnsolicitedReply, pongPacket, &pong{ReplyTok: []byte{}, Expiration: futureExp}) - test.packetIn(errUnknownNode, findnodePacket, &findnode{Expiration: futureExp}) - test.packetIn(errUnsolicitedReply, neighborsPacket, &neighbors{Expiration: futureExp}) -} - -func TestUDP_pingTimeout(t *testing.T) { - t.Parallel() - test := newUDPTest(t) - defer test.table.Close() - - toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222} - toid := enode.ID{1, 2, 3, 4} - if err := test.udp.ping(toid, toaddr); err != errTimeout { - t.Error("expected timeout error, got", err) - } -} - -func TestUDP_responseTimeouts(t *testing.T) { - t.Parallel() - test := newUDPTest(t) - defer test.table.Close() - - rand.Seed(time.Now().UnixNano()) - randomDuration := func(max time.Duration) time.Duration { - return time.Duration(rand.Int63n(int64(max))) - } - - var ( - nReqs = 200 - nTimeouts = 0 // number of requests with ptype > 128 - nilErr = make(chan error, nReqs) // for requests that get a reply - timeoutErr = make(chan error, nReqs) // for requests that time out - ) - for i := 0; i < nReqs; i++ { - // Create a matcher for a random request in udp.loop. Requests - // with ptype <= 128 will not get a reply and should time out. - // For all other requests, a reply is scheduled to arrive - // within the timeout window. - p := &pending{ - ptype: byte(rand.Intn(255)), - callback: func(interface{}) bool { return true }, - } - binary.BigEndian.PutUint64(p.from[:], uint64(i)) - if p.ptype <= 128 { - p.errc = timeoutErr - test.udp.addpending <- p - nTimeouts++ - } else { - p.errc = nilErr - test.udp.addpending <- p - time.AfterFunc(randomDuration(60*time.Millisecond), func() { - if !test.udp.handleReply(p.from, p.ptype, nil) { - t.Logf("not matched: %v", p) - } - }) - } - time.Sleep(randomDuration(30 * time.Millisecond)) - } - - // Check that all timeouts were delivered and that the rest got nil errors. - // The replies must be delivered. - var ( - recvDeadline = time.After(20 * time.Second) - nTimeoutsRecv, nNil = 0, 0 - ) - for i := 0; i < nReqs; i++ { - select { - case err := <-timeoutErr: - if err != errTimeout { - t.Fatalf("got non-timeout error on timeoutErr %d: %v", i, err) - } - nTimeoutsRecv++ - case err := <-nilErr: - if err != nil { - t.Fatalf("got non-nil error on nilErr %d: %v", i, err) - } - nNil++ - case <-recvDeadline: - t.Fatalf("exceeded recv deadline") - } - } - if nTimeoutsRecv != nTimeouts { - t.Errorf("wrong number of timeout errors received: got %d, want %d", nTimeoutsRecv, nTimeouts) - } - if nNil != nReqs-nTimeouts { - t.Errorf("wrong number of successful replies: got %d, want %d", nNil, nReqs-nTimeouts) - } -} - -func TestUDP_findnodeTimeout(t *testing.T) { - t.Parallel() - test := newUDPTest(t) - defer test.table.Close() - - toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222} - toid := enode.ID{1, 2, 3, 4} - target := encPubkey{4, 5, 6, 7} - result, err := test.udp.findnode(toid, toaddr, target) - if err != errTimeout { - t.Error("expected timeout error, got", err) - } - if len(result) > 0 { - t.Error("expected empty result, got", result) - } -} - -func TestUDP_findnode(t *testing.T) { - test := newUDPTest(t) - defer test.table.Close() - - // put a few nodes into the table. their exact - // distribution shouldn't matter much, although we need to - // take care not to overflow any bucket. - nodes := &nodesByDistance{target: testTarget.id()} - for i := 0; i < bucketSize; i++ { - key := newkey() - n := wrapNode(enode.NewV4(&key.PublicKey, net.IP{10, 13, 0, 1}, 0, i)) - nodes.push(n, bucketSize) - } - test.table.stuff(nodes.entries) - - // ensure there's a bond with the test node, - // findnode won't be accepted otherwise. - remoteID := encodePubkey(&test.remotekey.PublicKey).id() - test.table.db.UpdateLastPongReceived(remoteID, time.Now()) - - // check that closest neighbors are returned. - test.packetIn(nil, findnodePacket, &findnode{Target: testTarget, Expiration: futureExp}) - expected := test.table.closest(testTarget.id(), bucketSize) - - waitNeighbors := func(want []*node) { - test.waitPacketOut(func(p *neighbors) { - if len(p.Nodes) != len(want) { - t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize) - } - for i := range p.Nodes { - if p.Nodes[i].ID.id() != want[i].ID() { - t.Errorf("result mismatch at %d:\n got: %v\n want: %v", i, p.Nodes[i], expected.entries[i]) - } - } - }) - } - waitNeighbors(expected.entries[:maxNeighbors]) - waitNeighbors(expected.entries[maxNeighbors:]) -} - -func TestUDP_findnodeMultiReply(t *testing.T) { - test := newUDPTest(t) - defer test.table.Close() - - rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey) - test.table.db.UpdateLastPingReceived(rid, time.Now()) - - // queue a pending findnode request - resultc, errc := make(chan []*node), make(chan error) - go func() { - rid := encodePubkey(&test.remotekey.PublicKey).id() - ns, err := test.udp.findnode(rid, test.remoteaddr, testTarget) - if err != nil && len(ns) == 0 { - errc <- err - } else { - resultc <- ns - } - }() - - // wait for the findnode to be sent. - // after it is sent, the transport is waiting for a reply - test.waitPacketOut(func(p *findnode) { - if p.Target != testTarget { - t.Errorf("wrong target: got %v, want %v", p.Target, testTarget) - } - }) - - // send the reply as two packets. - list := []*node{ - wrapNode(enode.MustParseV4("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30303?discport=30304")), - wrapNode(enode.MustParseV4("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30303")), - wrapNode(enode.MustParseV4("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30301?discport=17")), - wrapNode(enode.MustParseV4("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30303")), - } - rpclist := make([]rpcNode, len(list)) - for i := range list { - rpclist[i] = nodeToRPC(list[i]) - } - test.packetIn(nil, neighborsPacket, &neighbors{Expiration: futureExp, Nodes: rpclist[:2]}) - test.packetIn(nil, neighborsPacket, &neighbors{Expiration: futureExp, Nodes: rpclist[2:]}) - - // check that the sent neighbors are all returned by findnode - select { - case result := <-resultc: - want := append(list[:2], list[3:]...) - if !reflect.DeepEqual(result, want) { - t.Errorf("neighbors mismatch:\n got: %v\n want: %v", result, want) - } - case err := <-errc: - t.Errorf("findnode error: %v", err) - case <-time.After(5 * time.Second): - t.Error("findnode did not return within 5 seconds") - } -} - -func TestUDP_successfulPing(t *testing.T) { - test := newUDPTest(t) - added := make(chan *node, 1) - test.table.nodeAddedHook = func(n *node) { added <- n } - defer test.table.Close() - - // The remote side sends a ping packet to initiate the exchange. - go test.packetIn(nil, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp}) - - // the ping is replied to. - test.waitPacketOut(func(p *pong) { - pinghash := test.sent[0][:macSize] - if !bytes.Equal(p.ReplyTok, pinghash) { - t.Errorf("got pong.ReplyTok %x, want %x", p.ReplyTok, pinghash) - } - wantTo := rpcEndpoint{ - // The mirrored UDP address is the UDP packet sender - IP: test.remoteaddr.IP, UDP: uint16(test.remoteaddr.Port), - // The mirrored TCP port is the one from the ping packet - TCP: testRemote.TCP, - } - if !reflect.DeepEqual(p.To, wantTo) { - t.Errorf("got pong.To %v, want %v", p.To, wantTo) - } - }) - - // remote is unknown, the table pings back. - hash, _ := test.waitPacketOut(func(p *ping) error { - if !reflect.DeepEqual(p.From, test.udp.ourEndpoint) { - t.Errorf("got ping.From %v, want %v", p.From, test.udp.ourEndpoint) - } - wantTo := rpcEndpoint{ - // The mirrored UDP address is the UDP packet sender. - IP: test.remoteaddr.IP, UDP: uint16(test.remoteaddr.Port), - TCP: 0, - } - if !reflect.DeepEqual(p.To, wantTo) { - t.Errorf("got ping.To %v, want %v", p.To, wantTo) - } - return nil - }) - test.packetIn(nil, pongPacket, &pong{ReplyTok: hash, Expiration: futureExp}) - - // the node should be added to the table shortly after getting the - // pong packet. - select { - case n := <-added: - rid := encodePubkey(&test.remotekey.PublicKey).id() - if n.ID() != rid { - t.Errorf("node has wrong ID: got %v, want %v", n.ID(), rid) - } - if !n.IP().Equal(test.remoteaddr.IP) { - t.Errorf("node has wrong IP: got %v, want: %v", n.IP(), test.remoteaddr.IP) - } - if int(n.UDP()) != test.remoteaddr.Port { - t.Errorf("node has wrong UDP port: got %v, want: %v", n.UDP(), test.remoteaddr.Port) - } - if n.TCP() != int(testRemote.TCP) { - t.Errorf("node has wrong TCP port: got %v, want: %v", n.TCP(), testRemote.TCP) - } - case <-time.After(2 * time.Second): - t.Errorf("node was not added within 2 seconds") - } -} - -var testPackets = []struct { - input string - wantPacket interface{} -}{ - { - input: "71dbda3a79554728d4f94411e42ee1f8b0d561c10e1e5f5893367948c6a7d70bb87b235fa28a77070271b6c164a2dce8c7e13a5739b53b5e96f2e5acb0e458a02902f5965d55ecbeb2ebb6cabb8b2b232896a36b737666c55265ad0a68412f250001ea04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a355", - wantPacket: &ping{ - Version: 4, - From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, - To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, - Expiration: 1136239445, - Rest: []rlp.RawValue{}, - }, - }, - { - input: "e9614ccfd9fc3e74360018522d30e1419a143407ffcce748de3e22116b7e8dc92ff74788c0b6663aaa3d67d641936511c8f8d6ad8698b820a7cf9e1be7155e9a241f556658c55428ec0563514365799a4be2be5a685a80971ddcfa80cb422cdd0101ec04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a3550102", - wantPacket: &ping{ - Version: 4, - From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, - To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0x01}, {0x02}}, - }, - }, - { - input: "577be4349c4dd26768081f58de4c6f375a7a22f3f7adda654d1428637412c3d7fe917cadc56d4e5e7ffae1dbe3efffb9849feb71b262de37977e7c7a44e677295680e9e38ab26bee2fcbae207fba3ff3d74069a50b902a82c9903ed37cc993c50001f83e82022bd79020010db83c4d001500000000abcdef12820cfa8215a8d79020010db885a308d313198a2e037073488208ae82823a8443b9a355c5010203040531b9019afde696e582a78fa8d95ea13ce3297d4afb8ba6433e4154caa5ac6431af1b80ba76023fa4090c408f6b4bc3701562c031041d4702971d102c9ab7fa5eed4cd6bab8f7af956f7d565ee1917084a95398b6a21eac920fe3dd1345ec0a7ef39367ee69ddf092cbfe5b93e5e568ebc491983c09c76d922dc3", - wantPacket: &ping{ - Version: 555, - From: rpcEndpoint{net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), 3322, 5544}, - To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0xC5, 0x01, 0x02, 0x03, 0x04, 0x05}}, - }, - }, - { - input: "09b2428d83348d27cdf7064ad9024f526cebc19e4958f0fdad87c15eb598dd61d08423e0bf66b2069869e1724125f820d851c136684082774f870e614d95a2855d000f05d1648b2d5945470bc187c2d2216fbe870f43ed0909009882e176a46b0102f846d79020010db885a308d313198a2e037073488208ae82823aa0fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c9548443b9a355c6010203c2040506a0c969a58f6f9095004c0177a6b47f451530cab38966a25cca5cb58f055542124e", - wantPacket: &pong{ - To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, - ReplyTok: common.Hex2Bytes("fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c954"), - Expiration: 1136239445, - Rest: []rlp.RawValue{{0xC6, 0x01, 0x02, 0x03, 0xC2, 0x04, 0x05}, {0x06}}, - }, - }, - { - input: "c7c44041b9f7c7e41934417ebac9a8e1a4c6298f74553f2fcfdcae6ed6fe53163eb3d2b52e39fe91831b8a927bf4fc222c3902202027e5e9eb812195f95d20061ef5cd31d502e47ecb61183f74a504fe04c51e73df81f25c4d506b26db4517490103f84eb840ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f8443b9a35582999983999999280dc62cc8255c73471e0a61da0c89acdc0e035e260add7fc0c04ad9ebf3919644c91cb247affc82b69bd2ca235c71eab8e49737c937a2c396", - wantPacket: &findnode{ - Target: hexEncPubkey("ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f"), - Expiration: 1136239445, - Rest: []rlp.RawValue{{0x82, 0x99, 0x99}, {0x83, 0x99, 0x99, 0x99}}, - }, - }, - { - input: "c679fc8fe0b8b12f06577f2e802d34f6fa257e6137a995f6f4cbfc9ee50ed3710faf6e66f932c4c8d81d64343f429651328758b47d3dbc02c4042f0fff6946a50f4a49037a72bb550f3a7872363a83e1b9ee6469856c24eb4ef80b7535bcf99c0004f9015bf90150f84d846321163782115c82115db8403155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32f84984010203040101b840312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069dbf8599020010db83c4d001500000000abcdef12820d05820d05b84038643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aacf8599020010db885a308d313198a2e037073488203e78203e8b8408dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df738443b9a355010203b525a138aa34383fec3d2719a0", - wantPacket: &neighbors{ - Nodes: []rpcNode{ - { - ID: hexEncPubkey("3155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32"), - IP: net.ParseIP("99.33.22.55").To4(), - UDP: 4444, - TCP: 4445, - }, - { - ID: hexEncPubkey("312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069db"), - IP: net.ParseIP("1.2.3.4").To4(), - UDP: 1, - TCP: 1, - }, - { - ID: hexEncPubkey("38643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aac"), - IP: net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), - UDP: 3333, - TCP: 3333, - }, - { - ID: hexEncPubkey("8dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df73"), - IP: net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), - UDP: 999, - TCP: 1000, - }, - }, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0x01}, {0x02}, {0x03}}, - }, - }, -} - -func TestForwardCompatibility(t *testing.T) { - testkey, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - wantNodeKey := encodePubkey(&testkey.PublicKey) - - for _, test := range testPackets { - input, err := hex.DecodeString(test.input) - if err != nil { - t.Fatalf("invalid hex: %s", test.input) - } - packet, nodekey, _, err := decodePacket(input) - if err != nil { - t.Errorf("did not accept packet %s\n%v", test.input, err) - continue - } - if !reflect.DeepEqual(packet, test.wantPacket) { - t.Errorf("got %s\nwant %s", spew.Sdump(packet), spew.Sdump(test.wantPacket)) - } - if nodekey != wantNodeKey { - t.Errorf("got id %v\nwant id %v", nodekey, wantNodeKey) - } - } -} - -// dgramPipe is a fake UDP socket. It queues all sent datagrams. -type dgramPipe struct { - mu *sync.Mutex - cond *sync.Cond - closing chan struct{} - closed bool - queue [][]byte -} - -func newpipe() *dgramPipe { - mu := new(sync.Mutex) - return &dgramPipe{ - closing: make(chan struct{}), - cond: &sync.Cond{L: mu}, - mu: mu, - } -} - -// WriteToUDP queues a datagram. -func (c *dgramPipe) WriteToUDP(b []byte, to *net.UDPAddr) (n int, err error) { - msg := make([]byte, len(b)) - copy(msg, b) - c.mu.Lock() - defer c.mu.Unlock() - if c.closed { - return 0, errors.New("closed") - } - c.queue = append(c.queue, msg) - c.cond.Signal() - return len(b), nil -} - -// ReadFromUDP just hangs until the pipe is closed. -func (c *dgramPipe) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { - <-c.closing - return 0, nil, io.EOF -} - -func (c *dgramPipe) Close() error { - c.mu.Lock() - defer c.mu.Unlock() - if !c.closed { - close(c.closing) - c.closed = true - } - return nil -} - -func (c *dgramPipe) LocalAddr() net.Addr { - return &net.UDPAddr{IP: testLocal.IP, Port: int(testLocal.UDP)} -} - -func (c *dgramPipe) waitPacketOut() []byte { - c.mu.Lock() - defer c.mu.Unlock() - for len(c.queue) == 0 { - c.cond.Wait() - } - p := c.queue[0] - copy(c.queue, c.queue[1:]) - c.queue = c.queue[:len(c.queue)-1] - return p -} diff --git a/p2p/discover/v4_udp.go b/p2p/discover/v4_udp.go new file mode 100644 index 000000000000..a8f7101b0594 --- /dev/null +++ b/p2p/discover/v4_udp.go @@ -0,0 +1,1037 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package discover + +import ( + "bytes" + "container/list" + "crypto/ecdsa" + crand "crypto/rand" + "errors" + "fmt" + "io" + "net" + "sync" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/netutil" + "github.com/ethereum/go-ethereum/rlp" +) + +// Errors +var ( + errPacketTooSmall = errors.New("too small") + errBadHash = errors.New("bad hash") + errExpired = errors.New("expired") + errUnsolicitedReply = errors.New("unsolicited reply") + errUnknownNode = errors.New("unknown node") + errTimeout = errors.New("RPC timeout") + errClockWarp = errors.New("reply deadline too far in the future") + errClosed = errors.New("socket closed") +) + +const ( + respTimeout = 500 * time.Millisecond + expiration = 20 * time.Second + bondExpiration = 24 * time.Hour + + maxFindnodeFailures = 5 // nodes exceeding this limit are dropped + ntpFailureThreshold = 32 // Continuous timeouts after which to check NTP + ntpWarningCooldown = 10 * time.Minute // Minimum amount of time to pass before repeating NTP warning + driftThreshold = 10 * time.Second // Allowed clock drift before warning user + + // Discovery packets are defined to be no larger than 1280 bytes. + // Packets larger than this size will be cut at the end and treated + // as invalid because their hash won't match. + maxPacketSize = 1280 +) + +// RPC packet types +const ( + p_pingV4 = iota + 1 // zero is 'reserved' + p_pongV4 + p_findnodeV4 + p_neighborsV4 + p_enrRequestV4 + p_enrResponseV4 +) + +// RPC request structures +type ( + pingV4 struct { + senderKey *ecdsa.PublicKey // filled in by preverify + + Version uint + From, To rpcEndpoint + Expiration uint64 + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // pongV4 is the reply to pingV4. + pongV4 struct { + // This field should mirror the UDP envelope address + // of the ping packet, which provides a way to discover the + // the external address (after NAT). + To rpcEndpoint + + ReplyTok []byte // This contains the hash of the ping packet. + Expiration uint64 // Absolute timestamp at which the packet becomes invalid. + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // findnodeV4 is a query for nodes close to the given target. + findnodeV4 struct { + Target encPubkey + Expiration uint64 + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // neighborsV4 is the reply to findnodeV4. + neighborsV4 struct { + Nodes []rpcNode + Expiration uint64 + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // enrRequestV4 queries for the remote node's record. + enrRequestV4 struct { + Expiration uint64 + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // enrResponseV4 is the reply to enrRequestV4. + enrResponseV4 struct { + ReplyTok []byte // Hash of the enrRequest packet. + Record enr.Record + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + rpcNode struct { + IP net.IP // len 4 for IPv4 or 16 for IPv6 + UDP uint16 // for discovery protocol + TCP uint16 // for RLPx protocol + ID encPubkey + } + + rpcEndpoint struct { + IP net.IP // len 4 for IPv4 or 16 for IPv6 + UDP uint16 // for discovery protocol + TCP uint16 // for RLPx protocol + } +) + +// packetV4 is implemented by all v4 protocol messages. +type packetV4 interface { + // preverify checks whether the packet is valid and should be handled at all. + preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error + // handle handles the packet. + handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) + // packet name and type for logging purposes. + name() string + kind() byte +} + +func makeEndpoint(addr *net.UDPAddr, tcpPort uint16) rpcEndpoint { + ip := net.IP{} + if ip4 := addr.IP.To4(); ip4 != nil { + ip = ip4 + } else if ip6 := addr.IP.To16(); ip6 != nil { + ip = ip6 + } + return rpcEndpoint{IP: ip, UDP: uint16(addr.Port), TCP: tcpPort} +} + +func (t *UDPv4) nodeFromRPC(sender *net.UDPAddr, rn rpcNode) (*node, error) { + if rn.UDP <= 1024 { + return nil, errors.New("low port") + } + if err := netutil.CheckRelayIP(sender.IP, rn.IP); err != nil { + return nil, err + } + if t.netrestrict != nil && !t.netrestrict.Contains(rn.IP) { + return nil, errors.New("not contained in netrestrict whitelist") + } + key, err := decodePubkey(rn.ID) + if err != nil { + return nil, err + } + n := wrapNode(enode.NewV4(key, rn.IP, int(rn.TCP), int(rn.UDP))) + err = n.ValidateComplete() + return n, err +} + +func nodeToRPC(n *node) rpcNode { + var key ecdsa.PublicKey + var ekey encPubkey + if err := n.Load((*enode.Secp256k1)(&key)); err == nil { + ekey = encodePubkey(&key) + } + return rpcNode{ID: ekey, IP: n.IP(), UDP: uint16(n.UDP()), TCP: uint16(n.TCP())} +} + +// UDPv4 implements the v4 wire protocol. +type UDPv4 struct { + conn UDPConn + log log.Logger + netrestrict *netutil.Netlist + priv *ecdsa.PrivateKey + localNode *enode.LocalNode + db *enode.DB + tab *Table + closeOnce sync.Once + wg sync.WaitGroup + + addReplyMatcher chan *replyMatcher + gotreply chan reply + closing chan struct{} +} + +// replyMatcher represents a pending reply. +// +// Some implementations of the protocol wish to send more than one +// reply packet to findnode. In general, any neighbors packet cannot +// be matched up with a specific findnode packet. +// +// Our implementation handles this by storing a callback function for +// each pending reply. Incoming packets from a node are dispatched +// to all callback functions for that node. +type replyMatcher struct { + // these fields must match in the reply. + from enode.ID + ip net.IP + ptype byte + + // time when the request must complete + deadline time.Time + + // callback is called when a matching reply arrives. If it returns matched == true, the + // reply was acceptable. The second return value indicates whether the callback should + // be removed from the pending reply queue. If it returns false, the reply is considered + // incomplete and the callback will be invoked again for the next matching reply. + callback replyMatchFunc + + // errc receives nil when the callback indicates completion or an + // error if no further reply is received within the timeout. + errc chan error + + // reply contains the most recent reply. This field is safe for reading after errc has + // received a value. + reply packetV4 +} + +type replyMatchFunc func(interface{}) (matched bool, requestDone bool) + +// reply is a reply packet from a certain node. +type reply struct { + from enode.ID + ip net.IP + data packetV4 + // loop indicates whether there was + // a matching request by sending on this channel. + matched chan<- bool +} + +func ListenV4(c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { + t := &UDPv4{ + conn: c, + priv: cfg.PrivateKey, + netrestrict: cfg.NetRestrict, + localNode: ln, + db: ln.Database(), + closing: make(chan struct{}), + gotreply: make(chan reply), + addReplyMatcher: make(chan *replyMatcher), + log: cfg.Log, + } + if t.log == nil { + t.log = log.Root() + } + tab, err := newTable(t, ln.Database(), cfg.Bootnodes, t.log) + if err != nil { + return nil, err + } + t.tab = tab + go tab.loop() + + t.wg.Add(2) + go t.loop() + go t.readLoop(cfg.Unhandled) + return t, nil +} + +// Self returns the local node. +func (t *UDPv4) Self() *enode.Node { + return t.localNode.Node() +} + +// Close shuts down the socket and aborts any running queries. +func (t *UDPv4) Close() { + t.closeOnce.Do(func() { + close(t.closing) + t.conn.Close() + t.wg.Wait() + t.tab.close() + }) +} + +// ReadRandomNodes reads random nodes from the local table. +func (t *UDPv4) ReadRandomNodes(buf []*enode.Node) int { + return t.tab.ReadRandomNodes(buf) +} + +// LookupRandom finds random nodes in the network. +func (t *UDPv4) LookupRandom() []*enode.Node { + if t.tab.len() == 0 { + // All nodes were dropped, refresh. The very first query will hit this + // case and run the bootstrapping logic. + <-t.tab.refresh() + } + return t.lookupRandom() +} + +func (t *UDPv4) LookupPubkey(key *ecdsa.PublicKey) []*enode.Node { + if t.tab.len() == 0 { + // All nodes were dropped, refresh. The very first query will hit this + // case and run the bootstrapping logic. + <-t.tab.refresh() + } + return unwrapNodes(t.lookup(encodePubkey(key))) +} + +func (t *UDPv4) lookupRandom() []*enode.Node { + var target encPubkey + crand.Read(target[:]) + return unwrapNodes(t.lookup(target)) +} + +func (t *UDPv4) lookupSelf() []*enode.Node { + return unwrapNodes(t.lookup(encodePubkey(&t.priv.PublicKey))) +} + +// lookup performs a network search for nodes close to the given target. It approaches the +// target by querying nodes that are closer to it on each iteration. The given target does +// not need to be an actual node identifier. +func (t *UDPv4) lookup(targetKey encPubkey) []*node { + var ( + target = enode.ID(crypto.Keccak256Hash(targetKey[:])) + asked = make(map[enode.ID]bool) + seen = make(map[enode.ID]bool) + reply = make(chan []*node, alpha) + pendingQueries = 0 + result *nodesByDistance + ) + // Don't query further if we hit ourself. + // Unlikely to happen often in practice. + asked[t.Self().ID()] = true + + // Generate the initial result set. + t.tab.mutex.Lock() + result = t.tab.closest(target, bucketSize, false) + t.tab.mutex.Unlock() + + for { + // ask the alpha closest nodes that we haven't asked yet + for i := 0; i < len(result.entries) && pendingQueries < alpha; i++ { + n := result.entries[i] + if !asked[n.ID()] { + asked[n.ID()] = true + pendingQueries++ + go t.lookupWorker(n, targetKey, reply) + } + } + if pendingQueries == 0 { + // we have asked all closest nodes, stop the search + break + } + select { + case nodes := <-reply: + for _, n := range nodes { + if n != nil && !seen[n.ID()] { + seen[n.ID()] = true + result.push(n, bucketSize) + } + } + case <-t.tab.closeReq: + return nil // shutdown, no need to continue. + } + pendingQueries-- + } + return result.entries +} + +func (t *UDPv4) lookupWorker(n *node, targetKey encPubkey, reply chan<- []*node) { + fails := t.db.FindFails(n.ID(), n.IP()) + r, err := t.findnode(n.ID(), n.addr(), targetKey) + if err == errClosed { + // Avoid recording failures on shutdown. + reply <- nil + return + } else if len(r) == 0 { + fails++ + t.db.UpdateFindFails(n.ID(), n.IP(), fails) + t.log.Trace("Findnode failed", "id", n.ID(), "failcount", fails, "err", err) + if fails >= maxFindnodeFailures { + t.log.Trace("Too many findnode failures, dropping", "id", n.ID(), "failcount", fails) + t.tab.delete(n) + } + } else if fails > 0 { + // Reset failure counter because it counts _consecutive_ failures. + t.db.UpdateFindFails(n.ID(), n.IP(), 0) + } + + // Grab as many nodes as possible. Some of them might not be alive anymore, but we'll + // just remove those again during revalidation. + for _, n := range r { + t.tab.addSeenNode(n) + } + reply <- r +} + +// Resolve searches for a specific node with the given ID and tries to get the most recent +// version of the node record for it. It returns n if the node could not be resolved. +func (t *UDPv4) Resolve(n *enode.Node) *enode.Node { + // Try asking directly. This works if the node is still responding on the endpoint we have. + if rn, err := t.RequestENR(n); err == nil { + return rn + } + // Check table for the ID, we might have a newer version there. + if intable := t.tab.getNode(n.ID()); intable != nil && intable.Seq() > n.Seq() { + n = intable + if rn, err := t.RequestENR(n); err == nil { + return rn + } + } + // Otherwise perform a network lookup. + var key enode.Secp256k1 + if n.Load(&key) != nil { + return n // no secp256k1 key + } + result := t.LookupPubkey((*ecdsa.PublicKey)(&key)) + for _, rn := range result { + if rn.ID() == n.ID() { + if rn, err := t.RequestENR(rn); err == nil { + return rn + } + } + } + return n +} + +func (t *UDPv4) ourEndpoint() rpcEndpoint { + n := t.Self() + a := &net.UDPAddr{IP: n.IP(), Port: n.UDP()} + return makeEndpoint(a, uint16(n.TCP())) +} + +// Ping sends a ping message to the given node. +func (t *UDPv4) Ping(n *enode.Node) error { + _, err := t.ping(n) + return err +} + +// ping sends a ping message to the given node and waits for a reply. +func (t *UDPv4) ping(n *enode.Node) (seq uint64, err error) { + rm := t.sendPing(n.ID(), &net.UDPAddr{IP: n.IP(), Port: n.UDP()}, nil) + if err = <-rm.errc; err == nil { + seq = seqFromTail(rm.reply.(*pongV4).Rest) + } + return seq, err +} + +// sendPing sends a ping message to the given node and invokes the callback +// when the reply arrives. +func (t *UDPv4) sendPing(toid enode.ID, toaddr *net.UDPAddr, callback func()) *replyMatcher { + req := t.makePing(toaddr) + packet, hash, err := t.encode(t.priv, req) + if err != nil { + errc := make(chan error, 1) + errc <- err + return &replyMatcher{errc: errc} + } + // Add a matcher for the reply to the pending reply queue. Pongs are matched if they + // reference the ping we're about to send. + rm := t.pending(toid, toaddr.IP, p_pongV4, func(p interface{}) (matched bool, requestDone bool) { + matched = bytes.Equal(p.(*pongV4).ReplyTok, hash) + if matched && callback != nil { + callback() + } + return matched, matched + }) + // Send the packet. + t.localNode.UDPContact(toaddr) + t.write(toaddr, toid, req.name(), packet) + return rm +} + +func (t *UDPv4) makePing(toaddr *net.UDPAddr) *pingV4 { + seq, _ := rlp.EncodeToBytes(t.localNode.Node().Seq()) + return &pingV4{ + Version: 4, + From: t.ourEndpoint(), + To: makeEndpoint(toaddr, 0), + Expiration: uint64(time.Now().Add(expiration).Unix()), + Rest: []rlp.RawValue{seq}, + } +} + +// findnode sends a findnode request to the given node and waits until +// the node has sent up to k neighbors. +func (t *UDPv4) findnode(toid enode.ID, toaddr *net.UDPAddr, target encPubkey) ([]*node, error) { + t.ensureBond(toid, toaddr) + + // Add a matcher for 'neighbours' replies to the pending reply queue. The matcher is + // active until enough nodes have been received. + nodes := make([]*node, 0, bucketSize) + nreceived := 0 + rm := t.pending(toid, toaddr.IP, p_neighborsV4, func(r interface{}) (matched bool, requestDone bool) { + reply := r.(*neighborsV4) + for _, rn := range reply.Nodes { + nreceived++ + n, err := t.nodeFromRPC(toaddr, rn) + if err != nil { + t.log.Trace("Invalid neighbor node received", "ip", rn.IP, "addr", toaddr, "err", err) + continue + } + nodes = append(nodes, n) + } + return true, nreceived >= bucketSize + }) + t.send(toaddr, toid, &findnodeV4{ + Target: target, + Expiration: uint64(time.Now().Add(expiration).Unix()), + }) + return nodes, <-rm.errc +} + +// RequestENR sends enrRequest to the given node and waits for a response. +func (t *UDPv4) RequestENR(n *enode.Node) (*enode.Node, error) { + addr := &net.UDPAddr{IP: n.IP(), Port: n.UDP()} + t.ensureBond(n.ID(), addr) + + req := &enrRequestV4{ + Expiration: uint64(time.Now().Add(expiration).Unix()), + } + packet, hash, err := t.encode(t.priv, req) + if err != nil { + return nil, err + } + // Add a matcher for the reply to the pending reply queue. Responses are matched if + // they reference the request we're about to send. + rm := t.pending(n.ID(), addr.IP, p_enrResponseV4, func(r interface{}) (matched bool, requestDone bool) { + matched = bytes.Equal(r.(*enrResponseV4).ReplyTok, hash) + return matched, matched + }) + // Send the packet and wait for the reply. + t.write(addr, n.ID(), req.name(), packet) + if err := <-rm.errc; err != nil { + return nil, err + } + // Verify the response record. + respN, err := enode.New(enode.ValidSchemes, &rm.reply.(*enrResponseV4).Record) + if err != nil { + return nil, err + } + if respN.ID() != n.ID() { + return nil, fmt.Errorf("invalid ID in response record") + } + if respN.Seq() < n.Seq() { + return n, nil // response record is older + } + if err := netutil.CheckRelayIP(addr.IP, respN.IP()); err != nil { + return nil, fmt.Errorf("invalid IP in response record: %v", err) + } + return respN, nil +} + +// pending adds a reply matcher to the pending reply queue. +// see the documentation of type replyMatcher for a detailed explanation. +func (t *UDPv4) pending(id enode.ID, ip net.IP, ptype byte, callback replyMatchFunc) *replyMatcher { + ch := make(chan error, 1) + p := &replyMatcher{from: id, ip: ip, ptype: ptype, callback: callback, errc: ch} + select { + case t.addReplyMatcher <- p: + // loop will handle it + case <-t.closing: + ch <- errClosed + } + return p +} + +// handleReply dispatches a reply packet, invoking reply matchers. It returns +// whether any matcher considered the packet acceptable. +func (t *UDPv4) handleReply(from enode.ID, fromIP net.IP, req packetV4) bool { + matched := make(chan bool, 1) + select { + case t.gotreply <- reply{from, fromIP, req, matched}: + // loop will handle it + return <-matched + case <-t.closing: + return false + } +} + +// loop runs in its own goroutine. it keeps track of +// the refresh timer and the pending reply queue. +func (t *UDPv4) loop() { + defer t.wg.Done() + + var ( + plist = list.New() + timeout = time.NewTimer(0) + nextTimeout *replyMatcher // head of plist when timeout was last reset + contTimeouts = 0 // number of continuous timeouts to do NTP checks + ntpWarnTime = time.Unix(0, 0) + ) + <-timeout.C // ignore first timeout + defer timeout.Stop() + + resetTimeout := func() { + if plist.Front() == nil || nextTimeout == plist.Front().Value { + return + } + // Start the timer so it fires when the next pending reply has expired. + now := time.Now() + for el := plist.Front(); el != nil; el = el.Next() { + nextTimeout = el.Value.(*replyMatcher) + if dist := nextTimeout.deadline.Sub(now); dist < 2*respTimeout { + timeout.Reset(dist) + return + } + // Remove pending replies whose deadline is too far in the + // future. These can occur if the system clock jumped + // backwards after the deadline was assigned. + nextTimeout.errc <- errClockWarp + plist.Remove(el) + } + nextTimeout = nil + timeout.Stop() + } + + for { + resetTimeout() + + select { + case <-t.closing: + for el := plist.Front(); el != nil; el = el.Next() { + el.Value.(*replyMatcher).errc <- errClosed + } + return + + case p := <-t.addReplyMatcher: + p.deadline = time.Now().Add(respTimeout) + plist.PushBack(p) + + case r := <-t.gotreply: + var matched bool // whether any replyMatcher considered the reply acceptable. + for el := plist.Front(); el != nil; el = el.Next() { + p := el.Value.(*replyMatcher) + if p.from == r.from && p.ptype == r.data.kind() && p.ip.Equal(r.ip) { + ok, requestDone := p.callback(r.data) + matched = matched || ok + // Remove the matcher if callback indicates that all replies have been received. + if requestDone { + p.reply = r.data + p.errc <- nil + plist.Remove(el) + } + // Reset the continuous timeout counter (time drift detection) + contTimeouts = 0 + } + } + r.matched <- matched + + case now := <-timeout.C: + nextTimeout = nil + + // Notify and remove callbacks whose deadline is in the past. + for el := plist.Front(); el != nil; el = el.Next() { + p := el.Value.(*replyMatcher) + if now.After(p.deadline) || now.Equal(p.deadline) { + p.errc <- errTimeout + plist.Remove(el) + contTimeouts++ + } + } + // If we've accumulated too many timeouts, do an NTP time sync check + if contTimeouts > ntpFailureThreshold { + if time.Since(ntpWarnTime) >= ntpWarningCooldown { + ntpWarnTime = time.Now() + go checkClockDrift() + } + contTimeouts = 0 + } + } + } +} + +const ( + macSize = 256 / 8 + sigSize = 520 / 8 + headSize = macSize + sigSize // space of packet frame data +) + +var ( + headSpace = make([]byte, headSize) + + // Neighbors replies are sent across multiple packets to + // stay below the packet size limit. We compute the maximum number + // of entries by stuffing a packet until it grows too large. + maxNeighbors int +) + +func init() { + p := neighborsV4{Expiration: ^uint64(0)} + maxSizeNode := rpcNode{IP: make(net.IP, 16), UDP: ^uint16(0), TCP: ^uint16(0)} + for n := 0; ; n++ { + p.Nodes = append(p.Nodes, maxSizeNode) + size, _, err := rlp.EncodeToReader(p) + if err != nil { + // If this ever happens, it will be caught by the unit tests. + panic("cannot encode: " + err.Error()) + } + if headSize+size+1 >= maxPacketSize { + maxNeighbors = n + break + } + } +} + +func (t *UDPv4) send(toaddr *net.UDPAddr, toid enode.ID, req packetV4) ([]byte, error) { + packet, hash, err := t.encode(t.priv, req) + if err != nil { + return hash, err + } + return hash, t.write(toaddr, toid, req.name(), packet) +} + +func (t *UDPv4) write(toaddr *net.UDPAddr, toid enode.ID, what string, packet []byte) error { + _, err := t.conn.WriteToUDP(packet, toaddr) + t.log.Trace(">> "+what, "id", toid, "addr", toaddr, "err", err) + return err +} + +func (t *UDPv4) encode(priv *ecdsa.PrivateKey, req packetV4) (packet, hash []byte, err error) { + name := req.name() + b := new(bytes.Buffer) + b.Write(headSpace) + b.WriteByte(req.kind()) + if err := rlp.Encode(b, req); err != nil { + t.log.Error(fmt.Sprintf("Can't encode %s packet", name), "err", err) + return nil, nil, err + } + packet = b.Bytes() + sig, err := crypto.Sign(crypto.Keccak256(packet[headSize:]), priv) + if err != nil { + t.log.Error(fmt.Sprintf("Can't sign %s packet", name), "err", err) + return nil, nil, err + } + copy(packet[macSize:], sig) + // add the hash to the front. Note: this doesn't protect the + // packet in any way. Our public key will be part of this hash in + // The future. + hash = crypto.Keccak256(packet[macSize:]) + copy(packet, hash) + return packet, hash, nil +} + +// readLoop runs in its own goroutine. it handles incoming UDP packets. +func (t *UDPv4) readLoop(unhandled chan<- ReadPacket) { + defer t.wg.Done() + if unhandled != nil { + defer close(unhandled) + } + + buf := make([]byte, maxPacketSize) + for { + nbytes, from, err := t.conn.ReadFromUDP(buf) + if netutil.IsTemporaryError(err) { + // Ignore temporary read errors. + t.log.Debug("Temporary UDP read error", "err", err) + continue + } else if err != nil { + // Shut down the loop for permament errors. + if err != io.EOF { + t.log.Debug("UDP read error", "err", err) + } + return + } + if t.handlePacket(from, buf[:nbytes]) != nil && unhandled != nil { + select { + case unhandled <- ReadPacket{buf[:nbytes], from}: + default: + } + } + } +} + +func (t *UDPv4) handlePacket(from *net.UDPAddr, buf []byte) error { + packet, fromKey, hash, err := decodeV4(buf) + if err != nil { + t.log.Debug("Bad discv4 packet", "addr", from, "err", err) + return err + } + fromID := fromKey.id() + if err == nil { + err = packet.preverify(t, from, fromID, fromKey) + } + t.log.Trace("<< "+packet.name(), "id", fromID, "addr", from, "err", err) + if err == nil { + packet.handle(t, from, fromID, hash) + } + return err +} + +func decodeV4(buf []byte) (packetV4, encPubkey, []byte, error) { + if len(buf) < headSize+1 { + return nil, encPubkey{}, nil, errPacketTooSmall + } + hash, sig, sigdata := buf[:macSize], buf[macSize:headSize], buf[headSize:] + shouldhash := crypto.Keccak256(buf[macSize:]) + if !bytes.Equal(hash, shouldhash) { + return nil, encPubkey{}, nil, errBadHash + } + fromKey, err := recoverNodeKey(crypto.Keccak256(buf[headSize:]), sig) + if err != nil { + return nil, fromKey, hash, err + } + + var req packetV4 + switch ptype := sigdata[0]; ptype { + case p_pingV4: + req = new(pingV4) + case p_pongV4: + req = new(pongV4) + case p_findnodeV4: + req = new(findnodeV4) + case p_neighborsV4: + req = new(neighborsV4) + case p_enrRequestV4: + req = new(enrRequestV4) + case p_enrResponseV4: + req = new(enrResponseV4) + default: + return nil, fromKey, hash, fmt.Errorf("unknown type: %d", ptype) + } + s := rlp.NewStream(bytes.NewReader(sigdata[1:]), 0) + err = s.Decode(req) + return req, fromKey, hash, err +} + +// checkBond checks if the given node has a recent enough endpoint proof. +func (t *UDPv4) checkBond(id enode.ID, ip net.IP) bool { + return time.Since(t.db.LastPongReceived(id, ip)) < bondExpiration +} + +// ensureBond solicits a ping from a node if we haven't seen a ping from it for a while. +// This ensures there is a valid endpoint proof on the remote end. +func (t *UDPv4) ensureBond(toid enode.ID, toaddr *net.UDPAddr) { + tooOld := time.Since(t.db.LastPingReceived(toid, toaddr.IP)) > bondExpiration + if tooOld || t.db.FindFails(toid, toaddr.IP) > maxFindnodeFailures { + rm := t.sendPing(toid, toaddr, nil) + <-rm.errc + // Wait for them to ping back and process our pong. + time.Sleep(respTimeout) + } +} + +// expired checks whether the given UNIX time stamp is in the past. +func expired(ts uint64) bool { + return time.Unix(int64(ts), 0).Before(time.Now()) +} + +func seqFromTail(tail []rlp.RawValue) uint64 { + if len(tail) == 0 { + return 0 + } + var seq uint64 + rlp.DecodeBytes(tail[0], &seq) + return seq +} + +// PING/v4 + +func (req *pingV4) name() string { return "PING/v4" } +func (req *pingV4) kind() byte { return p_pingV4 } + +func (req *pingV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + key, err := decodePubkey(fromKey) + if err != nil { + return errors.New("invalid public key") + } + req.senderKey = key + return nil +} + +func (req *pingV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { + // Reply. + seq, _ := rlp.EncodeToBytes(t.localNode.Node().Seq()) + t.send(from, fromID, &pongV4{ + To: makeEndpoint(from, req.From.TCP), + ReplyTok: mac, + Expiration: uint64(time.Now().Add(expiration).Unix()), + Rest: []rlp.RawValue{seq}, + }) + + // Ping back if our last pong on file is too far in the past. + n := wrapNode(enode.NewV4(req.senderKey, from.IP, int(req.From.TCP), from.Port)) + if time.Since(t.db.LastPongReceived(n.ID(), from.IP)) > bondExpiration { + t.sendPing(fromID, from, func() { + t.tab.addVerifiedNode(n) + }) + } else { + t.tab.addVerifiedNode(n) + } + + // Update node database and endpoint predictor. + t.db.UpdateLastPingReceived(n.ID(), from.IP, time.Now()) + t.localNode.UDPEndpointStatement(from, &net.UDPAddr{IP: req.To.IP, Port: int(req.To.UDP)}) +} + +// PONG/v4 + +func (req *pongV4) name() string { return "PONG/v4" } +func (req *pongV4) kind() byte { return p_pongV4 } + +func (req *pongV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + if !t.handleReply(fromID, from.IP, req) { + return errUnsolicitedReply + } + return nil +} + +func (req *pongV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { + t.localNode.UDPEndpointStatement(from, &net.UDPAddr{IP: req.To.IP, Port: int(req.To.UDP)}) + t.db.UpdateLastPongReceived(fromID, from.IP, time.Now()) +} + +// FINDNODE/v4 + +func (req *findnodeV4) name() string { return "FINDNODE/v4" } +func (req *findnodeV4) kind() byte { return p_findnodeV4 } + +func (req *findnodeV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + if !t.checkBond(fromID, from.IP) { + // No endpoint proof pong exists, we don't process the packet. This prevents an + // attack vector where the discovery protocol could be used to amplify traffic in a + // DDOS attack. A malicious actor would send a findnode request with the IP address + // and UDP port of the target as the source address. The recipient of the findnode + // packet would then send a neighbors packet (which is a much bigger packet than + // findnode) to the victim. + return errUnknownNode + } + return nil +} + +func (req *findnodeV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { + // Determine closest nodes. + target := enode.ID(crypto.Keccak256Hash(req.Target[:])) + t.tab.mutex.Lock() + closest := t.tab.closest(target, bucketSize, true).entries + t.tab.mutex.Unlock() + + // Send neighbors in chunks with at most maxNeighbors per packet + // to stay below the packet size limit. + p := neighborsV4{Expiration: uint64(time.Now().Add(expiration).Unix())} + var sent bool + for _, n := range closest { + if netutil.CheckRelayIP(from.IP, n.IP()) == nil { + p.Nodes = append(p.Nodes, nodeToRPC(n)) + } + if len(p.Nodes) == maxNeighbors { + t.send(from, fromID, &p) + p.Nodes = p.Nodes[:0] + sent = true + } + } + if len(p.Nodes) > 0 || !sent { + t.send(from, fromID, &p) + } +} + +// NEIGHBORS/v4 + +func (req *neighborsV4) name() string { return "NEIGHBORS/v4" } +func (req *neighborsV4) kind() byte { return p_neighborsV4 } + +func (req *neighborsV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + if !t.handleReply(fromID, from.IP, req) { + return errUnsolicitedReply + } + return nil +} + +func (req *neighborsV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { +} + +// ENRREQUEST/v4 + +func (req *enrRequestV4) name() string { return "ENRREQUEST/v4" } +func (req *enrRequestV4) kind() byte { return p_enrRequestV4 } + +func (req *enrRequestV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + if !t.checkBond(fromID, from.IP) { + return errUnknownNode + } + return nil +} + +func (req *enrRequestV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { + t.send(from, fromID, &enrResponseV4{ + ReplyTok: mac, + Record: *t.localNode.Node().Record(), + }) +} + +// ENRRESPONSE/v4 + +func (req *enrResponseV4) name() string { return "ENRRESPONSE/v4" } +func (req *enrResponseV4) kind() byte { return p_enrResponseV4 } + +func (req *enrResponseV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if !t.handleReply(fromID, from.IP, req) { + return errUnsolicitedReply + } + return nil +} + +func (req *enrResponseV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { +} diff --git a/p2p/discover/v4_udp_lookup_test.go b/p2p/discover/v4_udp_lookup_test.go new file mode 100644 index 000000000000..bc1cdfb089ab --- /dev/null +++ b/p2p/discover/v4_udp_lookup_test.go @@ -0,0 +1,220 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package discover + +import ( + "crypto/ecdsa" + "fmt" + "net" + "reflect" + "sort" + "testing" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +func TestUDPv4_Lookup(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + + // Lookup on empty table returns no nodes. + targetKey, _ := decodePubkey(lookupTestnet.target) + if results := test.udp.LookupPubkey(targetKey); len(results) > 0 { + t.Fatalf("lookup on empty table returned %d results: %#v", len(results), results) + } + + // Seed table with initial node. + fillTable(test.table, []*node{wrapNode(lookupTestnet.node(256, 0))}) + + // Start the lookup. + resultC := make(chan []*enode.Node, 1) + go func() { + resultC <- test.udp.LookupPubkey(targetKey) + test.close() + }() + + // Answer lookup packets. + for done := false; !done; { + done = test.waitPacketOut(func(p packetV4, to *net.UDPAddr, hash []byte) { + n, key := lookupTestnet.nodeByAddr(to) + switch p.(type) { + case *pingV4: + test.packetInFrom(nil, key, to, &pongV4{Expiration: futureExp, ReplyTok: hash}) + case *findnodeV4: + dist := enode.LogDist(n.ID(), lookupTestnet.target.id()) + nodes := lookupTestnet.nodesAtDistance(dist - 1) + test.packetInFrom(nil, key, to, &neighborsV4{Expiration: futureExp, Nodes: nodes}) + } + }) + } + + // Verify result nodes. + results := <-resultC + t.Logf("results:") + for _, e := range results { + t.Logf(" ld=%d, %x", enode.LogDist(lookupTestnet.target.id(), e.ID()), e.ID().Bytes()) + } + if len(results) != bucketSize { + t.Errorf("wrong number of results: got %d, want %d", len(results), bucketSize) + } + if hasDuplicates(wrapNodes(results)) { + t.Errorf("result set contains duplicate entries") + } + if !sortedByDistanceTo(lookupTestnet.target.id(), wrapNodes(results)) { + t.Errorf("result set not sorted by distance to target") + } + if !reflect.DeepEqual(results, lookupTestnet.closest(bucketSize)) { + t.Errorf("results aren't the closest %d nodes", bucketSize) + } +} + +// This is the test network for the Lookup test. +// The nodes were obtained by running lookupTestnet.mine with a random NodeID as target. +var lookupTestnet = &preminedTestnet{ + target: hexEncPubkey("5d485bdcbe9bc89314a10ae9231e429d33853e3a8fa2af39f5f827370a2e4185e344ace5d16237491dad41f278f1d3785210d29ace76cd627b9147ee340b1125"), + dists: [257][]*ecdsa.PrivateKey{ + 251: { + hexEncPrivkey("29738ba0c1a4397d6a65f292eee07f02df8e58d41594ba2be3cf84ce0fc58169"), + hexEncPrivkey("511b1686e4e58a917f7f848e9bf5539d206a68f5ad6b54b552c2399fe7d174ae"), + hexEncPrivkey("d09e5eaeec0fd596236faed210e55ef45112409a5aa7f3276d26646080dcfaeb"), + hexEncPrivkey("c1e20dbbf0d530e50573bd0a260b32ec15eb9190032b4633d44834afc8afe578"), + hexEncPrivkey("ed5f38f5702d92d306143e5d9154fb21819777da39af325ea359f453d179e80b"), + }, + 252: { + hexEncPrivkey("1c9b1cafbec00848d2c174b858219914b42a7d5c9359b1ca03fd650e8239ae94"), + hexEncPrivkey("e0e1e8db4a6f13c1ffdd3e96b72fa7012293ced187c9dcdcb9ba2af37a46fa10"), + hexEncPrivkey("3d53823e0a0295cb09f3e11d16c1b44d07dd37cec6f739b8df3a590189fe9fb9"), + }, + 253: { + hexEncPrivkey("2d0511ae9bf590166597eeab86b6f27b1ab761761eaea8965487b162f8703847"), + hexEncPrivkey("6cfbd7b8503073fc3dbdb746a7c672571648d3bd15197ccf7f7fef3d904f53a2"), + hexEncPrivkey("a30599b12827b69120633f15b98a7f6bc9fc2e9a0fd6ae2ebb767c0e64d743ab"), + hexEncPrivkey("14a98db9b46a831d67eff29f3b85b1b485bb12ae9796aea98d91be3dc78d8a91"), + hexEncPrivkey("2369ff1fc1ff8ca7d20b17e2673adc3365c3674377f21c5d9dafaff21fe12e24"), + hexEncPrivkey("9ae91101d6b5048607f41ec0f690ef5d09507928aded2410aabd9237aa2727d7"), + hexEncPrivkey("05e3c59090a3fd1ae697c09c574a36fcf9bedd0afa8fe3946f21117319ca4973"), + hexEncPrivkey("06f31c5ea632658f718a91a1b1b9ae4b7549d7b3bc61cbc2be5f4a439039f3ad"), + }, + 254: { + hexEncPrivkey("dec742079ec00ff4ec1284d7905bc3de2366f67a0769431fd16f80fd68c58a7c"), + hexEncPrivkey("ff02c8861fa12fbd129d2a95ea663492ef9c1e51de19dcfbbfe1c59894a28d2b"), + hexEncPrivkey("4dded9e4eefcbce4262be4fd9e8a773670ab0b5f448f286ec97dfc8cf681444a"), + hexEncPrivkey("750d931e2a8baa2c9268cb46b7cd851f4198018bed22f4dceb09dd334a2395f6"), + hexEncPrivkey("ce1435a956a98ffec484cd11489c4f165cf1606819ab6b521cee440f0c677e9e"), + hexEncPrivkey("996e7f8d1638be92d7328b4770f47e5420fc4bafecb4324fd33b1f5d9f403a75"), + hexEncPrivkey("ebdc44e77a6cc0eb622e58cf3bb903c3da4c91ca75b447b0168505d8fc308b9c"), + hexEncPrivkey("46bd1eddcf6431bea66fc19ebc45df191c1c7d6ed552dcdc7392885009c322f0"), + }, + 255: { + hexEncPrivkey("da8645f90826e57228d9ea72aff84500060ad111a5d62e4af831ed8e4b5acfb8"), + hexEncPrivkey("3c944c5d9af51d4c1d43f5d0f3a1a7ef65d5e82744d669b58b5fed242941a566"), + hexEncPrivkey("5ebcde76f1d579eebf6e43b0ffe9157e65ffaa391175d5b9aa988f47df3e33da"), + hexEncPrivkey("97f78253a7d1d796e4eaabce721febcc4550dd68fb11cc818378ba807a2cb7de"), + hexEncPrivkey("a38cd7dc9b4079d1c0406afd0fdb1165c285f2c44f946eca96fc67772c988c7d"), + hexEncPrivkey("d64cbb3ffdf712c372b7a22a176308ef8f91861398d5dbaf326fd89c6eaeef1c"), + hexEncPrivkey("d269609743ef29d6446e3355ec647e38d919c82a4eb5837e442efd7f4218944f"), + hexEncPrivkey("d8f7bcc4a530efde1d143717007179e0d9ace405ddaaf151c4d863753b7fd64c"), + }, + 256: { + hexEncPrivkey("8c5b422155d33ea8e9d46f71d1ad3e7b24cb40051413ffa1a81cff613d243ba9"), + hexEncPrivkey("937b1af801def4e8f5a3a8bd225a8bcff1db764e41d3e177f2e9376e8dd87233"), + hexEncPrivkey("120260dce739b6f71f171da6f65bc361b5fad51db74cf02d3e973347819a6518"), + hexEncPrivkey("1fa56cf25d4b46c2bf94e82355aa631717b63190785ac6bae545a88aadc304a9"), + hexEncPrivkey("3c38c503c0376f9b4adcbe935d5f4b890391741c764f61b03cd4d0d42deae002"), + hexEncPrivkey("3a54af3e9fa162bc8623cdf3e5d9b70bf30ade1d54cc3abea8659aba6cff471f"), + hexEncPrivkey("6799a02ea1999aefdcbcc4d3ff9544478be7365a328d0d0f37c26bd95ade0cda"), + hexEncPrivkey("e24a7bc9051058f918646b0f6e3d16884b2a55a15553b89bab910d55ebc36116"), + }, + }, +} + +type preminedTestnet struct { + target encPubkey + dists [hashBits + 1][]*ecdsa.PrivateKey +} + +func (tn *preminedTestnet) node(dist, index int) *enode.Node { + key := tn.dists[dist][index] + ip := net.IP{127, byte(dist >> 8), byte(dist), byte(index)} + return enode.NewV4(&key.PublicKey, ip, 0, 5000) +} + +func (tn *preminedTestnet) nodeByAddr(addr *net.UDPAddr) (*enode.Node, *ecdsa.PrivateKey) { + dist := int(addr.IP[1])<<8 + int(addr.IP[2]) + index := int(addr.IP[3]) + key := tn.dists[dist][index] + return tn.node(dist, index), key +} + +func (tn *preminedTestnet) nodesAtDistance(dist int) []rpcNode { + result := make([]rpcNode, len(tn.dists[dist])) + for i := range result { + result[i] = nodeToRPC(wrapNode(tn.node(dist, i))) + } + return result +} + +func (tn *preminedTestnet) closest(n int) (nodes []*enode.Node) { + for d := range tn.dists { + for i := range tn.dists[d] { + nodes = append(nodes, tn.node(d, i)) + } + } + sort.Slice(nodes, func(i, j int) bool { + return enode.DistCmp(tn.target.id(), nodes[i].ID(), nodes[j].ID()) < 0 + }) + return nodes[:n] +} + +var _ = (*preminedTestnet).mine // avoid linter warning about mine being dead code. + +// mine generates a testnet struct literal with nodes at +// various distances to the network's target. +func (tn *preminedTestnet) mine() { + // Clear existing slices first (useful when re-mining). + for i := range tn.dists { + tn.dists[i] = nil + } + + targetSha := tn.target.id() + found, need := 0, 40 + for found < need { + k := newkey() + ld := enode.LogDist(targetSha, encodePubkey(&k.PublicKey).id()) + if len(tn.dists[ld]) < 8 { + tn.dists[ld] = append(tn.dists[ld], k) + found++ + fmt.Printf("found ID with ld %d (%d/%d)\n", ld, found, need) + } + } + fmt.Printf("&preminedTestnet{\n") + fmt.Printf(" target: hexEncPubkey(\"%x\"),\n", tn.target[:]) + fmt.Printf(" dists: [%d][]*ecdsa.PrivateKey{\n", len(tn.dists)) + for ld, ns := range tn.dists { + if len(ns) == 0 { + continue + } + fmt.Printf(" %d: {\n", ld) + for _, key := range ns { + fmt.Printf(" hexEncPrivkey(\"%x\"),\n", crypto.FromECDSA(key)) + } + fmt.Printf(" },\n") + } + fmt.Printf(" },\n") + fmt.Printf("}\n") +} diff --git a/p2p/discover/v4_udp_test.go b/p2p/discover/v4_udp_test.go new file mode 100644 index 000000000000..b4e024e7ef29 --- /dev/null +++ b/p2p/discover/v4_udp_test.go @@ -0,0 +1,687 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package discover + +import ( + "bytes" + "crypto/ecdsa" + crand "crypto/rand" + "encoding/binary" + "encoding/hex" + "errors" + "io" + "math/rand" + "net" + "reflect" + "sync" + "testing" + "time" + + "github.com/davecgh/go-spew/spew" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/internal/testlog" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" +) + +func init() { + spew.Config.DisableMethods = true +} + +// shared test variables +var ( + futureExp = uint64(time.Now().Add(10 * time.Hour).Unix()) + testTarget = encPubkey{0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1} + testRemote = rpcEndpoint{IP: net.ParseIP("1.1.1.1").To4(), UDP: 1, TCP: 2} + testLocalAnnounced = rpcEndpoint{IP: net.ParseIP("2.2.2.2").To4(), UDP: 3, TCP: 4} + testLocal = rpcEndpoint{IP: net.ParseIP("3.3.3.3").To4(), UDP: 5, TCP: 6} +) + +type udpTest struct { + t *testing.T + pipe *dgramPipe + table *Table + db *enode.DB + udp *UDPv4 + sent [][]byte + localkey, remotekey *ecdsa.PrivateKey + remoteaddr *net.UDPAddr +} + +func newUDPTest(t *testing.T) *udpTest { + test := &udpTest{ + t: t, + pipe: newpipe(), + localkey: newkey(), + remotekey: newkey(), + remoteaddr: &net.UDPAddr{IP: net.IP{10, 0, 1, 99}, Port: 30303}, + } + + test.db, _ = enode.OpenDB("") + ln := enode.NewLocalNode(test.db, test.localkey) + test.udp, _ = ListenV4(test.pipe, ln, Config{ + PrivateKey: test.localkey, + Log: testlog.Logger(t, log.LvlTrace), + }) + test.table = test.udp.tab + // Wait for initial refresh so the table doesn't send unexpected findnode. + <-test.table.initDone + return test +} + +func (test *udpTest) close() { + test.udp.Close() + test.db.Close() +} + +// handles a packet as if it had been sent to the transport. +func (test *udpTest) packetIn(wantError error, data packetV4) { + test.t.Helper() + + test.packetInFrom(wantError, test.remotekey, test.remoteaddr, data) +} + +// handles a packet as if it had been sent to the transport by the key/endpoint. +func (test *udpTest) packetInFrom(wantError error, key *ecdsa.PrivateKey, addr *net.UDPAddr, data packetV4) { + test.t.Helper() + + enc, _, err := test.udp.encode(key, data) + if err != nil { + test.t.Errorf("%s encode error: %v", data.name(), err) + } + test.sent = append(test.sent, enc) + if err = test.udp.handlePacket(addr, enc); err != wantError { + test.t.Errorf("error mismatch: got %q, want %q", err, wantError) + } +} + +// waits for a packet to be sent by the transport. +// validate should have type func(X, *net.UDPAddr, []byte), where X is a packet type. +func (test *udpTest) waitPacketOut(validate interface{}) (closed bool) { + test.t.Helper() + + dgram, ok := test.pipe.receive() + if !ok { + return true + } + p, _, hash, err := decodeV4(dgram.data) + if err != nil { + test.t.Errorf("sent packet decode error: %v", err) + return false + } + fn := reflect.ValueOf(validate) + exptype := fn.Type().In(0) + if !reflect.TypeOf(p).AssignableTo(exptype) { + test.t.Errorf("sent packet type mismatch, got: %v, want: %v", reflect.TypeOf(p), exptype) + return false + } + fn.Call([]reflect.Value{reflect.ValueOf(p), reflect.ValueOf(&dgram.to), reflect.ValueOf(hash)}) + return false +} + +func TestUDPv4_packetErrors(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + test.packetIn(errExpired, &pingV4{From: testRemote, To: testLocalAnnounced, Version: 4}) + test.packetIn(errUnsolicitedReply, &pongV4{ReplyTok: []byte{}, Expiration: futureExp}) + test.packetIn(errUnknownNode, &findnodeV4{Expiration: futureExp}) + test.packetIn(errUnsolicitedReply, &neighborsV4{Expiration: futureExp}) +} + +func TestUDPv4_pingTimeout(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + defer test.close() + + key := newkey() + toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222} + node := enode.NewV4(&key.PublicKey, toaddr.IP, 0, toaddr.Port) + if _, err := test.udp.ping(node); err != errTimeout { + t.Error("expected timeout error, got", err) + } +} + +type testPacket byte + +func (req testPacket) kind() byte { return byte(req) } +func (req testPacket) name() string { return "" } +func (req testPacket) preverify(*UDPv4, *net.UDPAddr, enode.ID, encPubkey) error { + return nil +} +func (req testPacket) handle(*UDPv4, *net.UDPAddr, enode.ID, []byte) { +} + +func TestUDPv4_responseTimeouts(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + defer test.close() + + rand.Seed(time.Now().UnixNano()) + randomDuration := func(max time.Duration) time.Duration { + return time.Duration(rand.Int63n(int64(max))) + } + + var ( + nReqs = 200 + nTimeouts = 0 // number of requests with ptype > 128 + nilErr = make(chan error, nReqs) // for requests that get a reply + timeoutErr = make(chan error, nReqs) // for requests that time out + ) + for i := 0; i < nReqs; i++ { + // Create a matcher for a random request in udp.loop. Requests + // with ptype <= 128 will not get a reply and should time out. + // For all other requests, a reply is scheduled to arrive + // within the timeout window. + p := &replyMatcher{ + ptype: byte(rand.Intn(255)), + callback: func(interface{}) (bool, bool) { return true, true }, + } + binary.BigEndian.PutUint64(p.from[:], uint64(i)) + if p.ptype <= 128 { + p.errc = timeoutErr + test.udp.addReplyMatcher <- p + nTimeouts++ + } else { + p.errc = nilErr + test.udp.addReplyMatcher <- p + time.AfterFunc(randomDuration(60*time.Millisecond), func() { + if !test.udp.handleReply(p.from, p.ip, testPacket(p.ptype)) { + t.Logf("not matched: %v", p) + } + }) + } + time.Sleep(randomDuration(30 * time.Millisecond)) + } + + // Check that all timeouts were delivered and that the rest got nil errors. + // The replies must be delivered. + var ( + recvDeadline = time.After(20 * time.Second) + nTimeoutsRecv, nNil = 0, 0 + ) + for i := 0; i < nReqs; i++ { + select { + case err := <-timeoutErr: + if err != errTimeout { + t.Fatalf("got non-timeout error on timeoutErr %d: %v", i, err) + } + nTimeoutsRecv++ + case err := <-nilErr: + if err != nil { + t.Fatalf("got non-nil error on nilErr %d: %v", i, err) + } + nNil++ + case <-recvDeadline: + t.Fatalf("exceeded recv deadline") + } + } + if nTimeoutsRecv != nTimeouts { + t.Errorf("wrong number of timeout errors received: got %d, want %d", nTimeoutsRecv, nTimeouts) + } + if nNil != nReqs-nTimeouts { + t.Errorf("wrong number of successful replies: got %d, want %d", nNil, nReqs-nTimeouts) + } +} + +func TestUDPv4_findnodeTimeout(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + defer test.close() + + toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222} + toid := enode.ID{1, 2, 3, 4} + target := encPubkey{4, 5, 6, 7} + result, err := test.udp.findnode(toid, toaddr, target) + if err != errTimeout { + t.Error("expected timeout error, got", err) + } + if len(result) > 0 { + t.Error("expected empty result, got", result) + } +} + +func TestUDPv4_findnode(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + // put a few nodes into the table. their exact + // distribution shouldn't matter much, although we need to + // take care not to overflow any bucket. + nodes := &nodesByDistance{target: testTarget.id()} + live := make(map[enode.ID]bool) + numCandidates := 2 * bucketSize + for i := 0; i < numCandidates; i++ { + key := newkey() + ip := net.IP{10, 13, 0, byte(i)} + n := wrapNode(enode.NewV4(&key.PublicKey, ip, 0, 2000)) + // Ensure half of table content isn't verified live yet. + if i > numCandidates/2 { + n.livenessChecks = 1 + live[n.ID()] = true + } + nodes.push(n, numCandidates) + } + fillTable(test.table, nodes.entries) + + // ensure there's a bond with the test node, + // findnode won't be accepted otherwise. + remoteID := encodePubkey(&test.remotekey.PublicKey).id() + test.table.db.UpdateLastPongReceived(remoteID, test.remoteaddr.IP, time.Now()) + + // check that closest neighbors are returned. + expected := test.table.closest(testTarget.id(), bucketSize, true) + test.packetIn(nil, &findnodeV4{Target: testTarget, Expiration: futureExp}) + waitNeighbors := func(want []*node) { + test.waitPacketOut(func(p *neighborsV4, to *net.UDPAddr, hash []byte) { + if len(p.Nodes) != len(want) { + t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize) + } + for i, n := range p.Nodes { + if n.ID.id() != want[i].ID() { + t.Errorf("result mismatch at %d:\n got: %v\n want: %v", i, n, expected.entries[i]) + } + if !live[n.ID.id()] { + t.Errorf("result includes dead node %v", n.ID.id()) + } + } + }) + } + // Receive replies. + want := expected.entries + if len(want) > maxNeighbors { + waitNeighbors(want[:maxNeighbors]) + want = want[maxNeighbors:] + } + waitNeighbors(want) +} + +func TestUDPv4_findnodeMultiReply(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey) + test.table.db.UpdateLastPingReceived(rid, test.remoteaddr.IP, time.Now()) + + // queue a pending findnode request + resultc, errc := make(chan []*node), make(chan error) + go func() { + rid := encodePubkey(&test.remotekey.PublicKey).id() + ns, err := test.udp.findnode(rid, test.remoteaddr, testTarget) + if err != nil && len(ns) == 0 { + errc <- err + } else { + resultc <- ns + } + }() + + // wait for the findnode to be sent. + // after it is sent, the transport is waiting for a reply + test.waitPacketOut(func(p *findnodeV4, to *net.UDPAddr, hash []byte) { + if p.Target != testTarget { + t.Errorf("wrong target: got %v, want %v", p.Target, testTarget) + } + }) + + // send the reply as two packets. + list := []*node{ + wrapNode(enode.MustParse("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30303?discport=30304")), + wrapNode(enode.MustParse("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30303")), + wrapNode(enode.MustParse("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30301?discport=17")), + wrapNode(enode.MustParse("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30303")), + } + rpclist := make([]rpcNode, len(list)) + for i := range list { + rpclist[i] = nodeToRPC(list[i]) + } + test.packetIn(nil, &neighborsV4{Expiration: futureExp, Nodes: rpclist[:2]}) + test.packetIn(nil, &neighborsV4{Expiration: futureExp, Nodes: rpclist[2:]}) + + // check that the sent neighbors are all returned by findnode + select { + case result := <-resultc: + want := append(list[:2], list[3:]...) + if !reflect.DeepEqual(result, want) { + t.Errorf("neighbors mismatch:\n got: %v\n want: %v", result, want) + } + case err := <-errc: + t.Errorf("findnode error: %v", err) + case <-time.After(5 * time.Second): + t.Error("findnode did not return within 5 seconds") + } +} + +// This test checks that reply matching of pong verifies the ping hash. +func TestUDPv4_pingMatch(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + randToken := make([]byte, 32) + crand.Read(randToken) + + test.packetIn(nil, &pingV4{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp}) + test.waitPacketOut(func(*pongV4, *net.UDPAddr, []byte) {}) + test.waitPacketOut(func(*pingV4, *net.UDPAddr, []byte) {}) + test.packetIn(errUnsolicitedReply, &pongV4{ReplyTok: randToken, To: testLocalAnnounced, Expiration: futureExp}) +} + +// This test checks that reply matching of pong verifies the sender IP address. +func TestUDPv4_pingMatchIP(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + test.packetIn(nil, &pingV4{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp}) + test.waitPacketOut(func(*pongV4, *net.UDPAddr, []byte) {}) + + test.waitPacketOut(func(p *pingV4, to *net.UDPAddr, hash []byte) { + wrongAddr := &net.UDPAddr{IP: net.IP{33, 44, 1, 2}, Port: 30000} + test.packetInFrom(errUnsolicitedReply, test.remotekey, wrongAddr, &pongV4{ + ReplyTok: hash, + To: testLocalAnnounced, + Expiration: futureExp, + }) + }) +} + +func TestUDPv4_successfulPing(t *testing.T) { + test := newUDPTest(t) + added := make(chan *node, 1) + test.table.nodeAddedHook = func(n *node) { added <- n } + defer test.close() + + // The remote side sends a ping packet to initiate the exchange. + go test.packetIn(nil, &pingV4{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp}) + + // The ping is replied to. + test.waitPacketOut(func(p *pongV4, to *net.UDPAddr, hash []byte) { + pinghash := test.sent[0][:macSize] + if !bytes.Equal(p.ReplyTok, pinghash) { + t.Errorf("got pong.ReplyTok %x, want %x", p.ReplyTok, pinghash) + } + wantTo := rpcEndpoint{ + // The mirrored UDP address is the UDP packet sender + IP: test.remoteaddr.IP, UDP: uint16(test.remoteaddr.Port), + // The mirrored TCP port is the one from the ping packet + TCP: testRemote.TCP, + } + if !reflect.DeepEqual(p.To, wantTo) { + t.Errorf("got pong.To %v, want %v", p.To, wantTo) + } + }) + + // Remote is unknown, the table pings back. + test.waitPacketOut(func(p *pingV4, to *net.UDPAddr, hash []byte) { + if !reflect.DeepEqual(p.From, test.udp.ourEndpoint()) { + t.Errorf("got ping.From %#v, want %#v", p.From, test.udp.ourEndpoint()) + } + wantTo := rpcEndpoint{ + // The mirrored UDP address is the UDP packet sender. + IP: test.remoteaddr.IP, + UDP: uint16(test.remoteaddr.Port), + TCP: 0, + } + if !reflect.DeepEqual(p.To, wantTo) { + t.Errorf("got ping.To %v, want %v", p.To, wantTo) + } + test.packetIn(nil, &pongV4{ReplyTok: hash, Expiration: futureExp}) + }) + + // The node should be added to the table shortly after getting the + // pong packet. + select { + case n := <-added: + rid := encodePubkey(&test.remotekey.PublicKey).id() + if n.ID() != rid { + t.Errorf("node has wrong ID: got %v, want %v", n.ID(), rid) + } + if !n.IP().Equal(test.remoteaddr.IP) { + t.Errorf("node has wrong IP: got %v, want: %v", n.IP(), test.remoteaddr.IP) + } + if n.UDP() != test.remoteaddr.Port { + t.Errorf("node has wrong UDP port: got %v, want: %v", n.UDP(), test.remoteaddr.Port) + } + if n.TCP() != int(testRemote.TCP) { + t.Errorf("node has wrong TCP port: got %v, want: %v", n.TCP(), testRemote.TCP) + } + case <-time.After(2 * time.Second): + t.Errorf("node was not added within 2 seconds") + } +} + +// This test checks that EIP-868 requests work. +func TestUDPv4_EIP868(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + test.udp.localNode.Set(enr.WithEntry("foo", "bar")) + wantNode := test.udp.localNode.Node() + + // ENR requests aren't allowed before endpoint proof. + test.packetIn(errUnknownNode, &enrRequestV4{Expiration: futureExp}) + + // Perform endpoint proof and check for sequence number in packet tail. + test.packetIn(nil, &pingV4{Expiration: futureExp}) + test.waitPacketOut(func(p *pongV4, addr *net.UDPAddr, hash []byte) { + if seq := seqFromTail(p.Rest); seq != wantNode.Seq() { + t.Errorf("wrong sequence number in pong: %d, want %d", seq, wantNode.Seq()) + } + }) + test.waitPacketOut(func(p *pingV4, addr *net.UDPAddr, hash []byte) { + if seq := seqFromTail(p.Rest); seq != wantNode.Seq() { + t.Errorf("wrong sequence number in ping: %d, want %d", seq, wantNode.Seq()) + } + test.packetIn(nil, &pongV4{Expiration: futureExp, ReplyTok: hash}) + }) + + // Request should work now. + test.packetIn(nil, &enrRequestV4{Expiration: futureExp}) + test.waitPacketOut(func(p *enrResponseV4, addr *net.UDPAddr, hash []byte) { + n, err := enode.New(enode.ValidSchemes, &p.Record) + if err != nil { + t.Fatalf("invalid record: %v", err) + } + if !reflect.DeepEqual(n, wantNode) { + t.Fatalf("wrong node in enrResponse: %v", n) + } + }) +} + +// EIP-8 test vectors. +var testPackets = []struct { + input string + wantPacket interface{} +}{ + { + input: "71dbda3a79554728d4f94411e42ee1f8b0d561c10e1e5f5893367948c6a7d70bb87b235fa28a77070271b6c164a2dce8c7e13a5739b53b5e96f2e5acb0e458a02902f5965d55ecbeb2ebb6cabb8b2b232896a36b737666c55265ad0a68412f250001ea04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a355", + wantPacket: &pingV4{ + Version: 4, + From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, + To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, + Expiration: 1136239445, + Rest: []rlp.RawValue{}, + }, + }, + { + input: "e9614ccfd9fc3e74360018522d30e1419a143407ffcce748de3e22116b7e8dc92ff74788c0b6663aaa3d67d641936511c8f8d6ad8698b820a7cf9e1be7155e9a241f556658c55428ec0563514365799a4be2be5a685a80971ddcfa80cb422cdd0101ec04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a3550102", + wantPacket: &pingV4{ + Version: 4, + From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, + To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, + Expiration: 1136239445, + Rest: []rlp.RawValue{{0x01}, {0x02}}, + }, + }, + { + input: "577be4349c4dd26768081f58de4c6f375a7a22f3f7adda654d1428637412c3d7fe917cadc56d4e5e7ffae1dbe3efffb9849feb71b262de37977e7c7a44e677295680e9e38ab26bee2fcbae207fba3ff3d74069a50b902a82c9903ed37cc993c50001f83e82022bd79020010db83c4d001500000000abcdef12820cfa8215a8d79020010db885a308d313198a2e037073488208ae82823a8443b9a355c5010203040531b9019afde696e582a78fa8d95ea13ce3297d4afb8ba6433e4154caa5ac6431af1b80ba76023fa4090c408f6b4bc3701562c031041d4702971d102c9ab7fa5eed4cd6bab8f7af956f7d565ee1917084a95398b6a21eac920fe3dd1345ec0a7ef39367ee69ddf092cbfe5b93e5e568ebc491983c09c76d922dc3", + wantPacket: &pingV4{ + Version: 555, + From: rpcEndpoint{net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), 3322, 5544}, + To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, + Expiration: 1136239445, + Rest: []rlp.RawValue{{0xC5, 0x01, 0x02, 0x03, 0x04, 0x05}}, + }, + }, + { + input: "09b2428d83348d27cdf7064ad9024f526cebc19e4958f0fdad87c15eb598dd61d08423e0bf66b2069869e1724125f820d851c136684082774f870e614d95a2855d000f05d1648b2d5945470bc187c2d2216fbe870f43ed0909009882e176a46b0102f846d79020010db885a308d313198a2e037073488208ae82823aa0fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c9548443b9a355c6010203c2040506a0c969a58f6f9095004c0177a6b47f451530cab38966a25cca5cb58f055542124e", + wantPacket: &pongV4{ + To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, + ReplyTok: common.Hex2Bytes("fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c954"), + Expiration: 1136239445, + Rest: []rlp.RawValue{{0xC6, 0x01, 0x02, 0x03, 0xC2, 0x04, 0x05}, {0x06}}, + }, + }, + { + input: "c7c44041b9f7c7e41934417ebac9a8e1a4c6298f74553f2fcfdcae6ed6fe53163eb3d2b52e39fe91831b8a927bf4fc222c3902202027e5e9eb812195f95d20061ef5cd31d502e47ecb61183f74a504fe04c51e73df81f25c4d506b26db4517490103f84eb840ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f8443b9a35582999983999999280dc62cc8255c73471e0a61da0c89acdc0e035e260add7fc0c04ad9ebf3919644c91cb247affc82b69bd2ca235c71eab8e49737c937a2c396", + wantPacket: &findnodeV4{ + Target: hexEncPubkey("ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f"), + Expiration: 1136239445, + Rest: []rlp.RawValue{{0x82, 0x99, 0x99}, {0x83, 0x99, 0x99, 0x99}}, + }, + }, + { + input: "c679fc8fe0b8b12f06577f2e802d34f6fa257e6137a995f6f4cbfc9ee50ed3710faf6e66f932c4c8d81d64343f429651328758b47d3dbc02c4042f0fff6946a50f4a49037a72bb550f3a7872363a83e1b9ee6469856c24eb4ef80b7535bcf99c0004f9015bf90150f84d846321163782115c82115db8403155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32f84984010203040101b840312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069dbf8599020010db83c4d001500000000abcdef12820d05820d05b84038643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aacf8599020010db885a308d313198a2e037073488203e78203e8b8408dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df738443b9a355010203b525a138aa34383fec3d2719a0", + wantPacket: &neighborsV4{ + Nodes: []rpcNode{ + { + ID: hexEncPubkey("3155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32"), + IP: net.ParseIP("99.33.22.55").To4(), + UDP: 4444, + TCP: 4445, + }, + { + ID: hexEncPubkey("312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069db"), + IP: net.ParseIP("1.2.3.4").To4(), + UDP: 1, + TCP: 1, + }, + { + ID: hexEncPubkey("38643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aac"), + IP: net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), + UDP: 3333, + TCP: 3333, + }, + { + ID: hexEncPubkey("8dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df73"), + IP: net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), + UDP: 999, + TCP: 1000, + }, + }, + Expiration: 1136239445, + Rest: []rlp.RawValue{{0x01}, {0x02}, {0x03}}, + }, + }, +} + +func TestUDPv4_forwardCompatibility(t *testing.T) { + testkey, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + wantNodeKey := encodePubkey(&testkey.PublicKey) + + for _, test := range testPackets { + input, err := hex.DecodeString(test.input) + if err != nil { + t.Fatalf("invalid hex: %s", test.input) + } + packet, nodekey, _, err := decodeV4(input) + if err != nil { + t.Errorf("did not accept packet %s\n%v", test.input, err) + continue + } + if !reflect.DeepEqual(packet, test.wantPacket) { + t.Errorf("got %s\nwant %s", spew.Sdump(packet), spew.Sdump(test.wantPacket)) + } + if nodekey != wantNodeKey { + t.Errorf("got id %v\nwant id %v", nodekey, wantNodeKey) + } + } +} + +// dgramPipe is a fake UDP socket. It queues all sent datagrams. +type dgramPipe struct { + mu *sync.Mutex + cond *sync.Cond + closing chan struct{} + closed bool + queue []dgram +} + +type dgram struct { + to net.UDPAddr + data []byte +} + +func newpipe() *dgramPipe { + mu := new(sync.Mutex) + return &dgramPipe{ + closing: make(chan struct{}), + cond: &sync.Cond{L: mu}, + mu: mu, + } +} + +// WriteToUDP queues a datagram. +func (c *dgramPipe) WriteToUDP(b []byte, to *net.UDPAddr) (n int, err error) { + msg := make([]byte, len(b)) + copy(msg, b) + c.mu.Lock() + defer c.mu.Unlock() + if c.closed { + return 0, errors.New("closed") + } + c.queue = append(c.queue, dgram{*to, b}) + c.cond.Signal() + return len(b), nil +} + +// ReadFromUDP just hangs until the pipe is closed. +func (c *dgramPipe) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { + <-c.closing + return 0, nil, io.EOF +} + +func (c *dgramPipe) Close() error { + c.mu.Lock() + defer c.mu.Unlock() + if !c.closed { + close(c.closing) + c.closed = true + } + c.cond.Broadcast() + return nil +} + +func (c *dgramPipe) LocalAddr() net.Addr { + return &net.UDPAddr{IP: testLocal.IP, Port: int(testLocal.UDP)} +} + +func (c *dgramPipe) receive() (dgram, bool) { + c.mu.Lock() + defer c.mu.Unlock() + for len(c.queue) == 0 && !c.closed { + c.cond.Wait() + } + if c.closed { + return dgram{}, false + } + p := c.queue[0] + copy(c.queue, c.queue[1:]) + c.queue = c.queue[:len(c.queue)-1] + return p, true +} diff --git a/p2p/discv5/metrics.go b/p2p/discv5/metrics.go index cb11d7eacf07..e68d53c13c63 100644 --- a/p2p/discv5/metrics.go +++ b/p2p/discv5/metrics.go @@ -1,3 +1,19 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + package discv5 import "github.com/ethereum/go-ethereum/metrics" diff --git a/p2p/discv5/net.go b/p2p/discv5/net.go index a6cabf08033f..de7d8de6aa40 100644 --- a/p2p/discv5/net.go +++ b/p2p/discv5/net.go @@ -27,10 +27,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/mclock" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/netutil" "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" ) var ( @@ -567,12 +567,11 @@ loop: net.ticketStore.searchLookupDone(res.target, res.nodes, func(n *Node, topic Topic) []byte { if n.state != nil && n.state.canQuery { return net.conn.send(n, topicQueryPacket, topicQuery{Topic: topic}) // TODO: set expiration - } else { - if n.state == unknown { - net.ping(n, n.addr()) - } - return nil } + if n.state == unknown { + net.ping(n, n.addr()) + } + return nil }) case <-statsDump.C: @@ -801,7 +800,7 @@ func (n *nodeNetGuts) startNextQuery(net *Network) { func (q *findnodeQuery) start(net *Network) bool { // Satisfy queries against the local node directly. if q.remote == net.tab.self { - closest := net.tab.closest(crypto.Keccak256Hash(q.target[:]), bucketSize) + closest := net.tab.closest(q.target, bucketSize) q.reply <- closest.entries return true } @@ -1235,7 +1234,7 @@ func (net *Network) checkTopicRegister(data *topicRegister) (*pong, error) { } func rlpHash(x interface{}) (h common.Hash) { - hw := sha3.NewKeccak256() + hw := sha3.NewLegacyKeccak256() rlp.Encode(hw, x) hw.Sum(h[:0]) return h diff --git a/p2p/discv5/sim_test.go b/p2p/discv5/sim_test.go index 543faecd4856..76379452a53c 100644 --- a/p2p/discv5/sim_test.go +++ b/p2p/discv5/sim_test.go @@ -50,7 +50,7 @@ func TestSimRandomResolve(t *testing.T) { if err := net.SetFallbackNodes([]*Node{bootnode.Self()}); err != nil { panic(err) } - fmt.Printf("launched @ %v: %x\n", time.Now(), net.Self().ID[:16]) + t.Logf("launched @ %v: %x\n", time.Now(), net.Self().ID[:16]) } }() diff --git a/p2p/discv5/udp.go b/p2p/discv5/udp.go index 49e1cb811ad5..ff5ed983bab0 100644 --- a/p2p/discv5/udp.go +++ b/p2p/discv5/udp.go @@ -230,7 +230,8 @@ type udp struct { } // ListenUDP returns a new table that listens for UDP packets on laddr. -func ListenUDP(priv *ecdsa.PrivateKey, conn conn, realaddr *net.UDPAddr, nodeDBPath string, netrestrict *netutil.Netlist) (*Network, error) { +func ListenUDP(priv *ecdsa.PrivateKey, conn conn, nodeDBPath string, netrestrict *netutil.Netlist) (*Network, error) { + realaddr := conn.LocalAddr().(*net.UDPAddr) transport, err := listenUDP(priv, conn, realaddr) if err != nil { return nil, err diff --git a/p2p/enode/idscheme.go b/p2p/enode/idscheme.go index 9b495fd4fff6..c1834f06995c 100644 --- a/p2p/enode/idscheme.go +++ b/p2p/enode/idscheme.go @@ -23,9 +23,9 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" ) // List of known secure identity schemes. @@ -48,7 +48,7 @@ func SignV4(r *enr.Record, privkey *ecdsa.PrivateKey) error { cpy.Set(enr.ID("v4")) cpy.Set(Secp256k1(privkey.PublicKey)) - h := sha3.NewKeccak256() + h := sha3.NewLegacyKeccak256() rlp.Encode(h, cpy.AppendElements(nil)) sig, err := crypto.Sign(h.Sum(nil), privkey) if err != nil { @@ -69,7 +69,7 @@ func (V4ID) Verify(r *enr.Record, sig []byte) error { return fmt.Errorf("invalid public key") } - h := sha3.NewKeccak256() + h := sha3.NewLegacyKeccak256() rlp.Encode(h, r.AppendElements(nil)) if !crypto.VerifySignature(entry, h.Sum(nil), sig) { return enr.ErrInvalidSig diff --git a/p2p/enode/localnode.go b/p2p/enode/localnode.go new file mode 100644 index 000000000000..d8aa02a77e26 --- /dev/null +++ b/p2p/enode/localnode.go @@ -0,0 +1,290 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package enode + +import ( + "crypto/ecdsa" + "fmt" + "net" + "reflect" + "strconv" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/netutil" +) + +const ( + // IP tracker configuration + iptrackMinStatements = 10 + iptrackWindow = 5 * time.Minute + iptrackContactWindow = 10 * time.Minute +) + +// LocalNode produces the signed node record of a local node, i.e. a node run in the +// current process. Setting ENR entries via the Set method updates the record. A new version +// of the record is signed on demand when the Node method is called. +type LocalNode struct { + cur atomic.Value // holds a non-nil node pointer while the record is up-to-date. + id ID + key *ecdsa.PrivateKey + db *DB + + // everything below is protected by a lock + mu sync.Mutex + seq uint64 + entries map[string]enr.Entry + endpoint4 lnEndpoint + endpoint6 lnEndpoint +} + +type lnEndpoint struct { + track *netutil.IPTracker + staticIP, fallbackIP net.IP + fallbackUDP int +} + +// NewLocalNode creates a local node. +func NewLocalNode(db *DB, key *ecdsa.PrivateKey) *LocalNode { + ln := &LocalNode{ + id: PubkeyToIDV4(&key.PublicKey), + db: db, + key: key, + entries: make(map[string]enr.Entry), + endpoint4: lnEndpoint{ + track: netutil.NewIPTracker(iptrackWindow, iptrackContactWindow, iptrackMinStatements), + }, + endpoint6: lnEndpoint{ + track: netutil.NewIPTracker(iptrackWindow, iptrackContactWindow, iptrackMinStatements), + }, + } + ln.seq = db.localSeq(ln.id) + ln.invalidate() + return ln +} + +// Database returns the node database associated with the local node. +func (ln *LocalNode) Database() *DB { + return ln.db +} + +// Node returns the current version of the local node record. +func (ln *LocalNode) Node() *Node { + n := ln.cur.Load().(*Node) + if n != nil { + return n + } + // Record was invalidated, sign a new copy. + ln.mu.Lock() + defer ln.mu.Unlock() + ln.sign() + return ln.cur.Load().(*Node) +} + +// Seq returns the current sequence number of the local node record. +func (ln *LocalNode) Seq() uint64 { + ln.mu.Lock() + defer ln.mu.Unlock() + + return ln.seq +} + +// ID returns the local node ID. +func (ln *LocalNode) ID() ID { + return ln.id +} + +// Set puts the given entry into the local record, overwriting any existing value. +// Use Set*IP and SetFallbackUDP to set IP addresses and UDP port, otherwise they'll +// be overwritten by the endpoint predictor. +func (ln *LocalNode) Set(e enr.Entry) { + ln.mu.Lock() + defer ln.mu.Unlock() + + ln.set(e) +} + +func (ln *LocalNode) set(e enr.Entry) { + val, exists := ln.entries[e.ENRKey()] + if !exists || !reflect.DeepEqual(val, e) { + ln.entries[e.ENRKey()] = e + ln.invalidate() + } +} + +// Delete removes the given entry from the local record. +func (ln *LocalNode) Delete(e enr.Entry) { + ln.mu.Lock() + defer ln.mu.Unlock() + + ln.delete(e) +} + +func (ln *LocalNode) delete(e enr.Entry) { + _, exists := ln.entries[e.ENRKey()] + if exists { + delete(ln.entries, e.ENRKey()) + ln.invalidate() + } +} + +func (ln *LocalNode) endpointForIP(ip net.IP) *lnEndpoint { + if ip.To4() != nil { + return &ln.endpoint4 + } + return &ln.endpoint6 +} + +// SetStaticIP sets the local IP to the given one unconditionally. +// This disables endpoint prediction. +func (ln *LocalNode) SetStaticIP(ip net.IP) { + ln.mu.Lock() + defer ln.mu.Unlock() + + ln.endpointForIP(ip).staticIP = ip + ln.updateEndpoints() +} + +// SetFallbackIP sets the last-resort IP address. This address is used +// if no endpoint prediction can be made and no static IP is set. +func (ln *LocalNode) SetFallbackIP(ip net.IP) { + ln.mu.Lock() + defer ln.mu.Unlock() + + ln.endpointForIP(ip).fallbackIP = ip + ln.updateEndpoints() +} + +// SetFallbackUDP sets the last-resort UDP-on-IPv4 port. This port is used +// if no endpoint prediction can be made. +func (ln *LocalNode) SetFallbackUDP(port int) { + ln.mu.Lock() + defer ln.mu.Unlock() + + ln.endpoint4.fallbackUDP = port + ln.endpoint6.fallbackUDP = port + ln.updateEndpoints() +} + +// UDPEndpointStatement should be called whenever a statement about the local node's +// UDP endpoint is received. It feeds the local endpoint predictor. +func (ln *LocalNode) UDPEndpointStatement(fromaddr, endpoint *net.UDPAddr) { + ln.mu.Lock() + defer ln.mu.Unlock() + + ln.endpointForIP(endpoint.IP).track.AddStatement(fromaddr.String(), endpoint.String()) + ln.updateEndpoints() +} + +// UDPContact should be called whenever the local node has announced itself to another node +// via UDP. It feeds the local endpoint predictor. +func (ln *LocalNode) UDPContact(toaddr *net.UDPAddr) { + ln.mu.Lock() + defer ln.mu.Unlock() + + ln.endpointForIP(toaddr.IP).track.AddContact(toaddr.String()) + ln.updateEndpoints() +} + +// updateEndpoints updates the record with predicted endpoints. +func (ln *LocalNode) updateEndpoints() { + ip4, udp4 := ln.endpoint4.get() + ip6, udp6 := ln.endpoint6.get() + + if ip4 != nil && !ip4.IsUnspecified() { + ln.set(enr.IPv4(ip4)) + } else { + ln.delete(enr.IPv4{}) + } + if ip6 != nil && !ip6.IsUnspecified() { + ln.set(enr.IPv6(ip6)) + } else { + ln.delete(enr.IPv6{}) + } + if udp4 != 0 { + ln.set(enr.UDP(udp4)) + } else { + ln.delete(enr.UDP(0)) + } + if udp6 != 0 && udp6 != udp4 { + ln.set(enr.UDP6(udp6)) + } else { + ln.delete(enr.UDP6(0)) + } +} + +// get returns the endpoint with highest precedence. +func (e *lnEndpoint) get() (newIP net.IP, newPort int) { + newPort = e.fallbackUDP + if e.fallbackIP != nil { + newIP = e.fallbackIP + } + if e.staticIP != nil { + newIP = e.staticIP + } else if ip, port := predictAddr(e.track); ip != nil { + newIP = ip + newPort = port + } + return newIP, newPort +} + +// predictAddr wraps IPTracker.PredictEndpoint, converting from its string-based +// endpoint representation to IP and port types. +func predictAddr(t *netutil.IPTracker) (net.IP, int) { + ep := t.PredictEndpoint() + if ep == "" { + return nil, 0 + } + ipString, portString, _ := net.SplitHostPort(ep) + ip := net.ParseIP(ipString) + port, _ := strconv.Atoi(portString) + return ip, port +} + +func (ln *LocalNode) invalidate() { + ln.cur.Store((*Node)(nil)) +} + +func (ln *LocalNode) sign() { + if n := ln.cur.Load().(*Node); n != nil { + return // no changes + } + + var r enr.Record + for _, e := range ln.entries { + r.Set(e) + } + ln.bumpSeq() + r.SetSeq(ln.seq) + if err := SignV4(&r, ln.key); err != nil { + panic(fmt.Errorf("enode: can't sign record: %v", err)) + } + n, err := New(ValidSchemes, &r) + if err != nil { + panic(fmt.Errorf("enode: can't verify local record: %v", err)) + } + ln.cur.Store(n) + log.Info("New local node record", "seq", ln.seq, "id", n.ID(), "ip", n.IP(), "udp", n.UDP(), "tcp", n.TCP()) +} + +func (ln *LocalNode) bumpSeq() { + ln.seq++ + ln.db.storeLocalSeq(ln.id, ln.seq) +} diff --git a/p2p/enode/localnode_test.go b/p2p/enode/localnode_test.go new file mode 100644 index 000000000000..00746a8d277a --- /dev/null +++ b/p2p/enode/localnode_test.go @@ -0,0 +1,122 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package enode + +import ( + "math/rand" + "net" + "testing" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/stretchr/testify/assert" +) + +func newLocalNodeForTesting() (*LocalNode, *DB) { + db, _ := OpenDB("") + key, _ := crypto.GenerateKey() + return NewLocalNode(db, key), db +} + +func TestLocalNode(t *testing.T) { + ln, db := newLocalNodeForTesting() + defer db.Close() + + if ln.Node().ID() != ln.ID() { + t.Fatal("inconsistent ID") + } + + ln.Set(enr.WithEntry("x", uint(3))) + var x uint + if err := ln.Node().Load(enr.WithEntry("x", &x)); err != nil { + t.Fatal("can't load entry 'x':", err) + } else if x != 3 { + t.Fatal("wrong value for entry 'x':", x) + } +} + +func TestLocalNodeSeqPersist(t *testing.T) { + ln, db := newLocalNodeForTesting() + defer db.Close() + + if s := ln.Node().Seq(); s != 1 { + t.Fatalf("wrong initial seq %d, want 1", s) + } + ln.Set(enr.WithEntry("x", uint(1))) + if s := ln.Node().Seq(); s != 2 { + t.Fatalf("wrong seq %d after set, want 2", s) + } + + // Create a new instance, it should reload the sequence number. + // The number increases just after that because a new record is + // created without the "x" entry. + ln2 := NewLocalNode(db, ln.key) + if s := ln2.Node().Seq(); s != 3 { + t.Fatalf("wrong seq %d on new instance, want 3", s) + } + + // Create a new instance with a different node key on the same database. + // This should reset the sequence number. + key, _ := crypto.GenerateKey() + ln3 := NewLocalNode(db, key) + if s := ln3.Node().Seq(); s != 1 { + t.Fatalf("wrong seq %d on instance with changed key, want 1", s) + } +} + +// This test checks behavior of the endpoint predictor. +func TestLocalNodeEndpoint(t *testing.T) { + var ( + fallback = &net.UDPAddr{IP: net.IP{127, 0, 0, 1}, Port: 80} + predicted = &net.UDPAddr{IP: net.IP{127, 0, 1, 2}, Port: 81} + staticIP = net.IP{127, 0, 1, 2} + ) + ln, db := newLocalNodeForTesting() + defer db.Close() + + // Nothing is set initially. + assert.Equal(t, net.IP(nil), ln.Node().IP()) + assert.Equal(t, 0, ln.Node().UDP()) + assert.Equal(t, uint64(1), ln.Node().Seq()) + + // Set up fallback address. + ln.SetFallbackIP(fallback.IP) + ln.SetFallbackUDP(fallback.Port) + assert.Equal(t, fallback.IP, ln.Node().IP()) + assert.Equal(t, fallback.Port, ln.Node().UDP()) + assert.Equal(t, uint64(2), ln.Node().Seq()) + + // Add endpoint statements from random hosts. + for i := 0; i < iptrackMinStatements; i++ { + assert.Equal(t, fallback.IP, ln.Node().IP()) + assert.Equal(t, fallback.Port, ln.Node().UDP()) + assert.Equal(t, uint64(2), ln.Node().Seq()) + + from := &net.UDPAddr{IP: make(net.IP, 4), Port: 90} + rand.Read(from.IP) + ln.UDPEndpointStatement(from, predicted) + } + assert.Equal(t, predicted.IP, ln.Node().IP()) + assert.Equal(t, predicted.Port, ln.Node().UDP()) + assert.Equal(t, uint64(3), ln.Node().Seq()) + + // Static IP overrides prediction. + ln.SetStaticIP(staticIP) + assert.Equal(t, staticIP, ln.Node().IP()) + assert.Equal(t, fallback.Port, ln.Node().UDP()) + assert.Equal(t, uint64(4), ln.Node().Seq()) +} diff --git a/p2p/enode/node.go b/p2p/enode/node.go index 84088fcd2606..9eb2544ffe14 100644 --- a/p2p/enode/node.go +++ b/p2p/enode/node.go @@ -18,6 +18,7 @@ package enode import ( "crypto/ecdsa" + "encoding/base64" "encoding/hex" "errors" "fmt" @@ -27,8 +28,11 @@ import ( "strings" "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" ) +var errMissingPrefix = errors.New("missing 'enr:' prefix for base64-encoded record") + // Node represents a host on the network. type Node struct { r enr.Record @@ -48,6 +52,34 @@ func New(validSchemes enr.IdentityScheme, r *enr.Record) (*Node, error) { return node, nil } +// MustParse parses a node record or enode:// URL. It panics if the input is invalid. +func MustParse(rawurl string) *Node { + n, err := Parse(ValidSchemes, rawurl) + if err != nil { + panic("invalid node: " + err.Error()) + } + return n +} + +// Parse decodes and verifies a base64-encoded node record. +func Parse(validSchemes enr.IdentityScheme, input string) (*Node, error) { + if strings.HasPrefix(input, "enode://") { + return ParseV4(input) + } + if !strings.HasPrefix(input, "enr:") { + return nil, errMissingPrefix + } + bin, err := base64.RawURLEncoding.DecodeString(input[4:]) + if err != nil { + return nil, err + } + var r enr.Record + if err := rlp.DecodeBytes(bin, &r); err != nil { + return nil, err + } + return New(validSchemes, &r) +} + // ID returns the node identifier. func (n *Node) ID() ID { return n.id @@ -68,11 +100,19 @@ func (n *Node) Load(k enr.Entry) error { return n.r.Load(k) } -// IP returns the IP address of the node. +// IP returns the IP address of the node. This prefers IPv4 addresses. func (n *Node) IP() net.IP { - var ip net.IP - n.Load((*enr.IP)(&ip)) - return ip + var ( + ip4 enr.IPv4 + ip6 enr.IPv6 + ) + if n.Load(&ip4) == nil { + return net.IP(ip4) + } + if n.Load(&ip6) == nil { + return net.IP(ip6) + } + return nil } // UDP returns the UDP port of the node. @@ -98,10 +138,18 @@ func (n *Node) Pubkey() *ecdsa.PublicKey { return &key } -// checks whether n is a valid complete node. +// Record returns the node's record. The return value is a copy and may +// be modified by the caller. +func (n *Node) Record() *enr.Record { + cpy := n.r + return &cpy +} + +// ValidateComplete checks whether n has a valid IP and UDP port. +// Deprecated: don't use this method. func (n *Node) ValidateComplete() error { if n.Incomplete() { - return errors.New("incomplete node") + return errors.New("missing IP address") } if n.UDP() == 0 { return errors.New("missing UDP port") @@ -115,20 +163,24 @@ func (n *Node) ValidateComplete() error { return n.Load(&key) } -// The string representation of a Node is a URL. -// Please see ParseNode for a description of the format. +// String returns the text representation of the record. func (n *Node) String() string { - return n.v4URL() + if isNewV4(n) { + return n.URLv4() // backwards-compatibility glue for NewV4 nodes + } + enc, _ := rlp.EncodeToBytes(&n.r) // always succeeds because record is valid + b64 := base64.RawURLEncoding.EncodeToString(enc) + return "enr:" + b64 } // MarshalText implements encoding.TextMarshaler. func (n *Node) MarshalText() ([]byte, error) { - return []byte(n.v4URL()), nil + return []byte(n.String()), nil } // UnmarshalText implements encoding.TextUnmarshaler. func (n *Node) UnmarshalText(text []byte) error { - dec, err := ParseV4(string(text)) + dec, err := Parse(ValidSchemes, string(text)) if err == nil { *n = *dec } diff --git a/p2p/enode/node_test.go b/p2p/enode/node_test.go index 861a70bd64e9..d15859c477a5 100644 --- a/p2p/enode/node_test.go +++ b/p2p/enode/node_test.go @@ -17,9 +17,12 @@ package enode import ( + "bytes" "encoding/hex" "fmt" + "math/big" "testing" + "testing/quick" "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/rlp" @@ -43,7 +46,7 @@ func TestPythonInterop(t *testing.T) { var ( wantID = HexID("a448f24c6d18e575453db13171562b71999873db5b286df957af199ec94617f7") wantSeq = uint64(1) - wantIP = enr.IP{127, 0, 0, 1} + wantIP = enr.IPv4{127, 0, 0, 1} wantUDP = enr.UDP(30303) ) if n.Seq() != wantSeq { @@ -52,7 +55,7 @@ func TestPythonInterop(t *testing.T) { if n.ID() != wantID { t.Errorf("wrong id: got %x, want %x", n.ID(), wantID) } - want := map[enr.Entry]interface{}{new(enr.IP): &wantIP, new(enr.UDP): &wantUDP} + want := map[enr.Entry]interface{}{new(enr.IPv4): &wantIP, new(enr.UDP): &wantUDP} for k, v := range want { desc := fmt.Sprintf("loading key %q", k.ENRKey()) if assert.NoError(t, n.Load(k), desc) { @@ -60,3 +63,83 @@ func TestPythonInterop(t *testing.T) { } } } + +func TestHexID(t *testing.T) { + ref := ID{0, 0, 0, 0, 0, 0, 0, 128, 106, 217, 182, 31, 165, 174, 1, 67, 7, 235, 220, 150, 66, 83, 173, 205, 159, 44, 10, 57, 42, 161, 26, 188} + id1 := HexID("0x00000000000000806ad9b61fa5ae014307ebdc964253adcd9f2c0a392aa11abc") + id2 := HexID("00000000000000806ad9b61fa5ae014307ebdc964253adcd9f2c0a392aa11abc") + + if id1 != ref { + t.Errorf("wrong id1\ngot %v\nwant %v", id1[:], ref[:]) + } + if id2 != ref { + t.Errorf("wrong id2\ngot %v\nwant %v", id2[:], ref[:]) + } +} + +func TestID_textEncoding(t *testing.T) { + ref := ID{ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, + 0x31, 0x32, + } + hex := "0102030405060708091011121314151617181920212223242526272829303132" + + text, err := ref.MarshalText() + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(text, []byte(hex)) { + t.Fatalf("text encoding did not match\nexpected: %s\ngot: %s", hex, text) + } + + id := new(ID) + if err := id.UnmarshalText(text); err != nil { + t.Fatal(err) + } + if *id != ref { + t.Fatalf("text decoding did not match\nexpected: %s\ngot: %s", ref, id) + } +} + +func TestID_distcmp(t *testing.T) { + distcmpBig := func(target, a, b ID) int { + tbig := new(big.Int).SetBytes(target[:]) + abig := new(big.Int).SetBytes(a[:]) + bbig := new(big.Int).SetBytes(b[:]) + return new(big.Int).Xor(tbig, abig).Cmp(new(big.Int).Xor(tbig, bbig)) + } + if err := quick.CheckEqual(DistCmp, distcmpBig, nil); err != nil { + t.Error(err) + } +} + +// The random tests is likely to miss the case where a and b are equal, +// this test checks it explicitly. +func TestID_distcmpEqual(t *testing.T) { + base := ID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} + x := ID{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + if DistCmp(base, x, x) != 0 { + t.Errorf("DistCmp(base, x, x) != 0") + } +} + +func TestID_logdist(t *testing.T) { + logdistBig := func(a, b ID) int { + abig, bbig := new(big.Int).SetBytes(a[:]), new(big.Int).SetBytes(b[:]) + return new(big.Int).Xor(abig, bbig).BitLen() + } + if err := quick.CheckEqual(LogDist, logdistBig, nil); err != nil { + t.Error(err) + } +} + +// The random tests is likely to miss the case where a and b are equal, +// this test checks it explicitly. +func TestID_logdistEqual(t *testing.T) { + x := ID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} + if LogDist(x, x) != 0 { + t.Errorf("LogDist(x, x) != 0") + } +} diff --git a/p2p/enode/nodedb.go b/p2p/enode/nodedb.go index a929b75d7b7c..44332640c75d 100644 --- a/p2p/enode/nodedb.go +++ b/p2p/enode/nodedb.go @@ -1,4 +1,4 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -21,11 +21,11 @@ import ( "crypto/rand" "encoding/binary" "fmt" + "net" "os" "sync" "time" - "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/errors" @@ -35,13 +35,33 @@ import ( "github.com/syndtr/goleveldb/leveldb/util" ) -var ( - nodeDBNilID = ID{} // Special node ID to use as a nil element. - nodeDBNodeExpiration = 24 * time.Hour // Time after which an unseen node should be dropped. - nodeDBCleanupCycle = time.Hour // Time period for running the expiration task. - nodeDBVersion = 6 +// Keys in the node database. +const ( + dbVersionKey = "version" // Version of the database to flush if changes + dbNodePrefix = "n:" // Identifier to prefix node entries with + dbLocalPrefix = "local:" + dbDiscoverRoot = "v4" + + // These fields are stored per ID and IP, the full key is "n::v4::findfail". + // Use nodeItemKey to create those keys. + dbNodeFindFails = "findfail" + dbNodePing = "lastping" + dbNodePong = "lastpong" + dbNodeSeq = "seq" + + // Local information is keyed by ID only, the full key is "local::seq". + // Use localItemKey to create those keys. + dbLocalSeq = "seq" ) +const ( + dbNodeExpiration = 24 * time.Hour // Time after which an unseen node should be dropped. + dbCleanupCycle = time.Hour // Time period for running the expiration task. + dbVersion = 9 +) + +var zeroIP = make(net.IP, 16) + // DB is the node database, storing previously seen nodes and any collected metadata about // them for QoS purposes. type DB struct { @@ -50,17 +70,6 @@ type DB struct { quit chan struct{} // Channel to signal the expiring thread to stop } -// Schema layout for the node database -var ( - nodeDBVersionKey = []byte("version") // Version of the database to flush if changes - nodeDBItemPrefix = []byte("n:") // Identifier to prefix node entries with - - nodeDBDiscoverRoot = ":discover" - nodeDBDiscoverPing = nodeDBDiscoverRoot + ":lastping" - nodeDBDiscoverPong = nodeDBDiscoverRoot + ":lastpong" - nodeDBDiscoverFindFails = nodeDBDiscoverRoot + ":findfail" -) - // OpenDB opens a node database for storing and retrieving infos about known peers in the // network. If no path is given an in-memory, temporary database is constructed. func OpenDB(path string) (*DB, error) { @@ -93,13 +102,13 @@ func newPersistentDB(path string) (*DB, error) { // The nodes contained in the cache correspond to a certain protocol version. // Flush all nodes if the version doesn't match. currentVer := make([]byte, binary.MaxVarintLen64) - currentVer = currentVer[:binary.PutVarint(currentVer, int64(nodeDBVersion))] + currentVer = currentVer[:binary.PutVarint(currentVer, int64(dbVersion))] - blob, err := db.Get(nodeDBVersionKey, nil) + blob, err := db.Get([]byte(dbVersionKey), nil) switch err { case leveldb.ErrNotFound: // Version not found (i.e. empty cache), insert it - if err := db.Put(nodeDBVersionKey, currentVer, nil); err != nil { + if err := db.Put([]byte(dbVersionKey), currentVer, nil); err != nil { db.Close() return nil, err } @@ -117,31 +126,61 @@ func newPersistentDB(path string) (*DB, error) { return &DB{lvl: db, quit: make(chan struct{})}, nil } -// makeKey generates the leveldb key-blob from a node id and its particular -// field of interest. -func makeKey(id ID, field string) []byte { - if bytes.Equal(id[:], nodeDBNilID[:]) { - return []byte(field) - } - return append(nodeDBItemPrefix, append(id[:], field...)...) +// nodeKey returns the database key for a node record. +func nodeKey(id ID) []byte { + key := append([]byte(dbNodePrefix), id[:]...) + key = append(key, ':') + key = append(key, dbDiscoverRoot...) + return key } -// splitKey tries to split a database key into a node id and a field part. -func splitKey(key []byte) (id ID, field string) { - // If the key is not of a node, return it plainly - if !bytes.HasPrefix(key, nodeDBItemPrefix) { - return ID{}, string(key) +// splitNodeKey returns the node ID of a key created by nodeKey. +func splitNodeKey(key []byte) (id ID, rest []byte) { + if !bytes.HasPrefix(key, []byte(dbNodePrefix)) { + return ID{}, nil } - // Otherwise split the id and field - item := key[len(nodeDBItemPrefix):] + item := key[len(dbNodePrefix):] copy(id[:], item[:len(id)]) - field = string(item[len(id):]) + return id, item[len(id)+1:] +} + +// nodeItemKey returns the database key for a node metadata field. +func nodeItemKey(id ID, ip net.IP, field string) []byte { + ip16 := ip.To16() + if ip16 == nil { + panic(fmt.Errorf("invalid IP (length %d)", len(ip))) + } + return bytes.Join([][]byte{nodeKey(id), ip16, []byte(field)}, []byte{':'}) +} + +// splitNodeItemKey returns the components of a key created by nodeItemKey. +func splitNodeItemKey(key []byte) (id ID, ip net.IP, field string) { + id, key = splitNodeKey(key) + // Skip discover root. + if string(key) == dbDiscoverRoot { + return id, nil, "" + } + key = key[len(dbDiscoverRoot)+1:] + // Split out the IP. + ip = net.IP(key[:16]) + if ip4 := ip.To4(); ip4 != nil { + ip = ip4 + } + key = key[16+1:] + // Field is the remainder of key. + field = string(key) + return id, ip, field +} - return id, field +// localItemKey returns the key of a local node item. +func localItemKey(id ID, field string) []byte { + key := append([]byte(dbLocalPrefix), id[:]...) + key = append(key, ':') + key = append(key, field...) + return key } -// fetchInt64 retrieves an integer instance associated with a particular -// database key. +// fetchInt64 retrieves an integer associated with a particular key. func (db *DB) fetchInt64(key []byte) int64 { blob, err := db.lvl.Get(key, nil) if err != nil { @@ -154,18 +193,33 @@ func (db *DB) fetchInt64(key []byte) int64 { return val } -// storeInt64 update a specific database entry to the current time instance as a -// unix timestamp. +// storeInt64 stores an integer in the given key. func (db *DB) storeInt64(key []byte, n int64) error { blob := make([]byte, binary.MaxVarintLen64) blob = blob[:binary.PutVarint(blob, n)] + return db.lvl.Put(key, blob, nil) +} + +// fetchUint64 retrieves an integer associated with a particular key. +func (db *DB) fetchUint64(key []byte) uint64 { + blob, err := db.lvl.Get(key, nil) + if err != nil { + return 0 + } + val, _ := binary.Uvarint(blob) + return val +} +// storeUint64 stores an integer in the given key. +func (db *DB) storeUint64(key []byte, n uint64) error { + blob := make([]byte, binary.MaxVarintLen64) + blob = blob[:binary.PutUvarint(blob, n)] return db.lvl.Put(key, blob, nil) } // Node retrieves a node with a given id from the database. func (db *DB) Node(id ID) *Node { - blob, err := db.lvl.Get(makeKey(id, nodeDBDiscoverRoot), nil) + blob, err := db.lvl.Get(nodeKey(id), nil) if err != nil { return nil } @@ -184,22 +238,44 @@ func mustDecodeNode(id, data []byte) *Node { // UpdateNode inserts - potentially overwriting - a node into the peer database. func (db *DB) UpdateNode(node *Node) error { + if node.Seq() < db.NodeSeq(node.ID()) { + return nil + } blob, err := rlp.EncodeToBytes(&node.r) if err != nil { return err } - return db.lvl.Put(makeKey(node.ID(), nodeDBDiscoverRoot), blob, nil) + if err := db.lvl.Put(nodeKey(node.ID()), blob, nil); err != nil { + return err + } + return db.storeUint64(nodeItemKey(node.ID(), zeroIP, dbNodeSeq), node.Seq()) } -// DeleteNode deletes all information/keys associated with a node. -func (db *DB) DeleteNode(id ID) error { - deleter := db.lvl.NewIterator(util.BytesPrefix(makeKey(id, "")), nil) - for deleter.Next() { - if err := db.lvl.Delete(deleter.Key(), nil); err != nil { - return err - } +// NodeSeq returns the stored record sequence number of the given node. +func (db *DB) NodeSeq(id ID) uint64 { + return db.fetchUint64(nodeItemKey(id, zeroIP, dbNodeSeq)) +} + +// Resolve returns the stored record of the node if it has a larger sequence +// number than n. +func (db *DB) Resolve(n *Node) *Node { + if n.Seq() > db.NodeSeq(n.ID()) { + return n + } + return db.Node(n.ID()) +} + +// DeleteNode deletes all information associated with a node. +func (db *DB) DeleteNode(id ID) { + deleteRange(db.lvl, nodeKey(id)) +} + +func deleteRange(db *leveldb.DB, prefix []byte) { + it := db.NewIterator(util.BytesPrefix(prefix), nil) + defer it.Release() + for it.Next() { + db.Delete(it.Key(), nil) } - return nil } // ensureExpirer is a small helper method ensuring that the data expiration @@ -218,14 +294,12 @@ func (db *DB) ensureExpirer() { // expirer should be started in a go routine, and is responsible for looping ad // infinitum and dropping stale data from the database. func (db *DB) expirer() { - tick := time.NewTicker(nodeDBCleanupCycle) + tick := time.NewTicker(dbCleanupCycle) defer tick.Stop() for { select { case <-tick.C: - if err := db.expireNodes(); err != nil { - log.Error("Failed to expire nodedb items", "err", err) - } + db.expireNodes() case <-db.quit: return } @@ -233,61 +307,85 @@ func (db *DB) expirer() { } // expireNodes iterates over the database and deletes all nodes that have not -// been seen (i.e. received a pong from) for some allotted time. -func (db *DB) expireNodes() error { - threshold := time.Now().Add(-nodeDBNodeExpiration) - - // Find discovered nodes that are older than the allowance - it := db.lvl.NewIterator(nil, nil) +// been seen (i.e. received a pong from) for some time. +func (db *DB) expireNodes() { + it := db.lvl.NewIterator(util.BytesPrefix([]byte(dbNodePrefix)), nil) defer it.Release() + if !it.Next() { + return + } - for it.Next() { - // Skip the item if not a discovery node - id, field := splitKey(it.Key()) - if field != nodeDBDiscoverRoot { - continue + var ( + threshold = time.Now().Add(-dbNodeExpiration).Unix() + youngestPong int64 + atEnd = false + ) + for !atEnd { + id, ip, field := splitNodeItemKey(it.Key()) + if field == dbNodePong { + time, _ := binary.Varint(it.Value()) + if time > youngestPong { + youngestPong = time + } + if time < threshold { + // Last pong from this IP older than threshold, remove fields belonging to it. + deleteRange(db.lvl, nodeItemKey(id, ip, "")) + } } - // Skip the node if not expired yet (and not self) - if seen := db.LastPongReceived(id); seen.After(threshold) { - continue + atEnd = !it.Next() + nextID, _ := splitNodeKey(it.Key()) + if atEnd || nextID != id { + // We've moved beyond the last entry of the current ID. + // Remove everything if there was no recent enough pong. + if youngestPong > 0 && youngestPong < threshold { + deleteRange(db.lvl, nodeKey(id)) + } + youngestPong = 0 } - // Otherwise delete all associated information - db.DeleteNode(id) } - return nil } // LastPingReceived retrieves the time of the last ping packet received from // a remote node. -func (db *DB) LastPingReceived(id ID) time.Time { - return time.Unix(db.fetchInt64(makeKey(id, nodeDBDiscoverPing)), 0) +func (db *DB) LastPingReceived(id ID, ip net.IP) time.Time { + return time.Unix(db.fetchInt64(nodeItemKey(id, ip, dbNodePing)), 0) } // UpdateLastPingReceived updates the last time we tried contacting a remote node. -func (db *DB) UpdateLastPingReceived(id ID, instance time.Time) error { - return db.storeInt64(makeKey(id, nodeDBDiscoverPing), instance.Unix()) +func (db *DB) UpdateLastPingReceived(id ID, ip net.IP, instance time.Time) error { + return db.storeInt64(nodeItemKey(id, ip, dbNodePing), instance.Unix()) } // LastPongReceived retrieves the time of the last successful pong from remote node. -func (db *DB) LastPongReceived(id ID) time.Time { +func (db *DB) LastPongReceived(id ID, ip net.IP) time.Time { // Launch expirer db.ensureExpirer() - return time.Unix(db.fetchInt64(makeKey(id, nodeDBDiscoverPong)), 0) + return time.Unix(db.fetchInt64(nodeItemKey(id, ip, dbNodePong)), 0) } // UpdateLastPongReceived updates the last pong time of a node. -func (db *DB) UpdateLastPongReceived(id ID, instance time.Time) error { - return db.storeInt64(makeKey(id, nodeDBDiscoverPong), instance.Unix()) +func (db *DB) UpdateLastPongReceived(id ID, ip net.IP, instance time.Time) error { + return db.storeInt64(nodeItemKey(id, ip, dbNodePong), instance.Unix()) } // FindFails retrieves the number of findnode failures since bonding. -func (db *DB) FindFails(id ID) int { - return int(db.fetchInt64(makeKey(id, nodeDBDiscoverFindFails))) +func (db *DB) FindFails(id ID, ip net.IP) int { + return int(db.fetchInt64(nodeItemKey(id, ip, dbNodeFindFails))) } // UpdateFindFails updates the number of findnode failures since bonding. -func (db *DB) UpdateFindFails(id ID, fails int) error { - return db.storeInt64(makeKey(id, nodeDBDiscoverFindFails), int64(fails)) +func (db *DB) UpdateFindFails(id ID, ip net.IP, fails int) error { + return db.storeInt64(nodeItemKey(id, ip, dbNodeFindFails), int64(fails)) +} + +// LocalSeq retrieves the local record sequence counter. +func (db *DB) localSeq(id ID) uint64 { + return db.fetchUint64(localItemKey(id, dbLocalSeq)) +} + +// storeLocalSeq stores the local record sequence counter. +func (db *DB) storeLocalSeq(id ID, n uint64) { + db.storeUint64(localItemKey(id, dbLocalSeq), n) } // QuerySeeds retrieves random nodes to be used as potential seed nodes @@ -309,14 +407,14 @@ seek: ctr := id[0] rand.Read(id[:]) id[0] = ctr + id[0]%16 - it.Seek(makeKey(id, nodeDBDiscoverRoot)) + it.Seek(nodeKey(id)) n := nextNode(it) if n == nil { id[0] = 0 continue seek // iterator exhausted } - if now.Sub(db.LastPongReceived(n.ID())) > maxAge { + if now.Sub(db.LastPongReceived(n.ID(), n.IP())) > maxAge { continue seek } for i := range nodes { @@ -333,8 +431,8 @@ seek: // database entries. func nextNode(it iterator.Iterator) *Node { for end := false; !end; end = !it.Next() { - id, field := splitKey(it.Key()) - if field != nodeDBDiscoverRoot { + id, rest := splitNodeKey(it.Key()) + if string(rest) != dbDiscoverRoot { continue } return mustDecodeNode(id[:], it.Value()) diff --git a/p2p/enode/nodedb_test.go b/p2p/enode/nodedb_test.go index b476a3439d63..2adb14145d15 100644 --- a/p2p/enode/nodedb_test.go +++ b/p2p/enode/nodedb_test.go @@ -1,4 +1,4 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -28,42 +28,54 @@ import ( "time" ) -var nodeDBKeyTests = []struct { - id ID - field string - key []byte -}{ - { - id: ID{}, - field: "version", - key: []byte{0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e}, // field - }, - { - id: HexID("51232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), - field: ":discover", - key: []byte{ - 0x6e, 0x3a, // prefix - 0x51, 0x23, 0x2b, 0x8d, 0x78, 0x21, 0x61, 0x7d, // node id - 0x2b, 0x29, 0xb5, 0x4b, 0x81, 0xcd, 0xef, 0xb9, // - 0xb3, 0xe9, 0xc3, 0x7d, 0x7f, 0xd5, 0xf6, 0x32, // - 0x70, 0xbc, 0xc9, 0xe1, 0xa6, 0xf6, 0xa4, 0x39, // - 0x3a, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, // field - }, - }, +var keytestID = HexID("51232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439") + +func TestDBNodeKey(t *testing.T) { + enc := nodeKey(keytestID) + want := []byte{ + 'n', ':', + 0x51, 0x23, 0x2b, 0x8d, 0x78, 0x21, 0x61, 0x7d, // node id + 0x2b, 0x29, 0xb5, 0x4b, 0x81, 0xcd, 0xef, 0xb9, // + 0xb3, 0xe9, 0xc3, 0x7d, 0x7f, 0xd5, 0xf6, 0x32, // + 0x70, 0xbc, 0xc9, 0xe1, 0xa6, 0xf6, 0xa4, 0x39, // + ':', 'v', '4', + } + if !bytes.Equal(enc, want) { + t.Errorf("wrong encoded key:\ngot %q\nwant %q", enc, want) + } + id, _ := splitNodeKey(enc) + if id != keytestID { + t.Errorf("wrong ID from splitNodeKey") + } } -func TestDBKeys(t *testing.T) { - for i, tt := range nodeDBKeyTests { - if key := makeKey(tt.id, tt.field); !bytes.Equal(key, tt.key) { - t.Errorf("make test %d: key mismatch: have 0x%x, want 0x%x", i, key, tt.key) - } - id, field := splitKey(tt.key) - if !bytes.Equal(id[:], tt.id[:]) { - t.Errorf("split test %d: id mismatch: have 0x%x, want 0x%x", i, id, tt.id) - } - if field != tt.field { - t.Errorf("split test %d: field mismatch: have 0x%x, want 0x%x", i, field, tt.field) - } +func TestDBNodeItemKey(t *testing.T) { + wantIP := net.IP{127, 0, 0, 3} + wantField := "foobar" + enc := nodeItemKey(keytestID, wantIP, wantField) + want := []byte{ + 'n', ':', + 0x51, 0x23, 0x2b, 0x8d, 0x78, 0x21, 0x61, 0x7d, // node id + 0x2b, 0x29, 0xb5, 0x4b, 0x81, 0xcd, 0xef, 0xb9, // + 0xb3, 0xe9, 0xc3, 0x7d, 0x7f, 0xd5, 0xf6, 0x32, // + 0x70, 0xbc, 0xc9, 0xe1, 0xa6, 0xf6, 0xa4, 0x39, // + ':', 'v', '4', ':', + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IP + 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x03, // + ':', 'f', 'o', 'o', 'b', 'a', 'r', + } + if !bytes.Equal(enc, want) { + t.Errorf("wrong encoded key:\ngot %q\nwant %q", enc, want) + } + id, ip, field := splitNodeItemKey(enc) + if id != keytestID { + t.Errorf("splitNodeItemKey returned wrong ID: %v", id) + } + if !ip.Equal(wantIP) { + t.Errorf("splitNodeItemKey returned wrong IP: %v", ip) + } + if field != wantField { + t.Errorf("splitNodeItemKey returned wrong field: %q", field) } } @@ -113,33 +125,33 @@ func TestDBFetchStore(t *testing.T) { defer db.Close() // Check fetch/store operations on a node ping object - if stored := db.LastPingReceived(node.ID()); stored.Unix() != 0 { + if stored := db.LastPingReceived(node.ID(), node.IP()); stored.Unix() != 0 { t.Errorf("ping: non-existing object: %v", stored) } - if err := db.UpdateLastPingReceived(node.ID(), inst); err != nil { + if err := db.UpdateLastPingReceived(node.ID(), node.IP(), inst); err != nil { t.Errorf("ping: failed to update: %v", err) } - if stored := db.LastPingReceived(node.ID()); stored.Unix() != inst.Unix() { + if stored := db.LastPingReceived(node.ID(), node.IP()); stored.Unix() != inst.Unix() { t.Errorf("ping: value mismatch: have %v, want %v", stored, inst) } // Check fetch/store operations on a node pong object - if stored := db.LastPongReceived(node.ID()); stored.Unix() != 0 { + if stored := db.LastPongReceived(node.ID(), node.IP()); stored.Unix() != 0 { t.Errorf("pong: non-existing object: %v", stored) } - if err := db.UpdateLastPongReceived(node.ID(), inst); err != nil { + if err := db.UpdateLastPongReceived(node.ID(), node.IP(), inst); err != nil { t.Errorf("pong: failed to update: %v", err) } - if stored := db.LastPongReceived(node.ID()); stored.Unix() != inst.Unix() { + if stored := db.LastPongReceived(node.ID(), node.IP()); stored.Unix() != inst.Unix() { t.Errorf("pong: value mismatch: have %v, want %v", stored, inst) } // Check fetch/store operations on a node findnode-failure object - if stored := db.FindFails(node.ID()); stored != 0 { + if stored := db.FindFails(node.ID(), node.IP()); stored != 0 { t.Errorf("find-node fails: non-existing object: %v", stored) } - if err := db.UpdateFindFails(node.ID(), num); err != nil { + if err := db.UpdateFindFails(node.ID(), node.IP(), num); err != nil { t.Errorf("find-node fails: failed to update: %v", err) } - if stored := db.FindFails(node.ID()); stored != num { + if stored := db.FindFails(node.ID(), node.IP()); stored != num { t.Errorf("find-node fails: value mismatch: have %v, want %v", stored, num) } // Check fetch/store operations on an actual node object @@ -256,7 +268,7 @@ func testSeedQuery() error { if err := db.UpdateNode(seed.node); err != nil { return fmt.Errorf("node %d: failed to insert: %v", i, err) } - if err := db.UpdateLastPongReceived(seed.node.ID(), seed.pong); err != nil { + if err := db.UpdateLastPongReceived(seed.node.ID(), seed.node.IP(), seed.pong); err != nil { return fmt.Errorf("node %d: failed to insert bondTime: %v", i, err) } } @@ -321,10 +333,12 @@ func TestDBPersistency(t *testing.T) { } var nodeDBExpirationNodes = []struct { - node *Node - pong time.Time - exp bool + node *Node + pong time.Time + storeNode bool + exp bool }{ + // Node has new enough pong time and isn't expired: { node: NewV4( hexPubkey("8d110e2ed4b446d9b5fb50f117e5f37fb7597af455e1dab0e6f045a6eeaa786a6781141659020d38bdc5e698ed3d4d2bafa8b5061810dfa63e8ac038db2e9b67"), @@ -332,17 +346,79 @@ var nodeDBExpirationNodes = []struct { 30303, 30303, ), - pong: time.Now().Add(-nodeDBNodeExpiration + time.Minute), - exp: false, - }, { + storeNode: true, + pong: time.Now().Add(-dbNodeExpiration + time.Minute), + exp: false, + }, + // Node with pong time before expiration is removed: + { node: NewV4( hexPubkey("913a205579c32425b220dfba999d215066e5bdbf900226b11da1907eae5e93eb40616d47412cf819664e9eacbdfcca6b0c6e07e09847a38472d4be46ab0c3672"), net.IP{127, 0, 0, 2}, 30303, 30303, ), - pong: time.Now().Add(-nodeDBNodeExpiration - time.Minute), - exp: true, + storeNode: true, + pong: time.Now().Add(-dbNodeExpiration - time.Minute), + exp: true, + }, + // Just pong time, no node stored: + { + node: NewV4( + hexPubkey("b56670e0b6bad2c5dab9f9fe6f061a16cf78d68b6ae2cfda3144262d08d97ce5f46fd8799b6d1f709b1abe718f2863e224488bd7518e5e3b43809ac9bd1138ca"), + net.IP{127, 0, 0, 3}, + 30303, + 30303, + ), + storeNode: false, + pong: time.Now().Add(-dbNodeExpiration - time.Minute), + exp: true, + }, + // Node with multiple pong times, all older than expiration. + { + node: NewV4( + hexPubkey("29f619cebfd32c9eab34aec797ed5e3fe15b9b45be95b4df3f5fe6a9ae892f433eb08d7698b2ef3621568b0fb70d57b515ab30d4e72583b798298e0f0a66b9d1"), + net.IP{127, 0, 0, 4}, + 30303, + 30303, + ), + storeNode: true, + pong: time.Now().Add(-dbNodeExpiration - time.Minute), + exp: true, + }, + { + node: NewV4( + hexPubkey("29f619cebfd32c9eab34aec797ed5e3fe15b9b45be95b4df3f5fe6a9ae892f433eb08d7698b2ef3621568b0fb70d57b515ab30d4e72583b798298e0f0a66b9d1"), + net.IP{127, 0, 0, 5}, + 30303, + 30303, + ), + storeNode: false, + pong: time.Now().Add(-dbNodeExpiration - 2*time.Minute), + exp: true, + }, + // Node with multiple pong times, one newer, one older than expiration. + { + node: NewV4( + hexPubkey("3b73a9e5f4af6c4701c57c73cc8cfa0f4802840b24c11eba92aac3aef65644a3728b4b2aec8199f6d72bd66be2c65861c773129039bd47daa091ca90a6d4c857"), + net.IP{127, 0, 0, 6}, + 30303, + 30303, + ), + storeNode: true, + pong: time.Now().Add(-dbNodeExpiration + time.Minute), + exp: false, + }, + { + node: NewV4( + hexPubkey("3b73a9e5f4af6c4701c57c73cc8cfa0f4802840b24c11eba92aac3aef65644a3728b4b2aec8199f6d72bd66be2c65861c773129039bd47daa091ca90a6d4c857"), + net.IP{127, 0, 0, 7}, + 30303, + 30303, + ), + storeNode: false, + pong: time.Now().Add(-dbNodeExpiration - time.Minute), + exp: true, }, } @@ -350,23 +426,39 @@ func TestDBExpiration(t *testing.T) { db, _ := OpenDB("") defer db.Close() - // Add all the test nodes and set their last pong time + // Add all the test nodes and set their last pong time. for i, seed := range nodeDBExpirationNodes { - if err := db.UpdateNode(seed.node); err != nil { - t.Fatalf("node %d: failed to insert: %v", i, err) + if seed.storeNode { + if err := db.UpdateNode(seed.node); err != nil { + t.Fatalf("node %d: failed to insert: %v", i, err) + } } - if err := db.UpdateLastPongReceived(seed.node.ID(), seed.pong); err != nil { + if err := db.UpdateLastPongReceived(seed.node.ID(), seed.node.IP(), seed.pong); err != nil { t.Fatalf("node %d: failed to update bondTime: %v", i, err) } } - // Expire some of them, and check the rest - if err := db.expireNodes(); err != nil { - t.Fatalf("failed to expire nodes: %v", err) - } + + db.expireNodes() + + // Check that expired entries have been removed. + unixZeroTime := time.Unix(0, 0) for i, seed := range nodeDBExpirationNodes { node := db.Node(seed.node.ID()) - if (node == nil && !seed.exp) || (node != nil && seed.exp) { - t.Errorf("node %d: expiration mismatch: have %v, want %v", i, node, seed.exp) + pong := db.LastPongReceived(seed.node.ID(), seed.node.IP()) + if seed.exp { + if seed.storeNode && node != nil { + t.Errorf("node %d (%s) shouldn't be present after expiration", i, seed.node.ID().TerminalString()) + } + if !pong.Equal(unixZeroTime) { + t.Errorf("pong time %d (%s %v) shouldn't be present after expiration", i, seed.node.ID().TerminalString(), seed.node.IP()) + } + } else { + if seed.storeNode && node == nil { + t.Errorf("node %d (%s) should be present after expiration", i, seed.node.ID().TerminalString()) + } + if !pong.Equal(seed.pong.Truncate(1 * time.Second)) { + t.Errorf("pong time %d (%s) should be %v after expiration, but is %v", i, seed.node.ID().TerminalString(), seed.pong, pong) + } } } } diff --git a/p2p/enode/urlv4.go b/p2p/enode/urlv4.go index 50e9485d04c4..2372d4820b0a 100644 --- a/p2p/enode/urlv4.go +++ b/p2p/enode/urlv4.go @@ -70,7 +70,7 @@ func ParseV4(rawurl string) (*Node, error) { if m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil { id, err := parsePubkey(m[1]) if err != nil { - return nil, fmt.Errorf("invalid node ID (%v)", err) + return nil, fmt.Errorf("invalid public key (%v)", err) } return NewV4(id, nil, 0, 0), nil } @@ -81,7 +81,7 @@ func ParseV4(rawurl string) (*Node, error) { // contained in the node has a zero-length signature. func NewV4(pubkey *ecdsa.PublicKey, ip net.IP, tcp, udp int) *Node { var r enr.Record - if ip != nil { + if len(ip) > 0 { r.Set(enr.IP(ip)) } if udp != 0 { @@ -98,6 +98,12 @@ func NewV4(pubkey *ecdsa.PublicKey, ip net.IP, tcp, udp int) *Node { return n } +// isNewV4 returns true for nodes created by NewV4. +func isNewV4(n *Node) bool { + var k s256raw + return n.r.IdentityScheme() == "" && n.r.Load(&k) == nil && len(n.r.Signature()) == 0 +} + func parseComplete(rawurl string) (*Node, error) { var ( id *ecdsa.PublicKey @@ -116,7 +122,7 @@ func parseComplete(rawurl string) (*Node, error) { return nil, errors.New("does not contain node ID") } if id, err = parsePubkey(u.User.String()); err != nil { - return nil, fmt.Errorf("invalid node ID (%v)", err) + return nil, fmt.Errorf("invalid public key (%v)", err) } // Parse the IP address. host, port, err := net.SplitHostPort(u.Host) @@ -126,10 +132,6 @@ func parseComplete(rawurl string) (*Node, error) { if ip = net.ParseIP(host); ip == nil { return nil, errors.New("invalid IP address") } - // Ensure the IP is 4 bytes long for IPv4 addresses. - if ipv4 := ip.To4(); ipv4 != nil { - ip = ipv4 - } // Parse the port numbers. if tcpPort, err = strconv.ParseUint(port, 10, 16); err != nil { return nil, errors.New("invalid port") @@ -157,7 +159,7 @@ func parsePubkey(in string) (*ecdsa.PublicKey, error) { return crypto.UnmarshalPubkey(b) } -func (n *Node) v4URL() string { +func (n *Node) URLv4() string { var ( scheme enr.ID nodeid string diff --git a/p2p/enode/urlv4_test.go b/p2p/enode/urlv4_test.go index 3680ab6b78b6..69ed1110213b 100644 --- a/p2p/enode/urlv4_test.go +++ b/p2p/enode/urlv4_test.go @@ -17,44 +17,63 @@ package enode import ( - "bytes" "crypto/ecdsa" - "math/big" "net" "reflect" "strings" "testing" - "testing/quick" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enr" ) var parseNodeTests = []struct { - rawurl string + input string wantError string wantResult *Node }{ + // Records + { + input: "enr:-IS4QGrdq0ugARp5T2BZ41TrZOqLc_oKvZoPuZP5--anqWE_J-Tucc1xgkOL7qXl0puJgT7qc2KSvcupc4NCb0nr4tdjgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQM6UUF2Rm-oFe1IH_rQkRCi00T2ybeMHRSvw1HDpRvjPYN1ZHCCdl8", + wantResult: func() *Node { + testKey, _ := crypto.HexToECDSA("45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8") + var r enr.Record + r.Set(enr.IP{127, 0, 0, 1}) + r.Set(enr.UDP(30303)) + r.SetSeq(99) + SignV4(&r, testKey) + n, _ := New(ValidSchemes, &r) + return n + }(), + }, + // Invalid Records { - rawurl: "http://foobar", - wantError: `invalid URL scheme, want "enode"`, + input: "enr:", + wantError: "EOF", // could be nicer }, { - rawurl: "enode://01010101@123.124.125.126:3", - wantError: `invalid node ID (wrong length, want 128 hex chars)`, + input: "enr:x", + wantError: "illegal base64 data at input byte 0", }, - // Complete nodes with IP address. { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@hostname:3", + input: "enr:-EmGZm9vYmFyY4JpZIJ2NIJpcIR_AAABiXNlY3AyNTZrMaEDOlFBdkZvqBXtSB_60JEQotNE9sm3jB0Ur8NRw6Ub4z2DdWRwgnZf", + wantError: enr.ErrInvalidSig.Error(), + }, + // Complete node URLs with IP address and ports + { + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@hostname:3", wantError: `invalid IP address`, }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:foo", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:foo", wantError: `invalid port`, }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:3?discport=foo", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:3?discport=foo", wantError: `invalid discport in query`, }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{0x7f, 0x0, 0x0, 0x1}, @@ -63,7 +82,7 @@ var parseNodeTests = []struct { ), }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@[::]:52150", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@[::]:52150", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.ParseIP("::"), @@ -72,7 +91,7 @@ var parseNodeTests = []struct { ), }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@[2001:db8:3c4d:15::abcd:ef12]:52150", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@[2001:db8:3c4d:15::abcd:ef12]:52150", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), @@ -81,7 +100,7 @@ var parseNodeTests = []struct { ), }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150?discport=22334", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150?discport=22334", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{0x7f, 0x0, 0x0, 0x1}, @@ -89,34 +108,42 @@ var parseNodeTests = []struct { 22334, ), }, - // Incomplete nodes with no address. + // Incomplete node URLs with no address { - rawurl: "1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), nil, 0, 0, ), }, + // Invalid URLs { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439", - wantResult: NewV4( - hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), - nil, 0, 0, - ), + input: "", + wantError: errMissingPrefix.Error(), }, - // Invalid URLs { - rawurl: "01010101", - wantError: `invalid node ID (wrong length, want 128 hex chars)`, + input: "1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439", + wantError: errMissingPrefix.Error(), }, { - rawurl: "enode://01010101", - wantError: `invalid node ID (wrong length, want 128 hex chars)`, + input: "01010101", + wantError: errMissingPrefix.Error(), }, { - // This test checks that errors from url.Parse are handled. - rawurl: "://foo", - wantError: `parse ://foo: missing protocol scheme`, + input: "enode://01010101@123.124.125.126:3", + wantError: `invalid public key (wrong length, want 128 hex chars)`, + }, + { + input: "enode://01010101", + wantError: `invalid public key (wrong length, want 128 hex chars)`, + }, + { + input: "http://foobar", + wantError: errMissingPrefix.Error(), + }, + { + input: "://foo", + wantError: errMissingPrefix.Error(), }, } @@ -130,22 +157,22 @@ func hexPubkey(h string) *ecdsa.PublicKey { func TestParseNode(t *testing.T) { for _, test := range parseNodeTests { - n, err := ParseV4(test.rawurl) + n, err := Parse(ValidSchemes, test.input) if test.wantError != "" { if err == nil { - t.Errorf("test %q:\n got nil error, expected %#q", test.rawurl, test.wantError) + t.Errorf("test %q:\n got nil error, expected %#q", test.input, test.wantError) continue } else if err.Error() != test.wantError { - t.Errorf("test %q:\n got error %#q, expected %#q", test.rawurl, err.Error(), test.wantError) + t.Errorf("test %q:\n got error %#q, expected %#q", test.input, err.Error(), test.wantError) continue } } else { if err != nil { - t.Errorf("test %q:\n unexpected error: %v", test.rawurl, err) + t.Errorf("test %q:\n unexpected error: %v", test.input, err) continue } if !reflect.DeepEqual(n, test.wantResult) { - t.Errorf("test %q:\n result mismatch:\ngot: %#v\nwant: %#v", test.rawurl, n, test.wantResult) + t.Errorf("test %q:\n result mismatch:\ngot: %#v\nwant: %#v", test.input, n, test.wantResult) } } } @@ -153,91 +180,11 @@ func TestParseNode(t *testing.T) { func TestNodeString(t *testing.T) { for i, test := range parseNodeTests { - if test.wantError == "" && strings.HasPrefix(test.rawurl, "enode://") { + if test.wantError == "" && strings.HasPrefix(test.input, "enode://") { str := test.wantResult.String() - if str != test.rawurl { - t.Errorf("test %d: Node.String() mismatch:\ngot: %s\nwant: %s", i, str, test.rawurl) + if str != test.input { + t.Errorf("test %d: Node.String() mismatch:\ngot: %s\nwant: %s", i, str, test.input) } } } } - -func TestHexID(t *testing.T) { - ref := ID{0, 0, 0, 0, 0, 0, 0, 128, 106, 217, 182, 31, 165, 174, 1, 67, 7, 235, 220, 150, 66, 83, 173, 205, 159, 44, 10, 57, 42, 161, 26, 188} - id1 := HexID("0x00000000000000806ad9b61fa5ae014307ebdc964253adcd9f2c0a392aa11abc") - id2 := HexID("00000000000000806ad9b61fa5ae014307ebdc964253adcd9f2c0a392aa11abc") - - if id1 != ref { - t.Errorf("wrong id1\ngot %v\nwant %v", id1[:], ref[:]) - } - if id2 != ref { - t.Errorf("wrong id2\ngot %v\nwant %v", id2[:], ref[:]) - } -} - -func TestID_textEncoding(t *testing.T) { - ref := ID{ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, - 0x31, 0x32, - } - hex := "0102030405060708091011121314151617181920212223242526272829303132" - - text, err := ref.MarshalText() - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(text, []byte(hex)) { - t.Fatalf("text encoding did not match\nexpected: %s\ngot: %s", hex, text) - } - - id := new(ID) - if err := id.UnmarshalText(text); err != nil { - t.Fatal(err) - } - if *id != ref { - t.Fatalf("text decoding did not match\nexpected: %s\ngot: %s", ref, id) - } -} - -func TestNodeID_distcmp(t *testing.T) { - distcmpBig := func(target, a, b ID) int { - tbig := new(big.Int).SetBytes(target[:]) - abig := new(big.Int).SetBytes(a[:]) - bbig := new(big.Int).SetBytes(b[:]) - return new(big.Int).Xor(tbig, abig).Cmp(new(big.Int).Xor(tbig, bbig)) - } - if err := quick.CheckEqual(DistCmp, distcmpBig, nil); err != nil { - t.Error(err) - } -} - -// The random tests is likely to miss the case where a and b are equal, -// this test checks it explicitly. -func TestNodeID_distcmpEqual(t *testing.T) { - base := ID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} - x := ID{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} - if DistCmp(base, x, x) != 0 { - t.Errorf("DistCmp(base, x, x) != 0") - } -} - -func TestNodeID_logdist(t *testing.T) { - logdistBig := func(a, b ID) int { - abig, bbig := new(big.Int).SetBytes(a[:]), new(big.Int).SetBytes(b[:]) - return new(big.Int).Xor(abig, bbig).BitLen() - } - if err := quick.CheckEqual(LogDist, logdistBig, nil); err != nil { - t.Error(err) - } -} - -// The random tests is likely to miss the case where a and b are equal, -// this test checks it explicitly. -func TestNodeID_logdistEqual(t *testing.T) { - x := ID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} - if LogDist(x, x) != 0 { - t.Errorf("LogDist(x, x) != 0") - } -} diff --git a/p2p/enr/enr.go b/p2p/enr/enr.go index 251caf4585ca..c36ae9e3edea 100644 --- a/p2p/enr/enr.go +++ b/p2p/enr/enr.go @@ -156,13 +156,23 @@ func (r *Record) Set(e Entry) { } func (r *Record) invalidate() { - if r.signature == nil { + if r.signature != nil { r.seq++ } r.signature = nil r.raw = nil } +// Signature returns the signature of the record. +func (r *Record) Signature() []byte { + if r.signature == nil { + return nil + } + cpy := make([]byte, len(r.signature)) + copy(cpy, r.signature) + return cpy +} + // EncodeRLP implements rlp.Encoder. Encoding fails if // the record is unsigned. func (r Record) EncodeRLP(w io.Writer) error { @@ -173,7 +183,7 @@ func (r Record) EncodeRLP(w io.Writer) error { return err } -// DecodeRLP implements rlp.Decoder. Decoding verifies the signature. +// DecodeRLP implements rlp.Decoder. Decoding doesn't verify the signature. func (r *Record) DecodeRLP(s *rlp.Stream) error { dec, raw, err := decodeRecord(s) if err != nil { diff --git a/p2p/enr/enr_test.go b/p2p/enr/enr_test.go index 9bf22478dd9e..96a9ced5cf3d 100644 --- a/p2p/enr/enr_test.go +++ b/p2p/enr/enr_test.go @@ -49,28 +49,28 @@ func TestGetSetID(t *testing.T) { } // TestGetSetIP4 tests encoding/decoding and setting/getting of the IP key. -func TestGetSetIP4(t *testing.T) { - ip := IP{192, 168, 0, 3} +func TestGetSetIPv4(t *testing.T) { + ip := IPv4{192, 168, 0, 3} var r Record r.Set(ip) - var ip2 IP + var ip2 IPv4 require.NoError(t, r.Load(&ip2)) assert.Equal(t, ip, ip2) } -// TestGetSetIP6 tests encoding/decoding and setting/getting of the IP key. -func TestGetSetIP6(t *testing.T) { - ip := IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68} +// TestGetSetIP6 tests encoding/decoding and setting/getting of the IP6 key. +func TestGetSetIPv6(t *testing.T) { + ip := IPv6{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68} var r Record r.Set(ip) - var ip2 IP + var ip2 IPv6 require.NoError(t, r.Load(&ip2)) assert.Equal(t, ip, ip2) } -// TestGetSetDiscPort tests encoding/decoding and setting/getting of the DiscPort key. +// TestGetSetUDP tests encoding/decoding and setting/getting of the UDP key. func TestGetSetUDP(t *testing.T) { port := UDP(30309) var r Record @@ -83,7 +83,7 @@ func TestGetSetUDP(t *testing.T) { func TestLoadErrors(t *testing.T) { var r Record - ip4 := IP{127, 0, 0, 1} + ip4 := IPv4{127, 0, 0, 1} r.Set(ip4) // Check error for missing keys. @@ -169,17 +169,29 @@ func TestDirty(t *testing.T) { } } +func TestSeq(t *testing.T) { + var r Record + + assert.Equal(t, uint64(0), r.Seq()) + r.Set(UDP(1)) + assert.Equal(t, uint64(0), r.Seq()) + signTest([]byte{5}, &r) + assert.Equal(t, uint64(0), r.Seq()) + r.Set(UDP(2)) + assert.Equal(t, uint64(1), r.Seq()) +} + // TestGetSetOverwrite tests value overwrite when setting a new value with an existing key in record. func TestGetSetOverwrite(t *testing.T) { var r Record - ip := IP{192, 168, 0, 3} + ip := IPv4{192, 168, 0, 3} r.Set(ip) - ip2 := IP{192, 168, 0, 4} + ip2 := IPv4{192, 168, 0, 4} r.Set(ip2) - var ip3 IP + var ip3 IPv4 require.NoError(t, r.Load(&ip3)) assert.Equal(t, ip2, ip3) } @@ -188,7 +200,7 @@ func TestGetSetOverwrite(t *testing.T) { func TestSignEncodeAndDecode(t *testing.T) { var r Record r.Set(UDP(30303)) - r.Set(IP{127, 0, 0, 1}) + r.Set(IPv4{127, 0, 0, 1}) require.NoError(t, signTest([]byte{5}, &r)) blob, err := rlp.EncodeToBytes(r) diff --git a/p2p/enr/entries.go b/p2p/enr/entries.go index 347990ab64fb..f2118401afb8 100644 --- a/p2p/enr/entries.go +++ b/p2p/enr/entries.go @@ -60,11 +60,21 @@ type TCP uint16 func (v TCP) ENRKey() string { return "tcp" } +// UDP is the "udp" key, which holds the IPv6-specific UDP port of the node. +type TCP6 uint16 + +func (v TCP6) ENRKey() string { return "tcp6" } + // UDP is the "udp" key, which holds the UDP port of the node. type UDP uint16 func (v UDP) ENRKey() string { return "udp" } +// UDP is the "udp" key, which holds the IPv6-specific UDP port of the node. +type UDP6 uint16 + +func (v UDP6) ENRKey() string { return "udp6" } + // ID is the "id" key, which holds the name of the identity scheme. type ID string @@ -72,17 +82,27 @@ const IDv4 = ID("v4") // the default identity scheme func (v ID) ENRKey() string { return "id" } -// IP is the "ip" key, which holds the IP address of the node. +// IP is either the "ip" or "ip6" key, depending on the value. +// Use this value to encode IP addresses that can be either v4 or v6. +// To load an address from a record use the IPv4 or IPv6 types. type IP net.IP -func (v IP) ENRKey() string { return "ip" } +func (v IP) ENRKey() string { + if net.IP(v).To4() == nil { + return "ip6" + } + return "ip" +} // EncodeRLP implements rlp.Encoder. func (v IP) EncodeRLP(w io.Writer) error { if ip4 := net.IP(v).To4(); ip4 != nil { return rlp.Encode(w, ip4) } - return rlp.Encode(w, net.IP(v)) + if ip6 := net.IP(v).To16(); ip6 != nil { + return rlp.Encode(w, ip6) + } + return fmt.Errorf("invalid IP address: %v", net.IP(v)) } // DecodeRLP implements rlp.Decoder. @@ -96,6 +116,56 @@ func (v *IP) DecodeRLP(s *rlp.Stream) error { return nil } +// IPv4 is the "ip" key, which holds the IP address of the node. +type IPv4 net.IP + +func (v IPv4) ENRKey() string { return "ip" } + +// EncodeRLP implements rlp.Encoder. +func (v IPv4) EncodeRLP(w io.Writer) error { + ip4 := net.IP(v).To4() + if ip4 == nil { + return fmt.Errorf("invalid IPv4 address: %v", net.IP(v)) + } + return rlp.Encode(w, ip4) +} + +// DecodeRLP implements rlp.Decoder. +func (v *IPv4) DecodeRLP(s *rlp.Stream) error { + if err := s.Decode((*net.IP)(v)); err != nil { + return err + } + if len(*v) != 4 { + return fmt.Errorf("invalid IPv4 address, want 4 bytes: %v", *v) + } + return nil +} + +// IPv6 is the "ip6" key, which holds the IP address of the node. +type IPv6 net.IP + +func (v IPv6) ENRKey() string { return "ip6" } + +// EncodeRLP implements rlp.Encoder. +func (v IPv6) EncodeRLP(w io.Writer) error { + ip6 := net.IP(v).To16() + if ip6 == nil { + return fmt.Errorf("invalid IPv6 address: %v", net.IP(v)) + } + return rlp.Encode(w, ip6) +} + +// DecodeRLP implements rlp.Decoder. +func (v *IPv6) DecodeRLP(s *rlp.Stream) error { + if err := s.Decode((*net.IP)(v)); err != nil { + return err + } + if len(*v) != 16 { + return fmt.Errorf("invalid IPv6 address, want 16 bytes: %v", *v) + } + return nil +} + // KeyError is an error related to a key. type KeyError struct { Key string diff --git a/p2p/message.go b/p2p/message.go index ac12666e4178..b987732225fb 100644 --- a/p2p/message.go +++ b/p2p/message.go @@ -169,7 +169,7 @@ type MsgPipeRW struct { closed *int32 } -// WriteMsg sends a messsage on the pipe. +// WriteMsg sends a message on the pipe. // It blocks until the receiver has consumed the message payload. func (p *MsgPipeRW) WriteMsg(msg Msg) error { if atomic.LoadInt32(p.closed) == 0 { @@ -252,19 +252,23 @@ func ExpectMsg(r MsgReader, code uint64, content interface{}) error { type msgEventer struct { MsgReadWriter - feed *event.Feed - peerID enode.ID - Protocol string + feed *event.Feed + peerID enode.ID + Protocol string + localAddress string + remoteAddress string } // newMsgEventer returns a msgEventer which sends message events to the given // feed -func newMsgEventer(rw MsgReadWriter, feed *event.Feed, peerID enode.ID, proto string) *msgEventer { +func newMsgEventer(rw MsgReadWriter, feed *event.Feed, peerID enode.ID, proto, remote, local string) *msgEventer { return &msgEventer{ MsgReadWriter: rw, feed: feed, peerID: peerID, Protocol: proto, + remoteAddress: remote, + localAddress: local, } } @@ -276,11 +280,13 @@ func (ev *msgEventer) ReadMsg() (Msg, error) { return msg, err } ev.feed.Send(&PeerEvent{ - Type: PeerEventTypeMsgRecv, - Peer: ev.peerID, - Protocol: ev.Protocol, - MsgCode: &msg.Code, - MsgSize: &msg.Size, + Type: PeerEventTypeMsgRecv, + Peer: ev.peerID, + Protocol: ev.Protocol, + MsgCode: &msg.Code, + MsgSize: &msg.Size, + LocalAddress: ev.localAddress, + RemoteAddress: ev.remoteAddress, }) return msg, nil } @@ -293,11 +299,13 @@ func (ev *msgEventer) WriteMsg(msg Msg) error { return err } ev.feed.Send(&PeerEvent{ - Type: PeerEventTypeMsgSend, - Peer: ev.peerID, - Protocol: ev.Protocol, - MsgCode: &msg.Code, - MsgSize: &msg.Size, + Type: PeerEventTypeMsgSend, + Peer: ev.peerID, + Protocol: ev.Protocol, + MsgCode: &msg.Code, + MsgSize: &msg.Size, + LocalAddress: ev.localAddress, + RemoteAddress: ev.remoteAddress, }) return nil } diff --git a/p2p/metrics.go b/p2p/metrics.go index 2d52fd1fd1d0..c04e5ab4c3ad 100644 --- a/p2p/metrics.go +++ b/p2p/metrics.go @@ -19,53 +19,220 @@ package p2p import ( + "fmt" "net" + "sync" + "sync/atomic" + "time" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +const ( + MetricsInboundTraffic = "p2p/ingress" // Name for the registered inbound traffic meter + MetricsOutboundTraffic = "p2p/egress" // Name for the registered outbound traffic meter + MetricsOutboundConnects = "p2p/dials" // Name for the registered outbound connects meter + MetricsInboundConnects = "p2p/serves" // Name for the registered inbound connects meter + + MeteredPeerLimit = 1024 // This amount of peers are individually metered ) var ( - ingressConnectMeter = metrics.NewRegisteredMeter("p2p/InboundConnects", nil) - ingressTrafficMeter = metrics.NewRegisteredMeter("p2p/InboundTraffic", nil) - egressConnectMeter = metrics.NewRegisteredMeter("p2p/OutboundConnects", nil) - egressTrafficMeter = metrics.NewRegisteredMeter("p2p/OutboundTraffic", nil) + ingressConnectMeter = metrics.NewRegisteredMeter(MetricsInboundConnects, nil) // Meter counting the ingress connections + ingressTrafficMeter = metrics.NewRegisteredMeter(MetricsInboundTraffic, nil) // Meter metering the cumulative ingress traffic + egressConnectMeter = metrics.NewRegisteredMeter(MetricsOutboundConnects, nil) // Meter counting the egress connections + egressTrafficMeter = metrics.NewRegisteredMeter(MetricsOutboundTraffic, nil) // Meter metering the cumulative egress traffic + activePeerCounter = metrics.NewRegisteredCounter("p2p/peers", nil) // Gauge tracking the current peer count + + PeerIngressRegistry = metrics.NewPrefixedChildRegistry(metrics.EphemeralRegistry, MetricsInboundTraffic+"/") // Registry containing the peer ingress + PeerEgressRegistry = metrics.NewPrefixedChildRegistry(metrics.EphemeralRegistry, MetricsOutboundTraffic+"/") // Registry containing the peer egress + + meteredPeerFeed event.Feed // Event feed for peer metrics + meteredPeerCount int32 // Actually stored peer connection count ) +// MeteredPeerEventType is the type of peer events emitted by a metered connection. +type MeteredPeerEventType int + +const ( + // PeerConnected is the type of event emitted when a peer successfully + // made the handshake. + PeerConnected MeteredPeerEventType = iota + + // PeerDisconnected is the type of event emitted when a peer disconnects. + PeerDisconnected + + // PeerHandshakeFailed is the type of event emitted when a peer fails to + // make the handshake or disconnects before the handshake. + PeerHandshakeFailed +) + +// MeteredPeerEvent is an event emitted when peers connect or disconnect. +type MeteredPeerEvent struct { + Type MeteredPeerEventType // Type of peer event + IP net.IP // IP address of the peer + ID enode.ID // NodeID of the peer + Elapsed time.Duration // Time elapsed between the connection and the handshake/disconnection + Ingress uint64 // Ingress count at the moment of the event + Egress uint64 // Egress count at the moment of the event +} + +// SubscribeMeteredPeerEvent registers a subscription for peer life-cycle events +// if metrics collection is enabled. +func SubscribeMeteredPeerEvent(ch chan<- MeteredPeerEvent) event.Subscription { + return meteredPeerFeed.Subscribe(ch) +} + // meteredConn is a wrapper around a net.Conn that meters both the // inbound and outbound network traffic. type meteredConn struct { net.Conn // Network connection to wrap with metering + + connected time.Time // Connection time of the peer + ip net.IP // IP address of the peer + id enode.ID // NodeID of the peer + + // trafficMetered denotes if the peer is registered in the traffic registries. + // Its value is true if the metered peer count doesn't reach the limit in the + // moment of the peer's connection. + trafficMetered bool + ingressMeter metrics.Meter // Meter for the read bytes of the peer + egressMeter metrics.Meter // Meter for the written bytes of the peer + + lock sync.RWMutex // Lock protecting the metered connection's internals } -// newMeteredConn creates a new metered connection, also bumping the ingress or -// egress connection meter. If the metrics system is disabled, this function -// returns the original object. -func newMeteredConn(conn net.Conn, ingress bool) net.Conn { +// newMeteredConn creates a new metered connection, bumps the ingress or egress +// connection meter and also increases the metered peer count. If the metrics +// system is disabled or the IP address is unspecified, this function returns +// the original object. +func newMeteredConn(conn net.Conn, ingress bool, ip net.IP) net.Conn { // Short circuit if metrics are disabled if !metrics.Enabled { return conn } - // Otherwise bump the connection counters and wrap the connection + if ip.IsUnspecified() { + log.Warn("Peer IP is unspecified") + return conn + } + // Bump the connection counters and wrap the connection if ingress { ingressConnectMeter.Mark(1) } else { egressConnectMeter.Mark(1) } - return &meteredConn{Conn: conn} + activePeerCounter.Inc(1) + + return &meteredConn{ + Conn: conn, + ip: ip, + connected: time.Now(), + } } -// Read delegates a network read to the underlying connection, bumping the ingress -// traffic meter along the way. +// Read delegates a network read to the underlying connection, bumping the common +// and the peer ingress traffic meters along the way. func (c *meteredConn) Read(b []byte) (n int, err error) { n, err = c.Conn.Read(b) ingressTrafficMeter.Mark(int64(n)) - return + c.lock.RLock() + if c.trafficMetered { + c.ingressMeter.Mark(int64(n)) + } + c.lock.RUnlock() + return n, err } -// Write delegates a network write to the underlying connection, bumping the -// egress traffic meter along the way. +// Write delegates a network write to the underlying connection, bumping the common +// and the peer egress traffic meters along the way. func (c *meteredConn) Write(b []byte) (n int, err error) { n, err = c.Conn.Write(b) egressTrafficMeter.Mark(int64(n)) - return + c.lock.RLock() + if c.trafficMetered { + c.egressMeter.Mark(int64(n)) + } + c.lock.RUnlock() + return n, err +} + +// handshakeDone is called when a peer handshake is done. Registers the peer to +// the ingress and the egress traffic registries using the peer's IP and node ID, +// also emits connect event. +func (c *meteredConn) handshakeDone(id enode.ID) { + // TODO (kurkomisi): use the node URL instead of the pure node ID. (the String() method of *Node) + if atomic.AddInt32(&meteredPeerCount, 1) >= MeteredPeerLimit { + // Don't register the peer in the traffic registries. + atomic.AddInt32(&meteredPeerCount, -1) + c.lock.Lock() + c.id, c.trafficMetered = id, false + c.lock.Unlock() + log.Warn("Metered peer count reached the limit") + } else { + key := fmt.Sprintf("%s/%s", c.ip, id.String()) + c.lock.Lock() + c.id, c.trafficMetered = id, true + c.ingressMeter = metrics.NewRegisteredMeter(key, PeerIngressRegistry) + c.egressMeter = metrics.NewRegisteredMeter(key, PeerEgressRegistry) + c.lock.Unlock() + } + meteredPeerFeed.Send(MeteredPeerEvent{ + Type: PeerConnected, + IP: c.ip, + ID: id, + Elapsed: time.Since(c.connected), + }) +} + +// Close delegates a close operation to the underlying connection, unregisters +// the peer from the traffic registries and emits close event. +func (c *meteredConn) Close() error { + err := c.Conn.Close() + c.lock.RLock() + if c.id == (enode.ID{}) { + // If the peer disconnects before the handshake. + c.lock.RUnlock() + meteredPeerFeed.Send(MeteredPeerEvent{ + Type: PeerHandshakeFailed, + IP: c.ip, + Elapsed: time.Since(c.connected), + }) + activePeerCounter.Dec(1) + return err + } + id := c.id + if !c.trafficMetered { + // If the peer isn't registered in the traffic registries. + c.lock.RUnlock() + meteredPeerFeed.Send(MeteredPeerEvent{ + Type: PeerDisconnected, + IP: c.ip, + ID: id, + }) + activePeerCounter.Dec(1) + return err + } + ingress, egress := uint64(c.ingressMeter.Count()), uint64(c.egressMeter.Count()) + c.lock.RUnlock() + + // Decrement the metered peer count + atomic.AddInt32(&meteredPeerCount, -1) + + // Unregister the peer from the traffic registries + key := fmt.Sprintf("%s/%s", c.ip, id) + PeerIngressRegistry.Unregister(key) + PeerEgressRegistry.Unregister(key) + + meteredPeerFeed.Send(MeteredPeerEvent{ + Type: PeerDisconnected, + IP: c.ip, + ID: id, + Ingress: ingress, + Egress: egress, + }) + activePeerCounter.Dec(1) + return err } diff --git a/p2p/nat/nat.go b/p2p/nat/nat.go index a254648c66b8..8fad921c48d2 100644 --- a/p2p/nat/nat.go +++ b/p2p/nat/nat.go @@ -129,21 +129,15 @@ func Map(m Interface, c chan struct{}, protocol string, extport, intport int, na // ExtIP assumes that the local machine is reachable on the given // external IP address, and that any required ports were mapped manually. // Mapping operations will not return an error but won't actually do anything. -func ExtIP(ip net.IP) Interface { - if ip == nil { - panic("IP must not be nil") - } - return extIP(ip) -} +type ExtIP net.IP -type extIP net.IP - -func (n extIP) ExternalIP() (net.IP, error) { return net.IP(n), nil } -func (n extIP) String() string { return fmt.Sprintf("ExtIP(%v)", net.IP(n)) } +func (n ExtIP) ExternalIP() (net.IP, error) { return net.IP(n), nil } +func (n ExtIP) String() string { return fmt.Sprintf("ExtIP(%v)", net.IP(n)) } // These do nothing. -func (extIP) AddMapping(string, int, int, string, time.Duration) error { return nil } -func (extIP) DeleteMapping(string, int, int) error { return nil } + +func (ExtIP) AddMapping(string, int, int, string, time.Duration) error { return nil } +func (ExtIP) DeleteMapping(string, int, int) error { return nil } // Any returns a port mapper that tries to discover any supported // mechanism on the local network. diff --git a/p2p/nat/nat_test.go b/p2p/nat/nat_test.go index 469101e997e9..814e6d9e14c8 100644 --- a/p2p/nat/nat_test.go +++ b/p2p/nat/nat_test.go @@ -28,7 +28,7 @@ import ( func TestAutoDiscRace(t *testing.T) { ad := startautodisc("thing", func() Interface { time.Sleep(500 * time.Millisecond) - return extIP{33, 44, 55, 66} + return ExtIP{33, 44, 55, 66} }) // Spawn a few concurrent calls to ad.ExternalIP. diff --git a/p2p/netutil/addrutil.go b/p2p/netutil/addrutil.go new file mode 100644 index 000000000000..fb6d8d27318d --- /dev/null +++ b/p2p/netutil/addrutil.go @@ -0,0 +1,33 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package netutil + +import "net" + +// AddrIP gets the IP address contained in addr. It returns nil if no address is present. +func AddrIP(addr net.Addr) net.IP { + switch a := addr.(type) { + case *net.IPAddr: + return a.IP + case *net.TCPAddr: + return a.IP + case *net.UDPAddr: + return a.IP + default: + return nil + } +} diff --git a/p2p/netutil/iptrack.go b/p2p/netutil/iptrack.go new file mode 100644 index 000000000000..b9cbd5e1caa9 --- /dev/null +++ b/p2p/netutil/iptrack.go @@ -0,0 +1,130 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package netutil + +import ( + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +// IPTracker predicts the external endpoint, i.e. IP address and port, of the local host +// based on statements made by other hosts. +type IPTracker struct { + window time.Duration + contactWindow time.Duration + minStatements int + clock mclock.Clock + statements map[string]ipStatement + contact map[string]mclock.AbsTime + lastStatementGC mclock.AbsTime + lastContactGC mclock.AbsTime +} + +type ipStatement struct { + endpoint string + time mclock.AbsTime +} + +// NewIPTracker creates an IP tracker. +// +// The window parameters configure the amount of past network events which are kept. The +// minStatements parameter enforces a minimum number of statements which must be recorded +// before any prediction is made. Higher values for these parameters decrease 'flapping' of +// predictions as network conditions change. Window duration values should typically be in +// the range of minutes. +func NewIPTracker(window, contactWindow time.Duration, minStatements int) *IPTracker { + return &IPTracker{ + window: window, + contactWindow: contactWindow, + statements: make(map[string]ipStatement), + minStatements: minStatements, + contact: make(map[string]mclock.AbsTime), + clock: mclock.System{}, + } +} + +// PredictFullConeNAT checks whether the local host is behind full cone NAT. It predicts by +// checking whether any statement has been received from a node we didn't contact before +// the statement was made. +func (it *IPTracker) PredictFullConeNAT() bool { + now := it.clock.Now() + it.gcContact(now) + it.gcStatements(now) + for host, st := range it.statements { + if c, ok := it.contact[host]; !ok || c > st.time { + return true + } + } + return false +} + +// PredictEndpoint returns the current prediction of the external endpoint. +func (it *IPTracker) PredictEndpoint() string { + it.gcStatements(it.clock.Now()) + + // The current strategy is simple: find the endpoint with most statements. + counts := make(map[string]int) + maxcount, max := 0, "" + for _, s := range it.statements { + c := counts[s.endpoint] + 1 + counts[s.endpoint] = c + if c > maxcount && c >= it.minStatements { + maxcount, max = c, s.endpoint + } + } + return max +} + +// AddStatement records that a certain host thinks our external endpoint is the one given. +func (it *IPTracker) AddStatement(host, endpoint string) { + now := it.clock.Now() + it.statements[host] = ipStatement{endpoint, now} + if time.Duration(now-it.lastStatementGC) >= it.window { + it.gcStatements(now) + } +} + +// AddContact records that a packet containing our endpoint information has been sent to a +// certain host. +func (it *IPTracker) AddContact(host string) { + now := it.clock.Now() + it.contact[host] = now + if time.Duration(now-it.lastContactGC) >= it.contactWindow { + it.gcContact(now) + } +} + +func (it *IPTracker) gcStatements(now mclock.AbsTime) { + it.lastStatementGC = now + cutoff := now.Add(-it.window) + for host, s := range it.statements { + if s.time < cutoff { + delete(it.statements, host) + } + } +} + +func (it *IPTracker) gcContact(now mclock.AbsTime) { + it.lastContactGC = now + cutoff := now.Add(-it.contactWindow) + for host, ct := range it.contact { + if ct < cutoff { + delete(it.contact, host) + } + } +} diff --git a/p2p/netutil/iptrack_test.go b/p2p/netutil/iptrack_test.go new file mode 100644 index 000000000000..a9a2998a6528 --- /dev/null +++ b/p2p/netutil/iptrack_test.go @@ -0,0 +1,138 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package netutil + +import ( + "fmt" + mrand "math/rand" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +const ( + opStatement = iota + opContact + opPredict + opCheckFullCone +) + +type iptrackTestEvent struct { + op int + time int // absolute, in milliseconds + ip, from string +} + +func TestIPTracker(t *testing.T) { + tests := map[string][]iptrackTestEvent{ + "minStatements": { + {opPredict, 0, "", ""}, + {opStatement, 0, "127.0.0.1", "127.0.0.2"}, + {opPredict, 1000, "", ""}, + {opStatement, 1000, "127.0.0.1", "127.0.0.3"}, + {opPredict, 1000, "", ""}, + {opStatement, 1000, "127.0.0.1", "127.0.0.4"}, + {opPredict, 1000, "127.0.0.1", ""}, + }, + "window": { + {opStatement, 0, "127.0.0.1", "127.0.0.2"}, + {opStatement, 2000, "127.0.0.1", "127.0.0.3"}, + {opStatement, 3000, "127.0.0.1", "127.0.0.4"}, + {opPredict, 10000, "127.0.0.1", ""}, + {opPredict, 10001, "", ""}, // first statement expired + {opStatement, 10100, "127.0.0.1", "127.0.0.2"}, + {opPredict, 10200, "127.0.0.1", ""}, + }, + "fullcone": { + {opContact, 0, "", "127.0.0.2"}, + {opStatement, 10, "127.0.0.1", "127.0.0.2"}, + {opContact, 2000, "", "127.0.0.3"}, + {opStatement, 2010, "127.0.0.1", "127.0.0.3"}, + {opContact, 3000, "", "127.0.0.4"}, + {opStatement, 3010, "127.0.0.1", "127.0.0.4"}, + {opCheckFullCone, 3500, "false", ""}, + }, + "fullcone_2": { + {opContact, 0, "", "127.0.0.2"}, + {opStatement, 10, "127.0.0.1", "127.0.0.2"}, + {opContact, 2000, "", "127.0.0.3"}, + {opStatement, 2010, "127.0.0.1", "127.0.0.3"}, + {opStatement, 3000, "127.0.0.1", "127.0.0.4"}, + {opContact, 3010, "", "127.0.0.4"}, + {opCheckFullCone, 3500, "true", ""}, + }, + } + for name, test := range tests { + t.Run(name, func(t *testing.T) { runIPTrackerTest(t, test) }) + } +} + +func runIPTrackerTest(t *testing.T, evs []iptrackTestEvent) { + var ( + clock mclock.Simulated + it = NewIPTracker(10*time.Second, 10*time.Second, 3) + ) + it.clock = &clock + for i, ev := range evs { + evtime := time.Duration(ev.time) * time.Millisecond + clock.Run(evtime - time.Duration(clock.Now())) + switch ev.op { + case opStatement: + it.AddStatement(ev.from, ev.ip) + case opContact: + it.AddContact(ev.from) + case opPredict: + if pred := it.PredictEndpoint(); pred != ev.ip { + t.Errorf("op %d: wrong prediction %q, want %q", i, pred, ev.ip) + } + case opCheckFullCone: + pred := fmt.Sprintf("%t", it.PredictFullConeNAT()) + if pred != ev.ip { + t.Errorf("op %d: wrong prediction %s, want %s", i, pred, ev.ip) + } + } + } +} + +// This checks that old statements and contacts are GCed even if Predict* isn't called. +func TestIPTrackerForceGC(t *testing.T) { + var ( + clock mclock.Simulated + window = 10 * time.Second + rate = 50 * time.Millisecond + max = int(window/rate) + 1 + it = NewIPTracker(window, window, 3) + ) + it.clock = &clock + + for i := 0; i < 5*max; i++ { + e1 := make([]byte, 4) + e2 := make([]byte, 4) + mrand.Read(e1) + mrand.Read(e2) + it.AddStatement(string(e1), string(e2)) + it.AddContact(string(e1)) + clock.Run(rate) + } + if len(it.contact) > 2*max { + t.Errorf("contacts not GCed, have %d", len(it.contact)) + } + if len(it.statements) > 2*max { + t.Errorf("statements not GCed, have %d", len(it.statements)) + } +} diff --git a/p2p/peer.go b/p2p/peer.go index b61cced5496e..372ba8d0274f 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -91,12 +91,14 @@ const ( // PeerEvent is an event emitted when peers are either added or dropped from // a p2p.Server or when a message is sent or received on a peer connection type PeerEvent struct { - Type PeerEventType `json:"type"` - Peer enode.ID `json:"peer"` - Error string `json:"error,omitempty"` - Protocol string `json:"protocol,omitempty"` - MsgCode *uint64 `json:"msg_code,omitempty"` - MsgSize *uint32 `json:"msg_size,omitempty"` + Type PeerEventType `json:"type"` + Peer enode.ID `json:"peer"` + Error string `json:"error,omitempty"` + Protocol string `json:"protocol,omitempty"` + MsgCode *uint64 `json:"msg_code,omitempty"` + MsgSize *uint32 `json:"msg_size,omitempty"` + LocalAddress string `json:"local,omitempty"` + RemoteAddress string `json:"remote,omitempty"` } // Peer represents a connected remote node. @@ -120,7 +122,7 @@ func NewPeer(id enode.ID, name string, caps []Cap) *Peer { pipe, _ := net.Pipe() node := enode.SignNull(new(enr.Record), id) conn := &conn{fd: pipe, transport: nil, node: node, caps: caps, name: name} - peer := newPeer(conn, nil) + peer := newPeer(log.Root(), conn, nil) close(peer.closed) // ensures Disconnect doesn't block return peer } @@ -176,7 +178,7 @@ func (p *Peer) Inbound() bool { return p.rw.is(inboundConn) } -func newPeer(conn *conn, protocols []Protocol) *Peer { +func newPeer(log log.Logger, conn *conn, protocols []Protocol) *Peer { protomap := matchProtocols(protocols, conn.caps, conn) p := &Peer{ rw: conn, @@ -354,7 +356,7 @@ func (p *Peer) startProtocols(writeStart <-chan struct{}, writeErr chan<- error) proto.werr = writeErr var rw MsgReadWriter = proto if p.events != nil { - rw = newMsgEventer(rw, p.events, p.ID(), proto.Name) + rw = newMsgEventer(rw, p.events, p.ID(), proto.Name, p.Info().Network.RemoteAddress, p.Info().Network.LocalAddress) } p.log.Trace(fmt.Sprintf("Starting protocol %s/%d", proto.Name, proto.Version)) go func() { @@ -425,9 +427,11 @@ func (rw *protoRW) ReadMsg() (Msg, error) { // peer. Sub-protocol independent fields are contained and initialized here, with // protocol specifics delegated to all connected sub-protocols. type PeerInfo struct { - ID string `json:"id"` // Unique node identifier (also the encryption key) - Name string `json:"name"` // Name of the node, including client type, version, OS, custom data - Caps []string `json:"caps"` // Sum-protocols advertised by this particular peer + ENR string `json:"enr,omitempty"` // Ethereum Node Record + Enode string `json:"enode"` // Node URL + ID string `json:"id"` // Unique node identifier + Name string `json:"name"` // Name of the node, including client type, version, OS, custom data + Caps []string `json:"caps"` // Protocols advertised by this peer Network struct { LocalAddress string `json:"localAddress"` // Local endpoint of the TCP data connection RemoteAddress string `json:"remoteAddress"` // Remote endpoint of the TCP data connection @@ -447,11 +451,15 @@ func (p *Peer) Info() *PeerInfo { } // Assemble the generic peer metadata info := &PeerInfo{ + Enode: p.Node().URLv4(), ID: p.ID().String(), Name: p.Name(), Caps: caps, Protocols: make(map[string]interface{}), } + if p.Node().Seq() > 0 { + info.ENR = p.Node().String() + } info.Network.LocalAddress = p.LocalAddr().String() info.Network.RemoteAddress = p.RemoteAddr().String() info.Network.Inbound = p.rw.is(inboundConn) diff --git a/p2p/peer_test.go b/p2p/peer_test.go index 5aa64a32e190..984cc411adb4 100644 --- a/p2p/peer_test.go +++ b/p2p/peer_test.go @@ -24,6 +24,8 @@ import ( "reflect" "testing" "time" + + "github.com/ethereum/go-ethereum/log" ) var discard = Protocol{ @@ -52,7 +54,7 @@ func testPeer(protos []Protocol) (func(), *conn, *Peer, <-chan error) { c2.caps = append(c2.caps, p.cap()) } - peer := newPeer(c1, protos) + peer := newPeer(log.Root(), c1, protos) errc := make(chan error, 1) go func() { _, err := peer.run() diff --git a/p2p/protocol.go b/p2p/protocol.go index 4b90a2a70852..9ce4c20203c7 100644 --- a/p2p/protocol.go +++ b/p2p/protocol.go @@ -20,6 +20,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" ) // Protocol represents a P2P subprotocol implementation. @@ -52,6 +53,9 @@ type Protocol struct { // about a certain peer in the network. If an info retrieval function is set, // but returns nil, it is assumed that the protocol handshake is still running. PeerInfo func(id enode.ID) interface{} + + // Attributes contains protocol specific information for the node record. + Attributes []enr.Entry } func (p Protocol) cap() Cap { @@ -64,10 +68,6 @@ type Cap struct { Version uint } -func (cap Cap) RlpData() interface{} { - return []interface{}{cap.Name, cap.Version} -} - func (cap Cap) String() string { return fmt.Sprintf("%s/%d", cap.Name, cap.Version) } diff --git a/p2p/protocols/protocol.go b/p2p/protocols/protocol.go deleted file mode 100644 index 615f74b56974..000000000000 --- a/p2p/protocols/protocol.go +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -/* -Package protocols is an extension to p2p. It offers a user friendly simple way to define -devp2p subprotocols by abstracting away code standardly shared by protocols. - -* automate assigments of code indexes to messages -* automate RLP decoding/encoding based on reflecting -* provide the forever loop to read incoming messages -* standardise error handling related to communication -* standardised handshake negotiation -* TODO: automatic generation of wire protocol specification for peers - -*/ -package protocols - -import ( - "bufio" - "bytes" - "context" - "fmt" - "io" - "reflect" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/ethereum/go-ethereum/swarm/tracing" - opentracing "github.com/opentracing/opentracing-go" -) - -// error codes used by this protocol scheme -const ( - ErrMsgTooLong = iota - ErrDecode - ErrWrite - ErrInvalidMsgCode - ErrInvalidMsgType - ErrHandshake - ErrNoHandler - ErrHandler -) - -// error description strings associated with the codes -var errorToString = map[int]string{ - ErrMsgTooLong: "Message too long", - ErrDecode: "Invalid message (RLP error)", - ErrWrite: "Error sending message", - ErrInvalidMsgCode: "Invalid message code", - ErrInvalidMsgType: "Invalid message type", - ErrHandshake: "Handshake error", - ErrNoHandler: "No handler registered error", - ErrHandler: "Message handler error", -} - -/* -Error implements the standard go error interface. -Use: - - errorf(code, format, params ...interface{}) - -Prints as: - - :
- -where description is given by code in errorToString -and details is fmt.Sprintf(format, params...) - -exported field Code can be checked -*/ -type Error struct { - Code int - message string - format string - params []interface{} -} - -func (e Error) Error() (message string) { - if len(e.message) == 0 { - name, ok := errorToString[e.Code] - if !ok { - panic("invalid message code") - } - e.message = name - if e.format != "" { - e.message += ": " + fmt.Sprintf(e.format, e.params...) - } - } - return e.message -} - -func errorf(code int, format string, params ...interface{}) *Error { - return &Error{ - Code: code, - format: format, - params: params, - } -} - -// WrappedMsg is used to propagate marshalled context alongside message payloads -type WrappedMsg struct { - Context []byte - Size uint32 - Payload []byte -} - -// Spec is a protocol specification including its name and version as well as -// the types of messages which are exchanged -type Spec struct { - // Name is the name of the protocol, often a three-letter word - Name string - - // Version is the version number of the protocol - Version uint - - // MaxMsgSize is the maximum accepted length of the message payload - MaxMsgSize uint32 - - // Messages is a list of message data types which this protocol uses, with - // each message type being sent with its array index as the code (so - // [&foo{}, &bar{}, &baz{}] would send foo, bar and baz with codes - // 0, 1 and 2 respectively) - // each message must have a single unique data type - Messages []interface{} - - initOnce sync.Once - codes map[reflect.Type]uint64 - types map[uint64]reflect.Type -} - -func (s *Spec) init() { - s.initOnce.Do(func() { - s.codes = make(map[reflect.Type]uint64, len(s.Messages)) - s.types = make(map[uint64]reflect.Type, len(s.Messages)) - for i, msg := range s.Messages { - code := uint64(i) - typ := reflect.TypeOf(msg) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - s.codes[typ] = code - s.types[code] = typ - } - }) -} - -// Length returns the number of message types in the protocol -func (s *Spec) Length() uint64 { - return uint64(len(s.Messages)) -} - -// GetCode returns the message code of a type, and boolean second argument is -// false if the message type is not found -func (s *Spec) GetCode(msg interface{}) (uint64, bool) { - s.init() - typ := reflect.TypeOf(msg) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - code, ok := s.codes[typ] - return code, ok -} - -// NewMsg construct a new message type given the code -func (s *Spec) NewMsg(code uint64) (interface{}, bool) { - s.init() - typ, ok := s.types[code] - if !ok { - return nil, false - } - return reflect.New(typ).Interface(), true -} - -// Peer represents a remote peer or protocol instance that is running on a peer connection with -// a remote peer -type Peer struct { - *p2p.Peer // the p2p.Peer object representing the remote - rw p2p.MsgReadWriter // p2p.MsgReadWriter to send messages to and read messages from - spec *Spec -} - -// NewPeer constructs a new peer -// this constructor is called by the p2p.Protocol#Run function -// the first two arguments are the arguments passed to p2p.Protocol.Run function -// the third argument is the Spec describing the protocol -func NewPeer(p *p2p.Peer, rw p2p.MsgReadWriter, spec *Spec) *Peer { - return &Peer{ - Peer: p, - rw: rw, - spec: spec, - } -} - -// Run starts the forever loop that handles incoming messages -// called within the p2p.Protocol#Run function -// the handler argument is a function which is called for each message received -// from the remote peer, a returned error causes the loop to exit -// resulting in disconnection -func (p *Peer) Run(handler func(ctx context.Context, msg interface{}) error) error { - for { - if err := p.handleIncoming(handler); err != nil { - if err != io.EOF { - metrics.GetOrRegisterCounter("peer.handleincoming.error", nil).Inc(1) - log.Error("peer.handleIncoming", "err", err) - } - - return err - } - } -} - -// Drop disconnects a peer. -// TODO: may need to implement protocol drop only? don't want to kick off the peer -// if they are useful for other protocols -func (p *Peer) Drop(err error) { - p.Disconnect(p2p.DiscSubprotocolError) -} - -// Send takes a message, encodes it in RLP, finds the right message code and sends the -// message off to the peer -// this low level call will be wrapped by libraries providing routed or broadcast sends -// but often just used to forward and push messages to directly connected peers -func (p *Peer) Send(ctx context.Context, msg interface{}) error { - defer metrics.GetOrRegisterResettingTimer("peer.send_t", nil).UpdateSince(time.Now()) - metrics.GetOrRegisterCounter("peer.send", nil).Inc(1) - - var b bytes.Buffer - if tracing.Enabled { - writer := bufio.NewWriter(&b) - - tracer := opentracing.GlobalTracer() - - sctx := spancontext.FromContext(ctx) - - if sctx != nil { - err := tracer.Inject( - sctx, - opentracing.Binary, - writer) - if err != nil { - return err - } - } - - writer.Flush() - } - - r, err := rlp.EncodeToBytes(msg) - if err != nil { - return err - } - - wmsg := WrappedMsg{ - Context: b.Bytes(), - Size: uint32(len(r)), - Payload: r, - } - - code, found := p.spec.GetCode(msg) - if !found { - return errorf(ErrInvalidMsgType, "%v", code) - } - return p2p.Send(p.rw, code, wmsg) -} - -// handleIncoming(code) -// is called each cycle of the main forever loop that dispatches incoming messages -// if this returns an error the loop returns and the peer is disconnected with the error -// this generic handler -// * checks message size, -// * checks for out-of-range message codes, -// * handles decoding with reflection, -// * call handlers as callbacks -func (p *Peer) handleIncoming(handle func(ctx context.Context, msg interface{}) error) error { - msg, err := p.rw.ReadMsg() - if err != nil { - return err - } - // make sure that the payload has been fully consumed - defer msg.Discard() - - if msg.Size > p.spec.MaxMsgSize { - return errorf(ErrMsgTooLong, "%v > %v", msg.Size, p.spec.MaxMsgSize) - } - - // unmarshal wrapped msg, which might contain context - var wmsg WrappedMsg - err = msg.Decode(&wmsg) - if err != nil { - log.Error(err.Error()) - return err - } - - ctx := context.Background() - - // if tracing is enabled and the context coming within the request is - // not empty, try to unmarshal it - if tracing.Enabled && len(wmsg.Context) > 0 { - var sctx opentracing.SpanContext - - tracer := opentracing.GlobalTracer() - sctx, err = tracer.Extract( - opentracing.Binary, - bytes.NewReader(wmsg.Context)) - if err != nil { - log.Error(err.Error()) - return err - } - - ctx = spancontext.WithContext(ctx, sctx) - } - - val, ok := p.spec.NewMsg(msg.Code) - if !ok { - return errorf(ErrInvalidMsgCode, "%v", msg.Code) - } - if err := rlp.DecodeBytes(wmsg.Payload, val); err != nil { - return errorf(ErrDecode, "<= %v: %v", msg, err) - } - - // call the registered handler callbacks - // a registered callback take the decoded message as argument as an interface - // which the handler is supposed to cast to the appropriate type - // it is entirely safe not to check the cast in the handler since the handler is - // chosen based on the proper type in the first place - if err := handle(ctx, val); err != nil { - return errorf(ErrHandler, "(msg code %v): %v", msg.Code, err) - } - return nil -} - -// Handshake negotiates a handshake on the peer connection -// * arguments -// * context -// * the local handshake to be sent to the remote peer -// * funcion to be called on the remote handshake (can be nil) -// * expects a remote handshake back of the same type -// * the dialing peer needs to send the handshake first and then waits for remote -// * the listening peer waits for the remote handshake and then sends it -// returns the remote handshake and an error -func (p *Peer) Handshake(ctx context.Context, hs interface{}, verify func(interface{}) error) (rhs interface{}, err error) { - if _, ok := p.spec.GetCode(hs); !ok { - return nil, errorf(ErrHandshake, "unknown handshake message type: %T", hs) - } - errc := make(chan error, 2) - handle := func(ctx context.Context, msg interface{}) error { - rhs = msg - if verify != nil { - return verify(rhs) - } - return nil - } - send := func() { errc <- p.Send(ctx, hs) } - receive := func() { errc <- p.handleIncoming(handle) } - - go func() { - if p.Inbound() { - receive() - send() - } else { - send() - receive() - } - }() - - for i := 0; i < 2; i++ { - select { - case err = <-errc: - case <-ctx.Done(): - err = ctx.Err() - } - if err != nil { - return nil, errorf(ErrHandshake, err.Error()) - } - } - return rhs, nil -} diff --git a/p2p/protocols/protocol_test.go b/p2p/protocols/protocol_test.go deleted file mode 100644 index 4755db3e62bc..000000000000 --- a/p2p/protocols/protocol_test.go +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package protocols - -import ( - "context" - "errors" - "fmt" - "testing" - "time" - - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - p2ptest "github.com/ethereum/go-ethereum/p2p/testing" -) - -// handshake message type -type hs0 struct { - C uint -} - -// message to kill/drop the peer with nodeID -type kill struct { - C enode.ID -} - -// message to drop connection -type drop struct { -} - -/// protoHandshake represents module-independent aspects of the protocol and is -// the first message peers send and receive as part the initial exchange -type protoHandshake struct { - Version uint // local and remote peer should have identical version - NetworkID string // local and remote peer should have identical network id -} - -// checkProtoHandshake verifies local and remote protoHandshakes match -func checkProtoHandshake(testVersion uint, testNetworkID string) func(interface{}) error { - return func(rhs interface{}) error { - remote := rhs.(*protoHandshake) - if remote.NetworkID != testNetworkID { - return fmt.Errorf("%s (!= %s)", remote.NetworkID, testNetworkID) - } - - if remote.Version != testVersion { - return fmt.Errorf("%d (!= %d)", remote.Version, testVersion) - } - return nil - } -} - -// newProtocol sets up a protocol -// the run function here demonstrates a typical protocol using peerPool, handshake -// and messages registered to handlers -func newProtocol(pp *p2ptest.TestPeerPool) func(*p2p.Peer, p2p.MsgReadWriter) error { - spec := &Spec{ - Name: "test", - Version: 42, - MaxMsgSize: 10 * 1024, - Messages: []interface{}{ - protoHandshake{}, - hs0{}, - kill{}, - drop{}, - }, - } - return func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - peer := NewPeer(p, rw, spec) - - // initiate one-off protohandshake and check validity - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - phs := &protoHandshake{42, "420"} - hsCheck := checkProtoHandshake(phs.Version, phs.NetworkID) - _, err := peer.Handshake(ctx, phs, hsCheck) - if err != nil { - return err - } - - lhs := &hs0{42} - // module handshake demonstrating a simple repeatable exchange of same-type message - hs, err := peer.Handshake(ctx, lhs, nil) - if err != nil { - return err - } - - if rmhs := hs.(*hs0); rmhs.C > lhs.C { - return fmt.Errorf("handshake mismatch remote %v > local %v", rmhs.C, lhs.C) - } - - handle := func(ctx context.Context, msg interface{}) error { - switch msg := msg.(type) { - - case *protoHandshake: - return errors.New("duplicate handshake") - - case *hs0: - rhs := msg - if rhs.C > lhs.C { - return fmt.Errorf("handshake mismatch remote %v > local %v", rhs.C, lhs.C) - } - lhs.C += rhs.C - return peer.Send(ctx, lhs) - - case *kill: - // demonstrates use of peerPool, killing another peer connection as a response to a message - id := msg.C - pp.Get(id).Drop(errors.New("killed")) - return nil - - case *drop: - // for testing we can trigger self induced disconnect upon receiving drop message - return errors.New("dropped") - - default: - return fmt.Errorf("unknown message type: %T", msg) - } - } - - pp.Add(peer) - defer pp.Remove(peer) - return peer.Run(handle) - } -} - -func protocolTester(t *testing.T, pp *p2ptest.TestPeerPool) *p2ptest.ProtocolTester { - conf := adapters.RandomNodeConfig() - return p2ptest.NewProtocolTester(t, conf.ID, 2, newProtocol(pp)) -} - -func protoHandshakeExchange(id enode.ID, proto *protoHandshake) []p2ptest.Exchange { - - return []p2ptest.Exchange{ - { - Expects: []p2ptest.Expect{ - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: id, - }, - }, - }, - { - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: proto, - Peer: id, - }, - }, - }, - } -} - -func runProtoHandshake(t *testing.T, proto *protoHandshake, errs ...error) { - pp := p2ptest.NewTestPeerPool() - s := protocolTester(t, pp) - // TODO: make this more than one handshake - node := s.Nodes[0] - if err := s.TestExchanges(protoHandshakeExchange(node.ID(), proto)...); err != nil { - t.Fatal(err) - } - var disconnects []*p2ptest.Disconnect - for i, err := range errs { - disconnects = append(disconnects, &p2ptest.Disconnect{Peer: s.Nodes[i].ID(), Error: err}) - } - if err := s.TestDisconnected(disconnects...); err != nil { - t.Fatal(err) - } -} - -func TestProtoHandshakeVersionMismatch(t *testing.T) { - runProtoHandshake(t, &protoHandshake{41, "420"}, errorf(ErrHandshake, errorf(ErrHandler, "(msg code 0): 41 (!= 42)").Error())) -} - -func TestProtoHandshakeNetworkIDMismatch(t *testing.T) { - runProtoHandshake(t, &protoHandshake{42, "421"}, errorf(ErrHandshake, errorf(ErrHandler, "(msg code 0): 421 (!= 420)").Error())) -} - -func TestProtoHandshakeSuccess(t *testing.T) { - runProtoHandshake(t, &protoHandshake{42, "420"}) -} - -func moduleHandshakeExchange(id enode.ID, resp uint) []p2ptest.Exchange { - - return []p2ptest.Exchange{ - { - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &hs0{42}, - Peer: id, - }, - }, - }, - { - Triggers: []p2ptest.Trigger{ - { - Code: 1, - Msg: &hs0{resp}, - Peer: id, - }, - }, - }, - } -} - -func runModuleHandshake(t *testing.T, resp uint, errs ...error) { - pp := p2ptest.NewTestPeerPool() - s := protocolTester(t, pp) - node := s.Nodes[0] - if err := s.TestExchanges(protoHandshakeExchange(node.ID(), &protoHandshake{42, "420"})...); err != nil { - t.Fatal(err) - } - if err := s.TestExchanges(moduleHandshakeExchange(node.ID(), resp)...); err != nil { - t.Fatal(err) - } - var disconnects []*p2ptest.Disconnect - for i, err := range errs { - disconnects = append(disconnects, &p2ptest.Disconnect{Peer: s.Nodes[i].ID(), Error: err}) - } - if err := s.TestDisconnected(disconnects...); err != nil { - t.Fatal(err) - } -} - -func TestModuleHandshakeError(t *testing.T) { - runModuleHandshake(t, 43, fmt.Errorf("handshake mismatch remote 43 > local 42")) -} - -func TestModuleHandshakeSuccess(t *testing.T) { - runModuleHandshake(t, 42) -} - -// testing complex interactions over multiple peers, relaying, dropping -func testMultiPeerSetup(a, b enode.ID) []p2ptest.Exchange { - - return []p2ptest.Exchange{ - { - Label: "primary handshake", - Expects: []p2ptest.Expect{ - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: a, - }, - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: b, - }, - }, - }, - { - Label: "module handshake", - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: a, - }, - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: b, - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &hs0{42}, - Peer: a, - }, - { - Code: 1, - Msg: &hs0{42}, - Peer: b, - }, - }, - }, - - {Label: "alternative module handshake", Triggers: []p2ptest.Trigger{{Code: 1, Msg: &hs0{41}, Peer: a}, - {Code: 1, Msg: &hs0{41}, Peer: b}}}, - {Label: "repeated module handshake", Triggers: []p2ptest.Trigger{{Code: 1, Msg: &hs0{1}, Peer: a}}}, - {Label: "receiving repeated module handshake", Expects: []p2ptest.Expect{{Code: 1, Msg: &hs0{43}, Peer: a}}}} -} - -func runMultiplePeers(t *testing.T, peer int, errs ...error) { - pp := p2ptest.NewTestPeerPool() - s := protocolTester(t, pp) - - if err := s.TestExchanges(testMultiPeerSetup(s.Nodes[0].ID(), s.Nodes[1].ID())...); err != nil { - t.Fatal(err) - } - // after some exchanges of messages, we can test state changes - // here this is simply demonstrated by the peerPool - // after the handshake negotiations peers must be added to the pool - // time.Sleep(1) - tick := time.NewTicker(10 * time.Millisecond) - timeout := time.NewTimer(1 * time.Second) -WAIT: - for { - select { - case <-tick.C: - if pp.Has(s.Nodes[0].ID()) { - break WAIT - } - case <-timeout.C: - t.Fatal("timeout") - } - } - if !pp.Has(s.Nodes[1].ID()) { - t.Fatalf("missing peer test-1: %v (%v)", pp, s.Nodes) - } - - // peer 0 sends kill request for peer with index - err := s.TestExchanges(p2ptest.Exchange{ - Triggers: []p2ptest.Trigger{ - { - Code: 2, - Msg: &kill{s.Nodes[peer].ID()}, - Peer: s.Nodes[0].ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - // the peer not killed sends a drop request - err = s.TestExchanges(p2ptest.Exchange{ - Triggers: []p2ptest.Trigger{ - { - Code: 3, - Msg: &drop{}, - Peer: s.Nodes[(peer+1)%2].ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - // check the actual discconnect errors on the individual peers - var disconnects []*p2ptest.Disconnect - for i, err := range errs { - disconnects = append(disconnects, &p2ptest.Disconnect{Peer: s.Nodes[i].ID(), Error: err}) - } - if err := s.TestDisconnected(disconnects...); err != nil { - t.Fatal(err) - } - // test if disconnected peers have been removed from peerPool - if pp.Has(s.Nodes[peer].ID()) { - t.Fatalf("peer test-%v not dropped: %v (%v)", peer, pp, s.Nodes) - } - -} -func XTestMultiplePeersDropSelf(t *testing.T) { - runMultiplePeers(t, 0, - fmt.Errorf("subprotocol error"), - fmt.Errorf("Message handler error: (msg code 3): dropped"), - ) -} - -func XTestMultiplePeersDropOther(t *testing.T) { - runMultiplePeers(t, 1, - fmt.Errorf("Message handler error: (msg code 3): dropped"), - fmt.Errorf("subprotocol error"), - ) -} diff --git a/p2p/rlpx.go b/p2p/rlpx.go index a105720a443b..0636431f53ab 100644 --- a/p2p/rlpx.go +++ b/p2p/rlpx.go @@ -38,10 +38,9 @@ import ( "github.com/ethereum/go-ethereum/common/bitutil" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/ecies" - "github.com/ethereum/go-ethereum/crypto/secp256k1" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/rlp" "github.com/golang/snappy" + "golang.org/x/crypto/sha3" ) const ( @@ -128,7 +127,7 @@ func (t *rlpx) doProtoHandshake(our *protoHandshake) (their *protoHandshake, err // as the error so it can be tracked elsewhere. werr := make(chan error, 1) go func() { werr <- Send(t.rw, handshakeMsg, our) }() - if their, err = readProtocolHandshake(t.rw, our); err != nil { + if their, err = readProtocolHandshake(t.rw); err != nil { <-werr // make sure the write terminates too return nil, err } @@ -141,7 +140,7 @@ func (t *rlpx) doProtoHandshake(our *protoHandshake) (their *protoHandshake, err return their, nil } -func readProtocolHandshake(rw MsgReader, our *protoHandshake) (*protoHandshake, error) { +func readProtocolHandshake(rw MsgReader) (*protoHandshake, error) { msg, err := rw.ReadMsg() if err != nil { return nil, err @@ -151,7 +150,7 @@ func readProtocolHandshake(rw MsgReader, our *protoHandshake) (*protoHandshake, } if msg.Code == discMsg { // Disconnect before protocol handshake is valid according to the - // spec and we send it ourself if the posthanshake checks fail. + // spec and we send it ourself if the post-handshake checks fail. // We can't return the reason directly, though, because it is echoed // back otherwise. Wrap it in a string instead. var reason [1]DiscReason @@ -253,10 +252,10 @@ func (h *encHandshake) secrets(auth, authResp []byte) (secrets, error) { } // setup sha3 instances for the MACs - mac1 := sha3.NewKeccak256() + mac1 := sha3.NewLegacyKeccak256() mac1.Write(xor(s.MAC, h.respNonce)) mac1.Write(auth) - mac2 := sha3.NewKeccak256() + mac2 := sha3.NewLegacyKeccak256() mac2.Write(xor(s.MAC, h.initNonce)) mac2.Write(authResp) if h.initiator { @@ -400,7 +399,7 @@ func (h *encHandshake) handleAuthMsg(msg *authMsgV4, prv *ecdsa.PrivateKey) erro return err } signedMsg := xor(token, h.initNonce) - remoteRandomPub, err := secp256k1.RecoverPubkey(signedMsg, msg.Signature[:]) + remoteRandomPub, err := crypto.Ecrecover(signedMsg, msg.Signature[:]) if err != nil { return err } diff --git a/p2p/rlpx_test.go b/p2p/rlpx_test.go index 64172217ba70..e62196ff049e 100644 --- a/p2p/rlpx_test.go +++ b/p2p/rlpx_test.go @@ -34,9 +34,9 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/ecies" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/p2p/simulations/pipes" "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" ) func TestSharedSecret(t *testing.T) { @@ -222,7 +222,6 @@ func TestProtocolHandshake(t *testing.T) { } func TestProtocolHandshakeErrors(t *testing.T) { - our := &protoHandshake{Version: 3, Caps: []Cap{{"foo", 2}, {"bar", 3}}, Name: "quux"} tests := []struct { code uint64 msg interface{} @@ -258,7 +257,7 @@ func TestProtocolHandshakeErrors(t *testing.T) { for i, test := range tests { p1, p2 := MsgPipe() go Send(p1, test.code, test.msg) - _, err := readProtocolHandshake(p2, our) + _, err := readProtocolHandshake(p2) if !reflect.DeepEqual(err, test.err) { t.Errorf("test %d: error mismatch: got %q, want %q", i, err, test.err) } @@ -334,8 +333,8 @@ func TestRLPXFrameRW(t *testing.T) { s1 := secrets{ AES: aesSecret, MAC: macSecret, - EgressMAC: sha3.NewKeccak256(), - IngressMAC: sha3.NewKeccak256(), + EgressMAC: sha3.NewLegacyKeccak256(), + IngressMAC: sha3.NewLegacyKeccak256(), } s1.EgressMAC.Write(egressMACinit) s1.IngressMAC.Write(ingressMACinit) @@ -344,8 +343,8 @@ func TestRLPXFrameRW(t *testing.T) { s2 := secrets{ AES: aesSecret, MAC: macSecret, - EgressMAC: sha3.NewKeccak256(), - IngressMAC: sha3.NewKeccak256(), + EgressMAC: sha3.NewLegacyKeccak256(), + IngressMAC: sha3.NewLegacyKeccak256(), } s2.EgressMAC.Write(ingressMACinit) s2.IngressMAC.Write(egressMACinit) diff --git a/p2p/server.go b/p2p/server.go index 40db758e2d20..692c9eb7d91d 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -20,9 +20,11 @@ package p2p import ( "bytes" "crypto/ecdsa" + "encoding/hex" "errors" "fmt" "net" + "sort" "sync" "sync/atomic" "time" @@ -35,6 +37,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/discv5" "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/p2p/netutil" ) @@ -47,6 +50,9 @@ const ( defaultMaxPendingPeers = 50 defaultDialRatio = 3 + // This time limits inbound connection attempts per source IP. + inboundThrottleTime = 30 * time.Second + // Maximum time allowed for reading a complete message. // This is effectively the amount of time a connection can be idle. frameReadTimeout = 30 * time.Second @@ -156,31 +162,36 @@ type Server struct { // the whole protocol stack. newTransport func(net.Conn) transport newPeerHook func(*Peer) + listenFunc func(network, addr string) (net.Listener, error) lock sync.Mutex // protects running running bool + nodedb *enode.DB + localnode *enode.LocalNode ntab discoverTable listener net.Listener ourHandshake *protoHandshake - lastLookup time.Time DiscV5 *discv5.Network - - // These are for Peers, PeerCount (and nothing else). - peerOp chan peerOpFunc - peerOpDone chan struct{} - - quit chan struct{} - addstatic chan *enode.Node - removestatic chan *enode.Node - addtrusted chan *enode.Node - removetrusted chan *enode.Node - posthandshake chan *conn - addpeer chan *conn - delpeer chan peerDrop - loopWG sync.WaitGroup // loop, listenLoop - peerFeed event.Feed - log log.Logger + loopWG sync.WaitGroup // loop, listenLoop + peerFeed event.Feed + log log.Logger + + // Channels into the run loop. + quit chan struct{} + addstatic chan *enode.Node + removestatic chan *enode.Node + addtrusted chan *enode.Node + removetrusted chan *enode.Node + peerOp chan peerOpFunc + peerOpDone chan struct{} + delpeer chan peerDrop + checkpointPostHandshake chan *conn + checkpointAddPeer chan *conn + + // State of run loop and listenLoop. + lastLookup time.Time + inboundHistory expHeap } type peerOpFunc func(map[enode.ID]*Peer) @@ -222,7 +233,7 @@ type transport interface { MsgReadWriter // transports must provide Close because we use MsgPipe in some of // the tests. Closing the actual network connection doesn't do - // anything in those tests because NsgPipe doesn't use it. + // anything in those tests because MsgPipe doesn't use it. close(err error) } @@ -275,6 +286,11 @@ func (c *conn) set(f connFlag, val bool) { } } +// LocalNode returns the local node record. +func (srv *Server) LocalNode() *enode.LocalNode { + return srv.localnode +} + // Peers returns all connected peers. func (srv *Server) Peers() []*Peer { var ps []*Peer @@ -347,43 +363,13 @@ func (srv *Server) SubscribeEvents(ch chan *PeerEvent) event.Subscription { // Self returns the local node's endpoint information. func (srv *Server) Self() *enode.Node { srv.lock.Lock() - running, listener, ntab := srv.running, srv.listener, srv.ntab + ln := srv.localnode srv.lock.Unlock() - if !running { + if ln == nil { return enode.NewV4(&srv.PrivateKey.PublicKey, net.ParseIP("0.0.0.0"), 0, 0) } - return srv.makeSelf(listener, ntab) -} - -func (srv *Server) makeSelf(listener net.Listener, ntab discoverTable) *enode.Node { - // If the node is running but discovery is off, manually assemble the node infos. - if ntab == nil { - addr := srv.tcpAddr(listener) - return enode.NewV4(&srv.PrivateKey.PublicKey, addr.IP, addr.Port, 0) - } - // Otherwise return the discovery node. - return ntab.Self() -} - -func (srv *Server) tcpAddr(listener net.Listener) net.TCPAddr { - addr := net.TCPAddr{IP: net.IP{0, 0, 0, 0}} - if listener == nil { - return addr // Inbound connections disabled, use zero address. - } - // Otherwise inject the listener address too. - if a, ok := listener.Addr().(*net.TCPAddr); ok { - addr = *a - } - if srv.NAT != nil { - if ip, err := srv.NAT.ExternalIP(); err == nil { - addr.IP = ip - } - } - if addr.IP.IsUnspecified() { - addr.IP = net.IP{127, 0, 0, 1} - } - return addr + return ln.Node() } // Stop terminates the server and all active peer connections. @@ -415,7 +401,7 @@ type sharedUDPConn struct { func (s *sharedUDPConn) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { packet, ok := <-s.unhandled if !ok { - return 0, nil, fmt.Errorf("Connection was closed") + return 0, nil, errors.New("Connection was closed") } l := len(packet.Data) if l > len(b) { @@ -441,24 +427,29 @@ func (srv *Server) Start() (err error) { srv.running = true srv.log = srv.Config.Logger if srv.log == nil { - srv.log = log.New() + srv.log = log.Root() + } + if srv.NoDial && srv.ListenAddr == "" { + srv.log.Warn("P2P server will be useless, neither dialing nor listening") } - srv.log.Info("Starting P2P networking") // static fields if srv.PrivateKey == nil { - return fmt.Errorf("Server.PrivateKey must be set to a non-nil key") + return errors.New("Server.PrivateKey must be set to a non-nil key") } if srv.newTransport == nil { srv.newTransport = newRLPX } + if srv.listenFunc == nil { + srv.listenFunc = net.Listen + } if srv.Dialer == nil { srv.Dialer = TCPDialer{&net.Dialer{Timeout: defaultDialTimeout}} } srv.quit = make(chan struct{}) - srv.addpeer = make(chan *conn) srv.delpeer = make(chan peerDrop) - srv.posthandshake = make(chan *conn) + srv.checkpointPostHandshake = make(chan *conn) + srv.checkpointAddPeer = make(chan *conn) srv.addstatic = make(chan *enode.Node) srv.removestatic = make(chan *enode.Node) srv.addtrusted = make(chan *enode.Node) @@ -466,65 +457,120 @@ func (srv *Server) Start() (err error) { srv.peerOp = make(chan peerOpFunc) srv.peerOpDone = make(chan struct{}) - var ( - conn *net.UDPConn - sconn *sharedUDPConn - realaddr *net.UDPAddr - unhandled chan discover.ReadPacket - ) - - if !srv.NoDiscovery || srv.DiscoveryV5 { - addr, err := net.ResolveUDPAddr("udp", srv.ListenAddr) - if err != nil { + if err := srv.setupLocalNode(); err != nil { + return err + } + if srv.ListenAddr != "" { + if err := srv.setupListening(); err != nil { return err } - conn, err = net.ListenUDP("udp", addr) - if err != nil { - return err + } + if err := srv.setupDiscovery(); err != nil { + return err + } + + dynPeers := srv.maxDialedConns() + dialer := newDialState(srv.localnode.ID(), srv.ntab, dynPeers, &srv.Config) + srv.loopWG.Add(1) + go srv.run(dialer) + return nil +} + +func (srv *Server) setupLocalNode() error { + // Create the devp2p handshake. + pubkey := crypto.FromECDSAPub(&srv.PrivateKey.PublicKey) + srv.ourHandshake = &protoHandshake{Version: baseProtocolVersion, Name: srv.Name, ID: pubkey[1:]} + for _, p := range srv.Protocols { + srv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap()) + } + sort.Sort(capsByNameAndVersion(srv.ourHandshake.Caps)) + + // Create the local node. + db, err := enode.OpenDB(srv.Config.NodeDatabase) + if err != nil { + return err + } + srv.nodedb = db + srv.localnode = enode.NewLocalNode(db, srv.PrivateKey) + srv.localnode.SetFallbackIP(net.IP{127, 0, 0, 1}) + // TODO: check conflicts + for _, p := range srv.Protocols { + for _, e := range p.Attributes { + srv.localnode.Set(e) } - realaddr = conn.LocalAddr().(*net.UDPAddr) - if srv.NAT != nil { - if !realaddr.IP.IsLoopback() { - go nat.Map(srv.NAT, srv.quit, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") - } - // TODO: react to external IP changes over time. - if ext, err := srv.NAT.ExternalIP(); err == nil { - realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port} + } + switch srv.NAT.(type) { + case nil: + // No NAT interface, do nothing. + case nat.ExtIP: + // ExtIP doesn't block, set the IP right away. + ip, _ := srv.NAT.ExternalIP() + srv.localnode.SetStaticIP(ip) + default: + // Ask the router about the IP. This takes a while and blocks startup, + // do it in the background. + srv.loopWG.Add(1) + go func() { + defer srv.loopWG.Done() + if ip, err := srv.NAT.ExternalIP(); err == nil { + srv.localnode.SetStaticIP(ip) } - } + }() } + return nil +} - if !srv.NoDiscovery && srv.DiscoveryV5 { - unhandled = make(chan discover.ReadPacket, 100) - sconn = &sharedUDPConn{conn, unhandled} +func (srv *Server) setupDiscovery() error { + if srv.NoDiscovery && !srv.DiscoveryV5 { + return nil } - // node table + addr, err := net.ResolveUDPAddr("udp", srv.ListenAddr) + if err != nil { + return err + } + conn, err := net.ListenUDP("udp", addr) + if err != nil { + return err + } + realaddr := conn.LocalAddr().(*net.UDPAddr) + srv.log.Debug("UDP listener up", "addr", realaddr) + if srv.NAT != nil { + if !realaddr.IP.IsLoopback() { + go nat.Map(srv.NAT, srv.quit, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") + } + } + srv.localnode.SetFallbackUDP(realaddr.Port) + + // Discovery V4 + var unhandled chan discover.ReadPacket + var sconn *sharedUDPConn if !srv.NoDiscovery { + if srv.DiscoveryV5 { + unhandled = make(chan discover.ReadPacket, 100) + sconn = &sharedUDPConn{conn, unhandled} + } cfg := discover.Config{ - PrivateKey: srv.PrivateKey, - AnnounceAddr: realaddr, - NodeDBPath: srv.NodeDatabase, - NetRestrict: srv.NetRestrict, - Bootnodes: srv.BootstrapNodes, - Unhandled: unhandled, + PrivateKey: srv.PrivateKey, + NetRestrict: srv.NetRestrict, + Bootnodes: srv.BootstrapNodes, + Unhandled: unhandled, + Log: srv.log, } - ntab, err := discover.ListenUDP(conn, cfg) + ntab, err := discover.ListenUDP(conn, srv.localnode, cfg) if err != nil { return err } srv.ntab = ntab } - + // Discovery V5 if srv.DiscoveryV5 { - var ( - ntab *discv5.Network - err error - ) + var ntab *discv5.Network + var err error if sconn != nil { - ntab, err = discv5.ListenUDP(srv.PrivateKey, sconn, realaddr, "", srv.NetRestrict) //srv.NodeDatabase) + ntab, err = discv5.ListenUDP(srv.PrivateKey, sconn, "", srv.NetRestrict) } else { - ntab, err = discv5.ListenUDP(srv.PrivateKey, conn, realaddr, "", srv.NetRestrict) //srv.NodeDatabase) + ntab, err = discv5.ListenUDP(srv.PrivateKey, conn, "", srv.NetRestrict) } if err != nil { return err @@ -534,50 +580,32 @@ func (srv *Server) Start() (err error) { } srv.DiscV5 = ntab } - - dynPeers := srv.maxDialedConns() - dialer := newDialState(srv.StaticNodes, srv.BootstrapNodes, srv.ntab, dynPeers, srv.NetRestrict) - - // handshake - pubkey := crypto.FromECDSAPub(&srv.PrivateKey.PublicKey) - srv.ourHandshake = &protoHandshake{Version: baseProtocolVersion, Name: srv.Name, ID: pubkey[1:]} - for _, p := range srv.Protocols { - srv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap()) - } - // listen/dial - if srv.ListenAddr != "" { - if err := srv.startListening(); err != nil { - return err - } - } - if srv.NoDial && srv.ListenAddr == "" { - srv.log.Warn("P2P server will be useless, neither dialing nor listening") - } - - srv.loopWG.Add(1) - go srv.run(dialer) return nil } -func (srv *Server) startListening() error { - // Launch the TCP listener. - listener, err := net.Listen("tcp", srv.ListenAddr) +func (srv *Server) setupListening() error { + // Launch the listener. + listener, err := srv.listenFunc("tcp", srv.ListenAddr) if err != nil { return err } - laddr := listener.Addr().(*net.TCPAddr) - srv.ListenAddr = laddr.String() srv.listener = listener + srv.ListenAddr = listener.Addr().String() + + // Update the local node record and map the TCP listening port if NAT is configured. + if tcp, ok := listener.Addr().(*net.TCPAddr); ok { + srv.localnode.Set(enr.TCP(tcp.Port)) + if !tcp.IP.IsLoopback() && srv.NAT != nil { + srv.loopWG.Add(1) + go func() { + nat.Map(srv.NAT, srv.quit, "tcp", tcp.Port, tcp.Port, "ethereum p2p") + srv.loopWG.Done() + }() + } + } + srv.loopWG.Add(1) go srv.listenLoop() - // Map the TCP listening port if NAT is configured. - if !laddr.IP.IsLoopback() && srv.NAT != nil { - srv.loopWG.Add(1) - go func() { - nat.Map(srv.NAT, srv.quit, "tcp", laddr.Port, laddr.Port, "ethereum p2p") - srv.loopWG.Done() - }() - } return nil } @@ -589,7 +617,10 @@ type dialer interface { } func (srv *Server) run(dialstate dialer) { + srv.log.Info("Started P2P networking", "self", srv.localnode.Node().URLv4()) defer srv.loopWG.Done() + defer srv.nodedb.Close() + var ( peers = make(map[enode.ID]*Peer) inboundCount = 0 @@ -642,12 +673,14 @@ running: case <-srv.quit: // The server was stopped. Run the cleanup logic. break running + case n := <-srv.addstatic: // This channel is used by AddPeer to add to the // ephemeral static peer list. Add it to the dialer, // it will keep the node connected. srv.log.Trace("Adding static node", "node", n) dialstate.addStatic(n) + case n := <-srv.removestatic: // This channel is used by RemovePeer to send a // disconnect request to a peer and begin the @@ -657,6 +690,7 @@ running: if p, ok := peers[n.ID()]; ok { p.Disconnect(DiscRequested) } + case n := <-srv.addtrusted: // This channel is used by AddTrustedPeer to add an enode // to the trusted node set. @@ -666,21 +700,23 @@ running: if p, ok := peers[n.ID()]; ok { p.rw.set(trustedConn, true) } + case n := <-srv.removetrusted: // This channel is used by RemoveTrustedPeer to remove an enode // from the trusted node set. srv.log.Trace("Removing trusted node", "node", n) - if _, ok := trusted[n.ID()]; ok { - delete(trusted, n.ID()) - } + delete(trusted, n.ID()) + // Unmark any already-connected peer as trusted if p, ok := peers[n.ID()]; ok { p.rw.set(trustedConn, false) } + case op := <-srv.peerOp: // This channel is used by Peers and PeerCount. op(peers) srv.peerOpDone <- struct{}{} + case t := <-taskdone: // A task got done. Tell dialstate about it so it // can update its state and remove it from the active @@ -688,7 +724,8 @@ running: srv.log.Trace("Dial task done", "task", t) dialstate.taskDone(t, time.Now()) delTask(t) - case c := <-srv.posthandshake: + + case c := <-srv.checkpointPostHandshake: // A connection has passed the encryption handshake so // the remote identity is known (but hasn't been verified yet). if trusted[c.node.ID()] { @@ -696,25 +733,22 @@ running: c.flags |= trustedConn } // TODO: track in-progress inbound node IDs (pre-Peer) to avoid dialing them. - select { - case c.cont <- srv.encHandshakeChecks(peers, inboundCount, c): - case <-srv.quit: - break running - } - case c := <-srv.addpeer: + c.cont <- srv.postHandshakeChecks(peers, inboundCount, c) + + case c := <-srv.checkpointAddPeer: // At this point the connection is past the protocol handshake. // Its capabilities are known and the remote identity is verified. - err := srv.protoHandshakeChecks(peers, inboundCount, c) + err := srv.addPeerChecks(peers, inboundCount, c) if err == nil { // The handshakes are done and it passed all checks. - p := newPeer(c, srv.Protocols) + p := newPeer(srv.log, c, srv.Protocols) // If message events are enabled, pass the peerFeed // to the peer if srv.EnableMsgEvents { p.events = &srv.peerFeed } name := truncateName(c.name) - srv.log.Debug("Adding p2p peer", "name", name, "addr", c.fd.RemoteAddr(), "peers", len(peers)+1) + p.log.Debug("Adding p2p peer", "addr", p.RemoteAddr(), "peers", len(peers)+1, "name", name) go srv.runPeer(p) peers[c.node.ID()] = p if p.Inbound() { @@ -724,15 +758,12 @@ running: // The dialer logic relies on the assumption that // dial tasks complete after the peer has been added or // discarded. Unblock the task last. - select { - case c.cont <- err: - case <-srv.quit: - break running - } + c.cont <- err + case pd := <-srv.delpeer: // A peer disconnected. d := common.PrettyDuration(mclock.Now() - pd.created) - pd.log.Debug("Removing p2p peer", "duration", d, "peers", len(peers)-1, "req", pd.requested, "err", pd.err) + pd.log.Debug("Removing p2p peer", "addr", pd.RemoteAddr(), "peers", len(peers)-1, "duration", d, "req", pd.requested, "err", pd.err) delete(peers, pd.ID()) if pd.Inbound() { inboundCount-- @@ -763,17 +794,7 @@ running: } } -func (srv *Server) protoHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { - // Drop connections with no matching protocols. - if len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 { - return DiscUselessPeer - } - // Repeat the encryption handshake checks because the - // peer set might have changed between the handshakes. - return srv.encHandshakeChecks(peers, inboundCount, c) -} - -func (srv *Server) encHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { +func (srv *Server) postHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { switch { case !c.is(trustedConn|staticDialedConn) && len(peers) >= srv.MaxPeers: return DiscTooManyPeers @@ -781,16 +802,27 @@ func (srv *Server) encHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int return DiscTooManyPeers case peers[c.node.ID()] != nil: return DiscAlreadyConnected - case c.node.ID() == srv.Self().ID(): + case c.node.ID() == srv.localnode.ID(): return DiscSelf default: return nil } } +func (srv *Server) addPeerChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { + // Drop connections with no matching protocols. + if len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 { + return DiscUselessPeer + } + // Repeat the post-handshake checks because the + // peer set might have changed since those checks were performed. + return srv.postHandshakeChecks(peers, inboundCount, c) +} + func (srv *Server) maxInboundConns() int { return srv.MaxPeers - srv.maxDialedConns() } + func (srv *Server) maxDialedConns() int { if srv.NoDiscovery || srv.NoDial { return 0 @@ -802,15 +834,11 @@ func (srv *Server) maxDialedConns() int { return srv.MaxPeers / r } -type tempError interface { - Temporary() bool -} - // listenLoop runs in its own goroutine and accepts // inbound connections. func (srv *Server) listenLoop() { defer srv.loopWG.Done() - srv.log.Info("RLPx listener up", "self", srv.Self()) + srv.log.Debug("TCP listener up", "addr", srv.listener.Addr()) tokens := defaultMaxPendingPeers if srv.MaxPendingPeers > 0 { @@ -822,7 +850,7 @@ func (srv *Server) listenLoop() { } for { - // Wait for a handshake slot before accepting. + // Wait for a free slot before accepting. <-slots var ( @@ -831,7 +859,7 @@ func (srv *Server) listenLoop() { ) for { fd, err = srv.listener.Accept() - if tempErr, ok := err.(tempError); ok && tempErr.Temporary() { + if netutil.IsTemporaryError(err) { srv.log.Debug("Temporary read error", "err", err) continue } else if err != nil { @@ -841,17 +869,16 @@ func (srv *Server) listenLoop() { break } - // Reject connections that do not match NetRestrict. - if srv.NetRestrict != nil { - if tcp, ok := fd.RemoteAddr().(*net.TCPAddr); ok && !srv.NetRestrict.Contains(tcp.IP) { - srv.log.Debug("Rejected conn (not whitelisted in NetRestrict)", "addr", fd.RemoteAddr()) - fd.Close() - slots <- struct{}{} - continue - } + remoteIP := netutil.AddrIP(fd.RemoteAddr()) + if err := srv.checkInboundConn(fd, remoteIP); err != nil { + srv.log.Debug("Rejected inbound connnection", "addr", fd.RemoteAddr(), "err", err) + fd.Close() + slots <- struct{}{} + continue + } + if remoteIP != nil { + fd = newMeteredConn(fd, true, remoteIP) } - - fd = newMeteredConn(fd, true) srv.log.Trace("Accepted connection", "addr", fd.RemoteAddr()) go func() { srv.SetupConn(fd, inboundConn, nil) @@ -860,14 +887,26 @@ func (srv *Server) listenLoop() { } } +func (srv *Server) checkInboundConn(fd net.Conn, remoteIP net.IP) error { + if remoteIP != nil { + // Reject connections that do not match NetRestrict. + if srv.NetRestrict != nil && !srv.NetRestrict.Contains(remoteIP) { + return fmt.Errorf("not whitelisted in NetRestrict") + } + // Reject Internet peers that try too often. + srv.inboundHistory.expire(time.Now()) + if !netutil.IsLAN(remoteIP) && srv.inboundHistory.contains(remoteIP.String()) { + return fmt.Errorf("too many attempts") + } + srv.inboundHistory.add(remoteIP.String(), time.Now().Add(inboundThrottleTime)) + } + return nil +} + // SetupConn runs the handshakes and attempts to add the connection // as a peer. It returns when the connection has been added as a peer // or the handshakes have failed. func (srv *Server) SetupConn(fd net.Conn, flags connFlag, dialDest *enode.Node) error { - self := srv.Self() - if self == nil { - return errors.New("shutdown") - } c := &conn{fd: fd, transport: srv.newTransport(fd), flags: flags, cont: make(chan error)} err := srv.setupConn(c, flags, dialDest) if err != nil { @@ -885,15 +924,17 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro if !running { return errServerStopped } + // If dialing, figure out the remote public key. var dialPubkey *ecdsa.PublicKey if dialDest != nil { dialPubkey = new(ecdsa.PublicKey) if err := dialDest.Load((*enode.Secp256k1)(dialPubkey)); err != nil { - return fmt.Errorf("dial destination doesn't have a secp256k1 public key") + return errors.New("dial destination doesn't have a secp256k1 public key") } } - // Run the encryption handshake. + + // Run the RLPx handshake. remotePubkey, err := c.doEncHandshake(srv.PrivateKey, dialPubkey) if err != nil { srv.log.Trace("Failed RLPx handshake", "addr", c.fd.RemoteAddr(), "conn", c.flags, "err", err) @@ -908,31 +949,36 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro } else { c.node = nodeFromConn(remotePubkey, c.fd) } + if conn, ok := c.fd.(*meteredConn); ok { + conn.handshakeDone(c.node.ID()) + } clog := srv.log.New("id", c.node.ID(), "addr", c.fd.RemoteAddr(), "conn", c.flags) - err = srv.checkpoint(c, srv.posthandshake) + err = srv.checkpoint(c, srv.checkpointPostHandshake) if err != nil { - clog.Trace("Rejected peer before protocol handshake", "err", err) + clog.Trace("Rejected peer", "err", err) return err } - // Run the protocol handshake + + // Run the capability negotiation handshake. phs, err := c.doProtoHandshake(srv.ourHandshake) if err != nil { clog.Trace("Failed proto handshake", "err", err) return err } if id := c.node.ID(); !bytes.Equal(crypto.Keccak256(phs.ID), id[:]) { - clog.Trace("Wrong devp2p handshake identity", "phsid", fmt.Sprintf("%x", phs.ID)) + clog.Trace("Wrong devp2p handshake identity", "phsid", hex.EncodeToString(phs.ID)) return DiscUnexpectedIdentity } c.caps, c.name = phs.Caps, phs.Name - err = srv.checkpoint(c, srv.addpeer) + err = srv.checkpoint(c, srv.checkpointAddPeer) if err != nil { clog.Trace("Rejected peer", "err", err) return err } - // If the checks completed successfully, runPeer has now been - // launched by run. - clog.Trace("connection set up", "inbound", dialDest == nil) + + // If the checks completed successfully, the connection has been added as a peer and + // runPeer has been launched. + clog.Trace("Connection set up", "inbound", dialDest == nil) return nil } @@ -961,12 +1007,7 @@ func (srv *Server) checkpoint(c *conn, stage chan<- *conn) error { case <-srv.quit: return errServerStopped } - select { - case err := <-c.cont: - return err - case <-srv.quit: - return errServerStopped - } + return <-c.cont } // runPeer runs in its own goroutine for each peer. @@ -979,8 +1020,10 @@ func (srv *Server) runPeer(p *Peer) { // broadcast peer add srv.peerFeed.Send(&PeerEvent{ - Type: PeerEventTypeAdd, - Peer: p.ID(), + Type: PeerEventTypeAdd, + Peer: p.ID(), + RemoteAddress: p.RemoteAddr().String(), + LocalAddress: p.LocalAddr().String(), }) // run the protocol @@ -988,9 +1031,11 @@ func (srv *Server) runPeer(p *Peer) { // broadcast peer drop srv.peerFeed.Send(&PeerEvent{ - Type: PeerEventTypeDrop, - Peer: p.ID(), - Error: err.Error(), + Type: PeerEventTypeDrop, + Peer: p.ID(), + Error: err.Error(), + RemoteAddress: p.RemoteAddr().String(), + LocalAddress: p.LocalAddr().String(), }) // Note: run waits for existing peers to be sent on srv.delpeer @@ -1003,6 +1048,7 @@ type NodeInfo struct { ID string `json:"id"` // Unique node identifier (also the encryption key) Name string `json:"name"` // Name of the node, including client type, version, OS, custom data Enode string `json:"enode"` // Enode URL for adding this peer from remote peers + ENR string `json:"enr"` // Ethereum Node Record IP string `json:"ip"` // IP address of the node Ports struct { Discovery int `json:"discovery"` // UDP listening port for discovery protocol @@ -1014,12 +1060,11 @@ type NodeInfo struct { // NodeInfo gathers and returns a collection of metadata known about the host. func (srv *Server) NodeInfo() *NodeInfo { - node := srv.Self() - // Gather and assemble the generic node infos + node := srv.Self() info := &NodeInfo{ Name: srv.Name, - Enode: node.String(), + Enode: node.URLv4(), ID: node.ID().String(), IP: node.IP().String(), ListenAddr: srv.ListenAddr, @@ -1027,6 +1072,7 @@ func (srv *Server) NodeInfo() *NodeInfo { } info.Ports.Discovery = node.UDP() info.Ports.Listener = node.TCP() + info.ENR = node.String() // Gather all the running protocol infos (only once per protocol type) for _, proto := range srv.Protocols { diff --git a/p2p/server_test.go b/p2p/server_test.go index e0b1fc122e9a..e8bc627e1d30 100644 --- a/p2p/server_test.go +++ b/p2p/server_test.go @@ -19,6 +19,7 @@ package p2p import ( "crypto/ecdsa" "errors" + "io" "math/rand" "net" "reflect" @@ -26,10 +27,11 @@ import ( "time" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/sha3" + "github.com/ethereum/go-ethereum/internal/testlog" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" + "golang.org/x/crypto/sha3" ) // func init() { @@ -48,8 +50,8 @@ func newTestTransport(rpub *ecdsa.PublicKey, fd net.Conn) transport { wrapped.rw = newRLPXFrameRW(fd, secrets{ MAC: zero16, AES: zero16, - IngressMAC: sha3.NewKeccak256(), - EgressMAC: sha3.NewKeccak256(), + IngressMAC: sha3.NewLegacyKeccak256(), + EgressMAC: sha3.NewLegacyKeccak256(), }) return &testTransport{rpub: rpub, rlpx: wrapped} } @@ -74,6 +76,7 @@ func startTestServer(t *testing.T, remoteKey *ecdsa.PublicKey, pf func(*Peer)) * MaxPeers: 10, ListenAddr: "127.0.0.1:0", PrivateKey: newkey(), + Logger: testlog.Logger(t, log.LvlTrace), } server := &Server{ Config: config, @@ -225,12 +228,15 @@ func TestServerTaskScheduling(t *testing.T) { // The Server in this test isn't actually running // because we're only interested in what run does. + db, _ := enode.OpenDB("") srv := &Server{ - Config: Config{MaxPeers: 10}, - quit: make(chan struct{}), - ntab: fakeTable{}, - running: true, - log: log.New(), + Config: Config{MaxPeers: 10}, + localnode: enode.NewLocalNode(db, newkey()), + nodedb: db, + quit: make(chan struct{}), + ntab: fakeTable{}, + running: true, + log: log.New(), } srv.loopWG.Add(1) go func() { @@ -271,11 +277,14 @@ func TestServerManyTasks(t *testing.T) { } var ( - srv = &Server{ - quit: make(chan struct{}), - ntab: fakeTable{}, - running: true, - log: log.New(), + db, _ = enode.OpenDB("") + srv = &Server{ + quit: make(chan struct{}), + localnode: enode.NewLocalNode(db, newkey()), + nodedb: db, + ntab: fakeTable{}, + running: true, + log: log.New(), } done = make(chan *testTask) start, end = 0, 0 @@ -353,6 +362,7 @@ func TestServerAtCap(t *testing.T) { PrivateKey: newkey(), MaxPeers: 10, NoDial: true, + NoDiscovery: true, TrustedNodes: []*enode.Node{newNode(trustedID, nil)}, }, } @@ -371,19 +381,19 @@ func TestServerAtCap(t *testing.T) { // Inject a few connections to fill up the peer set. for i := 0; i < 10; i++ { c := newconn(randomID()) - if err := srv.checkpoint(c, srv.addpeer); err != nil { + if err := srv.checkpoint(c, srv.checkpointAddPeer); err != nil { t.Fatalf("could not add conn %d: %v", i, err) } } // Try inserting a non-trusted connection. anotherID := randomID() c := newconn(anotherID) - if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers { t.Error("wrong error for insert:", err) } // Try inserting a trusted connection. c = newconn(trustedID) - if err := srv.checkpoint(c, srv.posthandshake); err != nil { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil { t.Error("unexpected error for trusted conn @posthandshake:", err) } if !c.is(trustedConn) { @@ -393,14 +403,14 @@ func TestServerAtCap(t *testing.T) { // Remove from trusted set and try again srv.RemoveTrustedPeer(newNode(trustedID, nil)) c = newconn(trustedID) - if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers { t.Error("wrong error for insert:", err) } // Add anotherID to trusted set and try again srv.AddTrustedPeer(newNode(anotherID, nil)) c = newconn(anotherID) - if err := srv.checkpoint(c, srv.posthandshake); err != nil { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil { t.Error("unexpected error for trusted conn @posthandshake:", err) } if !c.is(trustedConn) { @@ -424,10 +434,11 @@ func TestServerPeerLimits(t *testing.T) { srv := &Server{ Config: Config{ - PrivateKey: srvkey, - MaxPeers: 0, - NoDial: true, - Protocols: []Protocol{discard}, + PrivateKey: srvkey, + MaxPeers: 0, + NoDial: true, + NoDiscovery: true, + Protocols: []Protocol{discard}, }, newTransport: func(fd net.Conn) transport { return tp }, log: log.New(), @@ -535,29 +546,35 @@ func TestServerSetupConn(t *testing.T) { } for i, test := range tests { - srv := &Server{ - Config: Config{ - PrivateKey: srvkey, - MaxPeers: 10, - NoDial: true, - Protocols: []Protocol{discard}, - }, - newTransport: func(fd net.Conn) transport { return test.tt }, - log: log.New(), - } - if !test.dontstart { - if err := srv.Start(); err != nil { - t.Fatalf("couldn't start server: %v", err) + t.Run(test.wantCalls, func(t *testing.T) { + cfg := Config{ + PrivateKey: srvkey, + MaxPeers: 10, + NoDial: true, + NoDiscovery: true, + Protocols: []Protocol{discard}, + Logger: testlog.Logger(t, log.LvlTrace), } - } - p1, _ := net.Pipe() - srv.SetupConn(p1, test.flags, test.dialDest) - if !reflect.DeepEqual(test.tt.closeErr, test.wantCloseErr) { - t.Errorf("test %d: close error mismatch: got %q, want %q", i, test.tt.closeErr, test.wantCloseErr) - } - if test.tt.calls != test.wantCalls { - t.Errorf("test %d: calls mismatch: got %q, want %q", i, test.tt.calls, test.wantCalls) - } + srv := &Server{ + Config: cfg, + newTransport: func(fd net.Conn) transport { return test.tt }, + log: cfg.Logger, + } + if !test.dontstart { + if err := srv.Start(); err != nil { + t.Fatalf("couldn't start server: %v", err) + } + defer srv.Stop() + } + p1, _ := net.Pipe() + srv.SetupConn(p1, test.flags, test.dialDest) + if !reflect.DeepEqual(test.tt.closeErr, test.wantCloseErr) { + t.Errorf("test %d: close error mismatch: got %q, want %q", i, test.tt.closeErr, test.wantCloseErr) + } + if test.tt.calls != test.wantCalls { + t.Errorf("test %d: calls mismatch: got %q, want %q", i, test.tt.calls, test.wantCalls) + } + }) } } @@ -610,3 +627,100 @@ func randomID() (id enode.ID) { } return id } + +// This test checks that inbound connections are throttled by IP. +func TestServerInboundThrottle(t *testing.T) { + const timeout = 5 * time.Second + newTransportCalled := make(chan struct{}) + srv := &Server{ + Config: Config{ + PrivateKey: newkey(), + ListenAddr: "127.0.0.1:0", + MaxPeers: 10, + NoDial: true, + NoDiscovery: true, + Protocols: []Protocol{discard}, + Logger: testlog.Logger(t, log.LvlTrace), + }, + newTransport: func(fd net.Conn) transport { + newTransportCalled <- struct{}{} + return newRLPX(fd) + }, + listenFunc: func(network, laddr string) (net.Listener, error) { + fakeAddr := &net.TCPAddr{IP: net.IP{95, 33, 21, 2}, Port: 4444} + return listenFakeAddr(network, laddr, fakeAddr) + }, + } + if err := srv.Start(); err != nil { + t.Fatal("can't start: ", err) + } + defer srv.Stop() + + // Dial the test server. + conn, err := net.DialTimeout("tcp", srv.ListenAddr, timeout) + if err != nil { + t.Fatalf("could not dial: %v", err) + } + select { + case <-newTransportCalled: + // OK + case <-time.After(timeout): + t.Error("newTransport not called") + } + conn.Close() + + // Dial again. This time the server should close the connection immediately. + connClosed := make(chan struct{}) + conn, err = net.DialTimeout("tcp", srv.ListenAddr, timeout) + if err != nil { + t.Fatalf("could not dial: %v", err) + } + defer conn.Close() + go func() { + conn.SetDeadline(time.Now().Add(timeout)) + buf := make([]byte, 10) + if n, err := conn.Read(buf); err != io.EOF || n != 0 { + t.Errorf("expected io.EOF and n == 0, got error %q and n == %d", err, n) + } + connClosed <- struct{}{} + }() + select { + case <-connClosed: + // OK + case <-newTransportCalled: + t.Error("newTransport called for second attempt") + case <-time.After(timeout): + t.Error("connection not closed within timeout") + } +} + +func listenFakeAddr(network, laddr string, remoteAddr net.Addr) (net.Listener, error) { + l, err := net.Listen(network, laddr) + if err == nil { + l = &fakeAddrListener{l, remoteAddr} + } + return l, err +} + +// fakeAddrListener is a listener that creates connections with a mocked remote address. +type fakeAddrListener struct { + net.Listener + remoteAddr net.Addr +} + +type fakeAddrConn struct { + net.Conn + remoteAddr net.Addr +} + +func (l *fakeAddrListener) Accept() (net.Conn, error) { + c, err := l.Listener.Accept() + if err != nil { + return nil, err + } + return &fakeAddrConn{c, l.remoteAddr}, nil +} + +func (c *fakeAddrConn) RemoteAddr() net.Addr { + return c.remoteAddr +} diff --git a/p2p/simulations/README.md b/p2p/simulations/README.md index d1f8649eaed2..871d71b2c714 100644 --- a/p2p/simulations/README.md +++ b/p2p/simulations/README.md @@ -63,18 +63,6 @@ using the devp2p node stack rather than executing `main()`. The nodes listen for devp2p connections and WebSocket RPC clients on random localhost ports. -### DockerAdapter - -The `DockerAdapter` is similar to the `ExecAdapter` but executes `docker run` -to run the node in a Docker container using a Docker image containing the -simulation binary at `/bin/p2p-node`. - -The Docker image is built using `docker build` when the adapter is initialised, -meaning no prior setup is necessary other than having a working Docker client. - -Each node listens on the external IP of the container and the default p2p and -RPC ports (`30303` and `8546` respectively). - ## Network A simulation network is created with an ID and default service (which is used diff --git a/p2p/simulations/adapters/docker.go b/p2p/simulations/adapters/docker.go deleted file mode 100644 index 82eab0e9cd11..000000000000 --- a/p2p/simulations/adapters/docker.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package adapters - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - - "github.com/docker/docker/pkg/reexec" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" -) - -var ( - ErrLinuxOnly = errors.New("DockerAdapter can only be used on Linux as it uses the current binary (which must be a Linux binary)") -) - -// DockerAdapter is a NodeAdapter which runs simulation nodes inside Docker -// containers. -// -// A Docker image is built which contains the current binary at /bin/p2p-node -// which when executed runs the underlying service (see the description -// of the execP2PNode function for more details) -type DockerAdapter struct { - ExecAdapter -} - -// NewDockerAdapter builds the p2p-node Docker image containing the current -// binary and returns a DockerAdapter -func NewDockerAdapter() (*DockerAdapter, error) { - // Since Docker containers run on Linux and this adapter runs the - // current binary in the container, it must be compiled for Linux. - // - // It is reasonable to require this because the caller can just - // compile the current binary in a Docker container. - if runtime.GOOS != "linux" { - return nil, ErrLinuxOnly - } - - if err := buildDockerImage(); err != nil { - return nil, err - } - - return &DockerAdapter{ - ExecAdapter{ - nodes: make(map[enode.ID]*ExecNode), - }, - }, nil -} - -// Name returns the name of the adapter for logging purposes -func (d *DockerAdapter) Name() string { - return "docker-adapter" -} - -// NewNode returns a new DockerNode using the given config -func (d *DockerAdapter) NewNode(config *NodeConfig) (Node, error) { - if len(config.Services) == 0 { - return nil, errors.New("node must have at least one service") - } - for _, service := range config.Services { - if _, exists := serviceFuncs[service]; !exists { - return nil, fmt.Errorf("unknown node service %q", service) - } - } - - // generate the config - conf := &execNodeConfig{ - Stack: node.DefaultConfig, - Node: config, - } - conf.Stack.DataDir = "/data" - conf.Stack.WSHost = "0.0.0.0" - conf.Stack.WSOrigins = []string{"*"} - conf.Stack.WSExposeAll = true - conf.Stack.P2P.EnableMsgEvents = false - conf.Stack.P2P.NoDiscovery = true - conf.Stack.P2P.NAT = nil - conf.Stack.NoUSB = true - - // listen on all interfaces on a given port, which we set when we - // initialise NodeConfig (usually a random port) - conf.Stack.P2P.ListenAddr = fmt.Sprintf(":%d", config.Port) - - node := &DockerNode{ - ExecNode: ExecNode{ - ID: config.ID, - Config: conf, - adapter: &d.ExecAdapter, - }, - } - node.newCmd = node.dockerCommand - d.ExecAdapter.nodes[node.ID] = &node.ExecNode - return node, nil -} - -// DockerNode wraps an ExecNode but exec's the current binary in a docker -// container rather than locally -type DockerNode struct { - ExecNode -} - -// dockerCommand returns a command which exec's the binary in a Docker -// container. -// -// It uses a shell so that we can pass the _P2P_NODE_CONFIG environment -// variable to the container using the --env flag. -func (n *DockerNode) dockerCommand() *exec.Cmd { - return exec.Command( - "sh", "-c", - fmt.Sprintf( - `exec docker run --interactive --env _P2P_NODE_CONFIG="${_P2P_NODE_CONFIG}" %s p2p-node %s %s`, - dockerImage, strings.Join(n.Config.Node.Services, ","), n.ID.String(), - ), - ) -} - -// dockerImage is the name of the Docker image which gets built to run the -// simulation node -const dockerImage = "p2p-node" - -// buildDockerImage builds the Docker image which is used to run the simulation -// node in a Docker container. -// -// It adds the current binary as "p2p-node" so that it runs execP2PNode -// when executed. -func buildDockerImage() error { - // create a directory to use as the build context - dir, err := ioutil.TempDir("", "p2p-docker") - if err != nil { - return err - } - defer os.RemoveAll(dir) - - // copy the current binary into the build context - bin, err := os.Open(reexec.Self()) - if err != nil { - return err - } - defer bin.Close() - dst, err := os.OpenFile(filepath.Join(dir, "self.bin"), os.O_WRONLY|os.O_CREATE, 0755) - if err != nil { - return err - } - defer dst.Close() - if _, err := io.Copy(dst, bin); err != nil { - return err - } - - // create the Dockerfile - dockerfile := []byte(` -FROM ubuntu:16.04 -RUN mkdir /data -ADD self.bin /bin/p2p-node - `) - if err := ioutil.WriteFile(filepath.Join(dir, "Dockerfile"), dockerfile, 0644); err != nil { - return err - } - - // run 'docker build' - cmd := exec.Command("docker", "build", "-t", dockerImage, dir) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - return fmt.Errorf("error building docker image: %s", err) - } - - return nil -} diff --git a/p2p/simulations/adapters/exec.go b/p2p/simulations/adapters/exec.go index dc7d277cac2d..5eb0a31566c6 100644 --- a/p2p/simulations/adapters/exec.go +++ b/p2p/simulations/adapters/exec.go @@ -17,7 +17,7 @@ package adapters import ( - "bufio" + "bytes" "context" "crypto/ecdsa" "encoding/json" @@ -25,6 +25,7 @@ import ( "fmt" "io" "net" + "net/http" "os" "os/exec" "os/signal" @@ -43,12 +44,14 @@ import ( "golang.org/x/net/websocket" ) -// ExecAdapter is a NodeAdapter which runs simulation nodes by executing the -// current binary as a child process. -// -// An init hook is used so that the child process executes the node services -// (rather than whataver the main() function would normally do), see the -// execP2PNode function for more information. +func init() { + // Register a reexec function to start a simulation node when the current binary is + // executed as "p2p-node" (rather than whatever the main() function would normally do). + reexec.Register("p2p-node", execP2PNode) +} + +// ExecAdapter is a NodeAdapter which runs simulation nodes by executing the current binary +// as a child process. type ExecAdapter struct { // BaseDir is the directory under which the data directories for each // simulation node are created. @@ -89,17 +92,28 @@ func (e *ExecAdapter) NewNode(config *NodeConfig) (Node, error) { return nil, fmt.Errorf("error creating node directory: %s", err) } + err := config.initDummyEnode() + if err != nil { + return nil, err + } + // generate the config conf := &execNodeConfig{ Stack: node.DefaultConfig, Node: config, } - conf.Stack.DataDir = filepath.Join(dir, "data") + if config.DataDir != "" { + conf.Stack.DataDir = config.DataDir + } else { + conf.Stack.DataDir = filepath.Join(dir, "data") + } + + // these parameters are crucial for execadapter node to run correctly conf.Stack.WSHost = "127.0.0.1" conf.Stack.WSPort = 0 conf.Stack.WSOrigins = []string{"*"} conf.Stack.WSExposeAll = true - conf.Stack.P2P.EnableMsgEvents = false + conf.Stack.P2P.EnableMsgEvents = config.EnableMsgEvents conf.Stack.P2P.NoDiscovery = true conf.Stack.P2P.NAT = nil conf.Stack.NoUSB = true @@ -150,15 +164,13 @@ func (n *ExecNode) Client() (*rpc.Client, error) { } // Start exec's the node passing the ID and service as command line arguments -// and the node config encoded as JSON in the _P2P_NODE_CONFIG environment -// variable +// and the node config encoded as JSON in an environment variable. func (n *ExecNode) Start(snapshots map[string][]byte) (err error) { if n.Cmd != nil { return errors.New("already started") } defer func() { if err != nil { - log.Error("node failed to start", "err", err) n.Stop() } }() @@ -175,59 +187,78 @@ func (n *ExecNode) Start(snapshots map[string][]byte) (err error) { return fmt.Errorf("error generating node config: %s", err) } - // use a pipe for stderr so we can both copy the node's stderr to - // os.Stderr and read the WebSocket address from the logs - stderrR, stderrW := io.Pipe() - stderr := io.MultiWriter(os.Stderr, stderrW) + // start the one-shot server that waits for startup information + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + statusURL, statusC := n.waitForStartupJSON(ctx) // start the node cmd := n.newCmd() cmd.Stdout = os.Stdout - cmd.Stderr = stderr - cmd.Env = append(os.Environ(), fmt.Sprintf("_P2P_NODE_CONFIG=%s", confData)) + cmd.Stderr = os.Stderr + cmd.Env = append(os.Environ(), + envStatusURL+"="+statusURL, + envNodeConfig+"="+string(confData), + ) if err := cmd.Start(); err != nil { return fmt.Errorf("error starting node: %s", err) } n.Cmd = cmd // read the WebSocket address from the stderr logs - var wsAddr string - wsAddrC := make(chan string) - go func() { - s := bufio.NewScanner(stderrR) - for s.Scan() { - if strings.Contains(s.Text(), "WebSocket endpoint opened") { - wsAddrC <- wsAddrPattern.FindString(s.Text()) - } - } - }() - select { - case wsAddr = <-wsAddrC: - if wsAddr == "" { - return errors.New("failed to read WebSocket address from stderr") - } - case <-time.After(10 * time.Second): - return errors.New("timed out waiting for WebSocket address on stderr") + status := <-statusC + if status.Err != "" { + return errors.New(status.Err) } - - // create the RPC client and load the node info - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - client, err := rpc.DialWebsocket(ctx, wsAddr, "") + client, err := rpc.DialWebsocket(ctx, status.WSEndpoint, "http://localhost") if err != nil { - return fmt.Errorf("error dialing rpc websocket: %s", err) - } - var info p2p.NodeInfo - if err := client.CallContext(ctx, &info, "admin_nodeInfo"); err != nil { - return fmt.Errorf("error getting node info: %s", err) + return fmt.Errorf("can't connect to RPC server: %v", err) } - n.client = client - n.wsAddr = wsAddr - n.Info = &info + // node ready :) + n.client = client + n.wsAddr = status.WSEndpoint + n.Info = status.NodeInfo return nil } +// waitForStartupJSON runs a one-shot HTTP server to receive a startup report. +func (n *ExecNode) waitForStartupJSON(ctx context.Context) (string, chan nodeStartupJSON) { + var ( + ch = make(chan nodeStartupJSON, 1) + quitOnce sync.Once + srv http.Server + ) + l, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + ch <- nodeStartupJSON{Err: err.Error()} + return "", ch + } + quit := func(status nodeStartupJSON) { + quitOnce.Do(func() { + l.Close() + ch <- status + }) + } + srv.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var status nodeStartupJSON + if err := json.NewDecoder(r.Body).Decode(&status); err != nil { + status.Err = fmt.Sprintf("can't decode startup report: %v", err) + } + quit(status) + }) + // Run the HTTP server, but don't wait forever and shut it down + // if the context is canceled. + go srv.Serve(l) + go func() { + <-ctx.Done() + quit(nodeStartupJSON{Err: "didn't get startup report"}) + }() + + url := "http://" + l.Addr().String() + return url, ch +} + // execCommand returns a command which runs the node locally by exec'ing // the current binary but setting argv[0] to "p2p-node" so that the child // runs execP2PNode @@ -318,12 +349,6 @@ func (n *ExecNode) Snapshots() (map[string][]byte, error) { return snapshots, n.client.Call(&snapshots, "simulation_snapshot") } -func init() { - // register a reexec function to start a devp2p node when the current - // binary is executed as "p2p-node" - reexec.Register("p2p-node", execP2PNode) -} - // execNodeConfig is used to serialize the node configuration so it can be // passed to the child process as a JSON encoded environment variable type execNodeConfig struct { @@ -333,55 +358,76 @@ type execNodeConfig struct { PeerAddrs map[string]string `json:"peer_addrs,omitempty"` } -// ExternalIP gets an external IP address so that Enode URL is usable -func ExternalIP() net.IP { - addrs, err := net.InterfaceAddrs() - if err != nil { - log.Crit("error getting IP address", "err", err) - } - for _, addr := range addrs { - if ip, ok := addr.(*net.IPNet); ok && !ip.IP.IsLoopback() && !ip.IP.IsLinkLocalUnicast() { - return ip.IP - } - } - log.Warn("unable to determine explicit IP address, falling back to loopback") - return net.IP{127, 0, 0, 1} -} - -// execP2PNode starts a devp2p node when the current binary is executed with +// execP2PNode starts a simulation node when the current binary is executed with // argv[0] being "p2p-node", reading the service / ID from argv[1] / argv[2] -// and the node config from the _P2P_NODE_CONFIG environment variable +// and the node config from an environment variable. func execP2PNode() { glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.LogfmtFormat())) glogger.Verbosity(log.LvlInfo) log.Root().SetHandler(glogger) + statusURL := os.Getenv(envStatusURL) + if statusURL == "" { + log.Crit("missing " + envStatusURL) + } + + // Start the node and gather startup report. + var status nodeStartupJSON + stack, stackErr := startExecNodeStack() + if stackErr != nil { + status.Err = stackErr.Error() + } else { + status.WSEndpoint = "ws://" + stack.WSEndpoint() + status.NodeInfo = stack.Server().NodeInfo() + } + + // Send status to the host. + statusJSON, _ := json.Marshal(status) + if _, err := http.Post(statusURL, "application/json", bytes.NewReader(statusJSON)); err != nil { + log.Crit("Can't post startup info", "url", statusURL, "err", err) + } + if stackErr != nil { + os.Exit(1) + } + // Stop the stack if we get a SIGTERM signal. + go func() { + sigc := make(chan os.Signal, 1) + signal.Notify(sigc, syscall.SIGTERM) + defer signal.Stop(sigc) + <-sigc + log.Info("Received SIGTERM, shutting down...") + stack.Stop() + }() + stack.Wait() // Wait for the stack to exit. +} + +func startExecNodeStack() (*node.Node, error) { // read the services from argv serviceNames := strings.Split(os.Args[1], ",") // decode the config - confEnv := os.Getenv("_P2P_NODE_CONFIG") + confEnv := os.Getenv(envNodeConfig) if confEnv == "" { - log.Crit("missing _P2P_NODE_CONFIG") + return nil, fmt.Errorf("missing " + envNodeConfig) } var conf execNodeConfig if err := json.Unmarshal([]byte(confEnv), &conf); err != nil { - log.Crit("error decoding _P2P_NODE_CONFIG", "err", err) + return nil, fmt.Errorf("error decoding %s: %v", envNodeConfig, err) } - conf.Stack.P2P.PrivateKey = conf.Node.PrivateKey - conf.Stack.Logger = log.New("node.id", conf.Node.ID.String()) - if strings.HasPrefix(conf.Stack.P2P.ListenAddr, ":") { - conf.Stack.P2P.ListenAddr = ExternalIP().String() + conf.Stack.P2P.ListenAddr - } - if conf.Stack.WSHost == "0.0.0.0" { - conf.Stack.WSHost = ExternalIP().String() + // create enode record + nodeTcpConn, _ := net.ResolveTCPAddr("tcp", conf.Stack.P2P.ListenAddr) + if nodeTcpConn.IP == nil { + nodeTcpConn.IP = net.IPv4(127, 0, 0, 1) } + conf.Node.initEnode(nodeTcpConn.IP, nodeTcpConn.Port, nodeTcpConn.Port) + conf.Stack.P2P.PrivateKey = conf.Node.PrivateKey + conf.Stack.Logger = log.New("node.id", conf.Node.ID.String()) // initialize the devp2p stack stack, err := node.New(&conf.Stack) if err != nil { - log.Crit("error creating node stack", "err", err) + return nil, fmt.Errorf("error creating node stack: %v", err) } // register the services, collecting them into a map so we can wrap @@ -390,7 +436,7 @@ func execP2PNode() { for _, name := range serviceNames { serviceFunc, exists := serviceFuncs[name] if !exists { - log.Crit("unknown node service", "name", name) + return nil, fmt.Errorf("unknown node service %q", err) } constructor := func(nodeCtx *node.ServiceContext) (node.Service, error) { ctx := &ServiceContext{ @@ -409,34 +455,35 @@ func execP2PNode() { return service, nil } if err := stack.Register(constructor); err != nil { - log.Crit("error starting service", "name", name, "err", err) + return stack, fmt.Errorf("error registering service %q: %v", name, err) } } // register the snapshot service - if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { + err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return &snapshotService{services}, nil - }); err != nil { - log.Crit("error starting snapshot service", "err", err) + }) + if err != nil { + return stack, fmt.Errorf("error starting snapshot service: %v", err) } // start the stack - if err := stack.Start(); err != nil { - log.Crit("error stating node stack", "err", err) + if err = stack.Start(); err != nil { + err = fmt.Errorf("error starting stack: %v", err) } + return stack, err +} - // stop the stack if we get a SIGTERM signal - go func() { - sigc := make(chan os.Signal, 1) - signal.Notify(sigc, syscall.SIGTERM) - defer signal.Stop(sigc) - <-sigc - log.Info("Received SIGTERM, shutting down...") - stack.Stop() - }() +const ( + envStatusURL = "_P2P_STATUS_URL" + envNodeConfig = "_P2P_NODE_CONFIG" +) - // wait for the stack to exit - stack.Wait() +// nodeStartupJSON is sent to the simulation host after startup. +type nodeStartupJSON struct { + Err string + WSEndpoint string + NodeInfo *p2p.NodeInfo } // snapshotService is a node.Service which wraps a list of services and diff --git a/p2p/simulations/adapters/inproc.go b/p2p/simulations/adapters/inproc.go index 52a662be63a3..c1cf23a175c6 100644 --- a/p2p/simulations/adapters/inproc.go +++ b/p2p/simulations/adapters/inproc.go @@ -71,8 +71,13 @@ func (s *SimAdapter) NewNode(config *NodeConfig) (Node, error) { s.mtx.Lock() defer s.mtx.Unlock() - // check a node with the ID doesn't already exist id := config.ID + // verify that the node has a private key in the config + if config.PrivateKey == nil { + return nil, fmt.Errorf("node is missing private key: %s", id) + } + + // check a node with the ID doesn't already exist if _, exists := s.nodes[id]; exists { return nil, fmt.Errorf("node already exists: %s", id) } @@ -87,6 +92,11 @@ func (s *SimAdapter) NewNode(config *NodeConfig) (Node, error) { } } + err := config.initDummyEnode() + if err != nil { + return nil, err + } + n, err := node.New(&node.Config{ P2P: p2p.Config{ PrivateKey: config.PrivateKey, @@ -130,7 +140,7 @@ func (s *SimAdapter) Dial(dest *enode.Node) (conn net.Conn, err error) { return nil, err } // this is simulated 'listening' - // asynchronously call the dialed destintion node's p2p server + // asynchronously call the dialed destination node's p2p server // to set up connection on the 'listening' side go srv.SetupConn(pipe1, 0, nil) return pipe2, nil @@ -172,6 +182,12 @@ type SimNode struct { registerOnce sync.Once } +// Close closes the underlaying node.Node to release +// acquired resources. +func (sn *SimNode) Close() error { + return sn.node.Close() +} + // Addr returns the node's discovery address func (sn *SimNode) Addr() []byte { return []byte(sn.Node().String()) @@ -351,17 +367,3 @@ func (sn *SimNode) NodeInfo() *p2p.NodeInfo { } return server.NodeInfo() } - -func setSocketBuffer(conn net.Conn, socketReadBuffer int, socketWriteBuffer int) error { - if v, ok := conn.(*net.UnixConn); ok { - err := v.SetReadBuffer(socketReadBuffer) - if err != nil { - return err - } - err = v.SetWriteBuffer(socketWriteBuffer) - if err != nil { - return err - } - } - return nil -} diff --git a/p2p/simulations/adapters/inproc_test.go b/p2p/simulations/adapters/inproc_test.go index e1e092f6e14d..bd2c70b05ecc 100644 --- a/p2p/simulations/adapters/inproc_test.go +++ b/p2p/simulations/adapters/inproc_test.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify diff --git a/p2p/simulations/adapters/types.go b/p2p/simulations/adapters/types.go index 6681726e40b6..f65ce7b6050f 100644 --- a/p2p/simulations/adapters/types.go +++ b/p2p/simulations/adapters/types.go @@ -27,9 +27,11 @@ import ( "github.com/docker/docker/pkg/reexec" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/rpc" ) @@ -90,12 +92,21 @@ type NodeConfig struct { // Name is a human friendly name for the node like "node01" Name string + // Use an existing database instead of a temporary one if non-empty + DataDir string + // Services are the names of the services which should be run when // starting the node (for SimNodes it should be the names of services // contained in SimAdapter.services, for other nodes it should be // services registered by calling the RegisterService function) Services []string + // Enode + node *enode.Node + + // ENR Record with entries to overwrite + Record enr.Record + // function to sanction or prevent suggesting a peer Reachable func(id enode.ID) bool @@ -165,26 +176,27 @@ func (n *NodeConfig) UnmarshalJSON(data []byte) error { // Node returns the node descriptor represented by the config. func (n *NodeConfig) Node() *enode.Node { - return enode.NewV4(&n.PrivateKey.PublicKey, net.IP{127, 0, 0, 1}, int(n.Port), int(n.Port)) + return n.node } // RandomNodeConfig returns node configuration with a randomly generated ID and // PrivateKey func RandomNodeConfig() *NodeConfig { - key, err := crypto.GenerateKey() + prvkey, err := crypto.GenerateKey() if err != nil { panic("unable to generate key") } - id := enode.PubkeyToIDV4(&key.PublicKey) port, err := assignTCPPort() if err != nil { panic("unable to assign tcp port") } + + enodId := enode.PubkeyToIDV4(&prvkey.PublicKey) return &NodeConfig{ - ID: id, - Name: fmt.Sprintf("node_%s", id.String()), - PrivateKey: key, + PrivateKey: prvkey, + ID: enodId, + Name: fmt.Sprintf("node_%s", enodId.String()), Port: port, EnableMsgEvents: true, } @@ -254,3 +266,30 @@ func RegisterServices(services Services) { os.Exit(0) } } + +// adds the host part to the configuration's ENR, signs it +// creates and the corresponding enode object to the configuration +func (n *NodeConfig) initEnode(ip net.IP, tcpport int, udpport int) error { + enrIp := enr.IP(ip) + n.Record.Set(&enrIp) + enrTcpPort := enr.TCP(tcpport) + n.Record.Set(&enrTcpPort) + enrUdpPort := enr.UDP(udpport) + n.Record.Set(&enrUdpPort) + + err := enode.SignV4(&n.Record, n.PrivateKey) + if err != nil { + return fmt.Errorf("unable to generate ENR: %v", err) + } + nod, err := enode.New(enode.V4ID{}, &n.Record) + if err != nil { + return fmt.Errorf("unable to create enode: %v", err) + } + log.Trace("simnode new", "record", n.Record) + n.node = nod + return nil +} + +func (n *NodeConfig) initDummyEnode() error { + return n.initEnode(net.IPv4(127, 0, 0, 1), 0, 0) +} diff --git a/p2p/simulations/adapters/ws.go b/p2p/simulations/adapters/ws.go deleted file mode 100644 index 979a21709e49..000000000000 --- a/p2p/simulations/adapters/ws.go +++ /dev/null @@ -1,51 +0,0 @@ -package adapters - -import ( - "bufio" - "errors" - "io" - "regexp" - "strings" - "time" -) - -// wsAddrPattern is a regex used to read the WebSocket address from the node's -// log -var wsAddrPattern = regexp.MustCompile(`ws://[\d.:]+`) - -func matchWSAddr(str string) (string, bool) { - if !strings.Contains(str, "WebSocket endpoint opened") { - return "", false - } - - return wsAddrPattern.FindString(str), true -} - -// findWSAddr scans through reader r, looking for the log entry with -// WebSocket address information. -func findWSAddr(r io.Reader, timeout time.Duration) (string, error) { - ch := make(chan string) - - go func() { - s := bufio.NewScanner(r) - for s.Scan() { - addr, ok := matchWSAddr(s.Text()) - if ok { - ch <- addr - } - } - close(ch) - }() - - var wsAddr string - select { - case wsAddr = <-ch: - if wsAddr == "" { - return "", errors.New("empty result") - } - case <-time.After(timeout): - return "", errors.New("timed out") - } - - return wsAddr, nil -} diff --git a/p2p/simulations/adapters/ws_test.go b/p2p/simulations/adapters/ws_test.go deleted file mode 100644 index 0bb9ed2b2b0d..000000000000 --- a/p2p/simulations/adapters/ws_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package adapters - -import ( - "bytes" - "testing" - "time" -) - -func TestFindWSAddr(t *testing.T) { - line := `t=2018-05-02T19:00:45+0200 lvl=info msg="WebSocket endpoint opened" node.id=26c65a606d1125a44695bc08573190d047152b6b9a776ccbbe593e90f91444d9c1ebdadac6a775ad9fdd0923468a1d698ed3a842c1fb89c1bc0f9d4801f8c39c url=ws://127.0.0.1:59975` - buf := bytes.NewBufferString(line) - got, err := findWSAddr(buf, 10*time.Second) - if err != nil { - t.Fatalf("Failed to find addr: %v", err) - } - expected := `ws://127.0.0.1:59975` - - if got != expected { - t.Fatalf("Expected to get '%s', but got '%s'", expected, got) - } -} diff --git a/p2p/simulations/connect.go b/p2p/simulations/connect.go new file mode 100644 index 000000000000..ede96b34c133 --- /dev/null +++ b/p2p/simulations/connect.go @@ -0,0 +1,153 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package simulations + +import ( + "errors" + "strings" + + "github.com/ethereum/go-ethereum/p2p/enode" +) + +var ( + ErrNodeNotFound = errors.New("node not found") +) + +// ConnectToLastNode connects the node with provided NodeID +// to the last node that is up, and avoiding connection to self. +// It is useful when constructing a chain network topology +// when Network adds and removes nodes dynamically. +func (net *Network) ConnectToLastNode(id enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + + ids := net.getUpNodeIDs() + l := len(ids) + if l < 2 { + return nil + } + last := ids[l-1] + if last == id { + last = ids[l-2] + } + return net.connectNotConnected(last, id) +} + +// ConnectToRandomNode connects the node with provided NodeID +// to a random node that is up. +func (net *Network) ConnectToRandomNode(id enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + + selected := net.getRandomUpNode(id) + if selected == nil { + return ErrNodeNotFound + } + return net.connectNotConnected(selected.ID(), id) +} + +// ConnectNodesFull connects all nodes one to another. +// It provides a complete connectivity in the network +// which should be rarely needed. +func (net *Network) ConnectNodesFull(ids []enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + + if ids == nil { + ids = net.getUpNodeIDs() + } + for i, lid := range ids { + for _, rid := range ids[i+1:] { + if err = net.connectNotConnected(lid, rid); err != nil { + return err + } + } + } + return nil +} + +// ConnectNodesChain connects all nodes in a chain topology. +// If ids argument is nil, all nodes that are up will be connected. +func (net *Network) ConnectNodesChain(ids []enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + + return net.connectNodesChain(ids) +} + +func (net *Network) connectNodesChain(ids []enode.ID) (err error) { + if ids == nil { + ids = net.getUpNodeIDs() + } + l := len(ids) + for i := 0; i < l-1; i++ { + if err := net.connectNotConnected(ids[i], ids[i+1]); err != nil { + return err + } + } + return nil +} + +// ConnectNodesRing connects all nodes in a ring topology. +// If ids argument is nil, all nodes that are up will be connected. +func (net *Network) ConnectNodesRing(ids []enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + + if ids == nil { + ids = net.getUpNodeIDs() + } + l := len(ids) + if l < 2 { + return nil + } + if err := net.connectNodesChain(ids); err != nil { + return err + } + return net.connectNotConnected(ids[l-1], ids[0]) +} + +// ConnectNodesStar connects all nodes into a star topology +// If ids argument is nil, all nodes that are up will be connected. +func (net *Network) ConnectNodesStar(ids []enode.ID, center enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + + if ids == nil { + ids = net.getUpNodeIDs() + } + for _, id := range ids { + if center == id { + continue + } + if err := net.connectNotConnected(center, id); err != nil { + return err + } + } + return nil +} + +func (net *Network) connectNotConnected(oneID, otherID enode.ID) error { + return ignoreAlreadyConnectedErr(net.connect(oneID, otherID)) +} + +func ignoreAlreadyConnectedErr(err error) error { + if err == nil || strings.Contains(err.Error(), "already connected") { + return nil + } + return err +} diff --git a/p2p/simulations/connect_test.go b/p2p/simulations/connect_test.go new file mode 100644 index 000000000000..32d18347d83a --- /dev/null +++ b/p2p/simulations/connect_test.go @@ -0,0 +1,172 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package simulations + +import ( + "testing" + + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" +) + +func newTestNetwork(t *testing.T, nodeCount int) (*Network, []enode.ID) { + t.Helper() + adapter := adapters.NewSimAdapter(adapters.Services{ + "noopwoop": func(ctx *adapters.ServiceContext) (node.Service, error) { + return NewNoopService(nil), nil + }, + }) + + // create network + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "noopwoop", + }) + + // create and start nodes + ids := make([]enode.ID, nodeCount) + for i := range ids { + conf := adapters.RandomNodeConfig() + node, err := network.NewNodeWithConfig(conf) + if err != nil { + t.Fatalf("error creating node: %s", err) + } + if err := network.Start(node.ID()); err != nil { + t.Fatalf("error starting node: %s", err) + } + ids[i] = node.ID() + } + + if len(network.Conns) > 0 { + t.Fatal("no connections should exist after just adding nodes") + } + + return network, ids +} + +func TestConnectToLastNode(t *testing.T) { + net, ids := newTestNetwork(t, 10) + defer net.Shutdown() + + first := ids[0] + if err := net.ConnectToLastNode(first); err != nil { + t.Fatal(err) + } + + last := ids[len(ids)-1] + for i, id := range ids { + if id == first || id == last { + continue + } + + if net.GetConn(first, id) != nil { + t.Errorf("connection must not exist with node(ind: %v, id: %v)", i, id) + } + } + + if net.GetConn(first, last) == nil { + t.Error("first and last node must be connected") + } +} + +func TestConnectToRandomNode(t *testing.T) { + net, ids := newTestNetwork(t, 10) + defer net.Shutdown() + + err := net.ConnectToRandomNode(ids[0]) + if err != nil { + t.Fatal(err) + } + + var cc int + for i, a := range ids { + for _, b := range ids[i:] { + if net.GetConn(a, b) != nil { + cc++ + } + } + } + + if cc != 1 { + t.Errorf("expected one connection, got %v", cc) + } +} + +func TestConnectNodesFull(t *testing.T) { + tests := []struct { + name string + nodeCount int + }{ + {name: "no node", nodeCount: 0}, + {name: "single node", nodeCount: 1}, + {name: "2 nodes", nodeCount: 2}, + {name: "3 nodes", nodeCount: 3}, + {name: "even number of nodes", nodeCount: 12}, + {name: "odd number of nodes", nodeCount: 13}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + net, ids := newTestNetwork(t, test.nodeCount) + defer net.Shutdown() + + err := net.ConnectNodesFull(ids) + if err != nil { + t.Fatal(err) + } + + VerifyFull(t, net, ids) + }) + } +} + +func TestConnectNodesChain(t *testing.T) { + net, ids := newTestNetwork(t, 10) + defer net.Shutdown() + + err := net.ConnectNodesChain(ids) + if err != nil { + t.Fatal(err) + } + + VerifyChain(t, net, ids) +} + +func TestConnectNodesRing(t *testing.T) { + net, ids := newTestNetwork(t, 10) + defer net.Shutdown() + + err := net.ConnectNodesRing(ids) + if err != nil { + t.Fatal(err) + } + + VerifyRing(t, net, ids) +} + +func TestConnectNodesStar(t *testing.T) { + net, ids := newTestNetwork(t, 10) + defer net.Shutdown() + + pivotIndex := 2 + + err := net.ConnectNodesStar(ids, ids[pivotIndex]) + if err != nil { + t.Fatal(err) + } + + VerifyStar(t, net, ids, pivotIndex) +} diff --git a/p2p/simulations/events.go b/p2p/simulations/events.go index f17958c6898a..984c2e088f11 100644 --- a/p2p/simulations/events.go +++ b/p2p/simulations/events.go @@ -58,6 +58,9 @@ type Event struct { // Msg is set if the type is EventTypeMsg Msg *Msg `json:"msg,omitempty"` + + //Optionally provide data (currently for simulation frontends only) + Data interface{} `json:"data"` } // NewEvent creates a new event for the given object which should be either a @@ -97,7 +100,7 @@ func ControlEvent(v interface{}) *Event { func (e *Event) String() string { switch e.Type { case EventTypeNode: - return fmt.Sprintf(" id: %s up: %t", e.Node.ID().TerminalString(), e.Node.Up) + return fmt.Sprintf(" id: %s up: %t", e.Node.ID().TerminalString(), e.Node.Up()) case EventTypeConn: return fmt.Sprintf(" nodes: %s->%s up: %t", e.Conn.One.TerminalString(), e.Conn.Other.TerminalString(), e.Conn.Up) case EventTypeMsg: diff --git a/p2p/simulations/examples/ping-pong.go b/p2p/simulations/examples/ping-pong.go index 597cc950c979..cde2f3a677e2 100644 --- a/p2p/simulations/examples/ping-pong.go +++ b/p2p/simulations/examples/ping-pong.go @@ -70,14 +70,6 @@ func main() { log.Info("using exec adapter", "tmpdir", tmpdir) adapter = adapters.NewExecAdapter(tmpdir) - case "docker": - log.Info("using docker adapter") - var err error - adapter, err = adapters.NewDockerAdapter() - if err != nil { - log.Crit("error creating docker adapter", "err", err) - } - default: log.Crit(fmt.Sprintf("unknown node adapter %q", *adapterType)) } diff --git a/p2p/simulations/http_test.go b/p2p/simulations/http_test.go index 7bdbad1b531a..ed43c0ed76a2 100644 --- a/p2p/simulations/http_test.go +++ b/p2p/simulations/http_test.go @@ -18,6 +18,7 @@ package simulations import ( "context" + "flag" "fmt" "math/rand" "net/http/httptest" @@ -28,13 +29,26 @@ import ( "time" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/simulations/adapters" "github.com/ethereum/go-ethereum/rpc" + "github.com/mattn/go-colorable" ) +var ( + loglevel = flag.Int("loglevel", 2, "verbosity of logs") +) + +func init() { + flag.Parse() + + log.PrintOrigins(true) + log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) +} + // testService implements the node.Service interface and provides protocols // and APIs which are useful for testing nodes in a simulation network type testService struct { @@ -280,6 +294,7 @@ var testServices = adapters.Services{ } func testHTTPServer(t *testing.T) (*Network, *httptest.Server) { + t.Helper() adapter := adapters.NewSimAdapter(testServices) network := NewNetwork(adapter, &NetworkConfig{ DefaultService: "test", @@ -406,14 +421,15 @@ type expectEvents struct { } func (t *expectEvents) nodeEvent(id string, up bool) *Event { + node := Node{ + Config: &adapters.NodeConfig{ + ID: enode.HexID(id), + }, + up: up, + } return &Event{ Type: EventTypeNode, - Node: &Node{ - Config: &adapters.NodeConfig{ - ID: enode.HexID(id), - }, - Up: up, - }, + Node: &node, } } @@ -465,6 +481,7 @@ loop: } func (t *expectEvents) expect(events ...*Event) { + t.Helper() timeout := time.After(10 * time.Second) i := 0 for { @@ -486,8 +503,8 @@ func (t *expectEvents) expect(events ...*Event) { if event.Node.ID() != expected.Node.ID() { t.Fatalf("expected node event %d to have id %q, got %q", i, expected.Node.ID().TerminalString(), event.Node.ID().TerminalString()) } - if event.Node.Up != expected.Node.Up { - t.Fatalf("expected node event %d to have up=%t, got up=%t", i, expected.Node.Up, event.Node.Up) + if event.Node.Up() != expected.Node.Up() { + t.Fatalf("expected node event %d to have up=%t, got up=%t", i, expected.Node.Up(), event.Node.Up()) } case EventTypeConn: @@ -584,9 +601,26 @@ func TestHTTPNodeRPC(t *testing.T) { // TestHTTPSnapshot tests creating and loading network snapshots func TestHTTPSnapshot(t *testing.T) { // start the server - _, s := testHTTPServer(t) + network, s := testHTTPServer(t) defer s.Close() + var eventsDone = make(chan struct{}) + count := 1 + eventsDoneChan := make(chan *Event) + eventSub := network.Events().Subscribe(eventsDoneChan) + go func() { + defer eventSub.Unsubscribe() + for event := range eventsDoneChan { + if event.Type == EventTypeConn && !event.Control { + count-- + if count == 0 { + eventsDone <- struct{}{} + return + } + } + } + }() + // create a two-node network client := NewClient(s.URL) nodeCount := 2 @@ -620,7 +654,7 @@ func TestHTTPSnapshot(t *testing.T) { } states[i] = state } - + <-eventsDone // create a snapshot snap, err := client.CreateSnapshot() if err != nil { @@ -634,9 +668,23 @@ func TestHTTPSnapshot(t *testing.T) { } // create another network - _, s = testHTTPServer(t) + network2, s := testHTTPServer(t) defer s.Close() client = NewClient(s.URL) + count = 1 + eventSub = network2.Events().Subscribe(eventsDoneChan) + go func() { + defer eventSub.Unsubscribe() + for event := range eventsDoneChan { + if event.Type == EventTypeConn && !event.Control { + count-- + if count == 0 { + eventsDone <- struct{}{} + return + } + } + } + }() // subscribe to events so we can check them later events := make(chan *Event, 100) @@ -651,6 +699,7 @@ func TestHTTPSnapshot(t *testing.T) { if err := client.LoadSnapshot(snap); err != nil { t.Fatalf("error loading snapshot: %s", err) } + <-eventsDone // check the nodes and connection exists net, err := client.GetNetwork() @@ -676,6 +725,9 @@ func TestHTTPSnapshot(t *testing.T) { if conn.Other.String() != nodes[1].ID { t.Fatalf("expected connection to have other=%q, got other=%q", nodes[1].ID, conn.Other) } + if !conn.Up { + t.Fatal("should be up") + } // check the node states were restored for i, node := range nodes { diff --git a/p2p/simulations/mocker_test.go b/p2p/simulations/mocker_test.go index 7c7016a5e6d2..069040257ed0 100644 --- a/p2p/simulations/mocker_test.go +++ b/p2p/simulations/mocker_test.go @@ -15,7 +15,7 @@ // along with the go-ethereum library. If not, see . // Package simulations simulates p2p networks. -// A mokcer simulates starting and stopping real nodes in a network. +// A mocker simulates starting and stopping real nodes in a network. package simulations import ( @@ -90,15 +90,12 @@ func TestMocker(t *testing.T) { for { select { case event := <-events: - //if the event is a node Up event only - if event.Node != nil && event.Node.Up { + if isNodeUp(event) { //add the correspondent node ID to the map nodemap[event.Node.Config.ID] = true //this means all nodes got a nodeUp event, so we can continue the test if len(nodemap) == nodeCount { nodesComplete = true - //wait for 3s as the mocker will need time to connect the nodes - //time.Sleep( 3 *time.Second) } } else if event.Conn != nil && nodesComplete { connCount += 1 @@ -135,13 +132,13 @@ func TestMocker(t *testing.T) { wg.Wait() //check there are nodeCount number of nodes in the network - nodes_info, err := client.GetNodes() + nodesInfo, err := client.GetNodes() if err != nil { t.Fatalf("Could not get nodes list: %s", err) } - if len(nodes_info) != nodeCount { - t.Fatalf("Expected %d number of nodes, got: %d", nodeCount, len(nodes_info)) + if len(nodesInfo) != nodeCount { + t.Fatalf("Expected %d number of nodes, got: %d", nodeCount, len(nodesInfo)) } //stop the mocker @@ -160,12 +157,16 @@ func TestMocker(t *testing.T) { } //now the number of nodes in the network should be zero - nodes_info, err = client.GetNodes() + nodesInfo, err = client.GetNodes() if err != nil { t.Fatalf("Could not get nodes list: %s", err) } - if len(nodes_info) != 0 { - t.Fatalf("Expected empty list of nodes, got: %d", len(nodes_info)) + if len(nodesInfo) != 0 { + t.Fatalf("Expected empty list of nodes, got: %d", len(nodesInfo)) } } + +func isNodeUp(event *Event) bool { + return event.Node != nil && event.Node.Up() +} diff --git a/p2p/simulations/network.go b/p2p/simulations/network.go index 101ac09f85ec..f03c953e8953 100644 --- a/p2p/simulations/network.go +++ b/p2p/simulations/network.go @@ -20,7 +20,10 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" + "io" + "math/rand" "sync" "time" @@ -116,7 +119,7 @@ func (net *Network) NewNodeWithConfig(conf *adapters.NodeConfig) (*Node, error) Node: adapterNode, Config: conf, } - log.Trace(fmt.Sprintf("node %v created", conf.ID)) + log.Trace("Node created", "id", conf.ID) net.nodeMap[conf.ID] = len(net.Nodes) net.Nodes = append(net.Nodes, node) @@ -134,7 +137,7 @@ func (net *Network) Config() *NetworkConfig { // StartAll starts all nodes in the network func (net *Network) StartAll() error { for _, node := range net.Nodes { - if node.Up { + if node.Up() { continue } if err := net.Start(node.ID()); err != nil { @@ -147,7 +150,7 @@ func (net *Network) StartAll() error { // StopAll stops all nodes in the network func (net *Network) StopAll() error { for _, node := range net.Nodes { - if !node.Up { + if !node.Up() { continue } if err := net.Stop(node.ID()); err != nil { @@ -167,22 +170,23 @@ func (net *Network) Start(id enode.ID) error { func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) error { net.lock.Lock() defer net.lock.Unlock() + node := net.getNode(id) if node == nil { return fmt.Errorf("node %v does not exist", id) } - if node.Up { + if node.Up() { return fmt.Errorf("node %v already up", id) } - log.Trace(fmt.Sprintf("starting node %v: %v using %v", id, node.Up, net.nodeAdapter.Name())) + log.Trace("Starting node", "id", id, "adapter", net.nodeAdapter.Name()) if err := node.Start(snapshots); err != nil { - log.Warn(fmt.Sprintf("start up failed: %v", err)) + log.Warn("Node startup failed", "id", id, "err", err) return err } - node.Up = true - log.Info(fmt.Sprintf("started node %v: %v", id, node.Up)) - - net.events.Send(NewEvent(node)) + node.SetUp(true) + log.Info("Started node", "id", id) + ev := NewEvent(node) + net.events.Send(ev) // subscribe to peer events client, err := node.Client() @@ -207,13 +211,14 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub // assume the node is now down net.lock.Lock() defer net.lock.Unlock() + node := net.getNode(id) if node == nil { - log.Error("Can not find node for id", "id", id) return } - node.Up = false - net.events.Send(NewEvent(node)) + node.SetUp(false) + ev := NewEvent(node) + net.events.Send(ev) }() for { select { @@ -240,7 +245,7 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub case err := <-sub.Err(): if err != nil { - log.Error(fmt.Sprintf("error getting peer events for node %v", id), "err", err) + log.Error("Error in peer event subscription", "id", id, "err", err) } return } @@ -249,30 +254,57 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub // Stop stops the node with the given ID func (net *Network) Stop(id enode.ID) error { + // IMPORTANT: node.Stop() must NOT be called under net.lock as + // node.Reachable() closure has a reference to the network and + // calls net.InitConn() what also locks the network. => DEADLOCK + // That holds until the following ticket is not resolved: + + var err error + + node, err := func() (*Node, error) { + net.lock.Lock() + defer net.lock.Unlock() + + node := net.getNode(id) + if node == nil { + return nil, fmt.Errorf("node %v does not exist", id) + } + if !node.Up() { + return nil, fmt.Errorf("node %v already down", id) + } + node.SetUp(false) + return node, nil + }() + if err != nil { + return err + } + + err = node.Stop() // must be called without net.lock + net.lock.Lock() defer net.lock.Unlock() - node := net.getNode(id) - if node == nil { - return fmt.Errorf("node %v does not exist", id) - } - if !node.Up { - return fmt.Errorf("node %v already down", id) - } - if err := node.Stop(); err != nil { + + if err != nil { + node.SetUp(true) return err } - node.Up = false - log.Info(fmt.Sprintf("stop node %v: %v", id, node.Up)) - - net.events.Send(ControlEvent(node)) + log.Info("Stopped node", "id", id, "err", err) + ev := ControlEvent(node) + net.events.Send(ev) return nil } // Connect connects two nodes together by calling the "admin_addPeer" RPC // method on the "one" node so that it connects to the "other" node func (net *Network) Connect(oneID, otherID enode.ID) error { - log.Debug(fmt.Sprintf("connecting %s to %s", oneID, otherID)) - conn, err := net.InitConn(oneID, otherID) + net.lock.Lock() + defer net.lock.Unlock() + return net.connect(oneID, otherID) +} + +func (net *Network) connect(oneID, otherID enode.ID) error { + log.Debug("Connecting nodes with addPeer", "id", oneID, "other", otherID) + conn, err := net.initConn(oneID, otherID) if err != nil { return err } @@ -365,50 +397,115 @@ func (net *Network) DidReceive(sender, receiver enode.ID, proto string, code uin // GetNode gets the node with the given ID, returning nil if the node does not // exist func (net *Network) GetNode(id enode.ID) *Node { - net.lock.Lock() - defer net.lock.Unlock() + net.lock.RLock() + defer net.lock.RUnlock() return net.getNode(id) } +func (net *Network) getNode(id enode.ID) *Node { + i, found := net.nodeMap[id] + if !found { + return nil + } + return net.Nodes[i] +} + // GetNode gets the node with the given name, returning nil if the node does // not exist func (net *Network) GetNodeByName(name string) *Node { - net.lock.Lock() - defer net.lock.Unlock() + net.lock.RLock() + defer net.lock.RUnlock() return net.getNodeByName(name) } +func (net *Network) getNodeByName(name string) *Node { + for _, node := range net.Nodes { + if node.Config.Name == name { + return node + } + } + return nil +} + // GetNodes returns the existing nodes func (net *Network) GetNodes() (nodes []*Node) { - net.lock.Lock() - defer net.lock.Unlock() + net.lock.RLock() + defer net.lock.RUnlock() + return net.getNodes() +} + +func (net *Network) getNodes() (nodes []*Node) { nodes = append(nodes, net.Nodes...) return nodes } -func (net *Network) getNode(id enode.ID) *Node { - i, found := net.nodeMap[id] - if !found { +// GetRandomUpNode returns a random node on the network, which is running. +func (net *Network) GetRandomUpNode(excludeIDs ...enode.ID) *Node { + net.lock.RLock() + defer net.lock.RUnlock() + return net.getRandomUpNode(excludeIDs...) +} + +// GetRandomUpNode returns a random node on the network, which is running. +func (net *Network) getRandomUpNode(excludeIDs ...enode.ID) *Node { + return net.getRandomNode(net.getUpNodeIDs(), excludeIDs) +} + +func (net *Network) getUpNodeIDs() (ids []enode.ID) { + for _, node := range net.Nodes { + if node.Up() { + ids = append(ids, node.ID()) + } + } + return ids +} + +// GetRandomDownNode returns a random node on the network, which is stopped. +func (net *Network) GetRandomDownNode(excludeIDs ...enode.ID) *Node { + net.lock.RLock() + defer net.lock.RUnlock() + return net.getRandomNode(net.getDownNodeIDs(), excludeIDs) +} + +func (net *Network) getDownNodeIDs() (ids []enode.ID) { + for _, node := range net.getNodes() { + if !node.Up() { + ids = append(ids, node.ID()) + } + } + return ids +} + +func (net *Network) getRandomNode(ids []enode.ID, excludeIDs []enode.ID) *Node { + filtered := filterIDs(ids, excludeIDs) + + l := len(filtered) + if l == 0 { return nil } - return net.Nodes[i] + return net.getNode(filtered[rand.Intn(l)]) } -func (net *Network) getNodeByName(name string) *Node { - for _, node := range net.Nodes { - if node.Config.Name == name { - return node +func filterIDs(ids []enode.ID, excludeIDs []enode.ID) []enode.ID { + exclude := make(map[enode.ID]bool) + for _, id := range excludeIDs { + exclude[id] = true + } + var filtered []enode.ID + for _, id := range ids { + if _, found := exclude[id]; !found { + filtered = append(filtered, id) } } - return nil + return filtered } // GetConn returns the connection which exists between "one" and "other" // regardless of which node initiated the connection func (net *Network) GetConn(oneID, otherID enode.ID) *Conn { - net.lock.Lock() - defer net.lock.Unlock() + net.lock.RLock() + defer net.lock.RUnlock() return net.getConn(oneID, otherID) } @@ -454,7 +551,7 @@ func (net *Network) getConn(oneID, otherID enode.ID) *Conn { return net.Conns[i] } -// InitConn(one, other) retrieves the connectiton model for the connection between +// InitConn(one, other) retrieves the connection model for the connection between // peers one and other, or creates a new one if it does not exist // the order of nodes does not matter, i.e., Conn(i,j) == Conn(j, i) // it checks if the connection is already up, and if the nodes are running @@ -465,6 +562,10 @@ func (net *Network) getConn(oneID, otherID enode.ID) *Conn { func (net *Network) InitConn(oneID, otherID enode.ID) (*Conn, error) { net.lock.Lock() defer net.lock.Unlock() + return net.initConn(oneID, otherID) +} + +func (net *Network) initConn(oneID, otherID enode.ID) (*Conn, error) { if oneID == otherID { return nil, fmt.Errorf("refusing to connect to self %v", oneID) } @@ -481,10 +582,10 @@ func (net *Network) InitConn(oneID, otherID enode.ID) (*Conn, error) { err = conn.nodesUp() if err != nil { - log.Trace(fmt.Sprintf("nodes not up: %v", err)) + log.Trace("Nodes not up", "err", err) return nil, fmt.Errorf("nodes not up: %v", err) } - log.Debug("InitConn - connection initiated") + log.Debug("Connection initiated", "id", oneID, "other", otherID) conn.initiated = time.Now() return conn, nil } @@ -492,16 +593,22 @@ func (net *Network) InitConn(oneID, otherID enode.ID) (*Conn, error) { // Shutdown stops all nodes in the network and closes the quit channel func (net *Network) Shutdown() { for _, node := range net.Nodes { - log.Debug(fmt.Sprintf("stopping node %s", node.ID().TerminalString())) + log.Debug("Stopping node", "id", node.ID()) if err := node.Stop(); err != nil { - log.Warn(fmt.Sprintf("error stopping node %s", node.ID().TerminalString()), "err", err) + log.Warn("Can't stop node", "id", node.ID(), "err", err) + } + // If the node has the close method, call it. + if closer, ok := node.Node.(io.Closer); ok { + if err := closer.Close(); err != nil { + log.Warn("Can't close node", "id", node.ID(), "err", err) + } } } close(net.quitc) } -//Reset resets all network properties: -//emtpies the nodes and the connection list +// Reset resets all network properties: +// empties the nodes and the connection list func (net *Network) Reset() { net.lock.Lock() defer net.lock.Unlock() @@ -522,8 +629,21 @@ type Node struct { // Config if the config used to created the node Config *adapters.NodeConfig `json:"config"` - // Up tracks whether or not the node is running - Up bool `json:"up"` + // up tracks whether or not the node is running + up bool + upMu sync.RWMutex +} + +func (n *Node) Up() bool { + n.upMu.RLock() + defer n.upMu.RUnlock() + return n.up +} + +func (n *Node) SetUp(up bool) { + n.upMu.Lock() + defer n.upMu.Unlock() + n.up = up } // ID returns the ID of the node @@ -557,10 +677,29 @@ func (n *Node) MarshalJSON() ([]byte, error) { }{ Info: n.NodeInfo(), Config: n.Config, - Up: n.Up, + Up: n.Up(), }) } +// UnmarshalJSON implements json.Unmarshaler interface so that we don't lose +// Node.up status. IMPORTANT: The implementation is incomplete; we lose +// p2p.NodeInfo. +func (n *Node) UnmarshalJSON(raw []byte) error { + // TODO: How should we turn back NodeInfo into n.Node? + // Ticket: https://github.com/ethersphere/go-ethereum/issues/1177 + node := struct { + Config *adapters.NodeConfig `json:"config,omitempty"` + Up bool `json:"up"` + }{} + if err := json.Unmarshal(raw, &node); err != nil { + return err + } + + n.SetUp(node.Up) + n.Config = node.Config + return nil +} + // Conn represents a connection between two nodes in the network type Conn struct { // One is the node which initiated the connection @@ -580,10 +719,10 @@ type Conn struct { // nodesUp returns whether both nodes are currently up func (c *Conn) nodesUp() error { - if !c.one.Up { + if !c.one.Up() { return fmt.Errorf("one %v is not up", c.One) } - if !c.other.Up { + if !c.other.Up() { return fmt.Errorf("other %v is not up", c.Other) } return nil @@ -640,15 +779,22 @@ type NodeSnapshot struct { // Snapshot creates a network snapshot func (net *Network) Snapshot() (*Snapshot, error) { + return net.snapshot(nil, nil) +} + +func (net *Network) SnapshotWithServices(addServices []string, removeServices []string) (*Snapshot, error) { + return net.snapshot(addServices, removeServices) +} + +func (net *Network) snapshot(addServices []string, removeServices []string) (*Snapshot, error) { net.lock.Lock() defer net.lock.Unlock() snap := &Snapshot{ Nodes: make([]NodeSnapshot, len(net.Nodes)), - Conns: make([]Conn, len(net.Conns)), } for i, node := range net.Nodes { snap.Nodes[i] = NodeSnapshot{Node: *node} - if !node.Up { + if !node.Up() { continue } snapshots, err := node.Snapshots() @@ -656,29 +802,127 @@ func (net *Network) Snapshot() (*Snapshot, error) { return nil, err } snap.Nodes[i].Snapshots = snapshots + for _, addSvc := range addServices { + haveSvc := false + for _, svc := range snap.Nodes[i].Node.Config.Services { + if svc == addSvc { + haveSvc = true + break + } + } + if !haveSvc { + snap.Nodes[i].Node.Config.Services = append(snap.Nodes[i].Node.Config.Services, addSvc) + } + } + if len(removeServices) > 0 { + var cleanedServices []string + for _, svc := range snap.Nodes[i].Node.Config.Services { + haveSvc := false + for _, rmSvc := range removeServices { + if rmSvc == svc { + haveSvc = true + break + } + } + if !haveSvc { + cleanedServices = append(cleanedServices, svc) + } + + } + snap.Nodes[i].Node.Config.Services = cleanedServices + } } - for i, conn := range net.Conns { - snap.Conns[i] = *conn + for _, conn := range net.Conns { + if conn.Up { + snap.Conns = append(snap.Conns, *conn) + } } return snap, nil } +// longrunning tests may need a longer timeout +var snapshotLoadTimeout = 900 * time.Second + // Load loads a network snapshot func (net *Network) Load(snap *Snapshot) error { + // Start nodes. for _, n := range snap.Nodes { if _, err := net.NewNodeWithConfig(n.Node.Config); err != nil { return err } - if !n.Node.Up { + if !n.Node.Up() { continue } if err := net.startWithSnapshots(n.Node.Config.ID, n.Snapshots); err != nil { return err } } + + // Prepare connection events counter. + allConnected := make(chan struct{}) // closed when all connections are established + done := make(chan struct{}) // ensures that the event loop goroutine is terminated + defer close(done) + + // Subscribe to event channel. + // It needs to be done outside of the event loop goroutine (created below) + // to ensure that the event channel is blocking before connect calls are made. + events := make(chan *Event) + sub := net.Events().Subscribe(events) + defer sub.Unsubscribe() + + go func() { + // Expected number of connections. + total := len(snap.Conns) + // Set of all established connections from the snapshot, not other connections. + // Key array element 0 is the connection One field value, and element 1 connection Other field. + connections := make(map[[2]enode.ID]struct{}, total) + + for { + select { + case e := <-events: + // Ignore control events as they do not represent + // connect or disconnect (Up) state change. + if e.Control { + continue + } + // Detect only connection events. + if e.Type != EventTypeConn { + continue + } + connection := [2]enode.ID{e.Conn.One, e.Conn.Other} + // Nodes are still not connected or have been disconnected. + if !e.Conn.Up { + // Delete the connection from the set of established connections. + // This will prevent false positive in case disconnections happen. + delete(connections, connection) + log.Warn("load snapshot: unexpected disconnection", "one", e.Conn.One, "other", e.Conn.Other) + continue + } + // Check that the connection is from the snapshot. + for _, conn := range snap.Conns { + if conn.One == e.Conn.One && conn.Other == e.Conn.Other { + // Add the connection to the set of established connections. + connections[connection] = struct{}{} + if len(connections) == total { + // Signal that all nodes are connected. + close(allConnected) + return + } + + break + } + } + case <-done: + // Load function returned, terminate this goroutine. + return + } + } + }() + + // Start connecting. for _, conn := range snap.Conns { - if !net.GetNode(conn.One).Up || !net.GetNode(conn.Other).Up { + if !net.GetNode(conn.One).Up() || !net.GetNode(conn.Other).Up() { //in this case, at least one of the nodes of a connection is not up, //so it would result in the snapshot `Load` to fail continue @@ -687,6 +931,14 @@ func (net *Network) Load(snap *Snapshot) error { return err } } + + select { + // Wait until all connections from the snapshot are established. + case <-allConnected: + // Make sure that we do not wait forever. + case <-time.After(snapshotLoadTimeout): + return errors.New("snapshot connections not established") + } return nil } @@ -708,23 +960,23 @@ func (net *Network) Subscribe(events chan *Event) { } func (net *Network) executeControlEvent(event *Event) { - log.Trace("execute control event", "type", event.Type, "event", event) + log.Trace("Executing control event", "type", event.Type, "event", event) switch event.Type { case EventTypeNode: if err := net.executeNodeEvent(event); err != nil { - log.Error("error executing node event", "event", event, "err", err) + log.Error("Error executing node event", "event", event, "err", err) } case EventTypeConn: if err := net.executeConnEvent(event); err != nil { - log.Error("error executing conn event", "event", event, "err", err) + log.Error("Error executing conn event", "event", event, "err", err) } case EventTypeMsg: - log.Warn("ignoring control msg event") + log.Warn("Ignoring control msg event") } } func (net *Network) executeNodeEvent(e *Event) error { - if !e.Node.Up { + if !e.Node.Up() { return net.Stop(e.Node.ID()) } diff --git a/p2p/simulations/network_test.go b/p2p/simulations/network_test.go index f34935265127..01cd1000de47 100644 --- a/p2p/simulations/network_test.go +++ b/p2p/simulations/network_test.go @@ -18,14 +18,267 @@ package simulations import ( "context" + "encoding/json" "fmt" + "reflect" + "strconv" + "strings" "testing" "time" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/simulations/adapters" ) +// Tests that a created snapshot with a minimal service only contains the expected connections +// and that a network when loaded with this snapshot only contains those same connections +func TestSnapshot(t *testing.T) { + + // PART I + // create snapshot from ring network + + // this is a minimal service, whose protocol will take exactly one message OR close of connection before quitting + adapter := adapters.NewSimAdapter(adapters.Services{ + "noopwoop": func(ctx *adapters.ServiceContext) (node.Service, error) { + return NewNoopService(nil), nil + }, + }) + + // create network + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "noopwoop", + }) + // \todo consider making a member of network, set to true threadsafe when shutdown + runningOne := true + defer func() { + if runningOne { + network.Shutdown() + } + }() + + // create and start nodes + nodeCount := 20 + ids := make([]enode.ID, nodeCount) + for i := 0; i < nodeCount; i++ { + conf := adapters.RandomNodeConfig() + node, err := network.NewNodeWithConfig(conf) + if err != nil { + t.Fatalf("error creating node: %s", err) + } + if err := network.Start(node.ID()); err != nil { + t.Fatalf("error starting node: %s", err) + } + ids[i] = node.ID() + } + + // subscribe to peer events + evC := make(chan *Event) + sub := network.Events().Subscribe(evC) + defer sub.Unsubscribe() + + // connect nodes in a ring + // spawn separate thread to avoid deadlock in the event listeners + go func() { + for i, id := range ids { + peerID := ids[(i+1)%len(ids)] + if err := network.Connect(id, peerID); err != nil { + t.Fatal(err) + } + } + }() + + // collect connection events up to expected number + ctx, cancel := context.WithTimeout(context.TODO(), time.Second) + defer cancel() + checkIds := make(map[enode.ID][]enode.ID) + connEventCount := nodeCount +OUTER: + for { + select { + case <-ctx.Done(): + t.Fatal(ctx.Err()) + case ev := <-evC: + if ev.Type == EventTypeConn && !ev.Control { + + // fail on any disconnect + if !ev.Conn.Up { + t.Fatalf("unexpected disconnect: %v -> %v", ev.Conn.One, ev.Conn.Other) + } + checkIds[ev.Conn.One] = append(checkIds[ev.Conn.One], ev.Conn.Other) + checkIds[ev.Conn.Other] = append(checkIds[ev.Conn.Other], ev.Conn.One) + connEventCount-- + log.Debug("ev", "count", connEventCount) + if connEventCount == 0 { + break OUTER + } + } + } + } + + // create snapshot of current network + snap, err := network.Snapshot() + if err != nil { + t.Fatal(err) + } + j, err := json.Marshal(snap) + if err != nil { + t.Fatal(err) + } + log.Debug("snapshot taken", "nodes", len(snap.Nodes), "conns", len(snap.Conns), "json", string(j)) + + // verify that the snap element numbers check out + if len(checkIds) != len(snap.Conns) || len(checkIds) != len(snap.Nodes) { + t.Fatalf("snapshot wrong node,conn counts %d,%d != %d", len(snap.Nodes), len(snap.Conns), len(checkIds)) + } + + // shut down sim network + runningOne = false + sub.Unsubscribe() + network.Shutdown() + + // check that we have all the expected connections in the snapshot + for nodid, nodConns := range checkIds { + for _, nodConn := range nodConns { + var match bool + for _, snapConn := range snap.Conns { + if snapConn.One == nodid && snapConn.Other == nodConn { + match = true + break + } else if snapConn.Other == nodid && snapConn.One == nodConn { + match = true + break + } + } + if !match { + t.Fatalf("snapshot missing conn %v -> %v", nodid, nodConn) + } + } + } + log.Info("snapshot checked") + + // PART II + // load snapshot and verify that exactly same connections are formed + + adapter = adapters.NewSimAdapter(adapters.Services{ + "noopwoop": func(ctx *adapters.ServiceContext) (node.Service, error) { + return NewNoopService(nil), nil + }, + }) + network = NewNetwork(adapter, &NetworkConfig{ + DefaultService: "noopwoop", + }) + defer func() { + network.Shutdown() + }() + + // subscribe to peer events + // every node up and conn up event will generate one additional control event + // therefore multiply the count by two + evC = make(chan *Event, (len(snap.Conns)*2)+(len(snap.Nodes)*2)) + sub = network.Events().Subscribe(evC) + defer sub.Unsubscribe() + + // load the snapshot + // spawn separate thread to avoid deadlock in the event listeners + err = network.Load(snap) + if err != nil { + t.Fatal(err) + } + + // collect connection events up to expected number + ctx, cancel = context.WithTimeout(context.TODO(), time.Second*3) + defer cancel() + + connEventCount = nodeCount + +OuterTwo: + for { + select { + case <-ctx.Done(): + t.Fatal(ctx.Err()) + case ev := <-evC: + if ev.Type == EventTypeConn && !ev.Control { + + // fail on any disconnect + if !ev.Conn.Up { + t.Fatalf("unexpected disconnect: %v -> %v", ev.Conn.One, ev.Conn.Other) + } + log.Debug("conn", "on", ev.Conn.One, "other", ev.Conn.Other) + checkIds[ev.Conn.One] = append(checkIds[ev.Conn.One], ev.Conn.Other) + checkIds[ev.Conn.Other] = append(checkIds[ev.Conn.Other], ev.Conn.One) + connEventCount-- + log.Debug("ev", "count", connEventCount) + if connEventCount == 0 { + break OuterTwo + } + } + } + } + + // check that we have all expected connections in the network + for _, snapConn := range snap.Conns { + var match bool + for nodid, nodConns := range checkIds { + for _, nodConn := range nodConns { + if snapConn.One == nodid && snapConn.Other == nodConn { + match = true + break + } else if snapConn.Other == nodid && snapConn.One == nodConn { + match = true + break + } + } + } + if !match { + t.Fatalf("network missing conn %v -> %v", snapConn.One, snapConn.Other) + } + } + + // verify that network didn't generate any other additional connection events after the ones we have collected within a reasonable period of time + ctx, cancel = context.WithTimeout(context.TODO(), time.Second) + defer cancel() + select { + case <-ctx.Done(): + case ev := <-evC: + if ev.Type == EventTypeConn { + t.Fatalf("Superfluous conn found %v -> %v", ev.Conn.One, ev.Conn.Other) + } + } + + // This test validates if all connections from the snapshot + // are created in the network. + t.Run("conns after load", func(t *testing.T) { + // Create new network. + n := NewNetwork( + adapters.NewSimAdapter(adapters.Services{ + "noopwoop": func(ctx *adapters.ServiceContext) (node.Service, error) { + return NewNoopService(nil), nil + }, + }), + &NetworkConfig{ + DefaultService: "noopwoop", + }, + ) + defer n.Shutdown() + + // Load the same snapshot. + err := n.Load(snap) + if err != nil { + t.Fatal(err) + } + + // Check every connection from the snapshot + // if it is in the network, too. + for _, c := range snap.Conns { + if n.GetConn(c.One, c.Other) == nil { + t.Errorf("missing connection: %s -> %s", c.One, c.Other) + } + } + }) +} + // TestNetworkSimulation creates a multi-node simulation network with each node // connected in a ring topology, checks that all nodes successfully handshake // with each other and that a snapshot fully represents the desired topology @@ -158,3 +411,212 @@ func triggerChecks(ctx context.Context, ids []enode.ID, trigger chan enode.ID, i } } } + +// \todo: refactor to implement shapshots +// and connect configuration methods once these are moved from +// swarm/network/simulations/connect.go +func BenchmarkMinimalService(b *testing.B) { + b.Run("ring/32", benchmarkMinimalServiceTmp) +} + +func benchmarkMinimalServiceTmp(b *testing.B) { + + // stop timer to discard setup time pollution + args := strings.Split(b.Name(), "/") + nodeCount, err := strconv.ParseInt(args[2], 10, 16) + if err != nil { + b.Fatal(err) + } + + for i := 0; i < b.N; i++ { + // this is a minimal service, whose protocol will close a channel upon run of protocol + // making it possible to bench the time it takes for the service to start and protocol actually to be run + protoCMap := make(map[enode.ID]map[enode.ID]chan struct{}) + adapter := adapters.NewSimAdapter(adapters.Services{ + "noopwoop": func(ctx *adapters.ServiceContext) (node.Service, error) { + protoCMap[ctx.Config.ID] = make(map[enode.ID]chan struct{}) + svc := NewNoopService(protoCMap[ctx.Config.ID]) + return svc, nil + }, + }) + + // create network + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "noopwoop", + }) + defer network.Shutdown() + + // create and start nodes + ids := make([]enode.ID, nodeCount) + for i := 0; i < int(nodeCount); i++ { + conf := adapters.RandomNodeConfig() + node, err := network.NewNodeWithConfig(conf) + if err != nil { + b.Fatalf("error creating node: %s", err) + } + if err := network.Start(node.ID()); err != nil { + b.Fatalf("error starting node: %s", err) + } + ids[i] = node.ID() + } + + // ready, set, go + b.ResetTimer() + + // connect nodes in a ring + for i, id := range ids { + peerID := ids[(i+1)%len(ids)] + if err := network.Connect(id, peerID); err != nil { + b.Fatal(err) + } + } + + // wait for all protocols to signal to close down + ctx, cancel := context.WithTimeout(context.TODO(), time.Second) + defer cancel() + for nodid, peers := range protoCMap { + for peerid, peerC := range peers { + log.Debug("getting ", "node", nodid, "peer", peerid) + select { + case <-ctx.Done(): + b.Fatal(ctx.Err()) + case <-peerC: + } + } + } + } +} + +func TestNode_UnmarshalJSON(t *testing.T) { + t.Run( + "test unmarshal of Node up field", + func(t *testing.T) { + runNodeUnmarshalJSON(t, casesNodeUnmarshalJSONUpField()) + }, + ) + t.Run( + "test unmarshal of Node Config field", + func(t *testing.T) { + runNodeUnmarshalJSON(t, casesNodeUnmarshalJSONConfigField()) + }, + ) +} + +func runNodeUnmarshalJSON(t *testing.T, tests []nodeUnmarshalTestCase) { + t.Helper() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var got Node + if err := got.UnmarshalJSON([]byte(tt.marshaled)); err != nil { + expectErrorMessageToContain(t, err, tt.wantErr) + } + expectNodeEquality(t, got, tt.want) + }) + } +} + +type nodeUnmarshalTestCase struct { + name string + marshaled string + want Node + wantErr string +} + +func expectErrorMessageToContain(t *testing.T, got error, want string) { + t.Helper() + if got == nil && want == "" { + return + } + + if got == nil && want != "" { + t.Errorf("error was expected, got: nil, want: %v", want) + return + } + + if !strings.Contains(got.Error(), want) { + t.Errorf( + "unexpected error message, got %v, want: %v", + want, + got, + ) + } +} + +func expectNodeEquality(t *testing.T, got Node, want Node) { + t.Helper() + if !reflect.DeepEqual(got, want) { + t.Errorf("Node.UnmarshalJSON() = %v, want %v", got, want) + } +} + +func casesNodeUnmarshalJSONUpField() []nodeUnmarshalTestCase { + return []nodeUnmarshalTestCase{ + { + name: "empty json", + marshaled: "{}", + want: Node{ + up: false, + }, + }, + { + name: "a stopped node", + marshaled: "{\"up\": false}", + want: Node{ + up: false, + }, + }, + { + name: "a running node", + marshaled: "{\"up\": true}", + want: Node{ + up: true, + }, + }, + { + name: "invalid JSON value on valid key", + marshaled: "{\"up\": foo}", + wantErr: "invalid character", + }, + { + name: "invalid JSON key and value", + marshaled: "{foo: bar}", + wantErr: "invalid character", + }, + { + name: "bool value expected but got something else (string)", + marshaled: "{\"up\": \"true\"}", + wantErr: "cannot unmarshal string into Go struct", + }, + } +} + +func casesNodeUnmarshalJSONConfigField() []nodeUnmarshalTestCase { + // Don't do a big fuss around testing, as adapters.NodeConfig should + // handle it's own serialization. Just do a sanity check. + return []nodeUnmarshalTestCase{ + { + name: "Config field is omitted", + marshaled: "{}", + want: Node{ + Config: nil, + }, + }, + { + name: "Config field is nil", + marshaled: "{\"config\": nil}", + want: Node{ + Config: nil, + }, + }, + { + name: "a non default Config field", + marshaled: "{\"config\":{\"name\":\"node_ecdd0\",\"port\":44665}}", + want: Node{ + Config: &adapters.NodeConfig{ + Name: "node_ecdd0", + Port: 44665, + }, + }, + }, + } +} diff --git a/p2p/simulations/pipes/pipes.go b/p2p/simulations/pipes/pipes.go index 8532c1bcf0e9..ec277c0d147c 100644 --- a/p2p/simulations/pipes/pipes.go +++ b/p2p/simulations/pipes/pipes.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify diff --git a/p2p/simulations/test.go b/p2p/simulations/test.go new file mode 100644 index 000000000000..687be6d0b8e3 --- /dev/null +++ b/p2p/simulations/test.go @@ -0,0 +1,150 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package simulations + +import ( + "testing" + + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rpc" +) + +// NoopService is the service that does not do anything +// but implements node.Service interface. +type NoopService struct { + c map[enode.ID]chan struct{} +} + +func NewNoopService(ackC map[enode.ID]chan struct{}) *NoopService { + return &NoopService{ + c: ackC, + } +} + +func (t *NoopService) Protocols() []p2p.Protocol { + return []p2p.Protocol{ + { + Name: "noop", + Version: 666, + Length: 0, + Run: func(peer *p2p.Peer, rw p2p.MsgReadWriter) error { + if t.c != nil { + t.c[peer.ID()] = make(chan struct{}) + close(t.c[peer.ID()]) + } + rw.ReadMsg() + return nil + }, + NodeInfo: func() interface{} { + return struct{}{} + }, + PeerInfo: func(id enode.ID) interface{} { + return struct{}{} + }, + Attributes: []enr.Entry{}, + }, + } +} + +func (t *NoopService) APIs() []rpc.API { + return []rpc.API{} +} + +func (t *NoopService) Start(server *p2p.Server) error { + return nil +} + +func (t *NoopService) Stop() error { + return nil +} + +func VerifyRing(t *testing.T, net *Network, ids []enode.ID) { + t.Helper() + n := len(ids) + for i := 0; i < n; i++ { + for j := i + 1; j < n; j++ { + c := net.GetConn(ids[i], ids[j]) + if i == j-1 || (i == 0 && j == n-1) { + if c == nil { + t.Errorf("nodes %v and %v are not connected, but they should be", i, j) + } + } else { + if c != nil { + t.Errorf("nodes %v and %v are connected, but they should not be", i, j) + } + } + } + } +} + +func VerifyChain(t *testing.T, net *Network, ids []enode.ID) { + t.Helper() + n := len(ids) + for i := 0; i < n; i++ { + for j := i + 1; j < n; j++ { + c := net.GetConn(ids[i], ids[j]) + if i == j-1 { + if c == nil { + t.Errorf("nodes %v and %v are not connected, but they should be", i, j) + } + } else { + if c != nil { + t.Errorf("nodes %v and %v are connected, but they should not be", i, j) + } + } + } + } +} + +func VerifyFull(t *testing.T, net *Network, ids []enode.ID) { + t.Helper() + n := len(ids) + var connections int + for i, lid := range ids { + for _, rid := range ids[i+1:] { + if net.GetConn(lid, rid) != nil { + connections++ + } + } + } + + want := n * (n - 1) / 2 + if connections != want { + t.Errorf("wrong number of connections, got: %v, want: %v", connections, want) + } +} + +func VerifyStar(t *testing.T, net *Network, ids []enode.ID, centerIndex int) { + t.Helper() + n := len(ids) + for i := 0; i < n; i++ { + for j := i + 1; j < n; j++ { + c := net.GetConn(ids[i], ids[j]) + if i == centerIndex || j == centerIndex { + if c == nil { + t.Errorf("nodes %v and %v are not connected, but they should be", i, j) + } + } else { + if c != nil { + t.Errorf("nodes %v and %v are connected, but they should not be", i, j) + } + } + } + } +} diff --git a/p2p/testing/peerpool.go b/p2p/testing/peerpool.go index 01ccce67eb80..91b9704c79f4 100644 --- a/p2p/testing/peerpool.go +++ b/p2p/testing/peerpool.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -26,7 +26,7 @@ import ( type TestPeer interface { ID() enode.ID - Drop(error) + Drop() } // TestPeerPool is an example peerPool to demonstrate registration of peer connections diff --git a/p2p/testing/protocolsession.go b/p2p/testing/protocolsession.go index 476c2a9840c5..e3a3915a81e1 100644 --- a/p2p/testing/protocolsession.go +++ b/p2p/testing/protocolsession.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify diff --git a/p2p/testing/protocoltester.go b/p2p/testing/protocoltester.go index afc03b009fa5..b80abcc264f5 100644 --- a/p2p/testing/protocoltester.go +++ b/p2p/testing/protocoltester.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -25,12 +25,12 @@ package testing import ( "bytes" + "crypto/ecdsa" "fmt" "io" "io/ioutil" "strings" "sync" - "testing" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" @@ -52,7 +52,7 @@ type ProtocolTester struct { // NewProtocolTester constructs a new ProtocolTester // it takes as argument the pivot node id, the number of dummy peers and the // protocol run function called on a peer connection by the p2p server -func NewProtocolTester(t *testing.T, id enode.ID, n int, run func(*p2p.Peer, p2p.MsgReadWriter) error) *ProtocolTester { +func NewProtocolTester(prvkey *ecdsa.PrivateKey, nodeCount int, run func(*p2p.Peer, p2p.MsgReadWriter) error) *ProtocolTester { services := adapters.Services{ "test": func(ctx *adapters.ServiceContext) (node.Service, error) { return &testNode{run}, nil @@ -63,23 +63,30 @@ func NewProtocolTester(t *testing.T, id enode.ID, n int, run func(*p2p.Peer, p2p } adapter := adapters.NewSimAdapter(services) net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{}) - if _, err := net.NewNodeWithConfig(&adapters.NodeConfig{ - ID: id, + nodeConfig := &adapters.NodeConfig{ + PrivateKey: prvkey, EnableMsgEvents: true, Services: []string{"test"}, - }); err != nil { + } + if _, err := net.NewNodeWithConfig(nodeConfig); err != nil { panic(err.Error()) } - if err := net.Start(id); err != nil { + if err := net.Start(nodeConfig.ID); err != nil { panic(err.Error()) } - node := net.GetNode(id).Node.(*adapters.SimNode) - peers := make([]*adapters.NodeConfig, n) - nodes := make([]*enode.Node, n) - for i := 0; i < n; i++ { + node := net.GetNode(nodeConfig.ID).Node.(*adapters.SimNode) + peers := make([]*adapters.NodeConfig, nodeCount) + nodes := make([]*enode.Node, nodeCount) + for i := 0; i < nodeCount; i++ { peers[i] = adapters.RandomNodeConfig() peers[i].Services = []string{"mock"} + if _, err := net.NewNodeWithConfig(peers[i]); err != nil { + panic(fmt.Sprintf("error initializing peer %v: %v", peers[i].ID, err)) + } + if err := net.Start(peers[i].ID); err != nil { + panic(fmt.Sprintf("error starting peer %v: %v", peers[i].ID, err)) + } nodes[i] = peers[i].Node() } events := make(chan *p2p.PeerEvent, 1000) @@ -95,28 +102,21 @@ func NewProtocolTester(t *testing.T, id enode.ID, n int, run func(*p2p.Peer, p2p network: net, } - self.Connect(id, peers...) + self.Connect(nodeConfig.ID, peers...) return self } // Stop stops the p2p server -func (t *ProtocolTester) Stop() error { +func (t *ProtocolTester) Stop() { t.Server.Stop() - return nil + t.network.Shutdown() } // Connect brings up the remote peer node and connects it using the // p2p/simulations network connection with the in memory network adapter func (t *ProtocolTester) Connect(selfID enode.ID, peers ...*adapters.NodeConfig) { for _, peer := range peers { - log.Trace(fmt.Sprintf("start node %v", peer.ID)) - if _, err := t.network.NewNodeWithConfig(peer); err != nil { - panic(fmt.Sprintf("error starting peer %v: %v", peer.ID, err)) - } - if err := t.network.Start(peer.ID); err != nil { - panic(fmt.Sprintf("error starting peer %v: %v", peer.ID, err)) - } log.Trace(fmt.Sprintf("connect to %v", peer.ID)) if err := t.network.Connect(selfID, peer.ID); err != nil { panic(fmt.Sprintf("error connecting to peer %v: %v", peer.ID, err)) diff --git a/p2p/util.go b/p2p/util.go new file mode 100644 index 000000000000..2a6edf5ceeba --- /dev/null +++ b/p2p/util.go @@ -0,0 +1,82 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package p2p + +import ( + "container/heap" + "time" +) + +// expHeap tracks strings and their expiry time. +type expHeap []expItem + +// expItem is an entry in addrHistory. +type expItem struct { + item string + exp time.Time +} + +// nextExpiry returns the next expiry time. +func (h *expHeap) nextExpiry() time.Time { + return (*h)[0].exp +} + +// add adds an item and sets its expiry time. +func (h *expHeap) add(item string, exp time.Time) { + heap.Push(h, expItem{item, exp}) +} + +// remove removes an item. +func (h *expHeap) remove(item string) bool { + for i, v := range *h { + if v.item == item { + heap.Remove(h, i) + return true + } + } + return false +} + +// contains checks whether an item is present. +func (h expHeap) contains(item string) bool { + for _, v := range h { + if v.item == item { + return true + } + } + return false +} + +// expire removes items with expiry time before 'now'. +func (h *expHeap) expire(now time.Time) { + for h.Len() > 0 && h.nextExpiry().Before(now) { + heap.Pop(h) + } +} + +// heap.Interface boilerplate +func (h expHeap) Len() int { return len(h) } +func (h expHeap) Less(i, j int) bool { return h[i].exp.Before(h[j].exp) } +func (h expHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } +func (h *expHeap) Push(x interface{}) { *h = append(*h, x.(expItem)) } +func (h *expHeap) Pop() interface{} { + old := *h + n := len(old) + x := old[n-1] + *h = old[0 : n-1] + return x +} diff --git a/p2p/util_test.go b/p2p/util_test.go new file mode 100644 index 000000000000..c9f2648dc92f --- /dev/null +++ b/p2p/util_test.go @@ -0,0 +1,54 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package p2p + +import ( + "testing" + "time" +) + +func TestExpHeap(t *testing.T) { + var h expHeap + + var ( + basetime = time.Unix(4000, 0) + exptimeA = basetime.Add(2 * time.Second) + exptimeB = basetime.Add(3 * time.Second) + exptimeC = basetime.Add(4 * time.Second) + ) + h.add("a", exptimeA) + h.add("b", exptimeB) + h.add("c", exptimeC) + + if !h.nextExpiry().Equal(exptimeA) { + t.Fatal("wrong nextExpiry") + } + if !h.contains("a") || !h.contains("b") || !h.contains("c") { + t.Fatal("heap doesn't contain all live items") + } + + h.expire(exptimeA.Add(1)) + if !h.nextExpiry().Equal(exptimeB) { + t.Fatal("wrong nextExpiry") + } + if h.contains("a") { + t.Fatal("heap contains a even though it has already expired") + } + if !h.contains("b") || !h.contains("c") { + t.Fatal("heap doesn't contain all live items") + } +} diff --git a/params/bootnodes.go b/params/bootnodes.go index c7190ae6700f..36f13d1787ae 100644 --- a/params/bootnodes.go +++ b/params/bootnodes.go @@ -20,6 +20,16 @@ package params // the main Ethereum network. var MainnetBootnodes = []string{ // Ethereum Foundation Go Bootnodes + "enode://d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303", // bootnode-aws-ap-southeast-1-001 + "enode://22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303", // bootnode-aws-us-east-1-001 + "enode://ca6de62fce278f96aea6ec5a2daadb877e51651247cb96ee310a318def462913b653963c155a0ef6c7d50048bba6e6cea881130857413d9f50a621546b590758@34.255.23.113:30303", // bootnode-aws-eu-west-1-001 + "enode://279944d8dcd428dffaa7436f25ca0ca43ae19e7bcf94a8fb7d1641651f92d121e972ac2e8f381414b80cc8e5555811c2ec6e1a99bb009b3f53c4c69923e11bd8@35.158.244.151:30303", // bootnode-aws-eu-central-1-001 + "enode://8499da03c47d637b20eee24eec3c356c9a2e6148d6fe25ca195c7949ab8ec2c03e3556126b0d7ed644675e78c4318b08691b7b57de10e5f0d40d05b09238fa0a@52.187.207.27:30303", // bootnode-azure-australiaeast-001 + "enode://103858bdb88756c71f15e9b5e09b56dc1be52f0a5021d46301dbbfb7e130029cc9d0d6f73f693bc29b665770fff7da4d34f3c6379fe12721b5d7a0bcb5ca1fc1@191.234.162.198:30303", // bootnode-azure-brazilsouth-001 + "enode://715171f50508aba88aecd1250af392a45a330af91d7b90701c436b618c86aaa1589c9184561907bebbb56439b8f8787bc01f49a7c77276c58c1b09822d75e8e8@52.231.165.108:30303", // bootnode-azure-koreasouth-001 + "enode://5d6d7cd20d6da4bb83a1d28cadb5d409b64edf314c0335df658c1a54e32c7c4a7ab7823d57c39b6a757556e68ff1df17c748b698544a55cb488b52479a92b60f@104.42.217.25:30303", // bootnode-azure-westus-001 + + // Ethereum Foundation Go Bootnodes (legacy) "enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303", // IE "enode://3f1d12044546b76342d59d4a05532c14b85aa669704bfe1f864fe079415aa2c02d743e03218e57a33fb94523adb54032871a6c51b2cc5514cb7c7e35b3ed0a99@13.93.211.84:30303", // US-WEST "enode://78de8a0916848093c73790ead81d1928bec737d565119932b98c6b100d944b7a95e94f847f689fc723399d2e31129d182f7ef3863f2b4c820abbf3ab2722344d@191.235.84.50:30303", // BR @@ -47,6 +57,20 @@ var RinkebyBootnodes = []string{ "enode://b6b28890b006743680c52e64e0d16db57f28124885595fa03a562be1d2bf0f3a1da297d56b13da25fb992888fd556d4c1a27b1f39d531bde7de1921c90061cc6@159.89.28.211:30303", // AKASHA } +// GoerliBootnodes are the enode URLs of the P2P bootstrap nodes running on the +// Görli test network. +var GoerliBootnodes = []string{ + // Upstream bootnodes + "enode://011f758e6552d105183b1761c5e2dea0111bc20fd5f6422bc7f91e0fabbec9a6595caf6239b37feb773dddd3f87240d99d859431891e4a642cf2a0a9e6cbb98a@51.141.78.53:30303", + "enode://176b9417f511d05b6b2cf3e34b756cf0a7096b3094572a8f6ef4cdcb9d1f9d00683bf0f83347eebdf3b81c3521c2332086d9592802230bf528eaf606a1d9677b@13.93.54.137:30303", + "enode://46add44b9f13965f7b9875ac6b85f016f341012d84f975377573800a863526f4da19ae2c620ec73d11591fa9510e992ecc03ad0751f53cc02f7c7ed6d55c7291@94.237.54.114:30313", + "enode://c1f8b7c2ac4453271fa07d8e9ecf9a2e8285aa0bd0c07df0131f47153306b0736fd3db8924e7a9bf0bed6b1d8d4f87362a71b033dc7c64547728d953e43e59b2@52.64.155.147:30303", + "enode://f4a9c6ee28586009fb5a96c8af13a58ed6d8315a9eee4772212c1d4d9cebe5a8b8a78ea4434f318726317d04a3f531a1ef0420cf9752605a562cfe858c46e263@213.186.16.82:30303", + + // Ethereum Foundation bootnode + "enode://573b6607cd59f241e30e4c4943fd50e99e2b6f42f9bd5ca111659d309c06741247f4f1e93843ad3e8c8c18b6e2d94c161b7ef67479b3938780a97134b618b5ce@52.56.136.200:30303", +} + // DiscoveryV5Bootnodes are the enode URLs of the P2P bootstrap nodes for the // experimental RLPx v5 topic-discovery network. var DiscoveryV5Bootnodes = []string{ diff --git a/params/config.go b/params/config.go index a9e631cde4e0..2c7be848a7df 100644 --- a/params/config.go +++ b/params/config.go @@ -17,10 +17,12 @@ package params import ( + "encoding/binary" "fmt" "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) // Genesis hashes to enforce below configs on. @@ -28,8 +30,27 @@ var ( MainnetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3") TestnetGenesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d") RinkebyGenesisHash = common.HexToHash("0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177") + GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") ) +// TrustedCheckpoints associates each known checkpoint with the genesis hash of +// the chain it belongs to. +var TrustedCheckpoints = map[common.Hash]*TrustedCheckpoint{ + MainnetGenesisHash: MainnetTrustedCheckpoint, + TestnetGenesisHash: TestnetTrustedCheckpoint, + RinkebyGenesisHash: RinkebyTrustedCheckpoint, + GoerliGenesisHash: GoerliTrustedCheckpoint, +} + +// CheckpointOracles associates each known checkpoint oracles with the genesis hash of +// the chain it belongs to. +var CheckpointOracles = map[common.Hash]*CheckpointOracleConfig{ + MainnetGenesisHash: MainnetCheckpointOracle, + TestnetGenesisHash: TestnetCheckpointOracle, + RinkebyGenesisHash: RinkebyCheckpointOracle, + GoerliGenesisHash: GoerliCheckpointOracle, +} + var ( // MainnetChainConfig is the chain parameters to run a node on the main network. MainnetChainConfig = &ChainConfig{ @@ -42,17 +63,30 @@ var ( EIP155Block: big.NewInt(2675000), EIP158Block: big.NewInt(2675000), ByzantiumBlock: big.NewInt(4370000), - ConstantinopleBlock: nil, + ConstantinopleBlock: big.NewInt(7280000), + PetersburgBlock: big.NewInt(7280000), Ethash: new(EthashConfig), } // MainnetTrustedCheckpoint contains the light client trusted checkpoint for the main network. MainnetTrustedCheckpoint = &TrustedCheckpoint{ - Name: "mainnet", - SectionIndex: 193, - SectionHead: common.HexToHash("0xc2d574295ecedc4d58530ae24c31a5a98be7d2b3327fba0dd0f4ed3913828a55"), - CHTRoot: common.HexToHash("0x5d1027dfae688c77376e842679ceada87fd94738feb9b32ef165473bfbbb317b"), - BloomRoot: common.HexToHash("0xd38be1a06aabd568e10957fee4fcc523bc64996bcf31bae3f55f86e0a583919f"), + SectionIndex: 249, + SectionHead: common.HexToHash("0x0d656b0cc0e9901c9dfc6b6944962ad10286969b5e65cff2b21228ffa3201b45"), + CHTRoot: common.HexToHash("0xe97cdc4a54f6bcae09acd8f7d9b2fecc6baa58cc30e12fc1c848d4b736060389"), + BloomRoot: common.HexToHash("0xe028d4fe19fccd10c845b609dbed0778217298c352e3f588aa1351e9e7b836ca"), + } + + // MainnetCheckpointOracle contains a set of configs for the main network oracle. + MainnetCheckpointOracle = &CheckpointOracleConfig{ + Address: common.HexToAddress("0x9a9070028361F7AAbeB3f2F2Dc07F82C4a98A02a"), + Signers: []common.Address{ + common.HexToAddress("0x1b2C260efc720BE89101890E4Db589b44E950527"), // Peter + common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin + common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt + common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary + common.HexToAddress("0x0DF8fa387C602AE62559cC4aFa4972A7045d6707"), // Guillaume + }, + Threshold: 2, } // TestnetChainConfig contains the chain parameters to run a node on the Ropsten test network. @@ -66,17 +100,30 @@ var ( EIP155Block: big.NewInt(10), EIP158Block: big.NewInt(10), ByzantiumBlock: big.NewInt(1700000), - ConstantinopleBlock: nil, + ConstantinopleBlock: big.NewInt(4230000), + PetersburgBlock: big.NewInt(4939394), Ethash: new(EthashConfig), } // TestnetTrustedCheckpoint contains the light client trusted checkpoint for the Ropsten test network. TestnetTrustedCheckpoint = &TrustedCheckpoint{ - Name: "testnet", - SectionIndex: 123, - SectionHead: common.HexToHash("0xa372a53decb68ce453da12bea1c8ee7b568b276aa2aab94d9060aa7c81fc3dee"), - CHTRoot: common.HexToHash("0x6b02e7fada79cd2a80d4b3623df9c44384d6647fc127462e1c188ccd09ece87b"), - BloomRoot: common.HexToHash("0xf2d27490914968279d6377d42868928632573e823b5d1d4a944cba6009e16259"), + SectionIndex: 183, + SectionHead: common.HexToHash("0xe1eb8c31b8d370db4562a5246ffd220d44540581d2365b96615293e4795184fd"), + CHTRoot: common.HexToHash("0x1e5902d1680f543ac23ebae2663a3d45daad0de5329c8921ebe295e602afe81e"), + BloomRoot: common.HexToHash("0xae53ddf3574792a7fad53b3ceb03867facc4a67d25bb6dae9ddd0bd53a0ad027"), + } + + // TestnetCheckpointOracle contains a set of configs for the Ropsten test network oracle. + TestnetCheckpointOracle = &CheckpointOracleConfig{ + Address: common.HexToAddress("0xEF79475013f154E6A65b54cB2742867791bf0B84"), + Signers: []common.Address{ + common.HexToAddress("0x32162F3581E88a5f62e8A61892B42C46E2c18f7b"), // Peter + common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin + common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt + common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary + common.HexToAddress("0x0DF8fa387C602AE62559cC4aFa4972A7045d6707"), // Guillaume + }, + Threshold: 2, } // RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network. @@ -90,7 +137,8 @@ var ( EIP155Block: big.NewInt(3), EIP158Block: big.NewInt(3), ByzantiumBlock: big.NewInt(1035301), - ConstantinopleBlock: nil, + ConstantinopleBlock: big.NewInt(3660663), + PetersburgBlock: big.NewInt(4321234), Clique: &CliqueConfig{ Period: 15, Epoch: 30000, @@ -99,11 +147,61 @@ var ( // RinkebyTrustedCheckpoint contains the light client trusted checkpoint for the Rinkeby test network. RinkebyTrustedCheckpoint = &TrustedCheckpoint{ - Name: "rinkeby", - SectionIndex: 91, - SectionHead: common.HexToHash("0x435b7b2d8a7922f3b9a522f2fb02730e95e0e1782f0f5443894d5415bba37154"), - CHTRoot: common.HexToHash("0x0664bf7ecccfb6775c4eca6f0f264fb5282a22754a2135a1ac4bff2ef02898dd"), - BloomRoot: common.HexToHash("0x2a64df2400c3a2cb6400639bb6ed29389abdb4d93e2e525aa7c21f38767cd96f"), + SectionIndex: 144, + SectionHead: common.HexToHash("0x38cc2e339462919179e5ca9f88408ee481eb1750a143bdbf4f33c00f2064935a"), + CHTRoot: common.HexToHash("0x889c6b1e4d9e312d3145d104e7f58f52d1854e8dafb2f0b90e0c1d8b71bce97b"), + BloomRoot: common.HexToHash("0xb7ae54ba64f359b78dfc3e8a61fc44e68758568e7f54b849fa474caa45efa9b9"), + } + + // RinkebyCheckpointOracle contains a set of configs for the Rinkeby test network oracle. + RinkebyCheckpointOracle = &CheckpointOracleConfig{ + Address: common.HexToAddress("0xebe8eFA441B9302A0d7eaECc277c09d20D684540"), + Signers: []common.Address{ + common.HexToAddress("0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3"), // Peter + common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin + common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt + common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary + }, + Threshold: 2, + } + + // GoerliChainConfig contains the chain parameters to run a node on the Görli test network. + GoerliChainConfig = &ChainConfig{ + ChainID: big.NewInt(5), + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: true, + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + Clique: &CliqueConfig{ + Period: 15, + Epoch: 30000, + }, + } + + // GoerliTrustedCheckpoint contains the light client trusted checkpoint for the Görli test network. + GoerliTrustedCheckpoint = &TrustedCheckpoint{ + SectionIndex: 28, + SectionHead: common.HexToHash("0x5baedfb5006507906cce3b6487080c810aa79806b0388c3671ee6d56694a591e"), + CHTRoot: common.HexToHash("0x89ff7aabc7a0a13c25aeb1e3e333063acf80473a571e465d7c884b183a67e717"), + BloomRoot: common.HexToHash("0x56eccfd9171d2df3e62ffd61c442dfb69b603b1f28fbb267c28b3444fdeae6c6"), + } + + // GoerliCheckpointOracle contains a set of configs for the Goerli test network oracle. + GoerliCheckpointOracle = &CheckpointOracleConfig{ + Address: common.HexToAddress("0x18CA0E045F0D772a851BC7e48357Bcaab0a0795D"), + Signers: []common.Address{ + common.HexToAddress("0x4769bcaD07e3b938B7f43EB7D278Bc7Cb9efFb38"), // Peter + common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin + common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt + common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary + common.HexToAddress("0x0DF8fa387C602AE62559cC4aFa4972A7045d6707"), // Guillaume + }, + Threshold: 2, } // AllEthashProtocolChanges contains every protocol change (EIPs) introduced @@ -111,16 +209,16 @@ var ( // // This configuration is intentionally not using keyed fields to force anyone // adding flags to the config to also have to set these fields. - AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil} + AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, new(EthashConfig), nil} // AllCliqueProtocolChanges contains every protocol change (EIPs) introduced // and accepted by the Ethereum core developers into the Clique consensus. // // This configuration is intentionally not using keyed fields to force anyone // adding flags to the config to also have to set these fields. - AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, nil, &CliqueConfig{Period: 0, Epoch: 30000}} + AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, &CliqueConfig{Period: 0, Epoch: 30000}} - TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil} + TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, new(EthashConfig), nil} TestRules = TestChainConfig.Rules(new(big.Int)) ) @@ -129,13 +227,43 @@ var ( // used to start light syncing from this checkpoint and avoid downloading the // entire header chain while still being able to securely access old headers/logs. type TrustedCheckpoint struct { - Name string `json:"-"` SectionIndex uint64 `json:"sectionIndex"` SectionHead common.Hash `json:"sectionHead"` CHTRoot common.Hash `json:"chtRoot"` BloomRoot common.Hash `json:"bloomRoot"` } +// HashEqual returns an indicator comparing the itself hash with given one. +func (c *TrustedCheckpoint) HashEqual(hash common.Hash) bool { + if c.Empty() { + return hash == common.Hash{} + } + return c.Hash() == hash +} + +// Hash returns the hash of checkpoint's four key fields(index, sectionHead, chtRoot and bloomTrieRoot). +func (c *TrustedCheckpoint) Hash() common.Hash { + buf := make([]byte, 8+3*common.HashLength) + binary.BigEndian.PutUint64(buf, c.SectionIndex) + copy(buf[8:], c.SectionHead.Bytes()) + copy(buf[8+common.HashLength:], c.CHTRoot.Bytes()) + copy(buf[8+2*common.HashLength:], c.BloomRoot.Bytes()) + return crypto.Keccak256Hash(buf) +} + +// Empty returns an indicator whether the checkpoint is regarded as empty. +func (c *TrustedCheckpoint) Empty() bool { + return c.SectionHead == (common.Hash{}) || c.CHTRoot == (common.Hash{}) || c.BloomRoot == (common.Hash{}) +} + +// CheckpointOracleConfig represents a set of checkpoint contract(which acts as an oracle) +// config which used for light client checkpoint syncing. +type CheckpointOracleConfig struct { + Address common.Address `json:"address"` + Signers []common.Address `json:"signers"` + Threshold uint64 `json:"threshold"` +} + // ChainConfig is the core config which determines the blockchain settings. // // ChainConfig is stored in the database on a per block basis. This means @@ -158,6 +286,7 @@ type ChainConfig struct { ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = already on byzantium) ConstantinopleBlock *big.Int `json:"constantinopleBlock,omitempty"` // Constantinople switch block (nil = no fork, 0 = already activated) + PetersburgBlock *big.Int `json:"petersburgBlock,omitempty"` // Petersburg switch block (nil = same as Constantinople) EWASMBlock *big.Int `json:"ewasmBlock,omitempty"` // EWASM switch block (nil = no fork, 0 = already activated) // Various consensus engines @@ -195,7 +324,7 @@ func (c *ChainConfig) String() string { default: engine = "unknown" } - return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Engine: %v}", + return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Engine: %v}", c.ChainID, c.HomesteadBlock, c.DAOForkBlock, @@ -205,6 +334,7 @@ func (c *ChainConfig) String() string { c.EIP158Block, c.ByzantiumBlock, c.ConstantinopleBlock, + c.PetersburgBlock, engine, ) } @@ -244,6 +374,13 @@ func (c *ChainConfig) IsConstantinople(num *big.Int) bool { return isForked(c.ConstantinopleBlock, num) } +// IsPetersburg returns whether num is either +// - equal to or greater than the PetersburgBlock fork block, +// - OR is nil, and Constantinople is active +func (c *ChainConfig) IsPetersburg(num *big.Int) bool { + return isForked(c.PetersburgBlock, num) || c.PetersburgBlock == nil && isForked(c.ConstantinopleBlock, num) +} + // IsEWASM returns whether num represents a block number after the EWASM fork func (c *ChainConfig) IsEWASM(num *big.Int) bool { return isForked(c.EWASMBlock, num) @@ -314,6 +451,9 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi if isForkIncompatible(c.ConstantinopleBlock, newcfg.ConstantinopleBlock, head) { return newCompatError("Constantinople fork block", c.ConstantinopleBlock, newcfg.ConstantinopleBlock) } + if isForkIncompatible(c.PetersburgBlock, newcfg.PetersburgBlock, head) { + return newCompatError("Petersburg fork block", c.PetersburgBlock, newcfg.PetersburgBlock) + } if isForkIncompatible(c.EWASMBlock, newcfg.EWASMBlock, head) { return newCompatError("ewasm fork block", c.EWASMBlock, newcfg.EWASMBlock) } @@ -381,9 +521,9 @@ func (err *ConfigCompatError) Error() string { // Rules is a one time interface meaning that it shouldn't be used in between transition // phases. type Rules struct { - ChainID *big.Int - IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool - IsByzantium, IsConstantinople bool + ChainID *big.Int + IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool + IsByzantium, IsConstantinople, IsPetersburg bool } // Rules ensures c's ChainID is not nil. @@ -400,5 +540,6 @@ func (c *ChainConfig) Rules(num *big.Int) Rules { IsEIP158: c.IsEIP158(num), IsByzantium: c.IsByzantium(num), IsConstantinople: c.IsConstantinople(num), + IsPetersburg: c.IsPetersburg(num), } } diff --git a/params/network_params.go b/params/network_params.go index f8731e897970..bba24721c134 100644 --- a/params/network_params.go +++ b/params/network_params.go @@ -32,13 +32,8 @@ const ( // considered probably final and its rotated bits are calculated. BloomConfirms = 256 - // CHTFrequencyClient is the block frequency for creating CHTs on the client side. - CHTFrequencyClient = 32768 - - // CHTFrequencyServer is the block frequency for creating CHTs on the server side. - // Eventually this can be merged back with the client version, but that requires a - // full database upgrade, so that should be left for a suitable moment. - CHTFrequencyServer = 4096 + // CHTFrequency is the block frequency for creating CHTs + CHTFrequency = 32768 // BloomTrieFrequency is the block frequency for creating BloomTrie on both // server/client sides. @@ -51,4 +46,16 @@ const ( // HelperTrieProcessConfirmations is the number of confirmations before a HelperTrie // is generated HelperTrieProcessConfirmations = 256 + + // CheckpointFrequency is the block frequency for creating checkpoint + CheckpointFrequency = 32768 + + // CheckpointProcessConfirmations is the number before a checkpoint is generated + CheckpointProcessConfirmations = 256 + + // ImmutabilityThreshold is the number of blocks after which a chain segment is + // considered immutable (i.e. soft finality). It is used by the downloader as a + // hard limit against deep ancestors, by the blockchain against deep reorgs, by + // the freezer as the cutoff treshold and by clique as the snapshot trust limit. + ImmutabilityThreshold = 90000 ) diff --git a/params/protocol_params.go b/params/protocol_params.go index c8b6609afbfe..14750f6a1a34 100644 --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -52,7 +52,7 @@ const ( NetSstoreResetRefund uint64 = 4800 // Once per SSTORE operation for resetting to the original non-zero value NetSstoreResetClearRefund uint64 = 19800 // Once per SSTORE operation for resetting to the original zero value - JumpdestGas uint64 = 1 // Refunded gas, once per SSTORE operation if the zeroness changes to zero. + JumpdestGas uint64 = 1 // Once per JUMPDEST operation. EpochDuration uint64 = 30000 // Duration between proof-of-work epochs. CallGas uint64 = 40 // Once per CALL operation & message call transaction. CreateDataGas uint64 = 200 // diff --git a/params/version.go b/params/version.go index e87d7dc35c89..feb43666ea7c 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 1 // Major version component of the current release - VersionMinor = 8 // Minor version component of the current release - VersionPatch = 17 // Patch version component of the current release - VersionMeta = "unstable" // Version metadata to append to the version string + VersionMajor = 1 // Major version component of the current release + VersionMinor = 9 // Minor version component of the current release + VersionPatch = 1 // Patch version component of the current release + VersionMeta = "stable" // Version metadata to append to the version string ) // Version holds the textual version string. @@ -55,10 +55,13 @@ func ArchiveVersion(gitCommit string) string { return vsn } -func VersionWithCommit(gitCommit string) string { +func VersionWithCommit(gitCommit, gitDate string) string { vsn := VersionWithMeta if len(gitCommit) >= 8 { vsn += "-" + gitCommit[:8] } + if (VersionMeta != "stable") && (gitDate != "") { + vsn += "-" + gitDate + } return vsn } diff --git a/rlp/decode.go b/rlp/decode.go index dbbe599597a8..4f29f2fb0368 100644 --- a/rlp/decode.go +++ b/rlp/decode.go @@ -26,6 +26,7 @@ import ( "math/big" "reflect" "strings" + "sync" ) var ( @@ -48,6 +49,10 @@ var ( errUintOverflow = errors.New("rlp: uint overflow") errNoPointer = errors.New("rlp: interface given to Decode must be a pointer") errDecodeIntoNil = errors.New("rlp: pointer given to Decode must not be nil") + + streamPool = sync.Pool{ + New: func() interface{} { return new(Stream) }, + } ) // Decoder is implemented by types that require custom RLP @@ -110,15 +115,17 @@ type Decoder interface { // type, Decode will return an error. Decode also supports *big.Int. // There is no size limit for big integers. // +// To decode into a boolean, the input must contain an unsigned integer +// of value zero (false) or one (true). +// // To decode into an interface value, Decode stores one of these // in the value: // // []interface{}, for RLP lists // []byte, for RLP strings // -// Non-empty interface types are not supported, nor are booleans, -// signed integers, floating point numbers, maps, channels and -// functions. +// Non-empty interface types are not supported, nor are signed integers, +// floating point numbers, maps, channels and functions. // // Note that Decode does not set an input limit for all readers // and may be vulnerable to panics cause by huge value sizes. If @@ -126,17 +133,24 @@ type Decoder interface { // // NewStream(r, limit).Decode(val) func Decode(r io.Reader, val interface{}) error { - // TODO: this could use a Stream from a pool. - return NewStream(r, 0).Decode(val) + stream := streamPool.Get().(*Stream) + defer streamPool.Put(stream) + + stream.Reset(r, 0) + return stream.Decode(val) } // DecodeBytes parses RLP data from b into val. // Please see the documentation of Decode for the decoding rules. // The input must contain exactly one value and no trailing data. func DecodeBytes(b []byte, val interface{}) error { - // TODO: this could use a Stream from a pool. r := bytes.NewReader(b) - if err := NewStream(r, uint64(len(b))).Decode(val); err != nil { + + stream := streamPool.Get().(*Stream) + defer streamPool.Put(stream) + + stream.Reset(r, uint64(len(b))) + if err := stream.Decode(val); err != nil { return err } if r.Len() > 0 { @@ -294,9 +308,9 @@ func makeListDecoder(typ reflect.Type, tag tags) (decoder, error) { } return decodeByteSlice, nil } - etypeinfo, err := cachedTypeInfo1(etype, tags{}) - if err != nil { - return nil, err + etypeinfo := cachedTypeInfo1(etype, tags{}) + if etypeinfo.decoderErr != nil { + return nil, etypeinfo.decoderErr } var dec decoder switch { @@ -455,9 +469,9 @@ func makeStructDecoder(typ reflect.Type) (decoder, error) { // the pointer's element type. func makePtrDecoder(typ reflect.Type) (decoder, error) { etype := typ.Elem() - etypeinfo, err := cachedTypeInfo1(etype, tags{}) - if err != nil { - return nil, err + etypeinfo := cachedTypeInfo1(etype, tags{}) + if etypeinfo.decoderErr != nil { + return nil, etypeinfo.decoderErr } dec := func(s *Stream, val reflect.Value) (err error) { newval := val @@ -479,9 +493,9 @@ func makePtrDecoder(typ reflect.Type) (decoder, error) { // This decoder is used for pointer-typed struct fields with struct tag "nil". func makeOptionalPtrDecoder(typ reflect.Type) (decoder, error) { etype := typ.Elem() - etypeinfo, err := cachedTypeInfo1(etype, tags{}) - if err != nil { - return nil, err + etypeinfo := cachedTypeInfo1(etype, tags{}) + if etypeinfo.decoderErr != nil { + return nil, etypeinfo.decoderErr } dec := func(s *Stream, val reflect.Value) (err error) { kind, size, err := s.Kind() @@ -802,12 +816,12 @@ func (s *Stream) Decode(val interface{}) error { if rval.IsNil() { return errDecodeIntoNil } - info, err := cachedTypeInfo(rtyp.Elem(), tags{}) + decoder, err := cachedDecoder(rtyp.Elem()) if err != nil { return err } - err = info.decoder(s, rval.Elem()) + err = decoder(s, rval.Elem()) if decErr, ok := err.(*decodeError); ok && len(decErr.ctx) > 0 { // add decode target type to error so context has more meaning decErr.ctx = append(decErr.ctx, fmt.Sprint("(", rtyp.Elem(), ")")) @@ -853,6 +867,7 @@ func (s *Stream) Reset(r io.Reader, inputLimit uint64) { if s.uintbuf == nil { s.uintbuf = make([]byte, 8) } + s.byteval = 0 } // Kind returns the kind and size of the next value in the diff --git a/rlp/decode_test.go b/rlp/decode_test.go index 4d8abd001281..fa57182c992a 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -347,6 +347,12 @@ type tailUint struct { Tail []uint `rlp:"tail"` } +type tailPrivateFields struct { + A uint + Tail []uint `rlp:"tail"` + x, y bool +} + var ( veryBigInt = big.NewInt(0).Add( big.NewInt(0).Lsh(big.NewInt(0xFFFFFFFFFFFFFF), 16), @@ -510,6 +516,11 @@ var decodeTests = []decodeTest{ ptr: new(tailRaw), value: tailRaw{A: 1, Tail: []RawValue{}}, }, + { + input: "C3010203", + ptr: new(tailPrivateFields), + value: tailPrivateFields{A: 1, Tail: []uint{2, 3}}, + }, // struct tag "-" { @@ -691,6 +702,27 @@ func TestDecoderInByteSlice(t *testing.T) { } } +type unencodableDecoder func() + +func (f *unencodableDecoder) DecodeRLP(s *Stream) error { + if _, err := s.List(); err != nil { + return err + } + if err := s.ListEnd(); err != nil { + return err + } + *f = func() {} + return nil +} + +func TestDecoderFunc(t *testing.T) { + var x func() + if err := DecodeBytes([]byte{0xC0}, (*unencodableDecoder)(&x)); err != nil { + t.Fatal(err) + } + x() +} + func ExampleDecode() { input, _ := hex.DecodeString("C90A1486666F6F626172") diff --git a/rlp/encode.go b/rlp/encode.go index 445b4b5b2104..f255c38a9cfe 100644 --- a/rlp/encode.go +++ b/rlp/encode.go @@ -73,10 +73,12 @@ type Encoder interface { // An unsigned integer value is encoded as an RLP string. Zero always // encodes as an empty RLP string. Encode also supports *big.Int. // +// Boolean values are encoded as unsigned integers zero (false) and one (true). +// // An interface value encodes as the value contained in the interface. // -// Boolean values are not supported, nor are signed integers, floating -// point numbers, maps, channels and functions. +// Signed integers are not supported, nor are floating point numbers, maps, +// channels and functions. func Encode(w io.Writer, val interface{}) error { if outer, ok := w.(*encbuf); ok { // Encode was called by some type's EncodeRLP. @@ -180,11 +182,11 @@ func (w *encbuf) Write(b []byte) (int, error) { func (w *encbuf) encode(val interface{}) error { rval := reflect.ValueOf(val) - ti, err := cachedTypeInfo(rval.Type(), tags{}) + writer, err := cachedWriter(rval.Type()) if err != nil { return err } - return ti.writer(rval, w) + return writer(rval, w) } func (w *encbuf) encodeStringHeader(size int) { @@ -497,17 +499,17 @@ func writeInterface(val reflect.Value, w *encbuf) error { return nil } eval := val.Elem() - ti, err := cachedTypeInfo(eval.Type(), tags{}) + writer, err := cachedWriter(eval.Type()) if err != nil { return err } - return ti.writer(eval, w) + return writer(eval, w) } func makeSliceWriter(typ reflect.Type, ts tags) (writer, error) { - etypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{}) - if err != nil { - return nil, err + etypeinfo := cachedTypeInfo1(typ.Elem(), tags{}) + if etypeinfo.writerErr != nil { + return nil, etypeinfo.writerErr } writer := func(val reflect.Value, w *encbuf) error { if !ts.tail { @@ -543,9 +545,9 @@ func makeStructWriter(typ reflect.Type) (writer, error) { } func makePtrWriter(typ reflect.Type) (writer, error) { - etypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{}) - if err != nil { - return nil, err + etypeinfo := cachedTypeInfo1(typ.Elem(), tags{}) + if etypeinfo.writerErr != nil { + return nil, etypeinfo.writerErr } // determine nil pointer handler @@ -577,7 +579,7 @@ func makePtrWriter(typ reflect.Type) (writer, error) { } return etypeinfo.writer(val.Elem(), w) } - return writer, err + return writer, nil } // putint writes i to the beginning of b in big endian byte diff --git a/rlp/encode_test.go b/rlp/encode_test.go index 827960f7c15a..6e49b89a85af 100644 --- a/rlp/encode_test.go +++ b/rlp/encode_test.go @@ -49,6 +49,13 @@ func (e byteEncoder) EncodeRLP(w io.Writer) error { return nil } +type undecodableEncoder func() + +func (f undecodableEncoder) EncodeRLP(w io.Writer) error { + _, err := w.Write(EmptyList) + return err +} + type encodableReader struct { A, B uint } @@ -239,6 +246,8 @@ var encTests = []encTest{ {val: (*testEncoder)(nil), output: "00000000"}, {val: &testEncoder{}, output: "00010001000100010001"}, {val: &testEncoder{errors.New("test error")}, error: "test error"}, + // verify that the Encoder interface works for unsupported types like func(). + {val: undecodableEncoder(func() {}), output: "C0"}, // verify that pointer method testEncoder.EncodeRLP is called for // addressable non-pointer values. {val: &struct{ TE testEncoder }{testEncoder{}}, output: "CA00010001000100010001"}, diff --git a/rlp/typecache.go b/rlp/typecache.go index 8c2dd518e296..ab5ee3da76ba 100644 --- a/rlp/typecache.go +++ b/rlp/typecache.go @@ -29,8 +29,10 @@ var ( ) type typeinfo struct { - decoder - writer + decoder decoder + decoderErr error // error from makeDecoder + writer writer + writerErr error // error from makeWriter } // represents struct tags @@ -56,12 +58,22 @@ type decoder func(*Stream, reflect.Value) error type writer func(reflect.Value, *encbuf) error -func cachedTypeInfo(typ reflect.Type, tags tags) (*typeinfo, error) { +func cachedDecoder(typ reflect.Type) (decoder, error) { + info := cachedTypeInfo(typ, tags{}) + return info.decoder, info.decoderErr +} + +func cachedWriter(typ reflect.Type) (writer, error) { + info := cachedTypeInfo(typ, tags{}) + return info.writer, info.writerErr +} + +func cachedTypeInfo(typ reflect.Type, tags tags) *typeinfo { typeCacheMutex.RLock() info := typeCache[typekey{typ, tags}] typeCacheMutex.RUnlock() if info != nil { - return info, nil + return info } // not in the cache, need to generate info for this type. typeCacheMutex.Lock() @@ -69,25 +81,20 @@ func cachedTypeInfo(typ reflect.Type, tags tags) (*typeinfo, error) { return cachedTypeInfo1(typ, tags) } -func cachedTypeInfo1(typ reflect.Type, tags tags) (*typeinfo, error) { +func cachedTypeInfo1(typ reflect.Type, tags tags) *typeinfo { key := typekey{typ, tags} info := typeCache[key] if info != nil { // another goroutine got the write lock first - return info, nil + return info } // put a dummy value into the cache before generating. // if the generator tries to lookup itself, it will get // the dummy value and won't call itself recursively. - typeCache[key] = new(typeinfo) - info, err := genTypeInfo(typ, tags) - if err != nil { - // remove the dummy value if the generator fails - delete(typeCache, key) - return nil, err - } - *typeCache[key] = *info - return typeCache[key], err + info = new(typeinfo) + typeCache[key] = info + info.generate(typ, tags) + return info } type field struct { @@ -96,26 +103,24 @@ type field struct { } func structFields(typ reflect.Type) (fields []field, err error) { + lastPublic := lastPublicField(typ) for i := 0; i < typ.NumField(); i++ { if f := typ.Field(i); f.PkgPath == "" { // exported - tags, err := parseStructTag(typ, i) + tags, err := parseStructTag(typ, i, lastPublic) if err != nil { return nil, err } if tags.ignored { continue } - info, err := cachedTypeInfo1(f.Type, tags) - if err != nil { - return nil, err - } + info := cachedTypeInfo1(f.Type, tags) fields = append(fields, field{i, info}) } } return fields, nil } -func parseStructTag(typ reflect.Type, fi int) (tags, error) { +func parseStructTag(typ reflect.Type, fi, lastPublic int) (tags, error) { f := typ.Field(fi) var ts tags for _, t := range strings.Split(f.Tag.Get("rlp"), ",") { @@ -127,7 +132,7 @@ func parseStructTag(typ reflect.Type, fi int) (tags, error) { ts.nilOK = true case "tail": ts.tail = true - if fi != typ.NumField()-1 { + if fi != lastPublic { return ts, fmt.Errorf(`rlp: invalid struct tag "tail" for %v.%s (must be on last field)`, typ, f.Name) } if f.Type.Kind() != reflect.Slice { @@ -140,15 +145,19 @@ func parseStructTag(typ reflect.Type, fi int) (tags, error) { return ts, nil } -func genTypeInfo(typ reflect.Type, tags tags) (info *typeinfo, err error) { - info = new(typeinfo) - if info.decoder, err = makeDecoder(typ, tags); err != nil { - return nil, err - } - if info.writer, err = makeWriter(typ, tags); err != nil { - return nil, err +func lastPublicField(typ reflect.Type) int { + last := 0 + for i := 0; i < typ.NumField(); i++ { + if typ.Field(i).PkgPath == "" { + last = i + } } - return info, nil + return last +} + +func (i *typeinfo) generate(typ reflect.Type, tags tags) { + i.decoder, i.decoderErr = makeDecoder(typ, tags) + i.writer, i.writerErr = makeWriter(typ, tags) } func isUint(k reflect.Kind) bool { diff --git a/rpc/client.go b/rpc/client.go index d96189a2d8ea..4b65d0042186 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -18,18 +18,13 @@ package rpc import ( "bytes" - "container/list" "context" "encoding/json" "errors" "fmt" - "net" "net/url" - "os" "reflect" "strconv" - "strings" - "sync" "sync/atomic" "time" @@ -40,14 +35,14 @@ var ( ErrClientQuit = errors.New("client is closed") ErrNoResult = errors.New("no result in JSON-RPC response") ErrSubscriptionQueueOverflow = errors.New("subscription queue overflow") + errClientReconnected = errors.New("client reconnected") + errDead = errors.New("connection lost") ) const ( // Timeouts - tcpKeepAliveInterval = 30 * time.Second - defaultDialTimeout = 10 * time.Second // used when dialing if the context has no deadline - defaultWriteTimeout = 10 * time.Second // used for calls if the context has no deadline - subscribeTimeout = 5 * time.Second // overall timeout eth_subscribe, rpc_modules calls + defaultDialTimeout = 10 * time.Second // used if context has no deadline + subscribeTimeout = 5 * time.Second // overall timeout eth_subscribe, rpc_modules calls ) const ( @@ -77,55 +72,57 @@ type BatchElem struct { Error error } -// A value of this type can a JSON-RPC request, notification, successful response or -// error response. Which one it is depends on the fields. -type jsonrpcMessage struct { - Version string `json:"jsonrpc"` - ID json.RawMessage `json:"id,omitempty"` - Method string `json:"method,omitempty"` - Params json.RawMessage `json:"params,omitempty"` - Error *jsonError `json:"error,omitempty"` - Result json.RawMessage `json:"result,omitempty"` -} +// Client represents a connection to an RPC server. +type Client struct { + idgen func() ID // for subscriptions + isHTTP bool + services *serviceRegistry -func (msg *jsonrpcMessage) isNotification() bool { - return msg.ID == nil && msg.Method != "" -} + idCounter uint32 -func (msg *jsonrpcMessage) isResponse() bool { - return msg.hasValidID() && msg.Method == "" && len(msg.Params) == 0 -} + // This function, if non-nil, is called when the connection is lost. + reconnectFunc reconnectFunc -func (msg *jsonrpcMessage) hasValidID() bool { - return len(msg.ID) > 0 && msg.ID[0] != '{' && msg.ID[0] != '[' + // writeConn is used for writing to the connection on the caller's goroutine. It should + // only be accessed outside of dispatch, with the write lock held. The write lock is + // taken by sending on requestOp and released by sending on sendDone. + writeConn jsonWriter + + // for dispatch + close chan struct{} + closing chan struct{} // closed when client is quitting + didClose chan struct{} // closed when client quits + reconnected chan ServerCodec // where write/reconnect sends the new connection + readOp chan readOp // read messages + readErr chan error // errors from read + reqInit chan *requestOp // register response IDs, takes write lock + reqSent chan error // signals write completion, releases write lock + reqTimeout chan *requestOp // removes response IDs when call timeout expires } -func (msg *jsonrpcMessage) String() string { - b, _ := json.Marshal(msg) - return string(b) +type reconnectFunc func(ctx context.Context) (ServerCodec, error) + +type clientContextKey struct{} + +type clientConn struct { + codec ServerCodec + handler *handler } -// Client represents a connection to an RPC server. -type Client struct { - idCounter uint32 - connectFunc func(ctx context.Context) (net.Conn, error) - isHTTP bool +func (c *Client) newClientConn(conn ServerCodec) *clientConn { + ctx := context.WithValue(context.Background(), clientContextKey{}, c) + handler := newHandler(ctx, conn, c.idgen, c.services) + return &clientConn{conn, handler} +} - // writeConn is only safe to access outside dispatch, with the - // write lock held. The write lock is taken by sending on - // requestOp and released by sending on sendDone. - writeConn net.Conn +func (cc *clientConn) close(err error, inflightReq *requestOp) { + cc.handler.close(err, inflightReq) + cc.codec.Close() +} - // for dispatch - close chan struct{} - didQuit chan struct{} // closed when client quits - reconnected chan net.Conn // where write/reconnect sends the new connection - readErr chan error // errors from read - readResp chan []*jsonrpcMessage // valid messages from read - requestOp chan *requestOp // for registering response IDs - sendDone chan error // signals write completion, releases write lock - respWait map[string]*requestOp // active requests - subs map[string]*ClientSubscription // active subscriptions +type readOp struct { + msgs []*jsonrpcMessage + batch bool } type requestOp struct { @@ -135,9 +132,16 @@ type requestOp struct { sub *ClientSubscription // only set for EthSubscribe requests } -func (op *requestOp) wait(ctx context.Context) (*jsonrpcMessage, error) { +func (op *requestOp) wait(ctx context.Context, c *Client) (*jsonrpcMessage, error) { select { case <-ctx.Done(): + // Send the timeout to dispatch so it can remove the request IDs. + if !c.isHTTP { + select { + case c.reqTimeout <- op: + case <-c.closing: + } + } return nil, ctx.Err() case resp := <-op.resp: return resp, op.err @@ -181,74 +185,57 @@ func DialContext(ctx context.Context, rawurl string) (*Client, error) { } } -type StdIOConn struct{} - -func (io StdIOConn) Read(b []byte) (n int, err error) { - return os.Stdin.Read(b) -} - -func (io StdIOConn) Write(b []byte) (n int, err error) { - return os.Stdout.Write(b) -} - -func (io StdIOConn) Close() error { - return nil -} - -func (io StdIOConn) LocalAddr() net.Addr { - return &net.UnixAddr{Name: "stdio", Net: "stdio"} -} - -func (io StdIOConn) RemoteAddr() net.Addr { - return &net.UnixAddr{Name: "stdio", Net: "stdio"} -} - -func (io StdIOConn) SetDeadline(t time.Time) error { - return &net.OpError{Op: "set", Net: "stdio", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} -} - -func (io StdIOConn) SetReadDeadline(t time.Time) error { - return &net.OpError{Op: "set", Net: "stdio", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} -} - -func (io StdIOConn) SetWriteDeadline(t time.Time) error { - return &net.OpError{Op: "set", Net: "stdio", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} -} -func DialStdIO(ctx context.Context) (*Client, error) { - return newClient(ctx, func(_ context.Context) (net.Conn, error) { - return StdIOConn{}, nil - }) +// Client retrieves the client from the context, if any. This can be used to perform +// 'reverse calls' in a handler method. +func ClientFromContext(ctx context.Context) (*Client, bool) { + client, ok := ctx.Value(clientContextKey{}).(*Client) + return client, ok } -func newClient(initctx context.Context, connectFunc func(context.Context) (net.Conn, error)) (*Client, error) { - conn, err := connectFunc(initctx) +func newClient(initctx context.Context, connect reconnectFunc) (*Client, error) { + conn, err := connect(initctx) if err != nil { return nil, err } + c := initClient(conn, randomIDGenerator(), new(serviceRegistry)) + c.reconnectFunc = connect + return c, nil +} + +func initClient(conn ServerCodec, idgen func() ID, services *serviceRegistry) *Client { _, isHTTP := conn.(*httpConn) c := &Client{ - writeConn: conn, + idgen: idgen, isHTTP: isHTTP, - connectFunc: connectFunc, + services: services, + writeConn: conn, close: make(chan struct{}), - didQuit: make(chan struct{}), - reconnected: make(chan net.Conn), + closing: make(chan struct{}), + didClose: make(chan struct{}), + reconnected: make(chan ServerCodec), + readOp: make(chan readOp), readErr: make(chan error), - readResp: make(chan []*jsonrpcMessage), - requestOp: make(chan *requestOp), - sendDone: make(chan error, 1), - respWait: make(map[string]*requestOp), - subs: make(map[string]*ClientSubscription), + reqInit: make(chan *requestOp), + reqSent: make(chan error, 1), + reqTimeout: make(chan *requestOp), } if !isHTTP { go c.dispatch(conn) } - return c, nil + return c +} + +// RegisterName creates a service for the given receiver type under the given name. When no +// methods on the given receiver match the criteria to be either a RPC method or a +// subscription an error is returned. Otherwise a new service is created and added to the +// service collection this client provides to the server. +func (c *Client) RegisterName(name string, receiver interface{}) error { + return c.services.registerName(name, receiver) } func (c *Client) nextID() json.RawMessage { id := atomic.AddUint32(&c.idCounter, 1) - return []byte(strconv.FormatUint(uint64(id), 10)) + return strconv.AppendUint(nil, uint64(id), 10) } // SupportedModules calls the rpc_modules method, retrieving the list of @@ -268,8 +255,8 @@ func (c *Client) Close() { } select { case c.close <- struct{}{}: - <-c.didQuit - case <-c.didQuit: + <-c.didClose + case <-c.didClose: } } @@ -305,7 +292,7 @@ func (c *Client) CallContext(ctx context.Context, result interface{}, method str } // dispatch has accepted the request and will close the channel when it quits. - switch resp, err := op.wait(ctx); { + switch resp, err := op.wait(ctx, c); { case err != nil: return err case resp.Error != nil: @@ -363,7 +350,7 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { // Wait for all responses to come back. for n := 0; n < len(b) && err == nil; n++ { var resp *jsonrpcMessage - resp, err = op.wait(ctx) + resp, err = op.wait(ctx, c) if err != nil { break } @@ -390,6 +377,22 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { return err } +// Notify sends a notification, i.e. a method call that doesn't expect a response. +func (c *Client) Notify(ctx context.Context, method string, args ...interface{}) error { + op := new(requestOp) + msg, err := c.newMessage(method, args...) + if err != nil { + return err + } + msg.ID = nil + + if c.isHTTP { + return c.sendHTTP(ctx, op, msg) + } else { + return c.send(ctx, op, msg) + } +} + // EthSubscribe registers a subscripion under the "eth" namespace. func (c *Client) EthSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) { return c.Subscribe(ctx, "eth", channel, args...) @@ -408,7 +411,7 @@ func (c *Client) ShhSubscribe(ctx context.Context, channel interface{}, args ... // The context argument cancels the RPC request that sets up the subscription but has no // effect on the subscription after Subscribe has returned. // -// Slow subscribers will be dropped eventually. Client buffers up to 8000 notifications +// Slow subscribers will be dropped eventually. Client buffers up to 20000 notifications // before considering the subscriber dead. The subscription Err channel will receive // ErrSubscriptionQueueOverflow. Use a sufficiently large buffer on the channel or ensure // that the channel usually has at least one reader to prevent this issue. @@ -440,54 +443,48 @@ func (c *Client) Subscribe(ctx context.Context, namespace string, channel interf if err := c.send(ctx, op, msg); err != nil { return nil, err } - if _, err := op.wait(ctx); err != nil { + if _, err := op.wait(ctx, c); err != nil { return nil, err } return op.sub, nil } func (c *Client) newMessage(method string, paramsIn ...interface{}) (*jsonrpcMessage, error) { - params, err := json.Marshal(paramsIn) - if err != nil { - return nil, err + msg := &jsonrpcMessage{Version: vsn, ID: c.nextID(), Method: method} + if paramsIn != nil { // prevent sending "params":null + var err error + if msg.Params, err = json.Marshal(paramsIn); err != nil { + return nil, err + } } - return &jsonrpcMessage{Version: "2.0", ID: c.nextID(), Method: method, Params: params}, nil + return msg, nil } // send registers op with the dispatch loop, then sends msg on the connection. // if sending fails, op is deregistered. func (c *Client) send(ctx context.Context, op *requestOp, msg interface{}) error { select { - case c.requestOp <- op: - log.Trace("", "msg", log.Lazy{Fn: func() string { - return fmt.Sprint("sending ", msg) - }}) + case c.reqInit <- op: err := c.write(ctx, msg) - c.sendDone <- err + c.reqSent <- err return err case <-ctx.Done(): // This can happen if the client is overloaded or unable to keep up with // subscription notifications. return ctx.Err() - case <-c.didQuit: + case <-c.closing: return ErrClientQuit } } func (c *Client) write(ctx context.Context, msg interface{}) error { - deadline, ok := ctx.Deadline() - if !ok { - deadline = time.Now().Add(defaultWriteTimeout) - } // The previous write failed. Try to establish a new connection. if c.writeConn == nil { if err := c.reconnect(ctx); err != nil { return err } } - c.writeConn.SetWriteDeadline(deadline) - err := json.NewEncoder(c.writeConn).Encode(msg) - c.writeConn.SetWriteDeadline(time.Time{}) + err := c.writeConn.Write(ctx, msg) if err != nil { c.writeConn = nil } @@ -495,16 +492,25 @@ func (c *Client) write(ctx context.Context, msg interface{}) error { } func (c *Client) reconnect(ctx context.Context) error { - newconn, err := c.connectFunc(ctx) + if c.reconnectFunc == nil { + return errDead + } + + if _, ok := ctx.Deadline(); !ok { + var cancel func() + ctx, cancel = context.WithTimeout(ctx, defaultDialTimeout) + defer cancel() + } + newconn, err := c.reconnectFunc(ctx) if err != nil { - log.Trace(fmt.Sprintf("reconnect failed: %v", err)) + log.Trace("RPC client reconnect failed", "err", err) return err } select { case c.reconnected <- newconn: c.writeConn = newconn return nil - case <-c.didQuit: + case <-c.didClose: newconn.Close() return ErrClientQuit } @@ -513,321 +519,107 @@ func (c *Client) reconnect(ctx context.Context) error { // dispatch is the main loop of the client. // It sends read messages to waiting calls to Call and BatchCall // and subscription notifications to registered subscriptions. -func (c *Client) dispatch(conn net.Conn) { - // Spawn the initial read loop. - go c.read(conn) - +func (c *Client) dispatch(codec ServerCodec) { var ( - lastOp *requestOp // tracks last send operation - requestOpLock = c.requestOp // nil while the send lock is held - reading = true // if true, a read loop is running + lastOp *requestOp // tracks last send operation + reqInitLock = c.reqInit // nil while the send lock is held + conn = c.newClientConn(codec) + reading = true ) - defer close(c.didQuit) defer func() { - c.closeRequestOps(ErrClientQuit) - conn.Close() + close(c.closing) if reading { - // Empty read channels until read is dead. - for { - select { - case <-c.readResp: - case <-c.readErr: - return - } - } + conn.close(ErrClientQuit, nil) + c.drainRead() } + close(c.didClose) }() + // Spawn the initial read loop. + go c.read(codec) + for { select { case <-c.close: return - // Read path. - case batch := <-c.readResp: - for _, msg := range batch { - switch { - case msg.isNotification(): - log.Trace("", "msg", log.Lazy{Fn: func() string { - return fmt.Sprint("<-readResp: notification ", msg) - }}) - c.handleNotification(msg) - case msg.isResponse(): - log.Trace("", "msg", log.Lazy{Fn: func() string { - return fmt.Sprint("<-readResp: response ", msg) - }}) - c.handleResponse(msg) - default: - log.Debug("", "msg", log.Lazy{Fn: func() string { - return fmt.Sprint("<-readResp: dropping weird message", msg) - }}) - // TODO: maybe close - } + // Read path: + case op := <-c.readOp: + if op.batch { + conn.handler.handleBatch(op.msgs) + } else { + conn.handler.handleMsg(op.msgs[0]) } case err := <-c.readErr: - log.Debug("<-readErr", "err", err) - c.closeRequestOps(err) - conn.Close() + conn.handler.log.Debug("RPC connection read error", "err", err) + conn.close(err, lastOp) reading = false - case newconn := <-c.reconnected: - log.Debug("<-reconnected", "reading", reading, "remote", conn.RemoteAddr()) + // Reconnect: + case newcodec := <-c.reconnected: + log.Debug("RPC client reconnected", "reading", reading, "conn", newcodec.RemoteAddr()) if reading { - // Wait for the previous read loop to exit. This is a rare case. - conn.Close() - <-c.readErr + // Wait for the previous read loop to exit. This is a rare case which + // happens if this loop isn't notified in time after the connection breaks. + // In those cases the caller will notice first and reconnect. Closing the + // handler terminates all waiting requests (closing op.resp) except for + // lastOp, which will be transferred to the new handler. + conn.close(errClientReconnected, lastOp) + c.drainRead() } - go c.read(newconn) + go c.read(newcodec) reading = true - conn = newconn - - // Send path. - case op := <-requestOpLock: - // Stop listening for further send ops until the current one is done. - requestOpLock = nil + conn = c.newClientConn(newcodec) + // Re-register the in-flight request on the new handler + // because that's where it will be sent. + conn.handler.addRequestOp(lastOp) + + // Send path: + case op := <-reqInitLock: + // Stop listening for further requests until the current one has been sent. + reqInitLock = nil lastOp = op - for _, id := range op.ids { - c.respWait[string(id)] = op - } + conn.handler.addRequestOp(op) - case err := <-c.sendDone: + case err := <-c.reqSent: if err != nil { - // Remove response handlers for the last send. We remove those here - // because the error is already handled in Call or BatchCall. When the - // read loop goes down, it will signal all other current operations. - for _, id := range lastOp.ids { - delete(c.respWait, string(id)) - } + // Remove response handlers for the last send. When the read loop + // goes down, it will signal all other current operations. + conn.handler.removeRequestOp(lastOp) } - // Listen for send ops again. - requestOpLock = c.requestOp + // Let the next request in. + reqInitLock = c.reqInit lastOp = nil - } - } -} - -// closeRequestOps unblocks pending send ops and active subscriptions. -func (c *Client) closeRequestOps(err error) { - didClose := make(map[*requestOp]bool) - for id, op := range c.respWait { - // Remove the op so that later calls will not close op.resp again. - delete(c.respWait, id) - - if !didClose[op] { - op.err = err - close(op.resp) - didClose[op] = true + case op := <-c.reqTimeout: + conn.handler.removeRequestOp(op) } } - for id, sub := range c.subs { - delete(c.subs, id) - sub.quitWithError(err, false) - } -} - -func (c *Client) handleNotification(msg *jsonrpcMessage) { - if !strings.HasSuffix(msg.Method, notificationMethodSuffix) { - log.Debug("dropping non-subscription message", "msg", msg) - return - } - var subResult struct { - ID string `json:"subscription"` - Result json.RawMessage `json:"result"` - } - if err := json.Unmarshal(msg.Params, &subResult); err != nil { - log.Debug("dropping invalid subscription message", "msg", msg) - return - } - if c.subs[subResult.ID] != nil { - c.subs[subResult.ID].deliver(subResult.Result) - } -} - -func (c *Client) handleResponse(msg *jsonrpcMessage) { - op := c.respWait[string(msg.ID)] - if op == nil { - log.Debug("unsolicited response", "msg", msg) - return - } - delete(c.respWait, string(msg.ID)) - // For normal responses, just forward the reply to Call/BatchCall. - if op.sub == nil { - op.resp <- msg - return - } - // For subscription responses, start the subscription if the server - // indicates success. EthSubscribe gets unblocked in either case through - // the op.resp channel. - defer close(op.resp) - if msg.Error != nil { - op.err = msg.Error - return - } - if op.err = json.Unmarshal(msg.Result, &op.sub.subid); op.err == nil { - go op.sub.start() - c.subs[op.sub.subid] = op.sub - } } -// Reading happens on a dedicated goroutine. - -func (c *Client) read(conn net.Conn) error { - var ( - buf json.RawMessage - dec = json.NewDecoder(conn) - ) - readMessage := func() (rs []*jsonrpcMessage, err error) { - buf = buf[:0] - if err = dec.Decode(&buf); err != nil { - return nil, err - } - if isBatch(buf) { - err = json.Unmarshal(buf, &rs) - } else { - rs = make([]*jsonrpcMessage, 1) - err = json.Unmarshal(buf, &rs[0]) - } - return rs, err - } - +// drainRead drops read messages until an error occurs. +func (c *Client) drainRead() { for { - resp, err := readMessage() - if err != nil { - c.readErr <- err - return err - } - c.readResp <- resp - } -} - -// Subscriptions. - -// A ClientSubscription represents a subscription established through EthSubscribe. -type ClientSubscription struct { - client *Client - etype reflect.Type - channel reflect.Value - namespace string - subid string - in chan json.RawMessage - - quitOnce sync.Once // ensures quit is closed once - quit chan struct{} // quit is closed when the subscription exits - errOnce sync.Once // ensures err is closed once - err chan error -} - -func newClientSubscription(c *Client, namespace string, channel reflect.Value) *ClientSubscription { - sub := &ClientSubscription{ - client: c, - namespace: namespace, - etype: channel.Type().Elem(), - channel: channel, - quit: make(chan struct{}), - err: make(chan error, 1), - in: make(chan json.RawMessage), - } - return sub -} - -// Err returns the subscription error channel. The intended use of Err is to schedule -// resubscription when the client connection is closed unexpectedly. -// -// The error channel receives a value when the subscription has ended due -// to an error. The received error is nil if Close has been called -// on the underlying client and no other error has occurred. -// -// The error channel is closed when Unsubscribe is called on the subscription. -func (sub *ClientSubscription) Err() <-chan error { - return sub.err -} - -// Unsubscribe unsubscribes the notification and closes the error channel. -// It can safely be called more than once. -func (sub *ClientSubscription) Unsubscribe() { - sub.quitWithError(nil, true) - sub.errOnce.Do(func() { close(sub.err) }) -} - -func (sub *ClientSubscription) quitWithError(err error, unsubscribeServer bool) { - sub.quitOnce.Do(func() { - // The dispatch loop won't be able to execute the unsubscribe call - // if it is blocked on deliver. Close sub.quit first because it - // unblocks deliver. - close(sub.quit) - if unsubscribeServer { - sub.requestUnsubscribe() - } - if err != nil { - if err == ErrClientQuit { - err = nil // Adhere to subscription semantics. - } - sub.err <- err + select { + case <-c.readOp: + case <-c.readErr: + return } - }) -} - -func (sub *ClientSubscription) deliver(result json.RawMessage) (ok bool) { - select { - case sub.in <- result: - return true - case <-sub.quit: - return false } } -func (sub *ClientSubscription) start() { - sub.quitWithError(sub.forward()) -} - -func (sub *ClientSubscription) forward() (err error, unsubscribeServer bool) { - cases := []reflect.SelectCase{ - {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.quit)}, - {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.in)}, - {Dir: reflect.SelectSend, Chan: sub.channel}, - } - buffer := list.New() - defer buffer.Init() +// read decodes RPC messages from a codec, feeding them into dispatch. +func (c *Client) read(codec ServerCodec) { for { - var chosen int - var recv reflect.Value - if buffer.Len() == 0 { - // Idle, omit send case. - chosen, recv, _ = reflect.Select(cases[:2]) - } else { - // Non-empty buffer, send the first queued item. - cases[2].Send = reflect.ValueOf(buffer.Front().Value) - chosen, recv, _ = reflect.Select(cases) + msgs, batch, err := codec.Read() + if _, ok := err.(*json.SyntaxError); ok { + codec.Write(context.Background(), errorMessage(&parseError{err.Error()})) } - - switch chosen { - case 0: // <-sub.quit - return nil, false - case 1: // <-sub.in - val, err := sub.unmarshal(recv.Interface().(json.RawMessage)) - if err != nil { - return err, true - } - if buffer.Len() == maxClientSubscriptionBuffer { - return ErrSubscriptionQueueOverflow, true - } - buffer.PushBack(val) - case 2: // sub.channel<- - cases[2].Send = reflect.Value{} // Don't hold onto the value. - buffer.Remove(buffer.Front()) + if err != nil { + c.readErr <- err + return } + c.readOp <- readOp{msgs, batch} } } - -func (sub *ClientSubscription) unmarshal(result json.RawMessage) (interface{}, error) { - val := reflect.New(sub.etype) - err := json.Unmarshal(result, val.Interface()) - return val.Elem().Interface(), err -} - -func (sub *ClientSubscription) requestUnsubscribe() error { - var result interface{} - return sub.client.Call(&result, sub.namespace+unsubscribeMethodSuffix, sub.subid) -} diff --git a/rpc/client_example_test.go b/rpc/client_example_test.go index 9c21c12d5dff..3bb8717b8061 100644 --- a/rpc/client_example_test.go +++ b/rpc/client_example_test.go @@ -25,7 +25,7 @@ import ( "github.com/ethereum/go-ethereum/rpc" ) -// In this example, our client whishes to track the latest 'block number' +// In this example, our client wishes to track the latest 'block number' // known to the server. The server supports two methods: // // eth_getBlockByNumber("latest", {}) diff --git a/rpc/client_test.go b/rpc/client_test.go index 4f354d389e74..759933f8c661 100644 --- a/rpc/client_test.go +++ b/rpc/client_test.go @@ -35,13 +35,13 @@ import ( ) func TestClientRequest(t *testing.T) { - server := newTestServer("service", new(Service)) + server := newTestServer() defer server.Stop() client := DialInProc(server) defer client.Close() var resp Result - if err := client.Call(&resp, "service_echo", "hello", 10, &Args{"world"}); err != nil { + if err := client.Call(&resp, "test_echo", "hello", 10, &Args{"world"}); err != nil { t.Fatal(err) } if !reflect.DeepEqual(resp, Result{"hello", 10, &Args{"world"}}) { @@ -50,19 +50,19 @@ func TestClientRequest(t *testing.T) { } func TestClientBatchRequest(t *testing.T) { - server := newTestServer("service", new(Service)) + server := newTestServer() defer server.Stop() client := DialInProc(server) defer client.Close() batch := []BatchElem{ { - Method: "service_echo", + Method: "test_echo", Args: []interface{}{"hello", 10, &Args{"world"}}, Result: new(Result), }, { - Method: "service_echo", + Method: "test_echo", Args: []interface{}{"hello2", 11, &Args{"world"}}, Result: new(Result), }, @@ -77,12 +77,12 @@ func TestClientBatchRequest(t *testing.T) { } wantResult := []BatchElem{ { - Method: "service_echo", + Method: "test_echo", Args: []interface{}{"hello", 10, &Args{"world"}}, Result: &Result{"hello", 10, &Args{"world"}}, }, { - Method: "service_echo", + Method: "test_echo", Args: []interface{}{"hello2", 11, &Args{"world"}}, Result: &Result{"hello2", 11, &Args{"world"}}, }, @@ -90,7 +90,7 @@ func TestClientBatchRequest(t *testing.T) { Method: "no_such_method", Args: []interface{}{1, 2, 3}, Result: new(int), - Error: &jsonError{Code: -32601, Message: "The method no_such_method_ does not exist/is not available"}, + Error: &jsonError{Code: -32601, Message: "the method no_such_method does not exist/is not available"}, }, } if !reflect.DeepEqual(batch, wantResult) { @@ -98,6 +98,17 @@ func TestClientBatchRequest(t *testing.T) { } } +func TestClientNotify(t *testing.T) { + server := newTestServer() + defer server.Stop() + client := DialInProc(server) + defer client.Close() + + if err := client.Notify(context.Background(), "test_echo", "hello", 10, &Args{"world"}); err != nil { + t.Fatal(err) + } +} + // func TestClientCancelInproc(t *testing.T) { testClientCancel("inproc", t) } func TestClientCancelWebsocket(t *testing.T) { testClientCancel("ws", t) } func TestClientCancelHTTP(t *testing.T) { testClientCancel("http", t) } @@ -106,7 +117,12 @@ func TestClientCancelIPC(t *testing.T) { testClientCancel("ipc", t) } // This test checks that requests made through CallContext can be canceled by canceling // the context. func testClientCancel(transport string, t *testing.T) { - server := newTestServer("service", new(Service)) + // These tests take a lot of time, run them all at once. + // You probably want to run with -parallel 1 or comment out + // the call to t.Parallel if you enable the logging. + t.Parallel() + + server := newTestServer() defer server.Stop() // What we want to achieve is that the context gets canceled @@ -142,11 +158,6 @@ func testClientCancel(transport string, t *testing.T) { panic("unknown transport: " + transport) } - // These tests take a lot of time, run them all at once. - // You probably want to run with -parallel 1 or comment out - // the call to t.Parallel if you enable the logging. - t.Parallel() - // The actual test starts here. var ( wg sync.WaitGroup @@ -174,7 +185,8 @@ func testClientCancel(transport string, t *testing.T) { } // Now perform a call with the context. // The key thing here is that no call will ever complete successfully. - err := client.CallContext(ctx, nil, "service_sleep", 2*maxContextCancelTimeout) + sleepTime := maxContextCancelTimeout + 20*time.Millisecond + err := client.CallContext(ctx, nil, "test_sleep", sleepTime) if err != nil { log.Debug(fmt.Sprint("got expected error:", err)) } else { @@ -191,7 +203,7 @@ func testClientCancel(transport string, t *testing.T) { } func TestClientSubscribeInvalidArg(t *testing.T) { - server := newTestServer("service", new(Service)) + server := newTestServer() defer server.Stop() client := DialInProc(server) defer client.Close() @@ -221,14 +233,14 @@ func TestClientSubscribeInvalidArg(t *testing.T) { } func TestClientSubscribe(t *testing.T) { - server := newTestServer("eth", new(NotificationTestService)) + server := newTestServer() defer server.Stop() client := DialInProc(server) defer client.Close() nc := make(chan int) count := 10 - sub, err := client.EthSubscribe(context.Background(), nc, "someSubscription", count, 0) + sub, err := client.Subscribe(context.Background(), "nftest", nc, "someSubscription", count, 0) if err != nil { t.Fatal("can't subscribe:", err) } @@ -251,46 +263,17 @@ func TestClientSubscribe(t *testing.T) { } } -func TestClientSubscribeCustomNamespace(t *testing.T) { - namespace := "custom" - server := newTestServer(namespace, new(NotificationTestService)) - defer server.Stop() - client := DialInProc(server) - defer client.Close() - - nc := make(chan int) - count := 10 - sub, err := client.Subscribe(context.Background(), namespace, nc, "someSubscription", count, 0) - if err != nil { - t.Fatal("can't subscribe:", err) - } - for i := 0; i < count; i++ { - if val := <-nc; val != i { - t.Fatalf("value mismatch: got %d, want %d", val, i) - } - } - - sub.Unsubscribe() - select { - case v := <-nc: - t.Fatal("received value after unsubscribe:", v) - case err := <-sub.Err(): - if err != nil { - t.Fatalf("Err returned a non-nil error after explicit unsubscribe: %q", err) - } - case <-time.After(1 * time.Second): - t.Fatalf("subscription not closed within 1s after unsubscribe") - } -} - -// In this test, the connection drops while EthSubscribe is -// waiting for a response. +// In this test, the connection drops while Subscribe is waiting for a response. func TestClientSubscribeClose(t *testing.T) { - service := &NotificationTestService{ + server := newTestServer() + service := ¬ificationTestService{ gotHangSubscriptionReq: make(chan struct{}), unblockHangSubscription: make(chan struct{}), } - server := newTestServer("eth", service) + if err := server.RegisterName("nftest2", service); err != nil { + t.Fatal(err) + } + defer server.Stop() client := DialInProc(server) defer client.Close() @@ -302,7 +285,7 @@ func TestClientSubscribeClose(t *testing.T) { err error ) go func() { - sub, err = client.EthSubscribe(context.Background(), nc, "hangSubscription", 999) + sub, err = client.Subscribe(context.Background(), "nftest2", nc, "hangSubscription", 999) errc <- err }() @@ -313,20 +296,43 @@ func TestClientSubscribeClose(t *testing.T) { select { case err := <-errc: if err == nil { - t.Errorf("EthSubscribe returned nil error after Close") + t.Errorf("Subscribe returned nil error after Close") } if sub != nil { - t.Error("EthSubscribe returned non-nil subscription after Close") + t.Error("Subscribe returned non-nil subscription after Close") } case <-time.After(1 * time.Second): - t.Fatalf("EthSubscribe did not return within 1s after Close") + t.Fatalf("Subscribe did not return within 1s after Close") + } +} + +// This test reproduces https://github.com/ethereum/go-ethereum/issues/17837 where the +// client hangs during shutdown when Unsubscribe races with Client.Close. +func TestClientCloseUnsubscribeRace(t *testing.T) { + server := newTestServer() + defer server.Stop() + + for i := 0; i < 20; i++ { + client := DialInProc(server) + nc := make(chan int) + sub, err := client.Subscribe(context.Background(), "nftest", nc, "someSubscription", 3, 1) + if err != nil { + t.Fatal(err) + } + go client.Close() + go sub.Unsubscribe() + select { + case <-sub.Err(): + case <-time.After(5 * time.Second): + t.Fatal("subscription not closed within timeout") + } } } // This test checks that Client doesn't lock up when a single subscriber // doesn't read subscription events. func TestClientNotificationStorm(t *testing.T) { - server := newTestServer("eth", new(NotificationTestService)) + server := newTestServer() defer server.Stop() doTest := func(count int, wantError bool) { @@ -338,7 +344,7 @@ func TestClientNotificationStorm(t *testing.T) { // Subscribe on the server. It will start sending many notifications // very quickly. nc := make(chan int) - sub, err := client.EthSubscribe(ctx, nc, "someSubscription", count, 0) + sub, err := client.Subscribe(ctx, "nftest", nc, "someSubscription", count, 0) if err != nil { t.Fatal("can't subscribe:", err) } @@ -360,7 +366,7 @@ func TestClientNotificationStorm(t *testing.T) { return } var r int - err := client.CallContext(ctx, &r, "eth_echo", i) + err := client.CallContext(ctx, &r, "nftest_echo", i) if err != nil { if !wantError { t.Fatalf("(%d/%d) call error: %v", i, count, err) @@ -368,14 +374,17 @@ func TestClientNotificationStorm(t *testing.T) { return } } + if wantError { + t.Fatalf("didn't get expected error") + } } doTest(8000, false) - doTest(10000, true) + doTest(21000, true) } func TestClientHTTP(t *testing.T) { - server := newTestServer("service", new(Service)) + server := newTestServer() defer server.Stop() client, hs := httpTestClient(server, "http", nil) @@ -392,7 +401,7 @@ func TestClientHTTP(t *testing.T) { for i := range results { i := i go func() { - errc <- client.Call(&results[i], "service_echo", + errc <- client.Call(&results[i], "test_echo", wantResult.String, wantResult.Int, wantResult.Args) }() } @@ -421,16 +430,16 @@ func TestClientHTTP(t *testing.T) { func TestClientReconnect(t *testing.T) { startServer := func(addr string) (*Server, net.Listener) { - srv := newTestServer("service", new(Service)) + srv := newTestServer() l, err := net.Listen("tcp", addr) if err != nil { - t.Fatal(err) + t.Fatal("can't listen:", err) } go http.Serve(l, srv.WebsocketHandler([]string{"*"})) return srv, l } - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second) defer cancel() // Start a server and corresponding client. @@ -442,21 +451,22 @@ func TestClientReconnect(t *testing.T) { // Perform a call. This should work because the server is up. var resp Result - if err := client.CallContext(ctx, &resp, "service_echo", "", 1, nil); err != nil { + if err := client.CallContext(ctx, &resp, "test_echo", "", 1, nil); err != nil { t.Fatal(err) } - // Shut down the server and try calling again. It shouldn't work. + // Shut down the server and allow for some cool down time so we can listen on the same + // address again. l1.Close() s1.Stop() - if err := client.CallContext(ctx, &resp, "service_echo", "", 2, nil); err == nil { + time.Sleep(2 * time.Second) + + // Try calling again. It shouldn't work. + if err := client.CallContext(ctx, &resp, "test_echo", "", 2, nil); err == nil { t.Error("successful call while the server is down") t.Logf("resp: %#v", resp) } - // Allow for some cool down time so we can listen on the same address again. - time.Sleep(2 * time.Second) - // Start it up again and call again. The connection should be reestablished. // We spawn multiple calls here to check whether this hangs somehow. s2, l2 := startServer(l1.Addr().String()) @@ -469,7 +479,7 @@ func TestClientReconnect(t *testing.T) { go func() { <-start var resp Result - errors <- client.CallContext(ctx, &resp, "service_echo", "", 3, nil) + errors <- client.CallContext(ctx, &resp, "test_echo", "", 3, nil) }() } close(start) @@ -479,20 +489,12 @@ func TestClientReconnect(t *testing.T) { errcount++ } } - t.Log("err:", err) + t.Logf("%d errors, last error: %v", errcount, err) if errcount > 1 { t.Errorf("expected one error after disconnect, got %d", errcount) } } -func newTestServer(serviceName string, service interface{}) *Server { - server := NewServer() - if err := server.RegisterName(serviceName, service); err != nil { - panic(err) - } - return server -} - func httpTestClient(srv *Server, transport string, fl *flakeyListener) (*Client, *httptest.Server) { // Create the HTTP server. var hs *httptest.Server diff --git a/rpc/constants_unix.go b/rpc/constants_unix.go new file mode 100644 index 000000000000..2f98d6499b7a --- /dev/null +++ b/rpc/constants_unix.go @@ -0,0 +1,33 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris + +package rpc + +/* +#include + +int max_socket_path_size() { +struct sockaddr_un s; +return sizeof(s.sun_path); +} +*/ +import "C" + +var ( + max_path_size = C.max_socket_path_size() +) diff --git a/rpc/constants_unix_nocgo.go b/rpc/constants_unix_nocgo.go new file mode 100644 index 000000000000..ecb231f92714 --- /dev/null +++ b/rpc/constants_unix_nocgo.go @@ -0,0 +1,25 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// +build !cgo,!windows + +package rpc + +var ( + // On Linux, sun_path is 108 bytes in size + // see http://man7.org/linux/man-pages/man7/unix.7.html + max_path_size = 108 +) diff --git a/rpc/doc.go b/rpc/doc.go index 9a6c4abbceff..e5840c32d3f6 100644 --- a/rpc/doc.go +++ b/rpc/doc.go @@ -15,43 +15,49 @@ // along with the go-ethereum library. If not, see . /* -Package rpc provides access to the exported methods of an object across a network -or other I/O connection. After creating a server instance objects can be registered, -making it visible from the outside. Exported methods that follow specific -conventions can be called remotely. It also has support for the publish/subscribe -pattern. + +Package rpc implements bi-directional JSON-RPC 2.0 on multiple transports. + +It provides access to the exported methods of an object across a network or other I/O +connection. After creating a server or client instance, objects can be registered to make +them visible as 'services'. Exported methods that follow specific conventions can be +called remotely. It also has support for the publish/subscribe pattern. + +RPC Methods Methods that satisfy the following criteria are made available for remote access: - - object must be exported + - method must be exported - method returns 0, 1 (response or error) or 2 (response and error) values - method argument(s) must be exported or builtin types - method returned value(s) must be exported or builtin types An example method: + func (s *CalcService) Add(a, b int) (int, error) -When the returned error isn't nil the returned integer is ignored and the error is -send back to the client. Otherwise the returned integer is send back to the client. +When the returned error isn't nil the returned integer is ignored and the error is sent +back to the client. Otherwise the returned integer is sent back to the client. -Optional arguments are supported by accepting pointer values as arguments. E.g. -if we want to do the addition in an optional finite field we can accept a mod -argument as pointer value. +Optional arguments are supported by accepting pointer values as arguments. E.g. if we want +to do the addition in an optional finite field we can accept a mod argument as pointer +value. - func (s *CalService) Add(a, b int, mod *int) (int, error) + func (s *CalcService) Add(a, b int, mod *int) (int, error) -This RPC method can be called with 2 integers and a null value as third argument. -In that case the mod argument will be nil. Or it can be called with 3 integers, -in that case mod will be pointing to the given third argument. Since the optional -argument is the last argument the RPC package will also accept 2 integers as -arguments. It will pass the mod argument as nil to the RPC method. +This RPC method can be called with 2 integers and a null value as third argument. In that +case the mod argument will be nil. Or it can be called with 3 integers, in that case mod +will be pointing to the given third argument. Since the optional argument is the last +argument the RPC package will also accept 2 integers as arguments. It will pass the mod +argument as nil to the RPC method. -The server offers the ServeCodec method which accepts a ServerCodec instance. It will -read requests from the codec, process the request and sends the response back to the -client using the codec. The server can execute requests concurrently. Responses -can be sent back to the client out of order. +The server offers the ServeCodec method which accepts a ServerCodec instance. It will read +requests from the codec, process the request and sends the response back to the client +using the codec. The server can execute requests concurrently. Responses can be sent back +to the client out of order. An example server which uses the JSON codec: + type CalculatorService struct {} func (s *CalculatorService) Add(a, b int) int { @@ -73,26 +79,40 @@ An example server which uses the JSON codec: for { c, _ := l.AcceptUnix() codec := v2.NewJSONCodec(c) - go server.ServeCodec(codec) + go server.ServeCodec(codec, 0) } +Subscriptions + The package also supports the publish subscribe pattern through the use of subscriptions. -A method that is considered eligible for notifications must satisfy the following criteria: - - object must be exported +A method that is considered eligible for notifications must satisfy the following +criteria: + - method must be exported - first method argument type must be context.Context - method argument(s) must be exported or builtin types - - method must return the tuple Subscription, error + - method must have return types (rpc.Subscription, error) An example method: - func (s *BlockChainService) NewBlocks(ctx context.Context) (Subscription, error) { + + func (s *BlockChainService) NewBlocks(ctx context.Context) (rpc.Subscription, error) { ... } -Subscriptions are deleted when: - - the user sends an unsubscribe request - - the connection which was used to create the subscription is closed. This can be initiated - by the client and server. The server will close the connection on a write error or when - the queue of buffered notifications gets too big. +When the service containing the subscription method is registered to the server, for +example under the "blockchain" namespace, a subscription is created by calling the +"blockchain_subscribe" method. + +Subscriptions are deleted when the user sends an unsubscribe request or when the +connection which was used to create the subscription is closed. This can be initiated by +the client and server. The server will close the connection for any write error. + +For more information about subscriptions, see https://github.com/ethereum/go-ethereum/wiki/RPC-PUB-SUB. + +Reverse Calls + +In any method handler, an instance of rpc.Client can be accessed through the +ClientFromContext method. Using this client instance, server-to-client method calls can be +performed on the RPC connection. */ package rpc diff --git a/rpc/errors.go b/rpc/errors.go index 9cf9dc60c29f..c3aa826cc88a 100644 --- a/rpc/errors.go +++ b/rpc/errors.go @@ -18,18 +18,31 @@ package rpc import "fmt" -// request is for an unknown service -type methodNotFoundError struct { - service string - method string -} +const defaultErrorCode = -32000 + +type methodNotFoundError struct{ method string } func (e *methodNotFoundError) ErrorCode() int { return -32601 } func (e *methodNotFoundError) Error() string { - return fmt.Sprintf("The method %s%s%s does not exist/is not available", e.service, serviceMethodSeparator, e.method) + return fmt.Sprintf("the method %s does not exist/is not available", e.method) +} + +type subscriptionNotFoundError struct{ namespace, subscription string } + +func (e *subscriptionNotFoundError) ErrorCode() int { return -32601 } + +func (e *subscriptionNotFoundError) Error() string { + return fmt.Sprintf("no %q subscription in %s namespace", e.subscription, e.namespace) } +// Invalid JSON was received by the server. +type parseError struct{ message string } + +func (e *parseError) ErrorCode() int { return -32700 } + +func (e *parseError) Error() string { return e.message } + // received message isn't a valid request type invalidRequestError struct{ message string } @@ -50,17 +63,3 @@ type invalidParamsError struct{ message string } func (e *invalidParamsError) ErrorCode() int { return -32602 } func (e *invalidParamsError) Error() string { return e.message } - -// logic error, callback returned an error -type callbackError struct{ message string } - -func (e *callbackError) ErrorCode() int { return -32000 } - -func (e *callbackError) Error() string { return e.message } - -// issued when a request is received after the server is issued to stop. -type shutdownError struct{} - -func (e *shutdownError) ErrorCode() int { return -32000 } - -func (e *shutdownError) Error() string { return "server is shutting down" } diff --git a/rpc/handler.go b/rpc/handler.go new file mode 100644 index 000000000000..8a4e480ee2c7 --- /dev/null +++ b/rpc/handler.go @@ -0,0 +1,397 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rpc + +import ( + "context" + "encoding/json" + "reflect" + "strconv" + "strings" + "sync" + "time" + + "github.com/ethereum/go-ethereum/log" +) + +// handler handles JSON-RPC messages. There is one handler per connection. Note that +// handler is not safe for concurrent use. Message handling never blocks indefinitely +// because RPCs are processed on background goroutines launched by handler. +// +// The entry points for incoming messages are: +// +// h.handleMsg(message) +// h.handleBatch(message) +// +// Outgoing calls use the requestOp struct. Register the request before sending it +// on the connection: +// +// op := &requestOp{ids: ...} +// h.addRequestOp(op) +// +// Now send the request, then wait for the reply to be delivered through handleMsg: +// +// if err := op.wait(...); err != nil { +// h.removeRequestOp(op) // timeout, etc. +// } +// +type handler struct { + reg *serviceRegistry + unsubscribeCb *callback + idgen func() ID // subscription ID generator + respWait map[string]*requestOp // active client requests + clientSubs map[string]*ClientSubscription // active client subscriptions + callWG sync.WaitGroup // pending call goroutines + rootCtx context.Context // canceled by close() + cancelRoot func() // cancel function for rootCtx + conn jsonWriter // where responses will be sent + log log.Logger + allowSubscribe bool + + subLock sync.Mutex + serverSubs map[ID]*Subscription +} + +type callProc struct { + ctx context.Context + notifiers []*Notifier +} + +func newHandler(connCtx context.Context, conn jsonWriter, idgen func() ID, reg *serviceRegistry) *handler { + rootCtx, cancelRoot := context.WithCancel(connCtx) + h := &handler{ + reg: reg, + idgen: idgen, + conn: conn, + respWait: make(map[string]*requestOp), + clientSubs: make(map[string]*ClientSubscription), + rootCtx: rootCtx, + cancelRoot: cancelRoot, + allowSubscribe: true, + serverSubs: make(map[ID]*Subscription), + log: log.Root(), + } + if conn.RemoteAddr() != "" { + h.log = h.log.New("conn", conn.RemoteAddr()) + } + h.unsubscribeCb = newCallback(reflect.Value{}, reflect.ValueOf(h.unsubscribe)) + return h +} + +// handleBatch executes all messages in a batch and returns the responses. +func (h *handler) handleBatch(msgs []*jsonrpcMessage) { + // Emit error response for empty batches: + if len(msgs) == 0 { + h.startCallProc(func(cp *callProc) { + h.conn.Write(cp.ctx, errorMessage(&invalidRequestError{"empty batch"})) + }) + return + } + + // Handle non-call messages first: + calls := make([]*jsonrpcMessage, 0, len(msgs)) + for _, msg := range msgs { + if handled := h.handleImmediate(msg); !handled { + calls = append(calls, msg) + } + } + if len(calls) == 0 { + return + } + // Process calls on a goroutine because they may block indefinitely: + h.startCallProc(func(cp *callProc) { + answers := make([]*jsonrpcMessage, 0, len(msgs)) + for _, msg := range calls { + if answer := h.handleCallMsg(cp, msg); answer != nil { + answers = append(answers, answer) + } + } + h.addSubscriptions(cp.notifiers) + if len(answers) > 0 { + h.conn.Write(cp.ctx, answers) + } + for _, n := range cp.notifiers { + n.activate() + } + }) +} + +// handleMsg handles a single message. +func (h *handler) handleMsg(msg *jsonrpcMessage) { + if ok := h.handleImmediate(msg); ok { + return + } + h.startCallProc(func(cp *callProc) { + answer := h.handleCallMsg(cp, msg) + h.addSubscriptions(cp.notifiers) + if answer != nil { + h.conn.Write(cp.ctx, answer) + } + for _, n := range cp.notifiers { + n.activate() + } + }) +} + +// close cancels all requests except for inflightReq and waits for +// call goroutines to shut down. +func (h *handler) close(err error, inflightReq *requestOp) { + h.cancelAllRequests(err, inflightReq) + h.callWG.Wait() + h.cancelRoot() + h.cancelServerSubscriptions(err) +} + +// addRequestOp registers a request operation. +func (h *handler) addRequestOp(op *requestOp) { + for _, id := range op.ids { + h.respWait[string(id)] = op + } +} + +// removeRequestOps stops waiting for the given request IDs. +func (h *handler) removeRequestOp(op *requestOp) { + for _, id := range op.ids { + delete(h.respWait, string(id)) + } +} + +// cancelAllRequests unblocks and removes pending requests and active subscriptions. +func (h *handler) cancelAllRequests(err error, inflightReq *requestOp) { + didClose := make(map[*requestOp]bool) + if inflightReq != nil { + didClose[inflightReq] = true + } + + for id, op := range h.respWait { + // Remove the op so that later calls will not close op.resp again. + delete(h.respWait, id) + + if !didClose[op] { + op.err = err + close(op.resp) + didClose[op] = true + } + } + for id, sub := range h.clientSubs { + delete(h.clientSubs, id) + sub.quitWithError(err, false) + } +} + +func (h *handler) addSubscriptions(nn []*Notifier) { + h.subLock.Lock() + defer h.subLock.Unlock() + + for _, n := range nn { + if sub := n.takeSubscription(); sub != nil { + h.serverSubs[sub.ID] = sub + } + } +} + +// cancelServerSubscriptions removes all subscriptions and closes their error channels. +func (h *handler) cancelServerSubscriptions(err error) { + h.subLock.Lock() + defer h.subLock.Unlock() + + for id, s := range h.serverSubs { + s.err <- err + close(s.err) + delete(h.serverSubs, id) + } +} + +// startCallProc runs fn in a new goroutine and starts tracking it in the h.calls wait group. +func (h *handler) startCallProc(fn func(*callProc)) { + h.callWG.Add(1) + go func() { + ctx, cancel := context.WithCancel(h.rootCtx) + defer h.callWG.Done() + defer cancel() + fn(&callProc{ctx: ctx}) + }() +} + +// handleImmediate executes non-call messages. It returns false if the message is a +// call or requires a reply. +func (h *handler) handleImmediate(msg *jsonrpcMessage) bool { + start := time.Now() + switch { + case msg.isNotification(): + if strings.HasSuffix(msg.Method, notificationMethodSuffix) { + h.handleSubscriptionResult(msg) + return true + } + return false + case msg.isResponse(): + h.handleResponse(msg) + h.log.Trace("Handled RPC response", "reqid", idForLog{msg.ID}, "t", time.Since(start)) + return true + default: + return false + } +} + +// handleSubscriptionResult processes subscription notifications. +func (h *handler) handleSubscriptionResult(msg *jsonrpcMessage) { + var result subscriptionResult + if err := json.Unmarshal(msg.Params, &result); err != nil { + h.log.Debug("Dropping invalid subscription message") + return + } + if h.clientSubs[result.ID] != nil { + h.clientSubs[result.ID].deliver(result.Result) + } +} + +// handleResponse processes method call responses. +func (h *handler) handleResponse(msg *jsonrpcMessage) { + op := h.respWait[string(msg.ID)] + if op == nil { + h.log.Debug("Unsolicited RPC response", "reqid", idForLog{msg.ID}) + return + } + delete(h.respWait, string(msg.ID)) + // For normal responses, just forward the reply to Call/BatchCall. + if op.sub == nil { + op.resp <- msg + return + } + // For subscription responses, start the subscription if the server + // indicates success. EthSubscribe gets unblocked in either case through + // the op.resp channel. + defer close(op.resp) + if msg.Error != nil { + op.err = msg.Error + return + } + if op.err = json.Unmarshal(msg.Result, &op.sub.subid); op.err == nil { + go op.sub.start() + h.clientSubs[op.sub.subid] = op.sub + } +} + +// handleCallMsg executes a call message and returns the answer. +func (h *handler) handleCallMsg(ctx *callProc, msg *jsonrpcMessage) *jsonrpcMessage { + start := time.Now() + switch { + case msg.isNotification(): + h.handleCall(ctx, msg) + h.log.Debug("Served "+msg.Method, "t", time.Since(start)) + return nil + case msg.isCall(): + resp := h.handleCall(ctx, msg) + if resp.Error != nil { + h.log.Warn("Served "+msg.Method, "reqid", idForLog{msg.ID}, "t", time.Since(start), "err", resp.Error.Message) + } else { + h.log.Debug("Served "+msg.Method, "reqid", idForLog{msg.ID}, "t", time.Since(start)) + } + return resp + case msg.hasValidID(): + return msg.errorResponse(&invalidRequestError{"invalid request"}) + default: + return errorMessage(&invalidRequestError{"invalid request"}) + } +} + +// handleCall processes method calls. +func (h *handler) handleCall(cp *callProc, msg *jsonrpcMessage) *jsonrpcMessage { + if msg.isSubscribe() { + return h.handleSubscribe(cp, msg) + } + var callb *callback + if msg.isUnsubscribe() { + callb = h.unsubscribeCb + } else { + callb = h.reg.callback(msg.Method) + } + if callb == nil { + return msg.errorResponse(&methodNotFoundError{method: msg.Method}) + } + args, err := parsePositionalArguments(msg.Params, callb.argTypes) + if err != nil { + return msg.errorResponse(&invalidParamsError{err.Error()}) + } + + return h.runMethod(cp.ctx, msg, callb, args) +} + +// handleSubscribe processes *_subscribe method calls. +func (h *handler) handleSubscribe(cp *callProc, msg *jsonrpcMessage) *jsonrpcMessage { + if !h.allowSubscribe { + return msg.errorResponse(ErrNotificationsUnsupported) + } + + // Subscription method name is first argument. + name, err := parseSubscriptionName(msg.Params) + if err != nil { + return msg.errorResponse(&invalidParamsError{err.Error()}) + } + namespace := msg.namespace() + callb := h.reg.subscription(namespace, name) + if callb == nil { + return msg.errorResponse(&subscriptionNotFoundError{namespace, name}) + } + + // Parse subscription name arg too, but remove it before calling the callback. + argTypes := append([]reflect.Type{stringType}, callb.argTypes...) + args, err := parsePositionalArguments(msg.Params, argTypes) + if err != nil { + return msg.errorResponse(&invalidParamsError{err.Error()}) + } + args = args[1:] + + // Install notifier in context so the subscription handler can find it. + n := &Notifier{h: h, namespace: namespace} + cp.notifiers = append(cp.notifiers, n) + ctx := context.WithValue(cp.ctx, notifierKey{}, n) + + return h.runMethod(ctx, msg, callb, args) +} + +// runMethod runs the Go callback for an RPC method. +func (h *handler) runMethod(ctx context.Context, msg *jsonrpcMessage, callb *callback, args []reflect.Value) *jsonrpcMessage { + result, err := callb.call(ctx, msg.Method, args) + if err != nil { + return msg.errorResponse(err) + } + return msg.response(result) +} + +// unsubscribe is the callback function for all *_unsubscribe calls. +func (h *handler) unsubscribe(ctx context.Context, id ID) (bool, error) { + h.subLock.Lock() + defer h.subLock.Unlock() + + s := h.serverSubs[id] + if s == nil { + return false, ErrSubscriptionNotFound + } + close(s.err) + delete(h.serverSubs, id) + return true, nil +} + +type idForLog struct{ json.RawMessage } + +func (id idForLog) String() string { + if s, err := strconv.Unquote(string(id.RawMessage)); err == nil { + return s + } + return string(id.RawMessage) +} diff --git a/rpc/http.go b/rpc/http.go index af79858e2b78..e8f2cfda771b 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -36,35 +36,40 @@ import ( ) const ( + maxRequestContentLength = 1024 * 1024 * 5 contentType = "application/json" - maxRequestContentLength = 1024 * 512 ) -var nullAddr, _ = net.ResolveTCPAddr("tcp", "127.0.0.1:0") +// https://www.jsonrpc.org/historical/json-rpc-over-http.html#id13 +var acceptedContentTypes = []string{contentType, "application/json-rpc", "application/jsonrequest"} type httpConn struct { client *http.Client req *http.Request closeOnce sync.Once - closed chan struct{} + closed chan interface{} } // httpConn is treated specially by Client. -func (hc *httpConn) LocalAddr() net.Addr { return nullAddr } -func (hc *httpConn) RemoteAddr() net.Addr { return nullAddr } -func (hc *httpConn) SetReadDeadline(time.Time) error { return nil } -func (hc *httpConn) SetWriteDeadline(time.Time) error { return nil } -func (hc *httpConn) SetDeadline(time.Time) error { return nil } -func (hc *httpConn) Write([]byte) (int, error) { panic("Write called") } - -func (hc *httpConn) Read(b []byte) (int, error) { +func (hc *httpConn) Write(context.Context, interface{}) error { + panic("Write called on httpConn") +} + +func (hc *httpConn) RemoteAddr() string { + return hc.req.URL.String() +} + +func (hc *httpConn) Read() ([]*jsonrpcMessage, bool, error) { <-hc.closed - return 0, io.EOF + return nil, false, io.EOF } -func (hc *httpConn) Close() error { +func (hc *httpConn) Close() { hc.closeOnce.Do(func() { close(hc.closed) }) - return nil +} + +func (hc *httpConn) Closed() <-chan interface{} { + return hc.closed } // HTTPTimeouts represents the configuration params for the HTTP RPC server. @@ -110,8 +115,8 @@ func DialHTTPWithClient(endpoint string, client *http.Client) (*Client, error) { req.Header.Set("Accept", contentType) initctx := context.Background() - return newClient(initctx, func(context.Context) (net.Conn, error) { - return &httpConn{client: client, req: req, closed: make(chan struct{})}, nil + return newClient(initctx, func(context.Context) (ServerCodec, error) { + return &httpConn{client: client, req: req, closed: make(chan interface{})}, nil }) } @@ -180,21 +185,34 @@ func (hc *httpConn) doRequest(ctx context.Context, msg interface{}) (io.ReadClos return resp.Body, nil } -// httpReadWriteNopCloser wraps a io.Reader and io.Writer with a NOP Close method. -type httpReadWriteNopCloser struct { +// httpServerConn turns a HTTP connection into a Conn. +type httpServerConn struct { io.Reader io.Writer + r *http.Request } -// Close does nothing and returns always nil -func (t *httpReadWriteNopCloser) Close() error { - return nil +func newHTTPServerConn(r *http.Request, w http.ResponseWriter) ServerCodec { + body := io.LimitReader(r.Body, maxRequestContentLength) + conn := &httpServerConn{Reader: body, Writer: w, r: r} + return NewJSONCodec(conn) +} + +// Close does nothing and always returns nil. +func (t *httpServerConn) Close() error { return nil } + +// RemoteAddr returns the peer address of the underlying connection. +func (t *httpServerConn) RemoteAddr() string { + return t.r.RemoteAddr } +// SetWriteDeadline does nothing and always returns nil. +func (t *httpServerConn) SetWriteDeadline(time.Time) error { return nil } + // NewHTTPServer creates a new HTTP RPC server around an API provider. // // Deprecated: Server implements http.Handler -func NewHTTPServer(cors []string, vhosts []string, timeouts HTTPTimeouts, srv *Server) *http.Server { +func NewHTTPServer(cors []string, vhosts []string, timeouts HTTPTimeouts, srv http.Handler) *http.Server { // Wrap the CORS-handler within a host-handler handler := newCorsHandler(srv, cors) handler = newVHostHandler(vhosts, handler) @@ -222,7 +240,7 @@ func NewHTTPServer(cors []string, vhosts []string, timeouts HTTPTimeouts, srv *S } // ServeHTTP serves JSON-RPC requests over HTTP. -func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { +func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Permit dumb empty requests for remote health-checks (AWS) if r.Method == http.MethodGet && r.ContentLength == 0 && r.URL.RawQuery == "" { return @@ -245,12 +263,10 @@ func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { ctx = context.WithValue(ctx, "Origin", origin) } - body := io.LimitReader(r.Body, maxRequestContentLength) - codec := NewJSONCodec(&httpReadWriteNopCloser{body, w}) - defer codec.Close() - w.Header().Set("content-type", contentType) - srv.ServeSingleRequest(ctx, codec, OptionMethodInvocation) + codec := newHTTPServerConn(r, w) + defer codec.Close() + s.serveSingleRequest(ctx, codec) } // validateRequest returns a non-zero response code and error message if the @@ -263,15 +279,24 @@ func validateRequest(r *http.Request) (int, error) { err := fmt.Errorf("content length too large (%d>%d)", r.ContentLength, maxRequestContentLength) return http.StatusRequestEntityTooLarge, err } - mt, _, err := mime.ParseMediaType(r.Header.Get("content-type")) - if r.Method != http.MethodOptions && (err != nil || mt != contentType) { - err := fmt.Errorf("invalid content type, only %s is supported", contentType) - return http.StatusUnsupportedMediaType, err + // Allow OPTIONS (regardless of content-type) + if r.Method == http.MethodOptions { + return 0, nil + } + // Check content-type + if mt, _, err := mime.ParseMediaType(r.Header.Get("content-type")); err == nil { + for _, accepted := range acceptedContentTypes { + if accepted == mt { + return 0, nil + } + } } - return 0, nil + // Invalid content-type + err := fmt.Errorf("invalid content type, only %s is supported", contentType) + return http.StatusUnsupportedMediaType, err } -func newCorsHandler(srv *Server, allowedOrigins []string) http.Handler { +func newCorsHandler(srv http.Handler, allowedOrigins []string) http.Handler { // disable CORS support if user has not specified a custom CORS configuration if len(allowedOrigins) == 0 { return srv diff --git a/rpc/inproc.go b/rpc/inproc.go index cbe65d10e76e..c4456cfc4bfc 100644 --- a/rpc/inproc.go +++ b/rpc/inproc.go @@ -24,10 +24,10 @@ import ( // DialInProc attaches an in-process connection to the given RPC server. func DialInProc(handler *Server) *Client { initctx := context.Background() - c, _ := newClient(initctx, func(context.Context) (net.Conn, error) { + c, _ := newClient(initctx, func(context.Context) (ServerCodec, error) { p1, p2 := net.Pipe() go handler.ServeCodec(NewJSONCodec(p1), OptionMethodInvocation|OptionSubscriptions) - return p2, nil + return NewJSONCodec(p2), nil }) return c } diff --git a/rpc/ipc.go b/rpc/ipc.go index b05e503d7427..ad8ce03098f7 100644 --- a/rpc/ipc.go +++ b/rpc/ipc.go @@ -25,7 +25,7 @@ import ( ) // ServeListener accepts connections on l, serving JSON-RPC on them. -func (srv *Server) ServeListener(l net.Listener) error { +func (s *Server) ServeListener(l net.Listener) error { for { conn, err := l.Accept() if netutil.IsTemporaryError(err) { @@ -34,8 +34,8 @@ func (srv *Server) ServeListener(l net.Listener) error { } else if err != nil { return err } - log.Trace("Accepted connection", "addr", conn.RemoteAddr()) - go srv.ServeCodec(NewJSONCodec(conn), OptionMethodInvocation|OptionSubscriptions) + log.Trace("Accepted RPC connection", "conn", conn.RemoteAddr()) + go s.ServeCodec(NewJSONCodec(conn), OptionMethodInvocation|OptionSubscriptions) } } @@ -46,7 +46,11 @@ func (srv *Server) ServeListener(l net.Listener) error { // The context is used for the initial connection establishment. It does not // affect subsequent interactions with the client. func DialIPC(ctx context.Context, endpoint string) (*Client, error) { - return newClient(ctx, func(ctx context.Context) (net.Conn, error) { - return newIPCConnection(ctx, endpoint) + return newClient(ctx, func(ctx context.Context) (ServerCodec, error) { + conn, err := newIPCConnection(ctx, endpoint) + if err != nil { + return nil, err + } + return NewJSONCodec(conn), err }) } diff --git a/rpc/ipc_js.go b/rpc/ipc_js.go new file mode 100644 index 000000000000..7e7554a76887 --- /dev/null +++ b/rpc/ipc_js.go @@ -0,0 +1,37 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// +build js + +package rpc + +import ( + "context" + "errors" + "net" +) + +var errNotSupported = errors.New("rpc: not supported") + +// ipcListen will create a named pipe on the given endpoint. +func ipcListen(endpoint string) (net.Listener, error) { + return nil, errNotSupported +} + +// newIPCConnection will connect to a named pipe with the given endpoint as name. +func newIPCConnection(ctx context.Context, endpoint string) (net.Conn, error) { + return nil, errNotSupported +} diff --git a/rpc/ipc_unix.go b/rpc/ipc_unix.go index 0851ea61e16a..f4690cc0abb9 100644 --- a/rpc/ipc_unix.go +++ b/rpc/ipc_unix.go @@ -20,13 +20,21 @@ package rpc import ( "context" + "fmt" "net" "os" "path/filepath" + + "github.com/ethereum/go-ethereum/log" ) // ipcListen will create a Unix socket on the given endpoint. func ipcListen(endpoint string) (net.Listener, error) { + if len(endpoint) > int(max_path_size) { + log.Warn(fmt.Sprintf("The ipc endpoint is longer than %d characters. ", max_path_size), + "endpoint", endpoint) + } + // Ensure the IPC path exists and remove any previous leftover if err := os.MkdirAll(filepath.Dir(endpoint), 0751); err != nil { return nil, err @@ -42,5 +50,5 @@ func ipcListen(endpoint string) (net.Listener, error) { // newIPCConnection will connect to a Unix socket on the given endpoint. func newIPCConnection(ctx context.Context, endpoint string) (net.Conn, error) { - return dialContext(ctx, "unix", endpoint) + return new(net.Dialer).DialContext(ctx, "unix", endpoint) } diff --git a/rpc/json.go b/rpc/json.go index a523eeb8efb6..75c221038e61 100644 --- a/rpc/json.go +++ b/rpc/json.go @@ -18,71 +18,110 @@ package rpc import ( "bytes" + "context" "encoding/json" + "errors" "fmt" "io" "reflect" - "strconv" "strings" "sync" - - "github.com/ethereum/go-ethereum/log" + "time" ) const ( - jsonrpcVersion = "2.0" + vsn = "2.0" serviceMethodSeparator = "_" subscribeMethodSuffix = "_subscribe" unsubscribeMethodSuffix = "_unsubscribe" notificationMethodSuffix = "_subscription" + + defaultWriteTimeout = 10 * time.Second // used if context has no deadline ) -type jsonRequest struct { - Method string `json:"method"` - Version string `json:"jsonrpc"` - Id json.RawMessage `json:"id,omitempty"` - Payload json.RawMessage `json:"params,omitempty"` +var null = json.RawMessage("null") + +type subscriptionResult struct { + ID string `json:"subscription"` + Result json.RawMessage `json:"result,omitempty"` } -type jsonSuccessResponse struct { - Version string `json:"jsonrpc"` - Id interface{} `json:"id,omitempty"` - Result interface{} `json:"result"` +// A value of this type can a JSON-RPC request, notification, successful response or +// error response. Which one it is depends on the fields. +type jsonrpcMessage struct { + Version string `json:"jsonrpc,omitempty"` + ID json.RawMessage `json:"id,omitempty"` + Method string `json:"method,omitempty"` + Params json.RawMessage `json:"params,omitempty"` + Error *jsonError `json:"error,omitempty"` + Result json.RawMessage `json:"result,omitempty"` } -type jsonError struct { - Code int `json:"code"` - Message string `json:"message"` - Data interface{} `json:"data,omitempty"` +func (msg *jsonrpcMessage) isNotification() bool { + return msg.ID == nil && msg.Method != "" } -type jsonErrResponse struct { - Version string `json:"jsonrpc"` - Id interface{} `json:"id,omitempty"` - Error jsonError `json:"error"` +func (msg *jsonrpcMessage) isCall() bool { + return msg.hasValidID() && msg.Method != "" } -type jsonSubscription struct { - Subscription string `json:"subscription"` - Result interface{} `json:"result,omitempty"` +func (msg *jsonrpcMessage) isResponse() bool { + return msg.hasValidID() && msg.Method == "" && msg.Params == nil && (msg.Result != nil || msg.Error != nil) } -type jsonNotification struct { - Version string `json:"jsonrpc"` - Method string `json:"method"` - Params jsonSubscription `json:"params"` +func (msg *jsonrpcMessage) hasValidID() bool { + return len(msg.ID) > 0 && msg.ID[0] != '{' && msg.ID[0] != '[' } -// jsonCodec reads and writes JSON-RPC messages to the underlying connection. It -// also has support for parsing arguments and serializing (result) objects. -type jsonCodec struct { - closer sync.Once // close closed channel once - closed chan interface{} // closed on Close - decMu sync.Mutex // guards the decoder - decode func(v interface{}) error // decoder to allow multiple transports - encMu sync.Mutex // guards the encoder - encode func(v interface{}) error // encoder to allow multiple transports - rw io.ReadWriteCloser // connection +func (msg *jsonrpcMessage) isSubscribe() bool { + return strings.HasSuffix(msg.Method, subscribeMethodSuffix) +} + +func (msg *jsonrpcMessage) isUnsubscribe() bool { + return strings.HasSuffix(msg.Method, unsubscribeMethodSuffix) +} + +func (msg *jsonrpcMessage) namespace() string { + elem := strings.SplitN(msg.Method, serviceMethodSeparator, 2) + return elem[0] +} + +func (msg *jsonrpcMessage) String() string { + b, _ := json.Marshal(msg) + return string(b) +} + +func (msg *jsonrpcMessage) errorResponse(err error) *jsonrpcMessage { + resp := errorMessage(err) + resp.ID = msg.ID + return resp +} + +func (msg *jsonrpcMessage) response(result interface{}) *jsonrpcMessage { + enc, err := json.Marshal(result) + if err != nil { + // TODO: wrap with 'internal server error' + return msg.errorResponse(err) + } + return &jsonrpcMessage{Version: vsn, ID: msg.ID, Result: enc} +} + +func errorMessage(err error) *jsonrpcMessage { + msg := &jsonrpcMessage{Version: vsn, ID: null, Error: &jsonError{ + Code: defaultErrorCode, + Message: err.Error(), + }} + ec, ok := err.(Error) + if ok { + msg.Error.Code = ec.ErrorCode() + } + return msg +} + +type jsonError struct { + Code int `json:"code"` + Message string `json:"message"` + Data interface{} `json:"data,omitempty"` } func (err *jsonError) Error() string { @@ -96,268 +135,201 @@ func (err *jsonError) ErrorCode() int { return err.Code } -// NewCodec creates a new RPC server codec with support for JSON-RPC 2.0 based -// on explicitly given encoding and decoding methods. -func NewCodec(rwc io.ReadWriteCloser, encode, decode func(v interface{}) error) ServerCodec { - return &jsonCodec{ - closed: make(chan interface{}), - encode: encode, - decode: decode, - rw: rwc, - } +// Conn is a subset of the methods of net.Conn which are sufficient for ServerCodec. +type Conn interface { + io.ReadWriteCloser + SetWriteDeadline(time.Time) error } -// NewJSONCodec creates a new RPC server codec with support for JSON-RPC 2.0. -func NewJSONCodec(rwc io.ReadWriteCloser) ServerCodec { - enc := json.NewEncoder(rwc) - dec := json.NewDecoder(rwc) - dec.UseNumber() +type deadlineCloser interface { + io.Closer + SetWriteDeadline(time.Time) error +} - return &jsonCodec{ - closed: make(chan interface{}), - encode: enc.Encode, - decode: dec.Decode, - rw: rwc, - } +// ConnRemoteAddr wraps the RemoteAddr operation, which returns a description +// of the peer address of a connection. If a Conn also implements ConnRemoteAddr, this +// description is used in log messages. +type ConnRemoteAddr interface { + RemoteAddr() string } -// isBatch returns true when the first non-whitespace characters is '[' -func isBatch(msg json.RawMessage) bool { - for _, c := range msg { - // skip insignificant whitespace (http://www.ietf.org/rfc/rfc4627.txt) - if c == 0x20 || c == 0x09 || c == 0x0a || c == 0x0d { - continue - } - return c == '[' - } - return false +// connWithRemoteAddr overrides the remote address of a connection. +type connWithRemoteAddr struct { + Conn + addr string } -// ReadRequestHeaders will read new requests without parsing the arguments. It will -// return a collection of requests, an indication if these requests are in batch -// form or an error when the incoming message could not be read/parsed. -func (c *jsonCodec) ReadRequestHeaders() ([]rpcRequest, bool, Error) { - c.decMu.Lock() - defer c.decMu.Unlock() +func (c connWithRemoteAddr) RemoteAddr() string { return c.addr } - var incomingMsg json.RawMessage - if err := c.decode(&incomingMsg); err != nil { - return nil, false, &invalidRequestError{err.Error()} - } - if isBatch(incomingMsg) { - return parseBatchRequest(incomingMsg) - } - return parseRequest(incomingMsg) +// jsonCodec reads and writes JSON-RPC messages to the underlying connection. It also has +// support for parsing arguments and serializing (result) objects. +type jsonCodec struct { + remoteAddr string + closer sync.Once // close closed channel once + closed chan interface{} // closed on Close + decode func(v interface{}) error // decoder to allow multiple transports + encMu sync.Mutex // guards the encoder + encode func(v interface{}) error // encoder to allow multiple transports + conn deadlineCloser } -// checkReqId returns an error when the given reqId isn't valid for RPC method calls. -// valid id's are strings, numbers or null -func checkReqId(reqId json.RawMessage) error { - if len(reqId) == 0 { - return fmt.Errorf("missing request id") - } - if _, err := strconv.ParseFloat(string(reqId), 64); err == nil { - return nil +func newCodec(conn deadlineCloser, encode, decode func(v interface{}) error) ServerCodec { + codec := &jsonCodec{ + closed: make(chan interface{}), + encode: encode, + decode: decode, + conn: conn, } - var str string - if err := json.Unmarshal(reqId, &str); err == nil { - return nil + if ra, ok := conn.(ConnRemoteAddr); ok { + codec.remoteAddr = ra.RemoteAddr() } - return fmt.Errorf("invalid request id") + return codec } -// parseRequest will parse a single request from the given RawMessage. It will return -// the parsed request, an indication if the request was a batch or an error when -// the request could not be parsed. -func parseRequest(incomingMsg json.RawMessage) ([]rpcRequest, bool, Error) { - var in jsonRequest - if err := json.Unmarshal(incomingMsg, &in); err != nil { - return nil, false, &invalidMessageError{err.Error()} - } +// NewJSONCodec creates a codec that reads from the given connection. If conn implements +// ConnRemoteAddr, log messages will use it to include the remote address of the +// connection. +func NewJSONCodec(conn Conn) ServerCodec { + enc := json.NewEncoder(conn) + dec := json.NewDecoder(conn) + dec.UseNumber() + return newCodec(conn, enc.Encode, dec.Decode) +} - if err := checkReqId(in.Id); err != nil { - return nil, false, &invalidMessageError{err.Error()} - } +func (c *jsonCodec) RemoteAddr() string { + return c.remoteAddr +} - // subscribe are special, they will always use `subscribeMethod` as first param in the payload - if strings.HasSuffix(in.Method, subscribeMethodSuffix) { - reqs := []rpcRequest{{id: &in.Id, isPubSub: true}} - if len(in.Payload) > 0 { - // first param must be subscription name - var subscribeMethod [1]string - if err := json.Unmarshal(in.Payload, &subscribeMethod); err != nil { - log.Debug(fmt.Sprintf("Unable to parse subscription method: %v\n", err)) - return nil, false, &invalidRequestError{"Unable to parse subscription request"} - } - - reqs[0].service, reqs[0].method = strings.TrimSuffix(in.Method, subscribeMethodSuffix), subscribeMethod[0] - reqs[0].params = in.Payload - return reqs, false, nil - } - return nil, false, &invalidRequestError{"Unable to parse subscription request"} +func (c *jsonCodec) Read() (msg []*jsonrpcMessage, batch bool, err error) { + // Decode the next JSON object in the input stream. + // This verifies basic syntax, etc. + var rawmsg json.RawMessage + if err := c.decode(&rawmsg); err != nil { + return nil, false, err } + msg, batch = parseMessage(rawmsg) + return msg, batch, nil +} - if strings.HasSuffix(in.Method, unsubscribeMethodSuffix) { - return []rpcRequest{{id: &in.Id, isPubSub: true, - method: in.Method, params: in.Payload}}, false, nil - } +// Write sends a message to client. +func (c *jsonCodec) Write(ctx context.Context, v interface{}) error { + c.encMu.Lock() + defer c.encMu.Unlock() - elems := strings.Split(in.Method, serviceMethodSeparator) - if len(elems) != 2 { - return nil, false, &methodNotFoundError{in.Method, ""} + deadline, ok := ctx.Deadline() + if !ok { + deadline = time.Now().Add(defaultWriteTimeout) } + c.conn.SetWriteDeadline(deadline) + return c.encode(v) +} - // regular RPC call - if len(in.Payload) == 0 { - return []rpcRequest{{service: elems[0], method: elems[1], id: &in.Id}}, false, nil - } +// Close the underlying connection +func (c *jsonCodec) Close() { + c.closer.Do(func() { + close(c.closed) + c.conn.Close() + }) +} - return []rpcRequest{{service: elems[0], method: elems[1], id: &in.Id, params: in.Payload}}, false, nil +// Closed returns a channel which will be closed when Close is called +func (c *jsonCodec) Closed() <-chan interface{} { + return c.closed } -// parseBatchRequest will parse a batch request into a collection of requests from the given RawMessage, an indication -// if the request was a batch or an error when the request could not be read. -func parseBatchRequest(incomingMsg json.RawMessage) ([]rpcRequest, bool, Error) { - var in []jsonRequest - if err := json.Unmarshal(incomingMsg, &in); err != nil { - return nil, false, &invalidMessageError{err.Error()} +// parseMessage parses raw bytes as a (batch of) JSON-RPC message(s). There are no error +// checks in this function because the raw message has already been syntax-checked when it +// is called. Any non-JSON-RPC messages in the input return the zero value of +// jsonrpcMessage. +func parseMessage(raw json.RawMessage) ([]*jsonrpcMessage, bool) { + if !isBatch(raw) { + msgs := []*jsonrpcMessage{{}} + json.Unmarshal(raw, &msgs[0]) + return msgs, false } - - requests := make([]rpcRequest, len(in)) - for i, r := range in { - if err := checkReqId(r.Id); err != nil { - return nil, false, &invalidMessageError{err.Error()} - } - - id := &in[i].Id - - // subscribe are special, they will always use `subscriptionMethod` as first param in the payload - if strings.HasSuffix(r.Method, subscribeMethodSuffix) { - requests[i] = rpcRequest{id: id, isPubSub: true} - if len(r.Payload) > 0 { - // first param must be subscription name - var subscribeMethod [1]string - if err := json.Unmarshal(r.Payload, &subscribeMethod); err != nil { - log.Debug(fmt.Sprintf("Unable to parse subscription method: %v\n", err)) - return nil, false, &invalidRequestError{"Unable to parse subscription request"} - } - - requests[i].service, requests[i].method = strings.TrimSuffix(r.Method, subscribeMethodSuffix), subscribeMethod[0] - requests[i].params = r.Payload - continue - } - - return nil, true, &invalidRequestError{"Unable to parse (un)subscribe request arguments"} - } - - if strings.HasSuffix(r.Method, unsubscribeMethodSuffix) { - requests[i] = rpcRequest{id: id, isPubSub: true, method: r.Method, params: r.Payload} - continue - } - - if len(r.Payload) == 0 { - requests[i] = rpcRequest{id: id, params: nil} - } else { - requests[i] = rpcRequest{id: id, params: r.Payload} - } - if elem := strings.Split(r.Method, serviceMethodSeparator); len(elem) == 2 { - requests[i].service, requests[i].method = elem[0], elem[1] - } else { - requests[i].err = &methodNotFoundError{r.Method, ""} - } + dec := json.NewDecoder(bytes.NewReader(raw)) + dec.Token() // skip '[' + var msgs []*jsonrpcMessage + for dec.More() { + msgs = append(msgs, new(jsonrpcMessage)) + dec.Decode(&msgs[len(msgs)-1]) } - - return requests, true, nil + return msgs, true } -// ParseRequestArguments tries to parse the given params (json.RawMessage) with the given -// types. It returns the parsed values or an error when the parsing failed. -func (c *jsonCodec) ParseRequestArguments(argTypes []reflect.Type, params interface{}) ([]reflect.Value, Error) { - if args, ok := params.(json.RawMessage); !ok { - return nil, &invalidParamsError{"Invalid params supplied"} - } else { - return parsePositionalArguments(args, argTypes) +// isBatch returns true when the first non-whitespace characters is '[' +func isBatch(raw json.RawMessage) bool { + for _, c := range raw { + // skip insignificant whitespace (http://www.ietf.org/rfc/rfc4627.txt) + if c == 0x20 || c == 0x09 || c == 0x0a || c == 0x0d { + continue + } + return c == '[' } + return false } // parsePositionalArguments tries to parse the given args to an array of values with the // given types. It returns the parsed values or an error when the args could not be // parsed. Missing optional arguments are returned as reflect.Zero values. -func parsePositionalArguments(rawArgs json.RawMessage, types []reflect.Type) ([]reflect.Value, Error) { - // Read beginning of the args array. +func parsePositionalArguments(rawArgs json.RawMessage, types []reflect.Type) ([]reflect.Value, error) { dec := json.NewDecoder(bytes.NewReader(rawArgs)) - if tok, _ := dec.Token(); tok != json.Delim('[') { - return nil, &invalidParamsError{"non-array args"} + var args []reflect.Value + tok, err := dec.Token() + switch { + case err == io.EOF || tok == nil && err == nil: + // "params" is optional and may be empty. Also allow "params":null even though it's + // not in the spec because our own client used to send it. + case err != nil: + return nil, err + case tok == json.Delim('['): + // Read argument array. + if args, err = parseArgumentArray(dec, types); err != nil { + return nil, err + } + default: + return nil, errors.New("non-array args") } - // Read args. + // Set any missing args to nil. + for i := len(args); i < len(types); i++ { + if types[i].Kind() != reflect.Ptr { + return nil, fmt.Errorf("missing value for required argument %d", i) + } + args = append(args, reflect.Zero(types[i])) + } + return args, nil +} + +func parseArgumentArray(dec *json.Decoder, types []reflect.Type) ([]reflect.Value, error) { args := make([]reflect.Value, 0, len(types)) for i := 0; dec.More(); i++ { if i >= len(types) { - return nil, &invalidParamsError{fmt.Sprintf("too many arguments, want at most %d", len(types))} + return args, fmt.Errorf("too many arguments, want at most %d", len(types)) } argval := reflect.New(types[i]) if err := dec.Decode(argval.Interface()); err != nil { - return nil, &invalidParamsError{fmt.Sprintf("invalid argument %d: %v", i, err)} + return args, fmt.Errorf("invalid argument %d: %v", i, err) } if argval.IsNil() && types[i].Kind() != reflect.Ptr { - return nil, &invalidParamsError{fmt.Sprintf("missing value for required argument %d", i)} + return args, fmt.Errorf("missing value for required argument %d", i) } args = append(args, argval.Elem()) } // Read end of args array. - if _, err := dec.Token(); err != nil { - return nil, &invalidParamsError{err.Error()} - } - // Set any missing args to nil. - for i := len(args); i < len(types); i++ { - if types[i].Kind() != reflect.Ptr { - return nil, &invalidParamsError{fmt.Sprintf("missing value for required argument %d", i)} - } - args = append(args, reflect.Zero(types[i])) - } - return args, nil -} - -// CreateResponse will create a JSON-RPC success response with the given id and reply as result. -func (c *jsonCodec) CreateResponse(id interface{}, reply interface{}) interface{} { - return &jsonSuccessResponse{Version: jsonrpcVersion, Id: id, Result: reply} -} - -// CreateErrorResponse will create a JSON-RPC error response with the given id and error. -func (c *jsonCodec) CreateErrorResponse(id interface{}, err Error) interface{} { - return &jsonErrResponse{Version: jsonrpcVersion, Id: id, Error: jsonError{Code: err.ErrorCode(), Message: err.Error()}} -} - -// CreateErrorResponseWithInfo will create a JSON-RPC error response with the given id and error. -// info is optional and contains additional information about the error. When an empty string is passed it is ignored. -func (c *jsonCodec) CreateErrorResponseWithInfo(id interface{}, err Error, info interface{}) interface{} { - return &jsonErrResponse{Version: jsonrpcVersion, Id: id, - Error: jsonError{Code: err.ErrorCode(), Message: err.Error(), Data: info}} -} - -// CreateNotification will create a JSON-RPC notification with the given subscription id and event as params. -func (c *jsonCodec) CreateNotification(subid, namespace string, event interface{}) interface{} { - return &jsonNotification{Version: jsonrpcVersion, Method: namespace + notificationMethodSuffix, - Params: jsonSubscription{Subscription: subid, Result: event}} -} - -// Write message to client -func (c *jsonCodec) Write(res interface{}) error { - c.encMu.Lock() - defer c.encMu.Unlock() - - return c.encode(res) + _, err := dec.Token() + return args, err } -// Close the underlying connection -func (c *jsonCodec) Close() { - c.closer.Do(func() { - close(c.closed) - c.rw.Close() - }) -} - -// Closed returns a channel which will be closed when Close is called -func (c *jsonCodec) Closed() <-chan interface{} { - return c.closed +// parseSubscriptionName extracts the subscription name from an encoded argument array. +func parseSubscriptionName(rawArgs json.RawMessage) (string, error) { + dec := json.NewDecoder(bytes.NewReader(rawArgs)) + if tok, _ := dec.Token(); tok != json.Delim('[') { + return "", errors.New("non-array args") + } + v, _ := dec.Token() + method, ok := v.(string) + if !ok { + return "", errors.New("expected subscription name as first argument") + } + return method, nil } diff --git a/rpc/json_test.go b/rpc/json_test.go deleted file mode 100644 index 5048d2f7a067..000000000000 --- a/rpc/json_test.go +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package rpc - -import ( - "bufio" - "bytes" - "encoding/json" - "reflect" - "strconv" - "testing" -) - -type RWC struct { - *bufio.ReadWriter -} - -func (rwc *RWC) Close() error { - return nil -} - -func TestJSONRequestParsing(t *testing.T) { - server := NewServer() - service := new(Service) - - if err := server.RegisterName("calc", service); err != nil { - t.Fatalf("%v", err) - } - - req := bytes.NewBufferString(`{"id": 1234, "jsonrpc": "2.0", "method": "calc_add", "params": [11, 22]}`) - var str string - reply := bytes.NewBufferString(str) - rw := &RWC{bufio.NewReadWriter(bufio.NewReader(req), bufio.NewWriter(reply))} - - codec := NewJSONCodec(rw) - - requests, batch, err := codec.ReadRequestHeaders() - if err != nil { - t.Fatalf("%v", err) - } - - if batch { - t.Fatalf("Request isn't a batch") - } - - if len(requests) != 1 { - t.Fatalf("Expected 1 request but got %d requests - %v", len(requests), requests) - } - - if requests[0].service != "calc" { - t.Fatalf("Expected service 'calc' but got '%s'", requests[0].service) - } - - if requests[0].method != "add" { - t.Fatalf("Expected method 'Add' but got '%s'", requests[0].method) - } - - if rawId, ok := requests[0].id.(*json.RawMessage); ok { - id, e := strconv.ParseInt(string(*rawId), 0, 64) - if e != nil { - t.Fatalf("%v", e) - } - if id != 1234 { - t.Fatalf("Expected id 1234 but got %d", id) - } - } else { - t.Fatalf("invalid request, expected *json.RawMesage got %T", requests[0].id) - } - - var arg int - args := []reflect.Type{reflect.TypeOf(arg), reflect.TypeOf(arg)} - - v, err := codec.ParseRequestArguments(args, requests[0].params) - if err != nil { - t.Fatalf("%v", err) - } - - if len(v) != 2 { - t.Fatalf("Expected 2 argument values, got %d", len(v)) - } - - if v[0].Int() != 11 || v[1].Int() != 22 { - t.Fatalf("expected %d == 11 && %d == 22", v[0].Int(), v[1].Int()) - } -} - -func TestJSONRequestParamsParsing(t *testing.T) { - - var ( - stringT = reflect.TypeOf("") - intT = reflect.TypeOf(0) - intPtrT = reflect.TypeOf(new(int)) - - stringV = reflect.ValueOf("abc") - i = 1 - intV = reflect.ValueOf(i) - intPtrV = reflect.ValueOf(&i) - ) - - var validTests = []struct { - input string - argTypes []reflect.Type - expected []reflect.Value - }{ - {`[]`, []reflect.Type{}, []reflect.Value{}}, - {`[]`, []reflect.Type{intPtrT}, []reflect.Value{intPtrV}}, - {`[1]`, []reflect.Type{intT}, []reflect.Value{intV}}, - {`[1,"abc"]`, []reflect.Type{intT, stringT}, []reflect.Value{intV, stringV}}, - {`[null]`, []reflect.Type{intPtrT}, []reflect.Value{intPtrV}}, - {`[null,"abc"]`, []reflect.Type{intPtrT, stringT, intPtrT}, []reflect.Value{intPtrV, stringV, intPtrV}}, - {`[null,"abc",null]`, []reflect.Type{intPtrT, stringT, intPtrT}, []reflect.Value{intPtrV, stringV, intPtrV}}, - } - - codec := jsonCodec{} - - for _, test := range validTests { - params := (json.RawMessage)([]byte(test.input)) - args, err := codec.ParseRequestArguments(test.argTypes, params) - - if err != nil { - t.Fatal(err) - } - - var match []interface{} - json.Unmarshal([]byte(test.input), &match) - - if len(args) != len(test.argTypes) { - t.Fatalf("expected %d parsed args, got %d", len(test.argTypes), len(args)) - } - - for i, arg := range args { - expected := test.expected[i] - - if arg.Kind() != expected.Kind() { - t.Errorf("expected type for param %d in %s", i, test.input) - } - - if arg.Kind() == reflect.Int && arg.Int() != expected.Int() { - t.Errorf("expected int(%d), got int(%d) in %s", expected.Int(), arg.Int(), test.input) - } - - if arg.Kind() == reflect.String && arg.String() != expected.String() { - t.Errorf("expected string(%s), got string(%s) in %s", expected.String(), arg.String(), test.input) - } - } - } - - var invalidTests = []struct { - input string - argTypes []reflect.Type - }{ - {`[]`, []reflect.Type{intT}}, - {`[null]`, []reflect.Type{intT}}, - {`[1]`, []reflect.Type{stringT}}, - {`[1,2]`, []reflect.Type{stringT}}, - {`["abc", null]`, []reflect.Type{stringT, intT}}, - } - - for i, test := range invalidTests { - if _, err := codec.ParseRequestArguments(test.argTypes, test.input); err == nil { - t.Errorf("expected test %d - %s to fail", i, test.input) - } - } -} diff --git a/rpc/server.go b/rpc/server.go index 214e1d3ed9b9..5a92847f20e4 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -18,11 +18,7 @@ package rpc import ( "context" - "fmt" - "reflect" - "runtime" - "strings" - "sync" + "io" "sync/atomic" mapset "github.com/deckarep/golang-set" @@ -31,7 +27,9 @@ import ( const MetadataApi = "rpc" -// CodecOption specifies which type of messages this codec supports +// CodecOption specifies which type of messages a codec supports. +// +// Deprecated: this option is no longer honored by Server. type CodecOption int const ( @@ -42,194 +40,87 @@ const ( OptionSubscriptions = 1 << iota // support pub sub ) -// NewServer will create a new server instance with no registered handlers. -func NewServer() *Server { - server := &Server{ - services: make(serviceRegistry), - codecs: mapset.NewSet(), - run: 1, - } +// Server is an RPC server. +type Server struct { + services serviceRegistry + idgen func() ID + run int32 + codecs mapset.Set +} - // register a default service which will provide meta information about the RPC service such as the services and - // methods it offers. +// NewServer creates a new server instance with no registered handlers. +func NewServer() *Server { + server := &Server{idgen: randomIDGenerator(), codecs: mapset.NewSet(), run: 1} + // Register the default service providing meta information about the RPC service such + // as the services and methods it offers. rpcService := &RPCService{server} server.RegisterName(MetadataApi, rpcService) - return server } -// RPCService gives meta information about the server. -// e.g. gives information about the loaded modules. -type RPCService struct { - server *Server -} - -// Modules returns the list of RPC services with their version number -func (s *RPCService) Modules() map[string]string { - modules := make(map[string]string) - for name := range s.server.services { - modules[name] = "1.0" - } - return modules +// RegisterName creates a service for the given receiver type under the given name. When no +// methods on the given receiver match the criteria to be either a RPC method or a +// subscription an error is returned. Otherwise a new service is created and added to the +// service collection this server provides to clients. +func (s *Server) RegisterName(name string, receiver interface{}) error { + return s.services.registerName(name, receiver) } -// RegisterName will create a service for the given rcvr type under the given name. When no methods on the given rcvr -// match the criteria to be either a RPC method or a subscription an error is returned. Otherwise a new service is -// created and added to the service collection this server instance serves. -func (s *Server) RegisterName(name string, rcvr interface{}) error { - if s.services == nil { - s.services = make(serviceRegistry) - } - - svc := new(service) - svc.typ = reflect.TypeOf(rcvr) - rcvrVal := reflect.ValueOf(rcvr) - - if name == "" { - return fmt.Errorf("no service name for type %s", svc.typ.String()) - } - if !isExported(reflect.Indirect(rcvrVal).Type().Name()) { - return fmt.Errorf("%s is not exported", reflect.Indirect(rcvrVal).Type().Name()) - } - - methods, subscriptions := suitableCallbacks(rcvrVal, svc.typ) +// ServeCodec reads incoming requests from codec, calls the appropriate callback and writes +// the response back using the given codec. It will block until the codec is closed or the +// server is stopped. In either case the codec is closed. +// +// Note that codec options are no longer supported. +func (s *Server) ServeCodec(codec ServerCodec, options CodecOption) { + defer codec.Close() - if len(methods) == 0 && len(subscriptions) == 0 { - return fmt.Errorf("Service %T doesn't have any suitable methods/subscriptions to expose", rcvr) + // Don't serve if server is stopped. + if atomic.LoadInt32(&s.run) == 0 { + return } - // already a previous service register under given name, merge methods/subscriptions - if regsvc, present := s.services[name]; present { - for _, m := range methods { - regsvc.callbacks[formatName(m.method.Name)] = m - } - for _, s := range subscriptions { - regsvc.subscriptions[formatName(s.method.Name)] = s - } - return nil - } - - svc.name = name - svc.callbacks, svc.subscriptions = methods, subscriptions + // Add the codec to the set so it can be closed by Stop. + s.codecs.Add(codec) + defer s.codecs.Remove(codec) - s.services[svc.name] = svc - return nil + c := initClient(codec, s.idgen, &s.services) + <-codec.Closed() + c.Close() } -// serveRequest will reads requests from the codec, calls the RPC callback and -// writes the response to the given codec. -// -// If singleShot is true it will process a single request, otherwise it will handle -// requests until the codec returns an error when reading a request (in most cases -// an EOF). It executes requests in parallel when singleShot is false. -func (s *Server) serveRequest(ctx context.Context, codec ServerCodec, singleShot bool, options CodecOption) error { - var pend sync.WaitGroup - - defer func() { - if err := recover(); err != nil { - const size = 64 << 10 - buf := make([]byte, size) - buf = buf[:runtime.Stack(buf, false)] - log.Error(string(buf)) - } - s.codecsMu.Lock() - s.codecs.Remove(codec) - s.codecsMu.Unlock() - }() - - // ctx, cancel := context.WithCancel(context.Background()) - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - // if the codec supports notification include a notifier that callbacks can use - // to send notification to clients. It is tied to the codec/connection. If the - // connection is closed the notifier will stop and cancels all active subscriptions. - if options&OptionSubscriptions == OptionSubscriptions { - ctx = context.WithValue(ctx, notifierKey{}, newNotifier(codec)) - } - s.codecsMu.Lock() - if atomic.LoadInt32(&s.run) != 1 { // server stopped - s.codecsMu.Unlock() - return &shutdownError{} +// serveSingleRequest reads and processes a single RPC request from the given codec. This +// is used to serve HTTP connections. Subscriptions and reverse calls are not allowed in +// this mode. +func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec) { + // Don't serve if server is stopped. + if atomic.LoadInt32(&s.run) == 0 { + return } - s.codecs.Add(codec) - s.codecsMu.Unlock() - // test if the server is ordered to stop - for atomic.LoadInt32(&s.run) == 1 { - reqs, batch, err := s.readRequest(codec) - if err != nil { - // If a parsing error occurred, send an error - if err.Error() != "EOF" { - log.Debug(fmt.Sprintf("read error %v\n", err)) - codec.Write(codec.CreateErrorResponse(nil, err)) - } - // Error or end of stream, wait for requests and tear down - pend.Wait() - return nil - } + h := newHandler(ctx, codec, s.idgen, &s.services) + h.allowSubscribe = false + defer h.close(io.EOF, nil) - // check if server is ordered to shutdown and return an error - // telling the client that his request failed. - if atomic.LoadInt32(&s.run) != 1 { - err = &shutdownError{} - if batch { - resps := make([]interface{}, len(reqs)) - for i, r := range reqs { - resps[i] = codec.CreateErrorResponse(&r.id, err) - } - codec.Write(resps) - } else { - codec.Write(codec.CreateErrorResponse(&reqs[0].id, err)) - } - return nil - } - // If a single shot request is executing, run and return immediately - if singleShot { - if batch { - s.execBatch(ctx, codec, reqs) - } else { - s.exec(ctx, codec, reqs[0]) - } - return nil + reqs, batch, err := codec.Read() + if err != nil { + if err != io.EOF { + codec.Write(ctx, errorMessage(&invalidMessageError{"parse error"})) } - // For multi-shot connections, start a goroutine to serve and loop back - pend.Add(1) - - go func(reqs []*serverRequest, batch bool) { - defer pend.Done() - if batch { - s.execBatch(ctx, codec, reqs) - } else { - s.exec(ctx, codec, reqs[0]) - } - }(reqs, batch) + return + } + if batch { + h.handleBatch(reqs) + } else { + h.handleMsg(reqs[0]) } - return nil -} - -// ServeCodec reads incoming requests from codec, calls the appropriate callback and writes the -// response back using the given codec. It will block until the codec is closed or the server is -// stopped. In either case the codec is closed. -func (s *Server) ServeCodec(codec ServerCodec, options CodecOption) { - defer codec.Close() - s.serveRequest(context.Background(), codec, false, options) -} - -// ServeSingleRequest reads and processes a single RPC request from the given codec. It will not -// close the codec unless a non-recoverable error has occurred. Note, this method will return after -// a single request has been processed! -func (s *Server) ServeSingleRequest(ctx context.Context, codec ServerCodec, options CodecOption) { - s.serveRequest(ctx, codec, true, options) } -// Stop will stop reading new requests, wait for stopPendingRequestTimeout to allow pending requests to finish, -// close all codecs which will cancel pending requests/subscriptions. +// Stop stops reading new requests, waits for stopPendingRequestTimeout to allow pending +// requests to finish, then closes all codecs which will cancel pending requests and +// subscriptions. func (s *Server) Stop() { if atomic.CompareAndSwapInt32(&s.run, 1, 0) { - log.Debug("RPC Server shutdown initiatied") - s.codecsMu.Lock() - defer s.codecsMu.Unlock() + log.Debug("RPC server shutting down") s.codecs.Each(func(c interface{}) bool { c.(ServerCodec).Close() return true @@ -237,206 +128,20 @@ func (s *Server) Stop() { } } -// createSubscription will call the subscription callback and returns the subscription id or error. -func (s *Server) createSubscription(ctx context.Context, c ServerCodec, req *serverRequest) (ID, error) { - // subscription have as first argument the context following optional arguments - args := []reflect.Value{req.callb.rcvr, reflect.ValueOf(ctx)} - args = append(args, req.args...) - reply := req.callb.method.Func.Call(args) - - if !reply[1].IsNil() { // subscription creation failed - return "", reply[1].Interface().(error) - } - - return reply[0].Interface().(*Subscription).ID, nil -} - -// handle executes a request and returns the response from the callback. -func (s *Server) handle(ctx context.Context, codec ServerCodec, req *serverRequest) (interface{}, func()) { - if req.err != nil { - return codec.CreateErrorResponse(&req.id, req.err), nil - } - - if req.isUnsubscribe { // cancel subscription, first param must be the subscription id - if len(req.args) >= 1 && req.args[0].Kind() == reflect.String { - notifier, supported := NotifierFromContext(ctx) - if !supported { // interface doesn't support subscriptions (e.g. http) - return codec.CreateErrorResponse(&req.id, &callbackError{ErrNotificationsUnsupported.Error()}), nil - } - - subid := ID(req.args[0].String()) - if err := notifier.unsubscribe(subid); err != nil { - return codec.CreateErrorResponse(&req.id, &callbackError{err.Error()}), nil - } - - return codec.CreateResponse(req.id, true), nil - } - return codec.CreateErrorResponse(&req.id, &invalidParamsError{"Expected subscription id as first argument"}), nil - } - - if req.callb.isSubscribe { - subid, err := s.createSubscription(ctx, codec, req) - if err != nil { - return codec.CreateErrorResponse(&req.id, &callbackError{err.Error()}), nil - } - - // active the subscription after the sub id was successfully sent to the client - activateSub := func() { - notifier, _ := NotifierFromContext(ctx) - notifier.activate(subid, req.svcname) - } - - return codec.CreateResponse(req.id, subid), activateSub - } - - // regular RPC call, prepare arguments - if len(req.args) != len(req.callb.argTypes) { - rpcErr := &invalidParamsError{fmt.Sprintf("%s%s%s expects %d parameters, got %d", - req.svcname, serviceMethodSeparator, req.callb.method.Name, - len(req.callb.argTypes), len(req.args))} - return codec.CreateErrorResponse(&req.id, rpcErr), nil - } - - arguments := []reflect.Value{req.callb.rcvr} - if req.callb.hasCtx { - arguments = append(arguments, reflect.ValueOf(ctx)) - } - if len(req.args) > 0 { - arguments = append(arguments, req.args...) - } - - // execute RPC method and return result - reply := req.callb.method.Func.Call(arguments) - if len(reply) == 0 { - return codec.CreateResponse(req.id, nil), nil - } - if req.callb.errPos >= 0 { // test if method returned an error - if !reply[req.callb.errPos].IsNil() { - e := reply[req.callb.errPos].Interface().(error) - res := codec.CreateErrorResponse(&req.id, &callbackError{e.Error()}) - return res, nil - } - } - return codec.CreateResponse(req.id, reply[0].Interface()), nil -} - -// exec executes the given request and writes the result back using the codec. -func (s *Server) exec(ctx context.Context, codec ServerCodec, req *serverRequest) { - var response interface{} - var callback func() - if req.err != nil { - response = codec.CreateErrorResponse(&req.id, req.err) - } else { - response, callback = s.handle(ctx, codec, req) - } - - if err := codec.Write(response); err != nil { - log.Error(fmt.Sprintf("%v\n", err)) - codec.Close() - } - - // when request was a subscribe request this allows these subscriptions to be actived - if callback != nil { - callback() - } -} - -// execBatch executes the given requests and writes the result back using the codec. -// It will only write the response back when the last request is processed. -func (s *Server) execBatch(ctx context.Context, codec ServerCodec, requests []*serverRequest) { - responses := make([]interface{}, len(requests)) - var callbacks []func() - for i, req := range requests { - if req.err != nil { - responses[i] = codec.CreateErrorResponse(&req.id, req.err) - } else { - var callback func() - if responses[i], callback = s.handle(ctx, codec, req); callback != nil { - callbacks = append(callbacks, callback) - } - } - } - - if err := codec.Write(responses); err != nil { - log.Error(fmt.Sprintf("%v\n", err)) - codec.Close() - } - - // when request holds one of more subscribe requests this allows these subscriptions to be activated - for _, c := range callbacks { - c() - } +// RPCService gives meta information about the server. +// e.g. gives information about the loaded modules. +type RPCService struct { + server *Server } -// readRequest requests the next (batch) request from the codec. It will return the collection -// of requests, an indication if the request was a batch, the invalid request identifier and an -// error when the request could not be read/parsed. -func (s *Server) readRequest(codec ServerCodec) ([]*serverRequest, bool, Error) { - reqs, batch, err := codec.ReadRequestHeaders() - if err != nil { - return nil, batch, err - } - - requests := make([]*serverRequest, len(reqs)) - - // verify requests - for i, r := range reqs { - var ok bool - var svc *service - - if r.err != nil { - requests[i] = &serverRequest{id: r.id, err: r.err} - continue - } - - if r.isPubSub && strings.HasSuffix(r.method, unsubscribeMethodSuffix) { - requests[i] = &serverRequest{id: r.id, isUnsubscribe: true} - argTypes := []reflect.Type{reflect.TypeOf("")} // expect subscription id as first arg - if args, err := codec.ParseRequestArguments(argTypes, r.params); err == nil { - requests[i].args = args - } else { - requests[i].err = &invalidParamsError{err.Error()} - } - continue - } - - if svc, ok = s.services[r.service]; !ok { // rpc method isn't available - requests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}} - continue - } - - if r.isPubSub { // eth_subscribe, r.method contains the subscription method name - if callb, ok := svc.subscriptions[r.method]; ok { - requests[i] = &serverRequest{id: r.id, svcname: svc.name, callb: callb} - if r.params != nil && len(callb.argTypes) > 0 { - argTypes := []reflect.Type{reflect.TypeOf("")} - argTypes = append(argTypes, callb.argTypes...) - if args, err := codec.ParseRequestArguments(argTypes, r.params); err == nil { - requests[i].args = args[1:] // first one is service.method name which isn't an actual argument - } else { - requests[i].err = &invalidParamsError{err.Error()} - } - } - } else { - requests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}} - } - continue - } - - if callb, ok := svc.callbacks[r.method]; ok { // lookup RPC method - requests[i] = &serverRequest{id: r.id, svcname: svc.name, callb: callb} - if r.params != nil && len(callb.argTypes) > 0 { - if args, err := codec.ParseRequestArguments(callb.argTypes, r.params); err == nil { - requests[i].args = args - } else { - requests[i].err = &invalidParamsError{err.Error()} - } - } - continue - } +// Modules returns the list of RPC services with their version number +func (s *RPCService) Modules() map[string]string { + s.server.services.mu.Lock() + defer s.server.services.mu.Unlock() - requests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}} + modules := make(map[string]string) + for name := range s.server.services.services { + modules[name] = "1.0" } - - return requests, batch, nil + return modules } diff --git a/rpc/server_test.go b/rpc/server_test.go index 90d62f26d8f6..39099546bbe0 100644 --- a/rpc/server_test.go +++ b/rpc/server_test.go @@ -17,146 +17,136 @@ package rpc import ( - "context" - "encoding/json" + "bufio" + "bytes" + "io" + "io/ioutil" "net" - "reflect" + "path/filepath" + "strings" "testing" "time" ) -type Service struct{} - -type Args struct { - S string -} - -func (s *Service) NoArgsRets() { -} - -type Result struct { - String string - Int int - Args *Args -} - -func (s *Service) Echo(str string, i int, args *Args) Result { - return Result{str, i, args} -} - -func (s *Service) EchoWithCtx(ctx context.Context, str string, i int, args *Args) Result { - return Result{str, i, args} -} - -func (s *Service) Sleep(ctx context.Context, duration time.Duration) { - select { - case <-time.After(duration): - case <-ctx.Done(): - } -} - -func (s *Service) Rets() (string, error) { - return "", nil -} - -func (s *Service) InvalidRets1() (error, string) { - return nil, "" -} - -func (s *Service) InvalidRets2() (string, string) { - return "", "" -} - -func (s *Service) InvalidRets3() (string, string, error) { - return "", "", nil -} - -func (s *Service) Subscription(ctx context.Context) (*Subscription, error) { - return nil, nil -} - func TestServerRegisterName(t *testing.T) { server := NewServer() - service := new(Service) + service := new(testService) - if err := server.RegisterName("calc", service); err != nil { + if err := server.RegisterName("test", service); err != nil { t.Fatalf("%v", err) } - if len(server.services) != 2 { - t.Fatalf("Expected 2 service entries, got %d", len(server.services)) + if len(server.services.services) != 2 { + t.Fatalf("Expected 2 service entries, got %d", len(server.services.services)) } - svc, ok := server.services["calc"] + svc, ok := server.services.services["test"] if !ok { t.Fatalf("Expected service calc to be registered") } - if len(svc.callbacks) != 5 { - t.Errorf("Expected 5 callbacks for service 'calc', got %d", len(svc.callbacks)) - } - - if len(svc.subscriptions) != 1 { - t.Errorf("Expected 1 subscription for service 'calc', got %d", len(svc.subscriptions)) + wantCallbacks := 7 + if len(svc.callbacks) != wantCallbacks { + t.Errorf("Expected %d callbacks for service 'service', got %d", wantCallbacks, len(svc.callbacks)) } } -func testServerMethodExecution(t *testing.T, method string) { - server := NewServer() - service := new(Service) - - if err := server.RegisterName("test", service); err != nil { - t.Fatalf("%v", err) +func TestServer(t *testing.T) { + files, err := ioutil.ReadDir("testdata") + if err != nil { + t.Fatal("where'd my testdata go?") } + for _, f := range files { + if f.IsDir() || strings.HasPrefix(f.Name(), ".") { + continue + } + path := filepath.Join("testdata", f.Name()) + name := strings.TrimSuffix(f.Name(), filepath.Ext(f.Name())) + t.Run(name, func(t *testing.T) { + runTestScript(t, path) + }) + } +} - stringArg := "string arg" - intArg := 1122 - argsArg := &Args{"abcde"} - params := []interface{}{stringArg, intArg, argsArg} - - request := map[string]interface{}{ - "id": 12345, - "method": "test_" + method, - "version": "2.0", - "params": params, +func runTestScript(t *testing.T, file string) { + server := newTestServer() + content, err := ioutil.ReadFile(file) + if err != nil { + t.Fatal(err) } clientConn, serverConn := net.Pipe() defer clientConn.Close() - - go server.ServeCodec(NewJSONCodec(serverConn), OptionMethodInvocation) - - out := json.NewEncoder(clientConn) - in := json.NewDecoder(clientConn) - - if err := out.Encode(request); err != nil { - t.Fatal(err) + go server.ServeCodec(NewJSONCodec(serverConn), OptionMethodInvocation|OptionSubscriptions) + readbuf := bufio.NewReader(clientConn) + for _, line := range strings.Split(string(content), "\n") { + line = strings.TrimSpace(line) + switch { + case len(line) == 0 || strings.HasPrefix(line, "//"): + // skip comments, blank lines + continue + case strings.HasPrefix(line, "--> "): + t.Log(line) + // write to connection + clientConn.SetWriteDeadline(time.Now().Add(5 * time.Second)) + if _, err := io.WriteString(clientConn, line[4:]+"\n"); err != nil { + t.Fatalf("write error: %v", err) + } + case strings.HasPrefix(line, "<-- "): + t.Log(line) + want := line[4:] + // read line from connection and compare text + clientConn.SetReadDeadline(time.Now().Add(5 * time.Second)) + sent, err := readbuf.ReadString('\n') + if err != nil { + t.Fatalf("read error: %v", err) + } + sent = strings.TrimRight(sent, "\r\n") + if sent != want { + t.Errorf("wrong line from server\ngot: %s\nwant: %s", sent, want) + } + default: + panic("invalid line in test script: " + line) + } } +} - response := jsonSuccessResponse{Result: &Result{}} - if err := in.Decode(&response); err != nil { - t.Fatal(err) - } +// This test checks that responses are delivered for very short-lived connections that +// only carry a single request. +func TestServerShortLivedConn(t *testing.T) { + server := newTestServer() + defer server.Stop() - if result, ok := response.Result.(*Result); ok { - if result.String != stringArg { - t.Errorf("expected %s, got : %s\n", stringArg, result.String) + listener, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal("can't listen:", err) + } + defer listener.Close() + go server.ServeListener(listener) + + var ( + request = `{"jsonrpc":"2.0","id":1,"method":"rpc_modules"}` + "\n" + wantResp = `{"jsonrpc":"2.0","id":1,"result":{"nftest":"1.0","rpc":"1.0","test":"1.0"}}` + "\n" + deadline = time.Now().Add(10 * time.Second) + ) + for i := 0; i < 20; i++ { + conn, err := net.Dial("tcp", listener.Addr().String()) + if err != nil { + t.Fatal("can't dial:", err) } - if result.Int != intArg { - t.Errorf("expected %d, got %d\n", intArg, result.Int) + defer conn.Close() + conn.SetDeadline(deadline) + // Write the request, then half-close the connection so the server stops reading. + conn.Write([]byte(request)) + conn.(*net.TCPConn).CloseWrite() + // Now try to get the response. + buf := make([]byte, 2000) + n, err := conn.Read(buf) + if err != nil { + t.Fatal("read error:", err) } - if !reflect.DeepEqual(result.Args, argsArg) { - t.Errorf("expected %v, got %v\n", argsArg, result) + if !bytes.Equal(buf[:n], []byte(wantResp)) { + t.Fatalf("wrong response: %s", buf[:n]) } - } else { - t.Fatalf("invalid response: expected *Result - got: %T", response.Result) } } - -func TestServerMethodExecution(t *testing.T) { - testServerMethodExecution(t, "echo") -} - -func TestServerMethodWithCtx(t *testing.T) { - testServerMethodExecution(t, "echoWithCtx") -} diff --git a/rpc/service.go b/rpc/service.go new file mode 100644 index 000000000000..81e65f810b71 --- /dev/null +++ b/rpc/service.go @@ -0,0 +1,285 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rpc + +import ( + "context" + "errors" + "fmt" + "reflect" + "runtime" + "strings" + "sync" + "unicode" + "unicode/utf8" + + "github.com/ethereum/go-ethereum/log" +) + +var ( + contextType = reflect.TypeOf((*context.Context)(nil)).Elem() + errorType = reflect.TypeOf((*error)(nil)).Elem() + subscriptionType = reflect.TypeOf(Subscription{}) + stringType = reflect.TypeOf("") +) + +type serviceRegistry struct { + mu sync.Mutex + services map[string]service +} + +// service represents a registered object. +type service struct { + name string // name for service + callbacks map[string]*callback // registered handlers + subscriptions map[string]*callback // available subscriptions/notifications +} + +// callback is a method callback which was registered in the server +type callback struct { + fn reflect.Value // the function + rcvr reflect.Value // receiver object of method, set if fn is method + argTypes []reflect.Type // input argument types + hasCtx bool // method's first argument is a context (not included in argTypes) + errPos int // err return idx, of -1 when method cannot return error + isSubscribe bool // true if this is a subscription callback +} + +func (r *serviceRegistry) registerName(name string, rcvr interface{}) error { + rcvrVal := reflect.ValueOf(rcvr) + if name == "" { + return fmt.Errorf("no service name for type %s", rcvrVal.Type().String()) + } + callbacks := suitableCallbacks(rcvrVal) + if len(callbacks) == 0 { + return fmt.Errorf("service %T doesn't have any suitable methods/subscriptions to expose", rcvr) + } + + r.mu.Lock() + defer r.mu.Unlock() + if r.services == nil { + r.services = make(map[string]service) + } + svc, ok := r.services[name] + if !ok { + svc = service{ + name: name, + callbacks: make(map[string]*callback), + subscriptions: make(map[string]*callback), + } + r.services[name] = svc + } + for name, cb := range callbacks { + if cb.isSubscribe { + svc.subscriptions[name] = cb + } else { + svc.callbacks[name] = cb + } + } + return nil +} + +// callback returns the callback corresponding to the given RPC method name. +func (r *serviceRegistry) callback(method string) *callback { + elem := strings.SplitN(method, serviceMethodSeparator, 2) + if len(elem) != 2 { + return nil + } + r.mu.Lock() + defer r.mu.Unlock() + return r.services[elem[0]].callbacks[elem[1]] +} + +// subscription returns a subscription callback in the given service. +func (r *serviceRegistry) subscription(service, name string) *callback { + r.mu.Lock() + defer r.mu.Unlock() + return r.services[service].subscriptions[name] +} + +// suitableCallbacks iterates over the methods of the given type. It determines if a method +// satisfies the criteria for a RPC callback or a subscription callback and adds it to the +// collection of callbacks. See server documentation for a summary of these criteria. +func suitableCallbacks(receiver reflect.Value) map[string]*callback { + typ := receiver.Type() + callbacks := make(map[string]*callback) + for m := 0; m < typ.NumMethod(); m++ { + method := typ.Method(m) + if method.PkgPath != "" { + continue // method not exported + } + cb := newCallback(receiver, method.Func) + if cb == nil { + continue // function invalid + } + name := formatName(method.Name) + callbacks[name] = cb + } + return callbacks +} + +// newCallback turns fn (a function) into a callback object. It returns nil if the function +// is unsuitable as an RPC callback. +func newCallback(receiver, fn reflect.Value) *callback { + fntype := fn.Type() + c := &callback{fn: fn, rcvr: receiver, errPos: -1, isSubscribe: isPubSub(fntype)} + // Determine parameter types. They must all be exported or builtin types. + c.makeArgTypes() + if !allExportedOrBuiltin(c.argTypes) { + return nil + } + // Verify return types. The function must return at most one error + // and/or one other non-error value. + outs := make([]reflect.Type, fntype.NumOut()) + for i := 0; i < fntype.NumOut(); i++ { + outs[i] = fntype.Out(i) + } + if len(outs) > 2 || !allExportedOrBuiltin(outs) { + return nil + } + // If an error is returned, it must be the last returned value. + switch { + case len(outs) == 1 && isErrorType(outs[0]): + c.errPos = 0 + case len(outs) == 2: + if isErrorType(outs[0]) || !isErrorType(outs[1]) { + return nil + } + c.errPos = 1 + } + return c +} + +// makeArgTypes composes the argTypes list. +func (c *callback) makeArgTypes() { + fntype := c.fn.Type() + // Skip receiver and context.Context parameter (if present). + firstArg := 0 + if c.rcvr.IsValid() { + firstArg++ + } + if fntype.NumIn() > firstArg && fntype.In(firstArg) == contextType { + c.hasCtx = true + firstArg++ + } + // Add all remaining parameters. + c.argTypes = make([]reflect.Type, fntype.NumIn()-firstArg) + for i := firstArg; i < fntype.NumIn(); i++ { + c.argTypes[i-firstArg] = fntype.In(i) + } +} + +// call invokes the callback. +func (c *callback) call(ctx context.Context, method string, args []reflect.Value) (res interface{}, errRes error) { + // Create the argument slice. + fullargs := make([]reflect.Value, 0, 2+len(args)) + if c.rcvr.IsValid() { + fullargs = append(fullargs, c.rcvr) + } + if c.hasCtx { + fullargs = append(fullargs, reflect.ValueOf(ctx)) + } + fullargs = append(fullargs, args...) + + // Catch panic while running the callback. + defer func() { + if err := recover(); err != nil { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + log.Error("RPC method " + method + " crashed: " + fmt.Sprintf("%v\n%s", err, buf)) + errRes = errors.New("method handler crashed") + } + }() + // Run the callback. + results := c.fn.Call(fullargs) + if len(results) == 0 { + return nil, nil + } + if c.errPos >= 0 && !results[c.errPos].IsNil() { + // Method has returned non-nil error value. + err := results[c.errPos].Interface().(error) + return reflect.Value{}, err + } + return results[0].Interface(), nil +} + +// Is this an exported - upper case - name? +func isExported(name string) bool { + rune, _ := utf8.DecodeRuneInString(name) + return unicode.IsUpper(rune) +} + +// Are all those types exported or built-in? +func allExportedOrBuiltin(types []reflect.Type) bool { + for _, typ := range types { + for typ.Kind() == reflect.Ptr { + typ = typ.Elem() + } + // PkgPath will be non-empty even for an exported type, + // so we need to check the type name as well. + if !isExported(typ.Name()) && typ.PkgPath() != "" { + return false + } + } + return true +} + +// Is t context.Context or *context.Context? +func isContextType(t reflect.Type) bool { + for t.Kind() == reflect.Ptr { + t = t.Elem() + } + return t == contextType +} + +// Does t satisfy the error interface? +func isErrorType(t reflect.Type) bool { + for t.Kind() == reflect.Ptr { + t = t.Elem() + } + return t.Implements(errorType) +} + +// Is t Subscription or *Subscription? +func isSubscriptionType(t reflect.Type) bool { + for t.Kind() == reflect.Ptr { + t = t.Elem() + } + return t == subscriptionType +} + +// isPubSub tests whether the given method has as as first argument a context.Context and +// returns the pair (Subscription, error). +func isPubSub(methodType reflect.Type) bool { + // numIn(0) is the receiver type + if methodType.NumIn() < 2 || methodType.NumOut() != 2 { + return false + } + return isContextType(methodType.In(1)) && + isSubscriptionType(methodType.Out(0)) && + isErrorType(methodType.Out(1)) +} + +// formatName converts to first character of name to lowercase. +func formatName(name string) string { + ret := []rune(name) + if len(ret) > 0 { + ret[0] = unicode.ToLower(ret[0]) + } + return string(ret) +} diff --git a/rpc/stdio.go b/rpc/stdio.go new file mode 100644 index 000000000000..d5dc066c99bb --- /dev/null +++ b/rpc/stdio.go @@ -0,0 +1,66 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rpc + +import ( + "context" + "errors" + "io" + "net" + "os" + "time" +) + +// DialStdIO creates a client on stdin/stdout. +func DialStdIO(ctx context.Context) (*Client, error) { + return DialIO(ctx, os.Stdin, os.Stdout) +} + +// DialIO creates a client which uses the given IO channels +func DialIO(ctx context.Context, in io.Reader, out io.Writer) (*Client, error) { + return newClient(ctx, func(_ context.Context) (ServerCodec, error) { + return NewJSONCodec(stdioConn{ + in: in, + out: out, + }), nil + }) +} + +type stdioConn struct { + in io.Reader + out io.Writer +} + +func (io stdioConn) Read(b []byte) (n int, err error) { + return io.in.Read(b) +} + +func (io stdioConn) Write(b []byte) (n int, err error) { + return io.out.Write(b) +} + +func (io stdioConn) Close() error { + return nil +} + +func (io stdioConn) RemoteAddr() string { + return "/dev/stdin" +} + +func (io stdioConn) SetWriteDeadline(t time.Time) error { + return &net.OpError{Op: "set", Net: "stdio", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} +} diff --git a/rpc/subscription.go b/rpc/subscription.go index 6ce7befa1d13..c1e869b8a3a4 100644 --- a/rpc/subscription.go +++ b/rpc/subscription.go @@ -17,9 +17,19 @@ package rpc import ( + "bufio" + "container/list" "context" + crand "crypto/rand" + "encoding/binary" + "encoding/hex" + "encoding/json" "errors" + "math/rand" + "reflect" + "strings" "sync" + "time" ) var ( @@ -29,107 +39,289 @@ var ( ErrSubscriptionNotFound = errors.New("subscription not found") ) +var globalGen = randomIDGenerator() + // ID defines a pseudo random number that is used to identify RPC subscriptions. type ID string -// a Subscription is created by a notifier and tight to that notifier. The client can use -// this subscription to wait for an unsubscribe request for the client, see Err(). -type Subscription struct { - ID ID - namespace string - err chan error // closed on unsubscribe +// NewID returns a new, random ID. +func NewID() ID { + return globalGen() } -// Err returns a channel that is closed when the client send an unsubscribe request. -func (s *Subscription) Err() <-chan error { - return s.err +// randomIDGenerator returns a function generates a random IDs. +func randomIDGenerator() func() ID { + seed, err := binary.ReadVarint(bufio.NewReader(crand.Reader)) + if err != nil { + seed = int64(time.Now().Nanosecond()) + } + var ( + mu sync.Mutex + rng = rand.New(rand.NewSource(seed)) + ) + return func() ID { + mu.Lock() + defer mu.Unlock() + id := make([]byte, 16) + rng.Read(id) + return encodeID(id) + } } -// notifierKey is used to store a notifier within the connection context. -type notifierKey struct{} - -// Notifier is tight to a RPC connection that supports subscriptions. -// Server callbacks use the notifier to send notifications. -type Notifier struct { - codec ServerCodec - subMu sync.RWMutex // guards active and inactive maps - active map[ID]*Subscription - inactive map[ID]*Subscription -} - -// newNotifier creates a new notifier that can be used to send subscription -// notifications to the client. -func newNotifier(codec ServerCodec) *Notifier { - return &Notifier{ - codec: codec, - active: make(map[ID]*Subscription), - inactive: make(map[ID]*Subscription), +func encodeID(b []byte) ID { + id := hex.EncodeToString(b) + id = strings.TrimLeft(id, "0") + if id == "" { + id = "0" // ID's are RPC quantities, no leading zero's and 0 is 0x0. } + return ID("0x" + id) } +type notifierKey struct{} + // NotifierFromContext returns the Notifier value stored in ctx, if any. func NotifierFromContext(ctx context.Context) (*Notifier, bool) { n, ok := ctx.Value(notifierKey{}).(*Notifier) return n, ok } +// Notifier is tied to a RPC connection that supports subscriptions. +// Server callbacks use the notifier to send notifications. +type Notifier struct { + h *handler + namespace string + + mu sync.Mutex + sub *Subscription + buffer []json.RawMessage + callReturned bool + activated bool +} + // CreateSubscription returns a new subscription that is coupled to the // RPC connection. By default subscriptions are inactive and notifications // are dropped until the subscription is marked as active. This is done // by the RPC server after the subscription ID is send to the client. func (n *Notifier) CreateSubscription() *Subscription { - s := &Subscription{ID: NewID(), err: make(chan error)} - n.subMu.Lock() - n.inactive[s.ID] = s - n.subMu.Unlock() - return s + n.mu.Lock() + defer n.mu.Unlock() + + if n.sub != nil { + panic("can't create multiple subscriptions with Notifier") + } else if n.callReturned { + panic("can't create subscription after subscribe call has returned") + } + n.sub = &Subscription{ID: n.h.idgen(), namespace: n.namespace, err: make(chan error, 1)} + return n.sub } // Notify sends a notification to the client with the given data as payload. // If an error occurs the RPC connection is closed and the error is returned. func (n *Notifier) Notify(id ID, data interface{}) error { - n.subMu.RLock() - defer n.subMu.RUnlock() - - sub, active := n.active[id] - if active { - notification := n.codec.CreateNotification(string(id), sub.namespace, data) - if err := n.codec.Write(notification); err != nil { - n.codec.Close() - return err - } + enc, err := json.Marshal(data) + if err != nil { + return err } + + n.mu.Lock() + defer n.mu.Unlock() + + if n.sub == nil { + panic("can't Notify before subscription is created") + } else if n.sub.ID != id { + panic("Notify with wrong ID") + } + if n.activated { + return n.send(n.sub, enc) + } + n.buffer = append(n.buffer, enc) return nil } // Closed returns a channel that is closed when the RPC connection is closed. +// Deprecated: use subscription error channel func (n *Notifier) Closed() <-chan interface{} { - return n.codec.Closed() -} - -// unsubscribe a subscription. -// If the subscription could not be found ErrSubscriptionNotFound is returned. -func (n *Notifier) unsubscribe(id ID) error { - n.subMu.Lock() - defer n.subMu.Unlock() - if s, found := n.active[id]; found { - close(s.err) - delete(n.active, id) - return nil + return n.h.conn.Closed() +} + +// takeSubscription returns the subscription (if one has been created). No subscription can +// be created after this call. +func (n *Notifier) takeSubscription() *Subscription { + n.mu.Lock() + defer n.mu.Unlock() + n.callReturned = true + return n.sub +} + +// acticate is called after the subscription ID was sent to client. Notifications are +// buffered before activation. This prevents notifications being sent to the client before +// the subscription ID is sent to the client. +func (n *Notifier) activate() error { + n.mu.Lock() + defer n.mu.Unlock() + + for _, data := range n.buffer { + if err := n.send(n.sub, data); err != nil { + return err + } } - return ErrSubscriptionNotFound -} - -// activate enables a subscription. Until a subscription is enabled all -// notifications are dropped. This method is called by the RPC server after -// the subscription ID was sent to client. This prevents notifications being -// send to the client before the subscription ID is send to the client. -func (n *Notifier) activate(id ID, namespace string) { - n.subMu.Lock() - defer n.subMu.Unlock() - if sub, found := n.inactive[id]; found { - sub.namespace = namespace - n.active[id] = sub - delete(n.inactive, id) + n.activated = true + return nil +} + +func (n *Notifier) send(sub *Subscription, data json.RawMessage) error { + params, _ := json.Marshal(&subscriptionResult{ID: string(sub.ID), Result: data}) + ctx := context.Background() + return n.h.conn.Write(ctx, &jsonrpcMessage{ + Version: vsn, + Method: n.namespace + notificationMethodSuffix, + Params: params, + }) +} + +// A Subscription is created by a notifier and tight to that notifier. The client can use +// this subscription to wait for an unsubscribe request for the client, see Err(). +type Subscription struct { + ID ID + namespace string + err chan error // closed on unsubscribe +} + +// Err returns a channel that is closed when the client send an unsubscribe request. +func (s *Subscription) Err() <-chan error { + return s.err +} + +// MarshalJSON marshals a subscription as its ID. +func (s *Subscription) MarshalJSON() ([]byte, error) { + return json.Marshal(s.ID) +} + +// ClientSubscription is a subscription established through the Client's Subscribe or +// EthSubscribe methods. +type ClientSubscription struct { + client *Client + etype reflect.Type + channel reflect.Value + namespace string + subid string + in chan json.RawMessage + + quitOnce sync.Once // ensures quit is closed once + quit chan struct{} // quit is closed when the subscription exits + errOnce sync.Once // ensures err is closed once + err chan error +} + +func newClientSubscription(c *Client, namespace string, channel reflect.Value) *ClientSubscription { + sub := &ClientSubscription{ + client: c, + namespace: namespace, + etype: channel.Type().Elem(), + channel: channel, + quit: make(chan struct{}), + err: make(chan error, 1), + in: make(chan json.RawMessage), } + return sub +} + +// Err returns the subscription error channel. The intended use of Err is to schedule +// resubscription when the client connection is closed unexpectedly. +// +// The error channel receives a value when the subscription has ended due +// to an error. The received error is nil if Close has been called +// on the underlying client and no other error has occurred. +// +// The error channel is closed when Unsubscribe is called on the subscription. +func (sub *ClientSubscription) Err() <-chan error { + return sub.err +} + +// Unsubscribe unsubscribes the notification and closes the error channel. +// It can safely be called more than once. +func (sub *ClientSubscription) Unsubscribe() { + sub.quitWithError(nil, true) + sub.errOnce.Do(func() { close(sub.err) }) +} + +func (sub *ClientSubscription) quitWithError(err error, unsubscribeServer bool) { + sub.quitOnce.Do(func() { + // The dispatch loop won't be able to execute the unsubscribe call + // if it is blocked on deliver. Close sub.quit first because it + // unblocks deliver. + close(sub.quit) + if unsubscribeServer { + sub.requestUnsubscribe() + } + if err != nil { + if err == ErrClientQuit { + err = nil // Adhere to subscription semantics. + } + sub.err <- err + } + }) +} + +func (sub *ClientSubscription) deliver(result json.RawMessage) (ok bool) { + select { + case sub.in <- result: + return true + case <-sub.quit: + return false + } +} + +func (sub *ClientSubscription) start() { + sub.quitWithError(sub.forward()) +} + +func (sub *ClientSubscription) forward() (err error, unsubscribeServer bool) { + cases := []reflect.SelectCase{ + {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.quit)}, + {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.in)}, + {Dir: reflect.SelectSend, Chan: sub.channel}, + } + buffer := list.New() + defer buffer.Init() + for { + var chosen int + var recv reflect.Value + if buffer.Len() == 0 { + // Idle, omit send case. + chosen, recv, _ = reflect.Select(cases[:2]) + } else { + // Non-empty buffer, send the first queued item. + cases[2].Send = reflect.ValueOf(buffer.Front().Value) + chosen, recv, _ = reflect.Select(cases) + } + + switch chosen { + case 0: // <-sub.quit + return nil, false + case 1: // <-sub.in + val, err := sub.unmarshal(recv.Interface().(json.RawMessage)) + if err != nil { + return err, true + } + if buffer.Len() == maxClientSubscriptionBuffer { + return ErrSubscriptionQueueOverflow, true + } + buffer.PushBack(val) + case 2: // sub.channel<- + cases[2].Send = reflect.Value{} // Don't hold onto the value. + buffer.Remove(buffer.Front()) + } + } +} + +func (sub *ClientSubscription) unmarshal(result json.RawMessage) (interface{}, error) { + val := reflect.New(sub.etype) + err := json.Unmarshal(result, val.Interface()) + return val.Elem().Interface(), err +} + +func (sub *ClientSubscription) requestUnsubscribe() error { + var result interface{} + return sub.client.Call(&result, sub.namespace+unsubscribeMethodSuffix, sub.subid) } diff --git a/rpc/subscription_test.go b/rpc/subscription_test.go index 0ba177e63b45..eba192450db0 100644 --- a/rpc/subscription_test.go +++ b/rpc/subscription_test.go @@ -17,313 +17,189 @@ package rpc import ( - "context" "encoding/json" "fmt" "net" - "sync" + "strings" "testing" "time" ) -type NotificationTestService struct { - mu sync.Mutex - unsubscribed bool - - gotHangSubscriptionReq chan struct{} - unblockHangSubscription chan struct{} -} - -func (s *NotificationTestService) Echo(i int) int { - return i -} - -func (s *NotificationTestService) wasUnsubCallbackCalled() bool { - s.mu.Lock() - defer s.mu.Unlock() - return s.unsubscribed -} - -func (s *NotificationTestService) Unsubscribe(subid string) { - s.mu.Lock() - s.unsubscribed = true - s.mu.Unlock() -} - -func (s *NotificationTestService) SomeSubscription(ctx context.Context, n, val int) (*Subscription, error) { - notifier, supported := NotifierFromContext(ctx) - if !supported { - return nil, ErrNotificationsUnsupported - } - - // by explicitly creating an subscription we make sure that the subscription id is send back to the client - // before the first subscription.Notify is called. Otherwise the events might be send before the response - // for the eth_subscribe method. - subscription := notifier.CreateSubscription() - - go func() { - // test expects n events, if we begin sending event immediately some events - // will probably be dropped since the subscription ID might not be send to - // the client. - time.Sleep(5 * time.Second) - for i := 0; i < n; i++ { - if err := notifier.Notify(subscription.ID, val+i); err != nil { - return - } - } - - select { - case <-notifier.Closed(): - s.mu.Lock() - s.unsubscribed = true - s.mu.Unlock() - case <-subscription.Err(): - s.mu.Lock() - s.unsubscribed = true - s.mu.Unlock() +func TestNewID(t *testing.T) { + hexchars := "0123456789ABCDEFabcdef" + for i := 0; i < 100; i++ { + id := string(NewID()) + if !strings.HasPrefix(id, "0x") { + t.Fatalf("invalid ID prefix, want '0x...', got %s", id) } - }() - - return subscription, nil -} - -// HangSubscription blocks on s.unblockHangSubscription before -// sending anything. -func (s *NotificationTestService) HangSubscription(ctx context.Context, val int) (*Subscription, error) { - notifier, supported := NotifierFromContext(ctx) - if !supported { - return nil, ErrNotificationsUnsupported - } - - s.gotHangSubscriptionReq <- struct{}{} - <-s.unblockHangSubscription - subscription := notifier.CreateSubscription() - go func() { - notifier.Notify(subscription.ID, val) - }() - return subscription, nil -} - -func TestNotifications(t *testing.T) { - server := NewServer() - service := &NotificationTestService{} - - if err := server.RegisterName("eth", service); err != nil { - t.Fatalf("unable to register test service %v", err) - } - - clientConn, serverConn := net.Pipe() - - go server.ServeCodec(NewJSONCodec(serverConn), OptionMethodInvocation|OptionSubscriptions) - - out := json.NewEncoder(clientConn) - in := json.NewDecoder(clientConn) - - n := 5 - val := 12345 - request := map[string]interface{}{ - "id": 1, - "method": "eth_subscribe", - "version": "2.0", - "params": []interface{}{"someSubscription", n, val}, - } - - // create subscription - if err := out.Encode(request); err != nil { - t.Fatal(err) - } - - var subid string - response := jsonSuccessResponse{Result: subid} - if err := in.Decode(&response); err != nil { - t.Fatal(err) - } - - var ok bool - if _, ok = response.Result.(string); !ok { - t.Fatalf("expected subscription id, got %T", response.Result) - } - - for i := 0; i < n; i++ { - var notification jsonNotification - if err := in.Decode(¬ification); err != nil { - t.Fatalf("%v", err) - } - - if int(notification.Params.Result.(float64)) != val+i { - t.Fatalf("expected %d, got %d", val+i, notification.Params.Result) - } - } - - clientConn.Close() // causes notification unsubscribe callback to be called - time.Sleep(1 * time.Second) - - if !service.wasUnsubCallbackCalled() { - t.Error("unsubscribe callback not called after closing connection") - } -} - -func waitForMessages(t *testing.T, in *json.Decoder, successes chan<- jsonSuccessResponse, - failures chan<- jsonErrResponse, notifications chan<- jsonNotification, errors chan<- error) { - - // read and parse server messages - for { - var rmsg json.RawMessage - if err := in.Decode(&rmsg); err != nil { - return - } - - var responses []map[string]interface{} - if rmsg[0] == '[' { - if err := json.Unmarshal(rmsg, &responses); err != nil { - errors <- fmt.Errorf("Received invalid message: %s", rmsg) - return - } - } else { - var msg map[string]interface{} - if err := json.Unmarshal(rmsg, &msg); err != nil { - errors <- fmt.Errorf("Received invalid message: %s", rmsg) - return - } - responses = append(responses, msg) + id = id[2:] + if len(id) == 0 || len(id) > 32 { + t.Fatalf("invalid ID length, want len(id) > 0 && len(id) <= 32), got %d", len(id)) } - for _, msg := range responses { - // determine what kind of msg was received and broadcast - // it to over the corresponding channel - if _, found := msg["result"]; found { - successes <- jsonSuccessResponse{ - Version: msg["jsonrpc"].(string), - Id: msg["id"], - Result: msg["result"], - } - continue - } - if _, found := msg["error"]; found { - params := msg["params"].(map[string]interface{}) - failures <- jsonErrResponse{ - Version: msg["jsonrpc"].(string), - Id: msg["id"], - Error: jsonError{int(params["subscription"].(float64)), params["message"].(string), params["data"]}, - } - continue + for i := 0; i < len(id); i++ { + if strings.IndexByte(hexchars, id[i]) == -1 { + t.Fatalf("unexpected byte, want any valid hex char, got %c", id[i]) } - if _, found := msg["params"]; found { - params := msg["params"].(map[string]interface{}) - notifications <- jsonNotification{ - Version: msg["jsonrpc"].(string), - Method: msg["method"].(string), - Params: jsonSubscription{params["subscription"].(string), params["result"]}, - } - continue - } - errors <- fmt.Errorf("Received invalid message: %s", msg) } } } -// TestSubscriptionMultipleNamespaces ensures that subscriptions can exists -// for multiple different namespaces. -func TestSubscriptionMultipleNamespaces(t *testing.T) { +func TestSubscriptions(t *testing.T) { var ( - namespaces = []string{"eth", "shh", "bzz"} + namespaces = []string{"eth", "shh", "bzz"} + service = ¬ificationTestService{} + subCount = len(namespaces) + notificationCount = 3 + server = NewServer() - service = NotificationTestService{} clientConn, serverConn = net.Pipe() - - out = json.NewEncoder(clientConn) - in = json.NewDecoder(clientConn) - successes = make(chan jsonSuccessResponse) - failures = make(chan jsonErrResponse) - notifications = make(chan jsonNotification) - - errors = make(chan error, 10) + out = json.NewEncoder(clientConn) + in = json.NewDecoder(clientConn) + successes = make(chan subConfirmation) + notifications = make(chan subscriptionResult) + errors = make(chan error, subCount*notificationCount+1) ) // setup and start server for _, namespace := range namespaces { - if err := server.RegisterName(namespace, &service); err != nil { + if err := server.RegisterName(namespace, service); err != nil { t.Fatalf("unable to register test service %v", err) } } - go server.ServeCodec(NewJSONCodec(serverConn), OptionMethodInvocation|OptionSubscriptions) defer server.Stop() // wait for message and write them to the given channels - go waitForMessages(t, in, successes, failures, notifications, errors) + go waitForMessages(in, successes, notifications, errors) // create subscriptions one by one - n := 3 for i, namespace := range namespaces { request := map[string]interface{}{ "id": i, "method": fmt.Sprintf("%s_subscribe", namespace), "version": "2.0", - "params": []interface{}{"someSubscription", n, i}, + "params": []interface{}{"someSubscription", notificationCount, i}, } - if err := out.Encode(&request); err != nil { t.Fatalf("Could not create subscription: %v", err) } } - // create all subscriptions in 1 batch - var requests []interface{} - for i, namespace := range namespaces { - requests = append(requests, map[string]interface{}{ - "id": i, - "method": fmt.Sprintf("%s_subscribe", namespace), - "version": "2.0", - "params": []interface{}{"someSubscription", n, i}, - }) - } - - if err := out.Encode(&requests); err != nil { - t.Fatalf("Could not create subscription in batch form: %v", err) - } - timeout := time.After(30 * time.Second) - subids := make(map[string]string, 2*len(namespaces)) - count := make(map[string]int, 2*len(namespaces)) - - for { - done := true - for id := range count { - if count, found := count[id]; !found || count < (2*n) { + subids := make(map[string]string, subCount) + count := make(map[string]int, subCount) + allReceived := func() bool { + done := len(count) == subCount + for _, c := range count { + if c < notificationCount { done = false } } - - if done && len(count) == len(namespaces) { - break - } - + return done + } + for !allReceived() { select { + case confirmation := <-successes: // subscription created + subids[namespaces[confirmation.reqid]] = string(confirmation.subid) + case notification := <-notifications: + count[notification.ID]++ case err := <-errors: t.Fatal(err) - case suc := <-successes: // subscription created - subids[namespaces[int(suc.Id.(float64))]] = suc.Result.(string) - case failure := <-failures: - t.Errorf("received error: %v", failure.Error) - case notification := <-notifications: - if cnt, found := count[notification.Params.Subscription]; found { - count[notification.Params.Subscription] = cnt + 1 - } else { - count[notification.Params.Subscription] = 1 - } case <-timeout: for _, namespace := range namespaces { subid, found := subids[namespace] if !found { - t.Errorf("Subscription for '%s' not created", namespace) + t.Errorf("subscription for %q not created", namespace) continue } - if count, found := count[subid]; !found || count < n { - t.Errorf("Didn't receive all notifications (%d<%d) in time for namespace '%s'", count, n, namespace) + if count, found := count[subid]; !found || count < notificationCount { + t.Errorf("didn't receive all notifications (%d<%d) in time for namespace %q", count, notificationCount, namespace) } } + t.Fatal("timed out") + } + } +} + +// This test checks that unsubscribing works. +func TestServerUnsubscribe(t *testing.T) { + // Start the server. + server := newTestServer() + service := ¬ificationTestService{unsubscribed: make(chan string)} + server.RegisterName("nftest2", service) + p1, p2 := net.Pipe() + go server.ServeCodec(NewJSONCodec(p1), OptionMethodInvocation|OptionSubscriptions) + + p2.SetDeadline(time.Now().Add(10 * time.Second)) + + // Subscribe. + p2.Write([]byte(`{"jsonrpc":"2.0","id":1,"method":"nftest2_subscribe","params":["someSubscription",0,10]}`)) + + // Handle received messages. + resps := make(chan subConfirmation) + notifications := make(chan subscriptionResult) + errors := make(chan error) + go waitForMessages(json.NewDecoder(p2), resps, notifications, errors) + + // Receive the subscription ID. + var sub subConfirmation + select { + case sub = <-resps: + case err := <-errors: + t.Fatal(err) + } + + // Unsubscribe and check that it is handled on the server side. + p2.Write([]byte(`{"jsonrpc":"2.0","method":"nftest2_unsubscribe","params":["` + sub.subid + `"]}`)) + for { + select { + case id := <-service.unsubscribed: + if id != string(sub.subid) { + t.Errorf("wrong subscription ID unsubscribed") + } + return + case err := <-errors: + t.Fatal(err) + case <-notifications: + // drop notifications + } + } +} + +type subConfirmation struct { + reqid int + subid ID +} + +func waitForMessages(in *json.Decoder, successes chan subConfirmation, notifications chan subscriptionResult, errors chan error) { + for { + var msg jsonrpcMessage + if err := in.Decode(&msg); err != nil { + errors <- fmt.Errorf("decode error: %v", err) + return + } + switch { + case msg.isNotification(): + var res subscriptionResult + if err := json.Unmarshal(msg.Params, &res); err != nil { + errors <- fmt.Errorf("invalid subscription result: %v", err) + } else { + notifications <- res + } + case msg.isResponse(): + var c subConfirmation + if msg.Error != nil { + errors <- msg.Error + } else if err := json.Unmarshal(msg.Result, &c.subid); err != nil { + errors <- fmt.Errorf("invalid response: %v", err) + } else { + json.Unmarshal(msg.ID, &c.reqid) + successes <- c + } + default: + errors <- fmt.Errorf("unrecognized message: %v", msg) return } } diff --git a/rpc/testdata/invalid-badid.js b/rpc/testdata/invalid-badid.js new file mode 100644 index 000000000000..2202b8ccd26e --- /dev/null +++ b/rpc/testdata/invalid-badid.js @@ -0,0 +1,7 @@ +// This test checks processing of messages with invalid ID. + +--> {"id":[],"method":"test_foo"} +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}} + +--> {"id":{},"method":"test_foo"} +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}} diff --git a/rpc/testdata/invalid-batch.js b/rpc/testdata/invalid-batch.js new file mode 100644 index 000000000000..f470574fb5b5 --- /dev/null +++ b/rpc/testdata/invalid-batch.js @@ -0,0 +1,14 @@ +// This test checks the behavior of batches with invalid elements. +// Empty batches are not allowed. Batches may contain junk. + +--> [] +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"empty batch"}} + +--> [1] +<-- [{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}}] + +--> [1,2,3] +<-- [{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}},{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}},{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}}] + +--> [{"jsonrpc":"2.0","id":1,"method":"test_echo","params":["foo",1]},55,{"jsonrpc":"2.0","id":2,"method":"unknown_method"},{"foo":"bar"}] +<-- [{"jsonrpc":"2.0","id":1,"result":{"String":"foo","Int":1,"Args":null}},{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}},{"jsonrpc":"2.0","id":2,"error":{"code":-32601,"message":"the method unknown_method does not exist/is not available"}},{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}}] diff --git a/rpc/testdata/invalid-idonly.js b/rpc/testdata/invalid-idonly.js new file mode 100644 index 000000000000..79997bee3060 --- /dev/null +++ b/rpc/testdata/invalid-idonly.js @@ -0,0 +1,7 @@ +// This test checks processing of messages that contain just the ID and nothing else. + +--> {"id":1} +<-- {"jsonrpc":"2.0","id":1,"error":{"code":-32600,"message":"invalid request"}} + +--> {"jsonrpc":"2.0","id":1} +<-- {"jsonrpc":"2.0","id":1,"error":{"code":-32600,"message":"invalid request"}} diff --git a/rpc/testdata/invalid-nonobj.js b/rpc/testdata/invalid-nonobj.js new file mode 100644 index 000000000000..4b9f4d994c13 --- /dev/null +++ b/rpc/testdata/invalid-nonobj.js @@ -0,0 +1,4 @@ +// This test checks behavior for invalid requests. + +--> 1 +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}} diff --git a/rpc/testdata/invalid-syntax.json b/rpc/testdata/invalid-syntax.json new file mode 100644 index 000000000000..b19429960309 --- /dev/null +++ b/rpc/testdata/invalid-syntax.json @@ -0,0 +1,5 @@ +// This test checks that an error is written for invalid JSON requests. + +--> 'f +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32700,"message":"invalid character '\\'' looking for beginning of value"}} + diff --git a/rpc/testdata/reqresp-batch.js b/rpc/testdata/reqresp-batch.js new file mode 100644 index 000000000000..977af7663099 --- /dev/null +++ b/rpc/testdata/reqresp-batch.js @@ -0,0 +1,8 @@ +// There is no response for all-notification batches. + +--> [{"jsonrpc":"2.0","method":"test_echo","params":["x",99]}] + +// This test checks regular batch calls. + +--> [{"jsonrpc":"2.0","id":2,"method":"test_echo","params":[]}, {"jsonrpc":"2.0","id": 3,"method":"test_echo","params":["x",3]}] +<-- [{"jsonrpc":"2.0","id":2,"error":{"code":-32602,"message":"missing value for required argument 0"}},{"jsonrpc":"2.0","id":3,"result":{"String":"x","Int":3,"Args":null}}] diff --git a/rpc/testdata/reqresp-echo.js b/rpc/testdata/reqresp-echo.js new file mode 100644 index 000000000000..7a9e90321c47 --- /dev/null +++ b/rpc/testdata/reqresp-echo.js @@ -0,0 +1,16 @@ +// This test calls the test_echo method. + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echo", "params": []} +<-- {"jsonrpc":"2.0","id":2,"error":{"code":-32602,"message":"missing value for required argument 0"}} + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echo", "params": ["x"]} +<-- {"jsonrpc":"2.0","id":2,"error":{"code":-32602,"message":"missing value for required argument 1"}} + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echo", "params": ["x", 3]} +<-- {"jsonrpc":"2.0","id":2,"result":{"String":"x","Int":3,"Args":null}} + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echo", "params": ["x", 3, {"S": "foo"}]} +<-- {"jsonrpc":"2.0","id":2,"result":{"String":"x","Int":3,"Args":{"S":"foo"}}} + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echoWithCtx", "params": ["x", 3, {"S": "foo"}]} +<-- {"jsonrpc":"2.0","id":2,"result":{"String":"x","Int":3,"Args":{"S":"foo"}}} diff --git a/rpc/testdata/reqresp-namedparam.js b/rpc/testdata/reqresp-namedparam.js new file mode 100644 index 000000000000..9a9372b0a711 --- /dev/null +++ b/rpc/testdata/reqresp-namedparam.js @@ -0,0 +1,5 @@ +// This test checks that an error response is sent for calls +// with named parameters. + +--> {"jsonrpc":"2.0","method":"test_echo","params":{"int":23},"id":3} +<-- {"jsonrpc":"2.0","id":3,"error":{"code":-32602,"message":"non-array args"}} diff --git a/rpc/testdata/reqresp-noargsrets.js b/rpc/testdata/reqresp-noargsrets.js new file mode 100644 index 000000000000..e61cc708ba33 --- /dev/null +++ b/rpc/testdata/reqresp-noargsrets.js @@ -0,0 +1,4 @@ +// This test calls the test_noArgsRets method. + +--> {"jsonrpc": "2.0", "id": "foo", "method": "test_noArgsRets", "params": []} +<-- {"jsonrpc":"2.0","id":"foo","result":null} diff --git a/rpc/testdata/reqresp-nomethod.js b/rpc/testdata/reqresp-nomethod.js new file mode 100644 index 000000000000..58ea6f3079b6 --- /dev/null +++ b/rpc/testdata/reqresp-nomethod.js @@ -0,0 +1,4 @@ +// This test calls a method that doesn't exist. + +--> {"jsonrpc": "2.0", "id": 2, "method": "invalid_method", "params": [2, 3]} +<-- {"jsonrpc":"2.0","id":2,"error":{"code":-32601,"message":"the method invalid_method does not exist/is not available"}} diff --git a/rpc/testdata/reqresp-noparam.js b/rpc/testdata/reqresp-noparam.js new file mode 100644 index 000000000000..2edf486d9f85 --- /dev/null +++ b/rpc/testdata/reqresp-noparam.js @@ -0,0 +1,4 @@ +// This test checks that calls with no parameters work. + +--> {"jsonrpc":"2.0","method":"test_noArgsRets","id":3} +<-- {"jsonrpc":"2.0","id":3,"result":null} diff --git a/rpc/testdata/reqresp-paramsnull.js b/rpc/testdata/reqresp-paramsnull.js new file mode 100644 index 000000000000..8a01bae1bbe7 --- /dev/null +++ b/rpc/testdata/reqresp-paramsnull.js @@ -0,0 +1,4 @@ +// This test checks that calls with "params":null work. + +--> {"jsonrpc":"2.0","method":"test_noArgsRets","params":null,"id":3} +<-- {"jsonrpc":"2.0","id":3,"result":null} diff --git a/rpc/testdata/revcall.js b/rpc/testdata/revcall.js new file mode 100644 index 000000000000..695d9858f87e --- /dev/null +++ b/rpc/testdata/revcall.js @@ -0,0 +1,6 @@ +// This test checks reverse calls. + +--> {"jsonrpc":"2.0","id":2,"method":"test_callMeBack","params":["foo",[1]]} +<-- {"jsonrpc":"2.0","id":1,"method":"foo","params":[1]} +--> {"jsonrpc":"2.0","id":1,"result":"my result"} +<-- {"jsonrpc":"2.0","id":2,"result":"my result"} diff --git a/rpc/testdata/revcall2.js b/rpc/testdata/revcall2.js new file mode 100644 index 000000000000..acab46551ec6 --- /dev/null +++ b/rpc/testdata/revcall2.js @@ -0,0 +1,7 @@ +// This test checks reverse calls. + +--> {"jsonrpc":"2.0","id":2,"method":"test_callMeBackLater","params":["foo",[1]]} +<-- {"jsonrpc":"2.0","id":2,"result":null} +<-- {"jsonrpc":"2.0","id":1,"method":"foo","params":[1]} +--> {"jsonrpc":"2.0","id":1,"result":"my result"} + diff --git a/rpc/testdata/subscription.js b/rpc/testdata/subscription.js new file mode 100644 index 000000000000..9f1007301080 --- /dev/null +++ b/rpc/testdata/subscription.js @@ -0,0 +1,12 @@ +// This test checks basic subscription support. + +--> {"jsonrpc":"2.0","id":1,"method":"nftest_subscribe","params":["someSubscription",5,1]} +<-- {"jsonrpc":"2.0","id":1,"result":"0x1"} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":1}} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":2}} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":3}} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":4}} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":5}} + +--> {"jsonrpc":"2.0","id":2,"method":"nftest_echo","params":[11]} +<-- {"jsonrpc":"2.0","id":2,"result":11} diff --git a/rpc/testservice_test.go b/rpc/testservice_test.go new file mode 100644 index 000000000000..98871b5d6cfc --- /dev/null +++ b/rpc/testservice_test.go @@ -0,0 +1,180 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rpc + +import ( + "context" + "encoding/binary" + "errors" + "sync" + "time" +) + +func newTestServer() *Server { + server := NewServer() + server.idgen = sequentialIDGenerator() + if err := server.RegisterName("test", new(testService)); err != nil { + panic(err) + } + if err := server.RegisterName("nftest", new(notificationTestService)); err != nil { + panic(err) + } + return server +} + +func sequentialIDGenerator() func() ID { + var ( + mu sync.Mutex + counter uint64 + ) + return func() ID { + mu.Lock() + defer mu.Unlock() + counter++ + id := make([]byte, 8) + binary.BigEndian.PutUint64(id, counter) + return encodeID(id) + } +} + +type testService struct{} + +type Args struct { + S string +} + +type Result struct { + String string + Int int + Args *Args +} + +func (s *testService) NoArgsRets() {} + +func (s *testService) Echo(str string, i int, args *Args) Result { + return Result{str, i, args} +} + +func (s *testService) EchoWithCtx(ctx context.Context, str string, i int, args *Args) Result { + return Result{str, i, args} +} + +func (s *testService) Sleep(ctx context.Context, duration time.Duration) { + time.Sleep(duration) +} + +func (s *testService) Rets() (string, error) { + return "", nil +} + +func (s *testService) InvalidRets1() (error, string) { + return nil, "" +} + +func (s *testService) InvalidRets2() (string, string) { + return "", "" +} + +func (s *testService) InvalidRets3() (string, string, error) { + return "", "", nil +} + +func (s *testService) CallMeBack(ctx context.Context, method string, args []interface{}) (interface{}, error) { + c, ok := ClientFromContext(ctx) + if !ok { + return nil, errors.New("no client") + } + var result interface{} + err := c.Call(&result, method, args...) + return result, err +} + +func (s *testService) CallMeBackLater(ctx context.Context, method string, args []interface{}) error { + c, ok := ClientFromContext(ctx) + if !ok { + return errors.New("no client") + } + go func() { + <-ctx.Done() + var result interface{} + c.Call(&result, method, args...) + }() + return nil +} + +func (s *testService) Subscription(ctx context.Context) (*Subscription, error) { + return nil, nil +} + +type notificationTestService struct { + unsubscribed chan string + gotHangSubscriptionReq chan struct{} + unblockHangSubscription chan struct{} +} + +func (s *notificationTestService) Echo(i int) int { + return i +} + +func (s *notificationTestService) Unsubscribe(subid string) { + if s.unsubscribed != nil { + s.unsubscribed <- subid + } +} + +func (s *notificationTestService) SomeSubscription(ctx context.Context, n, val int) (*Subscription, error) { + notifier, supported := NotifierFromContext(ctx) + if !supported { + return nil, ErrNotificationsUnsupported + } + + // By explicitly creating an subscription we make sure that the subscription id is send + // back to the client before the first subscription.Notify is called. Otherwise the + // events might be send before the response for the *_subscribe method. + subscription := notifier.CreateSubscription() + go func() { + for i := 0; i < n; i++ { + if err := notifier.Notify(subscription.ID, val+i); err != nil { + return + } + } + select { + case <-notifier.Closed(): + case <-subscription.Err(): + } + if s.unsubscribed != nil { + s.unsubscribed <- string(subscription.ID) + } + }() + return subscription, nil +} + +// HangSubscription blocks on s.unblockHangSubscription before sending anything. +func (s *notificationTestService) HangSubscription(ctx context.Context, val int) (*Subscription, error) { + notifier, supported := NotifierFromContext(ctx) + if !supported { + return nil, ErrNotificationsUnsupported + } + s.gotHangSubscriptionReq <- struct{}{} + <-s.unblockHangSubscription + subscription := notifier.CreateSubscription() + + go func() { + notifier.Notify(subscription.ID, val) + }() + return subscription, nil +} diff --git a/rpc/types.go b/rpc/types.go index 4252c3602762..f31f09a774a0 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -17,13 +17,11 @@ package rpc import ( + "context" "fmt" "math" - "reflect" "strings" - "sync" - mapset "github.com/deckarep/golang-set" "github.com/ethereum/go-ethereum/common/hexutil" ) @@ -35,57 +33,6 @@ type API struct { Public bool // indication if the methods must be considered safe for public use } -// callback is a method callback which was registered in the server -type callback struct { - rcvr reflect.Value // receiver of method - method reflect.Method // callback - argTypes []reflect.Type // input argument types - hasCtx bool // method's first argument is a context (not included in argTypes) - errPos int // err return idx, of -1 when method cannot return error - isSubscribe bool // indication if the callback is a subscription -} - -// service represents a registered object -type service struct { - name string // name for service - typ reflect.Type // receiver type - callbacks callbacks // registered handlers - subscriptions subscriptions // available subscriptions/notifications -} - -// serverRequest is an incoming request -type serverRequest struct { - id interface{} - svcname string - callb *callback - args []reflect.Value - isUnsubscribe bool - err Error -} - -type serviceRegistry map[string]*service // collection of services -type callbacks map[string]*callback // collection of RPC callbacks -type subscriptions map[string]*callback // collection of subscription callbacks - -// Server represents a RPC server -type Server struct { - services serviceRegistry - - run int32 - codecsMu sync.Mutex - codecs mapset.Set -} - -// rpcRequest represents a raw incoming RPC request -type rpcRequest struct { - service string - method string - id interface{} - isPubSub bool - params interface{} - err Error // invalid batch element -} - // Error wraps RPC errors, which contain an error code in addition to the message. type Error interface { Error() string // returns the message @@ -96,24 +43,19 @@ type Error interface { // a RPC session. Implementations must be go-routine safe since the codec can be called in // multiple go-routines concurrently. type ServerCodec interface { - // Read next request - ReadRequestHeaders() ([]rpcRequest, bool, Error) - // Parse request argument to the given types - ParseRequestArguments(argTypes []reflect.Type, params interface{}) ([]reflect.Value, Error) - // Assemble success response, expects response id and payload - CreateResponse(id interface{}, reply interface{}) interface{} - // Assemble error response, expects response id and error - CreateErrorResponse(id interface{}, err Error) interface{} - // Assemble error response with extra information about the error through info - CreateErrorResponseWithInfo(id interface{}, err Error, info interface{}) interface{} - // Create notification response - CreateNotification(id, namespace string, event interface{}) interface{} - // Write msg to client. - Write(msg interface{}) error - // Close underlying data stream + Read() (msgs []*jsonrpcMessage, isBatch bool, err error) Close() - // Closed when underlying connection is closed + jsonWriter +} + +// jsonWriter can write JSON messages to its underlying connection. +// Implementations must be safe for concurrent use. +type jsonWriter interface { + Write(context.Context, interface{}) error + // Closed returns a channel which is closed when the connection is closed. Closed() <-chan interface{} + // RemoteAddr returns the peer address of the connection. + RemoteAddr() string } type BlockNumber int64 diff --git a/rpc/utils.go b/rpc/utils.go deleted file mode 100644 index 7f7ac4520bc5..000000000000 --- a/rpc/utils.go +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package rpc - -import ( - "bufio" - "context" - crand "crypto/rand" - "encoding/binary" - "encoding/hex" - "math/rand" - "reflect" - "strings" - "sync" - "time" - "unicode" - "unicode/utf8" -) - -var ( - subscriptionIDGenMu sync.Mutex - subscriptionIDGen = idGenerator() -) - -// Is this an exported - upper case - name? -func isExported(name string) bool { - rune, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(rune) -} - -// Is this type exported or a builtin? -func isExportedOrBuiltinType(t reflect.Type) bool { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - // PkgPath will be non-empty even for an exported type, - // so we need to check the type name as well. - return isExported(t.Name()) || t.PkgPath() == "" -} - -var contextType = reflect.TypeOf((*context.Context)(nil)).Elem() - -// isContextType returns an indication if the given t is of context.Context or *context.Context type -func isContextType(t reflect.Type) bool { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - return t == contextType -} - -var errorType = reflect.TypeOf((*error)(nil)).Elem() - -// Implements this type the error interface -func isErrorType(t reflect.Type) bool { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - return t.Implements(errorType) -} - -var subscriptionType = reflect.TypeOf((*Subscription)(nil)).Elem() - -// isSubscriptionType returns an indication if the given t is of Subscription or *Subscription type -func isSubscriptionType(t reflect.Type) bool { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - return t == subscriptionType -} - -// isPubSub tests whether the given method has as as first argument a context.Context -// and returns the pair (Subscription, error) -func isPubSub(methodType reflect.Type) bool { - // numIn(0) is the receiver type - if methodType.NumIn() < 2 || methodType.NumOut() != 2 { - return false - } - - return isContextType(methodType.In(1)) && - isSubscriptionType(methodType.Out(0)) && - isErrorType(methodType.Out(1)) -} - -// formatName will convert to first character to lower case -func formatName(name string) string { - ret := []rune(name) - if len(ret) > 0 { - ret[0] = unicode.ToLower(ret[0]) - } - return string(ret) -} - -// suitableCallbacks iterates over the methods of the given type. It will determine if a method satisfies the criteria -// for a RPC callback or a subscription callback and adds it to the collection of callbacks or subscriptions. See server -// documentation for a summary of these criteria. -func suitableCallbacks(rcvr reflect.Value, typ reflect.Type) (callbacks, subscriptions) { - callbacks := make(callbacks) - subscriptions := make(subscriptions) - -METHODS: - for m := 0; m < typ.NumMethod(); m++ { - method := typ.Method(m) - mtype := method.Type - mname := formatName(method.Name) - if method.PkgPath != "" { // method must be exported - continue - } - - var h callback - h.isSubscribe = isPubSub(mtype) - h.rcvr = rcvr - h.method = method - h.errPos = -1 - - firstArg := 1 - numIn := mtype.NumIn() - if numIn >= 2 && mtype.In(1) == contextType { - h.hasCtx = true - firstArg = 2 - } - - if h.isSubscribe { - h.argTypes = make([]reflect.Type, numIn-firstArg) // skip rcvr type - for i := firstArg; i < numIn; i++ { - argType := mtype.In(i) - if isExportedOrBuiltinType(argType) { - h.argTypes[i-firstArg] = argType - } else { - continue METHODS - } - } - - subscriptions[mname] = &h - continue METHODS - } - - // determine method arguments, ignore first arg since it's the receiver type - // Arguments must be exported or builtin types - h.argTypes = make([]reflect.Type, numIn-firstArg) - for i := firstArg; i < numIn; i++ { - argType := mtype.In(i) - if !isExportedOrBuiltinType(argType) { - continue METHODS - } - h.argTypes[i-firstArg] = argType - } - - // check that all returned values are exported or builtin types - for i := 0; i < mtype.NumOut(); i++ { - if !isExportedOrBuiltinType(mtype.Out(i)) { - continue METHODS - } - } - - // when a method returns an error it must be the last returned value - h.errPos = -1 - for i := 0; i < mtype.NumOut(); i++ { - if isErrorType(mtype.Out(i)) { - h.errPos = i - break - } - } - - if h.errPos >= 0 && h.errPos != mtype.NumOut()-1 { - continue METHODS - } - - switch mtype.NumOut() { - case 0, 1, 2: - if mtype.NumOut() == 2 && h.errPos == -1 { // method must one return value and 1 error - continue METHODS - } - callbacks[mname] = &h - } - } - - return callbacks, subscriptions -} - -// idGenerator helper utility that generates a (pseudo) random sequence of -// bytes that are used to generate identifiers. -func idGenerator() *rand.Rand { - if seed, err := binary.ReadVarint(bufio.NewReader(crand.Reader)); err == nil { - return rand.New(rand.NewSource(seed)) - } - return rand.New(rand.NewSource(int64(time.Now().Nanosecond()))) -} - -// NewID generates a identifier that can be used as an identifier in the RPC interface. -// e.g. filter and subscription identifier. -func NewID() ID { - subscriptionIDGenMu.Lock() - defer subscriptionIDGenMu.Unlock() - - id := make([]byte, 16) - for i := 0; i < len(id); i += 7 { - val := subscriptionIDGen.Int63() - for j := 0; i+j < len(id) && j < 7; j++ { - id[i+j] = byte(val) - val >>= 8 - } - } - - rpcId := hex.EncodeToString(id) - // rpc ID's are RPC quantities, no leading zero's and 0 is 0x0 - rpcId = strings.TrimLeft(rpcId, "0") - if rpcId == "" { - rpcId = "0" - } - - return ID("0x" + rpcId) -} diff --git a/rpc/utils_test.go b/rpc/utils_test.go deleted file mode 100644 index e0e063f607f6..000000000000 --- a/rpc/utils_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package rpc - -import ( - "strings" - "testing" -) - -func TestNewID(t *testing.T) { - hexchars := "0123456789ABCDEFabcdef" - for i := 0; i < 100; i++ { - id := string(NewID()) - if !strings.HasPrefix(id, "0x") { - t.Fatalf("invalid ID prefix, want '0x...', got %s", id) - } - - id = id[2:] - if len(id) == 0 || len(id) > 32 { - t.Fatalf("invalid ID length, want len(id) > 0 && len(id) <= 32), got %d", len(id)) - } - - for i := 0; i < len(id); i++ { - if strings.IndexByte(hexchars, id[i]) == -1 { - t.Fatalf("unexpected byte, want any valid hex char, got %c", id[i]) - } - } - } -} diff --git a/rpc/websocket.go b/rpc/websocket.go index eae8320e5677..1632d6af412a 100644 --- a/rpc/websocket.go +++ b/rpc/websocket.go @@ -17,62 +17,26 @@ package rpc import ( - "bytes" "context" - "crypto/tls" "encoding/base64" - "encoding/json" "fmt" - "net" "net/http" "net/url" "os" "strings" - "time" + "sync" mapset "github.com/deckarep/golang-set" "github.com/ethereum/go-ethereum/log" - "golang.org/x/net/websocket" + "github.com/gorilla/websocket" ) -// websocketJSONCodec is a custom JSON codec with payload size enforcement and -// special number parsing. -var websocketJSONCodec = websocket.Codec{ - // Marshal is the stock JSON marshaller used by the websocket library too. - Marshal: func(v interface{}) ([]byte, byte, error) { - msg, err := json.Marshal(v) - return msg, websocket.TextFrame, err - }, - // Unmarshal is a specialized unmarshaller to properly convert numbers. - Unmarshal: func(msg []byte, payloadType byte, v interface{}) error { - dec := json.NewDecoder(bytes.NewReader(msg)) - dec.UseNumber() - - return dec.Decode(v) - }, -} +const ( + wsReadBuffer = 1024 + wsWriteBuffer = 1024 +) -// WebsocketHandler returns a handler that serves JSON-RPC to WebSocket connections. -// -// allowedOrigins should be a comma-separated list of allowed origin URLs. -// To allow connections with any origin, pass "*". -func (srv *Server) WebsocketHandler(allowedOrigins []string) http.Handler { - return websocket.Server{ - Handshake: wsHandshakeValidator(allowedOrigins), - Handler: func(conn *websocket.Conn) { - // Create a custom encode/decode pair to enforce payload size and number encoding - conn.MaxPayloadBytes = maxRequestContentLength - - encoder := func(v interface{}) error { - return websocketJSONCodec.Send(conn, v) - } - decoder := func(v interface{}) error { - return websocketJSONCodec.Receive(conn, v) - } - srv.ServeCodec(NewCodec(conn, encoder, decoder), OptionMethodInvocation|OptionSubscriptions) - }, - } -} +var wsBufferPool = new(sync.Pool) // NewWSServer creates a new websocket RPC server around an API provider. // @@ -81,10 +45,32 @@ func NewWSServer(allowedOrigins []string, srv *Server) *http.Server { return &http.Server{Handler: srv.WebsocketHandler(allowedOrigins)} } +// WebsocketHandler returns a handler that serves JSON-RPC to WebSocket connections. +// +// allowedOrigins should be a comma-separated list of allowed origin URLs. +// To allow connections with any origin, pass "*". +func (s *Server) WebsocketHandler(allowedOrigins []string) http.Handler { + var upgrader = websocket.Upgrader{ + ReadBufferSize: wsReadBuffer, + WriteBufferSize: wsWriteBuffer, + WriteBufferPool: wsBufferPool, + CheckOrigin: wsHandshakeValidator(allowedOrigins), + } + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Debug("WebSocket upgrade failed", "err", err) + return + } + codec := newWebsocketCodec(conn) + s.ServeCodec(codec, OptionMethodInvocation|OptionSubscriptions) + }) +} + // wsHandshakeValidator returns a handler that verifies the origin during the // websocket upgrade process. When a '*' is specified as an allowed origins all // connections are accepted. -func wsHandshakeValidator(allowedOrigins []string) func(*websocket.Config, *http.Request) error { +func wsHandshakeValidator(allowedOrigins []string) func(*http.Request) bool { origins := mapset.NewSet() allowAllOrigins := false @@ -96,7 +82,6 @@ func wsHandshakeValidator(allowedOrigins []string) func(*websocket.Config, *http origins.Add(strings.ToLower(origin)) } } - // allow localhost if no allowedOrigins are specified. if len(origins.ToSlice()) == 0 { origins.Add("http://localhost") @@ -104,44 +89,39 @@ func wsHandshakeValidator(allowedOrigins []string) func(*websocket.Config, *http origins.Add("http://" + strings.ToLower(hostname)) } } - - log.Debug(fmt.Sprintf("Allowed origin(s) for WS RPC interface %v\n", origins.ToSlice())) - - f := func(cfg *websocket.Config, req *http.Request) error { + log.Debug(fmt.Sprintf("Allowed origin(s) for WS RPC interface %v", origins.ToSlice())) + + f := func(req *http.Request) bool { + // Skip origin verification if no Origin header is present. The origin check + // is supposed to protect against browser based attacks. Browsers always set + // Origin. Non-browser software can put anything in origin and checking it doesn't + // provide additional security. + if _, ok := req.Header["Origin"]; !ok { + return true + } + // Verify origin against whitelist. origin := strings.ToLower(req.Header.Get("Origin")) if allowAllOrigins || origins.Contains(origin) { - return nil + return true } - log.Warn(fmt.Sprintf("origin '%s' not allowed on WS-RPC interface\n", origin)) - return fmt.Errorf("origin %s not allowed", origin) + log.Warn("Rejected WebSocket connection", "origin", origin) + return false } return f } -func wsGetConfig(endpoint, origin string) (*websocket.Config, error) { - if origin == "" { - var err error - if origin, err = os.Hostname(); err != nil { - return nil, err - } - if strings.HasPrefix(endpoint, "wss") { - origin = "https://" + strings.ToLower(origin) - } else { - origin = "http://" + strings.ToLower(origin) - } - } - config, err := websocket.NewConfig(endpoint, origin) - if err != nil { - return nil, err - } +type wsHandshakeError struct { + err error + status string +} - if config.Location.User != nil { - b64auth := base64.StdEncoding.EncodeToString([]byte(config.Location.User.String())) - config.Header.Add("Authorization", "Basic "+b64auth) - config.Location.User = nil +func (e wsHandshakeError) Error() string { + s := e.err.Error() + if e.status != "" { + s += " (HTTP status " + e.status + ")" } - return config, nil + return s } // DialWebsocket creates a new RPC client that communicates with a JSON-RPC server @@ -150,61 +130,46 @@ func wsGetConfig(endpoint, origin string) (*websocket.Config, error) { // The context is used for the initial connection establishment. It does not // affect subsequent interactions with the client. func DialWebsocket(ctx context.Context, endpoint, origin string) (*Client, error) { - config, err := wsGetConfig(endpoint, origin) + endpoint, header, err := wsClientHeaders(endpoint, origin) if err != nil { return nil, err } - - return newClient(ctx, func(ctx context.Context) (net.Conn, error) { - return wsDialContext(ctx, config) + dialer := websocket.Dialer{ + ReadBufferSize: wsReadBuffer, + WriteBufferSize: wsWriteBuffer, + WriteBufferPool: wsBufferPool, + } + return newClient(ctx, func(ctx context.Context) (ServerCodec, error) { + conn, resp, err := dialer.DialContext(ctx, endpoint, header) + if err != nil { + hErr := wsHandshakeError{err: err} + if resp != nil { + hErr.status = resp.Status + } + return nil, hErr + } + return newWebsocketCodec(conn), nil }) } -func wsDialContext(ctx context.Context, config *websocket.Config) (*websocket.Conn, error) { - var conn net.Conn - var err error - switch config.Location.Scheme { - case "ws": - conn, err = dialContext(ctx, "tcp", wsDialAddress(config.Location)) - case "wss": - dialer := contextDialer(ctx) - conn, err = tls.DialWithDialer(dialer, "tcp", wsDialAddress(config.Location), config.TlsConfig) - default: - err = websocket.ErrBadScheme - } +func wsClientHeaders(endpoint, origin string) (string, http.Header, error) { + endpointURL, err := url.Parse(endpoint) if err != nil { - return nil, err + return endpoint, nil, err } - ws, err := websocket.NewClient(config, conn) - if err != nil { - conn.Close() - return nil, err + header := make(http.Header) + if origin != "" { + header.Add("origin", origin) } - return ws, err -} - -var wsPortMap = map[string]string{"ws": "80", "wss": "443"} - -func wsDialAddress(location *url.URL) string { - if _, ok := wsPortMap[location.Scheme]; ok { - if _, _, err := net.SplitHostPort(location.Host); err != nil { - return net.JoinHostPort(location.Host, wsPortMap[location.Scheme]) - } + if endpointURL.User != nil { + b64auth := base64.StdEncoding.EncodeToString([]byte(endpointURL.User.String())) + header.Add("authorization", "Basic "+b64auth) + endpointURL.User = nil } - return location.Host + return endpointURL.String(), header, nil } -func dialContext(ctx context.Context, network, addr string) (net.Conn, error) { - d := &net.Dialer{KeepAlive: tcpKeepAliveInterval} - return d.DialContext(ctx, network, addr) -} - -func contextDialer(ctx context.Context) *net.Dialer { - dialer := &net.Dialer{Cancel: ctx.Done(), KeepAlive: tcpKeepAliveInterval} - if deadline, ok := ctx.Deadline(); ok { - dialer.Deadline = deadline - } else { - dialer.Deadline = time.Now().Add(defaultDialTimeout) - } - return dialer +func newWebsocketCodec(conn *websocket.Conn) ServerCodec { + conn.SetReadLimit(maxRequestContentLength) + return newCodec(conn, conn.WriteJSON, conn.ReadJSON) } diff --git a/rpc/websocket_test.go b/rpc/websocket_test.go index 5bf3780d62c7..9dc108479796 100644 --- a/rpc/websocket_test.go +++ b/rpc/websocket_test.go @@ -1,4 +1,4 @@ -// Copyright 2016 The go-ethereum Authors +// Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -16,39 +16,244 @@ package rpc -import "testing" +import ( + "context" + "net" + "net/http" + "net/http/httptest" + "reflect" + "strings" + "testing" + "time" -func TestWSGetConfigNoAuth(t *testing.T) { - config, err := wsGetConfig("ws://example.com:1234", "") + "github.com/gorilla/websocket" +) + +func TestWebsocketClientHeaders(t *testing.T) { + t.Parallel() + + endpoint, header, err := wsClientHeaders("wss://testuser:test-PASS_01@example.com:1234", "https://example.com") if err != nil { - t.Logf("wsGetConfig failed: %s", err) - t.Fail() - return + t.Fatalf("wsGetConfig failed: %s", err) + } + if endpoint != "wss://example.com:1234" { + t.Fatal("User should have been stripped from the URL") + } + if header.Get("authorization") != "Basic dGVzdHVzZXI6dGVzdC1QQVNTXzAx" { + t.Fatal("Basic auth header is incorrect") + } + if header.Get("origin") != "https://example.com" { + t.Fatal("Origin not set") + } +} + +// This test checks that the server rejects connections from disallowed origins. +func TestWebsocketOriginCheck(t *testing.T) { + t.Parallel() + + var ( + srv = newTestServer() + httpsrv = httptest.NewServer(srv.WebsocketHandler([]string{"http://example.com"})) + wsURL = "ws:" + strings.TrimPrefix(httpsrv.URL, "http:") + ) + defer srv.Stop() + defer httpsrv.Close() + + client, err := DialWebsocket(context.Background(), wsURL, "http://ekzample.com") + if err == nil { + client.Close() + t.Fatal("no error for wrong origin") + } + wantErr := wsHandshakeError{websocket.ErrBadHandshake, "403 Forbidden"} + if !reflect.DeepEqual(err, wantErr) { + t.Fatalf("wrong error for wrong origin: %q", err) + } + + // Connections without origin header should work. + client, err = DialWebsocket(context.Background(), wsURL, "") + if err != nil { + t.Fatal("error for empty origin") + } + client.Close() +} + +// This test checks whether calls exceeding the request size limit are rejected. +func TestWebsocketLargeCall(t *testing.T) { + t.Parallel() + + var ( + srv = newTestServer() + httpsrv = httptest.NewServer(srv.WebsocketHandler([]string{"*"})) + wsURL = "ws:" + strings.TrimPrefix(httpsrv.URL, "http:") + ) + defer srv.Stop() + defer httpsrv.Close() + + client, err := DialWebsocket(context.Background(), wsURL, "") + if err != nil { + t.Fatalf("can't dial: %v", err) + } + defer client.Close() + + // This call sends slightly less than the limit and should work. + var result Result + arg := strings.Repeat("x", maxRequestContentLength-200) + if err := client.Call(&result, "test_echo", arg, 1); err != nil { + t.Fatalf("valid call didn't work: %v", err) + } + if result.String != arg { + t.Fatal("wrong string echoed") + } + + // This call sends twice the allowed size and shouldn't work. + arg = strings.Repeat("x", maxRequestContentLength*2) + err = client.Call(&result, "test_echo", arg) + if err == nil { + t.Fatal("no error for too large call") } - if config.Location.User != nil { - t.Log("User should have been stripped from the URL") - t.Fail() +} + +// This test checks that client handles WebSocket ping frames correctly. +func TestClientWebsocketPing(t *testing.T) { + t.Parallel() + + var ( + sendPing = make(chan struct{}) + server = wsPingTestServer(t, sendPing) + ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) + ) + defer cancel() + defer server.Shutdown(ctx) + + client, err := DialContext(ctx, "ws://"+server.Addr) + if err != nil { + t.Fatalf("client dial error: %v", err) + } + resultChan := make(chan int) + sub, err := client.EthSubscribe(ctx, resultChan, "foo") + if err != nil { + t.Fatalf("client subscribe error: %v", err) } - if config.Location.Hostname() != "example.com" || - config.Location.Port() != "1234" || config.Location.Scheme != "ws" { - t.Logf("Unexpected URL: %s", config.Location) - t.Fail() + + // Wait for the context's deadline to be reached before proceeding. + // This is important for reproducing https://github.com/ethereum/go-ethereum/issues/19798 + <-ctx.Done() + close(sendPing) + + // Wait for the subscription result. + timeout := time.NewTimer(5 * time.Second) + for { + select { + case err := <-sub.Err(): + t.Error("client subscription error:", err) + case result := <-resultChan: + t.Log("client got result:", result) + return + case <-timeout.C: + t.Error("didn't get any result within the test timeout") + return + } } } -func TestWSGetConfigWithBasicAuth(t *testing.T) { - config, err := wsGetConfig("wss://testuser:test-PASS_01@example.com:1234", "") +// wsPingTestServer runs a WebSocket server which accepts a single subscription request. +// When a value arrives on sendPing, the server sends a ping frame, waits for a matching +// pong and finally delivers a single subscription result. +func wsPingTestServer(t *testing.T, sendPing <-chan struct{}) *http.Server { + var srv http.Server + shutdown := make(chan struct{}) + srv.RegisterOnShutdown(func() { + close(shutdown) + }) + srv.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Upgrade to WebSocket. + upgrader := websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { return true }, + } + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + t.Errorf("server WS upgrade error: %v", err) + return + } + defer conn.Close() + + // Handle the connection. + wsPingTestHandler(t, conn, shutdown, sendPing) + }) + + // Start the server. + listener, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { - t.Logf("wsGetConfig failed: %s", err) - t.Fail() + t.Fatal("can't listen:", err) + } + srv.Addr = listener.Addr().String() + go srv.Serve(listener) + return &srv +} + +func wsPingTestHandler(t *testing.T, conn *websocket.Conn, shutdown, sendPing <-chan struct{}) { + // Canned responses for the eth_subscribe call in TestClientWebsocketPing. + const ( + subResp = `{"jsonrpc":"2.0","id":1,"result":"0x00"}` + subNotify = `{"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0x00","result":1}}` + ) + + // Handle subscribe request. + if _, _, err := conn.ReadMessage(); err != nil { + t.Errorf("server read error: %v", err) return } - if config.Location.User != nil { - t.Log("User should have been stripped from the URL") - t.Fail() + if err := conn.WriteMessage(websocket.TextMessage, []byte(subResp)); err != nil { + t.Errorf("server write error: %v", err) + return } - if config.Header.Get("Authorization") != "Basic dGVzdHVzZXI6dGVzdC1QQVNTXzAx" { - t.Log("Basic auth header is incorrect") - t.Fail() + + // Read from the connection to process control messages. + var pongCh = make(chan string) + conn.SetPongHandler(func(d string) error { + t.Logf("server got pong: %q", d) + pongCh <- d + return nil + }) + go func() { + for { + typ, msg, err := conn.ReadMessage() + if err != nil { + return + } + t.Logf("server got message (%d): %q", typ, msg) + } + }() + + // Write messages. + var ( + sendResponse <-chan time.Time + wantPong string + ) + for { + select { + case _, open := <-sendPing: + if !open { + sendPing = nil + } + t.Logf("server sending ping") + conn.WriteMessage(websocket.PingMessage, []byte("ping")) + wantPong = "ping" + case data := <-pongCh: + if wantPong == "" { + t.Errorf("unexpected pong") + } else if data != wantPong { + t.Errorf("got pong with wrong data %q", data) + } + wantPong = "" + sendResponse = time.NewTimer(200 * time.Millisecond).C + case <-sendResponse: + t.Logf("server sending response") + conn.WriteMessage(websocket.TextMessage, []byte(subNotify)) + sendResponse = nil + case <-shutdown: + conn.Close() + return + } } } diff --git a/signer/core/abihelper.go b/signer/core/abihelper.go deleted file mode 100644 index 0fef24939549..000000000000 --- a/signer/core/abihelper.go +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package core - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "strings" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - - "bytes" - "os" - "regexp" -) - -type decodedArgument struct { - soltype abi.Argument - value interface{} -} -type decodedCallData struct { - signature string - name string - inputs []decodedArgument -} - -// String implements stringer interface, tries to use the underlying value-type -func (arg decodedArgument) String() string { - var value string - switch val := arg.value.(type) { - case fmt.Stringer: - value = val.String() - default: - value = fmt.Sprintf("%v", val) - } - return fmt.Sprintf("%v: %v", arg.soltype.Type.String(), value) -} - -// String implements stringer interface for decodedCallData -func (cd decodedCallData) String() string { - args := make([]string, len(cd.inputs)) - for i, arg := range cd.inputs { - args[i] = arg.String() - } - return fmt.Sprintf("%s(%s)", cd.name, strings.Join(args, ",")) -} - -// parseCallData matches the provided call data against the abi definition, -// and returns a struct containing the actual go-typed values -func parseCallData(calldata []byte, abidata string) (*decodedCallData, error) { - - if len(calldata) < 4 { - return nil, fmt.Errorf("Invalid ABI-data, incomplete method signature of (%d bytes)", len(calldata)) - } - - sigdata, argdata := calldata[:4], calldata[4:] - if len(argdata)%32 != 0 { - return nil, fmt.Errorf("Not ABI-encoded data; length should be a multiple of 32 (was %d)", len(argdata)) - } - - abispec, err := abi.JSON(strings.NewReader(abidata)) - if err != nil { - return nil, fmt.Errorf("Failed parsing JSON ABI: %v, abidata: %v", err, abidata) - } - - method, err := abispec.MethodById(sigdata) - if err != nil { - return nil, err - } - - v, err := method.Inputs.UnpackValues(argdata) - if err != nil { - return nil, err - } - - decoded := decodedCallData{signature: method.Sig(), name: method.Name} - - for n, argument := range method.Inputs { - if err != nil { - return nil, fmt.Errorf("Failed to decode argument %d (signature %v): %v", n, method.Sig(), err) - } - decodedArg := decodedArgument{ - soltype: argument, - value: v[n], - } - decoded.inputs = append(decoded.inputs, decodedArg) - } - - // We're finished decoding the data. At this point, we encode the decoded data to see if it matches with the - // original data. If we didn't do that, it would e.g. be possible to stuff extra data into the arguments, which - // is not detected by merely decoding the data. - - var ( - encoded []byte - ) - encoded, err = method.Inputs.PackValues(v) - - if err != nil { - return nil, err - } - - if !bytes.Equal(encoded, argdata) { - was := common.Bytes2Hex(encoded) - exp := common.Bytes2Hex(argdata) - return nil, fmt.Errorf("WARNING: Supplied data is stuffed with extra data. \nWant %s\nHave %s\nfor method %v", exp, was, method.Sig()) - } - return &decoded, nil -} - -// MethodSelectorToAbi converts a method selector into an ABI struct. The returned data is a valid json string -// which can be consumed by the standard abi package. -func MethodSelectorToAbi(selector string) ([]byte, error) { - - re := regexp.MustCompile(`^([^\)]+)\(([a-z0-9,\[\]]*)\)`) - - type fakeArg struct { - Type string `json:"type"` - } - type fakeABI struct { - Name string `json:"name"` - Type string `json:"type"` - Inputs []fakeArg `json:"inputs"` - } - groups := re.FindStringSubmatch(selector) - if len(groups) != 3 { - return nil, fmt.Errorf("Did not match: %v (%v matches)", selector, len(groups)) - } - name := groups[1] - args := groups[2] - arguments := make([]fakeArg, 0) - if len(args) > 0 { - for _, arg := range strings.Split(args, ",") { - arguments = append(arguments, fakeArg{arg}) - } - } - abicheat := fakeABI{ - name, "function", arguments, - } - return json.Marshal([]fakeABI{abicheat}) - -} - -type AbiDb struct { - db map[string]string - customdb map[string]string - customdbPath string -} - -// NewEmptyAbiDB exists for test purposes -func NewEmptyAbiDB() (*AbiDb, error) { - return &AbiDb{make(map[string]string), make(map[string]string), ""}, nil -} - -// NewAbiDBFromFile loads signature database from file, and -// errors if the file is not valid json. Does no other validation of contents -func NewAbiDBFromFile(path string) (*AbiDb, error) { - raw, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - db, err := NewEmptyAbiDB() - if err != nil { - return nil, err - } - json.Unmarshal(raw, &db.db) - return db, nil -} - -// NewAbiDBFromFiles loads both the standard signature database and a custom database. The latter will be used -// to write new values into if they are submitted via the API -func NewAbiDBFromFiles(standard, custom string) (*AbiDb, error) { - - db := &AbiDb{make(map[string]string), make(map[string]string), custom} - db.customdbPath = custom - - raw, err := ioutil.ReadFile(standard) - if err != nil { - return nil, err - } - json.Unmarshal(raw, &db.db) - // Custom file may not exist. Will be created during save, if needed - if _, err := os.Stat(custom); err == nil { - raw, err = ioutil.ReadFile(custom) - if err != nil { - return nil, err - } - json.Unmarshal(raw, &db.customdb) - } - - return db, nil -} - -// LookupMethodSelector checks the given 4byte-sequence against the known ABI methods. -// OBS: This method does not validate the match, it's assumed the caller will do so -func (db *AbiDb) LookupMethodSelector(id []byte) (string, error) { - if len(id) < 4 { - return "", fmt.Errorf("Expected 4-byte id, got %d", len(id)) - } - sig := common.ToHex(id[:4]) - if key, exists := db.db[sig]; exists { - return key, nil - } - if key, exists := db.customdb[sig]; exists { - return key, nil - } - return "", fmt.Errorf("Signature %v not found", sig) -} -func (db *AbiDb) Size() int { - return len(db.db) -} - -// saveCustomAbi saves a signature ephemerally. If custom file is used, also saves to disk -func (db *AbiDb) saveCustomAbi(selector, signature string) error { - db.customdb[signature] = selector - if db.customdbPath == "" { - return nil //Not an error per se, just not used - } - d, err := json.Marshal(db.customdb) - if err != nil { - return err - } - err = ioutil.WriteFile(db.customdbPath, d, 0600) - return err -} - -// AddSignature to the database, if custom database saving is enabled. -// OBS: This method does _not_ validate the correctness of the data, -// it is assumed that the caller has already done so -func (db *AbiDb) AddSignature(selector string, data []byte) error { - if len(data) < 4 { - return nil - } - _, err := db.LookupMethodSelector(data[:4]) - if err == nil { - return nil - } - sig := common.ToHex(data[:4]) - return db.saveCustomAbi(selector, sig) -} diff --git a/signer/core/abihelper_test.go b/signer/core/abihelper_test.go deleted file mode 100644 index 2afeec73e6c3..000000000000 --- a/signer/core/abihelper_test.go +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// go-ethereum is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . - -package core - -import ( - "fmt" - "strings" - "testing" - - "io/ioutil" - "math/big" - "reflect" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" -) - -func verify(t *testing.T, jsondata, calldata string, exp []interface{}) { - - abispec, err := abi.JSON(strings.NewReader(jsondata)) - if err != nil { - t.Fatal(err) - } - cd := common.Hex2Bytes(calldata) - sigdata, argdata := cd[:4], cd[4:] - method, err := abispec.MethodById(sigdata) - - if err != nil { - t.Fatal(err) - } - - data, err := method.Inputs.UnpackValues(argdata) - - if len(data) != len(exp) { - t.Fatalf("Mismatched length, expected %d, got %d", len(exp), len(data)) - } - for i, elem := range data { - if !reflect.DeepEqual(elem, exp[i]) { - t.Fatalf("Unpack error, arg %d, got %v, want %v", i, elem, exp[i]) - } - } -} -func TestNewUnpacker(t *testing.T) { - type unpackTest struct { - jsondata string - calldata string - exp []interface{} - } - testcases := []unpackTest{ - { // https://solidity.readthedocs.io/en/develop/abi-spec.html#use-of-dynamic-types - `[{"type":"function","name":"f", "inputs":[{"type":"uint256"},{"type":"uint32[]"},{"type":"bytes10"},{"type":"bytes"}]}]`, - // 0x123, [0x456, 0x789], "1234567890", "Hello, world!" - "8be65246" + "00000000000000000000000000000000000000000000000000000000000001230000000000000000000000000000000000000000000000000000000000000080313233343536373839300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004560000000000000000000000000000000000000000000000000000000000000789000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20776f726c642100000000000000000000000000000000000000", - []interface{}{ - big.NewInt(0x123), - []uint32{0x456, 0x789}, - [10]byte{49, 50, 51, 52, 53, 54, 55, 56, 57, 48}, - common.Hex2Bytes("48656c6c6f2c20776f726c6421"), - }, - }, { // https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#examples - `[{"type":"function","name":"sam","inputs":[{"type":"bytes"},{"type":"bool"},{"type":"uint256[]"}]}]`, - // "dave", true and [1,2,3] - "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", - []interface{}{ - []byte{0x64, 0x61, 0x76, 0x65}, - true, - []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, - }, - }, { - `[{"type":"function","name":"send","inputs":[{"type":"uint256"}]}]`, - "a52c101e0000000000000000000000000000000000000000000000000000000000000012", - []interface{}{big.NewInt(0x12)}, - }, { - `[{"type":"function","name":"compareAndApprove","inputs":[{"type":"address"},{"type":"uint256"},{"type":"uint256"}]}]`, - "751e107900000000000000000000000000000133700000deadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - []interface{}{ - common.HexToAddress("0x00000133700000deadbeef000000000000000000"), - new(big.Int).SetBytes([]byte{0x00}), - big.NewInt(0x1), - }, - }, - } - for _, c := range testcases { - verify(t, c.jsondata, c.calldata, c.exp) - } - -} - -func TestCalldataDecoding(t *testing.T) { - - // send(uint256) : a52c101e - // compareAndApprove(address,uint256,uint256) : 751e1079 - // issue(address[],uint256) : 42958b54 - jsondata := ` -[ - {"type":"function","name":"send","inputs":[{"name":"a","type":"uint256"}]}, - {"type":"function","name":"compareAndApprove","inputs":[{"name":"a","type":"address"},{"name":"a","type":"uint256"},{"name":"a","type":"uint256"}]}, - {"type":"function","name":"issue","inputs":[{"name":"a","type":"address[]"},{"name":"a","type":"uint256"}]}, - {"type":"function","name":"sam","inputs":[{"name":"a","type":"bytes"},{"name":"a","type":"bool"},{"name":"a","type":"uint256[]"}]} -]` - //Expected failures - for i, hexdata := range []string{ - "a52c101e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", - "a52c101e000000000000000000000000000000000000000000000000000000000000001200", - "a52c101e00000000000000000000000000000000000000000000000000000000000000", - "a52c101e", - "a52c10", - "", - // Too short - "751e10790000000000000000000000000000000000000000000000000000000000000012", - "751e1079FFffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - //Not valid multiple of 32 - "deadbeef00000000000000000000000000000000000000000000000000000000000000", - //Too short 'issue' - "42958b5400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", - // Too short compareAndApprove - "a52c101e00ff0000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", - // From https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI - // contains a bool with illegal values - "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", - } { - _, err := parseCallData(common.Hex2Bytes(hexdata), jsondata) - if err == nil { - t.Errorf("test %d: expected decoding to fail: %s", i, hexdata) - } - } - //Expected success - for i, hexdata := range []string{ - // From https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI - "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", - "a52c101e0000000000000000000000000000000000000000000000000000000000000012", - "a52c101eFFffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "751e1079000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "42958b54" + - // start of dynamic type - "0000000000000000000000000000000000000000000000000000000000000040" + - //uint256 - "0000000000000000000000000000000000000000000000000000000000000001" + - // length of array - "0000000000000000000000000000000000000000000000000000000000000002" + - // array values - "000000000000000000000000000000000000000000000000000000000000dead" + - "000000000000000000000000000000000000000000000000000000000000beef", - } { - _, err := parseCallData(common.Hex2Bytes(hexdata), jsondata) - if err != nil { - t.Errorf("test %d: unexpected failure on input %s:\n %v (%d bytes) ", i, hexdata, err, len(common.Hex2Bytes(hexdata))) - } - } -} - -func TestSelectorUnmarshalling(t *testing.T) { - var ( - db *AbiDb - err error - abistring []byte - abistruct abi.ABI - ) - - db, err = NewAbiDBFromFile("../../cmd/clef/4byte.json") - if err != nil { - t.Fatal(err) - } - fmt.Printf("DB size %v\n", db.Size()) - for id, selector := range db.db { - - abistring, err = MethodSelectorToAbi(selector) - if err != nil { - t.Error(err) - return - } - abistruct, err = abi.JSON(strings.NewReader(string(abistring))) - if err != nil { - t.Error(err) - return - } - m, err := abistruct.MethodById(common.Hex2Bytes(id[2:])) - if err != nil { - t.Error(err) - return - } - if m.Sig() != selector { - t.Errorf("Expected equality: %v != %v", m.Sig(), selector) - } - } - -} - -func TestCustomABI(t *testing.T) { - d, err := ioutil.TempDir("", "signer-4byte-test") - if err != nil { - t.Fatal(err) - } - filename := fmt.Sprintf("%s/4byte_custom.json", d) - abidb, err := NewAbiDBFromFiles("../../cmd/clef/4byte.json", filename) - if err != nil { - t.Fatal(err) - } - // Now we'll remove all existing signatures - abidb.db = make(map[string]string) - calldata := common.Hex2Bytes("a52c101edeadbeef") - _, err = abidb.LookupMethodSelector(calldata) - if err == nil { - t.Fatalf("Should not find a match on empty db") - } - if err = abidb.AddSignature("send(uint256)", calldata); err != nil { - t.Fatalf("Failed to save file: %v", err) - } - _, err = abidb.LookupMethodSelector(calldata) - if err != nil { - t.Fatalf("Should find a match for abi signature, got: %v", err) - } - //Check that it wrote to file - abidb2, err := NewAbiDBFromFile(filename) - if err != nil { - t.Fatalf("Failed to create new abidb: %v", err) - } - _, err = abidb2.LookupMethodSelector(calldata) - if err != nil { - t.Fatalf("Save failed: should find a match for abi signature after loading from disk") - } -} - -func TestMaliciousAbiStrings(t *testing.T) { - tests := []string{ - "func(uint256,uint256,[]uint256)", - "func(uint256,uint256,uint256,)", - "func(,uint256,uint256,uint256)", - } - data := common.Hex2Bytes("4401a6e40000000000000000000000000000000000000000000000000000000000000012") - for i, tt := range tests { - _, err := testSelector(tt, data) - if err == nil { - t.Errorf("test %d: expected error for selector '%v'", i, tt) - } - } -} diff --git a/signer/core/api.go b/signer/core/api.go index c380fe9773c5..244767acaf1b 100644 --- a/signer/core/api.go +++ b/signer/core/api.go @@ -1,18 +1,18 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// GNU Lesser General Public License for more details. // -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package core @@ -21,52 +21,56 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "math/big" + "os" "reflect" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/accounts/scwallet" "github.com/ethereum/go-ethereum/accounts/usbwallet" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/signer/storage" ) -// numberOfAccountsToDerive For hardware wallets, the number of accounts to derive -const numberOfAccountsToDerive = 10 +const ( + // numberOfAccountsToDerive For hardware wallets, the number of accounts to derive + numberOfAccountsToDerive = 10 + // ExternalAPIVersion -- see extapi_changelog.md + ExternalAPIVersion = "6.0.0" + // InternalAPIVersion -- see intapi_changelog.md + InternalAPIVersion = "7.0.0" +) // ExternalAPI defines the external API through which signing requests are made. type ExternalAPI interface { // List available accounts List(ctx context.Context) ([]common.Address, error) // New request to create a new account - New(ctx context.Context) (accounts.Account, error) + New(ctx context.Context) (common.Address, error) // SignTransaction request to sign the specified transaction SignTransaction(ctx context.Context, args SendTxArgs, methodSelector *string) (*ethapi.SignTransactionResult, error) - // Sign - request to sign the given data (plus prefix) - Sign(ctx context.Context, addr common.MixedcaseAddress, data hexutil.Bytes) (hexutil.Bytes, error) - // Export - request to export an account - Export(ctx context.Context, addr common.Address) (json.RawMessage, error) - // Import - request to import an account - // Should be moved to Internal API, in next phase when we have - // bi-directional communication - //Import(ctx context.Context, keyJSON json.RawMessage) (Account, error) + // SignData - request to sign the given data (plus prefix) + SignData(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (hexutil.Bytes, error) + // SignTypedData - request to sign the given structured data (plus prefix) + SignTypedData(ctx context.Context, addr common.MixedcaseAddress, data TypedData) (hexutil.Bytes, error) + // EcRecover - recover public key from given message and signature + EcRecover(ctx context.Context, data hexutil.Bytes, sig hexutil.Bytes) (common.Address, error) + // Version info about the APIs + Version(ctx context.Context) (string, error) } -// SignerUI specifies what method a UI needs to implement to be able to be used as a UI for the signer -type SignerUI interface { +// UIClientAPI specifies what method a UI needs to implement to be able to be used as a +// UI for the signer +type UIClientAPI interface { // ApproveTx prompt the user for confirmation to request to sign Transaction ApproveTx(request *SignTxRequest) (SignTxResponse, error) // ApproveSignData prompt the user for confirmation to request to sign data ApproveSignData(request *SignDataRequest) (SignDataResponse, error) - // ApproveExport prompt the user for confirmation to export encrypted Account json - ApproveExport(request *ExportRequest) (ExportResponse, error) - // ApproveImport prompt the user for confirmation to import Account json - ApproveImport(request *ImportRequest) (ImportResponse, error) // ApproveListing prompt the user for confirmation to list accounts // the list of accounts to list can be modified by the UI ApproveListing(request *ListRequest) (ListResponse, error) @@ -82,18 +86,34 @@ type SignerUI interface { // OnSignerStartup is invoked when the signer boots, and tells the UI info about external API location and version // information OnSignerStartup(info StartupInfo) - // OnInputRequried is invoked when clef requires user input, for example master password or + // OnInputRequired is invoked when clef requires user input, for example master password or // pin-code for unlocking hardware wallets OnInputRequired(info UserInputRequest) (UserInputResponse, error) + // RegisterUIServer tells the UI to use the given UIServerAPI for ui->clef communication + RegisterUIServer(api *UIServerAPI) +} + +// Validator defines the methods required to validate a transaction against some +// sanity defaults as well as any underlying 4byte method database. +// +// Use fourbyte.Database as an implementation. It is separated out of this package +// to allow pieces of the signer package to be used without having to load the +// 7MB embedded 4byte dump. +type Validator interface { + // ValidateTransaction does a number of checks on the supplied transaction, and + // returns either a list of warnings, or an error (indicating that the transaction + // should be immediately rejected). + ValidateTransaction(selector *string, tx *SendTxArgs) (*ValidationMessages, error) } // SignerAPI defines the actual implementation of ExternalAPI type SignerAPI struct { - chainID *big.Int - am *accounts.Manager - UI SignerUI - validator *Validator - rejectMode bool + chainID *big.Int + am *accounts.Manager + UI UIClientAPI + validator Validator + rejectMode bool + credentials storage.Storage } // Metadata about a request @@ -105,6 +125,65 @@ type Metadata struct { Origin string `json:"Origin"` } +func StartClefAccountManager(ksLocation string, nousb, lightKDF bool, scpath string) *accounts.Manager { + var ( + backends []accounts.Backend + n, p = keystore.StandardScryptN, keystore.StandardScryptP + ) + if lightKDF { + n, p = keystore.LightScryptN, keystore.LightScryptP + } + // support password based accounts + if len(ksLocation) > 0 { + backends = append(backends, keystore.NewKeyStore(ksLocation, n, p)) + } + if !nousb { + // Start a USB hub for Ledger hardware wallets + if ledgerhub, err := usbwallet.NewLedgerHub(); err != nil { + log.Warn(fmt.Sprintf("Failed to start Ledger hub, disabling: %v", err)) + } else { + backends = append(backends, ledgerhub) + log.Debug("Ledger support enabled") + } + // Start a USB hub for Trezor hardware wallets (HID version) + if trezorhub, err := usbwallet.NewTrezorHubWithHID(); err != nil { + log.Warn(fmt.Sprintf("Failed to start HID Trezor hub, disabling: %v", err)) + } else { + backends = append(backends, trezorhub) + log.Debug("Trezor support enabled via HID") + } + // Start a USB hub for Trezor hardware wallets (WebUSB version) + if trezorhub, err := usbwallet.NewTrezorHubWithWebUSB(); err != nil { + log.Warn(fmt.Sprintf("Failed to start WebUSB Trezor hub, disabling: %v", err)) + } else { + backends = append(backends, trezorhub) + log.Debug("Trezor support enabled via WebUSB") + } + } + + // Start a smart card hub + if len(scpath) > 0 { + // Sanity check that the smartcard path is valid + fi, err := os.Stat(scpath) + if err != nil { + log.Info("Smartcard socket file missing, disabling", "err", err) + } else { + if fi.Mode()&os.ModeType != os.ModeSocket { + log.Error("Invalid smartcard socket file type", "path", scpath, "type", fi.Mode().String()) + } else { + if schub, err := scwallet.NewHub(scpath, scwallet.Scheme, ksLocation); err != nil { + log.Warn(fmt.Sprintf("Failed to start smart card hub, disabling: %v", err)) + } else { + backends = append(backends, schub) + } + } + } + } + + // Clef doesn't allow insecure http account unlock. + return accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: false}, backends...) +} + // MetadataFromContext extracts Metadata from a given context.Context func MetadataFromContext(ctx context.Context) Metadata { m := Metadata{"NA", "NA", "NA", "", ""} // batman @@ -149,50 +228,30 @@ type ( //The UI may make changes to the TX Transaction SendTxArgs `json:"transaction"` Approved bool `json:"approved"` - Password string `json:"password"` - } - // ExportRequest info about query to export accounts - ExportRequest struct { - Address common.Address `json:"address"` - Meta Metadata `json:"meta"` - } - // ExportResponse response to export-request - ExportResponse struct { - Approved bool `json:"approved"` - } - // ImportRequest info about request to import an Account - ImportRequest struct { - Meta Metadata `json:"meta"` - } - ImportResponse struct { - Approved bool `json:"approved"` - OldPassword string `json:"old_password"` - NewPassword string `json:"new_password"` } SignDataRequest struct { - Address common.MixedcaseAddress `json:"address"` - Rawdata hexutil.Bytes `json:"raw_data"` - Message string `json:"message"` - Hash hexutil.Bytes `json:"hash"` - Meta Metadata `json:"meta"` + ContentType string `json:"content_type"` + Address common.MixedcaseAddress `json:"address"` + Rawdata []byte `json:"raw_data"` + Messages []*NameValueType `json:"messages"` + Hash hexutil.Bytes `json:"hash"` + Meta Metadata `json:"meta"` } SignDataResponse struct { Approved bool `json:"approved"` - Password string } NewAccountRequest struct { Meta Metadata `json:"meta"` } NewAccountResponse struct { - Approved bool `json:"approved"` - Password string `json:"password"` + Approved bool `json:"approved"` } ListRequest struct { - Accounts []Account `json:"accounts"` - Meta Metadata `json:"meta"` + Accounts []accounts.Account `json:"accounts"` + Meta Metadata `json:"meta"` } ListResponse struct { - Accounts []Account `json:"accounts"` + Accounts []accounts.Account `json:"accounts"` } Message struct { Text string `json:"text"` @@ -201,8 +260,8 @@ type ( Info map[string]interface{} `json:"info"` } UserInputRequest struct { - Prompt string `json:"prompt"` Title string `json:"title"` + Prompt string `json:"prompt"` IsPassword bool `json:"isPassword"` } UserInputResponse struct { @@ -217,38 +276,11 @@ var ErrRequestDenied = errors.New("Request denied") // key that is generated when a new Account is created. // noUSB disables USB support that is required to support hardware devices such as // ledger and trezor. -func NewSignerAPI(chainID int64, ksLocation string, noUSB bool, ui SignerUI, abidb *AbiDb, lightKDF bool, advancedMode bool) *SignerAPI { - var ( - backends []accounts.Backend - n, p = keystore.StandardScryptN, keystore.StandardScryptP - ) - if lightKDF { - n, p = keystore.LightScryptN, keystore.LightScryptP - } - // support password based accounts - if len(ksLocation) > 0 { - backends = append(backends, keystore.NewKeyStore(ksLocation, n, p)) - } +func NewSignerAPI(am *accounts.Manager, chainID int64, noUSB bool, ui UIClientAPI, validator Validator, advancedMode bool, credentials storage.Storage) *SignerAPI { if advancedMode { log.Info("Clef is in advanced mode: will warn instead of reject") } - if !noUSB { - // Start a USB hub for Ledger hardware wallets - if ledgerhub, err := usbwallet.NewLedgerHub(); err != nil { - log.Warn(fmt.Sprintf("Failed to start Ledger hub, disabling: %v", err)) - } else { - backends = append(backends, ledgerhub) - log.Debug("Ledger support enabled") - } - // Start a USB hub for Trezor hardware wallets - if trezorhub, err := usbwallet.NewTrezorHub(); err != nil { - log.Warn(fmt.Sprintf("Failed to start Trezor hub, disabling: %v", err)) - } else { - backends = append(backends, trezorhub) - log.Debug("Trezor support enabled") - } - } - signer := &SignerAPI{big.NewInt(chainID), accounts.NewManager(backends...), ui, NewValidator(abidb), !advancedMode} + signer := &SignerAPI{big.NewInt(chainID), am, ui, validator, !advancedMode, credentials} if !noUSB { signer.startUSBListener() } @@ -315,12 +347,10 @@ func (api *SignerAPI) startUSBListener() { status, _ := event.Wallet.Status() log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", status) - derivationPath := accounts.DefaultBaseDerivationPath - if event.Wallet.URL().Scheme == "ledger" { - derivationPath = accounts.DefaultLedgerBaseDerivationPath - } - var nextPath = derivationPath // Derive first N accounts, hardcoded for now + var nextPath = make(accounts.DerivationPath, len(accounts.DefaultBaseDerivationPath)) + copy(nextPath[:], accounts.DefaultBaseDerivationPath[:]) + for i := 0; i < numberOfAccountsToDerive; i++ { acc, err := event.Wallet.Derive(nextPath, true) if err != nil { @@ -341,12 +371,9 @@ func (api *SignerAPI) startUSBListener() { // List returns the set of wallet this signer manages. Each wallet can contain // multiple accounts. func (api *SignerAPI) List(ctx context.Context) ([]common.Address, error) { - var accs []Account + var accs []accounts.Account for _, wallet := range api.am.Wallets() { - for _, acc := range wallet.Accounts() { - acc := Account{Typ: "Account", URL: wallet.URL(), Address: acc.Address} - accs = append(accs, acc) - } + accs = append(accs, wallet.Accounts()...) } result, err := api.UI.ApproveListing(&ListRequest{Accounts: accs, Meta: MetadataFromContext(ctx)}) if err != nil { @@ -356,7 +383,6 @@ func (api *SignerAPI) List(ctx context.Context) ([]common.Address, error) { return nil, ErrRequestDenied } - addresses := make([]common.Address, 0) for _, acc := range result.Accounts { addresses = append(addresses, acc.Address) @@ -368,33 +394,40 @@ func (api *SignerAPI) List(ctx context.Context) ([]common.Address, error) { // New creates a new password protected Account. The private key is protected with // the given password. Users are responsible to backup the private key that is stored // in the keystore location thas was specified when this API was created. -func (api *SignerAPI) New(ctx context.Context) (accounts.Account, error) { +func (api *SignerAPI) New(ctx context.Context) (common.Address, error) { be := api.am.Backends(keystore.KeyStoreType) if len(be) == 0 { - return accounts.Account{}, errors.New("password based accounts not supported") + return common.Address{}, errors.New("password based accounts not supported") } - var ( - resp NewAccountResponse - err error - ) + if resp, err := api.UI.ApproveNewAccount(&NewAccountRequest{MetadataFromContext(ctx)}); err != nil { + return common.Address{}, err + } else if !resp.Approved { + return common.Address{}, ErrRequestDenied + } + // Three retries to get a valid password for i := 0; i < 3; i++ { - resp, err = api.UI.ApproveNewAccount(&NewAccountRequest{MetadataFromContext(ctx)}) + resp, err := api.UI.OnInputRequired(UserInputRequest{ + "New account password", + fmt.Sprintf("Please enter a password for the new account to be created (attempt %d of 3)", i), + true}) if err != nil { - return accounts.Account{}, err - } - if !resp.Approved { - return accounts.Account{}, ErrRequestDenied + log.Warn("error obtaining password", "attempt", i, "error", err) + continue } - if pwErr := ValidatePasswordFormat(resp.Password); pwErr != nil { + if pwErr := ValidatePasswordFormat(resp.Text); pwErr != nil { api.UI.ShowError(fmt.Sprintf("Account creation attempt #%d failed due to password requirements: %v", (i + 1), pwErr)) } else { // No error - return be[0].(*keystore.KeyStore).NewAccount(resp.Password) + acc, err := be[0].(*keystore.KeyStore).NewAccount(resp.Text) + log.Info("Your new key was generated", "address", acc.Address) + log.Warn("Please backup your key file!", "path", acc.URL.Path) + log.Warn("Please remember your password!") + return acc.Address, err } } // Otherwise fail, with generic error message - return accounts.Account{}, errors.New("account creation failed") + return common.Address{}, errors.New("account creation failed") } // logDiff logs the difference between the incoming (original) transaction and the one returned from the signer. @@ -443,13 +476,33 @@ func logDiff(original *SignTxRequest, new *SignTxResponse) bool { return modified } +func (api *SignerAPI) lookupPassword(address common.Address) (string, error) { + return api.credentials.Get(address.Hex()) +} + +func (api *SignerAPI) lookupOrQueryPassword(address common.Address, title, prompt string) (string, error) { + // Look up the password and return if available + if pw, err := api.lookupPassword(address); err == nil { + return pw, nil + } + // Password unavailable, request it from the user + pwResp, err := api.UI.OnInputRequired(UserInputRequest{title, prompt, true}) + if err != nil { + log.Warn("error obtaining password", "error", err) + // We'll not forward the error here, in case the error contains info about the response from the UI, + // which could leak the password if it was malformed json or something + return "", errors.New("internal error") + } + return pwResp.Text, nil +} + // SignTransaction signs the given Transaction and returns it both as json and rlp-encoded form func (api *SignerAPI) SignTransaction(ctx context.Context, args SendTxArgs, methodSelector *string) (*ethapi.SignTransactionResult, error) { var ( err error result SignTxResponse ) - msgs, err := api.validator.ValidateTransaction(&args, methodSelector) + msgs, err := api.validator.ValidateTransaction(methodSelector, &args) if err != nil { return nil, err } @@ -459,7 +512,6 @@ func (api *SignerAPI) SignTransaction(ctx context.Context, args SendTxArgs, meth return nil, err } } - req := SignTxRequest{ Transaction: args, Meta: MetadataFromContext(ctx), @@ -486,9 +538,14 @@ func (api *SignerAPI) SignTransaction(ctx context.Context, args SendTxArgs, meth } // Convert fields into a real transaction var unsignedTx = result.Transaction.toTransaction() - + // Get the password for the transaction + pw, err := api.lookupOrQueryPassword(acc.Address, "Account password", + fmt.Sprintf("Please enter the password for account %s", acc.Address.String())) + if err != nil { + return nil, err + } // The one to sign is the one that was returned from the UI - signedTx, err := wallet.SignTxWithPassphrase(acc, result.Password, unsignedTx, api.chainID) + signedTx, err := wallet.SignTxWithPassphrase(acc, pw, unsignedTx, api.chainID) if err != nil { api.UI.ShowError(err.Error()) return nil, err @@ -504,103 +561,8 @@ func (api *SignerAPI) SignTransaction(ctx context.Context, args SendTxArgs, meth } -// Sign calculates an Ethereum ECDSA signature for: -// keccack256("\x19Ethereum Signed Message:\n" + len(message) + message)) -// -// Note, the produced signature conforms to the secp256k1 curve R, S and V values, -// where the V value will be 27 or 28 for legacy reasons. -// -// The key used to calculate the signature is decrypted with the given password. -// -// https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_sign -func (api *SignerAPI) Sign(ctx context.Context, addr common.MixedcaseAddress, data hexutil.Bytes) (hexutil.Bytes, error) { - sighash, msg := SignHash(data) - // We make the request prior to looking up if we actually have the account, to prevent - // account-enumeration via the API - req := &SignDataRequest{Address: addr, Rawdata: data, Message: msg, Hash: sighash, Meta: MetadataFromContext(ctx)} - res, err := api.UI.ApproveSignData(req) - - if err != nil { - return nil, err - } - if !res.Approved { - return nil, ErrRequestDenied - } - // Look up the wallet containing the requested signer - account := accounts.Account{Address: addr.Address()} - wallet, err := api.am.Find(account) - if err != nil { - return nil, err - } - // Assemble sign the data with the wallet - signature, err := wallet.SignHashWithPassphrase(account, res.Password, sighash) - if err != nil { - api.UI.ShowError(err.Error()) - return nil, err - } - signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper - return signature, nil -} - -// SignHash is a helper function that calculates a hash for the given message that can be -// safely used to calculate a signature from. -// -// The hash is calculated as -// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). -// -// This gives context to the signed message and prevents signing of transactions. -func SignHash(data []byte) ([]byte, string) { - msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data) - return crypto.Keccak256([]byte(msg)), msg -} - -// Export returns encrypted private key associated with the given address in web3 keystore format. -func (api *SignerAPI) Export(ctx context.Context, addr common.Address) (json.RawMessage, error) { - res, err := api.UI.ApproveExport(&ExportRequest{Address: addr, Meta: MetadataFromContext(ctx)}) - - if err != nil { - return nil, err - } - if !res.Approved { - return nil, ErrRequestDenied - } - // Look up the wallet containing the requested signer - wallet, err := api.am.Find(accounts.Account{Address: addr}) - if err != nil { - return nil, err - } - if wallet.URL().Scheme != keystore.KeyStoreScheme { - return nil, fmt.Errorf("Account is not a keystore-account") - } - return ioutil.ReadFile(wallet.URL().Path) -} - -// Import tries to import the given keyJSON in the local keystore. The keyJSON data is expected to be -// in web3 keystore format. It will decrypt the keyJSON with the given passphrase and on successful -// decryption it will encrypt the key with the given newPassphrase and store it in the keystore. -// OBS! This method is removed from the public API. It should not be exposed on the external API -// for a couple of reasons: -// 1. Even though it is encrypted, it should still be seen as sensitive data -// 2. It can be used to DoS clef, by using malicious data with e.g. extreme large -// values for the kdfparams. -func (api *SignerAPI) Import(ctx context.Context, keyJSON json.RawMessage) (Account, error) { - be := api.am.Backends(keystore.KeyStoreType) - - if len(be) == 0 { - return Account{}, errors.New("password based accounts not supported") - } - res, err := api.UI.ApproveImport(&ImportRequest{Meta: MetadataFromContext(ctx)}) - - if err != nil { - return Account{}, err - } - if !res.Approved { - return Account{}, ErrRequestDenied - } - acc, err := be[0].(*keystore.KeyStore).Import(keyJSON, res.OldPassword, res.NewPassword) - if err != nil { - api.UI.ShowError(err.Error()) - return Account{}, err - } - return Account{Typ: "Account", URL: acc.URL, Address: acc.Address}, nil +// Returns the external api version. This method does not require user acceptance. Available methods are +// available via enumeration anyway, and this info does not contain user-specific data +func (api *SignerAPI) Version(ctx context.Context) (string, error) { + return ExternalAPIVersion, nil } diff --git a/signer/core/api_test.go b/signer/core/api_test.go index a8aa23896e6c..30948f99bfc5 100644 --- a/signer/core/api_test.go +++ b/signer/core/api_test.go @@ -1,25 +1,24 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// GNU Lesser General Public License for more details. // -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . -// -package core +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core_test import ( "bytes" "context" - "errors" "fmt" "io/ioutil" "math/big" @@ -28,91 +27,82 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" - "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/signer/core" + "github.com/ethereum/go-ethereum/signer/fourbyte" + "github.com/ethereum/go-ethereum/signer/storage" ) //Used for testing -type HeadlessUI struct { - controller chan string -} - -func (ui *HeadlessUI) OnInputRequired(info UserInputRequest) (UserInputResponse, error) { - return UserInputResponse{}, errors.New("not implemented") +type headlessUi struct { + approveCh chan string // to send approve/deny + inputCh chan string // to send password } -func (ui *HeadlessUI) OnSignerStartup(info StartupInfo) { +func (ui *headlessUi) OnInputRequired(info core.UserInputRequest) (core.UserInputResponse, error) { + input := <-ui.inputCh + return core.UserInputResponse{Text: input}, nil } -func (ui *HeadlessUI) OnApprovedTx(tx ethapi.SignTransactionResult) { - fmt.Printf("OnApproved()\n") -} +func (ui *headlessUi) OnSignerStartup(info core.StartupInfo) {} +func (ui *headlessUi) RegisterUIServer(api *core.UIServerAPI) {} +func (ui *headlessUi) OnApprovedTx(tx ethapi.SignTransactionResult) {} -func (ui *HeadlessUI) ApproveTx(request *SignTxRequest) (SignTxResponse, error) { +func (ui *headlessUi) ApproveTx(request *core.SignTxRequest) (core.SignTxResponse, error) { - switch <-ui.controller { + switch <-ui.approveCh { case "Y": - return SignTxResponse{request.Transaction, true, <-ui.controller}, nil - case "M": //Modify + return core.SignTxResponse{request.Transaction, true}, nil + case "M": // modify + // The headless UI always modifies the transaction old := big.Int(request.Transaction.Value) newVal := big.NewInt(0).Add(&old, big.NewInt(1)) request.Transaction.Value = hexutil.Big(*newVal) - return SignTxResponse{request.Transaction, true, <-ui.controller}, nil + return core.SignTxResponse{request.Transaction, true}, nil default: - return SignTxResponse{request.Transaction, false, ""}, nil + return core.SignTxResponse{request.Transaction, false}, nil } } -func (ui *HeadlessUI) ApproveSignData(request *SignDataRequest) (SignDataResponse, error) { - if "Y" == <-ui.controller { - return SignDataResponse{true, <-ui.controller}, nil - } - return SignDataResponse{false, ""}, nil +func (ui *headlessUi) ApproveSignData(request *core.SignDataRequest) (core.SignDataResponse, error) { + approved := "Y" == <-ui.approveCh + return core.SignDataResponse{approved}, nil } -func (ui *HeadlessUI) ApproveExport(request *ExportRequest) (ExportResponse, error) { - return ExportResponse{<-ui.controller == "Y"}, nil - -} - -func (ui *HeadlessUI) ApproveImport(request *ImportRequest) (ImportResponse, error) { - if "Y" == <-ui.controller { - return ImportResponse{true, <-ui.controller, <-ui.controller}, nil - } - return ImportResponse{false, "", ""}, nil -} - -func (ui *HeadlessUI) ApproveListing(request *ListRequest) (ListResponse, error) { - switch <-ui.controller { +func (ui *headlessUi) ApproveListing(request *core.ListRequest) (core.ListResponse, error) { + approval := <-ui.approveCh + //fmt.Printf("approval %s\n", approval) + switch approval { case "A": - return ListResponse{request.Accounts}, nil + return core.ListResponse{request.Accounts}, nil case "1": - l := make([]Account, 1) + l := make([]accounts.Account, 1) l[0] = request.Accounts[1] - return ListResponse{l}, nil + return core.ListResponse{l}, nil default: - return ListResponse{nil}, nil + return core.ListResponse{nil}, nil } } -func (ui *HeadlessUI) ApproveNewAccount(request *NewAccountRequest) (NewAccountResponse, error) { - if "Y" == <-ui.controller { - return NewAccountResponse{true, <-ui.controller}, nil +func (ui *headlessUi) ApproveNewAccount(request *core.NewAccountRequest) (core.NewAccountResponse, error) { + if "Y" == <-ui.approveCh { + return core.NewAccountResponse{true}, nil } - return NewAccountResponse{false, ""}, nil + return core.NewAccountResponse{false}, nil } -func (ui *HeadlessUI) ShowError(message string) { +func (ui *headlessUi) ShowError(message string) { //stdout is used by communication fmt.Fprintln(os.Stderr, message) } -func (ui *HeadlessUI) ShowInfo(message string) { +func (ui *headlessUi) ShowInfo(message string) { //stdout is used by communication fmt.Fprintln(os.Stderr, message) } @@ -129,30 +119,20 @@ func tmpDirName(t *testing.T) string { return d } -func setup(t *testing.T) (*SignerAPI, chan string) { - - controller := make(chan string, 20) - - db, err := NewAbiDBFromFile("../../cmd/clef/4byte.json") +func setup(t *testing.T) (*core.SignerAPI, *headlessUi) { + db, err := fourbyte.New() if err != nil { - utils.Fatalf(err.Error()) + t.Fatal(err.Error()) } - var ( - ui = &HeadlessUI{controller} - api = NewSignerAPI( - 1, - tmpDirName(t), - true, - ui, - db, - true, true) - ) - return api, controller -} -func createAccount(control chan string, api *SignerAPI, t *testing.T) { + ui := &headlessUi{make(chan string, 20), make(chan string, 20)} + am := core.StartClefAccountManager(tmpDirName(t), true, true, "") + api := core.NewSignerAPI(am, 1337, true, ui, db, true, &storage.NoStorage{}) + return api, ui - control <- "Y" - control <- "a_long_password" +} +func createAccount(ui *headlessUi, api *core.SignerAPI, t *testing.T) { + ui.approveCh <- "Y" + ui.inputCh <- "a_long_password" _, err := api.New(context.Background()) if err != nil { t.Fatal(err) @@ -161,48 +141,48 @@ func createAccount(control chan string, api *SignerAPI, t *testing.T) { time.Sleep(250 * time.Millisecond) } -func failCreateAccountWithPassword(control chan string, api *SignerAPI, password string, t *testing.T) { +func failCreateAccountWithPassword(ui *headlessUi, api *core.SignerAPI, password string, t *testing.T) { - control <- "Y" - control <- password - control <- "Y" - control <- password - control <- "Y" - control <- password + ui.approveCh <- "Y" + // We will be asked three times to provide a suitable password + ui.inputCh <- password + ui.inputCh <- password + ui.inputCh <- password - acc, err := api.New(context.Background()) + addr, err := api.New(context.Background()) if err == nil { t.Fatal("Should have returned an error") } - if acc.Address != (common.Address{}) { + if addr != (common.Address{}) { t.Fatal("Empty address should be returned") } } -func failCreateAccount(control chan string, api *SignerAPI, t *testing.T) { - control <- "N" - acc, err := api.New(context.Background()) - if err != ErrRequestDenied { +func failCreateAccount(ui *headlessUi, api *core.SignerAPI, t *testing.T) { + ui.approveCh <- "N" + addr, err := api.New(context.Background()) + if err != core.ErrRequestDenied { t.Fatal(err) } - if acc.Address != (common.Address{}) { + if addr != (common.Address{}) { t.Fatal("Empty address should be returned") } } -func list(control chan string, api *SignerAPI, t *testing.T) []common.Address { - control <- "A" - list, err := api.List(context.Background()) - if err != nil { - t.Fatal(err) - } - return list +func list(ui *headlessUi, api *core.SignerAPI, t *testing.T) ([]common.Address, error) { + ui.approveCh <- "A" + return api.List(context.Background()) + } func TestNewAcc(t *testing.T) { api, control := setup(t) verifyNum := func(num int) { - if list := list(control, api, t); len(list) != num { + list, err := list(control, api, t) + if err != nil { + t.Errorf("Unexpected error %v", err) + } + if len(list) != num { t.Errorf("Expected %d accounts, got %d", num, len(list)) } } @@ -215,18 +195,16 @@ func TestNewAcc(t *testing.T) { failCreateAccount(control, api, t) createAccount(control, api, t) failCreateAccount(control, api, t) - verifyNum(4) // Fail to create this, due to bad password failCreateAccountWithPassword(control, api, "short", t) failCreateAccountWithPassword(control, api, "longerbutbad\rfoo", t) - verifyNum(4) // Testing listing: // Listing one Account - control <- "1" + control.approveCh <- "1" list, err := api.List(context.Background()) if err != nil { t.Fatal(err) @@ -235,63 +213,24 @@ func TestNewAcc(t *testing.T) { t.Fatalf("List should only show one Account") } // Listing denied - control <- "Nope" + control.approveCh <- "Nope" list, err = api.List(context.Background()) if len(list) != 0 { t.Fatalf("List should be empty") } - if err != ErrRequestDenied { + if err != core.ErrRequestDenied { t.Fatal("Expected deny") } } -func TestSignData(t *testing.T) { - api, control := setup(t) - //Create two accounts - createAccount(control, api, t) - createAccount(control, api, t) - control <- "1" - list, err := api.List(context.Background()) - if err != nil { - t.Fatal(err) - } - a := common.NewMixedcaseAddress(list[0]) - - control <- "Y" - control <- "wrongpassword" - h, err := api.Sign(context.Background(), a, []byte("EHLO world")) - if h != nil { - t.Errorf("Expected nil-data, got %x", h) - } - if err != keystore.ErrDecrypt { - t.Errorf("Expected ErrLocked! %v", err) - } - control <- "No way" - h, err = api.Sign(context.Background(), a, []byte("EHLO world")) - if h != nil { - t.Errorf("Expected nil-data, got %x", h) - } - if err != ErrRequestDenied { - t.Errorf("Expected ErrRequestDenied! %v", err) - } - control <- "Y" - control <- "a_long_password" - h, err = api.Sign(context.Background(), a, []byte("EHLO world")) - if err != nil { - t.Fatal(err) - } - if h == nil || len(h) != 65 { - t.Errorf("Expected 65 byte signature (got %d bytes)", len(h)) - } -} -func mkTestTx(from common.MixedcaseAddress) SendTxArgs { +func mkTestTx(from common.MixedcaseAddress) core.SendTxArgs { to := common.NewMixedcaseAddress(common.HexToAddress("0x1337")) gas := hexutil.Uint64(21000) gasPrice := (hexutil.Big)(*big.NewInt(2000000000)) value := (hexutil.Big)(*big.NewInt(1e18)) nonce := (hexutil.Uint64)(0) data := hexutil.Bytes(common.Hex2Bytes("01020304050607080a")) - tx := SendTxArgs{ + tx := core.SendTxArgs{ From: from, To: &to, Gas: gas, @@ -311,7 +250,7 @@ func TestSignTx(t *testing.T) { api, control := setup(t) createAccount(control, api, t) - control <- "A" + control.approveCh <- "A" list, err = api.List(context.Background()) if err != nil { t.Fatal(err) @@ -321,8 +260,8 @@ func TestSignTx(t *testing.T) { methodSig := "test(uint)" tx := mkTestTx(a) - control <- "Y" - control <- "wrongpassword" + control.approveCh <- "Y" + control.inputCh <- "wrongpassword" res, err = api.SignTransaction(context.Background(), tx, &methodSig) if res != nil { t.Errorf("Expected nil-response, got %v", res) @@ -330,16 +269,17 @@ func TestSignTx(t *testing.T) { if err != keystore.ErrDecrypt { t.Errorf("Expected ErrLocked! %v", err) } - control <- "No way" + control.approveCh <- "No way" res, err = api.SignTransaction(context.Background(), tx, &methodSig) if res != nil { t.Errorf("Expected nil-response, got %v", res) } - if err != ErrRequestDenied { + if err != core.ErrRequestDenied { t.Errorf("Expected ErrRequestDenied! %v", err) } - control <- "Y" - control <- "a_long_password" + // Sign with correct password + control.approveCh <- "Y" + control.inputCh <- "a_long_password" res, err = api.SignTransaction(context.Background(), tx, &methodSig) if err != nil { @@ -352,8 +292,8 @@ func TestSignTx(t *testing.T) { if parsedTx.Value().Cmp(tx.Value.ToInt()) != 0 { t.Errorf("Expected value to be unchanged, expected %v got %v", tx.Value, parsedTx.Value()) } - control <- "Y" - control <- "a_long_password" + control.approveCh <- "Y" + control.inputCh <- "a_long_password" res2, err = api.SignTransaction(context.Background(), tx, &methodSig) if err != nil { @@ -364,8 +304,8 @@ func TestSignTx(t *testing.T) { } //The tx is modified by the UI - control <- "M" - control <- "a_long_password" + control.approveCh <- "M" + control.inputCh <- "a_long_password" res2, err = api.SignTransaction(context.Background(), tx, &methodSig) if err != nil { @@ -383,31 +323,3 @@ func TestSignTx(t *testing.T) { } } - -/* -func TestAsyncronousResponses(t *testing.T){ - - //Set up one account - api, control := setup(t) - createAccount(control, api, t) - - // Two transactions, the second one with larger value than the first - tx1 := mkTestTx() - newVal := big.NewInt(0).Add((*big.Int) (tx1.Value), big.NewInt(1)) - tx2 := mkTestTx() - tx2.Value = (*hexutil.Big)(newVal) - - control <- "W" //wait - control <- "Y" // - control <- "a_long_password" - control <- "Y" // - control <- "a_long_password" - - var err error - - h1, err := api.SignTransaction(context.Background(), common.HexToAddress("1111"), tx1, nil) - h2, err := api.SignTransaction(context.Background(), common.HexToAddress("2222"), tx2, nil) - - - } -*/ diff --git a/signer/core/auditlog.go b/signer/core/auditlog.go index 1f9c90918594..1092e7a92340 100644 --- a/signer/core/auditlog.go +++ b/signer/core/auditlog.go @@ -1,27 +1,24 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// GNU Lesser General Public License for more details. // -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package core import ( "context" - "encoding/json" - - "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/internal/ethapi" @@ -41,7 +38,7 @@ func (l *AuditLogger) List(ctx context.Context) ([]common.Address, error) { return res, e } -func (l *AuditLogger) New(ctx context.Context) (accounts.Account, error) { +func (l *AuditLogger) New(ctx context.Context) (common.Address, error) { return l.api.New(ctx) } @@ -63,31 +60,37 @@ func (l *AuditLogger) SignTransaction(ctx context.Context, args SendTxArgs, meth return res, e } -func (l *AuditLogger) Sign(ctx context.Context, addr common.MixedcaseAddress, data hexutil.Bytes) (hexutil.Bytes, error) { - l.log.Info("Sign", "type", "request", "metadata", MetadataFromContext(ctx).String(), - "addr", addr.String(), "data", common.Bytes2Hex(data)) - b, e := l.api.Sign(ctx, addr, data) - l.log.Info("Sign", "type", "response", "data", common.Bytes2Hex(b), "error", e) +func (l *AuditLogger) SignData(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (hexutil.Bytes, error) { + l.log.Info("SignData", "type", "request", "metadata", MetadataFromContext(ctx).String(), + "addr", addr.String(), "data", data, "content-type", contentType) + b, e := l.api.SignData(ctx, contentType, addr, data) + l.log.Info("SignData", "type", "response", "data", common.Bytes2Hex(b), "error", e) return b, e } -func (l *AuditLogger) Export(ctx context.Context, addr common.Address) (json.RawMessage, error) { - l.log.Info("Export", "type", "request", "metadata", MetadataFromContext(ctx).String(), - "addr", addr.Hex()) - j, e := l.api.Export(ctx, addr) - // In this case, we don't actually log the json-response, which may be extra sensitive - l.log.Info("Export", "type", "response", "json response size", len(j), "error", e) - return j, e +func (l *AuditLogger) SignTypedData(ctx context.Context, addr common.MixedcaseAddress, data TypedData) (hexutil.Bytes, error) { + l.log.Info("SignTypedData", "type", "request", "metadata", MetadataFromContext(ctx).String(), + "addr", addr.String(), "data", data) + b, e := l.api.SignTypedData(ctx, addr, data) + l.log.Info("SignTypedData", "type", "response", "data", common.Bytes2Hex(b), "error", e) + return b, e } -//func (l *AuditLogger) Import(ctx context.Context, keyJSON json.RawMessage) (Account, error) { -// // Don't actually log the json contents -// l.log.Info("Import", "type", "request", "metadata", MetadataFromContext(ctx).String(), -// "keyJSON size", len(keyJSON)) -// a, e := l.api.Import(ctx, keyJSON) -// l.log.Info("Import", "type", "response", "addr", a.String(), "error", e) -// return a, e -//} +func (l *AuditLogger) EcRecover(ctx context.Context, data hexutil.Bytes, sig hexutil.Bytes) (common.Address, error) { + l.log.Info("EcRecover", "type", "request", "metadata", MetadataFromContext(ctx).String(), + "data", common.Bytes2Hex(data), "sig", common.Bytes2Hex(sig)) + b, e := l.api.EcRecover(ctx, data, sig) + l.log.Info("EcRecover", "type", "response", "address", b.String(), "error", e) + return b, e +} + +func (l *AuditLogger) Version(ctx context.Context) (string, error) { + l.log.Info("Version", "type", "request", "metadata", MetadataFromContext(ctx).String()) + data, err := l.api.Version(ctx) + l.log.Info("Version", "type", "response", "data", data, "error", err) + return data, err + +} func NewAuditLogger(path string, api ExternalAPI) (*AuditLogger, error) { l := log.New("api", "signer") diff --git a/signer/core/cliui.go b/signer/core/cliui.go index 940f1f43aadb..1502238bf790 100644 --- a/signer/core/cliui.go +++ b/signer/core/cliui.go @@ -1,30 +1,29 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// GNU Lesser General Public License for more details. // -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package core import ( "bufio" + "encoding/json" "fmt" "os" "strings" - "sync" - "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" @@ -40,6 +39,10 @@ func NewCommandlineUI() *CommandlineUI { return &CommandlineUI{in: bufio.NewReader(os.Stdin)} } +func (ui *CommandlineUI) RegisterUIServer(api *UIServerAPI) { + // noop +} + // readString reads a single line from stdin, trimming if from spaces, enforcing // non-emptyness. func (ui *CommandlineUI) readString() string { @@ -84,9 +87,10 @@ func (ui *CommandlineUI) readPasswordText(inputstring string) string { } func (ui *CommandlineUI) OnInputRequired(info UserInputRequest) (UserInputResponse, error) { - fmt.Println(info.Title) - fmt.Println(info.Prompt) + + fmt.Printf("## %s\n\n%s\n", info.Title, info.Prompt) if info.IsPassword { + fmt.Printf("> ") text, err := terminal.ReadPassword(int(os.Stdin.Fd())) if err != nil { log.Error("Failed to read password", "err", err) @@ -153,9 +157,9 @@ func (ui *CommandlineUI) ApproveTx(request *SignTxRequest) (SignTxResponse, erro showMetadata(request.Meta) fmt.Printf("-------------------------------------------\n") if !ui.confirm() { - return SignTxResponse{request.Transaction, false, ""}, nil + return SignTxResponse{request.Transaction, false}, nil } - return SignTxResponse{request.Transaction, true, ui.readPassword()}, nil + return SignTxResponse{request.Transaction, true}, nil } // ApproveSignData prompt the user for confirmation to request to sign data @@ -165,52 +169,23 @@ func (ui *CommandlineUI) ApproveSignData(request *SignDataRequest) (SignDataResp fmt.Printf("-------- Sign data request--------------\n") fmt.Printf("Account: %s\n", request.Address.String()) - fmt.Printf("message: \n%q\n", request.Message) - fmt.Printf("raw data: \n%v\n", request.Rawdata) - fmt.Printf("message hash: %v\n", request.Hash) - fmt.Printf("-------------------------------------------\n") - showMetadata(request.Meta) - if !ui.confirm() { - return SignDataResponse{false, ""}, nil + fmt.Printf("messages:\n") + for _, nvt := range request.Messages { + fmt.Printf("\u00a0\u00a0%v\n", strings.TrimSpace(nvt.Pprint(1))) } - return SignDataResponse{true, ui.readPassword()}, nil -} - -// ApproveExport prompt the user for confirmation to export encrypted Account json -func (ui *CommandlineUI) ApproveExport(request *ExportRequest) (ExportResponse, error) { - ui.mu.Lock() - defer ui.mu.Unlock() - - fmt.Printf("-------- Export Account request--------------\n") - fmt.Printf("A request has been made to export the (encrypted) keyfile\n") - fmt.Printf("Approving this operation means that the caller obtains the (encrypted) contents\n") - fmt.Printf("\n") - fmt.Printf("Account: %x\n", request.Address) - //fmt.Printf("keyfile: \n%v\n", request.file) - fmt.Printf("-------------------------------------------\n") - showMetadata(request.Meta) - return ExportResponse{ui.confirm()}, nil -} - -// ApproveImport prompt the user for confirmation to import Account json -func (ui *CommandlineUI) ApproveImport(request *ImportRequest) (ImportResponse, error) { - ui.mu.Lock() - defer ui.mu.Unlock() - - fmt.Printf("-------- Import Account request--------------\n") - fmt.Printf("A request has been made to import an encrypted keyfile\n") + fmt.Printf("raw data: \n%q\n", request.Rawdata) + fmt.Printf("data hash: %v\n", request.Hash) fmt.Printf("-------------------------------------------\n") showMetadata(request.Meta) if !ui.confirm() { - return ImportResponse{false, "", ""}, nil + return SignDataResponse{false}, nil } - return ImportResponse{true, ui.readPasswordText("Old password"), ui.readPasswordText("New password")}, nil + return SignDataResponse{true}, nil } // ApproveListing prompt the user for confirmation to list accounts // the list of accounts to list can be modified by the UI func (ui *CommandlineUI) ApproveListing(request *ListRequest) (ListResponse, error) { - ui.mu.Lock() defer ui.mu.Unlock() @@ -220,7 +195,6 @@ func (ui *CommandlineUI) ApproveListing(request *ListRequest) (ListResponse, err for _, account := range request.Accounts { fmt.Printf(" [x] %v\n", account.Address.Hex()) fmt.Printf(" URL: %v\n", account.URL) - fmt.Printf(" Type: %v\n", account.Typ) } fmt.Printf("-------------------------------------------\n") showMetadata(request.Meta) @@ -242,26 +216,29 @@ func (ui *CommandlineUI) ApproveNewAccount(request *NewAccountRequest) (NewAccou fmt.Printf("and the address is returned to the external caller\n\n") showMetadata(request.Meta) if !ui.confirm() { - return NewAccountResponse{false, ""}, nil + return NewAccountResponse{false}, nil } - return NewAccountResponse{true, ui.readPassword()}, nil + return NewAccountResponse{true}, nil } // ShowError displays error message to user func (ui *CommandlineUI) ShowError(message string) { - fmt.Printf("-------- Error message from Clef-----------\n") - fmt.Println(message) + fmt.Printf("## Error \n%s\n", message) fmt.Printf("-------------------------------------------\n") } // ShowInfo displays info message to user func (ui *CommandlineUI) ShowInfo(message string) { - fmt.Printf("Info: %v\n", message) + fmt.Printf("## Info \n%s\n", message) } func (ui *CommandlineUI) OnApprovedTx(tx ethapi.SignTransactionResult) { fmt.Printf("Transaction signed:\n ") - spew.Dump(tx.Tx) + if jsn, err := json.MarshalIndent(tx.Tx, " ", " "); err != nil { + fmt.Printf("WARN: marshalling error %v\n", err) + } else { + fmt.Println(string(jsn)) + } } func (ui *CommandlineUI) OnSignerStartup(info StartupInfo) { diff --git a/signer/core/signed_data.go b/signer/core/signed_data.go new file mode 100644 index 000000000000..f512be7ceaec --- /dev/null +++ b/signer/core/signed_data.go @@ -0,0 +1,1002 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "bytes" + "context" + "errors" + "fmt" + "math/big" + "mime" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "unicode" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/clique" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" +) + +type SigFormat struct { + Mime string + ByteVersion byte +} + +var ( + IntendedValidator = SigFormat{ + accounts.MimetypeDataWithValidator, + 0x00, + } + DataTyped = SigFormat{ + accounts.MimetypeTypedData, + 0x01, + } + ApplicationClique = SigFormat{ + accounts.MimetypeClique, + 0x02, + } + TextPlain = SigFormat{ + accounts.MimetypeTextPlain, + 0x45, + } +) + +type ValidatorData struct { + Address common.Address + Message hexutil.Bytes +} + +type TypedData struct { + Types Types `json:"types"` + PrimaryType string `json:"primaryType"` + Domain TypedDataDomain `json:"domain"` + Message TypedDataMessage `json:"message"` +} + +type Type struct { + Name string `json:"name"` + Type string `json:"type"` +} + +func (t *Type) isArray() bool { + return strings.HasSuffix(t.Type, "[]") +} + +// typeName returns the canonical name of the type. If the type is 'Person[]', then +// this method returns 'Person' +func (t *Type) typeName() string { + if strings.HasSuffix(t.Type, "[]") { + return strings.TrimSuffix(t.Type, "[]") + } + return t.Type +} + +func (t *Type) isReferenceType() bool { + if len(t.Type) == 0 { + return false + } + // Reference types must have a leading uppercase characer + return unicode.IsUpper([]rune(t.Type)[0]) +} + +type Types map[string][]Type + +type TypePriority struct { + Type string + Value uint +} + +type TypedDataMessage = map[string]interface{} + +type TypedDataDomain struct { + Name string `json:"name"` + Version string `json:"version"` + ChainId *math.HexOrDecimal256 `json:"chainId"` + VerifyingContract string `json:"verifyingContract"` + Salt string `json:"salt"` +} + +var typedDataReferenceTypeRegexp = regexp.MustCompile(`^[A-Z](\w*)(\[\])?$`) + +// sign receives a request and produces a signature +// +// Note, the produced signature conforms to the secp256k1 curve R, S and V values, +// where the V value will be 27 or 28 for legacy reasons, if legacyV==true. +func (api *SignerAPI) sign(addr common.MixedcaseAddress, req *SignDataRequest, legacyV bool) (hexutil.Bytes, error) { + // We make the request prior to looking up if we actually have the account, to prevent + // account-enumeration via the API + res, err := api.UI.ApproveSignData(req) + if err != nil { + return nil, err + } + if !res.Approved { + return nil, ErrRequestDenied + } + // Look up the wallet containing the requested signer + account := accounts.Account{Address: addr.Address()} + wallet, err := api.am.Find(account) + if err != nil { + return nil, err + } + pw, err := api.lookupOrQueryPassword(account.Address, + "Password for signing", + fmt.Sprintf("Please enter password for signing data with account %s", account.Address.Hex())) + if err != nil { + return nil, err + } + // Sign the data with the wallet + signature, err := wallet.SignDataWithPassphrase(account, pw, req.ContentType, req.Rawdata) + if err != nil { + return nil, err + } + if legacyV { + signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper + } + return signature, nil +} + +// SignData signs the hash of the provided data, but does so differently +// depending on the content-type specified. +// +// Different types of validation occur. +func (api *SignerAPI) SignData(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (hexutil.Bytes, error) { + var req, transformV, err = api.determineSignatureFormat(ctx, contentType, addr, data) + if err != nil { + return nil, err + } + signature, err := api.sign(addr, req, transformV) + if err != nil { + api.UI.ShowError(err.Error()) + return nil, err + } + return signature, nil +} + +// determineSignatureFormat determines which signature method should be used based upon the mime type +// In the cases where it matters ensure that the charset is handled. The charset +// resides in the 'params' returned as the second returnvalue from mime.ParseMediaType +// charset, ok := params["charset"] +// As it is now, we accept any charset and just treat it as 'raw'. +// This method returns the mimetype for signing along with the request +func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (*SignDataRequest, bool, error) { + var ( + req *SignDataRequest + useEthereumV = true // Default to use V = 27 or 28, the legacy Ethereum format + ) + mediaType, _, err := mime.ParseMediaType(contentType) + if err != nil { + return nil, useEthereumV, err + } + + switch mediaType { + case IntendedValidator.Mime: + // Data with an intended validator + validatorData, err := UnmarshalValidatorData(data) + if err != nil { + return nil, useEthereumV, err + } + sighash, msg := SignTextValidator(validatorData) + messages := []*NameValueType{ + { + Name: "This is a request to sign data intended for a particular validator (see EIP 191 version 0)", + Typ: "description", + Value: "", + }, + { + Name: "Intended validator address", + Typ: "address", + Value: validatorData.Address.String(), + }, + { + Name: "Application-specific data", + Typ: "hexdata", + Value: validatorData.Message, + }, + { + Name: "Full message for signing", + Typ: "hexdata", + Value: fmt.Sprintf("0x%x", msg), + }, + } + req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Messages: messages, Hash: sighash} + case ApplicationClique.Mime: + // Clique is the Ethereum PoA standard + stringData, ok := data.(string) + if !ok { + return nil, useEthereumV, fmt.Errorf("input for %v must be an hex-encoded string", ApplicationClique.Mime) + } + cliqueData, err := hexutil.Decode(stringData) + if err != nil { + return nil, useEthereumV, err + } + header := &types.Header{} + if err := rlp.DecodeBytes(cliqueData, header); err != nil { + return nil, useEthereumV, err + } + // The incoming clique header is already truncated, sent to us with a extradata already shortened + if len(header.Extra) < 65 { + // Need to add it back, to get a suitable length for hashing + newExtra := make([]byte, len(header.Extra)+65) + copy(newExtra, header.Extra) + header.Extra = newExtra + } + // Get back the rlp data, encoded by us + sighash, cliqueRlp, err := cliqueHeaderHashAndRlp(header) + if err != nil { + return nil, useEthereumV, err + } + messages := []*NameValueType{ + { + Name: "Clique header", + Typ: "clique", + Value: fmt.Sprintf("clique header %d [0x%x]", header.Number, header.Hash()), + }, + } + // Clique uses V on the form 0 or 1 + useEthereumV = false + req = &SignDataRequest{ContentType: mediaType, Rawdata: cliqueRlp, Messages: messages, Hash: sighash} + default: // also case TextPlain.Mime: + // Calculates an Ethereum ECDSA signature for: + // hash = keccak256("\x19${byteVersion}Ethereum Signed Message:\n${message length}${message}") + // We expect it to be a string + if stringData, ok := data.(string); !ok { + return nil, useEthereumV, fmt.Errorf("input for text/plain must be an hex-encoded string") + } else { + if textData, err := hexutil.Decode(stringData); err != nil { + return nil, useEthereumV, err + } else { + sighash, msg := accounts.TextAndHash(textData) + messages := []*NameValueType{ + { + Name: "message", + Typ: accounts.MimetypeTextPlain, + Value: msg, + }, + } + req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Messages: messages, Hash: sighash} + } + } + } + req.Address = addr + req.Meta = MetadataFromContext(ctx) + return req, useEthereumV, nil +} + +// SignTextWithValidator signs the given message which can be further recovered +// with the given validator. +// hash = keccak256("\x19\x00"${address}${data}). +func SignTextValidator(validatorData ValidatorData) (hexutil.Bytes, string) { + msg := fmt.Sprintf("\x19\x00%s%s", string(validatorData.Address.Bytes()), string(validatorData.Message)) + return crypto.Keccak256([]byte(msg)), msg +} + +// cliqueHeaderHashAndRlp returns the hash which is used as input for the proof-of-authority +// signing. It is the hash of the entire header apart from the 65 byte signature +// contained at the end of the extra data. +// +// The method requires the extra data to be at least 65 bytes -- the original implementation +// in clique.go panics if this is the case, thus it's been reimplemented here to avoid the panic +// and simply return an error instead +func cliqueHeaderHashAndRlp(header *types.Header) (hash, rlp []byte, err error) { + if len(header.Extra) < 65 { + err = fmt.Errorf("clique header extradata too short, %d < 65", len(header.Extra)) + return + } + rlp = clique.CliqueRLP(header) + hash = clique.SealHash(header).Bytes() + return hash, rlp, err +} + +// SignTypedData signs EIP-712 conformant typed data +// hash = keccak256("\x19${byteVersion}${domainSeparator}${hashStruct(message)}") +func (api *SignerAPI) SignTypedData(ctx context.Context, addr common.MixedcaseAddress, typedData TypedData) (hexutil.Bytes, error) { + domainSeparator, err := typedData.HashStruct("EIP712Domain", typedData.Domain.Map()) + if err != nil { + return nil, err + } + typedDataHash, err := typedData.HashStruct(typedData.PrimaryType, typedData.Message) + if err != nil { + return nil, err + } + rawData := []byte(fmt.Sprintf("\x19\x01%s%s", string(domainSeparator), string(typedDataHash))) + sighash := crypto.Keccak256(rawData) + messages, err := typedData.Format() + if err != nil { + return nil, err + } + req := &SignDataRequest{ContentType: DataTyped.Mime, Rawdata: rawData, Messages: messages, Hash: sighash} + signature, err := api.sign(addr, req, true) + if err != nil { + api.UI.ShowError(err.Error()) + return nil, err + } + return signature, nil +} + +// HashStruct generates a keccak256 hash of the encoding of the provided data +func (typedData *TypedData) HashStruct(primaryType string, data TypedDataMessage) (hexutil.Bytes, error) { + encodedData, err := typedData.EncodeData(primaryType, data, 1) + if err != nil { + return nil, err + } + return crypto.Keccak256(encodedData), nil +} + +// Dependencies returns an array of custom types ordered by their hierarchical reference tree +func (typedData *TypedData) Dependencies(primaryType string, found []string) []string { + includes := func(arr []string, str string) bool { + for _, obj := range arr { + if obj == str { + return true + } + } + return false + } + + if includes(found, primaryType) { + return found + } + if typedData.Types[primaryType] == nil { + return found + } + found = append(found, primaryType) + for _, field := range typedData.Types[primaryType] { + for _, dep := range typedData.Dependencies(field.Type, found) { + if !includes(found, dep) { + found = append(found, dep) + } + } + } + return found +} + +// EncodeType generates the following encoding: +// `name ‖ "(" ‖ member₁ ‖ "," ‖ member₂ ‖ "," ‖ … ‖ memberₙ ")"` +// +// each member is written as `type ‖ " " ‖ name` encodings cascade down and are sorted by name +func (typedData *TypedData) EncodeType(primaryType string) hexutil.Bytes { + // Get dependencies primary first, then alphabetical + deps := typedData.Dependencies(primaryType, []string{}) + if len(deps) > 0 { + slicedDeps := deps[1:] + sort.Strings(slicedDeps) + deps = append([]string{primaryType}, slicedDeps...) + } + + // Format as a string with fields + var buffer bytes.Buffer + for _, dep := range deps { + buffer.WriteString(dep) + buffer.WriteString("(") + for _, obj := range typedData.Types[dep] { + buffer.WriteString(obj.Type) + buffer.WriteString(" ") + buffer.WriteString(obj.Name) + buffer.WriteString(",") + } + buffer.Truncate(buffer.Len() - 1) + buffer.WriteString(")") + } + return buffer.Bytes() +} + +// TypeHash creates the keccak256 hash of the data +func (typedData *TypedData) TypeHash(primaryType string) hexutil.Bytes { + return crypto.Keccak256(typedData.EncodeType(primaryType)) +} + +// EncodeData generates the following encoding: +// `enc(value₁) ‖ enc(value₂) ‖ … ‖ enc(valueₙ)` +// +// each encoded member is 32-byte long +func (typedData *TypedData) EncodeData(primaryType string, data map[string]interface{}, depth int) (hexutil.Bytes, error) { + if err := typedData.validate(); err != nil { + return nil, err + } + + buffer := bytes.Buffer{} + + // Verify extra data + if len(typedData.Types[primaryType]) < len(data) { + return nil, errors.New("there is extra data provided in the message") + } + + // Add typehash + buffer.Write(typedData.TypeHash(primaryType)) + + // Add field contents. Structs and arrays have special handlers. + for _, field := range typedData.Types[primaryType] { + encType := field.Type + encValue := data[field.Name] + if encType[len(encType)-1:] == "]" { + arrayValue, ok := encValue.([]interface{}) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + + arrayBuffer := bytes.Buffer{} + parsedType := strings.Split(encType, "[")[0] + for _, item := range arrayValue { + if typedData.Types[parsedType] != nil { + mapValue, ok := item.(map[string]interface{}) + if !ok { + return nil, dataMismatchError(parsedType, item) + } + encodedData, err := typedData.EncodeData(parsedType, mapValue, depth+1) + if err != nil { + return nil, err + } + arrayBuffer.Write(encodedData) + } else { + bytesValue, err := typedData.EncodePrimitiveValue(parsedType, item, depth) + if err != nil { + return nil, err + } + arrayBuffer.Write(bytesValue) + } + } + + buffer.Write(crypto.Keccak256(arrayBuffer.Bytes())) + } else if typedData.Types[field.Type] != nil { + mapValue, ok := encValue.(map[string]interface{}) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + encodedData, err := typedData.EncodeData(field.Type, mapValue, depth+1) + if err != nil { + return nil, err + } + buffer.Write(crypto.Keccak256(encodedData)) + } else { + byteValue, err := typedData.EncodePrimitiveValue(encType, encValue, depth) + if err != nil { + return nil, err + } + buffer.Write(byteValue) + } + } + return buffer.Bytes(), nil +} + +func parseInteger(encType string, encValue interface{}) (*big.Int, error) { + var ( + length int + signed = strings.HasPrefix(encType, "int") + b *big.Int + ) + if encType == "int" || encType == "uint" { + length = 256 + } else { + lengthStr := "" + if strings.HasPrefix(encType, "uint") { + lengthStr = strings.TrimPrefix(encType, "uint") + } else { + lengthStr = strings.TrimPrefix(encType, "int") + } + atoiSize, err := strconv.Atoi(lengthStr) + if err != nil { + return nil, fmt.Errorf("invalid size on integer: %v", lengthStr) + } + length = atoiSize + } + switch v := encValue.(type) { + case *math.HexOrDecimal256: + b = (*big.Int)(v) + case string: + var hexIntValue math.HexOrDecimal256 + if err := hexIntValue.UnmarshalText([]byte(v)); err != nil { + return nil, err + } + b = (*big.Int)(&hexIntValue) + case float64: + // JSON parses non-strings as float64. Fail if we cannot + // convert it losslessly + if float64(int64(v)) == v { + b = big.NewInt(int64(v)) + } else { + return nil, fmt.Errorf("invalid float value %v for type %v", v, encType) + } + } + if b == nil { + return nil, fmt.Errorf("invalid integer value %v/%v for type %v", encValue, reflect.TypeOf(encValue), encType) + } + if b.BitLen() > length { + return nil, fmt.Errorf("integer larger than '%v'", encType) + } + if !signed && b.Sign() == -1 { + return nil, fmt.Errorf("invalid negative value for unsigned type %v", encType) + } + return b, nil +} + +// EncodePrimitiveValue deals with the primitive values found +// while searching through the typed data +func (typedData *TypedData) EncodePrimitiveValue(encType string, encValue interface{}, depth int) ([]byte, error) { + switch encType { + case "address": + stringValue, ok := encValue.(string) + if !ok || !common.IsHexAddress(stringValue) { + return nil, dataMismatchError(encType, encValue) + } + retval := make([]byte, 32) + copy(retval[12:], common.HexToAddress(stringValue).Bytes()) + return retval, nil + case "bool": + boolValue, ok := encValue.(bool) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + if boolValue { + return math.PaddedBigBytes(common.Big1, 32), nil + } + return math.PaddedBigBytes(common.Big0, 32), nil + case "string": + strVal, ok := encValue.(string) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + return crypto.Keccak256([]byte(strVal)), nil + case "bytes": + bytesValue, ok := encValue.([]byte) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + return crypto.Keccak256(bytesValue), nil + } + if strings.HasPrefix(encType, "bytes") { + lengthStr := strings.TrimPrefix(encType, "bytes") + length, err := strconv.Atoi(lengthStr) + if err != nil { + return nil, fmt.Errorf("invalid size on bytes: %v", lengthStr) + } + if length < 0 || length > 32 { + return nil, fmt.Errorf("invalid size on bytes: %d", length) + } + if byteValue, ok := encValue.(hexutil.Bytes); !ok { + return nil, dataMismatchError(encType, encValue) + } else { + return math.PaddedBigBytes(new(big.Int).SetBytes(byteValue), 32), nil + } + } + if strings.HasPrefix(encType, "int") || strings.HasPrefix(encType, "uint") { + b, err := parseInteger(encType, encValue) + if err != nil { + return nil, err + } + return abi.U256(b), nil + } + return nil, fmt.Errorf("unrecognized type '%s'", encType) + +} + +// dataMismatchError generates an error for a mismatch between +// the provided type and data +func dataMismatchError(encType string, encValue interface{}) error { + return fmt.Errorf("provided data '%v' doesn't match type '%s'", encValue, encType) +} + +// EcRecover recovers the address associated with the given sig. +// Only compatible with `text/plain` +func (api *SignerAPI) EcRecover(ctx context.Context, data hexutil.Bytes, sig hexutil.Bytes) (common.Address, error) { + // Returns the address for the Account that was used to create the signature. + // + // Note, this function is compatible with eth_sign and personal_sign. As such it recovers + // the address of: + // hash = keccak256("\x19${byteVersion}Ethereum Signed Message:\n${message length}${message}") + // addr = ecrecover(hash, signature) + // + // Note, the signature must conform to the secp256k1 curve R, S and V values, where + // the V value must be be 27 or 28 for legacy reasons. + // + // https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_ecRecover + if len(sig) != 65 { + return common.Address{}, fmt.Errorf("signature must be 65 bytes long") + } + if sig[64] != 27 && sig[64] != 28 { + return common.Address{}, fmt.Errorf("invalid Ethereum signature (V is not 27 or 28)") + } + sig[64] -= 27 // Transform yellow paper V from 27/28 to 0/1 + hash := accounts.TextHash(data) + rpk, err := crypto.SigToPub(hash, sig) + if err != nil { + return common.Address{}, err + } + return crypto.PubkeyToAddress(*rpk), nil +} + +// UnmarshalValidatorData converts the bytes input to typed data +func UnmarshalValidatorData(data interface{}) (ValidatorData, error) { + raw, ok := data.(map[string]interface{}) + if !ok { + return ValidatorData{}, errors.New("validator input is not a map[string]interface{}") + } + addr, ok := raw["address"].(string) + if !ok { + return ValidatorData{}, errors.New("validator address is not sent as a string") + } + addrBytes, err := hexutil.Decode(addr) + if err != nil { + return ValidatorData{}, err + } + if !ok || len(addrBytes) == 0 { + return ValidatorData{}, errors.New("validator address is undefined") + } + + message, ok := raw["message"].(string) + if !ok { + return ValidatorData{}, errors.New("message is not sent as a string") + } + messageBytes, err := hexutil.Decode(message) + if err != nil { + return ValidatorData{}, err + } + if !ok || len(messageBytes) == 0 { + return ValidatorData{}, errors.New("message is undefined") + } + + return ValidatorData{ + Address: common.BytesToAddress(addrBytes), + Message: messageBytes, + }, nil +} + +// validate makes sure the types are sound +func (typedData *TypedData) validate() error { + if err := typedData.Types.validate(); err != nil { + return err + } + if err := typedData.Domain.validate(); err != nil { + return err + } + return nil +} + +// Map generates a map version of the typed data +func (typedData *TypedData) Map() map[string]interface{} { + dataMap := map[string]interface{}{ + "types": typedData.Types, + "domain": typedData.Domain.Map(), + "primaryType": typedData.PrimaryType, + "message": typedData.Message, + } + return dataMap +} + +// Format returns a representation of typedData, which can be easily displayed by a user-interface +// without in-depth knowledge about 712 rules +func (typedData *TypedData) Format() ([]*NameValueType, error) { + domain, err := typedData.formatData("EIP712Domain", typedData.Domain.Map()) + if err != nil { + return nil, err + } + ptype, err := typedData.formatData(typedData.PrimaryType, typedData.Message) + if err != nil { + return nil, err + } + var nvts []*NameValueType + nvts = append(nvts, &NameValueType{ + Name: "EIP712Domain", + Value: domain, + Typ: "domain", + }) + nvts = append(nvts, &NameValueType{ + Name: typedData.PrimaryType, + Value: ptype, + Typ: "primary type", + }) + return nvts, nil +} + +func (typedData *TypedData) formatData(primaryType string, data map[string]interface{}) ([]*NameValueType, error) { + var output []*NameValueType + + // Add field contents. Structs and arrays have special handlers. + for _, field := range typedData.Types[primaryType] { + encName := field.Name + encValue := data[encName] + item := &NameValueType{ + Name: encName, + Typ: field.Type, + } + if field.isArray() { + arrayValue, _ := encValue.([]interface{}) + parsedType := field.typeName() + for _, v := range arrayValue { + if typedData.Types[parsedType] != nil { + mapValue, _ := v.(map[string]interface{}) + mapOutput, err := typedData.formatData(parsedType, mapValue) + if err != nil { + return nil, err + } + item.Value = mapOutput + } else { + primitiveOutput, err := formatPrimitiveValue(field.Type, encValue) + if err != nil { + return nil, err + } + item.Value = primitiveOutput + } + } + } else if typedData.Types[field.Type] != nil { + if mapValue, ok := encValue.(map[string]interface{}); ok { + mapOutput, err := typedData.formatData(field.Type, mapValue) + if err != nil { + return nil, err + } + item.Value = mapOutput + } else { + item.Value = "" + } + } else { + primitiveOutput, err := formatPrimitiveValue(field.Type, encValue) + if err != nil { + return nil, err + } + item.Value = primitiveOutput + } + output = append(output, item) + } + return output, nil +} + +func formatPrimitiveValue(encType string, encValue interface{}) (string, error) { + switch encType { + case "address": + if stringValue, ok := encValue.(string); !ok { + return "", fmt.Errorf("could not format value %v as address", encValue) + } else { + return common.HexToAddress(stringValue).String(), nil + } + case "bool": + if boolValue, ok := encValue.(bool); !ok { + return "", fmt.Errorf("could not format value %v as bool", encValue) + } else { + return fmt.Sprintf("%t", boolValue), nil + } + case "bytes", "string": + return fmt.Sprintf("%s", encValue), nil + } + if strings.HasPrefix(encType, "bytes") { + return fmt.Sprintf("%s", encValue), nil + + } + if strings.HasPrefix(encType, "uint") || strings.HasPrefix(encType, "int") { + if b, err := parseInteger(encType, encValue); err != nil { + return "", err + } else { + return fmt.Sprintf("%d (0x%x)", b, b), nil + } + } + return "", fmt.Errorf("unhandled type %v", encType) +} + +// NameValueType is a very simple struct with Name, Value and Type. It's meant for simple +// json structures used to communicate signing-info about typed data with the UI +type NameValueType struct { + Name string `json:"name"` + Value interface{} `json:"value"` + Typ string `json:"type"` +} + +// Pprint returns a pretty-printed version of nvt +func (nvt *NameValueType) Pprint(depth int) string { + output := bytes.Buffer{} + output.WriteString(strings.Repeat("\u00a0", depth*2)) + output.WriteString(fmt.Sprintf("%s [%s]: ", nvt.Name, nvt.Typ)) + if nvts, ok := nvt.Value.([]*NameValueType); ok { + output.WriteString("\n") + for _, next := range nvts { + sublevel := next.Pprint(depth + 1) + output.WriteString(sublevel) + } + } else { + output.WriteString(fmt.Sprintf("%q\n", nvt.Value)) + } + return output.String() +} + +// Validate checks if the types object is conformant to the specs +func (t Types) validate() error { + for typeKey, typeArr := range t { + if len(typeKey) == 0 { + return fmt.Errorf("empty type key") + } + for i, typeObj := range typeArr { + if len(typeObj.Type) == 0 { + return fmt.Errorf("type %v:%d: empty Type", typeKey, i) + } + if len(typeObj.Name) == 0 { + return fmt.Errorf("type %v:%d: empty Name", typeKey, i) + } + if typeKey == typeObj.Type { + return fmt.Errorf("type '%s' cannot reference itself", typeObj.Type) + } + if typeObj.isReferenceType() { + if _, exist := t[typeObj.typeName()]; !exist { + return fmt.Errorf("reference type '%s' is undefined", typeObj.Type) + } + if !typedDataReferenceTypeRegexp.MatchString(typeObj.Type) { + return fmt.Errorf("unknown reference type '%s", typeObj.Type) + } + } else if !isPrimitiveTypeValid(typeObj.Type) { + return fmt.Errorf("unknown type '%s'", typeObj.Type) + } + } + } + return nil +} + +// Checks if the primitive value is valid +func isPrimitiveTypeValid(primitiveType string) bool { + if primitiveType == "address" || + primitiveType == "address[]" || + primitiveType == "bool" || + primitiveType == "bool[]" || + primitiveType == "string" || + primitiveType == "string[]" { + return true + } + if primitiveType == "bytes" || + primitiveType == "bytes[]" || + primitiveType == "bytes1" || + primitiveType == "bytes1[]" || + primitiveType == "bytes2" || + primitiveType == "bytes2[]" || + primitiveType == "bytes3" || + primitiveType == "bytes3[]" || + primitiveType == "bytes4" || + primitiveType == "bytes4[]" || + primitiveType == "bytes5" || + primitiveType == "bytes5[]" || + primitiveType == "bytes6" || + primitiveType == "bytes6[]" || + primitiveType == "bytes7" || + primitiveType == "bytes7[]" || + primitiveType == "bytes8" || + primitiveType == "bytes8[]" || + primitiveType == "bytes9" || + primitiveType == "bytes9[]" || + primitiveType == "bytes10" || + primitiveType == "bytes10[]" || + primitiveType == "bytes11" || + primitiveType == "bytes11[]" || + primitiveType == "bytes12" || + primitiveType == "bytes12[]" || + primitiveType == "bytes13" || + primitiveType == "bytes13[]" || + primitiveType == "bytes14" || + primitiveType == "bytes14[]" || + primitiveType == "bytes15" || + primitiveType == "bytes15[]" || + primitiveType == "bytes16" || + primitiveType == "bytes16[]" || + primitiveType == "bytes17" || + primitiveType == "bytes17[]" || + primitiveType == "bytes18" || + primitiveType == "bytes18[]" || + primitiveType == "bytes19" || + primitiveType == "bytes19[]" || + primitiveType == "bytes20" || + primitiveType == "bytes20[]" || + primitiveType == "bytes21" || + primitiveType == "bytes21[]" || + primitiveType == "bytes22" || + primitiveType == "bytes22[]" || + primitiveType == "bytes23" || + primitiveType == "bytes23[]" || + primitiveType == "bytes24" || + primitiveType == "bytes24[]" || + primitiveType == "bytes25" || + primitiveType == "bytes25[]" || + primitiveType == "bytes26" || + primitiveType == "bytes26[]" || + primitiveType == "bytes27" || + primitiveType == "bytes27[]" || + primitiveType == "bytes28" || + primitiveType == "bytes28[]" || + primitiveType == "bytes29" || + primitiveType == "bytes29[]" || + primitiveType == "bytes30" || + primitiveType == "bytes30[]" || + primitiveType == "bytes31" || + primitiveType == "bytes31[]" { + return true + } + if primitiveType == "int" || + primitiveType == "int[]" || + primitiveType == "int8" || + primitiveType == "int8[]" || + primitiveType == "int16" || + primitiveType == "int16[]" || + primitiveType == "int32" || + primitiveType == "int32[]" || + primitiveType == "int64" || + primitiveType == "int64[]" || + primitiveType == "int128" || + primitiveType == "int128[]" || + primitiveType == "int256" || + primitiveType == "int256[]" { + return true + } + if primitiveType == "uint" || + primitiveType == "uint[]" || + primitiveType == "uint8" || + primitiveType == "uint8[]" || + primitiveType == "uint16" || + primitiveType == "uint16[]" || + primitiveType == "uint32" || + primitiveType == "uint32[]" || + primitiveType == "uint64" || + primitiveType == "uint64[]" || + primitiveType == "uint128" || + primitiveType == "uint128[]" || + primitiveType == "uint256" || + primitiveType == "uint256[]" { + return true + } + return false +} + +// validate checks if the given domain is valid, i.e. contains at least +// the minimum viable keys and values +func (domain *TypedDataDomain) validate() error { + if domain.ChainId == nil { + return errors.New("chainId must be specified according to EIP-155") + } + + if len(domain.Name) == 0 && len(domain.Version) == 0 && len(domain.VerifyingContract) == 0 && len(domain.Salt) == 0 { + return errors.New("domain is undefined") + } + + return nil +} + +// Map is a helper function to generate a map version of the domain +func (domain *TypedDataDomain) Map() map[string]interface{} { + dataMap := map[string]interface{}{} + + if domain.ChainId != nil { + dataMap["chainId"] = domain.ChainId + } + + if len(domain.Name) > 0 { + dataMap["name"] = domain.Name + } + + if len(domain.Version) > 0 { + dataMap["version"] = domain.Version + } + + if len(domain.VerifyingContract) > 0 { + dataMap["verifyingContract"] = domain.VerifyingContract + } + + if len(domain.Salt) > 0 { + dataMap["salt"] = domain.Salt + } + return dataMap +} diff --git a/signer/core/signed_data_internal_test.go b/signer/core/signed_data_internal_test.go new file mode 100644 index 000000000000..0d59fcfca893 --- /dev/null +++ b/signer/core/signed_data_internal_test.go @@ -0,0 +1,51 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "math/big" + "testing" +) + +func TestParseInteger(t *testing.T) { + for i, tt := range []struct { + t string + v interface{} + exp *big.Int + }{ + {"uint32", "-123", nil}, + {"int32", "-123", big.NewInt(-123)}, + {"uint32", "0xff", big.NewInt(0xff)}, + {"int8", "0xffff", nil}, + } { + res, err := parseInteger(tt.t, tt.v) + if tt.exp == nil && res == nil { + continue + } + if tt.exp == nil && res != nil { + t.Errorf("test %d, got %v, expected nil", i, res) + continue + } + if tt.exp != nil && res == nil { + t.Errorf("test %d, got '%v', expected %v", i, err, tt.exp) + continue + } + if tt.exp.Cmp(res) != 0 { + t.Errorf("test %d, got %v expected %v", i, res, tt.exp) + } + } +} diff --git a/signer/core/signed_data_test.go b/signer/core/signed_data_test.go new file mode 100644 index 000000000000..6b0da4553034 --- /dev/null +++ b/signer/core/signed_data_test.go @@ -0,0 +1,408 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core_test + +import ( + "context" + "encoding/json" + "fmt" + "io/ioutil" + "path" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/signer/core" +) + +var typesStandard = core.Types{ + "EIP712Domain": { + { + Name: "name", + Type: "string", + }, + { + Name: "version", + Type: "string", + }, + { + Name: "chainId", + Type: "uint256", + }, + { + Name: "verifyingContract", + Type: "address", + }, + }, + "Person": { + { + Name: "name", + Type: "string", + }, + { + Name: "wallet", + Type: "address", + }, + }, + "Mail": { + { + Name: "from", + Type: "Person", + }, + { + Name: "to", + Type: "Person", + }, + { + Name: "contents", + Type: "string", + }, + }, +} + +var jsonTypedData = ` + { + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "test", + "type": "uint8" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "test": 3, + "wallet": "0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } + } +` + +const primaryType = "Mail" + +var domainStandard = core.TypedDataDomain{ + "Ether Mail", + "1", + math.NewHexOrDecimal256(1), + "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", + "", +} + +var messageStandard = map[string]interface{}{ + "from": map[string]interface{}{ + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826", + }, + "to": map[string]interface{}{ + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB", + }, + "contents": "Hello, Bob!", +} + +var typedData = core.TypedData{ + Types: typesStandard, + PrimaryType: primaryType, + Domain: domainStandard, + Message: messageStandard, +} + +func TestSignData(t *testing.T) { + api, control := setup(t) + //Create two accounts + createAccount(control, api, t) + createAccount(control, api, t) + control.approveCh <- "1" + list, err := api.List(context.Background()) + if err != nil { + t.Fatal(err) + } + a := common.NewMixedcaseAddress(list[0]) + + control.approveCh <- "Y" + control.inputCh <- "wrongpassword" + signature, err := api.SignData(context.Background(), core.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) + if signature != nil { + t.Errorf("Expected nil-data, got %x", signature) + } + if err != keystore.ErrDecrypt { + t.Errorf("Expected ErrLocked! '%v'", err) + } + control.approveCh <- "No way" + signature, err = api.SignData(context.Background(), core.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) + if signature != nil { + t.Errorf("Expected nil-data, got %x", signature) + } + if err != core.ErrRequestDenied { + t.Errorf("Expected ErrRequestDenied! '%v'", err) + } + // text/plain + control.approveCh <- "Y" + control.inputCh <- "a_long_password" + signature, err = api.SignData(context.Background(), core.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) + if err != nil { + t.Fatal(err) + } + if signature == nil || len(signature) != 65 { + t.Errorf("Expected 65 byte signature (got %d bytes)", len(signature)) + } + // data/typed + control.approveCh <- "Y" + control.inputCh <- "a_long_password" + signature, err = api.SignTypedData(context.Background(), a, typedData) + if err != nil { + t.Fatal(err) + } + if signature == nil || len(signature) != 65 { + t.Errorf("Expected 65 byte signature (got %d bytes)", len(signature)) + } +} + +func TestDomainChainId(t *testing.T) { + withoutChainID := core.TypedData{ + Types: core.Types{ + "EIP712Domain": []core.Type{ + {Name: "name", Type: "string"}, + }, + }, + Domain: core.TypedDataDomain{ + Name: "test", + }, + } + + if _, ok := withoutChainID.Domain.Map()["chainId"]; ok { + t.Errorf("Expected the chainId key to not be present in the domain map") + } + withChainID := core.TypedData{ + Types: core.Types{ + "EIP712Domain": []core.Type{ + {Name: "name", Type: "string"}, + {Name: "chainId", Type: "uint256"}, + }, + }, + Domain: core.TypedDataDomain{ + Name: "test", + ChainId: math.NewHexOrDecimal256(1), + }, + } + + if _, ok := withChainID.Domain.Map()["chainId"]; !ok { + t.Errorf("Expected the chainId key be present in the domain map") + } +} + +func TestHashStruct(t *testing.T) { + hash, err := typedData.HashStruct(typedData.PrimaryType, typedData.Message) + if err != nil { + t.Fatal(err) + } + mainHash := fmt.Sprintf("0x%s", common.Bytes2Hex(hash)) + if mainHash != "0xc52c0ee5d84264471806290a3f2c4cecfc5490626bf912d01f240d7a274b371e" { + t.Errorf("Expected different hashStruct result (got %s)", mainHash) + } + + hash, err = typedData.HashStruct("EIP712Domain", typedData.Domain.Map()) + if err != nil { + t.Error(err) + } + domainHash := fmt.Sprintf("0x%s", common.Bytes2Hex(hash)) + if domainHash != "0xf2cee375fa42b42143804025fc449deafd50cc031ca257e0b194a650a912090f" { + t.Errorf("Expected different domain hashStruct result (got %s)", domainHash) + } +} + +func TestEncodeType(t *testing.T) { + domainTypeEncoding := string(typedData.EncodeType("EIP712Domain")) + if domainTypeEncoding != "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" { + t.Errorf("Expected different encodeType result (got %s)", domainTypeEncoding) + } + + mailTypeEncoding := string(typedData.EncodeType(typedData.PrimaryType)) + if mailTypeEncoding != "Mail(Person from,Person to,string contents)Person(string name,address wallet)" { + t.Errorf("Expected different encodeType result (got %s)", mailTypeEncoding) + } +} + +func TestTypeHash(t *testing.T) { + mailTypeHash := fmt.Sprintf("0x%s", common.Bytes2Hex(typedData.TypeHash(typedData.PrimaryType))) + if mailTypeHash != "0xa0cedeb2dc280ba39b857546d74f5549c3a1d7bdc2dd96bf881f76108e23dac2" { + t.Errorf("Expected different typeHash result (got %s)", mailTypeHash) + } +} + +func TestEncodeData(t *testing.T) { + hash, err := typedData.EncodeData(typedData.PrimaryType, typedData.Message, 0) + if err != nil { + t.Fatal(err) + } + dataEncoding := fmt.Sprintf("0x%s", common.Bytes2Hex(hash)) + if dataEncoding != "0xa0cedeb2dc280ba39b857546d74f5549c3a1d7bdc2dd96bf881f76108e23dac2fc71e5fa27ff56c350aa531bc129ebdf613b772b6604664f5d8dbe21b85eb0c8cd54f074a4af31b4411ff6a60c9719dbd559c221c8ac3492d9d872b041d703d1b5aadf3154a261abdd9086fc627b61efca26ae5702701d05cd2305f7c52a2fc8" { + t.Errorf("Expected different encodeData result (got %s)", dataEncoding) + } +} + +func TestFormatter(t *testing.T) { + var d core.TypedData + err := json.Unmarshal([]byte(jsonTypedData), &d) + if err != nil { + t.Fatalf("unmarshalling failed '%v'", err) + } + formatted, _ := d.Format() + for _, item := range formatted { + t.Logf("'%v'\n", item.Pprint(0)) + } + + j, _ := json.Marshal(formatted) + t.Logf("'%v'\n", string(j)) +} + +func sign(typedData core.TypedData) ([]byte, []byte, error) { + domainSeparator, err := typedData.HashStruct("EIP712Domain", typedData.Domain.Map()) + if err != nil { + return nil, nil, err + } + typedDataHash, err := typedData.HashStruct(typedData.PrimaryType, typedData.Message) + if err != nil { + return nil, nil, err + } + rawData := []byte(fmt.Sprintf("\x19\x01%s%s", string(domainSeparator), string(typedDataHash))) + sighash := crypto.Keccak256(rawData) + return typedDataHash, sighash, nil +} + +func TestJsonFiles(t *testing.T) { + testfiles, err := ioutil.ReadDir("testdata/") + if err != nil { + t.Fatalf("failed reading files: %v", err) + } + for i, fInfo := range testfiles { + if !strings.HasSuffix(fInfo.Name(), "json") { + continue + } + expectedFailure := strings.HasPrefix(fInfo.Name(), "expfail") + data, err := ioutil.ReadFile(path.Join("testdata", fInfo.Name())) + if err != nil { + t.Errorf("Failed to read file %v: %v", fInfo.Name(), err) + continue + } + var typedData core.TypedData + err = json.Unmarshal([]byte(data), &typedData) + if err != nil { + t.Errorf("Test %d, file %v, json unmarshalling failed: %v", i, fInfo.Name(), err) + continue + } + _, _, err = sign(typedData) + t.Logf("Error %v\n", err) + if err != nil && !expectedFailure { + t.Errorf("Test %d failed, file %v: %v", i, fInfo.Name(), err) + } + if expectedFailure && err == nil { + t.Errorf("Test %d succeeded (expected failure), file %v: %v", i, fInfo.Name(), err) + } + } +} + +// TestFuzzerFiles tests some files that have been found by fuzzing to cause +// crashes or hangs. +func TestFuzzerFiles(t *testing.T) { + corpusdir := path.Join("testdata", "fuzzing") + testfiles, err := ioutil.ReadDir(corpusdir) + if err != nil { + t.Fatalf("failed reading files: %v", err) + } + verbose := false + for i, fInfo := range testfiles { + data, err := ioutil.ReadFile(path.Join(corpusdir, fInfo.Name())) + if err != nil { + t.Errorf("Failed to read file %v: %v", fInfo.Name(), err) + continue + } + var typedData core.TypedData + err = json.Unmarshal([]byte(data), &typedData) + if err != nil { + t.Errorf("Test %d, file %v, json unmarshalling failed: %v", i, fInfo.Name(), err) + continue + } + _, err = typedData.EncodeData("EIP712Domain", typedData.Domain.Map(), 1) + if verbose && err != nil { + t.Logf("%d, EncodeData[1] err: %v\n", i, err) + } + _, err = typedData.EncodeData(typedData.PrimaryType, typedData.Message, 1) + if verbose && err != nil { + t.Logf("%d, EncodeData[2] err: %v\n", i, err) + } + typedData.Format() + } +} diff --git a/signer/core/stdioui.go b/signer/core/stdioui.go index 64032386fcf1..9ffe1398d43d 100644 --- a/signer/core/stdioui.go +++ b/signer/core/stdioui.go @@ -1,19 +1,18 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// GNU Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package core @@ -32,12 +31,16 @@ type StdIOUI struct { } func NewStdIOUI() *StdIOUI { - log.Info("NewStdIOUI") client, err := rpc.DialContext(context.Background(), "stdio://") if err != nil { log.Crit("Could not create stdio client", "err", err) } - return &StdIOUI{client: *client} + ui := &StdIOUI{client: *client} + return ui +} + +func (ui *StdIOUI) RegisterUIServer(api *UIServerAPI) { + ui.client.RegisterName("clef", api) } // dispatch sends a request over the stdio @@ -49,73 +52,71 @@ func (ui *StdIOUI) dispatch(serviceMethod string, args interface{}, reply interf return err } +// notify sends a request over the stdio, and does not listen for a response +func (ui *StdIOUI) notify(serviceMethod string, args interface{}) error { + ctx := context.Background() + err := ui.client.Notify(ctx, serviceMethod, args) + if err != nil { + log.Info("Error", "exc", err.Error()) + } + return err +} + func (ui *StdIOUI) ApproveTx(request *SignTxRequest) (SignTxResponse, error) { var result SignTxResponse - err := ui.dispatch("ApproveTx", request, &result) + err := ui.dispatch("ui_approveTx", request, &result) return result, err } func (ui *StdIOUI) ApproveSignData(request *SignDataRequest) (SignDataResponse, error) { var result SignDataResponse - err := ui.dispatch("ApproveSignData", request, &result) - return result, err -} - -func (ui *StdIOUI) ApproveExport(request *ExportRequest) (ExportResponse, error) { - var result ExportResponse - err := ui.dispatch("ApproveExport", request, &result) - return result, err -} - -func (ui *StdIOUI) ApproveImport(request *ImportRequest) (ImportResponse, error) { - var result ImportResponse - err := ui.dispatch("ApproveImport", request, &result) + err := ui.dispatch("ui_approveSignData", request, &result) return result, err } func (ui *StdIOUI) ApproveListing(request *ListRequest) (ListResponse, error) { var result ListResponse - err := ui.dispatch("ApproveListing", request, &result) + err := ui.dispatch("ui_approveListing", request, &result) return result, err } func (ui *StdIOUI) ApproveNewAccount(request *NewAccountRequest) (NewAccountResponse, error) { var result NewAccountResponse - err := ui.dispatch("ApproveNewAccount", request, &result) + err := ui.dispatch("ui_approveNewAccount", request, &result) return result, err } func (ui *StdIOUI) ShowError(message string) { - err := ui.dispatch("ShowError", &Message{message}, nil) + err := ui.notify("ui_showError", &Message{message}) if err != nil { - log.Info("Error calling 'ShowError'", "exc", err.Error(), "msg", message) + log.Info("Error calling 'ui_showError'", "exc", err.Error(), "msg", message) } } func (ui *StdIOUI) ShowInfo(message string) { - err := ui.dispatch("ShowInfo", Message{message}, nil) + err := ui.notify("ui_showInfo", Message{message}) if err != nil { - log.Info("Error calling 'ShowInfo'", "exc", err.Error(), "msg", message) + log.Info("Error calling 'ui_showInfo'", "exc", err.Error(), "msg", message) } } func (ui *StdIOUI) OnApprovedTx(tx ethapi.SignTransactionResult) { - err := ui.dispatch("OnApprovedTx", tx, nil) + err := ui.notify("ui_onApprovedTx", tx) if err != nil { - log.Info("Error calling 'OnApprovedTx'", "exc", err.Error(), "tx", tx) + log.Info("Error calling 'ui_onApprovedTx'", "exc", err.Error(), "tx", tx) } } func (ui *StdIOUI) OnSignerStartup(info StartupInfo) { - err := ui.dispatch("OnSignerStartup", info, nil) + err := ui.notify("ui_onSignerStartup", info) if err != nil { - log.Info("Error calling 'OnSignerStartup'", "exc", err.Error(), "info", info) + log.Info("Error calling 'ui_onSignerStartup'", "exc", err.Error(), "info", info) } } func (ui *StdIOUI) OnInputRequired(info UserInputRequest) (UserInputResponse, error) { var result UserInputResponse - err := ui.dispatch("OnInputRequired", info, &result) + err := ui.dispatch("ui_onInputRequired", info, &result) if err != nil { - log.Info("Error calling 'OnInputRequired'", "exc", err.Error(), "info", info) + log.Info("Error calling 'ui_onInputRequired'", "exc", err.Error(), "info", info) } return result, err } diff --git a/signer/core/testdata/README.md b/signer/core/testdata/README.md new file mode 100644 index 000000000000..f425450a0673 --- /dev/null +++ b/signer/core/testdata/README.md @@ -0,0 +1,5 @@ +### EIP 712 tests + +These tests are json files which are converted into eip-712 typed data. +All files are expected to be proper json, and tests will fail if they are not. +Files that begin with `expfail' are expected to not pass the hashstruct construction. diff --git a/signer/core/testdata/arrays-1.json b/signer/core/testdata/arrays-1.json new file mode 100644 index 000000000000..fea82b42c6de --- /dev/null +++ b/signer/core/testdata/arrays-1.json @@ -0,0 +1,60 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Foo": [ + { + "name": "addys", + "type": "address[]" + }, + { + "name": "stringies", + "type": "string[]" + }, + { + "name": "inties", + "type": "uint[]" + } + ] + }, + "primaryType": "Foo", + "domain": { + "name": "Lorem", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "addys": [ + "0x0000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000003" + ], + "stringies": [ + "lorem", + "ipsum", + "dolores" + ], + "inties": [ + "0x0000000000000000000000000000000000000001", + "3", + 4.0 + ] + } +} diff --git a/signer/core/testdata/custom_arraytype.json b/signer/core/testdata/custom_arraytype.json new file mode 100644 index 000000000000..078de88c22f8 --- /dev/null +++ b/signer/core/testdata/custom_arraytype.json @@ -0,0 +1,54 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person[]" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { "name": "Cow"}, + "to": [{ "name": "Moose"},{ "name": "Goose"}], + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/eip712.json b/signer/core/testdata/eip712.json new file mode 100644 index 000000000000..7b1cb8ae2d16 --- /dev/null +++ b/signer/core/testdata/eip712.json @@ -0,0 +1,76 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "test", + "type": "uint8" + }, + { + "name": "test2", + "type": "uint8" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "test": "3", + "test2": 5.0, + "wallet": "0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "test": "0", + "test2": 5, + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_arraytype_overload.json b/signer/core/testdata/expfail_arraytype_overload.json new file mode 100644 index 000000000000..786487f1002d --- /dev/null +++ b/signer/core/testdata/expfail_arraytype_overload.json @@ -0,0 +1,67 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Person[]": [ + { + "name": "baz", + "type": "string" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person[]" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": {"baz": "foo"}, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_datamismatch_1.json b/signer/core/testdata/expfail_datamismatch_1.json new file mode 100644 index 000000000000..d19d470d1eac --- /dev/null +++ b/signer/core/testdata/expfail_datamismatch_1.json @@ -0,0 +1,64 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "Person" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_extradata-1.json b/signer/core/testdata/expfail_extradata-1.json new file mode 100644 index 000000000000..fd704209bc46 --- /dev/null +++ b/signer/core/testdata/expfail_extradata-1.json @@ -0,0 +1,76 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256 ... and now for something completely different" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "test", + "type": "uint8" + }, + { + "name": "test2", + "type": "uint8" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "test": "3", + "test2": 5.0, + "wallet": "0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "test": "0", + "test2": 5, + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_extradata-2.json b/signer/core/testdata/expfail_extradata-2.json new file mode 100644 index 000000000000..10f91c23af4b --- /dev/null +++ b/signer/core/testdata/expfail_extradata-2.json @@ -0,0 +1,77 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "test", + "type": "uint8" + }, + { + "name": "test2", + "type": "uint8" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "blahonga": "zonk bonk", + "from": { + "name": "Cow", + "test": "3", + "test2": 5.0, + "wallet": "0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "test": "0", + "test2": 5, + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_malformeddomainkeys.json b/signer/core/testdata/expfail_malformeddomainkeys.json new file mode 100644 index 000000000000..354b3cc859ca --- /dev/null +++ b/signer/core/testdata/expfail_malformeddomainkeys.json @@ -0,0 +1,64 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "vFAILFAILerifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_nonexistant_type.json b/signer/core/testdata/expfail_nonexistant_type.json new file mode 100644 index 000000000000..d06bc20b9fe8 --- /dev/null +++ b/signer/core/testdata/expfail_nonexistant_type.json @@ -0,0 +1,64 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "Blahonga" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_toolargeuint.json b/signer/core/testdata/expfail_toolargeuint.json new file mode 100644 index 000000000000..9854b65b17da --- /dev/null +++ b/signer/core/testdata/expfail_toolargeuint.json @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":"257" + } +} diff --git a/signer/core/testdata/expfail_toolargeuint2.json b/signer/core/testdata/expfail_toolargeuint2.json new file mode 100644 index 000000000000..c63ed41f9c41 --- /dev/null +++ b/signer/core/testdata/expfail_toolargeuint2.json @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":257 + } +} diff --git a/signer/core/testdata/expfail_unconvertiblefloat.json b/signer/core/testdata/expfail_unconvertiblefloat.json new file mode 100644 index 000000000000..8229a333ca88 --- /dev/null +++ b/signer/core/testdata/expfail_unconvertiblefloat.json @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":"255.3" + } +} diff --git a/signer/core/testdata/expfail_unconvertiblefloat2.json b/signer/core/testdata/expfail_unconvertiblefloat2.json new file mode 100644 index 000000000000..59e6d38d24ad --- /dev/null +++ b/signer/core/testdata/expfail_unconvertiblefloat2.json @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test": 255.3 + } +} diff --git a/signer/core/testdata/fuzzing/2850f6ccf2d7f5f846dfb73119b60e09e712783f b/signer/core/testdata/fuzzing/2850f6ccf2d7f5f846dfb73119b60e09e712783f new file mode 100644 index 000000000000..8229a333ca88 --- /dev/null +++ b/signer/core/testdata/fuzzing/2850f6ccf2d7f5f846dfb73119b60e09e712783f @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":"255.3" + } +} diff --git a/signer/core/testdata/fuzzing/36fb987a774011dc675e1b5246ac5c1d44d84d92 b/signer/core/testdata/fuzzing/36fb987a774011dc675e1b5246ac5c1d44d84d92 new file mode 100644 index 000000000000..fea82b42c6de --- /dev/null +++ b/signer/core/testdata/fuzzing/36fb987a774011dc675e1b5246ac5c1d44d84d92 @@ -0,0 +1,60 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Foo": [ + { + "name": "addys", + "type": "address[]" + }, + { + "name": "stringies", + "type": "string[]" + }, + { + "name": "inties", + "type": "uint[]" + } + ] + }, + "primaryType": "Foo", + "domain": { + "name": "Lorem", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "addys": [ + "0x0000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000003" + ], + "stringies": [ + "lorem", + "ipsum", + "dolores" + ], + "inties": [ + "0x0000000000000000000000000000000000000001", + "3", + 4.0 + ] + } +} diff --git a/signer/core/testdata/fuzzing/37ec7b55c7ba014cced204c5f9989d2d0eb9ff6d b/signer/core/testdata/fuzzing/37ec7b55c7ba014cced204c5f9989d2d0eb9ff6d new file mode 100644 index 000000000000..c63ed41f9c41 --- /dev/null +++ b/signer/core/testdata/fuzzing/37ec7b55c7ba014cced204c5f9989d2d0eb9ff6d @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":257 + } +} diff --git a/signer/core/testdata/fuzzing/582fa92154b784daa1faa293b695fa388fe34bf1 b/signer/core/testdata/fuzzing/582fa92154b784daa1faa293b695fa388fe34bf1 new file mode 100644 index 000000000000..9bc43938d53c --- /dev/null +++ b/signer/core/testdata/fuzzing/582fa92154b784daa1faa293b695fa388fe34bf1 @@ -0,0 +1 @@ +{"domain":{"version":"0","chainId":""}} \ No newline at end of file diff --git a/signer/core/testdata/fuzzing/ab57cb2b2b5ce614efe13a47bc73814580f2cce8 b/signer/core/testdata/fuzzing/ab57cb2b2b5ce614efe13a47bc73814580f2cce8 new file mode 100644 index 000000000000..fe27de916cdc --- /dev/null +++ b/signer/core/testdata/fuzzing/ab57cb2b2b5ce614efe13a47bc73814580f2cce8 @@ -0,0 +1,54 @@ +{ "types": { "":[ { + "name": "name", + "type":"string" }, + { + "name":"version", + "type": "string" }, { + "name": "chaiI", + "type":"uint256 . ad nowretig omeedifere" }, { + "ae": "eifinC", + "ty":"dess" + } + ], + "Person":[ + { + "name":"name", + "type": "string" + }, { + "name":"tes", "type":"it8" + }, + { "name":"t", "tye":"uit8" + }, + { + "a":"ale", + "type": "ress" + } + ], + "Mail": [ + { + "name":"from", "type":"Person" }, + { + "name": "to", "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, "primaryType": "Mail", + "domain": { +"name":"theMail", "version": "1", + "chainId": "1", + "verifyingntract": "0xCcccCCCcCCCCCCCcCCcCCCcCcccccC" + }, + "message": { "from": { + "name": "Cow", + "test": "3", + "est2":5.0, + "llt": "0xcD2a3938E13D947E0bE734DfDD86" }, "to": { "name": "Bob", + "ts":"", + "tet2": 5, + "allet": "0bBBBBbbBBbbbbBbbBbbbbBBBbB" + }, + "contents": "Hello, Bob!" } +} \ No newline at end of file diff --git a/signer/core/testdata/fuzzing/e4303e23ca34fbbc43164a232b2caa7a3af2bf8d b/signer/core/testdata/fuzzing/e4303e23ca34fbbc43164a232b2caa7a3af2bf8d new file mode 100644 index 000000000000..c5e14b39ed35 --- /dev/null +++ b/signer/core/testdata/fuzzing/e4303e23ca34fbbc43164a232b2caa7a3af2bf8d @@ -0,0 +1,64 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "int" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Mail" + }, + { + "name": "s", + "type": "Person" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "l", + "version": "1", + "chainId": "", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "": "" + } +} diff --git a/signer/core/testdata/fuzzing/f658340af009dd4a35abe645a00a7b732bc30921 b/signer/core/testdata/fuzzing/f658340af009dd4a35abe645a00a7b732bc30921 new file mode 100644 index 000000000000..c4841cb07bab --- /dev/null +++ b/signer/core/testdata/fuzzing/f658340af009dd4a35abe645a00a7b732bc30921 @@ -0,0 +1 @@ +{"types":{"0":[{}]}} \ No newline at end of file diff --git a/signer/core/types.go b/signer/core/types.go index 128055774858..f147f06cd1ae 100644 --- a/signer/core/types.go +++ b/signer/core/types.go @@ -1,58 +1,32 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// GNU Lesser General Public License for more details. // -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package core import ( "encoding/json" "fmt" - "strings" - "math/big" + "strings" - "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" ) -type Accounts []Account - -func (as Accounts) String() string { - var output []string - for _, a := range as { - output = append(output, a.String()) - } - return strings.Join(output, "\n") -} - -type Account struct { - Typ string `json:"type"` - URL accounts.URL `json:"url"` - Address common.Address `json:"address"` -} - -func (a Account) String() string { - s, err := json.Marshal(a) - if err == nil { - return string(s) - } - return err.Error() -} - type ValidationInfo struct { Typ string `json:"type"` Message string `json:"message"` @@ -67,13 +41,13 @@ const ( INFO = "Info" ) -func (vs *ValidationMessages) crit(msg string) { +func (vs *ValidationMessages) Crit(msg string) { vs.Messages = append(vs.Messages, ValidationInfo{CRIT, msg}) } -func (vs *ValidationMessages) warn(msg string) { +func (vs *ValidationMessages) Warn(msg string) { vs.Messages = append(vs.Messages, ValidationInfo{WARN, msg}) } -func (vs *ValidationMessages) info(msg string) { +func (vs *ValidationMessages) Info(msg string) { vs.Messages = append(vs.Messages, ValidationInfo{INFO, msg}) } @@ -101,7 +75,7 @@ type SendTxArgs struct { Nonce hexutil.Uint64 `json:"nonce"` // We accept "data" and "input" for backwards-compatibility reasons. Data *hexutil.Bytes `json:"data"` - Input *hexutil.Bytes `json:"input"` + Input *hexutil.Bytes `json:"input,omitempty"` } func (args SendTxArgs) String() string { diff --git a/signer/core/uiapi.go b/signer/core/uiapi.go new file mode 100644 index 000000000000..7c2d233f89c6 --- /dev/null +++ b/signer/core/uiapi.go @@ -0,0 +1,200 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "math/big" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" +) + +// SignerUIAPI implements methods Clef provides for a UI to query, in the bidirectional communication +// channel. +// This API is considered secure, since a request can only +// ever arrive from the UI -- and the UI is capable of approving any action, thus we can consider these +// requests pre-approved. +// NB: It's very important that these methods are not ever exposed on the external service +// registry. +type UIServerAPI struct { + extApi *SignerAPI + am *accounts.Manager +} + +// NewUIServerAPI creates a new UIServerAPI +func NewUIServerAPI(extapi *SignerAPI) *UIServerAPI { + return &UIServerAPI{extapi, extapi.am} +} + +// List available accounts. As opposed to the external API definition, this method delivers +// the full Account object and not only Address. +// Example call +// {"jsonrpc":"2.0","method":"clef_listAccounts","params":[], "id":4} +func (s *UIServerAPI) ListAccounts(ctx context.Context) ([]accounts.Account, error) { + var accs []accounts.Account + for _, wallet := range s.am.Wallets() { + accs = append(accs, wallet.Accounts()...) + } + return accs, nil +} + +// rawWallet is a JSON representation of an accounts.Wallet interface, with its +// data contents extracted into plain fields. +type rawWallet struct { + URL string `json:"url"` + Status string `json:"status"` + Failure string `json:"failure,omitempty"` + Accounts []accounts.Account `json:"accounts,omitempty"` +} + +// ListWallets will return a list of wallets that clef manages +// Example call +// {"jsonrpc":"2.0","method":"clef_listWallets","params":[], "id":5} +func (s *UIServerAPI) ListWallets() []rawWallet { + wallets := make([]rawWallet, 0) // return [] instead of nil if empty + for _, wallet := range s.am.Wallets() { + status, failure := wallet.Status() + + raw := rawWallet{ + URL: wallet.URL().String(), + Status: status, + Accounts: wallet.Accounts(), + } + if failure != nil { + raw.Failure = failure.Error() + } + wallets = append(wallets, raw) + } + return wallets +} + +// DeriveAccount requests a HD wallet to derive a new account, optionally pinning +// it for later reuse. +// Example call +// {"jsonrpc":"2.0","method":"clef_deriveAccount","params":["ledger://","m/44'/60'/0'", false], "id":6} +func (s *UIServerAPI) DeriveAccount(url string, path string, pin *bool) (accounts.Account, error) { + wallet, err := s.am.Wallet(url) + if err != nil { + return accounts.Account{}, err + } + derivPath, err := accounts.ParseDerivationPath(path) + if err != nil { + return accounts.Account{}, err + } + if pin == nil { + pin = new(bool) + } + return wallet.Derive(derivPath, *pin) +} + +// fetchKeystore retrives the encrypted keystore from the account manager. +func fetchKeystore(am *accounts.Manager) *keystore.KeyStore { + return am.Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) +} + +// ImportRawKey stores the given hex encoded ECDSA key into the key directory, +// encrypting it with the passphrase. +// Example call (should fail on password too short) +// {"jsonrpc":"2.0","method":"clef_importRawKey","params":["1111111111111111111111111111111111111111111111111111111111111111","test"], "id":6} +func (s *UIServerAPI) ImportRawKey(privkey string, password string) (accounts.Account, error) { + key, err := crypto.HexToECDSA(privkey) + if err != nil { + return accounts.Account{}, err + } + if err := ValidatePasswordFormat(password); err != nil { + return accounts.Account{}, fmt.Errorf("password requirements not met: %v", err) + } + // No error + return fetchKeystore(s.am).ImportECDSA(key, password) +} + +// OpenWallet initiates a hardware wallet opening procedure, establishing a USB +// connection and attempting to authenticate via the provided passphrase. Note, +// the method may return an extra challenge requiring a second open (e.g. the +// Trezor PIN matrix challenge). +// Example +// {"jsonrpc":"2.0","method":"clef_openWallet","params":["ledger://",""], "id":6} +func (s *UIServerAPI) OpenWallet(url string, passphrase *string) error { + wallet, err := s.am.Wallet(url) + if err != nil { + return err + } + pass := "" + if passphrase != nil { + pass = *passphrase + } + return wallet.Open(pass) +} + +// ChainId returns the chainid in use for Eip-155 replay protection +// Example call +// {"jsonrpc":"2.0","method":"clef_chainId","params":[], "id":8} +func (s *UIServerAPI) ChainId() math.HexOrDecimal64 { + return (math.HexOrDecimal64)(s.extApi.chainID.Uint64()) +} + +// SetChainId sets the chain id to use when signing transactions. +// Example call to set Ropsten: +// {"jsonrpc":"2.0","method":"clef_setChainId","params":["3"], "id":8} +func (s *UIServerAPI) SetChainId(id math.HexOrDecimal64) math.HexOrDecimal64 { + s.extApi.chainID = new(big.Int).SetUint64(uint64(id)) + return s.ChainId() +} + +// Export returns encrypted private key associated with the given address in web3 keystore format. +// Example +// {"jsonrpc":"2.0","method":"clef_export","params":["0x19e7e376e7c213b7e7e7e46cc70a5dd086daff2a"], "id":4} +func (s *UIServerAPI) Export(ctx context.Context, addr common.Address) (json.RawMessage, error) { + // Look up the wallet containing the requested signer + wallet, err := s.am.Find(accounts.Account{Address: addr}) + if err != nil { + return nil, err + } + if wallet.URL().Scheme != keystore.KeyStoreScheme { + return nil, fmt.Errorf("Account is not a keystore-account") + } + return ioutil.ReadFile(wallet.URL().Path) +} + +// Import tries to import the given keyJSON in the local keystore. The keyJSON data is expected to be +// in web3 keystore format. It will decrypt the keyJSON with the given passphrase and on successful +// decryption it will encrypt the key with the given newPassphrase and store it in the keystore. +// Example (the address in question has privkey `11...11`): +// {"jsonrpc":"2.0","method":"clef_import","params":[{"address":"19e7e376e7c213b7e7e7e46cc70a5dd086daff2a","crypto":{"cipher":"aes-128-ctr","ciphertext":"33e4cd3756091d037862bb7295e9552424a391a6e003272180a455ca2a9fb332","cipherparams":{"iv":"b54b263e8f89c42bb219b6279fba5cce"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"e4ca94644fd30569c1b1afbbc851729953c92637b7fe4bb9840bbb31ffbc64a5"},"mac":"f4092a445c2b21c0ef34f17c9cd0d873702b2869ec5df4439a0c2505823217e7"},"id":"216c7eac-e8c1-49af-a215-fa0036f29141","version":3},"test","yaddayadda"], "id":4} +func (api *UIServerAPI) Import(ctx context.Context, keyJSON json.RawMessage, oldPassphrase, newPassphrase string) (accounts.Account, error) { + be := api.am.Backends(keystore.KeyStoreType) + + if len(be) == 0 { + return accounts.Account{}, errors.New("password based accounts not supported") + } + if err := ValidatePasswordFormat(newPassphrase); err != nil { + return accounts.Account{}, fmt.Errorf("password requirements not met: %v", err) + } + return be[0].(*keystore.KeyStore).Import(keyJSON, oldPassphrase, newPassphrase) +} + +// Other methods to be added, not yet implemented are: +// - Ruleset interaction: add rules, attest rulefiles +// - Store metadata about accounts, e.g. naming of accounts diff --git a/signer/core/validation.go b/signer/core/validation.go index 7c3ec4274142..af858862ef4a 100644 --- a/signer/core/validation.go +++ b/signer/core/validation.go @@ -1,162 +1,27 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// GNU Lesser General Public License for more details. // -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package core import ( - "bytes" "errors" - "fmt" - "math/big" "regexp" - - "github.com/ethereum/go-ethereum/common" ) -// The validation package contains validation checks for transactions -// - ABI-data validation -// - Transaction semantics validation -// The package provides warnings for typical pitfalls - -type Validator struct { - db *AbiDb -} - -func NewValidator(db *AbiDb) *Validator { - return &Validator{db} -} -func testSelector(selector string, data []byte) (*decodedCallData, error) { - if selector == "" { - return nil, fmt.Errorf("selector not found") - } - abiData, err := MethodSelectorToAbi(selector) - if err != nil { - return nil, err - } - info, err := parseCallData(data, string(abiData)) - if err != nil { - return nil, err - } - return info, nil - -} - -// validateCallData checks if the ABI-data + methodselector (if given) can be parsed and seems to match -func (v *Validator) validateCallData(msgs *ValidationMessages, data []byte, methodSelector *string) { - if len(data) == 0 { - return - } - if len(data) < 4 { - msgs.warn("Tx contains data which is not valid ABI") - return - } - if arglen := len(data) - 4; arglen%32 != 0 { - msgs.warn(fmt.Sprintf("Not ABI-encoded data; length should be a multiple of 32 (was %d)", arglen)) - } - var ( - info *decodedCallData - err error - ) - // Check the provided one - if methodSelector != nil { - info, err = testSelector(*methodSelector, data) - if err != nil { - msgs.warn(fmt.Sprintf("Tx contains data, but provided ABI signature could not be matched: %v", err)) - } else { - msgs.info(info.String()) - //Successfull match. add to db if not there already (ignore errors there) - v.db.AddSignature(*methodSelector, data[:4]) - } - return - } - // Check the db - selector, err := v.db.LookupMethodSelector(data[:4]) - if err != nil { - msgs.warn(fmt.Sprintf("Tx contains data, but the ABI signature could not be found: %v", err)) - return - } - info, err = testSelector(selector, data) - if err != nil { - msgs.warn(fmt.Sprintf("Tx contains data, but provided ABI signature could not be matched: %v", err)) - } else { - msgs.info(info.String()) - } -} - -// validateSemantics checks if the transactions 'makes sense', and generate warnings for a couple of typical scenarios -func (v *Validator) validate(msgs *ValidationMessages, txargs *SendTxArgs, methodSelector *string) error { - // Prevent accidental erroneous usage of both 'input' and 'data' - if txargs.Data != nil && txargs.Input != nil && !bytes.Equal(*txargs.Data, *txargs.Input) { - // This is a showstopper - return errors.New(`Ambiguous request: both "data" and "input" are set and are not identical`) - } - var ( - data []byte - ) - // Place data on 'data', and nil 'input' - if txargs.Input != nil { - txargs.Data = txargs.Input - txargs.Input = nil - } - if txargs.Data != nil { - data = *txargs.Data - } - - if txargs.To == nil { - //Contract creation should contain sufficient data to deploy a contract - // A typical error is omitting sender due to some quirk in the javascript call - // e.g. https://github.com/ethereum/go-ethereum/issues/16106 - if len(data) == 0 { - if txargs.Value.ToInt().Cmp(big.NewInt(0)) > 0 { - // Sending ether into black hole - return errors.New("Tx will create contract with value but empty code!") - } - // No value submitted at least - msgs.crit("Tx will create contract with empty code!") - } else if len(data) < 40 { //Arbitrary limit - msgs.warn(fmt.Sprintf("Tx will will create contract, but payload is suspiciously small (%d b)", len(data))) - } - // methodSelector should be nil for contract creation - if methodSelector != nil { - msgs.warn("Tx will create contract, but method selector supplied; indicating intent to call a method.") - } - - } else { - if !txargs.To.ValidChecksum() { - msgs.warn("Invalid checksum on to-address") - } - // Normal transaction - if bytes.Equal(txargs.To.Address().Bytes(), common.Address{}.Bytes()) { - // Sending to 0 - msgs.crit("Tx destination is the zero address!") - } - // Validate calldata - v.validateCallData(msgs, data, methodSelector) - } - return nil -} - -// ValidateTransaction does a number of checks on the supplied transaction, and returns either a list of warnings, -// or an error, indicating that the transaction should be immediately rejected -func (v *Validator) ValidateTransaction(txArgs *SendTxArgs, methodSelector *string) (*ValidationMessages, error) { - msgs := &ValidationMessages{} - return msgs, v.validate(msgs, txArgs, methodSelector) -} - -var Printable7BitAscii = regexp.MustCompile("^[A-Za-z0-9!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ]+$") +var printable7BitAscii = regexp.MustCompile("^[A-Za-z0-9!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ]+$") // ValidatePasswordFormat returns an error if the password is too short, or consists of characters // outside the range of the printable 7bit ascii set @@ -164,7 +29,7 @@ func ValidatePasswordFormat(password string) error { if len(password) < 10 { return errors.New("password too short (<10 characters)") } - if !Printable7BitAscii.MatchString(password) { + if !printable7BitAscii.MatchString(password) { return errors.New("password contains invalid characters - only 7bit printable ascii allowed") } return nil diff --git a/signer/core/validation_test.go b/signer/core/validation_test.go index 155b25e92c6c..7105691d29c0 100644 --- a/signer/core/validation_test.go +++ b/signer/core/validation_test.go @@ -1,142 +1,22 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// GNU Lesser General Public License for more details. // -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package core -import ( - "fmt" - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" -) - -func hexAddr(a string) common.Address { return common.BytesToAddress(common.FromHex(a)) } -func mixAddr(a string) (*common.MixedcaseAddress, error) { - return common.NewMixedcaseAddressFromString(a) -} -func toHexBig(h string) hexutil.Big { - b := big.NewInt(0).SetBytes(common.FromHex(h)) - return hexutil.Big(*b) -} -func toHexUint(h string) hexutil.Uint64 { - b := big.NewInt(0).SetBytes(common.FromHex(h)) - return hexutil.Uint64(b.Uint64()) -} -func dummyTxArgs(t txtestcase) *SendTxArgs { - to, _ := mixAddr(t.to) - from, _ := mixAddr(t.from) - n := toHexUint(t.n) - gas := toHexUint(t.g) - gasPrice := toHexBig(t.gp) - value := toHexBig(t.value) - var ( - data, input *hexutil.Bytes - ) - if t.d != "" { - a := hexutil.Bytes(common.FromHex(t.d)) - data = &a - } - if t.i != "" { - a := hexutil.Bytes(common.FromHex(t.i)) - input = &a - - } - return &SendTxArgs{ - From: *from, - To: to, - Value: value, - Nonce: n, - GasPrice: gasPrice, - Gas: gas, - Data: data, - Input: input, - } -} - -type txtestcase struct { - from, to, n, g, gp, value, d, i string - expectErr bool - numMessages int -} - -func TestValidator(t *testing.T) { - var ( - // use empty db, there are other tests for the abi-specific stuff - db, _ = NewEmptyAbiDB() - v = NewValidator(db) - ) - testcases := []txtestcase{ - // Invalid to checksum - {from: "000000000000000000000000000000000000dead", to: "000000000000000000000000000000000000dead", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, - // valid 0x000000000000000000000000000000000000dEaD - {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 0}, - // conflicting input and data - {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", i: "0x02", expectErr: true}, - // Data can't be parsed - {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x0102", numMessages: 1}, - // Data (on Input) can't be parsed - {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", i: "0x0102", numMessages: 1}, - // Send to 0 - {from: "000000000000000000000000000000000000dead", to: "0x0000000000000000000000000000000000000000", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, - // Create empty contract (no value) - {from: "000000000000000000000000000000000000dead", to: "", - n: "0x01", g: "0x20", gp: "0x40", value: "0x00", numMessages: 1}, - // Create empty contract (with value) - {from: "000000000000000000000000000000000000dead", to: "", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", expectErr: true}, - // Small payload for create - {from: "000000000000000000000000000000000000dead", to: "", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", numMessages: 1}, - } - for i, test := range testcases { - msgs, err := v.ValidateTransaction(dummyTxArgs(test), nil) - if err == nil && test.expectErr { - t.Errorf("Test %d, expected error", i) - for _, msg := range msgs.Messages { - fmt.Printf("* %s: %s\n", msg.Typ, msg.Message) - } - } - if err != nil && !test.expectErr { - t.Errorf("Test %d, unexpected error: %v", i, err) - } - if err == nil { - got := len(msgs.Messages) - if got != test.numMessages { - for _, msg := range msgs.Messages { - fmt.Printf("* %s: %s\n", msg.Typ, msg.Message) - } - t.Errorf("Test %d, expected %d messages, got %d", i, test.numMessages, got) - } else { - //Debug printout, remove later - for _, msg := range msgs.Messages { - fmt.Printf("* [%d] %s: %s\n", i, msg.Typ, msg.Message) - } - fmt.Println() - } - } - } -} +import "testing" func TestPasswordValidation(t *testing.T) { testcases := []struct { diff --git a/signer/fourbyte/4byte.go b/signer/fourbyte/4byte.go new file mode 100644 index 000000000000..9ec51047385f --- /dev/null +++ b/signer/fourbyte/4byte.go @@ -0,0 +1,271 @@ +// Code generated by go-bindata. DO NOT EDIT. +// sources: +// 4byte.json (5.505MB) + +package fourbyte + +import ( + "bytes" + "compress/gzip" + "crypto/sha256" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("read %q: %v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo + digest [sha256.Size]byte +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (fi bindataFileInfo) Name() string { + return fi.name +} +func (fi bindataFileInfo) Size() int64 { + return fi.size +} +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} +func (fi bindataFileInfo) IsDir() bool { + return false +} +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var __4byteJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xbd\x49\x73\x23\xb9\xf1\x37\xfc\x5d\xe6\xd4\x6f\xc4\x1c\x0a\xa8\xdd\x37\x92\xa2\xba\xe5\xd1\x42\x8b\xec\xee\xb1\x1d\xff\x60\x60\x49\x90\x65\x15\x0b\x74\x2d\x52\x73\xde\x2f\xff\x04\x12\x40\x6d\xa2\x7a\xc6\x3e\x8c\xda\x04\x6a\x03\x12\xb9\xfe\x32\xf3\xff\xff\x25\xb0\xff\x23\xbf\xfc\xed\x17\x26\x84\xee\xaa\x76\x5f\x54\x4a\xef\x6b\xdd\xb2\x16\xf6\x6d\x51\xc1\xa7\xae\xa8\x5a\x1a\x27\xff\xdf\x2f\xbf\xfa\xe9\xf4\x97\xbf\xfd\x52\xb3\x3f\x74\xbd\xe7\xac\x64\x95\x80\x4f\x5c\xeb\x72\x34\x41\xfc\xf2\xb7\x5f\x0e\xdd\xe9\xf7\x7f\xad\xfe\xf5\x69\xf8\x39\x0c\x7f\xf9\xdb\x2f\x27\xd6\x8a\xe3\x4e\xbf\x40\xf5\x54\x4b\xa8\x97\x97\x85\x3c\x15\xd5\xfe\x25\x8a\xfe\xe3\x9f\xf4\xef\xff\x1b\x5d\x93\xff\xf2\xb7\x5f\x7e\xff\xfd\xf7\x7d\x57\xd5\x20\xf4\xa1\x2a\xfe\x00\xb9\x67\x92\x9d\x5b\xa8\x3f\x35\x6d\x5d\x54\x87\xd1\x6c\x66\x1e\xac\xb5\xdc\x9f\x8a\xba\xd6\xb5\xbf\xe3\xaf\xe6\x6f\x48\x87\x89\x89\x7b\x95\xa3\xfb\xd2\xc9\x44\xff\x37\x89\xdc\x9f\xd1\x75\xf0\xcb\xdf\x7e\x91\x45\x73\x2e\xd9\x65\xcf\xca\x52\xbf\x5d\xbd\xf2\xda\x23\xb3\xe0\x97\xbf\xfd\x22\x74\x25\x3b\xd1\xee\x59\xd7\xea\x8f\xae\x1c\x5d\x62\x16\x9a\xd5\x2d\x28\x26\xda\xfd\x0b\xc0\xf9\x13\xbf\xb4\xd0\x90\x61\x0a\x33\x77\x6d\x6b\x80\x7d\xd3\xd6\xc0\x4e\x76\xc2\xaf\xf8\xdf\xd1\x2c\xb3\xc1\xe7\xa2\x69\x75\xb9\x7f\x65\xe5\x2b\x7c\xb8\x30\x3c\xf1\x7b\xe4\x77\x66\xf7\xf6\x25\x4c\xae\x6d\x8d\x88\x7e\xf9\xdb\x2f\x0a\x9a\xb6\x78\x65\xe5\xfe\xc8\xce\xe7\xcb\xfc\x93\x46\x93\xd3\x5f\xfe\xf6\x4b\x09\x95\xdc\xcb\xce\xec\xd9\xcf\x16\x7c\xfc\x3e\xd2\xec\xe8\xa9\x6b\x44\x09\xfb\x16\x98\x38\x7e\xba\x72\x41\x36\x9a\xcf\x7f\xf9\xdb\x2f\xaf\x05\xe3\x25\xec\xcf\x75\x51\xb5\x1f\x3c\x68\x74\x85\xd9\xd2\x73\x09\xf2\x00\x7b\xd5\xb5\x5d\x3d\x5f\x9c\xf9\x23\x40\xda\xd3\x02\x4d\xb3\x17\x5a\xe8\xaa\x6b\xf7\xac\x64\xf5\xe9\xfd\x49\x51\xb1\xd9\xf3\x23\xd4\xf5\x65\xdf\xea\x93\xae\xeb\x19\xc1\x24\xd1\xaf\xd3\xa3\xa3\x32\x73\xb6\xe0\xbf\x5d\x51\x83\x34\x7b\x2a\x74\xf5\xea\xe8\xfc\xd7\x29\xb9\x67\x79\x62\xe8\xa3\x35\x67\xc9\xcf\xc0\x57\x9d\xcd\x63\xc0\x91\xda\x8b\x43\xcd\x5a\xf0\xdb\x7a\xf3\x8f\x6f\xef\x36\x95\x50\x95\x99\xf5\xbb\x67\x6d\xd1\x9d\x7e\xf7\x47\x97\x44\x71\x60\x9f\xd4\xb2\xf2\xae\x52\x20\x5a\x90\xfd\x60\x6c\x69\xf0\x66\xfd\x6d\xbf\x5b\x2f\x1e\xf6\xdb\xdd\xe2\xb7\xb5\x1f\xa5\x01\xa3\xe6\x8b\xbe\xb0\xb2\xc5\x43\xbf\x28\xcb\xa7\x33\xd4\xac\x2d\x74\xd5\x4f\x4a\x52\x66\x68\xe9\x00\xed\x57\xb3\x63\xfd\xcf\x40\x42\xbb\x7e\xe2\x65\xd1\xbe\x2c\x75\xd3\xfc\xa3\x83\xa6\xfd\xc4\xa4\xac\xa1\xf1\xf4\x4d\xd3\x34\x34\xd4\xc5\x0a\xa1\xab\xb6\x66\x62\xb8\x03\x63\x38\x52\x17\xe2\xd8\x42\xd3\xbe\xbc\xf4\x8b\xff\xf1\x7a\x51\x41\xa4\xe1\x5f\x7f\xd7\xc7\xaa\xd1\xd5\x6b\x51\x96\xe0\x6f\x18\x25\x82\x28\xbf\x12\x37\x35\x3b\xe8\xaa\xf1\x63\x31\x8d\x95\xa1\x8c\x5a\xf3\x95\x2e\xfa\x8f\x8b\x59\x8c\x7c\x6f\xa5\x59\x59\x88\x23\x2b\x2a\x5c\x87\x7e\x98\x2b\x9e\xe2\xb7\x9f\x4e\x97\x87\xae\x29\xc4\xbd\x16\x2f\xbb\xe2\xd4\x3f\x33\x25\xa1\x32\x24\x7a\x57\x15\x6d\x61\x58\x95\xfb\xfa\xab\x0c\xc7\xfc\x1d\x11\x54\x1a\x13\x6e\x96\xff\x5e\x1f\xd6\x3f\x5a\xa8\xe4\x96\x95\x73\x86\x9e\x26\x79\x64\x5e\xb0\xab\x4a\x2d\x5e\xa0\xee\x9f\x9b\x48\x48\x2d\xb7\x33\xa7\x69\x0b\x65\x09\xf5\xca\x70\xfb\x12\xef\x40\x92\x5f\xfd\x9b\x4c\xf7\x23\x8b\x25\x8d\x71\x21\xba\x4a\x86\xfe\x76\x99\xca\xa4\xc2\xdd\x64\xd5\x01\xee\x84\xbe\x2d\xaa\xa2\x39\xce\x5e\x26\x8f\x48\x62\x78\xd5\x6e\xfd\xfc\xb0\xdd\x2f\x1e\x6f\xf6\xab\xa7\xc7\x9b\xbb\xdd\xdd\xd3\xe3\xd6\xdf\x29\x4f\xa2\xc4\x48\x85\x45\x27\x0c\x15\xad\x6a\x60\x86\x1e\xfd\xe7\xff\xd9\xf2\xcc\x1e\x98\x05\x21\x47\x96\xf7\x02\x9b\x5a\xff\x07\x44\x4f\x5e\x63\x1a\xb9\x72\x61\x2e\xf0\x7b\xde\x8a\xf6\x28\x6b\xf6\x86\xbb\xda\x84\xb3\xef\x61\x11\x4b\x0d\x07\xe3\xcc\x90\xf0\x5d\x25\xe1\xc7\x9f\xb0\x7d\x26\x88\x32\xf7\x65\x52\x9e\x59\xdd\x36\x96\xa1\x3b\x2e\xf4\x93\xcb\xa4\x48\xcc\x6e\xf1\xee\xb2\x6f\x8f\xb0\x47\xae\xd0\x4c\x05\x24\x4f\x12\x69\x76\xba\x81\xf6\x4e\xe8\x6d\xcb\xea\x16\x09\x6d\x7a\x27\x9e\xa7\xd4\x08\x81\x87\xa2\x6a\x8b\xea\xb0\x9a\x9d\x29\x0e\x61\x6c\x86\xe1\xc7\xd9\xb0\xa8\xa5\x21\x1a\x3f\x26\x08\x65\xe6\xdd\x77\x4f\xbb\xc5\xfd\x7e\xf7\xf4\xdb\xfa\xb1\xd9\x6f\xbf\x6e\x36\xf7\xff\xec\xa7\x24\xb1\x08\x47\xcb\xf6\xed\x71\xbd\x9b\x53\xb4\x9f\xca\xe2\x0c\x90\x1b\xaa\xae\x92\xcf\xf0\x5f\x73\xf6\xcd\x0b\x8f\x1f\x29\x19\xc4\xe6\xb4\x8a\x92\x15\x27\x56\xb5\x2b\x73\x62\xc5\x88\x1e\xdc\x3c\x08\xa8\x34\x6c\x4a\x15\xaf\xf0\xa5\xab\x64\x0d\x72\x77\xd4\x5d\xc3\xaa\x9e\x93\x01\xcd\xfc\xf2\xdc\xb3\x4a\x36\xf7\xc5\xa9\x68\x37\x50\x2f\x8b\x77\x37\xa3\x0a\x35\x0d\x64\x03\xf7\xcb\xad\x2e\xe5\xfe\xf3\xfa\x71\xfd\xbc\xb8\xdf\x93\xfe\x76\x89\x65\xe6\x67\xa8\x64\x51\x1d\x96\xd0\x36\x4b\xa7\x2d\xf9\x19\xa9\x62\x38\xa3\x86\x86\x95\xb0\xa9\x8b\x61\x4c\x05\x12\xe5\x8c\xd4\x8b\xa2\x96\xb5\x3e\x7f\xb0\x48\x2a\x25\x4e\x64\x88\x02\x5e\xe1\x11\x0e\xcf\xf0\xdf\x9f\xea\x24\x03\xf7\xb3\xb7\x20\x46\x3d\x30\xb7\x78\x84\xb7\x8d\x2e\xcb\xa9\xb0\xb9\x4e\x6e\x24\x00\x99\xe7\x96\x65\x2f\x6b\x76\x38\x40\x3d\xa3\x6e\x37\x8f\x84\x10\x64\x6e\x9e\xfd\x78\xcf\x2f\x09\x89\x05\x37\x8b\xf8\xf5\x2c\x59\x8b\xec\x65\x71\x80\xaa\x5d\x1a\x25\xf4\x32\x65\xf1\x84\x46\x09\x98\x53\xca\x5e\x59\x51\x1a\x6e\x74\x5b\x1e\xfc\x7d\xa8\xcc\x03\x73\x9f\xe5\xe3\x72\xff\x65\xf1\x7c\xb3\x5f\x2d\x36\x7e\x2c\x0c\x73\x1e\xe0\x0a\x17\x7f\xc0\x46\xeb\x72\x67\x76\xcc\x1e\xa9\xc8\xcf\x49\x25\x6a\x75\x67\x10\x5d\xb9\xc0\xa7\xf6\x97\x4b\x16\x9b\xcb\x25\x94\xf7\x45\xd3\x7e\xfa\xe9\x92\x84\xc0\x23\xf3\x8e\x45\xb3\xfe\x51\xcc\x85\x14\x89\x54\x8e\xc7\xe6\x00\xed\x33\x34\xba\xab\x05\x34\x77\x95\xd2\xb3\x69\x31\xcd\x69\x64\x69\x70\x0b\xa5\xf2\x87\x6f\x61\x27\xcd\x27\x73\x48\x09\x1e\x45\x10\x5d\x5b\xbc\xc2\x93\x52\x85\x80\xda\xcf\x76\xd3\x92\x24\xe5\xdc\x3e\x7a\x73\xb7\x07\x59\xb4\xfb\x30\xf2\x83\x69\x28\x93\xd8\x0e\x6e\x8f\xba\x2b\xe5\x67\xa8\x8c\x78\x86\x9b\x8a\xf5\x73\xd2\x10\x12\xab\xbc\xbe\x42\xdd\x3e\x40\xbb\xd3\xeb\xf6\x78\x5d\xd9\x23\xa9\x90\xa8\x44\x6c\x9e\xef\x1e\xd6\xfd\x2d\x80\x08\x65\x1f\xb3\x03\x76\x7a\x64\x27\xb8\xd5\xf5\xf5\xcf\xca\x38\xc1\x73\x78\x3e\xf7\x9f\x90\xf1\x04\xdf\xf2\xa5\x28\x4b\x64\xb4\x33\xae\x44\xf2\x40\x25\x4e\x85\xd8\xb6\xac\xed\x9a\x7b\x7d\xe8\xaf\xce\x73\x9e\x1a\x62\xdd\x77\x48\x6a\xf7\xa3\xdd\xf9\xf7\xff\xcd\x85\x98\x57\x86\x48\xce\xa2\xc4\x2e\x5b\x15\xac\xba\xb6\x00\x27\x68\x56\x86\x40\xfb\x5b\x8b\x3c\x45\xa1\x0f\x12\xe0\xb4\xd1\xe7\x19\xfd\xb3\x48\xc5\x86\xb8\x04\x5e\xfb\x08\x6f\xcf\xf0\x5a\x34\x46\xf7\xf1\x6c\xdd\xfd\xf5\xf3\x59\x80\xcc\xd7\xb3\xc7\x07\x56\x1f\x8a\x6a\x53\xc3\xb6\x38\x54\x20\x9d\x76\xff\x3f\x89\x38\xc2\x38\x11\xd2\xd2\xd4\xa2\x59\x76\x75\x05\x75\xcf\x4c\x06\x5d\x81\x30\x9e\xe7\x66\xd9\xbf\xed\xa0\x69\x6f\x0a\x43\xeb\xbc\x43\x35\xed\x83\xc7\xb9\xeb\x38\x89\x22\x43\x85\xeb\xf6\x08\x75\x05\x3f\xfa\xb5\xe1\x44\x28\xd4\x0c\x3b\x56\x1a\x61\x62\xce\xad\xd5\x7d\xae\xea\x0d\x84\x87\xca\x92\x19\xab\xe5\x9e\x97\x1d\xec\x55\x51\x37\xc3\xed\x58\x0a\xe6\x9c\x37\xc5\xa1\xfa\x5e\xb4\xd5\x88\xc2\x39\x63\x59\xde\xaf\xb2\x5c\x5e\x66\xbb\xc0\x45\x92\x33\x4b\x1d\x9f\x8d\xea\xd9\x76\x12\x9a\x27\x35\xa3\x3b\xa1\xe2\xd4\x88\xd0\x37\xf1\x54\xad\x6a\xfd\x26\x0d\x53\xbe\x65\x45\x69\x4c\x02\x37\x47\xa6\x5c\xb9\x63\x7c\x57\xbd\x42\xd3\x9e\xa0\x6a\x17\x75\xcd\x2e\xfd\x0c\x9e\x46\x66\xb5\x6f\x6b\x80\x7b\xfd\x3a\x5c\xc9\x21\x73\xef\xb0\xd5\xaa\x7d\x63\x35\xac\x7f\x80\x78\x06\xa1\x6b\x79\x0f\xd5\xa1\x3d\xfa\xa9\x20\x03\x42\xad\x5c\x78\x2d\x74\xe7\xf6\xac\xff\x5a\x80\x84\xe3\x30\xab\xdb\x42\x14\x67\xd6\xc2\x67\xe6\xc4\xb8\xd3\x13\xe6\x7f\xdc\x95\x2a\x88\xd2\xbc\x67\x42\x5d\xd9\x3e\xb0\xe6\xe5\x83\x63\xac\xa2\x14\xdd\x02\xeb\x1f\xec\x74\x2e\x07\xb6\xad\x32\x49\x08\x52\xfc\x49\xbf\xc2\x86\x89\x17\x76\x80\x9e\x9a\x27\x82\x45\xe5\x44\x20\xf1\x77\x35\x6b\xf5\x9c\x2d\xa9\x9c\x8b\xc0\x92\xe5\x9e\xd5\xbc\x68\x9b\xbd\x13\x84\x7b\x7d\x1e\x11\xc9\x40\xa2\x34\x20\x80\xba\xf4\xf2\xe9\xf1\xeb\x76\x9f\xec\x6f\x16\xff\xf4\x5a\x21\x0d\x42\x42\x50\x2f\xa9\x24\xae\xc6\x98\x68\xb3\x7e\x4e\x98\x39\x66\x87\x82\x60\x89\x06\x59\x51\x1d\xee\x5a\x38\xf9\x1b\x11\x9a\xa0\x26\x75\xda\xe3\x81\xd7\x75\x3f\x20\x43\xcf\x63\x1e\x9f\xbe\xe9\x16\x9a\xe5\x65\x5d\xb5\x45\x3b\x23\x37\x4a\x13\xe0\xee\x31\x37\x70\xd6\x4d\xd1\x3e\x76\xfd\xed\x69\x9a\xa2\x09\x51\x75\xa7\x85\x7c\x2d\x1a\xa8\xdd\x1c\xbf\x30\x34\x0c\x33\x40\x2d\xea\x7e\xbb\xea\x7f\x93\x40\x73\x6f\xec\x35\xcf\x20\xa0\x78\x05\x39\x3f\x48\xef\x18\xc3\x3b\x67\x00\x8d\x62\x4a\xcd\xaa\x7f\x59\xfc\xfd\x66\xf7\x73\xcb\x91\x46\x4e\xa2\x1d\xa0\x5d\xe9\xd3\x99\x55\x97\x45\x59\x6a\x61\x6d\xb7\xe9\x27\xa7\x69\x96\x99\x9d\x31\xcc\xdd\x6a\xc2\x5f\x74\x29\x47\x8c\xe6\xea\x91\xa7\x19\xcf\x71\x31\x7a\x76\xa3\xdf\x5d\xe1\x66\xe6\x31\x89\x14\x4a\x95\xa7\xd5\x7a\xbb\x5d\x7a\x85\x92\xe6\x69\x82\x42\x50\xa0\x65\xf2\x54\xa1\x26\xe1\x07\x19\x25\x48\x30\x96\x31\xac\x8a\xb6\xf8\x03\x2a\x6f\xbd\x8c\xfe\x64\xbf\xce\xd8\xf1\x94\x2d\x53\x46\x69\x66\xb4\xcc\xa2\x2a\xda\x2d\xcc\x95\x4b\xca\x22\x4e\x0c\x65\x3c\x16\x15\xf4\x8f\x8e\x85\x70\x67\x6d\x57\x88\x17\x68\xed\x82\x34\xb3\x4b\x39\x00\x9e\x91\xae\x52\xb5\xfe\x03\xe6\x56\x8c\x9b\x25\x08\xcb\xad\x8e\x52\x0b\xf8\xc0\xa7\x31\xdc\x53\x64\x11\xea\x1a\xad\x7e\x3a\x43\x65\x28\xd5\xbf\x94\x80\x24\x4c\xec\x99\x6b\xeb\xae\x69\x01\xbe\xb1\xae\x44\xf5\x62\xca\x0c\xa9\x4c\x45\x2e\xad\xcc\x17\x65\x27\xe1\xd6\xb0\x62\x67\x71\xf9\xbb\x49\x91\x2a\xb3\xf4\x2b\x34\xe9\x36\x50\x17\xda\x2b\xd3\x14\x02\x86\xd6\x63\x5b\xb3\xaa\x51\x50\x5b\x8f\x5f\xd7\x5e\x57\x63\x29\x90\x90\x58\xcf\xd3\x8f\x81\xaf\xf6\xf7\x22\x32\x35\x5f\x7f\xbf\x32\xdf\x63\x2c\x00\xdd\xb5\x9f\xa6\x3b\xa4\x48\x2c\xd8\xa0\x7d\xd9\x9b\xe8\xf9\x57\x19\x25\xcc\x6c\x0a\xb3\x74\x0c\xd2\xd2\xaa\x7f\x90\x92\x41\x6a\xb6\x79\xcf\xce\xe7\xda\xf0\xee\x9f\x4a\xbe\x30\x48\x23\xe5\x94\x9a\xdb\x5a\x57\xc6\xbe\xfe\xd4\x0f\x65\xa8\x78\x5a\xa3\x7a\xa7\x67\x36\xa5\x9b\x45\x02\x20\x76\x3b\xca\xf2\xbb\x2e\x5f\xa6\xb4\x11\x92\x9c\x31\xb3\x07\x7b\xbf\x88\x4c\xbe\x1a\x2a\x7f\x7f\xee\x67\xd7\xb1\x08\x0d\xa7\xd3\xe5\x6e\xf5\xe4\xdf\x88\x52\xce\xed\xb3\x2a\xb9\x29\x59\xab\x74\x7d\x7a\x60\x85\x79\xeb\x91\x4d\x12\xd2\x38\x47\x29\xfb\xaa\x5b\xb0\x32\xa2\x1f\x49\x89\x8c\xbd\x3b\xc6\x28\x59\xc6\x5e\xd6\x6a\xaa\xc8\xfc\xda\xbb\x94\xde\xf3\x9e\x30\x0c\xc3\x34\x46\x4f\x54\x55\x9c\x3a\x7c\xfa\x96\x95\xf0\xcc\x8a\xa6\x7f\x7e\x18\x66\xd6\x9d\x54\xb3\xb7\xa7\xb3\xff\x35\x8a\x62\x82\x1b\xc3\xbb\xa2\x94\x77\x55\x0b\x75\xc5\xca\x2d\x2b\xed\x51\x20\x34\xfb\x90\x05\x8e\xdd\x7d\x61\x94\xf0\x38\xb5\xf4\xff\x45\xcb\x12\xea\x6d\xcb\x5e\xde\x6d\xb3\x9f\x9c\xc7\xde\x2d\xf5\xa5\x38\x1c\xa1\x69\x97\x85\x94\xbd\x83\x24\x8c\xb8\x75\xf8\x18\x5d\xad\x66\x6f\xb7\x5d\x25\x77\xc0\xc4\x11\xea\xd9\x3e\x46\x2a\x46\xe6\xbd\xaf\xad\x0d\x8b\x14\xda\x4c\x9e\xea\xe9\x38\x8c\xc3\x4c\xc4\xc8\x48\x9b\xf6\x19\x0e\x86\x2f\xb2\x91\xba\x36\xa6\xf9\x30\x8e\x72\x5c\xcf\x6f\xcf\xff\x1c\x79\x9c\xc2\x38\xb7\x36\x97\x93\xa6\xd6\xcf\x02\x72\xd1\xef\x64\xcc\x22\xb4\x99\x8b\xc6\xf0\xf3\x37\x73\x0a\x36\x5d\x2d\x8e\x6c\xd8\x86\x58\x00\x37\x47\x7b\x59\x17\xd5\xcb\x1f\x63\x8f\x55\x98\x04\x71\x2e\xd0\x45\xb3\xdd\xad\x9f\xe7\x0e\xb5\x09\x7d\x27\x01\x4f\xd0\x95\x70\x79\xd0\x55\xd3\x42\x7d\x27\x9b\x0f\x16\x3b\xa1\x11\x35\x8b\xb9\xd1\x6f\x50\xd3\xdf\xfb\x87\xd1\x38\xc8\xad\x03\xeb\x7b\xf1\xa1\x26\xfa\xee\x5e\x2c\x8f\xd1\x76\xae\x46\xfe\x32\x3f\x18\x09\x34\x25\x39\xda\x99\x0f\xac\x62\x07\x30\xcc\xe6\x3b\x2b\x4b\x68\xa7\x3a\x4a\x98\x24\x34\x32\xa7\x61\x71\x32\xb3\xdf\x89\xdd\xe9\x63\xd3\x20\xe6\x62\xa4\x5d\x7c\xdd\xde\xdc\x55\x13\x06\x13\xa6\x52\x46\xa9\x75\xee\x7c\xad\x8a\xff\x76\x60\xe8\xdf\x4d\xb9\x7e\xd3\x2c\x94\x68\xdd\x9e\xd8\x0f\x63\x02\x74\xfd\x91\xc8\xd2\x34\x74\xde\x0a\xa3\xef\xb8\xb3\x3a\x5e\x10\xa7\xf5\x84\x79\x4c\xa9\x79\x2f\x38\x41\x7d\x80\x4a\x5c\xbe\x3b\xe3\x82\x95\x33\x42\xcd\xe3\x0c\xa8\x5d\x6d\xeb\xa4\x45\xa5\x6d\xb6\x80\x79\x9a\xf8\x6f\xd8\x69\xa3\xe5\xa2\x59\x5f\xe3\x27\xaf\x59\x5d\xfd\x29\x7b\xca\x99\x4c\xcc\x56\x3f\x3f\x7d\x7d\xbc\xd9\xee\x7f\x5b\x6f\x76\xfe\xa3\x58\x28\x31\x4c\xf2\x19\x5a\xf4\x54\xfa\x9f\x63\x1e\x78\xe3\x59\x77\x95\x5c\x57\xce\xef\x34\x39\x3a\x2c\x49\x88\xb5\xc5\x2a\xdd\x55\x02\x9e\xde\x2a\x90\xe6\x3f\x75\x73\x2c\xce\xb3\xaf\x60\xdc\xba\xd9\xda\xe2\x04\x35\xf4\xea\x59\xc8\x03\x16\xf6\x3c\x1d\xe0\xa6\xa8\x74\x3f\x94\xcb\x2c\x73\xfe\x21\x43\xa5\xb7\x60\x64\x9e\x91\xc7\x46\x03\x1e\xaf\x38\x67\x04\x9c\xc5\xf5\xac\xf5\xcc\x15\x10\x72\xc1\x43\xc3\x57\xde\x91\xd3\x84\x83\xba\xc9\x42\x2a\x34\x08\xef\x8b\x93\xb7\xc7\x43\x01\x10\x1b\x9a\xf8\x72\xbf\x9a\xda\x53\x1f\x7b\x6e\xfc\x9b\x49\x9e\xa2\x9e\xd6\x9f\xf7\xbf\x64\x42\x1a\xed\x33\x0c\xc6\x26\x47\xd5\xae\x4a\xf6\xc6\x99\x78\x41\xb3\x6f\x46\x47\x90\xcb\xd8\x9c\xb1\xdb\xa2\x2c\x31\xca\x77\xdd\xc6\x08\x81\xc9\x58\xd9\x75\xda\x7c\x5b\x2f\x59\xdb\x96\x70\x0b\x33\x87\x64\xa8\x82\x54\x59\xd1\xfe\x8d\x95\x85\xbc\xea\x34\x08\x95\x0c\x71\x4d\x56\x4f\x8f\xbb\xbb\xc7\xaf\xeb\xfd\xc3\x9d\xf9\xc7\x67\xb7\x66\x51\x10\xe5\xf8\x05\xab\xfa\x72\x6e\xf5\x73\x71\x61\x65\x3f\x14\x87\x31\xb1\x5b\xfe\x9d\xd5\x75\xa1\xeb\x95\x61\xf6\x0b\xef\x6b\x1a\xe6\x25\x18\xc5\x7a\x35\x6f\x61\xac\x79\x76\x02\x2f\x8a\xd6\xbb\x89\xab\x35\x0a\xd2\x1c\xa5\xed\xca\x08\x4b\x63\xe7\xcd\x86\x95\x4a\x44\xef\x0c\x37\x9f\xec\x06\x08\x48\x00\xcb\xbb\x07\xd6\x80\x8e\x48\x3f\x83\x46\x01\xe0\xb9\x47\xf7\xad\x51\x0c\x98\x98\x58\xe9\x57\x0f\x5d\x44\x93\x08\xfd\xae\xfa\x15\x6a\x55\xea\xb7\xfe\x76\x2c\xe4\x80\x8b\xbb\xe9\x78\x59\x34\xc7\xa9\x5e\x15\x85\x54\xa8\xd0\xd9\x00\x5d\x5d\x43\xd5\x5a\x97\x84\xe5\x88\x7f\x6a\x80\x5c\xdd\xf7\x28\x14\xc2\x2a\x87\x20\x8e\x95\x2e\xf5\xe1\xb2\x3d\xb2\xde\xc8\x8e\x22\xca\x02\x1b\x13\x69\xef\x35\xab\x56\xba\x52\xc5\x61\x4a\x14\x51\x4c\xad\x26\xfb\xf9\x87\x65\xe1\xd2\xf2\xef\x29\x55\x44\x71\x42\x13\x85\x2c\xa1\xed\xea\x6a\xbd\xfb\xb2\xbc\x20\x43\xf0\x4f\x8a\x59\x24\x23\xfb\xf5\xda\xa8\x42\xf5\xda\x7a\xb5\xc7\xa7\x39\x4a\xb3\x38\x70\x96\xfb\x93\x52\x50\xa3\x03\x68\x79\x99\x1c\xbd\x7e\xaa\xca\xcc\x9b\xef\xee\xbc\xe5\x16\x65\x34\x44\x37\x52\x03\xed\x53\x7d\x60\x95\xa1\x9a\x29\x31\x64\x32\x41\xa6\xd7\x42\x63\x37\x54\x41\x8d\xe6\xa5\xbf\x45\x9e\x51\xd4\x5a\x4e\xec\xc7\x77\x28\x76\x05\xd4\xb4\x1f\x52\x41\x62\x78\x92\xb6\x1e\x31\x63\x42\xbd\xb3\x21\x66\x8b\xcf\x09\xa0\xd6\x60\xc9\x66\xd1\xb5\x47\x5d\x17\x0d\x7a\x4d\xfc\x0c\x99\xb3\xd8\xb1\x2f\xd6\x42\x3c\x5b\x7a\x91\x47\x14\x90\x7f\xa1\x36\xb3\xbf\x29\x5e\x0b\x09\x95\xec\xdf\x57\x86\x39\x2a\x0f\x5f\xd8\xeb\x2b\x54\x9f\x75\x29\xfb\x91\x08\x64\xee\xee\x0c\x87\x91\x19\x39\x7b\x47\xc9\xc3\x14\xb5\x40\xf6\x56\x8d\x54\x9b\x48\x0a\x49\x86\x73\xb3\xac\x0b\xf1\x2e\xa2\x37\xfd\xe3\x88\xf9\xdf\xff\x37\x7b\x00\x70\x86\xae\xf7\xa6\x28\xf5\x1e\x65\x80\x7f\x04\xa8\x44\x24\xa8\x1f\xe8\x0f\x5c\x23\x91\x0a\x21\x33\x53\x94\xae\x05\xb8\x88\x98\x1f\x8a\x82\x08\x43\xa5\xec\x05\x16\x65\xb9\xd1\x4d\x53\x18\x16\xe2\x9d\x8b\xe1\xff\x0d\xaf\x32\xfd\x3f\xf6\x5f\x99\x57\x9c\xf1\x9d\x67\xff\x8a\xfa\x87\x64\x41\x88\x10\x8c\xa2\x99\x31\xcb\x48\x71\x16\x04\x56\x3a\x63\x9c\xf7\x2a\xb7\x8c\x03\x12\xc7\xc8\x44\x3a\xfe\x45\x77\x83\x51\x3a\xfd\xd0\x38\x20\x09\xeb\x23\xb0\xcf\x78\x86\xbe\xb1\xb2\x1b\xc3\x3d\xe2\x20\x8f\x62\x2b\x75\x15\xd4\x35\xd4\xf7\xf0\x0a\x25\xb5\x52\xc1\x4f\x61\x21\x71\xfe\x10\x74\xa9\x14\xba\xda\xcd\xec\xe0\x38\xe0\x21\x86\xd3\x2a\x78\x5b\x94\xf0\x63\xf6\xbe\x34\xcf\x91\xe4\x78\x77\xb9\xd5\xf5\xdc\xb8\xbb\x1a\xd6\x88\xc3\x20\xb7\xce\xa2\xee\xb2\x68\x1a\x68\x67\x0f\x8c\x48\x8a\x46\xf2\x7f\x98\x78\xd9\xe8\x76\xe9\x5f\x36\x8a\xc2\x4c\x8e\xb8\xfc\x33\x2a\xd1\x3f\xb7\x04\xe3\x98\x0b\xd4\x89\xbd\xdb\x76\xd1\x3e\x19\x9b\x6a\x3a\x29\x11\x91\xa0\x5e\x3f\x34\x7c\xfd\x56\xd7\xdf\xa1\xf8\x4b\x00\x92\x38\x11\x90\xe5\x7e\x0d\x8d\x08\xdb\x14\x62\x8c\x55\x70\xd3\xd2\xd0\xba\xea\xd7\x0f\x77\xdb\xed\xdd\xd3\xe3\xfe\xf6\xe9\x79\xbf\x5d\xdc\xaf\xb7\xbb\xc5\xe7\xf5\xfd\x62\xeb\x55\xad\x38\x0d\xb3\xd8\x69\x33\x35\x6b\xe1\x4e\xe8\xf9\xad\x80\x64\x5e\x38\x5f\xb1\x17\xa7\x1b\x94\x42\x86\x8c\xb4\xc6\x8d\x81\x9d\x5e\xe9\xd2\xb3\xe4\xe9\x6d\xf3\x1c\x92\x78\xb4\x0a\x56\x3f\xb8\xea\xf4\x89\x59\x2a\xd1\x6f\xab\x74\x6d\xac\x2b\xff\xea\x8c\x5b\xfa\xbf\xd7\x07\x6b\x22\x7d\x78\x03\x1e\x51\x61\x98\xaf\x37\x35\xc7\x21\xb6\x98\x47\x11\x32\x6b\x8c\xe2\x6d\xd8\xc5\x58\x01\x4d\x3f\x98\x0a\x30\xcb\xb3\xbd\xfb\xfc\xb0\xd8\xaf\x7f\xdf\x3d\x2f\x56\x3b\xb3\xa0\xcb\xc5\x76\xdd\x4f\xca\x79\x94\x39\xfb\x7d\x51\x15\x27\xa7\x50\xf7\x9b\xc6\x79\x8a\x7e\x21\x54\x56\x9b\xb1\x15\x15\x0b\x43\x81\x68\xdb\x9b\xa7\x2f\x44\x5b\xbc\xc2\x12\x86\xe7\x8b\x30\x04\xeb\x66\x45\x25\xd1\x7c\x7e\x3f\x26\x69\x80\x2e\x66\xc9\x5a\x76\x27\xa1\x6a\x0b\x55\x0c\xfe\xe1\x18\xb2\x0c\x63\x0e\x07\x68\x31\x6a\x30\x3b\xde\xc4\xef\x04\xa8\x08\x84\x67\xc6\x0d\xd4\xaf\xde\x1d\x32\x0e\x90\xfc\x5c\x92\xc7\x2a\x22\x42\xf4\x0e\xb6\xff\x01\x9a\x90\x04\x24\x43\xff\x72\x03\xed\x6a\xf5\xc5\x86\xa5\xa2\x89\x60\x4c\x02\x22\x51\x4b\xe2\x9a\xd5\x72\x6a\xda\x8c\x95\xda\x24\x08\x09\xb5\xf1\xa9\xd3\xb9\x6b\xe1\x51\x4b\xb8\x93\xd7\x03\x2c\x49\x10\x65\x71\xe4\xdc\xf3\x9b\xcd\x48\xb6\x24\x81\x48\xd3\xac\x77\x6c\x3b\x87\xe7\x54\x1b\x4a\x48\x08\x14\x01\x25\x73\xb2\x1b\x5e\x8a\xcc\x7c\x77\x09\x11\x29\x7a\x63\x36\xec\xa2\xbb\xf6\xae\x32\x4b\xd5\x80\xbc\xce\x72\x13\x02\x1c\x4d\x87\x91\x66\x77\x0b\x60\x3d\x6c\x33\xb7\x63\x42\x45\x86\xd4\x2d\x58\xb5\x62\x65\x69\xcc\xba\x47\xfd\xd4\xbb\x20\x93\x30\x0a\xd0\x61\x7d\x0f\x8d\xd0\xc5\x07\x61\x97\x24\xcc\x43\x92\x63\xbc\xbf\x34\x87\xb7\x82\xfd\x92\x55\x2f\xf7\x85\x80\xaa\x81\x6d\x87\x38\x27\xd5\x95\xd3\xad\x89\x82\x1c\xe1\x5f\x2e\x2c\x75\x6d\xdf\x9d\x4f\x95\x24\x63\x1f\x50\x12\xc5\xa9\x55\xf9\x8f\xc5\xab\x37\x68\x92\x88\xdb\x20\xf6\x81\x9d\x60\x70\x95\x27\x91\x4c\x30\x30\xcd\xa4\xdc\x5b\xf1\xc2\xca\x0f\xc0\x19\xee\x8a\x38\x24\x18\x7b\x94\x5e\x25\x99\x07\x79\x92\x58\xa6\x28\x1f\xd1\x2d\x5b\xc2\x6d\xad\x4f\xd6\xee\x18\x88\x8c\x4c\x4c\xa6\x24\x49\xe3\x10\x06\xba\x80\xda\x1e\xb7\xd9\x7d\x53\x96\x2b\x8e\x0e\x13\xfd\x02\xf5\xdd\xe9\xfc\x91\x3e\x7e\x5d\x2b\x4b\x52\xce\xd0\x33\x79\xbb\xb3\xb8\x09\x64\xda\xa3\x50\x76\x92\x25\x69\x44\x46\xa4\xb7\xa9\xf5\x0f\x23\x0c\x67\xef\x91\x93\x1c\xa3\x17\xdb\xaf\x9b\xf5\xf3\xfe\xcb\xfa\xf9\x69\xff\xf0\xf5\x7e\x77\xb7\xb9\xbf\x5b\x3f\xfb\x7b\xe5\x21\xc5\x88\xf0\xdb\xb1\x68\xa1\x2c\x9a\x76\x51\x96\x4e\x51\xe8\xb5\xce\x24\x67\x24\x34\xe2\x6a\xd1\x1c\xa1\xfa\xa6\x0b\xcf\x7e\x13\x66\x2c\x37\xc4\xcc\xb1\x0a\xda\x95\xae\x65\x51\x31\xa3\xae\x4e\xbf\x88\x25\x80\xa1\xb2\x19\x6b\xf8\x5f\xff\xce\x6e\x2a\x22\xae\x10\xc6\x51\xc9\x47\xf8\xd1\x3e\xe8\x6a\x14\x88\x46\x42\xf3\x67\x95\x19\x2b\xd4\x68\xa1\xfa\x0c\x63\xd6\x9b\x70\xa2\x24\xe2\x21\x9d\x0d\x3c\x89\xe8\x26\x5c\x70\x8c\x27\xbc\xb9\x10\xa3\x67\x23\xd3\x65\x16\x24\x40\xf1\xd0\xd6\x46\x7d\xf8\xc0\x98\xf6\x73\x29\x43\xbf\xd0\xb9\x2e\x5e\x59\x8b\x76\xdd\xba\x92\x37\xac\x77\xcb\x27\x22\xb3\x11\x6f\xeb\x90\x43\xc7\x74\x3f\xa4\x00\x15\xd5\xbd\x84\x12\x0e\xac\x05\xd4\x65\xd0\x88\x59\x48\x09\xf2\x83\xf7\x93\x79\x02\x86\xcc\x8f\xac\xb1\x1e\x7e\x3c\xc6\x1f\x70\x00\x29\x19\x84\xbd\x56\xfd\xaa\x5b\x27\x27\xa7\x9f\x01\x21\x43\xf7\x0a\xfc\x28\xda\xa7\x57\xa8\x37\x25\xbb\xf4\x3a\x5e\xa2\x72\x22\x0d\xb5\x3c\x17\xcd\xcb\x70\x35\xa1\x8e\x29\xbe\xff\xeb\xaf\xe3\xd6\xa9\x62\x9f\xbd\x85\xb2\xfc\x0c\x15\x34\x93\x17\x98\xae\x67\x1a\x84\x12\xa5\xae\x21\xac\x7a\x05\xa5\x64\x7f\x8a\x77\xb9\xe2\x0a\x49\x03\x11\x22\x2e\x12\x0f\xd2\xf4\x14\xa5\x81\x88\x11\x38\x58\x38\x6e\xfd\x0e\x02\x94\x92\xcc\x82\x85\x6e\x17\x4f\xde\xd4\x4b\x69\x42\x06\x2c\x12\xc8\xa5\xe1\x28\xb3\x53\x91\xd2\x4c\xa5\xe6\x54\x18\x0d\xb6\xa8\x0e\xce\x8c\xf6\x83\x32\xc5\xc0\xa1\x7b\x19\xbb\xc1\xd3\x37\x0b\x29\x21\xa1\xf7\x60\x97\x12\xea\xbb\xca\x68\x66\x6c\xec\x02\xf0\x53\x73\x45\xd9\xb0\xb4\x2d\xab\xdb\x9b\x11\xd4\xd9\xcf\x12\x29\x32\x1e\x07\xf3\x1b\x21\x0f\xd3\x28\x4a\x11\xdc\x60\x38\xc4\x43\x57\xb6\xc5\xb9\x84\xbb\x16\x4e\xcd\xa7\xa9\xd1\x32\xe6\x6a\x13\x79\x99\xc6\x2c\x24\xa9\xf5\xf8\xb7\x1f\x04\x41\xd2\x84\xa4\x21\x19\x62\x74\x1e\xd8\xf1\x97\x60\x6f\x69\x1a\x85\x89\x45\xe8\x9c\x4b\xed\xa4\xb5\x1b\xca\x53\x85\xe1\xfc\x23\x6b\xf6\xd6\x13\x3c\x5f\xcb\x1c\x14\x06\x69\xbc\xd6\xee\xa1\x5b\x29\x63\x41\x8e\xba\x09\xab\xf6\x3d\x8f\x9c\x5d\xcc\x18\xc3\xf8\x5e\x83\xdc\x18\xfd\x3c\x57\x4e\x4d\xca\x29\x43\x5d\xd5\x58\xc1\xc8\x85\xd6\xcf\x2b\x1a\xf8\x07\x71\x69\xdd\xdb\x07\x04\xdd\x94\x3b\xa8\x4f\x9e\xff\xa6\x82\x58\x68\xc9\x5d\xaf\x6f\xa6\x82\x87\x28\x64\x2c\x8e\xe5\xa9\x66\xa2\x2c\xfe\x80\xcf\xac\xb9\xf6\x64\x21\x28\x42\x89\x9e\xd7\xdb\xf5\xf3\xb7\xf5\x8d\x95\x2b\x5b\xb4\x08\x36\xf7\x8b\xdd\xed\xd3\xf3\xc3\xfe\x69\xb3\x7e\x5e\x8c\xd1\x95\xa9\xcc\x02\xf4\x86\x15\x4d\xd3\xc1\xa2\x92\x46\x51\xfa\xe3\x4f\xec\x9f\x14\x62\x89\x21\x07\xfb\x62\x73\xcf\x59\x0a\x79\x18\xc7\xd6\xad\xbb\x28\xcb\xd5\xd1\xd8\x05\xd5\x01\x9a\xe5\x65\xf1\xb5\x99\x8b\xd2\x2c\x08\x02\xe9\xe0\x46\xaa\x38\x8c\x11\xab\x3f\x27\x86\x2c\x48\x12\x74\xba\x49\xad\x5a\xe7\x15\x72\x6f\x90\x11\x99\x40\xdc\xbf\xe0\xe7\x9a\xbd\xb2\x96\xd5\x77\x27\x76\x98\x3a\x63\x32\x1a\x10\x74\x4d\xe1\x5e\x6d\x75\xf9\x4e\x4f\x7b\x47\xf1\xd7\x88\x3a\xa3\x84\x67\x04\x55\xd7\xaa\x6b\x56\xac\x14\x5d\x79\x25\x6c\x9e\x51\x22\x91\xf3\x9e\x59\x0d\xd5\x2c\xf8\x90\x51\x1a\x23\xc6\xce\x70\xfe\x16\x1e\x98\xa1\xb3\x4a\x4b\x98\xdf\x23\x0e\xf0\xd3\x94\xae\xdb\xae\x82\x7d\x05\xde\xb9\x97\x85\x29\x47\xc3\xdb\x65\x69\xac\xdb\xe3\x6c\xa9\xa3\x5c\x8d\xb8\xaf\x31\x32\x56\xba\x2c\x41\xbc\xe7\x26\x59\x24\x39\xa2\xd9\x31\xe8\xf7\xa4\xd0\xc0\xbf\x81\xb2\xf5\x4a\x5c\x16\x29\x88\x2d\x60\x04\x6a\x51\x7c\x24\x0d\xb3\x98\x84\x78\x20\x5a\x6f\x02\x6f\x0b\x63\x64\x7b\x38\x5f\x16\xc7\x29\x0a\x92\x65\x77\xf1\x88\x16\x63\x35\xd8\xff\x4c\x5f\x29\x16\x36\x12\x61\x2c\xd4\x1a\xee\x56\x4f\x5e\xac\x4e\x9f\x98\x50\x11\x0a\x4c\xa4\x70\xfe\xd4\xaf\x16\xe9\xdc\x13\x47\x12\xab\xdc\x01\x6a\x1a\xf8\x7b\xa3\x2b\x04\xf4\x2c\x2a\xf9\x19\x5a\x8c\x7b\xaf\x4b\x0c\x11\x2d\x9a\xc7\xee\xc4\x67\x69\x27\x59\x92\x27\xb9\xb2\x0c\xb4\x61\xa5\x7e\xc3\x03\x53\x54\x87\xd9\xfa\x25\x9c\xa3\xd6\xd4\x02\x3b\xf9\x17\x58\x28\xc3\x3a\xca\x42\xa9\xfe\x55\x04\xa0\x69\x77\xaf\x0f\x16\x17\x29\x3d\x0a\xf5\x86\xd9\xf5\xc8\x66\xeb\x99\x86\x21\x2a\x7c\xc6\xf8\x61\x75\xd1\xe8\x4a\x1c\x67\x6f\x98\x86\x22\x37\x53\x56\xf7\x1b\xcf\x5e\xc7\x0a\x51\x96\xd1\x00\xc7\x87\x3d\x75\x90\x94\xd9\x42\x66\x49\x8e\x8e\xca\x7b\x7d\x58\x19\x11\xf7\x0c\x6f\x46\x67\xbe\xaa\xa9\x65\x99\x12\xd6\xc3\x66\xe4\xce\xfe\xa0\xf7\xff\xed\x8a\x3f\xae\x25\x32\x64\x99\x02\xe9\x02\x4a\x16\x42\x7a\x55\x4b\xc9\x58\x28\x98\x55\x80\x5f\xa1\x6e\x60\x7b\x2e\xdd\x0b\x3a\x43\x63\x6c\x19\x7a\x01\x94\xb1\x58\xd0\xc1\x7d\xbd\x66\x75\x79\xb9\xab\x84\x3e\x61\x1a\x04\xde\x1d\x03\x4a\x1f\x7c\x03\x4b\x03\xf4\xdd\x6e\x6a\xb4\xed\xfb\x5f\xad\xc7\x0b\xc5\xbc\x77\x7e\x5a\x07\xf6\xec\x72\x19\x62\xd8\xca\x9e\xae\x7b\x2d\x5e\x56\xba\x31\x7b\xf9\x45\x77\xb3\x90\x49\xc6\xa5\x24\x56\x05\x34\x66\x9c\xf5\x56\x18\x59\x3c\xf6\xfd\x67\x1c\x64\xe8\x2c\xfb\xc5\xa1\x06\x24\xca\xb1\xf2\x9a\x09\xc2\x31\xdd\x62\xf3\xb4\xdd\xa1\x01\xb1\xdd\x2d\x9e\x77\xfd\x68\x48\x89\x53\x2f\x9e\xe1\x5c\x16\xf0\x4e\x21\xfc\xf7\xff\x5d\x8b\xe3\x66\x22\xcb\x11\x34\x24\x6c\x04\x60\x77\x39\x43\x7f\x4f\x96\x21\x84\xa1\x68\xd0\xbf\xc2\xba\x66\x38\x57\x82\x0b\x44\xcd\x68\x27\xa8\xf6\xff\xed\xa0\xbe\xcc\x1d\xb6\xb8\x79\xff\x8e\x1c\xec\x32\x93\x2a\x42\x03\x1d\x53\x44\x66\x8b\x04\x81\x22\x7c\x40\x91\xce\x47\x93\x0c\x3d\x4b\xbc\xbb\x58\xc4\xcd\x3b\xd6\x3d\x25\x28\xc8\x48\x18\x7b\xf6\xa1\xcd\x36\xd6\xcf\xac\x85\x2f\x45\xd3\xea\xfa\x5d\x2a\x93\xb7\x69\x7b\x0f\x46\xa6\x8c\x88\x75\xd9\x3a\xd0\x60\xa8\xc2\x2a\x20\x83\xae\xfb\x57\xc2\x23\x49\x34\x36\x90\x33\x95\x71\x7c\x2b\xb7\xd6\x48\x9e\x08\x14\xf6\xe3\x42\xe4\x91\x3d\x57\x07\x18\x33\x3c\xa7\xd7\xe6\x41\x28\x50\xa1\xfb\x0d\x46\x3e\xd8\x3c\x80\x1c\x5f\xd6\x43\x49\x96\x46\x30\xc1\xcc\x2f\x9c\x93\x4c\xa4\x88\x61\x16\xda\xc2\x79\x46\xea\x60\x4e\x64\x86\x09\x47\x0f\x45\xc5\x7e\x14\x5e\x4c\xe5\x94\x4a\x07\x2c\x11\xba\x92\xdf\x01\x5e\xf0\xde\x77\x95\xf9\x67\x3f\x29\x54\x08\x60\x42\xae\xef\xf0\x0f\x93\xdd\xcb\xc3\x34\x40\x2e\xcd\x59\xf5\x82\x11\x9f\xfa\x74\xfd\x54\xe6\x11\x89\x89\x8b\xa8\x38\xcb\x0b\x75\x8d\xe9\xa4\x38\x25\x78\x74\x45\xad\xdf\x2a\x07\x3d\x9f\x3b\x03\xf2\x84\x84\x48\xd7\x96\x12\x77\x7a\x94\x7d\x94\xa7\x24\x0c\xc0\x82\x36\x58\xe9\x6f\x50\x8d\xfd\xda\x79\x4a\x58\x68\x93\xfa\xba\x7a\xb8\x2e\xe6\xcc\x2c\xc7\x1e\x81\x36\xe1\xcd\x07\x1f\x91\xf2\x24\xe8\x83\x89\xcf\xac\x86\xbb\x99\x85\x91\x67\x61\xe4\x1d\x64\x36\x48\x33\x03\xe6\x5f\xbf\x6f\x96\xd2\x24\x1e\xb2\xbd\x76\xc7\x5a\x77\x87\xe3\xa2\x2c\x6f\x75\xfd\xd2\xef\x59\x66\xec\x10\x7b\x54\x7e\x37\xf7\xb9\xd5\x75\xaf\x78\x7f\x70\xdf\x2c\xb3\x58\x4e\x56\x0a\x63\x78\x6f\xea\xe2\x8f\x9e\x32\xb2\x8c\x21\x13\x58\xb7\xc7\x87\x62\x88\x44\x15\xba\x72\x42\xec\xba\x2e\x90\x67\x0a\x28\xef\x33\x3c\xbe\x1b\x4d\xfb\xaf\xa9\x7a\xb9\x21\x46\xb0\x8b\xf3\xc0\x5e\xde\x07\x8d\xf3\x5c\x86\x99\x85\x83\xa2\x55\x53\x33\xd9\xbf\x2d\x23\x8a\xb9\x10\xff\xb6\x3b\x3d\xa9\xcf\xec\xc4\xcb\xa2\x3a\x6c\x58\xdd\x16\xd0\x20\xf5\x6e\xb4\x9e\x81\x23\x72\xa6\x32\x8f\x1d\xaa\xe0\x87\x3b\x98\xf3\x4d\xe3\x61\x86\xb1\x6a\xc1\xaa\x25\xdc\x16\x15\x33\x7c\x4f\x3e\x0e\x59\x7f\x7e\x5e\x1e\x26\xce\x9d\xff\x4d\xb7\xe0\xf4\x8a\xe9\x1c\xc1\x62\xf4\x31\x9c\xd8\x0f\x14\xd7\xdf\x0b\x17\x7d\x71\xe3\x40\x29\x8a\xed\xad\x83\x2a\xac\x76\xb3\x1b\xa8\x9c\xe2\x81\x6d\xa0\x5d\xb7\xc7\x2b\x36\x02\x0b\x48\x8e\x44\xbe\xbc\xbb\xb9\xb9\x7b\xfc\xbc\xbf\xf9\x6a\xad\x81\x4f\x7e\x3c\x26\x88\xaa\xbb\x2d\x56\xba\xa8\x8c\x7e\xe8\x35\x03\x3f\x21\xb7\xf9\x4d\x12\x5e\xad\x6e\x35\x56\x2c\x58\x20\x1d\x99\xb1\x56\x1c\xd7\x98\xa5\x00\xf3\xa4\x43\x46\xc2\x1c\xe9\x9c\x77\x75\xf5\x0c\x27\x56\xf4\x70\x19\x46\x12\xc1\xb8\x8f\x3f\xad\xba\x56\x2b\xd5\x2c\xcd\xbd\x46\xf0\x7d\xeb\xf3\x09\xc6\x91\x34\x7f\x75\xc6\x43\x07\x30\x36\xd2\x62\x16\x09\xfb\x33\xc7\x93\xbb\x09\x25\xb9\x8a\x50\x37\xbc\xdc\xea\xfa\x06\x4e\x5a\xd4\x4c\xcc\xfc\xc2\x8c\x52\x00\x33\x6b\xfd\xfb\xd3\x55\x84\xfb\x9f\x3c\x24\xa4\x24\x71\xc8\x21\x73\xb6\xdc\x1a\x63\xd4\xc0\x6a\x44\xfd\x3c\x86\x2e\xb5\xc5\xdd\xf3\xcd\xf3\xd3\x66\xff\x7d\x71\x7f\xbf\xde\xf5\xa3\x31\x63\xb4\xb7\x17\x96\x5a\x97\x2e\x58\x37\x79\xd5\x28\x0d\x30\x11\x4a\xea\xbb\xea\xf5\x27\x07\xce\x4f\xe7\x24\x32\x8f\xdc\xde\xac\x26\x5b\x1b\x87\x71\x9e\x8d\x41\x45\x3b\x7d\x38\xf4\x16\x1f\x8b\x33\x86\xbe\x87\x95\x56\x0a\x86\x5f\x21\x45\x05\x64\x57\x17\x67\x43\x50\x66\x5b\xb6\xdd\xf9\x5c\xfa\xd0\x33\x4b\x68\xe2\xf1\xf5\x8b\xd5\xfd\xb3\x2e\x21\x25\x34\xcc\x83\x9c\x1a\x32\x49\xe3\x8c\x04\x39\xed\x27\xa7\x89\x72\x87\xc8\x89\x94\xe9\xa7\x26\x12\x84\x43\xbb\x6e\xd8\x05\xea\xcd\x75\xf4\xac\x9b\x9d\x06\x80\x86\xc9\xd9\x9c\x93\x27\xe5\x54\x08\x3f\x28\x13\xde\x47\x42\x7d\x90\xfe\xb6\xd6\xa7\x9d\xbe\x5b\x2d\x36\x73\x80\xde\xfc\xd6\x4a\x2a\x94\x6d\x85\x6c\xf6\x62\xa4\xb0\xb1\x8c\x58\x27\x29\x9c\x8a\xd6\x7c\xed\x33\x3a\x99\xe5\x35\xf4\x3a\xcb\x40\x21\xfe\xa4\xe9\xb8\x4f\x24\x9b\x3e\x26\x53\x14\x7d\x4b\x25\x6b\xda\x1e\x33\xba\x6f\xda\xc1\xd3\xc8\xf2\x88\x63\xb2\xd3\xcf\x55\x32\xfb\xe7\xdf\xf1\x2c\x6a\xce\x18\x25\x18\x5d\x6c\x47\x0b\x80\xee\xc5\xb9\x17\xf2\xba\x70\x62\x8c\xc6\x98\xb9\xb0\xff\x19\x94\x87\x31\x91\xa3\x13\xff\x73\x5d\x80\x1a\xa5\x8a\xbb\x61\x11\x25\x49\x38\xc0\x75\x58\xd5\x5e\xfe\xd1\xe9\xd6\xdb\xf1\x7f\x0d\x82\xc2\x44\x9a\x22\xce\x54\xbf\x55\x50\x6f\xa1\x5d\xb1\x6a\xd9\xd5\xd5\x28\xb2\xcd\x64\xc8\xd0\x76\x78\x5e\xdf\xaf\x17\xdb\xf5\x7e\xb3\x7e\xbe\x7b\xba\xf1\x8e\x12\x26\x33\x5b\xe7\xa0\x62\xf3\x14\x4a\x33\x84\x3a\xdc\xf6\xad\xa8\x0e\x0e\xfb\xbc\xdd\x0c\x60\x5c\x26\xb3\x04\x71\xef\xcf\xeb\xc5\x4d\x9f\x24\xc5\x64\xc6\x51\x28\xd4\x50\x02\x6b\xe0\x9b\x73\x11\x0e\x98\x7b\x3f\x4f\x84\xb6\x32\x80\xfd\xd2\x2f\xac\x99\xd9\xf5\x0c\x58\x9c\x5b\xc1\xfa\x5a\xc0\xdb\xa2\x93\x73\x5b\x8e\x81\x08\xd0\x88\x59\xae\xd7\xab\xc5\xf6\xcb\x72\xb1\xfa\xed\xcb\xd3\xf0\x2a\x00\x2a\xb3\x7c\x7d\x62\x08\x7e\xb0\x98\x2a\xa2\x69\x34\x8b\x6c\x4f\x70\x61\x13\x3a\x56\x79\x86\x19\x24\x0e\x55\x20\xe1\x74\xc6\x30\x57\x57\xaa\xa2\x2c\x07\x97\xb6\x9f\x2e\x69\xee\x02\xc6\x8b\xb2\x5c\x41\x59\x1a\x75\xd8\x90\xde\x7e\xf7\xae\x86\x42\x7f\x8d\xc0\x14\x8a\xf5\x7d\x51\x79\x1d\x94\x07\x59\x8c\x61\xc2\xcf\xbf\xaf\xbe\xf8\xdf\x48\x4a\xa5\x4b\x9b\xed\xdf\x7c\x53\xeb\xb3\x6e\x06\x70\xe4\x94\x59\x73\x1a\xa6\x91\xa1\x9c\x6f\x50\x37\x5d\xb3\xa8\xa1\x62\x63\xce\xc8\x69\x4c\x10\xde\xf8\x0a\xad\x7e\xd0\xef\x9d\x3e\x3c\x8c\xd2\xc8\x5a\xec\x56\xe3\xb2\x89\xdd\xa8\x28\xf8\x7b\x84\x69\x10\x45\x7d\x9e\xb9\x73\x5e\xfa\x31\x91\x60\xbc\xce\xe8\x0d\xdb\xd7\x73\x10\x90\x9f\x3b\xe7\x78\x14\xa5\x98\xc5\xc8\x84\x80\x73\xfb\x00\x46\xd5\x18\x23\x22\x7f\x9d\xb8\x15\xae\x1f\x5d\x1e\x93\x18\x55\xb5\x6f\x05\x87\xdf\x57\xf3\x34\x76\x1e\xd3\x04\x05\x20\x6a\xbd\x76\x25\x1f\x58\xd5\xb1\xb2\xbc\xfc\xc9\xdb\xc5\x34\x4d\x59\x0f\x2b\x87\x72\xa6\x76\xf1\x38\x8e\xd1\x1e\xec\x05\xcd\x4d\xad\xcf\xeb\x3e\x59\x8a\xc7\x09\x63\xa9\xe3\xa0\xdb\x4b\xd5\x1e\x3d\x0b\xb5\x90\x99\xd9\xe6\xc5\x79\x86\x7a\xa3\x45\xe5\x77\xb5\x39\xbc\x23\x89\x30\x9c\x7e\x1e\x73\x8a\xa7\xdf\x05\x95\x9f\xa1\x39\xeb\x6a\xe6\xd5\xf2\xa1\x74\x9e\x64\x11\xfa\x80\x58\x51\xdf\x8c\x72\x75\xbd\x2a\xc2\x13\x9e\xa2\xb6\x6f\xb7\xe0\xe7\x00\x2d\x9e\x26\x21\x4e\x76\x69\x15\x75\xf1\x5a\x94\x70\x80\x49\x42\xd4\xf8\x4d\xd3\xc4\xe2\x23\xd7\xaf\xd6\x87\x88\xb8\x9f\xeb\x4e\x14\x9e\xe6\x12\x01\x58\x2d\xfb\x51\xbe\x96\x6b\xa1\x2b\x7d\xba\x7c\xba\x0a\x9d\xba\xe2\x08\xe0\xa9\xa2\x81\x85\x62\xde\x00\x1f\x52\xa3\x78\xc6\x52\x34\xde\xee\xaa\x16\x8c\xdd\x51\xbc\x82\x05\x7f\x4c\x88\x24\x27\x59\x2e\x07\x7f\x9d\xd0\x73\x9b\xc3\xcf\xcb\x22\x7c\xca\xcd\xf2\xe6\xcb\xf4\x06\xb9\x42\x87\x82\x61\x6a\x34\xeb\x7f\x05\x8e\xf2\xc2\x68\x14\xd6\xd5\xf2\xce\x85\x34\x5b\x61\x16\xe4\xd4\x02\xe0\xf7\xce\xcc\xf6\xf7\x62\x21\xc4\x41\xef\x13\x90\x9d\x68\x17\xad\x83\xd5\x35\x1f\xa4\xff\x4e\x57\x88\x49\xe1\x53\xcc\xc4\xab\x6e\xa1\x29\xe4\xa7\xe9\x04\x60\xa8\x03\x9d\x59\xd3\x3e\x55\x70\xd3\x67\x0e\x72\x0e\x02\xc1\x6d\x67\x76\xd9\x42\xfd\x5a\x08\xf0\x6e\x09\x3f\x43\x64\x21\x33\xbb\xf7\xe3\xcf\x60\xbf\x33\x27\x21\x17\x2c\xc5\xb7\x42\x5d\x60\xaf\x67\x76\x30\x17\xdc\x66\x6f\x79\xce\x67\x03\x4f\x73\x2a\xbd\x16\x71\xe7\x32\x8c\xb1\xc2\x84\x27\xbe\x9d\xb6\xe1\xf4\xc9\xa9\xf7\xf9\x17\x5c\x26\x2a\x12\x93\xac\xa0\xb9\x56\xde\x8d\x43\xb9\x63\x2a\x97\x10\x84\x2e\x70\x7f\xd3\xd9\xfa\x21\x5e\x14\x73\xa9\x38\x66\xb8\x16\x55\xd3\x32\x14\x21\x76\x40\x04\x34\xc4\x02\x32\x35\xbc\xea\x17\xe8\xb7\xf2\x9d\xba\x36\x72\xc0\x08\x92\x5a\x5d\xbe\x81\x76\x8a\x3c\xfd\xf5\xaa\x96\x74\x9d\xad\x09\x02\x36\xdf\xdb\x3d\xc9\x98\x4e\x2e\xb3\xdd\x4d\xa0\x79\x84\x47\x46\x82\x28\x59\x0d\xdf\x8b\xaa\x9a\x5b\x80\x82\x72\x0b\x1d\x31\x84\x74\xab\x3f\x40\x51\x8b\x30\xb4\x01\xb4\x73\x0d\x67\x56\xcc\xa2\x29\x22\xa2\x24\xb5\x05\x17\xcc\x03\x6e\xa0\x85\xfa\x54\x54\x30\x8e\x3f\x8b\x28\x8c\x9d\x4f\xbe\x65\xa5\xc5\xf9\x35\xfd\x98\x00\x65\x6b\x1d\xfc\x06\x17\x6b\x50\x5c\xa1\x7b\x11\x27\x49\xea\x9c\x69\x8f\x70\x40\x0e\xf0\xb9\xd6\x6f\xed\xf1\xd3\xe4\x5d\x63\x65\x03\x5e\x67\xf4\xd7\x4f\x74\x7f\x91\x52\xc2\x9c\x5f\xe7\x0b\xab\x66\x96\xb5\xc8\x28\xc5\xd8\xd7\x4c\x73\x9d\x38\x11\xe9\x4c\x61\x15\x19\xe7\x91\xf3\x78\x3e\x40\x09\xb0\xc1\x8a\x1a\x9d\x05\x5a\xba\x39\x79\xc0\x44\x86\xe5\x44\x5a\x6d\x58\x88\x51\xd3\xfe\x24\xe6\xe3\xaf\xcc\x32\xc8\x9c\x8f\x09\x93\x85\x57\x2e\x59\xae\xa7\xbf\x3c\xa7\x81\xb3\x40\x06\xa0\xd6\x54\xbf\x11\xb9\xc8\x30\xe2\xb4\x37\x12\xec\x16\x60\x0b\xef\x04\x84\x9b\xc9\x78\x86\xb8\x5a\x23\xbc\xdc\xb9\xb1\x1b\x72\x95\xcb\x09\x06\x31\x42\x2a\x1b\x3d\x2e\xf8\x34\x7d\x38\x27\x0c\x89\xfd\x04\xed\x51\xcb\xdd\x91\xb5\xbb\x63\xad\xdf\x9a\x91\x1e\x2c\x78\x44\xc0\x2b\xdc\x3e\x73\x84\x97\x70\xc3\x06\x88\xb2\x30\x62\x5c\xb9\xd4\xae\xea\x70\x5b\xf4\x79\xcf\x42\x90\x18\x83\xac\x25\xa6\x38\xaf\x2b\xf1\x2e\x82\x25\x44\x94\xa1\xcb\xcc\x06\xe7\x10\x56\xbf\xb9\x16\x29\x10\x82\x0b\x44\x3b\x63\x5e\xf8\xa0\x39\x3a\x20\x72\xff\x44\x25\x19\xef\x01\x3b\xb7\xba\x3e\x14\xaf\x20\x57\x47\x56\x7f\xba\xc6\xb2\x85\xe4\xb6\xa8\x8f\x95\x1d\xa8\x4d\x4f\x17\x49\x82\x85\xcb\x38\xbd\x7c\x61\x0b\xa5\x5d\x97\xb0\x02\x68\x10\xdb\xc4\xc7\xe2\x70\x80\xda\xe1\x0a\xfd\xbb\x41\x14\x25\x74\x84\xe2\xd9\xbf\x15\xed\x71\x8f\x51\x3d\x3f\x23\x03\xef\xe3\xff\xda\x0c\xa8\x3e\x01\xb9\xf2\xf9\xe3\x1b\x38\x1c\x1c\x56\x6f\xba\xff\x57\xdf\x48\x12\x42\xf1\x10\x3c\xb0\xb2\xd4\xf5\x0c\xea\x20\x49\x9a\xba\x28\xa3\x32\x96\xdc\x95\x22\x07\x92\x8a\x10\x91\x1f\x07\x73\x30\x9b\xe3\xb6\x38\x54\xac\xed\xea\x39\xe2\x47\x86\x01\xf0\xdc\x6f\xcf\x77\x80\x17\x1b\x95\x43\x87\xda\xf3\xc0\x6e\x64\x48\x59\x1a\x7b\x8c\x9b\x82\xfa\xe6\xf6\xf1\xe7\x02\x5b\x86\x71\x8a\x90\x9d\x55\xd7\xb4\xfa\x24\x74\x31\x24\xe8\xcf\x3e\x27\x54\x31\x61\xa8\xa7\xd6\x6d\x67\x98\x19\x2b\x8b\xf6\x82\x0a\xab\x7f\x7c\xc4\x53\xa4\x22\x27\xfa\x1f\x0a\x69\xe3\x82\x23\x5f\xb7\x8c\x78\x1e\xe7\xd6\x11\x4e\x90\x2b\xfa\x81\x98\x86\x08\xf0\x2e\x75\x63\xb3\xee\xfd\xef\x89\x44\xd8\xd0\xb6\x65\x07\xd8\xbd\xe9\x75\x35\x0a\x80\xcb\x58\xb2\xc0\x79\xe2\xf0\x51\x37\xd0\x88\xba\x40\xe2\x9d\x68\x07\x32\xe5\x56\xc2\xaf\x7f\xe8\xc6\xbb\xfc\x65\x0a\x39\x16\xcf\x28\x59\x25\xd1\x8b\xb7\x71\x85\x01\xfa\x09\x2a\x96\x58\x65\xab\x3b\xb1\x8a\x6c\x5b\x56\x49\x56\x5b\x02\x99\x9b\xf6\xdd\xbb\x34\x6f\x99\x05\xe0\xd3\x2d\x3e\x77\xac\x96\x05\xab\xde\x97\x89\x92\x59\xa4\xe4\x00\x8f\x9c\xe0\x5c\x65\x9e\xe4\x91\x43\x92\xda\xcd\xb6\x95\x9f\xa6\x37\xc8\x15\x8d\xa0\xaf\xf7\xf2\xd8\x9d\x2c\x80\x68\x4e\x44\x3c\x0f\xa4\xc7\x85\xb2\xca\x33\x9c\x25\x28\x5d\xc3\xba\x92\x23\xc6\x24\x39\xcb\xd0\x02\x37\xf2\xac\x2f\x2e\xb1\x6d\x75\xcd\x0e\x30\x2b\x10\x62\xe6\x22\x16\x12\x41\x10\x4f\x9b\x6d\x8f\x80\xf8\xfb\xd3\xdd\xe3\xce\x42\x23\xfa\xb9\xc0\x43\x97\x10\xb4\xa9\xf5\x49\xaf\xb4\x84\xde\xa2\x75\xa0\x46\x37\x15\x08\xf0\x08\xad\x04\x65\xbe\x19\xea\xc6\xca\x34\xeb\xc8\x2c\x2a\x1f\xd6\x96\x90\x85\x58\x5d\x63\x0b\xad\x0d\xe9\x5d\x95\xe5\x12\x20\xc2\xf4\xb3\xa2\x2a\x5a\x57\x80\xc9\xdf\x41\x45\x24\x1e\xa5\x06\xfd\xeb\x87\x58\xb1\x73\x3f\xc8\x14\xe6\xaa\x1a\x41\xc7\xea\x17\xf8\x53\xfc\xee\xec\xb9\x4a\x52\xc2\x06\xae\x73\xa3\xc5\x9d\xbc\x9a\xa0\x2a\x95\x0a\x91\x5f\xdc\x16\x5c\x57\x7f\x14\xfd\x0b\xa8\x04\x75\xf6\x33\xab\xdb\x0a\xea\xd1\xc9\x9f\x1e\x50\x08\x92\x10\xd1\x70\x4e\x80\xfd\x03\xa5\xf8\x6c\x8a\x88\x71\x11\x8e\x43\xe6\x08\x10\x92\x13\x97\x39\xb2\x2a\xd9\x69\xc7\x7e\x8c\x83\x5e\x40\xf2\x0c\x8d\xee\x43\xcd\xaa\xf6\x1b\x34\x43\x6a\xf7\x07\x21\xb7\xee\x7d\x7d\x47\xa0\x79\xe4\x12\xfc\x4a\xe5\x81\xe5\x37\x77\x8f\x86\x06\x9f\x01\xa5\xe8\x4c\xb9\x82\x90\x24\x08\xf0\x3e\x69\x59\xa8\xcb\xe7\xce\x68\xb2\xdd\x50\x78\x63\xfe\x80\x30\x4d\x30\xf3\x0f\xfd\xe1\xcf\x18\xf4\xf8\xe3\xb6\xf8\x31\xf8\xfb\xe6\x79\x2a\x10\x66\x11\x09\xfa\x38\x41\x51\x1d\x1e\xa0\x65\x92\xb5\x6c\x7a\x6a\x20\x0a\x01\xdc\xf2\x3c\x60\xe4\xc7\xa8\xc7\x58\x08\xe7\xba\x2e\x01\x51\x62\x71\xb0\x78\x01\xa6\x63\x6f\x58\xd3\x5c\xcf\x67\x84\x28\x4d\x32\x1f\x71\xc3\x28\xc2\x55\x2e\x0d\x51\x9a\xa2\x88\x62\x52\x5a\xbc\xa1\xae\x2f\x77\xf2\x81\x9d\xcf\x23\x38\xc4\x74\x45\x22\x25\x70\x01\x3d\x04\xeb\x11\x5a\xf5\x0c\xaf\x50\x75\x33\xfe\x03\x31\xb5\x7e\x6b\x54\x93\xb6\x2f\x45\x59\xae\x5f\x59\xd9\x8d\x61\x5d\xbf\x5e\x77\x68\x5c\xa5\x78\x88\x95\x40\x20\x72\xcd\xde\x6c\xb2\xd5\x74\x7d\x12\x12\x28\x6b\x8c\x35\xcd\x9b\xae\xa5\x39\x8c\xd7\x8d\x14\x7f\x32\x20\xa1\x09\x46\x13\xff\xd0\x37\xac\x28\x2f\xe3\xc8\x3d\x24\x91\x4a\x6c\x96\xcc\xa1\x2b\x59\x8d\x2e\x9d\x62\x28\x1e\x08\x09\xe3\x98\x86\xb7\x3e\x1c\x6e\x99\x68\xdf\x89\x69\x48\x78\x8e\x10\x69\xb3\xff\xe5\xd8\x28\x86\x34\x4e\x10\x82\x5f\xeb\x12\xdc\xa1\x5a\x94\x05\x6b\x7a\xb3\x11\x52\x49\xb3\x7c\xa4\x74\xdc\x9b\xff\x56\xef\x20\x2a\x90\xc5\x24\x61\xd6\x19\xb6\x75\x45\x5f\xae\x13\x4f\x16\x53\xac\x23\x83\xce\xd3\xfb\xa1\x1a\x1b\x64\x79\x68\xa3\x84\x5e\x3a\xe3\x9b\x22\xcd\xdc\x40\xa5\x4f\x45\x35\x2a\xa8\x02\x79\x9a\x21\x9a\xde\x55\xb5\x78\x66\x2f\xd0\x0f\x89\x00\x15\x67\x1b\xcb\x18\xa7\x39\x4e\x77\x91\x11\x82\x39\x0c\x82\x95\x62\xc5\x5e\x1c\x9c\x72\x36\x27\xb4\x21\x8c\xb3\x6e\xda\xcf\x5a\xcb\x39\xb4\xd0\x4f\xcb\x08\xd6\xa3\x39\x5d\xdb\xe9\x8f\xb2\xca\xfa\x7f\xf5\x37\xb1\xb5\x28\x4f\x0e\x82\xd0\x6f\x30\x93\x29\xa2\xf1\x66\xc8\x84\xa9\x21\xea\xe7\x82\x14\x56\xd4\xb6\x75\x01\xaf\xf0\x8d\x55\x45\x7b\xb9\xd5\xf5\xb5\x1c\x47\xe0\x31\x55\x4e\xb7\xb8\x6b\x30\x91\x04\xcf\xc4\x20\x27\x81\x8b\x3c\x71\xc1\xd2\x5e\x6d\x5a\x57\xf2\x7d\xed\x3f\x90\x01\x89\xdd\x41\x5f\xef\xbe\x7c\x70\xcc\x25\x8d\x73\xea\x2a\x49\xa0\xd9\x7f\x9d\xc9\xf6\x17\xa8\x20\xa6\x3e\xa8\xb3\x2c\xe4\xf2\xe2\xca\x28\x7c\x00\x8c\x77\x17\x11\x4a\x50\x03\xdb\x9e\x41\xb4\x75\x77\x7a\x84\xf6\x4d\xd7\x2f\xee\xcf\x27\x3f\x2b\x4d\xd1\x3b\xe8\x8a\x17\x2f\xda\x89\xb9\xa9\x88\x48\x7d\x8a\xcb\xe0\x46\xbf\x05\xb8\x4e\x02\x8a\xe6\x12\x71\x8a\x45\x83\x59\x49\xf3\xd4\x6c\x7f\xd2\x15\x15\x11\xe1\x8e\xea\xba\x92\xb5\xb0\x73\x29\x44\xba\x6b\x2d\x09\x2e\x2a\xb9\xd2\xa7\x53\xd1\x34\x83\xdf\x5e\x85\x04\x52\x8b\x95\xd9\xd4\xd0\x18\xab\x60\x7a\xdb\x30\x0b\x94\x55\x26\x4e\xa7\x0e\xb7\x7c\x48\x7a\x52\x21\xa4\x16\x4a\x5b\x0f\x9a\xb4\x8a\x82\x2c\x74\xe5\x11\x76\xfa\xad\x12\x75\x01\xf5\x8a\x95\x25\x67\x2e\x31\x72\x90\x74\xd3\x47\x45\xa1\xe5\x47\xdb\xc2\x9c\xf3\x3d\xc2\xb9\xb0\x66\xee\x0e\x4e\x67\x5d\x63\x91\x65\x5b\x1b\xc3\x5f\x10\x47\x61\xd6\xa3\x74\xad\xbe\xac\xad\xaa\x41\x03\x92\xf7\xd3\x72\x8a\x9e\x84\x2f\xac\x96\xfb\x41\x3f\x51\x71\x14\x8b\x91\x3b\x64\x09\xa5\xae\x0e\xcd\x4e\xff\xd4\x96\x52\x71\xa4\x50\xa9\xb0\x74\x4f\xfb\x9b\xc5\x11\xd6\x02\xd2\x67\xa8\x3e\xbf\x8b\xbe\xa8\x38\x96\xe8\x66\x94\xd0\xb4\xb5\x9e\x31\x52\x95\x50\xbb\x8e\x46\xf0\x21\x08\x0f\xc3\xac\xfd\x59\xe8\x57\x28\x89\x00\x6b\x57\xe0\x2a\x6c\xb4\x2e\x87\xf0\x8d\x4a\x92\x04\xb3\xdd\xfe\xd1\x41\x07\x16\x69\x5a\xf7\x63\x82\x21\xdd\xd6\x5d\xb5\xaa\x41\x0e\x75\x9d\x54\x4a\x22\x64\x8e\x5e\xd6\x5d\x67\xae\x2a\x0d\x43\x14\xe5\xe7\x02\x84\x51\x3b\x47\x85\x10\x54\x9a\x45\xa8\xe6\x21\x79\x4e\xe0\xe1\x7f\x2d\xec\xa5\x52\x11\x73\x5b\x6e\xc8\x0b\x83\xab\x31\x38\x95\x51\xc2\x1c\x26\xcf\x48\xbe\xeb\x8e\x5a\x95\x33\x91\xba\x1c\x42\x23\x43\xaf\x4a\x2e\xc5\x82\x8c\xd8\x22\xce\x88\x20\x2f\xc4\x48\x04\x28\x96\x72\x04\xaf\xae\xab\xd6\xc5\xc9\xfa\x11\x91\x62\xe9\x0d\xc3\xac\x1a\x09\x4c\x96\x43\x71\x25\xc5\x54\x24\xe5\x28\xe0\x74\x53\xbc\x16\xcd\x70\x57\xc1\xa2\xc4\x6b\xd1\x05\x2b\x5d\xd9\x22\xcf\xf2\xdc\x24\x29\x52\xd4\x32\x7b\x33\xb0\x9a\x15\x41\x51\x52\xda\x02\xa4\x7c\x0e\x1f\x9a\x2d\x2a\x04\x21\x3a\x48\x0a\xa1\xb7\x5a\xb5\x2b\x76\xbe\xab\xbe\x83\x57\x8d\x15\x44\x29\x8a\x5f\xd4\xfa\x6c\x49\x84\xdf\x7c\x61\x84\x31\x94\xde\xfa\xb0\xfe\xcf\x5f\x95\xc7\xb9\xd3\xfc\x1e\xd8\x8f\x3b\x73\x86\xfb\x1b\x8a\x08\x2b\x67\x32\xd5\x42\x7d\xab\xeb\x17\x24\x61\x87\x21\xe9\xe7\xb8\xc2\x9b\xc5\x2b\xdc\xe8\xb7\x0f\xe2\x01\x4a\x51\xe5\x5c\x4a\x87\x3d\x9d\x9d\x23\x95\x58\xf8\xc8\x0d\x28\xa8\x9a\x5e\xfa\x7c\xec\x05\xb5\xea\x22\x09\x82\x24\xc1\xba\x45\xff\xd1\x45\x85\xa0\x9e\xfb\x39\x7c\x9e\x04\x41\x46\x53\xe7\x99\xdb\x40\xdd\xe8\x8a\x95\x86\x5d\x5c\x5b\x60\x12\xd0\x30\x40\xb1\x54\xea\x83\x39\xef\x37\x46\xff\xbd\x96\x25\xdd\x2f\x65\x77\xad\xa6\x97\xbf\x59\x64\x35\xdf\xa7\x0a\x36\x66\xb7\x27\x45\xad\x48\x40\x95\x40\xc5\x4f\xfa\x92\x64\x30\x94\x10\x71\x53\xc2\x88\x22\x9f\x66\xaf\x60\x4c\xcd\x59\x62\x29\x09\x42\x91\x63\xac\xac\x6b\xa0\xf6\x91\xfa\xe9\xd7\x47\x51\x12\x3a\x99\x7d\x03\xaf\x50\xea\x33\xd4\x8d\x33\x58\xa6\x9f\x1e\x65\x31\xaa\xa9\x27\x61\x8b\xca\x8c\x5d\xa6\x24\x88\x93\x30\x71\xc6\x72\x77\x36\xd2\xe2\x5a\x65\xf5\xe9\xa3\x13\x92\x22\x32\xa3\xa8\x10\x7a\x86\x90\x58\x4f\xf8\x08\x36\xf1\x4e\x3d\x33\x95\xc1\x50\xea\x6f\x51\xa3\xe4\x6d\x96\x97\x2d\x6e\xf9\x38\x1c\xd2\x2f\x6e\x12\x65\x08\x18\x32\x1f\xa6\x45\x77\x1a\x09\xb9\x99\xf2\xe4\x2f\x48\xe3\xc8\x39\x17\x37\x08\x82\x5f\x8d\xe5\x81\x9f\x94\xa5\x88\x71\x5e\x2c\xef\xaf\xd2\x31\x09\x12\x2e\x10\x69\xb4\xf9\xb6\xf6\x6f\x9f\x86\xc4\xd5\x17\xac\x24\xa6\x4c\x83\x44\xb7\xf2\xf4\xf9\x29\x8b\xb0\x1c\xd0\xef\xcf\xcf\x58\x80\xad\xa7\x83\x94\x65\x93\xfa\xce\x7b\x84\xf2\xfb\xd1\x2c\x10\xc8\x61\x98\xd3\xb7\xfa\xe0\xf1\xa2\xe6\x45\x5b\xbf\xc7\xfa\x93\x20\x0f\x62\xac\x62\xf6\xfd\xee\x5f\x77\xdb\x2f\x4f\x9b\xcd\xdd\xe3\xe7\xd5\xd3\xdd\xe3\xa7\x7e\x5c\x44\x0e\x70\x88\x95\x15\x6b\xfd\xe3\xe2\x65\xcb\xf4\x63\xf3\x40\x20\x98\x12\x6b\x25\x3d\xa9\x4d\xd7\x16\xfd\x6b\xe7\xb1\xad\x0a\xdf\xbb\xc9\x8d\xd2\x87\x5e\xb3\xab\x69\x22\x24\xc8\x15\xc5\xd4\x7a\xd4\x0c\x07\x59\x43\x02\x16\x66\x6a\x9c\xa8\x7d\x27\xfb\x91\xd4\xd6\x8c\x6d\xeb\x8b\x77\xe1\x7d\x70\x70\x19\xe7\xd2\x31\xb1\x15\xab\x6d\x31\x9e\xd9\xf3\x19\xc4\xe8\x9d\x14\x28\x2c\xc7\xe5\x92\x48\xc0\x94\xb0\xb8\x63\xa3\x9e\x7c\xaf\xd9\xf9\x0c\x72\x28\x89\x7b\x1a\xbe\x9a\x27\x09\x96\xf1\x3f\xb9\x3c\xef\x41\xf5\x20\x01\xcf\x6c\x21\xcb\x23\x6b\xb6\x1d\x6f\x26\xb4\x3b\xf2\x83\x91\x80\xb3\x08\xab\x1f\x59\x76\xdf\x5f\x2e\x29\xea\x84\x37\x9b\xc7\x8f\x8b\x97\x92\x40\x88\x3c\x1d\x47\xb6\xac\x6a\x74\x57\x19\xc3\xa6\x78\x05\x0c\x00\x7d\xb0\x48\x92\x12\xdc\x78\xef\xeb\xda\xd4\x5a\x15\xd7\x71\x98\x66\x72\x14\x25\xbd\x6f\x8a\x97\x70\x9a\xad\xa7\x0c\x6d\x85\x52\xde\x5d\xbe\x36\x45\x75\x78\x06\x35\x71\xc3\xcc\xde\x5b\x72\xe5\x34\xe4\x21\xf2\x3e\x84\xdd\x48\x00\x61\x8e\x7e\x33\x9b\xc1\xf5\x02\x15\x02\x24\xe0\x9d\xfb\x75\xf6\x9a\x10\xda\x58\xa6\x31\x4a\x2a\x65\x73\x5f\x6c\x3c\x7b\xf6\xba\x90\x51\x0c\x08\xb1\x49\xd0\x7a\x2c\x4d\x54\x9a\x86\xb1\xc3\x07\x5e\x73\x69\xda\x69\x24\x00\x86\xca\xf5\x8e\x19\x55\xe2\xf7\x3f\xf5\x7b\x12\x42\x22\xe9\x51\x2b\x7d\x06\x7a\xe8\xea\xd5\x13\x42\x98\xad\xd7\x7a\x62\x3f\x8a\x53\x77\x42\x47\x3b\xe6\x6b\x7c\xee\x58\x6d\x9e\x01\x72\x5c\xf1\x90\x10\x4a\x25\x36\x9f\xc0\xd5\x5e\x57\xb5\xc6\x40\xe4\xcf\x2c\x23\x42\x68\x16\xcb\x99\x6e\x34\x88\x22\x42\x81\x62\x92\xf5\x4a\xb7\xed\x38\x85\x95\x90\x90\xf2\xd4\x79\x6f\x7e\xdf\x7d\x73\x36\xd1\xba\x92\xba\x6e\xae\x15\xf7\x25\x24\xe4\x34\x71\x2e\x4d\xab\x27\x3c\x29\xcc\x58\xb8\x56\x94\x92\x90\x28\xc9\x10\x7e\x52\x6a\x26\x07\x1b\x84\x90\x88\x29\x62\xd3\x22\x7d\x89\xc6\xbd\x7b\x96\x9f\x91\xe4\xd6\x3b\x68\xcd\x84\x75\x7b\xdc\xbd\x54\x37\x36\x73\xf5\x5a\x8d\xa2\x09\x2d\x92\x84\x8b\xd8\xb6\x4a\x68\xda\x95\x91\xb7\x63\xd1\x42\x12\xae\x90\x9f\x2f\xbb\xcb\xd7\xf3\x01\x01\xbd\xd3\xb7\x4e\x69\x10\xa0\x4a\xa1\x54\x51\x16\xe3\x5c\xc2\x7e\x02\x61\x4e\x6b\xfc\x66\xab\x7b\x5c\xa9\x6e\xec\xe7\x86\x2c\x9d\xd0\xfd\x94\x07\x93\x94\x87\xd4\x39\x5c\x77\xd0\xb4\xc5\x49\x57\x85\x8f\x12\x10\x92\x51\x5b\xaf\xd0\x95\x0e\xfc\x5e\x54\x33\xec\xa1\x9f\x17\xa5\x08\xd9\x2c\x10\x8a\xe9\xf2\x69\xfc\x58\x9c\x22\xef\xe4\xb6\xa8\x3d\xd4\xad\xd7\xee\x08\xc9\xd2\x5c\xf2\x7e\x99\xbd\x06\x33\x81\xa6\x7c\x90\x71\x4b\x48\x96\xe5\x98\xa5\x5a\x63\xcd\x07\xe7\x86\xba\xbe\x08\x19\x24\x28\x4c\xb6\x05\xbc\x80\x38\x76\x43\xb9\x04\x1c\xcb\xac\x31\xdb\xf3\x02\x5b\xc5\xa2\x9f\xa0\x58\x34\x90\xc2\xf5\x43\x9b\x33\x69\xc1\x3b\x65\x81\xbe\xa1\x99\x9e\x44\x58\x64\xd3\xbd\x31\x31\xfa\x76\x2c\x9f\x09\xcb\x00\x1b\x67\xdc\x20\xc7\x84\x33\xab\x01\x9d\x11\xb3\x15\x66\x8c\x63\xe4\xe5\x49\x74\xe5\xe0\x35\xbd\x02\x6e\x21\x84\x29\x89\x58\xb0\x23\x94\xa5\xa6\xfe\x39\x9c\xb0\x94\xcf\x9c\x27\xd3\xec\xe4\xc9\x4d\x38\xcd\x47\xb9\xd4\x2b\xdd\xd5\xcd\x9c\x4e\xb9\xa0\x40\xc6\xde\x03\x1b\xfb\xef\xcf\x90\x08\xa5\xaf\x76\xe7\x4a\x6e\x6d\x5b\xd6\xce\xcf\xa8\x80\x10\x0f\x0b\xca\xd4\x67\x10\xac\x2c\x3f\xd8\x45\x19\xa4\xc2\x5b\x12\x97\x3b\x09\xac\x7f\x92\x0c\x38\xd6\x80\xe1\xdd\xc5\xa8\xe8\x46\x30\xa2\x76\x14\xfb\xf1\x34\x47\x6d\x6e\xe4\x35\x62\xbc\x87\x57\x10\x22\x79\x8c\x6c\xa8\xff\x92\x27\xde\xb2\xa2\x9a\x15\xaa\x20\x44\x42\xca\xac\xce\xd9\x1a\x92\x2b\x17\xef\xfb\x4e\x10\x02\x01\x41\x62\xbb\x2d\xa1\x16\x23\x42\x83\x24\x42\x77\x93\x05\x88\xd9\x7a\x14\xfd\x18\x27\x99\x18\x34\x54\x87\xb5\xa8\xf5\xc9\x97\x2f\x9c\xda\xb5\x84\x06\x44\x04\x3e\x83\xe8\x08\x13\x6d\x83\x06\xb9\x44\x51\x64\xc3\xd0\x88\x6b\xfd\x40\x6a\x52\x92\x64\xd6\x76\xfc\xf0\xfc\xf5\xdf\x45\x49\xa2\x90\x2d\x99\x45\x5a\xb7\xc7\xbe\xea\xdf\x6c\x16\xcf\xf1\x8e\xaf\x7a\x96\xbf\x68\x86\x00\x7d\xe4\x7b\x97\x21\x3d\xcf\xb9\x23\x7e\x62\x18\x46\xc8\xb3\xcc\x4e\xdd\x55\x9b\x5a\x1f\xd0\xd7\xe2\xbf\x2f\xcc\x53\xa5\x7c\x78\x16\x9b\xb3\x9c\x47\x56\x0b\x0d\x73\x86\x0a\xef\x89\xfd\xd8\xe8\x7e\x51\x42\xa6\xd0\xd6\x59\x76\x35\x56\xe2\x1a\x8b\x21\x1a\x91\x0c\x6b\x25\xad\x16\x77\xcf\x93\x81\x38\xb0\x69\x8c\xab\x9a\x15\x87\xcf\x46\x5c\xae\x59\x7b\x53\x78\x47\x31\xa1\x71\xa8\xf0\x60\xb7\xc7\x1a\x9a\xa3\x2e\x25\xe9\x47\x18\xf8\xa4\x85\x07\x68\xa1\xc6\xc2\x6c\x9f\x66\xee\xd2\xc9\xfa\xc4\x32\x45\x77\xe9\xdd\x66\xf1\x4f\x0c\xe4\xf9\x5b\x25\x3c\xc3\xcc\x24\x34\xbc\x7d\x65\x05\xbb\xe7\x36\x9e\x88\xe5\xdc\x46\x7e\xf0\x77\x49\x04\x84\xa6\x54\x50\xeb\x60\xae\xc6\x09\x0c\x5e\x2a\xd1\x14\x78\x80\xfd\xa0\xaa\x03\x94\x93\x8a\x5b\x6e\x42\x46\x12\xac\xdb\x61\x4b\xc7\x61\xb1\xb0\x11\xb6\x6a\x52\xcf\xbf\xbf\x22\x43\x6b\xe7\x05\x84\x60\x2f\x34\x4e\x0c\xe5\xcc\xe8\x38\x8b\x98\xab\xb7\x34\x23\xfc\x8d\x2d\x32\xf1\x81\xd9\x4d\xb3\x34\xc2\x8a\x5e\xeb\xf6\xd8\x3c\xc0\xa6\x9e\x16\xb7\x9a\xcd\xcd\x01\xbb\x9c\x2c\x5e\xa1\x12\x13\xfd\x83\xe6\x21\x8f\xc5\x00\x1a\xf8\xfa\x7c\xb7\xee\xb5\x04\xca\x82\x0c\x43\x15\xfb\x31\x2d\xbf\xcf\xdf\x25\x94\x31\x1a\xc3\x80\xab\xd8\x8d\x5b\xd6\x5c\x05\x02\x98\x4b\x32\x3c\xa3\x77\xd6\x7a\x35\x14\xf9\xb5\x99\x25\x71\x13\xca\x89\x42\xcc\x13\xab\x6c\x25\xd0\x75\x25\x31\xcd\xa7\xa7\x75\xce\x6c\x5a\x28\x93\x78\x0b\x2c\x83\x3b\x36\xd3\x3f\x78\x3a\x07\x9b\xf3\xff\x0a\x46\xd5\x72\xe5\x79\xbd\x31\x4e\x85\x24\x01\x96\xdb\xd1\xaf\x23\xfd\xd8\x0d\xca\x84\x80\xcd\x72\xb9\x3c\x83\x2c\x6a\xe8\xd5\x12\x2a\xc1\xaa\xe0\x47\x56\x1b\xb5\x6a\x9a\xc5\x40\x28\xb0\x30\xb5\xe9\xcb\x35\x26\x69\xd7\x00\x78\x26\xde\x15\x6d\xbb\xae\x63\x52\x15\x53\x2c\x29\x09\x8d\x40\x64\xcf\x6c\x54\x06\xe8\x9c\x5a\xe3\xa8\x73\xc7\xbe\x7b\x7b\x05\x02\x17\xf4\x37\xf6\xd2\x35\xc7\x29\x17\x08\x83\x30\x45\x07\xdf\xc3\xe2\x77\xd7\xec\x67\xff\xb8\x1c\x1f\x44\x33\xc3\x95\x56\x52\xe6\xb8\x3f\xe8\x8a\xd5\xe2\x78\x31\x3b\xd2\x4c\x94\x9e\x30\x88\x23\x97\x53\x29\x01\x4e\x13\x75\xdf\xcf\x48\x43\x74\x44\xcb\xa2\x39\xdb\x30\xea\x5b\x8f\x75\x70\x53\x48\x18\xd8\x48\x8e\x51\xdd\x59\x39\x14\x14\x37\x52\x67\xe7\x18\x8e\x9f\x4c\x13\x81\x31\x59\x51\x02\xab\x67\x45\x70\x48\x48\x85\xc8\xfa\x26\x6b\xb7\x36\xc4\x3f\x6d\xd0\x45\xc2\x30\x24\x18\x0d\xb0\xb1\xaa\x7e\x74\x42\xeb\x61\x98\x0b\x8a\x8e\x36\xd6\x55\xe2\xd8\x5f\x2a\x39\x1e\xb1\x8a\x9d\xe0\x49\x5d\x75\x08\x93\x30\x04\x82\x08\xbc\x67\x73\x65\xf7\xd7\x50\x1d\x24\x8c\x02\x1b\xa5\x31\xbb\xb2\x7a\x7a\xdc\x3d\xdf\x2d\xbf\x62\x01\xb3\xaf\xdb\x1b\xff\xf8\x28\x8e\x6d\x7d\xb2\xbf\xdf\x4f\x16\x30\x8a\xad\xdc\x1f\xe3\xf9\x3f\xd7\xec\x7c\x84\x0a\xd0\xe9\xe0\x27\xc6\x84\xa2\xb6\xb3\x5a\x2c\xdb\xf1\x0d\x92\x30\xc6\xf0\xc2\x3b\x37\xf3\x10\x67\xf5\x1c\x36\x4c\xe2\xc8\x85\xfa\x58\x7b\xbc\x61\x2d\xdb\x2b\x1f\x4f\x20\x61\x92\xa6\x58\x54\x60\x53\x5f\xfe\x40\x47\xdb\x6c\x59\x53\x9a\x63\x2e\x41\x8b\xa8\xb5\xef\x47\xa8\x5c\x04\x0c\x3b\x2e\x19\x1e\x7f\x83\x95\x41\x8a\xea\xb0\x78\xdc\xf9\xbb\x66\x8c\x09\x32\xa0\x1d\xfa\xec\xce\x9f\x18\xf8\x61\x06\x21\xee\xf2\xfe\x3f\x0b\xf9\x71\x51\x88\x29\xad\xe6\x71\x88\xc0\x36\x86\x31\xa1\x5b\xc3\x32\x54\x57\xc9\x3b\xe5\xdc\xc4\x8f\xba\x7d\xc6\x8a\xe1\x3d\x35\xe6\xb1\x0c\xfb\xea\x08\xa8\x66\xa2\x2b\xf9\x56\xf7\xf9\xff\xa3\xbb\x0b\x5b\x1e\xfe\x8c\x71\xa7\x0f\x01\x1f\xc8\x78\xa7\x57\xb2\x00\x30\x3d\xe4\xcc\x8a\xfa\xad\x68\xe0\xa9\xfe\x34\x8a\xca\x93\x90\x65\x21\x16\xf6\xe7\xc0\xa6\xd8\xf8\xb1\x61\x1e\xb2\x5c\x20\x56\xda\xea\x4b\x33\xef\xf0\xf4\x81\x3c\xca\x11\xa9\x63\xa7\xde\xb0\x39\xec\xd7\x4d\x13\x2a\x40\x9c\xc1\xd9\xe1\x90\x67\xcc\x2a\x94\x51\xc6\xa5\x47\x2a\x41\xd3\x4c\x11\x0e\x7e\x52\x12\x71\xd9\x03\x88\x56\x63\xbd\x78\x86\x64\x1e\xec\xe3\x50\x72\x6b\xd9\x8a\x41\xc5\xb7\xda\x93\xdf\x18\x88\x23\x5f\xc3\xf2\xb3\x2e\xa5\xa1\xd3\x77\x79\x1b\x24\x84\x54\x84\x6e\xd6\xd7\xba\x44\x57\xe6\x28\x6a\x30\xfd\x58\x90\x11\xe6\xea\x33\x4c\xee\x25\xfd\x2d\x80\x4b\x87\xc6\x3a\xb1\x1f\x82\xd5\x72\x94\x30\x46\x42\x50\xb6\xbb\x52\x6b\x23\x70\xeb\xf6\xb8\x7d\x63\xe7\xa7\xae\x3d\x77\x3f\xcf\xd2\x21\xa1\xca\x42\x31\x18\x64\x98\x40\x3f\x45\xf8\xf4\x47\x52\x65\x91\x62\x7d\xca\x8d\x77\x18\x0c\xe5\x09\x49\xa8\x04\x45\x3d\x62\x7b\x2a\xca\x12\x9a\x91\x61\x18\x05\x10\x62\x00\xac\x69\x47\x20\x5e\x4b\x38\x83\xb3\x7e\x04\xd1\xf8\xc0\x4f\x1f\x05\xc0\x32\xa7\x08\x3e\xea\xfa\xc4\xca\x67\xad\x4f\x0f\xc5\x4c\x1e\x44\x04\x6c\xfb\xaf\xbb\xd5\x13\xbb\x46\x54\x11\xcd\x69\xe4\xdc\x3c\xdf\x50\x6e\x2f\xce\xbd\xa7\xa5\xb1\xde\xe6\x31\xe3\x8c\x28\xcf\x10\x80\x76\x62\x2f\xf0\x00\xf5\x4b\xe9\xa2\xc5\xd7\x57\x35\xa2\x22\x93\x30\x84\x91\xac\x4f\x68\x40\x3b\x9a\x09\x39\xb3\x15\x96\xb7\xba\xc4\xce\x15\x7e\x40\x46\x88\xf4\xac\x74\xfb\xa5\xab\x0e\xf5\xec\x7c\x47\x54\xa6\x88\x2d\xb3\x04\x62\xc8\x6c\xe9\x5d\x60\x1f\x18\xec\x11\x55\x39\xaa\x20\xbe\xe2\x8c\xb5\x54\xb5\x7a\x2e\x0e\x1f\xaa\x0b\xee\xd2\x90\xa6\xb6\x84\xa9\xaf\x77\xe4\x90\x0a\xd3\xc5\x0c\xa3\x18\x75\xed\xed\xfa\xf1\x66\xfd\xbc\x5f\x2e\xee\x17\x8f\x2b\xef\x72\x8f\xa2\x14\x30\x30\xe5\x6a\x49\xcd\xd5\x88\x28\x86\x10\xb9\x5b\x51\x15\x7f\xb9\x74\xb4\xbb\x34\x89\x52\x1b\x73\x99\x75\xe6\x18\x90\xfb\x24\x4a\x52\x1b\x26\x72\x73\xcc\x2e\x14\x7a\xba\xb9\x89\x0c\x5c\x7c\xa2\x92\xdf\x86\xa4\x41\x37\x9a\x13\x15\xd8\x48\x5d\x03\x66\x0b\xef\xaa\xd5\x50\x13\x94\x44\x39\x65\x01\xf7\xed\x71\x8b\xea\x30\xb5\x86\xa3\x1c\x00\x53\x0a\x5f\x0b\x78\xdb\x1f\xa0\xdd\xef\x6a\x60\x4d\xdf\x3c\x8a\x44\x2c\x8d\xe2\x70\xda\x88\x8d\xd2\x7e\x30\xb3\xe5\x9e\x70\x7f\xf7\xfd\xcf\x3c\x48\x31\x52\xe4\xcb\xd1\xda\x4c\xf6\x9f\xfa\xd1\x22\x0e\x32\xf3\x95\x03\x50\xf2\xec\xf4\x6f\xba\x78\x81\x2b\xea\x54\x24\x42\x89\x70\x3c\x47\xbe\x7b\xf8\x61\x0b\x9a\xef\xf9\xd0\x65\x91\x44\x22\x63\xa8\x51\xad\x96\x63\x3d\x21\x92\x81\x42\x24\xed\x91\xd5\x72\xc5\xce\x5f\x8a\xc3\xf1\x6b\xd3\xaf\x87\x0c\x13\xdc\xb2\x85\xaa\x47\xec\x01\x62\x85\xe7\x65\xf1\xfc\x1b\xfa\xe7\x74\x59\x42\xbd\x27\xfb\x20\xe8\x67\x24\x79\x6e\xa4\xe6\xbf\x76\xb7\xfd\x4f\x79\x8c\x84\x85\x0d\x6c\xfb\x08\x2d\x89\x54\xaa\x28\x75\x91\xc6\x11\x64\x99\x44\x4a\x90\x24\xf7\xb5\xfa\xc5\xcb\xcf\x81\x06\x24\x0e\x02\x8b\xac\xaf\xe1\x5e\x33\x89\x25\x11\xae\x9f\xb0\x38\x08\x58\x9e\x8e\x54\x23\xac\x9c\xe0\xe0\x1a\x1f\x5d\x42\xc2\x68\xd4\x48\xd5\xea\x00\x9f\xfc\x20\x8d\xb0\x80\x99\xc2\x32\x5b\x3e\x9c\xd2\xf4\xc3\x3c\x0e\x83\x01\x37\x01\xcd\xb8\x53\x18\x89\x09\xcd\x19\x71\xde\x7b\x3c\xea\xeb\xf1\x98\xe4\x43\xf4\xee\xce\xb9\x5e\x56\x1a\x94\x2a\x44\xd1\x07\xe6\xe8\xec\x6d\x49\x6c\xfd\x5d\x6f\x50\xec\xb4\x73\x56\xf4\xb7\xcc\x64\xea\x7b\xc8\xfc\x63\x9c\x38\xec\xc7\x85\x22\xb2\xc7\x03\x14\xd5\xc1\x65\xb5\x4c\x17\x3b\xcc\x32\xa4\x9a\xbd\x47\x43\x7f\x7d\xbe\xbb\xea\x4c\x8b\xa3\x3c\xe4\x2e\x15\x07\x75\x6f\xe4\xd9\x57\x40\x50\x24\x8e\x64\x88\x6d\x6b\x2a\xdd\xc2\x8f\xa2\x69\x25\x9c\xa7\x6c\x3d\x4e\xd2\x14\xa1\x32\x1c\x2a\x30\x0b\xc0\xea\x62\x06\xfa\x23\x71\x92\xe5\x88\x52\x69\xa1\x69\x1d\x71\x5a\x3c\xfc\xf7\xa2\x3d\xda\xf0\x64\x63\xff\x6c\xd9\x09\x4b\xe1\xf5\x41\xb1\x38\xe1\x21\x9a\x94\x0e\x75\xe2\xf4\xe6\x5a\x9f\xae\x6b\xf5\x71\x9a\x86\xae\x6c\x4a\xbb\x77\x95\x21\xf7\xd8\xfc\xcc\xc2\xcd\xa7\x0b\x9b\xc5\x11\x9a\xd4\xff\xed\x74\x8b\xc5\x08\xdd\xef\x39\xcb\x89\xef\xd2\xc4\x5a\x40\x0f\xea\x9f\x65\xf1\x91\x98\x91\xcc\xb6\xa7\x68\x59\x3d\xc5\x20\x91\x98\x45\xc0\xac\xe6\xae\x34\xb6\x37\x9f\xbe\x35\x03\xeb\xb0\x35\xac\xe5\xc3\x6c\xaa\x6b\xf0\x48\x12\x33\xc5\x30\x90\x66\x13\x91\xee\x7a\xbf\x54\xcc\x15\xc5\x10\x93\xcb\x35\x9e\x86\xc1\xaf\x5b\xe2\xb1\x20\x22\xb5\x59\x49\xb6\xab\xf4\xb4\x1b\xc1\x6c\x2e\x0f\xd1\xef\x75\x66\x5d\x33\xaa\x6f\x68\x06\x32\x61\xcb\x53\xfc\x28\x58\x25\x86\x1c\x01\x12\x0b\x21\x11\x13\x7f\x83\xcc\xe3\x9d\xfb\x3f\x96\x34\x08\x94\x4b\xc5\x71\xe6\xc3\x62\x50\x34\xfd\x24\x50\x71\x5f\x51\xc0\x82\x63\x56\xfe\x01\x10\xd9\x16\xb2\x07\x9f\x65\xf6\x75\xe4\xe6\x1a\x09\xb5\x18\x62\x2a\x7c\xc0\xcf\x17\x25\x09\xe9\xc4\x03\x16\xab\x90\x62\x21\x04\x81\x11\x52\x63\x26\x0d\xcd\x7d\xfd\x14\x96\x08\x27\x13\xbe\x43\xb1\x62\xe7\x19\x85\x29\x15\x62\x06\xeb\xe7\xc7\xa7\xed\x9d\x43\xc2\x93\x24\x48\x63\x1f\xc6\x73\x45\x29\x58\x7d\xd9\xab\xae\x7a\x8f\xc5\x24\x49\x90\x29\x84\x2a\x58\x6b\x67\x56\x6c\x87\x24\x01\x58\x14\xa0\x6b\xd4\x86\xc9\x0f\x93\xe2\xdf\xff\x0e\xc7\xa5\xf1\x47\xda\x79\x82\x3e\x12\xcb\x05\x0b\x73\x99\xb1\xe9\xad\x98\x9a\x03\xf9\xbc\x0a\x9b\x10\x19\x63\xf3\x49\xef\x33\x3d\x9d\x59\x71\x78\xdf\x40\xe8\x83\xb6\x6f\x53\xd2\x4d\x28\x21\x58\x97\x13\x21\x00\xf3\x7c\x7c\x33\x1c\x23\x8e\xd5\x1c\xfd\x75\x7b\xbc\x81\xd7\xa6\x1f\x0a\x6d\x32\x21\x67\x4d\x21\x46\x5a\x61\x42\x33\x9a\x0a\x7f\xcb\x80\x0e\xee\xb3\x84\xaa\xd4\xb7\xd6\x75\xce\x3c\xe7\xa6\xbb\xb5\x09\x06\x63\x39\x97\x84\xa9\x75\xcf\x1a\x4d\xdd\x43\xae\x67\xdb\x12\xca\x0c\xc9\xff\x41\x37\xed\x37\x56\x76\xa8\x99\x0d\x02\x39\x89\x22\x60\xa9\x2f\x17\x7e\x3a\xf7\xda\x5a\x12\xa5\x53\xbc\x9a\xd1\xc0\x3f\x8c\x62\x27\x71\x0c\x98\x34\xe1\x0b\x08\xf2\xd2\x30\x2a\xc4\x75\xbd\xaf\xff\x73\x1d\x9b\x92\xc4\x79\x86\xa5\x1d\xf6\xc1\x8f\x65\xd1\x0a\x5d\x54\x82\x35\xc7\xb1\xca\x91\x24\xb1\xcd\xa3\x58\xde\x3f\xad\x7e\x7b\x5e\xdc\xdc\x3d\xf9\x91\x34\x8d\x10\x37\x67\x6b\x7d\xb6\x57\xc0\x34\x49\x0a\xdc\xa5\xc1\xea\xaa\xff\xcc\x8c\x30\xeb\x70\x7e\x03\x38\xcf\x68\x36\xcb\x73\x54\x56\x0c\x6b\xea\xd7\x3c\x03\xeb\xf4\xf8\x3b\xda\x0f\xc3\x42\x66\x2a\x48\x7a\xdb\x7d\xe1\x0f\x81\x1b\x64\x99\x50\xb6\x27\xdf\xf9\xeb\x79\x66\x77\x59\x2f\x7e\xee\xa9\x8d\x71\x9b\x21\x6c\x0e\x9d\xab\x2e\x37\x02\x40\x5f\x29\x15\x44\x12\x1e\x64\x68\x2b\xad\x9a\xfe\x2d\x45\x92\x20\xec\x61\xef\x2a\xc8\x4f\x0a\xf7\x90\x44\x26\x01\x16\x34\xe1\xdd\x65\xdb\xea\x1a\x56\xba\xfe\x79\x29\x18\x92\xc8\x54\x64\xa1\xe7\xa3\xf7\xba\x6d\xbd\x02\x90\xf9\x09\x20\x46\xc5\xe0\x7d\xf4\x75\x7b\x06\x51\xb0\x49\xfd\x70\x92\x40\x10\x72\xe7\x81\xb1\x62\x74\xa7\x3d\xc8\x64\xfa\x50\x20\xd4\x76\x13\x46\x50\x84\x87\x48\x7c\x10\xb5\x4d\x80\xa5\xa9\x2d\x5e\xfa\xa8\x5b\x04\xe0\xb6\x2d\xcc\x7c\x46\x09\xf0\xcc\xb6\xdd\x9e\x26\x3b\xbc\xff\x60\x15\x46\x28\x0b\x05\x2b\xcb\x83\x73\xd9\xf8\xf5\x53\x2c\x20\x59\x8f\x5b\x6a\xab\x0f\x90\x5e\x29\x8d\xad\xcd\x20\xe1\xe4\xf2\xb9\x48\x1a\x66\xe0\x1b\xf2\xba\x00\xdf\xf4\xa3\xd3\x10\x42\x15\x0d\xee\xe9\x19\x19\xa7\x11\x10\xc4\x97\x9d\x2e\x3f\xfc\x2d\xe3\x80\xc4\xd4\x7d\xb8\x9c\xbf\x43\x92\xf3\x30\x75\x6a\x9b\xaf\xd2\xb4\x85\xd7\xbf\x5e\xa6\xe8\xa7\x65\x5d\x48\x9a\xf0\x18\x15\xf6\x9b\x1a\xd8\x69\xd9\xd3\x58\x9a\x06\x80\x5e\x9f\xc7\xdf\x76\xe3\x33\x9c\xa6\xb1\x42\x55\x69\x2f\x4a\xdd\xc0\x52\x6b\x5f\x98\x8c\xa4\x69\xc6\xd1\x71\xf8\xcf\x4a\x21\x78\xd3\xff\x9e\x05\xd6\x81\xd4\xea\xed\x97\x05\x8d\x93\x09\x35\xa5\x59\x26\x51\x0d\xba\x01\xc1\x78\xef\xbc\x35\x3f\xc7\xc9\x18\xbf\x69\x8e\x91\x38\xc2\xd5\x9a\xd9\x24\xcd\x78\xc6\x6d\xb3\x20\x97\xeb\x33\x11\x02\x69\xa6\xc0\x77\x06\xbb\x99\x27\xe0\x90\x34\x8f\xac\x85\x62\xe3\xbe\x37\xba\x2c\x59\x7d\x05\x6e\x95\xe6\x29\xf5\xc5\xc7\xec\x49\x46\x1d\xf1\x5d\xd2\x29\x49\x79\x20\x11\xa6\x78\xec\x5b\x0f\xde\xea\x7a\x6d\xe5\xdf\xec\x9e\x3c\xcc\x3d\x07\x7f\x28\xaa\xc2\xa8\x09\x66\xa2\x6f\x45\x4f\x52\x0e\x2a\x71\x68\xde\xf5\x8f\x73\xa9\x2d\x3e\x6d\x79\xd9\x7a\x90\xc5\x87\x87\x3e\x85\xd0\x36\x8f\x1b\x82\xd1\x9f\xd9\x09\xb6\x2d\x9c\xfb\x65\x86\xc4\xca\xfd\x1a\xb0\xc1\x51\xf1\x07\xb8\xa6\x42\x6d\x31\xec\x85\xa2\x29\xc2\x2a\x31\x36\xd9\xac\xcc\xc6\xcb\x7e\x8c\x91\x80\xf7\x5d\x9a\xbe\x5a\xb4\xc2\xa7\x09\x6a\x21\x55\x2c\xb6\xa6\x05\x36\x29\x7f\x86\x57\xa8\xdb\x8d\xb1\xad\x07\x35\x21\x55\x90\x05\x5e\x72\xa2\x97\x7a\xf2\x29\x19\xcd\x00\x31\x30\xff\xe8\x60\x14\x5f\xce\xc2\x24\xc0\xd3\xa1\x7a\x0b\x03\x0b\x77\xf7\xc3\x99\x42\x3e\xca\xa4\x1c\xb5\xf8\xc8\xa6\xb4\x93\x85\x2a\xc4\x3c\xad\xb3\xf6\x05\x56\x66\x0f\x37\x26\x2c\xd6\xec\x79\x1b\xf5\xb2\xf0\x63\xca\x7a\x0d\x85\x87\xe0\x4d\x43\x88\x59\xac\x22\xff\x5d\xbe\xf5\x8d\x9f\x31\xbd\x51\x12\x2a\xcc\xcb\x69\x8f\x45\x63\xd8\x2f\x13\x6d\x33\x89\x71\x67\x09\xb3\x95\xfa\x9e\x7e\x2c\x0b\x3d\x3e\x94\x59\x22\xc2\x04\x26\x1b\xbd\xfe\x21\x8e\xec\x00\xeb\xdd\x17\x3f\x27\x4d\x72\xf4\x11\x7d\x83\xba\xf8\x31\xca\xa9\x25\x59\xca\x12\x2c\xb6\xcd\xb9\x96\xae\x78\xc5\x2c\x3c\x96\xa5\x90\xa7\xb6\xc8\x44\x21\x8a\xea\xb0\xc5\xb6\x33\x87\xeb\x75\x36\xdf\xd1\x61\x96\x89\xc0\x56\x58\x29\x5b\x0c\x6b\xce\x46\x95\x55\x10\xb1\x1c\x20\xe2\xb5\x7c\xf9\xe0\x61\x4e\x1e\x64\x58\xb7\xa7\xef\x73\xe1\x5e\xe4\xd3\x4c\x75\xcc\x72\x2e\xa3\x21\xfd\x53\xab\x27\xb5\x81\x5a\x21\xc6\x1a\xdb\x9e\xe2\x7f\xa6\xa7\x35\x63\xd4\xd6\xea\x3b\x40\xbb\xec\x2e\x63\x34\x70\xc6\x38\x1b\x61\x05\x36\x25\xc8\xc3\xcf\xcb\x69\x93\x8c\x07\x89\x52\xae\x18\x6c\x75\xb5\x5d\x3b\xc9\x78\x12\xa1\xfd\xe8\xc0\x07\x36\xb2\x7c\x05\x71\xe6\xa6\xcb\x30\x42\x38\x39\x6b\x9a\xe2\x50\x61\xe9\xf0\xf7\xe9\x5d\xfd\x12\xc8\x44\xa1\x79\xd5\x1c\xf5\x1b\xb4\x47\xa1\xab\x99\x36\x9f\x49\x88\xb1\x4f\xe9\x00\x93\x5e\x2d\x57\xef\xe3\xe8\xf3\xb7\x50\x8c\x79\xc0\xc8\xea\x5d\xaa\x16\xc9\x80\x84\x88\x79\xaa\xba\xd3\x93\xf2\x64\x78\xd6\x7d\xc0\x2c\x53\x71\x94\x5a\x39\xf7\xbe\x72\x38\xc9\x14\xb3\xd5\xe0\x87\xc6\xdb\x1f\x00\x38\x32\xc5\x15\x92\xd3\x91\x35\xc7\x85\x6b\x22\xeb\x5e\x22\x0f\x72\x5b\xb4\x7e\x8f\xad\x8c\xb6\xd0\xb6\x45\x75\x30\x2c\xdf\x6e\xfc\x35\xc3\x34\x9b\x17\xe5\x9c\x46\x1a\xfc\x8d\x79\x86\x48\x10\x90\x45\x6b\x71\xd7\xac\x76\xdd\x14\xbf\xcf\xab\xcc\x8f\xb6\x3a\x0f\x20\xc3\x7c\x97\x65\xd1\x36\x42\xd7\x83\xee\x9a\x93\xdc\xb6\xe2\x68\xa0\x5d\x96\xfa\x50\xfb\x23\x37\xf9\xd8\x9c\xc8\x10\xa3\xf5\x4d\x77\x3a\xb9\x18\x66\x43\xfb\x5b\x48\x81\x71\x42\x5c\x72\x04\x30\x78\x66\x91\x87\x81\x2d\x16\x27\x59\xfd\x52\x69\x09\x37\xe0\xa3\x79\xd8\x4d\x76\xfa\x90\x30\x14\x08\xe4\xde\x3d\x7d\x7f\xb4\x65\x87\xf7\x9b\xe7\xbb\xde\x37\x9c\x47\x8c\xa3\xe0\x3b\xd7\xba\xd4\x3e\xab\xd9\xfc\x2c\x90\x21\xe1\xf1\x42\x13\xfc\xf6\xeb\xe3\xcf\x60\x5a\x79\x24\xb9\x2d\xfd\xd9\x9d\xe6\x47\x37\x4f\x32\x86\x12\xff\x54\x54\xa3\x84\xaf\xeb\x47\x22\x4f\x03\x8b\xa0\x6a\xa0\x35\xf2\xec\xa9\x82\x31\x2a\xe9\xdd\x64\x81\xf5\x64\x5b\x60\x27\x63\x00\xcb\x7e\x95\x52\x99\x23\x49\x7e\x5b\x6f\x77\x77\x8f\x9f\x5d\x99\x38\x3f\x9a\x45\x99\x5d\x5e\x36\x0f\x09\x1b\x5b\x87\xfa\x8a\x0e\xbe\x15\x89\x2b\x3a\xd4\xdf\x3c\x63\x16\x86\x88\x98\x1d\x23\x3b\x9f\xce\x3d\xcb\xce\x73\x12\xda\x5e\x10\xe2\x08\xb2\x2b\x61\x12\xeb\x72\xe5\xaf\xa6\x5f\x91\x27\x39\x86\x53\xa1\x3d\x6e\xa0\x1e\x59\x15\xa3\x64\x55\x92\xe7\x99\x05\x97\x7c\x2e\x35\x67\x16\xd4\xe2\x1b\x10\x4d\xbf\x20\x17\x29\x77\xb4\x83\x11\x22\x8f\x26\x75\xc3\x9c\xc4\xa9\xd5\xbf\xc4\x4b\x77\x9e\x0a\xb5\x9c\x87\x14\x95\xeb\xa1\x14\x90\x91\x7c\x8d\x53\xa6\x67\x0f\x12\xa1\x42\xe9\x59\xc1\xdb\xc8\xbe\xbc\x16\x05\xbf\x26\x49\xae\xcf\x9a\x10\x95\x88\x6d\xf9\x1a\xac\x2e\xba\xd2\xc6\x0c\x9e\xe3\xb0\x72\x49\x53\x6c\xe3\xec\x43\x10\x23\x2f\x4d\x0e\x71\x82\xbd\xa0\x55\x51\x49\xc7\xb7\xe6\xbd\x79\x48\xae\x62\x81\xf1\x89\x8a\xd5\x42\xa3\xc1\xe5\x07\x92\x48\xb8\xca\x4f\x4b\xd6\x7b\xdd\x73\x95\x05\xdc\xda\x8c\x5b\xac\xad\xfc\x01\x69\xaa\x0c\xb0\xae\x1d\xe6\x83\x5d\xcd\x18\xc8\x15\x28\xdb\x31\x10\x1a\x68\x6f\x8b\x0a\x26\x1c\x8f\x05\x01\x25\x2e\x3b\xef\x41\xcf\x36\x99\x05\x24\xf6\xed\x51\x17\xf6\xcb\xeb\xe6\x1a\x7e\x9e\x05\x51\x86\x2d\x46\xcd\xe1\x43\xa7\x3b\xb0\xd3\x34\x5a\xe5\x27\x66\x2c\x73\x20\xbc\xef\xba\x7e\x81\x1a\x1d\x5b\x57\x0f\x29\x0b\x24\x20\x6e\xa6\x70\x8a\x4f\x33\x49\x80\x61\x84\x2a\x19\x0e\x38\xa8\xd2\xa2\x64\xa7\x8f\x23\xb1\xcd\x8d\xef\xa1\xbc\xcd\xbd\x2d\xff\x3f\xa3\x8f\x9f\xca\x64\x46\xb8\xc5\xb0\x70\x2c\x6f\xd5\xfb\x7d\x19\x4d\x33\x5b\xd9\xda\xd1\xf1\xa6\x06\xdb\x14\x6b\xd9\x95\x2f\x23\x81\x78\x05\x62\xf6\xe1\xbf\x3e\xe8\x02\xe9\x9f\xa8\xa2\x6c\x30\x35\xb0\x1f\xd0\x86\xcd\xba\x8f\xcc\x5e\x9e\xaa\x34\x7e\x6f\x99\xff\x59\x8d\x08\x77\x71\x18\x05\xd8\x0e\x14\x1d\xd3\x4b\xdd\x1d\x8e\xed\x4a\x97\x3e\xdb\x8e\xb0\x88\x84\x3c\x77\x95\xbb\x6b\x5d\x96\xb3\xf6\x1f\x84\xc5\x41\x10\xd8\x48\x84\x51\x7e\xd7\xaf\x50\x5f\x48\x60\xfe\x77\x53\xb3\xb7\x74\x7a\xca\x58\x4c\x89\x74\xfe\xce\xad\x51\x68\xbc\x5d\xdd\xf4\x0a\x81\xd3\x78\x9a\xab\x8b\x3b\xdd\xfa\x38\x94\x21\x1f\x40\xfc\xcb\x0e\xcf\x97\xc3\x55\x8c\x63\x7b\x2c\x86\x50\xd9\x28\x6d\x2f\x8a\x67\x95\x28\x09\x4b\x32\x2a\xc8\x34\x80\x7e\xed\x1c\x24\x19\xc3\x0a\xed\x52\x57\x2f\x70\x19\x79\x88\x58\xc2\x38\x3a\xaf\x36\xac\x69\x40\x7e\x66\x2d\xbc\xb1\x0f\xa2\x46\x2c\x4d\x13\x1a\xa3\x16\xd2\xf1\xf5\xa8\xc7\xd5\xf4\x03\x53\x96\x61\x60\x8e\xb3\xf6\x5d\x75\x66\xc2\xb2\x20\x49\x86\x88\xbf\xb7\x1d\x66\x48\x8d\xeb\x8f\xcf\x32\x85\xe1\x48\xde\x5d\xb6\x00\xbd\xb4\x63\x99\x0c\x52\xe7\x8a\x75\x69\xdc\x1f\xdc\x67\x76\xbf\x3c\x54\x16\x11\x5f\xbc\xc2\xe2\x8d\x5d\xae\xf7\xe5\x26\x2c\x4f\x78\xee\x42\x3e\x7b\x2c\x71\xbf\xbf\x29\x1a\xf1\x5e\x55\x64\x9c\xb2\xc4\xfb\xc5\xb1\x90\x8c\xb7\x76\x19\xa7\x0a\x51\x4d\x0f\x6c\x48\xd8\x62\x3c\xcf\x10\x65\xb4\xfc\xfa\xcf\xe1\x27\x85\x25\x45\xf6\x0d\x53\x57\x64\xa7\x9b\x25\xc3\x18\xc2\x09\xf7\x70\x21\x3f\xf6\x91\x2b\x94\xc9\x30\xc7\xde\xc4\x56\xd7\x06\xe9\x83\xb0\x2e\xd5\x0f\x91\x68\x86\x78\xfc\xf4\xc4\x62\x29\x8c\xed\xc0\xc4\x0b\x54\xbe\x71\xa6\x1b\x07\x92\xe3\x89\xb8\xd7\x87\xfb\xa7\xdd\x47\x19\x57\x7f\x72\x88\x41\xa5\xb1\x73\x2a\x2e\xa1\xc1\xdc\x21\xc6\x8b\xb2\x68\x27\x2e\x3c\xa6\x64\x8c\xed\x9e\x59\xe9\x6b\xde\x9b\xcf\x7d\x60\xd5\xc5\x05\x50\xaf\x9e\x3a\x7f\x31\x70\x26\x2c\x14\x43\x0f\x6a\x0a\x0f\xe2\x94\x5b\xa7\x1c\xaa\x12\xdb\xfe\xcb\x78\x90\x2a\x97\x04\xfa\x9f\xce\x3a\xa7\xa1\x1f\x12\x89\xcd\x1e\xb0\xe2\xfe\xcf\xd2\x9c\xdd\x55\x84\xa4\xb9\x85\xeb\x1d\x0e\x25\xdc\x8f\xba\xbc\x10\x4e\x68\x8c\xc5\x8b\x51\x06\xee\xb0\xe5\xef\xf8\xd8\x72\x12\x91\xc8\x59\xd9\xb7\xbe\x34\xeb\x4c\x72\x71\x1a\xd2\xc0\xb7\xd6\x6c\x59\xdd\x0e\x5d\xe8\x87\x77\xa0\x86\x21\x3a\x10\x81\x31\x94\x55\x81\xad\xe2\xfd\x6b\x44\x79\x00\x0e\x33\x7d\x33\x36\xc0\x79\x1c\xa5\x91\xa3\xfc\xfb\xfb\x6f\x0e\x1e\x10\x4d\xdf\x31\xce\xad\x1b\xcc\x77\xd2\x05\xf9\xf4\x81\x76\xcb\x63\xa5\x84\x3b\xa8\xae\x90\xf0\x5f\x4d\x15\x9f\x20\xc7\xdc\xdd\x12\x1e\xa3\xcb\xee\xb5\x80\xb7\x87\xcb\xb8\xc2\xff\xc8\x01\xc3\xd3\x48\xa2\x89\xbf\x5b\x2f\x1e\xf6\xdb\x2f\x8b\x67\x2c\x9a\xbc\x5a\x3f\xee\x16\x9f\xbd\x21\xc0\xd3\x8c\x13\x6a\xad\x19\xa1\x8b\xea\x41\xf7\x81\x14\x9e\xc5\x14\x11\x4a\x58\xe4\x06\x5d\x68\xab\xfa\xad\x1f\x4c\x72\x45\x06\xb4\xf0\xb8\xce\xce\xf0\x67\x74\x72\x79\xc6\x02\x3e\xc6\x3b\xe1\x22\xac\xab\xd7\xa2\xd6\xd5\x50\x93\x8d\xf0\x3c\x61\x68\x99\xbc\xb1\x57\x58\xb1\x33\xed\x7f\xcf\x32\xb4\x0f\x0c\xb3\x6e\x5d\x1b\x2c\x3f\xc4\xc2\x3c\xf5\x71\x31\x5b\xca\x6b\xae\xed\xf1\x5c\x01\xe2\xa0\x5a\x68\xb0\x94\xd3\xa7\xc9\xf6\x30\xca\xb1\x3b\xa1\x6f\xa2\xbd\x28\x6a\x59\x6b\xef\x5e\xe6\x2c\xb1\xa6\x62\xa9\x9b\x71\xdb\xa6\xd9\x1e\x33\x46\x61\xdc\x91\x7e\xf0\x4f\x73\x1e\x01\xa2\xf9\x9f\x17\x77\x4f\xa3\x82\x86\x57\xe4\x15\xe7\x49\x8a\xfe\x70\x2b\x1f\xac\x23\xc1\xa6\xd2\x5c\x7f\x2a\x4f\x21\x66\xbe\x3d\xbb\x78\xc1\xa2\x92\xac\x28\x3f\xc0\x24\x71\x9e\xc5\x58\xb3\x60\xbf\x6f\x86\x23\x33\x7d\x01\x6e\x9b\x26\xbc\x9a\xd3\x72\x31\x47\x13\xe7\xcc\xc3\xc9\x7f\x46\xbe\x93\xd8\xdd\x84\x12\xb8\xb1\x1f\x6c\xdc\xe7\xdc\x8b\x77\xd7\xf3\x76\x14\xc8\xe3\x82\x86\xa9\x74\x2c\x82\xd5\xe2\x08\xf3\xfc\x11\x2e\xa2\x10\x1d\x18\xcd\x91\x79\x07\xe5\x34\x56\xc8\x45\x14\x23\x0d\xef\xd9\x28\x41\x95\x8b\x34\x4e\xdd\x9a\x35\x6d\x27\xa1\x6a\xb1\xa7\xcb\x74\xa5\x44\x1e\x87\x7d\x19\x4e\x2b\x6b\x3e\x63\x63\xb8\x76\xe0\x62\x32\xb2\xed\xd9\x64\xd1\xe8\xb7\x6a\xba\x8e\x60\x88\x0a\x23\x7d\x5d\xd5\x0e\xce\x39\x0e\x3c\x15\xce\x3b\xb6\x64\xf2\x00\xd8\xa2\xfb\xdd\xf2\x5e\x29\x71\xd3\x5f\xaf\xc2\xa1\x3e\xa3\xa3\x54\x2c\x74\x67\x3d\x22\xef\xe0\x94\x5c\x25\x49\x34\x14\x8b\xbb\xad\xf5\xe9\x83\x84\x04\x61\xcc\x6a\xc3\xd1\xf6\xe7\x5a\x0b\x68\x1a\x87\x8e\x99\xac\xa9\x20\x44\x62\x80\xe1\x61\xf1\xfb\xc4\xa9\x20\x88\xc8\x52\x77\x0e\x57\x47\x76\x3a\xbf\xf3\x8d\x0b\x22\x01\x2f\x55\x20\x8e\xdf\xb4\x51\x82\x94\xbe\xd5\xd8\x5f\xbf\x5e\x5e\xf0\x23\xae\xd3\xad\xa0\x11\xcb\x5d\x3d\x20\xa3\x3b\xee\x5d\x14\xc1\x3f\x9a\x66\x29\xe6\xbf\x99\x25\xd9\x43\x1f\xbe\x15\x94\x27\x48\x6b\x02\xa3\x4f\x37\xbe\x70\xc5\xf4\x83\xc2\xd8\x96\xe6\x64\xe7\xf3\x16\x8c\x7c\xd3\xb5\x83\xfd\x3b\x08\xae\x88\x42\x6a\x83\xaf\xb5\xae\x6c\xb7\x2d\xa8\x9f\xea\xaf\x15\x26\xd4\x4e\x4a\x8e\x10\x11\xb1\x00\x33\xcb\x85\x4d\x13\x74\x4a\x20\x09\x82\x56\xa7\xc1\x6c\xbd\x63\x92\x70\x32\x06\xba\x8e\xdf\x3d\x8e\x42\x44\xdf\x63\xbe\xf5\x53\x0d\x4f\x55\x79\x31\x9b\x87\x36\xc6\x3c\x34\x27\x62\x4e\x6d\x88\x5d\x9f\xce\xe6\x09\xcb\x71\x9b\xe6\x7f\x67\xc4\xa9\x05\x22\x89\x44\xdf\xc7\xe4\xc7\xe7\x3e\xfb\x4c\x24\x79\x84\x46\x3d\xaf\x59\x25\x7b\xf5\x62\xfa\x8c\x84\x49\xb4\x29\xc7\x1d\x07\x3e\xd8\xaf\x44\x11\x1b\xe4\x70\xe6\xc1\x73\x57\x2d\x2f\x63\x27\xe1\x54\x75\x16\xa9\xb0\xc9\x6f\xae\x53\xce\x43\x51\x02\x33\x67\x83\x79\xa5\x36\xbb\xae\x1a\x8b\x2c\x8c\xb1\x66\x89\x0d\x57\xd8\x4a\x7f\xef\xb3\x10\x44\x26\x72\x19\x4d\x1c\xea\x36\x0f\x7b\x38\x26\x22\x4f\x24\x06\x85\xff\x05\x5d\xb3\x3d\x16\x50\xca\x91\xb5\x20\x18\x91\xa9\xef\x17\x8f\x9f\xaf\xeb\xd3\x08\x42\x20\x78\xd0\xe7\xf4\x7e\x87\xe2\x70\x6c\xc1\x42\x1a\x5d\x47\x94\xd9\x5b\xf3\x90\xdb\x5c\xfa\x23\x88\x97\xcf\x1a\x4b\x63\x8e\x90\xe7\x82\x27\x21\xee\x12\xab\x6b\x76\xc1\x42\x10\x4f\x5d\xfb\xa4\x96\xba\xab\x64\x73\x73\xa9\xd8\xa9\x10\xb3\xcd\x11\xc0\x43\x57\xfe\x65\xfd\xe3\x5c\xcc\x91\x07\x42\x8a\x30\x75\x2f\xb8\x5a\x2e\x46\xde\xa6\x07\x68\x1a\x5c\x6b\xc4\xb2\x4d\xb7\x05\x62\x40\x9d\x10\x7d\x6c\x2b\x7d\xe2\x45\x05\x72\xac\x1a\x0a\x48\x48\x32\x38\xfb\xdf\xa0\xb8\x52\xf5\x8b\x08\xa5\x88\xcf\xee\xf6\x00\xe6\xde\x30\x75\xe8\x98\x51\x81\x2e\x33\x9f\x91\x31\xb0\xef\x7b\xd1\x1e\xed\x86\x4d\xee\x2b\x83\x9c\x85\xc2\xc3\xcb\x6d\xa5\x25\x43\xd3\xb3\x49\x4c\xb8\x88\x16\x4a\xf7\x9f\x74\xdf\x25\x92\x88\x14\x5d\x47\xcb\xdd\x6a\xbb\x5f\xef\xbe\xac\x9f\x87\xb6\xcf\x44\x52\x1a\x7a\xdc\xce\x1e\xab\x0c\x16\x20\xf7\x6f\xd0\x1e\xf7\x57\xd1\xce\x92\x4a\x8e\xf9\x3c\xae\xc3\xc6\x6f\x97\x59\xe6\x98\x8c\x68\x6a\x0b\x15\x1c\x8b\xa6\x68\x58\xd9\x68\x55\xcc\x8a\x2d\x9b\x49\x2c\xb7\x9d\x6c\x75\x83\xcd\xc7\x2b\xf8\xc0\x41\x23\xa3\x3c\x50\x72\x54\x5c\xce\x29\x9b\x5b\xe7\x93\xfc\x5f\x95\x4e\x7f\x57\xc5\xf1\x2d\x91\x0a\x7e\x03\x38\xf7\xdc\x4e\xc6\x84\x38\x3d\xd0\x56\xfd\xbd\xa2\xd2\xc8\x58\xd8\x4a\x8e\x07\x38\xad\xea\xa2\x2d\x04\x2b\x9f\xad\xe3\xe3\x15\xea\xa1\x24\x17\x91\x09\x84\xe8\x92\xeb\x2a\x07\xc0\xfc\xc0\x67\x25\x53\xe7\xb3\x62\x25\x16\x2a\x1a\x2a\xb1\x4c\xdf\x3b\x23\x04\xd3\x7c\x98\xcb\x36\x44\x2d\xbd\xd0\xd5\x90\x83\x84\x8d\xc6\x46\x80\xb2\xf7\x39\x87\x32\x23\xcc\x16\xa1\x2f\x0b\x31\x06\x9f\x8f\xbb\xde\x13\x99\xa5\xc4\x85\x5d\xcf\x25\x13\x30\x73\xfc\xcd\x88\x2c\x13\x80\x86\xd1\x6f\x67\x7d\xc6\x96\x15\x7e\x01\xf2\x80\xf3\x69\x7c\xd7\xb0\xcc\x07\xf6\x63\x5a\x0c\x89\xc8\x9c\xda\xa2\x74\x5d\xd5\xe8\x52\x3a\xe7\xba\xae\xfc\x3e\xcb\x7e\x5e\xaa\x82\xcc\x9f\x4e\x5b\xf9\xf1\x2a\xa8\x4a\xe6\x99\x44\x7b\xc7\xba\xb1\x9a\x1b\xa8\x8a\xe1\x2e\x2c\xb4\xa9\xfa\xfb\x06\xda\x0d\xd4\xbe\x90\xda\x9c\x98\xa6\x3d\x1e\x46\x1a\x88\x64\x69\xe8\x42\x68\x78\x0e\x3c\x0d\x8f\xd4\x1a\xc9\xd2\xbe\xcc\xeb\x92\x55\x2f\x8f\xef\x3c\xf4\x92\x27\x04\xbb\x68\x7f\x59\x3c\xdf\x98\x43\xb9\x5f\x7f\x7d\xf6\x6f\xc8\xa5\xc2\xd7\x47\x70\xdf\xe2\x83\xc4\x17\x29\x73\x5b\x84\x46\xe9\x5a\x80\x87\xe2\xf4\x5f\x29\x19\x0d\x86\xae\xb4\x1e\x61\x32\xbb\x83\xc8\x63\x67\x72\xee\x58\x7d\x00\xab\x40\x4f\x60\xc0\x52\x2a\x96\xdb\x33\xa8\xa0\x66\x25\x16\x9b\x9f\x68\x2b\x12\x52\x46\x86\x04\x1c\x9b\x07\xf1\x38\x2a\x9d\x36\x3d\x3e\x00\x01\xed\x4b\xbf\x9c\xb8\xd5\xef\x67\xef\xa5\x92\x2c\x1b\x97\x87\xf1\x46\x40\x37\x4a\x24\x92\x2a\x55\x08\x5f\xf6\x06\x8a\x6d\x30\x00\x72\x77\xac\x75\x05\x1f\x94\xd7\xbf\xba\x92\x10\x70\x86\x80\x49\x8b\xc1\xb3\xda\x82\x6d\x8e\x35\x9d\x47\x88\x40\x2f\xfd\x16\xca\x71\x9d\x4c\x02\x84\x0b\x95\x3a\x0c\xf9\x9d\xd0\xb6\x42\x6d\x3f\x28\x32\x94\xa5\xa7\xa2\xfa\x0e\xc5\x58\xdc\x00\x91\x84\xf4\xbd\x58\x50\x13\x6a\xfa\x21\x10\x3c\x9a\x27\xb0\x2e\x2a\x89\x95\x82\x6f\x75\xbd\xf6\x3d\x4b\x46\x45\x34\x20\x0c\x18\x7a\xd0\x78\x71\x18\xdb\xd1\x28\x68\xfb\x39\x61\x82\xba\x8c\x87\xde\x5d\x6f\x2a\x36\xfd\xf0\x30\x0a\xa5\x2b\x54\xf0\xa4\x54\x03\x33\x81\x08\xa1\x0c\xa3\x51\x3f\x7e\x5b\xc7\xf8\x6a\xc3\x2a\x33\x37\x25\x99\x57\xbb\x5a\x7d\x9d\xf5\x43\x14\xa8\xd8\xf9\xf1\x6f\x01\xbe\x17\x95\xd4\x6f\x98\xa2\x82\x74\x3a\x59\xc4\x28\x8d\x90\xfe\xd6\x7c\xb4\x7c\x11\xe3\x3d\x26\x75\x6e\x1e\xfc\x3a\x85\xc8\xb9\x2b\xe2\x24\x27\x83\x1f\xfb\x4a\x59\xd0\x0f\xc5\xcc\xe4\x60\x43\x9c\x08\x6b\x37\xb4\xfa\x6c\xcb\x36\xf6\x2f\x15\xa7\x0c\xe1\x20\xb2\x3f\x5e\x10\x33\xe6\x4b\xb2\xdf\x35\x4d\x07\x35\xf6\x07\x9e\xaa\xf4\x90\x64\x02\x8b\xc4\xb7\xc5\x09\x9a\x96\x9d\xce\xfb\x53\xe3\xa3\x9c\x90\xb0\x14\xfd\x46\xeb\xf6\x88\xc7\xf2\xae\x7a\xd5\xc5\x1c\x2b\x06\x69\xc8\x53\x8b\xc9\x2b\x5f\xbe\xe9\x77\xad\xf2\x08\xa4\x0a\xd0\x49\xcd\xa4\xc4\x66\x85\x36\x76\xfc\xc1\xee\x64\x19\x0d\x1c\xcc\xcd\xb1\xcf\x99\x4c\x83\x8c\x27\x38\x03\x73\x75\xf7\xdb\xf5\xea\xe9\xf1\x66\xbf\xfe\x7d\xf5\x65\xf1\xf8\x79\xbd\x7f\x5e\xec\xbc\x9d\x05\x39\xc9\x50\x15\xbd\x59\xaf\xae\xe6\x9f\x8e\xb9\x07\xb0\x84\xa6\xa3\xbe\x7b\x16\xa0\x3d\x55\x56\x66\xdb\xc1\x13\x85\xe5\xfc\x4e\xae\xaa\x73\xef\xcf\xf1\xe3\xc2\x76\xed\x39\x63\x3d\x23\x26\xe7\x4d\xc1\xcc\x0c\x81\xbe\x1e\xac\xc7\x85\x2d\x04\xe6\xf8\x63\xe0\x32\xc4\x08\xae\xed\x08\xb9\x1f\xe5\x25\x81\xb1\x70\xa9\xad\xda\xda\x95\x45\x8f\x6c\x02\x11\xa4\xb9\x05\x70\x6b\x55\xb4\xcd\xbb\x5b\x0a\x92\x20\xec\xe4\xb9\x2b\xa1\x71\x21\xd2\x49\x11\x92\x3f\xe1\x69\xc2\xa5\x76\x9f\x40\xb2\xf2\x86\xb5\x6c\x56\xb1\x06\x04\x13\x18\x7a\xb1\x32\xf2\xe9\xdb\x6a\x03\xd3\xc6\x5a\x6e\x9e\x4c\x15\x6a\x27\x03\x1a\xe3\xe7\x29\x42\x20\x39\xc1\x7c\x09\xc9\x2e\x77\xd2\xa3\x08\x41\x25\x02\xa5\x2e\x93\xf2\xef\x9a\xfb\x97\xb9\x05\x90\x7d\x41\xd1\x79\xd2\xb1\xbf\x32\x8d\x50\x29\xb3\xb0\xdb\xbd\x8d\xf4\x34\x7b\x36\x0b\x05\x81\xe2\x89\x70\x38\x19\xc4\x7e\x0f\x9d\x6d\x89\xa2\x8c\x0a\xd7\xbf\xf7\x56\xd7\xcb\x56\xfc\x6f\x2e\x6e\x15\x05\x2c\x8b\x7d\xe7\xfa\x5e\x7d\xb9\x7a\x38\x54\x9c\x4b\x8c\x78\x9e\xd8\x8f\xc1\x37\xab\x62\xa6\x7c\xb6\xcd\xdf\x35\xdf\x9e\x75\xd5\x68\x1b\xa4\xf8\x09\xbd\xab\x44\x32\x04\xad\xd4\xbe\xe6\xfb\x5e\xe9\x7a\x4c\x5f\x2a\x81\x04\x9d\x7d\xac\x29\x0e\x15\xab\x6f\xaa\x62\xba\x7f\x2a\xcd\x94\xaf\x82\x77\x5b\x03\xac\xbe\xdc\xad\x86\xf4\x79\x95\x42\x94\xb3\x89\x37\xc5\x21\xc2\xdf\xa1\x46\xdc\x05\x19\x71\xce\x73\x63\xc7\x2f\x6b\xfd\x32\xf6\x40\xab\x2c\x89\x85\xc3\x3d\x7c\x54\x98\x48\x65\xb9\x44\xcd\xe7\xec\x96\x11\x8b\x45\x35\x4f\xca\x15\x01\x9c\xcd\xce\x73\x86\x39\xab\x25\xa8\x36\x9f\x8f\xb1\x80\xb9\x8a\x80\x4f\xae\x26\x1d\xa6\x0e\x3d\xb0\x1f\xef\x8b\xc0\x28\x16\x42\xec\x0a\x33\x6c\x35\xc2\x86\x3f\x54\x93\x15\xe3\xd2\x97\x90\xf4\x55\xf7\xe6\x4e\x58\xc5\xa0\xcf\xb2\x71\xdd\x01\xa6\xed\x92\x89\xe2\x4c\x21\xdc\x1e\xc5\xfb\x3d\xab\x61\x3b\x14\x07\x50\x22\xce\xa1\x6f\x55\x77\x37\x73\x4b\x29\x01\x34\x75\x72\x01\x2b\xc1\xfa\xab\x24\xe1\xc4\x81\x01\x58\x59\xfc\x61\x8b\x0e\xb3\xa2\xfc\xa2\xf5\x4b\x3f\x27\xcb\x99\x33\x4f\x6f\x4b\x76\x68\xbc\xd5\xee\x86\x21\x8c\x30\xea\xb4\xfe\xbe\x82\xba\x2d\x94\xcb\x57\x5d\x41\xd5\xc2\xbc\x11\xf0\x84\x18\x01\xc0\x27\x04\xec\x8a\xb6\x84\x1b\x0c\xde\x4d\xdf\x5b\x25\x14\x1b\xa4\x20\x48\x50\x40\x5d\xbd\x6f\xf6\xe4\x67\x66\xb9\x77\x31\x6c\x74\xdd\x2a\x5d\x0e\x3d\xb9\xe7\x53\x85\x05\xa1\x36\xdd\xf9\xac\xeb\xb6\xc1\x0c\x0d\xc5\xbc\x01\x63\x35\x42\x1a\x04\x9c\x04\x72\x88\xeb\x80\xd5\x95\x1c\xc7\xa5\x01\xe1\xb1\x8c\x47\xfe\x9e\xa7\xd7\x3e\x00\x7c\x8b\xa0\x9b\x9f\xe9\x40\x34\x20\x40\x91\x7c\xbe\x1f\xf5\x17\x5d\xca\x66\xc3\x5a\x87\xc4\x18\xaf\x00\x0d\xa8\xb2\xe9\x62\xc6\x4c\x7b\xeb\x93\xee\x76\x7a\x42\x3d\x34\x08\x43\xe2\xcb\xcc\xde\x1a\xae\x3c\xee\xfd\x40\x83\x30\xce\x11\xab\xec\xcf\xc8\x6f\x45\x75\x90\x7a\x16\x13\x1e\x6c\x12\x1a\x44\x82\x60\x82\x80\x61\x3a\x4c\x82\xee\xb0\xbd\x44\x51\x7a\x46\x41\x83\x48\x06\xca\x1a\x59\x46\xc9\xc7\x18\xe9\xd0\xa7\x89\x06\x71\x4c\xd0\xe7\xb8\x28\xe1\x07\xf3\x3f\x26\xa1\x44\x21\x25\x58\x29\x1e\xd8\x8f\x49\x08\x98\x06\x49\x14\x52\x69\xab\x2a\xfd\x30\x04\xd4\xfb\x97\xcc\x10\xc7\x56\x26\x42\x57\x4d\x57\xee\x47\xc5\x80\x68\x90\xc4\x0a\xdb\x7a\x15\xcd\xbd\x66\xd8\xf8\xd7\x5b\x2d\x34\x48\x52\x48\x5c\x99\xff\xd1\x49\xa2\x41\x22\x01\xb3\x64\xba\xaa\x68\x1b\x04\x14\xdd\xea\xda\x57\xb0\xb2\x39\x49\x87\xe1\x01\x90\xba\x22\xcd\x42\x4b\xd8\xb0\x9a\x9d\x66\x0e\x46\x1a\xa4\x34\x4e\x73\xdf\x28\x11\xf3\x44\xfb\xd8\x21\x0d\xd2\x8c\x60\xfc\xb7\xab\x78\x67\x28\x78\x77\x39\x4f\xea\x39\xd1\x20\x05\x89\xd5\x17\x1e\x9f\xbe\x2d\xfe\xb4\x60\x06\x0d\xb2\x10\x30\x8b\xe7\x79\xed\x5b\xea\xd2\x20\x0f\x01\x4b\x42\xba\x93\x0c\xb4\x1f\x48\x18\x6a\x24\x36\xd7\xa9\x59\x5e\xec\x77\x8a\xcb\xec\x13\xf2\xdc\xee\x98\xed\xac\x55\x34\xfd\xf7\xe7\x2a\xcf\x6c\xa1\x93\x53\x51\xf5\x2d\xde\x68\xc0\x02\xa5\xe2\xbe\xcf\x45\x71\x9a\x34\x0b\xf1\x73\x04\xc7\x0d\xc0\x1a\x4e\x64\x39\xd4\x25\xa5\x01\x97\x2a\x8e\x06\x41\xb2\x6d\xeb\xe2\x7c\x1e\x9d\x2f\x19\x06\x99\xec\x45\x89\xab\xcc\x77\xbd\x00\x10\x0d\x64\x64\x5d\xdc\x4f\xa7\xd3\xa4\x38\x33\x0d\x24\x64\xa9\x67\xab\xcc\x4a\x97\x67\x36\x03\x4c\xd1\x40\xaa\x20\x1a\xaa\xd4\x2d\x59\xbd\xd2\x12\x66\x27\x51\xaa\xdc\x77\xd5\x76\x81\x05\x97\x73\x5a\xcf\xce\x22\x50\x19\x39\xcd\x01\xd5\xef\x2f\xac\x39\xde\x17\xbc\xbe\xcc\x6e\x08\x3c\x81\x01\xa4\xf1\x5d\xd7\x2f\x93\x24\xb3\x5f\xbb\x11\xac\x9c\x06\x2a\xcb\x51\xb4\x1e\x2f\xbc\x2e\xa4\xe3\xd5\xef\x71\xfb\x94\x04\x32\xf5\x28\xa8\x07\x5b\xb8\xc6\xad\x05\x21\x11\x21\xa4\xe7\x25\x3e\x78\xe5\x07\x45\x84\x56\x81\xf3\x78\x8e\x17\x91\x50\x69\xe3\x93\x67\x76\x59\x5e\xae\x14\xff\xa5\x84\x2a\x89\x9d\xa9\x5c\xb6\x9b\x4d\x7d\x7b\x66\xe7\x42\xa2\x1d\xea\x6f\x14\x46\xb6\x95\x9c\xd5\x12\xff\xa5\x4f\xbc\xb0\x8e\xa7\x99\x38\xa4\x24\x8c\xe3\xd0\x3b\x45\x8b\xea\x3f\x6c\xf6\xbc\x30\x8b\x13\x97\x14\xf4\xe4\xd1\x69\x94\x44\x81\x2d\x0c\x86\x45\x74\xf5\x97\xce\xbc\x4c\x33\xf9\x92\xc8\x35\x28\x3a\x63\x57\xc7\xdb\xa2\x2a\x9a\xe3\xce\xdb\x41\x7e\x52\xa2\x62\xdb\xd3\xd4\xb1\x5b\x5b\x4e\xeb\xdd\x2b\xa6\x04\x50\x27\x2e\x8d\x11\xb9\xd2\x55\xd3\xb2\xaa\xff\xd2\x94\xda\x0e\xc7\xae\xb9\x96\xd5\xb5\xdf\x8b\x41\x4a\xd2\x98\x83\x37\x86\xff\x98\x3f\x22\x63\x44\xf4\xc0\xcf\xfa\x8a\x87\xea\x3d\xef\x26\x79\xc0\x2c\x7e\xdf\xec\xf2\x33\x88\xae\x36\x33\x96\x45\x59\x16\xd5\xa1\xcf\x46\xfc\x5f\x14\x56\x4a\xf2\x34\xc7\xf7\x78\x2b\xc5\x44\xef\xa7\x24\xcf\x09\x38\x67\xf4\x12\xda\x66\x0c\x64\xa0\x84\x11\x22\x83\xbe\x41\xa1\x6d\x21\xbb\x7a\xba\x7e\x86\x09\x67\xb6\x18\xd7\xea\x7e\xf1\x7d\xb9\x58\xfd\x36\x81\xa7\x52\xc2\x79\x1e\xa5\xae\xb8\x2a\x56\x37\xbd\x13\xba\x1f\x13\x79\x1a\x79\xe5\x67\xa3\x75\x39\xf1\x29\x51\x22\xc2\x00\xcf\x0e\x66\xcb\x2c\x67\x2d\x87\xb2\x79\xbd\x18\x4a\x44\x64\xb3\xb9\x1f\x97\xff\xec\x6f\x91\xda\x62\x27\x18\xd5\x6a\xce\x18\x08\xbb\x93\xb3\xed\x92\xcc\x96\x61\x2f\xaa\x62\x54\x99\xea\xa3\x25\xbe\xbe\x0c\x52\x50\x25\xbc\x7d\x82\x89\x0d\xd5\xc1\x95\x78\xe8\x2b\xb5\x53\x22\x65\x66\x8b\xbd\x99\x2f\x7e\xd4\xad\x5b\xf7\xab\xba\x86\xb1\xc6\xd1\xdc\xc0\xe2\x4a\x8b\xd5\x6e\xbf\xb8\xbf\x7f\xfa\x3e\x94\xc3\xa0\x04\x58\x84\xae\x3b\x54\xc3\x77\x45\x89\x58\x1a\xec\x54\x5e\x54\x07\x8c\x4c\x21\x33\x1a\xe1\xff\xc6\x14\x07\x0a\x3c\x1e\x65\xc3\xde\xaa\xf7\xb5\x93\x29\x51\x41\x88\xc7\x61\x6f\x54\xe0\x06\x75\xdc\x0f\x5e\x56\x85\x09\x1b\x9c\xad\xcf\xd0\xe8\xae\x16\x33\x5e\x4c\x14\xc4\xc8\x6e\xbe\x7d\xdd\xd8\x30\x2c\xc8\x5b\x5d\x9b\xf5\xb9\x7a\x53\x1a\x24\x04\x0b\x7f\xb5\x85\x31\xb7\xef\x59\xd3\x6e\x3a\x5e\x16\x8d\x73\x9c\x50\x1a\xa4\x39\x76\x9b\x05\x71\xea\x4a\xc4\xc2\xfc\x69\xba\xc7\xfc\x11\x2c\x46\x9a\xb1\x5d\x2b\xd9\xb4\x60\x07\xa5\x81\xb2\x05\x4a\x99\x94\x1b\x5d\x16\xe2\x32\x24\xa5\x77\xef\x7a\x00\x39\x3a\xa4\x24\x08\x33\xdb\xaa\xea\xf2\xf4\xbe\x6e\x92\x9f\x94\x31\x69\xab\x52\x35\x4b\x36\xcd\xfe\xa6\x94\x28\xdb\x8b\x72\xe9\x6b\x09\x94\xfe\x8b\xa9\xb2\xad\x56\x36\xfa\x7c\xbe\xf8\x1f\xc3\x4c\x60\x5c\x7e\xef\xab\x85\xdf\xc0\x6b\x31\x5f\x7d\x1a\x66\x80\x36\xa0\xad\x10\x56\xc1\x5b\x3d\x78\x04\x29\x8d\xa4\x20\x23\x5f\xcd\xe2\x7e\x4d\xf6\x9b\xe7\x75\x3f\x0c\x56\xfb\x96\xf0\x7a\x0b\xbd\x6c\xa2\x71\x96\xa2\x41\x5b\x69\xe9\xf3\x71\x46\x99\xcb\x94\xc6\x39\x0f\xdc\xf9\xdb\x2c\x77\xbb\x5b\x5d\xcf\x63\x59\x94\x26\x54\x80\xf4\xe8\x01\x84\xa7\xf9\xe2\x9a\xb3\x55\x49\xa2\x00\xcd\x1e\xec\x0a\xb4\x83\x09\xa0\xcb\x8c\xf2\xc4\x25\xc3\x63\xad\x83\x9f\x76\xc1\xa0\x34\x61\x16\x46\x71\x86\xf6\xa9\xb2\x41\x59\xde\xc7\x97\x9d\x7f\x99\xd2\x04\xac\x52\x60\xc9\x7a\x84\x57\x9f\xbd\x5a\x16\xc7\x38\xef\x96\xd5\xa7\x2f\xfa\x0c\x9b\x5a\xff\x07\xc4\xb8\x3b\x31\xa5\x19\x04\x08\x6b\x79\x43\xf0\x9d\xb1\xb2\x87\x3e\x03\x6e\x4a\x4e\x22\x5c\x65\xfc\xc2\x66\xf6\x8c\x3c\x8f\xf2\x01\x25\x71\xb7\x7a\x72\xd5\xa9\xfc\x30\xf3\xf9\xd1\xcd\x49\x8f\xd4\x70\x9a\x73\x8a\xde\x45\x4c\xab\x35\x1b\xdb\x0f\x08\x5b\x9a\xde\xdb\x27\xae\x4f\xd7\x2d\xc0\xcf\xfb\xf4\x8e\x69\x3d\x87\x08\x3f\xdc\x75\xa7\x7b\xe8\xca\x6d\x71\x98\x20\xf1\x29\xe5\x69\x14\x3a\x9b\xfb\xd3\x95\xf2\x4c\x7e\x56\x66\xdd\xd6\x07\x68\xef\xa4\x5b\xbf\xfe\x0e\xb9\x2d\xd1\xfd\xd9\x28\x47\x53\x29\x41\xb9\x48\x89\x4f\x78\x84\x1f\x18\x33\xdd\x16\xbc\x1c\x49\x5d\x3f\x51\x52\x6c\x22\x78\xbc\x9c\x61\x4e\x83\x82\xc6\xd8\x0c\xe4\x0c\xd8\xe2\xc0\xba\xda\xe6\x1b\x20\x98\x85\x1f\x9a\xc5\xfd\x56\xc0\xdb\x64\x77\x81\x58\x34\xd6\xd7\xed\x72\xbd\xbe\xed\x7f\x15\xf9\x08\xd9\xe2\xea\x79\x5f\xe7\x44\x20\xa5\x2f\xed\x65\xeb\x1c\xaf\x7a\x8c\xa0\x9b\xa1\x44\x96\x8d\xca\x0f\x4d\x7d\xf6\x93\x9b\x85\x41\x60\x9d\xc5\xce\x58\x7b\xb6\xf1\x03\x7f\xd8\xc3\x80\x05\xa9\x18\xe2\x0a\xc6\x86\x9f\x2e\x56\x18\xc8\x0c\x7d\xac\x6d\x01\xf5\xee\x58\x3b\xf5\xdb\x0d\xd2\x9c\xd1\xdc\x53\xd4\x80\x37\xa0\x61\x98\x26\xa8\x6c\x4b\xd7\x9a\xe1\x6e\x73\xbb\xc5\xd4\x53\x3f\x2e\xf3\xc8\xd9\xbb\xb6\x1e\x64\xb3\xbc\xa0\x7e\x3f\x5d\xe9\xd0\x68\x84\x43\x77\xae\x6f\x45\xc3\xfa\x4a\xaa\x57\x17\x2f\x8c\x93\x1c\x9d\x40\x0f\xba\x2a\x46\xb4\x1f\xc6\x09\x88\xa0\x87\x52\xac\x74\x77\x1e\x05\xf9\xa6\x5f\x1c\x67\x29\x3a\xc7\x7f\xbf\xbd\xff\x89\x37\x8e\x86\x71\x6e\x7d\xc9\xfe\x8d\x30\xd5\xf4\x5d\xf1\x2b\x37\x39\x21\xb6\xfa\x91\x8d\xed\x94\xe5\xd8\x44\x0d\x13\xce\x63\x36\xe0\x56\xaf\x95\xac\xa3\x61\x0a\x8a\x50\x6f\xa3\xba\x50\xce\x58\xa7\x08\xb3\x34\x4d\x9d\x6e\xbc\x1a\xf5\x09\x76\x3d\x0c\xc6\x07\x31\xcc\x78\x8c\xab\xd4\x42\xd3\x0e\x9d\xb1\xfb\xc1\x14\x77\x1c\x2a\x6c\xdd\xdc\xc7\xae\x68\x98\x47\x99\xc7\x89\x18\x19\x8c\xf1\xc1\x2f\x08\x08\xe9\x67\xc4\xb6\xde\x5f\x79\x16\xfe\x27\x96\x50\x3c\x51\xb5\x99\x47\xc8\xf4\xbc\x85\x9c\xa7\x48\x08\x37\x8b\xdd\xda\x88\x19\xc3\x96\x6c\x52\x97\xbf\x5e\x90\x1c\xf1\x49\x0f\x97\xef\x45\x73\x1c\xe5\x82\xd2\x50\x50\x1b\x88\xc2\x82\x12\x7f\xcc\x0c\xa9\x50\x24\x41\xd4\x57\xd4\x14\x1e\xb0\x68\x7e\x27\x58\x99\x0b\xdd\x10\x7b\x76\xe8\x01\x9a\x34\x14\x19\x07\xea\x1d\x96\xbe\x16\xc5\xcf\x22\x0a\x34\x94\x89\xc0\x84\x97\xe7\xf5\xe6\x69\xbf\xd8\x6c\xf6\x8f\x8b\x07\xcf\x58\x43\x20\xae\xe4\xa7\x2f\xdc\x34\x8e\xc3\x8d\x5a\x20\xfa\xe9\x61\x82\x9d\x4f\x2b\xec\x13\xb8\x62\x4d\xff\x62\xa0\x94\x6f\xfb\x8f\xe0\xcd\xee\xc3\x72\x76\x34\x54\x11\x41\x4d\x1b\x49\xad\x7f\xe0\x70\xe6\x55\x64\xf1\xec\xe8\xbd\xde\x69\x87\x4e\x9c\x2d\x9e\x62\x52\x3a\x18\xe1\x33\x56\x48\x05\x89\x41\x33\x3b\x1c\x05\x41\x86\xbd\x34\xce\x4e\x0d\xb3\xfe\x2a\xea\x47\x23\x0e\x30\x6d\x57\xdd\x57\x12\x31\xa3\x4a\x70\x6b\xfb\x2d\x59\xc5\x3c\x42\x80\x46\x01\xe3\xa1\x2d\x1b\x6d\xcc\xba\x67\xdb\x93\xae\xef\x4b\x4a\xa3\x40\x72\x14\x1f\xe3\xec\xc2\xc8\x0f\x92\xc0\x96\xbd\x28\xb0\x01\xc6\x8c\xcf\x45\x24\x8d\xf0\x6c\xf8\x9a\xd8\xcb\xdd\xea\x3a\xc3\x8c\x48\x96\x32\x57\x3c\x48\xea\xb7\xe0\x5d\x2b\x1c\x1a\x11\xc5\x9d\x43\x05\x59\xc9\xb1\x28\x8d\xf2\x6a\xab\x35\x3d\xc2\xb4\x8e\x11\x8d\x28\x11\x28\xc9\xb7\x4c\xca\x12\x6e\xb7\xd3\x75\x8e\x68\x42\xb1\xc2\x82\xd5\x2b\x1e\xba\xb2\x2d\x9a\x41\x6e\xce\x6e\xc5\x62\x6b\x5a\x40\xd3\x3e\x83\xd0\xaf\x30\xf8\x24\x7e\xfd\x09\x45\x44\x94\x33\xcc\xff\xbb\x7d\x1a\x4b\xaa\x88\x8a\x08\x75\xb6\xd5\xb8\xd3\xda\xbb\x6a\x8d\xa3\x77\x95\xc0\xb3\x11\x00\x07\x8d\xd1\x13\xc8\x82\xcd\x12\x41\x69\x44\x15\xc1\x78\xd5\x6e\xe2\x08\x8c\xa8\x0a\xbd\x6f\x03\xc3\x8e\xfd\xcf\x02\x95\xeb\x57\xdd\xc2\xe3\xa4\x8e\x1e\x8d\x42\x12\x51\xa7\x78\x6f\xbb\x33\xd4\x36\x05\xe3\x3a\xeb\x8e\xc2\x50\x62\xb1\xa4\xaa\x3b\xed\x8f\xe3\x14\x41\x1a\x85\xa9\x75\x83\xd9\x0c\x80\xb1\x0f\xe9\xba\x41\x10\x85\x8c\x11\x3e\xc1\xab\x3c\xf2\xf1\x4b\x47\xa1\xf5\xc6\xe8\x0a\x5c\xb5\x07\x87\x0e\xf3\xe3\x9c\x21\xdf\xfb\xd2\xf1\x3e\x2c\x45\xa3\x08\x2c\x8d\x9b\x3d\x44\x3f\xf3\xa2\x76\xd9\x03\x37\x9d\xf9\xea\xa1\x2f\x0e\x8d\x62\x61\x4b\x20\x16\xa7\xb3\xae\xdb\x2d\xfc\xb7\x83\x41\xdd\x89\x92\x40\x12\xf0\x6d\x4a\x6d\x3e\xe4\x73\x9f\x34\xfb\x0e\x73\x3b\xfd\xb6\x34\xb2\x51\xf7\x33\xbb\x48\x76\xb9\xad\xed\xad\x2f\x77\xd5\x0d\xbb\xf4\x2b\x96\x46\x02\x15\x99\xd3\xc5\xa6\x92\xcf\x9d\xd6\x51\x0a\x01\x92\x55\xd3\x71\xc4\x6e\xda\x41\x9f\xcd\x81\x01\xb7\xeb\x84\x94\x05\x81\x72\x92\x0a\x83\x4b\x50\x0c\xa1\x10\x1a\x65\x71\xc6\xc9\x38\xf4\x2e\xdf\x75\x51\xfc\xb9\x0d\x1e\xe5\xc4\x42\xde\xad\x1f\xe9\x5e\xb7\xed\x58\x0f\x8e\x72\x48\x70\x67\x56\x5a\xc2\x03\x2b\x8c\x2c\xee\x9d\x47\x11\x8b\xad\xfd\x6a\x36\xe8\xae\x99\x2b\xe6\x11\x93\x1c\x01\x2b\xf7\xfa\x60\x53\xf4\xdf\x8a\x56\x1c\xc7\xde\xe9\x48\x44\x24\xb7\x8d\x66\xa4\xed\x7f\xfa\x01\x56\x8a\x46\x22\xb1\xc5\x04\x96\x4f\x8f\x5f\xb7\xfb\xbb\xd5\xd3\xfe\xfb\x7a\xfd\xdb\x7e\xf7\xdd\x4b\xdc\x48\xa4\x49\xa4\x7a\xd8\x71\x59\x02\xb6\x7a\xd0\xa5\xd4\x6f\xd5\xbb\xa0\x16\x8d\x84\x08\x6c\x35\x64\xd4\x32\x9f\x41\x14\xe7\xe2\xff\xd1\xf6\x66\xcd\x8d\xe3\xd6\x1f\xe8\x77\xf9\x3f\xcd\x43\x1e\x48\x2c\x24\x78\xdf\x64\x5b\xee\x76\xc6\x5b\x2c\x75\xf7\x4c\x52\x29\x15\x96\x03\x9b\x31\x45\x2a\x24\x65\xb7\xe7\xd3\xdf\xe2\x01\xc0\x4d\x94\x67\x72\xab\x6e\x1e\xd2\x53\x26\x44\x51\x24\x08\x9c\xe5\xb7\x04\x04\xf8\xac\xe2\x34\xa5\x91\xfb\xcf\x1b\x03\xce\x1c\xb6\xae\xab\x7a\x14\xcf\x31\x30\xae\x03\xa6\x8e\x1f\x5f\xa1\xae\x66\x5f\x6b\xb5\x4e\x74\xdf\xf0\xf6\xaa\x0c\xe1\x27\x58\x93\x20\xc6\x0c\xb7\x61\xbc\x9f\xfd\x81\x0c\x03\x9a\x2f\x63\x79\x08\xc2\xa3\x48\xa0\xdf\x89\x3a\x7e\x5c\x75\xdb\xa3\xae\xf2\xb2\x59\x3d\xcb\xbc\x44\xcd\xab\xbe\x80\xcd\x23\xe2\x7a\x9d\xee\xc7\xae\xf7\x87\xa2\xfa\x80\x65\x5e\x62\x37\x38\x15\xdd\x32\x7c\x7d\xb5\xfd\xf3\x0a\x3d\x8f\x94\x21\x53\x55\x69\x84\x30\x4d\xc6\x90\x58\x61\x63\xb7\x91\x6f\xb0\xfd\xd9\xce\x0e\x26\x0e\x28\xad\x1c\xf5\x04\xab\x15\xfa\x57\x98\x15\xed\x39\x51\x59\x86\xa1\x3e\x2a\x9d\x4c\x84\xd4\x08\xa7\x31\x45\xcb\x96\x43\x5d\xfd\x74\x2c\xb6\xfe\x88\xcc\x02\x2f\xe2\x4e\xfe\xbc\x83\xfa\x79\xf8\x10\x64\x94\x87\x26\xa8\x71\x0e\xbc\x0e\xc2\xe5\x64\xe1\x66\x17\x40\xad\x72\x12\xb4\xd5\xfe\x5a\xaa\x70\x12\x16\x31\x04\x14\xbb\x9e\xc3\x93\xcc\x1b\x30\xbd\x98\x37\xe1\x8c\x92\x80\xc6\x0d\x94\x39\x4c\xc0\x1f\xac\xed\x87\x08\x81\x31\xc6\xf6\x61\xbb\xba\x1d\x50\xa6\x5d\x72\x25\x99\x4b\x4e\xf7\xfb\xaa\xec\x45\x24\x09\x67\x90\xe0\x03\xfa\x52\x99\x62\x44\x65\xec\x0e\x58\x5c\xd3\xb1\x21\x79\x07\x26\x3f\xee\xc3\xa1\x60\xfe\x70\x98\xf8\x58\x85\x83\x89\xc1\xc6\xa6\x9b\x1e\x77\xf2\x3f\x55\xbd\xad\x61\x56\x0b\xe1\x09\x4f\xa8\x2b\x44\xd7\x39\x98\xc9\x46\xcf\x13\x9d\x62\x87\x64\x65\x87\xab\x49\xc0\x39\x09\xbb\xa9\xee\x7b\xff\x4b\x5e\x78\xff\x53\xf5\x89\xa7\xb1\xc2\x8b\xc5\x7c\x7f\x76\x89\x29\x89\xf1\x06\x5c\x57\xf5\x33\x5c\x5e\xdd\x87\x4b\x49\xa9\xf5\x0a\xf6\x4e\x57\xa0\x28\x64\x1d\x98\x97\xfd\x18\xe9\x04\xea\xab\xd2\xcb\x68\x05\xc6\xb9\xf9\x65\x84\x7b\x21\x3c\xd5\x4c\x38\x7c\xc8\x60\x78\x38\xdd\x5b\xb9\x88\x25\xea\x78\x55\x5d\xba\xe3\xfc\xfb\xcc\xe3\xc8\x39\xf4\xe2\x63\x1e\x28\x2f\xff\x54\x11\x6b\xe3\xbc\x18\xec\xb1\x34\x08\xe7\x06\x73\x01\xed\xec\x57\x0b\x1a\xc9\xa1\xd5\x60\x1c\xb6\xe0\x0a\x64\x71\x4a\x04\x0d\x9f\x60\x1c\xe5\x8f\xdb\x97\xbc\x7c\xdd\xca\xf2\xb5\xdb\x5f\xa7\xb9\x0d\x17\x29\xc7\x46\x93\xae\xf6\x07\x59\xe2\x15\x87\x43\x19\x25\x08\x2f\x56\x79\x9b\xbf\xfe\x91\xbf\x4e\x16\xa5\x8c\xa6\x08\x07\xdb\x6e\x9d\xc0\xd4\x06\x8a\x62\x38\xa6\x31\x84\xdb\x6d\x0e\x45\xdf\x0e\xe5\x32\xb1\xce\x0e\xa8\xd9\xe7\xc7\xfd\x4c\xa0\x98\x70\xa9\x0c\x17\x23\x50\x63\xa8\x65\x4c\x56\x11\x45\x88\x1a\xb0\x94\x37\xdd\x93\xeb\x92\xe9\x89\xd4\x44\x18\x9a\xa5\x41\xb0\xfc\xb1\xae\xde\x72\x74\x6d\xdd\xcf\x34\xac\x09\x57\xca\xb9\xa0\x96\xf0\x8e\x91\x86\xef\x33\x9f\x79\x54\x5a\x03\x46\xf9\xab\xbb\x6f\xb7\xeb\xed\x26\x5c\xbb\xb6\x22\xb3\x33\x0b\xf8\x25\x35\x00\xc2\x8d\x89\x10\xea\xfe\x50\x06\x7d\xd7\x71\x51\x8d\x43\x44\x32\x15\xa4\xe1\x64\x3d\x79\x87\xc4\xec\x5a\x80\x27\xc8\xbf\xbf\x87\x63\x5d\x5d\xad\xc2\x0e\xc9\x21\xd5\x64\x54\x29\x9b\x7d\x48\x44\xd9\xb8\xc9\x7f\x09\x67\xbc\x8b\x08\x07\xed\xcc\x63\x9f\xa1\xbd\x70\x13\xd1\x15\x15\xa7\xb3\xd2\x66\x0e\x48\xe8\x9e\x88\x13\x92\x2b\x6d\x55\xef\xdd\x33\x59\x28\x13\x70\x6b\x63\x32\x4e\xdd\x66\xa1\xc0\x09\xdc\x84\x24\x71\xe2\xd4\xe0\x9a\x63\x39\xf4\xde\x92\x58\x64\x68\xde\x71\x91\x63\xf0\x1f\x74\xa3\xba\x03\x80\xda\x18\xab\xa2\x9d\xf7\x86\x97\xea\x16\x49\x2c\x19\x66\xac\x98\xff\x5d\xdd\x5c\x2d\xdf\x90\x24\x06\x03\xba\xd7\x0d\xc5\x2a\xc2\xc5\xc7\xcd\xd5\x64\x86\x26\xc4\x68\xa4\xa0\x3a\x1e\x4f\x39\xc5\x19\x92\x84\xd2\xd4\x3d\x60\x6c\x61\x49\xaf\x70\x1a\xde\xc6\x84\x32\x8e\x98\x19\x0c\x2f\xeb\x29\x24\x8d\x24\x4c\x49\xc2\x82\x82\x76\xf7\x2c\xb6\xd5\xdf\xa5\x7e\xed\xf5\x11\x49\xc2\x63\x47\x52\x55\x49\xe2\xb3\xd8\xe9\xf9\x13\xee\x4c\xbd\x1e\xab\xaa\x58\x9c\xa0\x49\x92\xba\x7a\xc5\x6b\x5e\x14\x8f\xf2\xa3\xff\xa0\x92\xf8\xf2\x8e\x11\x4f\xfd\xe3\x49\x6c\xc4\x58\x6f\x6b\x86\x8e\xcd\xe1\x73\x82\xb8\x35\xb2\x81\x2e\x13\x74\xe4\xea\x53\x24\xc9\xf4\x12\x04\x17\x10\x32\xed\x6e\xa3\x72\xd4\x8b\xfa\xa6\x44\x34\x7a\x51\xf4\x35\xf6\x44\x80\x13\xbe\xb9\xfb\xc0\x38\x68\x8b\xa2\x05\xe1\x60\x16\x81\xf5\xbd\xba\x9b\xcb\x87\xf5\xcc\x3a\x2c\x0c\xca\x28\x38\x65\x2a\x23\xcf\x14\x34\x12\x49\x23\x6c\x5a\xec\xb0\x37\xd5\x03\xbf\x16\x8d\x99\x49\x22\x33\x1d\x80\x2b\x8f\x55\x2b\xdb\x59\x68\x98\xa8\xd8\x70\x3b\x12\x95\xf5\x7f\xd6\x91\x41\x17\xd5\xa7\xaf\x21\x32\x48\x4c\x04\x8e\xb7\x5f\x4b\x47\x0d\xb8\xcd\x35\x94\x23\x5c\xdd\x64\xe2\x99\x38\xc3\xe0\xef\x07\xd2\x6d\xa7\x15\xd0\x53\xbf\xe0\x93\xa5\x2d\x31\x89\x4c\xd2\xd0\x99\x95\x75\xbb\x69\xab\x03\xd6\xb3\xce\x14\xf0\x12\x60\x11\x09\xde\x2b\x13\x24\xc3\x6c\x98\x96\xae\x4a\xe7\x92\x17\x79\x78\xac\xbc\xdd\xa5\x4f\x0f\x12\x9b\x39\xad\xc0\xcd\x43\x28\x71\x25\x56\x5b\x11\xda\xc4\xb2\x00\xd7\xd6\xee\x0f\xda\x88\x43\x5f\x02\xc5\x66\x9e\x3b\x92\x46\x4c\x3a\xef\xab\x87\x9b\xfb\xe0\x87\xd3\x25\x11\x8f\x5f\x57\x9b\xf5\x8e\x86\x61\x71\x9c\x20\x1c\xdd\x57\x8b\xef\xe1\xdd\x49\x22\x8c\x8b\x32\x29\xcd\x62\x65\xfd\xcb\x76\x57\x95\xf0\xe1\x3c\x4d\xd6\x33\xc2\x0e\x49\x19\x61\x98\x00\x1d\x6a\xf0\x36\xc0\xed\xf8\x9d\xeb\x32\x4b\x15\x05\xc8\xc8\xd8\xa7\x8f\xa4\xcc\x70\x4c\xfb\x9a\xea\x58\xdc\x34\xdd\x45\x98\x8b\x59\xe1\x20\x65\x20\x51\x51\xfe\x3f\xf2\xcf\xbd\x4f\x96\x1f\x6d\x9a\x24\x1c\x29\x51\x79\x69\xf2\xb7\xdc\x1c\x9d\xdf\x73\x38\xd8\x85\x31\xee\x56\x77\x8b\xc9\x63\x35\xa1\xc7\xce\xce\x24\x22\xa7\x35\x77\x7b\x1f\xe0\x38\xa9\x88\x33\x14\x61\xd9\xb4\xb2\x34\x3d\x11\x6f\xf6\x31\x65\x10\x18\x22\x9b\xd7\xbf\x24\x7c\x42\x52\x61\x25\x52\xe6\xb6\x20\xf7\xaa\xee\x22\xb9\xb1\x30\x03\x49\xb3\x88\x06\xd5\x39\xbf\xd0\x99\x25\x18\x47\x9a\x71\xe7\xf2\x83\x8f\xc4\x19\xc3\xce\xee\xaf\x64\xee\xf1\xe1\x0a\x02\xc7\xfd\x55\x2e\xf7\x55\xdf\xfc\x4b\x51\x9d\x64\xa8\xf0\x7e\xf7\x1c\xa6\x51\x06\x9c\xca\xd4\x6b\xaf\x06\xe7\x87\xeb\xbc\x6e\xda\xcb\xe3\x0c\x3b\x94\x4a\x99\x05\x57\xdf\x6f\x65\x6f\x4e\x4f\x52\x15\x5b\x5c\x23\x9d\x04\xf0\xa6\xad\xea\xa1\x02\x9a\x2a\x25\x30\xb5\xb8\xbe\x1d\x0b\x79\x92\x54\x99\x4c\x8a\x91\xd9\x61\x51\xd5\x5f\x6a\x18\x1d\xb7\x12\xbb\xb7\xc6\xe7\x23\x60\x6e\xb4\x4b\x2b\x9b\x51\x69\x21\xd5\xd4\x79\x95\x0f\x7e\x00\x4b\x72\x53\x24\xd5\x2a\x45\x29\x6c\xb4\x6a\x1a\x2a\x90\x29\xa4\x32\xb2\x21\x6a\x6b\x65\xf1\x45\xee\xe1\xb1\xdf\x8f\x52\xd0\x82\x85\xc4\xe8\xe8\xe2\xa2\x07\x7b\x3b\x17\x6e\x20\x29\x58\x70\xb2\xaa\xf2\x15\x5c\x8b\x33\x10\x0b\xfa\xfc\xdc\x8d\x14\x51\xc4\x89\x6f\x89\xfe\x3a\x5c\x87\x88\x63\x81\x6a\xfc\x8f\x4f\xeb\x8b\x6f\xbf\xef\x1e\x1f\x9e\xd0\x70\xe9\x6e\xf5\x5b\x3f\x82\x29\xe1\x61\xc7\xbd\xac\x22\x11\xb1\x4a\x1d\xb6\xa4\x0b\x0d\x77\x0d\xb4\xbb\x53\x84\xc2\xe4\x52\x05\xe1\xd2\xe0\xaa\xfc\xe6\x74\xb4\xf1\x9e\xd2\x28\x9c\x90\x26\x16\xf7\xe8\x23\xfa\xa4\x8e\xae\x90\x5a\xa6\xbc\xb0\xec\x63\x5d\x1d\xa0\x6e\x3f\xae\xab\x1a\x57\xaf\x25\x4d\x54\x22\x58\xb7\x11\xf6\x78\xb1\x8b\x63\x3d\xd7\xe6\x22\x82\x1b\xce\xc7\xb8\x9e\x1f\x79\xfb\x32\x95\x0f\x58\x5c\x93\x45\x2a\x22\x94\xc6\xc6\x10\x31\xd4\xf5\xff\x39\xe3\x83\x12\x91\x66\x16\xa9\x88\xee\x92\xcd\x51\xb7\xbf\x2c\x0a\x79\x2d\x05\x55\x42\xb0\xcc\xb9\x0b\xf7\x16\x2a\xb7\xd5\x73\xae\x97\xfb\x2f\x42\x64\x96\xf4\xc6\x9b\x4d\x5b\x99\x5c\x7a\xe1\xb3\x27\xf8\xef\x34\xe4\x14\x42\x52\x67\x97\xe2\x2f\xfc\x0a\x8a\x3e\x50\x11\x42\x2a\x8e\x5e\x1e\x97\x97\xfd\x9f\x74\x84\xc2\x01\xa1\x99\x7b\x55\xed\x65\x5e\xfe\xb2\x54\xef\x11\x19\x64\x98\xa6\x97\xf0\xee\x5f\xf5\x59\xe1\x5c\x48\x2e\xd0\xb4\xdb\xe6\xa5\x59\x97\xe6\x50\xe5\x65\x7b\x92\xe9\x85\xb1\x19\xc7\x6f\xee\xb6\xd1\xa7\x00\x51\x9f\x44\x64\x42\x2a\xa7\xc6\xbc\xdb\x3d\xc3\x19\x40\x84\x90\x40\x55\x00\xea\x05\x83\xdd\x13\x3e\x3f\x11\xd2\xa6\x01\xc9\xbe\xe9\x56\xc4\x00\x00\xbd\x93\xa1\x20\x37\x9c\x52\xa5\xc2\xcd\x1c\x34\xef\xea\xf6\x58\xb7\xbe\xde\x94\xba\xaa\x6b\xd0\x5e\x2b\xc2\x8f\x86\xd8\xa5\x9e\x17\xb9\x91\x58\x89\x98\x9e\x0c\x68\x4a\x47\x9e\x5e\xcd\xc5\xc7\x55\xa5\x07\x5d\xdd\x30\x2a\xd1\x89\x73\x30\x6e\x1f\x6a\xa7\x22\xbb\xbc\xcb\x08\x50\x3a\xc8\xb1\x04\x25\xd3\xe5\x60\x4b\x58\x95\x60\x01\xde\x85\x02\x4f\x60\xa7\x53\x25\x8b\x18\x95\x83\x57\xe3\x45\x21\xf5\x6b\x17\xba\x6d\x0e\x50\x9a\xf9\xdb\x94\xc5\xb1\x46\x8a\xcf\x02\x93\xe3\x93\x3c\x2c\x8b\x53\xcb\x64\xcf\x7d\x90\x6d\x7d\xce\xd4\x97\x64\xb1\xca\xf0\x61\xff\xe7\x68\x9e\xe1\xa6\x41\x1a\xf8\x95\xcc\x8b\x8f\x09\xd4\xf4\x6f\x4b\x37\x25\x23\xa9\x21\x3e\x9c\x3d\x1e\xf0\x25\x6f\xbe\xe6\x4d\x5b\xcd\x3b\x0d\x19\xb1\x42\xc8\x00\x1a\x69\xe0\x0a\xca\x0a\xf1\x3b\x79\xb5\xdc\x47\xcd\xa8\xef\xcf\xfb\xc7\xe7\xf4\x7b\x67\x43\x88\xe5\x3d\x96\x36\x28\xfa\x87\x39\x9c\x51\x99\x86\x2e\xa8\xf3\xd1\x70\x45\x9b\xc5\x68\x3a\xa3\x56\x62\xcf\x66\x75\x35\x36\xb4\x21\x19\x8b\x8c\xef\xcb\x6b\x28\xdb\x63\x7d\xac\x86\x43\x24\x25\xcc\x57\xc7\xc7\x5b\x7d\x38\x9c\x29\x8c\xa2\xc2\x75\x4d\x4e\xcb\x4d\x8a\x4d\x0b\x6f\xb2\xe3\xbb\xfe\x23\xcd\x45\x92\x25\x9c\xa0\xa2\x8c\x4b\x61\x77\x2f\xae\x7f\x3b\xbd\xfb\x89\xa2\xb8\xdd\x6e\xb6\xab\xa7\xdb\x9b\x2f\x5f\x43\xa4\x9a\xa5\x42\x39\xf5\x59\xb9\x87\xaf\x55\x33\x5b\xd7\xb2\x54\xba\xf2\x42\x17\x3e\x74\xdf\x79\x27\x7f\x0e\x66\x98\x24\x13\x7e\xca\x85\x05\xbc\xfb\x69\xa3\xac\x20\x13\xa9\xc1\xf9\x7d\xe8\xed\xe8\x1e\xa1\xde\xc8\xb6\x6a\x5e\xf2\x7e\x4c\x66\xb0\xf8\xb0\x81\xa2\x70\x78\xdb\x33\x3d\x81\x30\xde\x70\x44\x22\x78\x7a\xee\x26\x7f\x2e\x65\x7b\xac\x61\x85\xdd\x6d\xb9\x4c\xf4\xf5\x9f\x95\x84\x3b\xfd\xbb\x2e\xbb\xbd\xaa\xca\xa9\x85\xf5\xbf\xc8\x90\xba\x8b\x7f\x4f\x1b\x70\xff\x22\xff\x0e\xe7\x10\x0a\xa3\x6f\x34\x5e\x1f\x83\x69\x33\x69\xa2\x40\xf6\xdb\x95\x6a\x36\x05\x95\x96\xa9\x83\xc5\x3f\xd6\xb0\xcf\x8f\xfb\xd9\x13\xd2\xb1\xc3\x39\x38\x7d\x26\x93\xb7\x17\xd5\xbc\xd8\x95\x99\xd8\xa9\xbf\xe3\xfc\x5c\xcd\xec\xac\xa6\xa7\x33\x4c\x61\x9c\x91\x37\x3d\x9a\xf6\xa6\x6c\x72\x03\x4f\x63\x27\xfd\xe5\xe8\x35\x33\x32\x46\xf7\x78\x8f\x67\x72\x9d\x59\xd2\x5f\x85\x4e\x0c\x96\xb1\xf3\xe7\xe7\x8f\x6d\x35\x09\x6c\x33\x03\xa0\x06\x67\xbf\x6f\x87\xaa\xc6\x78\x1c\x8d\x95\x51\x39\x78\x6e\xd2\x3a\xbd\x4b\x20\x15\xb6\x92\xc7\x98\x88\xfe\xe7\xdb\xd8\x20\x15\xf2\xd8\xc0\x84\x81\xec\x0e\xcb\x38\x32\x22\x0d\x15\x33\x74\x7c\x5c\x3b\xc0\xc3\x2f\x61\x80\x20\x26\x0e\x90\xd1\x40\xaa\xbf\x94\x87\x1b\x5d\x3d\xbe\xc8\x06\xb6\xef\xd5\x23\x6a\x56\x4c\x4a\xa9\x12\xa5\xf2\xf0\x56\xe2\x82\x77\x89\x4e\x29\xe1\x9c\x84\xc7\xa8\xc0\xf6\x86\xa6\x45\x63\x5b\x7f\x22\x49\x22\x82\xe4\x56\xb7\x30\xb9\x1b\x85\x25\x97\xe9\x85\x13\x2d\x30\x77\x7e\xfd\xd0\xa8\xaf\x33\x23\x0b\x76\x03\x5c\xe9\xf1\xfe\xe1\xd7\xdd\xc3\xbe\xcc\x9d\xc0\x55\xff\x35\x10\x23\x15\xfc\xe9\xf7\xd5\xfd\xc8\x3b\x95\x48\x62\x23\x44\x14\x3a\x6c\x55\xff\x8c\x24\x8d\x28\x36\x95\xf2\x32\x6f\x63\xe7\xd6\x15\x56\x0d\x3f\x82\x81\x13\x41\x30\xd0\xa5\xbd\x0d\xf4\x2e\xb7\x8f\x75\xf5\xf3\xe3\xf3\xe8\x4c\x32\x10\x01\x7d\x3a\xd1\x94\xcf\xc2\xd9\x79\x92\x60\x69\xf3\x47\xf5\x31\x68\xd1\x10\xc9\x33\x90\xae\x8c\xb5\x2e\xdb\xbc\x2d\x10\x42\x7a\x59\x1c\x9b\xb9\x2e\x27\x91\x5c\x47\xd8\xd6\x72\xfd\xc0\x8d\x7c\x96\xa8\x4c\xe0\xcb\x68\x4b\x97\x37\x41\xa4\xc9\x84\x6a\x34\x50\x44\xfe\xca\x1e\x5c\x62\x85\x8b\xcf\xaa\x79\x3d\x41\xc5\x4d\xbf\x3b\xb1\x04\x43\xac\x33\x0e\xc8\x67\x3e\x95\x12\xc9\x7a\x14\x31\xda\x5a\xfb\x74\x7d\x3a\x4c\x24\x29\x66\xcb\x2e\xea\x9c\xbe\xfe\x52\x48\x67\x77\xda\xed\x8c\xc7\xba\x74\xb0\x55\x6c\xea\x8d\xc0\xbf\x52\x92\x04\x71\x13\x28\xbf\x28\xdb\xeb\xaa\x3e\x35\xb7\xef\x46\xa5\x4c\x05\x7f\xac\x1a\x95\xe5\xa7\x8a\x08\x61\x5c\x42\x83\x59\xc5\x55\x88\x2b\x46\xef\xa4\x94\x99\x03\xd8\x1c\x4b\xb4\x6c\x5e\x9e\x11\x8a\xb9\x5f\x15\xf6\x3f\xe7\x4c\x31\xfd\x22\xa5\x18\x52\x38\xef\xf2\xa1\x2f\x26\xb5\x88\xd1\xef\xeb\x76\x64\x7d\x4b\xa4\x56\x12\x27\x4a\x5f\x83\xbf\x43\x77\xf8\xfe\xb0\x4e\xb0\x08\xf9\xe5\xde\xa5\x9c\xeb\xa7\x4b\x12\x7d\x56\x40\x95\xda\xa8\x10\xb0\xad\xca\x8f\xaa\x84\xb9\xfb\xa7\xbf\x35\xa3\xbb\x0c\x82\x62\x11\xb8\xad\x83\xcd\xcc\x99\xa0\x49\x82\xd0\x46\x0f\xbe\xac\x2e\x0f\x99\x0d\xd1\x04\x99\x6d\x8f\x75\x5e\xb6\x52\x15\x1e\x00\xb8\x9c\xac\x4c\xa3\x2c\x7f\x06\x4b\x5c\x5d\x7c\x2f\x9b\x66\x2e\xf3\x78\x5a\x90\x56\x11\xa3\x02\xfd\xf5\x6e\x9e\xae\x9e\x1e\x1e\x77\xab\xab\xab\xa7\xf5\x26\xf4\x03\x54\x94\x49\xed\xb9\xc3\x75\xde\x7e\xa0\x9f\x7d\x38\x46\x89\x74\x55\x80\x2e\x5b\x1f\x87\x2a\x8a\xd2\xcc\xc9\x27\xdc\x6d\xa7\x4c\xef\xc9\x8f\x55\x54\x51\x04\x22\x5d\xe5\x6f\x43\xe7\x4f\x31\xc5\x11\x3f\x9f\x37\xb7\xd5\x73\x85\xfe\xa8\xfd\x22\xab\x78\x2c\x6c\x70\x53\x41\x3a\xf1\x99\x05\x68\x79\x3b\x53\x1c\x34\xc2\x2e\x6a\xd9\xc2\xaa\x7c\x86\xa2\xb9\x92\x1f\xbd\x6d\x12\x51\x89\x50\xca\x8e\xf5\x40\x9b\x9b\x16\xf6\x41\xe4\x67\x32\x4d\x55\x02\x16\x99\x0d\x97\x4f\x95\xbd\x93\xaf\x50\x5f\x38\xc5\xa3\xe5\x87\xaf\x12\x4b\x30\x6b\xc7\x1b\x72\x22\x9e\x7b\x5a\xd7\xf4\x0b\x94\x4a\x23\xc5\xe2\x60\xe3\x52\xda\x3c\xf4\x23\x16\x53\x6d\x95\xc6\x0c\x41\x05\x6e\xd3\xbd\x7c\x01\xfd\x8a\x79\xdd\x72\x08\xab\x52\x26\x53\x08\xa1\x38\x82\x1e\xce\x3a\x7c\xf6\x33\x46\xf0\x14\xd5\x3d\x1d\xbd\xb0\x7b\xe1\xba\x9d\x35\x0e\xb7\x30\x13\x1c\x9b\x39\xb2\x3e\x0d\xdf\x96\x1f\x8a\xa4\xae\xfc\x5a\xc2\xcf\x16\x2b\xdb\xf1\xe0\x62\x1d\x86\x24\x56\xf8\x52\xb4\x4f\x15\xd6\x65\x5b\x9f\xf0\x00\xc2\xe8\x94\xe1\x09\xe1\x67\x0b\xa5\xf1\x56\x1a\x23\x95\xd8\xf9\x70\x91\x32\xe2\xeb\xa3\x93\xf5\x68\x3e\x4e\x5a\xf4\x7e\x28\x64\xd3\x76\xd3\x72\x4e\x4e\x52\x8a\xb8\x69\x0f\x58\xc2\xaf\xae\x8e\x4d\x3b\x32\x71\x20\x4a\x71\x93\xf8\xbb\xbd\x7e\x70\x3b\xcd\xa9\x2d\x1c\x51\x4a\xb0\x84\x0f\xd4\x9c\xb0\x62\x8b\xa5\x05\x4b\x69\xdf\x07\xf1\x5d\xcf\x4d\xde\x07\x39\x0a\x04\x30\x18\x78\xff\x5d\xa4\xb8\x99\x6b\xe5\x12\x05\x00\x88\xde\xef\xb2\xf6\xb5\x6b\x42\xba\xaf\x0b\x32\xd2\x7e\x9c\xa5\x31\x5e\x95\x57\x46\xfb\x56\x3a\x60\x70\x38\x9a\x5a\xe4\x1a\xfd\xfd\xb8\x3f\x8c\x3a\xfc\xca\x66\x80\xe0\x3c\xa7\xca\xd8\x47\xe8\x73\x8c\xd7\x67\x10\x37\x65\xc1\x61\xd3\x30\x65\x7b\xcc\x75\x35\xe0\x15\x74\x94\x28\xed\x60\x02\xf0\x36\xd1\x88\xf0\xc7\x63\xe3\x54\x0b\xf3\x4d\x17\x7f\xde\xc3\xfb\x70\x04\xb4\x37\xea\x69\x8f\xb5\xa3\x74\xbb\x32\x4d\x18\x40\x04\x8b\xa3\xa0\xac\xaf\x8a\x5c\xcf\x3d\xdb\x88\x26\x19\xc5\xf8\xc6\xe6\x3f\xcf\x62\x4a\xc3\x50\xe9\xc0\xb0\x70\xc8\x1b\xc4\x26\x8d\xc4\xf7\x88\xa6\x26\xc5\x9d\x1a\x4a\xb3\x1b\x40\xb9\x9a\x89\x2c\xf5\x38\xb5\xd5\xb1\xad\xea\xc7\x5c\xe3\xdd\x9b\xdc\x1f\xcd\xb2\x04\x83\xe1\x9b\xb2\x39\x06\x5b\xce\x6b\x38\xb3\x03\x6b\x96\xb9\x50\xf4\xe2\x21\x94\x95\x74\x42\x05\x96\x0e\xf1\x06\xfe\x8f\x3a\xaf\xe1\x14\xc6\x61\x27\x9e\xa1\xed\xf2\x47\x2d\x6b\x73\xa8\x1a\xb2\xbc\xec\xe8\xc4\x32\x1c\x1d\x40\xc1\xb7\xeb\xef\xeb\xdb\x5d\xc0\x7b\xea\x34\x36\x59\x10\xea\x2f\xaa\x12\xcc\x13\x1c\xaa\xfe\x60\x62\xb0\x71\xbd\xcf\xcb\xf6\xb2\xaa\x8a\xab\xea\xbd\x7f\x1e\x29\xa4\xd2\x75\x21\xfa\xba\xb0\x16\x3c\xcb\xe2\x49\x2d\xa4\x5b\xb2\x46\xbf\xf0\x74\x53\xd4\x59\xc4\x71\x53\xec\xd2\x0b\xff\x38\x91\x71\x35\x7f\xa8\x19\x37\xa1\x84\xfb\x55\x16\xed\x8d\xae\x46\xc0\x2a\x9d\x65\x29\x6e\x64\xdb\x9b\xcb\x5f\x77\xdb\x9b\x1e\x3a\xac\x33\xe0\xd4\xf9\x84\x43\x73\x6c\x66\x33\x56\xf2\x2c\x63\x23\x24\xe6\x27\x0c\x00\xad\x01\x22\x5f\xae\xb8\xaf\x5a\xb8\x0d\x9a\xfc\xc3\x08\x13\x59\xe7\xaa\x15\x24\x24\x67\x87\x75\x0c\x7e\x45\xda\x40\x69\xbe\x54\xe6\x8f\xd9\x08\xe0\x02\xbb\xc0\xbd\xa3\xf3\xa4\xef\xa3\x81\x5b\xed\xb8\xa0\x4e\x62\xb4\xbb\xb7\xae\xa4\x73\xe6\x92\x21\x25\x62\xd8\xa0\xc6\x25\xea\xfe\x94\x42\x22\x69\x27\x14\x45\x37\x23\xa2\x9e\x1b\x62\xa2\x58\x60\x3f\xf1\xab\xdc\xe7\x63\xbd\x44\x62\x22\xce\xfb\x02\x5e\x9d\x8f\xdb\x60\x26\xe2\x66\xb0\xd0\xe9\x61\x34\x26\x4a\x0c\xe6\x4c\xf8\x4e\x6d\x2b\x74\xd0\x1c\x15\x0a\x4c\x9c\x59\xac\x7b\xb4\xd0\x04\xeb\x82\x1f\x79\x51\xdc\x57\x2d\xb6\x73\x3f\xfa\x84\x28\x9c\x30\xd6\x31\x04\x7f\x5b\x5c\x74\x67\x9e\x6e\xcb\xb9\x92\x89\x0d\xb7\x10\x6c\x67\x9a\xfc\xb9\xff\x49\x84\x6a\x08\xed\xbb\x6e\x95\xf1\x22\xc2\x9f\x22\x71\x0c\xb1\x6e\x65\xea\xf6\x2a\x97\x8a\x4e\x16\x37\x43\xbb\x18\xad\x7b\x2b\x6a\xf9\x8e\x2d\x97\x66\xd0\x09\x1a\x5e\x87\xe9\x6b\x6b\xa8\x72\x7a\x27\x3a\xaf\xb1\x3d\x94\x97\xcf\x0e\x55\xb5\xeb\x4f\x6b\x0d\x3e\x3b\x75\xac\xcb\xbb\x7e\x17\x30\x8c\x01\x0f\x7b\xcc\x05\x8c\x36\xce\xc9\x42\x66\x58\x66\xb0\xbb\xb7\x73\x1d\xd6\xaf\xb9\x77\x1c\x1e\x91\x62\xfd\x48\x4e\xac\x63\x22\x3a\x3b\x24\xcf\x64\x5a\xd2\x21\x23\x86\x67\x0e\x79\xef\x73\xef\x00\x67\x9d\x9d\x31\x49\x1c\xe2\xea\x45\x36\x1b\xfd\x02\x7b\x39\xbb\xb6\x04\x9c\x75\x38\xc6\xee\xbf\x9d\xcc\x5a\x93\x58\x47\x92\xf3\x9c\xf9\x3f\xc6\x4b\xe8\xf4\xd1\xa4\x69\x16\xd8\xf5\xdf\xab\x16\xe6\xb1\x8e\x49\xb5\x7b\xde\xdf\x1e\x77\xef\x79\x39\xfe\x0e\x11\x45\x08\xdb\x30\x10\x38\x80\xbf\xc2\xc7\x04\xb4\x61\x44\xcc\x30\xc4\x70\x8d\xdb\x49\x41\xc6\x64\x2c\xc5\x13\xbf\x55\xa7\x06\x44\x61\x48\x96\xe0\xca\x84\x35\x73\x27\x18\x6b\x3e\x6d\xc3\xcc\x7e\x9b\x4c\x0c\xe6\xa5\xdd\xb4\xbb\x92\x61\xcd\x36\x8a\x18\x2c\xb6\xed\x3f\xbc\x32\xef\xf4\x5b\x95\xa5\x18\x95\x5f\x06\x7d\x6f\x62\x34\x01\xa4\x01\xfe\xf7\x08\x47\x78\x94\x1f\x7b\x98\xbd\x96\xda\x6a\xe1\x57\x2e\xac\xbc\x21\x61\xf1\xf3\x8b\x33\x89\x2b\xee\x7b\x0b\xed\xd5\x21\xf7\x92\x9a\xc3\x9a\x6d\x4c\x46\x34\x1b\xd3\x1b\x1e\xfa\x49\x0c\x44\x5b\x57\x94\xb8\xed\xe2\xe4\xf6\xb1\x06\xdf\x51\x19\x63\x0f\xa7\xb1\x8b\xb1\x91\x42\xed\x13\x03\x87\x1a\xb4\x6c\xe1\xe2\x63\xa6\x00\x43\x8c\x65\xdc\x35\x40\x8b\xaa\x01\xbf\xbc\x4e\xae\x1c\x22\x49\xac\x4f\x4b\x7a\xf9\xd1\x8b\x31\x41\x0e\x22\x45\x50\xbf\xe3\xb6\x7a\xfe\xbe\x90\x7d\x7f\xbe\x7b\x43\xa4\x63\xe6\x2b\x8e\x53\xba\x07\x44\x86\x23\x65\x62\xf5\xdf\xa3\x1c\x2f\xb4\x10\x47\x14\xdb\xd1\xfb\xaa\xec\x76\xa9\xeb\x02\x46\xae\xc8\x04\x62\xea\x7c\x7a\xbb\x1f\x5d\xe8\x00\x5d\x6c\xce\x86\x25\x40\x12\x8d\xdd\xe1\x3a\xd7\x2f\xd0\x93\x51\x80\xe8\xbe\x61\xf4\x04\x16\x6a\xa8\x97\xa4\x86\x08\x10\xeb\x5c\x6e\xd6\xb5\x26\xd1\x76\xd4\x22\xf7\xc7\x29\x89\xbd\xd0\x22\x16\xe5\xaf\x40\xa3\x0b\x5f\x38\x4a\x0d\x76\xce\xbf\x7e\x98\x7a\x82\x58\x06\x96\x29\x24\x1f\x23\x19\x46\xe7\xed\xc7\x74\xb7\x06\x06\x36\x49\xc6\x7d\xcb\x45\x85\x6a\x02\xcc\x26\xe8\x21\x62\xaa\xb0\xe5\x9d\xad\x16\x4d\x7f\x58\x42\x9d\xe1\xc0\xea\x26\xc4\xbc\x90\x70\xf7\x5b\xaf\xf2\xe7\xbc\x95\x05\x42\x3a\x3e\x2b\x6a\x40\x22\x39\xd6\x1d\x6e\x6f\x2e\x97\xc7\x8d\x03\x7d\x48\xa4\xb3\x77\x7a\x94\x1f\xce\xe5\x77\x02\xdd\x82\x94\x65\xc8\x4d\x58\x3f\x5d\xc6\x09\x1f\xae\x4a\x10\x86\x25\xef\x1f\xe0\xc8\x79\x7f\x29\x6e\x04\x61\x9c\xf5\x48\x70\x9f\x1a\xab\xf1\x7d\xfa\x36\x43\x96\x3a\x2a\xdb\x8d\x37\xf9\x5c\x37\xed\xb0\x54\x42\x26\x00\xeb\x28\x26\xb7\xf6\x2e\x2f\x8f\x0b\x89\x6d\x18\x99\x01\x6e\x6a\x88\xf0\x9c\x59\x80\x2f\x3f\x92\x4c\x9a\xc4\xbb\xd6\x1d\x64\xab\x5f\xce\xf1\xe5\x21\x33\x1c\x9b\xd3\x52\x6b\x38\xb4\x17\xf9\x19\x56\x28\x28\x96\x62\xdb\xea\x29\x7f\x7e\x69\x57\xa5\x79\xaa\x0a\x68\xe6\xd8\x34\x50\x52\x48\x27\x4d\x6d\xf2\x01\xb2\xd5\x2f\x3b\xfd\x1a\x06\x3a\x4d\xb1\x2a\xff\x9f\x2a\x2f\x1f\xab\x29\x7a\x1d\x0c\x49\x5c\xe5\x1b\x21\xe9\x0e\x45\xf1\x89\x12\x42\xf8\x14\x73\x81\xee\xe3\xb1\xae\x7e\xfe\x39\xc8\x1e\x80\x92\x94\x07\xd4\x53\x5b\x6d\xfa\x1e\x0f\x00\x75\x12\x18\xdd\x52\x56\x14\x53\xa7\x32\x02\xc0\x23\x04\xb1\xad\x8b\xbc\x9d\xe8\x9c\x00\x24\x12\x85\xf7\x02\x0f\x66\x71\x57\x0a\x63\x2d\xc3\x1e\xdf\xb7\x5f\xfb\x4f\xdb\x14\x45\x32\xee\x64\xd3\xe4\x6f\x50\x7c\x20\x1b\xeb\x80\x25\x9e\x87\xb2\x0b\x8c\x47\xbd\x2c\xb0\x54\x30\xbf\x43\x5f\x74\xf3\x21\x87\xe6\xe2\x63\x51\x0b\x05\x2c\xa3\xda\x59\x47\xe9\xaa\x36\xe7\xf4\xe2\xce\x14\xee\xc2\x39\x38\x89\x61\x14\xf1\x3b\x04\xe0\x24\xec\x1f\x3d\x5d\x9b\x68\x07\x73\x0e\x18\x9d\x90\x79\xce\xaf\x4c\x19\x8c\x5b\x55\x37\x45\x43\xe0\x3a\x97\x7a\x0b\x93\xcb\x46\xdc\xe1\x28\x9e\x51\xce\xad\xcc\xcb\xe7\xb1\x14\x6b\x7f\xad\x36\x12\x1c\xcb\xb0\x18\x1f\xf4\x48\x9b\x5f\xc2\x51\x9d\x51\x27\x04\xf2\x71\xd3\xc2\xfe\xa4\x7c\xbe\xb0\x38\xd9\x58\x59\x69\x42\x09\xaa\xdb\x42\x9c\x04\xe8\xec\x7b\x63\x30\x99\x5b\x87\xdb\x87\x12\x6b\x82\xb2\x38\x4d\x0c\x2c\x89\x9c\x32\xd1\x4b\x5e\xb6\xdf\x9e\x6e\x67\xc4\x98\x7e\x90\xca\x74\xe0\x3f\x1e\xaa\x7a\x8e\x05\xf1\xc3\x58\x4c\x63\xe6\x1b\x50\x79\x79\x84\x71\xd1\x7b\xf6\xb5\x5c\x44\x68\xb6\x8d\xcd\xc4\x9d\xea\xe6\x4c\x80\x71\xd8\x84\x47\x98\x81\x01\x2a\xd5\xc0\xc2\x2a\x30\xfb\xde\x84\x3b\x27\x9f\x26\x28\xb6\x43\xbd\x7a\x1e\x4f\xf6\x61\x32\x58\x41\x9d\x55\x61\xc8\x95\x50\xc6\x69\xfc\xde\xd8\xcc\x1a\x4c\x65\xbf\x7e\xfd\xb2\xdd\x7e\x09\x7f\x95\x52\x21\x50\xcb\x42\xab\x5f\xb0\xdb\xd1\xc5\x25\xdd\x4c\xba\x83\x6e\x0a\x0f\x82\x38\x93\x49\x65\xa5\xce\x92\x1e\x91\xfd\x55\x36\x97\xf2\xb4\xc9\x12\x86\xda\x18\x1c\x85\xe1\xad\x7a\x05\x17\x69\x8d\xa8\x64\x67\x3e\xa5\x22\x8d\x88\x48\x39\xce\x32\xad\xea\xe2\x10\xf7\xc4\x7e\xcd\xdb\xf6\xe3\x0b\xb4\x0f\xf5\x7d\x35\xdb\x64\xad\x8e\x9d\x98\x4a\x77\x75\xc6\x1b\x23\xcf\x87\x10\x81\xf1\xdd\x76\xf5\xb8\x7b\x7c\xb8\xbd\xdd\x5d\x7d\x7b\x5a\x6d\x6f\x1e\x42\xa7\xcc\x6a\x22\x1d\x44\x56\x1d\x97\x4d\xb5\x88\xd5\x34\x26\x69\x88\xb1\x91\x1e\x11\xac\xa1\x67\x5f\x66\x32\x63\x9c\x67\x41\x17\x8a\xec\xae\x40\x17\xb2\x0e\x9c\x8a\x81\x9b\xfd\x69\x93\xdb\xda\xd8\x8e\xc8\x12\x57\xf0\x06\x6f\xd5\x01\xea\x95\xee\xe6\xe5\xec\x0b\xad\x8e\x54\x34\x71\xd9\x0b\x7d\x63\x68\x1e\xec\xed\xe9\x8b\x4f\xa3\x98\xbb\x56\x5b\x58\x7c\x50\x04\xf1\xb4\xf3\xee\x47\x93\x58\x8b\xb4\x57\xcd\xc7\xe4\xec\x4d\x4e\x45\x9d\x69\x44\x48\x42\x83\x25\xa5\x93\x5a\x98\x54\xbb\x68\x44\x74\x22\x1c\x16\x20\x74\x48\x69\x44\xe3\x0c\x5d\x57\x7d\xf9\xc9\x35\x1a\x3e\xdb\x87\x69\x44\x49\x22\x9d\x74\x5e\xf3\x72\x92\xd1\xd1\x88\xda\x04\x0b\x29\x98\x74\x76\xef\x45\x88\x1c\xfd\x71\x26\x62\x33\xc8\xa2\x3e\xd6\xd0\x38\xd0\xf5\xf4\x2c\x4c\x70\x34\xf0\xa8\x31\xcf\x84\x81\xe7\xd1\x1d\x92\x6c\xc0\x03\x7b\x0f\x9e\x93\xa5\x7f\x6c\x85\x32\x42\x20\xd0\x88\x19\xa0\xa1\xef\x06\x48\xe8\x83\x37\xa8\x1d\x33\x61\x69\x2a\xd0\x88\x0b\x29\x4d\x40\x70\xa2\x23\x90\x2c\x73\x0b\xb3\x60\x93\x46\x5c\x19\x2c\x25\x6c\xeb\xaa\x7c\xee\x4b\x61\x34\x4a\x22\x95\x88\x00\xfb\xaf\x61\xcc\x88\xa2\x51\x42\x62\xe1\x31\x57\xdf\xf3\x46\xde\x82\x3d\x6b\xed\x17\x3e\x21\x4c\x50\x5d\xf3\xaa\x22\x5b\xf8\xd9\x06\x2c\xc5\x6c\x52\xa4\x11\x61\x76\x62\x3a\xe5\x95\x4d\xe6\xc3\x24\xd6\x91\xef\x56\xf7\x5f\x57\xdb\xed\xea\xfe\xf1\xe9\xe1\xb7\xdf\x9f\x6e\xbe\x5f\x3d\x85\x0b\x4d\x63\x1a\x8a\x5e\x97\x97\x5f\xbd\xc5\x15\xed\x8f\x32\x8e\x39\xf2\xae\xdf\x1f\x7d\xf6\xb8\xad\x26\xe2\x47\xc3\x2a\x4a\xa3\x94\xf7\x36\xfc\x97\x55\x13\xa2\x91\xee\xef\x06\x45\x6b\x60\x9f\xa3\x66\x73\xf7\x92\x3f\x75\x3f\xee\x1b\x16\xaf\xcc\xfc\xda\x05\x8b\x93\xc1\x53\xe0\xc1\xce\xa2\xc9\xd9\x68\xa9\xa5\xf3\x5b\x39\x7c\x9c\xd6\x5e\xc2\x20\x2b\x90\x86\xbb\xa9\x0a\xb3\x58\x08\x1c\xef\x6c\x34\x12\x54\xe0\x33\xd4\xd5\xfe\x50\x35\x70\xf6\xb4\x59\x94\x21\x20\x73\x17\xd2\x96\xd5\x79\x73\xb4\xf0\x91\xc4\x69\xff\x1f\xbc\xf8\x7a\x6f\x80\xdd\xdf\xad\x2c\x23\xd8\x07\xcd\x75\x75\x27\x7f\x8e\x09\xd3\x34\xca\x74\x6a\x3d\x29\xf9\x56\x36\xed\x26\xff\xd9\x02\x94\xde\x97\x7a\xfa\x45\x32\x15\x4e\xe5\x63\xf5\xdb\x6e\x73\xb3\x5d\xef\x9c\x58\x51\x48\x34\x68\xa4\xe2\x14\xf5\xaa\x9e\x1e\x1e\xd7\xfd\xdf\x24\x41\xac\xe4\x89\x1e\xd0\xf8\x85\x53\x5a\xe3\xea\xf8\x8f\xdb\xd5\xfd\xe5\x9a\x84\xcf\x6a\x9a\xb8\xb2\xc0\xb1\x7c\x86\xaa\x74\x7d\xbf\x53\x5f\x69\x1a\x69\x1d\xc7\x0e\x0a\x81\xc8\xab\xcd\x11\xf7\x34\x7b\x2c\x76\xfd\xa9\x40\xeb\xb4\xd7\xa3\xfc\x65\xfc\xea\xfb\x6c\x9f\x46\x86\x45\x5e\x41\xba\xad\x3f\x9c\x6c\xf8\xec\x7b\x4c\xc6\xd0\x67\xf3\xf1\xee\xeb\xa2\x4e\xf6\x49\xbc\x4d\x23\xa0\x11\xaa\xeb\x35\xc7\x03\xd4\xbb\x45\x9f\x9b\xe5\xc7\x0a\x89\xca\x44\xe0\xac\x3b\x7d\xca\xbc\x7c\x76\x04\x81\x4b\x79\xf0\x1a\x39\x5f\x65\x6d\x7a\xa0\x3d\x8d\x20\x8b\xc4\x20\xb8\xb2\x2a\x8a\xcb\xea\xb5\x5f\x15\x41\x5a\xe9\x25\x46\xb6\x83\x83\x7c\x38\x6a\x79\x1a\x0d\x02\x0b\x0b\x9e\x2b\x34\x8e\x62\xcb\x92\x9e\x82\xda\x87\x5c\x7e\x89\x59\x7e\x9b\xe2\x38\xb2\x84\xf6\xe7\xc5\x20\x61\x76\xda\x98\x10\xac\x7e\xc1\xcf\x17\x79\x6c\xda\xcb\x97\x5c\xe5\xcb\x39\x61\x37\xd6\xc9\x3f\xee\x90\x57\xf1\x73\x7e\xa6\x2c\x42\x00\x87\x73\x93\x9d\x4c\xf4\x38\x96\xc2\xfa\x1d\xf8\xdb\xa1\xa8\xa4\xb9\x47\x95\xc7\xe9\x09\x08\x89\x18\x0d\x0d\xbe\xfd\xa1\x85\x1d\x8b\xc6\x59\x1a\x8d\x29\x61\x68\x66\xd6\x3f\xca\xab\xfc\x2d\x5f\x2e\xa9\xd3\x98\xa6\x06\x4f\xd7\x3d\xc3\x5d\x5e\x36\x50\xb7\x3b\x9b\xbb\x62\xf1\xd7\xbc\x6c\x1f\x6b\x78\x7b\x42\xd8\xa8\x71\x0b\xd7\x57\x90\xe6\x97\xe9\x29\x84\x73\xb1\x38\x74\xd9\xcb\x8e\xef\x06\x15\xea\x31\x03\x84\xc6\x34\xe3\xd4\xe1\x85\x0c\xfc\x9c\x68\x34\xd1\x98\xc5\x16\x5b\x71\x5d\x7e\xf1\x28\xf3\xfa\xba\xaa\x83\xfe\xc8\xb9\x52\xc7\xb0\x06\xc7\x8c\x4b\xac\xbf\xfe\xc8\x0b\x73\x7d\x1c\x0b\x85\xd2\x98\x65\x04\x73\xc6\x6e\x7f\xfc\xa8\xca\x2e\x12\x97\xaa\x77\x0b\xa1\x31\x53\x1a\x95\xd4\xae\xbf\xdd\x5f\x79\xb2\x4c\x38\xc4\x53\x81\x1d\x21\xff\x0e\x06\x4a\xc2\xe4\x95\x8c\xb9\xe4\x31\x0d\xc8\x16\xac\xa9\x8c\xc0\x7c\x34\x4e\x94\xc1\x75\xe3\xb2\x42\x01\xac\x7c\xa1\x69\x4b\xe3\x54\xb8\x36\x42\x17\x6c\x84\xcd\x28\x4e\xb5\x83\x5d\xe5\x0d\x76\x09\xc0\xcc\x5b\x01\xd3\x07\x99\x5a\x95\x3a\x72\xc9\x7e\x0e\xe9\x5b\xfe\x80\xa4\x09\x0a\xa6\xaf\x2f\x2e\xce\xb7\x89\x68\x2c\x45\x8c\x45\xc8\xde\xda\x0b\x8b\x5f\x17\x72\x46\x5e\xa0\xb1\x34\x16\x67\x6f\xdf\xec\xc9\xcb\xa9\xce\x17\x8d\x15\x75\xbc\x19\xeb\x34\x5a\x66\x77\x41\x19\xe6\xc2\x6b\x5c\xb3\x6f\x6f\xee\x6e\xb6\xe1\x83\x86\x1b\xef\xdf\x2b\x8d\x17\x32\xed\x0f\xa5\x8c\xc4\xa3\x40\x6a\xea\x3f\x3f\x0d\x82\x62\x93\xa5\x14\x42\xb5\xd4\x17\xf9\xa6\x8f\x13\x62\xe5\xfb\xe7\xa5\xf1\x88\xc5\x55\x69\x7a\x17\x81\x33\x37\x09\x20\xd6\x62\x8c\x37\x3c\x6d\x52\xff\x79\xb3\x9a\xc6\x96\x38\x37\x45\x74\x98\xdb\x6d\xb6\xab\x2f\xeb\x41\xf4\xa1\x3b\x9c\x52\x1d\x10\x71\x3f\xfd\x3e\x73\xf1\xb1\xfd\x38\xcc\x27\xa5\xa5\x2a\x96\xbd\x20\x7c\xf7\x1b\x26\x0b\x8d\x4d\x1d\x8f\x5f\x1d\x9f\x91\xa8\xff\x86\xd2\x20\xe1\x60\x66\x52\x4f\xbe\x45\x87\xf0\x4f\xe3\xb8\xd8\x6a\x40\x26\x6f\xf7\xc0\x51\x9c\x6f\xc6\xb5\xa5\x24\xb2\x10\x02\xcf\x6f\x0d\x98\x8b\x8f\x4d\x65\xdb\x77\x59\xc3\x6c\x5c\x9c\x24\x0e\x7b\x54\x95\xed\x4b\xf1\x11\x2a\x13\x88\x17\x1e\xe9\x59\x51\x12\x5b\x81\x92\x69\xa5\xdc\xe7\x58\x8a\xd9\xe4\xcf\xe3\x66\x05\x25\x44\x38\xb9\x17\x17\x9d\x6f\x5c\x1e\x71\x21\xcb\xa9\xbc\x9a\x1f\x4c\xa5\xe4\x7c\x00\x02\x5f\x41\x01\x7d\x08\x7a\xf2\xa0\xfe\xf6\x09\xec\x94\x12\xaa\x35\xf5\x6b\xc1\xaf\x65\xf5\x8e\xf4\xd5\x4d\x5e\x6a\xe8\xe2\x96\x6f\xcd\x94\x05\x4b\x09\x05\xe7\x4e\x7f\x73\x7f\xb3\xbd\x41\x39\x84\xa7\xab\xb1\xbb\x20\x25\xd4\x3a\x45\x12\x07\xdc\xdf\x1c\x15\x2e\xe5\x27\x01\x32\x61\x51\x9a\x4e\xa4\xe1\x10\xe1\x72\xd2\x2e\xa0\x84\xc5\x4e\xc8\xdf\x65\x95\x5f\xaa\x22\xf8\x2a\x53\xc2\x4c\x84\xd5\xea\x10\xfb\x7e\xaf\x5a\x18\x21\x50\x28\xe1\xb1\xec\x7d\x95\xf2\x65\x58\x16\x25\x5c\x01\x36\x71\x54\x2e\xdb\x97\xa2\x2a\xfb\x4d\xe8\xf3\xd5\x88\x24\x71\x84\x2d\xb0\x6d\xbe\x87\x2e\xfc\x2e\xc2\xb7\x26\xa9\xc6\xdc\xee\xf2\x66\xfb\xbb\x13\x00\x9b\xde\xa2\x44\x39\x2e\xfa\xc8\xa3\x29\x1c\xd1\x2e\x58\x3a\xb6\xd6\x89\xec\x7a\xcb\xa2\xf1\x66\x49\xd2\x38\xc3\x3b\x8c\x25\x4d\x07\xd5\xf8\x4c\xdc\xd5\x7f\x4a\x10\x86\x52\x70\x2b\x2c\xce\x82\x59\x1d\x0e\x85\x17\xc8\xff\x34\xc8\x26\x59\x2c\xb2\x9e\x63\xbd\xf2\x44\xc8\xc0\x18\xbf\x70\xb5\x9f\x33\x49\xe0\xbc\x1e\x86\x80\xcd\xf9\xd8\xe9\x04\xcb\x58\x12\x7b\xc9\x94\xc7\x5c\xbf\xca\x9f\x33\xc5\x42\x4a\x64\x24\x1d\x07\xd4\xdc\x0c\x33\x41\x0a\x47\xb6\x0b\x01\xf1\x43\x79\x01\x2f\xb2\xb0\xb3\x1a\x05\x25\x52\x2a\x5c\xf2\x5f\x64\xb3\xf3\x9a\x3d\xbb\xb6\x7b\x80\x30\xa8\xb5\x53\xa2\xbc\x70\x8b\xeb\xda\xbb\xe4\xf3\x09\xfc\x3c\x5e\x5c\x08\x89\x8a\x1d\xb8\xcf\x56\xc7\xba\x75\xda\x6e\xeb\xed\x65\x7f\x42\xca\x22\x1f\x25\xee\x86\xbe\x11\x25\x2a\x61\x58\x68\xf6\xaf\x7d\xf7\x44\x57\xc8\x4e\xba\x5a\x50\x75\x0a\x9f\xd1\x09\x4e\x92\xa9\x21\x7f\x38\x08\x91\x70\x8e\x3a\xfa\xb5\x0b\xb7\x8e\x65\x7b\x27\x7f\x86\xaf\xd3\x91\x13\xcb\x43\x6b\x77\x59\xf4\x7e\x38\x48\x31\x19\xaf\xb7\x44\x2b\xcd\xfd\x7a\x94\x97\x23\xdb\xe6\x70\x58\x5b\x5c\x36\x8c\xfc\xe8\x49\x83\x94\x68\x2b\x9d\x63\x7e\xb5\x87\xe2\x42\xaa\x91\xf8\x09\x25\x46\x49\xf0\x35\xf2\x6d\x3e\x5a\x73\x67\xbf\x0e\x22\x11\x92\x76\xa7\x2d\x18\x94\x58\x28\x01\x95\x21\xdd\xe3\xf2\xf2\xb7\xbf\x04\x6f\xa5\xc4\xca\x14\x8b\x91\x9b\xef\xe3\x2b\xb1\x3a\xc6\x4a\xc4\xfb\x8b\x6c\x9f\x06\xbd\x58\x4a\x63\x06\x18\x86\x36\x68\xdc\x11\xfe\x4a\x74\xe2\x24\x64\x4c\x17\x4d\xe4\x0d\x62\xc6\x42\x8f\xd6\x8f\xa1\xdc\x44\xcc\x41\xe1\xbe\x54\xa1\xd1\x46\x29\xcd\x64\x20\x8e\x3e\x55\xaa\x72\xcf\x23\x90\x07\x27\x13\x93\x52\xc3\x32\x8f\x1d\x47\x3a\xf1\x63\x95\x97\x33\x00\x0e\x0e\x42\x1d\x9d\x7f\xe6\x45\x01\x75\x7e\x0c\x9e\x26\xe3\xf0\x91\xb2\xd4\x09\x1c\x75\x31\xb1\xf7\x8b\x31\xf0\xf3\x7a\x00\x55\x2f\xbe\x79\x94\x41\x8a\x4d\xc1\xeb\xd5\xed\xe5\xc3\xfd\xf2\xd3\xa1\xdc\x38\xb7\xdd\x6f\x9b\xf5\xd3\xee\xcb\x7a\xbb\xbb\x7c\x7a\xf8\x71\x85\xa0\xa6\x11\x00\x9f\x52\x0e\x31\xc2\x5e\xba\x57\x2b\xe8\xb4\x84\x63\xa9\xc7\xc8\xf9\xb2\x76\xfe\x07\xfc\xf2\xe7\x34\x77\x4a\x53\x29\x11\x7f\xda\x7c\x34\x2d\xec\x57\x0e\x96\x17\xb8\xa9\xfd\xb9\x81\xa2\xfb\xc1\xd8\x5c\x6c\x70\xcd\xf7\x83\x04\x50\xc9\x7b\x55\xfc\x9b\xb2\xbd\xce\xa1\x30\x21\x41\xa6\x19\x57\xae\x07\xfc\xed\x12\xa9\xa8\xf8\xc3\x36\xfd\x51\xe1\xf9\xaa\x55\x51\x0c\xf7\x3c\xb3\x34\x72\x29\xe2\x5b\x3e\x14\x22\xa6\x4b\x04\x95\x51\x8c\x78\x0f\xa4\xac\x22\xda\xc0\xab\xf7\xfb\xee\x0c\x90\x53\x8c\x56\xf8\x28\x15\x18\x93\xbf\xc1\x4b\x0d\xff\x85\x9f\x79\xd3\x9e\x79\x8c\x32\xd1\xb2\xff\x92\x5d\x8d\x82\x87\xb3\x59\xa4\x44\x82\x13\xe4\xe6\xf2\xe1\xf2\x69\xbd\x0e\x95\x06\xaa\x24\x37\xc1\x1b\x35\x2f\x8a\x41\xe0\x8a\x52\xcd\x18\xf6\x7d\xf6\x3b\x44\x25\xba\x06\x77\xbf\x5e\x52\x9d\x00\x38\x2d\x9a\x63\xe9\x05\xdc\xfa\xd7\x47\x0b\x86\x11\xf4\x3e\x2f\x87\x0f\x18\x99\x46\xbe\x18\xb8\x48\x2e\x9d\x5e\xb0\xb1\x19\x72\x63\x9a\x16\x0e\x0f\xe5\x5c\x5e\x8a\x52\x48\x9d\x7f\x4b\x6f\xa7\x59\x85\x6e\xda\xe2\x5a\x4d\x41\xb8\x37\x3a\xf4\xaf\xc6\x52\xf1\x94\xda\x54\xe9\xe0\x41\xde\x9b\xd1\x6d\xda\xe0\x33\x4e\x19\xea\xae\xfd\xdf\xff\xf3\x7f\x5f\xab\x16\x8a\x2e\xe9\xfd\x6b\xab\x11\x8b\x88\xc4\x48\xe6\xb2\x38\xaa\xd0\xea\x98\xb6\x9b\x29\x8b\x12\x48\x3d\x9d\xd6\xb1\x94\x7b\x72\xd8\x99\x05\x93\xc5\xc2\x59\xa1\x36\xd0\xae\xdb\x97\x6d\x75\x09\x73\x47\x60\xca\x48\x9a\xf0\x24\x80\xad\xac\x3c\x16\x6d\x17\xd1\x3e\x41\x53\x15\xce\x47\xcf\xc9\x45\xf8\xd1\xd4\x70\x3e\x29\xab\xcb\x62\x84\x2c\xeb\x8e\xbb\x92\x87\x33\xf8\x29\xdf\x64\x9d\xcb\xb2\x2f\x23\x32\x16\x45\x84\x04\xa8\xca\x66\x52\x64\x1e\x65\xc0\x8c\x75\xd9\x9c\x87\x64\x2d\xe2\x63\x87\xcb\x4f\x22\x8b\xa2\x6c\x5e\x77\xc6\x27\x97\xe1\xfb\x12\xe9\x34\x66\xee\x56\xbf\xdd\xdc\xad\x6e\x77\x8f\xab\xa7\xed\xcd\xe5\xcd\xe3\xa8\xcf\x41\x59\xca\x62\xe9\x2a\x72\xad\xad\xea\xfd\x8f\x59\xe1\xcc\x8f\x12\xa9\xcb\x8c\x37\x37\x5f\x4e\xd5\x10\x28\x13\x22\x43\x5c\xca\xb1\xbc\xae\xba\x6b\x98\x4e\x53\x26\x32\x86\xec\xa2\x7d\x5e\xb6\x81\xea\x38\x94\x91\x98\x4c\x15\xaa\xbf\x36\xb2\x6a\x64\xc5\xfa\x3f\xeb\x14\x3b\x12\x4f\x0f\xb7\xeb\xdd\x97\xa7\xd5\xd5\x7a\xf7\xf8\xf4\xf0\xfd\xe6\x6a\x1d\x4a\xc0\x4c\x2b\x22\xbc\x85\x5d\xf7\x75\x43\x50\x33\xae\xf7\x31\x6d\x5c\x37\x44\x1d\xbd\x31\xc6\x97\xba\x7a\x6f\x5f\x6e\x73\x0b\xfd\x89\xac\x70\xd2\xbd\x61\xf6\x15\x47\xb5\x9c\x1f\x32\x13\x09\xd4\x7b\xbd\xaf\x2e\x1a\x47\x36\x0a\x27\x31\x54\x45\xe3\xe2\xe3\x36\x3f\x5c\x57\xf5\x15\xbc\x41\x51\xf5\x96\xb3\x94\x19\xe0\x08\x1f\x47\xa0\x75\xfb\xb2\x54\xfb\x62\x96\x73\x6c\xdd\xf7\xc5\xeb\xcd\xc0\x0e\x0c\x2d\x1b\x66\xb3\x34\x65\x23\xc7\xc3\x2e\x6f\xf3\xc9\xd3\xf4\xfe\x5b\x6d\xb9\x57\xd1\x73\xaa\xc8\x97\x8e\xe4\x64\x4e\xcc\xd6\x29\x8f\x94\x36\xce\xc1\xaa\xcb\xb5\xb0\xfa\x1f\x8e\x98\x08\xbb\x6a\x9b\xfc\x79\x49\x05\x89\xf2\x58\x24\x28\xe4\x9c\x97\x8e\x22\xf6\x58\xe7\x7f\x38\xe9\x9c\x91\x69\x13\xe5\x71\xe6\x74\x5a\xb1\x49\x7a\x9d\x97\xe1\x21\x70\x12\xc5\x01\xe5\x3c\x90\xf1\x3c\x81\x6b\x72\x7b\x38\x89\x78\x90\xcf\x7e\xbc\x71\x95\xff\x38\xea\x4f\x93\xb8\xe2\xc5\xed\xf5\xd5\x3d\x38\x83\x31\x7f\x84\xb2\x08\xcb\x24\x17\x79\x0b\x83\xca\x20\xe5\x2c\x75\x3e\x61\xd8\x2f\x9c\x95\x66\xc2\x10\x93\x20\xff\x45\x7a\x67\xf1\x62\x64\x99\x4a\x39\x8f\x88\xf5\x02\xa6\x97\xb2\x85\xe7\xaa\xfe\x58\xea\x25\x53\xce\xa9\xc0\x0b\xef\x9f\xab\xc3\xaa\x4f\xa6\xc0\xfc\x23\x2a\x8d\x7c\x17\x6d\x73\x90\x1a\xba\x0d\xdb\x29\xd6\x0e\x1d\x1d\x9e\x10\x47\x35\x76\xe1\xf2\xda\x67\x4f\x9f\x6e\x1e\x3c\xc9\x98\xf3\x41\xec\xf6\xe6\xea\xd8\x34\xad\x7c\x06\x33\xec\x6d\x3c\xb1\xe0\xfb\x77\x25\x34\x79\x83\x6b\xa1\xeb\xa6\x86\x11\x69\xe4\x44\xca\x5b\x27\x8e\xfa\x19\xf1\x85\xf2\x94\xa6\xb1\x19\x42\x90\x33\xa3\x44\x94\xa2\xb8\x8e\x6f\x93\x5f\x1d\x61\x5b\xdd\x94\xd8\x06\xce\xdb\x8f\x5f\x46\x33\x55\x10\xab\xf9\x08\x12\x56\xcb\x62\xd2\xde\x9b\x9d\x97\x66\xd8\x19\xb8\xaa\xf6\x79\x39\xf1\xae\xa2\x5c\x68\x92\x05\x68\xaf\x0f\xbe\xfc\x2c\xe8\x96\xc3\x7b\x78\x7f\xfa\xf2\xdb\xc8\x18\x89\x72\x61\xb2\x84\x07\xeb\xcc\xd3\xca\x3d\x97\x5a\x60\xb2\x56\xc8\x06\xf7\x63\x57\x6e\x0d\x9f\xd6\x36\x66\x64\x60\x43\xee\x8f\xfb\x89\xcd\x56\x17\x32\x0b\xac\xab\xef\x6a\xf8\xef\x31\xaf\xe1\x1f\x03\xf4\x71\xfa\x3d\x86\x3a\x1e\xaa\x4b\xe3\xbd\x0e\xf4\xd2\x82\xc2\x41\x64\x22\xcc\xa2\x25\x19\x41\xca\x21\x8b\x30\xe3\xda\x40\xbb\xeb\x77\x77\xf4\x58\x5a\x9e\x97\x36\xe2\xa9\x09\xa4\xe7\x1b\xff\xca\x87\x6d\xf1\x2c\xa6\x9e\x26\x11\x81\x0c\x02\x27\x37\x7f\x9b\x96\x15\x93\x28\x51\x34\x0a\x9a\x4d\xd5\xc1\xcb\x0f\x8d\x1e\x7b\x12\xc7\x80\xbd\x95\xeb\x1c\xc9\xcb\xe1\x83\x31\xd1\xca\xcf\x86\xb6\xe8\x6b\x68\x13\x10\xf3\xfc\x4a\x48\x0a\x88\x1c\xc3\x37\x7a\xd3\x1e\xcd\x90\xb7\x24\xc4\xc4\xd6\x07\x06\x5f\xe4\x5e\x15\x50\xcf\x3d\x69\xfa\x3b\x91\x50\x1e\x63\x8c\xab\xf2\x3f\xf4\x30\xab\x12\xaa\x62\x6c\x1e\xb4\xa8\x6e\x7b\x26\xbb\x5f\x28\x81\x27\x2c\x15\x28\x40\xe7\x1d\x28\xf0\x71\x5e\xca\x43\x17\x99\x84\x73\x73\xa2\x91\xd2\xe3\x8c\x21\x26\x41\x5f\xc2\x13\x83\x44\x1e\xf0\x00\xc3\x3b\x68\x5f\x2a\x73\x13\x4a\xcf\x33\x06\xa3\xff\x50\xc2\x04\xe2\x2b\x71\x3d\x7a\x42\x9e\xf6\x42\x6b\x33\x49\x89\xd3\x2b\x75\xb3\x7e\x87\x24\xcb\x72\x3e\xc6\x3a\x27\x3b\x24\x43\x60\xbf\x68\xd2\xcb\xf6\xa3\x44\x96\x48\xbf\xd8\x63\x80\x38\x51\x48\x5c\x2c\xc9\x25\x32\xa6\xb1\x3f\x71\x58\xf5\x89\x98\x94\x80\x12\x99\x24\xe8\x72\xf1\x05\x25\x12\x8d\xcb\x85\x1e\xa1\xde\x80\xae\x66\x70\x63\x9a\x48\x48\xb0\xdc\xe4\xa4\x36\x42\x2d\xfa\x88\x2e\x3a\x7e\x88\xa2\x4e\xaa\xea\x20\xeb\xb6\x84\x7a\xd2\x29\x4f\x94\xa1\xa2\x17\x61\x5f\xb7\x2f\x58\xd9\xbc\xae\x6a\x14\x4b\xea\xad\x8f\x68\xa2\xa9\xbb\xa8\x1a\x0a\xf9\xe1\xe2\x3e\x0f\x12\xb8\xec\x7e\x6d\xd1\x2b\x34\x7e\x86\xad\xf6\x02\x8e\x31\x11\x9f\x95\x9d\x13\x63\x22\x31\xf8\x32\x7f\x19\x14\x6d\xcf\xe4\x90\x8b\x7a\x37\x27\x8e\x55\x34\x81\x88\xab\x41\x47\xfc\xf1\xeb\x6f\x67\xde\x05\x60\x84\x44\x83\xd6\x79\x5e\xba\xb2\xda\x3f\x8e\x55\x7d\xdc\x3f\xce\x68\xae\x34\x01\x10\x18\x51\x3b\xae\x7c\x4f\x4e\xf1\x47\x6d\xe2\x70\xee\xdd\x62\x80\x77\x7e\x85\xc2\xde\xf3\x12\x41\x1a\xf1\xd8\xf9\x73\x75\xaf\x82\x2b\x5c\xcc\x06\x68\x57\x0f\xdd\xd5\x70\x90\x1f\xb7\x95\x3c\x53\xf2\x4c\x23\xed\xa4\x6b\x83\x85\xd6\xc8\xc2\x81\xa6\x11\x24\x58\xc5\x39\xf4\x52\x02\x60\x56\xe1\x95\x4c\xe3\xc8\x29\x24\xf4\x2d\x33\x5f\x82\x18\x02\xdd\x34\x8e\x12\x2c\xe1\x68\x59\x14\x27\xcc\xcf\x51\xc4\x9a\xc6\xcc\x95\xf2\xd0\x48\xcb\x75\x80\x9e\xa0\x81\x65\x9c\x23\x4d\x29\x38\x87\xd6\x81\x7b\xf6\x3f\xb1\xb6\x68\xca\xe2\x88\xf9\xc4\xa6\x2f\xfe\xc9\x5a\xe5\x6d\xe3\xd2\xda\xf0\x03\x98\xd5\x89\x0d\x4e\x62\x4d\x8b\xae\x18\x67\xae\x89\x47\x26\x73\xc1\x69\xfd\xd6\xbd\x7f\xf3\x85\x27\xcc\xd8\x34\x8d\x29\xa2\xa8\xba\xb5\x42\xcb\xc3\x97\x4a\x16\x28\xaa\x00\x7f\xaa\x0d\xd7\x9f\xc0\x12\x2f\x08\xff\x60\x6f\x4a\x5b\xc8\x81\x30\x1d\xf6\x95\x34\x05\x27\x6a\x92\xb7\xb0\xff\x35\x2f\xcd\x38\x6f\x4b\x85\x15\xc8\x08\x32\xd0\xb4\x75\xf5\x71\x2d\x9b\x97\xb1\x0b\xf8\x78\x45\x48\x33\x62\xb0\x07\xd9\x6d\xed\x9b\xa3\x72\xcb\xd6\xf1\x03\xea\x19\x7f\x83\xa6\x19\xa5\xc6\x53\x94\xf5\x66\xfb\x8f\xcf\x82\xbc\x34\xe3\x09\x56\x15\xd7\x37\x8f\x71\xc2\x7b\x15\xd8\x3e\xd2\x4a\x25\x8b\x53\x3d\x68\xca\xeb\xfe\xef\x99\xc1\xfd\x32\x47\x19\xf3\x8d\x33\xe2\x0a\xc7\x40\x78\x13\x83\xdb\x4a\x9a\x91\x32\xf5\xec\xcb\x15\xb7\x08\x0b\xef\x66\xdb\x4e\x2d\x85\xbf\xa9\x4e\x04\xea\x8f\x9a\xbc\x91\xcf\x35\xc0\xe4\xf6\xe9\x4c\x50\xd7\xd9\xe8\x92\x0a\xa4\xe0\x0f\x12\xf7\xdd\xe1\x4c\xf9\x2d\xdd\x05\x51\xcb\x57\xa1\xbd\xf3\xc1\xd7\xa3\x3a\xf5\x65\x5b\x9e\x63\x5a\x26\xf8\xca\xc9\xa2\x58\x3d\xe7\xe5\x33\xf2\x89\x9c\x8d\x51\x18\x61\x1d\x85\xf6\x45\x36\xae\x83\xbd\x5b\x2e\x6c\xa7\x86\x59\x2b\x86\x37\x60\xf7\xfa\xa1\x77\xaa\xbb\xda\x9d\x09\x6a\x43\x7d\xa8\x94\x02\x01\xa4\x12\xde\x94\xcd\xb1\x86\xc0\x58\xa7\x29\x18\x0a\xa3\xd8\x15\x2b\x59\x9f\xf7\x4a\x52\xb0\x19\x62\x85\xba\xb4\xa1\x5e\x34\xe6\xf7\x03\x6d\xa6\xad\x2b\xa4\xbd\xcb\xda\x8c\x01\x11\x18\x00\xf4\xbf\x44\x44\x40\xac\x6f\x5c\x7d\x95\xcd\xcb\x83\xdd\xbe\x40\x97\xb2\x81\xb9\xf2\x46\x3d\xfd\x48\x6b\x50\x24\xb6\x84\xf7\x9e\x8c\xe0\x0f\xc5\x9a\x24\x7e\x41\xf8\x1d\x64\x5d\x7c\x7c\xdb\x5c\x6d\x64\x21\xcf\x75\x63\x45\xac\x55\x00\xb1\x3d\x55\xef\xba\x2a\xe6\x4f\x39\xa8\xe5\x50\x41\x98\xc5\x4a\xce\x8b\x44\xdd\xbe\x87\x63\x7f\x41\x44\xa4\xc4\x59\xb4\x56\xb5\x41\x83\xb6\xa6\x47\x47\xc2\x44\x82\x85\x0a\x74\x71\xea\x6e\xdc\x0b\xe8\x57\x54\xe6\x3a\x0e\x9a\x1e\x93\xff\x9f\x2c\x37\x82\xd2\x0c\xe3\x0e\x47\xe4\xf8\x02\x41\x3f\x69\xfa\xf2\x0a\x4a\x15\xa2\xb2\xb0\x8f\x38\x76\x74\xc1\xef\x5b\x00\x8f\x09\x9a\xb9\xee\x43\xeb\xf6\x75\x0f\xa2\x81\x87\x72\xd8\x00\x04\x95\x09\x3e\x44\x3c\xc9\x6d\xbe\xef\xf5\xdb\xe4\x54\xf2\x8a\x0a\x46\x7c\x5d\x51\xfe\x5c\xcb\xba\xdb\x4e\x1a\x9c\x4e\xcd\x93\x93\xa3\x09\xc3\x92\x38\x08\xcb\x7a\x6b\x67\x30\x3e\x92\x1d\x6b\x7f\x52\xc1\x44\x86\x22\xb8\x7d\xcd\x77\x26\x8a\x38\x7b\x9c\x3c\xf2\x2a\x87\xb2\x00\x5f\x51\x9e\x15\xe4\x04\x4f\x0c\x62\x9d\x03\xe8\xb5\x2c\xc6\x02\xf6\x54\x24\x32\x72\x24\xc1\xa2\x6a\x4e\x98\x79\x7e\x4c\x4a\x38\xf3\xc8\x41\x59\x3f\xef\xe2\x5d\x5e\x1e\xe6\xc9\x94\x48\x55\x84\x31\x67\x6f\x32\x33\x7c\x87\x88\x94\x74\x82\xad\xc3\xa9\xff\x45\xfe\xbd\xdc\xa8\xf7\x9f\xc9\x58\x46\x82\xf7\xa6\x0e\x19\x78\x7f\x43\x55\xec\x6a\x10\x55\xd9\x45\x1b\xfb\xbc\x5c\x95\xe6\xbe\x72\x90\xa8\x30\x46\x6b\xc0\xbd\xc4\xc5\x58\xf7\x70\xe2\x3a\xf7\x69\x20\x77\x76\x23\x13\x26\xf5\x24\x5c\xf4\x9b\xe8\x95\xf6\xa9\x80\x24\xc1\x6d\x17\xbc\xa0\x67\xb7\xba\x0e\x7c\x40\x2a\x20\xe5\x69\xda\x0b\x05\xd8\xfc\x79\x20\xaf\xce\x4b\x86\xc2\xc6\xce\xd5\xc7\x01\xa4\x42\x7e\x15\x0e\x92\x58\x3a\x45\xc9\xc3\xb6\x1a\x64\xa1\xe2\xfe\xc3\x1c\x9c\x55\x57\x2d\xdf\x91\x6f\x3d\x3b\xb7\x50\x09\x0b\x54\x83\xeb\x3c\xd4\x67\xef\xab\xed\x4b\x3d\x20\xf9\xff\xe5\x9f\x4f\xc8\xc3\x84\x95\xae\x8a\x8d\xcd\xa0\xfd\x3e\x3c\x8b\x2c\x8a\x33\x2c\x3a\x5e\xdd\x5e\xfc\x45\xfc\x5b\x16\x71\x1b\x3b\x1a\x51\x55\xc3\xaf\x65\xa5\x5f\xab\x63\xdb\x9c\x38\xb2\x8e\xb9\x6d\x34\x8b\x12\x12\x0f\xf6\x3d\xdd\xd3\x76\xc8\xec\xe9\xaf\xcb\x22\x13\x23\x02\xf8\xf7\xea\x78\x05\xb2\x18\xb7\x96\x32\x62\x08\x4a\x61\xe6\x8d\x87\x38\xcf\x93\xad\xc9\x55\xd2\x98\xa1\x68\xde\x77\x8c\x7a\x31\x8e\x5c\x28\x04\x67\x2c\xd6\x58\xe0\xa8\xca\x77\xaf\x6e\x15\x0e\x28\x67\x97\xf5\x0c\xed\x0f\x90\x87\xaa\x1c\x6c\x9b\x68\xc6\x33\x15\x98\x72\x5d\x48\xb0\x28\x33\x48\xb3\x24\x72\x60\xc7\x5a\xe6\x25\x96\x8e\x27\x69\x78\x96\x64\x29\x02\x43\x37\x27\x2a\xa7\xb3\xd3\x18\x07\xa5\x0c\xae\xe5\x17\x1f\xeb\xbb\x87\xfb\xed\x2f\xa3\x8c\xe5\xa4\x13\x93\x25\xa0\xb1\xe1\xb9\x81\xf6\x78\x98\x41\xc3\xc2\x10\x9b\x60\xd1\xab\xef\xa7\x7c\xf6\x26\x05\x03\x66\x9a\xa5\xdc\x59\x1c\xef\xde\xba\x65\x5b\xb6\x70\x01\xa8\xcc\x88\x5c\xd3\xd1\x22\x90\xa5\x89\x8a\x20\x28\x0a\xb6\x6d\x01\x83\xa0\xfe\x79\x56\x02\xcd\x44\x24\x35\xf3\xe0\xd7\x17\x68\x4f\x3b\x74\x53\xa4\xe7\x38\xa6\xcf\x04\x67\x41\x0f\xf4\x6e\xee\x5c\x4d\xb3\x2c\x96\xbd\x42\x38\xd6\xc7\xba\x10\xf6\x7a\xb4\xd4\x67\x19\x61\xa9\x13\x65\x74\xd3\xc6\xe9\x6e\xb9\x3d\xf1\x6f\x8b\xf7\x39\xa3\x8e\x4f\xd4\xc0\x98\x32\x4b\xb3\x8c\x3b\x21\xb8\x97\xaa\xe8\x5e\xfe\x66\x8e\x05\xc8\xb2\x2c\xc5\x7a\x58\x5d\x1d\x0b\x68\x5b\x18\xaf\xeb\x59\xa6\x29\xa2\xbd\x65\xd3\xe4\xcf\xe5\x75\x0d\xf0\x04\x28\x0b\x3b\x85\x25\x86\x3b\x9d\x59\x81\x19\xf4\xea\x69\xbb\xbb\x5a\x5f\xde\xdc\xad\x6e\x37\xd7\xab\xcb\xed\x43\x28\xe2\x67\x92\xc4\x4e\xd6\xa3\xfe\x70\x2e\xce\x33\xc0\xd5\x74\x01\xcb\xa4\xcd\x40\x79\xb3\xc2\x59\x3b\x27\x53\x24\x71\x35\x29\xe3\x24\xea\x26\x12\x91\x61\x4c\xe2\xfc\xda\xdc\xf5\x87\x99\xba\x18\x9d\x65\x4a\x26\x6a\xa8\x55\x69\xe8\x65\x76\x69\xa6\x0c\x47\x7f\x16\x5d\x95\x4d\x5b\xeb\x21\x3a\xcc\xb4\x60\x58\xbe\x59\x99\x89\x01\x07\xcd\x74\xf7\x53\x7b\x57\x8c\x11\xc3\xb1\x27\xb7\x4f\xbf\x5d\x67\x8e\xb2\x83\x2d\x2f\x28\xef\x8f\xfb\xd9\xa4\x31\x91\xb2\x32\xa8\x36\x14\xf6\xa1\x5f\x8e\x8c\x70\xfe\xe2\x5f\x1e\x7e\xeb\xff\x04\xce\x4f\x75\xb0\xbb\x41\x7a\xfb\x99\x5a\x4b\x06\x0c\x9c\xef\x53\xde\x1e\xf1\x2e\xee\x74\xf0\x26\x0a\x67\x84\x0c\xb0\xec\xe5\x58\x8d\x7d\x60\xb1\x7a\xbc\xe9\x47\x58\x33\xe4\xe5\x3d\x50\x3c\x1c\xb5\x51\x3c\xe1\x2c\xdd\xff\xd4\xcb\x45\x85\xcc\x46\x90\xe9\x41\x0f\xe0\xf1\x78\x38\xfc\xb9\xf5\xef\xf8\x54\x71\xb2\xf8\x4f\x38\x7d\xa2\x50\xfa\xed\x1f\x47\x69\x6a\x59\x3a\x1e\x79\x3f\x5f\xac\x62\xb1\x47\xea\xed\x0c\x34\xba\xce\xb1\xfd\xb8\x7b\xe9\xad\x2e\xa9\x8c\x4c\x22\x1c\xa6\xf8\x90\xd7\x1f\xbb\x51\xb1\x57\xc6\x89\x40\x26\xe3\x7f\x9c\xad\xc1\xad\x6c\x5a\x0f\x77\x0f\x03\x32\x89\x84\x88\xbd\xfc\x79\x55\x57\x87\xe6\x11\xea\xed\xcf\xfe\xa0\x12\x6e\x42\xe3\xae\xd2\xd3\xa7\x97\xef\x93\x8c\x95\x71\x16\xe0\xd8\x04\xea\x96\xeb\x8b\x6a\x90\x40\x9e\x0d\x26\x3c\xb2\x59\x78\x38\x3f\xaa\x7a\x86\x01\x95\x34\xe2\x54\x0d\x0a\x6d\xdd\x5a\x34\xa5\xef\x48\x96\x2a\xdc\x24\xda\x8f\xfd\xec\x45\x94\x3c\x72\x2a\xb5\xd2\x98\xaf\x55\xdd\x80\xeb\x0b\x4c\x66\xaf\xe4\x5a\x20\x42\xb2\x35\x30\xd6\x12\xa1\x32\x11\x06\xa7\xea\xd3\x7a\xac\xa7\x4a\x65\x92\x09\x14\x3e\x45\x8d\x1e\x5f\x52\x0f\x35\xb1\xe1\x9f\xb3\x73\x20\xec\x12\x32\x4d\x2c\xd2\x39\xf4\xe0\x89\x37\x8a\x4d\x26\xef\x81\x4c\x53\x9d\xca\x5e\xb8\xf7\x58\x8c\xa9\x9f\x0b\xb5\x5b\x99\x2a\x86\x3b\xd0\x7f\x8f\x50\x7f\x3c\x16\x55\xeb\xf5\x62\x5c\xac\xd2\x7f\xc9\xb4\x12\x2d\x53\x65\xd0\xb9\x1c\x73\x87\x2e\x5e\x3e\xa5\xf5\x9e\x31\x47\x3b\xa2\xd7\x4a\xf8\x67\x31\xce\xf1\x9f\xf2\x8e\x2c\x54\xaa\x24\x46\x05\x22\x34\x06\xad\x65\x69\xa1\x7e\x28\x27\x48\x19\xa9\xb9\x30\x8e\xbf\x20\xdb\x97\x2e\x8a\xd8\x59\xd1\x1f\x4b\x49\x1c\xe0\x4a\x23\xe3\xc4\xd3\x8c\x48\x6a\x99\x3a\xaa\x88\x03\x6d\xde\x8e\xb0\x19\x7e\x84\x61\x6a\xe4\xdf\xd4\x2e\x04\x79\x61\xa0\x74\x38\x0a\xd9\x7d\xd7\x75\x55\xfb\x64\x47\x2f\x58\xb2\x2c\x9b\x9f\xcd\xa6\x80\xd1\x0a\xfb\xab\xef\xb2\x78\xbd\xa8\xaa\xd7\x49\x98\x2b\x8d\xd1\x98\xc7\x1f\x5c\x6f\xe7\xa4\x97\x31\x9b\x23\x06\x38\xc5\x66\x6d\x5b\xb7\x0e\x88\x3c\xc6\x5a\x4a\x88\xdc\x86\x79\x05\x5d\x84\x51\x9a\x66\x53\xca\x43\xf3\x52\x9d\x69\x27\x48\xa0\x8e\x6d\x24\xb1\xee\x37\x2e\x56\x86\x01\x4c\xe3\x1c\x43\x54\xef\xeb\xf0\x3d\xa0\x30\x78\xdf\x75\x69\x40\x91\x43\xe9\x8b\xa6\x67\xbe\xc6\x12\x8d\xb8\x3c\xf7\x16\x04\xa4\xcd\xa2\xfa\xcb\xb9\xff\x12\x4b\x1a\x31\xfd\xa4\xb6\x29\x35\xb4\x97\x53\x2b\x0a\xd0\x2d\x18\xe7\xee\x36\xb9\x7f\x2a\xe2\x3a\xf5\xb9\xee\x4d\xd3\x1c\x03\x42\xe0\x11\xea\xa1\x88\xae\x22\xc9\xb1\xf8\x9a\xeb\xea\xf1\xad\x5d\x8f\x6a\x37\x2a\x02\x86\xeb\xf7\xee\x58\x1e\xa4\x7e\x7d\x42\x85\x42\x2c\x35\x2d\x34\x1e\x54\x1c\x51\x8c\xb4\xbe\x8f\xd5\x4f\xa6\x71\x5b\xf8\x09\x8a\xf0\x08\xcb\xd3\x97\x5f\x2e\xc7\xef\x87\x62\x40\x22\xdd\x63\x79\x7d\x80\x81\xa4\x56\xd7\x1e\xbe\x3e\x5d\x24\xfc\x27\xb9\x74\x4e\x67\x79\xa9\xab\x7d\x5e\x3e\x3f\xc9\xd2\x54\x7b\xdf\x55\x5d\x88\x9f\x14\x37\x0c\xeb\xa8\xad\x7c\x85\x5e\xb0\x95\xaa\x84\x40\xec\x74\xd8\xdf\xa1\x69\xaf\xf2\x3e\x59\x54\x09\x28\x24\x55\x96\xe7\xc4\x37\xa9\x4a\x63\x01\x3e\xac\xb9\xec\x6e\xd5\x31\x77\x81\xe0\xc2\x4b\xac\x52\xee\xaa\x98\x4e\xab\xf2\x0c\xaf\xdd\x8f\x15\x92\x60\x57\xaa\xee\x82\x86\x59\x34\xa3\xb2\x58\x60\x95\xb1\xcb\xbb\xdf\x77\x0b\x6a\xbe\x54\x65\x42\x47\xbd\x79\xb9\xec\x1d\x35\xa9\xca\x14\xb3\x73\xf4\x5a\xb3\x9c\xe0\xaa\xcc\x46\xca\x55\x3d\x2d\xd4\x35\xd4\x38\x11\x46\xd9\xb2\x92\xc4\x69\xac\xf5\x30\x8d\x89\x5e\x31\x55\x92\xca\x70\x03\x73\x7b\x22\xd3\x7e\x92\xd3\x8f\x22\x6b\x25\x0d\x4f\xc6\xe2\xd7\xeb\xa7\x4b\x42\xe8\x49\xf2\x32\xfe\x88\xe2\x4e\x12\xa7\x3a\x40\xf9\x45\xee\xe1\x09\x9a\x63\xd1\xae\x4a\x73\x0f\xef\x5f\x46\x8a\xc6\x7f\x5b\x22\x91\x29\xa5\xa4\xc3\x20\x97\x1a\xca\x6e\x0f\x3d\x5f\x18\x54\x3a\x86\x38\x1b\x64\x00\x4b\x9c\x4e\xd3\x7b\xa7\x13\x83\x08\x16\xb9\x87\xd2\x5c\xc3\xfc\xd5\xd1\xa0\xf0\xd5\xc9\xcb\xbc\x7d\x28\x51\x26\x6f\x5e\x29\x56\xda\xc6\xb8\x79\x4b\x55\xd5\xed\xa8\x0c\xac\xb4\xe5\xd8\x13\x77\xce\xbf\x60\x5c\x91\xb7\x3a\xd6\x3a\x2f\x9f\xaf\xf2\xe6\x70\x6c\xe1\xa2\xb7\x29\xa1\xca\xc8\xd8\x4d\x26\x99\x37\x70\x27\x7f\xde\x1f\xf7\x17\x30\x07\x70\x29\x03\x1a\x81\xa4\xe8\x3c\x9d\x64\xb3\xa3\xa0\x63\x7c\x94\x97\x7d\x37\xea\x93\x22\xbc\xb2\xcc\x86\xcc\x19\x1d\x49\xeb\x66\x39\x79\x56\x56\xb8\xc6\xb1\xca\xeb\xf6\xc5\x71\xcc\xc2\x11\x70\xcd\x6d\xe4\x1a\xe7\xe6\x26\xfc\x1a\x1d\x29\xab\x78\x8f\x62\xfd\xd6\x40\xbd\x19\x64\x4a\xa8\x8e\x69\x1c\x5c\x45\xbc\x8b\x5a\x1d\x4f\xbf\x54\xc7\xa9\x73\xd6\xc9\x9b\x27\xe8\x9e\x71\xb7\x9a\x2e\x02\x3b\x74\x6c\x62\xe3\xa4\x20\x71\xd1\x75\xf8\xbb\xc5\x37\x56\x13\xe3\xdc\xb9\x4a\xf8\xd9\x76\xb3\xad\x07\x2b\xdd\xb9\x16\x16\x0a\xe7\xfb\xb1\x94\xa4\xb6\x6f\xed\xe5\xe5\xf3\x09\xf3\x53\xb3\x28\xc6\xed\x7c\x75\x75\xf5\xb4\xdb\xfe\xfa\x65\xf7\xfd\xb2\x3f\x14\x6b\xc4\x01\xdf\xc3\xfb\x37\xf4\x11\x01\xb3\xfc\x2c\xa6\xeb\xa5\x66\x9c\x22\x9d\xca\x7a\x2f\xe8\x49\x07\x56\xb3\x8c\x23\x50\x02\xc5\xe4\x1f\xec\x58\xb6\x72\xf8\x8d\xcc\x64\xd8\x9e\x38\x48\x24\xa2\x7c\xa9\x8a\x59\x57\x5b\x73\x15\x1b\xdf\x67\xfc\xc4\xb5\x9f\x6a\x6e\x49\x22\x11\x1e\xa9\x8a\x5c\x63\x11\xf7\x4b\x70\xf5\xfc\xa5\x1f\x23\x11\x72\xd9\xc4\xc4\xf7\x75\xfd\x81\x84\x8a\x24\xeb\xbb\x24\x53\x8b\xe3\x30\x44\x0b\x5c\xe6\xb6\x2f\xb0\xfe\xa9\x61\x52\x62\xd2\xa9\xd2\x9e\x8b\x68\x8c\x57\x37\x9e\x7e\x3a\x35\x12\xa5\xdc\xf6\x79\xe9\xc3\x90\x99\x35\x07\xd5\x82\x3a\xca\xf4\xa0\x81\x78\x95\xfb\xa0\x24\x0c\xc9\x98\x96\x49\x2f\x6a\x50\xd9\xf6\x52\x1e\x42\x3f\xce\x0f\x91\x91\xc4\xf2\xc0\x01\x6a\x5b\xd5\xfb\x8d\x57\x2f\xf5\x32\x20\xe8\xb5\xd4\x8f\x04\x30\x9e\x09\x9d\xd7\x80\x3e\x28\x7b\xa8\x6f\x46\xa7\xf2\x00\x46\xf3\x96\x37\xd5\x9c\x46\xa6\x25\x75\x32\x30\x3d\x35\xff\x2e\x9f\xf9\xcf\x51\x2d\xb9\x13\xf0\xaf\x41\x9a\x5d\x2e\xfa\x33\xa7\xb1\x49\x42\x6e\xac\x8f\x5d\x48\xe0\x4a\xf7\xe3\xb8\x52\xcb\x54\x69\xa7\xa4\xa6\x8e\xcf\xbb\x42\x36\xed\xce\x5b\x68\xf5\x97\xa8\x64\x84\x55\x14\xec\x06\xad\x4b\xb3\xcd\xf7\x40\x78\xd4\x1f\xd6\x96\xa7\xa1\x25\xea\x49\xa0\xab\xf6\x16\x9f\xee\x38\xa8\xd4\x3a\x06\xea\x31\x62\xbe\xea\xea\x3a\xd5\x7f\x92\xbf\x86\x58\x44\x6b\xce\x11\xe4\xff\x5e\x43\xd3\xf6\xcb\xaa\xd6\xdc\xf9\xa3\x76\x8b\x16\xe8\x97\x32\xd7\xb2\x70\xae\x90\xd3\xdb\xa4\x53\x85\xe8\xbd\xf2\xb8\xf7\x5c\xce\x9d\x57\x70\x1d\x7e\xaa\x16\x80\xfc\xc9\x0b\x68\x5f\xf2\xf2\xf9\x47\x55\x17\xe6\xf2\x18\xba\x17\xda\x50\x70\xa6\xf3\x7e\x77\xeb\xfd\xc9\x3f\x6d\x71\x69\x63\x14\x71\x66\x52\x07\xa4\x54\xfa\xba\x7b\xff\xad\x90\x68\xce\x83\x9b\xd8\xb7\xc3\x99\x77\x0f\x32\x8d\xd5\x06\x87\x27\x68\xa6\xfa\xda\x7e\x8c\x8d\x12\x34\x54\x50\xf9\xf3\x85\xec\xab\xda\xda\x32\x6b\x92\x90\x9d\x2f\xd3\x81\x4e\xc9\x61\x93\x7d\x56\xdb\x24\x45\xa0\xdb\x5b\x20\x7d\xba\xbf\x9b\x48\x58\x1a\x24\x8b\xbd\xfb\xea\x76\xfb\xc3\x79\x46\x1a\xd6\x8f\x52\x4e\x88\x69\xef\xd0\x5e\xd7\x00\x8f\xc5\xb1\x99\xbf\x7a\x26\xd2\xce\xcb\xe1\x19\xda\xdb\x50\x01\x30\x24\x8e\x52\x1b\x2c\x70\xd0\xe2\x65\x72\x65\x86\x10\x81\xcf\x35\x08\x67\x4d\x44\xca\x27\x01\x07\x5b\x4c\x1e\xa7\xde\x2f\xd4\x10\x1a\x3b\x1c\x55\xfe\x5c\x42\x7d\x5d\xc8\xe7\xe9\x4d\x36\x84\x3b\xe5\x94\x06\x3b\xa5\xb9\x9e\xb3\x9a\x0d\x11\x1c\x71\xd7\xa5\xdc\x43\x35\x7d\xdf\x0c\x81\x2c\xe9\x76\x88\x3f\xf2\xb2\xdd\x95\xd5\x7b\xf8\x95\x34\x35\xf8\xe4\x9a\x97\xea\xfd\xb1\xaa\x8a\x69\x40\x1c\x06\x09\x92\x25\x81\x74\x8c\x46\xf1\x3d\x86\x6d\x7a\x05\x54\x26\x6e\x23\x7f\x39\xa2\xd8\xfd\xf6\xeb\x6c\x00\x8b\x41\x25\x43\x6d\x63\xb2\xa9\x18\x96\x65\x48\x10\x0f\xb0\x1e\x6c\xb9\xdc\x5c\x3e\xf8\x8d\xd9\xf4\xe3\xa0\x87\xd4\x85\xf6\xd6\x24\xa7\x58\x9c\xc7\x86\x47\x29\x36\x5d\xfb\x72\xda\xfa\x67\xde\x8e\xe0\x6a\x27\xc0\xb5\xf9\xe7\x63\x19\x8d\x91\xca\x3b\x6c\x0a\xed\xda\xca\x5b\xd4\xcc\x46\x4b\x37\xfa\x31\x7f\x46\xe6\x55\xb8\x76\x6e\x19\x0a\x44\xf8\x6d\x75\x22\xf8\xeb\x87\x24\x59\x86\xf9\xe1\xef\xcf\xcf\xa6\x96\xcd\x0b\xc6\x6b\x7f\x26\x56\xf7\x79\x87\xcb\x24\x2a\xc1\x36\xc9\xfa\x90\x3f\x43\x79\x29\x6b\x38\x6d\xf5\x9f\xab\xe3\x2d\xe6\x53\x26\x31\xa9\x0a\x2e\x5b\xb2\x28\xee\xe4\xcf\xcb\xaa\x99\x11\x81\x4d\x4a\x9c\x18\xba\xc9\x35\xec\x9e\xe7\x36\x21\xd4\xa4\x3c\xc1\x06\x54\x77\x2b\xa7\x8d\x1d\x93\x72\xa7\x64\xd5\x40\xfb\xed\xc6\x7b\x60\x2f\x42\x7b\x4d\x9a\xb8\x5e\xa6\xbf\xbe\xeb\xe1\x66\x8b\x2e\x06\xc1\x4a\x5b\x75\xd8\xf6\xf5\x53\x93\x19\xc2\x07\xfd\xf4\xb3\x3d\xc4\x51\xb2\x60\x64\xc4\xb0\x2e\x73\xf1\x14\xf0\xfb\x46\x8a\x0c\xb7\x74\x3f\x1f\x64\x7d\x75\xf1\xf0\x3e\xf7\x55\xa3\x46\x47\xae\x46\x81\x92\x31\xaa\x00\x07\xab\x6e\x66\x37\x4a\x27\x14\x71\x40\xb8\x81\x78\x13\xe4\x73\xc2\x25\x46\x83\x34\x2e\x98\xa8\x41\xb7\x57\xa0\xf2\x76\x04\xc0\x9f\x7d\xbd\x4d\x3c\xbe\xfe\x38\xb9\xbd\x86\xcb\x38\xc8\x4e\x38\xb3\xc0\x55\x5d\xcb\xfe\x55\x34\x42\x04\x54\xc6\xaa\x69\xb6\x23\x28\x92\x31\x3a\x8e\x7a\xc3\x37\x6c\x8d\x3f\xbc\x41\x5d\xe7\x66\xfe\x70\x8d\x96\x90\x05\x52\x06\xc6\xf5\x83\xfa\xf8\x2c\x83\x1c\xbf\x7e\xfe\xd3\xa0\x59\x42\x43\x5f\xa6\x6c\x1f\xde\x67\x3e\x82\xd4\xd8\xd8\x91\x42\xd6\x97\x4f\x24\xfa\x5a\x95\xf0\xa1\xab\xbd\x9a\xfc\x4a\x9b\xc4\xc1\xa5\xe3\x1e\xde\xbd\x58\xa8\x8f\x34\xff\x12\x40\x0b\xa2\x54\x11\xdb\x43\x86\x9f\xc0\xae\xdb\x97\x3e\x19\xf7\x63\x62\x45\xb5\xfb\x96\xa2\xdb\x64\x5d\x28\x72\x71\xfc\x58\x8f\x4a\xc0\xe7\x50\xa8\xd3\x6f\x23\x11\xc7\x35\xaa\xdb\xa8\x8b\x3b\x59\x1e\x65\xe1\x64\xf6\xff\xac\x1a\x39\xb9\x33\x40\x04\x45\x4d\x4c\x27\xaf\x77\xdf\xe3\x64\x80\x28\x67\x1b\xd9\x7c\x94\x7a\x70\xe3\xa1\x40\x69\x8a\x3c\xab\xcd\xfa\x71\x52\x6f\x01\x9a\xc5\xd8\x09\xbe\x80\xe7\x67\x59\x4f\x0f\xa9\xd8\x57\xcb\x7a\xda\x6e\x90\xbc\x5a\x9e\x8b\x40\x6d\x12\xba\xe5\x01\x3e\x3b\x9d\x32\x40\xad\xc4\xf6\x09\x98\xbc\xdd\xe8\xaa\x86\x45\x51\x64\x3f\x98\x99\xde\x03\xf3\x4a\x7a\x00\xfc\xf4\x74\x9c\x5b\xec\x20\x74\xaf\xf9\xba\xd1\x75\xf5\x3e\x37\x6d\x98\xdd\x7f\x2e\x2d\xee\xa0\xd2\xf4\x0c\x0d\x7f\x83\x27\xc3\x12\x1d\xc7\x3e\xf4\xbc\xd1\x88\x93\xb9\xcd\x9b\xf6\xe2\xe3\x46\x57\x4f\xc7\x02\x6e\xce\xa4\x31\x90\x2a\x06\x9e\x51\x19\x98\x02\xb3\x2b\x16\x54\x61\xa2\x73\xf7\xb1\xd8\x78\x1f\x6f\xe9\x20\x12\x27\x51\xb2\x85\x06\x71\x77\x2e\xf5\x08\x99\x33\x3a\x3c\x8d\xfa\xa4\x67\x26\xe2\xbf\xf8\xbf\x97\x4f\x2e\x68\x3a\xf2\x4b\x3a\xf5\xc7\xa1\x90\x11\x81\x15\xfa\xad\xd4\x23\x1f\xbf\xc5\xb3\x65\x54\x11\x98\x90\x8a\x55\xbe\xc8\x98\x81\x8c\x67\x62\x70\x65\x77\xd5\xd4\x89\x51\x6a\x58\x32\x21\x4b\x2c\xd0\x9e\x96\x1b\x1c\x42\xc2\x41\x48\xa2\x2c\xac\x1e\xa7\x3c\x16\xd0\xb1\x52\xbd\x4a\x73\xa8\x7d\x0e\x8b\x1c\x74\x7b\x44\xdc\xcb\xac\x8d\x61\x48\xb3\x13\x19\xe9\x84\xb5\x43\x4d\xcb\xcb\x5d\x5c\xf7\xd6\x55\xa3\xa1\x36\xc3\x3a\xcc\xa1\x90\x7a\x5c\x02\x1a\x57\x1d\x01\x84\x8d\x7a\x25\x2c\xb0\x76\x92\xca\x00\xc8\x88\xb0\xc0\x7c\xdf\xd6\x20\x9b\xe3\x39\x60\x18\x80\x62\x58\xd3\x73\x2e\x2b\x6f\xcd\x13\x98\x4d\xf5\x93\xc5\x59\xf8\x8d\x36\xa2\xca\x13\xdb\x2f\x8e\xc5\xeb\x5d\x6e\xbe\x74\x8b\xf4\xa5\xac\xe7\x6b\xe3\xbc\x39\x03\x96\x48\xa2\x27\x9d\xe3\x13\x05\xf0\xd1\xee\x09\x56\x71\x8c\x5c\x55\x55\x9d\x98\xf6\xba\x21\x36\xd2\x1a\x11\x2c\x32\x98\x52\x5e\x56\x66\x4e\xb4\xb7\x71\xe4\xdc\xf9\x6e\xae\xee\x1e\xee\xd7\x41\x62\xc6\xc6\xb1\x48\x1d\xba\xb7\xc9\xcb\x65\xbb\x61\x6a\x63\xa6\xf0\xdd\xf3\xb2\xf7\xfb\x43\x51\x7d\x00\x4c\xe7\xe0\x72\xa8\x63\x63\x06\x18\xfe\x7a\xdf\x3f\x4f\x91\xed\xbf\x3d\x49\x0c\x4c\x98\x45\x3e\x40\x9c\x0a\xc9\xcd\xae\x26\xa5\x28\xbf\x71\xf1\xf0\x38\x9b\x26\x36\x16\x29\xc8\x11\x75\xf4\x1a\xc2\x32\x6d\x49\xac\x30\x32\x3c\xd4\xa8\x77\x80\x28\xe0\x79\xa9\xc1\x52\xe5\xf2\x96\xc6\xbd\xb9\xb8\x8c\x4e\x6e\x7a\x78\x83\x2c\xd5\x20\xe3\xa1\x48\x30\x13\x99\xb2\x14\x48\xd0\xc3\x40\xcd\xb5\x11\xd6\xc5\x52\x48\xb5\xe8\x97\xf2\x1f\x00\xaf\x6c\x02\x31\xf5\xc3\x98\x48\x30\x00\xfb\xcd\xff\x2f\xe2\xe1\x04\x2c\xcb\x94\xe8\x5b\xf2\xe3\x92\x9c\x4d\x58\x9a\x9a\x11\x6c\x75\x03\x6d\x7b\x0e\xed\x6c\x93\x14\xe2\x81\x7f\x55\x1c\xc8\x6c\xca\xa4\xd4\xbd\x4f\xd8\x6c\xdd\xdd\x5c\x3e\x90\xd9\x25\xa6\x8c\x21\x90\xe6\xef\xd0\x34\x39\xac\xcd\xd1\x6d\x65\xe3\xad\xce\x22\x48\xd5\xd1\xd7\x0e\xd2\x79\x57\x04\x1d\xa3\xd1\xbb\x6b\x45\x14\x89\xd1\x9a\x79\xb5\x7a\x58\xf0\x15\xa3\x36\x4b\x33\x1d\x20\x7e\xeb\xd2\xf5\x5c\x10\xdd\x9f\x57\x23\xb1\x79\x6a\x33\xe5\x44\x74\x6f\x2b\xfd\x7a\x3c\xb8\x87\x1c\x80\xe6\xfd\xa5\x65\x3a\xf5\x75\xe8\xb7\x13\x19\x42\x2b\x4d\x12\xec\x6e\x70\xa1\xeb\x1e\xee\xf4\xd7\x2b\x6a\x31\xca\xf2\x53\xfb\x2e\x7f\x76\x98\xa3\x09\x9e\xd9\x2a\xc9\x50\x8e\x77\x57\xbb\x4c\xec\xe2\xf8\x71\x0f\x3f\xdb\x27\x59\xce\x60\x49\x56\x83\x53\xb8\xf7\xb5\x1c\xbf\xe9\x4e\xbf\xd3\x08\x8d\xd0\xe0\x5e\x32\xd5\xe1\x18\xbf\xca\xe6\xe5\x13\xdb\x13\xff\x61\x4b\x22\x19\x07\x79\xf8\x6e\xea\xf8\xc2\x50\xb8\x54\xcb\x01\x5b\x5a\x18\xf2\x8f\xff\x9e\x45\xd8\x7b\xd8\xe7\x65\x4f\x95\x0a\x87\xa4\x93\x81\xbc\x2e\xf2\xe7\x97\x16\x1d\x80\xaf\x64\x2b\x95\x9c\x69\xcd\xb0\x28\x4e\x53\x4c\x6f\x03\x71\xef\xca\x09\xd6\x85\xaa\x1a\x8b\x62\x23\x32\x1f\xe1\xf8\xa4\xee\xb2\xc8\xad\xed\x42\x2d\xbc\x98\xf1\x6f\x61\x11\x89\x15\x92\xc8\x76\x81\xb7\xf9\x99\x38\x15\x8b\x48\xe6\x14\xd6\x76\xe8\x39\xf7\x7c\x9d\xff\x0c\x1b\xe3\x28\x2d\x9a\xc5\x88\xfe\x5d\x67\x11\x23\x8e\x49\x7f\xa8\xab\x16\xfb\x81\xe3\xd4\x9b\x45\x3c\x22\xa8\x3e\xbc\xde\xef\xf3\xe3\x7e\xa0\xe8\xb1\x88\x53\xb7\x13\x62\x14\x7f\x59\x1d\xeb\x66\xfe\x33\x38\x63\x91\x2b\xe2\xea\x63\x0d\x08\xb1\xf2\x47\x12\x42\x64\xb7\xe6\x7e\xbb\xbf\xd9\x7a\x1e\xdd\x17\xd9\xc2\xbb\xfc\x18\xd6\x12\x16\x25\x69\x6a\xdd\x5e\x5b\xb6\xc8\xe0\xe9\x0f\x88\x14\x4f\xec\x2e\xd5\x61\x20\xd0\x26\x12\x15\x40\x3c\x51\xbc\x09\xa3\x53\x42\x11\x5e\xfa\x05\x9c\xff\xc9\x20\x16\xc0\xa2\xd4\x68\xdc\x21\xf6\x60\x7a\x86\xe1\x0c\x7c\xc5\x22\x91\x69\x5c\x77\x56\xb7\xdb\x12\x7e\xb6\xe3\x9b\x20\xd3\x94\xc0\xe8\xcd\xee\x0b\x48\xd3\x33\xe8\x28\x66\xce\x3e\x03\x57\xa3\xfb\x81\x04\x14\x06\x50\xc9\x7d\xc3\xf5\x49\xea\x5e\x92\x80\x45\xda\x46\xc8\xde\xe9\xe5\x13\x97\x5a\x6c\x2c\x32\x9c\x69\x4f\xbb\xbe\xce\x07\xb2\xdd\x9c\x62\x74\x1a\x82\x75\x1f\x05\x41\x3c\xa1\x2a\x97\xc5\x75\x91\x4f\xcd\x3f\x58\x64\xa4\xc0\x02\xba\x07\xcc\x4c\xc4\xe5\x58\x04\x94\x62\x13\x62\xf3\xf5\x69\xb4\x36\xb2\xa8\x0b\xb2\xfd\x2e\x31\x28\x08\xf4\xf8\x67\x16\x81\x24\xb6\x4f\x17\x37\x8e\x7a\x98\xa3\xa8\xd3\x62\x13\x85\x45\x36\x93\x1c\x26\xc5\xce\xa9\xd9\xf5\x6c\xb4\x8c\x30\x63\xc8\x1b\xaf\x74\xeb\xc5\xcb\x26\x32\x42\x6e\x6c\x1c\x25\x5a\xf4\xa8\xa8\x2f\xce\x2f\xa7\x57\xea\x60\x71\x04\x1a\x0b\x7a\x35\x76\x86\x9f\x10\xee\x3f\xa3\x7e\xb3\x38\xb2\x52\xa7\x41\xcc\xc2\x69\xfa\x6d\xeb\x63\xd3\x82\x71\x0e\xd9\x7a\xd9\x5e\x9a\xc5\x31\x8f\x45\xea\x5b\x78\xc3\xc2\xc4\xe2\x58\x69\x19\x02\xbe\x50\x99\x5a\x95\xcd\x7b\xf7\xc3\x9b\x63\x31\xcd\x90\x58\x4c\x78\xea\xbd\x68\x06\xea\xf9\x20\x03\xbe\x78\x47\x63\x92\xe8\x60\x1c\xdc\x2d\xb2\x9b\xa3\xf2\xc9\x47\xef\xbb\xc7\x62\x46\x85\x93\xd4\x07\xbd\xdb\x07\x48\x42\x38\x26\x2c\x7a\xd4\x8d\xa8\x6d\xf3\xfc\x73\x41\xab\x9a\xc5\x3c\x72\xfa\xbf\x5e\x24\xe1\x62\xb2\xe4\xc4\x9c\x3a\x97\xa1\x1c\x89\x43\x1e\x89\x34\xc5\xb4\x84\x91\x3c\x45\xa2\x92\xd1\x65\x5b\x1f\x8a\xb3\x06\x79\x27\xff\xf6\xdd\x74\x16\xf3\xd4\x99\xf3\x87\x17\xec\x09\xcc\x6e\x31\x36\x63\x31\x57\x06\x73\x5e\xf7\x73\x4f\xbe\x6c\x21\xe3\x66\x71\xc2\x99\xf3\x4b\x97\xed\x0b\x62\x90\x1f\x0a\x73\xb2\xce\xf4\x93\x28\xd1\x31\x2e\x6c\xd8\xac\xec\xde\xc1\x45\x86\x16\x8b\x45\xa2\x43\x8b\x63\x50\xe6\x6a\x02\x62\x36\xdc\x48\x91\x31\x04\x44\x4a\xd3\xc5\x51\xaa\x00\x5d\xe5\xf3\xa9\x2f\xa4\xc6\x7c\xe8\x58\x3a\xf3\xa2\xde\x97\xd2\x1f\xcf\x58\x42\x9d\x51\x69\xf1\x1a\xca\x4f\xe6\x2c\x97\x98\xc5\x99\x17\x6c\x69\xa0\xfd\x9a\x7b\xd4\xcd\xf4\x2e\x66\x9e\x89\x9d\x3b\xe3\x2e\x30\xa7\xc5\x31\x16\x67\xa0\x51\xd8\xc6\xdd\xea\xcb\x97\x7c\xd6\x21\x64\xb1\x54\xce\x91\xba\x0d\x8e\x45\xa3\x39\x2b\xc1\xb1\xb5\x9d\x12\x62\xf8\xab\x8a\x9d\x33\x2b\x6e\x58\x8f\xd5\xd5\xdc\xc7\x81\xc5\x4a\x68\xe7\x0d\x5d\x57\xc7\x65\x4b\x42\x16\x6b\x2a\x31\xaa\x3f\x1c\xcb\x57\x2c\x2d\x0c\x6a\xe1\x7e\x84\x89\x34\x0a\xc6\xf8\x54\xfd\xb6\x92\xe6\x33\x9c\xfc\x6c\xc2\x98\x98\xeb\x2c\x78\xdb\xb9\x72\xd2\x60\xca\x34\xde\xb9\x63\xc3\x22\x44\xb5\xaa\xe3\x87\x57\x5d\x99\x4e\x12\x23\x0d\xcb\x82\xf8\x43\xb7\x3d\x1e\xaa\xa6\xed\x43\x92\xd8\x18\x87\x36\xc4\x6c\x64\xbc\x72\xc7\xc6\x50\x0c\x89\x10\xfb\xe6\x96\x10\x47\x32\xed\x82\xcc\x47\xd9\xc5\x83\x8d\xfb\xe7\xbe\x6a\x6f\xca\x6f\x4d\xbf\x20\x80\x77\x17\x75\x7a\x11\x79\x8b\xcb\xa8\x17\x95\x7e\x58\x96\x77\x64\x31\x24\x4a\x38\x58\xe3\x7f\x40\xb7\xbe\x17\xdd\xdf\xcd\x2e\x23\x42\x68\x55\xf0\xd5\x3f\x79\x6a\x56\x3a\x59\x62\x9c\x09\x59\xff\x39\x88\x51\x0f\xb5\x2a\xb1\x61\x80\x4b\x37\x72\x1e\x97\xda\x49\x8c\xc4\x54\xa2\xd1\x07\x36\x27\xeb\xb7\x5c\x43\xaf\xd7\x34\xb9\x5a\x12\xcb\x8c\x69\x8f\xa1\xda\x1c\x40\xe7\xb2\xd8\xca\x2e\x1d\x7b\x94\xfa\x55\x3e\x9f\x89\xd1\x08\x21\xc2\xf4\x5a\x47\x0e\x29\x89\x75\x55\xbc\x4d\xa7\x6b\xc9\x52\x4e\xc3\x08\x31\xc6\xfb\x1c\x75\x6b\xed\xa3\x3c\x36\xa1\xf7\xc1\x08\xcd\x52\x5c\x68\x0a\xd9\xb4\x68\x5d\x0c\xc6\x55\xbe\xfc\x71\xa6\x12\x54\x1e\xf7\xbe\x95\x81\x6c\xb4\x7c\x37\x98\xc9\xbc\x36\x55\xb7\x8f\x79\x3e\xd6\x92\xcd\x06\x23\x5c\x71\xc8\xfc\xf6\x95\xcb\xa2\xcb\x49\x16\x37\x1b\xc2\x3d\x4a\xbd\xe9\x76\x99\x76\xd2\x97\x39\x05\xe7\x77\xc3\x9d\x7b\xa6\x4b\xcb\x83\x25\xef\x94\xbc\x71\x26\xbc\x19\x56\x77\xc2\xb5\x56\xe8\x63\x5b\x1d\x55\x31\x80\xc5\x19\xe1\x90\x60\xe6\xb6\x59\xff\x76\xbf\x85\x66\xdc\x43\x64\x24\x49\x05\xc2\x24\x5f\xab\x20\x28\xc2\x48\x92\x29\x54\xc1\xbd\xb9\x7c\x98\x08\xd9\x32\x92\xe8\x04\x63\x7b\xdf\x12\x47\x84\xe2\xf2\x2d\x48\x8c\xf3\x0f\x73\xfd\x85\x4f\x83\x7a\x92\x72\x8a\x0b\xe9\xdd\xe5\xe4\xd2\x84\x4e\x70\xb2\x23\x05\xf0\x22\xaf\x67\xc5\xa4\x6e\x80\xc4\x3d\xd1\x15\x30\xfc\x75\x04\xe9\x80\xe9\xe5\x64\x94\xe0\xda\xbe\x77\x8d\x2a\x11\x85\x2f\xc9\x94\x5b\x3f\xf5\xc8\xd5\x76\xec\x9a\xde\x8d\xc8\xb4\x1c\x75\xe4\xc6\x8a\x7c\x8c\x48\x65\xb0\x49\xf0\xf8\xb4\xee\x32\xeb\xdd\xdd\xcd\xfd\xee\x72\xf5\xd8\x1f\x86\x04\x4d\x60\x5f\xf3\xa2\x58\xa9\x6a\x40\x44\x31\xa2\xb8\x03\x02\xf7\xa5\xb0\xe9\xbc\xd4\x69\x8c\x31\xe5\x15\xbc\x35\x7b\x59\x63\x28\x7e\x5d\x1d\xc3\x12\x4f\xb4\x8a\xb1\xf2\x8f\x74\x27\xdc\xa9\x96\x7b\xf7\x8c\x98\x84\x07\xb1\x03\x27\xf8\xd2\x05\x75\xc3\x75\x00\x17\xce\x8d\xd8\xe5\xb5\x2e\xe2\x6a\x96\xda\x4c\x8c\x40\x26\xf1\xcd\xf3\xfa\xeb\x4b\xce\x26\x8c\x58\xaa\x90\xe3\x70\x05\x8d\xb4\x79\xb5\x19\x60\xf7\x8c\x46\x4c\x71\x1f\x86\x7d\xdb\x5c\xad\xfb\x39\x47\xa3\xc4\x20\x40\xe5\xee\xe1\x61\x33\x9e\x05\x34\x02\xe6\x24\x8d\x11\xeb\x52\x0d\x5e\xf7\x8c\x76\xc1\x6c\xd4\x4b\x28\xf8\xe7\xef\x2a\x4e\x93\x7b\x49\x63\x42\x50\xa0\xc6\xb7\xc0\x27\x02\x8b\xfd\xc9\x44\x8a\x81\xda\x73\xfe\x86\xbb\xd0\xb6\xba\x82\x7d\xa5\xe7\x49\xc8\xdf\x66\x67\x36\x66\xf0\x53\xbe\x77\x4e\xe2\x7f\xca\x14\x63\x94\x58\x8b\x65\x0d\x27\x43\xfa\x63\xbd\xfe\x35\xf8\x8e\x32\x4a\xa9\x23\xe2\x49\x63\x1e\xca\x71\x1a\x41\x69\x92\xc4\x9e\x4f\xfc\x72\x5b\x55\x87\xf9\xa2\x12\x86\x09\x03\x1e\xd3\xef\xe6\xea\x63\x0d\xbd\x9d\x2b\xa3\x34\x8b\x99\x67\x44\xa3\xaf\xe9\x35\x80\x17\xad\x09\xb5\x9c\xfe\x79\x53\x9a\x71\x4c\x98\xd4\xf1\x63\xe5\x49\x23\x76\xe4\x5e\xb0\xd8\x2d\x1c\x95\x72\x19\x65\x34\x25\x1e\x77\xd2\x25\x8d\xb3\x55\x82\x32\xc9\xb0\x36\xa6\x2b\x03\x9b\xfc\x8f\x7e\x9a\x30\xe0\x32\xe9\xd7\x19\xf7\x7e\xfb\x5e\xfa\xec\x04\x16\x30\x00\x79\x81\x50\xcb\x60\x94\xd3\x58\xc5\xbd\xa5\x05\x0a\xdd\xce\x9a\xf4\x8c\x72\x99\x22\x11\xb1\x69\x65\x7f\x7b\x13\xa2\x89\x47\x40\xac\x9b\xe7\x6a\xfb\xdb\xe4\xe6\xa7\x9c\x2a\x27\xd2\xf9\x0a\x57\xa0\x27\xe2\xb9\xa3\x65\x98\x0a\x50\x81\x1e\xe7\x60\x56\x17\x78\xe9\xdd\x7f\x4f\xc4\x21\xa6\x6f\x16\xcd\xb2\x44\x93\xbe\x62\xe9\xdb\x67\xb2\x01\xe3\x4a\x8a\xa3\x2f\xc8\x6c\x6a\x58\xdf\xf9\xc7\x28\x78\x86\x82\x5f\x0c\xe9\xa9\x04\x89\xb1\x07\xca\x86\xbd\x1c\x95\x5b\x0c\xb6\xbd\xcd\x1d\xa3\x2a\x65\xd4\xf6\x75\xb4\xaa\xee\x42\xf3\xcd\x4b\x55\xb7\x88\xaa\x9a\xde\x78\xa5\x38\x84\xf6\x8f\x81\xb2\xcd\xdb\xfc\xc4\x2d\x8c\x51\x2d\x44\xec\x84\x89\xef\xc2\x97\x68\x1b\xc5\x32\x38\x89\x63\x25\xe5\x8c\x36\xc8\xf4\x2d\xea\x3f\x4d\x99\xb3\xda\x07\x93\xb7\x37\x57\xeb\xfb\xed\xcd\xf6\xf7\xd9\xb5\x99\x88\x20\x35\x24\x00\xb7\x72\x0d\x28\xfe\xbc\x4c\xfe\x67\xd4\x70\x8b\x97\xb4\xbe\xbf\xdc\xfc\x35\xae\x27\xa3\x46\xa6\xd4\x87\x7f\xf7\xf0\x13\x6d\xd5\xfc\x11\x90\xca\x74\xef\xd7\xd3\xb7\xef\x9e\x8b\xc4\x58\x14\x0b\xcc\x1e\x5f\xaa\xc6\xb3\xe7\x6c\xde\x4e\x63\x69\x16\x51\x27\x3e\xb4\x0d\x86\x3e\x68\xed\xd0\xaf\x76\x2c\xd2\x02\xcb\x53\x13\xa0\xf9\x29\xc6\x9c\xb1\x38\x49\x50\xb8\xe4\xb1\x2a\x0a\x57\x30\x42\xcc\xd7\x59\xf4\xc4\xff\xf8\x6f\x78\xb8\x8c\xc4\x5c\xf7\x60\xbd\xd9\x35\x50\x9a\x6a\xcf\x5c\x79\xac\xea\xd6\x56\x45\x3e\x9b\x41\x8c\x52\xa5\x74\xe8\xf2\x4c\xa5\xc2\xc6\x77\x9a\x31\x1a\xdb\xa8\x57\xda\xc2\x6a\xa7\xd3\xdd\x1f\xde\x09\xc6\x34\xc7\x90\x73\xb3\x79\x0c\xc2\xed\x4f\x80\x1b\xeb\x72\x1f\x96\x31\x1e\x73\x8c\x6d\x1f\x9f\x6e\xbe\xaf\xb6\xce\x00\xfa\xdb\xe6\x6a\xf7\xb8\x7e\xda\xdd\x6d\xd6\xf7\x97\xe1\xb6\x73\x4e\xbd\x43\x4a\x69\xf3\xe7\x63\x0d\x17\xd5\xc8\x6e\xaa\x1f\x04\x83\x86\x57\x83\x85\xbd\x51\x80\xc7\x92\xd8\xba\x16\x80\x3c\xd6\xc7\xbd\x7b\xb9\xef\xa0\x18\x82\x01\x96\x80\xab\x8c\xa8\xe3\x47\x6f\x5d\x73\x0a\xc8\x67\x2c\x65\x31\x12\x1a\xff\x9e\xff\xac\xfe\xda\x5e\xc3\x04\x64\x34\x60\x11\xbb\xf8\x7b\x7a\xd0\xa6\x98\x5a\x76\x9b\xcd\xc1\x29\x0c\xc8\xe5\xb3\x4e\x6a\x0a\xb8\xce\x87\xeb\x9b\xa6\xc5\x2c\x93\x12\xf7\x17\xe9\x48\xc8\xdb\xea\x02\x06\xb1\x38\xc6\x24\x8d\x50\x13\xda\xd7\x07\x51\xed\xf2\xcd\x53\x96\xbb\x18\xb1\x99\x35\x6b\x4f\x13\x6f\x26\xb9\xc5\x28\x74\xff\xbc\x1f\xcc\x39\xa0\xff\x02\x30\xe9\x40\x8f\x08\x4d\xae\xe5\x65\x97\xa9\x58\x45\x7e\x7f\x7a\xac\x2b\x55\xc0\xfe\x53\x3e\xcf\xe4\xde\x29\xeb\x96\x6c\xd4\xc6\x43\x56\x1d\x96\x5b\x97\xbf\x48\xc7\xc6\xed\x74\x93\x6e\x6e\x38\x98\x79\xac\x82\xeb\x69\x0d\xb0\xa4\x33\xe7\xca\x12\x5c\x09\x5c\x0d\xef\x44\x65\x29\x8c\x02\x1a\x0d\xdd\x25\x54\x89\x59\x5e\xff\x98\x89\x14\x56\x0b\x2a\xdf\x2e\xdf\x21\x7f\x6c\x7a\xd2\xa0\xa0\xc1\x18\xe8\x24\x48\x22\xef\xf6\x32\x2f\x66\x6f\xbe\x8d\x33\x65\x06\x47\x4c\xb8\xac\xea\x3a\x37\x81\xa0\xca\x98\xe5\x14\xc3\x9b\x87\xc7\xcb\x5f\x16\xc9\x52\x61\x5c\x26\x31\x2c\xb5\x79\x69\xb6\x2f\x75\x55\x22\xb8\x30\xa4\x71\x6e\x10\x8f\xb2\x0c\x11\x3c\x4b\xf8\x43\x3f\x24\x66\xb1\x13\x8e\xec\x36\xb2\x8b\xa2\x7a\x9e\xbc\x00\x3c\x4e\x09\xea\x2b\x87\x4a\xeb\x20\xa7\xcd\x38\x89\x62\x27\x22\x81\x55\x00\x6f\x89\xd8\x1f\xa4\x0e\x4d\xe6\x6a\x96\x79\x89\xfd\x92\xe9\xb9\x09\xcd\x10\x5f\xdc\x1c\x55\xdb\xa3\x05\x3f\x4d\x85\x38\x25\x11\x1d\x84\xe4\xd6\x33\xfe\xe4\xac\xa1\xc1\xa9\x74\xd0\x4e\x5d\xed\x3d\x81\x21\xa8\x04\x32\x8e\xe0\x94\xee\x39\x6c\x6f\x7e\x0b\x7f\x63\x99\x41\x29\x07\xaf\xb2\x34\xa1\x68\x30\xce\x23\x47\x2c\xb8\xfb\xe8\xb3\x44\xd2\x1f\x63\xae\xb6\xd7\xdd\x9e\xa9\xba\x33\xe3\x5c\x70\xc9\x02\x0e\xfe\x84\x67\xc7\x78\x22\x1c\x9d\xde\x51\x75\x57\xed\x65\xb5\xdf\x1f\xcb\xfc\x54\xa0\xde\x8f\x4f\x63\x12\xc7\x81\xe3\xf7\x0a\xa5\xaf\x42\x7f\xd6\x13\x63\x3c\x15\x16\xf5\x11\xfe\xbe\x3d\xe3\x2e\x1b\xc6\x99\x14\x85\x52\xee\xa0\x91\xa7\x3a\x7d\xd3\x39\xc8\x05\x89\xd0\xa0\xd0\xe3\xe5\xc3\x5f\x33\x16\xf2\x29\x57\xef\x19\x0e\x64\x08\x5c\xb9\xbc\xd8\x4e\x72\x18\x9e\x45\x12\x39\x62\x38\x81\x86\xf6\xe5\xf4\x17\x64\x59\x84\xda\x93\x5e\x03\xe9\xd4\xde\x85\x71\x19\x3b\xe1\xf4\xa3\x2b\x1c\xd5\x9b\xc0\x1b\x62\x5c\x6a\x50\x58\xdc\x6c\xfa\x25\x75\x3a\x19\x95\x87\x6e\xe6\xcd\x45\x0d\xf2\x35\x2f\x9f\xc3\x8c\xbc\x94\x67\x0a\x80\x5c\xa5\x06\x77\xf1\x7d\xde\xd3\xf9\xc2\x91\x4c\xa7\xa4\x4f\x60\xb6\x37\x77\xeb\xdd\xe3\x13\xee\xa2\x61\x84\x8e\x09\x12\x1f\x9a\x43\x55\x36\x55\x7d\xb5\xba\x59\x5e\x7d\xb8\x4e\x34\x78\x15\x36\xe8\x02\xe5\x25\xb1\x16\xc6\xb5\x16\x30\x62\x61\xff\xb3\x32\xb9\xd4\xdd\xad\x1c\xf7\x14\xff\x12\x1d\xfb\x6c\x84\xcc\xb5\xb6\xce\xb0\xe4\xa3\x85\x84\x6d\x2b\x67\xf6\xe0\x89\x14\xff\x4a\x98\x5f\x01\xb9\x89\xa8\xc8\x46\x1a\x87\x67\xee\x9e\x21\xd2\x64\xc3\xd3\xea\xdf\x4c\xc3\x1c\xc0\x6d\x0b\x72\x8f\x26\x21\xa7\x62\x63\xff\xea\xbf\x8a\x39\x69\x2e\xaf\xa7\x71\x2d\x75\x5b\xd5\x1f\xb3\x69\x61\x58\xbf\x11\xf9\xd5\x65\x59\x42\x82\x71\x20\x2c\x9a\x5b\x78\xbb\x96\xd2\xb6\xea\xc5\x97\xc3\xd8\xd4\xd1\x82\x43\x70\xb6\x36\x79\x3b\x88\xf6\xce\xce\x2b\x05\xa2\x91\x6d\xde\xbc\x7c\x6c\x64\xb1\x9f\x80\x07\x18\x07\x45\x11\xd7\x0d\x3f\x0f\x18\x89\x03\x3a\x3f\x8d\x38\xd3\x93\x1b\x07\x9a\x63\x43\xbe\x2e\xcd\x4d\xa9\x77\xfd\x49\x40\xa6\x23\x57\x06\x28\xec\x49\x73\x91\x5b\xc2\xb3\x80\x98\xac\xaa\x96\xcc\x66\x91\x4d\x9d\xe2\x9f\xcc\xeb\xab\xba\x3a\x37\xed\xad\x77\x38\xbc\x7c\xb8\xff\x76\xff\x17\x13\x02\x6e\xb3\x41\x0c\xc9\x01\x09\xc6\xc4\xbe\xee\x38\xe7\xde\x0d\xe7\x11\xce\xa5\x22\xdc\x5a\x67\xab\xb2\xbd\x59\x3f\x91\xf5\xbd\x17\x81\x67\x49\xa4\x08\x6e\xd1\x17\x3f\x07\x91\x4f\x96\xc4\x71\x8c\x05\x49\x69\xcc\xf7\xa1\x95\x39\xb9\xae\x24\x26\x06\xbb\xaa\x4e\x78\x76\x65\x66\xa1\x6b\x12\x4b\x8d\xc9\x92\x69\x41\xee\xd1\xf0\xb2\x8b\xc2\x69\xf8\x0a\x2a\x20\x96\x93\xb9\x75\x0a\xb3\x9d\x4e\x86\x84\x6a\x93\xfa\x67\x80\x38\xf9\x09\x71\x9f\x25\x14\x18\x9a\x61\x79\x3a\x65\xdf\x47\x46\xdf\xe9\x66\xb7\xfc\x4c\x12\x66\x19\x12\x2b\xbd\x42\xae\x13\xc4\x28\x07\x9a\x66\x37\x42\x98\x28\x80\xb1\x27\x02\x54\x2c\xe1\xb1\x44\x1a\x8d\xcd\xeb\xc6\x69\x34\xde\x5c\x3e\x0c\x5d\x94\x84\x0b\x8a\xbd\xed\x7d\x65\x72\xfb\x81\x75\x8e\x39\x01\xb1\x1b\x24\xd1\x48\xf5\xbe\x72\x68\x39\x5f\x2b\x6e\xfa\x93\x64\xc2\x51\x1c\xe5\xe1\x5b\x33\x9c\x5a\xa6\x28\x48\xea\x1b\x80\x3b\x3d\x5c\x55\xc2\x78\x34\xea\xa8\x5f\x7c\x7c\xa6\xff\xc2\x92\x24\x25\x48\x17\xc2\x8a\x5f\x5f\x8b\x99\xee\x61\x9e\x67\xcf\x92\x44\xa7\xb8\x49\x05\x35\x38\x8c\x10\xc6\xdb\x76\x92\x46\x3a\x33\x9e\x3d\xb2\x19\xd7\x7e\x66\x77\x3e\xa5\xb4\xf7\xeb\x74\x13\x7b\xd2\xea\x9a\x8f\x4e\x1c\x03\xed\xb9\x77\x95\x4b\xfb\x2f\xd4\x14\xeb\xd0\xdb\x97\xbc\x36\xe3\x58\x25\x11\x4c\x49\x3a\x58\x83\x4d\x9b\xdc\xe7\x16\x6f\xff\xd9\x2c\xe5\x0e\x2d\x9a\x97\xed\xea\xd8\xbe\x54\x5d\x5a\xfc\xcb\xd2\x76\x9e\x64\x99\xc4\x4d\xab\xcd\x0f\xaa\xea\x9f\x42\x66\x12\xe6\xa2\xe9\xaa\x86\x0d\xe8\x1a\x5c\xc5\x7e\x11\x7d\x90\x48\xa0\xb8\xd6\xfe\x5e\x1d\xeb\xc7\x8f\x5a\xee\xfb\xc4\x3f\xd1\x2c\x45\x98\xf4\xcd\xc3\xb7\xfe\x4f\xc2\x41\x4a\xbe\xd4\x52\xa3\x88\x45\x7f\x00\x22\xaf\x9c\xe8\x97\xf4\x39\x6c\xd8\x8f\x33\x34\xc2\x56\xfb\xce\x75\x75\x66\x33\xd2\x70\xcd\x69\xaf\xc0\x1c\xf8\x5f\x33\x15\xe4\xe5\x80\x29\x31\x3a\x4e\xfa\xb4\xf0\xb9\x3c\xd3\x37\x4f\x40\x70\x9b\x05\xe8\x7e\x13\xac\x74\xc7\x06\xf9\x7e\xa0\x4d\x8d\x24\x3d\xc3\xd0\xff\x35\x8d\x12\x8b\x6c\xd0\xe7\xfc\x0d\xc6\x08\xd2\xe6\x42\xea\x57\x57\x06\xb9\x38\x3e\x3f\xf7\x41\x68\x1a\x89\x54\xeb\x50\xac\x6e\x3d\x1f\x62\x12\x7b\xa4\x71\xe6\xee\xdd\x1e\xb1\xe1\x1b\xf0\xf0\xb1\x65\x5d\x12\x96\x92\x4c\x8a\x9e\x43\xde\x6c\xab\x40\xaa\x59\xf9\x90\xe6\x4c\x0b\x3c\x25\x92\x62\x57\xc6\x54\x7d\x3e\x76\xe7\x70\x6f\xe7\x60\xf3\xe1\x83\x96\x63\x33\xb2\x96\xe1\xe6\xa4\xc4\xa6\x88\x15\xdd\x79\xdd\xb7\x05\x7b\x27\x3f\x92\x42\x94\xe9\x65\x35\xb5\xd9\x48\x16\xb9\x5e\x60\xb7\x97\x97\xcf\x50\x7c\xa6\x7f\xce\x52\xa6\x18\xca\xf9\xac\x8a\xe2\x63\x28\x06\xa7\xcc\x30\xe9\x3a\xd4\x7e\x61\x9d\x11\xe4\x58\xca\x63\x4a\x7b\x0e\xc2\xdb\x75\x55\x83\x96\x7d\xc9\x30\xe5\x09\x43\x34\x98\xf3\xd7\xfe\xee\x84\xaf\xe6\x8d\xb3\x34\x35\x49\x50\xda\xf3\x3a\x8e\x7f\x12\xb0\xf9\xcf\x89\x88\x63\x46\xe2\x98\xec\xf8\x94\x77\x9b\xed\x45\xf8\x72\x91\x1a\xe4\x11\xbd\xe7\xe5\x45\x6e\xae\xe0\xb5\x90\x7f\x6d\xd1\x48\x33\x9e\x68\x3b\xc8\x30\xcd\x07\x0f\x95\xa5\x34\xb3\xda\x44\xa1\x90\x75\xe8\x02\x8e\x87\x3a\x7f\xce\x47\x7a\x49\x93\xed\x36\x95\x29\xd8\x78\x94\x4f\xd6\xa3\x2d\x2a\x95\xc2\x20\xd5\xe7\xef\xd0\xbe\x07\x30\xcf\xec\x56\x29\x99\xa0\x06\xf0\x6d\xf5\x8e\x2c\xed\xda\xd5\x0b\x4f\xb0\x05\xa9\x4e\x29\x0a\xe8\xbf\x9b\xfc\xcd\x16\x95\xaf\x70\x07\x85\xe6\x20\x36\xc2\x52\x6d\x01\xa3\xd0\x17\xd9\x0c\x96\x3b\xd3\x53\x99\xc4\x29\xf8\xa2\x5d\x28\x0a\x97\x7d\xdc\x5c\xcd\xc7\xc8\x0c\x6b\xc3\x4e\xa5\xde\x9b\x8b\x3c\xbc\x41\x6d\x8b\x40\xa4\x63\xa9\x81\x18\x9b\xb6\x5d\x18\x39\x02\xed\xb2\x14\x88\x22\x23\x59\xb8\x00\x1c\x9d\xfe\x74\x9b\x25\x08\x63\xda\xcb\xd7\x93\xdd\xe5\x5f\x21\xf8\x4e\x6d\x96\x61\xb3\x7b\xf7\x36\x5f\xa4\xc3\x2f\xb6\x3a\xc3\x17\xa3\x99\xac\x1a\x16\x84\xf2\xf3\xf8\x5b\xd9\x04\x27\x63\x5c\x87\x86\x21\x0e\x10\x1f\x4c\x7a\x4a\x78\x77\x1e\x34\x67\xf6\xe5\xe9\xa4\x12\x11\xd5\x24\x60\x50\x64\xe1\x69\x1b\x33\xe5\xec\xa9\x08\xd4\xa0\x9d\x33\xfa\xa3\x08\xa7\x63\x4e\xe8\xb1\x81\xa2\x38\x53\x23\x0f\x23\x75\x16\x80\x28\xdf\xca\x5c\x57\x75\xb9\x8c\xbf\x12\x11\x70\x6c\x01\xa0\xd1\xd8\x71\x3f\x59\x56\x45\x4c\x24\xc6\x65\x28\x2a\xe2\x94\x44\xc6\xf5\xac\x25\x76\x60\x48\x53\x44\xcc\x79\xe6\x53\xe2\xee\x8e\x61\xaa\x52\x57\xfb\x3b\xa8\x5f\x0b\xd8\xd6\x00\x4b\x2b\x98\x88\x33\x8e\x5a\xf1\xd8\x67\xee\x12\x49\xd6\x5f\x8b\x56\x88\x68\x76\x6b\xf6\xaa\xa8\x41\x9a\x0f\xe4\x59\x8d\xfa\xf8\xd3\xdf\x46\x78\x86\x22\x3d\xdf\xb6\x93\x2e\xb2\xa0\x91\x31\xbe\xab\xd3\x6d\xeb\x75\xb3\x3a\x65\xfd\x4f\x2f\x8b\x4a\x27\xd1\x51\xe0\xb3\x9f\x67\x54\x7e\x10\xd3\x29\xae\x20\xab\xc3\xe1\x13\xa1\x1b\x26\x78\xe4\xe0\xc7\xd2\x18\xaf\x54\xe7\xd5\x98\x96\xbf\x9b\x0b\x8b\xbd\x3b\x7c\xf3\xff\x71\xcc\xff\x58\x2a\xed\x89\x84\xc5\x38\x51\x1d\x60\xa0\x8b\x1d\x5d\x2e\x3f\x85\x2b\x8a\x84\x13\x7c\x2a\xaa\x92\xb5\xb9\x83\xbd\x82\x7a\x75\x0a\x2d\x13\x09\x77\x1a\xd8\x7d\xbb\xea\xf3\xfd\x4d\x24\x59\x84\xcb\xae\x67\x70\x7b\xcc\xcb\x49\x53\x70\xb6\x1c\x4d\xc2\x53\x91\xaa\x14\x33\x97\x6f\x65\xde\x7e\xd0\xb0\xd9\x88\x14\xc0\xf8\x20\x02\x45\x26\xba\x48\x01\x2b\xc3\xbf\x8c\xde\x93\xf0\x82\x88\x54\x60\x6a\xd2\x25\x2e\xb8\xb4\x3d\x58\x5f\xa8\x99\x5e\xaf\x30\xca\xaa\xbe\xd1\x60\xf3\x7a\xef\x35\x19\x3f\x7f\x9d\xb3\xd8\xc9\x91\x7a\x3f\x58\x8c\xbf\xfe\x59\xed\x55\x0e\xbb\x7f\x3e\x5c\xec\x9a\xbd\x2c\x8a\xc3\xb0\x7a\x88\x8c\x24\x72\x60\xed\xdc\xc9\x9f\x8f\x2f\xb2\x81\x78\x76\x31\x19\xd1\x58\x70\xbf\x58\x6d\xd6\x0e\x2c\xf0\x70\xbf\x7d\xba\xb9\xf8\x36\xd8\x22\x31\x91\xf1\x14\x33\x8d\x26\x37\x70\x01\xed\xa3\xfc\x98\xf8\x66\x85\x51\x22\xc1\xce\x44\xb0\x27\x41\x93\xd5\xfe\x98\x20\x10\x40\x0b\x48\xa8\x6c\xee\xe4\xe1\xd0\x33\x6c\x99\xc8\xac\x4c\xa3\xbe\x4c\x8e\xd0\xba\xb6\x05\x13\x56\x8e\x93\x5e\x9e\x90\x1e\xaf\xf0\xec\xf4\xfe\x66\x73\x4d\x42\xac\x1c\xe8\xc7\xa0\x82\xdd\xa3\xac\x9d\x2a\xdf\x99\xd7\x55\x45\x4e\xfb\x40\x1a\x13\x84\x19\xee\x9f\xe0\xbf\xab\xcb\xcb\xcf\xb3\x4b\xa1\xa8\x2b\xf9\xee\x9d\x63\xc2\xd8\x12\x86\x09\xa5\x5c\x59\xea\xf2\xe6\x69\x8a\x5c\x11\x9a\x72\x2c\x65\x39\xad\x85\xbc\xd9\xd5\xa0\xf3\x43\xde\x0b\x52\x33\xa1\x65\xe2\x4c\xc8\x6b\xa9\x5f\x31\xf6\xfc\x5e\x15\xc7\xfd\xe7\xbe\xb5\x4c\x68\xe5\x24\xf6\x2e\x65\x5d\x54\xcd\x9d\x6c\xab\xa6\x3f\xa3\x76\xbe\x80\x17\xc7\xba\x5c\x54\xd7\x9e\x9f\xca\x0a\x30\x5e\xb5\x3e\xd7\x70\x05\x7f\x01\x11\x2f\x0c\xf0\x60\x78\x81\xe5\x10\xbc\xdd\xa4\x3f\xa8\xe9\xd0\x09\xed\x75\x39\x16\x43\x7d\x01\x04\x32\x16\xbc\x5f\x9d\x2d\x49\xfe\xc7\xb9\xaf\x05\xa1\xb1\xbc\x77\x9d\x9b\xa1\xff\xb1\x1c\x49\x0b\xc8\x08\xd6\xd5\x50\x02\x63\xea\xfb\x34\x09\xb9\xe6\x1f\x53\x02\x45\xb6\x77\x4d\xd5\xe5\x84\x87\x7f\x1c\xa1\x19\xa3\xdd\x85\x8d\x12\x4b\x82\xec\x77\xd5\x2e\xc3\x21\xb2\x88\xf2\x6c\x8c\x7a\xf5\xd4\xa5\x31\x61\x88\x65\x11\x8b\x23\xde\x67\x52\xf9\x63\x55\x15\x6b\x93\xb7\xbb\x6c\x52\x5e\xca\x22\xce\x10\x6e\xf0\x28\x6b\xb9\x87\x16\xea\xfc\x8f\xf3\x86\xb4\xff\x7f\xfd\x1b\xae\x45\xa7\x48\xec\x3c\x96\xda\x6d\x8c\x67\x10\xf9\x59\x0c\x46\xba\x5c\xf3\x12\xea\x56\xe6\x65\x40\x98\xfd\xc5\xea\xe8\x28\x1c\xce\x48\x12\x61\xc9\x02\x0b\x20\x67\x7f\xf8\xe4\x9e\xd1\x54\x63\x06\x79\x55\xd5\xb0\xcf\x7f\x1b\x6f\xce\x19\x4b\x28\xd6\x23\x67\x9d\xa7\xc5\x02\xfe\xbf\xd8\xbf\x67\x77\x80\x47\x16\x41\x1c\xbf\xfe\xf8\x7a\x5d\xd5\x5f\x64\xff\x34\x39\x8b\x9c\x39\x53\x5b\x1f\x75\x7b\xac\xe1\xb1\x86\x1b\x5d\xfd\x32\xfb\xb8\x76\xf5\xd9\x7d\x85\xa0\x2f\xd9\xcb\xbc\x0f\x43\x12\xc8\xa4\xc3\xe1\xe7\xcf\xcf\xce\x38\x25\xaf\x61\x5d\xd7\x7d\x3f\x2b\x4b\x00\xd2\x74\x80\xda\x36\xf9\xf9\xe4\x2e\x4b\x93\x04\x71\xee\x97\x05\xc8\x3a\x3f\xee\x27\xf7\x42\xa4\x02\x83\xe7\xff\x8c\xda\xba\xfe\x50\x16\xc5\x09\x71\x5a\xf9\xae\x3f\x3b\x5b\x9b\xb3\x8c\x09\xdc\x92\x8f\xcd\x0c\x55\xd0\x1d\x51\xbe\x2a\x76\xf7\xf1\xa5\x96\x07\x18\x0e\x81\xc3\x78\x3b\x9b\x74\x67\x15\xfe\x63\x1d\x30\x0b\x99\x24\x06\xd9\x32\x38\xbb\x1e\x9d\x05\xcd\xf4\xa5\x91\xca\x62\x1d\x1c\x1f\x9a\x63\xc8\xba\xcd\xe3\x94\xf1\xc5\x32\x09\x29\xa2\xc2\x16\xa5\x42\x3e\x93\x08\xf1\x9f\x57\xa9\xe0\xbe\xc8\xbd\x2e\xe0\x4d\x8e\x57\x82\x4c\x67\x2a\x58\xa0\x05\x33\x01\xbf\x84\xcd\xae\x42\x4b\x1d\xf7\x98\x85\xe6\xdb\xc4\x30\x93\x65\x5a\x0b\x87\x1c\xaa\x0a\x73\x5d\x05\xdf\x1e\x7f\x10\x12\xd7\xb8\x34\xce\xaa\x11\xa3\xd1\x11\x70\x2a\x8c\x52\x04\xef\x89\x83\x7e\x5e\x78\xbc\xf2\x09\x8a\x6c\xfa\x7c\xc1\x6a\xac\xf2\x38\x0b\x19\xac\x8b\x0e\x3b\x75\x66\x15\x27\xbd\x53\xd4\x84\xe3\xcb\x64\x94\xa6\x98\xbf\xdf\x7d\x74\xf3\xf7\xbd\xaa\xcd\xd7\xbc\xdf\xd2\x64\xa4\x13\x84\x9d\xac\xe5\x73\x55\x4f\xec\xe8\x98\x8c\x75\x82\x1e\xf0\xce\x98\x42\xee\xe4\x18\xd6\x28\x63\x50\xd8\x26\x2b\x64\xe3\x2c\x86\x77\x36\x4e\xbe\xca\xe6\x65\xe7\xaf\x3c\x0c\x24\x54\x81\x5b\x5c\xfc\xc4\xbb\x29\x91\x93\x81\x7d\xc0\xa5\x5e\x81\x24\x8a\x60\x05\xad\xcb\x24\x31\x42\xb8\x94\xe5\x45\x0d\x52\xbf\xf4\xe7\x04\x19\x9c\x60\xb7\xf9\x1e\xce\xfa\xaa\x31\x49\x93\x0c\x7f\x84\x53\xe6\x3c\xed\xf2\xff\x6d\x36\x3c\xa5\x18\x74\x34\x24\x1a\xcb\x63\x31\x49\x35\x89\x1d\x64\xee\x43\xc1\x3d\xbc\x8f\xfc\x87\x99\xa4\xc6\x60\x50\xba\x93\xc6\x6c\x2b\x44\xdc\x7c\x85\xe2\x0c\x90\x4b\x32\xa1\x43\xaa\xbb\x1a\x05\x66\x9f\x96\x76\x25\x93\xd1\x80\xe9\xca\x35\xdc\x55\x25\x84\xc4\xac\x3b\x88\xad\xaf\xed\xc3\x76\x75\xbb\xfb\xed\xc2\x59\xdf\xee\xae\x1f\x9e\x76\x8f\x4f\xeb\xdd\xa8\xe9\x26\x99\x4a\xd3\xa4\x8f\x41\x1f\x0e\x50\x7a\x63\x92\xd9\x7d\xe3\xc4\xf5\x6b\x9a\x16\x0e\x7a\x20\xab\xc9\x24\x22\xb1\x8f\xf1\x2e\x3e\xb6\x1f\x07\xa4\x6f\xcd\x18\x76\x0b\x09\x89\x4c\x63\x9a\x42\x70\x2e\xaa\x8a\x02\x50\x24\xec\xcc\x1d\x4a\x05\x81\x3e\x25\xd2\x55\x6d\x2e\x9c\xd9\xc1\x89\x2e\xc1\x22\x02\x3a\x9c\x24\x83\xcc\xb5\x17\xa1\x34\xc1\x45\xe3\xd3\xf0\x4a\xa6\x5a\xe2\xde\x85\xf3\x69\xc9\x61\x8c\xc9\xd4\x5a\xa7\x08\xd2\x85\x7f\xbd\x66\x04\x93\x82\x48\x63\x07\x80\x86\x97\x8d\x37\xdf\xae\xb7\xfd\x08\x96\x61\xa4\x25\xdf\x64\x91\x4b\x55\x4c\x64\x7d\x98\xd4\x54\x21\xcc\xd8\xfd\x66\x54\xf2\xd9\x4e\x9c\xd9\x26\x31\x8b\xd4\xa9\x33\xbc\x0a\x31\x0b\x0a\xa4\x9e\x03\xf8\x4a\x2d\x59\x8f\xa4\x2a\x46\x9a\xb1\xfe\xb0\x4d\x25\xf1\x25\xac\x10\x22\xac\x4a\xf3\x28\x3f\x1e\xbc\xdb\x45\x0f\x2b\x98\xa0\x0b\xa4\x35\x04\x91\x8c\xf8\xe5\x8d\x33\xac\x39\x2e\x15\xd6\x55\x44\x9c\x33\x03\xd2\x12\x42\xbf\x4e\x45\xa9\x23\xb1\xb9\x0c\xc3\xdd\xf0\x59\x65\x50\xc5\x31\x23\xfe\xd2\xbf\x1c\xa1\x59\xe0\x0a\x33\x15\x4b\x8b\xe5\x0d\x75\xfc\x20\x01\xb7\xad\x62\xed\xcc\x4c\x6e\x2e\x1f\x46\x78\x6b\x45\x94\xcd\xbc\xae\x74\x0b\x9e\xd0\x11\x8e\xd1\x34\xc2\x96\x48\xae\xab\x87\x37\xa8\x43\xb1\x41\x31\xaa\x91\x3b\x14\x6e\xf6\x3f\x1f\x2e\xa6\xd3\x42\xb1\x14\x88\x23\xd8\x39\x2f\x9b\x1f\x79\xfb\xb2\x2e\xf5\x58\x97\x80\x29\x06\x29\x32\xcc\xe4\xbb\xac\x4d\xe3\xa6\xc8\x64\x97\x52\x3c\x25\x58\xba\x32\x39\x0a\xec\xdf\xc3\xfb\xa6\x95\xaf\x30\x1c\x57\x4e\x0f\xf1\x50\xe5\x65\xbb\xad\xa6\x9d\xc7\xc5\x39\xad\x12\xe6\xac\x72\xda\xfd\x61\xf3\x72\xb4\xb6\x00\x24\x7e\x2c\x2e\x7f\x2a\xe1\x80\x96\xad\x18\xaa\x6c\xb6\xab\x2f\x61\xdd\x50\x49\xe6\xbc\x83\xff\x53\xe9\x57\xf8\x38\x63\x42\xc1\x54\x22\x21\xe9\xee\x83\x95\x79\x01\xc6\x39\x01\x8c\xfb\x6c\x2a\x31\xd4\x29\x50\xf6\x56\xb6\x75\x75\x3c\xe4\x27\x8f\x3d\x8d\x78\x1a\x24\xb0\xda\xd5\x33\x9c\x3c\xf3\xd4\x68\xa4\x1e\xbd\xc8\xe6\xe5\x04\x58\xa3\x84\x96\x98\xaa\xdd\xad\x7e\x1f\xab\x40\xfb\xa3\x19\x51\xd8\x27\xae\xde\xa0\x36\xb5\xb4\xed\x6a\x28\xba\x87\x21\x0c\x30\x40\xf4\xbc\x25\xfa\x99\x43\x34\x53\x2a\x06\x7c\x6e\x6e\x55\xf5\x72\xe1\xa7\xc1\xb1\x52\xa9\xc3\x14\xe2\x9b\x7d\x9d\x97\xb2\xd4\xc3\x36\xae\x94\xc8\x0c\x06\xa5\xf2\x0d\xee\xf3\xa9\x16\x20\x53\x4a\x13\x04\xc6\xe7\x4d\xb7\x01\x20\xb9\xbe\x96\x2d\x3c\xf7\xbf\xca\x44\xdc\xf0\x9e\x07\x97\x57\x26\xd7\xb2\x78\x2c\x6f\xfb\xe3\x82\xdb\xbe\xfd\x79\xd8\x4a\x35\x7b\x76\x40\x2c\x8f\x7c\xa5\x1f\x0d\x2a\xc2\x07\x6d\x0c\xa8\x37\xfd\xf7\xb6\x5a\xf5\x54\x4f\xfa\xef\x70\x94\xc8\x5e\x01\x0e\xd5\xe7\x9d\xd6\x45\x55\x8f\x71\x58\x3a\x4a\x79\xe2\x2b\xc8\x17\x63\x3d\xa9\x70\x58\x58\xc4\x84\xa9\xaa\xae\xab\xf7\x53\x5d\x10\xa6\x63\xe1\xd8\x0e\x0a\x4a\xb0\xb9\xce\xe5\x1c\x2a\xae\x89\x8c\x30\x14\x47\x78\x24\x6c\xab\xdb\xaa\x19\xb8\xc3\x9a\x74\xbb\xe4\x80\x84\xfa\x15\x3e\x2e\xab\xb2\x69\xe5\x3c\x62\xd0\x34\xa6\xd6\x0b\xc8\xf9\x44\xf0\x8b\xdc\x03\x7a\x20\x58\x39\xd3\x93\x65\x9a\x65\x96\xe8\x1e\x4a\xee\xee\xfb\x32\x59\x4a\x27\x0c\x88\xb3\xb6\x79\x03\x59\xdc\x7d\x7c\xaf\xe6\x56\x12\xe7\xa5\x8b\xc2\x29\x64\xe6\xd3\x16\x59\xb7\x37\xba\xba\xae\x6a\x07\xca\x6c\x26\xe6\xed\x4c\x27\xd6\xa6\x4e\x38\xf2\x6d\x0b\xd2\xa5\x11\xd3\xb8\x5f\xa7\x89\x70\x0b\x21\x3a\x3e\xfa\xee\xe2\x82\x30\x49\x37\x52\xda\xf1\x5e\xe3\xf6\x62\x7f\x50\x44\x9a\xea\x3e\x47\xf8\xfa\x70\x75\xbb\x4b\xee\xfa\x83\x54\x38\x2d\xf7\x3a\x7f\xcb\x65\xb1\x7d\xa9\xa1\x79\x19\xa0\x9e\x3a\x4b\xa5\xf1\x20\x60\xec\xf9\x62\x54\xe5\xa7\xf7\xec\xee\x65\x42\x62\xed\x3c\x58\xa7\x4c\xe5\xa5\xba\xe3\x8a\xf4\xb4\x65\xef\x6d\x18\x8e\x49\x92\xba\xf2\xb7\x2c\x66\x2f\x67\x18\x20\x13\x2c\x01\xa3\xb2\xf3\x13\xc8\xa6\x5f\x08\xb4\x8a\x53\x69\x7a\x43\x22\xf7\x80\xd7\xa8\xd4\xd8\xff\x0a\xa5\xd3\x2c\xee\xeb\x5e\x05\xf8\x67\x12\x0e\xeb\x94\x22\xdf\xfd\x7b\xf5\x13\x8a\xd0\x95\xaf\x67\xa6\x31\x13\x4f\xb0\xf0\x41\x9b\x60\x38\xf2\xa3\x96\x87\x03\xd4\xb7\x95\x7e\x5d\xb7\x2f\x67\x0c\x33\xa7\xd3\xd2\xc4\x0e\x69\xe0\x37\x12\xb7\x10\x87\x0b\x32\x9c\x84\x32\x8e\xab\x73\x2e\x58\xf2\x32\x0d\xb1\xc4\xa5\xbc\x9d\x48\x6a\xc8\x13\xf5\x46\x3f\xdc\x32\x86\x6b\x2a\x34\x6d\xbe\x97\x2d\x74\xd3\xea\xed\x14\x7b\x6e\xa2\x8c\x60\x26\xe3\x92\xc6\x6e\x1f\x0b\x33\xd2\x44\xd2\x35\x01\x9f\x61\x49\xf5\xa8\x3b\xae\x99\xe8\xaf\xc8\x37\x9a\xfb\x0f\x6b\x27\x77\x38\x68\xc7\xc6\xd1\xdd\xf6\x66\x9e\x08\x9b\xc8\x02\x52\xff\x50\x0a\xed\xb1\x6f\xf2\x9b\x38\x72\x2a\x58\x79\xe3\x3c\xd5\x10\xb1\xf9\xf7\xa6\x8f\x6a\xc3\xb0\x84\x21\xdf\xa5\x69\xbb\x5c\x56\xcb\x96\x7d\x06\x07\x0e\x1f\x12\xae\x65\x1b\xe6\xee\xdf\xab\xbc\xdc\x1c\x8a\x7c\xf8\x72\x15\x47\x0e\xf2\xec\x56\x27\x97\xf5\xf8\xe0\xab\xef\xd4\x19\xa2\x8d\xb2\x21\x73\xd0\x70\x40\x1e\xf3\xec\x26\x11\x03\x3a\x19\xdf\xc4\xe9\x6b\x6f\x28\x25\x92\x8c\x6c\xa9\x01\x1c\x7a\xb2\x99\x93\xf8\x0d\x8b\x19\x06\x03\x2e\xd4\xad\xea\xbd\x2c\xfa\x06\x7d\x55\xdf\x98\x66\xde\x09\x36\x5c\x28\x6c\x01\xde\xd5\xef\xe3\xc2\x85\xe1\x9a\xe0\xb2\xd5\x56\xeb\x2f\x4f\xb3\xf9\x90\x88\x54\xd8\xe0\xc3\x76\x97\xeb\x3a\xc8\x9d\xcf\x86\x65\x12\x21\x9f\x9b\xd0\x97\x3b\x6d\xc9\x8e\xe3\x63\x93\x18\x15\xf5\x2b\xe5\x66\x01\x29\xfd\x79\xed\xcc\xa4\x8c\x38\xcd\xe5\xfe\xf3\x9f\x8f\x17\xcc\x3d\xc1\xcd\x8f\x3e\xd4\x34\x42\x38\xa2\xcf\xd5\xd5\xdf\x07\xb2\xa5\xc9\x62\x9d\xc8\x60\x95\x29\xf3\x10\x7c\x1a\x65\x08\xfa\x11\xdc\x56\x3d\xee\xd2\xc1\x1f\x96\x5f\x38\xa3\xa5\x11\x81\x51\x70\x95\xdb\xee\x51\x96\x0e\x18\x33\xb2\x77\x60\x46\x6b\xc6\x64\x48\x95\x0f\xcb\xd9\x84\xe9\x66\x4d\x80\xa6\xa1\x7d\xe3\xdb\xe6\x45\xd6\xf3\x57\xd7\x74\x41\xa0\x0f\xc5\x7b\x5d\x88\x1b\x73\x5d\xd5\xa7\xa8\x6a\x03\x2c\xc2\x53\xae\xca\xb2\x9a\x4c\x06\x48\x5d\x67\xfd\x7b\xde\x1c\x65\x31\x92\xfd\x64\x06\x24\x28\x6f\xfe\x56\xe7\xf0\x86\xe8\xe6\xc5\xf5\xcd\x00\x38\xd4\x63\x30\xc2\xbd\x98\x20\x9e\xce\x12\x03\x0c\xd8\x38\x22\x61\xe9\xdb\xcb\xbc\xf4\x6a\x87\x5d\x06\xfc\x60\x1d\xc8\x69\xf9\x76\xdb\x48\x62\xe2\xfb\x7a\x34\x55\x73\xf1\xe1\x9a\x65\xe1\xc2\x2d\x13\xd8\x94\xeb\x72\x8d\xdb\xf5\xf7\xf5\x6d\x4f\xd6\x33\x16\x9c\x4e\xfc\xad\x2c\xcd\x5e\xd6\xaf\x97\x55\x8e\x94\xaa\x6b\x3f\x00\x62\x6e\x80\x07\xb5\xb2\x59\xd4\x03\xb1\x88\xb8\xdf\x20\x9d\x24\xc1\x75\x55\x23\x96\xe3\xf3\xa8\x1f\x62\x41\x12\x9f\x35\xdd\x1f\xf7\x23\x30\xce\x9f\xb4\xa8\x81\x24\x04\x15\xa7\xde\x0b\x6c\x30\x5e\x8c\xd0\xee\xc0\x65\xe4\x25\xc2\x9d\xe6\xd6\xb7\x0b\x68\x9d\x68\xf5\x62\x1e\xbe\xfc\xcf\x62\x18\xfd\xb7\xa5\x77\x0a\x12\x9a\x61\xb6\x63\xa1\xd5\x2f\x9b\xa2\x5a\x16\xc6\x67\x90\xc8\x0c\xd5\x8e\x5a\x90\xfb\xb1\x09\xdc\xc9\x30\x47\xc4\x6d\xa0\xee\xa2\x25\x2c\x7a\x7c\x7e\x33\x52\x6e\x31\x3c\x59\x52\xb6\x9b\x4e\x48\x48\x85\x74\xc6\xf0\x2d\x22\xa7\x07\xb0\x55\xb8\x79\xa9\xb1\xda\xf6\x5a\xa1\xd0\x3e\xc9\xbc\x99\x83\xb9\x40\x44\x90\x85\x5a\x2c\xf2\xe8\x2f\xab\x43\x88\xef\x41\x24\x80\xe4\x4e\x2d\x0b\xdd\x9e\x54\x6c\x40\x08\xeb\x0c\xf2\xe5\x87\xdc\x9e\x12\xae\x20\x13\x1c\x51\x7a\x33\x41\xa9\xcb\x99\xa1\x25\x03\x49\x1c\xac\xe9\xfa\xf6\xdb\x6f\xf8\xfc\xc7\xaf\x2f\x48\x26\x83\xda\x86\x77\x45\x30\x8e\xe5\x3d\xb6\x76\xf8\xda\x9b\x4f\x31\x90\xde\x67\xfe\xf9\xed\x00\xbb\x03\xd4\xbb\x5f\xa1\x6f\x80\x81\xf2\x00\x9d\x6e\x7e\xe7\x75\xe3\x13\x97\x75\x69\xae\x46\xa2\x22\x61\xac\x8a\x8d\xb3\x5f\xdd\xef\xab\xb2\x07\x23\xff\x25\x3c\x0f\x28\xab\xb1\x38\x7c\x0c\x32\x8d\xa1\x08\x01\x3a\x8d\xa4\x33\x13\x6a\xa1\xde\xe7\x25\xac\xda\x56\xea\xee\x21\x3e\xd4\x57\x60\x5d\x94\xf1\x70\x6c\x75\xb5\xc7\xb7\xaf\xf5\xe1\xc5\x5f\x16\x58\x09\xdf\x63\x24\x76\x7f\xbb\xa4\xcd\xd5\x8d\xc7\x35\x44\x30\x11\xb1\xc9\xb0\x04\xcf\x17\x02\x43\x2d\xee\x1a\x5a\x3a\xdf\x8c\x6e\x4b\x22\xfd\x67\x13\x8b\xe5\x9d\x7d\x5e\x5e\x5e\x6d\xb7\xd5\x40\x5f\x86\x7e\x88\x74\xec\xa2\xdf\xab\x63\x97\x17\x9d\x79\x45\x80\x33\xdf\x5d\x7f\xab\x5e\xc1\x01\xbe\x4e\xc0\x5a\x00\x59\xea\xdc\x20\xda\xaa\x06\xe7\x16\xe6\xb6\x0b\x7f\xdc\xc6\x34\x80\x0e\x71\xea\x74\x8f\xaa\x3a\xb6\xe3\xea\xeb\x90\x13\x83\x8d\x13\x44\x72\xd8\xbc\x34\x63\x1f\xee\x70\x58\x12\xac\x96\x5a\x80\x3b\xf9\x0a\xeb\x9f\x87\xaa\xee\x2d\x56\x99\x8d\xe2\x04\x15\x42\x42\x39\xc1\xd5\xc1\x4e\x36\x80\x30\xda\x0b\x87\x76\x91\x7a\xb5\x87\xef\x72\x38\x0f\x73\xba\xe2\x17\xad\x5e\xb7\x2f\x4f\xa8\xb3\xd2\x1b\x8c\x8e\x4e\xc0\x2d\x86\xfa\xff\xa9\x8a\x89\x4a\x82\x8d\x44\x4f\x5b\x7f\xac\x8a\x5c\x7f\x8c\x34\xef\xba\xa3\xe0\x08\x97\xf2\x63\xce\xd8\x19\x9d\x5b\x4a\x06\x13\xd5\x8d\x85\xba\x87\x8d\x29\x20\x79\xae\x7b\xc5\xba\x3d\x25\x5c\x40\xcc\xa2\x2c\xd8\x58\xcf\xd5\x41\x5c\xef\x74\x1c\x92\xda\x38\x55\x18\x4f\x61\xac\x10\xf4\x2f\x16\x97\x36\x1b\x0b\xa7\x4d\x95\xeb\xca\x01\x16\xd6\xa3\x6f\x05\x06\x5e\xde\xd9\x00\xe2\x26\xaf\xa0\x38\xa5\xb8\xfd\x69\x03\x71\x9a\x0a\x9d\x4b\x86\x87\x59\x63\x09\x73\x1a\x72\x8f\x85\x2c\xa1\x95\xcf\x75\xb5\x9e\x71\x2d\xfc\x40\x1a\x29\xea\xd7\xab\xeb\x63\x7b\xac\x9d\xa8\xcf\x8d\xf9\x79\x02\xa6\x0e\x1f\x88\x25\x66\x21\x5e\xef\xe1\xe6\xf2\x61\x73\x00\x1d\x7e\x30\x65\xee\x35\x75\xa5\x7e\xb4\xf5\xfe\x6b\x2b\x90\xa5\x4a\x83\x63\x1d\x7a\xf2\x8d\xff\x3b\xcb\x24\x95\x83\x30\x77\x40\xbe\x4d\x02\x34\xcb\x0c\x23\x3e\x82\x6e\x5f\xae\x8f\xe5\x18\x58\x6b\x99\x75\x48\xee\x5f\x7f\x7f\x0a\xb0\x4d\xcb\x09\x09\x75\x89\x75\xfb\x72\x97\x97\x67\xd5\x59\x99\xe5\x94\xa0\xd9\xea\x06\x4a\x33\x08\x2e\xd8\x84\x13\x74\xa7\x59\xfd\xca\xd2\x91\xcc\x9b\x4d\x38\xcf\x9c\xab\x09\x74\xab\xd0\x0f\xc8\xfd\x5e\x16\x8e\x0b\x27\xb5\x63\x7a\xc7\xf7\x2f\xe0\x1c\x8a\x9b\x7e\x88\x74\xbb\xa5\xad\xea\x2e\xf7\x58\x6f\xbf\xb6\xd5\x66\x7b\x19\xa2\xb9\xd9\xf5\xa5\x4c\xa1\x1c\x0d\xc2\xfe\x16\x62\xbb\x53\xa3\xbb\xee\x8e\x24\x88\x5d\x57\xb2\x81\xcd\xb1\xdb\x30\xc6\x51\xb1\x4d\x41\xa4\x3a\x04\x5d\x17\xdd\x7e\x70\x06\x9e\x65\x45\x94\x05\x39\x66\x67\xc5\x7a\xce\x71\x29\x8c\x17\x26\x8d\x47\xe1\xfd\x57\x59\x1b\x64\xb4\x84\xaf\x16\x52\x22\xe6\xea\xa6\xda\xc2\x6f\xa1\xe5\x36\xfd\xce\x8c\x38\x45\x8b\x5c\xbb\xd0\xb9\xb9\x05\xdb\x7f\x3e\x33\x0e\xdc\xdc\x7d\xc1\x2e\x0f\x65\xa9\x9d\xee\x42\x70\x3f\x44\x1a\x82\x80\xe6\x1c\x0b\x5c\x1a\x7a\x9d\x23\xab\x84\x63\x08\xec\x0c\x14\xf9\x5b\xdf\xae\xfd\x8b\xaf\x67\x38\x49\x06\x22\x0e\x29\xdb\x13\xfc\xf7\x38\x6e\x91\x5a\x1d\xc7\xa1\x0c\xb9\xd2\x68\xb4\x15\x0e\xa4\x3a\x19\x8a\xa4\x5d\x0e\x1c\x5c\x96\x64\x01\x4d\xef\xf0\x36\x4b\xd8\xad\x96\xc6\xe1\x65\xbb\x34\xf4\x9f\xdb\xaf\x3f\xe4\x33\x0c\xc5\x17\x6b\x48\x86\xc6\x6b\x3f\x1e\x6e\xaf\x49\xff\xc7\xcc\xa2\x92\x21\xa2\x50\x31\xec\x7d\xb0\x0b\xca\x5a\xd6\xc8\x08\x61\x54\xbb\x76\xd2\x6a\x39\xb7\x6a\x7d\x9a\x72\x5a\xc8\x18\xce\x29\x74\xa7\xbe\x87\xf7\xa7\xf1\xfe\x71\x66\x51\xb0\x8a\xab\x71\x48\x3d\x4d\x6d\x17\x23\x67\xfc\x24\x8f\xa2\xcc\x22\x67\xd2\xd3\xdd\x2e\xf2\x53\xad\xf6\xff\xa5\xb6\xc8\xa3\xc8\x00\xea\x7d\xe1\x94\x82\xa6\x45\x92\xe0\xb0\x5c\xcc\x4c\xeb\xc3\x9b\xc6\xa3\xc8\xba\xcf\x61\x4a\xf5\x9c\x57\x65\xe0\x80\xe4\x3f\xa1\x38\xc5\x25\xf3\x28\x8e\xe2\x90\x9a\xbf\x82\x07\x4c\xf8\xc7\xc9\xa3\x98\x43\xea\x82\xbc\xc2\x8c\xea\x8c\x3c\x8a\x85\xc1\x9d\xb7\x52\xff\x01\xdd\x3e\xca\xbe\x6e\xc4\xa3\x58\x39\x8a\x7a\xa8\x2d\xb7\xbd\x70\x20\x8f\x62\xc3\xb9\x27\x31\xac\xf7\x50\x3f\x43\xa9\x3f\x7e\x19\x5d\x3d\x89\x35\xc2\x0c\xff\xbf\xcd\x80\x70\x12\xc2\x5d\xfa\x9c\xbf\x81\x7c\x97\xcb\x4b\x09\x8f\x48\x42\x51\x10\x5d\xe5\xad\xae\xf2\x72\x6a\x93\xce\x23\xa2\x65\xe2\x01\x72\x27\x0d\x59\x1e\xd1\x8c\x81\x8f\xf1\xbe\x48\x6c\x01\x74\xd1\xe8\x55\x2d\xdf\xfb\x22\x18\x8f\xa8\xa4\x88\xb1\xeb\x9b\x2b\x2f\xa8\x01\x31\x99\xf5\x3c\x62\x31\x0b\x48\xbc\x5e\x1d\xf1\x6c\xce\xcc\x23\x1e\x3b\xe5\xd2\x76\x68\xa4\x74\x11\xdd\x15\xe8\x7c\xdf\xaf\xe9\x3c\x4a\x08\xc1\x7d\x53\x75\x8f\xa0\x1c\x81\xee\x78\x94\x30\x82\xe0\x8b\x40\x87\x74\xa4\xdd\xd1\x4f\x4f\x12\x81\xbd\xda\x6a\x0f\xcf\x72\xca\xa3\xe6\x91\xc8\x9c\xb3\x98\x92\xfa\x75\x5d\x9a\x87\x03\xd4\xb2\xf7\x33\xe6\x91\x00\x93\x45\xa1\x14\xe0\x78\xfe\xf3\xa7\xb5\xfc\x38\xb2\x28\x01\x39\x2a\xba\x5d\xc9\xfd\x02\xc7\x69\x54\x91\xe5\x91\x24\x80\x94\x6e\x93\x6b\x78\xaa\x8a\x62\x52\x5b\xe3\x91\xa4\x04\x3b\x28\xab\x3a\x6f\x5f\x6e\x73\x15\xfe\xae\x84\x4e\xbc\x2f\x7d\x5e\x6e\xda\xda\xa3\x35\x97\xf9\x28\x3c\xd2\x51\x86\xed\x6f\xef\x7e\xd2\x67\x3a\xf3\x51\xce\x36\x68\xb5\xdf\xab\xb1\xe7\x00\x8f\xb4\x10\x51\xd0\x7c\xc7\x1c\xf4\x3a\x37\x72\xfe\xe9\x8c\xc6\xae\xe2\x8d\x82\xb3\xf7\x93\xe7\x65\x12\x19\x3c\x54\x37\x50\x14\xa3\x9d\x93\x47\xc6\x66\x16\x03\xaf\xaa\x2a\xdc\x1a\xee\x97\x87\xcf\xa2\x1f\x1e\x01\xe1\x32\x1a\xd4\x35\xff\x5f\xca\xbe\x6c\xb9\x51\x24\xfb\xfb\x75\xfa\x62\x2e\xd8\x72\xe1\x52\x92\x65\x97\xa6\xbd\x8d\xa5\xaa\xea\x9e\x2f\xfe\xa1\xc8\xe5\xa4\xcd\x94\x04\x1a\x40\x65\xbb\x9f\xfe\x0b\x4e\x2e\x2c\xc2\xae\x9e\x88\x89\xa8\x1e\x93\x42\x08\x92\xcc\xb3\xfc\x96\xff\x35\x40\xf4\x67\x91\x1c\xf5\x9c\x96\xe7\x77\x21\xbb\xad\xf8\x5c\x7f\x36\x73\x4d\x62\xd2\x1e\x05\xbd\xac\xaa\x43\x33\xb4\xb2\xa9\xaa\x83\x1f\x1a\x47\x34\xc3\xb2\x29\xaa\x1b\xbf\x54\xe7\x06\x02\x39\x81\xc4\x51\xee\xf4\x9a\x51\x03\x62\xac\xe0\x3e\x88\xaa\x49\x1c\x41\xcc\x5d\x12\xb7\x2d\xd5\x65\xd7\x85\xc4\x71\xac\x62\xb7\x5a\x6e\x5a\x38\xda\xb6\xcd\xf8\xd9\xc4\x31\xa3\x58\xbc\x87\x52\x7b\xd3\x9b\x0f\x10\xaf\xa3\x8d\xb9\xfb\x20\xa0\x3f\xa2\xaf\x33\xef\x66\x4d\x31\x43\xd8\x34\xbe\x5b\x71\x2c\x32\x0c\x03\x51\x56\xaa\x19\xb6\xae\x49\x9c\x44\xd6\xbc\xd5\x2b\x84\x35\xae\x6e\xe6\xd7\xed\x38\xe1\x0c\x61\x53\xd8\x76\x19\xdd\x93\xd4\x58\x3d\xd9\xaa\x5c\x9e\xeb\x72\xf2\x53\x33\x69\x55\xa5\xab\xd7\x12\xf4\x0e\x8e\xa7\x83\x68\x21\xdc\xac\x4c\x59\x6d\xf5\xa7\xf5\xe2\xf6\xf1\x20\x14\xb8\xdb\xf5\xf9\x5d\xa0\x11\xc7\x8e\xb7\x13\xe1\xbb\xb2\xbe\x7a\xdd\x1b\xb4\xba\x68\x73\x90\x98\x0a\x13\x05\xdf\xfb\xb2\xdb\x83\x37\x7a\x3a\x44\xe5\xd8\xff\x32\x75\xf5\x17\x94\xb3\xd5\x67\x37\x92\x65\x69\x6c\xbb\xdb\x20\x46\xe4\x09\x12\x33\xc2\x70\x6a\x88\xb2\xac\xce\xa5\x72\x79\xb3\x75\x2f\x99\x00\xee\x49\xcc\x33\x86\x31\x94\x7a\x29\x5c\xb9\xfb\x03\xee\xd6\xe4\xfb\xb9\x30\x3a\x40\xb6\x76\xd5\x58\x9d\xd7\x8d\xc9\x25\x47\xf2\xed\x0b\xd4\x95\xf3\x04\xfb\x2d\x1c\x92\x3c\xed\x99\x10\xdb\x56\xb4\x13\xb1\x7a\x12\xe7\xca\x6d\xd0\xa6\x9a\x4c\x6d\x91\x50\x34\x27\x28\xc5\x11\x1e\xcc\xe4\x63\x82\x12\xec\xb0\x69\x10\x87\xbd\xea\x82\xd2\xc3\xbe\xee\x77\x80\x58\x70\xaa\xdc\xf6\xd6\x4e\x7b\x91\xa3\x13\xc9\xc8\x9a\x25\xed\x91\xf5\x32\x17\xa0\x92\x58\x66\xe0\xab\x9f\xdb\x73\xfd\x13\xde\x51\x9e\x6a\x18\xad\x91\x58\x8a\x84\x45\x9e\x90\xf2\xbc\xc2\x2b\x5a\xd4\xcf\xe7\x6e\x35\x0c\x3f\x49\x65\x02\x2b\x90\x0b\xad\x07\xc4\x01\x3e\xf9\x3a\x25\x69\xea\x08\xd4\xad\x65\x01\xd8\x0a\xce\x4c\x7f\xcf\x7d\x42\xe7\x39\x56\x0b\x5c\x8e\x89\xf8\x76\x5d\x88\x72\xe5\xf4\xa8\xaa\xb7\xf7\xc9\xe5\x02\x51\x88\x64\x35\x85\x68\xed\x06\xe9\xaf\xd1\x64\x06\x25\x3b\xfc\x9e\xbf\xf0\x79\x00\x49\xa2\xcc\x26\x76\xcd\x50\x19\x77\x36\x5d\xe5\xfe\x13\xa0\xb1\x5b\x70\xfb\xe7\xee\x13\xc0\x03\x49\x62\x62\x0d\x7f\x6c\xf0\xb9\x6d\x45\xa9\x45\xad\x2f\xcb\x8e\x24\x49\x52\xab\xbb\x8b\x92\xa5\xb7\x45\xe3\xea\xd8\xbd\xb8\x33\x49\x52\x9a\xe3\xe2\x62\x11\x91\xb7\x1e\x89\x31\xb3\x01\x27\x24\xcd\x50\x54\xec\x1b\xd4\xc1\x5f\x1b\x75\xcc\x67\x7f\x95\xbf\x7b\x09\x51\x02\x93\xb8\x93\x50\x3f\x10\x99\x3d\x7e\x38\x8e\x57\x15\x86\xd3\x98\xe5\xe0\xcb\x44\xc5\xa1\x5b\x97\x1c\x52\xc8\xa9\x84\x8d\x9e\x4d\x42\x63\x01\x56\xdb\xa0\x14\x68\x26\x33\xbe\x03\x4c\x0b\x7c\x2f\xf6\xde\x43\xb7\x9b\x4a\xf7\xd5\xb4\xe1\x46\x12\x2e\x25\x96\x56\x8b\x66\x7b\x96\xc1\xc9\x7f\x82\xc5\x76\x63\x73\xc6\x30\x07\xbb\x2b\x5c\xd3\x67\x7a\x9c\x6b\x6f\x0c\x16\xd0\x96\x23\xa7\x55\x3f\x4e\x02\xc6\xa4\xaa\xa8\x9d\x2f\x07\x2e\xef\x73\xe8\x1e\x92\xe4\x1a\x22\x4f\xdd\x0e\x0e\xe7\x60\xbb\xe1\xfe\x9d\x49\x44\xc4\xa8\xe9\x5b\xcf\xbe\x15\xdf\xc7\xdc\x89\xa0\x1c\x0b\x04\xd6\xc3\xd3\xf6\xeb\xfb\x08\x23\x11\x3c\xc1\x6e\x69\x59\xb5\xa1\xdb\xd7\x9f\x5d\x66\x78\x10\x9f\xc0\xae\xfa\xda\x3d\xbd\x01\xd0\x84\x24\x32\x11\x82\xf5\xe9\x48\xd3\xbd\x16\xe1\x85\x4e\x24\x8f\x15\xeb\xa5\x05\x96\x42\x3f\xf7\x57\xae\x84\xd5\x2d\x82\x52\xef\xfd\xdf\x34\x61\xc8\x40\xfb\xe7\x9f\xc3\x10\x2b\xd1\x39\x30\x98\x08\x8c\x5f\xa8\x8e\x91\x44\x83\x45\x11\x79\xbd\xbc\x66\xd3\x4e\x77\xfb\xc4\xc4\x02\x0d\x82\x96\x37\x7f\x8c\xbe\xc2\x30\x8d\x15\x3a\x83\xef\x8b\xe7\x5b\x0c\x04\xa7\x07\x49\x58\x1a\xc5\x31\xb2\x6c\xc5\xb9\x7d\x81\xb2\xc5\xe7\xf2\x69\xea\x49\xd2\x48\x48\x2b\x55\xff\x6a\xe9\xda\x7a\xa8\x7b\x4c\xd2\x34\x62\x88\xeb\x38\x9d\xe5\xa1\x40\xcf\x09\x9b\x40\xfb\xc3\x86\x20\x63\xe3\x69\xb1\xd9\xae\xaf\xf6\x8b\xbb\x87\xaf\xf7\x3b\x7f\x30\x13\x32\x72\x10\x9a\x95\x38\x35\x96\xe4\x87\x04\x8c\xd1\x8b\x93\x92\x28\x89\x5c\x10\xea\x9e\xf2\xf8\x12\x49\x26\x91\xee\x82\x1e\x82\x38\x47\x9a\x45\x0d\xab\x43\xd5\xcc\x8b\x0b\x90\x94\x80\x62\x6c\xb0\xf7\x0f\x7a\x12\x57\x41\x64\x94\xa4\x94\x48\x19\xf5\x32\x47\xb1\xff\x3b\xa3\x94\x38\xaa\x8c\xab\xf8\xfb\x23\xb9\x2b\xcf\x5f\xed\x56\xab\xfd\xe6\xf6\xe1\xbb\xef\xf0\x91\x34\x4f\x58\x22\x7c\xab\xf8\xca\xbb\xc3\x91\x34\xe7\xce\xcd\x16\x9a\xb6\xae\xde\xaf\xeb\xea\x38\x7e\xf9\xd2\x9c\xeb\x8c\x04\xe3\xb5\xbb\x62\x5a\xa0\x20\x69\xae\x28\x06\xf9\xe5\xf9\xb8\x6f\xfe\x7b\x16\xfd\x7b\x96\xe6\x20\x85\x13\x69\x46\x02\xdc\xf2\xfc\x8e\x5a\x34\xfd\xa4\x10\x52\xe3\x23\x74\x8b\xf4\x8b\xa8\xa1\x5f\x2a\xb8\x1f\x04\x89\x12\x3e\x30\x2f\xea\x55\x75\xa8\xea\x4b\xcd\x40\x92\x4a\xae\x71\xc5\xb7\x52\xaa\x4b\xa1\x7e\x3c\xa3\x23\xea\xe6\x38\x15\x05\x25\xa9\x4a\x09\x96\xf4\x03\x69\xc3\xa3\x96\x47\x91\x61\xaa\x88\xc6\xba\x1e\xec\x3f\x35\x6e\x27\xa9\x96\x29\xfe\x54\xb4\xe1\x03\x8f\xee\x19\x2d\x0c\x29\xa4\x31\x36\x27\xbb\x45\x76\xeb\xa5\xab\x06\xbb\x4c\x0a\xa9\xf5\x33\x7c\x2d\x4a\x5d\xbd\xa6\x23\x47\x14\x92\x02\x8b\xfb\x00\xd7\x42\x7b\x25\xd4\x0f\x26\x2c\x87\x5d\xbc\xd6\xbd\x04\xa7\x8b\x02\x2a\x49\x4d\x9c\x61\x9f\xf0\x20\x9a\xd1\x52\x96\x1a\x62\x41\x29\x27\x6c\x09\x58\xe8\x51\x00\x0d\x93\xd4\xb0\x2c\x1f\x18\xaf\xe2\x47\x37\xe5\x95\x28\x0e\xef\x8b\xf3\xa0\xc4\x4b\xb2\x28\x4e\x90\x9c\xaf\x41\x9e\x4b\x7d\xf8\x30\xc5\x75\xc3\x63\x19\x61\xab\xd3\x0a\x6a\x39\x53\x11\xfb\xf2\xb9\xe7\x9e\x25\xd2\xb6\x5d\x9a\xb2\xdd\x3b\x7a\x90\xff\xb2\x34\x15\x09\xb5\x1e\x21\xf6\x36\x34\xdd\xdc\xc5\xb4\x6d\xb0\xd2\x66\x69\xc6\x71\x6e\x16\xaa\xda\x34\x0f\xa1\xa2\x4d\xb2\x8c\x70\x8f\x08\x5c\x3d\xfd\xf9\xb8\x7b\xb8\xdf\xaf\xbe\xfa\xc5\x21\x23\x24\x42\x16\x8b\x68\x1a\xa8\xdb\xf5\x7f\xb9\xbb\xae\x7f\x0c\xff\xf1\x4b\x44\x46\x72\x93\x75\xb7\xe8\x3b\xc0\x8f\xc3\xbb\x8b\x57\x97\xe3\xb7\x24\x23\x22\x4a\x1d\x7f\xf3\xa6\xae\xce\xa7\xde\x04\x65\xfc\xa0\x32\x62\x38\x4a\xb4\xda\x32\x44\x20\x82\x5c\xf8\x11\x93\x8c\x72\x85\xf7\x00\xcb\xfc\xe8\xfb\x3e\x3b\x35\x33\x2a\x58\x46\x07\x7c\x54\x70\xfb\xd5\xc4\x37\x85\x64\x2c\xb1\x26\x9e\x77\xf7\x88\x94\xf3\x77\x83\x49\x2b\xfc\x78\xb5\xbe\x7e\x7a\xd8\xee\xf6\x77\x0f\xf7\xbb\x2f\xb7\x7f\xee\x1f\xd7\x4f\xab\xf5\xfd\x6e\xff\xf0\xfd\x7e\xfd\xe4\x07\xe7\x91\xe5\xad\xef\x85\xd6\xf7\xf0\x8a\x0b\x72\x97\x12\x15\xe5\x73\xe3\xd1\xc0\x9f\x26\x08\x59\x6e\xac\x26\xf4\x33\xb4\xf8\xab\xad\x09\xc8\xa4\xc3\x47\x32\xc1\x95\x87\x49\xdc\x14\xf5\x61\x72\x17\x45\x6e\xac\xfc\xda\x4b\x75\xba\x39\x54\x3f\xc3\x9a\x94\x49\x41\xad\x54\x10\x2e\x12\xfb\x1f\x70\xa1\xe3\x10\x06\x0a\xac\x08\xfd\x47\x84\x29\x2e\x21\xf2\xf6\xf6\x9b\xa6\x39\x77\x01\x39\x1a\x6a\x4d\xbe\x5c\xa5\x8a\xc5\xc1\xd0\xba\x79\x28\xc7\x86\x00\xfd\x40\x9d\x08\xdc\xa2\x57\x2f\xe7\xd5\xb9\xbc\x2d\xca\xe7\xc5\xe6\xe6\xe1\x97\x3a\x4d\x24\xd3\x4a\x62\x2b\x70\xe1\x4c\xbf\xed\x03\xfd\x3b\xa9\x67\xa6\x41\x27\x32\x94\x73\x6b\xf1\x57\x51\x95\xd0\xa5\x3b\x1a\x55\x2f\x46\xcb\x5f\x06\x8e\xdc\xde\xad\x1a\x18\xc3\x6e\xc2\x1b\x68\x12\xca\x5d\x00\x7a\xb5\x12\x2d\x3c\x57\x75\x01\xcd\xfd\x78\xfb\xcc\x4c\xca\xf1\x15\x86\xb2\xad\xe1\x54\x43\x09\xe7\xf0\x0e\x1a\xa6\x31\x4e\xb2\x39\x6b\xf8\xab\xb2\xf6\x36\xff\x2e\x4e\xa7\xbe\xb0\x24\x0e\xa8\xac\x34\x9e\x03\x24\x4a\x04\x52\xca\x96\x0f\xf7\x5f\xb7\x63\xed\xb6\xee\x15\xce\x13\x33\xd0\x95\x71\x99\xe0\x5c\x36\x46\xe2\x4c\x60\x15\xe6\xb5\x28\x91\x58\x61\x2d\x54\x47\x0f\xab\x0b\x2d\xad\x09\x8a\xd6\xbe\x11\x10\x9a\xd8\xe5\x05\xd5\x98\x90\x44\xd9\xa2\xf3\x5d\x55\xb6\x2f\xc3\xb8\x85\xa4\xa9\xf5\xa1\xc7\xda\x55\xdb\x76\xaf\xc6\xfc\xab\xdb\x6d\x69\xd1\x50\xd8\x71\x4e\x73\x82\x90\x14\x62\x2c\x20\x87\xe0\xfe\x83\x93\x19\x8d\xe2\x5d\x45\xa9\x66\xdc\x59\x08\xc9\xba\xb0\xc8\xdd\x30\x64\x4b\x14\xb3\x1c\x5b\x42\x32\x29\x33\xfb\x0a\x21\x63\x65\x57\x21\xa2\x65\xf4\xe0\x09\x4d\x69\x0e\xc3\x34\x1f\xc9\x26\xfe\x0e\x50\x1e\x61\x60\x77\x72\x9b\x2a\x56\x3d\xc2\xea\x4c\xa8\xa0\xd4\x6d\xe4\xc5\xcf\x2e\xac\x82\x0f\x85\x44\x09\xa1\xbd\xb8\xc9\x46\x55\xd7\xdd\x82\xf1\x32\xf9\x65\x4c\x26\x9e\x3f\xe8\x25\x8a\xa6\x32\xe0\x7e\xa4\xb6\xd4\x0b\xef\x2f\x7f\x3e\x40\xb3\xfd\x58\x4c\x60\x7e\x09\x23\x3c\x66\x58\xb9\x3c\x8a\xb7\xd5\x8b\x08\x66\xfd\x84\xe4\x4c\x73\xe7\xb6\x37\xc2\x4f\x72\x7f\x5c\xc5\xe8\xb5\x62\xd9\x26\x5b\x38\x1c\x2c\xf3\x6e\x7c\x7a\xc1\x52\x94\x57\xf9\xba\x5d\x77\x0f\xc8\x9f\x5c\xe8\xcc\x7a\x73\xba\xe6\x46\x0f\x3d\x26\x44\x4a\x86\xcd\x59\xef\xcd\xef\x93\xa7\x4f\xcb\xcf\x44\x31\x85\x52\x8d\xcd\xa1\x50\xb0\xb4\xcf\x77\x51\xd7\x97\x5e\xdb\x1f\xdc\x07\x25\x25\x72\x0e\x56\xde\x51\xd1\xc2\x70\x3e\x22\x12\x0e\xd3\x68\xa2\x34\xe0\x4b\xe2\xc4\x5c\xa0\x7d\x28\x77\xd0\x65\xc5\x13\x1b\xd4\xc9\x37\x1a\x63\x1b\xc2\x07\x51\x1f\xdf\x46\x6f\x1d\x44\x80\x6b\xd9\x12\x0e\x22\xfc\x8d\x6a\x2c\xfc\x9d\x0e\xe2\xbd\x4b\x7b\x11\x2a\xb6\x2c\x26\xf5\x28\x02\x60\xe3\x32\x0c\x42\xf6\xb5\x2d\x59\xd9\x63\x34\x32\x26\xcb\xfc\x44\xbf\x83\x56\x68\xd1\x8a\xd9\xd2\x2b\x8d\x13\x5b\x44\xd8\xd5\xe2\x27\x1c\x06\x78\x14\x42\x63\x4d\x70\x25\xbb\xe9\xb6\x4a\x31\xe4\xd4\x12\x1a\x83\x31\xd4\xdb\x02\x55\x25\x74\x9b\xfd\xa0\x66\x76\x59\xbb\xa1\xb1\x51\xc8\x00\x43\xcb\xf5\xe6\x7c\xbc\x24\xd3\xcc\x3f\x30\x9a\x50\x6b\x2e\x87\xb0\x19\xa4\xac\xcc\xd9\xaa\xcf\xfc\x57\xf8\xbc\x35\x8a\xba\x5d\x2c\xd7\xeb\x5f\x19\xdf\x76\xc3\x0d\x9a\x19\xb5\xc5\x11\xdc\x1b\x77\x69\x26\x4c\x68\x22\x6d\x3d\x3f\x80\xfb\x2f\xb1\xe0\x84\xa6\x69\x82\xbc\x15\xa7\x15\x37\xcf\x58\x1d\xad\x63\x34\xcd\x08\x6a\x6f\x14\xaa\x0a\x78\x91\x6e\xe1\x4a\x50\xb2\xe6\xd7\xbe\xea\x1f\xfd\x3b\xf9\x16\x29\xf1\xf1\x59\xab\x08\x97\x24\x86\x2f\xd3\x84\xd8\x4d\xe2\x28\xb6\x27\xd1\x1f\xc8\x44\xee\x6b\x04\x8f\xd5\xe1\xe0\x0d\x2d\xfc\x51\x6d\x32\x1f\x65\xd9\x96\xff\x16\xfe\x7b\x86\xd2\x35\x32\x87\x8d\xd0\xfe\x0e\x11\xa1\x32\x57\x3a\xdd\xcb\x0b\x8f\x4f\x42\x89\xb2\xac\x92\xd3\xb9\x79\x41\x00\xa7\xc5\xf8\x1e\x61\xac\xa1\x33\xff\xe6\x51\x9a\x29\x8f\xcf\x7d\x82\x9f\xe8\x2c\xd0\x87\x3d\x73\x32\x74\x84\x52\xa9\x62\x17\xc2\x5d\x81\xac\x2d\x6b\x68\x4e\x0e\x89\x50\xaa\xa2\xc4\x41\xe7\xb1\xc8\x00\xa8\x4e\x34\x16\xf1\xed\x46\x59\x1b\x9c\x62\x25\x9a\xd1\x96\x4b\x59\x96\x21\x44\xab\x3c\x1f\x83\x24\xea\xf8\x62\x18\x70\xdc\xae\x7f\x14\x87\x0b\xd5\x39\x37\x84\xc7\x11\xd6\x2a\xf7\x0d\x94\xba\xd7\x5c\x22\x94\x77\xd9\x0c\xea\x3a\x76\xf9\xc2\x9d\x28\x0b\x03\x4d\x88\xa5\xc6\x73\x5e\xd0\x0c\x69\x78\x28\x78\x22\x5a\xd8\x94\x3f\xab\x42\x4d\x30\x65\x84\x0a\x49\x13\xef\x09\xfd\x58\x55\xe1\x92\x3c\xa9\x89\x50\x19\xc5\x08\xdd\x3e\x16\x65\x3b\x67\x74\x42\xa8\x4c\xd2\x08\xc5\xf8\xdf\xbe\x36\x50\x0f\x95\x3c\x09\x95\x3c\x46\x70\x92\x25\x2a\x6c\x4a\x14\xcd\x0c\x07\x45\x84\x01\xc5\xa8\xe1\xec\x8f\x81\xc9\x03\xf1\xd5\xe2\x2a\xea\x09\x1a\xc0\x8d\x54\x86\x22\x48\xf3\x7b\xd1\x96\x7d\x0d\x9e\x42\x1c\x61\x4a\xfd\x77\xe4\x12\x26\x3f\x08\x12\x82\x4e\xd1\x96\xe8\xb2\x51\x55\x3f\x43\xa7\x93\x19\x32\xbb\xd3\x62\xa6\xbc\x19\x51\xe4\x09\x05\x6e\x33\x69\xdb\xb6\xa8\xaa\x1f\xcd\xc8\x0a\x98\x50\xd0\x09\xc6\x5d\x6b\xa4\x60\x8e\xb0\xc9\xb3\x88\xe1\x71\xdf\xca\x9e\x84\xc5\x91\xb5\xf0\xf8\x64\x1d\x1c\x85\xf8\xfe\x63\x9a\x23\x6e\xfc\xda\x02\x8f\x2e\xc5\xff\xc7\x37\x85\xa5\x69\xce\x7d\x91\xc5\x03\x3f\xa7\xf0\x8c\x4b\xe1\x2a\xc2\x32\x6a\x7b\xcb\xf2\x3c\xb1\x28\x9f\x0c\xe3\x12\xe1\x73\xdd\xed\x19\xc2\x85\x09\xa3\xa9\x31\xcc\x33\x92\x6c\xd3\x31\x84\x70\x8c\x2a\x89\x21\xdc\x4f\xa8\x0b\xf3\xbe\x13\x75\xcf\x98\x71\x23\x18\xd3\x08\x32\x7a\xc2\x87\x39\x53\x20\x66\xcc\xc4\x44\x0d\x7a\xf2\x8d\xeb\xf6\x84\xc3\x14\x03\xfc\xc7\xa7\xf5\xfe\x6e\xf1\x47\xcf\xa0\x25\x8c\x13\xc8\x54\x5f\xb5\x58\x9e\xdf\xc3\x11\xce\xa2\xee\xa1\x3c\x15\x32\x68\xda\x11\xc6\x21\x75\x00\xf7\x45\x7b\x57\x35\xf3\x28\x6e\xc2\xb8\x49\x89\xdb\x89\x9d\x27\x45\x3f\x01\x47\x5d\x57\x8f\x64\x49\xc6\x72\x10\x31\x71\xe1\x31\xcb\x75\x82\x55\xbc\xd3\x10\x7c\x72\xd9\x1e\x66\xc2\xc4\x68\xb8\x0d\x6f\xbd\x14\x81\x3b\x24\xa3\x2c\xa6\x41\xe9\xe6\x0a\x5a\x51\x1c\xe6\xa9\xf9\x84\xc9\x98\x61\x53\xba\xdb\x68\x7b\x5f\x57\xc2\x24\xb3\x38\x97\xde\xf2\x1a\xfb\xc1\xf8\x98\x37\xab\x87\xc9\xf3\x90\x9a\x20\x77\xa6\x11\x03\x5c\x2a\x61\xd2\x09\x3f\x58\xf1\x85\xc4\xff\x59\xa5\xca\xfb\x89\xee\xcd\x41\x78\x00\x08\xd3\x89\xc2\x72\xfe\x3f\xfb\x05\x94\x69\x9d\x21\x30\xbc\xcf\x07\x8e\x27\x51\xbe\xaf\x2e\x5a\x83\x3c\x4a\x28\x46\xfb\x48\xff\xf5\x41\xfc\xae\xda\xac\x16\x8f\x5d\xae\x68\xf9\x42\xa5\xba\x50\x3e\x1d\x2d\x4d\x3c\x4a\x72\x64\x18\x15\x0a\x0d\x28\x82\x57\x36\xe1\x91\x26\xf8\x63\x8e\xa2\x69\x82\xe4\x51\xf3\x71\x03\x9f\xc7\x69\x86\x3b\x38\xc2\xf4\x50\x4f\xa3\x57\x28\x1c\x3d\x04\x9e\x44\x14\xc1\xe1\x9b\xd5\x72\xd5\x83\x15\x09\x4f\x63\x85\xb1\x9f\x46\x52\xe8\xf5\xb4\xd2\xc1\xd3\x5c\xa2\x49\x9f\x53\x10\xda\x41\xff\x49\x01\x88\x18\xdf\x3c\x0d\xe5\xe2\x08\xa7\x91\x7d\xf9\x9e\xa1\x5d\x16\x7a\xdc\x95\x1d\xa5\x69\x9c\xc6\xdc\x11\x0e\xbc\xee\xec\x5f\x70\xd1\xaf\x19\x2d\x6b\x9c\x26\x59\xea\x49\x3d\xd7\x87\x4a\xb4\xbf\x83\x73\x70\x09\x03\x28\xd6\x5e\x42\x00\x65\xb1\x85\xb3\xaf\x14\x67\x2a\x96\xc2\x59\x97\x7b\xc1\x7e\xac\xe5\x3d\x74\xb1\xd2\x47\x40\xc6\xf9\xa5\x90\x73\x6e\x94\xf6\xfb\xd6\x85\x8a\xf8\xb4\x1e\xf9\xc1\xff\x77\xe7\x12\x34\xe1\x66\x72\x67\xa6\x4f\x46\x08\x9b\xc8\xeb\xe2\x67\x70\x20\x22\x5c\x48\x8e\x78\xef\x75\xfb\x82\x3d\xc0\x81\xa6\x19\xe1\xc2\xe4\x58\xde\x28\xc5\x11\x36\xcd\x42\xff\x44\x7a\xda\xfc\x6b\xcb\x65\x1a\x63\x93\xf8\x6e\x71\xbf\xb8\x59\xdf\xad\xef\x77\xfb\xdf\xbd\x5b\x3e\xe1\x8a\xc4\x88\xa1\x69\x84\x81\xdf\x8b\xd0\x52\xe5\x3a\xd3\x3e\x21\x46\x1a\xc7\xaa\xaa\x0e\xba\x7a\xbd\x58\xe0\xf1\x5f\x27\x66\x47\xb8\x66\x59\x9a\x86\x5a\x7d\x01\xcd\xac\xfc\x22\xe1\x46\x44\xd4\xd5\xc0\x6e\x44\x63\xc9\x99\xd7\x55\x8d\x33\xff\xb6\xaa\xda\xee\x2d\x5c\x55\x65\x53\x1d\xac\x0d\x5d\x7d\xd1\x6d\xec\x1e\x12\xe4\x03\xfc\xa9\x7f\x8d\xb1\xfd\xe0\xc7\x00\xd3\x79\xaf\x65\x55\x3e\x3f\x0d\x6f\xd3\xe8\x7c\x79\x1c\x49\xc4\xdd\x29\xd4\x60\x71\xc9\x4e\x16\xf9\xa3\x24\xce\x7c\xdf\x69\xf7\x7e\xf2\x4f\x22\x8f\x59\x8a\xd5\xf8\x53\x75\xc2\xa5\x0f\x27\xdd\x21\x68\xc7\x4d\x5b\x9f\x79\xcc\x80\xf7\xd8\xd0\xd0\x52\x73\x25\x12\x98\xae\x11\xdc\x7f\x0c\x64\x62\x8d\x25\xaa\x63\xe5\x65\x06\xdd\xb1\x84\x59\x53\xbb\x97\xea\xf5\x4e\x94\xef\xa1\x90\x6f\xb1\x65\xe3\x1f\x99\xea\x24\xcb\x82\xfc\xec\x05\xc4\xd7\x8d\xca\x22\x96\xb8\xf7\xf9\xe6\x66\xe5\xe5\xbf\xfd\xb5\x64\x31\xc3\x26\xc0\xfe\x19\x1f\xb2\xf5\x04\xdd\xe8\x49\xb3\x38\xcf\x52\x8b\xad\xda\xad\x17\x77\xfb\xed\x97\xc5\x93\xaf\xa9\xe5\x44\x8a\x4c\x79\x65\xfa\x73\xa9\xef\x0a\xb7\x59\x2c\xdf\x97\x13\x3e\x24\xc9\x69\x9a\x66\x56\x23\xbd\x8b\x63\x1e\x42\x6b\x2b\xa7\x52\x63\xa7\x60\x1f\x7c\x92\xaf\x51\x8b\x61\xf2\x79\x46\x09\xda\x09\x21\x8a\x18\xde\x4e\x45\xfd\x1e\x0c\xd6\x51\x52\xe7\x3d\x8d\xa2\x28\xf2\x67\x65\x3c\xc3\xba\x71\x3b\x02\xff\x84\x0a\x29\x88\x63\x18\x69\x52\x21\x3e\x98\xc2\xd3\xa9\x7b\x3b\xd0\x64\x73\x1f\xe7\x39\xe4\x4e\x5f\x66\x71\x09\x5e\xc9\xf3\x18\x30\x48\xb8\xae\x01\x5e\x45\xab\x5e\x7e\x5d\xcf\xcd\x73\x65\x7b\x27\x0d\xcc\xd9\x47\x91\x5c\x90\x28\x52\xc1\xb7\xcd\xea\xc4\x8c\xbf\x55\x30\x8d\x9e\x01\x4a\xd4\x7a\x7d\xac\xfe\x53\x98\xc2\xc3\xde\xdc\x08\xc9\xad\x65\x9e\x73\x72\x08\x5e\x45\x9f\x87\x97\xb9\xe4\xb6\x5d\xe9\x10\x88\x37\xa2\x28\x9b\xe1\xbb\xe8\x86\xa9\x28\x42\x35\xcf\xed\xee\xf6\xb3\x94\x3f\x57\x44\xe1\xa4\xb0\xed\xa6\x6b\x80\x55\x75\x38\x80\xea\xc1\x92\xb9\x12\x42\x07\xd7\xe6\xaa\x1e\x41\x94\x72\x05\x39\xf1\x42\xa8\x88\xaf\x98\xae\xc9\xb9\xce\x88\x16\xa1\x84\xd6\xcd\xf2\x6f\x8f\xd6\x43\xb5\x17\x1f\x20\xb9\xce\x2d\x77\xf6\x1a\xba\x80\xa1\x19\xee\x9e\x39\x48\x62\x49\x6c\x7e\xff\xea\x9d\x9f\x48\x0e\x46\x5b\x71\x10\xb4\x95\x2b\x4e\xd8\x8c\x9c\x3c\x0b\xc3\x25\x46\x66\x77\x5f\x6f\x77\x9b\xc7\xdb\x4d\xe8\x8e\x88\x48\xd9\x56\xbd\xaf\x49\x0f\xc9\x33\xa3\x5d\x56\xc4\x51\x84\x2f\xb2\x1c\x00\xd2\xe6\x8b\x36\x22\x8e\x00\x41\xeb\xbe\x3c\x82\x7a\x2c\xe3\x66\xf5\x78\x5f\x11\x31\x33\x8a\x8e\x44\x12\xaf\x01\x2e\xc1\xd9\xf3\x5f\x97\x46\xdc\x88\x01\x3b\xbb\x16\x87\x6d\xf1\x5c\x9e\x4f\x73\xfd\x71\x91\x46\x16\x3a\x70\x10\x4d\xeb\x66\xee\x55\x8f\xa9\x12\x29\x4f\xb0\x2d\xa6\xba\xdb\x78\x3a\x78\x1f\x43\x22\x52\xb0\xba\xa8\xb5\x68\xe1\x11\xea\xef\x50\x58\x42\xda\xb0\xaa\x29\xb2\x2c\xc1\xe6\xe4\xae\xf6\x7e\x5f\x63\x31\x62\xbf\xb9\x09\x12\x51\x69\xb7\x44\x8b\x80\xe8\x8d\x07\x42\x2b\x5a\x10\xc9\xf1\xa6\xb8\x8c\xe5\xcd\xa9\xfd\x8e\x42\xa0\x80\x48\xfc\xc7\x67\x07\xfd\x09\x0d\xb7\x7c\x4b\x94\xdb\x71\x85\xe7\x45\xa9\x57\xe2\x70\x18\x01\x4c\x67\x31\xfb\x1f\xdc\x7d\xce\x52\xed\x48\x33\xbe\xd8\xb8\xbd\xd8\x61\x05\x97\x06\xb5\x65\xb6\xeb\x3f\xfe\xfc\x7d\xb3\xdb\xad\xef\x3f\x7b\x29\x45\x4e\x08\xaa\x26\xbf\x60\x03\xe9\x76\x80\xb5\x0e\x03\x0c\xa2\x25\x9c\x84\xa0\x2b\xe3\xfa\x83\x0a\x50\x0b\x0d\x6b\xb4\x77\xe1\xe1\xe4\x26\xe9\xb9\xf9\x4e\x82\x7a\x98\x3f\x0a\x01\x10\xf7\xee\xba\xdd\x8a\xbe\xc5\x62\x91\x3b\x2c\x33\x2b\xe3\xd5\x7c\xae\x8d\x4f\x84\x62\x39\xf2\xda\x77\xe2\x07\x36\xfd\x67\x52\x49\xa1\x80\xb0\xd4\x11\x33\x0b\x5b\x1a\xbf\x2b\x4a\x3b\xa5\xfc\xa2\x20\x80\x5a\x39\xd7\x73\x03\xf5\xe3\x59\x1e\x0a\xe5\x8a\x92\xeb\x2e\xa4\x39\x97\xed\x9d\x98\xc4\xf4\x02\x1c\x73\xf4\xe9\xea\xee\x46\x1c\x47\xf0\x14\x01\x12\x84\xf3\xc6\x2d\xad\x6b\x45\xef\x0e\x4a\x04\x28\x85\x62\x5a\x9b\xc5\xf1\x1b\xd4\xef\x8f\x55\x35\x42\x48\x0b\x13\xc5\x5e\x01\xe3\x6b\x03\xf5\xbf\xce\x05\x7a\x0d\x1c\x2b\x6b\x3a\x31\xbe\x0c\x93\x08\x84\x5a\x75\x9b\xc7\x15\xfc\x84\x43\x75\xb2\x02\x35\xfe\x38\x4d\x11\xb7\xff\x78\x2e\x7f\x4c\x29\xe8\xf3\xeb\xbe\x30\xc6\xd8\x6e\x51\xf3\x45\x94\xfa\x60\x65\xf1\xc7\x81\x82\x8c\xb8\xb5\x05\x39\x3e\x07\xe3\x85\xd1\x49\x64\x94\xdb\x9a\xfb\x33\xa0\xc5\x9b\x83\x70\xcf\x7e\xa1\x8c\xe3\x94\x0d\x89\x01\x36\x08\x9a\x1f\x9b\xc8\x08\x09\x69\x3d\xc4\xab\xa8\xca\x15\x36\x19\xc7\x77\x46\xa6\x59\x16\x47\x7e\x37\x29\xaa\x72\xb0\xf8\xc8\x94\xe4\x49\x3f\x43\xcf\x6f\xab\x01\xae\x52\xa6\x5a\x59\xda\x4b\x55\x1d\xbb\xad\xdc\xff\x3d\xa3\x64\x24\xb4\x75\x70\xa8\x8b\xf0\xc1\x2c\xa7\x48\x5d\x38\x81\xed\xc6\x6d\x1d\x45\x65\x8b\xd0\xc1\xf6\x03\x81\x59\x22\x33\x03\x58\xf7\x71\xab\xe4\xb5\xed\x8a\xce\xff\x7e\x92\x25\x3a\x0f\x4a\x32\x55\xdd\x8a\xc3\xcd\xd9\x4f\x1d\x49\x58\x8c\x6f\xce\xa1\x9b\x09\xfb\x74\xa4\x8a\xd8\x1d\x25\x28\x4c\x38\xa4\x56\x5c\xce\x06\x3f\x58\x46\x5a\x05\xdc\xe3\x76\xc4\xb6\xf1\x91\xb1\x24\x5a\x24\x2e\x75\xb0\x10\xd4\x11\xaa\x7c\x7c\x42\x9a\xe5\x79\xea\x77\x0f\x4c\xf9\x2c\xae\xd5\x86\x5c\x77\xb6\x5e\x13\xb8\x25\x61\xa6\x51\xa6\xb0\xdb\xbc\x2c\xda\x9b\x73\x71\xd0\x1f\x17\xe7\x3f\xed\x7e\x4b\xaa\x13\x5c\x18\x3d\xb2\x23\x9a\xab\xd1\x4a\xaa\x73\x5b\xf3\x0a\x42\x2d\xb0\xb4\x84\x98\x15\x52\x5a\xeb\xe7\x29\x07\x8c\x48\x96\x69\x6e\x61\x5d\x8f\x56\x5f\xef\xd1\x72\x0f\x87\x3e\xdc\x44\x32\x4a\x82\x8a\x85\x9d\xbb\x68\x90\xd0\x4e\xdf\x68\xc9\x65\x82\x71\xc6\x09\xf5\x35\x86\xb8\x36\x99\x13\x8e\x76\xc4\x80\x5b\x99\x5b\xa2\x6c\x6d\x6d\x7a\x96\x9c\xc6\xa8\x27\xff\x28\xde\x2d\x98\x7b\x7a\x5c\xc9\x34\xf0\x66\xae\xe0\x00\xcf\x43\xb1\x37\x22\x45\xa2\x11\xdd\xe6\x6c\xcd\xba\x5f\xdf\xad\xb0\x9b\xd2\x29\x59\x3e\x98\xef\x80\x7d\xf9\xf1\xf4\x94\xc6\x3a\x99\x5a\xb8\x59\xa5\x10\xb1\xfc\x58\x39\x30\xf4\x04\x3f\x23\x55\x9e\x63\x0d\x02\xda\x97\x7d\x33\x65\x13\x13\xa9\x94\xc6\x26\xd1\xfa\xe6\x66\xf5\xb0\xf1\xa8\x14\xa9\xb5\x45\xf7\x2d\xbe\xdd\xed\xa0\x69\xb7\xe7\xa2\x7f\xb1\x21\x63\xd8\xd6\x53\xe2\x80\xa9\xdd\x1f\x2d\x0a\x8e\x7e\x1e\x47\x49\x93\x5a\xb4\xe1\x75\x0b\xea\xa5\xf8\x6b\xe2\x32\x4f\xa4\xc9\xa0\xb7\x2e\x7a\xc4\xac\xb1\x2e\xda\x77\xd7\xc2\x9f\x14\xf1\xfa\xb7\xc3\x30\x4b\xfd\x6a\xa0\xbd\xee\x72\xa6\xb1\x71\xca\xf8\xb7\x9a\x1c\xb0\xa6\xbf\x59\x3d\x6c\xcf\xa8\x0a\x19\x92\x45\x15\xd1\x14\x13\x6f\xf7\xda\x5c\x41\x2b\xd4\xcb\x25\x80\x48\x45\x54\x4b\x4b\x45\xfd\x4f\x55\x3b\xc9\xdb\x31\x0c\x5e\x45\xdc\x06\xeb\x1e\x49\x76\x4d\xc3\x91\x3c\xb6\xdc\xe1\x06\xda\xd5\xfa\x61\xfc\x28\x54\xa4\x2d\xc1\xed\x6a\xfd\xf8\xb0\xdd\xec\xf6\xdf\x37\xf7\x57\x0f\xdf\xc3\x67\x21\xc3\x96\xc2\xea\xca\x76\xa0\x95\x8f\xda\x55\x6c\x08\x62\x75\x4e\x55\xa8\x92\x74\x7f\x33\xae\x46\x15\xd0\xbf\xe3\x37\x61\x7c\x6f\x54\x92\x65\xb8\xc7\xd5\x16\x4a\xb0\x3d\x04\xb0\x97\x9f\x49\x2a\x61\x11\x24\x5e\x81\x14\x7e\x16\xd5\xb9\x41\xb6\x9d\xdb\x77\x66\x1f\xbb\x4a\xe3\x2c\xf7\x6c\xd8\x7d\x55\xc2\xae\x3e\xc3\x02\x97\x87\xfb\xea\xce\xea\xb3\xfb\x6b\x4e\x09\x20\xd6\xfe\x6e\xb3\x5a\x7f\x16\x50\xa9\x54\x49\xde\xbb\xbc\x3d\x4f\xa2\x06\x95\x09\xe3\x33\xc8\xc7\xba\x6a\xab\x11\x91\x45\x65\xd2\x86\x78\xdb\xf2\x5d\x43\xdd\x0e\xa6\xa0\x22\x99\xd2\x36\xb3\xb8\xdf\x3c\x2d\xbe\x2c\xee\x36\x57\xfe\x10\xa3\xd1\x40\xdf\xef\x06\xca\x9b\xb3\xed\xe9\x8c\x7f\x2d\xe3\x39\x16\x13\xdb\x97\xa2\xd6\xdf\x01\x7e\x4c\xe5\x78\x88\x62\x4a\x67\xb2\x47\xfe\x2f\x30\x39\xee\x12\x5d\x5b\x60\xfd\x09\xf5\x25\x1e\xc2\x86\xac\x73\x7d\xfd\x0b\xaa\xbc\xff\x16\x43\xb0\x6d\xb1\x5c\xac\xb6\xfe\x9b\x39\x51\x99\x2b\xcb\xba\x70\xb0\x0e\xf3\x85\x0b\x4b\xe3\xbf\x86\xf3\x5f\xc1\x76\xc6\x1d\x13\x71\x8c\xc2\x25\xbb\xcd\x1d\xf9\x75\xb6\xad\x44\x4a\x08\x73\xd9\xf4\x42\x57\x08\x97\x7c\x30\xc1\x87\x8c\x4c\x26\x88\x48\x79\xe6\xe0\x5c\x0f\xae\x67\x35\x80\x5d\x28\xa1\x04\x16\xe9\x7c\xdc\x12\xca\xbf\xdb\x6e\x9a\x4e\x56\x5c\x25\x63\xc6\x6c\x7a\x6a\x53\xa7\xc7\x29\xce\x48\x49\x16\xa3\x8c\x2e\xda\xbc\xdd\x56\x55\x78\x6b\x55\x96\x6b\x3d\xda\x95\xa6\xf6\x6e\x44\x29\x96\x60\x87\xec\xba\x38\x1c\x9b\x6e\xc3\x1a\xdd\x27\x65\xac\x8d\x48\x51\x7a\xfa\xd5\xaa\x3a\x4a\x31\x9d\x23\x3a\x63\x18\x7a\xae\xdf\xd6\xff\x3d\x17\x6d\x78\x8d\x81\x10\xa3\xdc\xac\x2e\xe1\xe0\xb4\x55\x82\x53\xe7\x30\xe3\x52\x86\xd8\x52\xec\x11\xb4\xa5\x37\x23\x04\xdf\x9f\x4a\x47\x26\x26\xc1\x1b\x05\x67\xdf\x77\x28\xfc\xc1\x38\x4e\x10\x9c\x69\xdf\x9e\xd5\x8b\x75\x12\xfd\x5e\x94\x77\x95\x3e\x4f\x11\xff\x3a\x16\x06\x59\xa7\xe2\xdc\x20\xb2\x32\x9c\xc5\x28\x2c\x15\x2c\x36\x4f\x57\x4f\x0f\x8f\xfb\xbb\xc5\x1f\xfe\x50\x12\xa5\xf8\xed\x47\x6b\x85\x65\x31\x43\x61\xa5\xd5\x09\xe1\xde\x6d\xe5\xae\x78\x2b\xca\x67\xdb\x7d\x9f\x5f\x3f\x74\x42\xa5\xb2\x12\x40\xa0\xa7\x94\x58\x9d\x98\x14\x67\x2d\xaa\xad\x3f\xc1\xa9\x9a\x79\x77\xa6\x9f\xc8\x13\xe1\x1b\x1c\x7b\x0d\xa7\x0f\xc4\x38\x88\x4e\x89\xf5\xa5\x47\x91\xc8\xa2\xc5\xc8\x4c\x1c\xae\xee\x17\xfe\x77\x64\x69\xa4\x6d\x08\x8f\x0a\xc8\x18\xc0\x0f\x5f\x04\x9d\x51\x2b\x51\xb5\x7a\x7a\xf8\x7e\x85\xee\xe1\x08\xfc\xdc\x86\x13\xb0\x14\x6b\x29\xa2\x69\x8a\x52\x3c\x76\x2b\x6f\xa9\x3c\x78\x46\x93\x04\xa0\x3b\xfd\xc3\xdd\xe3\x5b\x28\x47\xfa\x63\x29\x8f\x9c\x84\x9b\x8b\x83\xe6\xaa\x03\x9a\x90\x08\xa3\x41\xdf\x0b\x76\x7b\xdb\xa4\x20\xa9\x09\xb5\xb2\x23\x37\xd0\x5e\xa1\x1a\xd7\xfd\xf9\xf8\x04\x3f\xab\x1f\x5d\x00\xd4\xa5\xd2\x70\xf1\x09\x26\xb0\xc9\xec\x80\xed\xfb\x01\xdf\x5a\x53\x6a\x3d\x07\x8e\xfb\xf6\xad\x09\x7f\x64\x19\x75\xe9\xd6\x0e\x3e\xce\x3c\x34\xcb\x22\xe4\xc9\x6e\xa1\xd4\x8f\x75\x10\x51\x26\xfe\x3c\x8c\x66\x6e\xb7\x2f\x75\x17\x98\x7f\x24\xc7\x44\x34\xe3\xd6\x7c\x5f\xd5\xa2\x85\xe6\xae\x78\xae\xb1\x34\x3c\x1e\xc4\x09\xe0\x13\xb8\x94\x81\x27\x9a\xd3\xd8\x58\xe9\x27\x67\x45\xbc\xd0\xdf\xaa\xb3\xea\x69\xc9\x9a\x53\x8a\x2f\xa1\x55\x02\xf3\x12\x2a\xb3\xdb\xab\xe6\xcc\xe0\x4c\xc5\x3e\xd6\x2d\x74\x89\xca\x83\x59\xd5\xa0\x2f\x5b\x37\x93\x5b\xc2\xa5\xc4\x7d\x5f\x68\x5d\xb8\x39\x08\x32\xcc\x04\xae\x18\xd6\x68\xf6\xf2\xfc\xfe\xa5\x50\xcd\x67\xa9\xbc\xce\x05\x41\x97\x9b\xe6\xb9\x4c\x9a\x67\xf1\xc1\x1b\x27\xa4\xc4\x9f\x65\xbd\x8d\xbe\x88\xa6\x47\xef\x68\xa1\x63\x15\xa4\x27\xba\x44\x7e\x0b\x6d\xbf\x26\x08\x88\xd1\xc6\x61\xf5\xd2\xc5\xf0\xdb\xf6\x63\x13\x3b\xa2\x65\x2a\xb9\x43\xbe\xbf\xf6\x6b\x53\x17\x63\xf0\x5e\x03\x69\x44\x4a\xd6\x3a\xb2\x33\x6b\xef\xb8\x1d\x3e\xd5\xbe\x08\x69\x2e\xfb\x88\x5a\x27\x29\x76\xd3\xf7\xf6\x0d\xbd\x11\xe3\x12\xb0\xd6\x94\x63\x4f\xef\x6e\x73\xbf\xb7\x22\xea\x96\xd0\xb2\xdf\x3d\xec\x9f\xd6\xab\xf5\xe6\xdb\x7a\x1f\x24\xfc\x88\xd6\x2c\xc5\xe6\x90\x37\x0a\xdc\xb6\x7d\xbb\x55\x6b\x6d\x27\xe9\x53\xd5\xbe\xa0\x87\x83\x3f\x00\x99\xf1\xf9\xba\xad\x99\xb6\xb6\x47\x30\x79\x6d\x81\x5a\xd9\x95\x1e\x9d\x8b\xcc\x95\xcf\x17\x36\x43\x00\xd9\xa5\x7f\x3c\x2e\x86\x9b\x92\x36\xcc\x26\x0b\xa6\xaa\x64\x68\x2a\x6b\x03\x1a\xa5\xa8\xb0\xe0\xef\x20\x48\xfe\x0d\x86\x58\x6a\xae\x86\x6d\xeb\x8d\x13\x84\xf8\x7c\xa6\x42\xac\xf2\xcc\x6a\x47\x21\x92\x6f\xda\xdb\x75\xa3\x92\xc8\xaa\x72\xef\xbd\xe2\x85\x07\x04\x4e\x01\x4c\x90\x64\x02\x97\xaf\xab\xcd\xd6\xda\x1f\xad\xaf\xf6\xdb\xdd\x62\xf7\xd5\xaf\xa0\x90\x48\x8a\x6a\x4e\x36\x2a\xdb\x77\x29\x4e\x7d\x89\x18\x87\x04\x00\x3c\x40\xb5\xae\xc5\xfb\xd0\xb4\xd9\xaf\x69\x90\xa6\x12\x5d\xb8\xc2\xaf\xbe\x13\xcd\x8f\xf9\x57\x04\xd2\xd4\xf6\x00\x05\x76\x79\x7a\x90\xf2\x78\x54\x96\x26\xe8\x51\xbc\xf8\xeb\xb5\x98\xf1\xea\xee\x06\x30\x49\x42\x53\x70\xdb\xc2\xe9\x43\x49\x31\xff\x89\x2c\x45\x3a\x09\x9a\x19\x7c\xa9\xda\xeb\xe2\x6d\x7a\x4e\x92\x11\x6f\xd9\xba\x40\x50\xcd\xa6\x71\x1d\xd6\x9e\xac\x0d\x19\x21\x48\x5a\x18\xb6\xcd\x06\x2a\xdd\x04\xb2\x5c\x63\x91\xc3\x14\xa5\xfe\x3e\x32\xee\xf1\x03\x04\x23\xae\x52\x7a\x3e\x39\xe3\xda\xf9\xb5\x0f\x48\x02\xc8\xfc\x2f\x1d\xa3\x66\x29\x1a\x68\xb0\xea\x3f\x3e\x25\x49\x09\xb6\xbe\xab\x93\x53\x96\xc4\x7b\x36\x6e\xea\x01\x61\x0a\x61\x3f\x2b\x2c\x35\xde\x54\x95\x1e\x4e\x77\xa0\xa9\x8d\x08\x10\x81\xb7\x2e\x75\x93\x86\x23\xd2\xda\x58\xee\xe1\x58\xb4\x16\xcb\xef\xf2\xb6\x27\xec\x65\x5c\x98\xc6\x4d\x6e\x3d\x05\xc0\xbe\xbb\x6c\x55\x0f\x4b\xf9\xb0\xa8\x3f\x07\xb0\x02\xc6\x38\x92\xc3\x6d\xe4\xe5\x36\xb7\x19\xa1\x5b\x02\x9c\x01\x86\x29\xdd\xae\x0f\x6d\x85\x80\xf1\x6d\xf1\x3c\x89\x03\x80\x73\x69\x9b\xac\x96\x21\xda\x63\xf5\x20\xcf\x13\xcc\xff\x5c\x61\xe5\x0a\xce\x81\x7b\x35\x0e\xdd\xc7\x57\x28\x63\x6e\x69\xb2\x75\xf5\x1f\x50\xed\xf2\xfc\x7c\x71\x69\x4a\x45\xa8\x3a\xda\x94\xe2\xd4\xbc\x54\xed\x62\xb2\x7c\x81\x4e\x94\x76\x35\xa8\xf6\x00\xcb\xe5\x15\x4a\x73\x0e\xfa\xb7\x53\x38\x8e\xff\x1c\xa3\x2a\xeb\xe5\xb1\x06\xdc\x2c\x80\x84\x21\xa2\xec\x49\xfc\x2c\x01\x46\x75\x03\x00\x96\xe0\x4b\x74\xc2\xda\xd8\xba\xd4\x88\x34\xae\x4a\x73\x28\x54\xbb\x39\x9e\x0e\xc3\xc5\x65\xe4\xb0\xd8\xf7\x16\x3e\x14\xc8\x19\xff\x74\xe0\x1a\x93\x2a\x4f\xe6\xc4\x7a\x9a\x38\x8c\x6c\xce\x08\x80\xce\xf1\xdd\x7a\x15\xb5\xe8\xee\x3d\x4a\x1e\xc2\x40\xcf\x04\x0c\xe5\x19\x1f\x68\x29\x3c\x56\x13\x43\x26\x62\xa2\x0c\xec\x49\xea\xa2\x05\x5b\x2d\xb7\x46\x18\xbf\x4d\x2f\x75\xf4\x34\x67\x93\x41\x13\x19\x8a\x10\x18\xeb\xf0\x0c\x77\xef\xeb\xe7\x50\x50\x35\x49\x94\xea\x3c\x28\xfe\x4d\x97\x6b\x93\xe4\xd2\xe2\xdf\x8e\xa2\x6e\xb7\x27\x00\xbd\x16\x75\xd9\x2b\xce\x98\x94\x26\x28\x19\x70\x5f\xb4\x75\xf5\x1c\x9e\x8b\x49\x85\x35\xe3\x69\x7f\x84\x3f\x65\xa9\xb4\xe4\xab\x00\x58\xaf\x87\x90\xa8\xf1\x3c\x32\x24\xb5\xc0\x9c\x67\x68\xb7\x3f\x8a\xc3\x61\xb8\x3e\x19\xa2\x2c\x87\xcc\xd6\x71\x6d\x35\xfe\x6f\xb2\x08\xc6\xd3\xce\xd0\x24\xb5\xe9\x90\x28\xb1\x45\xed\x8c\xff\xfc\x51\x66\x25\x27\xbf\x7e\xdd\x5e\x85\xbf\xe9\x14\x2f\xec\x50\x1c\x0b\xfb\x00\x3d\xde\xdf\x0d\x60\x94\xe2\x52\xb3\x3d\xa9\xcf\xea\x18\x86\x47\x16\x76\xdb\xbd\x29\x4d\x14\xcf\x47\xb2\x86\xcb\x48\xb9\x0a\xd7\xfa\x69\x35\x8f\x4c\x30\x5c\x52\x84\x83\xed\x6b\x78\x2d\x6a\xd8\x68\x28\xdb\xa2\x2d\xa0\xf9\xed\xc2\x91\x73\xf4\x6f\x98\x23\x5c\x13\xdc\x37\x84\xd6\x98\x62\x8f\x27\xb5\xc9\x23\x8e\xa5\xce\xcd\xea\xe1\x71\xfd\xb4\x79\x08\x37\x23\x97\xd6\x05\xc8\xe7\xe7\x8d\x23\x41\x5f\xf7\x98\x34\x93\x4b\x83\x5d\x82\xc5\xaf\xdd\x20\x3f\x7e\x4e\x22\xd2\x98\x4d\x39\xb9\xab\x5d\x71\x80\x45\xfb\x9b\x7d\xb5\x87\x3f\x44\x45\x04\x03\x21\x79\x7e\x77\xca\xf8\x17\x13\x63\xf4\x10\x94\x4e\x90\x97\x23\x3f\x17\x10\x9e\x46\x94\x46\x27\x89\xb6\x66\x09\x58\xac\xac\xa6\x35\x66\x03\x51\x8a\x17\x5c\x17\xcf\x2f\x6d\x1c\x45\x93\xe9\x0d\x32\x47\x40\xc5\xf6\xe1\xdb\x53\x60\x03\x1a\x50\x99\x84\xa1\x96\x83\x05\x58\x7c\x22\x39\x62\xc0\x68\xc1\x7c\x32\x58\xa8\x4b\x59\x52\x37\xce\x44\x9c\x2b\xdf\xdc\xc7\xaa\x36\x8a\x62\x4c\x06\xb1\x18\x19\x65\x41\xac\x61\xd4\x28\x30\x86\xe5\x96\x04\x83\x5d\x85\x75\xa3\xc4\xc9\xb7\x12\x86\xdd\x59\x1a\x45\x84\x11\x2f\x05\xf2\x04\xcf\xa3\x0a\x29\x8d\x22\xc1\x29\xf1\x85\xf1\x10\xe6\x06\xc4\x28\x8d\x22\xc9\xe3\x40\xfb\xb0\xe6\x4e\x13\x01\x04\x1a\xc5\xb1\x8c\x7d\x0b\xaf\x2c\xda\xe1\x8f\x99\x9d\x42\x34\x4a\x62\xcb\xd9\xf7\x4c\xae\xef\x55\xfd\xb9\x72\xb1\xff\x5c\x96\x60\xf3\x41\xb4\x2d\x1c\x4f\x28\x1c\x7a\x07\xed\x4b\x35\x4f\x09\xa5\x51\x42\x6d\xb3\x42\x68\x1d\xf0\x4b\x3b\xdb\x59\x1c\x2b\x6d\xf9\xf1\x8c\x33\xea\xb2\x5a\x2b\x45\xf8\x58\x57\xcf\xb5\x38\x7e\x66\xeb\x48\xa3\x2c\xa2\xc8\x43\xf1\x8c\xa4\x41\x2b\x84\x46\x99\x22\xbe\xc1\x79\x5d\xc3\x05\x5c\xcf\x8d\x22\x91\x05\xf9\x56\xd6\x1b\xd5\x7f\x98\xe8\x08\x53\xc0\x2e\x54\xc2\xb5\x77\xfb\x71\x79\x7f\xb4\xd7\xd0\x88\x69\xcb\xe3\xb3\x2d\xad\xd5\x4b\x35\xa0\xea\xbb\x21\x9c\x01\xd6\x87\x10\x3c\x77\xd0\x33\x01\x10\x8d\xb8\xc8\xb8\x2d\xe4\x79\x24\x3f\xea\xb3\x85\x7d\x87\x46\x79\xc4\x52\x8f\xad\xd4\xe7\x43\x7b\xa1\x98\x46\xa3\x9c\xe6\xc8\x28\x90\x78\x4f\x11\xea\x52\x40\xb8\x43\xb9\xb4\x90\x3c\x71\x84\x52\x3f\x41\x97\x8e\x85\xe6\x9b\x1b\x22\xa2\x04\x19\xa9\xfb\x17\xd1\x6c\x54\x35\x10\xbf\x47\xa8\xdb\xf8\x92\x45\x1c\x11\xeb\x00\xb4\x7e\x2b\x9a\x76\x68\x72\x36\x19\x48\xa8\x1e\x08\x2b\x58\x9e\x9a\x3b\x26\x93\x38\x71\xa1\xc1\xba\xd4\xe8\x8e\xf0\x60\x56\xe2\x78\x12\xc5\xf3\xd8\xdc\x95\x46\x52\x58\x83\xdc\x17\xa1\x7e\x2c\x34\x9c\xa6\xdf\xa3\x12\x27\x91\xfe\x02\xea\xc7\x9d\x78\x5b\xf5\xfd\xf5\xc9\x4c\x52\xcc\xe0\xad\x58\x7c\x5b\x6c\x6e\x17\xcb\xdb\x35\x3a\x87\xad\x17\x4f\xb7\x7f\xee\x37\xf7\xdf\xd6\xdb\xdd\xc3\xd3\xd6\x5f\xa2\x32\x19\x58\xab\x02\x8f\xeb\xa5\x91\x8e\x89\xf1\xe6\x2e\xdd\x34\xbf\x16\x88\x39\xfa\xfc\x75\xd4\x49\x84\x19\xd7\xb1\xd2\x85\x79\xbf\x10\xa2\xeb\xd5\x2d\x68\xa4\x33\x83\x3a\x11\x4a\x94\x57\xd5\x6b\x79\xa8\xc4\x25\x6e\x7f\x7c\x73\xb4\x50\x9e\x0b\x68\x79\x08\x93\x57\x69\xfe\x46\x80\xf3\xd1\x6b\xca\xf0\x44\x4c\x6a\x05\xe3\xbf\x4a\x18\x32\xde\x68\x64\xb2\x28\x92\x01\x0a\x85\xf8\xc6\x59\x68\x32\x8d\x0c\xe1\x2a\xed\xc1\x06\x03\x19\x64\x3f\x20\x8f\xbd\x37\xf6\x08\xba\x32\xfe\x49\x26\xcf\x31\x40\xfe\x77\x71\x38\x88\x9b\xab\xf1\xc5\x18\x99\xe7\xa1\xe7\x71\x2c\x1c\xe9\x73\xe6\x5e\xc6\x11\x44\xa9\x15\x99\x09\x7a\x25\xc3\xaf\x89\xe3\x28\x45\x15\xcb\x7f\x15\xc5\xf0\x2b\xe2\x38\xd3\x29\x75\xb5\x1f\x5b\xec\x5a\x7a\xba\x01\x8d\x63\x01\x48\x99\x12\xce\x11\x62\xd9\xa3\x19\xc6\xb7\x38\x4e\x12\x40\x83\x4b\xb7\x8d\x5b\xf7\xee\xf2\xbd\x8f\x9f\x68\x9c\x50\xae\x59\x8f\x5a\xee\xfb\x7a\x17\xe0\x8a\xf1\x95\xa7\x51\x2a\xec\xe7\xba\x10\x6e\xd3\x2c\x7e\x8a\xe2\x30\xd8\x56\xe2\x34\x62\x08\x54\x32\xc5\x9b\x6d\xa5\x3f\xd6\xd0\xed\x50\x73\x84\xc2\x6e\xb4\xea\x15\x21\x4e\x85\x5a\xb4\x16\xeb\x3d\xfe\x3d\x69\x22\x53\xde\xc7\x25\x73\xb2\x42\x23\xd7\x76\x1a\xa7\x4c\xe5\x2e\xd4\xda\x1f\xce\x13\x6e\x2f\x8d\xd3\xee\xbd\xed\x8d\xd2\xe7\xf6\x80\x70\x26\x9d\xa7\x34\x90\x53\x70\x19\x18\xa1\x02\x46\x91\x24\x8d\xb3\x38\x76\xdd\x11\x55\xfd\x84\x3a\xd4\xb3\x68\x4c\x08\xe4\xc8\xc8\x39\x9e\x0e\xd5\x3b\x80\xf5\x30\xdb\x55\xeb\xed\xc3\xe3\x78\xae\xc6\xc4\xbd\x22\x05\x02\xf8\x3f\x80\x36\xd0\x98\x18\xa6\xd2\x80\x02\xbd\xae\xea\xc7\xe5\x6e\x37\xb9\x75\x94\x10\x8c\x48\xfc\xfa\x86\x7c\xe0\xc9\xd7\xd1\xdc\xd0\x74\x64\xc6\x34\x86\xf5\x0d\x26\x36\x15\x80\x74\x0b\x67\x4d\x01\xab\x97\xe2\xf4\x79\x56\x10\xb8\x95\x34\xa6\x4a\x59\x77\x28\xbb\x99\xde\x55\x61\x2b\x8d\x59\x2c\x30\x34\x7e\x38\x79\x03\x4b\xef\x0c\x38\xbe\x54\xc6\x18\xe8\x61\x51\xed\xe1\x04\xa5\xaf\x9d\xa1\xd7\x3d\x9a\x2b\x4f\x6e\x02\x63\x52\xb8\x15\xdf\x31\xbe\x07\x70\x7f\x1a\xf3\x4c\x20\xb5\xf8\x58\x95\xed\xcb\xe1\x7d\xa8\x0b\xb5\x0a\xfd\x5e\x1a\x73\x15\x59\x8e\xdc\xfd\x62\xb5\xdb\x7c\xdb\xec\xfe\xf4\x47\xf2\x9c\x61\xb3\xb4\x16\x45\x03\x16\x26\x27\x0e\x1f\x2b\x66\xf5\x17\x26\xb8\xe5\x6a\x18\xcf\x94\xc2\xf6\x5c\xb8\x30\x21\xad\xd8\x5b\x6d\xbd\x0a\xeb\xdd\x6b\xe5\x0f\xc9\x34\x41\x55\x1b\x0f\xe2\xd9\x5d\x48\x73\x4f\xbe\x4a\x71\x1e\x79\x92\x79\xd9\x5e\xa4\xb8\xe3\xb1\x79\x94\x45\xfd\xeb\x81\x61\xdf\xfc\x14\xd4\xc4\xae\xdc\xb7\xc5\xcf\xa2\x7c\x6e\xda\xee\x8e\x15\x61\x39\xd3\xdc\xca\xc5\xec\x91\x6a\x67\x9b\x6c\x53\xfa\xf3\x45\x21\x99\xc6\x90\xe5\x99\x09\xea\x13\x93\x67\x09\x84\x23\x8a\xdc\xff\xf0\x01\xdb\x64\x76\xfe\xcd\x27\xec\x34\x06\xc6\x33\x32\x20\x8f\x4d\x79\x71\xf3\x77\x11\x04\x47\x04\x85\xb2\x90\xf1\x4b\xb9\x63\x1a\x1b\x46\x31\xe9\x68\xce\xa7\x53\x55\xb7\xcd\x65\x55\x92\x26\x51\x6c\x3d\x8f\xbb\xad\xe4\x76\xb1\x1b\x34\xaf\x69\x12\xc9\x04\xa1\x8c\x8f\x50\x8a\x7f\x9d\x45\xd9\x9e\x8f\xb7\x20\x4e\xc3\x7d\x22\x89\x33\x96\x38\xc3\xd5\xda\x62\x84\x27\x5f\x10\x0b\x03\x19\xfa\xbf\xd4\xcf\x45\xf9\x1c\xe0\xbf\x34\x89\x65\x66\xa8\x73\x24\x5b\x1c\x0e\xae\x2c\xf0\x77\x18\x25\x34\x49\x12\x89\xbd\x59\x79\x7e\xdf\x78\xd5\xec\xdf\x26\x43\x52\x5b\xf5\x7e\x86\xf6\xea\x69\x85\xd8\x8c\xe9\x08\x6e\xd7\x41\x53\x43\x40\xb1\x6e\x5a\x38\x7a\xf4\xeb\xf8\x87\x24\xc0\x6c\x2b\xdf\xc3\xa5\xfa\x6e\xff\xfd\xf9\x38\x14\xa9\xa5\x49\x9a\x58\xc1\xa9\xea\x04\xe5\xe2\xb9\x06\xe8\x05\x79\x3e\x9b\x0a\x49\xca\x62\x2c\x3b\xee\xbb\x40\xbe\x38\x74\x8b\x89\x5e\x56\x6f\x5d\x62\x1f\x56\xbe\x24\x65\x24\xa1\xbd\x2b\xfc\xa0\x52\x42\x93\x2c\xd2\xcc\xb5\x5b\xbf\x43\xb1\x29\x57\x17\x74\x4e\x9a\x64\x42\x79\x8b\x4d\xa7\x7a\xe5\xee\xdf\x25\x59\x98\x26\x44\xa7\x7e\x7f\x42\xd5\x90\x55\x55\xd5\xba\x28\xbb\xbd\x6f\x60\x98\x4b\x13\x9a\x98\xd8\x56\x06\xce\xb3\x41\x5d\xc2\x08\xa7\xd6\x9f\xf5\x80\xc8\xbd\x7b\x71\x9c\x2e\xff\x09\xcb\x35\xba\xf5\x23\x93\xaf\x4b\xf3\x7c\x0e\x99\x70\x46\xb1\x3b\xa0\x8b\x1a\x54\x7b\x05\xb2\x68\x2f\x40\xf7\x6e\x68\x1e\x59\x31\x4d\xdb\x37\x6a\xc1\xbb\x52\xda\x4a\x8a\x5d\xcc\xd1\x8b\x6f\xc6\x8c\x98\x26\xc2\xa4\x78\x03\x8b\xc6\xb9\xdc\x5e\xd0\xa6\xc6\x4f\xcc\x33\x87\x7b\x9b\x46\x51\x86\x17\x48\x4a\x20\x8e\x78\xb3\xd6\x45\x0b\x7a\x57\x9f\xa7\x97\xab\xa3\x9e\xb7\xdf\xb4\xe0\x83\xec\x44\x67\x22\xcd\x7a\x9f\x00\x57\x1a\x78\xb7\x19\x63\xcf\xc0\xa0\x89\x96\x84\xf5\x21\x96\x85\xb8\xfc\x0d\x63\x9e\xd9\x5f\x0f\x59\x8a\xd6\x3a\xaf\xa1\x19\x35\xb7\x66\x00\x49\xb1\x1c\x57\x94\xed\xf5\xb9\x54\xbf\x8d\xab\xab\xa3\xb9\x66\x20\x42\xac\xa1\xed\x85\xef\x43\xca\xe1\x2e\x3e\xed\xee\x9e\x53\x10\xfa\x5a\x22\xf9\x75\x36\x43\x4c\xa3\x5c\xe0\x86\xbd\x2d\x9a\x56\x0c\x81\x18\x34\x8d\xb4\x48\xb8\xa7\x06\x5f\x41\xf3\xc3\xea\x69\xce\xae\x1b\x69\x2c\x62\x94\x13\xf2\x40\xba\x85\x1e\x9a\xd8\xce\x7a\x16\xb9\x4f\x26\x22\x31\xe9\x40\x75\x7c\x02\xd2\x9d\x7c\x4f\x62\x18\x66\xeb\x4f\xa0\x75\xe1\x95\x09\xdf\xc7\x6f\x98\x8b\x16\xdd\x27\x52\xa5\xd3\xa4\x0f\x83\xdd\xe9\x57\x97\x1e\x17\x34\xcd\x98\x06\x2f\xb8\xe5\xf8\x68\x4e\xde\xac\x8b\x3b\xfa\xb0\x35\x9c\x9b\x30\xa2\xc1\x3d\xd6\xa2\x1c\x95\x0e\x52\x62\xac\x07\x91\xad\xa8\x5b\x6c\xf9\xa8\xc2\xea\xc6\x51\xcd\xfc\x72\x8a\x7a\x10\xa8\x19\x89\xf6\x87\x93\x81\x79\x42\x14\x9f\xfa\xba\x7f\x0c\xc3\xa7\x69\x9e\x29\xcc\x87\x6c\xd0\x10\xf4\xbe\xc7\x67\x15\x2c\xc3\xa0\x21\x98\x51\x35\x50\x3f\x4c\xc4\x79\x3f\x6f\xcf\xb8\x13\xc9\x98\x20\xe8\xe0\x24\xea\xf6\x7d\x57\x4d\xbe\x46\xf6\x65\x68\x9b\x33\x8c\x45\x71\x27\x57\x2e\x85\x42\xd4\xfd\x73\xf1\x13\x70\x75\xdc\x55\xdd\xca\xb2\x7c\x9f\x34\x41\xfc\x70\x0d\x88\x91\xbe\x5b\xfc\xb1\xff\xb6\xb8\xfd\x1a\xde\x02\x45\x99\x4a\xbc\x0f\x54\xab\x5e\x30\xcc\xf1\xc7\x04\x49\xbc\xa8\x6b\xd5\x34\x85\x3c\xc0\x5d\x25\x9b\xdf\xc6\x11\x6d\xaa\xc0\x8a\xb8\x9d\x6a\x28\xcf\xa7\x7e\xcf\xf1\x87\x8d\xf0\x66\xb0\x4e\x63\xda\x91\xba\x3e\xa4\x02\xd2\x2e\xdd\x40\xb7\x04\x7f\xcb\xff\x46\xf1\x2c\xd5\x92\x63\xbe\x70\x12\xef\x03\x40\xd5\xc5\x66\xde\xef\x0b\xa9\xd6\xc2\xca\xc6\x58\x68\xcb\xf2\x42\x4c\x83\xa6\x10\x4b\xe6\xb3\x7b\x5b\x16\x1a\x96\x7f\xc2\x2d\x00\x96\xd9\x92\x8c\x05\x0c\x58\xb2\xd3\xb8\x16\x99\x82\x4a\xf0\x3e\xdc\xad\xaf\x36\x8b\xfd\xf6\xeb\xe3\xe3\xc3\xd3\xce\xab\xaf\xf9\x41\x26\x23\x18\x74\xde\x56\xcf\xcb\x5f\xeb\x15\xd9\x0f\x65\x11\xb3\xca\x70\x37\xb5\x98\x4d\x58\xb2\xc8\x70\x6c\xa5\x3d\x2e\xfe\x5c\xdd\xae\x7b\xf8\x2d\xcd\xba\xe8\x34\xb1\xf2\x7d\xf5\x19\xf4\x55\xf1\x73\x3c\x2b\xb3\x24\x4f\x30\x6b\xb0\x9d\xef\x2b\xf1\x3f\xb8\x51\x4d\xae\x32\x65\x60\xe5\x94\x47\xbe\x53\x63\x85\x63\x9a\xa5\xd2\xca\x6d\xb5\x43\x32\xe9\xfc\x09\xb3\x0c\xf2\x78\x6e\x92\x0c\x2a\xc9\x34\x23\x79\x1c\x7b\x96\xea\xee\xa5\xae\x5e\x1b\x1f\x6f\xdd\x57\xad\xff\xcf\x41\xee\x9e\x11\x19\xcc\x8d\xef\xde\x51\xdd\xc7\xf2\x69\x3c\x46\x93\x66\x34\xb5\x4e\x0f\x1e\x7d\x17\x5c\x72\x70\xa9\xc9\xdc\x28\x16\xc5\xca\xf5\x07\x56\x2f\x1e\xd4\xe0\xd7\xc5\x8c\x65\x1a\x6f\x3c\x6e\x9a\x1b\x3d\x51\xb1\xa6\x19\x63\x69\xea\xdf\x4b\x84\xfd\xf8\xa2\xc0\xec\x0b\x93\x31\x19\xa3\xb6\xf8\xb6\xad\xea\x8f\x0d\x28\x47\xf1\x43\xc6\x0c\x45\xc0\xcf\x57\x7b\xd4\x65\x5d\xe3\xf3\xe6\x91\x41\xd6\x6d\xb7\xed\x78\xfc\x0d\xcd\x84\x88\x30\x04\x5e\xec\xee\x2e\x59\x3a\x34\x13\x26\x03\xf0\x75\xd7\x3a\x70\x5c\x3f\xad\x19\x64\x2a\x03\xa9\x9c\xf7\xc2\x15\xfc\xfc\x59\x39\x6f\x52\xff\x9d\x4a\x31\x67\x9e\x86\xf0\x76\x68\x96\xef\x0e\xe9\x3e\x5d\xb0\x33\xa5\xd9\x00\x78\x68\x55\xa0\x2f\x5c\xde\x68\xa6\x8c\x42\xe0\x1d\x96\x2d\x37\x4d\x97\x44\xfb\x2f\xd3\x99\xc6\xd2\xd4\xfe\xe8\x99\xb1\xe1\x88\x20\xe0\xa0\x35\xcb\xc5\xe2\xeb\x45\x2f\x7f\x7c\x25\x5a\xd0\xcc\x31\xdb\xac\xf0\x5b\x97\x6f\x3c\x77\x69\xff\x27\xe6\x61\x34\xd3\x4a\xc6\xcc\xa5\x27\xf3\x0c\xc0\x0f\xdf\xb9\x51\xf5\x66\x3e\xd4\xcf\xb4\xd6\x5e\x5c\xb9\xcb\x39\x9a\x51\x57\x91\x66\x26\x33\xb6\xba\x25\x5a\x58\x3c\xf7\x7f\x26\x5a\x59\x5d\x75\x05\xdd\x03\x3d\x14\x7f\x81\x5e\xab\xaa\xac\x8e\xef\x61\x0c\x65\x78\x77\xba\xbd\xdc\xa3\x1d\xc6\x77\xc4\x40\x82\xc0\xab\xcd\x5b\x51\x16\xe7\xa3\xa3\x3d\x0c\xf2\x65\x12\x25\x42\x45\x9e\x1a\xd7\xcd\xfc\xed\xa0\xd0\x39\xbe\x51\x04\x4d\xb4\x9d\xf9\x24\x80\x46\xbd\xde\x25\x84\xd8\x9d\x44\xd2\x1a\x48\xc9\xf3\xa1\x8b\x9a\xa6\xdb\x22\x89\x79\x86\x88\x44\x5f\xfb\x9f\xd4\xc0\xdc\xa8\x84\x58\xe4\xb0\x12\xa5\xa7\x4e\xf8\x2f\x48\x34\xc3\x76\xa8\x79\x0b\x26\x0e\x94\xa4\xd4\xea\xd2\xc8\xf3\xfb\xf2\xc7\xf3\xa2\x5d\xbf\xa9\x97\xe7\xbf\xb7\x96\x93\x4c\x59\xd2\xa9\x12\xa5\x45\x7f\x7c\xf0\xcb\x33\x23\xb1\x46\xdb\xed\xff\x1f\x53\xac\x28\x21\x89\x71\x01\x73\xf1\xb1\xfc\xc2\xf8\xe7\x12\x45\xb8\x2b\x12\x87\x04\x77\xdc\x38\x9f\x7c\x07\x4d\x08\xb3\xb2\x2b\x3b\xa8\x8f\xbd\x3e\x2b\x25\x54\xeb\x28\xf1\xba\x27\x83\x54\x68\x72\x83\x19\x51\xd8\xfb\x77\x35\xb1\xef\x00\xe1\x06\x33\xe7\x43\xde\xdb\x16\x9d\x6c\x74\x74\xb1\x0d\x5d\xd6\x50\x08\x33\x36\xa7\x30\x88\x0c\xde\xa8\x0f\x0a\x38\x84\x8b\x0c\x43\x2f\x8c\xae\xbf\x88\xe6\xc5\x0b\x34\xfa\xe3\x92\x20\x07\x12\xf5\xd4\x50\x86\xd8\x21\xbb\x86\x01\x08\xc9\xf3\x04\xab\x8c\xaf\x50\x3c\x42\x7d\x37\x02\x6d\x53\xd2\x2d\xd0\xdd\xb5\x1c\xe6\x79\xc0\xdc\x0f\x4b\xe3\xd4\xc5\xfa\x57\xa2\x15\xab\xea\x70\x10\xfb\xc5\x62\x1f\x25\xe3\x2f\x53\x54\x7a\x13\xbe\x5b\xf8\x09\x87\x89\xb5\xf2\xe4\x09\x69\xb0\x7c\x90\x63\x51\x16\x55\x69\xdf\xcc\xc9\x33\xd0\x60\xdb\xc4\xba\xae\x4e\xf7\xa0\x5a\x51\x5f\xbc\x2d\xda\x44\x96\x43\x6e\x7d\xa0\xaa\x12\xa3\xf5\xdd\x4c\xda\x77\x1e\xe7\x65\x1f\x2d\x52\x33\xe0\x25\x4a\x80\xa4\x74\x50\x20\xdd\x15\xfd\xdb\x06\x2a\x41\x70\xc0\xde\x6b\xe0\x06\x20\x52\x77\xcc\x26\x13\xe8\xac\xbb\x7b\xad\xae\xac\x28\xbc\x3f\x6c\x98\xc8\x79\x6f\x31\x6d\x85\x9b\x07\x9c\x74\x4a\x8c\xd2\xc6\x0c\x71\xf9\x45\x55\xee\x5e\xea\x69\x0f\x85\x18\x48\x30\x8e\x79\x01\xeb\xec\x7a\x28\xca\xc9\x10\x1a\x49\x2e\x93\x10\x34\x41\xfb\x32\x45\xf8\x53\x1a\xcb\xc4\x7b\xff\xa3\x44\xca\xe3\xea\xf7\xc9\x49\x62\x93\xb8\x55\xda\x56\x99\x71\xd8\xfd\xf9\xe8\xe2\xa6\xff\x97\xb9\xc7\x42\x93\x88\x6b\xf0\x45\x4d\x2b\x46\xee\x05\xd5\xc6\xdf\x99\xc4\x56\x81\x70\xf1\xef\xf5\xfa\x0e\xa3\xc0\xf3\x87\xa0\x11\xda\xbd\xd4\xd8\xb2\xf5\x6b\xe3\x50\x68\xd2\x0d\x49\x5d\x3f\x59\x9d\x9b\xb6\x3a\x06\x5e\x7e\x77\x40\xf9\xd2\xde\x3d\xbc\x8e\xb2\x3e\x9a\x72\x40\x24\xf1\x47\x9a\xcf\x7e\x9b\xa2\x59\x44\x91\x78\x7b\x5b\x55\xed\xda\xca\xc8\xf8\xca\x03\x25\x22\xa2\xbd\x2b\xc4\xd4\xbb\xe6\xd3\x25\x96\x12\xc5\x51\x3a\x57\x57\x53\x31\x70\x37\x80\xc6\x42\xea\x80\xd6\xf6\x7f\x4c\xa9\x16\x03\xb2\x15\x5e\xd1\x83\x71\x16\x64\x03\x83\x55\x4a\xa9\xb0\x43\x1b\x68\xbf\x96\x07\x14\x17\x86\x45\xa9\xaf\x61\x62\xba\x4c\x29\x55\x91\x97\x18\xf6\x1d\x91\x2e\x01\x5b\xbe\xdf\x8b\xe3\x48\xc2\x9c\x52\x96\x0a\xac\x92\x3f\x1c\x4b\x68\x66\x93\x4f\x37\x90\x1b\x8a\x9e\x07\x07\x71\x94\x55\xb3\x3b\x97\xa3\x32\x1d\x15\x82\x20\x55\x1f\xe7\xe6\xaa\xfa\x01\xa3\xf2\xe4\xa8\x30\x40\x85\x31\x3c\x75\x38\xaa\xf8\x09\x5c\x49\xe6\xc9\xa9\xac\x84\x3f\xa0\x1a\xaf\xf7\x8e\xa7\x54\x46\x29\x52\xa2\x3d\x39\x33\x8d\xdc\x83\x8d\xfe\x31\xfe\xd7\x3f\xe8\x6e\xcd\xa3\xbd\x43\xd4\xf6\xac\x14\x34\x8d\x39\x1f\x26\x13\x42\x6a\x85\x85\xbe\x5b\x78\x86\x52\xef\x9f\xaa\xf7\x21\x73\xf4\x23\xa2\x10\xa5\xd2\xc4\x16\x67\xdc\x05\x7a\x37\x95\x98\xd4\x89\xa9\xca\x33\x84\x8b\x1d\x8b\x72\xf7\xd6\x93\xbb\x29\x55\x3a\xc1\x10\xde\xce\x32\xe4\x16\xa1\x14\xcf\xc0\x50\x63\xba\xe2\x8d\x9f\xaf\x32\x04\xc9\x01\x3f\xc5\xf9\xd0\x5a\x9a\xba\xa8\xdf\xbf\x96\x16\xf2\xee\xbf\x46\x67\x56\xcc\x4c\x89\xc3\x01\xbd\x89\xad\xce\x5a\x38\xcc\xa8\xe9\xbd\xa5\xc6\xc0\xe3\xc9\xf7\x41\x66\xfd\x72\x7b\x44\xb5\x06\xb1\x3c\xcf\x6b\x63\x77\xc3\x15\xc6\xf1\x96\xbb\xdb\x05\xa7\x9f\x82\xbf\x29\x35\x5c\x60\x89\x72\x8f\x02\x8e\x65\x09\xaa\x75\x64\x1e\x3f\x40\x73\x6c\x0f\x0b\xdf\x11\x75\xc6\x40\xa3\x1b\xce\xa2\x28\xc1\xca\x65\xaf\x8f\x5b\x94\xcf\xa1\xfc\x1d\xbe\x8e\xc5\xa9\x4a\x1d\x7b\xf6\xed\x7d\x72\x8e\x84\x13\xdf\xca\x76\x6e\x4a\xab\xc7\x21\x77\x89\xb2\x44\xd9\x5f\x67\xd3\x80\xbb\xa2\xf4\x7d\x14\xfe\xff\x62\xc2\xdc\xea\xc9\x52\xc5\xa5\xad\xa2\xfe\x1b\xea\x49\x4d\x86\x65\x8c\x22\xb1\xd6\x4e\xe5\x41\x25\x9c\x65\xdc\x20\x3c\x78\x5f\xa3\x0d\xcf\x6f\xfe\xcf\x39\x43\x58\xf0\x6d\xf5\xec\x63\x27\xbb\xcb\xf8\x4e\xde\xf8\x07\x66\x46\x63\x87\x42\xfc\x84\x32\x48\xe2\x51\x46\x94\x8c\x3c\xb1\x69\x59\x55\x87\xf0\x77\xc8\xad\xc4\x98\xcb\x81\x36\x8d\x5b\x7e\xfc\x00\x2a\x84\x76\x0c\x1b\x2b\xbc\xe5\x16\xe6\xde\x95\x28\xe6\x7e\xa8\xd4\x78\x77\x3c\x15\x7b\x18\xac\x30\x16\x47\x58\xf2\x42\xb8\xce\xea\x20\x5e\xbb\xac\xcc\xb2\x48\xc2\x45\xb2\x44\x4a\xbb\x3c\x3f\x6f\x83\xbc\x62\x31\x75\x71\x74\x83\x79\x64\x55\xe4\x4e\x35\x6c\x54\x35\x54\x10\xa4\x8c\x67\xd2\x1a\xcc\x2c\xfe\xf8\xbe\xb9\xdf\x17\xe5\xee\xcb\xc3\xd7\xed\xe2\xfe\x6a\xf7\xc5\x55\x47\xb6\x61\x28\x93\xb9\x2b\xc7\x7c\x11\x07\x73\x5b\x18\x5b\x45\x1a\xdf\x55\xae\x12\x6e\xa3\xce\x16\xbc\xf7\xf5\x79\x04\xc7\x75\x03\xf3\x28\x45\x34\x89\xaf\x39\x67\xbf\x85\x03\x14\x9f\xae\xa5\x6d\x43\x5d\x85\x19\xce\xf2\x38\x47\xe1\x80\x25\xd4\xf5\xfb\xad\x97\x68\xe9\x8f\x1a\xac\x40\x42\xd9\x42\x3d\x14\xfc\x9c\x7e\x33\xcd\x45\xea\x4c\xcc\x92\x05\x7a\x27\xf4\x90\x23\x26\x62\xf0\x9a\x80\xb6\x2a\x6a\x3b\xb5\xe3\xb9\x29\x9c\xe5\xdc\x4d\x55\xa9\x17\x2f\x9c\xf2\xe9\x42\xc8\x04\x95\xd8\xb8\x3e\xbe\x3f\x0d\x7e\x91\xe0\xd6\x6a\xd0\x87\xd8\xe0\xc2\xba\xa1\xa9\xcd\xe4\xab\x35\x73\x1e\x11\xa6\x5b\xd8\xb0\x70\xd6\xf4\x2e\x8b\xdd\x00\x40\x66\x0a\xf2\x33\xb6\x00\xba\x47\xac\xb8\x11\x2a\xd1\x58\x58\x43\x02\xeb\xc4\x41\x83\x32\x65\x62\x9e\x0c\x62\x1f\x47\xb9\xb3\x84\xec\x49\x47\x9d\x41\x44\xc1\x7b\x28\x21\x57\xd3\x15\x4e\x47\x3f\x1d\x54\x84\x80\xc2\x3f\x7e\x28\xbf\xee\x32\x00\xc0\xba\x72\x0b\x47\xa7\x7a\xe3\xf2\xbf\x89\xa5\x02\x65\x46\x51\xcb\xb8\xb4\x3b\xef\xbc\x42\xbf\x1d\xcb\xa3\x84\xc6\xa9\x7b\x79\xaf\xab\x7a\x65\xf5\x8f\x1a\x9c\x0c\xa3\x49\xc0\xa3\xcc\x36\xbe\x7b\x85\x22\x24\x39\xcd\x2e\xbd\x3c\xd2\xc4\x01\xd5\x4e\x07\xa1\xc0\xf9\x76\x8f\xaf\x93\xc7\x02\xd0\x6a\xec\x7a\xf1\xb4\x1b\x94\xf9\x78\xac\x04\xba\x80\x1d\x8b\x03\x34\x6d\x35\x0e\x09\x78\xda\x45\xcf\x36\x5f\x45\xd9\x37\xbf\x68\x4c\x56\x2b\x9e\x32\x62\x3d\xe7\xec\xba\xbd\x7c\x9f\x99\x96\x3c\xd5\x84\x8a\x81\xd3\x48\x30\x88\x2f\xaa\x71\x29\x85\xa7\x5a\xa1\x85\xc3\x48\x03\x72\xf3\x61\x4d\x3d\x7c\xca\x68\x9f\x9d\x22\xf8\xd8\x14\x50\x37\xab\x0b\x62\x1d\xe5\x59\x6c\xb5\xe7\x02\x01\x68\xe3\x2d\x8c\x47\x85\x3a\x9e\x11\xe9\x99\xfd\xfe\x2a\x16\xb2\x38\x14\xed\xc0\xbe\xb5\x1b\xa5\xac\x5f\x59\xf5\x6c\x2b\x4a\x35\xa6\x51\xe2\x83\x37\x9c\x67\x2a\xb6\x51\x66\xa0\xf9\x8e\xcd\x64\xe6\x3f\x45\x12\x2b\x7f\x7d\x53\x8b\xe6\xb4\x3d\x8a\xda\x76\x7c\xf0\x05\x47\x79\x7e\x3f\x4e\x5a\x3d\x94\x21\xfa\x71\xf9\x6e\xd1\x70\x1f\x34\xa0\xba\xcf\x24\x56\x7d\x4c\x34\xaa\x0b\xb7\xdd\xdf\x29\x33\xb8\xa9\x0b\xab\x21\xb5\x08\x7f\xd7\x8a\x3b\x8b\xa2\xfb\xf5\xf7\xbf\x8b\x7a\x77\x1f\x66\x69\x16\x3b\xb4\x89\xaa\xaa\x83\x3e\x3b\xe1\x42\x1f\xcc\x71\x26\x25\xde\xcf\xa0\x15\x2a\xea\x0b\x9d\x50\xca\x79\x6c\x74\xec\x3d\xb1\x1b\x7b\xef\x6e\xa0\xbd\x5c\xf4\x39\xcf\x62\x2f\x86\x75\x0f\xa0\xbb\x9b\x35\xd0\xce\xe9\x8e\xdb\x95\xd9\x51\x88\x92\xf0\x77\x2a\xac\x28\xfc\xb9\x7e\x38\x41\xb9\x1c\x52\x01\xbb\xa3\x06\xc1\xd7\x87\xea\x19\xc3\xcd\x0f\xcc\xbb\x29\xe7\x32\x4e\x6d\x9d\x42\x15\xa7\x02\x82\x80\x2a\xe5\x1c\x94\x53\x0e\x84\x42\x55\x8b\x32\x68\xd9\xd9\xb7\x61\x92\x12\xf0\x3c\x33\xd8\xb8\xf5\x32\x48\xfe\x34\xb9\x8e\x30\x3d\x6d\x8b\x23\xec\xaa\x20\xb9\xe7\x0f\x0b\x61\x64\xf7\xf3\xee\xe1\xb4\x1e\xc1\x07\xb9\x80\x08\x27\xe2\xd5\x62\xb7\xde\xdf\x6e\xee\x36\xbb\xfe\x88\x94\x43\xca\xbb\xd7\x83\xf9\xc7\x79\x76\xa1\xe5\x92\xa5\x38\xe9\x8e\xe2\x2d\xd0\xbc\x29\x97\x4a\x73\xaf\x82\x70\xb9\xc6\xa9\x28\x66\x4e\xc3\x43\xd9\xb8\xf7\x83\x65\x53\x71\xc0\xfa\xc8\x0d\xb4\xb7\xa2\xd4\x28\x55\xee\x0f\xe5\x14\xa1\xff\x57\xb5\x78\xf5\x02\xb9\xe3\x6f\xd1\x24\xa5\xe9\x60\x23\xdf\xcb\xe2\xcd\x7f\x1a\x44\x22\x5c\xe2\x76\x2b\x5e\xdf\xfb\x4a\xfa\xe8\x14\x79\x14\x89\xcc\x9a\xfb\x0e\xcc\xa0\xbb\x3f\x2b\xac\xfd\x75\xc1\xe1\x63\x55\xfe\x55\x84\x03\xa9\x6d\x54\x54\x5d\x56\x50\x94\xcf\x5e\x38\xf8\x83\x37\xbb\x1b\x8f\xa0\x99\x9b\x6f\xeb\x70\x0a\x66\x1d\xf1\xe4\xf0\xb6\xf8\x63\xb9\x41\xd4\x90\x05\xc0\xcf\x09\x83\xd3\x3c\xd6\x11\x2a\x73\x0f\xab\x39\xff\x18\x44\xc0\x79\x12\x13\x94\x30\x2d\x54\x85\x5a\x59\x76\xc6\xf9\x28\x27\x4f\x62\x81\xce\x2d\xce\x71\xc5\x47\x59\x79\x9a\x31\x92\xfa\x3b\x56\x3e\x9f\xc5\xb3\xdd\x2f\x3c\xef\x9f\xe6\xa9\x8c\x85\x0b\x50\x87\x3b\x49\x9e\x02\x45\xba\x6a\x3b\x28\x1a\x5e\x57\x75\xc8\xb3\xc3\x30\xa0\xe0\xb5\x11\xa6\x9b\x7f\x9e\x71\xa7\xea\x5b\x16\xe1\x2d\xca\x33\x1d\x4b\x08\x90\xcb\x61\xb1\x3e\xcf\x4c\xae\xdd\x9b\xff\xaf\xf6\xfd\x9b\x6d\xca\x54\xa1\x18\x91\xd3\x98\x60\x41\xe9\x6a\xf1\xf0\xcb\x45\x6c\xfc\x10\x28\xcd\x10\xc7\xe8\x0c\xf0\xbb\x1c\x60\x6f\x89\x8a\xed\xcb\x97\xa2\x6c\xef\xe1\xad\x5d\xb4\x8f\x95\x0b\x7b\xfd\xa7\xa4\x48\xb2\x40\x74\xda\xa1\x66\x4d\x33\xd3\x96\xcb\x29\x58\xcf\xcf\xa7\xcd\xea\x4b\xaf\x84\xf4\x8b\x96\xb2\xfb\x2c\x17\xb6\x73\xad\xc1\x2a\x69\x7e\x87\xe2\x49\x20\xf3\x72\x3c\x2e\x8f\x6d\x06\xba\x47\x7b\x29\x34\x71\xb1\xb1\xd8\x10\x2f\x3e\x39\x77\x9e\x2a\x6c\x0c\x21\x27\xac\xf6\x7e\x80\x98\xc6\x3c\xc1\x51\x14\x3d\x2b\x8b\xe6\x39\xcf\x70\x8a\xe1\x5e\xf5\xad\x7a\xbd\x30\xf6\x98\xd4\xfa\x3e\xf8\xf3\xdf\xfe\xc7\x7f\xad\x8e\x58\x2f\x93\x72\x27\xde\xbe\x79\xf7\x7f\x9a\xe7\x26\x46\xbf\xfa\xdb\xe2\xf9\xa5\x1d\x29\xc2\xd3\x5c\x24\xc0\xd2\x41\xac\x6b\xb3\x57\x2b\x8d\x36\x69\x23\xe5\x82\xe6\xd6\x66\xbc\xd0\x1a\x74\xa1\x7c\x5f\x3c\x97\x84\xe4\x56\x96\x1c\xc9\xfe\xbb\x97\xba\x3a\x3f\xbf\x3c\x94\x70\x5d\xd5\x3f\xc2\xa0\x3c\xc1\x06\xde\xea\x05\xca\x3f\x0a\xe1\xa5\x4e\x3e\xa9\xb8\xe5\x52\xe7\x58\x66\x0e\xa6\xca\x73\xe6\x36\x34\x57\x39\xd3\x58\x98\x2b\x9f\xe1\xd0\xec\xbb\xc5\x63\xaf\xc5\x7b\x98\xef\xca\x98\x34\xf3\x0d\xcc\x63\x55\x23\x3b\xcb\x1d\xd3\x54\x23\xb5\x5d\x1d\xaa\x06\x2e\x4d\x69\x68\xae\x73\xab\x3c\xd2\xbc\x54\xaf\xb6\x01\xf1\x49\x77\x21\x07\x02\x24\x88\x7c\xc2\xba\xe9\x22\xd9\x5f\x62\x22\xe6\x27\x34\xe4\x1a\x8b\x30\xbe\xdc\xd8\x3d\x13\x59\x83\x08\x37\xd4\x10\xc3\x7c\x47\xb4\x28\x01\xf5\x1f\x07\xbe\x7c\x34\x37\x2c\xc3\x70\xfa\x2f\xa5\xfa\x3f\x01\x27\xde\xae\x0d\xe0\x47\x63\x5d\x36\x90\xee\xe0\x3f\x27\x22\x21\x71\x83\x04\xcb\x37\x6c\x1e\xa1\x1e\x98\xba\x50\x91\x64\x34\x8b\xbc\x77\xe2\x5b\xfb\x58\xb5\xfd\x11\xab\x35\x19\x1c\x94\xfc\x81\x34\xb5\x96\x0d\xcb\xcd\xee\xe1\x8f\x5f\xb5\x5d\x3e\xbf\x31\x22\xa5\xc2\xa7\x37\x5f\x1b\xa8\xbb\xcc\x6d\x92\x8f\x89\x8c\x32\x5c\x76\x4f\x67\xd9\x2d\x21\x57\x20\x34\x56\xa5\xfd\xe1\x3c\x35\x36\x75\xd0\x00\x73\x8e\xc1\x61\x9c\x51\xe0\x45\x11\xac\x91\x58\x98\x39\x82\xa4\x36\x9e\x0d\x65\xdb\x70\x80\x13\x70\x6a\xfa\x1b\xc7\x57\x0d\x5c\xc0\xf4\xff\xfe\xdf\xff\x7d\xbe\x90\x09\xa2\x24\x6a\x00\x82\xaa\x9a\xf7\xa6\x85\xe3\x18\x36\x21\x88\x89\x90\xe3\xd4\x14\xcf\xa5\x03\xfd\x8c\x4f\x40\x13\x8e\x42\x3b\x27\xa1\x7e\x0c\x8a\x77\x82\x2a\xab\xfc\x6d\xb5\x22\xaf\x8a\x9f\x85\x1e\x58\x9a\xba\x41\x2c\xb3\xef\x38\x4a\xac\x3f\x7f\x2f\xca\xc1\xd3\xe5\x31\x41\x7c\xc1\x1e\x31\x81\x7b\xdc\xd3\xf6\x8f\x5e\x45\x99\x0a\x4e\xac\x50\x96\x53\x45\xb4\x8e\x63\x3a\x48\x7d\x51\xc1\xa9\x5d\x7b\x1f\x97\xbb\xdd\x75\x55\xdf\x88\xf0\xa3\xb8\xe1\xb8\xc5\x89\x2e\xd4\xf0\x7b\x9c\xc8\x89\xc4\xb7\x49\x1e\x84\xfd\x5f\x38\xc0\x0d\xae\x68\xdd\xbc\xdf\x63\x42\x10\x8e\x38\x8f\x6c\xbb\x0e\x76\xbb\xe8\xbc\x3e\x16\x15\xb9\x8e\xd1\xd9\xb2\xdb\x3e\x6b\x51\x34\x45\xf9\x3c\x9d\x27\x22\x8b\xb0\xdc\x5b\xa8\xea\x3b\xc0\x8f\xd8\x02\x62\xfc\x41\x65\x59\x70\xcb\xba\xfa\xe1\x14\x57\xe7\xfb\x87\x42\x92\xdc\xeb\x08\x6e\xcf\xb2\xac\xb4\x6b\xe4\x4f\xd1\xd6\x93\x4f\x89\x08\xe2\x41\x7d\xdd\x29\xd2\xb9\xa3\x2a\x26\x68\xfc\xa2\xc4\xc9\x16\x8f\x26\xb3\x44\x25\x63\x9d\x8c\xe5\xb9\x6d\xc3\x8e\x2c\x14\xe1\x78\x97\x4e\x5d\xd2\x86\x64\xf8\x6e\xf7\x03\xfd\x28\x8a\x81\xa8\xc7\xa8\xd8\x2c\xb4\xb4\xe6\x5f\x5e\xaa\xda\xd7\xe7\xd7\x6f\x6d\x2d\xe6\x08\x9f\xe1\x93\x90\x67\xb6\x6a\xee\x9a\x9d\xc8\xd2\x0a\x57\x0a\x26\xa6\x2e\x1c\xf5\x82\xf4\xbd\xa2\xe5\xfc\x0d\x05\x43\x51\x4e\x65\xdf\xe3\xdc\x3f\x62\x69\xa2\xc7\x3c\x19\x78\xd2\x17\x7f\xc1\xea\x5c\xff\x84\x0f\xb0\xee\x3e\xb6\x17\x26\x55\xcc\xdb\x3c\x94\xf0\x66\x45\x57\xf6\x35\x28\xd1\xb4\x7b\x53\x57\xc7\x7d\xd1\xc2\x71\x7a\x16\xff\x61\x96\xe1\xdc\x40\xb1\x91\xa6\x5d\x38\xe3\xf9\xe3\x54\x05\x90\xca\x88\x24\x96\x4c\x27\x0c\x7c\x1f\xfb\x40\xf9\x11\x79\x3c\xaa\xc9\x7d\x96\x2e\xcb\x48\x59\xe5\x52\x2f\x62\x0c\xa5\x82\x61\x27\x69\x7c\x9d\x32\xa6\x56\xe3\xeb\x64\x9d\x5d\xbd\xad\xbb\xef\x77\xc8\x58\x66\xd6\x78\xa8\xd4\x41\x8d\xc7\x5f\x57\x0c\x06\xbd\x45\x4e\xe7\xe6\x05\x93\x93\xe1\xd6\x2d\x13\xae\xa0\x37\xc0\xf5\x8b\x0d\x56\x53\x5e\x40\xfd\x38\x75\x1b\xce\x87\x90\xb4\xe9\xdf\x47\x3f\x31\x91\x96\x6c\x72\x12\xef\xdb\xf6\x3d\x54\xed\x64\x02\x14\x35\x5e\x6e\xec\xea\xd3\x0c\x3c\x55\xa8\x4c\x0c\x24\x16\xd1\xe9\xc2\x35\x7b\x17\x87\xb1\xba\x4c\x8c\x85\xf6\x28\x51\xa2\x1a\xdc\xb4\x0d\x26\x53\xa9\xb4\x7b\x23\x37\x27\xe3\x29\x29\xe3\x9e\x8c\xcc\x54\x8a\xdc\xc0\xc5\x72\xf5\x49\x23\xd8\x0d\x26\xa9\x55\x15\xf9\xe7\xaa\x2a\xca\xbf\xfc\x85\x10\x46\x23\x97\x40\xae\x26\xfe\xc1\x0e\x24\x3e\x24\xaa\x48\x22\x74\xcc\x7b\x72\xd1\xfb\x2c\x98\x5a\x12\x99\xc4\xae\x75\x70\xaa\x1a\x98\x12\xba\xfc\x28\x13\x25\xda\x65\xa7\x41\x00\x76\x76\xfd\x94\x94\x72\x0c\xb8\xbb\x97\xc3\x99\xc3\xee\x1c\xfc\x69\xe3\x75\xa3\xa8\x64\x91\xc1\x0a\x3d\x6a\x86\x6f\x37\x37\x43\x57\x55\x2a\x59\x62\x3d\x96\x9b\x50\xd8\x99\x53\x57\xa5\x92\xb1\x9c\x05\x47\xad\x40\xc3\xe9\x8b\xf8\xe1\xee\xf3\xc4\xf6\x63\x34\xf8\x80\x76\x8b\x62\x18\x41\x4f\xd2\xa7\x82\x92\x77\x89\x40\xb7\x7c\x2f\x97\xfe\x6a\x38\x58\xf7\x31\x2b\xec\x3f\x98\xa7\xee\x78\x4e\x25\xd6\x85\xbf\x54\x87\x6a\xfb\xbf\x18\xa8\x8d\x7f\x8c\x88\x78\xde\x6b\xe7\x7c\x07\xd9\x14\x97\x2b\xdd\x28\x10\x96\x22\xc9\x3d\xaf\x79\x1b\x20\x50\x4e\x54\x6c\x1e\x0a\xea\x3e\x28\x63\x8e\xd8\xa1\x7b\x78\x5d\xd5\xbd\x78\xab\xff\x45\x52\x82\x17\xab\xec\x42\xa9\x25\xb4\x3d\xee\x6e\x7e\x33\x93\x8a\x01\xe2\x67\xac\xcf\xac\x0d\x70\xc6\xea\x28\x54\x2a\xb0\x68\xb1\x06\xda\xbd\xf3\xf9\xde\x8b\x5a\x16\x6d\xb3\x6f\x2f\xb9\x1f\x52\x99\x08\x1b\xeb\xf6\x86\xf4\xe9\xef\x78\x94\x66\x42\xa8\xb0\x8b\xea\xc2\x7a\xb1\x5d\x38\xbf\x53\x09\xdc\x5a\xe5\xef\xd1\xdb\x7c\x53\xfe\x2c\xa6\x58\xc8\xfe\xa4\x00\x09\x66\xd1\x2b\x51\xb7\xef\xbd\xae\xe0\x27\x49\x89\x8a\x62\x42\x62\x4f\xfd\xab\x8e\x57\xe5\x58\xce\xcb\x4f\x30\x15\x81\x05\x49\xf9\x75\x7b\x28\x2e\x4e\x55\x1c\xa5\x58\x7b\xf4\x92\x0c\xff\x0b\x6e\xba\xdb\xfb\x11\xdc\x78\xb3\xbb\x0d\xe7\x63\x0a\x99\x9b\x68\x69\x79\x0b\xe5\x73\xfb\x82\xe0\xce\x70\x9c\x53\x0c\xc0\x5b\xf1\x03\xfa\xde\xc3\xec\x9b\xad\x62\x2e\x50\xb5\x69\xf5\x2e\xa1\xfe\x06\xc5\x07\xd0\xee\xd9\x3b\xaa\x62\x19\xd9\xb4\x45\x23\x1d\x27\x98\xb2\x53\x15\x6b\x63\x2b\x5f\x68\x46\x89\x14\xf4\xf3\x71\x44\xfb\x56\x09\x25\x58\x00\xf8\xb6\x59\xad\x1e\x86\x45\x3b\x95\x30\x2b\xed\xfa\xe5\xa8\x82\xb3\x7c\xe0\xf8\xa8\x44\x12\x6c\x4b\x4a\xb0\x14\x9a\xf0\x77\x13\x91\xc8\x3b\xd2\x96\x7a\x57\x6d\xbb\x6d\x16\xe3\x25\xa7\xf4\x3b\x75\x50\xa7\x2a\xed\x1e\x1c\xee\xdd\xdf\xd6\x7f\xe0\x35\xac\x9f\x56\x49\x92\xfa\x73\xa6\x26\x4e\x99\x2f\x06\x35\xed\xfd\x13\x20\x0c\x1a\xe1\x97\x3f\x0b\x05\xae\x4b\x30\x6a\xf7\xa9\x8c\xa8\x44\x78\x4f\x6b\x74\xfc\x0f\x12\x0f\x13\xa4\xd6\xc7\xe8\x2d\x95\xf1\x18\x97\x70\xbb\x13\x7c\xbf\x7d\xbc\xec\x02\x2b\x22\x73\xac\xcf\xfe\x51\x88\xea\xee\xbc\x2c\x44\xd5\x5d\x7d\xe4\x2f\x9e\x2a\x2b\x3f\x75\x14\x4d\xe3\x94\xfb\x2f\x41\x97\xe1\x0b\x19\xc4\x48\x38\xda\xc2\x4f\x28\xb7\xad\x28\xb5\xa8\xf5\xec\x1b\x72\xd9\x5b\x53\x3c\xb2\x24\xc0\xda\x82\xdb\x17\xb2\xc1\x35\x02\x3f\xbe\x9f\x7f\x1d\x15\xcf\x29\x6a\x01\x3b\xce\xe2\x3c\x86\xca\xff\xdb\xbf\xf2\x8a\x1b\x83\x04\x50\xdb\x87\xf1\x36\xc6\x41\x02\xe2\xba\xae\x8e\x17\x2c\xf7\xf0\x2b\xf3\xd8\xb6\xc5\x9f\x7d\x85\x54\x89\x24\xc6\x4c\x49\x57\xee\xa5\x1d\x5f\xa5\xa0\x56\x48\x6d\x53\xea\xaa\x11\x93\x88\x4e\x89\xdc\x6a\xed\xe0\x3a\xb6\xbf\x87\xd7\xbe\xdf\x3a\x38\x85\x49\x31\x47\x84\x2e\x78\xbe\x72\xe6\x8f\x93\x31\x32\x02\x14\xb3\xb1\xcb\xe2\x62\x7a\x0a\x99\x59\xb5\xc0\x06\x4a\xed\xbd\x53\xdc\x21\x15\xc5\xd2\x2d\x95\xcb\xf3\x3b\x0a\x76\x35\xdd\x62\xb9\x3c\x4d\xea\xc4\x4a\x25\x91\xab\xd2\xff\xac\x7e\xc0\x75\x17\xcd\xc3\xf1\x34\x54\x0f\x0c\x03\x95\x76\x12\x73\x55\xad\xb7\xd5\xc1\xbe\xde\xd3\xd3\xd1\x14\xab\x49\xb6\xb9\xdf\x6d\x29\x98\x1d\x74\xe1\x61\x3a\x9f\x56\x28\xa5\x13\x74\x93\xc0\x37\x63\x2c\x68\xec\x46\xe8\xcc\x7a\xff\x3c\x9d\xe5\xa1\x78\x1b\x4f\xbf\xf1\x45\x9a\x24\x41\xa0\x8d\xaf\xdf\x77\xe1\xe6\x80\xf3\xff\x77\xb1\xc2\xf6\x6c\x3a\x8a\x24\x56\xf7\x75\x05\xcd\xc3\x6b\x39\x45\x36\xfb\x51\x59\xc4\xc0\xd3\x52\x4b\x30\x85\x2a\x44\xfd\x7e\x5d\x94\xbd\x88\x0f\xd5\x91\x96\xc8\x08\xa9\xd1\x5c\xa8\x2a\xe1\xfd\xeb\x69\x57\x7d\x7f\xa9\x0e\x70\x5d\x94\x25\xbc\xaf\x27\x0c\x6d\x1d\x67\xb6\x52\xfd\x0c\xad\x83\x04\x77\xd1\xce\x75\x85\x64\x9b\xf1\xb3\xd1\x31\x63\x18\xb4\xed\xbe\x3f\x6c\x2a\xdf\xcc\xe8\xfe\xaa\x9c\x89\xd7\x63\x55\x1d\x16\xc7\x36\x1c\xc9\x35\xe5\xbd\xe8\x41\x17\xec\x8a\x43\xd0\x9a\xec\x8e\x83\x4c\xfb\xfd\x78\x44\x2c\xfa\x9c\x0b\xaa\x53\xc6\x63\x0b\x8f\x1f\x33\xc3\x74\x96\x25\xd8\xde\x46\x11\x38\x54\x8d\x9d\xfc\x60\xc2\xad\xbd\xc0\x51\xbc\x3d\x5a\x4a\xd1\x6f\xe1\x88\xb1\xca\xb1\x07\x51\x1c\x17\x36\x89\xe8\x36\xd4\x5f\x6d\x48\x93\x4b\xa3\x44\x60\xe0\xe2\xc8\x2d\xd3\x2a\xbb\xee\x32\x2d\xe4\x84\xb8\xbe\xc5\x98\x8e\x36\x3d\x37\x4e\x06\xff\x49\x20\x71\xda\xe3\xe6\x7f\xff\x73\x35\x9f\xb7\x6a\x9e\x26\xb9\x53\x0d\xe8\x5e\x89\x7d\xcc\x46\x49\x53\x77\x1c\x41\x10\x88\x32\xc1\x0b\x9c\x44\x56\x9a\x53\xab\x57\xe1\x67\xf8\xef\x03\x94\x9f\x1b\x92\xc7\xe0\xa5\xf8\xd7\x6f\xd5\xe9\x20\xca\x29\x5b\x5a\xe7\xcc\xc2\x31\xad\x5d\xcf\x15\x9c\x44\xdd\x9e\x6b\xb8\x2d\x26\x78\x23\x2d\xd2\x14\x09\x91\x6e\x7d\xb9\xf4\x5b\xf6\xe3\x8c\x50\xee\x87\xdd\xd4\xf0\x3e\x43\x54\xd4\x32\x4d\xc1\x15\x61\xbf\x55\xc8\x56\x08\x25\xb5\x51\xce\xa9\x25\x17\xc6\x3a\xb8\x76\xeb\xf7\x8c\xa7\x2d\xd5\x8a\x68\xe4\x33\x60\x30\x69\x13\x73\x68\x7d\xfb\x56\x2b\x9e\x67\xf9\x85\xf9\x63\x37\x8d\x67\x96\x2c\xad\x34\xc1\x0d\x73\xb5\xd8\x21\x31\xd2\x9f\x45\x67\xb9\x57\x27\x53\x70\x09\x03\xfb\xd5\xff\x1f\xfe\xfb\x01\xed\x40\x1b\xaa\x70\x1f\x29\x1c\x30\xca\x73\xf5\x07\xc0\x11\x88\xa3\x04\xc9\x96\x1f\x78\xc5\xff\xdd\xd4\x63\x3c\x11\x21\xa6\x22\xa5\x43\x48\x31\x04\x33\x77\x0a\x71\xce\xb0\x28\x80\xe9\x98\x1a\x62\x3e\x21\x49\x13\xe5\x1e\xe2\xed\x59\xfd\x78\xc7\x46\xdd\x26\xf4\x94\x21\x21\x11\x8f\x7b\xed\xa3\xd9\xb5\x7a\x4a\xbe\xf9\xc7\x0c\xd5\x19\x12\x43\x54\x3c\x30\x64\xbb\xec\x6f\x43\x1a\x5b\x33\xdf\xeb\xc5\xfd\xdf\x76\xcd\xf0\x1f\xcd\x62\x62\xd5\x48\x0e\xed\x00\x38\xef\x8f\x0a\xe6\x35\x11\xf0\x1d\x2c\xca\xe7\x2d\x80\xbe\x18\xa6\x59\x20\x24\x39\x42\x93\x3b\x92\x25\x16\x95\xb6\x7f\x45\xfd\xce\x7f\x8a\x2e\x8f\x9c\xbc\x83\x90\xa5\x91\xe9\xbd\xaa\xe0\xd4\x7a\x99\x87\x70\x33\x33\x4e\x52\xde\x83\x8a\x3c\x19\xb3\x3f\xae\x53\xef\x86\xb9\xad\x4c\xbb\x12\xa7\x27\x10\x2a\xe8\x7d\x53\x20\x29\x10\xe5\xb9\xa9\xe7\xd2\x69\x6f\xf6\x47\x6d\xb9\xe3\xf5\xa5\x50\x2f\xa8\x3e\xbd\x69\x76\x2f\x45\x38\x3d\x31\xb6\x55\x80\x4a\xa5\xa1\x61\x79\x9e\x4a\x3a\xf2\x99\xd8\x0f\x68\x6a\xd0\xfa\xc2\xb6\x08\x67\xbc\x48\x28\xd0\x2c\xc7\x72\x4d\xbf\xef\x00\xcb\x09\xf0\xe0\x8c\x34\x65\x47\xcd\xae\x3c\xc0\x24\x11\x16\x88\x64\x65\xdb\x2f\xd6\x43\xe0\xa9\x95\x19\xf4\x75\x54\xdf\x7f\x0c\x87\x21\xf1\xc2\xd6\x7f\x2f\xc5\x01\x9e\x45\xb8\xc2\x06\xb9\x11\x14\x5c\x6e\xda\x42\x7d\x50\x2b\x81\x3c\xd6\x08\xb6\x7a\x7a\xf0\xea\x20\x90\xe7\x06\xfc\xf7\xae\xc3\xe2\x05\x22\x56\x5e\x60\x7c\xd1\x65\xcc\x16\xb7\x7e\x0d\xf0\x08\xf5\x3f\xcf\x17\xdb\x26\x88\x24\x47\xba\x6a\x59\xb5\xeb\xff\x9e\xc5\xe1\xb7\x90\x3d\x84\xff\x18\xdd\x76\x19\x29\xfc\xb9\x21\xb1\x89\xf6\xed\x50\x60\x78\xee\x51\x49\x2a\x54\x30\x7c\x7e\xb4\x98\xe4\x1b\xd1\xc2\x6b\xc8\xed\x40\xf2\x18\x15\xaf\x5e\xb0\x71\xb8\xde\x7d\x99\x3c\x04\x09\x56\x99\xb9\x28\x95\xe5\x30\xdd\x54\x95\x7e\x82\x0f\x68\x4c\xa0\x62\x8a\xf3\x47\x59\x13\xbd\xc9\xc9\x14\x4d\xac\x34\x81\x78\xb7\xd0\xac\x8f\xce\xc2\xad\x8c\x50\x03\xed\xca\x3b\x77\x8c\x56\x60\x50\x39\x65\x32\x14\x33\xbe\x9c\xe4\x7d\xa5\x61\x96\x30\x0c\x2a\x97\x68\x5c\xb3\xde\x7d\xd9\x3f\x3e\x6d\x56\xeb\x7d\x10\xa6\xa4\xa0\x04\x41\xad\x88\x73\xf9\x22\x0e\xe8\x30\xec\x0f\x28\xa5\xa4\xe3\x78\x3e\x42\xdd\x54\xa5\x38\x2c\x3e\xd1\xec\xa5\xa0\xa9\x75\xfd\x0a\x0a\x24\x5d\xf2\x32\x09\x03\xba\x41\xe8\x85\xd2\x05\xfe\x35\x28\xd1\xc2\x4a\xb4\xf0\x5c\x4d\x68\xed\xfd\xad\xd0\x4a\x63\x0b\xfe\x45\x20\x52\x00\xf4\xc3\x41\x63\x41\x68\x52\x69\x03\x48\xad\xb0\x2d\x5a\xdc\x20\x7d\x0c\xcd\x7e\x06\x60\x05\x80\x2c\xc7\x18\x0f\xd7\x8c\x3b\x81\x4c\x53\x7f\x48\x48\xd1\x7b\x55\x5e\xa3\x4f\x4b\x39\x38\x6e\x48\x8a\x95\x85\x6e\x57\x6e\x5a\x27\x6f\xec\x8f\x71\x82\xa0\x16\x68\x5f\x9e\xe0\x50\x80\x09\x07\x34\x60\xa2\x83\x65\x0b\x5f\xb7\xfc\x40\xef\x9d\x9a\x38\x8e\xb1\x02\xf8\xb4\xbe\x5e\x3f\x3d\x2d\x6e\xf7\xcb\x87\xfb\xaf\xdb\xfd\xed\xfa\xdb\xfa\xd6\x37\x96\x4c\x9c\xda\xbd\x03\xa5\x27\x87\x45\x60\x93\x48\x5b\xaf\xc4\xe8\x49\xcd\x30\xfe\x4d\x9a\xc6\x68\xa3\x88\x9a\xa5\x63\xef\xb7\xee\xa0\x80\xc4\x33\x1d\xba\x30\x4e\x4f\x21\xb9\xc3\x6d\xce\xa4\x54\x61\x94\xff\x02\x87\xd3\xb2\x2f\xe9\x9a\xd4\x28\xac\x0b\xdf\x89\x53\xa5\x26\xdf\x9f\xb1\x08\x0b\xcc\x1e\x27\x66\xbd\xdc\xc7\xcb\x82\xc9\x64\x9c\xf4\x82\xc7\x3b\x28\xc5\xb4\xf3\x60\x32\xc3\x74\xaf\x28\x79\x55\x3c\x17\xad\x38\x2c\xea\xf6\x43\xf4\xb9\x21\x4c\xe8\x20\x68\x02\x3f\x46\x5d\x4f\x43\xd3\x1c\x41\xf9\x6d\x01\x75\x3a\xf9\x2a\x4a\x23\x2f\x92\xe0\x08\x39\x43\x6d\x1b\x43\xb9\x89\x7b\x76\x10\x02\xfe\x97\xe7\xf7\xfb\xf3\x07\xdd\x15\x43\x73\x8e\x51\x86\xaa\xab\xa6\x9b\x64\x88\x6b\x1b\xa7\xc0\x86\x45\x09\x46\xf3\xa2\x6c\x5e\xa7\x19\xa5\x61\x99\x44\x61\x57\x14\xb9\x40\x10\x64\x19\xd0\x12\x86\x81\x05\x7b\x9c\x6a\xd8\xac\x1e\x86\x2d\x3f\xc3\x4c\x6a\x5c\xae\x87\x4b\xe7\xa3\x78\x9d\x50\x8a\x0c\x0f\xd4\x85\xf2\x09\xbb\xcb\x5f\x77\x7f\x3c\x8c\x7f\x47\x12\x0d\x36\xce\x49\x2e\x61\xb8\x50\xd8\x5b\x3f\x22\x1b\x74\xa0\x77\xed\x8e\x0b\x67\xbe\x7f\x27\x9a\x91\xaa\x92\x11\xb9\x36\x56\x93\xb0\x79\xf1\x00\x9c\x66\xa0\x10\x4a\xb3\xff\xf7\x7f\xf6\x9b\x7c\xa4\x6d\x04\x48\x09\x5e\xbf\xb4\x3a\x56\xbb\xca\xd9\x2a\x8d\xb2\x12\x23\x0d\x8d\xa8\xaf\x26\xd4\xb8\x17\x75\xcb\xd7\xf8\x77\xeb\xc8\xae\xd8\xfe\xa5\x09\xf3\x42\x13\x6b\x7f\x27\xcf\x75\x89\x99\x6f\x38\xa0\x01\x3b\x94\x28\x03\xd7\xff\x0d\x11\xb0\x4d\x5b\x9f\x55\x97\x92\xec\x7f\x8a\xba\x10\x65\xbb\x77\xa6\x3d\x96\xc5\x35\x78\x83\x34\x58\x31\xa9\xa7\xf5\xbf\xbe\x6e\x9e\xd6\x57\xd6\xd7\x77\xbb\xdf\x3d\xec\x97\xeb\xfd\xf2\x61\xf1\x74\xb5\xbf\x5b\xdf\x2d\x43\xcf\xc1\xa0\x30\xbf\x0b\x2d\xf1\x09\xd9\x66\xca\x6c\x0d\xc0\x40\xa4\x90\x08\x69\x09\x93\x77\x1e\x2d\x3c\xbe\x41\x10\x1b\xed\x2a\x82\x8f\x42\xfd\x10\xcf\x80\x6c\xa5\xf1\xa4\x85\x24\xc1\x49\x6e\x6f\xcf\x77\x51\xcc\xd4\xb8\x8d\xe1\x76\xf1\xff\x67\xf5\x3e\xcc\x9e\x8d\x51\xe0\x01\x68\xf8\xf7\x41\xff\x87\x45\x51\x62\x30\x64\x50\xa2\xdc\x34\xcd\x79\x7c\x4e\x16\x45\xd4\x42\x9d\x6d\x27\x0e\x1f\x74\xaf\x42\xcd\xa2\x98\x1a\xea\xd4\x28\x1e\x1f\x1e\x6e\xf7\xa0\x8b\x76\x9f\x90\x70\x58\x0b\x2c\x18\xa2\xe4\xb2\xcf\x06\xe6\xb6\x5b\x16\x25\xa9\xc0\x78\xd5\x16\x0c\xbe\x14\xcd\x1c\xf4\x76\xf2\x99\xb4\x5b\x89\x9d\x2a\xcf\xdb\xa9\x18\xb3\xf4\xa6\x63\x8d\xf1\xed\x37\x74\x5e\x07\x6d\x51\xf0\x50\x5b\x79\xb7\xf0\x93\x32\x4e\x84\x93\xfa\xb9\x39\x54\x52\x1c\x1e\xbb\xf7\x7c\xb4\x26\xb1\x28\xcb\x33\xc4\x76\x60\x0a\x83\xc0\xd8\x4d\x39\xc1\xeb\xcc\x4d\x09\x16\x91\x8c\x68\x3b\xd3\xdb\x2e\x64\x1c\x3e\x65\x16\x11\xce\x23\xeb\x20\x61\xcb\x1f\x3d\x44\x99\x45\x34\x51\xa6\x7b\x4e\xb6\x71\x11\xfe\x4a\x73\xac\x04\xba\x6e\xce\x60\x5f\x1b\x9f\x99\xa5\x0c\xb7\xac\xbd\x9f\x03\x01\x4c\xe8\xdd\x6a\x7f\xbb\x28\x8c\xb2\x88\x71\x96\x2a\xbf\xf2\x5a\x2c\xca\x50\xb7\xcd\x8f\x12\xb1\x7f\xc3\xbb\xad\x6a\xdd\xbe\xec\xaa\x71\xee\x36\x7e\x12\x3c\xa6\x26\x1e\x54\x21\x76\x20\x8e\xf1\x27\x7d\x69\x16\x71\xc2\x91\xf7\x8f\x8d\x3e\x8f\x03\x68\x26\x33\x35\x27\x96\x7c\x8e\xf9\xca\xc1\xa3\x66\xe2\x7f\x8c\xfe\xf1\x63\x75\x1c\xfb\x45\xc9\x2b\x26\xbb\x3a\xfd\xf8\xb7\xe5\xda\xa0\xa2\x1b\x32\xce\x26\x3c\x06\x16\x09\xce\x79\xdf\x7a\xb2\xdc\xac\x59\xb2\x28\x8b\x04\x38\x4b\x5f\x7c\x8f\x7c\x44\x86\xbf\xfa\x7b\xd1\xbe\xd8\x1d\x6d\xa6\xcb\xcb\x22\x99\xc7\x38\x71\x7f\x56\x43\x43\xbd\x51\x1d\x7b\xfa\x09\x95\x61\x8c\xb1\x77\xee\xd4\x5f\xcb\xe2\xbf\x67\x28\x3f\xd2\x38\xea\x3e\x40\x70\xde\x6d\xcf\xa7\x1a\x8e\x9b\x87\xdd\x65\x09\x86\x45\x12\x08\x66\xac\xcb\xed\xda\xcf\x3e\x15\x65\xd2\x35\xb3\x86\x71\x26\xfa\x80\x8d\x3f\xac\x52\x95\xb8\xf2\x19\x1a\xd0\xd9\xca\xf8\x00\x7b\xc3\x22\xc5\x19\x6e\x41\xd6\xc0\x71\xd0\x77\x60\x91\x12\x26\xb5\xf5\x6e\x17\x91\x58\xe4\xe5\xc7\x50\x3a\x16\x29\x13\x29\xeb\xf2\x14\x14\x74\xae\xcf\x87\xc3\xbb\x55\xc8\x9c\xbc\x77\x26\x02\xac\xac\xe1\xfa\x34\xa0\xa4\x84\x35\xc1\x10\x4b\x2f\x56\x22\x94\x59\xfa\x43\x0a\x8b\x5c\x18\x0d\xf8\x3a\x8b\x3f\xc6\x12\x74\x9f\xdb\xf7\xe8\x91\x9b\xb0\x5f\x75\x87\xf3\xc4\xd9\x0a\x96\x7a\xf9\x7e\x65\x33\xf5\x2e\x46\x55\x2f\x70\x21\xec\xf1\x81\x21\x72\xbf\xfd\xb3\xc8\x68\x99\x7b\xe5\x53\xf1\x03\x3b\xb2\x1f\xd6\x4f\x46\xcf\x27\x8e\xd3\x9c\xba\x95\xb4\x5f\xc7\xd3\xe1\x46\xc5\xe2\x24\xe2\x98\x38\xd9\x29\x7c\x8d\x70\x50\xe7\x5e\xf1\x8b\x3a\x92\x3f\x41\x6c\x5d\xaf\xf7\x35\xfc\xf7\x5c\xd4\xb0\x2c\xb4\xee\x15\xeb\x67\x9f\x63\x9c\xe4\x80\x3d\x9d\x6d\x71\x3c\x1d\xba\xb5\x65\x29\x4a\x3f\x65\xe2\x34\x55\x28\x6b\xf8\x65\x35\xd8\xef\x58\x9c\x66\x92\x07\x1b\xb5\xe6\x1e\x40\x83\xde\x55\x37\xdd\xfe\xfa\xde\x47\x43\x2c\x4e\x09\x73\xc4\xe4\x52\x1d\xce\x1a\x82\x5e\xf3\xf8\x12\xb2\xc4\x9a\x6b\x3c\x3e\xad\xf7\x68\x07\x76\xb7\xf8\x63\xbf\x5a\x3c\xfa\xd3\x64\x59\x86\x61\x87\x13\xdc\x9c\xf5\xcf\x61\x71\x46\x19\xea\xdb\x9f\x1b\xa8\x9f\x44\xf9\x63\x84\xb8\x62\x71\xa6\x28\x42\x4c\x44\x59\x75\xb3\x3a\x68\xe0\xb8\xc3\x24\xd5\xa9\x0c\x55\xa5\x76\xe8\x0f\xe0\x47\x50\x8e\xca\xed\xe6\x50\x9c\xb6\xaf\x45\xab\x5e\x76\x55\xdf\xd7\x66\x31\x91\x11\xe6\xd0\x65\x75\xfe\xd9\x6d\xb1\x8f\xbd\xf7\xc8\xf8\xe7\x12\x50\x88\x77\x5d\x97\xdd\x44\x6f\x41\x6f\x5f\x06\xe9\xe6\xc7\x4d\xb5\x49\xd6\xc8\x62\x9a\x53\x18\xf6\x53\xae\x17\x9b\xab\xed\x87\xfd\x42\x16\x33\x93\x5a\x13\xf9\xa2\x41\xd4\xf9\x23\xd4\x3f\xb0\x90\xe3\x88\x14\x69\xf2\x7f\x83\xf4\x87\xc5\xb9\x13\x34\x74\x8a\x74\xab\xc5\xe3\x3e\xe4\xce\x2c\x16\x84\x5a\x58\xaf\xf6\x02\xa8\x33\xd8\x08\x16\x0b\x46\xb0\xcf\xbe\x5c\xef\x16\xfe\xa3\x92\x59\x54\xf3\xf5\x47\x3a\x17\xb3\x85\x41\x16\x4b\x61\xac\x2f\x50\x11\x9e\x9b\xd4\x11\xb3\x8e\x6b\xc7\x6a\x72\x9f\xa5\x36\x38\xfb\x1e\x0f\xe2\xbd\x0f\xc5\x59\xac\xa2\x14\xb7\xd3\xa0\x82\xec\xbc\x46\x3c\x6f\x95\xc5\x8a\x5b\x0a\x4a\x23\x8a\x6f\xd5\x9b\xff\xab\x16\x16\x07\x81\x65\xed\x25\x1c\x04\x3a\xde\x6b\x7f\x18\x62\x6d\xd5\xcb\xeb\x4a\x41\xd3\xb8\xb6\xd0\xa7\xec\x30\x16\x43\x2e\x50\x91\x60\x60\xae\x38\x67\xd9\xe1\x47\x83\xed\xfc\xb8\xd2\x67\x17\xc6\x7a\xab\xd0\x8f\x0b\x44\x2c\x36\x42\x51\x17\x99\x2d\x0e\x87\x3b\xb4\x46\x0c\x85\x4a\x16\x1b\xc8\x65\x2f\x5c\xbc\x29\xb1\xac\xe0\x0e\x26\x51\x92\xf9\xf8\xd3\xd1\x96\x1f\xe4\x7f\x86\x50\x1d\x96\x44\x39\xe0\xdd\x0a\x2a\x93\x17\xdc\x00\x3f\xd0\x28\xc6\x43\x1b\xf8\xe1\xa2\xe5\xeb\x86\xc5\x54\x7a\xe5\x82\xee\x82\x5c\xe4\x65\x3b\x0d\x77\xe2\x34\xf9\xa9\xfe\x43\xdc\xd2\x8d\xe4\x19\x9f\x75\xf3\x0b\x15\x1b\xff\x29\xc7\x93\x44\xe5\xa7\xe3\xa9\x85\x7d\x92\x8f\xd6\xe4\x24\x89\x62\x0f\x4e\x5f\x42\x6b\xc5\x0e\x6c\x47\x6e\x3c\xdb\x92\xc4\x81\xec\x51\x33\xbf\x6c\xaf\x0f\xa2\xbd\x12\x85\x97\xeb\x60\x49\x16\xe7\x76\x87\x73\x29\xbf\x38\x4e\x45\x36\x58\x92\x65\x1c\x7b\x2b\xc7\x02\x95\x3a\x30\xb9\x1d\xe6\x12\x09\xa1\x31\xb3\x1d\x7f\x55\x95\x1a\x85\x54\x7a\xb1\x63\x96\x90\x5c\x47\x21\x1b\xb8\x11\xcd\x20\x8d\x67\x09\x01\x9e\x0f\xcd\x75\xba\xd4\xfc\x52\x0a\x97\x25\x34\x12\x59\xea\x34\x53\x61\x77\x21\xe0\xe5\x77\xc5\x2e\x2a\x1a\x6c\x8d\x09\xa5\x31\x96\x9d\x4a\x68\x5f\xab\xfa\x87\xb3\x83\xb7\xfa\x08\xbd\x6c\x09\x4b\x98\xd0\x38\x87\x0f\xa2\x69\xf7\x72\x68\xa6\xc2\x12\xae\x09\x78\x31\x19\xd7\x74\x07\x3d\x92\x7c\x9a\x7f\x8c\x79\x6a\x41\x7d\x0f\xdf\xef\xf7\x3f\x8a\x83\x7f\x8f\x93\x3c\x95\x28\x28\x7e\x14\x6f\x28\xb3\x92\x2c\xac\x0a\x7b\x51\x95\x8f\x50\x07\xf4\xb7\x1f\xcd\x13\xcc\x78\x6f\xec\x16\xe0\xdf\x8f\x44\xa6\xc6\x36\xac\x46\x91\xe5\xdf\x6d\x6f\x4e\x2e\x55\xf2\x04\xf7\xba\x6f\x8b\xc7\xb5\x2c\x06\x5f\x92\x2b\x04\xe1\x2e\xde\x8a\x2e\x34\x63\x49\xbc\x14\x0d\xac\x4b\x94\xcb\x0d\xba\x30\x38\x0e\xb3\x94\x46\xbd\xc0\x51\x8c\xc3\xac\x44\x6a\x29\xdd\x23\xde\x22\x0a\xaf\x99\xd3\xc9\x60\x89\x06\x66\xd2\x8b\x16\xdc\x65\xfb\x8d\x25\x90\x70\xe5\x0a\x66\xab\xa7\x3b\x51\x8a\xe7\x8b\xf9\x02\x59\x1a\xd9\x3e\x08\x32\xdd\x1e\xcc\x4c\x3f\x81\x25\x20\x68\x6c\x5f\x8f\xb6\x7e\x0f\xda\x53\x2c\x8d\x22\x62\x5c\x41\x66\x37\x94\xd0\x9b\xdd\x00\xd2\x28\xcb\x52\x87\xfa\xfd\xbd\x38\x1c\xc2\xe2\x9b\x46\x22\xc5\xdd\xfd\x13\x49\xfc\xd9\xe7\x91\xc6\x2c\xc6\x74\xf1\x16\x44\x03\xcb\xe2\x70\xb8\x08\xb5\x86\x3f\x23\x4d\x98\x2d\x5f\xca\xf3\xfb\xbe\x7d\x71\x20\xfb\x31\xc6\x94\xa5\x29\x85\x94\x04\xf7\x31\xd0\x2b\x71\xf2\xcf\x39\x4d\x25\xe7\x7c\xd0\x39\x6b\x16\xaa\x2d\x26\xe2\x46\x2c\xcd\x12\xcb\x47\xf7\xfe\x66\x16\x13\xd5\xe5\x31\xb8\xa6\x60\x7e\xed\xcf\x98\x11\x7b\x07\x97\x45\x7b\x35\xd0\xdb\xfb\x9f\xa6\x65\xca\x28\x0b\x1e\xbb\xb6\xc3\x79\xb1\x3a\xa5\xdd\x5b\x66\x7b\x39\xf7\x55\x8b\xe2\x13\x73\x77\x28\xcf\x34\x92\x08\xba\x15\xae\xcf\xb1\xe7\x1f\x67\xae\x34\xc6\xe7\x6d\x83\x1a\x2a\xa0\xfb\x07\x2a\x53\x89\xc9\x8a\xfb\x00\x62\x4f\xbe\x15\x87\x83\x78\x9e\xd4\xc4\x59\x2a\x33\x9b\x04\x1c\x8b\xb2\xfd\xd5\x53\x9f\xfc\x6c\xa5\x88\x75\xe3\x81\x57\x8f\x2b\x98\x06\x62\xbf\xea\x24\x0f\xd6\xc0\x54\x13\x83\x93\xc9\x13\x15\x6c\x0d\xe2\x83\xb6\x3c\x4b\x75\x6e\xe5\x78\x7d\xfc\x26\xec\x54\x70\x47\x21\x36\x88\x36\x78\x2e\x7e\x82\x12\xa5\x7e\x37\xb5\xd7\xed\x60\x29\x68\x08\xb0\x9c\x2e\xbb\x77\x3b\xf2\x3f\x2e\xff\xf1\x2f\x7d\x6a\x52\x7b\x9b\xee\xc4\x51\xb4\x7f\x0f\x25\xc6\xb2\x38\x8b\x5c\xbf\x4b\x9d\x6b\x98\x40\xd2\xc6\x3f\x27\x8b\x89\x15\x28\x76\x47\x1f\x0c\x7e\xc9\xd7\x06\xf4\xa2\xb1\xa9\xbb\x63\x72\xb2\x2c\xd6\x2a\x86\x29\x68\xde\xbe\x45\x7c\x3e\x52\xca\x92\x48\x64\xb1\x6b\xc8\x8d\x45\x5a\x26\x03\xbb\x9c\x25\xfb\x5f\xa5\x96\x2e\x51\x6b\x2c\xcb\x94\xed\x78\xb8\x6e\xf9\x97\xe2\xd4\xf7\x52\x58\x46\x54\x8c\x81\x11\x76\x62\x1e\xeb\xaa\x8f\x8c\x33\x1a\xdb\x54\xc3\xe2\x37\xee\xc4\xdb\x6c\xc8\x92\x51\x69\x90\xef\x2f\xcf\x56\xb6\x13\x1b\x32\x7e\x16\x8e\x7f\x13\x8b\x25\x62\xc8\xfb\x30\xd1\x89\xed\x7d\x3a\xbd\x33\x26\x24\x42\x73\xc6\x46\x95\x9f\x02\x71\x58\xc6\x20\x43\x7f\xe5\xd7\x53\xf8\xad\x3c\x17\xd8\xa9\xc3\xc8\xf7\xba\x28\xc5\x01\xb7\xd3\xfe\xb0\xc9\x13\x6f\x38\xd5\x54\x4e\x9b\xa5\x8b\x5c\x26\x3f\x43\xc4\xd6\x7b\x09\xc1\x64\x8b\xe7\x4f\xc2\xe3\x7f\x4c\x3f\x68\xe1\xb1\x27\x8b\x0a\x4d\xfc\x37\xcb\xd8\x92\xb0\xbd\xad\x79\x83\xde\xf3\xfb\x70\x98\x24\x28\x2f\x71\xb0\x18\xd0\x65\xa1\xc3\x11\x15\x47\xce\xb4\x72\x98\xd9\x66\x2a\xe2\x58\x08\x79\x7c\xb8\xab\xaa\xaa\x1a\xfc\x3d\x07\x4b\x0b\x6f\xc5\xa1\x7a\x0e\x7f\x76\x80\x0b\x57\x9f\x12\x2d\x3c\x1e\xc4\x65\xb6\xee\xde\xaf\xd1\x2e\x91\x29\x16\x23\x41\xa3\x8b\x6b\xc6\x42\xde\xe3\x55\x32\x53\x39\x45\x24\x80\xfd\x12\xac\xc9\xcc\xf8\x02\xb2\x4c\x09\x45\x55\x3f\x5f\xef\x8a\x12\xea\x6b\x6b\xc6\x88\x45\x91\xf1\x59\xbd\x0a\xc9\x5e\x68\x7d\x7b\x1e\x2c\xd1\xe3\x93\x42\x64\xbc\x93\xca\x9d\x78\xb3\x1e\x80\x5d\x3c\x12\xa2\xcb\xc9\x70\x9a\xe0\x82\x2a\x0f\x8e\x4e\xf2\x67\x75\xae\x1b\x38\x18\x7f\xc7\x80\xe7\x8e\xb6\x7e\x3c\x89\xf2\x7d\x86\x1c\xc5\x32\x13\x09\x7c\x7f\xac\xa0\x60\xd9\x62\x2d\x72\xfe\xde\x18\x65\x50\xfc\x76\x8f\x75\xe2\xdf\xe1\xfd\x82\x37\x34\xba\x3e\x12\xc5\x11\x4b\x03\x15\xb6\xa8\xca\x1b\xaf\x5e\x3d\x23\xe9\xcf\x48\x1c\x05\xbe\xce\x12\x6f\xc0\xf8\xe7\x92\x98\x2b\x1e\xaa\xd4\x2f\xa2\x79\x99\xe8\xe2\x32\x92\x70\x1e\x8b\x91\x63\xc5\xec\x7d\x26\x29\x8d\x2c\xbe\xae\xfa\x09\x36\x30\xd8\x55\x63\xd9\x16\x3f\x90\x09\xa4\x0f\x22\x23\x16\x33\xad\x9e\x31\xc0\x48\x9a\x47\x48\xc9\xbd\xad\x9e\x7d\x78\x6b\x9f\x19\x7c\xb0\x5c\x92\x54\x18\x4c\xe3\x6b\xa7\x9e\x83\x05\x8b\x0f\x99\xcc\x8c\xa4\x2a\x8d\x94\xe5\x90\xda\xd6\xf6\xe4\xfa\xb2\x24\xa5\xda\x53\xed\x9d\x2d\x18\x04\x47\x9d\xee\x38\xc1\x8c\x77\xd9\xdd\xf4\xf2\x67\xf3\x04\xe2\x70\x27\x74\x1d\xde\x4d\x92\xd1\x98\x39\x07\xec\x7e\xbd\x25\x59\xce\xd1\xd6\xc0\xd6\xa9\x56\x2f\x41\x02\xea\xd7\x85\x13\xff\x34\x33\x60\xe8\x42\x52\xa8\xca\xb8\xec\xdc\x1d\x21\x91\x25\x2c\x8a\x1a\x16\x07\xef\x5b\x7a\x7f\x3e\x8c\x15\xdd\x18\xa1\x91\x41\x28\xe1\x10\xc1\xea\x33\xf0\x4f\x02\x03\x42\x0d\xe1\xc6\x27\x36\xc6\x14\xea\x7c\x68\xdf\x17\xcd\x75\xf1\x06\xd6\xcb\x0c\xe9\x96\x47\x98\x48\xd8\x30\xc2\xe2\xd8\xd7\xdc\xa1\xd4\x3a\x20\xcf\x18\xe1\x59\x84\xc0\x38\xeb\xe1\xb6\x37\xbd\x76\x08\x23\x9c\x12\x8f\x03\xbb\x43\x3a\xd5\x77\x51\x5f\x81\xe8\xb9\x93\x8c\x70\x66\xa3\x8b\xdf\x8b\xa6\xb9\xfb\xb4\x7c\x40\x38\x8f\x91\x05\xe4\x3b\xda\xee\x7d\x19\x5f\x28\x17\x39\x62\x7b\x9b\x13\xa8\x42\x1c\x6c\x5f\x76\x3c\x33\x72\x91\x12\x57\x86\x58\xad\xbe\xb8\x0a\xa8\x2f\x41\x13\x91\x4a\xc2\x7a\x3c\xba\xde\xcd\x8b\x9f\x32\x22\x94\xb5\x75\x7c\x16\x4d\x00\xcd\x32\x22\x63\x81\x55\x62\x9b\x17\x6d\xc2\x64\x92\x52\x21\xc9\xfa\x69\xbd\x5d\x3f\x7d\x5b\x5f\xed\x5d\x31\x6b\xb7\xf9\xd7\xe3\x66\xb7\xdf\x3e\xdc\x7e\xdd\x6d\x1e\xee\xb7\x61\xbc\x61\x38\xf9\x5a\x0c\x5f\x5b\xdf\x77\x66\x44\x45\x99\xb0\xfa\x38\x96\x2b\xe7\x05\x4c\xe7\x2f\x52\xc5\x36\x93\x57\xe1\x15\x58\xbe\x3b\xcb\xe1\x5f\xd1\xea\xdc\x19\x74\xc6\x50\x52\xca\x99\xe1\xf9\xcb\xd0\x4c\xfa\x12\xd0\x55\x55\x3a\x65\x90\x3e\x68\x21\x1a\x64\xee\x1c\x72\x6e\x44\x29\x26\x8f\x00\x22\x81\xcc\x9f\xd7\xa2\xd4\xd5\x6b\x8a\x3f\x70\x94\x9e\x13\xc3\x41\x25\x43\x77\xff\x41\xe5\x8c\x18\xb0\xb6\xe2\xeb\xab\xab\xfe\x4f\xb6\x76\x3b\xb2\x30\x18\xb5\xc8\xe6\xb7\x74\x1a\xe7\x09\xb6\xbe\xac\x76\xa0\xdd\x07\xe6\xec\xa3\x18\x8d\x45\x14\x59\x35\x5b\xe8\x8b\x3f\x83\xb7\x8b\xc6\x8a\x58\xfb\xae\x4a\xfd\x70\x96\x13\xcd\xd7\xb2\x2d\x0e\x58\x91\xea\xa6\xd2\xad\x38\x97\xca\xdf\x43\x9a\xc4\x51\xea\xd3\xe4\x53\x55\x36\x15\xb2\x6d\x86\xc8\xed\xc9\xb5\x26\x54\x78\x0d\xa7\xc5\xa9\xd8\xe8\x51\x89\x88\x26\x2a\x8d\x7b\x99\xd9\x7b\x78\x7d\xac\xe6\x8b\x54\x34\x8d\xc0\x71\xa4\x9c\x0c\x6d\xb3\xab\x2c\x9c\x29\x94\x6a\xff\x31\x29\x6b\xd3\x34\x49\xac\x1d\x93\x86\x43\xf1\x13\xea\x47\x31\xd9\xab\xb9\x1f\x98\x29\x19\xda\x73\xe7\x53\x88\x5d\x68\x2a\x99\xd7\x47\x7e\xfc\xb6\x9e\x6f\x9f\xd1\xd4\xa4\x19\x84\x48\x0a\x6a\x17\x62\xbb\xa3\x99\x60\xc8\xc8\xbf\x2e\x4a\x0d\xf5\x97\xf7\x53\x58\x97\x69\x06\x52\xf7\x8c\xee\xf5\x1b\x16\xfa\xf5\x14\x1d\xd8\xcf\x50\x9a\x19\x02\x51\xef\xc9\x73\x05\xa7\x43\xf5\x7e\xa9\x87\xc5\x28\x8d\x22\xe4\xa8\x22\x92\xe7\xaa\xf8\xe9\x97\x37\x4a\xa3\x1c\xeb\x88\x8f\x35\x9c\x44\x0d\x23\x39\x70\x46\x59\x4a\x91\xab\x7e\x14\x6f\x1e\x16\xd9\xd3\xec\x19\x65\x24\xc7\x55\xe8\xeb\xe9\xb9\x16\x1a\x1e\xcf\xf5\xf3\xc5\x8c\x63\x3a\xc6\x2f\x78\x45\x4e\xf7\x74\x4f\xa7\x3c\xca\x64\x10\x02\x73\xbf\xf4\x1b\xd4\x85\x09\x26\x9a\x8c\x72\xe0\x78\xc7\x4e\xe2\x7d\x61\x4c\x71\x28\xb0\xca\x32\x47\x9f\x64\x34\x27\x29\xd6\xb0\x71\xbf\xac\x0e\x5b\x8f\xae\x98\x7c\x6d\x2e\x00\x4f\x69\xe7\xd9\xa2\x2c\x8e\xa0\xba\x67\xf4\x99\x08\xc9\xf8\x0c\x22\xb6\xd6\xd3\x7f\xf9\x34\xf9\xb6\x6a\xba\xb8\xb8\x6f\xce\x53\x91\xe6\x08\x11\xfb\xf2\xf0\x75\xbb\x5e\x5f\xdd\xac\x3f\xd1\x37\x64\x54\xd0\xcc\x4b\x4d\xdc\x89\x62\x5e\xe1\x95\x51\x01\x29\x52\xd3\xad\x21\x8f\xeb\xe2\xbb\x63\x92\x18\xa4\xd1\x5f\x07\xc5\x11\x77\x40\x65\x9c\x05\x49\xc7\x0f\x4e\xac\x48\x82\x40\x79\x09\x5e\x05\x8c\x51\xa5\x24\x02\xd9\x5b\x68\xda\x5b\xd0\xcf\x50\xff\x1b\xea\x0a\x75\xa9\x5b\xa8\xc3\x7a\x4e\x21\xe6\xc2\x15\xb6\x9d\x28\x65\x5f\x04\x0b\x6a\x51\x8c\x1a\x6d\x7c\x87\xfe\xb6\x52\x3f\x9c\xa1\x46\xd3\x8a\xe3\xc9\xf3\xd8\x18\x35\x46\xa0\x26\xc4\x7e\xbf\x2f\x7c\x41\xc7\x1e\x62\x91\xb0\x01\x99\xd0\xff\x39\x37\xbe\x14\xfa\x69\xd6\xc6\xe2\x94\x88\x81\xf4\xb3\xcb\xa3\x17\xd6\x3f\xd2\x4f\x30\x16\x13\x83\x71\xe0\xd2\x33\xf1\x7e\x1d\x07\x0d\xbe\x82\x6a\xa4\x0b\xbd\x88\xc6\xeb\x04\x8c\xe7\x24\x8b\xb9\xc0\x7e\xd8\x52\x94\x3f\xb0\x4a\xbc\xf7\xbc\x8e\xab\xaa\x14\x16\xbd\xe4\x86\xa6\x11\x20\xda\x71\x79\xae\xcb\x45\x30\x00\xf0\x07\xb3\x08\xf5\xd0\x83\x6f\x73\xa9\xad\x35\xf9\x07\x75\xe5\xf9\xeb\x4d\x85\x40\xb0\xb3\x73\x48\xe8\xe2\x63\xa8\x9b\x19\xfb\x23\xc6\x52\xa0\x8e\xe0\xa8\x1f\xa1\x76\xcc\xaa\x8b\x6d\xda\x2f\xaf\x2c\x63\x0c\xd5\xb1\xbb\xd8\x48\x3c\x0f\xc5\x31\x19\x86\xff\x51\xf0\x0e\x3d\x41\xed\xd9\xf5\x8c\xd1\x04\xac\xf4\x4d\x01\xaf\x77\xe7\x43\x1b\xfe\x0e\x99\x71\x52\xca\xa1\xb8\x3d\xbb\xa7\x30\x46\x6c\xc5\x6d\x18\x4a\x56\xe7\x60\x20\xfa\x81\xd8\x11\x63\x8c\x46\x49\xf0\xb0\x72\x15\xfc\xa1\xb5\xea\xf8\x15\x61\x8c\x59\xb6\x85\xff\x1a\x6c\xf0\xaa\x1f\xbb\xea\x82\xa8\xd4\x0d\xa5\x89\x35\x40\x75\x4e\x15\xd3\x49\xc1\x8c\xc0\xe0\xc2\xc2\x03\x7e\x5f\xf9\x5f\xcd\xb3\x84\x88\xfe\x46\xa1\xac\xd8\xf2\x7d\xc6\xf2\x88\x31\x4e\x75\xe4\xb7\xc0\xc5\x60\x8b\x61\xb9\x30\x40\x3f\x02\x7a\x8f\x6f\x41\xae\x23\x43\x82\xb6\xd6\xe2\x34\x03\xa6\x60\x22\x22\xae\xb3\x73\x38\x6c\x6d\x4c\x1a\xba\x1e\x9e\x65\x3d\x7f\x76\xc1\x01\x7b\xde\x42\x8a\x52\x57\x25\xe8\x8d\xaa\x82\x4b\xb4\x1b\x23\xe3\x08\x79\x3e\x7b\xdc\x02\xec\x32\x33\x0a\x0a\x98\x8c\x13\xb4\xc0\x13\x5a\x6f\xcf\xa7\x41\xb3\x61\x7c\x99\x4a\x67\x28\x89\x76\x82\xf6\xcb\x69\xf7\x52\x43\xf3\x12\x6c\xff\x18\xd3\x89\xd5\xa6\x2c\x54\xe5\x3f\xdf\x04\xd6\xe4\x78\x77\x60\x3a\x35\x28\x1a\xbd\x2e\x9f\x6b\x38\x8a\x70\x0a\xa1\x71\x89\xec\x22\x4f\xf7\x2b\xb0\xa8\xdc\x14\xcf\x93\x4b\x81\x2c\x95\x59\x4f\x9c\x5d\x8a\xc3\xa1\x0a\xf3\x1a\x68\x8a\x6d\x30\x28\xf5\x00\x33\xc5\x4c\x1c\x45\x76\xa9\xfa\x39\xb0\x89\x9b\x7f\x87\x4d\x92\x64\x62\x24\xf4\x31\x6f\xde\x68\x87\xf3\x28\x96\xc8\x8e\x28\xe1\xad\x45\x5e\xde\xcd\xc3\x6e\xf5\x45\x04\x74\xd2\x6f\x7e\x9c\x93\xd2\xfb\x4f\x55\x94\x37\x43\xa3\xbc\xf1\xd7\xf3\x88\xca\xd8\xd2\x8e\x6a\xed\x44\xf9\xec\x46\xdb\x0c\x28\xce\x8c\x47\x22\xce\x7b\x09\x6d\x3b\xf0\x83\x33\xc6\xca\x3a\x10\x06\xfe\xd2\x27\x65\xe7\x3e\xfe\xe1\xb1\xc9\x70\xed\x85\x63\xd1\xf6\x22\xba\x8c\x27\x89\x95\xb5\xec\x96\x14\x61\x81\x03\x87\xe2\xb2\xc4\xe7\x47\xb3\x28\x77\x0b\xcd\xef\x75\xf3\xb5\xb9\xa4\xe0\x30\x9e\x18\xe5\xd8\xa3\x98\x52\x61\x27\xd1\x97\x60\x79\xaa\x12\x0f\xfa\x5d\x9c\x75\x61\x51\x0f\x93\x13\xa4\xda\x5a\x54\x75\x81\xf2\x7b\xf3\x64\xc5\xb5\x3e\xdf\xbd\x78\x26\x22\x36\xb2\x25\x00\x3d\xb2\xe4\x70\xc3\x48\x14\x61\x3f\x48\xe0\x5f\x51\xe4\xdc\x1f\x21\x06\x57\x64\x5b\x58\x3d\x08\x55\x94\xcf\x8f\x81\xdc\xd2\x7f\x11\xe1\x26\x02\x2f\xb5\xd9\xcd\x55\xdb\xcc\x3c\xcf\xc1\x6f\x38\x51\xc2\x3a\x66\xd8\x57\x00\xc5\x23\xa6\xe7\x53\x12\x8b\x93\x57\x28\x9d\xbe\x2c\x6a\xcf\xfa\x60\x9c\x9a\x28\x0e\x06\x41\xd5\x8f\xaf\xa7\x8b\xe6\x08\xa7\x86\x25\x0e\x1e\x0f\xf5\xb8\x9e\xc5\x59\x14\xd1\xd0\x65\x6e\x8a\xe7\x12\xea\x2e\x4d\x0a\xfa\x4a\x8c\x33\xa9\x12\x0b\x6a\xae\xba\xec\xb2\x9e\x44\x88\x9c\xa7\x56\x30\xeb\xae\x98\x56\xfd\x38\x27\x56\xf5\xc4\x41\x6f\xba\xfd\xa3\x1c\x10\xe2\xfe\x16\xc6\xc9\x9f\x2a\x27\x48\x9c\xb9\x91\x00\xff\x1b\x9d\x9c\x71\x6e\x68\xee\x38\xcd\xab\xa2\x7d\x7f\x2c\x46\x11\xec\x78\x6c\x9e\x49\xbc\x9d\xdd\x4a\x70\x27\xea\x6e\x35\xf0\x37\x22\x37\xca\xd6\x65\xcf\xa8\x6d\x36\x50\x01\x70\x03\x84\x20\xb8\x3a\xb7\x08\x09\xb0\xae\x27\x7d\xf2\x74\x1e\x23\x5e\xb8\x4c\x32\x64\xff\x36\x2f\xd5\xf9\xa0\x97\xb0\xeb\x22\x82\x72\x10\x46\x71\x49\xac\x1a\x98\x7d\xdf\x6f\x0b\x59\x8b\x5e\xa2\x65\x74\xd5\x52\x27\xf8\x8c\xaa\x73\x7b\x3a\xb7\x93\xcc\x9a\xab\x28\x23\xae\xe6\xff\xcf\x4a\xae\xaa\xe3\xe9\x00\xad\xc7\xc1\xf9\x31\xa9\xc1\xce\xc4\x3e\x00\x33\xab\xcd\x6a\xf1\xd8\xed\xfc\x41\x0d\x68\x4a\x10\x19\x5f\x83\xca\xac\xa1\x88\xe3\xa8\xd8\x69\xec\x8f\xa9\x58\xc9\x01\x2f\x0e\xea\x06\x15\x08\x66\x73\x0e\xae\x0c\xe0\x99\xfa\xd5\xf8\xb1\xee\x6d\x33\x7e\xd5\x25\x19\x4f\x41\x1d\x27\xc4\x35\x7e\xae\xeb\xaa\x69\xe7\x0b\x9d\xd3\x0f\x71\x8e\x80\x0d\xa7\x7f\x09\x7a\x16\x9c\xc9\xb5\xcc\x91\x82\x71\x07\xa7\xea\x7c\x0a\xd3\x40\x1b\x89\xc6\x4d\xfe\x4e\x5e\x86\x41\x16\xa0\xd0\x2f\xbb\x10\xe5\xf8\x12\x42\xa9\x1f\xcf\xf2\x50\xa8\x8d\x17\x48\x64\xdc\x70\x0b\xfe\x5a\x55\xe5\x4f\x6b\x65\xba\x90\x55\xdd\x5e\xd8\x5d\xfa\xe1\x79\xca\x7a\x8f\xb9\x47\x51\x8b\x23\xb4\x83\x97\xf6\xef\xf5\x5c\xb9\xd1\x39\xbe\x6e\x8d\x38\xc0\x4a\x38\xc9\x47\x96\x47\x39\x11\xdd\x9c\xfd\xf6\xf5\x76\xb5\xb8\xdf\x3f\x3e\x5c\x85\x23\xc0\x79\xe4\x41\xb5\x95\xfa\x21\x4e\xd6\x78\x7b\xfc\x68\xf3\x38\x12\xcc\x95\x37\xe2\x68\x14\x8d\xe7\x31\x4b\x10\x5a\x73\xaa\xab\xca\x6c\xbd\xa4\x3d\xcb\x13\x16\x7b\x01\x9b\x90\x0f\x4c\xde\xf9\xf1\x77\xa4\x11\xcd\xb2\x31\x0f\x67\xa1\xc5\xa9\xed\xeb\xe8\x7e\x60\x62\xeb\x69\xff\x39\x6b\xf7\xa6\x72\x7f\x24\x17\x58\x36\x59\x7e\xfd\x73\xfd\xb4\xdf\xee\xd6\x8f\xfb\x74\x96\x1e\xc5\x72\xc2\xac\xc5\xce\xcf\x2e\xc9\x7e\xff\x45\xc8\x9b\x53\x95\xa2\x33\xf8\x6d\x25\x06\x35\xde\x9c\x9a\x1c\x99\x0e\xd7\x9b\xa7\xed\x6e\x7f\xb5\xf8\x73\xbf\xbe\x0f\xb7\x96\xa5\x0a\x29\x27\xe7\x06\xea\x01\xe1\x88\xe5\x8c\x58\xf9\x7c\xdd\x65\x3d\x70\x55\x8a\x11\xdf\x6b\xee\x41\xfb\xdf\xc7\x84\x96\x56\x8a\x59\xe8\x75\xf9\x5c\x94\x00\xf5\xc3\x61\x20\x14\xcc\x72\x4e\x09\xb6\xf5\x6e\xaa\xea\xf9\x00\x48\xd8\x9a\x0b\x4c\xff\xf6\xbf\xf3\xf7\x83\x6b\x06\x26\xc0\xae\x1e\xd1\xd1\xc0\xb2\xfc\x2e\x40\x94\x79\x9e\x1a\x6f\xb5\xf6\x28\x4e\xd3\x2a\x6f\x9e\x0b\xab\x9d\xdc\x3a\xb1\xe7\xfb\xdd\xd3\x9f\x9f\x07\xeb\x79\x6e\x62\x99\x0c\x14\x4c\xff\xbd\xfb\xdd\x2e\x5b\xf3\xf9\xea\x67\x55\x8c\xc9\x5f\xe7\x5e\xaa\x5c\xc4\x79\xda\x3b\xa4\x5e\x18\x1f\x4f\x47\x0b\x89\x68\x0c\xec\xff\x77\x51\x75\xdd\x43\x53\x72\x99\x52\x62\x4b\x62\xa7\x0a\x5b\xbc\xa6\x68\x7f\x1b\xc4\x73\x93\xdb\xac\x22\x0b\x0f\xc4\x02\xf3\xfe\xfb\x66\xf7\xe5\xea\x69\xf1\x7d\x71\xbb\xdf\xee\x16\x4f\xdd\x84\xdb\x79\x58\x77\xae\xd2\x8c\x58\x5c\xd2\x7f\xaa\xe9\x2d\x56\xb9\xc1\x46\x90\x28\xea\xab\xba\x3a\x6d\x07\x9d\xbb\x89\xef\x1e\xcb\x95\x10\xa8\x63\xf7\x5c\x8b\xb2\xf5\x32\xdd\xe3\xd5\xd7\x8f\x84\x34\xb1\xd5\xf5\xee\xad\xf8\xa3\x1c\x10\x60\xe6\x57\xa7\x5c\x19\x46\xc1\x03\x55\xaa\x49\x96\x9d\xeb\x24\x41\x80\x8a\xa9\x01\xbd\x75\xbe\x9e\x06\xf5\xfa\xf1\x89\x74\x62\x31\xd3\x9b\xc6\xc3\x7f\x03\xf0\x72\xf2\xd3\x35\xb3\xba\x01\xaf\x56\xd9\x2c\x48\x5b\xb2\x1c\x22\xc0\x58\x0f\x09\x81\xcb\x73\x71\xd0\x83\x4d\xff\xf2\x3f\xce\x56\x0f\xdc\x7f\x58\x18\x6f\x0f\x8d\x49\xef\xcc\xe6\x9e\x03\x50\x2c\xab\x0b\xad\x83\x03\x40\xd9\x7e\x8c\xa5\x15\xb1\x12\xc8\xa8\x85\x52\x0f\x9b\xab\xc3\x78\x4a\x24\x42\x28\x3b\xf5\x51\xae\x6e\xf9\x1e\xe4\x49\x99\x48\x54\x86\x8d\xcb\x2b\x51\x8a\x76\x50\x63\x17\x69\xc4\x51\x2d\x64\x55\x95\x96\x66\xb5\x7c\xf7\x46\x26\xb3\x0f\x4a\x64\x29\x18\xdc\xd8\xde\xd0\x73\xc2\xfd\x95\x32\x23\x1d\x94\x6e\x7f\x9a\xca\x9c\x33\x41\x21\xf3\xb0\xc6\xab\x4a\x4d\x72\x49\xc1\x92\x98\xdb\x8a\x7b\x8d\x5a\x7c\x4b\x3b\x53\x86\xc1\x8c\x60\x19\x25\xa6\xd7\x7c\x83\x52\x8b\xb2\x6d\x1e\xcc\xee\x65\x2a\x08\xc1\x04\x63\x19\x76\x5d\xf7\x45\xf3\x50\x2e\xe6\x40\xd1\x82\x27\x81\xf6\x65\x25\xc1\xd6\x4e\xdd\x76\x3c\xf1\x04\x67\x1c\x79\xf9\xab\xdb\xc7\x61\xad\x46\x70\x61\x90\x6d\x0f\x6f\xa7\xa2\x1e\x01\xa4\x04\xd7\x26\xb3\xdc\x82\xd3\x26\x44\x3b\x3e\x00\x14\x79\x06\x98\x8e\x9d\xaa\x57\xa8\xaf\x44\xaf\x18\x8d\xe7\x98\x32\x52\x44\x4e\x18\x66\xb1\x76\x7d\xb9\x05\xa1\xa1\xf6\x1d\xc0\xe1\x8c\x12\x39\x01\x9e\x86\x22\xc5\xd7\x52\x59\x3e\x2a\xb6\xef\xa7\xf7\x3b\xcf\x53\x20\x03\x73\x35\x47\x87\x2e\xa0\xc1\xa5\x72\x5a\x44\x11\xb9\x66\x58\x21\x7c\x11\xcd\xca\x12\xef\x40\x2f\x4e\xa7\x43\xa1\x86\x86\xba\xe3\xcf\x48\x91\xa6\xda\xfb\x0d\xbc\x4d\xb2\x08\xa1\x62\x02\x49\x4f\x01\x1d\xf2\x46\x84\xe2\x56\xd1\xf6\x19\xda\x7f\x9d\x0b\xf5\x63\x79\x7e\xc7\x5f\x61\xcb\x92\xa3\x54\x47\xe8\xd4\x5a\xd9\x1c\x44\xd3\xf6\xd2\x7e\x36\x1e\xd5\xa1\x72\x1a\x46\xe7\x60\x43\x56\x61\x60\x3b\xac\xfb\x8c\x2f\x0e\x12\x66\x73\x8b\x2e\x11\xd8\x5f\x05\xe9\x68\x26\x20\xb5\xa2\x30\x0d\xb4\xf7\x55\x7b\x57\xd5\xb0\x7b\x11\xd3\xa9\x05\x86\x21\x7a\x65\x79\x73\x33\x9a\x32\x5d\x08\xe9\xd6\x05\x74\xc9\xb2\x4a\xe3\xda\x39\x66\x8d\xee\x9e\x8c\x33\xe6\xba\xde\xf2\xfc\xfc\x4d\x1c\x9c\xdc\x18\x43\x8b\x6c\x17\x39\x39\x6e\x4a\x8f\x31\xfd\x7c\x67\x94\xb1\xb4\x1e\xd7\x5e\xe9\xfc\x51\x14\xb5\x05\xf6\x76\x4b\xd0\xdf\x43\xc6\xc8\x84\x5a\x2d\x29\xa1\xad\x67\x4d\x32\xb9\xf0\x84\x26\x31\x0b\x9b\xbf\x5b\x79\xad\x59\xc8\x45\xda\xe4\x3f\xc2\x18\xae\xed\x4b\xd1\x14\xea\x09\x9e\xcf\x87\xa1\x67\xed\x07\xd7\x91\x32\xab\x4a\xe2\x24\x4b\x9e\x50\x87\xca\xdf\xa4\x34\x0f\x3e\x50\xb8\x23\xfb\xf8\xe9\xf6\x02\xfc\x2d\x09\x0b\x65\xf9\x9b\x33\x34\xed\x7d\x4f\xe7\x91\xc4\x28\xd2\xa3\x6d\xbc\x68\x69\x73\x1d\x20\xbc\x92\x12\x86\xac\xc1\x6e\xfa\xe1\x1c\xde\xff\x8c\x59\x38\x28\x19\xb5\xcb\x31\x42\x9b\xaf\xcf\x87\x43\x97\x4f\xf7\x31\xc2\xe8\x07\x51\x43\xd1\xaa\x15\x7d\x98\xa1\x69\xbf\x88\xba\x84\xa6\x59\x9c\x43\x59\x40\x72\x2a\xb3\xc0\xb3\x13\xb8\xaa\x35\x0f\xe5\x7d\xf5\xfa\x6d\x62\xd9\xc6\x24\xe7\x4a\x0e\x75\xdc\x1f\x9c\x0b\xc3\x47\x22\xc3\x93\xbb\xcb\xc1\xe0\x54\xf9\x59\xb5\xd0\x6c\xcf\xa7\xc1\x4a\x2f\xf3\x3c\xa5\x3e\x93\x5b\xbf\x15\xed\x38\x00\x97\xb9\x50\xa8\x64\xd8\x6d\x21\xbb\xfa\xdc\xb4\xd3\x52\xbf\x14\x49\x6c\x1f\x5d\x55\x94\xdd\x04\x1e\xc1\x10\xbb\xa3\xd8\x32\x3e\x89\xf7\x78\xfa\x41\x91\x62\x5b\x74\xf1\xf4\x47\x0f\xf9\x77\xc7\xa4\xb4\x39\xd2\xb2\x3a\xa3\xd9\xfb\x67\x19\xe1\x07\x53\x4a\x51\x83\xda\x21\xaf\x53\x41\xa9\x51\xed\x62\x9a\x2c\x48\xc5\x39\x96\x7a\x9a\x97\xea\x75\xd7\xad\x74\xfe\xef\x26\xc2\x26\xcd\xea\xfa\x8f\xe1\x32\x20\x21\x4a\x3c\x6b\xfc\xd1\xf6\xda\xa7\x49\x8c\x04\x0a\x26\x40\xe7\x4f\x2b\x0b\x5d\xda\x5a\xe0\x5f\x8f\xb0\xef\x96\x13\x6c\x84\xd8\x25\x1f\xe9\x0d\x9f\x17\xcb\x24\x28\x4a\x1d\x6b\x61\xaa\x63\xc7\x24\x40\x66\xa1\x08\x55\x2b\x0e\x77\x2e\x37\xb0\x90\xda\xc1\xf6\x26\x0d\xe1\x58\x00\x3d\x97\x8e\x79\x02\xfa\x5f\x67\xe8\xf6\xc0\x66\x7a\x46\x93\x5b\xe7\x20\xab\xb9\xb0\x5d\x2d\x6e\xd7\xe1\x2c\x42\x38\x27\x8c\x65\x9a\x5c\x72\x20\xfb\x8d\x5f\x1a\x05\xa9\xd5\x10\x0b\xb9\x95\x8a\x52\x86\x55\x99\xfb\xe2\x34\xbc\xb7\x2a\xc9\x22\x4e\x7b\x51\x2f\x3d\x12\xf0\x66\x2a\xc9\xad\x3a\x0a\xec\x3e\x5f\x5d\x54\x02\xb1\x87\xb6\xa1\x09\x40\x63\x25\x34\xfd\x79\xd2\xcc\xbb\x24\x60\xa1\x13\x4b\x99\x71\x38\xc8\x09\xa2\xc9\x9e\xee\x96\xa3\x6b\x4b\x75\x8e\x6d\x71\xe9\x3d\xb4\x10\x0d\x11\x36\xea\xbb\xe2\xe0\x77\x40\x95\xa5\x11\x32\x89\x9e\x2a\x59\x94\x23\x0c\xc7\x4c\x2c\xd9\x05\x76\x23\x99\xbb\xeb\xaa\xb6\x16\x2d\x9f\x6e\x07\x2a\x83\x1c\x1b\x97\xbb\xea\xf9\xf9\xe0\x5c\xc0\x2f\xdd\xca\x99\x22\x69\x2a\xba\x3d\xef\x6e\xb7\x1d\xc4\x8d\x8a\xe4\x39\xe2\xb8\x90\x94\x64\x44\xd3\xb6\xc3\x1f\x4b\x65\x82\x7d\xa9\xbd\xd0\x98\x81\x6e\xdb\x1a\xc4\x71\x9a\x83\x8d\x66\xbd\x62\xc2\x8a\xa3\x04\xe7\xaa\xf6\xfd\xd1\xd5\x27\xc7\x0b\x81\x62\x52\x20\xf2\xf7\xb6\x7a\x0e\x98\xaf\x0b\xbd\xf1\x71\x19\x5c\x71\x20\x38\xf5\xaf\x51\xe4\xe9\xe3\x48\x5b\x71\x23\x31\x03\xff\x02\x87\x13\xd4\x5b\x10\x75\x40\x72\xa8\x5c\x69\x64\x0f\xab\xde\x10\x72\x7c\xb3\x44\x9c\xa1\x56\x73\x89\x62\x18\x0f\xc6\xa7\x20\x3e\x82\x50\x22\x95\x28\x9e\x73\xc2\xc5\xb8\xbf\x3c\x41\x73\x5c\xfe\xb7\x6d\x2d\x5a\x78\x7e\x1f\xc7\x39\xaa\xcb\xed\x7b\x3f\xd7\x55\xfd\x7e\x6a\xab\xc5\x4f\xd1\x8a\x0b\x39\xfb\x8f\x92\x74\x7f\x22\x93\x63\xff\x5b\xd8\xec\x0d\xd5\x35\x6e\x2b\xf5\xa3\x97\xbe\x63\x4a\xa6\x29\xe6\x0a\x4f\x38\xbd\x03\x63\x2d\x1c\xce\xb2\xd8\xb3\x5f\x7c\x77\xc4\x19\x76\x0e\x7e\x90\x04\x8e\xf8\xa5\x1a\x5d\x57\xba\x9c\x6d\xa6\x6d\xa6\x94\x73\x8d\x5d\xde\x2f\xef\xb7\xce\x50\xcf\x37\x3d\x95\xa2\x11\x42\x27\x44\x51\x8f\x8a\xf9\x4a\x09\x6d\xfb\x82\xeb\xc5\xdd\x1e\xe9\xad\x16\x65\xe5\x8f\xeb\xcc\x16\xfb\x3d\x76\xea\x6a\x60\x59\x3c\xe0\xdd\x29\x4d\xac\x9c\x03\xa6\x79\x16\xb7\xf8\xc9\xc4\xd0\x00\x96\x97\x53\xf9\x42\x9e\x02\x42\x30\x7a\x40\x59\x4b\x04\x2a\x17\x7f\x01\x1a\xd8\x7f\x04\x7e\x76\x1f\x34\x22\x8e\xbb\xe7\xf9\x7d\x7d\x7b\xbd\x78\x5a\xef\xbf\x2c\xee\xaf\x1e\xbe\xee\xfc\x79\x8d\xa1\x26\x19\x28\x8b\x7c\xa4\x41\x30\x3e\xab\x8e\x5c\x4f\x6e\x88\xf7\x19\x40\x55\x74\xa4\x05\x96\xa7\xef\xab\xfa\xe8\xfa\x93\x9f\x88\xaa\xba\xc2\x92\x8e\x89\xc1\x84\x6f\xdb\x42\x5d\x1c\x8a\xf3\x71\x38\x1b\x74\xac\x32\x5c\x8a\x37\xab\x07\xb7\x43\x55\xc7\xaa\x3f\x68\x65\x42\x4b\xc4\x6f\xfb\xd9\xac\x93\x08\x1c\x75\x11\xb6\x01\xbe\xed\x0f\xa6\x31\x45\x6d\x80\xb6\x0b\x1e\xae\x40\x5c\xf4\x74\x75\x2a\xad\x54\x48\x33\xf1\xe7\xff\xb0\x2e\xaf\x53\x9d\x63\xe4\xb4\xda\x3c\xad\xbe\xde\x2e\x76\x9b\xfb\x9b\xfd\x72\x11\x78\xef\x3a\xd3\x32\x1d\x76\xad\x9f\xa0\x29\xf4\x59\x1c\xb6\x0a\x91\x4d\x1f\xf4\xf8\x34\x49\x08\x52\xdc\x4e\x43\x39\xb4\x21\x00\xfb\x82\xca\xaf\x49\x66\x1b\xf6\x0f\xf5\xe9\x05\xce\xcd\x43\xfd\x2c\xca\x42\x35\xbb\x97\x2e\x50\xf6\xda\x67\x4c\x13\xc9\x13\x67\x91\xbf\x38\x1c\x9c\xcc\x7b\x33\x5f\xae\xd4\x04\xa4\x71\x2c\xa5\xab\xba\x2a\xfb\xfb\x4c\x05\x41\xcc\x86\xae\x8b\xd3\xc7\x9e\x08\x4c\xb3\xd8\xee\x67\x8e\xb0\xd9\xbd\x0d\xc8\x0e\x40\x60\xf0\x14\x23\xaa\x19\x15\x90\x0f\x36\xc7\xee\x19\x6d\x4f\x10\x52\x5c\xcd\x38\x24\xd8\x54\xa9\xca\x33\xda\x5e\x6e\x4a\xd7\x58\x89\xc3\x10\xc3\x91\xdb\xb3\xb8\xff\xf2\x75\xb3\x5f\xdc\xdf\x7f\xdd\xec\xfe\xdc\x5f\x2d\x1e\xf6\xa9\x4f\x75\x34\xa7\x0c\x8b\x65\xc6\xbd\x57\x4f\x80\x5b\xe5\xe4\x6a\xf2\xcc\xfa\x3e\x2b\x51\x76\x29\xdd\x77\x90\x37\x85\xf1\x2b\x85\x16\xb1\x95\xf5\x58\x68\xe4\xf5\x7d\xda\x31\xd6\x82\x72\xbc\x8f\x4d\xeb\x0d\x91\x98\x96\x29\x83\x31\xb0\x72\x3e\xdf\xd5\x32\x4b\x10\x27\x21\x7b\xd5\xd7\xc0\xa6\xf2\x01\xa5\x1f\xca\x0c\x78\x0b\x8a\x87\x72\x4e\xd7\x98\xff\xaa\xd4\x3a\xde\x3a\xb5\xd4\x24\x71\x8f\xe4\x16\x44\xd3\xae\xdf\x4e\x50\x36\xc5\x4f\xb7\x53\xdc\x88\x63\x00\xd0\x69\x45\xa5\xb7\x0c\xc4\xe7\x8b\xfd\x04\xd7\x94\xfe\xbb\x95\xdf\x70\x2a\xab\xd4\xf4\xff\x69\xfb\x93\xe6\xc6\x71\x6c\x7f\x18\xfe\x3a\xb5\xe8\x05\x67\x00\x4b\x59\x96\x33\x5d\x65\x5b\x6e\x4b\x99\x59\xdd\xff\xb8\xa1\x38\x00\x0e\x6c\x5e\x4b\xa4\x9a\xa4\xec\x74\x7f\xfa\x37\x78\x30\x70\x90\x9c\x55\x37\xe2\x7d\x36\x95\xdd\x26\x44\x89\x24\x08\x9c\xe1\x37\xd8\x00\x34\x28\x27\xfd\x32\xb7\xd0\xca\x20\xe1\x06\xaf\xbf\x3d\xdd\x2e\x1e\x6e\xfe\xf4\xbf\x4b\xf3\x84\xc5\x83\x7b\x26\xc9\xdd\x9d\xbd\xfa\x9a\x23\x95\x5b\x0f\xd8\x8c\x48\xc8\xb3\x2f\x0c\xaf\xbd\x86\x82\xe8\xab\x6f\x25\xbe\xb3\x28\x7c\x91\x2e\xac\x25\xd7\x6b\x59\x5d\x05\x21\x33\xa6\xb1\x60\xda\xfa\x3f\xbe\xe2\xf7\xb2\x2d\x7d\xc1\xd0\x3b\x77\x33\x8d\x1c\x69\x7d\xf5\x0f\xd6\x01\xe8\xf6\xe7\x80\xb1\x79\x92\xab\xd1\x70\x0a\x0c\x3a\x84\x43\xeb\x54\xde\xc7\x85\x7f\x8d\x46\x11\x56\xf3\x58\xfe\xf7\xbf\x30\x96\x66\x64\xda\xc4\x5c\xa7\x2e\x35\x8c\xbe\xd7\x01\x93\xad\x8d\x6b\xf0\x59\x56\x20\xa9\xfd\xe8\x9b\xba\xb9\xb2\xef\x9d\x45\x2e\x0d\x67\x71\x9a\x7b\x8b\xbb\xbb\xf5\x72\xb7\xb8\xfe\x7e\xbb\x59\x3f\x6d\x76\x57\xeb\x6f\x0f\xdb\x5b\x6f\x6e\xc7\x30\x8a\x24\x45\x61\xaf\x65\xdb\x5e\x6d\x97\x4b\xd8\xef\x25\x0c\xcd\xeb\xe9\x65\x61\x94\x25\xb1\x71\x35\xeb\xb6\x45\x2b\x2b\x4d\x80\xd8\x70\x3e\xb4\xe2\x30\xe3\x56\xcf\x27\x4d\xe2\xf9\x4d\xc3\x38\xc9\xc0\xb5\x8f\xfa\xe8\xdf\xb6\x12\x7e\x9b\x8d\x11\x05\x73\xc0\x04\xef\xc4\xf6\x02\x0d\x3e\x9d\xf6\xf8\xa5\xa9\x4f\xc7\xdb\x4f\xaa\x3c\x98\x30\x91\xdb\xec\x49\x9f\x14\x3a\xdf\x9b\x59\xa5\x0c\xd3\x34\x8e\x5c\xb9\xe5\x1e\x3b\x78\x6c\xea\xff\x9d\x0b\x10\x32\x4c\xf3\x24\x2b\x06\xf8\xfb\xe1\x74\xf8\x51\xb6\x2f\x5b\xb7\x5c\xf8\x41\xa0\xa9\xce\x1a\x04\x7b\x46\x52\x62\x0c\x8b\x34\x8b\x13\x6f\x12\x49\xb4\xaf\xe9\xef\x28\xf2\x9c\xf8\x40\x0d\xb6\xd8\xf9\x40\x23\x7c\xb8\x10\x8a\xca\x9d\x36\x2c\x9d\x6b\x78\x4c\x7f\x6c\xbf\xb7\xf4\x97\xfd\xef\x6f\x7f\x8c\xf7\x71\x64\x46\x64\xde\x49\xb4\xff\x65\xd8\x7e\xbe\x9f\x22\x4f\xc0\x75\xd4\x35\xfe\x74\x78\xd5\xd8\x0f\x8c\xc7\x71\x37\x72\x81\x64\x39\xf1\xf8\xed\xea\xee\x76\x69\xf5\x36\x48\x30\xd1\x7f\x31\xd7\x09\xcf\xc6\xcc\xcb\xc7\xfa\x1d\x9b\x3d\xbe\xe1\xac\xa8\x81\xc2\xd8\xda\x52\x8b\xdd\x35\x1a\x55\x57\x44\x48\x1f\xcb\x05\x33\x84\x22\x57\x7c\x40\x15\x2d\xf6\x23\xc1\xd1\xc9\x1d\x05\x48\xf9\xd0\xb8\xd9\x20\x61\x63\xda\x5d\x5d\xed\x3f\x76\xd7\xf8\xf6\xcb\xb0\x7a\x2c\xe6\xcf\x50\x16\x31\x49\xe1\xdc\xd5\xcf\x56\x60\xe2\x91\xa4\xe2\xfc\xf5\x49\x96\x27\xe8\x75\xaa\x5a\xcf\x3d\x9a\xea\xd1\xa0\x8a\x90\x6a\x0f\x9e\xad\xaf\x5e\xdc\x64\xbe\xd8\x4d\x47\x95\x49\x8a\x91\x4e\x55\xa9\xea\xa6\xba\x6a\x10\x75\x59\x3d\x4f\x93\x06\x54\xda\xd0\x46\xfd\xe7\xe2\x5b\x3b\x79\xd6\x5a\x46\xb4\x5d\xf4\x49\x7e\xdb\x35\xe8\x66\xe4\xa7\x25\xc0\xd1\xe3\x44\xa1\x29\x32\x7d\xb8\xde\x26\x93\x73\x9a\x14\x21\xb6\xa2\x29\x0a\x1f\xf0\x67\x37\xa6\xec\xa1\xe1\x32\x25\xff\xa9\xed\x97\xf0\x27\x61\x91\xbf\x1a\x89\x48\x6b\x63\xc0\x0b\xe1\xad\xbf\xcd\x46\x1a\xeb\xd3\xba\xfa\xbe\xba\x5b\x3f\xae\x9e\x36\x37\xdf\x42\x43\xd5\x44\xac\x70\xce\xfe\x44\x98\xb3\x9c\x91\x76\x7a\x43\x4c\x24\x18\x79\x92\x52\x39\xf9\xae\xee\x3a\x1f\xa8\x9a\x38\xc9\x91\x05\x0a\x65\x37\xa1\x9a\xcd\x1a\x7f\x97\xff\xaf\x3f\x0f\x8b\x25\xf3\x50\xed\x2f\x75\x9f\xea\xeb\x71\xcd\xc6\xc4\x28\x23\x1d\xbe\xa8\x5f\x2b\xa6\xea\x5d\x96\x92\x30\x7d\xfb\x4d\x1a\x19\xc2\xe5\x11\x36\x39\x59\xff\xe1\x4f\x96\x1a\x56\x50\x57\xa5\xd6\xf7\xb5\xfe\x54\xd8\xde\x8d\xce\x32\x4b\x1e\x34\x24\xf4\xb3\x3f\xbe\x80\x53\xd8\xf0\xa7\xcb\x72\x9b\x22\xff\x71\xbb\x08\x7f\x42\x50\x38\x14\x54\x26\x69\x98\xc9\x4c\x4a\x12\x13\xd6\xfd\xff\x42\x7a\x67\x72\xce\xe9\x25\x7b\xab\x3b\x8c\x92\x7f\xe1\xd8\x61\x89\x99\x5c\x32\x42\xce\x5b\x40\xdb\x25\x6f\xcf\xe9\xd9\x8a\x8c\x51\xa3\xfd\xb9\xee\x46\x4d\xb3\xf0\x74\x99\xd0\x44\xb3\x70\x16\x33\xeb\x23\x56\x0e\x3e\x1d\x46\x00\x90\x51\x18\x58\x5e\xf1\xbc\xad\xee\x46\x71\x13\x47\x81\x69\x4b\x39\xbe\x3b\x20\x22\xa4\x9e\xd1\x9e\xec\x8d\x82\x6b\x24\x33\x22\x37\xca\x33\xc8\xec\x2f\x3b\xed\xa1\xa1\xaa\xfa\x78\xd5\xf8\x7f\xd9\xff\xcc\xae\x48\x18\xe6\xcd\x21\x08\xfd\x44\x88\xf5\x72\xce\x38\x37\x90\x45\x54\xaa\xf1\x95\x49\xd7\x0e\x99\x8d\x92\x69\x41\x05\x47\x05\x47\xcf\x48\x35\x32\x65\x94\x01\x58\x98\xef\x64\x26\xca\xac\xa0\x42\xed\x66\x39\x41\xc8\x1b\xc9\x94\x57\x60\xf9\xe3\xa4\xeb\x76\x83\x55\x67\xd3\xf7\xcb\x91\xaf\xd1\x69\x41\xfd\x1a\x07\x49\x74\x7f\xc5\xd8\xb2\x40\xbe\xde\x8d\xaa\x46\x06\x31\x81\x62\x78\x46\xae\x51\xb3\xe8\x86\xe3\x79\xe4\x38\x5b\x0f\xae\x84\xe2\x05\x40\x87\x53\x9b\x38\xb3\x0e\xf2\x7d\x18\x46\x7c\x96\x0d\x18\x9c\xc8\x39\x0c\x5b\xd7\x10\x5b\xcc\xa2\x43\x63\x0c\x90\x5a\xc7\xd1\x02\x91\xbc\x02\xc8\xe8\x26\xf1\x28\x4a\x0d\xe3\x0e\x1f\x36\x4e\x53\x79\x14\x41\x94\xdb\x8a\x4c\x1f\x61\x7b\x68\x98\x3f\x28\xb9\xf0\x00\x3e\xab\xc4\x5b\x62\xeb\x9c\xee\x27\x4f\x8d\x47\x11\x5a\x2b\x4c\xa2\xd1\x1c\x0e\x38\x03\xdc\x71\x52\x64\xd4\xde\x0c\xd8\x16\x29\x82\x06\xfa\x03\xc9\x75\x04\x4d\x11\x1e\xc5\x12\x14\x39\xf2\xc2\xfe\x75\x5b\xff\xa8\x9b\xfd\x84\x3c\xc4\xa3\x24\x4a\x8b\x78\x2a\x00\x54\xfe\x3c\x37\x36\x98\x85\x62\x3c\x4a\xd2\xdc\xc5\xaf\x6d\x47\x4e\x42\xab\x9f\xa8\x4e\xd6\x0e\x82\xb2\x40\xea\x1c\x4e\x40\x97\x3c\x4a\x44\x4c\x72\x8e\x16\x4c\x7c\x73\xf2\xf9\x2d\x8f\x52\x6e\xf1\x91\xae\x9e\x05\xcd\xb8\x18\xe1\xc6\x64\x3a\xa2\xc7\xfc\xe8\xcb\xcc\x23\xf9\xd3\x5f\x95\x6f\x79\x94\xc7\x96\xc1\xb5\xd0\xfa\x01\xdf\x27\x60\xce\xff\x53\x86\xc3\xa3\x3c\x33\xae\x14\xf6\x56\xbf\x62\x20\x74\xf3\x28\x67\x31\x3a\x87\xe7\x6e\x51\xe9\xcf\x74\x20\xdc\xe8\x22\x8f\x08\xdc\x20\xcb\xe7\xdb\x70\x8a\x42\x24\xd2\x6d\x05\xf4\x42\xd3\xc4\xbb\xad\xbe\x6d\xae\xa7\xf7\x81\xc5\x8a\xee\x22\x68\x5d\x5e\x86\xe7\xf2\x88\xc7\xa9\x15\xfd\xdc\x23\x34\x44\x60\x1a\x8b\xbd\x8e\xc6\xa5\x11\x15\x3a\xca\xd6\x31\xd1\xc6\x0a\xee\x2e\x9d\xe4\x11\x37\xa9\x63\x9f\x57\x57\xa7\x8f\xd9\x84\x15\xa9\xa1\x8e\xf8\xb1\x6e\xbb\x99\xb7\xdc\x59\xa4\xc8\x23\xc1\xd3\xb4\x18\xaa\xde\xe4\x20\x5a\xef\xb7\xf5\x16\xe1\xe0\x6f\x84\x10\xb1\xad\x44\x37\xa7\xb6\xdb\x63\xdb\xee\xe6\xce\xbe\xbf\x54\x60\xe7\x91\x30\x82\x16\x66\x6a\xa5\x4e\x6f\x1e\xe4\x56\x84\xf0\xdd\x8b\x3f\x9d\x01\xd8\x78\x24\x93\x34\x77\x28\xc7\xd5\x9f\xb3\xb7\x4f\x26\xc0\xbd\x02\x9f\x55\x8a\x5f\x8e\x67\xb8\x4c\x59\x3c\x18\xfc\x8e\x15\xac\x79\x24\xb5\xa1\xae\xb9\x24\x47\x50\x47\xd8\x6a\xa6\xda\xdd\x3c\x92\x46\xa3\xcd\xb7\x2a\x3d\x39\xb5\xe2\xc0\x6d\x9f\x85\x9a\xe3\x23\x71\xc0\x49\xf2\xcf\x23\x05\x29\xe9\x1f\x53\xdf\xc6\x76\x29\xc3\x1c\xd3\x3c\x8b\x5c\x23\xe3\x09\x2a\x5d\x3b\x75\xdb\xe9\x09\x90\x65\xc6\x76\x58\xba\xab\x8f\x5b\x3d\x3b\x6a\x12\x2b\xde\xd3\x27\xd1\xbb\x06\x41\x7f\x0c\x5b\x2a\x8f\x8c\x44\x69\x75\xeb\xbb\xd3\x99\x81\xd8\x3f\xa6\xf7\xd9\xe8\x84\x5b\x43\x3d\xd7\xe3\x75\xfa\x1e\xfa\x8f\x0f\x15\x2a\xfd\x76\x6c\x1c\x6b\x4d\xd1\xe1\xa6\xde\x43\xb3\x52\xfb\xf2\xd8\x8e\xab\xd0\x3c\x4e\x92\x84\x5e\x29\xb7\x97\xd3\x1a\xf4\x15\xda\x97\xdd\xf4\xe7\xc7\x89\x32\xd2\x8c\x3a\xa1\x9e\xd8\x30\x13\xaf\x75\xa3\x33\x6e\xac\xa3\x79\x79\xc0\x79\x87\x8c\xc7\x99\x48\x63\x70\xe2\x41\xf0\x8a\xb3\xcf\xe6\xb1\xb6\xa5\xf5\xae\xbb\x90\x30\x8f\x7a\x5a\x3c\xce\x59\x4c\x27\x7a\x39\x58\x6f\xaa\x33\x8a\x96\x1b\x57\xe4\xd6\x0d\x69\x0b\xcd\x47\x35\xb9\xfc\x82\x81\x27\x6a\xff\xde\xd6\xd5\xb6\xb6\x0f\xf6\x17\xf5\x2d\x1e\xb3\x58\xd3\xd9\xaa\xd3\xa1\xdf\x56\xfb\x54\x05\x35\xd5\x6b\x47\xfc\x2a\x1e\x33\x1e\x59\xe5\xb0\x7e\x2d\x71\x8d\xf5\xe9\x3d\x65\x68\xed\x38\x4e\x96\xd3\x78\x9f\x5f\x8c\x0c\x78\xcc\xe3\xc4\x28\xcf\x63\xb5\x8f\x7a\x76\x47\xb9\x8e\xa9\xfe\xef\x64\x53\x3e\xb3\xbf\xfb\x3b\x00\x57\x1e\x8b\x48\xd1\xc9\xbe\x6e\xfd\xa5\x88\x1c\xc9\xb3\xe9\x00\xaf\x04\xb5\x23\x39\xdb\x2c\x1c\xe5\x31\x01\xee\xdc\xd9\x07\x99\xec\x5f\xae\x36\xb1\xd4\xe8\x29\xcf\xdb\x66\xcc\x8e\x9d\xde\x24\x69\x12\xea\x93\x96\xed\x7a\x7d\xf5\xdb\x3c\x6d\xe4\xb1\x42\x8b\x81\xd5\x65\x0b\xfb\x7d\xfd\xbe\xf0\xf9\xef\x06\x9d\x29\xd4\x27\x77\x55\x27\x11\x65\x31\xc7\x3d\xa9\x39\x0e\xf6\x30\x3c\xc6\x58\xda\x32\x42\xf9\x66\x85\x3b\xc2\x81\x24\x26\xb2\x0d\x78\xf0\xc1\x23\x94\xfb\x7d\xf9\x09\xd3\x91\xc7\xc8\x2d\x85\xe0\x11\x3e\xd6\x67\xaf\x81\x61\x19\xd9\xfb\x2c\x1a\xf5\x42\x35\x46\x84\x41\xda\x92\xc7\x46\xc4\xa2\xbf\xe9\x7d\x40\x35\x9e\xb3\x49\x24\x19\x15\xde\x6c\xc3\xdf\x4b\xab\x4e\xce\x9d\xc4\x51\x46\x92\x6c\xb2\xfe\xb9\x7c\xa9\xe7\x82\x1f\x3c\x89\xf3\x44\x66\x67\x7d\xe3\xb9\x72\x2a\x4f\xe2\x42\x8d\x1a\x66\x5f\x4f\x07\xf8\x3f\x3a\xd6\xf1\x24\xe6\x4a\x38\xb9\xa4\x21\xb7\xfa\x7f\xe9\xb0\xc7\x65\xff\x33\x25\x11\xfa\xcf\x29\x6e\x49\x00\x50\xdd\xc3\xcf\x9b\xc6\x23\x3c\x79\x92\x66\x85\x16\x83\x35\xeb\x62\xbf\xb7\xea\x8b\xe3\xb2\x7e\x91\xfd\x23\x28\x81\xfe\xe3\xbc\x02\x93\xfc\x8f\x3f\x97\x4c\xb9\x1e\x6b\xaa\x2d\xde\xb0\x0f\x41\x1f\xcb\x9f\xe8\xf4\xf4\xfd\x4f\x8e\x8b\xff\xb9\xfc\xc6\x24\xa9\x4e\x49\xdb\xe0\x7b\x3d\x51\x9a\xae\xeb\xfd\xf4\x56\x64\x59\x42\x95\x71\x83\xf8\x08\x1f\xc3\x05\x65\xb9\xa1\x47\x4d\xae\xc6\xb2\xbd\x2f\xc3\xb3\xce\x13\x43\x3d\x9a\x65\xad\x49\x62\x72\x32\x11\x98\xc8\xe8\xe1\xfc\xe7\x54\x06\x5b\x93\x10\xc3\x26\x0c\x64\x96\xfa\xaa\x66\x3f\xbb\xe3\xc8\x1f\xe2\x4c\x08\xc7\x39\xd8\x96\xd8\xb4\x24\x5e\x3d\xa9\x5c\xff\xc2\x3b\xb1\xcf\xbf\xdc\x79\x44\xa4\x55\x1e\x54\x66\x36\xe7\xd3\x10\x32\xeb\xe1\xe5\xdd\x0a\xf7\xfb\x75\xa5\x70\xa0\xa2\xf1\x04\x18\x52\x9a\xb4\xf6\xda\x04\x3c\x01\xae\x68\x4d\x86\x06\x2b\x98\xed\xf3\x89\xcc\x19\x15\x63\xb6\xb7\xab\xa7\x6c\x5c\x01\xe3\x89\x64\x8a\xa4\x28\x6e\x10\xdb\x0b\x0e\x83\x3c\x91\x3a\x23\x3a\xea\xd5\xdd\xe2\xf6\xc1\xea\x1d\x4e\xee\xa7\x4a\x72\xda\xe5\xef\x87\xdf\xa2\x1d\xc2\xbe\x8f\x4f\x6f\xca\xf6\x65\xd6\xd7\x0c\xb3\x8b\x5f\xf8\xd7\xd9\x02\xf8\x18\x2e\xd1\xdc\x0a\x12\xee\xd1\x74\x59\x3c\xfb\x6d\x18\x59\x20\x64\xbf\xc4\x9e\x8e\x77\xf8\x8c\xfd\x4b\xf6\x31\x1f\x95\xf0\x38\xf3\x39\x75\x40\x52\x3d\x62\x53\xd6\x3e\x56\x49\xb0\xd0\xdc\x8a\x2b\x29\xa4\xf5\xa1\x54\x84\xf5\x75\x6a\xaf\xd3\x13\x9a\x42\x50\x86\x65\x27\x89\x7b\x4a\x16\xf8\xe7\xcf\x67\x80\x39\xb2\x60\x9f\xb7\x3d\x62\xb3\x6d\x4e\x95\x7a\xf1\x93\x37\x8d\x0a\xab\xba\xea\x23\x03\x82\x7e\x8d\xa7\x7d\x4a\xbe\xdf\xfd\x2a\xb8\xf8\xd7\xfa\xdb\x76\x77\xf3\xb4\x58\xee\xae\xd6\x7e\x77\x49\xe3\x8c\x09\xee\x66\xa3\xe5\xe4\x5d\x66\x70\xf0\x34\x36\xd2\xe3\x49\x6c\x8c\x78\x57\xb6\xdd\x18\x53\xc2\xd3\x44\x0a\x2a\x6e\xc0\x19\x84\x7c\xde\x4e\x99\xac\xd4\x69\xa2\x0c\xb9\xf7\xdd\x6c\x1f\xb6\x43\xa6\xcd\xd3\xc4\x98\xdc\x12\x59\xaa\xae\x6e\xd5\xe8\x48\x06\xd2\xe1\x53\x2b\x85\xfb\x1f\xf0\x6c\x81\x0a\xcd\x54\x95\x80\xa7\x99\x8e\x91\x05\x29\xd2\x76\x73\x3a\x5c\x7d\x50\x6f\x7b\xd6\x11\xe4\x69\x66\x90\x10\x28\x77\x65\x87\xfd\x37\xad\xab\x70\x93\x73\xe9\xbc\xe5\xfa\x27\x93\x50\x65\xd9\x3e\xf5\x24\x8c\x40\x46\x28\x3b\xdb\xb4\x7e\xda\x6c\x67\x3f\xa3\x28\x94\x18\xcc\x3c\x97\xff\x7e\x9a\x08\xfc\x4d\x7f\x48\xa1\xad\x48\x5a\xe0\x8e\xfb\x99\xf6\xc9\x78\xc6\x23\xd2\x13\xd0\xf0\x31\x33\x00\xe4\xa9\x88\x52\x8d\xde\x8b\x60\xd0\x29\xb4\xdd\xfd\xe9\x4f\x14\x18\x19\x39\x56\x79\x7a\xb2\x53\xb8\xd9\xd9\xb0\xd8\x0f\x33\x09\x49\x60\xfd\x28\x2b\x59\x5e\x96\xc4\x9b\xcc\x1a\x88\xb2\xd4\xe5\x1e\x1b\x74\x5a\x83\x16\xf6\x47\xa4\x8e\xe9\xa5\x40\x0a\x84\x2e\x6d\xb0\x0b\xb5\x8a\x6d\x3d\x15\x37\xe7\x29\xc8\x54\xa4\xbe\x35\xbb\xf5\x0b\x2c\xd5\xd1\xb7\x2f\xc3\x4e\x95\x02\x46\x04\x80\xef\x93\xbc\x1f\xa5\x37\x8c\x1f\xef\xb0\x29\x60\x6c\xbc\x5d\x88\xb5\xb9\x98\xbe\x3c\x32\xb1\x86\x68\xca\x77\x90\xfc\xdf\xc1\xc4\xde\x49\xff\x38\x94\xf1\x9c\x23\xf4\xec\xce\xaa\x22\xa5\xda\x3a\x56\x7a\x84\x11\xe6\xa9\x02\x4d\x5e\x79\x2e\xfa\x0f\xad\xc7\xcb\x8f\x59\x29\xeb\x9f\xb3\x73\x8a\xde\x17\x35\x8f\x2f\x6f\x91\xa9\x8e\x53\x35\xbb\xaf\xce\x5b\xc6\x32\x58\xfd\xba\x9a\x0c\xdb\x0d\x77\x4b\x69\xd8\xc8\xfd\xa6\x9d\xea\x0c\x08\x4b\xf5\xcf\x7a\xbc\x7e\xa7\x5a\x20\x45\x5b\x47\x7a\x33\xb2\xe0\x81\xc6\x53\x94\xd6\x47\xa5\x54\x04\xe4\xf8\x0a\x8d\x0e\xd4\x2d\x9e\xa2\xb6\xf6\x9a\xcf\xd8\xb9\xde\x5a\xf3\x7b\x2d\xdb\x9b\xba\xe9\xa3\x0e\x4a\xb8\x1b\x8b\x6e\xbf\x1c\xe6\xa5\x88\x40\xf1\xe2\xb7\xca\x58\x91\x84\xc9\xb5\x67\x51\x06\xd4\x4c\x21\x0c\x8a\x46\xa7\x4c\xcd\xb3\x48\x58\xf2\x69\x8b\xdd\x72\xc8\x3a\xdc\xc1\x18\x24\x61\x3e\x2c\x79\xea\x01\x7f\x76\xdb\x53\x73\xa6\x42\x34\x8e\xa3\x52\xbf\xf5\xc4\xac\x70\x77\x2a\x4b\xe2\x22\x1b\x14\x18\x5c\xac\xd8\xbf\x9e\xd4\xd7\xbc\x9c\x2e\x65\x49\x8c\xcc\x1a\xf9\x10\x37\xb5\xbd\xba\x48\x46\xe4\x59\x9a\x21\x85\x33\xde\xe6\xc1\x0a\x3e\xe3\x60\x23\x30\x0d\xe5\xb3\xb4\xc8\xbd\x88\xea\xb7\x16\x9b\x76\xf1\x0e\x65\x9f\xae\xdc\xd4\x8d\x7f\xd1\x8e\x71\xee\xa3\x94\x2c\x63\x40\x04\x28\x2a\x9f\x06\x4d\xd2\xd3\x65\xfe\x58\x3f\x5c\x51\x63\x76\x53\xee\xdf\xb0\x39\x53\xa9\x1e\xba\x2f\x3c\xcb\xb9\x05\xc7\x52\x1b\x70\x30\xf2\xf5\x5f\x9c\x8b\x84\x7a\xb7\xfd\x4c\x1d\xfd\x15\x13\x52\x09\xdd\x94\x55\x9f\x77\x37\x65\xf7\xb1\xc5\xd6\x8b\x1a\xf2\xac\xc8\x64\xc1\x07\x0a\xd3\xd3\xea\xe6\x82\xd0\x05\xcf\x0a\x15\xa1\xed\xf9\xbd\x39\x0a\xe5\xf4\xb9\x17\x0a\x52\x15\xcc\xd3\x5c\x7a\x3d\x67\x7c\xf1\x8c\x65\x9a\x34\x22\x89\xa0\xe7\x36\x6e\x9b\x64\xae\x7e\xce\x11\xa4\x3c\x63\x22\xa3\xf9\xbf\xd3\xf8\xd6\x87\x47\x54\xbd\xf1\xc7\x50\x10\x94\xa6\x3a\x1d\xae\xa1\x79\xad\x6a\x8d\x6d\x3f\xdd\x56\xc7\xda\x23\xf6\x78\x26\x84\x2d\x38\x5b\xf9\xba\x19\x59\x79\x94\x8e\x65\x02\x62\xf2\x79\x5a\xbd\x61\xd5\x39\xb1\x9e\x25\x4c\x0b\x7a\x53\xa7\x43\xff\x41\xa5\x84\xc3\x5e\x2c\x9a\x06\x3e\x26\xdb\x7a\x06\x59\x44\xa4\xfd\x50\x7f\xa2\x2d\x70\x13\x4c\x0b\x78\x06\xb2\x70\xea\x12\x34\x0d\xef\x6a\xf8\xbc\x11\x77\x56\x53\x98\x47\xea\x99\xcc\xe2\xc8\xd3\x2e\x08\xe5\x75\xbe\xb1\x67\x92\x87\x7e\xb5\x65\x20\xf4\x1b\x6f\xe7\x05\x2b\x2e\x1a\x1b\xf7\x1f\x32\x5c\x5f\x36\xf1\x6f\xeb\xfd\x2c\x22\xc8\xa4\xb4\x9d\x16\xfb\x86\xed\x2c\x9a\x73\x06\xff\xf4\x43\x35\x10\x1e\xe4\x8d\xec\x6e\xae\x3c\x3a\xf6\xf2\x52\x9e\x29\x65\x31\xf0\xea\x6a\x71\x16\x43\x65\x0a\x6d\xc4\x77\x84\x8f\x4f\x71\x7c\x3c\xd3\x71\x9c\x4a\xdf\xd3\x6f\x5e\xf7\xb8\x6d\x10\x89\x73\x36\x5a\xb5\xc7\x5b\x5d\xa6\x99\x75\x0b\x71\xe1\x5b\x59\x3d\x3b\x44\xd6\xec\xaa\x11\x0b\x9b\x74\x12\xaf\xb7\xfb\x81\xa5\x33\xce\x69\x67\x03\x0d\x58\x6d\xf4\x27\x30\xc6\x85\xb6\x4e\x3e\x77\x06\xee\xe2\x79\xc4\x25\xb7\x56\x8a\xed\x15\xd2\xde\xd3\xaf\xf3\xb3\x47\x9a\x47\x1a\x29\x03\xe8\x03\x8e\x7e\x89\x1a\xbb\xfa\xfc\x15\x96\xc8\x9f\x02\x33\x42\x11\x6c\x4e\x55\xf5\xe1\x17\x87\x3c\x66\x05\xbd\xae\x5d\x50\x70\x52\xaf\xa8\x2f\x82\xc9\x66\x3f\x3c\xd6\x11\xf7\x0c\xfd\x17\x28\xab\xed\xc7\x71\xba\x62\xe4\x09\xb7\x85\x02\x17\x5c\xcd\x99\x1f\x7e\x14\x80\x13\x55\x07\x03\xaf\x30\xde\x38\xf3\x34\xb3\xea\xd6\xc7\x81\x4b\xee\x96\x94\xf9\x0d\x4a\x65\x44\x51\x07\x31\x35\xec\x3d\x0a\x27\x41\xce\xf2\x20\x99\x44\x6e\xfc\xbf\xd8\x64\xf2\x14\x81\x76\xa6\xdd\x9c\xad\x76\x21\x84\xcb\x53\xc3\xa8\xba\x6b\x9a\xba\xea\x9e\x4e\x7d\xe8\x3f\x49\x7a\xf2\x2c\xe2\x0e\x42\x75\x18\x75\x24\x03\x5c\xf6\xc6\x05\x4f\xb4\x2b\x8c\xe9\x2b\xb3\x87\x97\xa5\xb1\x9f\xa1\x5f\xe0\x40\x8e\x6c\x4d\x89\x1d\x34\x1f\xe7\xa1\x62\x9e\x19\x9e\x17\x1e\x6c\x52\xef\xfb\xb9\xe2\xad\xd4\xa6\x67\xcd\x63\xc8\x53\x27\x6a\x33\xdc\xaf\x3c\xd6\xa9\x35\x8f\xdc\x77\x5e\xf1\xac\x0d\x07\xf3\x8c\x20\x49\xd7\x5f\xbf\x5d\x0d\x7f\x83\xc8\x42\x74\x54\x5d\x69\xc2\x05\x3c\x11\x2a\xf8\xb6\x0a\xca\x57\x3c\x2f\xd2\x0c\x07\x49\xf0\x3e\xb8\x3a\x85\xb3\xb2\x14\x22\x39\x50\x69\x1e\x4f\xd5\xeb\x60\x27\x30\xbd\x38\xce\xac\xc3\xc5\x6e\xa2\x10\xe8\x0e\x8a\x1c\xa9\xe2\x77\x3c\x1d\x8f\x1f\x9b\x63\xdd\x74\xe1\x2b\x04\xf2\xc0\x30\xef\x5e\xce\xd4\x4d\x78\x0e\xb1\x26\x30\x92\xb5\xc2\xb4\x4e\xa4\xc3\xde\x9b\x43\x6a\x25\x83\x77\xde\xd3\xe8\x1e\xba\xa6\xae\x36\x65\x33\x52\xd9\x9c\x4d\x25\xc8\x18\x75\x76\xca\xb6\x3d\xa1\x6d\x5e\x5c\x96\x63\x98\x56\xa9\x86\x80\x20\x97\x90\xe7\x72\x24\xef\x4e\x37\x77\x55\xe9\x50\x18\x19\xbe\x4c\x2a\xe9\x29\x98\x1b\x38\x1c\xf7\x84\xf0\xfc\xbd\xac\x9e\xe7\xb9\x75\xae\x62\x45\x3b\x7d\xe7\x25\xd5\x47\x50\x25\x9e\x2b\xb0\x15\xba\x23\xa1\xb1\x56\xd3\xc0\x3c\x57\x50\x30\x67\xb6\xb6\x70\x8c\xe2\x17\xd0\xf5\xfb\x16\x2c\xdc\x7d\x76\x07\x14\x08\x2a\x99\x1c\xe1\xe3\xa6\x84\xbf\xe8\xeb\xe5\x0a\x65\x3a\xf8\x89\x0e\x81\x70\xae\x63\xe1\x01\xac\x81\x10\x50\x37\x57\x1f\x56\xae\x72\x7a\x12\x9d\x71\x9e\x8e\xb4\x4f\xc2\x39\x44\x6a\x55\xf4\x87\x9c\xe4\x5c\x55\x94\xe7\x1a\x35\xe1\xd9\xca\xea\xbc\x19\xf7\x7f\xb2\x01\xff\x0c\xc6\xcd\x73\x2c\x72\xbf\x72\x3a\x29\xa9\x4b\x01\x59\x8e\x22\x67\x22\x74\x8e\x8f\x1d\xee\xd2\xdc\x5f\x8c\xe1\x28\x07\x63\xf8\xba\x39\x8c\xf7\x98\xf9\x3f\xfe\x33\x90\x47\x03\xd5\xf4\x1e\x9c\xa0\x2e\xa8\xee\xd6\x5a\x4b\x5e\x5e\x7a\x8c\x8e\xa9\xb4\x53\xa7\x13\xb4\x0d\xcf\x8d\x49\x45\x50\xe9\xc2\x43\x79\x3a\x2c\xa1\xe9\x27\xdd\x77\x6b\xe2\x38\x7d\x2e\x45\x14\xa7\xca\xc1\x2e\x94\x95\x80\x9b\x76\x1d\x8a\x3e\x1b\x2e\x9c\x42\x13\x55\x21\xed\xd3\xf5\x47\x41\x50\x07\x94\x30\x32\x57\xa7\xa6\x1a\x4b\x83\xfb\x41\x71\xa2\xbc\x9f\x83\x03\xfc\xe9\xd1\xfe\xcc\xfd\xa8\x2c\xb5\xf4\x41\xd2\x60\xb8\xc0\x6f\xef\x87\x14\x3a\x99\xa8\xf9\x4d\x96\xf5\x22\xe1\x89\x74\xcf\xe6\xf6\x68\xda\xaf\xd0\x7a\x0f\xbd\x5b\x7d\x69\xa3\x28\x12\xa3\xa9\xd4\x44\x45\xfd\xf1\x1e\x57\xa4\x4c\x27\x83\xf0\xee\x40\x5f\xe0\x45\xce\x73\x4a\x8e\x6f\x1a\xe8\x9f\xcf\xe2\xa4\xba\x4f\x1a\x40\xd3\x47\x56\xe4\x1a\xb4\x9b\x60\xc4\x14\x3a\xd3\x97\x18\x56\x98\xa2\x88\x23\xba\x52\x75\x6a\x9a\xc7\x52\xf5\x57\xe2\xbf\xbf\x60\xd6\x32\xf6\xe8\x9c\x8c\xef\xe1\xa7\x0a\xef\x64\x51\xa0\x51\xca\x6a\x78\xe2\xa2\x19\x71\xce\x79\xc1\x50\x99\x91\xb6\xf2\xa9\xed\x6a\x5d\x42\x38\xcc\x63\x5b\xca\xe8\xca\x03\xae\xcd\x1d\xb4\x56\x6a\xc9\x17\x75\x20\xdc\x00\x11\xdb\x90\xa5\x0f\x46\xaf\xfb\xfd\x7f\x54\xfe\x2b\x84\x4c\xbd\x75\xf6\xd5\x80\xc9\xf6\x73\xf4\xf2\x8d\x11\xda\x2e\x30\x48\xf8\xe2\x4a\x7d\x0c\xdf\x49\x32\x8b\x83\x92\x0f\x2f\x20\x96\xd4\x19\x7e\xa7\x77\x93\x60\xb7\xfd\x03\x0a\x87\x85\xa2\xac\x6b\xa1\xf5\xbd\x6d\xf2\x21\x91\x15\x26\x6b\x86\x9f\x71\xa0\x0a\x1d\x90\x8d\x4e\xe7\x7a\x16\x52\x17\xe0\xf8\x5a\xfd\x94\xb3\x6a\x4e\xdf\xda\x99\xf1\x1d\x2f\xc0\x30\x42\xa1\xf7\xc1\xc4\xf8\x05\xd8\x0e\x7e\x01\xbc\x90\xa9\xf5\xe5\x92\xd0\xe2\x62\x79\x17\xfe\x5c\x44\x5a\x8f\xa1\xee\x65\xed\x70\x69\xb3\xc9\x2f\x79\x9a\xc6\x2e\x63\x29\x1b\xd4\x36\x26\xbc\xa9\x1b\xb2\x69\x7c\x1a\x0b\x7b\xfb\x4f\x68\x43\xe0\xd7\x0a\x0e\xfd\x5c\xb8\x58\x24\x2d\x54\x82\x24\xa9\x1c\x10\x4e\xfe\xd3\x8a\x33\xda\xe4\x1e\xf0\x7d\xb9\xaf\x2b\xfc\x9c\xca\xc0\x0b\x6d\x2c\xf2\xc6\x43\xa5\x1e\xeb\xf7\x97\x41\xcb\x95\x17\x98\xa1\xd7\x4d\xf2\x0e\x4c\x13\x57\x3c\x5e\x18\x19\x1b\x57\xd5\x75\xec\xa8\xe7\x55\x15\x58\x49\xbc\x30\x3a\xf3\x36\x0d\xc1\x89\x70\x02\x0a\x60\x51\x64\x28\x5a\xb9\xaf\x2b\x20\x9f\x97\xbf\xf5\x56\xb2\x28\xe5\x44\x6f\x6d\xc9\xec\xed\xae\xfc\xcf\xa9\xd4\x7d\xd6\x34\xbc\x8c\x2c\x2a\x22\x16\x54\xfe\xe4\x99\xa4\x22\x67\xe4\xa1\xea\x2e\x8f\x80\x49\xcb\x93\x65\x7e\x8c\xad\x1c\xcf\x0a\x22\x2c\xe2\x11\x91\xf5\xb7\xd8\x1c\xda\xb5\xf9\xb6\xc1\x70\x2d\x26\x26\xd9\x24\x67\x2f\xe6\xe5\x16\x17\xfa\x82\xcd\xc8\x84\xef\xf2\xf7\x7a\xb6\x2c\xce\x24\x25\xf1\x5b\x6c\xbb\x59\xcb\x84\xc5\xa2\xe0\xd6\xf2\x71\xfd\x16\x6c\x05\x89\x8b\x7a\x41\xa9\x9e\xb3\x24\xca\x4d\x34\x32\x9c\xba\xfa\xb8\xbd\x9e\xbe\x43\x2c\x49\x90\xe0\x5c\xd8\xbd\x10\x1e\xc3\x3f\x54\x96\x28\x6e\x71\x1c\xfb\xba\xc5\x2b\xf4\x92\x39\x9c\x65\x12\xc8\xe2\xea\x48\x80\xd2\x7c\x26\x29\xc0\x59\x1e\x25\x34\xdf\x1e\xd7\x7f\x5e\xc4\xd0\xfa\x61\x09\x2f\x9c\xf7\x86\x15\x43\x99\x74\x2e\xfd\xeb\xcb\xf2\x34\xa2\x46\xcf\xfd\x62\xbb\x23\x72\xdb\xe6\xdb\xe3\xe3\xdd\xbf\x76\x77\xb7\xf7\xb7\xbe\xed\xc0\xfa\xfd\x89\x76\x3a\x5f\x66\xfe\x1c\xb7\x3b\xe4\xb0\xac\xe0\xca\xaa\x5a\x23\x01\xb1\x5a\x2b\xf2\x71\x55\x57\xfa\x22\x0c\x92\xb3\x02\x65\x14\x04\x71\xef\x7d\x65\x7b\x36\x88\x65\x59\x3c\xa4\x70\x57\x4d\xa9\x67\x06\xe9\x9c\xf1\x24\xa3\x4b\x5f\xbc\x96\xfb\xda\xbf\x87\x8c\x67\x09\xa9\xee\xbd\xd5\x1d\x5c\xae\xba\x31\xce\xad\x82\x84\xa9\x4f\x4d\xf7\xb2\x0b\x15\x14\x12\xb5\x2d\xc3\xf2\xc0\xb8\xc8\x13\xbb\x1c\xbd\xd5\xaf\xf8\x54\x5f\x76\x06\xe4\x8c\x4b\xe5\xf5\xe0\x17\x5d\x07\xea\x05\xdb\xae\x1e\x6f\xfc\x4c\x44\xb9\x12\x63\x1d\xfb\x71\x29\x89\x89\x02\x1d\x60\xb9\x4f\xc1\xaf\xb6\xdb\xcd\xe4\xcd\xfa\x25\x8d\x67\xaa\x0e\xc6\x99\x94\x05\xdd\xb7\x6f\x9b\xeb\x3f\xbf\xf8\x46\x20\x53\x51\x94\xbb\xb6\xe4\xad\xaa\xfb\x65\x95\x64\xc5\x67\x93\x58\x31\x4b\xc0\xee\xb0\xed\xba\xfa\x98\x84\x4f\x43\x5e\xb8\x85\xeb\x4b\xbf\x27\x35\x1f\xeb\x0a\xcf\x4d\x33\x38\x53\x52\x7b\x15\xe5\x4d\x57\x37\xf3\x07\xa6\x94\x25\xe8\x10\xb1\x72\x75\x7d\xbb\xdd\xa5\xe1\x2b\xd0\xba\x69\x2c\x1f\x97\x2b\xa7\xdf\x36\x31\x5a\xe7\x4c\x03\x8b\xf3\x90\xcf\x7a\x58\xe4\xe4\x39\x68\xd4\x85\xc5\xa4\x96\x7b\x4d\xa5\x81\x30\x2b\x30\xca\xbd\xb0\x2b\x09\x8d\x3c\x5f\xf5\xe1\xce\x78\x1a\x63\x2e\x09\x76\xb9\x79\x29\xcd\xd9\x82\x81\x22\x29\x5c\x5c\x13\x60\x76\x0c\xd1\xa2\x15\x1a\xc2\x3f\x4d\xbb\xc5\x6e\x88\xc9\xd0\xca\x38\xf4\x6b\x0b\x19\x49\x7d\x78\xe9\x37\xce\xa3\x22\x26\x98\xde\xa1\x26\x69\x11\xac\x34\x36\x83\x44\xf7\xf4\x4c\x3c\x32\x92\x62\xd4\x33\x9d\x38\xff\xaa\xba\x71\x31\x28\x9d\x7a\xef\xfc\xd2\x65\x93\x21\xb6\xe0\xb1\x01\x8b\x12\x7f\xf1\x4c\x34\xce\x93\xcc\xc8\x41\xf6\x7d\x59\x76\xe5\xa8\x60\x3f\x5d\x6e\x78\x52\x14\xd2\x26\x96\xcb\x3d\x42\x33\x6a\x6b\xf1\x34\xb1\x3a\x9c\x84\x6a\xe8\xc3\x9b\xaf\xe5\xb9\x86\xcb\xa7\xb4\xb3\xcf\x12\x98\xd1\x23\xe2\xa9\x92\xb4\xd2\x50\xd7\xc0\xca\xcd\x5f\x5c\x14\x79\x86\x39\x19\x3d\x3c\x91\x8e\xfe\x28\x40\xe4\x79\x9a\x53\x33\x94\x84\x58\x0b\x1b\xc2\x3c\xe1\x01\xaa\xa0\xaf\xc6\x79\xc1\x2c\xe8\xfa\x69\x75\xf3\xed\xe1\x7a\xf7\xb8\xbe\xbb\xdb\x5d\x7f\x7b\x5a\x6c\x6f\xd7\x0f\x7e\x0c\xe3\x0c\xdc\x6d\xa6\x20\xcc\x2a\xe7\x4e\xa0\x52\x97\x7f\x1a\x07\x4d\x65\xc6\xc7\x9b\xe5\x72\x4c\x31\xf7\x27\x16\xb1\x8a\x9c\xea\xf3\xf7\xba\x3b\x87\xd1\x4c\x97\x32\x2e\x32\x46\x4b\xc7\xa9\x2a\xdf\xb0\xe9\xc3\x55\xef\x8b\x3f\x62\xcd\x73\x0e\x58\xe0\x48\x40\xf5\x9c\x26\xc6\xb9\xcc\xe3\xd4\xe1\xbe\x82\xce\xbb\x9d\x93\xd3\x48\x90\xab\x24\xa2\xe0\xfc\x56\xfd\x9c\x76\x1a\xa7\x17\xaa\xa4\x61\xb6\xaa\xaf\x1a\x0a\x65\x46\x70\x22\xae\x4d\x11\x27\xa1\x53\x3c\xc0\xf4\xc7\xab\x9a\x1b\x8a\x69\x4e\xa0\xa8\x2f\xf5\x5e\x7f\xc7\xf2\x13\x5e\xb1\x1f\x8c\x8c\x4a\x3d\x36\xa5\xb1\x69\x11\x91\xd7\x46\x0e\x18\x9c\x9b\x38\xb6\x29\xd1\xa9\x7a\x6d\x49\xc0\x84\x82\xcc\x73\xb4\x06\x37\x39\x92\x20\x24\x45\xed\x54\xf0\xbe\xfc\x76\x9a\x7e\x85\x19\x84\x9c\xf7\x65\xe8\xe5\x4d\x97\x40\x6e\x54\x0c\x3e\x8c\x7e\x44\x8a\x7c\xb6\xb5\xe3\x08\x4d\xbf\x5b\x44\xb1\xa1\xb5\x03\x7f\x1e\xa1\x1a\xc9\x84\xf9\xc3\xdc\x26\xe9\x7f\x2c\xee\xc6\x7c\x19\x2e\x22\xe4\x84\x5f\x2c\x55\xed\x49\x63\xa1\x16\x26\xe2\xc8\x8a\x53\x93\x63\x44\x59\x3d\x61\x7b\xda\x77\x67\x49\xcb\xf4\xea\x44\x1c\x2b\xed\x76\x8f\xce\xb5\x29\xa9\x25\x38\xbd\x36\x11\x9b\xd4\xcb\x2b\x3d\x42\x59\x75\xa8\x09\x32\x64\x43\xd8\xb3\x8e\xd9\x3f\xa6\xfd\x0f\x77\x8e\x84\x01\xa9\x10\xfd\x3e\xc2\x15\x88\x34\xb1\xe9\xe0\xfd\xc7\xe4\x42\xd3\x54\xc7\x6e\xdb\xfd\xbd\x2e\x2d\x3b\x70\xf6\x93\xd2\x02\x28\xf5\xdf\x4d\xab\xa0\x97\x43\x7c\x91\x32\x53\x24\xa3\x35\xd6\x79\xf3\x3c\x42\xf3\x0b\xde\xfd\xaf\x62\x23\x91\xc5\x69\x14\x6e\x89\x57\xd7\xa4\x4c\xd7\x3f\xce\xd8\xb7\x70\x45\x16\xf3\xd4\xb1\x06\x14\xd6\xc6\x5f\x65\x56\x44\xdc\x05\xde\xfd\x04\x6d\x3d\xbc\x32\x1c\x77\xc6\xbb\x81\xd8\xb0\x7d\xaf\xc3\x31\x69\x39\x55\x94\xa9\xbe\xc0\xde\x9c\x3d\xb3\x4c\x15\x04\xb8\xfc\xcf\x09\x6d\x45\x77\xde\xf0\x76\xe3\xf2\x82\x51\x67\x07\x9b\xba\x2b\x7f\xf6\x71\x9e\xcb\x3d\x87\x70\x49\xe4\x85\xb1\xf9\xcd\x47\xa5\x6e\x06\x17\x1f\x2e\x72\xce\x94\xf6\x70\x83\xe6\x6d\xf8\x44\x91\x44\x13\xe9\xf8\x2f\x0d\x54\xf4\x2c\xa9\x1b\x77\xf1\x55\x13\x05\xcf\x88\xc0\x7e\xaa\x0c\x29\x8b\xcc\xde\xb3\xf9\x68\x91\xd2\x2a\x44\xbf\x76\x8e\xa5\x3f\x6f\xe1\x08\x26\x2d\xe8\xc8\x9b\xf7\xd8\x06\xe2\x24\x0b\x13\x3c\xcf\x08\x9f\x70\x77\xf7\xe5\x57\x28\x0b\xc1\x39\xb7\x7a\x2d\xd0\x8c\x6b\xb0\xd3\x89\xe2\xfe\x3b\xbd\xdb\x22\xb6\x99\xe0\x80\xcf\xfe\x84\xf4\xcc\x85\x48\x12\x99\x3b\x1e\xc9\x37\x4b\xda\x9b\xad\x23\x82\x03\xf5\x6e\xc7\xd9\xf7\x12\x8e\xe3\x12\xb9\x10\x5c\x11\x7a\xc3\x02\x28\xaf\xc6\x66\xb6\x5c\x08\x10\xa4\x5a\xa6\xc0\x2e\xa6\xfe\xef\x10\xe7\x54\x37\x68\xeb\xea\x79\x5b\x76\xfb\xe1\x00\x70\xd2\xf1\x78\xc7\x92\xdc\x69\x49\xaa\xee\xeb\xfa\xe1\x4b\x18\xa0\xd2\x62\x2a\xad\xbd\x24\x0b\xa2\xe9\x0f\x07\xb4\x62\x5b\xab\xf5\xe6\xcb\xfa\xee\x3a\x7c\xd8\x88\xd8\x21\x37\xec\x84\xf7\x07\x64\xa6\xb3\x60\xee\xb7\xac\xeb\xd7\x72\x6c\x5d\xee\x07\x49\x21\x86\x5a\xe4\x03\x1c\x70\x51\xe9\xcd\xc7\x41\xd6\xfb\x4b\xe5\x33\x21\x11\x88\xd4\x6e\xc7\xaf\x4f\x9f\x18\xb8\x71\xa1\x92\x04\xf4\x00\xc1\xfc\x58\x98\x6e\xd6\x92\x11\x4a\x88\xc2\x67\x4a\x4d\x39\x92\x89\x73\xc7\x75\x9c\x10\x87\x62\xd3\x56\xca\x7f\x46\xe7\x09\x25\x4b\x3f\x6e\xef\xee\x48\x8b\xe4\xaf\xf1\xa5\x42\xe7\x2a\xb3\x70\xf8\x63\xb8\x39\x5a\x09\x12\x3b\x3a\x40\xf3\xba\x68\x5d\xd0\x18\x7e\x19\x46\x60\x3d\xb8\x4e\xe5\x5e\x5f\x6f\xee\x43\xb1\x4d\x18\x66\x28\x71\x7c\x81\xf6\xa9\x6c\xcf\xfc\x4f\x7f\x29\xea\xc6\x85\x01\x2e\xad\xb0\xd8\xc7\xa6\xde\x9f\x02\x7b\xd8\x6b\x5a\x72\x88\x4c\x9a\x38\xe1\xa8\x87\xfa\x7d\x3a\x03\x20\x8e\x0c\xbd\x69\xb0\xdf\x3f\xe1\xfb\x23\x04\x96\x0c\xc4\x89\x14\xc1\x5a\xfb\x83\x5c\xf0\xf5\xbc\x35\x07\x71\x5a\x50\x2c\x45\xce\x53\x6a\x63\xd5\x89\x9f\xb0\x4f\xd0\x86\x13\xc9\x9c\x65\xa3\xdc\xde\xd7\x21\x9c\xb2\xbe\x1f\x96\x40\x4a\x35\x39\x52\xc7\xab\x6b\x73\x19\x9a\x0d\x69\x01\xa4\x0f\x43\x53\xd0\x96\xb8\x08\x06\x37\x7c\x5f\xc6\x12\xc2\xa0\xde\x2d\x97\xe3\xcd\x0c\x32\xa6\x52\xb7\x54\x3b\xc8\x3a\xa5\x0a\xa3\x24\x12\x32\x13\xb1\x64\xb4\x99\xcc\xde\x17\x28\x22\x4b\x4e\xba\xdb\x5c\x9f\xcb\x2d\xf5\x87\x19\x53\xbe\xc7\x31\x16\xae\xf1\x3f\xa1\x48\xb4\xed\xa6\x75\xf5\x91\x98\x58\x43\x4c\x0c\x45\x9e\x8b\xd8\x6a\x1c\x7f\x59\xaf\xaf\x37\x3f\x6e\xb7\x5f\x97\x4f\xff\x7a\xdc\xae\xaf\xd7\xdb\xe5\xfa\x3e\x8c\x33\x56\x87\xd6\x17\x80\xdb\xcb\x35\x00\x60\x71\x2a\x8a\x01\x65\x69\x5f\x99\xd9\x18\x1e\x19\x33\x71\x5c\xe9\x4f\x78\xa6\x99\xec\x07\x2b\x8c\x1d\x5d\xe4\x06\x54\x47\xbc\xb8\xd1\x3a\x3f\x04\x94\x20\x62\xe6\xb3\xf5\xfb\x8f\x1b\x28\x43\x01\x0e\x84\x04\xee\xde\xcf\x4d\x7d\x6a\x14\x4e\xd0\xce\x7e\x90\xd6\x89\xeb\x43\xad\x2a\xbd\xd2\x21\x43\x05\x81\x8a\x85\x3e\xde\xf5\xe2\x78\x9c\x06\xce\x00\x69\x4e\xb1\xcd\xd5\xfd\x63\x83\xbb\xa1\x6c\x0a\x50\x58\xfe\x6c\x59\xe9\xd3\x20\x53\xd4\xff\xdd\xaa\xea\xf8\x7b\x58\x37\xd3\xea\xd8\xc5\x1d\x01\x64\x16\x11\xde\xa4\x74\xb2\xab\x21\xc9\x06\x09\x39\x4c\x15\x0d\xfc\x4a\x3f\x3b\x83\x66\x54\x9a\x03\xad\x09\x78\xb2\xad\xcf\xb0\x43\xe1\xfd\x55\x31\x27\x7b\x10\x43\x61\x89\x6b\x59\x8c\x64\xdd\x38\xa8\x34\x89\x30\x68\xc0\x7c\xe9\x57\xdc\x31\x97\x0f\x54\x9e\x50\xd3\xf8\x00\x3f\x9d\x84\x7a\xb0\xf4\xe7\xa0\x18\x27\x2e\x69\xbf\x13\x4e\x01\x0f\xff\xb8\x58\xe8\x02\x6d\x98\x8c\xc7\x9a\x65\x4d\x7d\xb8\x87\xe6\x15\xbb\xe3\x1e\xd4\xaf\x99\xcc\x1c\x90\x17\x64\x02\x77\xbc\xbd\xa6\x1e\xd0\xce\xff\x0e\xd4\xe0\xad\xc7\x56\xcf\xd6\xc5\x81\x9a\xe6\xee\xb0\xc9\x34\x4d\xfb\x31\xdf\x62\x36\x6f\x4c\x81\x52\x85\x36\x30\x36\x8e\x22\x3d\xd9\xc2\xc0\xb0\x84\x92\xb0\x80\xbd\xdf\xbc\xc0\xb4\x8a\x0c\x86\x67\xc6\xd5\x58\x02\xb7\xdb\x19\x19\x5e\xbe\x26\x63\x04\x31\xe4\xc7\x1a\xab\x97\x73\x36\x19\xa1\xa0\x42\xb9\xd3\xd2\x1f\xa3\x53\x6f\xea\x26\x78\x5f\x72\x19\x67\x11\xf5\x79\x56\xae\x9d\x81\xe1\x00\xd8\x6e\xd3\x13\x51\xa1\x7e\xc5\xac\x74\x1f\x48\x18\xd2\x15\x0f\xb6\x4a\x1f\x94\xde\x9f\x93\xbe\xb9\x4c\x23\x41\x0d\x62\xd2\xed\xd9\x1d\x47\x74\x5a\x99\x66\xcc\xc5\x28\x7b\x75\xbb\xa6\x08\xdb\x63\x24\xe3\xe8\x7f\xfc\x20\x16\x91\x36\xba\xea\xe3\x7a\x02\x85\x4d\x0d\xcf\xb9\xcc\x22\x46\x44\x9f\xd0\xa6\xf9\xe4\x46\xf5\x97\x4f\xe2\xbd\x8f\x5f\x1e\x57\x4f\xab\x2f\x4f\xb7\x0f\xbe\xd6\x26\xb3\x34\x26\x0c\xe3\x01\x7e\xf6\xc9\xd7\x13\x6a\xc4\xc3\xe0\x7c\xcf\x65\x26\x22\x7a\x82\xab\xc5\xd3\xdd\xbf\x76\xb7\x0f\xdf\x57\x9b\xed\xfa\x69\xb7\xb8\x5f\x7f\x7b\xd8\x86\x41\x06\xa8\x20\xf6\x05\xbb\xe5\xbe\x54\xaf\x63\xf2\xb0\xcc\x45\x0c\xb9\xd3\x63\x86\xfd\xfa\x38\x5f\xeb\x65\x0e\x3c\x87\x11\x02\x7d\x55\xe9\x63\x5d\x56\x53\x0a\xa3\x2c\xb8\x05\xd2\x40\xdb\x96\xcf\x15\xf1\xcb\x27\x6a\xaf\x17\xf7\x74\x59\x48\x99\x0f\x85\xeb\x11\x76\xf8\x4c\x04\x95\x4b\x96\x4a\xdf\x35\x20\x53\xad\x3e\x26\xda\xd4\x7b\x7d\xc1\xf6\x97\x4b\x96\x69\xc2\xf9\xdd\xd5\xcf\x8f\xf5\xbe\x54\x1f\xab\x9f\xc7\xb2\x99\xb7\xab\x24\x53\x16\x65\x45\x8a\xfd\xc3\x33\x4c\xa2\x70\x9c\x53\xa4\xe3\x1b\x35\xbf\x83\x7a\x7d\xac\xcf\x7e\x99\x01\xfa\x65\x96\x0c\x10\x34\xa6\xb8\xe4\xa9\x24\xa8\x17\x1c\x8f\xfe\xde\xfa\x23\xda\x82\xb0\xda\x51\x85\xe4\xb1\xa9\x9f\x1b\x38\x7c\x92\xdb\xba\x0f\x02\x43\xaf\x01\x41\x37\x19\xcf\x93\xe0\x4f\xfe\xf5\x27\xd0\xb1\x0b\xcf\x15\x1e\xbb\x49\x24\x75\xfe\x7c\xa4\x16\xe4\xb2\xfc\xbc\xaf\x25\xec\xb7\x23\x78\x95\xbf\x10\x05\x39\xd5\x12\xc1\x0a\xfc\xe2\x27\x8a\xe7\x5c\xea\xcc\xee\x75\xb7\xcb\xf5\x6e\xb9\x78\xf4\x1b\x89\xd4\x05\x66\xd6\x72\x99\xf2\x85\x0a\xdb\xd6\x01\x1b\x3f\xf9\x4d\x5a\x9b\xd4\x29\xd6\xaa\x13\x2e\x28\x9c\x1b\x9b\x8e\xfa\x61\x68\x45\x05\xda\x7e\x6b\xf6\xbb\xde\xfc\xc9\x61\x2e\x69\x89\xd9\xe9\x7a\xc2\xcc\xff\x65\xaf\x62\x14\x00\x48\xe4\x2c\x8a\x7c\x65\x0a\x5a\xec\x27\xc8\xb1\xfe\x84\x00\x2d\x4d\xa2\x3d\xee\x91\xa8\xa0\x57\x75\x7d\x59\xb3\x88\x4b\xa3\x35\xa5\xe2\x0d\x9a\x53\x8b\xe7\x4b\x9f\xdf\x34\x55\x14\x23\xf5\x1d\x37\xaa\x24\xad\x5a\x77\x5f\x55\x1c\x89\xc8\x83\x6e\x9c\x11\xb8\x9f\x59\xd6\x52\xde\x8d\x4b\x30\x82\x22\x94\x9b\xb6\x35\x85\xc0\xed\xad\xd9\xd4\xa6\x5b\xc2\xf1\xa1\xee\x7c\x94\x3b\xf9\x81\x2a\x2d\x90\x9c\x1c\xda\x34\xb2\x27\x8c\xfd\x01\x96\x50\xbf\xbb\xa4\xdf\xbc\xe9\xf0\xd8\xce\x3f\xca\xac\xa8\xca\xaa\x69\xea\x89\x43\x18\x57\xa9\x34\xa9\x18\x48\x9b\xcb\xba\xac\x24\xb4\xb3\xb8\x49\x65\x91\x20\xe0\x48\x10\xb0\xc4\xfd\xbe\xb5\xa2\xba\xfe\xf2\x73\x96\x48\x67\x87\x79\xab\xea\xb1\x9d\x6b\x7f\x8c\x53\x70\x7a\xfd\xcd\x3b\xed\x72\xc5\x94\xb1\x09\x36\x2d\xb1\x97\x9b\x86\x17\x27\xb6\x62\xc8\xc8\x93\xcb\xa0\x7a\x21\x64\x13\xed\xf6\x57\x1f\x54\x43\x7a\x38\x1d\x66\x17\xcf\x19\xa7\x7d\xf1\x00\x3f\xa9\x73\x4b\x88\xa8\xb9\x80\x2d\x57\x5c\x5a\x5b\x13\xe2\x40\x10\x8e\x75\x55\xe9\xeb\xa1\xec\xa9\xb8\x04\x9a\x79\x04\xff\x59\xc2\x5e\x3d\x86\xbe\x95\x12\x8c\x05\xa1\x18\xf8\x79\x8d\x3f\xc9\xeb\x73\xfa\x3b\x04\x28\x6a\x48\xe9\xfa\x24\xf7\x18\xbc\xdc\xa6\x37\x1a\x00\x28\x0d\xfe\x76\xdc\xd7\xa0\xef\x4f\x6d\xa9\xe6\x39\xe3\x18\x8d\x71\x79\x95\x57\xa0\xa3\xdc\x56\x52\xeb\xd7\x99\x0f\x14\x57\x32\x41\x0a\x4c\x17\xbf\x5f\x8f\x93\x18\x25\x53\x49\x8c\x9b\x2f\xd8\x7d\xab\x8e\x7d\xba\x36\x3d\xa9\xcc\x94\x1c\x95\xa1\xed\x2e\xf0\x48\x6a\xf5\xfe\x14\x98\xc4\x69\xe1\xab\x60\x63\xbd\x23\xae\x50\x30\x42\x75\x5a\xe8\x2f\x91\xb7\xca\xff\xe2\x17\x98\x4d\x55\x1d\x15\x8c\x22\xad\xb2\xd2\x2e\x95\x9a\xb6\x92\x74\x04\xcc\xc5\x01\x7d\x74\x73\x16\xdb\xfa\x51\x0a\xa8\xfc\xb0\xfd\x76\xfb\xb0\xda\xfe\x58\x3f\xfd\xe1\x3f\x1f\x47\x4a\x04\xbf\xb4\x6f\x55\x59\x4f\x18\xd4\x3a\x49\x53\xad\xbc\x54\xcf\xb8\x10\xa6\x13\x21\x48\x95\x65\xd7\x62\xb7\x3e\x75\x6d\x07\xb6\xf7\x5d\xbf\xcf\xd1\x86\x3a\x8d\x59\xb0\xfd\x5b\x36\x1f\x6d\x07\xfb\xcb\xab\x8e\x4e\x53\xcc\x3c\xe6\x26\x28\xb6\xcf\x02\x1b\x9d\x8a\x94\x47\x5e\x79\xfe\xa6\x3e\x35\x63\x44\x8b\xce\x22\x46\xa5\x47\xeb\x54\xd6\xfc\x2d\xeb\xa4\xf0\x51\xa4\xc0\xeb\x6f\x99\xb4\x73\x9d\x09\x1d\x5b\x22\x45\xd3\xe2\x03\xbe\xd3\x92\x6a\xbf\x2a\xc9\xa6\xad\xcd\xb9\x52\x88\xce\x14\x88\x84\x7a\x4f\xb7\x07\x78\xc6\x75\x75\x5e\xb0\xd7\x99\x96\x71\x16\xea\x02\x17\x7a\x94\x3a\x8f\x90\x04\xcc\xfb\x0d\xcd\x5f\x7f\x11\xe5\x54\x27\xdd\x36\xa7\x89\x16\x80\x2e\xb8\xa4\x5c\x6a\xf7\xec\x9c\x8a\x96\x75\xdb\x8d\x3a\x7d\x0e\xe9\xc6\xfd\x70\x69\x75\xb3\x9f\xeb\xbd\x1e\xf4\xde\xb9\x66\xb9\xf5\x75\xa6\xb2\xc0\xb7\x56\xcf\xca\x2f\x9a\x09\x46\xf6\x39\xdb\x72\xdf\xef\x07\x53\xcd\x17\xcd\x00\xe8\x16\xbf\xd4\xa7\x16\xb7\xf5\xf1\xdb\x31\x1c\x91\x3a\xb1\x84\xd6\x69\x27\xe6\xf2\xa3\x22\x7c\x7e\x50\xdf\x45\x6d\xa5\x7b\xac\xb6\xee\x68\x7f\xd4\x22\xd2\x54\x13\xbe\x5a\x7c\x5d\x2c\x17\x67\x05\xa7\xf1\xda\xaf\x05\xb0\x80\x1b\x81\x3d\x5e\x82\x13\x6a\x00\x43\xe5\xa8\xdd\xb1\xc1\x43\x10\xcd\xe6\x5a\xca\x98\xa3\xb7\x63\xa8\x9b\xd3\xe1\xdc\xb9\x8f\x6b\x55\xc4\xb9\x27\x38\x42\xd3\x40\xd5\x7d\x5c\x44\x5f\x6a\x65\x32\x13\xd4\x27\xf7\xfb\x8b\x49\x98\xd6\x71\x66\x2c\x95\xc4\xc0\x69\xdf\xf5\xbb\xcc\xf8\x3d\xc0\x82\x5b\x64\x59\x5d\x77\x92\x3a\xdd\x0b\xa5\xb0\x6d\x9d\x1c\x63\x18\xc6\xac\x2a\x48\x87\x6d\xf7\xa5\xdf\xaa\x15\x96\xc7\xce\x57\x8c\x46\xf5\x7f\x8d\xd2\xd6\x5e\xb1\x6a\x4f\xe4\x58\x53\x5d\xcc\xb8\x35\x9a\xc8\xf6\x99\xca\xaa\x1b\xa6\x8d\xe1\x05\x01\xcd\x6e\x4e\x1d\x34\xea\xe5\x23\xfc\x1d\x0d\xbd\xf1\xa7\x63\x8b\x4d\xff\xd2\x9f\x17\xb4\x07\x5c\xc0\x74\x12\x60\x94\x4b\xaa\xe7\x95\x55\xbf\xfa\x58\x50\xfa\x59\xc0\xff\x7f\x41\x97\x06\x32\xda\x5c\xc5\x7e\x1a\xc3\x62\x9c\x80\x4e\x07\x4d\x84\xb5\xa1\x34\x6f\xbd\x9f\x10\xb8\x31\x4e\x23\x25\x82\xf7\x9b\xdc\xcf\x77\x37\x8c\xf3\x88\xb0\x4c\x77\xf5\xb3\x5d\x72\x2e\x2f\x34\x98\x24\x9c\xb9\x79\x63\xb3\xe3\xef\xfd\x03\x6f\xad\xf6\xf6\x6f\xb3\xb1\x4a\x47\x9e\x6c\x7e\x03\x65\x88\x99\xaf\xd0\xd4\x0d\x4e\x45\x11\x39\xa6\xa9\x10\x8e\x37\xf1\x72\xf6\xf3\xd2\xcc\x12\xc5\xb0\xd2\x13\xd4\x1e\x66\x85\x42\xa7\x38\xd9\xcf\xa8\x45\xa5\x49\xd7\x88\x0a\x79\x33\x54\xc9\x94\x2e\x4d\x84\xea\xf0\xbf\xfc\xd9\x78\x46\x6d\x44\x5d\xaf\x5a\x05\xae\x4e\x38\x93\xe4\xc1\x4c\x14\xf4\x95\x6f\xfd\x95\x3b\x9d\x5c\x27\x0e\xef\x7f\x55\x21\x33\xaa\x57\x92\xfe\xed\x1d\x3e\x83\x0a\x3f\x98\x47\x51\x34\xee\xcd\x6c\x50\x9d\x9a\xb2\xfb\x98\xf7\x5b\xa6\xd7\xcf\x39\x90\x58\x5f\x85\xef\x9e\xbb\x39\x7b\x3e\xe1\x1a\x38\x07\xbb\x58\x96\x6f\x38\x05\x32\x7e\xfa\x09\x50\xa4\xc3\xf6\x82\x3f\x37\x5d\xe3\xf8\x11\x93\x58\x14\x45\x22\xa8\xfc\xf3\xaf\x53\xf5\x7b\x09\xf7\xe5\x64\x72\x09\x61\x45\xe3\x9c\x23\xd5\xa4\x0c\x85\x42\x5b\x06\x25\xd5\xc5\xa8\x7a\x38\x9d\x24\xc2\x30\x7a\x45\xbf\x60\x85\x4d\xa9\x06\x9f\x88\x5f\xa6\x6e\x28\x33\x14\x3c\x74\xba\xc3\x8b\x9a\x0f\xad\xa7\x62\xb6\xcf\xa1\x94\x46\x59\x91\xa9\x43\x59\xd9\x05\xc8\xcf\xc8\xe6\x5c\xc2\xc4\x7f\x48\xa7\xf4\x7a\xfd\x71\xf5\xc7\xe4\x9a\x55\x6c\xa5\xf0\xfa\xb9\x7d\x8d\xfa\xa4\xc6\x70\x08\x54\x45\x4c\x1d\x09\x55\xef\xeb\x2a\xc8\x0a\x0f\x47\xf3\xd8\x8c\x2c\x64\x5f\xf7\x70\x55\xea\xb9\x0a\xe8\xf8\xdf\xd8\x5f\x83\x8e\x92\xb4\x08\x68\x7d\xdd\xd4\x47\xc7\xbb\x18\xf6\x19\xd4\x5c\xc7\x6e\xcc\xd6\xc6\x69\xd3\xa3\x96\x78\x74\xb0\x3d\xec\xfe\x8b\xf7\xfb\xfa\x3d\x6c\x9a\xa8\x4d\x4e\x1c\x07\x9a\xbb\x5f\x63\xff\x67\x4c\x53\x70\x76\x4e\x4f\x3a\x98\xa0\x71\x44\x66\xcd\xf4\x02\x69\x7f\x89\x55\xd7\xfe\x40\x7c\x1d\x48\xe5\x68\x72\x61\xcc\x48\xab\x74\xf3\xd1\x76\x17\x32\x8b\xff\xe3\xbf\xfe\xe4\x1a\x69\xfa\x5d\xff\xf9\xaf\xf1\x23\x32\x91\x8c\x29\x2b\x7b\x7c\x5a\xed\x7e\xdc\x3e\xec\xee\xbf\xdd\x6d\x6f\x1f\xef\x56\xbb\xc7\xd5\x93\x1f\x13\x47\x82\xb8\x80\x12\x81\x78\x38\xe1\xef\x49\xe6\x9d\xbd\xfb\x0c\x9f\x54\x96\x26\xdf\x6a\xe2\x4c\x13\x5c\x78\x59\x1f\x8e\xa7\x0e\xef\x3f\x46\xa0\x55\x93\x44\x45\x1a\xf9\xdd\xb5\xdf\xba\xfd\xb6\x39\x7e\xa9\x4c\x92\xe6\xa8\xbc\x43\x16\x6d\x9c\xce\xa3\x35\x9c\x06\x13\x1f\x82\x0e\xfc\xe0\xdf\x6b\x69\xf7\xe9\xbf\xd8\x5d\xc2\x39\x18\x75\x2f\xee\xaf\x96\x03\x12\xdc\x64\x85\xa4\xb4\xef\x0e\xe1\x38\x9a\xb8\x26\xe3\xb6\x68\xec\x42\xa5\x55\xd5\xef\x15\xb3\xfe\x8f\xc9\x53\xeb\x97\xe5\x22\x63\x12\x3f\xb8\x18\x17\x98\x3e\xce\x23\x51\x28\xec\x2c\x97\x68\xbb\x85\x59\x80\x61\x0a\xb4\xb6\xd2\xa4\x6b\xfc\xaf\xdd\xea\xcf\xe5\xd7\xc5\xc3\x97\xd5\xee\x29\xf8\xe1\x71\xc3\x72\x4d\xbc\xe9\x43\xfd\x86\x3b\x5b\x9d\x9b\x10\x6f\xb8\x1f\xa7\x73\x16\x8d\xc1\x31\xb0\xbf\x25\xc7\xce\xbf\x19\x76\x1b\xc1\x52\x2a\x32\xde\x58\xde\x39\x36\x5b\x68\x9e\x31\x3c\x10\xc1\x38\xd5\x27\x83\x6e\x00\xd1\x76\xdc\x41\x88\x50\x38\xf0\xcd\xf6\xaf\x14\x68\xfc\x47\x90\xd1\xae\x7b\xbb\x5c\xef\x1e\xbf\x2e\x36\xab\x78\x67\xad\x57\x1e\x57\x4f\xcb\xd5\xc3\x76\x11\xa0\x86\x46\x72\xe0\x7c\x24\x7f\x4b\xfd\xfe\xe9\xdd\x56\x89\x15\x5b\x71\x6c\xcf\x7b\xf8\x39\xc9\xf5\x8d\x12\xa8\xec\x29\x4e\xd5\x6b\x71\xdb\xda\xae\x87\x3f\x88\x8a\x8b\xe0\x94\x85\x4f\xe4\x69\x58\x56\xcf\x5f\xa0\xb5\xe1\xfe\xb0\x86\x18\xcd\x8b\x62\xc4\x1c\xde\xef\x97\xf5\x1b\x36\x94\x3d\x84\x57\x00\x93\x94\x84\x0d\xdb\xff\xcc\x9e\xb7\xc9\x85\x53\xec\xc2\x66\xa7\xe0\x18\xfa\x28\xc6\x28\xeb\x77\x75\x6c\x50\x63\xbf\x3c\xd7\xd3\x04\x59\x44\x51\x9c\xdb\x97\x6e\xfd\x70\x73\xfb\x65\x77\xbf\xf8\x73\xf7\x7d\x71\xf7\x6d\x15\x8e\x67\x28\x63\x0f\xb9\x77\xa8\x22\xee\x8f\x31\xee\x9d\x2b\x57\xeb\xcd\x1f\xf8\x71\x53\x5f\x16\x53\x12\x51\x64\xa2\x38\x1a\x2a\x2f\xbf\x4d\x8f\xc6\x11\x12\xc9\xce\x49\xff\x7a\xf0\x43\xb8\x3f\x22\x8a\x85\xa2\xa2\x0e\x56\x23\xbf\x53\xfb\xe0\xf9\x18\x97\x23\xa2\x18\x52\x8a\xae\x9d\x2b\xd6\x38\xd1\x1c\xdf\x35\x11\x25\x32\x71\x8e\x90\x3f\x47\x50\x7b\x11\x25\x8e\x88\x40\x32\x8f\xf5\xb7\xb2\xea\x46\x81\xb2\x88\x12\x13\x83\x9a\xf0\x67\xc2\xbd\x4c\x0c\x4b\x5c\x37\xca\x66\x8b\xe3\xcc\x56\x44\x7d\x34\xd6\x7f\x21\x54\x55\x7d\xb2\x42\x80\xd5\x27\xbd\x10\x11\x65\x85\x55\xb8\xba\xd9\xde\x3c\xf8\xee\xc6\x68\x2d\x16\x51\xa6\x24\x29\xe6\x3c\xc3\xc1\x6b\x88\xce\x2e\x30\x07\xa0\x84\xc4\x97\x97\x27\xea\x9d\x22\xca\x4d\x5e\x4c\x88\x1e\xa4\x9f\xeb\x0e\x16\x29\xa3\xe8\xe8\x8b\x2d\x04\xff\x76\x2e\xf2\x24\x48\x26\x8d\x1c\x88\xea\x1b\xc4\xc7\xba\xfa\x6f\xf9\x5b\x38\x62\x61\xc6\xdb\xe5\x6a\xf2\x9b\x45\x9a\x72\x70\x3e\xec\x5f\x11\x9a\xee\x0a\x61\xe0\xfb\xb9\xe5\x63\xf2\x1d\x22\xb3\x62\x74\xd8\xbd\xb8\x8c\xcd\x1f\x10\x9c\xe4\xe3\x3e\x93\x4b\x1b\x3f\x32\x81\x9c\xc4\xfd\x36\x60\xb0\xbf\xc8\x81\xc7\x32\x9d\x86\x10\x1b\x61\x61\x30\xc7\xd2\xa2\x72\xfd\xb7\x49\xc6\xd1\xbd\xca\xd6\xd0\xcb\xe6\x02\x5f\xa1\xd2\x73\x6f\x0e\x11\x49\xae\x29\x47\xde\x3c\xde\x5e\xaf\x9e\xc8\x64\x63\xf7\xb4\xfa\x67\x38\x97\x14\x29\xa9\x05\x75\x6a\x00\x1a\x8a\x48\x9a\x94\xb0\xad\x7b\x34\x5d\x22\x66\x8f\x52\x45\x31\xa1\x1e\x50\x97\xb6\x65\x79\xd9\x99\x52\x44\x0a\x25\x85\x05\xa7\xea\x1a\xf7\xf8\xec\xb3\xd4\xb3\xd4\xc7\x0f\x37\x16\xa7\x7a\x5d\xc2\xa1\xae\x34\x69\xe4\x4c\x9e\x98\x4e\x52\x29\xbc\xe3\x7b\xf5\x3a\xbb\x52\x9d\x5b\xac\xc1\x97\xeb\xf5\x42\xbf\xfd\x22\xfd\x16\x91\x16\x19\x25\xac\x03\x9b\xa8\xa5\x8e\xc5\xec\x84\x42\x90\x7e\x6f\xb0\x79\xf6\x34\xc4\x25\x1c\xb7\x25\x36\xf1\xec\xbe\x60\x9e\x15\xae\xf1\x5e\x56\x21\x84\x12\x11\x72\x36\x8a\x07\x1f\xf0\x7d\x73\x92\xdd\x25\x08\xe8\xec\xf6\x21\x14\xc6\xd9\xaa\x90\x91\xf7\x3d\x54\xf0\x4c\xdb\xde\xa5\xdd\x58\x44\x26\xb3\xdf\x7f\x24\xc9\xaa\xeb\xd1\xe3\x34\x22\xa1\x39\xf7\x5a\x76\x9d\x43\xee\x12\x9c\xde\xa3\x37\xed\xb0\x38\x52\x16\x2b\x2e\xfb\x5b\xf5\xc7\x87\xfe\xf8\x3a\xa7\xd4\x8b\x38\xce\x99\x37\x85\xda\x60\xe3\xbc\x34\xe7\x46\x02\x7e\xac\xd4\x86\x4d\xe1\xaa\xa3\xbe\xd7\x7c\xb0\x46\x5a\x2a\xff\x59\x1f\x8f\x30\xc4\x2c\x22\x4e\x74\x4a\x8c\x0f\x8f\x3a\x76\x35\xa0\x5f\xde\xbb\x38\x31\x20\xad\x1a\x5b\xf5\xa3\x19\xeb\xad\x4c\xa6\x5c\x9c\x46\x12\xe2\x51\x77\x99\x7a\x02\x17\x2b\xe2\xe1\x03\xc6\xdb\x94\x2e\xf6\x7b\x87\xac\x6c\x6f\xea\x66\xb1\xdf\xd3\x19\xd6\xd5\x14\x04\x2f\xe2\x34\x2f\x94\x83\x02\x3d\x36\x7d\xc0\xfe\x3c\xbf\x4f\xa9\x51\x34\xd1\xf6\x88\xaf\x9b\x0e\x61\xff\x58\x77\x3b\xff\xf1\xac\x28\x28\xd7\xd8\xc9\x53\x53\xfd\x76\xc1\x8c\x5b\xc4\x19\xa4\x44\x40\x50\xb5\xa9\x4f\x95\xc6\xa6\x1d\x07\x06\x22\xce\x63\xcb\xf6\xa2\xca\x2a\x25\xb2\x8f\x4d\xf9\x5f\x6c\x7f\x58\xd5\x94\x30\x2c\x35\xb4\x88\x9f\x88\xa7\xe6\x6a\xc0\xd3\x1d\x3a\xce\xb5\x24\x65\x9c\x55\xa5\x85\xff\x5b\x91\x58\x40\xfe\x33\xf6\xeb\xa8\xb6\x4b\xe3\xd0\xe6\x17\x71\x21\x62\xba\x03\x8b\xe7\xa6\xa4\x95\xec\x01\x7f\x76\x83\x0f\xb6\x88\x0b\xb0\xd2\x8c\xed\x4b\xfd\xee\xcd\xaf\x2e\x77\x05\x45\xcc\xd2\x8c\x30\xc3\x4f\xeb\xab\x55\xf7\x32\xee\xb5\xfb\xb3\x31\xc3\xc9\xeb\xf8\xf7\x1a\xaa\x6a\xac\x4f\x20\x62\x91\x19\x74\xc6\xa9\x33\xbd\xdd\xc9\xec\x01\x26\xa4\x83\x0c\x7d\xaf\x3b\x5c\x54\x64\x5d\x7a\x79\x95\x8b\x81\x01\x41\x39\xd6\x47\x2b\xfd\x6c\xc3\xae\x71\xaf\xc0\x0f\x54\x3c\x2a\xc6\xd6\x96\x75\x87\x56\x31\x6f\x3a\x29\x65\x6a\xd5\x87\x7c\x09\xe1\xbe\xdc\x63\xdb\xd5\x55\xb8\x40\x09\xa9\x76\x88\xa3\x06\xfb\xfb\xb8\xa8\xf4\x48\x47\xd6\x8d\x52\x1a\xa9\x2b\x76\x5d\xb6\xf2\xd4\xb4\xb4\x70\x5c\xdc\x23\x62\x9d\x58\x63\x9f\x2f\x8b\xcd\x98\xd9\x24\x62\xcd\x22\x8a\x38\xed\xca\xf5\xbd\x6c\xe1\x2c\x2b\xb9\xe4\x80\x24\x62\x2d\x25\x85\x2d\x2e\xee\x21\x0d\x17\xcf\x00\xe9\x8f\x2a\x62\xd0\xfa\x37\xc5\x69\xec\xff\x15\xb7\x61\xfe\x15\x86\x78\xb0\x14\x84\x5d\x95\xfa\xa6\x6e\x1e\x4f\xd5\xeb\x6c\xb9\xd2\xc6\x50\x98\xea\xc3\x8e\x9b\xa6\x3e\x50\x49\xcb\xff\x16\x4c\x8d\x57\x57\x77\x33\xa2\x7d\x29\x8f\x4e\x37\xfb\xb3\x9a\x8a\x88\x51\x58\x19\xe3\x16\xf7\xfb\xaa\xd6\xf3\x55\x12\x05\x14\x16\x18\xf8\x31\x5e\xca\x10\x81\x9b\xd1\xaf\x21\xa4\xf4\x35\xd4\xfe\xb8\x49\x8c\x87\x66\xd3\xa1\x06\xab\x8b\x5c\x2c\x91\x44\x3c\x11\xb6\x80\x7c\x28\x2b\x8a\x8b\xda\x6e\xf3\x52\x1f\x07\x4d\x6f\x91\x44\x3a\x25\x10\x10\x81\x44\x9d\xb2\x49\x38\x24\xbc\xcb\xea\x83\x73\x3c\x68\x89\x2f\x1a\xb8\xfa\x01\xd0\x7c\xe9\x29\xb8\x98\x3b\x89\x33\x20\x9c\xb6\x65\x48\x8e\x0c\x26\x44\x12\x73\xa4\x66\xcf\xd1\x89\xb8\xfa\xbf\x27\x98\x13\x82\xcd\x49\x42\x5d\x70\xec\x99\xdc\xc9\x24\x8d\x0b\xcf\x1a\xf6\xa9\x8a\x6d\x1e\xce\x86\x15\x31\xc9\xa8\x2f\x1b\x30\xdd\x01\xf7\xc3\x17\x66\xb1\x45\x82\xbe\x43\xbb\x39\x51\x55\xc8\x9c\xf6\xe1\xa0\x91\xd4\x59\xba\x3d\x04\xe6\xba\x48\xf2\x28\x86\x28\x50\x52\xbd\xa4\xd3\x38\xae\x4f\xf2\x98\x83\x95\xd8\xff\x65\x75\x6f\x76\x2d\x45\xa4\x2d\x63\xe8\x34\xff\xf9\x45\x52\xd0\xf9\xae\xca\xae\x8f\x7a\x76\x30\x59\x75\x93\x22\x31\x64\xc5\x54\xb6\xbb\xb6\x7c\xae\x3e\x8b\x30\xc3\xcf\x2b\x72\x4e\x35\x1e\xd3\x20\x7e\x21\xe9\xc6\x5a\x9f\xd4\xdc\x0e\xcd\x0f\x66\x8c\x4a\xdb\x55\xdd\x41\xbf\x2d\x6c\xdf\xeb\x33\x75\x39\x91\x14\x32\x4d\x60\x04\xf8\xdc\xf4\x1b\xc8\xfc\x2a\xb0\xa0\xa2\xd9\xff\xf6\x81\x1b\xc2\x61\x76\x98\x45\x68\x5c\x5d\x21\x5c\xe0\x64\x21\x4a\x58\x81\x24\x56\x52\xd5\x1d\x69\x73\xfb\xeb\xe7\x79\x46\x3c\x1c\xe5\x41\x7e\x22\x81\xc4\xba\x90\x92\x60\xb3\xad\xf6\x2d\x9c\x05\xf2\xf5\xe5\x9d\x23\x81\x5c\x11\x33\x44\x63\xdb\x35\xf5\xc7\x6c\x9f\x4e\x20\x37\x04\xb7\xbf\xc6\xb7\x7a\xff\x86\xcd\xce\xe9\x8b\xcf\xae\x02\x94\xa0\xdf\xe2\x94\xee\xae\x3e\xae\x2e\xdf\x56\x99\xe4\x3e\x4a\xb7\xe2\x09\x97\xb6\xee\x44\x39\x21\xfa\x03\xfc\xdc\x7c\xd9\x4e\xb6\xed\x44\xa7\x1a\x33\xcf\x81\x5d\x54\x1f\x5f\x60\x1e\x8d\x25\x5a\x23\x69\xdf\x5c\x75\x84\x1f\x18\xef\x75\x09\x2a\x43\x45\xea\x86\xde\x7c\x8b\x1c\x19\xd7\x6e\x45\x62\xd2\x22\x71\x01\x26\x75\xe9\xae\x6b\xfb\xef\x98\x69\x31\x9b\x59\x46\x68\xa2\xcf\x5c\xaf\x1f\x88\xd8\xb5\xfb\xb1\xb8\xbb\x5b\x6d\xc3\x19\x31\x77\x3a\xae\x95\xa6\x96\xff\xe5\xb7\x3a\x8d\x84\xe5\x4d\xff\x17\x9b\x7a\x1a\x61\xa4\x91\x49\xe8\xd0\x3f\xbf\x4f\x85\x27\xfb\x23\x85\x76\xa1\x27\xe1\x96\x9b\x09\x11\x6c\x3a\x36\x8e\x14\xad\x07\xf7\x65\x75\xea\xf0\x00\x93\x5b\x93\xc6\x0a\x0b\xc7\x2f\x59\x54\xe5\x01\xf6\x63\xa6\x82\x48\x13\x95\xaa\xc2\x07\xde\xa5\x95\x99\x1d\x9b\x69\x8a\x34\x65\x85\xf7\x0c\xb6\x7e\xb4\xb3\xaf\x27\x69\x49\x6f\x83\x4e\x6f\xec\x8c\xa8\x2c\xd2\x14\x0a\xaa\x65\xd5\xc6\x90\x1d\xf4\xf4\xc9\xa6\xa9\x14\xa9\x95\x26\xae\xf0\xfd\x1e\x0f\xd2\xc1\x77\xfd\x61\xb4\x42\xc1\xad\xd7\x91\xbf\x08\x18\x16\x69\xce\x52\x5f\xcb\xbb\x3a\x7d\x4c\xa2\xa5\xe9\xf7\xe5\x3c\x77\x96\xff\xf0\x8c\x93\x79\x98\xe6\x46\x91\x37\xe0\xd5\x4b\x59\x55\xf8\x0a\xb3\xaf\x28\x12\x28\x06\x6a\x00\xcd\xf5\x7e\x09\x99\x0d\x2a\xac\xcb\xbe\xae\xdf\x2b\x5d\xd7\xb3\xf5\x2f\x65\x12\xad\x90\x3b\x05\x1a\xe4\x80\x61\x39\x00\xdf\x8f\xc6\xe2\x92\x3f\x7e\x9b\x7a\xd4\x86\xfd\x68\xde\xf5\xbe\x1c\x2e\xa4\x0c\x0b\xca\xf6\xc3\xbe\x33\x7a\xde\x64\xd5\xe2\xb2\x80\x3e\x52\x99\x89\x89\xcd\xce\xc4\x0b\x45\xb3\x63\x8f\xcf\xcf\xe5\x7d\xfb\x3c\xbb\x14\x2e\x91\xde\xe8\xa7\x5a\xbd\x6e\x54\xd9\xb6\x75\xf3\x08\xc7\x79\xcc\x95\x8a\x08\x8c\xdb\xea\x5d\x8f\x09\x9e\x71\x8a\xef\x9b\x7d\xaf\x40\xee\x82\x64\x68\xf0\x65\x64\x48\x27\x52\x61\x0a\x5a\x59\x83\x5c\xd5\xe7\x58\x02\x91\x02\x2f\x2c\xd5\x15\x3a\x7c\x0f\x5e\xfa\x22\x05\x95\x13\xb9\xf0\xfe\xf6\x61\xb9\x78\x74\x0e\xae\x03\xde\x5a\xa4\x80\x82\x4a\x09\xab\xed\xd7\xdd\xea\x1b\x15\x30\xfd\x21\x95\xa1\xe7\xc7\x39\x4d\x3f\xdf\xb0\x9d\x2c\x1f\xa9\xca\xad\xb7\x98\x2d\xb0\x92\x9a\xb0\x3f\x85\x8e\x63\x9f\x8a\xf5\xef\x5b\x3b\x55\xba\x98\x5d\x83\xce\x8d\x76\xc5\x3e\x1b\x76\x97\x75\x35\xf1\x84\x16\x29\x8a\x22\x75\x54\xd3\x07\x7c\xf7\x05\xf8\x33\x64\xba\x48\x4d\x1e\x53\xab\xe9\x30\x72\x10\x98\x6c\xe0\x71\xc2\xfd\xbf\xf6\x23\x59\x94\xdb\xfe\x8f\xfd\xfa\x6a\x09\x95\x26\x01\x46\x7f\x2f\xb3\x38\x8e\x89\xb2\x7d\xb3\xbc\x5f\xae\x6f\x7f\x85\x05\x10\x59\x9c\x48\xaa\x37\x6a\xdc\x5f\xd5\x97\x1b\x84\x22\x8b\x59\x4c\x25\xcb\x7e\xfb\x87\xee\xd4\xe0\xd5\xa9\xa9\x7c\x6f\x68\x7c\x8b\xb3\x04\xb4\xcf\xc6\x1e\x6d\x99\x74\x83\xa1\x2f\xe7\xb4\x85\x44\x96\x25\xba\x28\x26\x7a\x39\x03\xee\x2e\x5c\x45\x96\xe7\x2a\x0b\xec\x0d\xfd\x0b\x39\x9b\xc9\xd3\xc9\x32\x91\x7a\xb1\x9d\xc5\xa3\x5b\xde\x87\x7b\x93\x61\x4a\x29\x74\xbf\x22\xea\xa1\x1f\x78\xf9\x54\x79\x5a\x90\x7e\x0a\x2d\xdf\xd6\x7a\x77\x12\x88\x5e\xbc\xa3\x8c\x5b\x66\xf6\x8e\x80\x23\x94\x96\x5f\x93\x74\x90\x0f\x8d\x33\x11\x67\xd4\xb8\x68\x0f\xad\xf3\x01\xd1\xd4\xb8\xba\x3a\x86\x9f\x29\x8c\xf2\x72\xba\x56\xb2\x75\x59\xef\xf7\xd0\x61\x43\x25\x8f\xd9\xeb\x9c\x49\x91\x91\xeb\xe9\xd5\xd3\xfa\x8f\xd5\xd3\xee\x69\xb5\x59\x3d\x7d\x5f\x39\xb9\x08\x7f\x4a\x95\x08\x22\x78\x1d\xb1\x31\x75\x73\xa0\xc2\x44\x12\x0e\x66\x22\xb6\x92\x6a\xa4\x88\x5b\xca\xd1\x86\x95\xa9\xc2\x08\x3e\x76\xe6\xba\x81\x72\x1f\x0e\x72\x49\xf2\x60\xd6\x98\x84\xd8\x8e\xe1\x10\x58\x84\xce\x93\xb5\xf0\x3c\x75\x2f\x75\x33\x12\x7e\xf4\xa3\x74\x8e\x18\xea\xfd\x8f\xf5\x4c\xf5\x53\x64\x3a\xe7\x84\x1d\xde\x55\xf8\xfe\x65\x50\xe5\xbe\x64\x52\xfc\x77\xfb\x7a\x22\xd3\x32\xcf\xe4\xa0\x15\xb8\xb3\x08\x3e\x6a\xa6\x3e\xd5\xfb\xfd\x2c\xee\xca\x8c\xe4\x45\x90\xdb\xb1\x26\xde\x57\x27\xfd\x8c\xe7\x16\x29\x22\x8f\xb8\xf2\xd2\x3c\xb6\xd1\x81\xda\x99\xe8\xfe\xe6\x47\x60\x06\xde\xfd\xf1\x01\x7f\x76\xe7\x90\x27\x91\x47\xc6\x8a\x93\x10\xaf\x85\x10\xa2\xcb\xaf\x37\xb3\x31\x31\x67\xb6\x59\xe0\x99\x07\x56\xe9\xe4\x12\x86\x4a\xe4\xb1\x4c\x41\x0d\x82\xea\x7a\x50\xc3\x76\x03\x92\x84\x13\xd0\xef\xe4\xe4\x7f\xe7\x12\x8d\xfd\x08\xcd\xcc\x20\xbc\xa7\x87\x8e\x42\x38\x87\xca\xa3\x6c\x90\x2f\x0d\xc4\x9f\x39\x8b\xd3\x0d\x4f\xd3\xd4\x7b\x37\x07\x44\x1f\xea\x33\x25\x1b\x91\x67\x91\x4d\x79\x40\x6b\x12\x88\x3a\xf8\xdc\xe7\x92\x6d\xf5\x7c\x19\xbd\xe0\x2f\x2f\xf2\x2c\xd6\x64\x11\xa8\xcb\xf6\x3f\x27\xd8\x97\xe6\xe3\xaa\xd4\xf3\x6f\xe5\xa2\x08\x44\xd4\x7e\x81\xfa\x56\xb5\x33\xa4\x94\xc8\xf3\x54\xd2\x22\xe1\xfe\x7a\x8d\x6f\xfe\x66\xe4\x80\x41\x0b\x76\xb8\xcd\x2c\xe3\x71\x34\xdf\x3d\xc6\x8c\x12\x91\x33\xc5\x23\xe6\xa5\xe4\x6f\xea\xe6\x75\xa8\x93\xe5\x4c\x23\x91\xe8\x4e\x23\x3d\xa7\x49\x3f\x20\xe7\x20\xf3\xc8\x42\xee\x68\x55\x9d\xb4\xe0\x45\xce\x8d\xa5\x2c\x4f\x84\xee\x2f\xf1\x55\x63\x3f\x73\x04\xd7\x46\x8f\xac\x97\xaf\xb0\x1b\x37\xbf\x72\x21\x75\x6c\x89\x0b\x13\x48\xef\x14\x40\x2d\x72\x10\x82\x5b\xd7\xc7\x6f\x21\xdd\xcd\x65\x21\x58\x10\x8f\x46\x68\x48\x55\xa8\x54\xb8\xac\xf5\xa4\xa0\x94\x4b\x89\xa4\x60\x6f\xca\x41\xa3\xe6\xea\xe3\xbe\xd6\x5b\xfc\xd9\x4d\xa7\xa9\x54\x5a\x8e\x65\x37\x7e\xc9\x8d\x10\xb9\x8a\x18\xc9\x40\x3e\x9f\x08\xe3\xd3\xce\x71\x9d\x22\x57\x26\x57\x01\xf4\x30\x40\x7f\xdc\x51\x9d\x03\x1b\xa9\x8f\x13\xce\x78\x3e\x04\x42\xeb\x90\x04\x22\x3c\x61\xf1\x72\x80\x91\x6b\x95\x2b\x13\x64\x53\xbe\xdf\x3e\xce\x4e\x87\x69\xe1\xd9\x59\x56\x99\xe6\x07\x58\x77\x6e\x7f\x57\x31\x17\xc4\xd5\x75\x8c\xb1\xef\xf5\xd9\xd4\x46\x2e\x40\xf9\x36\x0e\x54\x2d\x69\xad\x9e\x47\xe6\x39\x02\x23\xe4\xa5\xbb\xb8\x4f\x7e\xb0\x49\x0c\xa1\x42\x3a\xf4\x02\x39\xa2\x88\xa2\x28\x19\x5b\x2d\x2d\x8c\x09\x87\xd2\x98\xa0\xd9\xfd\xbd\xd8\xd9\xf7\x79\x3f\xdb\x16\x8a\x88\x59\xe9\x48\xef\x81\x3a\xdf\x16\xa8\x9c\xa1\x46\xb3\x72\xf5\xb3\xec\xa6\x2b\x71\x11\x8b\x98\xf0\xb8\x68\xdd\xe9\x46\xc2\x6f\xb3\x73\x25\xc6\x0a\x32\xed\x9e\x27\xb5\xe3\x22\xcd\x02\x90\x71\xf3\xe8\x83\xca\xe9\xef\x4c\x45\xca\x06\xcf\xaf\x7f\xd7\x07\x59\xce\x15\xbe\xfc\x48\x19\x53\x21\x9c\xba\x2f\x1e\xc7\x79\xf1\x7e\x16\xa9\xce\xa4\xf7\xeb\xf0\xb6\x9c\xae\x54\x3c\x5d\xd4\xdc\xf8\x2c\xb5\xe8\x69\xdb\xe5\x08\x1b\x4d\x91\xf1\xd8\x99\x68\x98\x53\xa5\xaf\x11\xf4\xbe\xac\x70\x10\x80\xe9\x47\x58\x3d\xdd\x67\x74\x0a\xf6\xd3\x3b\x98\xcb\x88\x7e\x88\x41\xf5\xb2\xd8\xef\x6f\xea\x26\x84\x9b\x57\x1f\xb6\xe4\x36\xfd\xe5\xb9\x44\xda\x28\x0f\xd4\x2e\x6a\x56\xdb\xaf\x72\x90\x0b\xed\x0f\x1b\xa6\x07\x44\x9d\x7f\x0f\x86\xe3\x2a\xa3\xda\xb7\xf2\x1a\x38\x0f\xd7\x8b\x75\x38\x68\x0a\x3b\x67\x4f\x47\xf2\xc7\x7b\x2b\xf7\xf8\x8c\x84\xee\x0d\x23\x34\xe5\x52\x77\xf0\xf3\x50\x52\xed\x73\x16\xfb\x9e\xe6\xc4\x6b\x51\x14\x91\x35\x77\x71\x62\xb9\x67\x68\x1c\x51\x14\xa9\x42\xe3\xab\x4f\x1d\xec\xa7\x91\xad\x1b\xc4\x62\x43\xf3\xd5\xa9\x91\x9e\x51\xa5\x44\xc1\xb2\x98\x05\x0e\xd4\x91\xae\xee\xfc\x85\x2b\x98\x32\x9e\x2a\x18\xc2\xd3\xc1\x8d\x62\x3a\x96\xa7\x39\x71\xeb\x08\x93\x6d\x91\xf5\xff\x3c\x61\xc8\x56\xfd\x28\x1e\x45\xde\xf6\xca\x2b\xf4\xf6\x0f\x72\x5f\xe2\x27\x5a\x3f\xe1\xf1\x73\x93\x14\x63\xab\xd1\xf1\x8a\x5c\x88\x88\x53\x15\x7a\x07\x1a\x8f\x63\x95\x4a\x51\x88\xc2\xc4\xe0\x6f\x86\xb3\x29\x98\x70\xb8\x45\x21\x44\xee\x25\x32\x1e\x6f\x77\xa8\xcb\x6e\x17\xa7\xd3\x1f\x2e\xc0\xb6\x2e\x1f\xd7\xcb\x2f\xfe\x63\x10\xc7\xa9\x9b\xaf\xcb\xf2\xf8\x72\x6e\x0a\xe8\xc7\xa5\x8c\xc2\x27\x22\x90\xf6\x1b\xd6\x50\x3f\x29\x80\x83\x64\xa3\xb5\xcf\x76\x04\x6f\x70\x7e\x7b\x01\x34\x95\xec\xea\x79\x14\x43\x4f\x37\x6c\xd7\x05\xa8\x94\x42\x89\xe7\x13\x3c\x9f\x7c\x5b\xa9\x90\x99\x35\x57\x94\x65\xb7\x3f\x1d\xb0\x6a\xaf\x71\x5f\xbe\x0d\xb4\x72\x51\xa8\x48\x51\xab\x08\x28\xd9\x5c\x9b\xbb\xfa\x2d\x98\x40\x8b\x42\x65\xb9\x8c\x43\xed\x99\xd4\x1d\xa7\x3f\x4f\x09\x5d\x98\xf0\xea\x36\xdd\xd7\xfa\xd4\x3c\xef\xa1\x9d\xe5\x64\x85\x32\x29\x75\xd9\xeb\x6a\xff\x71\x8d\x03\x48\xa3\xd0\x2c\xa3\x1e\x4d\xdb\xd5\xc7\x1f\x75\xf3\xea\xff\x8e\x09\xd3\xd6\x16\x72\xbc\x62\x5e\x4c\x0d\x0b\xcc\x18\xb5\x38\x36\x4e\xa3\xab\x39\x4c\xf6\x3f\x8f\x36\x1e\x6e\xbe\xc9\x22\x4a\x7e\x0e\x65\x85\x83\x5e\x4c\xff\x77\x20\x5b\x21\x9a\xf4\x94\x64\x78\xcd\x94\x4b\x2b\x1e\x4b\xb8\x5d\x28\x0e\x1e\x87\xe4\x5b\x96\x2c\xe5\x9a\x30\x83\xce\xa4\x78\x62\x92\x21\x58\x96\x2b\xcb\xe2\x7a\x81\xa6\xfc\xcf\xa8\x3d\xc2\x32\x23\x32\x35\xf0\x68\xcb\xff\x7e\x8a\x12\xfd\xcb\x7f\x7f\x99\x7a\xb0\x5c\xa5\x84\x88\xbd\xfe\xe3\x8f\xdd\xfa\x50\x95\xba\x4f\xed\xfc\x64\x62\x85\xc8\xd0\x85\x0a\x37\xe5\x1e\x2f\xe1\xe6\x05\x2b\x50\x80\xed\x6d\x77\xea\x65\xbc\x41\xf8\x6f\x4b\x93\xe9\xed\x62\x89\xe1\x6e\xae\xb8\x72\xde\xb8\x06\xc5\x18\xe7\xd4\x31\x5b\x5c\x3f\xae\x7f\x78\x00\xa3\x60\x4c\xf0\x74\x80\x85\xfd\x81\x78\x56\x49\x62\x9c\x01\xb5\x79\x2a\x7c\x9f\x19\xd6\x4e\x7f\x80\xe0\x48\xd1\x80\xeb\xc9\x1d\x1b\x2c\x55\x3d\xde\x1a\x98\x10\x8a\xcc\x7e\xfb\xd9\x38\x82\x0f\x30\x21\x70\xa2\xd1\xb1\xad\x37\x74\xe2\xd9\x2d\x11\x86\x51\xb2\xf9\xde\x6f\x3b\xfd\xf2\x7c\x53\x37\xbf\xaa\xe2\x30\x99\x16\x56\xe0\x94\x36\x6e\xca\x39\x7c\x14\x3c\xf9\xe5\x32\x43\x74\xe2\x5e\xdb\xda\x33\xfc\x3e\xe9\x0f\x33\x99\xe7\x94\x21\x9d\x7b\xef\xfb\xe2\x07\x93\x22\x23\x71\x92\x03\xea\xd2\xf6\x87\x5b\xa7\xb6\xe2\x0a\x9f\xb3\x33\x2a\x13\x76\x0d\x6a\xf1\x53\xc5\x77\x52\x6d\x62\x2a\xb5\xb7\x68\xa1\xf5\x97\xd2\x5c\xac\x93\x4c\x0d\xe4\xfc\xe7\x4c\x4a\x45\xfa\x7b\xac\x9e\xc7\xeb\x37\xd3\x99\x85\xaa\xb7\xd8\x3d\xdc\x6c\xe7\x44\xd9\xe9\x7d\xd4\x79\x4c\x32\x85\x2f\x7d\x3a\x32\x44\x16\x4c\x2b\xd4\x03\xf3\xeb\x0e\xde\x3f\x3e\x5b\xac\x99\x36\x40\x93\x83\x16\x6b\xbf\x45\x5d\xc0\x8d\x31\xe4\x06\xdc\xea\xbf\x7d\x41\x4f\x5f\xf2\xdf\x68\xe2\x98\x40\x4b\xf7\x65\x35\xac\xa3\x3c\x8a\xf3\xc8\xd9\xc0\x9c\x19\x03\x7d\x82\x72\x0d\x9f\x64\x94\x86\x5d\xaf\x7f\x3c\xec\xde\xcb\x6a\xd4\xe6\xe7\x49\x1c\x09\x27\xaf\x75\x0d\xe5\xfe\xe3\x7b\xdd\x2f\xf2\xfd\x42\x33\xb9\x3b\x3c\xc9\x80\x47\xa3\x28\xf8\x9c\x22\x2f\x78\xc2\x81\xc8\xbf\xc7\xa6\x3e\xd4\x8f\x70\x6a\xc3\xb7\xa4\x51\x44\xfc\xcb\xe7\x7a\xaf\xaf\x51\x51\xb3\x20\x1c\xe3\x52\x3b\x7e\xa3\x03\xa7\x90\x8a\xbe\x3f\x9c\x99\x48\xc5\xae\x19\x72\x8f\x6d\xdb\x87\x6a\x67\xae\xb1\xe3\x26\x1b\xcf\xa3\x8c\x2e\xe9\x50\x56\xa7\xf6\x86\x74\x9a\x56\xbf\xc2\x1e\xf0\x22\x96\xb4\x85\x9b\x7d\x5d\x37\xa8\x37\x27\xf9\xd9\x40\x2c\x32\xd7\xf1\x70\x13\x77\x7a\x9c\x09\x2b\x1a\x54\xc1\x01\x5f\xa0\x7d\x99\x84\x01\x9c\x17\x05\xed\x0c\x67\xe9\xdc\x74\x94\x02\x1e\x08\x7c\x9f\xc9\x7e\x0a\x2e\xb2\x2c\x09\x2e\xf3\xad\xd5\x99\xb3\x1d\xb2\x33\x6c\x41\xd8\xb3\xb8\xc8\x0b\x70\x8e\x3f\xeb\xbd\x93\x97\xba\xad\xbe\x96\xfd\xe4\xfb\x70\x9e\xa8\xd3\x2b\x02\x96\x50\xb6\x0a\x5a\x13\x7f\x9e\x44\x32\x6e\xa7\xdb\xa2\x6b\x23\x8c\x0a\xbc\x93\xe0\x8b\x03\x4b\x89\x38\x4a\x56\xdf\xd7\x27\x1c\x2d\x8a\x1c\x64\x41\xf5\xea\xb6\x82\x63\xfb\x52\x4f\x3a\x0a\x1c\x90\x13\xeb\xe1\x09\x09\x9d\x3c\x08\x48\x5c\x6a\x02\x72\x29\xac\x30\x7b\xd9\xae\xaa\xfa\xf4\xfc\x32\x0c\xbf\x80\x74\xe4\xd2\xe4\x24\xeb\xe6\x0a\x3c\x3e\x22\x5a\x9b\xd5\xf6\xeb\xe5\x05\x82\x2b\x9e\x52\x2d\xb3\xaa\x83\x44\xe7\xe3\x05\x4e\xc4\x8c\x3a\x28\xb8\x96\x86\x92\x2f\x97\xbd\x7d\x66\xaa\x3d\xbb\x1c\x8d\x48\x55\x2c\xeb\xd7\xaf\xea\x66\xa8\x9d\x70\x4c\x33\xab\x23\x65\x37\x21\x8a\x54\x06\x89\xb7\x30\xaa\xc8\x09\xa6\x2d\xfb\xcd\xd5\x82\x2a\xad\x12\xd8\x69\xe4\x8c\xf8\xb9\xb9\xe4\xac\xec\xc1\x91\x5b\x66\x48\x8b\x1d\xc9\x16\xfe\xba\x1a\xc1\x51\x5a\x13\xba\xa0\xfc\x85\x97\xac\x10\xfc\x60\x6d\x0b\x45\x47\x5b\x20\xf7\x36\x4b\x93\xdd\x81\x9b\x88\x59\x6d\xc1\xf6\x09\xff\xd7\x0a\x8b\x4e\xcf\x62\x64\x96\x7b\x26\x00\xe2\x58\x65\xa8\x5d\x90\x89\x44\x77\x6a\xb7\x2f\x0d\xb6\xfd\x12\x1f\x6e\x93\x51\x16\xc7\x7c\xf7\xb1\xff\x2b\xf3\x3a\x21\xa2\x38\xd7\xc2\x93\x29\xaf\x4e\x4d\x85\x7a\x6d\x82\x58\x52\xf8\x29\x22\xca\x54\xe4\x54\x75\xeb\xb6\xec\x26\x85\x2d\x11\xe5\x52\x4b\x4f\x33\xbe\xa9\x9d\x89\xb6\x72\x58\xf9\xa0\x8c\x26\x44\x2c\xa5\xa3\x7e\xbf\xe2\xe6\x88\xcd\xac\x62\x23\x62\x93\x07\x1b\xa8\xb2\x7a\xee\x97\x38\x4a\x88\xea\x41\x51\x54\x88\x24\xc9\xac\x45\x67\x83\x3f\xc7\x9b\xa3\x48\x84\xed\x0a\xf8\xc9\x2c\xc7\xca\x6b\x42\x24\xce\x39\x47\x0d\x70\x96\x7b\xf8\xd9\xef\x0c\x17\x9f\xa1\x48\x63\xa4\x4b\xfe\xe7\x8f\xba\xd6\xd7\x8b\xf5\x5f\xb3\x42\x85\x48\x0b\x45\x5a\xa9\x37\x77\x68\xcd\x1c\x2f\x46\x23\x22\x45\xce\x1c\x33\x66\x83\xfb\xbd\xaf\xad\xcd\xee\x79\x96\x58\xa2\xab\x83\x7f\x6c\xe0\x00\x4d\xd9\x41\x35\xe9\xc3\x8a\x0c\x22\xc2\xa5\x5c\x6f\x7c\x91\x21\x3c\x97\x9c\x21\x55\x4f\x2a\x7c\x27\x40\xe7\x54\x31\x6f\xfa\x65\x39\xb7\x3e\x8a\x8f\x4f\xab\xcd\xe2\x6e\x65\x1b\x7d\xbb\xdb\x87\xdd\x8f\xd5\x6d\x38\x9f\xc8\x52\xe1\x97\xf2\x5d\xf3\x32\x12\x86\x99\x16\x71\x45\x2e\x80\xb6\xac\xdf\x97\x3f\x96\x7f\x3d\x09\x73\x34\x5e\x07\xf7\x85\xfc\x2c\x34\x4e\x80\x35\xa2\x80\x82\x52\x87\xfb\xcd\xe3\x63\x1f\x8a\xd8\x3e\xe7\xfd\xd8\x61\xf2\x93\x7f\xfd\x09\xa4\x85\xf6\x5e\x95\xdd\xf2\xa5\x6e\xf4\x19\xe1\xcc\x8f\xc3\x88\x60\x1c\xd6\xe2\xef\x76\xbb\xde\x1d\xfa\x1f\x34\x11\xf8\x13\x82\x33\x93\x86\x2d\x6d\x31\x93\x53\x13\x82\x0b\xe5\xe5\x8d\x96\xa6\x5c\xb5\x5d\x79\xc1\xb6\x47\x08\x11\x15\xd6\x73\x8c\x84\xfd\xae\x3a\xe5\x3f\x2f\x44\x66\x35\xc0\x4f\x72\x62\x33\x36\x7d\x60\x10\xc5\xbe\x40\x74\x35\x7c\x37\xe4\x40\xaa\x0f\x64\xa0\xb4\xaf\xd5\xeb\xee\x2d\x21\xbf\x75\xf7\xe1\x30\x0e\x0b\x2a\x4c\x99\x7d\xfd\x8e\xcd\x62\x2c\xeb\xd7\x1f\xb4\x4e\x40\x65\xfb\x63\x52\xe3\x16\x52\xe4\xa4\xf3\xa2\xbc\x86\xd6\x7b\xd5\x76\x2f\x65\x7b\x80\xea\xe3\x31\xbd\xf6\xc3\x54\xa6\x98\x6b\x92\x2d\xe1\xd8\x9e\x13\x6a\xfd\x1a\x2c\x14\x03\xca\x16\x4d\x83\x68\x5b\xfb\x3e\xb2\x71\x03\xb4\x52\xca\xed\xf0\x5b\x84\x83\xcd\x91\x6c\xdc\x1b\x86\x68\x8c\x98\x8b\xb7\x46\xbc\x1d\x21\x30\x02\x12\xb7\xdc\x97\x6d\xf7\x08\x65\xd8\x48\x04\x66\x31\x35\x81\x25\xa8\x57\x0c\xc5\x59\x61\xb2\x08\x68\x2d\x7c\x69\xea\xf7\xf6\xc7\x0b\x56\x8e\xad\x5a\x56\xcf\x0f\x75\xb7\xaa\x34\xea\x11\x30\x1a\xa2\xc8\x50\x21\xe0\x56\x8d\x7d\x22\x05\x44\x49\x5e\x78\xd7\x11\xac\xda\xba\xf9\xac\x9c\x08\x51\x1a\x51\xd5\xad\x2b\x8f\x77\xb5\x7a\x25\x12\xeb\x34\xb2\x86\x48\x19\x0b\xf7\xa1\x54\x6f\xf9\x02\x87\x63\xfb\x30\x96\xa6\xbf\x14\x3b\x40\x9c\x39\xa4\x49\x59\xbd\x6e\x70\xef\x0b\xbc\x90\x48\xdb\xe0\x82\xf6\xe0\x64\x1a\xa7\x9f\x4b\x39\x67\x56\xcc\xd7\xc6\xfa\x33\x95\xb0\xcb\x57\x91\x72\x43\xf7\xd9\x20\xea\x38\x8a\x16\xfd\xde\x3d\x2b\xe4\x42\x2a\x18\x73\x1b\x62\xbf\xd5\xf5\xf3\xca\x33\x42\xc2\x08\x9b\x3a\x5b\x9b\x92\x85\x0e\x51\xd1\x04\xd1\x31\x59\x38\x20\x95\x88\x66\x64\xed\xfb\xed\xe9\xf6\x62\x89\x17\xb2\x2c\x4d\x87\xbb\xb8\xf2\xa6\x50\xbf\x5c\xcc\x21\xcf\x18\xf5\xcc\x5d\x89\x7d\x51\x69\x32\xa9\xba\x88\x75\x9d\xfe\xae\x3c\xcf\x55\x14\x14\xe2\x2d\x2b\xfe\x93\xef\xc8\x25\xa1\xf3\xdf\xea\x0e\x1f\x1b\x0c\xfd\x87\xe9\xa8\x42\x58\x0c\x36\x75\x2e\xcf\x10\x5b\xc0\x62\xab\x84\xd2\x67\xc2\xd0\xbe\x5e\x5e\xe7\xff\x5e\x11\x04\x58\x6c\xc8\x12\xd0\x20\xb6\x8f\x4d\x6d\xca\x6e\xa2\xf7\x21\x80\x69\x29\x2d\xaa\x84\x2a\xc1\x4f\x64\xb8\xda\x0e\x47\x2d\x67\xef\xf1\x69\xb5\xbb\x5d\xae\x77\x9b\xdb\x07\xef\xa0\x2d\x80\xeb\x94\x34\x08\xeb\x0a\x57\x21\x0c\x02\x91\x01\x55\x0e\x77\xb6\xc0\xd3\xe1\x72\x0f\xe5\xe1\xb7\x4b\xcd\x41\x10\x4c\x52\x69\x6d\x47\xfd\xde\x0e\x9f\xeb\xe6\xe3\x56\xcf\xaa\x30\x00\xa9\x56\x66\x94\x81\xf9\xcc\xd5\x7f\x23\x14\x42\x0d\x82\xd9\x37\xfb\x32\xc8\xe6\x08\x00\x26\x09\x04\xb6\x3b\x94\x33\x47\x15\x01\x32\x8f\x48\xcd\xea\x76\x83\xf8\xbd\x2e\xd5\x84\xed\x04\x92\x43\x94\x0e\x9d\xeb\xe9\x42\x06\x92\x5b\x4c\xa9\x76\x9c\x97\xc5\x99\x81\xf4\xec\xbb\x40\x80\xb4\xb0\x1a\x1b\x6c\xcd\x58\x44\x6e\x98\x4a\xad\xfd\x43\x43\xe4\x0d\x8d\xcd\x24\x32\x03\x1d\x2b\x9f\xe0\x7d\x6b\xb1\xb1\xb6\xe5\x17\xfb\x25\xa0\xb9\x7d\x97\xb6\x57\x9b\xed\x1f\x71\x38\x01\xb7\xc2\xe3\x16\x12\x4c\xf0\xe3\xd0\x1c\xbd\x40\xc6\x14\xa0\x85\x26\x1c\x11\x51\x8a\xc8\x3f\x7d\x1a\x44\x00\x26\x82\x34\x3b\x09\x52\xb6\x4b\x77\x76\x89\xd9\xd4\xfb\xb0\x12\xa0\xc8\xc8\xfc\xc5\x0a\xd6\x10\xc9\x85\x34\x99\x3e\x0b\xd0\x3f\x99\xc9\x08\x3c\xf7\xa5\x35\xf8\x49\xe4\xcc\xe9\x6b\x63\xa2\x38\xb3\x8d\x30\x53\xee\xf7\x13\x9d\x5e\x01\x26\x93\x31\x09\xb3\xd7\xf8\x73\x54\x8d\x04\xc3\xad\x8a\xea\xb8\x29\x39\x99\xa3\x32\x4a\x32\xfa\xde\xbb\x3a\x6c\x9c\x32\x52\x48\x11\xc3\xf5\xf2\xfb\x78\xce\xc8\x38\xd5\xc4\x56\x36\xa7\x4a\x37\x50\xf6\x41\xaf\x65\xec\x8d\x9b\xf7\x32\x66\xd6\x6f\x64\xb7\xdb\x1d\xfb\xbb\x61\xf3\x62\x77\x30\x49\x20\xd3\x41\x2d\xd1\xd2\xc3\xc3\xb1\x34\xf2\x5a\xd1\x14\x60\x6e\x8e\xe8\x68\x61\x23\x37\x38\x21\x93\xdc\x92\xcf\x70\x04\x04\xbc\x55\x75\x38\xdc\x07\x60\xfd\x6b\xdb\x94\xcf\xfd\x86\x38\x2a\xb7\xc8\x34\x42\x52\x33\x87\x3e\x99\x5e\xd9\x84\x70\x3a\xb1\x64\xc6\x2d\x23\xfb\xee\x76\x71\x75\x7b\x77\xbb\xbd\x5d\x6d\xfc\xa7\xf3\x22\x27\x2e\x93\x2d\x45\x59\x64\xed\xe6\x74\xb8\xbc\x5b\xca\xdc\xa1\x33\xfc\x8c\xf8\xa5\x98\xb3\x90\x85\xeb\xbd\xed\x1c\xfd\xc5\x7f\x29\x73\xf2\xbc\x2d\xee\xf7\x5f\xb0\xc2\x4f\x78\x6a\x92\x29\xcb\xa1\x06\xad\x6f\xad\x74\xe7\x6d\x87\x67\xbf\xed\x1f\x17\x21\x0e\xee\x14\xbc\x30\x3c\xf3\x16\x8e\xd5\x7f\xcb\x0b\x42\xc5\x42\x72\x4c\x29\x36\x75\x7a\x9d\xd8\xdf\xc5\x49\xa1\x45\x72\xc3\x98\x93\xbb\x38\xd6\x4e\x47\xfb\x0d\x9b\x8f\x3f\xd0\x67\x01\x12\x32\xc8\x26\x1a\x85\x07\x28\xf7\xd3\xb3\xc8\xc8\x52\xae\xfb\x28\x1b\x0f\xe5\xa0\x8d\x2a\xa4\x4c\x63\x8a\x43\x6e\x1a\xd4\x93\xf9\x29\x59\x4c\xa1\x8c\xad\xc5\x7e\xb1\xd8\xc0\x70\x50\x24\x1e\x2f\x3b\x80\x2b\xa4\x14\x96\xaf\x57\xb6\x54\x16\xdd\x1c\x41\xe1\x15\x74\x41\xd1\x5a\x48\x15\x5b\x33\x4d\x52\xe7\x1d\x32\x45\x27\xef\x3c\x7d\x08\x2a\x8b\x88\x18\xa0\xf1\x0d\xf7\x75\x1f\x1b\x6c\xbd\xe4\x80\x0a\x9c\xf9\x7e\x98\x95\xe5\xb4\x2a\xe6\x83\xa2\xb0\x3f\x2c\x22\x42\x90\x3f\x62\xb3\x9f\x5c\x9f\x8e\xad\x81\x04\x89\x95\xcc\x98\x7b\x52\xa7\x5c\x64\xd4\x42\xa9\xf4\xd4\x5e\x6e\x36\x53\x74\x6e\x79\x1d\x2f\x81\x6b\x2f\xa4\x16\x1c\xb2\xb0\x70\x0e\x30\x13\x89\x32\x8a\xdd\x06\xab\xf3\x68\xf6\x95\x26\xe1\x56\x8c\xa6\x82\x4a\xbd\x84\x0a\xaa\x34\x05\x66\x14\x27\x9f\xba\x93\x6d\x9f\x8c\xe9\x2a\x2a\x32\x8c\xb9\xde\x84\xab\xac\xdc\x87\x38\xc0\x2d\xcc\x2a\x8e\x23\x8b\xa4\xfc\x2f\x01\x2c\x57\x43\xb1\x6f\x7a\x35\x2a\x4e\x94\xe7\xf2\x3d\x58\x0f\xbf\x03\x56\x63\xe2\xa0\x8a\xc1\x2a\x33\x51\xd1\xe0\xb6\x6d\x4f\xfd\xc2\x39\x62\x6e\xa9\x24\xc7\xc2\x99\xca\x51\xab\x68\xf5\xd3\xf1\xca\xc3\x00\xc9\x48\xdd\xfe\xfe\xf6\x61\xb9\x7e\xd8\x3e\xdd\x5e\x7d\x1b\x0c\x41\x84\x4a\xb9\xa4\xa8\xbf\x6c\x5d\x66\x62\x49\x8e\xfe\x76\xa8\x0c\x12\x0a\x53\xcb\xf6\x3b\x76\x67\x9b\xa2\xca\xa4\x4c\xe4\xa0\x8c\x76\xde\xa0\x55\x99\xe1\x84\xc4\xfc\x82\xa1\xf4\x45\x5d\xf6\x2d\x36\x87\x92\x30\x81\xeb\x3f\xfc\x97\xe5\xb1\x24\x7d\x46\x68\x5b\x6c\xba\x0d\x54\xf8\x75\x7b\xb7\x0c\x37\x6f\x72\xde\x1c\xad\x4b\xb2\x2b\x8d\x8d\xdb\xb2\x2a\x47\xe9\xbd\x05\x82\x7d\xf2\x5d\xfd\x5c\xaa\x19\xe5\x40\x15\x09\xd0\x0c\x59\x3f\xac\xc6\xb2\xd6\xfd\x01\x45\xf5\xa0\x37\xa8\x24\xfe\xec\xf3\xa1\x29\x4a\x5e\xb1\xb8\x10\xc1\x79\xd3\x9b\xd2\x5e\xde\x3b\xa7\x77\x8c\x25\x92\x42\x78\x6a\xfc\xdc\x56\x24\xc9\x5b\x84\xb3\x16\x39\xcd\xae\xda\x6f\xfc\x8b\x59\x07\x5d\x89\x24\x41\x87\xc3\xa1\x7e\x37\x7e\x81\xf6\x02\x1f\x47\x09\x96\x6b\x33\x98\xe3\xcd\xdd\xce\x26\xfb\xa8\x12\x42\x53\x1d\x6b\xd7\x76\xb0\xc7\x03\x8c\x2a\x8d\x6e\x04\x64\xe1\x8e\x7a\x7b\xc7\x7e\x97\x1b\x77\x77\xc2\xd9\xa0\xb0\x65\x77\xbb\x92\xdd\xc1\x41\xd6\x17\xd3\x1a\xdf\x0e\x52\x32\x49\x68\x67\x93\x54\x7c\x7b\x24\xc2\x9d\xff\x62\x95\x19\x91\x8f\x44\x2f\xb7\x9b\xd9\x85\xaa\x3c\x27\x76\x79\x47\x02\x63\xe3\x65\x58\x61\x06\x44\x81\x7a\xba\x5b\x3e\x62\xb3\x59\x6c\xd7\x9b\xaf\x3e\x38\x52\x28\x99\x74\x76\x23\x36\x56\x21\xfc\xa9\x47\x83\x2a\x13\xa5\x24\x21\x6a\x53\xa7\xe6\x8f\x0b\xdc\xa2\x5f\xd6\x41\x94\xe1\xcc\x02\x7c\x1b\xa0\x9b\xd5\x07\xaa\x3e\x3a\x6e\xc6\x73\x4d\x47\x89\xf4\x52\xee\x4f\x70\xd0\xf5\xa1\x1a\xe6\x99\x8e\x52\x4d\xf3\xec\xc6\xee\xac\xdf\xaa\xb1\x5b\xc8\x74\x39\xd1\x91\x8c\x29\x15\xfd\x5e\xe2\xbb\x67\xc6\x4e\xdf\x57\x1d\x49\x6b\xc7\xf4\x80\xb5\x2e\x4f\x87\x07\xec\xde\x87\xae\xb7\x8e\x63\x15\xf7\x9b\xd3\xbf\xfb\xd8\x64\xf2\x1b\x93\x38\x22\x35\xd1\xc5\xf5\xea\x62\x71\xce\x0f\xcb\x03\x2d\xe3\xd1\x8a\x64\x8c\x22\x18\x9d\xe8\xc8\xd3\xc7\x37\xd8\xbc\xf5\xf3\xc7\x56\x6b\x2f\x90\x35\x75\x1a\x6b\xb2\x57\x07\xad\x1f\x29\x4f\xbd\x68\xc3\x2e\x74\x9a\x9a\xd8\x8d\x7b\xb2\x05\xf9\x4f\xee\x4e\xca\x6c\x90\x71\x3c\xb5\x2f\xd4\xf4\x98\xf5\x71\x75\xaa\xa4\x76\x32\xe3\x96\x10\x79\x8d\xfb\x79\x76\xad\xb3\x3c\xa6\x64\x21\xe0\x4d\x69\xeb\x6d\x2f\x08\x03\xf7\x63\xed\x4f\xdb\x59\x5c\xaf\xeb\xd9\x4e\x5e\x3d\x9d\x15\x11\xe5\x9b\x36\x79\x7d\xbe\x2c\xde\xa0\xf3\x4c\x26\x71\x28\x83\xd9\x5f\xfd\xf7\x9a\x01\xba\x88\xa2\x42\x78\x7b\xab\xdf\x2e\xac\xa4\xba\x88\x34\x15\x57\x48\x90\x08\x2f\xe1\x29\x75\x91\x31\x9a\xa2\xd7\xf8\x76\x53\x37\x0a\x07\x79\x61\xa1\x0b\x66\x81\x76\xf5\xa9\xd9\x75\x7f\x43\xd8\xd6\x7f\x4c\x46\xe4\x44\xf5\x19\x42\xf1\xbc\x84\xa5\x0b\x9d\x12\x4d\xfb\x01\xdf\x97\xa7\xe3\x65\x46\xb9\x66\x99\x52\x79\x58\x7d\x7e\xaf\xd5\x2b\x9e\x13\xca\xff\xff\xf5\xef\xf4\x56\x33\x66\xa5\xe2\xfa\xbd\x7c\x04\xb6\xd1\x8c\x23\xa9\x08\xaf\xb6\xcb\xbb\x5a\x51\x95\xef\xe2\x9a\xa1\x19\x37\x94\xb9\xda\xfd\x6f\xf5\x9f\xcc\x4e\x96\xcc\x5e\x62\xe6\x47\x81\xa4\x18\xd5\x99\xea\xf7\x81\xb5\xeb\xcb\x30\x7f\xa7\x18\x0a\x65\x53\x60\x55\x6b\xd4\xb6\x77\xe3\x8e\xf1\xcc\x36\x63\x64\x49\x22\x9e\x9b\x03\x34\xdd\xad\xc6\xaa\x23\x6b\xcd\xc9\xbd\xe4\x0c\x5c\xb5\xd8\xcd\x39\x07\x60\xff\xef\x27\x72\x5e\x42\x73\xc1\x28\x0c\xa7\x1c\xf0\x61\xec\x61\x26\x34\xd7\x90\xd8\x26\xcc\x20\xea\x2c\xb4\x48\x84\x2e\x86\x08\xa2\x3f\xe4\xd6\xba\xd6\xa7\xc6\x1a\xf2\x84\x78\x8d\xcf\x0d\x0e\xd8\xe3\x49\x1d\x48\x43\x6e\x0d\x81\xfa\x2d\xbf\x86\x46\x5f\xd2\x2b\x14\x5a\xe6\x56\x18\xba\xaa\xfb\x24\x7d\x12\x80\x6b\x09\x11\x61\x73\xbf\x2c\xfd\x5f\x54\x51\x90\x24\xd7\x97\xed\xaf\x6a\xea\x5a\x47\xc8\xfd\x57\xf7\xab\xb3\x7a\x81\xb2\xfa\x8a\xe0\xb3\x6c\xad\x63\x46\x5c\x38\x20\x93\xc5\xc7\xc6\xf5\xf5\xa7\x77\x4e\x33\x99\x3a\xe3\xef\x4d\x50\xed\x13\x5a\xab\x9c\xa7\x7e\x45\xed\xc3\x82\x6e\x30\xb0\xf7\xe8\x64\x8d\x59\x9c\xb9\xd2\xed\x8f\xb2\x9a\x06\xec\x1a\x45\x42\x49\xd8\xd3\xea\x61\xe5\xeb\x43\xda\x44\x05\xe1\xbf\xb6\xb7\xc3\x9f\xd2\x84\x4e\x62\x5d\x47\x9c\xd4\x8b\x13\xdc\x98\x71\x01\xb4\xc9\x23\x0a\xc3\xf7\xf5\x73\x7d\xea\xce\xc1\xea\xda\x68\xc5\x46\xba\x3b\x8f\x1f\x0d\x1c\x4a\xff\x50\x16\xc7\x3e\xb7\x2e\xfb\x38\x23\x34\x57\xb4\xc1\x94\x24\xbd\x76\xb4\xc6\xf5\xf9\xdf\x1c\x84\x88\x11\x78\x27\x90\x3e\x18\x0e\x59\x33\x46\x20\x30\x74\x2b\xaf\xca\xb9\xe7\x98\xc0\x18\x62\xca\xba\xdd\x9e\x14\x8a\x54\xbf\x5c\xa1\x30\x56\xd6\x70\x63\x79\xfd\x18\x02\x21\x4c\xb2\x9c\x60\xbe\xff\xc6\xe3\x72\x5f\x9f\x74\xf8\x7b\x1e\x53\x7a\x23\x4b\x7d\x5b\x4d\x8b\xfc\x98\x18\x27\x83\xae\x75\xc8\xc2\x06\xe9\xa5\xc9\x8d\xc3\x2c\x16\x04\x8d\xf1\x70\xc3\xbb\xba\x7a\xee\x43\x65\x7a\x27\x28\x24\xb4\xa4\x0b\x7f\xee\x9c\x33\xb0\xd0\x93\x43\xa9\xca\x20\xd9\x83\x05\x44\xc4\x19\x5c\x2d\x36\xdb\xc5\xf5\x46\x91\xb9\xa9\x8f\x2a\x90\x39\xb6\xf6\x33\x76\xdf\x4b\x8d\xf5\x17\x38\xa0\xd7\x01\x9d\xde\x04\xc6\x73\xc2\x62\x59\x4d\x13\x42\x8f\xbc\x79\x1d\x46\x81\x4c\x5b\xcd\xfa\x06\x41\xbd\x7c\xa9\x47\x07\x9c\xa7\xc8\x33\xf6\x9f\x49\xf2\xe2\x1e\x3c\xde\x1d\x79\x94\x51\x91\xc3\x9c\xf6\x7b\x53\xee\xf7\x0b\xfd\x56\xb6\xc1\x3b\x43\xa0\x88\x15\xd5\x45\x3b\x27\x53\x3c\xfc\x6c\xc1\x44\x70\x81\xfb\xcf\x09\x1a\x9c\x04\xa1\x7e\x90\x60\xa4\xde\x70\x8f\x1d\x68\xe8\xc0\xee\xe5\x67\x7d\x81\xc9\x3b\x8c\x42\x59\x95\x3d\xbb\x6b\x5c\xd5\xf5\xab\x87\x57\x9d\x63\x13\xc6\xff\x9c\x6d\x02\xd8\x2f\xbe\x49\x00\xae\x07\xa8\xf0\xec\xb6\x0a\xe4\xb9\xcd\x9b\x40\x2f\xf6\xfb\xfe\x0d\x0a\x57\x09\x45\x4a\x90\x56\x87\xf6\x7a\x6c\xd0\x32\x58\xc7\xd8\x95\xec\x13\xb9\xf8\x8b\x61\x19\x4a\xa5\x3d\x75\xc7\x52\x69\xfb\xef\x23\xe1\x8b\x8b\xab\x38\xaa\x42\xa9\x91\x6e\xcc\x58\x20\xdf\x8f\xc0\x82\xa8\x88\xae\x90\x4c\x36\x11\x93\xbd\x03\x95\xc9\xe2\xa1\xe0\x44\xd3\xf7\xf2\x8c\xd7\x31\x23\x79\xdf\xa0\xc9\xe0\xa6\xea\xf4\x0b\xfb\x40\x89\xd9\x7e\x75\xd0\xe1\xe8\xb3\x7a\x42\xb2\x58\xc5\xea\x72\x4f\xbe\x58\xed\x11\x14\x5e\xac\x69\xa3\xce\x0b\x96\x86\xe4\xfd\x74\xac\xab\x01\xce\x1a\x7a\xb9\xa8\x8d\x55\x56\xfb\xb9\xeb\x17\xf1\xe1\xd5\xc7\x14\x89\x81\xff\x85\x0c\x0a\x76\x36\x0f\x52\x1f\x3b\x27\xfc\x15\x86\xb1\x1c\x2c\xd3\x56\x9d\xfa\x74\xfe\xb6\x9b\xcc\xa3\x22\x1b\xe9\xa3\x4e\x2b\x5a\x93\x19\x89\x4a\x13\x1e\xb1\x6c\xa9\x5a\x15\x08\x27\x9f\x3c\x62\x34\x19\x6d\x1f\x2f\xd0\x7e\xaf\xcf\xf2\x74\x34\xae\xae\x59\xb6\xbb\x0a\x0e\xb8\x3b\xcd\x9d\xd2\x05\x1a\x25\xb9\xa5\xb8\x80\x6f\x44\xf8\x29\x69\xa2\x54\xc3\xd4\xdd\xbf\xcf\xf4\x47\xb1\xbd\x89\x0c\x52\x82\xb0\x87\x83\xc6\x6a\x0b\x27\x7f\x20\xce\x20\x71\x1d\x13\x4a\x8f\x37\xe5\xf3\x05\xc3\xb2\x7e\x9c\xd5\x66\x27\xa4\xf1\x06\xbb\x31\x55\xda\xb6\x84\x27\x17\x6c\x12\x2e\x08\x39\xfc\x97\x82\xa6\x7f\xaf\x1b\x63\x12\xa1\x1d\xfd\xaf\x6b\x4a\x7c\x9b\xf5\xe3\xfc\x20\x59\x50\xdf\xd2\x16\x76\x97\xcb\x5f\xc5\x05\x26\x8d\x10\x6c\x85\xa9\x24\xa1\xd0\x8d\x6f\x29\xdd\xe1\x1b\x06\x10\x9b\x49\x13\x41\x19\xc0\x1e\xda\xce\xce\xfd\xba\x79\x84\x0f\xd4\xeb\x53\x17\xc6\x80\xa6\xa2\x41\x9f\x75\x50\x9e\x3a\xfb\x5d\x59\x11\x67\x7a\x00\xc1\xf8\xc0\xc9\x64\xc6\xb2\xf0\x29\x39\xb2\xb0\xcd\xcb\xd9\x91\xc9\x79\x24\xad\xc4\xff\xbe\x7c\x0b\x50\x5c\x93\x2b\x20\xfe\xd6\x97\xbb\xab\x71\xb0\x64\x8a\x4c\xbb\x58\xee\x56\x59\xbc\x9e\x0e\x87\x38\x8a\x81\xbc\xdf\xa7\xbd\x9b\xb3\xee\xbf\x29\x94\x7b\x9d\x9d\x3e\x4d\xf7\x32\x2e\x93\x1b\x16\xd9\xd3\x53\x17\x8e\x92\xba\xc1\x1a\xe7\x33\xb0\x94\x61\x85\x35\x33\xd5\x08\xdd\x8b\x25\xad\xef\x4a\x5f\x2c\x35\x3c\xd2\x04\xbf\x31\x88\xcd\x68\xde\xf2\x8c\xf9\x8d\xea\x69\xf0\x43\xf6\x2f\xeb\x70\x72\xae\x14\x01\xca\x9c\x64\xe1\xe2\x19\x2b\xb7\x96\xfa\x33\x89\x28\xa6\x09\x69\x5c\x31\x68\x9a\x9f\xf8\x41\x8e\xab\xff\x5e\x37\x9a\xc2\xbc\xc9\x8c\x11\x45\x4a\x38\xcd\xab\xd5\xf6\xeb\x05\x94\xa4\x11\x32\xa5\xdc\xe6\x19\x3b\xb2\x9c\x9c\x36\x52\x0c\x14\x86\xee\xfc\xbb\x75\xb8\x6f\xaf\xa0\x25\xfd\x0c\x7f\x58\x44\xc4\x63\xb2\x06\x2b\xd3\x1f\x2f\xe3\xa2\x18\x60\xce\xf7\xf0\xf3\xca\xc6\xee\xd7\x67\x58\x19\x23\x21\xa5\xd8\x0f\xf6\xfd\xe6\xf5\xf1\x15\x9a\x37\x0c\x1a\x78\xe1\xcb\xa4\x4c\x12\x2b\x61\x69\xeb\x36\x76\xd1\xa4\xf8\x01\xdb\xee\x52\xba\x6c\x54\x0c\x18\x0d\x25\xab\x2d\x6d\x2a\xb3\x21\xa9\x22\xb6\xa7\x3c\x35\xd5\x0f\x68\x9a\xb2\x6e\xe6\x23\x58\x44\x2e\x12\x74\xd3\x9d\xd4\x72\x32\x2e\x0e\x1a\xc5\x0d\xc5\x07\xa5\xad\x6f\x3b\x03\x98\xd9\x6a\x68\x94\x48\x43\x3e\xe1\x4b\x88\xfd\x22\x34\x7d\x20\x0a\x04\x85\x88\xa0\xd4\xe9\x40\xe5\x00\xbd\x33\x03\xa7\xde\x28\x0d\x64\x2d\xfb\x08\x1f\x8f\xd8\x7c\x2f\xf1\xdd\x1f\xd1\x91\x15\x91\x27\xd2\x5f\x9f\x77\x9f\x01\x83\x67\x13\x50\xf3\x24\x76\x2e\x02\xd5\x65\xeb\x07\x61\x30\x37\xd4\x46\xef\x9f\xdc\x23\xbc\x87\x87\x81\x5c\x50\x91\xd7\xf5\x4b\x6d\x99\xd2\x1d\x33\x59\x4e\x49\xf5\xe3\xcd\x66\xf8\x93\x64\xb9\xf3\x27\xa9\x86\x8b\x31\x06\xa9\xd5\xee\x33\xf6\x6d\x4d\x4a\xcf\x93\x07\x00\x51\xc4\xb8\xb4\xab\xde\x06\x2f\x93\xe9\x21\x8a\x78\x16\x59\x54\x0f\xec\xf7\x58\x3d\xe3\xee\x38\x32\x9c\x84\x28\x12\x89\xa4\xbe\x1e\xbc\x62\xd3\xbe\xb5\xd6\x0f\xbb\x0d\x87\x11\x29\xd6\xbe\x7d\x78\x58\x8f\x56\x25\x88\xe2\x3c\xb7\x98\xa2\x3e\x81\xd6\xb3\x1f\x16\x83\xce\x46\xbc\x2b\xa7\xb7\x19\x0e\xda\x53\x6e\x4e\x47\x6c\xaa\xfa\x0d\xc2\x01\xa9\x08\x97\x1d\x6e\xb9\x0b\x62\xca\xf6\x8e\x88\xba\xbf\x4d\xaf\x2c\x89\x52\x0b\x55\x2f\x9b\xfd\xfa\x18\x7e\x71\x12\x09\xdb\x08\x0b\x7c\xd5\x75\x65\xdd\x62\xc2\x08\xc6\x6d\x00\x6a\x17\xc4\x3e\xec\x1d\x0e\x09\xaa\xe0\x6b\xec\xa8\x66\x8e\xd7\x65\x4b\x65\xb3\x3e\x78\x51\x2f\xe8\xc7\xa5\x71\x4a\x9b\x53\xd9\xd1\x0a\x47\x61\xc3\xec\x1e\xa4\xb9\xad\xb4\xee\x9e\x9d\x28\xce\xc3\xcd\x76\x39\xae\xc0\xb9\x71\x99\xd6\x24\xd3\xb6\x7d\x81\xaa\x6e\xff\xbc\x88\x2b\x3b\xcd\x79\x64\x10\xe5\xb1\xd5\x45\xbb\x5d\xad\x09\xc2\xe3\x7f\x59\x61\xd2\x1c\x47\xf2\xd4\xd8\x06\x66\x42\xeb\xd7\x5b\xb7\x9c\x07\xb1\x78\x88\x58\x0e\xd6\x5a\xf2\x08\xef\xd5\x03\xbe\xff\x1b\x9b\x9a\x54\x67\xfd\x71\x04\x6b\x35\x42\x62\xd7\xb6\x60\xd5\xde\x97\xb3\x75\x05\x22\x66\x52\x12\xb5\x55\x75\xd5\x91\xb7\xfe\x10\x47\x71\x37\x84\x67\x19\x4b\x7d\xca\xf1\x88\x4d\xc0\x4c\x00\xd9\x26\x38\xc4\x5c\x5d\x75\xcd\x89\xf0\xa8\x43\xfd\x0b\x22\x11\xd9\x6e\x8f\x3c\x7d\xfc\x59\x8d\x89\xc4\x93\xc8\xdc\x2d\x2c\x10\x89\x84\x53\xfb\x10\x2b\xdd\x2e\xc2\x33\x16\xdc\xb2\x2c\x9d\xb4\xf0\x78\x2d\x85\x08\x12\x4e\xc5\xf7\xd7\x72\xbf\x77\xaa\x80\xe1\x10\x67\x54\x7c\x6b\xbb\xfa\xb8\x71\xad\x67\x7f\x4c\xa6\x31\x61\x08\xbd\x3d\xc0\xba\xea\xff\x8b\x7a\x5a\xdb\x87\x48\xe5\x36\x74\x03\xad\x37\x5e\xdd\xe2\x42\x88\x06\x91\x62\xc1\x87\xd1\x0b\x4e\x6e\x60\x3f\xa2\x92\xfe\x63\x7a\xe3\x95\xe6\xca\x51\x28\x4e\xc7\xeb\x10\xb7\x43\xa4\xf3\x9c\xc0\xa9\xca\x6a\x7b\xf7\xb1\xe4\x79\x54\x03\x11\xa6\x8a\xae\xbb\xc2\x9f\x5d\xff\x5c\x6f\x90\x50\x3b\xf3\x51\x8c\x53\x85\xc4\x6b\x9c\x9e\xb9\xc8\xd0\x10\x74\x09\xf8\xc3\x7a\xe3\x05\xfe\x2f\xff\x68\xc3\x63\xbb\x13\xe2\x54\x18\x09\x22\x03\x8a\x7a\x5d\x65\x4b\x6d\xf1\x75\xe3\x6c\xe6\xa7\xaf\x8e\x91\x05\x79\x20\xfb\x55\x32\xa4\x6f\x7d\x04\x73\xa1\xf4\xf7\xb7\x20\x16\x10\x47\xa9\x7d\xd0\x15\xbe\x3f\xe1\x71\xff\x41\x3a\x39\x67\x75\xcd\xcf\x3d\xe6\x21\x8e\x18\xa8\x74\xc6\x36\x14\xe3\xf8\x03\xe2\x48\x1b\xe6\xcd\x93\xca\xea\xd9\x0b\x06\x42\x1c\x67\x96\xdf\x8d\x3f\x3b\xac\x34\xf9\xdb\xc1\x18\xd6\xe5\x86\x25\x60\x5d\xfd\xef\xea\xe7\x20\x0d\x75\x99\x2f\x0d\x71\xa2\xb8\xe8\xd7\x84\xab\xed\xed\x18\xff\x73\x36\x4a\x50\x44\xb4\xd0\xfa\x01\xdf\x97\x7e\xbf\xf8\xcb\x82\x2e\x39\x88\x4c\xae\x2d\x4b\xad\x04\x6b\x7d\x44\x67\x1f\x3f\x15\x32\xf1\xcb\x4e\x9c\xe5\x11\x35\x86\x8f\xbe\xfc\x35\x63\x04\x43\x9c\xf1\x4c\xb8\xe5\xac\x5f\x08\xae\xb0\x3b\x27\xa8\x41\x9c\x3b\xb5\xf0\x6d\x7d\x6a\x96\x63\x41\xaf\x0b\xaf\x56\x9c\xf7\xcb\x54\xa8\x1a\x78\x43\xec\xcb\xf7\x24\xd7\x29\x58\x19\xa0\x9b\x5f\x15\x26\x21\x2e\x8a\x28\xc7\x41\xee\x62\x73\xb4\xc6\xfd\xbf\x72\x1e\xef\x3f\xe4\xe4\xc3\x09\xe0\x39\x8a\xca\x21\x2e\x44\x4c\xc1\xab\x17\x57\x79\x5c\xaf\xef\x9c\x4c\x51\x18\x02\x79\xea\x60\x82\xcb\xb2\x2b\xff\x3b\x0b\x61\x21\x2e\x30\x49\x5c\x08\xdb\x07\x82\x4d\x39\x53\xcc\xea\x47\x18\xeb\x7d\x0f\x5a\x93\xfc\x5f\xd7\xa1\x0e\x0e\xab\x17\xe9\x53\x10\x33\x6d\x39\x2d\x65\xdb\xef\x12\x97\xf8\x77\x10\xf3\xdc\xca\x97\x5d\x95\x84\x03\xbf\x1c\x9b\xc4\x5c\x59\xfc\xe2\x35\x56\x3e\x0d\x82\x98\xa3\x36\x16\xf3\xd1\x9d\x9a\x6a\x49\xa5\x03\x02\x10\x36\x63\xb4\xf1\xff\x4b\xff\x67\xba\xd8\xc7\xdc\xd8\xaa\xf4\x71\x0f\x1f\x37\x75\xa3\x4a\xe9\x0b\x9e\x10\x8b\x84\x13\x50\x69\x67\x6b\x4e\xcb\xe6\xe3\xd8\xb5\x1f\xbf\x9d\xd7\x98\x66\x2d\x2f\x88\x45\x6a\x19\xe9\x77\xf5\x33\xc9\xea\xfc\x95\xf7\x65\xff\x89\xc2\xe3\x40\x68\xbb\x9f\x79\x16\x43\x2c\x64\x4c\xbb\x52\xf7\xff\x9d\xaf\x8e\xfb\x26\x28\x98\x43\x2c\x43\xa3\x5e\xba\x72\x1c\xd9\xc5\xc0\x23\xca\xfb\x48\x2c\xe6\x11\xc2\xbd\x02\xc9\xc8\xff\x08\x9a\x06\x3e\xd6\xc6\x93\x3c\xb6\x2f\xd0\x7d\x85\x37\x0b\x63\x9c\x07\x7c\xb1\x42\x49\x12\x11\xa7\x16\x3e\x73\x9d\x83\x58\x1b\x49\x8e\xa3\xfd\x1e\xf3\x80\x3f\x07\x80\x37\xc4\x98\x5a\x5e\x27\x15\xc4\xdb\x17\x0b\xb9\xea\xef\xf5\xa5\xaa\xcd\xe7\xa5\x1c\x88\x91\xc5\x3a\x24\xcb\xb3\x1f\x89\x8c\x11\xe5\x73\xd1\x35\x30\x02\x9b\xf5\x07\x80\x0b\x4f\x6d\x3e\x69\xac\x7c\x26\x1c\x06\x08\x43\x6f\xb7\x8b\x27\x4f\xe1\x80\x89\xb4\xb0\x95\x8c\x39\x17\x0f\x62\x13\x8b\x6c\x58\x67\xa8\xb2\x37\xdb\xc0\x62\x93\x73\x02\x22\xf5\x91\xa6\x0d\x56\x03\x77\x18\x62\xc3\x0b\xa2\x98\x19\x77\x5a\x98\xd5\xda\x21\x89\x40\x42\x16\x2c\x19\xd7\xdd\x0b\x36\x34\xb5\x2f\x7b\x75\x42\x12\xa7\xd6\x53\x72\xfb\xe3\xf6\x7e\x1c\xcc\x27\x09\x4f\xa0\xbf\x3e\xef\x83\xea\xff\x8c\xc8\x9c\xa7\x68\x3f\x07\x9c\x95\xea\x64\x06\xba\x91\x99\xca\x89\x39\xf8\x81\xd0\xec\x3f\xfa\x00\x62\xb8\x90\xa4\x48\x4c\xc6\x7d\x95\xc2\x6a\xc0\x9f\xa3\x57\x20\x61\x45\xc1\xc7\x39\xcf\x99\x8d\xf7\xec\x6a\x18\xb7\xdc\x7c\xaf\xc8\xa1\xbf\xd6\xfb\x7e\xcd\x6d\x17\x95\xde\x22\x1c\x26\x81\x5d\xc2\x95\x95\x96\xb6\x82\x09\x6b\xf3\xa3\xec\x5e\xa8\xbb\x73\xf9\xe4\x82\x47\xa9\x2b\xe3\xde\x34\x88\x57\xa7\xfd\x3e\x9c\x4a\x98\x3c\xb2\xf5\x89\x7d\x0d\xda\x46\x1c\xae\xe1\x3c\x9e\x8b\x09\x08\x88\x5c\x45\x68\x6a\x7a\x36\xfb\x2e\xd0\x91\x49\x9d\xce\x91\x93\xc5\x98\x4c\x93\x44\x45\xaa\x70\x0b\xf9\xe2\x0d\xca\x7d\xff\x8e\x59\x06\xe8\x28\xdb\x86\x44\x81\xa1\x22\xd8\xd5\xe3\x93\x1a\x34\xf4\x21\xd1\x69\x0c\xda\x53\x8a\xd7\xc7\xfe\xbd\xb2\x1a\xfb\xb3\xb5\x65\xc2\x2b\x1b\x0a\xa7\x53\x86\x19\x24\x9a\x15\xd4\xd8\x3b\xd4\x55\xf7\x12\x27\x0e\x26\xe1\x0f\x8a\x82\xc9\x60\x10\x6f\xdf\xc2\xd0\x9e\x85\x44\x9b\x18\xad\x54\xf9\x7e\xef\x42\xba\x51\xbf\x15\x12\x94\x69\x14\xbb\x2e\xe8\xa1\xac\xca\xb6\x23\x99\xe9\xd9\xfd\x40\xa9\x28\xda\x7e\xf8\x7e\xbb\xb9\x5d\x3f\x2c\x17\x9b\xaf\xfe\xfb\x8d\xb6\x10\x15\x0f\x3b\xfc\x03\x3f\x2e\x36\xaf\x21\x4d\x52\xa3\x6d\x15\x0e\x1a\x3d\x48\x03\x40\x9a\x2a\x8b\x9e\x6b\xfb\x9c\xf1\x52\x1d\x1d\xd2\x1c\xac\x83\x38\xe5\x0f\x25\x36\x83\x88\x0b\xa4\x45\x91\x79\x80\xee\xe6\xa5\x3e\xd2\x2c\x76\x8a\x72\x34\x6c\x3c\x45\x52\xc6\x4c\x0a\x83\xc4\xd5\x1f\x0f\xcb\x0b\xf6\x78\x90\xf2\xac\xa0\x09\x10\xc8\xb7\x63\xc8\x2f\xa4\x5c\x66\xce\xad\xb6\xcf\x5a\x51\x97\xa0\xeb\x66\x71\x6c\xea\x37\x20\x81\xd7\x93\x82\xf1\x53\x48\x45\x96\x90\x92\xaa\xae\xb1\xf5\xb5\xca\x65\xad\x5d\x1a\x3b\xf9\x81\x02\x13\xda\xec\xc7\x68\x03\x5f\x84\xbf\x18\x1e\xa4\x10\x59\x36\xcd\x01\xaa\x13\xec\x2f\xc9\x96\x4e\xa7\x7f\x2a\x23\xc8\x9c\x79\xc7\xec\xb2\x65\xac\xb4\xdb\x4a\xbf\xd6\xdd\xfb\xa5\x3b\x23\x99\x76\x91\xdf\x2b\x56\xf7\xa0\x9a\x1a\xaa\xd6\xef\x65\xa9\x8a\x2c\x94\x46\x52\x35\xdc\x52\x43\xfc\xa1\x34\x22\x1d\xf0\xc5\xd3\xed\xbf\xd7\xde\x99\xbb\xff\x73\x46\x0d\xb1\x36\xc8\x27\x8f\x34\x3b\xda\x5d\x18\x96\x69\x42\x34\x1d\xb0\x51\xa7\xfd\x34\x19\x4c\x95\x2c\x8a\x01\xb6\xf9\x38\x2e\xb7\xa4\x9a\x59\x5d\x5e\x0f\x3b\x48\x98\xb3\xa6\x66\xff\x98\xfc\x1b\xa6\xa9\x36\x92\x08\x24\xcf\xa5\xe9\x96\x2f\xd0\x80\xea\x66\x00\x0e\x1e\x46\x5a\x64\xd9\x1f\x64\x7c\xb0\x85\xfd\x2b\xce\x1e\x26\xe6\x2c\xb6\xfd\xb2\xb7\xfa\x15\xbd\x21\x84\x63\xe0\x5e\x48\x32\x52\x54\x9a\x30\x46\xfd\x30\xab\x19\xd6\x8e\xf1\x67\x90\x9a\x28\x4e\xcd\x14\x93\x38\x12\x7e\x85\xd4\xe4\x9c\xcc\x31\xbd\x2e\xca\x90\xec\x67\x51\x1c\x91\x85\x45\xc0\xdf\xf9\x8e\x26\x64\x51\xc2\x08\x17\xea\xcd\xa7\x1f\xea\xe6\x00\xfb\xfe\xe4\xfd\xce\x72\x86\x57\xfd\x75\x3a\x97\x45\x89\xad\x6d\xdc\x81\x86\x5f\xb0\xf6\x5c\x44\x35\x99\x5e\x59\xc4\x19\x29\xa9\xae\xfe\xdc\x2c\xeb\xb2\xda\x20\xa9\x77\xfb\x83\x26\xa6\x37\xdd\x89\x1d\xed\x2f\x11\x9e\xfb\x51\x92\xb6\xf1\x23\x36\x4e\x5e\xfb\x1e\x9a\xd7\xd1\x33\x1c\x5e\xcc\x2c\x4e\x80\x68\x51\x20\xeb\xb7\xfe\x5a\xcb\xc3\xe9\x30\xa5\x79\x40\x16\x67\x59\xe2\xc2\xfe\x07\x7c\xb7\xcb\x45\x3c\x7d\x2b\xb2\x58\x1b\x12\x39\xb4\x4d\xc5\x9d\x01\x85\xbb\x63\x53\xd7\x66\xd7\x4c\x02\x9b\x2c\xc9\xc1\x0b\x87\x6e\x1b\xc4\xdb\x99\xdd\x36\x64\x89\xe1\x5e\xf5\xe5\x86\x3e\x5b\x79\xfb\x3f\xc8\x32\x29\x88\x90\x62\x05\x65\x6e\x17\x87\x75\xd0\x7d\x83\x2c\xcf\x52\x32\x04\xbb\xaf\xab\xba\xc1\x99\xfb\xa8\x1b\x53\x24\x39\x81\x3e\x06\xe9\x4a\xbf\xc7\x66\x45\x9e\x53\xc1\xa9\xac\xfa\xf7\xe4\x22\x1e\x0d\xb2\x82\x45\x36\xff\xaf\x97\xf5\x61\x76\x6e\x16\xf3\xdc\xed\x34\xea\x01\xde\x2e\x57\x20\x32\x96\x45\xe4\xda\xa2\x4b\x0a\x5c\x07\x1e\x1c\x64\x0c\x18\xb1\x76\x0f\xa7\xae\x3c\xc3\x7f\x7d\xc6\xfd\x83\x8c\x6b\xe5\x15\xcc\xb0\xd2\xdf\xfa\x39\x15\x24\x44\xc6\x13\xcd\x0d\x17\x45\x46\x97\x40\x3c\x98\xb2\x1e\x89\x3e\x40\x26\x34\x2a\x0c\x48\x74\xdc\xd7\xc7\x03\x56\xa4\x77\x3b\x69\x46\x40\x26\x30\xf7\x9a\xbe\x8f\x75\xbd\x1f\x57\xfb\x86\x4b\xed\x5f\x56\x08\xe0\xe0\x41\x3a\x67\x94\xfd\xf8\x1f\x05\xb9\xe5\x18\xb8\x2a\xde\x6f\x67\xf1\x81\x1b\x27\x65\xe2\x95\xff\x6f\x3b\x3c\x2c\x2a\xbd\x20\x0e\xef\xa5\x9a\x48\x26\x0d\x50\x2f\xe0\xf6\xfe\x7a\xf5\xa7\x6f\x40\x4f\x3a\x2f\xb3\x0f\xa8\x94\x51\x9e\x24\xcb\xa6\x7b\x79\xc4\x66\x1b\xe2\xd5\x4c\x15\x40\x1b\xd8\x76\xb5\xb8\xdf\x7d\x7b\xb8\x79\x5a\xad\xfe\xbd\x0a\x07\xc1\x2a\x81\x8c\xf4\x79\x3f\x9e\x46\x16\x3a\xb3\xaf\xd1\x79\x41\x35\x88\x6d\x89\xdf\x8e\x77\x75\xdd\xe2\x2a\xa8\x54\x42\xa6\x99\xd2\x4e\xbc\x89\x1a\xf9\x0e\xbc\x75\x5d\xab\x89\x01\x1e\x64\x1a\x12\x52\xe9\xbd\xff\x58\xe8\xb7\xfe\xe1\xd8\x78\xfe\x7b\xf2\xab\xb2\x41\xa6\xd1\x86\x88\xdf\x57\xdb\xa7\xdb\x5f\x8e\x34\x90\xd8\x91\x25\xbe\xef\xc8\x0a\x69\xef\x81\x89\x76\x73\xda\x39\x85\xdc\xc9\xd5\xe5\x11\xa6\x0e\x7d\x52\x51\xa5\xda\xae\xe2\x93\x82\x7c\x1e\xa7\x92\x20\x08\xcb\xfb\x2b\xd7\xa1\xe9\xdf\x85\xf3\xa6\x18\x90\x02\x68\x36\x10\x89\x97\x6b\xc2\x51\x66\xfe\x44\x89\x8e\x89\x5a\x70\x84\x8f\x91\x99\xc0\x2f\xd3\xe5\x3c\x37\xd2\xc3\x58\x2d\x0d\xf6\x72\xad\x20\x2f\x22\x41\x2d\x85\x45\x53\x62\x3b\x4e\x5e\xf2\x22\x11\x94\x07\xf4\x61\xe8\x24\xe6\xcf\x8b\xcc\x72\xd7\xfa\x0b\xa7\xc9\x9e\x84\x23\x02\xb9\x97\x66\xd8\xbc\x40\x33\xcf\x55\xf3\x02\x2c\x87\xa7\x32\x6d\xff\x4a\xdd\xa1\xf1\x6b\x66\x2e\x98\xa6\x1d\xb9\x3c\x1c\xf7\x3b\xd0\xba\xb4\x9b\x97\xed\x37\x87\xef\x16\x9c\x53\xe5\x68\x8b\xcd\x21\xfc\x4d\x72\xea\x7b\x1f\xb0\x85\xd6\x33\xdf\xc2\x31\xeb\x5b\xd3\x92\x46\x76\xdb\x9f\xb1\x6c\x69\x49\x58\xce\x35\x6a\x21\x17\xaa\x20\x8d\x85\xc5\x49\x75\x27\x7b\x37\x7c\xb1\xfa\xef\x74\xe0\x21\x87\xc8\xe2\xc6\xbd\xca\xd1\x2f\xe1\x59\x90\xf7\x19\xb0\x77\x16\xb9\xee\x5f\xdb\x32\xf4\x5b\x72\xc8\x90\xb8\x91\x8b\xfb\xab\xc5\x66\xb3\xb8\x5e\x3f\xed\x36\xdb\xc5\x1f\xab\x70\x3c\x97\x71\x3c\x84\x08\x1b\xf2\x4e\x0c\x07\x65\x4c\xb0\xdd\x37\xfb\xeb\xc7\x48\x58\xc8\x95\x92\x89\x0d\x8e\xd5\x1e\xe1\x6f\x13\xe5\x46\x1b\x6a\xae\x94\x95\x62\x97\x75\xfd\xfa\x54\xd7\x87\xd9\xd2\x34\x52\x52\x9f\x25\x09\x17\x4f\x66\x04\x25\xb9\x0f\x78\x6a\x5c\x64\x1b\xe2\xc9\x5c\xab\x24\xf3\x66\x49\x16\xb9\x69\x9f\x9e\x7b\x2b\xa7\xb3\x4b\xab\x9c\xda\x47\xb2\x9f\xb3\x4e\x2e\xa7\x1d\x03\x79\xfd\x38\x64\xf4\x8d\x87\x52\xaf\xcd\x6c\x0e\x20\x0a\x42\x11\x6c\x3a\x78\x45\xef\xd7\x7d\x56\xac\xfd\xe4\xb2\xdc\x39\x4c\x9e\x53\x67\xf4\x50\x56\xdd\x54\x15\x6a\xb8\x41\xbf\x82\xde\x43\x6e\x78\x64\xb2\x80\x64\x5c\x68\xfd\xcb\x8a\x67\x11\xb1\x82\x76\xc7\x3e\x90\xea\x17\x99\x1b\xbf\x03\x0d\x43\xe2\xc4\x4a\x1d\x35\x48\x41\xe3\x64\x19\xf2\xbb\x6c\x11\xf3\xcc\x6a\xe5\x55\xf8\xf5\x54\xe9\xa0\x72\x07\x45\x92\x02\x4d\xb7\xd0\xc1\x1b\x0b\xdc\xfb\xce\xd7\xf8\xdf\xfe\x01\xcf\x77\xb6\x22\xd1\x92\xe2\xa2\x7f\xfd\x95\xcc\x03\x14\xa9\x60\x84\x17\xa9\xf7\xda\x4a\xc9\x52\x5b\x7f\x5c\xcc\x2d\x52\x81\xda\xa6\x8b\x06\xaf\xcb\xb7\x9d\x46\x75\x39\x1e\x29\x52\x40\x92\x40\x7b\x38\xbd\xe2\x45\x97\x03\x28\xb2\x38\x4b\x83\x51\xbc\x8f\xe1\xab\xf9\xa0\x44\x3b\x02\x6d\xd7\x40\xd9\x79\x5f\x4a\x28\x32\x69\x01\xe8\xbb\x37\x6c\x4a\xf3\x61\xab\x01\xfd\x0a\x77\x8d\xa6\x81\x59\xa9\xb2\x28\x74\x21\x2c\x63\x69\x83\x30\x37\x4f\x85\x82\xe9\x84\x36\x0e\xbf\x2c\x9c\x1d\x36\x52\x0e\x3a\xb6\xd6\xb8\xcf\x6a\xf9\x4f\x07\xf2\xd8\x50\x45\xfe\x61\xf5\xe7\x76\xf7\xb8\xde\xee\x6e\x9e\x16\xcb\xdd\xd5\x7a\xeb\x7f\x35\x37\xa9\xa7\x6d\x2c\xb6\x65\xd7\x7d\xcc\xe6\x8c\x48\xd2\x8c\x8d\x70\x6d\x57\x30\xdc\xfc\x3e\xee\xa1\x3c\x3f\xad\x26\xfb\x46\x01\xa8\xac\x93\xd8\xbe\xae\x7c\x55\xaa\x26\x23\xf0\x30\x99\x64\xca\x6c\xec\x7e\x6a\x5f\xe8\xb3\xb7\xf3\xd9\x2a\x31\x42\xd2\x42\xb7\x11\x99\x1e\xb9\x31\xf6\x07\x81\x00\x12\xc7\xa6\xac\x54\x79\xdc\x4f\x20\x28\x50\xa8\xa8\xb0\xf4\x37\xd2\xbf\x7e\xb4\x05\xee\xd9\x06\x5e\x20\x32\xd2\xb6\xfc\x7e\xbb\xd9\x2e\x82\x5a\xe1\x63\x7c\x79\x9b\x2c\x10\x05\xdd\x89\x7e\xfa\x9d\x8e\x53\x0e\x16\x14\x26\x09\x4f\x84\x98\xda\xfd\x43\x5b\x6d\xbf\x8e\x6a\x03\x85\xc9\x35\x2d\x09\xbb\xff\x05\xf5\x7a\xac\xbb\xb9\xc9\x2d\x14\x46\x4a\x32\xdc\xd9\x90\x13\xd3\xac\xff\xc7\xa2\x34\x27\xf9\xac\xdd\xce\x58\xdf\xd9\xe9\xa7\x59\xa4\x22\xe3\x35\xd5\xea\xe7\xe7\x3d\x9e\x6b\xc4\xf4\x83\x02\x3c\xc5\xdd\x58\xbf\x73\xb3\x58\x64\x94\x71\x3e\x8e\xba\xb7\xd3\xe9\xc4\x62\x1d\x39\x18\xdc\xff\x9e\xda\xee\x06\xa9\xcb\x7a\xe9\x6b\x92\xc8\xd0\x32\x6c\x03\x8f\x8d\x07\x0c\xfc\xed\x8d\x66\x76\xb6\x9c\x6b\xaf\x62\x07\x07\x24\xc5\xfb\x66\x24\xc2\x75\x49\x53\x06\x58\xc2\xad\xd9\xfe\x3d\xbc\x62\xbf\x2a\x4e\x74\xe8\x3e\xed\x06\x4c\x2f\x38\x4d\xb4\x77\x46\x0d\x10\xbd\x69\x43\x95\xa5\x79\xa6\x5d\x89\x7b\xfd\x5e\xa1\xde\xbc\x94\xc7\xf6\xea\xe3\x62\x79\x8b\xa5\x3c\xa5\x25\x6d\xc0\xbe\x9c\x6d\x27\x61\xc2\xb0\x94\xe7\xa4\x3d\xb6\x28\x3b\x68\x47\xde\x9d\xc0\x52\xc3\x88\xfd\xf0\xe5\xe1\xe1\xfe\x57\x4b\x68\x9f\x84\xb1\xcc\x63\x4b\xaf\xa1\xc3\xd6\x9b\x47\x5f\xdc\x45\x58\x26\x2c\xe7\x97\x52\xc6\xfa\x38\xd7\x80\x3c\x0f\x08\xc6\x58\xb6\x7f\x4c\x13\x36\x96\x81\x15\x2d\xb6\xe0\xd9\x3e\x97\xc7\x4a\x77\x67\xe5\x69\x96\x17\x26\x12\x83\x9d\xf4\x60\x3e\x06\xac\x48\x24\xbd\xc8\x8f\x4f\xeb\xfb\xd5\xf6\xeb\xea\xdb\x66\xf7\x7d\xfd\x6d\xf9\x75\xf5\x64\xb5\x02\xc2\xb8\x42\x19\x70\x1c\xed\x51\x80\xec\x8e\x32\x19\x91\x86\xac\x47\x63\x86\xbf\xab\x94\x6a\xa6\xfd\x53\xbd\x3e\x35\x44\xa6\xef\x7f\xe6\xa4\xb0\xc4\x78\x2c\x69\x23\x2e\x47\xd5\x50\xc6\xd1\x3a\xcd\xd2\xaa\xd6\x3c\x20\xea\x27\x34\x0d\xb6\x2f\x9f\xdc\x58\x11\x21\x99\x36\xdc\x2f\xfe\xdc\x2d\xb6\x5f\x57\x0f\xb7\x8b\xd0\x6f\xec\x0f\x3a\x1d\x5b\xe2\x93\xcd\x5f\x7c\xc1\x0d\x39\x1e\xd7\x47\x2b\x37\x5d\xe1\xa7\xc2\x87\xfe\x13\x22\xcf\x5d\x6e\x45\x54\x2c\x7b\x59\xa3\xc5\x88\x41\x64\x05\xc7\xf0\x0d\xf6\x27\xe8\x48\x59\xd7\x1f\x8a\x95\x15\x08\x18\x01\xd2\x81\x41\x62\x48\xee\x01\x0f\x65\xb7\x84\x23\xc8\x72\x5f\x76\x1f\xd6\x11\x62\xf6\x26\x66\xe3\x94\x97\x81\xa3\xd5\xb7\xd8\xdd\xd7\xd5\x2b\x4e\x44\x8d\x81\x01\xe3\x29\x78\x83\xe1\x73\x5c\xc1\xaf\xda\x53\x93\x6f\xe1\x8a\x72\xf0\x3e\x5b\xa6\x2a\x50\xb8\x1c\x15\x0b\xaa\xb3\xca\xb2\xc3\x9f\xfb\xf2\x0d\x87\x03\x2a\xa5\xd2\x6f\xff\x99\xd9\xe6\xc0\x54\x8c\x82\x36\x4e\x94\x78\x9a\xec\x6e\x4c\x99\x84\x00\x24\xef\x58\x4e\x34\x69\x81\xe9\x44\x00\x04\x24\xf7\x89\xfa\xd4\xfe\x18\x82\x26\x31\xff\x5d\x50\xcc\xbe\xc8\xe2\x70\xa3\x4d\x96\xa4\xde\x71\xc0\xb6\x88\xfa\xd3\x5d\x8e\x5b\x98\xc9\x0b\xaa\x96\xdd\x86\x22\xb5\x67\xea\x03\x33\x2c\x25\x32\xb2\xff\xda\xed\x99\x23\xbc\x1f\x28\x59\x56\x84\x9e\x5a\x30\x8b\x9c\x70\xe0\xc6\x37\xdc\xa8\x94\xa8\xb9\x9b\x3e\x6d\x7f\x1b\x6a\x2b\x3c\x42\x96\xe4\x4e\xa5\x8e\xaa\xd9\x36\xee\x5d\xb4\xce\x73\x2e\x0c\x33\x99\xeb\xbc\xdc\xb6\xcb\x7d\xdd\x0e\x87\xe2\xd8\x90\xc0\xc1\x75\xf9\x5c\x92\x4a\x77\x5b\x0f\x0c\x2c\xe0\x89\xb1\xb5\x29\xcb\x47\x1c\x4c\xc5\xa7\x4f\x90\x27\x46\xc7\x6a\x64\x47\xd2\x74\xa6\xde\x97\xb3\xce\x25\x4f\x33\xa0\x3e\xfd\x66\xbb\x78\xda\xee\xb6\xde\x49\x1d\x78\x1e\x47\x84\x20\xb8\xab\x9f\x3f\xab\x51\x4d\xef\x20\xcf\xa5\x74\x17\xfe\x39\xc1\x6c\x04\xa3\x05\x5e\x64\x09\x29\x04\x6e\xef\xaf\x96\x9b\x0e\x2a\x0d\x8d\xfe\x9b\x20\x35\x5e\x14\xc6\xbf\x36\xdb\x97\x51\x05\x6c\xde\xb6\x9e\x7e\xc8\x14\x64\xe3\xd5\x61\xdb\xed\xa2\x5d\xff\xcf\x15\xb4\xa5\xda\xfe\x1c\xda\xc2\x6e\x28\x4b\x45\xac\x42\x03\xb4\x6e\x5a\xdf\xad\x0e\x03\x32\x6d\x48\x2c\xab\xae\x5f\x4f\xb3\x06\x2d\x67\x79\x4e\x10\x9c\xdb\xe5\x7a\xb7\x7a\xb8\xde\x6d\x6f\xef\xc3\x8d\xe5\x29\x23\x2e\xf0\x11\x3e\x9a\xba\x5f\xad\x87\x76\x0b\xe7\x1c\x28\x70\x0c\x95\xeb\xe0\xf0\x37\x3d\xbf\x60\x09\x29\x96\xdf\xd5\x6f\xb8\x28\x9b\x65\x6d\x0c\xce\x9f\xbf\xe0\x19\xa9\xfb\x55\xb5\xc6\xf6\x3b\x84\x02\x28\x17\x18\x59\x00\x18\xd9\x4d\xde\xd7\x1a\x37\xf5\xba\xda\x7f\xac\xbc\x69\xf8\xa6\xab\x8f\xed\xa2\xd2\xab\x56\xc1\x11\xbf\x5a\xcb\x97\x25\x54\x57\xf8\x6d\x34\x4b\x21\xc9\x2c\x19\x81\x6c\x7d\x2e\xe0\xa4\x81\x4b\xce\xe9\x1e\x6d\x56\xcb\xf5\xc3\xf5\xee\xfb\xfa\xee\xdb\xfd\xca\x7a\xf7\xfb\xb3\x48\xa5\x89\x4d\x3c\x76\x16\x9d\x75\x81\xdc\x48\x15\xa7\x14\x3e\x3e\x2c\x16\x57\x5f\x17\xe3\x15\x89\xab\xd8\xb6\xe6\x68\xd7\x1e\xd1\x24\x81\xeb\x28\xa5\xda\xc7\x3f\x4f\x50\x75\xce\xa2\x33\x1c\xcb\x0d\x49\xbf\x75\xa8\x5e\x1e\x9b\xfa\xad\x0c\x2c\x11\xe0\xc8\x05\x29\xb6\xdf\xa3\x56\x41\xa4\xa2\xff\x33\x46\x5e\xfe\x22\x0d\x7f\xd4\xa9\x35\xd4\x23\x8e\x78\xa8\xc5\x5f\x9e\xfa\x7e\x53\xe3\x86\x1b\x69\x85\x55\xdf\xca\x16\x9b\x76\xc2\x3f\x01\x6e\x50\x73\xe1\x51\x77\x97\x53\x3a\x11\x45\x71\x6c\xc2\x2e\x37\xaa\x05\x4c\xc2\x14\xee\x47\x3b\x79\x16\x07\x54\xa9\x0f\x87\x53\x55\x76\x1f\xbf\xc4\x41\xfc\xcd\x30\xf5\x32\x70\xeb\x97\x31\xad\x88\xe3\x88\x94\xec\x1e\xf0\xfd\x1a\x3a\xf0\xb0\x88\xd3\x67\xd0\x2f\x11\x0b\x2b\x09\xf4\xcf\x6f\xab\xd5\xc3\x76\xe5\xb4\x2f\x40\xc4\xca\xca\xd3\x54\xf8\xb3\x73\xc5\x8a\x41\x7b\x03\x44\x6c\x12\x70\xeb\xec\x8e\x58\x29\xbb\x99\xda\x09\x88\x24\xcf\x30\xf3\x94\x71\xff\xb9\x44\x26\x45\x36\xa1\x14\xfc\xad\xfa\x97\x48\x33\xf9\xff\xe3\xec\x4d\xb6\x1b\xc7\x91\xef\xe1\xd7\xa9\xc5\x6f\x41\x70\xc6\x52\x96\xe5\xb4\xba\x3c\xb5\xa4\xcc\xac\xea\x3e\x7d\x74\x02\x40\xc0\x66\x25\x45\xaa\x49\xca\x4e\xf5\xd3\x7f\x87\x01\x80\x93\x28\x67\x7d\xff\xda\x38\x4b\x00\x67\x0c\x31\xdc\xb8\x97\x68\x06\x0f\x90\x91\xc4\x54\x2f\x2d\x34\xb1\x85\x79\xe8\x19\xd2\xea\x2f\xd9\x2b\x18\xe6\xb0\xf5\xa7\xf1\x00\x1e\xa2\x24\x8f\xb0\x7d\xd2\xaf\x83\x0a\x06\x77\xcb\x91\xc7\x18\x3a\x63\xbd\xfd\xc8\xc6\x10\x78\x3a\x1d\x76\x99\xfc\x51\x1b\x6d\x63\xd7\x57\x86\x74\x9b\xa4\x8a\xf9\x7c\x6a\xb6\x1f\x88\x5d\xe4\x8d\x47\x4a\x90\x39\x69\x99\xdc\x86\xa5\xa1\xe3\x61\xcc\x63\x3f\x16\x16\x4d\xfa\x90\xfd\x77\xc6\x15\xe2\x71\xaa\x22\x83\x9b\xa9\x4f\x48\x6a\x96\x14\x30\x1d\x4e\x45\x9e\xf0\xc8\x28\xf6\xca\x4b\x25\x6a\xe0\x69\x98\x3a\x89\x17\xca\xdd\x0f\x31\xf3\x03\x7f\x81\xa7\x71\x64\x18\x67\xdf\xb2\x02\xb2\x42\x76\xc7\xa7\x29\xd1\x69\xd7\xf0\x8e\xb6\xf0\x69\x51\x89\xac\x31\x4b\xec\x1d\x0e\x44\xb2\xc7\x0f\x47\x3e\x65\x57\x4f\x71\x8b\xef\x6d\xdf\xd6\xb1\x99\x7c\x49\x48\x52\xb2\xd2\xf3\xf2\x75\x91\xe7\xed\xf2\xe9\x2e\x0d\x10\x99\x92\x7f\xc8\xf3\xc5\x23\x36\x6f\xa5\x62\xbf\x82\x3d\xba\x43\x65\xe0\x92\x0d\xe6\x3b\x62\x35\xc7\xfb\x01\x1c\x30\xa6\x4f\x29\x84\xbb\xaa\x0a\x91\x02\x5d\x7b\x61\x65\xd8\x2d\x9c\x2b\x1e\x03\xd2\x5c\x6f\xf4\x53\x2b\x20\x65\xc1\x9e\x13\xf2\x9e\xbf\xf9\xd7\x9e\x0e\xfd\x50\x32\x57\x2a\x56\x15\x73\xa8\x03\x8e\xda\x94\x7d\x15\xf8\xb1\xcb\x0e\x56\x19\xf4\x33\x24\x0b\xd7\xd2\xa3\x6c\xa1\x09\x2e\x75\xb4\x7f\x53\x6f\x76\x3a\x47\xe7\xcc\x00\xae\x51\x52\x52\xab\x36\x7e\x4e\xe7\x9d\x5b\x0a\x16\xd7\x4b\x1b\x59\xd7\xf7\xb2\xc1\xaf\xeb\xdb\xfe\x67\xa1\x0d\xea\x99\x32\x5d\x4e\x7c\x6c\x32\xe8\xb5\x36\x1a\xc5\x2e\xcf\xfc\x49\x36\x0a\x3c\xee\xd1\xc2\xf6\xb8\x7e\x5a\x3f\x7e\x7d\xdc\x3b\x46\xd9\x97\xaf\x9b\xe5\xfd\x62\xbb\xda\x2f\x1e\x9f\xbf\x3e\xed\x46\xb4\x70\x00\x9e\x30\x71\xb8\x57\x53\xe2\x7d\xbe\x19\x02\x76\xc0\xd3\x82\x6a\x28\x8a\x9e\xaf\x67\x9c\xd9\x03\x06\x68\xa8\x51\x1e\x97\xbb\xee\x37\x44\x4a\x58\x1d\x8c\xb2\x02\x39\xe9\x03\x00\x0a\xf8\x9e\x41\x6d\x91\x5a\xf0\xaf\x33\x97\xee\xa8\x50\x47\x7d\xd0\xc4\x71\xdd\x8f\x0a\x16\xe6\x2d\x4a\xf0\x53\xe3\x18\xd7\xc7\xbc\x5d\x1c\x2d\xdd\x48\x77\x37\xc2\xd4\x81\xca\xd3\x61\x83\xff\x7d\x84\x4a\x74\x92\x7d\x6d\xa3\x20\x23\x27\x87\xba\xf9\x9e\xe5\xb9\xe3\x28\xe9\x9a\x4d\x5c\x90\x2c\x41\x3f\xde\x1b\xd0\x04\xc9\x93\xc0\x2b\xfa\x9e\xe7\x11\x78\xa7\x3b\x5d\x10\x4a\x32\xe8\x8c\x2b\xff\x8f\xc7\x99\xd2\x27\x80\x00\x4c\xf1\xa3\xe1\xc7\xbb\xf2\xb5\xc3\x58\x12\x52\xa2\xbd\x32\x09\x85\xdd\x64\x84\xeb\x27\xf0\xf1\xf3\xf3\x8d\xbb\x62\x14\x32\x12\xba\x58\x57\x1a\x8a\xbb\xaa\xfb\x39\x0e\x0c\xb0\x3d\x87\xec\xb0\x2d\x65\x06\xb9\xa5\x7f\xe9\xd8\x1f\xae\x05\xea\x4f\x73\xb8\x4e\x77\x5a\xae\x09\x5b\x7f\x20\x15\xae\xbb\xec\x1d\x5f\x72\xe8\xde\x56\x04\xe0\x0f\xa5\xf4\x17\x85\x7a\x2a\x9b\x4c\x9f\x3f\xcf\xc0\x41\xac\x42\xca\x94\x97\x56\xd3\x67\x5f\xd1\x4e\x7a\xbb\x35\x90\x01\x2a\xa3\x3f\xef\x89\x32\x78\x58\x16\xed\xee\x6e\x34\x6b\x21\x49\x53\x0a\x57\x3e\x66\x45\xd3\x67\x11\x67\xaf\x9b\x70\x2d\xe3\x4e\x2d\x6a\xc0\x80\x30\x5e\x86\x20\x0d\x74\x64\x39\x38\xea\xd3\x01\x7f\x9b\x59\x1d\x21\x8d\x13\xa2\x1f\x7a\x3a\xfd\x05\x43\x5a\x36\x00\x1e\x68\xca\xf0\x9b\x31\x71\x63\xee\xbc\x5b\x9c\x87\x40\x37\x77\x00\x18\x04\xd0\x11\xce\x2f\xd5\x50\x96\x65\x64\xae\x7d\xbe\x2d\x00\x97\x11\x91\x25\xb7\x43\xec\xb9\xfa\x3d\x73\x71\xbd\xd1\x8a\x67\xfb\x02\x47\xf2\x69\x77\x4f\xdd\x14\x17\x10\x9a\x72\x1c\xc8\xb1\xb6\x48\x3f\xdb\x24\x99\xd7\xd5\x55\x7f\xc0\xf1\xf9\xd4\xbc\x96\x53\x79\x12\x00\x19\x29\x17\x65\x25\x4b\x7b\xa8\xbf\x02\x20\x2d\xb8\xf1\xd8\x3e\x9f\xc9\x05\x77\x73\x48\x31\x1d\x08\x2b\xc1\xb5\x3d\x1d\x9e\x4e\x87\x39\x15\xae\xf9\x59\x83\x09\x90\xcf\x9b\x0d\xca\xdd\x5d\x93\xe6\xc4\xe5\x00\x4a\x3d\x42\x71\xbe\xa8\xaa\xeb\x5e\xbf\x86\x90\x90\xc4\xeb\xe7\x6f\xa3\x82\x33\xd0\x68\x1c\x81\x7f\xf6\x58\x65\xe1\x05\x48\x09\x55\x9a\xa6\x26\x1f\xb7\xb1\x54\x81\x1d\x0b\xd7\x6b\x1f\x91\x14\x9e\x8c\x65\x4f\xde\x51\xb4\x03\xf4\x65\xa2\xcf\x0c\x82\x25\x21\xb1\xe5\x9c\xe8\x04\x3f\x26\xad\x3e\x53\x36\x0a\x56\xc8\x55\xf3\x36\xb0\x80\x84\x0f\x9c\xee\xf0\x50\xaa\x4c\x9f\xff\x71\xaa\x0c\xbb\xc8\xf8\xf8\x40\x08\x73\xcb\x65\x03\xb9\x8d\xbe\x7c\x29\x21\x5f\x17\xeb\x9b\xa5\x3b\x53\x68\x19\xcf\xf6\xba\xac\x34\x66\xcd\x38\x45\x3d\x7e\xeb\x22\x0c\x4d\xf4\x74\x91\xe7\x4f\xf8\x51\x2f\x7b\x4f\x48\x84\x69\x18\xcb\x4e\x67\xf5\x01\xea\x26\xa1\x3c\xcd\xe4\x04\xd2\x23\x74\x61\x7d\x12\xaa\x6c\xa7\xf9\x48\xc3\x7d\xc6\xc6\x15\xa1\x84\x28\x9a\x88\x3a\xfe\xd1\xde\xdd\x04\x02\xd5\xbb\x18\xa9\x3b\x52\x21\x95\x4d\xd6\x6f\x65\xd5\xdc\x9c\xba\x2f\x19\x31\x41\xd6\x23\x9c\x0e\xdd\x4f\xa9\x91\x99\xd9\x66\xc5\xeb\x29\x87\xea\x76\xf7\x6d\x10\x74\x15\x91\x40\x02\x5c\x1c\x73\x68\x48\x61\xd6\xfa\xa6\xe3\x3d\x44\xc4\xb1\xa0\x35\xf3\x08\xe7\xed\x49\xd4\xb2\xca\x8e\x17\xac\xe5\x20\xe2\x34\x49\xec\xf0\x74\x15\x7f\xf3\xee\x9c\x88\x11\xa8\xac\x6f\x75\x55\x75\x1a\x44\x6c\x35\xb6\x25\x1c\x29\x34\x54\x96\xf9\xb3\x9e\x5e\x51\x6b\x66\x25\x3b\xee\x4e\x39\x8d\x84\xdd\x1f\x57\xae\x99\x44\x09\x45\xb1\x9c\xfb\xbd\x5a\xbf\x24\x49\xf2\xf9\xb6\x2c\x92\xd8\x58\xa6\xc7\x32\x3f\x1b\xd1\x43\xac\xea\x71\x56\x40\x24\x89\xc9\xb5\x02\x85\xbd\xbe\x16\x59\xb3\x21\x01\xfd\xd1\xc2\xe7\xfa\xa2\xb4\x50\xd5\xbf\x50\x36\x2f\x86\xf1\x7a\xd2\x27\x0d\x91\xb2\x0c\xc7\xec\xfd\xa7\xbb\x46\x1a\x81\x13\x20\x25\x39\x3b\x87\x93\x18\xae\xdf\x22\x4d\x0d\x43\x7d\x85\xed\x12\x3f\x18\x17\xa9\xc5\x34\x83\x21\x1e\x99\x24\xb4\x04\xf7\x22\xde\x36\x3f\x57\xc7\x37\xa7\x7b\x3f\xbe\x25\x1e\x70\x62\xc7\xf9\x82\x43\xd5\x12\x10\x3c\x34\x44\xf3\xa0\x94\x79\x6d\x33\x7c\x5d\x20\xb8\x12\x91\xa1\xbb\x29\x7e\x74\x71\x07\x01\x49\xa0\x3a\x8a\x50\xc8\x2f\x34\xfc\x40\x40\x8a\xc4\xc5\x2c\xaa\xf2\x07\x56\xeb\x0e\x10\x29\x80\xa7\x54\x64\x75\x2a\x28\xf7\xdf\x7e\xf6\x7a\x5d\xac\x6a\x59\x95\x1f\x9f\xb2\x8b\x81\x10\xb1\x11\x4d\x16\xa7\x73\x51\xaa\xe9\xba\x22\xd2\xd0\xe3\x3d\x06\x6c\xb5\xbb\x1f\x9b\x92\x42\x68\x9f\x2a\x23\x76\x08\x07\x32\xe5\x3f\x45\xb3\x4d\x06\x93\x14\x42\x2a\x27\x71\xf1\x96\x35\x4b\xa2\x06\x19\xdf\x9f\x62\x09\xb3\xc9\x45\xda\x00\x66\x63\x15\x93\x43\x7c\x41\x20\x19\x53\x0b\xda\x4b\x11\x81\x40\x0b\xea\x31\x6c\x0a\x19\xc1\x2e\x47\xc7\x4a\x4f\x04\x4c\x0f\xd9\xe1\x48\x36\xf7\x98\x67\x64\xf9\xcc\xd4\x38\x4a\xe6\x49\xaf\x97\xe0\x9a\x02\x66\xe6\xb6\xf9\x38\x1c\xff\x71\x27\x8a\x8c\xb6\x31\xa1\x37\x1c\xd9\x0e\x48\x16\xa7\xa6\x3a\xb5\xfd\xdd\x0c\xf3\xae\x09\x7c\x4a\x32\x91\x30\xe1\xbb\xc9\xa5\x7f\x9a\xd3\x93\x7e\x84\x64\x48\x99\x9b\x7d\xa9\xca\x43\xb9\xcc\xcb\x8f\xe2\x93\x54\x9c\xf4\x53\x13\xd4\xee\xd5\x72\x14\x12\x30\x75\x7a\xa9\xe1\x62\x2e\x7d\x9e\x2a\x39\x8c\xbd\xb8\x9b\xf6\x81\x51\x7a\x9f\xe8\x33\xad\x9c\x60\x4f\xfe\xdd\xb6\x23\xf9\x87\xc6\xf1\x75\x53\xd3\x49\x43\x4e\xb7\x82\xc9\xfb\xfd\x77\xf4\x9f\xb9\xad\x45\xfa\x5a\x3b\xde\x85\xc7\xac\xc8\x6e\xce\x23\xb9\x24\xdb\x29\x60\x01\x5a\x26\xfa\xd6\x02\x76\xac\x44\x93\x4e\x52\x52\xfa\x91\x88\x3c\xbe\xfe\x59\x92\x1a\xce\xec\x02\x2b\x43\x3f\x0a\x2c\x89\x30\x21\x66\x09\x9b\x32\x39\x5d\xe4\x01\x61\xae\x96\x2f\xf3\xda\x1f\x97\xe1\x6f\x19\x31\xe1\xd6\x89\x0e\x19\x4d\x30\x9f\x17\x53\xe6\xd4\x9a\x5d\xfd\xdc\x33\x87\xfe\xfb\x3f\x5d\x82\x72\xb4\x14\xc9\x08\xe2\xc4\x0a\x8b\x1d\xb0\x68\x2c\x6b\xb1\x5b\xca\x65\xa4\xc3\xd0\x92\x47\x19\x94\xf2\x5d\x59\x19\xf2\x81\xf9\xf1\x15\xfb\xe8\xf9\x94\x29\x1b\xc4\x93\x07\xb9\x37\x19\x27\x46\x42\x8f\x88\x8c\x3e\x86\x00\x77\x99\x04\xa6\xee\x76\xbd\x79\x7e\x6a\x9c\x4a\xfb\x95\x57\x9b\x70\x4e\xf6\x77\xc7\x57\xf8\xc7\xd8\xcb\x9e\xdd\xbc\x64\x22\x13\x01\x23\x00\x80\x13\x15\x1b\xf6\x77\x92\x56\xdc\x6e\x23\x32\x55\x86\x83\xe5\x0b\x36\x0f\x50\xa8\xf5\xc5\x24\xb3\xfd\xb8\x1f\x52\xf1\xec\x23\x55\x4c\x5c\x79\x43\x3c\x34\x42\xa6\x96\xf5\x76\x18\xfb\x74\xfb\x96\xe4\x31\xf3\x02\x77\x9f\x35\x7e\xad\x1c\x1e\x4c\x72\x21\x0c\xfd\x1d\xfe\x6c\xb6\x68\x4a\x92\xbb\xb0\xbc\xe4\x2a\x88\x1c\xe3\xbf\x09\x5c\x5a\x49\xee\xf1\x7d\x82\x97\x12\x3d\x12\xc5\xff\xbe\x64\xef\xb8\xe8\x88\xaa\x41\x42\x12\x5a\x66\x7e\xca\x99\xed\xeb\x8f\x81\xe8\xcf\xfc\x6b\x05\xae\x68\xde\x10\xb2\x8a\x98\xdc\xdd\xf0\xf3\xfb\xb5\x3f\xf9\xcf\xd8\x09\xfd\xb7\xff\x1f\x77\x38\xa8\xd0\xae\x14\xdf\x31\xeb\xcb\x8e\x27\xb8\x20\x09\x56\x2f\xd2\x80\xc2\x56\x9d\xcd\x26\x45\x28\x8d\x78\xb9\x34\xd9\x38\x43\xab\xeb\x5a\x65\x18\xa4\x7e\x37\xf5\x49\xe7\xce\x19\x75\xc3\x98\x8f\x54\x32\xa0\x24\xef\xfe\xb6\xcc\xde\xc0\xa6\x20\x52\xd7\xa8\x62\x4a\x89\xee\x9e\x77\x8b\x87\xfd\xf6\xf9\xe1\xd6\x8a\xfe\x6c\xbf\xbe\xbc\x3c\xfc\xb9\x7f\x58\x3f\xae\x9d\x9f\x25\x31\x95\xdc\xe6\xa7\x5c\xa5\xfa\x68\x02\x23\x0f\x63\x1b\xdf\x3f\xc0\xcf\x51\x2d\xcb\xf8\xc5\x6a\x4f\x50\xda\x03\xd4\x21\xa3\x74\xd0\xde\x38\x01\x73\x49\x49\xa9\xc3\x84\x5c\x2c\x0a\x93\x52\x52\x71\x62\xd6\x48\x1d\x0a\x92\x4a\x1d\x2c\xfe\xe3\x59\x33\x87\xb0\x56\x1e\x98\x3a\xb2\x76\x55\xb4\x09\x5b\x8a\x26\x5f\x50\xc1\xcf\xec\x1d\x8a\x05\x06\xac\x61\x73\x2c\xbf\x0a\x2b\xba\xa3\x52\x5f\x48\xb7\xc2\x99\xf2\xd2\x49\x07\xe9\x6b\x3b\x91\xe7\xf3\xc2\xca\xf7\x92\xd0\x6c\xa6\xaf\x86\x33\x81\x82\xdc\x9f\x0f\x64\xe5\x7b\x9c\x85\x23\xd2\xa2\x9b\xb3\xfd\x07\xce\xb2\xfd\x81\xf2\x03\x70\x62\x8e\x66\xae\x3d\xeb\x0d\xb4\x16\xc0\xdd\x3c\x3f\x20\x28\x3f\x8c\x68\xb4\x5e\x04\x0e\x95\x9f\x24\x3c\xed\x75\xc3\x6c\x96\x7c\xde\x1b\x50\xa1\x17\x90\x48\xcc\xef\x7f\x2e\xaf\x74\x9c\x0f\x22\xa8\xd0\x53\x9a\xb9\x4a\xe2\x42\x67\xaf\xa7\x39\x26\x00\x15\x0a\xa3\x69\xaf\x33\x51\x16\x20\x65\x66\x2a\xe4\x6d\x6b\xe4\x49\x5a\xe7\xc5\xe9\xec\x48\x2d\xd7\xc5\x6a\x77\x3f\x64\xb5\x04\x15\x85\xd2\xac\x25\x04\x14\x31\x40\x0c\x92\x31\x1e\xc6\x9f\x54\xc4\x35\x51\x93\x2d\x4b\x09\xcb\x32\x77\xc4\x2d\x2a\x0e\x12\xe2\x93\x7c\xcf\xaa\xe6\x84\x06\x6c\xf2\x52\x66\x7d\x1e\x56\xc5\x11\xa3\x57\x99\x97\xaf\x8e\xac\x98\x78\x01\xe6\x55\x0a\x40\xc5\x00\xd4\xdf\x52\xb4\x90\xaa\x86\xea\xa8\xd8\xdb\x76\x99\x1a\xf6\x99\xab\x91\x34\xdb\x33\xd1\x3e\xad\x07\x4b\x38\x1c\x21\x7b\x75\x9c\xeb\xd3\xc1\x38\x39\x2a\xf5\x34\xed\xa6\xdf\xcb\x2a\x57\x23\x52\xbe\x39\xa3\x45\xf1\x48\x50\xca\x5a\x54\x99\xc0\x0e\xd6\xa0\x78\xaa\xc8\xf7\xa8\xdf\xca\x0f\xf2\x7d\xba\x06\xa9\x8d\xe0\x0b\x95\x7c\xba\x18\x6d\x85\x6a\x59\x66\xe3\x54\xc7\xfc\x90\xe2\xca\x23\x2d\x91\x43\xa9\xb0\x3b\x29\x40\x42\x4c\x3e\xf8\xf3\x98\x55\xb8\xa8\xeb\x52\x66\x17\xb5\xa4\x0a\x90\x27\xbe\xc1\xc7\x42\x96\xd7\x53\xbf\x54\x09\x16\x10\xc4\x7f\x93\x1d\x4e\xe5\x7b\xf6\x52\x95\x1a\xeb\xba\xac\xa6\xe7\x91\xa0\xc8\x6a\xb4\x0c\x38\xfb\xf7\x4b\x0a\x1c\x25\x95\x09\xef\x56\xa8\x10\x0f\x83\x50\x89\x52\x9e\x69\x39\xc0\x4f\x13\x6a\x6e\x4d\x9a\x6e\xb4\xa8\x94\x51\x8a\xc8\x92\x28\xbc\x4c\xd4\x41\x40\x29\x0c\x53\x6b\x58\xb9\x95\x6e\xb8\x43\x28\x0c\x39\xa5\x7a\x8c\x5f\xd1\x9a\x2e\x93\xd4\xb1\xc2\x84\x99\x1e\x8e\x1a\xff\x36\xab\x50\x36\xb7\x28\xb2\xe9\x02\x85\x3c\xf4\x79\xaf\x1c\x70\x8d\x3b\xea\xca\x24\x46\x91\x78\x7d\x76\xea\x9f\x27\xa2\x38\xcf\xcf\x9b\x01\xd5\xc5\xe4\x08\x1d\x04\xc6\x8f\x6a\xa0\xc1\xad\xa9\x43\x9c\xbc\x58\x9d\x70\xd6\xc9\x8a\xde\x62\xdd\x54\xe5\x79\xe0\x51\x8c\xef\x5f\x8b\x90\x58\x32\x57\x39\xb6\x6f\xb9\x1f\x85\x5a\x18\x81\x07\x53\x8c\xeb\xe4\xb4\x40\x69\x25\x43\x87\x12\x6d\x9d\x18\x54\x16\x1b\xfe\x1d\xb2\xc6\xe0\xf7\x27\x37\x84\x5e\x9a\xf0\xa0\xcf\xb7\x2c\x0a\x75\xa9\xfa\x05\xc8\x3c\x8f\x10\x92\x06\x45\x05\xc5\xdd\xa9\x18\x19\xee\xa3\x49\x85\x4c\x98\xfa\xee\x63\xd9\x55\xcd\x4e\x3a\x68\x83\x8a\x21\xed\xcd\x69\x31\x0a\xfa\x91\xa4\x30\x5e\x5f\x6a\xd4\x7a\xbe\xdb\x06\x8f\xe1\xe4\xe6\x03\x66\xa8\xbc\x6a\x6c\x8c\x1a\x65\xcf\xdd\x3f\xbb\x3a\x60\xe0\x23\xcd\x21\xe2\x6e\xbf\x2f\x8b\xd7\x9b\xac\x18\xc6\x2a\x31\xf2\x80\x80\x51\x5f\x2c\xf5\x53\xf7\x3b\x26\x06\x30\x55\x41\xd1\x2c\xcc\x97\x1d\x9f\x3a\x8e\x53\xdf\x21\x5f\x4f\xe7\xcb\xd2\x0f\x4c\x22\xa4\x20\xa3\x53\x71\xbf\xd9\x2c\xea\x4e\x65\x08\x30\x81\x80\x75\x5a\x09\x8f\xd8\xc0\xe4\xf0\xd4\x93\xc4\x22\xfb\x23\x93\x46\xaa\xac\x75\xb2\xd6\xcb\xe7\xc9\x6d\xa4\x89\x47\xaf\xe4\xf1\xaf\x32\x2f\xb2\xee\xfe\x53\xed\x3b\x5d\x6f\x97\xdc\xdb\xe1\xcf\x86\x64\x64\x86\x2a\xa0\x80\x10\x26\xbd\x61\x70\x98\x1a\xb6\x08\x52\x44\x38\x0a\x0a\xc9\xb2\x4f\xe4\xa0\xf0\x74\xd2\xbe\xa7\xaf\x35\x56\x4e\x10\x6b\x7b\x2d\xeb\x88\x82\x45\xb4\x1a\x9a\x5a\xc1\x6d\xd3\xae\x47\xaf\x96\x5f\x9b\x45\x17\xf3\x74\x34\x86\x44\x68\x24\x22\x68\xa1\x5f\x5a\xc4\x74\x57\xd5\x81\x22\x16\xe1\x50\x4f\x79\x9c\x82\x9e\xde\x07\x1a\x49\x0d\xb2\xd6\x27\x0f\x2c\xa5\xe4\x36\x3b\xbe\x95\xed\x2e\xf1\x39\x86\xd0\x1d\x85\x7e\x60\xdf\xe2\x1d\x3a\x9d\xa7\xd1\x79\x55\x60\xb2\xa4\x0d\xd6\xcd\xba\x5e\xf6\x75\xa2\x6d\x0b\x30\xe7\xbf\xc1\x14\x57\x8e\x2a\x02\xca\x79\x3f\xc1\x21\xeb\x10\xa7\xe3\x41\xd0\xee\x82\xa6\xfc\xba\x9d\xf2\xad\x57\x39\xf4\x02\x51\xa5\x66\x16\x54\x65\x33\x20\xdd\x1d\xd8\x94\xa8\xb8\x34\x65\x7a\xc6\x34\xdc\x96\xb9\xba\x2b\xab\xdd\x5b\x56\x7f\x81\x2e\x8c\x80\x3a\x8d\x8c\xce\xdb\xc1\x21\x08\x47\x7a\x4f\x6d\x87\x98\xa2\xcd\x2f\x7f\x3c\x38\x13\x66\x72\xa7\x5a\x46\x94\x14\xf9\xfd\x2c\xb0\xba\x87\x42\xe5\xd7\xea\xc8\x50\x6b\xa0\x60\xf7\x6a\x77\xbf\x7f\x5c\x3f\xed\xbf\x3c\x2f\x1e\xec\x85\x34\x8b\x34\xb9\xf8\x86\xe1\x8b\x98\x6b\x46\x52\x4a\xae\x5b\xc2\x5d\x4d\xe0\xed\xd3\xd6\x0d\xdd\x51\x52\xcc\xf5\xd4\xc8\xec\x37\x58\xe4\xf9\xcb\xc6\x01\xaa\xb4\x1f\x08\xb3\x26\xef\xee\x57\x9b\xcd\xea\x76\x28\x7e\x0a\x3a\xe0\x5e\xe0\xb2\x8f\xad\x8b\xda\xbe\xb1\xae\x0d\xe3\xd8\x2e\x10\xa6\x96\x62\x3d\xf1\xbe\x74\xc8\xd2\x44\x75\x17\xfd\x44\x8e\x0d\x74\x18\xfb\x54\x93\xd9\x5e\x68\x83\x43\x17\x44\x87\x52\xc5\xd6\xf8\xbc\x87\x7c\x2a\x93\x00\x3a\x8e\x8c\x6b\x6a\x84\x0d\x0d\xf1\x33\x15\x51\x0c\x93\x9b\xfd\x58\xd0\xb1\x34\x71\x00\x32\x66\xf3\x2b\x30\x82\xff\x9b\x5c\x43\x1b\x89\x0b\x33\x3a\x09\x45\x33\x83\xdc\x1a\xb8\x56\x3a\xf1\x0d\xcc\x28\xab\xbb\x65\xc0\xb6\xa4\x7e\x44\x7c\x79\x5d\x1c\xe2\x97\xea\xec\xc3\x0f\x99\x0a\x45\x81\xf2\xdd\xfa\x76\x31\xc4\xb8\x6b\x1e\x25\x91\x25\x42\xb5\x3e\xed\x6c\x64\x5c\x73\x95\x72\xe9\x80\x00\x59\xd1\xd8\xa1\x35\x67\xd0\x6b\x08\x12\x2a\x8a\xfb\xe3\x71\xf1\x87\xbb\x0e\xc4\x4a\xd9\x05\xd3\xee\x4d\x0f\x65\x3d\xbd\x08\x70\x83\x56\xeb\xd8\xf7\xe6\xec\x01\x2d\xb8\x66\x93\x45\xfc\xe6\xbc\x56\xeb\x66\x72\x37\x93\x8f\x21\x3d\x88\x86\x44\x72\x63\x0d\xcd\x71\x5f\xe5\x33\x2a\xbb\xd3\x90\xe5\xc3\xd8\x50\xd7\x9c\x24\x3d\x03\x6a\x3b\xe3\x69\x97\x34\x63\x62\xd6\x17\xd3\x2a\x0a\x53\xd5\xf1\x80\x55\x30\x4c\x06\x5c\xc5\xc0\xb8\x63\xa5\x91\xed\xa5\x82\x4d\x22\xae\x77\x16\xf7\xe3\xf6\xf1\xd7\x25\xdd\x5a\xfb\x9e\x13\xe4\x79\x80\xda\x45\x1b\x1d\x63\x9b\xf0\x3c\x1e\x51\x05\xe4\x9f\xe5\x69\xa8\x36\x23\x3c\x0f\x18\x4d\xff\x2e\xdb\x39\xe5\x47\x1f\xde\xa7\xf0\x3c\x85\xf4\x8c\xa7\xc2\x6d\x37\xdf\xcb\xea\x07\x56\x0b\xad\x51\x36\x63\xee\xa9\xc9\x91\xed\xfb\x71\xf5\xd0\x8b\xdb\xdb\x8d\xbb\x03\x16\xb1\xc4\x0d\x3b\x72\xcb\x46\x49\x01\xe1\x11\x51\x97\x33\xa1\x8c\x32\xe1\x84\xc3\x41\x78\x3e\x4b\x3a\x14\x46\x81\x4d\x5f\x72\x36\xfc\xa8\xc2\x0b\x40\xd1\xc3\xf6\x77\x3f\x17\xb2\xb0\x9d\x63\x2f\x25\x34\xe6\x43\x99\x43\x8f\x9a\x16\x5e\xe2\xa5\xb4\x63\xdc\xc2\x6b\xd3\xfd\x16\xa4\x26\x3d\xf9\x06\x15\x06\xdd\xaf\xa1\x07\x76\x42\x90\x80\x41\xeb\xf3\xee\x4a\x63\x6d\x8d\x6f\x2c\x49\x34\x01\xf2\xbe\xbf\x41\x07\x3d\x11\x5e\x92\x9a\xa8\xf7\x75\x22\x0e\xdb\x11\x42\x41\x5f\x17\xea\x1f\xf7\x5d\x6a\x55\x78\x22\x56\x91\x21\x0a\x39\x1e\xcb\xaa\x59\x1f\x8e\x08\xf2\xed\xd0\x01\xfd\x84\x27\x84\xa2\xfb\x6e\x5f\xc0\xae\x5c\xd4\x32\xcb\x2c\x0f\xc0\xf8\xe3\x49\x1f\x0d\xef\x11\xd6\xcd\x5e\x40\x9d\xc9\xf6\x15\xef\x3e\xca\x05\xdd\xda\xee\xad\x2a\x3f\xdc\x39\x65\x14\x53\xd5\xc3\x6a\x14\xb7\x1c\x2e\xb7\x93\x91\x21\x53\x33\xd9\xb3\x22\x6b\x48\x7e\xe4\xd7\xd1\x57\xe1\x49\xee\x0b\xa3\x5d\x5a\x9b\xc9\x56\x56\x77\xe5\x25\xb0\xbc\x5b\xdd\x85\xa7\xbc\x80\xb2\x15\x1a\x3b\x11\x7b\x45\x88\x87\xfa\xce\x30\x6c\x57\xbf\x75\x3d\x4d\x15\x49\xcf\x6c\x7b\x83\x05\xea\x4c\x66\x50\x65\xfd\xe7\x41\x16\x28\xa7\x99\x8e\x64\xd8\xef\x3e\xca\xae\x51\x19\xf1\x17\x12\x20\x29\x7f\xcc\x94\x3d\xdb\x8e\x3a\x49\xc2\xc0\xa1\x1a\xd5\x20\xff\x27\x98\xe7\x01\xa1\x4a\x8e\x65\x9e\xc9\x0c\xeb\x71\x63\xc2\x8d\x48\xa2\x83\xc8\x3f\x4f\xb2\x5d\x82\x79\xc2\x70\x98\xdf\x67\x55\x79\x3e\xfd\xc8\x88\xc1\x19\x9c\xbe\x93\x60\x0c\x62\xca\x3b\xaf\x36\x5f\x9e\xd7\x4f\xdd\xaf\xa8\x62\x7b\xe7\xfd\xf2\x7f\x57\x56\xdf\xb3\x42\x95\x1f\xb3\xab\xa9\x60\xbe\xe7\x39\xb1\x24\x2b\x9a\x3a\x51\x18\x1b\xdf\x99\xcf\xe4\x00\x42\x4c\xf2\x4b\xd7\xc0\x8c\xee\x08\x30\x9a\x26\xfb\x1e\x5c\xf8\x64\xc4\xd5\xd7\xc5\xf1\xd4\x4c\xcf\x8f\x46\x75\xa1\x2e\xcb\x8f\x37\xe8\xde\x59\x10\x79\x86\x0d\xa4\x26\x9e\xaf\xf2\xe7\xd9\xb5\x84\xcc\x60\x0d\xcb\xa2\xfd\x92\xeb\x7a\xdb\x88\xae\x29\x08\xdc\x5e\x74\xc9\x74\x39\xb9\xcb\x88\xa5\xac\x93\x9d\x29\x4e\xf5\xcd\xf9\x76\x68\x77\x4e\x3a\xc7\x11\x45\x50\x2b\x28\xd4\xfa\x4a\x32\x5f\xb0\x28\x09\x84\x2d\xd9\x23\xb8\xeb\x43\x29\x7f\xcc\x80\xc6\x04\x4b\x59\x14\x5b\x2d\x51\x74\x51\x7c\xc1\xd2\x88\x51\xfd\x20\xb1\x1c\x96\x45\xdd\xb3\x48\x09\x06\x01\x0b\xc3\xae\x74\x74\x61\x20\xba\x6a\xc6\x68\x11\x0c\x52\x64\x96\xe3\xf2\x11\xda\x85\x73\x8b\xd5\xbb\x9d\xde\xd6\x77\x16\x0c\x78\x48\xab\x18\xc5\x59\x5c\xd0\xc3\xc5\x13\x5d\x1f\x6d\x88\xd6\x0c\x75\xe8\xee\x76\x35\x79\x0a\x11\x9b\x60\xac\x9b\x7b\x37\x20\x7f\x3c\x2e\x9e\x16\x8f\x50\x9c\x7f\xbb\xb6\xff\x09\x26\xb8\x4f\x5c\x2c\x77\x8b\xe5\xee\x79\xb3\x67\xec\xb7\xae\x01\x1c\x6a\x3b\x3f\xc9\x1f\xe7\x53\xdd\xcd\x73\x26\x20\x8d\xfc\x01\x2a\x97\x02\xa5\x4b\xbc\x82\xb8\x13\x4c\xe8\x80\x46\xd5\x97\x76\x84\x43\x3d\x62\xd7\x10\x4c\x86\x91\x74\xd9\xed\xb7\x2c\x07\x85\xf9\xf1\x2d\x83\x9b\x69\xc0\xb9\xed\x09\x89\x05\xb3\x50\x20\x6d\xfe\xc3\xcb\xc8\x68\xec\xd1\x7a\xf5\xad\x6c\xf0\x11\xb2\x62\x5d\xe8\xf2\xe6\xbc\x2d\xe0\x58\xbf\x95\x96\x8e\x73\x72\x18\x84\x1c\xfa\xf2\xa3\x11\x5f\x85\xed\xa2\x82\x38\x56\x03\x63\xe1\x03\x2a\x45\xf2\x1f\xe3\x33\x29\x29\x09\xce\x2b\x5a\x27\xdf\xb0\x44\x0e\x87\x84\xd2\x46\xe4\x5d\xff\x3c\xde\x66\x17\xe4\x35\x93\x87\xc1\xd0\xf3\x46\xa6\xed\x5d\x55\x1e\x76\xe5\x7a\xb9\x78\x69\x77\x12\x62\xf8\xc2\xa1\x13\x30\xe5\x38\x18\xbd\x6a\x8c\x80\xea\x9a\xaa\x32\xc7\x7b\xa8\xaf\xa4\x71\x5d\xe7\x44\x13\x21\xf0\xb1\xac\x27\x84\x33\x82\xa1\xe4\x44\x30\x49\x33\xcb\xb1\x5d\x5c\x79\x92\xc9\x13\xe9\x20\x25\xab\xba\x38\x1d\xf6\x6f\xed\xa9\xf7\x95\xcb\x9a\xbb\x1e\x32\x90\xd6\x0d\xfa\x66\xa2\x84\x66\xde\x12\x51\xc7\xe8\x64\x3e\xf3\x20\xb1\x69\xa5\xdb\xea\xf4\x7a\xf9\x31\x7c\x16\x7a\x60\x91\x15\x5f\xb7\xb7\xf3\x03\xd4\x67\x2a\x0c\xad\xd6\x82\x51\x09\xf9\x58\xc2\x05\x2c\x41\xf8\x7e\x64\x6b\x41\xef\x17\xdb\x55\xb8\xb7\x15\x5b\x5d\x65\x91\xf0\xc3\x24\x15\x0e\xc0\xd7\xae\xb0\xf5\x73\xd1\x37\x19\x6c\x98\x79\x59\x8b\xe5\xfa\xca\xad\x44\x52\x50\x55\xc6\x5d\x83\xf2\x2d\xfb\x9f\x3b\x3c\x66\x01\x05\x2b\x0e\x04\xb2\x9d\xd3\xc3\x16\x7e\xcc\x53\xde\x71\x31\x66\x72\x80\x1c\x74\xd3\xdd\x4f\x34\x50\x9d\x4e\x51\x3e\x6b\xb2\x16\x16\x06\x1d\xdd\xfa\xee\x2e\x78\x5f\x76\x40\x2c\xe1\xa7\x1e\x50\x7c\x34\xab\x6f\x5a\xdb\xda\x54\xd2\x4f\xde\x30\xf7\x8c\x9a\x10\x28\x45\x24\x51\xf3\xcf\xc5\x43\x41\x38\xa7\x2f\xce\x5a\x75\x3a\x49\xb3\x83\xcf\xe7\x3c\x0e\xac\xdc\x09\x69\x18\x4f\x46\xea\x5c\x9c\x96\xf9\x76\x86\xf9\x10\xcb\xc4\xbe\xac\x1f\x84\x06\x74\xab\xa8\x0f\x52\x04\x13\x3e\xba\x81\x2f\xd8\xb6\x4b\x61\xc7\x93\x95\xff\x82\xd7\xee\x60\x19\xa5\x69\x57\x05\xf1\x8e\x45\x73\xaa\x70\x12\x90\xb0\x3d\x95\x1f\x99\xdc\xae\xc3\xaf\x2c\xdf\xa0\xca\x9a\xf3\x1d\x4e\x5f\x1e\x7a\x86\x66\xe1\x90\xbd\xb6\x3e\xed\xa0\x9a\x44\xf8\x98\x84\x84\x7f\x3f\xc0\xcf\x2d\xca\x53\x7b\x82\x2f\x27\xa8\x94\xd1\x53\x74\x9d\x30\x41\xde\x59\x04\x57\xe7\x60\x6f\xcf\xf9\x3a\x06\x02\x49\x93\x5e\xbc\xf9\x16\x63\xdc\xed\xe4\x53\xe8\x58\x52\x4a\xb6\x9d\xae\xed\xb3\x3a\x3b\xce\xd7\x12\x13\x2b\x37\xfd\x05\x2a\x85\xc5\x15\x0c\x86\x08\xbc\x48\x12\x17\xaa\x49\x41\xad\x0a\xf5\x05\x0e\xb8\x2c\x0b\x9d\x67\xb2\x19\xb1\x54\x99\x2f\xd9\xdf\xf7\xd0\x5f\xbf\xe4\xc2\x1d\x57\x76\x8d\x10\xd5\x74\x51\x7a\x33\x0a\xeb\xa6\x97\xfd\xfa\xcd\xb5\x72\x49\x51\x6d\x13\xc1\x74\x3f\x82\x20\xba\x42\x71\x12\x22\xc7\x6d\x59\x35\x5d\x8b\x96\x89\x41\x0e\xd7\xcd\x38\xf1\x6a\x3b\xb0\x24\x26\x36\x3c\x57\xae\x78\x89\x57\x13\x41\xbb\xb2\x01\x95\x95\xc2\xa1\x1c\x15\xe0\x88\x20\x64\x86\xb7\x11\x6c\x9c\x65\x84\xe6\x13\x41\x18\x87\x32\x70\xcd\x78\x8f\x55\xf9\x05\x8b\xf2\x30\x59\x02\x82\x50\x1b\x52\x8b\xc7\xf6\xd3\xda\x00\xc0\x42\xa9\xcb\xfc\xc1\xe4\x03\x45\x81\x4f\x0b\x97\x30\x0b\x8b\x0d\x90\x4d\x12\x48\x22\x88\x42\x8f\xb0\xab\xdb\xd6\xdd\x6e\x3f\x60\xdd\x54\x27\xd9\x94\xd5\x4d\x59\xe6\x04\x30\x19\x0c\xb4\x20\xe2\x29\x81\xc0\xf7\x35\x42\x7e\x0b\x0d\x6c\x9b\x0a\xe1\xaa\xa0\xe5\x25\x3d\xcf\xe8\x73\x46\x08\x26\x68\xd5\x94\xc7\x2f\xa7\x41\xde\x64\x74\x49\x8d\x64\x99\x19\x60\xfb\x4a\xf9\x51\xc4\xf8\x38\x7c\x37\x9c\xef\x41\x9c\xc6\x7e\xd2\x13\x18\x3d\xe7\xaa\x17\x85\x16\x41\x92\x40\xea\xe8\xf8\x4e\x87\x75\x21\xcb\xca\x24\x92\x6a\xe2\xf7\x47\xb5\xc1\xd6\x3f\x34\x18\xa9\xe9\x80\x48\x05\x90\xd1\xb3\x27\x34\xb0\x09\x02\xf6\x54\x53\x22\xe0\x01\x10\x48\xf1\x71\xf1\x74\xbf\xd8\xed\x16\x4f\x2f\x9b\xe7\x3f\xfe\x64\xdb\xdd\xe2\xdb\xaa\xeb\x13\x29\xb2\x1e\xf7\xa0\x48\x6b\x6c\xf5\xf3\x88\x55\x36\xda\xef\x07\x76\x64\xc0\x01\xc8\x66\xb5\xfa\x24\xab\xff\x9e\xb2\xe6\xec\x48\x9d\x5d\x1f\x19\x20\xeb\x71\x64\x0f\x25\x5c\xa9\x93\x64\xe3\x45\x64\xaa\xdf\xc6\xa6\x28\xba\xa1\xa1\x11\x70\xdd\xcb\xb2\xb8\x9a\xe2\x59\x8f\x26\x00\x5f\x6b\xe5\xcc\xf4\x33\xe4\xcd\xb9\xdd\xc4\x2d\x65\xe5\x2c\xac\x40\x04\xa0\x39\x15\x81\x5a\x75\xf9\x97\x09\x4a\xb8\x8f\xfb\xd9\xfe\xc2\x37\x44\xa7\x26\xa5\xe6\xfc\xa0\xab\x21\x97\x40\x08\xcf\xb7\x08\x84\x1d\x16\xd0\xad\xc8\x81\x90\x3e\xc5\xc9\x88\x49\xa2\x1a\xba\x95\x81\x54\x9e\xd9\x73\x4e\x79\x93\x39\x95\xb1\x29\xf1\xee\x64\x3b\x0e\x54\xc2\x12\x03\xd6\xc7\xf7\xfd\x07\xe2\x8f\xbd\x2b\x73\x12\x01\x72\xb3\xe2\xb4\x86\xf7\x64\xc5\x5c\x1f\x8e\xf9\xe5\xaa\x39\x5c\xee\xff\xde\xb2\xe9\xae\xa4\x0c\xc5\x20\x55\xb4\x38\x26\xf4\xe9\x70\xd6\x8c\x53\x14\xc0\xb2\x29\x12\x13\x12\xc9\xf0\xf6\x93\x4f\x63\xe0\x68\xce\xee\x21\xd7\xed\xca\xba\x68\x7e\xdc\x94\x93\x14\xa7\x08\xbd\xc4\xe8\xcd\xd9\x4d\xef\x1b\xb3\xb5\x94\xf5\x9c\xa3\x32\x7d\x69\xad\x3d\x17\x5a\x28\xcc\x0d\x14\x3f\x3e\x4b\xe7\x89\x90\x05\x26\xcf\x41\xab\x25\x0c\x57\xdc\xd0\x0f\x8d\x86\xf3\xfd\xfd\xed\x3c\xea\x6f\x38\xa2\x43\x5f\x19\xf2\xf1\x1b\xfc\xab\x2c\xb0\xfe\xff\x57\x2d\x2f\xc2\x40\xc6\x64\x24\x19\x0e\xef\x62\x10\x17\x0b\x43\x4f\x13\x1f\x55\x56\x64\x3d\xc5\xcb\xd5\x8d\x7c\xfc\x78\x61\x90\x12\xb6\xba\x3e\x66\xc5\x22\xcf\xdd\x29\x23\x34\x21\x38\xaa\x62\x5b\x2e\x5e\xdc\xef\x71\x28\xa8\x1c\x9c\x50\xac\xf5\x36\x2b\x24\xb6\x8e\x4c\x47\xd6\x2e\xc2\x38\xf2\x08\x3d\x77\x97\x41\x33\x46\x2e\x89\x30\x4e\x84\x25\x44\x7f\x2f\x7f\x0c\xe9\xa9\x45\x98\x84\x11\x35\x3d\x2c\x16\x9b\xd1\x4b\x4e\x3d\x83\x42\x6f\x7a\xe9\xf7\xdd\x5b\x85\x23\x65\x16\x11\xa6\x81\x49\xce\x34\x25\x65\x35\xba\x9f\x41\x7b\xc2\x71\x1f\x63\xdd\xf4\xfb\xd1\xe4\x35\xf0\x38\x04\x9b\x7c\xbe\x3d\x15\xaf\x58\x16\x4f\xf8\x71\x97\x97\xe5\x65\x1c\x6d\x3c\x12\x81\x19\x1a\xce\x6f\x59\x9d\x19\x3e\x91\x5b\xac\xb2\xf7\x6e\xb9\x0c\x41\x1a\x36\x4a\xa2\x3c\x3a\x40\x73\x8b\x32\x3b\x40\x3e\x1d\xd1\x22\x32\x25\xb6\x5f\xe0\x90\x35\xe7\xd1\x1b\x10\x22\x66\xda\x6a\x6d\xf5\x36\x25\xf3\x3c\xef\xe0\xba\xc8\xc4\xa7\x75\xbb\x83\xdf\x1b\x38\xc3\xf8\x19\x25\x30\x82\x69\xab\x72\x22\xbb\xf1\x99\x4e\x80\x08\xa5\x4e\x9d\x50\x84\x01\x23\x2e\xcb\xbc\xac\x76\xe7\xa3\x33\x6b\x43\x05\x31\xe1\x71\xd6\xb5\x35\x06\xdd\xef\x22\x26\x6b\x65\x57\x41\x53\xfe\xe8\x7e\xd5\x92\x10\x4f\xd2\x0e\x8e\xc7\xa1\xe8\xc8\x15\x0a\x88\xf1\x1d\xa1\x17\xb1\xa0\xe7\xc5\xa6\x97\xd5\x17\x7f\x88\x10\xb5\x22\x47\x7c\x53\x8a\xb2\xb9\xd9\x7d\x26\x0e\x28\x42\xcd\x7c\x1a\xd1\xa6\x04\x8c\xca\xa4\xc7\xed\x81\x0e\x54\xc7\x96\x3b\x69\x4b\x38\x65\x51\x37\xf8\x17\xfe\xc8\x7e\xcf\xba\x8d\x3f\xf2\x38\x32\xe5\x90\x6d\x94\x8a\xa7\xe8\x86\x6d\x65\x41\x4a\x2f\xec\x08\x55\x8d\x8e\x0e\x67\x30\x1b\x22\x16\x18\xcb\x93\x08\xc3\x3a\x5e\x1b\x11\x31\x9e\x72\x1b\xec\x1b\xd1\xd3\x0f\xef\x2a\xf2\x3d\x53\x84\xa2\x2b\xb4\xfc\xd2\xb7\x0e\x1b\xe6\x7a\xf8\x40\x60\x20\x8a\x9f\x5e\xe8\x36\xda\x4e\x21\x4f\x49\x41\xfa\x40\x38\xb8\xcb\xb2\x70\x11\x85\x52\x68\x47\xe1\xd6\x0e\x87\x41\x8c\x22\x8a\xbd\x94\x96\x4d\x8b\x9c\x24\x21\x34\xe3\x1e\x3e\x17\x57\xc2\x72\x51\x1c\x9b\x75\xec\x44\xa4\xf1\xa8\x96\x65\xde\xba\x3e\xd5\x74\x3b\x8e\x62\x15\x92\x5d\x08\x26\x15\xfc\xe4\xca\x82\x44\x14\x6b\x8f\x0a\xf2\x8d\x33\x63\xbc\xfe\xbb\xaa\x3c\xac\xfe\x78\xde\x0c\xa0\x7c\xb3\x6b\x61\x94\x04\x31\xf1\xeb\x61\xf3\xb6\x33\x90\x4a\x97\x0a\x7a\x3e\x35\xc7\xd3\xa5\xca\xcf\xe4\x70\x50\x14\x75\xa0\x83\x3e\xc0\x11\x41\x88\x28\x91\x06\x90\xb4\x7c\xfe\xb6\xda\x2c\x9f\xd7\x4f\x66\x7a\xcf\x11\x4c\x8f\x5f\x48\x1a\x70\x87\x79\x6d\x07\xa6\x25\x8a\x37\x56\xc3\xc8\xb6\x8d\xd2\x58\xd3\xe6\xba\xc7\x43\xd6\x7c\x2f\xab\x1f\x1b\xaa\x95\x99\x87\x38\x8b\x28\x55\x92\x9e\x74\x4b\x34\xd1\xbd\x58\xf6\x8a\xaa\xde\xdc\x44\x8a\xb8\x27\x09\xca\x3d\x28\xb2\x1a\xae\x4c\x11\x67\x8c\xd6\xe6\x1c\xaa\x57\xac\x9b\x17\x2c\x5c\x2a\x5a\x44\x3c\x8c\xd0\xfa\xba\x46\xde\x6f\xf3\x30\x3f\x5c\x79\xc2\x88\xc3\xa8\x2c\x2c\x15\xd1\x06\x41\xbe\x4d\x52\xca\x22\xe2\xa9\xaf\x2d\xe7\xca\xf3\xa9\xe9\x6a\xb6\x5d\x2b\x44\xd2\x04\x54\x4d\xec\x93\xb0\x72\xfd\xbd\x28\x4d\x15\xb7\x5d\x89\x94\xa9\xa8\x39\xf5\x65\x1b\x22\x02\xcf\x50\xf2\x58\x50\xe1\x9f\xe8\x44\x67\x44\x04\x22\xa0\x09\xa5\x0c\x96\xea\xb6\x0f\xf2\x46\xa0\x18\x45\xaf\x4d\xee\xae\xf5\x7a\xc8\x01\xa7\x18\x4d\x59\x4d\x4c\xd5\x08\x94\x29\x37\x7d\xed\x18\x1d\x3a\xc9\x15\x11\x09\xf0\xe8\x63\x13\x9c\xb1\xb6\x48\x44\xd7\x28\xfd\x80\xb8\xae\x5e\xf3\x52\xb4\x0b\x86\xc4\x99\x64\x56\x24\x03\x4d\x03\x6d\x4e\x65\x74\x7c\x27\x12\xcc\xfe\x6e\x72\x1f\x37\xed\x88\x72\x01\x81\x48\x31\x19\xb8\xbc\xff\x03\x6d\xb7\x50\x3c\x57\xab\xff\x9e\xa0\x5b\xc0\x54\xcc\x29\x26\x66\x1e\xfb\x11\x7e\xce\xa9\xbc\x8b\x48\xf1\x50\xdb\xdc\x28\xe5\x7b\xcc\x22\x72\xcd\x7b\x1b\x1f\x8b\xcc\x30\x98\x92\x70\x75\xeb\x11\x6f\xfb\x59\x8e\xbe\x4f\x10\x88\xfb\x53\xf1\xf3\x74\x0f\xc7\xe3\x68\xc3\x8c\x30\xe5\x86\xed\x4c\x96\x84\x62\xea\x3f\x17\xa2\xe7\xc5\x1d\x68\x96\xb6\x9f\x27\x38\x8c\x70\xdd\x22\xd2\x3e\x3a\x87\xc2\x52\x4d\x6c\xa6\xba\xd1\x22\xd2\x11\x3a\xf8\xed\xe2\x1d\x1a\x98\xab\xde\x15\x91\x06\xcd\x13\x67\x18\x7f\x77\x25\xd2\xdd\xac\xd5\x52\x53\xe1\x0f\xd2\xb4\x5b\x9c\x9a\xd2\x8d\xeb\x89\x79\x10\x7b\x91\xa6\xbd\xdb\x08\x94\xec\x4a\xef\xa7\x68\xe4\x7e\xda\x49\x02\x85\x8d\x2b\xc8\x6a\x24\x26\x48\xff\xeb\xd6\xb9\x03\x31\x63\x3e\xa1\x56\x33\x2c\x2d\x4b\xdd\x37\x68\xad\x00\xd7\x1c\xfa\xa4\xec\x23\x48\x42\xdc\xfd\xea\x7b\x22\x1d\xaa\xa0\x5f\x45\x7e\x8f\xef\x24\x48\x63\x2a\xbf\x24\xc8\x8d\x2d\x6e\x5f\x56\xe7\xba\x99\x29\x37\x9a\x5d\x4c\xe3\x40\x30\xc2\x70\xeb\xde\xd4\x9b\x74\xd0\x86\x20\xc3\x71\x91\x7d\xc2\x09\x28\xe2\xd0\x57\x06\x8d\x64\x18\x8d\x1f\xca\x9a\xc4\x06\xe6\x3b\x47\xcc\x4b\x0d\x11\x73\xd5\x85\xee\xe2\x28\xc4\xc4\xea\xc9\x64\xf5\x1b\xaa\x0d\x48\x1c\xba\x6f\x71\x1c\x60\x6c\x0b\x2e\x0e\xe5\xb8\x45\xfa\xc4\xba\x59\xcb\xb2\xc2\x1d\xc2\xa1\x1e\x47\xcb\x4c\x2d\x0f\xfd\x3d\x8d\xff\xf1\x7f\xc3\x24\x4f\xbb\x3b\xea\xc8\x39\x88\x35\x16\x6a\x36\x5b\x7b\xe9\xef\xc4\x89\xe7\x29\x07\x51\x28\x5f\x5d\xa2\x34\x4e\x52\x43\x22\x65\x12\x42\xed\x70\x59\x15\xea\xf6\x62\xa8\xc7\x09\x57\x24\xbf\xb4\x59\xfd\xf3\xeb\x6a\xbb\xdb\x2f\x17\x4f\xcb\xd5\xc3\xea\x76\x7f\xf3\xe7\x7e\xb9\x59\x2d\x76\xcf\x0e\x51\x10\xa7\x7e\x6c\x70\x3f\x70\x9e\xac\xd0\x71\xea\x4b\x53\xa1\x7d\x7a\x03\x91\x35\x5d\x6a\x30\x4e\x43\x65\x1c\x1b\x23\x53\xf6\x5c\x90\xb1\x30\xb9\x07\x1e\x85\x44\x1c\xfa\x48\xe4\x06\xd6\xdb\xfb\x14\x20\x24\x62\x9e\x04\xb1\x3f\xe1\xa5\xda\x9e\x44\x4f\x6c\xdf\x77\x15\xa9\x61\x32\xaa\xe1\x70\xcc\xd1\x54\x89\x3b\xa4\xb6\x88\x85\x45\x89\x1f\xa1\x6a\x0a\xac\xd8\xfe\x23\xeb\x6c\xb9\x58\x26\x51\x68\x56\x52\x87\xc6\x75\x0d\x1c\x28\x30\x6b\x8d\x94\x23\xaa\xa1\x2e\x8b\x88\x55\xe0\x11\x74\xa0\x1d\x90\x3a\x2f\x3f\xf6\xa7\xe3\xb1\x5b\xf0\x63\x95\xb0\xa8\x2f\xf2\xf8\xd2\x2f\x52\x57\x1e\x56\xa5\xca\x64\xd4\xa8\xff\xed\xe2\xf9\x17\x2f\x07\x3d\xa6\xba\x4a\xf3\xbd\xc0\x66\x0f\x4e\x3c\xc8\xdd\x02\x86\x06\x60\x65\x56\x27\x8b\x7d\xbc\x08\x55\xc7\x18\x1b\xe2\x1f\x59\x16\xef\x58\x35\xbb\x72\xf5\xb0\xfe\x63\xde\xc2\x8a\x51\x68\x92\xf5\xf8\xfd\xfb\xfd\x28\xa2\x63\x9b\xb5\x17\x05\x1d\xd8\xa1\xf9\x28\xd7\x05\x25\x34\x57\xff\xb5\xcc\x0c\xae\xcc\xcb\x75\xf7\x35\x15\x6d\xdc\x43\xfd\x36\x1c\x33\x73\x76\x7e\xac\xc3\x18\x95\x15\x8d\x24\x3b\x54\x4d\x9e\x43\x47\x82\xb6\xbd\xed\x5b\x95\x1d\x8e\x77\x50\xf5\x61\xdd\x58\xc7\x46\x99\x73\x09\xc5\x9f\x04\x49\x19\xee\x37\xb1\x96\xcc\x72\x05\x43\x76\x20\xc5\xa7\x6a\xfa\x60\x52\xb9\xcd\x6c\x55\xe8\xb2\x92\xb8\xc1\xf7\xac\xbe\x50\xc8\x14\x89\x27\x91\xe0\x8c\x37\xd8\xe8\x21\xfb\xa2\x48\x98\x85\x9a\x2c\x94\x1a\x40\x4d\x12\xa6\x35\x69\x01\x3e\xee\x6e\x97\xab\xcd\xd2\xf7\x5c\x83\x1f\x70\x2a\xef\x7f\xb7\x62\x47\x6e\xc3\xfb\x9e\x35\x6f\xcb\x72\x30\x7b\x86\xaf\x29\x09\x3c\x4d\xc8\x99\xf5\xf2\x99\x68\xcd\xca\xca\x77\x27\x0c\x58\x4c\x43\x6c\xd5\xbc\x89\x4b\x45\xe1\xcf\xb7\xf3\x24\x48\x0c\x64\xe3\x35\x7b\xc7\x45\x9e\xf7\x1c\xcc\x22\x09\xc0\xc0\xf2\x0e\xf5\x6b\xfd\x1d\xb2\xd6\xdb\x20\x8d\xd2\xf1\x09\x42\x2f\x09\x45\x07\x46\x82\x73\x79\xea\x4c\xa7\x24\x0c\x3c\x82\xab\x1a\x09\xc4\x3d\x55\x77\x75\x6d\x91\x11\x51\xa8\x91\x64\xc2\x4f\xc7\xf1\x67\x4f\xc2\x44\x11\x39\x88\xe1\x35\xd9\xf6\xb6\x5d\x12\xb6\xdb\xdf\x48\x2a\xa2\x1e\xf0\x90\xf4\x17\x47\x25\x1d\xc8\xf6\x2e\x2b\x20\x1f\x7e\x9d\x50\xc7\xbd\x84\x0a\x28\x7c\x81\x0a\x0e\xd8\x38\xa9\x9c\x61\x3c\xfd\x17\x15\x03\x93\xf7\x19\x79\x89\x43\x38\xed\xa0\xfe\xb1\x98\x51\xbe\x14\x49\xec\x07\x54\x28\x09\x82\xd0\x7e\xd6\x37\x4b\x12\x1e\x98\xf1\xfa\x86\xf2\xc7\xb7\xd2\x96\x39\x19\x6a\x72\x2a\x3b\x1b\x8f\xde\x24\xd1\xa6\xde\xc6\xc9\x44\xec\xde\xf0\x80\x6a\x7b\xb4\xdc\x20\x9f\xdf\x68\xca\x82\x34\xb2\xa5\x8e\xae\xcc\x66\x8c\x33\x4b\x52\xcd\xa5\x2d\xd8\xbd\x9e\x95\x4f\x40\x68\x8a\x1b\x98\xda\xbd\xa1\xda\xa5\x48\xa8\x46\xa9\x2f\x24\xc3\x29\x44\x23\x51\x4c\xa1\x0d\xf8\x96\xfa\x59\x6f\x1f\xbb\x43\x55\x1c\xd0\x57\x96\x1d\x37\xf2\x20\x83\x96\xa8\x84\x53\x5c\x29\x2f\x27\x72\xb7\x22\x51\x4a\x51\x5c\xa4\xc6\x66\x43\x06\xd7\x1c\x36\x24\xc1\x10\x09\x1f\x57\x9f\x44\x6d\xec\xcd\xcb\x52\x4e\x91\x20\x97\xa1\xd5\xc6\x28\xa7\x90\x9a\x04\x75\x4a\xa1\x31\xd9\x95\x54\xee\x4a\xf7\x26\xc7\xe7\x49\x3d\x9f\xc9\xd0\x95\xbe\x98\x2a\x62\x35\x67\x3d\xa5\x5e\x20\x46\xe2\xb8\x0e\x82\x32\x9b\x17\x4e\x3d\x11\x12\x61\x16\x51\x30\x42\xfb\x2e\x86\xeb\x5f\xea\xe9\x54\x99\xf8\xe3\xfb\xa1\xbc\xe2\x72\xa6\x8c\x49\x11\xf7\x05\xb3\x1d\xfd\xd7\x6c\xae\x26\x65\xb1\xe7\xa8\x55\x6d\xe5\xde\x65\x66\x3e\x65\xe8\xb3\x78\x40\x58\xde\xd1\x59\xf5\x21\xe5\xd4\x87\xc8\xea\xb5\x35\x6b\x59\xae\x0a\xd5\xd7\xa8\x8b\xd4\x57\x01\x2d\xf9\x3d\x33\x3c\x3d\xfd\x6d\xa6\x1d\x28\xc2\x76\x0c\xfc\x94\xc0\xfb\xa6\x24\xf8\xa2\x32\x65\x7c\x5b\x41\x98\xc6\xbd\xea\x81\xbb\xa9\xcf\xab\xb6\x44\x1a\x28\xa4\x71\xb8\xb8\x59\x8f\xb7\x84\x34\x64\x21\xad\x21\xd0\x0e\x4c\xf3\xa1\xe0\x0a\x50\x26\x0d\x43\x0f\xa5\xab\xca\xa7\x8f\xd4\xfa\x2e\x0f\xf8\x8e\x79\x0f\x91\x4b\x43\x29\x49\x3c\xc7\xa9\xba\x4e\x73\x91\x69\xc4\x38\x15\x82\x9c\x11\xaa\x70\xa8\xe1\x27\xd2\x28\x35\x80\xcf\xac\x5e\x2f\x17\x2f\xf3\xee\x65\x1a\xa5\xa9\x09\xc3\x60\x96\x3f\x94\xaf\xfe\x95\x31\x11\xf3\x94\xd2\x24\xcb\x89\xc4\xb3\x48\x93\x28\xf1\xcd\x98\xb7\x1c\x97\x03\x8d\xa3\x21\x1c\x5e\xa4\x49\xec\x93\x7c\x02\x05\x31\x58\x3a\x1a\x98\x89\xd4\x6c\x3c\xb7\x0d\xfc\xc0\x36\xa7\x68\x15\xa2\xb0\x36\x31\x8a\xf1\xba\x94\x72\x1f\x29\xd7\x2f\x31\x47\x31\x7d\x45\x90\x08\x6d\xc4\xcc\xb3\x42\x40\x8d\x43\x75\x12\x91\x8a\xc4\xa3\xdc\x9c\xd5\x94\xbd\xad\xca\x02\xa7\x98\x72\xd7\x15\x0c\x22\xff\x6b\x91\xe5\xa5\x01\xaf\xed\x20\x33\x8a\x57\xd3\xae\xc2\xc0\x4a\x3f\x50\x7c\xc9\x74\x63\xb8\x52\x87\x46\x65\xaa\x3c\xb3\x54\x1b\x39\x3c\xbf\xfb\x99\x2b\xde\xa3\xfe\xb6\xc7\xb2\x6a\xea\x1b\x6c\xe6\xb4\x98\x44\x8a\x69\x48\xe0\x47\x71\xaa\x8a\x3b\xc4\xbb\x8e\x45\x4c\xa4\x88\xc2\x00\xcd\xe1\x80\x5d\xe5\xb6\x48\x75\xeb\x3f\x1a\xda\x23\x13\x78\x19\xe2\x36\xcf\x7d\x2f\x24\x24\xd2\xc3\xfa\xfb\x57\x4b\x66\x24\xb8\xc7\x64\xea\x3b\x3b\x74\x83\x47\xc8\x14\xad\x32\x59\x17\x8f\xe0\xcc\x33\x46\xa3\x23\xd5\x7b\x5c\x3f\xed\xd7\x4f\xdf\x56\xdb\x5d\xd7\x03\x41\x1b\x90\x89\x53\x76\x9c\x18\x77\xdc\x8f\x91\xfc\x67\x32\x86\x5a\xf7\x17\xbf\x75\xd1\x0c\xee\x27\x31\xe5\x71\xca\x4a\xe1\xa5\x90\xcc\x2f\xf6\x65\x7b\x8e\x20\x30\xea\x3d\xf5\xc8\x09\xe0\x41\x0c\xb4\x69\xdd\x9e\xa0\xf8\x57\x36\x93\xd2\xe7\x81\xd0\x9e\x4b\x5f\xa2\xac\x4e\x59\x73\x8f\x55\x79\x81\xf3\xe0\x61\x1a\x53\x38\x56\x19\x71\xf5\x81\x7a\xfc\x98\xc0\xfe\xf3\xdb\x8c\x64\x4a\x66\x03\xbc\xbe\x66\xa7\xe2\x35\x7b\xac\x47\xb2\xa4\x82\xc7\x3e\x52\xc6\x7a\x91\x1f\xdf\x80\x8a\x19\x06\x49\x7a\xf7\x54\x71\xe8\x91\xcd\x69\x85\x79\x1e\xe1\x78\xcc\x8a\xd7\xed\x94\x16\x48\xf0\x38\x09\x3d\xd9\xe1\xfc\xac\x66\xdd\xb0\x52\xfe\xae\xac\x16\x79\xfe\xf2\x06\xf5\x74\x0d\xe2\x71\x12\xd1\x03\xbf\x97\x0d\x0e\x59\xc6\xe6\x5d\x0b\x1e\x27\x5a\xf9\x1d\xfa\x6e\x7f\x80\x61\x45\x56\xdf\x07\x93\x01\xac\x9b\xa5\xb6\x0e\xcc\xd2\x19\xb0\xd4\x75\xc4\xc4\xb7\xd9\xe7\x9b\xc5\xf6\x82\xa2\x72\xf4\xc6\x12\x5f\x53\x90\xeb\x03\xb3\x97\x0a\x97\xad\x8b\x24\xfb\x90\x13\x4f\x84\xa4\xd1\x4b\x76\x6b\xcf\x6a\x2b\x78\xa2\x25\x01\xfa\xbf\x63\xf6\x82\x95\x09\x06\xba\xb6\x94\x79\x84\xcc\x6f\x9f\x97\xe8\xcb\xdd\xef\x81\x27\xa0\x0b\x03\x19\xbe\xc1\x3e\xa5\xd5\x6f\x7b\x3c\x0d\x4d\x80\xee\xfb\xca\x7e\x43\x47\x15\xec\xda\x35\x4f\xac\xf1\x72\x49\x86\x23\x38\xf7\x7c\x32\xc9\x5d\x42\xfc\x05\x2b\x5d\x56\x53\x65\x67\xc1\xb9\x94\x24\x25\x98\xc9\xd2\x37\x9c\x57\xb6\x01\xc0\x23\x48\x6c\x56\x13\x90\x22\xbb\x56\xd6\xc0\x41\xa6\x91\xc5\xed\x2e\x4f\xd5\x3b\x7e\x2d\xea\x81\x6f\xe1\x5e\xfc\xe8\xa2\xa0\x24\x29\x03\x18\x56\x74\xeb\x1a\x8e\xf7\x4c\x2e\x3c\x13\xae\x79\xcb\x5e\x07\x2c\x6c\x82\x8b\x94\x05\xc3\x92\x3d\xda\xd0\xd5\xf5\x5a\x04\x2e\x78\x4c\x15\xf2\x5b\xc8\xb1\x36\x6b\xfc\xa7\x75\x1a\x5c\x68\x88\x0d\xeb\x78\xff\xd2\xe7\x7b\x4a\x40\x53\xfa\x9f\x15\xd8\x64\xff\x74\xb7\xa8\xa2\x34\x4c\x1c\xea\xd9\x96\xde\x8d\xdf\xba\xe2\x29\xf2\x41\x7d\xe4\x90\x03\x50\x70\xe4\x29\xf9\x89\x4b\x28\xa0\x3a\x7f\x4b\xee\xa0\x6e\x76\xa6\x3a\xa3\xeb\x02\x1d\xd3\x9d\x8d\x70\x6e\xbb\x2a\xd1\xb6\x95\x1b\x71\x44\x4b\x2b\x40\xc2\x87\xcb\x76\x7b\x9d\x50\xe9\x4c\xd6\x16\xcd\x90\x60\xb3\x1f\xc7\x37\x39\xdc\x86\xb9\xf6\x53\xb2\xd3\x8a\xf2\xe3\xe3\xe3\xa3\xff\x55\x42\x3c\x48\x91\xdd\x9c\x32\xa3\xd0\x3c\x5b\xb9\xe0\x0e\x8a\x99\x67\x88\x6e\xdf\xeb\xc3\xbc\x55\xc1\xb5\x4c\x29\x2d\x45\xee\x0d\x56\xad\x43\x3e\xb0\x08\xc1\x83\x80\x92\x76\x3b\xf8\x61\x64\x5d\x0c\xdb\xf8\xdf\x5a\x3f\x81\xf9\x32\x0d\xac\x5d\x92\x39\x06\xe7\xdf\x5c\x63\x92\xf8\x4e\xbf\xb8\x03\x89\x74\x73\x02\x98\x4e\x1c\xc7\xc4\xfa\x70\x04\x97\xc8\x19\x0e\x37\xf0\x83\xd0\x54\x36\x50\xb6\x71\xe3\x04\xd8\x5c\x6b\x68\xc8\x5d\xa5\x63\x6c\x9b\x1f\x59\xe0\x27\x09\xcd\x6e\x3d\xc1\x88\x81\x8f\x46\x77\x0e\x5a\x73\x79\xa4\xee\x20\x20\x8c\x63\x3f\x74\x4b\xc2\xa9\x68\xce\xc6\x11\xba\x5c\x5c\x20\x54\x3e\xa1\x58\xeb\x30\xb0\xeb\xa7\x6d\x88\x52\x4e\x3b\x7c\x51\x36\x78\xd3\x5e\xa3\xb9\xc5\x63\x4e\xd5\xe7\xa3\xe9\x09\xb1\xf2\x93\x5e\x56\x85\x78\xce\xe6\x07\x15\x24\x68\x6a\x21\x6d\x95\x5f\x3e\xb1\x9e\x20\xe5\x2c\xee\x19\x3c\x1f\x5b\xd7\x7a\xa0\xea\xec\x3a\xa9\x84\x52\x4c\x94\x1d\xba\x72\xa1\x14\x05\x3a\xda\xae\x4b\x17\x08\xb8\x9f\x26\x86\xd4\x23\xa7\xea\xf4\xec\x7f\x06\x5f\x84\x55\x93\xe9\x4c\xb6\x4b\xcc\xe8\x43\xf2\x88\x3b\xc6\xb5\x47\xf8\x39\x32\xd2\x00\xc0\x10\xe1\x75\xd4\x1d\xb4\x86\xfd\x76\x01\x2e\x03\x11\xaa\xd4\x7e\x12\xe2\x99\x75\x79\xd8\xed\x49\xd8\x3a\x47\x27\xa8\x36\x7e\x16\x91\x18\xe2\x59\xf3\x52\x96\xa7\xaa\xbe\xe8\x60\xf6\xac\x03\xd6\x75\x36\xdd\x1c\x40\x7a\x81\x21\x10\xa8\xce\x5f\x8b\x87\x52\xfe\x98\xf5\x0a\x41\xb2\x88\x6c\x89\x97\xaf\x37\x0f\xeb\x65\x6b\x9a\x75\x27\xf0\x0d\x42\xbb\x75\xe8\xad\xaf\x74\x57\x9e\xaa\x99\x1c\x32\xc8\x40\x5a\x4d\xef\x5b\x34\x2c\x17\xd3\xab\x70\xb3\x67\xdb\x1c\x68\x01\x07\xbc\x39\xcf\x04\x3b\x40\x05\x21\x09\x02\x9a\xe4\xde\x35\x0a\x8f\xff\xb7\x70\x0b\xa8\x30\x4c\x99\xe3\xf2\xdf\xe0\xeb\x60\x15\xfc\x37\x8b\xff\x73\xed\x68\xab\x20\x67\x92\xbb\xff\x66\x7e\x6a\x43\xf2\x80\x3e\x23\x58\x34\x68\x9d\xe5\x19\x34\xb8\xab\xb0\x5b\x47\x30\x30\x6c\xde\x16\x04\xde\xfd\x1c\xc6\xe4\x54\xfd\x5e\x1e\x32\x39\x42\x22\x81\xf6\x84\x74\x83\xb7\xb5\x31\x5a\x27\x77\x8a\xbd\x14\x5e\x98\x12\x67\x97\x2c\x0b\x09\xcd\x95\x31\x27\x3c\x4c\x7d\x9b\x43\xdc\x83\x52\xe7\x59\x48\x95\xed\xcb\x6c\x35\xc0\x97\x32\x57\x08\x97\x22\xbe\x42\xb0\x54\x81\xe3\x6d\x37\xc4\x31\xff\x28\xb3\xe2\x0a\xf5\x96\x10\x7e\x18\xd0\xc2\xb5\xde\xfd\xb1\x1f\x3e\xa0\xf0\x23\x03\xd8\x33\xaa\xd9\x63\x19\x42\xd7\x45\xaa\x58\x58\xb9\xc2\x45\xa1\xee\xa8\xe7\xec\xb2\xee\x72\xbe\x22\x00\x8f\x0c\xff\x53\xe1\x78\xe9\xa7\x9a\xf2\xdd\xa3\x86\x42\x80\xab\x73\xb4\x84\x17\x8e\x28\xe8\x5b\xd9\xf4\x98\x66\x11\x62\xac\xc3\xc1\xe6\xfc\x1d\x33\xd7\x14\x05\x31\xbd\x0c\x9d\xbd\xbe\x35\x8f\xd9\xcf\x2b\x2f\x21\x8a\x4d\xa8\x34\x2f\x5f\x47\xd2\xc0\xae\x19\x63\x72\x8d\x57\x5f\x9c\x13\x25\x12\xcf\x73\x24\x7d\xdb\x06\x9a\x49\x4c\x59\x24\x60\x68\x97\xff\xf5\x76\x7a\x3b\x8d\x06\x8e\x48\x05\x27\x54\xf0\xff\xb2\xa2\xd9\xdb\x08\xfe\xf8\x72\x3c\x0a\xa9\xb8\xa6\x63\x50\x2d\x3a\xcf\x63\x57\xde\x40\xf1\xa3\x2a\xbb\x64\x88\xe0\x88\xb4\xae\x1b\x3f\x73\x63\x16\xa7\xb2\x3a\xcf\xd4\xbf\x8b\xd6\x02\x20\x6c\xea\x76\xb9\x78\x1c\x46\xae\x05\x04\x86\x72\xd6\x6a\xd0\x34\xe7\xbb\x2c\x6f\xba\x60\xbc\x80\x38\xa6\x6d\xb6\xb4\x99\x22\xf7\x33\xf8\x89\xc1\xc6\xa0\xda\x96\xa7\x4a\xe2\x4d\xd7\xa4\x62\x96\xf6\xb3\x97\xe2\xf4\xae\x4d\x85\x46\x54\x51\xa1\xae\xca\xba\xb1\x1a\x1e\xed\x53\x3a\x55\xc2\xee\xd3\xaa\xc8\xa3\x1b\x7e\xc2\x0f\x72\xbd\x67\xd6\x33\xa1\x84\x21\x05\x7b\xc5\xe6\xe1\x24\x7f\x9c\x09\x28\xb7\x3d\x62\x31\xd9\x02\x05\x7a\x48\x25\x80\x5d\x04\x2e\xcf\x47\x42\x45\x93\x81\xdb\x0d\x44\x54\xbe\xa5\x18\x26\xaa\x15\xc8\xb1\x3c\x62\x91\x15\xaf\x83\xc0\x96\xd0\x7e\x42\x80\x87\xac\xd0\x15\x18\xef\x6d\x72\x9f\x3a\xf1\x08\x49\x44\x0e\xf1\x8c\xee\xa2\x10\x3a\xd5\x81\x7d\x69\x8f\x59\xd1\x23\xfc\x84\x56\xc2\x21\x3b\xbe\xd6\xb3\x51\x4f\xe9\x71\x49\xa9\x23\x27\x5e\xd0\x3e\x40\xfc\x1f\xf7\x0c\xd2\x93\x06\xd1\x66\x01\x15\x23\x12\xc7\xf1\x64\x90\xcc\x0f\xe2\x8e\x0b\xe4\x07\x16\xe3\xcb\x4d\x3b\xc7\x9a\x9c\xf0\x63\x85\x75\x0f\xb7\x92\x2c\x09\xc8\x6c\x02\xa5\x7a\x86\x80\x7a\x3a\xc5\xa5\xcf\x92\x6e\x5b\x86\xba\xb1\x82\xdf\xf3\x57\xf2\x03\xb3\x1e\x8d\xaa\xd2\xb1\xde\x5e\xcf\x8b\xb8\x03\x21\xa0\xcf\xb7\x7d\x2b\x3f\xb0\x1a\xd4\x04\xca\xc0\x03\xf0\x86\x6c\x69\xdf\xb3\xa2\x98\xb3\x87\x5d\x7f\xc6\xd0\xd2\xd3\x51\x71\xc2\xf8\xf3\xc9\xc0\x07\x8a\xb7\x92\xab\xb8\x2b\x89\x71\xeb\xe6\xbc\xfd\x21\xbb\x9d\xf1\x4a\x80\xc3\x1d\x1f\x08\x82\xd8\xda\xd6\x7f\x60\xf1\xa3\x47\xd4\xc8\x00\x7c\x1a\x60\xbf\x63\xfe\x3e\xce\x86\xc9\x10\x0d\xaf\x07\xe9\x84\xdc\x56\xe3\x58\xb1\x8c\x38\x10\xae\xbb\x35\x4c\x58\xf4\x54\xbe\xfb\x1e\x4b\xbb\x46\xe1\x13\xbd\x27\x41\x60\xf6\xfe\xde\xb8\xb9\xfb\x5a\x0e\x8a\xbb\x64\x84\x11\x33\x69\x49\x8a\xe5\xb6\x1f\x29\xe8\xda\xb4\x89\x08\xff\x78\x6d\x46\x57\x8d\xb9\xa1\x44\xb2\x55\xaf\xcb\xe7\xcb\x8d\x4f\xc6\x22\x21\xd7\x82\xe8\x0f\x6f\xb0\xd9\xad\xb6\xbb\xe7\xa7\x87\x3f\x27\x43\x3b\x16\x86\xab\x41\x41\x96\x9f\xdb\x89\xdd\x74\x17\x91\x26\x57\x60\x78\x0d\xb4\x9b\x8c\x32\x49\x62\x13\x04\x71\x51\xc8\x6d\xe7\x89\xc9\x24\x8d\xa8\xa8\x69\xb1\xdc\x8d\x6e\x38\xd1\x8a\x8a\x4b\x9a\x72\x77\xca\x26\xd6\x9b\x4c\x79\xea\xc8\x37\x6f\xfe\xe9\x12\x5d\x32\x15\xa1\xec\x09\x12\x5d\xd8\xfc\x6b\x56\x34\x8f\xd0\xcb\x0f\x8d\x32\xa4\xf6\x48\x1e\x85\xca\xce\x8f\xd5\xeb\xab\x85\x45\x4d\x4a\x79\x26\xa3\x83\x4b\xf3\x16\x5c\xad\xe3\x30\x2f\x2b\x81\x19\x99\x22\x82\x71\x57\x4a\x9e\x8e\xbb\xea\xd4\xb7\x86\x21\x4d\xd2\x1b\xa2\x37\xd9\x5d\x30\x84\x8e\x87\x31\x44\xdc\xeb\x72\xab\x8f\xa8\x1c\x72\x96\xb9\x3b\x01\xe1\xa7\xd0\xa9\x8a\x6c\x50\x62\xf6\x7e\xc1\xf2\x37\x6b\xf5\xcd\x0b\x29\x08\x29\x52\xf0\xbb\x02\xf2\x42\xdd\x66\xef\xc4\xb0\x3e\xf9\x08\x02\x14\x55\xb2\x7c\x7f\x78\xdc\x0d\x98\x6f\x84\x14\x42\x51\x32\xb2\x4b\x9c\x4a\x81\x01\x85\x6d\x73\xa8\x4d\xe1\xe8\x5e\x33\xde\x35\x6a\x24\xab\xce\xe5\x20\xf6\xab\xe6\x6d\x72\x29\xe5\xc5\x3c\xec\x4d\xe0\x65\xd6\x64\x13\x49\x72\x21\x55\x20\x5c\xa2\xd1\x58\x76\xee\xf7\x34\xa1\xb4\xb7\x82\xfa\x4d\x94\x50\xa9\x71\xa0\x5d\x62\xec\xd3\x2a\x42\x69\xf1\xf5\xf2\x99\xd2\x46\xf2\xf9\x88\x45\x3f\xe3\x30\x95\x4a\x0f\x68\x1a\x5b\xb7\xb6\xac\xd6\x53\x1e\x7f\x21\x51\x9b\x34\xdc\xaa\xa1\x05\x2c\xdc\x0e\xe9\x0c\xff\x96\x83\x2d\x35\x8f\x89\xfe\xf2\x15\x9b\xdb\x52\x9e\x88\xf9\x6d\x88\xa6\x51\x5e\x6a\x22\x5b\x13\x29\xfd\xcf\x10\xf4\xe3\x21\xa5\x18\x4b\x79\xe8\xd4\x6d\xb2\x5c\x5d\xe1\x78\x15\x8a\xf9\x8c\x52\x32\x8f\x8f\x4b\x67\x6a\x29\x96\x2a\xb2\x32\xb2\x8e\x98\x6e\xfc\x0e\x94\x1f\x07\x84\xf1\x73\x11\xa6\x97\xf5\xed\xb4\x07\x98\x2f\xbe\xda\x7c\x77\x67\x0d\xd2\x84\xc2\x65\x24\x55\x00\x85\x21\xd0\x76\x6d\x80\x14\x5c\x5f\x2d\x36\x0f\x7f\xee\x6f\xd6\x9b\x5b\xcb\x56\xda\x75\x90\x9a\xca\xf1\xda\xd5\x50\x94\x07\x57\x3e\xaf\xa2\x34\xe4\x81\x15\x14\x7d\x3c\x2f\x8e\xc7\x09\xd5\x8a\x50\x91\x30\x3d\x8e\x70\x7e\x29\xdb\xc5\x1a\x3e\x36\x78\x01\x91\x1f\x7f\x21\x15\x7b\x4c\xe9\x3e\xa1\xee\x52\x6a\x93\x4e\x0c\x89\xa3\x6b\xaf\xb3\x02\x72\x5b\x3e\x5f\x63\x55\xdf\xb5\xb6\xaf\xbb\xc3\xd8\x37\x48\xe5\x3b\x28\x1a\xa8\xcf\x26\x2f\x31\xb0\xe9\x54\x1c\x2a\x02\x2a\xdf\xd4\xd7\x20\xb3\x97\x5f\x2d\x86\xd0\xb3\xf7\x67\x19\x52\x46\x4b\x81\xeb\x25\x93\xd8\xc8\xef\xc1\x45\xc1\xe9\xe4\x81\x13\x11\x8b\xb4\xe7\xb6\x51\xfb\xd6\x8d\x21\x8c\x9d\xbb\xcd\x34\x62\x91\x35\x95\xbe\xae\x8b\x26\x35\x32\x5d\x43\xf0\x7a\xda\xf5\xe4\x9c\x48\x8b\xda\x21\xed\x94\xca\x84\x4a\x81\x51\xbc\xd5\x12\xd9\x13\x8c\x80\xb4\x17\xbb\xf6\x00\x85\x8d\x42\x0e\xe3\xac\x8a\x07\xa6\xaa\xef\xeb\xcb\xea\x8f\xe1\x8b\xe3\x41\x42\xc6\x9b\x89\x00\xd0\xfa\xd5\x7e\xa5\x2f\x30\xc9\x62\x2b\x2e\x0d\xb9\x75\xd5\x7e\x97\x30\x98\xb4\x82\x7d\xff\x46\x85\x65\x34\x0f\x41\xa4\x04\x54\xe9\x59\x21\xee\x9f\x96\x97\xbe\xe2\xe4\x5d\x4a\xcf\x0b\x98\xd3\xaa\xbc\x79\x78\x5e\xfe\xbe\x7b\x74\x67\x94\x09\x8f\x3a\x69\xa2\x9b\xd3\x90\x74\x60\x2c\xc3\x22\x94\xe4\x46\xf7\x74\xe9\xca\x63\x2d\xa1\xfa\xa7\x6b\x8b\x52\x22\xa5\xb5\x85\x92\xa3\x63\x76\x04\xa5\x94\x20\x92\x30\x22\xb7\x79\x3e\x7d\x4e\x3e\x25\x94\x42\x46\x78\x5c\x5b\xee\xf8\xac\x3b\xdb\x5b\x21\x53\xa6\x18\xca\x45\xac\x0c\xc9\xd6\xae\x1c\x15\x3a\xb8\xbf\xa3\xb3\xea\x40\x51\x44\xc5\xd4\xf8\x50\xf9\x42\x26\x87\xca\xad\x42\xe9\x28\x20\x3e\x34\x43\x5b\xbc\xb8\xbd\xdd\xac\xb6\x0e\xcb\x80\x5e\x18\xd1\x03\x1a\xb7\xf1\x16\x0f\x65\xd7\x92\x18\xba\xc4\x57\x39\xca\x9e\xa2\xa7\xe3\xc4\x28\x82\xbf\xfe\x36\x23\xb4\x25\xd0\x67\x08\x4e\xf4\x77\xb7\x7e\x5c\xed\x57\x7f\xbc\x3c\x3c\x6f\x5c\xa8\x07\xfd\x00\xa8\xfe\x65\x83\x90\x3f\x96\x05\x76\x67\xf6\xd3\x88\x0c\xbd\x83\x21\xde\xc7\xa9\xd6\xd4\x65\x38\x01\xc3\x34\x24\x28\x8e\x61\x0d\x83\xbc\x63\xcf\x17\x18\x85\x01\x4d\x6a\x4a\xa4\xf6\x36\xc3\xac\x8d\x8d\x51\xec\x09\xf2\xd3\xa0\x2a\x32\xf8\xba\xbd\xdd\x75\xa7\x91\xe0\x45\x7d\x7d\xe3\x50\x26\xdc\x38\x7e\x30\x17\xdf\x1e\x7f\x7b\x8c\x50\x53\xe0\xfa\x8c\x50\xf9\x44\x0a\x32\xda\x52\x31\x16\x40\x0e\x3a\xa1\xb0\x89\x31\x12\x95\xd3\x1d\x99\x5d\x52\x31\xf1\x7c\x9a\x66\xfb\xf7\xd0\x9d\x24\xf1\x05\x31\x45\x40\x9e\x3f\x6b\x8d\xed\x17\xf9\xe7\xa9\xec\x0a\x4c\x30\x89\x35\xf1\x02\x19\x9d\x2f\x2a\x06\x99\x9c\x33\x31\xda\x9e\x36\x7b\x3f\x7e\x43\x49\xa2\xa3\x78\xf8\xd9\xed\xef\xa9\xa7\x83\x2e\x32\xe9\xa8\xd4\xc6\xe7\x4d\xad\x2c\xba\x19\xde\xdf\xb2\x3a\x6b\x0c\xb9\xe3\x55\x20\xd0\xe7\x3b\x3e\xa6\x7e\x9a\x58\x0f\xef\x1f\x46\x55\x9e\x2c\x0b\xdb\xca\x59\xca\xad\x24\xcc\x87\xd3\x1d\x33\xb8\xe5\xf9\x57\xc9\xfd\x90\x6a\xcd\x9b\x0c\xab\x3d\x71\xcf\x76\xaf\x94\xc7\x86\xc9\x93\x86\xb2\x41\x8a\x0d\x82\x96\xc8\x35\xa7\xd4\xd0\x66\xf5\xf0\xeb\x72\x3c\x14\xdc\x33\x98\x17\x59\x0e\xc8\x65\x05\x0a\xe5\x69\xab\xdc\xe2\xaa\xd5\xca\x01\x97\xdb\xfc\x4d\xcb\xc0\xa7\x55\xf1\x0b\xe4\xf0\xf3\x3c\xa0\x90\x13\x28\x31\x34\xc2\x87\xd8\x50\x96\x94\xb2\x75\x9f\x56\x2c\xa2\x8a\x03\x02\x9e\xee\xb3\x7a\x8e\x6e\x01\x91\xc9\x80\x72\xc0\x0e\xf0\xb9\x5e\x3e\xef\x3f\x9c\xb5\x8a\x28\x3c\xb0\xd6\x9e\xd9\xc7\xa6\xc9\xb8\xf1\xd5\x50\x09\x82\x7a\x2f\x54\x49\xda\x39\x8e\x68\xdb\xc6\x3b\xa2\xf9\x5d\x1a\x35\xa6\xbe\xa1\x39\x57\x37\x24\x9f\xf2\x52\x65\x85\xcc\x8e\x16\x11\x34\xa9\x84\x41\xdd\xde\x96\x35\xa1\x2d\x5b\x48\xcf\x12\x29\xb4\x17\x49\xce\x69\x79\x00\xed\x18\x09\x66\x5f\xb5\xf6\x38\xa7\x69\x51\x1e\xb1\x18\x21\x81\xa7\xfd\xd0\x08\x8a\x1e\xce\x46\xd7\x73\x3c\x81\x34\x93\x49\x98\xb8\x08\xc6\x69\x90\xef\xd5\xbe\x8c\x5c\x3e\x7f\x79\xf7\x3c\xc7\x11\xa1\x7d\x34\x54\x6e\x26\x1e\x51\x97\xc5\x28\xe2\xa6\x03\x96\x12\x37\xad\xb6\x56\x40\x5f\xa0\xe5\x3a\x84\x86\xd0\x6d\x39\xaa\xc6\xd1\x41\x9c\x52\x71\xc3\x4d\xf6\x0e\x83\xc0\x82\x0e\x93\xd0\xcc\xd8\x71\x75\xae\x5b\x87\xff\x06\xb9\xbf\xd0\x91\x17\x44\xaa\x8b\x3a\xfd\x89\x50\xf5\xf0\x0f\x1d\x31\x1d\xf4\x25\x74\x9d\x35\xe8\xc2\xac\x3a\x0a\x62\x16\x0c\xb8\x99\x9e\x2e\xd5\x6c\xfa\x9e\x46\x1a\xcf\xa8\xb9\x4d\x0b\x68\x74\xcc\x34\x0d\xb6\x66\xbf\xcd\xe1\xdd\x2d\x86\x3a\x0e\x64\xec\xb9\x82\xde\x3a\x93\xcb\xd6\x6b\x30\xcc\xce\x58\x05\xde\x2d\x9c\x27\x2e\xb4\x8e\x53\x4e\xbb\xd3\xed\xcb\xf6\x97\x95\xbb\x3a\x56\x82\x0a\x42\xbe\x41\xd1\xd5\x66\x8e\xef\x2b\x89\x0c\x03\xd4\x7b\xd9\xe0\xf6\x74\xc4\xea\x9f\xa7\xb2\x3a\x1d\x66\x08\x06\x74\x12\x25\x54\x70\x7b\x5f\x1e\xb3\x91\x9a\xb1\xd0\x49\xc2\x53\xc3\x37\x21\x4e\xaf\x7b\x07\x2c\xda\xfd\xdc\xbe\xc1\x6f\x97\x94\xb2\x42\x27\x5a\x44\x83\xd4\x48\x27\x78\x3e\xb9\xb9\xd4\x4f\x99\xd7\xf9\xea\x2f\x06\xc4\x3e\x5b\x4b\xaf\xd3\x30\xa1\x7a\x95\xcd\x62\xb7\xda\xdf\x3d\x6f\xf6\xdf\x57\xab\xdf\x1d\xa3\x93\x4e\xe3\x84\x22\x0c\xff\xc2\x03\x14\xdd\xcb\xe7\x7e\x40\x60\x90\xdf\xb3\x3c\xef\x49\x17\x5d\xa3\x8c\x3c\xa7\xc3\xf3\x84\x3f\x9b\x27\x1a\x00\x53\xac\x87\xe6\xda\xa0\xd7\x3f\xa0\x7e\x81\x6c\x12\x2a\xd5\xc0\x18\x67\x3d\x2d\x0d\xda\xf2\x95\x0b\x8e\xce\xf1\x39\x15\x33\x39\x46\xcb\x3a\xbd\xaa\xa4\xef\x91\x11\x02\x72\xb0\x4e\xb9\x1b\x6d\xad\x7c\x7f\x30\x46\xb1\x36\x91\xc6\x45\x87\x8a\x9f\xad\x45\xd5\xa8\x8d\xd0\x98\x89\x2c\x8d\x54\x76\x5d\x2d\xab\x23\xb5\x18\x8e\x02\xed\x83\xb4\xd2\xc9\xc4\x8b\xe3\x6e\x43\x43\x2a\xc2\x01\x60\xe6\xd5\xec\x1b\xed\x8e\xb8\xc5\x66\x8a\x68\x91\x9e\x97\x44\xd0\x49\x8c\xe4\x79\xd9\x3c\x1f\xcd\xec\xee\xda\x53\x4c\x69\x53\xdb\xae\x36\xdf\x56\xb7\x6e\xe3\x5b\x3c\x7d\x71\x3b\x9f\xf4\x98\x9f\x92\x0f\xb0\x70\x14\xb4\xd2\x63\xc2\x07\x9c\x53\x17\xf8\xd4\x03\x9b\x28\x43\x49\xcf\x67\x11\x55\x4e\xdc\xc3\x3b\x45\xcc\xff\x5e\xb1\xbb\xf4\x7c\x9f\x53\x34\xe3\x2d\x7b\x7d\x6b\xd7\x13\xfa\x24\x03\xf1\x63\xe9\x05\xcc\x68\xef\x1b\xdc\xde\xe9\x42\xc6\xd2\x75\x0b\x0c\x33\x28\x55\x91\x35\x98\xff\x36\x69\xe6\x1c\xc2\x8e\xa7\xbe\xab\x90\x95\x5e\xa0\xfd\x10\x5c\x85\xee\xed\x24\xbb\xdb\x36\x77\xda\x3d\x4f\xa7\xc3\x0b\xd4\x75\x56\xbc\x4e\x24\x77\xc7\x57\x8a\x59\x44\xaa\x27\xf8\x0e\xf9\x69\x40\xbc\x3f\xb3\xe0\x48\x2f\x8e\x7d\x48\x7b\x9a\xb0\x01\x2d\x85\xeb\x20\x03\xc2\xdd\xbc\x67\xf8\x71\x5f\x9e\x6a\xbc\xc3\xee\xcd\xc4\x5a\x11\xbe\x61\xf1\x6d\xfd\xb4\xec\xd8\x05\xa5\x97\x68\x20\x9b\xcf\x0a\xda\xbb\x9f\xd3\x24\x21\x00\xde\x90\x3f\xb9\x6b\x12\x7d\x38\x96\x51\x29\x5d\xd7\x24\x74\x9a\x0e\x19\xf2\xbb\x06\x94\x54\xa8\x93\x1d\x5a\x67\x7e\x67\xcb\xd5\xb6\x99\x42\x2a\x30\xfd\x15\x75\x8b\x3d\x0b\xe7\x2c\x30\xfc\x88\x4b\xdf\x33\xf5\xdd\x20\x29\x91\x64\x3b\x40\x24\xc9\xfb\x34\x38\x89\xc5\x69\x50\xcc\x35\x9e\x20\x90\x00\xed\x28\xed\xdd\x77\xb3\x02\x94\xcf\x79\xbf\x22\xce\x70\xf2\x4a\x4f\xa4\xa6\x94\xc9\xd6\x83\x4e\x78\x5d\xa5\x27\x10\x22\x49\x61\xee\x02\x72\x53\x2c\xdc\xaf\xe5\xd2\x93\x2c\x20\x88\xcd\x7f\x4f\x58\x9d\xfd\xbd\x76\x52\xd6\xd2\x93\x0a\x09\xdb\xf5\xaf\xf5\xcd\xaf\xb6\x1e\xe9\x61\x64\xd0\x81\x1d\x0f\xd4\x97\x0a\x8e\x24\x81\x37\x67\xb6\x48\x0f\x63\x45\xe1\x3c\x83\x3d\xee\x85\xcb\x47\x85\xbd\xd2\x43\xed\x0b\xc3\x84\xdc\x5a\x51\x43\x54\xac\x64\x5e\x90\x06\x6e\x2f\x53\xf7\x50\xb5\x36\xf7\xf8\xdd\x30\xe6\x47\xc4\x13\xa6\x4f\xe3\x8a\x46\xc9\x18\x37\x02\x11\x15\x18\xd6\x3c\x77\x52\xa6\x90\x58\x02\x8f\x70\x9e\x9e\x4b\x07\x04\xb5\x3b\xb8\xdd\xcb\xca\x59\x8e\x9e\x8b\x05\x2c\xa6\x7c\xf9\xe6\xf6\x6e\xf8\x9a\x59\xe8\xa5\x5e\xe7\xd2\xf7\xc9\x72\xc9\x22\xc1\x63\x03\x9a\x86\xac\x58\x34\x0d\xf4\x3e\xd0\xf8\x95\xb1\x48\xc7\x94\xca\x39\x60\xde\x7c\x36\x85\x59\x1c\xa7\x81\xc9\x57\x3e\x8c\xee\x21\x4e\x53\x9d\x10\xfd\x41\x53\x75\x5b\xfa\xec\x68\x64\x89\xf2\x28\xb4\xac\x0c\xc7\x04\x75\x1d\x93\x64\xb4\x7d\x42\xdf\x91\x84\xe5\xc7\x37\x98\xbc\x89\x34\x30\xe0\x2f\x33\xc1\x6c\x85\x7b\x57\xd9\xde\xbf\xb8\x7f\xff\xe7\xff\xc6\x09\x2e\xc9\x52\x64\x94\xca\xb5\x41\x8b\x75\xb1\x3d\xa2\xcc\xb4\xc1\xa8\xcb\x37\x9c\x5c\x89\xfb\x91\x51\x0c\x6a\x5a\x07\x72\x7e\xe1\x1f\x0e\x56\xc6\x7d\x4d\xa6\xcd\xe6\x66\x39\x7a\x41\x3c\x52\x34\xdd\x08\xe3\x6b\xc7\x64\x57\x97\xe0\xfa\xc4\x90\x84\xfd\x42\x5d\x61\x7d\x59\x75\x2b\x19\xd7\xa9\x87\x0e\xda\x35\x2d\x71\xb6\x7d\x20\x15\xe4\xe3\x37\xe5\xf6\xa5\x2c\x27\x2b\x3e\x03\x6e\x90\x9d\x05\x76\x5a\xa0\x43\xce\x09\xdb\x4b\x04\x81\xf2\x1d\x28\xf7\x00\x54\x74\x38\x03\x3a\x90\x4c\xa0\x91\xef\x31\x2b\xc9\xd6\xd0\xfd\x5e\xf9\xf8\xd2\xe3\xf4\x88\x79\xd6\x90\x0a\xe3\xfa\x76\xf5\x33\x9b\x32\x23\x4a\x26\x03\x49\x95\xaf\x23\xf9\xd4\xf5\xed\x68\x03\x62\x92\x27\x04\x76\x31\xd5\x50\x34\xd9\x87\xa3\x5f\x02\x23\x9c\xa8\x4b\x2a\x50\x86\x75\xe5\x04\x18\x24\x93\x2a\x25\x38\x34\x16\xea\xe5\xbd\x19\x1e\xa9\x42\xa0\xc1\xfc\x50\x9a\xfd\x6c\x41\xe2\x9f\x57\xd0\x8e\x92\x29\x11\x05\x8e\xee\x6e\xbd\x47\x95\x35\x7b\x3f\x75\xe7\xc2\xc0\x58\xeb\xf5\x49\x1c\xb2\x6e\x17\x1b\xd8\x60\x17\x81\x96\xe1\x37\xc0\x40\x9b\xa5\xac\xc2\xf7\xac\x3c\xd5\xdb\xa6\xdf\x66\x18\x46\x8c\xaa\x10\x2c\xd1\xd4\xae\xdc\x36\x16\x08\xcd\xe2\x11\xfb\x54\x3a\x08\xbf\x4a\xa6\xe3\x84\xec\x91\x7e\x47\x35\xa3\x70\xa1\x1b\xac\x6e\x11\xd4\x43\x47\xf5\x27\x99\x06\x15\x59\xb3\x73\xdb\x61\x0a\x16\x93\xd1\xa6\x31\x14\x9d\x8a\xcf\xe0\xc9\x4c\xb3\xef\x85\xca\x29\x5d\xdc\x75\xbf\x25\x01\xb9\x96\x0f\x78\x28\x8b\x2d\xe6\xfa\xb6\x2a\x8f\xbe\x6b\x65\xe0\x53\x61\x79\x81\x3f\x9b\x76\x71\x7e\xcc\x8a\x9b\xbe\xfe\x42\xfa\x0c\x93\xc8\x26\xd7\x1e\x1e\xbe\x99\x57\xce\x47\x83\xc3\x0f\x12\x43\x07\x5f\x63\xf5\x6e\xab\x40\xea\x6e\xda\xb9\xf3\x04\x52\x87\x96\xd6\x72\x09\x95\xfa\x23\x9b\xf7\x84\xa5\x1f\x79\x8a\xc6\x4a\x5e\xbe\x7e\x2d\xec\x60\x18\x2d\xfa\x7e\x14\x49\x6e\x98\x42\x7e\xfa\x51\x7c\xed\x34\x32\x96\x43\x82\xde\xd6\x54\x1e\x66\x76\xa4\x1f\x83\x81\x89\x1e\xdf\x8f\x8f\xf0\x73\x5d\x48\x2c\xda\x7d\x69\x79\x1a\xf4\x90\x14\xa2\x21\xde\x92\x15\x54\xf9\x99\xa2\x0e\x1d\xfa\x46\xfa\x31\x86\x3e\xba\xba\x21\x62\x64\xbb\x87\xfa\xed\xae\xa4\x59\x44\x85\x79\x73\x66\xbc\xf4\x13\x4f\x87\x66\xd2\xc9\x1c\x61\x8a\x42\x93\x7e\x12\x24\xca\xa8\x88\xc8\x8a\x84\x72\xe8\xce\x67\xaa\xdf\x5c\xff\x38\x49\x9c\xb2\xd9\x06\x86\xf1\x41\xe9\xa7\xe8\x93\x3b\xf3\x52\x95\xfd\xa3\xf1\x50\x47\xbd\x18\x04\x9d\xbd\x3b\x80\x63\x94\xf6\x0c\x8d\x8f\xe7\xd5\x58\x24\xbe\xcb\x62\x3a\xa4\xd9\xe5\xed\x40\x98\xa2\x01\xc7\x43\x9e\x35\x67\x5a\x3e\xdd\xd9\x41\x04\x84\xfb\xdc\x2e\x9e\xba\x9f\x14\x47\x43\xe6\x47\x62\xe9\xa7\x0b\x95\x53\xe9\x0b\x16\x3a\x84\xc7\xb2\xac\x9b\xd3\x61\x1e\x29\x21\x7d\x11\x20\xf1\x53\xef\x88\xd5\xa3\xea\x93\x14\xd2\x17\xa1\x48\x23\x47\xff\x78\xc0\xeb\xba\xeb\xd2\x17\x71\x4c\x5a\x27\xdb\xdb\x8d\xef\x7f\x66\x31\xf9\x42\x06\x44\x82\x9e\x59\x70\x7c\xbf\x1d\x5e\x38\xe3\xd2\x97\x11\x28\x35\x2a\xad\x9b\x8d\xfd\xce\x67\x8a\xa5\x2f\x53\x46\xc9\x55\xa7\x32\x6d\x11\xb5\xc3\x10\xbb\xf4\xa5\x30\xa2\x3d\x35\x36\xb7\xad\x63\xff\xdb\xe0\xfa\x2a\x61\xb4\x7a\xa8\x52\x52\x51\x8a\x3b\x06\x43\x31\x62\xb0\x58\x74\xe3\x04\xa5\x17\x19\xcb\xcd\x71\x53\x94\xa7\x42\xdd\x11\x2b\x41\x07\xe6\x95\x3e\x2a\xc9\xac\x11\xe1\x40\xe4\xd6\x42\x98\x8f\x1a\x4a\x5f\xc7\x86\x1e\x9a\x50\x0a\xed\x8e\x60\xa8\x83\xd6\x85\x8b\x6d\xca\x80\x05\x1e\x47\xa7\x0d\x61\x02\xe8\x96\x6e\xa5\x6a\x17\xe7\xd3\x38\x9a\x20\x03\x16\x2b\x8a\x0c\xdc\xee\x9e\x2f\x83\x26\x32\x60\x5c\x51\x08\xfb\x26\x53\xd7\xcc\xa6\x59\x10\x8d\x0c\xfc\x28\x51\xbd\x6c\x16\xe5\xc4\x73\xa8\xaf\xd8\x6d\x81\x1f\x07\xb4\x6a\xec\xb3\x7a\xbd\x7c\x76\x0f\x13\x78\x21\xd5\x8d\x1d\xb2\xa2\x79\xec\x86\x7e\x10\x04\x11\x79\x49\xa3\x18\x73\x6f\x4b\xfd\xdf\xc5\x2f\x6e\x88\x06\xa1\x07\x86\xf3\xaf\x7c\xc7\xaa\x70\xc5\x32\x32\x08\x23\x53\x00\xbb\xc1\x02\xb6\xdd\x8f\x71\xe8\x0a\x56\xd7\x7d\x79\xcd\xfc\xd3\x86\x9c\x93\x27\xb2\x6f\x37\xa2\x1f\x59\x9e\x5f\x3c\xe8\xfc\xac\x0f\x42\x9d\x42\x34\x8a\x45\x63\xbd\x2b\x7b\x75\xfd\xa1\x22\x40\xf7\x18\x71\xa2\xc9\x70\xbe\x5d\xac\xfe\x98\xfb\x6a\x31\x28\x92\xe9\xca\x66\xa9\xe3\xaf\xb9\x77\xe3\x73\x24\xd6\x2b\x27\xd9\x41\x42\xf0\xcc\x1b\xde\xb3\x66\x66\x90\xc4\x88\xb6\xec\xf3\xe5\xbd\x19\x4b\x8d\xd8\x2e\x69\x62\x28\x3c\x5e\xb1\xd9\x43\x9e\xef\x8f\xc6\xc5\xdb\x67\x3d\x33\xe4\xf4\x08\xee\x09\x0b\x7b\xdd\xbd\xf5\x98\xcb\x89\x40\xf5\x68\xfa\x07\x3c\xf5\x28\xd7\xf0\x84\x3f\x1b\x93\x80\xbc\x87\xfc\xbd\x9f\x85\x01\xf0\x98\xf2\xc2\x8f\xbb\xaf\xdf\x98\xfb\x51\x04\x82\x78\x1e\xbf\x16\xd9\x5b\x59\x0d\x54\x52\x66\x56\xb3\x40\x24\x82\xc7\x66\x94\x3a\x5f\xda\x84\xbf\xdd\xd9\x64\x18\x79\xb6\x02\xc7\x88\xc8\xbe\x40\xb7\xd3\x04\x92\xfb\x2e\x92\x9c\xd5\x6f\x84\xc5\x81\x63\xd7\x88\x42\x83\xfb\x90\xbb\x72\x7e\x63\x0c\x54\xc4\xa2\x21\x5b\x1b\x2d\x47\x3d\xd4\x50\x06\x4a\xe8\x30\xe8\x91\x40\xc4\x64\xda\xb5\x69\xa0\x9b\xdb\x3e\x94\xd0\xc9\xeb\xc9\x00\x7d\xe5\xab\x01\x44\x96\xf0\xff\xa6\x86\xba\xeb\x12\xc8\x28\x75\x8a\x36\x06\x97\x8b\xd5\x43\x56\x77\xa7\xc6\xd0\x23\x8c\xd1\x97\x8a\x88\x58\xba\x4d\x25\xc0\x28\xa6\xc8\x0d\x64\x95\x55\xa5\x26\xe9\xef\xcb\xb4\xa3\xed\xaf\x3d\xc3\x31\x5b\xe0\x07\x65\x14\x46\xc0\x91\x09\x1d\xdd\xf4\x48\x09\xb2\x8f\xd2\xd8\xb4\xc3\xe8\xf3\x69\xa6\xc9\x96\xb7\x69\xf8\xe1\xbe\x10\xe8\x38\x14\xda\x22\xdf\xdf\x27\x93\x4c\xc7\x40\x72\x09\x36\xf8\x30\x34\x7d\x43\xcf\x47\x95\xf6\x71\xcd\x47\xa3\x17\x34\x1e\xce\xa1\x1f\xfa\xae\x72\xa0\x9b\xef\xe3\x35\x7a\xb0\x0d\x86\x81\x1f\x3b\xe8\xe1\x23\xfc\x55\x56\x8f\x59\x51\x56\x2f\x14\x97\x1c\x8d\xf8\x30\xf0\x4d\xcd\x9a\x84\x5c\xfe\x03\x14\x5a\xb8\xd5\x15\xd3\x31\x0c\x7c\xa3\x2f\xf2\x46\x1c\xd7\xed\x4b\x1a\xc0\x4b\x5c\x9f\x00\x95\x81\x18\x48\xcc\x8e\xcd\xd7\xfa\xd2\xd7\x98\x9e\x35\x01\x48\x9c\x22\x42\xd1\xbe\xd8\xb5\x31\x91\x27\xab\x40\x18\x0a\x08\xdd\x63\x9d\x0d\xa6\xb2\x77\x93\xc7\x77\x11\x05\x06\x91\x2a\x2d\x71\xd7\x5e\x0e\x2c\xd3\x30\x0a\x23\xb2\x3e\xf6\x1a\x07\xcf\x3a\x7e\x35\x11\xa6\x14\x12\xac\xca\xf2\x50\xf7\x51\xe3\xb1\xbf\xec\x56\xd9\x30\x0e\x19\xa5\x0f\x6f\xfe\x31\x72\x95\xc3\x58\x4b\x6e\x04\x38\x69\xe8\xb6\xaf\xac\x0f\xeb\x8f\x2f\x98\xc6\x40\x4b\x83\xe5\xe1\x75\x04\x48\xf3\x5f\x22\x8d\x25\xc1\x06\x96\x4f\x9b\xd1\xf5\x52\x40\x83\x47\x31\x7c\x79\x6a\x9b\x97\xd3\xaa\xe0\xcb\x9a\x06\x77\xac\x8c\x85\x1a\x58\xf4\x8f\x26\xd3\x9f\x61\xb5\x68\x26\x5f\x22\xc5\x88\x82\x8c\x66\x1e\x7c\xc3\x42\x5d\xdb\xed\x42\x9e\x78\x83\x52\xe5\x45\xf1\x6a\x83\xb6\xa9\x6b\x97\x1e\x81\xe8\x1f\xd7\x4f\xfb\xe5\xf3\xd3\x6e\xb3\xbe\xf9\xba\x5b\x3f\x3f\xed\x17\x8f\xcf\x5f\x9f\x76\xbf\x75\xdd\x02\x2a\xc3\xab\xe1\x7c\x9f\xb9\x1f\x21\x08\x08\x15\x43\xf2\x93\x17\xa8\x25\x19\x42\xc4\xa2\xbe\xba\x8b\x84\x65\x66\x32\xa8\x32\x84\xd4\x94\x53\x6f\x77\x8b\x2f\xab\x7d\xb0\xbf\x5b\x3f\xad\xb7\xf7\xdd\x55\x78\x4a\xd0\xa2\x5e\xeb\xa8\x0b\xf1\x8c\xbf\x20\x28\xa0\x4a\x3d\x09\x95\xaa\xf7\xaf\x65\xae\xa6\xd7\x41\x66\x59\xe0\x0b\x89\xf9\x54\xcd\x66\xfc\xde\x84\x06\xba\xa7\x1c\x75\xc3\x82\xc9\x89\x64\xe8\xa7\x91\x43\x64\xd6\xd3\x59\xad\x62\xc3\xac\x4f\x1e\xd5\x4d\x56\xa9\xba\x07\x20\x8d\xcf\xa3\x14\x53\x5d\x24\xa7\x07\x7f\xdb\x56\x94\x60\x92\x17\x66\x65\xb2\x79\xc6\xb9\xb4\xb1\x0c\x75\x1c\xb9\xc1\x43\xc1\x89\x11\x86\x42\x86\x3a\x35\x1a\xb8\x15\x12\xf1\xe0\xb8\xd6\x79\x6a\x87\x47\x9e\x60\xe4\x39\xde\xec\xee\x09\xe7\x6c\xcf\x12\x31\x8f\x45\x26\xd1\xfa\xd7\xa9\x6e\x76\x13\xf0\x93\x8c\x18\x4b\x98\x1a\x80\xcb\x49\x84\x70\x9a\xef\x76\x7d\x63\x9f\x2a\xff\x4c\x05\xca\xfd\x59\x54\x99\xb2\x45\x60\xd6\x8d\x1d\x9f\xdb\x0f\x19\x6d\xaf\x0f\xcf\x0f\xb1\xbb\x1f\x3f\x8a\x28\x25\x05\x55\x05\xe7\xad\xcd\x0f\xb2\x6e\x46\x45\x7e\x92\x7a\x46\xe3\xcb\xd4\x95\x9d\x6f\x6d\xb1\xf7\x78\xb5\x8a\x7c\x21\x0c\xa0\xfd\xa4\xb2\x76\xb5\xa2\x8d\x71\x7c\xf9\x30\xf1\x28\x93\xd7\x8e\x2a\x2c\xcc\xe2\x37\x50\x1b\x95\x51\xc8\x95\xb2\x85\x0a\xcb\xd5\x2e\xbe\x21\xbe\xf8\xc9\x75\x42\x69\xc8\xd0\x5f\x0c\x6b\xca\x26\x23\x0c\xa1\x6d\x8c\x02\x03\x5a\xa9\xb3\xe2\x35\x37\x5a\xe2\x4e\x9a\xf1\x8a\xf5\x3e\xdd\x7b\xa3\x28\xe6\x84\x22\xfe\xd9\x9d\x33\xe5\x04\xb5\xbb\xc5\x76\xfa\xd7\xd8\xc7\x69\x66\xca\x0c\x64\x14\xf1\x24\xb2\x3b\x01\x65\x41\x56\xea\x75\xc8\x42\x2a\xa3\x48\x71\x3f\x1a\x97\x0a\x8f\xb0\x79\x7d\x37\x18\x0c\xdc\x6d\x03\x3f\x7a\x2b\x2e\x8a\x74\x4a\xd5\x23\xcb\xdd\xd7\x31\xe0\x4a\x46\xb1\x27\x89\xea\xe3\xeb\xf6\x76\x72\x6b\xa9\x67\xaa\x74\x1a\x84\xc3\x43\x29\x7f\x38\x6f\x6a\x8b\x2e\x11\x10\xa5\x61\x4a\xd0\xe6\xed\x97\xdd\xe3\x14\xa2\x23\xa3\x54\x18\xbe\xb4\x55\xf3\xf6\x70\x8d\xeb\xed\xff\x26\x87\x58\x41\xd0\x7f\x91\x37\x94\xc9\x2f\x5d\x51\xaf\x8c\xb8\x30\x7e\xcd\x7b\x86\x1f\x44\xd1\xf0\x3b\x54\x07\xb8\x39\x6f\xcf\x07\x51\x8e\x68\x6d\x65\xc4\x65\x44\x16\xea\x12\xea\xb7\x5d\xd5\x05\xb3\x22\x88\x02\x62\x41\xa1\xea\xd1\x9b\xd3\x79\xf0\x8e\x80\x27\xae\x98\xd7\xb1\x0f\x3f\xc1\x74\x7d\x8d\xa4\x2f\x5d\xb6\x92\x2a\xf8\xa8\xcb\x20\xe6\x17\x49\x8c\x08\x90\x5a\x1e\x07\x0f\x3b\xe5\x1e\x1f\x9f\x53\x71\xc6\x95\x5b\x92\xea\xd3\x31\xef\x2c\xac\x08\x03\xcd\x4c\x28\xad\x6e\x50\x51\x3d\xc2\x23\x14\xe7\x5d\xb9\x2d\xaf\x85\x2b\x22\x14\x82\x6a\xa5\x4e\x35\x56\x77\x65\x25\x89\x7a\x6d\x65\x61\x22\x57\x69\xd2\xaf\x9c\x4b\x71\x82\xb7\x6e\x56\x37\xee\x96\x34\x37\xaa\xca\xd0\x65\x66\xee\x70\x3a\x1a\xb5\x0a\x99\xe5\x74\x7f\x1e\x31\x52\x5c\xfb\x7b\xe5\x05\x4d\xee\x46\xab\x50\xf8\xd6\xe1\x6d\x46\xa3\x69\xd4\x2f\xf6\x7c\x9f\xd2\x1c\x2e\x76\x6c\x33\x5f\x73\x35\xa0\x32\x66\x7e\x44\xe0\xad\xef\x50\x35\xf8\x3a\x34\x2d\x62\xdf\x0b\x79\x38\xc6\x41\xba\x65\x7c\xac\xef\xe9\xfa\x0b\x13\xfe\x3b\x64\x94\xab\x1a\x19\xcb\xb1\x2f\xb4\x10\xc4\xa7\x62\x81\x04\x7d\x51\xbf\x8c\x83\xd8\xa3\x80\x1a\xa8\xf2\xd8\x2c\x7e\x66\x97\x14\x52\xf3\x7e\x68\x1c\x5a\x44\x58\xeb\x26\x22\x05\xd5\x46\x76\x5f\x1c\x82\x51\x64\x3e\x56\x99\xc4\x3d\xfe\x3c\x96\x05\x8e\x5a\xb5\x65\x9c\x30\x19\x82\x4b\x8b\x22\x8e\x12\x83\x5b\x12\xa3\x42\x39\x19\x47\xa9\x4f\x9c\x4e\xbf\xf6\xe9\x2f\x70\x92\x32\x8e\xd0\xa7\x64\x98\x93\xb6\x26\x60\x18\x91\xa2\xbb\xd3\xc7\x3e\x27\xa7\x6c\x9f\x8f\x28\xcf\xe6\x47\x46\x1c\x83\xd2\x63\x3a\x00\x0a\x2a\x5d\x30\x2e\xc9\x38\x65\x3c\xec\x2a\x01\x4e\x55\x8d\x6b\xf5\xac\xb7\xcd\x49\x4d\x71\xf0\x32\x4e\x81\x91\x83\x66\x59\xec\x28\xa2\xdb\x67\x20\xe2\x54\x18\x85\xe1\xac\x26\x45\x9a\x0c\x8a\xe9\xf1\x9a\x5b\xe3\xa8\xb5\x7d\x1c\x06\xb2\xa3\x8d\x9a\x1f\xbb\x3c\x60\xcc\x09\x3f\x95\xcd\x15\x29\x21\x19\xf3\xd0\x73\xa5\x53\x8f\xb8\x2b\x17\x79\x6e\xe2\x8f\xae\x59\xb0\xb4\x03\x4c\x39\xda\x52\xdb\x06\x01\x23\x34\xbe\x05\x54\x4c\x36\x84\x18\x22\x41\xb1\xfd\x45\x85\x3f\xb3\x01\x00\xe8\x2a\xd4\x21\x86\xd8\xe8\xa7\x75\xb5\xda\xc3\xf2\x53\xdb\x47\x30\x13\xa2\x25\x0c\x05\x55\x71\xb8\xeb\x09\xad\x28\x12\xd6\x2e\x98\xbb\x37\xdc\x80\x10\x59\x73\x5f\x76\xbb\x74\x2c\x85\x26\x87\x22\x07\x72\x11\x9e\xbb\x88\x73\x2c\x55\x12\x74\xfe\xff\xf2\x57\xe8\x69\x19\x2b\x86\x5a\xf4\x4a\x27\x2b\x90\x6f\xa3\x14\x5e\xac\x94\xf4\x54\x0f\x47\xba\x90\x17\x76\xdd\x30\x72\x05\xc6\xbb\x92\x1c\x87\x9e\x74\x4f\xc6\x4a\x07\x91\x89\x88\xde\x94\x85\x32\x6c\x48\x13\xe4\xf0\x64\x12\xa3\x6f\x82\xd5\xf5\x49\xd4\x24\x9e\xbd\x2b\x29\xef\x67\x9b\xb5\xe4\xb4\xec\x59\x9e\x58\x62\x7d\x30\xcb\xea\xb5\x35\x62\x18\x27\xbe\xb6\xd6\xba\x93\x63\xec\xb2\x96\x1d\x96\x78\xc0\x71\x6b\x7a\x25\x9e\xc7\xc8\x74\x6c\x9d\xf0\x2f\x79\x29\x20\x5f\xb4\x86\x5b\x57\xdf\x72\x09\x13\x93\x89\xc7\x02\xe9\x28\x95\xa6\x0f\x3e\x08\x47\x4e\x96\x86\xc4\xd3\x5e\x34\x22\xeb\xdf\x90\x6c\xd4\x90\x70\xb6\xbf\x2f\x16\x33\x32\x23\x55\xf6\x5e\xeb\xb2\x82\x6e\x79\x4a\x58\xe2\x19\x0c\x7b\x99\x97\xa7\x6a\x7d\x3b\xd8\xfd\x46\x09\xb5\x84\x89\x90\xe4\x82\x6e\x76\xcb\x41\xf6\xab\x76\xa9\x38\xdb\xcb\x17\x06\x56\xbc\xa8\x9a\x5d\x79\xfa\x6b\xac\x84\x2b\x13\x5f\x23\xd9\x26\xfb\x23\x9c\x6f\x32\xb5\xb8\xbe\x37\x26\x41\x8c\x5e\xd8\x15\x24\xdc\x95\x15\x11\x3e\x59\x4c\xdb\xc4\xff\x4f\x02\x08\xb8\xdf\xf1\xde\x12\x3d\x91\x6d\x09\xbd\x24\xb0\x8a\x63\x2f\x99\x6c\x4e\xd5\xc8\x51\xef\x75\xac\xc6\x7f\xe6\x42\x82\xee\x84\x91\x4f\xd6\x5a\x6b\x5e\xbd\x60\x93\xb5\x77\x6f\x98\x40\x5b\x13\x76\x8a\xd7\x1d\xdf\x66\x28\x90\xb0\xf9\x04\xaf\xdf\x3d\xef\x1f\x17\xbf\xb7\x7f\x1f\x17\xbb\xe7\x95\x5b\x58\x92\x88\xc5\x84\x41\x2c\x4e\x87\x97\x76\xe1\xed\x7e\x0f\x05\x65\x34\x6f\x4e\x67\x07\xfd\x9a\x2e\xf6\xc3\xb5\xc7\x1d\xc5\x43\x06\x63\x1e\x6c\x57\xc3\x37\x7a\xac\x38\x60\xf1\x90\x20\xef\xa5\x74\xcb\x47\x12\x07\x9a\x82\x9f\xf5\x5b\x4f\xb6\xf0\x58\xbf\x6e\xb1\x98\x96\x12\xcb\x24\x81\xb8\xa7\xc1\xa6\x62\xd5\x3e\x65\x97\x24\x22\x0c\x2d\xd4\xec\x01\xd5\xeb\xb5\x79\x9e\x70\x2f\x20\xb7\xfa\x00\x3f\xed\xbd\x2e\xdf\x7a\x4c\x4f\xc2\x53\x49\x0c\x0d\xdb\xe5\xf2\x13\x04\x46\xc2\x41\x3b\xca\xbf\xca\x30\x5a\x8f\x3f\x06\xc7\xc0\x05\x97\x97\xd5\x59\x55\x16\x6b\x38\x79\x20\x90\x09\x15\xd7\x42\x25\x32\x43\x18\xb0\xfa\xd9\x54\xd0\x4b\x3f\xc9\x44\x44\x31\x99\x33\xad\x51\xb0\xa7\xa8\xe9\x7e\x02\xe4\x95\x89\x40\x2d\xac\xc2\xd3\x0f\x2c\x1e\xe0\x8c\x55\x4d\x98\x80\xc9\x4d\x49\x88\xa9\xe4\x75\x51\x55\x16\xb4\xb0\xae\xef\xaa\xf2\x7f\x58\x8c\x65\x4e\xbb\xee\xca\xd4\xfc\x99\xf2\xea\xc7\xee\x7a\x2a\x95\x94\x8a\xda\xbb\xc0\xc4\xbc\x73\x9e\x28\x8c\xc8\xa6\x46\x95\x4d\xb8\x98\x86\x4b\x14\x06\x26\x64\x4e\xeb\xbd\x22\xcc\xed\x5d\x55\x1e\xbe\x63\x36\xb9\x1f\x94\x10\x63\x47\xa8\x5e\x0f\x3d\xb4\x04\x75\x40\x86\xd0\xfd\xd7\x9b\xdd\x68\x51\xd0\x5e\x42\x07\x59\x16\xda\xf3\x66\x20\xf6\x51\x5f\xb0\xeb\xc8\x44\xfb\x09\x41\x1e\x96\xcf\x0e\xd7\x98\x7a\x5e\x28\x22\x93\x66\x30\x87\xed\xaf\x4c\x44\xf3\x6c\xa9\x3b\x4c\xc5\xb4\x23\xb7\x73\x79\xdf\xee\x9b\xfb\xca\xe8\xa5\xcc\x8e\xa8\x94\xb1\x90\x42\x79\x7b\x5d\x56\x1f\x50\xa9\xeb\x6c\x36\x32\x65\x81\x41\x01\x92\x2e\x14\x1c\x2e\x39\xfc\x65\xea\x7b\x9c\x86\xd6\x01\x8a\x13\xe4\xce\x01\x36\x54\x7f\xdd\x02\x9d\xfa\x01\x50\x89\x8b\x41\x01\x4d\xc0\x34\xa9\x2f\x38\x11\xf4\x7c\xb8\xd0\xef\x86\x82\xf3\x93\x8a\x77\x99\x06\x3e\x6a\x83\x0c\xae\x9b\xb2\xc2\x61\x7c\x20\x0d\xe2\x84\xb6\xfb\xfb\xc5\x83\x23\xd3\x95\x69\x90\x18\x31\x51\x95\xbd\x2f\x4f\xcd\x60\x9b\x4d\x43\x1e\x4b\xe9\x12\xef\xcd\xa9\x2a\x6e\xce\x2f\xd0\xa3\xf2\xa6\xae\x7f\x1a\x25\xc2\xa9\xca\x3c\x94\xef\xf8\xe0\xe4\x54\x5d\x82\x39\x8d\x04\xa3\x9d\x65\x8b\x1d\x33\xd4\x48\xf2\xe4\x57\xbb\xf7\xe4\x72\x1a\xc9\xe2\x3b\x40\x23\xdf\x8c\xf6\xf4\x5c\x5a\x3b\x8d\x99\x22\x54\xc4\x02\x7b\xbf\x37\x4d\x82\x88\xb4\x79\x6e\x16\x4f\xcb\xe7\xcd\x7e\xf9\xfc\xf4\x6d\xb5\xd9\xad\x36\xfb\xaf\x2f\x5f\x36\x8b\xdb\xd5\xa6\xeb\x18\x59\x4a\xb7\xa9\x0a\xfa\xe4\x6e\x38\x78\x14\x70\xeb\x65\xae\x2f\x28\x5a\x65\xca\x45\x42\xe4\x24\x96\x98\x98\xd0\x27\xee\x42\x1c\x35\xd5\xbf\xbd\x41\xbd\x2a\xca\xd3\xeb\xdb\x85\xb1\x35\x1f\x3b\x6f\x0f\x24\xa0\xfa\xcb\x1f\x8f\xcb\x39\xca\xec\x4b\x03\x35\x85\x98\x39\x15\x66\x57\x80\x53\xaf\x76\xf7\x93\xbb\x05\x19\xeb\xa1\x72\xf7\xa2\x38\x4f\x72\x7a\xf3\x37\x24\x7c\x4e\x40\xe3\xb7\x52\xe5\xbb\x2c\xcf\x87\x58\x97\x54\x84\x9c\x72\xf9\x1b\x50\x50\x6d\x8f\x88\x6a\x50\x1b\x23\x53\x01\x18\x49\x5b\xe0\x6a\x2e\x76\x57\x56\x37\x8d\xbc\xa6\xf5\x39\xb9\xb2\x32\x64\x03\x46\x03\xfb\x6f\x25\x9e\x53\xa1\x24\x05\xf5\xbe\x60\xf3\x52\xe6\x99\x3c\x7f\x06\xe3\x4d\xa5\x67\xec\x8f\x76\x06\x1a\x92\xb1\xbf\x37\x58\xa5\x97\x46\xbd\x4c\x88\x25\x34\xee\x26\xb7\xd2\x06\x50\x71\x80\x9f\x0f\x59\xf1\x03\x95\x93\xfd\xee\x1d\xd7\x14\x03\x46\x63\x07\x08\xbd\xb5\x68\xde\xb0\xc8\x80\x68\x39\x7b\x44\x47\x7f\x3d\xe4\x9c\x40\x6c\xdd\x72\xb1\x3f\xb6\x33\xfb\xf3\x0f\xa7\x59\x6c\xaa\x8e\x6d\x25\xd5\xf3\x83\x83\x14\xa7\x3a\x49\x9d\x2e\xd0\x17\xa8\xe7\x22\x77\xdc\x8b\xcd\x1a\xfb\x8a\xcd\xbf\x4a\x95\x81\x9c\xb6\x2b\x23\x33\xbb\x2a\x94\x43\x46\x71\x16\xc9\x24\xec\x1d\x90\x76\x92\x51\x88\x7e\x7e\x5d\xe6\x0c\x8c\xb8\xc6\xfa\xcb\xae\x53\xc1\x90\x9c\xa1\x61\x39\xfb\x4e\xe4\xd5\xbf\xcd\x14\x88\x4b\xce\xb4\x61\x3f\xac\x28\xa7\x7b\x57\x56\xdf\xcb\xea\xc7\x75\xe4\x72\xb7\x23\x72\x5f\xb0\xa4\x63\x9e\xbb\x39\x55\xc5\x68\x59\xe6\x81\x6f\x08\xff\xaa\xac\x39\x41\xde\x43\xb6\x79\x90\x4a\x43\x34\x4b\xa1\x92\xad\x71\x64\x8e\xce\x02\x1e\xbf\x99\x80\x03\x31\x59\xff\xfe\xe7\xe6\x79\x5d\xbc\x77\xa7\x90\x9c\x9e\xf6\x98\xc3\xd9\x54\x14\x5c\x8d\x1f\xf0\x38\xf2\x63\xe1\x9c\x84\x06\xbf\xd6\x6e\x13\xe5\xb1\x0c\xd1\x68\x80\x67\xaf\xaf\x58\x59\x08\x95\x6b\x4d\x7c\xb3\xfa\xd3\x9a\x0d\xc5\x08\xbd\xc5\x93\x28\x0c\x4d\x25\xe9\x07\x79\x6d\x83\x00\x0d\x4f\x84\x30\x92\x5f\xa7\xca\x54\x13\xb8\x86\xd4\x33\x40\x80\xa1\x36\x35\xe5\x7b\xe7\xf7\x4f\x9e\x32\x45\x69\x61\x02\x80\x51\xba\x76\xfc\xe5\xd2\x24\x22\x2c\x2f\x6d\x97\xa0\x75\x8e\x77\x15\xe2\xc3\xf3\xee\xca\xf9\xb8\xe7\x0d\xd4\xf0\xc7\x70\xec\x5f\x45\xd7\x46\x8e\x09\xe7\x2a\xf5\x6c\xd1\x9d\x11\x80\xee\x04\xc2\xad\x59\xc1\x21\x96\xfe\x90\xc5\xa1\xcc\x0a\x93\x2d\x37\x11\xe9\xd3\x48\xb6\xd6\x1e\x23\x3c\x46\x59\x2c\xfc\x79\x5c\x37\x78\x30\x28\x17\xd7\x16\x25\xf4\x52\xa9\xb0\xa5\xfb\x51\x18\x9c\x9a\xc2\xe2\xdc\xee\xc0\x75\xfd\x51\x56\x16\xaf\x97\x0e\xe1\x95\x5c\x48\x9f\x48\xd7\x3b\x64\xf9\x53\x59\x7c\xa3\x40\xe9\x18\x51\xf1\xf7\x36\x58\x2e\x30\x8c\x5d\xd9\x9b\x91\x2a\x9e\xab\x30\x92\x5c\x32\xe9\x4a\xe5\x17\x79\xd3\xda\x4a\x57\xfa\x09\x4d\x15\x0e\x16\xa0\xaf\x4e\x33\x54\x6e\xe3\x3b\x50\x60\x2a\x42\xde\xe5\xcf\x21\x17\xb3\xe4\x4a\x1a\xdf\x8c\x66\xe5\xaa\x79\x6b\x2f\x6a\x79\xf3\xc6\x59\x27\xae\x54\x90\x1a\x3d\xb7\x76\xe2\xbb\xb8\xc3\x75\xed\xdb\x2b\xef\x42\xc7\x26\x43\xff\xaf\x61\x4d\xbe\xe4\x3a\x4d\xe9\x8d\xff\x2b\x7b\x2d\xba\x80\x12\xd7\x3c\xf5\x0c\x0c\x60\xb9\x7d\x9e\xbc\x04\x2d\x51\xda\x72\xdc\x0b\xde\xef\xf9\x97\xa0\x55\x44\x4f\x60\x18\x6e\x89\x76\x65\xb0\x3e\x69\x8c\x88\x46\xe0\x65\xfd\xc7\xea\x61\xbf\x1c\xe4\x4b\xb9\xd6\x46\xec\xa0\x5d\xfe\xd7\x4f\x0e\xab\x0a\x1e\x47\xf2\x3c\xfe\x28\x4f\x6a\xf0\x2c\xc0\x78\xea\x00\x36\xc5\xe9\x30\xbe\x6d\x60\xb2\xd3\xe3\xa7\x70\x88\x21\x59\x75\x87\xfa\xc2\x50\xc2\x65\x84\x49\xfd\xe8\x89\x8c\x6f\x4f\xed\x5a\xdc\x43\xb4\xc0\xd7\x3e\xf9\xbc\x94\x58\xa6\x45\xa5\xf3\xa0\x1e\x7b\x2b\x01\x82\x28\x4e\x07\xe2\x3e\xe3\xf5\x12\x82\x48\xfa\x16\xca\xbd\x95\xe5\xe9\x58\x76\xa2\x6e\xcb\x72\xea\x68\x41\x10\xfb\x04\x7e\xc2\x9f\xd9\x24\x59\x0b\xa1\x97\xc6\xa6\xe2\xe4\x48\xd1\x51\xb7\x2d\x41\xc8\x02\xb0\xf3\xba\xf5\xc5\x36\xed\x12\x5e\x77\x8d\x41\x64\xf2\x22\x15\x88\x9b\xb2\xec\x6a\x6b\x20\xd4\x29\xa5\xa2\x6f\xa8\xd2\x7a\xc8\xbf\x28\x21\x12\x8a\xf2\xa8\x45\xf9\x0e\xed\x2e\xd2\xfd\xae\x13\x5f\x77\xfb\x52\x2f\x05\xd9\x49\x4a\xda\x7e\xb1\xcf\x60\x40\xfe\x70\xcc\xb3\x06\x0a\xb5\xea\xaa\x94\x25\xc4\xa0\xc9\x0f\x59\x35\x7a\xe8\x74\x41\xac\x02\x66\xb1\x8a\x4f\x70\xc0\x97\x8c\x42\x23\xa7\x19\x14\x16\x24\x3e\x1a\xe2\x6e\xac\x9b\x2f\xd8\x3c\xc0\xc7\x79\x24\x68\x2b\x21\x09\x78\x64\x6e\xb7\xf5\x07\xee\x06\x14\x55\xe3\x41\x0b\x49\xca\xa9\x2a\xc2\x86\x40\xcb\xa2\xc0\x11\x1c\xce\x86\x5f\x86\xf8\x56\x7b\x64\xaa\xcd\xf0\x14\xa7\xaa\x18\x28\xbe\x49\xe0\x2c\xa5\x54\x58\x26\x4b\x0b\xca\xdc\x98\x7a\x7f\x95\x99\x6c\x46\x3b\x9a\xd6\xc5\x54\xa2\x5d\x02\x4f\x0c\xdf\x10\x92\xfa\x53\x21\xc7\x85\x65\x17\x40\xd0\xcf\xe0\xa1\xc0\x53\x4e\x95\x3e\x32\x6b\xf0\x05\x8e\xd3\xb0\x08\x70\x2e\xe9\x3b\xbd\x19\xdd\xbb\x75\xd1\x71\x05\x4a\xe0\x92\x51\x54\xe4\xa5\x3a\xbf\x2f\xbb\xef\x03\xcc\x10\x82\x66\x04\x9f\xfe\x52\x41\x31\x0c\x72\x8f\xbe\x0f\x44\x46\xd7\xa4\xed\x78\x6b\x02\x01\xf3\x86\x12\x40\x1a\x7b\x51\xc7\x1e\xf8\x8a\x41\x57\xda\x2b\x01\xc0\xe0\x88\x6c\x74\x73\xd9\xee\xbb\x57\xd0\x3e\x00\x22\xa5\x80\x72\x6b\x3c\x0e\x15\xe5\x24\x08\x2f\x26\x5f\x2e\xab\xbf\x19\xc6\xf0\x0d\x09\xc0\x76\x57\x91\x51\x48\x01\x0b\x8a\x0f\x7d\x1e\xee\x05\x29\xb4\x6f\x81\xd2\xdb\x63\x59\xd4\x65\x55\xbf\x65\xc7\x7a\x4b\x6e\xf0\xcd\xd9\x5a\x9b\xf3\x03\x4d\xc9\x88\x44\xca\x2d\xba\xc6\x30\x5f\xdb\x36\x0c\xa4\xe8\x6c\x37\x7a\x0f\xcb\xb2\x50\xd9\x00\xcc\x0f\x28\x02\xc2\xde\x9e\x0c\xed\x6f\xbf\x6f\xf7\x57\x40\xf4\xc7\xba\xfd\x46\xa9\xe6\xf3\xd0\x3a\x68\x66\xe4\xa7\xbe\x54\x88\xc5\xaa\xc0\xea\xb5\x7b\x75\x9a\x2b\x0a\x9d\x92\xba\x0c\x64\xf9\xae\x2c\x1f\xa1\x38\x3f\x12\xed\x43\x77\xf3\x1a\x84\xb2\x19\x9c\x21\x19\x95\x04\x8d\x9a\x32\xec\xcb\xfc\xef\xd4\x5d\x0a\x2f\x4d\xd8\x40\x58\xf3\xf6\x5c\xc0\x21\x93\x57\x29\x3b\xda\x03\x90\x18\x47\xf6\xae\x58\xbd\x5f\xbe\x85\xc7\x03\xcf\x44\x7d\xcf\xf5\xa8\xd2\x59\x0a\x0f\x42\x72\xb3\x8d\xb4\xd4\xba\xe7\x52\x72\xed\x32\xa1\xc0\x04\x49\x25\x51\x58\xc2\xa8\xd3\x8c\x27\x90\x60\xdc\x90\x08\x98\x85\xe3\x69\xf1\x6d\xfc\x35\x04\x53\x3e\xa5\xc1\xd6\xcb\xdd\x67\x28\x4b\xc1\x54\x4c\x0b\xae\x2e\x4f\x55\xf3\xf6\x1d\xd1\xed\x2d\xc2\xe7\x31\xb9\xa7\x5f\xf0\x40\x18\x2c\xf7\xc6\x45\x10\x18\xc1\x49\x62\x47\xac\x6b\x54\x86\xe7\xdc\xc4\xad\xb7\x39\xd4\x6f\x73\x7e\x8f\x88\x74\x4c\x08\xa3\x02\x3f\x86\xb5\xc2\xb6\x35\xf6\x42\xba\xdf\x43\x56\x0c\xcc\x67\x11\x33\x95\xc0\x48\x90\x90\x46\xae\x5d\xbc\x26\x57\x88\x01\xa8\x7e\xe4\x07\x4e\x8a\xde\xa5\x88\x5b\x93\xb1\xe3\x8e\xb9\x5d\x2d\xd7\x8f\x5d\x68\x47\x24\x61\x00\x36\x58\xf6\x3c\x05\x22\x89\x24\x34\x41\xa9\xbb\x53\xbb\x21\x90\x6d\xbb\x84\xfc\x22\x0b\x67\x87\xd4\x24\x62\x38\xac\x5c\x1f\xfd\x65\x57\xe6\x83\x48\x78\x84\x76\x38\x3b\x19\xb9\xcb\x64\xa4\x48\x50\x84\x72\x54\xeb\x41\x09\xd8\xf1\x2b\x4d\x99\xaf\x1c\xa2\xa0\xf5\x18\xcb\x93\x2b\xdd\x38\x42\xd5\x53\xb3\xff\x3b\xec\xc7\x76\xd0\xe9\xf0\x85\x6e\x98\x73\xdf\x23\x92\xb9\x7f\x94\xd5\xeb\x10\x6d\x2a\x78\xa2\xa3\xa4\x8f\x52\xd6\x26\xfd\xe3\x1a\x15\x10\xd3\xdd\x06\x15\x1e\x8e\x73\x72\xf4\x93\xe7\xe6\x28\xe9\xfb\xef\xf0\x70\xc4\x0a\xda\x77\xfd\x88\x50\x9f\x4c\xc9\xc9\xcd\x74\x43\x1c\x46\xae\x04\x47\x0c\x45\x57\x40\x62\xc0\xa8\xcf\xe2\x2f\x94\xcd\x43\x3f\xef\x20\x4a\x69\xf8\xb5\x73\x29\xb7\x52\x05\x0e\x0b\xdd\x9d\x89\xd8\xb9\xed\x0a\x5b\xca\x0c\x72\x1b\x73\xae\x0d\xcf\x8b\x3b\x97\xf0\x34\x65\xb5\xb0\x68\xaa\xf3\x70\xe3\x17\x92\x4b\x4c\x6c\xee\x6a\x57\xee\xca\x06\x1f\xb2\xff\x9e\x32\x05\x4d\x59\x8d\x4c\x73\x81\x0c\xc9\x34\xff\xba\xbd\xbd\x7d\xfe\xfe\xf4\xf0\xbc\xb8\x7d\xd9\xac\x97\x2e\x82\x2b\xb4\x67\x6a\x33\x8b\xd3\xc1\xc6\xfc\xeb\xed\x4c\x05\x92\xd0\x51\x48\xd5\xb6\x96\x3f\x6b\xac\x77\x2c\x85\x4e\x18\xa5\x3b\x1e\xca\x57\xbb\x83\x75\x0d\x68\x94\xa7\xa8\x8c\xce\xd4\x34\xac\x65\xd9\x35\x23\x27\x16\x33\xb3\xbe\xd8\xf6\x2d\xe4\x14\x7b\x78\x2c\x8b\xe6\x2d\x3f\x1b\x51\x31\x47\x49\xfd\xb7\x1c\x04\xe9\x79\x82\x0c\x64\xe3\xff\xbd\xe4\x20\x2f\xea\x4e\x5c\xcf\x00\x69\xea\x1b\x69\xb9\x0b\x1a\x42\x29\xbd\x50\x44\x06\xe3\x7f\xc8\x8a\xaf\x1d\xe2\x70\x94\xc6\x91\x5e\xec\xbb\x3d\x93\x32\xb3\x36\x87\x30\x25\xf0\x93\x92\x79\x11\xed\x70\x37\xeb\xe1\x72\x2d\x7d\xcf\xa8\x2a\xef\xa0\x6e\x26\x0d\xe0\xd9\x29\x78\x5f\xe6\x6a\x05\x15\x31\x96\xae\x2d\xb5\xca\xfc\x33\x05\xa0\x68\x19\x7a\xc7\xaa\xb5\xc6\x56\x46\x10\x4a\x8d\x80\xc9\xd3\x43\x94\xa0\x04\xd2\x7e\xce\x51\xbf\xf6\x77\xfc\x68\x61\x10\xd0\xad\xbe\x67\x75\x67\x07\xcb\x50\x0b\x12\xcc\x35\x81\x17\xc3\xd3\x93\x5f\x53\xc2\x94\x32\x0e\x12\x8a\xd3\x50\xba\xc6\xd5\xd5\xb4\x2b\xf5\x63\xd6\x91\x90\x4a\x19\x73\xa0\xf9\x63\xbe\xee\x71\xf4\x75\xc7\xf7\x14\x73\x41\xc4\x90\x4f\xcf\xbf\xaf\x17\xee\xf0\xc4\x4b\x8d\x10\x31\x14\xad\xf1\xff\xb5\x21\x55\xf9\x2b\xef\x32\x09\x04\x95\xd8\x10\x95\xda\x76\xff\xb2\xda\xec\x37\xcf\x5f\xbb\xea\x7e\x99\x70\x48\x23\x27\x3c\xd8\xf1\xc6\x49\x99\xfa\x9c\xd2\x2e\x1f\xbf\xf8\xaf\xeb\x9f\x08\x53\x4f\x54\xe6\x6a\x5c\xb2\xe1\x3a\xa4\x46\x82\xef\x0d\xea\x31\xff\x8e\x6b\x97\xdc\xb1\x0a\x3d\x57\xa6\x84\xe1\x09\x7f\x36\x77\x88\xdf\xb3\x42\x95\xdd\x85\x38\x13\xc2\xba\xbc\x04\x47\x7d\x81\xca\x0a\xee\xf5\x75\x2b\x73\x03\x65\xf2\x5e\x78\x1c\x6b\xb0\x04\xc4\xd7\x02\x77\x73\xf9\x7e\x7b\xb8\x8c\x4d\x19\x61\xe7\x05\xdc\xe5\xf0\xba\x28\xd4\x7d\xa6\x14\x16\xcb\xae\x88\x42\xca\x38\xb5\xb8\x24\x7a\xa4\xfd\x21\xa3\x21\x74\xa1\x18\x33\x7f\x97\x32\x4d\xa9\xfc\xab\xfd\xce\xa7\xe3\x17\x38\xe0\x4d\x1f\x6e\x93\x52\x9b\x50\x89\x5d\xd4\x0c\x82\xd0\x35\x2a\xf4\xe8\xd0\xcc\x70\x91\x1b\xb4\xd4\xcb\x14\x47\x2b\x51\x06\x3c\xee\x42\xc9\x76\x9b\xec\x5a\x75\xe0\x39\x11\xe3\x0d\x16\xcd\x25\x7e\x49\xea\x08\xa8\x10\x6d\x7f\xac\xb2\xff\xe1\x08\xee\x2b\xb5\x52\x14\x03\x38\x96\x0d\x16\xed\x4d\xe4\xe7\x65\x56\x91\xd9\x9b\x15\xaf\x2f\xa5\x7b\x49\xca\x8b\x0c\xa7\xa7\xa8\x4a\x50\x12\xea\x11\xc3\xb8\x54\x9e\x0c\x0c\x72\x1e\xed\x7d\x74\x3b\xa8\x62\x29\xf3\xb5\xdd\x49\x28\xaf\xb6\x2b\xe7\x27\x82\xf2\xbd\x88\x3e\x44\x17\x21\xb8\xa0\x39\xfe\x45\x0c\xc7\x9d\x27\x45\x6e\x03\xd3\xb4\x86\x99\xc1\x7c\x09\xb0\x55\xbe\x08\x0c\x8c\xc5\x28\xe7\x59\x5f\xa4\x35\x67\xff\x51\x8a\x8b\x7d\x60\x34\x19\x54\xe0\x25\xa9\xc5\x41\xca\xf2\x70\x84\x62\x52\x56\xae\x02\x99\x50\x36\xa5\x75\x85\x9c\xfa\x8f\x54\x81\x06\x0a\xee\xed\x05\xd4\x18\x87\x0a\x65\xa9\x46\xf8\x49\x15\xda\xfc\x5c\x17\xd7\x51\x91\xef\x53\xb6\xc0\x38\xe1\x94\x87\xee\x43\x93\xfd\x05\xa3\x08\x08\xcc\x5b\xe0\xcf\xe6\xa9\xbc\x00\xed\xa8\x08\xc1\x6c\xf6\x0e\x22\x3e\xd9\x62\x55\x1c\x32\xe1\xbb\xa5\xf1\xae\xac\x96\xe5\x28\xa6\xa1\xe2\x10\x06\x25\x7b\xab\xe6\xed\x16\xb2\xfc\x6c\xa8\xd3\xc6\xb7\x12\x4b\x24\x27\xed\xa6\xcc\xd5\x01\xba\x0b\x24\xa1\x24\xbc\x32\x36\x6f\x38\xb6\x22\x54\xa2\x3c\x02\xe2\xb5\x6e\x6e\x8e\xd5\x6d\x79\x12\x79\xd9\x93\xe0\xa8\x34\x36\x52\xf4\x2e\x40\x34\x7e\xb4\x54\x29\xcf\x66\x2b\xfe\x78\x19\xa9\xd2\x8e\xfb\x71\xc0\x5e\xe7\xb3\xf5\xc4\xaa\x53\xdd\x7c\x7f\xc3\x62\xdb\x90\xba\xaf\xbb\x1a\xd7\x86\x77\x48\x9c\xce\xcc\xc5\x65\x15\xa4\xa9\xb4\x6c\x88\x7e\x14\xdf\x9c\xaf\xd6\x49\x2b\xa1\x03\xd5\xe9\x81\x19\x82\x83\xfa\x11\x8e\x97\xa5\x88\xce\x07\x53\x92\x1b\x0a\xdf\x76\xc3\xc0\x25\xc1\xe5\xa6\xc0\x7d\xa5\x42\x3f\x30\x25\xda\x13\x75\x4f\xa9\x94\x08\x89\xef\x63\xf9\x74\xbb\xb3\x26\x8e\x6b\x42\xab\xa2\x54\x97\xf9\x3b\xfe\x66\x6f\x77\xee\x8f\xeb\x1f\x7b\xe4\xf1\xfd\x6e\xab\xd5\x46\x1c\x8d\xe3\x1b\x42\x15\x91\x87\x77\x20\x8a\x23\x1c\xa4\x92\xd1\x4b\x21\xe4\x1d\xc6\x67\xce\x8d\x42\xe6\x49\x02\x6e\x9a\xd1\x44\x0e\xe2\xae\xfc\x17\x56\xce\x72\x43\xc6\xbc\xd0\x6e\x23\x37\xad\xbd\xee\x56\x83\xcf\x98\xf3\xda\xa3\xc0\xb2\x39\x90\x00\x34\x4c\x56\x53\x24\x1a\x93\x5e\x6c\xa6\x79\x5b\x35\x6f\x97\x2c\x15\xc8\x52\xd0\xc6\x5c\x12\x43\x6b\x09\x99\x0e\x09\x30\xd1\x94\x37\x4e\xb0\x6a\x9c\x4d\xb0\xfd\x02\x16\xd1\x66\x6b\x78\x30\x8d\xdc\xd4\x06\xf3\x51\xd9\xe2\xc8\x81\xc5\x20\xf5\x93\x4e\xd7\x3e\x2f\xab\x3f\x31\xcf\xbb\x3d\x15\x03\xc5\x0d\x5d\x0b\x36\xf2\xcd\x0c\x90\x1c\x95\xc9\x82\xdf\x95\xd5\x23\x56\xed\x7b\x74\xd3\x09\xc3\xd8\x78\x21\xb5\x7c\x43\x75\xca\x71\xe4\xe9\xd1\x7d\x86\x03\xa7\x6e\xc4\xb3\xd0\xba\x4f\xd1\x7f\xdc\x79\x24\xe7\x9e\xf5\x66\xf1\x1d\x8b\x13\xee\x4a\x5b\x92\xd7\x5d\x0a\x0d\x48\x54\x14\xe6\x4d\x8d\xe6\x35\x46\x3e\x12\x46\xa0\xc9\x0e\xb8\x2f\x8b\x7d\x53\x81\xc2\xc3\xb0\xc2\x10\x23\xf0\xb8\xf5\x14\xbf\x97\xd5\x90\xa1\x56\x62\x1c\xa6\xb1\x4d\x35\xbc\x20\xc5\x00\x47\x11\x9b\xf1\x1b\x8c\x85\xf2\x63\x97\x39\x5a\x42\x25\xba\xa5\x0d\x13\x16\x44\x56\x93\xc9\xc0\x4f\xaf\x8c\x69\x4c\xc3\x90\xdc\x05\xf3\x14\xdd\xe4\xc7\x34\x0a\xa9\x24\x71\xd5\xfa\x0b\xdd\xec\x42\xee\x21\x71\x80\xe5\xf8\x8e\xf9\xd7\x49\x6d\x0a\xf2\xd8\x48\x69\x98\xba\x4a\x3b\x10\xef\xaa\xf2\xf0\xcf\x13\x4e\xc3\x4e\x08\x71\x08\x36\x99\x93\x6f\xcb\x03\x3a\xd5\x9d\x6f\x19\x3c\x9f\x9a\xfe\x7d\x43\x62\xd8\x7e\x1d\x9e\xeb\x11\xaa\xd7\x89\xd6\xba\x44\x40\x41\xfa\x8f\x28\xcb\xfa\x5c\x37\x78\x30\xc6\x45\x47\x84\xe2\x4e\x26\x99\xd1\x54\x7c\xc5\xe6\x25\xfb\x89\xbd\xe4\x55\x57\xfb\x8c\x52\x27\x24\x47\xd9\xee\x9f\x59\xf1\xda\x8d\xbd\x09\x37\xa4\xed\xad\x22\x41\x5a\x6b\x1d\x5e\xc7\x24\xc5\xfc\xd4\xb5\x2b\x8f\x66\xfd\xfe\x15\x9b\x5b\x0a\x24\xd2\x94\x20\x51\x66\x9a\x1b\x97\x2a\x23\x12\x91\x25\x34\x88\x3a\x15\xf8\xa9\xfa\xbb\x44\xf4\x7d\x74\x31\xb6\x2d\x11\xa9\xb5\xf7\xb9\xc5\xa6\x1e\x81\xd0\x51\x27\x8a\x5e\xcc\xf7\x9b\xef\xbf\x8e\xa5\xa1\xb6\x6e\x00\x28\xe5\x0f\x1d\xbd\x4f\x5d\x43\xd4\x10\x2a\x43\x87\x54\xbc\x58\x1a\xdc\xde\xdc\x44\xad\x7d\x6f\xf8\xfd\xec\xbc\x1a\x3f\x8f\xf6\x98\x67\x88\x4b\xda\xdd\x7e\xa4\xf2\x25\xb5\x17\x58\xb4\x2c\x36\x37\xa7\xb3\x25\xc1\xa3\x6d\x98\x68\x77\xde\xa7\xe0\x55\xed\x85\x21\xf6\x2a\xf0\x7b\xfc\x79\xcc\xcb\xd1\xd6\xaf\x99\x32\x94\x04\x5d\xc1\x40\x9e\xef\xca\x4e\xba\x6e\x76\xaa\x68\xa6\xcc\x12\x59\xa1\xae\xb0\x9e\x59\x44\x35\x53\x8a\xf0\x5f\x06\xb1\xf0\xac\x77\x6f\x58\x1d\xca\xe3\x39\x87\xf9\x57\x98\x5e\x2d\x8f\x18\xad\xf1\xda\x6f\xbd\x83\x4b\xcd\xdf\x2b\xf7\x19\x28\xb3\x23\xac\x1e\x46\x75\x9a\x3a\x8c\x04\x45\xcb\xac\x80\x19\x49\x5d\x9c\x30\xf7\x27\x0f\x11\xc5\x9a\x1c\x46\x50\xea\x06\x89\x01\xc7\xec\xe9\x97\x94\xf3\x93\xbb\x8c\xb8\x94\x3d\x89\xf4\x56\x66\xad\x85\x5d\x37\x77\x65\xb5\xca\xf1\x7a\x9d\xa7\x8e\x55\x9a\xd8\xd4\xdb\x62\xb3\x2e\xde\x77\xbd\xa0\xbf\xd4\x09\x37\x02\xac\x2e\xdb\x7e\xe5\x1c\x89\x0e\x08\x36\x67\xae\x3d\x12\xb9\x19\x85\x9c\x74\xea\x7b\x48\x39\x43\x8a\x0b\x3d\xeb\x0d\xca\xb2\x9a\x4c\x2e\x9d\x06\x29\xe1\x15\x76\x58\x37\xfe\xd8\xa4\xd2\x69\x24\x29\x82\x57\x37\x44\x17\x56\xbb\xb0\xab\x4e\xe3\xd4\x10\x22\xdb\x40\xf4\x80\x62\x57\xea\x54\x48\xb0\x06\xdb\xba\xc1\x2e\x5f\x40\x4f\x7a\xe9\xcb\x69\x1e\x44\xd2\xd6\x04\xdc\xe2\x6b\x85\x38\xdc\x24\x34\x0f\x4c\x41\xce\x7a\xf9\xfc\x81\xf8\x83\xf5\xb9\x0f\xcd\x43\xb3\x7f\x51\x46\xe0\xf1\x76\x72\xef\x3c\x94\xca\x45\xfa\xd7\xc5\x7b\xd6\xd0\x9c\x98\xb3\x56\x34\x78\x01\x15\x90\x59\x57\x81\x52\x7a\xf3\xc3\x0d\x98\x22\x9d\x92\xaa\x50\x04\x28\xdd\xbb\x7b\x81\xd4\xf8\x61\xa6\x90\xad\xd3\x42\xbd\x39\x8f\x11\x30\xe3\xb3\x89\x20\x01\x63\xce\xbc\x23\xe4\xb6\x88\xef\x05\x2b\xdd\x7b\x00\x83\x4c\xd6\xe8\x2f\x8b\x3f\xff\x7f\x17\x79\xd3\x42\xc7\x32\xb6\xca\x63\x63\xa6\x48\xdb\xa1\xf5\x72\xa9\xca\x8d\x34\x0b\xf6\xcb\xc5\x8b\x6b\x51\x1e\x50\xbd\xc0\xfa\xe9\x76\xdd\xfd\xe6\x4b\x8a\x67\x6c\xa8\x00\x90\x42\xa6\xa7\x9c\xe2\xa0\x50\xd7\x8f\xa8\x32\x18\x44\x5f\x35\x2a\x9f\x52\xc9\x47\x38\xd5\x46\xad\x67\xf0\xdd\x75\xe8\x91\xfb\xbc\x00\xf9\x06\xd5\x79\xa8\x7b\xa5\x3c\x8f\xfb\x14\x50\x6a\xdd\xe7\x91\xfc\x90\x6d\x67\xcc\x4b\x6d\x91\xfd\x3b\x56\x8d\x3f\xa1\x83\x98\x74\x8e\xba\xd0\xeb\x5e\x19\x60\xc1\x43\x97\x9f\x56\x9e\x1f\xc4\x14\x6b\x69\xe0\x07\x6e\x31\xcf\x9f\x67\x65\x86\xe7\x3c\x45\xe5\xf9\xa1\x09\xb2\xde\x96\x1f\x85\x91\xf6\xfa\x3b\x70\x0c\xe5\xf9\xe8\x59\x68\x5c\xbb\xcc\xdb\xca\xff\xee\xe5\x28\x2f\xf0\x63\xa7\x71\xd2\xed\xeb\x4b\xe3\x8a\x8e\xf8\xa2\xba\x0f\xa9\xbc\xd0\xce\x14\x3a\xe4\x03\x2a\x55\x8f\x61\x8e\x83\x68\xc7\xf8\x19\xc2\x44\x9a\x28\x17\x7e\x58\xec\xf7\x67\x56\x78\xdb\x5f\x85\x76\x0d\xbb\x83\xfa\x2d\x2b\x8b\x7a\xd1\x34\xd5\x80\xd9\xce\x76\x8c\x98\x24\xd6\x58\xa2\x6c\xea\x1d\xff\xbc\x34\x99\x80\xca\xdd\x79\xe4\x9b\xf2\x83\xd7\xf6\x65\x54\x05\x01\x8c\xae\xe1\x29\xdc\x21\x91\x62\x68\x03\x0f\x37\x59\x3e\xde\x14\x95\x17\xc5\x09\xa5\x85\x72\x68\x6d\x86\x91\x97\xa0\xbc\x28\xd5\xb4\xc5\x9a\x90\xd0\xd4\x52\x18\x5f\x27\xf6\x79\xd4\xde\xda\xdd\x1f\x94\x94\xf9\xb4\x50\x4b\x79\x31\xf8\xe8\x64\x89\xb1\x40\x8d\x32\x83\xe9\xc8\x05\x66\x94\xa9\x0c\x53\xb3\x93\x33\xbb\xf8\x9a\x10\x0b\xed\x77\x3a\x26\x65\xb5\xa7\x97\xb8\x41\x6d\x92\xa2\x93\x73\x0a\x4d\x2f\xfa\x40\x29\x89\x1b\xa7\x79\x30\xe9\x25\x3c\x83\xcf\xcb\x4b\x50\x4f\x06\xfa\x74\x45\x07\x42\x11\xbb\x66\xec\x94\x0e\xe0\x54\xdd\xf6\x52\x71\x5d\x8f\xd4\xd8\x6d\x24\x8f\xbc\x69\x64\xd7\xa0\x05\xc5\x84\x04\xf8\x52\x94\x16\xc2\xde\x8d\x09\xe9\x49\xb2\x7d\x1e\xca\x57\xb2\x0b\x65\x76\xfc\x35\xa7\xbf\xf2\xa4\xef\x91\xf8\xd3\xee\xa3\x5c\x14\x6a\x71\x0f\xb9\x7e\x29\x8b\xff\x65\xbf\x75\xed\x92\xe8\x81\x1f\x9f\x77\xb7\x59\x3d\x28\x12\x54\x9e\x8c\x7c\x6e\x51\x71\x20\x9b\xa6\xce\xfb\x55\x46\xaa\x90\x56\x6d\xc8\x73\xe3\x13\xd8\x57\x37\x7d\xbf\xed\x78\x33\x04\xbc\x8f\x7f\x8e\x96\x29\x95\x28\x32\x56\x48\x6d\x64\xf5\x8e\x85\x93\x74\x57\xcc\x63\x09\xa9\x04\xae\x5a\xb3\x6d\x83\x45\x33\xa9\x2e\x50\xcc\xc3\xd4\xa0\xc0\x31\x1b\x06\xee\x14\x63\xcc\x04\x23\x44\x8f\x50\x9c\xdb\x40\x14\x63\x89\x62\xc6\x0a\x39\x15\x3f\xd8\xba\x5e\xa8\x2e\x84\xac\x18\x53\x8a\xaa\x84\x2d\x47\x89\x51\x77\xec\x10\xc2\x86\x8d\xd8\xf5\xf5\x59\x10\x0c\xd1\xc1\xcf\x94\xde\x2a\xab\x4d\x99\x8f\x23\x4d\x8a\x05\x91\x4f\xd4\x27\xc6\xcf\x5b\x74\xc0\x57\xc5\x02\x61\x02\x30\xed\x1a\xba\x90\x43\xea\x1c\xd7\x41\xa5\x84\xd3\x76\x57\x79\xcc\x8a\xcf\x18\x3d\x15\x0b\x10\x28\xbe\x71\xf3\xfc\xf4\x75\xbb\xf7\xf7\xb7\x8b\x3f\xb7\xee\x6a\x61\x64\x9e\x7d\x63\x33\x2a\xa8\x3e\xe1\x95\x57\x2c\x44\x45\x95\x91\x87\x4c\x11\x38\xe0\xf9\xd8\x7d\x45\x16\x25\x01\x4d\x9f\xbb\xb2\xfa\x91\x0d\xbf\x2f\x8b\xb4\x49\x85\x34\x46\xc6\xb9\xd3\x6d\x52\x2c\x16\x86\x7e\xb6\x9d\xea\xbb\xe5\x85\x7d\xac\x58\x2c\x85\x23\x77\x72\xa5\x3b\xd7\x0c\xe0\x81\x5b\xa2\x58\xe2\x03\xad\x0f\x23\xec\xf9\x20\xac\x3a\xff\x78\x49\x28\x9d\x38\xb0\x5b\xf5\xa7\x7b\x26\x4b\x40\xe2\x60\x40\xb8\x79\x32\xc5\xd8\x28\x96\x08\x49\xd1\xf5\xbd\xca\x6a\xe8\x03\x15\x8a\x25\x32\xa2\x30\xc6\x7e\x08\xd0\x98\x01\xc7\x2b\x96\xf2\x88\x32\xff\x5d\x70\x04\xa1\x1e\x98\xaa\x93\x52\x37\xc5\x78\x18\x13\xe2\xfe\x91\x64\xe1\x47\xdf\x00\x3c\x33\xb5\x6b\x6c\x5e\x40\xfe\xa0\x32\xb1\xf1\xc1\xe0\x29\x1a\x57\xe6\x4e\x1c\xe7\xd9\x55\xd9\xa0\xc9\xa5\x81\x1b\x8f\x6e\x8b\x55\x86\xb5\x15\x2f\x98\x5c\xa1\x75\x4b\x28\x54\x72\xaa\x25\x39\xa8\xf6\x77\x15\xa4\x60\xd4\xa6\xfa\xec\xf7\xc8\x00\x53\x4c\xa5\x8a\x80\x97\x79\x56\x53\x4d\x49\x37\x82\x94\x54\x89\x05\x35\x50\xbd\x95\xdd\xb4\x87\x60\x3c\xc5\x50\x01\xb1\xa0\x51\x60\x38\xed\x7e\x45\xcf\xb7\x22\x16\xce\xf0\x19\xdd\x2e\x6a\x95\x28\x97\x9f\x27\x85\x93\x66\x59\xaa\xee\xfb\xea\x20\xa4\xd0\x85\x31\x56\xad\x57\x30\xfe\x7e\x9a\x0b\x02\x14\x64\xf5\x8d\x91\x91\xea\x6f\x49\x4b\x0c\x1d\x13\xfb\xa8\x6a\x5a\xf9\x1e\xa4\x29\x77\x26\x88\x09\xd1\x15\xcd\x7a\x72\x6e\x9f\x05\x2a\x60\x7d\x68\xf1\x4a\xca\x40\xf9\x3e\x4b\x95\x29\x38\xcf\xf3\x21\xfb\x94\xf2\x7d\x2e\x28\x81\x4d\x75\xdf\x26\x30\xe5\x90\x59\xca\x0f\x03\x96\xb8\x28\x04\xa5\xfb\xef\x8f\xbf\x0c\x8d\x2a\x3f\x0c\x95\x0b\x46\x3d\x95\xcd\x06\x29\x1a\x39\xe4\x95\xb7\xfd\xa2\xc0\xf7\xe4\x48\x56\x69\x44\xb2\xa2\xfc\x28\xf6\x10\xdd\xbc\xef\x7e\x14\xb1\x76\xda\x7f\x65\xe1\x58\x63\x87\x69\x7d\xe5\xc7\x9e\x20\xfb\x6d\x4f\x69\x79\xcb\xf8\x3b\xcd\x53\x5d\x80\xdb\x27\x32\x89\xca\x8f\x65\xe7\x61\x76\xe4\x5d\xb4\xc3\x0e\xf3\x81\xca\x4f\x58\x42\x78\xd2\xeb\xc8\xee\xf9\x8f\x92\x84\xdc\x77\xb4\x24\x6f\x50\x14\x98\x5f\xf0\x48\x28\x3f\x49\x63\x5a\x6c\x4d\x90\xf9\x03\x8e\xcf\x5d\x4c\xb1\x6d\x04\x4a\x4b\xed\x50\xbe\x15\x65\x5e\xbe\x9e\x83\x2f\xfd\xde\xf8\x99\xdb\xad\xfc\xd4\x8b\x49\xa2\xdd\x20\x64\x08\x8a\xb0\xbf\x75\x27\x4e\x23\x45\x28\xb6\xd5\xee\x7e\xbf\x7b\xde\xff\x73\xbb\x33\x6c\xfa\xfb\xcd\x62\xb7\xea\x3a\xe9\x94\x26\x94\x29\xcc\x5a\xd7\x39\xf4\xca\xaf\x5d\xe4\x3e\xb8\x90\xdc\x68\xff\x69\xc5\xa1\x95\xcf\x3d\xdf\xf7\x7a\x2e\xd0\x76\xd6\xee\xce\xc7\xee\x63\x73\x4f\x19\x31\xb0\x11\xa8\x4a\xf9\x3c\x34\x1c\xd9\xf5\x31\xcf\x1a\xa3\x5a\xd2\x7d\x0e\x9e\x1a\x17\xf4\x0d\xe1\xb8\x2d\xab\xc6\x45\xd6\x9c\xdd\xe4\x03\x33\x88\x50\x52\x4f\xd6\x0d\x56\x6b\x59\x0e\x33\x8e\xad\xa7\x15\x52\x40\x86\x32\x3c\x0e\x96\xd3\x37\x9a\xf4\x1b\x65\x02\xbb\x52\x7a\xe5\x0b\xc5\x88\x23\xcd\xc4\x12\xee\x40\x8e\x72\x7f\xca\x17\xe8\x11\x81\x8a\x0b\xf9\x5d\x5d\x53\x7b\xdf\xc5\x97\x02\x99\x0d\x61\x35\x39\xde\x5c\x96\xd5\xb8\x7e\x32\x0a\x4d\xea\x4b\x64\x55\xf3\xb6\xf8\x99\xcd\x93\x7e\x28\x5f\x62\x60\xc2\xe7\x44\x54\xdc\xee\xc3\xb3\x44\x43\xca\x47\xcf\x14\x78\xbc\x22\x71\xf3\x56\xdd\x73\x62\xcf\xf7\x7a\x5f\x36\x98\x77\x0d\xda\xe7\x86\xf2\xc7\x68\x19\xff\x0f\xd5\xbe\xa2\x05\xf1\x0e\xb2\x1c\xd5\x73\xae\x4c\xf6\x62\x02\x7a\x74\x47\x73\xae\x7a\xe9\x8e\xe5\x5b\x76\x49\x4f\x34\xb9\x43\x2d\x7d\x8a\x63\x0f\x80\x12\x5f\xab\xec\xa2\x7e\xbb\xab\x7b\x1b\x46\x74\x54\xe0\xb1\xd8\xc4\x5d\x5e\xb1\x59\xbf\xdc\x6d\x89\x2c\x6a\x72\xc1\xae\xab\x24\xa9\x6e\x73\x6b\xed\xf4\xfe\x52\xe6\xea\x21\x9b\x90\xc5\xab\xc0\x03\x4d\x14\x18\xcb\xe7\xa7\xbb\xf5\x97\xfd\x6d\x3b\xa7\xb6\xeb\x5b\x57\xda\xac\x02\xe6\x99\xf4\xc4\x2d\x34\xb0\x2c\x8b\x86\xf4\x43\xfe\x4e\x30\x4f\x05\x2c\x4e\x28\x08\x73\x03\xd5\x01\x9a\xff\xed\x70\x84\x4f\x51\x81\x1f\x09\xdf\xa6\x81\x4c\x66\xcf\x79\x7d\xd3\x65\xa0\x1f\x5e\x81\xcf\x15\xd1\xaf\xac\x97\xcf\x64\x96\x0d\x63\xc0\x2a\x08\x42\x46\x64\xa2\x87\xbd\x84\x3c\x17\x20\x7f\x7c\x81\xba\x6b\x94\x1a\x3c\x4b\x25\x3f\x97\x44\x54\x41\xe8\x9b\xd8\x15\x9c\x9a\xb2\xfb\xe6\xae\x2d\x61\x24\x1d\x55\x9f\x0e\xf7\x16\x11\xbc\x7c\xa6\xf8\x4e\xd4\x75\xe1\x40\xa9\x3e\x0b\x48\x82\xec\x73\xae\x3c\x15\x44\x3a\xa6\x08\x5b\x83\x70\xb0\xbe\xa0\xba\xe2\xbf\x05\x71\x1c\x51\xdc\x6f\x9d\x97\xef\xf8\x67\x79\x72\x17\x8d\x53\x53\x8a\xa1\xd0\x68\xac\x4e\x0f\x93\x1e\xf1\xd5\xdf\x2c\x96\xbf\x7f\x7d\xd9\xef\xbe\x3f\xbb\x03\x93\x20\x11\x9e\x5b\x53\x5e\x3b\x78\xa7\x0a\x12\x90\x89\xc1\xd1\xbc\xbe\xe6\xe8\x22\xd4\x83\x6f\x90\x32\xa0\xbc\x81\x11\x00\xbe\x39\xcf\x84\x68\x82\x94\x49\xb0\x2a\x4a\xff\x28\xc5\x45\xba\x7f\xa0\xbe\xe2\x0e\x00\x8f\x8c\x6d\xd0\xda\x19\xf5\xee\x86\x52\x04\x22\xbf\xc5\xe6\xad\x72\x94\x86\xae\x49\x6b\xca\x72\x28\x2b\x9c\xd4\x03\x33\x55\xc0\x7d\x93\x93\x36\x9f\x63\x1e\xa0\xe2\xba\xa6\x66\x5f\x3f\x56\x16\xee\x3a\x90\xd3\x50\x01\xe7\x06\x20\xad\xc9\x54\xdb\x1e\xa0\x1a\x8f\x63\x88\x0c\xcd\xce\x1e\xba\x3a\xcf\x8b\x05\x72\x34\x3b\x41\x21\xc9\x19\x1a\xe6\xb3\x27\xfc\xd9\x0c\x39\xfe\x87\x1c\x0e\x2a\x10\x89\x89\x18\x74\x11\xf1\x61\x04\xc0\x6d\x10\x81\x64\x22\xb4\xfe\xc6\xc3\x9c\x1f\x34\x03\xac\x55\x81\x4c\x22\xc6\x47\xd6\xcc\xfe\x69\xb3\x73\x4f\x25\x45\xe8\xb9\x60\xb5\xfa\xeb\xa4\x32\xd9\xfa\x84\xe3\x68\x4a\x80\xa1\x47\x1c\x64\x22\x2b\xa0\x3a\xef\x6b\x84\xaa\x2f\x6e\x9b\x3c\xb5\x8e\x24\x8d\x60\x9d\x15\x6a\x99\x67\x2f\xad\xa1\xb3\x28\xd4\x16\x9b\x97\x4a\x5f\x48\xab\xbb\x83\x44\xc7\x7e\xe3\x28\xec\x9d\x21\x1c\x7a\x9e\x4f\x34\xfb\x7b\x71\xca\x72\xb5\x7d\xcb\x8e\xc3\x3a\x2d\x36\x61\x87\x76\x07\xa1\xb1\x2b\x6b\xa3\x06\x60\x25\x34\xac\x22\x94\xed\xc3\x98\xe1\xaf\xef\x70\xe2\x83\x42\xbf\x6b\x95\x66\xff\x1f\x67\x6f\xb6\xdd\x36\xae\x6d\x0d\xbf\x4e\x2e\xea\x82\x24\x40\x12\xbc\x94\x25\xd9\xd1\x2e\x77\xc7\x52\x92\xaa\x3a\xe3\x0c\x0d\x34\x0b\x16\xb7\x29\x52\x9b\x8d\x1d\xed\xa7\xff\x07\x17\x00\x76\xa2\x9c\x7c\xff\x4d\xb9\x22\x82\x1d\x88\x66\x35\x73\xcd\x39\x11\x11\x52\x34\x08\xa8\x67\x18\x5c\x70\xe8\xb5\x6b\x2f\xcc\x96\x53\x29\x1a\x84\x21\xc6\x99\x8a\x76\x22\x6d\x51\x21\xda\xb0\xe9\xe8\x09\xfe\x42\x51\xea\x6b\x1c\x8b\xb8\xf8\x3d\x72\xb9\xc9\xfb\xe4\xbc\xa2\x51\x68\x2a\x64\x78\x55\x41\x55\xdd\x42\xb7\xd5\xd3\x28\xa1\x86\x20\x2f\xe5\xf5\xae\x98\xb2\x00\x28\x1a\x69\xea\xb8\x79\x1c\x8b\xcf\x33\x6f\x1d\xc5\xf9\xbd\x96\x46\x9a\xe1\x74\x4d\xcb\xa6\x57\x33\x6b\x7f\x4e\x10\xcb\xf9\x76\x96\x86\x24\x2f\xed\xa6\x31\x8d\x03\x8d\x15\x27\x36\x6b\xb0\x17\x67\x7e\xb5\x98\x50\xd1\x38\x8a\x90\x8d\x0c\xb5\x48\x37\x8f\x77\xfb\xed\xd7\xcd\x6e\x79\xff\xf4\xe8\x8c\x39\xca\xbc\x24\xb1\x51\x52\xc7\x5a\x31\x43\x37\xac\x28\x23\x14\x5d\x96\xc7\xa7\xee\xcc\xc4\xc7\xc5\xa9\xc2\x5a\xaf\x55\x91\x43\x97\x1d\x9d\x92\xb5\x2a\xca\x78\x6c\x94\xaa\x32\x9e\x1e\x3f\xf5\x2a\xe7\x2b\x4d\x14\x65\xc0\xd0\x4e\x50\x85\x4b\x67\xd9\x03\x09\x35\x82\x97\x48\x7d\xed\xf4\x66\x15\x4d\x98\xb0\xe1\x4d\xb3\xce\x6c\x9f\x2d\x83\xc3\x28\xdb\xe3\x1a\x73\x0f\xa1\x1a\x5c\xa9\xff\xa7\x1c\xc2\xc5\x53\x72\x6a\xcc\xf6\x7d\x0e\x1f\x5f\x8b\xb2\x82\xed\xa1\xf8\x64\xd4\x77\xba\x59\xe3\xa1\xcc\xa3\x04\x47\xfd\x9f\xc5\x69\x14\x4c\xa1\x9c\x09\x84\x99\x7d\xe0\x47\xdf\x1b\xa2\xc6\xa9\xf0\xe6\x60\xfa\x08\x16\x78\x83\x18\xbf\x49\xfa\xaf\x8a\x2c\xe3\x57\x82\x3c\x54\x32\xdd\x87\x0a\xce\x45\x73\x3d\x1c\x6f\x4f\x50\x7e\xe8\x5b\x40\xff\xa5\xa2\xec\xf8\xb5\x14\x61\x48\xe4\xf2\xfc\xf4\x74\xbf\x5f\xaf\x36\x3b\x27\x5c\xa9\x28\x78\x04\x53\x68\xc6\x88\xde\xf1\xf2\x15\xea\x19\x0a\x35\x45\x81\x13\x8c\x59\x89\xe6\x7c\xcf\x73\xf5\x23\xad\x1d\x45\x93\xfb\x20\x2e\x82\xfe\xc7\x38\x94\x4e\x35\x37\xe3\x84\xcb\x03\xf4\xfb\x62\xe8\x05\x11\xd6\x9f\xee\xd6\x8b\x87\xfd\xf3\xfa\x65\xb9\x7e\xdc\xed\xef\xfe\x59\x77\xc7\x43\xa3\x44\x78\xb7\xfa\xcb\xfd\x14\x44\x9e\x05\x7f\xd7\x77\xbc\xb2\x36\xc7\x78\x44\x85\x41\x64\x34\xbc\xfb\x6d\x01\x33\x68\xbf\x50\xf1\x9d\xef\xe3\x90\x78\x01\x56\x62\xac\xd6\xdf\x97\xf7\x8b\xed\x76\xbf\xfe\x6b\xf7\xb2\x58\x22\x27\xec\xcd\x62\xdb\x3d\x2b\x21\x80\x2a\x34\x46\x10\x15\x83\xa9\xe3\xee\x0b\x89\xa0\x5e\x64\x71\x62\xa5\x5a\x57\xb2\x2c\x3e\x9e\xf2\x1b\xab\x8c\x31\xb1\x95\x43\x4a\x98\x19\x0c\xe9\xab\xa9\x76\x7a\x2e\x8b\xd7\x92\x1f\xd7\xab\x6f\x23\x93\x31\xa4\x92\x22\xc7\xae\x65\xa0\x5a\xe7\xea\xee\xc2\xa5\x0d\x43\x4f\xa0\x39\x7d\xb9\xc1\xcf\xee\x5a\x61\xc8\x35\x3a\x4e\x8b\xdb\x97\xcd\xd7\x6f\x37\xb2\x6c\x37\x2e\xb7\x16\x87\x51\x40\x11\x43\x77\x32\x50\xdd\xa1\xad\x11\x46\xb1\x26\x36\x12\x81\xbf\x8f\x54\x30\x6d\x9b\xd8\x8f\xa9\x1d\xe8\x77\x90\x43\x95\x5e\x48\x8e\x4e\xda\x73\x1a\xeb\xc1\x7a\x82\x29\xd6\xd6\x27\x78\x2e\x11\x4f\x3f\x6e\xcd\x02\xed\x1b\xe3\xc4\x38\x3f\x38\x4e\x0f\x25\x54\x87\x21\xfd\xea\xe4\x9c\x28\x82\xc0\xa9\x28\x9c\x4a\x30\x5a\x26\xe3\x3e\x49\x44\x18\xf5\x7a\x33\xbf\xd4\x99\x99\xdc\x21\x91\x86\x13\xea\x8e\xbf\x57\x69\x5e\xb8\xee\xe2\x3e\xc1\x18\xfe\x4d\x5a\x2b\xe0\x19\xa6\x1f\xc7\xb7\xe5\xa1\x44\x0d\x9c\xe5\xcb\xd3\x8f\xd5\x76\x71\xbf\xde\x3f\x3d\xaf\x1f\xdb\x0d\x65\xb7\x79\xe8\x86\x1f\x8f\x02\xdf\xd4\x97\xa5\x99\x72\xd6\xaa\x2b\x1b\x98\x1f\xd9\x02\x02\x65\x32\x1d\x59\x56\xd4\xf7\xc5\xeb\x95\xbe\x51\x91\x46\xe7\xf3\x26\xad\xd7\x67\x98\x22\x2f\x5c\x23\xd0\x58\xa6\x0a\x38\xac\xc7\x46\x56\xa8\xb4\x21\xf5\x47\xe5\xc9\xef\x3c\x73\x4b\x4f\x08\x3e\xd8\xda\x5a\x05\x70\x7c\x81\x53\x63\xf2\xdc\xb3\xc4\x41\x2a\x04\x6a\x08\x50\x2c\x2a\xf9\xb9\x75\x78\x7f\x40\x3a\x50\xee\x53\x21\xb0\x18\x3b\xb4\x35\x7d\x8c\x53\x86\xf1\xad\x9b\xf3\x3f\x3f\x96\x9f\x7b\x33\xa1\x66\xda\xb7\x6b\xcb\x5f\x3f\xae\x82\xfa\x5c\x63\x09\x58\xf9\xb3\xfc\xba\xf8\xd7\xe6\xf1\xce\xde\x3e\xf2\x42\x89\x51\x81\xc7\x6f\x0f\xfb\x4e\x15\x71\xf1\xd7\x66\xdd\x35\x60\x0c\x4b\xe6\x76\x07\x9e\xbf\xcd\xd3\x97\x8c\xec\xe7\xa8\x35\x12\x12\xb7\x2b\x94\xfc\x08\x73\xba\x30\xd7\xf2\xbc\xe3\x0e\x8c\x3c\x08\x06\xb1\x4b\x94\xa9\xc4\x52\xf4\xbe\xac\x48\x45\xbe\x47\x50\xe0\xaf\xc9\xab\x22\xb3\xd5\xfa\x37\xbc\xcb\x37\x47\x7e\xa4\x82\x21\x1e\x67\xe9\xc4\x4d\xfa\xf4\x5f\xe4\x73\xaa\x51\x98\xf1\xdb\x8e\xd0\xfd\xf7\xf5\x76\x87\x4c\x86\xdd\x61\x61\xec\x76\x30\xb5\x19\x1d\xeb\xe2\xe8\x73\x44\xbe\x54\x48\xaf\xdc\xee\x6e\x9b\xe5\x6a\x7e\x74\x46\x01\x01\xb4\xfb\x8a\x92\xcb\x0c\x06\x81\xac\x88\x00\x8b\x2d\xd4\xd5\x81\x8f\x2e\x20\xe8\x2a\x22\x5a\x21\xd5\x11\x4a\x31\x3e\x35\xf5\xa9\xa9\xb7\x48\x8f\xf1\x65\xb6\xb2\xcc\x9e\x45\x93\x10\xe9\xc9\xbe\xa7\xf0\xb1\x47\xe0\x40\x6d\x2b\xcd\xcd\x92\xb0\xb7\x39\xf1\xe9\x59\x3a\x71\xfc\x91\x69\xc5\x37\x0a\x72\x6b\x61\x7e\x9a\x3e\x8c\x42\x15\x22\x86\x78\xb7\x59\xbf\x10\xf7\x7a\x21\x10\xdc\x09\x37\xdb\xfd\x76\x73\xf7\xb8\xd8\x3d\xbd\xfc\x3d\x1e\xa3\x51\x44\x28\xb1\xf5\x33\xcf\xdc\x10\xf9\x5f\x72\x42\xa9\x28\x62\x1e\x8b\x2d\xc8\xa2\xd7\x5e\x68\x7f\x37\xcc\xc4\xca\x46\x4e\x7a\x19\x39\xd5\xda\xb6\x08\x7a\x5e\x9c\x52\x53\x36\xbf\x1d\x86\x3f\x7f\x31\x1a\xaf\x8c\xce\x38\x09\x71\x74\xb6\xe3\x0e\xd4\x68\x97\x8b\xe2\xc4\x48\x0c\x21\x71\xae\x2d\x06\xed\x8e\x29\x0f\xd7\xbe\xbb\x92\x2b\xb8\x29\x8a\x6e\xa8\x32\x65\x42\x99\x15\xd4\x37\xdf\xbe\x7d\x9b\x6a\x50\x5c\xe9\xed\x84\xfa\x18\xa1\xb1\x0f\xf7\x5c\xc2\x31\xcd\x61\x58\x72\xac\x22\x19\x45\x38\x49\x2a\xae\xa1\x6a\xc4\xfc\x0a\x1b\x29\xdf\x60\x9f\xad\xdc\x2a\x16\xd5\x3e\x0e\x68\x45\x46\xde\x6c\xa4\x7c\xc0\xfd\x65\x5d\xa6\xf2\xf7\x94\x4c\x55\xa4\x24\x17\xa4\xf3\x7a\x5a\xe3\x79\x5b\xf3\x37\x67\xe9\x8c\xbb\x17\x42\xca\xac\xbe\x0e\x86\x4b\xaa\xc7\xce\x61\x8c\x40\xfa\x91\xa1\x89\x78\x38\xa3\x08\xfe\x64\x88\xe8\x48\x1b\x14\x7b\x73\x3c\xee\x80\x77\xe7\xe9\x38\xc0\x0c\xd2\xea\xfe\xaf\xef\xfd\x6f\x86\x86\xf9\xc8\x7f\xbe\x76\xc1\xab\x48\x33\x8a\x30\x95\x63\x6a\x57\x64\x5b\xf3\xdd\x1f\x0f\xd1\xf3\x73\xcb\xca\x85\x87\x17\x69\x30\xee\xd7\x43\x51\xe4\x83\xaf\x1c\x7b\x10\x24\xa6\xfc\x7b\xd1\x45\x41\x77\xc5\xa7\x75\xde\xed\x49\x31\x90\x9e\xa4\x66\xfe\x03\xc6\x7e\x60\x0a\x44\xca\x42\x14\xf5\x7d\xca\x05\x16\x4b\xdd\xa7\xe2\x4b\xd7\x80\x29\x6b\xed\xdc\x15\x3c\x5b\xef\xbe\x7e\x99\x5c\x21\x0e\xec\x76\x94\x3f\xf0\x37\xf8\x96\x97\xa0\x9b\x8a\x8b\x0c\x90\x73\xb6\xbb\x0e\x37\xe9\x56\x7c\x9c\xa9\x8b\x14\x07\x09\x17\xd2\xd9\x54\xc5\x69\xc5\xcf\xd3\x06\x2a\x34\x7a\x75\x5c\xbe\x41\xcf\x79\x62\x8f\x12\x8f\xfb\x7d\x58\xaf\xc3\x63\xcf\x44\x54\x62\xc2\x0d\x96\x78\x2f\x4d\xf5\xe6\x2d\xcc\xa3\xbf\x54\x4c\xa4\xef\x81\xf3\xe3\x7f\x40\x6a\x52\x5c\x1d\xc9\x86\x03\x12\xc4\xa1\x9f\xa0\x3c\xb8\xdd\xb3\x8d\x3f\x68\xa6\xf6\x85\xd9\xd4\x39\x4f\x71\x48\x8d\xe8\x65\x05\xb0\xae\x0f\x83\x9a\x73\x15\x87\x2a\xc2\x61\xbc\x97\x3c\x5f\x15\x1f\x79\x56\x70\xf5\xe5\xd7\x7c\x09\x2a\x0e\x75\x84\x41\x8a\xf9\xf2\xd7\x45\x87\x1e\xfc\x03\xaf\xd1\xed\xc3\x7e\x34\xee\xa2\xd8\xa7\xb8\x12\x3d\xa7\xa0\x9e\xd3\x93\xd5\x1c\xfb\xe5\x54\x8d\x59\x18\x23\xf1\xb5\xe5\x97\x7a\xe0\x39\x7f\xed\x07\x00\x13\x12\x6d\x0f\x93\xd8\x59\x36\x55\x5d\x1c\x67\xb8\xb9\xc7\xdf\x20\x61\x01\x57\x76\xe1\x76\x42\x2d\xee\x50\x12\x93\xae\x80\x3c\xdf\xc2\x24\x0c\x13\xf3\xc4\xc3\x92\xd6\x23\xff\x89\xea\x83\x83\x04\x7a\xcc\x75\x1c\x44\xbd\x70\xda\x27\x24\x64\x2a\x16\x94\xcb\xa9\x5e\x60\x10\x7f\x19\xb7\x89\x12\xec\x31\x9d\x72\x5b\x61\x2e\xdd\x42\x1a\x0b\xc9\xa3\x61\x74\x70\xdb\xc8\xd6\x8b\xd1\x4d\x36\xce\x5c\xc6\x42\x87\x6e\x2f\xc3\xd8\x00\xe6\x0e\xe6\x67\xad\xf4\x4c\x20\xc0\xbe\x7b\xcd\x31\x00\xec\x42\x17\x93\xb6\xda\xa4\x0f\xd0\x96\x1c\x44\xa2\x62\x25\x8d\xee\xb8\x91\x81\xe1\xaf\x06\x16\x3b\xfd\x1e\x83\x21\x0b\xdc\x24\x06\x6f\x1b\xf5\x0a\xcb\x46\xbe\x75\xf3\x4f\xc7\xa0\xbb\x7c\xe2\xca\x4a\xfa\xa7\x1d\x72\x56\x31\x2f\x24\xd2\xa6\x77\x6e\xa0\x1e\xd6\x41\x2b\xe6\x45\x4a\x3b\xa3\x94\x37\x38\xd8\xa6\xf9\x7d\xe6\x09\x86\x08\xc1\x4e\x5c\x6d\xb0\x8b\x33\x4f\x18\x57\xae\xa3\x5f\x1b\x7d\x1c\xe6\x69\xa9\xc6\xce\xf2\x9c\x86\xba\x62\xbe\x67\x62\xc4\xc7\x4e\x86\xe5\x29\xff\xd1\xc5\xcd\x98\xcf\x0d\xa9\x7f\x67\x59\xae\x8a\xbc\x7b\x84\x20\x0a\xf0\x11\x4e\x1d\x93\xf8\x00\x71\xab\x58\x20\x05\xb1\x5d\xfd\x15\xd2\xf2\xcb\xa5\x2d\xdc\x3f\x06\xf1\x7c\x67\x42\x2d\x0f\xbc\xb5\x48\xa0\xbc\x28\xde\x57\x8c\xf8\x0a\x63\xbf\x96\x34\xd3\xe0\x38\x6e\x01\xaa\x9d\xf3\xbc\x18\x21\x9e\xab\xef\x6f\xbb\xac\xea\x7e\xe7\x24\x36\xf6\xaf\xf5\xa8\x41\xfd\x4f\x03\xe5\xf9\xc6\x0c\xc7\x69\xbf\x10\xa5\x18\xef\xbc\xfa\x47\xf8\x98\x75\x17\x58\x48\x23\x6a\x78\x37\x5f\x53\x87\x35\x63\x21\x18\x87\xe3\x9f\xe2\x28\x52\xf8\x58\x1a\x75\x20\x77\x34\x4a\x08\xd6\x23\x54\x37\x69\x3d\x08\x51\xb2\x28\xe1\x98\x95\x4a\x8f\xc7\xa2\xac\x3b\x62\x1e\xc5\x62\x12\x51\xea\xa8\xaf\x7f\xa7\x84\x79\x90\x78\x67\x31\x8f\x11\xc7\xfc\xe3\xfe\x66\x55\xf2\x8f\x6a\x75\xe3\x2e\xcb\x7c\x8a\x68\x44\xc9\x4b\xe3\x50\xf7\xb2\x87\xae\x45\xc0\x30\xbf\x71\xb3\x7b\xdc\x76\xa2\x10\x8a\x31\x2d\x2c\x9b\x32\xd2\x6c\xf1\xba\x86\x32\xff\x56\xb5\x1f\x6c\x58\xcc\x3e\x9a\xe7\x2c\x09\x01\x7c\x07\x2d\x2d\x07\x79\x99\xc1\x5c\x63\x22\x88\x3d\xab\x10\x8d\xe6\xf6\x6d\xd1\xfc\x92\x70\xdb\x9d\x1a\x6a\xee\x88\x85\xd0\xa8\x6d\x37\x3a\xc3\xf3\xbc\x1b\x80\x09\xdc\x3b\x88\xd8\xc3\x94\xe5\x6b\xc9\xf3\x7a\x81\x6b\xd3\x43\x7a\xb9\x10\xd8\xd6\xd2\xe7\x91\x29\x53\x2c\x5e\xb3\x91\xf0\x75\x7b\xcc\xac\xf0\x25\x70\xb5\xaf\x86\xc6\x2d\x93\x81\xa1\xcd\xdc\x67\x05\x32\x1c\xff\x00\x71\x97\xea\x1a\x73\x0b\xb9\xc2\x9a\xa1\xf9\x5d\x98\x49\x22\x83\x61\xa0\xbf\xf8\x85\x2b\xc1\xa4\x30\x42\xc8\x46\xd4\xf7\x61\x28\x3d\x6c\x5b\x40\x04\x81\x9d\x17\xdf\xa1\xac\x7a\xaf\x8e\xe9\x44\x9a\x4c\x5d\x8a\x06\xcc\x75\x1e\x64\xc5\xb4\x00\x07\x00\x5e\xa5\xaf\x29\x06\x6b\xbe\xa5\x97\x75\x05\x43\x4f\x97\x69\xc5\x30\x44\xb2\xfe\x09\x79\x3a\x46\x1f\x24\x9e\x9f\x80\x21\xc6\x5f\x6e\x9e\x37\x6b\x57\x81\xaa\x12\x2f\x48\x30\x67\x89\x50\xcf\x02\x29\x97\xdd\x11\x9a\x20\x6a\xc5\xe4\xaa\x8d\xb9\x35\xbd\xfd\xac\x7e\x96\x4a\x82\x38\x41\x3c\xda\x5f\xcf\x3d\x1e\x5c\x25\x81\x88\x92\x21\xb6\x6d\x05\x9a\x37\x99\x43\xa0\x55\x4f\xda\xa4\xde\xa6\xcb\x73\x12\x58\xde\xb7\x75\x6b\x51\x95\xa9\x34\x25\x56\xdd\x41\x85\x10\x86\xfb\x69\xd4\x70\xfe\x03\x26\x01\x10\x60\x2e\x9a\x3f\x66\xe6\x55\x09\xe1\x86\x35\xbb\x44\x02\xa4\x67\x28\x8f\x69\x55\xa1\xba\x46\x2d\x87\x64\xb9\xc3\x1d\x20\x09\x29\x41\xa6\x52\x4c\x41\xc2\x62\xb2\x72\x25\x61\x18\x18\x9e\x9d\x97\xdd\x8f\xa7\x97\x3f\xf7\x5d\x3e\x63\x40\xa5\xa1\x92\x50\x4a\xc7\x25\x67\x0b\xf8\x07\x09\xd7\x24\x22\x01\xb1\x02\x51\x77\x65\xf1\x51\x1f\x6e\x9a\xe3\x69\xd2\x4b\x31\x51\x4e\x5b\xb7\xdd\xbe\xaa\x9a\x1f\x4f\x5d\x64\x60\xb4\x46\x24\xb1\x26\x49\xd8\x85\x8d\xbe\xcc\xa8\x27\xaa\x84\x29\x29\x2c\x29\x85\x9b\xd7\xed\x83\x21\xbd\xc7\x08\x77\xf0\x5b\x30\xbb\x24\x69\x0d\x02\xf3\x06\x03\x3e\xfb\xc1\x2b\x26\x42\xa0\x43\xdc\xa5\xdc\xbe\x6d\x57\x3f\xd2\xfa\x60\xd2\x9d\x93\x8b\x81\xc2\x45\xe5\x64\x5c\xa0\x1f\x90\x0e\xf7\xc3\x24\xd1\x26\xf1\x56\x0d\x28\x71\x27\x1f\x45\x04\x31\xe2\x04\x6e\xd3\x12\xfe\x1a\x4d\x14\x11\xfb\x52\x76\xe1\xa2\xfa\xda\xca\x91\x28\x3f\x41\x26\x84\x7f\x23\x51\xe4\x80\xd1\x73\x32\x37\x5c\x73\x41\xb0\x96\xff\x3b\x94\x35\x54\xc3\x59\x01\x7e\x84\x90\xa4\x45\x76\x3a\x14\x79\xb7\xb9\x25\xc0\x0c\x16\xe1\x03\xa9\x50\xef\x79\x75\x05\x48\x93\x80\x0c\x30\x1b\xbf\x37\x3a\x28\x98\x94\xdf\x6f\x96\x4f\x2e\xd2\x91\xe8\x80\xf9\x96\x31\xe6\x5f\x85\x30\x7a\x26\x4b\x5e\xc3\x6b\x51\x4e\x1c\xa1\x44\x87\x1c\x4c\xcc\xe8\x27\x46\x96\x3f\x4f\xa0\x24\x3a\xd4\xe8\xbe\x16\xbc\x4a\xab\x55\x5a\x42\x17\xe0\x48\xb4\x14\xc8\xd4\xf6\xef\x06\x5e\x8b\x6d\x9a\x65\x7c\x59\xe4\x15\xe4\xd5\xb9\xf2\xfc\xf1\xd7\xe0\x1e\xf1\x0d\x7f\x08\xe6\x71\xbb\x7b\x8e\xff\x0c\x56\x3a\xee\x51\x8d\xbc\x7d\xdb\x63\x59\x0f\x3e\x1e\xf7\xe2\x00\x29\xdb\x72\xf8\xc0\xa0\x92\x89\x76\x5b\x4c\xe7\x84\x76\x78\xf8\x79\xb8\xef\x31\x34\x31\xff\x55\x60\xb0\xec\x09\x47\xdd\x08\xd9\xc7\x7d\x30\x2f\x64\x60\x93\x86\x6a\xe2\xb9\xa8\xd2\xae\xec\xd7\xe4\x6f\x22\xfa\xc7\x50\x5d\x41\xf1\x80\x52\xa4\xde\xc0\x5f\x1f\xe0\x58\x94\xe7\x45\x59\xf2\xf3\x80\x19\x40\xf1\x40\x9a\x7a\x6b\x53\x10\x82\xa3\x79\x5e\xbb\x5a\xf1\x00\x4c\xed\x8b\xa5\x39\x53\xd3\x30\x6b\xd7\x0c\x70\x67\x6b\xfd\xc6\x8e\x50\x7e\x2f\x27\x52\x77\xf3\x91\x24\x4e\x3c\x82\x23\xc6\x05\xab\x4b\xa3\xdb\x76\xad\x31\x45\x17\x00\x39\x94\x87\x73\x89\x3b\x48\x38\x1a\x54\x76\xc4\xa5\xe0\x5f\xbb\x0e\x44\x98\x77\x58\xd7\x87\x5b\x2e\x07\xc5\x06\x9c\xea\x04\x37\x0e\xb3\x13\xb5\x2f\x9c\xe6\x4d\xd1\x54\xdb\x21\x91\x44\xd7\x56\xa2\xa1\xd8\xe4\x0f\x4d\x0d\x3f\xdd\xcf\x61\xe2\xa9\x61\x69\xe6\x0a\xde\x07\xd9\x71\x1e\x6a\x86\xf0\x89\x26\xbf\xc9\xb8\x7c\x43\x4a\xe8\x71\x6a\xd2\x36\x8c\xfd\x04\x97\xa9\x22\x5f\xbf\x2c\x93\x84\x19\xea\xf6\xab\x38\x9f\xa1\x89\xc8\xe3\x48\xfb\x86\x2e\xb6\x35\xe4\x78\xb6\x02\x99\xa5\x39\xcc\xa3\x25\x38\xa3\x42\x1a\x79\xac\x8f\x4d\x5e\xc3\x6b\x99\xd6\xe7\x5b\xb8\x08\xf6\x8e\xc7\x31\x8b\x34\x06\x32\xfe\xf5\x6d\xbb\xeb\x40\x32\x9c\x09\x1e\x2a\x57\x2a\xf7\x02\xed\x6e\xdb\x93\xba\x4d\x96\x46\x9e\x84\x31\x7a\x94\x76\x7c\x8d\xbc\x1d\x9e\xc4\x86\x81\x2e\xb5\x44\x4f\x37\xe7\x45\xd6\x77\x72\x02\x86\x2a\x04\xe7\xe4\x46\x16\x13\x55\x7b\xc5\x39\x25\x18\x49\xb1\x18\xf4\xaa\xf5\x9a\x4f\x88\xdb\xf7\xbb\x26\x61\xec\xd9\x8d\xe2\xcb\x10\x59\x61\x0f\x8b\x08\x3c\x0b\x07\xe1\x86\x9f\xd4\x0d\x80\xc9\x26\xc1\x25\x51\x98\x50\x54\xc0\x55\xdb\xcd\xbb\x0f\xe7\xba\x70\x08\xb8\x11\x51\xde\x8d\xd6\x7e\xae\x03\x82\x29\x6a\xfe\x6a\xe5\xa2\x5c\x01\xdf\xf8\xca\x9a\xc4\x28\x42\x61\xdc\x9e\x2b\x40\x9b\x61\x04\xe3\x57\xa9\xd2\xc9\x0c\xd7\x31\x67\xae\x3a\xcc\x8d\x46\x8c\xc0\xe7\x83\x82\xa8\x41\x9f\xe8\x24\x42\x64\xda\xee\xc0\xd3\x1b\x7e\x30\x16\x63\x97\x90\xe0\x3a\x49\xb0\x02\xe6\x00\x65\x31\x9d\x2d\x5a\x86\xac\x1d\x2f\xcb\xe2\x78\x2a\x9a\x5c\xed\xf3\xe2\x63\xbf\x90\xb2\x6c\x40\xed\xd3\xf6\x9e\xe0\x44\x7d\x95\xf0\x82\x08\xb9\x5a\x11\xa5\x32\x28\xd3\x54\xc2\x23\x09\xd2\x5c\x59\x35\xa9\x67\xe7\xf8\x75\xc7\xa3\x00\xc3\x62\xff\xdd\xaf\xa0\x6e\xad\xaa\xdc\xaa\x4f\xda\xe3\xbe\x20\xc4\x86\xef\x1e\xe1\x67\xfd\xc0\x7f\xa6\xc7\xe6\x68\x2a\x3a\xba\x46\x41\x42\x24\x7a\xda\xa6\x18\x69\x05\x6f\x19\x9f\xc7\x59\x8d\xfb\x53\x10\x16\x20\xad\xda\x6a\x7d\xbb\xf8\x76\xbf\xdb\x2f\xef\x37\xb7\xb7\x5f\xba\x83\x1a\xb9\xd8\x6f\xd0\x21\x3e\x9e\xa6\xda\xd3\x4a\x10\x01\x18\xc9\x50\x20\x4d\xa8\xeb\xe9\x04\xf9\xc6\xf6\x4d\x6b\x98\x5b\x55\xe5\xf1\x59\x34\x91\x48\xcd\x39\xa3\x5c\xf9\xff\x34\x1a\x04\x15\x96\x9a\xa5\x35\x58\x57\x3d\xbc\x4d\x84\x4a\x60\x98\xe9\x03\xd2\x5d\x31\x82\xe0\x4d\xae\x10\xf1\x98\xe1\x78\x5d\xdc\xaf\xb7\xfb\xd5\x7a\xb1\xba\xdf\x74\x28\x1a\x11\x09\x9e\x08\x97\x5c\xbc\x43\x22\x22\xcb\xc7\xb0\x6d\x84\xb5\x7f\xbb\x6f\x10\xfb\x2a\xec\x8b\xe7\x2e\x71\xdb\x9f\xbf\x4a\x4c\x64\x1c\x20\x73\x2e\xbc\xf7\x78\x43\x11\x53\xce\xf9\x58\xc2\x60\x36\xd8\x24\xe2\x90\xa3\xcd\xf5\xad\x4a\xf3\xd7\xc5\xf7\xb4\xac\x1b\x9e\x6d\x31\x1c\xd4\x5d\x2b\xf1\x3c\x9b\xbc\xfe\x91\xe6\x50\x9e\x4d\x2d\x53\x6b\xc3\x9f\x5f\x50\xad\xb4\xf5\xf1\x66\xd5\xc3\x67\xe6\xea\x24\x76\x29\x98\x1f\xa2\x26\xfe\xc9\x16\x99\x2c\xd4\x34\x70\x39\x6a\x9e\x28\x86\xfb\x56\x2a\x8b\x75\x8e\x52\x6c\xfc\x15\x16\xee\x51\x79\x40\x3d\xcf\xed\x8e\x0f\xa9\xca\xd3\xd7\x43\x8d\x71\x34\xd7\x42\xc4\xa6\x12\xac\x3a\x14\x1f\xcf\x45\x91\x39\x5a\xd1\x71\xaf\x08\x69\x74\xa2\xa0\xbd\xc5\xcb\xd3\x76\xb9\x78\x81\xba\x4c\xe1\x1d\xb6\x4d\x79\xca\x9a\xee\xe3\x49\xa0\xc8\x5d\xd3\xe9\xde\xba\x3a\xe5\xb9\x50\xb6\x50\x61\x80\x11\xa9\xbc\x69\x6f\xfa\xa4\x6f\xb8\x7c\x1b\xcc\x46\x15\x82\x11\xf4\x81\x5c\xed\x51\xfa\xc3\x74\x98\x3b\xcc\x63\x4c\x78\x20\x95\xe1\x53\x7e\x0f\x5c\x59\x6d\xb4\x6a\x54\xf7\x20\x20\x8a\x51\xbf\x82\xbb\x0b\x03\x8f\x0c\xa8\xba\x10\x85\x2d\x5b\x1b\xef\x50\xa2\xf5\x5a\xac\x3d\xfb\x78\xbb\x13\x06\x9a\xbe\x99\x78\x8d\x42\xfb\x09\x2e\x17\xa6\x4c\xe0\x65\xb1\x5b\xef\xef\x17\x5b\xe7\xf7\x0a\x1d\x18\xe0\xc0\x3b\x1c\x52\x99\x81\xe3\x94\x19\xe1\x11\xae\x2a\x4a\xb5\xa7\x73\x62\x12\x3e\x8f\xf0\xd1\x53\x92\x2a\xa1\xc3\x00\xe3\x7c\xa6\x90\x67\x16\x35\x6f\x5a\x4a\x8f\x80\xc4\x04\xe4\xe3\xed\xfd\xe6\xfb\xaf\x23\xe0\xd2\x8b\x00\x99\x1c\x4e\x45\x55\xef\xfe\xfa\xdc\xcf\x95\x1e\xf3\xd1\x2b\xc5\xbd\xd8\x79\x70\xb8\x4a\x54\x87\xf4\x34\xee\x51\xe9\x7b\x56\xf7\xd2\xf2\x64\x8e\x6d\x49\xe9\xfb\xa1\x34\x50\xac\x34\xe7\xf9\xcf\x1a\x8e\xa7\xee\x50\xc4\xc3\xc8\x95\xef\x9f\x8a\x7a\xdd\x8b\xca\xb8\x16\x31\x15\x56\x44\x60\xa2\xa2\xaa\xa4\xcf\x7c\x44\x55\xb9\xf9\x64\x9c\x97\xfe\xbe\x09\xd1\x8e\x1e\xaf\x3e\x40\xf9\x32\x06\xff\x4a\x5f\x11\xa4\xf7\x4c\x2b\xac\x89\xe8\xc8\x01\x94\x0c\x02\x8a\x66\xda\xc9\x4a\x8f\xb5\x5f\x03\x23\x04\x83\x26\x11\x45\xf9\x0f\xc1\xf3\x37\xc7\xd5\xea\x0e\x01\x75\x90\x81\x9b\x7f\x7e\x5e\x88\x92\x7f\x9e\x86\x95\xc4\x23\x46\x4e\xcb\x10\x99\x2e\x4e\x27\x98\xe6\xe6\x25\x09\x62\xe4\x31\x3b\xf2\x9f\x66\x7e\x7d\xe9\x0e\x08\x5c\x22\xf1\x7d\xb7\x75\x71\xba\x2f\xfa\xef\x40\x22\x8d\x78\xd7\x2e\x48\x8c\x79\xc8\x7e\x1a\xdb\x66\xa1\xd0\xba\x0b\x67\x57\x8e\x0b\x70\xe4\xcd\xc8\x48\x70\xe8\x00\x4d\xb7\x88\xc5\xbb\x39\x9f\xf8\x34\xee\x2a\x23\x69\x44\x52\x9e\x9b\xba\x76\x90\x73\x19\x0b\x85\x6a\x0a\x35\x54\xa6\x64\xbb\xe9\xe2\xed\x92\x89\x10\x5d\xb0\xea\x50\x94\x35\xe4\x73\x08\x23\xc9\x34\xc5\xed\xfe\x79\xc8\xf1\x3a\x19\xbf\x49\xe4\xf9\x61\xaf\x15\xd9\xf5\x41\x22\x0d\x33\xbb\xa5\xde\xb0\xc1\xfa\x2b\xce\x92\x4c\x40\x68\xc0\xda\x4e\x57\x07\xd5\x7e\xcd\xbd\xbb\x18\x0f\x13\x69\x4a\xe1\x44\xd7\x33\x3c\x36\xf2\x00\xad\xdf\x9d\xe6\xaf\x46\xb6\x6d\xf2\x02\x5c\x11\x27\x5d\xbf\x4c\xeb\xf4\xbf\x90\xdf\xbb\x02\xee\x71\xf7\x71\x4d\xc0\x45\x4b\xf7\x15\xd4\xcd\x09\x13\x34\xd0\x17\xea\x4a\x41\x23\x24\xa2\xd9\x73\xa5\xec\xc6\x6b\x79\x5f\xec\x92\xe6\x3c\x02\x29\xc3\x04\xed\xce\xd5\xfa\xf6\xe5\x69\xbb\xdb\x6f\x1e\x37\xbb\xcd\xe2\xbe\x43\xfe\x3d\xfd\x78\x74\x62\x47\x4a\x4a\xc9\x71\x20\xb5\x7b\xc7\xed\x73\x3b\xf6\xeb\x3e\xa9\x21\xa5\x56\x40\x07\x52\x48\x06\x6a\x6c\xb4\xb1\x26\xa0\x03\x7b\x86\x8a\x63\x0c\x6b\x9a\x61\xb4\x9d\x09\xb4\x75\x0d\xb9\x91\x76\x87\x5c\xa1\x34\xc0\x36\x7d\x9d\x2f\x1e\xba\x5a\x4c\xd4\xfb\x4c\x52\x25\x31\x26\x1d\x9f\x9f\x67\x53\xfa\xa3\xf5\x51\x81\xc6\xa1\xd7\x7a\x14\x98\x25\x59\x61\x7d\xe0\x40\xf1\x71\xf2\xa8\xe0\x45\xf8\xf9\x5f\x0b\x9e\xe1\xee\x3c\x2d\xe3\x95\x20\x23\xd2\x53\x8a\xe1\xa4\x9c\xc1\xe0\x4a\x1d\x24\x96\x6b\x31\xcb\x50\x21\xae\x1a\x47\xdc\xa4\x26\x0c\xb3\xb8\x48\x45\xf3\xcc\xcf\xed\xae\x79\xa5\xa3\x35\x15\x4c\xbb\xc4\xf0\x0c\x38\x48\x79\xdc\x43\xf4\x1f\x22\x7c\x7b\x37\x40\x79\x52\x23\x90\x51\x3b\x16\x87\xc1\x12\xae\xfc\x40\xe1\xb4\x39\x16\xca\xd4\x76\x8f\x82\xf5\x9f\xa6\x49\x95\xaf\x7c\xd4\x8e\x59\x48\x43\x92\x7c\x1c\x92\x6c\xd9\x36\x41\xec\x23\xaa\x09\x6c\xc4\xc0\x74\xa6\x3b\xa8\x12\x1c\x12\xaa\x98\x40\x4f\xda\x23\x98\x35\x79\x29\x8a\x37\x59\x74\xcb\x93\x22\x9e\x91\x0b\x34\x5c\x6c\x9f\x18\xf7\x8a\x04\xb1\x99\xe1\xed\xd8\xfd\x13\x60\xca\xe3\xdf\xb6\x48\x10\xe1\xf4\x01\x99\x2c\x8e\xf0\x50\xbd\x76\x77\x01\x1f\x63\x9c\xcb\xc7\xdd\x54\xfd\x4f\x29\xa2\x15\x5a\x92\xa2\x39\x6f\x4f\xe9\x14\x54\xae\x42\x25\x30\x67\x63\xb9\x89\x71\x25\x72\x4e\xac\x0a\x21\x64\x86\x91\x01\xeb\x99\x7f\xbf\xab\x43\x00\x84\xe2\x8c\x4b\x79\xc6\x91\x01\x15\x91\x08\x74\x17\x2c\x72\xb5\x7e\x7d\x21\xb7\x2b\x56\x60\x5d\x7b\xc1\x49\x07\xe4\xc2\xe0\x93\xc9\x20\x4d\xf1\x3c\xa3\x47\x89\x38\x75\x05\x3c\x4f\xef\x50\x56\xad\x75\x3a\xe9\xd9\x08\xb8\xcb\x35\x19\xbd\xe1\x49\x1f\x31\x6a\x36\x0f\x54\x93\xf9\x85\x02\xda\xa4\x23\x98\x54\x58\xb1\x98\xe6\xa9\x2b\x26\x3e\x8f\x04\xe6\x66\xf7\x5e\x95\x10\x11\x46\x56\x32\x8f\x97\xb5\x15\xc7\x76\x9f\x85\x07\x9e\xf2\xad\x22\x99\x15\x0e\x5e\xc1\x91\xe7\x97\x98\xe6\x99\xe5\x45\x71\x12\xa2\x14\x8c\x6a\x8e\x27\x95\xbe\x77\x53\x8b\x87\x9e\xc9\xec\xa2\x24\xe0\x6d\x9a\xa7\x95\xdb\x0d\x95\xa4\x1c\x55\xb6\x7f\x7c\x7d\xba\x5f\x23\xf8\xd4\x08\x72\x75\xc7\x65\x88\xb1\xdb\x5d\xfb\xbc\x62\x14\xf4\x57\x52\x03\x02\x35\x30\x6a\x33\x9b\x15\x55\xca\x63\x01\x75\x4d\x30\x2a\x3f\x27\x80\xd1\xf7\x2a\x88\x88\x58\x0a\xb7\xe9\xc7\x77\x2d\x40\xd0\x8e\x43\xb9\x1d\xd3\xdf\x4e\x27\x28\x87\xe1\x75\x05\x3a\x34\x28\xd2\xea\x5b\xae\x51\xe6\x72\xf2\x54\xda\x13\x28\x0c\x63\x52\x4a\xaf\x5d\x47\x69\x4f\x52\xbf\x17\x12\xe9\xcc\x96\x4f\xf0\x11\x4a\xc7\x0c\x59\xf8\x54\xfa\x7e\x5b\x94\xb8\x00\xd7\x45\x0d\x2b\x78\x87\xac\x38\xb5\xde\xf8\x90\x94\x50\x81\x17\xc4\xbe\x81\x23\x9e\x8f\x48\x7b\x61\x2d\xc6\xd9\xe9\x06\x1e\xb5\x19\x29\xa8\x6a\x13\x26\x6e\x37\x44\x53\xf7\x72\x5b\x94\x90\xbe\xe6\xdd\x85\x85\x8f\x18\xa2\xd7\xf4\x1d\x6e\xd2\xb2\x3e\xdc\x9c\x51\x22\xc0\x1e\xf6\x35\xc5\xad\x64\x69\x43\x94\x0a\x7e\xb9\x5f\x41\x20\x02\xb4\x34\x8a\xd3\x20\x92\xec\x92\x4c\xbe\xdf\x97\x1e\xfb\xde\x80\xf3\xde\x56\x5e\x4c\x2b\xbf\x81\x84\x3e\xa2\x00\xd0\xd4\x78\xe7\x59\xaa\x5e\x9a\x0c\xac\x30\x83\x6b\x93\xc4\x04\xbd\x63\x59\x23\x93\xe8\x6d\xc6\xaf\x6c\xe3\x40\x84\x8f\xde\x69\x6b\x7c\xdd\x16\xe5\x3c\xc6\x14\xa8\xcf\x79\x37\x00\x37\xda\x8e\xd2\x4d\xd5\x15\xdb\x5d\x86\x46\xbb\x33\x01\x23\xae\xed\x2e\x76\x03\xaf\x4d\xbe\xa8\x07\xe2\x82\x0a\x42\x2a\x3d\x8b\x0c\xfb\x66\x22\x91\x7d\xb6\x79\x3c\xde\x20\xf2\x62\x69\x00\x73\x6f\x23\x75\xb6\xcd\x15\xcc\x2b\x44\x9c\xc7\x8e\xed\x3a\x47\xfb\x71\x59\x54\x75\x85\x05\x9b\xb6\x49\x42\x01\x23\x56\x5f\x0b\x95\x0d\x7c\x9a\xc9\x85\x92\x48\x61\xda\x00\x07\x45\x8f\xf1\x85\x44\x18\x76\x9c\x76\xa1\xe9\xca\xd2\x2e\x42\xbc\x90\x48\x2e\x8d\x43\xbe\xe4\x99\x4b\xfc\x00\x27\xa1\xc9\x6e\x61\xf8\xeb\x66\x1a\x59\x02\x4e\x18\x92\x33\x7c\x5f\x6f\x77\x13\x18\x3b\x48\x5f\x62\xde\xb8\x34\x16\xe4\x0a\x6a\x2e\x0f\xc7\xa9\x0c\x85\x02\x19\x2a\x24\x1e\xb7\xa8\xb2\xf4\xbf\x30\xdd\xff\x40\xf9\x09\xd2\x6a\x98\x42\x1d\x13\xc6\x7a\xd2\x4f\x39\x5c\x28\x63\x28\x50\xb1\xab\xbc\x91\x4e\x16\x7c\xdd\x9a\x92\xee\xb0\xd6\xc2\x30\x9c\x82\x5a\x58\xab\xf0\x94\x9d\xe7\xad\x32\x00\xe2\x05\x30\xa2\x40\x79\x01\x7d\xe5\x03\x00\x31\xd2\x34\xc6\x6f\x34\xb5\x14\xaf\xb0\x98\xbe\x2e\x10\x86\x01\xdf\x9c\x1f\x61\xdd\x5a\x54\x60\xd5\xf1\x86\x8b\xa0\x3f\xfd\x3c\x40\xb9\x36\x65\x5b\xbb\x43\x59\x7c\x4c\xae\xa9\x09\xc3\xc0\xa1\x5d\xcd\x0e\xbc\xcf\xc8\xfe\x6e\x84\xef\xff\xf7\xdf\x7e\x97\xd0\x1e\x65\xc8\xca\xb9\x8f\xf7\x65\x53\x55\x6f\xfc\xcc\xdb\x79\x5f\xbf\xb9\x80\x8a\xf6\xe2\x84\x79\xdd\xc7\xb9\x6f\x57\xce\x21\x20\x50\xb7\xab\x97\xdf\x85\x75\x71\xbd\xb8\x69\xce\x50\xea\x89\xb8\xa1\xd2\xbe\x47\x55\x6c\x9d\x53\x28\xf9\xc8\xaa\x77\x4d\x82\x90\xd8\x2d\x1f\xd3\x91\x1a\x33\x39\xd3\xeb\x30\x23\x80\x7b\x70\xd0\x5f\x3f\xb0\x58\x41\x4b\x26\xaa\xb4\x9f\x28\xe2\x96\x87\x66\x12\xae\xd0\x41\x10\x20\x5b\x87\xd9\x60\xb6\x3c\x7f\x6d\x8a\x61\x20\x5f\x07\x04\x90\xd3\xcc\x30\x8d\xa3\x1b\xbe\x3b\xa4\xd5\xf3\xa1\xe3\x6f\x57\x3a\x50\x12\xe9\xba\x9f\x94\xa5\x43\x76\x07\x08\x27\xf8\x74\x7b\x59\x64\xca\x09\x4c\xdb\x63\xd4\x27\xc8\x31\xba\x7c\x58\xee\xba\xdf\x02\x86\xc3\xe4\xae\xc8\x14\xe4\xb7\x19\x80\x1c\x2f\xfe\xb6\x5d\x14\x70\x5c\x7c\xef\xd3\x4c\xf0\xdc\xad\x15\x3a\x22\x01\x9a\xa7\xab\xa7\x87\xc5\xe6\x71\xbf\x5d\x3f\xaf\x5f\x16\xbb\x27\xe7\xc8\xe9\xd8\x8f\xbc\xc0\x71\xfb\xe4\x17\xe8\x73\x1d\x47\xc4\x10\x3d\xe1\xce\xb3\xc9\xdf\x8b\x54\xa6\xf9\xab\x33\x18\x66\x36\x1e\xcd\xa4\xf1\x8a\xd3\x6a\x99\x35\x83\x42\x6b\xcd\x80\x32\x6b\xd0\xf1\x0a\xa1\x08\x17\xbe\x8e\x4e\xfc\x18\xfd\x93\xfb\xf4\x08\xeb\x73\xe7\x98\xeb\x44\x85\xe6\xa3\x40\x5e\x97\xbc\x2b\x79\x75\x87\xb9\xef\xa3\xcb\xbc\x7f\x41\xe1\xc7\x55\x0f\x34\xd1\x3c\xf6\x11\x20\xd5\x7e\xad\x6a\x58\x89\xae\xb9\x62\xc8\x35\x77\x49\x57\xfd\xa9\x19\xa8\x85\x67\xf8\x03\x07\x1c\x99\x5b\x40\x3c\x6e\x6b\xc5\x06\x2b\xe0\xf5\x61\xf2\x5a\x22\x8a\x30\xde\xd0\x54\xbd\xee\xb6\x3b\xd4\x9a\x69\x48\xa4\x59\x1f\x78\x66\x52\xc3\xf5\xd7\xbe\x9e\x4b\xcb\x40\xe0\x3a\x5e\x94\xe9\x6b\xeb\xe0\x18\x3f\xda\x1d\x84\x20\xea\xc8\x9f\xdf\x8f\x7c\x3a\x63\x94\xc7\x70\x48\x6d\x96\x4f\x37\xf0\x9a\xe6\xd5\xa2\x7b\x7d\x45\x43\x9d\x74\x00\xb0\xaf\x90\x5d\x38\x37\x5a\xc5\x09\x82\xb7\x2d\xc1\x3d\xa8\xfb\x34\x7f\x1b\xe5\xec\xb4\x92\xc2\xb1\x4f\x5b\x7b\xd8\x8c\x23\xcb\x4b\x35\x34\x1b\xed\x19\x3a\x94\x18\x67\x17\x4e\x24\x00\x3c\xcf\x37\x52\x2c\xc2\xb1\x13\xb8\x4c\xd2\x2d\xc0\x60\xf6\x80\xe7\xfb\x01\x6e\x05\xc7\x42\xbe\x4d\x06\x01\x78\x3e\x95\xda\xe9\xf0\x4f\x99\x5d\x87\xef\x05\x5e\xc0\x3c\x8c\x02\x8b\xa2\x78\x7b\x29\x8a\x0e\xa4\xe2\x4c\xa2\xff\xbb\x88\x22\x0c\x5f\x01\xbc\x20\xf1\xd0\x30\xd9\x93\x7d\x51\xa6\xad\x5f\xd4\x3b\x02\xe0\x91\x58\x9a\xb7\x69\xb2\xb7\x59\xf1\x6d\xf0\x88\xee\x38\xbb\x3b\x60\xee\x08\x97\x0b\x1e\xe5\x31\xda\x6f\x69\x75\xc7\x8f\xd0\x93\xdc\x80\x17\xf2\x10\x89\x42\xab\xe6\x04\x65\x6b\x41\x2d\x5e\x4b\x18\xbb\xcc\xe0\x45\x94\xe0\xb0\x5f\xbf\x3b\x5a\xfb\xd9\x0d\x11\xbc\x08\x62\xf4\xf7\x1e\x6f\x9f\xe6\xb0\xd2\xa3\x67\x8a\x3d\x1f\xcb\x71\xd0\x0a\x2c\x72\x40\x60\xde\xfa\x3f\x5b\x6c\x83\x08\xb2\xd1\xa5\x63\xea\x1b\x01\x32\x2c\xb2\xad\xd2\xc2\x68\x10\x4c\x20\x58\xe0\xc5\x51\x88\x01\x0e\xc8\x52\x4c\xde\xc1\xf4\x38\x18\x35\x5f\x97\x5a\x78\xe4\x47\xf8\xab\xdd\x6d\xe7\xc0\x45\xe0\x71\xcf\x90\x5f\xbd\x42\x6d\xc3\x92\x93\xe3\x91\xee\x85\x6b\x1a\x97\x74\x00\x8f\x4b\x86\xa9\x8e\xff\xe9\x2b\x47\xc1\xe3\x5a\x30\x1b\x82\xfe\xf3\xef\xe5\x50\xe8\x6b\x16\x1a\x01\x9e\x20\xa6\x7c\x0a\xe9\xa7\x52\x28\xbf\xa6\xaf\x87\xfe\xdb\x09\x69\x48\xcf\x65\x71\x3c\x35\x46\x06\xe5\x0e\x72\x6f\xb0\x65\x82\x27\x89\x36\x32\xa9\xed\xf7\xdd\xd7\xd3\x52\x89\x71\xdf\x48\x16\xa0\xdb\xf3\xb0\xf8\x6b\xf3\xf0\xed\x61\x7f\xff\xf4\xf4\xbc\xbf\xe9\x65\x60\xc0\x53\x24\x44\xfc\xe2\xa1\x7d\x90\x8e\xb0\xd2\x14\xe7\x76\x98\x74\xf0\x54\x42\x51\x7a\x66\x79\x16\x50\x3e\xf3\xf3\x68\xde\x29\xa1\x30\xde\x67\xcc\x91\x5d\xb1\x85\x5c\xdd\x96\xc5\xd1\x6d\x60\xe3\xb1\x07\x41\xa4\xf8\x90\x60\x14\xc5\x8b\x86\x21\x62\xf0\x80\x72\x44\x42\xdd\x6f\x16\x8f\x77\x9f\x0e\x3a\x88\x89\x85\xdd\xfc\xac\xf7\x25\xe6\x91\x4f\xc3\xdc\x2d\x78\xba\x9d\x12\x7d\xc5\x1a\x16\x3b\x2c\xf9\x29\xad\x27\x1e\x05\x78\xda\xd7\x26\x2b\xd6\x71\x62\x2e\xba\x3a\xa2\x4e\xbd\x0e\x3c\x1d\x86\xb8\x3e\x98\x4a\x1d\xc3\xd9\x3a\x3f\x7b\x34\x48\xcc\x31\x2c\x4a\x91\xd6\xfd\x5e\x0e\xbe\xc7\x8c\xdb\xf0\x0a\xb5\xc9\xe0\x3e\xf0\x37\x28\x07\x6b\x37\xf8\x1e\x24\x18\xa6\xff\xce\x9b\x6c\x32\x46\x7d\x4f\x9b\x5d\xeb\xaf\xc0\xb5\xf6\xa9\x64\x2e\x6d\x80\x9b\x84\xd6\x69\x96\x5e\xab\x8e\x01\xdf\x8f\x02\x3a\x8a\xd3\xcf\xf2\x4f\x82\x4f\x22\x61\x68\x3a\xfa\xca\x5a\x77\x24\x26\x91\x45\x43\xdc\x14\x65\x59\x7c\x5c\x40\xb9\xc1\x27\x5c\x87\xae\xc8\xc1\xe1\x1d\x87\x3e\x33\xf8\x44\x74\xe2\x3f\x3d\x05\xff\xb0\x88\x12\x7c\x1a\x46\xb8\x60\x1e\xf9\x4f\x1b\xeb\x0a\x86\xa3\xcf\xa7\x89\x40\x0e\xc5\x97\x9b\x97\xf1\xef\xdc\x50\x37\x19\xd0\x94\x9b\x87\xe3\x8e\xa4\xda\x80\x07\x4a\xe0\xea\xbc\x2b\x44\x09\x03\x0d\xcb\x91\x88\x50\x67\xf6\x82\x1f\x12\x85\xe1\x37\xf3\xe5\xb0\x68\xeb\xb7\x6c\x03\xf0\xc3\x30\x42\x0c\x0a\xc6\x57\x2d\xeb\x9e\x7b\xdc\x30\x0a\xa5\x25\x6a\x5b\x66\x3c\x3d\x56\xa3\x05\xdf\x0f\x95\xfd\xc0\xe9\x7f\xe1\x49\xbb\x93\xa2\xc4\xc7\xcf\x33\x80\x38\x5f\xc0\xab\x46\x97\x61\xca\xf7\xa1\x67\xdd\xc2\x68\xed\xfc\x36\xe8\x33\xe0\xc4\x30\xcf\x14\x4e\xf7\x0c\xfc\x44\x70\x8c\x35\x3c\x3c\xdd\x6c\xee\x37\x8f\x7f\x76\xbf\xeb\xd8\x90\x5c\xf2\x37\xb0\x8c\xad\xd7\xca\xd4\x27\xb7\xe1\x5e\x80\x78\xaf\xb6\x83\x9f\xca\x17\x78\x87\xb2\xfe\x72\x21\xf4\xd5\xb6\x23\x88\xa9\xe9\x40\x9a\x2e\x7f\xc0\xb3\x19\x6a\x6d\xf0\x79\x02\x44\x4f\x90\x87\x8b\x12\xf8\xb4\x99\x64\x98\x03\x6e\x37\x16\xf9\x8b\x1d\xce\xe7\xed\xca\xd4\x0e\x35\x5e\x83\xa9\x4b\x18\xa5\x49\xc0\xe7\x3a\x74\x2c\x60\x5b\x59\x4c\x24\xd9\xc0\x17\x24\xc1\xec\xd8\x78\x0e\x48\xcf\x47\x54\x1d\x94\x65\x51\xee\x52\xf9\x06\x25\x56\x2d\xac\xdb\x7f\xcf\x6e\x62\xbe\x0c\x14\x8d\x7a\xb9\xd2\xf3\xf7\xad\x0d\x3a\xfd\x46\x35\x15\xf8\x32\xa2\x89\x3f\x20\xea\xbb\x81\xba\x36\x82\x1f\x68\xa3\x5e\x1d\x11\x92\x33\x5c\x49\x9f\x4a\x2e\xfb\x48\x3a\xf8\x52\xa9\x40\x75\x32\xb1\xb9\xe2\xa5\xc2\x48\x7d\x3e\x75\xfe\xc1\x97\x5a\x25\x1d\x4c\xab\x75\xc1\x66\xf7\x2d\x5f\x05\x20\x8d\x79\x83\xdd\xdc\x53\xd5\x83\xaf\x18\x43\x7d\x00\xae\xd4\x0e\xf2\x99\xb5\x77\x36\xbc\x0d\xbe\xe2\x11\x2e\xb9\x46\x49\x36\x3d\x42\xd1\x74\x5f\x00\x7c\xe5\xe9\x5e\x51\xa3\x2b\x45\xbc\xd2\x0f\x40\x12\xdf\x6c\xd3\x25\x0c\x01\xf8\xe0\x43\x18\x61\xc5\xcf\x2e\xfd\xe9\x7e\xd2\x91\x42\x60\xd7\x6a\x73\xb7\x1c\xc0\xb8\x3b\x63\xd2\x35\xe3\x01\xba\x36\xb2\xc8\x6b\x9e\xe6\x0f\x69\x8e\xeb\x61\xbb\x8d\x3e\x61\x11\xc1\x5c\xc6\x06\x7c\xad\x88\xdf\x33\xf2\x77\xa1\x2f\x5b\xc2\x7c\xf5\x76\x81\x07\x02\x93\x83\x65\xfb\xc1\x93\x68\xfc\x95\x02\x9f\xf8\x48\x8e\xf6\x0f\x16\x5a\x38\xbc\x30\x04\x7e\x94\x20\xa9\xc7\x0b\x4a\x46\xad\xeb\xc3\xae\xc0\xb0\xe8\xa1\xd3\xd7\x81\xc0\x8f\x4d\xa8\xba\x82\xfa\x76\x8a\x9f\x80\xc0\x4f\x88\x23\xdc\x76\x16\x12\x3a\x01\xc3\x69\x16\xf8\x3c\x42\x88\xed\x62\xb5\xda\xef\x36\xeb\x97\xed\x78\xd5\x0e\x7c\xc9\xd0\xea\xc2\xa4\xe3\xd6\x86\xb5\xf7\x8b\x87\x5e\xb5\x1c\x02\x5f\xc7\x8c\xba\x1b\xbd\x43\xb9\x39\x5e\x63\xc3\x6f\xdb\x4a\x2c\x28\xdd\x36\xaf\xaf\x30\x2e\xb2\x82\x20\x60\x11\x92\x05\x94\x2a\x7d\x9f\xdf\x4c\x83\x40\x19\x1a\x73\xcb\xca\x58\x1c\xdb\x99\xb8\x51\xd5\xcd\x79\x31\x31\x66\x03\xe2\x33\x44\x86\xb4\x9b\xf4\xf1\x36\xcd\x79\x2e\x5d\x65\xa5\xc3\xde\x5f\x1b\xce\xf3\xcf\x4e\xa8\x54\xd4\x65\xfc\x2f\x01\xeb\x10\x90\xd0\x13\x1c\xfd\xd8\x53\xfb\x29\xb7\xbd\x56\xb3\x6b\x90\x44\x48\xdb\xb9\x3d\x35\x75\x9e\xbe\x5d\x46\x56\x20\xa0\xa1\x8f\x70\x91\xfb\x34\x4b\x5d\xba\x1d\x02\x2a\xc3\x40\x0e\x0c\xef\xcf\xa0\x4d\xdd\x29\xcc\xb7\x6a\x34\xd2\xac\xda\x17\x38\xfb\xe1\xde\x1f\x84\x51\xa0\x1c\x0f\x98\xc1\xc4\x8e\xed\xe9\x20\x14\x46\x9c\x9e\x2b\x65\x90\x04\x93\x27\x8f\x48\x82\xc4\x2d\x7d\x40\xef\x06\xd9\xce\xae\x8c\x84\x48\x0b\x6a\x91\x45\x69\x73\x1c\xcd\xed\x20\x26\x01\x55\xbd\x56\xc3\x9f\x7f\x2f\x27\xf7\x8a\x29\x20\x6a\xfe\xd4\x64\xd9\xb0\xb6\x03\x82\x38\x14\x18\x4b\xe0\x65\xfd\x51\x94\x6f\x5b\x17\x1a\xea\x8e\x03\x51\xfd\xfa\xb3\x2c\xf2\xaa\x39\x4e\xdc\x6d\x08\x18\x21\x58\x11\x5f\xf2\x5c\x15\xc7\x4b\x43\x29\x60\xcc\x30\x66\x9a\xb2\xc7\xb3\x09\x85\xfe\xac\x4b\x7e\xb9\x0e\xb8\x33\x84\x61\xbc\x70\xd2\x60\xd6\x47\x1f\xd7\xb2\x7c\x96\x2c\x83\x20\xf1\x23\xf0\xfb\xa8\x6f\x3b\xb4\xd2\xfc\xd5\x12\xb4\x4e\x86\x62\xc2\x28\xe6\xc0\xcc\xed\x1c\x75\xce\xb5\xfb\x8c\x4f\x55\xda\x6a\xf5\xbb\xa2\x2a\x7b\x80\x7b\x06\x1f\xa4\x20\xe3\xe7\x27\xdd\x97\x2f\x43\xc0\x83\xd8\x59\x00\x5d\xc2\x07\x93\x8f\x98\x86\x1c\x96\x6a\x42\xc0\x93\x00\xcb\xfd\x4b\x3f\x1c\x81\xcd\x20\x10\x71\xe8\x8a\x32\x06\x99\x05\x03\x87\xdb\x9d\x4f\x30\x15\x1f\x80\x40\x6a\x70\xdc\x60\x43\x21\x66\x36\xe9\x39\xe5\x73\x44\xd4\x98\xba\xa3\x79\xea\x45\x08\x54\x10\xcb\x4e\x00\xfd\x1b\xf2\x7a\x0c\xe4\xec\x21\x50\x32\x31\x61\xaa\xcd\xfa\x65\x4f\xf6\x37\xdf\xfe\xde\x3c\xf6\xc7\x20\x42\x00\x43\xc6\xbb\x51\xac\x74\x82\x80\x47\x67\x3d\x5d\x20\x23\x46\xcf\x08\xd4\x33\xdd\x82\x03\xd3\x40\xb8\x50\xcb\xa3\x3c\x5a\x14\xed\xf8\x69\x81\x4a\xb0\xa5\xc9\xe9\xb1\x39\xde\x17\xf2\xed\x6f\xe0\x7d\x67\x82\x00\xcc\xc6\xdf\x41\xfd\x5c\x14\x59\xeb\x32\xd8\x2b\x4d\x2e\xa4\x3d\x8e\xbb\xc8\x07\xa4\x36\x8f\xe6\x2e\xa1\x43\xed\x68\x13\x10\x68\xd1\xfd\xce\x8c\xa8\x07\xea\xba\xdd\xfe\x8e\xaa\x1b\x04\x3a\xa1\xdc\x31\xb9\x17\x79\x35\x74\x1f\x88\x17\x51\x1c\x3d\xe6\x4b\x9b\xd8\xf4\x7c\x2e\x0f\x88\x27\x15\x8f\x07\x06\x15\x7e\xa1\xc5\x3b\x4f\xb3\x81\xe5\x42\xfc\x88\x8b\xbe\x33\x11\xc4\x3e\x99\xe3\x24\xe0\x86\x1b\x19\x01\x2c\xe8\x5e\x4c\x18\x2e\x27\x37\x26\x91\xf1\x58\x5b\xcb\x0b\x40\x55\xdb\x34\x97\x70\xcf\xab\xfa\xeb\xb0\x6a\xcc\x35\x06\x9f\x59\xb3\x6f\x7f\x2c\x54\x93\x15\xfb\x77\xf4\xb9\x86\x36\x63\xf7\xc7\x9e\x44\x99\x49\x2e\xae\x20\xbb\x4b\xf5\x78\x6f\x24\x54\x69\xc4\x1a\x14\x27\xc8\xd1\x70\x75\x2b\x1a\x09\xfd\x08\x59\xc3\xdc\xba\x6b\xd0\x75\xd7\x16\x22\x12\xb2\x04\xd7\xf9\xd5\x62\x73\xff\xf7\xfe\xf6\xdb\xe3\x6a\xbb\x7f\x59\xdf\xaf\xfb\x50\x0b\x89\x22\x89\xa9\xa9\xa2\xc1\x82\xa4\x7f\x71\xf9\x76\x2a\x5c\x58\xda\xb6\x61\x9e\x91\xeb\xe2\x4a\x39\x76\x9c\x6b\x18\x48\x20\x8c\xc5\x31\x75\xc1\x51\x33\x5a\x8a\x72\x73\x3c\x65\x93\x6e\x63\x89\x67\x28\x18\xf2\x77\x74\xc5\xc7\x57\x49\x84\x09\xa1\x3b\x2e\xf5\xbd\xef\x1e\x86\x7b\x14\x07\x85\x32\x90\x78\xc9\xab\xc3\x68\x80\xf1\x80\x28\xcb\xaa\x01\xed\x7a\x3d\xe9\x1c\xf6\xbf\xff\xe7\xcc\xf6\xe1\xff\xb9\x93\x93\x04\x13\xff\x86\x47\xdf\x20\x0d\x47\x98\x75\x20\x5c\x44\xbe\x72\x28\x91\xa1\x65\x61\x8f\x8b\xd8\xc3\x54\xf9\xb1\xc8\xeb\x03\x65\x93\x82\x09\x20\x42\x1a\x9d\x01\x14\x10\xbe\x5f\x74\x21\x23\x22\x80\x20\x39\xcf\x0e\x39\x5a\x1d\xc2\xa4\x43\x59\xdc\x16\x33\x75\xbf\x40\x24\xf3\x30\x5e\x70\x53\xd4\xa7\xf3\xaf\x12\xd4\x40\x64\x62\x38\x45\x4e\x56\x7a\xbb\xaa\x9a\x2b\xe6\x1b\x51\x41\x80\x59\x0a\x0d\x70\x9b\xfe\xec\x5f\x40\x09\x53\x44\x8a\x1d\xf0\xe8\xb4\x04\x80\x40\xc2\x31\xe4\x85\xe1\x96\x07\x43\x05\x3f\xb1\x53\x89\x8e\x09\x2e\xce\xbb\x03\x20\x8f\x82\xfb\x59\x31\xe7\xa4\x6f\x8b\x2c\x9d\x58\x77\xd4\x8b\x85\xb2\xaa\x98\x36\xda\xf1\xc0\x8d\xc9\x65\x2f\x40\x7d\x1a\x7a\xb6\xd8\x0a\xbd\xfc\x34\x7f\x35\x14\x6c\xe3\x0b\xf9\xb1\x67\xb5\xbb\xf1\xa1\xc2\xee\x74\x69\xf4\x72\xb9\x52\x5f\xd3\xaa\x1e\x14\xd1\x8d\x59\xa8\x6c\xf3\xc0\xd3\x8e\xac\x0d\xf7\xf4\x17\xa8\xda\x11\x3c\x88\x67\x5b\xea\xba\xee\x84\x04\xa4\xe1\xa2\x2d\xde\x53\x85\xb5\xd5\x4d\xf7\xec\x24\x0c\xd1\xd4\xc4\x04\xbf\x29\x93\x4a\xa7\x01\x23\x4a\x98\x67\x65\x9a\x50\xad\x77\x7a\x10\x60\xa8\xb8\xb7\x03\x3e\x2c\x15\x06\x4a\x54\x17\x17\xfb\x56\x01\x8a\x80\xdc\xa4\xf5\x91\x57\x6f\x93\x2b\xd1\x44\xea\x64\x30\xed\x46\xf6\x16\x8d\x68\x82\x43\xfb\xbe\xe8\xeb\x41\x46\x22\x76\x63\xc6\x3e\xa0\x51\x64\x12\xce\x23\x82\xe5\xa0\xbb\x1c\x0b\x10\x2f\x70\xca\x40\xa1\x42\xed\xe4\x6b\xc5\x24\x46\xe3\xe4\xbd\xc8\x9a\x23\xf2\x58\xd1\x2f\xdd\xa1\x04\x61\x5e\xfb\x12\x74\x93\x55\x87\x5b\x04\xad\x5c\xe8\xab\x03\x8d\x23\x70\xd2\xfa\x35\xe4\xa3\x65\x96\xc6\x89\x92\x4e\x76\xff\x50\x9c\xa6\x67\xca\x00\x61\x8a\xf0\x5e\x64\xef\x70\x73\x5e\xd4\xd6\x3a\x1c\x3c\xa0\x8c\x23\xc3\x85\xd3\xe1\x0c\x6d\x0f\xf4\x6d\x92\x48\x21\x6e\xe0\xfb\x66\xb9\x36\xe4\xf5\x9b\xe5\xd3\x7e\xb3\xdd\xdf\x2e\xfe\x74\x8b\x30\x4d\x18\xd1\xd6\xb9\xdb\x62\x4a\xd7\xa0\x9f\x27\xb7\xe3\x14\x0c\x67\x31\xc8\xc3\xf7\xa2\x86\xc7\xe6\x78\x5b\x94\xbf\x25\x4d\x06\x94\x83\xc2\x7d\xf7\x8c\x82\xc2\x66\x19\x9f\x0a\x85\x00\x15\x9e\xc0\xb0\x2f\x37\x5e\x41\x30\x76\x0b\xa8\xf0\x3d\xc4\x29\x60\xa0\x6d\xbd\xfb\x3a\x00\x11\x01\x15\x8c\x38\xad\x88\x75\x55\xff\x09\x67\x04\x7f\x3c\x4e\xdf\x42\x12\x8e\xc6\xc1\x53\xd9\x6e\xfd\x4e\xbf\x1a\x96\x07\xde\x39\xc4\x54\x85\x09\xc6\xdf\x9e\xbf\x2e\xb6\x6b\xdf\xd4\x57\x0f\x40\x11\x40\x15\x08\x84\xee\x6c\xbf\x6e\x9c\x6b\x4a\xc1\xf3\xd0\x8b\x4e\xab\x8d\x2c\x6e\xd3\xbc\x3a\x74\x6b\x16\x6d\xbf\x95\x70\xe6\x1e\xf6\x6d\xe2\x29\x7e\xee\x5e\x0c\x42\x85\xb6\xe5\x5e\xa4\x6a\xfd\xb2\x0c\xbc\xdf\x33\xd3\x43\xcf\xa3\x88\xdf\xdd\xb7\x9e\x17\xe6\xa2\xab\x67\xde\x97\x49\x41\xe8\xf9\x0c\x49\x67\x3a\x5d\xf3\x59\xde\x79\x08\xfd\xd0\x04\xfa\xc0\x70\x55\x1a\x8a\x48\x77\x4c\x7a\x9e\x93\xfd\xe4\x46\x95\x6c\xea\x8e\x86\x41\x90\x08\x6f\xc0\xf0\xf8\x65\x66\xdd\x0a\x83\x88\xa0\x46\xbb\xb2\x42\x31\x2e\x76\xfc\x0c\xa5\x65\x61\xb5\x0d\x49\x18\x81\xb4\x29\x27\x5c\xe1\xaa\xee\x48\xa4\xb1\xc6\xa2\xe4\x75\xaa\xcf\x0f\x43\xfe\x82\xd9\x71\x17\x92\x38\x42\x6e\xe6\xf7\xde\x5c\x0d\x09\xe7\x68\x4f\xc8\x22\xcf\x41\x5e\xd4\x72\x43\x48\x84\x61\x7f\x38\x95\x85\x6a\x24\xa8\x55\xca\x8f\x45\xde\xae\x1f\xdd\x35\xa8\xef\x23\xdc\x05\x95\xe8\xa6\x88\x1a\x08\x69\xa0\x2d\x8d\xa2\x6e\x72\x65\x10\xdf\xd3\xbb\x50\x62\x18\xbe\xda\x59\xc7\xf3\x9a\x2f\x33\xde\x5c\xb4\xe1\x8c\x59\xa0\xa5\xe1\x87\x68\x77\x9d\xd5\x45\xb6\x2c\xa4\x82\xc5\xc1\xc0\x69\x47\x44\xcd\x8c\x00\x19\x84\x54\xf9\xda\xec\x05\x4d\x0e\x98\xa3\x39\x14\x59\xbb\xd6\xce\x4f\xdc\x30\xa4\xc2\xf0\x69\x0d\xc5\x81\x67\x89\xf8\x46\xdf\x3a\x62\x89\x70\xe4\x40\xa9\x42\x62\xb3\xf9\xeb\x47\x3a\x34\xfa\x1f\x0d\x2f\x15\x2f\x57\x85\x6c\x8e\x90\xd7\xc5\x24\x42\x3a\x8e\x75\x86\x8c\x44\x89\x1e\x08\x37\x0f\x68\x36\xba\x16\xca\x60\x28\xd6\x8f\xde\x2c\x43\x02\x84\x2c\xe6\x4e\x5d\x6d\x6f\x0b\xff\xf7\xbc\x14\x69\x5d\xed\x4f\x50\xee\xe1\x2a\xcb\x07\x84\x4c\x79\xae\xa0\xb2\xaf\x7b\xbd\xe3\x35\x7c\xf0\xf3\xe4\x41\x92\x18\xd0\x08\x7e\x2e\x07\x88\xa8\x59\xc7\x25\xe4\x91\x44\xe0\xc5\x09\xc0\xa5\xc9\x43\xce\x39\x56\x6c\xa5\x79\x5a\x6f\x64\xf1\xd2\x74\x56\x47\xc8\xb9\xd6\x8e\x2f\x07\xb2\x2c\xcd\x5f\x37\x35\x1c\x6f\xce\x4f\xe2\xdf\x1b\x35\xac\x89\x82\x50\x7a\x26\x41\x70\x30\xdc\xe4\x93\x47\x94\x11\x47\x4c\xfa\xbe\xdb\xc1\x8b\x69\x0b\x10\x34\x1e\x06\x85\xa6\xa8\xd0\xe1\xce\x16\x2a\x2f\x31\xd5\xc1\x85\x82\x53\x91\x22\x13\xc7\x64\xc0\x2a\x2a\x30\xee\xef\x36\x93\xd6\xa2\x6a\xf7\xcf\xdb\x02\xb3\xdb\xd3\xaf\x09\x24\xc2\x10\xfb\x6e\xf9\xf5\x97\x65\x4d\x10\x02\x35\x99\x4b\x03\x60\x59\xe4\x6a\x6d\x92\x84\x33\x0c\xb1\xc3\x20\xea\xe4\x1b\x6b\x19\x63\x99\x3d\x57\xaa\x9d\x4e\xc3\x02\x42\xeb\x4e\x75\xdd\xab\x15\x57\xb4\x67\x12\xeb\x0c\xa0\xb1\xe2\x03\x84\x5a\x0b\x4c\xbe\x1c\x78\x75\x70\x54\x2e\x23\xf7\xcc\xfd\x99\xb1\x9d\x23\x4f\x01\xb2\xbe\x96\x69\xfe\x06\xe2\x6c\xc9\x18\x20\x0a\x3c\xa3\xcb\x66\x4a\x23\x3a\x8d\x16\x88\x02\xad\xc0\xa6\xb1\x17\xb5\xa5\x92\x6a\xcd\x98\xcd\x6a\xfc\x31\x22\x4a\x22\x04\x2e\x19\x72\x83\x4b\x32\x59\x88\x68\xcc\x70\x0f\xe8\x39\xa9\xfe\x5f\x6b\x4f\xff\x98\xdc\x52\x6b\xcf\x42\xf2\x14\x98\xc4\xc9\x27\xca\x6d\x10\x85\x21\x45\x14\x18\x57\xed\x7e\xd0\x94\xd0\x0e\xf5\x71\xed\x31\x44\x61\xbb\x8f\xa2\x60\xcf\xcd\x76\x26\xe0\x19\x45\x81\xd4\xde\xa5\xde\x74\xd4\x1d\xd6\x68\x7d\x16\x4a\xb5\xbb\x8e\x0d\xef\x4c\x2e\x11\x01\x06\x66\x9a\x0a\x4a\x5b\x97\x31\x6e\x10\x4b\xed\x62\x21\x3f\xf8\x2b\x94\xa0\x7e\x40\x3a\x8e\x74\x47\xb1\xa6\x08\x45\x77\xda\xc0\xbd\xe4\xdc\xfc\xc2\x10\x31\xca\xd0\x80\x3f\xf2\xaa\x7a\x2c\xea\x01\x90\xdf\xb9\x8e\x11\x8b\x7c\x03\xda\x32\x9c\xe1\xad\x85\xb4\x30\xac\xf8\x93\x8f\xcd\xe2\x10\xd5\x1f\xda\x4d\x49\xf2\xec\x11\x30\x78\x39\x79\x0b\x26\x03\xec\x29\x8d\xd8\xf3\xe7\x0b\x24\x3e\x44\x49\xcc\x50\x90\xed\x66\xb9\x73\x26\x50\x94\x30\x8a\x66\x4c\xa7\x01\x65\xcc\xf8\x4f\x3f\x6c\xc2\x12\x13\x12\x72\x62\xd2\xbb\xc7\xee\x72\xca\x8f\x84\x35\x03\x76\xc5\x36\x4b\x25\xdc\x10\x67\xbe\x47\x1c\x08\x2e\x09\x22\x55\x5f\x66\xeb\x6d\x6d\x3b\xe1\x71\x9b\x59\x3a\xf6\x0c\xc2\x5b\xa8\xeb\x34\x7f\xad\xdc\xec\x9b\x7f\x36\x11\x32\xc4\xbe\x5a\xb6\x50\xfe\xd3\x6d\xf4\xec\x7f\xfd\x30\x76\x3d\x2f\x24\xc1\x2f\xfe\xf4\x36\xc2\x2d\x45\xd2\xa3\x18\x09\x48\x65\xd1\x91\x5d\xfb\xdd\xc1\x50\x27\xfd\xa5\x5b\x3b\x77\xf2\x05\x24\x10\x9c\x71\x66\x0d\x7b\x84\x8f\x49\xff\x2b\x5f\x81\x35\x77\xef\x51\x94\x74\x44\x0d\x05\x91\x22\x1c\xcd\xe1\xa3\x61\x21\x1c\x54\xcf\x40\xa4\xb4\x54\x03\xb6\x9e\x4f\x53\x11\x11\xf8\x82\x58\xfd\xb1\x6d\x23\xfe\x0d\x72\x02\x5b\x88\x80\x6a\x6c\xd0\x9a\xdb\x26\x58\x61\x10\x0f\xe3\xf7\xd1\x81\xaf\x5d\xa8\x17\xc9\x8f\x60\x26\x91\xd5\xb5\x35\xa0\xae\x57\x7e\x84\x6e\x4f\xb2\x0f\x1f\x7b\x2c\xf0\x0c\x20\xb9\xf5\x21\x1c\xa7\x86\x3b\xc8\x85\x6f\xd7\xec\xb5\xcd\x40\xec\x8a\x9b\xe6\x92\xd9\x72\x74\xc3\xd8\xd3\xa6\x1e\x29\x3d\x1e\x0d\x73\xb0\xad\x12\xb6\x87\x7d\xc2\xb1\x4c\xb6\xb5\x12\x10\xfe\xc4\x6b\x30\xe0\x11\xa7\x0d\x38\x3f\xb8\x63\x9f\x9a\x18\x46\x89\x99\xb5\x61\xe9\x55\xb5\x2b\x76\x07\xb0\x18\x3b\x67\x55\xc6\x01\x61\xda\x77\xa2\x71\xe5\x91\x67\x2f\x45\x71\x7c\xe0\x3f\xc7\xdf\x3e\xa6\x3e\x27\x66\x61\xcf\xa1\xe4\x35\xb4\x3b\xe6\x16\x64\x09\xf5\x97\xb9\x29\x10\xd3\xd8\x93\x36\x93\x75\xdb\x64\xd9\x58\x05\xe4\x4a\x97\x84\xb1\x8f\xd9\x64\x6d\xeb\xab\x8c\x4b\x30\x93\x87\xa6\xdd\x09\x3c\x80\x5e\x54\x7f\x91\xab\xbb\x2e\x70\x18\xb3\xd0\xc3\x7c\xfc\xd2\x95\x72\x4d\x63\x23\x31\x8b\xa5\x34\xa4\xf9\xa0\xd2\xe9\x18\x8b\x93\x20\x24\x51\x17\x64\xbd\xcb\x0a\x81\x95\x6c\xad\xe9\xd7\x23\xd0\xba\x01\x3c\x97\x53\x8d\x13\xc2\x8c\x53\xd1\x33\xf8\xdc\x5a\xb2\x3a\xf7\x94\x49\x12\x39\x02\xc2\x9b\xa2\xc8\x6e\x53\xc8\x94\xdb\x66\x63\x1e\x28\x6a\x20\xae\x9b\x1c\x89\x69\x2e\xa4\xaf\x20\xe6\x49\x84\x5b\xf4\x7e\xc8\xdd\xd8\xe4\xf5\xf9\x12\xbd\x0b\xb1\x08\x13\x0c\x46\x7d\xe5\x99\x4b\xb3\xc6\x82\x01\xd6\xc1\x6e\x33\x48\x4f\x79\x5a\x76\xbf\x27\x1a\xe3\x91\x07\x5e\x21\x92\xfa\xbe\xa8\x6b\x28\x4d\x32\xe8\xc7\x34\xcc\x1e\x0b\xc5\x8d\xfe\xb8\x72\xc4\xb3\xed\xb3\xb6\x3b\xe6\x97\xa1\xbe\xc6\x85\x73\x39\xbe\x8a\xf4\x34\xf3\xba\x92\xb3\x65\x71\x3a\x63\x76\x4b\x15\x1f\x5d\x87\x49\xdf\xe8\xef\x38\x98\xea\x70\xfd\x8b\x65\xa8\x02\x31\x2a\x1f\x59\x1f\x4f\xf5\x79\xfd\x1f\xfc\x13\x84\x51\xd7\x10\x12\x84\xf4\x20\x5c\x7c\x2f\xda\x77\x1a\x98\x31\xb1\xa2\x09\xae\x84\x8e\x36\x60\x50\xbc\x0b\x31\x08\x89\xd8\x8d\x63\x9a\xb7\xce\xb3\xfb\x59\x07\x46\xd0\x71\x85\xb2\xe2\x15\x5c\x16\x8b\x8d\xbf\x85\x8e\xc3\xa8\x83\xf0\xe0\xd7\xfd\x96\x77\x70\x5c\x60\x9e\xaf\xf0\xbb\xd6\x26\x1a\x3e\x8c\x83\x8e\x2f\xc4\x3c\xc5\x10\xe8\x6a\x38\x02\xb6\x8b\x7b\xe7\x6d\x30\x3f\x32\xb4\x20\x27\x7e\xbe\x2d\xca\xbf\x8b\xa6\xbc\xcb\x78\xbb\xd8\x4c\xc0\xec\xc0\x88\x67\x6c\x8c\x0a\xea\x75\xfe\x9a\xe6\x13\x63\x8c\x91\x90\xe2\x3d\xcc\x20\x7e\x7a\xba\x9b\x7f\x29\x46\xb8\x46\x33\xc3\xa6\x36\x27\xca\x20\x57\xce\x51\x09\x7e\x34\x83\xb6\x7b\x6e\x9c\x16\x27\x30\xea\x05\x98\x7a\xbf\x7f\x58\x2d\xba\xdf\x98\xc4\x60\xf4\x23\x14\x37\xe9\x90\xa9\x09\x58\xe8\x05\xa6\xe2\xfd\xc2\x6f\xa4\x83\x22\x23\x60\x61\x14\x32\xe6\xb0\x35\xa6\xa9\xda\xa5\x47\x30\xfa\xf2\x53\xba\x24\x60\x21\x13\x2e\x1d\x7a\x53\xa6\xea\xd5\x2d\xc8\x45\x59\x5d\x8a\x86\x01\x8b\x62\x0f\x35\x6a\x2d\x10\x72\x88\xb9\x64\x91\x88\x08\xd8\xb4\x35\x16\x31\x04\x33\x99\x76\x16\x81\x44\x7b\x49\x15\x36\x45\x66\xb0\xde\xf6\x68\xec\x31\xe4\x26\x2d\x91\xd0\xf0\x9f\xfb\x5d\x77\x80\x1a\xcc\xd0\x3f\x69\x2e\xd7\x99\xe1\xaa\xb5\x87\x58\x2c\x1d\x54\xb2\x75\x2c\x1e\x8a\x1c\x26\x4e\x23\x63\xd6\xeb\x73\xec\x5a\xeb\x52\x06\xde\xa8\x7f\x99\xa4\x9c\x0e\xe4\x8a\x1f\xda\x71\x32\x21\x1c\x19\x5f\x33\x21\x14\xc9\xa2\x9a\x32\x9d\xbc\x62\x42\x09\x12\xb6\x54\x08\x7a\x73\x67\x0f\xbf\x12\xa7\xdc\xc5\x2a\x5d\x5d\xd9\x73\x99\xe6\x32\x3d\x4d\xa8\x00\x81\x09\x62\x04\x10\x5b\xc3\x63\xc7\x9d\x1f\xcb\x84\xf6\xd0\xe0\xb7\xd2\xbd\x4f\x7a\x2a\xd4\x33\x7e\x24\xe9\x49\x8c\xb9\xef\x8f\x69\x0e\x5c\x64\x63\x44\x0e\x93\x3c\xc6\x15\xce\x59\x9a\xcb\xc6\xaa\x27\xa4\xaf\x87\xa9\x49\xce\x14\xf7\xfc\xc4\xb1\xc1\xa4\x33\xfa\x27\xc0\x14\xd0\xb8\x63\xc7\x34\xd5\xaf\x9f\xa2\xc9\x19\x68\x0f\x13\x68\xd5\xb9\xaa\xe1\xf8\x94\x4f\x93\xff\x4c\x7b\x1c\x19\x11\x65\x71\x3c\x16\xf9\x58\x43\x1c\x12\x5f\x1b\xbd\x16\xb3\x9f\xdd\x70\x35\xe3\xae\x24\x01\x31\x18\x23\x23\x6f\x32\x22\x1d\x75\x2d\xe2\x04\xf5\x07\xcd\x26\x33\x22\xb0\x86\x24\x48\x22\xb4\x85\x50\x85\x15\x31\xe9\xd3\xc8\x7d\x12\x80\x88\x94\xad\x2a\x7b\x38\xcf\x48\x5d\x41\x42\x28\x45\xd3\xc8\xd8\xa1\xcf\x65\x71\x2c\x26\xba\xd8\xf3\x8c\x54\xf6\x74\xea\x69\x0c\x1f\x2d\xd7\xf7\xf7\xfb\xc5\x6a\xb5\xdf\x3e\x2f\xba\x08\x4c\x42\x59\x84\x05\xe6\x8b\xf2\x5f\x45\x73\x85\x8e\x10\x12\xca\x8d\x02\xee\xa9\x2c\x0a\x3d\x9c\x04\x49\x08\x7e\xe0\x18\x5c\xb1\x38\x68\x88\x10\xb7\x6d\x22\x3f\x30\x6b\xb7\x1d\x2a\x63\xf2\xd6\xd9\xd1\x97\x44\x09\x61\xc6\xdf\xaa\xe5\x01\xdd\xbc\x34\x7f\xbd\x49\x55\xf5\xa5\x2f\x95\x74\x03\x3e\x89\x03\x43\xc7\x97\x56\xdb\x13\xff\xc8\xd3\xfc\x75\x61\x78\xc4\xe6\xc1\x5d\x49\x1c\x6a\x1c\x6b\xa6\x72\x1f\x25\x57\xd7\xb9\x5a\x4d\xc0\x87\x97\xdd\x10\x33\xc3\x8f\xb3\x78\x2d\x53\x0c\x57\xbb\x58\xd9\xc4\x0d\x4e\x62\xa9\x95\x2d\xf7\x93\x30\x0b\x64\x9e\x5e\x19\x08\x82\xa1\xde\xad\x6d\xbb\x68\xea\x03\xe4\x75\x2a\x7f\xad\xa4\x0f\x49\xac\x79\x6c\xb9\x31\xd7\xbc\xcc\xce\x9d\x0a\x7f\x5e\x57\x17\x0a\x89\xff\x6b\x8a\x4d\xe7\xa2\x2e\xce\x93\x4d\x98\x66\xbe\xc1\x9e\x18\xf9\xca\xdd\x54\x94\x13\x92\x24\xd4\x48\xe3\x22\x55\xf7\x4b\x6c\xc0\x5e\x9b\xe7\x87\x01\xb4\x2d\x49\x04\x61\x8e\x56\xa3\x48\xf3\x11\x5c\x98\xba\x36\x3a\xc4\x30\x09\x06\xe7\x47\x5a\x88\xb6\x01\x4f\x4c\xe5\x38\x6a\xbb\xd5\x4d\x09\x53\xe2\xc7\xf1\x78\xe0\x3c\x70\x84\x72\xf6\x7e\xed\x0c\xfc\x89\x27\xda\x26\x22\x0a\x5c\x55\xd4\xb6\x11\x55\xaa\xce\x93\x59\x27\x85\xc0\x52\x79\xe7\x5f\x18\xf1\xd8\xb9\xa8\x7a\x22\xa5\xc0\x82\xf0\x9b\x42\x14\x07\x67\x48\x26\xca\x0b\x1c\xbe\xa5\x0b\xb2\xff\xb9\x1e\x42\x0e\x5d\xc3\x30\xe2\xc1\x00\xe4\xb0\xee\xf6\xb6\x04\x42\x8a\xf5\xbf\x56\x79\xa0\x63\x18\x9e\xa2\x59\x12\x90\x80\x8b\xf5\x11\x6f\xb0\xc9\x71\x1c\x75\x57\xd1\x09\xfa\x40\xff\x2e\xd2\x7c\xff\x5e\xd4\xfd\x02\xa5\x3d\xe6\x47\x33\xa8\xc1\xf1\x03\xea\x44\x33\x43\x10\xf8\x90\xe6\x69\xeb\x13\x01\x97\x7d\x6e\x25\xd1\xc2\x03\x9b\x9e\x30\x71\xf6\x2b\xca\x55\xd7\xc9\x41\xba\x6c\x76\xa2\x95\x8f\x51\xc9\x2c\x95\x90\x57\x70\x01\xb7\x37\xcd\xb8\xe7\x31\x44\x27\xa1\xa9\x2a\x79\x76\xea\xbe\x2c\xf7\x68\x18\x05\x3d\x70\xea\xa5\x47\x75\xf5\xa7\xfb\x41\x88\x98\x96\xd7\xb4\xcc\x36\xca\x31\xad\x4d\xdb\x44\xb6\x50\x6b\x10\xd0\x9f\xc3\x7e\x73\x3f\xe6\xa6\xac\x88\x6b\xd8\x1f\x9b\x79\x66\x12\xe0\xbe\xa6\x98\x4f\x5c\x7d\x5f\x0e\x97\x50\x1e\x04\x31\x5a\xca\xad\x4f\xb6\x2b\xf9\x3b\x64\xf7\x3c\xef\x5e\x87\xf8\x31\xb2\x8c\x6c\xbf\x3d\x2e\x9f\x3a\x08\x12\x27\xb1\x8c\x4c\xbc\xf3\x54\x54\x13\x4f\x8e\x53\x3f\x40\xc0\xdc\x7e\xb6\xdc\x0f\x38\x4d\x0c\x0d\xa5\x09\x7d\xcc\x65\x94\x79\xe8\xfb\x98\x7a\x55\xd6\x7c\x37\xa0\x19\xcb\xc6\xbe\x45\x19\xe8\x76\xe1\xbb\x05\xd8\xe4\x8b\xba\x2e\xa0\x3e\x3c\xe3\xca\x3e\xb9\x55\x08\x0a\xa9\xa8\x4f\xfc\xbc\x2b\x14\x3f\x8f\x55\x58\x26\x3d\x14\x45\x01\x36\x3e\x14\x4d\xf9\x5c\xb8\xd5\x94\xc7\x84\x08\x9b\xa6\x39\x9e\x47\xef\x33\x39\x3f\xe6\xbe\xd3\xbb\x5c\x1f\x4f\x59\x71\xbe\xa2\xd4\x01\x3c\x96\x0c\xd1\x5f\x3c\x2d\x57\x06\xea\x7d\xad\x21\x18\x35\xae\xd6\x85\x72\x86\xde\x22\x57\xa6\x22\xa9\x9b\x02\x9c\xf9\x26\x6d\xee\x54\xb8\x8a\x37\x38\x16\x26\x1d\xed\x5a\x40\xc8\x3b\xe7\x17\x5f\x62\x93\x5b\xee\x41\x9e\xed\x5d\xab\x04\xa8\x36\xa6\xee\xc6\x5c\xe9\x05\x4e\x45\xef\xa9\xdb\xc5\xdb\x36\xe6\xd2\x47\x0c\xa6\x59\x5e\x16\x4a\x5d\xc3\x51\x71\xae\x14\xd6\x3f\xed\xb9\x52\x63\x06\x79\xd7\x40\x53\xc9\x86\x82\xb4\x53\x08\x06\xe7\xda\x3c\x3f\x37\x50\xc6\x3d\x82\x3f\xf6\x3d\xff\x10\x70\x41\x0c\xf3\x4a\xdb\x07\x16\xf0\xf8\x4b\x4d\x2e\x77\x2a\x0f\x22\x6b\x8f\x1b\x31\x8c\xba\xf7\x29\x46\x78\x42\x2e\x14\x17\x7d\x18\x02\x01\xf3\xe0\x76\x93\xff\xfd\xbf\x3f\x26\x31\x59\x2e\x40\x6b\x70\xb8\x2f\x53\x1b\x39\x8b\xa6\xb5\xcd\x65\xc4\x1d\x0b\xdd\x32\x4b\x21\xaf\x17\xf5\x48\x2d\xce\x35\x8b\xb9\x37\xae\x66\x5f\xe4\x45\xbb\xf0\x0e\xa3\x88\x17\xab\xdd\xf8\x4e\x60\x2a\x95\xdb\xa1\xfa\x9f\x26\x3d\x8d\x23\xb4\xae\x91\x8e\x30\x77\x7c\xf3\xe7\x78\xc5\x50\xc4\xa0\xf8\x4f\xfc\x0c\xa6\x12\xf6\x19\xca\xe7\x4e\x70\x10\xb8\xe2\x14\x93\x73\x95\xd5\xf9\x40\x13\xa4\xba\x39\x3f\xf3\xeb\x53\x02\x02\xbb\xca\xb7\x9f\xef\x33\xcf\x80\x43\x4c\x0c\x1a\x07\x5f\x68\x57\xe0\x5b\x8f\xde\x0e\xc0\x20\x98\x91\xdb\xbc\x35\x43\x8c\x02\xe4\x97\xcb\x05\x9f\xeb\x84\x5a\x12\x71\x59\xe4\x6a\xd5\x40\x4f\x87\x09\x5c\x8b\xae\xa4\x6d\xc9\x4f\x9b\xfc\x07\xa4\xdd\x21\xeb\x2f\x0c\x8a\x57\x27\x32\x81\x20\xbc\x50\xa1\x1b\xff\x9e\xc2\xc7\xac\x54\x3a\x08\x8f\x1b\xd6\x69\x63\x5c\xaf\x40\x5c\xc5\xe7\xda\x13\x7c\x0a\x18\x53\x7e\x28\x72\xe5\x26\xb7\xf0\x43\x8d\x21\x74\x34\x60\xcc\x12\x87\xf8\xeb\xf6\xa5\x3b\x1e\xc5\x89\x47\x27\xfc\xc4\x28\x38\x9a\x55\xd8\xa6\x2e\x2f\xe3\xd0\x22\x60\x26\x24\x09\x97\x29\x34\xdb\x82\xd0\x18\xeb\xb0\x87\xe5\x60\xdd\x31\x1d\xa2\x83\x52\x7d\x00\x9c\x96\xc5\xd1\xb2\x7f\x8e\x47\xb4\x20\xba\x93\xdd\x5d\x94\xc0\xff\xa7\xe1\x59\x5a\x9f\x6f\xce\x4e\x56\x69\x82\x5e\x14\xd4\xa3\xc8\x53\xba\xc9\xe5\x73\x57\xab\x31\xbe\x24\xf5\x12\xb4\x2d\xd0\x22\xc9\x79\x53\x57\xa3\xba\x7b\x10\x94\x68\x53\x1d\x60\x90\xf3\xf2\xcd\xa1\xa4\x47\xf0\x8b\xc9\x45\x13\x53\xcc\x75\x6a\xaa\xc3\x32\x75\xda\x63\x20\xa8\x8c\x11\x64\x80\x9c\x25\x3b\xe0\x47\x33\xe0\xba\xce\x18\xf7\x28\x55\x26\x53\x53\x01\x12\x08\x36\xa7\xbd\xe2\x6f\x70\x68\x2e\x2d\x96\xf1\xdd\x43\xdf\xf3\x59\xa7\x2c\xa6\x1a\x59\x77\x4c\xa4\x53\x83\xf4\xca\x05\x02\x82\x8b\xe8\xf3\xcb\xe6\xfb\x62\xb7\xde\x6f\x77\x8b\xbb\xf5\xfe\x76\xf3\xb8\xd9\x7e\xfd\xd2\xb5\xa1\x98\xc9\x14\xed\x0b\xf8\xdd\xaf\xdc\x47\x40\xc4\x5f\xcb\xac\x68\xd4\x4b\x21\xdd\x81\x48\x87\x94\xe0\x9e\xa9\xb2\x76\x25\xaa\x79\x86\xe0\xb2\xe8\xc1\xb5\x60\x81\x44\x0e\x6e\x53\x45\xfa\xf5\x24\x1e\x0b\xd5\x2f\x02\x9f\xe9\x07\x83\x60\xca\x47\x6e\xd8\xc5\x66\x59\x94\x30\xb0\xeb\x05\x03\xcb\x17\xe8\x9c\xba\xdc\x70\x1d\x8d\x4f\xd7\x26\x61\x6a\x94\x69\xf2\x1c\xb2\xa1\x87\x2e\x12\x4a\x31\x0b\x82\x92\x51\xc3\x15\x4e\xf0\x48\x78\xd1\xe8\xc4\x21\xb4\x6b\xd4\xcb\xdd\xcd\x78\xac\xb1\x5a\x6a\x5b\x1c\xcd\x93\x5e\xe6\xa4\x26\x50\x71\x21\x3c\x45\x1c\xcc\xb7\x39\x1e\x79\x79\x36\x09\x41\xee\x22\xf4\xe3\x71\x23\xfc\x18\xe3\xc5\x3f\x36\xbb\xaf\xab\x97\xc5\x8f\xc5\xfd\x7e\xb5\xbe\x5f\xfc\xed\x9e\x5a\x40\x88\xa3\x50\xa3\x5f\x69\x00\x96\xf7\x23\x01\x41\x10\x42\x07\xf8\x35\x16\x4a\x3d\xf3\x66\x4a\xbb\x02\x42\xfa\x86\x72\xa1\x5d\xb3\xb0\x4b\x1e\x9d\x72\xad\x75\x37\x84\x92\xc6\x29\xd8\x20\x57\xba\xe9\x77\x67\x88\x08\xf0\x34\x66\x69\xbf\x72\x39\xea\x50\x20\xbe\x64\xce\xd2\x6f\xf2\x7a\x57\x76\xd4\x36\x20\x80\x72\xcc\x4e\xe0\x54\x7d\x28\x14\xea\x2f\x3e\x60\x70\xbf\x5b\xe2\xb4\x27\xb0\xcd\xed\xa2\x4f\x5e\x5f\x07\x00\x08\x4d\x4c\x29\x91\xa1\xf3\xb8\xe7\xb9\x3a\xf2\xf2\xad\x5b\x95\x74\xa8\x31\x6c\x60\xea\xa1\x71\x06\x05\xf3\x53\x5e\x7a\x91\x09\xd2\x9f\xca\xf4\xbf\xd0\xfb\x46\xd2\x8b\x19\x46\x4e\x6a\xd1\xfd\xc2\x44\xe0\x12\x72\x45\x71\x32\xd8\xb4\xd9\x89\x28\x3d\x2d\xc1\x8a\x6f\x0c\x30\x70\xbf\x65\xac\x48\x3f\x88\x30\x34\x61\xe5\xae\x47\xa9\xb6\xcf\xe7\xbf\xf4\x83\x18\xad\x49\x64\xe1\xce\xbb\xe4\x8c\xf4\x63\xa2\x06\xa9\x63\xa7\xcb\x3b\xcc\x8d\x4b\x5f\x78\x48\x8c\x6a\x69\xe4\xc6\xb0\x8f\x51\xe7\x4b\x5f\x02\x2e\xbd\xfb\xde\x9e\x7a\xe9\x77\x55\xe9\x43\x8c\xab\x90\x71\xb7\xcd\xfe\x39\x81\xc3\xdb\x96\x81\x24\x58\xc2\xd4\x5e\xe8\x5f\x7f\x3f\x2f\x67\xa2\xb3\x32\x90\xa1\x32\x4a\x99\xa9\x1b\x50\x92\x88\x80\xc6\x63\x41\xa1\x2d\xd4\xeb\x5c\x17\xa5\x84\x17\x78\x4f\x91\x80\xfa\xb1\xa8\xcd\x4d\xdd\x59\x3a\xc2\xfc\xd5\xe3\x66\xf7\xf2\xf4\xb8\xfe\xf6\x60\x76\x82\xc9\x60\x1b\xbd\x29\x65\x1c\x81\xb8\xff\x69\x78\x0d\xa5\x43\x87\x4a\xaa\x05\xaa\x85\xfc\xf8\xba\xd9\xad\xef\x37\xdb\xdd\xfe\x79\xfd\xb2\x79\x72\x48\x6b\x19\x06\x21\xb5\x7a\xae\x07\xc8\xf4\xc8\x78\x91\x61\x12\x79\x56\xe1\xc0\xc4\xd9\x76\x3f\x1d\x26\xf8\x37\x11\x17\xee\x42\x92\x22\x49\xbb\xf9\xaa\x58\xd5\x87\x73\xf2\x85\x77\xf4\xa3\x76\x4e\xcb\x28\x62\x56\xc5\xb7\x2e\xe1\x94\xaa\x2d\x96\xa3\xf4\x4b\xa5\x8c\x22\xa3\xbe\x83\xa5\xa0\x8d\x42\xcc\x31\xfa\xb7\x63\xfb\x58\x46\xc2\xc3\x0b\x61\x00\x60\x20\xa6\x3a\x7e\xb2\x98\xa9\xc4\xe2\xae\x7a\x22\x9e\x6b\xfc\x1b\xf6\x1c\x46\x89\x25\xda\xab\x1f\x9c\x5e\x25\x99\x89\xe4\x4a\x16\x06\x98\x67\xfe\x9f\xa6\xe4\x43\x16\x1e\x90\x2c\xd1\x98\xda\x68\x5d\xf3\xb4\x04\x85\xf2\xdd\x50\x55\x4f\xfa\xb9\x84\xf7\xb4\x68\xaa\x55\x93\xbf\x42\xd1\x9f\x20\x09\x8b\xc7\xf1\x89\x76\x20\x4f\xaa\xcd\x25\x83\x40\x50\x63\x93\xc1\xf9\x94\xf1\xbe\xdb\x38\x95\xc8\x56\x68\x96\xa1\xe7\x26\x7f\xab\x2c\xb3\xbb\x6b\x00\x31\x06\xde\x3e\x30\x6e\x3b\xaa\x4c\x1f\xfe\xbd\x52\xf1\x2b\x79\xeb\x9d\x76\xe6\xe3\x95\x15\x4c\x24\x44\x5a\x68\x26\x72\xff\x5f\x9a\xa1\x52\x70\x82\xf9\xf6\x9b\xa6\x4a\x73\xa8\xaa\x45\x53\x17\xa6\x7e\xe7\x5b\xde\x1b\x7a\x52\x79\x14\x47\x81\x02\x59\x1c\x4f\xed\xf9\x46\xc4\xa3\xb9\xc4\xff\x49\xc5\x7d\xdc\x68\xcc\x2a\xb5\xce\xd5\x85\xd0\x2f\x48\x25\x34\xda\x1a\x2b\xc0\xe2\xb2\x7e\x7b\x97\x4a\x25\x08\x47\x7d\x2d\x32\x75\x0b\xad\x51\xce\x6d\x6c\x74\xc4\xe9\x06\x12\x78\x82\xa6\x3e\x92\x0e\x3b\xaa\xf7\xc9\xdb\x69\x3f\xc1\xd5\xd6\xda\xea\xad\x69\x5c\x34\xb5\xa9\x2b\x54\x33\xf1\x3e\xe5\x09\xdf\x82\x0b\x1d\xef\x02\xca\x10\xce\xbc\xa6\xf2\x43\x85\x08\x11\xd5\x3a\xcc\x93\xcb\x04\xbe\xe7\x36\x04\xac\x73\x58\x54\x55\xfa\x9a\xc3\xbc\x3a\x07\xa8\x40\xcb\x24\x1c\xf0\x9d\xfe\xde\xa2\xae\x08\x8b\xa5\x2d\xff\x41\x52\xd1\xa5\xa9\x34\x9e\x50\x0e\x81\x22\x89\x87\xbc\x2c\xe8\x39\xe3\x4b\x2d\x8b\xe3\x89\xa7\xaf\x13\x63\x5c\x11\x15\x62\x76\xf1\x64\x80\xc4\x13\x9f\x56\x51\xcf\x10\xd4\x61\xe7\x2c\x4e\x27\xc8\xd5\x0a\x64\x3b\xc0\x41\x61\x84\x7c\x7c\x35\x1a\x25\x48\xd4\x76\x28\x9a\x0a\x69\x44\xed\xef\x21\xf5\x71\x8d\x34\x14\xf3\x96\x33\xa1\x77\xcc\x54\x98\x18\xfe\x70\x8b\xa8\x43\x29\xdd\x2f\x73\x60\x43\x15\xf2\x04\x49\xb0\xd2\xca\xd5\x3b\xba\x7b\x44\x3e\x45\x23\xf1\xc8\xdf\xe0\x39\xb5\x0e\xe0\xc4\x08\x53\x51\x98\x08\xbb\xb4\x75\xac\x3c\x3e\xeb\x2e\xc1\xb8\x53\x81\x7d\xce\x78\x0e\x66\xcb\x98\xe7\x86\x06\x15\x09\x1f\x53\x5f\xf7\x85\x29\xff\xe8\xd9\x45\x54\x6c\xc9\x07\x75\x93\xcb\xbd\xb7\x0c\x96\xdd\x01\xee\xe1\x7a\xf5\x5c\x42\x3b\xc0\x7f\x76\xbf\xcb\x04\x4b\xad\x6e\x79\x5e\x17\xa3\x72\x0a\xc5\x22\xed\x8d\x94\x67\xd2\xf7\xd4\xd9\x36\x2a\x11\x09\xe6\x1d\x45\x73\xde\xeb\xb2\x98\x62\xe4\x14\xd7\x14\x37\x1f\x74\x79\xcc\xb7\x7d\x99\x61\xaa\xb7\xad\xa5\x9f\x8c\x11\x50\xe9\xb1\x39\x7e\x2d\x54\xb6\xb2\x09\xb7\xc9\xe7\x96\x34\xc6\xca\xc2\xed\x7a\xed\xb6\x3b\x25\x43\xca\xcd\x10\xc8\x66\x1d\x22\xa5\x02\x83\x63\x3d\x41\xce\xb3\xce\xab\x52\x4a\x29\x83\x2b\xaa\xea\xdb\x26\x97\xd3\x82\x4c\x05\x9e\xd1\xe0\x4e\x65\x41\x1e\x78\xd7\x71\xad\x85\x6b\x56\x29\x5e\x1f\xda\x95\x63\xcf\xfd\xb8\x3b\x28\x3c\xac\xe4\xef\xa5\xd2\x31\xb4\x6d\xeb\x48\x3a\x65\x12\x50\x1a\x62\x70\x8a\x29\x46\xc2\xd7\xb2\x3b\x8c\x1e\x1d\xbc\x40\x25\x36\xf8\xfc\xa9\x84\x99\x01\x4c\xcf\x2e\xd0\xe0\xc5\x46\x64\x8f\xab\x7f\x37\x55\xbd\x4a\xb5\x4e\x65\xd3\xf6\xc3\xb8\x59\xe0\x2b\x65\x9f\xa8\x67\x8d\xfe\xb6\x5d\xfd\x58\x6f\xa6\x2d\x85\x67\x12\x1a\x9d\xbf\xbd\x2b\x7e\x8c\x51\x54\x10\x48\xe1\x82\x95\x23\x91\xcb\xf6\x08\x60\x74\xfa\xfb\x9f\x8f\xc8\x03\xe0\x7e\x27\xc4\x47\x62\x59\xbb\xf3\x8f\x10\x52\x40\x88\x41\x2e\x5b\x0d\xbc\x3d\xba\x8f\x55\x77\x34\x52\x42\x0e\x04\xf3\x5b\x5f\xfc\x34\x56\xa4\x03\x20\x92\xf8\xaa\xcf\x8a\x63\xe4\xeb\x29\x9f\xc9\x7a\x02\x0d\x8c\xbc\x34\xd2\xa3\xbc\x74\x59\xa2\xab\x35\x81\x40\x43\xaa\x1c\xae\xe7\xdb\xcd\x2c\x4f\x2d\x40\x18\x44\x88\x14\x00\x74\x69\x1e\xd2\x7c\x84\x67\x80\x50\x72\x5f\x77\x91\xa2\xea\x1e\xb4\x45\xe4\xbb\x06\x51\x20\xe3\xb8\xa3\xcb\x78\x85\xef\x58\x36\x34\x27\xdd\x0a\x10\x87\x1a\x91\x8d\xa6\x22\x67\xf7\x75\xf3\xb2\xda\xf7\xaa\x12\xee\x8a\x71\x62\x74\x95\x5f\xd6\x3f\x16\x2f\xab\xfd\xe3\xb7\x87\xfe\x88\xa9\x96\x95\x59\x51\x01\x3a\x8d\x90\xab\xe6\xd8\x75\x78\x2c\x19\x7e\x43\x01\xbc\x7e\xe0\x65\x9d\xf2\x6c\x68\xeb\x42\xac\x3d\x2c\x7d\x72\xf8\xe4\x2d\x64\x99\xa1\xc9\x9b\xef\x40\x16\x32\x57\x90\xba\xbc\x7d\x6a\x47\x7a\x9a\xbf\x5e\x6b\x0b\x04\x79\xc1\x5b\xeb\xfb\x96\xa7\xd9\x94\x05\xb7\xb2\x34\xb8\x8f\x45\xbd\xc9\xbf\x55\xe0\xb9\x87\x4a\x42\x90\xba\x97\xec\x31\xa1\xf6\xd1\x26\x06\xdc\xf7\x84\xcd\xba\x3f\xf7\x6f\x23\x22\x22\x92\x7e\xe4\xd8\xf0\x21\x7e\xbd\x4f\x93\xf8\x20\x54\x88\xb8\x87\xac\x78\xdd\x97\x20\x79\x75\xed\xfd\x85\x32\xba\xa9\x8b\x53\x99\x76\xb0\xda\xf9\x6b\x4a\x0e\x98\x0d\x1e\x4e\x36\x29\x03\xde\xc7\x40\x5e\xac\xfd\x89\x72\x50\x50\x7f\x00\xe4\xa8\xef\x3a\x19\x23\x52\x0a\xd6\x6b\xb5\x2e\x8c\x8e\xc6\x64\x26\x28\x19\x23\xfe\xea\x1d\x09\x8c\x3b\x9a\xda\xc9\x95\x94\x34\x65\xb8\x27\x7e\xee\x32\x5a\xfe\x1c\xfd\x33\x80\x56\x26\xef\x38\xd2\xf8\x78\x2e\x8b\x9f\x6e\x55\xd6\x7e\xc0\xf9\xa0\xb3\x7b\x46\x5c\x77\x9c\x8a\xc4\x45\x10\x30\xc3\x7d\x5f\xd4\x4f\x1a\x6b\x5b\x3a\xd4\x96\x0e\x42\x8d\xe4\x6f\xbb\x54\xee\xb8\xdc\x15\xf0\xd2\x64\xbf\x56\xc3\x18\x7f\x14\x1d\x44\xb1\x89\x3d\x01\x12\x89\xbb\x5f\x63\x0f\xa3\x3a\x4b\x87\x9b\x1d\x23\x44\x75\xa0\x62\xa4\xa6\xc2\xdc\xdd\xca\x2a\x79\xb9\x83\x94\x48\x61\x0a\x17\x10\xe9\x03\xe5\x63\xd1\xbc\x03\x6f\x9e\xcb\xe2\x54\xa6\x45\xd7\x8c\x19\x81\xc5\xd2\xf9\x92\xe3\x0e\xd7\xa1\x67\xf4\x79\x4f\x86\xfb\xe3\x2b\xcf\xfa\x02\x5c\x1d\x06\xd4\x15\xdb\x59\xb9\xd2\x61\x19\x93\x6b\xc4\x63\x18\x70\x96\xc1\xae\xe8\x6a\x47\x5c\x4a\xf8\x4a\xce\x48\x47\x1e\x50\x5b\x31\xff\xd2\x88\xa6\x32\x85\x6e\x9f\x56\xcc\xeb\x28\x66\xe8\xe9\xb8\xe9\xe2\x7e\x06\x91\x48\xe7\x00\x1d\x4f\x35\xec\x89\x83\x43\xea\xd8\x57\xe8\x9c\x9b\x4a\x5e\xa4\xd5\x99\x75\x52\x74\x1c\x30\x4c\xc1\xaf\x16\xab\xbf\x10\xb6\x60\xfc\x6a\x77\x34\x0a\xf0\x23\xba\x0d\x79\xbf\x28\xd3\x7c\xc2\xe6\xa4\x63\x29\x71\x21\x3c\x42\xcd\x15\xaf\xf9\xb4\x9a\x44\x33\x1a\x1a\xc4\x03\x72\x4a\x5f\xe1\xff\xfe\xb5\x38\xd3\x55\x67\x5a\x27\x11\x41\x16\x78\x44\x48\xdd\xce\x68\xfa\x0e\x7c\x55\xcd\xb5\xf4\xe6\x42\xcb\x57\x3e\x18\xd7\xca\xf3\x3b\x1b\xf3\x0c\xe5\x1d\x4f\xf3\xfb\xa2\xaa\x9e\xf2\x7b\x5e\xd5\xb7\x59\xea\x40\x54\x5a\x26\x46\x41\xe0\x98\x1a\x9a\x1e\x64\xbd\xeb\x0e\xea\x00\x1d\x08\xcb\x8c\x96\x9f\x67\xb5\x5a\x41\x2b\x2f\x31\x5e\x63\xd6\xb8\xe0\x95\x56\x81\xc4\xaa\xf0\x53\x51\x0d\xac\x56\x8d\xce\x80\x0b\x39\xb7\xcb\xf1\x27\x40\x7b\xad\x68\x82\x88\xf3\xbc\x39\x22\xe4\xa8\x9b\xed\x10\x6a\x64\x48\xb0\xa2\x8d\x7d\x42\x71\x64\xc8\x6b\x88\x8c\x5c\xbb\x55\x63\xfb\x3c\x1a\xae\xc1\x12\x44\x17\x08\x49\xdf\x1e\x0a\xb7\xba\x68\xcf\x53\x1a\x93\x24\x8f\x45\xde\x45\xc8\x79\xe6\x2c\x20\x87\x92\x1a\xce\x00\xed\x05\xb1\xc4\x08\xf7\xd1\x08\x62\x0d\xc3\x1a\xda\x23\x1e\xc3\x52\x03\x2b\x60\x78\x07\xc7\xee\x5e\x58\x36\x8f\x5f\xe4\x68\x61\xda\xe3\x22\x64\xed\x11\x30\x29\x26\x07\x5f\xb5\xeb\x51\x77\x05\xea\x4b\xe4\xe2\xfc\x33\xad\x6f\x9b\xba\x29\x87\x45\x04\xda\xa3\x84\xa0\x9a\xff\xfe\x15\xea\x55\x59\xe4\xb0\x10\x69\x96\x4e\x8c\x43\xed\x85\x9e\x92\xe0\xca\xed\x50\x9b\x7c\xc2\x8c\xf7\xc7\xd8\xe7\xfc\x63\x7c\x76\xe0\xe3\x88\x48\xd1\x81\x0e\x3c\x67\x2f\x6b\x2f\x4c\x12\x74\xe3\xad\x8a\xf2\xdc\x00\xd6\x5e\x14\xc5\x9e\xa9\xeb\x54\x3f\xd2\x7c\x34\xda\xb4\x97\x04\x12\x25\xd0\x1f\x36\xab\xbb\x97\xc5\x6a\xbd\xdf\xfd\xfd\xbc\x26\xee\xfa\x49\xe4\x23\x1f\x00\x2e\x0c\x67\xf7\xab\xe0\x71\xd4\xa7\x59\x97\x87\xa1\x84\xeb\xfc\x23\xc8\x20\xc6\x7d\xab\x35\x4d\x06\xd5\x34\x57\xb0\xae\x93\x93\x5b\xe7\x18\x6c\x00\x1a\x63\xef\xc7\xe2\x12\x8e\xa7\x3d\x4d\x74\x40\x07\x35\xae\x73\x3b\xa8\xf6\xbd\x08\xac\x63\x2b\x0b\x05\xcf\xad\xef\x50\x63\xe2\x6b\x3e\x18\xac\xfd\xc0\xd3\x38\x3e\x6a\xc7\xbb\xa0\x3a\x82\x4e\xed\x07\x81\x91\xbe\xd9\x63\x69\x36\x47\xe2\x91\x76\x5a\x43\xd9\x0f\x81\xd9\xe0\x90\xf6\x03\x12\xd2\x5e\x68\x06\xeb\x3f\x6e\x78\x05\xea\x69\x5c\x87\xd0\xdd\x49\x18\x6a\x84\x3b\x5e\x4a\x47\xa1\xa6\xfd\x40\x31\x8c\x0c\x61\xa4\x6d\x4c\x16\x7d\x0d\x57\xe3\xce\xd4\x1a\xc3\xbc\xa8\x25\x78\xfb\xf8\x6d\x3c\x60\x7d\x42\x05\x58\x55\x05\x17\x7d\xbb\xce\x88\xa2\x7d\x12\x52\x6d\xa4\x53\xca\x1c\x45\x4f\xe6\x6c\x78\xed\x93\x28\x0c\xba\x92\x7a\x5e\xc2\x48\xd6\xde\xb5\xe1\xda\x95\xd4\xda\xe8\xf4\x45\xee\x56\xfb\x44\x09\x65\xaa\x2e\x5f\x78\x7e\x19\x32\xd3\x3e\x0d\x7c\x03\x6e\x1f\x28\xb1\xcc\xbe\xc0\xe4\x09\x69\xa8\x70\xa1\x5d\xd7\x07\x01\xf3\xfa\xb7\xda\xa7\x89\xf2\xfa\xd0\xed\x4d\x53\xe6\x98\xac\x51\x93\x3e\xa4\x3c\x06\x13\x78\xb4\x0a\x3c\xd7\xa4\x63\x3b\x2f\x0b\xad\x33\xc7\x54\xd1\xda\x9f\xdb\x9a\x1f\x4f\xe3\x8a\xee\x39\xc4\x80\xf6\xc3\x30\x36\x58\xd4\x41\x98\x24\xf8\x32\x6e\xa2\xa9\x09\x34\x5a\x29\x08\x37\x86\xa2\xc8\x14\x47\xb6\x96\x4c\xe6\x7e\x64\xc4\x50\x5c\xb6\x96\xeb\x5e\x17\xe5\x5e\x3a\x1e\x81\xfd\x0a\xff\x7d\xdb\x91\x00\x69\x9f\x31\xb0\x9c\x27\x8d\x4a\x0b\x84\x6a\x4f\x3e\x07\xe3\x21\x31\x29\x0c\x38\xa2\xb2\x4b\x77\x2a\x97\xa3\x44\xe1\xd5\xef\x64\xdb\x27\x7e\x88\x93\x5c\xa7\x59\x36\x86\x4e\xf6\x3b\xbc\xf6\x13\x6d\xb2\x42\x58\xeb\xdf\xd3\x34\x6b\x9f\x47\x14\x57\x3b\x99\xa5\x5a\xf7\x89\x37\xed\x0b\x4d\x43\x1b\x66\xba\xe3\xd8\xef\xd3\x22\x7a\xed\x2b\x1d\xc6\x43\x09\xad\xf5\xee\xab\x3b\x1d\x88\x70\x1b\xf1\xd7\xa2\xa9\xe0\x99\x9f\x8b\x7e\x96\x02\x93\x01\x75\x0e\x7f\xbd\x03\x7e\x51\x6c\x3d\x01\x59\x6a\x1f\x94\x27\x2d\x19\xf5\xb8\x3b\x26\x4b\xa6\x6d\xae\x55\x84\x8f\xbf\xbe\x07\x5e\xe6\x36\x5a\xbb\x7e\xb1\x51\x2c\x1d\x78\x1e\xe5\xbe\x01\x21\x8e\xbf\x4c\xe0\xf9\x92\x47\x16\x2a\x56\xd6\x86\x15\xba\x1e\x23\x8d\xff\x98\x9c\x21\x12\x34\xe6\x3a\x12\xdb\x5e\x8f\x77\xdc\xd0\x0f\x39\x6e\xcb\x27\x7e\x6e\x1d\xd8\x2b\x7c\xbd\x3a\xf0\xb9\x87\xb4\x9a\x9d\x05\x50\xe4\x50\x1f\x38\x16\xd2\x7c\xab\xcd\x76\x6a\x9b\x06\x11\x27\x2e\x9a\x0a\xe5\x7b\x2a\x2d\x26\x77\x0e\x53\xe8\x56\xda\x20\x60\x1e\x8b\x47\x80\x9c\x61\x90\xab\xc7\x05\x75\xcd\x29\x42\x33\xb7\xae\x0c\x75\x7e\x15\x08\x02\x6e\xaa\xa8\x8d\x3d\x87\xf9\x98\x89\xba\xba\x0e\x08\x37\xd4\xd2\xed\xba\x88\x65\x2b\xc6\xe0\x99\x94\x94\xe8\x80\x08\x8f\xc6\xbd\x8d\xf9\x38\x50\x08\xd4\x01\x91\x02\xc9\xc3\x4a\x90\x67\xe9\xca\xcb\x75\x40\xa3\x18\x0d\xf7\x7f\xfe\x75\xdb\xfd\xa4\x2d\x2d\x5b\x31\xe5\x91\x98\x74\x79\xe8\x99\x73\x17\x23\xec\x90\x0e\x22\x12\x89\x8e\x53\xb4\x90\x6f\xed\x77\xc3\x69\x86\xe6\xe5\x64\x42\x04\x11\x05\xe4\x68\xd2\xbc\xf5\xc5\x6c\xe0\x69\x09\x65\x6d\xf8\xb8\x2f\x6b\x90\x3f\xb3\xf0\xed\x35\x13\x2f\xd4\x7d\x22\x73\xdb\xb3\x8f\xe8\x20\x01\x11\x1b\x50\xfe\x7b\xf1\xd6\x4e\xd1\xb7\x41\x94\xc3\xb6\x11\x32\xc4\xbc\xaf\x4e\x7f\x9a\x6a\x69\x9e\xc9\x9b\xc6\xed\xd7\x81\x4c\x08\xc6\xfc\xab\x53\x96\x5e\x59\xdd\x03\xc5\x7d\xb4\xd3\x31\x43\xbc\x85\xab\x85\x78\xf3\x3b\x48\xa0\xb8\x30\xa6\x7a\x93\xcb\xc3\x66\xec\x54\x38\xa3\x33\x80\x50\xa0\xdd\x70\x8f\x30\x14\xf7\x74\x3a\x11\x22\xee\x23\x2c\x03\xe2\xbb\x21\x28\xc3\x35\xe6\x06\xe2\x84\xe5\x5b\x3c\x43\x2e\xe5\xfd\xa9\x13\xb4\xd1\xc4\x4b\x02\x9c\x7e\x6b\x5e\x9d\xbf\x16\xc7\xce\xfe\x26\x9e\x34\x15\x20\x86\x65\x49\x64\xdd\x48\x23\x61\xd8\x29\x80\xdd\x14\x45\xf6\x7b\x55\x69\xfd\xee\x45\x22\x1d\x39\x8a\xdb\xf6\xcd\xc6\x7c\xa8\xb6\x4d\x0c\x71\x32\xc4\xfb\xa3\x07\x76\xe4\x6f\x53\x93\x9f\xc4\x5a\x19\x41\x1e\xf8\x09\xd9\xa0\xc0\xe6\x32\xd3\xab\x49\xe2\x07\x18\xa3\x85\xfa\xf0\xc2\x6b\xe8\xc2\xcd\x9a\x24\x32\xe2\xa2\xb3\x55\x91\xbb\xa0\x6a\xff\x3b\xb9\x19\xf7\x86\x61\x89\xe5\xd3\xcb\xfc\xc4\x21\xdc\x0b\x31\x9b\x01\x3f\xeb\x92\x5b\x8e\xbc\xd2\x32\x21\x4f\xae\xe8\x53\x3f\x70\xa0\xa9\x12\x41\xf6\xb3\x03\x86\x70\xe2\x23\x2e\x64\x7b\x3e\x8a\x22\xb3\xe5\xfd\xa3\xb7\xe3\x89\x8e\x7a\x3c\x42\x5a\x4c\x0c\x0d\xc2\x81\xfa\x96\xc2\x02\x43\x8d\x08\x0d\x35\xa4\x39\xf9\x15\xc6\x1f\x4d\xb8\x06\x8c\xa0\xb7\x43\x2b\xeb\x14\x1b\x34\x11\xc4\x0b\xa1\xa7\x93\x69\x2d\x64\xfe\x0a\x9b\xe9\x3d\x85\x22\x48\xf6\x54\x03\x3f\xfe\xab\xe9\x4f\x97\x49\x80\x96\x60\x47\x18\x7d\x7b\xbf\x5c\x16\xe5\xb5\xa7\x90\x82\xb9\xd0\xf3\x92\x97\xca\x0a\x3f\xa1\x09\x71\x15\x1e\x6a\x4f\x55\xb1\xc4\xfc\x83\x4d\x41\x0d\x8b\xab\x48\xf0\xbf\xe4\xff\xae\x33\xa2\x6a\xa2\x18\xf3\x1c\x13\x7c\x9a\x77\x55\xc2\xee\x28\x50\xe3\x29\xc3\x87\x0b\x0d\x0c\x1f\xc1\xcd\x62\x02\xb1\x87\xe6\xac\xcc\x80\x77\x9a\x7f\x88\xaf\x12\xe7\xc9\x68\x80\x84\x62\xd4\x55\x97\x45\x5e\xbf\x34\x3d\x7d\x9e\x26\x20\x62\x66\x59\xc7\xa6\x05\x62\xf3\x2f\xae\x3d\x40\x58\x03\x26\x55\x11\xd3\xf5\x90\xe6\xf5\x90\xca\x5f\x13\x1d\x12\xa3\x73\xca\x4f\xa7\xca\xa4\x13\x79\x26\xaf\x7c\x04\x2d\x42\x34\x97\xee\x8b\xd7\x2d\x46\xc7\x27\x04\xf6\xec\x8f\xb9\x94\xa8\x26\x5a\x06\x0e\x28\xb0\x34\xd5\x7b\x08\x7b\xb3\xc8\x94\xd1\xd3\xfb\x03\x62\x77\xe7\x16\xd0\xe1\x9f\x21\xa9\xaa\xa6\x5e\x98\xe0\xb7\xfd\x9e\xc2\xc7\xc3\xf9\xc6\x65\xe4\x35\xf5\x12\xc6\xba\xc2\xbb\xd6\x47\x2a\xca\x0a\x5d\x89\xae\x81\x8a\xa8\x89\xb2\x1c\xf9\x90\xa7\xda\x1e\xf6\x63\x93\xce\x6b\x5d\xad\xcd\xf2\xe9\x57\x49\xdc\xf9\x2f\x40\x7d\xc1\xa9\xe3\x36\xf8\xd4\x9f\xa0\x81\x67\xf2\xec\xfb\x6e\x3e\x5c\x40\x6e\x34\x0d\xb4\xd2\x66\x8d\x92\xc5\x3b\x94\xe7\xd6\x61\xd8\x95\xe9\xeb\x2b\x94\x03\x1b\x95\x92\xc4\xd7\x6e\x19\x68\xfd\x8d\x07\x2c\xfc\x1d\x0f\x34\x4a\x78\x84\x69\x8e\x77\x07\x91\x1e\x00\x45\x34\x25\xd2\x4f\x22\x57\x76\xd2\x94\x39\x3f\x42\xfe\x29\x5b\xa7\xa6\x21\x31\x80\x26\x03\x9e\xb4\x83\x7c\x94\x4c\x9b\x3a\x9a\x57\x0b\x39\x7a\x0b\x9d\x86\x92\x20\x81\xed\xd0\xee\x5f\xf4\x6c\x8c\xf3\x4e\x2b\x0d\xb5\x11\x4f\x7c\x85\x7a\xf7\x96\x3f\x69\x0d\xe5\xd4\x94\xa2\x51\x14\x3a\x6d\x79\xb4\x5c\x3e\x7d\xd4\x6b\xff\xfe\xc5\x2b\xd9\x5b\xc5\x7e\x14\x5a\x1d\x48\xfe\x0a\xe3\xb2\x3b\xd7\x84\x18\xaa\x9b\xfe\xfb\x77\xa5\x86\xcd\x05\x7d\x89\xa6\x31\x25\xe8\x47\x9c\xde\xeb\x7d\x9a\xbf\xef\x11\xd8\x60\x8f\x31\x5f\xa0\x65\x84\x62\xe0\x53\xf3\xee\xf3\x07\x65\xad\x51\x83\x88\x26\x4c\xfc\x6d\x4f\x46\x75\x78\xf2\xac\x2c\x00\xac\x1a\xb9\x4f\xdf\x60\x24\x3b\x33\x3f\x30\xb8\xd4\x86\x23\xf7\xc0\xcb\x5d\x71\x73\xae\x6d\x36\xc8\xb7\xc7\x85\x2f\xb5\x83\x79\xb7\xc3\x3a\x3f\xc2\x74\x93\xa4\x42\x28\x3d\xe4\xc5\x42\x9b\xff\x53\xb1\xfe\x71\xe8\xd8\x5e\x46\xea\x08\x81\x3c\x79\x73\xb4\x38\x7e\x67\xec\x50\xe5\x53\x48\xfa\xa8\xe5\xb4\x06\x45\x53\xa5\x63\x74\x9d\xb0\xda\x1b\x39\xa5\xfa\x73\xb5\x44\x91\x84\xcd\xf2\x09\x4d\x0f\x5b\x0c\x32\x2f\x60\xad\x29\x68\x66\x5d\xa9\x0f\x5e\xaa\x51\xb5\xa7\xa6\x9a\xf9\x98\x2e\x12\x3c\x97\x45\xe9\x04\x4e\xbb\xa3\x2a\x41\x9f\x23\x2b\x5e\xf7\x80\x3c\xd0\xa3\xf7\xd3\xed\xc8\x68\x47\x51\x71\x82\x1c\x09\xe0\x0c\xa5\xe4\xb5\xd5\x6a\x78\x72\xe8\xf9\x06\x8b\x5b\xf1\x77\xd8\xe4\xba\x58\x88\xa2\xa9\x1d\x16\xe7\x97\xd8\xc4\x81\x79\x17\x7a\x21\xf7\x0c\xc8\x8b\x67\x2b\x5e\xf3\x6d\x5d\xce\xf9\xb2\x53\x91\xd9\xd1\xa6\x11\xfa\x24\xd6\x89\xad\x69\xc5\x09\xda\x69\xa0\x8c\xdb\x05\x41\x84\x74\xff\xdb\x43\xa3\x75\xe6\x98\xfd\x75\x18\xc4\x01\x46\x48\xb6\xe9\xf1\x94\x0d\x40\xc7\x3a\x0c\x12\x81\xa5\x72\xab\xee\x07\x0b\xf4\xab\x80\x97\xf2\x70\x5b\x02\xe0\x9d\x2e\xb9\xd4\x7a\xf7\x7b\xf2\x7f\xec\x97\x2d\x2e\x99\xa9\x74\x48\x98\xaf\x9d\xc8\xe8\xb7\x0a\xca\x25\xcf\xb1\x9c\x87\x57\x60\x59\x60\x46\x0e\x5e\x48\x38\x8d\xbd\x0e\x39\xae\xd3\x6c\x62\x9d\x86\x44\xc4\x00\x36\x80\xd0\xe4\xa9\xe5\xab\x18\x8b\xf6\xb7\xad\x78\xe8\x1b\x3e\x81\x1f\xbc\x7a\xe0\x6a\x6c\x46\x86\x04\x02\x04\x7a\x3c\x5a\xec\xf0\xe4\x26\x61\x28\xd0\x0d\x7f\x48\x65\x59\x0c\xd8\xae\x75\x18\x79\xd2\x80\x38\x7b\x33\x31\x8c\x80\x22\x00\x68\x7b\x30\xf1\x6c\xf7\x7b\x4c\x05\xf2\xef\x56\x46\x96\x53\x8c\x41\x65\x3a\x8c\x63\x23\x45\xd1\xe7\xac\xfc\xa8\x3b\x57\x98\x44\xa8\xb1\xd5\xdb\x2d\xe1\xb9\x4c\xdf\xd3\x0c\x5e\x27\x4c\xb1\x3a\x8c\x41\xc4\x96\x3e\x47\x38\xb8\xbb\x0e\x99\xcf\xb1\xd6\x10\x2b\x11\x9b\xa3\x0d\xb5\xf7\x0c\x70\x9f\x15\xf0\xea\x90\x29\x23\x06\xf1\x81\x09\xcb\x27\x3d\xee\xbd\xc4\x93\xc6\xc5\x70\x54\x8d\xb7\xe9\xcf\xc9\x54\x9c\xb0\x7b\xea\x30\xe1\x91\xc9\xb5\xb7\x46\xda\x0f\x48\x4d\xa0\xb9\x4b\x36\xea\x30\x01\x81\xbe\x26\x52\x6b\x98\xa7\x7b\x32\x4b\xd0\x70\xfa\x7d\x36\x27\x13\xcd\x10\xef\xfd\x5a\xb8\x6b\xf2\x90\x46\x5d\xbd\xec\x8f\xb4\x3e\xbc\x40\x55\x64\xef\x57\xf4\x45\x74\xc8\x99\xc2\x2c\x62\xc9\xd3\x0a\x0c\xd1\x63\x85\x12\x35\x63\xdb\xc6\x8f\xbc\x3f\xcc\x1f\x77\x1e\x4f\x34\x71\x2a\x73\x46\xbb\x63\x5c\x8f\x3c\xb9\x8d\x4a\x90\x16\x3d\x2f\x14\xec\xd3\xcb\xc0\x6f\x28\x98\x87\x04\xc7\xb2\x51\x0a\x49\x14\xb9\x7b\x23\xc1\x45\x2c\x1d\xed\xb2\x5d\x57\xbb\xc1\x29\x99\xc4\x49\x6e\xe1\x83\xd5\xea\xc6\x1d\x81\x98\xd0\x0e\xd5\x6e\x27\xce\x4d\x6b\x34\xd7\x4b\xc8\xeb\x6a\xc0\x35\xa1\x43\xe0\x46\xfc\x16\xab\xd4\x67\x97\x07\xd6\xb5\x94\x1a\x2b\x57\x72\x35\x8c\x4e\x84\xa0\x12\xdc\x68\xa0\x92\x65\xf1\xe1\x4a\xcc\xc7\xaf\x08\xe0\xe3\x78\x68\x2a\x28\xb7\xe9\x6b\xde\x9c\x86\xd6\x59\xa8\x3d\x1f\x27\xf0\xdd\xcf\x5d\xeb\x05\x95\x95\xc9\xec\x8f\xaf\xa1\x7d\x03\xd6\x29\x5c\xea\xac\x1a\x65\xd0\x75\xa8\xa9\xc4\xaa\x8c\x26\x47\xf2\xcb\xa0\xfb\x9d\x85\x58\xc5\xf3\x00\x35\x6f\xbb\xe1\x13\xe8\xb4\x8e\x3c\xdf\xc8\x53\xb8\x02\xaa\x0b\xf8\xb7\x8e\x3c\x20\x76\xb6\x56\x58\x49\x6d\xb6\xc8\xfe\xb3\x45\xbe\x27\x5d\x99\x86\x63\x65\x52\xf7\x29\x17\xc3\x88\x5e\xe4\x07\x0c\xab\xe5\xf2\xa6\xfe\x2f\x96\x37\xd9\xdf\x83\x30\x0a\x4c\xca\x18\x5e\x73\x9e\xd7\x8f\x69\xfe\x6f\xee\x3e\x7a\x44\x02\x8d\xc0\xdc\x22\xc7\xe4\xfc\xec\x7e\x1c\x11\xc5\xa2\x61\x42\x68\x56\x99\x65\x1a\x79\x8d\xa8\x4f\x30\x08\x23\x78\x2d\x0f\x06\x13\xba\xad\x8b\xd3\xa9\x9b\xb4\x11\x65\x11\x66\x6e\xc6\xf1\xc4\x45\xae\x1c\x35\xc5\x15\x53\x3a\x0a\x03\x1f\xe5\x5f\x6e\x5f\x9e\xfe\x59\x3f\x8e\x84\xc1\x75\x14\xc5\x89\x6f\xcd\xa5\xaf\xbb\x87\xfb\xd1\xe2\x13\x45\x5c\x22\xa2\x61\x2d\x0b\xc3\x68\x81\xb8\x2b\x68\x8e\xee\xec\xd8\x53\xdc\x48\x13\x55\x75\x59\x9c\xef\x8b\xd7\x54\x8e\xa1\x85\x3a\x8a\x13\x23\x24\xf4\x49\x97\xc5\x9a\xe8\x78\xc4\x23\xb8\x2b\x56\xf0\x7e\xa5\x35\x23\x1a\x9f\x6a\x26\x2e\x33\x79\xf3\x44\x2a\x14\x29\xb4\x54\x37\xd5\x09\x46\x12\x58\xe3\xcb\x72\x3f\x46\x84\xe0\x25\x1d\xe7\xb8\x9d\x88\xe2\x30\x1a\x2a\x97\x6f\x2a\x9b\x87\x71\x0d\x04\xc1\xd4\x9d\x2a\x90\xf9\xc1\xd5\xaa\x4d\xac\xda\x61\x70\xcb\x9e\x28\xad\x70\x2b\x6a\x7a\xfc\xc4\x69\x1e\x2c\x3a\x79\xba\x67\xac\xa1\x37\x50\xe6\xf1\x13\x29\x62\x0a\xcd\xaa\xe6\x74\x2a\xca\xb1\x6a\x8a\x8e\x54\x64\x82\x54\x95\x05\x1c\xbb\xe1\x62\xab\x9e\x27\x97\x4a\x8c\xc6\xc0\xfa\x65\x31\x2a\x4f\xd0\x11\x50\xcf\xd4\x44\xd6\xbc\xac\xc7\xb4\x5f\x23\x0b\x2a\x02\x4e\xd1\x00\x7f\xd8\x6c\x97\xeb\xfb\xfb\xc5\xe3\xfa\xe9\x5b\xa7\xdb\xb3\xfd\xf6\xfc\x7c\xff\xb7\xbb\xa6\x0e\x75\x62\x41\x29\x8b\x5c\xdd\xda\xe0\xa9\x2d\x44\xfe\x01\xe9\xe4\xe1\x74\x6c\x2c\x09\xac\x84\x45\xe9\x91\xd6\x4f\x1d\xd0\x96\xeb\xd8\xf7\x22\xac\x32\xd9\xbd\x6c\x87\x11\xe6\xd8\xf7\x80\xf4\x98\xfb\xdb\x34\x87\x9f\xe3\xe3\xed\x46\x6b\x9d\xdc\xa7\xfb\xbf\xbf\x6d\xc7\x64\x98\x3a\x26\x81\x70\x60\xc1\x75\x8e\xc0\xe6\xb4\xc8\x17\xd9\x6b\x51\xa6\xf5\xe1\x38\x5c\x4f\x63\x22\xa8\xb6\x5c\x44\x88\xf7\x4d\xf3\xd7\xcb\x82\x77\x1d\x13\x15\xf8\x86\xbb\x52\xdd\x17\xaf\x93\x71\x3c\xea\xd2\x98\x72\x23\x4b\x22\x11\xca\xbc\x44\xaa\xcb\xb4\xc8\x2f\x78\xfe\x75\x4c\x21\xb4\x35\x4c\xf9\x31\x1d\x58\xa9\x31\x85\x88\x0d\x99\x03\x1e\xe1\xe3\xb9\x11\x7f\xc2\xf9\xb6\x28\x7b\x65\xd6\x60\x54\x31\xa5\xe3\xd0\x23\xd2\xac\xc7\x95\xa1\x67\x1b\x04\x06\xe2\x90\x79\xc8\x54\x7c\x57\xf2\xd3\x01\x72\x78\x2e\x3e\xa0\x9c\xc8\x7b\xeb\x38\x94\x2c\xb0\x81\xbd\x27\xf1\xef\x65\xc6\xab\x6a\xfd\xf3\x34\xe4\xa1\xd5\x71\x08\x46\x97\x2d\x45\xe2\xff\xf1\xbb\x47\x81\xc4\x6a\x69\x70\x45\xa2\xbf\x19\x3b\x71\xa7\xd3\x24\xe2\x1d\xd7\x9e\x59\x33\xc9\xe7\xd1\x93\x38\x12\x51\x68\xfc\x56\x5b\x2b\x0b\xa1\x7b\x9b\x48\xfa\x3e\x9d\x16\x85\xf7\xc3\x2f\x52\x80\xa4\x64\x19\xe8\x9a\x86\x93\x6f\x13\x69\xea\xa8\xc8\x5b\x07\xbb\xab\xa1\xeb\x5b\xc4\x34\x30\x80\xab\xa6\xbc\x5c\x2b\xff\x98\xb6\x4d\x88\xef\x08\x2c\x2d\x50\xfb\xdd\x66\x00\xe7\x59\x35\x75\x1c\x47\x5a\x20\xaa\xbc\xa9\x57\xe9\xfb\x78\x63\x8d\x63\xe9\xe3\xe6\x66\x89\x6d\x7b\x96\x96\x9b\x09\xda\x5f\xc7\x8c\x26\xd4\x02\x8e\x8c\x5c\xdb\xf8\x36\x2c\x0a\x30\x5a\xc6\x8d\x35\xb2\x2b\xda\xf7\x71\x5d\xc4\xe2\x50\x46\x6e\x1d\x11\x7d\xd5\x86\x8e\x99\xa2\x08\x86\xff\x57\xf3\x3e\x9a\x9b\x0c\x00\xed\xb0\x13\xbe\xdb\x7d\x5f\x42\xeb\x1a\x24\x52\xf3\xc0\x29\x81\x18\xee\xd4\xc9\x20\x4a\xc0\x47\xa9\x95\xbc\xbc\xe5\x69\xd6\x94\x9d\xa3\xde\x1e\x91\x3d\x91\x91\x21\xe6\x58\xc1\x3b\x64\xad\xa1\x33\xc7\x9b\xa8\x63\x4e\xc3\x04\xfd\xa6\x82\x67\x0b\x79\x48\xe1\xbd\x5b\xfb\x63\xce\x4c\x92\x43\x34\x69\x86\xc9\x8c\x07\x7e\x3a\xf5\xc8\x8d\x58\x28\x1f\xcb\xd4\x21\xaf\xa1\x34\x0a\xd5\x5f\xae\xf8\x73\xb1\xd0\x3a\xb6\x86\xcc\x57\x28\x8b\xd5\xcd\x3f\xed\x1f\xb7\xba\x8f\xdb\xca\xc4\x73\xd1\xdc\x5d\x81\x38\xab\x2f\x97\x69\xfe\x58\x26\x06\xcd\x81\x6a\xac\x03\x80\x34\x12\x01\x7e\xe7\xd9\x26\xef\x0b\x0f\x57\x20\xd3\x23\xcf\x26\x79\x94\x58\x45\x51\x6c\xa1\x39\x28\xfa\x64\x7f\x06\x3f\x42\xeb\xef\xc9\x46\x0a\xdc\xef\x3a\x89\x31\x35\x28\x79\x26\x1f\xe1\x63\xfb\x96\xe6\x8b\xd3\x09\x78\xd9\x91\x26\x0f\x24\xd9\xdd\x5f\x77\x2e\x8f\xd1\x16\x6b\x0d\x29\x97\xbf\x9c\x1d\xd7\xcc\x4b\x38\x42\xbb\x1c\xcb\xed\x1b\xe4\x33\xa6\x23\xf3\xb4\x44\xfc\x33\xfc\x9c\x91\x2b\xd4\xcc\xa7\x04\x4d\x6c\x95\x56\x92\x97\xea\x05\xfe\x8d\x35\x00\x1d\x5e\xce\x35\x4b\x34\xca\x1e\xa9\xb4\x42\xee\x9b\x26\x87\xa7\x4b\x7c\xad\x66\xbe\x0a\xd0\x0f\x80\x5c\x99\xf4\x89\x4b\x8b\xb3\x20\x10\x31\x73\x53\xf7\x73\x55\x5f\xcd\x82\xd0\x74\x78\x97\xef\x3d\x15\x23\xc5\x08\xcd\x02\x41\xb1\x9f\x9a\x79\x94\xf3\xe4\x0b\x32\x12\x08\x9c\x80\x35\x54\xf5\xa6\xba\xe7\x1f\xe7\x2e\x24\xc0\x88\xf6\x71\x4f\x5a\xf2\x0e\xe6\xbb\x3c\x00\x26\x0b\x47\xc9\x38\xc3\x77\xd5\x0d\x2c\x46\xdb\xfd\xd5\x85\x12\xa0\x82\x2c\xdb\x15\x7f\x42\x3e\x4a\x0e\xb0\x30\x0e\x07\x72\xa4\xfb\xd3\x64\x7d\x64\x91\x6f\x68\xbb\x78\xf9\x3a\x4f\x57\xd3\x36\x91\x08\x99\x36\x8e\xab\xf1\x34\xdc\xe5\x23\x6e\x08\x64\x8e\x85\x32\x29\xdc\x37\x28\x47\xe5\xb6\xae\x1d\x18\x69\x35\x05\x39\x1f\x2e\x23\x2c\xd2\x31\x52\x12\xc9\xe2\x78\xe2\x75\x2a\x32\x08\x02\x07\x49\x63\x31\xf7\xe8\xb0\xba\xc6\x9f\x5c\x95\x71\x8e\xdc\x4d\x70\x4c\xeb\x17\x90\x45\xa9\xa6\x60\xa4\xf9\x75\x9c\x31\xed\xf3\xb0\xa7\x53\x32\x9c\x6d\x9f\xaf\xfd\x2c\xd1\x1c\x03\xd2\x4f\xe5\x2b\xcf\xad\xff\xeb\xf0\x6d\xee\x81\x79\x1c\x63\x6f\x57\x6f\xfd\x4f\xcc\xe0\x79\xcb\x76\x09\xad\xb7\xb8\x08\x14\x4d\x29\x61\x96\xbf\x66\x72\x4f\x11\x7b\x32\x71\x2c\xa8\x13\x72\x31\xcd\x84\xe4\x4c\x0e\xca\x1c\x3c\x43\xe6\x6a\x8f\x4a\x8f\x42\x70\x51\x91\x78\x25\xa8\x75\x01\x53\xea\xe3\xf7\xed\x0e\x81\x80\x1e\x8c\x6c\x8c\x64\x0a\x5c\x83\x30\x61\xdc\x14\x23\xf2\x73\x3b\x77\x53\x09\x4f\x7a\x5b\xc8\x94\x67\xa6\xf2\x74\x80\x90\x1b\xbf\xa0\x92\x01\xc6\xcc\x97\x46\x8f\x7b\x21\x8b\x32\x1f\x3a\xeb\xac\x35\x6c\xed\x06\xb9\x2d\x8e\xf0\xa4\x1f\x78\x7e\xbe\x4f\x73\x98\x2b\x3d\x9f\xc6\x43\x19\x70\x1e\x53\xb7\x42\x5b\xf9\x47\x53\x2d\x73\x65\xb7\x66\xa0\x13\xdd\x89\x2e\x17\x15\x6e\x18\x69\x05\xbd\x74\x72\xdf\x54\x33\x61\xd0\x6b\xad\x87\xd3\xae\x4a\xf3\x0a\x73\x9a\x69\x29\x4c\x48\x17\x25\x0a\xea\x2f\x73\xc0\x4f\xa6\x15\x89\x88\xdb\x26\x4e\xd6\x1c\x5f\xd4\x75\x5f\xf7\xa3\x13\xcf\x0b\x59\xec\x72\xf6\x79\x53\x3d\x43\x39\x4c\x88\x25\x5e\x20\x64\xe0\xa4\xfa\x40\xed\x06\x09\x97\xcf\xb3\x2d\x89\x17\x0b\x9c\xe3\x9a\xa7\xd9\x92\x8f\x48\x5c\x74\xe2\x09\x13\x77\x52\x70\xca\x0a\x13\x8f\xec\x86\xe2\xf8\x32\x7e\x0c\x64\x98\xea\x69\x1d\xe5\x22\x47\xd0\xfc\xb5\xbc\x4c\x77\xa6\xc6\xfc\x62\xdd\x33\xcc\x75\xd4\xfd\x6e\xa0\x25\xbe\x34\x5e\x2d\x66\x90\x4f\xb3\x86\x42\xe2\x4b\x69\xe5\x12\x31\x55\xfc\x9d\xe7\x02\x7e\x5e\x5e\x2a\xd0\x84\xe9\x41\x35\x1d\x16\xe6\x4c\xde\x86\x78\x01\xee\xa3\xf7\xc5\xeb\xfa\x22\x50\x9f\x84\x24\x66\x46\xbe\xae\x6c\x2f\x52\x8f\x8b\xd2\xfe\x98\xb4\x15\x5d\x24\xf4\x28\xc7\xbe\x62\x12\x79\x11\xb5\x83\x14\x15\xab\x2e\xf0\x5f\x9f\x60\x68\x92\x48\x29\xe4\x76\x3d\x72\x07\x82\x39\xb9\xeb\xc6\x84\xe1\xb0\x7b\x48\xf3\xf4\xc1\x6c\xd0\x26\x90\x7e\xd5\x9a\x9f\x61\x71\x18\x6c\x38\x49\x4c\xc1\xd4\x47\xf2\xaa\x82\xf2\x66\x12\xad\x4a\xe2\x38\x8c\xfc\xbe\x1c\x65\xa8\x16\xa3\x93\x58\x07\x18\x27\x1f\xe5\xcf\x66\xd7\x84\x84\x71\x97\x20\x91\x6f\xf3\x7c\xf5\x57\x06\x31\x93\x09\x62\x94\xac\xdb\xfb\xbc\x7e\xd9\xaf\x77\x5f\xdb\xff\x2e\x5e\xee\xff\xee\x09\x80\x75\x92\x28\x4e\xf9\x68\x96\xcf\x28\x5c\xeb\x24\xd1\x5c\x74\xd9\xf7\x1f\x65\x7a\x45\xec\x5d\x27\x1c\x38\x86\x27\x32\x5e\xd5\x7b\x3b\xf2\xf6\xaa\x4f\xfb\x26\x82\x32\xf3\x68\xed\xfb\xdc\x5a\x1e\x6f\xd5\x1d\x0d\x8d\x1a\xf0\x91\xff\xdc\x42\x86\x78\x8e\x4d\xfe\x5c\x82\x4c\x7b\x1a\x79\x9d\x08\x16\x8b\x31\xd9\xd4\x0a\xaa\x3a\xcd\x4d\x24\x76\x64\x7b\x27\x82\x4b\xa4\x40\x59\xac\xbe\x6f\xb6\x4f\x2f\xdb\xfd\x62\xb5\x7a\x59\x6f\xb7\xdd\xb5\x04\x73\x1a\x8f\xd6\xa5\x6a\x3f\xd9\xff\x34\xa9\x7c\x43\xd0\xb5\xa9\xc5\xb6\x8d\x65\x12\x22\xf9\xd2\xdd\x6a\xb9\x90\xd2\xa3\xdd\xef\x40\xd1\xee\xc6\x00\x55\x70\xd7\x6d\xea\x09\xf8\x94\xaa\x61\xa9\xea\x43\x9a\x5f\xe9\x39\x20\x09\x52\xba\x1d\xd3\xfc\x26\x55\xa8\x9b\x71\xca\xd2\x6e\x47\x4d\x80\x06\x78\x6f\x23\x85\xf2\x36\xb8\x47\x28\x44\x4f\xca\x8f\xcb\xe0\x95\x35\x3d\xd1\x22\xc1\x85\xba\xfd\x3a\x37\x16\x6c\xbb\x76\x86\x21\xf7\x7c\xa3\xef\x79\x06\x5e\x3e\x69\x8b\x6b\xe8\xbb\x9d\x07\xc2\x88\xb2\xb9\xb2\xd4\x77\x32\x1f\xf2\xe3\x81\x8d\x41\xa2\x7f\xe5\x3a\x89\x53\x16\x31\x36\x04\xc9\x6c\x6a\x38\x6e\xd4\xf8\x7b\xf1\x90\x28\x61\xec\xdb\xf7\x54\x39\x37\x60\xc4\xa9\x30\x7e\x27\x1e\x79\x5e\x00\x36\xb5\xb6\x3c\xf0\x76\x2d\xb6\x13\xaa\xbb\x66\x04\x8c\x1a\x1a\x9c\xe6\x6f\xa4\xe7\xea\x7b\x8f\xc7\x3c\x4e\x98\x63\x6a\x84\xdc\xe2\xf9\x4c\x15\xe5\x9f\x70\x65\xb7\xe6\xb1\x88\x05\xe9\xd5\xf5\xb5\xc9\x1c\x8c\xdb\x30\x8f\xa0\xa5\xbe\x6d\xd7\xe8\x1a\x5e\x8b\xf2\xfc\x38\x21\x82\xd5\x9c\x85\x5c\x74\x35\xaa\x66\x8e\xdf\x16\x23\x62\x45\xd7\x30\x16\x46\x7d\x3b\x2b\x2a\x78\x38\xdf\x5d\xb8\xef\x9c\x09\x10\x64\x96\x32\x74\xf2\xf0\x4c\x87\x8e\xe2\xd2\xf1\x26\x4f\x57\x5a\xdb\x32\x09\x8d\x18\x11\x66\x88\x2d\x55\xc7\x7c\x9d\xb9\xe6\x89\x04\x35\x52\xf5\xba\x6d\x72\x28\x3b\xc7\x85\x27\x40\x59\x34\x08\x01\xcd\xf0\x11\x8d\xdf\x98\x07\x1c\x0b\xd6\x38\x2e\x48\x4f\xfa\x66\xbb\x73\x55\x8a\x93\xbe\xe1\x9c\x20\x0f\x4c\xbe\xe4\xb9\xf9\x88\x98\x8b\xc6\x7a\x24\x77\x7b\xe1\x69\x8c\xc4\x1c\x4d\x96\xec\x87\xc9\x92\x55\xdd\x61\x9f\xe2\xc7\xe2\xf8\xe8\x83\xba\x54\xcd\x05\x0d\x31\x55\xe4\x56\x9b\xed\x45\xc9\xf8\xa4\x27\x44\x1c\x92\x01\xc7\x42\x6b\x09\x99\x08\x5d\xe7\xb7\x4c\x3d\x18\x2e\x03\x0f\xf7\x6a\x05\xef\xbe\xd9\x3e\x83\xe7\xce\xbc\xe5\x92\x29\x19\x76\x55\x13\xd3\x58\x5d\x7b\xa9\xdf\xa0\xda\xd2\x5c\x26\x91\xe7\x66\x4a\x37\xd4\x7e\xf0\x77\xa8\x7e\x87\xaa\x4b\x73\x25\x42\xc7\xb7\xfd\xe3\x2b\x1f\x6d\xdd\x1c\x68\x80\xb8\x08\x4c\x25\x39\x79\x71\x7b\x4c\x07\x71\x1c\x1a\x64\xd9\x5d\x3f\x01\x7e\xb3\xd6\x6d\xfe\x59\x84\xc7\x19\x86\x8b\xcc\x2e\x8a\x0e\xba\x18\xec\xe7\x7d\xd7\x0a\x4f\x1a\x0e\x2c\xb3\x04\x1b\x72\xb3\x11\x51\x80\x8b\x03\x0a\x3f\xb0\x7c\x94\x63\xc8\xf4\x64\xab\x75\x61\x28\x11\x44\x1a\x4b\xfd\xab\x8f\xb4\x96\x07\x67\x62\xba\x1e\x11\x01\x18\x78\x86\x68\xce\x0f\xcb\x9d\x0d\x2d\x0f\x32\x5b\x57\x5e\x8c\x84\x06\x6f\xbf\x5d\xba\x75\x59\x10\x46\xa9\xa9\xb7\x31\xd0\x52\xfb\x33\xf5\x7d\x1c\xb2\xf0\x2e\xbb\x9f\x84\x17\x7b\x2e\x39\x50\x3d\xa4\x79\x0d\xea\xb6\x28\x07\x1f\x43\x50\x90\x06\xc8\x5e\x1c\x4f\x19\x4f\xf3\x2b\xf2\x3e\x5a\x84\x01\x35\x6c\xef\xbc\xaa\x11\x3b\xea\x7e\xa7\x1a\x6d\xe0\x31\x1f\xf3\x18\xf8\x21\xc2\x90\xa0\x12\xfc\xed\x7d\xf7\x16\x61\xa2\x31\xeb\x2b\x9a\xf3\x35\x8f\xa5\xe9\xc9\x9d\xb4\x08\x79\x84\x1c\x18\xca\x7d\x2b\xfb\x7b\x14\x1a\xd5\x09\x6e\xd3\xaf\x58\x15\x6f\x97\xed\xe9\xaa\x29\xa2\x28\x0c\x0d\x0a\xbe\xa9\xea\xde\x0f\xf8\xdc\x07\x10\x51\xa4\xb8\x03\x4a\x1a\x64\xcd\x93\xfe\x9e\x56\x13\x32\x15\x2d\xe2\x28\x8c\x4d\xe0\xb8\xcf\x93\x58\x70\xf3\xa4\x61\x12\x20\x99\xd5\xd3\xe3\x7a\xff\xf5\xdb\xe3\xea\x65\xbd\x6a\x8d\xb2\xe5\xcb\xfa\x71\xe7\x2c\x11\x11\xf3\xd0\x29\x63\x2d\x21\xaf\x9a\x12\xd4\xcd\xf9\xcb\xa8\x4f\x62\x29\x7c\xe5\xbc\xb8\x3f\xcf\x72\x58\x55\xe1\x9a\x40\xe4\x75\x4a\xb4\x6b\xb7\x16\xbb\x7b\x24\x24\x61\x7a\x44\xd7\x87\xe0\xa3\x49\x3c\x4f\x24\x8a\x21\xc6\x4b\x34\xe7\x11\xd9\xe7\x4c\xf1\x8e\x48\x94\xd1\xed\x79\x75\xa4\xce\x8b\x11\xc1\xd6\xf8\xc2\x9c\x18\x81\x80\x03\xb7\xc8\x17\x3f\x70\x47\xa8\x44\xb4\x16\x97\x12\x4e\x63\x07\x43\x70\xe6\x61\xe1\xd3\x29\x95\x6f\xe8\x7f\x4e\x60\x33\x82\x2b\xc3\x2a\x6f\x0b\x88\x6e\xcb\x8b\xdd\x51\x08\x22\x90\xdd\xa0\x3a\xa4\x75\x7d\xb6\x14\xc8\xee\x18\x48\x8c\xc9\x3c\x17\x15\xe2\x33\x32\xa8\xaf\x4e\x0b\xe9\x99\xa4\xa4\xc0\x48\xc9\x1e\x41\x06\xf3\xbb\xa7\x90\x9e\xd1\x5b\xb4\xba\x28\x06\xea\xec\xee\x09\x84\x10\xee\xa4\x92\xaa\xfa\x26\x55\xaa\x9f\x3e\x40\x80\x7a\x5d\xda\xa0\x3d\xde\x1d\x51\x09\xe6\x23\xd6\xb7\x8b\xdb\x9e\xfc\x58\x0b\x1d\x9b\x2c\x3a\x7e\xf6\xea\x47\xda\x6d\x7c\xd2\x23\x91\x89\xea\x17\xc5\x5b\xd1\xfd\x08\x09\xe6\xb2\xf6\x5c\x29\x57\x81\xd2\x13\x1e\xcf\x4f\x0b\xe9\x7b\x1e\x32\x5c\x2e\x17\xf7\xf7\xad\x2f\xf1\xd7\xf2\xeb\xe2\xf1\x6e\x48\x0f\xa1\xa5\x1f\x08\xdf\x14\x21\xdd\x59\x11\xfb\xfb\x1e\x3f\x23\x7d\xe1\x31\x5b\xb0\x65\xe2\x08\xd7\xd1\xca\xd2\x97\x0c\xf5\xff\xec\x86\x6d\x9d\xed\x8e\xac\xd3\xb6\x0a\xa8\x29\x6b\xfe\x87\x1b\x81\xa7\xa1\x6d\x27\x09\x31\xa5\x05\x59\x29\x47\x45\xe4\x5a\x12\x16\x45\x66\xe6\x6e\x0b\xdd\xba\xd0\x77\xc5\x84\xc3\xbb\x6d\xa3\x10\x53\xb9\x1c\xe5\xf2\x24\xe5\x3a\xb4\x34\x17\x39\x7c\x66\x11\x49\xaa\x03\xac\x06\xb6\xc5\x8e\x8d\x50\xe9\x7b\x75\x3b\xe1\x4b\xd0\x32\x0c\x15\x86\xca\x06\x6b\x81\x0c\x43\x93\x64\x16\x3d\xe9\xf0\xb8\x77\x22\xa2\xfc\x6e\xa5\x5f\xb8\xd3\xa2\x48\x23\x0e\xf8\xf9\x29\xa0\xdd\x6f\x89\x21\x1c\xba\x49\xd5\x73\xc6\xe5\x35\x20\x90\x8c\xc0\x10\x3f\x6e\x79\xdd\x65\xd8\x65\xec\x25\x8e\x14\x70\xe5\xb2\xe3\x53\x64\xf8\xd5\x4d\x5a\xc6\x81\x46\x75\xa2\x93\x85\x9a\x2f\x79\x96\x09\x2e\xdf\x46\xb3\x5b\xc6\xcc\xb0\xa8\x6d\x1d\x3f\xe3\xb8\x7b\x62\xe9\x3b\x68\xfe\xb7\xdc\xa6\xd2\x4d\x8a\x68\x57\x9c\xfc\xd0\x73\x8f\xca\x7c\x93\x22\x05\x95\xfe\x96\x02\xb5\x96\x2c\x94\xb8\x7c\x6f\x1e\x17\x7f\x0f\xe6\x92\x64\x9c\x8c\x14\xe3\x0c\x44\x69\xfa\xd9\x18\xd7\xae\x6a\xe8\xb6\x04\xd8\xe6\xfc\xad\x1b\x5e\x49\xc8\x30\xcf\x52\x1b\x45\xff\x6d\x91\x6d\xe6\x85\x17\xb4\xe4\x92\x86\x81\x5b\xd2\x5f\xf8\x1b\x0c\xd0\xaf\x92\x83\x4a\x0c\xdd\x06\xce\x6b\xbb\x90\xb8\xa3\x22\x4c\x98\xcd\x06\x9e\x06\x91\x42\x29\x18\xc1\xe8\xc4\x96\xe7\xb2\xf8\xf7\x38\x4a\xe5\x9a\x88\xd0\xb1\x93\x6c\x1d\x66\xad\xdc\x9d\x4f\xfd\x35\x84\x61\x37\xd8\x67\x45\xf1\xd6\x9c\xd0\x20\x76\x11\xcc\x4b\x05\x1c\x2d\xa5\x27\x31\x26\xac\xe0\x54\x82\xec\xfd\x7d\x29\x75\x80\xee\x99\xe0\xf9\xfe\x82\xdb\x53\x4b\xe5\x4b\xac\x54\x79\x4b\xb3\x6c\x93\x57\xf5\x55\x62\x14\x2d\x15\xf7\x63\xfb\xba\xbf\xcb\xa6\xa2\xa5\x52\xca\x8b\xfa\x12\x97\x97\xe5\xbc\xcd\x2e\xc1\x33\x84\xfd\x9d\x73\xaa\x9e\xf9\xf9\x08\x79\xdd\x69\x79\xbb\x86\x84\x62\x78\xee\x54\x9c\x9a\x8c\x97\x69\x7d\xb6\xb2\x7d\x33\x54\x6c\x5a\x02\x63\xf1\xb0\x22\xd7\x58\x07\x9f\x85\x21\x2f\xc1\x39\xca\x0b\xb4\x34\x5a\x1e\x88\x28\xfa\x96\x8b\x02\x91\xcc\xed\xc5\xe6\x5f\x47\x79\xdc\xe8\xce\xa3\xee\x45\x97\x6e\x54\x1e\x07\x5c\x35\xd2\xbc\x82\xf2\x0a\x1c\x46\x79\x40\x71\xf3\x69\xf2\xf4\x3f\x06\xaf\xdd\x3d\x89\x0f\xca\xf2\x0d\xd5\x0f\xbc\x7c\x4d\xf3\xdb\xa2\xfc\x9e\xca\xba\x28\xcf\x36\x75\x37\xa0\x70\xc4\xe6\x98\x69\xba\x7f\xba\xdb\x77\xa6\x48\xbf\xdd\x8c\xf5\x23\xdc\x39\x3a\xc1\x35\x03\x09\x63\x31\x0a\x38\xe0\xd6\xd3\x2a\x90\x80\xe8\x64\xdd\xe4\x72\x51\x96\xfc\xbc\xc9\x17\xe5\x2b\x2a\x8e\x54\xd3\x44\xb1\x22\x2a\xc6\x8c\xdb\x8f\x1f\x8b\x87\xe7\x32\x95\x28\x39\x58\xb6\xbe\xf8\x85\x5f\x3f\xe9\x03\x02\x80\x81\x92\xfd\xde\xc8\x11\x7e\xe6\xef\x29\xaa\x02\xf4\x6c\x6f\xb2\x06\xb6\x6f\xe7\x55\xc9\x5f\xbb\x0d\x4a\x85\x1e\xc3\x00\x1b\x96\x26\x3c\xa1\x24\xd9\xc4\xda\x52\x21\x65\x48\xb6\x70\x3c\x63\xf0\x66\xb8\xdb\xa8\x30\x32\x62\x7d\xf6\xce\xbb\xe2\xb1\x39\x2e\xd3\x7a\x2a\x86\xaf\x55\x18\x1b\xc1\xc3\x0a\xf8\x50\x50\x4a\xab\x90\x19\x24\x34\xfc\x3c\x61\x42\xd1\x14\xcc\x57\x43\xcc\x88\x8a\x02\x1d\xc6\x9d\x1c\xe5\x81\x97\xaf\xb0\x3f\x05\xdd\x51\x06\x28\x93\x9e\xc3\x87\xcd\x19\xbb\x03\x5a\x62\xc0\xa8\x9d\x23\x59\x96\xe2\xd3\xaf\xa5\x33\x32\x54\x4c\x7d\x44\xb5\xa4\xf9\xde\x0a\xf6\xa1\x85\xbc\x3f\x0d\xca\x8e\x54\x2c\x3c\x62\x48\x12\xe4\xdb\x2a\x7d\xef\x86\x2a\xe3\x86\xde\x02\xc1\x39\x45\x7e\x3e\x16\x4d\xb5\xe4\xa7\x49\xd7\x25\x2a\xc4\xa0\xd9\x03\xaf\x4b\xf8\x29\x87\xf8\xfd\x6b\x44\xbc\x5a\x71\x96\x78\x7d\x26\xf0\x0e\xf2\x97\xc7\x3b\xa7\x69\x35\xcb\x9f\xa0\x84\x2f\x71\xde\x7c\xa4\xf5\x61\xd5\x71\x28\x69\x25\x68\x84\xe6\xb4\x06\x18\xb9\x92\x4a\x92\xc8\x4b\xba\x5b\xac\xc6\xe4\x21\xae\x4d\x9c\x60\xa8\xd4\xe0\x3c\x16\xce\x27\xef\xe9\xc7\xb4\x02\x4f\x1b\xb2\xad\xa7\xfb\xf5\xfe\xfb\xfa\x71\xf5\xf4\xe2\x6e\x0d\x61\xc4\x2c\xae\x6a\x86\x3e\x6c\x98\xb6\x52\x9a\x87\x56\xaa\x08\x6e\x1a\x27\xd1\xab\xc1\x57\x1a\x6d\xc0\x8c\x57\x06\x51\x65\xf8\x45\xcc\x6e\x37\x10\x5b\xd7\xe0\xeb\xd0\x61\x4a\x4d\xf0\x7c\xb9\x58\x2d\x6c\x2c\xa6\xfa\xca\x4b\xd5\xc7\xda\x21\x20\x14\x54\xaf\xb8\x68\xa9\x6e\xfb\x72\x4b\x08\xb8\x40\x46\xad\x8e\x52\x72\x76\x5f\x84\x40\x86\x68\x15\xdc\xec\xb6\x0f\xc3\x19\x01\xc4\x0f\x71\x43\xe1\x86\xf1\x6a\xdd\x3f\x26\x91\x3e\xc2\x5f\x1e\x16\x8f\x5f\x17\xbb\xdd\xe2\xf1\xf9\xe5\xe9\xaf\xbf\xe9\xee\xeb\x76\xe7\x9a\x50\x5f\xa3\xb3\xc2\xe5\x7f\x9a\xd4\x84\xbe\xaa\x51\x3a\x04\x28\x21\xca\x94\x25\x39\x9a\xa3\xf1\x90\x03\x4a\x00\xd7\x40\x6d\x74\x64\x2b\x4b\x82\x55\xb5\x4b\x6d\x8e\x56\x49\x7b\xb9\xef\xbc\xb5\x3d\xdc\x29\xc0\x31\xb7\xd7\x6e\x72\x66\x75\x40\xb9\xb6\x6e\x53\xfe\x34\x22\x00\x71\x42\xd0\x0e\x35\x44\x03\x5f\x79\xae\xb2\x6b\xe9\x7a\x88\x65\x80\xa2\xa0\x2b\x8e\xa2\xdc\x95\x43\x0f\x74\xaf\x17\x2b\xc3\x9e\xf4\x00\xca\xe6\x96\x86\x7d\xcb\x88\xc0\xe0\xab\xe5\x88\x1a\xf7\x0c\x93\x31\xb3\x02\x8e\xc3\x72\xe7\xb9\xd8\x1d\x24\x91\x8f\xc1\xea\x21\xdd\x72\xdb\x5f\xad\xc3\xba\x2c\xba\x4b\x72\xeb\x40\x63\x18\x75\xfd\x53\x1e\xba\x03\xcc\xd7\xae\xc8\xae\x38\x62\xf0\x7f\x93\xf7\xd4\x03\xc0\x13\x81\xbe\xf2\xf2\x90\xe6\x87\xe5\x6f\x4d\x7b\xe0\x52\x52\x9b\x61\x3d\x16\xf9\x27\x45\xee\x20\x7c\x0f\xd9\xb0\xba\xa4\xf6\xe4\xe2\xa3\xcb\x0a\xdf\xe0\x44\x44\x83\x79\xba\xc9\x68\x11\x24\x46\xb7\x73\xf1\xf0\xf4\xed\x71\xb7\xef\x68\x8c\x34\x08\xc1\xd0\x39\x41\xa5\xfd\x0c\x8b\x54\xc6\x5c\xa0\x9f\x1b\xd7\x20\x79\x64\xf5\x72\x31\xc9\xe2\x86\x61\x17\xd8\xbb\x24\xf1\x76\x27\x82\xa6\x63\xca\xfe\x6a\x8e\xea\x5a\x83\x0a\x28\x06\xb8\xd4\x42\x5d\xb2\xd6\xf4\xab\x14\xa8\x50\x49\x8b\xa3\xdc\x42\xae\x10\x05\x3e\x58\xc5\x00\x48\x20\xdc\x52\x6e\x32\x0a\x23\x0a\x94\x49\xe7\x43\xc8\x69\x5f\x17\xf2\x9e\x2a\x14\xd2\xbb\x74\xb2\x47\x49\x63\xed\x71\xaa\x0c\x03\xec\x6d\xbf\x70\x69\x9f\x31\x39\x24\x41\x78\x4e\x7f\x42\x36\xac\xd4\xf4\x27\xcb\x8e\x0e\x28\xc5\x44\x97\x3b\xe3\xe6\xfc\x0b\xe5\x26\x77\x1e\x98\xf3\x38\x62\xa7\x97\xeb\xa7\x71\x5f\xea\xd6\x09\xb7\x15\xd9\x3c\xcd\xd3\xfc\xf5\x0e\x72\xa8\xd2\x6a\xc9\xbb\xcc\xa0\x26\x89\xb2\x45\x7c\x46\x41\xd7\x6e\x1b\xe3\x24\xa9\x26\x2a\x8c\xad\xf4\xb1\xa9\x85\x9c\xe1\x00\xc5\x56\xd0\xc9\x84\x54\x75\x06\x97\x68\x4d\x4d\x3d\xcf\x31\xa9\x59\xcf\x62\xa8\x28\xe0\x1a\x05\xc0\xed\xc7\x43\xbe\xdb\xa9\xb2\x89\xd6\x94\x48\x2c\x8a\xde\xdc\x2e\x1f\x6f\x86\xcb\x89\xa6\x32\xf1\x7b\x2c\xfc\x14\x36\xa0\xa9\x32\x6a\x9c\xc8\x8f\xd4\x54\x87\x7e\x72\x68\xaa\x7d\x2c\xb4\x29\x4a\x2e\xb3\xf4\xbf\xb0\xff\x4f\x03\xe5\x45\xdc\xd0\xfc\xf9\x5f\xdf\xda\x7b\x3a\x64\x1a\x87\xce\xb1\xc8\xeb\x43\x40\x6d\x50\xae\xf3\xe8\x75\x2c\x84\x67\x94\xf9\x74\x93\x2b\x23\x67\x33\xcb\x9e\xa1\x19\xe3\x4c\x75\x62\x0b\x13\xc4\xb3\x66\xcc\x70\x53\xbc\x14\x67\x9e\x8d\xe5\xf4\xb5\x66\x89\x44\x12\x1e\x93\xc0\x72\x2a\xc0\x73\x53\x58\x33\xa9\x93\xbe\x69\x3f\x6c\x93\x00\x2c\x5d\x6e\xd9\xee\x14\x57\x28\xae\x74\xc2\x39\x2e\x92\x26\xbe\xe0\xca\x7f\x8a\x09\xfb\xb8\xd6\xc2\x57\x18\x75\xf9\x70\x90\xca\xf1\xda\xd7\xcf\x54\x2d\x80\x22\xa1\x8e\xd5\x6c\x4a\xff\x0b\xff\x1f\x6d\x6f\xd2\xdd\x38\x8e\x6c\x8f\x7f\x9d\x5a\xf4\x02\x00\xe7\xa5\x2c\xcb\x4e\xbf\xb2\xd3\x6e\x4b\x59\x59\xdd\xef\xbc\xa3\x83\x21\x20\xb3\x2c\x91\x6a\x92\xb2\x53\xfd\xe9\xff\x87\x11\x00\x27\x51\x99\xf5\x5b\xfc\x17\xdd\xce\x12\xc1\x09\xc4\x10\xc3\x8d\x7b\xb1\xdc\xd4\xa3\xed\x4e\x0e\x28\xf7\xd3\x30\x91\x35\xca\xe0\x3a\x6b\x01\x7d\x59\xc2\x65\x74\x76\x49\x7f\x33\x1b\x03\x8b\x3b\x79\xdb\x0f\x99\x23\x91\xd4\xbd\xec\x49\x1b\xac\x55\x0a\xcb\x14\x9d\x2a\x97\x2c\xde\x5b\x13\x3e\xff\xef\x68\x24\x71\xc6\x18\xb7\x24\xbf\x03\x2e\x73\xd7\x8e\x76\x62\x75\xbd\x1a\xaa\xf0\x4f\xd2\x9e\x2e\x2c\x0e\xc4\xef\x65\xd5\xbc\xed\xa1\xae\x7d\xa1\xc1\x60\x03\xe4\x8c\xf1\x28\x40\xa1\x25\xe2\x91\x25\x25\x18\x7f\x48\x07\x59\x27\x65\x55\x3b\x39\x51\xb3\x29\x1f\x9c\x35\xcc\x19\x13\x49\x8a\xa2\x93\xe8\xc9\xbb\x0c\x89\xf0\x07\x83\x30\xb3\x98\x58\x2e\x4b\xb3\xbd\x39\xc3\xf6\x7b\x59\xed\x4d\x77\x34\x65\xa8\x00\x97\xd7\x2f\xa7\xe3\xf1\xbc\x3e\x96\x55\xd3\x3d\x55\x20\x35\x5a\xd9\xfa\x54\x37\xe5\xe1\xce\x87\x58\xa6\xcb\x55\x67\x10\xb6\xa7\x80\x30\xce\xa9\x98\x74\x64\x28\xc8\x41\xec\x96\x29\xd7\x9d\xbd\xd0\x21\x67\x2c\x8a\x23\x8f\x30\xdf\x9c\xaa\xa2\xfc\x18\x17\x9c\xb7\x2d\x32\x85\x4c\x91\xa6\x44\xff\xe9\x70\xec\x02\xf8\x9c\xb1\x58\x86\x68\x40\x39\xd9\x2c\x84\x6a\xcd\x16\x8f\x70\xc6\x12\x21\xb1\x34\x63\x0d\xcd\xe9\xe8\x9c\x8f\x4b\xf4\x47\xdb\xd0\x26\x18\x95\x83\xaa\xf5\x2d\xc6\xc7\x52\xa1\xac\xf5\x81\x83\xa6\xac\x6e\xf2\xfd\xfe\x4f\x03\x8d\xcc\xf7\x97\xdd\xd4\x8f\x8a\x34\x09\x12\x6f\xc9\x6e\xcb\x82\x34\x7d\x57\xff\xb9\xa1\xed\xc7\xbf\x4d\x2a\x85\x8c\x06\x52\x85\x8f\x54\x65\x8c\x0c\x22\xe3\x77\xc9\x62\x8d\xe1\x1a\x6f\xf8\x5e\x80\xa4\x26\xef\x9e\xa5\x92\x6c\x55\x3f\x35\x26\xd7\x93\x0c\x1c\xe1\x27\x12\x72\x50\x84\x63\xca\xea\xf8\x37\x60\xea\xed\xa5\x38\x0d\xb0\xf6\x25\x7a\x2d\xa5\x07\x53\x5f\x7d\x38\x19\x01\xa6\x24\x0f\x98\x63\x1a\xc3\xee\xdb\xc3\x3a\xe2\x8e\xdf\xff\xf5\x62\xa3\xff\xd9\x54\x94\x5a\x92\x4c\x46\xdb\x97\xdd\x56\x8e\x07\xc0\xba\x24\x58\x59\x39\xea\xf5\x7e\x1b\x6a\x1b\x58\x2f\xc1\x8f\xd0\x62\x6f\x2c\x72\xc6\x54\xca\x91\xb3\x68\x5f\x4a\xd3\x95\x6a\xb5\xbf\x6b\xc0\x0c\x5d\x53\x7e\x81\x1f\xe3\x8b\x29\x60\x99\x1b\xe2\x94\xdd\x9f\xe6\x32\x38\x63\x3a\xa6\x7d\x2f\x3f\x96\x2f\x7b\xd9\xd8\xb2\x3a\x0c\x6c\x2e\xdf\x28\x95\xc6\x09\x91\x2e\x17\x87\xd2\x9c\xf6\x27\x97\xbc\xf0\x0d\xb2\x14\x17\xf1\x76\x39\x70\x01\x11\x7f\xc4\x98\x8c\x7b\x1a\xa5\xbe\x72\x8d\xa2\x1b\x9c\x31\x93\x00\x06\x6c\xef\x4e\xfa\xfd\x4e\x6a\x50\x65\xf9\xde\xd5\x5c\x70\xc6\x80\xa7\x23\x8d\xd9\x2f\xe5\xfe\xba\x2a\x8b\x3f\x27\x24\xdd\x4e\xf8\x80\xea\xbc\x35\xf2\xbc\xcd\x0f\xdb\x9a\x8a\x91\xfb\x0b\x1b\x46\xd4\xe8\xbd\x8f\x84\xa4\xba\x54\x19\xf8\x13\x67\x86\x33\x66\x05\x31\xa8\x50\x2d\x49\x07\xf2\x5f\x18\x93\x4f\xc1\x3b\xd8\x1a\x12\x8a\x2a\x36\x50\x1d\xf2\xa2\x5d\x34\x65\x75\xbe\x24\x6c\x6f\xdb\x26\x11\x0a\x24\xac\x6e\xbf\x79\xc0\x53\x2f\x75\x8e\xc7\x65\x32\x2c\x41\x99\x87\xba\xfa\xc6\x86\x09\x97\xd9\x53\xe5\xc7\x74\x17\x1f\x0e\x95\x76\xb5\xc3\x38\xb0\xb3\xc3\x1d\xb2\x7d\x3c\x56\x38\x0b\x48\x3b\x12\x87\xb5\xcf\x3e\x3f\x14\xb7\xf2\xec\xd7\x71\xce\x93\x08\xd3\xb9\x37\xcf\x5f\xbf\xad\xb7\xb7\x8b\xcd\x6a\x3d\xb9\x08\xcf\x22\xd1\x55\x9e\xcd\x16\x69\xf8\x86\x32\x0e\xa2\x6e\xdb\xec\x93\x26\x77\x00\x97\xe3\x98\x07\xd2\xe0\xd2\xf9\xbb\xcc\xab\x72\x90\x40\xe1\x8c\x87\xc2\xb1\xb4\xa0\x55\x4b\x1f\x67\xbc\xa3\x70\xdf\x52\x12\x2b\x0a\x86\xed\xdc\x94\x29\xdd\xbc\xb9\x85\xa2\x3c\xe4\x45\xc7\xe7\xce\x19\x8f\x44\x16\xb5\x43\x08\x03\x7c\x3d\xd7\x09\x67\x3c\x4e\x12\xca\x19\x20\x68\x3d\x58\x75\x2b\x00\x8f\x25\x05\xc3\x6f\xe4\x3e\xff\xe8\x7e\x04\xc2\xde\xaf\x8e\xf9\x1e\x8e\xb5\xdf\xa3\x78\x12\x66\x18\x00\xbd\x2f\xbb\xf3\x13\x87\x12\xf9\x02\x79\x45\xa5\x91\x6f\xf9\x71\x49\xdc\xf0\xf3\xab\x1c\x4f\x79\xa2\x06\x49\xba\x95\xeb\xc7\xaf\x2e\x41\xd2\xb6\xb0\x22\x73\x41\x69\xca\x29\xf2\x78\xec\x5f\xb8\x76\x59\x1c\xe0\x1a\x44\x3d\xe9\xcb\x1f\x46\xdf\x2f\x9d\x7c\xc5\x2c\x76\xd4\x17\xb4\xa3\xbc\x82\xad\x27\x5f\x2e\x33\x3a\xca\x7a\x17\xf2\xc2\xa2\xe3\x8c\xcb\xc0\x7a\xc9\x80\x07\xfa\xb6\x83\x05\xfe\xf9\x08\xc5\x6f\xc3\xc6\x69\x8a\xf6\xe8\x63\xb9\xbb\x81\x02\x6c\xae\x73\x59\x9d\x5f\x64\x6e\xc6\x73\x8d\xcb\x8c\x27\xe0\x44\x2c\xb0\x6a\xf7\x76\xbc\x9b\x5e\x5b\xe8\xe7\x87\xab\xb4\x1c\x7d\x64\x8c\xe9\x57\x39\xd4\x23\xb3\x8b\xab\x98\x34\x3d\x5f\x91\x01\x6d\x45\x20\xea\x51\xf1\x9f\x6f\x98\x50\xa5\xce\x87\x6a\x46\xa3\x58\x65\xa4\x20\xda\x2e\xe6\x54\xe4\x7e\x5f\x95\xa7\xe3\x0c\x8e\xc6\x9d\xa0\x25\xc7\xec\xc8\xbf\xca\x52\xc9\x1b\x39\x40\x77\xf8\x4b\x9a\x88\x2c\x28\xe4\x87\x59\xb7\x3b\x92\xb9\xcb\xf7\x30\xc1\x77\xb5\x0d\x33\xaa\xec\x7b\xf3\x22\xb8\x93\x42\x13\xce\x38\x70\x2b\xb4\x33\xba\x7d\x86\xe7\x57\x60\x98\x51\xff\x41\x40\x8c\xf1\x15\x7c\xe4\x1f\x9d\x9e\x49\x7b\x20\x92\x58\x76\xd8\x8e\x8f\xd2\x36\x7a\x1c\x3e\x6d\x1b\xc4\x14\x4b\x3b\x56\xd0\xee\xde\xdf\x8a\x7d\x7e\xc8\x1b\x30\xe3\x62\xbb\xb6\x61\x9a\x61\x96\xca\x96\xd5\x50\xac\xd6\x1d\xb5\x3c\x40\x80\x3d\xd1\xd7\x0d\x64\x51\xe6\x58\x60\x39\x13\x2c\x8c\x71\xd2\x36\xe5\xe7\x00\xe3\xce\x99\xe0\x71\x3a\xc0\x22\x63\x21\xd1\x4c\x40\x96\x33\x21\x54\x80\xa1\x89\xa3\x8b\x6f\x8d\xa9\x41\x5c\xa3\xc0\x44\x88\x35\xc6\xe4\xd8\x2d\xe8\xd6\x34\x6c\x5f\x4a\x2c\xf4\xc0\x1e\x15\x61\x14\x11\x96\x5a\x16\x79\x73\xde\xe2\x27\xf5\xc7\x22\x37\x7d\x60\x0f\x7a\xa8\x69\x78\x2d\x6f\xdd\x9e\x92\x2a\xdc\xe1\x5c\xfe\xe8\x57\x73\xc2\x9d\x95\xf0\x20\x08\x7b\x63\xee\x61\xf9\x4c\xf0\xb4\x2b\xad\xd3\x08\x23\xf2\xbe\x1c\x84\x7c\xac\x71\x17\x25\xa9\xf2\x51\x19\x67\xb2\x8e\x52\xee\xe3\x2f\x92\x80\x08\xc5\x08\x06\xbc\x6e\x2a\xa2\x9b\x1e\xdf\x39\x15\x0a\xa1\xcd\x54\x0d\xd7\x97\xe0\xb7\x87\x62\x1a\x23\x47\x59\xd5\xf0\x3b\x9c\x3b\x90\x86\xb7\x58\x44\x9a\x6a\x64\x90\x42\x17\xa8\x75\x8d\x7e\x6a\x95\x8a\x14\x48\xa3\xa5\x79\x83\xe5\x59\x41\x45\xc9\x54\x22\xc7\xf4\x49\x2d\xce\x44\xc6\x00\xa1\x0f\x9a\x2a\x27\x9c\x4c\xe1\xcf\x2f\x2d\xb5\xc6\x94\x9a\xcd\x2b\xc0\x64\xf1\x63\xb9\xf3\x26\x7d\xfb\x86\x36\xe9\x64\xbd\x10\x2d\x08\xf9\x25\x2c\x9a\x33\xa1\x33\x81\x34\x0c\x72\xdf\x83\x40\xfd\x21\x88\xa3\x8e\xf1\x7e\x3f\x65\x7f\x77\x8d\x8c\xe3\xb2\x77\xf0\x60\xa2\x00\xa5\xd0\xf1\xf8\x63\x42\x94\x22\x80\xa8\xc9\x0f\x50\x9e\x9a\x45\xd7\xe9\x90\x2a\x67\xa8\xee\xf7\x45\xf9\xe9\x7f\xb6\x96\x21\x16\x94\xb0\x93\xc3\xd5\x30\x60\x59\x82\xa5\x42\x04\x17\x46\xc1\x87\xba\x91\x87\x63\x77\x5c\x92\x3c\xb5\xab\x93\x6a\x3d\xee\x6d\x31\x5d\xd7\x02\xa6\x09\xe3\x58\xa3\x54\x8b\xc9\x1b\x95\x4f\x9e\x39\x60\x20\xb0\xa0\x6a\x53\x95\xd7\x29\x45\xdb\x76\x56\x60\x5c\xd9\x19\x50\xc8\xc4\xe6\xbf\x45\xc0\x43\x0a\xd9\xdc\x3f\xff\x79\x3d\x0a\xdb\xb6\x8b\x89\xd8\x8f\x7c\xbc\xbc\x2c\xd0\xfb\x6f\xcd\x46\xca\x74\xdd\x9c\x2f\x54\x8b\xdb\xb3\xb2\x90\x27\x1d\xce\xe6\xcb\x44\x36\xbc\x6d\x00\x01\x5a\x23\x48\x13\x82\x79\xdb\x51\x5f\x72\x08\x62\x22\x8c\x3e\xd5\x23\x96\x6c\xce\x02\x91\x02\xd6\xdb\xb6\x26\xf9\x5b\x3e\x3a\x2d\x88\x32\xed\x25\x98\x87\x31\x82\x20\x64\x0c\xe9\x42\x30\x8c\x30\x04\x5c\x74\xa0\x80\xb6\x91\x30\x98\x12\x84\xc2\x20\x99\xbf\xac\x86\x14\x74\x7e\x4a\x07\x61\x22\x85\x2f\x1e\x18\x40\x8f\xda\x23\x69\x16\xf8\xa1\x29\x8b\xf7\xdb\x73\x21\x0f\xb9\x9e\xbc\x79\xcc\x95\x15\xa3\xcc\xf5\xee\xca\xf7\x8b\xb3\x08\xa3\x6e\xb9\x2e\x5f\xde\x64\x0d\x34\x53\xba\x2f\x18\x2b\x85\x9b\xc3\xd3\xe2\x4f\xc4\xbc\xad\xbe\x6e\xba\x43\xda\x10\xe8\xd6\x79\x11\x4b\x0c\x61\xcc\x27\x37\x38\x0b\x12\x91\x22\x2c\xaf\x75\x0b\xf3\x62\x77\x77\x42\x5d\xad\xd9\x09\x1e\x24\x11\x25\xc0\xb1\x88\xc8\xc5\x32\xe6\xdc\x86\x20\x49\x58\x4c\x8c\xe4\xad\x7b\xb8\xce\x77\x45\xbb\xfd\xb5\x23\xcb\xaf\x94\x43\x73\x57\xb0\x39\x1f\x20\x48\x24\x45\x44\xa8\x00\xf1\x63\xd2\x95\x69\x9a\x32\x37\x57\x7a\xf5\x92\x49\x45\x3e\x67\x41\xa6\x6d\xa0\x3d\x7f\xf3\x90\x7d\x83\xb3\x40\x82\x41\x82\xa1\xbc\xf6\x49\x23\xcf\x3e\x03\x93\xcd\x38\x50\x2c\x42\x73\xe9\x58\x41\x33\x0d\xcc\x04\x2a\x32\xd2\xf4\x6b\x25\xce\x89\x07\x33\x87\x5f\x6b\x1b\x5b\x86\x9e\x4d\xb3\x7e\xbc\x9d\x9d\xc0\x73\x1c\x69\x9c\x05\x5a\x29\xcc\xea\x40\xf3\x76\x3c\x57\xf2\x90\x77\xaf\xa1\xad\xc4\xdc\x1f\xf1\x20\x90\xc8\xe9\x9f\x93\xe7\x37\x22\x96\xda\x5b\xd4\x15\x16\x09\xd4\x73\xdd\x05\x29\x8f\xfc\xca\x87\x39\xa2\x9a\xa4\x01\xbb\xc8\x58\x00\x86\xe3\xc0\xdc\xee\xa0\x59\xbf\xe7\xfb\xfd\x6f\x43\x93\x3c\x00\x9b\x21\xe6\xba\x03\x92\xfa\x32\xdf\x9b\x33\xc2\x26\x86\xfe\xe8\xe4\x0d\x6d\x20\x53\xaf\x0d\x7d\xaa\xe4\xb2\xdc\x3b\x56\x0c\x4a\x00\xb7\x2d\x32\x11\x4d\xa9\xfe\xe6\xe7\x4f\xc8\x58\x18\xc6\x1d\xef\x06\xd6\x27\xef\x27\x96\x7e\xd8\xda\x4c\xac\xaf\xf1\x90\xb9\xd3\x08\x2b\xab\x7a\xe5\x3c\xe7\x99\xbc\x04\x9e\x18\xa0\xa5\x80\xe4\xa2\xdf\x8e\xb3\xde\xb9\xff\xe0\x21\x4b\x62\xe1\xc2\xa8\xab\x1f\x3e\xe6\xda\xc0\xc5\xc3\x18\xdd\x11\xda\x6f\x9e\xc9\xf4\xf7\x9d\x1e\x32\x70\xd6\xd4\x5b\xf9\x79\x23\xfd\x9a\x13\x0a\x41\x6c\xe0\x3e\x5b\x55\xec\x60\xff\x07\xe9\x37\xf8\x16\x31\x0b\xc9\xe5\xde\x54\x27\x12\xe1\x1a\x4d\xb2\x50\xa4\x49\xec\x62\xf2\xb7\x79\x7d\xdc\x4b\x2a\xa7\x18\xbf\xaf\xd0\xa4\x3e\xb9\x83\xe6\x3b\xc0\xfb\x83\xf9\xe1\xaf\x1f\x18\x02\x3e\xb7\x8e\xdc\x43\xfd\x34\x5b\xc0\xc4\x59\x18\x0a\xc9\x5b\x1b\xe5\xbe\xfd\x1a\xbd\xf9\xe9\x8f\x06\x52\x05\x5e\x26\x1b\x4d\x75\x5a\x54\x2e\x73\x30\x6d\xe3\x48\x92\xe6\xec\x5f\x65\x4e\x65\xe9\xb3\xeb\x5a\x18\x2a\x4a\x66\x9e\x10\x3c\x3c\x72\x7e\xc2\x48\x10\x56\xe1\xa6\x2c\x75\x1f\xdb\x09\xa3\x34\xc6\x58\xe2\xfd\xcd\x72\x39\xfc\xb9\xf5\xe0\x7c\xfd\x7f\x97\x5e\x9e\xd9\x2f\xc3\xc8\x00\xa6\xa4\xf3\x7a\x55\x18\x0c\xf2\xfb\x6b\xc4\x4a\xc7\xe9\xa0\xe2\xbb\x68\x06\x29\x6a\xdf\xc6\x30\x8c\xcb\xf8\xd1\xdd\x4e\x52\x1c\xe1\x57\x1c\xbd\xc9\x0b\xc7\x20\x30\xa7\x74\xb7\x2f\x4b\xb3\x5d\x37\xb2\x30\xb2\x32\x5b\x1f\x75\xdf\xce\x25\x74\xe7\xa2\xbe\x61\x12\x46\xb8\xff\x9e\x6a\xa8\xfe\x0e\xb6\xbb\x3d\xc5\x24\x14\xa8\xa8\x00\xfe\x3b\x70\x71\xc2\xd4\x61\x60\x76\x30\xe4\xa0\xf6\x34\x62\xdd\x07\x49\xa5\xc0\xc8\xc5\x47\x0e\x9f\xdb\x8a\x60\xc4\xf3\xf3\x3a\x0b\x82\xd0\xfa\xcd\xfc\x27\x28\xb5\xb6\xa9\x4d\xd0\xfc\xa6\x28\x97\x6c\x60\x85\x7c\x5a\x93\x5e\x97\x51\x86\x85\xb1\x8d\xac\x68\x0e\xa0\xf9\x8d\x56\x7d\xf6\x5b\xd7\x06\x92\x68\xba\x7a\x3e\x2e\x36\x33\x2b\x68\x28\x35\xb0\x21\x0f\xe5\x4f\x29\x28\xe7\x06\x91\x8a\x13\x24\x7a\xd7\x94\xe1\x1f\xd6\x00\xb4\x47\x93\x14\xb7\x0f\xb2\x41\xb1\x78\xd8\x8c\xe3\x7b\xa1\x52\x09\x72\x6e\xdc\x13\x01\xef\xc9\xa1\x92\xc6\x37\xd1\xd4\xe6\x51\x1e\x54\x2f\x38\x75\x61\xdf\x5f\xd9\x92\xbc\xef\x11\x2a\x1b\xf1\xbe\x08\xfc\x66\x31\x86\x45\xfe\x2d\x27\x2d\x54\xd6\x66\xa4\x24\x5e\x3b\x2f\xe9\xca\x8c\xd6\x99\x76\x7a\xa4\xb8\xda\x75\x14\x59\x18\x7e\x98\x2e\xa7\x1a\x38\x06\xdf\x1f\xe5\xa9\xd0\x6f\x7d\xff\x99\x88\x92\x5a\x5e\xe7\xa8\x57\x3c\x6b\x0f\x26\x0a\x73\xea\x8f\xa7\xff\x0e\x17\x00\x03\x91\xe4\x5d\xb6\xf6\x50\x36\x8e\x3a\xc1\x1d\x86\x94\xe3\x73\x6d\x1d\x8e\xf6\x17\x73\x05\xb2\x4c\x74\xe6\xe8\xc0\x04\x0d\xad\x30\xe9\xe8\x3a\x17\x11\xfd\x4b\x25\x94\xf6\x34\x90\x58\xc8\x82\x62\x1c\xd0\x8b\x87\xb5\x56\xa3\x18\xf7\x4a\xc4\x19\x68\xe7\x68\x5e\x55\x51\x6c\x9b\xa5\x12\x7a\xa6\xf3\xe7\xbd\xc1\x48\xf4\x78\xe2\x44\x3c\xb3\x68\x9e\x7d\x47\xed\xed\xae\xb7\x22\x6e\x14\x3a\xdd\x58\x0b\x8c\x10\xc2\xd5\xeb\x32\x11\xdc\x1f\x17\x81\xb4\x9e\x57\xa2\x7c\x87\x43\x59\x2c\x6f\x27\x8f\x29\x22\xe6\x81\xe4\x68\x3a\xde\x5c\xc8\x90\x8f\x1f\x45\x44\x71\xcc\x3c\xb0\xa5\xa8\x4f\x07\xb8\xc0\x3c\x73\x16\x85\x19\x15\x2c\x37\x4e\x1b\x1b\xba\x47\x0a\x4d\x1c\x11\x57\xd9\x07\xd4\x4d\x9f\xe4\x88\xa2\x90\x4b\xe8\x5c\x99\x97\x66\x2d\x2d\xac\x0f\x72\xef\xbf\x59\x14\xa7\x99\xa4\x9c\x5c\xbb\xcb\x98\xf2\xb3\xeb\x86\x84\x71\xdc\xa7\x0a\xf8\x1c\x05\xc6\x4e\x03\xda\xea\xce\x54\xf8\xe5\x9f\xd4\x5f\x55\x03\x51\x28\xe3\x84\x0b\x6e\xcb\xdd\x6e\x1a\xda\x8b\xb2\x10\x90\xc3\xfd\x7f\x5e\xee\x5f\xaa\xf2\x2f\xd0\x4d\x77\x44\x87\xa4\x52\xfd\xfa\xfc\xfd\x76\xbd\x78\x5c\x6d\xbf\x2f\x1e\x1f\x57\xde\x75\x88\xa4\xd3\x3e\xc3\xea\x00\xb9\x5f\x9f\xb4\x86\xba\xfe\xb6\xbe\xed\x1a\x40\xa0\x5c\xd2\x0f\x03\xd1\x0f\xed\x46\xe7\xdc\x05\xbf\xfe\x44\x4a\x10\x6f\xf6\xf2\x0d\x86\x0e\x5a\xa4\x62\xe2\x21\xbb\xab\x4e\xda\x57\x5c\x71\x16\x69\x41\x20\x8e\xd6\xa5\x22\x52\x95\xee\xbb\x98\x00\x18\xe9\x83\xb4\x96\xed\xae\x3b\xc5\x64\x24\xc5\x65\xf2\xba\x35\xb8\x07\x12\x5e\x9c\x45\xc0\x04\xa6\x2c\xfe\x67\xfd\xfc\xf5\x28\x9b\xb7\x6d\x3d\x72\x3c\x66\x96\xdc\x08\xe2\xd4\x3a\x0d\xbe\x1b\x59\xbc\xf7\x1b\x53\x04\x92\xdc\xb0\xae\x5e\xa2\xd7\x61\x6b\x8f\x1a\x93\x52\xc1\xea\xa6\x7d\xd7\x63\xf7\x3b\x64\xe8\x58\x40\x61\xee\x50\xb1\xf0\x7a\x6e\x2e\xb2\x9a\x6a\x24\x5f\x57\xff\xfc\xb6\x5a\x6f\xb6\x77\xcf\xdf\xbe\xde\x2e\x36\x0f\xcf\x5f\xb7\x04\x6f\xf2\x17\xb5\x96\x05\x94\x8a\x33\x00\x07\xc7\xf4\x36\x3b\x7f\x63\x96\x65\x54\xae\xd4\x3e\x00\x15\x70\xdc\x94\x55\x55\x7e\x76\xeb\x60\xcc\x74\x86\x42\x00\xff\x7e\x78\x7c\x7c\x78\xfe\xea\x7f\xe6\x2c\x43\x46\x90\x57\x59\xb4\x93\xe1\xe6\x6d\xf8\x05\x63\x9e\x26\x89\x33\xaa\x57\x9b\x2f\xdf\xd6\xb7\xa6\x9d\xbe\xe3\x69\x16\xf3\x2c\xc0\xcf\x8c\xf8\x4b\xc7\x27\x39\xda\xa0\x62\x11\x50\x0d\xaf\x34\x66\xb1\x6f\x9e\x2b\xa9\xa7\x69\xd8\x58\x44\x99\x76\x70\xaa\xaf\x25\x49\xc3\x4e\x40\x8f\x9c\xc5\x41\x06\x38\xf9\x28\xed\xf5\x94\xef\x06\x35\x6d\x9c\xc5\x91\x08\xd1\x68\x3e\x9c\xf6\x4d\xde\x76\xc5\xaa\x79\x9b\xe3\x29\x71\xcd\xe3\x20\xf3\x69\x89\xe7\x4f\x92\x58\xf1\xc3\x20\x8e\xb5\x41\x2f\xf2\xa3\x6c\x50\x13\x70\x8c\x72\xfa\xc7\x4c\xdc\x3c\x4e\x2c\x4b\x92\x0e\x6c\x77\x6c\x60\x1b\xf2\xd1\x1e\x1c\x27\x36\xc0\xa8\x1f\xa6\xaf\x28\x8b\x50\xae\xfb\x74\x6f\x9c\x32\xe5\x2b\x11\x7a\x08\xf3\xd8\x74\x8e\x53\x2e\xb4\xf3\x82\x5f\x1e\x3a\x49\xeb\xd1\x6d\xd2\x28\xd5\x6a\xe2\xb4\x3b\xa4\x44\x3d\x20\xf3\x69\x5b\x1a\x16\x39\x64\x91\x7b\x33\xe6\x0f\x49\x9e\x0a\xe5\x73\x36\x07\x55\x0e\x90\xce\x9c\xc5\x4a\x64\xdc\xf9\xa6\xdf\x6a\x43\xfc\x02\x4b\x18\x1c\x37\x54\x65\x4f\x08\x98\xce\x10\x3b\x8d\x88\x6e\xaf\x6a\x81\x8e\x47\x86\x82\xc0\xcb\x19\xb7\x9e\xca\x8d\x57\xb8\x19\xcf\x00\xcd\x64\x38\x60\xe0\x21\x88\xb8\xdc\xdf\x40\x43\x9a\x94\xe3\x6b\xea\x28\xe2\xfc\x52\x5d\xff\xd2\x48\x9e\x64\x93\x62\x1d\x93\xc4\x36\x6d\x94\xaf\x90\x17\xb6\xac\x34\x98\xce\xd6\xfd\x6d\x62\x31\xc5\x46\xa4\x3c\x18\x86\xf8\x5a\x17\x66\x36\x1c\x1f\x43\x2c\x32\x36\x88\x47\xcf\xa3\x4f\xba\x59\x65\x63\x89\x98\x6f\x52\x1a\xbe\x7b\x78\x5d\x6f\x66\xaa\xc9\xb0\xa1\xc5\x85\x84\x8a\xed\x68\xef\x18\x7d\x4e\x9b\x24\xb8\x7c\xe1\xc4\x79\x9a\xea\xfe\x5f\xd0\x9a\xb5\x67\x64\x22\x20\x6c\x67\xbb\x2a\x4d\xd3\x7f\x93\xb6\x5a\x25\x7d\x28\x14\xe7\xd9\x74\x77\x1f\xf6\xb8\x3f\xcb\x08\x13\xf5\x59\xb9\x9f\x08\x0d\xb4\x8d\xad\x32\x43\xa9\x51\xca\x36\xd1\x0c\xeb\xf8\x36\xa9\x6d\xd2\xfa\x66\x54\x63\x8d\x5b\xe5\xc4\x8e\x4c\x18\x28\xf4\x37\x7a\x7e\x05\xc7\xd3\x70\x7b\x82\xee\x12\x36\xc4\x21\xa9\xbd\xe4\x15\xa6\x06\x7c\x95\xc7\x28\xa5\x9b\x70\x9e\xe1\x50\xa3\x84\xf4\xe6\x61\xf5\xba\x8d\xb6\x8f\x0f\x4f\x0f\x7e\x9d\x4f\x78\x9c\x21\x08\x44\xee\xf7\x8f\x79\x01\xf5\xf7\xaa\xec\xe2\x9f\x09\x4f\x24\xf1\x32\x60\x79\xf4\x72\xc4\x6a\xd5\x6f\x2a\x09\x4f\xe3\x28\x1a\x6a\x5b\xc0\xa4\x42\x8e\xb3\x44\x68\x05\x72\x5a\x98\x3d\xff\xcd\x92\x80\xcb\x38\x1a\x11\x2a\x74\xb9\x5e\xff\x64\x41\xc4\x1c\x19\xa5\x34\x0d\xc8\xc3\x9f\xed\x95\x26\xb7\x0c\x74\x88\x8a\xc2\xf0\xe3\xb8\x2f\x2b\xb8\x69\x1d\x6a\x5f\xe4\xe3\x54\x3b\xfe\x97\x27\xf1\xff\xf9\xe6\x86\xdb\x41\x0c\x7b\x73\xac\x06\xd8\x95\x24\x8c\x6c\x02\x9d\xf0\xca\xc2\xc5\xe4\xbf\xa3\xb3\x34\x7e\xfa\x50\xc7\x68\x10\xd9\xfd\xa9\x7e\x5b\xf5\xbc\xfc\x9c\x25\x11\xa7\x9c\x0f\x0e\xf5\x17\x59\x35\xe7\x35\x14\xe6\xfa\x2e\x91\x44\x96\x63\x85\x80\xa5\x70\xe9\x4b\xb9\x5c\x15\x66\xe0\xf1\x26\x71\x28\xd0\xd3\xaf\xe5\xfe\x43\xee\x88\x83\xdb\xc1\x87\x87\x1a\xfd\xd7\x16\xbb\xf1\x93\xc7\xa9\x42\x6f\xe5\x70\xfe\x56\xe7\xc5\xae\xdd\x2a\x11\x40\xd8\xdd\x2c\x03\xa4\xd1\x7f\x79\x7e\x7e\xdc\xae\x6e\x1f\x36\x5b\xd1\x1d\xd2\x02\x99\xd6\x89\x59\xff\xcf\xe7\xa2\x53\x3f\xe6\x2c\x49\x78\x10\xc9\x01\x12\x74\x0d\xcd\x58\xf2\xd1\xb7\x8b\x63\x0a\x05\x14\x07\x2c\x6a\xf7\x3f\x5b\x86\x9a\x53\x07\xf9\x0e\xc4\x29\x34\x3e\x2d\x65\x9a\x34\x4a\x2b\x59\x34\x75\x97\xf7\x1c\x66\x44\x92\x34\x0a\x70\x2c\xac\x8f\x72\x10\x83\x49\xd2\xc4\x60\x86\x07\x13\x86\xb6\xca\x07\x5f\xc3\xb7\x90\x06\x05\xc7\xf0\xe6\xae\x3b\x5f\xa0\x3a\xc8\x02\x26\x5e\x6e\x92\x89\x08\xfd\xb9\x8f\x1c\x3e\xbb\x30\xf8\xb8\x45\xa0\x10\xda\x7f\xd8\xea\x81\x54\xe6\x97\xbc\x5d\x21\xbc\x5b\x98\x64\x31\xc1\xa7\xea\x46\x36\xb9\x5e\xb6\xe6\xff\x68\xe7\x1f\xee\xfb\x49\x96\x28\x52\x89\x3a\x15\x4d\x09\xd3\x54\x5f\x92\xa9\x14\xd1\x05\x58\xbb\x43\xcb\x25\x19\xbd\xbe\xd4\xcb\xb7\x03\xe3\x43\xed\xa8\x8a\x7a\x01\x99\x76\xed\xa4\xd0\x54\x54\x0e\x8d\x63\x44\x1a\xdf\x4f\xc6\x19\xda\x5a\xbe\x40\x6c\x22\xf7\x30\xeb\x52\x26\x32\x49\x30\x31\xe6\x0a\x8c\xe0\x0f\x24\x02\xda\xf5\xf5\xf8\xd3\x9b\xa4\x94\xaa\x3e\x56\xf9\x7f\xa1\x5e\xb4\x2f\xd5\x0f\x16\xc5\x2d\xba\x2c\x06\xd4\x69\xb7\x75\x62\x6c\x98\x5a\x1d\x21\x5f\x46\x7c\x71\x63\x4c\xcc\xf8\x66\xca\x06\x6c\xc8\xda\x87\xf2\xc8\x84\xb4\x1f\x37\x34\xdc\xe0\x22\x48\xd8\xd0\x91\xda\xd5\xe4\x92\x26\x54\x22\xc0\x6a\xde\x46\xcb\x6e\x28\x9a\x54\xe2\xfe\xbb\x7c\xbe\x59\xf8\xdf\x80\x4b\xe1\xec\x2d\x37\xef\x07\x19\x57\xdf\xa6\x7d\x65\x97\x23\xae\xca\xf7\x6b\xf1\x8c\x04\x52\x25\xc2\x81\x40\xe7\x4c\x00\xc6\xb5\xb4\x01\xd1\xac\x60\x08\x79\xa8\x28\x39\x52\x20\x6e\x1b\x46\x69\x42\x7d\xed\xa5\x39\xbb\x0a\xc1\x97\xaa\x6c\xb0\x54\xed\xa9\x34\xdd\x3a\x60\x93\x18\xf7\x1a\xb2\xa0\x49\x05\x73\x38\x24\xfc\x85\x53\x26\x92\xd0\x51\x48\x11\xb9\x56\x8f\xd6\x49\x99\x4a\x14\xf7\x7e\x75\x78\x9b\x7f\xd4\xcf\x9f\x13\x49\x98\xb6\x95\xa5\xd8\x3d\xd2\x3c\x3e\xdb\x47\x59\x98\xdf\x66\x70\x17\x29\x0f\x35\xfa\x76\xaa\xf4\x73\x21\xe5\x71\x12\x25\x23\x99\xc8\x9e\x29\xba\x6b\x63\x34\x92\x04\xfa\x92\xb3\x99\xc4\x64\x2a\x52\x85\xcc\x5f\x45\xf9\x3c\x16\x3f\xf1\xc7\x25\xc7\x72\xdb\xb5\xfc\x80\xd7\x5c\xbf\x2f\x0a\xf3\x54\x56\xcd\xb9\x3b\xae\x49\xfb\xa6\xab\x60\x99\xcd\x63\xa4\xc2\x10\x27\xe6\xf2\xf9\xe1\xeb\x6a\xfd\xe0\xc7\x4e\x1a\x18\x81\xa0\xc4\x06\xf4\x5b\x91\x6b\xb9\x1f\x59\xdf\x69\x60\x13\x74\x07\x64\x5d\xc3\x28\xb9\x9c\x86\x11\x91\x76\x90\x4d\xb7\xf8\xb6\x6c\xbd\xc3\xf5\xf6\xe9\xe1\xeb\xc3\xd3\xb7\xa7\xed\xeb\xe2\x61\xbd\xea\xda\xa6\xc6\x38\x0f\xfd\x56\x9e\xeb\x87\xe2\xa9\x2c\xa6\x8b\x50\x1a\x4a\x6e\xd5\x68\xeb\x9f\x38\x6a\xff\x98\xb4\x57\x1a\x67\x82\x95\xd5\x61\x9d\x17\xbb\xeb\x1c\x6f\xfe\x04\xad\x09\x3d\x20\x8b\xdb\xf2\xa4\xf6\x70\xdb\x47\x46\xd2\x28\x12\x71\xd6\x85\xd3\x7e\x9c\xd7\x4d\x59\x0d\x30\x8e\xae\x55\xcc\xa9\xec\xe0\x53\xd6\xb7\xb0\x87\xdd\xd0\x30\x9f\xbf\x69\x2c\xa8\x42\x1b\xb7\x0e\xc4\xcb\x3c\xdb\xef\x65\xf5\xfe\x73\xd4\x42\x1a\x27\x29\x3a\x6a\x20\x9b\x6f\x45\xae\xcb\xaa\x68\xd7\xca\xf2\xd4\x2c\xcb\xaa\x7b\xe6\x58\x66\x58\x9c\x30\x0d\xf1\x8d\x26\x49\x12\x46\x98\x1c\xae\xf3\x5d\x21\x9b\x53\x05\x3d\xe3\x51\x7b\x34\x92\x9a\x79\xfe\x13\x94\x1e\x7f\xcb\x8f\xab\x1f\xc7\xbc\x3a\xdf\xca\x66\xfa\xfa\x49\x0a\x34\xd6\x56\xf7\x0f\xeb\xcd\xeb\xbf\xb6\x0f\x5f\x37\xab\xd7\xbb\xc5\x72\xb5\x7d\x5d\xfd\xf3\xdb\xc3\xeb\xea\xa9\xcf\xf9\xa6\x69\x6a\x1d\xad\xee\x21\x2f\xb6\xf0\x63\x16\x93\x98\xa6\x59\x86\x90\xb0\x6d\x01\x9f\xcf\xa7\x66\x57\xb6\x73\xa8\x07\xae\xfd\x82\xb7\xcf\x5f\xc4\xb2\x60\xa2\xd9\xea\xb9\x3d\x5c\x8b\x2c\x22\x91\xd4\xdb\xdb\xff\xf9\xf3\xf5\xa5\xfb\x35\x0d\xd1\x85\x7e\x5e\xfc\x4e\x51\xe2\xab\x41\xe7\xd9\x9c\x5b\x9a\xa5\x12\x4b\x71\x5d\x58\x1c\x01\x0d\x53\x44\x55\x9a\x29\x1e\xbb\x0a\xb7\x97\x72\x02\x04\x74\x4d\x24\x67\x98\x8a\x7a\x93\xf5\xea\x70\x6c\xce\x2e\xd3\xb7\xde\x97\xd3\xbd\x33\x95\x59\x40\xfd\xd5\xfa\xad\x43\x6e\xb0\x29\x02\x6b\x7e\x1b\x4d\xa5\x55\x99\xf5\xf8\x9f\xe2\x54\x8f\xc5\x1d\x67\x61\x68\xde\x9b\x4b\x55\x42\x32\xe7\x14\x25\x26\x24\xd9\xba\xec\xaa\x17\x52\x1d\x50\x00\xff\x28\x4b\x97\x4d\x1a\x47\x06\x52\x9d\x4a\x08\x3d\x25\x11\x34\xb0\x91\xf5\xc5\x4c\xf0\x4d\xa5\x45\x10\xef\xb8\x94\xa5\xbb\x92\x61\x0e\x62\x5f\xc8\x76\x26\x83\x6d\x4d\xc1\x71\x77\x0c\x89\xb7\xda\x33\x42\x86\x86\xfb\xcb\xa9\xb9\xcf\xed\x24\x70\x9c\x9a\xd8\x22\xba\xc6\x05\x27\x47\x93\xc4\x64\x99\x57\x3f\x6e\x5f\x2b\x2f\x4e\x79\x33\xf4\xf0\xbb\xfe\x01\x1e\xe3\x67\xcc\x6b\xd2\x61\x59\x83\xdc\x4f\x02\x91\x29\x84\xca\x50\x9b\x19\x56\x9f\xf6\xb8\x94\x84\x43\xf1\xaa\x36\xe3\x6e\xb1\x31\x71\xb5\x92\xc9\xb2\x41\xba\xb6\xc7\x72\xa6\x68\x6d\x72\x9a\xe4\xb8\x8e\x17\xf0\xb9\x2a\x76\x7b\x59\x98\x9b\x3e\x92\x94\x5a\xa0\xf2\x6d\x69\x3e\xf2\x7a\xc2\x11\xc4\x59\xc6\x22\x86\x92\x2c\x7f\x49\xfd\x7e\x2c\x11\x1f\xfb\xcf\x93\xdc\xe7\x36\xef\xe6\x57\xc6\x9c\x14\x90\xc3\x17\x4e\x49\x56\x38\xcb\x84\x20\x20\x56\x03\xbd\xbe\xdb\xb2\xac\x9b\xee\x78\x42\xb8\x59\xaa\x6e\x98\x17\x1e\x4c\x67\xa7\x7f\x16\x24\x0a\x3d\x07\xe9\x60\x84\x4f\x65\x01\x7e\x83\xcc\x42\x41\xc8\xc7\x0a\x74\x59\xe8\x7c\x9f\xa3\xb1\x78\xeb\x89\x2b\xda\x16\x61\x02\x7d\xa4\x05\x45\x0a\xc8\xed\x8b\xfe\x6f\x1c\xce\xc8\xc2\x84\xc7\x7d\x95\xd2\xa4\xf6\xaf\x3d\x6e\x18\xe2\x3f\x1e\xcb\xcf\x7b\x39\x0e\x64\x65\x11\xa3\xc9\x81\x84\xb8\x1f\x65\xae\x61\x08\xb7\xfd\x79\x3e\x2a\x8b\x82\x54\x0f\xfd\xe2\x85\x81\x63\x33\xf1\x79\xc7\x8f\x12\x05\x1a\x71\xe8\x24\x92\xba\x7c\x93\xfb\x3d\x20\xd2\x92\x96\x96\x3b\x98\x2c\xc4\x59\xa4\x62\xf4\xcd\xbc\x09\xdb\xb6\xf8\xe9\xde\x96\x45\x56\x60\xd8\xe0\xe5\x54\xbf\xf9\x08\xc6\x54\xab\x9e\xb3\x2c\xe6\x19\x62\xd4\x6f\xf2\xb2\xc8\xb5\xef\x8e\x84\x59\xa5\x06\xf1\x09\xf7\x62\x95\x67\x8a\xdf\x94\x4f\xc5\xf9\x22\xcb\x3c\xff\x20\x09\x27\x35\x7f\xd5\x2e\x68\xb7\xf2\x3c\x76\x5b\xb2\x44\x50\xf2\xb2\xaf\x50\x46\x6f\xa0\x3b\x9c\x46\x38\xf5\x9d\x84\xde\xba\x3c\xed\x27\x5d\x93\xa8\x0c\x3c\x9d\x5e\x27\xb2\xd1\x2f\x2d\x59\xa2\x29\x7b\x06\xc7\xbc\x2e\x0d\x74\x7a\xab\x57\x9e\xd6\x44\xa1\x1c\x96\x75\x4e\xfa\x2b\x81\x08\x57\xbe\x55\xd1\x74\x6b\x50\x96\xb5\x4e\x06\xee\xf5\xa4\x04\x53\x9f\xae\x5d\x3e\x33\x01\xe1\xc0\xdb\xc9\x77\xda\xc3\x70\x33\xbd\xb6\xab\x0d\x7c\xc5\x2c\xb3\x31\x16\xa8\x39\xda\xf9\x97\xe7\xf5\x24\xac\x3f\x78\x71\x99\x91\x58\x93\x3a\xed\xf7\x30\xc7\xa8\xd0\xb6\xd1\x21\x72\x23\xd5\xd2\x82\x93\x5b\x9a\x74\xaf\x8a\x13\x34\x93\xf3\xc3\xa1\xac\x9a\x81\x14\xc0\xe4\xcd\xb4\x60\xc1\x80\x65\x6b\x68\x8e\x66\x26\x14\x5e\x54\x62\xe3\xf5\x72\x7e\x89\xad\x9e\x15\x1f\x1b\xdf\xd3\xd8\x18\x79\x19\xaa\xb2\xdd\xdb\x6f\xf2\x86\x32\xbb\x63\x37\xd1\xb5\x85\x88\xb8\x78\xd7\xfa\xed\x00\xfa\x7d\x0f\xfb\xd1\x23\xb6\xae\x15\x77\x32\x03\x7b\xf3\x24\xcf\x65\xbf\xd2\xce\x11\x93\xfb\xf0\x4e\x06\x59\x88\x58\x2a\x4d\x65\xac\xdd\xaf\xc6\x93\xc8\x3d\xc9\x1f\x37\xa7\xf3\xa4\x57\xc1\x8a\xc4\xe5\xfa\x6e\x4f\x8d\x7e\xc3\x51\xfb\x3a\xd5\xbe\xed\xda\x4b\x16\x28\x5c\x30\x5e\xbe\x2c\xd6\x2b\x3e\x14\xd0\x69\x0f\x1a\xa2\x32\x46\xb7\xf5\xd9\x4e\xab\xc0\x5a\xfb\xc5\x5b\xf8\xbf\xc3\x19\x4b\xaf\x66\x01\xe1\x52\x30\x85\x89\xe1\x76\x17\x78\xca\x8b\xe6\xfe\xe4\x17\x6a\x29\x6c\x82\x39\x01\x5a\x86\xc7\x52\x07\xa3\xf5\x5e\x06\x9c\x65\x7c\xa0\xa5\x61\xe4\x64\x9b\x94\x41\xa2\x85\xeb\x1c\x8a\x21\x8d\x0d\x11\x19\x80\x26\xc4\x06\xd4\xcd\xd6\xe6\x1f\x18\xf2\x6d\x57\xa1\x2e\x80\x2a\x43\x6b\x70\xbd\x7e\xd9\xcb\x76\xcb\xf7\x9e\xa5\x8c\x94\x1a\x68\x40\x2c\xdf\x64\x35\xcb\x6a\xef\x5a\xc7\x61\x86\x5f\x61\xf1\xfa\xe8\xa4\xe8\x4f\x73\x68\x17\xdf\xda\x1a\xdd\xf3\x88\x61\x54\xf0\x67\x17\x4f\x02\x8b\x71\x16\xb7\x31\x57\xfd\x9e\x26\x93\xd4\xe2\x22\x73\x44\xc7\x78\xf3\x59\xbe\xc2\x07\xc8\xfd\x95\xaf\x92\xc8\xc8\x49\xef\xea\xd2\xe9\xbe\x39\x9c\x93\x6b\x90\xb2\x20\xf3\x2c\xec\x27\xb3\xbb\xae\x1a\xef\xdb\x0b\x5a\xc3\x7a\x3e\xeb\xc9\x07\x48\x63\x96\xba\x5c\xda\x43\xd1\xdc\xe5\xb0\x37\x81\x3f\x96\x85\x42\x0d\x83\x29\xcb\x32\x2f\x4c\x55\x1e\x47\x15\x4b\xb2\x1d\xfe\xcc\x0b\xe1\x62\xb6\x6e\xfc\x08\x32\x30\x18\xe2\xf9\x23\xaf\xea\xf3\x61\x86\x83\x76\xd6\xa4\x97\x2a\x8b\xd1\x18\x78\xfc\xd7\xd7\xdb\x67\x7f\x2f\x65\x24\x66\x9a\xf6\x20\xcd\xc5\x58\x52\x86\x64\x38\x6f\x5b\x6b\xaf\xda\x7e\xc9\x9b\xe7\x0a\x91\x4e\x17\xa5\xd0\x9c\x49\x0d\x1a\xad\x9c\x6d\x2d\x3f\xae\x56\xd0\xfd\x63\x76\x8c\xfc\xdc\x44\x90\x46\x31\x0c\x9d\xd7\xb2\x78\x92\x3f\x46\xe9\x67\x69\x8c\x44\x6c\x99\x05\xa8\x17\xd3\x22\x53\x1a\x0b\xce\x5f\x94\x10\x12\xac\xce\x19\x72\x83\xf0\xda\xac\x41\xd6\x9d\xa5\x41\xf8\x2a\x4a\x47\x42\xef\x04\x9a\xc7\xdb\x81\xb4\x99\xc0\x8c\x66\x6b\x1c\x2e\x65\x61\xfc\xf4\x57\x4c\x86\x38\xfd\x1d\x87\x1e\x54\x1f\xb9\x86\x27\xf9\x83\x32\x52\xf5\x4b\x3b\x15\xca\x8f\xbc\x9e\x3e\xca\xd4\xc3\x51\x4c\x45\x26\x1a\xd7\x3c\xfb\xa5\x54\x71\x45\x15\x38\x8f\x65\xb1\x43\x8e\xbc\x2e\xaa\x2e\xfa\x15\x38\xfd\xbf\xf9\x2e\x56\x22\x20\xf6\xc8\xbc\x5e\x98\xbf\x64\x4f\x82\xf5\x8f\x8b\xff\x77\x27\x04\x26\xc2\x9c\xf7\xc3\xf2\x79\x8b\xc9\x15\x31\x4c\x7a\xa9\x30\xa4\xda\xd3\xc7\x72\xf7\xad\x86\xca\x87\x70\xae\x15\xa9\xa9\x98\x01\x66\x3c\x88\xd2\x1e\xcb\xb1\xfe\x9e\xfd\xa8\x92\x34\xc1\x0a\x62\xf8\x90\xfb\x93\x6c\x60\x7b\x28\x0d\x4c\xcc\x1c\x95\x64\x29\x2a\x1e\x62\xd4\xe5\x15\xec\xf8\xcb\xa9\xc4\x64\x88\x3b\x41\x3c\xdc\x0e\x9a\xed\x41\xe6\x45\x03\x45\xbb\xa3\x0f\xe2\x77\x2a\x55\x94\x7f\x7c\x69\x3f\xdc\x7b\x3d\x02\xc4\xab\x0c\x22\x12\x90\x78\x3b\x35\x83\xf8\x8b\xd2\x2c\x0c\x5d\x7c\xb2\xed\x8a\x47\x59\xec\x4e\xa8\x73\x7c\xe5\xfd\xba\x2f\xaa\x03\xed\x61\x70\xce\xb8\x7b\xca\x7b\xdf\x4d\x19\x66\x10\x04\xf8\x08\x3b\xe8\x48\x23\xaf\xf5\x59\x3f\x4f\x95\x89\x0d\xce\xf8\xed\xd6\x35\x12\xdb\x6d\x77\x4d\x1d\x63\xc8\xee\xaf\x32\x2f\x76\x48\x62\x30\xee\x47\x08\x52\x96\xf6\x15\x3e\xe6\x3b\xe4\xf3\x16\x8d\x02\xc7\xe2\x8b\x18\x3e\x6b\xf7\x18\x46\xf5\x0b\x8b\x02\x45\x82\xd5\xcf\x05\x78\x90\xee\xb0\x2f\x35\x8b\x13\x23\x7c\xcc\x2a\xd7\x70\x57\x56\x5d\x40\x95\x70\xd7\xb3\x0c\xf4\xed\x99\xd2\xca\x81\xa8\xe8\x5d\x59\x39\x1b\xcf\x1d\xe7\x3c\x45\xf6\xd9\x03\xc6\x84\x1e\xfa\xdf\x45\x86\x55\x14\x5d\xe2\xb1\xdd\x5c\xf3\x62\x77\xa5\x7a\x49\xf3\x2c\x50\x99\x47\x13\x6c\x31\x6c\xf0\x09\x79\x77\xb5\x2c\x14\x44\xb0\xda\xc5\xb4\x34\xcf\x22\x61\x3d\xec\x16\xf9\x75\xfd\x01\x15\xa2\x20\xda\xa1\xfc\x80\xeb\x1c\x6d\x6d\x43\x43\x48\xa3\x7b\xc7\xad\x62\xe6\x72\xf1\x9a\x5b\x2b\xf8\x30\x62\xe4\x70\x45\xfe\x76\x42\x06\x38\xd5\x5e\x2a\xf0\x64\x25\xed\xaf\x9a\x6b\x07\xba\x5b\x54\x2a\x1f\x12\x06\x8d\xe6\x8a\x0e\x62\x3a\x7d\xdd\xe3\xab\xab\x19\x03\x5a\x07\x8a\x47\xa3\x4c\xae\x4f\x19\xba\x55\xd4\xdf\x38\x8c\x04\x12\xc7\xf5\x31\xf4\x6d\x33\x2a\x42\xd1\x61\xcc\xb1\x4e\x0e\x7e\x1c\xcb\xaa\x81\x8a\x30\x43\xdd\xd1\x8c\x94\xa0\x96\xb2\xda\x97\xf5\x00\x19\xa7\x43\xc5\x33\xc7\x96\xfe\x24\xdf\xa1\xba\x81\x66\x90\xd0\xd4\x21\xa4\xca\xa1\x90\xfc\x4f\x91\xa2\x50\x69\x59\x19\xa8\x9e\x64\xa3\xdf\xd6\xb0\xbf\x10\x52\xfa\xb9\x5d\xad\x23\x15\x60\x58\xfb\x90\x17\xcd\x3c\xfb\xb6\x6b\x98\xb0\xd4\x89\x72\x23\x66\x9e\x8e\x4d\xa7\x9c\x4e\x42\xab\x1d\x08\xe8\x7e\x5f\x2a\x39\xab\xeb\xd4\xb6\x4b\x89\xc6\xad\x86\x7a\xa2\x53\xcd\x99\xce\x78\xe0\xf9\x47\x37\xf9\x01\x82\xf1\xfa\xa7\x33\xa9\x9c\xec\xc8\x3b\x39\x55\x57\x06\x60\xa6\x13\x57\x67\xd2\x6e\x64\x2f\xe5\x3b\xe8\x32\x2f\x16\x85\x41\x64\xa1\xac\xde\x3b\x4f\xe9\x72\x79\x73\x97\x90\x26\xe6\x8e\xba\x5b\x61\x60\xeb\x22\x9c\xd2\x36\xf1\x94\x3e\x37\x55\xae\xdf\x1f\xcc\x25\x01\x4a\x57\x95\xf7\x8b\x8f\xa1\xc2\x00\xb7\xa9\x5b\x1f\x65\x43\xff\xf2\x22\x31\x75\xf5\x6c\x13\x13\xe0\xff\x2f\xd0\x7e\x11\xa6\x84\x0c\x32\xe8\x8d\x4c\x4d\xad\xa2\x18\x3f\x7c\x8e\x34\x6a\xcf\x76\xf2\x21\x55\x16\xa1\x7f\x40\x2b\x4f\xbd\x3d\x9e\xea\xb7\x2b\x9d\xa4\x20\x44\x38\x8d\x3c\x1e\xf7\xe7\xa7\xa5\xef\x18\x1d\x03\xce\xec\x5b\x79\x3c\xd6\xbd\x07\xad\x75\x16\x63\xed\x6c\x7d\x3a\xa8\xbc\xb9\x2b\xab\x95\xaf\xf4\xf4\x0d\x9c\x61\x4f\x75\xa1\x7f\x94\x0d\x4c\x5c\x59\xad\x15\xc4\x6e\x94\x2d\xf6\xcd\x52\x1e\xf3\xa6\xe3\x3a\x9c\xbc\x07\x30\x52\x5e\xd0\xb2\x58\x7f\x4a\x9f\x60\xd6\x20\x6c\xe0\x28\xc4\x82\x41\x42\x7f\x26\xb5\x3f\xcc\xe2\x0e\xfd\x73\x0d\x31\xd1\xc8\xd6\xd0\x6c\x5d\xc8\x62\x6b\xa7\xd1\x1c\x6d\x23\x83\xe9\x61\xf9\x29\x73\x14\x06\xc5\x2a\x4e\xff\x18\x56\x6b\x5c\x23\xf7\x60\x1b\x9e\x8c\x4f\x35\x8c\x91\x0a\x02\xe1\x87\x90\x7a\x74\xd2\x20\x01\xac\x0a\xd9\xee\xc9\x11\x5f\x0e\xe4\x5d\xc7\xdf\xc8\xb0\x14\x10\x8f\x4b\x7d\xba\xfd\xa4\x7c\xbe\x3f\x68\x09\xf6\xdc\x2d\x7e\x1b\xc7\xa9\x43\xdb\xe6\xe4\xae\x22\x0e\xb0\x0a\x68\x87\x4e\x5f\xb5\x79\x93\xc5\xbc\x37\x63\x84\x15\x9e\xca\x78\xdb\x85\x8f\xb7\x14\x29\x1e\x82\xa4\x4d\xa0\x8c\x18\x46\xd5\x30\x6e\x48\xc1\xc3\xd9\xa9\x6d\x42\x11\x63\x36\x67\x4b\x7d\x33\x1e\x1e\x26\x4c\x35\xc6\x20\x30\x36\xeb\xd8\xf2\xdd\x4c\x7f\x9e\x00\x12\x4d\xc4\x19\xfa\x01\x25\xf2\x6d\xc0\xb5\x92\x86\x4b\xc5\xfe\xff\xfd\xbf\xc1\xb4\x9e\x94\xdd\x9a\x28\xa5\x8a\x30\x7c\xa1\x3b\x80\x65\xf7\xc9\x4d\x04\x14\x0e\x38\xc8\x1f\x8b\xa6\x81\xc3\xb1\x3b\x12\x4b\x8e\xfc\xe4\x9d\xce\xf0\x65\x26\xd3\x24\x82\xca\x16\x9c\x74\x3d\xb2\x97\x74\xf2\x8b\xed\x71\x95\x21\x25\xcb\xed\xc3\xe2\x71\xbd\x7e\xf9\xe6\xb1\x9b\x26\xcd\x4c\x40\xe5\x6c\x7e\x1f\x44\xc5\x13\x7f\xd4\x24\xa1\x19\x58\x30\xf3\xa9\x3e\x93\x09\x16\x13\x57\x11\x89\x82\xdc\xcb\x7a\x58\x4c\x6e\xb2\x24\xb3\x71\x5f\x4c\x39\x9b\xeb\x35\x32\xb3\x68\x28\xae\x1b\x79\xbe\xc9\x3b\x61\xb9\x3b\xa9\x07\xb0\x0a\xa3\x19\x04\x94\xac\x46\x39\x9a\x67\x3b\xba\x91\x91\x12\xb3\x48\xdb\x1a\xad\xcd\x8f\x19\x4d\xcd\xee\x5b\x18\x13\x13\x8d\x4d\x59\x20\x40\xff\xca\x90\x02\x65\x2c\xad\x87\x8b\x93\xc9\x9b\xbb\xbc\xc8\xeb\xb7\xe9\xe0\x07\x16\x1a\x74\x8e\x08\xa1\x15\x31\x8f\x81\x04\x06\x8a\xa4\x60\xe4\x7e\xbf\x6e\xca\xef\x79\xf3\x76\xd3\xe8\x5f\xa1\xf4\xaf\x47\xc4\x66\x72\x47\xce\x99\x01\xae\x23\x70\x96\xf6\xef\x15\x02\x87\x16\x8e\xa3\x7b\xfe\xd5\x80\x1b\x2a\xfe\xa7\x0a\xf2\x01\xbe\xb2\x6f\x22\x84\x09\xf9\xc4\x54\xf6\x87\x54\xc6\x3d\x12\xe1\xb2\x0c\x26\x9e\x5c\x28\x8a\x33\x74\x5b\xdf\xe1\x3c\xfc\x62\x10\x29\x6b\x3d\x63\x21\x59\x78\x53\x8f\x14\xe2\x8c\x07\x44\xae\x36\x48\x0a\x40\x2c\x05\xc2\x2f\x7c\xc5\xea\xfa\x54\x7d\xe4\x1f\x65\xd5\x59\xbc\x93\x8b\x28\x08\x7c\x35\x0e\x9a\xd2\x50\xfd\x36\x7a\xc0\xd8\x90\xc2\x71\x03\xf2\x40\xa4\x20\x43\x5c\x30\xc4\x26\xc1\xd2\xc0\xed\x61\xa8\x5e\x3e\x0c\x0e\x41\x0c\x04\x70\xfa\x28\x1b\x57\x34\x37\xee\x82\x24\x89\xc1\xb8\x98\xcb\xac\x2c\x5f\xdb\x46\x52\x3d\x32\x76\x24\x66\xe1\xbd\xc5\x0b\x09\xa4\x3e\x31\xd8\xae\xf9\x6e\x01\x40\x78\x94\xad\x4a\x1f\xfe\x82\x94\x19\xbc\x8b\xd4\xfa\x74\xc0\x55\x7b\xdb\x94\xdd\x41\x11\x60\x56\xce\x31\xb6\x22\xad\xc3\xb4\xa7\xd2\x8c\xe2\x8c\xb4\x94\x6c\x0d\x38\x63\xcd\x2f\xdf\x90\xc5\x2a\xe8\xcb\x09\x9e\xca\x0a\x1c\xc1\x82\x23\xa7\x9b\xd8\x7e\x20\x79\x60\x3a\x6a\x51\xca\x43\x1c\xfa\x38\x29\xc8\x98\x4a\x3f\x30\x34\x21\xcd\x73\xb1\x3f\x0f\xf6\x00\x90\x90\xa1\x15\xf1\x69\x7e\xea\x1b\xfa\xd6\x36\x61\xbe\x74\x0c\x45\x21\x4f\x35\x5c\x41\x41\x81\x0a\x88\x93\xe3\x7a\xda\x70\x04\x32\x01\x15\x91\xb4\xe5\x40\x48\x70\x29\xf7\xfb\xbb\xf5\xe6\x67\x14\x6f\xed\xfc\x47\x02\xc3\xc5\xfa\xee\x66\xe8\x1e\x82\xb2\x9c\x8d\x6b\x5a\x6e\x60\x52\xf5\x0e\x3a\x32\x18\x0f\xb1\xa4\xe0\xb4\x28\xcc\x4d\x5e\x35\x6f\x13\xb9\xc6\xf1\xfe\x0a\x5a\x52\x97\x21\x55\x5b\x2f\x5f\x76\x9d\x80\x6f\xd6\x6e\x04\x0d\x19\xda\xec\xba\xac\x2a\xf4\x59\xbf\x40\x55\x8e\xe8\xeb\x39\x03\x13\x19\xc4\xa7\x6c\xe1\x90\x63\xbd\xff\x07\x50\x46\x6b\xb8\x91\x03\xf0\x0c\xc1\xae\xf5\x49\x1d\x28\x2b\x4e\x20\x9a\x45\x61\x36\x55\xbe\xdb\x41\xe5\xec\x9f\xf1\x13\x40\xc4\x31\xab\x76\xff\xe7\x1f\xcb\x35\x14\xcd\xcd\x19\x43\xae\xd7\x6a\x1b\xfd\x59\x2a\x46\x8f\x49\xb6\x1e\x60\x35\x0c\xa8\x0f\x9e\xc8\x32\xa9\x5d\xb5\x05\x02\xb2\x3a\x1f\x12\x2c\xcf\xbc\xda\xf2\xea\x78\x98\x54\x0b\x52\x1b\xcb\x38\x60\x90\xec\xf8\x70\x8b\x2e\xcf\x76\x7a\x5c\x87\x88\x5d\x3f\xc8\x1f\xed\x2e\x75\x31\xe8\x2d\x0f\x68\x2c\xb5\x8b\x27\xfc\xb8\x82\x65\xf6\x6d\x1d\x1a\xcf\x15\xae\x0c\x90\x5c\xdd\x3b\x5b\x9e\x08\xf4\x69\xf2\xfa\xd6\x55\x69\x2d\x9c\x1f\x6a\xba\x5b\x4a\x91\x84\x1d\x97\xc6\x44\x54\x9f\x33\x2b\x44\x6c\x9c\xca\xb2\x63\x65\x99\x0c\xb2\x0b\xa7\x65\xf0\xaf\xae\x63\xad\x50\xc4\x7e\x8e\xea\x68\x43\x66\x45\x2b\x80\x73\x4d\x29\xfc\x03\x34\x6f\x70\xaa\xff\x9c\xf7\x1c\x6c\x20\x32\x94\x6b\xb9\x87\xe6\x9f\x27\x38\x8d\x6b\x75\x6c\x20\xa9\x80\xf9\x82\xc7\xfe\xab\x47\x24\xf9\x1c\xa5\x3f\x23\x64\x29\x26\x18\x65\x6b\x10\x3f\xc9\xbc\xe8\x28\x95\xa7\x50\x7b\x1b\xf2\x84\x47\x43\x26\xcf\xd6\x38\xc7\x7c\xc9\xec\x24\xb1\x61\x18\x62\x8d\xfc\xf2\x2d\x2f\x64\xff\x9d\x67\x53\x09\xa7\x09\x13\x32\x67\x36\xb2\xdc\x6b\x1e\x6e\x8f\xb2\x6a\x72\x9d\x1f\x65\xd1\x6c\x71\xec\xd6\xdb\xf7\xb3\xee\x2d\xe4\xc9\x18\x8b\x6c\x8c\x1c\x98\xb6\x02\xd8\xb6\x7b\xce\xd6\x96\xd5\x56\xcb\xc2\xe4\xed\xa3\x6f\x3d\x84\xcc\xc6\xb1\x46\xc3\x7c\x41\x8b\xfe\x73\x71\x25\x33\x69\x63\x10\x32\xf6\xd5\x27\xa7\xc2\x65\x66\x6e\xce\x14\x88\xfd\xe9\x62\x61\x63\x4b\x54\x18\xf7\xad\xeb\xb5\xef\xd2\xd9\x0f\xb7\xdd\x47\x48\xc2\x10\xc1\xa9\xef\x67\xdd\x07\x52\x97\x1e\x40\x5b\x56\x93\xe5\xd9\x26\xda\x06\x4e\x3e\xa9\x39\xd5\x63\xa1\x21\xce\x6c\x1a\x59\x54\x28\x5d\x2d\x16\x83\x70\x89\x4d\xd3\x08\xf7\x69\x03\x7a\x2f\x2b\x58\xbe\xc1\x54\x30\x84\x33\x9b\x71\xc0\x48\xc1\xa7\xdc\x43\x2d\x6f\xe5\xa7\xfc\xeb\xa9\xfc\x0b\xd6\x4d\xf9\x94\xef\xf3\xb2\x67\x6f\xb1\x59\x48\x42\x6b\x3e\xd5\xb1\x29\x5f\xca\x72\x3f\x03\x1c\xb5\x92\x71\x4c\xf7\xe5\xf5\x8d\x6c\x9a\x3d\x91\x40\x96\xd5\x0c\x29\x37\x47\xb1\x41\x5c\x5a\xbf\x9c\x55\x95\xbb\x8d\xed\x6a\x19\x83\x95\x2a\xd6\x89\x97\xb5\x27\x3b\xcc\x89\x61\xfd\x7c\x37\xb4\x12\x62\xf4\xee\xec\xa9\x39\x11\x1d\x73\x5e\xec\x28\x71\x34\xce\x91\x58\x15\x68\x2f\x1b\x7f\x4b\x42\xbd\xb3\xb2\x85\x93\xeb\xab\x48\x28\x3b\xe4\x42\xb8\x73\x4c\xec\x3f\x65\x42\xb0\x9a\x49\x04\x5c\xbd\xe6\xbb\x65\x25\x6d\xe3\x90\x4a\x2f\x52\xbf\xcb\x1d\x8c\x6b\x97\xad\x66\x24\x26\xdb\xc3\x0e\x71\x47\xab\xf3\x5d\xd7\x22\xe0\x1a\xfa\x60\x29\x32\x6e\x53\x54\x70\x72\x5b\xad\xb0\x60\xcf\x65\x4e\x6e\x4e\x55\xf1\x22\x4f\x75\xbf\x42\x6a\x23\x11\xfb\x7b\x7b\x7b\xf7\x77\xe7\xaf\x36\x80\xa1\x66\x0b\xfa\xed\x8f\xb2\x41\xee\xf0\xbb\xb2\x6a\xff\x79\x05\xc1\x6b\x21\x14\xca\xab\x39\x9b\x63\x5f\xa0\xf6\x05\xf6\xc7\xfe\xa4\xff\xe5\xbe\xa2\xc1\x42\x24\xd1\x0b\x6e\xb7\xb2\x95\xac\xf6\x67\xcc\xff\xf9\x6c\x9c\x85\x44\x23\x89\xf8\xb1\x9d\xa5\x17\x16\x84\x85\x4c\xc2\x50\x31\x60\xf2\xe1\x41\x31\xef\x8b\xbf\x94\x9f\x93\x82\x0e\xd7\xc6\x86\x44\xc4\xb0\xc7\x80\xef\x48\xea\x05\x5b\x70\xc6\xc2\x14\xe9\x2a\x64\xd3\x48\x47\x1d\xdf\xfe\x2a\x33\xe3\x84\xef\x47\xc8\xaf\xb9\x51\xc1\x19\x97\x8c\xf8\x28\xf7\x32\x3f\x74\x56\xfc\xc4\xe1\xf9\x59\x2c\xa6\xf3\xb3\x39\xe3\x20\xa5\x1d\xc8\x1d\x55\x83\x52\x25\xce\xb8\x95\xe8\x85\x7f\x7f\x6b\x9d\xe9\x37\xf9\x6b\xce\x7a\xce\x99\x88\xb9\x93\x6c\x6c\x9e\x30\x46\x88\xfd\x3d\x2d\xcd\x70\x8d\xc3\x98\x4c\xfd\x1a\xa5\x4c\x2b\xd9\xa0\xde\x09\xee\xdb\xdd\x56\xc9\x59\x98\xc5\x10\x79\x29\xdf\xcb\xe8\x33\x67\x21\xb0\x8c\x18\x49\x8d\xd9\xc3\xfa\xad\x44\x70\x49\x47\x2b\xc7\x59\xc4\x62\xdb\x93\x91\x8c\xe2\x3c\xc3\x51\x80\x35\xc7\xb8\xf9\x5b\x74\x5f\x6f\x17\xc7\xe3\x68\x39\xe5\x2c\x02\x8b\x09\xc2\x2d\xc2\xc5\x9b\x4a\xba\x95\x66\x22\x42\x3c\xf9\x66\x71\x00\x88\xe2\xa6\xdd\xf2\x1b\xca\x67\xdc\x4e\x31\xa4\x9c\x25\x5c\xe3\x2e\xb7\x6c\x87\x70\xed\xe1\x37\x73\x50\x4b\xce\x12\x1d\x20\xe5\x17\x46\xaf\x97\x65\x61\xf3\xea\xd0\xa3\xa6\x7d\x23\x48\x12\x3d\x28\xa1\x9b\x91\x1c\x6c\x5b\x59\x89\x45\xa5\xcd\x5b\x5e\x51\xd2\xbc\xdf\xcf\xbb\x2e\xcc\x24\x43\x6a\x33\xa2\x92\x26\xfe\xa6\x29\xc4\x0e\xd1\x1a\x99\x98\x90\xc8\xf4\x20\x8b\xb9\x89\xce\x99\x84\x84\x0a\x04\xdf\x40\xbf\xbf\x82\x85\xaa\xf2\x09\x7e\xff\xb2\x2a\xb2\x84\x3e\x40\x47\x5d\xee\x6f\xa1\xc8\xaf\x64\x17\x39\x53\xa9\x8c\x7b\xf9\x4c\x4f\x74\x7b\xb7\x97\x3b\xff\x2e\x3a\x4c\x90\x5e\xbc\x7d\x8e\x59\xa1\xde\xc9\x13\x6a\x80\x98\xd8\x3f\xf2\xdd\x5b\x83\x0b\xbf\xb3\xc3\xc7\x77\x36\x41\x84\x4b\x96\x3a\x9d\xa9\xf4\x6e\x7c\x19\x93\x01\x56\x2f\x39\x2d\xa3\x6b\xb1\x8c\xf9\xb7\x32\x3a\x41\xa3\xc3\xb8\x22\xbb\x6e\x01\x0c\xfc\x64\x36\xb6\xe3\xae\x77\x1e\xe6\xc3\xed\xe4\x09\x6c\x4a\xc3\xfb\xb3\x2b\x58\xb1\x5d\x8e\x84\x33\x6b\xe2\x88\x1c\xd0\x1b\x70\xe4\x17\x74\x84\x33\x26\x30\xcf\x46\xf3\x07\xd1\xae\xc3\x49\xcf\x99\x30\x18\xff\x32\xf0\xf1\x2a\x9b\xbc\xec\xce\x0b\x22\x24\x8a\xc0\xb5\x70\x4b\xa4\x2d\x73\x5b\xb1\x63\x38\x6a\x3f\x1e\xf7\x1a\x83\x6e\x69\xeb\xf4\x7e\x07\xbe\x35\xe7\x3c\x02\x84\x69\x6a\xda\x16\xfa\x10\x1f\xe7\x5c\x1b\xe1\x50\x72\x37\xa7\xf3\x2b\x92\x0b\x8c\xbb\x81\x8b\x28\xcc\xba\xf2\x61\x03\x53\xae\x38\xce\x85\xe2\xbe\x7a\xe4\xe6\xe4\x02\x31\xb3\x83\x97\x07\x71\x82\xf1\x69\x84\x31\x4f\x6e\x13\x80\x41\x75\x97\xdf\x57\xaf\x5f\x57\x8f\xdb\xc5\xcb\xcb\xf6\xe1\xd6\x3f\x66\x60\x05\xda\x41\x5b\x69\xb0\x76\x7a\x76\xe1\xe0\x61\xca\x11\x8a\x75\xb7\x58\x6e\x9e\x5f\xb7\xd9\x6f\xdd\xef\x11\xe6\xd1\xf2\x02\x99\xf8\x4f\x72\xbf\xd5\x3e\x3a\xcf\x79\x98\x11\x85\xf3\xce\x29\x20\x4c\x9e\x2b\xb4\x1a\xa8\xe0\x10\x64\xe5\x62\x1b\xee\x50\xac\x15\x16\x8e\x7d\xff\xfe\xb5\xb7\x16\x39\x8f\x6d\x1c\xb8\xe4\xd5\xdd\xa9\x20\x12\x74\xf8\x80\xe2\x92\xa3\x85\xf3\x44\x04\x60\x7c\x65\x75\x7e\xf4\x64\x4b\xb3\x33\x8b\xa7\x8c\xb2\x3f\x40\xb5\xbd\xbf\x9f\x35\x45\x84\xc6\xbd\x90\x06\x19\x09\x87\x9c\xea\x37\x54\xcb\xdc\x97\xe5\x68\xab\xe2\x69\x18\x64\x3d\x31\x0c\x95\xaa\xdf\x82\x34\x7d\x5d\x1e\xe7\x69\x92\x62\x74\x55\x1a\x67\xb4\x8d\x1f\x25\xe3\xdc\xcb\x13\x51\x5c\xab\x1d\x7c\xb3\x8a\x24\x6d\xe3\x98\x73\x37\x82\xda\x2d\x1b\x01\xf3\x77\xcb\xbb\xc1\xae\xc5\xb3\x58\x6b\x22\x50\x3e\x55\xed\x08\x2b\x2e\x62\xa2\x7e\x1b\xe6\x59\x96\x26\x9e\xf5\xd4\x97\x37\x2c\xdb\xd5\x70\xba\x54\xf3\x0c\x52\x5c\x05\xf2\xa2\x9d\x8a\x35\xcc\xe4\x84\x39\x97\xdc\x42\x36\x10\x69\xa8\x6f\x4e\x3d\x5d\x12\xe7\x32\x09\x85\x7b\xf6\xaf\xf0\xb9\x68\x5c\x11\x6b\x3d\xc3\xba\xc4\xb9\x0a\x98\x4c\xba\x2f\x6f\x64\x95\x4b\x47\xe6\x3c\x1b\x2d\xe2\x5c\xc5\x01\x96\xe8\xb5\xc3\xe7\x28\xab\xf7\x41\x28\x87\x73\x95\x08\x1d\x50\xd0\xad\xfd\x7a\x53\x88\xf4\xa5\x4e\x4a\x7b\x8e\x8e\x70\x0a\xfc\x91\x2b\x18\x8e\x49\x6d\x33\xcf\x51\xf7\x50\x34\xb0\x83\xea\x0f\x79\xda\x4f\x3f\x94\x49\x44\xc8\x47\x5f\xa1\x1b\xeb\x26\xe5\x28\x81\xbf\xc3\x7e\xe8\x7f\x96\x01\xbe\xf1\xb1\x3c\x22\x33\x0b\x06\x88\xab\x4a\x9e\x27\x3e\x30\xe7\x90\x04\xc8\x4d\xb3\x6e\x7d\xb9\x5c\xd6\xd3\x0a\x06\xdf\x4c\x2a\x64\x52\xa0\xcd\x9f\x70\xce\xd7\xf3\x23\xbf\xcc\x8e\x70\x6e\x95\x44\x1f\xf2\xeb\x6a\xf3\xe4\x9e\x5a\x30\x45\x65\x94\x8b\x63\xb9\xdf\x97\x6b\x38\x36\xd0\x6f\xbc\xab\x1f\x0d\x20\x95\xc8\xec\xd6\x22\x84\x48\x10\x10\xb3\x79\x58\xbd\x06\x84\xef\xf1\x97\x15\x81\x44\x18\x03\x0a\xa0\xf5\x42\x15\x7c\x7b\xd7\x85\x52\xb9\x08\xa4\x41\xeb\xc6\x55\x8f\x78\xee\x20\xaa\x0a\xfc\x5a\x76\xcd\xb4\x41\x58\x8e\x01\x9d\x1b\x58\x1f\xf7\x33\x9c\xa7\xc3\xb1\x27\x02\x88\x89\x47\xa9\xdc\x11\xff\xc4\x95\x45\x58\x04\x60\xbd\xa0\xef\xd7\xd3\x01\xf5\x38\xb0\x7a\xa5\xdb\xc0\x44\x60\x5d\xd1\x2c\x34\xab\xc3\x71\x5f\x9e\x01\x2e\x34\x21\x39\x17\x61\x22\xb0\x7a\xdf\x95\xcf\x57\x15\x02\x1e\xee\x00\x5e\x41\xe7\xc7\xa1\xf8\x8a\x3f\x41\xb3\xc8\xd3\x6d\x97\xbb\xc9\x92\x22\x42\xc8\xc0\x95\x16\xda\x52\x9f\x6a\x2d\x2b\x73\x1d\x2a\xef\x4e\x8a\x05\x67\x51\x77\xc9\x9f\x7a\x96\x5c\xc4\x0e\x3c\x5b\x93\xa4\xe7\x7f\xe1\xae\x5d\x18\x2b\x18\xea\x3a\x5d\xb9\x4f\xa2\x20\x4b\x5c\x3d\x01\x52\x2b\x3e\xca\xba\x59\x7c\x40\x25\x3b\xa1\x07\xdf\x7b\x69\x42\x1a\xcc\x79\x8d\x43\xaa\xe7\xd1\xe0\x22\x55\x51\xd6\x41\xd6\xd1\x76\x14\x38\x6b\x3a\xa5\x91\xb6\x09\xd1\x0b\xd3\x6e\x84\xe4\xc7\x7e\xe9\x18\x3f\x51\x16\x32\x9b\x39\xb9\x2e\x62\x1a\x9a\x2c\x7f\x22\xb3\x31\x06\x33\xd6\x9b\xc5\xef\xab\xed\x7a\xb3\x78\xdd\x6c\x37\x0f\x4f\x2b\x7f\x2b\xc9\x33\xf4\x67\x56\x05\x71\xa1\x4d\x4e\x57\x81\xc6\x94\xf3\xd3\xe9\xc7\x10\x81\xc4\x85\x0a\x43\x54\xfa\xde\xca\xe3\x11\x0a\xb3\x91\xbb\x1d\x98\xeb\xa4\x36\xed\x09\x54\xbb\xad\x1a\x5d\x0d\x2d\x25\xa1\x13\x86\xd9\xb9\x27\x59\x9c\x5a\x3b\x95\x64\xf4\xfc\x41\xcd\x30\x68\x86\xe2\x78\xcb\xd7\x67\xff\xbb\x71\xa1\x7d\x4c\xba\xd8\x1b\xb9\x5f\x43\x4f\xcc\xcb\x85\x49\x62\xae\x5d\xc4\x11\xb9\x83\x1c\x5a\x6f\x8c\x1e\xf4\x8d\x4d\x88\xbd\x8d\x62\x6f\xa4\x5e\x48\xbc\xcc\xee\x38\x04\xa4\xa3\xec\x61\xf5\x58\x71\x3d\xfe\x0e\x10\x32\xe5\x7c\xdd\x2e\xff\xb2\xda\x7c\xb9\x32\xf9\x40\x92\x66\x70\x47\x4a\xe9\x35\xb0\x26\x9d\x0f\x26\xb0\x91\x53\xbb\x68\xbe\x43\x3e\x17\x31\xe6\xc2\x46\x80\x26\xb4\xcb\xbc\x8c\xea\xc1\xe7\xef\x6f\x55\xa2\xb3\xce\x65\x73\x68\xa9\xbc\xd8\x0d\xf6\x62\x61\x15\x64\xc3\x9a\x4c\x47\x92\x3c\x28\x0d\xa1\x86\x01\x13\x29\x4f\x7d\x08\xc9\xce\xc6\x76\x7c\xcb\xd4\xc4\x3e\xac\xf8\x28\x8b\xa1\xf0\x88\x6b\x21\x2c\x15\x89\x6d\x4f\x4d\x49\x61\x51\xe7\xce\x04\x41\x14\xc8\xb4\x27\x51\x86\xe1\x1e\x3e\x6f\xfe\x07\x81\x4d\x33\xd3\x11\xf0\xde\x57\xe5\xe7\x40\x8d\xcf\xb5\x09\x99\x16\x6e\x43\x5b\xdd\x6f\x50\xdb\x65\x28\x83\xc3\x83\x50\x50\xc4\xdf\xd5\xaa\x60\x00\x28\x2f\xab\xbc\x19\x92\xb2\xce\xa0\x6c\x7e\x06\xef\x4d\x67\x19\xd3\x79\x10\x66\xe4\x85\xb9\x68\xfc\x16\x3a\x3f\x23\x08\x55\x82\xe6\x29\x1c\x8e\xcd\xf9\xa6\x34\x63\xc4\x3f\x0f\xa2\x28\x4a\xfd\xf8\x6b\xbd\xcd\xc7\xfc\x30\xb5\xad\x83\x48\x05\x18\x4f\xf6\x69\x4d\x64\x0e\x29\xe4\x9e\xa2\x76\x7e\xb4\x07\x71\x28\x7c\xae\xd7\xf9\xc8\x38\x25\x96\x17\xc4\x49\xad\x21\xaf\x04\x45\x44\xeb\xa6\x2a\xcf\x9d\xbd\x14\xc4\x52\x12\x2e\xa8\xd4\xef\xc8\x87\xfb\x01\xe4\x70\x8c\x9f\x28\x65\x0c\x67\xe9\x1e\x8a\xdd\x5b\x03\xc5\x5d\x55\xfe\x17\x0a\xb4\x0c\xe7\x8d\xdf\x20\xcb\x18\x8e\xf5\x97\xd7\x87\xe5\x6a\xfb\xf4\xed\x71\xf3\xf0\xf2\xf8\xb0\x7a\xf5\x37\xce\x64\x10\x0d\xf4\xf2\xee\xca\x6a\x4c\xea\xcf\x03\x99\x02\x6e\x7c\x77\xf9\xde\xef\xc6\x81\x12\x40\x8c\x79\x27\x84\xe2\xa2\x83\x37\x1e\x4b\x2a\xd2\x7d\x2d\xef\x68\x8c\xfb\x06\x2a\x25\x89\x8a\x0f\x28\x9a\x9f\xb2\x54\x76\xbd\xa7\x23\xca\xba\xae\x0f\xb2\x6a\x6e\xf2\xfd\x3e\x2f\xbb\x35\x27\xd0\x92\xa8\xcf\x9a\xbc\xed\xc1\x99\x08\x4e\xa0\x21\x44\x66\x0a\x02\xd6\xdc\xe4\x86\x98\xdf\xdd\x51\xc3\x33\x5c\x54\x7b\x32\xa7\xfa\xae\xac\xda\x6d\xe8\xf6\xd4\x2e\xca\x0f\xcb\xe7\xb0\x6b\x1b\x08\xa4\x57\xd8\x74\x06\x9f\xb7\x32\xc7\x9d\x6f\x1c\xa5\x74\xeb\x0d\xb4\xe3\xc0\x6b\x22\x8f\xc9\xe6\x2f\x0a\xb6\x86\xbb\x40\x00\x82\xc0\xff\x1f\x65\x97\xfd\xf0\x47\x22\x85\x82\xdc\x46\x9e\x37\xe5\x20\x8c\x12\x40\xac\x68\xd9\xc8\x8f\xf5\xc2\x98\x4d\xf9\x08\x66\xe7\xe3\x36\x82\x4d\x66\x3d\x64\x06\xd1\xc4\xb7\xf9\x2e\x6f\xe4\xfe\x77\x38\x0f\x2c\xe0\x00\x1c\x06\x59\xee\x73\x4d\x54\x21\xb5\xa7\xf0\x9f\x15\x57\xbd\x7c\x1d\xba\x50\xc8\x98\x49\x49\x54\x21\xff\xd8\x5a\x59\x37\xf7\x6e\xe6\x7d\x91\xf5\xdb\x76\x3b\x43\x25\xc0\x43\x6e\x12\xd3\x9e\xf3\xed\xf5\xc1\x3d\x4f\x28\x98\xc5\x4a\xf6\xa7\x7f\x3d\x7c\x7d\xd8\x3c\x2c\x1e\x87\xb5\x37\x3c\x14\x21\xe0\x94\xed\xb8\x0b\x71\xce\x5a\xa9\xc7\xce\x77\x28\x52\x8d\x91\xd8\xdb\xcd\x9f\x97\x51\x56\x1e\x0a\x13\x22\x57\x73\x7d\x6c\x5d\xaa\x53\x61\xfc\x30\x0b\x83\x34\x42\x43\x7b\xd1\x2e\xde\x9f\xc3\x20\xdf\x2c\x31\xe8\x68\x3c\x84\x81\x66\x34\xfd\xa9\x5c\xec\x61\xf9\xbc\xfe\x94\xc7\x47\x2f\xe4\xcc\x79\x18\xa6\x12\x47\x71\xad\x4f\x4d\xd3\x59\x40\xc8\x1f\xe0\xb2\x0e\x53\x31\x0d\x1e\x46\x52\x20\xc9\xde\x68\xb7\x1d\xd7\x2b\xcc\x62\x5a\xd2\xee\xfc\x30\xd3\x03\x45\xaf\x4d\x75\x72\x25\x3e\xfe\xf6\x31\x23\xb1\xf9\x1a\x9a\x76\x00\x6e\xc7\x80\x12\x1e\xc6\x3c\x46\xf8\xc9\xf1\x54\xbf\xbd\xca\x06\x5e\xf6\xf2\x22\x8c\xdb\xad\xe0\xdd\x84\x0c\xe3\x80\x61\xf9\xc8\xe2\xf6\x8f\x87\xf5\xf3\xeb\x7a\x8b\xcc\x57\xeb\xed\xf8\x93\xc6\x81\x64\xbc\x0b\x39\x1d\x8e\x1d\x10\x84\x87\x71\xcc\x31\x95\xfd\x52\x41\x53\x56\xb9\x9c\x17\xa2\xf0\x8d\x13\x33\xa1\xd6\xf8\x56\x5f\x49\x0c\xf0\x30\xe1\xc4\xe1\x84\x06\x72\xb1\xbb\xef\xe2\x1e\x61\xc2\x49\x6a\x9b\x34\xed\x5e\xa0\xc2\x34\xb8\xe8\x0e\x2b\x8e\xe0\xaf\x27\xa8\xb4\x6c\x4e\xf5\x2d\x78\x99\x59\xce\xc3\xd4\x64\x98\x8f\xed\x85\x04\xcd\xab\x6c\x72\x7b\xee\x1b\x38\x57\x08\x6d\x58\xf8\x5e\xe5\x4d\x33\xe0\x63\x1d\xbd\x4f\x96\x68\x84\x16\xbf\xec\xe5\x79\xf9\x26\x8f\x43\x63\x33\xcc\x14\x15\x29\xbd\x90\x4a\x8e\xcf\xe3\x8c\x47\x79\x66\x93\x80\x18\x96\x8f\x52\xbf\xf7\x71\x16\x1f\x29\x0b\x55\x68\x71\xbb\x79\x2b\x3f\x9f\x64\x71\xbe\x3f\xc9\x4a\x16\x0d\x74\x56\x63\xa8\x80\x88\x9f\x3b\x31\x36\x5a\x38\x6d\x97\xf5\x71\xed\x0c\x73\x18\x79\x59\xbd\x7f\x29\x4f\xd5\x45\x2e\x61\x3c\xef\x4d\x90\xe2\x24\x2b\xca\x66\xf5\x43\x03\xb4\xaf\x40\xa4\xfe\xc7\xc9\xc8\x33\x71\xa6\x5c\x54\x63\xf9\xfa\x28\xa7\x8c\x55\x3c\x34\xa9\x02\x57\x48\xf8\x15\x3e\x2f\xf4\x5c\xdb\x16\x32\x80\xc0\xa1\xab\xbf\xe7\xcd\x1b\x6e\x48\x57\x86\x85\x01\x16\x79\x95\x51\xc2\x72\xb4\x5e\x5b\x59\x99\x7a\x1a\x6f\x09\x21\x4c\xd1\x81\xd6\x65\xd1\xba\x95\xa7\xbd\x24\x59\x65\xf8\xd1\x4d\x2b\x88\x55\xe0\xe2\x1e\xb7\xd0\xfa\x04\x50\xe8\x7c\xa6\x8c\xe3\x17\x7f\xdd\xd5\x2c\x03\x64\x78\xa1\x2a\x36\xbf\x57\x85\x36\x23\x6a\xbc\xa3\x3c\x5f\xac\xd8\xa3\x45\x82\xda\x47\x2c\xce\xb0\xcc\x02\x99\xa0\xdd\xf7\x1c\x16\x67\xb7\x2d\x0c\xea\x95\xd8\xb2\xda\xe5\x1f\xb0\x79\xcb\x27\x7b\x7b\xc4\x03\x25\x9d\x71\xb5\xd9\x7c\x1f\xa5\xba\xc6\x0d\x23\x21\x90\x7e\xf8\x4b\x69\x2e\x44\x07\x7d\x13\xc3\x70\x42\xf5\x18\xaa\x3e\xe7\x12\x45\x36\xc6\xa5\x0f\x03\xec\x37\x48\x97\x5c\x35\x57\xd4\x0f\x78\x14\x07\x0a\xa1\x07\x2b\x7a\x22\xb2\xfe\xfd\xa5\xe2\xd8\x98\xa4\xe7\x05\x7b\x92\x3f\xba\x23\x89\xcd\x22\x47\x8c\xd6\xee\xf6\x7f\xca\xd9\x77\x49\xb2\xc0\x84\x54\x43\xba\x6c\xf7\xb5\x83\xec\x6a\x0a\x78\x94\xf2\x14\x63\xce\x79\xdd\x4e\x0c\x5d\x12\x3a\xa7\x3b\x9a\x09\xc4\x6c\x6e\x29\xf6\x4d\x94\xc6\xb3\x5f\x39\x4a\x6d\x9c\xc5\x3d\xe0\x4b\x56\x55\x2e\x77\x70\x31\x9d\xae\x60\x14\xdd\x45\xb2\x24\xd6\xa1\xe7\x00\xe0\xfe\x29\x32\x1b\x8c\x1c\x18\x97\x57\x39\x1d\xf3\x6b\xcb\x64\x94\x59\x12\x49\xcb\xeb\xc5\x7c\xf6\x2d\x92\x61\x00\x59\x07\x02\x6b\x3d\x01\x17\x9c\x9a\xcc\x97\x48\x25\xa4\xbb\x5e\x43\xf3\xfc\x01\x95\xf3\xdc\xd0\x2c\xff\x52\xee\xcd\x5c\x49\x08\x8f\x94\x09\x1c\xc1\xdc\x5f\xa0\x9b\x1e\xf2\xe1\x51\x28\x9e\x69\xbf\x6d\x69\x21\xe9\xe2\x47\xfa\xfc\x24\x8f\x93\x27\xd5\x10\x04\xc2\x15\xac\xe1\xef\xce\x67\x1a\xb7\x82\x20\xf3\xa4\x75\xe8\xfc\x68\x8f\xb3\xf3\xc7\xb3\xc0\x97\x58\x7d\xa3\x37\x7c\xea\x8c\xa9\x08\xb4\x46\x0b\xb4\x1d\x63\x8e\x34\xa7\x57\x44\xc7\xe3\x10\xea\x61\x7e\x78\x96\x6f\xc4\x35\xb6\x82\x14\x44\x48\xe1\xf4\xe6\x74\x86\x8a\x9c\x98\xf1\x03\x5b\x41\xcc\x32\xdd\x7e\xd5\xb1\x01\xf3\xc8\xc6\x09\x8e\x6c\x8d\xb9\xc0\x9e\x9d\x84\x47\xd6\x30\x8c\x16\x63\x1e\xda\x53\xd1\xff\xbd\x44\x3c\x8f\x99\x4c\x99\xb3\x56\xbe\xe7\xc5\x06\x0d\xf2\x2b\xc1\xf9\x98\xa9\x0c\xb5\x75\x3b\x5c\xfb\x8b\x3c\x57\xe5\x7e\xff\x7a\x2a\x3e\xe5\xd9\xb1\x1f\xf9\xde\x8d\x39\xd3\x22\x22\xb2\xb4\xee\xa7\x20\x04\x12\x5d\xab\xdf\xfb\xdf\x2c\xba\xeb\xbb\xd2\xdc\xc8\xa2\xff\x39\xe3\x88\xd2\xd9\xc9\x06\x3e\xbb\xd8\x51\xcc\x65\xa4\xd3\x2e\xae\xff\x74\xfe\x52\xd4\x73\x48\x11\x1e\x73\x23\xd0\x7c\xeb\xd1\x41\x0d\x3c\xd4\x28\xec\x3d\x35\xfd\x63\x21\x42\x1c\x27\x7b\x59\x37\x9b\xcf\x72\x71\x50\xb2\xae\xa5\x29\xab\x76\x74\x75\x1b\x68\x1c\x0a\x8e\x51\x99\x23\xe5\x3a\x57\x07\xa8\xe4\x50\x8f\x72\x7c\xd1\x10\x38\x77\x83\xcf\x27\x6e\x7d\x81\xed\x30\x53\x11\x47\x82\x63\xaa\xec\x6b\x89\xd5\x51\x97\xfc\x9f\x93\x17\x8b\x0c\x55\xa4\xb6\xe3\x0e\xe4\x01\x79\x29\xdc\xa1\x38\x09\x82\xc8\x2f\x15\xaf\xd0\x54\x39\x7c\x74\x99\x76\x74\x77\x77\x81\x6f\x9b\x80\xc6\xcd\x98\xa2\x24\x23\x0b\x20\x4e\x93\x44\xf7\x9a\x4e\x4e\xa6\xa5\x17\x9a\x74\xad\x64\x6c\x11\xb6\x3b\x20\xd7\x4c\x86\xe4\x9a\x3c\x96\xa9\x20\x62\x80\xbc\x5d\x9f\x8e\x9b\x4a\xea\x77\xa8\xb6\xfe\xb0\x8a\xa2\x58\xf9\xc8\x14\x54\xbc\xfb\x3d\x91\x32\xeb\x73\x29\xf7\xb9\x6d\x9e\x0b\x0d\x33\xf2\x55\x3c\xd6\x41\x88\xfc\xa6\xdb\x1e\x68\x44\x24\x1b\x93\x87\xd5\x31\x69\x80\x53\xcc\xd1\xe6\xcd\xa5\xde\x18\x8f\x75\x26\x54\xe2\x91\x7c\xfa\x62\x3a\xa7\xff\xb8\x4c\x45\xc5\x26\x25\xe5\x3f\x24\x12\x23\xd3\xed\x70\x11\x16\x8e\x21\x4d\x44\x3c\xac\xca\xbb\x95\x8e\x47\x9c\x40\x9f\x03\xad\x42\xdf\x0b\x20\x33\xd6\x43\x14\x56\x9b\x2f\x4b\x59\x19\xa7\x99\x92\x2b\x97\xd7\x18\xd6\xe6\xfe\x2a\x30\xd3\x77\x9a\x55\xc2\x2f\xdf\x9b\xce\x32\xde\x7c\x99\x74\xad\x05\xe2\x6e\x5a\xee\xf3\xe3\x11\xaa\x39\x45\x8b\xcb\xf5\x24\x61\xa1\x8d\x5c\xc2\xbf\xdd\x9a\x1f\xfb\x9d\x33\x61\x32\x41\x36\xc6\xcf\x6e\xc1\x5f\x96\xe5\x9e\xb2\x6a\xb9\x17\xb9\xe4\x09\x8f\x02\x4c\x5b\x2f\xcb\xea\x88\x37\x9d\x9d\x5f\x09\x8f\xb4\x97\xad\xc4\x90\x45\xeb\xcb\xdc\x95\x0e\x76\x71\x83\x30\x89\xc9\x09\x49\x84\xbe\xc9\xc3\xea\xee\xe6\x95\x87\x93\x60\x59\xc2\x33\xe3\x37\x8b\x2e\x4f\x52\xdf\x95\xd5\xd0\xf1\x70\x4d\x45\x0a\x9a\x96\xe9\xdf\xaf\x54\xd4\xf0\x24\x10\xa9\xca\x9c\x10\x65\x6e\x28\xeb\x7c\x85\xfc\x67\x70\x52\x62\x12\x37\x4a\xef\x2a\x80\x41\x16\x3b\x09\xd2\x04\xe7\xb6\x2a\x94\xdf\x30\x57\xae\xf0\xc7\xb7\xd0\x12\xc5\x9e\x97\xb2\x7e\xbb\x91\x7a\x94\x68\x4b\xc2\x18\x7c\x09\xe0\xfa\x28\x35\xd4\x6f\xf9\xd1\x69\x6e\x0d\x57\xa3\x24\xd4\x52\x74\x8a\xe6\x8f\x65\x5d\x0f\xe3\x2e\x49\x14\x12\x83\x61\xbb\x50\xbe\xc8\x0a\x0a\x8a\x0a\xf8\xc3\xb1\x60\x51\x07\xf5\xf9\xe1\xd0\x25\xff\x3c\x95\x3d\x08\xd4\x35\x4c\x44\x82\x0d\xff\x7d\x8d\x09\x77\xd2\x2f\x49\x10\x21\x5c\xe7\x2b\x7c\xfe\xb3\xbd\xe6\x9c\x02\x20\x4f\x92\x38\x8c\x54\x57\x40\xf6\x31\x6f\xe4\x24\x49\x9c\xa0\x21\x4f\x99\x0b\x14\xba\xfd\xc5\xcd\x13\x12\xf0\x26\xc9\xfd\xa1\x0d\x90\x24\x69\x26\x3c\xe7\x18\xd9\x40\x37\xe7\xc5\x8c\xbd\x99\x24\x46\xe3\xd6\x51\x9c\xf6\xfb\x3b\x39\x0d\x72\x27\x29\x23\xb7\xe6\xf9\xfb\xd7\x2e\xda\x97\xa4\x8c\x7c\x69\xa8\xb4\x60\x4d\xd7\xc9\x69\xa6\x90\x06\xa7\xf8\x4b\x8d\xbe\x70\x6a\x29\x2d\x7a\x52\xb9\x6c\x64\xd5\x7a\x9a\xa3\x67\xcd\x78\x10\xa7\x1d\xf4\xc7\x55\x33\x3e\xe8\x92\xf0\x2e\xbe\x51\x42\x40\x18\x8c\xf4\xd7\xf0\x52\xc1\x21\x3f\x1d\x26\x5f\x2f\xd3\x16\xf3\xa4\xfb\xf2\x13\xfd\x69\x9c\x7e\xa3\x71\x22\x99\x24\x8e\xa6\xb2\x3e\x94\xa3\xa7\x94\x61\x28\x9c\xb7\xf1\xf0\xb0\x5d\x4f\xae\x2c\x23\x85\x01\xa3\xcb\xe2\x73\x9e\x28\x9e\x61\x4c\xaa\x2e\xf7\x0e\xa5\x4c\x16\x94\x3f\x1c\x26\x8c\x0c\x7f\xfa\xe8\xe3\xa1\xa1\xe2\x48\x90\xc6\xc6\xa7\xac\x4c\x5e\x34\x50\x7d\x74\xf6\x66\xa2\x25\x60\x18\x1c\x4c\x4e\x5e\x09\xa2\x86\x7b\x94\xdc\xc4\xfc\x4d\x4c\x48\xd4\x95\xc8\xd0\x61\x5c\xa8\xde\xab\xa1\xf2\xc4\xa4\xc2\xc4\xce\xb9\xc3\xc9\xe5\x77\xb6\xc4\x64\xa1\xa3\x23\xe9\xa4\x02\x86\x74\x24\x3c\x31\x46\x62\xc6\xeb\x13\x72\x02\xdc\x3c\x14\xa3\xad\x39\x31\x20\x30\x9b\x73\x1c\xc1\x8d\x26\x23\xd6\x58\x0a\x43\xfa\x85\x76\x9c\x75\x4a\x20\x16\x3e\xff\x86\x29\x3e\xd2\x5b\xaf\x1d\xbe\xe6\x26\xef\x46\x83\x75\x12\x4d\x4e\xec\xfd\xdf\x3f\x2e\x75\x1d\x79\xca\x92\x94\xbe\x0b\xc8\x4a\xbf\x39\xdd\x39\x7f\xcc\xc4\xb8\xa6\xb6\xa7\xef\xef\xba\x04\x14\xee\xbd\x5f\x4f\x07\xd2\x2a\xeb\x1a\xdb\x34\xe8\xf9\x67\xee\x9e\x5e\x3c\xbb\xe8\xac\x3b\x9a\xf2\x40\x84\x3d\xad\x46\x35\x3d\x1a\x05\xe8\xac\x22\x29\x72\x6b\x27\x2d\xcc\x47\x5e\x97\xd5\x28\xff\x91\x72\x19\x12\x3f\x30\xfa\xcf\x88\x7c\xe9\xd0\x22\x93\xfd\x21\x15\x42\xa3\x71\xf0\x6d\xf3\xf2\xd8\xfd\x16\x98\x10\xe7\xed\x92\xa0\x8d\xfd\xef\x40\xb8\x79\xba\xe9\x80\x6b\xc4\x37\xd0\x49\x16\x77\x34\xbd\x79\xbd\x35\xdd\xc6\x9f\x06\x5c\xe0\x5a\xd1\x40\xdd\xdc\xc9\x7c\xff\x72\xda\xef\xbf\xbf\x41\x31\xd2\xd3\xe3\x69\x10\x0a\x1c\xb4\x34\x9f\xbb\xc2\xeb\xd6\x11\xec\x09\xf1\x27\x76\x81\x1f\xc1\x69\x18\x4a\xd9\x4b\x54\x8b\x4e\xa2\x9a\xa7\x11\x57\xb8\x34\xdf\x3c\x2f\x5e\x6f\xb7\x41\xf7\x73\x02\xe8\x71\xd7\x47\x28\xcc\xc2\x7c\x40\xd5\xe4\xb5\x67\x13\xbf\x58\x33\xd3\x48\xc6\xca\x79\x92\x37\x37\x77\xb2\x3a\x0c\xd3\x5d\x69\x1c\x86\x08\xbc\x79\xfe\x71\xd3\xe8\x5b\xb8\x54\xd7\xff\x5b\x66\x4c\x1a\x47\x24\x8a\xfc\x67\x5e\xfc\x99\xcb\xe2\x3a\xa5\x7a\xdb\x34\x66\x30\x80\xc9\xac\x9a\x37\x07\x68\x1b\xb7\x4b\x02\x40\xcf\x73\x0d\xcd\x7d\xbb\xd1\x5c\x04\x70\xd3\x24\x24\x9f\x92\x86\x9d\x1f\x24\x97\x59\x1d\xff\xae\x49\x1c\xe2\x8a\xda\x7e\xcd\x87\xa2\x6e\x64\x6f\xc2\x76\x48\xbd\x34\x49\x03\x84\x19\x3c\x50\xac\x71\x84\x6b\x9f\x7f\xa1\xc4\x50\xbe\xf9\xa3\x6c\xa0\x87\x54\xa4\x29\x4f\x31\xfb\x5e\x37\x65\x05\x6b\x2c\x17\x19\x4c\xc7\xd4\x4d\x99\x76\x09\x5d\x7e\x5f\xce\x57\x5f\xf9\x35\x33\x4d\x03\x1d\x1b\x47\x0b\xb0\x7d\xf3\xe4\x81\x3f\x01\x26\x5e\xf9\x4c\x69\xac\x30\xd6\xf2\x91\xc3\x67\x10\xfb\x67\xc9\x82\x10\x7d\x0c\x64\x28\xee\xf5\xdd\xfd\x61\xc9\x68\x80\x4a\x83\xd5\x53\xd3\xce\xf8\xf9\x1d\x65\x66\x14\x89\xb7\x7c\x40\x71\x02\x32\xf5\x27\x4d\x24\xa9\x4c\x75\x2a\x02\x48\x20\x36\xee\x00\xc5\x2c\xce\xe2\x5a\x8e\xf4\x67\x79\xaa\x22\x62\xa2\x7b\x2c\x77\xed\xd2\xe2\x5c\x8e\x9e\xe8\xef\xca\x20\xd4\x4a\x63\xad\x2b\x72\x5b\x7e\x6f\x57\xf8\x2e\x0d\x94\x6a\x90\xe8\xee\xb6\x96\xd5\xc2\xfc\x75\xea\x9c\xba\xd4\xc8\xd8\x3a\x9b\xb0\xf5\x86\x7a\x02\xd8\xf1\xc5\x8d\x49\xb1\x2a\x17\x71\x17\x50\x2f\x6c\x03\xd5\x72\x5f\xd6\xd3\x17\x07\x6e\x91\x35\x72\x87\x6c\x12\xb8\x7d\xad\xa1\xca\xbb\xcd\x30\x85\x80\xab\xc4\xdb\xd5\x55\x85\x12\x88\x57\x75\xdf\x78\xc6\x22\x8e\xa3\xe4\x9e\x34\x9a\xe7\xd7\x83\x8c\xc5\x61\x42\x7c\x7a\x67\xa8\x3c\xe1\xfb\xdf\xfa\x98\x19\x8f\x35\x4e\xc9\x76\x95\x7b\xd0\xe5\x84\x22\x65\xb6\xa7\xb3\x20\x00\x1c\xe8\xf8\x4d\x0e\xa7\xe6\x12\xe9\xf4\x8b\x9b\x06\x89\xd6\xc6\x7b\xd2\xdf\x88\xb8\xa9\x35\x0c\xbc\xfc\xc0\x95\xb3\x20\x48\x3d\x21\x2e\x01\x05\x83\xf9\xa1\x90\x85\x60\xb0\xda\xe6\x28\xcf\xa8\x53\xdd\x4f\xd2\x2c\x12\x01\xb1\x90\x14\xaf\x54\x8b\xef\x7e\x8f\x19\x89\x4b\x16\xf0\xb9\x3c\xeb\x7d\xff\xbb\x20\xab\xd7\x4b\xe0\xdd\x3e\x7c\xed\x0e\x85\x59\xe0\x42\x54\xff\x53\x2a\xbf\x56\xd5\x73\xeb\x54\x16\xc7\x19\x0e\xce\x7b\x2c\x44\xcc\x8f\xf7\x79\x63\xbb\xeb\x18\x30\xd2\x63\x0d\xba\x01\x7f\xe5\xd5\x62\xab\x62\x36\x52\xc3\xd8\x94\x2f\x08\x03\x29\xcb\xfd\x4f\x72\x3e\x59\x12\x64\xd6\xba\xa4\xa3\x6c\xb0\xd4\x64\xd5\x27\xf3\xb2\x2c\x31\x58\xfa\x73\xb3\x58\xaf\xb6\xb7\xdf\x5e\x51\xb5\xc9\x1f\x94\x2e\x2c\x84\x19\xec\x3b\xa7\xf0\x3e\x88\x94\x67\x4a\x08\x5a\x12\x5a\x23\xa4\xa3\x53\xe7\x99\xe6\x5a\x04\x3e\xe2\x86\xd1\xa1\x9f\x8c\x75\xad\x84\xb5\x3d\x4d\x70\xae\x9d\x2c\xde\xc4\x54\xcd\xb4\x02\x34\x00\xab\xc6\x29\x1d\xf4\x66\x44\xa6\x35\xf1\xc3\xd4\xd0\xf8\xa2\x9f\x19\xe5\x4d\x9e\x69\xc8\xd0\xfb\xfe\x70\xc5\x31\xb3\xf4\xe7\x3c\x33\x4c\x23\x34\xe7\xf6\x74\x50\x83\x54\x70\x66\xb2\x04\xc0\x55\x65\x87\xa3\xd2\x95\xf6\x98\xc2\xd2\xd3\xdf\x4f\xa6\xa4\x28\xc4\x88\x2b\x80\x67\xc6\x70\x35\x28\xf8\x41\x3b\x7b\xc4\xd2\xc2\x33\x60\x34\xea\xb0\xc3\x9f\x7a\xbe\xac\x81\xcb\x9a\x41\x44\x72\xa5\x18\xc1\x70\xca\xb6\xdd\x31\x45\xd2\xd2\x3b\xac\x9a\x40\xa4\xc6\xd2\x45\x7b\x5f\xaa\xd2\x95\xb3\xfb\xb6\x5a\x05\x51\x17\x15\x95\x48\x26\xb5\x83\xaf\xbe\xd8\x8c\x67\x00\x21\x06\x77\x94\x6c\x90\x7b\x4d\xc3\xde\x1b\xb5\xd3\xd0\x75\x06\x4e\xaf\xdc\xc8\xca\x27\x0d\x32\xdb\xae\x9f\xb4\x30\x6f\xca\xd6\x7d\xee\x0f\x00\x51\x22\xee\x65\x7e\xe8\xf8\x12\x4f\x3d\x0d\x39\xcf\xac\x70\x75\x73\x5e\xea\x1a\x56\x37\x9b\xe5\x14\x1a\x9a\x59\xa1\x11\x0e\xe1\xe3\xf5\xcb\x19\x3d\xb1\xc9\x44\xb2\x81\x30\xdd\x1a\xf4\x50\xdf\x82\xec\x7a\xdf\xa6\x04\x32\xaf\x4f\xc7\x63\xd9\xa5\x7e\x33\x6b\x80\xc8\xea\xde\xa4\x88\xe2\xd2\xae\x67\xb4\xd8\xa8\xa9\x64\x2c\x40\xcc\x2f\x49\xa4\xf6\x5e\x4c\x77\x7b\xc9\x32\x89\xeb\xae\xcc\xab\xdb\xcb\xe0\x9d\x64\x9a\x63\xf4\xcf\xd4\xff\x39\x0d\xb6\xd7\xf1\x3b\x48\xce\x22\xe2\x06\x46\x05\x9d\x4d\xf9\x15\x7e\xa0\xa2\xd0\x78\xb0\x4b\xce\xe2\xac\x6d\xb6\x7a\x5d\x0a\x11\xfc\xcd\xd0\xb5\xe4\x51\xe0\xb9\x39\x31\x0c\xf1\xf5\x74\x58\xe7\x85\x86\x87\x7e\x9c\x49\xae\x02\x4e\xbc\x00\x87\x83\x2c\xcc\xbd\x0b\x16\x0d\x86\xa9\x0c\x75\x82\x89\x69\x75\x3a\x5f\x41\x75\xca\x48\x26\x88\xde\x38\x76\xf0\xef\x4d\xf9\x7b\xee\x99\xa3\x78\xeb\xb6\x22\x5d\xec\x81\x50\xa9\x14\x14\x99\xb0\x31\xfe\x34\xaa\x2b\x93\x38\x11\xd9\x24\x9f\xf3\x50\xa0\x94\xd2\xb5\xbd\xce\x8f\x2d\x99\x32\xa2\xb1\x76\xc7\x27\xd4\x43\x5c\xa6\x29\x07\xbf\xe4\xc0\xf8\x4b\xf1\xe9\x07\x4b\x53\x40\x37\xfa\x58\x0d\x6b\x90\xb9\x4c\x6d\x88\x4a\x5a\xfb\x76\x65\x76\x72\x84\x7e\x38\xca\x2c\xe5\xd8\x3d\xab\xcd\x97\x41\xf9\x88\xcc\x74\xa0\x85\x63\x17\xbe\x7d\xde\x2c\x27\x01\x46\x99\x59\x8e\xfc\x92\xc5\x28\x44\x20\x65\x02\xc2\x41\x58\x7f\x87\x8f\x7c\x52\xab\x21\xa5\x4d\xd1\x29\xfd\xb2\x7c\x19\x9d\xa6\x38\x11\x88\x7b\xa2\xdc\x4d\x39\x04\xbc\x8d\xaf\xa1\x04\x11\xcc\x7d\x39\x9b\xaa\x6c\x97\x4d\x57\x49\xd9\x5d\x2b\xe0\x58\xb2\x40\xa9\x2a\x0f\x52\x1d\x9b\x87\x52\x0b\xa6\x7b\x41\x3c\xc7\xdd\x3b\xaa\x4a\x91\x46\x49\xe9\x3d\xed\xbc\x6e\x9e\x6d\xcf\x8f\xe5\x5a\x40\xc8\x30\x0c\xef\x1f\xe0\xda\x68\x19\x3f\x3f\xc4\x12\x57\x77\x22\xd5\xf8\x7b\xa7\x40\x40\x42\x3e\x98\x28\x1b\xc6\xfc\xa4\x65\x09\xf4\xba\xb2\x5b\xf8\x98\x48\xfb\x70\x69\x03\x27\xa8\x9c\x0f\x2b\x8d\xfc\xc1\x38\x8a\xc7\x2c\xd4\x63\x1a\x1b\x2e\xad\x95\x91\x2b\xda\x5f\xed\x76\x1b\xe9\xa3\xd7\xdc\xd3\xf0\xfb\xa1\xac\x58\x44\xd4\x09\xed\x7b\x21\x49\x73\x55\x1e\x5b\x57\x13\xae\x60\xe9\x95\x50\x02\x6b\x3c\xef\x5e\x7f\xf7\x69\x07\x15\x44\x54\xd8\xb9\xb8\x5f\x0f\xb6\x44\x15\x3a\x1a\xac\x9e\x99\x4d\xfc\xf6\xf3\xb0\xb9\x3b\x31\x0a\x63\x4b\x10\xad\xaa\x46\x49\xee\x4d\xb7\xff\xfb\x6b\xc7\x41\x46\x0c\x93\xd4\x01\x4e\x99\xb7\xef\x63\x15\x07\x12\x91\x28\xbd\x18\xa8\xc3\xcf\x7c\xfd\xf6\xe4\xc1\xf5\x2a\x61\x0c\xc1\xa6\xaa\x2c\xdf\x31\x76\x5e\x5f\x89\xf0\xa8\x24\x61\xf8\xda\x0f\x87\x76\xfd\xdf\x40\xdd\x2c\xba\x8b\x98\x30\x0d\xfa\xd5\xe0\x5e\xe6\x97\xe6\xb2\x6b\x9a\xda\x8c\x94\x58\xe5\x19\xfd\x85\x49\x81\x8c\xca\x92\x00\xab\x9e\x06\x29\xb4\x2e\x34\xbe\x86\x3d\x72\x5b\x4c\x77\x3a\x95\xa5\xc0\x29\x35\x3b\x22\x0c\x98\x73\xb7\x55\x66\x01\x57\xa6\xbb\xb2\x7a\xf7\xf5\x2d\xf3\xdf\x59\xc6\xc4\xd1\xb3\xad\xa1\xf9\x76\xdc\x55\xd2\x80\x54\xf9\x3e\x6f\xce\x33\x30\x11\x25\x25\xe0\x1a\xb1\x1c\xc8\x4c\xfd\x3d\x77\x43\x49\xc5\x42\x3f\x9a\x91\xa0\xf5\xee\x54\x98\xb1\x01\xa5\x94\x60\x68\x0f\x0f\x14\xef\x9a\x3d\x50\x04\x74\xfe\x7b\x29\xc5\x11\xb9\xb9\x2b\x1f\x3b\x7d\x39\xae\x94\xb1\x98\x91\x3f\xc8\x1f\xcf\x47\x28\x16\x4d\x23\xf5\x7b\x77\x17\xcd\x24\xc6\x81\x6e\x4e\xe7\xd1\xfe\xfc\xab\xe8\xc8\xe4\xd6\x3a\x0a\x10\x63\xde\x3e\x68\x87\x71\x50\xda\x44\x48\x2b\xb4\x06\x1c\x3d\x93\xfe\xd3\x26\x0d\x10\xb8\x97\x17\xe3\xd8\xa1\x32\x69\x84\x2b\x5a\xdb\xeb\x46\x74\xbf\x5a\xa2\xa6\x6c\x1d\xee\xaa\x99\xd6\x52\x73\x05\x21\x03\x36\xd8\xdd\xae\x79\x63\x97\xb1\x56\x05\x9a\x21\x9a\x7c\xf5\x47\x37\xbf\xc1\x04\x98\x62\x82\xfc\x28\xd8\xe2\x6f\xc8\x40\x73\x65\xe3\x14\x33\x36\xdb\x1c\x09\xe6\xaf\x81\x39\x47\x63\x6f\x88\xb4\x51\x16\x18\xce\x5f\x02\xec\x7c\xcf\x0b\x94\x25\x1f\x77\x9b\x66\x49\x1c\x66\x9e\xb9\x3c\x2f\x7c\x0e\x71\xf4\x28\x9a\x65\x9c\xf2\x7a\x3e\x89\xfe\xf5\x74\xf8\x0e\xf9\xa6\x24\xee\xfb\xd9\x8f\xa8\x99\x62\x38\x13\xb7\x88\xea\x3b\xec\x68\xb0\x09\x31\xbd\xb6\xcd\xb0\x2c\x4f\xe5\x85\x41\xe0\xed\x83\x81\xa2\xc9\x9b\xf3\x9c\x0d\xa8\xb9\x20\xca\x8e\xc7\xe5\x70\x23\xd5\x3c\x08\x11\x85\x55\x9f\x0e\xa3\xd8\xb3\xe6\x91\xc1\x90\x8d\x2f\x0e\x77\x81\x81\x69\x2f\xf0\x8c\xe4\x5b\xd7\xc7\xdc\x40\x85\xc1\x3f\x7f\xc4\x68\xa4\x27\x39\x94\x85\x7c\x2f\xff\xca\x0f\x92\x31\xde\x1f\xa4\x6a\x20\x69\xcc\x13\x18\xb9\xbf\xa1\x84\xd9\x69\x80\x71\xd3\x22\x05\xde\x4b\x9b\x3a\xe2\x55\x3f\x61\x74\x10\xc4\x98\x5b\xa8\xca\xb3\xdc\x37\xe7\xd6\x6b\xea\xe0\xdd\x23\x27\x4c\x07\x32\xc6\xbc\xcd\x3d\x34\x8f\x27\xfd\x7e\x26\x52\x9d\xfe\x42\x16\x30\xcd\x45\x40\xe1\xc7\x21\xe3\xf5\xf8\x55\x43\x13\x5a\x27\xfb\x72\x38\x15\x79\x83\x25\x70\xbf\x75\x07\x15\x1e\x94\xe4\x8a\xbc\xc2\xf1\xd4\x48\xfa\x57\x4f\x49\xcb\x75\x08\x5c\x90\x67\x5a\x36\x5f\x64\xfd\xf6\x6c\xc7\x76\x86\x8e\x04\x68\xd6\x65\xd5\x50\x72\x71\x4a\x42\xc3\x75\x94\x90\x6a\x57\x93\xff\x40\x52\xb6\xf1\xb4\xd5\x91\xa4\x98\xf2\xbe\xdc\x39\x15\xae\x0b\x73\x5a\xc7\x2c\xe4\x2e\x41\x84\x91\xf0\xc9\x67\x4d\x0c\x49\x77\xe2\x0c\xfa\x0a\x9f\x6b\xa8\xf2\xce\x8e\xd1\x29\x58\xc4\xf2\xee\x73\x0b\x8b\xc9\xb3\x65\x9c\xe3\x97\x3d\x15\x15\xd6\x51\x5e\x59\x24\x75\xc6\x89\x18\x2d\xaf\xbf\xb5\x7e\xf1\x0c\xca\x5f\x67\x81\x41\xea\xa7\x2e\x8f\xbe\x85\xe6\x6d\x5b\x0d\xab\x96\x75\x16\x06\xb8\x62\x2c\x9f\x9f\x9e\xbe\x7d\x7d\xd8\xfc\x6b\xfb\xba\x5a\xaf\x5e\xff\x58\x75\x0d\xd2\x84\xbb\xf4\xcd\x53\x8d\x28\xed\x1b\xb0\x65\x05\xdd\xf1\xcc\x62\x22\x02\x33\x34\xa3\xfc\x8c\xce\xb4\xb6\x71\xe7\x36\x75\x2a\x87\xe3\x9e\x92\x81\x8e\x91\x0a\x5a\x36\x65\xfd\x96\x8f\x2a\xa7\xb5\x62\x4a\x3b\xa7\xe5\xa5\xe7\xad\x21\xc9\xdc\xef\x79\xf3\x76\x29\xa5\xc6\xb5\xb6\x29\xa6\xd3\x94\x47\x09\x78\xc7\x43\x9b\x2c\x45\x43\xb5\x0b\x63\x2e\xf6\xfb\xde\xbe\x9a\x16\xd0\x69\x23\x43\x9c\xf1\x47\xe8\x76\x02\x6d\xac\x48\x9c\x6a\xc7\x1f\x50\x0d\x59\xc8\x5d\x03\x60\x22\x4e\x5c\x4c\x59\xee\x60\x3a\x97\x20\xa0\xf2\xea\x63\x59\x37\x4f\x65\x71\x57\x56\x4f\xae\x38\x7b\xac\x97\x47\x2d\xdb\x31\x72\xff\xcf\x2f\x7f\xd3\xc5\xd3\x10\x46\x08\xb1\x26\x99\xdd\xcd\xf3\x76\xf9\xba\x5a\x6c\x9e\x5f\xbb\x9b\x2b\x81\xa0\xd7\x7f\xe7\xbb\x7f\xcb\xdd\x28\xb9\xa3\x41\x93\xce\xf8\x0e\x6b\x34\x0c\xdc\x9c\xe7\xfa\xd6\x2a\x8e\x75\x34\x94\x02\x22\xd7\x61\x5a\xb9\x63\xb8\x08\x11\x1f\xda\xfa\x3e\x2b\x59\x9f\xc9\x23\xf0\x03\xc6\xf0\x88\x60\xc6\xed\x35\x5e\x01\x71\x0f\xf5\xf4\x0a\x09\x20\x4f\x31\xba\x86\x50\x6d\x5d\x51\x89\xbf\x82\xc8\x22\x24\x84\xd9\xba\x22\xe9\xaf\x72\x5a\x4e\x62\x82\x58\x75\xe5\x52\xd5\x07\x60\xd1\x1d\xb1\x7a\x75\x0d\xb4\x67\x1a\xbf\x29\xcb\xfd\x1d\xbf\x13\x77\xa4\x53\x3b\x91\x8c\xe2\x26\x64\x0c\x53\xcb\x78\x7e\x21\x4f\x4d\xfd\x87\xc7\x1e\xeb\xb7\xde\x00\x34\x21\x0f\xb1\x7c\x8e\x52\x72\x0f\xba\x1c\x70\x68\xa5\xbe\x8d\x0d\x3c\x9d\xe1\x4d\xbb\xdd\x0d\x40\xb1\x97\xdb\xb9\x89\x85\x41\x88\x21\x86\xfd\xd7\x03\x75\x9f\xf1\xca\x6a\xe2\x80\xe8\xa1\xbe\xc8\x43\xdd\x40\x35\x60\x0e\x19\xee\x55\x26\x51\xa4\xf2\x77\x2a\x86\x02\xe8\xee\x60\xca\x13\xeb\x90\x52\xdf\xea\x61\x8d\xed\x68\x7d\x35\x69\x1c\xe1\x04\xf0\xfa\x9b\x8b\xc2\x10\x99\xc3\x5d\x59\x7d\x29\x8f\x60\x4f\xbf\xe4\x80\xf6\x57\x4a\x74\xe8\x21\xe3\x7f\x47\xc1\xcc\x9f\x96\xd9\x40\xf6\x85\xe6\xb2\xd2\x6f\x8b\xc2\xdc\xc2\x07\xec\xcb\xe3\x25\x98\xc8\xc8\x98\x29\xd7\xe3\x7d\xd9\x81\x91\x59\x94\x39\xff\x57\x50\x77\x8d\x74\x00\x7e\xf1\xe8\x52\x52\x95\xcc\x5f\xc7\x41\x89\x7b\x77\x2c\x91\x5d\x56\x7e\x8e\x3d\xc9\xb7\xd3\x32\xe5\x8e\x3e\xfe\xa5\xec\x3e\x83\x04\x39\xa0\xdd\xed\x08\xdf\x5b\x9f\x85\xbe\xd7\x15\xf7\xc4\x48\x1b\xa1\x10\x67\x6b\x4b\xdd\x49\x55\x79\x8d\x25\x6e\x14\xe3\x09\x81\xe1\x1f\x4b\xfd\x4e\x85\xae\x93\xe9\xa2\x02\x85\xe1\xab\xbc\xf8\x28\xdf\xe1\x8f\x01\x73\xed\xd5\x8f\x39\x06\x95\xfc\xaf\xf0\x63\x56\xc5\x80\xc9\xc3\xf2\xb3\xa8\xd7\xe5\x69\x3f\x9d\xdb\x2a\x35\x18\xaa\x55\xad\xc5\x52\x4d\x9f\x43\x71\xa7\xd2\xd5\xbe\xfd\x4b\xb9\xcf\xf5\xf9\xf5\xb4\x77\x36\x68\x38\x55\xb5\x77\x67\x69\x91\xa0\xbc\xb8\xf3\x27\xe7\x2d\x2d\xa3\xc3\x48\x0f\x01\x55\x18\x66\xbf\x68\x93\xb0\xa0\xbb\x3f\x82\x99\xc6\x0f\xa8\xe3\xd4\xb3\x84\x74\xf1\x6f\xf4\xa9\x86\x88\x0e\xa3\x01\x5c\xb1\x43\xae\xb1\x68\x45\x49\xfd\x7e\x59\x55\xd4\x2f\x31\x46\xa4\x08\xb3\xd9\xba\x44\x69\x27\x24\xd8\x8f\x2b\x13\x64\x38\x8e\x29\x80\xe2\x0d\xf9\x71\x47\x98\xc8\x71\x8e\xd7\x50\xa1\x87\x38\x3d\x9e\xa6\x61\x47\x4f\xaa\xcb\xca\x8c\x02\x17\xc6\xd8\x98\xca\xae\x30\xcf\x4e\x23\x6f\xc6\x61\x34\x96\x67\x88\xf1\xd9\x1e\x5a\xd3\xf3\xb2\x52\xd2\xd8\x2c\x23\xf4\x6d\x1f\x50\x00\x66\x80\x52\xbb\x04\x9a\xe5\xec\xfd\x38\x88\x09\x00\x0f\x34\x62\x94\x09\x1f\xf9\xb0\x7c\xde\xae\x37\x8b\xfb\x15\xdf\xbe\xbc\xae\xb6\xeb\xc5\xe3\x2a\xec\x5a\x86\x0a\xc7\x08\xb8\x4a\x74\x6f\x55\x81\xe0\x82\x38\x3c\x21\x5f\x97\xb6\x59\x76\x95\x2d\x10\xc4\x11\x52\xb3\x50\xef\xba\xc4\xf2\x4c\x75\x14\x04\x69\x88\xa1\x1b\x5a\x12\x54\x29\x2b\xf3\x98\xa3\xc0\xb0\xcf\x24\xfe\x6a\x85\x18\xaf\x14\x10\x98\x98\xb9\x10\xcd\x36\xef\x40\xdc\xad\x1d\xe6\x9f\x2d\x4c\xb5\xe9\x51\xcc\x0e\xfc\xd0\x6e\xad\x4d\x67\xb8\x40\xa4\x32\x74\x88\xd1\xb3\xdd\xd6\xb0\xbf\x28\x29\x98\xdc\x36\x02\x49\x06\x2e\xc8\xc3\xd8\x28\x83\x38\xd1\x74\xa8\xbd\x81\xf7\x96\xbb\x3e\x8c\x1d\x3d\x16\x21\x3f\xb1\x10\x79\x42\x41\xe2\x1a\xa6\x61\x82\x29\xd8\x2f\x8b\xcd\xf2\xcb\xcd\x62\xf9\xfb\x6f\xdd\x01\x8d\x78\x27\xcc\x02\x4c\x18\x27\x5d\x93\x2c\x8a\x75\xea\x82\x1e\xed\x7e\xf5\xb5\x93\x0d\xe1\x90\xc5\x94\xda\x6d\x97\x2a\xa7\xf9\xf2\x8b\x77\xcd\x32\x92\xb8\x93\x55\x95\xf7\x30\x25\x50\xae\x96\xe3\xfe\xc7\xe2\xd4\xf7\xb6\x52\x16\xed\x2f\x8a\xde\x8d\x7b\x46\x27\x31\x26\xf5\x1e\xcb\x1d\x96\x03\x7e\x91\xfb\x8f\xbc\xd8\xad\x4f\xaa\xce\xcd\x05\x72\xf1\xca\xd3\xe8\x44\x85\x03\x4d\x8d\x17\x4a\xcf\x0d\x6a\xfe\xc1\xb4\x0e\x36\x3e\x6f\xf3\x59\x56\xef\x64\x66\xf9\x63\x89\xc2\x92\x10\xe4\x92\x6a\x9d\xe6\x81\xc2\x3e\x07\x60\xe0\x4b\xb7\xfe\x5d\x16\x93\x35\x1c\x6c\x4a\x2f\x6c\x9c\x24\x2d\x85\xee\x2f\x93\x8f\x69\xea\x4f\x50\x36\x76\xe5\x67\x77\x00\x17\x3b\x19\x58\xd0\x44\x95\xff\x26\x2b\xa0\x4a\x85\x9b\xf3\x1c\x65\x0a\x58\x6b\x51\xa8\x80\x0c\x0b\x5a\x5a\x16\xc6\x5c\xec\xe8\x3f\xa9\x20\xb4\x4c\xe8\x34\xe9\xe5\x17\x91\xb2\x70\x42\xaa\x3f\x3d\x23\x50\x18\xbb\xbb\xcf\x6d\xf3\x6b\xc9\xd6\xc9\xb9\x2a\x65\x6e\x1d\x47\x59\x34\x97\x01\xdb\x94\x48\x15\x38\x8e\x60\x59\x1e\x31\x0f\x76\x5d\xf4\x0a\xc8\xe3\x0b\xf2\x88\x22\xc6\xa4\xce\xf6\x3b\x9c\x1d\x6e\x7d\xd2\xca\xea\x6c\xb8\x07\x6d\x2a\x90\xf5\xa9\x9a\x44\xdc\xad\xe0\x89\x76\xa8\x82\x76\x6e\xcc\x42\xba\xac\xc8\x12\xaf\xf7\x5d\x9f\x0f\xaa\x4b\x17\xfb\xc3\x32\xc0\x35\x18\x0d\x35\x0f\x82\xf5\x6f\x24\x00\xcc\x00\xd0\x81\x3a\xe5\x4f\x03\x39\xaf\xd1\xd3\x04\x09\xe9\x1d\x21\x7b\xe8\x60\xcd\xb6\x01\x80\x36\x2e\x65\x31\x50\xef\x70\xe3\xcb\x86\x01\xc7\x95\xa6\x3c\x42\x41\x9c\x6c\xfe\xc4\x30\xb2\xe8\xc5\xab\xd3\xf9\x8f\x87\x9b\xd5\xa6\xfb\x3d\xe5\x58\xde\xfb\x50\x34\xd5\x28\xcd\x61\x43\xc7\x58\xfd\x3b\x54\x05\xec\x47\x65\x44\xbe\x85\x92\x98\x49\xcf\x31\xc8\x3b\xcf\x7c\xcd\x6d\x14\x46\x44\x5a\x7c\x90\x4d\xf5\xfc\xff\x26\xf4\xcb\x6d\x94\x42\xe6\xa4\xc6\xe9\x7d\x07\x85\x25\x36\xca\x52\xec\x8d\x76\xcd\x7a\x81\xaa\x2e\x0b\xb9\xff\x5a\x36\xf0\xdb\xec\x70\x8f\xe3\x10\x27\x57\xc7\xfb\x30\x25\x83\xb3\xb1\x24\xed\xa1\xbd\xac\x1d\x47\x6a\x97\x43\xb2\x89\x08\x11\x11\x87\x2a\xaa\xfe\xc7\x54\x90\x3c\xd9\x16\xa9\x9e\xf7\x79\xfd\xd6\xa9\x54\x8e\xaf\x2c\x03\x83\x4e\xc8\x23\xc0\xfb\xb2\xcc\x7f\xa2\x77\x3c\x6b\x6a\x5a\x19\x58\xf4\x9d\x3e\x21\xff\x56\x1b\x6f\xa3\x0e\x00\x3a\x56\x26\x46\x0a\xaf\xeb\xe6\x77\xbd\x1a\x33\xf3\x93\x4b\x69\xe9\x15\xc3\x3a\xa9\xb0\xb9\x89\xa3\x22\xca\xba\x60\xb7\x4f\x6a\x3e\x7b\xc7\xa9\x6b\x9c\xe2\x1a\xdc\xba\x8f\x5a\xb6\x2e\xf8\xf4\xb6\x4a\x9a\xd8\x29\x38\xfc\x05\xba\x2f\xd2\x9f\x5f\x2c\x8c\xb5\xbd\x30\x6e\x59\x21\x34\xc3\x1d\x02\x4e\x48\x89\xbc\x6e\x57\xbd\x0f\xb8\x04\xea\xf8\x86\x09\xd9\xa8\x07\x38\xe8\xe3\xf9\xe7\x8c\x79\xd6\x2a\x6e\xc2\x2e\x70\x32\x57\xad\x65\x2d\x10\x6f\x87\x73\xd7\x6e\x4b\x7d\xc9\xc8\x23\x18\x8b\x20\xa2\x1a\x77\xf8\x31\x98\x4f\x82\xb1\x98\x63\x19\xb8\x0b\xb7\x8d\x7a\x5b\x30\x96\x64\x44\xe0\x6e\x8c\x9b\x48\x9b\xf2\x7e\xea\x64\x0b\xc6\xc3\x4c\x72\x57\x3e\xb8\x3c\xa9\xb1\x35\x2a\x18\x4f\x43\x94\x10\xdd\x7d\x2c\xef\xfc\x7d\x85\x02\x82\x69\x37\x6f\xe2\xe0\x9d\x4f\xc1\x02\x01\x91\x1b\x2f\x6b\x14\x1f\x94\xd5\xf9\xd2\x42\x15\x2c\x88\xb4\xe7\x0e\xc6\x72\xed\x60\xf2\x44\x41\x4a\x28\x70\x34\x6e\x06\x3e\xe1\xdd\xa9\x30\x2b\x89\x21\x52\xdf\x32\xb3\x18\x0b\x3a\xe4\x45\x83\x11\xd4\xc9\x95\xc2\xc8\xa0\x44\xcb\x1f\xbf\x6f\xc6\xe1\x97\x71\x07\x87\x4a\x2a\x8a\xe7\x1c\xfb\xf0\xb5\x8b\xe1\x08\x16\x6a\x40\x85\xca\xdb\xd6\xa0\x9e\x55\xb5\x10\x2c\x34\x02\xc1\x5e\xad\xad\x4c\x82\x3b\x37\xa7\xaa\xfb\x4e\x51\x94\x44\x1d\x54\x67\x64\x8b\xfb\x64\x20\xe7\xff\xe7\xdb\xa6\x49\x1c\x8e\x99\xff\xef\xab\xf2\x74\x9c\x0d\x20\x0a\x16\x65\x36\x26\x7e\xa8\x0f\xf0\xb5\x5b\x97\x81\x6f\xc1\xe2\xc8\x02\x1b\xc1\xf6\xfd\xc3\xc5\x46\x47\x43\x98\xc6\x20\xee\x30\xaf\x47\x2c\x58\x12\xca\x30\xee\x87\x6d\x2f\x3f\x2d\x58\xa2\x14\xe2\xc1\xba\x68\xe5\x20\x67\x28\x58\x62\x19\x6a\x6e\x61\x40\x75\x33\x2f\xa3\x21\x58\x2a\x45\x14\xf7\xea\x05\x57\x5a\x65\x2c\xc1\x98\x3b\xb9\x03\x9d\xbb\x38\x69\x14\x33\x64\x68\x70\xe2\x3a\x0f\xbd\x93\x2e\x58\xa6\xb8\xed\x19\x39\x46\xcf\x99\xd9\x04\xc7\x55\xe7\x65\xee\xc1\xec\xba\xa3\xca\x50\x55\x8d\xd3\xea\x9f\x47\x85\xb5\xcd\x52\x87\x7c\x6f\x1c\xd7\xce\x0d\x90\xe0\xc5\xe4\x21\x75\xc4\x7d\x59\x8f\x2b\x76\x7a\x05\x12\xfe\x1a\x99\x30\x6d\x43\x52\x0e\xeb\xf2\x28\xb7\x70\x38\x55\xd5\x80\x9a\x6f\xf2\x08\x3a\x01\xe2\xc9\x85\xaa\xc9\x6d\xee\x03\x67\x82\x69\x9d\x65\xb4\xe2\xa1\x46\xfd\x40\x22\x5d\x30\x23\x81\x64\xfd\xdc\x73\xcb\xfd\x28\xa7\x38\xbe\x03\xc4\x1a\x5d\xe9\xad\x6d\x37\xb7\xf3\xa6\xf4\x71\xfa\x6e\x01\x81\xd4\x22\xbc\xa2\x7b\xe8\xa7\xbc\x68\x86\x15\xdb\x82\x59\x48\x30\x87\xb3\xa9\xca\xe3\xb9\x77\x37\xdb\x03\x69\xe6\x4b\xd8\xca\xbd\xaf\x62\x15\x9c\x73\xca\xd7\xac\x4f\x47\xa8\xa8\x80\x73\xae\x56\x6b\x38\x03\x38\x8f\x42\x5c\xff\xbb\x6f\x2a\xab\x26\x9f\xae\x18\x9c\xc7\x31\x75\xf1\x1e\x64\x45\xaa\x8c\x94\x19\x9b\x04\x2d\x2e\xf2\x67\x97\xb1\x67\xc1\x85\xe6\x18\x41\xa0\x45\x70\x44\x56\x2d\x78\x10\x67\x3c\xed\x72\x1c\xed\xe6\x65\x27\x09\x80\xd9\x7d\xa5\x3d\x11\xd0\x22\x5b\xbd\x2e\x93\x24\x59\xbd\x2e\x05\xbb\x91\x35\x5c\x63\x06\xbf\xc4\xc2\x0b\x1e\xc6\x02\xbd\xad\xb7\x7c\xf7\xb6\x76\x80\xaa\xd1\x14\xe7\xa1\x54\x98\xb7\x7a\xcc\x77\x6f\x4d\xd1\x61\x35\x05\x8f\xa2\x44\xb6\xa3\x63\xf1\x21\x1b\x59\xe5\x1e\x56\x28\x78\x14\x07\x08\x5f\x5e\xfc\xc8\xcb\x43\xdd\xff\xaa\x49\x66\xab\x28\x3f\xed\x5e\xbe\x8f\xd9\x3f\xe6\x9f\x76\x9a\x8a\x14\x3c\xb2\x29\x7e\x95\xaa\xd3\x23\x3d\x79\x52\x6b\xc1\x63\x48\xd0\x57\x85\x1f\xc7\xbc\xea\x5d\x0d\xbf\x7e\xf3\x24\x93\x48\x38\x7d\xa4\x78\x2f\xb2\xeb\xca\x49\x44\x4b\xf0\x44\xc5\x08\x74\x1c\x48\x6c\x7b\x46\x61\x73\x73\x7e\x02\x93\x63\xe1\xc6\xfc\x27\x49\x83\xcc\xd3\x6a\x0e\x29\x96\xd0\x25\x1e\x8d\x88\xd4\xc4\x8a\xb4\xff\x74\xe5\x69\x02\x04\xcf\x04\x25\x51\x71\xf3\x79\xb6\x83\x24\x49\xdd\x37\x51\x8c\x79\x5b\x0c\x33\x81\x5f\x5e\xc6\x19\x87\x7f\x8c\x5e\x3a\x53\x1a\xb1\xd1\x4f\xe5\x50\xb8\x5a\xf0\xcc\x10\x6a\x74\xf1\xf2\x84\x64\xac\x5f\x17\x9e\x39\x4e\x70\x19\x26\x18\x80\x2e\x4a\xd2\x91\x24\xae\xc3\xdf\xe1\xfc\xe7\x64\x92\xc8\x30\xc3\x02\xd0\xc7\xd3\x11\xf5\xf0\x66\xad\x25\xc1\xa5\x8a\x23\xef\x8a\xa3\x71\xb9\x3e\x96\x45\x0d\xb3\x9e\x90\xe0\xd2\x32\x5c\x76\x6e\xef\xd6\xbf\xb4\xe8\xdd\x29\x2a\x92\x62\xb4\xb4\x2c\xcb\xc3\x11\x8a\x7a\x50\x77\x22\xb8\x8a\x53\xdc\x73\x08\x68\xd7\x09\x92\xcd\xae\xd9\x5c\x0b\xc2\x5d\xaa\x53\x55\xbc\xfc\xf9\x48\x69\xcb\x97\x3f\x1f\x7f\x88\x8b\xc8\xc1\x2f\xfe\xdb\x5f\x30\x22\xe3\xe1\x78\x6a\x9e\x7f\x2a\x64\xee\xda\x9b\x38\x74\x48\xb0\xc2\x60\xd2\x73\xbc\x5b\x73\xa3\x74\xc0\x7b\xda\x34\xf9\x63\xf2\x69\x80\x19\x8c\xc7\xef\x4a\x83\x84\xf5\xfe\x3c\x88\x53\x8c\xcc\x59\x64\xe4\xba\x95\x67\xa4\xbe\x97\x55\xd3\x2f\xfc\x1c\x52\x8e\xab\xc2\xa9\xf8\x27\x31\xa9\xe4\xc5\x95\x6f\x05\x2a\x1b\xc0\xa7\xda\x05\xdd\x55\x3e\x5e\xf4\xd2\x68\xf4\x83\x15\x61\xd0\x9d\x86\x81\xd9\x19\xb7\x4a\x70\xcb\x24\x27\x8d\xb0\xba\xdc\x7f\x5c\x76\x99\x8f\x5a\xfb\xd0\xab\xe0\x56\x30\x8c\xc3\xb7\xae\x14\xa5\xb0\x5b\x67\xf9\xae\xac\x20\xdf\x15\x54\xb6\xe9\xde\x52\x30\x1d\x3b\xa0\x1b\x81\xc7\x2f\x63\xa3\x42\xf0\x24\xc0\xd4\x95\xaf\xbb\xbb\x88\x8e\x0a\xc1\x25\xa3\x08\xd9\x41\x37\xfa\xac\xa0\x3a\x94\x1f\xb9\xef\x6e\x21\xb4\x88\xa8\x52\xc9\x00\x1c\x46\x6b\x80\x10\x90\x20\x0e\x38\xaf\x7b\x32\x51\xd4\xfa\x42\x16\x32\xd7\x28\x88\x63\xdc\xb9\x5f\x16\xcb\xe5\xf3\xc3\xd7\x9f\xed\x6c\x22\x48\x78\x4c\x0a\x32\xed\xfb\x7c\x91\xfd\x45\xda\x6e\x19\x56\x1f\x9b\xc3\x4f\xc3\x70\x42\x84\x81\x8a\x7b\x8c\x2c\x09\x3f\x4e\xfa\x26\x4c\x28\x2a\xf9\x50\x68\x28\x9a\x65\x69\x2d\x0c\x13\x54\x42\x44\x81\x44\x98\x6c\xdd\x94\xc7\x71\xe6\x54\x88\x38\x60\x9e\x33\xf8\xa6\x2c\xf7\xa9\xf8\x6d\x9c\xa7\x6b\x5b\xc4\x8a\xfb\xe8\xf6\x41\xe6\x05\xb2\x8a\x9d\xeb\x4d\xb9\x79\xcb\x2b\xf3\xf2\xd6\x29\xa9\x0a\x11\x27\x12\x51\xa0\x44\x1e\x17\x77\x3f\x4b\x8b\x46\x5f\x71\x3a\xb8\x38\x75\x77\x44\x01\x12\x1c\x7d\x2d\x9b\xdc\x9e\x9f\xe6\xb3\x3a\x42\xc4\xda\x50\x5e\xc9\xc5\x71\x7d\xb1\xe3\xa4\xb3\x62\x1b\x21\xfc\xf2\x13\xf2\xed\x11\x2a\x82\x66\xf8\x5b\x25\x69\x8a\x6b\xd3\xfd\x24\xa1\x2f\x44\x62\x18\x82\x24\x76\xf2\x00\x04\x91\xf4\xe7\xa4\x2c\x33\xba\xb7\x56\x6b\x97\xe5\xef\xfc\x1d\x91\x46\x11\x26\x81\x6e\xcb\xa2\x97\xeb\x11\x22\x8d\x09\xd5\x42\x5a\xd2\x6b\xf9\x91\x17\x3b\x1f\x30\x1e\xdf\x3b\x4d\x62\x41\x3b\x4d\x51\x9f\xf6\x4d\xbb\xc3\xfc\x0e\xdd\x98\xce\xb2\x34\xa1\xd4\x3a\x5a\xa1\xc4\x1a\x80\x06\xc6\x64\x0c\x64\xd2\x22\xef\xf0\x5d\x05\xf5\xdb\xeb\xf3\xc3\xfc\xb6\x28\x24\xcf\x70\x5f\x43\x07\x66\xcb\xfd\x6d\x64\x92\x60\xe0\xe8\xde\x59\xdd\x9e\xaa\xc8\x1f\x57\x0c\x52\x17\x21\x1d\x26\xb1\x1e\x5b\x4f\xb0\x6b\x63\x28\xd3\xb0\x79\x83\xc3\xef\x6f\xa5\xfc\x52\xea\x29\xfa\x78\x96\xf0\x6c\x34\x71\x4c\x10\x1a\xc2\x70\x35\xa7\xaa\x18\x19\x50\xe3\x17\x31\x99\x44\xb4\xfc\x31\xf7\xd5\x30\xee\x00\xb0\x10\x69\x05\xbe\x3f\x6c\xbe\xdc\xbe\x2e\xbe\x6f\x17\xb7\xb7\xaf\xab\xf5\xba\x3b\x9e\x10\x5a\x66\x87\x74\x9f\x8f\x60\xbb\x99\x60\x21\x4e\xa3\x81\x36\xfb\xc8\xd2\x17\xd6\x26\x98\x1f\xc5\xe4\x78\x53\xa1\xa6\xd1\x2d\xfc\x68\xa0\xca\x9b\xf3\x1f\x28\x55\xda\xfc\x3c\xfe\x20\x02\x26\xb2\x80\xf8\xc0\x29\x67\xb1\xb0\x36\xdf\xe7\x5d\x7c\x47\x04\x9c\x67\xda\xf8\x8a\x9c\xee\xc7\x84\xf2\xfe\x0a\xad\xff\x91\x9d\x1e\xf0\x94\x49\xd1\x15\xf6\xa1\x15\xe2\xb6\xa7\x76\xfd\xfa\x0a\x9f\xbe\x61\x10\x28\xbc\x35\x16\x10\x5d\xc6\x1c\x82\x20\x4b\x91\x4b\xff\xaf\xf2\xad\x28\x86\x16\x7f\x10\xd8\x08\xb7\x88\xbe\xb6\x20\x8a\x9e\x26\x80\x4b\x11\x84\x42\x20\xdc\x95\x72\x0b\x7b\x80\x61\xb1\x9a\x08\x62\xc6\x23\x4e\x20\xcf\x97\xb2\x79\x44\xa1\x7f\x7f\x2c\x61\x02\xb7\xae\x23\x0e\xee\x71\xb7\x07\x49\xc0\x1d\xf1\x10\xfe\xec\x79\xf7\xaf\x78\x78\x41\xa2\x48\x04\x09\xb7\x87\xde\xb3\x0c\x52\x26\xd0\x3d\x41\x3e\x77\xa2\x9f\xa4\x6a\xc9\xee\x78\x82\x08\xe8\x83\xac\xde\x07\xc6\x1e\x21\xd7\x6c\x0e\x13\xb6\x4a\x11\xa4\x21\x47\x04\x4d\xbb\xd3\x82\xb9\xaf\xe0\x4a\xd5\xa7\x08\xd2\x38\x4c\x1c\x92\x6d\xf5\xe3\xf8\x6c\x6d\x0d\xcd\x98\xbb\x70\x4a\xb3\xed\x4e\xcc\x40\xa3\xca\x18\x16\x94\xfc\x1d\x09\x53\x77\x9e\x62\x31\xd2\x6f\xba\xb4\xad\x23\x74\x9b\x31\x61\x03\xc5\x0d\xd5\x37\x6a\x6f\xe7\x4e\xde\x52\x45\x90\x39\x8f\xa8\x63\x64\x5f\xe7\xbb\x29\x87\xc4\x05\xdb\xea\xf8\xef\xa4\x43\x94\x0c\xc8\x54\x21\x25\x8c\x2a\xff\x2f\xd1\x6e\xff\xbf\x29\xdc\x89\x40\x07\x12\xc3\xa5\x3e\x6a\x4c\xd6\xc0\xc3\xf2\x59\xfc\xd6\xb7\xf0\x8a\x03\x18\x8b\xc2\x40\xe9\xe4\x22\x9a\xa5\x2e\x50\xfa\x3f\x65\x5e\x80\xe9\x69\x37\x26\x7d\x61\xb2\x2c\x19\x94\x3a\xef\xf7\xe5\xe7\xb2\xa8\xa7\xfc\x0e\x17\xde\xe8\x28\x76\x17\x40\xc8\xb9\x4b\xaa\xc9\x33\x66\x45\x54\xfb\x61\x86\x12\x65\xdd\x77\xb4\x11\x0f\x3c\xcb\xe2\x2d\x48\xb3\x7c\x6b\xb7\xce\x62\xd9\xcd\xfe\x90\x25\x16\x3f\x4f\x53\xa2\xc5\x32\xc8\xba\x89\x90\x49\x83\x6e\x45\xbb\xe7\x1f\x2f\xcc\x77\xdf\x48\x05\x68\xa4\xbd\x40\x75\x90\x15\xbc\x8f\x26\x6d\xc8\x0c\x24\x3e\x1a\xfe\xad\x40\x67\x0e\xcc\xd8\xfa\x0d\x79\x40\xd9\x7f\xf8\x91\x3b\xba\x83\xf1\x37\xff\xc7\xd5\xdf\xfc\x05\x4c\xe2\xa9\xfc\x89\x4a\xc4\xc5\x27\x7b\x03\x24\xe4\x00\xb8\x09\xd2\x02\x31\x79\x05\xc1\x02\x44\x63\xfe\xfb\x4d\x96\xf7\xa7\x1e\x6a\x2f\x42\x11\x02\x86\x1a\x5d\x50\xa8\xfb\x39\xc9\xf0\x86\xc8\xe9\x48\xa3\xb9\x1a\x92\x21\x89\x50\x40\x36\x90\x18\x77\x30\x96\x81\x95\x13\x06\xc2\x62\xe5\x83\x96\xc5\x1a\x0a\xf3\x1d\xd4\x7d\x6e\x47\x0b\x73\x18\x86\x42\x41\x7f\xf3\x07\x57\xf2\x3d\xbf\x46\x84\x61\x1a\x73\x18\x94\x8d\x8c\x24\xeb\x66\xf6\xc9\x30\xd2\x31\x06\xa0\x3d\xb9\x7d\x47\x4b\x27\xc2\x08\x82\xd0\xe7\xa8\x67\xd4\xc2\x44\x18\xd9\xd0\xb3\xb0\xbc\x9e\x90\x6d\xa1\xab\x53\x73\x2d\x62\xe6\xa4\xa3\xc9\x73\x5e\x42\xbe\x6f\xdd\x74\x99\xd7\x93\x58\x74\x18\xa7\xda\xa7\x4e\xbf\xe7\x36\x7f\xf9\x1c\x07\x96\xc3\x24\x0c\xd1\x7b\x3b\x15\x8e\xdd\x00\xc5\x5b\xcd\x38\x7d\xea\xdb\x6a\x89\x3b\x33\x79\xa6\xae\x2e\xf1\xe9\xb4\x5f\xe7\xbb\x89\xcf\x33\xe9\xbd\x54\x71\xd6\xa5\xc6\x6f\xe5\x79\x32\x42\x32\x2e\xd1\xa6\x78\x85\x0f\xa8\x6a\xa0\x82\x56\x33\x47\xd8\x25\xc2\x4c\x90\x66\x13\xd9\x1f\xab\x1f\xfa\xc2\xd3\x0a\xb3\x90\x53\x42\xac\x76\x2c\x73\xfe\xf7\x48\xa2\xe6\xf4\x30\x34\x37\x2e\xaa\x9c\xcd\x7e\x89\x30\xd3\x51\xea\x4b\x42\xba\x8b\x99\x40\x51\x2a\x7f\xa5\xcb\x0e\xbc\xe0\x03\x2c\xa1\x54\x0a\x8b\x96\x48\xf8\xdb\x49\x99\xae\xa5\xbd\xaa\x74\x7d\xb1\x94\x0e\xa7\xa0\x62\x19\x8a\xb4\x49\x2c\xd7\x96\xfb\xfd\x8d\xf4\x74\x3a\x22\xd4\x22\x91\x0e\x11\x4d\xc8\x9e\x13\xd5\xcc\xfc\x9d\xb4\x7d\x7b\xb6\x41\xc3\x1f\x7e\x80\x3e\x35\x28\x70\xf6\x33\x8c\xbc\x08\x75\x20\x30\xf7\x01\x45\xd3\xeb\x46\xfd\x63\x20\xbb\x24\x42\x6d\xa9\x2e\x20\xaf\xbb\x9c\x06\xc9\x74\x4d\xb4\x87\xdb\x96\x6e\x07\xed\x89\xad\x26\x75\x69\x22\x34\x41\x80\x29\x3f\x17\xc8\xea\x90\xe6\x22\x04\x09\xa8\x62\xd0\xc1\xd7\xdd\xef\x96\xa9\x80\x77\x34\x2e\xb7\x24\x65\xed\xd2\xfc\x37\xe7\x0b\x0e\x6e\x11\x5a\x41\x98\x66\x72\xe1\x6e\xe8\x9d\x28\xec\x3c\x9e\x4d\x56\x27\x98\x12\xf0\x04\x11\xe3\xb2\xb1\xc9\xb0\xb1\x56\xf8\x48\xec\xe2\x2c\x71\x0d\xc8\x9b\x95\x2e\x8b\xf2\x90\xff\xe7\x04\xdb\x65\x79\x38\x36\xb0\x8d\xdc\x63\x47\x2c\xe4\x2c\xeb\x09\x57\x44\xf8\xb6\x26\xcb\x60\x54\x32\xe2\x1b\xa7\x20\x43\x57\x69\xd0\xc3\x0d\xba\x25\x39\x62\x5a\x06\xa6\xcf\x37\xbc\xc8\xb3\x92\xfa\xbd\x4f\x55\x8a\x88\x73\x8d\xc9\x50\x9f\xc4\xa0\xc5\xdd\x33\x4a\xfb\x46\xa1\x52\x43\x89\xf8\x71\xc7\x45\x22\x33\xc2\xa5\xaf\x5e\x65\xf1\xce\x99\xbf\xb8\x90\x92\xa8\xc0\xf3\xdd\x5b\x73\x93\x8f\xb6\xad\x48\x68\x8d\x3c\x16\x47\x2a\xe1\xdd\x8c\x1c\xce\x28\x48\x23\x4b\xc0\xec\xc7\xe7\xd7\xed\xfd\xeb\x6a\xf5\xb5\x3b\xa4\x52\xe1\xf2\x2e\x1f\xb0\x1f\xa6\x1f\xa2\x10\x62\xe4\xc7\xeb\xde\xa6\x79\x1b\x62\x39\xc7\x8f\x1d\x5a\x66\xc8\xdd\x96\x55\x33\xec\x93\x28\x32\x78\xef\xff\xca\xfa\x47\xfb\xbf\xff\xc8\xff\xfc\xc7\x1f\x8b\x53\xd2\x45\x55\x73\x09\x76\x11\x25\x3c\x36\x71\x2f\x77\xec\xe9\x3e\x26\x24\xe9\x6d\x3b\x19\x04\x7d\x11\xa8\x27\xa0\x9f\xb4\x4a\x85\xe6\x0e\xec\x89\x28\xfb\xa7\xd2\xc0\x60\xc7\x8d\x32\x41\x76\x41\x5e\xe8\xf2\x00\x53\xe6\x18\x11\x65\x19\x65\xf1\xee\x91\xbf\x61\x55\x40\xb5\x3b\x3b\x36\x70\x52\xe4\xf3\xed\x34\x43\xad\x29\xd4\xb9\x46\x44\x4e\x53\x9a\xbc\xc6\x18\x92\x99\x7c\x6c\x95\x5a\x46\x12\x9c\x0f\xc5\x57\xf8\xd1\x78\xcd\x84\xfe\xae\xca\x12\x4b\x39\xae\xf3\xbf\xd6\x93\x16\x91\x89\x0c\x99\xde\xc8\x9a\x70\x2c\xf5\x5b\x27\xba\xed\xaf\x09\x91\x40\x0c\xca\x00\xc4\x2c\x22\x1b\x27\x44\xc0\x72\x2a\xaa\xbc\x1e\xe8\xfb\x88\x98\xb1\x50\xf5\x73\xf9\xb5\xec\x7c\xe4\x98\x31\x89\x61\x78\x5d\x16\x5a\x36\x54\xf5\x3c\xa7\x5e\x24\x62\xa6\x39\x92\xe6\xd4\x6f\xe5\xe7\xc3\x88\x05\x4a\xc4\x9c\x29\x8c\xd0\xba\xd0\xb8\x93\xe2\x9c\xca\x38\x88\x98\x27\x59\x34\xcc\x87\xdd\x77\x31\xa6\x58\xc4\x02\x1f\x04\xb5\xbf\xae\xd4\x38\xfd\xff\xf5\xd7\x3f\x82\x89\xd1\xfa\xb1\x65\xd5\x14\xed\x1c\x45\x46\xa0\x76\xd9\xe9\x1e\x12\x14\x96\x7e\xfd\xe7\x04\xd5\xd9\x45\xb5\x86\x49\xaa\x38\x60\x0c\x2d\xe5\xc7\xd5\xf3\x70\x76\xc7\xa1\xc8\x88\x26\xab\x30\xae\x5c\x75\xe0\xfd\xc7\x51\x16\xe3\x97\x23\x64\x37\x34\x1e\x24\xda\x15\x83\x8e\x06\x48\x1c\xb3\x80\x75\x79\xcd\x5d\xd9\x75\x61\xdc\xc3\x27\x7a\xd3\xd9\x1f\x33\x91\xf5\xfc\xb4\x79\x53\x60\x21\xed\xd0\x7c\x8c\x13\x26\x10\xa9\x7c\xfb\xfc\x7d\xbb\xf9\xb6\xea\x7e\xe6\x16\x53\xda\x0e\xc1\xb6\x70\x15\xed\x73\xc3\xd8\x9f\x11\x25\x3c\xf0\x24\x9b\x75\xe3\x4a\x3e\x1f\xea\xfa\x84\x16\xf8\xec\x8e\x1b\x27\x59\x8c\x38\x60\xca\x45\xfd\x3f\xa6\xa1\xe2\x34\x26\xc6\x1b\xbf\xce\x3d\xa2\x68\xa8\x7f\x85\x54\x2b\x9c\x4f\x7f\xde\xbc\x8c\xbe\x49\x16\x44\xee\x9b\xb4\x6b\xfc\x0c\x93\x84\x88\x65\x42\x02\x9c\xa6\xa8\xab\xb1\x1e\xa4\x88\xa5\x25\x80\x3f\x41\x35\xfd\xf2\x36\x76\x34\x62\xc5\x85\x83\x52\xe7\x4d\xbf\x49\xc7\x2a\xa6\xaa\x07\x53\x7e\x16\x93\xa4\x48\xac\xd2\x08\x1c\x93\x26\x46\xaa\xfe\x39\x17\x0f\x77\x6d\x35\x0f\x34\xb9\x52\x7b\xf3\xaf\xf2\xb4\x2e\x27\xcf\xa8\x45\xe2\xd5\x67\x56\x9b\x2f\x08\x57\x9b\x2c\xbd\xb1\x11\xcc\xba\x38\xe9\x0d\xd4\x0d\x56\x40\x9d\x9a\x6e\x55\x89\x4d\x44\xb8\x3a\x4c\x9d\x96\x7b\xf2\x17\xba\x21\x67\xb2\x14\x1d\x51\x72\x3a\xda\xd1\x38\x28\x93\x77\x6d\x40\xea\x30\x18\x6c\x02\x57\x8a\x4a\x5d\x6b\x9b\x65\xa4\x3e\x5f\x56\xed\x86\xe2\x63\x9a\xb1\x55\x2a\xe8\x1d\x59\xd2\x2a\xf8\x5b\x1e\x77\xc2\xc2\x00\x85\xd2\x2c\x40\x3d\xd8\xd7\x12\x16\x13\x51\xcd\xd7\x87\xfb\x87\x7f\x77\x3f\x66\x44\xa3\xb7\x3e\x19\x03\xc5\x2d\x68\x79\xce\x8b\x1d\x31\x7d\x38\xb5\xbe\xae\xa9\x0c\x4d\x9f\xdf\x5e\x5f\xf8\xa9\x09\xe7\x12\xa9\x09\x3f\x1b\xd0\x6f\xde\xbd\x4f\x78\x94\x38\xdd\x36\x62\xe7\xbf\x85\x8f\x7c\xc2\x6a\x28\x12\xae\x88\x70\xfa\x44\xf5\xba\x13\x66\xfc\x7f\x4c\x1a\x5b\x46\xe2\xf3\x93\x7a\xce\x59\x0b\x2c\x69\xdd\x9f\xcc\x7b\x6d\x94\x95\x70\xd3\xe6\x36\xaf\x25\x91\xfc\x3e\x4e\xa5\xbf\x45\x12\x58\x5a\xa3\x6e\x1e\xee\xd7\xab\xc7\x47\xff\x36\x61\x0c\x59\x5f\xe6\xf2\x22\xab\x81\x56\xd6\xfc\xe7\x08\x75\x60\xf1\xfd\x8b\xa2\x3c\x15\x1a\x29\x5f\xbf\x74\xc4\x21\x22\x89\x79\x6c\xb3\xde\xb4\xc5\xa0\xee\xf7\xbc\x79\x23\xfc\x7b\x1f\x40\x1a\x3f\x5e\xc2\x43\x0f\x92\xbc\x39\x99\x5d\x17\x51\x48\x92\x14\x52\xe3\x54\xa6\x7d\x2c\x70\x58\xd6\x38\xb9\x8c\x62\x18\x18\xa0\xcc\xd2\x4d\x6e\xe6\x71\x3a\x49\xa2\x88\x3f\xcd\x8b\xe0\x16\xe6\x3c\x1b\xf1\x4d\x12\x10\x18\xee\x39\xca\xf3\x73\x81\x8b\x7e\x47\xeb\x2e\x92\x94\x13\xfb\x04\xce\x8c\xc3\x51\x16\xe7\xee\x48\x40\x6c\xd6\x7f\xac\xd6\x9b\x87\xaf\xf7\x28\xcc\xb5\xee\x0e\xa6\x16\xd5\xc6\x6e\xd8\x0f\xcf\x7d\xf0\xd3\x8d\x2d\x49\x35\x60\x38\x92\x80\x83\x2f\x32\x37\x63\xf2\xff\xe1\x3e\xdf\xee\xd0\x09\xe9\x18\x37\x6b\xf9\x01\xe8\xd4\x8f\x1a\x48\x46\xd5\xa6\x35\x34\xff\x73\x3e\xea\x4b\xfd\x47\x91\x48\x0b\xc8\x45\xf0\x24\xdf\xa1\x1a\xb0\x7b\x91\x92\xeb\xec\x5a\x96\x28\x96\xa1\x3f\x6c\x60\x2f\xcf\x8b\x53\x53\xba\x01\xe0\xdf\x5a\x85\x46\x3a\xa7\x9d\x16\xa1\xbb\xb2\x5a\xbe\xc9\x6a\x37\x35\xc0\x13\x1d\x18\x5f\xd8\xd0\x9a\xf9\x8f\xb9\xaa\x3a\x72\x60\x91\x68\x4d\xa9\xf3\xf9\x72\x05\x91\x68\xcb\x90\x7f\xef\xd0\x0e\xbc\x07\x2c\x81\x69\x87\x5f\xb0\xa8\xfa\xca\xb4\x7f\x8c\xe7\xe1\xbc\x42\xb4\xbb\x9e\x31\x09\x3a\x7e\xa6\x2c\x28\x99\xdf\x41\x1d\x12\x08\x33\x2c\xef\x41\x76\x84\x61\xda\x2e\x01\x2d\x03\xdb\x41\xd7\xbc\x08\x20\x09\xd2\x0c\x1a\x59\xe9\x6b\xa6\x73\x5f\x1a\x3b\xfa\x54\x60\x2d\x06\x88\x4b\xe7\x69\x8e\x63\x2a\x49\xeb\x13\x5a\xcf\xec\x34\xb4\x06\x12\xcb\x19\xc2\xc1\x8e\x39\x68\x18\xc0\x7c\x45\x62\x05\x55\x22\xd6\x6f\x58\xe5\x75\x2b\xf3\x49\xef\xdb\x20\x48\xc2\x61\x32\xbd\x86\xbd\x7d\x36\xa6\xbb\x40\xc6\x70\x68\xbb\x1e\x6b\x57\xf2\x57\x57\xdb\x4a\x2d\x52\xc6\x12\x0a\xbb\x43\x03\xd5\x21\x2f\x80\xc6\xed\xbc\xe9\x90\xb2\x98\x82\x4a\x84\x7f\x19\xee\x30\x18\xfd\x1a\xd7\x79\x8b\x94\x19\x32\xe1\xf0\x73\xc0\x3c\x82\xc4\x35\xe5\xcc\xa2\x96\xf8\x23\xd4\x75\x59\x6c\xe3\xf9\x81\x9b\xf2\x80\xa3\xe8\x87\x3a\x5d\xcd\xa4\x4c\xcf\x88\x39\x3a\xc1\x6b\x00\x47\xf1\x30\xc2\xa7\xcd\x4e\xe2\x94\xa7\x76\x84\x3b\xfa\x2a\xf5\xe4\xd5\x78\x96\xfa\xa4\xe8\x9f\xf2\x74\x57\x56\xf7\xb2\x5e\x9e\xaa\x99\x18\x43\xca\x0d\x8b\x7c\x90\x74\xdb\xbc\x55\x00\x08\xb8\x5d\xfd\xe7\xa6\x83\xb3\x8a\x54\x38\x3e\xcb\x1a\xf6\xfb\x0e\x3c\xec\x8f\x85\x31\xa5\xf8\xde\x40\xbf\x6f\xf2\xe3\x00\xeb\x2d\x52\x11\x5b\x17\xeb\x40\x07\x05\x4e\x87\x9b\xa1\xf6\xb6\x6f\xa5\xb5\x90\x9d\xd2\xe4\xf0\xc3\xd5\xb7\x0f\xb7\xf3\xe6\x41\x1a\xe8\x20\x49\x50\xa5\xeb\x07\x98\xa5\x3c\xae\xe5\xe1\xb8\x1f\xfa\x3a\x69\x00\xc4\x12\x86\x6c\x7e\x53\x0f\x24\x0d\x45\x48\x81\xdb\x01\x54\xc9\x4f\xd5\x34\xd4\x84\xb4\xf3\x76\xe4\x5a\x5a\xe8\x22\x28\x69\x6c\x32\xcf\x05\xf4\x5a\x7e\x2e\xcb\x7d\xe9\x50\xda\xdc\xab\xb7\xcd\x7f\xed\x18\x82\xac\x2f\x23\x7b\x91\x55\x33\x03\x15\x48\x93\x30\x4e\xd3\xce\x9a\x68\x77\x9e\xf1\x55\xd2\xc0\x60\x49\xee\x5e\xf7\x30\x73\x91\xa6\x59\x1c\x64\x5d\x3d\xe3\x1d\xc0\xcb\x49\x5d\x8d\xa2\xcd\x0f\xdf\x54\x87\xf8\x19\x5e\xaa\xbc\xf6\x2b\x53\x9a\x09\x95\xb8\x82\x58\xb5\x2f\x8e\x50\x41\x2f\xab\xec\x9b\x44\x02\x5c\x8e\x6b\x45\x1a\x54\x9d\xda\x4d\xd7\xa1\x92\x29\x5c\x2c\x9c\x65\x72\x37\xd0\x4f\x1b\xc6\xf2\x52\xc9\x75\xd2\x17\xe2\x10\x69\xe0\x6b\x5e\xbf\x5f\xd3\xfb\xf0\xa7\x05\x49\x1c\x0d\x40\x76\xf8\xd1\x1e\x8a\xfa\xb2\x98\x4b\xa4\x4a\x90\x20\xb7\x34\xe6\xa6\xca\xcd\x8e\xe6\x1d\xc9\x91\xa2\xe8\xfc\x64\x0f\x4b\x55\xa0\x90\x3b\xa0\xa3\xc7\x27\x9b\x73\xbe\x13\x95\x34\x68\x65\x3c\xdd\x79\xcb\x28\x55\x56\x4b\xf0\x6e\xfc\xba\x91\xef\x57\x7c\x9f\x54\x27\x29\x3e\xd9\xc3\x72\x81\x10\x0d\xff\xb3\x4d\x30\x48\xbd\x5e\x2d\xb7\x2f\xab\xd7\xed\x6a\xf3\xc5\x13\x5c\x8b\xd4\x24\x82\x47\x5e\x5b\xf1\x3f\x03\x5e\x6f\x7f\x3c\x13\x69\xa7\x03\xef\x7b\xa6\x33\x60\x7f\x1a\x7f\x48\x81\x85\x22\xf0\xf0\xeb\xa2\xaf\x07\x13\x29\xf0\x00\xb3\xfe\xa5\xb5\x50\x7d\x81\xfd\xf1\x5b\x9d\x17\xbb\x2b\x24\x97\xd3\xab\x72\x89\xe3\xb7\xeb\xcd\xaa\x3c\xbc\x94\x93\xbc\x48\x0a\x41\x82\x55\x48\xb8\x23\x6e\x40\xf6\xcb\x42\xd9\x15\x3c\x88\x14\x52\x8a\x38\xba\x2a\x39\x0c\x00\x4f\x1c\xde\x14\x54\xc8\x3a\x34\x1f\x18\x57\x72\x32\x1e\x13\x60\x39\xa1\x7d\x30\xd8\xf6\xe4\x45\xed\x45\x6a\x59\x48\x6e\x1b\x96\x8f\x38\x23\x6b\x5a\x49\x7a\xb9\xd7\xa7\x36\xf5\xe4\xc5\x87\xbc\xd8\x52\xae\x66\x7b\x94\x67\x0c\x22\x52\x9b\x8c\x71\x8b\xc8\x2c\x4f\x05\x32\xa8\x95\x99\x23\x86\xfd\xe9\xa6\x90\xb1\x04\x10\x99\xb3\x97\x35\x11\xb9\x6d\x6d\x8c\x42\x73\xee\x72\xdd\x4d\xa5\x40\x37\xbe\xca\x77\x6f\xa4\xdf\x80\xab\x79\xeb\x0e\x3d\xdb\x2e\xcd\xd3\x35\x06\x34\xf0\x16\xba\xac\x8a\x97\xb2\x19\xc9\x0b\xbb\x36\x3c\x33\x99\x67\xd6\x28\x0b\x38\xcf\x29\x6f\x89\x8c\x83\x32\x66\x50\x20\xeb\x72\x28\x8b\xe9\xd5\x84\x01\xa6\x3a\x45\x4e\xa7\x42\x31\xeb\xbe\x64\xa1\x4b\x61\x6f\x35\xde\xf7\xef\xed\xb8\x59\x98\x86\x58\x48\xe8\x08\xb2\x87\x22\xc4\xa3\xa4\xf6\xcf\xfe\xf8\x4b\x99\xd0\x38\xd5\x8a\x7c\x57\x20\x0a\xb4\x92\x17\xc2\xaa\xae\x71\xc4\xd2\xc4\x6d\xc9\xcf\xd5\x52\xea\x37\xda\x67\xf3\xe6\x7c\x53\x16\x93\x25\x3e\x8b\x52\x92\x21\x73\x76\x2b\x12\x19\xb8\x43\x71\x1a\xb0\x61\x24\xf7\xa5\xf2\x19\xed\x31\xaa\xf8\xe7\xbd\x10\x4b\x40\xd7\xab\xc9\x0f\x40\x95\x38\x0f\xc5\x53\x5e\x9c\x9a\xfe\x3e\x26\xc4\x6d\xbd\xc6\x8b\xbb\xba\x62\xf4\xce\x7e\x95\x9a\x99\xdc\x09\x20\x16\x83\xe7\x75\xc9\x9e\xf9\xd5\x33\x4b\x02\x69\x89\x1f\xe5\x6b\xd9\xdc\x9e\x8e\xfb\x5c\xcb\x06\x5c\x39\xdc\x24\xdd\x90\x25\xa1\xe0\x69\x37\xf9\x3b\x6c\x97\x13\xb1\xf4\x2f\x92\x44\x31\x16\x10\x1e\xc0\x38\x95\xf5\xda\xe5\x3c\xbe\x15\xf9\x34\x08\x92\xa5\x89\xce\x68\x1a\x55\x1d\x3c\x3f\x4b\xb3\x00\x03\xe2\xe8\xd4\xb6\xa6\x68\xee\x49\x2e\xae\x84\xa5\xc6\x2f\x95\x05\xc2\x10\xed\xd6\xb1\x29\x7f\x09\x12\x18\x3f\x4f\xa6\x53\xe4\x66\xb8\x07\x5f\xe8\xff\x50\x93\x06\xea\xcd\xf9\x16\xf1\xa9\xbd\xad\x9e\x65\x96\xd4\x72\x28\x06\xf3\x15\x7e\x34\xdf\xf3\xc2\x94\x9f\xc4\x85\xdc\x6e\xcc\xaf\xad\xe3\xf1\xdb\x45\x3e\x24\x93\x5c\x62\xa1\xf9\x6d\x17\xdc\x9e\xff\x3e\x32\x52\x59\xd6\xab\x4e\x43\xd5\x9c\x5d\x18\x7f\x8e\x59\x55\x64\x32\x35\x88\x59\x7b\x2c\x77\xbf\xff\x6b\x39\x44\x32\x4f\xfa\x5d\x66\x54\x42\x87\x79\x33\xf2\x49\xfd\x92\xca\x1d\x87\x80\xc8\x54\x9a\x20\xa7\x8c\x34\xe6\x8f\x72\x40\x93\x3c\xbe\x94\xd2\x44\x3e\x36\xa6\xb3\x18\x0f\x1d\x2d\x25\x0e\x9d\x37\xb9\x1f\x44\xe3\xb2\x76\xa7\x55\x44\xa5\x06\xf9\xae\x20\xf3\x60\x7a\x9b\x49\x5d\x99\xc8\xc0\x50\x49\xa5\x83\xa1\x0c\x2d\x78\xd7\xc2\xa6\xcc\xf6\xca\x09\x4e\x87\xed\xa9\xf5\xf2\xaf\xee\x20\x92\x31\x85\xba\x3f\x9d\xf7\xb4\x55\xb2\x86\xed\x01\xc7\xf8\xb6\x1a\x49\x71\xfa\x53\x42\x22\x72\xa9\xa5\x85\x5e\x10\x4c\x8c\x1f\x46\xb2\x58\x63\x4e\xfb\xeb\x9d\x2f\xbf\x92\x4c\x05\x68\x9d\xf9\x49\xfa\x0a\xed\x80\xd6\x0d\x98\x75\x33\x53\x2f\xf3\x8f\xc9\x6d\x55\x80\x59\xb0\x3f\x9e\x1f\x9f\x5f\x7e\x96\xf6\x97\x5c\x70\xe6\xea\xb4\x88\x1d\x64\x04\x3a\x90\x3c\x52\x08\x6d\xc6\xfd\x0b\xf5\x2d\xf7\x1b\xa8\x47\xd9\x31\xc9\xd3\x84\x56\xae\x72\xb7\xdb\xf7\xf9\xe2\x7e\x2c\x4b\xae\x85\x25\x41\xca\x41\x4e\x44\x0a\x46\xb1\xbf\x1d\x34\x77\x79\x21\xf7\x8b\xa2\xfe\x84\xea\xc1\x3e\xc9\x46\xbf\xc1\xa5\x3c\xe3\xf0\x95\xa7\xe6\xa6\x14\x09\xf1\x75\x4b\xdb\x8d\x67\x6f\x1a\xc9\x40\x04\x28\x69\xe6\x86\x9f\x63\xf9\x27\x3d\xa3\xf1\x55\x02\xf5\xff\x71\xf6\x26\xdb\x6d\x23\x59\xd7\xe8\xbb\xfc\xa3\x1c\x7c\x03\x44\x87\xe6\xce\x28\x89\x92\x59\xa9\x86\x25\xd2\x76\x56\xd5\xfa\x17\x57\x34\x27\x28\x94\x41\x80\x09\x80\xb6\xf5\x3d\xfd\x5d\x38\x11\x81\x8e\x90\x33\xef\x9d\xa4\x9c\x44\xa0\x0b\x44\x73\x9a\x7d\xf6\x56\x18\x37\x3e\x48\x63\x3e\x55\xf5\x1c\x9c\x20\x99\x76\xd5\x92\x8e\x4e\xe7\xe9\x61\x7e\xba\x75\x2a\x7d\x98\x49\xe8\xd9\x9e\xc3\x63\xf0\x2c\x42\x49\xb2\xf3\xa1\x09\xc5\x96\x55\x67\xf7\x19\x9f\xe9\x5d\x36\x41\x25\x57\x29\xce\x43\x47\xd6\xeb\x13\x14\x23\x82\x30\x2a\x63\x96\x61\x39\xd9\xab\x0b\xca\xa0\x41\xb3\xb8\x58\xc8\x84\x00\x78\xcb\xe0\x26\x37\x66\x00\x6a\xcc\xe1\x10\xd3\xf1\x99\x24\x46\x99\xa1\x58\x2b\xac\xb4\x1f\xdc\x43\x39\xba\xab\xa3\x83\xff\x86\x87\x4c\x59\xa2\xf8\xaf\xb8\xf2\x16\x70\x04\x32\xd5\x8e\xb0\xb4\x73\x85\x03\x66\xc1\x57\xca\x6f\xca\xd1\x96\x22\x33\x1f\x98\x3c\x22\x3d\xcc\x3b\xd4\x13\xe8\x92\x94\x54\x47\xa6\x8f\xc6\xdc\xf4\xc9\x31\x29\x05\x43\xe8\x85\x34\x66\x55\x9c\xdf\xe4\x6c\xf7\x98\x7e\x7d\x29\x75\xe2\xeb\x33\x7e\x87\xf7\xdf\xe6\x07\xad\x03\x01\xe1\xfc\x39\x9c\xf2\xa2\xfb\xbe\x65\xff\x84\x2a\xa1\xdc\x27\x80\x2e\xe7\x5d\x2b\xf5\xb7\x3b\x38\xb7\x6f\x8f\xb9\x9a\x2d\x06\x4a\x49\x1c\x83\x5f\xdf\xaa\x66\xd3\x3e\x54\x65\x29\x6f\xfa\xab\x68\x92\x62\x05\xcb\x4a\x55\x97\xfe\xed\x34\x97\xc8\xb3\x81\x5e\xb5\x1e\x5e\x4e\x0b\x25\x3d\x87\xfd\x44\xd0\xc1\x51\x49\x17\x60\x6e\xde\xf7\x50\xca\x61\xb6\xeb\x4c\x61\xcd\xdf\x01\x1a\x5d\x57\x3f\x3e\xf8\xc0\xa6\x73\x9f\x46\xe0\xfa\x1d\xe8\x1a\x66\xcb\x79\xe7\x72\xd1\x08\xd1\x9b\xef\xe7\xb6\x5a\xa3\xba\xd7\x68\x4a\x1a\xa3\x32\xa7\x41\x80\x6c\xe8\xbc\xff\x1d\x22\xf4\x9d\xaa\xd2\x8d\xf1\x4d\x79\x9f\xcb\xf6\x2b\xe4\xa1\x01\xd8\x54\xf7\xc4\xe6\xcd\xd4\xb0\x90\x56\xe9\x24\x08\xd8\xfc\x28\xc1\x6c\xab\xbc\x6c\x17\xaa\x6d\xa5\x05\xa7\x16\xe0\x82\x5b\x72\xd1\xf1\xfa\x0b\x63\x6a\xda\x29\x2a\x52\x4c\xcb\x19\xd1\xf1\xbe\xda\xdc\xae\xb6\x9d\x6d\x35\xe4\x52\x55\xa4\x62\xea\x14\x47\x8a\xbc\xdd\xb5\xf5\x52\x3e\x57\x45\x86\x45\x2e\xce\xee\x56\xfd\x49\x2a\x60\xfa\x2e\x8a\x68\xed\x05\x14\x91\x8e\x61\x24\x68\x11\x1a\xd8\x54\x66\x7d\x8c\x03\x69\xff\x16\x3f\xac\xa2\x89\x43\xce\xbb\x0d\x6d\x2c\x0f\x4a\x15\x05\x8d\x51\xe3\xbc\xcc\xdb\x83\xea\xba\xf4\xfd\x70\xae\xab\x63\x2d\x4f\xb3\xe7\x61\x19\x05\xe8\xfd\x2c\x8f\xb0\x0b\xc7\x24\x0f\xd1\xdf\xf5\xeb\x6d\x42\xc9\xb3\x6d\xaf\xdc\x2b\xdf\x96\xa7\x8e\x6f\x11\xbf\x5f\x3d\x12\x04\xa7\x8a\x67\x42\xfa\x94\x79\x90\x22\xa7\x8a\x2b\xe9\x4a\xc4\x4e\x1e\xbd\x81\x63\xdd\xc5\x2b\x66\xe1\x2d\x25\x52\x16\x18\x2d\x31\xca\x3c\xcd\x0c\xaa\x98\xca\x68\xc2\x8a\xf9\x09\xea\x6a\xee\xa1\xaa\x38\xa5\xb1\xaf\x74\x31\x79\x7b\x57\xcb\x63\xf5\xc1\x9a\xd8\x35\x4d\xbb\xde\xfb\x11\x14\x6c\x9e\xf2\x72\x5f\x7d\xfb\xe0\xcd\x63\xb0\xc8\x2b\xdc\x19\xc5\xcd\x98\x55\x63\x36\x34\xaf\x4d\x14\x95\x44\x31\xae\x42\xea\xf2\xbe\x75\x54\xd7\xb3\xc1\x90\x6a\x89\x71\xc3\x43\xde\xdc\xe5\xf2\x54\x95\xe6\xe5\xd2\x36\xf9\xac\x86\x4d\x65\xcc\x25\x09\x6e\xdf\xba\x75\xb4\x1c\xd1\xe3\xcd\x8c\x89\x0f\x1e\x2d\x5c\x26\x49\x1d\x38\xd5\x98\x17\x6b\x01\x69\xdb\x27\x31\xa6\xeb\x22\x4b\x7f\xa6\x04\x8e\x41\x1b\x44\x97\x0f\xc2\xf2\x54\xa9\x48\x58\x1b\xb6\x43\xb2\xf5\x60\xa6\x79\x85\xdc\x52\xbd\x9c\x52\xb1\xc0\x39\xfa\xb4\x7a\xfe\xb4\xda\xef\x57\xcf\xdb\xd7\x97\x3f\xfe\x95\xec\x3f\xad\x02\x89\x62\xd7\xc6\x20\x63\xd2\x63\x75\xf4\x85\x61\x39\xe6\xab\x3f\x88\xd3\xcd\x9e\x5a\x65\x86\xb9\x75\xc5\x5e\x4a\xd3\x6d\xc4\x7d\xec\xa3\xb3\xfe\x46\x7a\x30\xcb\x5f\x5e\x27\x1c\x51\x02\x3d\x03\x6f\x55\x06\x89\xf7\x59\x43\x9d\xba\x6a\xf3\x1e\xb8\xd2\x6c\xca\x9b\x4b\xf1\xed\x63\xf3\x55\x19\xaa\xc1\x43\x74\x36\x27\x79\xc4\xec\xd1\x6d\x51\x5d\xae\xa4\x8a\xa7\x6b\x91\xd1\x29\xa6\xff\x6d\x0d\x60\xbe\xe6\xe5\xb6\xaa\x8a\xfb\xaa\xc6\x4a\x9d\x11\xef\x15\x55\xc6\xe8\x6c\x90\xd7\x7c\xbd\x14\x9d\x0d\x37\xa1\xe9\x9b\x11\xf6\x51\x05\x49\x8a\xec\x26\x0e\xca\x79\x38\x77\xf6\xc2\xf8\xb0\x8c\x91\xcf\xe4\x5b\xae\xbf\xe1\x40\xe8\x1c\x83\xf9\x17\x98\x7c\x00\x6b\x13\x4c\x60\x98\x2a\xac\x96\x1f\xd4\xb7\xeb\x48\xda\xcc\x03\x35\x3a\xcf\xa5\x7e\x29\xc3\x26\xf5\x97\x31\xda\xd9\x85\x0c\xc1\x6e\x75\xaf\xfd\x78\xd1\xdf\x26\xb0\x13\x4d\xa2\x14\x81\x6d\x7d\xb5\xc3\x50\x68\xab\x29\x8b\x70\x1f\xba\xab\xf4\x05\x9d\x41\xbf\xa5\xc2\x5c\xd2\x3f\xb4\xf7\x0a\x6d\xf7\x55\x85\x8a\x6e\xf3\xc8\x9a\xa6\x89\x8e\x79\x50\x29\x39\xb3\x10\x95\xd3\x0c\x20\xc8\x7c\xef\x46\x7c\x97\x55\x51\x40\x7d\xbb\xac\x47\x36\x7b\x4d\x66\x13\xc1\x91\xe4\xd6\xf4\xd5\x3a\x43\xba\x14\x0f\x27\x5e\x83\x29\x87\xba\xc9\xe7\x0c\x22\x54\x73\x61\xf1\xd9\x4e\xf2\x67\x7e\xba\x9c\x46\x08\xfb\x70\x11\x21\x24\xe6\x5e\xaa\x33\x4c\x09\x9a\xa9\x16\x19\x0f\x21\xf8\x0f\x9e\xf3\xd7\xd1\x38\x1d\x13\x49\x23\xbf\x81\xc9\x41\x09\x57\xc9\x63\xd8\x9a\x75\x1c\x0b\xe2\xea\x69\x6b\xac\xbd\x59\x6d\xfa\x23\xd2\x55\xc0\xbf\x82\xae\x4a\x9d\x5f\xdb\xd7\xd3\x75\x40\x27\x94\xc1\x90\x82\x0e\xaf\x32\x9f\x66\x23\x4b\x57\x27\x09\x8d\x7c\x8e\xfc\xf1\xf1\xcb\xa1\xdb\x51\xfa\x62\x2a\x9d\x18\x9b\xb0\xde\x59\x1d\x11\xd8\x51\x9d\x46\x02\x07\xfc\x8f\x1e\xfb\xa0\x53\x9a\x66\x9e\xbd\xf7\x7c\x19\x58\x6d\x7e\x15\x10\xd1\x69\xb7\xa4\xf8\x20\xdf\x6b\xa5\x2e\x1f\xa1\x5a\x74\x2a\xa2\xac\x27\xa6\x0b\x2e\xe9\x15\xa5\x10\xd5\x69\x96\xc6\x7e\x87\xed\x36\x4f\xcf\x93\xb7\x80\x98\xd2\x59\x6c\x31\xc4\xfe\xef\xd5\xbf\x56\x63\xbf\x52\x67\x59\x84\xa4\x02\x18\xa4\xdf\xbe\xae\x87\xa8\x80\x96\x5a\x21\x76\xa6\x57\x38\x78\xea\x89\xc9\xa8\xd6\x51\x1a\xf8\x31\xb7\x52\x7f\x93\x47\xf0\x8e\x51\x67\x1b\x41\xf3\x81\x80\x45\x38\x99\xb8\x72\xc3\x06\xda\x03\x78\xbe\x9c\x43\xdd\xf9\xfa\x79\x79\xb8\x4a\xb4\x68\x9d\x19\xc4\x99\x5c\x9a\x5e\x37\x82\x6a\xad\x38\xf5\x72\xf7\xdb\x42\xb6\xb6\xaa\x4f\x9b\x52\x57\xa7\xbc\x3c\x4e\x2a\xcf\xfb\xcd\x60\x3a\x52\x0d\x75\xe0\xf3\x60\x4a\x2e\xc8\xab\xce\x72\x39\xda\x50\xee\xd0\x71\x88\x70\x9f\x5f\x4f\x38\x02\x9a\xbc\x3c\x5f\xda\x19\x8d\xcc\xd5\x1a\x37\x59\x6e\x8c\x66\x58\xa0\x82\xcc\x73\xfb\x51\x96\xc4\x1f\x87\xc4\x45\xe1\xb4\x2c\xba\x2d\x61\xf9\x31\x43\x5b\xcf\xc7\xdb\x20\xc2\x7a\xe2\x9e\x69\x1b\x01\x42\xa5\x54\xe0\x82\x5a\x5d\x23\xdc\x27\x37\xb6\xa9\xab\x70\x6f\x68\xec\xfc\x0e\xd2\x1f\x70\x55\xc5\x9d\x61\xf7\x7e\x86\xc9\x4a\x6c\xa2\x48\x53\x2f\xb5\x59\xf5\x3c\x5b\x93\x37\x32\x11\xc4\x62\x58\xcc\x47\xf2\xc5\x8b\x35\xd2\x86\x70\x11\x3b\xce\x82\x3f\x2f\x79\x0d\x66\xfd\xf3\x1c\x02\xf6\x4e\x7b\xe8\xb7\xd0\x30\x26\x98\xc8\xd3\x45\xd5\xe0\xd2\x3b\xcf\x0a\x19\xa2\x1c\x84\xf3\x5c\xe5\x4d\x53\xb9\x7a\x0d\x7f\x88\xea\x0c\xd1\x15\x79\xd3\x2b\x20\x82\x09\x01\x84\xd9\x13\x71\x26\x31\x3f\x7f\xac\xbe\x87\xd3\xe3\xc8\xa6\x4e\xe7\xa1\x28\x3e\x9f\x07\x31\xa8\x70\x98\xc7\xa9\xd3\xc3\x6b\xaf\x6a\xc2\xae\xad\x08\x13\x27\x8e\x4a\xc6\x83\xbe\xbb\xe7\x7c\xc4\xd2\xc5\xfe\x7a\x19\x4b\x3d\xf5\xd6\x67\xec\xfd\xfe\x80\x4e\x22\x1f\x18\xd8\x3f\x5d\x66\xa4\x1c\x26\xa1\x2e\xdc\x68\x20\xf8\x95\x5e\xc7\x77\xd6\x2e\x8b\xd3\xd4\x2f\x94\xaf\x55\x51\x20\xa5\x76\xb8\x83\x8c\x81\x7a\xe5\xed\xba\x7d\x1b\xa1\x38\x8d\x8e\x22\x2c\x9f\xae\xa5\x86\xfa\x90\x0f\x4c\x7e\xd4\x68\xc6\x11\x5c\x69\xf2\xa6\x33\xd8\x76\xd0\x93\x4c\x8d\x32\x43\x46\x0b\x2d\xa3\x20\xaf\xdb\x87\x60\x7e\x41\x72\x31\x64\x9c\x07\x83\xc6\xe8\x98\xa3\xdf\x81\xa9\x7d\xe7\x8f\x1d\xde\x7a\x01\x24\x6a\x74\xaa\x91\x19\x70\x2c\x98\x38\x30\x4d\xce\x7a\xa2\x1b\x15\x41\xa2\xbb\x6e\xbd\xa9\x35\xcc\x38\xa3\x55\x9c\xb8\x3a\x84\x93\xcc\x4b\xbf\x14\x86\x3b\x19\x9e\xa0\xf3\x72\xc0\x55\x66\xd3\xc2\xe9\xd7\x39\x42\x63\xd2\x04\xc9\x29\x6e\xe1\xbb\xd4\xf7\x3d\x2f\x39\x35\x26\x73\xae\xbc\x34\x66\xa1\x18\xc3\x37\x02\xe2\xd8\x2a\x07\x9e\x9c\xee\x12\x28\x06\x32\x67\x43\xa7\x06\x52\x19\xbc\x06\x4c\xe1\x40\xa9\xc1\xd5\xf7\x7f\xcd\x4b\x08\xb5\x19\x79\x55\xde\xbc\xbf\xc2\xf1\x52\x20\x86\x62\x79\x97\x9b\xfe\x3a\xb9\x8b\x25\x09\xf5\x8f\xb4\xd3\x0b\xa4\x0d\xa1\x19\xb5\xdc\x65\xf1\xeb\xef\xb9\x86\x5d\x3b\x06\x90\x1b\x9b\x29\xec\xc6\x15\x92\x82\xb4\x23\x85\xde\x69\x07\x00\x61\x42\x86\xc8\xdb\xe5\xfd\xda\x11\xf0\xcd\x28\x4d\x5d\xb6\xc5\xcf\xee\x29\x28\x08\x68\x1c\x27\x5e\x59\xe3\x69\x77\x1b\x7e\x65\xb1\x60\x51\x90\x18\xa8\xbf\x15\xb0\xaf\x01\x5e\xab\xaa\x9d\x86\x50\x7d\x6b\xce\x4c\xd6\xf5\xee\xea\xcb\x6a\xf3\xb8\xba\x79\x5c\x1f\xb6\xaf\x6b\x94\x6e\xd9\x7d\xde\x6e\x1f\xff\xf5\xdb\xd0\x0e\x57\x9d\x6f\xef\x3a\x90\xa4\x84\x89\x06\x82\x45\x58\xdb\xfb\x49\xea\x6f\x4d\x7e\x9c\xbd\x84\x88\x2d\x46\xb0\x5c\x8e\xb5\x5f\x53\xc2\xd1\xc4\xe2\xa6\xf1\xf4\xf2\xbc\xfe\xd7\xfe\x75\xbd\x46\x12\xf4\xfe\xa8\x4a\x90\x8a\xec\xc1\x85\x70\xea\x76\x94\x69\x83\x98\x13\x1e\xb4\xcc\xe5\xe9\x2c\xf3\x63\xd9\xfb\x87\x37\xef\x1b\x33\x8d\x41\x41\x22\x9c\x15\x86\x26\xeb\x7b\xf8\x3e\x4b\xc0\x3a\x48\x14\xc5\x80\xf9\x77\x59\xe6\xc5\xac\xd3\x53\xa0\xda\x83\x98\xc2\x76\x7e\x05\xa4\x85\x14\x94\x71\xc4\x9a\x67\x79\x69\x46\xb1\xfe\xe5\x09\x01\x59\x24\x94\x1b\x0f\x85\x9d\xdd\x2f\x33\x8a\xfa\x60\xe5\xc1\xb3\x04\x1c\xd4\x2c\x8f\x3f\xbd\xb9\x8c\x14\x42\xa1\x37\xcf\x5f\xc2\x45\x64\xe2\xe2\x6f\x37\xd5\x6e\x6c\x54\x81\xcc\x62\x44\xf9\xe7\x48\x7a\x5e\x8f\x85\xce\x29\x48\x05\x49\x5f\x62\x78\xf9\x0e\x57\x3b\x7a\x68\xa7\x2d\x2e\x53\x9d\xb9\xb1\x29\x9b\x4b\x3d\xda\x4f\x40\xc9\x24\x71\xb4\x53\x5e\x9b\xd8\x07\x6c\xef\xf3\xba\x69\xbd\x25\x66\xfa\xc6\xda\x91\x68\x77\xef\xea\x02\x46\xa8\xef\xeb\x8f\x6a\x29\x63\x3a\xe8\x18\x87\x9a\xe2\xe9\x96\x07\x36\x8b\x22\x15\xe4\x49\x7e\x3e\x56\xd2\x57\xb4\xfb\xac\xf6\xcd\xfb\x63\xdb\xdf\xcf\x66\x0c\x9f\xbc\xc4\xb8\xe4\x6d\x71\x51\x4e\x45\xf5\x6f\xf9\x10\x60\xc1\xa9\xc4\x9c\xf2\xf2\xce\x23\x06\x37\xe5\x10\x9c\x04\x6b\xb5\xaf\xc6\x5f\xe2\x2a\x74\x8d\x6c\x24\x5c\xed\x96\xf6\x23\xd8\x45\x63\xfb\x2e\xb1\x91\xcd\x06\x79\x41\x40\xee\xf9\xf7\x65\x44\xac\x25\x04\x8c\xcf\xa0\xdc\x41\xf9\x1e\x64\xcd\x27\xb3\xc0\xd2\x08\xe8\x58\xd5\xc7\x0b\x74\x3b\x9c\xd3\xf4\xd1\x68\x4c\xb8\x5f\xa4\x7a\x4b\xe3\x83\x5b\x53\x95\xb2\xb4\x4f\x6c\x7a\x90\xa0\x19\xfa\xc2\x32\xa2\xd0\x4e\xe8\xd1\x22\xa3\x29\x11\x9a\x18\x02\x7e\xe7\x45\x46\xc6\x57\x68\xaa\x4b\x7d\x45\xf0\x66\xb9\x56\x88\x79\xe8\x33\x8c\xde\xc9\xb0\x82\x65\x22\xea\x25\xec\x87\x2e\x14\xa9\x42\x54\xfb\xeb\x6a\xbf\x3e\xdc\x7e\x5a\x3d\x3f\xac\x0f\xfb\x4f\xaf\xeb\xdd\xa7\x97\xc7\xbb\xd0\x28\xa6\x0a\xeb\x9f\xdc\x1b\x7c\xa4\xc8\x15\x1a\x33\x83\xd1\x02\x94\x39\x30\x37\xef\xc8\x6b\xb3\x38\x48\x6c\xdc\x2d\x53\x9d\x13\xfb\x4d\x9e\xf2\x27\xf9\x73\xeb\xb1\x24\x87\x70\xe3\x44\x5b\x04\x54\x2d\x41\xc2\xd3\x71\xbd\xbe\x4d\xac\x42\xf3\xf2\xb5\x0a\xec\x67\x61\x91\xb0\xa9\x04\xd6\x53\xa8\x18\x80\xd3\xfa\x23\x97\xcd\xa6\x8a\x39\xb5\x47\x87\x87\xfe\xbb\xfc\xbb\x7f\xcf\xaf\xb6\x99\x50\xe8\x1a\x3f\x6c\xc2\x7e\x64\x65\x6c\x31\x6c\x03\xe3\x6f\x22\x93\x38\x73\x60\xeb\xdc\x4c\x72\x8c\x56\x09\xc7\x47\x33\x05\xdd\x6c\xca\xce\xdf\x5b\x0c\x93\x59\xcd\x09\x96\x74\x3e\xbd\xef\xf4\x1b\xf4\xfb\x83\xd5\x29\x47\x62\xc2\x43\x2d\x4b\x53\x9d\x1e\x2f\x7a\xa4\x5c\x43\xad\x96\x19\xde\x28\x68\x97\xc6\xd6\x83\xae\x82\x89\x6a\x4d\x9c\x28\x0f\x7b\xf4\x24\xa7\xa3\xa4\x85\x35\x36\xc1\xf3\xef\x2f\x0d\xc8\x67\x40\x52\xe8\x70\xcc\x52\x57\x12\x7c\x5b\x95\xcd\x18\xbe\x3d\x7d\x70\x1b\x8b\xb4\xeb\x84\xbb\x53\x3e\x0d\x69\x5b\xab\x44\xd6\x0b\x8f\x0e\x8a\x14\xe1\x28\x70\x5c\x13\x0e\xc8\x29\x26\x1b\x70\xe8\x0f\x59\xac\x8a\x62\x82\x7d\x5e\xea\x2f\x16\x45\x71\x82\x81\xcf\x20\xee\xfd\xc1\xac\x66\x51\x24\x63\x43\x3c\x08\x65\x20\x32\x61\x51\xa4\x35\x1f\xe2\x74\x61\x61\x1b\x6d\x2c\x2c\xc2\xec\x29\x46\xde\x9e\xe4\x79\x69\x93\x65\x11\xc9\x5c\xec\x19\x81\xa7\xfb\x3e\x37\xc8\x22\xa2\x52\xb4\x54\xd7\x27\x95\x1f\x8f\x50\x4e\x79\x3c\x97\x6d\xb9\x61\x9e\xb0\x88\x68\x8e\xe6\x88\x4b\x36\x95\xf9\xe5\x34\x74\x2d\x8b\x08\x40\x34\xc6\xbb\x74\xa7\xaf\x07\x2d\x53\xdf\x8a\x92\x34\xd5\x53\xbf\x66\xa8\x7c\x60\x11\x4d\x2d\xf7\x56\x6e\x37\xf7\x7d\x6c\x18\x33\xe6\xbf\x56\x6d\x66\x11\x35\x51\xd0\xc1\x18\x14\xec\x97\x9b\x32\x1e\xa3\x80\x63\xae\x2b\x8c\x7a\x84\xbb\xb3\xc4\x95\xad\xfe\xcc\xab\x32\x1f\xbf\x1b\x93\x3c\x0d\x4a\x4d\x39\xe2\x49\xc2\x11\x1e\x29\x4d\x86\x44\x99\x17\x01\x31\xfd\x61\xe1\x94\xdb\x9e\x5e\x9e\xf7\x9f\x1e\xff\x75\xd8\x3c\xef\xd7\xaf\xcf\xab\xc7\xc3\x97\xd5\xe7\xc7\xfd\xe1\x76\xb5\xed\x5b\x66\x8e\x31\x0e\x0b\x21\x30\x15\xf3\xd8\x6f\xd1\xac\xdb\xcc\x30\xe2\x7d\xd3\x6d\xbe\x21\x06\xc3\x22\x61\x28\x56\x69\x3b\x3f\x7a\x55\x14\xb7\x55\xe3\x78\x11\xe8\x02\x78\x63\xcc\xe8\x30\x27\x06\x64\x51\xcc\x48\xea\x40\xfa\xeb\x46\xcb\xa9\x53\xcf\x90\xf4\x14\xd1\x9d\x55\x09\x75\x75\x5b\xc8\xa6\x09\x82\x1a\x2c\x4a\xe2\x58\x8b\x80\x61\x79\x1c\x00\x44\x2c\x4a\x0c\x45\xe1\xff\xf5\xea\xf5\xf1\x5f\x87\xdb\x97\xe7\xfd\xeb\xe6\xe6\xf3\xfe\xe5\xf5\xb0\xdb\xaf\x7e\x5f\x87\x66\xa9\x76\x52\x81\x3e\xec\x78\x5f\xd5\xdb\x3a\xff\x9e\x17\x70\x84\xd9\xf8\x49\x21\x45\xab\xed\x91\x64\x87\xed\xea\x71\x32\x37\x52\xc8\x5c\xda\x1d\xe1\xa6\x3f\x00\xce\x0e\x73\xea\x0f\x67\xa9\x40\x9a\x82\x07\x68\x7b\x4a\xd5\x29\xa9\x16\x8b\x32\x29\xd0\xd1\xd8\x34\x48\xf9\xd6\x7f\xc7\xcc\x30\x4c\xcd\xbf\xae\xbe\x6c\x0e\xab\xc7\xc7\x97\xdb\x91\x80\x34\x8b\x24\xcb\x14\x19\xf0\xcd\x9e\xec\xfa\x0a\xd6\xee\x5b\x2b\x2d\x25\xbd\x6a\xdd\x35\xec\xe9\x9b\xfa\x8f\xe6\x4f\xd1\x11\xa4\xe9\xc0\xb8\xfc\xfe\xe5\xf3\xf6\x0e\x9a\x36\x2f\x47\x6e\x12\x8b\x4c\xc4\x4d\xe4\x43\x92\xb2\x7c\xff\x54\x15\x9d\xef\x47\xdf\xfb\xe3\x49\x16\xc5\xa3\x94\xf2\xf4\x13\x9b\x2c\xc3\x08\x7a\x91\x5b\x1f\x56\x39\xe4\x79\x1e\xce\x05\xc1\x71\x33\x38\xd7\xf9\xff\x42\xf3\x36\xa4\xad\xfd\x71\xab\x94\xf4\x9f\x70\x9b\xff\x84\x62\xb4\xb8\xf0\xe9\x9e\xe7\xf2\x44\x8c\x90\x88\x60\x28\xa2\xfd\x01\x65\xfb\x3e\x61\x83\xea\x0e\xa6\xb8\x7b\x7b\x25\x59\xb4\x6a\x71\x41\xeb\x55\x2c\x18\x21\x5c\x24\x63\xf0\xce\x24\x56\x30\x14\xa4\x2c\xaf\x17\x84\x70\x89\xd2\x4d\x58\x5f\x72\xdf\xcb\x66\x30\x42\x14\xf7\x98\xff\xf6\x41\x36\xf7\x55\x7d\xfb\xb4\xff\x6d\x76\xae\x4e\x11\xcf\xf0\xfb\x68\x91\x70\xe0\xf9\x6e\xdf\xfa\xfc\x7c\xb7\x79\x7e\xe8\x46\xf8\xeb\xde\x95\x2d\xed\x57\x4f\x61\xa2\x13\x96\x38\x86\x56\xa4\x2a\x7f\xab\xab\x1f\x8d\x4b\x9e\x3e\x3a\x6d\x5c\xf8\x8e\xc9\xc8\xe7\xaa\xc5\x9f\x87\xe0\x08\x23\x4c\x27\xcc\x07\x7b\x6f\x72\x73\x5f\xd5\x1e\x55\xd2\xf9\x64\x3f\x17\xfd\x6a\x46\x98\x8d\xf1\x6e\x21\xe5\x11\x84\x63\x66\xa8\x9f\xff\xa4\x7e\xa4\x11\x0e\x34\xf1\x51\x81\x5e\x6e\x76\x5f\x05\x9e\x86\x66\x3e\x32\x89\x20\x99\x03\x10\x57\xe1\x31\x85\xe0\xb8\xe6\x15\x70\x94\xfa\x7d\x3c\x43\x49\xcc\x5c\x4d\xdf\xed\xfe\xe5\xb0\xcb\x8f\xa5\x6c\x2f\x75\xff\x7a\x71\x26\x55\xd2\x87\xdf\x9f\x64\x79\x91\xcb\x68\x49\x46\x12\x92\x41\xe8\xc3\xb6\xea\x07\x44\xc2\x23\x2c\x33\x70\x89\xf3\x89\x9e\x13\x23\x89\x50\x68\x75\x1f\xe0\x94\x23\xb8\xd4\x91\x1b\x7e\xac\xed\x3f\x31\x18\x67\x54\x4f\x13\xf2\xa7\xbe\x2f\x92\xd4\x85\xde\x6e\xc7\xe2\xf5\xc3\x06\x4c\x12\x25\x44\xe6\xd2\xc6\xa8\x21\xd1\x0f\xb9\x54\xb9\x5d\xf1\x21\xe0\x6a\x0e\xa8\xe0\x7c\xf7\xdb\x08\x84\x95\x86\xb6\xda\xe0\x0a\xd8\x79\xec\x9b\xe1\xf5\x32\x96\x31\x34\x10\xd7\x4f\xeb\xd7\xd5\x74\x2a\x88\x28\x3c\x61\xc6\x63\x4c\x68\x3e\x55\x4d\x33\xa6\xf9\xf5\x87\x65\x14\xa7\x91\x17\x6b\x9b\xa4\xaa\x19\x91\x86\x04\xa2\xea\xaf\x55\xfd\xad\x99\xa2\x1f\x7d\x23\x15\xb9\xe5\x73\xbd\xd9\xaf\x5e\xef\xc2\xa3\xa9\x94\xc8\x09\x07\x03\x72\x8a\x54\x1f\xe4\x0c\x19\x51\x99\x0e\x11\xcc\xb5\xac\xcb\x2b\x3d\x34\x46\x94\x8a\xd0\xa9\x80\xf6\xad\x33\xb3\x46\xda\x30\x8c\x28\x60\xc8\x99\x78\x46\xf5\xc9\xda\x45\xae\x06\xfb\x92\x11\xcd\x19\x26\x3c\x76\xd5\xa5\x34\xba\xb3\xf6\x27\x91\x01\x46\x0c\x4d\xbd\x6b\x1d\xb6\x07\x07\x3c\xed\x8f\x83\x20\x49\x0f\x50\x72\xe2\xe1\xf5\xac\x27\x21\x72\xd0\xc0\xe0\x0e\xbe\x74\x6b\xd7\xfa\x6e\xfd\xc7\xec\x4d\x80\x38\xfd\x24\x54\xef\x6a\xf3\xba\x9a\x1d\xb7\x92\xa4\x6c\xe4\xa6\xce\x73\xd4\x8c\x46\x11\x45\x9c\xd0\xf7\xaa\xcd\xcb\xe3\xdd\x65\x4c\xbd\xc0\x68\x64\x63\xe2\x4b\xd1\x8a\x5d\xe7\x3c\x2e\xf2\x84\x76\xed\x9c\xa3\xe9\x82\x38\x87\xcd\xed\xcb\x00\x09\x98\xb6\x24\x86\x66\x8e\xe8\x45\xea\xf6\x50\xe4\x7f\x5e\xbc\x01\x7f\x38\xe2\x33\xd6\x07\xf8\x73\x61\xe6\xce\xee\x47\x40\x12\x5f\x62\x78\x25\x36\x30\x5b\x62\x28\x8d\xdc\x07\x1b\x65\x9b\x11\xe0\xf8\x17\x50\xa2\x70\x36\x35\x48\xb9\x73\x76\x56\xe4\x7a\xff\x69\xd6\x81\xb4\x5b\xf2\x11\x8b\x20\xcb\x9b\x90\x0a\x65\x94\x72\x8b\x46\x0d\x46\x10\x7d\xfd\x73\x73\x1f\xb4\xab\x42\x23\xc8\xdc\x8e\xdb\xf9\x13\xce\x4e\x7d\x05\x69\xde\x47\x1c\x75\x8c\x32\xa6\x9d\x36\xe9\xf9\x5c\xe5\x65\xbb\x3a\xce\x45\xd9\x18\xe5\x34\x61\x2c\x84\xdb\x2f\xa5\x79\xb1\xbb\xfc\x67\x0b\x50\x76\x2e\x7d\x33\xfb\x02\x42\x0b\xb4\xb4\x51\x96\x6a\x07\xed\x73\xf5\x63\xd6\x22\x89\x14\x92\x5d\xf4\x62\x1a\xe3\xd2\x46\x46\x13\x9a\x45\xc6\xc7\x8e\xf0\x29\x56\xbe\x10\x7b\x3e\xb6\x12\x9e\x26\x76\x28\xd4\xfe\x08\x51\xc1\x68\x62\x18\x0e\xd3\xb7\xb1\x4c\xcd\xfc\xb9\x13\xc3\x4c\x3a\xd3\xb6\x98\xdf\xd0\x2a\x10\x21\xa9\x58\x1a\x39\xbb\x42\xea\x15\x78\x8e\xd0\x3a\xd2\xec\xf9\x71\x6b\x52\x1b\x22\x35\x4e\xa5\x69\xbc\x88\xd1\x2c\x8b\xc3\xca\x32\x4e\x8d\x31\x2a\x35\xc1\x2a\x8d\xbc\x85\x53\x80\xbb\x4d\xba\x4c\x82\x40\xe5\xc1\xf2\x72\x0a\x29\xa1\xb0\x5e\x50\xcd\x54\x40\x7c\x84\x05\xe3\x3a\x03\xcb\xa8\x4e\x5d\xc4\xe2\x98\x7f\xef\xd7\x12\x6a\x22\xaf\x4c\x3d\xb0\x34\xfe\x43\xea\x6f\xe7\xaa\xbf\xb3\xb1\x71\xec\x88\xfe\xb7\x35\x04\xb4\x91\x3f\x06\xdc\x22\x78\xcb\xca\xbc\x98\xdd\x0d\x62\xb7\x00\x39\x42\xd7\xb4\x3f\x23\x55\x08\x1b\x43\x6e\xc2\x49\x76\x8e\xf4\xfb\x18\xb5\x56\xe0\xa2\xb1\xfb\xe7\xe7\xd5\xdd\x61\xb7\xf9\x77\x30\xd4\x59\x94\xc6\x18\xad\xde\x9d\xdf\xa0\xf6\xf5\x63\x68\x2a\xbe\xf7\x2d\x24\x25\x9e\x58\x1f\xc1\xdb\x03\xdd\x00\x63\x94\x70\xe6\x7d\x9c\x87\xaa\x30\xa3\x2c\xad\x27\xe2\x18\x7f\x2c\x46\x85\xa3\x84\x3c\xd6\xbd\x38\xd9\xe2\xe0\x63\x34\xb6\x18\x87\x9a\xd8\x81\xfb\xca\x55\x6e\x2d\x5b\x10\x8c\x1a\x83\x40\x80\x43\xde\x38\x01\xc0\x91\xb7\xc5\x18\x61\xb8\xc4\x39\x78\xd7\x46\x57\xfd\x01\xea\xc8\x26\x1a\x68\x1f\xe1\xfb\x75\x8d\x5d\xd7\x42\xe3\xee\x73\x7a\xff\x52\xb5\x30\xeb\x1b\x16\x3b\x7d\xfa\x07\x68\x5f\xf3\xe3\x98\x2b\xce\x37\xe0\x52\x20\x30\x09\x45\xf4\x7b\x9d\x3c\x17\xb1\xfa\xe5\x2a\xc7\x04\x65\x8c\xfb\x22\x7b\xdc\x56\xc3\x3d\x05\x8f\x11\x6d\xf1\xdf\x2a\x2f\x1f\xe4\xc9\xd1\x23\xfb\x30\xf7\x72\x77\x8a\xc4\x21\x8b\x6d\x5d\x9d\x66\xcf\x27\x94\x40\xb6\xf2\x07\xd9\xec\xa0\x28\x7e\x1b\x7e\xce\xd2\x20\x88\xd4\xea\x83\xbe\xc2\x82\x32\x26\xac\x45\xfb\xc4\x6d\x64\x58\xe8\xb0\x2a\x8d\xe3\xe8\xc3\x1a\xf9\xc5\x40\x59\x1a\x60\xe8\x4b\xbb\x89\x3b\x48\x66\x5b\x0b\x8b\x65\x82\x85\xbd\xe7\x1a\xbe\xe7\xd5\xa5\xd9\x42\x9d\x57\x66\x3c\x0e\x63\x6d\xad\x63\x2c\xf2\x36\xa2\xd7\x80\x9c\x3e\x71\xc2\x12\x4c\xe8\x9e\xab\x1f\x50\x2f\xeb\x27\x31\x96\x18\x47\x81\xdd\x40\x69\xee\x8b\xae\xe5\x15\xf2\x6e\x0c\x72\xbe\x7a\xd8\x94\x58\x65\x7b\x97\xac\x1b\xe9\xcd\x56\xe6\xb3\x75\x98\xa5\x3a\xc3\xd5\x67\xd7\x74\x2e\x6d\x69\x64\x6d\xfe\x9e\x06\x2e\x63\xa9\xe5\x5e\x9e\xe2\xb6\xe8\x45\x67\x19\xcb\x22\x8d\xe8\x8d\x2f\xab\xdd\x7e\xf1\x52\x93\x8b\x64\x94\x4a\x13\x56\x38\xf4\x2d\x3f\xbf\x6e\x7e\x9b\x35\x89\x5d\xb9\x53\x67\x8b\xb9\xcd\xf2\xc5\xee\xdf\x06\x1b\xaa\xbf\x33\x8b\xc4\x10\x78\x7f\xc5\x10\xe2\xbf\xab\x93\xca\xe1\xd0\x7d\x06\xf7\xcf\xbe\x71\x9a\x44\xbe\x0a\x08\xd1\x11\x37\x55\xf5\x6d\xa7\x3f\x24\x6d\x65\x2c\xcb\x0c\x22\x13\x36\xcf\xb7\xaf\xff\xda\xee\x7f\xfd\x56\x5a\x05\x51\xa6\x19\x3f\xb6\xe3\xa7\x1b\x51\x47\x32\x26\x79\x82\x11\x98\xa6\x00\x38\xf7\x3f\x02\xc3\x9c\x48\x3b\x94\x97\x9a\xd9\xae\xc7\xa4\x4d\x95\xdf\xda\x37\xda\xb1\x8d\x38\xfe\xc1\xa6\xf7\xaf\xc6\x3b\x0d\x53\x42\x21\x8e\xf8\xad\x2a\x3b\x0f\xbf\xdb\x8d\xfa\x63\x5a\x58\x1b\x08\x20\xcc\xa9\xd7\x88\xef\x27\xbb\x56\x10\x62\x60\xce\x9d\xdc\x57\xcf\x73\x4f\x9d\x19\x12\x21\x3d\xde\xa7\xed\x58\xb9\x9d\x31\x43\x13\x70\x78\x1a\xa4\xb2\x27\x07\x39\x31\x8b\x99\xa1\x12\x2b\xb2\x4e\xef\x56\x7e\x14\x5a\x63\x46\x38\xd2\xfc\x06\x5a\x0c\x66\x34\xf9\xb1\x5c\xe0\x15\x62\xcc\xa4\x02\xbd\xc4\x5e\xf9\x0d\xf7\x92\xba\x3a\xad\x0b\xfd\xc1\xb5\x81\xd9\xc4\x07\xe3\x5f\x0a\x73\xe8\xa7\xe4\xcc\x88\x60\x96\x73\x33\x48\xc6\x3a\xde\xeb\x0f\x90\x1c\x8c\x59\x11\x61\x97\xa2\x05\xd7\xb9\x85\xeb\x9f\x79\x33\xab\x8e\x63\xcc\xc6\x12\x2b\xa1\x41\xd6\xc5\xfb\xb5\xc0\x17\x63\x36\x95\xd4\x5b\x1e\x58\x39\xe4\x33\x70\x18\xd2\x58\x7e\x1b\x0b\x9e\x3f\xbc\x57\x5c\xb8\x5c\x33\xe9\xba\xb6\x3c\x8a\x22\xed\xf1\x36\x0f\x75\x1e\xa2\x52\x3c\x4a\x13\x37\x80\xe5\x09\x1e\xab\x63\x1f\x90\xe3\x91\x71\x74\x38\x79\x83\xd8\xfc\x0f\xae\x4a\x98\x43\xb7\xba\x2d\x10\x3b\xb3\x5e\x7d\x97\x79\x31\x29\x6d\x99\x74\x04\x27\x5c\xe2\xf7\x35\xd5\x5d\xde\x9c\x2f\x28\xc6\x55\xd5\xef\x5f\xeb\xbc\xbd\x16\x2c\x9e\xdd\x2e\x53\xc8\x05\xf4\x38\xc4\x97\xbe\x87\x07\x26\x8a\x31\xdd\x33\xde\x74\xf7\xff\x92\xc3\x8f\x97\x7a\x07\xe3\x72\xf9\x80\xf0\x60\x9c\x72\x85\xa5\xd4\x3e\x0f\x7c\xe0\xe1\x42\x34\x36\xa9\xa7\x8e\x5a\x9f\xf2\x76\x14\xf1\x98\xbe\x07\xcd\x5c\x62\xa7\x84\x1f\x13\x5b\x6d\xf6\xcc\x54\x47\x48\x78\xf0\xe5\xdf\xfb\xc3\xd7\xd5\xe3\x63\x90\xe6\x63\x9c\x49\x26\xac\x5f\xf8\x3b\xcf\x61\xf9\x2b\x73\x06\x26\x72\xa0\xa2\x5d\xe7\x53\xef\x60\x6a\xe4\x70\xc1\x52\x57\xd5\x85\xb1\x9f\x6e\xbc\x3e\xc8\x3e\xff\xc4\xb8\x88\x9d\x0d\xe4\xe8\xe8\xaf\x75\x16\x19\x8f\x99\x63\x0a\xd9\xbf\xd5\x55\x09\xa8\xd3\x09\x66\x52\x47\x18\x1a\xa6\x99\x93\x47\x1c\xd7\xb5\x3a\x51\xdc\xbf\x70\xa4\xae\xfe\x4e\x0a\x6e\xc3\xe5\x35\x8d\x3c\xb5\xee\xcd\xe5\x4a\x1c\xd4\x37\x4a\x38\x41\xd8\xb7\x7b\x1d\xa4\xc3\x5f\x7a\xa7\x44\x65\x89\x2f\xe2\xd9\xdc\xbe\x7c\x05\xf8\x46\xaf\x29\x76\xb0\x19\xd2\x0b\xdc\x56\xa7\x53\x55\x2e\x58\x63\x3c\x95\x6a\xd0\xc6\x76\xd8\x31\x17\x2b\x98\x5e\x28\xb5\x46\x0f\x90\x6a\x74\x7c\xdb\x39\x1b\x28\xe3\x99\xa6\x18\x16\xb8\x2d\x40\xd6\x6b\x57\x53\x8f\x86\x43\x5e\x1e\x27\x64\x42\xa1\xbd\x15\xd0\x5d\xf5\x70\x76\xc2\xb1\xb7\x6f\xb2\x5e\x4e\x62\x84\xf8\x09\x97\x11\x47\x4f\x42\xd5\x00\xa6\xdb\x8d\x6e\xc2\x40\x90\x82\x21\xf8\xc4\xe5\x96\xf0\x5d\xdd\xb8\x75\x72\x0a\xa1\x95\xb2\x71\x90\x3c\xf9\x82\xf1\xe1\xe3\xec\x25\x54\x9c\x22\x19\xd3\x4e\x5a\x78\xc8\x6d\x3b\x2b\xbd\x5f\xd8\x26\xb9\x8e\x28\xfa\xc7\x26\xff\x7e\x5f\xd5\x53\x9c\x09\xe3\x9a\x48\xc4\x4a\x3f\xd2\xdb\x85\x1a\xe9\xd0\x28\x23\xca\xef\x0a\xf7\x79\xf1\x11\x56\x76\xf1\xe6\xda\x60\x01\xe9\xe6\x66\xf3\xef\xd5\xed\x6a\xf7\x29\xdc\xd7\x68\x11\x4c\x12\x5f\x78\xff\x2b\x60\x35\xe3\xc0\xb2\xc0\x0c\xf3\x44\x67\x5f\xca\x92\x14\x6d\xa4\x63\x85\xc8\xa7\x70\x0b\x6b\x12\x74\xee\x0f\x5e\x15\x74\x50\xe4\x1a\xfa\xd3\xda\x2c\xe9\x29\x2e\x7a\x7a\xfe\x99\x48\x3b\x13\x91\xcc\x90\xaf\x6a\xa5\x35\x34\xcd\x43\x67\xe7\x4d\x9f\x41\x44\x52\x63\x86\x21\xa0\x84\x9e\x56\x7f\x1c\xd6\xfb\xf0\xba\x82\xd0\x54\xd3\x50\xa6\x03\x28\x37\xf3\x3e\xc1\x6e\x33\x41\x12\x0b\x4e\xbb\xe4\xe7\x6d\xd5\x0c\x3f\x6b\x8b\x0b\x44\x03\xed\xaa\x0f\x07\xcc\xfb\x6a\x58\x5a\x05\x25\x8e\x43\xd3\x83\x2d\x9b\x83\x81\x73\x80\x1d\x32\x41\xad\x04\x1d\x66\x14\x6e\x71\xd7\x21\x22\xc1\x20\x41\x93\x27\xa4\x9a\x9f\x60\x34\xe7\xa6\x4b\x82\x88\xb5\x40\xcf\xbb\x96\x1a\x59\x86\x47\xa1\x4e\x91\x70\x8d\x79\xba\x7e\x8b\xfc\xbd\xac\x7e\xa0\x7e\xdc\xcd\x35\xd1\x50\x38\x47\xa5\x68\x87\x86\xec\xf3\xae\x2a\x72\xb3\x1b\x98\x43\x99\x48\x80\xa0\x79\x80\x96\x6a\x67\x6c\xbf\x5c\xfa\xce\x4a\xa9\x8a\xbb\xcf\xf9\x69\x73\x77\xb7\x7e\x1e\xe5\xe7\x44\x2a\x32\x1d\x4d\xd4\x14\x36\xb7\x2f\x0b\x6a\xc2\xc3\x93\xa4\x19\x45\xd3\xbe\x33\x0a\x97\xea\xa3\xba\x16\x0c\xc3\x2b\xfb\xf5\xea\xe9\xf0\xe9\xe5\xf1\x2e\xb0\x9b\x30\x91\x45\x04\x23\xe5\x2e\x0c\xee\x98\xb5\xd7\xa5\x19\x77\xf6\xec\x76\x59\xca\xb9\x8b\x38\x96\x3e\x69\x7e\x0f\x70\x23\x1b\x6f\x03\x34\xfd\x95\x53\xc7\x05\xd9\xcb\x91\x05\x82\xa2\xbe\x81\x76\x8c\x35\x8e\x92\xcd\x03\xe8\x42\xa8\xa0\x9c\xe4\x8c\x44\x66\x75\xe6\x07\x57\x2f\x71\x75\x55\x51\x3c\xfb\xeb\x4f\x95\x94\x63\x86\xe7\xbf\xd5\x7b\x53\x4d\xa2\x31\x42\x49\xd3\xab\x5a\x5e\xca\x23\x54\xa5\x8f\x36\x2f\xbf\xb9\xb2\xdc\x81\x34\xe4\x09\xea\x4b\xb0\x67\x85\x8e\x92\xc8\xe9\x45\xd5\xc7\x80\x6a\x9a\x7d\x00\x23\x99\xa6\xbd\x94\xe3\x22\xa6\xb0\x6b\xe4\xf0\x08\x8f\x50\x96\xb2\x6e\x47\x29\x1f\x01\x99\xc4\x38\xb4\xbd\x14\xf7\x79\x51\xec\xff\x98\x4d\x04\xd0\x1c\x27\xf5\xca\xe0\x86\x8b\x3c\xec\x4b\x39\x7b\x01\x26\x51\x26\x08\xe4\x63\x04\x90\x84\x7b\xd8\x88\x18\xcf\xda\x13\xea\x57\x7e\x0b\xbe\xe4\xd8\xd0\xba\xd2\x72\x08\xe7\x4b\x88\xf9\x50\xad\x59\x6f\xeb\xea\x5c\xe7\xd0\xca\xfa\xfd\x3a\x02\x21\xac\x76\x68\xd6\xce\x57\xfc\x24\x4b\x53\xcc\x22\x28\x7e\x6a\xc6\x11\xa1\x18\x6f\x40\xb3\xf9\x15\x81\x58\x79\x55\x3a\x96\x85\xd0\x84\x27\x72\x10\xb8\x0f\xfb\xc6\x47\xec\xcb\x2c\x26\x94\x60\x48\xd8\xcf\xb0\x85\xfd\x3c\x26\x54\x60\xdd\xdd\x43\x55\x98\xfb\x5c\xb6\xf7\x30\xcd\x52\xc4\x24\x75\xbe\x7f\x0d\xd2\xb8\xdc\x68\x29\x4f\xf0\x47\x0b\x32\x0c\xef\x98\x92\x34\xf2\x7b\xd1\xa6\x85\xd3\xf3\x48\x52\x65\xda\x73\x31\xa5\x34\xe4\x20\xa5\xc3\x06\x8f\xb0\x41\x2c\xa6\xc6\xb0\x20\xe1\x92\x97\x3f\xc3\xcf\x9c\xd1\x58\x07\x05\xba\x2f\x55\x0b\x1f\x0c\xdb\x98\xb3\xd8\xa9\x39\xf6\x58\x67\x59\xf7\xac\x8d\xdd\xe1\xcc\x38\x49\x99\x4b\x33\x5b\x60\x63\x41\x08\x75\x6c\x86\x6e\x56\x7a\x36\xc0\xba\x3a\xdd\xc8\xb2\x67\x7e\x98\x9f\x43\xb1\x3e\xc1\x51\xcf\x63\x8e\xf6\xb5\x5b\x02\xe6\xcd\x98\xc2\x4b\xbf\xae\x6f\xef\x17\x6c\xb3\x58\x40\x8c\x24\xc5\xaf\xeb\x9b\xf5\xe3\xed\xcb\xe6\x79\x5c\x5b\xc4\xe2\x58\x65\x58\xbc\xed\x58\xd5\xfc\x37\x77\x72\x4e\x87\xb6\x3a\xe8\x69\x30\x20\x4e\x62\x4e\x60\x60\xba\xf4\x50\xc6\x71\xdd\x3d\x8b\x93\x8c\x73\x1f\xf4\xdd\x98\x9b\x77\xfc\x60\x93\x8f\x9e\x32\xc1\xfc\x2c\xf6\xaf\x7e\x2b\xcf\xb3\xc7\xce\x6c\x1c\x74\xfc\x7d\x91\x0c\x4e\x86\x1b\xac\xbb\x0c\xa8\x4a\x16\x4b\x99\xe0\xee\xf1\x0a\xa7\xce\x7b\xf8\x90\xae\x97\xc5\x52\x73\x5c\xdd\xbf\x76\xf3\x1e\xa9\xa9\x07\x54\x48\x2c\xad\x40\x4e\xd8\x12\x7e\x4e\xc5\x35\x7e\xf9\x5f\x7f\xb2\xe2\x6e\x1f\xc7\xd7\x69\xf3\xef\x70\x9f\x0f\xc5\xc6\xb3\xa7\x50\x5a\xe1\x1c\xfb\x9a\x97\xa6\xa8\xea\xe0\x19\xc6\x5a\x70\x31\x4d\x8d\x6f\xeb\xaa\x9b\xa4\x93\x85\x36\xd6\x69\x82\x70\x9b\xaf\x37\x63\xf8\x2a\x8b\xb5\x15\x9a\xf4\x64\xd9\xde\x92\xec\x86\x97\xaf\x6a\x9b\x4d\x4b\x43\x22\x91\x0c\x3c\x20\xde\x31\x1f\x47\x35\x62\x23\x24\xa6\x3e\x8f\xf9\x77\xf8\xfd\x62\xaa\x66\x91\x55\x94\xc5\x26\x96\x7d\x8e\xdb\x5d\xe6\x66\xb1\x28\x84\xc5\x46\xb9\x57\xaf\xe1\x3b\x94\x17\xb8\xaf\xe5\x88\x9a\x96\xc5\xe0\x05\xb3\xd4\xe5\xfd\x1e\xcb\x75\x76\x27\x59\xb7\x0b\xdc\x35\x7d\x7b\x8d\x35\xd3\xcd\xa5\x39\x43\x69\x1e\x7a\x3c\x34\x8b\xc1\x00\x32\x41\x7e\x87\x1a\x01\xce\xe7\x1c\x7c\x0a\x33\x9f\x51\xf3\xb0\x18\x2c\x49\xa5\xd7\x3b\xfb\x11\xd6\xbc\xab\xac\x79\x6c\x49\x84\x69\xbf\x37\xd9\xdc\xcc\x43\x23\xb1\x15\x0a\xab\x63\xaa\xda\x40\xdd\xdc\xca\x12\xa9\x3a\x0e\xfd\x45\x08\x1f\x52\xcf\xe1\xdf\xe9\x7f\xe2\x0f\x01\x3e\x0b\x63\xcc\x4a\x87\xcb\xa9\x65\x0b\x3b\x80\x71\x85\x29\x4b\x22\x42\x11\xdf\x67\x7b\x5d\x4d\x96\x10\x22\x19\x19\x34\xb6\x0e\x72\x46\x2d\xcf\x12\xe2\x95\xe4\x1f\x56\xfb\xf5\x63\xff\xa3\x48\x74\x34\x14\xfa\x20\x0a\x7a\xb0\x35\x13\x62\x24\x12\x8d\xf6\x05\xdb\xa3\xbe\xf2\x4d\x58\xe4\x12\x93\x08\x46\x2f\xbf\xcb\x66\x2b\xf3\xb2\x0d\x5c\x75\xa1\xdf\x13\xc6\x65\xe6\xd9\xfa\xd0\x07\xee\x09\x43\x1d\xe9\xc7\x48\xd7\x37\x9c\x90\x18\xe4\x05\xdd\xe7\x58\xe8\x37\x1e\xfe\x09\x8f\xb4\x75\x31\xd3\x7d\x9d\x1f\x7b\xa1\x59\x96\xf0\x54\x22\x86\x20\xac\xbb\x07\xda\x1f\x51\x94\x7a\xa9\x9b\x73\xd5\xc8\xc2\x47\x91\xa6\xf7\xe4\xe0\x80\xa6\x9e\xe0\xe3\xe6\x1d\x99\xf5\x97\xb7\xc3\x44\x10\x42\x06\x45\x13\x07\xb5\x0c\x77\x13\xdc\x62\x7c\xa7\xac\xda\xcf\x48\x8f\x2c\x55\x01\x9b\x12\x43\x0c\xa1\x4d\x2c\x5c\xc7\x99\x51\x59\xa4\xaf\xd1\x66\x49\x9c\x50\x4c\x84\x79\x32\x73\x87\x6d\x5d\xdd\xef\x7f\xef\xcf\xb6\x54\xc3\x8c\x48\x7d\x9a\x11\xee\xbb\x3e\x11\x0e\x49\x2d\x4f\x27\x28\x4d\x50\x05\x45\x02\x84\xc5\x45\x2b\x49\x62\x25\x43\x7a\xe5\x71\xb5\xbf\x95\xf5\x35\xa9\xe0\x72\xda\x38\x49\x3c\x08\x7d\x8b\xc9\xfd\x3b\x64\x14\xbe\x1d\x08\x61\x59\x92\x48\x40\x3e\xc4\xc3\x02\x78\xe0\x6f\x11\x77\xb1\x24\x4d\x63\x11\xc0\x25\x87\xaa\xec\x69\x41\xbb\xe9\xf3\x5c\x3d\x56\xc7\x70\xaf\x8c\x09\xa4\xb7\x42\x47\xe2\xc1\xe9\x7c\x02\x18\x2f\x3c\xdd\x83\xc7\x92\x4c\xc7\x41\x30\x7c\x73\xfb\x12\xac\x78\x7f\x50\x12\x8e\xe6\x59\x6e\xd7\x27\xa8\x8f\x50\xea\xf7\xdd\x00\x69\x49\x24\x73\x7c\x27\x3d\xeb\x99\x23\xc0\x5d\x4e\xdd\x24\x8a\x29\x6d\x02\x29\xcc\xa5\x6c\x6e\xde\x3d\x06\x78\xf9\x4d\x55\x12\x23\xe2\x6b\xd7\x39\x73\x48\x4f\xbc\x8c\xb6\x66\x89\x4a\x13\xea\x43\xaf\xfb\x1c\xea\x6b\x80\xe5\xe2\x6a\x9e\x28\x29\x11\x14\x7f\x93\x1f\x27\x13\x4c\x13\x07\x5d\x56\xae\x46\xa7\x2a\xf7\xfb\xa7\x9b\xf7\xce\xdd\x5d\x7e\x2f\x1d\xb3\xd4\x9b\x00\xeb\x9f\x6d\x2d\x7b\xa2\x0f\x96\x68\x88\x10\x19\x87\xd7\xf7\x00\x79\xa7\xed\x36\x9b\x7c\x1a\x52\x0c\x3f\x7e\x5a\xbd\xde\x75\x8e\xdd\xe1\xf3\x2e\x20\x54\x12\x93\x44\x48\x48\x28\x55\xbe\x2e\x75\xd5\x2b\x55\x4f\x02\x5d\x61\xf1\xee\x16\x8e\x91\x5c\xfa\x75\x5f\x5c\x3b\xd5\x09\xb0\xc4\x41\x00\xdc\x0e\xf9\x30\x5f\xf3\xd3\x88\x64\xa1\xe0\xf7\x53\x75\x06\x7b\x29\x36\x33\x6f\x31\x25\x19\x43\x55\x81\x97\xfd\x7e\xdc\x99\x29\x01\x8e\x25\x63\x1a\x2b\x1c\x26\x73\x33\xa5\x8c\xc5\x9e\xfd\xfe\xa5\xe7\x7a\xb9\x8a\x62\xa4\x34\x71\x08\xff\x23\x38\x66\xc4\x37\x4c\x50\xf4\xd1\xa7\x94\xca\x58\x50\xbf\x20\x5e\x9a\x16\xcc\xee\xad\x9a\xa1\x76\x52\x0a\x89\x80\x01\xba\xbb\x1c\x52\x9a\x8e\x8f\x94\x91\x38\xf3\xb9\x91\x47\xf8\x9e\xb7\xb2\xb3\x33\x3e\x97\xb9\xae\xea\x72\x6a\x21\x84\x95\x2b\xe5\x1c\xe2\x28\x4c\xba\x97\x2f\xb7\x03\x15\x2c\x4b\xb9\x30\xb4\x4f\x2d\x0d\x5b\x53\xca\x33\x81\x30\xd9\x71\x14\xf5\xaf\xcb\xb5\x59\xca\x8d\xc6\x0a\x39\x28\xcd\xfe\x0a\x60\x37\x6b\x2b\x22\x81\xf9\xa1\xfb\xe2\xfd\x56\xfa\xd4\xf8\x4e\x7e\x5c\xc2\xfe\x97\x7f\xc7\xe7\xc5\xfc\x3f\xe2\xff\x86\x1b\xc5\x14\x4b\x8b\xba\x41\xbe\xcf\x4f\xe0\x6a\x25\x96\x37\x91\x54\x24\x4e\x2f\xc6\x3a\x51\x2e\xa4\x9a\xf6\x20\xd3\x5e\xc2\x9e\xa5\x22\xb3\x8e\x90\xe8\x04\xad\x34\x57\x4e\x61\x2a\x0c\xe5\xba\xa7\x1e\xeb\x89\x0c\x46\xcc\x35\x2c\x8d\x63\x47\x18\xd2\xad\x9a\xff\x18\x5c\xe4\x34\xce\x18\x22\x5b\x5e\x01\x8b\xfd\x5d\xc0\x39\x1c\x93\x94\xf3\x40\xb3\xda\x76\xdf\x3e\x98\x7a\x63\xd3\x2c\x8d\x8d\xc6\xbd\xb5\xaa\x8f\x43\x99\x1a\x4b\x13\x12\x63\x6c\xbe\xae\xaa\xf6\x60\xaa\x93\x1c\x6e\x9a\x50\x9b\x06\x42\xab\x83\x3c\xca\xbc\x6c\xda\xfb\xaa\x7f\xdf\x24\x31\xb8\xfc\xdc\xdf\x3c\x0e\x25\x96\x2c\x4d\x74\xea\xb2\x79\xdd\x59\x79\xf9\xbd\x5b\xf7\x5f\x2f\x05\xb8\xe8\x4b\x68\x95\x72\x47\x34\x71\xf3\xb8\x79\x7e\xe8\x7f\x4c\x04\x56\xfb\x21\x63\x7a\x31\xd2\xde\x60\x69\x9a\x0a\x37\x05\x2f\xf5\xb9\x08\xb5\x06\x2c\x95\x49\x84\x90\xf2\x03\x3f\xa0\xe6\x49\xff\x7b\x9a\x62\x04\xaa\x7b\x88\x07\xef\x36\x3b\xcb\x36\x20\x5a\x46\x76\x5c\x2a\xb5\x42\xc0\xde\x97\x1c\x7e\x1c\x9c\xb2\x3a\x8c\x71\x15\x87\x2b\xe5\x44\x96\x2a\x26\x11\xac\x5c\x5e\x4e\xdb\xa2\xea\xb7\xce\x54\xa5\x11\x3a\xae\xd2\x84\x21\x02\x7d\x86\x12\xf6\xd5\xd5\x3a\x17\xd6\xc3\x54\x19\x8b\x01\xe2\xc6\x4d\x2f\x68\xe6\x8b\x9b\xd6\x19\x0f\x3b\xea\xba\xae\x87\x20\xf2\xbe\x72\xa1\x03\x1f\x98\x0c\x44\xd3\x2c\x05\xca\x30\x5a\x1b\x32\xa6\x4f\x57\x28\xea\x14\x52\x23\x49\x90\x71\xf7\xe5\x1a\xa1\xe8\xba\xe7\x06\xfd\xff\xcc\xdb\xc9\x52\xb0\x26\x72\x51\x5f\x4c\x50\xef\xab\xb9\xe4\xc4\xb4\x7d\x16\xd1\xc8\x38\x5f\x09\x4c\xb0\xe8\xe6\x2d\x9c\x40\x44\x5e\xe6\x8e\xe2\xde\x21\x12\xfe\x16\x6f\x2b\xcb\x22\x91\x45\x9e\xe7\x18\x3f\xc1\x23\xd6\xa5\xf7\x5f\x66\x53\xde\x74\xde\xc1\xfc\xa3\x64\x91\xaf\x65\x90\xaa\xce\xeb\xbb\x4a\xea\xaa\x87\x9b\x66\x91\xa2\xdc\x03\x18\x9f\xd5\x0e\x8a\x02\x73\xeb\xfd\x51\x63\x71\x1c\x54\x85\xf9\x63\xbb\xf2\x8a\x29\xfe\x18\x89\x33\x24\x47\xfd\x01\xf9\x24\x4a\x95\x91\xd8\x15\xfd\xab\xdc\xbc\x94\xb7\xb5\xb4\xed\x6a\x46\x81\x30\x7d\x2b\xa2\x9d\xe0\xf3\xba\x34\xdd\x26\xda\x93\x4e\xb0\x8c\x58\x87\xe6\xb1\xd0\xea\xb7\x2f\x55\x0b\xdd\x10\xbe\xaf\x6a\xa4\x8f\x99\x8e\x81\x8c\x6a\x8e\xbb\xa6\xdb\x89\x37\x2d\x9c\x5c\x52\x64\xd1\x1a\xc9\x58\xa4\xad\x0f\x2b\xfa\x18\xc0\x17\xa8\xb1\x3a\x78\xbc\xdc\x64\x8c\x32\x24\x71\x79\xcb\x8f\x58\xdc\x8e\x9f\xcc\x15\x50\xfb\x16\x9c\x45\x6e\x4d\xbb\x79\xb9\xed\x7f\xb3\x14\x3d\x3a\x94\xdb\x43\x57\x7b\x89\x0f\x98\x65\xb1\xe0\xe0\x48\xa0\x4b\x53\xfd\xa0\x68\x53\x8f\x80\xef\x59\x1c\x1b\x25\xbc\xa8\x60\x4f\xfc\xc2\xb2\xc4\x24\xd2\xdb\xe3\xdb\x8d\xe3\x2d\xa1\x7c\xfa\xdc\x89\xed\xe9\x03\x77\x0e\x5d\x3c\x31\xce\x7a\xcd\x5a\xdf\x3c\x25\xa9\xf4\xa1\x5b\x0f\x6f\x5d\x1e\xdf\xa9\x52\x36\x19\xb4\xdc\x7a\x5a\x1d\x96\xa5\x10\xf9\x58\x61\xdb\x42\x9d\xcf\x0a\x0a\x59\x96\xf1\x0c\x8b\x8c\x9b\xd5\x50\x3a\x1f\x0e\x69\x8d\x45\xf5\x9f\xbf\xf6\x1d\x28\xe3\x38\x71\xd2\x88\xb2\xd0\xcf\xf0\x73\x09\x43\x97\x29\x96\xa0\x21\x72\x40\xfc\x1a\x41\xca\x90\x70\x01\x9d\x44\xdc\x79\x8a\xa8\x3f\xe6\xb6\xe0\xa9\xfd\x1b\x5a\x6a\x43\xa0\x97\x55\x47\x6b\xbd\x47\xa3\xf7\x43\x5d\x9b\x0c\xab\x3e\x31\xea\xbd\x1c\xe8\x9f\xf5\x94\x31\x80\x00\x89\x2d\xfa\x80\xb0\xf5\xae\xe0\x47\x0c\xee\x1f\x5d\xc5\xd2\x28\xea\x09\xa3\x1d\x40\xaa\xc1\x65\xdc\x37\x00\xca\x94\x37\x15\x83\x97\x3b\x3e\x6c\x89\xf3\xfb\x9e\x2b\x1c\xb8\x6d\xde\x17\x94\x33\x19\x25\x91\xf2\xd9\x71\x57\x07\x3c\x1d\x9c\x32\xd2\x19\x52\x5a\xdf\x38\x32\xf9\xe0\x85\x48\x42\x22\xc5\x7b\x62\x47\xef\x4a\x86\x91\x24\x49\x06\xb8\xfe\xe7\x8e\x4e\xe1\xb6\x92\xfa\x2a\x5e\x35\x25\x6b\x08\x27\x1a\xe7\x4e\xb7\xc7\xda\xef\xff\x0d\xd2\x16\x74\xd7\x18\xa9\x24\xf9\xd6\x94\x4a\x24\x9f\x44\x41\x8d\xf6\xa0\x2e\xef\x87\x76\x98\x38\x98\x4e\xe8\x9e\xf1\xe6\x52\x97\x97\xf3\x83\x3c\x81\x4b\xb6\x79\x06\xa6\xbe\x59\x2a\x02\x1f\x81\x73\xc6\xae\x74\x1f\x99\x64\x51\x44\x86\x82\xd7\x59\xb6\x50\xb2\x2c\x36\x69\x80\x0d\xb9\xa4\x72\xc8\xc4\x8d\xb6\x66\xc9\x4c\x26\xc9\xa8\xd8\xa6\x0f\xde\x7f\xa8\xa2\xce\x24\x8f\xdd\xf7\x69\xab\x4b\x9d\x37\x63\x2b\x5f\xf2\x98\x53\xd1\x4b\x45\x28\xa8\x5f\xac\x47\x60\x98\x5d\x0b\xe7\x66\x5b\x57\x77\xd5\xc0\x85\xd2\x9d\x90\x22\x03\xa2\x1d\x2b\x0e\xfc\xad\x2d\x50\xf2\xce\x8f\xec\x3c\x8d\x00\xd0\xf7\x04\xfb\xd7\xc5\x12\xe1\x04\x6b\x58\xa0\xa5\xf2\x75\xa5\x3d\x68\x52\x0a\x92\x60\xa4\x14\xf2\xe3\x5b\xfb\xb6\x54\xa3\xcc\xa4\x90\x12\xb5\x8b\xce\xce\xbd\x75\x7c\x13\x3e\x0e\xbc\xad\x73\x67\x1b\x2c\x3f\xac\x30\x19\x8a\x30\x38\xfe\x8d\xe3\xf3\xfe\xf5\x5f\xe1\xaa\x71\x1c\x4b\x1f\x65\x7b\x05\xa9\xdf\xc0\xec\x2a\xdb\x0e\x15\x44\x32\x89\x92\xc8\x8e\x40\x48\x77\xf0\x1d\x8a\xea\x0c\xf5\x6d\x9f\x12\x94\xa9\x8c\xd0\xc4\x72\xfa\xbe\x70\xba\x62\x65\xff\x65\xe5\x2e\x93\x19\xd1\xda\x0f\x97\x2f\x85\xfb\xa6\xd3\x7a\x03\x99\xd1\x44\x27\xbd\x79\x8d\xc1\x3e\xdc\x16\xd6\x1f\x45\x50\x64\x46\x6d\xe4\x2a\xf6\xbb\x85\x3b\x80\x18\xab\xda\x81\x80\x66\xf7\x67\x2e\xdd\x79\xc4\x5a\xa6\x97\x5a\x6a\xac\x50\xfc\xe7\x05\x7a\x60\xaa\xcc\x44\x1a\xf8\x01\x76\xb2\xe8\x5f\x3d\xd3\x4e\xd2\xa1\x90\x4d\x7b\xb7\xde\xdf\xf6\x8b\xb5\x94\x3c\x75\x0a\x42\x79\x09\x5b\x38\x7f\x00\x25\x95\x32\x71\x01\xaf\xef\x39\xfc\xf8\x5c\x6a\x07\x4e\xf1\x93\x25\xac\x5d\x7d\x37\x28\x63\x12\xac\x22\xd4\x55\xf3\xde\xb4\x70\x9a\x64\x16\xa4\xa6\xca\x78\x0e\x6c\x9f\xdf\x7c\x82\x6e\x1e\x4c\x72\xd8\xe3\xff\x8c\xe3\xb2\x52\x8b\x54\xa9\x91\x42\xab\x93\xbb\x5f\x64\xa9\x4a\x67\x2f\xa1\x15\xc7\xbd\xaa\xdb\x97\xee\xaa\x8b\x2a\xe0\x26\x2f\x0d\x98\x9b\x22\x2f\xd1\xc0\x64\x73\x03\x71\x7a\xbe\xe1\x24\xac\x17\xbb\x6f\x79\x31\xf5\xd0\xa5\xc9\x34\xf4\x15\xe6\x67\xb7\xdc\xdf\xca\xf3\xa6\x5c\xb5\x6d\x05\x7d\xe2\x5d\x76\xae\x68\xb7\xfa\x3d\x6d\x1e\x82\xd7\x21\x81\x0b\x4a\x43\xf1\x29\x7b\x6a\x5a\x38\x0f\x19\xeb\xee\x68\xe2\x18\x87\xf2\x12\xaf\x38\x04\x3c\xa4\xe5\x11\x0b\x71\x81\x2b\x25\x16\x26\xad\x0c\x92\xe9\xd2\x43\x74\xcf\x85\xd4\x80\x04\x25\x81\xc8\x8d\x29\x22\x54\xa8\xda\x44\x63\xf0\x61\x9e\x75\x51\x24\x8d\x71\x81\x3f\x07\x0d\xfb\x0f\xb8\xcb\x99\xa2\x94\x86\x92\xf0\xa7\xf7\x6d\x55\xbd\xf5\x77\xa1\x71\xcc\x5c\xf7\x37\x6f\x87\xda\x47\x17\x27\x96\x8f\xa2\x69\x94\x84\x60\xa5\xa7\x7b\x58\x97\x8e\x96\x76\xcc\x57\xb2\xc0\x4f\xc3\x14\x85\x18\x73\x17\xbd\xd0\xf5\x52\xf2\x4c\xb1\x44\x06\x09\x40\x87\x58\xfd\x7c\xe9\x61\x78\x8a\x65\x2a\x1b\x49\xbc\x74\x8e\xf9\xb2\x2d\xa5\x98\x36\x98\x2e\xd7\xce\xe8\xb8\xaf\xea\xd7\xf5\x3f\xbb\x0d\xeb\x0a\xa8\xd3\x35\x45\x63\x15\x9d\xc3\xe6\xf1\xf3\x7e\x7e\xdc\x5a\x3b\x04\xa1\x3a\x17\xb5\x84\xc2\x9b\x9c\x57\xda\xf6\x93\xde\xe2\x8c\x04\xb5\x5c\x74\xc2\xfa\x78\x25\x16\x41\x2e\xfb\x3a\xe3\xe4\x81\xe2\x59\x86\xb1\xe1\xed\xeb\xfa\xb0\xb9\x7d\x39\xec\x37\xeb\xd7\xc3\xfd\xe6\x75\x17\xc0\x71\x4a\x30\x87\x5e\xc8\x1b\xcf\x3f\xd4\x1f\x48\xe2\x34\xf6\x7c\x2c\x87\x6e\x59\x39\xd4\xd0\x5c\xfa\x15\x47\x89\xce\x98\xf8\x3f\xff\xcf\xff\x79\xb8\xd9\x4e\xb6\x3f\x25\x0c\xa7\x51\x1f\x0d\xff\x0a\xaa\xc9\x5b\x18\xd8\xbb\x98\x8a\x99\x8d\x07\x80\xd4\xcd\x25\xc7\xda\x57\xe4\x07\xd7\x0b\x4a\xc8\x4c\xc5\x3a\x95\x01\xcb\x9f\xbb\x04\x17\xc0\x42\x70\x4c\xc5\x96\x62\xdc\x6d\x6c\x93\x84\x28\xf7\xdf\x0b\x5b\xab\x84\xd3\x80\x43\xeb\x3a\x04\x81\x00\x28\xd8\x3d\x97\x96\x63\x2a\xc9\x62\xdb\x9b\x5a\x9e\xdc\xba\x33\x51\x56\xa5\x83\xb0\x4f\x2f\x9c\xf2\xc8\x15\xb4\xc8\xd3\xc4\xde\x9d\x4e\xae\x2c\x96\xd8\xab\xe5\xe5\xf4\x62\x9d\x5c\x54\x3f\xbd\x24\x13\x58\x1e\xf5\xf5\x4d\x16\xd0\x1c\x8e\x75\x75\x39\xf7\xc7\xb4\xa3\xf8\x73\x7d\x1a\x72\x7f\x0b\x86\x8b\x92\x96\x40\xdc\x43\x6e\x3f\xe6\x2d\x67\x4a\x25\x0a\x6b\x8f\x5c\x04\xff\xd7\x8c\x0a\x4a\x49\xc8\x54\xef\x54\xfd\x5c\x94\x58\x61\x4a\x33\x47\x0a\xed\x79\x09\x3e\x55\x2d\x14\xfd\xfb\x69\xae\x8c\x1c\xe9\xbf\xed\x50\x5f\xe5\x43\x83\xe8\x2a\x55\xa6\x4c\x24\xd0\xbe\x68\xf2\xa2\x42\x48\x74\xb8\xb2\xe1\x40\x3d\xbe\x0f\xce\xb2\xee\xbe\xd0\x0e\x7a\x22\xd9\xd0\x48\x30\xec\x18\xd9\x6d\x65\xc1\xc8\xfd\xed\xb2\xa4\x95\xf5\xc1\xd8\x31\x19\xb8\x1a\x9f\x4b\x69\x50\x5b\x7f\x1c\xda\x54\x46\x29\x92\x85\xbc\x76\xd3\x56\xa7\x8f\x42\xf8\xca\x58\xa9\x3d\xc4\xa4\x4f\xcb\x2a\x60\x04\xdd\x4a\x5f\x66\x3d\x45\x94\x29\x2b\x1d\xca\x36\x6f\x42\xce\xbc\xde\xca\x26\x24\xd9\x5f\x41\xce\x59\x10\x99\xb2\xda\x69\xe3\x1d\xeb\xea\x47\xfb\x36\xc3\xfe\xeb\x88\x11\xcc\x02\x3b\xca\xc6\xf7\x91\xe2\xd4\xf4\xa5\x75\xc4\x13\xe4\xb5\x6c\x2e\xea\x94\xb7\x37\xb2\x28\xe6\x34\x5b\x61\x03\xd5\x24\x02\x47\x19\xd1\xb6\x52\x7f\x83\x7a\xfd\xf3\x3c\xc8\x7e\x84\x1b\x13\x66\xb0\x70\xc5\x8d\x64\xbf\xcb\x2e\x92\x73\x68\x12\x53\x5c\xcd\x0f\x47\x70\xb4\x4d\x18\xd2\x59\xb5\xff\x02\xb9\x5c\xa3\x32\x3c\x35\x01\x57\x5f\xff\x0a\x65\x2b\x47\x38\x21\x4d\x85\x72\x80\xa6\x8b\x6a\x97\x45\xfc\x98\xa6\x0a\x30\x80\xea\xd5\xcf\x07\x1b\xf9\xbe\xaa\x17\xd1\x4b\x9a\x51\x82\x0e\xef\xc1\x53\x90\xce\xe9\xb2\x98\x66\x19\xa5\x9e\xc7\xbe\xbe\x82\x9f\x69\x4e\x75\x88\xa0\x8d\xc2\x26\x24\x1c\xb5\x99\x08\x22\xc6\x63\x14\xfb\xf4\x1a\x82\x12\x42\x7a\x3e\xfe\x17\x3b\x81\x6e\x68\x91\x6a\xb4\xba\xf0\xe9\x9f\xab\xdb\x22\x1f\xe5\xea\x74\x1c\x27\x66\x22\xf4\xe1\x16\xaf\x9b\xea\x72\x7c\x6b\xc7\xb4\x34\xd3\x97\x8a\x53\x86\x1f\xfc\x0b\xd4\x7d\xd1\xb9\x4e\xa2\xcc\xf0\x09\xe0\x01\x33\xf8\xcb\x0f\x9d\x18\x85\x51\xf1\x22\x3f\xe5\xed\x8b\xbd\xa9\x65\xa9\x83\xa1\xa5\x53\xaa\xbc\x10\x53\xbb\xe9\x2c\xe6\x6f\x79\x79\x74\x03\x66\x60\xf7\x18\xb6\x11\x9d\x66\x32\x94\x1c\x06\x7d\xa7\xae\xb7\xa6\x63\x14\x65\xda\x70\x79\x44\x06\xa6\x79\x6e\x4a\xa7\x10\x47\x53\x74\xca\x1d\xa8\x99\x0d\xa2\x33\xe2\x48\xb5\x1a\x68\x75\x95\x97\xf6\xea\x6b\x87\x54\xe2\x11\xda\xbb\x4f\xb2\xdb\x2f\xca\x09\x49\x72\xd7\x22\x45\x92\x91\xaf\xb2\x85\xfa\x04\x45\x55\xe2\x08\x5f\x96\x64\x9f\xf6\x99\xe4\x4c\x3a\x60\x8f\x3c\x39\x10\x49\x88\xfd\x69\x4d\xa9\xa3\x66\x76\xcc\x47\x3d\xe3\xf1\x6c\xb8\x69\x2d\x1d\xb9\x53\xd7\xeb\xaa\x06\xf9\xed\xf0\xba\x7e\x5c\xaf\x76\xeb\xfe\x42\xa0\x42\x96\xd1\x95\xc8\x84\x49\xb0\x19\x98\x24\x99\x36\x82\x22\xc4\xe2\x94\x4b\x63\x7c\x2c\x62\x92\x23\xd2\x40\x04\x96\xd0\x14\x60\xdb\x38\x99\xf5\x12\xf0\x88\xa8\xb1\x86\xc5\x2b\x68\xcc\x41\xce\xa7\x07\xa8\x34\x14\x9b\xde\x56\x67\xe9\xc6\xc0\xd4\x75\xd3\x16\x9c\x52\xac\x4f\xb2\x37\x87\x4b\xd9\xe6\xc5\xe1\xbf\x93\x12\x4e\x13\x31\xe6\x50\x10\x45\x1e\xd4\x9c\x99\x89\x12\x86\xe8\xe2\x5d\x7e\xfc\x98\x27\x76\xba\x51\x8c\xb7\x5c\x43\x32\x97\xb3\x73\x3f\x36\x6b\x2c\xba\x5e\xd8\x9b\x0d\x91\x4e\xb7\xc2\x2e\xcf\x27\x43\x94\x83\x58\x23\xf6\xf0\xbe\xaa\x9f\xba\x99\x38\x51\x6f\xf1\x0d\x79\x04\x09\x59\xa6\x5d\xdf\x9c\xce\x57\x00\xdf\xc5\x4c\xd6\x70\x5b\xae\x34\x7a\x0f\xea\xf2\xee\xe1\xec\xd5\xcf\xf7\xe9\x27\x30\x5c\xc7\x68\x37\x1d\x02\x92\x18\xad\x94\xdb\x61\x7f\x35\x82\x69\xfc\xd4\x08\x6a\x9b\xc7\x7d\x97\x97\x69\x23\x78\x8c\xcc\x1f\x67\x0c\xc3\xbb\x52\xf7\x23\x24\xfd\x25\x45\x82\xd1\x8f\x60\x31\x38\x70\xc4\xcd\xfb\xb6\x73\x62\x70\xef\xfd\x80\x53\xff\xda\x78\x30\xc2\x53\x42\xe5\x8d\x2f\xb8\x30\xfb\xd5\x22\x9c\xc9\x88\xcc\xbd\x88\x97\xbb\x1e\x08\xb5\xb0\xa4\xca\xc2\x90\x97\x6a\xa0\x6e\x0f\x36\x2f\x4d\x37\x3b\x3e\xe5\x65\xfb\x0c\x3f\x7d\xed\xc8\xd0\x2d\x00\x8e\xfc\x4c\xeb\xad\x2b\xe7\xea\x8f\x58\x82\x17\x33\x9e\x28\xe0\xc5\x3a\x6c\xed\xa8\x9e\xd3\xc4\xc2\x15\xac\xe3\x0d\x19\x3f\x38\xea\xd3\x07\xd9\x7c\x6e\xba\x8e\x8a\x22\xe4\x21\x08\x93\xc0\x24\x4c\xa2\x02\xdf\xea\xe9\xe5\xf3\xf3\xfe\xeb\xea\x61\xfd\xba\xbe\xeb\x0f\xc6\x19\xe6\x5e\x3d\x23\x72\x20\xdd\xf8\xf5\x17\x4a\xd3\x18\x99\x5d\x4e\xf9\x10\x2f\x9b\xe5\x93\x2f\x57\xa5\x8e\x26\xd5\xa9\x0b\x27\xca\xbc\x7f\x95\x2c\xa2\x88\x1c\x70\x05\x7e\x07\x75\xa9\x67\x80\x46\xa3\x23\x82\x7b\xd4\xcd\xef\x37\x01\xfd\x62\x34\x44\x58\x25\xe1\x69\xf7\x2a\x64\x93\xdf\xd6\x81\x25\x75\x71\x9a\x69\xeb\x7b\x01\x37\x31\x5f\x88\xb3\x6c\x04\x1b\xa3\x62\xc4\xef\xdc\xbe\xbe\x7c\xbd\x73\xa4\xa0\xfb\xd5\x6b\x70\x9f\x8c\x31\x4c\x42\xd0\xcd\xf8\x06\x5b\xa8\x7b\xc6\x3f\x66\x0c\x68\x33\x2e\x9c\xdb\xdc\xbe\x4c\xc4\x83\x99\x01\xea\xf8\x3b\x4f\x2e\x96\xba\xbb\x60\x1c\xf4\xf3\xee\xee\xeb\x7a\xd3\xb7\x51\x36\x09\x56\x4e\x60\x20\xf2\xf2\x5c\x53\x17\x62\xba\x0d\x18\xb0\x8e\x24\x10\xfd\xf4\xdb\x5a\xaa\x7e\x14\x58\xea\xb8\x67\x7d\xda\x2c\x3f\x01\x2a\xde\x86\x32\x94\xe5\x8e\xb0\x4c\x18\x87\xd1\x56\x45\xae\xf7\x0f\xeb\x81\x2d\xb3\xbb\xc2\x18\xb7\x6f\x6c\x12\xa1\xf3\xdc\x0d\x8a\x55\x51\xfc\x36\xbe\x10\x44\x11\x43\xb4\xec\x6a\xb7\x6b\x3f\xc8\xef\x2f\x8b\xd3\x32\x88\x20\xc1\xcd\x17\x3d\x6d\xc7\x93\x53\xcf\x16\x22\x20\x86\x98\x3e\xbf\xeb\xa8\x24\xb1\xbe\xbb\xaa\x6f\x65\x69\x72\x33\xd2\x51\xbe\xe6\x85\x01\x62\x29\xb2\x90\xde\xad\xf6\x0b\xa8\x66\xa0\xb1\xc1\x3a\xbc\x53\x5e\x86\x80\xf2\x6f\xe1\x90\x96\x40\x3c\xc8\x51\x16\x63\x31\xf6\x0f\x1c\xa7\x2b\xd0\xfd\xf2\x3b\x53\x63\x3d\xc0\x73\x12\x8b\x9b\x4e\x0d\x60\x44\xe0\x56\xf9\xf4\xbe\xde\x6e\xc7\xee\x38\x30\x66\x9d\x98\x64\x30\xdd\x86\xfa\xac\x2c\x9c\xcd\x49\x96\x90\x20\xc5\xf4\x97\x34\x88\xff\x3f\xff\x86\x7b\xc5\x7d\x91\xed\x17\xe4\x41\xd9\x57\x2e\x6b\xef\x76\x95\xd0\x4a\x09\xe2\x75\xdd\x47\xa4\x73\x20\x22\x8d\xd4\x55\x8e\x09\x2a\x97\xed\x88\xfa\x9f\x81\x90\x0c\xd3\xe5\x3b\x68\x3f\x9f\x97\xa3\x57\x20\x4c\x8a\xdd\x11\xe8\x5e\x9b\x55\xdb\x9f\x0e\x34\x76\x30\x3e\x9d\xd7\xae\xaf\x1e\x25\xda\xea\xb3\x74\x19\xc4\x51\x84\x6b\xf6\x8b\x1b\x87\x6d\x5e\xc3\xa7\xca\xcc\x6a\xd5\x20\x61\x94\x05\x0e\xfa\xbc\x3c\xae\x7b\xf8\x02\x24\x82\x46\x71\xe0\xce\x40\x6f\xcd\xce\xcf\x95\x0e\xb4\xef\x80\xd2\xd0\x34\x55\xbd\x9c\x2a\x85\xc4\xb8\xd4\xde\x6e\xbf\x7e\x7d\xde\x7c\x7e\xfa\xf4\xf9\x61\xbd\x7e\x7c\xdc\x3c\xac\x9f\x6f\xd7\x83\x44\x2f\x83\x94\x38\xd0\x7e\xcf\x2a\x89\x60\x7f\xf4\x5e\x7a\x5d\xd0\x7e\x3a\xcc\x6e\x92\x32\x67\xf5\xea\xbe\xca\x04\x02\xa5\xd5\x6d\x75\x3a\x17\xd0\x23\x0d\xf1\xc4\xbe\xcc\x0d\x52\x10\x86\x0e\xfa\xe9\x54\xf6\x4f\x03\x89\x23\xf6\x86\x9f\xa0\x3f\x5d\x54\xff\xbb\x35\x68\xa1\xee\x7f\x3a\xe0\xae\xdf\x80\x82\x5d\x0c\xda\x2a\xcc\x54\xa2\x86\xec\xe5\xbd\xdf\x2d\xc1\x44\x29\x9f\x8c\xf3\xd7\x89\xfc\xe0\xec\x85\x8c\xb0\x81\x2d\x74\xa2\x40\xe0\x69\x9d\xc7\x58\x8c\x65\x2b\x1b\x80\x2b\x24\x9d\x39\xcb\xf7\xf9\x4c\xbf\x5e\x57\x6c\x14\x3b\x15\x05\x4f\x5b\xec\xd2\xb8\xd3\x54\x65\x68\x99\x64\x91\xee\x69\x0a\x77\x55\x81\xc6\xc3\x48\x6f\xbf\x6b\x62\x31\x56\xff\xa2\xfe\x0b\xbd\xc7\x6e\x23\xd0\x64\x9a\x21\xf9\x56\xc8\xdf\x16\xa2\x82\x96\x46\x26\x89\xfd\xc0\xbc\xcb\x8f\x79\x2b\x7d\xf2\x32\x5c\x8a\x32\x57\x6c\x03\xdd\xd0\xc0\xf0\xd9\x93\xcc\x47\xf2\x72\xcc\x52\x01\x38\x8d\x9e\xf3\xf2\xbf\x72\xd1\x29\x09\x0d\xb3\x24\x4e\x3d\xd6\xac\x6c\xaa\xc2\xac\x7a\x38\xb2\x83\x32\x4c\xdc\x2f\xcb\x19\x41\x40\xf3\x0e\xda\xdd\x45\x35\xba\xce\xcf\x5d\xd3\x51\x18\x68\xfc\x19\x2d\xe7\x8e\x43\xa0\xa7\xc7\x19\xe9\x01\xcc\xfa\x95\xc7\x4e\x89\x68\x77\xae\xca\x9b\x5f\x84\xbd\x2c\x4f\x2c\x5a\xbb\x0e\x1b\x74\x07\x05\x1c\x65\xdb\xd3\x0a\xcd\xaf\xaa\x38\x06\x51\xce\xf9\x4f\x28\x9a\x2d\xd4\xb7\x83\x71\x66\xb9\x4e\x90\x82\x65\xf3\xfc\x65\xbd\xdb\xbf\xbc\x1e\x1e\x5f\x6e\x7f\x3f\xdc\x7d\x7e\x1d\x33\x12\x5a\x0e\x19\xaa\xee\x9e\x26\x34\xf0\x0f\x55\x9f\x72\xb3\x82\x0a\x04\x31\x68\x79\xee\xbe\xd5\x23\x98\x01\xe8\x6c\x45\xec\xa4\x50\x1c\x6e\xfb\x29\x2f\x5d\xf5\xfc\x95\x96\x23\xb3\x02\x2c\xa6\xab\xbb\x6f\xf9\xdb\x98\xea\xc2\x1f\x8f\x05\xb5\xc1\x96\x81\x9f\xd3\xea\x67\x1b\x03\x60\x8c\x01\x1d\xa3\x29\x8f\x75\x78\x92\x84\x09\x2c\x28\x39\x61\x21\xdc\xfb\xca\x93\xd5\xd7\xb2\xd8\x76\xce\xdb\xaf\x49\x41\x6d\xc6\x25\x0f\x42\xde\xb9\x87\x04\x6c\xe6\x14\x0d\x36\xd3\x16\x87\xae\xd7\x26\xb8\xb9\x94\xa6\xe8\xbc\xfe\x6e\xb3\x6f\xaf\x6b\x60\xac\x8c\x32\x5f\xfb\xdd\x8e\x58\x18\x97\x68\x0e\xac\xd4\x14\x0b\x92\x7e\x42\x00\x6f\x5b\x09\x06\x43\x82\x7a\x28\xd2\xb4\x8a\x3a\x02\xcc\x75\xe9\x6b\xb7\xfd\xef\x5a\x48\x0c\xb5\xfb\x7d\xba\xf3\xce\xde\x77\x50\xcc\x16\x76\xab\x63\x19\xea\xd8\xf0\x74\x0c\x2b\x4f\xe7\x80\x96\x56\x84\xe0\x80\xbb\xd8\xb5\x62\x1f\xb3\x46\x2b\x2c\xef\x34\x21\x11\x7a\xb8\xad\xf2\xf2\x70\xfb\x26\x6b\xa9\xdb\x9e\x3c\x2c\xb4\x36\x4e\x52\x7b\x9f\x17\xf0\x73\x92\xad\xb3\x36\x8b\x11\xf9\x7b\x1e\x04\x3a\x67\x0d\x8c\x93\x37\x3c\xca\x93\xab\x14\x99\x53\xab\x58\x6b\x13\x64\xf0\x36\xd5\x4d\x58\x44\x78\x14\x11\xcb\x7d\xfd\xe9\x2e\xaf\x3f\x54\xd6\x0c\xad\xb9\x53\x7b\x46\xb3\xed\x34\xca\xcb\x5c\x2d\xa6\x3c\x8a\x12\x8d\xd2\xa6\x25\xfc\x6c\x47\xf4\x5d\x3c\x8a\x0c\x81\xbe\xd4\x6d\x5e\x7d\xc4\x23\x42\x05\x16\x9a\xe4\x4d\x58\xce\x06\x38\x0f\x8f\xa8\x30\x18\x75\x75\xe0\xdc\x1e\xd0\xc3\x23\xd4\x67\x76\x2f\x22\x17\x9f\x9d\x6a\x86\xab\xd0\xf3\xfa\xeb\xee\xe5\xf7\xcf\xc3\xa6\xcb\x23\x6a\x23\x47\x21\xe9\xaa\x13\x56\x18\xf9\x74\x95\xa2\x5e\xa8\xcd\x7f\xf6\xae\x69\x1a\x39\xb8\x43\x01\xba\xdd\xc3\xe9\x5c\xc8\x09\xbd\x37\x8f\x58\xc4\xd1\xca\xdb\xc2\x51\x36\x97\x71\xda\x85\x47\x2c\xb6\x58\x0f\xf5\x45\x55\xa1\xfa\x80\x47\x2c\x75\xd4\x07\x87\xbc\xf1\x65\xf0\x93\xe1\xc8\x23\x4e\x23\xe9\xba\xe4\x55\xb6\x0e\x3f\x3f\x6b\x21\x12\x81\xda\x05\x8f\xd5\x71\xa8\x65\xf7\x38\xcb\x85\x68\x07\x8f\xe2\x88\x6b\x1d\xd0\x7e\x08\x33\x71\xdf\x68\x7a\xd9\x98\xb8\xe2\xdf\x06\xb9\x56\x9e\x66\xfc\x86\x3c\x8a\x33\x85\x80\xde\xa7\x3f\x9e\xb6\x77\x4f\x93\x37\x8d\x55\x86\xb1\xa7\x61\xf6\xf1\x28\x36\x0c\xcb\xd6\x8b\xea\x07\x34\x6d\x60\x4f\xaa\x2e\xed\x3f\x2f\x55\x7d\xe9\xfb\x23\xe1\x04\x93\xa9\x26\x64\xb4\xb1\xae\xae\x99\x0d\x68\x1e\x25\xc2\x29\x44\xf6\x12\x28\x28\x75\xb1\x75\xec\x00\x33\xde\x20\x7f\x4a\x1a\x39\xd6\x99\x07\x59\x1e\x4b\x79\x9a\x3c\x71\x4a\xdc\xca\x28\x8d\x59\x9f\xf3\xa6\xea\xc5\x05\xff\x67\xfa\xd2\x29\x01\xe6\xa4\x35\xda\x35\x0a\x8e\xce\xe3\xc4\x3c\x4a\xa9\x2b\xb4\xb6\x79\x69\xbc\x1e\x0c\x26\x4e\xa7\xad\x32\x95\x86\x50\xa7\x1b\x6c\xcb\xa5\x59\x3c\x92\x71\x8a\xf1\xd5\xce\xb9\x0c\x10\xbb\x70\x28\x91\x3a\x1e\xa9\x11\xef\x74\x55\xc3\x6f\xb3\xa9\x28\x0d\x45\x58\x78\x73\xce\xdb\x72\x4c\x00\xce\x23\x09\xe0\xa0\xca\xd1\xcf\xbb\xea\x08\xba\xca\xcb\x49\xa7\x28\x92\xa0\x11\x7c\x92\x3f\x3f\x3d\x6e\x9f\xf6\x9d\x09\x12\x12\x5a\x3c\x52\x54\x1b\x33\x36\xe7\x9e\xde\x9d\x41\x77\xe7\x09\xbf\x97\x2d\x3b\x1e\x29\xce\x11\xc4\x0b\xce\x7c\xdc\x9d\x01\xf7\x53\x8f\x8b\x69\xc2\xf5\xb5\x16\x31\xf5\xcc\x91\x53\x58\xd9\x6d\x55\xd7\xa0\xaf\x6b\x04\x26\x96\xd4\xcc\x6d\x0b\x13\x54\x9b\x04\x27\x4b\xde\x34\x17\x58\x8e\xd5\xfe\xca\x3b\xe2\x91\x61\xe0\xb4\x4b\x9d\xf4\xbf\x2b\x9c\x5d\x4c\x7f\xf0\xc8\xc8\x58\x25\x81\x62\x08\x0f\xdc\xe7\x50\x04\xa0\x27\x8f\x8c\x06\x8d\x70\x9b\x6e\x8c\x53\x36\x1b\x22\x36\xe6\xb8\x23\x3c\x54\xef\x72\xfa\x61\x6c\x62\x83\xd2\xe4\x31\xf8\xb7\x9c\x44\xd4\x27\x84\x5c\x59\x99\x43\x59\x4e\x1e\x88\x44\xb1\xc2\xf5\xf5\x1f\x97\xa6\xcd\xed\x3b\x06\x56\xe6\x4d\x12\x47\x83\xa7\x3c\x2b\x80\xef\x38\x42\x88\xdb\xfd\xf3\x06\xd7\x20\x3f\xe1\x26\x1b\x23\x27\x44\x30\x8c\x06\xe2\x1e\x31\xe6\x9b\x19\xef\x11\xb3\x1a\x10\x4e\x48\xac\xf1\x96\x3b\x0c\x9f\xe4\x95\xd9\xd6\xb0\xd9\xbf\x1c\x9a\x1e\xcf\x39\xe9\x18\x42\x12\x4a\x3d\x08\xe4\xb9\x6a\xe1\x77\x78\x5f\xc2\x0a\x73\x42\x4c\x82\xc9\xe6\x22\xd7\x50\x36\xb0\xe9\x3e\xf9\x35\x44\x8d\x13\xca\x1d\xc3\x4f\x5f\x39\xb7\x83\xb6\x85\xa9\x90\x0d\x27\x34\xb1\xc4\x6b\xaa\xa0\x5d\x7c\x9f\x17\xc5\x61\xd1\xe5\xe3\x84\xa6\xcc\x7a\x77\xfd\x19\x7e\x38\x63\x66\x99\x4c\x83\x13\x46\x62\xe2\xdb\xde\xbe\xe5\x2a\xbf\xaf\xea\xfb\x4b\xf3\x11\xda\x97\x13\xc6\x64\x12\x76\x6d\x59\xc0\x35\x03\x26\x27\x2c\xcb\x30\x93\x6d\xf2\x6e\x9e\x54\xf5\x4d\x78\x07\xce\x1c\xc5\x00\x12\xb7\xec\xce\xa0\x73\xa4\x6b\xde\xcb\x6f\xd0\xbf\x27\x97\x02\x67\xbd\xed\x1c\xa1\x63\x3e\x1e\x78\x84\x83\x45\xb5\x62\x17\x97\xda\x94\xdf\xab\x39\xac\x94\x93\x98\x02\x0e\xce\x4d\x75\x79\xad\xaa\xb6\x19\x09\x16\x7f\x54\x2d\x12\xc6\x58\xcc\x1c\x32\x64\x5c\x28\xf7\x81\xd4\x63\x38\x23\x71\x59\xd5\xca\x43\xb1\x0e\x7f\x22\x14\x6b\x72\x8b\x7e\x9c\x25\xdc\xa2\x95\xde\xf9\x5f\x77\x73\x21\x35\x4e\x92\xc4\x28\x6f\x89\x3e\x86\x44\x4e\xb3\x7c\xdb\x24\x4b\x71\x09\x2b\xaa\x63\xd5\xcc\x2f\xa3\x32\x1e\x07\x31\xe1\x97\xa1\x1c\x81\x93\x44\xa7\x58\xd5\xf9\x54\xd5\x3d\xc7\x2e\x27\x69\x26\x11\x70\x53\x5d\xda\xa6\x95\xb8\x14\x8e\x62\x26\x9c\x64\x34\xb6\x83\x12\x42\xc8\x5e\x8e\x37\x74\x92\x31\x8e\xf6\x4f\x30\x9a\xd6\xb3\xe8\x13\x27\x59\x4c\x94\x1e\x29\xb8\xcc\x1f\x3a\xd3\x0c\x8d\xbb\x63\x2d\x4b\x73\xb0\x63\xaa\x45\x4e\x64\x6a\x10\x74\xe5\x31\x39\xfd\xfb\x28\x93\x51\xd9\xd7\x17\x17\x55\x7b\x55\x20\xc1\x91\x20\x38\xc6\xac\x69\x5d\x4d\x86\x92\xf6\xb5\x47\x3a\xc8\xf5\x2e\x86\x83\x38\xd1\x19\x47\x5c\x56\xe1\x70\x25\x43\xb9\x1f\x27\x5a\x52\xed\xd8\x55\x9c\x94\xcb\x46\x57\x33\x75\x51\xde\x2d\x01\x49\x67\x90\x05\x70\x39\x27\x46\x41\x1c\x4f\xc8\x47\x6e\xf6\xb7\x37\xf3\xbb\xf7\x83\x06\xa8\x63\xe9\xec\x76\x7c\x83\x29\x8b\x27\xf9\xb3\xeb\xe4\x19\xf2\x20\x34\x37\x12\xf3\xc0\x9d\x8b\xd5\x75\xe3\xe5\x63\xa5\x1e\x7f\x86\xa5\x04\x49\x25\x9b\x52\x9e\x9b\x37\x14\x49\xfd\x06\xb3\x52\xc3\x0f\xce\x8c\x53\x74\x17\x7d\xf8\xca\xab\x94\x39\xe6\x83\x4d\xf9\xb9\xe9\x77\x06\x6b\x98\xb6\x7e\xcf\x2a\xa1\x78\x45\x98\x50\xb7\x10\x56\x97\x49\x2d\x2b\xa7\x11\x77\x99\x93\x7f\xfe\xfb\x21\x8a\xc8\x48\xe6\x8a\xd3\x28\x71\x3a\x83\x79\x73\x73\x79\x7f\x9c\x14\x4a\xf9\x16\x84\xa4\x11\xf3\x85\xd8\x97\xf7\x11\x91\x34\xa7\x24\xb3\x88\x37\x6e\xfe\x9c\xde\x8f\x68\x82\xe1\xc2\xef\x55\x0b\x07\x5b\xd5\x07\x1d\x42\xc0\x87\x5b\xfc\xff\xa1\x6e\x9a\x53\x2a\x14\x26\x11\x1d\x03\x02\xa6\x5c\xc2\x56\x4a\x19\x21\x98\xdd\xb2\xc5\xe5\xe7\x3d\x8c\x6c\x8f\xa9\x7e\x2f\xa7\x4c\x64\x88\x09\xb2\x79\x28\xd5\xe8\x95\x29\x67\x1a\x95\x9c\xb2\x98\x3b\x85\x93\xca\xd7\x7c\xf9\xc4\xd3\xee\x47\xde\xea\x37\x6f\xb0\xcc\xcb\x36\xc3\xb9\x9a\x07\x6a\x8c\x9b\x8b\x39\x42\xfb\x62\x03\x9e\x6e\x79\xd3\xa0\x5c\x93\x94\xfa\xc4\x76\x6d\x66\x0a\xac\xbe\x8d\x60\x4e\x4a\x50\x43\xdd\x6d\xe0\xb3\x0f\x20\x0c\xb5\x72\x52\xf0\x3f\x9e\x72\x34\x66\x16\x03\x57\x77\xd2\xe4\xba\xef\xd5\x84\x47\x98\x76\x7d\xde\x3c\x63\x34\x72\xf2\xd1\x93\x38\x93\xd2\x13\x18\x41\xe3\xd1\xd2\x8b\x40\xad\x34\x9c\x91\x45\x69\x1c\x9c\x0b\xb4\xe2\x2f\xb2\xb8\xed\x47\x73\xdf\x3f\x89\x25\x18\x76\x2a\xaa\x23\xbd\xa9\xae\xb8\x1e\x39\x4d\x3d\xef\x32\xd6\xdf\x9a\xf7\xdb\xaa\xa8\x6a\xb7\x30\xce\xda\x25\x63\xe5\xf3\x6d\x9d\xff\xaf\x63\x6e\x0b\xaf\x90\x49\x16\xfb\xd4\xf3\x8b\xe7\xa9\xbf\x07\xf8\x8a\x25\x23\x37\xef\x2e\xac\xb6\x04\x5d\xe7\x34\x03\xc7\x3e\x82\x25\x98\xfe\x37\xc5\x04\x56\xac\x61\x3c\x23\x94\x5e\x8d\x78\xb0\xaf\x9d\x61\xaa\x34\xc5\x0c\x94\xc3\xda\x0f\x38\x3b\x4e\x0d\x65\x68\x78\x68\x59\x06\xc9\xa5\x59\xc2\x68\xfa\x40\x46\x67\x22\x94\xe2\x2d\x14\x63\x70\x0a\x91\x93\x74\x7b\xac\x8e\x41\x82\xf1\x97\x75\x16\x9c\x02\x61\xcc\x86\x78\xbd\x1f\x34\x77\xd5\x8f\x7e\xcc\x40\x0a\x54\x04\x35\x91\x53\xbe\x4c\x1b\xcc\x29\x64\x52\x79\x00\xe0\xbe\x96\x06\x7e\x1b\xcd\x38\xc8\x14\x92\xa5\xfc\x00\x79\xee\x6c\x80\x6b\x19\x2f\x4e\x2d\xf3\x34\x09\x97\xd2\xdc\xc9\x2a\xdc\xdd\x0a\x17\xe6\x6c\xb0\x2e\x63\x24\x30\x39\x1d\xf8\x2c\x4a\x05\xea\xdd\xf9\x1c\xa3\x2c\xbf\x39\x76\xf7\xc5\x77\x66\x51\x96\x21\x4c\x4f\xe5\xe6\x23\xbe\xf4\xd9\x19\x44\x39\xcc\xe1\x11\x46\xe1\x20\x7f\x8c\x12\x82\x61\x9e\x12\x7e\xdc\xc9\x0a\x35\xc4\xfb\x6a\x95\xbf\x9b\x80\xc1\x45\x6a\x7a\x4b\x2a\xb8\x93\x4b\x0f\xee\x95\x27\x4d\x1f\x11\x09\xcf\xcf\x88\x29\xf1\x0f\xb9\x05\xf9\x6d\x1c\x22\xe2\x8c\x51\x8d\x6e\xe0\x0e\xb1\x5a\x36\xaf\x4f\x08\x33\x1e\xe7\x04\xd2\xd1\x32\xc9\x44\xe4\x10\x05\x7d\xd0\xb2\xdb\x5a\x90\x5b\x78\x5b\x57\x6d\xa5\xab\xe2\xca\xf3\x65\x42\xb8\xe0\x4e\x9b\x9f\x60\xfd\xb3\x85\x72\xe4\xac\x32\x91\x46\x08\xd1\xd8\x3e\xdc\xad\xfa\xdf\x32\x8e\x5b\xf1\xf3\xcd\xfe\x4b\xff\x1b\xb0\xcc\x73\xcb\x0d\x81\xe8\x5f\xad\x38\x2c\x26\x16\xf3\x9e\x4d\x5e\x1e\x8b\x5e\xc6\xf0\x29\xef\x6f\x1d\x33\x08\x85\xdb\xd3\x6a\xc1\x30\x45\x59\x9c\xb8\x9a\x6c\x97\x1a\x44\xb7\xca\x57\xe4\x4e\xdf\x30\xb6\x0a\xdd\xff\x43\xde\xb8\xd4\xd8\xa2\x79\xc8\x12\xa2\xd1\xd0\x6c\xaa\x13\x3c\x41\xfb\x56\x19\xf1\xcb\x24\x3d\x67\x09\x4b\x49\xcf\x21\x52\x05\x15\x2b\xce\x12\x9b\x49\xff\xd9\x0e\xef\xd5\xa5\x3e\x1c\xe5\x09\x0e\xa5\x5b\x86\x31\x91\x13\xae\x20\x89\x23\x4d\x3d\xe7\xc5\x5c\xc0\x8f\x33\xa5\x1c\x72\x12\x13\x6a\xaf\x55\x51\xdc\x05\xbb\x3d\xac\xc7\x4c\x8b\x18\x6d\x04\x93\x37\x4e\xe3\x2d\xfc\x1e\x1b\x4c\xdf\x3b\x22\xf0\x1e\x11\xb6\xbc\x42\x31\x9d\x48\x5c\x4e\x5e\xb6\xab\x7f\x85\x2b\x80\x10\x58\xa5\x07\xb5\xec\x7f\x8a\x69\x94\x8d\x74\xfd\xb7\xb2\x6e\x9b\xdb\x2b\x76\x85\xfe\xe5\x6c\x9c\xea\x6c\x90\x8e\x3b\x61\xca\x21\x30\x6f\x87\x36\x99\x71\xd9\x15\x80\x6f\xdc\x61\xf0\xc2\x11\xc5\x63\x13\x78\xf6\x3c\x37\xb1\x9b\x4d\x0b\x61\x66\xce\xac\x56\x0a\xfa\x30\xe3\x4d\x55\x61\x9d\xde\x34\x1c\x34\x92\x30\xe9\xa3\x0d\xfd\xe4\xe1\x11\x07\xe4\x43\xa9\x51\x7e\x60\xb0\x98\x79\x24\x28\x26\x65\x6e\xb9\xee\x11\x8d\x9c\x47\xd6\x91\xdb\x6d\x5f\xd7\x07\x04\x30\x6c\xd7\xaf\xb7\xeb\xe7\x7d\x38\x4e\x58\xec\xab\x9f\xd0\x23\x9e\xdb\xb8\x9c\xb0\x14\xab\x62\x1c\x60\xf8\xa1\xa8\x14\x16\x7d\x35\x6d\x2d\xf3\xb2\xdd\x8e\x2c\xd0\xa5\xb5\x9b\x13\xe9\x10\x5e\x75\xc8\x31\x86\xdf\x35\x75\xfa\xf5\x6f\xd5\x8f\xcf\xe5\x59\xe6\x66\x53\xb6\x50\xcf\x4b\x92\x39\xa7\x8c\xa1\x6c\xcd\x03\x86\x9f\x4b\x9b\x1f\xc3\x25\x68\x9c\xc0\x50\xfc\xb5\x03\x7d\xc1\xe2\xa3\x5f\x6e\x49\x9c\x2a\x81\x50\xcc\x7f\xef\x77\x7d\x17\x30\x6a\x31\xf3\x7b\x85\x15\xff\xf5\xa5\x18\xe7\x2a\x84\xeb\x66\x42\xe8\x9c\x77\xdb\x0b\x62\x1f\xd7\xaf\xbb\xcd\xcb\xf3\xe1\x79\xf5\xb4\x0e\xf7\xe3\x09\xa0\x53\x8e\x71\xea\xee\xbd\x1a\x94\xa2\xb8\xaf\xea\xdd\x39\x2f\xcb\x1e\x85\xcf\x39\xcf\x74\xe6\xc3\x7d\x79\xf3\x86\x8b\x6a\x70\xb7\xb9\xc8\x58\x94\x05\x34\xd8\x41\x77\x9f\x44\x96\x2d\xed\x0f\xeb\x18\xe1\xd4\xa1\x8e\x66\xdb\x19\x7c\x0b\x98\xa8\xff\x24\x83\x51\x91\xba\x7f\x32\xfa\x1f\xfa\x7f\x47\xb5\x39\xe3\x40\x27\x17\xd6\xc5\x3d\xde\xe0\x67\xd3\xd6\xfb\x0a\xd9\x56\x26\x1e\x23\x8f\xa9\xc2\xed\x00\xa1\x4f\x6f\xb9\x7e\xbb\xdd\xdf\xcd\xbe\x6a\x9c\x3a\x4a\xb6\x12\x7e\xb6\x37\xb9\x71\xd1\x69\x44\x93\x8c\xc5\xb3\x39\x4f\x38\x23\xa1\x60\xe4\xf6\xd3\x52\x39\x2d\xe7\xa9\x72\xa8\xf2\x36\x30\x39\x4c\x63\x2b\x3c\x4b\x5c\x79\x8d\x2c\xcb\x4b\x71\x8b\xb6\x6d\x3e\x31\x5e\xa6\x8f\x96\x69\xe6\xe2\xcb\x39\xfc\x38\x1c\xa1\xc5\x55\x11\x63\xd8\xc3\x15\x75\x6c\x7c\x88\x6c\x81\xd1\x61\x36\x4c\x24\x75\x95\xb0\x47\x54\x3a\x5e\xc6\xec\xcc\x4f\x61\xd4\xb9\xaf\x68\x50\x76\x9b\x4e\x30\xd8\xff\xea\x3c\x8e\x74\xbc\x79\xf9\x84\xdc\x4b\xe5\x68\x09\xe3\x32\x4d\xe5\x50\x77\xe1\x10\x95\x03\xe9\xb4\xdf\xa6\xaf\xfe\x4c\xae\xaf\xa8\x4c\xc7\xca\x81\x0b\x75\x01\xa1\x25\x24\xa0\x82\xe5\x17\xca\x20\x6f\x07\x2c\x1a\xe7\x3a\x01\xc4\x80\x21\xfb\x3b\x7a\x05\x97\xbf\xc0\x8d\x71\xae\x95\x41\xe4\xd2\x73\xa5\x26\xce\x07\xb7\xd4\xa2\xe6\xb6\x83\x8d\x85\x1f\x65\x6c\xfc\x66\x7f\x0d\xe6\xe1\x22\x8a\x22\xa4\x25\x73\xba\x1b\x61\xde\x08\x2a\x14\x5a\xf4\x1e\x06\x37\x24\x82\xba\x23\xda\xa9\x0a\x6f\xf6\x9b\xd5\xe3\xe1\x66\xf5\xb8\x7a\xbe\x5d\xf7\x87\x63\x8b\xd2\x50\x37\x97\xf7\x8f\x6a\x73\x26\x7d\x24\x18\x97\x68\xb4\x3c\x56\x47\x3f\x2a\x31\x2c\x38\xf7\x7c\x05\xe3\x0a\x99\x85\x14\x86\x41\xd6\xa5\xae\xdf\x71\x8b\xda\x5e\xd4\x37\x08\x36\x98\x60\x71\x42\x4c\x6f\x53\xf5\x7c\x83\x4b\x26\x84\x60\xca\x22\x08\xe7\x7b\xde\xad\x09\x23\x22\x97\x70\xdc\xb8\x94\x17\xce\xfb\x98\xef\xab\x1d\xbe\xcf\x22\xae\x9f\x0b\xc1\x52\xc4\x6c\x9c\x3b\x17\x83\xcc\x55\x94\xb9\x88\x13\x22\x17\x44\x44\x17\x3d\x5b\x11\x27\x2a\xf5\xd8\xe9\x1d\x14\x76\xd5\xf4\xc5\x3c\xd5\x24\xa7\xc9\x45\x9c\x25\xdc\x47\xd4\x9e\xe5\x09\x5c\x91\xc3\xc6\x5c\x11\x1d\xcd\xae\x9f\x25\x81\x7e\xec\x19\x7e\x2c\xab\xdb\x70\x91\x50\x63\x6d\x58\x3c\x4f\x50\xb6\x9f\xcb\xfc\xcf\x0b\x94\xd0\x34\x23\x84\x33\x17\x49\x2c\x31\xe4\xfd\x0c\x3f\x76\xd5\xf9\x6d\x89\xdb\x9a\x8b\x24\xd1\x48\xa0\xef\x29\x85\x1e\xe1\x3b\x14\xf3\x2f\x92\x7a\x8d\xbb\x23\x04\x3a\x86\x29\xe3\xd8\xac\xb5\x75\xdf\xef\xcb\xeb\xfa\xc5\x6f\xea\x9f\x56\xbb\xf5\x81\x1c\xd6\xcf\x77\x28\x64\x17\x1e\x30\xe3\x22\x91\x43\xc5\x77\xfe\xbf\x7f\x29\xed\x3c\xbb\x55\xa6\x01\x23\x1a\x2a\x70\xf8\x3f\xe5\x65\x3f\x23\x32\xd0\x98\x62\x28\x64\xd3\xba\xc0\x42\x3e\xee\x1d\x19\x49\xe3\x83\xc9\x9d\x63\xf3\x98\x7b\x94\xfb\x3c\x67\x28\x64\x62\x71\x9b\x6b\x2a\x9d\x0f\x82\x54\xe1\xa0\x25\x5c\xf4\xb8\x7d\x5c\x43\x1e\x31\xcd\x37\x36\xc3\x84\xa2\x52\x39\xda\x65\x3d\x09\x05\x0a\x25\x53\xee\x8a\x7f\xe4\xfb\xea\x87\xac\xcd\x82\x87\x28\x74\xc4\xb0\x7e\x2a\x98\xa0\x9d\x23\xe4\xf5\x33\x36\xe5\x77\x28\x31\x60\xf9\x41\x26\x28\x5c\x42\x46\xf8\x4d\x3e\x97\x43\x7c\xf7\xea\x94\xc9\x5b\x6b\xc5\x31\xa5\xd2\x99\x40\xe3\x6d\x29\x1c\xb6\x91\x76\xe2\x51\x7e\x0c\x06\x4c\xc4\x64\x87\x14\x26\xa5\xc6\xa7\xa7\x7f\xcf\xcb\xa3\xa9\x4e\x5e\xcb\xe6\x75\x1b\x9a\x00\xc9\xb8\x07\x70\xff\x36\x66\x98\x08\x87\x63\x47\xbf\xbb\x6b\x01\x4e\x79\x3b\x10\xed\x70\x01\x29\xc1\x44\xe2\xcd\xea\xf1\xcb\xe6\xb9\x67\x3d\xee\x0e\x58\xe4\x90\xfa\xf4\xe5\xa6\xff\x49\x71\x14\x2c\xfa\x74\x91\xfb\xcb\xf4\x1b\x00\x44\xf8\x0d\x7c\x32\xee\x1e\x60\x54\x35\xd3\xaf\x3a\x96\x11\x4c\x02\xd5\x83\x22\x03\xe9\x8f\xa5\xbd\x02\x08\xd2\x0a\xce\xcb\x30\xb9\xb0\x32\xcd\xc6\x5a\xdd\x8f\x79\xd3\xf6\x1a\x6b\xb3\xa6\x26\x4d\x64\x40\xed\xb6\xb2\xf8\x24\x9b\xb7\x57\xd9\xce\x35\x63\xb8\xb0\x36\xd3\x8e\x67\xa8\x3e\xe5\x65\xe7\x3d\xbd\x55\x75\xdb\x5b\x52\xae\x55\x1c\x45\x8e\xaf\xec\x58\xe7\x1f\x04\x05\xe2\x28\x26\x91\x93\x90\x38\x93\xe9\x3d\xe2\x28\xb1\xee\x33\x3b\x8e\x00\x8c\x6d\xfc\xcf\xac\x49\x46\xec\x20\x5a\xda\x8d\xcd\xc1\x79\x7d\xcc\xe7\x16\x73\x1c\x29\x11\x79\x8f\xf4\x2b\x96\xf2\x37\x73\x97\x34\x8e\x20\xc6\x60\x6a\x79\x39\xdd\xc9\xfa\x5b\x59\x99\xde\xb8\x89\x09\xe5\x18\x4d\xc5\xad\xfb\xae\x8f\x63\x07\x94\x3b\x8f\x89\x10\x6a\xd0\x85\xf9\xdc\x40\x7d\xf3\xbe\x3e\xc9\xbc\x40\x01\x8f\x6b\x56\xe9\x69\x57\x90\x4c\x27\x76\xaa\xc1\xb5\x1a\x13\x5c\x2c\x84\x2b\x62\x9a\xa4\x08\x87\x7c\x78\xf9\xb2\x7e\x7d\x1e\x6d\xba\x31\x63\x11\xfa\xcc\x5f\x64\x99\xb7\xae\x3c\xe1\xf0\x9d\x85\xa3\x3c\x65\x36\x0b\x29\x1f\x7c\x58\xb7\xd1\x7d\x2c\x24\xc1\x63\xae\x1c\xbd\xe8\x0f\xf4\xde\xee\xa5\x06\x55\x55\xdf\xfa\x2b\x5a\x81\xe4\x31\xdf\xab\xb6\x6a\x70\xf0\x0c\x1d\x27\x98\xc5\xf0\xe9\xee\xd3\x66\xfb\x6b\x8f\x3c\x16\x71\x86\xb5\xcc\x5b\xd0\x97\x22\xbf\x4c\xe0\x02\xb1\x90\x12\x83\x14\x8e\xae\xf8\x38\x2d\xcd\xe3\x71\x9c\x50\xa4\x0f\x6f\x2e\x0a\xfb\x5e\xb6\x6d\x01\x2e\x76\x79\xb5\x42\xf5\x5e\x63\x9c\x44\xa9\xe8\xe9\x7e\x19\x9b\x55\x0a\xd0\x69\xa5\x00\x8f\x13\x66\x18\x09\x5e\x2d\x26\x40\x16\x2d\x89\x38\xe1\x91\x53\x29\xbb\x14\xdf\x56\xc6\x3c\xc9\x6f\x8b\xf0\xea\x79\xd8\x32\x4e\x32\xd7\x01\x0f\xdd\x9e\x3a\x46\x1f\xf2\x38\xf5\x10\xa9\xf3\xa5\x6c\xc7\xc2\xe8\x9d\xcf\xe0\xa6\xe3\xa3\x6c\xf3\x1e\xd4\x11\xa7\x56\x23\x25\xa0\xd7\x84\x78\x93\x35\x74\xfe\x04\x94\x8e\x66\x4a\x2f\xac\x00\x71\x16\x11\xe3\xad\x8c\x7b\x99\x17\x7d\x9a\x3b\xce\x22\x85\x9c\xfa\x23\x54\x28\xa2\xf2\xc1\x80\xd9\xdc\xae\xb6\x57\x85\x2b\x53\x4b\x2f\x5c\x25\x71\x4c\x12\xc8\xa3\xf0\x49\x16\xdf\xf3\xf2\xd8\xec\x2e\xaa\xc9\xcd\x9c\x7c\x87\xc7\x59\x9a\x62\xce\x7f\xd8\x02\x46\x6b\x8b\xe2\x19\xda\x0e\xaf\x9b\xdb\x4f\xa8\xc2\xb1\xcc\xd6\x17\x5a\x8b\xd4\xd8\x10\x1e\xef\x61\x80\xd3\x67\x53\x20\x31\x67\xd5\x79\x5e\x58\x29\xe9\x7f\xd7\x69\x42\xa2\x01\xaa\x3b\xac\x85\xb3\xa1\xab\xa5\xc0\x91\x81\xe1\x87\x70\xb2\xf1\x05\x8e\x38\x5c\xfe\x8e\x1d\x16\x1b\x43\x91\xf4\xe4\xe6\x71\x3f\x19\xfc\xc6\xa4\xe0\x88\x6d\xbc\x8c\x70\x38\x00\x4c\xf7\x64\x3a\x75\x95\x9b\x66\x33\x8c\x56\x48\xc0\xe9\xfa\x55\x97\x22\x88\x02\xf6\xc7\x32\x82\xe7\x35\xf9\xb1\xec\xa7\xd2\x5c\xf1\x6b\x98\x27\x90\x31\x27\xbe\x72\x39\x9d\xfe\x01\xe5\xb7\x9e\x46\x9c\xc7\x00\x22\x21\x43\xba\xe2\xbe\x06\xe8\x97\xc7\xd1\x27\x03\x4b\xd1\xdd\xf4\x16\x93\x17\x02\x0c\xfe\x45\x12\x31\xa1\xe4\x50\x3d\xea\xc8\xf8\x43\x80\x7e\x39\x00\x9e\x44\xdc\xb1\x11\x1c\xc7\x5e\x70\xdc\x5f\x31\x13\x8e\x4f\x07\x46\x94\xf7\x3c\x89\x8c\x95\x6e\x10\x56\x8d\xcf\x48\x8c\x31\x17\x49\x64\x35\xc2\x88\x7d\xe2\xd5\xf1\xbb\xbd\xd4\xc7\x45\xda\x9b\xa5\xe1\x96\x10\x0a\xd4\x17\xc2\xfe\x7c\xf7\xd9\xab\x8f\xac\xa4\xd9\x1b\x91\xd4\x39\x5f\x16\xa0\x09\x11\xdb\x84\xa6\xa9\x55\xbf\x28\x9f\x1a\x17\x92\xf0\x84\x1a\x11\x23\x81\x33\xae\x64\xeb\x3f\x89\xaf\x8a\xfd\x9f\x51\x71\x2c\x4f\x18\xe5\x0e\xcd\x82\xc5\xf4\xb3\xb5\x34\xe1\x0c\x30\x3d\xee\x65\x33\x61\x08\x5b\x0f\xf7\xe1\x2a\x49\x1d\x3f\x75\x5d\xfe\xb1\xfd\x85\x90\x04\x4f\x04\x38\x89\x1f\x8c\xa3\xb6\xa3\x61\x9d\xc4\xc0\x91\xbf\xc6\x97\xa5\x14\xc5\xc7\x29\x9d\x24\x55\x31\xa2\x88\xa4\xaa\x6a\xa7\x2d\x1d\x06\x73\x92\xd1\x2c\x82\xde\x12\xb8\xa9\x2e\xa5\x9e\x55\x6f\xf2\x24\x63\x91\x18\x60\x14\xdb\xb7\x0a\xca\xfc\x67\xbf\x4b\x25\x19\x4f\x90\x91\x26\xe0\xc4\xbf\xba\x88\xd3\x6c\x55\x4a\xa4\x70\x84\x20\x07\x67\x76\x07\xb5\xeb\xcd\xd9\x36\x9d\xb9\x04\x9e\xdd\x90\x46\xa1\xbd\x94\xd8\xcf\xc7\xdc\xb3\x0a\x34\x1f\x85\x71\x13\x65\x0d\x06\xe6\x1f\x2e\xb2\x36\x60\x6e\x00\x6a\x5d\xe5\x65\xcf\x2c\xc7\x13\x9d\x59\x8c\xa9\x7a\xde\xd6\x65\x84\xcb\x6c\x44\x19\x91\xa8\xc8\x67\x73\x0e\x4e\x57\xda\x7f\x82\xe5\xa7\x30\x99\xc8\x3c\xd3\xc3\xe7\xdd\xdd\x35\x85\x19\x4f\x8c\x64\x18\x17\x2e\xe1\xc7\xee\x2c\x35\x34\x6f\xf9\xd9\x63\xee\x7c\x74\xdc\x0d\x35\xba\xfc\x67\x7a\x31\x20\x5c\x3a\xf2\xa3\xb6\xce\x21\xf4\xd1\x5f\xbc\x13\x08\xe2\xd2\xc9\x48\x78\xb2\x7f\x83\xa7\x6a\x28\xf3\xe4\x69\x94\x44\x68\xaa\xd8\x22\x3f\xdf\xca\xb3\x4b\x1c\xef\xab\x51\x7a\x2c\x25\x91\x90\x9e\x97\xe1\x46\x96\xdf\xea\x2a\xc0\xd3\x79\x4a\x12\xae\xfb\x6a\xaa\x1d\xb4\xb7\xb2\xc9\xcb\xa9\xaa\x31\x4f\x89\x8e\x78\x30\x95\xff\xd8\x2d\x64\x48\x53\x62\x38\x5a\x60\x8e\x81\x1e\xe5\xba\xbb\x5d\x6f\x53\xde\x5c\x8a\x6f\x33\xb2\x43\x9e\x52\x4a\x5d\x22\xa0\x42\x73\xfa\x9b\xcf\xf9\x11\x3a\xe5\xf2\xe1\x29\x55\x06\xc7\x9f\xfb\x92\x3e\x1a\xff\x24\xcf\xb3\xe7\x63\x69\x8c\xa9\x8d\xbb\xf5\x97\xc3\xf6\xe5\x75\x00\xd6\x77\xa6\x9f\x4e\x3d\x4b\x26\x86\x23\xc6\x1a\x1a\xe3\x88\x66\xca\x09\xc1\x6a\x6c\xf8\xd9\xd6\xd2\xdf\x69\xcc\xbe\xcf\x53\x2e\x15\x7e\x87\x1e\xc3\xb5\x3a\x9f\x8b\x7c\xc9\xb2\x48\xb9\x36\x41\xe2\xa0\x9b\x59\x81\x38\x81\x4c\xb2\x4a\x29\x87\xcc\x69\x22\xb5\xb2\x6e\x43\x5d\x6b\xd8\x22\x52\x41\xe3\xc8\xbb\x74\x2b\xad\xab\x53\x77\x2f\xb8\x59\x86\x01\xa6\xc2\x5a\xed\x20\x07\xae\xe6\x7d\x7f\x17\x8c\xe3\x34\x89\xa4\x08\x4a\x4a\x55\xd9\xbe\x39\x5d\xc9\x6b\xe3\x30\x4d\x22\xc7\x05\x11\xd6\x84\x55\x51\x8c\x37\xe5\x34\x4d\xb4\xd7\x9f\x5b\x97\xed\x28\xc6\x1e\x0e\xdb\x0c\x91\x55\x8f\xd5\x71\xa8\xbc\x9f\x36\x91\x2a\xe2\x30\x6c\x8a\x87\x7e\x9b\xea\x8e\x20\xea\xeb\x69\xfd\xf5\xf0\xba\xde\xad\x5f\xbf\xac\x0f\xf7\x9f\x9f\xef\xc2\x71\x05\xd2\x65\xd8\xe5\x49\x15\x50\x23\xaf\xe9\xb4\xcb\xb5\xc9\x70\x04\x86\xa8\xe4\x0d\x68\x79\x69\xe0\xda\x82\x99\x49\x79\xfd\xcf\xec\x32\xe0\x66\x28\xee\x3e\x68\xb9\xa1\x2d\x79\xc8\x1b\x34\x06\x75\xd5\x33\x6f\xf2\xd4\x30\x40\x23\xea\xfe\x9f\xa3\x1d\x37\x35\x32\xb1\xa3\xea\x84\x91\x09\x16\x1a\x18\x82\x9e\x76\xfb\x96\xd7\xe6\x76\xc4\xb4\xef\x8f\x5b\x0a\x02\xfc\x1a\xf6\x15\xf2\x59\x1f\x5a\x99\x20\xbf\xd9\x7f\x2f\x4d\x4b\x22\x04\x40\xba\x23\x59\x14\xb1\x6c\x30\x81\x5f\xa5\x86\x2b\xc5\xf6\xe9\xf4\xca\x08\x4f\x03\xd3\xf9\x6d\xde\xbe\x6f\x0b\xe9\x81\xf9\xe1\x92\x24\x15\x29\x8c\x33\xc4\x3b\x68\x2f\x67\x4f\x9c\xf0\xb9\x6c\xf3\x61\x07\x23\xf1\xb4\x5e\xac\x3b\xd9\x45\x07\xce\x50\xdb\xaa\x3e\xf9\xe4\xfa\x9c\x4c\x8e\x67\x2c\x32\xb8\xfd\x86\x2f\xf7\x0a\x0d\x22\x3a\x6e\x74\x75\x39\x57\x1f\x6d\xb3\x19\x27\x90\xfa\x87\xef\x8c\xb0\x89\x93\x90\xf1\xd8\x79\x4f\xb7\x55\x0d\xbf\xd0\x4b\x1d\x4f\xc7\x8c\x83\xb6\x0e\x23\x5a\xb6\x55\x23\xff\x08\xd7\x12\x91\xc5\x95\xe1\x15\xbe\x57\xdf\x82\x07\xe4\xbe\xdb\x6c\x80\x67\x22\x4b\x90\x39\xb7\x5b\x00\x9f\xa0\x69\x46\xda\x1b\x13\xa3\x29\x8b\xa3\x04\xd9\x2a\xd1\xb8\xad\xa6\x13\x2d\x8b\x93\x0c\x53\x4a\x0f\x2f\xeb\xfe\x27\xab\x31\x76\xb2\x87\x62\x94\xd6\xcb\x12\xa1\x11\x9e\xf6\x26\x6b\x73\x2b\xcf\xe3\x58\x58\x96\xc6\x56\xa8\xe0\x62\x57\x85\xa9\x7e\x94\x41\x84\xe1\x3f\x24\x8a\xfe\x6f\x68\x96\x25\x91\xec\x0b\x4d\x8a\xea\x1d\x8c\xea\x46\x23\xae\x8d\x4f\xb2\xae\x73\x79\x1c\x06\x44\xc6\x13\x8c\xbd\x77\x06\xd9\xb8\x4c\x18\x5b\x3b\xa0\x5a\x1a\x96\xf9\x2c\xd3\x8e\x65\xb9\x09\x15\x8e\xb3\xde\x92\xda\xc9\x22\x18\x59\xa1\x63\x1e\xc8\x10\x79\xa6\xd2\xd8\x85\x71\x10\x60\xb0\x29\x6f\x7d\x2d\xe6\x60\x60\x67\x5a\x44\x68\x3f\x74\x1f\x42\xc3\x8b\xf5\x16\xcc\x74\x55\xc8\xb4\x26\x38\x19\x0f\x61\x61\xbc\x81\xf6\xc3\x9a\xdc\xd9\xa9\x26\xc2\x1c\xad\x2c\x5a\xf0\xa0\x9e\x2d\x38\x46\x81\x2b\x5c\x42\x66\xac\x45\x5f\xaf\xbc\x9c\x5c\xb9\x71\x01\x66\x86\x36\xcf\x20\x4e\x30\xd9\xd9\x7d\xf1\xdb\xa2\x33\x58\x27\xa2\x18\x5d\x83\x54\xf8\x4f\x71\x7f\x29\xcd\x35\xa4\x3f\x03\x90\x58\x4c\x7e\x92\x4d\x0b\xf5\x4c\x9e\x87\x67\x96\x5a\xef\xd0\x16\xc5\xb5\xea\x29\x97\x51\xe4\xea\xd8\x5d\xd9\xed\xb4\x3c\x88\xcb\x88\x41\xe2\x94\x90\x4a\x5d\x5c\x0c\xa0\xa8\xca\x38\xd0\x2d\xa3\xd8\x79\x87\x9e\xbc\x1f\x03\x74\xcb\xb3\x53\x46\x19\x71\x44\x0f\xd8\x71\x7d\x30\xf4\x53\xde\x2c\x45\x51\xfd\x49\x84\x32\xcc\xaf\x1f\x3b\x9b\x30\x97\x25\xed\x9e\x32\xdc\x9c\xc6\x69\xd8\x0f\xb7\x35\x7c\xae\x73\x32\x7d\x7c\x6a\x32\x8c\xe9\x5f\xab\xf5\x71\xc9\x38\x04\xae\xdd\x9e\xa5\x6b\x99\xcb\x88\x4b\x26\x44\xe2\xa8\x07\xdb\x1a\xce\xb9\xf9\x52\x5d\xf4\x1b\xd4\xbb\xaa\x18\xab\xf2\x73\xc9\x14\xc1\xce\xec\xd3\x60\x5d\x4f\x81\xb9\x2a\xb2\x98\xef\x3b\xfe\xf4\xce\x9f\xf3\x04\xc4\x07\xe5\xca\x0c\x7f\xa5\x88\xc8\x25\x97\x4e\xcf\xf2\x0c\x38\x92\x5d\xf5\xe4\xb9\x5f\x35\xa4\xa0\x8e\xfd\xeb\x93\x6c\x1e\x72\x3b\x85\xef\x4a\xc1\x33\xd2\x53\x0f\x1e\x64\x7f\x4e\x62\xb0\x7a\xe0\xb1\x3a\x6e\x1d\x2b\xd6\xb6\x86\x09\x99\xeb\xdf\xaa\x58\x90\x22\x83\x90\xb8\xc0\x6c\xa8\x13\x24\xf0\x28\x20\xe9\xaa\x6a\xaf\xa0\x64\x52\x68\x43\x3d\xe4\x02\x69\xab\x83\x02\xec\xb4\x55\x2c\x09\xa2\x63\x5f\xd7\xff\xfc\xbc\xde\xed\xd7\x77\x87\xdd\x7e\xb5\xff\xbc\x0b\xef\x90\x64\x5c\x38\xfc\x20\x8a\xa2\x14\x45\xb7\xeb\x19\xcf\x83\x3d\xbd\x54\xa2\x5d\x0e\xd8\x63\xac\x06\xef\x59\xa6\x1e\xce\x5e\x23\x70\xe5\xa3\x41\x9d\x2a\x83\xd5\x59\xeb\x3f\x6e\x3f\xad\x9e\x1f\xd6\x87\xd7\xd5\x7e\xdd\x5f\x42\x4b\xa4\xbc\xb3\x75\x75\xba\x96\xb1\x99\x5d\x49\x46\x80\xd9\x30\xb4\x30\x6e\xd0\xba\x1d\x6f\x01\x52\xd1\xd8\xbb\x78\xce\x51\x08\x05\xd6\x66\x5b\x57\x95\x9d\x96\x44\x48\x95\x45\x2c\x20\xe3\xf6\x8f\x4b\x3a\x0c\x5c\x2a\x19\xe1\xd2\xf0\x94\x97\xb0\xba\xfb\xe0\xfd\x34\x21\x91\x37\x5b\x0f\x18\xf8\x3d\xe4\x2d\x9c\x9a\x43\x5e\x1e\x1a\x2c\xdf\x9a\xde\xd7\x70\x97\xde\xdd\xfd\x90\xe7\xc9\xd3\x03\xa1\xd4\x47\x5c\xb1\xb6\xea\xbe\xaa\x7b\x5c\xc7\x12\x2e\x2d\x9c\x66\x14\x86\x11\x9d\xb6\xb4\xcb\x5f\x78\x92\x8b\x70\x65\x1b\x65\xc8\xda\xf1\x87\x91\x1a\x9b\x0d\x48\x95\xd9\x2b\x2d\x05\x1e\x67\xaf\x6b\x09\xe0\xfe\x84\xfa\x23\xf5\x83\xfc\x0e\xb7\x5f\x6f\x7f\x9d\x5c\x97\x96\x39\x18\xe0\xd3\xfb\x2f\x74\x29\x42\x5b\x93\x20\x8f\x1f\xfa\x56\xf3\xb4\x82\x8a\x04\xc1\x39\xb3\x2a\x9c\x48\xca\xa7\x30\x67\x16\xec\x7b\x15\xa5\x8a\x9b\x3e\xfd\xe5\x71\x00\x55\x3d\x1b\xe0\x2a\x02\x1a\xfb\x45\xe5\x66\x5e\xc4\xa7\x08\x71\x0e\xc5\xcd\xcb\xf3\xe7\x1d\x32\x41\xee\xf6\xab\x87\x75\x70\x38\xba\xe3\x41\x79\x74\x5b\x55\xc5\xaa\x34\xbf\x42\x8a\x2a\x42\x52\xe4\x7f\x75\x32\x5b\x3d\x1e\xf1\x23\xd4\xcc\x78\x39\x52\x04\x88\xed\x23\x85\x16\x6a\x11\xfd\x14\xd1\xec\x95\x29\x77\x00\x2e\x0c\x96\x3c\x5c\xba\x85\x71\x1a\x22\x51\x54\x1b\x0c\x8b\xa2\x34\x66\xf7\xc8\xe1\x4d\xa8\x89\x31\xe5\xe8\x0b\x89\x96\x54\x38\x67\x2f\xc3\x49\x16\xd0\x5f\xab\xa2\xe8\xcc\xb7\x59\x8c\x5b\xf1\x4c\xb3\xae\xf7\xb6\x55\xe7\x87\x1d\x44\xb8\x97\xa0\x11\x7a\x4d\x4d\x37\xdb\x0f\x77\x79\xa3\x47\x9b\x84\x12\x3c\xc6\x02\xab\xce\x42\x75\x41\xbe\x5e\x35\x81\x2b\x91\x24\xc1\x2d\xdf\x98\x55\x5d\xcb\xf7\x4d\x0b\xa7\xab\x1e\xfc\xc5\x10\x53\x09\x8d\x10\x9f\xdf\xfe\xbc\x07\x40\xd6\xd8\x9e\x7a\x86\xab\x24\x49\xb2\x14\xb9\x52\x9d\xea\xee\xfb\xdc\x11\x57\x49\x2a\x1d\xe1\x5b\x51\x95\x70\x05\x29\x1d\x97\x87\x7f\xcc\xd2\x34\x7f\xa2\x0c\x10\x38\x73\xf0\x35\xd0\x21\x99\x1a\x18\x7c\x3f\x38\x4b\xc7\x28\xaf\x71\xf7\x10\x5c\x3e\x95\x46\x3c\xa2\x5e\x8a\x5b\xb6\x70\x07\x4d\x5b\x5f\x06\x9d\x26\xae\x52\xa1\x89\xea\xc3\x60\x58\x2f\xe1\x2a\x95\xc2\xf1\xc4\x55\x97\x3a\x82\x0d\x47\x68\x3b\x3a\x0a\x99\xec\xcb\x84\xcf\x55\xee\x53\xf2\xe1\x70\x46\x9d\x82\x52\x51\x7d\x87\x60\xc9\x87\x43\x8c\x05\x0a\xe0\xaf\x90\x6f\xa1\xde\xc9\xb6\x6a\xde\xfa\x6e\x97\x42\x47\x59\xd8\x65\xfa\x8f\x2d\x2d\x48\x8f\x11\xf7\xd7\xeb\x27\x9e\xe2\x06\x49\x7a\xbe\xca\xef\xd0\xf4\x70\xe1\xd9\xe7\x9f\xf6\x97\x92\x3c\x80\xa1\xfb\x21\xf7\x17\xdf\xe7\xea\x0a\xa9\x1c\xc8\x42\xbd\xad\x1a\xea\x83\x43\x1b\xa0\x44\x4f\x7c\xea\x12\x6c\xae\x73\x39\x23\xdc\xe1\x4a\x33\x40\xdf\x09\x4a\x73\x53\xd5\x75\xf5\x63\x75\xac\x01\x16\xf8\xd3\x97\x1f\xc6\x44\x3a\x30\xc9\xf9\xaa\xbf\x60\x0b\x8d\x42\x34\xca\x30\x2f\x16\xaf\x35\x9c\xdb\x17\x6b\x67\x16\xac\x32\xa9\xe3\xcc\x3c\xc9\xc6\x13\x78\xc9\xe2\xb7\x71\x26\x71\x76\x5b\x10\x24\xce\x86\x5c\x73\x67\xa5\xae\x50\xd2\xab\xfb\x57\xff\x79\x20\x49\x32\x57\x96\xb8\x75\xd5\xf1\xa3\xc4\x82\x02\xc5\x10\x3d\xeb\x90\xf7\x5b\x59\xcb\x53\xd3\x1f\xb3\x3a\xf1\x74\xca\xdf\xf2\xf2\xf8\x62\xe7\x5b\x80\x35\xb1\x89\x42\x1d\xd7\x6c\x2d\xd7\x11\xb1\xb8\x74\x8c\x04\x40\x57\xaa\x9a\xe3\x85\x75\x24\x19\xa6\xb1\x71\x83\x76\x7d\x0f\xf5\x1d\x58\x79\x29\xe6\xa2\x5a\x5c\x47\x4a\x63\xbe\x05\xdd\xce\x9b\x00\xe6\x98\x3e\x95\x8e\xac\xc5\xd5\xb3\x73\xda\x2f\x85\x9c\x5d\x82\x08\x11\x67\x13\xf5\xce\x97\x4b\x7b\xbe\xb4\x3b\xa3\x9b\x62\x8c\x49\xd0\x24\xb6\xe8\x0c\x07\x3a\x5a\xe9\x00\x49\x2e\x20\xd2\x0f\x32\x4d\x59\x26\x9d\xd0\xa9\x3c\x9f\xc1\x4c\x19\x5b\x42\x1b\x91\xa1\xa5\x81\xa1\xb7\x43\xe0\x42\xeb\xaf\x90\x51\x84\xfe\x39\x7c\xe4\x66\xff\xd2\x1f\x30\x14\xe3\x1b\x6f\xa8\x8c\xfb\x0a\xd7\xb1\xa0\xc5\x71\xa1\x19\xd3\x81\x29\x7b\x87\xd4\xe6\xeb\xd2\xb3\x13\xcf\xc3\xc3\x9a\x09\x82\xfa\x04\xf8\x09\x77\xd0\xde\x03\x7c\x6e\xcc\x5d\x1e\xf0\x6e\xf3\xe6\x40\xd1\x49\x79\x7e\x79\x5e\x87\x72\x31\xcd\x09\xf1\x45\x66\x0e\xf2\x00\xbe\x72\xbc\xe9\x1b\x70\x88\xb2\x5e\x9b\xc0\xbd\xfc\x00\x49\xd3\x3c\x15\x61\xf3\x7a\xea\x16\x3a\x59\x3c\xe6\x4d\x3b\x88\x4c\x70\x2d\xd2\xd4\x04\x39\x92\xba\x3a\x55\x0f\x50\x46\xb3\x27\x13\x96\x84\x62\x80\xe2\xa9\x32\xb9\xcd\xc1\x5c\xad\x45\xd3\x53\x62\x11\xe3\x7c\x3c\x1c\x03\xc6\xc0\x85\x84\x96\x3b\x35\xa1\x80\xd6\xd0\x01\x6b\xc9\xeb\xee\x01\x47\xf5\xb4\xf3\xfc\x87\x4e\xb8\xcb\xf6\x37\xd0\x7e\x82\xfc\xa3\x47\x48\x12\xc7\x36\xfe\xb4\x79\xde\x6f\x9e\x1f\x0e\x8f\x9b\xa7\x4d\x40\xf4\xea\x24\x75\x5a\x56\x28\x3e\xf2\x0a\x4d\x55\x7c\x87\xd5\x9f\x17\x59\xe7\x97\xd3\x1c\x0c\xa1\x13\x65\x30\x6b\xea\x88\x4b\x1c\x67\x62\xb8\x50\x9a\xa6\x26\xf0\x41\x03\xf8\x49\x3e\x0a\xe8\x5e\xbf\x6c\x0a\xc2\xf2\x21\x4b\xf8\x49\x96\xc7\xbc\x3c\xce\x38\xf4\xb9\xce\x22\x86\x21\xb2\x3f\x2f\xb9\xfe\x76\xeb\x64\xeb\xbd\x7e\xc2\x38\x7c\x7a\x6d\xc1\x2e\xfe\x5d\x96\x94\xe6\x3a\x53\x29\x7a\x50\x98\x03\x5c\xcb\xba\x78\x9f\x7d\xfb\x0c\x00\xd7\xa1\xaa\x2c\xde\x9d\xce\x88\x3f\x20\x85\x13\x37\x79\x42\x40\xbb\x9b\x9a\x57\x83\x62\xf9\xcb\x48\xc1\xd0\xf8\x70\x94\xc0\xf7\x97\xa2\xf0\x72\xa2\x08\x3d\x5a\x32\xd2\xff\x8e\xf0\xee\xec\x1e\x31\x44\xde\x62\xbd\x29\x40\xea\xb7\xa5\x19\x2a\x53\xd7\x08\xf5\xc1\x1c\xe0\x95\x2e\x67\x58\xb5\x54\x06\x9d\xa4\xff\x56\x79\xe9\x1c\xad\xe9\xa5\x94\x8c\xd0\x24\x39\xd8\xaa\x1e\x77\xc5\x7d\x5d\x9d\x7a\x0a\x2d\x64\x1c\xfc\xb5\x15\x3c\xbb\xad\x52\x19\xba\x95\xef\x10\x1c\x73\xad\x4c\x16\x94\xf6\x5e\xbd\x20\x09\x98\xe9\xa2\xa0\x8c\x42\x6c\xf9\xba\x39\x8f\xc2\xcf\x5a\x33\x8d\x68\x97\xfb\x97\xcf\xcf\x77\xeb\xd7\x9d\xe3\x1b\xda\xae\x5f\x37\x2f\xc1\xb4\xd2\x26\x89\xb0\x54\xf7\x5e\x7e\x83\x6b\x3d\x01\xae\x8d\xb1\x38\x55\x7f\x04\x08\xd5\x53\x5e\x4e\xe2\xab\x1a\xa8\x8d\x09\x96\x03\x9f\xcf\xdd\xc0\xae\xca\x0f\x7c\x66\x0d\x3c\x42\x7c\x1b\x3a\x41\x07\x3b\xac\x5a\x96\x50\x8c\x65\x35\x4e\xe3\x63\xc4\xc2\xa2\x2d\xc9\x90\x84\x68\xbf\x59\xbf\x92\x03\x42\x73\xfb\x43\xc2\x91\x5a\x3c\xde\xac\xfa\x9f\xe2\x2c\x90\xfd\x07\x29\x63\x28\x66\xf8\x41\x6d\x55\x4f\xb0\x74\x9f\x97\x25\xbc\xa3\xdd\x56\xc0\x53\x55\xc3\xfe\x4d\xf6\xdd\x67\xad\x41\xb3\xa8\x79\x2f\xa1\x6e\x6b\x98\x20\x8c\x4d\xc4\x00\x89\xa1\xf7\x75\xfe\x3d\x14\x8a\xfd\xda\xc0\xb9\x02\x56\xfe\x72\xe7\x31\x11\x07\xf4\xd1\xee\xab\xaa\xfa\xdf\x6b\xdf\x76\xf2\x4e\x26\x8a\x63\xe3\xa5\xc6\x06\xd8\xc8\x1c\xc5\x6a\xa2\x44\x22\x27\x49\x01\xb6\xa5\xe9\x6f\xb3\xfb\x59\x82\x38\x84\x53\x65\x1c\x7b\xea\xcc\xed\x31\x24\xca\xa8\x43\x62\xb4\x4d\x5b\x83\xfc\x36\xe9\x0f\xc2\x23\x4c\xb7\xea\xea\x74\xba\x94\x79\xfb\x3e\xf2\xc2\x0c\x8d\x9c\xbf\x69\xe0\x7b\xb7\xa5\x6d\x6b\xd0\x83\x75\x6e\x28\xd3\x08\xf1\x7d\x92\x9d\x53\x54\x39\x46\xd3\x3e\xb7\x62\xe8\xc0\xab\xbf\xad\xe1\x94\x5f\x7a\xb3\xca\x50\x23\xd0\x71\x3e\x78\xcc\x02\xbe\x12\x8f\x66\x9d\xc3\x22\x86\x2c\x2f\xb2\x69\xf2\x63\xe9\x93\x0f\x77\xf2\xfd\xd7\xaa\x50\xdc\x30\x26\x99\x47\xc0\xf4\x5c\x91\x4b\x92\x6d\xdc\xb0\xd8\x3a\x36\xac\xce\x3e\x73\xa8\x37\x47\xd3\x17\x1e\x94\x19\x1b\x7b\x6e\x8e\xdd\x93\xc7\x0c\xb8\x69\xb4\x85\x7a\xdd\x59\x42\x2d\xd4\xa5\x2c\x66\xdf\x84\x27\xae\x98\x31\x28\x11\x0d\x56\x77\x0e\x73\x69\x6a\x6e\x38\x38\xf2\x57\x03\x36\x2f\xc1\xd3\x51\x2f\x2b\xd6\xf9\x33\x84\x49\x31\xec\xe1\xeb\xee\x50\x95\x25\x98\xdb\x8b\xeb\xa2\x89\x93\x34\x00\x7b\x30\x70\xfd\xc1\x85\x63\x4d\x91\x7a\xf1\x70\x92\x79\xd9\x1e\x9c\xdd\xb7\xb0\xbe\x98\x84\x12\x1c\x19\x25\xfc\xec\xd5\x91\xbe\xca\x23\xd4\xcd\xbe\xc2\xdc\x61\x28\x1c\x0f\xed\x85\x0b\x2f\x7a\x30\x83\xcf\xbe\xfb\x83\xa9\xce\xd2\x20\x2c\x38\x72\x9f\xfd\xd1\xcc\x50\x10\x81\x15\x1a\x55\x25\x3f\x9f\xb1\x7a\xf4\xd7\xf3\x50\x6a\x97\x3c\xf1\x49\x3c\xc4\x92\x7e\x6e\xa0\x46\xa0\xa5\x6f\xa3\x3c\x0f\xe8\x9b\x6c\xba\x43\x5b\xa8\x3d\x2d\xe2\x34\x2b\xc2\x43\xf3\x54\x87\xe0\xe3\x43\x21\x4d\xde\xcd\xb6\x6d\x67\xac\xcf\x9e\x58\x49\x86\x53\x32\x50\x78\x2e\x3f\xa0\x52\x02\x03\x61\x5e\xbc\x6e\xe2\x07\x19\x6d\x44\xea\x68\xae\xeb\xf3\x28\x5d\x64\xb4\x75\x01\x93\xef\x50\x9a\xaa\x9e\x64\xb7\x0d\x64\x5a\xf7\x11\xe2\x07\xaf\xc9\x66\xfa\xa3\x32\x45\x44\x5c\x55\xba\xf4\xc6\x15\x02\x6e\xfa\x0e\xa0\x22\xa9\x07\x18\xd9\x6a\x56\xc1\x3e\x7b\x17\x9b\xc5\x18\xf7\xcb\x1b\x44\xde\xe4\xe5\x11\x55\x27\xff\xe2\x13\x59\x69\xd0\x97\x39\x40\x10\x62\x7e\xac\xfa\x40\x21\x44\x94\xc7\xde\x64\x7b\xca\x4b\x24\xf6\x19\x99\x2c\xe3\x0b\x01\x56\x4f\xf7\xee\xc3\xd3\x12\xae\x18\x98\x95\x98\xaf\x43\x74\xc0\x41\x55\xe5\xa5\x39\xc8\xf1\x8e\x08\x5c\x26\x14\xcb\x28\xa5\x05\xb4\xb1\xc3\x01\xe1\x41\x4e\x8f\xd5\x71\x63\x00\x33\xe7\x81\x55\xf9\x6f\x81\xef\x21\x8e\x38\x56\xf4\xad\xff\xd8\x3e\xbe\x60\x19\xd9\xdd\xfa\xf9\xe5\x69\xf3\xbc\xda\xbf\x04\x28\x36\xc4\x32\x45\xb0\x8c\xa9\x50\xb2\xd5\x97\xbb\x4f\xec\x40\x48\xa3\x0c\x2b\x27\x35\xf2\xfa\x7f\x1d\xd2\xfc\xe1\x22\x69\x9a\xa0\x44\x6b\x3b\x66\xc3\xbc\x74\xab\x54\x68\x91\x45\x1c\x5b\x3c\x56\xc7\x9b\xdc\xf4\x51\xe9\x29\xa2\x62\x6e\x80\x82\x94\x1c\xad\xf4\x80\x2c\x58\x64\x5e\x9c\x44\x08\x41\x25\x02\x23\x53\x6e\xf9\x7e\xad\x06\x84\x2d\xa8\x24\x96\x83\x94\x4e\xb7\xb5\x2c\xa2\x52\x41\x49\xa7\x12\xed\x45\x4e\x40\x9e\xa6\x0a\x54\x7d\x33\xe1\xa8\x47\xac\xcd\x8b\x5c\x3a\x83\x27\xdc\xcb\x48\x86\xd1\xbd\xdb\x97\x7f\x07\x13\x04\x40\x46\xe8\x1f\x6f\x7a\x78\x02\x58\x69\xd3\x90\x8c\x3c\x82\xf1\xaa\xdf\x23\xb2\xc1\xe5\x1d\xdc\x46\xd6\x22\x4e\xe4\xfe\xf3\xb3\x27\xb3\xe6\x9d\x1b\x86\x23\xb7\x42\x62\xcf\x5e\xb2\x97\x5b\x62\xb4\xd4\x41\x01\x12\xa0\x33\xfa\x66\x31\x03\x4b\x7d\x5d\x0b\x8a\x40\x20\xb3\xeb\xac\x01\x8b\x81\x24\x03\x55\x75\xe9\x08\x8b\xc2\x1d\x98\xe5\x88\x30\x3c\xa3\xd8\xcb\x0c\x26\x67\x05\xd5\xc8\x82\x70\x53\x54\xc7\xd1\xaa\x62\xe3\x28\x0d\x0b\xf0\x3f\x2a\xe5\x44\x23\x66\xb7\x8d\xbb\xcd\xc1\x95\x9f\x0e\xf4\xd9\x87\xaf\xeb\xf5\xef\xa4\xbf\x4a\x2a\x10\xa8\x88\xa1\x89\xcb\x49\xf5\x21\x16\x1b\x6b\x47\xeb\x76\x84\x76\xbd\xff\x14\x7e\x4d\x28\x20\x94\x79\xdd\xf9\x9d\xbb\x56\x96\xa6\x33\xc8\x97\x52\xfd\x97\xab\x12\x32\x9b\x24\x2c\x88\x0a\x78\x30\xc3\x12\xd7\x81\x4d\x92\x14\xf7\x9d\x87\xd7\xd5\xed\x9b\xcc\x3f\x02\x11\x4c\x2f\x9d\xc5\x18\x8c\xf0\x40\x64\xac\xf3\x2e\x8d\x4f\x96\x8e\x9e\x3f\x8d\xa2\x40\x44\x84\x44\x0f\x4d\x7e\xfc\x22\x2f\xc5\x2c\xf0\x6f\xd3\x8c\x8c\x4b\x77\x5c\xc5\xbd\x47\x93\xf6\x97\x52\x9c\xf2\x00\xc6\xdd\xdc\xf5\x3f\x5b\x12\xbb\xe8\x47\x83\x9f\x79\xb9\xd6\xca\x66\x99\x27\x16\xc5\x07\xf6\xd2\xbe\x0d\x98\xe5\x4c\x84\xcd\x80\xe1\xce\x78\xac\x07\x8a\x41\x2b\x23\x85\x18\xb4\x67\x28\x65\xe3\xba\x2a\x1c\xa1\x09\x02\x17\x9e\xf2\xa3\x8b\x5b\x6c\x4a\x5b\xed\x60\xba\x61\x59\xa5\x29\x55\xfd\x06\xff\x09\xea\x2b\xe2\x5d\xdf\x50\xd3\x94\x78\x48\x81\x7f\xd2\x2b\x94\x91\xd5\x89\x72\x89\x95\x46\x2f\x14\x62\x59\xad\x32\x81\xcb\x87\xca\x65\x2b\xeb\xce\x23\x9c\xec\x84\xd6\x44\x9a\x20\xb5\x15\x48\x53\xe4\x25\xb8\x32\xfc\xfe\x28\xe5\x76\x28\xa0\x1c\xf1\x8f\xcc\xd4\xd4\xb8\x35\x46\x25\x64\xb0\x7f\xa7\xb5\xe4\xd6\x80\xd6\x81\x4a\xa1\xdb\x2e\xae\x51\x64\x16\xac\x0e\x92\xaf\x87\xb7\xf9\xd5\xad\x00\xc9\xc6\x33\xd9\x5c\x35\xb0\x59\xe6\x11\xf4\x73\xa6\x31\x6b\xd3\x4c\x07\x05\x93\xaa\x6c\x25\x12\x08\x5e\xf3\x9b\x59\xab\xa4\xd5\x01\xa2\xb6\x6e\xdf\x1e\x42\x37\x89\x28\xf2\xb4\xf5\x5a\x16\xda\xe7\x3b\x17\x6d\x15\x11\x45\x8c\x21\x0f\x4b\x58\xfe\xd7\x4f\x2f\xa1\xf2\x5c\x44\x91\xa6\x0e\x9e\x16\x98\xd8\xb6\x35\x84\x63\x44\x59\x2c\x50\x09\xf1\xe7\x7b\xdc\xd4\x7e\x15\x77\x10\x11\x8d\x74\xef\x92\xc8\xd2\xec\xab\xea\xdb\xea\x47\x08\xc3\x8b\x88\x66\x11\xee\x93\x2d\xd2\xd5\xc3\x39\xfc\xce\x62\x3b\x0a\x87\x1f\x02\x37\xe4\xdf\x0a\x18\x8a\x88\xf3\x18\x81\xbd\xe7\xea\xdb\x34\x49\x2a\x22\x2e\x04\xe6\x19\x3e\xbd\xec\x6f\x57\xbb\x4f\xbf\xf5\x3f\x6b\xc7\x14\x09\x65\x3e\xf6\x31\x45\xc4\xb5\x63\xff\x3b\xcb\xf7\xce\x04\x1e\xcd\x13\x11\x71\x93\xda\xa1\x24\x78\xe7\xe9\x9c\xfa\x33\x81\xa3\x14\x0e\x5a\x51\xeb\xd2\x7c\xa0\x67\x20\xa2\x98\x26\xb8\xb9\x7a\xb6\xe1\x51\xd2\x48\x44\x71\xa2\xf1\xb3\x9e\x0f\x41\x27\x70\xb1\x7e\x4a\x44\x49\xc4\xa3\x10\xb3\x7f\x3f\xa9\xe0\xf7\x89\x28\xa1\x89\xb5\x21\x98\xaf\xab\x32\xe0\x1a\x26\x13\x40\x44\x69\x62\x93\x81\x6a\xf5\x06\xda\x29\x9f\xd2\xf4\x66\x19\x03\x1c\x09\xfe\x89\xfd\xa2\x3d\x7a\xec\x4c\x73\x4f\x60\x1b\x7e\x91\x22\x46\x63\xf7\x98\x7f\x07\xc4\x91\x5c\x41\xbe\x44\x24\x63\x8e\x18\x32\xd9\x5d\xcf\xa5\x81\x27\xab\x85\x88\xa4\xb4\xc8\xf2\x7e\xf3\xe9\xe6\x2f\x21\x64\x22\x92\x86\xe2\x26\xe6\x82\x1d\x61\xd8\x3a\xc5\xf8\x31\x0e\xcf\x37\x57\x82\x9a\x21\x83\x15\xf8\x1b\xeb\xea\xe4\x45\x40\xfa\x12\xb6\xf9\x79\x71\x9a\x3a\xa7\xa6\x94\x75\x75\x07\xdf\xc3\x0e\x12\xde\x5d\x25\x12\x03\x55\x55\xb9\x7e\xbd\x4d\x28\xf9\x4b\x4e\x83\x21\xcd\x22\x22\xa5\x39\x72\xc4\x77\x0e\xfd\xd3\x7b\xfb\xf6\x80\xda\x60\xe1\xd2\x9a\x41\xea\xb7\xce\x8d\xf9\x89\x59\xcb\xd9\xc0\x30\x31\x4d\x92\xde\xf4\xbe\x41\x46\x94\xdd\x39\x9f\x8f\x1f\x93\x90\xd8\x95\x4a\x7a\x60\x33\xfa\xc7\x2f\xf6\xa5\x44\x4f\x6b\xf6\xca\xa0\xb8\xc9\xa6\x31\xf2\x31\x78\x4a\x44\x96\x38\xab\xb0\x69\xab\xf3\x19\xcc\xd6\x31\x54\xfa\xa7\x26\x91\x96\x09\xca\x71\xae\xfe\x38\x0c\x2a\x1e\x43\x8d\xac\x20\x84\xb8\x50\xc6\x28\x17\x04\x26\x0c\xd9\xc9\x93\x13\xaa\x9d\x1a\xc3\xe1\x5c\x83\xaf\x1d\xf6\x30\xcf\xe5\xf9\x46\x58\x6c\xb1\xfa\xe4\xf6\x2d\x47\xea\xa2\x30\x46\x09\xcb\x2c\x06\xf6\xd7\x3f\xe5\xc3\xcd\x36\xfc\xca\x29\xa0\x38\x56\xf3\x76\x69\xef\xaa\x1f\x65\xe0\x64\x9d\x5e\x94\x33\x83\x76\xa2\xba\xbc\xbf\xfc\xec\x4f\x8d\x09\x62\x29\xbf\xbb\xaa\xb1\xbb\x49\xa6\x44\x10\x9e\xc6\x3c\x9b\xaa\x5f\x61\xaf\x8f\x80\x4d\x82\x70\xe5\x0a\xac\x5e\x7f\xbf\x1d\x2f\x4c\x84\x2b\x8d\x51\x00\x47\x4a\x7f\x5f\xd5\x7d\xbd\xca\xf2\x5b\x73\x90\x81\xc2\xfa\xb1\x6a\x1a\x68\x10\x49\x3b\xfd\xae\x44\x70\x89\x8b\x45\x9f\xb5\x11\x44\xa4\x12\x51\x66\xa5\x8f\x0c\x84\x42\x82\xd5\x77\x99\x17\x54\x9c\xdd\x5e\x33\xcd\xb4\x0b\x22\x94\x46\x13\xe2\x4d\x36\x88\x70\x36\xe1\x40\x9c\x52\x8c\x7e\x7f\x5a\xed\x3e\x21\x60\xe7\xf0\xf4\xf9\x71\xbf\xd9\x3e\x6e\x42\x21\xab\x20\xb1\x52\xda\x27\x1b\xba\x91\x75\x6d\x88\x09\x12\x1b\x85\x9f\x4a\x3a\x80\xd1\x0c\x7a\xd1\x1d\x07\xd4\x5d\x77\xbc\xa4\xf9\x71\xb2\xe1\x0a\x92\x18\x12\x25\x3d\x15\x42\x55\xa3\x68\xb6\x17\xf2\x0c\x6d\x52\xe6\x2a\x69\xda\x1f\x88\x83\xba\xa9\xda\xd9\x45\x32\xa2\x31\xa6\xfe\x96\x2b\xa8\xcb\x39\x9f\xb2\x20\x19\x97\x99\xf5\xc6\xe2\x5f\xaf\x56\x44\x45\x0a\x02\x6a\xeb\x5c\x95\x4d\x85\x6b\x54\xbf\x4e\x2f\x7f\x55\x45\x19\xa7\x81\xeb\xcc\x31\x62\xde\xca\xa2\x50\x52\x7f\xeb\x53\x52\x82\x28\x4d\xe2\x24\x88\x70\xf6\x5b\x03\x51\x5a\x7b\xba\xdf\xa6\xe9\x35\xab\xe6\x09\x85\x99\xf0\x84\x20\x3a\x72\x55\x00\x3a\xc4\x43\x47\x25\x61\x82\x68\xe6\x48\xa2\x9b\xb6\xaa\x67\x36\x6e\x68\x11\x13\x15\xf7\x45\x1e\x13\x60\xe4\xf4\x46\x26\x71\xb0\x7d\x5b\x5c\x9a\xb7\x59\xb2\x46\x10\xa0\x32\x92\x21\xde\x77\x38\xb7\xfa\x50\x5e\x4e\xb3\x51\x02\xa0\x70\xd3\x09\x4b\xbf\x9f\x65\xb3\x56\x56\xc6\x0a\x7c\xb5\xc4\xb1\x5b\x3c\x9a\x3b\x70\x7e\xb4\x6b\x40\x69\xac\xc2\xd4\xf1\x85\x97\xb3\x8f\x12\xda\x59\x82\x53\xe5\x5c\x43\x0d\xc7\xef\x79\x31\xa3\x14\x10\x94\xa7\x0c\x41\x10\xea\xf2\xee\xeb\x61\xc2\x3d\x44\xca\x8c\x77\xab\x56\xad\x2f\xef\x6d\xfa\x83\x99\x93\xc0\xf9\xba\x7a\x7c\x5c\xef\x0f\xab\xc7\xc7\x97\xdb\x91\x60\x81\xa0\x42\x71\x2b\xbc\xba\x8f\x5b\x2b\xff\x86\xe6\xbe\xa0\xc2\xc4\x69\x90\x1f\xb8\x36\xce\x05\x15\xd6\x19\x05\x7e\x22\x2e\x90\x27\x09\x1a\x33\x37\xd3\xbe\x7c\xfa\x1a\x9e\x26\x89\x3c\xef\x7e\x5f\xa8\x3c\xdf\xe9\xae\x2a\xac\x04\x4d\x08\xc3\x5a\xfd\xe6\x72\x5a\x21\xa2\x00\xcc\x97\xbc\x6e\x2f\xbd\x9c\x7d\x7f\x75\xce\xb1\xb0\xf0\xa6\x72\xd2\xfd\x3d\x30\x37\x6c\x3e\x34\x31\x4e\x95\xd8\xc9\xdd\x7e\xaa\x7e\x3c\x5d\xf4\xdb\x53\x55\x77\x0e\xdf\x33\x96\x8d\x4e\x47\x1a\x4d\x69\x0c\x99\x57\x49\xae\x2e\xad\xec\xdd\x5d\x41\x53\x21\xd1\xb0\x47\x65\x80\x11\x8a\xeb\x7f\xa6\xbd\x90\x5a\xce\x3c\xc3\xfa\xf6\xe5\xe5\xd1\x95\x03\x92\x28\x5c\x25\xcb\x98\xf4\x92\x1b\xbd\x23\x77\x25\xf7\x20\x68\x26\x63\x16\xf4\x48\xab\xa2\x90\x2d\xd4\x3d\x47\x5f\xb8\x94\x64\x36\x70\x21\x8f\x97\x89\xe5\xf5\x81\x4a\x9b\x62\xfe\xc9\x81\x34\x06\x05\xd4\x7e\x96\xf7\xed\x24\xc2\x1b\xa4\xc9\x75\x5e\x95\xb2\x5e\x35\x4d\x8e\xe4\xdb\x72\x41\xaf\x4b\x50\x15\x3b\xb0\xf8\x9b\x6c\xee\x9e\x9f\x67\x43\x42\xdb\xcc\xa8\x01\xd8\xe9\x08\x6d\x7e\x65\xb1\x53\x48\xb9\x4c\xfa\xcd\x6c\x54\xe0\x1e\x9e\xcf\x2a\x82\xac\x84\xbb\xfc\x74\x2e\xe0\x29\xff\x39\x3c\xba\x55\xc2\x0e\x82\x74\x87\xf1\x36\xc4\x22\x96\x24\x03\xe8\xc1\xa9\x9d\x2c\xa9\x96\xf7\x4f\xc2\x48\x94\xc4\xfe\x43\xae\x8e\x55\x39\x58\x54\x53\x99\x44\xc1\x08\x55\x22\xea\x9f\x08\x67\xcf\xaf\xd4\xba\x04\x23\x82\x5b\x13\x56\x91\xce\x1f\x82\x72\xae\x00\x2b\x18\xd1\x14\x57\x6a\x9b\x9f\x9b\x90\x6a\x44\x73\xf2\x8a\xaf\x70\x34\x6e\x18\x31\x0e\x69\x0e\xed\x5b\x5b\x35\x7d\x11\x8a\x60\x34\x75\x1c\x07\x67\x04\xfc\x0f\xb2\x78\x82\x31\x2e\x70\x8e\x6a\x2f\xf4\xb4\x50\x7c\xff\x41\x0f\x31\xae\x82\x41\xf9\xe0\x58\x98\xea\x16\xea\xb0\x3e\x5f\x63\x6d\xfb\xd3\x2c\x7e\xe2\xdd\xcb\xed\xfe\x4a\x15\x44\x30\x16\xdb\x34\xea\x31\x11\x95\x9d\x78\x5a\x8c\xa5\x09\xc6\x54\x4e\x60\x72\xb9\x40\x08\x29\x18\x53\xd2\x05\xa0\x9e\x6e\x26\x76\x12\xe3\x24\x45\x67\xb0\xb7\xff\x97\xab\x61\x27\xc3\x9b\xf1\x84\xa5\x51\xe0\xf1\x42\x87\x6c\xe9\x99\xb9\x22\x56\x8f\xc5\x30\x83\x38\xbf\x6c\xe5\xec\xf1\xb8\x62\x99\xdf\xa7\x9f\x2f\x27\x5c\xa2\xeb\xf9\x2b\x70\x48\x07\x99\xb4\xd9\x58\x5a\x2e\xdc\x9f\x2f\xa2\x4c\xa4\x29\xba\x8b\x65\xd5\xca\x3a\xff\x5f\x40\xa1\xae\x89\x07\xcc\xe2\x24\x41\x90\xb9\xc1\xf2\x92\x97\x6e\xef\xfe\x60\xdc\xce\xbe\x7b\x2c\x63\x0c\xc4\xac\xcf\x6f\x30\x55\xba\x10\x2c\xd6\x12\xe9\x27\x7c\xee\x73\x42\x1e\x11\x9a\x58\x08\xda\x05\x07\x28\xcd\xa1\xed\x33\xcc\x82\x25\x91\xc8\xd2\x89\x82\xeb\x53\x65\x86\xa3\x2c\xc1\xcd\xed\xe5\xeb\xf3\x61\x58\x1a\x9c\x60\x77\x77\xa3\x83\x9b\x20\xd7\xe8\x8c\x1e\xcc\xdc\x5d\x03\x98\x73\x6f\x1b\x2c\xb6\xb8\xae\xb8\x13\x2c\x89\x13\xc4\xd7\xfd\xd9\x1a\xd8\x56\xdf\xe0\x54\x95\x8d\xcf\xa8\xcf\xde\x25\xa5\x02\xb3\xe8\x8f\xd5\xd1\x7f\xf2\xb9\x4b\xe7\x1b\x66\x84\x21\x0d\xc9\xe6\xf6\xe5\xf0\xd8\x07\x8f\x05\xcb\x52\x89\x29\x75\x5d\x9d\xba\xa9\xf9\x7c\x39\x41\x9d\x6b\xc7\xe8\xd4\x2c\x2d\xb8\x4c\x12\xcb\x02\xa9\xc3\xc7\x26\x5a\x3f\x10\x64\xac\x30\x43\x82\x85\x73\xdd\x8a\x80\xc1\x9a\x7d\x35\x8d\x22\x0b\x26\x13\x87\xb4\x55\x97\x77\x14\x5f\x59\x9a\x5a\x52\xba\x45\x14\x8d\x65\x17\xf2\x1c\x69\x5f\x09\xa6\x22\x13\xf8\xe0\x6e\x0a\xa9\xbf\x15\xf9\x98\x23\x79\xe8\x5f\xc5\x08\x2e\x80\x4d\x7e\x2c\x7f\xbd\x08\x6b\xed\x38\x77\x3b\xef\x21\x58\x99\x6e\x9d\xe9\x57\x36\xc3\x44\x42\xfb\x12\xd7\xad\xfc\x31\x9f\x9c\x06\x1c\x7c\x3d\x20\x2f\xc2\x89\x10\xc7\xc8\x8c\xa9\x2e\xef\xbf\x8e\x5d\x31\x88\x4d\x12\xf5\x2c\xa2\xdd\xaa\xe6\x34\xc2\xbe\xbe\x41\x89\xac\x45\x73\x3b\x82\x59\x69\x31\x3f\xe1\xef\x79\x70\xf6\x5a\xb8\xb3\x55\x2a\x0d\xbc\xff\xab\xed\x52\x96\x44\x30\x0b\x22\xa0\x27\x46\x01\x88\x5d\x7e\x9c\xa4\xf8\x96\xa1\x45\xdd\xd9\x31\xd6\x31\xb8\x92\x8c\x83\x27\x45\xf3\xf7\xe7\x51\x9a\x30\xb7\xc7\x3b\x4e\x90\x5f\x13\xa2\x8d\xbe\x1c\x8f\x32\x8d\x3c\x66\x9d\xbb\x9c\x97\xc7\x40\x49\x1f\x8e\x5a\x40\xc2\xf6\x1f\x90\x7b\xda\x58\xa7\x44\xe1\x0f\x13\x70\x1e\xc1\x3f\xaa\x4b\x5d\x06\xda\x37\x7f\x8c\x46\x2e\x28\x1b\xd6\xe6\x6d\x0d\x98\x1b\x34\xdd\xc2\x35\x5e\x92\xfe\x56\xe0\x8f\x53\xc5\x90\xf7\x15\x59\xcf\x0e\xfc\x50\x07\xf2\x4f\x57\x75\x1e\x46\x2c\x67\x84\x85\x4d\x3e\x54\xd9\x79\x02\xa7\xc9\xd7\xe0\xcc\x17\x31\xb9\x0c\x63\x28\xbb\x1c\x3c\x78\xce\xad\x8e\x93\xff\x97\xb3\x2f\xeb\x6e\x1c\x37\xbe\xff\x3a\xfd\x30\x0f\xdc\xb0\xf0\x51\x9b\xbb\x95\xb1\x2d\xc7\x52\x77\x4f\x92\x93\xa3\x83\xa5\x60\xf3\x67\x8a\x54\x48\xca\x6e\xe7\xd3\xff\x0f\x0b\x00\x37\xd1\x9e\xc9\xff\x25\x3d\x31\x41\x8a\x0b\x50\xa8\xe5\xd6\xbd\x7d\xe8\x50\x56\x56\x0e\x76\x72\x19\x92\x58\x81\x18\x0f\x21\xb8\x47\xda\xcc\x0a\xa6\x75\x3a\x37\x9c\x07\x0a\x53\x31\x36\xad\xe8\xc0\xa3\xab\x52\xc2\x4d\x95\x0d\x64\x26\x3f\xc4\xb6\xcc\xbf\x9b\x34\x00\xcc\x32\xf6\x7d\x9d\x88\xec\x9c\x9d\xfa\x49\x1a\xd9\xf4\x8b\xc9\xaa\xba\xd9\x9c\xce\x4d\xeb\x63\xfb\x63\xcc\x36\x26\xe7\xa5\x7a\x99\x7d\xdc\x54\x82\x97\x0d\xdb\xf5\x12\x07\xd3\x41\x2a\x04\xcc\xf0\xd6\x8e\xf6\x70\x34\x2f\x04\xd3\x38\x2f\xd6\x8b\xc3\xe6\x18\x87\xc7\xf5\x66\x75\x8c\x82\x30\xed\x8e\xeb\x18\x83\x8e\xd5\x00\x34\x71\x3f\x94\x2c\x9f\x31\xa1\x89\x30\x54\x86\xae\x93\x17\x93\x1f\x63\xe4\x04\x9f\xad\x9e\x93\x44\xc6\x56\x34\xcb\xab\xd7\xe0\xfc\xfc\x30\x13\x3d\xe3\x9e\x25\x9a\x50\x74\xcf\x94\xc8\xf3\x6f\x65\x03\xf9\x5c\x5c\x9c\x68\x0a\xa1\x8b\x0d\x1f\x84\xb2\xac\x6c\xf6\x9e\xbc\x76\x23\x49\x34\xb3\xac\x61\x05\xbc\xad\x44\xe5\x8b\x4b\x24\x81\xd8\x02\xc0\xa0\x40\x36\x81\x4f\xed\x5a\x02\x89\xcd\x81\x3b\x75\xb1\x7d\xeb\x13\xfb\x43\x3c\x24\x43\x22\x8a\x31\xe5\x2e\x49\x20\x25\x26\xec\xbc\xc6\xf6\x8d\xd7\x67\xdf\xd9\xfc\x65\x06\x4d\xd7\x9e\x21\x11\x15\xf5\x70\x39\x89\x07\xf1\x3e\xfa\xca\x86\x71\x2c\xdd\xde\x3c\x6e\x36\x48\x37\x79\xd8\xec\x0f\xf3\x55\x8b\xc4\x08\x43\xb4\x2f\xb0\x68\xf1\x3e\xe8\x84\x24\x24\x88\xf4\x40\x70\xcf\x36\x2c\x61\x16\x73\x7d\x95\x55\x20\x01\x95\xc6\xea\x70\x9f\xca\x57\x18\xb6\x22\xcc\x15\x85\x09\x09\x53\x61\xc7\x2f\xee\xbf\x6e\x6c\xa5\xd4\xd5\x4d\xfd\xaf\x87\x40\xb1\x17\xc5\xda\x98\xce\x13\x98\xf6\xb5\x7e\x9a\xec\x1d\xce\x84\x36\xde\xf7\xd4\x32\x77\xe2\xd7\xb8\xed\xc7\x0f\x61\x41\xe0\x34\x53\x1f\x5a\x63\xe7\xf3\x6f\xbd\xfb\x1d\xfb\xdb\x8b\x94\x0c\x12\x4f\x37\x51\x43\x27\xc7\x38\xc1\x2e\x11\xb4\x66\x48\xb8\x07\x02\x7a\x48\xee\xdc\x52\x22\x09\x0d\xb1\x35\x14\x6a\x25\xce\xf0\x0d\x01\x59\xfe\x90\x8a\x70\xf5\x1f\x6b\x68\x16\xe7\x49\x8e\x9d\x10\x88\x63\x97\x89\x72\xe0\xcc\x2b\x96\x3d\x42\x88\xb1\x0c\x30\x8f\x48\x5f\xd8\x46\xe3\x33\xa2\xe9\x93\xcf\x4a\x43\x5b\x47\xbc\x2d\xdf\x1e\xb3\xfa\x65\x29\x7c\xf6\x9d\xb0\x84\xc6\x03\xf0\xef\x61\x50\xbd\x3a\x94\xe8\xce\x64\x5d\x30\x49\x38\xb5\x34\x74\x9d\xca\xdf\xc8\x5d\x22\x3c\x65\x28\xa4\x66\x27\xda\x1a\xd6\xb3\x14\x5c\x84\x70\x21\x99\x27\x0d\xd8\x34\xcf\x4b\xbf\x9e\xfb\xfb\xe5\x02\xb0\x85\xcc\xb7\x9c\xfb\x5f\x48\x93\x54\xb9\x3c\xf2\xbe\x29\xbb\xe6\x7f\x42\x52\x1e\x63\x6e\xe0\x2b\x34\x3e\xd3\x8b\x98\xf2\xf1\x0f\x0b\xe5\xc4\x15\x91\x77\xa4\x68\x4d\xe2\x68\x73\x21\x52\x0b\x64\x9c\xdd\x6f\xbe\xde\x2c\xbe\xdf\x1e\x7a\x65\x3c\x42\x14\x24\x98\x70\x7b\x6c\xe3\x81\x06\x3b\x4e\x8f\xb6\x45\x38\xfb\xcf\x05\x8e\x03\xfe\xad\xe9\xf3\x6a\x25\x93\xf6\xb3\xfe\xf3\x6f\x37\xb8\xfa\x3c\x35\xae\x3f\xac\x09\xfa\x62\xde\xac\xdc\x5c\xa9\x3f\x10\x62\x02\x40\x14\x6c\xa7\x03\xd7\x53\xa6\x10\x62\x42\x8e\xf6\xcd\x35\x68\x16\x97\xba\x97\xb1\x27\x34\x08\x2d\x0c\x46\x68\x5f\xdc\x3a\x94\x1f\xd5\x6c\xc6\x66\x85\x86\x71\x82\xe5\x3d\x10\x55\xfe\xde\x7e\x26\xa8\xea\x61\xfd\xb9\x1d\xa1\x53\x27\xa5\x92\x15\x5b\x3d\x50\xea\x21\x34\xa4\x3a\x92\xa3\xb8\xc5\x2a\xad\xf8\xe3\x89\xb6\x7a\x6a\xed\x56\xb9\xf5\x66\x8f\x92\x54\xfb\x54\x1f\xa2\x76\xda\xd5\x3d\xfa\x48\x94\xc8\x00\x53\xa4\x96\x06\x77\xbb\xda\x25\xdd\xb9\x2a\xc6\xce\xf6\x46\xbc\x8c\xf2\xae\x94\x98\x30\xea\x09\x00\x31\xc4\xf9\xc8\x00\x8d\x0a\x7b\x1f\xb7\xb3\x11\xca\x98\x25\x71\xb6\xcc\xfc\x7b\x2c\xe5\x4c\x12\x16\x94\x69\x66\x33\x37\x9d\x07\xe7\xaa\xe7\x22\x9f\xec\xb1\xf3\x1f\x80\x8b\x50\x58\x66\xe7\x42\x65\x83\xad\x88\xa6\x21\x41\xaf\x72\x91\x37\x7b\xa4\x20\x75\x5e\xe7\xc3\xdb\x15\x99\xe1\xac\x33\x4c\x53\x6e\xc1\x09\xb6\x13\x79\xf3\xcb\x76\xd1\x4f\xde\xb4\x08\x88\xcf\xa6\xb9\xad\xae\xb6\xca\xa8\xe3\xbb\x14\x91\x41\x13\x2f\xb3\xf1\xce\xdf\xed\xcc\x54\x9a\x44\x39\x9b\xfd\x7b\xa3\xc6\x95\x02\xaa\x02\x5b\x42\xda\x2b\x51\x40\xa3\x7a\x44\x06\xa1\x2a\x02\x3e\xdc\x71\xbf\xfe\x9a\x8b\xc1\xa8\xa2\xd2\xa9\xd8\x61\x0e\x7b\x55\xd4\x53\x40\xc8\x07\x6f\x41\x09\xa5\x7a\x6a\x8b\x02\x3c\x47\x1f\xa1\x10\xa5\x48\xc6\x30\x54\xf6\x9c\xf7\x1d\x29\x10\xcb\xe8\x58\x0b\x03\x42\xcf\x23\x59\x09\x85\x94\x04\x0e\xd4\x0d\x87\x81\xba\x88\xff\x41\x93\x72\xa2\x7a\x42\x85\xda\x39\x8f\xf6\x28\x0b\x82\x18\x4b\x8a\x4d\x06\xd5\x4a\x9c\x27\xe6\x81\x05\x51\x82\xe9\xe1\x33\xc2\x4d\x01\x1d\xed\x61\x47\x9b\x1b\x16\x71\x81\x9e\xc0\xd7\x12\xfb\x1b\x86\x92\x18\x84\x25\x61\x44\x6d\x55\x1a\x9c\x68\xd6\x80\xe9\x85\xb0\x84\x47\x24\xe8\x98\x9d\xe6\xdd\x01\x46\x22\x81\x1a\xd3\x18\x12\x38\x10\xb1\x13\x5e\xf1\x53\x97\xd1\x24\xc6\x1d\xe7\xdb\xbb\xac\xb2\xee\xaf\x2c\xd0\xa9\x17\xb0\x1c\xf3\xb2\xb9\x01\x3c\x54\x3c\xf0\x15\x0d\x6f\xe3\xad\xfe\xe7\xa7\x9f\x87\x71\x4a\x90\x9f\x23\x2f\x9b\x06\x2a\xab\xc3\xb4\x11\x55\x4f\x5a\x4f\x18\x17\xa1\xc5\x43\x42\xa1\x8f\x77\xa0\xb3\xf6\x7e\x07\x06\x7d\xde\x3c\xb2\x14\x88\x1a\xf3\xfc\xba\x99\x0d\xf5\xce\x5c\x63\x89\x09\x13\x21\xc7\x3c\xf2\x62\x7d\xb7\x1b\xfa\x7a\x4c\x50\x4b\x83\xe8\x84\xe4\x10\x01\xf5\x81\x65\x18\x0a\x06\x8e\xdc\x0e\x26\x34\x41\x63\xa1\x44\xe1\xf1\x92\xcb\xf2\x1a\x16\xe2\x46\x4b\x29\x31\x6f\xf4\x96\x15\x7f\x13\xea\xe5\xa1\x6c\x3e\xeb\xe2\x24\x4c\x49\x1a\x8d\xd3\x79\x85\x98\xac\x43\xa6\x49\x8a\x2c\xdc\x59\xfd\xd5\xe2\xfe\xfe\x59\x9e\x64\x06\x6f\xd3\x61\xc2\x44\xd0\x55\x20\xc6\xd2\xac\x7e\x88\x8c\x31\x87\x24\x6c\x4b\x7d\x67\xc9\x99\xd6\x86\x9b\x7e\x86\x75\x39\x17\x7f\x1c\xa2\x00\xc3\xc3\xc5\xfe\xb0\x1c\xbd\x62\x13\xc7\xf8\xbc\x48\xdc\x66\xa5\x0f\x7b\x45\x2e\xc2\x0c\xa1\x58\x9d\xaa\x9f\xcb\xb7\xaf\xe2\x04\x9d\xf8\x3d\x61\x86\x5a\xa4\xa9\x37\x42\xc7\xd3\xfb\x38\x62\x66\x86\x1b\xec\x46\x37\x00\x0f\x22\xd3\x3e\x9b\x3f\xf7\x8f\x3f\x43\x6a\x24\x9f\x83\x53\xe6\xf4\xf2\x97\xf9\x48\x43\x6c\x6c\xa8\x78\x10\xa7\xa1\xc3\x53\x7e\x19\xec\x4c\xfe\x68\x62\x89\xf2\x6b\x68\x9a\x1c\x1e\x2e\xd7\xfd\xb5\xa3\x0f\xc0\x03\x92\x42\x8f\xaa\xb7\x98\x31\x54\xea\x99\xb7\x5d\x3c\x90\x80\x59\xd1\x6f\xbb\x87\xcd\x80\x24\x90\xf0\x90\xda\x0d\xb7\x86\xe6\x0e\x2a\x75\xc9\xa1\xb9\x6e\x6b\x22\x3c\x64\x16\x75\xe9\x32\x55\x4f\x36\x5d\xb5\x46\x81\x82\xc9\x48\x49\xb1\x89\xeb\x6d\xc2\x06\xef\x0e\xc7\x01\xc5\x0a\xa1\x45\xda\x8e\xf7\x82\xeb\x3c\x1f\x8f\xb5\x15\x1e\x91\x97\x3a\x2b\xa0\xae\x27\x57\x4b\xe2\x08\x91\x80\x0f\x50\x9e\x73\x18\xe5\x6c\x79\x92\x12\x6d\x7c\xd8\xe2\x65\xbd\xdd\x76\xc6\x69\x64\x81\x00\x79\x59\xbe\x5c\xce\xb3\xbd\x81\x7e\x64\x12\x1a\x6f\x22\xaa\x26\xab\x9b\xed\x64\x8f\xe5\x94\x53\xd9\x0b\xa8\x1e\xc5\x75\x72\x98\x33\xd2\xe9\x6b\xbb\x64\xb4\x17\xe8\x1a\x8f\xe3\x24\xc5\xb8\xdf\x35\x02\x78\x89\x1a\x7d\x35\x4e\xd9\x16\x4d\xec\xb1\xb3\x72\xbb\xef\xb6\x6b\xce\x3f\x7d\x4a\x22\x6c\x22\x6c\xb2\x33\xe2\x5b\xc6\xb7\x9c\xa6\x14\x53\x7f\x4d\x1b\x6a\xd6\xcb\x6c\xb4\x92\xb8\x08\x43\x6c\x8f\x6f\x57\x2d\xa6\x83\x3c\xf8\x7c\xfc\x66\x44\x92\x22\xc3\x90\x1e\xe7\xac\x3f\x28\xd5\x71\xc9\x01\xdf\xc1\xad\xa8\x3b\x0c\xa1\x3f\x04\x04\xe1\x70\x3f\x0f\x37\xfe\x4f\x3a\x34\xe8\x52\xf4\x55\xf8\x42\x83\x46\x5e\xdc\xba\x36\x97\xbc\xb3\x17\x5c\x83\x8a\x2c\x4b\xd1\xaf\xfd\x45\xba\xa6\x88\x6e\x86\x00\x4b\xb9\xe7\xa8\x40\x2d\x83\x45\xa1\x91\x8d\xa8\x35\xb0\x0f\x2f\xb3\xf2\x02\xed\x59\x56\x7a\xfe\x24\x7e\x3d\x54\xb0\x55\xe5\xb0\x1f\x8d\x70\x00\x2b\x5a\xd7\xf5\x02\xec\xa1\x99\xd9\x2d\x38\x98\x04\x5d\x34\x53\x56\x0a\x2c\xab\xe6\x54\x22\xbc\x1d\x94\x62\xe6\xbb\xa7\xcb\xef\xde\x8b\x61\x06\x3d\x0a\xaf\x07\x79\x63\x45\xfb\xdc\xe1\x34\x88\x84\x6b\xd4\x6d\x43\xfd\xdd\x19\x0a\xab\xe3\x5a\x95\xa7\x65\x59\xbe\x7c\x19\x79\x70\x69\x90\x06\xc8\x4a\xd4\xba\xd6\xfe\x0a\x61\x00\xc4\xe6\xba\x9e\xba\x0d\xd9\x15\xa0\xfe\x34\x35\x39\x7a\x63\x69\x48\x34\xca\x93\x58\x85\xd6\xbb\xcc\x51\xc7\x7f\x30\x19\xd2\x90\xd9\x06\x39\xbb\x66\xac\xd2\x41\xcf\x1f\x37\x49\x9e\xcf\x7a\x2a\x69\x98\x02\xe2\x49\x16\x15\x14\xa2\x7b\x20\x69\xed\x78\xbb\xc7\x5d\xe4\xef\xf0\xbe\xa8\x2a\x12\x5c\xf5\x8f\x4c\xcc\x4c\x1a\x6a\x85\x9e\x13\x0a\x41\x8a\x0f\x79\x88\xdc\xe8\x28\xb4\x85\xac\x1a\xf9\x87\x9e\xa0\xbe\x13\x85\x78\x9a\x7e\xfd\x34\x12\xc2\x6d\x92\x4f\x59\xdd\x7c\x2b\xea\xd9\x0c\x52\x1a\xa9\x80\x0f\x23\x8c\xc3\xa5\xd6\x0f\x55\xf9\xeb\xfd\x8a\x4f\xcf\x9d\x10\xb3\x94\x5a\xf8\x81\x7e\x44\x79\xaf\x69\x24\xe4\xc7\x09\x8e\x8d\xde\x50\xe8\x5b\xeb\x39\xf9\xb7\x14\x83\x42\x3e\x87\xdb\xdd\xd7\xe3\xd6\x69\xf5\x0c\x98\x03\xc7\x4f\x9b\x04\x14\x81\x28\x8e\x53\xba\x6f\xf4\x46\xa1\x07\x74\xcc\x8e\xf5\x70\x07\x4f\x93\x14\x34\xf3\xba\x6d\xbe\x4d\xc9\xf6\x31\x8f\xd3\xd0\xbf\xcd\x6e\x95\x69\x22\x9c\xfe\x19\x34\x43\xf8\xcc\xfe\x39\x33\xd3\x9b\x23\x26\x42\x9f\xfc\xf0\xfb\x61\xf2\x96\x68\x6a\x91\xa5\x0e\xc3\x89\x1f\x6a\x02\x50\x4b\xa9\xb4\x3a\x55\x3d\x11\xc4\x0d\xd8\x62\x55\x4f\x0f\x47\x52\x6a\x04\x22\xd4\xea\x91\x7a\x3f\x49\x19\xd3\xb8\xf9\xe4\xa0\x9f\xa6\x16\x36\x65\x00\x98\xc9\x84\x42\x95\xae\xff\x8b\x77\xd3\x8d\x07\x0c\xa3\x72\xeb\x89\xef\xcc\x20\x17\xea\x57\x2b\x0f\x29\x71\x0e\x81\xed\xad\x98\xd9\x95\x53\xde\x4e\x05\x57\x75\x85\x5f\x8d\x47\xe8\x0e\xbd\xfe\x94\x53\x5b\x6b\xc2\x54\xf7\xe1\xb9\xbc\xd4\xa2\xd0\x96\x72\xc6\x8f\xe0\x4c\x87\x43\xda\x45\x4b\x86\x34\xbf\x1f\xa6\x5c\x46\x9e\xc5\x71\x0f\xa2\xb1\xca\x94\xe3\x21\x69\xa4\x70\xef\xb9\x14\xd9\x7f\x5c\xe3\x7a\xf7\xe8\xa9\x08\x52\x1b\x95\xfd\xb2\xe5\x40\x5f\x06\xba\x14\x6a\x7e\x7d\x88\xd8\x6a\xcf\x2d\x7e\x2e\xfe\x18\x6e\xf0\xa9\xa0\x09\x23\x9d\x5a\xfc\x13\x54\xe7\x2a\xbb\x9a\xbd\xc2\x41\x80\x2c\x42\xe2\x52\xf7\xd6\x53\x26\x90\xfa\x74\xf9\x01\x4e\xe7\xbf\x82\x28\x4a\xa5\x8e\x50\x56\x18\x44\x55\x80\x2d\x3a\xfa\xeb\xa9\x90\x4b\xd5\x59\xe3\x2e\x0d\xb9\x3b\xbb\xd9\x34\x7e\x2a\x15\xd9\xb4\xcb\xf2\xf2\xfe\x3b\xbc\x7f\xe0\xb6\xa5\x8a\x06\xe8\xb8\xfe\x73\x7d\xd7\x77\x5d\x93\x54\x41\x40\x98\x87\x5a\x34\x9d\xfc\x10\x49\x75\x47\x25\x91\xe7\xff\x2c\x8b\x79\x3e\x30\x92\x6a\x12\x21\x0d\x77\xfb\xc5\x31\xd0\x1c\xd6\xd1\xff\x15\x06\xbd\x1f\x96\xf8\xef\xa6\xb9\x15\xaf\x07\x9d\xbd\x7e\x74\x55\xc1\x23\xdd\x31\xc1\x67\x0d\x2e\x35\x8c\xef\x5c\x83\xa8\x1f\x27\x2d\xa2\xea\x18\xfc\x5a\x67\xa2\x1a\xe5\xcc\x53\x0d\x01\x26\x28\xdb\x57\x2b\xaa\x4c\x60\x32\xac\x97\x07\x21\x29\x84\x60\xcb\xf4\x6d\xc0\x0f\x97\x93\x63\x49\xf1\x87\x0d\x8f\x3c\x66\x01\x21\x4d\x2e\x61\x35\x84\xb6\xa4\x46\x26\x28\xa8\xd0\x8c\xc8\x82\xae\x00\x90\x22\x88\xd3\xd8\x12\x10\xd6\xf5\xdd\xfb\xe0\x03\x88\x20\x0d\x54\xe0\x19\xfe\x5a\xb7\xeb\xa7\xa8\x10\xbd\xee\x68\x38\xfc\x30\x6d\x12\x5f\xa5\x3e\x3c\x57\xe5\x9b\x6d\xc5\xbb\x87\x37\xcf\x6d\x7d\x5f\x36\x03\x45\x6d\x22\x02\x10\xb4\x63\x6a\xbb\x01\x98\xc4\x67\x22\xa2\xd6\x41\xf4\xde\xf5\x14\x3d\x39\x19\x9d\x06\xb1\x5b\x21\x07\x51\xbf\x8c\x4d\x94\x88\xa4\x66\xd4\xc3\xd1\x77\xd5\x23\xb4\xcb\x4f\x35\x56\xdf\xd1\x8e\x4d\x06\x55\x52\x11\x73\x69\xd5\xdd\xea\x5d\xae\x3d\x4a\xd8\x1f\x53\x56\xf3\xfd\x6c\x1b\x44\x8f\x8e\x3b\x64\x02\xd6\x16\x09\x0f\xb0\x30\x69\x19\x61\x2e\x4d\xd3\x5f\x21\xd1\x31\x6a\xbc\xdd\x97\xaf\x62\xd0\xd3\x43\x04\x09\x84\xe9\x05\x06\xda\xe9\x84\x0b\xc6\x1f\x6d\x37\x01\x9b\xd4\x77\x0d\x77\x93\x18\x41\x90\x28\xf6\x34\x73\x5e\xe3\x7f\xfc\x96\x48\x94\x4a\xda\x25\x01\x90\xd9\xe9\x8a\x56\xd1\x0f\x25\x71\x32\x14\xe8\x1e\x72\x24\x10\x41\x74\x8a\xbd\x7d\x6a\xa0\xf0\xee\x8f\xd1\x40\xe2\xcb\x3e\x2a\x91\xdb\x32\xbb\xcb\xf7\xe1\xb4\x1a\xff\x0a\x25\xb1\x18\x42\x92\xdb\xf8\xb8\xac\x9a\xe9\xcf\x51\x4e\xd1\x16\x21\x59\xcf\xce\xfb\xea\xf5\x24\xa7\x2f\xa8\xb0\x72\xdc\x88\x9d\x04\xd3\xec\x5e\xa1\xfa\xe7\x6a\x77\x28\x47\x79\x60\x41\x45\x8c\xf1\xec\x23\xa6\x13\xef\x0e\xdf\x07\xf9\x69\x41\x0d\x51\x6e\x47\xbe\x45\xea\x21\xbc\x93\x07\xf1\xae\xc5\x35\xca\x60\xd6\xe3\x13\x8c\x18\x34\x78\xe7\x5c\xbc\xdf\xf4\xe6\x70\xbc\xf5\x8b\x54\x58\xe1\xa5\xe2\x72\xb2\x05\xdc\x1a\x71\xd8\x88\x58\x1c\xbf\x24\x21\x82\xd4\x4a\xa9\x6d\x56\x9e\xb9\x96\x08\x01\x06\xcb\x71\xc7\x3e\x5f\x9b\x9d\xca\x4a\x77\xf4\x09\x9f\xdf\xa4\x8c\x48\xa0\x3b\xf1\x96\x7a\x5a\xfa\x15\x92\xdb\xb9\x84\x6b\x7d\x31\x48\xe7\x0a\xa9\xc2\x81\x7c\x9e\xc7\xe9\xeb\x89\xa4\xf6\xbf\xe2\x7f\x5f\x65\x83\xc2\xf0\xdf\x73\x8d\x11\x42\x25\xca\x8b\x0b\xad\xc5\x3b\x36\xf0\x5b\xdc\xc1\xf8\x96\x15\x89\xb1\xd0\x82\xa1\xe0\x12\x9a\xbe\x7b\x8c\x08\x25\x02\x04\x9a\xdf\x96\xe3\x1e\x67\x7f\x58\x59\xea\x67\x51\x9d\x5d\x41\xa3\x0b\x3d\x84\x0e\x25\x22\x7b\x2e\x45\xe5\xec\xc2\xe4\x55\x40\x40\x3d\x9d\x66\xbf\x7b\x4c\x5e\x27\x84\x29\x8b\x3c\x5b\x5d\x4f\x0d\x4b\x04\xa8\x10\x55\x17\x5c\x72\x48\x68\xdd\x1f\x61\x58\x4a\x41\x1f\x06\xed\xc0\xaa\xbc\x54\x75\x7f\x26\x24\xd8\x89\x6e\x49\xbf\x6b\xdb\x99\xf8\xf9\x47\x35\x34\xc1\x6e\xf2\xbf\x2d\x46\xc8\x39\x61\x44\x8a\x74\xd3\x88\xfb\xd9\x34\xcf\x47\x77\x40\x06\x91\xc0\x8a\x38\x1e\xd8\xae\x76\x03\xbc\xac\x0c\x62\xe3\x8b\x1b\xee\xd7\x70\xd4\xf8\xcd\xca\x80\x19\x9a\x3a\xca\x81\xd1\xfd\xcb\x80\x47\x58\x59\x6c\x57\xe3\xfa\x71\x3f\x5c\xfd\xe3\xdb\x96\x51\x18\x38\xf5\x74\x9c\x42\xab\x4b\xdd\x94\x3a\x13\x3e\xdb\x36\xfa\x1a\x32\x8a\x01\x0d\xd3\xae\x18\x49\x91\x11\x19\xc9\x10\xb5\xba\xf7\x36\x71\xd3\x5c\xea\x2f\x73\xc9\x41\x19\x27\x31\x36\x4d\x6b\xf8\xf5\x7f\xa2\x1a\xa6\x88\x64\xcc\x78\xea\xf8\x35\x7f\x7f\x97\x50\xdd\x43\xf3\x56\x56\x2f\xb3\x16\x52\x26\x01\xe0\xce\xa8\x1d\xee\x64\xf2\x62\x12\xa9\xa2\xa8\xdb\x38\xa1\x72\x41\x85\xff\x29\x12\x4b\x64\xde\x3a\x94\x97\xaa\x10\x6d\x30\xd2\x8b\xcd\x12\x49\x08\xd5\x9d\xbb\x9e\xe7\xe8\x11\x2f\x4c\x03\xd5\x41\xfc\xea\xc6\x50\x99\x74\x44\x7b\x63\x76\x2f\xef\x83\x4a\x4a\x0d\x98\xa1\xc3\x8b\x4e\xac\xad\xc3\x22\xd1\x4e\x96\xe7\x56\x95\x63\x6e\x62\x79\x37\x42\xb2\x58\x20\x6a\x68\xbb\xda\x8d\x32\x98\x92\x09\x19\xf8\xb6\xd1\xa7\x2a\xc3\x59\xec\x68\x24\x06\xa9\x68\x37\x98\x07\x01\xbe\x78\x79\x79\xb7\xe4\xd2\x0e\xeb\xfd\x9b\xfb\x67\x4e\xd1\x8a\x48\xce\x65\x6c\x13\x5f\x42\x7d\x46\x39\xee\x86\xa7\x82\xcb\x6e\x67\x2a\xf3\x1c\xaa\x61\x0f\x8e\x14\x29\x88\x21\x80\x67\x6a\x9c\xff\x45\xfe\x3d\xf6\x2c\xa4\x54\x21\xc2\x15\x5c\xa6\xff\xee\x61\x42\x76\x30\x8c\x65\xa4\x4a\x13\xa4\x66\x53\x96\x72\xea\x50\xae\x37\x37\x93\x79\xa1\x59\x8c\x28\x84\xd2\x18\xa8\x6c\xc8\x77\xfe\x50\x30\x8b\x48\xcd\xa5\x8c\x7c\xe7\xf9\x09\xea\x46\x9c\xce\xcb\x77\xb4\x43\xa3\xe7\xd6\xda\x60\xeb\xc3\xf1\x68\x59\xc1\xc5\x09\x1a\xdf\x4c\xf3\x01\x9d\x04\x91\x10\x59\x66\x6a\x8b\x07\x14\x39\x0c\xe1\x5e\x12\x8c\xed\x65\x1d\xf2\x99\x0c\x33\x98\xfd\xae\x29\x4d\x24\x31\x19\x91\x8b\xba\xe9\xb0\xf2\xd2\x24\x31\xee\x31\x9e\x4b\xc3\xff\x99\x29\xcd\x06\x0b\xc7\xb5\x94\x4d\x76\x73\x69\x18\x68\xab\x54\x25\xf3\x4c\xdd\x58\x02\x8b\x07\xa8\xea\xb2\x40\x23\x36\xbc\x57\x15\x44\x24\x54\x1e\x6f\x9f\x15\x6e\xc3\x1f\xf0\x84\x10\x15\x46\x1a\xb7\x0f\x7c\xd8\x9f\x90\xfd\xec\x3c\x32\x15\x2a\x22\x6d\x8f\x3c\x54\x85\x68\x2f\x30\xb9\x19\x15\x01\xa0\xc3\xf3\x08\xd8\xba\xdc\xda\xe4\x42\x65\x22\xbf\x15\x72\xe0\x2d\xab\x38\xb0\x60\x8e\xa3\x6d\x32\x45\xde\xaa\x2b\x42\x2f\x3f\x36\x8a\xbc\x5a\xfa\x4a\x8c\x73\x9f\x83\x57\xab\x62\xa5\x51\x7c\x55\x89\x0e\xea\xff\x7d\x7f\xb0\x89\xf5\xc1\xb0\x24\x16\x58\x56\xf4\x1e\xd9\x20\x79\xa1\x08\x0d\x30\x3d\x22\xb4\xcd\x7e\x6e\x8b\xd7\x32\x53\x7f\x22\xad\x4b\x14\x51\x29\x06\xe6\x59\xfd\x60\xd5\x94\x40\x1f\x7e\x8d\x3d\x6b\x45\x65\x88\xbc\x07\xab\xc7\x87\xc5\x97\xee\x6f\x89\xed\xe7\xc9\xcb\x02\x6e\x00\x06\x40\x72\x37\x82\xc5\x02\xf1\xa3\x95\xe5\x8e\xdb\xf8\xe4\x62\x77\xdc\x18\x2c\xbb\x65\xf5\x83\xc8\xc6\x7a\x08\x6e\x04\x8f\x18\xb6\x1b\x63\x3e\xa6\xac\x9a\x1a\x39\x7f\x8c\x50\x30\xfe\xe8\x3c\xb6\xdc\x0e\x98\x37\x78\xdb\x36\x70\xba\xd6\xce\xf2\x43\x35\xc5\x02\x72\x81\x4d\x64\xcb\xcb\xfb\x68\x82\xa5\x61\x18\x22\x20\x51\xbe\x68\x13\x7d\xf9\x88\x3b\x8d\xa8\x94\x87\x9e\x61\x6c\x25\x4e\x67\x91\x3d\x15\x23\x12\x7e\xa2\x44\x12\x62\x21\x77\x04\xed\x9e\xcd\x35\x2a\x41\x09\xf6\x25\x9f\xa7\x0a\x56\x7f\x01\xac\xa6\x84\x4c\x95\x6b\x62\x3a\xa2\x04\x13\x0c\xa1\xda\x4a\x32\x02\x56\x10\xf2\x9c\x0b\x05\xab\xe7\xec\xfc\xfc\xf1\x9d\x48\xa3\xd1\x2f\xde\x3b\x95\x49\x57\x02\xc2\xc8\x73\xf2\x6d\x14\x44\x9e\xe5\xf1\xc6\xf3\x7c\x8d\x47\x68\x0e\xd8\x50\xbd\xdf\xac\x76\xf7\x6b\x27\xaf\x7a\xb7\xf8\xe3\xb8\x7f\x58\x78\x0c\x8b\x82\xc0\xaa\xb8\xbc\x59\x01\x82\xce\xfa\x75\xc7\x55\x8c\x2d\x61\x47\xa8\x55\x55\xbe\x8d\x26\x73\x12\xb8\x41\x26\x11\xa4\x2f\x56\x6e\x72\xb0\x1b\xd3\xd0\x74\x2a\x43\xba\xa8\xc8\x46\xad\x06\x9c\xa2\xd7\x18\x24\xa2\x0c\x13\xb8\x15\x19\x50\xcf\x3f\xca\x06\x6c\xc4\x7d\x53\x56\x3d\xa1\xd5\xfb\x38\x33\x35\xeb\xef\x28\x63\x48\x62\x4b\x8f\x5d\x2c\xe3\x2b\x6a\x76\x84\x0e\x03\x83\xcc\xe3\xa8\x4e\x2a\x6a\xd8\xae\x76\x6a\xc2\x83\x40\x74\xc4\xad\xd0\x39\x1a\xb4\x5b\xfb\x59\x46\xd9\x7b\x1d\x19\xc5\x45\x47\xed\xbf\x55\xe5\xa6\xd0\xf5\x62\xe2\x57\xeb\x58\x5a\xa2\x16\x2f\xd8\x39\xd0\xf5\xf3\x23\x94\xc1\x1a\x1c\x06\xb3\x2b\x51\x3f\x3f\x74\x8d\xff\x3a\x86\x40\x0c\xb9\x04\x0e\xe5\x5e\x18\xe8\x8e\x1a\xdb\x6a\xb0\x84\x26\xb9\x15\x5d\x6e\x43\x27\x51\x1c\x79\x15\xc6\xbb\x4b\x7e\x77\x4d\xaa\x35\x6f\x94\x74\x92\x44\x81\xdd\xc0\xdb\x77\x5f\xf7\x92\xc7\x03\xd2\x01\x9d\xa4\x89\xea\xc5\x66\x5a\xa7\x24\x3a\x86\x47\xaf\xd5\xde\xce\xa4\xe5\x3b\x09\x82\xa0\x1b\xaf\x08\xc6\x52\x67\x64\x6a\x86\xbb\x19\x1c\x85\x1f\x69\x22\x74\xcc\x8e\x99\xe3\x18\xfb\x33\xd6\xc6\xc9\xf9\x24\x64\x08\x7f\x3a\x5b\x50\x53\x74\x7c\xcb\x3a\xc4\x98\x26\x51\x98\x3a\x6f\xed\xb6\x14\xc5\xf8\x5b\x92\x58\x63\x07\xdf\x11\x7e\x65\x75\x63\x39\xaf\x7f\x87\x31\x5f\x30\xd1\x94\x58\xca\x52\xcc\xaa\x0c\x64\x4b\x88\xa6\xc2\x16\xa3\xdf\x50\x37\xa9\xe7\xe2\x21\x9a\x05\x0c\xb7\x8e\xdf\xd7\xc1\xd0\xa1\xd6\x2c\xe0\xc4\x3b\x8f\x8f\xa2\x78\xc1\x1c\xe0\x54\xa2\x83\x68\xc6\x43\x6c\x1a\x30\x59\xa1\xff\x61\xca\xea\x8f\xe9\x71\x19\xf9\x1e\x60\x57\x11\x9c\x2d\x22\x68\x26\x4d\x92\x0c\x5d\xb3\x29\x28\x68\x3c\x9c\x13\x4b\x93\xf0\x77\xd9\x7e\x52\x91\xfb\x34\xb0\xe6\x4c\xe3\xef\x59\x32\x2e\xa7\x9a\x3a\x39\x97\x5b\xa8\x93\xb2\x42\x0a\xae\xbc\x6e\x1f\x7e\xd6\x0b\xd5\x69\x2a\xb0\x8a\xb3\xca\x41\x14\xfb\x37\x10\xdd\x5c\x4b\x45\x0a\x30\x64\x95\x13\x15\xe6\xc1\xa7\x77\x3f\x21\xfd\x9e\xfc\xdf\x91\xb1\xd5\xa9\xd0\x76\xe7\xcd\xf3\xec\x3f\x97\x4c\x8f\xe1\x37\x3a\x6d\x63\x7f\x9b\x09\x1a\x7d\x30\x11\x74\xde\xf8\xca\x13\x07\x4e\x9e\x5c\x24\x11\x02\x75\x5d\x38\xba\xdf\x6c\xd6\xfb\xac\x18\xa8\x21\x4d\x9b\x84\xb5\xa0\x36\x45\x83\xaa\x4a\x58\x5b\xc0\x69\xe5\xda\xc7\x87\x14\x17\x5a\x50\x62\xf9\x50\x2d\x82\xee\xef\x6d\x30\x97\x95\x7d\xf5\x53\x0b\x25\x61\x28\xed\x71\x53\x95\xd7\xb4\xec\xf3\x0b\x4f\x40\x10\xbb\x68\xf4\xf0\x7e\xee\x5e\x85\x34\x80\x9b\xb6\xa9\xca\xd3\x23\x88\xfc\xcb\xb0\x10\xa8\x15\x0f\x28\x74\xf2\x19\x4f\x30\x6c\x76\xd1\xda\xc4\x89\xab\x54\x77\x29\xec\x31\x0a\xfe\x8a\xa1\x7d\xfc\x2e\x21\xa1\x81\xcb\x4d\xef\xde\x8a\x1b\x51\x3f\x5f\xe3\x29\x35\xf0\x20\x72\x83\x16\xff\xb9\xd8\xef\xb5\xb8\xe8\x15\x14\x4d\x3d\x5a\x9f\x20\x04\x92\x88\x6d\xef\x0f\x8b\x47\xdf\xb3\xaf\x4d\x68\x0b\x9f\xc7\xf6\x01\x67\x79\xeb\x26\xef\xc9\x18\xdb\x7c\xfb\x58\xe6\x70\x8b\x25\x7f\x77\x29\x08\x92\x08\x7d\xd3\xd9\xde\xa4\x31\x6e\xde\x9d\x11\x86\x09\x95\x03\xc2\x1e\xbb\x87\x1c\xde\xbc\x63\x09\xa1\xa2\xc4\xd1\xd1\x81\x3e\x36\xe5\xb1\x79\x86\xa3\x14\x85\x5f\x8b\x10\x71\x16\x04\xde\xf3\xc4\x3c\x5a\x56\x5d\xc1\x96\xc7\xaf\x15\xe2\x90\xa3\xa1\x13\xa7\xed\x47\xbc\xe8\x04\xe2\x38\xc5\xd5\xaf\xb3\x27\xa8\x9b\xb9\x94\x0c\xc4\x42\xc6\xed\x64\x2b\x94\x1a\xae\x12\x88\x75\xcc\xf4\x58\xf1\xbc\xdd\xc2\xb1\xba\xe3\x86\x10\x01\x68\xd2\x7e\xcf\x7a\xea\x4c\x02\x44\x51\x4b\xb4\x7c\xfe\x94\x9f\x01\x58\x60\xd5\x3e\x4e\xef\x07\x51\x65\xc6\x9f\xce\xc3\x48\x68\x0f\x50\xac\xa1\x6f\xea\x07\x1e\x01\xd6\x45\x6f\x2a\x80\xe3\x6b\xd9\xc0\xd1\x94\xd5\x51\x79\xa7\xe2\xb8\xec\x06\xc6\xa9\x4f\x4e\x7e\x83\xaa\x44\x79\xdf\xf9\xb8\x11\x52\x15\x21\xaa\xe0\xa1\x8d\xc8\xcb\xac\xf0\x72\x49\x04\x52\xa3\x22\x87\x83\x59\x0e\x88\xcc\xba\x08\xd8\xe5\x0e\x40\x24\x11\xd5\x3d\x0d\xe3\x4f\x47\x94\xc1\xa7\x65\xf1\xb1\xed\x02\x01\x06\x27\x4d\xe3\x10\x1d\x7f\xce\x69\x4c\x40\x18\xeb\x31\x3e\x41\xd3\x46\x90\x7f\x13\x1a\xfa\x2c\x82\xd3\xe8\x1c\x7f\x7f\x4d\x75\x40\xbd\xef\xb3\x2c\x0b\x3d\xca\x4b\x80\x4e\x19\xa2\xdd\x86\x4c\x22\x0b\xc4\xe1\x7c\xf0\xcd\x20\x8c\xd0\x99\x2c\x5f\xa1\xaa\x32\x0d\xab\x67\x51\x7d\xac\x63\x4d\x00\x62\x66\x65\x91\xd1\x61\xbc\x83\x5a\xcc\xb7\x93\x03\xa8\x8e\x23\x01\xe1\xa8\x76\xf5\xcd\x35\x06\x82\x89\x52\x8c\x0b\x70\x57\x7a\xba\x38\x81\x35\xc7\x8a\xfd\x09\xba\x17\x8c\xe2\x69\xdc\x6f\x67\xd8\x4a\x79\xf0\x79\x22\x30\x86\x63\xfa\x78\x9d\x89\x53\x59\xe8\x8f\xb8\x75\x27\x8b\xdf\x04\xd4\x36\xe6\xd8\xdc\xc0\x10\xc0\x6e\x02\x0a\x98\x19\xc4\xb8\x61\x79\x79\x47\x2c\xc6\x40\x06\x7d\x0a\x3a\x30\x81\x8a\x90\xec\xf6\x84\x52\xd4\xad\x9b\x3a\x75\x31\x4d\xc8\xd2\xa0\xe7\x89\x5a\x41\x0e\x72\x8e\x6f\xae\xbd\x6a\x2f\x88\xf7\x2f\xea\x7f\x21\x8a\x22\xda\x4b\xb7\x5a\x94\x5a\x79\x3d\xed\x66\x50\x83\xfd\x5e\x3c\xbf\x25\x0f\xf3\x3b\x26\xe2\x0a\x5d\x22\x2b\x5f\xee\xd7\xa5\x89\x20\xf4\xd5\xf5\x1b\xc4\xad\x8c\xa0\xe0\xa3\xaf\x6c\x22\x88\xf0\xbd\x22\x7d\xb4\xed\x42\x19\xd0\xe5\x98\x08\x24\x67\x5d\x7b\xf1\xc6\xb6\x4a\x7c\x15\xa7\xfe\xed\x47\x06\x12\x27\xf1\xbe\xc6\x66\x35\x5d\xae\x9d\x54\x72\x53\xce\xca\xc3\xfb\xbb\x8f\x43\x1a\x5a\xe8\x71\x3d\x23\x67\x3e\x4a\xc6\xf9\x33\xa2\x08\xc9\x10\xac\x0a\xf0\xb0\x76\x3a\x5e\xf5\x86\x30\xcb\xdd\x28\x2f\xd5\xa7\x04\x94\xc4\x90\x34\x88\xe3\xae\x3d\xfc\x0c\x55\xf3\x7e\x2b\x6a\xa7\xc4\x5b\xf5\xff\xe9\x79\xe0\x67\xd7\xab\x21\x20\x42\xe6\x58\x89\x8e\xc2\xa5\x1b\xdd\x31\x9a\x30\xe3\xf0\x87\xad\x1b\xed\x2c\xc9\x02\x23\x60\xac\x01\xfb\xa4\x58\x9f\x3e\x31\x94\x32\x04\xc8\x63\xbf\x61\x84\x6b\x64\x50\xf3\x30\x2c\x8e\x51\x96\x3b\xb3\x65\xb9\x39\x74\x93\x61\x5c\x05\xca\xb6\x75\x2c\xfb\x2d\xd0\xf0\x44\x23\x68\x2b\xab\xed\x1d\x74\x2a\x60\xd3\x42\xb9\x49\x03\x2b\x79\x51\x43\xd3\x5e\xfd\x5a\x0e\x96\x98\x34\x82\xd8\xb5\x29\x2c\x41\x4c\x02\x39\x23\x42\xea\xc3\x3d\x74\x7b\x9d\x86\x6a\x47\xc8\xe2\xf3\xb9\x46\x86\x02\xbb\x2b\xeb\xbc\x8d\xe5\x86\x5c\xb9\xf3\x98\x27\x23\xa3\x90\x93\x81\x1a\xc3\x4c\x5b\xb8\x91\x52\x60\x3d\x5b\x43\xee\x7a\xae\x5b\xf7\xee\x4e\x8c\xd2\xac\xe3\x1b\xd6\x86\x62\x29\xe9\xf4\x00\xd5\x1e\xf2\x1c\xdb\xed\xdd\x31\x88\x25\x16\x50\x9b\x41\xa7\x0f\xa6\xc0\xbd\x08\xaa\x1f\x68\xb8\xc1\x39\xea\xe5\x4d\x47\x42\xb5\x34\x08\x22\x83\x1a\xbb\x68\xc7\x16\x17\xd7\xf4\xe2\x0e\x86\xa1\x6d\x21\x13\x5a\x5b\x65\xf5\x39\x60\x06\x0d\x22\x11\xe2\xfe\xd4\xd1\x99\x75\x89\x7c\x1a\x44\xca\x92\x44\x7a\xa7\xe0\x11\xd4\x5f\x96\x8c\x71\x06\x92\x06\x71\x92\x40\xe4\xc9\xfa\x46\x10\x26\x8a\x8a\xe6\xc1\x20\x3c\xff\x51\xe6\x97\x13\x6c\x3c\x73\x18\x0d\x62\x2e\x11\x3a\x71\xca\x0a\x8c\xb0\x3e\xa5\x8c\xe9\xc8\x2f\xfc\x3f\x5d\x22\x71\xf2\xcc\xb1\x22\x28\x1d\x53\x9e\xa1\xa8\xcb\x4b\xa5\xa0\x35\x6d\x3e\x74\x73\x83\x92\x34\xf0\x7c\x9f\xad\x8d\x5a\xbe\x6f\xd7\x43\x02\x17\x1a\x24\x2a\x41\x62\xac\xe2\x72\x3a\x64\x39\xd4\xe8\x66\xf9\x3c\x07\x0d\x12\x93\x82\xe8\x2b\x3f\x03\x87\xb8\x3d\x26\x6c\xb9\xef\x19\xd4\xcb\xd6\xb8\x24\xf2\xa6\x8d\x7e\xc7\x04\xbc\x34\x20\xcc\x16\x33\xd1\xcd\xbc\x6e\x14\x1a\x3f\x18\x61\x1c\x5b\x7d\xea\x67\x11\x0e\x64\x70\x68\x40\xd2\x90\x59\xb5\x86\xfd\x45\x5a\x3a\x66\x98\x67\x89\xa1\x01\x11\x1c\x65\xcb\xd7\xc8\xbd\x0e\xd5\x37\xa1\x5e\x44\xf3\xec\x8d\x10\x0d\x88\xb4\xa4\xae\xfb\x1f\xd6\x48\x23\x42\x24\x08\x83\xf0\xcb\xe4\x42\x5a\xd3\x70\xd4\x26\xbe\x7c\x77\xb4\x7f\x03\xeb\x42\x03\x2a\xc2\x4e\x48\xeb\xa2\xb3\xe6\x11\xce\x65\xd5\x6c\x1f\x6e\xf6\xb3\xe9\x4c\x1a\x30\xad\x53\x3d\xc2\xac\xee\xcf\xa0\xb2\x81\x92\xd8\x70\x2d\xd2\x80\x27\x29\xc6\xc4\x67\xdf\x47\xd9\xc0\x76\xb5\xbb\x9f\x24\xd6\x06\xe3\xc1\x92\x1e\xeb\xa9\x93\x14\x76\x23\x4c\x68\xd9\xb2\x1d\xc4\xd7\x2d\xe2\x41\x3b\x18\x0d\xd2\xc0\x76\x6a\x3c\x41\x83\x02\x60\xef\x6b\x68\x44\x96\xd7\x1e\x94\x31\x7e\x59\xa9\x88\x31\x65\x7e\x29\x9e\x45\xde\xd4\x98\x33\xef\xd6\x72\x2a\x43\x6e\x7b\xde\xce\x17\x8b\xc8\x19\xb8\xfd\xed\x61\x89\x7b\xf4\x52\x54\xd9\xa9\xcf\xd9\xb7\x07\x34\xea\x3b\x6e\x36\x77\x43\x9c\x40\x7b\x00\xb0\xea\x55\xbf\x01\x4c\x31\x53\x93\xfb\x02\xcb\xc3\x9c\xc3\x2b\xe4\x88\x17\xbf\x9c\x27\xf9\x4a\x1a\x88\x84\xc4\x56\x93\x04\x1c\x12\xa8\xbb\x75\xc1\xd2\x88\x4c\x61\x84\xf5\x64\xa6\x08\xa9\x52\xed\xda\x6a\xc2\xbe\xc4\x4c\x03\x19\xd8\xc6\x2b\xf5\x9c\xe5\x76\xe9\x4f\x38\x47\x67\xf7\x50\x1a\xc8\x38\x8c\xdd\xaa\x59\xd4\x75\xa9\xb0\x93\xe4\x03\xc2\xfa\xc9\x03\x2b\x12\xc5\x16\x8f\x2b\xb4\x53\x34\x7c\xca\x4b\x29\xf2\x2e\x36\x6a\xff\xac\x45\x67\xc4\x34\x89\xac\xe0\x7d\x53\xde\x8b\xa2\xbc\xdf\xde\x7e\x19\xdf\x8c\xa6\x14\xab\xb7\x6d\xf8\x33\xfa\x6e\x5a\x59\xca\x73\x79\xb1\x2a\x6e\xd3\x1b\xfb\x90\x32\x98\x06\x10\x1b\x7c\xc0\x27\x54\x2e\x1d\xff\x1e\xa4\xa1\x4b\x6e\x15\x96\xa4\xca\x71\x4b\xfb\x9f\x35\x2a\x66\x49\xc7\xa2\x89\x1e\xee\x10\xda\xe0\x0d\xb8\xfb\xcf\x79\x1a\x07\x1a\x18\x08\xc0\xeb\x95\xfb\xe2\xfb\x00\x9d\x4f\xc3\x40\x92\xd4\x8a\xa2\x9a\xf2\x26\x83\x7c\xc2\x2d\x4e\xc3\x40\x59\xaa\x07\xec\x21\xc1\x8a\x84\x53\xc8\xa3\x61\x98\x58\x55\xae\x0a\x54\x1b\xb6\xcc\x74\x9b\xd1\x30\xe4\x21\x38\x36\x5c\xa4\xd9\x47\x50\xea\x6e\x86\x22\x8c\x86\x11\x28\xf4\x2b\x45\x1b\x48\xcd\x0d\x88\x49\x64\xc9\x58\x5b\x2b\x7d\xb8\x7d\x08\xfd\x8d\xc4\xa0\xd2\x0e\x0e\x97\xb5\x2e\xf0\xc0\x1f\xa3\x61\x92\xd8\x86\xa1\x65\x59\x4f\x20\x3b\x34\x4c\x48\x8c\x39\xec\xed\x7e\xb1\xf3\x7f\x23\xa9\x97\xfe\x2a\x74\x1b\x31\x1c\x4a\xab\x39\x36\x29\xb1\xd3\x90\x68\x0b\xfa\x72\xc9\x2c\xbb\x7a\xc9\x43\x7f\x75\x02\x21\xae\xe0\xf5\xe2\xf1\x77\xff\x37\x9a\x24\x8e\x97\xa9\x40\xcc\x4a\x56\x81\xde\x5f\x64\xad\xaa\x4c\x3a\xb1\xd9\xc9\x73\xd3\x44\xa2\xc7\x9a\xa9\xf2\x20\xaa\xa7\xce\x40\x84\x34\x01\xac\x09\xd5\x88\xd7\x82\xba\x29\xab\x21\x61\xd0\xa7\x99\x6c\x1a\x52\x4a\x41\x0e\x6b\xf3\xc3\xa5\xe7\xe7\x07\x35\x04\xbd\x97\x9b\xdd\xf7\xc7\xc3\xb7\xe3\x61\xbb\x79\x3c\x0e\x98\xbe\xfb\xc8\x81\x86\x2c\x36\xb6\xb5\x2f\x2b\xbe\x8c\x7e\x88\x09\x8d\x11\x87\xa5\xd5\xda\x1e\x76\x47\x27\x0d\xb3\x2d\xbe\xef\xd7\xfe\x74\x1e\x00\xb7\x11\x94\xe8\x83\xb3\xf1\x1d\xf3\x50\x20\x51\x65\x56\xb4\xd1\xc0\xa4\x05\xab\x1b\x23\xb1\xfd\xa6\x7e\x2e\x2b\xc4\x2e\xb8\xde\xd1\x31\xe9\xc9\xfc\x1b\xe1\x5c\x21\x99\x68\x56\x2f\x85\x9e\x9b\x81\x3c\x25\xf8\xca\xd0\x4d\x5a\x5e\xbc\x75\x09\xd3\x48\x23\x49\xad\xb0\x40\xb3\x6d\x61\x4a\x27\x8f\x3b\xb9\x40\x4a\x89\x76\xbb\xe8\xe3\x7d\x77\xb6\xb1\xbc\xd4\x59\x91\x75\xd4\x8b\xfe\x98\x24\x90\x0c\x01\x94\xa3\xde\x87\x79\xbb\x1a\x4a\x46\x64\xd4\xb5\x8c\x3d\x7a\xe6\x92\x91\xc9\x0f\x65\x6a\x45\xdc\x57\x1d\x4e\x61\xec\x5a\x85\x2a\xe6\xc8\xcb\x76\x0f\x6f\xdb\xd3\x94\x84\x8b\x86\x8a\x93\xd4\x65\xd5\x7f\x3f\x97\x67\x6c\x0d\x58\x0d\xd0\x78\x1f\xe9\x1d\xd3\x50\x47\xc2\xb6\xab\xd9\x45\x35\xec\xda\xff\xb0\x1d\xb7\xdb\xb0\x43\xad\x62\xcc\xe8\xb5\xce\xe6\x4d\x59\xed\xc5\xe9\x9c\xc3\x23\x3c\x65\xcd\x44\x7d\xba\xb3\x60\x46\x11\xcc\x48\xe2\xbe\x78\x0f\x6f\x88\x86\x99\x7c\x17\x63\x6c\xaf\xd4\xb9\x2a\x7f\xbd\xff\xef\xea\x4f\x93\xa4\xfa\xe8\xda\x51\x10\x5a\xa4\xb0\xcd\x2c\xb4\x01\xa6\x0d\xc4\xbe\x4c\x86\x11\x81\x58\x88\x47\x64\x6a\xc9\xb3\x57\xa8\xe0\xc3\xa2\x94\x3f\xc7\xd5\x99\x6a\x47\x86\xf3\xfd\x71\xfb\x65\x26\xe8\xa5\x51\x18\x40\xd4\x69\xba\xba\xb0\xcc\xea\xd2\xd6\x36\x52\xeb\x88\xc4\xef\xc4\x79\x72\x63\x61\x14\xd1\x4e\x65\x6c\x24\xdb\x4b\xa3\x90\x1a\xb7\x0f\xb7\x53\x2d\x8c\xfd\xdf\xa3\x20\xc4\x86\xa5\xc5\xac\x43\xec\x07\x45\xb6\xbe\xff\x54\xe6\x70\x72\xb2\xc0\xdd\x05\x08\x41\x2d\xce\xd3\xd1\x20\x84\xb3\xfb\xbb\x96\x90\x4c\x38\x97\x3e\x7f\x47\x71\x6c\x62\x33\xc0\xf1\xde\x95\x55\xf3\x24\x9e\xe6\x08\xaa\x68\x94\x44\x1c\xa1\x99\xd2\x4b\x28\x8e\x16\x4d\x94\xc4\x31\xf6\x6c\x8e\x59\xc7\x68\x94\x24\x69\xd0\xf7\xd8\x2c\x8a\xec\x24\xae\xd4\xf2\x66\x32\x22\x34\x4a\x0c\x45\x2a\xb3\xbe\x23\x69\x2e\x33\xe6\x06\xd3\x80\x85\x56\xaf\xd2\xc2\x5a\xe7\xa1\xb3\x34\xa2\x71\x88\x59\x71\xef\x0a\xdd\xc3\xdb\x27\xa4\xb1\xfd\x9b\xa2\x84\xe2\x92\xc6\x14\x03\x4e\xc3\x8b\xa7\xf6\xc7\xf2\x70\xf7\x1a\x28\x91\x89\xd5\x75\x69\xb7\x9b\xda\x4b\x99\x55\x13\xd2\x32\x1a\x51\x29\x18\xf4\x7a\xbd\xfb\xec\x09\x89\x20\x27\x0b\xdd\x0d\x66\x81\xa5\x08\x45\x52\x6d\xdc\x07\x97\xd9\x74\xca\x30\x92\x60\x8e\xa3\x28\x4f\x59\x61\xf1\xdd\xd7\xdd\x60\x34\x62\x2c\x25\x8e\x12\xa8\xba\x2d\x5f\x91\xf4\x79\xfa\x96\x58\x1a\x10\x9b\x17\x99\x15\x44\xa0\x11\x53\xb1\xb2\x29\xfe\xd7\x9b\xb2\x3a\x80\x38\x6d\x9a\xe7\x89\xff\x10\x31\x1d\xa3\xf3\x6e\xf3\xb0\x73\xb9\xcd\x39\x9b\xe1\xbf\x28\x0f\x93\x80\xd8\xd9\xfc\x47\x7b\xfc\xd3\x2c\x08\x8d\x38\xa1\xc6\x22\x0e\x4e\x6e\xa7\x00\xcb\x3d\xa3\x67\xc3\x95\x88\xa7\x4c\x05\xae\xef\xc2\x32\x56\xda\x36\xc7\xd2\x82\xef\x86\x29\x6b\x1a\xa5\x61\x10\xbb\xe2\xdd\xdf\x2f\x22\x47\x9d\x48\x47\x7d\xf1\x29\x4e\x87\x46\x69\xc4\x30\xc5\x3c\x94\xed\xfa\x84\x45\x6a\x72\x93\x82\x03\x31\x33\xbd\x8d\x98\x6b\xd9\xaa\x72\xf9\x3e\x80\xed\xd3\x48\xca\x18\xdb\xf2\x5d\x50\x67\x69\xd0\xbb\x83\x8a\xe3\xf4\xf8\x39\xd4\xa3\x19\xb7\xcd\xd2\x48\x9a\x10\x3c\x69\x06\xee\x8f\x18\xfa\x0f\xcc\xdf\xac\x05\x55\x12\x90\x67\x6f\xf1\x63\xb1\xbd\x5d\x2c\x6f\x37\xc7\xc5\xf6\x71\xfd\xb8\x7b\x38\xee\xbf\x3f\x3c\xdc\xfe\xc3\xdf\x82\x26\x34\xd6\x43\x16\x86\xfb\x5d\x77\x88\x69\xac\x73\xcb\xcb\xfb\xdf\xf7\x87\xee\xaf\x9a\xda\xf6\x51\xcf\xc3\xf1\x50\x95\x26\x6b\xba\xc5\x06\x91\xa1\x7d\x67\xa2\x95\x08\xad\xca\x93\x6f\xca\xf8\x93\x6f\x03\x89\xd1\x41\xd7\xb9\x23\xf2\xdd\xa5\x51\xe5\x09\x96\xef\x1b\x14\x2c\x1a\xbf\x9a\x38\x64\x29\x7a\x1b\x45\xd9\x64\xe6\xfd\x00\x75\x93\x9d\xca\x62\x10\xb3\x77\xe3\xc0\x91\xd2\x34\xb7\x58\x20\xb6\xe1\xee\x73\x05\xf5\x73\x99\xeb\x89\x6a\x84\x3f\x09\x64\x60\x83\xe7\xd6\x98\x7c\x42\x1a\x46\xe3\x28\x60\x81\xf2\x32\xe2\xed\xb8\x75\xf6\x9a\xd5\x13\x54\x35\x8d\x23\x1a\xa2\xdb\x75\xa8\x2e\x75\xb3\xf9\xee\xab\x96\x34\x8e\x78\xcc\xb8\x45\x1e\xa9\xa9\xd6\x9e\x1b\x12\x07\x8a\x38\xdf\xf9\x51\x98\x4d\x31\xf1\xed\xe3\x38\x64\x68\x99\xcd\xa5\xd0\x0b\x6d\x7f\xdd\x1f\x4a\x29\xd2\x20\x1d\x6f\xb6\x3f\x36\x87\x6f\xbb\xef\xfb\x85\x57\x0c\xa2\x31\x61\x21\x53\x3e\x16\xa9\x9b\xea\xd2\x06\x75\x75\x77\x14\x42\xcc\x15\xb6\xf6\x7e\x79\xc9\x72\x3d\x50\xa4\xfa\xb3\x64\xdd\xe4\x1d\x51\x66\xb9\xdd\x90\x6f\x66\x40\x3e\xd5\x97\x37\xfd\x40\x6e\xd5\xc8\xb5\xa5\x7f\xf3\x5d\x52\xf5\x12\x1d\x1d\xf5\x3c\xe6\xf5\xa1\x31\x05\x8d\x91\xe7\x93\x68\xe0\x4d\xbc\xef\xce\x50\x74\x09\xb3\x98\x25\x01\x76\xb0\x7d\x1b\x89\x5b\xd0\x98\x87\x31\x8f\x7c\x62\xb8\xf9\xee\x68\x7a\xf9\x6f\xbd\xb1\x8b\x39\x30\x4c\x92\xad\xb7\x9b\xc3\xfe\x0d\xa0\x7f\x2b\xdc\x58\xe4\x5b\x17\x89\x3c\x58\x89\x0c\xff\xe0\xa3\xe7\x4e\x63\xab\x27\xb4\xcc\x4b\xab\x59\x38\xc2\xa5\x8f\xdf\x91\x10\x01\xfe\x64\x2e\x6a\x37\x91\x36\xcd\x33\xee\x65\xc3\xee\xa1\x76\x1c\xb5\xe9\xf5\xda\xe9\x26\x8d\xdf\x88\x90\xc2\x53\x32\xff\xfd\x02\xd5\x7b\x57\x3a\xa5\xb1\x0a\x62\x04\x9e\xba\x36\x95\x4e\xbe\xa0\xbf\x07\x15\x32\xe4\x8a\x7b\x2a\x73\x7d\x33\xe6\x03\x99\xff\xb0\x2a\x01\xfc\xb5\x55\xf5\x7e\x6e\xca\xaf\x55\x76\xb6\x22\x87\xe8\x33\x7e\x34\x37\xc6\x93\x5b\x4b\x16\x4a\x9f\x73\xee\x88\x4e\x07\x89\xe7\x58\x4b\x91\x46\x9e\x69\x13\x77\xc7\xf1\x4d\x80\xd4\x58\xbc\xbe\x13\x59\xe1\x3b\x43\xef\xef\xfc\xd9\x60\x08\xf6\x69\x36\x4f\xd5\xde\xf6\x41\xd4\xed\x0c\x1c\xe1\x6c\x69\x6c\x28\xf5\xe4\x63\x1d\x11\xf9\x7c\xb2\x30\x36\xcc\x52\xf4\x64\x58\xea\xed\x95\x51\x27\x8b\xd6\xa4\x32\x19\xfa\x72\x22\x1f\xee\x0d\xb1\x11\x34\x71\xf5\x87\xfd\x4b\x96\xe7\x58\x77\x5e\x95\xf5\xd4\x12\x19\xc1\x85\xe3\x98\xed\x7b\x71\x1f\x84\x7a\x69\xc3\x9c\x39\xd7\x28\x09\x43\x6a\xb8\xd3\x38\xbe\x6e\x0f\xa5\x49\x18\x13\x8c\xc4\x1d\x03\xc2\xa1\xc4\x38\x7c\x32\x26\x15\x98\xe0\xac\xf3\x4c\x41\x48\x67\x30\x03\x34\x09\xa5\xc2\x4e\xeb\xff\xb3\x2c\x23\x5f\xc5\x09\x06\x24\xec\xf3\xb3\x3c\x89\x8c\x55\x1c\xda\xff\xf3\x4f\xb5\x01\x68\x12\x87\x0a\x65\x9e\x2c\xd2\x70\x71\x7f\xf7\xc1\x45\x93\x98\x23\xc0\xe1\x9f\xd9\x53\x96\x5f\x5c\x55\x84\x26\x09\x57\xa9\x53\x4b\x40\xa6\x9a\xf9\xb4\xe4\xf4\x5a\x32\x42\xb8\xe5\xf2\x39\x2b\x0a\x78\x11\x7f\xca\x13\x44\x93\x04\x74\x60\x57\xa4\x2d\x37\x3c\x82\x50\xcf\x9d\x19\x4a\x48\x10\xa4\x91\x9f\xe0\x2b\x0f\x86\xa2\x09\xe1\xd6\x76\xd5\xcf\xe5\xdb\xb1\x43\x45\x1e\x7f\x64\x6d\x70\x91\x95\x97\xfa\x98\x15\xc7\x0e\x85\xe9\x4f\x32\x01\xce\xe6\x63\x7b\x5f\x5e\xca\x6f\xb6\x87\xc9\x9d\x40\xb9\x85\x23\xb6\xe3\x37\x85\xfe\x07\x08\x3f\x05\x13\x96\x58\x9a\x9b\xb3\xc5\x94\x83\xe3\x9e\x70\x47\x79\xcc\x30\x1f\x24\x65\x39\x82\x54\xd1\x84\x4b\xa0\x81\xa7\xc2\x74\x4c\x72\x8b\x42\xb7\x1f\xff\xa1\xac\xb3\x0f\xa5\xe6\x68\xc2\x4d\x8c\x79\x13\x87\x30\x75\x6b\x75\xbc\x70\x92\x94\x0a\x9c\x9f\x65\x81\x0a\xfc\xc3\x7b\x4a\xa5\x45\x32\x9f\xc4\xaf\x35\xfc\xda\xf7\xb9\x87\x24\x55\x1a\xf3\x7b\x0d\xd4\xcd\x57\x2b\xc2\x89\x75\xf8\xee\xb8\x66\x58\xc8\x70\xa8\xc5\x7b\x78\xbb\x2f\x9b\x29\x54\x86\x26\x22\x08\x10\xb6\xf2\xf3\xdb\xf6\xb0\xb9\xdd\xee\x51\xcf\x7b\xfd\xfd\x71\x20\x3b\x40\x13\x29\xa2\x04\x7b\xcc\x6c\x16\xd4\xdb\xa9\x44\xa5\x12\x01\xc8\xb8\xc5\x77\x7f\x04\x86\xa2\x41\x97\x1a\xf2\x41\xae\xb8\x3b\x2a\x99\xaf\x57\x55\x42\xc3\xf2\xbd\x0b\xe0\x57\x03\x60\x9c\x1b\xad\x63\x83\x86\xce\x36\xe3\xcd\xfb\xee\x6e\x28\x50\x2b\xb6\xde\x71\xcf\x4d\x9b\x46\x69\x62\x78\xa8\x46\x48\x88\x99\xf8\x2c\x31\x22\x81\xa1\x15\xb3\x04\x39\xe3\xa7\x20\x01\x89\xe3\xce\x2d\x2e\xdf\x71\x5f\xaa\xae\xa9\xc3\x29\x09\x43\x41\x59\x87\x3c\xf8\x56\xea\x7c\x1a\x0e\x91\x30\xa2\x1e\x10\xbd\x78\xc2\x46\xe1\x4b\x8f\xdb\xf9\x17\xf9\xb7\x1f\x96\x04\x24\x1a\x57\xc6\xd7\x8b\xf3\xf9\x9a\x1e\xac\xcb\xc6\x90\xd0\x44\xa9\xe8\x98\xd1\x6e\xca\x6a\x91\xe7\x37\x1e\xbd\xec\x3f\x22\x89\x42\x11\x0d\xaa\x74\x7f\x13\xea\xe5\x5c\x4e\x8c\x32\x89\x44\xaa\xbb\x34\xcd\xbc\xce\xed\x6f\x93\x33\x1c\x47\xef\x1f\x50\x64\x5d\x35\x92\x44\x60\x59\xc9\xdb\x5d\xa7\xae\xe1\x9a\x42\x9d\x92\x38\x91\x58\xa0\xdf\xff\xfe\x38\x74\x62\x48\xcc\x04\xb7\xfc\x26\x2f\x50\xab\xe7\xb2\xcc\x47\x87\x93\x84\xe1\x1c\xb5\xca\xe7\x7b\xc8\x6d\x5a\x1e\xe9\x4d\xfc\x1a\xfd\x80\xfe\x62\x58\xec\x74\x57\x23\x51\x9c\x76\xdc\xbc\x65\xd5\x77\xb0\x52\x42\x44\x82\x4e\xc5\x43\xd9\x38\x4f\xc8\x1d\xa0\xda\x60\x67\xc3\x91\x1c\xc5\x6b\x53\x4e\xde\x20\xd7\x09\x36\xfc\x1f\xc4\x49\xd4\x83\x0a\x13\x49\x19\x43\x69\x17\x51\x14\xe5\xa5\x50\xed\xe7\x29\x1c\x31\x1d\xf7\x43\x04\x20\x1d\x65\x63\x05\x7a\xff\xb1\x29\xda\xe8\xca\xdb\x5b\x22\x02\x2b\xd3\xd5\x1a\x97\x02\xf2\x7a\xd0\x9a\x40\x89\x8c\x22\xd5\x51\x2a\xde\xff\x52\xfd\xdf\xa9\x07\x38\xba\xa6\xc7\xfb\xcf\x37\x0a\x22\x53\x81\xd1\xca\xdd\xee\x6e\x77\x44\xea\x6b\x34\x12\x23\xf6\x6b\x4a\x54\x22\xb0\xa9\x1c\xd9\xed\xcf\xbd\xe8\xfd\xe4\x62\x8a\xdb\x1e\xb6\xca\x76\xb7\xfe\xec\x7c\x86\x47\x50\xd9\x39\xeb\x6b\x2d\x44\x89\x04\x59\x78\xbe\xef\xd7\xeb\xec\x29\xeb\xf8\x79\x28\x51\xc6\x8a\xf1\x1d\x9e\x61\x7b\x3a\x95\x55\x23\xf2\x6e\x56\x6b\x99\x60\x18\xe0\xa2\x83\x7a\x51\xf8\x78\xb9\x46\xc5\xb1\x8f\x45\xb9\xc6\xf7\x09\x11\x80\xf3\x5a\x6e\x86\x9d\x70\xc3\xf0\x93\x18\xa6\x11\x90\x2f\x2f\xef\xdb\xa2\x29\xf7\xef\x85\x1e\x10\x9d\x52\x62\x8c\x0e\xad\xca\x15\xe6\xa6\x67\x51\x32\x94\x06\x31\x23\x0e\x7a\xd7\xfa\x59\x2b\xd1\xc0\x53\x59\x5d\x65\xd2\xdc\xe8\x90\x03\x96\x86\xb7\xab\xdd\x1b\xc0\x4b\xdc\xd1\x7c\x51\x1a\xf1\x20\x74\x16\x65\x99\x35\xaa\xcc\x8a\x2b\xd5\x1d\x4a\x23\x2d\xbc\x54\x6f\x17\x94\xf4\x82\x85\xa3\x25\x49\x63\x93\x60\x50\xbe\x3f\xe7\x59\xb3\xf9\xcf\x65\xd2\xe7\x49\x69\x12\x71\xcc\x65\x3c\x94\x65\x8e\xe4\x43\x4d\xf3\x81\x0c\x1e\xa5\x49\x9c\xc4\x81\x8f\xed\x1a\xd8\xb4\x11\x12\xe2\x6f\x93\xe9\x45\x65\xaa\xfa\xee\x8c\x21\x37\xc8\x2c\x56\xc1\x9d\x45\x92\x88\xba\x7e\x85\x11\x53\xf4\xf8\x89\x08\x50\x4c\x3b\xbb\xac\x08\x9a\x8a\x63\x57\xc2\x63\x7d\x09\x8f\xfd\xfb\xb7\xe9\x0f\xf3\x21\x95\xaf\xff\xdf\xce\x74\x50\x2a\x09\xbe\xfd\xc7\xec\x0c\x43\xa2\x0e\x4a\x59\x20\xd5\xa0\xb1\x69\x9d\xd5\xe7\x4b\xf3\xd7\xe4\x38\x28\x65\x61\x9a\xba\xd4\xfa\x4a\x9c\xef\x3a\x62\x00\x4a\x59\xc4\xd1\x43\x32\x00\xbd\x26\x08\xa5\x8c\x04\x98\x07\x74\x82\xbd\x59\xd3\x17\xd9\xbf\x7c\x5c\x16\xa5\x8c\xa4\x18\x95\x21\x7c\x34\xab\x6d\x60\xf6\x00\xd5\xb8\x65\x65\xfc\x36\x99\x66\xb4\xe7\x65\x7e\x84\xa7\x36\x4e\xec\x48\xd2\x07\x96\x8c\x72\xc2\xf1\x29\x9e\x2f\x08\x93\x19\x42\x3a\x28\xa7\x01\x6e\xaa\x0f\x37\x7f\x1c\xa0\x6e\x06\x36\x92\x72\x16\x63\x1f\xb1\x7a\x16\xd5\x13\x3c\x54\x65\x53\xaa\xb2\xdd\xcb\x3e\x37\x59\x34\x0d\x39\x9e\x27\xb4\x76\x0a\xb9\xf3\x0f\x90\x26\x5a\xdb\xda\x92\x45\x4e\x20\xf9\x7d\xaf\x02\x4c\xa9\x88\x6d\xce\xb2\xa7\x5d\x9d\x6c\xe3\x54\x9a\x50\xf6\x8d\xef\xab\x70\x32\x99\x55\x22\xb9\x25\xc9\x29\xc6\x3e\x0e\xd5\xb1\x85\x1e\x9c\xc5\xfb\xee\xd2\xfc\xad\x94\xf3\x51\x18\xd5\x84\x86\x58\xec\x13\x8d\xa5\x79\xf3\xf7\xa6\x53\xab\xb7\x30\x30\xc9\x0e\xed\xd4\x8d\x50\x49\xec\x32\x42\xb6\x8e\x84\x21\x55\x55\xfe\x7a\xf7\x60\xb7\xb9\x40\x95\x02\xb1\xf5\x30\x55\x9e\xda\x89\xba\x47\xc1\xa4\xd6\x9c\x0c\xda\x3c\xa6\xa7\xc8\x04\xe7\xe2\xc3\xa5\x99\xed\x95\xa0\x14\x20\x44\x3f\xad\x80\x37\xef\xcd\xdf\x86\x57\x98\xfa\x8f\xfe\x1d\x5d\x8b\x05\xd4\x2e\xb5\xbb\xf7\x75\xa6\x80\xf9\xda\x37\x0b\xb8\xc4\xf4\xd0\x09\x1a\xa1\x45\x23\x06\x7e\x33\x0b\x94\x44\xce\x97\x12\x33\xb4\x0b\xff\xe7\x30\x20\xd8\xc8\x0b\x8e\xa7\x79\x00\x2e\x1f\x76\xda\x50\x94\xaf\xb2\x1e\x9d\xe5\xff\x1e\x30\xc6\x51\x16\xb2\x10\x6b\xdd\x77\xdb\xfb\xed\xdd\xf7\xbb\x23\xc2\x38\x17\x77\xbb\xef\x5e\x79\x95\xb2\x38\x08\x63\x07\x2a\xfb\x76\x96\xf7\xa5\x86\x76\xef\x73\xc0\xdf\x59\xd8\x82\x3f\x91\x58\x18\x48\xed\x54\x04\x37\x95\x8a\x02\x8c\xb0\x2d\x3a\xbd\x37\x41\xac\x8d\xd8\xb9\x23\x8f\xb9\x02\x59\x77\xd9\xeb\xa9\xde\x27\x65\x89\x14\x1a\x3a\x0d\xc9\x59\x05\x52\xca\x48\x62\x73\x73\x76\xa2\x2f\x2a\xf0\xe1\x27\x23\x26\x21\x5d\x9c\xfd\xbd\xca\x26\x27\x52\x62\x9b\x34\xac\x41\x1a\x74\x21\xff\x49\xa9\x68\xde\x20\x32\x16\x25\x18\x65\x7e\x2b\x9e\x5a\x53\xb1\x1f\x70\x85\xcf\xbe\x3f\x16\x49\xdc\xf0\xf6\x38\xf7\xb3\xff\xc2\xa1\x74\xae\xd6\xff\xe7\xef\x27\x29\x1d\xe6\x92\x17\x8f\x87\xc9\x03\xf3\x58\x62\x4e\xc1\xe2\x63\x37\xff\x09\xb9\x5d\x13\xa1\xdb\x41\x42\x3e\x5e\xe2\x8c\x53\x01\xbd\x95\xc1\x52\xa8\xb8\x12\xfd\x77\x63\x53\x4a\xac\x44\x75\x8d\xd1\x17\xe8\xe5\xfb\xfc\x9a\x64\xc2\x51\x70\x59\x57\x0b\xb7\x68\x94\x84\x1c\x4e\x04\x37\x54\x47\x21\x46\x83\x8f\xbb\xdb\xcd\x1f\xfe\xb3\xea\x18\x52\x74\xc8\xe7\xc8\xfd\x28\xd3\xda\xf8\x36\x9a\x45\x85\x8c\x08\x93\xd7\x00\x2c\x8d\x42\x5f\x07\x6d\xac\x8c\xac\x9a\xa9\xbf\x33\x43\xa9\xad\x88\xb4\x4e\xd2\xce\xac\x27\x1a\xa7\x94\x19\x93\xd8\xb5\x7b\x76\x89\x45\xfb\x77\x1e\x84\xda\xeb\xab\x2f\x45\xd3\xe4\x23\xec\x2d\xe5\x81\x08\x3a\x81\x97\xbc\xc4\x98\xe3\xce\x7a\xa7\x30\x80\xa5\xcf\xed\x89\xbf\x8d\xaf\x63\x6c\x8e\xd4\x97\xfb\x1d\x0f\xef\x7c\x5d\xc8\x9d\x13\x86\x01\x92\xd3\xd8\x54\xcc\xf1\xa6\xac\x8e\xc3\x3b\x0f\x23\x4d\xac\x16\x6d\x53\xb5\xe6\x04\xcb\x00\x43\x72\x71\xca\x43\x12\xa2\xc1\x79\x28\x9f\x3e\x9d\xe0\x3c\x64\x96\x0b\x75\xb3\x5f\x2d\xaf\xd8\x74\x28\x8f\xc2\x18\xc1\x96\x9b\xc3\xb7\xe3\xe3\x66\xb5\xd9\xfe\xd8\xac\x8f\x77\x9e\x15\x9e\xf2\x28\xd5\xd0\xd3\x77\x6e\x9a\xe7\x99\x54\x1a\x8f\x8c\x85\x07\x7c\x45\xc9\x82\xec\x74\x39\x2d\xa1\x39\x0e\x18\xca\x29\x8f\x43\x8e\xcd\x70\xcb\xbb\xed\x6a\xb7\xf0\xf2\xfe\x0f\x55\xf9\x54\x89\xd3\xc9\x8f\x4a\x22\xc2\xfb\xa9\xee\x41\xad\xa3\xe7\x49\x78\x92\xc8\x89\x9c\x8a\x2d\xc4\x79\x2c\x7e\x37\x71\x79\xa2\x18\xa6\x50\x0e\xa2\x7e\x59\x95\xa7\x33\xea\x3a\xda\xf6\xe3\xf1\x03\x50\x42\xb1\x74\x8d\x33\xd9\x46\x1d\xf0\xb6\x79\x5c\x45\xc1\x27\x49\x3c\x4e\x39\x23\x4e\xb3\xc3\xb2\xd0\x39\xe4\xc1\xe4\x15\xb3\x20\xf2\x7c\x64\x87\x2c\x87\x35\xd4\xaa\xca\xce\x9d\x0d\x1d\x32\xdb\x51\xce\x68\xca\x1c\x23\x27\xd6\x2f\xfd\x9b\x61\xdc\x56\x62\x6c\x53\xb6\x07\x00\xd4\xdd\xe1\xd4\x36\xa6\xa9\xf2\x74\xca\x5c\x28\xee\x7c\x95\x91\x31\xe1\xcc\x84\x48\xba\x99\x83\x69\xc8\xc4\xb7\xe6\x69\x4c\x11\x36\x6c\xf1\x27\xfe\xda\x29\x48\x1b\xc7\x88\x46\x3d\xef\xa1\xd0\x7f\xc2\x4b\x4b\xb9\xe0\x01\xe6\x05\xac\x3c\xd3\x22\xcf\x0f\xe5\x39\x53\xdd\xcd\xca\x58\xa1\xff\xd5\xc3\x48\xb2\xb2\xf0\xaa\x9b\xf3\xba\x44\xfe\xcc\x44\x90\xde\xa5\x5c\x95\x79\x59\xa1\xe8\x54\x77\x65\x1a\xc5\x61\x4f\xe9\xb0\xd5\xfd\x6f\xa6\x21\xd2\xaf\x15\x97\xd3\xce\xac\x41\xe5\xa2\x02\x6d\x3b\x62\x77\xc6\x40\xfb\x9b\x0f\xb9\x28\xfa\xf1\x32\xb2\xb8\x22\xc4\x2d\x0d\x05\x7a\xb7\xae\x8b\x77\xf2\x95\x15\x0f\xb1\x5f\x65\xb5\xbb\xbb\xdb\xee\xf7\xad\xbf\xb5\xde\xfe\xf0\x97\x53\x9a\x09\xf0\x9b\xe0\xdf\x2f\xa5\xc7\xac\x53\xae\x59\x88\x0b\x6c\x20\x6e\xe7\xb0\xbc\xe3\xeb\x43\x12\x02\x9f\x32\x0a\x4d\xed\x3f\x07\x05\x98\xcb\xac\xe0\xb5\x7c\x01\x5f\x37\x5a\xda\x62\xd3\x28\xdb\x31\xbe\xba\x89\x23\x4b\xd0\xe4\xcb\x39\x77\x59\x81\x2b\xfd\xa6\xac\xee\xe1\x97\x15\x1f\x9f\x0f\xda\xb9\x61\xdc\xa1\xc0\x1e\xcb\x3c\xbf\x2b\x3f\x2e\x79\xf8\x13\x24\x43\x7f\x68\x20\xaa\xc2\xdc\xeb\x48\x03\xa6\xc2\xbe\xa7\xa7\xfd\x24\xd0\xdc\x66\xa2\x2e\x3f\x6c\x62\x1c\x99\xbb\x34\x4c\x58\x27\xc5\x69\x9b\x38\x26\x61\x6b\x1a\x12\x96\x38\x2e\xf9\xd2\xdc\x66\xbe\xeb\x82\xa6\x11\x81\x01\x6b\xb4\x53\xbb\xf2\x49\x95\xde\xaa\xa4\x11\x8f\x62\x07\x5d\xfc\x91\xc1\x1b\xe2\x29\x06\x84\x31\xed\x00\x91\xf4\xe8\x21\x57\x61\x19\x2e\xfb\x71\xd7\x90\x3b\x2b\x66\x9a\xf8\x95\x0f\x75\x7d\x57\x16\xf0\x3e\xce\x38\xa7\xb1\xe4\x96\x57\xa6\x9d\x8e\x0e\x23\xde\x1d\x4c\x38\x20\x2c\xd4\xde\xbe\xaf\xf1\xfc\xd5\x4a\xa5\xbb\x08\x09\x3a\x5e\x03\x0f\x6b\xd3\xdb\x42\x67\xaa\xc3\x4c\xa7\x84\xc4\xb1\x17\x72\xbb\x05\x51\xc3\x4c\x63\x1a\x4d\x89\xc3\xe5\x75\x2d\xce\x1f\xd0\x86\xfb\xe1\x3a\x65\x3d\x3d\xe4\xe3\x15\x63\x3a\x4d\x69\xc4\x93\xb4\x7b\x3c\xf7\x62\x1e\xe1\x9c\x43\x91\xd5\xcf\x6d\xe8\xb2\x6f\xca\x4a\x4c\xd3\xe8\x29\x8d\xa4\xef\x7f\xec\x5d\x0c\xa7\x4a\x3d\xfd\x05\xcd\xb0\x4f\xdf\xee\x3e\xbf\x67\xcd\xb4\xa4\x30\x7c\x67\xdd\x77\xa3\x31\x67\x91\x5f\xda\x0f\x56\x32\x12\x91\x41\xfe\x85\x51\x96\xf8\x9e\x5f\xec\x81\xc9\xea\x66\xc0\xa0\x4a\x53\x16\xf1\x58\x78\xbe\x4a\x04\x36\x40\x75\xdb\x71\x94\xd2\x94\x25\x11\x4a\x35\x40\x3b\x5f\x26\x33\x82\x13\xbb\x7d\xa3\xce\x96\xa8\xb4\xd5\x87\x1f\x20\xbd\x53\xce\x88\x05\x2d\xb7\xe1\xc0\x27\xbb\x59\xca\x53\xfb\x5d\x4f\xef\xfb\xa6\x2a\x8b\xa7\x6f\x1d\xf5\x02\x4d\xb9\x62\xc6\xf4\x5c\xca\x95\x9a\xbc\xe4\x34\xe6\x96\xe0\xb0\xf9\xf5\x0d\x44\x77\x5a\x4a\x2d\xfa\xe9\xe7\x1f\x5f\x87\x29\x8f\x54\x30\x85\x4f\x0c\xed\x56\xfc\x13\x64\x9d\xf5\xf7\x2b\x43\x62\x10\x20\x00\xea\xf9\x9f\xdf\xbb\xbf\xa6\x36\x43\xd0\x4e\xba\xe5\xfb\xd7\xaa\x2c\x4f\xdd\x21\x4d\xd0\xb2\xdf\x21\xf8\x61\x96\xed\xc9\x6e\xb3\xa3\xf9\x29\x4d\x14\x3b\x26\x93\xb2\x6a\xd6\xe5\x45\xe6\x80\x3c\x25\x1d\xd1\xe7\xbf\x27\xdd\xad\x34\x55\x61\x0c\x56\x6b\x16\x79\x33\x66\x04\x14\xdc\x40\x1d\x52\x83\xbd\x3f\x97\xe6\xb9\x6c\x83\x8a\xaa\x6b\x80\xa6\xa9\x56\x0c\x85\x06\xee\x96\x9b\x79\xd2\xbd\xf1\xb5\x20\xe4\x36\xdc\xb6\x0d\xf2\xdf\xb2\x66\x18\x5b\xa6\x10\x51\x7c\x0e\x9c\x7d\xe8\xbe\x2c\xf4\xa4\x04\x9b\x82\x88\xb0\x12\xaa\xab\xf2\xdc\x6e\x8b\x33\x5b\xb7\x1b\x69\xa8\xcd\xbf\x9e\xca\x02\x1a\x51\xbd\xef\x2f\x67\xa8\x86\x40\x8a\xd4\x08\x49\x31\x61\xbd\xfd\x63\x06\x6d\x9b\x1a\x13\x23\xeb\x2c\x9a\xf6\xcd\xfd\xfa\x18\xb9\x13\x45\x10\xa7\xb6\xa0\x88\xc2\xd7\xa3\xe8\x59\x04\x60\x8b\xf5\x96\x95\x04\x8b\xa7\x23\xa0\x93\x08\x43\x81\x9b\x64\x03\x75\x73\x23\xb2\xfc\xe1\x92\xe7\xad\xb3\x55\x5e\x9a\x61\x95\x49\x84\x91\xd5\x02\xaa\xa1\xe9\x78\x63\xfb\x3c\xc6\x5c\xda\xc0\x2f\x63\x11\x11\x65\x09\xc0\x9b\x7c\xec\x32\x89\x88\x05\xa1\xaf\x9f\xbe\xd9\x6e\x07\xff\x7b\x91\x08\x94\x03\xbd\xd8\xe7\xf2\x90\xc8\xd1\x5b\x11\xb1\x01\xac\xf6\x1e\x95\x28\xec\x9e\x3c\xb1\x52\x82\x04\x51\xe4\xfa\xb1\x30\x4f\x6f\x3d\x93\x9b\xac\xaa\x9b\x41\x60\x20\x48\x94\x06\x43\x98\xe0\x4f\x10\xe7\xb2\xf8\x53\x23\xef\xcf\x4e\x02\xee\x72\x05\xfb\x4c\xc3\x12\x9a\x0f\xf4\x7a\xdb\xa1\x21\xfe\xd0\xdf\xca\xec\x13\xbd\x3b\x3f\x98\x70\x2c\x01\x1c\x9f\xa0\xc0\x87\x7b\x14\x85\x2e\x4f\xcf\xa2\x7e\x76\x98\x8d\xf1\x78\x9a\x8a\xd4\x19\x3c\xaf\x5c\xb6\xef\xa9\x9e\xa8\x60\xdc\x36\x38\x20\xbb\x82\x23\x25\xbd\x8c\xda\x6e\x3f\x80\x52\x8c\x97\x8e\xe0\x10\x24\xae\x8f\xfa\xf6\xa2\x5e\x3a\xac\xd3\xe4\x76\xd2\xc8\x78\xdd\xed\x75\xa9\x7c\x1f\xcc\x1c\xa6\x40\x08\x4e\x90\x5f\xf1\xd8\xba\xcf\xe3\x29\x2a\xa4\xed\xe7\x35\x96\x74\xcc\x29\x18\x0c\xbb\x79\x84\x90\x76\x8a\x95\x45\xfe\xee\x2b\x10\x2b\x51\xac\xcb\xc3\x73\xe6\xb7\x57\x21\x23\x19\xc4\x9d\x3e\xd4\xbc\xad\x16\x32\x91\x21\xeb\xc4\x62\xca\x32\xaf\xfb\x44\xbf\x90\xba\xd3\x6d\x5f\x0e\xd3\xac\x42\x27\x96\x4d\xe0\x19\x51\xc4\x88\xee\x1d\x5f\x56\x0b\x82\x3c\x89\x03\x9c\xac\x80\x30\x40\x00\xe3\xf7\xfd\xfa\xb8\xdf\xdd\x1c\x8e\xab\xc5\x43\x77\x2c\x01\xc4\x32\xdf\x1c\x8e\xbb\x87\x8d\xad\x0e\x2f\x6e\x8f\x37\xdf\x3b\x6c\x95\x00\x62\x09\x2f\x7e\x17\x2f\x9f\x6c\x3e\x02\x9c\xb4\xa1\xed\xe3\x6d\xf7\xaf\xc5\xd3\x87\x89\x59\x01\xe0\x92\x5e\x22\x87\xf5\xa5\xfd\x4e\x9e\x9e\x17\x46\x6c\xca\x54\x98\x20\x40\x8e\xb7\xd6\xaf\x45\x26\x8f\xc5\xf4\x99\x0d\x67\xc2\x7d\xfd\xbd\x78\x05\x6d\xf9\xd7\xa6\xee\xbd\x30\xda\x38\x27\x37\x87\x21\x8d\xc3\xe7\x2b\xc3\x40\x14\x3a\x7b\x24\xaa\xa7\xe3\x24\xfd\x2b\x03\x16\xa3\x2e\xcf\x5b\x56\xb8\x14\x73\x57\xbe\x93\x41\xbb\x71\x5b\x8b\x50\x56\x1b\x9d\x35\xf5\xc0\xf0\xc8\x40\x59\x02\x9d\xcb\xf9\xa9\x42\xe6\x03\x30\xd9\xaf\x4e\x3f\x75\x0f\xaa\x74\xee\x3a\x1f\xe6\x1d\x64\xa0\x14\xee\x95\x9b\x5f\xcd\x8c\x96\xa8\x1f\xa4\x55\xe0\xb9\xad\xb2\x26\xfb\x2f\x14\xb7\xf0\x0a\x57\xba\x92\x7e\xb4\xb1\x89\x3f\xd7\x45\x3f\x6c\xf2\x1d\xed\xb8\x32\x4c\x00\xcd\xe8\x3e\x2b\x9e\x2e\xb9\xa8\xb2\x06\x37\xec\x38\xf1\xcf\x14\x92\xd0\xf3\x31\x6f\x90\x9e\x6b\xe8\x54\xcb\xd0\xd8\xda\xcc\xea\x71\xf7\x73\x8d\xed\x2c\x96\x02\x2c\xb4\x6d\x2d\x7e\x58\x14\x70\x6c\xf7\x38\xaa\x1c\x44\x65\x9b\x80\x44\xbe\x98\xc9\x78\xce\x4e\x44\x19\x85\xda\xb8\xba\x77\xbb\x11\x79\xb1\xdb\xf1\x33\x47\x4a\x5b\x2d\x5d\x8b\xac\x6f\x06\x1b\xb2\x8c\xa3\x14\x83\x1b\xa4\x5b\x6f\xd7\xd8\xce\x2c\xcb\xb2\x03\x62\xcb\x38\x06\x07\x77\xb9\x18\x93\xc3\xfd\x1a\xae\x90\x5c\x32\xd6\x09\x46\x8b\x47\xe1\x9b\x98\xe6\x6f\x36\x09\x6c\xd1\xd9\xab\x00\x14\x5a\x94\x93\x5b\x4d\x80\xa5\xca\x33\x06\x5a\x6a\x39\xf4\x51\x97\xef\xbd\x52\xcb\xe4\xaa\x84\x11\xe4\x8f\x79\xc9\xf2\xdc\xee\x6a\x93\xdb\xa3\x81\x15\x3a\x3e\x65\x45\x73\xb7\xf8\xc7\x27\xeb\x5a\xd2\x84\xa3\xb6\xf7\xd7\xcd\x7d\x70\x3c\xec\x0e\x8b\xdb\xe3\x6a\x90\xf7\x96\x94\x18\xec\xd4\x5b\x6e\x0f\x7f\xec\xfe\xd8\x75\x7f\xa6\x81\xe5\x20\xcf\xa0\x0a\xa7\x76\x54\x52\x1e\x25\x3d\xda\xee\xa7\xa8\xaa\xac\xac\x56\x3d\xca\x45\x52\xc5\x48\x1f\x0a\x59\x8b\xf0\x3f\x46\x42\xed\x35\xe4\x30\x91\xfb\xbd\xf0\xf8\x29\xdd\x1b\x9b\xb1\xb7\x39\x72\x1b\x24\xe3\x21\x42\xe9\x90\x8f\xad\x8d\x4f\x06\xbc\x70\x54\x32\xcd\x11\x84\xfe\x63\xfb\x70\x74\x75\x01\x7f\x88\x53\xcb\x1b\x69\x65\x65\x76\xe6\x0e\x44\xb3\x2d\xbe\x17\x99\x2a\x3d\x97\x3d\x95\x9c\xb1\x38\xf5\x5c\xcc\x0e\x2e\xeb\x13\x3e\x5d\xa8\x2a\xb9\x10\x48\xac\x52\xa3\x41\xb0\x2a\x0f\xa2\x81\x81\x7d\x97\x29\x35\x01\x19\x10\x3d\x76\x52\xfe\x96\x00\x66\xfc\x52\x04\x0b\xb1\x99\xf6\xe7\xf6\xf0\x6d\xfd\xb8\xf8\xe9\x2f\x22\x44\x8a\xd9\xc8\x85\xd6\x58\x47\x9f\x64\x83\xa5\x50\x31\xb6\x8d\x94\xaf\x50\x35\xcf\x55\xf9\x36\xca\xe9\x49\xa1\x18\xba\x77\x79\xa9\x5e\x96\x5d\xaf\x9c\x6c\xd7\xbc\xa3\x54\xaf\xb2\x27\xcc\x81\x96\x97\x42\x0f\xd9\x10\xfc\x48\xaa\x42\x47\x83\xb0\x14\xf5\x0c\x7f\x20\x95\x5a\x5a\xc4\x3b\xb2\x2d\xc7\xc7\xf3\xa0\xc6\x28\x4d\x4c\xf0\xf6\xad\xd4\x20\x0a\xa4\x6d\x0b\x55\x9e\xae\xf5\x46\xff\x6a\x35\x60\x62\x24\x4d\x42\x49\xcf\xd0\x31\x01\x4c\x49\x03\x11\x36\x7f\x74\x82\x39\x56\xf0\xd4\x1d\x56\x01\x11\xc2\x8a\x9d\x23\x20\x03\x13\x03\xdd\x31\xa1\xb0\x36\x63\x97\xc2\xbe\x11\x5d\x4a\x50\x85\x11\x4b\x7a\xe2\x76\x2b\x97\xd2\x1d\x4b\x99\x77\x79\xa6\x50\x35\x3f\x42\x1b\xdc\x04\x7e\x96\xd5\x0b\x54\xad\x8b\x31\x2d\x43\xfd\xa5\x27\x57\x51\x62\x7f\xa9\x3d\xba\x2d\x16\x55\xd5\xa7\xef\x7f\x1b\x9f\x38\x0d\x46\x54\xc4\x14\x42\x43\xbf\xdf\x6f\x0f\xfb\xec\x74\xce\xc1\xbd\xb8\xaf\x16\xe5\x3c\xb9\xe3\x38\x08\x50\x50\x06\xdd\xf4\x36\x46\xbe\x69\x8d\xc2\x5c\x9b\x88\x8a\xb9\x8c\x95\x27\xd8\xb9\xd4\xa3\xf4\x8e\x8a\xd3\x58\x50\x5f\x0a\xcc\xfe\x0b\xcb\x76\x55\xfb\x17\x97\x10\x85\xf5\x15\x51\x81\xe3\xc4\xb2\xc0\x87\x59\xec\x86\x4a\x8c\x42\xd5\xed\xa7\xd2\x17\x07\xc6\xeb\x49\x91\xd0\x12\xc1\x3d\x0b\x54\x0e\x2e\x2c\x50\x75\x10\x9f\xf9\x71\x2c\x8d\x86\x35\x86\xd5\xe5\x5a\x35\x83\x2a\x0a\x0a\x6b\x5f\x96\x03\xdb\xf5\x9d\xce\xe6\xfb\x14\x35\x09\x73\x24\x5b\xf7\xf0\xf6\x28\xfe\xfb\xd7\x42\x08\xc5\x22\x86\x55\x1b\xd3\x4e\x8b\x6e\x86\xb2\xc8\x0a\xb4\x16\xf0\xab\xb9\xa9\xca\xa2\xb1\x60\xb2\x85\xfe\xbf\x8b\x05\xea\x3e\x8a\x26\x2b\xbb\xd1\x86\x21\x65\xe1\x90\xa5\xc3\x72\x9c\xf9\x2f\xb7\x28\xb4\x55\xee\x18\x48\x88\x50\xc5\x09\x43\xbc\x8c\xbc\xbc\x5b\x86\x90\xa2\xd4\x7e\x09\xab\x54\x06\xd8\x05\xf6\x13\x8a\x9f\xa2\x18\xa0\x04\x94\x88\x25\xc2\x10\x3c\x95\xa3\xf7\x09\x3e\x2b\xd0\x28\xa1\xac\x3a\xd0\xcf\xe7\x71\xf9\x41\xc9\x34\xc4\x5e\xc6\xcd\xe1\xdb\xe6\xb1\xb5\xdc\xc7\xd5\xee\xfe\xf0\xb8\x5d\x7e\xe9\x06\x08\x44\xc1\xda\xf2\xde\x8d\xc8\x6b\x70\xc4\xbb\x83\xcb\x4b\x07\x9c\x43\xff\xdd\xca\x3d\x8c\xf2\x3a\x4a\x9a\x94\xb3\x09\x8f\xf2\xd7\xaa\xbc\xcc\x77\xba\x28\xc5\x68\xea\xe9\xe6\x51\xb2\xf7\xdd\xaa\x27\x4f\xa6\x9b\x4a\x03\x84\x6c\x1f\x0b\x78\x73\xbc\x05\xe3\x69\xa1\xb9\xd5\x31\x5d\xe4\xfd\xae\x82\x0a\xd3\xbb\xe2\xda\xe5\x9d\xf5\x07\x95\x36\x96\x11\xa3\xfd\x04\x7f\xcd\xe7\x52\xc0\x05\x75\x7b\xd9\x47\x0d\x16\xdd\x48\x85\xee\x84\x4b\x02\x66\x0d\x5c\x43\xc5\x15\x08\x91\x92\x01\x83\xdf\xd0\x8d\x54\x26\xa4\xc4\xa7\x03\x2b\x99\x8d\x2a\xcd\xd3\x55\x67\xb8\xb1\x32\x5c\x56\x8a\xbf\x2a\xb3\xe9\x0b\x35\x26\x40\xef\xca\xcd\x86\xc5\x1f\x7e\x36\x1c\x1f\x1e\xb7\x3f\x16\x87\x4d\xf7\xb3\x86\x84\x61\x07\x18\xc3\x9c\xd1\x4d\xf6\x0a\x33\xc5\x34\x1d\x90\x00\x91\x7f\xa6\xdd\xf0\x6e\xcb\x4e\x93\x87\xea\x80\x86\xc2\x3d\xd8\x60\x07\xd7\x81\x14\xa1\x25\xfc\x75\x95\xd8\x0f\x28\x08\x7f\x9b\x0a\x2b\x52\x1d\xa6\x01\x38\x25\xb7\x9f\xdd\x8a\xd1\x91\x54\x64\x24\x85\x89\xdb\xee\xb6\x30\x65\x47\xd6\x72\xf5\x69\x74\x9c\x06\xd2\x01\xf4\x67\x1b\x9e\xfd\x30\x61\x9b\x18\x6c\xb8\xe0\x27\xc8\xe3\x20\x23\xe2\x5f\xbf\x4e\x42\x41\x1c\x16\xed\xfe\xe6\xb0\x1a\x92\x54\x7f\x5c\x8e\xd5\x09\xa1\xa1\x4f\x15\x1d\x83\x23\x14\xf5\xa5\x82\xb5\xed\xa3\x41\x0d\xc8\x3d\x34\x87\xd2\xae\x4b\x7f\x8a\x62\x83\xe4\xb3\xa3\xd5\x45\x15\xa8\xf1\xf2\xd0\x89\x96\x18\xc2\x34\x20\x4e\xab\xf2\x74\x16\xc5\xfb\x20\x51\xab\x49\x92\x18\xdf\x58\xd2\x8c\x90\x42\x9a\xc6\xc6\x72\x4f\x65\x27\x4c\xea\xec\x64\x9e\x59\x82\x97\x21\x9d\x8c\xa6\x49\x88\xcc\x8f\x47\xec\xa2\xc2\xf6\x14\xd7\xf2\xdb\x5d\x48\x42\xe2\xa8\x2d\xb0\x6e\x05\xad\x57\xf7\x02\x1f\x34\x6e\x6b\xce\x62\x44\xcb\xf9\x17\xbd\xd3\xda\x96\x65\x67\x57\xa2\xe6\xd2\x4a\x0d\xb6\x21\x70\x79\xea\x76\xcf\x39\x9b\xa3\xb9\x09\xb1\xc9\xcd\x21\xc9\xa0\x68\xb0\xdd\xe5\xa7\xa5\x5e\xb6\x20\xd8\x61\x1f\xcb\xb0\x6a\xe5\x2e\x91\xc6\xa4\x47\xdd\x64\xff\x85\x23\xf2\x9c\x8c\xbf\xae\x17\x59\x6a\x47\x1b\x5f\x77\x71\x80\xc4\x45\x51\xbf\x41\xf5\x3b\x28\x25\x5e\x22\x42\x27\x0b\x29\xa5\x81\xec\x21\x29\x87\xe7\xd6\xac\xcc\x24\x77\x6d\x76\x98\xfb\x93\x52\x85\x80\xad\x7b\x78\xeb\xfc\xcc\x19\x85\xdc\xc9\x7b\x13\xa1\x25\x5f\xf5\xfb\xb3\xce\x6a\x04\xf3\xe9\x59\xb6\xd2\xc9\xb9\x4c\xa7\x76\xd6\x94\xd5\x93\x28\xb2\xff\x7e\x80\xa2\xd2\x42\x4a\xe3\x1c\x3a\x6b\xbc\xf7\x43\x3d\x13\xaa\x25\x09\x59\xd4\xd9\xbd\x97\x81\x21\x18\x5f\x47\xa5\x0c\x41\xb0\x5e\x40\xc7\xf2\x3f\xf9\x8f\xdd\xcd\x34\x4d\xb9\x0c\x7d\x1b\x62\x55\x37\x9e\x07\x6b\x53\xe8\x75\x5f\x5f\xd0\x5a\x01\xe6\x87\x7e\x66\x79\x3e\xd8\x76\x35\x04\x31\xae\x5e\xbb\xbb\xf9\xed\x51\x1b\x01\xde\xf5\xfa\x0a\x85\xa8\xca\x35\xbc\x22\xec\xa2\xce\x9e\xc6\xab\x0d\x82\x08\xb0\x55\x30\x2b\x5e\xa1\x68\xf7\xb4\xdb\x01\xdf\x35\x85\x30\xd0\x18\x1d\x6c\x57\x3b\xcf\xa4\x51\x8f\xd2\xca\x10\x46\x1c\xb1\x38\xcb\xcd\x08\x71\x09\x21\xe3\x58\xb7\x3f\x74\xfc\x21\x10\x0a\xab\xd1\x6d\x85\x10\x6c\xa9\xb4\xa7\x59\xa8\xa7\x6f\xd2\xdb\x28\x88\x92\xc8\x09\xf6\x57\xc5\x50\xad\x77\xf4\x89\x21\x62\xb6\x4a\xf3\x84\xec\xe6\x3d\x96\x79\xa6\x12\x06\x71\xa4\x11\x02\x71\x6c\x2f\x69\xcd\xaf\xad\x0a\x8f\xa6\xd2\xf8\xfa\x71\x6c\x23\x84\x27\x0b\x9d\x3f\x46\xbe\x9c\x0a\xb1\xb2\xe8\xec\x6f\x8b\x7f\x2c\x0e\x3b\xbb\x43\x2d\x1e\xbf\xee\xfa\xe3\x46\x79\x4e\x6d\x4b\xd8\xf8\xbd\xdf\x70\x20\x21\xcc\x04\x4e\x30\x6d\xe1\x39\xa7\x29\x24\x3c\x8a\x46\x2c\x24\x5e\x6e\x7a\x8a\xd7\xfb\x8b\x41\xd2\x6f\xd7\x5d\x0a\x90\x18\x8a\x7b\xaf\x4d\x08\x6e\x57\xbb\x59\x0c\x32\x10\x42\x23\xea\x73\xb7\x4f\x43\x68\xaf\x1f\xc0\x45\x68\x3b\x29\x1b\xa1\x9e\x87\xd2\x16\xde\x0a\x01\x8b\x19\x52\x1c\xda\xb6\xd8\x35\x9c\x4a\x55\x09\xf5\xde\x7f\xfe\x0f\x3d\x9f\xff\x29\xa3\x00\x2c\x31\x81\x9b\x05\x03\x34\xff\x00\x37\x01\x4c\xf1\x40\x7b\xa4\x08\xaa\x9c\x57\xcd\xa2\xd0\x6e\xc5\x7d\xc8\x31\xec\xce\xe6\x01\xc3\x6c\xac\xd0\x7a\x26\x73\x3c\x1d\x1c\x69\xdc\x18\xee\xee\xd0\x52\xf8\xbf\x12\x89\x31\x54\xad\xc4\x19\xbe\x89\x46\x3d\x77\x47\x8c\x65\xe4\x7e\x04\xd5\x88\xe2\xe9\x5a\x56\xc8\x8d\x4b\x63\x86\x9c\x9c\x42\x6b\x84\xaf\x7c\x40\xc8\x3d\x0e\x94\x20\x35\xc0\xbb\x9d\x73\x98\x27\x01\x11\x30\x2c\x8c\x58\xd2\xd6\x4b\x95\x81\x1e\x1d\x97\x94\x62\xba\xbc\xca\x9e\x9e\x1b\x12\x4c\x16\x9e\xd4\x14\x49\xda\x35\xbc\x3e\xc2\xa0\x9d\xa0\x3b\xdb\x30\x66\xb1\xd7\xaf\x20\xf2\x55\x59\xd4\xad\xbf\x70\xf5\xa2\xdd\x68\xa5\x28\x77\xf5\x84\xcb\xf9\xaf\x65\x80\x41\x41\xaa\xa5\x85\x46\x0d\xf7\x13\xf4\x62\x2e\x96\xad\xf2\x32\x20\x40\x03\x1d\x09\x24\xcb\xd8\xdd\x6f\x8e\x87\xdd\xef\x9b\xfb\xbd\xbf\x57\x1d\x53\xcc\x4c\x6e\xae\x3f\x0e\xa4\x89\xe5\x12\xcd\x5e\x01\x43\xec\xb7\xb2\xd2\xf5\x28\x70\x01\x10\x0c\x99\x98\x1e\x85\x31\x39\x0c\x84\xff\x3e\x8c\xdd\x01\xa4\xc6\x24\x73\x2e\x2e\x85\xea\xb1\x5c\x60\x62\x46\x5d\x8e\xf4\x61\xa8\x30\xe1\x0f\x1b\x8b\x52\xa8\xa1\x0d\xe3\xcc\xe5\x5a\xa2\x7d\xfe\x5d\x99\x20\x0c\x31\x6d\x77\x2e\x4b\xff\x85\x4c\x00\x51\x14\x76\x04\xb7\x87\xec\x04\x77\x5e\xce\x88\x9a\x88\x68\x4c\x13\xde\x66\x85\x16\xff\x7b\xae\xe6\x4f\x02\x9a\xb9\x46\x02\x13\xc7\x46\x45\x7d\x7e\xf8\x72\x5e\x41\x3e\xa9\x15\x98\x98\xda\x8e\x46\x9f\x3a\xc4\x2d\xf0\x5b\x89\x7d\xa1\xd3\xc2\x82\x89\xb9\x0d\x4f\x9f\xa1\x2a\xb1\xf9\xc9\x3f\x5c\xac\x24\xb1\xea\x3c\x2f\x1d\xdf\x3f\x35\x89\x50\xa6\x8f\x80\xac\x73\x38\xef\x2f\x98\x44\xdb\x68\xaf\xc9\xba\x4f\x67\x08\x8b\xc1\x81\x4c\x9a\x52\xe6\x42\xbd\xe4\x57\x24\x2f\x86\x06\x06\x21\x03\xfb\x87\xed\xef\x3e\x82\x31\x3c\xe5\x48\xa6\x70\x5b\x3e\x39\xd7\xd7\x6e\x4b\xde\xb3\xac\x3e\xca\x52\x1b\x0e\x56\x8b\xee\x6c\xb5\x28\xf7\x22\x07\x27\x0a\xe1\x33\xba\x26\x55\x80\x1b\xe4\xb1\xce\x4b\xe4\xa1\xcf\x9a\xfb\x89\xac\x3e\x35\x22\x32\xcc\xf4\xbc\x64\x05\x92\x47\x7e\xca\x5b\x64\x44\x9a\xca\x4e\xc4\x6c\x7f\x39\xe7\x1d\xbb\x9c\x51\xa1\xc0\x7a\xf4\x8d\xb8\x01\x47\xb4\xd4\x1f\x02\x9a\x78\x6b\x64\x9b\x6e\x11\x1b\x3b\x1e\x44\x6d\x7f\xc5\x43\xff\x54\xcb\xcb\x24\x27\x65\x94\x96\xd8\xa5\x74\xca\x8a\xe5\xe5\x7d\xd8\xd7\x60\x74\xcc\x43\xd1\x69\xda\x2f\x61\x12\xc5\x1a\x9d\x70\x64\xe8\x3b\x3c\x57\x00\x75\xf6\x34\xe2\x19\x34\x3a\xb5\x2d\x0c\xae\x49\xcb\x61\x8c\x2c\x0d\x85\x1f\x03\x3a\x86\xa8\xc7\xa4\x57\x23\xe5\x47\x6a\xc0\xa4\x18\x26\xd7\x97\x42\x97\x6f\xdd\x73\x99\x50\x31\xcf\x0c\x02\xc8\xef\x77\xe8\x80\x2d\xdd\x18\x32\x24\x1c\x76\x3f\xee\x2e\xcc\x82\x30\x0c\x30\xd6\x5d\x96\xe5\x0b\x62\x28\x37\xcd\xf3\x8f\xb0\x3b\x9a\x1a\x99\x38\x5b\x85\x39\xe6\xf9\x66\x83\xde\x17\x60\x41\x68\x40\xb4\xaf\xea\x6b\x29\xb3\xff\x0e\x3e\x02\x0b\x22\x30\x41\x8f\xf6\x3a\x97\xb5\xc8\x77\xd6\x89\x16\x43\xb0\x9b\x1b\x1d\x87\x26\xb5\xd4\xf3\xaf\x59\x0d\x55\x6d\x0b\x03\x4e\x74\xd9\x8f\xe1\xa1\x71\x60\xf7\xad\x2a\x3f\x60\xc7\xea\xc6\x2a\x24\xed\x42\xfa\x4b\x91\xdf\x94\xd5\x9b\xa8\x9c\xec\xed\xf0\x63\xb2\x20\x16\x01\xd6\x01\xff\x73\x29\xab\xcb\xa9\xfb\x2d\xc9\x8c\xeb\x2e\x48\xd6\xd9\x6b\xbd\x7b\x1b\x38\x51\x7e\x8c\x0a\xc3\x41\xa7\x59\xdf\xa8\x31\x9b\xda\x64\x41\xe2\x08\x87\xfc\x5e\x37\x91\x58\xfc\x6d\x7c\x5f\x89\x8a\x98\xf3\xf1\xf7\xcf\xd9\x79\x90\x29\x61\x01\x49\x13\xd5\xd1\xa5\xb7\x7b\xf9\xb0\xde\xcd\x02\x22\x62\xac\x8f\x9c\xb2\xa7\xa1\x6c\x34\x0b\x18\x49\x31\xc2\xcf\x05\xca\xba\x82\xb8\x7a\x1b\x0c\x02\x0c\x0d\xf2\x52\x78\x2a\x97\x9e\xbf\xe1\x5f\xfc\xdf\x83\xee\xa9\xc9\xfd\xf2\x94\xa0\xb1\xac\xc4\xa0\x7a\x79\xed\x45\xb3\x80\x0b\x16\xb9\x82\xc0\x63\x59\x7e\xca\x6e\xc6\x02\xae\x19\x96\x93\x2f\x85\x47\xab\xb5\xbe\xf6\x30\xe7\xed\x07\x1a\x6a\x11\xe5\xa2\xf6\xe0\xc8\x31\xf9\x1b\x0b\x84\xb4\xf4\x40\x88\xb1\xf8\x2f\x4c\x9e\x5c\x68\xd2\x03\x5d\xbe\x17\xca\x32\xdb\x0e\x09\xab\x58\x20\x03\xc6\xbd\x7e\xfa\x7b\xdd\xc0\xb4\x23\x79\x72\xf3\x32\x4d\x11\x1f\xd4\x54\xd9\x6b\x07\x3a\x63\x81\xd4\x32\xb6\x2c\x55\x1f\xb1\x83\xb2\x40\x45\x5c\x44\x2e\x78\xc9\x5f\xf3\x8f\xeb\x78\x2c\x80\x50\xa3\xb5\x93\x58\x0f\xfc\x21\x3a\x24\x3a\x0b\x20\xb2\x38\xfa\x4b\x61\x05\xbb\x5d\xc9\x74\x9a\xc4\x66\x01\x50\x9d\xb8\xc5\x7a\x7b\x51\x2f\xef\xc5\x80\xcf\x83\x05\x20\xa3\x84\x74\xa5\xaa\x76\xbe\x4d\xdd\x35\x16\x00\x48\xf4\x61\xb2\x8e\x01\xc2\xfa\x17\x13\xd2\x09\x16\x18\x13\x83\x6b\xa7\xc1\x52\x77\x3d\x2d\x70\xb0\x30\xa0\x01\x74\x8c\xdf\xea\x65\x92\xeb\x61\x61\x18\x02\x3a\x6e\x6b\x78\x7d\x2d\x1b\xac\xb0\x5f\x0a\xed\x80\x83\x6e\x4c\x14\x5a\x3e\xdb\x63\x65\x49\x21\x1d\xb3\xd1\xf8\x42\x51\x02\xf8\x81\xda\x8d\xb3\x12\x0d\x3c\x7c\xa0\x04\x31\x0c\x4a\x58\x18\xd1\x04\x37\xcd\x2a\x57\x47\x47\x54\xd2\xfd\x2a\x25\x9c\x76\x1a\x22\x50\x0d\x40\x3c\x93\x5f\x16\x2c\x32\x56\x4b\xaf\x34\x4e\x31\x6f\x68\x3e\xc3\x48\x25\x3c\xf5\x22\xaa\xcd\xb5\x2e\xc4\x78\x12\x84\x31\x91\x4c\x8e\x64\x9b\x5e\x60\xf0\xa1\x27\xa3\x93\x40\x2a\xcb\x1c\xef\xe0\x08\xd7\x64\x6a\x2c\x24\x49\x10\x24\x3d\x61\xb3\xfd\x9c\xbd\xa8\xed\xc8\x7e\x87\x84\x50\x6c\x33\xb0\x09\x9d\xa5\xd0\x4f\x53\xea\xb5\x81\xc7\xcb\x42\xc2\x2d\xa6\xaa\xce\x9e\x8a\xcb\x19\xf5\x28\xa6\x32\x22\x93\x9a\x13\x0b\xa9\xb4\x11\x6f\x5e\x16\x4f\x07\xa8\x4e\xcb\x8b\x7e\x1a\x02\x47\xfd\x9b\xa3\x26\x61\xae\xbd\x65\x75\xa9\xaa\x61\xde\x81\x85\x8c\x10\x9f\x39\xf9\xfb\xa5\x6c\xba\x0f\xc7\xa4\x44\x6c\xf3\x8f\xf2\x17\xe4\x0f\xb9\x98\xca\xe9\xf1\xeb\xff\x75\x67\xf2\x58\x09\x97\xa7\x5d\x89\x3c\xbf\x41\xee\xeb\x4e\xfc\x8e\x85\x9c\xda\xe3\x5f\xa1\xb9\x15\x35\xd2\xf9\x4c\xb3\x97\x2c\x4c\x43\x9b\xf7\xb1\x33\xf9\x9a\x97\x80\x85\x69\xcc\x49\x62\x7b\x7a\x16\xc5\x13\xa0\xd0\xc9\x5a\x34\x48\x12\x79\xb5\xd5\x84\xa9\x64\x36\x59\xf9\xe4\xa8\x0c\xdd\x5b\x98\x9f\x3c\xa9\xb6\xea\x17\x75\x53\x9e\x97\x22\xcf\xcb\xee\x75\xa9\x20\xb0\x69\xf6\xd6\xad\xac\x86\x2d\xbd\xfd\xd9\x9a\xc7\xb1\x67\x76\x3f\x36\x6f\x25\x72\xd3\x6d\xfe\x33\x72\x69\x58\xa8\xd3\x28\xe9\xda\x6a\x76\x66\xd3\xc6\x84\xfb\x2c\xef\x44\x52\x59\xa8\x45\x1c\x7a\xb2\x91\x07\x27\x7f\x86\x90\x15\x7f\x5c\x83\xa5\x70\x80\xd7\x7a\x64\x96\x43\x6d\x2c\x8f\x4d\x83\x65\xb5\xe3\x73\xd6\xdd\x3f\x98\x00\xdd\x00\x70\x3c\x1e\xc7\x4a\xf4\xdf\x1c\x8c\x8a\x2d\x72\xd6\x54\x50\x3f\xff\x14\x59\xf3\x20\xb2\x6a\x09\xcd\x76\x5d\x2f\xdf\x2d\x65\xf8\xd4\xfb\x63\xa1\x51\x61\x12\x8f\x24\x49\x87\xc9\xaf\xf6\xb8\x24\xa2\x0b\x5c\x1d\xca\x6e\xf4\x79\xa2\x20\xb6\x54\xd4\x27\xf1\x02\x43\xc7\x90\x45\x01\xe5\x58\x58\x7d\xf3\xcb\x01\x91\x51\xad\x69\x73\x9a\x79\xdd\x40\x05\xa1\xcb\xe9\x1f\x7e\x1d\xca\x47\x2f\x5b\xfe\x27\xf9\x1d\x77\x76\x18\x86\x68\x2e\xbe\x5b\x8c\x92\x90\x59\x9e\x35\xef\xb6\xc1\xd4\x0f\x49\x04\xaa\x0f\xb8\xb6\x62\x07\x9c\x76\x8e\xc6\xf8\x71\x42\x6a\x1b\xfe\x11\x63\x98\xa9\x3d\x14\xba\xfb\xac\x51\x98\x1a\xcc\x02\x6c\x9e\x4d\x56\xd5\xdd\x83\x86\x20\xa5\x40\x38\xeb\x0b\x14\xf7\xe2\x04\x8e\x09\x7e\x68\x26\xa2\x48\x70\xcc\xf8\xb6\x5f\x0d\x67\xfd\x5a\xbc\x77\x68\x3a\x16\xc5\x11\x51\xac\x5b\x35\x5d\xf7\xa3\x3f\x4a\x18\xc2\xdc\x0f\x97\xa6\xac\xfa\xed\x37\x8a\x53\xab\x3b\x5d\x43\xd3\x59\xb3\x99\xd4\x20\x8b\x92\x30\x45\x16\xd3\x7f\x42\xf5\xf2\xa5\xff\x9b\xe0\x5e\x0e\xf2\xbc\xb4\x7d\xf0\xd3\xf3\x94\xe1\x16\x1b\xb1\x5a\x7c\xc0\xbd\xc4\x22\x42\x02\xdc\x29\x30\xd0\xfb\x3f\xa1\x5e\xe6\xd7\x66\x44\x24\x47\xdc\x5f\xbb\xd1\x2d\x9e\x2a\xe8\x26\x00\xd1\x5c\x88\x7e\xab\xd1\xad\x93\xb8\x68\x46\x84\xc7\x93\x4b\x51\x25\x15\xef\x70\x72\xed\x63\x3b\xab\x30\xbe\x33\xaa\x23\x45\x3c\xe6\xdd\xb8\x1d\x6c\xe2\x27\x46\x2c\xb2\x5c\x88\xad\x27\xb9\x6a\x37\x08\x4b\x03\x56\xfa\xbb\x63\x89\x90\x1e\xe8\xd8\x58\xc1\xa6\x65\x79\x79\x7a\xfe\xdc\xdd\x8b\x18\x23\x60\xfc\x4c\x12\x0d\xf4\x8c\x20\xe2\x1d\x30\xa4\x1c\x62\xd8\x3e\x4a\xf3\x7c\xbc\xf1\x44\x3c\x0a\x10\x94\xf1\xbb\xc8\xb3\xe1\x7e\x1b\x71\xa1\x90\x85\x60\xff\x80\xa9\x9d\xee\xcf\x5a\xe3\x62\xff\x2a\x4e\x70\x93\x15\x59\xfd\x7c\xf5\x25\xb9\x91\x08\xe6\x78\xdc\xdd\x6e\xb0\x7f\xf8\xfb\x83\x3f\x3b\xa5\x81\x76\x32\xe6\xdd\xfe\x36\xc5\x80\xb3\x28\x4d\x55\xe0\x12\xdc\x8e\x61\x60\xaa\xca\xc7\x22\xc1\x62\xd2\x57\x74\xd6\xa5\x42\x22\xbc\x87\x32\x1f\x23\xa2\x59\x24\xd2\x04\x3b\xc2\x16\x55\x0d\x85\xc8\x5f\xeb\x3b\x51\xac\xb2\xa6\x5b\xd6\x42\xd2\x2e\x2c\x73\xf0\x92\xd6\xa3\xfe\x56\x8e\x6a\xbb\x7e\xb0\xb2\x74\xe3\xed\xf2\x47\x8d\xd9\xc9\x8f\xc9\xd8\x76\x4f\x7f\xdd\xed\x6e\x17\xc7\xef\xf7\xdb\x83\xff\x19\x99\x5a\xc2\xd9\xd6\x1e\x37\x3d\x18\xff\x28\xdf\x8f\x55\xf9\x36\xf9\x19\x45\x43\xe8\xc2\x99\x85\x2e\xcf\x0d\xe8\xc5\xaf\xcc\x39\x3d\x7c\x10\x6f\x46\x2a\x15\x01\xd8\xde\xaf\x73\x56\xcd\x13\xd5\xb1\x48\x19\x86\xc1\x00\x76\xd2\x91\xc9\xaf\x69\x2e\x3c\x9d\xc5\x3a\xab\x40\x35\xa5\x6d\xe9\x98\x5f\x7f\x10\x24\xc4\x25\x16\x8f\x67\x47\xe3\x73\x54\x6e\xd3\xfd\x0b\x13\x0e\x42\x20\x91\x67\x59\xff\x91\xc1\x9b\x7b\x43\x71\x10\xa5\x4e\x36\xb9\x6a\xc3\xed\xf9\x9a\xdc\x38\x0b\xcd\xe2\x80\x32\x11\xfb\xab\x61\x0e\xba\xbb\x1c\x44\xa1\xbb\xcf\xbd\x55\x1d\x51\x2f\x63\xda\x1f\x37\x30\x4a\x22\xcc\xe7\x9c\x73\xf1\x3e\x86\x80\x77\xbf\x12\x25\x04\x27\x7d\x81\xf6\x54\xe4\x59\x93\x41\xbd\x1b\xf7\x4e\xb2\x38\x0e\x92\xd8\xf4\xc2\x6b\xcf\x59\xae\xb7\x13\xbe\x7b\x16\xc7\x4a\x62\xa1\x6f\x65\x19\x9c\xf0\x82\xf7\x00\xba\x0f\x2a\xaf\x56\xef\x28\xc1\xeb\x2f\x63\x00\xbb\x1f\xf7\xbf\xff\xc3\x53\x7d\xb2\x38\x89\x38\xfa\x9c\xae\xf9\xb1\xf1\xe8\x11\xcb\x9b\x34\xf0\x23\xfb\xf9\x13\x27\x91\x8e\x3d\x43\xf0\x35\xb8\x60\x80\x77\x9a\xc1\xc9\xb2\x38\x49\x05\xe6\xac\xd1\x72\xac\x41\x65\x27\x91\x4f\x2c\x63\x4c\x68\x27\x14\xff\x23\xab\x2e\xf5\x28\x87\x11\x53\x66\x6d\xf0\x8f\xf5\xfd\x9f\x76\xc2\xb0\x98\x87\x16\x18\x87\x2e\xf8\x1e\x5a\x5f\x03\x2b\xcb\x93\x2f\xc1\x23\x4b\xfb\xe0\x5a\x80\xae\x5a\xbe\x59\xcc\x55\x3c\x68\x12\xfa\x81\x52\x9a\x08\x33\x1d\xdf\x7b\x1a\x1b\xb4\x44\x0f\xdf\x1f\x57\x88\xe0\x5d\x6f\x7f\x6c\xd7\x9b\x47\x7f\xf7\x29\x23\xc2\x76\xe4\x37\x9b\xfb\xaf\x9d\x28\xe5\xa7\x36\x3d\x16\x81\xad\xfa\xaf\x41\x74\xea\x7b\x2c\x16\x51\x38\x48\x96\xfe\x84\x01\x17\xf0\xe4\xf4\x48\x5a\xfa\x65\x97\x44\x1a\xf9\xf3\xb1\x48\xb8\x48\x46\x74\xb7\x37\xdf\xd7\xeb\xeb\x18\x62\xbc\xaa\x63\x91\x58\x52\xb3\x02\xde\x7c\x72\x6a\x1e\x73\x34\x96\xfb\x62\xb1\x60\x01\xe6\x5f\xd1\xa6\x9d\x32\xaf\x30\xe9\x8e\xaa\x54\xa3\xdb\x8d\x33\xb2\xe3\x3d\x2f\xab\x75\x86\x78\x00\x87\x33\xfd\xb8\x3d\x97\xc5\x4a\x32\x0d\x5d\xfa\xee\xd1\x22\xda\xeb\x9b\x12\x7b\xa9\xaf\xca\xf4\x2c\xd6\x11\xc3\x4c\x61\x53\x89\xac\x08\x27\x9f\x53\x53\x25\xa2\x4e\x62\x64\x48\xf9\xc7\x62\x2d\x35\x92\xcd\x7c\x2d\x2d\x3e\x51\x96\x8d\x15\x4a\xf7\x50\x5d\x16\x6b\xc5\x12\x17\xa9\xa3\x17\x7a\x28\x87\x91\xcb\xe7\x1e\x66\x0c\x49\x8a\xbc\x61\xcb\xb2\x3c\x21\x3d\x80\xa7\x5b\xfb\x20\xbc\x8b\x41\x44\xf1\x00\x3f\xd4\x28\xcb\xc8\x3c\x99\x0d\x20\xe2\x24\x74\x22\xe6\xd9\x6b\x96\xc3\x13\xcc\x26\x00\x63\x13\x45\x18\x2d\x56\xad\xc3\x70\xb1\x32\xa2\xbf\x5d\x06\x72\xa2\x2c\x36\x2a\x08\xad\x69\x76\xd8\x7c\x74\x64\xec\x0b\xe6\xff\x53\x41\x91\x8f\x8c\x95\x01\x89\x38\xf7\xd6\x0f\xa6\x69\x27\xa8\xca\x92\x40\x26\xe8\x91\x3e\x89\x13\x38\x79\x00\x1b\x7f\x0b\xcf\xd4\xce\x92\x90\x44\xd4\xf8\x36\x69\xbb\x20\x86\xa4\x65\xed\x00\x8b\x67\x38\xda\x0e\xee\x69\x12\x71\xf4\x16\x92\x28\x54\x5c\x0d\x29\x2f\x70\xf1\x7c\x92\x4d\x4a\xe2\x90\x22\x7e\x1e\xfb\x0a\xbe\x9f\xbf\xcc\x65\x40\x92\x98\x4a\xac\x3e\x21\xf8\x68\x77\xfe\x13\x15\x53\x96\x24\x51\x68\x01\x07\xdb\x87\x28\xf0\x0f\x92\x28\x83\xe5\xb4\xaf\x56\xd7\x0d\x0d\xe5\x73\xd3\xc3\x3d\x59\x92\x68\x2b\x40\xdb\x8b\xbd\xda\x92\xf3\x7c\x77\x04\x4b\x48\x1c\x23\x8b\x4a\x3b\x26\x08\x77\xaa\x89\x82\x90\xfb\x9f\x23\x49\x14\x29\x1f\x30\x5d\x4d\xe2\xe1\x22\x4f\x68\x90\xa2\x6d\xfa\x7e\xbf\xf2\x67\xd3\x88\x23\x12\x04\x3b\x93\x77\x66\xdf\xc7\x98\x09\x95\x7a\x28\x9a\xd5\x2b\xf5\xb3\x04\x2d\x66\x6b\x0f\x2a\x10\x2f\x3e\x3e\x59\x42\xf3\x06\x50\xb8\xa4\xcf\xa2\xd0\xdb\xd5\xae\x3b\x41\x18\xac\x32\xa3\x9f\x6b\x71\xc1\xcf\xd9\x79\xae\x8e\x33\xfe\xce\x4c\x26\x5c\x62\x09\xb8\x8d\x39\xc7\x66\x20\x61\xda\xa0\x17\xda\xcd\xa7\xae\xd4\xc2\x12\x9e\x48\x74\x07\x1f\xf7\xbb\xee\x59\xd3\x40\x63\x8c\x73\x2a\x75\x66\xde\x0f\x6d\xec\xb4\x76\x92\xb1\x93\x2b\xa7\x52\x1b\xdf\xd3\x9f\x8b\xba\x7e\x14\xc5\xcb\x97\xd1\x4c\x49\x55\x48\x6d\xa6\x69\x83\xb9\xc0\x41\x41\x95\x25\x29\x24\x34\x1a\x64\xcb\x6c\x58\x7f\x25\x6d\xc0\x12\x41\x23\xe6\x69\x1a\x7e\xad\x45\x23\x86\xa4\xc3\x73\x05\x61\x96\x08\x9e\x20\x52\x7f\x89\xe2\xc9\x48\x2f\xf1\x65\x98\xb5\xfe\x14\x1b\xcd\x12\x19\x04\x3d\x9d\xa0\xc7\xa8\x7d\x85\x22\xf8\x67\xa9\x33\xa1\xa6\x65\xbd\xcf\x8d\x61\x22\x53\x23\x92\x3e\x25\x05\x45\xb3\x16\xef\xae\x3e\x34\xe0\xfe\x63\x89\x8a\x82\xc0\xa7\x7d\x17\x85\x5e\x77\xbc\xd3\x2c\x51\x3a\x95\xb1\x8b\xb8\xf0\xf1\x8f\x22\x4c\xfd\x41\xad\xc0\x87\xa5\x0e\xad\xba\x28\xb4\xad\x40\x7e\x20\x1e\xe5\x4e\x04\xa6\x1d\x6d\xff\x23\x08\xfd\x7e\x28\x17\xea\x8a\x41\x88\x25\x60\x74\xe8\x18\x5a\x97\xd9\xb0\xc8\xcf\x12\x43\x42\x34\x76\x6f\x59\xb1\xd3\xba\xfb\xab\x48\xb0\x25\xab\xdf\x96\x97\x87\xd5\xd7\xe9\x3d\xf8\x5d\x8f\x04\x86\x60\x55\x6f\xb8\x1d\x7f\xe4\x1e\x5e\xae\x45\x6b\xdd\x55\x42\xad\xd2\x9e\xd0\xcb\x13\xc6\x3c\x3c\x97\x50\x64\xbf\x60\x56\xd0\x74\xba\xff\x92\x28\xb0\x74\x97\xc7\x0a\x84\x5e\xda\xa6\x87\x5e\xb4\x78\xee\x57\x23\xae\xb0\xf4\xf9\x38\x2e\xe5\xed\x27\x00\x5e\x46\xe2\x28\xc6\x6f\xa4\x3c\xd6\x00\x36\x87\x6f\x5f\xfc\x41\x41\x2d\x7f\x7a\x56\x3c\x2d\xdf\xa7\x67\x6a\x8a\x9d\x72\x4e\x2d\x64\x18\xb7\x92\x84\x52\x84\xa9\xa3\x61\xb2\xea\xe8\x37\x22\xeb\xb8\x26\x19\x49\xb8\xcd\x62\xec\x1f\x0e\xdb\xee\x6f\xa9\x71\xa9\xd4\x57\xc0\xa9\x84\xf1\xc4\xf1\x76\xf7\xa3\x1b\x21\x35\x7e\xc0\x53\x56\x20\xd8\x65\xc2\x46\xc8\x48\xa2\x01\xdb\x26\x6a\x28\x74\x1b\x66\x9d\xb0\xf5\x61\x76\x4f\x21\xc4\x18\x04\x0a\x9c\xcb\x32\x1f\xa7\x05\x09\x35\x46\x3b\xbe\xb7\xbb\xb2\xa8\x1b\xe4\xc6\xaa\xeb\xa5\xa8\x33\x35\x44\x04\x5d\x69\x0c\x7d\x94\x95\xbd\xce\xd0\x12\x1e\x30\xee\x72\xe3\x7d\x5e\x8a\xf0\x34\xc2\x62\xe7\xb9\x82\xd7\x2c\xcf\x9e\x50\x36\xea\x0a\x80\x3e\xff\x40\x29\xb3\xc5\x0e\x87\x34\x00\x6d\xf7\xd5\xa3\xea\xdb\x5f\x26\xfe\x08\x11\x41\x40\xad\xe4\x68\xdd\x08\x8f\x19\x60\x44\x70\x89\xed\xe8\x77\xbe\x54\x37\xea\xad\x74\x83\x64\x10\x61\x7e\x0d\x25\x63\x56\x96\x33\x74\xf2\x39\x24\x27\x18\x89\x2f\xb3\xe6\x2d\x2b\x14\x76\x92\xcf\x46\xa7\x7e\xbc\x10\x56\x29\x53\xa9\x6a\xc0\x0e\xf9\xdb\xe4\x87\x01\x84\xf6\x55\xd9\x72\x2c\x73\xc7\x88\xa2\x0c\x41\x53\x7e\x7b\x9a\xaa\xad\x77\x1b\x39\x51\x9c\xa2\x5c\xdc\x3f\x37\x9e\xa4\x8a\x11\x95\x72\xec\x78\x7e\xd8\xed\xf7\xab\x9d\x67\x35\x62\x44\x47\x0c\x2c\x69\xe9\xfd\xe1\xdb\x71\x7b\x7f\xdc\x6f\xfc\xce\x44\x40\x5a\x48\x1c\xe6\x08\xb2\xb2\x70\x30\x5b\x6b\x2b\xc8\xbc\x29\x27\x86\x6a\x2c\x2d\xff\xed\x52\x37\x8b\x02\x8d\xa1\xaf\x78\xd3\x20\xd2\xda\x6e\x4f\x37\x79\xf9\x06\xd5\x62\x28\x3d\xcb\x68\xe0\xbc\xfd\xda\x91\xdf\xce\x87\x28\x34\x14\x06\xc1\x8c\xae\xe3\xf3\xcf\xd0\xf8\xbf\x4d\xce\x06\x21\x9d\x06\xcf\x6d\xd9\x17\x99\xff\x15\xf5\xd6\x89\x4c\x64\xe9\xfe\x15\x3b\x7b\x45\xa3\x58\x39\x7f\xb8\xe3\xc1\x79\xe8\x15\x1f\xef\x4b\x9f\x6e\xa0\x51\x0c\x08\xe0\xb9\x14\x1d\xf3\x81\x57\xa8\x1a\xdf\x4e\x9c\x58\x8a\x3e\xb4\xa2\xad\xbb\x92\x77\x30\xea\xf6\x20\x28\xab\xcf\x3f\x57\x4e\x1c\x7c\x72\x9a\x84\x14\x3c\x13\x4b\xd9\x40\xed\xbc\x9e\xcf\x1d\x45\x9a\x44\x04\x19\x79\x51\x58\xe9\xdd\x57\x19\x3b\xa1\x9b\x0f\x75\x0c\xc7\xfb\xc1\xd0\x3e\xd3\x84\xc4\x21\xe9\x8a\xe1\x70\x3c\xf7\xda\x0e\x93\x27\x4f\xb4\x42\x10\xf3\xd7\xec\xd5\x01\x2b\xa0\xba\x46\x08\x8f\xdc\x0c\x4a\x62\x49\x1d\x26\x61\xf5\x2c\xb2\xe2\xb1\x2c\xa7\x97\x25\xc4\x2a\x8e\x74\x9a\x63\xcd\x33\x54\x08\xbe\xc0\x39\xf5\x41\x8d\x8e\x92\x54\x60\x8d\xe0\x7b\xa1\x3d\x9b\xcc\xfc\x40\x6a\xac\x62\xed\x05\x25\x69\xfa\x7a\xd8\x1a\x7a\x3f\x8f\x32\x97\xcb\x56\x22\x57\x08\x86\xb5\x30\xc7\x8e\x89\xa1\xbf\x5c\xeb\x29\x27\x1d\x41\xd4\xa6\x68\xc6\x2c\x5f\x8c\x32\x6a\x61\xee\xaf\xad\x1b\xd0\x6e\x73\x43\xca\x1c\x3f\x46\x0b\x6c\xc6\x6f\x43\x47\xeb\x8f\x5c\xd7\xe3\x29\x27\x89\xf1\x1c\x00\x4e\x26\x7e\x2f\x5e\x01\xab\x1c\xe3\x57\xc8\x53\xae\x52\x2f\x60\x62\x2e\xd8\x2e\xd9\x9a\x9a\xc1\x7c\xe3\x32\xc1\xc4\xce\xe6\xb0\xda\x5f\xaa\x57\xe8\x9e\x9c\x1b\xed\x03\xaa\x3b\xf1\x0b\x1b\x87\xd1\x58\xbb\xf5\xb2\x7c\xbf\x6d\xfc\x5e\x49\x53\x12\xe2\x46\x6b\x32\x6d\xf9\x9e\xc6\xbb\x15\x4d\x85\x89\xfa\x44\xcb\x4d\x55\x9e\xd0\x6f\xbd\xc2\x69\x31\x9a\x9a\x00\xb3\x6c\x06\xe0\x28\x87\xfd\x43\x8c\xca\x00\xb0\xaf\xf6\x49\x61\xa2\x6e\x50\xd4\xa1\x92\xc6\xc6\x66\x82\x41\xef\x51\xa4\x77\xd1\x1f\xb2\xa4\xd3\x08\xcf\xba\xc9\xb3\x73\x77\x80\x53\x7c\x3e\x91\x37\x50\x2d\x45\xf1\xe2\xdb\x95\xae\x96\x46\xff\xb2\x94\x4e\x70\x99\x3d\x7c\x5f\xde\x6e\x57\xc7\xdd\xcd\xcd\xe6\x71\x24\xbc\xc3\xa8\x0e\x18\x1f\x38\x53\x99\xaa\x4a\x07\x73\x9a\x5f\xb9\x40\x0c\xea\x1d\xb5\x91\xe6\x1a\x75\xc1\xba\x56\x48\xc6\x82\xc0\x04\xe1\x48\x3a\x56\x77\xe0\x78\xc6\x82\x10\x30\xfd\xeb\xa0\x10\xdd\x9f\xa9\x6d\x62\x68\x32\xa8\xe2\xdb\x9d\x4f\xfb\xb1\x30\x14\x9e\x3a\xc2\xea\x2f\x65\x27\x74\x62\xe6\xf8\x3d\x18\x0b\x25\xb3\x4a\xe6\x99\xae\x11\xb7\x0d\xfa\xa8\x06\x19\x24\x16\xea\xc4\xc3\xcb\x17\x79\xe6\xd0\x23\xe3\x35\xc1\x42\x50\x78\x87\x36\xfb\xfe\xad\xbc\xd4\x5d\x8a\xde\x39\x19\x2c\x62\x02\x9b\xcf\x7c\xa4\xbd\x12\xe7\x9e\xf9\x9a\xb1\x38\x8a\x91\x1a\xef\xa5\x56\x4b\xd1\xa8\xe7\xe5\xa5\x2a\x7e\x3e\x43\xf1\xbd\x86\x6d\xb1\xcf\x34\xa8\xd6\x7a\xcc\x25\x86\x46\xfb\x36\x8b\x63\x3b\x79\xde\xdb\x48\xab\x1f\x3d\x71\xa8\x59\xcc\x38\x3a\x78\x0d\xd4\x8d\x65\xf7\xad\x3a\x7d\x45\xc6\x62\xae\xb0\xca\x82\x82\xff\x9b\x76\xa3\x9d\x82\x92\x27\x35\x5e\x96\x84\x31\xaa\x2a\xc9\xbe\x6b\xd1\x1f\x89\x42\x74\x14\x57\x8f\x8b\xeb\xd6\x5e\xc6\x92\x38\xc6\xac\xce\x9d\x78\x01\xcb\x7a\x3a\x39\x9e\x5a\xf2\x71\x54\x22\x9f\x20\x52\x27\x23\xb5\x89\xc7\x21\xc5\xdd\xe2\xeb\xd7\xed\xe6\xcf\x72\x7d\x2c\x01\xea\xe7\xcb\xf7\xf6\xd1\x46\x9f\xcd\x2b\xc6\x39\x85\x81\x0e\x00\xf2\xc1\x3e\xe3\xce\x22\xb1\x42\x1b\xb9\xde\x7e\x3d\x3c\x76\x2e\x0d\x23\x69\x92\xda\x1a\x77\x23\xf2\x87\x72\xef\x72\x33\xde\x7c\x30\x4a\x39\x3e\xc2\xb9\x0d\xfe\x5e\x27\x6f\x82\xca\x24\xb6\xa5\x76\x94\xbc\x74\x5d\x13\x1e\x44\xb3\x2d\x7a\x0c\xad\x3b\x81\x51\x0a\x1e\x6b\x82\xde\x10\x6e\x40\x93\x99\x8b\xf6\x01\x59\x25\x9e\x33\x99\x35\xc3\xd0\x81\x71\x13\xa2\xf3\xb3\x5d\xed\xd0\x12\xf5\xad\x23\x8c\x89\x14\x52\xdd\x95\x56\x6f\x26\x5a\x51\x8c\xc9\x38\x70\x04\xe9\xb6\xbe\xe9\xb5\x6a\x66\x7c\x4d\x26\x53\x96\x42\xa7\xca\xd7\x80\x1a\x89\xbe\x31\x26\x35\xb7\x7b\xe8\x7b\xa1\x9c\x74\xeb\xb9\x19\x62\xa2\xba\x45\x70\x1d\xb0\x31\xc5\x08\xf2\x31\x94\xad\x2b\x88\xce\x1d\xe8\x87\x0c\x70\xc3\xd9\xcf\x20\x8e\xfd\x69\xc6\xb2\x7f\x7c\xbf\xdf\xfe\x71\x5c\x2f\xbc\xd9\x63\xca\xd8\x76\x8d\x06\xc4\xe9\xf0\x56\x3a\xb5\x53\x77\x50\x73\xc0\x8c\x15\x9c\x32\xab\x88\x33\x8c\xf2\x3e\x4f\x01\x30\xad\x52\x20\x3e\xaf\x77\x3a\x37\x70\x0c\x49\x77\x5d\xa5\x01\x21\xb6\x23\xf4\xce\x07\x8e\x01\x83\xc0\xb0\x70\x80\x8e\xd2\xd6\x2e\xbb\x5c\xb1\x9e\x71\xc6\x18\x50\x8b\x5c\xc7\x5e\xc8\x9b\xdb\xcd\x1f\xab\xa9\x8c\xd7\x64\x82\x83\xb0\xc4\x5d\xf2\xe2\x7c\x7e\x9b\x20\x1d\xe7\x5a\xe6\x52\xa0\x93\x3e\x6b\xc6\x83\xc0\xc2\xbd\x96\xab\x43\x79\x5e\x55\xc2\x34\x2b\x51\x14\x42\x7a\x56\x1d\xc6\x83\x28\xc4\x46\xc7\xf6\x76\x3a\x29\x28\xc6\x03\x90\xa1\xcb\x07\x57\x59\xf3\x7e\x73\x29\xac\x2c\xda\xc4\x5f\xe1\x61\xac\x71\xdd\x2c\xb3\xe6\x2b\x36\x39\xfd\x69\x59\x85\xc7\x89\x2b\x02\xd5\x2e\x29\xfe\x4d\x54\x7a\xd5\x4b\xd5\xf9\x61\x69\x82\x35\x6c\xfb\x96\x07\x8a\x7f\x57\x6e\xa8\x3b\x21\x09\x18\x76\x1c\x2d\xcb\x81\x16\x9b\x3f\x46\x02\xbc\xd8\x46\x96\x6d\x74\x36\x5c\x88\x9c\x24\x0c\xb3\xb4\xc7\x73\x05\x88\x9e\x99\x81\xa2\xf9\xa1\xc6\xa2\x14\x67\x28\x5d\xba\x11\x5c\x6b\x44\x96\xc1\xe1\x09\xd6\x76\xc7\xf5\xbf\x44\x63\x82\xb9\xca\x45\x9e\x4b\xa8\x9b\xac\x87\xd1\x76\x23\x20\x46\x47\xb1\xac\xb4\x9f\x87\xd3\xca\x1f\x67\x61\x68\x89\x4b\xce\x6d\xf0\x2f\xaa\xa7\xcf\x59\x25\x19\xe7\x81\xa4\x3e\x7f\x87\xcd\x22\x65\x55\x95\x6f\x59\xf1\xe4\x62\xfe\x6e\x2e\x70\x0e\xc6\x15\x7b\x5a\x73\x32\x8a\x37\x39\xd7\x80\x2e\x09\x20\xef\xa3\xdd\xfb\x3b\x11\x7a\x37\x26\x65\x06\x19\xfb\x1f\x41\x3f\x0a\x39\xb1\x78\x5c\x70\x85\x9d\xe8\x4e\x58\xb8\x9e\xad\x7a\x73\xc1\x0d\xa6\xc0\xf3\xb2\xd9\xea\x7a\x5e\x16\x94\x71\x91\x02\xf6\xe3\x34\xd9\xaf\xaf\x16\xad\xe0\xfb\xd2\x06\x6f\x53\xa4\x06\x1b\x43\xbe\x89\x4a\x96\xd5\xc7\x6d\x10\x1f\xd8\x10\x7f\x15\x49\x65\xa7\x93\x6c\xad\xf5\x13\xf0\xee\x37\x0c\x89\x93\xb1\x66\x66\xed\x08\xd8\x1e\x01\xab\x85\xdd\x40\xe9\x79\x49\x5a\xcb\x58\xdb\xb4\x4e\x6f\x26\xb8\xa4\x1a\x7a\x5a\x8a\x19\x45\x57\xc6\x25\x97\xc2\x78\x0a\x9d\xd5\x30\xcd\xe0\x07\xa4\x1a\x41\xd1\x98\xab\xb0\xd4\xbb\xfe\xf7\x55\x10\xa1\x99\x3b\x57\xe5\x09\x9a\x67\xb8\xd4\xfb\x32\xd7\x43\x60\x33\x57\xa1\xc5\xf8\x39\x9e\x47\x4b\x56\xe6\xf2\xbc\x73\x9d\x55\x8c\xab\x04\x30\xb5\x80\xf9\xaf\x63\x69\x8e\x67\xa4\x67\x3b\xbe\xc0\x7b\xd8\x5d\x15\x6c\xd3\x74\x0d\xcd\x72\xf1\xfd\xa3\xcc\xa2\x1b\x0c\x34\xc0\x22\xcd\xe2\xe1\xe1\xb8\x58\xaf\x1f\x8f\xf7\x8b\xbb\xcd\xfe\x61\xb1\xda\xf8\xcb\x81\x89\x91\x37\xcb\x37\x69\xe2\x8b\x1a\xf5\x02\xb3\x34\x48\x2c\x93\xa9\xcc\x9a\xb3\xc8\x50\x3a\xc1\x73\x60\xfa\x11\x44\x5a\xb5\x45\x71\xa9\xba\xbf\x49\x4b\x8b\x3d\xc8\x23\xd9\x2d\x6d\xf2\x96\xd3\x30\x08\x91\x08\x63\xbd\xe9\xfb\x3a\x59\x8a\x9a\x3b\xf8\xee\x41\x54\x43\x2c\xc1\x1a\x1a\x91\xe5\xdd\xb0\x34\xb1\x26\x39\x6b\x8a\xf2\x55\x74\x7f\x56\xd6\x49\x17\x55\xf5\x3f\xf1\xf1\xb0\x34\xd4\x12\xf3\x7b\x48\x74\x78\xd7\xe3\x8f\xd3\x48\x06\x52\x4d\x51\xa9\xdd\x3b\x8a\x94\xa2\xdd\x69\xae\x9a\x8e\xd0\xcb\x6e\x44\x1c\xda\x38\xa5\x86\x66\x37\xc1\xee\xa6\x31\x0f\xb5\xe3\xef\xda\xae\x76\xd7\x1d\x81\x7e\x98\x0c\x8c\x6b\x7a\x73\xbc\x0b\x73\x75\xdd\x34\x56\x16\x7c\x68\xf1\x4c\x62\x46\x9d\xda\x0d\x4c\x42\x6a\x1d\xf9\x2c\xcf\x27\x8e\x4c\x9a\x88\x64\xa0\xaa\xb1\x86\xd7\x2b\x49\x2b\x96\x26\x52\x76\x92\x95\x4e\xa2\xf8\xd3\x5c\x63\x4a\x38\x60\x0d\xa9\x3c\xc1\x93\x18\x5a\xb3\x94\x86\x3a\xb0\x2d\xda\xba\xfb\x13\x37\x18\x28\xeb\xf2\x23\x28\xb3\x1f\x28\x6d\x73\xec\xa5\x68\x8d\x78\x73\xac\x87\x0d\x04\x29\x4b\xe2\xb4\x27\x74\x9d\x50\x67\xff\x25\x21\x5a\x96\x32\x42\xb0\x13\xd5\xf1\x64\x89\xa2\x5e\x89\xfc\x33\x66\x0f\x96\x32\x1e\x62\x4d\x7a\xbb\x58\xef\x7e\x3e\x76\x37\x03\x0a\xe1\x74\x56\x9c\xae\x12\x12\x65\xc8\xba\x47\xe6\x54\xf3\xb8\xcb\x0d\x18\xa8\x44\x7e\x05\x9f\x4a\xd3\x18\x10\x6e\xbd\x7d\xec\x92\x89\x69\xca\x38\xeb\xda\x17\x11\x42\xe7\x8f\x08\x92\xe0\x46\x73\x42\x2a\x93\x0a\x6a\x44\x5e\x4c\xbf\xb6\x50\x96\x70\xa9\xee\xf9\x78\xaf\xb4\xbd\xc6\xaf\x44\x86\x16\x75\x70\x5b\x3e\x21\x6d\xfc\x55\x13\x42\x2a\x49\x88\xf0\x64\x4b\x54\x9f\x41\xfd\x65\x7c\x98\xd9\x30\xcc\xd2\x7f\x89\x4a\x77\xd5\x92\xf9\x6f\xa0\x48\xec\x85\x65\x5b\x8b\xef\x6f\xcf\x55\x9e\xdc\xbe\xe6\x08\xcb\x27\x0e\x4b\xaa\x63\x46\x7c\xbd\xf4\x1a\x8f\x9c\x6a\x6d\xf1\x46\x3d\x2b\xb5\xa8\x5e\xa0\x79\xc8\x7e\x41\x3e\x13\x42\xa7\xda\x48\x13\x77\x8a\xa6\xd6\x1e\x0e\xa0\x13\x29\xa4\xa1\xe9\x8c\x41\xed\xb2\xea\xcd\x30\x17\x34\xdb\x5a\xcb\x52\x30\x31\xf2\x8a\x17\xe2\x04\x03\xb4\xe5\xa7\x46\x3e\x35\x2a\x45\x9e\x1b\x18\xf0\xbb\x4c\xdd\x9c\xd4\x18\x60\x6e\x3b\xbc\x2b\x5f\xb3\xc9\x13\x89\x80\x5b\x56\x49\x24\x46\xe8\x89\xd0\xda\x41\x49\xe0\xc6\x44\x31\x60\x78\x89\x98\xc2\x63\xad\x44\x0e\xeb\xf2\xed\x2a\x0b\xea\x47\x0b\x81\x65\xc2\xbe\xbb\xe2\xa1\x82\x93\x95\xf8\x9e\x7d\x0e\x11\xa9\x20\xa2\x63\x0a\x39\xd7\x91\xfc\x21\x89\x1c\x13\xb1\x88\x31\x8b\xf5\xf5\x76\xe9\x43\x57\x91\x04\x90\xf6\xdc\xde\xb6\xd9\x71\xfa\xde\x1d\x30\x62\xb6\xac\xf0\xdb\x4c\xd6\xda\x35\x0b\x25\x3e\x56\x13\x49\x1c\x19\x17\x03\x2d\x54\x73\x11\x76\xa2\xec\xcc\x4a\x54\x7a\x57\x60\x70\xe0\x13\xf0\xe3\x3b\x26\x91\xd5\x0e\xbf\xd4\xb0\x2d\xea\x4b\x85\xf6\x79\x32\x44\x27\x96\x1e\xd7\x51\xdb\x58\xbc\xe1\x08\x2c\x24\x88\xe1\x48\x09\xeb\x9d\x0b\x4b\x62\x3e\x47\xf9\xcd\x04\x0d\x42\x04\xae\xdd\x2d\xfe\x38\xee\x0f\x8b\xd5\xef\xc7\xf5\xe6\x01\x85\x18\xfe\xfe\x7d\xfb\xb8\xb9\xdb\x78\xa2\x3c\x26\x28\xb1\x4c\xb3\x50\x34\x50\x1d\xeb\xff\x5c\x06\x5a\x1d\x7e\x08\x0d\x82\x8e\xe1\x6c\x29\x6a\xe8\x69\xa0\x99\xa0\x3c\xc5\xa5\x81\x8c\xbe\xfb\x97\xf7\xfb\xce\x65\x12\x4c\x59\x1d\xb2\x37\x80\x17\x64\x19\x58\xb9\xac\x7c\x37\x00\xa4\x4d\xc6\x96\x0d\x04\xd1\x7d\x39\xf4\xa6\x04\x33\x09\xde\x98\x01\xd0\xbb\x02\x49\xb3\x3f\x98\x79\xcc\x10\xcc\x4c\xe0\x07\xf9\xf6\xfb\x57\x4b\x53\xf5\xb9\x57\x2f\x98\x49\x11\x5c\xaf\x2c\x17\x9e\x33\x27\xdd\xee\x2d\x38\x93\x36\x85\x88\x17\x73\x00\xf2\x91\x6d\x98\x5c\x30\x25\x01\x26\xb7\x04\x4e\x8e\x0f\x96\xa5\x48\x69\x8a\x4d\x58\xe7\xcb\x2c\x07\x22\x13\x22\xe2\xb8\x7b\x35\xe5\x32\x8e\xbe\xcc\xc0\x09\x85\x10\x80\x3a\x2f\xed\x97\x18\xf2\x29\xfd\x69\xe5\xe6\x53\x04\xc1\xfc\x43\x09\x9d\x20\x80\x1b\xc5\x9e\x36\x8f\x7b\x2b\x31\x64\xa9\xf5\x0f\xdb\x3b\xef\x55\x0a\x49\x1d\x21\x59\xbb\x8f\xe9\x76\x49\x74\x2f\x52\x85\x29\xc2\x67\x34\xbc\x3a\xf7\x7e\xd0\x70\xca\x84\x4a\xc2\xc0\x4d\xfd\x06\x74\x33\xf4\xb1\x84\xe2\x29\x26\x51\xbf\xe6\xa5\x14\xf9\xf2\x52\x67\x05\xd4\xb5\x6d\x5e\x1b\x3a\x13\x42\x83\x64\x9e\x8c\x12\x85\xb7\x1e\xaa\xf2\x35\xd3\x50\x7d\xdf\xae\x3f\x30\x3e\xda\xd8\x24\xbf\xcb\x9d\xed\x0a\xe8\x73\x8c\x02\x42\x5b\xf5\x40\xd5\x0b\xcc\xeb\x86\x83\x43\x1e\x60\xbe\xad\x1d\x17\xcf\xf8\x13\x03\xd1\x9c\xa3\x77\xf2\x50\xc1\x56\x79\x3c\x8d\x30\x89\xe6\xa2\xa7\xa2\x2f\x73\x58\xe4\xf9\xa8\x3a\x21\x8c\xe0\xc2\xb9\x03\xc7\x0a\x85\x4a\xab\x39\xfd\x74\x26\x8c\x0e\x53\x31\xe4\x80\x5c\x0f\x1e\x74\xf6\x81\x65\x04\x96\x2a\xd1\x96\x46\x66\x9a\xf7\xa6\x79\x58\x19\x0b\x9b\xf6\x3d\x0a\xad\x9d\x78\x56\x36\xa8\x62\x8d\x59\xcc\x99\x4c\x54\x82\xdc\x63\x77\x9b\x83\x4f\xfc\x4b\x92\x5a\x11\x0a\x5b\xfc\xf5\x0e\xc6\x07\x36\xf9\x72\x45\xc5\xdc\x31\x6a\xe0\x3f\xbd\x04\xdf\xc8\xda\x49\x62\x18\x6e\x09\xc7\xd6\x34\x5b\x13\xbc\xd5\x3d\x23\xe0\xb8\xd3\x9e\x49\x4a\x04\x06\x8a\xcf\xa2\xde\x9c\xce\x79\xf9\x0e\xd5\x1d\x6a\x16\x0e\x99\x46\xe6\xdf\x21\x23\x12\xa8\x97\x3a\x7c\xc2\x60\xb6\x3c\x9f\x87\x34\x7f\x4c\x32\x15\x63\x77\xd8\xee\x0c\xc5\x43\x39\xe4\xae\x61\x92\xc7\x42\x50\xcf\x09\x7c\xe5\xd2\x60\x75\xe4\x4e\xfc\x1a\xcf\x27\xc9\xb9\x46\xac\xf5\xfd\x66\x35\xef\x9a\xc9\x94\xdb\xa6\xd4\xac\x5e\x5c\x2a\xb1\xff\xa8\xcc\x21\x53\x11\x59\x79\x60\x91\xab\x31\x53\xc8\xe7\x66\x40\xa6\xc0\x6d\xce\xe4\x72\x72\xd9\xa6\x76\x6a\xaf\x76\xb1\x7f\x30\x11\x52\x9c\x8f\xdf\xde\x65\x95\xe9\xcd\x1f\x9f\x80\xf4\xa4\xe0\x14\xa3\xf0\xf6\x05\xb5\x6f\x00\x0a\xd7\xf8\xe1\x8e\xcb\x80\x60\x31\x06\xf3\x43\xce\x2e\x5b\x93\x3e\xf1\xf2\xa4\x74\xe2\x6a\x05\xbc\xd9\x9c\xf3\x07\xbf\xa8\xc3\x08\xb9\xd9\x9a\x5f\xf5\x3c\x57\x37\x93\x3a\x8d\x98\xef\x03\x43\x8a\xa6\x4b\xbb\x1f\x22\x58\x68\x61\x1a\xa8\x16\x6b\xb0\x2c\x7f\xfe\x2e\x21\x36\xc2\x53\x8b\x7e\xf6\xb4\xc0\x89\x72\xae\xe3\xa6\x8d\x8b\xbb\x1d\x46\x02\x4f\x4d\x5f\xa4\xc2\xb8\xe0\xca\x05\x9f\x7e\x96\xc1\x3c\x33\x11\xc5\x4c\xea\xc3\x7a\x57\x74\x77\x65\xb8\x21\x81\x03\xb6\xe0\x5d\xb5\xdb\xee\xfa\xa3\xa6\x1a\x15\xc8\xc0\xa4\x96\xfa\xa3\x2a\xdf\xae\x7e\x75\xf4\xb6\x55\x48\x63\xcc\x80\x60\xab\xc8\xfe\xb0\x38\xd8\x86\x91\xe3\xc3\xe3\x6e\x88\xb3\x56\x51\x10\x8a\xd0\xef\x05\x27\x91\x15\x59\xf1\x74\x97\x15\x30\x6a\xf3\x56\x51\xc0\x11\x14\x8f\x93\xfe\x6b\x56\x79\x2d\x55\xa6\xa2\xc4\xa2\x15\x95\x43\xbe\x75\xba\x38\xfe\xb8\x4e\x11\x11\x73\xca\x8a\x7d\xf6\x5f\x70\x5f\xde\x1f\x34\x71\x1a\x74\x10\x64\xcc\x70\xec\x2f\x4a\x41\x5d\x9b\x4b\xbe\x6f\xe0\xdc\xfd\x4c\x1c\x86\xd8\x08\x7b\x00\x71\x5a\x14\xda\xf3\xa6\x77\x87\x23\x81\x70\xcc\x36\x3a\xa8\x2d\x1d\xc9\xfd\xb0\xaf\x58\xc5\x04\xd0\xcc\x6b\x00\x8d\xfc\x40\xe3\x57\x1b\xa7\x11\xa2\x2f\xa0\x50\xa5\x86\x65\x96\xe7\xed\x6b\x70\x0a\x81\x7f\x6d\xd9\xb5\xd7\xf0\x0d\xb9\x2b\xd1\xdf\x5a\xa2\x98\xdf\x6c\xf7\xcf\xd9\xb9\xa7\x5d\x1e\x9f\x9d\x98\x00\xdf\xb0\xb8\x34\xa5\xcb\xaf\xe3\x94\x68\x2d\xcf\xdf\xee\xba\x8b\x19\x25\x5d\x85\x79\xf3\xeb\x0c\xaa\x01\xfd\x55\x9c\xa0\xd7\x30\x64\x8a\x84\x01\x77\xef\xf4\xce\x71\x65\x21\x17\x81\xbf\x68\x5f\x03\x56\x24\xb2\x13\x6a\x05\x55\xd3\x64\xe6\x7d\x26\xf8\x52\x84\xc7\xb8\x0f\xd6\x4d\x79\xbe\xb3\xd9\xa5\xd1\x2e\xa8\x88\xb1\x3c\xc5\x1d\x6d\xed\x40\xae\xb7\xe7\xfb\x64\x8a\xc6\x61\xd2\x89\x32\x5d\x8a\xc6\xb6\xee\xad\xec\x2e\x35\x9e\xbb\x94\x58\xbd\x7d\x5f\x47\xaf\x6b\x5c\xd5\x87\x11\xe2\xc5\x7f\x84\xd1\x3f\xfe\x02\x00\xd8\xa5\xf9\x20\x32\xbd\xbb\x7c\x10\x23\x2b\x16\x68\x2c\x55\xb8\x62\x51\x56\x16\xc3\x97\xc3\x62\x8a\x40\xc4\x6d\x93\xbf\x0f\x76\x05\xc5\x62\x0b\x68\x1b\x28\x3c\x0d\x45\x8e\x99\xe2\xb1\x25\x11\x43\xea\xfe\x42\x7b\x92\xba\x19\x0a\x71\xa6\x44\x28\xa8\x83\xae\xac\xaa\xf7\xba\x11\x79\xbd\xbf\x9c\x4e\x53\x29\x76\xa6\x44\x04\x1d\x40\x7e\xca\xd7\x32\xb0\x33\x4a\x30\x43\x9d\x01\x6b\xbf\x96\x8d\x94\x91\xdc\xe9\x23\xbc\x99\x3f\x51\x29\xc4\x59\x1f\x25\x64\xc5\xd3\x8f\xed\xc3\xe4\x06\x24\x4d\xa2\xae\x71\x6a\xf2\x5e\xfd\x10\x48\x91\xbe\xc9\x9a\xff\x76\xb2\xef\x21\xcf\x2d\x49\xeb\x64\xa8\x4a\xc2\x98\xbb\x1c\xd8\xf7\xcd\x61\xf5\xd3\xa7\x4a\x94\xa2\x4c\x22\x9a\x21\xab\x6a\xab\x37\xe5\x6b\x86\xdd\x08\x63\xe5\xc9\x2a\xd1\x80\xaf\x6b\x29\x9d\x68\xcf\x12\x89\x36\xca\x29\xf0\x6c\x2e\x55\xb9\xba\x72\xc8\x94\xe6\x41\x64\x4b\x8e\x67\xcb\x25\xdc\x5d\x46\x72\xfc\xe8\x87\xcd\xe2\xee\xf8\x63\x63\x15\xef\x87\x1a\x9d\x4c\x41\x12\x49\xed\x48\x05\xae\x10\x2b\x0a\x52\x21\xc0\x3b\x9c\x16\x71\x8f\xd6\x68\xf9\x3e\x9c\x5b\x90\x6a\xaf\x43\x7c\x07\xf5\x33\x12\xa0\x2c\xdf\xd1\x2e\x8d\xae\x66\x74\xa0\xd1\xf9\x29\x2f\x35\x1c\x41\x77\x29\x5d\x65\x34\x20\x88\xb3\x2c\xf6\x17\xf9\x1d\x53\xc2\x57\x85\xe4\x7e\x5a\xe8\x20\x64\x98\x42\xe9\xb9\x2d\x1e\x44\x36\x4f\xce\xc9\x74\xc0\x18\x6e\xf9\xf7\xe2\x94\x8d\x28\x9f\x3f\x18\x2e\x04\x72\x8d\x1c\xfe\xd8\x35\xd7\x65\x79\x1d\x72\x85\xcf\x70\x54\xe2\xbc\x7b\xf3\xf0\x73\x1d\x71\x8a\x42\x69\x4d\xf9\xf4\xd4\x8b\x0f\xdf\x4c\xd8\x8c\x99\x8e\x20\x01\xdb\xae\x2e\xf2\x35\xbc\x5a\xc9\xe1\x9f\x90\x3d\x3d\xfb\x8f\xa6\x63\x62\x12\x36\xac\x52\x8e\xbf\xb6\x8e\x53\x82\xdd\x63\xcd\xa9\xcb\xbb\xe9\x84\x5b\x78\x1f\xae\x13\x8f\x87\x9c\x5b\xa2\x3a\x01\x4b\x33\xbf\xf9\xe3\x70\x5c\xed\xee\x1e\x16\xf7\xff\x68\xf7\xd3\xdf\x37\xc7\xc3\xb7\xc7\x8d\x8f\xa9\x34\x71\xca\x86\x0a\x5b\xb9\x6f\xaf\x00\xec\x9a\x10\x8d\xaf\xa9\xc9\x4e\x70\x0b\xa6\x39\x94\x03\x24\x84\x1f\x03\x89\x25\x2a\x82\xba\x59\x57\xd9\x87\xec\x62\x6e\x38\x0d\xe2\xb4\x7d\x37\xcb\x2a\x13\x45\x13\x0d\x83\x2c\x4d\x35\x84\x9e\x81\xa4\x10\xe7\xfa\xb9\xf4\x70\x6d\x04\x85\x7c\xdc\x17\xa4\x59\x60\xac\x73\x85\x32\x77\xdd\x1b\x63\x22\x24\x49\xbf\x8f\x61\x71\x6d\x23\xaa\xc2\xbd\x6e\xef\xdf\x6b\x26\x12\xe6\x79\xbf\x10\x7f\x36\xa8\x63\xf2\x0f\x1e\x84\x69\x60\x6a\xa0\xcb\xed\xfe\xcc\x93\xc0\x2f\xea\xef\x35\x54\xfe\xfb\xcc\xf1\x59\x32\xcd\xa9\xbd\x3f\xdf\x95\x38\x93\x19\xd4\xdc\x68\xcb\xdb\xad\x14\x9c\x1b\xd0\xcb\xb2\x7c\xc9\x8a\x27\xa3\x26\xe3\xd2\x88\xe3\x06\x84\x30\x92\xfb\x9b\xc3\xe7\xd9\x09\x9d\x26\x42\x5b\x8f\xde\xd2\xde\x3b\xbc\xd7\xe4\xe3\xa6\x42\x23\xde\x1b\x13\x33\xc7\xf8\x68\xa3\x67\x9b\xa9\xeb\xde\x72\x2a\x13\x21\x3b\x49\x97\xaa\x3c\x95\x23\x8b\xa0\x53\x69\x94\x1c\x76\xd9\x0c\x24\x2d\x66\x1d\x41\x9d\xaa\x00\x7d\xac\xac\x75\xcb\xab\xa7\xfe\xa7\x44\xc2\x89\xe9\xb6\x8a\xac\x78\x5a\x67\xc6\x64\xea\x92\x77\x1d\xbc\x5a\x92\xd4\xb6\xbc\xa1\x4d\x85\xcb\xc9\xa9\x9a\xde\xc3\xd5\x9e\x3a\xf9\x55\x29\x12\xac\x33\x7f\x7d\x5c\xac\xa2\xc1\xf6\xa9\xa5\x30\xa9\x05\x87\x22\x90\x6a\xd0\xa7\xaf\x25\x58\xe2\x5c\xa4\xbc\x14\x75\x7d\x2e\xab\xcf\xfa\x87\xb4\xe2\x54\x39\x6d\x94\x9f\x90\x8d\x78\x5a\xfd\x88\xd4\x66\x01\xd5\xa0\xc1\xd5\x1d\xd2\x01\x67\x96\x21\xe9\x53\x99\xdf\x51\x02\xd2\x9f\x9a\x28\x15\x7a\xba\x29\x78\xcd\xca\x8b\x43\x72\x8d\x02\xdd\x76\xfd\x21\xa2\xf9\x6b\x05\xdf\x84\x7a\x19\xbe\x04\x88\x4c\x68\xf9\x25\xb0\xd9\xc3\xb6\x51\xfa\x63\xca\x5a\x5f\x3d\x28\xaa\xdd\x64\xbf\xfa\xef\x66\x42\x86\x77\xde\x46\xb3\x7d\xc2\x42\x1b\x42\x53\x6a\x09\xa3\xb3\xfa\xf9\xa1\x42\x2e\xb2\xa4\x3b\xca\x12\x74\xf5\x84\xa7\x21\x98\xcd\x54\x68\x93\x0a\xbc\xb6\xc9\x8a\x59\xf6\xc8\xd1\x13\x42\x10\xaa\xd4\x76\x74\xd8\x3c\x8e\xe3\x4c\x1e\xcf\x7b\x08\x12\xbb\x55\x3d\x94\x7b\xd1\x94\xf5\xb3\xef\x51\x83\x40\x80\x74\x65\xb5\x07\xd7\xee\xdc\x1a\x94\xef\x45\x93\xe5\x43\x56\xc4\xee\xf6\x20\xd0\x06\xd3\x80\x52\xa8\x17\x4f\x40\x30\xbb\x24\x21\x8c\x53\x5c\xc1\xf6\x8e\x06\x65\x53\xff\xe3\xa1\xb4\x74\x74\xa7\xac\xc8\x4e\x97\x93\x0b\xea\xbf\x4c\xae\x22\x0d\x2e\x59\xa1\xf5\xb6\xa8\x9b\xac\x19\xb3\x00\x0f\x67\x05\x44\x11\xc5\xca\xe4\xff\x95\x59\xd1\xfa\xe4\xad\x1b\xbc\x2d\x5e\xb3\x06\xaa\x9e\x2d\xdb\x8f\x4d\x43\xac\x11\x39\x2c\x7f\x69\x8e\x8b\xdd\xea\x68\xca\xea\xb8\x2b\xe0\xd8\xf7\x6a\x40\x1c\x18\xe4\x58\x6c\x9d\x07\xc4\x5c\xcd\x0a\xdb\x8d\xf3\xe2\xfe\xd4\x94\x0b\xbb\x01\x64\xff\xf5\xe4\x52\xa3\x64\x1e\xc4\xc6\x6a\xec\x29\x91\xe7\x77\xa5\xc6\xca\x8c\x8f\x69\x47\x44\xf4\x0c\x92\x54\x2b\xa7\x0f\x1c\xc4\x3e\x8f\x00\x24\x60\x18\xfb\xb9\xf8\xc2\x6a\x9e\xff\x19\x48\x69\xf2\xa1\x48\x68\x1b\x36\xba\xc4\xe8\x0c\xe1\xea\xe4\x8c\x88\x20\xc6\x6b\x73\xf8\x86\x4c\xb6\xb7\xdb\xbb\x8e\x0c\x00\x68\x2c\xb1\xa4\x8e\x44\x12\x0f\x50\xdd\x95\x45\xd7\x11\xdd\x1e\x34\xc6\x33\x77\x6e\x57\xbb\x71\xd3\xfa\xe4\x67\xa8\x08\x90\xdd\xee\x24\xaa\x97\x1b\xab\xe6\xf5\xc1\x0d\x79\x35\x84\x1f\xb7\xc3\x1d\x18\x18\x0d\x30\xf0\x7b\x2d\xdb\xa0\xc9\xef\x09\xfe\xa0\xd6\xbe\x75\x7b\x59\x96\x39\x88\xc2\xb6\x3a\x8d\x17\x18\x67\x04\xf1\x4a\x68\xe2\xcf\xa2\x12\x3d\xd9\x0f\xa4\xc4\x48\xd5\x4b\x51\xf9\x88\xd8\x6f\x92\x7e\x14\xe7\xc8\x40\xb2\xfb\xea\xff\x22\x12\x61\xb9\x4a\xca\xf2\xe5\xaf\x01\xca\x40\x72\x7b\x1b\xbe\x2c\xb9\x2c\xa7\x74\xfb\x0c\xa4\xb0\x54\x27\x77\xdb\xfb\xe3\xc3\xe3\x76\xb5\x39\x6e\xef\x8f\xab\xcd\xfd\x61\xef\x7f\x58\xc7\x21\x22\x8e\x0f\xdb\xc5\xa0\x09\x03\xb4\x91\x58\xaf\xc0\x96\x99\xab\x8d\x76\xb4\xc4\xc0\x24\x4a\x77\x62\xe1\xc2\xc1\x46\x6e\xca\xca\xea\xe4\x0d\x31\x78\xee\x0c\x43\x99\xf2\x45\x2b\x77\xf3\x93\xe2\x3e\x18\x11\x63\xa5\x74\x7f\x12\x6e\xbb\x19\xcc\x40\x3b\xc6\x84\x89\x45\x96\xd9\xd2\xf5\xe6\xd7\xb9\x2c\xfa\xa0\xc1\x84\x29\x20\xf2\xe6\x9f\xa5\xa8\x86\x33\xc0\x84\x9a\x62\x23\xc4\xb3\xa8\xb7\xaa\xf4\x0a\x0a\x7d\x77\x62\x77\x9f\x26\x04\x40\xbe\xb8\xb3\x78\xdf\x83\xba\x54\x59\xf3\xfe\xd0\xd1\x9f\x32\x93\x50\x15\x12\xdf\xe1\x70\xe9\x49\x58\x99\x21\x1a\x52\x5f\x3b\xb2\x44\xb1\xc7\xfd\xee\x76\xfd\xff\x38\x7b\x97\xe5\xc6\x71\xec\x4f\xf8\x5d\x66\x55\x8b\x5e\x80\x77\xe0\xdb\xc9\xb2\x6c\xab\xcb\xb7\x96\x94\x99\x55\x33\xf1\x0f\xc5\x01\x70\x60\xb3\x2d\x91\x6a\x92\xb2\x53\xf5\xf4\x5f\xf0\x00\xa0\x48\x8a\xca\xea\x99\x4d\x65\x85\x09\x51\x14\x09\x02\xe7\xf2\xbb\x74\x87\x4d\x42\x16\x9b\x7f\xfc\xb9\xd9\x2c\x3a\x39\x03\x93\x86\x89\x95\x04\x5b\x2d\xac\x87\xd6\x62\xd5\x3e\xaa\xd9\xfd\x62\x1b\x77\x63\x54\x46\xa9\xd0\x8b\x24\x4d\xc9\x71\x8f\xff\x97\x30\x22\x93\x31\x6e\x64\x57\x3d\x3f\x0b\x6e\xf9\xc3\x90\x44\x16\x7b\x53\xee\x0f\xc7\x06\x9f\xf1\x67\x43\x8e\xf6\x3d\x7d\xc9\xcc\x70\x66\xed\x7c\xdc\x0c\xff\x67\x79\x1a\xdc\x5d\x1e\x26\x21\x0e\x3c\x2f\x07\x25\x1f\x23\x12\x8b\x5f\x76\xa8\x00\xd2\x6c\xab\x26\x72\x66\x23\x44\x48\x31\xd7\x7a\x31\x7f\x79\xbe\xdd\x7e\x7f\x79\xfc\xf6\xb4\xd8\x2e\xfe\xd8\xac\x66\xdb\x9b\x97\xe7\x6f\x7e\x06\x1b\x48\x53\x2a\x2b\xb4\x0b\x26\x56\xb7\x38\x12\x06\x34\x00\x16\x1f\xdf\xd1\x2f\x3c\xab\xb6\xdd\x0b\x46\x58\x79\xff\x11\x69\xcb\x3e\xf9\xd9\xcf\xc0\x1f\x51\xc8\xfb\xf2\xb1\xf3\xae\xbb\x31\x9a\x3b\xa0\x33\x02\xb2\x0d\x95\x00\x7e\xa1\x38\x7f\x19\xf3\x1b\x19\x5b\xc7\x8f\x8a\xfc\x56\xec\xb6\xd4\x26\xf9\x37\xa0\x3e\xd6\xe5\x1d\x8c\x30\xb9\x46\xc6\x9a\xfc\x3f\x6f\xb1\x6e\xaa\xf2\xd2\xe5\x7e\xf8\x23\x65\xaa\x08\x75\xeb\x9e\x84\xe7\x91\xf7\xcb\xa4\x83\x17\xdd\x28\x66\xfb\xdd\x8f\xf8\x86\x85\xae\x69\x6f\xf8\x95\x82\xb0\xff\x58\x64\x28\xd2\x80\xe2\x0d\x77\xf7\x65\x57\x84\x34\x4a\x58\x05\x88\xf7\x72\xa7\x07\x7d\x5a\xa3\x94\xa4\xdc\x11\x2b\xe5\x5c\xde\xeb\xb1\xda\xa7\x1b\x89\x51\x96\x74\x6c\xf9\xfd\xbe\x2f\x79\xe7\x47\x24\x76\xef\x81\x43\xb9\xdb\x95\xeb\x03\xaa\x1c\x76\x17\xe6\x27\xc3\x4b\xc6\x34\xe0\xb6\x30\xfd\x37\xdd\x0c\x83\x59\x68\x91\x79\xd8\x78\x37\xea\x89\xb9\x6c\x98\x22\xd9\x8c\x1f\x08\x84\x37\xe8\x75\x17\x7e\x19\xb0\x1b\x03\x9c\x5e\xc9\x26\xff\x79\x57\x1e\x8b\x1e\xc0\xcc\x18\x15\x85\x16\x80\x7d\xe9\x1e\xec\x87\xe8\x90\xb4\x33\xad\x5b\x72\x05\x79\x71\xc9\x9c\x1f\xff\xfb\x7f\x12\x3f\xfb\x0c\x06\x59\xe0\x82\xb5\xc9\x9a\x04\x67\x2c\xb6\x1a\x5e\xfe\xd5\xa2\x86\xd1\x99\xef\xe3\xc2\xdd\xab\x59\x2d\x67\x2c\xd1\x04\x98\xff\x67\x5e\x1c\x7b\xcb\x08\x67\x4c\x31\x92\x7a\xc5\x9f\x4d\x05\xe7\x22\x0d\x67\x0c\xd3\xae\xff\x42\xb0\x93\x3e\xa4\xac\x3d\xec\x68\xab\x96\xda\xb6\x85\xfe\x74\xe1\x2c\x48\xac\xef\x5b\x4f\x91\xe8\x7c\x4c\x4b\x42\xec\x2d\x7e\xc2\xfc\xe1\xae\xfb\xab\x61\xcc\x8c\x98\xc9\x53\xf3\xbc\x1d\x19\x39\x17\x4a\x82\x69\xfe\x36\x3e\x2a\xd1\xa5\x45\xcd\xb8\xfd\xd7\x0d\x31\x01\x3b\xeb\xe9\x38\x89\xa1\xe1\x98\x30\x06\xe5\xdb\xfd\x23\xf6\x10\x67\xa1\x11\x24\x3c\xfc\x5a\x7e\xe0\x1c\xdb\xf7\x65\xba\xae\xc8\x59\x94\x49\x82\x3e\xe5\x75\x7d\xc4\xea\x9f\xc7\x2a\xaf\x75\xde\x63\x3e\x72\x16\x89\x30\x62\x7d\x9f\x99\xfb\xb2\xd4\x17\xcc\x7c\xce\x62\x2e\x88\xe6\xd7\x13\x04\xbd\x8e\xf0\xe2\x2c\x09\xac\x6f\x98\x55\xea\xeb\xa4\x31\x38\x4b\xe2\x90\x50\x6e\xf8\x13\xd5\xb1\xc1\xf5\x21\x2f\xea\x61\x93\xd3\x0d\x4c\x59\x84\xb2\x23\x1e\xd8\x1a\xd1\x1d\xe2\xd6\x9f\x28\xe5\x19\x7d\x83\x75\xe8\xb3\xa5\xa7\x65\xf1\x1d\x6b\x6b\xb9\xee\x47\x49\xa4\x5a\x9f\x93\xcb\x76\x7e\x2e\x57\xee\x56\xaa\x64\xec\xca\x87\xf7\xb9\x69\xd6\xe5\x8e\xbc\x43\x36\xa7\x03\x8e\x9e\x72\x96\x45\xa4\xde\xf2\x34\xfb\x63\xf9\xf4\xed\xc9\x3b\x0e\x7d\xdb\x50\x41\xfa\x61\xb9\x59\x3c\x2e\xd7\x9b\x76\x67\x5f\xbe\xdc\x6e\xbf\xad\x6f\xfd\xf5\x70\x95\xca\xd4\x6b\x52\x59\x93\xbf\xba\x03\x70\x8e\xca\x6f\x9c\x71\xb4\x39\x9a\x33\xbb\x1e\xcd\x11\x11\x07\xce\x19\xa2\xcd\x84\xdd\x73\x25\x20\x59\x30\x08\xdd\x38\x13\x49\x4c\x28\x28\x07\xfa\x69\x27\xdd\xde\x46\x51\xdd\x8d\x12\x0a\xb5\xa7\x79\x5b\x77\x9a\xc1\x19\x20\xb2\xc2\x0c\xed\xe1\xdb\xbc\x57\x21\x1f\x3c\x33\x70\xa8\xf3\x36\xae\x3e\x35\xc4\x9b\x6b\xff\xe5\xbf\xf5\xba\xd7\xdc\x8f\x8d\x43\xea\xdf\x3f\xe6\x06\xd7\xd8\x6c\x19\x4b\xfd\xb5\x80\xab\xd5\xd0\x42\x68\x65\x13\x86\xb7\x1f\x8c\x75\x61\xb9\x85\x9f\x24\x62\x3e\x64\xcc\x70\x26\x99\x26\x38\x9c\x41\xbc\xc5\xa2\xdc\xe7\xc5\xd9\xeb\x9d\x33\x19\x5a\x3b\xdc\x1d\xd4\x9e\x4c\xe1\x0f\x29\xa6\xa9\xe9\x6c\x51\x14\xb3\xba\xc6\xa2\x19\xac\x57\x8a\x69\x63\xd7\x9d\x9f\x37\x8e\x32\xd1\xdf\xd2\x38\x53\x22\x22\xae\xf4\x3b\xd4\x13\xba\x36\x9c\x29\x08\xb8\xb5\xe6\x2a\xc9\x84\xda\x53\x50\xbb\xcf\xcb\x98\x54\x06\xee\x3d\x45\x9f\x33\x0d\x71\xe2\x7c\xe2\x36\xb9\xf5\x69\x9a\x15\x63\x82\xc2\xf4\x5a\xa5\x65\x20\x5d\xd9\x70\x51\x55\x45\xd9\x9d\x52\x45\xc4\xb9\x28\xad\x23\x61\xaf\x84\xc8\x19\x62\x44\xd2\x24\xa6\xac\xde\xda\x94\x72\xfe\x0e\x55\x3d\x7a\x00\xe8\x44\x1d\x41\xa9\xe3\x9e\x96\x67\x7d\x0f\x35\xa1\x60\xdd\x08\x13\xab\xd0\xb6\xc1\xe5\xde\xd9\xa5\xdf\x1c\x4f\x24\xf3\x77\x4d\xba\xd2\x7f\x92\x9b\xd8\x38\x23\x3b\x8a\x48\xc3\x17\x33\xfc\xfa\x20\xc8\x40\x9e\xbd\x45\x29\xd0\x9b\xb0\x52\xe3\x41\x98\x46\xa1\x8b\xdc\x49\x92\xfc\xa6\xdd\xe8\xfd\x31\x8e\x54\x83\x96\xc7\xd3\x53\x59\xf9\xaa\x1b\x0f\x42\xc1\x43\x8b\xa5\x52\xef\xb3\xdd\xee\xae\xac\xe6\x50\x68\xa2\x6a\x8c\xae\x22\xd4\x21\x80\x37\x1e\x27\xd9\xa4\x89\x6a\xd9\x3f\xc6\x9f\x11\x54\x27\xaa\x3d\xd3\x79\x12\xba\xc7\x83\x48\xa6\xdc\x89\x16\x2c\x55\x69\x93\x16\x77\x28\xe1\x48\x55\x89\x1b\x7d\xe8\xe5\x4a\xf6\x0d\xf3\x43\x84\xc5\x60\xb6\xdb\xe2\xfa\x7e\xfe\xad\xc6\x91\x4c\x01\x0f\x12\x85\x9d\x41\x35\xa8\x0f\xec\x5a\x65\xa3\x71\x29\xd3\xc4\x32\x69\x7a\xc6\x3a\xfe\x50\xc6\xd0\xb2\x6b\x66\xce\x22\xf7\xc5\xc6\x03\xd3\xcb\x6b\x90\x66\x31\xb5\x41\x4a\x43\x32\x1b\xbb\x7b\xd8\xe3\xb7\x6a\xd7\x9d\x0e\x33\x11\xfb\xbe\x63\x5e\xf4\xde\xe7\x20\xe3\x56\xef\xe7\x50\x7e\x9c\xff\xa6\x12\xb0\x9a\xa0\x9f\xe5\x07\xde\x57\x63\x9a\x37\x0f\x40\x04\xde\x22\x83\xe8\xcf\xbf\x7e\x32\x00\x01\x09\xc1\x37\xf0\x71\x66\x27\xf1\x40\x46\x92\xd4\x58\x8c\x73\x8c\xeb\x00\x04\x3c\x90\x89\x20\x06\xc4\xa1\x4d\xcd\xb6\xf1\x56\xb6\x93\xa0\x3b\x88\xcc\xdb\xc8\xd8\xda\x42\x6f\xed\x0b\x14\x47\xaa\x07\x12\x90\x70\xa4\x43\xe5\x86\x68\x9e\xd0\xf6\x97\xbb\x8e\xfe\x0a\x35\xe2\xb4\xf7\x10\x0f\x34\xd8\xa2\xe4\xa2\xac\x5f\xf3\xbf\xfe\x82\xf5\x2e\x57\x78\x5b\x5a\x59\xbf\x0a\xf2\xb1\x0e\x31\x0f\xb4\x92\x3e\x99\x7f\x82\x9f\x24\xda\x37\xed\xf7\xc7\x03\x64\x41\x18\x8f\x30\x0a\x14\x8d\x0c\x87\xb5\x69\x7a\x46\x7b\x95\x45\x4b\xc9\x1d\xf6\x62\x85\xf1\x58\x91\x26\x54\xe8\xdc\xed\xd6\xb8\xdb\xd1\xb2\xf0\x6a\x15\xfc\x77\x17\xd0\xc5\xd1\xf5\x98\xb8\x13\x6a\x74\x08\xa6\xf5\x65\x1c\xd6\x8e\xf2\x4a\x42\x36\x36\x58\x37\xd5\x51\x35\xe7\x58\xea\x57\xf1\x3e\x0f\x8c\xe6\xd6\xbd\x98\x1a\x4a\xfd\xe8\x76\x18\xcc\x05\xc6\x28\x4a\x4c\xee\x6d\xcc\xd0\x73\x92\xe3\x21\x13\x21\x09\xc1\xb8\x96\xec\x69\x2f\xcb\x01\x88\x8d\x87\x4c\x26\x14\x0d\x91\x4d\xcf\x38\x55\x18\x5c\x51\x18\x28\x1b\x42\xff\x1b\xd4\xc7\x6b\xd9\xf4\x5c\x39\x79\x18\xa0\x2d\xb4\xd8\xce\xca\x40\x39\xf0\xca\xd9\x42\xc9\x09\x2e\xd1\x03\xd4\xd8\x8f\x4d\x91\xfb\x78\x18\x2a\xe9\x8b\xfd\x6d\x78\xb5\xac\x07\x05\x35\x1e\x86\x86\x93\x50\xbb\x2d\x7f\xaf\xc1\x8c\xb6\xbd\x30\xca\x62\x0f\xb1\x76\x35\x32\xda\x12\x2e\x46\x21\x53\x1d\xf1\xeb\xe6\x78\x92\x3d\xbd\x5c\x37\x26\x8e\x04\x85\x5e\x94\x0d\x6d\x2d\xb6\x6a\x82\xc1\xc4\xc3\x38\x4e\x03\xed\x19\xc7\x6d\x88\xd5\x45\x00\x61\xcc\x4d\x08\x7d\xe8\xcf\x2f\x53\x68\x1e\xc6\x22\x22\x6e\xc9\x61\x07\x45\x83\x7a\x84\x54\x6d\x8f\x0b\x8a\x0a\x72\x55\x8e\x32\x91\x30\x86\x98\x16\xa1\xb2\x70\x12\xcc\xfe\x40\x12\x85\xc4\xe6\x6a\x88\x3a\x55\x9f\xf5\xd6\xfd\xf1\x2c\xb1\xc2\x2d\x5e\xc5\xe3\x6e\x57\x3a\x76\xee\xa8\xfb\xc6\xc3\x44\x33\x6c\x27\xda\xb6\x7d\x3e\xf3\x36\xdc\x9c\x7e\xea\x69\x6c\xa2\xc8\xf3\xcb\x9e\x86\xa6\x11\x3c\x4c\x8d\x24\xef\xf7\x6d\x97\x73\xad\xdf\x09\x9d\x3a\xf5\x1a\x86\x99\x02\xe3\x96\x05\x72\xa5\x1c\x3d\xa6\x0c\x35\x15\x48\x57\x08\x07\xac\x82\xc0\x7f\x09\x4f\xb0\xe7\x86\x4d\x0a\x65\x03\x4d\xfa\x31\xbb\x74\xf4\xad\x3c\x43\x13\x9e\xd3\x07\xcb\x87\xbe\xf2\x6b\xb9\x88\x09\x3f\xac\xac\x12\xd7\x52\x95\xb6\xe4\x3c\xe2\x40\xb7\x03\x39\xd5\xe9\xba\x5b\xad\x27\x76\xcc\x90\xcb\x30\x89\x5d\x5c\x62\xf9\x6e\xbd\x7a\x19\x0f\xb9\x96\xf4\x6d\x14\x52\x39\x25\xbf\xe1\x09\x44\xc4\x14\x5a\x83\x6e\xd4\x9b\x92\xea\x72\xfd\x4c\x6b\x44\xb3\xed\x6d\x18\xa1\x90\x19\x35\xd1\xe5\xb1\x3d\xef\x20\xe2\x0c\x21\x4b\x98\x5b\x0f\x9f\x6c\x3b\x65\x4c\x8b\xe1\x21\x60\x62\xc2\x9e\x48\xcb\x5d\x59\x2d\x1b\xdc\x8f\x47\x19\x91\xba\x94\xeb\xb8\x83\x6a\x51\x10\xbc\x69\x70\x79\x67\x8f\x98\xe9\x37\x45\x32\xc9\x98\xef\xa0\x3a\x0f\xe4\xd2\x35\x27\xfc\x05\xcb\x20\x8e\x95\x37\x03\xde\x63\xd1\x8c\x7a\xe2\x7e\x58\x6c\x21\xb5\x05\x5e\x33\x50\x19\x2d\x52\x3a\x0a\x53\x97\xbe\x11\x50\x6d\xf8\x22\xea\x8c\x11\xec\x92\x3a\xbe\x16\xc2\x30\x8a\x6a\x43\x2d\x6d\x31\xba\xcd\x58\xdf\xa1\x79\x80\xc3\x01\x8b\xf3\x22\x87\x4c\xc5\xe2\x6c\x1c\x52\x75\x0e\xf4\xb3\xba\x0d\xe7\x7a\x76\xe2\x3c\xc4\x2c\x89\xce\x2c\x18\xe7\xf4\x35\x9e\xda\xd3\x53\x1c\x39\xa4\x67\xdb\x61\x32\x1c\xb6\xd8\x69\xaf\x85\xe2\x3f\xed\xeb\x4e\x3c\x44\x01\x01\xf6\xf4\xf5\xbe\xe3\x7b\xae\x76\x68\xd9\x80\xe3\x79\x8c\xc8\x32\xd3\xa9\x50\x77\x5d\x4e\x37\x77\x46\xb7\x04\x4d\xc6\xfd\x3d\x7d\x3a\xfa\x58\x2d\x34\x4e\x9e\xd8\xb9\x62\xe8\x73\x82\x1f\x31\xa6\x28\x2a\x9a\xb7\x77\x8f\x9c\xe8\x3b\x12\xef\xf0\xdc\x11\xd3\x29\x49\x0f\x2c\xeb\xfb\xb2\x99\x12\x6d\xf3\xe3\x8c\x55\x5b\x78\xc3\xe6\x0c\xc5\xb6\xb7\x21\x76\x43\xc2\xd8\x22\x08\x3d\xbe\x66\xf8\xec\xa3\x28\x10\xdc\x38\x19\xfe\x27\xdc\xdb\x79\x19\x5e\x2d\x91\x0d\xae\x32\x92\x76\x6f\x75\x2e\xd0\x93\x24\x61\x1e\x45\x06\xe2\xb3\x6c\xf7\x14\x35\xfd\xef\x9a\x71\x3c\x8a\x43\x45\xc8\x61\x47\x9b\x3a\x2b\xb4\xf2\x28\x16\xcc\x4a\xa4\xbc\xe7\xd3\x15\x52\x1e\xc5\x68\xa8\x78\x61\x05\xd6\xf0\xb4\x19\x31\xbe\x79\x94\x60\x42\x21\xbf\x47\x56\xdd\x7e\x5b\xcd\xa8\x60\x11\xff\xe9\x87\xa4\x49\x60\x8d\x6c\x28\xb1\x75\x98\xb5\x36\x8c\x5b\x9f\xf3\x95\xb2\xdc\xfd\xd2\xad\x6d\xea\x87\x4e\x14\x78\xa2\x54\x80\xb3\x16\x25\xbe\xc8\xa0\xe7\xc9\xa3\x2c\xe0\xda\x03\x16\xdb\xb5\xa4\x3c\xf6\x4b\x60\x11\x8f\xb5\x5f\xd0\x3c\x50\x74\x9c\x25\x46\x5c\x03\x74\x44\x0b\xd8\xed\x2f\x3a\x54\x3c\x12\x10\x13\x0f\x77\x6b\xe3\xbc\x45\xf3\x7e\x29\xbb\xcc\x23\x21\x81\x0a\xe2\x7f\xdd\x5b\xe5\xcf\xd1\xa5\x42\x26\xa8\x8a\x7d\xa8\xf0\xad\x80\xa2\xf9\x3d\x6f\x9a\x0e\xbb\xcc\x23\x90\x48\xd5\x7a\x2b\xd1\xf2\x05\x95\x5e\xdf\x0c\xa2\xc0\x48\x46\x41\xe2\x4c\x29\x89\x90\x35\x3a\xbf\x74\xae\x17\x33\xad\x6f\xa0\xf8\x20\x0d\x0e\xe3\x6a\x22\x7c\x34\x87\x54\x22\x88\xdb\x7b\x9b\xbf\xe5\x0d\xec\xee\xcb\x9d\x5f\xbe\x22\x1d\x26\xe4\x65\xb7\xb6\xab\xdb\xe8\x4e\xe8\x58\x19\x02\xdd\x3c\x6f\x46\x21\x4c\xa4\x8d\xd5\xea\x27\xdf\x8f\xbc\xf8\x84\x5d\xae\xd7\xc7\x5c\xe5\x5d\x30\x13\x19\xe1\x7d\x66\xfe\x65\xdd\xb5\xfc\x62\x1e\xf9\x97\xd8\x18\x46\xa5\x76\x6b\x32\xe3\x63\x8e\x98\x05\xdc\x46\xae\xed\x7d\x79\xc8\xdf\xde\xd7\xea\x3c\xed\x63\x66\x18\x91\x57\x29\x60\xa4\x8d\x6b\x78\xd5\x71\xc0\xb9\xf1\x3e\x4d\x4d\x79\xb8\x28\xf7\x9f\xd7\xc8\x38\x8c\x18\x19\x02\xae\xdf\xcb\x2f\xec\x77\x0a\x79\x1c\x45\x92\xea\x4d\xb7\x15\x7c\xbd\x56\x48\x06\x28\xee\x50\x92\xb2\x98\xf4\xad\x8e\xaa\x71\x19\xfe\xf0\xbd\x8b\x53\x11\x53\xa9\x79\x07\xb5\xab\xa0\xbe\x42\xae\xcf\x47\x6d\xbd\x48\x81\xcd\x52\x9c\xee\xff\xb0\x92\x17\xa7\x3a\x08\x2d\x94\x83\x96\x7b\xe7\x90\x31\x1c\x93\xa5\x5a\x3a\xe9\x4c\xcb\x96\x3f\xa7\x95\x7f\x27\x2c\xc0\xe3\x2c\xcb\x84\x6d\x3b\x1f\xbd\x63\x25\x8f\x33\xc5\x68\xbb\xcf\xf5\x68\x35\x8b\xb9\xb0\xd0\xf8\xe6\x3d\x2f\xde\xe8\x6a\x7e\x1b\x32\x58\x78\x2c\xe2\x80\x38\x41\xba\xec\xab\x16\xf3\x58\x48\xeb\x08\xbc\xb0\x01\xda\xe6\x97\x3a\x79\xd3\x17\x2b\x9c\xaf\xca\x9b\x6b\x9f\x70\xe6\x0e\x80\x50\xd4\x08\x7e\x2c\xdf\xc2\xad\x29\xd4\x35\xc2\xe8\xa4\x4c\xff\x70\x2d\x0a\xae\x7c\x37\xe8\x84\x40\x0a\xdf\xff\x7d\x3c\x43\x86\x78\x2c\x03\xe1\x75\x51\xdb\x4d\x72\xfb\xd6\xb5\xb7\x78\x2c\x45\x42\x6f\xef\x94\xd2\xfc\x30\x3a\x8a\xa5\xb6\x90\x41\xbb\x97\xb4\xeb\xd1\xe4\x6e\x12\xab\x8c\x45\x56\x90\xe4\xad\x9d\xf5\x4b\xa7\xa7\xf3\xdf\xb2\xf5\x47\xbf\x49\x33\x0b\xb6\x69\x10\xf6\xcf\x24\x5c\xac\xf1\xe7\x60\x05\x8a\x75\x00\x94\x2d\xdb\x04\xf2\x26\xd7\x43\x5b\xe4\x09\x98\x37\x8f\x75\x2a\x68\x79\xcd\xeb\xae\xc3\xec\x5b\x63\x7e\x84\x8c\xa4\x71\x77\x66\x51\xa9\x90\xdd\x62\x4f\xef\x75\x3c\x73\xe9\xef\x21\xeb\xfe\x1d\xde\x12\xe4\x89\xb7\x6f\x7e\x5d\x6e\x51\xe7\xcd\x36\xf2\x49\x45\x6c\xa4\x45\x05\xb7\x61\x18\x05\x40\xf3\xbe\x09\x92\x1f\xa4\xd3\xa4\xdb\x20\xf7\x2b\xdc\x41\x33\x76\x24\xe3\xb1\x31\x9a\x62\x92\xd5\x6c\xb3\xd8\xce\x57\x2f\x3f\x6e\xa9\x45\xbf\x0e\xdd\x57\x25\x2c\xc8\xac\x6a\xe2\x0e\xa1\xfa\x27\xa8\x8f\x43\xd9\xbc\x9e\x95\x06\x2d\x56\xbe\x1f\x57\x75\x1f\x4c\x03\x6d\x89\xf8\xba\x5c\x36\xdd\x5f\xb3\x30\xb0\xfa\x5d\xfb\x03\xd1\x27\x5e\xcc\xa5\xac\x3f\x4f\x02\xc1\x8c\xb3\x0c\x9d\x1f\xeb\xa6\xdc\x63\xf5\x95\x37\xef\x8b\xcd\xc3\xaf\xab\x5a\x49\x80\x16\xae\xf3\xb2\x2f\x72\x5d\xee\x76\xe0\x73\xe0\x24\x64\xb6\x51\xb5\xf8\x6c\x23\xf0\x7c\x80\x23\x6d\x8f\x6a\xab\xd5\x83\xc5\xb4\x7f\xfa\xaf\xbf\x36\x44\x4e\x71\x44\x97\x49\xda\x8d\x6f\x3a\x51\x4b\x22\xcd\x22\xe7\x9c\x35\xab\x3f\x72\xe7\x04\x6a\x6d\x64\xfc\xe5\xc6\x61\x48\xe1\xfb\x6a\x71\xb7\x58\xad\x66\x8f\x16\x1b\xb0\x7d\x5c\x7c\x5f\x3c\xfa\x79\x90\x24\x68\x8d\xff\x5c\x57\xf0\xc5\x8c\x12\xf5\x24\x85\x94\xc8\xc3\xaa\x3c\x1e\x76\xb8\xdc\xc3\x1b\x2e\x5f\xef\xd6\xef\x50\xfb\x55\x31\x49\xa5\xa2\x46\xe0\xcd\xf1\xe4\x1c\x91\xc6\xe7\x50\x01\x09\xcd\xed\x21\x2f\xb6\xbd\x2a\x65\x92\x22\x0b\x5c\x8f\xf8\x7b\x69\x23\xb8\x49\xad\x0a\x9e\x64\x91\x34\xe7\xdb\xe3\x6f\xce\xf4\xad\xcc\x32\x43\x52\x36\x0a\x76\xed\x5a\x30\x3e\x93\x40\x85\x7e\x3a\xb6\x41\xc3\xf8\x6a\x79\x0c\x64\x04\xfc\x0e\xf5\x6c\x57\x21\xe8\x13\x6d\x52\x7a\x3c\x2c\xb3\x64\x14\x8d\x9f\xb8\x2b\x0f\x5d\x3d\xdd\x1f\x56\x92\xca\x61\x56\xae\x93\xbc\xec\x7e\xeb\x29\x70\x76\xd3\x46\x04\x19\xd5\x89\xce\xda\x6d\x9b\x92\x1a\xda\x57\x9e\xbc\x90\xa1\x76\x55\xba\x5b\x5b\xa0\xbb\x85\x06\xae\x0d\x56\x1c\xc3\xb3\xf7\xac\xd3\x9c\x19\x8e\x81\x24\xf5\x9a\x59\x3e\x18\x98\x5c\x62\x13\x48\xad\xd4\xae\xce\x6b\x8a\x2e\x28\x55\x69\xa7\x1e\x35\x2c\xc7\x83\x33\x4d\xa8\x50\x87\x44\x5b\x1d\x77\xe3\x48\x24\x91\x82\x51\xd6\xf6\xaf\x23\xe8\xde\xce\x91\xa8\x38\xcc\x6c\x3f\x88\xb8\x80\xe7\x8e\x73\xa2\x54\x96\x04\xce\x81\xf3\xca\x2f\xd6\x01\x78\xe1\xcc\x6f\x85\xca\x2b\xfb\x2e\x69\x5b\x86\x9f\x58\xe3\x12\x2d\xd0\x6a\xda\xbc\x3c\xfe\xad\x3c\x16\x4f\x90\x31\xe3\x6a\xd4\x2e\x2e\x21\xa5\xa0\x0d\xfe\x1c\x9f\x17\x63\x2b\x7a\xe8\x74\xcd\xe7\xe0\x25\xfc\xfc\x71\x61\x3b\xd2\x3d\x33\x03\x9f\x7c\x0e\x27\x88\x09\x23\xb2\x30\xdf\x42\x25\x73\xd7\xd5\xf5\x60\x58\x3b\x24\x0d\xa2\x24\xe9\x3b\x1c\xb6\x29\x64\x87\xe5\x19\x3e\x98\x34\x50\x32\x74\x54\x8e\xe7\xf2\xcb\x35\x7f\xa9\x5f\xeb\x07\x60\x42\x74\xcf\x36\x76\xa5\x93\xf4\x03\xbf\x34\x54\x01\xeb\xe3\xb9\x5d\xe0\x5d\x6f\xca\xc7\xf2\x2d\x57\xe7\x61\x80\xca\xb3\x62\x48\x93\xc9\x73\xb1\xdc\x80\x38\x48\x14\x3b\x63\xa5\xea\x72\xb7\xcb\x35\x6c\x10\xf6\x03\xd4\x42\x1a\x3b\x09\xb3\x8a\xfc\xbf\x7b\x82\xf0\x3c\x8d\xb5\xcc\x82\xb3\x6c\x1c\x36\xf9\xc0\xa2\xbc\x7b\x14\x69\x92\xda\x5c\xdf\x58\x9c\xc8\xa0\x16\x94\x26\x02\xb4\x17\x90\x92\x79\x33\x78\x89\xd3\x44\xd9\xfc\xef\x8d\x30\xfa\x5d\xf9\x2b\x4d\x59\xa0\x6c\x33\xaf\x21\x1b\x65\xdd\x1d\x08\x6c\x83\xa3\xdd\x6d\x6f\xdd\x7b\xf2\xeb\xe2\x7c\x9a\x0a\x46\x46\x6e\xb2\x2a\x41\x2b\xa8\x9b\x27\xac\x6b\x78\x1b\x30\x6b\x78\x9a\x82\x6d\x3e\xbd\xc2\x69\x55\xee\x76\x0f\x79\x7d\x21\xe8\xc9\xd3\xd4\x64\xa4\x1a\x34\x2f\x8b\xba\x81\xa2\x81\xc1\xa3\xcb\x02\x4d\x0f\x76\x76\xd4\x79\x73\xd9\x72\x1a\x46\x0f\x69\x26\x05\xdd\xf8\x2d\xcd\xc6\x4d\x79\x63\x27\x65\xbf\x5a\x9f\xf2\x50\x04\x0e\x62\xb4\x3c\x0c\xaf\x97\x27\x01\x11\xc5\x7e\x7f\x5a\x0c\x2e\x82\xab\x10\x3c\xfd\xb2\x7d\x7b\xd0\xe1\x6e\xd2\x78\xf4\xfd\x22\x51\x84\xcf\xbc\x5d\xdb\xcf\x4f\x56\x7e\x52\x01\x8c\xc7\xe7\x69\x64\xfb\x16\x57\x54\x5e\xdd\x47\x64\x6a\x68\xc7\xb3\x75\x87\x3b\xd8\xed\x24\xa8\x0f\x8f\xa7\xf6\x83\x32\x41\xf8\xe1\xbc\xf6\x5c\x7f\x1f\x51\x8e\xb6\x81\x54\x82\x2d\xae\x13\x33\x8c\x38\x02\x4f\x79\xe1\xf3\xdd\x5e\xfe\x9d\x4a\x29\x99\x57\xf8\x38\x1c\xe6\xa5\x1e\xa5\x34\xa9\x54\x40\xe0\x84\xb2\x68\xca\x5d\xf9\xe6\x9b\x86\xa9\x12\x32\x08\x3c\x22\x65\x5a\x64\x6f\x58\x07\xf5\xea\x22\x6d\xee\x31\xe2\xd1\xf3\x54\xe9\x4c\x5b\xb5\xe3\x4a\x6f\xc9\x61\x6f\xdb\x33\x1f\xe4\xa9\x16\x8a\x0a\xe3\xb0\xdb\x95\x5f\xb3\x4f\x68\xa0\x1a\x0a\x6b\xb4\x43\xbc\x04\x81\x6c\x7f\xef\xe4\x6e\x91\x6a\x19\xd2\xfc\x41\x55\xd6\x24\xa9\x70\x73\xcc\x49\x51\x6e\xf8\x7e\x63\x94\x11\x5d\x73\x3e\x7f\xd8\x2e\x6e\x97\x1b\x8f\xe7\xe4\x29\xc6\xa1\xc8\xce\x22\x87\xf3\x2e\x61\x4a\x31\x63\x54\x3d\x30\x65\xa5\x70\xa6\x3f\x7b\x99\x7f\x8a\x92\x53\x86\xa6\x8a\x66\x7b\xc0\x6a\x8b\x65\xf7\x55\x86\x45\x96\x70\x03\xc6\x0f\xcf\x18\xe3\x44\xac\xcb\x09\xf8\x3e\x6f\xc3\xbd\x06\x2b\x92\x1f\xaa\xba\x31\x71\x46\x72\x27\x8f\xe5\x1b\xb1\x7a\xf4\xd8\xb8\x97\x67\x0c\xb2\xa8\xd3\x61\x7a\xde\xdc\x76\x1f\x05\x1d\x78\x01\x5d\x77\x97\x86\xd8\xf7\x5e\xba\x9d\x31\x65\xb5\x2a\x74\x59\x58\xbc\x82\xf5\x70\xbf\xcf\x3f\x47\x68\xbc\xf3\xbb\x32\x9c\xda\x59\x10\x5b\x07\xad\x83\x03\xbf\xfe\xc8\x9b\xf7\xbb\x7c\x5c\xb8\xc8\x68\x49\xfc\x5f\xff\xdf\xff\xfa\x63\xf1\x3c\xef\xbf\x9c\x59\x14\xd9\x7a\xc7\x62\x5f\xfe\x3b\xef\xfe\x98\x21\x61\x3f\x6c\x3b\x15\x2f\x69\x7b\xd3\xd7\x92\x70\x2b\x14\xf5\x55\x56\x3b\x3d\xaa\xab\x65\x09\x80\xf5\xf8\x77\x1b\xd6\xb9\xb0\xef\x07\x28\x65\x9c\x54\x85\x05\x96\x10\xfc\xc6\x79\xf2\x8d\x6b\xf5\x59\xca\x90\x3a\xce\x2b\xf2\x33\xce\x8b\xb7\x99\x6b\x4b\xf4\xa7\x6d\x96\xc6\x31\xed\x17\xb3\xe7\xcd\xed\xe0\x67\xa7\x9a\x01\xe1\x20\xeb\xe6\xd8\xe0\x0e\x7c\x87\xcb\x1d\xce\x8c\x15\xd9\xfa\xcf\x31\x57\x1f\xeb\xb2\x3a\xdb\xf0\x86\xc1\xff\x4c\xe5\x79\x19\x0f\x53\x4a\xc7\x57\xe7\x3d\x3a\xe3\xda\x8a\x38\x2d\x36\x0f\x16\xf8\x4c\x0a\x7a\x8b\xf5\xda\x0f\x10\x09\x27\xf8\xef\xf7\x97\xe1\x43\x11\x59\x4c\x85\x88\xc5\xf3\x66\xb1\x5a\xdc\x6e\x9f\x66\xeb\xdf\xcf\xc7\x14\xf5\x9f\x70\x9f\xfb\x26\xe1\x5d\x55\xfe\x75\x85\x81\xc4\x33\xa1\x42\xca\xa8\x9e\xf1\x6b\xd0\xa0\x1d\x8d\xd2\xf6\xe6\x3f\x2d\x9f\xdd\xa5\x12\x40\xde\x7f\x29\xa4\x21\x39\xbd\x7d\x96\x0d\x2e\x2e\x49\xd4\xbf\xf5\xa6\x34\xa8\x58\xc9\xbe\xdb\xba\xd7\xd5\xf7\xc7\xb5\x21\x48\xb4\x69\xe3\x1e\x30\xb8\xad\x8f\xd2\x4e\x94\xc9\xbd\x32\x93\x81\xed\x42\x7e\x7f\xf9\xdf\x83\x7b\xa4\x24\xb8\x6a\x50\x7d\xc4\xe7\x72\x3f\xd6\x5e\x6c\x47\x68\x5a\xf6\xea\xa3\xb4\x5b\xbc\x5f\x16\x32\x1d\x46\x34\x2d\x1e\x5f\xee\xb7\x4f\xf0\xb3\x93\x17\xf6\xa2\x10\xc3\xf3\xe8\x48\x78\x56\x21\x91\xed\xa8\xeb\xda\xc1\x3a\x47\xcb\x82\xe6\x9c\xfc\x5d\xed\x56\xf3\x7b\x79\x86\x44\x4f\x51\x37\x79\x86\xca\x06\x3b\x64\x1b\xd5\xdb\x68\x33\x74\x32\xc0\xab\x97\xee\x29\x98\x8c\x91\x4d\xed\x4c\x7f\x62\xd5\xe4\x35\xb5\x85\xee\xf2\xe2\x02\xb3\xcd\x33\x03\x2a\x64\x3d\xa6\x21\xc5\x63\xc1\xe8\x87\x19\x6d\xb5\x1d\x9f\x96\xcf\xcb\xed\xfd\xec\x69\x41\x0a\x3c\xdb\xdb\xc5\xdd\xec\xdb\xa3\x03\xe2\x73\xce\x62\xc9\x1c\x08\xe2\x16\x3b\x35\xe2\x0b\xf3\x35\xce\x59\x2a\x42\x17\x1a\x58\xb2\xc3\xef\x78\xea\x09\x30\x71\x1e\xa4\x49\xea\xe0\x02\xeb\x03\x5e\x4b\x77\x78\x20\x19\x6d\x8a\x1f\x27\x65\x1d\x5c\x86\xbf\x8d\x07\x46\x70\x1b\x47\x82\xde\xe6\xa9\xdf\x3d\x78\x18\xc4\x14\x7e\xdb\xf9\xfb\x3c\xf3\x62\x42\x9c\x87\x3a\xa4\xb4\x63\x97\xff\xe7\x98\x6b\x27\x9f\x3b\xac\x50\xf2\x28\x15\x1e\x58\xb3\xa5\x8d\xf0\xaa\xea\x21\xe7\x91\x0e\x89\x73\xb8\xfc\xf6\xda\x9f\x93\x3c\x56\x49\x90\xf5\x1a\x2c\x3f\xca\xea\x03\xab\x99\x31\xa8\x9a\x41\x1d\x65\x74\xbe\x24\x4d\x85\x35\x19\x28\x4e\x03\x8c\x12\xcf\xc0\x90\x6c\x20\x45\xda\x37\x13\xe4\x06\x37\x8e\xa7\x29\xf9\xcf\xf8\x6d\xa0\x1f\x35\x73\x91\x30\xa6\x1c\x4d\x08\x1b\x92\x39\x1f\xbe\x94\x5c\xa4\x22\x0b\xe9\x65\xba\x39\x9e\xee\x8e\xde\x90\x85\x73\xc1\x63\xf2\xeb\x6c\x33\x78\xdf\xfb\xf2\x87\x44\x46\x36\xf8\x33\x63\xf2\x5d\xde\x49\xde\x5d\xe3\x20\x71\x2e\x8c\x22\xf9\xca\xbe\xae\xef\x18\x6a\x3a\xd9\x2f\xe5\x10\x74\x5c\xf4\x97\x63\x3b\xf7\x8f\x15\x6e\x35\xd6\x5b\x5d\x95\x79\xf7\x5a\x73\x99\x44\x59\xd8\xb3\xcb\xbd\x4e\xcc\xe4\x5c\xf2\x0e\xf3\x77\x0f\x7b\x5c\x14\xa3\xb7\x9e\xab\x34\xe5\x96\xbb\xa4\xca\x4a\xdf\x22\xec\x6c\x32\xb7\x42\xa8\xcf\xfc\x86\x7f\x8c\xda\xbe\xbd\x7f\x46\xd4\x20\xce\x15\x68\x92\x27\x20\x1d\xa6\xca\x53\x83\x9c\x43\x45\x97\x4f\x70\xcd\x2c\x3d\x5f\x1e\x4f\xe7\x80\xa0\x27\x07\x72\xe5\x1e\x69\x69\x3b\x8a\x75\x87\x1d\x59\xd6\xa3\x8d\xe1\xbc\x4a\x73\x54\x51\xe2\x90\x26\x67\xad\x3e\x77\xcc\x04\x86\x3c\x94\x8a\xb2\xc9\xcd\xe9\x45\xd2\x13\xaa\x2e\x54\x9d\x06\xfb\x1f\x37\x5a\xea\xa1\xc0\x55\xcf\x5c\x9c\x0b\x16\x73\xa3\x06\xc8\x16\x72\xd4\x1b\xbe\xd9\x82\x25\x21\xed\x87\xdb\x1a\x9b\xbb\x0a\xf1\xaf\xbc\x78\x73\x04\xb8\xfe\x6f\x18\x3e\x4a\x11\x04\x52\x5a\xb5\xb6\x52\xdf\xf5\xdf\x47\x11\x44\x3c\x70\x4b\xd7\xea\x65\xf9\xdb\xe8\x63\x2a\xa3\x26\x90\xed\x4b\xbb\xb4\xd7\x0b\xb7\x4f\xdd\x62\x11\x06\x56\x8c\x03\xb4\x3e\x77\xfa\x86\x75\xf3\x69\x37\x2d\xba\xea\xcb\x9e\xad\x08\x95\x35\x02\x34\x5f\xfa\xd5\x89\x3c\x0c\xbf\x31\x66\x36\xd7\xd9\xbe\xd1\xe2\xdb\xe4\x16\xac\xb6\xa9\xa0\x50\xef\xd8\xdf\x2f\x44\x1c\x02\x95\x07\x0b\xfc\xda\xda\x39\xfb\x6b\x70\x93\x88\x53\xa4\x76\x6f\xbb\xa7\xbf\x14\xaf\x50\xc1\x1e\x9b\x1e\xb6\x69\x30\x38\x89\x25\x29\xe2\xa9\x72\xb7\x43\xd5\x2c\xea\x26\xb7\xee\xb5\xbf\x0d\x87\x25\xd6\x09\xf1\x2b\xdf\xed\x36\xef\x95\xf7\xdb\xe1\x22\x49\x39\xe5\xb2\xb4\x5b\x3f\x5e\xad\xe5\x88\x84\x0b\xd7\x26\xd0\xf9\x67\xae\x8f\xb0\xb3\x36\x09\xfe\x30\xf2\x84\xbb\x8e\xfa\x30\x6f\x17\x69\x94\x7a\x71\x4f\xe2\xf8\xae\x47\x6a\xa2\x5c\xa4\x1c\x98\x23\x0e\x0f\xc4\x46\xa7\xb3\x61\x91\x9a\xcc\xab\xed\xae\xb0\x2e\xc9\x9b\x7f\x8a\xd6\xcf\x45\x96\x1a\x52\xc9\x27\x4d\xb2\xef\xd0\x29\xfe\x72\x91\x49\x1f\xd3\x3a\x01\xe9\xe9\x20\x47\x70\x08\x94\x23\xf1\x5a\x37\xda\x29\xfe\x2e\x17\x22\xb1\x89\xe7\xe2\x8f\xd7\xb9\xff\x0a\x61\x02\xd0\x9d\xe5\x4e\xf5\x76\x2e\xe5\x4d\xae\x13\x02\x12\xa0\x3d\xaa\x28\xf5\xb8\x0c\x2a\x00\x03\x52\xe3\x2d\x8e\xfb\x59\x25\xf3\xb3\x14\x39\x17\x60\x62\xda\xdc\x0f\xe5\x57\xbd\xbf\xf2\x2b\xc0\x98\x11\x42\x68\x00\x85\x6d\x73\x5a\x5a\x04\x66\x5a\x53\x11\x60\x84\x65\x11\x32\xb5\xfb\x54\x6d\x25\x16\xda\x10\xe3\xe6\xf4\xa3\xca\x9b\xcb\x3b\x3f\xac\xa8\x0a\x25\x62\xf0\xa2\x14\x3e\xbd\x5f\xb7\x5b\xae\x5a\xe7\xbe\xfe\x24\x14\x44\xde\x13\xfa\x7b\xd9\x38\x74\xcb\x68\x8e\xe8\xc0\xb6\x3f\xda\x59\x74\xac\x8a\xd5\x05\x9e\x59\x60\xca\x6d\xf6\xda\xce\x4b\xcf\x4e\xf8\x3b\xca\xe1\xe8\x46\x21\x22\xad\x58\x79\xfd\x84\x7b\x69\x6b\x76\x53\x82\x0c\x5c\x18\x66\x55\x75\x3b\xe2\x49\xfd\x9a\xab\x8f\x41\xdd\x45\x98\x58\x47\x71\x07\x6d\xfa\x36\x9f\x97\x79\xb1\x46\x92\x87\x1a\x74\x3f\xfd\x70\xc1\x48\xa6\x87\x50\x70\x65\x85\x23\x1f\x5a\x3b\x0a\x18\xd7\x94\x25\x6f\xde\xed\x00\x47\xf7\xe6\xc0\xd0\xa2\x68\x6d\xe1\x63\x80\x28\x1e\xfe\x4a\x20\x1d\x00\xe2\x1f\x34\x70\x7b\xec\xf6\x17\x08\x63\x99\x9c\xe5\x15\xfa\x0b\x36\x44\x4c\x07\xa9\x07\x23\xd4\x87\xb2\xe8\x48\x07\x10\x09\x45\x51\xf8\x01\x4e\x77\x65\x45\xad\x00\x7f\x04\x80\xe2\x7c\x17\x4b\xf4\xea\xca\x10\x07\x36\xbb\xed\x3a\x2c\x93\x7a\x9b\x17\x4d\xb6\xe1\xef\x88\x13\x6b\x2a\xd6\x2e\xab\x98\x7f\x22\x81\x4a\xbf\x1d\x36\xa3\x9a\x23\x24\x81\x65\xd7\x5b\x24\x85\x6e\xd3\x84\xc1\xfc\x87\x24\x46\x82\x13\xb7\x77\xde\x6a\xa9\x95\xd5\x6b\x45\xd5\xc4\x2e\x05\xb9\x72\x2f\xd3\x30\xa0\xf5\x53\x39\x5a\x9f\x6f\xe6\x40\x9a\x26\x24\xa6\x34\xfb\xd7\xb2\xfb\x13\x17\x00\x67\xa5\x92\xd7\x5c\xf5\x21\xf4\x7e\x90\x54\xa4\x89\x67\xd5\xc6\x7b\xdc\x1a\x7f\x5c\x27\xa4\x89\xe6\xf5\x8e\x37\x78\x95\xee\xde\x0e\xce\x08\xa9\x7c\x33\x7b\xfe\x7d\xf5\xf2\xf8\xe8\x64\xdc\x88\xd7\x73\x3e\x21\xaa\xa4\xa7\xad\x65\xa3\x9f\x9b\x53\x17\xda\x74\x97\x96\x49\xd0\xee\x3d\xbd\xb3\xc6\x6a\x17\xbe\x0e\x1c\xb8\x01\x5b\xad\x53\xa5\xbd\x77\xfd\xdd\x73\xfa\xb5\x03\x11\x33\x62\x71\x1d\x8e\xcd\xba\x29\x89\xf0\xda\xa8\x8b\xc9\x70\x85\x77\xf1\x6b\xb4\x8e\x07\x66\xfa\x6f\x12\x81\x71\x72\x3f\x6d\xba\x0c\x3b\x7d\x29\xf5\xc2\x41\x28\x15\xd8\xde\x30\x39\x49\x8f\x0e\x9a\x50\x38\x00\xda\x40\xe4\x2d\x08\x87\xfd\x09\x00\x80\x24\xe8\x25\x1d\xb6\xe3\x33\x4a\x86\x41\x72\x4e\x05\x3c\x27\x26\xb5\x2e\xab\x66\xd9\xbd\x41\x92\x2b\x4a\x42\x9b\x7c\x8f\x9b\x72\x0e\xbb\x7d\x77\x44\x5a\xd9\x6b\x8b\x80\x7e\xcc\x65\x05\xd5\xc9\xc9\xcc\x4e\x2a\x3b\x8c\x6e\xb9\x34\xda\xa8\x21\x31\xc2\xea\xf6\x0e\xb9\x48\xa0\x99\x95\x47\xaf\xc1\x74\x42\x4b\x37\xa7\xae\x86\x34\xb9\x95\x81\x0e\x39\x35\x9c\x72\x55\xfe\x80\xfa\xac\xca\xe7\x4f\x8a\x41\x42\xf1\xda\xed\xcd\xfc\xef\xfb\x3c\x80\x81\x50\xae\x71\x36\x5d\x79\x06\x0c\x03\xaa\x93\x3e\x1f\xcb\x3f\xf3\xc7\x1c\xfe\xde\x5c\x85\x83\x09\x53\x83\x5d\x14\xe1\xa0\x90\x53\x34\x1c\x30\x31\xa3\xa2\xcf\xeb\x6c\x35\x7b\x7c\x5c\x3c\x3e\x2f\x36\x3f\x5e\x56\xbe\xee\x03\x26\xc1\xcc\x05\x9f\x15\xe9\x0a\xbb\xf2\xf5\x78\xcb\x00\x93\x31\x5a\x86\xa8\x54\xba\xad\x06\x26\x52\x76\x88\x64\x91\x72\xac\xc1\x3d\xe4\x85\xc6\xca\x53\xe7\xfd\xeb\x2f\x99\xd4\xc6\x6b\x4f\x61\x51\xc3\xbf\x47\x73\x57\x32\x34\xd2\xd2\x5a\x16\xfb\x43\x73\xa1\x0b\xc6\x65\x10\x46\x54\x32\x7a\x87\xfa\x06\x3d\x4c\xee\x52\x7a\xc3\x8f\x4e\x90\xaa\x3c\x2f\xc5\x9b\xa7\x5f\xc9\x90\x31\xdf\xa5\x74\x36\xc1\x13\x2f\x91\x0c\xb3\x88\xb0\x08\x6f\xf9\x27\x2e\x9a\x77\x07\x36\x18\x26\xf7\x32\x0a\x8c\x88\x7b\xef\xc8\x23\x16\x6f\xcd\xfb\x9d\x63\xab\x4c\xcf\x64\xff\xd1\xd0\xe6\xfa\xb6\xa0\xb3\xcd\x6d\x9b\xa5\x3b\x31\xcf\x08\x12\x62\x8e\x7f\xe1\xcf\x81\xae\x05\x97\x11\x04\x81\x6f\xf7\xf9\xf9\xfe\x04\x3f\x57\x90\x77\xbb\x9a\x8c\xa4\x5d\x66\x1f\x60\xff\x17\x6c\xb7\xbd\xbd\x4b\x46\x2a\x23\x46\x09\x3d\xc7\x15\xaa\xf2\x13\xab\x73\xb5\xfa\xa5\xb8\xc1\x77\xd8\x99\x17\xb3\x42\x75\xac\x26\x54\x0f\x26\x63\x55\x19\x29\x4d\x59\xfb\x7f\xbe\x50\xf5\xbe\x2c\x66\x60\xf5\xc2\xe1\x67\x9b\xe3\xcf\x5d\x17\xf5\x5c\x4a\x95\x71\x94\xd1\xae\x32\x7f\x79\x7a\x5a\xac\xe6\xcb\xd9\xe3\xeb\xcb\xf2\x79\x33\x7f\x98\x2d\x9f\xd7\x7f\xae\x37\x8b\xa7\x6e\xa4\x90\x74\xc7\x66\x4f\xaf\xcb\xfe\xee\x2e\x63\xc8\xc8\xce\x79\xf1\xda\x53\xd7\x68\xff\x2c\xe8\x87\x7e\x21\x7e\x6c\xf7\xf0\xd3\xff\x3d\x8d\xb5\x8b\x13\x88\x26\x3c\xb5\xa4\xcb\x2c\x16\xca\x45\x05\x96\x8f\x39\x3a\x2c\x6d\x1f\x65\xd1\xbc\xaf\x4a\x5f\xde\x96\x99\x93\x83\xd4\xb8\xcb\x3f\xb1\x72\xd6\xe3\x43\x7a\xc4\x65\xb6\x26\x79\x98\x51\xb6\x06\x9a\x90\xef\xc3\xe9\x2e\x02\x71\xd6\x32\xed\xb8\xad\x0b\xbf\xfd\x49\x88\xad\xc3\x16\xcd\x10\xc2\x2f\x12\xa4\x64\xd4\xf9\x95\x90\x28\x4a\xa3\x09\x1f\x3f\xd3\x1e\x00\xbf\x9b\x00\xc0\xfb\x4f\xa4\x22\x8b\xba\x5e\x3e\x75\xe7\xef\xca\x6a\x7f\xdc\xc1\xa4\x3d\x2b\x97\x32\x44\xea\x7e\xee\xe1\xe7\xca\xb1\x86\xcf\x90\x6c\x29\x33\x45\x88\xb5\xad\x0b\xc2\x37\xe5\xa8\xd7\x33\x58\xde\xa4\x44\x4d\xfc\x86\x9b\x63\xbb\xa2\x9d\xe7\x93\xd2\x91\x66\x53\x32\x13\xe3\x40\x53\xea\x30\x20\x4c\xc5\xf6\x30\x36\x9b\x1b\xfe\x4e\x1d\x71\xd2\x45\xdb\xe1\x27\xee\xb6\xbe\x86\x52\x5b\xf7\xc2\xad\x3c\x75\x78\xcc\xe9\xdb\xa4\x13\x8b\xc4\xab\x9b\xf2\xd0\xbd\x8d\xbd\x5e\x9d\xd4\x99\xed\x72\x3f\xe3\xd7\x7d\x5e\x5d\xf2\xb6\x7f\x19\xd1\x4b\xcd\x35\x55\xbd\x8f\xa6\x2c\x75\x39\x98\xf5\x5a\x06\xd4\xec\xa5\x3a\x6c\xbb\x86\x74\x06\xf7\x5c\x6a\x95\x11\x5e\xe7\x00\x27\xba\x43\x2f\x45\x17\x2d\x4a\x6d\x8c\xec\xd0\x24\xf9\x18\xad\x2d\x11\x05\xe5\xbb\x54\x20\xea\xe2\x36\x69\x98\x55\x39\x20\x2b\x07\x8a\x54\x5f\x2e\xac\x4a\xfc\x50\xa3\x68\xca\x7e\x96\x0d\xd1\x0f\x08\x7d\x3f\xf8\x59\x8a\x21\x23\x50\xad\x7f\x36\xeb\x06\x3a\x6e\xa1\x0a\x18\xd0\x33\x76\x36\x96\x57\xa0\x39\x2a\xd0\x56\x17\x9f\x88\x7f\x83\x9c\x5d\x05\x46\x51\x5d\x4f\x1e\x4f\x2f\xc5\x75\xdd\x96\x5e\x99\x43\x85\xcc\x90\xd7\x20\x11\xfa\xab\xd9\x3f\x8f\xf8\x36\x8a\xc3\x55\x98\x46\xbc\xfd\x5d\xfb\xe3\xae\xc9\xdb\xd0\xf0\x29\x2f\x2e\x31\x87\x83\xf6\xe9\xa4\x5b\x1b\x57\xa1\x8e\x95\x38\x83\xaf\xd7\x79\xf1\x76\xe6\xeb\x3d\x8d\xdc\x05\xb9\x8a\x58\x4a\x00\x3b\x42\xef\x9e\x5d\x7a\xc3\x21\xa5\xe1\xc2\x94\x97\xab\x48\x59\x8b\xad\x45\xf3\x4e\x5b\x9c\x6f\x40\xfb\xfb\x14\x07\x60\x1d\x58\xda\x1f\x72\xae\xe2\xa9\x98\x23\xf1\x64\x65\xde\x78\xaf\x8f\x51\x4a\xaf\x92\x08\x14\x74\x4a\x89\x75\x47\x69\x1f\x0f\x93\x9a\xd6\x1d\xaf\xb6\xb3\x79\x58\xae\x6e\xb7\xb7\xb3\x3f\xad\x34\xbf\xbf\x90\x04\x23\x8a\xb8\x48\x6c\xcc\x47\xdd\x03\x25\x08\xff\x2b\xc3\x78\x34\x0d\x12\x4c\x68\xf1\xbf\xc7\x3e\x44\x5d\x71\xa9\x49\x02\xec\xb5\x2a\xd5\x19\x51\xac\x44\xc4\x6d\xe1\xab\xee\x6d\x9e\xd4\xc4\xe8\x53\x44\x95\x40\x43\xe9\x71\x7b\x63\x16\x9b\x07\x0b\x11\xbb\xb2\x04\x28\x00\x4e\x35\x72\xdc\xe7\xcd\x3f\x4b\x79\x93\xf7\x45\x8e\xce\x93\xed\x7c\x7b\x55\xac\x28\xad\x21\x22\xd8\xa2\x78\xcb\x8b\x0e\xaf\xae\x74\x92\x50\x65\x47\x41\xe1\x4a\xb4\x76\x19\x1d\xde\x56\x0d\x01\x7a\x89\x37\xaf\x3a\x3d\xea\x03\xf5\xbf\x10\x03\x20\xb8\xc6\x0d\xe4\xbb\x97\xe3\x80\x53\xaf\x10\x39\xb8\x2c\xff\x75\x07\x8d\x29\xab\xfd\xb9\xb7\x74\x59\xa7\x50\x26\x50\xa1\x55\x6d\x29\x3f\x8e\x07\x4f\x73\xbd\xf2\x8e\x1a\x9e\xe8\xc0\xb3\x00\xd7\xd8\xcc\xf3\xe6\x34\xc0\x98\xfd\xb7\x49\xd1\x7f\xb5\x5a\x2a\x03\x31\x99\x14\x39\x98\xfc\x35\x33\x67\xae\x19\xcb\xa8\xec\x48\x4f\xc0\x2a\x30\xed\xda\x3c\xb9\xa3\x17\x6b\x16\x84\x14\x38\x3a\xb3\x71\xf2\x8b\xef\x5b\xe9\x70\xcd\xa2\x2c\x75\xa5\xe7\x3b\xa8\x9b\x7b\x38\x74\x47\x20\x53\x8e\x62\x85\x45\x73\xd9\x13\xd2\x4c\x45\x61\xe7\x32\xfc\x08\x7b\x59\xd6\x3d\xbe\x89\x66\x28\x45\xbf\xa0\x38\x2b\xf4\x6d\x0f\xd2\x77\x7e\x78\x3a\x62\xd2\xc0\xd9\xdb\xf9\xa9\x74\xbe\xce\x94\xd0\xf9\x1f\x1b\x85\x01\xc1\xb4\xe6\x8f\xdf\x57\xe3\x04\x49\xc7\x91\xa1\x2e\xdc\xb1\xf6\x6a\xa5\x54\xdb\xb9\xa8\xca\xfb\xe1\x32\xa6\xf6\xf8\xfc\x65\x3e\x68\x2d\xeb\x18\x79\x14\x7b\x61\xc8\xfc\x33\xdf\xe1\x1b\xf6\x71\x4e\x3a\x0d\x25\x71\x0d\x5e\x1f\xfe\x38\xfb\x2a\x73\x9d\xa6\xf6\x2e\x92\x69\xc3\xc9\xa2\x10\x47\x39\xa6\x4e\x85\xa1\x10\x71\xdd\x94\x07\x77\x23\xfc\xc7\xb3\xd8\x66\x98\xd6\x2b\x82\x7c\x44\x87\xaf\x8a\xce\x52\x46\x35\xb1\xbe\x1b\xd4\xe4\xaa\xac\xb3\xd4\xca\xb5\xcc\xe7\x83\xf0\x52\x7b\xfe\xfb\x72\xfe\x32\x5f\x3c\x6f\x56\xb3\x47\x7f\x84\xb3\x20\xe5\x7e\x1a\x7d\x2b\xf2\x66\x45\xd0\xb2\xe9\x97\x41\x73\xa6\x49\x33\x85\x96\xf1\xed\xa1\xea\x84\xcb\xb9\xe6\x71\x92\x44\x83\x7a\x92\x85\xf5\x0f\x2f\x90\xa3\xb2\x38\x50\x37\xb9\xad\x7e\x67\x7d\x86\x22\x0e\x1b\x45\xe7\xcf\x19\x8b\x40\xc2\x4a\xa5\x59\xd6\xf4\x7f\x9b\x08\x2d\x40\x95\x6a\x4b\x14\xb4\xd1\xfb\x49\x30\x67\xdd\x66\xa2\x7e\x5c\xc2\xc8\xb8\x48\x97\x6d\x66\x67\x41\xd2\xfd\x80\x4d\x8b\x2c\x8b\x02\x2f\x87\x92\x2b\x5c\x37\x78\xc8\x46\xcf\x11\x18\x0b\xac\x2e\x10\x42\x7d\xac\x4e\x23\x28\x87\x86\x34\x61\x43\x95\x1b\x5a\xdb\xe6\xd5\xe9\xd0\x94\xe3\x73\x65\x49\xec\xe5\x1f\x8e\xa7\xa7\xbc\x98\x50\x2a\xd1\xa0\x03\x5b\x18\x6b\x77\xec\xbe\x3c\xd8\x70\x8e\xf7\x9d\x9d\xc7\xd1\xb9\x96\x2c\x24\xda\x03\x5a\x3d\xdf\xc7\xc5\xcb\xf3\xaa\x37\xad\x25\xcb\x88\xac\xa1\x7a\x12\xac\x0e\x51\xec\x47\xa4\xa1\xe9\x64\x6d\x27\x0a\xa7\x5a\x69\xe3\xaa\xb6\x2b\x6c\x72\x4b\xca\xf4\x55\xdb\xcb\xdd\x43\x6b\x91\x39\xe1\x19\x55\x92\x45\xfb\x1b\x76\x62\x80\xeb\xde\x9b\x8d\x0c\x3c\xbe\x74\xc8\x0c\xd0\x28\x19\x71\xa2\x88\x33\x71\xec\xf3\x98\xae\x55\x2e\xff\x4f\x38\x71\x8b\xba\xb3\xe9\xd0\xf5\x18\x6c\x14\xe6\x55\xdf\x2f\x54\x52\xa6\xd7\x62\x34\x16\xc6\x77\x5e\xe2\xf4\xbc\x42\x9d\x5b\xa7\x7f\x7f\xcd\x86\x85\x14\x48\x58\xde\xf4\xdf\x08\x08\x68\x13\x04\xd4\x6a\x5c\x3b\xed\x9e\x8b\x2a\xc1\x95\x8f\xa5\x56\x2f\xb8\xdd\xf6\x6d\x31\xaa\x99\xe0\xb6\x6b\xa3\x0c\xe1\x25\xb6\xb9\xab\xae\xf6\xd1\x08\xc8\x82\x80\xea\x2d\xf2\x58\x15\x43\x0d\xaa\x7e\x6c\x86\x2c\x94\x5a\xf4\xfc\xd5\x27\x88\x07\xc8\x74\xca\x3d\x8f\x75\xb6\x9c\xee\x12\x61\x10\x5a\x95\x70\xb7\x53\xbd\x82\xfa\x80\x37\x9c\x5b\xb7\xa8\xd1\x09\x83\x38\xa5\xa4\xa8\x17\x64\x95\xbb\x5c\x9d\x3c\x40\xe5\x3c\xcd\x30\xd4\x69\x66\x31\xe9\xb5\xaa\x72\x89\x9b\x7c\x87\xbf\x75\x1c\x64\xbf\xb6\x60\xe8\x64\xbb\x89\x88\x6e\xef\xc6\xf4\xd6\x81\x51\xa6\x48\xcb\x64\xb9\xb9\xef\x2f\xaf\x18\x49\x4b\x48\xa6\x82\xe4\xbe\xac\xa6\xcd\xb3\x38\x46\x5a\x08\xca\x74\xdb\x2d\xac\x9d\xe8\x8b\x42\xf7\x22\x3e\x8c\x93\x98\xe6\xe1\x97\x4f\x6c\x71\x8c\x15\xc3\x18\x2c\xc6\x89\x68\x9c\x26\xaf\xf6\xe3\x22\x17\xc6\x2a\xa2\xf0\xeb\xfe\xe9\xe5\xe5\xb9\xfb\x98\x0e\x29\xb3\xdd\xce\x96\x8b\x9f\x8e\x3d\xd4\x2f\xc0\x63\x12\xa5\xd2\x35\xa9\x6d\xdc\xd4\xc3\x9f\x61\x0a\x92\x88\xa5\x66\x5a\x48\x75\xf4\x2b\xb3\x04\x02\x65\x7d\x85\xdb\x6d\x7a\x71\xfb\x6d\xf8\x55\x19\x4a\xe2\x65\xbf\xae\x16\x5b\x8a\xa8\x83\x1f\x8b\xc5\xef\x7d\xad\x46\x8e\x3c\xc9\x88\x1b\xf4\x9f\x23\x56\xf9\x18\x76\x84\x02\xed\xd1\xf6\x16\xad\xf3\xfd\x61\x87\x6b\xac\x3e\x7d\x01\x6c\x68\x6b\xd4\x5f\x02\xfe\x67\xf4\x3c\x41\x49\x4a\x12\xee\x49\x4c\x6b\xf4\x8e\xa0\x54\x8a\x60\x0e\x6d\x62\x67\x75\x87\x46\xbf\xf7\xff\x24\xe7\xb5\x36\x3a\x63\x4b\x3d\x65\x11\x95\x4a\xbd\xc2\x01\x89\x55\x74\x82\x5d\x64\x8c\xe0\x43\x29\x54\x98\x46\x16\x8c\x75\xf0\x3e\x0f\x7f\xb3\x38\xa0\x36\x31\x85\x2a\x5b\x2b\x5e\xe3\xa6\xc2\x30\x8c\x1d\xfe\x18\x64\x4c\x5a\x1d\x7f\x7a\xf8\x97\x51\x31\x62\x20\xa9\xaa\xee\xb7\x2e\x5b\x34\xf2\x07\x85\xb6\x58\xc8\xf6\x8f\xcb\x42\x95\x6f\x45\xde\x94\xdd\x51\x34\x94\x84\xd9\xc5\xd3\x37\x60\xd0\x64\x16\x4c\xde\xa9\xfe\x59\x91\xdb\x5f\x78\x96\x73\xc3\xb4\x24\x7f\xa9\xca\x2b\xc5\x38\x32\xf3\xd8\x58\x9e\x9b\x20\xd0\xc4\xe6\xb8\x59\xaf\x7b\xb5\x41\x13\x86\x01\x15\x43\x16\xaf\x7f\xd0\xca\x37\x98\x7b\x26\x04\xab\xea\x6b\x75\xab\xba\x57\x68\xd3\x97\xf9\x1b\xdc\x38\x13\xb1\x88\xd6\xf6\x75\xbb\x3a\xd8\x34\xc5\x6d\xbd\xc7\x4b\xfa\xac\x89\xc0\xee\xff\xaa\xf4\xc5\x21\x4f\xfc\x32\x91\x01\x74\xe1\xc5\xcb\x27\x56\x35\xb5\x58\x87\xdf\x95\x06\xca\x7d\xba\x30\xf9\xdb\xea\xd8\x73\x34\xe1\x26\x0b\x05\xa1\x15\x1d\x6e\xff\xb1\x54\x1f\x97\xe8\x36\x93\xa5\x10\xba\x90\x7e\x3e\x7f\x70\x3c\xb7\xee\x14\xda\x6a\x9a\xef\xa0\xb6\x48\x80\xad\x09\xa2\x07\xa8\xdf\xb7\xee\x57\xf8\x81\x9c\x49\xb2\xf1\xb0\xbd\x8d\x6e\x0d\xea\x87\x4b\x86\x47\xc2\xfa\x94\xff\x3c\x60\x51\x9f\xe5\x19\x0c\xcf\x22\xcb\x91\x7a\xa7\x10\xa0\xe3\xd4\x9e\x57\x66\xc3\xb9\x6d\x28\x78\x47\x54\xbc\x87\x7a\xa2\x82\x6d\x44\x98\x5a\xda\x3a\xec\x3e\x46\xf5\x40\x23\x92\x98\x14\x68\xca\x03\x16\xaf\x76\x8f\x7c\x85\xaa\x99\xb7\x7b\xab\x7f\xb7\x8c\x48\x63\x6f\x5b\xb3\x7e\xcf\x0f\x9e\x53\x32\xfa\x96\xd4\x66\xbf\x8f\xf0\x17\x74\xde\x58\xdc\x08\xc9\x28\xe5\x04\xad\x5f\xe1\x84\x57\x12\x31\x23\xa4\xa6\x8d\x1a\x2c\x5a\x29\x2f\x0b\x02\x2c\x0e\x07\x41\x10\x80\xec\xc4\xa6\x9c\x1c\x45\x39\x4d\x2d\x32\x10\x86\x04\x16\xb8\xbf\x9f\xfb\xf2\x82\x91\x59\x42\x6b\x89\x82\xdd\x6e\x88\xce\x37\x2a\x4d\x82\xc8\x91\x08\xa0\x38\xf9\x86\x80\x05\x07\xb9\x31\x3a\x8a\xa9\x45\xf2\x70\xdc\x43\x91\xff\x67\x39\x7f\x99\xde\xe2\x8c\xe6\x82\x59\x61\x86\xbf\x55\x6c\xe5\x46\x2b\x90\xae\x9d\xba\x3e\xee\x2d\x93\xe4\xc5\x38\x2a\x10\x01\xc3\xea\xd7\xaa\xbc\x2d\xd5\xb9\x0a\x67\x30\x00\xa2\xa3\x49\x28\x2e\xa5\x48\xb9\x41\x9d\x30\x77\xca\x36\x1d\x8c\x89\x68\x31\x7a\xf2\x26\x88\x88\xd8\xb1\x87\xe2\x08\xbb\x36\x72\x6e\xfe\x86\x08\x30\xb8\x6a\x13\x05\x74\x05\xcd\x7b\xd9\x67\xf3\x08\xc6\x22\xae\x55\xa7\x13\x3d\xd3\xff\x3e\x92\xf7\x8d\x3f\x1a\x87\xa4\xa5\x38\x9f\xad\x66\xdd\xdf\x9c\xfe\xab\x75\xc0\xb2\x28\xb8\xcd\x85\x64\xa8\x60\x0c\xac\x00\xc0\xdc\x62\x84\xe6\xef\xf9\x61\x38\x09\x05\x0b\x18\x97\x9e\x10\x71\x82\xa2\xb9\xad\xca\xbc\x59\xa8\xb2\x28\xf7\xf9\x7f\x8e\xb8\x9d\x97\xfb\x43\x83\xfe\x5d\x16\x2c\x48\x02\x95\x9e\x0d\xd0\x9d\x78\xf2\xd4\x73\x12\x2c\xe0\x09\x4d\xf0\xf9\x00\x4c\x2d\x58\x18\x1a\x82\xc2\x6e\x36\x9b\xee\x4f\x28\x98\x75\xc1\x6e\x7f\xfd\xa2\x4d\x69\x77\x38\x68\x20\x4f\xbd\x05\x82\x45\x59\x06\xbe\x87\x0d\x0d\xbe\x95\x43\x6b\x1d\xc1\x22\x29\x91\x39\xbc\xd6\xbf\x8e\x58\xb5\x89\xf2\x95\xcb\x8d\x54\xc0\x5c\x63\xb0\xa3\xea\x0e\x4f\x16\xb3\x94\x72\x78\x45\x5c\xd6\x2e\xa2\x41\xd5\x37\xc0\x9d\xbe\xd0\x38\xb1\xe0\xe8\xca\xb6\x8d\x26\xa4\x43\x05\x4b\x12\x2b\x0e\x71\xb0\xba\xb4\x74\xcf\xfc\x97\x9c\x33\x27\xc1\x12\xf7\xb2\x3c\xe3\xd7\x2b\xd4\xb5\x47\xc8\x8d\x2f\x60\xd8\x43\xeb\xcf\x65\xc1\x12\xa7\x44\x59\x63\xf3\x8c\x5f\x13\xdd\x4f\xc1\xd2\x50\x72\xd7\xee\x6e\x9c\xd7\x0e\x5c\x7a\xdf\x0a\x96\xa6\x11\xba\x32\xd8\x7d\x85\x04\x58\x1b\xdc\xb4\xd4\x18\xc1\xcf\x1a\x3e\x3d\xf1\x21\xc1\xb2\x4c\x2b\xf0\xe8\xb1\x73\x47\xc2\x1d\xe5\x2a\xa6\x7b\xb6\xdf\xee\x10\xbf\xe0\xe4\xff\xde\x66\xcc\x0e\xd6\xbc\xdd\xfb\xf2\xd3\x36\x2f\x4c\x39\x0a\x46\xba\xf1\x9c\x94\x63\x9c\x60\x78\x33\x3e\xac\xad\xb5\xfa\xfd\xfc\xb5\x6a\x77\xc7\xc1\x5c\x85\x30\xa5\x2e\xbd\x7d\x0a\x74\xf1\xdd\x2b\xd4\x46\x5f\xe7\xda\xa7\x60\x90\x88\x4c\x9e\x15\x76\x2f\x5d\x5b\xff\xae\x26\x37\xb8\x6f\x90\x02\x74\xd9\xd0\x64\x01\x7e\x30\x79\x80\xa7\x41\xe4\x29\x85\x9a\xcc\x82\xe6\xef\xf9\x4e\xff\x36\x7c\xf0\xc0\x2d\x28\xaf\xc1\xba\x21\x3c\xe0\x73\xe9\x04\xec\xfa\x94\x20\xc1\xa4\x12\xe4\x47\xf6\xb5\xa5\xf0\xa9\xc3\x9d\x09\x26\x0d\xc4\x96\xb4\x5e\xbc\xed\xf0\xf6\xfb\xf2\xf5\x5f\xcd\xe9\x7c\x50\x69\x76\xae\xcf\xd3\x39\x6d\xe6\xde\x0d\x40\xe0\x0e\x7f\xd7\xa9\xef\x08\xa6\x1c\xbf\xd2\x97\x3b\x37\x3f\xef\x10\x5f\x21\xd7\xf7\x63\xdb\x3d\xc1\x54\x2a\x08\xdc\x77\x2c\xba\x4e\xdc\xb7\xb1\x52\xa0\x60\x5a\x84\x89\x67\x50\x3a\x6b\xdf\x61\x52\x23\x18\xc6\x8a\x5a\xc5\xc5\x71\xff\x62\x9c\x99\x48\x27\x80\x22\x18\xf2\x90\x92\xfd\x3d\x7c\xe0\x6b\x55\xea\x63\x17\x8a\x5c\xd1\xc7\xf1\x9f\x83\x6e\x7b\xba\x50\x71\x15\x0c\x8d\x95\x77\xab\x10\xf4\xac\x80\xdd\xa9\xc9\x55\xfd\x04\xdd\xa4\x37\xb1\x22\x7c\x86\x2e\xe7\xbe\xa4\x75\x15\x1d\x35\x7c\xb4\x06\xad\xf6\xfe\x81\x2a\x60\x8b\xcd\xc3\xf0\xbe\x05\x01\xd3\xc4\x7d\xbb\xdd\xcc\xe7\xdb\xe5\xe3\xcb\x8f\x2d\xff\xcd\x1f\x8a\xa4\x2b\xb0\xd1\x82\xd6\x40\x63\x17\xdf\xfe\x84\x0c\xc2\x48\x05\xb6\x23\xdd\x46\xe1\x47\xaf\xa2\x22\x82\xd0\x70\xea\x49\x51\x2a\x15\xf6\xad\x35\x44\x10\x05\x11\xe1\x00\x17\x85\x7e\x31\x0e\x52\x3b\x1d\x84\x8b\x20\x8a\x33\x6d\x3c\x45\x62\xb8\x8a\x04\x51\x66\xd1\x8e\xa4\x6d\xa5\xd7\xea\xdd\xc2\xe9\x1c\xa5\x98\x2e\xfb\x52\x54\xb6\x0b\xfd\x44\x10\xf1\x98\xea\xe9\x9f\x39\x7e\x79\x6e\xa7\x3b\x14\x07\x01\xb1\x14\x24\x14\x1f\xab\x72\xd7\xe6\x4b\x38\x72\xaa\x10\x41\x1c\x87\xb4\x86\x3c\x1d\x77\x4d\xbe\xce\xdf\xec\x92\xd9\x26\x2d\xb7\x90\xef\x4e\xb6\x86\x76\x51\xe8\x19\xfd\xc0\x24\x4e\x09\x4c\x77\xd7\x35\x70\x44\x90\xb2\x88\x70\x64\x5f\x79\xf3\xbe\xa2\x1e\xea\x78\x2a\x07\x69\x08\x5e\xeb\xfa\xcf\xe3\xfe\x87\x13\x50\x18\x9e\x3a\x4d\x12\x9e\x9d\x39\x98\xe3\x33\x18\x45\x4a\x31\xf7\xb0\x83\x9f\xa7\x80\x31\xff\xed\x59\x18\x91\x3c\x76\x1b\x95\x7b\xc6\xe6\xf4\xb5\x67\xc2\x3e\x9c\xbc\x5e\x37\xe5\xc1\x97\xc4\x44\x90\x81\x4c\x54\x8f\x85\x3b\x7c\x6c\x19\xa6\xae\x8d\xa1\x5d\x3c\x76\x99\x2a\x07\x23\xb4\xce\xaf\xfe\xeb\xcc\x7d\x86\x7e\xbf\xa2\xdd\x5f\xc9\xd0\x62\x9d\x5b\x55\x5f\x17\x8c\xde\x5e\x6a\x5a\xf9\x0f\x28\x93\x86\x36\x7a\x5e\x34\xef\x54\xfd\xf6\xef\x7d\x20\x8c\x97\x94\x26\x07\xdf\xcb\x04\x41\x04\xa0\x03\x2a\x77\xb5\x49\xc0\xd6\x54\xd8\xcd\x25\x30\xb1\x74\x82\x57\x95\xae\xda\x94\xe9\xd0\xdb\xef\x02\x99\xc4\x24\x4b\xf6\x7d\xf9\x7d\xd6\x6d\x0f\x94\x96\xff\x36\xe9\xdc\xdd\x9b\xc0\x92\x87\x29\x3b\x07\x5e\x6b\x85\xc5\x04\xd4\x7d\xfa\xc5\x92\x98\x49\x87\x1d\xa2\x18\xc8\x76\x96\x87\xf1\xad\x08\x74\x06\x94\xc2\x6e\xbe\xf7\x77\xc0\x40\x73\x45\xb7\xe3\x00\x75\x7d\x19\x3a\x8b\x00\x23\x21\x1d\xdc\xc1\x6a\x98\x1c\xa7\x89\x63\x22\xc0\x24\xb4\x0b\xc8\x85\xa8\x9a\x08\x90\x6b\xea\x54\xb4\x71\xda\x0a\x46\xdc\x0f\x11\x18\x96\xa2\x87\xef\x91\x91\xed\x1d\xb4\xb3\xe9\x34\x16\x15\x1b\x5c\x5a\xc8\x82\x98\xb2\x17\x79\x3c\xfd\x8e\xc4\x8e\x5b\xa1\x31\x83\x19\x1a\x32\x19\x92\x74\xf6\x4d\xde\xbc\x14\x37\x70\xfa\x95\x57\xd2\xe0\x9a\x42\x86\x3a\xb6\x22\xf5\xb6\x02\x79\x1c\x48\x5c\xfe\x63\x78\x29\xed\xe2\xe6\x5e\x84\xbb\xd5\x6c\x74\x9d\x41\x22\xe8\x1a\x1e\x73\x12\x02\xb0\xed\xcb\xbf\xb5\x42\x18\x7f\x43\x6a\xb9\xda\xd6\x60\x6c\xe9\x51\x98\xa5\x6f\x73\x74\xc3\x90\xd2\x10\x43\x40\xce\xbb\xb2\x3a\x5f\xfc\xc5\x13\x0b\x03\x8e\x1a\xba\x8a\xf9\xb5\x80\x34\x0c\x44\x44\x79\x7b\xf3\x2b\x1f\x91\xe1\x89\x55\x6c\xb1\xc3\xed\xdb\x61\x97\x6f\xaa\x0c\xf8\x33\x86\xed\x2e\xdf\xce\xc5\xd9\xef\x8f\xcb\xa7\xd9\xef\xb3\xe7\xee\x88\x88\x88\xd3\xee\xdb\xeb\x1d\x36\x11\x0b\x24\x7d\xe6\x5e\x77\x64\x78\x83\x42\x14\x9e\x60\xf4\xcf\x52\x7a\x95\xb8\x51\x42\x14\x86\xc6\x44\xc2\x01\x40\x8e\xe3\x53\x44\x51\x42\xec\xe0\xd9\xed\xf7\xe5\xfa\x65\xb5\x76\xee\x39\xfe\xda\xa2\xb4\x13\xe2\x5f\x03\x55\x51\x66\xbb\xfc\x73\xb4\x78\x84\x91\x10\x76\x2b\xb2\xb2\x0f\x53\x16\x2f\x22\x8c\x20\x86\xc8\xd3\x33\x9c\xd2\x04\x41\x42\xa6\xc8\x59\xfe\x33\x98\x50\xcc\x56\x94\x56\x78\xf1\x06\x76\xbb\xb2\x71\xaa\x5c\x6e\x4c\xcc\xd2\xb4\x13\x1a\x69\x13\x4d\x3d\xfa\xe2\x38\x09\xc8\x0e\x85\xc0\x31\xa8\xd7\x60\xd0\x02\xcb\x47\xbf\x22\x36\xd6\xc7\xe0\xf5\xfb\xeb\x76\xf9\xbc\x59\xac\xbe\xfb\xee\x9e\x08\x93\x30\x21\xe5\xa6\xf5\x7b\x55\x96\xfb\x3b\xa8\xf6\x5d\x3e\x1b\x26\x31\x86\x5d\xd9\xbb\x3e\x92\xf8\x8b\x6b\x0f\x0f\x2f\x24\x0d\x30\x75\xd1\xc0\x62\x35\x0f\x99\x2b\x51\x92\xaa\x1e\x99\x0a\x74\x6b\x63\x98\xca\x94\x74\xa7\x6a\xf8\xc4\xd7\xb2\x1e\x76\xff\x44\x98\x6a\xe4\xc2\x85\x5c\x4b\x5b\x70\x1a\x0e\xc8\x20\xa3\xd9\xa8\x2b\xc8\x8b\x5e\x01\xb2\x3d\xc2\x11\x5c\xc9\xf7\x2e\xdf\x5d\xc6\x18\x6e\x1c\xcf\x2c\xd1\x62\xa4\xc8\x31\xf3\xbc\x3d\x11\x72\x19\x29\xa7\xea\xf7\xea\x38\xd4\xa3\xab\x10\x81\xca\x3c\x01\xae\xdc\x69\x7b\x53\x1e\xa1\x6e\xe0\xa8\xf3\x26\x1f\x3f\x28\x88\xe3\x30\x74\x00\xdd\x73\xdf\xcf\xe9\x6a\x0c\xaf\x4e\x46\xb6\x07\xb9\xcf\x8b\x76\x6d\xe8\x08\x6e\x83\x90\x3f\x94\x51\x4a\x80\xac\x9b\xf2\xbc\xfc\x5e\x97\x24\x0b\x42\xfe\xeb\x7f\x7f\x65\x34\x27\x42\x99\xda\x47\xd6\xbe\x04\xfd\x5a\xa9\x08\x65\x96\x51\x38\x36\xcf\x9b\xea\x58\x5f\x26\x51\xc3\xf3\xe8\x34\x51\x0e\xd2\x49\xfb\xe8\xcd\x69\x35\x72\xc9\x16\x21\x26\x59\xa0\xfb\x94\x8d\x4b\xd7\x5c\x11\x62\x06\x2e\x79\xa3\x00\xca\xea\x54\x0f\xbf\x0b\x55\x47\x7a\xb4\x2d\xb7\x51\x6f\x55\x84\x26\x60\x59\xea\x3b\x2d\xb5\xed\xb4\x9c\x15\x7b\x45\xc4\x38\xf3\x93\xc0\xaa\x64\x4c\x2f\x55\x11\x33\x8a\x98\x70\x77\x50\x37\x96\x23\xfa\x8c\xcd\x57\x59\xf9\xf5\x31\x0a\x82\x44\x9e\x15\xd9\x1e\x72\xad\xa7\xfa\x60\xed\x38\x4e\x30\x87\xf9\xeb\x7c\x04\x60\x10\x51\x18\x65\xe4\x73\xb9\xcd\x6b\x22\x7f\x9e\x19\x74\x93\xc0\x55\xff\x29\x29\x89\xd5\x76\x2e\xe6\x42\x10\xfa\x53\x46\x99\x4e\x5d\x47\xea\x31\x2f\x06\xac\x18\x11\xc5\xcc\x7a\x11\x75\x0d\x98\x1e\xa1\x5d\x44\xb1\x4e\x08\xcb\x99\xd7\xaf\x58\xed\xa1\xc0\xa2\xd9\x9d\xae\x75\x1f\xdd\x67\x12\x06\xf4\x76\x16\xb0\xbf\x20\x7e\x8b\x28\x89\x33\x67\x94\xdf\x75\xe8\xad\x3c\xce\x68\x98\xe1\x44\x56\x59\x16\x75\x03\xaa\x54\x25\x5c\x99\xfc\xc3\x8f\xa5\xa1\xb0\x16\x84\xde\x42\xa5\xdd\x0e\xd6\x0f\xb3\x55\xf7\x8b\x52\xe0\xca\xeb\xd6\x20\xea\x9b\x93\x73\x0d\x1d\x4c\x99\x28\xd5\x9a\xca\x2c\x5f\x55\xde\xe0\x50\x75\x66\xfa\xe5\x1b\xdc\xd3\xd4\x35\x11\xc1\xf6\x38\xfc\x57\x67\x49\x4a\xe5\x34\xf5\xde\xa6\x29\xde\x6b\xa2\x3b\x9a\x05\xd4\x09\x53\xb6\x0f\x71\x8b\x87\x5d\x69\xb9\x8e\xe3\x42\xe6\x60\x81\x8a\x32\x99\xd1\x64\xba\x39\x56\x85\xe9\x6f\xf1\xc3\x5f\xc4\x21\x24\x9b\xee\xba\x34\x8d\x82\xc3\xb2\x18\x2c\x33\x91\xc8\x90\x4a\x04\x17\xa2\x97\xd7\xfe\xbd\x0c\x86\x23\xc1\x19\xe9\xe6\x6e\x5e\x5f\xe7\x21\x0b\xf8\x7f\x1d\xb4\x45\x42\x05\xa6\xef\xb6\x76\x99\xb3\xb9\x81\x10\x87\x24\xdc\xb7\xcf\x0b\x6f\xe4\xe8\x8f\xf0\x90\x76\xf9\x2d\x52\x24\x3a\x7a\x9e\xc0\xc1\x77\x9e\xbb\x4e\x48\xe8\x13\xed\x48\x05\xf6\xd6\xfb\xaf\xb7\xb7\x66\xc2\x6d\x7e\x74\x35\x8a\x6b\x8b\xe0\xfe\xc8\xfb\xfc\x2c\x11\x29\x21\xd1\xeb\x2f\xd9\xc4\xa0\xcd\x65\x2e\x65\x8b\x45\xa4\x94\x15\x20\xd0\xb6\x8c\x6f\x39\x44\x65\xbf\x72\x72\xe5\xbb\x75\x22\xbd\x25\xc1\x7d\x6e\xcc\x4d\x17\x0c\x74\x13\x43\x9b\x0c\xe1\x9a\xcf\xfc\xf0\xb5\x41\x96\x52\xa1\x67\x0e\x3b\x35\x22\x12\x0f\xbf\x15\x53\xdb\x45\x7f\x82\xea\x2d\x2f\x6e\xa0\x50\xfe\x27\x9b\x54\x80\x77\xd2\x25\x97\xf4\xb3\x7f\x85\x88\x8c\xca\x08\x29\xb3\x25\x05\xeb\xb7\xbc\x20\xd5\xc8\xdf\xf1\x34\xbc\x1b\x31\x8b\x55\x68\x95\x97\x0f\x3b\x38\xcd\x8a\x1a\xab\x1f\xfd\x0c\x7c\xdc\x73\xfd\x9f\xc1\x7b\x17\x33\x10\x51\xea\xa4\x89\xac\x7a\xee\xe8\xfc\x61\x1c\xd2\xee\xec\xdc\xeb\x66\x85\x9e\xc3\xee\x8a\xf7\x94\xbf\x8f\x71\xa8\x22\x52\xc5\xdb\x36\xbf\x72\x67\x16\x71\xc4\x32\x69\x95\x6d\x2b\xaa\x2e\x75\xd9\x78\x1c\x67\x48\xfd\xd6\x63\x8d\x95\x87\x84\x0d\x3f\x1b\x0b\x25\xc3\x6e\xe7\x98\x75\xc4\xd0\x39\x5c\x08\xfe\x89\x38\x96\x8a\x76\x69\x0a\xd3\x37\xef\x15\xd6\xef\xe5\x4e\x8f\x42\xe6\x38\x0d\xad\x0e\xfd\x1c\xaa\x55\xdf\xf5\x0a\xf2\xdd\xa8\x87\x2e\xe2\x34\x11\x16\xaf\x45\x5f\xbf\x1c\x19\x18\x8a\x38\x35\x16\xbe\xbe\x6b\x57\xea\xef\x58\xd5\x1d\xe1\x41\xc4\x59\x1a\x12\xd2\x38\x57\xe5\xf3\x71\x8f\x15\x34\x65\xdf\xfb\x51\xc4\x99\xd4\x5e\xef\xe2\x09\x0e\xa3\xdf\xc2\x99\x4d\xb2\x2c\x36\xb0\x26\xad\xf5\xbb\xe5\xdd\x6c\xa9\xeb\xb5\x07\x40\x8b\x98\x47\x8a\x82\x73\xc2\x1c\x3d\x74\xfa\x8a\x22\x16\x3c\x26\xad\x80\x9b\x97\x6f\xcf\x9b\x3f\xb7\xab\xc5\x8f\xd9\xea\x76\xb0\xe0\xc7\x90\x01\x35\x72\xe6\x2f\xcf\xcf\x8b\xf9\x66\x7a\x3d\x72\x63\x65\x62\xfd\x15\xb6\xa0\xf5\x0a\xd5\xe8\x2e\x49\x1e\xd8\x35\xf2\xfe\x67\xff\x6d\x8f\x55\xc6\xb5\xdb\xd2\x66\x87\xc3\x6f\x53\x2b\x5c\xac\xb8\xf5\x70\xff\x66\xe9\x31\x84\x16\xde\x2e\xe7\x2f\x24\x25\xb2\xde\xcc\x9e\x5e\x47\x5f\xa6\x99\xed\x68\xdb\xc2\x82\x85\x1c\x5c\xab\x58\x4f\xbe\xab\xb1\x0e\x45\x66\x9c\x8c\x08\x16\xfa\x82\x1a\x3c\x98\xed\xfe\x33\x88\x51\xd8\x43\xf1\x78\x0c\xd6\xf4\x8c\xc7\xc0\x7a\x10\x54\x47\x17\x35\x8f\xae\x00\x63\x50\xb6\xaa\xfa\x9f\x4f\x7c\xaf\xf0\xed\xb7\xe9\x2e\xc8\xd4\xa3\x40\xc9\x08\x38\x32\xcf\xf7\xb2\xdc\x9f\x9b\xfa\x22\x36\x71\x26\x5c\x77\x69\xd9\xe0\xbe\xb6\x24\xa5\xee\x28\xe7\x67\x03\x03\x27\xad\xf3\x50\x5e\x5b\xf9\x62\x23\x32\x09\xde\x55\x76\x57\x56\xf7\x15\x9e\x1f\xac\x41\xeb\x99\xde\x69\x31\xe5\xcd\x3b\xad\x6b\xf8\x6b\xff\x1f\x91\xb0\xc4\xfa\x6d\xe4\xb5\xdf\x50\xc9\x8d\x63\xf0\xdd\x09\xcb\x34\xb5\xe7\xc1\x82\xe3\x36\x65\xb7\xf9\xfa\x01\x22\xa5\xdd\x6e\xb9\x3f\x80\xea\xc2\xa5\xe9\xa5\x39\x61\xca\x31\x67\xda\x77\xe4\x82\x0d\xe3\x06\x05\x42\xf8\x0e\xd3\x2d\x82\xde\xe5\xc5\x28\x0f\x4e\x02\x23\x24\x38\xf4\x1e\x35\xa6\x5d\x3b\x7d\x74\xa2\x88\x19\x8a\xa9\x87\x50\x44\xf2\x36\xbf\xb2\x77\x27\x71\x16\xb3\xb8\xef\x93\x72\x59\x1a\x1e\x7e\x47\x6c\x22\xe1\xaa\xd4\xbd\x70\x3d\x49\x43\xcb\xee\xcf\x8b\xbc\x79\x5a\x6c\x86\xea\x25\xbf\x7e\x2c\x59\x1c\x51\x19\x9f\xec\x5e\xd6\x4f\x2b\x53\x56\x6d\x32\x38\x1c\xc4\x23\xab\x46\xb7\x2f\x75\x6e\x4e\xae\x4b\x3b\xdd\x9e\x17\x09\x4f\x43\xea\x7a\xdd\xe4\x8d\x2a\xf3\xe2\x75\x77\xac\xbb\x0b\xe5\x4a\x49\x8f\x21\x85\x0a\xf6\x13\xa4\x29\x37\x52\x64\x19\xad\x82\x38\xc6\x7c\x8a\x44\x00\xa3\xa0\xb1\xdd\x3b\x68\x61\x1e\x7e\x3f\x40\x44\x61\xc0\xfa\x50\x56\x4d\xdd\xf3\x15\xf7\xc7\xb5\xa0\x05\x12\x8e\xcd\x3b\x16\x4d\xae\xc6\x58\x1f\x91\xc8\x34\xa0\xf4\x60\x7b\x2c\x28\x4d\x5d\xc3\x1e\xd7\x6d\x1e\x44\xaf\xd7\x35\xc9\x99\xd1\x2f\xd0\x2c\x35\x8e\xf1\x70\x93\xbf\xbd\x56\xe5\xbe\xec\x47\x00\x89\x46\x4e\xe1\xc1\x1c\x0e\x2b\x04\xf5\x7e\x85\xe1\x28\x12\x8c\x38\xed\x84\x8b\x02\xab\xb7\xd3\x53\xa9\x1d\xbf\xce\xf7\x53\xfd\x30\x6e\x3b\x80\x2f\x75\x5e\xe5\xdd\xb7\xa0\x12\x88\x9d\x19\x66\x5f\x49\xd9\x8f\x30\x31\x67\x59\x0f\x86\x65\x81\xc9\xe7\xc3\x60\x9b\xb8\x16\x12\xf4\xec\x55\x7c\x44\x62\x74\x18\x76\x4a\x83\x7d\x99\x4c\x91\x32\x1e\x10\x34\xe4\x3b\x36\x55\x7e\x26\x0b\x8a\x94\x69\xab\x39\x39\x53\xaa\xdc\xef\x4b\x4d\xbf\xa3\xb7\x92\xa5\x41\x66\xa8\x49\xdb\x7e\xa8\x0d\xdf\x97\xaa\xec\x0e\x71\x70\x32\xdb\xb5\xf3\x76\xbc\xab\x6c\xa3\xd7\x6b\x85\x8b\x34\x10\x36\x8d\xa4\x96\x16\x85\x8f\x3f\x3a\x83\xe1\xb1\x82\x96\x48\x43\x6d\xf5\x0c\xd6\x70\x02\xdd\xb7\x5f\x6e\x0f\x19\x2a\x83\x6e\x0f\x58\x99\xb2\xda\x6f\x7a\xeb\x1d\xc5\x5e\x38\xa1\x19\x39\x99\x80\xa5\x11\x57\xd4\xfa\xb7\x20\xe7\x5d\x6e\x70\xf0\x4d\x11\x30\xda\xc8\x5f\x7e\x3c\x6f\x8d\x23\xad\x0f\x5e\xab\x5e\x3e\x91\x46\x90\x12\x6f\x60\x59\xb4\x9b\x60\x4d\x15\x92\xaf\xab\xf2\x95\x22\x8d\xb4\xa1\xd6\xa0\x6e\xee\xb1\xf9\x51\x56\x3b\x4d\xdc\x0c\x77\x34\x4e\x52\xba\xa3\xb3\x8f\x26\xef\x9e\x6b\x1a\x6b\x45\x41\xdb\x7a\x3e\x3f\x73\x2d\x45\x9a\xa4\x32\xb6\x36\x0b\x7f\xef\xc1\xec\x3f\x82\x01\x1f\x48\xc3\xf9\x02\x64\x9a\x46\x86\x36\xe2\x4e\x43\x78\xef\xd4\xe8\xf6\x37\x50\x7c\x74\x0e\x56\xbf\xd2\x23\x11\x69\x9a\x66\xb6\xa1\xdf\x40\xd5\x6c\x61\x30\x03\x53\xa5\x29\xdf\x3c\xe4\xea\xc3\xa5\xb3\x53\xcc\x6c\x91\x66\x59\x4a\x80\xd1\xcd\x62\xf6\x64\xb3\xfd\xa7\x6f\x8f\x9b\xe5\xeb\xe3\x72\xb1\xf2\x27\xcb\x44\x4a\xf8\x3d\xdc\x1f\x9a\xd3\xb2\xa0\x0e\xd2\x54\xea\x92\xf2\x50\x92\x39\xa5\xe7\xcc\x74\x44\xeb\xf8\xb6\x3c\xca\xdd\x35\x81\x2b\x91\x72\x81\xb4\x77\x90\x43\xfa\x3e\x27\x1a\xc3\x54\x16\x9e\x72\x69\xcd\x1b\xad\x57\x4b\xdd\xce\x7d\x62\xd6\xd9\xd2\x27\xea\x4e\x92\x69\x9a\xde\x21\x52\xae\x82\x94\x75\xa8\xad\x36\x99\xb6\xa0\xaf\x6b\x7c\x1d\xf7\x31\xa1\xc2\x00\x3a\xcb\xf3\xd7\xfc\x27\xee\xea\xf6\x71\x59\xe5\xae\x61\x81\x30\x95\x18\xdb\xdb\xf0\xb8\x59\xac\x37\x93\x39\xef\x71\xcc\x77\x17\xa9\x0a\x52\xaa\x39\x11\x2c\x91\xc2\xe5\x65\xb1\xe8\xa2\x98\x54\x09\x41\x27\xdd\x4a\xab\x21\xe0\xff\xac\x23\x6e\x9b\x1b\x2b\x1b\xa8\xd7\xb9\x46\xfa\xdf\xbf\x6b\x4b\xb8\x13\x60\xa2\xe2\xd4\x35\xfa\xd7\x88\x1e\x77\x2a\x52\x54\xba\x33\xb7\xfc\x2a\x50\x0f\x56\x90\xf1\x49\x50\xa8\xac\x0f\xcb\x9c\x43\xb7\x82\xa6\x26\xe1\x49\xd0\xc7\x79\xbe\x9d\x9d\x8c\x44\x6a\x04\x78\x64\xd0\x23\xea\x37\xf7\xc4\xb9\x3f\x0a\x19\x2d\xce\xf7\xb3\xa7\xc5\xd3\xec\x7e\x39\xa7\x12\xf3\xaf\x22\xf6\x2c\x08\xb4\xf5\x37\x82\xfd\x01\xf2\xb7\xe2\xf6\x68\x43\xbe\x5b\x38\xf9\x2f\xcd\xc2\x20\x73\xa2\x09\x4d\x4f\xef\x4d\x64\xa1\x6b\x0c\x6c\xde\xf1\xbe\x74\x1e\x27\xdd\x31\x19\xa7\xf1\x99\x04\x47\x46\x2e\xaf\x65\xdd\x4c\x88\x7c\xfe\xf2\x8e\x67\xa1\xb2\x38\xb2\xc5\xdb\x9b\xa9\xb0\xf8\xcb\x3f\xcb\x2c\x12\x41\x90\x5d\xb2\x20\xc7\x6f\x6e\x07\x26\xbe\x44\x97\x64\x91\x4a\xb4\x73\x8a\x7b\xad\xb0\xe7\xeb\xd9\x1e\x02\x6a\xcd\x75\xbe\xa7\xbd\x08\x2a\x8b\xd0\x46\xd0\x35\x2d\x93\x1f\x87\x32\x2f\xa8\xdc\x5b\x56\xcd\x9c\xac\x6b\x86\xef\x61\x16\x87\x09\x95\x07\x9a\xae\x2c\xfc\x62\xfc\xb9\x62\x60\xb4\x63\x6e\x69\x61\x72\x1e\x8a\xe7\x83\x49\xdc\xbe\x7f\x54\x04\xb6\x4e\x11\xee\x48\x02\x82\xae\xaf\xdc\x6a\x3c\xd6\x93\x0c\x26\x91\xa5\x9c\x51\x37\x63\xb3\xa1\x5d\x73\xf0\x6e\x67\x59\x2c\x09\xf2\x29\x8f\xbb\x73\xb8\x3b\xc6\xec\x3b\xda\x4b\x3b\x5a\x93\x4f\x77\xd9\x26\x52\x77\xf9\x6e\x57\x8f\xd7\x00\x3f\x30\xb1\xf7\x06\xfe\x73\x84\x2a\x3f\xee\xe7\x65\xdd\x4d\x98\x4c\xda\x52\xf3\x01\x0f\xf8\x5a\xe1\xfe\x22\x7a\xce\x32\x93\x10\x10\x6f\x56\x1c\x65\x17\x96\x64\x3c\xe4\x14\x08\xca\x63\x1b\x55\x3d\x94\xbb\xbe\xff\xf2\x70\xc9\xca\x78\x6a\x95\x0e\xda\x84\x04\x0e\xde\x4d\xf7\x82\xc8\x23\x32\x0e\x9c\x4a\xe3\xb6\xff\x47\x2f\x8a\x3b\x02\xed\xad\xb3\xa7\xb0\xf7\x63\xdc\x4e\xca\x20\xe4\xfd\xaa\x13\x54\x8f\x47\x55\x95\xdd\xe7\x45\x40\xa8\x85\xe7\x52\xe3\x6c\xf0\x3c\xa5\x70\x0d\x42\xb0\x92\xe5\x83\x26\x66\x26\x55\x44\xe5\x97\xf7\x72\xa7\xb1\x9a\x8d\x22\xd9\x4c\x31\x43\x65\x0b\x9b\xd1\xbe\x96\xe5\x85\xcf\xf8\xff\x13\x4d\x92\x84\x5e\x93\xa4\xeb\x24\x8c\x61\x01\x99\x8a\x03\xaa\xe5\x3e\x9d\x9c\x20\xb2\xcd\x3e\xb2\xbf\x5f\xa5\x33\x25\x13\x02\x0e\x48\xdb\x38\xb2\xdd\x81\x6f\xa3\x1a\x46\xa6\xc3\x18\xf4\xd9\xd4\xab\x0d\x59\xb1\x4f\x29\x9b\x8c\x94\x32\x04\x4b\x4c\xdf\xe7\x45\x33\x6b\xd7\xf1\x41\x41\x36\x33\x91\x22\xec\x7b\x51\x36\x8f\xf9\xc7\x28\x75\xcc\x0c\x07\xeb\x46\xd8\x26\x32\x2b\xfc\xc4\x4e\x27\x71\x7a\xcd\xce\x8c\x48\xac\x5e\xc1\x1b\x36\x8b\x9f\xea\xfd\xad\x8d\x36\xdc\x77\x71\x96\x5a\xff\xfb\x3a\x08\xec\xac\x0c\xdc\x81\x80\x19\x12\x3a\xf3\x0d\x34\x07\xc9\x18\x9c\x9a\x07\x81\xa1\x66\xcf\xe6\xf5\xe5\xe9\x7f\xfb\x53\x06\x3a\xa1\x78\xf9\xe0\x63\xf0\xa6\xcf\x48\x16\x3c\x4c\xec\x1c\x73\xf7\xcc\x67\x2d\xc3\x33\x87\x69\x4c\x42\x67\x5f\x04\xeb\x19\xb1\x7f\x04\x0f\x55\x4a\xb9\x8d\xbf\xba\x97\x4f\xac\x0e\x1d\x20\x91\x87\xa8\x93\xb3\x61\xea\x0a\x8f\x35\xce\xa1\x7e\x5f\x16\x0f\x50\x7d\x81\x37\x1f\xeb\xe1\x57\x02\xff\xbd\x51\x10\xf8\xd6\x14\x25\x09\x3d\x85\xe5\x01\xee\xc4\xbf\x8b\x3c\x32\xb1\xd7\xc4\xb9\xcd\x3f\xeb\x81\xe5\x96\xe0\x31\x30\xd2\x9e\x5a\x37\x50\x49\xa8\x71\x01\xd5\xee\xe4\xa5\x64\x66\x7b\x2c\xf4\xbe\x53\x43\x6e\x47\x0b\x2a\x60\x1c\x2a\x84\x41\x4b\x70\x90\x75\xf0\x58\xc7\x5e\x35\x85\x68\xf0\x75\x5e\x16\x23\xac\x90\x1b\x99\x40\x1c\x5b\x93\x70\xdb\xd5\xea\xea\x08\xdd\x71\x65\x3a\x97\xc5\x01\x64\xca\x0f\x30\x96\x9b\xf8\x86\xcd\x9a\xb8\x53\xd3\xd1\x16\x4f\x9d\xf3\xd5\x0a\x6f\x2b\xf8\xf2\xa7\x4f\x85\x7d\x3b\xf1\x13\xd4\x91\xd4\x46\x7b\xd2\x7f\x82\xa7\x52\x25\x89\x13\x9c\x20\xeb\x46\xab\x33\xd9\x1d\x36\x99\x2b\x1a\x34\x9b\x2a\x7f\x7b\x9b\xb2\xe3\x6a\x47\x69\x8f\xb2\x70\xe1\xf4\xb9\x00\x32\xbc\x19\x99\xe4\x3c\xeb\x15\xb8\x5e\xcb\xaa\x19\x17\x58\x79\xa6\xc1\x7d\x29\xd9\x8a\x5a\xe0\x6f\x6f\x03\xe5\x19\x26\x4c\xf9\x26\xd2\x6e\xd7\x89\x4e\x8c\xd4\x29\x87\xef\x20\xe7\x26\x25\x06\xa3\xce\xb5\x4f\xd4\x9c\xf9\xda\xb5\xd2\xdc\xf0\xf3\x02\x12\x2a\xcd\x28\x28\x6e\xcb\xc7\xb2\x3c\x5c\x0b\xfa\xfc\x78\x1d\x90\x1f\xf0\x9f\x8b\xd9\x6a\xbb\x79\x58\x2d\x16\xdb\xf5\xb7\xd7\xd7\xc7\x3f\xfd\xcf\x80\xd0\xda\xa8\xe5\xf5\xcc\xc1\x0e\xa6\x3b\x9f\x1c\x92\x98\x52\xdc\x83\x65\x71\xb9\xd6\xcb\x7d\x09\x3b\x9f\xcc\xfb\x81\x98\xd1\x19\x0f\x70\xda\x54\x45\xbd\x81\x9f\x57\xee\x85\x4c\x34\xb1\x5b\x9c\x58\xee\x6b\xb9\x6e\xfa\xcb\x1f\x57\x81\xf1\x82\x7e\xbf\xe3\xa9\x36\x55\xb9\xef\xc1\xeb\xae\xfc\x60\x95\xc4\x76\xef\xa4\x18\xc5\xae\x87\x6b\xf8\x3c\x5f\x9e\x36\x16\x12\xf3\x58\xbe\xe5\x05\x61\x16\x86\xc1\x3c\xc7\x50\x92\x6a\xa1\xdd\xa3\x7e\x9b\x88\x38\xb9\x01\xe1\x30\x20\x6d\xd0\x36\xc1\xc1\xfc\xa5\x03\xad\x3d\x89\x60\x81\xa1\x15\x86\xae\x71\x50\x61\x1d\xfc\xa2\x76\x5c\xc8\xba\x4c\x84\x60\x8e\x87\x1d\x3a\x36\xad\x9b\x74\x7d\xe2\xaf\xff\x58\x28\x63\xd6\xad\xae\x73\xa8\xf4\xac\x19\x21\xec\x83\x8e\xb1\xd6\xff\x3f\xff\x79\x21\xf4\xd9\x80\xd2\xbd\x52\x96\xfe\x7e\xbd\xff\x27\x18\x68\xaa\x9e\x1f\xac\x56\xdf\x56\xe3\x8e\x2c\x36\x9b\x06\xf5\xaa\x1c\xd7\xd9\x04\x33\x76\x8b\x70\x44\x42\xff\xe8\x45\x90\xa4\x18\xf7\xe4\x89\x1d\x75\xf0\xa1\x3c\x97\xd6\x44\xa0\x23\xbf\x24\x11\xbf\xbb\xdc\xed\x60\x3b\xbb\xd9\xb2\x70\xd0\xb8\x10\x81\x4e\x49\x29\xb7\xbd\x7b\x8e\x55\x5c\x95\x7b\x8b\xe3\xf7\x98\xa9\xd1\x65\x85\x81\x95\x49\x9c\x1d\x9b\x77\xeb\x05\xee\x0e\x44\x41\x46\xb6\x84\x7b\xca\x79\xb6\xc7\x42\xed\xb0\xef\x5b\x34\x7a\x74\x51\x68\x33\xbc\x5e\x4b\x3e\xbc\xa4\x57\x09\x11\x25\xdc\xf5\x7d\xdb\x7b\x4c\x2b\x8e\x23\xc2\xfb\x11\x31\xe8\xbe\x49\xcb\xe2\xed\x6d\x80\xcd\x10\x09\xb3\x3c\x7a\xbf\x0f\x7e\x2b\x0e\x55\xd9\xa0\x6a\x50\x0f\x00\x13\xbf\xe8\xdd\x8a\x24\x8a\x22\xe9\x70\xed\xf6\x43\xc3\x5f\x93\x48\x9e\x9e\x63\x9c\x35\x49\x1d\xdb\x09\x31\x1c\x97\x66\x29\xe5\x86\x56\x5c\x9c\x8c\xcf\x62\xb6\x7d\x5d\xac\xe6\x8b\xe7\x4d\x9f\xd6\x29\x44\x16\x85\x54\x1e\x03\x5a\xf0\xbb\xaa\x77\x1b\xd9\xc6\x16\x18\xf4\x6f\x6c\x77\x2b\xaa\x42\x7f\x2b\x0e\xd0\x7b\xfe\x3c\x09\x7b\x0e\xa9\xb4\x29\xdf\x94\x4d\x53\xee\x97\x45\x83\x6f\xe3\x42\x42\xbb\x80\x51\x02\xb3\x7a\x98\x77\x67\x00\x24\x1f\x4a\xe9\xed\x15\x85\x20\x62\x95\xf3\x45\x03\x97\x99\x32\x77\x4c\xa4\x9a\x60\x0b\xb7\x79\x51\xd6\x70\xac\x06\xf0\x29\x21\x94\x21\xd9\x86\xf9\xc3\xf2\x79\xb1\x5e\x6c\x17\x7f\xcc\x1f\x66\xcf\xf7\x8b\xed\xcd\xb7\x3f\xbb\xa2\x92\x10\xa8\x08\x65\x0f\x4d\xe3\x9d\xc8\x5d\x38\x24\x20\x0d\x19\x74\x96\x79\xcf\xf8\x56\x36\xb9\xa5\x8f\x5d\xc2\x47\x84\x04\x41\xfa\x7a\x12\xea\x5c\x79\x71\xb6\x15\x36\xc7\xca\x6f\x9b\x42\x71\x69\xfd\x29\x51\x7d\xb6\xbb\xed\x06\xbb\x2c\x46\x28\x69\x15\x42\x49\x6b\xf0\xbb\x4d\x0f\xdc\x21\x9d\x31\xd3\x69\xa9\xf9\x3d\x6a\x45\xcf\x61\x9c\x43\x08\x9d\xc5\xd4\x5f\xb4\x15\x0a\x5f\xdb\xea\x26\x2d\x6a\xeb\x5f\xf6\x45\xf2\xb1\x67\x3b\xd5\xd1\x5b\x62\x58\x46\x86\x97\x7e\xee\xce\x8b\x66\xfc\xf0\x4c\xcc\x48\x8a\xed\x19\xbf\x56\x79\xed\xc1\x36\xc0\x62\x2b\xe4\xbc\xc6\xe6\xb6\x02\xd3\xd8\x16\x99\x3f\xc8\x59\xc2\x7d\x9f\x63\x07\x43\x0e\xf6\x90\xa7\x29\x80\x61\x92\x59\xea\x82\x75\x24\xbb\xba\xae\x42\x90\xc5\x94\x00\x2e\x9e\xd7\xc3\xbb\x01\x81\x4c\xa8\x54\xf5\x63\xb1\x6c\x67\xfb\x76\xb1\x79\xe8\x4a\x6a\x10\xa8\x54\x38\x65\xd4\x3d\x81\xe5\xf2\xdd\xd5\x32\x82\xff\x88\x49\x08\x1c\x66\x8d\xe9\x66\x4f\x2f\xdf\x9e\x37\xeb\xe1\x8d\x81\x30\x0a\xd0\xe1\x96\x3a\xbd\x17\xc7\xb7\x1b\xa1\x88\x21\xcc\xb8\x14\x9e\x79\xef\xea\x8c\xfe\x90\x34\xda\x5a\xd6\x54\x08\xda\x61\x5d\x26\x0a\xc8\x10\x85\xb6\xbc\x5a\x63\x63\x25\x87\x3b\xf9\xa5\xf1\xce\x37\xfc\xee\x48\x5b\x9a\x6d\x7b\x99\xa7\x75\x53\xe5\x87\xc3\x79\x9e\x40\x84\x91\x62\x5d\xc9\xbe\x4d\x65\x8a\x8e\x97\x02\x09\x33\xb4\x14\x14\xc7\xfd\xb7\x1e\xdb\x05\x92\x20\xb1\x7e\x35\x6d\xec\x71\xdc\xe1\x33\xfe\xec\x4a\x0f\x93\xb1\x29\x24\x61\x44\xea\x62\xdf\xf3\x92\x5c\xcf\x7e\x9b\xca\xc9\x20\x51\x48\xc5\xab\xb2\x02\xb5\xcb\xff\xc2\x7b\xa8\x17\x3f\x9b\x0a\x66\x55\x1f\xe7\x05\x69\x1c\x50\x7c\xd8\xe6\x83\xc7\x43\xba\x1f\xdd\xa8\x54\x5a\xd1\x78\xbb\x38\xad\x9b\x76\x13\x7b\x3b\x3d\x82\x44\xe7\x57\x19\x24\x83\x90\x02\xb2\xd0\xd0\x5a\x74\x5b\x95\x05\x2e\xf6\x87\x5d\x79\x42\x5c\xbd\x74\x73\xec\x1f\xa3\xa9\x32\xfc\xba\x0c\x13\x52\x76\x84\xba\xc6\xaa\x59\xfc\x27\x76\x6e\xd6\xff\xe8\xff\xd3\x3d\x0d\x9e\xa5\x96\x6d\xdb\x94\x87\xd7\xa3\xb4\x96\xaa\xee\x98\x08\x02\x62\x7d\x1f\xaa\x72\x57\x16\x6f\xa8\x7d\x35\xad\x1b\x90\x62\x16\xfa\xe2\x44\x55\x95\x4d\xed\x42\x92\x7c\x58\xc9\x03\xa1\x42\x13\xf4\xf6\xf0\xa5\x1e\xec\xcb\x00\xc6\x50\xf1\x86\xf2\xd7\xd9\xee\xcc\x86\x1f\xdd\x4a\x19\x27\x91\x1a\xd9\xa1\xba\x43\x2a\xcc\xe8\x2e\x6f\x96\x8b\x55\x40\x3b\x8d\xbf\x4a\x95\xc5\xd2\x6b\x00\xcd\x5d\x5d\xf0\x4a\x5e\x0c\x8a\x5b\x83\xc6\x03\x9c\xe6\x5e\xed\xc0\x9f\x47\x6b\x4b\x9f\x36\x90\x57\x35\x71\x0e\x68\x57\x6d\x57\xe5\xbb\x3b\x3f\x08\xb9\xf5\xc3\x68\xb0\x6e\x82\xd1\x0b\x8a\x2a\xa6\x68\x12\xad\xb2\x83\xa3\x65\x76\x07\x53\x62\x92\x15\xf8\xb5\x79\x6f\x5f\x3d\x12\x3a\xfc\x6f\xe0\x52\x60\x02\xab\xb5\xf1\x03\x73\x52\xc9\xf4\xeb\x37\x98\xd4\xc4\xbc\x8f\x74\xb4\xf1\x65\xe7\xdb\x2c\xc0\x00\x0f\x5d\x3e\xe5\xc0\xfa\x44\x64\x37\x30\xc6\x3a\x83\xd1\xc6\x52\xd4\xdf\xcb\xaf\xae\x93\xee\x72\xd0\xc1\x48\xc9\x42\x61\x45\xeb\x0b\x53\x6e\x5d\x0e\x3a\x4e\xd6\x25\x4b\xec\xab\x6c\x77\xb8\xe1\x8d\x92\x4c\x18\xea\xcd\x1c\xc0\xc3\xf1\x86\x1f\x0e\x8c\x88\xe5\x99\x08\x4c\x36\x6d\xaf\x30\x6e\xc6\xca\x30\x4e\xf9\x59\x83\x94\xf8\xaa\xa7\x5f\xaf\xb3\x32\x4a\x6c\x51\xaa\xac\xde\xa0\xc8\x6b\xb0\x3e\x79\x1a\x7f\x8e\x4e\x1d\xa5\x01\x51\x53\x5c\xc0\x61\xdb\xb9\xff\x4f\xe5\x2a\x19\x19\x88\x65\x17\xd3\x2f\x28\x3e\x1e\xff\xe0\x84\x31\x5a\x11\x5c\x81\x6e\x9b\x3b\xb5\x81\xae\xf2\x10\x9e\x0b\x82\x83\xff\xbd\x7a\xe0\xbf\xfe\xdf\xd1\xd5\x26\x41\x46\xfe\x3a\x7b\x52\x60\x27\x47\x69\x2f\x3a\x3f\xbe\x66\x9e\x51\x19\xec\x70\x24\xd3\x41\x28\x4e\x2f\x05\x21\x5b\x27\x9b\x2c\x32\x0d\x14\x3b\xcb\x0a\xac\x41\xeb\xdd\xd9\x79\xe7\xd7\xac\x0a\x99\xc6\x8c\xd0\x34\xaa\x2c\x0a\x6a\xce\x0f\xf1\x04\x7e\x54\x9a\x39\x9e\x44\xe3\xa5\xb2\xa8\x1b\x31\xba\xee\x14\x41\x7a\x2d\x7b\xdb\x6d\x19\xac\x98\x32\x93\x8c\x50\xbd\x67\x3b\xe3\xf1\xc5\x8d\xc6\xeb\x4c\xba\x62\xc4\xcd\x51\x8f\xfd\x3f\x85\x14\x59\x12\x39\xb8\x50\x1b\x69\x43\x95\xc3\x6b\x59\xee\x26\xf1\x05\x52\xf0\x44\x5a\xed\xb4\x9f\xb0\xf7\x21\x9c\x04\x26\xd3\xa8\xa3\x9a\x4b\xac\x88\x29\xd9\x86\x69\x75\x37\x24\x49\x33\x65\x8b\x05\x0a\xdb\x93\x53\x24\xe9\xa2\xe9\x6e\x90\x0e\xa8\xd9\x6e\x6d\x8f\x9e\x16\x4b\x7f\x40\x46\x16\x62\xb6\x42\xad\xf3\x4b\x9b\xc6\x8b\x56\x84\x94\x60\xcb\xd6\x5b\xfb\x82\x2c\x8b\x76\x31\x2b\xab\x7c\x82\xff\xd7\xcf\x34\xa5\x36\x2a\xb3\x88\xbf\x36\x7c\x3d\xa7\x68\x0f\xe5\x4e\xbb\x9f\x34\xea\x8b\xba\x0f\x62\xc8\xc9\x46\xd3\x92\xca\xd4\x69\xfd\xd5\xb1\x35\x25\xa6\x09\x55\xb4\xee\xcf\xee\xf7\x93\x5b\xa7\x44\x85\x81\xcd\x7a\xac\x32\xd2\xf8\x3b\xd0\x0a\x25\x50\xa4\x4c\x59\x51\x4f\xd4\xc9\x7f\x99\x61\x01\x05\x30\x64\x15\xd8\x46\x04\x67\x9d\x0e\xa1\x58\x28\xad\x98\xd4\x40\xfc\x62\x72\x29\x52\x2c\x12\x54\x6c\x86\xbc\xba\xad\xca\xc3\x3f\xcb\x7c\xc4\x45\x50\x2c\x8b\x32\xab\xca\x52\xe0\x05\xd4\x43\x85\x90\x90\x68\x00\xd8\x40\x68\xbe\x2b\xbb\x7c\x49\x85\x32\x56\xd1\x79\x01\x75\xd3\xc0\x2b\x9b\xb7\xbb\x75\x48\xd0\xf6\xfb\xc5\x33\xdb\xce\xbe\xcd\x37\xcb\x97\xe7\xed\xed\xb7\xd5\xac\xfd\x1f\x3f\x28\x0a\x91\xa4\x5f\xdf\xf7\xa0\xea\x77\xe8\x18\x1b\xfd\x89\xa0\x22\xae\x9c\x18\x17\xe5\xfe\x76\x43\x1d\x04\x88\x8e\x1e\xa8\xe2\xd4\x50\xb0\xf5\x51\x2b\x2a\xfc\xdd\x1c\xab\xe2\xc7\x3b\x16\xa4\xfa\x57\x3e\x41\xbb\x11\x4c\xb0\x37\x47\xa0\x4f\x15\x67\x61\xe0\x08\x1a\x94\x66\x7b\x78\x62\xff\xa2\x62\x8c\x69\x97\xc7\xc2\x1a\x12\x6f\x4e\x87\x71\x19\x5b\x25\x71\x94\x9c\xd7\xa3\x5b\xaf\x23\x7f\xb1\x22\xaa\x24\x81\xc8\x8a\xc0\x40\xa5\xde\x6f\x4e\xf7\xbe\x80\xd7\x1d\x57\x08\xdd\x9b\xd7\xae\x17\xff\x37\xaa\x90\x17\x15\xa3\x7f\xf4\xe2\x2a\x95\x80\x95\x4b\x02\xad\x5d\x55\x66\x85\xa0\x2f\xc1\xc2\x7e\xb8\xab\x76\x92\xa6\xec\xba\x13\xe8\xa3\x03\x24\xe2\x74\x3b\x98\x41\x09\x1a\x7a\x1d\xca\x82\xf4\xee\x7a\x64\x32\x95\x06\x32\xb5\x1b\x12\xec\x88\x35\x3c\x10\x71\x11\x2a\x55\x29\x41\xfd\x36\x0f\xab\xdb\xee\x33\x88\xd2\x31\x33\x96\xaf\x77\xeb\x11\xf8\xcf\x0d\xca\x52\x4b\x2c\x39\x73\x74\x8a\x8f\xea\xa2\x58\xa4\x78\x62\xf9\xed\x2b\xf8\x38\xbe\x95\x67\xd6\xc4\x95\x7d\x62\xfc\xaf\xcf\xe0\x14\xcf\x0c\xb1\x1d\x9b\x72\x98\x06\x29\x2e\x13\xca\xd1\x6c\xb7\xc0\xaf\x2a\xb3\x76\xf9\x9b\x30\x56\x14\x4a\x64\x81\x77\xbb\x6b\xdf\x28\xeb\x26\xd0\x7f\xf5\x05\xc4\x24\xbd\x75\x70\x2a\xa4\xce\xc6\x6a\xf8\xad\x90\x1a\xb4\x80\xd3\xff\x37\x06\xb5\x02\x91\x52\x21\x64\x9b\xd7\x2f\x07\x0b\xbe\xbd\x2b\xab\x81\xf1\xd1\x35\xf6\xa3\x02\x8c\x29\xa6\xd1\xb9\x31\xb9\x3a\xee\x3a\x9c\x81\x92\x51\x92\x38\xe0\xe6\x31\xaf\x50\xf7\xf4\x8c\x85\x92\xc8\x28\x09\x50\xae\x56\xec\x8d\x64\xfe\x6b\x41\x85\xc9\x6d\x53\x29\x16\x12\xd7\x14\x88\xa3\x7b\x38\x93\x99\x95\x0a\x90\xaa\x37\x7b\xf8\x39\xef\xc9\x12\x0e\xfa\x21\x4a\x6b\x4d\x6f\xc6\x3b\xa8\x8f\x76\xe5\x9c\x28\xdd\x2a\x8c\x63\x42\xb7\xde\x3e\xbd\xbe\x1f\x4b\xe7\xb7\xea\x4f\x80\x32\x25\xac\x88\x7d\x92\xdb\x3e\x84\x59\x33\x93\xd0\xec\xa3\x65\xdc\x69\xcc\xfb\x9b\xa5\x83\x24\x24\x18\x96\x63\x0e\xf6\x4f\xaa\x03\x21\x88\xbd\x6b\x2b\xd2\x7d\xf4\x81\x0e\x64\xaa\xd2\x81\x54\x25\x05\x9f\xab\x0b\x29\x28\xa1\x03\x2d\x08\xe4\xf0\xf4\x32\xf3\xf5\x2b\x1d\x0a\x41\x92\xaf\x87\x77\xa8\x31\xf0\x89\xda\xb2\x78\x28\x8f\x5d\x9e\xac\x43\x83\xdc\x92\x89\xfc\x4b\xa9\xa3\x30\xca\x1c\x19\xe8\x5c\x39\x65\x2c\xd8\xb2\xae\x76\x3a\xb8\x69\x3a\xca\x3c\x94\xf5\x11\xe1\xed\x88\xab\xb2\x6e\xb0\x1a\xa9\x36\xe8\x48\x62\xec\xfb\x8b\xaf\x40\xa6\x19\xd7\xe8\xe3\xee\x13\x31\x93\xd4\x91\x04\xcf\x26\xf2\x7f\x0f\x2c\xc9\xb4\xb1\xcf\xa1\xcf\xd4\xd6\x71\x22\x9c\x99\xe5\x3f\x4b\xf9\x00\xf5\x5d\x85\x48\xfb\x7b\xd5\x5f\x81\x75\x9c\x00\x9d\x7a\x07\xc7\x42\xbd\x8f\x2f\x35\x4e\x2d\xda\x6d\x0f\x1f\xf8\x03\xf1\x63\x77\xb2\x5d\xf2\xe1\x0b\xae\x63\x15\x71\x17\xa6\xdd\x60\xdd\xdc\x1f\xb1\xae\x6d\x79\x96\x9a\xcc\x1b\x2c\x1a\x68\xf2\x4f\x52\x2d\x25\xb9\xa9\x53\x79\x6c\xba\xf8\x60\xca\xfa\x51\xe8\x24\x35\xdc\xca\xc0\x9f\xe6\xef\x04\xa6\x20\x2f\x8e\xd1\x37\x67\xcc\xee\xb3\x3e\x32\xde\xa1\xaf\x6d\x4c\x6e\x48\x3a\x13\xb6\x12\x57\xe1\x63\x09\xfa\x8f\x7c\x84\xee\xd7\x1c\x14\x15\x5a\x77\xb4\x4e\x0d\x5c\xec\x84\x16\x61\x40\xf3\x61\x9f\xeb\x0d\x56\x7b\x0f\x4e\xf0\x47\x15\x27\x7d\x81\xb5\x82\x1d\xbe\xc8\x2b\xa0\x09\x0d\x5c\x09\x57\x5e\x5a\xce\x5f\xfa\xba\xc2\x42\x83\x92\xa6\x7d\x18\x5e\xa8\xea\x97\xd0\x2b\x0d\xda\x9a\x63\xf7\x78\xeb\xaf\x58\x3d\xe5\xbb\xdd\x85\x82\x8c\x96\x10\x69\xd7\x75\xb5\x81\xfb\x44\x0f\x59\xab\x30\xa1\x29\x43\xa6\x63\xed\x82\x5a\xe0\x6e\xa1\xc6\x82\x3f\xd7\x77\xde\xde\x99\x78\x14\xf4\xd9\xa4\x0f\xf0\xf9\x79\x91\x74\x68\x2d\xe2\x24\x19\x9a\xd7\x5f\xdc\x73\xad\x13\x6a\x21\x6d\xe5\xf1\xf4\x47\x01\xfb\x8b\x14\x69\x74\x7b\x91\x85\x02\xfa\x19\x4a\x57\x97\x19\x7e\x37\xaa\x94\x44\x9e\x3d\xbd\xe5\xad\x42\xec\xb5\x96\x91\xc5\x31\x3d\x8a\xa7\xce\x4f\x6a\xf0\x79\x64\xa9\xed\x36\xed\xf3\xa2\x59\xd6\xf5\xd1\x1b\xdc\x4f\xc6\xab\xed\x2e\x40\x39\xaa\x2f\x73\xd1\x43\x3f\x6f\x4d\xc8\x80\x29\x33\xc0\x7b\xff\xc8\x9b\xf7\x36\x42\xfe\x45\x13\x09\x19\x4a\xd2\x7b\x52\x56\x2c\x82\x42\xba\x1e\xe3\x03\x83\x48\x11\x28\xf4\xcb\xbe\x76\x1b\x84\x3d\xd1\x46\xfd\xe1\xc4\xda\x51\x52\xb7\x60\x1b\x74\x7f\xd6\x9c\x48\xd8\x8f\x47\xf5\x41\xce\xdc\x75\x77\xc4\x28\xc2\xf8\x3b\x10\xbe\xff\x73\xc4\xed\xc2\x6d\xf9\x1a\xdf\x6a\xac\xa8\x10\xd8\x2e\x99\xe1\xf4\x4b\x80\x11\x04\xda\x32\x75\xcb\x3d\x81\xa1\xb0\xea\x49\xab\x5d\xca\x40\xf4\x7f\x75\x9c\xc4\xcc\x15\x38\x7a\x98\x50\x7f\x31\x49\x68\xf1\x88\x34\xd1\x8b\x63\x7d\x11\x8d\x60\x22\x2d\xd3\xd9\xf3\xef\xbb\x4f\x6a\xe6\x5c\x86\x8b\x66\x59\x58\x6a\xd7\xfc\x92\x8b\x8c\x69\x6a\xe1\x21\x7f\x0d\x74\x96\x30\x05\x49\x7d\xdf\x5c\x95\xde\xb2\x9f\xfc\x28\xbb\xfb\x9a\x62\x40\x75\x76\xdb\x4b\x28\x9b\x71\x54\x8d\x59\xcc\x7c\x79\xf7\x19\x7f\x36\xdf\xed\x1e\x39\x51\x61\xc1\x2c\x53\x51\x07\x70\x5d\xef\xca\x66\xd6\xfd\xfe\x4c\x08\x7a\xa8\x9f\xa5\xfd\xb0\x29\xbb\x23\x46\xaa\xd0\x7f\xff\xa2\x79\x7f\x2d\xbb\x07\xcb\x43\x6d\x4b\x8c\x26\xdf\x7e\x4d\xd3\x21\x90\x87\x96\xcd\x7e\x53\x95\x1f\x58\xb5\x77\xfe\x2a\xdc\x7d\xf4\xc1\x84\x63\x62\x2b\xa5\xed\x02\x7e\xf6\x9b\xf9\xbf\x86\x34\xf5\x26\x01\x4f\x99\x0a\x7a\xb0\x03\xea\xa2\x5a\xcc\xd1\x20\xd6\xc1\xf6\xb9\xa2\xe7\xa4\x97\x4e\x05\xa9\x97\x67\xb9\x61\x90\x06\x5a\x76\x6e\x7f\xf9\xce\xe7\x9f\xb7\xde\x88\xc2\x8f\xe3\x8c\xaa\x6f\x54\x64\x52\x04\xdc\xde\xaa\xb2\xf8\xc4\xea\x5a\x39\x72\xf4\x3d\x1c\x04\xf7\x3c\x07\xf5\x41\x1b\xd6\x08\xd5\x3d\xfa\x00\x46\xa9\xc3\xb8\x3d\xc1\x4f\x7a\xc5\x3d\x1c\x66\x59\xbc\x14\x78\x3f\x62\x70\x23\xa0\xf2\x0c\xed\xf6\xe9\xcf\x71\xb7\xb3\xb5\x77\xff\x13\x64\x0c\xc2\x4d\x33\x27\xc8\xe9\x0f\x24\x9a\xa2\xac\x01\xb5\x73\xdc\xd7\x41\x99\x0a\x7a\xc1\xd4\xb1\x6a\x5f\xf5\x2e\x2f\x46\xc9\xad\x9a\x88\x82\xa2\x9d\xdd\x57\x56\x42\x25\xa3\x80\x9d\x55\x1f\xd1\x86\x90\x57\x7e\xbc\x42\x4d\x3b\xdc\x7e\xfe\x6d\xb5\x5a\x3c\x6f\xb6\xeb\xcd\xb9\x76\x8d\x5a\x31\x8a\x82\xf7\x79\x91\xef\x61\xd7\xf3\x6c\xf3\x03\x90\x13\x23\xfb\xe1\xa4\xab\xf2\x0a\xbb\xd6\x0d\xc5\xc0\x04\xaa\xd3\xb0\xff\x8b\x60\x1b\xfe\x34\x98\x48\xd2\x78\xb3\xfb\x89\xb3\x39\x76\x15\x53\x3b\xc4\xb0\xd0\xba\x5f\xd5\x97\x3f\x65\xf8\xfb\x4d\xa0\x34\x7a\x4e\x75\x9b\x29\xe8\xa1\x0b\x9e\x1f\xa5\x33\x6a\xc1\xfc\x8e\x45\xf3\x71\x66\x41\x98\x50\x8a\x28\xe8\xea\xa1\xd5\xac\xae\x73\xc2\xc2\xc2\xa0\x65\x60\x22\x06\x74\x67\xde\xf3\xca\xae\x7e\x67\xaf\x7f\xff\x1c\x4d\x94\x44\xd2\x22\x10\x7c\xa5\xbe\x1f\xc6\x9b\x28\xb3\x5a\x91\xf9\x94\x64\x8e\x89\x50\x53\x45\x69\xeb\xc4\x06\xa6\x8d\x5a\x84\x89\x8d\x09\x9d\x04\xc6\x1d\xe2\xaa\xdd\x88\x87\xd3\xd5\x24\x59\x26\x5d\xea\xa7\xf0\xe6\x78\x1a\x08\x06\xbb\x31\x5c\x23\xb9\xca\xe4\xf5\xa2\x79\x27\xf5\xa8\xc2\xf2\x0d\x7d\x69\xcc\x88\x0c\xe2\xf4\x42\x77\xd5\x22\x1c\x27\x1e\xb7\x81\x24\x91\x0e\x52\x03\xf5\x6c\x27\xa1\xea\x92\x0d\x03\xdc\x50\xfb\xba\x2b\xf6\x2f\xf5\x76\xb1\x9a\x07\x69\xd2\x8d\x10\x86\xb2\xba\xdb\xe7\xe7\xfe\x16\x60\x40\x71\xe3\x7d\x53\xaf\xfb\x68\x08\x23\xa3\x34\x30\x83\x17\xed\x3a\xec\xe0\x1c\xaa\x1b\x99\x84\xce\x65\x29\x2f\x5e\xcb\x72\x67\xe3\x3d\xd5\x06\xd7\x9d\x16\x98\x51\x51\x4a\xf3\x8b\xa8\x15\xab\xd9\xf3\xfa\x6e\xb1\xb2\xc4\xc9\xd7\x4e\x82\xc6\xa8\x48\x0a\xed\xdb\x8c\xc3\x30\xd6\x50\x21\xc4\xbe\x55\x8b\xe6\x7d\xb0\x98\x1a\x95\x68\x4a\xdf\x1e\xcb\xb7\x9e\x5a\xcd\xfa\xda\xfb\x6b\x94\xc0\xc4\x8a\xaf\xd6\xef\xd7\x2d\x15\xfd\xe0\x76\x03\xa4\xc1\x07\xba\x7b\xfd\x57\xd9\x68\x11\x51\x66\x75\x2c\xbc\xdf\xda\xba\x1e\x61\x4b\x0d\x6a\xc8\xac\x94\x80\xf6\x8d\xc1\xff\x8e\xeb\x66\x4c\xa0\x09\x5e\xf3\x8e\xbb\x9d\xdf\x2f\x8d\xc9\x18\x89\x5c\xab\xb2\x6e\xb6\xa5\xe9\x28\xcd\x6e\xbd\x04\xc6\x58\xe2\x05\x0b\x1f\xcb\xa6\xe9\x64\xa9\x08\x07\x39\xb8\x36\x60\x2c\xe1\x26\xf1\x41\x4b\xa3\xde\x69\x63\xee\x5f\x04\x30\x96\x26\x84\x0e\x7f\x6f\x67\x64\x85\xa0\x4f\xe4\x07\xeb\xf7\x1e\x60\x4c\x84\xa9\x83\xa2\xcf\xaa\xea\xa6\x2c\x77\x77\x39\xee\x74\xf0\x9b\xb5\x82\x76\xa3\x82\x48\x90\xfc\xcf\x1b\xec\xd1\x49\xe0\xfc\x36\xad\xf6\xf7\x8f\xe1\xf7\x07\x99\x89\xfa\xb3\xb2\xf3\xf2\x98\xa6\x9f\x01\x0b\x53\x45\x37\xe8\xab\xaf\x5e\x0d\x2c\x04\x43\xcf\xd1\x82\xd4\x96\x85\x4b\xc8\xea\x17\x73\x09\xd0\x00\x16\x71\x4e\x5e\x63\x77\xab\xc5\xe2\x7f\x2f\x68\xa6\xfa\x13\xc5\x41\x9c\x5a\x49\xdd\xa6\x3a\xbd\xb8\x36\xf3\x9a\x30\x9c\xa5\x19\xdd\xbc\x58\x27\xaa\xf3\xd5\xc9\x8b\xb7\x3b\xc4\x01\xb2\x14\x58\x12\x65\xf4\xb4\x8e\x85\xec\x3c\x62\x87\x90\x9f\xe1\x19\x93\x34\x70\x3b\xbd\x29\x37\xb9\x0f\x13\x81\x25\xd2\xea\xf0\xf6\x44\x56\x83\x01\x92\x0a\x58\xca\x18\xf5\x32\xb5\xeb\xd4\x9e\x37\x13\x60\xa9\x50\xe7\x8a\x10\x55\xc7\x27\x8b\xfe\xd3\x60\x38\x60\x59\x98\x10\x8d\xf8\xab\xdd\x83\x7a\x2c\x81\xf6\x48\xaa\x1d\x01\xe8\x01\x9a\x4b\xb3\x09\x60\x9c\x59\x79\x34\xbb\xd4\xa2\xf7\x7f\x98\x32\x81\xf0\x9f\x08\x22\x6a\xbf\xe4\x75\x1b\xa8\x90\x3c\xb3\x3f\x02\x99\x13\xe6\x2d\x4c\xfe\xd6\x47\xbe\x03\xe3\x32\xe0\xce\xde\xe0\xce\xc2\xb0\xa6\xfa\x35\xc0\x44\xe0\x90\x73\xdd\x3b\xfd\xdb\xf0\xc7\x8a\x30\xf1\x22\xd4\xb7\x64\x45\x70\xe8\x7f\x8d\x48\x02\xc2\x01\xe5\xfd\x00\x79\x24\x55\x0f\x0c\xb8\x21\xf9\x46\x45\xbe\x12\xce\xca\x71\x1a\xfe\x3d\xfa\xf1\x20\x80\xe0\x59\xbf\x3f\xbf\xfc\xf1\xdd\x7f\x29\x48\xed\xbd\x6e\x9e\x4e\x2e\x4d\xef\xaf\x91\xc0\x64\x60\xb9\x16\xd4\x57\xee\x6d\xa9\xc0\x64\x9c\x26\x56\x24\xed\x93\xde\xcc\xba\xb7\x79\x00\x93\x2a\x11\x96\xe9\x55\xe8\xb2\x82\xee\xcf\x68\xa5\x62\x6f\xf3\xfa\xd0\x2e\x1c\x0f\x47\xe9\x0f\xa9\x28\x76\x36\x0d\x8e\xf3\xe7\x04\xc1\xa6\x35\x1a\xfe\x31\x98\xa2\x8a\x47\xc6\xd9\xa4\x61\xf5\x08\x75\xf3\x0a\xb9\x9e\x4d\xbb\xa2\x02\xd3\x59\x46\x90\x18\x5a\x90\x86\x3f\x57\x6b\xeb\xf8\x46\x1a\x35\x03\xab\xac\x69\xdf\x7a\xf7\x31\xcc\x42\xe2\x19\x3d\x96\x6f\xb7\xd6\x32\x71\xf1\xfd\xf9\xca\x9b\x68\x98\xec\xd6\x7e\x6f\x77\x6a\xb5\xab\x89\x18\x71\xec\x69\x36\x75\x3d\xb3\x90\xfb\x0f\x87\x26\x71\x69\xcb\xe0\x76\x9b\xc4\x8a\x59\xbb\x26\xb5\x55\x55\x1a\x35\xc0\xdc\x89\x87\xe7\xf7\x9f\x07\x54\x8e\xc4\xfb\x8c\x5f\x4f\xb8\x1f\x7b\x28\x5c\xe5\xeb\x03\x33\x92\xc7\x99\x75\xb9\x3b\x60\x55\xe3\xaf\x3c\xc6\x20\x60\xca\x50\x3f\xca\xfa\x1c\x6d\xb1\x68\x2e\x7d\x32\x46\x1f\x09\xe2\x80\x5c\x07\x5e\x57\xcb\xef\xb3\x8d\xb5\x5f\xbb\x99\xad\x9d\x60\xd1\x76\xf9\xbc\xfd\xe1\xfb\x97\x10\x84\x2c\xe6\xe4\x72\x53\xec\x3a\xeb\x0a\x08\x42\xcc\xc0\x3d\x57\x92\x65\xe9\x15\xf6\x9d\x68\x25\x04\x71\x2c\xec\x8e\x5d\x6a\xb4\x66\x70\xed\xab\xb8\x29\x07\x82\x7c\x7e\x6c\xa2\xfc\x8b\xf3\x7c\xdc\x2f\x9a\xf7\xcd\x17\xa2\x6f\xc1\x42\x10\xf3\x94\x94\x31\x0a\xfc\xba\x2d\xd5\xb1\xa7\xdd\x3a\xb8\x75\x41\x8c\x82\xc0\xac\xf2\x78\x9a\x51\xd4\x3f\xfe\x1a\x63\x0d\xaf\x08\x20\x62\xf5\x64\x66\x54\x37\x2c\xaf\x88\x01\xb4\x1f\x31\x99\xc7\xc7\xfa\xcb\x49\xe2\x10\x53\x8f\xf3\xbf\x87\x3d\x3a\x2b\x43\x7f\x58\x86\xcc\xb3\x77\x7e\x41\x25\x81\x20\x65\x86\xde\x0e\x3a\xcf\x44\x93\x6f\xf0\x9a\x05\x19\x03\xb0\xdc\xa7\x93\x77\x5c\x1e\x2c\x88\x41\x96\x45\x84\x39\x2c\x9b\x77\x6c\x73\xc0\xbc\xa8\x29\x9b\xaf\xb1\xbb\x34\x1e\x72\xea\x4e\x3a\x75\x73\xfc\x9a\x63\xd5\x90\xd9\x63\x37\x02\x2d\x73\xb0\x76\x4d\x40\x67\x59\x34\xbc\x70\x91\x25\x14\x05\xc2\x27\xe4\xbb\x36\x03\x1e\xa2\x59\xbc\x70\x74\xfb\x4a\xc7\xff\xe3\x3f\x23\x19\x61\x08\x9c\x2a\x93\x75\xb7\xc3\xea\x5f\xd4\x45\x1f\xfe\x52\x60\x9a\x42\x19\xdd\xf5\x88\xd7\xab\xe7\xcd\x15\xce\x3f\x0d\xcf\xce\x28\xb1\x4d\x79\xc8\x55\x7f\x43\x98\x00\x8a\x41\x00\xb1\x15\x41\x7d\x98\x3d\x7e\x5f\x3e\xdf\x6f\x6f\x17\x8f\xb3\x3f\xfd\x3d\x80\x4c\x50\x65\xac\x6a\x17\xdb\xfd\x70\x56\x03\xd7\x04\x3d\xfd\x81\xf2\xd5\x33\x64\x20\x00\xb0\x2c\x67\xeb\x30\xbf\x6d\xf2\xfd\xa8\x7e\x03\x01\x48\xb4\x22\x7e\xf9\x5f\xde\xe5\xc2\x1d\x91\x5c\x53\xc9\x68\x5e\xee\x0f\xed\x4b\xbc\x2c\xf2\xee\x81\xa9\x44\xa0\xc3\x89\xdd\xe4\x7a\x7d\x94\x6e\x8e\x50\x94\x53\xcf\xb4\x1e\xdd\x3a\x85\xd6\x7f\x56\xed\xca\x02\x07\x3e\x89\xbd\xdc\xf6\xef\xba\xa8\x5d\x25\x05\x02\xad\xc0\x4f\x87\xc7\x52\x7d\x0c\x42\xa2\x8b\x07\xa1\x4d\x44\x08\xae\x76\xbd\xfc\xad\x77\x12\x64\x01\x39\x33\x1f\x8e\xf5\x3b\x41\x13\xf7\x5d\xc7\x7d\x78\xf5\x88\x40\xf8\x27\x7f\xe1\xae\xbb\x4e\x3f\xbb\x69\x43\xd5\x6b\x57\x3e\x51\x4d\x81\xc0\xa0\xb5\x06\x69\x7e\x7a\x1f\x8c\x5e\xdb\x08\x42\xc6\x63\xbb\x71\xd0\xb4\xf1\xae\xa6\x83\x53\x84\x4c\x64\x99\xd5\x41\xfa\x6e\x4d\x51\xaf\x44\xbb\x61\x20\x25\xe9\x21\xbd\xae\x16\xdf\x97\xaf\xda\x2b\x82\xf8\xa3\x2a\x24\x0a\xda\x5b\x05\x0a\x6d\xed\xf0\x09\x7e\x6e\xa0\x7a\xeb\x5e\xcd\x30\x62\x82\xa0\x16\x9d\xe0\xda\xf2\xe5\x79\xfb\x34\xfb\xa3\x3b\x2e\x11\x23\x0b\x81\x7b\x31\xab\x97\xf5\x7c\xb6\xc2\xa6\xca\xf1\x13\xef\xd0\x57\x69\x20\x8c\xa5\xad\xbf\x78\xb7\xb5\x3b\xc4\xf3\x21\x74\x92\x1d\x08\xa4\x45\x63\x39\x68\x84\x69\x1b\xfe\x98\x24\xb6\x5e\x98\xf3\xd2\x18\xb4\xae\xcd\xa3\x1b\x7d\x1c\x33\xfc\x20\x4c\x9c\x45\x56\x0d\x5f\xde\x1d\x0e\xc2\x04\x6d\x12\xe4\x2d\xa8\xc6\x38\xd7\xe1\xdd\x4e\x03\x63\x61\x46\xaa\xac\x70\x44\x0e\x84\x30\x45\x4d\x45\x18\x6f\x72\xe7\xc4\x42\xf5\x8f\xbc\xd0\xe5\x17\xf5\xe4\x27\xf7\xbb\x10\x62\x20\x38\x87\x6f\x37\xdc\x22\xd8\xa0\x7b\x78\x7e\x48\x43\xea\xdf\x14\xf8\xb3\x21\x69\x63\xbb\x78\x52\xbf\xf1\xfe\x65\x33\x7f\xf0\x3f\x0a\x34\xb3\xe4\x6a\xb2\x09\x77\x8c\x5c\x5f\x49\x85\x50\x46\x31\x55\x61\x94\x7b\x9d\x6f\xca\x92\x04\x3d\x87\x17\x25\x23\xeb\x7f\x4d\x88\x7d\xdd\xb7\xa0\xeb\x03\xc2\xae\x8a\xc5\x4d\xff\x52\x19\x2b\x2a\x9c\x3b\xe0\x4b\x1b\x00\x6d\xbb\xcb\x4a\x43\xeb\x47\x07\xc5\xab\x15\xa7\xb8\xc6\xb7\x71\x1f\x50\x71\x44\x7b\xf2\x5d\x59\x35\xc7\x02\xef\x4b\x3d\xf1\xca\x86\x2a\x4b\xa8\x53\xd2\x60\x6d\x39\xe1\x5d\xb1\x00\x42\x1d\x49\x82\xd7\xef\xa1\x0d\xdf\x9f\x4b\x4d\xd2\x3d\xfe\x60\x66\xdd\xef\xb6\x70\xc8\xb7\xaf\x3e\xe9\x38\xaf\x1a\xa1\xe6\x69\xe8\x5a\x61\x79\xef\xf6\x62\x28\xbd\x15\xcf\x03\xd1\x63\xfb\x79\x4e\x88\x00\x54\x6a\xfb\x56\xf4\x04\x44\x20\x34\x41\x4a\xb1\x88\x55\x7b\xb0\xcd\x47\x77\x2c\x62\xcc\x16\x5d\xc9\xf9\xb5\x2c\x77\xba\xfc\x2a\xbc\x83\xd8\xe4\x6d\x8e\x58\x92\x59\x40\x82\xbd\x8f\xe4\x9a\x7d\x0e\x1e\x23\x86\x8a\x26\xfd\x62\xf3\xd0\x77\x1f\x86\x28\x08\x04\x81\xde\x69\x76\x75\xa6\xcc\x10\x05\x71\x48\xf5\x26\x87\x51\x9c\x15\x1d\xab\x6d\x38\x69\xa2\x20\x4e\x92\x90\x96\xa3\x6f\x35\x56\x05\xec\xd1\xa9\xdf\xf6\xdf\xc4\x28\x70\x8f\xc4\xde\xf6\xa2\xd4\xe3\xbd\x28\x0a\x30\x23\xc4\xbf\xeb\xb8\xd6\xbe\x94\x30\xb9\xb6\x45\x61\xa6\x89\x41\x26\xf3\x66\x0f\xf5\xc7\xb6\x9a\x56\x46\x84\x28\xe6\x8c\x5e\xb4\x0a\x1a\xbc\x45\xd5\x06\x60\x7e\x61\x8a\x62\x69\xb1\xd5\x2f\xff\x6e\x06\x37\x2b\x36\xc8\x6d\x0f\xf9\xe7\x40\x8b\x03\xa2\x24\xe2\xd6\xf0\x76\x57\xd6\x68\xc5\xd6\x48\xc3\x72\x67\x65\x6c\xfa\x77\xc9\x7d\x22\x65\x36\x9a\x5f\xfc\x78\xea\xfe\x14\xd9\xec\xe0\x2d\xff\xc4\xa7\x01\x31\x18\xa2\x34\x31\x56\xcd\xa0\x81\xfd\xe1\x7a\x70\x1a\xb5\xc9\x48\x68\x57\x6f\x32\x00\xf2\x61\x9a\x5d\x04\x07\xaf\x43\x94\xb5\x33\xd0\x16\xb0\x5f\xf3\x0a\x8a\x77\xa8\x2f\x8b\x39\x51\x16\x09\x54\xbe\x0a\x4f\xde\x0d\x2b\x3c\x58\xfe\xa4\x1b\xc1\x05\x52\x4e\x85\x3f\x0f\xbb\xb2\xc2\xbb\xf6\x51\x16\x8b\xa7\x97\xe7\xcd\x79\x45\x8f\xb8\x01\x0a\x34\xcf\x71\x92\x83\x5d\x4e\xe4\x58\xee\x23\x42\xa4\xce\xad\xa4\x20\x61\xff\xb5\xef\x90\xfc\x85\x5e\x44\x90\x77\x31\x5b\x24\x34\x47\xe3\x9b\x42\x83\xcc\x2e\x12\x18\xf8\x0c\x67\x66\x4c\xbe\xcb\x3b\x88\x13\x44\x90\x66\xb4\x0c\xfd\x75\x8f\x4d\x1b\x1e\x2f\x6f\xbb\x23\x98\xfa\x68\xfa\x75\x07\xcd\xb0\x08\x13\x49\x2e\x09\xf7\x3a\x9f\xdd\x94\x3f\x47\x7a\xae\x10\x29\x19\x9f\x8b\x64\x56\x7e\xb8\x87\x55\x80\x48\xe9\x44\xc0\xb9\xb5\x31\xba\xe5\x9a\x59\xd1\x1a\xdb\xdf\x3a\x56\xe5\xb7\xdd\xa1\x9b\x09\x5a\x58\xcd\xa5\xa5\xb6\x6e\xb3\xae\x8a\x3f\x8c\xaf\x23\xad\x22\xa1\x3c\xce\xa4\x8d\x8a\x5f\xcb\x66\x6d\x7d\xd4\xba\x13\x61\x42\xd9\xd8\xb6\x63\x4f\x43\x84\x71\xe8\x45\xed\xd6\xf9\x5b\xf1\xed\xf0\x52\xbc\x18\xd3\x5b\xe9\x22\x4c\x62\x32\x12\xa2\x9d\xed\x96\x1a\x7b\x70\xd1\x85\x82\x08\x45\xe0\xa9\x27\x9b\xbc\x39\xc3\x81\xed\xe1\x38\x0c\x02\x16\x75\x3c\xe6\x03\x56\xe7\x89\xf0\x8f\xd1\xc8\x34\xb1\x5b\x41\xfb\xda\xbb\x29\x33\xdc\xe0\xfd\x40\x01\xd4\x42\x5e\xcf\x9f\x6f\xb7\xf3\xd5\x8f\x5b\xca\x15\x09\xcb\xe8\x7e\x5d\x1c\x45\x9a\x0c\xba\xbf\xce\x3c\xdc\x43\x59\xa3\x1e\x14\x7d\xe2\x28\xcb\x08\x02\x42\xa2\x11\x2f\xc5\x5d\xfe\xf6\xde\x5c\x81\x62\x0c\xd7\x94\x38\x52\x11\xa9\xad\xb6\xbb\xe9\xb1\x9b\x62\x71\x9c\x45\x14\x0c\xd4\x4d\x9b\x9f\x93\x8b\xbf\x3b\x92\xc4\x48\x0a\x60\xf3\x97\xa7\xa7\xe5\x7a\xdd\x46\x51\x67\x4a\x03\xc4\x89\x01\x2f\xb9\x52\x7e\xe2\xa0\xe6\x38\xd9\xa1\x84\x38\x8d\x6c\x50\x6a\x57\xa7\x15\x2a\xcc\x3f\x47\xba\x8f\x10\xa7\xb1\x81\xc0\xdf\x52\xd7\x47\x3c\x1b\xfe\x0c\x6f\x7f\xc6\x64\x4a\xae\xc5\x5f\x88\x07\x37\x95\xfd\x54\x8c\xb3\xd4\xfa\x20\xe4\x85\xce\xc9\x20\xba\xd0\xeb\x52\xe5\xb0\x23\xae\xf7\xc0\xa3\x0c\x62\x1e\x44\xde\xca\xe1\x06\x6a\xab\x59\xff\xcb\xfa\x8a\x9d\x08\x41\x3c\xf8\xbf\xd1\x8d\xf7\x6b\x45\xcc\x39\xd0\xa5\xfc\x75\xf8\xeb\xbf\x13\xe3\x81\x98\x1b\x19\xf9\x68\xe0\x96\x2a\x12\x8f\xf0\x75\xea\x96\xb5\x58\x70\x16\xd9\xb2\xe9\x27\xd6\x24\xb2\x65\xa9\xbf\xe3\x2e\x67\xbf\x6a\x73\xa5\xd8\x19\x43\x00\xa4\xb6\x26\xb1\x40\x43\x0c\x8c\xa1\x5c\x00\xc4\x32\x8b\xa9\x29\x3d\x7f\x87\x0a\x54\x83\xd5\x90\xb0\x0f\xb1\x54\x8a\xea\x05\xf4\xe2\xd1\x6f\x9c\x52\xab\x87\x58\x62\x42\x0b\xda\xc3\x72\xd3\x73\x45\x6c\xff\x6e\xd7\x8d\x79\xd9\x6e\x4c\x45\x63\xeb\x9d\xbf\xf5\xf3\xa8\x5e\x32\x15\xab\x30\x26\x93\xd5\x43\xd7\xa2\x75\x5c\x84\x2b\xad\x72\xf7\x31\xef\xd7\x4b\xa8\x81\x1b\xef\xcc\xeb\x0f\x06\x48\xde\xd4\x4d\xde\x2d\x67\x31\x0a\xf0\x06\xe4\x67\x1d\xb3\xb3\x97\xe5\x28\x1a\x88\x4d\x22\x09\x14\x97\xd7\x77\x55\x59\x34\xab\x63\x51\x60\x65\xb3\x94\x97\xcf\xf3\xb3\x33\x32\x4d\xdc\xfa\x72\x7f\x8b\xfb\x52\x8d\x4f\x23\x11\x5d\xdc\x4b\xd9\x1a\xd6\xb3\xaa\x82\x13\x6d\xac\x84\x94\xe8\x4e\x95\x04\xb1\x8d\x28\x2a\x52\x45\xf9\x3c\x6f\x1d\x49\x00\x21\x57\xfd\x02\x78\x59\xd5\xb3\xce\x02\xd0\x8f\x0a\x53\x11\xc8\xce\x4e\xef\x6e\xa0\x3d\x38\x5c\x3f\x92\x28\x36\x56\xf0\x14\x76\x6a\x0e\xc5\x8c\xa8\x07\xc3\x72\xc5\x3f\xfa\xde\x24\xfe\x63\x59\x82\x81\x77\x05\xe9\xf9\xf5\xfa\xc3\x4a\x53\xb2\xe3\x68\xfc\xfe\x25\xb6\x10\x03\x7f\x95\x49\x22\x49\xdb\xe0\x19\xbf\xe6\x6d\x3a\x3e\x15\x3f\x27\x09\x68\x2a\x49\x6d\x2d\x63\xd2\x76\x2f\xfa\x79\xfa\x04\x25\x1a\x92\x44\x72\xd3\xde\xc0\x9b\xd9\xfc\xf7\x6f\xaf\xdb\x97\x67\xbf\xbe\x25\x3c\x14\xa9\x0d\x11\x9f\xac\xb2\xcc\x5d\x5e\xe4\xf5\xfb\xf9\xaa\x78\x14\xd3\x36\x69\xb0\x51\xef\xce\x8a\x83\xda\xaa\xf5\x5d\x59\xbd\x5a\xf9\xf8\x99\xde\xe7\xe3\x0b\xe5\x51\x4c\x91\x8d\x95\x4d\x7b\x3b\x0b\xcc\x0f\x56\x80\x44\x84\xd2\x42\x2f\x00\xea\x57\x38\x91\xfe\xb2\x3b\x04\x32\x22\x60\xb0\x0d\x8a\x33\xff\x67\x19\x70\x8a\x0c\x9f\xe7\xb3\xf5\x03\xb1\x9d\xbb\x23\x59\xa8\x5c\xca\x4b\xbc\x8a\xa8\x3b\xc0\x0d\x55\xc3\x9f\x66\x7f\x6c\xd7\xcb\xcd\x62\xdb\x45\x18\x89\xd4\x99\x51\x5e\x71\xe4\x48\x31\xf2\x08\xa3\x03\x89\x8e\x2c\x3d\xf9\x0d\x9b\x59\x5d\x63\xb3\xd4\x13\x61\x5f\xa2\x53\x26\x75\xb7\x53\xdc\x94\x50\x4d\xeb\xb4\x43\xa2\x25\x52\x50\x95\x9b\x1d\xfa\xd2\x7c\x82\xed\x7e\xdc\x35\xba\x5e\xb1\x5a\x34\xef\xfd\x82\x7f\x82\xa9\xc9\x5c\x9b\xf5\xa5\xa0\xe4\xc7\x1f\xc8\x38\x45\xf9\x1f\xb0\xcb\xfb\xfc\x74\x48\x50\x82\xd5\x4e\x1c\xc0\x2c\x87\x0f\xc0\x08\x6b\x94\x76\x8b\x9f\x4f\xc4\xaf\x77\xb1\x0a\x56\x8b\xcd\x43\xcf\x84\xa4\x1d\x29\xa9\x19\xec\x62\xcc\x6f\x75\x5e\xbc\x4d\x48\x43\xd8\xd1\x69\xc8\x80\x60\xb2\xb3\xb7\x2a\x27\xca\xc4\x13\x5c\xc2\x57\x21\x0d\x13\xeb\xb8\x44\xba\x8f\x3e\xad\x7d\x7d\xf8\x63\x3a\x65\x48\x43\x21\x09\xb4\xee\x73\xa8\x7a\x53\x3e\x11\x3f\xea\xda\x78\x25\xc2\x1e\xd6\xb5\xb7\x34\x4c\x3e\x9a\x34\x34\x29\xbd\x28\x56\xcb\xdc\x51\xbb\x7f\xd9\xd9\x49\x23\xb0\x00\x79\xc7\xdd\x1c\xce\x8a\x34\x16\x11\x89\x45\xa9\x1d\x42\x71\x3c\xcc\x24\x14\xba\x7d\xb7\xc9\xc8\x6d\xf8\xdd\x31\x68\x6a\x2e\x59\xe1\xa8\x5f\x55\x82\xd3\xc4\x49\x2a\xda\xe6\xdb\x04\x31\xea\xa2\x44\xd7\xdf\x0a\xd3\x44\x47\x04\xde\x5a\x17\xf0\x81\x7d\x42\x3d\xa4\x09\x86\x24\xa6\x28\x8f\x27\x5a\x84\xab\xd3\xe8\x07\xa5\x5c\xc5\xa1\xd5\x8d\xce\xeb\xf7\x99\xc5\x8c\xfb\x4f\x67\x71\x92\xe2\x90\x1e\x45\x4a\xc1\x37\xa7\xcd\xe9\x80\xb3\x42\x0f\xd4\x99\x86\x3f\x3f\xd3\x29\x21\xbb\x9e\x20\x27\x61\x0e\xa2\xd1\xf8\x65\x28\xe5\x32\x80\xc0\x77\x86\xbc\xb9\xbd\x8f\xbb\x87\x27\x12\x2c\xa3\xf7\xe1\xdb\xed\x7c\xee\x3f\x2e\x92\x90\x7a\x8f\x63\x9d\x7b\x7f\x58\x58\x3d\x96\xcf\x1c\xbf\xd2\xd8\x7f\x08\x22\x45\x11\xf2\xbd\x77\x59\xea\xd9\x06\x40\x0a\xc6\xba\x48\xa9\x63\x55\x9d\xe9\x07\x90\x4a\x86\x99\x33\xac\x9d\x55\x23\xbd\x71\x48\x65\x10\x61\xd8\x97\x5f\xca\xf7\xc7\xfd\x06\x3e\xb0\x7a\xad\xca\xa6\x54\xe5\x6e\x8c\x31\x84\x54\xa2\xd2\x69\xc7\xd4\x3e\x33\x76\xdd\x61\xc5\x84\x97\xd8\x5f\xbf\xe7\x87\x35\xba\xcd\xad\x7b\xdc\x2a\x45\x8a\x89\x9f\xe0\x2d\x57\xeb\xa6\xac\xc6\x33\x4f\x09\xeb\x78\xdc\xa9\x4d\x91\xfa\xc6\x45\x3c\x78\xe5\x05\xd0\x59\x92\xba\xc6\xaa\xd3\xa7\x69\xf3\xa9\x17\x63\xc3\xec\x5e\xf0\x91\x6a\x30\xe0\x7e\x88\xeb\x9d\x52\x35\x6c\xe0\xbf\x0e\x29\x86\x31\xc9\x0e\x38\x63\x25\xe7\xe0\x36\xfc\x4e\x84\x98\xea\xd6\x4f\xb3\xe7\x87\xd9\x66\x33\x7b\x7e\x5d\xbd\xfc\xf1\x67\xb2\x79\x98\x7d\xf7\x5b\x5b\x6a\x02\x41\x24\x32\x6d\x51\x77\xcf\xa5\xc6\x3e\xde\xbf\x1b\x96\xa4\xc0\xce\x52\x63\x6e\x53\x0e\xff\x1c\xdd\x23\x23\xa3\xd8\x61\x9e\xfd\x32\xd5\x87\x5b\x43\xc6\x18\xa3\x85\x34\xb7\x3e\x8c\x8f\xd7\x44\xff\xdb\x91\x40\x4a\x77\xff\xfa\xf1\x00\x87\xc3\xa9\x3b\x41\x90\x12\x2f\xf3\x61\x31\xbb\xed\xfe\x16\x71\xeb\x3a\x6a\x6d\x0c\x7e\x60\x3e\xbc\x11\x19\xd3\x96\x90\x89\x4e\x53\xa5\x1e\xd4\x2c\xb2\x20\x91\x94\x76\xef\xe0\x38\x29\xd7\xec\x87\x65\x11\xb1\xbd\x35\x5a\x0d\xfd\x5f\x2c\x94\x97\x45\x82\x2c\xd0\x11\x41\x89\x48\x57\xf6\x6c\xe1\xe4\x57\x80\xe1\x8d\xcc\x22\x16\x11\x86\x12\x87\x65\xb0\x2c\x0a\x45\x74\xee\xa1\x5e\xe8\x68\x0f\x27\x5d\x96\x30\x41\x93\xe4\xb3\x6c\x90\x45\x7f\x62\x5f\x10\x0f\xb2\x24\xb0\x45\xbf\x3d\x7c\xe0\x53\x59\x34\xef\x93\x54\x03\x68\x93\x27\x12\x43\xdc\xdb\xf7\xf0\x5c\x2b\xc9\x52\x8c\x28\x18\xb3\x32\x10\xb7\xb3\x3f\xc3\x11\x2b\x0f\xb2\x2c\x95\x74\xd3\x2a\xb4\xaa\xd6\xc7\xea\xb0\x3b\xd6\x8b\xe6\x7d\xf4\x83\x79\x26\x82\x0e\x4d\x32\x2f\x0b\x4b\x6c\x1a\x75\xe3\x32\xc1\x2c\xe7\x7d\x5b\x63\xf3\x5a\x7e\x61\xd5\xb5\xa3\xcf\x97\x2b\xe2\x34\xc6\x0e\x00\x77\x73\xac\x2e\x10\x30\x99\x10\x69\x90\x9d\x2d\xae\xc9\x4b\x6f\x74\x12\x29\xd1\x57\x62\xec\x47\x37\xa5\xdd\x9b\xc7\xa7\x72\x22\x97\xb5\xa5\x57\xd9\xba\xf9\xf4\x6e\x9f\x81\xe0\xe8\x75\xd8\xca\x3d\xe4\xa3\x00\x38\x03\x64\xa4\xa0\xe5\x9a\x27\x65\xdd\x7c\x5b\xdf\x5e\x8c\xd1\x54\x3d\xd8\x52\x7f\xf3\xe9\x34\x7b\x1b\xab\x9f\x43\x26\x83\x80\x8a\x3a\x78\x28\xd5\xfb\xd6\x9c\xa1\x30\x99\x14\xc6\x5b\xe2\xcd\xcb\xe3\x81\xa0\x72\x0e\x1f\xd8\xdd\x63\x95\xa2\x64\x1e\xd5\xb2\xfb\x6c\xa7\x6a\x0f\x92\x0e\x99\xca\x02\x12\x20\xdf\x6e\x77\x25\xe8\x20\xe4\xfd\x82\x51\xa6\xd0\x5a\x45\x38\x0a\x83\xbb\x79\x77\x55\xb9\x9f\x97\x25\x51\xc0\xf2\x4f\x5c\x93\x3d\xf0\xd9\x3b\x68\x94\xa2\x5d\xa0\x9b\x8f\x17\xd0\x3c\xc8\x94\x49\x49\x61\x8e\xea\xbe\x8c\x16\xe3\xde\xfa\x98\x21\x53\x09\xf3\xa5\xa9\x36\x8f\x7f\x84\x0a\xd7\xe5\x4e\x2f\x0b\xa7\x98\xe6\x47\x1a\x6e\xfb\xae\x4b\x6f\xca\x00\x99\x01\x45\x29\x68\xa5\x8a\xf3\x9f\x90\x00\x04\x87\xa3\xfc\xc0\x53\x1d\x0e\x1f\x0b\x67\x41\x48\xaa\x50\x79\xbd\xb5\x92\xc4\xbf\xf9\x03\x42\x5a\x81\x74\xab\x10\x64\x7d\xb7\xfd\xc1\x20\xb4\xe2\x4a\xf3\xf9\xc3\xf6\xee\x7e\xb5\xf0\x8c\x00\xe0\x01\x30\xc2\x2b\x5a\x7b\xfd\x2e\x1e\x1c\xdd\x98\x2b\xf5\x88\xab\x18\x10\x1e\xa8\x08\xdc\x0c\x6c\x93\x88\xb1\x9e\xda\x70\xbe\xf2\x00\x33\x6f\x7e\xb7\xf8\xd9\x60\xd1\x29\xd8\x00\x0f\x79\x1c\xbb\x8c\x60\xb1\x9a\x67\x61\x60\xb3\xbf\x57\xf8\x2a\xa6\x01\x2d\x3c\x44\xa4\x93\x95\xea\x40\x2b\xda\x28\xc6\xe5\x51\xa4\x3b\x2c\x9c\x7a\xc7\xce\xac\xa3\x3b\x9e\x0a\xda\x7e\x7f\x74\x4a\x27\xc0\xe3\x40\x06\x9d\x29\xd1\xdb\xb1\x42\x92\xcf\x6a\xca\xaa\x43\x67\x02\x8f\xa3\x10\xad\x63\xc0\xb7\xc2\xa1\xd5\x1d\x7d\x61\x78\x7d\x71\x1c\xd2\xb4\x5e\x43\x5e\x34\xf3\x32\x2f\x48\xa2\xdb\x9f\x25\x11\x9a\xc8\xa2\x95\xc5\x8d\xb8\x53\x8c\x92\x7e\x9e\x48\x4d\x35\xc7\xad\xc9\xc7\x2b\x0a\x4f\x94\x15\xdc\x5a\x51\xff\xbb\xe7\x81\xce\xfd\x00\x13\x53\xef\xe6\x5b\xb5\x7b\xc8\x8b\xe6\xb7\xe1\xa7\x4d\xa6\x9d\x35\xcc\xee\xe4\xea\xa3\xff\xd7\x0a\x0f\x7f\xf7\xaf\xfb\xae\x94\x69\x4a\x29\x67\x5a\x53\xa6\x39\x0c\x44\xc7\x83\x03\x1d\x5a\xc3\xe3\x9f\xfd\x46\x30\x4f\xe3\xc8\x12\x65\x60\xa7\x08\x9d\x49\x8d\x51\x9b\x36\x5d\x04\x6f\x3c\x4d\x22\x82\x8d\xdf\x63\xf3\xe3\xbd\x74\xe5\x2b\x4f\x95\xee\x67\x62\x3c\x05\x45\x4a\x46\xce\x2c\xda\xad\x2f\x9d\x19\x0b\xf0\x54\x27\x32\xed\x78\x3d\x2f\xcd\x3b\x56\xb4\x7e\x11\x76\x23\x98\x4a\xaf\x79\x16\xd8\x5d\xe5\x40\x90\xa4\xae\xb0\x35\x54\x65\x72\x63\xb9\xb4\x04\xf2\x7a\x57\x76\x5f\xc9\x95\x8a\xbc\x9f\x52\x07\x42\x1e\xcf\x0d\x6e\x22\x96\x8e\xfc\x2e\xff\xe6\xfd\x13\x51\x48\x42\x2a\x9d\xd0\x66\xf8\x27\x42\xf7\x42\x88\x38\xd2\x94\x14\x7e\x62\x65\x88\xf8\x59\xe7\x54\x30\xf3\x52\xfc\xbf\x2e\x02\x73\x91\x58\xab\xea\x63\x71\xe1\xbf\xe4\x46\x40\xa2\x6d\xf1\x29\x6f\xf2\xbf\xb0\xa8\xed\x3b\xee\x37\x02\xde\xce\xca\xc8\x23\x6d\xea\xe3\x7e\xfc\x69\x93\x01\x3f\x3b\x9b\x93\x89\xba\x3b\x24\x03\x4e\x41\x27\x92\xd5\x6d\xaf\x54\xc5\x55\x16\xc6\x3d\x29\xc7\xad\x4d\xa0\xfc\x51\xad\x22\x11\xfa\x6f\xf4\xfb\x32\xc2\x7e\xf3\x55\x8e\xbe\xdc\x70\x43\x89\xf5\xd3\x3f\xe7\xf3\x7e\x00\xc5\x8d\x12\x94\xc4\x2c\x9f\x97\x9b\xe5\xec\xd1\x69\xe1\x8f\x45\xb1\x40\xb0\x54\x28\xdf\x4a\x26\x6d\xcd\x41\x20\x22\x98\x61\x44\xfa\x2d\x8e\xfb\xcd\xb1\x6a\x33\xec\x15\x7e\x96\xbb\x6e\xdd\x17\x01\x97\xf4\x74\x40\xeb\x4d\xe5\x95\x92\xcf\xc8\xc0\xd1\xc2\x2c\x42\x4c\xa9\x4b\xff\x1d\xf1\xad\x1c\x88\x3d\x0c\x9f\x9a\x88\x52\xa6\xb5\xbf\x05\x67\xd1\x4f\x10\x91\x0e\xbc\x86\xc2\x3d\xd4\xfd\x77\x51\x9c\x25\x5d\xac\x8e\xcc\x5f\xb8\x3e\xca\x9e\x62\x15\x88\x38\x4c\x94\xb5\x17\x75\x80\x8c\xe1\x97\xc6\x3a\xa6\x4c\x9a\x00\x6d\x37\x8b\xcd\xf0\x56\x25\x09\xa3\xd4\xa6\xbd\x17\xfd\xe0\x7b\x74\xe5\x89\xb4\x2c\xcc\xfb\x0a\xa1\x79\x80\x6a\xdf\x65\x17\x22\x31\x81\xb5\x66\x5b\xce\x7f\x5f\x6c\xfa\x1e\x7f\x20\x52\xce\x88\x70\xbb\x77\x26\xda\xa3\x07\x91\xc5\x92\xda\xa3\xbf\xbf\xcc\x9f\x5e\x7c\x26\x2b\x32\x1d\x58\x0b\xc3\xc7\xd9\x7a\xfd\x67\x7f\x02\x08\xae\x19\x05\x6c\x1d\xe9\x0a\x75\xdf\x89\xa3\x6f\xd7\x03\x42\x04\x86\x36\x1d\x57\x19\x59\x1f\x68\x13\x74\x6d\xd8\x51\xc1\x73\xf8\x6b\x45\xc4\x6d\xcf\xd2\xd5\x62\xaf\x1a\x49\x80\x10\xb1\xb1\x6b\xbb\xd6\xdf\x73\x8d\xe5\x7d\xaf\x0c\x78\xe5\xe4\x12\xe9\x13\x8e\xaf\xb6\xee\x23\xfc\xff\x2b\x50\x83\x68\xc3\x8b\xb3\xca\xcf\x7d\x47\x51\x6c\x8f\x58\xcf\x2a\xd2\xa6\x53\x1d\xde\x8f\xfb\xc3\x90\x51\x05\x8e\x4a\x51\xae\xdb\x74\x29\xc7\x06\x02\x10\x08\x2a\x4c\xc0\xef\x81\x71\x10\x08\xc9\x24\x81\x42\xf2\xda\xc9\x29\xf9\xbf\x87\x29\x45\x27\x1a\x55\xa9\x71\xe8\xd9\x74\xe5\x77\xc8\x8c\x19\xfb\x91\xba\xa9\xca\x13\xad\xf4\x97\x36\x9c\x20\x24\x46\x7e\x89\xbe\x83\xba\x21\xb6\x64\xf7\xb5\xc6\xbe\xea\xf2\xcc\xd2\xed\x5e\x0c\x15\x27\xc4\xc6\x6e\x27\xca\xe2\xed\xad\x5e\xea\xf3\x21\x00\x79\x56\xe4\xb8\xc7\x82\x8d\xde\x1a\x9d\xc6\x8a\xdb\x90\x71\x97\x2b\x5a\xce\xdc\x45\xf9\x53\x68\x13\x50\xdd\x8b\x4a\xc5\xaf\x90\xff\xad\x7a\xbf\xfb\x1c\x46\x48\x66\x4a\xf4\x10\x6e\x8e\xa7\xf9\xb1\x7b\xd7\x4d\x90\xfd\xff\x9c\xbd\x5b\x77\xa3\x38\xba\x3f\xfc\x75\xea\x62\x5f\x00\x42\x42\x5c\x3a\x8e\x53\xe5\x7f\xe7\x34\xb6\xd3\xd5\x33\xb3\xf6\xf2\xd2\xe1\x91\xc3\x04\x83\x07\x70\x52\xe9\x4f\xff\x2e\x1e\x49\x9c\x8c\xd3\xbd\xdf\xab\xea\x0e\x32\xc6\x20\xa4\xe7\xf0\x3b\xe0\x8c\x95\xe7\xcf\xb5\xb2\xf8\xdb\xb0\x3b\xc6\xac\x8f\xde\xb6\xa9\xb2\x63\xbb\x6e\x76\x07\x84\xf0\x64\x72\xcb\x28\x9d\x45\x8f\x8b\x20\x8a\x10\x81\xfe\x22\xd4\xf0\x95\x12\x41\xa4\xa9\x03\xae\xee\xcd\x74\x6f\x17\x01\x15\x92\x79\x79\x7e\xc8\xf3\xdd\x47\x39\xba\xc7\x22\x4c\xa9\x6d\x95\x14\x0d\x54\xd5\xf9\x64\x35\x60\xca\x3e\x4e\x16\x11\xb3\x34\x4d\x5f\x7a\x59\xd4\xce\x0f\x60\x5a\x5f\x16\x84\xa6\x18\xb9\x17\xf0\x31\x8a\x32\x47\xc2\x16\xe8\x4a\x84\x58\x8d\xc5\x59\xb7\xa1\xde\xe8\xd7\x10\x11\x04\x76\xdf\x1a\x92\x55\x85\x88\x49\x90\x38\x96\xce\x20\xd1\x10\x71\x0c\xa6\xd7\x8d\x7f\x14\x47\xd0\x96\x66\xaf\x2e\xe8\x89\xfd\x3b\x2f\xe2\x34\xc2\x18\xeb\x3b\x34\x83\xaf\xa0\x09\x20\xa5\x02\xaf\xe7\x5e\xc8\xaf\x8b\xaa\x82\x72\xa9\xad\xd6\xef\x02\xda\x38\x67\xd9\xce\xfe\x91\xc7\x81\x10\x54\x52\xea\x7a\xba\x07\xd8\x7d\x94\x03\xcd\x58\x21\xa8\x4a\x02\x57\x89\xbc\x5d\xac\x27\xb7\x92\x41\x84\x72\x7b\xaf\xa2\x7e\x2a\xa0\x8d\x3c\x26\xd0\x10\x91\x30\x7b\x6e\x6b\x17\x37\x74\x95\x11\x22\x01\x8a\x09\x82\x3e\x17\x07\x28\x8b\xdb\x89\x88\x87\xc0\x90\xda\x69\x07\x5b\xa9\x6b\x91\x55\x97\xf5\x8c\xf1\x04\xe4\x8c\x24\x41\x97\x20\xff\xb1\x7e\xbe\xdb\x3e\xe3\xcb\xf5\x1b\x7c\x8e\xc2\x44\x21\x13\xbb\x2d\x74\xe6\x56\x3e\xe9\x1b\x3c\x03\x99\x0a\xfb\x03\x11\xf1\x34\x2c\x8d\x08\x29\x8c\x69\x6f\xcc\xcf\x57\xaf\x52\xe7\x8f\x28\xc2\xf1\xa5\x16\x5a\xf7\xa5\xbb\xfe\xa6\x29\x1d\x60\xb9\x03\xb7\xe7\x47\xf8\xb0\x28\xf7\xc9\x7b\xa4\xa9\xa5\x05\x5b\xdf\xfa\x6a\x20\x03\xe7\x07\x70\x69\xf5\xf3\x45\xae\xce\xb9\x68\xe0\x58\x56\x4d\x06\x35\x4c\x84\x67\x84\xd0\xc2\x5a\xe0\x0f\x64\x3a\x8a\xe6\x12\x87\x27\xb4\xb2\x58\x70\x47\x9c\xfd\x5e\xc1\xa7\xf5\x92\x3b\x4f\x94\x2f\x84\xd0\x5a\xdb\x84\xc9\x99\x55\x7c\xcf\xde\xfb\x9f\x0f\x24\x76\x9d\x74\x5b\x80\xb7\x7b\xe0\xb4\x7c\x25\x0c\xb1\xaf\x21\xde\x86\xbd\x27\xe5\x8c\x07\xc9\x80\x01\xb8\x67\x34\x1f\x32\xc8\x80\x5b\x69\x08\x91\xcb\x72\xac\x4d\x23\x64\x18\x44\x38\xf9\x1a\xef\x86\xba\x2e\x9c\x01\x8e\x1f\x10\x49\xdc\xa9\xac\x58\x4e\x73\x0b\xef\x7d\xe5\x4a\x46\x8c\xfb\x6a\xb1\x47\x08\x6f\xdb\xff\xac\x9b\x75\xb1\x68\x9a\x72\x28\xf7\x2d\x64\x94\x04\xf8\xab\x5f\x0a\xf1\x95\xb9\xb0\x90\x51\x4a\xf0\xa2\xfc\xc6\xec\x04\x40\x3d\xef\x7d\x46\x8e\xfb\xff\x94\x9a\x49\x12\x70\x2c\x5c\x1d\x5c\x84\x77\x57\x56\x9e\xa5\xe5\xaf\x95\x08\xa6\x9c\xac\xd1\xb3\x68\x7f\x78\x7d\xe7\x04\xe8\x26\x1e\xd7\x42\x12\x45\xb1\xe6\x26\xbd\x28\xa2\xcd\x8f\xc3\x49\x55\x57\x12\x1d\xa0\x68\x84\x0d\x16\xb0\x8f\x79\xf1\xa6\xfa\x48\x56\xc6\x4c\x63\xf9\xad\x42\x57\x54\x91\xa3\x24\xc0\xd2\x4f\xe4\x2b\x0f\x9a\x86\x02\xb1\x5b\xf2\xfc\xb9\x7a\x7e\xf1\x3f\x85\xa6\x2c\x74\x38\x6d\xd4\x14\xb7\x70\xe3\xf2\x63\xa8\xed\x24\x24\x55\x54\xba\x37\xf2\x5c\x5f\xb7\xa1\xf4\xa3\xb5\x85\x82\x0c\x88\xa0\xee\x08\xe3\x21\x02\x2b\xfd\x26\xb3\x6a\x5e\x2f\xb6\xe3\x51\xec\x29\x13\x42\x04\x19\xba\xb5\xa1\x5c\xfe\x64\xd7\x94\x89\xb6\x00\x3a\x61\xd3\xe9\xaf\x5a\x56\x92\x33\xab\xf5\xdb\xbd\xf8\x9b\xd2\x61\xe5\xa7\x50\xf2\xe9\x07\xa5\x42\x32\xc7\xbe\x1e\xa8\xed\x0e\x48\xae\x33\xa9\xac\xe4\xc6\x20\x6e\x64\x6f\xdd\x4d\xff\x1c\x16\xfc\x65\xca\x6c\x2b\xe9\x66\x7b\x7b\xd3\xfd\x2d\x09\x85\xec\x2a\xab\xa3\xaa\xa1\x94\x81\x14\xe9\xd0\x94\xc2\xbe\x75\xed\x9a\xeb\xb7\x71\x29\xc3\x00\xac\x07\x64\x76\xda\x9e\x60\x70\x20\x09\x31\xaf\xfb\xa7\x4f\xd6\xce\x7f\x05\x8a\x91\xca\x79\xf7\xec\xca\x53\x03\xca\x07\xec\x52\xc7\x41\xea\x84\xc0\x8f\xa7\xda\xf9\x83\x0e\x97\x76\x09\x9c\xd8\x04\xb0\x23\xc7\x0e\xd7\x77\x09\x12\x30\x6b\xbd\x2f\x0f\x5b\x68\x9c\xd5\x6d\x0f\xfa\xb2\xa3\x54\x18\x68\xec\xac\xb4\x31\x0d\xe6\x33\xaf\x50\xed\x5e\x45\xf1\x54\xad\xfe\x7b\xf6\x36\x4d\xed\x30\x2b\xe7\xd5\xee\x42\xd9\x2f\xc8\x2f\x88\xc9\x42\x85\x71\x84\x65\xcc\xf6\x4c\xab\x6e\xc5\x51\x11\x15\x88\xe0\xf4\x2b\xc7\x6d\x75\x3e\xf5\xe7\x8d\x28\xa4\x16\xc8\x88\xc1\x8d\x6b\x25\x20\xcc\xe1\xd2\x90\xdd\x3e\x26\x8b\xfe\x49\xa3\x61\x0d\x55\x11\x22\x07\x9e\x37\xbb\x4a\x4c\x1c\x07\x84\x22\xa9\x35\xcd\xf9\x0e\xb9\x68\xca\x01\x4c\x47\x11\xad\x61\x28\xeb\x7e\x07\x93\x86\x99\x8a\x59\x94\x06\x1e\x36\x6f\x31\xea\x43\x0c\xe1\xe8\x79\xaa\x38\xa1\x2e\x47\xd5\x00\xc7\x0b\x10\x4f\xff\xbe\xab\x38\x49\x91\xa3\x6a\x9c\xb4\xf8\x16\xfa\xfd\x49\x51\x9e\x4a\x27\x20\xfb\xff\x4a\xec\xd4\x5f\x14\x9b\x14\xe5\x1a\x99\x13\x6f\xd9\xb1\x76\x58\x8d\xee\xe3\x2a\x65\xc6\x3d\x8d\x7d\xbc\xaf\xcb\x23\xf4\xda\xe4\x42\xb1\x10\x10\x48\xd3\x1e\xbe\xc9\x4b\x69\x3f\xdd\x1d\xe5\x02\x97\x2b\xab\xbc\xf3\xbd\xcc\xf5\x08\x68\xa0\x12\x08\x11\xa9\xe4\x3c\x3b\x41\x2f\xf2\x1c\x69\x06\xb3\x6b\x81\xe2\x6d\x42\x64\x4d\xfe\x8e\x03\x84\x81\xe2\x42\xc4\xe0\xdb\x31\xe5\x47\x07\x8e\x50\x69\xc8\x31\x9a\xc3\xbd\x6b\x03\xd9\x4c\x2f\x47\xb5\x2b\xaa\xab\x5b\x3c\x99\x65\x79\xec\x93\x70\x95\x26\x14\x41\x06\x2f\xaa\x7d\xcc\xb8\xd6\x5a\x85\xb7\x79\xa5\x01\xa1\x52\x63\x53\x8d\xa3\x13\x59\x56\x03\xa4\x9c\x1b\x22\x82\x00\x83\xe3\x77\x51\x65\x88\x53\x1f\x9f\x41\x84\x11\xea\xca\x38\x23\x07\x64\x97\x6d\x4f\xa0\xb2\x01\xbd\x66\xf0\xe4\x65\x94\x78\x53\x99\x47\xf8\xe5\x65\x22\xe7\xb7\x62\x25\x93\x20\xf1\xad\x8e\x76\x17\x7c\xf6\xea\x1a\xe3\x4b\x90\x86\x81\x15\xc7\x30\x02\x6f\x5c\x1f\x24\x28\x15\x31\x94\xbc\x74\xbd\xd1\x61\x4d\x45\xa9\x38\xe1\xa2\x17\x52\x82\xa2\x79\x40\x83\xcd\x4b\x3b\x83\xf1\x0b\xa5\x68\x82\xbb\xd5\xe2\xfb\xea\x71\xf9\x4f\x1b\x34\xef\x97\x8b\x67\x7f\x5e\xcd\x23\xd4\xea\xbf\x5f\xfd\xf6\x6d\x56\x64\x79\xb8\x84\x2b\x08\x22\xdc\x81\x36\xe2\xd4\x94\x55\xfd\x5e\xff\xcc\xfe\x14\x95\xae\xe3\x88\xfa\x13\x42\xac\xb1\xae\x2d\xb3\xc3\x08\x6c\xac\x80\x73\x94\x16\xaa\x40\xe4\x58\xeb\xb6\xb1\xaa\x37\x56\x1e\xfc\x9f\x0b\x1c\xba\xdf\x60\x58\xcc\xa9\xd3\xdf\x73\x88\xc3\x76\x05\x10\xf9\x5d\x55\x1e\xed\x5d\x9a\x7d\xc7\x8d\x0e\x10\x43\xef\x6c\xc4\x87\x78\xa8\xf1\xc3\xd3\x01\xb3\xaa\x6e\xa7\x0a\x4e\x62\xa6\x41\x34\xfb\xc6\xe8\x30\xb4\xb0\xb4\x5d\x95\x8d\x82\x76\x1d\x09\x6d\x09\x3c\x4d\x79\x72\x7e\x1d\xfe\x10\x0d\x28\x72\x87\x6b\x61\x00\x3b\x8a\xf3\x93\x5d\x53\xc7\x24\x7a\x78\x59\x0f\x38\x10\x9a\x05\x56\xf3\xf4\x7e\xf5\xc7\x7a\xda\xd2\xd0\x2c\xb0\x0a\xbf\x7b\xb7\xf5\x2f\x07\x1b\xc9\xe4\xf4\x2c\xb4\x0a\xa8\x88\xdc\x40\x55\x43\xb7\xf5\x58\xcd\xe7\x41\xbc\xa3\x19\xb3\xca\x09\x30\xf4\x69\xaa\xef\x4b\xd1\xf9\xeb\x09\x9d\xf0\x10\x97\xc1\x67\x28\x8a\xcf\xef\x95\x90\xdd\x01\x15\xe2\xce\xa1\x44\x8e\x82\x48\xfe\xef\x3c\x89\xf1\x03\xae\xee\xfa\xd4\xfd\x40\x6e\x18\xba\x77\xf4\x70\xf8\xbd\x29\xab\xbd\x33\xfb\xa8\xfb\x61\xda\xb1\x37\xd1\x80\xe3\xf3\x28\xcb\x7c\xbc\x95\xe8\x94\x26\x18\xa2\x74\xe6\xe2\xfe\xb3\xa9\x09\xbd\x3a\x4e\x7b\x97\x7e\x94\x4d\xbb\x76\x7a\xd0\xe8\x70\x06\x69\x91\x04\xb8\x3b\xe7\x28\xaf\x33\xd6\x7f\x6f\x73\x21\x4b\x23\xc4\x4e\xb3\x8d\x65\xc7\xd1\x96\x1b\x27\x63\x1e\x47\x3d\xff\xee\x7c\xda\xff\x27\xab\x5f\xb3\xbf\x60\xa7\x6b\xc9\x48\x38\xbe\x15\xcf\xe7\xd3\xe9\xb3\x5d\x2d\x1f\x40\x67\x7d\x01\xdc\xc7\xc2\x5a\x6a\x83\x01\xd3\x36\x6b\x53\x0c\x4b\x16\x87\xa9\xce\xae\x1b\xab\x08\xc3\x72\x92\x2e\x01\x89\x28\x4f\x1f\xc5\x12\x72\xb8\xa8\x01\xb8\xe1\x9a\xc6\x38\x6f\x51\xe1\xbe\xfc\x28\x06\x2c\x20\xad\x99\xc5\x33\x60\x9f\xf9\x2c\x73\xf8\x0d\x94\x12\x6f\x11\x65\xdf\x26\x27\x11\xd6\x84\xbf\x0b\x37\xff\x0e\x4b\x5f\x9b\x48\x5a\x6d\x63\x54\x90\x1d\x18\x5b\xb4\x87\xec\x8b\x66\x05\x58\x67\x57\xc2\xd9\x0c\xe7\x82\xec\xad\x4d\x6c\x99\x4c\x18\x3c\x40\x3b\x5b\x06\xaf\x80\x61\x29\x6a\xdc\xec\xdd\x74\xfb\xef\x59\x54\xd0\x7b\x9f\x4d\xce\x05\x81\x73\xea\xdd\xa2\x03\x7e\xbb\x51\x15\x9d\xa9\x95\x7f\x56\x10\xc8\x18\xeb\x11\x96\xe0\x43\xdd\xee\xe9\x0f\xaa\x84\x27\x03\xd9\xbc\x32\x6f\x23\x99\x07\xf1\x0b\x63\xdd\xf5\xd1\x3b\xf0\xf5\x6c\x6e\x88\x48\x82\xc4\x06\xf8\xa5\xfa\xac\x15\x48\x64\x33\xfb\x76\x4b\x71\x6a\x9d\x90\xbd\x4f\x27\x03\x10\x61\x39\xd7\x1a\x93\xd6\x5e\xe9\x56\x00\xd1\xd6\xcd\xbf\xf3\xd0\xf9\x4a\x42\x5a\x40\xcc\x02\xb0\x92\x94\x6b\x14\xb0\xf1\xa7\x89\xb5\x91\xee\x07\x29\x51\xe9\x91\x6f\x9c\x1b\xc2\x88\x85\xc3\x22\xef\x96\xf9\x0f\x32\xc9\x00\x7a\xe1\x6e\x5b\x6c\xfa\xf9\x0a\xc5\xb3\x38\xd7\xd7\xd8\x4e\xc0\x54\x80\x37\x03\xd5\xfa\x1d\x8d\x7c\x8c\x2b\x07\xa6\x09\xe2\x47\x17\x59\xb5\xfd\x10\xa7\x2f\x7d\xd3\xdd\x47\x12\x12\x63\x78\xfd\x54\x40\x8e\x76\xad\xc3\x45\x1f\x92\x98\x88\x21\x5e\x6b\x8f\xdb\xfb\x5e\x14\x7a\x0f\x5d\x85\x1f\x12\x99\xe0\x3c\xfb\x8f\x85\x5a\x6d\x8f\x22\xcf\xfb\x63\x1c\xfb\x5f\x05\x7c\x8c\x27\xf4\x70\x4d\x82\x04\x0c\x56\xba\xff\xb1\xde\xfe\x58\x3d\x7e\xff\x42\xf3\x4a\x00\x8f\x53\x8c\xdd\x3c\x58\x7d\x57\x9e\x9c\x18\x7d\xef\x31\xda\x4d\x73\xe0\x89\x75\xd2\x71\x06\x83\x03\x5c\x1d\x70\x21\xb9\x43\xfa\x3d\x66\xea\x6d\xa8\xd2\xe8\x47\x18\x85\x53\x56\xe8\x0b\xdb\xb4\x8b\xe2\xc3\xe8\x1a\xd3\xc4\xda\x37\xd8\xa0\xec\xf1\xf2\xcc\xa9\x01\x66\xe5\xc8\x9a\x27\x63\x6e\x32\xdd\x01\x85\x41\xc4\x3a\x30\x9d\x74\xda\x16\xa6\x5d\x70\x10\x94\x62\xd8\x24\xce\x3a\x6b\x2c\x3f\xeb\xeb\xd5\x06\x64\x18\x08\x5f\x3e\x76\x2b\xa8\xff\x36\xa9\x24\xef\x4d\x06\x4d\xd6\x3c\x43\x85\x6d\x66\x3f\x40\x45\x0a\x23\xee\xed\x59\xd6\x23\x6b\x40\x7f\x1c\x02\xc4\x64\x3d\x6f\x56\xd6\x6f\x7a\xf5\x78\x3b\xd4\xc3\x01\x1d\x04\xe8\x6d\xb5\xb7\xae\x5a\x4f\x05\x6c\x21\x9f\x14\xbb\x40\x73\xc0\x41\xdf\xb3\xc3\xac\x23\xf0\x30\x7b\x9d\xd2\x17\x40\x83\xa5\xe7\x66\x85\xca\xcf\x1a\xea\xe9\xb9\x0d\xc5\xad\x0a\x2a\x65\x05\x47\xdb\xad\xcd\x5f\x1d\x10\x83\x45\xe4\xe7\x8d\xd5\x9b\xb8\x5f\x3f\xac\x77\xfe\xa0\x71\x1e\x43\xb7\xab\xe5\xfa\x61\x71\x7f\x61\xa5\x2d\xc0\x28\xc0\xfc\x1f\x37\x51\x0c\x06\xba\xc2\x82\x8b\x2f\x4d\x18\x26\x58\x9a\x5f\x8a\x73\xae\xab\xb2\xa8\x1f\xb2\x22\x3b\x88\xa3\x77\x3d\xf3\x02\x1c\xa3\x8b\x36\x51\x98\x08\xab\x9a\xf5\xcb\x96\x76\xdd\x6c\xff\x36\x19\xc6\x8c\x8a\xbc\x5c\xee\xea\xd7\x29\xab\x3c\x19\xdd\x0f\x50\x29\x66\x0f\x85\x47\xc9\xba\x8a\xa4\x5f\x4d\x0d\x09\x35\xf6\x4f\xbe\x43\xd3\x2e\x6e\xab\x02\xc1\x23\xc8\xcf\x1e\x4e\x69\x43\xa2\x28\x72\x85\x9a\x3d\xf6\x4c\xc6\x33\xda\x10\x26\xb0\xb4\x9f\x5b\xf5\xc8\x49\xe4\x3e\x9e\x90\x86\xa4\x29\x32\x95\xf7\x59\xf1\x50\x16\x70\x61\xe1\xe1\x86\xc5\x09\x13\xae\x8f\xb6\x3a\x1c\xac\x40\xd5\xcc\xe6\x64\xe2\x44\x29\xf7\x9e\x62\x77\x04\x77\x60\x9f\xda\xcc\xab\x48\xf9\x4f\x72\xc5\xa9\x2f\xb2\x3a\xcd\x89\x36\x07\x9b\x20\x0f\x0c\x0d\x14\x75\x10\xb5\xdb\xac\x96\xe7\xaa\x46\x5c\xb0\xcb\x06\x26\x63\x43\x86\x28\x1c\xcb\xdb\x39\x57\xc5\xb5\x25\xdd\xd0\x28\xc0\x52\xe7\x09\x39\x2d\x64\x8a\xd7\x31\x34\x62\x1e\x46\x86\x60\x5b\xff\x67\xad\x51\x60\xa8\xab\x39\xa2\xaf\xcd\x05\x2f\xcf\xb0\x88\x07\xae\x8c\x79\x9f\x29\x28\x6a\x18\xe2\xfc\x0d\x93\x2c\x70\xca\xbf\xc7\x2d\x38\x77\x59\x7f\x30\x09\x19\xe2\xe8\x86\x50\x8b\xbf\xb5\xf6\x99\x24\xe9\x22\xc3\x55\x4a\xa6\xcd\xa3\xf1\x15\xf2\xc8\x60\x37\xec\x3d\x83\x0f\x0f\x37\xf6\x54\x67\x7f\x25\x9c\x52\xd4\xfc\x71\x90\xdf\x2b\xb7\x92\x73\x4b\xef\x68\xa7\xb1\x68\x32\xb0\xee\xfb\x57\xbe\x55\x85\xb8\x80\xae\x8b\xcc\xd7\x7d\xda\xc1\x29\x0b\x81\xa6\x44\x12\x96\x46\x81\x48\x58\xa2\x85\x4e\xa8\x49\x8d\x16\x41\x92\x44\x24\x22\xa1\x4e\x65\x92\x5c\xb9\x82\x34\xe9\xc2\x81\x1b\x21\x3f\xbf\xbb\x34\x79\xec\x3c\x2b\x8c\x60\x76\x35\x5a\x64\xd5\xf2\x6f\x09\x18\x18\x21\x38\xde\x24\x94\x66\x32\xe7\x42\x3b\xf9\xbc\x27\x63\xdf\x08\x37\x4c\xd1\x38\x70\x0a\x5f\xfb\xfa\x52\xa0\xd3\x8f\x52\x29\x75\x3a\x9b\xcb\xe5\x0f\x2b\x04\x16\x85\xdd\x39\x94\x41\xf3\xf6\x4e\xa0\xe3\x0a\x03\xd1\x33\x80\xba\x35\xd8\xe8\x80\x0b\xef\x1b\x35\xa0\x74\x5d\x27\xab\x1b\x9d\x32\x3d\x74\x1e\xbe\x2b\xab\xdd\x6b\x05\x30\xc0\xe7\x18\x20\x10\xba\x17\xc0\x15\x43\xb1\x61\xd4\x4e\x95\xba\x7f\x4d\x80\x32\xab\xa8\x29\xaa\xb7\x0d\x88\xc9\x7e\x69\x0c\xb1\x70\x8f\x83\x25\xfd\x6e\x9b\xce\xcb\x5e\x18\x23\xb8\xb7\x96\xf0\xf5\xb5\xe7\x2a\x7b\x9f\x9e\x41\xe9\x04\x06\x3a\x8d\x58\x7b\xca\x06\xb5\x98\x2f\x7b\xcd\x32\x08\xa8\x40\x5c\xbc\xb0\xf9\xe8\x9f\x50\x3d\x79\x0d\x0e\x19\x04\xc6\x3a\x92\xb5\x9b\xf3\x8f\xcf\x53\xd9\xbc\x42\xed\x8d\xc5\x65\x10\x3a\x23\x28\xac\xa6\x65\x45\x0d\x55\x83\xc8\xb8\x9f\x59\xf3\xfa\xa3\x83\x03\xc9\x20\x4a\x64\xec\x3d\x32\xce\x9f\xcf\xce\xcb\x78\xd6\x98\x47\x06\x84\x84\xcc\xf8\x75\xa5\x97\x1c\x90\x41\x1c\x4b\x8f\x6d\x6d\x5f\xb7\xad\x7a\x85\x2b\xcf\x4f\x06\x31\x0f\x10\x1e\xe4\x4d\x02\x1e\x4a\x8d\x82\x3d\xa3\x1e\x93\x0c\x62\x11\x13\xd4\xcc\x71\x89\xa6\xfd\xc2\x7a\xad\x4a\x3f\x82\x32\x5b\xa4\x5b\x3f\x0f\x56\x20\x19\x50\x01\xd8\x7e\xfc\x99\x15\x0f\xa2\xa9\xb2\x5f\xdd\x01\x45\x53\x27\xba\x84\xa0\x8b\xf9\xcb\xa3\x20\xb0\xce\x88\x1e\xb0\xcf\xae\x06\xe2\x8e\xb1\x30\xe2\xde\x0a\xf3\x1e\x4c\x53\xbe\xc3\xd0\x5f\x88\xfb\x61\xa0\x88\xec\xe8\x10\x98\x73\x5a\x54\xd8\x5a\xd7\x37\x9f\x56\x4a\x75\x3d\xee\xc8\xc9\x20\x09\xad\xd6\xc0\xee\xe9\x5f\xa3\x9f\x93\x10\x85\x61\xc0\x1f\xdf\x57\xe3\xbf\xb3\x48\x3a\x14\xc9\x19\x9d\xd4\x06\x2e\xcf\xdd\x10\xc0\x37\x45\x8b\x46\x6c\xcb\x73\x35\x38\x62\x94\xb2\xd0\x8a\xe2\x6d\x7d\x3c\xb5\xf1\xe9\x60\xe9\x90\x01\x8f\x82\xc0\x45\x77\x1d\x6d\x7d\x72\x72\xce\x4d\x12\xf4\x3c\xe6\x7b\x10\x63\x91\x42\x19\x70\x6d\x0b\xba\x15\x74\xb3\x4d\x84\x41\xd4\xe9\xce\x82\xce\xae\x6b\xd7\xcb\x40\x50\xdb\xcc\x42\x14\xf1\xb3\xa8\x9a\x02\xaa\x61\x51\x57\x06\x82\x71\x07\x40\xb1\x8a\x70\x0f\x59\xd1\x5c\x53\x85\x73\x1f\x91\x69\xc0\x3a\xc7\x41\x2c\xb3\xe9\x19\xe3\x32\x19\x48\x11\x22\x67\xaa\xef\x54\x58\xc1\x06\xff\xd5\x2a\x89\xb4\x85\xd1\x6c\x40\x65\xa7\x76\xdf\x58\x58\xec\xf1\x5c\x2e\x28\x03\x25\xad\x06\x6a\xaf\x37\x3d\xb7\xcc\xca\x40\x93\x08\xf7\xd6\xbb\x2a\x83\x42\xd7\x7d\xd1\x5f\x06\x5a\x26\x06\xba\x59\x65\xb5\x8c\xb7\xe7\x63\xcf\x82\xe9\xc6\x59\x02\xfb\x51\x14\x67\x91\x3b\x51\x99\x2b\xb7\x43\xab\xd8\xe9\x6f\x2c\x66\xfc\x44\x65\x00\x11\x45\xd4\x7c\x59\x38\x59\x87\xec\xcf\xfe\x1e\x00\xb1\xd8\xb3\x9b\xe5\xcf\x2f\x12\x2f\x19\x80\x30\x18\xe1\xd5\x4d\x79\xda\x97\xd5\xbe\x82\xfa\x7c\x84\x7d\x97\x19\x75\xbb\x81\x0c\x0c\x25\x48\x3c\x59\xbe\x8a\xea\x00\x8f\x30\xf0\x56\x94\x81\x49\x6c\x9b\xeb\x54\x95\xbf\xc6\xb5\x3c\x3e\xe8\xac\xc8\xc0\x08\xdb\x65\x72\x21\xc8\x57\x11\x88\xff\x84\x0a\x11\x1f\x6a\x7d\xbc\x96\xaf\x6d\xce\x37\xb5\xff\x95\x61\x90\x98\xc4\xca\x6b\x94\x15\xbc\xa0\x30\xd6\xc8\x0b\xe8\x5a\x94\x33\x8c\x77\x65\x18\xf6\x2a\x8f\xcf\x56\xf6\x6c\x7b\x3e\xde\x7c\x8e\x88\x10\xe3\xc9\x13\x86\x3c\x45\xf9\x22\x5b\xb0\x5e\x2f\x9f\xc2\x61\xba\x21\xc3\xc8\x05\x64\x4a\x14\x37\xe7\xcf\x19\xc3\x33\x19\x92\xc0\x1a\xcd\xd7\xe0\xc4\x31\x2e\x32\xbf\xe1\x23\x0b\x49\x28\x91\x2a\xba\xaf\x4f\x79\xd6\x4c\xcf\xc5\x94\xdf\x05\x6c\xa1\x1a\xaf\xfd\xe2\x1b\x13\xca\x5c\x91\xfe\x2e\xab\xea\xe6\xa6\xac\xaa\xf2\xa3\x37\x1e\x98\x7d\x4f\xc2\x58\xd9\x8a\xb9\x25\x0f\xdf\x97\xea\xad\x6f\xaa\x4d\xb5\xb2\xfe\xaa\x9d\x3f\x62\xd9\xbb\xf3\x33\x46\x55\x4f\xf3\xc0\x7a\xf9\x33\x54\xc8\xc0\x99\xdf\xf3\x42\xc6\x19\x42\xa8\x9c\xeb\xc0\xaa\x71\xd2\xbe\xdd\x7b\x10\x26\x34\xa5\x66\x00\x5a\x1a\xf5\xf2\xe6\xaf\x66\xc2\xfd\x97\x21\x0f\x81\xba\x90\xfb\xa9\xdf\x54\xfc\xc1\x14\xb0\x4e\xb2\x7a\xd9\x0c\x45\x34\x65\xc8\x4d\x4a\x23\xb7\xc9\x07\x61\xff\x57\x83\xce\xd6\x03\xb5\xb7\xf6\x02\x46\xff\xb8\xa1\x29\x15\x89\xed\xfd\x67\xb9\xf6\x8e\x46\x93\x07\x99\x1a\x26\x48\x87\x40\xd8\x20\xb4\x60\x92\xc5\xc9\x50\x24\x02\xaf\xdf\x22\x45\xbd\xad\x83\xbf\x22\xc9\x2c\x8e\x34\x2b\xb2\x66\x25\xd4\xeb\xf3\xcb\xb6\x9b\xbc\x2a\xa4\xd8\x11\xb4\xa8\x8f\xbb\xb2\x9a\x64\x9a\x32\x54\x4c\xf8\x92\xea\x4b\x56\x34\xa8\x02\x4c\xba\x83\x4a\xc5\x2e\x7a\xbe\xdd\xee\x7a\xbf\x07\x19\x6a\x26\x30\xfe\xdf\x3f\xdf\xbf\xec\x9e\x46\xd7\xa3\x53\x6a\xfc\x0c\x2e\x3f\x26\xbf\x57\x8b\x50\x0c\xcc\x2b\x5e\x47\xe5\xcd\x8b\x6d\x2a\x04\xaa\x9d\x21\xd2\x7f\x40\x35\x0f\xa2\xf8\x9c\x94\xa2\x65\x08\x86\xa3\xf8\x66\x17\xc6\xe9\x1b\xcb\x23\x9f\x7f\x07\x4c\x64\xb0\x4d\x75\xaa\x60\xf7\xdd\x95\x43\x64\x14\x38\x11\x6b\x8b\xbf\x2e\x34\xb2\x4f\xed\xaa\xd1\x2f\xa0\x51\x40\x43\x63\x2b\x36\x47\x5b\xc6\xab\x9d\xee\xc1\xb8\x70\x22\xa3\x80\x27\x58\xc3\xd6\x90\xc3\x41\x34\xbd\x62\xd7\x5f\xa1\x64\xdc\xe7\xa3\x30\x42\x9e\x93\x29\x2b\x99\xe9\xdb\xac\x02\xd5\xdc\x82\xf4\x4d\x3a\x19\x11\x65\x91\xb5\x0b\x05\x07\xb7\x28\xf9\x43\x94\x5b\xc7\x6c\x1f\xc1\x4f\xcd\xa8\xfc\x30\x1d\x60\x5f\xe3\xf9\x69\x3b\xe8\x59\xc8\x88\x19\x81\x2b\x0b\xfa\xff\x6c\x1b\x38\xf9\x99\x1f\x25\x51\x12\x7b\x5b\x83\xe7\x73\x17\xb7\x45\x89\xe2\x8e\xf1\x8a\xf1\xbf\xa3\x20\xe2\xb2\xe4\xd8\x9b\x3d\xaa\x10\x47\x63\x58\xd1\x88\x37\xb8\xb9\xc0\xa5\xb6\xc7\x2d\x69\x1d\x57\x8d\xda\x56\xbf\xba\x63\x90\x58\x82\x96\x29\x2b\xa4\x5b\x5c\xae\x8c\x11\xa7\x29\x4a\xbd\x40\xad\xc4\x09\xae\x8b\x32\xcb\x88\xa7\x1c\xab\x07\x0f\xa5\x37\xb2\xf4\xdf\x93\xea\x04\x0b\x9f\x1f\x90\x0d\x69\x4d\x32\x12\x3c\x41\x5c\x51\x51\x36\xeb\xa2\x2f\xb4\x8f\x97\x9b\x48\x28\xc0\xc9\x94\x63\xa3\x66\xaa\x62\xe7\x07\x01\x4f\xd3\xee\xc5\x7f\x28\xf5\x39\x87\x0b\xcc\x5a\x3b\x2c\x65\xce\xb9\x68\xae\x71\xed\x46\x49\xcd\x03\x8b\x97\xac\xcf\xb0\x68\xda\x30\xfe\xeb\x09\x26\xc1\xa6\xef\xbe\x90\x50\x81\x5e\x34\x36\xfe\xb3\x6a\xcf\xe3\x8b\x95\x86\x60\x90\x71\x73\xff\xe0\x6f\x85\x8e\x18\xaa\x91\x3e\x7d\x3c\x61\x8f\x75\x74\x03\x35\xb5\xb0\xf7\x1a\x9a\xc5\x78\x2d\x8b\x74\x4a\x90\x6f\x9b\x97\x42\x8f\x25\x35\xae\x65\xb5\xb3\xef\x71\xa4\xa5\xcd\x24\xb0\x0b\xee\x54\x49\xfb\xb0\x7f\xb4\xe1\x46\x10\x07\x48\x55\xbb\x5f\xff\x6b\x61\xaf\xf3\xb2\x01\xcd\x27\x77\xc8\x84\x21\x06\xe9\x75\xe1\x1b\x23\xb9\x2f\x52\x4b\x12\x44\x22\x64\x7e\x59\x1d\x59\xe4\x4b\x12\x0a\xa9\x45\x9f\xd8\xde\x42\x23\xb2\x7c\x32\x4b\x49\xa8\x28\x56\x08\x37\xab\xed\x6a\xf3\xfb\xea\xd6\xb3\x35\x9e\x9e\x57\x96\x65\xba\xb8\xdf\xaf\xfe\x78\x5e\x3d\x6e\x57\x5b\x7f\xe2\x88\x87\x28\x7e\xf0\xde\x3e\xa0\x5d\x79\x03\xdb\x4e\xd3\x5e\x12\x12\xd2\x44\x8c\xe5\x5e\xbb\xd0\x75\x86\x65\x28\x09\x11\x31\x8a\xaa\xb4\x33\x00\xd1\x62\x3e\x96\xf5\xc7\x75\x8c\x98\x8f\x12\xfb\x03\xd7\x32\xea\xd9\x37\x8b\xc4\x4c\x60\x3c\xd4\xae\x14\x0f\xe5\x3b\x3a\xda\xef\xaa\x73\xdd\x5d\x6d\xec\x0c\x35\x6b\x68\x50\x21\xe7\x4a\x3d\x6a\xfc\xc8\x49\x9c\x08\x01\x4e\xc3\x3d\x83\xf7\x61\x27\x5c\x12\x1a\x0b\xa4\xf8\xbf\xd5\x6a\x5d\xfc\x85\x86\xf5\x70\x72\x10\x9a\x24\xd4\x81\x79\xee\xe1\x20\xd4\xe7\xe3\xdd\x6e\x36\x7d\x20\xd4\x50\x1f\x9a\xb9\xba\x47\xfe\xb9\x39\x5b\x17\xb2\x5e\x53\x4a\x12\x16\xa4\x78\xeb\x46\xde\x27\xc8\x14\x75\x89\x56\x3d\x27\x60\xd4\xdf\x3e\x96\x1a\x31\x90\x12\x69\x97\x91\x7b\xa4\x73\x4c\xae\x87\x29\x89\xe2\x25\xab\xe6\x15\xda\xb1\x45\x1b\x30\x5b\x37\xeb\xf1\xc0\x24\x10\xde\x09\xfe\xb9\x82\xf7\xac\x3c\xd7\x8f\x1d\x0f\xc1\x8f\x51\x12\x0b\x07\xbf\x3f\x2d\x47\xdb\x39\xe1\x91\x45\x0f\x62\x19\xb7\x68\x9c\x51\xfd\xd7\x31\x3f\xe1\xd4\x20\x2a\x57\x9e\x3f\x9f\x8e\x70\x10\xab\xc3\xa1\x3b\x5f\x62\xdd\x0b\x84\xd6\xbb\xd2\x79\x2b\x54\x16\x65\x28\xb2\xab\x30\x52\xf7\xe1\x34\xd4\xf8\x56\xa2\x8a\x13\xa8\x4c\x74\xaf\x64\x4a\x24\x0a\xd5\xc0\x11\xaa\x03\x14\xea\xd3\x2b\x07\xf8\xe3\xb1\x56\x8e\x5e\xfc\x76\x83\x42\xe5\xc7\xe6\xda\x03\x48\x13\x8d\x62\xe8\x4f\xe7\xb1\x37\xd1\xf8\xae\xa6\xc6\xca\x69\x61\x1b\xb1\xcb\xc2\x89\xe0\xd6\xdb\x48\xe3\xae\xdd\x91\x48\xe6\xe2\xc4\x51\xb8\x48\x44\x1a\x62\x64\xd9\xde\x98\x0c\xaa\x7a\x58\xa8\x9c\x23\xbd\x4a\x22\x84\x09\x5c\x25\x7e\x53\xdb\x88\x64\x7e\xe6\x4a\x9a\x60\x79\xf3\x59\x7c\x3a\xe5\x05\x7f\xb5\x2a\x89\x3c\xcc\xda\x7d\x14\x8d\xa6\xba\xc3\xc2\xfa\x56\x58\x00\xf2\xcd\xe0\x7e\x6a\xc2\x34\x5c\x74\xd8\x27\xcb\x5c\xbb\x2d\x75\x45\xf7\x0d\x1c\xda\x81\x65\xb5\x85\xea\xbd\xab\x78\x4b\x02\x61\x80\x25\xd2\xe7\xcd\xaa\x0d\x44\x86\x24\x29\x49\x20\xb2\x4b\xf7\x21\x33\xcd\xa6\x54\x6f\xf3\x49\x1c\x81\x24\x88\x7b\xbf\xc7\x81\xfd\x97\x3f\xce\x95\x6d\x46\xd5\xab\xe6\xf5\x59\x7c\xf6\xa0\x02\x49\x40\x27\x28\xc6\x7b\xec\x2d\xf5\xfd\x11\xa3\xad\xdd\x75\x2e\xb2\xa3\x55\x8f\x9a\x9c\xd7\x44\x46\x77\x4c\xc1\x85\xd7\xb7\x9e\xc1\x66\x48\x62\xb8\x60\x89\x9f\xf7\xdb\xcf\x42\xdd\x4f\x79\x89\x92\x18\x6d\xc9\xb8\xbe\xef\x85\xf2\x03\xfe\x6a\x8c\x49\xfd\xf2\x73\x57\x56\xa0\x44\xdd\x8c\x2c\xc5\xfe\xe7\x02\x58\x26\xe3\x80\xd8\x40\x32\x17\xb5\x15\xe8\xde\x9b\xe4\x87\xa8\x5f\xf7\x6e\xec\x37\x3f\x0e\x80\x5b\x2b\xa9\x3c\x5f\x54\xb6\x30\x30\x40\x46\xc9\x38\x0c\x8d\xe2\x5d\xb1\x75\xc0\x61\x91\x71\x48\x74\xe4\x92\x84\xfb\xb3\x47\xf3\xc9\x38\x8c\x13\xec\x73\xbc\x8a\xfa\x36\xab\x55\x5e\xd6\xe7\x6a\x60\x8d\x37\x9a\x28\x71\xa8\xec\x3c\xab\xd1\xc9\xa8\x6a\xea\x45\xf3\xb2\x5b\x5e\x0c\x0a\x71\x51\xf1\x6a\xa6\xb7\x25\xd4\x8f\x65\xf3\x20\x1a\xd5\xe7\x97\xa3\x68\x23\x8e\x98\xc6\xe4\xe0\xfe\xe9\xfb\x1e\x51\xa4\x77\x22\xcb\x87\xe9\xee\xe8\xfe\xc7\x91\xb4\xfd\x3d\x5f\xf3\xda\x8a\x1c\xea\x29\x0e\x61\x7c\x51\x91\x49\x83\xd8\xc2\x6a\xef\x2a\x80\x3f\xb1\xd4\x9a\x8d\xa4\x33\xc6\x1f\x20\x89\x0e\x94\x2b\xed\x89\x0a\xee\xdb\xc7\x28\xf2\x5c\x8b\x46\x0c\x17\xe4\x38\x16\x14\x2c\x4b\xa5\xd0\x39\x6c\xb3\xe2\x90\xc3\xba\x81\x0b\x35\xd5\x2f\x81\xf5\x32\x8e\x4d\x8c\xfe\xff\x28\xc2\xe4\x13\xbb\x98\x2a\x82\xca\xee\xa2\xc6\x86\xf6\xa5\x7e\xa5\x8c\x59\xcc\xa4\xf1\xc0\x2d\x03\x95\xc8\xeb\x87\xac\xb0\xf9\xe3\x08\x0a\xd7\x8d\x4f\x30\x52\xed\xa8\x4c\x36\x1d\xb8\x72\x17\x18\x07\xed\x76\x95\x1f\xf8\x03\xab\x5d\x79\x01\xbd\x77\x63\x13\x66\xc5\x3e\x34\xbc\xdb\x37\x6b\xad\x4a\x9f\x95\xc4\x49\xc2\x08\x19\x6a\x97\x38\x62\xca\x45\x70\xfe\xef\xff\xfd\x9f\xd1\x42\x3a\x2f\x14\x28\xe3\x44\x4b\xb4\xa5\xf7\xea\x9e\x4e\xca\x7b\x12\xbf\xc7\x3c\xb2\xc5\x3d\x54\xcd\x2b\x0a\xa8\x5e\xaa\x7c\x72\x47\x52\xcd\x51\x31\xf6\x3f\x6d\x84\x93\x9f\xe5\xe4\x0c\x22\x0a\xf0\x19\x1c\xb3\x62\x1c\x7b\xc5\x22\x25\xb8\x28\x6f\xa1\x39\x9f\xee\xce\x35\x08\x5f\xac\xbb\x0e\x9c\x8c\xae\x9b\x31\xbb\xb3\xca\x50\x19\xbb\x06\xae\x97\x4f\x36\x71\xf5\x5f\x28\xa9\x97\x3e\x2c\xcb\x1a\x16\xfe\xcf\x2a\x4c\x85\xea\xac\x01\xe7\x6c\x9f\xff\x56\xa7\x25\x56\x54\x60\xc3\xc8\x71\xdb\xee\x06\x8b\x87\xe2\xb1\xb6\x35\xd2\x5d\x25\x34\x0c\xd6\xe5\x58\xe9\x08\x77\x98\x76\x4f\x70\x44\xac\x0e\xc0\xd0\x1e\x8d\xc1\xf4\x2a\xc8\xcf\x8b\x3f\x76\x9b\xc9\xfd\xd7\x41\x84\x41\xb6\xb5\xd6\x5b\x1c\xfa\x70\x39\xd6\x21\xc7\x12\x7d\x25\x1a\x78\x32\x88\xcc\x35\x99\xf2\xf6\xcd\xe3\xd3\x98\x38\xe2\x2e\xe9\xcb\xcc\xe7\x23\x7c\x4c\x64\x16\x26\xb7\xd9\x30\x15\xf7\xe5\xce\x79\x55\x4f\x19\x1b\xc1\xd0\x59\x09\x9b\xf6\x56\x74\x6f\x0c\xb2\xc4\x21\x42\x7a\xc7\x1a\x23\xce\x79\xbb\x34\xaa\x37\x6c\x9d\xb8\x31\x34\x20\x02\xe3\xa1\xfb\xf2\xb0\x39\x0e\xab\x1e\xfe\xb8\xb0\xf1\x92\x2d\xb7\xcc\xda\x97\x4a\x1a\x26\x21\x22\x40\x6d\x3a\xfe\x5b\x96\xe7\x70\xa5\x58\x4a\xc3\x84\x61\x64\x7f\xcc\x0a\xab\x18\xff\x64\x4c\x1f\xfb\xd0\x28\x90\xcc\xc2\x0d\x9a\x57\x47\x90\x59\x34\x3f\xb2\xa6\xbe\x9f\x36\x00\x25\x8d\x84\xd4\xd0\xe1\xe2\x37\x58\x95\xba\xb2\xc8\x52\x12\x5a\x93\xe9\xda\xe9\x43\xec\x85\xee\x30\xa1\x92\x12\x2e\x95\x1a\xc5\xe5\x97\x8e\x98\x92\xc6\x91\x10\x09\xea\xa8\x96\xd2\x7f\x92\x4a\x81\x30\xc1\x01\x77\x50\x52\xaa\x42\xf4\x1e\xbc\xc9\xac\xe3\xb0\x9e\xb8\xd5\x5e\x54\xa0\xdb\xe4\x75\xb0\x57\x52\x0a\x2a\xa6\x9e\x31\xf2\x06\xc5\xae\xbc\x39\x57\x45\x77\x7a\x03\x9d\x8a\x4f\x79\xae\x9a\x57\x17\x77\xcd\x69\x89\x4a\xca\x42\xab\x6b\x83\x4d\xc1\x22\x2b\x27\x0a\x7a\x92\x32\x12\xe2\x6d\x7c\xc0\x86\x84\x2d\x0f\xe0\xcf\xb9\xbd\x46\x4a\x92\x34\x09\x03\x04\xc4\xef\xad\x0d\xcc\x22\xcf\x9f\x85\x7a\x03\xbd\x81\x77\x44\x2c\x74\xc6\xb9\x63\x95\x22\x49\x79\xc0\xa2\x60\xe0\x12\x1c\x4e\xae\x96\x2b\xab\x57\x55\xd9\xa7\x39\xd3\xf4\xa0\x5c\xa5\xb1\x43\xac\x3c\xde\x88\x3c\x2f\x7d\xdb\x57\x52\xc1\xb5\xd5\x07\xcb\xde\x61\xd5\xbc\x7a\x47\xfa\x71\xeb\x92\x0a\x15\x63\x2b\x4f\xc8\xfa\xdb\xe8\x57\x09\x88\x10\xd6\xa7\xc5\x67\xf0\x2b\x9c\x7f\x3b\xa9\x0a\xbb\x5d\xcd\x1a\x2a\x6c\xe0\x64\x83\xdb\xa5\x38\x59\x86\x1c\xf4\xf4\x28\xff\xa1\x54\x80\x47\xd9\x40\xa3\xf6\x72\xf6\x51\x69\x13\x53\xd2\xd3\xa1\x7e\xbe\x96\x08\x0f\xf9\xab\x42\xfa\xdf\xda\xc6\x29\xc4\x36\x90\x13\x8e\x96\xf8\x52\x64\x4d\xfd\x74\x6e\xea\x4c\x3b\xde\xda\x40\x3b\x5e\x52\x48\x28\x6e\x62\xf0\x8e\xdd\x3d\x71\xac\xaf\x79\xd2\x4f\xb1\x40\x3e\xb9\xa0\x00\x4c\x38\x36\x86\x23\x12\x7d\x95\xf3\x53\x13\x10\x2f\xee\xb6\x29\xcf\xcd\x08\xa7\x24\xa9\x61\x0a\xa9\x97\xcf\xe4\xb6\x71\x24\xe9\xfd\xf8\x26\xb3\x50\x84\x89\x93\x43\x90\xed\xc2\xf1\xcd\xff\xdd\x10\xe4\x43\x39\xc5\xc1\xdb\x4e\x6f\x50\xb2\x88\x47\xd0\x95\xbd\xaa\x5b\x57\x6c\xf5\x47\x63\x19\x3a\x77\xb4\x4b\x9c\xbd\x1b\x42\xc3\x38\xd6\xae\xe5\xbc\xf3\x25\xf2\x5e\x42\x49\x32\x1a\x59\xa1\xa0\xef\xa8\xfd\x39\x12\x1f\x1e\x5f\x3d\xa5\x01\xba\x13\xb6\x61\xdc\x78\xc2\x32\x16\x18\xcc\x22\x56\xcd\xab\x8f\x29\xc6\xaf\x15\x63\x24\x20\xba\xa7\x1d\xcc\xfa\x96\x70\x3f\x56\x59\x09\xcc\x6e\x02\x5f\xca\xc4\x4a\x96\x44\x21\x75\x64\xa1\x87\xd5\x62\xd1\x38\x54\xf7\x85\xae\x8e\x1f\x9e\x58\x4b\x78\x6c\x06\xef\xeb\xa2\xd9\xab\xa1\x5b\xa0\x64\x89\x90\x18\xc9\x6c\x9b\x0a\xc4\xd1\x05\x23\xc3\x2a\x01\xe3\x9c\xa2\x09\xcf\xf3\xcb\xcd\xfd\x7a\xb9\xef\xea\x5a\xcf\xab\xcd\x76\xf5\xb8\x5b\x74\xa5\x76\x96\x26\x52\x7a\x8f\x9a\x36\x0f\x9f\xcd\x58\x99\x10\x14\x89\xfb\xba\xcd\x46\xcb\x13\x54\xfb\x02\x3e\xbc\xca\x80\x05\xea\x5f\x88\x21\x48\x26\x34\x0b\xa6\xf8\xa8\x9f\x59\xf3\x6a\xe3\xab\x21\x4e\x69\x76\x12\x33\x01\xb6\x41\x86\xda\xfd\x0e\x56\x6b\xaa\xf2\xb8\x2f\x8d\x41\x99\x9d\x2f\x4b\x49\x4c\xc6\x16\x39\xf6\x52\xd8\x2c\xd0\xca\x07\x3f\x8b\xcf\x51\x4f\x0e\x9f\xee\xa4\xdc\xc8\x24\xd3\x08\xe4\xbb\x5f\x3f\xfe\xe6\xef\x94\xe4\xd6\xe3\x0d\xef\x54\x05\xe2\x7c\x0d\xf8\xe3\xc7\xcb\x84\x78\xa6\xe2\x6b\x05\x98\x5a\x4c\xfb\x3d\x4c\xaa\x98\xb8\x55\xca\x4a\xa7\x2e\x94\x9a\x04\xdc\x4c\x85\x81\x25\x62\xe1\xc2\x98\x15\x87\x5e\x0f\x10\x1f\xfa\x76\x40\x79\x9e\xfc\x0e\x25\x84\x76\x8a\x09\xcf\x50\xd5\x65\x21\x06\xb3\x6f\x90\xde\x30\x20\x09\xc2\xad\x9b\xd7\xac\xd2\x3f\x01\xde\x30\x5a\x58\x17\xed\x7f\xfa\x6b\x05\x66\x21\x44\x15\xd4\xea\x0c\xfe\xa7\xcc\x7f\x73\x12\x10\x0a\xbe\x92\x61\x03\xb4\xa1\x40\xa3\x4c\x82\xd4\xea\x54\xda\xde\xf2\x12\x2d\xfc\xae\x14\x80\x92\x40\x44\x88\x8f\xde\x41\x75\x1a\xa0\x04\x92\x28\x4c\x63\xd3\x13\x3a\x6e\xb3\xf7\x6b\x67\x88\xe2\x10\x09\x60\xab\x5c\xe8\x89\x37\x81\x4c\x22\x0e\x3a\x1e\x28\x0a\x6f\xc4\xc7\x03\xf4\xbd\x6e\x37\x2a\xe6\x04\x3b\x04\x3b\x10\xc7\xe1\x45\x50\xa2\x85\xf5\x9b\x6d\x5e\xab\x2c\xef\xfe\x9c\x10\xc4\xcf\x81\x65\x4c\x4c\xda\x64\x09\x0b\x2c\xc5\xac\x7b\xee\x93\x52\xf9\xe4\xfa\x59\x44\x70\x03\x39\x89\x4f\xa4\x2c\xc2\x15\x29\x46\x99\xb0\x34\xf2\x3e\x07\x16\xa4\xf1\x5d\x1c\xa1\xbb\xeb\x2c\x05\x14\x44\x6a\xa0\x6e\x27\x65\xf9\x51\x6f\xac\x6a\xd2\x63\x69\x15\x39\x06\x11\x7f\xc2\xb4\x4e\x3c\x2d\xcd\x01\xa2\xe7\xde\xb3\x24\x21\x1a\x49\x54\x5d\xaa\x99\xe7\xdf\x66\x7f\x45\x42\x19\xb1\x5e\x59\x4e\x1f\x3c\x2b\x8b\x4e\x92\x7f\xd4\x7c\x38\x5f\x75\xae\x94\x49\xc2\x2c\x62\x73\xef\xfc\xfd\xb2\x5f\x90\x3f\x88\xd3\x69\x06\xf7\xf8\x75\x9b\xdc\x2f\xf8\x09\x8f\x62\x0b\x44\xc9\x7e\x65\xdd\xaf\xe7\x40\x54\xdc\x7b\x9b\xff\x38\xa3\x20\xf7\xb5\x94\xab\x7b\xb0\x69\xec\x3c\xbf\xb0\xf4\xb5\xcf\x5c\xf1\xdb\xaf\xdd\x49\x2a\x22\x14\xb3\xca\x45\xdd\xa0\x2e\x76\xef\x8f\xe5\x47\xe8\x38\x70\x5b\xf7\xcf\xd7\xf2\x39\x13\x97\x6a\x2d\xff\xc7\x7f\xdd\x89\x85\xd0\xc8\x2b\x5a\x3c\x3c\xbd\x3c\x7a\x1d\x8d\xfd\xdd\xd3\x66\xbf\x5d\xdd\xdf\xfb\xaf\x97\x89\xc4\xfa\x5f\x2e\x9a\xec\x7c\x1c\x03\xa1\x12\x99\x28\xdc\x1a\x7d\xe5\xbc\xcd\xa4\xba\xa9\x3d\x79\x4e\x52\x02\x0a\xd1\x29\x0f\x31\x71\x76\x37\xe3\x7b\x2f\x21\x46\xd8\xe0\x76\xf7\x8f\x39\x53\x72\x99\xa8\x80\x72\x98\x01\xe8\x8e\x7f\x9b\x52\xf6\xc2\xf6\x1e\x98\x60\x69\x59\xce\x72\xa1\xbe\xe6\x3d\xe6\x3f\x0d\x0c\x1f\x8a\x23\x60\x8e\x51\x25\xfd\x95\x18\xdf\x23\x54\x1e\x02\x35\x95\xd4\x90\x89\xa6\x86\x5b\x1d\x52\xac\x77\x87\xfc\xe8\xef\x9d\xe6\x04\x5c\xa5\xdd\x25\x90\x4f\x27\x07\x65\x1e\xff\x16\xcd\x05\x36\xe5\x57\x85\xe6\xdd\x87\xa5\x0d\xbb\xea\xcf\xda\xf2\x19\xdd\xdf\x21\x48\x83\xa8\xe7\xd7\x5c\x4a\xa1\xcb\x04\x12\x6e\x7a\x87\x3d\x6c\x04\xdb\xbc\xc4\xea\x89\x8f\x07\x9b\xc0\x9a\xef\x7b\xe2\xc8\xcd\xb9\xd0\x5d\x27\x74\xf8\xd6\xf3\x20\x10\x78\xc7\x3f\x44\xa3\x5e\x9f\x51\x85\x01\xaa\x7a\x27\xea\xb7\x2b\x8b\x30\x0f\x63\x83\xd7\x8a\x38\x1b\xdb\x0a\x76\x47\xa2\x20\xc2\x64\xf0\x1e\x0e\x22\xf7\x29\x95\xaf\x83\xf9\x31\x14\xb8\xb5\x44\x6d\x84\x7a\x45\x3e\x7d\xdf\xc7\xe6\x91\x61\x98\xea\xbc\x65\xc5\x41\x97\xc7\x3b\xb4\x94\xf0\xe0\x39\x4e\x24\xc7\xed\xdc\xd6\x0c\x5c\x49\x6a\x7c\x71\x71\x68\x70\xbf\x2a\xe0\x57\x73\x0b\x28\x16\x97\xb9\x9e\xd6\xf0\x7b\x62\xce\xf0\xe5\x94\x5e\xca\x6e\x85\x8d\xed\x99\xa8\x8f\xc7\x90\x44\x38\x25\x6d\x91\xd6\x8a\x56\xff\x3d\xc4\x01\xa7\xa1\xc5\xf4\xa2\x87\xaa\x75\x0d\x99\xbf\xa7\x94\x06\x1e\xd2\x8a\xd6\x63\x57\x4e\x27\x04\x56\x1d\x1f\xd6\x8f\xfb\xf5\xe3\xef\xab\x0e\x91\xc2\x59\x14\x60\xb5\xb8\x16\xef\x93\x42\x0b\x67\x3c\x95\xcc\x5b\xf2\xd8\xbd\xde\xa1\x2c\x3a\x2e\xa8\xd5\x30\x1b\xff\xec\x84\x9b\x24\xf4\x1a\x4f\x68\x1c\x57\x4d\x47\xa4\x31\x76\xfa\xe5\xf9\xf3\xb9\x44\x31\xa6\x71\xb9\x38\xfc\x37\x73\x26\x46\x92\x27\x4a\x09\x18\xa9\xfd\xaf\x1b\x38\xee\x3e\x4f\xd3\xab\x4d\xb4\x25\xfc\x60\xb2\xf2\xd0\xbd\x20\x9c\x07\x69\xac\xbd\x70\x8d\x43\x2f\xf6\xc7\x2c\x7f\xf1\x37\x94\x73\xee\xc3\x67\x9e\x02\x90\xd0\xbb\x57\xdd\x54\x99\x3e\x74\x13\x00\xbd\x7e\x51\x1e\xf4\xe3\x36\x13\x65\x31\xe3\x0b\x21\xb9\x48\x03\xfc\xfc\x0d\x34\xae\x66\xf1\xb7\x2a\x73\x5c\x48\x86\x17\x8b\xdb\x73\xa9\x3d\xfa\x97\xcb\x90\x88\x64\x6c\x5e\xe4\x29\x76\x92\x4b\xc2\x02\x27\x6f\xe3\x9f\xd3\x65\x2f\x83\xcb\xd8\x32\x0b\x2d\xae\x6e\xbb\xb8\x5f\x45\xdd\x09\xd2\x28\xd4\x8e\xab\x3b\x0e\x8b\xfd\x00\x4d\x13\x5f\xd1\x11\x95\xee\xc4\x15\xfc\x22\xce\x25\x08\x84\x6b\xde\xdc\x3f\x2d\x7f\x9b\x48\x33\x4b\xae\x44\x14\x26\x23\x6f\xa3\x6c\x5a\x0e\xe2\x3a\x00\x16\x78\xac\xea\x8d\x28\xde\xfa\x17\x5f\xcb\x04\x63\x96\xfd\xd8\x98\x51\x72\x0d\x31\x57\x23\x9e\xec\x6e\xb9\xd8\xfe\x98\xee\x20\x1c\x58\xa8\x1c\x60\xdb\x89\x9b\x3f\x57\xb0\x56\xe5\xe4\x12\x20\x8d\x51\x89\xa4\x67\x41\x4a\x0e\x26\xf0\xad\x5a\x6b\x7c\x99\x15\x87\xa5\x38\x09\x75\xb1\xf0\x73\x13\x31\x7c\x65\xff\x7b\xce\xd4\x1b\x02\x96\xda\x55\xb6\x80\xfc\x2a\x96\xef\xda\xff\x0f\x9c\x43\xfc\xb9\x89\x4d\x47\xde\x2a\x81\xeb\x91\x1a\xdc\x1e\x43\x2d\xc0\x08\xfb\x65\xdd\x1f\x19\x43\xce\x3d\x2e\xce\xa0\x5f\x36\xf7\x33\x82\xa4\x92\x1b\x15\x99\x60\x20\x7c\x73\xe1\xe5\xd3\x8d\x63\xa8\x3a\x6c\x33\x10\x04\x15\x35\x13\x62\xa5\x4c\x83\x40\xe1\x52\x22\x0a\xf4\xb0\x75\x15\x29\x77\x30\x8a\x25\x6e\xf3\x36\x1c\xc6\x18\xd6\x08\x35\x95\x1f\xf4\x83\x99\x55\xda\xe9\x7c\xb8\x64\x1a\xa5\xd6\x8f\xf8\x74\xae\x5f\xd7\x45\x83\xe6\x34\xdd\x8d\x1d\x3e\x87\x34\x52\x80\xa8\xe7\x9f\x4f\xde\x70\x40\xa6\x44\x58\x63\x77\xd4\x2a\x52\x6f\x9d\x6a\xaf\x4c\x89\x61\x4c\xfb\x9e\x22\x68\xef\xa0\x30\xbe\x9e\x38\x8c\x71\x11\xca\x1a\x38\x0e\xfc\x1d\xba\xa3\xa9\x73\x8d\xcf\xf3\x36\x39\xc3\x2c\xb3\x0b\xe7\xd2\x38\x0e\x47\xde\xfb\xab\x01\xfa\x72\x76\x4d\x4f\xe3\xd4\x60\x85\x1b\x13\x23\xb7\x19\x0e\x48\x99\x32\xa5\x24\xc5\x32\x72\x87\xb1\xf3\x81\x84\xaf\x98\xcf\xb6\xd3\x52\x4a\x35\x5a\x0c\x7b\x29\x7f\xe3\x51\xb8\x7c\xae\xb4\x91\xb2\x48\x59\x23\x5f\x54\x49\xb4\xa5\x5c\x35\xa9\x95\xa4\x8c\xd8\x56\xf6\xe2\x03\x50\xc4\x64\xb0\x8a\xa6\x8c\x87\xcc\x42\xdf\xd0\x6d\xe2\xae\xea\x95\x5b\xae\xba\xd8\x8e\xaf\x98\xc9\x08\x79\x95\x96\x2b\x8d\xca\xae\xf3\xb7\x2c\x89\x23\xc4\x78\xad\x9a\xd7\x5d\xf9\x52\x6b\x8f\xcb\xfa\x72\xb9\x4d\x79\xa8\x11\xf7\x72\x12\x96\xc2\xdf\x3b\xf4\xde\x64\x13\xcd\x65\x99\xf2\x44\x21\x96\xd9\xc3\x5d\x56\xbf\xac\x74\xcc\x84\xca\x3e\xfe\x01\x5c\x51\x9f\xa1\x7a\xe0\xd9\xf2\x5c\xbd\xc3\x78\xe7\xfc\x9f\xd9\x89\xcc\x95\xc6\xea\xbd\x13\x2d\xe9\x7c\xfa\x86\xbf\xc9\x3f\x2b\x6e\x98\x50\x63\x09\x9c\x7a\xba\x0e\xa6\x69\x10\xe0\x6b\x75\xae\xa1\xda\x94\x79\x7e\x3b\xe5\x62\xcb\x34\xa5\xb6\x2a\x7f\x93\xa1\x5c\xd9\x50\x12\x63\x32\x90\x6b\xfc\x42\x7b\x71\x0f\x4b\x1f\xca\xa5\x22\x0d\x45\x3c\x51\xb7\x9a\x7f\x66\x32\x90\xb8\xa8\xfd\x56\x9d\x5f\x4d\x33\x02\xfb\xa6\xd2\xd8\x4e\xc0\xbe\xcc\x6d\x4c\x5b\x3f\x4d\x18\x17\xa9\x4a\x0c\xee\xb1\x3f\xa1\x92\xd0\x4b\x65\xc8\x54\x49\x8d\x08\xe2\x93\x6d\x88\x8c\xce\xab\x00\x4c\x38\xe2\x45\xa3\xb5\xb9\x15\xf7\x1b\x54\x1a\x53\x1d\x5a\x7b\x9d\xf6\x86\x3e\x3d\xdd\x5b\x0e\x58\xc8\x47\x65\xd4\x54\xc7\x8a\x83\xaf\x08\xe9\x03\x5c\x25\x3e\xfb\xf1\x32\x02\xd3\x49\xa6\x79\x29\xd8\x6f\xd3\x41\x4a\xd8\x48\xb6\x69\xa0\xa8\xd7\x75\x7d\xee\x17\x13\x08\x99\xd0\xa3\xaa\x4a\x6f\x5e\x2b\x53\x48\x05\xae\xc0\x9e\x82\x75\x3c\x95\x45\xef\xb6\xee\x06\x99\x94\x21\x88\x58\xa0\x77\xfa\xc3\xa7\xab\x54\x8f\xe7\xad\x01\xe5\x21\xda\x98\x25\xec\xca\x36\xba\xbc\x2b\x2b\x6b\x96\x3e\x79\x37\x44\xc8\x62\xde\x0b\xae\xd8\x37\x62\xb8\x62\x89\xd0\x84\x03\x01\x9e\x9d\xf8\xe5\xe8\x79\xe2\x70\xad\x0a\x2a\xa2\x28\x40\x22\x00\x28\xa1\xbb\x25\x77\x68\x4e\x4e\xfe\xd7\x8f\x24\x26\x84\xd1\x2e\x86\x62\x15\xef\xd7\x34\x7b\xa4\x20\x91\x15\x28\x55\x22\x57\x96\xc8\xfd\x65\xb9\x5f\x90\x54\xa0\xc8\x64\x3b\xbe\x3d\xf7\xa5\x68\x90\x14\x44\x58\xec\xc9\x01\xc5\x3e\x44\xde\xd1\xae\x42\x7f\x96\x98\x29\xa4\x19\x63\x97\x7f\x5c\x95\x16\x34\x4a\xac\x4e\xe0\xdb\xf4\x40\x6c\x61\x86\x7d\x90\xb3\x6a\x57\x8b\xbb\xb2\x5a\xdd\xfc\x73\xb7\x1a\x64\xdf\x5f\xae\x75\x82\x4a\x62\x35\xd1\x6c\x4b\x0e\x37\xf0\x91\x5f\x90\x14\x14\x2c\x27\xb7\xe9\xac\xb7\xfe\x71\x86\x33\x6c\x3b\xd1\xbf\x76\x08\xa0\x40\x6a\x9b\x25\xed\xfa\x2e\x9a\x60\x81\x41\xe1\xe6\xce\x53\xfe\xf6\xf0\xeb\xf1\xd0\x1d\x85\x50\x5a\xaf\x2a\xbb\x64\x4e\x79\xda\xff\xf3\xb7\xfa\xe8\xee\x64\x49\x10\x92\xb1\x3a\x8a\xf6\xc0\xe5\x8e\xe8\x29\x05\x27\x8a\x28\x4f\xae\xc9\x8a\xc3\x77\x31\x9d\xb3\x9c\x33\x66\xdd\xc1\x6f\xb2\xf2\x88\x9a\x4a\xb6\x66\xf0\x54\xe4\x9f\x33\xad\x32\xc1\xc1\x58\x3d\x9c\x1c\x54\x53\x95\x79\x76\x78\x6d\x76\x50\x37\x45\xd7\xe7\x11\x69\x18\xa3\xe3\xd2\x33\xb4\xfb\xd0\x8c\xc0\xdc\x5c\x59\x4c\xa4\xa1\xc2\x36\x1e\x6a\xdd\x60\x59\x17\xe7\x6f\x9d\x75\x37\x30\x4d\x53\xe4\xe2\x09\xfd\xde\x46\x5c\x43\xbc\x8f\x10\x20\x53\xc7\xb1\x99\xd0\x47\xe2\xc9\xf7\xc8\x20\xf5\x10\xa0\xdf\x45\x9e\x69\xec\x44\x8d\x16\x67\x16\xff\x8d\x7f\xfc\xd9\xb8\xed\xcb\x9a\x73\x6e\xb2\x3c\x6f\x37\x67\xcf\x26\x9f\xab\x12\x0a\x25\x8d\x6b\xb4\xaa\x73\xd5\x8b\xd3\x8c\x2f\x51\x19\x8d\x0f\x05\x55\x02\x66\x52\x11\xa1\x43\x1d\x61\x2d\xbc\x2c\xb2\xa6\xac\xe6\x16\x2f\xa1\x49\x8a\xf0\xeb\xba\x11\x6f\x08\x76\xf5\xb4\x58\x0b\xb2\x18\x7f\xa3\xa6\x94\x0e\xd5\x18\xc9\xf4\x64\x29\xf0\x41\x8d\xd9\x6d\x18\xa6\xbc\x52\xe4\x10\x5a\x10\x15\xf8\xd4\xf1\xb7\x7f\xfa\x10\x54\x68\xa9\xb1\x19\xe1\x0b\x82\x8b\xba\x3e\x57\xa2\x78\x07\xd7\x8f\xb8\x7a\x3e\x23\x85\x5b\xdc\x3a\x40\x8e\x6d\xd4\x8e\x2a\xa6\x6e\xb4\x09\x63\xa4\x7d\x8e\x6b\x69\x93\x53\x9a\x24\x44\x84\x9d\x3a\xd7\x4d\xa9\x3f\x47\x3e\x16\x52\x18\x1e\xe1\x2a\xf0\x08\x1f\x1e\xd9\x35\x0b\xe3\x16\x46\x11\x24\x1a\x28\x4b\x65\x7e\x84\x8f\x61\x05\xc2\x0f\x32\xd6\xed\x6a\x10\x0e\xa0\x16\xe6\xec\x95\xc9\x20\x88\x71\x6f\x5a\x22\x44\xa4\x28\x8f\x99\x12\x16\xf0\x33\xb4\x90\x94\x32\x88\x0c\x6e\xf1\x0f\x3f\x17\xbf\x77\x7f\x93\x09\x7a\x27\x2e\xa2\xc5\xcd\x70\xcf\x97\x81\x62\xcc\x92\x6e\x7e\xc0\xaf\x2d\xfe\x82\xf1\x33\x96\x61\x48\x51\x4d\x68\x55\x55\xa5\x9d\x91\x7e\x96\xcb\x50\x1a\x9c\x6f\x0d\x88\x63\xf8\x8f\x33\x74\x35\x25\x19\xa5\x51\xd8\xa1\x78\xcb\xff\xa0\x46\xce\xb3\xf8\x2c\xcf\xcd\x68\xd5\x97\xc4\x58\x83\xce\xd2\xc5\xe8\x48\x18\x9a\x8f\xd3\xff\x3a\x13\x94\x71\xc0\xac\x83\x1d\x32\x76\xcb\x32\xbf\x2d\x8b\x49\x10\x27\xe3\x20\xc5\xdd\x0d\x2f\xf7\x66\xd0\xbc\x95\x31\x0b\x10\x9a\xf1\x65\x01\x7e\x72\x32\xc7\x99\x16\xa7\x13\x14\xda\xe9\xcd\xae\xd0\x8a\xee\xcb\x0d\x47\x52\x12\xa3\x38\x82\xb1\x92\x04\xd3\xe2\x8b\xa4\x5c\xa2\xae\xe3\x66\xf5\x37\xb5\x38\xa5\xa4\x26\x10\xd1\x80\x7c\x76\x23\xaa\x5e\xc0\x3d\x9d\xac\xb1\x5f\xfc\xe3\x4e\xc7\x88\x85\xfe\x3d\x96\xef\xc2\x5f\x15\x53\xd2\x53\xac\x6c\x99\xd0\x57\x49\x64\x42\x04\x8a\xca\x49\xd1\x59\x6f\x5a\xe9\xb4\xdb\x4a\x7c\xa0\x4b\x8a\x1f\x98\x26\x0e\xdc\xba\x56\x25\x96\xf8\xbb\x23\xca\x3a\xfd\x59\xed\x73\x7d\x5b\x5a\xa7\xe8\xd9\x9c\x5b\x26\xca\xda\x18\xfc\xfc\xb1\xde\xad\xee\xd7\x5d\xc9\x4e\x72\xc2\xa8\x19\x42\x7d\x51\xc5\xec\xfc\x39\x1f\x47\xc9\x94\x69\xe4\x7f\x39\x09\x25\x04\xa3\x4c\x19\x2b\x52\xc6\x06\x81\x44\xf7\xe5\x01\xb5\x46\xb0\xcc\xe2\x4e\x37\x1e\xc8\x52\xe4\x23\xd5\x1f\xe2\xe4\x73\xd3\xe9\x95\xb7\x49\x40\xea\x73\x6a\x7c\xe1\x27\x7b\xaf\x54\xb1\x44\x93\x3c\x94\xb1\xe9\x8b\x01\xfe\x68\x92\x7a\x2c\x9f\xf7\xc2\x6e\x43\xf3\x9e\x98\xd6\xbd\x5b\x2a\x4d\x15\xeb\x6e\xa8\x17\xc7\xf0\xcd\x89\xcb\xce\x84\x4f\x85\xa4\x6a\x43\x65\x14\x2b\xd4\xdb\x66\xea\xba\x21\x25\x84\x3c\x1c\x0a\xee\x3a\xad\xc8\xee\x11\x43\x64\xb0\x5f\xb0\xeb\x73\x7a\xa8\x2c\x6b\xb8\xbd\xc7\x16\xf4\x7f\xad\x69\x33\xbe\x15\x90\x6a\xee\x60\xe6\x77\x28\x75\x37\xb9\x99\xa0\x62\x44\x1c\xa9\x32\xd7\x76\xb7\xeb\x66\x24\x18\xdb\x91\xcc\xea\xdf\xcb\xde\xc7\x5c\x4a\x23\x83\xc8\xf5\x16\x77\xbf\xfe\x8e\x1e\x89\x94\x46\x01\x4a\x7a\xca\x4c\x3f\x15\x37\x15\x40\xfb\xca\xba\x19\xb3\x3b\x37\x65\xe5\x95\x32\xe3\xc0\x7f\x42\xdb\x26\x45\x8d\xe1\xd0\x2a\x37\x83\x4a\x82\x7f\x3e\x2a\xa0\xdc\x12\x8f\x9a\xd2\xe2\xe1\x07\x29\x96\x0a\x38\x47\xfc\x70\xdd\xd4\xca\xff\x2d\x8c\xac\xd5\x8b\x45\x97\x38\x13\xdc\xed\xce\xd3\xe1\x54\xa4\x35\xfa\xf7\xe8\x12\x6a\x3f\xfd\xb0\xad\x34\x1f\xe8\x2b\x92\x5a\x59\x8b\x0a\xac\x75\xd3\x5c\x15\x4c\x11\xc5\x29\x1d\x6c\xb1\xf7\x59\xdd\xb4\x33\x33\x9a\xc4\x02\x2a\x0e\x23\x4c\x49\xce\x85\xca\x07\x62\x69\x52\xc5\x71\x84\x41\xfa\xad\xa8\x85\xcc\xf6\x59\x39\xdc\x80\xda\xa3\x38\x9b\x1e\x16\x7f\xec\x6f\xd6\xb7\xfb\xbb\xcd\x62\xb9\xbf\x79\xda\x75\xc7\x15\xc7\x9d\xe4\x1f\xe7\xec\xcf\x7f\xb4\x01\x54\xbf\xd3\xa9\x58\x69\x54\xeb\x73\xab\xf4\x50\x71\x7d\x3c\x91\x54\xac\x19\x02\x39\xfe\xf8\xe3\x8f\x3f\x46\x5f\x4f\x03\x89\xf5\x61\x25\x0a\xfb\x9e\x3c\xc2\x2f\xe4\x42\x3d\x97\xcd\x16\x29\xcf\x7e\x60\x2a\x10\x33\x64\xfd\x29\x16\xde\x0c\xa8\x3b\x0c\x10\x0e\xd1\x1c\x7b\x68\x5e\xf7\x4d\xb9\x57\x63\x08\x9c\xe2\x71\xec\x73\xc7\x85\xd6\x4f\x85\x83\x99\x8e\xde\x5c\x25\xc2\x04\x13\x86\x0d\x14\x6d\x00\x3f\xec\x44\xfd\x15\x8e\xd6\x9f\x81\x32\xec\x07\xbd\xa2\x0a\x6e\xed\xb7\xb1\x36\x31\x6a\xdf\xc6\xf1\x8a\xa3\x44\xa2\xb1\xce\xf7\x98\x1d\x20\x47\xd9\x8e\xb3\x6f\xcc\x29\x91\xf2\xd4\x5b\xeb\xf9\xf0\xee\x01\x53\x54\xbc\xae\xb1\xea\xde\x64\x25\x51\x42\x93\x44\x0c\xf5\xa8\xcb\x8e\x57\xa5\x24\x33\x56\xef\xa5\x10\xa7\xfa\xb5\x6c\x30\xea\x16\x08\xff\x18\x5f\x9d\x54\xe0\xa4\x09\x56\xa2\xf2\xee\x88\x9e\xbb\xb9\x11\x59\x3d\x5d\xb0\x95\x4a\x25\x3e\x8c\x5d\x75\xf6\x8e\x03\x57\x6e\xd7\xe4\xb6\x69\x9a\x60\x31\x7c\x18\x02\x0c\xf5\x5a\xa5\xd2\x92\x83\x35\x4c\xa8\x4f\x25\xae\x48\x5f\x76\xd3\xa9\x37\xa3\xf7\xff\xfb\x57\x8f\x71\x76\x9b\x52\x5a\x53\x34\x54\xfe\xa8\x32\x3b\x43\xd7\xd3\x9f\x0c\xcc\x2e\xba\x12\x0e\x5d\xb1\x47\x01\xd8\x82\x55\x65\x4d\x0b\xe6\x02\x55\x65\x62\xc6\xad\x7b\x5b\xdd\x8c\xeb\x41\xca\xd0\x28\x0e\xbd\x3b\xfb\x32\xcf\x6c\xfb\xb2\x3b\x98\x74\x3c\x75\xa5\xce\x27\xdf\xb5\xe0\xfe\x38\xa3\xa9\x2b\xc6\x3c\x64\xc5\x4e\xe4\x17\x44\x0a\x1d\xa8\x18\x8b\x54\xb6\xee\xb1\xda\xfd\x70\xe7\xd6\xa1\xc3\x4c\x7c\x47\x49\x84\xe3\x54\x3c\x5a\xea\x90\x69\x44\x46\x9e\xec\xd3\x1d\x4b\x90\x4a\x1d\xd1\x10\x9f\xbf\xd0\x1a\xa7\xcc\x02\xab\x39\x5f\x12\xf6\x74\x94\x44\xc8\xea\xd8\x5b\xf7\x70\x14\x56\xcc\x07\xfe\xe1\x0f\xd0\xa6\xe5\x53\xba\x9a\x8e\x24\x71\x2e\x3a\xd6\x98\x72\x03\xaa\x3a\x67\xa8\x13\xd2\x5d\x8d\x8a\x42\x6f\x6c\x76\x93\x1d\x0e\xfd\x9c\xf1\xef\x89\x8e\x74\xec\x51\xc1\xf8\x74\x0b\x0d\xbf\x86\x77\x53\x13\x4a\x91\xf1\xb6\x7b\xb5\x05\x24\x0f\x7b\xd7\x94\x30\xe2\x3e\x79\xf3\x2c\x46\xd5\x11\x4d\x75\x88\x15\xaf\x47\xf1\x9e\x0d\x1f\xac\x66\x81\x40\x3e\xac\x3c\x7f\xb6\x71\xe2\x0c\x40\x54\xb3\x10\x10\xf2\x64\x9f\xcd\x0f\x10\x55\x73\x03\xa2\xfb\x4d\xcc\x50\xbc\x5b\x55\x9b\xe7\x4f\x14\x4d\xdb\xa3\x12\x3d\x3d\x6c\xc9\xe0\x0b\x5e\xb3\x4e\x22\x5b\x6f\xb3\xfe\x91\x16\x24\xe8\xbf\x83\xcb\x20\xb6\xc2\x7a\xeb\xe5\x6a\xbf\x7e\x5c\x6e\x56\x8b\xed\x6a\xbf\x5d\x2e\xee\x57\xdd\x18\x93\x2a\x31\x84\x51\x74\xc2\xd1\x52\xa7\x34\xb4\x3b\x17\x4e\xf7\x5d\xf9\x92\x4d\xaa\x7d\x3a\xe5\x04\xcb\xb1\xd8\x86\xdc\x42\xee\x64\x54\x67\xdf\x41\x9d\x8a\x04\x63\x8d\xfb\xf2\xf0\x08\x1f\x5d\xba\xf9\x32\xe3\x76\xe0\x3f\xa1\x6c\xc1\xa3\x86\x66\x7d\x74\x46\x39\xee\x90\x60\x1a\xaf\xed\xd4\xd5\x56\xb7\x65\xae\x47\xec\x72\x2d\x78\x2c\x5d\x9c\x85\xc2\x97\xa8\x19\x34\xd3\x50\xd5\x82\x27\x28\x43\xb9\x13\xe5\xb9\xd7\xde\xb9\x9e\x2a\x68\x49\x0c\x26\x7d\xff\x2a\xcb\xe3\x68\x62\x48\x21\x5d\x44\x60\x73\x88\xe7\xaa\xd4\xe7\x81\x85\xce\x54\xba\x62\xfe\x4e\x49\x05\x71\x3a\xc9\xca\x2f\x22\xad\x3e\x2f\xd7\x2a\x0e\xc8\x10\xb3\x64\x0b\x60\x6d\x6c\xd3\x4c\x4b\xfa\xfd\x97\xe8\x30\xc5\x22\x38\xfa\x8a\xb7\x71\xfb\x90\x90\xee\x02\xad\xe9\x47\x94\xc1\xa2\xcc\x5e\xd4\x9f\x85\xba\x90\x39\x18\x0f\x86\x34\x4d\xb9\x07\x1a\xb9\x1f\xe1\x40\x7a\xd3\xc6\xc4\xf8\x69\x40\x6a\x75\xe4\x2a\x90\xa2\x81\xfc\x3d\x5f\xa9\x36\x59\xff\xfc\xf6\x77\x53\x2f\x08\x68\x84\x9b\xf7\xa4\x55\x0c\x41\x12\x62\x47\x66\x6f\xfd\x2f\xbb\x3f\x9b\xd0\x97\xbd\xb7\xa7\xac\x78\x3a\x37\xa7\xf3\x25\xd1\x6e\x36\x4e\x80\xc0\x24\x28\xca\xfb\xb2\xbd\x5d\x39\x5b\xe6\xf1\xe4\x82\x90\x05\x58\x2f\x5a\x14\xf5\x47\x37\x7f\x21\x94\x06\x2f\x65\x07\x75\x5d\xfd\xe1\xff\x1a\x05\x0a\x9b\xc4\xd6\xf4\xc9\xcb\xa9\x4b\x88\x22\x8a\xd6\xf6\x3b\x50\xaf\x45\xa6\x44\xbe\xc9\x3a\x72\x26\x90\x30\xa1\xb6\x68\x55\x35\x07\x31\xd5\xda\x01\x42\x65\xe0\x78\x3d\xcd\xb9\xb6\xbd\xbc\x7e\xa9\x87\x58\x08\x11\x0e\xf8\x0b\x6d\x78\xf2\x03\xaa\x6c\x88\xbd\x1c\xff\xa0\x58\x0b\xd4\xaf\x7b\x10\x0d\x54\x99\x78\xae\xb2\xa3\x4f\x70\x81\xc5\x29\x12\xcd\x6f\xce\xea\x0d\x1a\x6f\x4b\x30\x37\xdb\x7d\x0d\x04\x98\x02\x74\x1b\xf5\x34\xbc\x8e\x44\xe3\x9c\xaf\x2e\x14\xa5\x80\x69\x8d\xe4\xb3\x53\x99\x75\x3e\x8e\x12\x92\x80\x62\x87\xdc\x52\x71\x16\xba\x3c\xb5\x3f\xd3\x2a\xde\xda\xd8\xc1\x0f\x24\x10\x59\xc3\x90\xd7\xb1\xf2\xe5\xff\x29\xa4\x80\x44\x59\xca\x9e\x39\xe7\x58\xa2\xbc\xb3\x5a\xe2\xfe\x72\x38\x23\xb8\xc3\x3e\x9f\xeb\x57\xd4\x36\xf2\x7f\xe7\x0c\xe5\xee\xca\x02\x9a\xec\x08\xf7\xe2\x5c\xa8\x49\x59\x0b\xb8\x96\x58\xca\xd7\xf5\xc3\x39\x9f\x5f\x4d\x41\xc4\xc2\x3b\xb1\x3f\xc9\xff\xf4\x1b\x5e\x77\x5f\x05\xb3\x9e\xf5\x37\x77\xb7\xc3\x25\x0a\x04\x4b\x1d\x8e\x7e\x2c\x5d\x3f\x7a\x83\x04\x0f\x82\x4e\xf3\xe0\xc6\x8b\x5c\x5e\x99\x10\xc2\x08\x2c\x49\x3c\x6f\x9e\x1e\x56\xbb\x1f\xab\x97\xad\xa5\xf5\xee\x77\x3f\x36\xab\xed\x8f\xa7\xfb\x5b\xff\xdd\x32\x62\x21\xf5\x3e\x77\xe7\x29\x14\x19\x24\x49\x50\x00\x06\x65\xa9\x2c\x40\x0b\x25\x3e\x47\xbb\x32\xc8\x58\xe2\x7c\xc7\x38\x63\x61\x05\xe0\x6d\xe3\xe8\xe6\x73\xeb\x62\xe1\x19\xf0\x19\x48\x13\x12\xe5\x84\x9b\x70\x9f\x1a\xb1\xe7\xff\x2a\x2f\x98\xdc\x7e\x93\x06\x68\x16\xe7\x9d\xfc\x47\xb7\xd8\x28\x89\xd9\xab\x3c\x7f\x6e\x44\x05\xab\xc3\x61\xd2\x08\x1f\xff\x6c\xa3\x23\x5b\xf5\x80\xe6\x16\x6a\xac\xb2\x83\xb6\xaa\xc2\x50\xfd\x14\xf5\xb2\xac\x2a\x18\xa9\x7b\x99\x20\xe2\xb2\x7d\xfa\x4f\x5a\xdb\x39\x3c\x7b\x95\x26\x88\x53\x69\xaf\x72\xac\x10\xe7\x6a\xf7\xf1\xff\x0c\x4f\xc9\x08\x75\xb4\xab\xef\x65\xae\xef\x60\x56\xbe\x52\x9a\xb0\x5d\xa0\xdb\x10\xff\xe9\xe1\x61\xbd\xdd\xae\x9f\x1e\xf7\xcf\xab\xcd\x72\x84\xfb\x37\x51\xc0\xb0\xbb\x8c\x72\xc7\xed\x34\x1b\x9b\x27\x4a\x13\x85\x29\x32\x99\xee\xc4\x59\xc1\x45\x35\xc3\x0f\x12\xa9\x45\xf8\xa3\x60\x40\x59\x37\x6b\x55\x76\x99\x45\xd9\xee\xe7\xd3\x34\xd2\x10\x2e\x23\x47\x35\xb5\x41\xeb\xe5\x32\xe6\x76\xb8\x19\x44\x34\x89\x26\xbb\xca\xdc\x76\xed\x22\x4a\x13\x47\x56\x9e\xd5\xba\x69\xe6\x65\xd3\xf8\x4e\xa9\x89\x53\x8e\xd8\x36\x1b\x05\x58\x2e\xe2\xf8\x97\xd1\xc4\x60\x68\x56\x8b\x1c\xa6\x71\xb5\x1f\x22\x2d\xc4\xdb\xd9\x1a\x81\xaf\xe7\x4d\x87\x99\x04\xad\x6d\xda\x49\x6d\x6e\x3b\x48\x8b\x61\x34\xc4\xc2\xdc\x3f\x6f\x7e\xfc\xb3\xfb\x5b\xc2\x95\xe3\x43\xa1\xa3\xf0\x63\xbb\x9f\x90\xdb\xc9\x19\x99\x14\x08\xa6\xd9\x0f\x89\x15\xa3\x96\xd5\x64\x96\x31\x65\x6b\xd5\x2f\xdb\xdb\xee\x9b\xc0\xd2\xfc\x4d\x55\xfe\x09\xc5\x54\x32\xc9\x30\x48\x91\xbc\x20\x94\x1a\xe3\x30\x4d\x12\x10\xe9\x5c\x44\x97\xa2\x81\x43\x59\x7d\xce\x55\x55\x4c\xc2\xac\x7e\xa4\xc9\xaa\xba\xf9\x81\xd6\x77\xdd\x29\x74\x82\xd1\x93\x3a\x57\xef\x53\x24\x98\xe1\x24\x54\x03\xe3\x65\x0f\x6d\x99\xd1\xc1\x31\x5c\x05\x69\xdc\xf3\xdf\xf4\x6c\xd3\x63\x72\x2b\xda\x80\x98\x4d\x76\xd3\x2f\xf4\xf5\xa5\x49\x25\x89\xa8\x13\x8f\x6a\x23\x37\x6f\x03\x38\xbe\x94\x54\x12\xee\x30\x66\x6b\x55\x5e\xf8\x2f\x49\x93\x6a\x40\xa8\x95\x7f\xcd\x06\x40\x7b\x23\xa8\xc6\x89\xf4\x2a\xea\xd7\xbd\x35\x7e\xdf\x37\xa5\xfb\xaf\xf9\xdd\xc5\x88\x34\x90\xc6\xa3\x33\xad\x4e\x58\xd8\x9d\xcf\xd8\xb4\xc0\x9b\x67\x8c\xc8\x68\x46\x26\x11\xf2\x21\x9b\x2f\x7a\x44\x46\x0a\x8a\xe2\x84\xd8\xae\x3a\xfa\x86\x31\x82\x11\x86\x0e\x86\xd2\x28\x9a\x32\xd9\x1b\x7a\x58\x92\xa9\x3d\xe5\xb2\xcc\xf5\xb8\xb9\x64\x14\x97\x3a\xec\xed\x47\xa0\x6e\xd6\x7a\x57\x62\xbb\xb3\xfb\xff\x2b\x3f\x58\x01\x47\x3e\xdf\xd0\x0f\x70\x72\x8f\x75\xcc\x29\xf7\xf7\x51\xcb\x71\x51\xd7\x68\x66\x65\x6c\x77\x9b\xc5\xe3\xf6\x6e\xb5\x59\xdc\x74\x49\x96\x81\x80\x38\x2f\x4e\xd4\x7d\x2b\xf3\xf9\x9e\x97\x01\x42\x2d\x35\xab\xc2\x2c\x77\x03\xaa\x7c\x87\xea\xd3\xff\xe0\x99\xe8\xd2\x40\xc2\xb1\x04\xb0\xc8\xf3\x36\x59\x9c\x75\x74\xb7\xa3\x2c\x6f\xf4\xd7\x6d\x55\x9e\x36\xc3\xf0\xd7\x80\xe0\x18\x8a\xca\x09\xfa\xca\x98\xd8\x0a\x9b\xa1\x2b\xe7\x2d\xe4\x8d\x18\xc0\x41\x8c\x89\x25\x32\xcc\x51\x9d\x25\x53\x99\xa8\x3e\x77\x1f\x83\xa3\x0a\xe5\xc5\xef\xcf\x6f\xa2\xe7\xb3\xa8\x20\x08\x6d\xf7\xe8\x60\x6d\x0a\xef\x10\x55\xe6\xe4\x05\xb8\x1b\x13\xc6\x0a\x91\x5d\xaa\xcd\x61\xca\x11\x0e\x50\x05\x21\x27\x18\xbe\xec\x3e\x00\x1c\xc1\xce\x59\x46\x7e\xfa\x21\x51\x12\x20\x64\xee\x2d\xcb\xf3\x31\x83\x56\x05\x91\x60\x88\x2b\xdf\x42\xb3\x52\x65\xfd\x59\x37\x70\x9c\x8e\x89\x19\xc1\xbd\x29\xab\x1d\xc4\xd8\xe1\x3e\xfc\x71\x1a\x46\x78\x0e\x47\x18\xb0\xd3\x76\x3e\x3b\xf9\x2a\x79\x50\x01\x8d\x25\xce\x19\x44\x15\x6f\xda\xa7\x3b\x98\xfc\x2a\xa0\x49\x8c\xb9\x45\xd7\xdd\xdc\x2c\x93\x28\xbc\x5a\x89\x1b\x3e\x72\x15\x24\x26\xf0\xae\x7e\x6e\x52\xfc\x06\x9f\xe3\x79\xa1\x02\x1e\xc4\x41\xec\x05\x84\x2d\xda\x61\x5c\x95\x56\x01\x27\x0c\xdf\x40\x8c\x04\x9f\x97\xbb\x39\x35\x2d\x3f\x34\xb6\x6a\xa1\x98\xee\xbd\x8a\xce\x51\xe9\x1a\x93\x6d\x72\x37\x38\xb5\x62\x70\xb8\xdb\x63\x59\xf2\x27\x64\xfe\x5e\x70\xce\x31\xb1\x78\x58\x3f\xae\x36\xfb\xc5\xcb\xb2\xcd\xeb\x26\x58\x60\x15\x70\x15\x20\x64\x0a\x7b\x43\x37\xe5\xc4\xb7\xa1\x5d\xcf\x6d\x7f\xc9\xef\x6c\xed\x15\xce\x5b\xcd\x5d\x14\x22\xc7\xff\xe7\xcf\xa7\xc2\xd4\x13\x9e\xd6\xa8\x0c\xfd\x60\x75\x65\xc0\x25\xfe\xf5\xba\x68\xca\x65\xc7\x37\x57\x81\x50\x52\x53\xdf\x0a\xb9\x7d\xcb\xb7\x59\xd5\xf7\x42\x66\x33\x11\x7e\xc5\x70\x66\xf4\x57\x7f\x76\xcd\x10\x3e\xae\xca\x0a\x46\x51\xb3\x0a\x24\x23\xd8\x28\x76\x84\xa3\x81\x94\xf2\xb7\xb9\x33\x49\x09\xe8\x9f\x6d\xc1\x5e\x6e\x06\xdd\x95\xd5\x85\xec\x80\x0a\x14\xd1\xc4\xcb\x04\x2c\x7a\x5d\x46\xd1\xa8\xd7\xf6\xfe\xba\xf7\xf7\x7a\xbf\x4c\x05\x0a\x9c\x71\xfa\xcb\xcd\xca\x5f\xaf\x0e\xa3\xc4\xed\xbe\x43\x95\xf4\xc1\x7a\xa9\x02\x0d\xa1\x74\x7d\x45\x9b\x00\x4c\xc8\xfb\xd3\x06\xb7\x0a\x20\x88\x70\xbb\x3d\x66\x45\x17\x4f\xf9\x43\x89\xd5\x80\x13\x1a\xb1\xa4\x78\xd1\x17\x11\x4f\x0f\x84\x72\x9f\x32\x61\x64\x6d\xa1\x87\x22\xfd\x7f\xa7\x37\xa7\x02\x93\x32\x69\xf3\x68\x8c\x80\x9e\xdb\xa4\xc7\x16\xf0\x1e\x4a\xf5\xf6\x7b\x38\xb9\xcd\x26\xb5\x02\xa3\x8e\x37\xbc\x7a\xd9\xd8\x96\xe5\xf0\x8e\x84\x61\x2c\xb1\x12\xa4\x44\xb1\x01\xa1\xd7\xa8\x12\xf6\x24\xff\x03\xaa\x99\x56\x5d\xfc\xdd\x0f\x43\xa3\x20\xea\x4f\x7c\x7d\xdf\x56\x21\xa1\x9c\x77\x42\xe9\xa2\xd2\x4b\xe1\xe0\x5d\x2a\x8c\x83\x10\xab\x7b\x4f\x3f\xdb\x17\xd4\xef\x82\x23\x3b\xe5\x76\x90\x2d\x8f\x61\x74\x77\x3c\x89\xec\x30\x55\xe7\x9b\x18\xc6\x4f\xff\x1d\xfd\xd8\x38\x4c\x50\x05\xec\xbb\x78\x1f\x6c\x31\xed\x2d\xb0\x60\x6e\x51\xd7\x53\x01\xb3\xd1\xe7\x69\x94\x72\x17\x6b\xae\x74\xd6\x58\x7f\x9a\xa9\x3a\x9d\x23\xf0\x8e\x9e\x45\x48\xa5\x55\x09\x69\x17\xd7\xa3\xcc\xa0\x68\x7e\x9c\x8f\x99\xce\x9a\x4f\x27\x1f\x88\x9a\x39\x63\x32\x9a\x0a\x59\x9a\x78\xb6\xc9\xde\x05\x34\x7b\x51\xc9\xac\xa9\xf7\x27\xdb\xf0\x9a\xbe\x5b\x21\x4b\xa5\xa0\x1e\xef\xa3\xf7\xfe\x27\x32\x65\x4d\x81\x94\xc8\xd5\x22\xab\xda\x3d\x7d\x26\x64\x51\x61\x92\x50\xab\x85\x58\x1e\x9c\x64\xfe\xd0\x0e\x76\x3c\x36\x25\x54\xb9\xab\xfb\x91\xd5\x4d\x59\x65\xea\xd2\x4f\x49\x85\x29\xd3\x89\x6d\x89\x34\xe7\xaa\x70\x96\x34\x58\x6a\xb9\x85\xda\x72\x89\xc6\x1f\x90\x3c\x41\x66\xbe\xad\x4d\x4e\x7e\x9f\x54\x1c\xe9\x05\xb6\x72\xf6\x2c\x3e\xe1\x62\x84\x76\x71\xd5\xfa\x61\xf5\xf4\x32\x94\x85\x51\xa1\x8a\x6c\x9d\xef\x5c\x43\xd5\x06\xcd\xee\xcf\x3a\xa1\xa1\xad\x28\xe9\xb1\xf0\xb5\x0a\x0d\x13\xc4\x74\x91\x98\x35\x09\x1c\x8a\x5a\x8f\x2e\x3d\x0a\x24\x24\xee\x96\x38\x68\xca\x15\x9b\xaa\xf1\xf4\x88\x22\x16\x62\x81\x2a\xf3\xb1\xea\xef\x65\x73\xc5\x6c\x59\x45\x91\x50\x96\xab\x8b\xfa\x85\xb7\xf0\x5e\xe6\x67\x25\xca\x3e\xdb\x57\x51\x24\x43\x6c\x16\xf8\xe8\x7e\xb7\x59\x38\xe4\x97\x8a\x22\x93\x60\x29\xfa\xcf\xd7\xf2\xac\xc5\x67\xf6\xf7\xd0\x2e\x2a\x22\x91\xdd\xba\xac\xd2\x99\xef\xf2\x75\x07\x39\x76\x5c\xbe\xff\x6b\xfb\xb7\xcf\x47\x09\xb2\xa8\xb3\xba\x53\xe8\x1c\x3f\xc9\x88\x50\xeb\x20\x8c\x13\xec\x54\x37\x50\x1d\x5d\xc7\xe7\xbf\xdd\xf7\x72\x40\x6d\xf7\x76\x4f\x3e\x5f\x48\x8d\xfb\x41\x10\xa1\x5a\x40\xaf\x7e\x79\x77\x85\x27\xae\xa2\x38\x8d\x7d\x0e\xe7\xa1\x29\xfe\x88\x09\x10\x35\x2a\x4e\xa7\xfc\xf3\xae\xac\x7a\xe7\x99\x76\x4f\xf8\x5b\xc1\xdc\xfc\x6e\x7d\x01\x54\x50\x11\x25\x24\xd4\x9d\x9f\x54\x76\x3c\x1f\x1f\xcb\xde\x7b\x7a\xee\xcd\x8d\xa8\xb1\x8a\x53\x4d\x79\x3a\x9f\x9c\x56\xff\x78\x44\x02\xd6\x7b\xdf\x3e\x40\x5c\x00\xc7\xf7\x29\x31\x04\x51\xd1\xf7\x6d\x12\xe1\x7f\x36\x97\x29\x76\xa3\xdb\xf5\xa7\xee\x7a\x3d\x2a\x4a\x99\xb4\xce\xea\xd5\xe7\x09\x7d\x35\x6a\x17\x93\x4c\x82\xe3\x48\x28\xdb\x96\xac\xcb\x7a\x88\x43\xc0\x03\x88\xd9\xb7\xb0\xa4\x8e\x8b\xaf\x22\x19\x02\xea\x53\xa0\xbe\x9a\xdb\xec\x6c\x60\xdd\x67\xa9\x2a\x92\x52\x87\xdc\x1a\xcd\x59\x98\x37\x1c\x4f\x79\x07\x82\x50\x91\x66\x84\xb2\x01\xf3\x3c\x6b\x3e\x1f\x07\xd6\x13\x6e\x14\x44\x09\xbe\x29\xfe\xaa\x97\xed\x9a\x6e\xb7\xd6\xc9\xdd\x31\x91\x49\x8d\xc3\x6e\xbc\x43\xb5\x28\xf4\x16\xad\x38\x2a\x47\x75\x1c\x57\x80\xfc\x87\x08\x37\x96\xd2\xe1\x78\x3a\xae\xda\xaa\x48\x40\xe3\xd4\x95\x56\xf6\x95\x28\x34\xaa\x57\xcc\x4f\x4a\x12\x06\xa1\x76\xaa\x0c\x3d\x6e\x6d\x74\x75\x24\x8c\x22\x2c\x2e\xdd\x9c\x3f\x71\xde\x66\xc5\x61\x5b\xa0\xb4\xac\x1f\x60\x92\xd0\x71\xab\x6e\xfa\x04\x6c\x72\x96\x28\x34\x08\x5a\x84\x5f\xa0\xce\x0d\xdc\x97\x4d\xd3\x41\x0c\x15\x89\x92\x18\x7f\xcc\x73\x2e\x3e\xff\x08\x03\xff\x67\xc2\x59\x10\x5e\xfa\x1d\x63\x0d\xa0\xfe\x1a\x71\x3c\xdd\xbd\x07\xc9\x41\x7b\xda\x38\x1e\x27\x33\x51\xf0\x95\xeb\x9f\x22\x34\xd0\x98\x7a\xec\x36\xf7\xc3\x99\x46\xa8\x4c\x50\xc0\xec\xf7\xa7\xfb\x97\x07\xa7\x9b\xb8\x5f\x3e\x3d\xde\xae\x07\xb9\x00\xa1\x90\x48\xd1\x99\x37\xdc\xb9\x2a\xda\x00\xdc\xac\x08\x23\x80\x7b\xcb\x2d\x88\xe6\xd5\x92\x7a\xf7\xef\xfe\x20\x37\x1c\x51\x37\x0e\xd2\xde\x4e\xeb\x81\x65\x86\x22\x29\x0f\x12\xea\x88\x59\xcb\x3c\x3b\x22\x27\x22\x2b\xea\xc5\x41\x64\x45\xdd\x5c\xc2\x44\x14\x49\x25\xc5\xe4\x17\x2b\xa2\x6d\xca\xda\x57\x2e\x15\x49\x95\x75\x0e\x94\xe7\xcf\x97\x22\xeb\x3d\x22\x50\x81\x00\xeb\xd9\x33\x2a\xbf\xa3\xff\x9a\x04\x76\x44\x10\x86\x26\x8b\xe8\x9d\x77\xc4\x8e\xba\x1d\x32\x5a\xb9\x89\xa0\x89\x87\xa3\x79\xd3\xa1\x11\xfb\xc8\x55\x0b\xe6\x9a\x75\x8a\x08\xce\xd1\xf3\x5c\x59\x0d\xf5\x3e\xf8\xf5\xc7\x75\xec\xd9\x99\x37\x8b\xed\x95\x93\xc8\x20\xb5\xca\xa1\x28\xf7\x3f\x8a\x53\x67\xeb\x6c\x8a\x48\x62\x1b\xe4\xf0\xeb\x24\xd0\x8d\xc9\x43\xaf\xfd\x74\x93\xed\x2b\xe2\xeb\x83\x6e\x77\x5b\x15\xfa\x56\x34\x10\xfa\x3b\xae\x02\x1a\xd8\xd6\xff\x80\x84\xdd\xfe\xd9\x7a\xa7\xd7\xd0\xac\xf0\xc5\x99\x50\xe8\x15\x51\x51\x4a\x61\xd0\xe5\x5d\x17\x75\x93\x35\x16\xec\x52\xd7\xd0\x7c\xfb\x32\x98\xf5\x27\x91\x06\x2b\x24\x96\x04\x0e\x75\x13\x46\xa4\xbb\x04\x43\xb5\x7b\xbb\x57\x56\x5f\xf2\x59\xa8\x37\x0c\xc7\xbc\xde\xf1\xb8\xa3\xe0\x3e\xa7\x63\x83\x58\x7f\xc7\xc0\x9f\xd7\xb2\xfc\x92\xca\xa1\x88\x96\xa1\xe5\x2c\xda\x79\xbf\x39\xe7\x03\x61\x8a\x6e\x4c\x8a\xb7\xc8\x09\x77\xdc\xe5\x68\x39\x3c\xbf\xda\x69\x08\x92\x91\x3b\x6b\xfb\x96\xa0\x58\xd6\x78\x9c\x89\xac\xb4\x81\x06\x91\xd7\x8f\xe8\x95\xe7\x6f\x87\x49\x18\xba\x49\x67\xb5\xab\xc4\xfc\x58\x2f\xe7\x8a\xe6\x8a\x18\x88\x90\x15\xff\x5d\x64\x79\xde\x26\x28\x55\xf9\xa1\x07\x91\x4d\x1c\x48\x81\xd2\x5a\xab\x97\xcd\x13\xd2\x79\xdd\xdf\x43\x1d\xa2\x52\xd9\x6f\xcf\xbb\xd1\x62\x13\x87\x10\x69\x07\xc4\x5e\xe9\xf3\x10\x28\xae\xe2\x88\xd8\x37\x47\x68\xfd\x5c\x95\xc7\x72\x59\x6a\x98\x6c\x1c\xe3\xe0\xc0\x7f\x8e\x85\x96\x2a\x89\xc9\xf5\xf7\xcc\x34\xe3\x4c\x21\x8e\xd2\xd0\x82\xca\xab\xcf\x4d\x99\xe7\xf8\x5e\x7d\xf9\xd4\xe2\x28\xa5\x28\xcc\x72\xb4\xf1\x45\x9f\x98\xc5\x91\x16\xa8\x94\xf6\x91\x15\xa8\x3b\x33\x49\x03\xdd\x28\x42\x79\x12\x79\x9a\x37\x06\x65\xa6\x82\xfa\xf5\xbe\x54\x6f\x83\x48\x34\x26\x3c\x8c\x87\x06\x1d\x8b\x7a\x9b\x8b\xf7\x4e\x63\xdd\x8f\x92\x31\x56\xc1\xdb\x55\xcc\x3d\xa7\x45\x8d\x95\x91\x71\x1b\x61\xfc\x21\x6d\x5b\x5a\xab\x42\xdb\xc6\xdc\xe0\x6b\xe3\x28\xc1\x10\xe2\xe4\x79\x6d\xcd\x15\x44\xb9\x8a\x63\x1e\x61\x41\x74\x7b\x3b\x7a\x8c\xb1\x14\x08\x4c\xeb\xd9\x47\x37\xa2\x78\x5b\x9e\x7d\x5c\x13\x33\x4a\x31\x73\xbe\x2d\xa7\x68\xa9\xf6\x18\x78\xdf\xdc\x5d\x79\x7a\xea\xab\x91\x31\x4b\x34\x9a\x08\xff\x78\xba\xbd\xaf\xda\x49\xfd\x33\x2b\x26\x1f\x4e\x58\x14\xcb\x9e\xe2\xe1\x0a\x43\xf3\xe8\x66\x15\xf3\x40\xb9\xd6\x51\x9b\xa0\xcc\x80\xa4\x55\xcc\x9d\x9b\x65\x0d\x85\xb6\xfd\x15\x7f\x35\x3c\x4e\x90\xdf\x22\xf2\xf2\x55\xf4\x7f\x14\x18\xd9\x59\x6e\xf4\xf6\x7c\x82\xea\xb6\x12\x87\xa1\x1b\xb7\x8a\x39\xe7\x58\x17\x79\xf0\xfa\x6f\x3e\xd0\x88\xd3\x80\x23\x98\xfa\x01\x72\x24\xae\x62\xa7\x79\xbf\xaa\x54\x14\x91\xd1\x1d\x4e\x65\x88\x71\x43\x9b\xda\x3a\x28\x22\x5c\x50\xb1\xbe\x6a\xa9\xab\x38\xd5\x61\x6a\x3a\x7c\x2e\x6e\xd5\x3e\xcf\x89\x85\x8e\xf1\x95\x70\xb4\x92\x91\x04\x87\x8a\x65\xa0\xbd\x4d\xe5\x43\x56\x8c\xf1\xdc\xfd\xf9\x65\x68\x4c\xe2\x5b\x9c\xe5\x05\x2e\xc1\x8f\x4a\x92\x58\x0e\xe5\x10\xa6\x67\xe1\x8c\x3a\xe5\xad\x9b\x52\x54\xda\xaa\xf5\x6e\x4f\x42\x4d\xf5\xff\x87\x19\x81\xff\xb0\x92\x72\x4c\xb8\x43\xbb\xf6\x5d\xf9\x95\x4a\xbc\x8a\x25\x50\x2c\x4e\x99\xb2\x7a\xbb\x6a\x2f\x72\xe5\xa3\x46\x59\xf5\x84\xf2\xd7\xb8\x83\x30\x19\xa7\x12\x4b\xa2\x6c\x03\xec\x0a\x84\x45\x14\x8c\xde\x50\x4d\x99\x37\xb3\xb4\xb6\x74\x48\xf1\x82\x66\x00\x86\x1f\xef\x71\xb1\x4e\xe2\xd4\x39\x9b\xfa\x09\x8f\x90\x24\x67\xf0\xe5\x46\x01\x53\xb8\xdb\xb5\xf1\xfc\x06\x0e\xdd\x9f\x0d\x43\x3e\x03\x34\xaf\x6e\xe7\x5b\x9d\xab\x72\xd9\x01\x03\x55\x6c\xb4\x95\x9a\x6d\x2c\xf8\xdb\xf8\x33\xd2\x00\x38\x0f\xa6\xf6\xce\x6d\x58\x3f\xd5\x58\xf2\xf1\x3b\x0d\x85\x85\xa5\x7a\xf3\xc4\x83\xa3\xf2\x0c\x6f\x00\x25\x4e\x80\x75\x57\x9d\x4f\x5d\xea\x44\x89\xb1\xee\x38\x52\xa8\xb7\xed\xe1\xd0\x6e\x6f\x03\x76\xaa\xa2\x71\x68\xa5\x2a\xf7\xce\xdf\x6d\x79\x9e\x24\x7b\x34\x8e\x22\xec\x96\xaa\xbd\x82\xa2\xa9\x9f\x1d\x11\x6c\x68\x0c\xa8\x68\x4c\x83\xd8\xb2\xd5\x7f\x39\xdb\xda\xd5\xed\xcb\x28\x24\xa5\x31\x57\xe8\xdc\x61\xca\x0a\xb2\x43\x61\xa5\x45\x30\xf9\x19\x5f\x10\x58\xf9\x3e\x07\x96\x6c\x57\xa5\x75\xff\x35\x46\x7a\x21\xda\xed\x6b\x76\x72\xb8\x6a\x8f\x07\x9b\x7d\xcc\x94\x72\x89\xa2\x2c\x4f\x9b\xf5\xcb\xc3\xf2\x69\xed\x63\x70\xca\x02\x83\x30\x00\x0b\x04\xf2\x45\x86\xd9\xf9\x47\x19\xb1\x0a\xfb\x56\x4c\x2e\x2b\xb5\x63\xb1\x4f\x46\x31\x30\x6e\x9f\xea\xa0\x4c\x03\xd1\xb9\xd9\x7c\xc4\x7f\x94\xa7\x91\x53\x48\x7a\x06\x64\x0d\xb5\xbf\xfc\xbe\xcd\xc0\xab\x49\x84\x47\x13\x17\x8c\x1c\xa0\xb1\xfa\xc9\x8e\x4e\x3c\x8c\x31\x69\x42\xac\x89\xb8\xd0\x7a\xdf\xa6\x91\x95\x1e\x4f\x97\x84\x1a\x67\x7c\x51\xe8\xdb\xec\xbd\xde\x95\x5e\xe5\xd4\xdf\x9f\x44\x10\xec\xb0\x95\x95\x50\x6d\xb0\xbf\xff\x2f\x72\xc0\x86\x21\xc4\xbf\xc3\xff\x9d\xdc\x28\x1e\x46\x88\xb8\x6f\xb0\x56\x3c\xe3\xb9\xa7\x28\x57\xc4\x18\xdf\x4a\x79\xc8\x0a\x18\xcf\x13\xae\x03\xd4\x61\xde\x9f\x8b\x5a\x18\xb8\x45\x09\x06\xdb\xaf\x9e\x2c\x76\x34\x4d\x23\x3c\xd3\xbf\x44\xa1\x45\x37\x83\x52\xc1\x70\x0b\x72\x8a\x56\x37\x5e\xae\x68\x22\x0a\xa0\x68\xaa\x42\xac\x16\xde\x2d\x97\x43\x48\xb8\x3f\x8f\x20\x29\xea\x3b\xdc\x3c\x3f\x3f\xdd\x77\x7f\xa4\xc2\x03\xa3\x37\xe8\xbb\xf5\x78\xbe\x52\xa0\xa3\x82\x4a\xd5\x07\x52\xdd\x7c\x9d\x54\xaa\xae\x6e\x38\x54\xa4\x01\xde\xca\x76\x69\xd8\xe0\x8e\x3b\x6b\x2a\xd3\x0e\xd4\x18\x5e\x89\x76\xe1\xba\x28\x63\x52\x09\x76\xee\x3a\x02\xba\x57\xd4\xf5\xbf\x48\x09\x8a\x76\x25\xeb\x53\x55\x16\xcd\xa8\x6c\x42\x95\x10\x98\xe4\x6e\x44\x03\xa9\xff\xa3\x26\xb6\x03\x5a\xb7\x8b\xe5\xba\xfe\x29\xb2\x26\x2b\x0e\xa8\x69\x3f\x69\xe1\x51\x9d\x1a\x21\x26\x16\xea\xa3\x4b\xd7\x42\xe0\xb5\xed\x8f\x22\x2b\x9a\x7d\xe7\xf5\x5a\x95\x47\xd4\xf9\x19\x9f\x0e\x84\x88\x1c\x45\x46\xdf\x7c\x5a\xa7\xa2\x1d\xfc\x6a\xc6\xe7\x04\x43\x03\x7b\xd1\xf5\xa9\x5f\x57\x4c\xc4\x7d\x4d\xa2\x80\x8f\xf2\x82\xe4\xac\xa8\x21\x61\x82\xdb\x74\x79\x84\x07\x68\x5e\x4b\x1d\x7f\xc9\x8d\x57\xd4\x70\x96\x50\xaf\xdc\xb3\x3b\x9f\xba\x48\x9e\x1a\xb0\x52\x10\x3b\x10\xc7\x21\xc5\x40\xb1\x80\x69\xac\xaf\xd8\x5d\xc7\x22\xcd\x90\x38\x31\xfb\x15\x2c\x48\x4c\xe8\x6a\x84\xb7\x9f\x85\x38\x66\x0a\xf5\x5f\x90\x98\x3e\x19\x29\x42\x9c\x99\xbb\xd5\xe2\xc1\x76\x36\xf6\x56\xed\xae\xfb\x66\x43\xa4\x75\x35\xfd\x5c\x35\xaf\x4b\x51\xe9\x79\xfd\x01\xc5\x42\x29\x50\x72\x71\x09\x79\x9d\x9d\xeb\x4b\x3f\x8d\x76\x88\xc6\x88\xb4\x7e\x2d\x3f\x2c\x3e\xc5\x1f\x30\x91\x54\x88\x3c\x54\x6f\x59\x71\x40\x33\xf5\xe8\xdb\x45\xb3\x8b\x45\x44\x3b\x30\xf2\x28\x81\x3f\xcf\xe9\xe1\xcf\xba\x84\x2b\x16\xc5\x02\x27\xe2\x7f\x9b\x4f\x47\x40\xeb\xd4\x45\xdb\x83\x1a\x2b\xd7\xc7\xac\x68\x9e\x64\xf6\xa7\x2a\xb3\x62\xa2\x57\x32\x3e\x1b\x49\x52\x8c\xa3\xf7\x35\x34\x3d\x61\xb0\x39\x8f\x05\xf4\xb8\x1f\xcd\x49\xc2\xba\x42\x54\x1b\x34\xf7\x0b\xfd\xcd\x67\x67\x30\xf2\x17\x32\xf9\xc3\x79\xcb\x88\x62\x8a\xb8\x53\x5a\xd5\x6c\xf1\x17\x92\x8b\x8a\xc5\x01\x43\x50\xe2\xf1\x73\x5d\x98\x4a\x0c\xc5\xaf\x26\x3f\x2f\x76\xf2\x19\xa7\xb3\xc4\xea\x9f\xfb\x33\x4d\x02\x44\xb1\x8b\x36\x77\xb5\xe4\x9b\xf9\x70\x89\xd1\x44\x39\x6b\xc9\xc6\x71\xfe\x5e\xb6\xb7\x98\x8e\x15\x22\x1f\xbd\x81\x8c\x71\xcb\x2a\x3b\x40\xf3\x1d\x8a\xb2\x99\x4a\x96\x29\x96\xb4\x3b\x79\x6f\xe2\x81\x2b\xe9\x4d\xf9\xeb\xdb\x4c\x8d\x8e\xc5\xa3\x5f\x1f\x46\xfe\x11\x24\x22\x11\xc2\x37\x1e\x96\xe5\xf1\x94\x43\x5f\xb1\x62\x09\xa4\x3e\xe8\xb6\xf1\x8a\x7b\x96\x5d\x5a\xc1\x38\x4d\xb0\xf0\x8d\x00\x07\xec\x89\xf9\xe2\x0b\xe3\x8c\x2b\x0b\xd4\xfb\xcf\xb9\x6e\x10\xd8\x33\xb0\x46\x57\x8c\x1b\xc0\xe6\x5c\xbb\xad\x78\x9e\xa6\x3f\x96\x0a\x8d\xa5\x39\x87\xa7\xf2\xa5\x4b\x26\x02\x85\x91\xd8\xf7\xb3\x28\x0e\xcf\x50\x1c\xd0\x07\xa3\x3b\xca\x19\xb3\xf4\x64\xec\x84\xed\x85\x52\xd5\x19\xf4\x3e\x73\x92\xa7\x7b\x51\xe8\x0e\xf3\x76\xe5\x11\x4b\x96\x22\xa8\xb6\x12\x0d\x0c\x22\x51\x26\x13\x15\x6a\xef\xce\xf4\x57\xfe\x7f\xfe\x33\x6e\xf3\xb7\xfa\xcb\x2e\xd5\x98\x1f\xaa\x20\x45\x30\x87\x2b\xe4\x6e\xa1\xd0\x4b\x71\xca\x9a\x2b\xe6\xbc\x8a\x69\x12\x62\xcc\xf9\xeb\xd7\x2f\x7f\x89\x3a\xa6\xc9\x50\xa8\xbe\xb6\x8b\xa6\xab\xa8\xec\xca\x0e\xad\x31\x39\x13\x8b\x31\xff\x73\xa5\x1e\x27\x85\x3a\x75\x27\xf7\x83\x41\xe2\xfa\xf7\x52\x64\x65\x81\x37\x7f\x14\x78\x30\x20\x56\xe3\xb2\xbd\x06\x6b\xe1\x36\xfe\x32\x30\x24\x89\x5d\x51\xbe\xb2\xbc\x6e\x14\x84\x79\x32\x37\xd0\x4c\x5d\x5f\xbc\xb5\x47\xf7\xa6\x1a\x16\xa4\x96\x89\x65\xd9\xf0\xd9\x3b\xa0\x52\xda\xe8\x1e\xb9\x45\x26\x4c\xa3\x4b\x78\x00\x33\x8c\xa0\x8a\x04\xc6\x63\xb0\x6e\xfe\x31\x0c\xc7\x86\xef\x5f\x12\x10\x16\x39\x49\xa4\xad\xf5\x29\xb0\x36\xc2\xd7\x48\x14\x5f\xfd\x33\x1c\xee\x2e\x6f\xbc\x14\x26\x41\x6c\x99\xf5\x76\x29\xfc\xf5\xb9\x3c\x5f\x2a\x7b\xb6\xf9\x1b\x03\xf7\x3e\x3e\xe1\x0f\x58\x3c\xaf\x67\xcb\x64\x49\x94\x30\xac\x82\x39\xef\xd6\xf3\x84\x1e\xe9\xbf\x36\x02\x8b\x96\xb0\x2f\x45\x59\x1d\xb7\xd0\xce\x94\xaf\xca\x7d\x09\x09\x12\xe3\x00\x5e\xfb\xa6\x3c\xe5\x5e\xc6\x7b\x7e\xc9\x4b\x48\xa4\x71\x7a\x61\xe2\xb3\x2b\x7f\x42\xf6\x6d\x72\x3e\x6a\xed\x9e\xff\x53\xca\x7e\x01\xb2\x9c\xc0\xbf\xf4\xad\xf5\xa7\x60\x41\xe8\xda\xb8\x2f\x85\x2a\xab\x0a\x72\x44\x58\x3f\x4e\xbe\x2a\xd6\x14\x97\xa4\xed\xf9\x0a\x72\xd8\x8d\xa3\x2c\x46\xe9\xd9\xdb\x9f\x0f\x8e\xa1\xa1\x12\x2a\x99\x17\x3a\xbf\x85\xf7\x8b\x12\x52\x42\x4d\x60\x9d\x94\xdb\x68\x65\x84\xcc\x49\x58\x68\x11\x93\xf2\xfc\x79\xfb\xb4\x5b\xfe\x98\x7c\x92\x45\x56\x76\xa9\x0d\x03\xf6\xae\xa4\xbb\x2f\x4d\xbf\x6c\x49\x10\xed\xc4\xdc\xeb\xb1\x94\xa7\xfb\x78\x22\x62\xac\x50\xdd\xc3\xf1\xd8\x05\xde\x49\xd2\xe6\x08\x96\xf7\xdd\xae\x85\x58\x6a\x71\xf9\x96\x1b\x21\x02\x8e\xf4\x86\xac\x5e\xf8\x98\x77\x7c\x5d\x82\x58\x29\xe2\x7d\x5f\xca\xb0\x6b\xd8\xc5\xa3\xfe\x9f\xe9\x07\x55\xaa\x7d\x7d\xdd\x36\xfb\xae\x58\x02\x76\x1f\xd0\x03\x9a\x63\x9b\xb2\x22\x7c\x7f\xce\xf7\xf5\xa2\xc6\x3d\x3e\x93\x0c\x03\xdc\xcf\x8e\x50\xbd\xe5\xb0\xab\x00\x36\x65\x39\x41\x4b\xaa\x44\x52\x12\xd8\x90\x5a\xa1\x02\x67\x23\xf2\xd1\x32\x96\x48\x63\xed\xe5\x9a\xf6\xf6\xbf\x23\x3b\xfe\xe7\x2b\x14\xbe\xf1\xed\x37\xc8\x44\x53\x82\xa5\xb7\xdb\xa7\xcd\x65\x7f\x36\x31\x44\xa4\xae\xa3\xe9\x4c\x29\xda\x9d\xba\xac\xda\xf5\x24\x47\x54\xec\x1d\xa0\xea\x40\x3b\x13\xfd\x67\x68\x82\x58\xde\x36\xe4\x5a\x76\x7f\x64\x36\x8b\xea\x54\x25\xb0\x16\x55\xbf\x66\xa7\x87\x52\x43\x7e\xf3\x69\x6b\x39\xf3\x4f\xc3\xa4\x5c\x39\x86\xf1\xe6\x5c\xf4\x00\x4f\xc5\x83\xc0\xd2\x6c\x32\x04\xb6\xed\x5f\x21\x3f\x0d\xb8\x7d\x9d\x90\x76\x77\x2a\x1e\xd2\x08\x45\x68\x1e\xdb\x6c\x65\x98\xe4\xf0\x50\x2a\x63\x55\x95\xbc\x86\x42\xf3\xfa\x21\x3e\xeb\xee\x38\x58\xef\xb5\x4a\x64\x35\xcc\x75\xbb\x79\x94\x5a\xbd\xec\x39\x5f\xd4\x51\x25\x87\x47\x22\xc0\xa2\x3c\x72\x7f\xfa\xfa\x7f\x1f\x95\xf0\x38\x0e\xb1\x5c\x21\xc5\xdb\x9b\x18\x5d\x67\x9c\xa6\x60\x2d\x01\x00\x3a\xb2\xa1\xe2\x34\xb1\x18\x8b\xfa\x7c\x5c\xd9\x27\xe3\xfc\xfa\xa2\x6e\xf3\xe1\x54\xf3\x34\xb0\xf8\xba\x36\x54\x6d\xc3\xc4\xac\x38\x8c\xeb\xfa\x9c\x02\x50\x47\xda\xb9\x11\x75\xa6\xd6\x85\x2a\xbb\xc6\x13\x67\x49\x80\x16\x8f\x50\x58\xd6\x2d\xaa\x7b\xc4\xdd\x51\x4e\xb1\x42\xf5\xf3\x8f\xed\xfd\x17\xea\x4f\x6e\x74\x12\x50\x04\x5b\x8c\x28\xfd\xff\x3f\xff\xed\x7e\x63\x12\x58\x4e\x6b\xed\x4a\xd9\x50\x39\x41\xc3\x71\x53\xc1\x3f\x89\x84\xab\x34\xe9\xc5\xaa\x11\x9f\x8c\x6e\x8d\xed\x7f\xf9\x40\x90\x27\x69\x67\x3b\x6d\x5f\x83\x36\x19\x1f\xf9\x07\x28\x9e\x68\x00\xd5\x81\x8e\xf0\xd7\x3b\xe1\xe2\x31\xc3\x71\x7c\xb7\x53\x9a\x86\xbe\xce\x85\xfd\xa4\x27\xd3\xc9\x21\x8d\x67\x57\x6a\xc2\x24\x1e\xf6\xa8\xda\x9f\x77\x93\xf9\x17\x99\x8b\x10\xb0\xaf\x76\x44\x31\xfd\xf6\xcd\x1a\xaf\xe1\x5c\x10\x1e\x39\x18\x36\xf2\x51\x1c\x19\x6c\xc6\x1b\x50\x71\x91\x24\x08\x7e\x17\x95\x7a\xcd\xde\x2f\xb3\x6b\xae\x62\xea\x91\x88\xdb\xac\x8d\xf6\xae\x64\xae\x5c\x09\x8a\xad\xba\xba\x29\x4f\x5b\xab\x0f\x3a\x9c\xe7\x4a\x0a\xe2\x4b\x79\x67\xc4\x00\x62\xaa\xb8\x85\x66\x3b\x67\x5b\x3f\x39\x37\xd8\xf9\xac\xb3\x5a\x9e\xab\x7a\x52\xf1\xe0\x3a\xa2\x98\x83\x9e\x30\x10\x04\xbd\x1f\xc0\xc0\xfd\x4d\xd1\x34\x04\xd6\xd9\x19\x35\xa3\x24\x9d\x6b\x6a\xb3\x5b\xcc\x8a\x66\x31\x55\xe3\x87\xa9\xb5\xb6\x2a\x6f\x3a\x6b\x06\x1c\xa0\x2f\x60\xa5\xbc\x4d\x4f\x8c\x35\xdf\x3b\x66\xcd\x4f\x6f\x73\xd8\xff\x46\x10\x0a\x95\xf9\xa1\x40\x8e\x75\x27\x72\xa2\xb8\x49\x68\x12\xf4\x86\x63\xf7\xe5\x21\x53\x7f\xaf\x89\x91\x06\x90\x22\xc3\xa4\xdd\x1c\x2c\xa4\xd0\xc9\xac\xab\x34\x4c\xad\x7a\xd7\x4e\xbc\xc1\xd3\xb4\x0a\x9c\x86\x82\x21\x59\x0b\x1d\x13\x56\xbf\xb2\x09\x6b\xf8\x32\x5c\x4d\xa3\x10\xd0\x99\x18\x13\x88\x1f\x90\x55\xbd\x01\x99\x1f\x21\xad\xf1\xaf\xf2\xae\x14\x36\x8b\x1f\xef\x67\x69\xa4\x84\x25\xdd\x9c\x9b\xd2\x67\x40\xea\xa2\x98\x97\x92\x90\x84\x64\x9e\xa7\x76\x7b\x1e\x54\xbd\xc6\x3f\x8b\x84\xb1\x37\x2a\xb1\x74\xf6\x2f\x37\xfb\x94\x10\x88\x4c\x6f\xd0\xf9\x79\x0b\x2a\x3b\x8a\x1c\x23\x94\xe7\x0a\x54\x56\xcf\x8b\x86\xaa\x34\x66\x0c\xb7\xc1\x36\x30\xca\xf3\xac\xee\xb6\x97\x34\x4e\xa5\x36\x83\xbc\x7a\xe0\x33\x35\xfe\x72\x2a\xe3\xc8\x19\x61\x0c\x94\xad\x54\x4a\x15\x4f\x47\xb6\xf3\x77\xde\x44\x7c\x36\xce\x48\x99\x8c\xf0\x52\xa4\x67\x4e\x6e\x60\x9a\x2b\xa5\x0c\x0c\xf2\x82\x5d\x31\xff\x6b\x48\x61\x9a\x84\x04\xa7\x7f\x6f\x33\x2c\x91\x62\xfb\x54\x74\xc1\xd3\xe4\xfc\x09\x51\xd4\x9b\x89\x59\x81\xa1\xac\x71\x7e\xdf\xe3\xfb\xc6\xa3\x80\xd9\x96\x23\xb6\x7c\xbf\x8b\xe3\xc0\xc3\x5d\xa5\x9c\x10\x5c\x9f\x8f\xe2\xd7\x4d\xa6\x5d\x29\xbc\x3b\xc8\x78\xe0\x18\xd5\x1a\xe0\x78\xf3\xe9\xbc\x07\x9c\x04\xd9\xd5\x50\x70\x66\x32\xa7\x01\x4b\xac\x30\x88\xc8\xbd\xd6\xd2\xf4\xf9\xa4\x61\xc2\x3d\xd4\xfc\xa5\xc8\xfe\x7b\x76\x12\xfa\xe5\xa4\x6a\x3b\x99\x19\x69\x42\xe2\xbe\x4c\xdc\xae\xeb\x5f\x49\x24\xab\x34\xe5\x21\xd6\x11\x74\x59\x0c\x77\x97\xb9\x4d\x2e\x4d\x35\x71\xc2\xbd\xc7\xf2\x1d\x9e\x45\x35\x91\xee\x56\xa9\xa0\x5a\x9b\x6e\xf3\xba\x29\x7d\x46\x9e\x0a\x49\x3c\xef\x1c\xf1\x3d\xc3\x72\x94\x1f\xa2\x13\x9c\x78\x05\x7c\x4c\x01\xd3\xd7\x56\xa3\xf1\x1d\x93\x2c\xc4\x19\x9d\x3b\xfe\xda\x94\x31\xa9\x52\x45\xe3\x54\xbb\x9a\xe5\xe1\x30\xac\xc1\xa4\x4a\x80\x4b\xc7\xdb\xdf\xb6\x1d\x79\x6b\x8d\xaf\x53\x09\x63\xed\x91\x45\xf1\x6d\x7c\xc0\xd0\xd8\x35\x52\xb6\x4d\x1b\x00\x8c\xda\x15\x93\xb3\x40\x9a\xa6\xb6\xa0\x78\xa8\xd0\xc1\xb0\x38\xc0\x15\x56\xc4\xdf\x55\xf2\x51\xa9\x89\xb8\x4f\x37\x3a\x22\x01\x1b\x6d\xb8\xa9\x91\x32\x0c\xbb\xbe\xb3\x6b\x53\x79\x30\x4e\x6a\x80\xe2\x6f\xbb\xd9\x3c\x3d\xfe\x6b\xb5\xf7\xfe\x26\xcf\xbb\x7e\x80\x40\x90\x76\x56\x5b\xbc\x50\x77\x6f\x45\x10\x24\x58\x72\xc2\xc5\xac\x86\x42\x47\xd7\x5e\xf3\xcb\xed\x4b\x04\x44\x3a\xfd\xdf\x36\x94\xf8\x21\x6a\x24\x8e\x0d\x2f\x5c\x04\x22\x42\xa6\x13\x9e\xff\x5a\xd9\x69\xe6\xd4\x61\x0a\x98\xc0\xac\x6b\x71\x2b\x72\xf1\xe1\xc1\x02\x22\xd2\x0c\xeb\x5b\x96\xd3\xf7\x55\xbf\x58\x44\x90\xc6\xc2\xd7\x24\x70\x09\xb3\xbe\xe8\x83\x02\x82\x20\xcc\x66\x52\x36\x73\x9b\x95\x0c\x56\x82\xe8\x18\xbf\x33\x53\x25\x9e\x21\x5e\x75\x4d\x4f\x11\x93\x14\x4b\x3a\xb7\xab\xdf\xf7\x58\x75\xff\xf1\x74\x7f\xbb\xda\xf4\x87\x15\x26\xa9\x8b\x5b\x4f\x45\x1e\xc0\xc3\x45\xcc\x34\x52\xe4\x65\x76\x58\xbe\x66\xaa\x8f\xf3\x05\xd5\x76\xed\xc5\xfb\xe6\xa0\xdd\x83\x40\x62\xf2\x83\xe7\xe1\x76\xee\x54\x2c\x10\xe0\x68\xd3\x0f\x90\xb7\x27\x9a\x5f\x8f\x45\x42\x03\x63\x1d\x7f\x30\x9b\x6e\xa7\x98\x7d\x23\xb7\x65\xde\xfd\xde\x44\x2a\x07\x53\xb9\xb1\x2b\xd4\x80\x9c\xe3\x6f\x2a\x8f\x29\x42\xee\x36\x8b\xc9\x37\xf0\x18\x8c\xea\xf3\xd6\x9d\xf8\x35\x0a\xb9\x04\x97\x4c\x49\xdf\x15\xb4\x15\xdb\x61\x18\x20\x52\xa1\xe3\x5e\xe0\xb9\xdd\xac\x51\xf6\xe5\x0d\x8a\xdf\x05\xca\x32\xfb\x71\x46\xe2\x1b\xe5\x9f\xaa\xfb\xb9\x7f\xf1\x5a\xba\x0f\x8b\x40\xd9\x98\x55\xe4\xe0\xd3\xff\x8d\x68\x80\xfa\xb3\x0b\xaa\xf0\x2a\x6b\xeb\x6b\x79\x3a\xcd\xef\xb1\x42\x8a\x38\xb4\x9e\xb0\x18\x20\xa0\x47\xa2\x3f\x87\x54\x14\xf5\xb5\xcf\x35\x54\xbf\x97\xa8\x67\xfc\x75\xb8\x2b\xa4\x4a\x3c\xa3\xc3\xe6\xd0\xb7\x60\x60\xca\x1f\x13\x12\x08\xce\xb7\x13\x34\xaf\xcf\xab\xcd\xd4\x3c\x52\x09\x45\x42\xdf\xc4\x76\x96\xc8\xb6\xb5\x53\xcf\x48\xc9\x2a\xa1\x12\x89\x0d\x62\x24\xb5\xed\x16\xfe\xea\x35\x15\xf1\x20\xf8\x44\xa4\xec\xd7\x35\x15\xa1\x75\x8a\x04\xcf\xac\xc8\xdc\xf5\x77\xf7\x02\x12\x15\x99\x01\x79\x00\x41\xaa\x16\x9d\xea\x47\xa4\x71\x22\x7a\xac\x24\x4e\x4f\x1b\xaa\x8d\xe7\x8f\x09\x13\xc4\xa4\xb7\x67\x78\xcf\xf2\xbc\x5b\x35\x8c\x0a\x71\x7f\xc5\x4a\xd0\xf9\x70\xf0\xac\x3d\x19\x24\xd6\x3f\xa8\xdd\xaf\x1f\x06\x8e\xaf\xfe\x30\xe7\xc8\xdf\x78\x58\x6d\xd6\xb7\xeb\xc5\xa3\xfd\xa5\x33\xe9\xac\x0c\x74\x6c\x89\x47\x5d\xf8\x33\xd7\x66\xba\x7c\x3d\x65\x18\x05\xa8\x7c\xbd\x7a\xdc\x4e\x68\xa2\x32\x4c\x6c\x2d\xa5\x86\xe6\x7c\xfa\x3f\x6f\x32\x17\xed\xa2\x8b\xaf\x8e\x02\x83\xe9\xcf\x2d\xbc\xf7\x02\xf2\x4a\x46\x34\x32\xf6\x51\x75\x32\x6c\x9d\xb2\xb4\x92\x91\x96\x68\xa7\xb4\x01\xed\x38\x81\x5f\x6f\xf7\xee\x63\x44\x4a\xcc\x2c\xec\x2b\xf9\x3d\x2f\x65\xfb\x46\xa0\xb6\x7a\x36\x05\xc9\x4b\xa2\x53\xec\x3d\xa2\xf1\xe1\x4a\x67\x4d\x59\x6d\xb2\xc3\xeb\x14\x8b\x26\xa9\x34\xca\xb9\x9d\x0f\xcb\xef\x7f\x91\x06\x4d\xae\x8c\xc5\x96\xbb\x02\xcd\xeb\x16\x4d\x7f\xfd\xdf\x85\x45\xce\x35\x67\x79\x27\xa4\xff\x6b\xc2\x39\xfa\x82\xee\xb2\x26\x87\x5b\xa4\x47\x4c\xc4\xe9\x94\xe4\x91\x4e\xd2\x0e\x83\x58\x89\x6a\x08\x6e\x91\xa9\x08\xa2\x11\xdc\xf4\x8b\xb0\x45\xa6\x0a\xac\xc3\xb1\x78\x83\xe5\xbc\x3f\x8d\x92\x82\x19\xfc\xbe\x7d\x56\x5b\x06\xee\x74\x81\x9f\x0f\x6e\xfd\xa7\x05\x08\xb7\x22\xec\x4f\xb6\xfa\xb0\xd7\x13\x98\xd8\x68\xaa\x0b\x80\xc8\x2f\x90\x88\xfd\x1f\x04\xe3\x52\xb2\x04\x1f\xc9\x5d\x59\x5e\x32\x31\xa5\xa2\x02\x21\x94\x37\xe7\xaf\xe5\x73\x95\x54\xd2\x0a\x83\xdc\x40\x9e\x8b\x9b\xfc\x3c\xac\x82\xb5\x5b\x10\x32\x0d\xb1\xbc\x59\x9f\x33\x95\xe9\xee\x02\x74\x40\x43\xa7\xdc\xd0\x2e\x0d\xf7\xf0\x0e\x93\xc4\x46\x6a\x91\x22\x3d\xfa\xe4\xe4\xa8\xf6\xc7\x8d\x0d\x0f\xf2\xb2\xb9\x85\x77\x9f\x41\x8c\x2f\x08\x04\x27\xba\xab\x27\x88\x7c\x03\xa2\x9e\x78\x57\xb7\x83\x6c\x34\x70\x80\x69\xf2\xf8\xef\xff\xb5\x05\xc9\xbe\xfa\x21\x41\x00\x82\xb4\x3f\xd0\xb0\x7d\x72\x26\x23\xc1\xda\x14\xa0\xcf\xab\x5d\x4d\x9c\x52\xc0\x29\x87\xde\x47\xf3\x6a\x08\xa5\x02\xb0\x22\xb3\x6f\x99\x7a\x53\x59\xf3\x39\x54\x41\x50\x2a\x24\xba\x07\xe0\x9c\x46\x0b\xb2\x0a\x95\x41\x92\xae\x9b\x0d\xd8\xdf\x7d\xef\x56\x00\x15\x42\x82\x95\x15\x2b\x89\x8c\x5e\xcd\xcd\xb0\x18\xa6\x22\x1a\x60\x48\x2f\xec\x02\xd1\xab\x49\x28\x15\x73\xe3\x11\x7a\x1b\xa8\xcb\xfc\x1d\xaa\x45\x57\x5f\x99\x31\xc3\x51\x8a\xc6\x11\x32\xc0\xf1\x42\xbf\x43\x01\x75\x47\x5a\x83\xee\x8a\x59\x2a\x50\x91\xcb\xde\xad\x47\xf8\x78\x16\x95\x82\x7c\x8c\x4e\x9d\x9c\x98\x49\xd1\x79\x41\xfe\x5c\x3f\x77\xa7\x02\x81\x88\x9b\x53\x79\xb2\x6f\x27\x5e\x94\x33\xa9\xf4\x63\x4c\x48\x7c\xc4\x5e\x1e\x4f\x79\xd6\x5e\xfe\x16\xaa\xf7\xec\x1a\x55\x44\x25\x41\x4a\x5c\xd7\xe9\xb9\xcc\x33\x5b\x62\x04\x3d\x0f\xdc\x52\x49\xa4\xf0\x47\x2f\xbd\xcc\x75\x5f\x37\x99\xbd\x49\x09\x07\x04\xe5\x6e\x16\x8f\xdf\x57\xab\xc7\xdb\xbd\x2f\x5e\x2a\x1e\xa4\xb8\xb9\xde\x3d\xbd\x6c\x76\x3f\xf6\xbb\xf5\x6a\xb3\xbf\x5d\x6f\x97\x03\x50\x88\x12\x21\xd1\x56\x70\x69\xef\x0c\x93\xc6\x2f\x8c\x92\x91\x65\xdc\xdc\x95\xa5\xf6\x5d\xd8\xb1\x36\x51\xb7\x2c\x0d\x8a\xee\xf3\x6f\x76\x7b\x2b\x7c\x91\x06\x73\xb9\x45\xf3\xed\x5a\xc7\xb1\xff\x90\x8e\x12\x94\x7b\x5a\x8a\xe6\xb5\xbd\x7d\x03\x3a\xad\x82\x24\xf0\xfe\xa5\x3f\xca\x8f\x07\x51\x7c\xfe\xc4\x37\xaa\x9b\x1d\x86\xa5\x1e\x8a\x70\x03\xd3\xd2\xaa\x32\xdc\x02\x5d\x4e\xaf\xd9\xcf\xae\xff\xa4\x83\x10\x50\x7c\xce\xf5\x9f\xc6\x55\x05\x1d\x24\x1c\x2b\xa4\xb7\xc7\xfc\x0b\x36\xb2\x0e\xa4\x15\xae\xb8\x21\x64\x33\x5c\xc0\x74\x44\x12\xcc\xe7\x8a\xf2\xfc\x0e\xe2\x6c\xd7\xeb\x8b\xbb\x79\xf9\x52\x6b\x12\x84\x88\xb1\x3c\x89\x4f\x29\xd4\xdb\x06\xfe\x7b\xce\xaa\x2e\x9d\xd3\x24\x48\x50\x39\xcc\x47\x21\xdb\xb3\xfc\x3a\x2e\xd3\x24\xb0\x4e\x33\x15\xc2\x2f\xbe\x43\x31\x8f\x39\xd6\x44\x3a\x80\x7b\x05\xeb\xe5\x53\x1b\x2e\xd4\xf7\x60\x26\x8b\xa4\x8e\x69\x92\x38\xa6\x4e\x75\x9e\xd6\x95\x35\xe5\xdc\x11\x02\x91\xc7\xbd\x01\x0d\xc7\xd3\xac\xac\x40\xbf\x4a\x6a\x16\x08\xee\xd4\x89\xef\xb2\x5a\x89\x7c\xda\x65\xbf\xea\xa5\x34\xbe\xb4\x84\x44\xb8\x44\x38\xd6\xc8\xca\x61\x76\xbf\x75\x87\x79\xdc\x37\x9c\x9f\x2b\x38\x66\xe7\xe3\xd2\x6d\xd1\xd3\x46\xb6\x4e\x58\x8c\xd2\x81\xaa\x2a\xeb\xfa\xae\xac\xde\xee\x7a\xd2\x96\xe6\x32\xc5\x9c\xfa\x54\x96\xf9\x2d\xf2\x13\xfc\x01\xcd\x45\xea\xc5\xeb\x77\xd0\x9b\x4f\xb8\xe3\x29\xd5\x18\x19\xec\x4d\x05\x70\xa5\xfe\xed\x56\x08\x2d\x48\x82\x30\x53\xa8\x44\x0d\x1b\x44\x23\x4c\xd8\xdc\x5a\x68\x83\x6c\x6e\x57\xe3\x7b\x2c\x9b\xd5\x7f\xcf\x97\x80\x8c\xd1\xe6\xae\x65\x90\xf2\xd4\x37\x3b\x7e\xad\x8e\xa7\xea\x5c\x34\x43\x0b\x5f\x3f\x8e\x53\x6c\x51\xe5\x60\x9a\x68\x32\x0b\x14\x31\x18\xb7\x6e\x77\xff\x78\xc6\xe9\x32\xbf\x26\x6a\x45\x2d\x23\xdf\xcf\x07\xd1\x74\x2b\xba\x56\x60\x25\xa5\x6d\x81\xfa\xa9\xe8\x1e\x14\x04\xc6\x04\x03\x9a\xde\x56\x89\xe3\x4a\x54\x45\x2f\x41\xaf\x34\x10\x85\xfa\x28\x37\xb7\xeb\xd1\x6b\xd7\xee\xb8\xae\x07\xbe\xfd\x2c\xca\x53\x9d\xd5\xa3\x4c\x5f\x83\x21\x98\x96\x89\x43\x05\xf3\x2e\xed\x0a\x82\x40\xd1\x60\xc0\x30\xb1\x51\xac\xfb\x0a\x08\x03\xe1\x45\x71\xf7\xdb\x53\x59\xd4\x65\x05\x7a\x6f\xd3\x94\x7d\x56\xec\xff\x5f\x29\xf7\x37\x9f\xfb\x89\x6d\xfb\xe4\x2b\x42\x08\xd1\xa9\x0a\x19\xb8\xf3\x6b\x0b\x44\x0c\x94\x53\x2a\x18\x86\x97\x10\x31\x0b\xb7\x74\xbe\x03\xab\x42\xd7\x8b\xa6\x3b\xc8\x21\x89\xbc\x99\xec\x71\xda\x8a\x07\x12\xa4\x91\xab\xc8\x3e\xcd\xbe\x98\x6e\x5c\x9c\x24\x9a\x77\x79\x78\xa7\x02\xdf\x91\x62\xbe\x06\xfc\x03\x75\xb0\xac\x8b\xaf\x71\xc7\x59\x44\xb8\x05\x13\x9d\xd0\x56\xe2\x5b\xf7\xf7\x18\x53\x25\xb4\xc7\x00\xbd\xdf\x3c\x6f\xbb\x43\x49\x88\xf2\xc9\xcb\xf2\x7c\x2a\x8b\x89\x67\xe8\xbf\xa3\x7e\x21\xe5\x13\xb0\x32\x30\x61\x31\xa1\xbf\xdd\xfc\xf6\xff\x86\x93\x05\x12\x9d\x5a\x1f\x03\x55\xee\x6d\xdd\xad\x3b\x02\x4e\x89\xf9\xb3\x41\x60\xf2\x62\x7a\x1f\x79\x98\x20\x44\xfd\xb1\xb4\x3b\xd1\xc5\x2b\x37\xf3\xe6\x81\x0c\xa5\x97\xd0\x5a\x8a\xc2\xda\xe8\x7d\x61\xae\xa6\x40\x0a\xee\x83\xcd\x1f\xe4\x26\xd3\xba\x9f\x04\x4a\xa6\xc4\x16\xfc\xb6\xd9\xa1\x00\xfd\x58\xae\x0a\xe5\xb6\x59\x37\x44\x47\x0a\xd1\x56\xdb\x53\x95\x35\x7f\x0e\xf6\x53\xd0\x86\x7b\x61\x9e\x5b\x51\xbd\x15\xa5\x86\x4b\x3f\x20\x05\x20\x12\x6c\x5e\x7e\x87\xe6\xc1\x49\x76\xf7\x74\x6d\x30\x91\x44\xa0\x92\xd5\xc8\x74\x32\x9b\xf3\xd3\xc1\x10\x85\x01\xc1\xb6\x41\x08\xb7\x76\xa2\x07\xed\x12\x38\xfd\x4e\x93\x46\x32\x1c\x32\x5f\xc6\x7a\xad\x76\x94\x09\x78\x88\x29\xaa\xd3\x6c\xb0\xfd\xee\xac\x2c\x2e\x40\x2f\x26\x4c\x19\x56\xbe\x3d\xc8\xe3\xe8\xda\xc5\x73\x23\x2d\x48\xf9\xe1\x5c\x78\x5f\x52\x65\x42\x29\x93\xa8\xef\x1f\xeb\x39\xa8\xbb\x89\xa8\x56\xa9\x95\x12\x83\xa2\xc9\xde\xb3\x3a\x2b\x0e\xe3\xee\xac\x89\xb8\xc0\xfe\xbd\x65\x8b\x0e\xfe\x8a\x4a\x52\x7b\x44\x27\xb6\x59\x56\xd8\x1d\xd2\xd0\xd1\xa1\xa0\x72\x86\x1a\xf3\xf3\xc4\x10\x6d\xf9\x92\x28\x42\x73\x38\xe7\xa2\xb2\x32\x20\x26\xab\x8e\x23\xc1\x3e\x97\xa1\x0c\x37\x11\x13\x87\x02\xeb\x1a\x1a\x4e\x79\xf9\x39\x2d\xa5\xf9\x41\x44\x32\xfb\xc2\x3a\x47\x82\x53\x59\xb5\x93\x01\xdd\xa7\x60\x04\xdb\x31\x34\x32\x18\xa2\x38\xd8\x0e\xb8\xa2\xc7\x54\x77\x5b\x19\x9a\x18\x84\xf0\x9b\x73\x73\xae\x60\x8f\xfa\xd1\x7b\x0c\x3c\xfc\xa9\x58\x92\x44\x2e\xf0\x5b\x1f\x4f\xf9\xd2\xf9\x3a\xfe\x77\xbc\x0f\x9a\xc4\xcd\x2f\x2b\xb1\xf0\x76\x25\xd5\x36\x49\x6c\x4b\xce\xed\x8e\x36\xd1\xbb\x56\x26\x0d\x65\xc7\xea\x68\xdf\x85\x45\x53\x1e\xeb\xe5\xf5\x4e\x81\x49\x15\xe7\xc2\xcb\x3c\x0e\xca\x24\xee\xb0\x88\x23\x64\x14\x65\xf5\xc6\xce\x1d\xbb\x85\x5b\x2f\x87\xf1\x99\x84\x62\x58\x65\xbf\xc9\x9a\x2d\x9a\x4d\x3c\x94\x1a\x2a\xd1\xcf\x42\x19\x03\xaa\x1b\xae\x8b\xfa\x5c\x01\xfa\xb9\x75\xb7\x48\x26\x0a\x15\x68\x32\xe3\x25\xc2\xe6\xf2\x07\x23\x55\x82\x97\x83\x52\x8e\xce\x62\x17\x29\x2e\xab\xc2\x99\x13\xb8\x81\x8a\x93\xc8\xd5\x86\x3c\x83\xce\x03\x2d\xe7\xbc\xe5\x95\x51\x8a\xca\xce\xb0\xe7\xbb\x38\xc2\x36\xd3\x30\x16\x94\x98\xdc\x39\x05\x16\x75\xda\xd5\x47\x86\x9a\xe1\xca\xe8\x30\xd4\x2e\x98\x77\xed\x97\x09\xa7\xcd\x8f\x33\x69\xd0\xcb\x9b\xbb\x8c\x60\x90\x8a\x1a\x08\x62\xac\x7b\x28\x51\x3c\x7b\x55\x4a\x65\x80\x59\xf9\x89\x03\x34\xb8\x04\x65\xc5\x61\x7b\x3e\x1e\x45\xf5\x39\xd1\x88\x54\x06\x0c\xc3\xce\xd1\x76\xb5\xba\x5f\xed\x77\x4f\xbb\xc5\xfd\x7e\xfb\xf2\xfc\x7c\xff\x4f\x7f\x32\x13\x25\x78\xb7\x10\x19\xb7\x70\x68\xde\xb5\x83\xc5\x4d\xce\x66\x08\x20\xa6\xa2\x4d\x47\xed\x7a\x69\x6d\xae\x26\xf2\x16\xc6\x24\xa9\xd2\x3d\xd2\x76\xae\x20\x64\x0c\x4f\xb4\x45\xf9\x57\xc5\xc3\xe7\x3f\x5e\x16\x7e\x8b\x46\x11\x89\x42\xb7\x7f\x29\xb7\xe5\x11\x06\xe6\x49\xa3\x19\xa1\x83\x20\x90\xd8\x9a\xb8\xf1\x4e\xf9\xdf\xfc\x81\xc4\x8a\xa4\xd8\x25\xf3\x76\xf1\xf4\x6d\xfc\xc1\x30\xe0\xb8\x2d\x38\xc6\x8b\xc8\xc1\x01\xe9\x6d\xed\x74\xf2\x6d\x7f\x55\xab\xf3\x27\x8d\xac\xd3\xe4\x41\x1c\x61\x5d\x3f\x75\x72\x21\x3a\x08\x13\x2b\xa7\x5a\x43\xf3\x52\x94\x1f\xed\x5e\x77\x3e\x3e\x99\xd5\x2f\x4b\x62\xa9\x6d\x97\x7c\x78\x56\x37\x35\x75\x10\xa6\x11\x0a\xc2\x80\xce\x9a\x15\xea\xf4\x5d\x5f\x08\xdb\x7c\x10\x30\xb0\xbb\x79\xfe\x03\xc5\x90\x3a\x33\x03\x1d\x44\x81\xf5\xeb\x3d\x96\x45\xf3\x3a\x9e\x87\x3a\x88\x52\x66\xdb\xaf\x8e\xb7\x8a\x9d\x8a\xee\x93\x46\x62\x5a\x5b\x60\x48\x33\x08\x3f\x74\x40\x78\x8c\x89\x7b\x59\xc0\x73\x7e\x9e\x9e\x35\xe6\x21\x71\x48\xda\x1b\x51\xc3\xb6\x11\xc7\xac\x10\xd3\x41\x2a\xc5\xa5\xd6\x16\x6a\x7e\x03\xd7\x5c\x77\x2b\xc0\x68\x28\x95\x0a\x85\xca\x3c\xfe\xad\x1e\xc8\x50\xe8\x80\x2a\x6a\x05\x57\xbd\xb3\xa6\x84\xbb\x2a\x83\x02\x8b\x01\xc3\xfa\xed\x5f\x75\x3c\xaf\x3c\x5e\xaa\x43\xcd\x07\x4a\x31\x1d\x78\x66\xd5\x5f\x03\xa3\x5a\x8f\x44\x5f\xdb\xef\x9e\x60\xd2\xe7\x96\x62\x1d\x24\x94\x33\x17\xf4\x3a\xb9\x44\xbf\x66\xd5\xfe\xe4\x49\x6a\x2d\x08\xd7\xab\xdd\xa5\xfc\xbe\x0e\x12\x99\xa4\x89\x57\x85\x2e\x3f\x77\xaf\xf0\x52\x64\xef\x50\x79\x89\x73\x1d\xf0\x80\x09\xe8\x55\x5b\x07\xa9\xa5\x0e\x38\x27\x89\xec\x9f\xd5\x85\x38\xaa\x0e\x52\x29\x10\xab\x8d\x5e\x0b\x21\x9d\x1c\x15\x44\xe1\xf4\xaa\xcf\x35\x2a\xf9\xea\x0e\x23\xe6\x06\x48\x41\x90\xbf\xd1\xf7\x1e\x9c\x05\xd4\xe4\x67\x60\xe9\x6e\x20\x08\xbe\x9b\x42\x7d\x75\xa0\xc0\xba\x16\xac\xcb\x62\x58\x64\xd1\x81\x26\xd4\xd8\x88\x72\xf0\x78\x26\xe7\xd7\x34\xc5\xbe\x9f\xbf\x8e\x1b\x68\x3e\x00\x8a\x97\xba\xab\xc5\xe8\x00\xb8\x40\x8b\xf7\xac\xde\xbe\x4e\x8c\xa6\x75\x60\x22\xeb\xf9\x55\x43\xe3\x16\xfd\xd9\xf9\x12\x06\x24\x44\xc4\x8e\xea\x02\x36\x2c\x94\x7d\xf3\x87\x13\x86\xcd\x53\x2c\x19\x3a\x3c\xd1\x48\xa4\x53\x87\x61\xa8\xc3\xa1\x72\xe5\xcd\xe3\x8d\x3f\x14\x85\x1a\xdb\x1f\xed\xc9\xcf\x45\xd6\x7c\x7e\x6f\x83\x93\x7a\xd8\x69\xd2\x61\x44\x38\x56\xc4\x84\xd5\x36\x7b\xf4\x6e\x3a\x3a\x8c\x62\x03\x8e\xac\xf5\xd2\x64\x79\x1d\x8d\x7f\x63\x18\x71\x86\x61\xfe\xf1\xb3\xc3\x90\x3c\x96\xdd\x87\x25\xc5\x97\x7e\xf1\xdb\xd0\xc3\x4f\x87\x24\xe8\xe2\x79\x3f\x09\xfc\xa1\x98\x70\xb4\x3c\xc8\xac\xc8\xa7\xff\x2b\x50\x2c\xef\x2a\x0f\x2f\xbd\xb5\x48\x11\x77\x98\x12\x86\x91\xd3\x72\x7d\xf3\x78\x9f\xbd\x5b\x43\x72\xa4\x0e\xc2\xe8\x7b\x91\x0f\xd7\x6e\x71\x2f\x77\x77\xeb\xe5\x7a\xf5\xb8\xdb\x6f\x77\x8b\xdd\xcb\xd6\x0f\x60\x3a\x94\xb2\xaf\x84\x0e\x9b\xe7\xe3\x0d\x25\x64\x3a\x15\x81\x03\x0b\xf4\x6b\x67\xc8\x63\x2b\xeb\x90\x0b\x0c\x02\x75\xd9\xdd\x48\x0e\xc0\x5d\x1a\xe2\x0c\x2c\x7f\x88\x4a\x2b\xaf\x1b\xa1\xc3\x34\x4d\xf0\x8c\x39\xc6\x97\x5d\x79\x63\xda\xee\x1a\x66\x59\x3a\x4c\x1d\x22\x11\x11\x69\x77\x00\x1b\xf4\x70\x18\x03\xd9\xae\xd4\x96\x78\x77\x8a\x04\x37\x23\x0d\x9e\x6c\xf9\x03\xf4\x15\x14\x82\x0e\x53\x63\x90\xd1\x75\x46\x34\xd0\x5a\x4f\x56\xf2\x50\xb0\xd4\x5e\x50\x59\x34\xa2\x0d\x6e\x47\xdb\x4e\x28\x12\x45\x22\x7b\x58\x89\x66\xc8\xa1\x0b\x87\x10\xa5\xd0\x0f\x57\xcc\x2a\xb5\x67\x87\xe2\xe9\xdc\x4c\xe6\x9e\xd0\x02\x21\x93\x56\x71\x28\xff\x5c\x0c\x9a\x0b\x57\x2e\x5f\x09\x86\xa2\xeb\x37\x9b\xa7\xdf\x56\x9b\xfd\x66\xb5\x5d\x6d\x7e\x5f\xed\x17\xb7\xb7\x9b\xd5\xb6\x9b\x06\x4a\x31\xb4\xd4\x74\x0f\xea\xd6\x02\xee\x9d\xad\x34\xb6\xf0\xf7\xdd\x50\xe0\x68\x22\xf6\x7b\xd9\xd8\x84\xab\x99\xc9\x0c\x27\x17\x01\x5a\x50\x6f\x34\xdd\xee\xe7\x50\xdf\x95\x15\xc2\xf9\xbe\xd9\x1d\xdd\x3d\xed\x4e\x5a\x48\x87\x60\x8c\x35\x66\x47\xa6\xc4\x06\xde\xcb\x37\x98\xdc\x0d\x03\x21\xf6\x22\xda\x28\xc9\x37\x54\xbe\xba\x17\x51\x90\x32\x6c\x0d\x38\x09\xc5\xbc\x57\x07\xd3\x51\x20\x52\x95\xfa\xec\xbd\xd2\x4e\x3f\xa0\xab\x63\xea\x28\x0c\xb5\x6d\x37\xb8\x56\x4e\xaf\xf9\xa2\xa3\xd0\x44\xde\xf1\xaf\xbd\x90\xaa\x01\x6d\x77\x90\xd1\x05\x47\x24\x94\xb8\x4d\xec\x65\x2e\xd4\xdb\xbd\x6d\x3d\x8e\x87\xc4\x61\x8a\x8a\x41\xdf\xa1\xf9\x9e\x19\xeb\x8e\x3d\x9c\xff\x51\x4c\xc2\xc0\xb5\x2e\x7c\x50\xf8\x80\x1e\x92\xfd\x95\x52\x12\x1a\xd7\x0e\x10\x79\xa7\x82\xa0\x23\x2a\x28\x02\x49\x96\xdf\x87\x6b\x44\x44\xa5\x14\x4e\xa4\xb2\x0d\x29\x97\x3f\x97\xf5\x15\x83\x53\x1d\x51\x15\x0a\x17\xbc\xef\x2b\x38\x8a\xac\xc8\x8a\xc3\xfe\xbf\x67\x61\xc3\x2f\x37\x8a\x45\x89\x5f\x54\x56\x99\x2e\xcb\x19\x68\x82\x8e\x18\x91\xa8\x87\xad\x44\x9e\x5b\x1d\x82\x61\x9e\xd0\x1e\x77\xe9\x63\x9e\x9d\x86\xbf\x2e\x49\x58\x6a\xc6\x4a\x2d\xe3\x3b\xc4\x53\x6b\xf7\x51\x59\xfe\x66\x56\x16\xf5\x9d\xf5\xf8\xed\x16\xdd\x28\x0d\x53\x7c\x91\x06\xc0\xed\x0e\x8c\xad\xa3\x94\x50\xac\x5d\xb6\xd1\xea\xb3\xf8\x7c\x3a\x37\xe3\x32\x90\x1f\xc6\x80\xdb\x52\x61\x01\xf7\x42\x8e\x77\xe2\x28\xd5\xb6\xf3\xab\x72\x10\xd5\x22\xcf\x97\xa2\xd0\x98\x70\x75\x23\x04\xd3\xca\x74\x17\xb1\xa8\xd4\x6b\xbf\xcf\x46\x42\x50\x0c\xe8\xea\x37\x8f\xb5\x6d\xff\x26\x11\xb8\xf2\x90\xa9\xaa\xbc\xc9\x9a\x8e\x0e\xdb\x0d\x30\x56\xb3\xfe\x24\x3e\x03\x4a\xf3\xf2\x73\x82\x09\xd5\x91\x74\xa6\x21\xdf\xfd\x0f\xbf\xf2\xa0\x65\x62\x25\xd8\xfd\x0a\x69\xdd\x91\xba\x92\x80\xcd\x76\xa7\xe7\xe6\x1a\x1b\xf1\x0f\x59\xd1\xcc\x14\x8d\xa7\xdf\xa0\x04\x6e\x4d\x0f\x9f\x7f\x4f\x00\x52\x47\xd2\x50\x54\x50\xb2\xf6\x5f\x65\x56\x2c\x0e\xf3\xdd\x3a\x1d\xa9\x50\xa2\x82\x8a\x55\x3b\x98\x6e\x0e\x5f\xf2\x79\xdd\x19\x74\xac\x88\xef\x2e\xee\x45\x5d\x43\xd5\xcd\x4c\xcd\x63\x6b\x69\x0e\x39\x1c\xda\xfc\xb6\x7c\x84\x8f\x59\x4c\x56\x3b\x96\x69\xc7\xab\xc3\x10\xa7\x3e\x1f\xc7\x1b\x44\xa4\x53\x9b\x42\x20\x33\xc5\x96\x60\x47\xbf\x5a\x4b\x69\x97\x66\x54\x1a\xf1\x95\x3a\x7f\x2d\x10\x72\x65\x01\xfa\xe2\x00\x4f\x85\xed\xe7\x77\x07\x23\x85\xbd\xfc\x4e\x1f\x57\x47\x40\x6d\xbb\xa8\x86\x66\x4c\x5a\xd1\x11\x68\xcb\xc4\xbe\x5d\xbf\x8c\x26\x15\x40\x84\x9a\x1f\x8b\xe2\x00\xb9\xff\xa3\xd1\x11\x73\x95\xe6\xa5\xa8\xbc\x41\x35\xb6\x03\x07\x4a\xd3\xdd\x8f\x34\xa0\x11\x47\x6e\x93\x79\xdb\x28\xb0\x20\xd7\x39\xe8\x9b\xfd\x10\x09\x82\x18\x29\x0f\x8f\xe7\xea\x3c\x9e\x23\x93\xb9\x72\xa1\x14\xae\x49\xa0\x09\x66\xd0\x57\x99\xb2\x33\x30\x5e\x4d\x22\x12\xea\xae\x57\xdd\x6f\x6e\xfe\xa8\x48\x70\x6d\x3e\xdb\x24\xe4\x01\x17\xbf\xf9\x08\x97\x44\x42\x62\x24\x5c\x56\xd9\x61\xe0\x4d\x32\xfb\x2a\x90\xc8\x84\x38\x05\xca\x13\x14\xff\x2a\x0b\xd8\x41\x9e\x7b\x4f\xa1\xa8\x1b\x13\x61\x21\x68\x8b\xd0\x78\x54\xc4\x1d\xcd\x13\x42\x22\x86\x18\xab\x0a\xb7\x4a\x8c\x79\xc7\x91\x0a\x69\x87\x50\x0b\xa5\x3e\x96\xef\x80\x29\xab\x28\x9a\xbb\x4a\x1c\xae\x3b\x78\x6b\x42\xd2\x00\xfd\x9b\x94\x68\xd3\xbb\x7c\xeb\xd2\xc6\xbb\xec\x17\xe8\xef\xe2\xe2\x53\x93\x4f\xc7\x0e\x07\xe1\x9e\x3c\x26\x88\x57\xb3\xcd\xd1\x9b\x41\x62\x65\x58\xbf\x48\x63\x18\x92\xf5\x2b\x24\xa1\xa1\xc1\x0d\xc4\xdb\x3a\x75\x38\x84\xeb\x1d\x5d\x4d\x28\x03\x70\x6b\xae\x6b\x32\x20\x50\xed\xae\xac\xbc\x90\x6e\xaf\x83\xa0\x09\x23\x29\x58\x0e\x0a\xdc\x7e\xff\xd7\x14\x4c\xa9\x09\xa3\x8c\xa5\x83\x84\xe9\x36\xab\x00\x55\xa3\xc6\xd3\x75\xfe\x52\x18\x04\xd8\x66\x6c\xac\x8d\x87\x86\x5f\xbb\xd2\xd6\xe9\xa7\xe3\x2c\x07\x63\x73\xb3\xfc\x82\x90\xa5\x49\xc2\x44\xdc\x11\xd8\x2c\x3d\x77\x72\xa6\x24\xa5\xc0\x3d\xf0\xf1\xae\x02\xf8\xde\x6d\xb7\x24\x51\xdc\x53\xed\xbd\xa6\xd6\x65\xa2\x4b\x78\x18\xc5\x4e\xf0\xf1\x37\xf8\x9c\xb5\xdd\x1a\x0c\xe6\x0c\xfb\x1b\x6d\xa2\x98\x0d\xaa\x90\x9a\x70\x09\xd2\x26\x91\x2e\xbb\xf3\x25\xa6\x41\x62\x44\x38\xc4\xa8\xfa\x7e\x10\x6d\xb4\xb8\x5e\xdc\x76\x07\x8c\xc2\xc6\xce\xb8\xcb\xea\x23\x47\x22\xa8\x96\xe0\xba\x92\x59\xd5\x46\x62\x60\xb2\x5f\xfe\xc3\x32\x05\xec\x18\x34\x5d\xf4\x79\x79\xe1\x0a\x28\x1f\x08\x14\xb6\xfb\xd9\x20\x54\x24\x3a\x56\xa8\x4d\x72\x14\x6f\x80\xee\xb1\xed\xb2\x3f\x96\xc6\xd4\x44\xa7\x04\x97\x12\xbf\x81\xda\x25\x52\x8d\x05\x54\x35\x81\x48\x87\xb2\xab\xc6\xd9\xa2\xcc\xfc\x9e\x46\x20\x26\x48\x1e\xfe\x7d\xd9\x83\xfd\x34\x81\x34\xc0\x3e\x0d\xb2\xfd\xb6\xcf\xeb\xdf\x56\xfe\x88\x61\x26\x74\x51\x98\x23\x8b\x21\xfa\x68\x9b\x1d\xe6\xa8\x29\x9a\x18\xce\x50\x95\x4c\x39\x1a\xc0\x52\x9c\xda\x84\x66\x32\x03\x4c\x1a\x28\xe6\x05\x17\x06\x00\x40\x7b\x38\x0e\xa4\xc4\x98\x66\x2f\xb4\x76\x98\x9b\xd1\xb7\xc4\x61\xc8\xc2\xc8\xeb\x18\x14\xed\xee\x51\xbf\x8e\x23\xa7\x38\x22\x04\xa1\x63\x26\x3f\xd7\xaf\x2b\xdf\x79\xd0\x71\xa4\x0c\xa6\x9a\x45\xe9\x6c\xf0\xdc\xdf\x09\xd1\x18\x7d\xef\x0f\xd0\x38\xa3\x8b\xa6\x3f\x98\x24\x58\x5b\xa9\x26\x3d\x1b\x1d\x13\xc9\x70\xfd\xa8\xcf\xf2\x98\x35\x43\xbb\x82\xd9\xf7\x35\x26\x4a\x21\x66\x20\x73\xfa\x98\x43\xda\xee\x78\x64\x9c\xc6\x68\x8e\x6a\x2f\x73\x71\xca\x5e\xaa\x91\xb8\x86\x8e\x29\xa4\x60\xf1\x23\x2e\xe9\xbd\xd8\x03\xff\xfd\xbf\xa3\xb7\x3b\x66\xa1\x45\x83\x89\xac\xd2\x55\x79\x7a\xb8\xbd\xbf\x84\x8e\xb9\xa1\x89\x00\x0c\x5d\xfe\x89\xad\x04\xff\x73\x13\xc3\x95\x6b\xbd\x2d\x50\x69\x41\xe4\x57\x56\xfc\x98\x07\x1a\xc3\x48\x94\x0f\x36\x98\xb1\xd9\x62\x9d\xb9\xf6\x89\x14\x02\xec\x32\xad\xfe\x58\x2d\x5f\x76\xab\xfd\xea\x8f\xdd\x66\xb1\xff\xbe\xf0\x71\x47\x2c\x62\x8e\x10\x7c\x8c\x4f\x92\xee\xaf\x69\x14\xa4\x7d\xd5\x2d\xfb\x13\x7a\x97\xed\xbf\x59\x91\xf4\x67\x52\xd6\x25\xe1\x13\x44\xd5\x80\xf0\x45\x88\x58\x06\x56\xae\xd9\xe9\x26\xfd\xda\x36\xa2\xab\xbb\xc5\x32\x0c\xb1\xd4\x83\x42\x42\x4f\xe6\x5e\x14\xfa\x41\x14\x9f\x7d\x05\x62\x04\xde\xd1\xb1\x04\xa2\xdd\xe6\x81\x6f\xd4\x64\x42\x29\x0e\x54\x77\x64\x96\x0e\xe3\x76\x57\x95\x47\xbc\x87\x33\xfa\x55\x3a\x56\xa0\xbc\xba\x12\x26\x7b\xf3\xb1\xaa\x1b\xac\x59\x8a\x22\x20\x6d\x32\x73\xb1\xef\x5e\xab\xc8\x7f\x55\xa1\xbf\x50\xe9\xf1\x5f\xc4\x19\x6a\x61\x5b\x7e\x92\xf5\xdc\xf8\xd6\x1d\xe3\x98\x76\xb7\xaf\xdb\x1d\x80\x95\xf2\xff\x1c\xc5\x7b\x31\x08\x83\x11\x0d\x02\x72\xef\xb2\xfc\xb2\x40\xf3\xd7\x56\x9b\x33\x60\x57\x1d\x9b\xc8\x81\xfb\xa1\x79\xf8\x6c\x5e\x33\x25\xf2\xef\x95\x78\x17\x8d\xe8\xae\xcf\x10\xe0\xae\xad\xbe\x1c\x09\x52\xeb\xd8\xa4\x12\xb3\x9f\x47\xf8\xd8\xed\xee\x47\xdb\x97\x63\x77\x6b\x1a\x84\x2c\xf5\x26\x7e\x5f\x1a\x72\x8d\x5f\x01\x1a\x86\x16\x58\x2c\xcf\x76\xf7\xaf\x3d\xed\xce\x1d\x8f\x48\x80\x81\xd0\xf2\xe9\xe1\xe1\xe5\x71\xbd\xfb\xe7\xc8\xb9\xa2\x3d\x1e\xa2\x5a\xef\xf6\xe9\x6e\xb7\x5f\x2e\x9e\xf7\xeb\xc7\x51\xe3\x86\x46\x34\x21\x5e\x00\xdc\x5d\xd2\xfe\x66\x7e\xaf\xa0\x24\x12\x58\xf0\xf6\x6b\x15\x8a\x06\xd7\xbd\x7c\xc0\xf8\xd2\xe3\xc0\x8a\xf0\xbc\x42\x7e\xc2\xbc\x6a\x34\xaf\x69\x4c\x53\xd3\x87\x70\x77\x83\x89\x3f\xfe\xd2\x98\x6a\x7c\x9b\x3b\x2a\xe8\xaa\xd0\x83\xbd\x81\xc6\x42\x62\x05\x65\x8f\xba\x6b\x0d\xf4\x96\x92\xfd\xa5\x24\x41\x88\x54\xc1\x53\x05\xef\x59\x9e\x1d\xa0\xfd\x2e\xbf\x5e\x7d\x9d\x51\xd2\x44\x2a\xbc\x4e\x54\x31\xbb\xcf\x24\x16\x45\x8d\xe8\x8a\xc6\x34\x0d\x12\xc4\x3c\xed\x60\x08\x47\xd6\x34\xe5\x1a\x21\x24\x2e\xa5\xbe\xe9\x23\x40\x9a\x2a\x8d\x2d\xfc\x0a\x9a\x2a\x83\x77\xe8\x90\x4a\xe3\x9f\x2e\x52\x83\xcf\xa6\x44\x12\xf4\xbe\xf9\x3c\x4d\x7c\xe1\x34\x15\xca\xda\x69\xfe\x6b\xbd\xdb\x3c\x75\x0f\x55\x46\x0c\x01\x11\xce\xad\xc3\xf2\xd3\xbb\x83\x29\x60\x25\x1b\x7d\x6f\x4c\x03\xd5\xa0\xe6\x44\x55\x02\xc6\xf3\x49\x6c\x3f\x01\x25\x3e\xad\xc8\x1c\x76\xb6\x07\x3a\x7f\x5d\x96\x47\x35\x10\x14\x4a\x58\x2d\x9f\x46\xf7\x00\x08\x41\x54\x94\x0f\x65\x37\x50\x43\xf5\xee\x39\x7d\x93\xdf\x02\xc4\xd8\xb7\xf0\x7c\x7c\x32\x8f\x7f\x8b\x97\xa3\x29\x08\x82\x2f\x48\x01\x1f\x2f\xb5\xf3\xb1\x99\x64\x63\x33\x61\x2d\x35\x2c\x42\x16\xd8\xb9\x78\x16\x99\xbe\xf1\xec\xfc\xe9\x25\x19\xb0\x72\xf5\xde\xcc\xd0\xa5\xa4\xa8\x70\xe0\x7e\x23\x0b\xa2\x80\x5b\xb1\x29\xf8\xb3\xec\xa2\xa1\xa8\x34\xe4\x4b\x6e\xac\x66\x41\x9a\x12\xc7\x18\x7a\x83\xad\x12\xd3\xc8\x9a\x45\x82\x60\x54\xd3\xbc\x66\x95\xb7\xba\xb8\xed\xa3\x10\x16\x89\x18\x59\xac\xae\xe3\xbd\xf4\x5e\xd8\xfa\x5a\x8e\xf0\x97\xff\xfe\x25\x50\x57\xb3\x48\x51\x67\x10\x8b\x65\xdc\x3e\x6f\x61\x31\x65\x58\x18\xb8\x14\xa3\xfa\x32\x99\x63\x31\x95\xa1\xab\x73\x62\xa5\x62\xb8\x63\xf9\x21\x49\x02\x16\x23\x8a\x15\xfa\x36\x6e\xbe\xef\x20\x31\x9a\xc5\x69\x82\x62\x84\x3f\x6e\x96\x0f\xfe\x6f\x94\xd2\x50\x0f\x52\xc4\x62\xf5\xab\x57\x28\x99\xaf\xab\x30\x9a\x86\x18\xbc\x2d\x45\xf1\x24\xdb\x30\x75\xe9\xa5\x19\xfd\x1e\xc4\xa8\x66\x08\x20\x78\xde\xac\xf6\xeb\xe5\xd3\xfe\x61\xf1\xc7\xff\x47\xd9\x97\x2d\x37\x8e\x23\x5d\xbf\x4e\x5d\xf4\x05\x01\xee\x97\xb2\x2c\xbb\x3c\xe5\x6d\x24\xb9\xaa\x7b\xbe\x98\x50\x24\x80\x84\xc5\x29\x8a\xd4\x90\x54\xd9\x9a\xa7\xff\x83\x09\x80\x9b\x68\x57\xff\x7d\x51\xee\x10\xc0\x1d\x4b\x2e\x27\xcf\x19\x2f\xb9\x51\xc4\xbc\xd0\x92\xe9\x5d\x57\x50\xbc\x3a\xf4\xb0\x8a\x22\xad\x13\xec\x03\xba\xed\x0e\x37\x5f\x31\xac\xa2\x24\x88\xa8\x30\xca\xe4\xfc\x37\x3f\x9e\xe7\x4d\xa4\x28\x11\x41\xd0\xad\x8e\xc4\x1a\xd5\xbd\x94\x94\x45\x20\x86\x7a\x23\x1f\x04\x3a\x5c\x77\x3f\xa5\xa1\xfe\x9c\xe1\xff\x5a\x53\xb8\x73\x06\xa2\x54\x4a\x8a\x36\x59\x7e\x21\x7d\x22\xe9\xda\x29\x79\xc5\x78\xaf\x8f\x20\x11\xe4\x4e\x19\xfa\x66\x53\xee\x5c\x81\x9a\x04\xaf\x23\x11\x2a\xc7\x47\x75\x5d\xc0\x43\xf6\x8e\xd5\xec\x36\x10\x89\x24\x8a\x6d\x41\xee\x2d\x1c\xd0\x14\x8b\x4d\x46\x89\xf4\x94\xb6\x56\x8f\x89\xb4\x7f\xc5\x6a\x3a\x92\x24\x37\xba\xf9\xab\x1c\x65\x4f\xe9\xa9\x22\x09\x8c\xcc\x2c\xb7\xbf\x7e\x64\xff\xfc\xcd\x19\x65\xcf\xaa\x12\x45\xc1\x86\x43\xa9\x32\x7d\x7e\xc8\xf2\xf6\xa3\x17\x38\x89\x84\x0f\xa9\x96\x55\xa4\x43\x34\x05\xf6\x24\x74\xe9\x38\x63\x3e\x48\x41\xb9\x63\xe2\x90\x80\x8e\x6f\x13\x32\xb4\x79\x73\x6c\x72\x93\x1a\x19\xb1\xbb\xac\x9f\x36\xcb\xe6\x37\x0c\x2d\x2a\xf6\x82\x28\xb1\x99\xcc\xab\xac\x80\x42\x12\x31\xfe\x25\x6d\xb5\x8a\xbd\x28\x8e\x5d\x34\x6f\x56\x5b\x47\xc5\x5e\x9a\x52\x8d\xc1\x11\xce\xed\xca\xbd\xf8\x90\x54\x63\x76\xf4\xc7\x5e\x0a\xc2\xde\x4b\xb7\xe8\xec\x5e\x61\xb2\x8a\xc7\x2c\xe1\x89\x05\x12\x60\x55\xd9\x1a\xd2\x7a\xf1\x0b\xb2\x61\xb2\x26\x66\x29\x27\x2c\xc7\xc3\xdd\xe2\xe1\x6e\xe0\x0d\xc7\x0c\x98\xb4\xd5\xec\x96\xf9\x66\xf4\x46\x78\x00\x31\x0c\x0c\x78\xac\x66\xf0\x87\x2a\xf6\x99\x4f\x58\xf2\x0e\xc1\x34\x94\x9d\x98\x1f\x3f\xb1\xcf\x42\x43\xa0\xd6\x5a\xbc\xa3\xb2\x46\x15\xfb\xad\xed\x67\x13\x05\x95\xa5\x4a\x9c\x3c\xb8\xcf\x23\xda\x9a\x9e\xbf\x5e\xff\x8e\x7a\x47\xc5\xbe\xef\x93\x5a\x41\x97\x02\x29\x9a\xb5\x05\x33\x4f\x13\x4a\xb1\xaf\x05\x49\x3c\xc2\xa9\x29\x3f\x0f\x43\xc6\x41\xcc\xfc\x4e\xa8\xbd\x81\xdc\x98\x5d\x7d\xc4\x2d\x0e\x24\x83\xc4\x3a\xf7\xdb\xf2\x66\x18\xc9\xeb\x2d\x8c\x38\xd0\x3e\xe5\x88\xae\xef\xd6\x5b\x77\x64\x18\xa4\x2e\xec\x6c\x52\x29\xcf\x39\x48\xbc\x76\xbc\x5e\x1f\x21\x95\x55\x1c\x86\x32\x31\x3e\x95\x6c\xcd\xaf\xb9\xe5\xcc\xf5\x4c\x39\x91\xac\x1e\xb2\xe2\x21\x2b\xae\x4e\xe7\x3e\x49\x1d\x87\x10\x50\x44\xe1\x57\x86\x6f\xbd\x80\xa0\x6b\x8d\x7c\x8f\x10\xe9\x35\x41\x6d\xb7\x03\x9d\x3d\x83\x4a\xf8\xff\x5d\x58\xe6\x24\x48\x54\x1c\x07\x31\x49\xc7\x82\x52\xed\x2d\x5c\x9d\x87\x5a\x0e\xa3\xcf\x1b\xc7\x49\xd8\x49\xa3\xd7\x37\x65\xd5\x1a\x3d\xee\x66\xe3\x24\x22\x83\xb4\x38\x1d\xb6\xe5\xcf\x7a\xf3\x96\x51\xc1\xcf\x00\x52\x15\xc7\x2a\x4a\x1d\x55\x7d\x29\x7f\xbe\x98\xdb\xb2\xf1\xf6\xc9\xfb\x4d\xbc\x34\x32\x52\x76\xa7\x1a\x6f\x07\x72\x47\xc3\x2f\x9a\x58\xfa\xf4\xb7\x4c\xd9\xda\xa1\x4e\xaf\x75\x32\x8c\x93\x38\x22\x84\x4a\x87\x20\x81\x2e\xe8\x17\x27\x12\x28\x21\xe6\x64\x9f\xcc\x16\x38\x3f\x14\x53\xcf\x00\x49\x8e\x50\xd5\x48\xac\x15\x97\x12\x92\x2a\x4e\x59\x08\xca\x51\x24\xe2\xbc\xf0\xae\x8a\x53\x1f\x29\x72\x2e\xa0\x91\x7b\xb3\x48\xb7\xff\x16\x7d\x59\xe1\x5c\x0e\x62\x72\x12\x50\x8a\x00\x1c\xb6\x66\xae\x5d\x43\x9f\xcb\xcc\xf1\x3c\x45\x81\xf3\xe7\x63\x11\x18\x9a\x3e\xf3\xf1\x5c\x28\x55\x0d\x4a\x70\x55\x2c\x42\xa3\xde\x5e\x63\xd3\x7e\x9c\x2f\xf3\xae\xf1\xf8\x06\x44\xa4\x42\xcb\xbc\xfe\x73\x51\xa8\x35\xb1\xa1\x74\x27\x14\x46\x42\x64\x49\x7a\xb6\x03\xd8\x4f\x2c\xa4\xb1\x3a\x68\x65\xcf\x51\x4c\xbe\x97\x0c\x25\x0d\xca\x53\x8d\x95\xad\x7f\xab\x2d\xdc\x77\x3c\x7a\x65\x92\xa4\x81\x43\xa9\xdc\x96\xb9\xfa\x2c\xd1\x1e\x4b\xe0\x14\x82\xad\x4f\x2e\x2b\xba\x2d\xa9\x16\xe2\x7e\x26\x04\x12\x2b\xa6\x29\x13\x78\x75\xf3\xa7\xbb\x6d\x95\x28\x02\x5e\xd2\x40\xc3\xd3\x81\xde\xb5\x6b\x44\x66\x38\xdf\x5f\x0d\xe7\x3f\x16\xcd\x1a\x8a\x9f\x1f\xdc\x8a\xe6\x48\x49\x1b\x93\x62\x7e\x2c\xd5\x54\xaa\x71\x3c\xf7\x74\xe2\xf9\x96\x71\x18\x29\x16\x34\x89\xeb\xc6\x5a\x44\xdc\xc9\x7b\xd3\x6a\x34\xba\x5c\xe2\x79\x1e\x0d\xb6\xaa\x2c\x8d\xca\x97\xfb\x1d\x23\x53\x34\x6c\xa4\xc7\xec\xf4\xa8\x9f\xdb\x69\x37\xd9\x0b\x12\x16\x04\x89\x25\x7a\x6b\x4d\xce\xd6\xc8\x5e\x96\xa7\xaa\xc6\x2b\xa8\xf1\xa9\xb8\x53\x9b\xe6\xa4\xa6\x05\xae\x2a\x61\x61\x44\xc8\xac\x43\x56\x9c\x1a\xac\xef\x0a\x2b\x5a\xe4\x9a\x53\x23\xe0\xdd\x60\x6d\x62\x8e\x59\x43\xba\xcf\xae\x9d\x63\x4a\xc4\x10\xd3\xd0\x5d\xe2\xfb\x40\xd0\x38\x55\x95\x17\x4c\x09\xd3\xd8\x63\xe2\x07\x81\x41\xc1\xb6\xe3\x9d\x48\x14\xeb\xee\x3c\x01\x50\x3c\xda\xb0\xfd\xcd\x4f\xd6\xc4\x8f\x00\xdb\xe3\x57\xff\x7c\xb9\x5b\xfd\xd9\x1d\x8a\x3e\x15\x5e\x39\xa3\x69\x37\x1e\x9d\x49\x10\x69\xe2\x05\xb4\x01\x7b\x93\x2a\x35\xb9\x7f\xcb\xef\xea\xce\x14\xa4\x9c\x7b\x03\x8e\x5a\x22\xc9\xe8\x63\x14\x49\xa0\x7d\x32\xe9\x56\xdb\xe7\xa5\xfb\x2d\x0c\xe3\x01\xf7\xba\xe1\x83\xb3\x4d\x11\x37\xe8\x7a\xaa\x0a\x3d\x4e\x3e\x48\x1c\x31\xf2\x5c\x9f\x9e\x49\x4a\xf8\xf9\xe9\xe9\x7e\xf7\xbc\x5a\xdf\x3d\xb9\x4c\x46\x12\x43\x64\xee\xdb\xe2\x85\x5b\xa7\x47\x94\x4e\x10\xc4\x9a\x99\x49\x22\x8d\x9b\x52\x3b\xd6\xd0\x71\x7c\x26\x49\x13\x4d\xf1\xef\xbb\x87\xee\x17\x25\x08\xcc\x62\xee\x78\x48\x82\x31\x60\x8f\xbd\x7c\xf9\x90\x28\xda\x26\xb1\xd9\x93\x3a\xf2\x24\xc0\x99\x00\x84\x38\x78\xcd\xbd\x93\x66\x78\x59\x5c\x2f\x69\xf2\x0e\xa4\x5e\x52\xe6\x96\xb5\x76\xb4\x59\x27\xa0\x44\x0c\x9d\x5e\x21\x51\xfd\x99\x18\xc6\xe4\x15\x02\x46\x24\x12\xbc\x41\x79\xaa\xb2\x66\x8e\x29\x57\x25\x82\xf9\x5d\xea\x0a\xab\xba\x2c\xa6\xa8\x87\x44\x04\x8a\x96\x39\x07\x7f\x2d\x6c\x99\x43\x79\xcc\xa1\xe8\xd5\xb4\x86\x6f\x65\xbc\x0e\x77\xa4\xe6\xe3\x0b\xc7\x1e\x79\x4e\x65\x3b\xce\x77\x15\x4a\xcc\x7e\xe1\x48\xa2\x41\x25\x02\x04\xd5\x4c\xae\xaf\x5d\xcc\x27\x91\x11\x93\x96\xc5\x7e\xfb\xb0\xfa\x73\xd6\x8b\x4a\x64\x6c\x10\xad\x99\x25\xe7\xde\x60\x9e\x77\x6a\xa2\x24\xef\x76\x11\x97\xbc\x20\xcc\x54\x89\x44\x41\x39\x41\x5b\xd8\xd1\xee\xb9\x59\xf1\x3a\x2f\x48\x3d\xe5\x2d\x36\xa7\x48\x3d\xae\x69\x46\xda\x8f\x7e\x35\x49\xb0\xa4\x5e\x10\xc9\x21\x78\x75\xd3\x3b\xe2\xa3\xaa\x62\xd7\x3d\xe9\xc4\x8a\x1e\xc8\x19\x71\x54\x35\xcb\xf2\x70\x84\xe2\x7c\x75\x3a\x77\x67\x96\x86\xa5\x50\x02\xc5\x54\x3a\x67\xcf\x96\x40\xa9\x94\x09\x45\x50\x20\x77\x69\x3b\x86\x66\x5f\x68\xca\x63\xcd\xdd\x56\x77\x3d\x65\xa1\x56\xa9\xaf\x12\x95\x12\x2f\x91\x18\xca\x27\xa8\x34\xf0\x3c\x12\x89\xf9\x40\x44\xd9\x9f\x5c\x26\x4a\x3c\xaa\x4a\x28\x73\xf5\xa3\xca\x1a\x74\xfa\xc0\xc3\x41\x91\x46\x2a\xa0\xf9\xf9\xfd\x6e\xbd\x72\xeb\x6c\x1a\x47\xe8\x85\x83\xa7\x71\x5c\x01\x97\x1c\x24\xee\x80\x44\x53\xa9\xc3\x50\xf7\x62\xe0\x07\x7c\xc6\x40\xa6\xd2\x84\xc5\x64\x4f\xec\x76\xb5\x1b\x0d\x77\x35\xa9\x2a\xed\x76\x17\x01\x83\x4f\x52\x05\x69\x12\xfa\xb4\x21\x3a\xf1\x99\x6d\xa7\x7f\x35\x95\xa1\x51\x69\xa2\x7d\x49\xb5\xc0\xa0\xbb\x3d\x70\xb9\xcf\xf2\xcb\x30\xd8\xfc\x4d\xa7\x4c\x6b\xc3\x2a\x75\x55\x66\x39\x56\x74\xbf\xf3\x1b\x7f\xda\xbe\xcf\x94\x68\x89\xd5\x2b\x56\x86\x9d\x9e\x22\xc3\xdf\xb1\x32\x0e\xae\xed\x28\x3c\x43\xf9\x36\xf2\xc8\x19\x1f\x2b\x32\xab\x54\xb4\xfe\x77\x7b\xef\xad\xb9\x7d\xba\x4c\x50\xf5\xdd\xa8\xdc\x79\x8d\x7d\x49\xb1\x4a\x85\xe2\xa2\xdb\x16\x37\x65\xae\x9e\x8a\xbb\xe5\x53\xd7\x8a\x92\x42\xb9\x4b\x68\x16\xaa\x3c\x76\xfc\xd3\xe1\x47\xb9\x1d\x7b\x9c\x04\x88\x52\x9b\xaa\x98\xd7\xa1\x9e\xb5\x25\x53\xa9\x95\x4b\xa2\x0c\x22\xca\xa9\x62\x82\xa2\x47\xe2\x74\xa6\x00\x90\x29\x31\x73\xad\x18\x19\x40\x54\xfb\x99\xcb\x7a\x4a\xf6\x70\x31\x38\xb5\x2f\x45\xd8\x19\x3c\x1b\x50\x2a\xc7\xcd\xbe\x3c\x8e\xc2\x0f\x93\xfb\xd2\x51\x02\x7d\x20\xf0\x01\xde\xaf\x4c\xdd\x1c\x49\xf0\x8e\x87\x12\x78\x21\x23\x0f\x61\x0f\x7d\x78\x60\xd9\xee\x9c\xae\x3d\x55\xae\xcc\xa8\xdd\x5e\x4c\x0d\xd7\x53\xb1\xa1\x5c\x95\x81\xdc\x4e\x3c\x34\xf0\xb4\xa0\x8d\xcb\xee\xf3\x86\x74\xfd\x02\x23\xf0\x69\x44\xd6\x9e\x89\x45\x26\x05\x75\x93\x55\x75\xb3\x81\x93\xca\x86\x4b\x0a\xf0\x08\x12\x31\x90\x35\x98\x4f\xe2\x00\x57\xa6\xfc\xe3\xee\xba\x73\xa4\xc1\xd7\x26\x02\x64\xf3\x05\xdf\xcb\xfc\x74\xc0\x51\x8d\x8c\xed\x18\xa0\xd9\x61\x77\x86\xab\xcb\x64\xea\x17\x87\x61\x5c\x02\x02\x54\xae\x34\xdf\xd6\x8c\x4d\xe5\x5a\x14\x84\xa1\xd1\xc1\xfc\x0b\x6d\x2e\x60\xbe\xde\x08\x42\x9d\x92\xf5\x09\x54\xf7\xda\x7e\x8d\xb1\xf1\x00\x51\xc2\xb9\xe3\x7c\xd9\xee\xab\xf2\xad\xee\xea\x8e\x29\xf0\xf8\x58\x76\x80\xd6\x41\xa8\x07\xe2\x00\x29\x34\xf5\x36\xaa\xae\x81\xd8\x82\x92\xea\x7d\xf9\xb6\x2d\x8f\x23\xc2\x08\x05\x89\x1f\x86\xde\x30\xdc\xf0\xf7\x72\x78\x90\xf8\x08\x06\x02\x51\x5c\xa3\xae\xca\xba\xb1\x69\x90\x45\xa1\xb6\x7d\x56\x19\x92\x44\x0a\x74\xfa\x56\x6f\xf3\x01\x09\x48\xfd\x84\xb8\x14\x04\x61\x05\x7e\x62\x31\x2c\x2a\x81\x34\x0e\x69\x67\x5e\x6d\xbf\x36\xe5\xbf\x7e\x60\x56\xf5\x7b\x2a\xa4\xb1\xa6\xea\xa0\xaf\xa7\x76\xf7\x1f\xf8\x73\xd0\x2e\xb7\x49\xa7\xbb\xb4\x5a\x6c\xcb\xa2\x26\xce\xdd\x2e\x9c\x01\x29\x02\x79\x3c\x7b\x23\x9f\x7f\x57\x0c\xe5\xf6\x14\x00\xfa\x56\x8c\xa6\x1d\x17\x94\x1f\x31\x88\x21\x6d\xf4\x99\x8a\x1f\x98\xb9\xbe\x82\xf3\xd8\x2a\xf5\x6e\x4e\xaf\xaf\x58\x37\xad\x4d\xf8\xc9\x14\x06\x09\x8a\xe2\x58\x4b\x6c\x6d\x2c\x92\x97\xb5\x50\xa4\xcb\x3a\x37\x05\x52\x25\xda\x32\x43\x5e\x67\xb5\xa4\xdd\xee\xf3\x2f\xa4\xb8\x47\xbb\x8d\x6c\xfe\x17\x05\xd6\xf7\x76\x4d\x61\x4c\x31\xe5\xa2\x6c\x32\x7d\x5e\x96\xad\x03\x80\x15\xe4\x8f\x65\xb3\x26\x62\xcc\xa9\xa3\x05\x2a\xf2\x29\xff\x4f\x95\x6d\xae\x7a\x79\x1a\x79\x1b\x4c\x6b\xc4\xc4\x10\x27\xd1\xab\xbb\xef\xc9\x26\x6d\xbb\x8e\x63\x9a\x2b\x9b\xeb\x23\x9c\x7f\x0f\x68\x15\x1e\x37\x86\xe0\xa1\x35\xf2\x48\x60\xdb\x7d\x25\xe1\x05\x46\xe9\xe5\xa9\x18\x15\x74\x08\x2f\x04\xaa\x25\xba\xf9\xf3\xf1\xe9\x47\xf7\xa3\x2d\x17\x24\xd5\x1b\xc3\xbe\xf9\x21\x8c\x45\x78\xa0\xc2\x8e\x8b\xed\x02\xc0\x23\x3c\x6d\xcc\xbd\xd5\xf2\xeb\x62\x7d\xeb\xc0\x44\x82\xa5\x29\x01\x6a\xd7\x8b\xed\x6a\xb7\x59\xdc\xaf\x36\xdb\xc5\xed\xea\x7e\xb1\xd9\x76\x3d\x64\xe2\x85\x8e\xbb\x97\x28\x5a\xd7\x78\x3c\x35\x74\x2b\x37\x65\xf5\x00\xc5\x49\x83\x6c\xed\x8c\x6a\xb6\xd4\x54\x09\x1e\x46\xf4\x39\x7e\x2c\x97\xbd\xc4\x9b\x12\x3c\x05\xe7\xb2\x3d\xe7\xe5\x4c\xce\x49\x70\x04\x5a\x23\x76\x29\xdb\x3d\xac\xdd\x71\x7e\xa2\x08\xd7\x4e\xd3\xa3\xe3\xcd\x9c\x0e\xaf\xd1\x2a\x26\x02\x8f\x71\x1b\x3f\x7e\xae\xca\xff\xa0\x9c\x2a\xed\x9a\xaf\xd8\x7b\xbf\x93\xc3\x85\x47\x7c\x31\xae\x56\xd0\xdd\x4a\xa0\x62\xe0\x3d\x41\xeb\x58\x35\x77\x86\xdd\xa0\xb3\xb5\xfe\x8f\xdb\xfd\x54\x84\x89\x47\xa3\x5b\x9b\xb8\x75\x3d\xf8\xce\xae\x87\x34\x64\xdc\x02\x65\x79\xc0\xc5\x2b\x7e\x50\xa1\xab\x44\xa8\x53\x4a\xc4\xef\xb3\xd7\xfd\x80\x85\x58\x89\x88\x87\x54\xeb\x42\xe1\xf3\x5f\x58\x37\x7d\x45\xfd\xe4\x95\xc7\x4c\x1b\xbe\xfd\xf2\xbe\x2c\x8f\x93\xcd\x47\x24\x7e\x40\xb1\x86\x47\x7c\x6f\xae\xcb\x93\xf8\x40\x92\x4f\x89\x24\x16\x68\xe2\xfd\xad\xef\x34\xad\xab\x57\x22\x49\x3d\xc7\x34\xb1\x84\xba\xc6\xa6\xc1\x4d\xf6\x3f\xdc\xf5\xed\x81\x21\xa4\xa4\x32\x18\x1b\xb0\x36\x94\x05\xa6\xc6\xa3\x97\x1b\x50\x22\xf5\x53\x8a\x1b\x75\xee\x82\x13\xfd\x39\x8d\xa4\x07\x5d\x6f\x94\xb4\x5f\xad\x1e\xaf\xaf\x17\xdb\x6e\x22\x40\xca\xc1\xee\xdd\xdf\xf0\xfc\x41\x00\x4c\x08\x4f\x50\xf9\x96\x38\x9d\x0d\xf0\xf1\xa3\x18\xf1\xa7\xc9\x22\x21\xd2\x84\x50\xd6\x86\x39\xb7\x63\x67\x50\x42\x28\x53\x85\x47\xdd\xb7\x25\x45\x11\x0d\x5c\xd8\xb3\x3d\xa4\x17\x80\x2d\xb9\xb1\xf4\xa3\x33\x85\x91\x42\x4a\x13\x41\x5d\x67\x58\xdf\x56\xb0\xef\xb6\x38\xa1\x38\xa3\xa1\x70\x0d\x14\x80\xeb\x7e\x56\x11\xc5\xea\xee\xef\xee\xef\xb6\x5f\x87\xd3\x54\xa9\x98\x8a\x07\x1f\xee\xae\x6f\xd7\x8b\xeb\xd5\x6e\xfb\xd7\xf3\x6a\x37\xe0\xa9\x52\x42\x61\x24\x2d\xd1\xf3\x80\x1c\xf4\x6e\xf9\xb4\x7a\x74\x21\x11\x81\x7e\x40\x33\x70\xbb\x1e\xfc\x16\x85\xa6\xd0\xa7\x14\x34\x99\x6b\xc7\x0f\xf2\x11\x73\xd0\xd4\x8b\x18\xec\x39\x42\xfb\x82\x6e\x82\xca\xf0\x26\xe3\x56\xc7\x46\x05\xc9\x98\x9c\x86\xe4\xd0\x28\x3c\x7d\x92\x8e\x91\x5e\x68\xe2\x97\xf5\x49\x5c\x92\x2b\x28\xe9\x25\x8c\xdc\xb4\x5d\x56\x5f\x55\x88\x2a\x2b\x5e\x49\xd7\xa0\x71\xcb\x51\xe0\xfd\x61\xfe\xd8\x03\x18\x8b\xc8\xd3\xd8\x97\x55\x8d\x94\xb6\x1f\x9f\x90\xc5\x92\x3c\xee\xef\x8b\xfb\x97\xd5\xee\xfa\x6e\xb3\x5d\xdf\x5d\xbd\x50\x8c\xe9\xdb\xea\xaf\xdd\xd3\x8f\xc7\xd5\xda\x79\x95\x92\x25\x92\x72\x59\xa8\xb2\x86\xa2\x9f\xd3\x77\x34\xe2\x7b\xb1\x8b\x4f\xb7\xe5\x49\x96\x68\x32\x23\xf7\x50\xef\x3f\xa9\xfa\x57\x92\xc9\x10\x6d\x7e\xf0\xa1\x2c\xd0\x39\xf1\xd2\xf7\x84\xb2\x25\x29\xff\x00\xf9\xf3\x58\x36\x61\xd7\x04\x92\x0f\x39\x19\x1e\x33\xf9\xf3\x11\x0e\x53\x1f\xc6\xf6\x0e\xfc\x48\x5a\x62\x9e\xbb\x6b\x72\x1a\xd7\x68\xcb\x7b\xf6\xd9\x91\x00\x2f\x9d\x5e\xe7\x33\x98\x72\x04\x22\x0e\x79\x6e\x87\x0a\xb9\xc6\x1a\x2b\x2c\x24\x5e\x65\x86\x89\xff\x6f\xf0\x5e\x2a\x19\x84\x3c\xb0\xc1\xe6\x07\x07\xac\xf9\xd2\xb5\x59\x30\x1a\x55\x74\x56\xd7\x0e\x88\x3e\x85\x2b\x8d\xcf\x18\x86\xd2\x28\x88\x63\x73\x81\x29\x98\x74\x8d\x98\xd1\x40\x20\xf2\x85\x3b\xbd\xc8\xf3\xc5\x7a\xdb\x65\xcd\x3a\x93\x4f\xc6\x11\xc6\xa6\x12\xee\x6c\xb9\x65\xa1\x01\x5b\xa3\xf3\xa9\x3d\x25\x63\xcd\x84\xa5\xe0\xb0\xb7\x40\xfa\x8e\xb6\x35\xe1\x9c\x1c\x84\x32\x57\xe3\xfa\x5b\x99\x80\xd1\x21\xbc\x62\x23\x91\x66\x25\x53\x96\x44\x3d\x21\xf3\x0f\xcc\xcc\xa8\x19\x42\x51\x65\x0a\x06\xe0\xdb\xc1\xe6\xcb\x03\x58\x49\x5b\xa2\xc8\x9b\x4d\xa0\xc9\x54\x08\xfa\x12\x7b\xa8\xfb\xf7\x66\xdb\x84\xa7\xc8\x60\x7e\x2d\xaf\x40\xfe\xdc\x96\x4e\x08\xd6\x35\xfb\x1e\x05\x9d\x74\x76\xac\x6f\x6d\x12\xb6\x6b\x8b\x22\x53\x69\x5b\x92\x20\x18\x34\x58\x3f\xe9\xc9\x8c\x53\x9e\x6f\x42\x33\xe5\xa6\xa9\xc6\xa1\x4c\xa9\x42\x03\xfd\x69\x27\xd8\x5c\xb0\x47\xaa\x54\x84\x46\xdb\x45\xd4\x43\xc9\xdf\x0f\xbe\x88\xd2\xdc\x69\x8a\x98\xa8\x7f\x3d\x1a\x73\xe8\x89\xd0\xa2\x2b\x1e\xcb\x06\xdb\x3d\x68\xdc\x1e\xc7\x64\x20\xde\x67\xc5\xcf\x03\x85\xac\x0e\x38\x6c\x35\xd2\x11\xa2\xdd\x94\x08\x3a\xe2\x82\xc3\xdd\x38\x19\x6f\x50\xee\x38\x08\x88\x58\x0a\x2b\xc9\xbd\x66\xf0\xbd\x95\x27\x63\x72\x9a\x0f\x67\x2b\x79\xeb\x02\xb9\xb6\x9d\xf9\x81\xe3\xd3\x6a\xe7\x36\xe5\x44\x46\xe7\x56\x2c\x30\x35\xca\x46\x7a\xac\x29\x65\x99\x7f\xc7\xea\x52\xf4\x65\x70\x80\x91\x35\x6a\x7a\x00\xf6\x33\x64\x79\xde\xc7\x74\x14\x0b\x35\x69\x0e\xd9\xda\x8a\x8b\xdc\x93\xeb\x16\x29\x42\x0d\x93\xe4\xf7\x61\x68\x0a\x29\x16\x63\xac\x3a\xf2\x71\xd2\xfb\xee\xb5\xa8\xff\x66\x48\xc0\x9e\xca\xf7\x3c\x43\x4c\x03\x75\xe3\xd8\x17\xbb\x64\xa0\x0a\x22\xe9\xb4\xc3\xb6\xef\xc3\x4f\xa9\x82\x94\xd1\xa8\x75\x81\x29\x4a\x86\x3d\x55\xe4\x3c\x8f\x07\xa8\x0a\x52\xee\x68\x39\x6f\x66\x32\xa1\x7f\x4c\x7b\x4b\x30\x15\x12\x07\x7a\x33\x73\xc0\x64\x15\xfa\x1e\x23\x44\xc2\xfa\x6e\xb9\xda\x3d\xaf\x57\x57\x2f\x7f\xb9\x3b\x0b\x63\x4e\x95\xdb\xba\xac\x9a\x53\x81\xbb\x1a\xf3\xfc\x37\xd7\x8c\x7c\x43\x39\x86\x07\xac\x48\xa2\xa7\xfd\xd6\xc4\x0e\x46\xe5\xab\xae\x97\x4e\xc2\x1e\x4c\x75\xff\xf4\x6d\x7e\x61\x54\x31\x0f\x88\xcd\xb0\x2b\x81\xa5\x82\xe8\x0f\x51\x6c\xc3\xf9\xa8\x62\xdf\xa7\x19\x04\x56\xa7\xa0\x5b\x4c\xb6\xa5\x0b\x23\x4c\xf6\xc8\x0b\x1e\x47\xa5\x62\x69\x10\x90\xaf\xd8\x7c\x3d\x1d\xa0\xb8\xf4\x4a\x54\xe2\x85\x49\x34\x2b\x9a\x65\x12\x3d\xc4\x65\x44\x98\xc6\xf3\x44\xa6\x50\xa9\x24\x34\x24\x03\xa0\x0e\x59\xb1\xc1\x66\x55\xfc\xca\xaa\xf2\x32\x41\xa2\x12\xed\x85\x56\xaf\xc2\x4a\x98\xff\xc0\xec\xa6\xac\xee\xa4\x33\x7b\x55\x1a\x02\xd5\x2d\x2c\xee\xd6\xd7\xeb\xa7\xe7\xcd\xc8\x26\x53\x29\xf8\xa6\x60\x83\xea\xfa\x6d\xba\x75\x72\x11\x08\x25\xcd\x85\x06\xeb\xe6\x06\xb2\x7c\x73\x12\x76\x3b\xb8\xc2\xbc\x7c\xfb\x17\x56\xdd\xc5\x40\x18\x7b\x41\x53\x25\xcb\x24\x06\xaf\x44\xca\x3c\xcb\x2d\xa3\xb2\xc6\x30\xa9\x4c\xed\x91\xf1\xa5\xa5\x67\xb2\x96\x70\x52\x59\x37\x31\x94\xef\x39\xfa\xd6\xef\xbb\xb5\x3f\xb9\x5b\xe5\xa7\x84\xc4\x01\xa5\x88\x6d\x2a\x27\xa2\x3c\xd7\x28\x34\xa1\xac\xa5\xa1\xcf\xea\x56\xbf\xf9\xab\x2b\x8c\xa9\xf4\x0a\x2c\xd3\xfa\xc2\x70\x12\xbb\x93\x69\x16\x90\xbb\x67\x58\x6b\x51\x91\xab\x53\x8d\x09\x7f\x94\xd2\x69\xcc\x53\xa2\x77\x6a\xfd\xb2\x2d\xbc\x2f\x21\x97\x5d\xa3\x32\xae\x7b\x7d\x3a\x1e\xcb\xaa\xa9\xb7\x15\x98\x45\x34\xbb\xc4\x64\x8e\x56\x41\xf4\x18\x97\xc6\x50\x7e\xe9\x9c\x70\xf4\x7c\x0e\xd6\x09\xbf\xab\x37\xcd\x49\x65\xe5\xe5\x69\x3a\xeb\x0e\x3d\x4c\xc8\x71\x76\x1a\x4b\xae\x30\x1e\x2b\xa7\x5f\x5e\x34\x99\x5b\xa9\x90\x05\x2c\xee\x3c\xfc\x1c\x5f\x41\x95\xd7\xb8\xaa\xe5\x09\x73\xa0\xa0\xfa\x79\xbc\xb2\x23\x0b\x0c\x81\x7e\x57\x29\xbe\x7a\xfe\x73\x28\x08\xa0\x90\x21\xc6\xb6\xd2\xc4\xa0\x54\x87\x55\x65\xa3\xb1\x83\x9c\x09\x12\xeb\x7d\x66\xee\x60\xce\x8d\x77\x74\x85\x60\xdc\xed\x0e\x6d\xf1\xf7\xe0\xac\xc8\x43\x4f\x98\xdd\xb0\x75\x39\xe7\x42\xe5\xc8\x23\x53\x7c\xa7\xe6\x3d\x0e\xd7\x2b\x36\x4a\xd1\x12\x8e\xbb\xe6\xf0\xde\xdd\x60\x92\x74\x02\x39\xad\xfd\x33\xb6\xa1\xd0\x4f\x3c\x8a\xe5\x1d\xe0\x27\x56\x84\x62\x1b\x9f\xd5\x57\x06\xb5\x64\x19\xc6\x28\x80\x3b\x97\xda\xc2\xc0\xf7\x03\x70\x8a\x98\xd9\x01\x77\x39\x71\x13\x53\x6d\xda\xa5\x43\x82\x41\x04\x71\xe2\x16\x17\xdf\xdd\x4d\x10\xfb\x68\x53\xb2\xcb\xe0\xc6\x0d\xe2\x31\x3e\x6e\x88\x7e\xc4\x30\xd0\x34\x00\x4f\x85\xb9\xdc\x63\xf9\x76\xe5\xd4\x88\x26\x37\x18\x6b\x1f\x7d\xc7\xa0\x63\x04\xea\x8f\x63\xe2\xe4\xfe\xee\xd2\xd0\xf0\x2c\x2c\xd6\xab\x9b\x21\xe5\xb5\xc2\x34\x51\xa9\x6f\xeb\xae\xad\x80\xda\x79\x75\x80\x2c\x9f\x0c\x3b\xf0\x3a\x5d\xa2\x35\x42\x7e\x85\xd3\x17\x00\x2c\x8c\xb5\x83\xce\x67\x45\xeb\x1c\x2f\xaa\x66\xca\xdc\xa6\x10\x7c\xed\xc9\x4e\x2c\xf6\x49\x6b\xb2\x98\xdc\x28\xfb\x30\xa6\x3c\xdc\x6d\x10\x54\x42\x96\xd3\xce\x3e\x70\xeb\xcf\xdd\x0d\x92\x3f\x28\x3c\x48\x7a\x3e\x2e\x83\x2e\x18\x4c\x51\xc1\x98\xa1\xdb\x1b\xca\x6a\x99\xb9\x62\xb9\x59\x5d\xc7\x54\x90\x9b\x49\xc0\xec\xab\x49\x5a\xac\x7b\x37\x42\x18\xf1\x2b\x50\x6a\xf5\x7e\x9c\xe5\xd5\x42\x99\x84\x4e\xa9\x62\x88\xa2\xbf\x3a\x0f\xe2\x84\xa8\xb8\xa2\x1d\x6a\xa6\x6e\xee\xff\xf8\xbf\xff\x18\xc1\xb5\x06\xd1\xac\x6e\x23\xf5\xff\xdd\xfd\xea\xfe\x77\xe8\xa6\xa3\xf2\x99\xd1\x25\xb2\xf4\x0c\x2e\xc8\x3d\x1e\x58\x2a\x4c\x08\x6b\xfc\xb5\x6c\xf2\x8e\x1a\x4e\xa1\x92\x91\xb6\xab\x7c\x7d\xea\xef\x59\x07\x46\x17\x74\xdb\xf1\x2c\x5d\x6d\x97\xe5\x6a\xf2\xd5\x75\xe8\x51\xdd\x69\x03\xf5\x4f\xd2\x69\xb7\x87\x6b\x8f\x25\xb4\x58\x5d\x3d\x3d\xbe\x6c\xac\x4a\xcf\x66\x47\x5e\xf8\x66\x7c\x0e\xed\xf1\x50\xf5\x65\x67\xb7\x25\xe4\x43\x82\x23\xed\xa1\x1f\xa6\x1d\x1e\xe1\xa6\xac\x50\x82\x91\x88\xf9\xd4\x88\xd2\xcc\xd7\x44\x96\x76\xb7\x7c\x32\x7a\xd6\x66\x4c\xf1\x37\xc4\xee\xdc\x2c\xe5\x74\xee\x6f\x7b\x10\x70\x86\xa2\xfb\x1d\x65\xe2\x34\x3c\x0d\xb0\xa8\x9a\xa9\x36\xd6\x9c\x07\x92\xf5\x22\x32\x43\xdf\x4e\x73\x21\x85\x1c\x09\xf2\xb4\xcb\xc4\xf8\x93\x68\x3f\x32\xbc\x17\x0a\x73\x07\x9d\x9f\xf6\x40\x43\xa3\x7c\x7b\x82\x4a\x41\x7b\x33\xf0\xe5\x93\x3a\x30\x7b\x54\xc0\x98\x43\x79\x3c\xe9\xf6\xe3\x4d\x65\x27\x94\x0e\xb8\xd9\x6f\xda\x49\x74\xc9\xa4\xa0\x83\xd8\xa7\xdb\x2f\x06\x6c\x0d\x83\x21\xa7\x83\x18\x4c\x30\x0c\x8f\x39\x38\xfb\xb4\x0f\xb0\xea\x40\x4a\x2d\x9d\xdf\xd1\x07\xe3\x74\xa0\x8d\x38\x89\x13\x94\xfb\x32\xba\xa9\x10\x12\x52\xe5\x31\xd1\xa4\xab\xad\x83\x15\xe9\x10\x63\xf2\x0b\xc9\xe8\x1a\x32\x27\xe9\x28\x61\x24\x6a\x62\x29\xf8\x30\x37\x48\xaa\xf9\xc8\x8b\x8e\x54\x42\x15\xae\x3b\x71\x3a\xdf\x23\x7c\xdc\x31\xf6\xb5\xd3\x06\xbd\xa9\x10\x37\x47\xac\xba\x4b\x26\xb1\xa4\x67\x27\x16\x8a\xab\xd3\x99\x2e\x68\x71\x54\x1f\xd3\xfb\x7c\xf8\x97\x02\xaa\x9e\x3b\x37\x02\x45\xbf\xeb\x7d\xd9\xa3\x6f\xab\xed\x5b\x39\xca\x9e\xe8\xd4\x0f\x0d\xc2\xd1\x10\x1f\x4f\x94\x29\x94\x4e\xc3\x98\xec\x69\x2c\x7e\x61\x5e\x5e\x14\x58\x69\xf0\x24\xb1\xc6\x5a\x66\xd4\xeb\xac\xa6\x3c\xb5\x6b\xf5\x25\x61\x97\x4d\x85\x0e\x54\x8d\x25\xd2\xf8\x84\xf9\x40\x0b\xcd\x79\x6c\x37\xe8\xbe\xf7\x34\xc5\x3e\xff\xb2\x65\x6a\xa8\x24\x6c\xe6\xcf\xe8\x53\xfc\x66\xe7\xb0\x87\x2a\xcf\xec\xfb\xe2\x74\x5e\x1d\x8e\xcd\xf9\x39\x7b\xc7\x49\x5a\x56\xab\xd6\x3a\x25\x37\xbf\x6e\x1e\xcb\xe6\x3b\xe4\x9b\xac\x98\xe2\xfa\xb5\xc2\x00\x42\x47\x62\x62\x55\x76\x75\x66\xf8\x1b\xbe\x66\x45\x3b\x8b\x7f\x2d\xba\x00\x99\x7b\x55\x1a\x7c\xc2\x01\x48\xfa\xfc\xff\x28\x27\xa0\x51\xad\x95\xe7\xaa\x80\xda\x4d\xd8\x02\x63\xba\xa3\x95\x20\x51\x9a\x86\x6a\x48\x3e\x79\x47\xe8\x79\x2c\xa1\x55\xd2\x09\xd5\x7c\xb1\xbf\x33\xaf\x13\x74\x74\x26\xd3\xf8\x40\x96\xc6\x68\x40\xb6\x0e\x6b\xd2\x1d\x0a\x1e\x9a\xc2\xd5\x09\x39\x76\xdb\xc4\xa8\x7c\x9c\x20\xac\x8e\x43\x63\x9a\xd9\x40\x8f\x33\xc1\x2d\x40\xc9\x2a\xed\xd6\xc6\x06\x72\xed\x42\x13\x1b\x21\xc5\xe4\x9e\x4e\x6d\x2b\x8d\xd7\x7f\x9e\xb0\xca\xb0\xef\xa6\x4d\x3a\xac\x4b\xa5\x8c\x86\xce\xf8\x92\x3e\x03\x22\x94\xf9\xe7\x29\x93\x3f\x6f\x72\x47\xf8\x83\x5e\xc0\x52\x1a\x44\x54\xd4\x66\x33\xd9\xae\x09\x0d\x48\x5c\x75\x2c\x16\xb3\x28\x82\xb6\x23\x62\xea\x04\x9d\xf7\xd9\xf1\xa5\xa8\x41\x63\x7e\xc1\x8a\x63\xbb\x87\x09\xa7\xee\x3b\x05\x67\x2a\x5d\xbe\x1e\xd2\xab\xcd\x7f\xc7\x10\x3d\x99\x38\x4e\x80\x9e\xdb\x6b\x10\xcc\x40\x2f\x62\x9e\x8e\x7a\xa3\xac\xb9\xd0\x8f\x71\xfd\x7c\x45\xde\xea\xc3\xfa\x7a\xb3\xdd\x2c\xc7\x0c\x47\xe8\x45\xd2\x2c\xf1\x9d\x76\xcd\x4b\x91\xbd\xf7\xab\x04\x7a\x11\x72\x8a\x20\xfc\xab\x2c\x63\xce\x26\x43\x20\x0e\x41\x74\x50\x70\x93\xfb\xfc\x4e\x49\xed\x31\x9a\xd9\x7a\xf9\xe8\x25\x5e\x10\x5a\x2f\xbf\xdd\x2b\xd5\x16\x8a\x9f\xf5\xe4\x9c\x49\x60\x96\xad\x3c\x93\x58\xd4\x78\x11\x08\x40\x2f\x0d\x91\xa8\x9c\x6e\xbf\x3e\x8f\x9e\x25\x8d\x23\xed\x77\xc9\x2f\x34\xb8\x24\x9b\xd3\xfb\x68\x61\xed\x2c\x43\xf4\x52\x8c\xc8\x1c\x59\x43\xdd\xec\xfb\xb3\x82\x67\x58\x53\xb2\x42\x97\xbb\x25\x14\x57\xe8\x4c\xa7\xf1\x5d\x01\x0f\x84\x29\xd4\xfb\x85\x55\x73\xa7\x4d\x8e\xfc\x1e\xeb\x7a\xbb\x87\xe2\x21\xeb\x4e\x28\xe2\x88\xac\x60\xb3\x1b\x7c\x58\x76\xfe\xd1\x1d\x4f\x52\x0b\x33\x79\x2e\xf4\x44\x22\xc9\x98\xdc\x43\xbd\xf9\x99\xe5\x97\xc4\x04\x1f\x0c\x3c\x19\x79\xb4\x0e\x6c\x6e\x1d\x16\x1e\x3d\x19\xa3\x0a\x1c\xa3\x61\xa1\xb3\xd7\xab\xb2\x1c\x90\x1b\xf7\xef\x0f\x99\x49\xca\x52\x9d\xe2\x43\x46\xb5\x9d\x5f\xc6\xf7\x85\x7e\x4a\x2c\xdd\xc5\x40\x96\xdb\x35\x69\xa0\x3a\x47\x3a\x7a\xa7\xd0\xc4\x90\x5c\xab\x8e\x90\xa2\x5d\x1d\xc6\xf8\x86\x08\xe8\x3f\x8e\xcc\x4d\x1e\x4c\xa7\x46\xc1\xd9\x00\x4c\x6e\xb2\xf1\x12\x8c\x8c\xc5\x11\xb1\x7e\xdc\xc2\xe1\xe3\x53\x4f\xd6\xde\xd1\xb0\x65\xdc\x43\x4a\xe0\xb6\x9b\xf2\x4a\x9d\xcc\xb0\x9b\x63\x62\x46\x16\x78\x46\xac\x94\xa6\x6e\x3b\x48\x3e\xad\xc3\x46\x16\x30\x21\xbc\x9e\x55\xbd\x9d\x9d\x56\x63\x1c\x59\xa0\x12\xee\x1b\xff\xc3\xd4\x3a\x1f\x73\x90\xf3\x02\xb3\xc8\xa2\x90\x53\x6c\x59\x1b\xfa\xb6\xab\x53\x55\xac\x8d\xd4\xc4\x97\x19\x5f\x0b\x59\x94\x26\x9e\x74\x5c\xc2\xa2\xdd\x1a\x44\x8e\x33\xe4\x73\xc8\x62\xa6\x62\x83\x91\xa9\x6f\x4e\x3d\xe9\x0c\xb2\x98\x23\x11\xc3\x39\x17\xe1\x2b\x15\x7c\x0c\x5e\xee\x14\x55\x39\x39\x6f\xc2\xa8\xb2\xe3\x54\x18\x72\x1a\x17\x30\xba\x88\xbd\x20\x8b\x53\xc0\x21\x12\x7d\x36\xb4\x80\x2c\xd6\x3c\xb5\x9b\xed\xe2\x79\xbd\x7d\x9f\x7c\x9b\x24\x14\x54\x57\x70\xb5\x5d\xf5\x75\x70\xc8\x92\x08\x89\xda\x7a\x8b\xb5\x55\xf7\x73\x0d\x32\xa0\x52\xb4\xfd\xa9\x2a\xa5\xfb\x31\x65\x46\xa5\xfa\xb5\x84\xbc\x4f\x9b\x20\x83\x20\x91\x43\x7c\xed\x03\x36\xfb\x52\xdd\xa9\xbe\xdd\x90\x29\xd5\x36\xbe\x41\xcf\x31\x17\xa2\x40\x06\x36\x91\x5f\x16\xcf\x70\x2e\x4f\x1f\xec\x84\x0c\x54\xc8\x6c\x76\xc3\xea\x65\xef\x9e\x26\xf9\x4f\x64\x82\x19\x91\x6b\x69\x29\xe0\xdc\xcf\x1c\x3d\xed\x64\xa0\x89\xf6\xe1\xb9\x35\x34\x5d\x3d\xcb\xf8\x1c\x32\xe6\x3a\xe8\xa5\x4b\x6e\x66\xbf\xd6\x68\x70\xc9\xc4\x08\x97\x2e\x97\x0e\x19\x62\x1b\x14\xf7\x63\x1b\xc0\xdf\x94\x55\x83\xca\x38\x8d\xe3\x88\x31\x32\x15\xa5\x51\x5f\x01\x72\x9f\x89\xf9\x17\xa5\x14\x98\x3a\x42\xeb\x5d\x99\x70\x9c\xbb\x16\x7a\x86\x48\x53\x95\x94\x48\x19\x23\xd4\x2f\xbd\x26\x64\xe8\x9b\x97\xf2\x0b\x4e\x79\x67\x4c\x0d\x7b\x70\xcf\x8f\x5c\x69\x1e\x7d\xbf\x07\x6c\x40\x41\x03\x57\x50\xe3\xcb\xfa\x6e\xd2\x39\x00\x1a\x11\x5f\x9f\xae\xef\xab\x4d\x99\xab\x1f\x33\x38\xf4\xd9\x25\x8d\x7b\xc2\x58\xb5\x2e\xec\xbe\xc8\xf3\x97\xa2\xbe\xa8\x24\xb2\xbd\x59\xa8\x49\xab\xf9\x55\x34\x23\x48\x08\x72\x16\x0b\x9d\xf4\xab\xcb\x4b\x21\xcd\xf6\xd6\x8e\x97\xae\x13\xf7\x59\x60\xb9\x67\x09\x83\xd9\xfd\x1e\x05\x4e\x91\x71\x53\xc0\xb1\xde\x97\xcd\x04\x8d\x33\xb9\x6b\x1e\xfb\x60\x23\x09\xed\x36\xc9\xc3\x68\x5b\x92\xd4\xf6\xa4\x9b\xd6\x64\x68\x2f\xf3\x4c\xfe\x5c\xbf\x5c\x7d\x82\x17\x40\xee\xfb\x1e\xf1\x47\x19\xf7\xee\x3a\x83\x43\x59\x4c\x79\xfd\xff\x06\x3f\x8a\x3d\x5b\x10\x45\x44\xc8\x74\xb7\x7c\xda\x62\x75\xa0\x0c\xa6\x9b\xa1\x3c\x40\x8f\xf7\x81\x06\xbb\x78\x2e\xea\x67\x2a\xc9\xee\xb3\x1b\x6e\xa8\x7e\xaa\x4b\x3b\xba\x6a\xa8\x24\x25\x60\x68\x69\xe8\x7c\x61\xe4\x11\x37\xc4\x46\x26\x5c\xd5\xe0\x03\x09\x2d\x0f\x73\x79\xb3\x0b\x27\x8f\xb4\xf2\x5d\x84\x90\xf6\xeb\x6e\xa1\xe4\xb1\x1f\x75\x25\x6c\xed\xf4\x6c\x9d\x37\xaa\x79\xed\xbe\x76\x1c\x2a\xa2\xb4\x3f\x94\xf2\xe7\xae\xf5\x4a\xee\x2e\x95\xcd\x5c\xd7\x14\x7c\x1b\x1b\xdc\x89\xf1\x97\x77\x3d\x20\x25\x96\xbc\x7f\x9c\xf2\x1c\xaa\xa5\xe3\x32\xe9\xae\x05\x18\x28\xb7\x19\xca\xb2\x52\x5f\xcb\x5c\x4d\xa2\x28\xc8\x13\x30\x35\xb0\xd0\x34\x20\xf7\xfd\x49\xe6\x6f\x2a\x11\x06\xe1\xf6\x17\x96\xff\x19\xdb\xbb\x3c\xd1\x3c\x1d\x84\xff\xb6\x3d\x01\x1e\x72\x48\x55\x60\xe2\x11\xc7\xd3\x45\x65\xd6\x64\x1c\x03\x0a\x9d\x1a\xb8\xe9\x6a\xbd\x5c\xaf\xae\xef\xb6\xee\x34\x22\x52\xc2\xee\x30\x57\xea\xb8\x2a\x9a\xea\x6c\xca\xed\xdc\xf8\x60\xd1\xbf\x5d\x57\xa5\x9d\xcc\xfd\x42\xfd\xba\xac\x24\x47\x2e\xb9\x2f\x0c\x75\xf7\x6a\xba\xe6\x72\x19\x07\xe4\x02\xb4\x16\xde\xf0\x03\x4b\xf0\xc8\x0e\x36\xc1\xb2\x7b\xd4\x6e\xfd\x9e\x7c\x19\x15\x46\x14\xbf\xb0\xec\x8c\x54\xf4\xe0\x1e\x42\x81\x4f\x6e\xcb\x33\xbc\xd5\x3d\x5e\x16\xb9\x42\x6d\x56\x37\xf2\x17\xca\x23\x39\x26\x0d\x1c\x9c\x8b\xc5\xd1\x0f\xc1\x98\x8b\x79\xfe\x5c\x96\xfb\xba\x6f\x80\xc8\xfa\x81\x2e\x4b\xd4\xb7\xc5\x60\x38\x3b\xad\xf6\x49\x3b\xc0\x07\x4e\x08\x47\xc5\xa8\x22\x6b\xb5\x7c\xda\x6d\xfe\xda\x6c\x57\x0f\x3b\x0a\x1a\xba\x76\x1d\x24\x54\x38\x64\x78\x45\x0d\xf0\x61\x51\xb5\xeb\x7d\x9d\xd5\x4d\xef\xce\x72\x2d\x03\x0a\x64\x92\x03\x7f\xc8\x06\x0d\x88\x54\x8f\xb9\x84\xe6\x9a\xe0\x5d\x1d\xfd\x2e\x72\xad\xd3\x40\xf7\x15\x3b\x17\x8f\xac\xb5\xd1\xb4\xde\x90\xaa\x45\x9e\xef\x6c\xe9\x8d\x6d\xf7\x3d\x3f\xa5\xf0\x78\x66\xea\x41\x08\x92\x33\x9c\xfc\xbe\x27\x42\xc2\xde\x3f\x57\xa5\xc4\xba\x6e\xad\x2c\xf7\x6a\x7c\xc6\x4d\x15\xe2\xee\x68\x24\xd8\x4c\xa9\x2c\x56\xbe\x77\x0d\xe7\xae\x97\xef\xa7\x94\xd6\x7b\xd8\x6e\xbb\x9f\xc2\x34\xea\x0a\x67\x77\x36\x96\xd6\xa5\xf4\xd1\xf7\x21\x52\x36\xfb\x74\x0b\xf5\x0b\xe1\x2c\x2c\x85\x68\xd8\x2f\x53\xa1\x1d\xaa\x7e\x20\x43\x87\x6d\x37\x6e\xc0\x6c\x50\x0c\xfd\x10\x43\x43\x33\x8c\x8d\xdc\x53\xd4\xeb\xea\x7c\x47\x01\x92\x07\xac\xda\xcf\xde\x8c\x9f\x3d\x52\x26\x6a\xd7\xd1\x43\x39\xd2\x46\xdb\x1e\x73\x45\x3c\x09\x0b\xf5\xab\x5d\x5c\xd4\x6e\x51\xe0\xa1\xcc\x3e\xdb\x10\xfc\xd6\x2d\x4d\x9d\x2f\xb1\xb6\xd4\x07\x03\x34\x02\xfa\x89\x17\x44\x36\xa7\xd9\x4e\x08\xbf\xfb\x1d\x3c\x66\x01\xda\xeb\xf2\xd4\xe0\xcc\x94\xf4\x53\x16\x9b\x34\x53\x56\x64\x87\xd3\xe1\xb6\x84\x7c\x00\xf2\x46\x3f\x0d\x52\x23\x5f\x6f\x0b\x5b\x2e\x65\x6a\x27\xaf\x0c\xc2\x84\x78\x02\x96\x8e\xe0\x65\x3c\x4f\x7d\x91\x72\x87\x29\xba\x85\x1c\xde\xcf\x93\x1b\x12\xa9\x42\x97\x5f\xa0\x53\x4c\x62\xc8\xe8\x0b\x60\x94\x75\xdb\xb9\xb4\xe8\x22\xcf\x3b\x36\xa7\x7a\x7c\x73\xae\xf4\xba\x3d\x2a\x25\xa5\x8e\x4d\x83\xef\x5b\xc8\x7f\xba\x07\x94\xb1\x4f\x6c\x93\x57\xca\x54\x9f\x6c\x9a\xb2\xea\x46\x4f\xe2\x3a\xa5\xbe\xa1\xf0\x1e\x2a\x19\x75\xa7\x56\xa9\xd1\xf3\x34\xd4\x6e\xf7\xd9\xa0\xdc\xb8\x8f\x20\xa3\x8f\x91\x4f\x05\x39\x24\xa9\xb5\x29\xc0\xe5\x4e\xd1\x47\x08\xa9\x65\x83\xc5\x54\x14\xec\x53\xb3\xc9\xd7\x8c\x21\x0e\x51\x04\x06\xbf\x94\x2f\x9a\xa6\xb2\xf8\xf7\x41\x56\x0e\x7d\x0d\x9a\x40\x75\x96\x27\xf0\xf1\x74\xb0\xf9\x52\x0c\x3c\x3f\xa6\x6d\xb2\x5d\x7f\x07\xbc\x26\x23\x97\x37\xf0\x52\x4e\x1f\xe7\xe6\xe9\xe5\xf1\x7a\xb5\xb6\x69\x0e\x77\x0a\x16\x44\xc2\x1b\x30\x59\x2c\xcb\x83\x68\x2d\x8e\xac\x2c\xbe\xa1\xf9\xce\xc9\xff\x05\xff\x76\xbd\xc3\x84\x10\xc9\x96\x0b\xc8\xba\xd0\xdd\xb9\x04\x52\xe0\xc4\xa4\xf3\x16\xc7\x63\xee\x82\x1f\x53\xe4\x3d\x06\x4c\x1b\x92\x1d\x22\x70\xc8\x47\x64\x8a\x18\xf0\x28\x75\xe5\x34\x1b\x59\xc1\xd1\x12\x0c\x5c\x9f\x2a\xb8\x8c\xef\x05\x81\x87\x14\x5c\xdf\x7e\x5b\x5e\x8f\x14\xcb\x7e\x0b\xd8\xc7\x20\xe0\x29\xb3\xa6\xc8\xc2\xd6\xe2\x92\x0e\xac\xcd\x92\x9e\xfa\x72\x04\x0c\x02\xdf\x97\x76\x16\x7c\x87\x6a\x7c\xc7\x81\x30\xe7\xf9\xb6\x78\x5e\xfc\x35\xcc\xfc\xce\x2d\x0f\x41\x20\x19\xc5\x5b\x75\x56\xa8\x5d\xdb\x62\x25\xb0\xec\x97\xb7\x2e\x63\xf7\x05\x03\x8c\x1c\xbb\xc0\xf3\xdd\x0e\x55\xd6\xec\x98\x37\xbe\x7e\xe8\x73\x22\xa8\xb4\x16\x50\x6d\x04\xca\xc6\x93\x30\x08\x15\x12\x61\xd9\xad\x29\xa2\x99\x82\xb3\x31\x88\xb8\x8f\x66\xf1\x21\xfe\xe0\xa9\x47\x72\x11\x5b\x0c\xa2\x20\xa0\xd0\xd4\xa2\x96\x58\xa8\x5b\x57\x9b\x8e\x41\x14\x21\x9a\x1a\xd2\xec\xf5\x15\xab\xef\x65\x2e\xa1\x28\x57\xd5\xe9\xd8\xc7\xa5\x31\x48\x55\x08\xa2\x8f\x3b\xdf\x15\xba\x5c\x90\xda\x4c\xbb\xba\x8f\xef\x1d\x18\xa7\x9c\xc8\x15\xea\xb2\xc2\xe5\x3e\x3b\x1a\x96\xa8\x2f\xa3\x37\x05\xca\x10\xc6\xbd\x61\x66\xe4\x35\xd4\xe4\x34\x22\x8c\x9c\xde\xe4\xb7\xc7\xe5\x05\x1f\x2e\x06\x02\x02\x13\x6c\x7a\x83\xe3\xef\x6a\x18\x3f\x9f\xe8\x81\x10\x26\xed\xf8\x75\xc2\xea\x8e\x81\x50\x01\x21\xd1\x69\x12\x2d\x6c\x19\x70\xdd\xb7\x6a\x1e\x0f\x22\x16\x56\xb9\xc0\xb5\x6a\x6d\x54\x77\x48\x3b\xf7\x35\x2b\xbe\x8c\x2e\x2a\x23\x34\xbe\x2b\x34\x59\x53\x7e\xe9\x7e\xd5\x14\x1d\x11\x50\xe3\xce\xec\xc7\x35\xa2\xda\xc1\x20\x5f\x83\x81\x8c\x63\x3f\x1a\x54\xeb\x15\xe7\x7b\x28\x14\x91\x75\x74\x3e\xc3\xac\xf3\x10\x48\xa9\xa4\x59\x4d\xeb\x53\xde\x50\x31\xae\x6d\x51\x2c\x96\x4e\x2c\xf6\x54\x28\xca\x46\xcd\xd2\x4c\x61\xa0\xb4\x4f\x38\xc9\xaf\x6b\x42\x68\x0f\xa3\x1c\x81\xd2\xa9\x3f\xa4\x11\xa2\xba\x36\xdb\xa6\xd3\x90\xf0\xdf\xc7\xec\x88\x03\xa4\x32\x86\x5e\x20\x2d\xf1\x63\xc7\xa6\x33\xb3\x9d\x86\x2c\xf0\x94\x11\x20\x29\x6b\xdc\x5a\x35\x22\x9d\xe5\x38\xd4\xf6\x70\x43\x2c\x64\x91\x91\xff\x78\x7a\xb8\xfb\x7e\xb7\xd8\xae\x1c\x54\x07\x43\x96\xca\x40\x8e\xb2\xec\x0f\xa5\x1a\x14\xa6\x62\xc8\x20\xf5\x1c\x7c\xc4\x70\x73\xb4\xa6\x58\x3d\xc5\xc7\x4c\xaa\x50\x30\x64\x52\x10\x3f\xd8\xee\x21\x2b\xb0\x8b\xd6\x84\x3c\xf4\xc9\xd2\x75\x0f\x47\x21\x9b\xbd\xf1\x5e\xc6\x27\xe0\x69\xe4\x48\xb2\x1f\xce\x5d\xfa\xb1\xbe\xca\x41\xfe\x34\x51\x3b\x52\xcd\x46\x07\xa2\xc5\x90\x03\x98\x89\xd2\x40\xd5\x5c\xb5\x2f\xb0\xbf\xac\x04\x62\x4e\x59\x3f\xdd\xaf\x76\x9b\x97\xe7\xd5\xba\x6b\xd1\xb1\x08\x9d\xd2\x7b\xb3\x2d\x9f\xe1\x7c\xa9\xf6\x8e\xa1\xef\x7b\x12\x5c\xc2\x85\xce\x5d\x3b\xdc\x58\x32\xc5\x46\x4d\xde\xbe\x9f\x1a\x70\x5b\xdd\x43\xad\x17\x85\x32\x92\x0e\x5f\x66\xd6\xce\xd0\x07\x9f\x80\x8d\x1b\xec\x88\xe7\xe6\xd5\x3b\x31\xf4\x51\xbb\xf8\x1d\x99\x6a\x63\x74\xbc\xed\x14\x70\x4d\xeb\xc3\x42\x51\xb9\xd8\xdf\xcd\xa3\xda\xa3\x43\x4f\x9a\x08\x35\x54\x5b\x78\xcf\x46\xe1\x35\xd7\x85\x23\xe5\xa4\x1f\xa0\x2a\x32\x1c\x78\x3e\x61\x18\x33\x61\xc7\xd7\x16\x8a\x9f\x1b\x07\xd1\xec\x9e\x35\x62\x8a\x62\x49\x7d\x96\x39\x2b\x5e\x8d\xb2\x56\x36\x57\x3f\xf6\xc1\x4d\x46\x91\x22\x30\xe9\xee\xe0\x4a\x6f\x3e\x44\x5f\x99\x09\x72\x19\x0b\x0d\xa3\x38\x34\xd8\x84\x77\x17\x93\x0c\x63\x34\x00\x73\xca\x8e\xaf\x1d\xb5\xc2\xac\x73\x1b\x26\x5e\x64\x24\xeb\xa0\xde\xdf\x75\x2f\x20\x49\x3d\x5a\x65\x6a\xf8\x85\x83\x31\xd3\x1f\x96\x8a\x90\x48\x3b\x1f\x50\x41\x9e\xf7\x1b\x4d\x98\xca\x90\xa2\x26\x4e\x21\x78\x4e\x10\x09\x43\x88\x42\x4a\x14\x3e\x5c\xdf\x2d\x9f\x08\x21\xc3\x7e\x87\x3b\xfb\xe0\x15\x8a\xc0\x27\x3b\x89\x4a\x63\x5d\x59\xbc\x89\xfd\xb9\x5b\x12\xca\x70\x89\x98\xc5\x69\xac\x69\x3d\x7c\x93\x32\x62\x84\x92\xbb\xca\x9a\xe5\xbe\xac\xd4\x6f\x42\x0f\xa1\x62\x40\xab\xd0\xaa\x18\xf1\x56\x60\xa8\x38\x06\xcc\x5a\x7a\xcb\xb2\xfa\x4d\x0a\xb0\xed\x4e\x98\xb2\x9d\xd5\xdf\x2e\x4b\x9b\x46\x48\x26\x1d\x31\x8a\x08\xee\x44\xfe\x56\xbb\x59\x3c\x40\x3f\x66\x31\x01\x48\x3b\x1f\xb0\x47\xe9\x63\xa8\xfd\xc0\x18\x35\x27\x31\x38\x6d\xd2\xb5\x1a\xeb\xda\x0c\xe5\xd5\xdd\xf3\x40\xa8\xf0\x43\x6b\xae\x3d\x8a\xe2\x0e\xcf\xc4\x72\xd6\x5d\x29\x65\x2e\xdc\x64\x33\xae\xe3\x35\x45\xcb\x84\x28\xae\x8c\xa6\xeb\x3e\xab\xd4\x8f\x0e\x7d\x83\xa1\xd6\x01\xa1\xa6\x9b\x0c\x2b\x5b\xe8\x82\x91\x67\x29\x24\x16\x5a\x67\x79\x46\x81\xb8\xc9\x78\xbe\xfc\x92\x91\x97\x7a\x3a\xe8\x05\xdb\x40\x36\xd7\x78\xac\x50\x0e\xc2\x7b\x91\x07\x82\x18\xfe\x9e\x21\x07\xd9\x0e\xf2\x76\x89\x73\x00\x43\x8c\x78\x68\x54\xc7\x36\x98\xeb\x67\x38\xbb\xa2\x88\xbf\x0b\xe2\x18\x8d\x94\x88\x47\x41\xcf\x4a\x76\x03\x79\x2e\x40\xfe\xa4\xdd\xde\x75\x48\x12\xc3\xe9\xe8\x62\xba\x03\x29\x05\x8c\x78\x0a\x46\xae\xb8\xdd\x21\x1e\xf1\x7d\xc8\xcc\x8a\x11\x87\x90\xfc\x58\xf9\xf5\xc7\xd2\x84\x8e\xba\x86\x94\x59\x83\x60\x37\xa0\xbb\xdb\x35\xe5\x31\x77\x2c\xc8\xf3\xab\x42\xc4\x85\x91\xd8\xbd\x32\x9f\xef\x99\x82\x2d\xee\xbc\x7e\x1a\xa7\xc6\x42\xa8\xf1\x22\x56\xf8\xbb\xbf\xee\x1c\xc2\x57\xa6\xc0\xbb\x90\x65\x3b\x61\x49\xf9\x69\xcc\xce\x83\x51\x98\x58\xd6\x63\xe2\xd8\xca\x5e\x8b\x97\xe3\xec\x7a\x12\x85\x29\xa3\xaf\xf5\xfc\x7d\xa8\x1d\x87\x51\xa8\x24\x71\x22\xd2\x4a\xf8\x80\x87\x2e\xd6\x12\xc5\x5e\x40\x8e\xed\x01\xb2\xa2\x41\x62\x78\xdc\x90\x67\xd2\xee\x44\xf5\x0c\xd7\x16\x46\x49\x22\xa9\xfa\xdb\xa5\xd4\xda\x9e\xd3\x52\x65\xdb\x55\x78\x18\x58\xf0\x81\xc2\xaa\x8f\xf1\x46\xa2\x35\x10\x07\x7a\xbc\x96\x67\x6a\xfc\xf6\x85\x0a\x9c\x68\xe3\x22\xcf\x6f\x61\x82\x07\x88\xa4\xaf\x88\x9d\xf5\xea\x7e\xb1\xfc\xb6\x7c\xba\xdb\x74\x0d\x61\xea\x77\x35\x4f\x14\x1f\x98\x21\xfd\xc1\x48\x05\x8c\x48\xb2\x48\xf8\x66\x18\x2b\x89\x54\x98\x50\xb9\xc5\xe2\xeb\x62\x37\x7a\x91\xa8\x65\xe2\xbb\x35\x94\x2c\x15\xe2\x27\x1d\xdd\xfd\xf8\x22\xda\x63\x10\x8f\x5d\x29\xee\x7f\x19\x77\x49\x4d\xf9\x06\xa8\xff\x9c\xea\x66\xe7\x96\xef\x9d\x22\xd2\xba\x6e\x3a\xc7\x1e\x8b\xe9\x7e\x1f\xee\x96\xeb\xa7\x81\xea\xea\xdf\x9b\x7d\xb1\x07\xdc\x41\x62\xda\xd7\x99\xe9\x66\x8b\x87\x63\x0e\x0d\x29\xd2\xd9\x4e\x8c\x21\x25\xc6\x8e\x39\x14\x3b\xa3\x06\x48\x78\x60\xd7\xce\x7d\x8f\xac\x6b\x81\xc5\x1a\x41\x9d\xfb\xdf\x19\x95\xc1\xa8\x8c\x62\x79\xcf\x7b\x2c\xca\x03\x16\x65\x31\x5e\xfa\x62\x1e\x04\x44\x61\x9e\xc9\x72\x9b\xe5\x79\x77\x78\x18\x26\xee\xde\xcc\x4d\x1b\xd2\xfb\xd6\x49\x2b\xc8\x62\x35\x6f\xcc\x0d\xc2\x98\x43\xac\xe5\x90\x5f\xf3\x3b\x54\x59\xef\xab\x5b\xbf\x36\x0a\xfe\x18\xf8\xd3\x31\x57\x11\x09\xc2\x5d\xe1\xff\x60\x54\x5e\x8d\xb1\x1f\xc7\x5e\xea\x32\x70\xa7\x4a\xa2\x59\x79\x3e\xdd\xb1\x62\x5f\xf8\x34\x40\x5d\x75\x4d\xc7\x0a\xd5\x4e\xb3\xf1\x60\x8e\x03\x8f\x11\x39\xd0\xa2\x92\x65\x01\xf3\x5a\x44\xff\x9f\x6b\xc8\xe4\xfb\x06\xa1\x71\xb6\x7b\x86\x2a\xac\xa7\xbc\x54\xae\x2b\x70\xe5\x77\x0c\x4a\xd9\xe1\x74\x58\x15\xaa\x7c\x1b\x84\x56\xe2\x40\x06\x34\xcb\x7f\x40\xbd\xef\x4a\x1c\x6c\x5b\xc8\x63\xe1\x0d\xaa\x2e\x9d\x1d\x3c\x3b\xec\x42\x69\xea\xe1\x57\xdb\xfb\x21\x90\x6d\x6c\xa1\xc7\x71\x94\x2a\xe3\xbe\x9f\x6f\xca\x4a\xa2\x81\x27\x0f\xb9\x9a\x30\x8e\x53\x9f\x22\x38\xe3\x7a\x0b\xd7\x28\x38\xd9\xd2\xbd\x3c\xd4\xfc\xa3\x27\x52\x53\xc4\xc1\x86\x32\x6d\x2a\xd9\x36\xa6\xa9\xef\xeb\x2e\x46\xb7\x85\xd7\xab\xf3\x43\xa9\x4e\x39\x6e\xcf\x47\xc7\x7b\x36\x66\xf3\xc3\x18\x42\x2f\xd4\x43\x4b\x6f\x36\x28\x16\x43\x28\xba\x30\xfc\x43\x56\x34\x8b\x53\xb7\x43\xc5\x80\x31\x21\x92\x48\x44\x82\x4d\x4a\x07\x31\x16\xc8\xc9\x19\x7b\x73\x85\x56\x13\x3f\x36\x16\xa8\x23\x57\xb2\x51\xc8\x93\x68\x2d\xbb\x79\x3c\x44\x2c\xb9\x07\xce\x65\x2c\x0f\xc7\x06\x77\xdc\x01\x2b\x62\xc9\x63\xd2\x86\x5b\x5c\x3f\xdc\x3d\xee\x96\x4f\x8f\xdb\xf5\x62\xb9\xed\x5a\x03\x8f\x3b\x0b\x93\x90\xe8\x4f\x9a\x77\x6d\xa8\x28\xb1\xbd\xfd\xb6\x1d\xcd\x2a\x95\x04\x72\x08\x84\x3b\x4d\x0a\x09\x30\x56\x98\xc8\x4e\xdc\x2c\x13\xd9\xed\xea\xd1\x9b\x71\x99\x63\xe4\x5e\x14\xd8\x2a\x0f\xc4\xea\x02\x67\x15\x63\x20\x42\x4b\xd5\x7d\xb7\xd9\xbc\xac\xae\xc7\x61\xc7\x18\x21\x71\x64\x3e\x37\x15\x22\x05\xad\xaa\x25\x34\xf8\x5a\x12\xe6\x6e\x76\x4e\x25\x1e\x93\x89\xb9\x3d\xc8\x6f\xca\x6a\x69\x73\x38\xa3\x7b\x4b\x98\x97\x38\x2e\x24\xa3\xde\x44\xdf\xf7\x75\x08\xd6\x1b\xf7\x0f\x4d\xd5\x43\x56\x5f\x9d\xce\x4f\xc7\xee\x75\x25\x4c\x4a\x4a\xa3\x1d\x89\x34\xc8\xfe\xc8\x3d\x9f\x6c\x10\xc7\x4a\x3f\x50\x65\xc6\x84\x73\x16\x78\x23\xd9\xdf\x7b\x2a\xa4\xf8\x34\x23\x9d\xf0\x94\xfb\x5e\xb7\x52\x18\x9d\xaf\xd1\x68\x4d\x78\x1a\xd1\xdb\xbc\x5e\x6e\x9d\xaf\x9d\xf8\x81\xe1\xa5\xa4\x18\xd2\x78\x58\x25\xbe\x00\x1a\x00\x75\x56\xbc\xe6\x78\x57\xfc\x2a\x7f\xe2\x8f\xac\xd9\xf3\x45\xd5\x0b\x1d\xfc\x31\x5f\x2d\xed\x4e\x21\x15\x85\xe6\x2c\xcf\x5c\x77\x55\x89\x54\xda\xb9\x2f\x4f\x35\xde\x20\x6e\xf7\x15\xd6\xfb\x8e\x88\x1e\x13\x1f\xa3\x34\x1e\x80\x0f\x9e\x28\xe0\x57\x7f\x31\xfa\xdd\xee\x1f\xdb\x39\x60\x1d\x1b\xcd\x16\xeb\xa6\xb5\x48\xc6\x77\x11\xc8\x98\xde\x76\x57\x63\xf8\xa1\xfa\xdb\xf8\xb8\x90\x79\x26\xde\x35\xc0\xd4\xc3\xe5\x50\x09\x43\x46\x55\x2c\xbf\xca\xd6\x82\xb7\x1a\xfb\x2f\x45\xd6\x4c\xfb\x61\x42\xc9\xad\xed\xbd\x55\xf0\xd8\x6d\xfe\x7a\xb8\x7a\xba\x77\x0f\x1d\x79\x2a\xb0\x76\xc8\xa3\x43\x87\x96\x55\x7d\x51\x9f\x8a\x49\x24\x0d\x31\x58\xbb\x56\x53\x6d\x7b\xbb\x34\xcc\x32\x72\x60\x12\x33\xdf\x33\x4e\x6b\x7b\x67\xf5\x2e\x53\xd3\x0e\x5c\xdb\xcc\x95\xcd\x24\xdc\x43\xdd\xbc\x18\x5d\x9c\xec\x30\x59\x92\x93\x38\x31\x14\x75\x1b\x10\x55\xe6\xf6\x3c\xd7\xa6\x91\x39\xfe\xb0\x03\xe4\xf9\x12\x8e\x5d\x1d\xe9\x73\x6f\xa4\x7f\x30\x80\x13\xc6\xc9\xed\x22\xa3\xad\xf7\x4f\xc7\x9d\x52\x26\x3d\x87\x4a\xc9\x0e\x38\xe4\xd0\x70\x3d\xb8\xe4\xac\xe3\x54\xb9\x29\xab\x35\x2a\x3c\x1c\x3f\x43\x4f\xba\x23\xfd\x80\x30\x00\x64\x3a\x12\x0d\xb1\x7b\xb0\x34\x8d\x89\xe0\xf2\xf9\xe5\x71\x39\x7a\xe2\x54\xba\x4c\x06\xa8\xdd\xdb\x1e\x2b\xdc\xbd\x82\x7a\xc5\xe9\xa7\x4f\x55\x48\x6c\x0b\x94\xbe\x9c\x8e\xbe\x8b\x32\x52\x4c\x20\x35\x08\xab\x97\xe7\x1d\x65\xb5\xaf\xb0\x43\x35\x24\xc2\x53\x86\x8a\x94\x0a\x7a\xa0\xf8\x59\x9d\x8e\xdd\xcc\x12\xda\xf3\xa2\xa1\x80\x29\x59\x5c\x9b\x51\x7d\xf9\x60\x0b\x75\xdb\x70\x22\x34\xd3\xa9\x7d\x90\x3b\xba\x97\x7a\x42\x71\x8b\x89\x8c\x4d\xfe\x2e\x2b\x64\x45\xdc\x69\xbf\x20\xcb\xaf\x2e\xf9\x0c\x86\x73\x53\xb1\x90\xb6\xb9\x6f\x78\xbe\x99\x51\xf8\xeb\x7b\x11\x76\xe7\x1e\xea\xef\xf8\x0a\xdd\xa3\x6a\xc6\x1c\xef\x96\xca\x71\x59\x76\x80\x9d\x44\x0b\xa0\x20\xb3\x2e\x2b\x62\x75\x1a\x2e\x5f\xf6\xc9\xc6\xd7\x48\xbd\x34\xb1\x81\x8b\x66\x75\x38\xe6\xe5\x19\xab\xdf\x84\xf2\x52\xc6\x7d\xa2\xb6\x3b\xc0\xfb\x75\x59\x94\x1d\xc2\x22\xe5\xbe\xb6\xc5\xed\xad\x61\xbb\x6b\x3a\xe1\x4d\x4c\x79\x60\x60\x48\x86\xe7\xd9\x96\xe8\xb5\x0b\xc2\x90\x75\x17\x53\x6e\x19\x5e\x1b\x84\x83\x89\x10\x76\x27\xf7\x43\xb0\x00\x5c\x42\xe5\x10\x15\x70\xd7\x26\x8d\x30\xd6\xb1\x7c\xc3\x6a\x10\xbd\x4e\x7d\xe5\x53\xd2\x8c\x06\x18\x79\x5f\xff\x5f\xc5\xe8\x98\x06\x41\x4c\xb3\x6f\x0f\xf5\xf5\xc9\xa4\xdc\xc6\xd9\xfd\x34\x48\x7d\xc2\xae\xae\xb6\x5f\x49\x33\xe3\xf6\x69\xe1\x96\xae\x34\xe2\x48\x46\xf3\x8d\xe7\x79\x7c\x38\x43\xd2\x48\x68\xcf\xf0\xcd\x1c\x81\x02\x37\xb3\x93\x3f\x4d\x78\x80\x96\x96\x66\x48\x4b\x5b\x5f\x06\x75\xd2\x84\x0b\xda\x1e\xdb\xd5\xe1\xe9\x17\x56\x77\x43\x88\x45\x9a\x28\xf3\xcd\xb2\x22\x6b\xd6\x60\x4d\x8e\x3e\xf7\x98\x26\x2a\xa4\x80\x19\x28\x65\x79\x5c\xca\xa2\x6e\x2a\xc8\x2e\x36\xf6\x59\xbe\x76\x4c\xc1\x0b\xac\xef\x27\xcb\x42\xd1\xc6\x6d\xe2\x7c\x55\x37\x06\x20\xe2\x54\x51\x50\x16\xd7\x98\x67\xbf\x3a\xa1\xa9\xb6\x25\x0d\x0d\x04\x96\x68\xba\xe7\xdf\x85\x60\x86\x39\x02\x8c\xc3\x3e\x8e\x1b\xa4\x22\x65\x54\x19\xfc\x3d\x93\x4d\x6b\xe5\x9c\x0e\xed\x66\xb1\x7c\x1a\xbf\x76\x81\x11\x18\x56\x53\xb5\x6a\xf6\x03\x86\x39\x4c\x85\x36\xec\xb4\x2a\xab\xcb\xb7\xee\x00\x89\x1a\x7a\xb0\x8d\x9d\x21\x0e\x24\x3b\xeb\x7b\xa6\x8a\x2b\xaa\x3a\x7b\xc4\xb7\x31\x43\xfc\x07\x1c\x46\xf3\x4f\xab\x7c\xc3\x49\x7c\xff\xaf\x3f\x47\x4f\xa0\x2c\xc8\x94\xfc\xfd\x76\xb9\xf9\x32\xb9\x7a\xc2\x29\x83\xb2\xdd\x1b\x7e\xfa\x49\x2b\x30\x42\x55\x16\x3b\x45\x24\x22\xdd\xeb\x53\x2a\xa5\xb4\xd8\xcf\xb3\xb4\xb5\xc9\x97\x31\xb6\x14\xc3\x80\xe0\xa6\xdb\xd5\xe2\xc1\x6a\xc3\x38\xb3\x38\xc5\x28\xa5\x38\xa0\xc9\xa7\x39\x71\x8f\xb9\x93\xa4\x9c\xb4\x62\x6e\xaf\x9e\x87\x11\xaf\x14\xc1\x48\xb9\xdb\x24\x2b\xf9\x95\xcc\x33\xff\x8d\xb7\x8d\x14\x45\x48\x68\x3a\x85\xd0\x50\x50\x74\xf7\x8b\x39\xcb\x3e\xd5\xbe\xe4\x96\x29\x30\x49\x92\x6e\xc3\xdc\x4c\x8a\x1b\x52\x1d\x29\xb2\xd7\x1b\xc3\x97\x79\x03\x12\xb7\x65\xfb\x6f\xaf\xfc\x83\xa9\x96\x92\x2a\xbe\x9d\x2c\xe5\x87\x3a\x1e\xa6\x3f\x78\x91\xa9\x2a\xdd\x41\xdb\xd1\xd0\x2c\x98\xfc\xa3\xe5\x51\xe9\xc3\xe6\xe0\x29\x8f\xdc\x40\x2c\xd4\xba\x53\xdd\x42\x60\x9e\x4f\xea\x01\x6b\x0b\x96\xea\x7e\xf7\x0d\x20\xf4\x19\xe5\x29\xcf\x4e\x87\xa7\xee\x2e\x81\xf9\x06\xc8\xdd\x3a\xf4\xb2\xac\xba\x88\x17\x30\x0c\x79\x87\xd9\xbf\x71\xbf\xfa\xbe\x29\x5d\xde\x39\x58\xc2\xf5\xa9\x91\xfb\xa1\x10\xf1\xc5\x3a\x08\xbe\x34\x44\xe3\xf6\x71\xb7\xa5\x0d\x9b\x3d\x80\xc3\x49\x41\x90\x24\x84\x41\xcd\x0c\x46\x7c\x32\x30\x21\x04\x83\xcc\xc6\x42\x95\x55\x3d\x4f\x88\x88\x10\xa2\xa6\x2c\xc4\x11\xaa\xa6\x75\x10\x77\xad\xf5\xa8\x6c\x98\x7c\x77\x80\xaa\xca\xe0\x15\x77\xa3\x1a\x23\x88\x40\x27\xbc\xb3\xe5\x52\xf7\x73\x2c\x3c\xda\xbc\xaf\xb2\x3c\x13\x8e\xd3\x00\x21\xe1\x51\x18\x0e\x40\x19\xcf\xe6\x52\x33\x32\x59\x08\x89\xf0\x08\xba\x85\x05\xe1\xef\xdd\x29\x52\x2f\xa2\x54\x5c\x8e\xba\x19\xa5\x97\x21\xf5\x80\xfc\x9d\x1e\x1f\x55\xdf\x94\x95\x01\x90\xba\x2e\x3c\xe1\xd1\x10\x6f\xd6\xae\xd5\x0a\xdf\x5d\x3b\x44\xd2\xb2\xef\x54\xb5\x39\xfb\x88\x91\xdc\xf6\x12\x1e\xa4\xae\x56\x2d\x2b\x5e\xfb\x3d\xdb\xb5\x4b\x83\x09\x12\xa7\xf3\x28\xb2\x00\x02\x35\xc1\x91\xfe\xfa\x36\x5c\x57\x40\x41\x1c\x75\x3c\x3a\x85\xca\x8c\x63\x31\x7e\x1b\x18\x6a\xed\x62\xfd\x90\x51\x51\x2b\xf6\x32\xf1\x08\x98\x84\x34\xa5\x8e\x86\x20\xf3\xb3\x52\xa8\xc9\x67\x47\x19\x53\x8c\xf4\x66\xf5\x78\xf7\xe7\xe4\xaa\x1a\x3d\x1a\xdd\x59\xbd\x38\x60\xa1\x50\xad\xa0\xca\xcf\x5d\x71\xe0\xa8\xb3\xf0\xb8\x17\xdb\xe2\x8b\x97\xbb\xa2\xd9\x9e\x8f\x2e\x90\x6a\x36\x3c\xbb\xdf\x09\xce\x12\x8a\xaf\x03\x15\xb2\x3f\x40\x91\xe9\xd6\xad\xb8\x99\xca\x54\xa2\xe0\x5c\x04\xa1\x45\x3c\x1a\xa6\x28\x31\x53\x93\xe8\x3a\x87\x8a\xf9\x44\x5e\x31\x28\x3f\xef\xce\x14\x22\x19\xe9\x44\xa6\xf1\x7a\xaa\xa6\xf7\xee\xa7\x61\x2c\x7a\x0b\xe7\xda\xea\xa5\xab\xa1\xf4\x9b\xed\x1a\xf0\x90\xf7\xdb\xd2\xe7\x60\x61\x11\x28\x90\xa6\x12\x54\x19\x59\x87\x1f\x88\x3f\xbb\x52\xf8\x76\x31\x95\x04\x14\x5d\xae\xee\xba\x9f\xa4\x88\x22\x0b\x39\x98\xc0\x19\x45\xa8\x0c\x96\xd2\x96\x3c\xcf\x0c\x4e\x11\x22\x70\xec\x9d\x8d\x01\xd4\x5c\xc4\xdc\xc0\x6d\x1c\xd9\x82\x7b\xdb\xa3\x4b\xc4\xa9\x89\xa5\x1b\x2d\xe3\x5b\xe7\x96\x8b\x44\xd8\x2a\x1c\x72\x05\x1f\x50\x65\x30\xad\x97\x46\x91\x72\x3f\x8a\x5c\xdc\x5a\x96\x07\x1a\x34\x86\x1e\xfc\xcb\x05\x06\xa0\x1b\x10\x69\x04\x61\x5f\xc5\xd9\x91\x6b\x51\xed\xf4\x97\xae\x8f\x01\x7a\x3c\xc0\x1e\xf2\x91\x8f\x27\x20\x96\x8e\xa1\xdf\xd2\x79\x0e\x63\xf1\xb6\x93\xe0\x01\xe5\x98\x77\xc7\xb2\xcf\x5c\x7e\x2d\xcb\x4b\xcd\x9c\xf1\xc0\x10\x32\xa4\xac\xce\x03\xfc\xc4\xca\x50\x22\xe1\x1b\x69\x54\x4e\x46\x90\xc0\xc8\xe9\x2b\x58\x0c\xd2\x05\x59\x0e\x0a\x29\x24\xf1\x42\xb8\x38\x0a\xb1\xe3\x13\x0d\xfd\xf8\x3d\x4a\x25\x20\x70\xb3\xdd\xa0\x64\x06\xf6\xa6\x90\x9a\xeb\x01\x5a\xed\x19\xaa\x1a\xe5\x92\x98\x6a\xdc\x4b\x51\x09\x8f\xac\xe7\x6e\x43\xaf\x57\xa7\xf3\x5c\xe2\x5f\xa8\x04\x29\xac\xf4\xe7\xea\xfb\xea\xf1\x65\xd5\x9d\x00\x74\xe2\xe2\x70\x8f\xf8\x66\xf7\x9c\xaf\x50\xff\x0b\xab\x72\x44\x0f\x82\x42\x29\x3f\x05\xf7\xec\x8e\x35\x8a\x12\x6e\x93\x4b\x61\xec\xf4\x4e\xcd\x6c\xa8\x5b\x3b\xd9\x86\x92\xce\x23\x97\xd0\x1e\x81\xcc\x70\x52\xac\x9a\xfd\x7d\x59\xbc\xae\xde\xb1\x92\xd9\x80\x36\xe5\x37\x8c\xa4\xf3\x4b\x9e\xc0\xd0\x0b\x99\xcd\xf0\xfd\x6f\x34\x96\x30\x34\xf5\x45\xb5\x95\x8e\x5f\xe4\xf9\xd3\xa9\xba\x85\x7a\xf5\x2e\xf1\x78\x11\x27\x98\x9e\x37\x61\x96\x7c\xcd\x71\x28\xbf\x6c\xae\x7f\xf4\x53\x1b\x45\xe2\x0d\xf4\x26\xea\xfe\x77\x41\xd0\xf9\x1d\x59\x96\x8b\x42\x6d\x4e\x62\x96\x79\x16\x05\x2a\x85\x36\xa0\xb1\xc8\xf3\xde\x21\xf9\x70\x7d\x17\x68\xd9\x14\x76\x2e\x7d\xf0\xb8\x58\x7e\xb0\x84\x6a\x4f\x59\x8c\x6e\x9e\x2f\xf2\xdc\x0e\x97\x8f\x90\x02\x1f\x9c\x83\x69\x92\x00\xd9\x43\xbd\xa1\x65\xfb\xf6\x04\x15\x14\x4d\x97\x94\x13\x3a\x30\xb8\x4d\x03\x12\xb9\xb9\xff\x7d\xfe\x5b\x68\xe0\x4e\xce\xf8\x3a\xab\x4d\xd2\x70\x58\x92\xdf\xf6\x30\xde\x26\xc5\x88\xca\x1e\x48\x3e\x70\xbc\x47\x3e\x9b\xd0\x4a\x82\x49\x2e\x8c\xb4\x84\x4c\xab\xe4\x29\x84\x8e\x77\xc5\x51\xf5\x8c\x2e\x28\x7d\xae\x0c\x92\xc3\x20\xd2\x87\xfc\x2f\x28\x03\xc6\x68\xf6\x19\x1e\xb5\xa2\x98\xa6\x5a\x65\xc0\x15\x79\x5d\x3b\x13\x1b\xfd\xd1\x1a\x57\x65\xf5\x11\xc3\xd4\xe7\x3b\xb8\x8c\x12\x41\xe6\x5d\x0d\xbf\xf0\x01\x1b\xa0\x99\x37\x86\x45\x7f\x4a\xe2\x3a\xc4\x66\x5e\x30\xbf\x4e\xaf\x25\x22\x13\xed\x6a\xbd\xcb\xef\x25\x31\x81\xb8\x26\x25\xa8\x70\x6e\x93\x1d\x8e\x39\xe5\xef\x87\x53\x4b\xc6\xa1\x47\x21\x4f\x85\x86\x14\xa1\x72\x4b\x45\xd7\x21\xe2\xb6\xbe\xa1\xc9\x7f\xe5\x3f\x50\xd4\xd9\xc4\xe1\x97\xb1\x54\x60\xc3\xf3\x96\x02\xdc\x48\x8e\x7c\xbe\x88\xcb\x18\x8d\x4a\x5e\x33\xcd\xf5\xcb\x24\x16\x8e\xf9\x6c\x5b\xc1\x2f\xcc\x67\x92\x02\x32\x01\x0b\x06\x55\x99\x3e\x8f\x9e\x29\x11\x82\xe2\xf6\xaa\x23\xba\x34\xd1\xd6\xf9\xf9\x25\x13\x15\xea\xb8\x2f\x91\xb1\xa1\x98\xeb\xb2\xe8\xef\x47\xa7\x54\xf6\x7d\xb4\x83\x6e\xa2\x28\xe0\xb6\x4c\x99\x4a\x4e\xf9\xd3\xcd\x49\xcc\x5b\xf3\x32\xb5\x90\xb5\xbc\x2c\x5e\xdd\x2a\xfb\xa5\x6b\x93\x04\xc6\x38\x1a\xea\xac\x1b\xc4\xba\x5f\xb7\x27\x59\x1f\x09\x69\x32\x52\x4d\xd9\x96\x0b\xcb\x31\xf6\xc1\x53\x0a\x3f\xa1\x24\xeb\xea\x54\x95\x24\x52\xec\x2e\x2b\x82\x90\x02\x2f\xd7\xf8\xeb\xe8\x36\x76\x29\xbd\x50\x73\x2a\xfb\xcb\x33\xe5\xec\xae\x0f\x42\xf9\xee\x90\x30\xa2\x43\xda\xd7\xd8\x3e\xda\x34\x93\x25\x65\x14\x50\x59\xc9\x2f\xac\x47\xe0\x0d\x29\xc1\x27\xcb\xbc\xc0\x77\x4a\xcf\x6c\x7b\x0c\xa3\x54\x36\x88\xf9\x5c\x6e\x9e\xb1\x5a\xf6\x39\x4a\xa9\x7c\x4d\x79\x0c\x1a\x3e\x4e\x6d\x38\xe8\x5a\x53\xa3\xd6\xd2\xa5\x88\xaf\xab\xd3\xeb\xd5\xe9\xfc\xc1\x77\x51\x5a\x71\x0b\x49\xb8\x5b\xdd\xcd\x02\x46\xa5\x56\x81\x34\xbc\x3e\x3f\xc7\x73\x48\xa3\x2d\x59\xf9\xcf\xcc\x87\x9f\x5f\x1d\x94\xc7\x34\xe5\x6b\x0f\xf0\xfe\x03\x5e\xb1\xea\xeb\x29\x94\x27\x39\x65\xc5\xee\x33\x8d\x1b\x6c\x76\x9e\x17\x74\x4d\xe8\x51\xbc\x21\x6f\x14\xb1\x49\xba\x95\x4b\x31\xe6\x83\xab\x21\xed\xc4\x79\x06\x95\x05\x8a\x29\x8f\x06\xf9\xb7\xea\x7c\x6c\xca\xdb\x4c\x37\xb5\x25\x1b\xed\xcf\xa1\x19\xd1\x62\x1e\xc7\xec\x5b\xa8\xb8\xe7\x53\xda\x5e\x3a\x2a\x6c\x54\x3c\x60\xae\xbe\x7c\x14\xaf\x54\x3c\xf6\x8d\x49\x4f\x2b\xe8\x5d\xf1\xab\x1c\x72\xfd\xcf\x9a\xe3\xca\x0f\x13\x34\xb6\xb5\x3c\xcb\x1c\x17\xc7\x23\xb6\x9b\x93\x3d\x8e\xf1\x64\x50\xa0\xf3\x87\xfd\xc9\x1d\x1a\x27\x60\xed\xbb\xaf\x67\x51\x65\x2a\xfb\x9f\x21\xf0\xbd\x5c\x30\x54\x10\x1a\x32\x93\x03\x1e\x04\x56\x33\x48\x51\x15\xfa\x3e\x95\x6c\x19\xfb\xdd\x99\x35\xc7\xe1\xb9\xe6\xa4\xfe\xdc\xfc\x57\xa1\x02\x1a\x45\x7d\xdd\xed\xce\x0e\x25\x57\x43\xa1\xa2\x40\x93\x4b\x93\xd5\xbb\x9f\x59\xf1\xba\xd3\x65\xb5\x1b\x94\x07\xaa\x28\x35\x4b\x48\x27\x43\x5d\x95\x6f\xca\x32\xda\x74\x7d\xc0\xc8\xfd\xe2\x21\x6b\x6e\xd0\xaa\xeb\x67\xcd\xd9\xe4\x62\x26\x18\x74\x15\xe9\x80\x3c\x23\xf3\x50\x43\xde\x92\xf1\x74\xb6\xdd\xe3\x58\x11\x17\x87\x15\x08\x19\xed\xa0\x2a\x4e\x7c\x5a\x2b\x6c\x30\x62\xdc\x98\xf8\xda\x11\x27\x0c\xa0\xfc\xae\x51\x7b\x74\x17\xc4\x66\x4e\x5a\x2b\x23\x96\x43\x54\x69\x84\x14\xa6\xb3\x18\x12\x72\x06\x3a\xde\x45\x54\x10\xa4\xa4\x98\xb1\xd8\xa3\xd9\xdf\xae\x2a\xc8\x0a\x5d\x96\x8a\x77\x5d\x22\xc3\x98\x33\x20\x63\xc5\xc9\x1c\x56\xc2\x43\xd2\xd4\xb8\xbd\xbb\x1f\x4e\x61\x25\x83\x80\x0c\xb8\x5b\x38\xe0\x94\x33\x44\xc9\x50\x12\xba\x60\xf3\xf2\xfc\x7c\xff\xd7\xee\xe6\x69\xbd\x7b\x58\xac\xbf\xad\xb6\x77\x8f\xb7\x5d\x9f\x44\x7b\x43\x11\x20\xc8\x2f\xea\x17\xdb\x3e\x24\xe5\x55\x1e\xb1\x98\x04\x97\x6c\x0f\xc5\x4c\xf5\xab\xc8\xd4\xea\xfd\x98\x55\x48\xaf\x6b\x64\x04\x29\xed\x19\xc0\x10\xd1\xf9\x15\x8a\xd0\xef\x53\x14\xf3\xf8\xac\xda\x93\x44\x77\xb9\x5d\x6d\xb6\x14\xa4\xec\x4e\x15\xa4\x44\x5d\x7c\x38\xdf\x74\xa1\x95\xae\x4d\x19\xb6\x64\x50\xea\x3f\x65\x56\xe4\x59\xdd\xec\x4a\xf5\xc1\x1e\x8a\x5e\x00\xe6\x12\xf7\xdb\xc9\x87\x45\xe6\x2b\xb7\x22\xa8\xac\xb9\x86\xb2\x6b\x88\x22\x22\x47\xf9\xb1\x78\x18\x5e\x19\x59\x0c\x24\xea\xb1\xdd\x67\xa8\xbb\x1f\x13\x43\x34\x5f\x95\x39\x1a\x89\xfa\xd9\xe1\x8b\x3c\xb1\xac\x24\xa5\xfc\x69\x7c\xd6\x0f\xee\x98\xa3\x81\x76\x9f\x8a\x1a\x1b\x42\xa6\xe7\x17\xf9\x53\xe4\x1a\x29\x04\xab\xd0\xd0\x31\x7c\x70\x2e\x3f\xe5\xd2\xda\x2b\x0f\xf0\x4e\x70\xfe\x66\xe1\x12\xc1\x4f\xfa\x6b\xd9\x67\x66\x30\xe0\x11\x7d\xe2\x55\xb3\xe7\xc7\x0a\x1f\x37\xcf\xe3\x31\x80\x41\x60\x4a\xf4\xdb\xdb\x59\xe3\x7f\x4f\x59\xf5\x11\x0b\xd2\xe4\x2e\x82\x50\x59\xdb\x39\xcf\x57\x85\x1a\x24\x3b\x30\xf4\x91\xb0\x97\x76\x52\xaf\x07\x9b\xb9\xeb\x11\x7a\x89\xe7\x68\xca\x9b\x3d\x56\x7d\x8c\xc8\x79\x39\x18\xea\x94\x72\x69\x75\x53\x1e\xb7\x08\x07\x27\xf5\x6d\x92\x94\xb6\x53\x2c\x8d\x4b\x7f\x5f\xbe\x3e\x52\xad\xd5\x9c\x9a\xc8\xbc\x80\x60\x7b\xb0\x34\xb5\x15\x15\xde\xc9\xb2\xcb\x6c\x77\xa8\xb0\xc9\xab\x4a\xb5\xa9\x4e\x7f\x5e\xaf\xee\x96\x4f\xbb\xaf\x8b\xf5\xf5\x72\xf1\xec\xee\x04\x52\x4e\x4c\x74\x79\xbb\xd2\xaf\xde\x8f\x0b\x42\xd8\x0d\x60\x4e\x08\xe0\x93\x4d\xd4\x4e\x25\x1b\x99\xea\xe3\xf2\x08\x32\x24\xd0\x08\xd5\x68\xb4\x6b\xf1\x08\xb7\x65\x3b\x49\x89\x34\x2e\x4d\x1a\x6f\x91\x57\x08\xea\xfc\x40\x7a\x2c\xee\x2a\xca\x6e\x9f\xd0\x57\xa8\x39\x26\xeb\x2d\x0c\x89\x3b\x06\xd7\x56\x9e\x29\xca\x21\xa6\x3c\xe3\xb1\x4e\x2e\xac\x18\x23\xf7\xa2\xc0\x37\x4a\x7a\x8c\x66\x81\x0a\xd0\x01\xda\xbe\x97\x0d\x5e\x4d\x2a\xa1\x11\x53\x23\xa7\x0c\x4a\x19\xf9\xb4\x71\xb3\x4e\x0d\x2e\xb4\x75\x67\x5b\xc3\x19\xd5\x8b\xe5\x23\x31\x9b\xbd\x0d\x13\x4c\xee\x48\x2b\x45\x53\xef\xb5\xea\x83\xf7\xda\x8b\x38\x39\x9e\x47\x42\x0c\xec\xf8\xf8\x18\xed\x25\xa1\xea\x02\xa4\xbe\x85\x42\x4f\xba\xa4\x92\x26\x2a\x1a\x05\x16\x67\x8c\x8e\xaa\x4c\x47\xbe\x91\x3d\x8e\xc5\x29\x25\xd7\x4c\xe6\xc5\x40\xd5\x66\x33\x75\x9a\xcb\xc8\xa8\x3b\x52\x45\xce\xa9\x2a\xae\xce\x5f\xa7\x0a\xdb\xa8\x7d\x26\x3c\x45\x14\xe6\x65\x93\xbd\xf7\xe2\x6c\xa8\xfd\x38\x0c\x8d\xc6\x74\x3d\xc8\xee\xe9\x80\x19\x72\x21\x12\x6c\x56\x3d\xca\x63\xf0\x9d\x75\x28\x52\x4f\xf7\x64\x14\xbb\xe9\x13\x5d\x1a\x19\x3a\xf2\x02\x2a\x4c\x36\xa1\x44\x07\xd6\x75\x17\x8d\x03\x46\x8b\x27\xc9\x3e\x62\x6d\xad\xb3\x5d\xd7\x1c\x7a\x49\xd0\x23\xc0\xca\x53\xa1\x9e\x73\x98\x0c\x6a\x1d\x87\x82\x40\xe8\xb7\xb7\xe3\x7a\x8c\x59\x4d\xb8\x3f\x26\xc7\x0a\x23\x44\xee\x7c\x25\x82\xaa\x1f\x1b\x0a\xbb\x8d\x82\x26\x3a\x4d\x62\x69\x6d\x37\x33\xd3\x3b\x67\x7e\xfc\x79\x40\x45\x04\xdb\xc9\x6a\x0b\x40\x1f\x62\x4f\xb5\xf0\x22\xda\x9c\xcd\x7a\xf3\x59\x1e\x52\x0b\x16\x63\x0f\x21\xa4\x55\x79\xd6\xd2\xd7\x02\x22\x69\x0a\x26\xdf\x51\x0d\x73\xa2\x5a\xa1\x20\x90\xd6\xbe\x54\x39\x56\x23\x44\xb2\x46\x1f\x84\xee\x20\x15\x5b\xa8\x7f\x76\x5f\x45\x73\x61\x59\x53\xc9\x47\xbb\xab\xeb\x13\x5a\x55\x95\xf9\x2d\x45\x6b\xe9\x51\x12\xdd\xd8\xd1\xcf\x58\x0d\x90\x5f\xda\xf3\x64\x48\xb3\xca\xa4\x1c\x77\xdd\xa2\xa7\x3d\x1e\x47\x04\x8d\xdd\xbd\x92\xbe\xcc\x2c\x29\x90\xf6\x7c\x21\x59\x1f\x36\x26\x26\x5c\x02\xd3\x40\xa5\xda\xd5\x8e\x6a\xb2\xbb\x51\xaa\xbd\x20\x85\xa0\x2b\xab\xa8\xaf\xa0\xf8\xe9\x2e\x17\x88\x30\x70\xa2\x6c\xbb\x65\x59\xd4\x58\xd4\xe7\x7a\x8d\x20\xf7\xa8\xfa\x4e\x48\x0e\xcd\xf1\x68\xa8\xa6\xfa\x9d\x49\x7b\xa1\xd6\xb4\x84\xeb\xaa\x3c\xfc\xc0\x6c\x5b\xde\x8c\x55\x70\xb5\x17\x85\x9a\xf6\xae\x6f\x50\xbc\xde\x9e\x4a\x77\x60\x24\x13\xa2\x29\x3d\x56\xe5\x21\x9b\x6e\x0d\xda\x8b\x13\xc3\x06\x50\x63\x73\x93\x97\x6f\x38\x0f\x89\x6c\xfb\x99\xb3\xbf\x65\xc5\x38\xdf\xf5\xc7\xb8\x5f\xc2\x42\xe3\x6f\x97\xaf\xaf\x39\x3e\x57\xe5\xa1\x1c\xbe\xa1\x54\x78\xc0\xbb\x50\x58\xbb\xd8\xdd\x62\x31\xe2\x27\xb7\x1d\x81\x33\x27\x39\x4e\x0e\xfb\x08\xcd\x38\x99\xeb\xda\x13\x3c\x8c\xd8\xa8\xc6\xef\x6a\x0c\x31\x73\x6f\x43\x84\x61\xd8\x11\x24\x9b\x9a\xdc\xae\x09\x22\x99\x76\x7c\x8a\xf6\x47\xe9\xf9\x54\x1c\xa2\xcb\xaa\x5d\xe0\x9d\xb9\x30\xbe\x57\xc9\xd0\x65\x51\x09\x43\x34\xaa\x1f\x9b\x1f\x58\x32\xd4\x94\xca\x5b\x42\xbd\x7f\x28\x7f\x5d\xe6\xfa\xe7\x3c\x40\xed\x29\xe0\x69\x32\x8a\x66\xd0\x6e\x6a\x09\xe5\x4d\x6c\xe8\x37\xa5\x51\xee\x4c\xc8\x99\x23\x3a\x38\x15\x07\xaa\xcf\xfc\xfc\x08\xcd\x25\xa9\x86\x39\xcb\x9d\x72\x94\x6b\xd4\xa7\xc9\x0e\xa0\x3d\x1d\x33\x42\xea\xaa\xac\x96\x65\xd1\x64\xc5\xa9\x7b\x9f\x5a\x31\x32\xed\x69\x1e\x34\xfb\x0a\x91\xa8\x2f\x56\xff\x7d\xe9\x38\x37\xda\x4e\xa9\x67\x9d\x66\xca\x55\xdc\xa9\x25\x54\xaf\xe5\xd0\xc8\xd2\xcc\x63\x21\xf7\x3a\x13\xa8\xa3\xd1\xd3\xcc\x8b\x23\x2a\xef\x20\x9c\xf0\xa6\x1d\x3e\x03\x0d\x5f\x37\x62\x18\x0b\x02\xe2\xde\xfc\x9e\xe1\x9b\x49\xd5\x8c\xec\x2e\xd7\x4b\x85\xe4\xad\xb4\xee\xce\x26\x93\x57\xe5\xdf\xb1\x30\x35\xe3\x81\x49\xa1\x82\xd1\xc9\xb2\x0a\x97\xc6\xed\xbc\xdc\xdd\x34\xe3\x0a\x1c\xc8\xcc\x69\x65\x59\xc1\xde\x87\x52\x61\x0f\x1f\x5c\x41\x55\x18\xa6\xf8\x41\x62\x56\x33\xdf\x8b\x23\xd6\x2d\x3b\x9b\xce\x70\x6b\x5b\x14\xd3\x9d\x14\xf8\xdc\x22\xae\x99\x2f\x42\x0a\x89\x3c\x96\x3f\x4f\x0f\x50\x37\x76\x54\xcd\x06\x80\x34\xf3\x15\xa6\x26\x7a\x75\x89\xdf\xd7\xcc\xd7\x8c\x72\xc1\x8f\x28\xab\xf2\x80\xa7\xa1\x7f\xa8\x59\xa0\x34\x55\x8f\xb9\x6a\xf8\x59\x10\xb8\x66\xa1\xe7\x13\xf6\xe0\xbe\x7c\x6d\x57\xdc\x97\xa2\xea\xb5\x76\x67\xa7\x05\x0b\xed\x32\xdd\xfa\xc4\x79\x5e\xbe\x75\xb2\xef\x3d\xfb\x82\xeb\x89\x26\xb4\x7d\x0f\xa7\x42\xee\xd7\xa5\xfc\x89\x93\x02\xd5\xcf\xfe\xd8\x93\x44\x2c\xa4\x0a\xf2\x3e\x6e\xfa\xe7\x5f\xff\xba\x5c\x9d\x5c\xef\x38\xa1\x95\xbb\xc0\xf7\x41\x09\xb6\x66\x91\x4c\x84\xb5\x3d\x57\x54\xce\x8d\x4f\x7a\x09\x87\x23\x64\xaf\xe3\x7a\x10\xcd\x22\x6d\x02\xc7\x1f\xa1\x1d\x2f\x8c\x21\x7b\x5c\xe2\x47\x54\x29\x46\x16\xc1\x88\x18\xd7\x75\x48\x8c\x12\x20\xbe\x37\x58\xa8\xcd\x14\x1e\xaa\x59\x82\x61\x84\x1d\xd6\xdf\x38\x8a\x44\x6a\x4b\x18\x95\xf3\x87\x0f\x9d\x06\x46\xcd\xd4\x02\xc9\xbf\x65\xb9\xdb\x90\x58\x1a\xfa\xb4\xb2\x83\x52\xcf\xe5\x4f\x3c\x94\xc5\xb6\x34\xe3\x6e\x76\x8b\xd7\x0c\x10\xe8\x1e\xb2\x22\x23\x19\x5d\xff\x6f\x17\xd6\xcd\x0f\x61\xc1\x98\xb4\xf2\xbb\x0f\x59\x81\x15\x01\x3a\x2f\x1f\x5d\x28\xcf\xad\x42\xeb\x52\x2e\xcb\x6a\x2c\xb4\xda\x76\x88\x68\x2a\x34\xf8\xde\x4d\x38\x99\xf0\x58\xbb\xea\xbb\xdb\x9e\xd0\x67\xe8\x7c\xb7\xbd\x02\x02\x82\x2b\x2b\x64\x45\x78\x88\xe6\x02\x44\x3d\xbe\x1f\x29\x22\x2a\x2d\x38\xe2\xab\xbb\x9a\x92\x11\x13\x0e\xd2\xf5\x0c\xe7\xfb\x12\xba\xc9\xa6\xd0\x94\x11\x56\xf8\xfa\xd8\x29\x4d\x69\x86\x8c\x53\x40\x32\xab\xad\x88\xdf\xe4\xa9\x91\x4b\x1a\x32\x12\x72\xf9\x52\x3c\x40\xfd\x93\x60\x13\x05\x81\xed\xe7\x6f\x0c\x23\x19\xe0\xa0\xa4\x26\xcf\x51\x36\x99\x98\x29\x80\x1c\xcf\x45\x04\x03\xc6\xfa\x5a\xe6\xb0\x2f\x8f\xa3\xa5\x02\xa5\xf1\x58\x0d\x4c\xe1\x1b\x9e\x2f\x03\x95\xba\x75\xa5\x1c\x73\xd4\x50\x9a\xbb\x75\x18\xaf\xce\x06\x19\x33\x3e\x40\x87\x18\x1b\x99\x11\x45\x7b\xe5\xb6\x1c\x1e\x37\xed\x9c\x70\x82\x45\xee\x8e\x50\xd5\x78\x57\x34\x1b\x99\x61\xd1\x64\x3a\x93\x43\x27\x52\x73\x8f\x29\xe2\x76\x20\xff\x79\xf7\x9f\x93\x7a\x1d\x51\x10\x8f\x1e\x9a\x7b\x0c\x7d\x2b\xfd\x6f\xc9\xc8\x57\xef\x28\xdb\x29\x75\x0b\xf5\x3d\x29\xa8\x4c\xb3\x5c\xb3\xa3\x98\x7b\x3a\x26\xc3\xcd\x28\xcd\x4f\x92\x9d\xe3\xae\x8c\x33\x2f\x72\x59\x2f\x57\x43\x1d\x7f\x71\xad\x89\x24\x8e\x92\xbb\xe5\xd3\xee\x79\xb5\xbe\x7b\xba\xee\x5a\x74\x4a\x88\x8b\x03\x51\x11\x10\x86\xc0\x35\x71\x4f\x98\x42\x22\xe2\xf6\xed\x88\x64\xe6\x8d\x97\xc9\xed\x70\x66\xe8\xd4\x6c\x05\x33\xd5\x30\x65\xcd\xf9\xb3\x6a\x0c\xcd\x79\xac\x29\xdc\x9a\x1d\x8e\x65\x65\xa1\x53\x34\x71\xa9\x0e\xed\x52\x72\x51\x73\x1f\x52\x57\x97\xbf\x20\xad\x64\x54\x8b\x42\xad\xf1\x3f\x24\x86\xd4\xba\xfb\x17\xb9\x67\x77\xa4\xe4\x8e\x99\xfa\xe9\x88\xc5\x55\xa6\xea\xf1\x82\xcc\x43\xa9\xa1\xd7\x92\xb8\x2a\x27\xd6\x32\x8f\x58\x4a\x5f\xf9\x08\xe7\xab\x4c\xcd\xdb\x80\x3c\x4a\x13\xa3\x70\xd9\x7e\x96\xce\x0b\xe0\x71\x18\x13\x12\xe8\x58\x21\xf9\x55\x93\x4b\xc7\x89\xa2\xf8\xef\xc3\x19\xaa\xc6\xf0\xc7\xb9\x16\x48\x84\x2b\xe1\x75\x06\x62\x35\x71\x51\x78\x22\x13\xde\xdb\x0a\xcf\x15\x0e\x63\x30\x9a\xa7\x51\x44\x0c\xd9\xa2\xca\xe4\xcf\xd5\xf6\xeb\xc0\xa9\xd3\x3c\x4d\x25\xeb\x25\xe7\x2c\xcc\x70\x5e\x46\x46\xf3\x54\x28\x47\x09\xb1\xd8\x34\x65\x75\x21\x64\x3e\xee\x0e\x3e\x9a\x31\x2a\xb3\xba\xee\x90\xe1\x9a\xcb\xc8\x54\xd8\xf5\x35\x8f\x57\xd0\xc8\xfd\xd5\xd9\x15\x3d\x3a\x39\x4e\xb7\xe9\x71\x15\x71\xf3\xdd\x5b\x9b\xcd\xbc\xda\x45\x63\xc4\x41\x5d\x8f\x44\x45\x23\x4c\x7f\x3b\x18\xc6\xb3\x9f\x2b\x19\xa2\xb1\x61\xc9\x13\x75\x87\x62\x18\x90\xa9\x75\xff\xf4\x72\xbd\xfa\xb3\xfb\x35\x49\x22\xe7\xdd\xf5\x39\x8d\x4e\xfd\xc2\x90\xed\xd4\x46\x29\xc1\x1d\x92\xc6\x34\x9e\xeb\x1c\x7e\xd9\xe4\x81\xf5\x56\x2c\x02\x2c\xfb\x5f\xff\x55\xda\x0d\xd0\x33\xb0\xd5\xdc\x4a\xf7\x8d\xdf\x1e\xca\x54\xa6\x36\xa5\x50\xe6\x6a\x7e\x35\x98\x0c\x3f\xd4\x40\x55\xba\x8e\x27\xf4\xae\x68\xca\xf6\xe0\x19\x5f\x7b\x72\xa4\x8e\xb5\xb4\xf6\xcf\xf1\x74\x89\xd4\x33\xbd\x7c\x2f\x44\x8a\x51\x1a\xd3\xa1\x9d\xab\xdf\xce\x92\xc4\xbd\x47\xf7\xee\x7b\xa8\xa8\xdf\x72\xfb\xd4\xa7\xe4\x6c\x1b\xe3\x7e\x1c\x0e\xf8\x65\xc8\xab\xeb\xf1\x62\xda\xe7\x71\x94\xb8\x7c\xde\x49\xf4\x29\x9b\xd1\x9c\xf1\xb9\x64\x89\x03\x60\x54\x59\x31\x8e\x9c\x69\x3f\x08\xc3\x01\x63\xec\x03\xbc\xdb\x34\xf8\xb4\x57\xe4\xcb\x8b\x40\xe2\x68\x63\xf7\x03\xc5\x94\x3f\x28\x73\x5c\x1c\x8f\x4e\x62\xef\x23\xf0\xb6\xe3\x56\x9b\xe0\xca\xb4\x1f\x0a\x19\xd8\xfa\xd1\x0e\x8b\x3c\x6b\xc1\xfb\x91\x6f\x92\x32\xed\x93\x8d\x1f\x3c\x4a\x34\x81\x1a\x56\xef\x4d\x05\x22\x1b\x66\x2e\xb4\x1f\x27\x82\x22\x50\x15\xf9\x70\xc6\x9c\x1f\x9f\x38\xf1\xfc\x40\x76\x9f\x90\x24\x80\x66\x50\x77\xda\x4f\xa4\x81\xaf\x74\x43\xc9\xc6\x3c\xbb\xfb\x48\xbd\x94\xbe\xe3\xc3\xe2\xcf\xdd\xf6\x69\xbb\xb8\x37\x85\x93\x56\x4d\x75\xe3\xee\x28\x0d\x7c\x02\xca\x6c\x5e\xd6\xdb\xc9\xdb\x4f\x63\x66\x88\xf9\x5e\x5f\x2b\x8a\x6b\x0e\xd4\x86\x26\x03\x2f\x05\xe6\x0a\x53\x8c\x27\x3e\x96\x53\x1d\x3f\x22\xf8\xe0\x74\xdd\x9a\x2f\xb3\xa7\x83\xc0\x54\xf2\x83\x52\xc4\x5e\x3c\x94\xdc\x9f\x9c\x2b\x96\x04\x90\xba\x79\x7a\x59\xef\xfe\x5a\x2d\xd6\xbb\x6f\xab\xd5\x73\x97\xfc\xd2\x3e\xa4\x89\x62\x8e\xd3\xd4\x8c\x68\x83\x81\xb2\xed\xc2\x67\x94\x4b\xc2\x42\xad\x8e\xa5\xdc\x4f\x18\x25\xb5\x2f\x50\xfa\xa2\xab\x95\x80\xea\x6c\xc2\x7c\x94\xd3\x1f\x26\x19\xb5\x2f\xd3\x94\xe6\x68\x5e\xbe\x76\xa5\xbb\xda\x97\x68\xf8\x9a\xb2\xa2\x37\x3c\x21\xc7\xd9\xb0\x86\x2f\x51\x38\x19\x93\xd6\x92\xbd\x88\x4c\x6a\x5f\xf9\x9c\x56\xc3\x7f\x9c\xea\xe6\xc6\x44\x48\x26\xe7\x50\x52\x26\x86\x39\xe1\xfd\x16\x6a\xcb\x51\x59\x90\x2c\x81\xed\x81\xcc\xf4\xb8\x2f\x8d\x70\x72\x7d\x29\x2e\xf6\xa9\x39\xef\x63\x68\x04\x0f\x5c\x5c\xe2\x6a\xb9\x7a\xea\x4e\x1e\x05\xe8\x00\x32\x7f\xb6\x1d\x96\xa5\xc2\xc9\x57\x43\xe4\xcc\x6e\x54\x2f\x54\xdc\x31\x2a\x6a\xb7\x9d\xb4\x0a\x89\x1b\xe9\xf9\x6e\xb7\xba\xbe\xdb\xee\x98\xbb\x82\x46\xf3\x49\x5b\xeb\x89\xa8\x47\xd9\x6e\x73\x7f\xfb\xb8\xbb\x5f\x6d\x36\x7d\x1f\x45\xcb\x8f\xd9\x73\x49\xa3\xbd\x35\xa8\xba\x4c\xb5\x0e\x3c\x2f\x88\x0d\xb4\xe6\xde\x80\x5a\x7a\xad\x46\x1d\x78\xdc\x27\x4b\xbe\x35\xc3\x5c\x74\x6e\x51\xb7\xdb\x44\xb7\x43\x04\x2c\x36\xda\x9e\x66\x10\x18\x0c\xd3\x34\xe6\x11\x70\xe6\xd1\x0a\xb6\x78\x2b\xab\x9f\x13\x37\xdf\x76\xf1\xad\x34\x3c\xda\xda\xc7\x01\x02\x57\x07\xbe\xf6\xd3\x0b\x3b\x32\x74\xad\x01\x37\x2c\x2f\x96\x4f\xa2\x34\x84\xf4\x55\xd7\x0c\x01\x45\xf0\x21\xab\xae\xab\xf2\xb8\x19\xea\x0f\x7f\xe0\x45\x06\x81\x60\x54\xe8\xf0\x1d\xf2\xac\xd9\x0f\x17\xaf\x20\xf4\xbc\xa8\x63\xaf\x58\x35\xfb\x35\x10\xb0\xd2\xb5\x86\x29\xe7\x7d\x89\x3a\x1d\x38\x5c\xb1\x82\x10\x14\x81\x76\x0f\xa5\xca\xf4\x99\x68\x00\x0a\x4b\x35\x38\x4a\x33\x4d\x6e\x28\x62\x9a\x72\x1b\x5d\xf6\xba\x5d\x0b\x68\x79\xb9\x99\xa0\x89\x75\x10\x25\x3c\x08\x87\xc8\x1a\xc3\x8c\x87\xea\xaa\xa7\xad\x76\x5d\x51\x50\x58\x0f\x5e\xb1\x68\x48\xb3\xba\x1e\xca\xb2\xda\x5e\xb1\x27\x68\x21\x6a\x4d\x99\x97\xa3\xb9\xec\x44\x01\x4e\x07\x31\x03\x65\xc2\x62\xe5\x3b\xe5\xd7\xe6\xed\xe9\x20\x16\x21\x3d\x49\xeb\x01\x13\x17\xc5\xd3\x8f\x9e\xd4\xaa\x6d\x06\xf2\xbf\x6a\xd0\xb8\x2d\x1f\x4e\xb9\x5b\x1b\x47\x27\x49\x82\xc4\xf1\xd2\x6f\xe1\x27\x4e\x0b\x85\x75\x90\x80\xf6\x86\x22\xc5\x70\x2c\x3f\xa0\x60\x1c\xed\xa3\x41\xa2\x0d\x5e\xba\x5d\x95\x1f\x7a\xef\xa3\x13\x7c\xb6\xdd\x52\xd0\x14\x9d\x5d\x2c\xef\xff\xba\x96\x59\xf7\xf9\x53\x09\x60\x21\xd9\x2f\xf5\x00\x3b\xa6\x03\x08\x0d\x4d\x9c\x95\xa5\x1c\x88\xaa\x2d\x74\x83\x15\x81\x09\xce\x93\x87\x80\xc8\x58\xdc\x76\x17\x74\x08\x03\x1d\x80\x08\x58\xef\xf8\x92\x51\xf0\x81\xef\xe6\x0e\xc0\x20\x4a\xba\x94\xd4\x6a\xfb\x55\x97\xd5\x63\x59\x1d\x20\xbf\x3a\x9d\x3b\xc2\x69\x1d\x88\xc4\x71\x42\x35\x7d\xf0\xef\xae\x7b\x3c\x09\x3c\x31\xbc\xc1\x0e\xcb\xb6\xb5\x91\x3f\xaa\xa0\xb3\x25\x92\xae\xb7\x8a\x91\x0a\x63\x0a\x7c\xeb\x94\x75\xb3\xff\x19\x00\xe3\x6f\xf9\x38\xa7\x21\xa5\x40\x09\x20\x83\xeb\xe9\x79\x3b\x42\x7f\xe8\x40\x29\xa4\x90\xcf\x3f\xfa\xf0\x79\x80\x96\xcf\x03\x44\x5d\xe6\xa7\xa6\xdd\x68\x86\x96\x78\x80\x2c\x24\xba\xd7\xd3\xf1\xb5\x02\x35\xc1\xba\xe8\x00\xd3\xd4\xe1\x8c\xf2\x1c\x8b\xd7\xa1\x27\x13\xe8\x38\xa6\x14\x53\xe3\x36\xc9\xbf\x25\xa2\xa3\x03\x9d\x9a\x72\xd0\xfa\x74\xc4\x8a\x5e\xdf\xd0\xfc\xff\x63\x78\x05\xc9\x53\x63\xfe\xe8\x81\xac\xb6\x0e\x3d\x0e\xcc\xd4\xa7\xe7\xa7\x03\x76\x90\xde\x39\x6a\x1b\x1d\x32\x3f\x22\xf8\xa5\x6c\xca\x71\xfc\x28\xe4\x3c\xa4\x50\x8c\x2a\x0d\xb1\xeb\x30\x4b\xa6\x43\x1e\xa5\xe4\x84\x92\xa0\xc0\x80\xf9\x58\x87\x5c\x4a\x3f\xec\x17\xb7\xea\x54\x37\x56\x51\x74\x58\x7a\xeb\xbe\x58\xe8\x73\xe1\x18\x6d\x9c\x90\xfb\x78\xcd\x08\xfd\x20\x26\x30\xb0\x21\x1b\x7c\xa7\x4c\xf7\xdf\x4d\x68\x1a\x11\xfb\x3f\x2e\x5e\x5e\xe8\x87\x89\xef\x0f\x4c\xf7\x76\xe7\x5d\x7c\xb0\x1a\x85\x3e\x48\x8f\xbb\x22\x88\x5f\x33\x4a\x22\x3a\x0c\x54\x42\x0b\xd6\x2f\x2a\x32\x5c\x12\x76\xe9\x92\x47\x64\x34\xf1\x92\x99\x25\x3c\x8c\xb8\x4f\xdb\xd4\xbf\x50\x64\xc3\xf1\x1b\xc6\xdc\x8c\xc5\x7f\x90\xb0\xf9\xb8\x21\x1a\xaa\x73\x4c\x01\x4b\x3a\x4c\x7c\x8f\x64\x75\x48\x95\xe0\x16\x0d\xe0\xc3\x10\x65\xce\x2e\x76\xf6\xb0\x34\x0a\x7d\x4b\xeb\x41\x79\xfd\x0f\xe2\x11\x61\xaa\x0c\x9a\xcc\x04\x5b\x3e\x8f\xc6\x85\xe0\x09\x81\x4e\x78\x12\xe5\x69\x5a\xe6\xa2\x43\x60\x71\x3c\xe4\x62\xb1\x09\xd6\x8d\xa5\xa5\x6e\xd7\x85\x41\xe2\xec\x83\x0a\xa1\xff\xbf\x98\x6b\x08\xdc\xf0\x56\xb6\x1e\x18\x1c\xe0\x15\x67\x8c\xac\x50\x88\x94\x4a\xbd\x4d\x52\x69\x47\x23\x3b\xc7\xba\x1e\x4a\x5f\x4e\x8e\x50\x3a\x34\x24\x21\xeb\x2e\x47\x70\x51\xda\xaa\x43\xe9\x03\xbd\x68\x9b\x8f\x79\x30\x9c\xe7\x17\xa1\xa6\x6e\xca\xc8\x48\x47\x71\x1f\x00\xca\x0c\x06\xf9\xea\xbc\xb9\x90\x51\xd5\xa1\xf2\x44\x30\x60\x0c\xff\x14\xcb\xad\x43\xa5\x0c\x7f\xc7\x8f\x21\x19\xd2\x6c\xfc\x31\x54\x5a\x12\xac\x26\x87\xda\x84\x2f\x76\xe0\x62\x76\x21\x26\x09\xd9\xac\x3b\x71\x3a\xcf\xc8\x7a\xb4\x1d\x74\x20\xed\x8b\x69\xc7\x9c\xec\x6d\xc5\x10\x53\x20\x29\x9b\xe5\x59\x60\xf5\x90\xe5\x58\x8f\x86\x3b\xa2\x60\xbe\xb3\x56\x37\x58\xa8\x1b\xc8\xf2\x53\x35\xa2\x15\xd3\x91\xe7\x07\x5a\x39\x50\x42\x93\xb4\x6b\xef\xd5\xb9\xb1\xd1\x18\x16\x8c\x91\x26\xcc\x1d\xa4\x52\x23\x17\x3a\x00\x6b\xee\xa0\x87\x3e\xd9\x6e\x2c\x86\xc8\xeb\xea\xb0\x30\xfb\x35\xe4\x3e\x1f\xac\x31\x11\x8f\x43\x21\x9c\xd2\x9c\xf1\xf5\x0a\xd5\x85\xd1\x3f\x8d\x3e\x47\x3e\xf8\xa1\xbd\x48\x93\xe3\xec\xc6\x3d\xaf\xa2\xa5\xa3\x40\x32\xcd\x87\x80\x8c\x92\x38\x92\xab\x7e\x4c\xbb\xd4\x5c\x14\x85\x3e\xb3\xaf\x69\x55\xbf\x96\xdb\x71\x89\xa2\x8e\x62\x9e\x92\xf7\x73\x0d\xff\x75\x4f\x1f\xc7\x8a\x7e\x2a\x5d\x25\xd9\x10\xd6\xa8\xa3\x44\x73\x0f\x2c\x67\xf0\x20\x12\x12\xa5\x61\xe4\x6a\x3e\x6c\x71\x81\x9e\x24\xbf\xa2\x14\x20\x64\xb6\xf8\x34\x8e\x27\x77\x92\x2a\x43\x77\x53\x63\x43\xf3\xe3\x1e\xd5\xab\x4b\x29\xcf\x47\xee\xfe\x98\x9c\x40\xa7\x64\x32\x36\x08\x87\xef\xae\xb6\xf4\x54\x34\xdd\xc6\x15\x01\x33\xec\x4e\xed\x88\xbe\xce\xb4\xce\xe4\x29\x6f\xce\x3d\xdc\xcc\xa9\xa2\x0f\x4d\x84\x08\x18\x52\x9a\xcc\xc2\x9a\xbe\x4c\x15\x6c\x75\x04\x7e\x4a\x34\x2f\x99\x2c\xaf\x40\xfe\xec\xd4\xc1\x74\x24\x3c\x48\x3b\x0d\x11\xb2\x8a\x5a\x5b\x50\x67\xf9\x40\x70\x67\x3e\xdf\x37\xb3\x5c\x47\x82\x27\xc2\x48\xfc\xe4\x27\x7c\xd2\x5f\xc6\x8d\xa1\x88\x95\x1b\xb3\xed\xd0\x36\x02\xc3\xae\x35\x15\x44\xbf\x43\x22\x5c\x2e\x72\x91\xfc\xd1\x97\xf5\x4c\xde\xa5\xf4\x80\x4a\xaa\x06\x77\xfd\x21\x5d\xd1\xf4\xd0\x38\xb2\x82\x4b\x14\x15\xb8\x76\xf5\x2a\xf3\x64\xf8\xee\x20\x34\x71\xab\x76\xff\x05\x62\x22\x9e\x04\x4d\xc6\xdd\x15\xf7\x92\xc8\x69\x3e\x94\xb9\x2a\xdf\x8a\x99\x74\x4b\xa4\x7c\x53\xd3\xda\xda\x3d\xf6\x3e\x6e\xab\xf2\xe4\xa2\x19\x91\x92\xc6\x87\xdb\x20\xe5\xf5\x36\x0d\x1e\xa7\x67\xc0\x90\x28\x19\x9f\x33\x54\xcf\xd9\x11\xab\x47\x6c\x5a\xe7\x75\xe0\xaa\x44\x18\x32\x66\x17\xeb\xa5\x65\xcb\x1c\x1b\x5a\x11\x46\x46\x9b\xe4\x3a\x7b\xcd\x1a\xc8\xb7\xfb\x72\xec\x4c\x46\x28\x22\xa2\x1a\xc5\x5a\xc2\x11\xbf\x42\x23\xf7\xed\xa9\xfa\x91\x8b\x18\xbb\x22\x4d\x1b\x9e\x1d\x56\x29\x75\x9d\x04\x59\xf7\x92\x54\xfd\x9a\xab\x53\xd5\x5d\x40\xfb\xd2\x49\x66\x6d\xf6\xd9\xf1\xd9\xe8\x5d\x9a\x77\x4c\xec\x69\x38\x4e\xe9\xc7\x5e\x24\x89\xc9\xcb\x46\x66\x1c\x62\xdd\xb6\x32\xcd\xc3\x9e\xc6\x6d\x5b\x1e\x33\x39\x82\x9b\xb0\x70\xbc\xd8\xc5\xdc\xc3\xd8\xc1\x2e\xb6\xfb\xca\x64\xc8\x09\x3f\x52\x3e\x40\x71\x1e\x56\xa2\xeb\x98\x47\x11\x26\x6e\x01\xea\x88\x16\xdb\x15\x7e\x7b\x29\x72\x3f\xfa\x5e\x31\xa5\x08\x8c\xf7\xd9\xba\xd2\xc4\x85\xfc\xe9\x70\x8d\xb9\x8a\xd5\x30\x22\xb5\x84\xe3\x97\x51\x07\xdf\x0f\x08\x1d\xd8\xdd\x07\xa1\x94\x7e\x73\x1f\x81\x42\x17\xba\x22\x48\xe1\xd3\xa9\x91\xe5\x20\xe0\x30\x5a\xcf\xe3\x98\x03\x51\x9c\x58\x06\xf6\xf3\x41\x38\x1e\x18\x1d\xc7\x00\x54\x67\xf0\xdf\x13\x56\x94\x73\x98\xe2\xa3\x26\x57\x4e\x3d\xa0\x1a\xe7\x2b\x28\xa0\x80\xdb\x3e\xf3\x1a\xa7\x41\xe0\xdb\x58\x14\x2d\x70\x5f\x8d\x84\xf0\xe8\x68\x08\x18\xe5\xe2\x2a\x78\x7b\x84\xc3\x40\xdf\x7d\xf2\x3d\x21\xe6\xda\x70\xe3\x0a\xaa\x16\xae\xaf\xe7\x65\xf3\x3f\x87\x13\xc5\x20\x58\x68\x17\x2d\x85\x32\x3b\xc0\x44\x92\x50\xc7\xa0\x19\x45\x64\x25\x14\x96\x4b\xb7\x1d\xda\x44\x42\x75\xdf\xe9\x80\xeb\x58\x04\xa6\xc6\xa8\x2a\xf3\x7c\x72\x06\x11\xfa\x2c\x19\x3c\xb6\xe1\x94\x1b\x4e\xbf\x58\x58\x07\x3b\x1f\x6e\x74\xb1\x48\x22\xce\x3b\x6c\x6e\x56\xbc\x5e\x23\xa8\x3c\x2b\xba\x17\x2a\x03\x41\x96\xbc\x09\xdb\x8c\x78\x9c\x75\x2c\xa5\x24\x64\x6f\x56\x64\x06\x44\x74\x93\xe5\xf8\x99\xfa\xf5\xdc\x92\x1f\x4b\xa5\x68\x1d\x3e\x15\x99\x2c\xab\xa2\xbe\xcd\xf4\x60\x1a\x2a\x66\xd4\xcf\x0f\x24\xcc\xdb\xee\x60\xc6\x73\x19\x2f\x3f\xb1\xd2\x69\xd4\xdb\xdb\xf7\xe5\xeb\xe5\x2c\x1a\x5d\x14\x7d\x8c\xb9\xc3\x48\x95\x85\x43\x48\x99\x02\xe3\x01\x4e\x2a\xc6\x20\x25\x74\x63\x7d\xae\x1b\x3c\x0c\x29\x03\x74\xac\x6d\xb1\xb2\xc5\xda\x2c\x3a\x19\x36\xdb\x21\xf1\x3c\x4c\xb0\x47\xd4\x1a\x79\xd6\xae\xd1\x07\x69\xa9\x2f\x8d\x7a\xeb\x54\xb9\xd5\xf5\xb3\xd2\x04\x2e\x1e\x76\x53\x21\xda\x8a\x8d\x09\xbc\x2e\x61\x61\xc2\x65\x17\xfb\xe8\x7f\x8e\x24\xd5\x6f\x1b\xa0\xa8\x4d\xbc\xd8\x36\xee\x69\x72\x1a\x0e\xa4\x6d\x86\xab\x53\x55\x1a\xf2\x3a\xf2\x86\x67\xe7\x5f\xe2\x0b\xa9\xe2\xc1\x1d\xe5\x93\x51\x93\xf8\x8a\x31\x0b\xe9\x26\xdb\xb7\x29\x0b\xac\x17\x85\xda\x0c\xc4\xe6\xe6\x8b\x97\xa6\x6e\x42\xe2\xab\x98\x2a\x10\x6c\x22\xdb\xa8\x13\x38\x69\xcf\xe1\x27\x4d\x7c\x1d\x04\xb6\x6a\xe0\x19\xce\xed\x48\xb9\x3a\xcf\xe6\x10\x92\x08\x4c\xd0\xdd\x06\xa8\x1c\x9a\xa2\x33\x8e\x93\x48\x6b\x62\x1b\x32\x5b\xc2\x55\xf6\x61\x98\xdc\xf6\x8f\x19\x87\x81\xc8\xd4\x54\x1a\xbb\xeb\x15\xf3\xc8\x6d\xa2\x44\xf7\x78\xfe\xd1\xee\xb3\xed\xb7\x6f\x37\xa0\x35\x8e\xab\x14\x75\x12\xa7\x81\x13\x92\xdb\x94\xf9\xaf\xa9\xcf\x95\x24\x2c\x20\x98\xcf\x2a\x3f\xcf\x7a\xc2\xa3\x28\xd3\x98\x81\x50\x27\x49\x14\x80\x74\xcc\xc7\x24\x22\x34\xfa\xe6\xae\x57\xac\x28\x30\xbe\xa4\x5a\xbd\x0d\xbc\xc2\xf5\xa9\x78\xc5\xb2\xf8\x8e\xd5\x25\x45\xfc\x67\x8e\xec\x4c\xf9\xf0\xcc\xcf\x53\x2b\xf1\xff\x82\x7f\x0f\x6f\x3a\x0d\x0c\x4e\xdb\x72\x33\xbe\x0c\x32\x4a\xa3\x5a\xe4\xc9\x07\x4a\x31\x65\x6c\x00\x35\x37\xa2\x00\x33\x78\x97\x04\x64\xe4\x59\x18\x98\xe7\x86\x03\xa0\xaf\x6d\xbc\xb7\xd4\xad\xa7\x86\x6a\x10\x24\x4b\xa4\x67\x49\x68\x1b\xa8\x9a\xe7\x21\xed\xc9\x07\x77\xa3\x98\x72\x6e\xd1\xb6\x6c\x26\xfa\x8b\x3a\x51\x69\x4a\xc4\xf1\x40\xb8\xcc\x81\xd7\x3d\xf9\x34\x4a\x73\x69\x77\x96\x5b\x2c\xd0\x42\x67\xea\x19\x81\x56\x9d\x60\xa4\xc5\x90\x56\x62\x03\x97\xae\xf9\x07\x77\x8b\x31\x4f\xe4\x64\x32\x7f\x19\x19\xd4\x76\xda\x26\xdd\xa4\xc5\xd4\x28\x56\x1a\x4c\x48\xfd\xed\xfa\x6e\x72\xeb\x08\x21\x1a\x1a\x70\x2a\xce\x26\xd1\x93\xe1\x76\x95\x20\x48\xaa\x53\xa9\x8f\x34\x8f\x29\xa5\x6d\x9b\x34\x53\x84\xae\x68\xef\x87\xaa\x27\x2f\x2a\x3a\x47\x96\x47\xa2\xa3\x94\x98\x2e\x35\xca\xfd\x22\xcf\xbf\x13\xe1\x65\x7d\xca\x9b\x9b\xb2\xb2\x40\xe6\xee\xd4\x09\x23\x64\xc6\xb6\x3e\x76\x65\x23\x3a\xd1\x52\x52\x92\xe1\x3b\x14\x0d\xa8\x69\xa8\x27\xf5\x7c\xcf\xa9\x30\x5a\x76\xf6\x2f\x5d\x8b\xa0\xad\xff\x68\x4a\x05\x36\x47\xe2\x3a\xd9\xbe\xcf\x29\x13\xeb\xd4\x13\x9c\x4a\x42\x6b\xa7\xe5\x39\xf0\xd0\x52\x4f\x1b\x68\xce\x42\x29\xbb\x07\x8d\x0f\x66\x51\x44\x4b\x7c\x81\x6f\x4f\xd5\x2b\x14\x59\x3d\x52\x9f\xba\x8c\x2d\x26\x83\xd1\x91\x32\xf4\x5d\x89\xce\xd5\xe9\xdc\x3a\x78\x33\x53\x23\xe5\x5c\x11\x7c\x44\x75\x54\x7b\xae\x41\x1b\x35\xd9\x1a\x9b\xab\x46\xbe\xd4\xea\x42\x5c\x48\xa7\x7e\xc0\x89\xab\x49\x42\x2e\x97\x66\xdd\xad\x1f\x11\xd5\xa5\xd4\xb3\x3d\x20\xf2\x42\x32\xa7\x8f\x99\x2c\x8f\xf5\x6e\x8a\x67\x75\xbd\x7c\xed\x4a\xc5\xd6\x78\x2c\xab\xd6\x86\xf9\x91\x15\xaa\x7c\x9b\x30\xab\xe8\x34\x4a\x7d\xf2\xf9\x95\xa1\xb7\x9b\x9b\x01\xae\x27\x28\x2a\xde\x5c\xee\xab\xb2\x28\x47\x09\x9e\x59\x1b\x2f\x8d\x03\x4d\x19\xbd\xc7\xd5\xfb\xd6\xbd\x94\x38\x45\x2a\x32\xbd\xc5\x66\x9d\xbd\x76\x54\x27\x89\x6b\x06\x6e\x55\x7d\xfe\x83\xb2\x59\x62\xd5\x18\xbd\xf4\xe9\x7b\x8b\xa5\xe7\xa1\xb3\x9b\x97\x15\xd2\x67\x7d\x80\xf7\xee\x32\x08\x34\xc6\x56\xd7\x2f\xbb\xe7\xd5\x7a\xb7\xda\x7e\xdd\x3d\xaf\x57\xbb\xcd\xe2\x7e\xd5\xf5\xd1\x1c\xb5\x0b\xe1\x58\x23\xe3\xc6\xb0\xaf\x42\xe7\xc8\xa7\x89\x9f\x52\xe5\xb8\x80\x3a\x93\x23\x23\x21\x4d\x03\xe6\x1b\x53\xb8\xcc\x11\x8a\x91\xe6\x9c\x9b\x67\x69\x1a\x22\xd9\xd5\x5f\xaf\x97\x5b\x1c\x15\x70\xea\x34\x4d\x12\x87\xfb\x1f\x60\xea\xa7\xa8\xa6\xc9\x67\x48\x65\x60\xc5\xe8\xeb\x86\xc4\x82\xee\x07\x27\x54\x49\xd4\xd9\x6f\x07\x92\x72\xde\x39\xf7\xc6\xc4\x11\x7d\xa2\xa6\xb3\xdd\xc1\x4b\xa4\x81\x61\x60\x7e\x57\x0c\x29\x3f\xd8\x05\xf5\x9f\x3b\xc4\x4f\x99\xe3\x83\x06\xf3\xe6\x0d\x41\x71\x3d\xb3\xbe\xa6\x20\x18\xd1\xf6\x50\xf0\x61\xf4\xa1\x65\x18\xd2\x08\x5d\x3c\xdc\x6d\x26\x83\x57\x86\x11\x91\x10\x54\x27\x71\xaa\x9f\x2a\x28\x5e\x27\xf0\xd7\x54\x46\x01\xe5\x7b\xbe\x92\x18\x0c\x11\x20\x90\x8f\xea\x6e\xf9\x93\xea\x27\x9d\xaa\x18\x44\x32\xa0\xc2\x98\x4f\x9e\xa4\x08\x9c\x46\xd0\x8e\x12\x03\xb4\x37\x4e\xb4\xa3\x5d\x47\x01\x14\x04\x10\x59\x23\xcb\xac\x30\x61\xb9\xcf\x2d\xa3\x14\xa5\x49\x04\x6d\x5b\x87\xf2\xee\x00\xaf\x38\x50\x34\xd5\x29\xea\x58\x43\x67\xb3\x95\xa7\xe6\xf1\x74\x30\xd4\xc0\xa3\x77\xa8\x99\x41\x20\xd5\x46\x6f\xe3\xcd\xd4\x1f\x8d\xef\x4e\xa3\xa2\x11\x41\xc9\x6a\xa3\xf4\x84\xd5\xa8\xea\xc0\x74\x04\xcf\x07\x2e\x86\xe8\x5c\x35\xc8\x2b\xff\x31\xe9\x9b\x18\x81\x4c\x9b\x3b\xbb\xc6\xf7\x06\xab\xac\x99\xac\xbe\xe0\x25\x60\x58\x46\x1b\xb9\x9f\xc3\x35\x81\x97\x32\x82\xef\x8a\xd3\x79\xd3\xc0\xe1\xe8\x3e\x30\x78\x69\x44\xe0\x89\xac\x6e\x5f\x67\x55\x4f\x77\x17\xf0\x94\x8c\xbd\x4e\xf8\xa7\x35\xeb\x37\xd0\x94\xf5\x3e\x9b\x5f\xbb\x80\xf9\x40\x70\x11\x22\xf5\xc0\xea\x30\x0a\x3b\x00\x0f\x00\x8c\x37\x45\x4a\x17\xad\x53\x55\x34\xf9\xb9\xab\xb3\x1a\xbc\x74\xf0\x3d\xc3\x62\xa6\xca\x8f\x53\xdc\xe0\x4b\x3f\xe6\x1d\x37\xe8\x78\x5a\x77\x5d\x34\x50\x30\xf5\x20\x3f\x0f\x17\x43\xe0\xc5\x9e\x13\x7a\x6f\x47\xc9\xf7\x47\x77\xdf\x01\xe7\x54\xd2\x84\x50\xe5\x19\xd1\x4d\xbd\x37\x1b\x0a\x2a\x1f\x2e\x45\x61\x35\x04\x21\xa7\x0a\x18\xa8\x2a\x38\x3f\xe9\x65\xde\xfa\x1f\x93\x17\x1b\x58\xd2\x92\x83\x61\x9e\x68\x4a\x55\xfe\xca\xb0\x3b\x83\x0c\x28\xfa\x66\x90\xb3\x6b\xac\x8d\xf9\xed\x5a\x95\xd1\x08\x90\x56\x39\x4c\x2d\x94\xca\x8a\x57\x62\xd9\xca\xbb\x97\x1d\x20\x38\x9a\x36\xac\x7e\xd1\xc2\x3d\x9e\xde\x10\x62\x40\x50\x23\x53\xcf\xea\x82\x8f\x53\xbc\x01\x44\x5c\xbb\xfd\x95\xa2\xbd\xd5\x79\x93\x97\xaf\x30\x4d\x2a\xbb\xde\x9a\xa5\x62\x84\xe6\xbc\x29\xab\x7f\x9e\xb0\x47\x91\xda\x8e\x69\x24\xd2\x01\xd5\xa1\x51\xcb\x82\xdc\x18\x47\x13\xeb\x04\xd2\x24\xa0\xcd\x5f\x9f\x0a\x45\x1a\x04\xee\x77\x65\x90\x3d\xd7\x8b\xcd\xe2\xea\x6e\x77\xf7\xb4\x9b\x24\x98\x01\x30\x11\xd6\xcf\x6d\x0f\x9c\x49\x4a\x81\xf0\x78\x14\xda\x6f\x91\x5d\xe3\x2f\x77\xa8\xe8\x59\x1c\x4c\xb5\x1e\xaa\xed\xfb\xe4\xe5\x08\x61\x62\x1f\x0f\x8b\x3f\x77\x8b\xfb\xfb\xa7\x1f\xab\xeb\xdd\xd5\x5f\xbb\xcd\x76\x71\xbb\xea\x20\x44\x20\x30\x92\xda\x01\x95\x9b\x13\xe4\x56\xf4\x2d\x2b\x0b\x4a\x67\x9b\x90\xde\x6f\xe5\x0e\xed\xd9\x54\xa0\x82\xa8\x0f\x35\x0e\xa5\x27\xba\x1e\x18\x1b\xb0\xe8\x2f\x2c\x0c\xbf\xd3\x98\xcc\x48\x03\xc6\x21\xb6\xdf\xe9\x4f\x28\x94\x23\x12\xd5\x80\xa9\x6f\xb4\x33\x08\x27\x49\x23\x7b\x60\x6c\xbb\xb9\x89\x92\x25\x4e\xe6\xba\x8b\x74\x8f\xef\x51\x33\xa4\x77\x67\x12\x9a\xdb\xac\x9b\x1c\x3a\x49\x53\x43\xe3\x6f\xb5\xf0\x3e\x62\x6c\x18\x6f\x88\xa0\x25\x27\x13\xd4\x78\xe2\x57\xa7\x3a\x2b\xb0\xae\x2d\x30\x6e\xd6\xd1\x16\x9e\x27\xa9\x00\x2c\xa3\xad\xa2\x7d\x01\xd6\x2a\x73\xa4\x29\x5a\xb0\xd0\x08\x9b\xed\x04\x34\x72\xcf\x76\x99\x2c\x07\x68\xb9\xe1\xac\x16\x2c\x34\x4a\x7e\x28\x0f\xa7\x3e\x8c\xe0\x4f\x00\x4d\x82\x45\xc9\xc0\xaf\x3d\x5a\x39\xd3\x7e\xaf\x16\x4c\x33\xc7\x31\x67\x79\xf8\x3e\x08\xd9\x0b\x1e\x6a\x27\x5a\xd8\x5b\x68\x17\xd0\x57\xc1\x53\x26\xc5\x20\xd9\x7b\x37\xaf\xb7\xa0\x05\x57\xc8\xe5\x50\x6f\xb9\xde\x96\xdb\xb7\xdf\x04\x7c\x05\xd7\x9c\xb8\x14\x5a\x5b\xc7\x44\x24\xee\xa1\xfd\xff\x35\xfe\xca\xea\x3e\x6a\x21\x7c\xab\x71\x61\x28\x29\x4c\xdd\xd5\x4d\x49\x86\xae\x81\x45\x8f\xbd\x71\x7b\x54\x10\x6b\x72\xc5\x96\xa7\xbc\x39\x55\xf8\xbc\xcf\xf2\xb2\x2e\x8f\xfb\xf3\x0d\x64\xcd\x9e\x3c\x33\x77\x81\x40\x48\xca\x1d\x9b\x5c\x42\xf3\x0c\x75\xfd\x56\x56\x6a\x96\x87\x4e\x8b\x40\x31\x0a\xf8\x6f\xf7\xf8\x70\xa2\x29\x47\xeb\x8c\x74\xe1\x33\x11\xa6\xda\x68\x35\xbf\xc1\xf1\xb9\x2a\xdf\xc7\x21\x72\x11\xa1\x91\x72\x3e\x9a\x60\xce\xc0\x59\xb0\x32\x3a\x5a\x24\x5c\x71\x4b\x02\x51\xe1\x73\xeb\x9d\x8f\x42\x42\x22\x49\x62\x5b\x0c\x6f\xf0\x11\x83\xb2\x3d\x91\x48\x0f\x55\x1f\x9b\x5b\xfd\xf3\xe5\xee\x47\xb6\x6f\xca\x53\xf3\xed\xaf\x65\xd7\x49\x85\xb4\xd0\x13\x40\xc4\x45\xe9\x5c\x63\x1a\x4b\x3f\xe8\x26\x04\xb1\x96\xd8\x8c\xce\xa7\x08\x25\x01\x22\x48\x3b\x10\x9f\x71\xb4\xa6\x03\x60\x88\xa9\x98\x1c\x2d\x02\x8f\x10\xc5\x6b\x90\x59\xf1\x3a\xb4\xb2\x85\x08\x14\x4d\x90\x65\xc7\x33\x65\x74\x22\xa7\x8b\xb9\x10\x3a\x10\xb6\xe4\xfa\x5b\x46\x52\x89\xb7\x30\x49\x0b\x09\xa9\x0d\x63\xc5\x2e\x37\xfa\xf5\xa3\xd0\xa7\x50\x7e\x18\x05\x7d\x59\x50\x7b\x8d\x07\x8a\xd0\x56\x5d\x8f\x38\x26\xff\x4d\x65\x6a\x53\xea\x66\x09\xc7\x71\x25\xb6\x50\x29\x10\x92\x77\xbd\xba\x79\x79\xbc\xde\x2c\x96\xdb\xbb\xef\xab\xae\x11\x62\x82\x5f\xdd\x67\xa2\x82\xea\x3c\x7a\x4c\x64\x69\x6c\x68\xff\x6b\xd9\x55\xbd\x0a\x0c\x12\xc3\xd9\xbe\xcf\x8e\xdb\xf2\x61\x56\x74\x47\x0b\x8c\x83\xd8\x6a\x98\xa8\x55\xa1\x8e\x65\x36\x13\x26\x1c\x9b\x25\x02\xc1\x80\xf8\x8d\x2d\x40\xa5\x11\x9f\x97\x91\x09\xc4\x88\xc6\xd6\xf2\xf1\x2f\xa3\x34\x94\x9f\xa6\xc6\xf7\x28\x36\x67\x0f\xd3\xb1\xf4\x71\x90\xa7\xb1\x6b\xeb\xe4\xc3\x68\x8c\x28\x24\x0f\x27\x95\x59\xa7\x77\xe4\x91\xcc\xfb\x33\xd2\xf3\x01\xbc\x7e\x1b\xbe\x3a\x9b\xb2\x8c\xf1\xc9\xa5\x17\x6a\xb2\x7b\x48\x94\x08\xf2\x8e\x09\x4c\x4b\x2f\x32\xb0\xcc\x22\x93\x78\x7b\x3a\xd7\xd3\x03\x13\x43\x61\xf3\x74\xaa\xae\x1c\x53\x92\x96\x1e\x86\x44\x4c\x4d\x35\x22\x26\x2a\xeb\xe6\xb7\x64\xc8\x29\x99\xde\xba\x77\x33\xb5\x45\x92\x07\x9c\x92\xd2\x65\x41\xd8\xb1\xb9\x05\x55\xf2\x40\xc2\xa8\xaa\x60\x00\x63\x99\xde\x21\x8f\xd1\x70\xc2\xd5\x77\xb2\x1c\x0a\x0b\x6b\xc9\xd1\x23\xb6\xd4\x87\xac\x40\xb5\xdd\x67\xf5\x5f\x08\x6e\x20\x4b\x1f\x42\xd2\xb7\x6e\x8d\x3d\xa2\xef\x6b\x8d\xf0\xc9\xb9\x43\x61\x94\x00\x5c\x94\x62\x52\x1a\x37\x1e\x50\x32\x94\xa9\xb3\xe7\x5a\x43\x76\x22\xda\x36\x3e\x73\xc4\x35\x99\xa9\xdb\x2a\x23\x59\x4f\x4a\xde\xcf\x0f\x54\x19\x21\xf3\xc1\x55\x53\x9e\x0a\x35\x5f\xd2\x27\xe3\xd0\x20\x1f\x6d\x58\x6a\x84\x69\x97\xb1\x8a\xc8\xe9\x3e\x4e\x62\xd8\xff\xc7\xa2\xc9\x46\x2b\x13\x8e\xa3\xe2\x96\x97\x82\xb8\x66\x51\xdd\x60\x97\x92\x90\x49\x14\xfa\x96\x58\x9c\x02\x5a\x54\x5d\xc2\xbb\xd6\x38\x4c\xec\x06\xbb\x23\xd3\xd6\xf0\x15\x8d\xc0\x32\x32\xe5\x09\x15\x4f\x37\xf0\x3e\xfe\x3d\x46\x5a\x7f\x6f\xb1\xc8\x4e\xdd\x05\xd3\xc4\xa7\x6f\xb9\xdc\x63\x5e\x23\xfc\xaa\x17\x55\x8d\x45\x87\x67\x95\x10\x72\xe2\xa0\xde\x67\xaf\x7b\xe2\x63\xef\x1b\x4c\xd0\xff\xae\x5e\xc3\xff\xd6\x27\x32\x0c\x26\x6f\x0e\xb4\x01\x99\xdf\x94\x07\x5b\x4e\x3b\x70\x66\xa5\xe0\x29\x57\x03\x74\xc8\xcd\xa9\xe8\xf1\x54\x89\xeb\x24\xd0\x08\x4b\xb6\x2f\xa4\x2c\x9b\x0b\x46\x00\xdb\x4f\x7a\x1c\x3b\xa1\x44\x3c\x1d\xa6\x21\x15\x29\xb9\xa1\x1d\x36\x94\x32\xcb\xaa\xbc\x0c\xde\x4b\x29\x19\x7d\xcc\xc6\xd5\x3c\xaf\xba\x70\x8f\x54\x9e\x11\xf6\x59\x00\xa8\x3d\x54\xd7\x78\x28\xbb\xa6\x18\xc1\x95\xca\x3f\x3d\xdd\x1b\xad\x40\xdf\xef\x9a\x35\x12\x46\x3a\x93\xe5\xb0\xf6\xc3\xb6\x6a\x1e\x0a\xec\xf8\x32\xdd\x64\xdc\x9c\xc6\xb8\xef\xf1\xc3\xea\x30\x24\xee\x2f\x97\x50\x1a\xea\xe7\x9b\x2e\xca\x63\x1e\x31\xcd\xec\x6a\xcc\x73\xa7\xdc\x36\x3a\x8b\xf2\x98\x22\x36\x2b\xc3\x91\xfb\x54\xac\xd6\xcb\x98\xb3\x0f\xe5\x49\x47\x56\xae\x3b\x05\xf7\x09\x3a\x76\x73\x63\xf2\x1d\x13\xfa\x35\xad\x9c\xcc\x15\x0d\xd6\x65\x79\xaa\xea\x6e\xa8\x2b\x1e\x19\x9a\xf4\xff\x80\xfc\xf9\x5c\xba\x52\xb3\xbe\x19\x8d\xca\x8d\x59\xab\x96\x39\xd4\xf5\x00\xcc\x3d\x7e\x23\xca\x57\x8a\xc0\x2c\x4f\x85\xd1\x5a\x58\xfd\xf7\x04\x79\x7d\x57\xf4\x0b\xb2\x0a\x98\xd1\x74\xa8\x89\xe8\xcb\xb1\xd6\x98\xf2\xd6\xf1\xc9\x82\x38\x22\x0a\xa5\xc5\xa9\x29\x8b\xf2\x50\x9e\xea\x76\x47\x7e\x83\x0a\x9f\xaa\xd7\x2f\x63\x34\xd6\x69\x88\xc9\x72\xc7\x8b\x80\xfc\x72\x32\xcc\x89\x8f\xcb\xe9\x0a\x68\x15\x86\x90\x80\x83\x9b\x91\xba\xc9\x11\x8b\x6e\x93\x57\xb1\x48\x08\x74\x4a\x72\xe0\x54\x0a\x3e\x02\x01\xff\x31\xb7\x49\xab\x58\x07\xbe\xd5\xc6\x5a\x2e\xbf\x9a\xe1\x17\x8f\x2c\x3b\x95\x78\x89\xa9\x79\xc9\x0a\xf3\xc4\xee\x77\x9e\x52\xe6\x11\x0b\x65\xf9\xc5\xba\x96\x08\xa8\x00\xed\xc6\x68\x9f\x4c\x5e\x51\x1a\x09\xa2\x4d\x30\x46\x8c\x9a\x04\xc0\x06\x91\x3e\x95\xc6\x92\x84\x4e\x96\x8f\x65\x83\x75\x47\xd4\xae\x55\x9a\x98\xf8\xbd\x35\x28\x6f\xca\x8a\xa8\xf0\x1d\x7a\x6d\x7e\x9e\xab\x54\x18\x4a\x5b\x83\x6f\xff\xee\x22\x7c\x6b\xc3\x32\xdf\xad\xbe\xfe\x25\x01\x01\x1b\x90\x57\x0f\xc7\x70\xaa\x19\xad\xa9\x12\x9a\xc7\xf2\xbe\x2c\x5e\xb1\xb2\x5e\xc0\xe4\x99\x21\x30\x12\x64\x0f\x99\xf5\x46\xdc\x93\x40\x68\x48\xf5\x2b\x33\x75\x8c\xc0\x16\x61\xdd\x3e\xcd\xb4\x28\x48\xcc\xd2\x6a\x40\x97\x20\xf7\x17\xfd\x47\xcb\x93\x02\x54\xb4\x23\x5f\x95\xe5\xc1\x14\xe8\x56\x13\x4d\xc6\x01\xef\xc2\xcc\xa7\x00\xed\xd3\xf1\x56\x50\x7e\xf1\x5a\x21\xc5\x83\x66\x34\xa3\x2e\x48\xde\xa6\x21\xa8\x79\xdf\x4b\x89\xd0\x04\x0b\x41\x29\xf3\x21\x0f\x14\x29\xc1\x3b\x59\x7e\xf0\x41\x05\x24\x54\x5f\x76\x95\xa1\x71\xf0\x06\x2f\x56\xea\x90\xc2\x6f\x04\x31\x6e\xf6\x9f\x56\x63\x2b\x15\x47\x8e\xd6\x54\x9c\xce\xc7\xcb\x8d\x5c\x29\x61\x38\xe0\x49\x6d\xeb\xfb\x8b\xe3\x5d\x52\x18\x44\x9e\x8b\x17\x39\xa2\xc3\x9b\x8b\x88\xa9\xc2\x24\x88\xd2\x4b\xf9\xa2\x51\x20\x43\x69\x2f\x66\x43\x58\xef\x85\xa0\xe0\xe0\x7b\xe8\xc8\x70\xf4\x1c\xab\xb2\x41\xd9\x7c\xcb\x8a\x57\x55\xba\xbc\x9d\xd2\x10\x90\x01\x49\x21\xfb\x1a\x9b\xd3\xf1\xaa\x84\x4a\xad\xcb\xf2\xb0\x28\xd4\xa2\xae\xb1\xea\xa6\xb1\x46\x03\xbf\xef\xea\x7a\x28\x4f\x7a\x7d\xa9\x83\x6a\xfa\xa3\xe7\x01\x6d\x86\x59\xa1\x5a\x97\xe7\x04\xf9\x03\xbc\x2f\xe1\x38\xf2\x28\xd1\x8b\x39\xa9\x17\x6f\xae\x57\xb3\x45\x19\xc3\x15\x06\xbd\x04\x49\x28\x68\x5f\xbe\xed\x0e\x50\x9c\x77\x50\x89\xac\xa9\x77\xaa\xdc\x65\xbb\x3d\x74\xc6\x23\x7a\x5a\xd3\x26\xab\x29\x42\x65\x42\xd3\xe3\xbb\x63\x21\xb3\xb2\x8c\xed\x44\xdb\x22\x1c\x56\xcd\x7e\x12\x26\x43\x16\x2a\x61\x64\x04\xaa\x9f\xd8\x88\xf6\xd5\xdc\x67\x16\xe1\x69\xa2\x8c\x7f\x2f\x5f\x8b\x4c\x70\x2f\x71\xa3\x02\x7e\x39\xc3\x07\x79\x84\xe4\x4f\xb7\x76\x6c\x59\x60\xd1\x0c\xb1\xc6\xc8\xc1\x30\x26\x1b\x67\xf6\x1f\xa7\x57\x50\x30\x53\xaf\x81\x5c\xa6\x04\x49\x78\x31\x11\xf1\xab\xb3\x19\x61\x1f\xc0\xea\x91\x2b\x8f\x22\x65\x50\xd7\xd9\x6b\xb1\x06\xad\x73\x7c\xae\xb2\xff\x4d\xb0\x11\xc8\x91\xf3\xd4\xd9\x4e\x0d\xe4\x84\x4b\x9f\xf4\xf1\xc1\x14\x3b\x2f\x6f\x97\xb7\xc3\x69\x85\x01\x62\xac\x7b\x86\xc1\xbb\x06\x0f\xb3\x29\x56\x0c\x99\x91\xa2\x39\x62\x55\x67\x75\x33\xdc\x39\x30\x0c\x93\xc8\x94\x52\xbb\x08\x1d\x46\x2c\x21\xbd\xa0\xe7\xc5\x7a\xfb\xb8\x5a\x6f\x76\x8b\xeb\xeb\x75\x5f\x73\x88\x51\xa0\x99\xd9\x34\xde\xb3\xc3\xe9\xf0\xb5\x54\xf9\xf5\xc9\xc8\x08\x39\x89\xa5\xf9\xb7\x12\x07\x09\x4d\x6d\xda\x4c\xe5\x3e\x93\x3f\xbb\x31\x1a\x8b\x88\x07\x9d\xb6\xc7\x43\x8f\x44\xc2\x58\x6b\x0a\x1e\x6d\x8e\x55\xd6\xe0\xe8\x05\x24\x2c\x48\xfb\x22\x29\x6a\xba\x3a\x7f\xfd\x31\x4f\xe2\xaf\x31\x09\x3d\x2b\x6f\xd6\xb4\xef\xaa\x23\x19\x18\xbf\xee\x24\xe2\x46\xb2\x21\xeb\xd1\xfc\x6d\xf7\x7a\x51\xa8\x6b\xac\x9b\xaa\x3c\x8f\x7e\xfe\x2d\x5d\xa0\xc6\xd4\x8f\xe3\x6e\xc1\xc2\x9b\x0a\x6a\x67\xcd\x60\x1a\x23\xed\x39\x6f\xfb\xf2\xae\x5e\x96\x85\xc4\xaa\x98\x22\x1e\x30\x45\x10\xb2\x33\x79\x26\x1f\x17\xd2\x48\xaa\xae\x64\xe7\xa5\x36\x70\x4a\x62\x53\x9d\x51\x0f\xd7\x08\x32\x0e\x85\x8b\xaa\x3b\x1d\xca\x8f\xc6\x31\x20\x3a\x00\xec\xa6\x5d\xba\xba\x2a\xaf\xa9\xab\x67\xfb\x0b\x4f\x52\x6a\xaf\xdd\x2a\x96\x4f\x14\xdd\xa2\xf2\xb3\xcf\xd3\x65\x28\x58\xaa\xa2\x9e\xfe\xbd\x9d\x27\x33\x6f\xf3\x62\xef\xfa\x74\x9b\x45\xe1\x87\xd1\x45\xf2\x75\xd7\x94\x9f\x6e\x3f\x28\x3d\xa4\xec\xc0\x7d\xf9\xea\xbc\x87\x85\x1a\xa6\xeb\x67\xb0\x3d\x69\x97\x53\x3d\x5d\xaa\x19\x6a\x94\x21\x10\x0a\xa7\xb5\xaa\x63\x57\x67\x81\x32\x52\xb2\x1f\xbc\x16\xd5\x6e\x7d\xe2\xdf\x15\xc2\xcc\x3f\xb0\x12\xd2\xf3\x5d\x78\x1e\x2a\x74\x1c\x75\x37\xa5\x13\x34\x9c\x75\x43\x50\xa9\x98\x22\x52\x75\x91\x1d\x8d\xe5\x6f\x6c\xef\x0b\x0d\x1d\x8d\xe8\x1b\x6a\x89\x76\x45\xd8\x6d\xbf\xdd\xee\x1e\x9f\xae\x57\x5d\xa3\x95\xec\xa9\xb1\xd9\x1d\xb2\x62\x77\x80\xf7\xdd\x4d\x56\x14\x78\x7e\xc6\x91\x21\x36\xb9\x3e\x6a\xcf\x11\x2d\xcc\xe0\x82\x34\xf3\x2d\x22\xbc\x1d\x16\xe3\x96\xc0\x67\xcc\xcd\x2b\x8b\xc3\x75\x02\x8d\xe3\x8e\xe0\x93\x85\x76\x80\xf7\xf6\x3e\x6a\x52\x4c\xeb\xac\x75\xcd\x2d\x29\x0b\x69\x20\x43\x95\x35\xe7\x4b\xb3\x41\x07\xdc\xd0\xad\x5b\xdd\xea\x9d\x84\x7a\xbf\x23\x68\xd4\x0e\x86\x9e\xa0\x0e\x59\xac\xb5\xbb\xab\x6b\x14\x93\xf5\x5c\x87\x51\x64\xa4\x11\x4c\xd2\xf9\xa6\xac\x6c\xbc\xb2\xab\x86\xd6\x21\x32\xaa\x51\xdd\x65\x0d\x1e\x6c\x8d\xc6\xf8\xa5\x44\xa1\x1f\xc9\x01\x83\x83\x01\xb9\x43\xd5\x4c\xfb\x41\x18\x88\x4e\x41\xe8\x06\x7e\x75\x7c\x23\x3a\x02\x15\x86\xc3\xd2\xf1\x71\x40\xc6\xf5\x92\x3c\x30\xa0\x41\x42\x0b\xa2\x7a\xd9\x38\x12\x1f\x1d\x87\x09\x7d\x70\xb3\x79\xde\x2d\x9f\xe6\x4a\x24\x5d\xdf\xc8\x44\xd8\xd6\x4f\x57\x2e\x77\x32\x2d\xce\xd1\x31\x18\x43\x9a\x7c\xfa\x47\x7c\x1d\x99\x31\x3a\x09\x13\x2a\x3f\x76\xb2\x77\x94\x0c\x1d\x10\x30\xea\x04\x64\x62\xe3\x40\x37\x59\x01\x79\x5f\xcd\xab\x13\x15\x92\x69\x68\xa8\x23\x37\x6f\x9d\x23\xa7\xd3\x48\xc6\x36\xa2\xfb\xb5\x2c\xca\xd3\x24\x32\xa8\x81\xc7\x24\x2f\xb6\x87\xba\xaf\x9e\x9e\x24\x7c\x34\x04\xa1\x05\x4d\x90\x45\xfe\xb7\x24\x8b\xb5\x16\x91\xa4\x78\x83\x4d\x55\x7d\x1a\x5b\xd5\x42\x18\xfd\xed\xac\x1e\xd9\xa1\xae\x55\xfb\x34\x82\x1f\x5e\x36\xcf\xeb\x85\x7b\x36\x99\xc6\x14\x18\xfb\x8a\xea\x15\x97\x50\xef\xbb\x06\xc1\x68\x08\x16\xa7\xc3\x3f\x5b\x7f\x8b\x1e\xc9\xb6\x29\x1f\x28\x9a\x9e\x97\xaf\xcc\xbb\xc9\xcb\x72\x8c\x23\xd7\x2a\xe0\x20\x86\xd8\xe9\x0d\x31\xa3\x2c\x3e\x16\xea\xd3\x5a\xa5\x29\x15\x8e\xb4\x3e\x4e\x37\xfe\xd0\x97\x94\xb0\x7d\x59\x2d\xc7\x15\xa1\xe3\x63\x31\x90\xb2\xd3\x55\x19\xa0\x6d\xb5\xe6\xca\xb0\xdc\xc2\x79\x5b\xce\x89\xda\x6b\xad\x43\x49\x9c\xaf\x22\xb3\x24\x24\x78\x3a\x4c\x83\xde\x23\x5f\xae\x1d\x83\x14\x80\x18\xc2\x25\x07\xb3\xea\x8f\xc9\xf9\x05\xc6\x76\xc4\xfd\xa3\x14\x9b\x63\x59\xd4\x25\xd5\x55\x8d\x2c\x30\xee\x79\xcc\x37\x84\x7c\x34\x57\xb7\x86\x12\xd3\x36\x71\x0f\xfc\x5e\xad\xc1\x08\x68\x8d\x31\x9d\x83\xb2\xa4\xe1\xf5\xdb\x63\x63\x4e\x61\xfd\xda\xcd\xfe\x1e\x3c\xd7\xb6\x4a\x4e\xec\x15\x35\x65\xcd\xeb\x41\x0e\x89\x7b\x9e\xef\x1b\x7f\xed\x01\x5e\xb3\xf7\x35\xca\xb2\x52\x3d\x44\xa5\x6d\x0f\x91\xe0\xd7\x99\x2c\x5d\x59\x7a\xfb\x6b\xec\x13\xa0\x49\x23\xd6\x3b\xf7\x63\x20\x22\x1a\xc7\xdb\x3d\xfe\xd8\x43\x8e\x3f\x9c\x84\x67\xdb\xa6\x34\xdd\xc3\x15\xd4\x99\xec\x7f\x6d\x87\x84\xad\xc1\xef\x2d\x3a\xee\x79\xa1\x9f\x10\x8b\xfb\xf5\x76\xd5\xfd\x14\x1b\x59\xc3\xad\x1c\xa3\x25\xdb\x26\x25\x22\xd5\xf1\x74\xfe\x8e\xba\x6f\x6a\x98\x71\xcf\x8b\x83\x98\xf0\x29\xcd\x1e\xd7\x48\xee\xfe\x97\xf1\x0b\x8e\xa3\x88\x18\x6e\x17\xad\x13\x64\x00\x3a\xb6\x25\x91\x5c\x1a\x5a\xfa\xda\x85\xbc\x26\xc7\xa6\xe0\x85\xd6\xcf\xbc\x87\x42\xd9\xc2\x9c\xac\x2c\xac\xf9\x98\x5d\x5c\x0d\x78\x48\xd5\x93\xcf\x7b\x18\x3f\x28\xd8\x58\x3c\x28\xe5\xaa\x93\xdf\xba\x12\xfb\x0f\xac\xa1\xee\x50\x49\x50\x2a\x71\xaa\x8a\xc5\xbf\xee\xb7\xab\xcd\x76\x32\x36\x85\x67\x88\x7c\x5a\xe3\xab\x2b\x57\x4f\x5c\x63\x62\xd0\x71\x40\x7e\xea\xea\xbf\x63\xae\x86\xe1\xe4\x31\x9d\x69\x3f\xd8\xf5\xec\x95\x7f\xc7\x79\xe3\x9e\x27\x99\x71\x29\x8e\x15\x1e\xb2\xd3\xe1\x19\x9c\x6b\xd0\xb6\xc5\x86\x56\xf0\xcd\xc9\x93\x4f\x67\xf0\xe4\x54\x71\x4c\xc8\x21\xd1\xee\xc9\x67\xe7\x98\x74\x27\x53\x9a\x6c\x0d\x81\xad\xb1\xf0\x9c\xc9\x9f\x39\xae\xb3\x7e\xce\x28\xe6\x51\xea\xfe\xa9\x3a\xee\xf1\x54\x1b\x50\xa9\xac\xef\xa1\xec\xee\x47\x71\x54\xdc\x2c\x48\x4e\xee\xb3\xfd\x15\x05\x65\xd7\xad\xa2\xcb\xe6\x32\x1e\x73\x19\xf3\xe3\x9e\x87\xc2\x04\xf3\x3b\xb0\xda\xb6\xbc\xcd\x7e\xe1\x64\x60\xa0\x4e\x63\xa3\xf9\x71\x7e\xdc\x6e\xdc\x25\x35\x37\x08\x5f\xcb\x68\xed\x82\x77\xae\x55\x48\x6d\x13\x5f\x37\xa7\x3c\x3f\x7f\x9f\x61\xf7\x1e\x8f\x15\xd6\x4e\x7a\x1b\xc9\xbf\x3d\x15\xf5\x9d\x72\x4f\xc7\xbc\x40\x49\x13\x5f\x6c\xdd\xf2\xc3\xa9\xc8\x9a\xf3\x10\xd4\xd3\x76\x11\xc6\x9e\x35\x7e\xc8\xa6\x63\x40\xf8\xe0\x5a\xdc\x33\xdd\x17\xd7\x0f\x77\x8f\xbb\xcd\x6a\xbb\x6b\x87\xe6\x6e\xbd\x78\xbc\x7e\x7a\x18\x04\x3d\xb9\xc7\x7c\x2f\x26\x1e\xa5\xae\xc2\x6c\x83\xcd\x63\xd9\xac\x91\x02\x09\x20\x72\x7c\x2c\x07\x34\x06\xdc\x63\x41\xe8\x53\x10\xc3\xe6\xc7\x30\x2f\x8b\x63\x39\x4b\x52\xdb\x76\xb6\x42\x86\xcd\x6b\x45\x69\x29\xa8\xba\xd2\xdb\xee\x7c\x2a\x26\xcb\xda\x46\x83\x16\x79\xbe\xa8\x2e\xd1\x13\x93\x27\x0c\x90\x51\x46\xe6\x87\xf7\x13\x17\x37\x17\x22\xf9\x1f\x46\xe2\x46\x0e\x1b\x9d\x27\x54\x86\x7b\xdd\x65\x67\x6c\x43\xe8\x21\x67\x36\xbe\xd2\x9b\x90\xa3\xf1\xc5\x42\x5f\x11\xde\x96\x62\xb2\x0b\x55\x1e\x5b\xdf\x6d\x90\xb9\x68\xbb\x04\x48\x56\xd7\xa9\x38\xc2\xa9\xc6\xe7\xef\xcf\x5d\x4b\x22\x49\xf1\x52\x67\x79\x3e\x82\xb7\x71\x8f\xc5\x81\x51\x66\xb0\xca\xd4\x33\x44\x7d\x6d\x27\x30\x0a\x4b\xff\x8f\xb3\x7f\xd9\x6e\x1c\xc7\xb6\x85\xe1\x77\x39\xad\x6c\x9c\x06\x00\x92\x20\xf9\xf7\x64\x59\x76\x28\xd3\xb6\x54\x96\x1c\x51\x59\x7b\x9c\xa1\x81\xcb\x82\xcc\x32\x45\xaa\x48\x2a\x6c\xd7\xd3\xff\x83\x0b\x00\x6f\xa2\x23\x73\x7f\xbb\xb1\x23\xcb\x00\x29\x12\xc4\x65\x5d\xe6\x9a\xd3\xf9\x75\x76\x86\x7f\x2b\x73\xdd\x7f\xaa\x18\x00\x87\x16\x29\x6c\x41\xe4\xbd\xea\x2c\x23\x34\x09\x52\x04\x3a\xac\x8a\xa3\xab\x82\x1a\x6e\x8b\x34\x89\x04\xc2\xe3\xf2\xec\x3f\x97\x4c\x67\xcd\x67\x87\x35\x1a\x0f\x42\x92\xe8\xd0\xa3\xa0\xb0\x22\xd8\x71\x5a\xf8\xe2\xf8\xf1\x43\xa7\x44\xd9\xfa\x82\xf6\x40\x5d\x66\x15\x46\xe2\xfa\x2d\x84\x4a\x61\xc0\xa6\x26\xcb\x02\xaa\xec\x32\xac\x8e\x62\x84\x6a\xa5\xd1\x26\x28\xe0\x7d\xd9\x71\x8b\xcc\xee\x7a\x54\x03\x47\x96\xd2\x53\x01\xa7\xb2\xdd\x66\x96\xc3\xef\x02\x89\x55\x63\xb7\x93\xf8\x87\xdf\xfd\x96\x65\x55\x40\x85\xe5\x08\x16\xe3\x03\x43\xf6\x72\x1f\xb2\x6a\xaf\x4f\xad\x5b\x25\x5b\x9b\x60\xb2\x0f\x22\x15\x32\x1f\xe4\xd9\x56\x0e\x8a\xd5\x36\x71\xc0\xdc\x45\x99\xeb\xc5\xf9\x5c\x81\xca\xf0\xca\x67\x64\xd9\xc9\xba\x5e\x29\x87\xc8\x17\x25\x9f\x6d\xf4\x6e\x29\xce\xeb\x62\xd1\x34\x25\x8c\xfd\x15\x46\x18\x61\x29\x42\xdd\x00\x25\x75\x9c\x27\x4a\x99\x6f\x0d\x2d\xd2\x0f\xd5\x8f\x33\x35\xd2\x95\x98\xb1\x7b\x18\x81\x14\xc5\xa2\x65\xa6\xc7\xa0\x66\xd7\x4e\xb5\x41\x48\x10\xb2\x66\x1d\x6e\x5f\x9e\x17\xfb\xf5\xe6\xe9\x10\xb8\x87\x67\x8c\xdb\xb0\x86\x2d\xb7\x2e\x46\x31\xc9\xb6\x39\x0d\x30\xa3\xe5\x22\x05\x56\x34\x75\xfc\x04\x01\x4b\x95\xb3\x82\x0f\x22\xcf\x0f\xe8\x94\x64\xcd\x67\x31\x79\xef\x90\xd3\x18\xc6\x91\x8d\x79\xc2\x93\xbf\x72\xf9\xff\x3f\xfe\xeb\x1e\x23\x22\x8c\x87\xbe\x08\xbb\x11\x87\x68\xf2\x98\x51\xc2\x51\x12\xeb\x3f\x17\x91\x67\x26\x83\x7a\x51\x77\xfb\xfc\x8d\xc8\xf3\xb2\xf9\x6d\x34\xc0\x11\x44\x18\x94\xb3\x46\x6b\xa7\x68\x58\x5b\xba\x7d\xd7\x89\x13\x9e\xc6\x5d\xa7\x79\x59\x88\x76\xca\x0e\xf7\x15\xc6\x03\x48\x2c\x5d\x59\x6b\x52\x65\x8e\x61\x6b\x7c\xd6\x30\x2e\x08\x26\x14\xec\xd2\x40\xf1\xae\x83\x98\x58\x05\xc3\x23\x84\xc5\x31\x60\xe9\xde\xfd\x8f\xfb\xbb\xed\xc3\xcb\xee\xeb\x10\x78\xdb\x59\x5b\x29\xa1\xd5\xfe\xdb\x83\x05\x01\xfd\xdd\x80\x4c\x77\x83\xd8\xe3\x24\xbd\xb9\x36\x5c\xd9\x2c\x76\x25\xf1\xcb\x8d\x4b\xa3\x31\xc2\x12\x9a\xa6\x04\x23\x67\x16\x8e\x8a\x41\x27\x8b\x5f\xfb\x6a\x8a\x8c\x1e\x3a\x09\xb4\xb0\xd1\x2e\xdc\xdf\xfc\x4e\xb8\xda\x7f\x9b\xb7\x93\x58\xca\x08\xfa\x79\x77\xbb\xbd\x7f\x86\x14\xa2\xd4\x9b\x99\xa5\x9e\xe1\x97\x66\x84\x89\xd0\x22\x4a\xf3\xec\x94\x59\x56\x05\x7f\xb5\xe0\x56\xa2\xeb\xe9\xee\x9f\x03\x47\x82\x09\x15\x60\xf0\xd2\x27\xb9\x87\x2c\x0b\x93\x6f\x2f\x93\x18\x73\x95\x1e\x59\xb1\x2f\x3b\x36\xbb\x76\x8f\x2d\xab\x2f\x88\xbc\xdb\x4b\x65\x80\xae\xc0\xef\x7b\x74\x81\x54\x87\xdf\x6b\xdb\x54\x0c\x71\xc7\x27\x02\xd5\x4f\x91\x2f\x4b\x30\x26\xc3\xca\xb1\x81\x35\xfe\xf7\xd6\x92\x0a\x69\xe0\xea\xcf\x9e\x32\xf5\x86\x44\xb1\x97\x39\x7b\x98\x29\x41\x3a\x05\x21\xf1\x59\x95\x79\x3e\x6b\x81\x30\x1d\x51\x84\x9c\xef\xf6\xcf\xfb\xfd\xc0\xdd\x62\x9a\x83\x30\xc3\x34\x5c\x59\xd5\x57\x40\x62\x46\x18\x04\x29\x0b\x3b\x52\x19\xb7\xd3\x4f\xba\x28\x88\xc3\x2e\x19\x63\xa1\xb9\xe3\x35\x6d\x40\x22\x51\x20\x26\xaa\xd8\xc1\x5a\xfc\xf7\xa2\x7e\x69\xed\x59\x4a\x08\xa6\xad\xfc\x12\x0c\x48\xcc\xad\xaf\x52\x96\xf9\xba\x9b\xc6\x01\x31\x31\xda\x24\xc5\xe5\x74\x28\xe5\xbf\xc1\x8b\xbf\x33\x12\xb0\x20\xe6\x81\x23\x67\x87\xca\x94\xd5\x09\xc3\xb0\xd7\x54\x19\xc9\xd5\xff\xa7\x7c\x70\xb0\x05\x8c\x3b\x92\xa1\xf2\x52\xe8\xcd\xb9\xb3\x07\x82\x20\xe4\xc8\x92\x60\x79\x9c\xbe\xfa\x9c\xff\x73\x25\x7e\xfc\xb5\x87\x18\x04\x69\x92\xba\xaa\xbb\xfb\x2a\xf3\x95\x77\xa3\xcf\x17\x04\x3a\x45\xa0\x4e\xfd\x9e\x35\xea\x75\x5f\xde\x7a\xef\xa7\xf5\xf5\xda\x75\x34\xfa\x12\x41\xa0\x21\x0c\x3a\xe1\x17\x24\xe9\xb4\xbb\xc4\x5f\xcd\xbf\xf9\xf9\x18\x44\xcc\x72\xd8\x23\xb7\x96\x2f\xd6\xf7\x6d\x9a\x4b\xe7\x5e\x38\xf7\x00\x2b\xb2\x86\x9c\xda\xae\x27\x0f\x03\xc2\xbb\x1c\xc3\x43\x56\xbc\x81\xb6\x5b\xf6\x40\xa9\xde\xf7\x05\x4b\x11\xd0\x4b\xa2\x5c\x25\x52\xfb\xc7\x8b\x23\x9e\x7a\x4d\x52\xaf\xb7\xe3\x9b\x8c\x92\x43\xfc\x4b\x9f\x6a\x9e\xdc\x23\xd1\xd4\x1b\x1b\x78\x1c\x3c\x66\x05\xaa\x2e\xca\x5f\x72\x22\xb5\x17\x02\xc3\x3a\x93\x8e\xc8\xed\x41\xd4\xdd\xe0\x24\x90\x20\xdd\xcd\x29\xfb\xb8\x2b\xab\xd3\x25\xf7\x26\x50\x90\x32\xca\x89\x9f\x61\x74\x57\xe6\xba\x6b\xe1\x4e\xe4\x45\x18\x98\xa5\x2e\xc4\x3e\xb1\xb0\x81\xd5\xdb\x0c\xc6\x66\x73\x90\x26\x91\x76\x47\xc3\x0f\x80\xb7\xfc\xd3\xeb\xd8\x8e\xa7\x54\x9a\xa4\x88\x51\x10\x32\x1b\x6b\xb8\x62\x9b\x4c\x02\xb7\x92\xb7\x15\x9c\x45\xa6\x57\xcd\xeb\xfe\x1d\x06\xa7\xeb\x9c\xaf\x19\xa4\x32\x48\x6c\xd1\xcd\x37\x51\xbf\xee\xb2\x63\x01\x7a\x7a\x6f\x9d\x1a\xdd\xc7\xa6\xb1\xba\xfa\xcb\xe0\x1c\x23\x81\x08\x2c\xfb\x71\xa6\xca\x03\xda\xcb\xda\x27\x0b\xda\xc6\x38\x35\xb6\xd0\xa2\x29\x8d\x19\xe3\xda\xdb\x66\x99\x20\x01\x8b\x8b\x2c\x6f\xaa\xec\x98\x15\x22\xbf\x81\xee\x03\x49\x16\x60\x91\xbe\x43\x36\x59\xba\xac\x89\x87\x13\x28\x12\x20\xb2\xac\x3d\x73\x4c\x9e\x75\xb7\x57\x12\x90\xdc\x03\x83\xc9\xdb\x2f\x24\x10\x7c\x38\x2c\xd0\x81\x95\x61\x6c\x77\xd0\x4a\x43\x75\x33\x23\x80\xef\xbb\x0a\x85\xb1\x3c\x27\xa3\xe2\x04\xb1\xfc\xcf\x02\xd1\x18\x21\xdb\x5d\xce\x72\xe8\xac\x04\x10\x30\xac\xb0\x3e\x96\xb9\x5e\x9b\xbb\x91\x96\xa1\xeb\x62\x84\xb0\x5a\x78\x02\xd5\x79\x9b\xab\x76\x19\xf9\x12\xe0\x21\x6f\xd9\x2c\xb2\x6b\xf2\xa1\x0c\x28\x3c\x62\x1e\xca\xe3\x5f\x45\xa7\x47\xe7\x7d\x48\x48\x8a\xd1\x0e\x9f\x45\xbb\x2b\x2b\x3c\x31\x7b\x3d\xc0\xde\x92\x9b\x6c\x9e\x21\x49\x25\x56\x33\xdb\xfc\x80\x03\x4c\xcf\x00\x94\x19\x09\x69\x44\x11\xd8\xd4\x21\x1f\xb6\x13\xc5\xd7\xd1\x48\x84\x54\xa6\x69\xec\x73\x17\xd9\x7f\xc1\x4b\xdb\xfc\x76\x2d\x8b\xcc\x48\xc8\x98\x0d\x37\xd6\xd0\x2c\x2e\x8d\xd3\x34\xbc\xf9\x1c\xa9\xf7\x0c\x0e\x98\x90\x85\xb6\xb0\x21\x07\xf1\x13\xb0\x06\x7b\xfc\xb0\xcc\x91\x63\xd8\x3d\xef\x65\xc8\x27\x3c\xee\x07\x91\xea\xd9\x3d\x7b\x66\x93\xf1\xd3\x05\x2c\x89\xb4\x57\xae\xec\xf8\x48\xfd\xb1\x19\x86\x92\xa1\x10\x07\x7c\x28\x00\x5d\xb7\x73\x6d\x39\x46\xad\x33\x12\x46\x2c\xc2\x7d\xee\x74\xc9\x59\xc4\xfd\xa5\x9c\x58\xc1\xce\xe2\x58\xfd\xd7\xa3\x16\x7d\x5b\x0c\x21\x9a\x16\x9e\xe7\x07\x49\x3e\x9b\x2f\xf2\x37\x8c\x84\x89\xb2\xa0\x9b\xac\xb0\x3c\x4b\xe3\x77\x48\xc0\xea\x77\x6f\xc5\x67\x6b\x12\x8e\x7e\x29\x8d\x42\x6f\x05\xdd\x54\x00\x3a\x2b\x8e\x8e\xc7\xe3\x17\xf8\x73\x46\x42\x91\x24\x2a\xb2\x99\x97\x1e\xe2\x34\xda\x4d\xdb\xa1\xc1\xd0\xc8\xe2\xfb\x62\xfd\xb0\xb8\x79\x58\x59\x9e\xe4\xe0\x60\x65\x62\xfd\x13\x48\x6e\xed\xca\xe2\xe2\xd9\xc3\x56\xad\xf7\x0f\x93\x5d\x37\xd4\x81\xe6\x91\x47\xf7\x5f\x8a\xc6\x22\xc0\xea\x8d\x99\x99\x03\xc0\xe3\xd0\xa2\xf1\xdf\x45\xa5\xe7\x23\xb1\xa3\x2b\x22\xa2\x18\x9e\xd3\x0e\x7f\x7c\x57\x5e\xaa\xe6\xd5\x43\x0a\x19\x89\x68\x48\x54\xec\xf3\x86\xe8\x73\xa2\x08\x6f\x9f\x03\xc3\x3e\x56\xdf\xae\x79\xc3\x5e\xfe\xcf\x8c\x39\x75\x68\x2b\x9a\x6c\x25\x7f\xe6\x3f\x64\xc4\x02\x8d\x78\x24\x54\x5a\xec\x06\x16\x19\x5b\xb3\x13\x94\x97\x61\xf6\x21\xf9\x1f\xd6\xf9\x67\xe3\xff\xf4\x37\xd3\x40\x79\x47\xcc\x6c\x05\xb9\xca\x4b\xc7\xb3\x3d\x1e\xb3\x28\x70\xb5\x0a\x36\x57\xf4\x98\xb5\xdb\xf9\x36\x17\xe3\x0a\x1d\x3a\xf1\xa6\xa2\x80\x13\xe8\x28\xfb\xba\x22\x53\x1e\x4e\xde\x2b\x00\x8e\x0e\x54\x73\xa9\x8a\x8d\x31\x9b\x4a\x28\x74\xb7\x5d\x73\x18\x12\x4a\xc6\xd5\x4f\x77\x65\x65\x13\x1f\x7d\xcd\xfc\x98\x2d\xa4\xbd\x2c\x16\x21\x1b\xd4\x26\xdc\x8a\x0c\xeb\x46\xfd\xe6\xfb\x1d\x79\x5a\x2d\xd8\x76\x02\x9c\x6e\xaf\x96\xd6\x93\xb4\xb6\xf4\xfc\x3c\x8f\x22\xc5\xf0\xe8\xd9\x41\xa5\x5e\x5f\x6a\xa8\xa6\x3c\x2a\x93\xfe\x9c\x0b\x48\x9c\x41\xf5\x58\x16\x08\xc7\xce\x45\x5d\xef\xb2\x06\x76\xdd\xe1\x19\x71\x21\x31\x81\xf3\x04\xef\x4f\xa5\xb6\xfb\x29\x1a\x1b\xd5\x28\xba\x1a\xc5\xcc\x52\xdc\x59\x7b\xc0\x85\xaf\x71\xf4\xe0\xb7\xbf\x64\x2c\x6c\xaf\x0f\x08\x9a\x0c\xbb\xd5\xc3\x83\xff\xed\x38\x64\x88\x28\xf0\x86\xdd\x48\x85\x6f\xf2\x3a\x49\x40\x70\xe7\x6f\x1d\x78\xbf\x8d\x5b\x1f\x67\x36\xa6\x18\xa5\x8c\xa0\xd0\xce\x37\xf8\x1c\x6e\x33\x51\xaa\x22\x4b\x70\xef\x24\xc3\x37\xa8\xd6\x50\x8f\x38\x7a\x18\x89\x24\x4d\xd1\x37\x7f\x15\x75\x17\x03\x1c\x03\x6e\xda\x4e\x69\x40\x1d\xd1\xa9\x1d\x89\x09\xf5\x6d\xdb\x45\x50\x34\xa6\x6e\x77\xbf\x77\xaf\xad\x58\x82\x91\x54\xff\xda\xfb\x59\xb0\x64\xdb\x31\x56\x26\xf2\xcc\x04\x4b\x28\x9a\x4b\x75\x15\x87\x8c\x54\x6a\x85\x78\xdf\xfd\xed\x35\x21\xdc\x32\x7a\xc0\x5e\xbc\xc1\xea\xc3\x79\xc4\xbe\x99\x2b\x7c\x22\x5f\xc2\xb0\x3a\x1e\x87\x2b\xc5\xfb\x79\x91\x56\x04\xe3\x97\xe7\xb2\xf4\xfe\xe8\x52\x9c\xf7\x19\x54\xd4\xdf\x0a\x08\x30\xee\x33\x0b\x50\xd5\xcb\x3c\x33\xc6\x37\x9a\x40\x46\xc9\x88\x7c\xbc\xb5\xb0\x96\x97\x89\xd1\xce\x89\xa0\x91\xa3\x8f\x39\xfb\x0d\x8c\x53\x12\x63\x11\x93\x06\xd1\xbc\x62\x28\x4a\xb0\xae\x2d\x8c\x10\x60\xff\xed\xdb\xed\xf0\xcb\x72\x46\x0c\xd2\x30\x94\x5e\xb1\x7b\x55\xe8\xd1\x1c\xe6\x2c\x49\x30\xa0\xa2\xe1\x9c\x97\x9f\x18\x01\x70\x65\x3e\xbe\x03\x84\x91\x3b\x83\x6e\xb3\x0a\x94\xa7\x4a\xda\xbf\x56\x50\xbf\xb6\xf6\xfd\xf8\xd9\x03\x6a\x75\xb1\x2f\xc5\xc0\x93\xbe\xb6\x70\x78\xc0\x53\x34\x3e\x17\xcd\x6b\x0e\x43\x74\x1a\x23\x3c\xe4\xf6\x4c\x3c\xa0\x40\x3f\x12\x92\x0e\x93\x14\x3c\x8c\x01\x83\x9e\x58\x5c\x5f\x88\xdc\x71\xa1\xfa\xe6\x88\xea\xc8\xf2\x52\x0c\x0a\xaf\xc6\xe7\xcc\x97\x96\x17\x6f\x8f\xdc\x18\xf3\x96\x0d\x66\x75\xbf\xd3\xee\xb6\xa1\xb5\x49\x6e\xd7\x8b\xc7\xcd\xd3\xad\xff\x33\x27\xf1\x00\x07\xb9\x14\xc5\x1d\x34\xea\xf5\xb7\x7e\x27\xe4\x71\x64\x39\x8c\x5f\x3f\xcf\x58\xea\x09\x95\xf1\x64\x31\x6d\xab\x4a\x90\xf4\x7e\xcc\x74\x71\x57\x95\xa7\x2e\x84\xf3\xcb\xb4\x1d\x4f\x92\x08\x31\x8a\xb5\xc8\x61\x3d\xc9\x74\xf0\x24\xb5\x0a\xa5\xee\xe8\x74\x40\x15\xd7\x98\x06\x09\x62\xdf\x51\xc1\xce\xe1\x00\x86\xa5\xfb\x33\xc3\x93\x86\x1a\xa9\x8b\x84\xd6\xa8\x03\x3b\xf1\xe8\x79\xaa\x01\x99\xf6\xf6\x65\x21\xf2\x7f\x5c\x44\xd1\x5c\x4e\xdd\xcf\x19\xce\xd5\x50\xf8\xae\x7e\x2a\x9b\x55\xa1\x41\xaf\x8b\x85\xfe\x89\x31\x8d\xae\xab\xc2\xbd\x06\x3e\x54\x7e\xd1\xb0\x38\x49\x51\xd7\x42\x97\xd5\xac\xc2\x29\x23\x5c\x84\xa1\x09\x3a\xf5\xa0\xdf\x66\x0c\x79\x2e\x79\x28\x43\x1f\x2a\x17\x0d\x3c\x75\x3a\x45\xf4\x8b\x00\x01\x57\x46\x63\x74\x48\xe5\x20\x0a\x5f\x50\xde\xc5\x89\x26\xfe\x14\xd7\x84\xb2\xc8\x1f\x94\x76\x1f\x2b\x10\x51\xd8\xce\xc3\xd1\xc7\x4b\xfc\x15\xd4\x68\x87\xab\x7c\x84\xa3\x98\x8d\x71\x71\x1d\xf2\xc4\x22\x03\x33\xe5\x8e\x97\x7e\x12\xcd\x1e\x74\x1c\x54\x2c\xa8\xff\xb0\xad\xb7\x7b\x55\xb1\xfd\xe5\x17\x8e\x09\x4d\x11\xd6\xea\xb8\xce\x5a\x2b\xc3\x94\xd5\xc9\xbf\x51\x67\x3a\xc5\x24\x0e\x11\x0a\xf3\x4f\xa8\xca\x1b\xe8\x82\x03\x31\x49\x25\x42\xb1\xff\x2d\xd4\xdb\xb9\x6c\xb6\xe2\xe2\x79\xef\xdb\x46\xc9\xf1\x8d\x3d\xbd\xfa\xb6\x13\x3e\x64\x24\xa6\xa1\x41\xbf\xb6\x86\x66\x07\xb9\x41\xcc\xe8\x45\x35\x37\x50\x80\xc9\x54\x26\xc6\x88\x53\x46\x62\x16\x84\x58\xff\xf8\x08\xe5\xfb\x70\x07\x89\x59\xc2\x03\x8f\x4b\x7b\xdc\x4c\xaf\x4a\x6d\x18\xa0\x8b\x36\xc1\xcd\xa5\x69\xca\x62\x5d\x20\x1d\xa5\xef\xa5\x34\x7a\xc1\x4f\xf0\x5e\x77\x08\x20\x46\xe2\x80\x27\xa8\x51\x8c\x4e\xfb\x0e\xb0\x18\x76\xde\x60\x8c\xc3\x88\x23\x8e\x72\x69\xab\xdc\x7a\x21\xa5\xb9\x48\x7b\x1c\x2a\x7b\x0a\x3d\x66\x6f\xe3\x2a\x22\x46\xe2\x88\x25\x08\x93\x6a\xb7\x84\xb2\xfb\x23\x00\xda\x48\xe8\xca\xe1\x5a\xcb\x9a\x0c\xfc\x81\x11\xf3\x04\x20\xe9\xf5\x4b\xcb\x5a\xe4\x6b\xbf\x6b\xc5\x31\x51\xe8\xc4\xdc\x3f\xbf\x0c\x42\xce\x71\x1a\x12\xf4\xcf\x6c\x9e\x73\x10\x90\xeb\x86\x25\x4d\x39\xb1\xb1\x87\xe2\x27\x54\xcd\xad\x65\xa8\x1c\xaf\x84\x38\x35\x12\x91\xc0\x75\x6b\x19\x55\x93\x75\x12\x0b\xae\x10\x11\xde\x1d\x83\x2e\x14\xf6\x3d\xab\x2e\x93\xc9\x1f\x0b\xae\x91\x0c\x67\x7f\x79\xbb\xb9\x78\xac\x41\x2c\xa4\xc0\x75\xf9\x68\x39\x08\xbb\x3f\x2b\x89\x21\xa6\x43\x77\xe7\x67\xf8\xcf\x25\xab\x1c\x85\x91\x87\xaf\xce\x7f\x2c\x99\xa4\xf8\xbd\xbd\x11\xf0\xe0\x99\x8e\xda\x36\x6d\x2b\xcb\xd1\xad\xf0\x41\x00\xdf\x06\x32\xf2\x4c\xfe\xa2\x81\xb5\x2a\xdb\xa5\x82\x55\x8b\xbe\x8b\xe2\xa1\xb1\xaa\x01\xb6\x58\x67\xf2\x8e\x4a\xc6\xd6\xc0\xae\x44\xd1\x25\xd0\xaf\x99\x1d\x19\x89\x81\x87\xb8\x36\xcf\x19\xdc\xcc\xd0\x5b\x31\x12\x9b\xd0\x04\xee\xf3\xfc\x52\xba\x92\x91\x84\xe8\x04\x01\x1b\xab\xef\xfb\xe5\xfe\xe1\x17\xb1\xaa\x84\x06\x14\xb3\xad\x1a\x3c\x61\xc1\xd8\x9b\x4c\xa8\x63\xcb\xeb\x8d\xe8\x24\xa0\x09\x96\x90\x21\x2e\xf5\x30\xca\x9b\x27\x01\x63\xd4\x45\x15\x36\xe7\x6b\x76\x24\xec\x61\x85\x50\x16\x4d\x95\x89\xea\xed\xaf\x4a\xa1\xdb\x2b\x42\x40\x8c\xe3\x42\x6b\xe7\x7c\xce\xef\x8d\x49\x10\x41\xa2\x7a\x26\x0c\xff\x57\x15\x23\x57\xea\xe1\xb5\xdd\xac\x57\xc7\xe3\x64\x60\x93\x40\x49\xed\x8c\x64\xb5\xb0\x6a\x39\x7f\x6d\x4d\x20\xc5\xa4\x71\x71\xa9\x3b\xc8\xfd\xde\x99\x44\x0e\x99\x53\x43\xb3\xaa\x94\x8b\x14\xd6\x73\x2a\xdf\x6d\x67\x63\x25\x39\x3d\x86\xa2\xd0\xa3\x34\xef\xe0\x40\x49\xb8\xd0\x18\x7e\x7d\xcc\xe0\xfd\xbe\x0f\xbe\x26\x31\xb5\xea\xbd\x77\x65\x05\x4a\xa0\x23\x7f\x27\x54\x53\x4e\x77\xd4\x24\x09\x12\x95\xf8\x3d\x65\x0b\xd5\x0f\xe1\xf3\xd6\x49\x12\x69\x5b\xdc\x70\xbf\x22\x6c\xf9\xcd\xff\x39\x25\x21\x1a\xdb\xb8\x1f\xb6\xc7\x5d\xd7\x10\x33\x3c\x6f\xb7\xa2\x6a\x32\x91\x3b\xbb\xf1\xab\x0a\xaf\xc9\x94\x4b\x35\xb1\xc1\xc0\x77\xa1\x5e\x5f\x55\x99\x4d\x6c\xfc\x44\x90\x34\xed\xf3\xa8\x7f\x64\x4d\xf3\x65\xda\x62\x3e\xd7\x98\x88\x14\xd0\x38\x6e\xde\x41\xbc\xf5\xf4\xe0\xdd\xb2\x4d\x84\x21\xa9\x13\xd2\x59\xb7\x2e\xef\x5b\xbb\xd3\x0f\x26\xa9\x24\x09\xe9\xf5\x26\xad\x4a\xcd\x55\x35\x65\xdb\x2f\xb0\xc2\xd3\x05\x7c\xcc\x72\x77\xb7\x5d\x62\x1b\xe9\x59\x1c\xab\x0c\x19\x34\x30\xe4\xf7\xd1\x4d\x4f\x45\x09\xae\x98\x9b\x87\xcd\xf2\x8f\xc3\xcd\x62\xb7\x5e\x1e\xb6\xcf\xeb\xe5\xaa\xeb\x90\xd8\x5c\x01\x2a\xa6\x7d\x09\x82\xf4\x9d\x45\x8c\x77\x6b\x4f\xaf\xf5\xf6\x7e\xf2\xb8\xda\x74\x9c\xf5\xe8\x4d\xce\x15\xfe\x33\x92\x00\x55\xc8\x46\xfb\x5e\x65\x18\xa1\xd4\xd9\xc8\x26\x1a\xaf\x4e\x48\x52\x2b\xd7\xd6\xdc\x5d\x8a\x49\xaa\x25\x01\x29\xd0\x3e\x3e\x74\x89\xce\x5f\xc2\x83\x12\x90\x06\xc7\x33\x3f\xdf\x64\xda\x86\x11\xdc\xad\x52\x12\x6b\x3c\x78\xd0\x91\x59\xe6\x5e\x64\xad\x6d\x49\x43\x8b\xd9\xb6\xba\x8f\x93\x25\x3c\x16\xb9\xc2\xee\x06\xc9\x0f\x94\xcf\xe5\x8f\xb8\x48\xda\x0e\x92\x08\x04\xc6\xa3\x54\xc2\xfb\xb6\xca\x7e\x66\x39\x1c\x3b\x4b\x27\x25\xca\x20\xac\x4d\x95\x45\x7d\xc9\x9b\x49\xed\x84\xef\xa4\x2d\xdd\x41\x5e\x96\x6f\x97\xf3\xcd\xe7\xb6\x2a\xff\x0d\x6a\x32\x81\x52\xa2\x13\xc4\x19\xb6\x9b\xc3\xdb\x46\xeb\x69\xb3\x09\x10\xcd\x96\x43\xf3\xea\xd4\x18\x17\xcd\xb7\xac\xa9\x1f\x40\x74\x8f\x43\x79\x88\xa8\xa3\x83\x63\x01\xbf\x0a\x95\xcc\x4e\xcc\x94\xc6\x29\x42\x5a\x8e\x79\x29\x45\x0e\x83\xac\x75\x4a\x0d\xc3\xd8\xf0\x7a\xb9\x29\x7f\x42\xb5\xcf\x50\xd9\xb3\xcb\x52\xa4\x2c\x8d\x49\xa7\xba\xec\x0c\x09\xdf\x16\x12\x2b\x67\x21\x1b\x35\x08\x09\x39\x3b\x69\xf2\x7a\x21\xa4\xb8\xf3\x16\xf0\xfe\x7b\x29\xe7\xb8\x63\x18\x49\x23\x1e\x20\xd8\xbe\xce\x33\x05\x6c\xce\xfe\x4f\x23\xc3\x90\xdf\x08\x0a\xdd\x43\xca\x5c\x1b\x8f\x58\x14\x0d\xe6\x7c\xf7\xf7\x44\x3b\xb9\xcc\x77\x51\xe9\x6f\x59\x7b\x32\x7f\xda\xb2\x82\x31\xe9\x56\xdb\x57\xc6\x3c\xf1\x31\xd0\xb1\x2e\x75\xdb\xaa\x52\xf4\xfd\xef\x57\xff\x9c\xcc\x3d\xdf\xc1\xd8\x60\x56\x2f\x9b\x51\x77\x92\x28\x5f\xba\xd1\x69\xac\x35\x09\xbd\x28\x55\x03\x75\xb3\xb8\x34\xaf\x65\x95\xfd\x17\x29\xc6\x5c\x9e\x61\x3c\x0e\x31\x44\x08\x6f\xc4\xd0\x92\x14\xc5\xdb\xd0\xd2\x4c\x93\xd8\xe2\xad\xdb\x05\xe4\x84\x0e\x50\x85\xb0\x6b\x06\x1e\x4e\xcb\x5b\xe7\xcd\x86\x34\x81\x00\xf1\x5c\x0f\xe5\xf1\xa6\x2c\x8b\x4e\x02\xeb\x6f\x01\x5b\xd3\x34\x0d\x31\xe4\x89\x54\x67\x9b\x2e\x0c\x95\x8a\xc8\x0a\x64\x22\x14\x7c\x77\x39\x2d\x06\xbc\x6e\x57\xb7\x9e\xbd\xb3\x90\x31\x5a\x2b\xde\x98\xf1\xaa\x8f\x93\x0f\x22\x63\x82\xc6\xd6\x72\xf1\xf0\x70\xff\x17\xe5\x9f\x6d\xf7\x84\x28\x17\xa4\xfe\x99\x95\x97\xba\x6e\xc4\x11\xf2\xb2\xee\x17\x8c\x94\x56\xe6\x7e\xd5\xbc\xc2\xc7\x97\x39\xa4\xf1\xb3\x2a\x65\x99\xb3\xdb\x33\xa6\x80\xbc\x53\xf0\xb3\xf9\xc0\x61\x22\x2e\x05\xa9\xd0\x32\xcf\xea\xad\xc8\xba\x75\x6f\x02\x85\xe7\xe4\xe3\xfa\x69\xfd\xb8\x78\x38\x6c\x17\xcf\xfb\xf5\x72\xbd\x45\x5c\x97\xeb\x24\x08\x09\xa3\x76\x4c\x77\x8b\x87\xd5\x61\xf5\x74\x7b\xd8\xaf\x1f\x57\x5d\x23\x65\x88\x86\x5b\x2f\x37\x3e\x3e\xee\x5b\x52\x0d\x0a\xd1\x38\x8f\x8f\xe3\xc4\x81\xa0\x3c\x91\xb6\xf8\x25\x2b\xea\xad\x95\x67\xf2\x4d\xb1\x64\xd6\x9a\xfc\x18\x30\x89\x30\x22\x98\xa4\xe8\x38\x9a\xb2\x7a\xdb\xbf\x66\x7e\xe9\x88\x20\x8d\x6c\x89\xc6\xe7\x1e\x6a\x54\xbd\x1c\xce\x58\x11\x42\x82\x24\x53\x87\xd6\x4b\xaf\x3c\xa3\xfa\x2d\xe4\x70\x14\xcd\x97\x11\x03\xc1\x89\xb0\x3c\x29\xe8\x1a\x5c\xaa\x3e\xbe\x24\xe2\xc0\x2a\x9e\x62\xda\xdf\x21\x2e\xfa\xbc\x92\x88\x25\xc3\x6f\x72\x68\xdd\x76\x9b\x4f\x6f\x1d\xac\xf1\x32\x13\xb1\x8e\xac\xd6\x27\x14\x7a\x8c\x72\x19\x17\xc3\xbb\xee\x69\x2a\xb5\xe5\xec\x3a\x9d\x73\x94\x1f\x1d\x3f\xae\x50\x16\x59\x77\x84\xa6\x6e\xca\xf3\x75\xa4\x4e\x48\x41\xf0\xc0\xa9\x5e\xcb\xee\x4f\x26\xa4\xce\x36\x3b\x62\xda\xa4\x4f\x9a\x08\x25\x15\x7a\xc1\x7d\xc8\xd5\xc7\x9d\x5a\xff\xe5\xda\x57\xfd\x8b\xf9\x7a\xf5\xef\xf0\xe5\x74\x90\x20\x84\xe6\xa7\xcd\x21\xe1\x11\xd5\xa3\x87\xb6\x15\xa8\x9e\x97\xac\xed\x9e\x88\xc4\x95\xc3\xed\x41\x38\x92\x48\x5f\x2a\x30\x1e\x65\x60\x5d\xa9\x80\x2b\xaa\x1d\x48\xd0\xba\x3e\x86\x24\x78\x36\x1c\xce\xe2\x73\x2b\x3e\xe1\x2a\x3e\xfe\x7f\x27\xfd\x19\x09\xd9\x80\x3d\x71\x0b\xd5\x54\x05\x85\x11\x49\x58\x80\x96\xb2\xce\x6a\xf1\xb3\xf4\xa1\x66\x49\xa2\x28\x74\x80\xf3\xf2\xd2\x9d\xfa\xbe\x31\x0e\x11\x7f\x83\xb6\x32\xad\x2d\xe9\x4e\xd7\x98\x72\xf4\xf1\xcf\xab\xbf\x07\xa7\x92\x04\x04\xba\x95\xdb\xf2\xc7\xb7\xf0\xb6\xbb\x8d\xf1\x94\x71\xcd\x3d\x1e\xda\x58\x79\x7a\x55\xa6\xfa\xbf\xfa\xd7\x1f\xb3\x92\x4a\xe2\x4b\x98\x76\xcd\x45\x59\xc9\x97\xd9\x51\x94\x54\x13\xf4\x5a\xf6\x8b\xc5\xee\xf0\x7d\xf1\xf2\xe0\xc1\x72\x92\xc5\x96\x6c\xb3\x76\xd5\x66\x28\xaa\xdd\xdb\xd5\x92\x25\x42\xbb\xaa\xc6\xf5\xf6\x6e\xf7\xad\x0f\xbe\x48\x26\xac\xf8\x80\x3d\xe5\xba\xbf\xea\x14\x31\x98\x0f\x88\x66\xbe\x85\x53\xa9\x2a\xa1\x3e\x9f\x2f\x83\xf4\xc3\xbc\x9c\x29\x23\x32\x70\x2a\xdd\xeb\xc2\x64\x45\xf6\x31\x82\x24\xcb\x30\xa0\x48\x17\xa5\x1d\x48\xfc\x76\x20\x3c\xde\x36\x87\x92\xf9\xc3\xb2\xf3\xb6\x07\x6f\x12\x46\x31\x62\x58\x8b\xcb\x09\xe7\x7c\x17\x9c\x91\x28\x63\xe8\x52\xbb\xf2\x5a\xbe\x99\x11\x19\xd1\xd4\x53\xae\xdd\x88\xaa\xca\xa0\x5a\xd4\x08\xd9\x1a\xdc\x9f\x47\x4c\x3a\x36\xab\xac\x00\xed\xf9\x83\xba\x5f\x89\xc3\x04\xab\xc7\x9e\x57\xf7\x2f\x0f\x8b\xe7\xc3\xfe\xcf\xed\x2a\xe8\x1a\x15\x20\xdb\xef\x33\xfb\x67\x33\xd8\x4f\xa5\x88\x24\xfa\x90\x59\x81\xa9\xb7\x2b\xf7\x41\x0a\x65\xd0\xb5\x17\x5a\xdf\x96\x6a\xfc\xd4\x92\x00\x22\x57\x4a\x87\x49\xc1\x8f\x37\x1e\x70\xc9\x12\x4c\x71\xc9\xcb\x67\x74\x4d\xdb\x31\x2a\x5b\xbe\x02\x3c\x5e\x3b\x33\x52\x32\xa1\xbd\xa4\xbd\x2d\x4e\x1d\x8a\xe3\xcc\x04\x17\xa4\x0a\x43\x1f\xa7\xfd\x56\x76\x71\x4b\xa9\x24\x20\x54\x0a\x01\xff\xb8\xe7\x8c\x18\xbf\x47\xdb\xb1\xd4\x24\x74\x1a\xe8\x35\x34\x0e\xeb\x3a\x59\xec\x3a\xb4\x24\xe7\xb8\xb9\x42\xeb\x03\x57\x9f\x0b\x0b\x1f\x9c\x98\x64\xd2\x10\x85\xd3\xfa\x16\x2a\x64\x1e\x9a\xb4\x32\x13\xfa\xf3\xe6\x0a\x3c\x32\x57\xd1\xdc\x5e\x93\xda\x22\xab\x32\xd7\x3b\x80\x7c\x74\x62\x4a\x23\x52\x4c\x39\xc8\xb2\x7c\xb3\xd1\x04\xf5\x0c\x27\x61\xb3\xca\xb6\x8e\xa8\xeb\xaa\x01\x0f\x95\x9a\x85\xbf\xf5\xaa\x71\x6d\x03\x58\x9a\xe1\x1f\xa2\x51\xaf\x1d\x7f\x17\x23\x8a\x38\xb2\xc2\x23\x34\x3f\xda\x79\x5b\x56\xcb\x57\xa8\x1b\x8b\x4a\x71\x7d\x28\xb3\x1e\xdc\x19\xec\xf2\x5f\x17\x88\x02\x87\xdf\x2f\x43\x6c\xc1\xb5\xb9\xab\x18\x95\xc2\x91\x3a\xf5\xdc\xb0\xc1\x78\xbc\x14\x4b\x24\x32\x3f\xd5\xea\xd5\x85\x67\x47\x63\xa3\x98\x8e\x90\x7c\xbd\x23\x8f\x32\x26\xcb\x33\xd1\xc0\xb6\x6c\xa6\x5d\x4d\x88\x73\x55\x97\x1d\x45\xe2\x3c\x62\x55\x05\x09\xc5\x80\xaa\xca\x9a\xcf\x6d\x59\xe6\xfb\x01\xca\x40\x05\x12\xec\x17\xb4\xd1\x8a\x7f\x95\x27\x99\xcd\xf1\x0d\x32\xa2\xa2\x90\xa5\x96\x1a\xf4\x67\xf9\x36\x81\x01\xa8\x28\xb4\x24\x87\xcf\xcd\xcd\x20\x6a\xab\x3c\xa5\x92\x73\x2c\x16\x77\xfb\x3f\xa2\x47\xf1\xd9\x35\x27\x31\xe6\x64\xb6\xdf\x9e\xba\x3f\xc9\x30\xb5\x7e\x8d\x6a\x7d\x37\x4f\xfb\x8b\xc9\x0a\x9c\xc4\x96\x1b\xf3\x0b\x5a\xca\x71\x3e\xdb\xdf\x12\x2c\xfb\xc3\xaf\xf3\xfd\x3b\x9b\xce\x9b\xbc\x57\xcc\x2c\xd8\xf2\x67\x06\xef\xad\x83\xaa\x2f\x53\x1f\x58\x25\x51\xe2\xc5\xba\xdc\x23\x4e\x29\x51\xda\x4e\x3c\x42\xc4\xcf\xc9\xe9\x1e\xbb\x3f\xa7\x84\xa2\x25\xdf\x17\xd7\x2d\x6f\x6f\xaf\x67\xd9\xe4\x4b\xa4\x81\xe2\xcc\x7b\xdd\x13\x15\xe5\xb6\x59\xc7\x28\x5f\x89\x41\x5d\xc7\xb2\xbc\xd6\xd3\x4e\x26\x88\x1d\x2b\xd7\xcb\xf9\x8a\xb3\x90\x11\x25\x48\xe8\x85\x98\x56\xb5\xaa\xca\xf7\x9b\xeb\x9b\x08\x96\x32\x04\x7f\xbc\xdc\xdd\x0c\xd7\xb1\x12\x9a\xa3\x17\x9d\xd5\xdf\xa1\x6a\x0d\xa8\x87\xf2\x98\xa9\xb9\xfa\xdc\xb6\x33\x08\x54\x9c\xad\x2f\xd5\xb9\xca\x6a\xd8\x8a\x42\x7b\xd8\xa6\x92\x2c\x36\x76\xd6\x61\xbc\xbc\x2b\x99\x69\x8d\x35\x30\x65\x05\xe3\x90\x8d\x92\xb1\x54\x96\x61\xcf\x0e\xf4\x2f\x83\x79\x4a\xf1\x24\x71\x21\xf2\xc5\x4f\xd1\x88\xea\xe6\xb3\xc3\x7f\x0f\x4f\x0f\xa5\x62\x19\xf6\x85\x3b\xb3\x29\x5b\xd7\x53\x33\x1a\xd2\xbe\x82\xef\x01\xd5\xb7\xbb\x4a\x06\xd7\x09\x42\xc5\xf9\x00\xbe\x2e\x7a\x0e\xc7\xb6\x55\x52\x3c\x60\x77\x80\xdc\xe1\x9e\x8d\x74\xfc\x3b\x20\x23\xab\x0f\x56\x89\xa2\xd9\x97\x3b\x68\x5e\x6c\xb1\x97\x1e\xeb\xe1\x0e\xce\x17\x65\x02\x40\x86\xeb\x76\x47\x6d\xa0\x68\xe7\xea\xe1\xe4\xa5\xe3\x19\xd1\x84\x10\xfc\xe6\x2e\x41\x36\x70\xaf\x35\xa1\x02\x0d\x44\x0c\xff\xd5\x0d\xba\x7b\x57\x04\x1a\xc3\xc3\xd2\x5f\xa7\x68\xa0\xbc\x5d\x26\x9a\x4b\xfd\x58\x6a\x47\x8b\x3f\x7a\x1f\x4d\x53\x8a\xa6\x75\xc7\xbe\x86\xf9\xd7\x61\xf1\xb3\x0e\x04\x91\x3d\x0f\xf4\x28\x63\xac\x03\xa3\x18\xf1\x48\xab\x1d\x80\xee\x69\x04\x18\xd1\x9c\xda\x0c\x39\x3e\xba\x55\xfe\xf2\x67\xf1\x6d\x56\xbb\x72\xc3\x55\xd1\xfe\x47\x77\xc7\x98\x6a\x44\xda\x1d\x2a\x38\x97\xe7\x5f\x81\x33\x47\x73\x4a\xc7\x9c\x52\x8b\x89\x3f\x65\xc5\xa1\xf1\x4e\xdc\x6f\x93\x5e\x89\x2d\x81\xee\xa4\xe1\xf3\xa1\xfa\x65\xdb\x41\x07\xb8\x35\x60\x10\xcf\xf3\xda\x58\xce\xe4\xbe\x4b\x82\xf6\x90\x78\x3d\x09\x7d\x25\xcf\xcf\x88\x4e\xe2\x10\xbf\xf7\x1d\xf4\xaf\x95\x68\xab\xf8\x8e\xf0\xae\x6e\x39\x4d\xe1\x32\x3a\x8d\x0c\x42\xaf\x2c\xce\x71\x8d\x77\x1d\xe7\x56\x74\x9a\x30\xe6\x72\xc4\x8b\xe2\xb3\x2c\x60\x29\x8a\x51\xfc\x7f\xa0\xd6\xe4\x2f\x11\x36\x95\x75\x44\x56\x0e\x5b\x48\x87\x14\xec\x73\xf0\x2f\x2d\x89\x42\x23\xf5\x86\xd1\xd9\x15\xf7\xd5\xbf\xfe\xf2\x80\x6a\xee\xa7\xc4\x5d\x59\x35\x97\xa2\x33\x06\xb4\x4c\x29\x3e\x89\x3d\xf7\xb6\xa2\x6a\x66\x44\xc2\xbe\xf8\xc2\x2a\xb0\xea\x31\xf2\x6c\x57\xf7\x64\xe8\x54\x48\x62\x57\xfd\xaf\xb3\x51\x11\xab\x56\x21\xc7\x5d\xf7\x94\x15\x96\x82\xd7\xe1\x95\x46\x59\x28\xad\x14\x60\xcd\xce\xf6\x79\x75\x58\x3e\x6f\x7e\xdc\x62\xf4\x63\xb9\xd8\x76\x1d\x20\x8d\x93\x31\xdd\xd9\x17\x35\xb9\x5a\x73\x62\x7c\x3e\xa7\xb0\xda\x9e\xdd\x80\x0f\xcb\x24\x3c\xfc\x4f\x9b\xd8\x60\xac\xe3\x76\xb1\x5f\x1d\xf6\x9b\x3f\x56\x4f\xbb\xc3\xcb\xd3\xc3\x66\xf9\xc7\xca\x7b\x72\xda\x28\x8d\x49\x01\x9f\x91\x74\x87\xcc\x64\xf6\x19\x23\x2d\x7b\x57\xbb\xe8\x90\xab\x64\x07\x9e\xa7\xdd\x76\x01\x12\x5b\xba\x2b\x47\x24\x29\x2a\xbd\x6c\xed\xde\xd1\x7d\x10\x7d\x8d\xb6\xc5\x1e\x4d\x8b\x19\x46\x3c\xd7\x91\x12\x1e\x58\x81\x19\x70\xf4\x27\x37\xfb\xa5\x28\xf4\x30\xe5\x09\x94\x09\xc4\xc6\xd9\x0f\x6f\xfd\xdc\xd9\xc8\x2d\xb0\xc8\xd6\x37\x76\x85\x06\x2e\x4e\xe8\xef\x14\x04\x36\x54\x7c\x5f\x96\xfa\xa6\x3b\x81\x20\xd0\xd2\x33\xfd\xa3\x3a\xd0\xc4\xc8\x83\x28\x88\x31\x72\x9b\x0d\x85\xaa\x17\x79\x05\x42\x7f\xda\x80\xe1\x15\x28\xc2\x5f\xc9\x29\x42\x49\x6e\x6c\xa1\xfb\xab\xa8\x44\x39\xf1\x61\x20\x8a\x03\xac\x32\x40\x88\xfc\xb0\x74\x0f\xa2\xd4\x26\x7b\x6c\x0d\xec\xab\x38\x9d\xb3\xb2\xe8\x14\x27\x19\x01\xce\x24\x56\x75\xed\x9a\x0a\xc4\x29\x6b\x3e\xed\xb9\xdf\x35\x87\x31\x50\xbf\x71\xdc\xb4\x2f\x97\x7b\x6d\x93\x29\x89\xe2\xe4\xb9\x79\x64\x01\x97\x35\x1e\xca\x65\xb5\xc8\x2a\x3d\xcc\x52\xce\x04\x66\x80\x0b\xa6\x3a\x7f\xbe\xba\xcb\x20\xd7\xb4\x7b\x12\x48\x11\x33\xdf\xcc\xa5\x91\xfd\x64\x88\xb9\x46\xe6\xcd\x03\xea\x5d\xdc\x0f\x2b\xba\x66\x57\x35\x24\x31\xf1\xee\xc1\xed\x6e\xbf\x43\x59\x4f\x54\xc1\xf2\x3f\x9b\xa4\xb1\x2d\xe7\xdb\xfc\x78\xf6\x7f\x4b\xe3\x14\xa3\x89\x96\x14\xee\x46\x14\x6f\x93\xaf\x9d\x26\xd2\x84\x7d\x65\xd9\xc8\xaa\x80\x54\x58\xdd\xc4\x33\xe6\x85\xfb\xe8\xe9\xf8\x16\x82\x45\x81\x65\xc9\x76\x01\x74\x9f\xb0\x1c\x96\xfc\x5c\xc7\x8c\x26\xaf\x27\x02\x8a\xc1\xc8\x23\xd6\x5f\xce\x87\x1e\x41\x24\x3a\xe1\x9d\x8d\xef\xc4\xad\x66\x4a\xcf\x40\x32\x91\x74\x3a\x1e\x13\x85\xd3\xbf\xb5\x3b\x83\xe4\x36\x44\x6b\xaa\xf2\xbf\x50\x78\x39\xce\x5f\xbf\x83\x14\x96\x25\xf3\xe8\x24\x94\x8e\x5d\xec\x16\x14\x31\x84\x8e\xe4\xcf\x7f\x52\xd6\xfa\xf8\x07\x77\x8b\xae\x63\x6c\x4d\x81\x1a\x44\xa5\x5e\x31\x05\x34\xac\x4f\x07\x4d\xad\xf4\xbc\x14\x7a\x46\xce\x7e\x38\xc3\x74\x1a\x76\xdc\x58\xd6\x80\x3b\xa8\xb1\xd9\x0f\x5a\x40\xd4\x13\xc1\x5c\xd7\x8e\xcf\x39\x5a\x00\x44\xa5\x6e\xca\xbc\x54\xf9\xf8\xd0\x05\x88\x42\x24\x97\x43\x72\x89\x41\x6e\x6f\x3c\xb8\x20\x38\x06\x01\x56\xbb\xcd\x16\x85\x83\xbe\x20\x0d\xee\xb4\x09\xfd\x75\x52\xa0\xc1\xe0\xec\x24\x8b\x72\x2a\xab\x97\x3a\x2b\x8e\x4f\xf0\x3e\xf1\x6a\xc0\x44\x31\x92\x4b\xc8\xcb\xe9\xec\xcd\x97\xd1\xbb\x18\xc2\x63\x4c\x46\x6e\x9f\x57\xfb\xdb\xd5\x28\x84\x65\x08\xb7\x64\x41\xb8\x21\x1d\xda\x13\xe6\x65\x3b\xbd\x3c\x8e\x50\x0f\x1d\x01\xe0\x13\x0f\xc5\xb4\xfe\xb4\x41\xe8\x51\xd6\x97\x7b\x7f\xa1\x3d\x3e\x5c\x76\x06\x4f\xff\xff\xf3\xff\xfb\x3f\xdf\xa1\xca\xcc\x12\x1c\x15\x50\xbb\x6d\x75\x9c\xf3\xc3\xbd\xc8\x50\x22\xc0\x86\x39\x6c\xc5\x6a\xbd\x7a\x5e\x52\x1e\x5d\x63\xdd\xf0\xa2\xb0\xbb\xca\x68\xdd\x09\xe3\xe3\x9b\xf7\x2c\x8d\x6d\x7b\x62\x63\x1d\x06\xd4\xeb\xf7\xb2\x81\xdd\xe5\xf4\x74\x39\xdd\x95\x55\x7b\x64\xcd\xa0\x71\x0c\xd5\x49\x24\x3b\x93\xcc\x2b\x3e\xcd\x42\xf3\x4c\x40\xad\xdb\x64\x1d\x4b\xd5\x2d\xd2\x71\xee\xcf\x04\xad\x85\xee\x42\x79\xed\x21\xb9\xfa\x68\x2a\x31\x1f\x36\x35\x01\xa7\x28\x7e\x53\x22\x08\x7b\xe5\x20\xd9\x93\x0f\x16\xe8\x90\x7a\x85\x1c\x51\x79\x11\xdf\x51\x3a\xc0\x84\x84\x86\x18\x14\x38\x97\xf9\x98\x0b\xbc\x6d\x4c\x6d\xa3\xa3\xf9\xf8\xb4\x32\xb6\xa3\x6d\xd3\x84\x3a\x16\xa2\x53\x6a\xb2\x6a\x5b\xfe\xfa\x28\xa4\x88\xde\xf5\xa6\xc9\xa2\xfe\x87\xab\x7f\xd7\xde\xc8\xf3\x3d\x05\x91\xb6\xda\x43\xe8\x3d\x88\xd3\x0c\xfb\x21\xf6\x32\x18\xc4\xdb\x78\x79\x7d\xef\x37\x58\x61\xef\x2b\xc3\xd9\x44\x90\x68\xed\xe3\x6f\xe3\xc0\x9b\xe1\x51\x42\x79\x2f\xf9\xf9\x0b\x37\xd2\xc4\xd4\xba\x62\x8b\xff\xf8\x9c\x89\x89\x59\x8c\x26\xab\xd3\x1a\x9f\xf4\x8f\x2c\x31\x76\xeb\xc9\x56\xa7\xcf\x5d\x99\xeb\x0c\xaa\x7a\x39\x94\x65\x77\x5d\x13\x42\xd1\x40\xb1\x89\x80\x5f\x7b\xc8\x26\xe1\x80\xc6\xd7\x21\xab\x6d\xfe\xfe\xa7\xc8\x72\x14\xd8\x72\x1d\x04\xb7\x85\x58\xd0\xbc\xee\xa0\xd0\x3b\x71\x72\xba\x48\x5f\x84\xb5\x8d\x88\x89\x24\x9d\xcf\x6d\x6f\xd6\x61\x38\x65\x6e\x8d\xc9\x2f\xe6\xa0\x64\x12\x37\x6f\x8c\xa7\x62\x52\xfe\x66\xbf\x1c\xc4\x9d\x8d\x0c\x38\x06\xbb\xda\x79\x95\xfc\xee\x9f\x51\xa6\x12\x5d\xb9\x87\xf2\xb8\x2b\xab\x06\xb4\x15\x53\x1b\xdf\x5b\x85\x49\xe2\x85\x55\x5b\x13\x07\x05\x35\xa6\x7d\x0c\xc3\x48\xec\x52\x0c\xa8\x64\x8c\x4e\x12\x2b\x74\xe4\x88\x01\x46\xc9\x43\x03\x22\xf2\x7a\x4d\x2f\x35\x54\x7b\x51\xbf\x2d\x9a\xb9\xa9\x06\x90\xa0\xea\xe0\xa1\x35\x38\xb7\x7e\xa2\x52\x42\xa4\x41\x7f\x22\x2f\x73\x31\x58\x2b\x94\x50\x47\x89\x73\x84\xe6\xe1\xe1\xbb\x25\x17\x67\x89\x6f\x65\x71\x80\x69\x0e\x79\xf9\x84\xca\x01\x04\x7e\x79\xbe\x52\xc2\x52\xe3\x6a\x8e\x32\xf5\x06\xc5\xb7\xce\x27\xa1\x84\x69\x63\xcd\x29\x4b\x81\xe8\x40\xb2\xb5\x6f\x0e\x15\xc3\x90\x05\x6a\x6a\x81\x38\xad\x8b\xba\x11\xfd\xd5\xa1\xd2\xb6\xe2\xb0\xbd\xd8\xee\x06\x1b\xb3\x53\xe2\xd4\x67\x2f\x29\x09\x75\x82\xfa\x0a\x0b\xad\xbf\x41\x0e\x45\x36\x50\x87\x18\x3f\x67\x08\xd2\x50\x07\x79\xbb\x34\x30\x4b\x11\x43\x49\x68\xac\x2a\x4b\xfd\x96\x15\x6b\xbd\x2f\x7b\x6d\xab\xbe\x4f\x94\x02\xef\xbd\x81\x8e\xa8\xa1\xd0\xe8\x9e\xd5\xaf\x13\x79\x42\x7f\x95\x22\x9e\xaf\x7e\xb9\x1b\x83\x78\x29\xe1\x91\x41\xd0\xe4\x29\x2b\x6c\x70\xa7\xe8\x13\xf8\xb3\x8b\x8c\x12\x1e\xcb\xa0\xcb\xbe\xa1\x4b\xd2\xbe\x12\xca\xf0\x0c\x92\x86\xf3\x89\x4c\x77\x76\x53\x12\xa7\x04\xd3\x7e\xad\x21\xfa\xe3\xb5\xcc\xad\xf9\x76\x1c\x91\xc4\x50\x12\x8b\xd8\x2a\xa5\x59\x15\xc8\x3e\xd0\xf5\x85\x00\xe3\x2f\xc5\xcf\x07\xbc\xf7\xee\xf6\x89\x8b\x08\xb6\x2f\x7f\xf8\xe2\xeb\x25\x21\xc7\xda\xfa\xac\x3e\xbc\x7d\xaa\xc9\x06\x4a\x49\x4a\xa4\x9d\x69\x1a\x54\x85\xe0\x89\x75\xf1\x13\x0a\x9c\xbe\xf3\xd3\x36\x8d\x89\x8a\xba\x42\x87\x83\xba\xda\xf3\x28\x49\x65\x88\xbe\xa8\xcc\x9a\xfa\x51\xd4\x6f\x7e\x38\x52\x65\x45\x57\x7d\x71\x74\xf3\xfa\x0b\xaf\x84\x12\xc1\x01\xbc\xea\x95\xc7\xc0\x4c\x0e\xe0\xab\xdc\x00\x25\x22\xb1\x84\x9d\x96\xd3\x0e\x97\xb0\x25\x4c\xaa\xe7\x91\x30\xed\x15\x7a\xc0\x13\x74\x5f\x89\xe2\x92\x8b\xa9\x5a\x63\xdb\x4f\xda\xed\xae\xb8\x9c\x36\xe6\xf7\xac\x38\xe6\xd0\x2d\x27\x01\x16\x57\x55\xf7\x75\xd2\x2e\xd6\x35\x2e\x8d\x73\xdd\x65\x0c\xb8\x5a\xd0\x5c\x19\xf0\x78\xce\x7f\x43\x29\x52\xdc\xf2\x34\x9c\x2e\x55\xfb\xfd\xef\x00\x06\x91\x0e\x4a\xa4\x0a\xe3\xae\x54\xdb\x81\x86\xb2\xc2\x6b\xc6\xb7\x1d\xb4\x25\x27\xe8\x09\x07\xbe\xa1\x01\xf9\x90\x29\xc0\x30\x7f\x97\x95\xa1\x44\x51\x5b\x2b\x82\xf5\x8d\xc8\x59\x31\x19\x07\x15\x09\x94\xf6\x3e\x58\xdb\x08\x7f\xa9\x9a\xcc\x2b\x15\x59\xda\xc2\x89\x51\x32\xfc\xbc\x9a\x86\x98\x78\x94\x97\xaa\xd8\x3e\xaf\xd6\xcb\xcd\xb0\x54\x93\x12\xcd\x24\x66\x35\x11\xe0\x78\x78\x7c\x79\xd8\xaf\xb7\x0f\xeb\xd5\xf3\xc1\x76\x66\x5d\x3f\x00\xe6\x32\x7f\x0e\x08\xbe\xb9\x34\xbf\x0d\x06\x1b\x58\x98\x38\xdd\x91\xdb\xac\xf6\x68\x0e\x05\x45\x23\x8e\xf0\x00\x3f\x21\x0f\xfc\xbd\x20\x0e\x42\x5b\x9b\x72\x53\x7e\xac\x1b\x38\xad\xa7\x2f\x0f\xa9\x08\x1c\xd2\xca\xd5\x24\x21\x6e\x48\xe4\xf5\x64\x04\x4c\xa4\xb5\x18\x73\x6b\xff\x4a\x5f\xc0\x5f\xa5\xa4\xe1\xc3\x2d\xf2\x54\x2e\x2f\x4d\x06\xb3\x2e\x64\x6b\xf4\x5a\x29\x86\x3a\xfb\x2f\x0c\xec\x5d\x4a\x0c\xa4\x81\xa5\xad\xb5\xa7\xdf\xbe\xf4\x2b\x67\xf4\x7b\x78\x70\x69\xef\xe1\x20\xe9\xb1\x5b\x2c\x56\x50\x67\x86\xc1\x86\x52\x12\xe9\xc0\x79\x45\x95\x55\x89\x7c\x2a\x8b\xa1\x7a\x6d\xdb\x87\x53\x54\x86\x36\x59\x21\xf2\x8e\x00\xb9\x6d\x10\x11\x32\xf3\xb6\xa7\xf3\x6c\xe4\x85\x52\x4a\x08\x62\x5c\xec\x18\x5c\xed\xe6\xfd\x97\xa5\x34\x4c\x11\xf6\x26\xbd\x00\xa6\xe5\xd3\x19\x8d\x11\xa5\x89\x55\x22\xb0\x6c\x0f\xeb\xe5\x06\x83\xd5\x7e\xfa\x50\xaa\x08\xf2\xd3\x5a\x2d\xcd\x5b\x2b\xf2\xfc\x78\x69\xb2\xaf\x33\x43\xf3\x07\x3a\xa5\xda\x46\x39\x37\x85\x8d\x1c\xbb\x52\x50\xff\x43\x2c\xb5\x62\xc8\xb5\xc8\xa1\xfc\xd9\x2d\x5e\xca\x20\x36\x0e\xe7\xf0\x90\x59\x60\x93\x5f\x03\x34\x08\x42\xa6\x3b\x2a\x64\x87\x3e\xd8\xb6\xb6\x52\xdf\x45\x08\x8c\xd3\xdf\xec\x1f\x0e\xeb\xc7\xc7\xcd\xf3\x7e\xf1\xe0\xdb\x42\xaa\x82\x5e\x7a\xd1\xd7\x14\xdc\x5d\x06\x34\x77\x53\x70\xad\x2d\x75\x64\x49\x77\x07\x8d\xb5\xc3\x56\xbd\x6a\xd5\xbc\x3a\x6e\xeb\xb2\xfb\x09\xa3\x31\x21\xb7\x40\x5e\xb2\xa1\xc5\x44\x23\xdd\x59\x4c\x3b\x38\x65\x56\x1f\x74\x32\xff\x22\x63\x39\x94\x9f\x41\x65\xf0\x13\xf4\xe8\x03\x4e\xc6\x97\xf3\x10\x0b\x57\x17\xcf\x4b\xff\x13\x5c\x46\x88\xd7\xb7\xb4\xf9\xb8\x27\xb2\xc9\xe7\x4f\x08\x0d\x2c\x1e\x6e\xb9\x98\x35\xff\xdb\x2e\x31\xf3\x0c\x2b\xbf\x8d\x7e\x32\x89\x29\x6e\xac\xf7\x53\x07\x91\xd2\x24\x21\x08\x1f\x3c\x89\x0f\x2c\x81\x43\x2b\xc2\x86\x96\x6f\x44\x0d\xc3\x38\x28\xa5\x29\xb3\x7a\xcc\xb6\x2e\x6d\xac\xaa\xec\xbb\x84\x52\xd9\xc3\xf1\xe7\xf2\x32\xd8\xa0\xfc\x2d\x04\x09\x3b\x72\x66\x51\x37\x50\x37\xbb\xb3\x50\xd0\x7a\x49\x83\x2e\x5a\xfa\xd9\x72\x5d\xb5\xd3\x76\x30\x98\xfc\xeb\x69\x49\x3a\x8d\x88\xf1\xc3\x08\x2a\x45\x32\xce\xc0\xb9\xa0\x51\xde\x4f\x5c\xc9\xe2\xa8\xef\x74\x63\x45\x0e\xf7\xd9\x09\xee\xca\xca\xcb\x0a\xcd\xbe\xaa\x0c\x0d\x1a\xcb\x68\x81\xb9\x2c\xcb\xa4\x47\xcc\x04\x52\xb4\x5c\x24\x9d\xb7\x43\xa8\x96\xb6\x36\x04\x53\x36\x4f\xf0\xbe\x6b\xc4\x5b\xbf\x70\x80\x25\xd2\xb1\xf1\x3c\x58\xf1\xc5\xc1\xb6\x01\x9a\xa3\x44\x61\xbb\xe4\xc7\x75\x3c\x94\x1a\x22\x7d\x60\xd2\x6a\x77\x3f\xc3\xf9\xd2\xe0\xe9\x8c\xef\xf2\x52\xb4\xfb\x43\x0d\x7d\x7f\xc0\xed\x63\x27\x72\xd8\x98\xe5\xab\x38\x41\xf3\xdf\xae\x31\x48\xd1\xb2\x58\x2d\x37\x87\xdd\x9f\xbb\xfd\xea\xf1\xf0\x6d\xf3\x70\xbb\x7a\xee\x3a\x00\xa8\xa8\xb7\xad\x71\xf6\xdf\x42\xde\x88\x1d\xe4\xf9\x97\xbc\x65\xbf\x5a\xba\x57\x55\xe6\x73\x62\x92\xed\x2f\x9b\x94\x58\x55\x88\x4c\x41\xf7\x6d\x27\xe6\x21\x23\x10\x31\x87\x1c\x7c\xf3\x88\xbd\x5f\x46\x76\x29\xa3\x31\xf7\xf8\xe7\xdb\x4a\xbc\x0f\x4e\xff\x9b\xcf\x01\x6b\xd6\xe0\x02\xad\xe2\xa8\x0f\xd1\xb7\x87\x69\xe7\xf1\x52\xc6\xa2\x58\xc3\x20\x69\x71\xfe\x8b\x9f\x0f\x08\x8d\xc0\x93\x70\x59\xec\xd2\xc1\x64\xd6\xc6\xff\x96\x15\x28\x9c\xb7\x76\xd8\x04\x6f\x1e\xb1\x20\x8c\x79\x17\x1c\xc3\x50\x5c\xd6\x20\xfb\xd4\xb6\xcc\xf3\xc9\x90\x04\x11\x49\x82\x8e\x10\x7e\x77\x91\x35\xd2\x77\x4f\xa3\xb6\x94\x85\x14\xc2\xb0\x3f\x26\x37\xc6\xce\x9f\x1a\xf4\xa2\xb6\x3c\x0c\xde\xec\x60\x91\xe4\x18\x6c\xea\x62\xec\x2e\x44\x36\xfa\xf0\x2c\x74\xbd\xb9\x48\x91\x8a\xa6\x02\x3b\x13\x67\x77\x4b\x16\xab\x80\x08\x17\x6d\x6a\xbf\x01\x42\xb0\x46\x07\x2d\x8b\x0d\xa4\xae\x8a\x77\x53\xd8\x14\xee\xfc\xbd\x92\x24\x24\xc4\xc5\x7b\x7d\xc5\xc0\xbe\x23\xfd\xa5\x2c\x49\x2d\x19\xe6\x63\xa6\x5e\x05\xe4\x3d\x28\x85\xb2\x44\x58\x19\x7b\xdc\x93\x0e\x28\xf4\x77\x50\xa5\xee\x56\x2a\x4b\xa3\x50\x3b\xa0\xe2\x42\xeb\xd9\x19\xe6\x7b\x02\xc3\xf8\x2e\xda\x14\xa3\x60\x0f\x65\x82\x1b\xcb\x08\xd8\x1a\xad\x2b\xcc\x8f\xf9\x96\x24\xb2\x22\x64\xaf\xe5\xfb\xe3\xe7\x30\x38\x46\x99\x50\x21\xe6\x85\x5f\x8a\x4c\x95\x55\xd1\x8b\xd6\x62\x5b\x8c\xd4\x28\x27\x9c\x34\xef\xbb\xf3\x68\xee\x7e\x31\xfb\xa4\x09\x28\xf7\xe2\xff\xe7\xaf\x5e\x44\x05\xc6\x31\xfd\xb6\x87\xaa\xa7\x2d\x76\x89\x9a\xf3\xd4\x80\x61\x2a\x32\x48\xd6\x89\x06\xf9\x60\x1f\x63\x2a\xa1\x91\x03\xb4\xe0\x2e\xe8\xd7\x4f\x37\xb6\x9a\xc7\x38\x53\xce\xe2\xf3\xb9\xfc\x14\x79\xd3\x8d\x0a\xe6\xdb\xf0\x41\x5d\x92\x70\x00\x54\xa2\x0c\xa4\xd4\x7c\x40\xaa\xdc\x6e\xa1\xbf\x8e\x66\x30\xc3\x09\x82\x2c\x00\xf3\xfa\xd7\x45\x01\xde\x3f\x0b\x48\x2a\xc0\xb1\xb7\xb5\x67\x85\x07\x44\x76\x6e\xdc\xd4\xa1\x0b\xa8\x72\x72\x0f\xa2\x1c\x05\x54\x69\xc0\x38\x43\x43\xd1\x39\x22\x73\x31\xc5\xb6\x93\xad\xc7\xb0\x32\x4b\xf7\x5d\xb5\xb7\x5f\x05\x01\x4b\x43\xa4\xab\xed\xb0\x10\xdf\x44\x8d\x70\x88\xee\x67\x14\xe0\x4a\xba\x59\xec\x56\x87\xc5\xe3\xe6\xb0\xdf\x1c\x56\xfb\x6f\x87\xe7\x85\x27\x59\xa7\x01\x03\x89\x23\xbd\x6f\x37\x96\x4b\x35\x62\xf0\xa1\x41\x10\x09\xed\xa0\x86\x0e\x41\xb3\x38\x1e\x2b\x38\x8a\x6b\x7e\x6f\x7f\x45\xa2\xa9\xec\x2a\x4e\xea\xbe\xec\xda\x46\x4d\xfa\x87\x0b\xb4\x06\x87\x0f\x6d\x72\xb8\x81\xe6\xfb\xf8\xc0\x4c\x7c\x3f\x08\x30\x00\xdb\xf3\x43\xf5\x16\xc6\xec\x17\x0d\x42\x92\x68\xaf\x38\x89\x47\x61\x59\x39\xfa\x18\xdf\x81\xd1\x50\xfa\xca\x62\x28\xdb\x59\x54\x4f\xc6\x36\xe4\x80\xf1\xd9\x5a\xfc\xec\x64\xea\x47\x23\x13\xa6\x2c\xf6\xb0\x06\xcb\x4d\xb1\x15\xd5\xd7\x30\x65\x77\x55\x14\x25\xdc\x23\x89\xec\x55\xed\x54\x42\x07\x68\xfa\x04\x51\x42\xad\x73\x7f\xa9\x9c\x36\xde\xba\x7b\x81\x48\x33\x44\x00\xb6\xdb\x1a\x7a\xe2\x03\xfe\x6f\x1a\xf0\x98\x4a\x8f\xdf\x69\x4f\xf7\x83\x35\x83\x3c\x74\x9e\x06\x3c\xa1\xca\x45\x81\x2d\x0d\xce\xe4\xa7\x63\x92\x86\x3d\x25\xc4\xaa\x79\xbd\x12\x55\x6d\x3b\x71\x6d\x35\xd7\xd4\x2b\xe8\x4b\x0e\x7a\x18\x61\xa7\x41\xaa\x98\x70\xbb\xf8\x3b\x6e\x40\x7d\x65\xa1\xff\xb2\x82\x71\xb4\x5e\x4b\x63\xa0\x5a\xd4\x3b\xa1\xaa\xcc\x64\x0a\xee\xaa\xf2\x34\xc8\x49\xd3\x40\xc4\x0c\x49\x5f\x1f\xb2\xe3\x6b\x53\x9a\x7b\x91\x8b\x8f\xcf\xae\x51\xa5\x18\x0f\x14\x5a\x8f\x5c\xb3\xd1\x5c\x9a\x4d\x39\xd3\x40\xe8\x10\xcb\x58\xdb\x8f\xf0\x03\xe0\x6d\xff\x5e\x76\xb7\x85\x14\x63\x38\x05\xbc\xdf\x5f\xf1\x7c\x5e\x8b\xeb\x0d\xfd\xcc\x40\x80\x96\xce\x92\x58\xe4\xb9\xf5\x8b\xbe\x12\xb8\x66\x34\x90\xa9\x05\x32\x3b\x78\xec\x1c\x93\x19\x0d\x54\x10\xc4\x4e\x20\x2e\xb7\xa4\x91\x56\x72\x55\xe4\xb9\x14\xea\x8a\xb1\x6e\x1a\x98\x1b\xc4\x2f\x02\xcd\xad\x50\x35\xd8\x92\x47\xe4\x85\x1c\x3f\x91\x4e\x4c\xe8\x3e\x9e\x8b\xba\xd8\x05\xf4\x74\x39\x4d\x7b\x4a\x86\x7c\x31\xed\x36\x36\x9f\x06\x9d\xbc\x2c\x70\xe2\x1d\x8a\xfd\x5b\x81\x11\x76\x07\x6b\x99\xf4\x4b\x42\x3c\x17\xbd\x97\x62\xb7\xf3\x41\xa4\x20\x00\xc1\xa5\x1c\x50\x31\x38\xdd\x53\x7f\x46\x06\x26\x0c\x3d\xd6\xbf\x9d\x18\x6e\x0b\x46\x1a\x36\xdf\x23\x15\x7a\xc8\xa8\x31\x07\x6e\xa6\x81\x01\x12\x86\x1e\x85\x57\x37\xed\x4e\x30\x97\x4d\x6b\x3b\x32\x19\xf7\x12\xe1\x95\x50\x13\x76\x47\x1a\x32\x22\x30\x6a\x71\x70\x91\xc4\x71\x95\xfc\x78\xa8\x42\x16\x42\xac\x2d\x1b\x71\xa7\xc1\xf3\x9b\x6f\x13\x96\x6c\xd0\xeb\x40\x57\xc7\x6c\x62\xc6\x85\x41\x04\x5e\x14\xd1\xfe\xcc\x18\xf1\xe7\x7b\x69\x81\x59\xce\x76\x96\x6e\xcc\xfe\xb5\x2a\x3b\xf8\x13\x0d\x43\x12\x21\x57\x04\x1e\xa7\x1d\x0a\xec\x8b\xc7\x0d\xb9\xc2\x70\xc0\xa5\xc8\x9a\x5b\x30\x50\x4c\xd2\x7e\x34\x8c\x42\x6e\xcb\xb4\x36\x2f\x4f\xb7\x37\x9b\x3f\xfd\xcf\x44\x22\xf4\xd5\x8b\xcf\xd0\xce\xe6\x41\xdc\x25\x8c\xc0\xea\x1d\xb5\x76\xf1\x4d\xd6\xec\x5a\x2f\x32\xb3\x64\xf1\x9b\xcd\x8d\xef\xc5\x19\xc5\xd7\x90\x99\x0e\xc6\x40\x0f\x77\x30\x27\xfe\x58\x0e\x79\x08\xb1\xa5\xa6\xdf\x14\xd0\xe9\x5e\x33\x1a\xc6\x71\x62\xe3\xeb\xa7\x6c\x98\x6d\xa4\x61\x9c\x32\xde\x65\xd3\xaf\xf4\xd5\xc6\x0b\x35\x4c\xc2\x18\xc1\x11\x45\xd9\xb4\xbb\x19\x4e\xcd\x0e\xcb\x4b\xc3\x84\x27\x81\x9b\xd7\x76\x4d\xbd\x14\x59\x33\xcd\x97\xd1\x30\xa5\x60\x49\x71\x40\x95\x85\x76\x8b\x70\x88\xff\xa2\x61\x1a\x25\x18\x66\xc4\x9a\xea\xe5\xcb\xf3\x73\x47\xc6\x4b\xc3\x94\x33\xab\x1c\xa0\xa1\x68\x1f\x03\x2a\xb4\xa2\x87\xbb\x54\x98\xa6\x71\xe0\xe6\xc7\x5a\x95\x6c\xce\xe1\x0d\x53\xc5\xb1\xd2\xda\xb8\xca\x8c\xfd\x6b\x75\xad\xe0\x3b\xbf\xad\x85\xc2\x70\x3c\xb8\x85\x52\x70\x6e\xfa\xf2\xac\x76\x31\x7e\x35\xe5\x25\x0d\xb9\x4d\x71\x94\x95\x25\xb8\x99\xdb\x60\x43\x29\x39\xc6\x6e\xd0\xa0\xce\x7a\xa3\x22\x54\x4c\xf8\x93\xdd\x69\xa4\xbe\x3c\xaf\x27\x33\x5e\xa5\x1a\xd9\xa9\x7e\x54\x59\x03\xad\x6d\x32\xac\x9a\xa7\xa1\xd2\x32\x21\x83\xea\xca\x3e\x7f\x3f\xc8\xdb\xd3\x50\x6b\x91\x58\xd9\xc2\xe3\x25\x17\xd5\x80\x07\x86\x86\x10\xd9\xe2\x05\xef\x15\x79\xd1\xb1\xf9\x09\x03\x91\x09\xdc\x66\x7b\x57\x56\x38\x25\xf0\xdc\xbd\x03\xa8\x7b\x1e\x31\xdf\x39\x11\xa1\x97\xe5\xc3\x40\x3e\x06\x09\x26\x86\x77\x68\x62\x6a\xc0\x47\xe9\xef\x2e\xb9\xc9\xf2\xbc\xb5\x69\x3d\x0a\xda\x9b\xb6\xec\x2a\x42\xf8\x3f\xf1\xff\x1b\x9f\x98\x1e\xf2\x47\x23\x42\x52\x44\xe1\x35\xd9\xc9\x89\xe3\xfa\x06\x15\x79\x0c\xf8\x1f\xf0\x59\xf7\x7f\x8e\x91\xc6\xaa\x80\xf7\x75\x03\xa7\x5f\xa1\x59\xda\xce\x3a\x72\xfe\x47\xbb\xf8\x47\x04\x9d\xae\x0b\x35\x29\x96\xb4\xef\x97\xfb\xd1\x44\x8e\x18\x51\x58\xf0\xdf\x5b\x88\xd6\x12\x71\xef\x31\x38\x78\xfd\x05\x32\x44\x4f\x78\xf3\xe3\xe9\xb0\x3b\x59\xcf\x19\xb7\xeb\xc3\xf4\x4b\xf5\x3e\x4b\xc4\x14\xc7\x6c\xde\xc3\xe6\xfb\xea\xcf\xcd\xcb\x70\x83\x88\x58\xbb\x6b\x0d\x76\x7e\x47\x01\x3d\x77\xb0\x45\x41\x6c\x99\x6b\x90\xd4\xd0\xb2\xbb\xa0\x9b\xfb\x8f\x0b\x5c\x6c\xa9\xf2\xa4\x7f\x22\x10\xe2\xe6\xd8\x33\x96\xa2\xb5\x28\xba\x41\x0e\xa4\xad\x35\xfb\xd7\xef\xff\xfa\x7d\xf4\x48\x81\x34\x68\xd7\x7f\x04\xa3\x3f\x87\x2c\xb6\xf2\xd4\xe2\xad\xb5\xb9\xe7\x97\x61\x14\x46\x09\x26\xdf\x6b\x91\xff\x14\x47\x78\x2a\xbb\xd2\x24\xcb\x16\x8a\x72\x1c\x57\x88\xae\xc9\x3d\xb4\xc2\x90\xdd\x49\x7c\x3c\x66\x45\x33\xd8\xdc\xa2\xc8\x69\xca\xdc\x77\xe6\x05\x3a\x53\xe8\xc8\x8f\x98\x6e\x7c\x7f\x61\x30\x51\xe2\x82\x4d\xf3\xb9\x37\xea\x37\xf8\x88\x8b\x94\xab\x81\xaa\x20\x0a\xff\xf9\x7b\xc5\x01\x43\xb3\xfa\x67\xd9\xf4\xa8\x18\xdf\x16\x59\x9c\xbf\x1e\xd0\x78\x0f\xc1\x48\x34\x8a\x85\xad\xfd\xbd\x87\xe6\x46\x14\x6f\x50\xf5\xea\xb7\xce\xaa\x8d\x52\x66\x05\x94\xff\x14\xe5\xa3\x40\x3d\xf5\xbf\x64\x7f\xa1\x51\x1a\x52\xcc\x06\x77\xd9\x13\x27\x18\xd5\x1e\x0e\xf4\x06\x1a\xe1\x1f\x40\x04\x52\xb9\xa0\x83\xdb\xb6\x46\x16\x6d\x24\xc2\x04\x8b\x3e\x20\xcf\x8e\x99\xcc\xe1\xae\xac\xc6\x91\x89\xf1\x9a\x12\x5c\x41\x2f\xc6\xed\xb3\xc8\x13\x88\x35\x8d\x84\x0a\x51\xe2\xbe\xdd\x47\xc6\xe8\x2e\x1a\x09\xe0\xdc\x09\x93\xb7\xfb\xd7\x0f\x90\x75\xd6\xfc\xa2\x08\x8a\x46\xc2\xd8\xf5\xea\xa2\xbd\x6f\x50\x0c\x79\xd3\xfd\x7d\x65\x00\x68\xd7\x9b\xaa\x3c\x59\x80\xe5\xc0\x86\x8d\x64\x14\x62\x10\xbb\xc3\x16\x3b\x3b\x78\x53\x2c\xf0\xb8\x99\xa9\x39\x98\x3e\x86\x14\x1a\x7f\x60\xbf\xdd\x4f\x62\xa9\x91\xd4\x01\xe9\xf3\xfd\x3f\xca\xea\x0d\xaa\x6d\x59\xe6\xbf\x7d\x91\xfd\x9e\x1f\x5c\x69\x38\x71\x71\xb4\xbb\x0a\x00\xa7\x74\x75\x07\xa0\x47\x06\xfb\x34\x16\x7a\x85\x58\xa6\x91\x92\x89\xee\xf3\x4a\xeb\xdc\xaa\xde\x7c\xcd\x78\x44\x23\xa5\x48\x40\xc7\x15\x2b\xb3\x36\x6b\xa4\xb9\xe4\xae\xe3\x3e\x83\x6a\x63\x66\x78\xee\x69\xa4\x53\x82\x35\xb9\x0e\x91\xe4\xd0\x56\x03\xb6\xd8\xc9\xcf\x6b\xe8\x42\xfe\x5b\x51\x75\xca\xcb\xe3\xa9\xaa\x21\x4e\xfd\x4f\x8b\xe2\xad\x3b\xed\xbb\x0e\xc0\x22\x0c\x1f\x5d\xac\xf2\xb2\xa5\x39\xe8\x3f\x92\xa1\x0a\x6d\x9c\xd2\xf1\xbd\xee\x2c\xbf\xeb\x75\xa8\xcb\xf7\x4f\x78\x04\x1e\x72\x85\x75\x66\xb3\x23\x62\x14\x60\x1c\xdd\xb3\xe2\x7c\x41\x6f\x4f\x39\x49\x03\xe1\x5e\x72\x5d\xef\x5f\xb3\x4a\x0f\x8d\x00\x4e\x43\x83\x2b\xb1\x12\x85\x2e\x4f\xbb\xb7\xac\x58\x9c\xcf\x20\xaa\xc1\xc6\xc6\xa9\x26\x48\x9f\xd2\xb8\x48\xda\x36\xb8\x3d\x4c\x7e\x85\xc5\xb6\xbe\xa4\x3d\x5a\x44\xe5\x57\x1d\x0f\x74\x98\x0a\x57\xb9\x0b\x7a\x59\x56\xdd\x3d\x03\x30\x48\x8a\x78\x2f\x8a\x63\xe1\x8a\xcf\xe7\xab\x40\x29\x0f\x13\x5b\xfb\x90\xa9\x72\x8c\x49\xa5\x3c\x22\x34\xb4\xf9\xad\x9f\xe5\x38\x0b\xc1\x23\xb0\x45\xc5\xbe\x28\xa5\xab\xbd\x74\xdb\xf6\x5d\x59\x3d\x8a\xe2\x22\xf2\x67\x5b\x9d\xf7\xd9\xdd\xd3\xd8\x94\x83\x57\xf9\xd8\x35\xad\xd7\x75\xcc\xd4\x28\x7f\xce\x79\x9c\x86\x64\xc4\x24\xb2\x28\xb4\x03\x32\xce\xef\x63\x3c\x26\x86\xb1\x2e\xea\x34\xbf\x28\x78\x4c\x2d\x0c\x62\xf5\x51\x3e\x66\x45\xe6\xd2\x59\x5f\x0c\x4d\x12\x87\xe8\xf5\x15\xf0\x7e\xbb\x98\x80\x77\x78\xa2\x52\x24\xfa\xeb\x39\x2f\x3d\x84\xe7\x01\xf4\x71\x30\x03\x47\x33\x9e\x27\x4a\x60\xb4\xb9\x70\xd0\xa6\x01\xa2\x98\xf2\x94\x04\x38\x38\x8e\xb7\x70\xff\x31\x5e\x2e\x3c\x8d\x43\xdc\xf9\x2b\x64\x7a\x7a\x2a\x6d\x06\x2c\x13\x13\xf5\x41\xca\xd3\x84\xe3\xe1\x0d\xed\x07\xd5\x02\x95\xcd\xcb\x49\xee\x82\x8b\x28\x0a\x83\x2e\x44\x71\x57\x56\x4e\x46\xb6\x37\x84\xb9\x10\x04\xfd\x8b\xb3\x83\x3b\x0d\x8a\xac\x28\x97\x60\xeb\xb0\x5e\x4b\x9d\x4f\x9c\x06\xae\x28\xc7\xd7\xb4\x41\xf3\xd5\x87\x13\x75\x1f\xe0\x31\x26\x63\xad\x40\x7b\x5d\x8c\x2d\x14\x22\x6f\x3e\x6f\xb3\x5a\x5e\xaa\x7a\xc2\x69\x42\xb9\x4e\x03\x9c\xb0\xe7\x2a\x53\x57\x9e\x3a\xd7\x40\x63\xe1\x5b\xd1\x9a\xa0\xfe\x79\x81\x89\xb4\xa3\xd8\x1e\x14\x97\x50\x0e\x41\x18\xa6\x93\x9a\xbd\x19\xf0\x00\x07\xc1\x02\xa7\x5c\x89\xd8\x09\x2c\x18\x98\xdf\x6a\x38\x88\x08\xec\xb7\x6a\x57\x86\xfe\x6a\x4b\xe2\xa0\x78\x2a\xbd\xdd\x98\x97\x97\xfe\xa1\x94\xc1\x88\xd7\x5e\x8a\x32\xef\xfe\x68\xec\xba\x38\x57\xe5\xc7\xa7\x93\xa3\xbf\x06\x19\xf4\x87\x64\x4c\x40\x22\x0f\xed\x49\xbc\x41\xd5\xe9\x02\x61\xa2\x7a\xf4\x1c\x71\xeb\x9a\x0b\xaf\x9c\x98\x41\xfd\x07\x7c\x4e\x7b\x44\xcc\x49\x8d\xc0\xbb\x14\x6f\xde\x1e\x89\x69\x0c\x18\x6b\xac\xb3\xaa\x67\x77\xef\x1a\xb5\x8a\x03\x8b\x2d\xfc\x67\xfb\x7c\x7f\x11\xa4\x72\x57\x31\xa1\x30\x4a\x70\xa8\x6c\xd8\x13\x27\x50\xfd\x3c\xc9\x19\x8d\xe6\x45\x1c\x50\xea\x0d\xf0\x1f\x65\xa5\x47\x8a\xa7\x34\x0e\x02\xc3\x7d\x40\xf8\xf6\xe7\xc8\x79\x88\x03\x41\xd1\x95\x5c\x3f\xad\xf7\xeb\xc5\xc3\x61\xbb\x79\x78\x38\x3c\x6d\x9e\x3c\x35\x19\x8d\xc3\x48\xa1\x4a\xa0\x5f\xb5\x43\x73\x32\x0e\xe3\x18\x61\x2f\xeb\xe5\xe6\xb0\x5d\x3d\x2f\x57\x4f\xfb\xc5\xfd\xca\xeb\x8d\xd1\x38\x94\x09\xa2\xcf\xfd\x4e\x61\xad\xc6\xf1\xac\x8e\x43\xad\x2c\x0f\x0d\x42\xf1\x10\x3b\x33\xc5\xc8\xd3\x38\xa2\x1a\xf7\x87\x9b\xcb\xf1\x06\x05\x2e\x3b\x4e\x21\x1a\x47\x2c\x45\x7e\x12\x55\x9e\xce\x55\x79\xca\x6a\x98\x58\x69\x31\x8f\x22\x4f\x82\x6e\xd3\xca\x7d\xc4\x61\x06\xfc\xde\xf6\xd7\xcc\x49\xf6\x3c\x74\xe9\xf1\xbf\x55\xf8\x46\xe3\x98\x11\xed\x7c\xd4\x6f\x90\xeb\x11\xc7\xc6\xf8\xc5\xe3\xd0\xa0\xbb\xbe\x7c\xd9\xed\x37\x8f\xab\xe7\xc1\x10\xfa\x07\x8f\x13\xab\x91\x90\xd5\x1b\x4f\x02\x8d\x03\x13\x12\xdf\x41\x74\xc4\x32\x96\xed\x04\x2b\xbf\x5d\x63\x42\x03\x4b\x7c\x89\x46\xe1\x42\xd6\x3d\xa2\x7a\x72\xd0\xc6\x69\xc4\x11\x1c\xb4\xdf\xec\x37\xd3\xd2\xa3\xf1\x53\xa7\x49\x2c\xac\x54\x4a\x7e\x15\x0c\xf2\x5d\x0c\xc1\x95\xb7\x9a\x68\x22\xd0\x58\x08\x89\x59\x9d\x83\x97\xc6\xf0\x42\xfc\x93\xc7\x11\x3a\x88\x84\x17\x1d\x17\xf9\x40\x6f\x8b\xc6\xc2\x50\x34\x2d\x3a\x5d\xd4\x3f\x3e\x65\x17\xe0\x9c\x3c\x89\x4c\x63\xb4\xf0\x91\x17\xf2\x51\x7c\xf4\xd5\xba\x34\x96\x9a\x20\x4b\x71\x3b\x6d\x2e\x0d\xb4\x16\xee\x28\xc4\x14\x2b\x21\xd1\x97\xb9\x87\xa6\x8f\xfe\x8d\x9f\x53\xa7\x12\x5d\x03\x0f\x8d\xfc\xe8\xe9\x03\x47\x7b\x91\x96\x09\x58\x62\xc6\x9b\x81\x3c\xc0\xd8\x85\x73\xf6\x6e\x6c\x98\x9d\x7c\xcb\xe7\xef\xa3\xb1\x33\xc0\x95\x63\x70\x7f\x2e\xbf\x98\xb9\x09\x8d\x04\x15\x5d\xf2\xc2\x82\xc2\x10\x1f\x86\x21\x8b\xd1\xc3\x27\x34\x05\x2c\xae\x70\x03\xb0\xa8\x9a\xac\x6e\xf6\x1f\x77\x00\x73\x82\xf9\xed\x05\x8a\x62\xe5\x0b\x52\x73\x3f\xc1\xbb\x9b\x91\x76\xbf\xa1\x2c\x19\xb1\x7f\x4c\x1c\x8e\x84\x01\xd7\x16\x37\xf8\x79\xc8\xcb\x9f\x80\xe7\xe9\x18\x39\xfc\x0b\xc5\xd8\xf6\x7a\x89\x7b\xed\xe5\x6b\xd6\xbb\x2f\xff\x1d\x0d\x11\x33\x31\x22\xaf\x90\x53\xeb\xe5\xf1\xb0\x7d\x79\x5e\x7e\x5b\xec\xfc\x9a\x4b\x98\x31\x2e\xb7\x95\xe7\x8f\x4f\xcb\xc9\xa0\x05\x91\xc0\x2d\xef\x70\xd0\xd9\x71\xda\x06\x41\x4a\x7c\xcc\xb9\xc9\x27\xd0\xa3\x24\x64\x12\x53\xa8\x63\xdd\x73\xbf\x99\x26\xa1\x8b\xd8\xef\xa1\x6e\x58\xff\x47\x5b\x1f\xaa\xab\x1f\x59\xb1\x7c\xb5\xa4\xb1\xe3\x5f\x0d\x13\x9b\xaa\xef\xab\xba\x04\x0d\xbb\xeb\x4d\x8a\xc5\xb4\xfb\xe7\xc5\xd3\x6e\x8d\x6a\x90\x3f\xd6\x4f\xb7\x9b\x1f\x7d\x07\x4b\x38\xd4\x19\x73\xa0\x5e\x9d\xe8\xdc\xe4\xf1\x23\x12\x33\xa7\xd7\x70\x86\x62\x07\xc7\x53\xe7\xda\xf8\x1e\x01\x41\xf4\xe0\x59\x54\x4d\xa6\xb2\xb3\x28\x2c\x50\xdb\x86\x7a\xbf\x28\xaf\xea\x5f\x24\xe2\x56\xb9\x01\x81\xa9\x50\x37\x9b\xf7\x2e\xb4\x99\x44\x09\x45\xe4\xed\x6c\xc2\x3c\x89\x12\x2b\x10\xd4\x38\x51\x29\xf7\x67\x4e\x04\xc1\xc8\xf5\x78\x43\xf3\xad\x54\x59\x25\xde\x97\xdb\xf5\x7e\x75\x7b\x58\x3c\xdd\x1e\x16\xdb\xed\xf3\xe6\xbb\x2f\xe2\xa5\x49\x2c\x6c\xbc\xba\x86\xe6\xbe\x02\x18\xd2\x3a\xd3\x24\x96\x36\x90\x63\xad\xc8\x81\xe2\xa0\x6b\x4f\x62\x85\xe9\x8e\x57\x31\xd9\x96\x92\x34\x22\x18\x25\x7f\x7e\x98\x27\xa5\x1b\x44\xde\x12\x11\x51\xdc\x3a\x5e\x8a\x3b\xac\x02\xc4\x47\xb0\x02\x89\xf3\xc3\x28\x62\x6e\x8b\xe2\x31\x5e\x3f\x21\x1a\x9e\xf6\x4d\x79\x48\x7a\xae\x2e\x1f\x54\xb9\x0a\x1a\x26\x52\x59\x9b\xce\x85\x4a\xb2\x2b\x63\xf6\x2b\xdc\xd2\xf4\x3e\x3a\xc2\xf9\x08\xed\x37\xee\x0b\x6b\x69\xa2\xb4\x25\x3d\xdf\x6e\x36\xdb\x8d\x8f\xe4\x27\x3a\xe2\x81\x65\x3a\x11\xb9\x8d\x45\xfd\x80\xec\xf8\xda\xcd\x38\xcd\x15\x2a\xe1\x2a\x91\xab\xa9\xf8\xca\xe4\x97\x75\x9a\x84\xb2\x8b\x6c\x57\x9f\xdb\xd6\x8e\xec\xee\xa3\x03\x4c\x78\x63\xdd\xee\x1a\xd3\x06\xcd\xe7\xd8\x05\x49\x20\x8c\x78\x9f\x17\xbe\xf1\xd8\xd5\xc9\x6a\x84\x50\xd0\x4e\x4b\xa7\xcc\x75\xf9\xde\xcd\x17\xe0\x49\xec\xc5\x18\x2c\xbf\xdd\x10\x16\x92\x40\xcc\x63\xed\x29\xed\x26\xfc\xbe\xe3\x33\x38\x01\xb0\xf9\x11\xa1\xf5\x42\x7b\xd4\x91\xfb\xe7\x57\x7b\xa8\x91\xb6\x9e\x54\x89\x3c\xff\x31\xa1\x6b\xf5\x5d\x34\x55\x21\x5a\x63\xa7\xb3\x28\x3e\x9f\x06\x9f\xc8\x40\x18\xa7\x83\x84\xe1\x33\x14\x83\xb7\x33\x46\x22\x06\xfb\xee\xf2\x35\x61\xfd\x97\x10\xb8\x2f\xfe\xbd\xe2\xca\xa0\x29\xa1\x06\x21\x8e\xfe\xf1\x2d\x2a\x76\x76\x76\xa7\x24\x8c\xd1\x0e\x79\x14\x75\xeb\x9f\x96\x1a\xec\x4e\xb4\x1b\x90\xfa\xb9\xae\x94\x59\x3e\x82\x76\x21\x2c\x36\x6e\xf4\x67\x6d\x8a\x94\x86\x80\x40\x7b\x2d\x3e\x19\x96\xc6\xfe\xe6\x1b\x4c\x88\x52\xa4\x75\x53\x56\xff\x1e\x62\xf3\x53\x96\x44\x58\xda\x73\xb6\xca\x09\x96\x18\xc4\x46\x09\xba\xe8\x6a\xca\xa4\xa5\x29\x3f\x65\x45\x1f\x47\x2f\xab\xa9\x04\x0b\x4d\x83\x88\x63\x0d\xfa\xfd\x07\x62\xde\x44\x8f\x2a\x4e\x83\x98\x22\x91\xb0\x71\x6a\x07\xad\x61\x99\x15\xbd\xf6\x20\x4d\x83\x84\x53\xb7\xe2\xc9\x87\x8f\xef\x4c\xde\x30\x50\x5a\x7a\x8f\xe1\x20\x3c\xef\x35\x4d\x43\x13\xe0\x6a\x6b\x5d\xf0\x7a\x58\xc0\x45\xd3\x88\x13\xdc\xbb\x31\xa1\xf0\x5c\x5e\x72\x68\x1a\xf0\xc8\xe7\xae\x53\x12\x46\x43\xdd\xc3\x45\xde\x28\xcf\x95\x3f\x1d\xe5\x28\x11\x91\x63\x04\x6f\xff\xba\x83\x2b\xdd\x2a\x9a\x72\x01\x88\x25\x7d\xcd\xfa\xf0\xda\x28\xe5\xcf\x88\xef\x69\x40\xf4\xdb\x97\x95\xe6\xc0\xb4\x8c\x57\x90\x70\xff\x7a\xd6\x32\x3a\x63\xc1\xa4\x31\xb1\x8a\x64\xe8\x81\x7e\x2f\xd1\xad\x1f\x3b\x1a\x69\x4c\x14\xa2\xd6\xce\xe2\xf3\x50\x8d\xa0\x5b\x69\x1c\x0a\xf4\x52\xd0\x96\x7d\x82\xe6\xbd\xac\xde\x1c\xf7\x81\xef\x91\x00\x02\x73\x1d\x2e\x6a\x37\x10\x4d\xf7\x3d\x24\xc3\x51\xbe\x2f\x73\xfd\xef\x4b\xd1\xa1\x8c\xd3\x84\x5a\x09\x19\x74\xf0\x5f\x0a\x65\xa9\x78\x6f\x32\x3d\xd2\x3c\xa7\x69\xc2\x19\xd6\xb2\x9e\x70\x04\xfe\x00\x29\x64\x37\x77\x12\x88\x13\xe2\x89\xe1\xf2\x5c\x54\x13\xcd\x7c\xd4\xd2\xf1\x03\x9a\x26\x56\x15\x05\x6b\xdb\x4f\xe7\x06\x0e\xf1\xc8\xb3\x4c\x53\x1d\x29\x3d\x48\x24\x0e\xd1\x29\xae\x8b\xe0\x80\x9e\xc4\xe3\x7a\xf9\xbc\x39\xdc\x6e\x1e\x1e\x16\xcf\xbb\xd6\x09\x3a\xdc\x3c\xed\xff\x3c\x6c\x9f\x57\xbb\xc5\x83\x37\xcb\x52\xc1\x8d\xe7\xca\xbd\x6b\x8d\x0a\xa8\x5c\xb0\x76\x3c\x44\x52\xc5\x98\xfe\x50\x0e\xb9\xd1\x76\x5d\x77\x22\xd4\xdd\x54\x54\xb1\xd0\x2e\xfc\xfa\x6e\x65\xb1\xdc\xb3\x51\xd2\x75\x11\x42\xd8\xda\x57\x1c\x4e\x94\x19\xed\x2a\x5c\x27\xaf\xa2\x09\x58\x46\x25\x9f\xf3\xd4\xa7\xac\x68\xfb\xb1\x69\x47\x11\xe2\x44\x7c\x86\xfa\x72\x1a\x20\xb4\x07\x73\x48\x0b\x09\x72\x30\x72\x93\xb4\xe5\x64\x8f\xd3\x8a\xdb\x60\x1c\xa8\xd7\x22\x53\x22\xf7\x4c\x9b\xbe\xdd\xc4\xa8\x7a\xf4\xaf\xfd\xb7\xfd\x1f\x4f\xfe\xaf\x26\x22\x51\x7f\x96\x6d\xcb\x37\xb7\x26\xe6\x77\x3c\x13\x33\x95\x7a\x9c\xad\xaf\xc4\x08\xba\x7b\x69\xab\x30\x26\x94\x25\x73\xe9\x06\x59\xd0\x54\x32\x9b\x03\xfd\x09\x95\xce\x00\xa5\xb6\xbc\x1f\x27\x98\xd0\x81\x70\xc4\xea\xbb\x5c\xd4\xaf\x83\x26\x15\xe3\x85\x37\x19\x6e\x10\xb7\x48\x03\xd3\xa3\x22\x44\xc0\xac\xe7\xf2\x5d\x20\xb9\x77\xc7\x07\xfd\xcb\x8c\x84\x08\x82\x18\x03\x6d\xb7\x55\x99\xe9\xd5\x7a\xeb\x25\x3e\x47\x03\x2a\x82\x00\x10\x34\x7b\x14\xf5\x33\xfc\xa7\xfb\xc5\x24\xc5\xf8\xe3\xf6\x79\x75\x40\xa6\x99\xe0\xc7\x6a\xf5\x87\x95\xdd\xeb\xfa\x18\xcb\x5c\x27\xb4\xfe\x6e\xb5\x22\xca\x6a\x26\x97\x2a\xc2\x14\xb0\x40\xf7\x61\x00\xb8\x15\xa1\x88\x10\xcf\x03\x96\xa4\xd7\x06\x5a\x70\xa0\x7b\xe9\x56\x2a\x42\xc5\x95\xad\x2f\x87\xc2\x7e\xb1\xf1\xa7\x12\xa1\xd2\x18\xe5\xfd\x76\xbb\x1c\xda\xaa\x22\x22\x3e\xfc\xdf\x5c\xaa\x62\x20\xb0\x37\xbe\x3c\x52\x54\xb9\x98\x55\xbb\x3d\xb2\xee\x72\x6d\xd1\x2d\x28\x49\x83\x2a\x92\x97\xab\x3a\x59\xd7\x95\x07\x09\xfa\x79\xad\xf9\x09\xd5\x29\x1b\x56\x76\xce\x7f\x17\xee\x72\xcb\xe7\x4e\x58\xb4\xfd\x98\xa3\xf3\x45\x70\x65\xcb\xd9\x4f\x70\x14\xb2\xac\xeb\xb9\x5a\x0b\x11\x27\x06\xa3\x0b\x15\x98\xee\x4f\x9a\xe3\x44\x5f\xfd\xe3\x65\xbd\x7d\x5c\x3d\xed\x0f\xcf\xab\x1f\x8b\xe7\x5b\xcf\xda\xf3\xf4\xf2\xd8\x7d\xbf\x84\x84\xc6\x62\xeb\x5f\x61\x5c\x13\x23\x92\x20\x0e\x7a\x74\xfc\xb1\x2c\xf0\x78\x7f\x9a\x78\xd4\x22\x11\x16\x5b\x56\x43\xb3\x2d\xab\x91\x76\x3c\x15\x29\xd5\x18\x4e\xd8\x56\xaa\x68\x06\x18\x1f\x91\x2a\x13\x84\x5d\x11\xa2\x9e\xc7\x57\x09\x41\x63\xd2\x51\xd3\xb8\x31\x6a\xbb\xf7\x67\xbb\x10\x0a\x3c\xf5\xad\x35\x22\xcb\x6a\xb7\x9d\x3c\xa2\xa4\x81\xb0\x24\x7b\x1f\x53\xae\x5d\x2a\x64\x40\xf0\x8c\xf2\xdb\x58\xb7\xdd\x6d\xcc\xae\x29\x2b\x31\xb5\x14\x84\x8c\x38\xb5\x5b\xf8\xd3\xe1\x66\x7d\x7b\xb8\x7b\x5e\x2c\x0f\x37\x9b\xbd\x7f\x22\x19\x1b\xf4\xb5\xed\x79\x73\xce\x85\x82\x83\xe5\xfc\x52\xd3\xba\x14\x21\x53\x8a\xe6\xb1\xc9\x3e\xac\x06\xc8\x7d\x25\xce\xaf\x99\x9a\x05\xc1\x08\x69\x22\xa4\xb6\x34\x00\xb5\xc7\x41\x09\x45\x28\xce\x3d\x47\x45\x3f\x8f\x2f\x9b\xf7\x4c\x84\x8a\x84\x65\x63\xcd\x9a\x4f\x57\x7b\x37\x53\x0c\x2d\x14\xb7\xfa\xa1\xba\x3d\x15\x2a\x78\x5e\x7e\x1f\x9d\x7b\x42\x25\x56\x80\x09\xb5\xcf\x1b\x40\x7e\xe9\xf1\x2d\x24\x75\x30\x1d\x64\xbc\x1e\x72\xa6\xf9\xf6\x20\x40\xc6\x10\x94\x2e\x6d\xc4\x38\x2a\x25\x29\x44\x26\x71\xc6\xd9\x95\xcf\x29\x59\x62\x57\x1f\x14\x7a\x87\xe0\xa9\x61\x3d\x93\x0c\xb8\x20\x0e\x6b\xe9\x1f\x6b\x9a\xed\x96\x61\x10\xc7\x71\xcf\xcd\x37\x74\xf0\x65\x98\x10\x92\x78\x30\xa0\xd3\x65\x1f\x2a\xed\x8f\x9f\x25\x94\x01\x96\x08\xf8\x14\x4a\xbd\xec\xef\x14\x45\x2a\x1c\x90\xcd\x29\xd1\xb7\x48\xcb\x0d\x81\xd9\xd6\x31\x14\x42\xf2\xc4\x2e\xa1\xdb\xcf\x63\x56\x94\x23\xdd\x39\x2a\xb9\xb0\x8c\x8f\x79\xa9\xde\xee\xfb\xe5\x25\xb9\x0a\x30\x38\xd0\xce\x60\x0f\x2e\x18\xb3\x59\x51\xdf\xd3\xe9\x72\xb7\xfe\xc1\xdd\x65\x4a\xfc\xed\x1d\x41\x99\x90\xd4\x73\xba\xf5\x00\xef\xd9\x45\x2b\x5b\xbb\x0c\x25\xae\xb2\x8f\x6e\xa2\xcb\x44\x52\xfc\xe3\x01\x3d\xf4\x5b\x90\xcd\xf3\x48\x98\x67\xfa\x45\x12\x9d\xc6\x41\xb7\x77\x23\x94\xed\x1a\xc2\xf4\x3f\x89\x33\x53\x65\xca\x08\xda\x0f\x2e\x71\xbc\x17\xc5\xdb\xd0\x45\x74\x61\x46\x29\x94\xf1\x65\x7e\xb7\x60\xc4\x25\x6f\x7a\x9c\x9e\x94\x71\x8a\xfb\x7d\x7e\x51\x6f\x9f\xb7\xe5\x71\x00\x78\x92\x32\xe1\x42\x8e\x89\xd5\xfe\x1e\x26\x4e\xaa\x24\x34\x56\xec\x18\xd3\x77\x65\x3d\x65\x51\xed\xfd\xbd\xe9\x95\xa9\x40\x8c\xa4\xbc\x7c\x4e\x16\xf5\x78\xbc\x95\x8a\x90\x7b\x02\xcf\xa9\x9b\xa1\x82\x20\xd2\x09\x5f\xfd\xcc\xb5\x83\x29\xb5\xb4\xb9\x9e\x93\xf8\x70\xbb\xec\x08\x04\x23\x35\x68\x6a\x43\x0e\xe7\xac\x11\xf9\x56\x35\x37\xd9\xb9\x5b\x61\xc0\x18\x26\x4e\xbd\x48\x76\xbb\xe3\x8d\xb4\x0d\xfe\xe2\xdf\xee\x36\x1c\x6c\x90\xbd\x23\xb4\xf2\x66\xe2\x15\xc5\x28\x95\x20\x45\xea\x01\xf1\xfb\x0f\x5f\xba\xd5\x3d\x12\x68\x64\xd7\xc2\xbf\x5b\x18\xc6\x70\xdd\x28\x42\x13\x64\x84\x53\x98\x32\xcd\x2d\xf8\xcc\xb7\x31\x5b\xa1\xee\xb3\x3f\x98\xf8\xbb\x0c\x59\x2d\x14\x09\x6c\x6e\xd1\x9d\x5e\x59\x71\x1c\xf3\x5c\x53\x45\x64\x80\x6b\x1d\xcd\xe8\xf9\x0f\xa7\x08\xa4\x98\xe8\x40\x92\x9d\x4b\x61\x59\x78\xc7\x8b\x49\xd1\x58\x20\x52\xfc\x52\xd8\x1d\x05\x1e\xb3\xbc\xdd\x83\x7a\xc8\xae\x62\x21\xc1\xc4\xec\xfd\xed\xf2\xaf\x71\x47\x8a\x71\x8a\x00\x78\x9d\xd5\xcd\x17\x7c\x6b\xae\x67\xa8\xb9\xd3\xf4\xcc\x30\xc3\x7f\x23\x6a\xe4\x43\xf4\xbf\x1b\x19\x89\xcc\x9a\xce\x56\x3f\xe8\xf2\x22\x73\x38\xd4\x97\xd3\xe1\x2c\x32\x7d\x30\x55\x79\x3a\x34\xaf\x70\x90\x63\x15\x33\x77\x39\x27\x02\x43\xfb\x3a\xfb\xf9\x5b\x8f\x28\x49\xba\x56\x15\xf7\x30\xa5\xc7\x52\xe2\x56\xf1\x17\x60\x9c\xd1\x8b\xf2\xa0\xc3\x4d\x5a\xdd\xfd\xe1\xae\xae\xb8\x4c\x91\xa3\xeb\x06\x05\x62\x96\xd5\xe7\xb9\x29\xd5\x48\x30\x87\x2a\xae\x63\x2c\xcc\xbc\xc9\x1a\x29\xe4\x68\xe3\x55\x49\xcc\x99\xbb\xfb\x4b\x61\x21\x19\x57\xb6\x99\x4a\x62\xab\x67\x67\xa9\xfe\xb1\x7c\x7f\x08\x1c\x53\x49\xc2\xc0\xb3\x6a\xdd\x43\xb3\x14\x35\x2c\x86\xa4\x63\x6d\x8f\x00\xdd\x63\x51\xd8\x3d\x60\xa0\x69\x38\xff\xd1\x52\xc1\x91\x77\x2e\x2f\x95\xc8\x91\xae\x66\x3a\x27\xa6\x31\xcb\xf1\x9f\xdd\x6d\x24\x8d\x9c\x55\x69\x37\xe9\x45\x85\xbe\xfb\x55\x8c\x6b\x3e\x92\x7b\x15\x26\x1d\x09\x2d\xb7\x77\x4f\xd0\x4f\xb6\xe4\x78\xdf\x61\x48\x33\x3a\xfa\xa8\xee\xa0\xee\xff\x19\xde\x04\x6c\x69\x3f\x4a\xb2\x39\x7d\xcb\x45\xe3\xaa\x88\xeb\x9b\xcf\x67\x84\xe9\xb6\xee\xc8\xfc\xc3\x8d\x26\x8b\x16\x96\xc2\xcf\xc2\x72\x5a\x1b\x68\x52\x5e\xaa\xb4\x24\x81\xab\xcd\x3b\xef\x5e\x33\xf0\x4a\x65\x54\x69\x48\x10\x21\x68\xb2\xe3\x2b\xa2\x87\xd1\x8e\xba\x92\x11\xa7\x0a\xa8\x8d\x95\x65\xc5\xbf\x41\xfd\xb2\x10\x40\x81\x01\xd5\x3d\xcf\xcd\xe5\x73\x60\x3a\x2b\x13\xd8\xb8\x87\xc7\x3c\x8c\x35\x52\xa9\x32\x11\x0d\x98\x9f\x75\xc5\xc5\xe9\x2b\xcd\x50\x7b\x28\x93\x5a\x0c\xcd\xe5\xac\x71\xeb\xb9\xc6\x75\x69\x1a\x26\x78\xf0\xbd\x43\x76\x57\x56\xff\x14\x97\xdf\x7c\x83\x70\x80\xb9\x76\x8e\x59\x3c\xd0\x84\x06\x9e\x6a\x2a\x63\xd4\x91\xdf\xff\xee\x9d\x2a\xcd\x78\x8a\xf6\x91\x11\x75\x3b\xdf\x5f\x91\x19\xd1\xb7\x69\x81\x70\xdf\x4b\x71\x87\x04\x07\x33\x9e\xaa\x0e\x22\x66\x39\xac\xd1\x12\xfa\x26\xaa\xd6\x22\xbb\xeb\x34\x29\xa8\x0e\x78\x84\x91\x4a\x03\x33\x65\x63\x7d\x1f\xb4\x67\xbd\xb2\x94\x13\x8a\x9f\x55\x5f\xf0\x97\xc4\x5c\x41\x3f\x41\x8c\x35\x93\x47\x8b\x46\x07\x9a\x81\xe5\xaf\xb1\xe4\x1e\x59\xd9\x29\xb0\xfa\xa7\x0b\xa9\xe5\xa9\x5a\x3f\x97\xb2\xec\xfe\x18\x49\x50\xbe\x18\x02\x31\x0f\x43\x82\xea\xf1\xa3\x87\x92\x60\x85\x61\x71\x39\xb5\xbb\x5a\xbd\xcf\xf2\xdc\xa5\x24\x6d\x5c\x76\xdc\x3d\x22\x2c\x0e\x46\x6c\xb6\x7e\x77\xd3\x51\x60\x10\xac\xef\x03\x93\x0f\xa5\x7a\xbb\x9c\x47\xb8\x2c\x1d\x29\x82\x89\x3f\xe3\x44\x2f\x16\xc7\x3e\xca\xa2\x23\x25\x71\x0b\xfd\x09\x15\xd2\xa8\x61\xb4\x6b\x3c\x22\x3c\xb2\x5a\x98\x12\x79\x99\xfd\xe3\x4d\x57\xb5\xef\x1c\x6b\x21\x7c\x2a\xac\x10\xb9\x1d\xbb\x71\x28\x57\x73\xa5\xa5\x55\xa6\x7b\x77\xb3\x7e\xfc\xc2\x71\x90\x22\x03\x94\x7d\x0f\xcb\x76\xf0\xc5\x50\xc6\x52\x1b\xd3\x57\x52\x5f\x8a\xe6\xb6\x0f\xed\xeb\x84\x10\x07\xe8\x69\xfd\x32\xaf\x95\x3e\x01\xdf\xea\x84\x50\x4a\x3d\xf0\xa1\x9a\xb8\xc6\x3a\x11\x3a\x54\xe3\xf2\xa0\x61\x85\x83\xeb\x95\xea\x08\x9d\xb0\xf6\x14\x78\xc6\x28\xa8\xa3\x01\x70\xed\x82\x5a\xed\xbb\xec\x74\xce\x0f\x36\x8f\x1a\x2e\xb3\xca\x71\xfb\xcf\xbf\x9b\x48\x43\xf0\x45\x03\xab\x9d\xea\xc1\x82\x5a\x08\xf0\xa4\x30\xff\xb8\xe0\x22\x6a\xcf\x75\xcb\x99\x31\x79\x30\x61\x08\x7a\x5d\xbd\x20\x75\x07\xc8\xfc\x0a\xd6\x33\x6b\x03\x6b\x49\x6c\xf0\xfe\xbd\xcc\x4d\x38\x76\x6f\xb4\x24\x49\xec\x29\x45\xda\x03\x72\x99\x35\xd9\x7f\xa1\x18\x5a\x7c\x57\x77\x33\xc4\xe1\x23\xd7\xa7\x53\x59\x35\x22\xaf\x37\xc5\xfe\x15\x6e\x44\xd3\xe4\x60\x70\x6f\x1e\xaf\x5e\xc9\xec\xce\x82\x24\x78\xf6\x24\xbb\x0c\x70\xa7\x5a\x91\x10\xcd\xc5\xef\x99\xac\x44\xd1\x89\x49\x50\xad\x22\xca\x6c\x08\x09\xfd\xf8\xdd\x6e\xeb\x19\xb7\x27\xbf\xa0\xe2\x10\xe9\x05\x85\xd6\x88\x9b\x78\xb0\xbe\xcd\xfc\x66\xa2\xa4\x44\xa2\xab\x6f\xd9\xf1\xf5\x77\x4b\xa9\x6e\x51\x0b\xfe\x67\x81\x4b\xe2\x62\x2a\x7f\x34\x6a\x2a\xa6\xdd\xef\xe0\xda\x10\x2d\xbc\x91\x33\x30\x4f\xb4\x61\x20\x5c\x46\xee\x09\xde\x7d\x11\xdb\xe4\x99\x4d\x22\x11\x8b\x86\x2e\x59\x83\xe7\x84\xb6\x14\x7d\xb3\x03\x0f\x84\xda\x42\xec\xbc\x3c\x22\x9d\xf7\x2f\x3f\x3a\x10\xc3\x98\x15\xc8\xc7\x50\xb3\xad\x66\xf7\x3b\x0b\xb0\x34\xf0\x25\x30\x37\xa2\xce\x94\x55\x32\xbe\xd6\xa2\xa4\x10\x24\x90\x74\xc4\xc5\xd6\xa2\xf1\x2d\x4a\x63\x60\xbf\x3d\x0b\x6e\x27\x93\x17\xa2\x20\x09\xdc\x07\x99\x08\x19\xfe\xdf\x69\x47\x8d\xbe\xff\xe1\x2f\xfc\x2c\x88\x34\x41\x5c\x8d\x8b\xd1\x1f\x76\xfb\xc5\xf3\xfe\xf0\x63\xb5\xfa\xc3\x9f\x6e\x10\x01\xc3\x44\x62\xfd\x2a\x2a\x98\xc8\xed\x51\xe0\xa9\x44\x9f\x40\x8b\x46\x3c\x42\xf5\x96\x77\x98\x93\x2f\x14\x1d\x28\x70\x19\x61\x3a\x7d\x24\xb5\xfe\x45\x40\x1e\x62\x9e\x60\x65\xe6\xbd\x38\xc9\xdc\xcf\x25\x48\x38\x97\xe0\x37\x21\xcc\x6f\x62\x85\x74\x56\x16\xcb\x4e\x4a\x86\x42\xd2\xfe\x9f\xcf\x6d\xe4\x65\x95\xcc\x55\x66\x43\xca\x34\x46\x2d\x3b\x6c\xdb\xa7\x3d\x07\xe7\x47\x36\xe5\xd2\xdf\x13\x13\xcf\x56\xaf\x00\x11\x14\x97\x6b\xa6\x7f\x0a\xa9\x64\x38\xbf\x56\x16\x73\x7e\x15\xcb\x9a\xff\x15\xc1\x64\xe2\xb0\x59\xe2\x73\x63\xd6\xcb\xcd\xca\x4b\xdd\x53\x50\x84\xa2\x35\xf0\x6d\xf1\xf2\xaf\xee\x6f\x51\x8a\x13\xea\x77\x78\xfb\xcc\xf3\xc3\xba\xce\x45\xa1\x0f\xeb\x42\xf9\x0e\x9a\x18\x1e\x76\x7c\xaa\xab\xd3\x39\x2f\x3f\xa7\x01\x2d\xd0\x21\xc7\x44\x8e\x4d\x1b\x75\xf3\x5a\x87\x31\x92\xa1\x8a\xa2\xb5\xbc\xb6\x65\xdf\x20\x81\x75\x56\x5b\xbd\x28\xb4\x27\xaf\xcb\xa0\xde\x98\xdb\xa1\x4c\xcb\xe4\xdf\x09\x51\x26\x05\xa0\x84\xf5\x7c\xaf\xab\x8f\x06\x8a\x7a\xc0\xc8\xe6\x7b\xf1\x30\x72\x3e\xea\xa1\xf5\xe8\x0f\xa2\x92\x59\x53\x5b\x9e\xc6\xc9\xcb\x80\x4c\x6d\xb9\x75\x79\xdc\x89\x1c\x96\xe2\xfc\x0c\x42\xbd\xc2\x17\x5b\x30\x18\x4a\x0c\xe9\xe8\xa0\x77\x90\xfb\xd8\x33\x98\x24\x40\xc7\xe1\x56\x34\xc2\x16\x0d\x2d\x8a\x12\x5d\xac\xaf\xd8\xa0\x07\x90\x31\x30\x26\x36\x33\x55\x55\xe3\x37\x33\x24\x60\x58\x28\x7c\x93\x35\xb7\x8b\xcd\x70\xdf\x33\x44\xc4\xe8\x96\x15\xa5\x86\x43\xd5\x1a\xe4\x07\xf5\x9a\xe5\x13\x2b\xc1\x10\x19\x20\x96\xe0\x52\x48\x2b\xbb\x9a\xc1\x14\x54\x6d\x28\xb5\x12\xa6\x0e\xfd\xf1\xb9\xdc\x6c\xbe\xf0\x3f\xfd\x05\x82\xa2\x69\x26\xf1\x18\xb2\x27\xf9\xe4\x77\xa9\xb4\x34\xff\x36\x05\x35\x2c\xfd\x9a\xdc\x8b\x31\xa6\x5d\x5e\xfc\x07\x64\xa3\x60\xa8\x61\x22\x45\x37\xe2\x30\xf0\x3d\x47\x82\x73\xbd\x07\x6a\x98\x12\xc8\xad\x76\x29\xbe\xce\x49\x1a\x06\x1a\x0f\xb9\x5e\x32\xac\xaf\xcd\x59\x15\x7a\x80\x1f\x34\x41\xc4\x11\xed\xb4\x5c\xec\x0f\x77\xeb\xe7\xdd\xbe\x6b\x48\x14\x46\x90\xe4\xa5\xd0\x79\x56\x1c\x47\x9a\x19\xd4\x04\x26\xc0\x5c\x82\x0f\x8b\x2e\xa1\xa8\x4b\xdc\xc3\xfa\x00\x9c\x09\x8c\x09\x1d\x4d\x15\x72\x28\x3e\x97\x79\xee\xd7\x8f\x09\x49\x82\xdb\x58\xf3\xd6\xfd\x25\xa5\xd4\xed\xf0\x77\xd9\x4f\x34\x6e\x1d\x00\xeb\x4b\xa9\xa9\xf9\xc8\x93\x09\x35\xf3\x15\xea\xad\x1f\xe4\x39\x51\xc7\x9f\x84\x53\x82\xb3\x0e\x0a\x8d\x7a\x5b\xa3\x84\xa0\xe1\x32\x42\x7e\xe3\x6b\x66\x94\xc9\x97\x8d\x99\xc6\xa9\xf7\xe7\x66\x9c\xad\x32\xb1\x50\x68\xd6\xa8\x52\xc3\xea\xe3\x5c\xb6\x36\x69\xb7\x3f\x9b\x44\xc4\xcc\x97\xf7\x38\x73\x60\x64\x89\x9a\x44\x0b\x34\x8c\xf7\xdf\x9e\x57\xbb\x6f\x9b\x87\x5b\x0f\x87\x33\xa9\x48\x50\x14\xe2\x09\xde\xbf\x89\xfa\xb5\x5d\x1a\x7b\x8c\x40\x77\x21\x2f\x93\x2a\x01\xa6\x23\x0a\xb2\x60\xf9\x2f\xf2\x57\xbf\xc4\x1d\x5e\x33\x3a\x8d\x07\x5a\x50\xab\x59\x7e\x23\xf2\xbc\x9c\x30\xf6\x7d\x11\x3c\xf8\x15\xbe\xd2\x08\x13\x92\x60\x28\x22\xf3\x50\x1e\x87\x61\x1e\x23\x83\x14\xeb\xfd\x3b\x28\xfc\xcf\xb9\xb8\xe4\xd7\x4c\x0d\x46\xa6\x3d\x7d\x87\x3e\x65\xc5\x43\x39\x01\x40\x1a\xc5\x6c\x51\xd2\x53\x79\x19\x41\xe5\x8c\x16\x89\x43\x06\x7e\xce\x46\x43\xe7\x12\x83\x8c\x90\x94\xe2\x5c\x14\x5a\x3b\x89\xa4\x39\x76\x88\xb6\x9f\xc5\x64\x22\xd3\x8b\xcd\xef\xfd\xe6\x9b\x94\x63\xd0\x47\x07\x6a\xfb\x7d\x35\x7a\x62\x46\x68\x6c\xab\xf1\x6e\x77\xae\xf4\x72\x52\xb6\xcf\x08\xd3\x0a\x0f\xb7\xbb\xc5\x72\xbf\x79\x3e\xc4\xfe\xce\x41\x6a\xb0\x5c\x32\xab\x5d\xad\xf5\xac\xfe\x3b\x23\x81\x90\x58\xdb\xbb\xb8\x59\xcf\xc2\x6a\x19\x09\xc1\xf8\xb2\xed\x47\x98\x29\x44\x67\x24\x0a\x0d\xd2\xf9\x5d\xce\xda\xe7\x5d\xfc\xa6\x72\x65\x08\x33\x12\xc5\x52\xc5\x1d\x2e\xf1\x19\x7e\xa2\x3c\xe7\x80\xd1\xcb\xad\x17\x87\x8e\x61\x84\x43\x82\x28\xbb\x4b\xa1\xb3\x5a\x8c\x4b\x8d\x5c\x97\x38\x66\xc2\x43\x00\x5e\xce\xff\x1a\xf8\x77\xb3\x93\x85\x91\x58\xa4\x68\x73\x62\x4c\x71\x5d\xbc\xec\xba\x4f\x92\x50\x45\x2d\x18\xca\x4a\x59\xbb\x29\xe1\x5b\x99\x8a\x9d\xfa\xcd\x6d\x59\xe0\x79\x8a\xd5\x6a\x23\x2c\x8a\xef\x0b\x40\x9d\xfa\xd0\x44\xea\x98\x91\x14\x52\x27\x53\x59\xe8\xaf\x4a\x7d\x19\x11\x04\x10\x50\xf3\x50\x1e\x8f\xa0\x91\x5f\xef\x57\x71\xe3\x49\xf4\x8e\x11\xc1\x98\x0d\xac\xb6\x9b\x2e\x54\x1e\xcc\x3e\x03\xcd\x66\x44\x86\x02\xe3\x0f\xfb\xe5\x76\xe9\x9f\x52\x51\x8e\x68\x15\xc4\xa7\x67\xc5\x71\x77\xee\x54\x88\x18\x51\x71\x1c\x88\x21\xcb\xc5\x1b\x60\x68\x06\x54\x76\xbe\x3a\xa4\x19\xd1\x91\x46\xe3\xef\xcf\xac\xec\xf7\x33\x46\x74\x6c\x45\xa9\x9e\xba\x7c\xd9\x78\x08\x74\x12\x23\x51\x06\x42\x19\x0e\xb7\x8b\x3f\x83\xc3\xed\xcb\xf3\x40\x60\x98\x11\x9d\xa6\x98\xd4\x78\x14\x59\xfe\xed\x52\x37\x39\x4c\x24\xb8\x19\x81\x30\x44\xff\xa3\xf5\x1c\x7e\x09\xc3\x60\xa4\x75\x1e\xda\x31\xff\x4f\xfd\xaa\x67\x45\xdc\xdd\x96\xc6\x08\xf0\x14\x29\x29\x16\x0f\x0f\x9b\xe5\x61\x71\xfb\x7d\xbd\xdb\x3c\xef\xba\x9f\x94\x29\xee\xf2\xd5\xa5\x98\xc1\xdc\x33\x02\x8e\xc3\xc6\x17\xc9\x1e\xf4\x95\x30\x2f\xaa\x40\x58\x1a\xce\xb2\xb8\x9c\xb6\xd5\x08\x74\xf5\x25\x4a\x71\x3c\x80\x86\x32\x62\xf3\x8e\xef\x50\x37\x8b\xfa\x6d\x54\x57\xdd\xb6\x0b\x0c\x85\x59\xe3\xc9\xe2\xc6\xbe\x88\xc3\xce\x9d\x14\x8c\x98\x88\x21\xdb\xe0\xfb\x6b\xb9\xae\xf7\xaf\x43\x0e\x61\x46\x4c\xaa\x8d\x8b\x00\xdc\xf9\xa0\xab\x43\xfa\x8f\x85\x2b\x18\x31\x1a\x7c\xde\x72\x07\x79\xde\xd3\x1a\xd1\xc9\xe2\xa5\x84\x5b\x30\xee\xef\x2f\x0f\xeb\xc5\xd3\x01\xc7\x7f\x38\x23\x28\x49\x6c\x31\x21\xf2\xa6\x0f\x52\xcc\x8c\x12\x1d\x79\x79\xce\x67\x31\xd1\x51\x67\x94\x00\xf1\x88\xcc\x76\xe1\xfb\x3f\x53\x46\xad\x04\xe2\xf3\x63\x03\xfe\xa0\x47\x72\x4d\x2b\x82\x80\xc2\x21\x83\xc4\x14\xa3\x54\x05\xe8\x5b\x40\x25\x5c\xb9\xcf\x9c\x7d\xcc\x28\x63\x0a\xfb\xa1\x6d\x6b\x41\x11\x5f\x02\x46\x19\x65\x5a\x2a\x77\x86\x1e\x3a\x45\x23\xff\x93\x01\x8b\xd2\xc4\x86\x1b\x5d\xe0\xa4\x7b\xad\x20\x0a\x94\x18\xc4\x06\x6f\x3e\x47\x0f\x1b\xc4\x29\x86\xe7\x9d\x36\x62\x6d\x4d\x9a\x6e\xa1\xd3\x40\xc5\xba\xa3\x95\x76\x93\xb0\x8f\x72\x33\x1a\x1a\x1e\x59\x3a\xd9\x1f\x90\xfd\xd2\x05\x44\xc6\x04\x9b\xed\xbb\x54\xc5\xe5\xfc\xad\xcc\x35\xc2\x14\xaf\xa5\xa0\x7d\x7f\x2e\x65\x3b\x7b\x7f\x40\x6b\xe9\xfc\xad\x82\x7d\x46\xa3\x54\xe3\xd9\xe7\xf0\xf6\x36\x47\x30\x79\x0e\xa3\x12\xb7\x8f\x6f\x9e\x56\xfb\xf5\xe3\x6a\xb7\x79\xf0\x67\x00\xe5\x91\xe5\x2f\xf6\xf1\x4d\x4f\xed\x78\x5f\xe6\xfa\x0f\xf8\x9c\xd3\x49\x61\x94\xa7\x02\xbf\xa5\x0d\x36\xf8\xd0\x03\xde\x7a\xbf\x78\xdc\xfa\x7b\xc7\xa1\x2d\xca\xb3\x22\xb0\x37\xfb\xee\xef\xd2\xc4\x89\x0f\x2d\x7b\x72\x50\x0b\x08\xbe\x36\x92\x87\x06\x25\xa3\xa9\x48\x91\xe8\xf1\xf6\xc7\xcd\xde\x92\x11\xff\xdd\xa8\xdf\xe4\xeb\x08\xce\x75\xda\x03\x81\x3b\x83\x9f\x51\x21\x13\x60\x03\xde\xc7\x01\xed\xee\x20\xe5\x33\x7a\x2a\x49\x15\x2e\x8f\xc3\xd3\xe5\xb4\x31\xbb\xe6\xa2\xa1\x68\xea\xad\xe8\x97\x9b\x0c\x08\x96\xce\xcb\xa6\x47\xc7\xcf\x4f\x1b\x19\x81\x62\x03\x7a\x3f\x98\x32\x2a\xb5\x5d\xcc\xa0\x16\x5b\xd7\x03\xe3\x92\x51\xe9\xe8\x1a\xed\x59\x85\x41\xb6\x3c\x87\xca\xaa\x63\x4d\x83\x76\x73\x46\x1c\xd5\xa1\x0d\x41\x3b\xfa\xe8\xd9\x0c\xd5\x35\x3d\x00\xc6\xa2\xd0\x32\xb9\xef\x03\xcb\xad\xfd\x0b\x56\x08\xd8\x22\xd0\x1a\xd0\x37\x9f\x7b\x28\x44\xff\xc0\x90\x06\x31\x71\x1a\xaa\x95\x06\xac\xd3\xb3\x89\xfe\xbb\x72\xc0\x6b\xd1\xbf\x3e\xe8\x40\x59\xb9\xfc\xa7\xdd\x7e\xf5\xf0\x30\xda\x0f\x41\xc7\x61\xe2\x83\x5d\xcb\x4f\xd5\x1d\x8c\x14\x4c\x1a\x6a\x5b\xb6\x54\x75\xa9\x90\xf1\xad\x19\x25\x54\xd3\x5e\x60\xfd\x51\x9c\xcf\xad\x2d\x90\xfd\xd7\xdf\x85\x51\x4e\x94\x2d\x0a\xf7\xf2\x0b\x2b\x64\x03\xc1\x12\xc6\x69\x02\xf2\x3a\x9a\xc0\xd0\xfc\x07\x5b\x8b\x62\x77\xd3\x1b\x8f\xad\x63\x2c\x20\x46\x85\x5e\x30\xff\x2e\xab\x5f\x17\x48\x85\xdc\x35\xa7\x90\x20\x16\xa4\x14\x05\x5e\x3b\xd0\x4a\x60\x2c\x10\x91\x16\x8e\x57\xa0\xfa\x09\x1d\xcf\x1e\x63\x21\x09\x43\x57\x6c\xa0\x7e\x60\xca\xcc\xda\xb6\x33\xbc\x30\x8c\x85\xcc\x46\x21\x30\x85\x86\x27\xd3\x7c\xb7\x48\x62\x38\xea\x71\xf1\xcf\xe5\x62\xeb\x41\x7c\x1d\xf5\x13\x63\x21\x67\xc4\xd2\x31\xe7\xd0\xc0\x2a\xc7\x10\x5b\xeb\xf1\x8c\x82\xb9\xae\x73\x44\xac\x57\x82\x6c\xf9\x0e\x33\xf6\x6b\xe3\x85\x45\x69\x88\x67\xb1\xc9\x0a\xfd\x58\xea\x4b\x8e\x3c\x4d\xf3\xfc\x12\x8c\xf1\x28\x4c\x2d\x73\xc8\x07\xe8\x87\xf2\xc8\x26\x0f\x90\x84\x09\x1a\xbb\x4e\x44\x6e\x7c\x71\x12\xa7\xd4\xf1\xdf\x0f\xb1\x90\x8c\xa5\x3a\xc0\xc9\x26\x9a\x46\xa8\xb7\xc7\xb2\xa8\xaf\xf6\x4a\x26\xa2\x00\xb1\xae\x37\x9b\x1f\x7b\x6b\xd6\xfa\x86\x34\x42\x6b\xe4\x41\xd4\xcd\x63\x7d\xec\xfe\x6c\x9c\xb9\x8c\x0b\x6c\x5f\xbe\x64\x85\xe7\xd4\x1e\x6d\xfd\x4c\x12\x8d\x55\x2a\x27\x51\xd7\x96\x1d\x61\x52\x9f\xc0\x98\x4c\x52\x34\x8a\xc7\x2c\x6f\xb3\xbe\x0f\x53\xd4\x96\xcc\x9d\xc4\x87\x15\x7b\xec\x60\xaf\xfe\xc9\x94\x01\x04\xb7\x9c\x3e\x11\x39\x7f\x53\x95\xf5\xf2\xda\x17\x60\x3a\x8e\xe3\x9e\xb7\xdf\xfa\xb6\x33\x21\xaa\x6b\xee\xc2\x41\xde\xad\xbd\x8b\xcd\x08\x0d\xd1\xe3\x83\x1a\x0f\xc6\x4c\x44\xc1\xf9\xc0\x28\x91\xdc\xcb\xdb\xb7\x6d\x12\xbd\xb4\xa6\x53\x3f\xfa\x1b\xc2\x26\x2c\x20\x91\x41\xe2\xbc\xdd\x6b\xf9\xee\xaa\xea\x66\x55\x25\x26\x97\xd1\x30\x0a\x4d\x17\x3f\x5b\x8a\xd3\x59\x64\x47\xaf\x83\x7b\x15\x61\x1c\x7e\xc3\x80\x72\x86\x19\x31\x1f\x09\xc0\x02\x51\xbd\xfa\x38\x23\x6b\xdd\x5f\x9c\x6c\xfe\x1e\x26\x66\x8e\x8a\xa7\xec\x62\xf0\x03\x63\x92\xfa\x8e\x8c\x24\x68\x2a\xbe\xe3\x1c\xc6\x9c\xdf\xe8\xcb\x05\x8c\x47\xc8\x25\xf6\xe3\xc6\x61\xfd\x59\x10\x68\x89\x50\x3e\xef\xec\x76\x89\xa6\xbe\x1d\x8d\x9c\x77\x81\x24\xbf\x33\x52\x16\x2c\x08\x63\x8d\x67\xb6\x67\x94\x98\xe5\x0b\xf8\x5f\x05\x70\xdc\x8d\x23\x2a\x91\x75\xfa\x7b\x36\xc2\xc1\xb0\x80\xf3\x04\xdd\xa4\xac\xf6\x78\xbe\xce\xc4\x0b\x78\x9a\x22\x77\xf9\xa5\xc8\x9a\x3a\x20\x67\x1b\x9d\xb4\x52\x62\xae\x4b\xcc\x62\x44\x23\x7d\x5b\xef\xbb\x3f\xe9\x28\x72\x83\x6c\x95\xc2\xbc\x10\x06\xee\x66\x74\xbc\xe6\x83\x24\x4c\x91\xb4\xc4\xed\xa1\x68\x61\x8c\x32\x8c\x2c\x48\x03\x30\xa1\x0f\x4d\x02\x8a\xe7\xfc\x1a\x24\xeb\x17\x75\x90\xf2\x10\xf3\x96\xff\xb9\x40\xf5\xb9\x50\xf8\x14\x93\xed\x2e\x48\x95\x25\xbe\x71\x04\xf1\x96\xa2\xc1\xb7\xe9\xd0\x46\x5f\xb3\xa2\x79\xb4\x55\xdd\x78\xc0\x8d\x5f\x21\x05\x5b\xcd\x70\x44\x59\xbf\xbb\xaa\x3c\xfd\x01\xe3\x3a\x3c\x16\x08\x1e\xa0\xf2\x6b\x01\xef\x8b\xba\x2e\x55\x36\x25\xf9\x67\x81\x90\x69\x38\x14\xbf\xbc\x2b\xab\x6d\x55\x22\xd2\x04\xc4\xbc\x60\x12\x0b\x24\xa1\x68\x85\x6b\x50\xed\xd3\xd5\xab\xfd\xb7\x7d\xd9\xc7\x2d\x02\x19\x05\xc8\x9d\x25\x8a\x26\xfb\xcf\xc5\x63\xce\x58\xa0\x5a\xd3\x72\x00\x1e\xc0\x01\xed\xa9\xeb\xbe\x58\xf5\x2a\x4a\x91\x50\xe3\xa5\xc8\xf2\xd2\x32\x80\xed\x45\x96\x5f\xab\x8c\xb3\x40\x69\x4b\xda\x55\xf7\x3a\x1f\x5f\x1c\x38\x81\x16\x3a\x26\x5e\x7b\xa7\x3e\xee\x8a\x6b\xda\x09\xdf\x53\x06\x58\xa7\x88\x05\xb5\x07\x4b\xab\xd2\xbd\x92\x56\x16\x71\x96\x83\x69\x68\x38\xf9\x46\x10\x09\xac\x53\x3b\xe7\x5d\x7f\x48\x63\x09\x1e\xf4\xdc\x6e\x9c\xb3\xa1\xfc\xb6\x9f\xa1\xb1\x0d\xd8\x68\x80\xd3\x4e\x9c\x60\x99\x8b\xba\x5e\xe8\xf2\xdc\x80\x5e\x7c\x64\x93\x4a\xd5\x64\x72\x03\xa3\x24\x56\xa2\x1c\xf2\x01\x2c\x80\x05\xc6\x58\x76\x98\x23\x34\xbb\xd7\xec\x5c\xaf\xbb\x57\x09\x49\xcc\xad\x90\x1b\x1c\xd7\xf5\x0e\x9a\xcb\xb9\x6b\x49\x42\x4c\x2c\x2f\xaa\x06\xbd\xfe\xff\xa5\x45\x3f\xf7\x7c\x21\x91\x1c\x97\x60\x6b\x8c\x62\x22\x65\x29\x1a\x38\x96\x93\x14\x39\x0b\x29\xd3\x88\xef\x7c\xfc\x74\x80\xe4\x2f\x3c\xd2\x90\x8a\x18\x0b\x90\xef\x37\x0f\xb7\x87\xc5\xe3\xe6\xe5\x69\x7f\xf8\xe7\xd6\x2b\x11\xb0\x90\x45\x06\x61\x45\x16\xe2\x93\x95\xfa\x76\xa4\x65\xc5\x42\x16\x13\x3c\x8c\x07\xac\x80\xfd\xdd\x59\x4a\x92\x5e\x14\xea\x0e\xe0\xd7\x0c\xce\x2c\x64\xca\xc4\x1d\xdd\x44\x71\xe3\xa9\xc7\x59\x18\x84\x49\xc0\x7b\xff\x61\x9e\x42\x9d\x85\x81\x91\xbe\x3a\xb6\x3d\x39\x2b\x4b\x68\x7d\x2b\xa6\xe3\x13\x72\xab\x33\x0b\x3a\x6b\xb6\x50\xd5\xe5\xb5\xae\xf5\x4c\x81\x2b\x0b\x23\x1e\x47\xc6\x53\xf7\x5a\xa1\xb9\x5d\x76\x2c\x44\x73\xa9\xbe\xf0\x7c\xc2\x98\x02\x72\xbf\x67\xae\xea\xd7\x6b\x46\x4e\x9e\x28\x0e\x58\xe2\xc1\x56\x84\xfe\x09\x23\xf7\x27\x4c\x42\xae\xa1\x33\x3b\x5d\x48\xb3\x3b\x84\x07\xee\x4a\x98\x44\x21\x46\x40\xf6\x55\xe6\xf7\xc6\x30\x4d\x83\x91\xf3\x85\xd4\x08\xe3\xa7\x14\x34\x46\x02\xe4\xbf\xc8\x36\x4f\xde\x4d\x70\xab\x9d\x5b\xc0\x47\xb3\xf5\xa7\x6b\x28\x12\x8a\xab\x7b\xbf\xda\xed\xfb\x99\x24\x52\x8e\x0a\x3f\xcb\xfd\x6e\x10\x3e\x0c\x65\x28\x31\xbe\xb4\xff\x73\xb9\xd9\x3c\xcd\xc5\x07\x86\xa6\x45\x28\x23\x1b\xbe\x55\x65\x51\x5f\xae\x39\x53\x7c\x2f\xb0\xec\xd9\xbd\xa5\xa4\xe1\xe3\x0b\x70\x12\x0b\x15\x55\x9e\x27\xe8\xa9\x74\x10\xc9\xbe\xfc\x7a\xfc\x99\x54\xc8\x31\xd3\x6b\xcd\xc0\x51\xf6\xe6\x7f\x82\x3e\xc2\x18\xfc\x3f\xdf\x5f\x29\xcf\x7f\x94\x15\x68\x13\x5b\x70\xd3\x95\xec\x02\x0b\x75\xa4\x51\xfe\xe4\xfd\x33\x2f\x2f\xc3\x83\x3f\xd4\x8a\x61\x64\x41\x67\xdd\xb6\x03\x11\xe0\xb0\xdd\x3e\x2d\xbe\x64\x80\x61\x21\xc4\xa1\x65\x49\xc3\x04\xa9\xbd\xe7\xf8\x47\x0d\x65\xb1\x53\x65\x7c\x82\xf7\x81\x14\xfd\xd4\xa7\x1e\xed\x9a\xdd\xc5\xa1\x07\x96\x74\x81\xf1\x88\x10\x81\xf9\xea\x2b\xb1\xce\xf9\x67\x8c\x68\x22\x62\xb7\x64\xbf\x97\x0d\x54\x75\x27\xbd\xda\xfe\x4f\x7f\x57\x2a\x12\xe1\xb2\x21\x56\x5a\x43\xce\xd0\x3d\x0c\x67\x4a\xc4\xb8\x65\x9c\x39\x8b\xcf\xcd\x65\x7c\x60\x4c\x76\xd5\x88\xa5\xc6\x18\x1f\xb9\x31\x50\x55\xd7\x36\xb5\xef\xa9\x23\xe5\x44\x0f\x4f\xe7\xe6\x11\xc9\xd4\x71\x5b\x73\xed\x41\xc2\xb1\xae\x61\x97\x9d\xce\x39\x0c\x1d\xa3\x28\x30\xc6\x50\xa7\x26\x94\x89\x7c\x59\x16\xc7\xeb\x03\x36\x0a\x99\x91\x96\x34\x06\x29\xa9\xf1\x93\x21\xf1\x1d\x7a\x09\x83\x04\x44\x14\x06\x91\x13\x06\x6a\x84\x7a\xed\xfe\x1a\xa7\x48\x4d\xe8\x53\xd0\x1d\x5c\x77\xae\xca\x89\x45\x11\xb5\x98\x26\x8b\x27\x9f\x85\x1c\x4f\x07\x2b\x0a\x8d\x07\xb5\x79\x3b\x32\x8a\x22\x89\x5c\x82\x2f\x4f\xeb\xfd\x4f\x36\x79\xa5\x88\x4b\x1d\x4f\xc4\xde\xc7\x40\xe8\x09\xea\x82\x45\x91\xd0\xd4\xca\x4b\x99\xcb\x11\x06\xdb\x45\xc4\x43\xe2\x69\xc7\x37\xd5\xd2\xf1\x79\xc2\xcf\xac\xbc\xd4\x77\x00\x3f\xb2\x42\x7b\xb1\x74\x16\xf1\xc4\xd2\x34\xa3\xe6\x8b\x67\xe0\x1b\x1b\xac\x51\x1c\x12\x0e\x3e\x37\x76\x9a\x66\xa2\x51\x65\xc6\x88\x6e\x05\xf9\x3d\xbf\xfd\xec\x37\x0f\x5f\xcc\x91\x34\xa0\xd1\x94\x67\x61\xe9\x23\x39\x51\x1a\x04\x18\x40\xd8\x9d\xc4\x44\x43\x86\x45\xa9\x66\x98\x78\x7e\xc8\x0c\xec\xa0\x39\x10\x12\xf9\xcb\x04\xd5\x48\x26\xb4\xdd\xdc\x7e\xeb\xfe\x96\x12\x3c\x8c\x9e\xe0\x7d\xa4\x37\xf3\xb7\x1c\xac\x48\xf2\x28\xb6\xd4\x45\xf5\xcd\x34\x6e\xe7\xfd\xd5\x48\x85\x56\xcd\x4a\x7d\x4a\xa8\xac\x7e\xca\xf8\x91\x55\x14\x61\x39\x5a\x87\x6c\x05\xd3\x0c\x71\xad\x2c\x52\x40\x90\x02\xec\x60\xbf\xff\x90\x65\xea\x6a\x3a\x2a\x93\x7a\x82\x9b\xc5\xb1\xca\x50\x78\xa5\x3d\xe5\xe0\xa3\x99\xfe\xae\xd1\x51\x6a\x53\xb7\xdb\xaa\x3c\x65\xf9\x75\x5a\xc5\xf5\xd4\x22\x86\xe1\xc9\xe6\x3c\x58\x4f\x80\xe1\x7a\x99\x90\x20\x89\x99\xbc\x7c\xae\x8b\x5d\x7b\x9e\x6b\xd1\x37\xa6\x36\x26\x51\x37\xe5\x79\xdd\x74\x7f\x55\x90\xb8\x78\xe5\x3d\xc6\x68\x6c\x55\xe1\xf8\x41\x5b\x3b\xc3\xa2\x82\x3d\x7d\x32\x46\x19\xe0\x72\x72\x84\xfa\x93\x30\x20\x27\x32\xb5\x75\x87\x2e\xd4\xef\xf2\x39\xae\x95\x26\x31\x42\xba\x6d\xf1\x90\xd7\x46\x1c\x62\x56\x18\xa7\xca\xc6\x80\x1d\xa9\xb0\xdb\xc8\x17\x5a\x4f\x6d\x0e\xce\x94\xc6\xd0\xc7\x7b\x55\x96\x27\x7f\x79\xc0\x81\x47\x63\x55\xf9\x91\x96\xf0\xac\x61\xc4\x03\x01\x58\x3d\xbf\xdd\x7c\xbb\x0d\x68\x77\x2f\x48\x30\xf4\x50\x95\x17\xcb\x66\xa0\x27\xec\x42\x8c\x07\xc6\x26\x9f\x06\x7a\x88\x75\x77\x7d\xe8\xea\x4a\x7e\x2f\xdf\x5c\xee\xc0\x37\x44\xa1\x72\x10\x8d\xfb\x32\xd7\xb7\xa2\x11\xb7\xa5\xba\xf4\xb1\x0d\xd7\x2f\x8a\x39\x16\x0f\xf9\xba\x9a\xdd\x15\x42\x9d\xf1\x76\xc1\x5e\xe1\xfe\x66\x0d\x9f\xc4\x5f\x21\x52\x4c\xa8\x7f\x17\xf9\xe7\xa5\x11\x63\x84\x07\xe3\x3c\xb2\x4e\x44\x0d\xcd\x30\x92\x3f\xfe\x55\xce\x35\x42\x9e\x4e\xe2\x0d\xee\x2f\x53\x05\x46\xc6\x79\x62\xe3\x68\xdf\xb3\x3a\xeb\x3e\x6d\x1c\x10\xc4\x74\xf4\x98\xc8\xae\x45\x32\xe4\x7e\xfa\x09\x15\xe8\x4c\x35\x97\x53\xdf\x12\x10\xdd\xed\x60\x8e\xda\x60\x32\x11\x12\xce\xb0\xfc\x28\xc3\x7a\x98\xb9\x65\xc4\x13\x11\x0c\x54\xdd\x10\x33\x54\x67\xc7\xc9\x7d\xd2\x90\x01\xf2\x0e\x95\x79\x3e\x4b\x21\xf4\xeb\xf4\x05\x4f\x35\x03\xa7\x88\xf0\x04\xef\xdb\xb2\x11\x0d\xe6\x9a\x6b\x47\xa1\x39\x19\xa3\xd4\x50\x1c\xe8\xd6\x66\x5e\x4c\xda\x84\xab\xca\x74\xf0\xaf\xf6\x9b\x3e\x7f\x85\xe1\x66\x5c\x1a\x4b\x53\xd9\x6e\x27\x42\xbd\xb5\x93\x64\x2e\x89\xc0\x35\x33\x48\xac\xf4\x06\x9f\x1e\xab\x38\x90\x69\xf5\x9d\x74\x8c\x38\x96\xd7\xf2\xfd\x51\x14\x36\xac\xb8\x2e\x7e\x40\xb6\x2f\xad\x20\xe1\xee\xf3\x24\xcb\xbc\xa7\xbe\x61\x1c\x98\x4c\x7d\x61\xb7\xf8\x54\xa2\x2a\xb2\x89\x6c\x48\xdb\xc7\x1e\x8a\x27\x2c\x34\xe9\xae\x84\x30\x76\x21\x9c\xc3\xcf\x29\x2b\x80\xed\x13\xd3\x24\x42\x5e\xcf\x1d\x14\x9a\xde\x83\x67\xff\x62\x31\x93\x04\x63\x67\xaa\x1e\x6b\x28\xb1\x98\x69\xc3\xe3\xee\x73\xbb\x59\x33\x1b\x13\x88\x99\x49\x90\xb6\xc7\x06\xe0\xac\x86\x81\x6b\x0a\x98\xad\x90\xf2\x50\xb4\xad\xa8\x3b\x39\x01\x16\x07\xa1\x25\x33\x71\x86\x81\x78\xff\x82\x89\x62\x7e\xb2\xc4\x61\x6b\x0d\x60\xc4\x28\x53\x6f\xcb\xb2\xf8\x09\x55\xb3\xad\xb2\xb2\x42\x54\xbb\xbe\xce\xfb\xff\x6f\xa2\x70\x71\x18\x84\x18\x85\xfb\x29\x2e\x79\x33\xa6\xd0\x60\x71\x94\x08\xcc\x8c\x75\x14\x81\x5d\xbe\x3c\xe6\xc4\x92\x30\x0d\x24\x75\xa1\xb2\x95\xde\xdd\xe0\xb6\xbb\x25\xf5\xe7\x49\xb1\x3a\x41\x75\xec\x6b\xe1\x58\xcc\x39\x47\x6c\xae\xcc\xf4\x6a\x9a\x26\x8a\x79\x1c\x87\x6a\x70\x3e\x3c\x7b\x12\xd4\xee\xee\x71\xc8\xed\x93\x23\x20\x03\xb9\x80\xba\x26\x1e\xfa\x14\xa5\x05\x1e\xaa\x89\xc7\x1e\xa7\xcc\xd6\x49\x22\x8d\xf3\xf6\xb5\x84\x22\xfb\xe8\xcc\xdb\x38\x4d\x14\x4e\xc1\xc7\xc5\xd3\xb7\xc5\x7e\xbf\x78\xda\x3e\x6f\xfe\xf9\xe7\x62\xb9\xbd\x79\xf8\x7e\xdb\x75\x32\x22\x74\x65\x33\xce\x51\xed\xae\x17\x71\x8a\xe6\x04\x82\x76\x90\xe5\xbd\x7f\x36\xa1\x08\x4a\xb4\xdf\x43\xeb\x91\xef\x20\xcf\x3b\xa0\x81\x8f\xf5\xc6\x42\x0b\x04\x12\x61\x81\xc0\xaf\x54\xb9\xa7\x80\x87\x91\x41\xeb\x6e\x26\x0d\xc7\x72\x4f\x68\x5e\xcb\xaa\x86\x4d\x25\xd4\x8c\x09\x3c\x25\x4c\x63\xb1\x8a\x43\xe1\x31\x39\x2b\x4b\xe4\x35\x9b\xcb\x89\x95\xd0\xb6\x58\x58\x7c\x64\xa7\xcb\xa9\xcf\x88\xc5\x9a\xda\x0a\xed\x7b\x70\xfc\xab\x4b\x51\xe9\x5e\x3b\x87\xc5\x3a\xb0\xbc\x06\x18\x6a\xdd\x7f\x58\xd6\xcd\x9e\x11\xbc\x7b\xb5\x61\x0e\x2e\xd6\x51\x80\xf6\xe0\x8f\x32\x7f\xeb\x6e\xa4\xe3\xc4\xca\x9c\xde\x21\x53\x46\x67\x71\xbb\x76\xa0\x21\xe6\x1b\x5c\x42\xe2\xd6\x43\x65\x7d\x33\xe3\x98\xba\xb3\x71\x87\xe5\x15\xbc\x97\xc5\x26\x4a\x31\x4e\xbf\x5f\xff\xf3\xde\xf2\x76\xcd\x99\xa0\x5f\xfd\x3b\xbf\xb2\x4d\xca\x03\x47\x8f\xba\xb1\x26\xed\x78\x33\x9e\x76\x97\x01\x72\xf7\x3d\x96\xb5\xc8\xda\xe3\x62\xba\x5c\x8d\x16\x88\x54\x76\x74\x2f\x3b\x71\x12\x55\xd6\x08\xbf\x61\x27\x34\xa4\x54\x0e\x98\xb3\x17\x85\xb6\x55\x71\xf3\xa7\x45\x42\xe3\x00\x8d\xcf\xc3\xc8\x64\xf0\x7c\x0e\xae\x13\x0b\xa5\xec\x28\xdf\xee\xb2\x62\x5e\xa0\x84\x25\x4c\xa7\x86\x0d\x63\x15\xf5\x08\xcf\xcb\x92\x30\x11\xb8\x4d\xee\x97\xfb\x11\xbe\x6a\x2e\x3e\x92\x84\x82\x1b\x31\xe0\x38\x74\xe5\xbe\x1d\xea\x32\xf1\xfd\x24\xc1\x82\xb2\xa3\x38\xc1\xb3\x28\x74\x59\xd0\xee\xf7\x20\x41\x1f\xf6\x7c\xa9\x5f\x0f\x65\xe5\xa8\x54\x0f\x6f\x13\xd6\x62\x96\x44\x91\x34\x56\x65\x17\xd4\xdb\x0d\xd4\x57\xb2\x00\x93\x37\x8d\x22\x4b\x50\xee\x7d\xd3\xaf\x02\x03\x93\xd1\xe6\xb1\x8e\x6d\x7d\xec\x59\xcc\x93\xc2\xb0\x84\x4b\x2b\x07\x6a\x41\x66\xeb\xe5\xa6\xb5\x8e\xee\x57\xf4\xe0\xf9\x74\xfc\x91\x97\xc4\xce\xc4\xd0\x65\x01\x22\xaf\x40\xe8\xab\xe5\x3b\x58\xec\x49\xac\x85\x66\xc3\xca\xe6\x9b\x4f\x1b\x21\x5f\x8f\x65\xdd\x58\x12\x43\xca\x87\xbc\xed\x93\xaf\x98\x50\xab\xbc\xdd\xb8\x1a\xca\x85\xcf\xa8\x75\x1d\x12\x83\xf1\x0a\x97\xd5\xdc\x56\x70\xca\x2e\xa7\x39\x26\x86\xaf\x44\x64\x58\x92\x18\x81\x07\x3d\x88\x2a\xff\xf4\x88\x8c\x89\x65\x99\xa4\x94\xda\xc4\x95\xf5\x9e\x73\x51\xc0\x34\x95\xe9\x7a\x0a\x65\x95\x41\x10\x37\x84\x99\x0d\xd7\x20\x63\x8b\xcf\xf6\x5f\xb2\x35\xd6\x2e\xf2\x0f\xf8\xbc\x2b\x87\x52\x48\xe3\xa9\x29\x63\x89\x25\x6e\xdf\x45\x2d\x54\x6f\x2e\x27\x52\x9a\xd0\x05\x80\xd6\x0d\x9c\xa6\xb6\xde\xe4\x99\xa4\x31\x91\x8d\x39\xa9\x7d\x79\x2b\x3e\xa7\x6f\xa7\x98\x36\x9e\x3a\xfd\xef\x19\x12\x89\x8a\xad\xe6\xed\xf3\x45\x7f\xd6\xc3\xc0\x5b\xa2\xa4\x8d\x8e\x57\x03\x81\x43\x96\x28\x27\xbe\x77\x12\x1f\xff\xb8\x88\x02\xbd\xa3\xba\x6b\x04\xea\xf5\xcc\xfe\xc8\x8a\xa3\x2e\x4f\xfb\xcf\x33\xfc\x36\x1a\x09\xcd\x12\xac\xe6\xd7\x59\xdd\xce\x11\x6b\xbb\xd4\x48\x7a\x30\x98\x7a\x3a\x8c\x63\x37\xfa\x7b\xf1\x36\xe0\x63\x9f\x2c\x2b\x6d\x0c\xed\xf8\xdd\xcf\x63\x5d\xa7\xf1\x14\x85\x90\x4a\xe7\xb1\x6a\x38\x37\x6a\x08\x80\x98\xdc\x14\x22\xcb\x59\xee\x32\x37\x37\x65\x31\x4f\x2f\xcf\x12\x48\x2c\x5b\x49\xa6\x4a\xf4\xae\xa6\x1f\x04\x52\x86\xe7\xfa\x9f\x17\x51\x3c\x64\x62\x88\xdb\x66\x29\xe1\x01\x16\xa1\xe8\xac\xb6\x62\x06\x1d\xa7\xe5\xe8\x26\x29\xd1\x1c\xd1\x4b\x50\x34\xd5\xe7\x1d\xc0\xa1\xbb\x81\x96\xe8\xb9\xc8\xcb\xe7\xaa\x80\xea\x78\xc5\x68\xf9\x7f\x27\x37\x02\x8a\xe0\xd0\x53\x56\x34\x37\x97\xcf\x2f\xbc\x3d\xd7\x99\x05\x94\x93\xce\x87\xe8\xf9\x00\xbe\x2c\x93\xba\xba\x3e\xc0\x60\xde\xdd\xe6\xf9\x70\xb7\x79\x79\xea\x14\x9e\x59\xca\x12\x19\x5a\xe2\xed\xf5\xb9\xb4\x99\x95\x4d\xa7\xae\xd7\x36\x6b\xde\x97\x1d\x8d\x94\x17\x47\xa3\x9f\x06\x91\xf2\x42\x90\x8e\x85\xae\xf7\x47\x6c\xc1\xca\x6f\x93\x0b\x62\x70\xac\x73\xcd\xa5\x2a\xd6\xf8\xb8\xbf\x8d\x9e\x3a\xe4\x04\xb3\xf7\x96\x63\xae\xa9\xac\xc2\xe7\xe9\x3a\x67\x91\x86\xb1\x35\x16\x35\x5c\x6a\x68\x7c\x0c\x32\x0d\x53\x83\x56\xbf\xdb\x30\xcb\xcb\xf1\xb5\x99\x5e\xe9\x32\xb9\x59\x91\x35\x56\xb1\xcc\x35\x44\x6e\x73\x42\x12\xa7\x29\x85\xe8\x2f\xeb\x23\xae\xeb\x21\xc6\x1f\x23\x02\x88\xe4\xd8\x21\x6c\xcd\xcf\x97\xe7\xf5\x68\x71\xa6\x3c\x49\x12\xb7\x1d\x75\x49\x80\x89\x41\x91\xf2\xd4\xd1\x3d\xa2\x77\xb4\xb8\x34\xaf\x93\xf7\x8b\x13\x88\xe2\x8e\x8a\x19\xf4\xc2\xf4\x2e\x42\x9a\xb0\xd0\xe2\xa1\x7c\x48\xc8\x62\x07\x7e\xb9\x49\xa5\x89\x4c\x95\x5b\x66\xed\x44\xf1\xa7\x75\x9a\x12\x8e\xa0\x45\xfb\x5a\x56\x3b\x66\x07\x0d\x06\x8d\x26\x86\xc2\x24\x80\x33\x7a\xeb\x94\x51\x4c\xba\x3a\xee\x68\x38\x9d\xcb\x4a\x54\x5d\x6a\x7c\x0e\xf3\x95\x8a\x20\xc0\x49\x7a\x53\xea\xcf\x47\x51\xd7\x03\x36\x0d\x96\x8a\x30\xc5\x53\x5b\x8a\x01\x65\x00\x4b\x25\x09\x11\x3c\x79\x16\x97\x1a\x1e\xcb\x2e\x7f\x9f\xca\x88\x21\x2b\xf9\x3b\x64\x3b\xd5\x03\xbf\x53\x99\x4a\x65\x99\x79\x32\x84\x9a\xee\xcb\x97\x22\x73\xfc\x22\xe3\x11\x52\x46\x05\x6c\x38\xac\xdf\xb3\x4a\xe4\x1e\x80\x39\xee\xab\xb5\x46\x81\x17\x53\x56\x90\x1d\x8b\x19\xb6\xb9\xf1\xf0\x68\x13\x21\x81\x0a\x0a\xc3\x1d\x7f\x1b\x8e\x02\x48\x4a\x5c\x9e\x41\x8c\x29\x08\x58\x6a\x02\x4b\xe5\xea\xe0\x98\xab\x7e\x1c\x4c\x68\x75\xca\x4e\x59\x71\x03\xcd\x80\xcc\x95\x09\x12\x70\xed\xe8\xb9\xd8\x10\xfa\x2c\x68\x94\x20\x2e\x4b\x36\xca\x39\x2b\xbe\x01\x54\xe2\xb2\x92\xbb\xf2\x04\xcd\x6b\xfb\xf1\x27\xa8\x29\xc1\x62\x13\x48\xcf\xc7\xf4\x13\xf2\xf2\xdc\x3b\xf4\xae\x4b\x00\x02\x75\xaf\xbd\x09\x53\x78\x3a\x99\x71\x01\x14\x13\x61\x90\x60\xc8\xcc\x54\x4e\x28\xf5\xd6\x61\x1a\xc6\xc3\x2c\xc2\x98\x22\x4a\xcc\x86\xf5\x66\x92\xe0\xbe\x5f\x9a\x06\x6a\x90\x80\x01\x3d\x03\xc1\x12\x3c\x88\x70\xdd\x7c\x1b\x1c\xed\xae\x29\xa6\x14\x63\xb1\x5d\x5d\xf1\x5d\xaf\xc9\x72\xb5\x5b\xf4\x67\xac\x88\xa3\x20\xb0\x98\x0c\xd1\xbc\xde\x8a\x46\x1c\x04\x4d\xfd\x70\xc4\x29\xf1\xda\x07\x88\x40\xde\x96\x59\xd1\x78\xd2\x98\xd9\x13\x43\xc4\x42\x61\x72\xa4\x12\x6f\xdd\xd7\x89\xa5\x95\x2c\xc3\x62\x50\x0b\x01\x9d\x96\x37\x88\xc4\x48\x14\xf9\x33\xe8\x76\xe4\x3f\x73\x87\x80\x99\x29\xbf\x11\x29\x21\x4e\xbc\xb2\x41\x04\xd8\xcf\x49\x89\x29\x13\x29\x53\x61\xe4\x50\x1a\x5e\x46\xbc\xb5\x5a\xfd\xaf\xb5\xa3\xed\x88\xc5\xff\xb8\xf8\xb3\x58\x88\x98\x62\xd8\xc1\x9e\xf8\x87\x77\xcc\xa5\x1c\xa0\xd0\x07\xd9\x6b\xd3\x30\x21\x64\x14\x58\x0a\x85\x13\xe6\x96\x2e\x55\xeb\x40\x74\x78\x3a\x21\x94\x15\xb5\xce\x0a\xe5\x61\xd6\xbe\x05\x84\x0f\x72\x79\xc9\x4d\x9b\x0c\x98\x10\x4e\x31\x21\xd3\x30\x08\x3a\x09\x69\xa7\x1f\xa0\x57\xfb\x72\xff\x0a\xdf\x44\x6e\xf0\x3f\xa6\xd7\x48\x8a\xb1\xe2\x9e\x42\x6a\x14\xf2\x9e\x47\xfa\xba\x6b\x55\x64\x90\xa6\xdc\x58\x31\x47\x07\x97\x74\x8d\x3a\x90\xb1\x25\xe6\x10\x3d\x85\x19\x13\xc0\x83\xd0\x0c\xb9\xea\x4e\x30\xdd\x92\x04\x18\x1a\x58\x62\x0b\xd4\x5a\xb1\xd1\x3f\xa7\x4b\x38\xec\x3e\x7e\x1a\x43\x08\xfa\x70\x12\x9a\xe9\x82\x32\x54\xa2\x27\xfb\x52\x9c\x85\x7a\x5b\x28\x05\x75\x7d\x6b\xf5\xe9\x07\x7b\x92\x30\x61\x8c\xd1\xe0\x66\xc0\xcc\xb1\xc8\xfc\x87\x90\x84\x5a\xf0\x66\xd6\xf1\xd6\x2e\xea\x1a\x9a\xba\x1d\xd6\xac\x5e\x9c\xcf\x79\x36\x8a\x68\x4a\x12\x81\xf7\x82\x1c\x85\xfb\xf0\x81\x25\x49\x28\x52\x8f\xf8\x4a\x98\xef\x99\x86\xf2\x7e\xca\xbe\xc1\x24\x81\x14\x77\xdd\xd5\xe2\x79\xff\x6d\x68\x07\x4a\x62\x38\xc0\xf0\x07\x36\x66\x0e\x50\x22\x29\xa5\xdc\x85\xd6\x2d\x66\x15\x5d\xee\x2f\x72\xd5\xfe\x9a\x88\x89\xf6\x6d\xad\xae\x9b\x68\xe0\xa1\xac\xfb\x94\x8a\xa4\xa9\xa5\xb4\xce\x4e\x8b\x3c\xfb\x09\xdd\x9f\x85\x95\x5e\xf6\x7b\xa1\x0f\x65\x39\xa8\xa0\x98\xaf\x39\x65\x92\x9a\x20\x1d\xf0\x03\xaf\x8b\x9f\x65\xbf\xb7\x4b\xc6\x03\xac\x86\x40\xc0\x04\xa6\x8b\xd6\xb7\x7d\x5b\x8c\x36\x11\x26\xe4\xf2\x2b\x0e\x09\x26\x59\x22\x44\xe8\x63\x73\xbf\x40\xc1\x48\x06\xc2\xe9\x75\x59\xf7\xec\xdb\x8f\xe5\x2d\x9c\xc7\xdf\x8c\x19\x8a\xe7\x33\x2a\xa0\x5c\x4e\xb7\x99\x31\x99\xba\xe4\xcd\xe7\xfe\xb5\x82\xfa\xb5\xcc\xf5\x0f\xc8\xfc\xa3\x05\x5c\x5b\x76\x81\xa6\x3c\xef\xf5\x80\x55\x9e\xc9\x30\xd2\x98\x91\x42\x38\xfc\x8d\x50\x6f\xbf\x26\x14\x66\x32\x4c\x52\x6a\x49\xfa\xce\x3d\xae\x5a\x46\x2c\x34\x6e\x02\xf4\x6a\x7e\x5f\xdc\x21\x0a\xec\x17\x13\xd5\x98\x03\xa7\x6d\x91\x98\x98\x11\x4a\x55\x17\xd0\x0f\xd9\x7f\x26\x43\xc8\x0d\xa4\xee\x67\x16\xc7\x0a\x70\x11\xee\x46\x74\x65\x6d\x1f\x83\xbb\x63\x56\x23\x9f\xb0\x7e\x39\x4f\x6e\x12\xa7\x9c\x05\xfe\x3b\xac\xce\xa5\xea\xdd\x74\xd7\x23\x89\x39\xa1\x23\x9a\x99\x2d\x14\x7a\x30\xe9\xd2\xc0\xd6\x29\x7d\x5f\xed\xf6\xeb\xa7\xfb\x03\x3d\xdc\x2e\xf6\xab\xae\x35\x0a\xd1\x53\x3e\x97\x65\x7e\x07\xc3\x52\x1d\x99\x72\xc9\xdd\xce\xb8\xde\xde\xed\x86\x64\x8d\x63\x67\x4f\xa6\x32\xc6\x32\xc8\x9b\xd5\x1e\x7f\x62\xb3\x5d\x3d\xed\xba\xdb\x48\x4b\xe8\x25\xf4\xbf\x2f\x75\x6b\x7e\xfc\xd7\xea\xd3\xb4\x66\xea\x8f\x01\x04\x67\x3c\xf0\x42\x59\xa6\xb2\x63\x25\x8a\x66\xa1\xad\xc0\xb9\xc8\x11\xde\xfb\x05\xc0\x4c\x0a\x08\x52\x5f\x77\x02\x05\xa8\xcc\x64\x62\x9a\x45\x96\x92\x58\xed\x16\x4b\xe3\x3a\x48\x78\x4a\x19\x9a\xc8\x71\x53\x42\xd1\xfe\xdc\xa3\xf8\xe8\xda\x84\xc6\xb8\x1f\x7a\x29\x17\x1b\x68\x1e\xff\xb8\x22\x1a\xcb\x1f\xc5\xf9\x0c\x85\x5e\x15\xaa\xfa\x3c\x37\xc8\x5b\x3e\x0f\x17\x97\x2a\x90\x89\x9f\x1f\xd5\xf1\x72\xbd\xa5\x4b\x95\x26\xe8\xdc\x48\x51\x67\xca\x81\x60\x87\x1f\x48\x09\x89\x7c\x6b\xae\x74\x60\xb1\x5c\xae\x1e\x56\xcf\x8b\xfd\xc6\xbb\x7e\x52\x73\x8d\x55\x87\xaf\x59\x8f\xdf\x95\xda\x30\x04\xa4\xe1\xd0\x5a\x08\xd2\xea\x76\xf5\xcf\x2f\x06\x15\x52\xcb\x78\x58\xcd\xeb\xa4\x0d\xac\x05\x09\x32\x45\xea\xa9\x5a\xbd\x82\xbe\xe4\x70\x5b\xae\xa7\xaf\x64\xa8\x60\xae\xb8\xbf\x7a\x28\xd5\xdb\x8b\x87\x30\x4a\xc3\x2c\x91\xc6\xf3\xc6\xe6\x1b\xef\xee\xba\x96\x54\xdb\xb4\x53\x2e\x6a\xcb\x81\xa9\x4a\xfd\xd7\x64\x45\xfe\x6a\x29\x30\x80\x8a\xfa\x86\xa8\xe0\xd8\x1a\xf5\x4e\x5f\xd2\xf7\xd1\x0a\x09\xab\x9f\x85\x31\x39\x8a\x19\x16\x47\x78\x28\xcb\xf3\x78\xcd\x2b\x12\x0b\x6d\x0f\x33\x7d\x77\x69\xad\x11\xbf\xfd\xb8\x76\xaa\x09\x9e\x5d\x87\x4e\x15\x60\x4c\x3b\x3f\x7a\x32\xc5\x28\xe0\x8c\xf9\xd7\xb7\xf5\xb7\x97\xf5\xfd\x8b\xdf\xa0\x14\x8b\x54\xa7\x17\x10\xf7\x7f\xd4\xde\xf0\x3e\x38\x1b\x7f\x4c\xfd\x31\xff\x23\x01\xb1\x20\x9d\xce\x53\xd9\x35\x70\x1e\x7f\x14\x15\xea\x14\x6f\xfd\x2a\x6a\x4c\xe4\xb7\x1b\xe2\xbe\x7c\x06\x95\xc1\xcf\x39\x6e\x6d\xa6\x42\x43\x79\xd2\x11\x65\x5a\x5c\x32\xc0\xb6\x2a\xa7\xb7\x8e\x28\x8f\x5c\x8d\xc1\x00\xf0\xf5\xaf\xb2\x98\x1c\x38\x2a\x92\x2c\x76\x59\xd1\x87\x21\xb4\x61\x9a\x5e\x71\xdd\x39\x85\x01\x01\x9a\xf7\x99\xb7\x65\x39\x3a\x79\x14\xe7\x02\xe2\x1e\x07\xdd\x0e\x9c\xb2\x75\xcd\x07\x9d\x99\xd6\xfa\x2f\x14\x1c\x0c\xe2\x33\xfc\x40\xf3\xd4\xe2\x3a\x9b\xd6\x53\xbe\x5d\xac\xe7\x37\x28\xc5\x85\xb0\xe5\x6f\xd9\x51\xfd\x05\x92\x50\x71\x01\xd4\x51\xb9\x8e\xab\xe0\x5c\x7b\x12\x30\x8b\x76\xcf\x41\x54\xa8\x44\x36\xb1\xc9\x5d\xbf\x34\x64\xb1\xa5\xad\x52\x9f\x2a\xef\x35\x29\xc6\x4f\x26\x94\x0d\xe8\xd4\xd0\xbc\xec\x6e\x6f\x1a\x35\x69\x97\xad\x0f\x87\x27\x86\x13\x15\xad\xb1\xe8\xc0\xef\x0f\x4a\x69\x82\xb0\x21\xc4\x6e\x8e\xb8\xe8\xbf\xac\xa2\x54\x3a\x02\x94\x32\x41\x5e\xd4\x1b\x68\x26\x0b\x07\xa8\xc1\x19\xf6\x3d\xfb\x50\xa5\xe3\x23\x67\xbf\x1c\x32\xe0\x14\xad\x97\x63\x5e\x4a\x91\x3f\x42\x33\x64\xae\x65\x0a\x52\xab\xd3\xed\xc9\x5c\xbf\x97\x0d\xd4\xcb\x8e\x5d\x9e\x29\xd0\x04\xe3\x8f\x37\xfb\xea\x52\x0f\x49\xb4\x98\x32\x34\xc6\xd1\x7e\xd9\xed\xc7\x11\xb9\x2f\x0b\xf3\x94\x89\x2c\x36\xe9\x5c\x65\x3f\xb3\x1c\x8e\xa0\xaf\x12\x0a\xa3\x79\xea\x2f\x4b\xad\xef\xda\x71\xbc\x16\x4e\xb3\xef\x8b\xc5\x6a\x84\x46\xb6\x83\xac\xbe\xbb\xe0\x19\xfe\xd4\xb9\x06\x9a\xe8\x00\x05\xcb\x36\xb7\x74\x88\x5c\x75\xad\x94\x59\x4e\x83\xc7\xcf\x3d\xd4\xce\x5e\xf5\x5b\x87\xa6\xd2\xea\x23\x3b\x3b\x31\xff\xb4\x65\x73\x03\xd3\x4a\xb7\xbf\xad\x3c\xb1\xd8\x47\xe3\x8a\xcd\x26\x3f\x12\x50\x62\x52\xcf\x40\xd9\x9e\x9e\x13\xf8\x9d\x0e\x42\x46\x9d\xed\x7e\xe8\x83\x74\x3a\x24\x12\xbd\x3d\x0d\x46\x75\x86\xbe\x0e\x81\x20\xac\xf4\x2c\x3e\xd9\x57\x51\x37\xd7\x95\x13\x4d\xe3\xce\xc7\xd8\x42\xd5\xdb\x8b\x9a\x83\x4c\x62\xef\x1b\xfd\xff\x69\x7b\xb3\xe6\xc6\x71\xa4\x6d\xf4\xef\xf4\xc5\x5c\x10\x04\xc0\xe5\x52\x92\xe5\xb2\xa6\x6c\x4b\x63\xc9\x55\x3d\xdf\xc4\x1b\x0a\x2c\x09\x9b\xaf\x29\x52\x43\x52\x55\xa5\xfe\xf5\x27\x98\x00\xb8\x49\x72\xf5\x77\xe2\x9c\x9b\xa9\x1e\x13\xa4\xb8\x00\x89\x5c\x9e\x7c\x1e\x53\x86\x9f\x27\x65\x75\x1c\xb1\xd0\x7b\xff\x0a\x8a\x49\xd8\xa0\x13\x4e\xa9\xed\x7b\x41\xd9\x83\x79\xd6\xae\x6d\xe7\xf3\x6f\x2a\x30\xd9\xaf\x61\xf0\xa3\x13\x95\xe0\xb4\x9f\x69\xfd\x24\x1a\xa8\xb2\x2b\x02\x01\x93\x1f\x50\x06\x53\x83\x58\xc8\x7a\xad\xa1\x42\xe4\xe9\x69\x42\x94\x1b\xea\xd4\x10\xcb\x64\x8c\x71\xdc\xe2\x75\x7b\x37\x79\xd7\x82\x04\x28\x0e\x6b\x3b\x64\x3a\xbe\x86\x7a\x3a\x8c\x5a\xe2\xa6\x55\xf9\xb4\x1b\xae\x02\x2d\xb8\x0e\x98\x7f\xa7\x9e\x3a\xec\xc9\x63\xbd\xfc\x28\x19\x9a\x58\xf6\x04\x17\x6b\x63\x10\x5d\xbc\x99\x70\x9f\x8c\x9f\x51\x32\xe2\x1a\xf6\x9e\x5f\xb7\xfb\x8e\xb9\xa6\xbb\x66\x44\x3c\xe9\xf6\xa9\xc8\x9a\x3b\x30\x50\xd4\x16\xe6\x73\xcc\xb3\xbf\xc1\x42\x38\x98\xb7\x52\x18\x8b\x25\x87\xba\xd9\x97\x05\xac\x0a\x04\xa6\x2c\xff\x3b\xb7\xf6\xa7\xfb\x4d\x47\xf2\x76\x14\xe7\x45\x79\x40\x12\x91\xed\xb1\x2c\xea\x29\x7e\x45\x4b\x13\xe9\xb0\xef\x01\xbd\x07\xd8\xf9\x96\xc5\xab\x21\x9f\x56\xd4\x96\x0b\xdc\x1b\x72\x20\x3b\x6f\xda\xb5\xe2\x02\x53\xbc\x88\xcf\x15\xa3\x1c\x98\x56\x09\x78\x89\x85\xd5\xb7\xfd\xcb\xa4\x07\x4a\x2b\x48\xbc\xfa\xfd\xb2\x56\x27\xc8\x45\x77\x66\xeb\x67\x60\x9d\x76\x39\x7b\xda\x7f\x5d\x2e\x37\xab\xe7\x2f\xdd\xb1\x54\x22\xba\xbf\x81\xc3\x11\x37\xfc\xa1\xe1\xd4\x5a\xdb\xd4\xf4\x1b\x34\x8f\x2f\x8b\x6b\x54\x24\x5a\x03\x53\xda\x97\xbd\x5a\x6b\xf0\x84\x42\xb9\x5d\x02\xc8\x0d\x83\xd0\x12\x91\x29\x6c\x0e\xf9\x06\x55\x66\xce\x5f\xe1\x3c\x44\x9b\x5f\xa4\xc9\x47\xbb\x82\x36\xc4\x26\x26\xd1\x11\xf5\x32\x10\x23\x77\xe3\x92\x48\x03\x02\x42\xbc\x93\x6f\x53\x99\xd7\xca\x89\x10\x84\x12\xc3\x52\xec\x84\x5d\x76\xa6\x08\x08\xa1\x18\xa0\x9b\x9e\x89\x76\x4c\xc0\x38\xb9\x0e\x09\xe3\xd0\xa2\x50\xfe\xdc\xb7\x73\x78\xd9\x71\x76\x40\xc8\xed\x87\x6f\xad\x03\xef\xfe\x28\xad\x95\xb6\xb9\xed\xcf\xdc\x3f\xa0\x31\xb1\xc4\x03\x1f\x79\x59\xd7\x5d\x55\x0f\x68\x9a\x60\x8b\xc0\xe1\x94\x37\xcf\xa7\x03\x58\x4a\x3d\x77\x90\x91\x10\x53\xf3\xed\x43\x7f\xc0\xe6\xd4\x74\x07\x22\x8b\xe1\x6b\xca\x1c\xda\xd7\xb9\x3d\xc9\xeb\x8e\x0b\xf0\x84\xf3\xb8\x0f\x7f\x97\x6f\x6f\xdd\x4f\x73\x21\x6c\xbe\xad\x75\x28\xb1\x3b\xbb\x1a\xa4\x66\x20\x0a\x03\x6a\x37\xf9\xb2\x86\xbd\xec\x28\x7e\x43\x88\x28\xe5\xae\x65\x06\x4b\x94\x96\x50\x76\x34\xad\x20\x8a\xed\x6c\x3f\x0c\xa5\x4b\x43\x88\x0c\x41\xb6\x95\xb7\xec\x07\x52\x26\x40\x61\x6b\x39\x93\xb3\xe3\xd8\x18\x8a\x70\x9c\xbf\xa6\x47\x12\x96\x04\x63\x7c\xe6\xf6\xe3\xe4\x2f\x9f\x04\xb6\x1f\xa5\x6b\x36\x41\x46\xf6\xee\x28\x8b\x30\xbf\xe9\xcc\xfd\x40\xaa\xec\xd3\x3c\x0f\x24\x3c\xc6\x8d\x3d\x87\x37\x91\xd7\xe3\xd4\x36\x24\x2a\x89\x5d\xe9\xb3\x35\xf0\xed\x0d\x0d\x0e\x59\x22\x3c\x71\x90\xb7\xca\xce\x90\x68\x83\x31\xff\x6a\xb1\xde\x7b\x61\xcf\xc5\xfa\x79\xf7\xb2\x9a\xbf\x0e\x1a\xf5\x21\x25\x21\x4b\x3c\xc5\xaa\x18\x8b\xf7\x85\x90\x72\x13\x39\xf9\xae\xf2\xd4\xec\x8b\xb2\x3a\x60\xfa\xad\x9b\x4a\xa9\xb0\xb9\x07\x55\x1a\x0b\xb9\xab\xad\xa5\x70\xac\xc9\xad\x83\xa3\xde\xfb\x69\x29\xc2\x10\x03\x09\x9f\x78\xfb\x84\xe7\xba\x1d\xac\x53\x57\xc3\x98\x97\xe5\x47\x2f\xb9\x10\x82\x0c\x15\x52\xcc\xfc\xc8\xe0\xa7\xe7\x07\x71\x1d\x7b\xe3\x77\x2c\x25\x45\x97\xe4\x2e\x83\x1a\x2c\xc3\xcb\x06\xde\xba\xcb\x28\x86\xd4\xaf\xe6\x28\xaa\xc6\x26\x4f\x46\xa5\x45\x50\xc4\xaa\x17\xd4\xef\x62\x18\x83\x7f\x1a\x56\x80\x8e\x68\xe0\x8c\x4b\x9f\x37\xbf\xfe\x88\x3a\x8d\x3c\xf7\x6c\xa7\x1f\xd2\xa7\x6c\x01\x88\x46\x54\xd5\x09\x59\x6b\x66\x8d\x67\xb1\x19\x01\xab\xfc\x58\x16\x69\x8b\xf1\x3d\x8e\xba\x70\xc1\x24\x14\xf9\xdb\x66\xa7\xe6\x7d\x55\x64\xd3\x35\x61\x00\x42\x37\xd1\xf6\x03\x9d\xd2\x7d\x71\x3a\xec\x4b\xb3\x3f\x56\xe5\xbe\x12\x8d\xd8\x5b\xb7\x69\x8f\xe4\x6c\xd3\xc2\xaa\x09\x20\x42\xd2\xda\x8e\x93\xe9\x09\x9a\xf7\x52\x8f\xe7\xb4\x09\x4c\x88\xae\x9f\xb5\x6b\x93\x1a\xa5\x21\x91\x4a\x3a\xfc\x91\x8f\x4a\x26\xdf\xd3\x84\x3c\x32\x4e\x34\x77\xb5\xf6\xce\x80\x09\x4d\x82\x79\x5a\x91\xe7\x5d\xff\xc8\xa8\x1f\xcd\x50\x08\xb5\x75\xc9\x9c\xdb\xea\xfe\xce\xa8\x94\xb6\xf2\x00\xba\x57\xdf\x0c\x0d\xe3\x29\x96\x52\xf6\x07\xf1\x6b\xb4\xf7\x19\x96\x58\x72\xff\xed\x6a\xb6\x98\x6d\x1f\x16\xeb\xd5\x73\x77\x48\x18\xbc\x18\xd2\x42\x7f\xbd\x50\xc3\x0b\x0d\x83\x14\x5b\xeb\xbe\xe8\x63\xf5\xf7\x44\xba\x42\x13\x05\x56\x52\x7c\x94\xe3\x37\x91\x30\xd8\x06\x62\x17\xd0\xb8\x64\xfd\x39\x7a\xc4\x44\x46\x58\x62\x00\x77\x73\x65\x87\x6b\xda\xcf\x55\x79\x3a\x5e\x36\xda\xbb\x13\xe3\x20\xd5\x6e\xa6\x58\xfd\xe9\xab\x66\xcd\xc4\xb1\xc6\xec\x8c\x5d\x90\x48\xc8\xe1\x8f\x48\x48\x1c\x52\xff\x3e\x47\xd5\xd2\xd3\xb0\x3f\xfe\xc6\xfd\xc6\x9a\xe0\x27\xb7\xc6\xe7\xfe\xe4\xb9\x58\x43\x93\x70\x10\xae\x07\xc2\x36\xb6\x8d\x4f\x4c\xe2\x10\x71\x8f\x1e\x25\x37\xb2\xda\x26\x11\xa1\xf4\xd0\x52\x71\x5e\x9b\xef\x00\x93\x1e\x43\x93\x06\x56\xe3\xf5\x0b\x76\xf1\xb6\xfb\xe8\xb0\x73\xd1\xa4\xd4\xe0\xd7\xc4\x4a\x76\x56\xbc\x7d\xcb\x84\x2b\x73\x0e\x83\x50\x23\x88\x31\x8e\xa2\x63\xbf\x79\x59\x3f\xad\xf7\x5f\x56\x2f\x8f\xde\x03\x30\x22\xe1\xca\x33\x7c\xdf\x8b\x2c\xf7\xad\xf2\x7e\xee\xcc\xde\x44\x07\x3d\x32\x42\x70\x3d\x80\x59\xbc\x3c\x5e\x75\x5c\x8c\x30\x01\xed\x40\x16\x75\x53\x9d\xd4\x40\xea\x60\x3c\x54\x72\x4b\xd5\xdf\x41\x03\xef\xab\xf2\xf0\x3d\x6b\xde\x6d\x5d\x73\x48\x8d\x7c\xa3\x30\x35\xfe\xfa\x32\x26\x66\xd0\xe8\x60\x8b\x23\xdf\xa0\xd0\x65\x85\x5c\xf0\x93\x4c\xaa\x91\xb1\xc5\x42\x5a\x85\xc6\x6a\x6d\x76\x3f\xb3\xa6\x41\xb8\xda\xe4\x46\x35\xa0\xdf\xf0\xdf\x46\xa3\x3e\xdf\xe1\x22\x4c\x31\xd2\x58\x65\x60\xa1\x75\x57\x31\x9e\x0c\x51\x94\x30\x5f\x8f\xf1\xa9\xa4\xae\x80\xe0\xaa\x18\x1d\x4d\xc5\xf8\x06\x40\x71\xb0\x29\xf0\xa1\x79\x35\x60\x00\xb7\x34\x0d\x3f\x4e\x90\xff\x80\xcd\xa9\x68\x4e\x42\x65\xa8\xc2\x32\xda\x18\x8c\x21\x04\xd1\xc8\x0b\x64\xd2\xdc\x42\xee\xd8\x34\xff\xa6\x28\xac\xbf\x4a\x9c\x62\xee\xf9\x75\x3b\xb3\xf7\x40\x03\x12\x5b\x97\xcb\xc2\xbe\xbe\x5d\x22\xc0\x69\x40\x20\x96\x36\x2b\xb0\xf2\x8c\x5a\xc8\x0a\xe4\x8f\x87\x81\x44\xec\xef\x16\x1a\x83\x2c\x08\x3b\xf1\x6b\xf4\x02\x68\x10\x52\x5b\xce\xd9\xeb\x72\x21\x1a\xf5\x7e\x9f\xd5\xef\x93\x15\x3c\x7c\x5e\x1a\x84\x8c\xa1\x3a\x96\x19\x28\xe0\xfa\x43\x2a\x45\xb7\x03\x0d\xc9\x5d\xe7\x04\xd2\x80\x06\x56\x95\xf8\x5d\xd4\xbd\xaa\xf5\xf8\x5c\x1a\x0b\x6f\x46\xda\xc0\xa2\xa7\x6d\xeb\x6f\x95\x05\x14\x8d\x74\xd9\xae\xc7\xec\x2f\xd8\x23\x4b\xc3\xa8\x8b\xef\x3f\xec\x7f\xfc\x60\xca\x30\x5a\xdb\x81\x7a\x2f\xca\xbc\x7c\x3b\xf3\x2f\x97\xd6\xf9\x9a\xb1\xa3\x01\x03\x8d\x21\xe1\xcc\xf1\x65\x5e\xb5\x89\x34\x88\x08\x33\xd2\x0b\xc5\xef\xae\xf5\xed\xfc\xc7\xdf\x4d\x44\x35\x6a\xca\x3e\x40\x9e\x67\x85\xf0\xef\x25\x8a\x42\xd3\xb7\xb3\xb4\x9f\xcf\xf5\x85\xdd\xf8\xc5\x24\x56\x18\x99\xef\xb3\xda\xa6\xa9\xfb\xce\xe0\x1b\x8f\x92\xa4\xb6\x88\xd3\x61\x84\xb3\x1c\xdb\x45\x7b\xd1\x37\x12\x4d\x4f\x11\x8c\x60\xb9\x02\x43\x94\x17\x91\xd5\xa0\xe7\xe7\xc9\xb7\x48\x13\x91\x5a\x2b\x5d\x15\xb3\x36\x46\x99\xc6\xcb\x34\x10\xc4\xca\xec\x21\x9c\xe2\x2d\x2b\x0b\x57\x6e\x5f\x1d\xc4\x1b\x4c\x2c\x41\x3b\x9a\x61\x23\xe9\xcb\x6a\xfb\x75\xff\xb8\xfc\xb6\x7c\xf4\x2f\x49\x50\x85\xd0\x16\x55\x3a\xab\xf7\x1d\xc4\xb1\xb4\x08\xbe\x4b\xc9\x80\x7f\x4c\x2e\x9b\x04\x61\x30\x62\xd1\xbd\xa4\x48\xa2\x81\x24\x80\x7b\x3c\x46\x37\x2f\x36\xbe\xb7\x98\x85\x69\x5f\x0d\x0d\x64\x6a\x85\xc7\x11\x15\x50\xb6\x0e\x0d\x72\x11\xde\x67\x90\x4f\x00\x3e\xed\x58\x8d\x31\xe5\x11\xe9\x22\xa6\xab\x57\xea\xd0\x75\x39\x60\x5d\x7e\xb8\x93\xd1\x40\xf1\x00\x4b\x91\x33\xaf\x8c\xd5\x75\x31\x74\x39\x0e\x1a\xa8\x34\xc2\xb2\xca\xdc\x03\x4e\x5a\x1b\x3f\x33\x26\xcb\x2f\xe8\x42\x68\xa0\x0c\x23\x5e\x8c\xae\x7b\x6b\xd7\x5f\xde\xe4\x25\x6a\xca\xb0\xde\xad\x44\xe1\xb5\xd0\x3a\xe5\x2d\x1a\xe8\x08\xbc\x14\x66\xd7\x34\xfd\xc7\xd8\x66\x68\x63\xa2\x76\x53\x6d\xde\x41\xe5\x27\xe9\xcf\x34\x2c\xc5\x44\xb9\x3c\x9d\xad\x27\x7a\xb1\x6e\x4c\x04\x89\x2b\x34\x2e\xaa\xb3\xae\xbe\x65\xf0\x73\xdb\x88\x42\x8b\x4a\x3f\x8b\x03\xf4\xc4\x44\x94\x04\x92\x26\x6c\xd0\x93\xb2\x6d\x3a\xf8\x0b\x25\x84\xdb\xe4\xde\x76\xbb\xae\xde\xec\x1a\xbd\x2d\x21\x4e\x09\x0a\xa4\xd9\x74\x6b\x59\xb5\xf1\x67\x31\xdc\xfe\x29\x21\xda\xd6\xd7\x75\xd9\x74\xbf\xa0\x15\xee\x79\xc7\xb2\x6e\xae\xea\xef\x8d\x75\xf8\x28\x21\x40\x31\xd9\xdc\x2e\xfb\x7b\x77\xcf\xd7\xd3\xbf\x94\xd0\xf6\x09\x06\xc4\x73\x96\x47\xf0\xa2\x60\x43\x09\x23\x46\x7b\x6a\x94\xcd\x8d\x8b\x31\xae\x6c\x80\x54\x56\x0a\x06\xfa\x0a\x94\xb0\x48\xf9\xd5\x82\xb0\x54\x9f\xde\xfc\x24\xa7\x47\x09\x13\x5c\x0d\x19\x07\xc7\xd3\x8e\x30\x61\xd1\xe0\x28\xa4\xe7\x88\xeb\x27\xc6\x9f\x70\xce\x2d\xe9\x8c\xbe\xd2\x30\xe5\x27\x03\xe1\x89\x12\x6e\xd4\x95\xae\x1b\x37\x28\xe2\x12\xd3\x7e\x42\x29\x38\x36\xf3\x4c\xdf\x97\xd5\xe6\x54\x7c\xdc\x1a\x9e\x02\xa2\xb9\x0e\xa0\xc5\xa0\x17\xae\x3d\x60\x63\xe0\xe5\xdd\x2b\x8a\x35\x2f\x77\x0f\xfb\xe5\xec\xe5\xf1\xdf\x1d\x98\xbf\x1b\xa9\x03\xa5\x27\xe8\xad\xc8\x1f\x8c\x93\x24\x18\x60\x6f\x66\x95\xcc\x1a\xd7\x9d\x32\x5a\x22\x24\x56\x21\xd6\x7c\x0f\xa0\x33\x61\x6d\x1b\x22\xbc\xc6\xb7\x1b\x2b\xcb\xce\xb0\x87\x42\xdb\x1e\x76\x7f\x00\x6c\xa7\x9c\xf5\x21\x11\x48\x73\xe3\x73\xc5\x26\x35\x0e\xa8\xbd\x15\xc5\x93\xf8\x75\x85\x82\x8e\x92\xc4\x18\xe5\xb4\x04\x5e\xca\x8f\xcf\xf4\x34\x28\x49\x89\x44\xef\x70\xc0\x0b\xea\x1e\xb3\xac\xa6\x4b\xc0\x9f\xc2\x18\x66\xc8\xd0\xe1\x2d\xb2\xe6\x26\x23\x4b\xf7\xf1\xd3\x44\xa6\xc9\x40\xf5\xd5\xf6\x3f\xec\xaa\x4c\x9e\x06\xe4\x63\x6e\xb0\x08\x02\xd5\x23\x63\x11\xbe\xf8\x32\xd0\x5b\xf0\xa3\x42\x89\xf8\x24\x07\x3e\x19\xf2\xab\x22\xd9\x41\xf7\x11\x05\xa3\x29\x78\xd6\x4a\xa1\x3e\x5a\xff\xf2\x0e\xea\xa6\x2a\xa7\x9d\xd6\x94\x08\x05\x98\x55\xb7\x99\x51\x8b\xfb\xdc\x40\xb5\xdc\x3d\xcc\x7b\xfc\x1a\x25\x32\x08\x71\x18\xba\x65\xe3\x23\x2c\xf1\x58\xea\x36\xfe\xa8\xb7\xd0\x7c\x87\x6c\x03\xd5\x93\xd3\x90\x9f\x3c\x85\x22\x0a\xac\x5e\xe0\xa9\x06\x6d\x43\xf4\xc9\x3d\x29\xa2\x99\xb5\xa2\xd8\x1a\x35\xad\xda\xf9\x51\xd2\x2a\x5e\x2e\x9f\xb7\xfb\xed\xeb\x7c\x3f\xdb\x6c\xf6\xcf\xb3\xa7\x6e\x9e\xeb\x24\xc6\x7e\x41\x55\x1e\x8e\xd0\x64\x6d\x88\x39\x55\x3c\xa3\x44\x0b\xee\x99\x0c\xb6\x50\x68\xa8\xec\x76\xeb\x8e\x42\x10\xf3\x60\x00\x09\xfa\x5b\xd9\x60\x4a\x80\x58\xda\x8d\xe3\xa9\x82\x3e\x54\xa4\xc4\x88\x04\x3d\x83\x55\xbd\xb0\x3a\xbb\x17\x84\x21\x76\x60\x48\x02\x85\xc2\x01\xdb\xc6\x0c\x39\x4d\x68\x48\x98\xf1\x3a\xc1\x9b\xaa\x34\x59\x33\xf3\x92\x0a\x6b\xf3\x50\x9e\x7c\x5f\x20\x0d\x09\x44\x48\xf8\x7b\xec\xe9\xfb\xa0\x50\xed\x57\xe9\x52\xc8\x34\x0c\x89\x21\xee\xe1\x9f\xe5\x37\xdf\x4c\x71\x59\xc3\xa4\x98\x71\x40\x86\x32\x87\x6c\xfd\xd7\x49\xd8\x1e\x3e\x77\x9c\xa6\x31\xae\x0f\xa1\xb5\xaf\xf7\x0e\x17\x46\xef\x94\x8f\x97\x62\x48\x45\x80\x86\xf4\xbb\x78\x13\xa3\x07\x65\x81\x4e\xc8\x80\xd1\x6f\x20\xc8\xfb\xad\xcc\x4f\x07\xb0\x44\x00\x1d\xe6\x85\x86\x8c\x87\x24\xea\x2c\x4a\x17\x57\x4d\xb7\xe8\x90\x29\xcb\xa8\x63\x79\xd8\x3b\x1e\xa2\x76\x67\xf6\xb1\x12\x73\x43\x79\x48\x71\xaa\xe2\xc6\x73\x87\x0a\xdb\x6b\x33\xcb\xf3\x2e\x4b\xe6\x7f\x3b\x0a\x44\x22\x3b\xe4\x25\xf2\x6a\xd8\x80\xc0\x6e\xa0\x81\x1f\x16\x46\x76\x57\x6c\xc3\x4c\x0c\x90\x7a\xa1\x1c\x3f\x24\xd2\x1e\xd1\xb5\xae\xde\x44\x91\xfd\x05\x95\xcf\xca\x42\xff\x7b\xda\x20\xee\xa5\xce\x1a\xd8\x9f\xaa\xbc\xfb\x3b\x58\xb9\x3c\x4b\xf1\x71\xf7\xb4\xbd\x60\x1c\x1c\x7e\x06\x3f\x5f\xc3\xc8\x08\x93\xfa\x1d\xb1\x06\x51\xa9\xf7\x2b\xfc\x4f\x34\x4c\xb8\xcd\x4f\xdb\xa4\xca\x67\x80\x35\x1a\xa6\xd2\x32\x2a\xa1\x70\xe5\x5d\xef\xf6\x84\x22\x54\xc4\x2a\x09\x83\x3a\x35\xd0\x7d\x00\x6b\x52\x93\xff\xfc\xcf\x80\xdf\x64\xf2\x5f\xfe\x0a\x34\x88\x1c\xdf\xc5\xfd\xa9\xd0\x93\x10\xc4\x0f\x8a\x24\x42\xf3\x6b\x9b\x50\x75\x7f\x55\x4c\x23\x34\xa7\x3e\xc9\xbd\x59\x94\xfa\x6a\xcd\x85\x86\x2a\x92\xc2\x02\x9c\xf3\x55\x81\xa2\x23\x27\x91\x2f\xa0\x6a\x32\x63\x15\xef\xaf\x48\x52\xd2\x50\x09\x40\x8f\x2a\x17\x75\xb3\x2f\x8d\x81\x6a\x9f\x75\xbf\xac\x65\x80\xe5\x58\x21\xcb\xaa\x71\x35\x71\x7f\x0c\x78\x8c\xbc\x0c\x25\xb6\x6d\x0e\x33\x7d\x34\x84\x18\x52\xb7\x10\x1c\x51\xf5\x75\xcf\x20\x84\xd4\xf5\x26\x9e\x8a\xba\xef\x1d\xa0\xa1\xd1\x76\x5d\x38\xe9\x90\xbb\x72\x52\x29\xa6\x6d\x4c\xad\xdd\x76\xe1\x9e\xd1\xd1\x95\x8f\xaa\x49\x43\x7b\x40\x83\x08\xb4\xbb\xe8\x93\xdd\x8d\xb0\xd7\xc9\x1f\x35\x96\x7f\x3f\xab\x5d\x34\xd0\x4c\x66\x12\x25\x01\xf3\x4e\xd6\xa6\x82\x1a\x59\xbe\xe0\x0e\x9e\xa0\x16\x63\x3f\x83\x92\x30\x10\x0e\x75\x8d\x88\xdd\xf3\xeb\x8b\x8f\xb4\x28\x11\x26\x1a\x12\x0a\x0e\xb3\xaa\x94\xd2\xc4\x8a\x3b\x69\xc8\xaf\x50\x51\x52\xca\xa8\xf0\x8e\xc5\xa2\x2c\x4c\xf6\xf6\x59\xa1\x84\x52\x16\x85\xd4\xf8\x98\x6b\xb9\x7b\xf2\x3f\xc3\x03\x60\x36\xed\xf1\x26\xb2\xc2\xe6\x24\xfd\x21\x1e\x63\x9e\x67\xf5\x51\x7e\x94\x43\xf3\x46\xb9\xa6\x48\xb5\xb5\xba\xdf\xba\x9b\xfe\xac\xd6\x4e\x69\xac\xad\x68\x20\x14\x7a\xdd\x4e\xac\xac\x78\x5b\x1d\x8e\x7e\xdd\xd3\x84\x07\x58\x80\x83\x43\xd6\x38\xa6\xb4\x4f\xc1\x03\x94\x26\xa9\xc2\x86\x40\x5d\xaa\x49\x10\x48\x13\x15\x60\xe5\x60\x2f\xda\x79\x88\x30\xc5\xdf\x5c\x2c\x0d\x62\x41\xbb\xb5\xe6\x6e\x60\x56\xe8\x85\x40\x03\xeb\xef\x32\x65\x80\x6c\x3c\xbb\x2a\x3b\xce\xf2\x6e\x8a\xd3\x54\xdb\xed\xfe\x41\x99\xab\x9c\x7f\x6e\x98\x08\x18\x38\xce\x86\xa5\x05\x51\xb6\x83\xeb\x01\xe2\xa0\xbf\x23\x11\x33\x35\x68\xd0\xb6\xdd\x16\x03\xd1\x20\xff\xd3\x42\x28\xb4\x7c\xb3\xa2\x28\x4f\x85\x82\xfd\x4f\x8b\xa6\xfb\xfc\x79\x85\x24\x81\xee\xa4\xe1\x60\xd9\xbc\x2f\xc4\x71\xd3\x23\xaa\xc7\xa3\x25\x4d\x2d\x3b\x62\x56\x64\xc8\xd1\x7d\x07\x8d\xc8\xf2\xeb\x37\x2e\x63\x86\xab\xb8\xb5\x21\x18\x10\xb6\xf1\xc0\x64\xe2\x4a\x13\xe3\xb6\x7d\xbf\x5e\x8c\x26\x95\x0e\x23\xd6\x11\x7d\x62\xe9\xb1\x9b\x89\x1a\x08\xe2\xb2\x4b\xed\x39\x18\xdb\xbf\xd9\x9e\x4f\xf1\x03\x2a\xf1\x66\xf9\xed\xfa\x72\x26\xa5\xe0\x38\x19\xa6\x1c\xe5\xfe\x30\x0d\x43\xeb\x1b\xd9\x57\xb7\x3d\x1d\x5b\xb3\x61\x77\xc6\xee\x1a\x5c\x23\x00\xeb\x7b\x59\x61\x1a\xf6\xad\xbb\xba\x31\x0c\x23\xd6\xbd\x99\x92\x7a\x53\x16\x04\xca\x38\xeb\xf2\xb8\x5e\x0c\x4a\x28\x94\x05\x69\x80\x14\xf5\xcb\xe5\xff\x51\x03\x06\x37\x77\x94\x84\x80\x96\x6c\xdb\x94\xed\x23\xf9\x66\xe2\x3e\x03\xc1\x88\x20\x58\xa8\xaf\x2c\x8f\x90\x43\x93\x7b\xca\x84\x0b\x9e\xee\x01\x7f\x77\x9f\x74\xa7\x8c\xe8\xd8\x32\x42\x64\x3f\x60\x97\xfd\xba\xda\xe3\x49\x59\x18\xa6\x54\xf7\xac\x64\x59\x59\xf4\xa4\x67\x94\xd1\x58\xf3\xc0\x37\x71\x9e\x8a\xa6\x83\xaa\x50\xc6\xe2\x34\x09\x7b\x4d\xc7\xab\x1b\x1c\x63\x42\xe9\xae\x27\x6c\x6d\x4c\x0d\xdd\x4b\x62\x32\xc0\x34\xea\xa9\xca\xf7\x48\xb6\xb1\x3f\x8a\x63\x37\x19\x18\x03\xe6\xd5\x5c\x1f\xb2\x69\x24\xc5\x78\x28\x2d\x14\xdf\x2a\x2d\x5d\xf0\xd1\xf9\x61\xc6\x8a\x1e\xfe\x3a\x8e\x84\xcb\x29\x8b\x68\x82\xf7\x65\xd1\x37\x0f\xa2\xd2\xca\xb3\x8f\x53\x16\x13\x4d\x5c\x54\x84\xb3\xfb\xaa\xfb\xcb\x92\x90\x5a\xdc\x87\xfb\xcd\x4d\x95\x1d\xa6\xf0\x67\xca\x12\x0a\xcc\xb6\x7e\xe7\x2f\x65\x0d\x45\xbb\x77\x59\x81\x87\xc9\x38\x43\xc0\x32\xa5\xab\x8f\x59\xd3\xc0\xa1\xbb\x9b\x94\xc4\x9a\x79\xee\xfc\x3c\xb7\x64\xbe\x36\xb8\x19\x6d\x42\x2c\x8d\x19\x56\x05\x9f\xa0\x28\xab\x72\x21\xea\xf7\xd1\x26\xcd\x52\xb0\x02\xa8\x0e\x39\xb3\x6d\xe0\x58\xcf\xcf\xc3\x74\xc7\x78\x99\x33\x11\x00\xa6\xf1\xc5\xf1\xf8\xd0\xe5\x97\x98\x70\x99\xa9\xbe\xc3\xe4\x92\x78\x96\x32\x01\x04\xd3\x21\xdf\x45\x9e\xdf\x65\x15\x0c\x18\xb9\x28\x93\xa1\xc2\x62\x6d\xc7\xb1\x32\xec\x4b\x19\x6e\xe1\x4c\x05\x02\x6c\x9a\xf2\x20\xb3\xde\x27\x98\xb0\xca\x51\xa6\x98\xc4\xa4\x97\x86\x63\x5e\xe2\x33\x0d\xc8\x6a\x28\x83\x20\x40\xbc\xc4\x62\xbd\x7a\xde\x6f\x5f\x37\x9b\xc7\x7f\x23\x93\xc0\xe6\x61\xb6\x5d\xee\x49\x37\x8c\x5b\x99\xdf\x26\x6b\x9a\xf3\x24\xb1\xc8\x80\xdb\x1a\xd6\x6e\xf5\xb4\x9c\x60\xac\x28\x03\x41\x70\x3e\xa2\xfc\x42\x5f\x2b\x60\x86\x00\xb6\x09\xff\xf3\xdb\xd5\x9c\xf7\x75\xd3\xcd\x4c\x6a\x13\x65\x7d\x9f\xea\x4a\xb9\x82\x3e\xe5\x41\x98\xe2\x4c\xd9\xfe\x6b\xd7\xfd\x29\x05\x4c\x25\xea\xb2\xf8\x80\x73\xbd\xcc\xb3\xb7\x4c\xe6\x70\x5f\x56\x83\xb5\xcc\x03\x88\x91\x31\x72\x50\xba\xf6\x5d\xb8\x2b\xe3\x1c\xa4\x0e\x07\xd9\x4c\x94\x0b\xdd\x35\x48\x68\xdb\x7c\x86\x94\x5e\x9e\x1c\x63\x32\x52\x0a\xab\x6b\x02\xea\xfd\x5b\xd9\x60\x6e\x73\x34\x45\x38\x51\x36\x4f\x8f\x8a\x29\x48\xe2\x34\x68\xc5\xa7\x3c\xe4\x1c\xa1\x3d\x52\xf6\xec\xee\x43\x32\xfb\x76\x84\x15\xea\x3c\x88\x5f\xcf\xa7\x83\xdc\x40\x65\xb9\xf2\xba\xe3\x91\x40\x6f\xb6\x39\x55\xc5\xda\x98\x6d\xd7\x94\x47\x39\x0d\xac\x61\xb7\xad\xb5\xcf\xf0\x0b\x79\xde\x56\x45\xd6\x88\xd6\x0f\x9b\x43\x73\xc1\x30\x4d\x39\xa5\x84\x26\xae\x02\x6e\xcb\xf7\xd7\x17\x0e\xa7\x71\x82\x21\xc8\x0e\xea\x66\xf4\xab\xa9\xc2\xa5\x7c\xc8\x8a\x36\x86\x29\x4f\xd5\x75\x15\x1d\xca\x59\x18\x62\x15\x64\x8f\x29\xb4\x57\xa7\xe4\xed\xaf\xc3\x12\x99\xb8\x00\xbb\x13\x4d\xa0\x9c\x49\x0a\x83\xcc\xf7\x56\x34\xf5\x10\xb1\xd5\x8d\xb2\xb4\x90\xe2\xa4\xb3\x66\xc4\x4e\x36\x86\x1b\x8f\x76\x94\xe9\xdd\x81\xc2\xb0\x49\xfa\x26\xea\x75\xf1\x7a\xb4\x19\xea\x6e\x13\xe3\x9c\x5a\x72\xc0\x53\x51\x1f\xa1\x68\x16\x15\xe8\xac\xa9\xfd\x8c\xf3\x96\x98\x73\x15\xa1\x23\x87\x65\xa7\x5d\x79\x4d\x95\x8f\xf2\xc8\x30\x24\xe0\xf8\x5a\x16\x4d\xde\xad\x84\x98\x08\x47\xc6\x06\xc5\x03\x54\x13\x9e\x30\xca\x63\xa5\xa9\x6d\x22\xf9\x21\xf4\x58\x4e\x88\xf2\x84\x89\xd0\x73\x76\x6e\x1b\xd1\xd4\x9f\x11\xd1\x50\x9e\x44\x51\xc2\x3b\xcd\x8f\x9b\x24\x16\x94\x27\xb1\xe5\x95\xb8\x5b\x7e\x5b\x3e\xae\x37\xcb\x97\x3d\xc2\x32\xfd\xcf\xa6\x84\x44\xf6\x23\x99\x2c\xbf\x04\xaf\x8e\x3e\x55\xca\xe2\x34\xbe\x00\xdd\xdb\xb2\xcf\xf8\xa3\xa6\x71\x8c\x8b\x6d\x23\x2a\xa1\x33\x07\x16\xda\x5e\x01\xd3\xfc\xed\x7f\xaf\x7a\xb7\x3c\x95\x3a\xb0\x7c\x2d\x19\xfa\x50\x57\x9a\x15\x28\x97\x04\xa4\xab\xe5\xac\x7f\x40\xd5\xe5\x08\x13\x7f\x5c\x27\x48\x56\xbf\x77\xec\x8a\xad\x63\xb3\x11\x55\x43\xae\x07\xe9\xbc\xf5\xf4\x87\x24\x7e\xeb\x6b\x88\x8a\xe9\x39\x61\xec\xe5\xff\x96\x07\xac\x92\x4f\x6e\x52\xa5\x91\x97\x3c\x6c\x57\x7f\xdf\xe6\xb2\x2a\x50\xc3\x7f\x3c\x1a\xb8\x76\xb1\x22\xe6\x87\x3d\x75\x97\x9f\x9f\x51\x60\xb8\xb0\xb1\xb1\x7d\xed\xa3\x8d\x37\x0a\x89\xc5\xdc\x68\x30\xe2\x94\x37\xbe\xda\x33\xd8\x27\xa2\x90\x09\xac\x77\xa3\x1d\xbc\x9f\xa8\xe4\xd2\x28\x8c\x02\x4c\x44\x37\xef\x59\xa5\xb1\xb8\x70\x2c\xb3\x62\xd8\x5b\xde\x8e\xd1\x26\x1e\x93\x3b\x7e\x1a\x2b\x46\xa1\x0c\x71\x2a\xce\x2e\xbb\xe8\x69\x44\x63\x88\xbc\x28\xf4\xa8\x6c\xdc\xa3\x81\x69\xc4\x62\x9a\x26\xae\xf8\xb5\x7b\xaf\xca\x9f\x2f\x60\xd5\xd9\xcb\x66\xc0\x97\x44\x23\xce\x35\xa2\x9a\xef\x45\xd1\x78\x36\x4a\x1a\xf1\x98\x60\x3a\x4e\x43\x83\x52\x3b\x60\xab\xaf\xcb\x69\x5d\x28\xe2\x0a\xac\x78\x13\x34\xdf\x5b\x1f\x13\x11\x7e\xe3\xea\x0f\x77\x43\x63\x20\xa2\x93\x41\x2f\xde\x9a\xf7\xb5\x79\x12\x4d\x8f\xab\xa3\x51\x6c\x28\xd6\x07\x95\x2f\x5b\x2f\x0b\xdd\xa5\x5e\xa2\x84\x4b\x5c\x72\xf2\x38\x74\x17\xa3\x44\x87\xbe\xa1\xa4\xc9\x8e\x79\x6b\x4b\x76\xe5\xcd\xec\x5d\x24\x48\x84\x09\x43\x07\x73\x5c\xd5\xf5\x09\x33\xfd\xbf\x59\x74\xfe\xec\x44\xa7\x7a\xc8\xc0\x53\x5e\x32\x48\xf8\xa1\x10\x60\x02\x55\x0f\xa2\xc6\x0e\xa3\xe1\x6f\x5e\x02\xc5\xf7\x8c\x3e\xa3\xca\xcb\x93\x1e\x3d\x9b\xd6\x01\xe6\x0f\x8f\x22\xd3\xf3\x4c\xf7\xb5\xd9\x76\x1a\x8e\xcc\x70\x04\x41\x84\x21\x0f\xb8\x19\xfc\x79\x3e\x20\x02\x22\xf0\xad\x6d\xaa\xf2\x50\x5a\xa5\xec\xac\x78\xca\x8a\x66\xcc\xa5\x40\x23\x70\x42\xee\x35\x34\xb3\x76\x5b\x6a\x9f\xf8\x0a\x56\x21\x02\xcd\x45\x34\xe0\x93\xf6\x82\x46\x57\x54\x5d\xda\xc1\x09\x66\x4e\x10\x3d\x3b\xa1\xa6\x75\x43\x4c\x12\x09\xcb\xa8\x7c\x10\x58\x59\xb8\x66\xcf\x22\x63\x84\x05\xc4\x15\x99\x25\x0b\x18\x1f\x8f\x03\x1a\x6a\xdb\x54\x6a\x7b\x64\xff\xf0\x7f\x4f\x42\x4f\xc9\xe3\x33\x56\xfa\xae\x54\x57\xee\x35\x26\xd2\x36\xb7\x6e\xa1\xb1\x32\x9b\x43\x50\x3b\x8d\x43\x66\x2c\x91\xfa\x98\xe7\xf6\x2a\xdd\x3c\x8d\xc3\x34\x46\xf0\x09\x26\x70\x87\x8d\x77\xed\x21\x4b\x64\xb5\x78\xdd\xee\xd6\x4f\x7b\x04\xc9\xef\x17\x2f\xcb\xd9\x6e\xb9\xdf\x2e\x5f\xbe\xad\x16\xcb\x61\x75\x22\xa6\xa1\x40\x5f\x7f\xbd\xdd\xc1\xa8\xab\x87\xc6\xd4\x04\x98\xf2\xdb\xd7\x98\x5d\xbb\xb0\xb0\x31\x4b\x8d\x77\x4a\x2d\xca\x10\x17\xda\x20\x76\x8f\x39\x81\xd4\x76\xaa\xea\x17\xd0\xf2\x94\xe7\xff\x6a\x1d\x97\xc9\x75\x38\x4b\x8c\x2d\xdd\x54\x19\xd4\x23\x6e\x5f\x1a\xf3\x38\xc2\x07\x3a\x15\x79\xbb\xcc\x27\x3e\x7b\xcc\xb5\x48\x68\xc7\xa7\x30\xab\x2e\x88\x23\xdc\xb8\xc8\x00\x6a\x5f\x38\x01\x53\x94\x59\xff\x7c\x87\x89\x63\x6a\x12\xdf\xe8\xb7\x13\xc7\x21\x4f\x2f\x8d\x13\x63\x91\xa2\xf7\xb3\xcd\x7d\x9f\x84\x0e\xfd\xe1\x34\x06\xed\xd5\x70\x8f\xc7\xf9\xf9\x4a\x51\x32\x16\x94\x4b\xd7\xe7\x60\x00\x5b\x4d\x46\xa5\xd4\x58\x30\xab\xcd\xe9\xbc\xbd\x75\x01\xaf\xaf\xab\xbb\xeb\x5b\x68\x2c\x39\x20\x3e\xd8\x8a\x78\xbb\x3f\x2a\x87\xd9\x7f\x5a\xec\x6e\x23\x2c\xc7\xd7\xd1\x61\x14\x5a\xca\xc1\xfa\x74\x03\x91\x3c\x4c\x41\xc4\x90\x32\x6c\x1e\x70\x69\x74\xbf\x5e\xc7\x1c\x56\x6e\xac\x21\x0c\xc1\x90\x56\x12\xe8\xb1\x9f\x69\x86\x58\x4f\xed\x5d\xd4\x2b\x27\xb4\x30\x9e\x22\x49\x10\x6b\x91\x74\xd8\xe0\x32\x53\x59\xe1\xf3\xa4\x76\xb5\x0d\xb7\x93\x24\x50\x14\xed\xab\x14\xea\xe3\x15\x59\x03\x87\x9b\x55\x12\x72\x8a\x09\xaa\xed\xee\xc5\xff\x89\xca\x0e\x74\xb3\x3d\x55\xc7\xdc\xf3\xb6\xd0\x84\x71\xf0\xfa\xbb\xad\xdb\xd0\xeb\xae\xd1\x84\xa9\x00\x59\x75\x85\x2d\x35\x51\xff\x77\xce\x15\x66\x17\x6c\xe8\xe1\xeb\x13\xb7\x84\xd8\x6e\xfd\xff\x29\x45\x24\x5e\x57\x53\x9f\xef\x43\xbf\xfc\xbe\xb4\x32\xe5\x57\xab\x5a\x09\x4f\x28\x6a\x84\xd5\xd9\x5f\xb0\x36\x1e\x75\xd3\x3d\x59\x14\x30\x64\x00\xc4\x8c\xd9\x64\x5d\x25\x51\xc4\x30\x12\xfa\xdf\x32\x2b\x16\xef\xa2\x28\x20\x9f\xfe\x8a\x67\xae\xa3\x49\x14\xa7\xb1\x9b\xed\x0f\x20\xf2\x11\x4b\x3b\x4d\x22\x4d\xb1\xf1\x6a\xdf\x40\x71\x2a\x4f\x43\x92\x36\x9a\xc4\x0e\xda\xef\xeb\xd3\xf5\xb6\x9c\xb0\x54\xd2\x24\x86\x98\x03\xd6\x7b\x2c\xe0\xc7\x12\x41\xb6\x5b\x88\xdd\x7d\xaf\xb2\x56\xba\x73\xd3\xc4\x46\x74\x4f\x65\x01\xe7\x9e\xe7\x99\x26\xa9\x08\x91\xad\xbc\x7d\xc0\x2f\x53\xdd\x29\x9a\x08\x6a\x60\x98\xd3\x1f\x65\x6d\xaf\x2e\xc1\x44\xa8\x94\x76\xe9\xe7\x6e\xb2\x49\x43\x11\x58\xb1\x79\x59\x3f\x2d\x77\x0f\xcb\xd7\xed\xde\x82\x5f\x57\x8b\x65\x3f\x46\x8a\xb0\x2b\x2e\xb4\xef\xba\x0d\xa2\x26\x77\xa4\xb8\x44\xf2\xb3\x4c\x95\x5e\xe8\xa9\x97\xb1\x7f\x84\x1f\x90\xfb\x2c\x47\xa2\x29\x4f\x1d\x1e\x65\x57\x36\x22\xdf\xbd\x43\x59\x41\x93\x29\x4f\x61\xd3\x0d\x14\x56\x3a\x1a\x86\x74\x87\x34\x01\x2e\x09\xf3\x28\xb5\xcb\x86\x26\x9a\x40\xaa\x31\x6f\xb4\x6d\xca\xe3\xfd\xa9\x06\xf1\x0c\xa8\x79\x7a\x25\xb7\x9d\x98\x38\xc6\xb4\xba\x05\xba\x6f\x41\x95\x9e\xd7\xa6\x1b\xa1\x2c\xb7\xe0\xdd\x6a\xbb\x40\x0d\x1b\x6c\xbf\xf7\x82\x36\x3b\x6f\x54\xd3\x80\x07\xe8\x64\x2e\xd6\x4f\x4f\xaf\xcf\xab\xdd\xbf\xad\xea\xef\xf2\x65\xbb\xdf\xee\x66\x5f\xfd\xeb\x4c\x09\xb5\xc9\xd5\xe7\xe5\x9f\x5d\x58\x96\x12\xad\xd1\x59\x78\x17\x85\xce\xe1\xf1\xa4\x3e\xce\x9e\xd6\x61\xf4\x19\x53\x62\x02\xf4\x45\x51\x4d\xb1\x01\x35\x5e\xb9\xce\xee\xa5\x21\x53\xa8\x3a\xb1\x03\x71\x78\x2c\xd5\x47\x56\xbc\x59\x22\xb8\xe8\xa9\x2c\x9a\x77\xff\x6c\x69\x18\xc5\xd8\x29\x9a\x99\x3b\xb0\x62\xf9\xa3\x37\x99\xb2\xd4\x8a\xa2\xd7\xd0\x3c\xdf\xef\x6e\xb8\xf5\x7e\xac\xb0\xd1\xe2\x41\x7c\xc0\xc3\x59\x56\x99\xce\xfe\x1a\xcb\x43\x8c\x9f\x84\x29\xc5\xae\x49\xce\xe5\xbf\xd9\xf9\x52\x0e\x56\x3c\xb9\x3e\x82\x72\xa4\x74\x3f\xa7\x4e\x48\xea\x99\x3d\x91\x1b\x0f\xf5\x2e\x5d\x3f\x97\x7f\xf4\x18\x98\xb6\xe1\x4a\x9e\x5f\x41\x60\xa4\xb1\x49\x91\x5a\xe9\xeb\xf3\xdd\xd0\x24\xa4\x09\x8f\x91\x1f\x61\xbb\x9b\x3d\x8f\x0f\xc4\x51\x1a\x0c\xc9\x02\xba\x03\x22\x12\x91\x47\x6f\x55\x17\x69\x9d\x34\x91\xb6\x49\x68\xbb\x78\x58\x3e\xcd\xf6\x0f\xb3\xed\x83\x3f\x35\x15\xdc\x6a\x15\x5b\x9b\x35\xd3\x97\xc2\x24\xe3\x6b\xa5\x40\x4c\xd8\x6b\x17\x94\x96\x45\x63\x51\x1e\x8e\xa2\x38\x5f\x13\x15\xbc\xfc\x2e\xa9\x49\xe2\x9e\x99\xf0\x3e\xcf\x8e\xb3\x42\x3f\xdd\xed\x6e\xf5\xec\x4e\x4e\x17\x21\x67\x1d\xea\xf2\x39\x7b\x7b\x6f\xba\xd9\x26\x64\x18\xd8\xf6\x80\x26\x33\x67\x0f\x30\xbd\xce\x34\x43\x53\x01\x10\x44\xfd\xde\xfd\xf7\x52\x97\xa9\x8c\x34\xce\xd8\x7f\xbd\xae\x9e\x3f\xa1\xb4\x9d\x9e\x25\x3b\xc7\x7e\x51\x76\x30\x7c\xcb\x78\xe7\xef\x5e\x05\xa1\x6c\xf7\xe5\xf5\x66\x3b\xfa\xee\x9a\xd2\x54\x0e\x58\xf2\xc4\x1b\xcc\xcf\x03\x37\x33\xd5\x82\x60\xe1\x6f\x7b\x2c\xab\x66\xdb\x88\xea\x49\xf4\xac\xde\xed\x61\xcb\x2f\x8b\xe0\x1a\x54\xe3\xbf\x07\xb8\x83\xa2\x44\xf5\xd7\xae\x4a\x94\x42\x9c\xa0\xc3\xf7\x65\x39\x5f\x2e\xba\x3f\x26\x14\xeb\x08\x6f\x27\x51\x69\xd0\xb3\xaa\x12\xe7\x17\x5b\x10\xf9\x63\xb0\x45\x0f\x37\xea\xd4\x84\x96\x10\x69\x0e\x4e\x2e\xa2\x75\xc3\x43\xef\x1f\xa4\x26\xb4\xbd\x23\x36\x8e\xaf\xa1\xa8\x4f\x1e\x3e\x33\x99\xb8\x46\x19\xcc\xb0\x5d\xa3\x14\xa2\xa9\xd1\x51\x62\x46\x94\x5c\xae\xa7\x0b\xbb\xb9\x47\x57\x12\x41\xa2\xd3\xb8\x6f\x44\x84\xd5\x62\x2d\x7e\x88\x2c\xcf\xba\x96\x14\x2a\x88\x24\x48\x2d\xe1\xfa\x09\x11\xff\xe5\xef\xab\x1b\x62\x39\x33\xee\x44\xd1\xb3\xc0\x52\x41\x54\xe8\xfb\x6e\x37\x65\xf1\xf6\x43\xe4\x7f\xf4\xb6\x52\x10\xb0\xe8\x9a\xf2\x08\xc5\x23\x08\x0d\x95\x2c\x45\xa5\x5d\xe1\x71\xe8\xb9\x89\x90\x09\xea\x5d\x9c\xd9\xec\xa2\x19\x60\xf4\xfc\x22\x8c\x43\x2c\x1e\x3f\xc2\x96\x0e\xef\x86\x12\x16\xd1\x81\x5a\xf2\x23\x56\x52\xba\xa4\x86\xa0\x94\xa2\x70\xe2\xfc\x74\x32\x87\x11\xa7\x29\x15\x34\xd2\x68\x94\x0e\x99\x2b\xd7\x7e\x1e\x01\x0b\x1a\xab\xc0\xb1\x6c\xbc\x3c\xef\xe6\xd7\xc4\xc6\xa7\x67\x08\x1d\x77\x62\xb6\x2f\xe5\x24\x83\xe7\xdf\x19\x0f\x62\x04\xed\x43\xa1\x47\xb2\x17\x93\x8b\xf1\x30\x42\xbf\x15\x7e\x1d\x45\xa1\xff\xf4\x4f\xc1\x13\x8e\xac\x67\x7f\x41\x55\xce\xcb\xd2\x17\xe8\x45\x24\x13\xdb\xa1\x68\xa7\xcb\x1c\x0a\x30\x99\xca\x44\x75\xee\xb3\xcc\x22\x89\x2d\x27\xac\x25\x3c\xb3\x22\x46\x97\xa1\xba\x48\x40\x23\xf8\xfb\xb1\x54\x19\x86\xc5\x1d\xf0\x42\xa4\x01\x70\xf0\x34\xfa\x56\x74\x67\x87\x53\x0a\x25\xd3\x1d\x2c\xf6\x69\xf1\xfd\x2a\xf9\x11\x15\xa9\x20\x58\xcb\xd9\x3e\x7b\x88\x85\x10\x91\x20\xf1\x28\x2c\x99\x15\xbe\xc2\xff\x69\xcf\x18\x15\x22\x06\x12\xfa\x16\xaf\x32\xcf\xa1\xba\x83\x1c\xde\xfa\xd4\x9c\x90\x82\x20\x19\x5c\xb6\x10\xa3\xa4\x90\x90\x20\x98\x67\xb2\xc3\x0a\xed\x57\x38\xdf\x30\xa6\x42\x51\xe3\x8b\x78\x9b\xf5\xfa\x71\x0f\x3a\x6b\xf6\xbe\x5d\x9e\x0a\xc5\x64\xe0\x58\xd1\xff\x75\xca\xd4\x07\xee\x1d\x96\x20\x72\x72\x9d\x54\x60\x2e\x67\xa1\x3c\x60\xfb\xaa\x91\xbd\xb2\x76\xb4\x8e\x51\x65\x0f\xb3\x02\x57\xc3\xbc\xe4\xd2\x56\x09\x0d\x12\xc1\x80\xeb\x02\xda\x0f\x7e\xa5\xc5\x69\xfc\x3a\x81\xd9\xc0\xe0\x0d\x9a\x47\x51\x5b\x11\xdc\x61\xe1\xda\x0f\x13\x51\x6a\x29\x72\x9f\xe1\x57\x33\x3f\x69\xfb\x0e\x8b\xa7\x4e\xf5\x93\x0a\xd0\x61\x98\x38\x07\xa1\xdf\x06\x04\x68\x85\x55\x2c\xc4\x0f\x0c\xf3\xf0\x43\x6c\xf3\x8d\xe5\x68\xa4\x40\x89\x8f\x47\x4b\x41\x66\xff\x2a\x03\x21\x01\xf9\x11\xde\xcb\x9f\x08\x51\xbd\xbc\x61\x19\x48\xab\x82\x85\x18\xee\x3c\xaf\x0f\xb8\x85\xbc\xc0\x7f\xbb\x8b\x68\xe9\x84\x8b\xed\xec\xd9\x87\x17\x3c\x92\xff\xf9\x9f\x7f\xf4\x30\xec\x31\x59\x3f\x95\x84\x50\xec\x0f\xb1\x7e\xf0\x9d\x68\xc0\x4f\x0e\x49\x88\x94\xa4\xeb\x8d\x38\x42\xd5\x9c\xdb\x77\xeb\x2a\x2e\xa7\x5e\x44\xa1\x1d\xaa\xb1\x04\x6c\xdd\x8f\x5f\x13\x77\x52\x92\x38\xc6\x84\x9c\x73\x20\xef\xa0\x13\x96\x1a\xf3\x29\x0e\x27\x8e\x24\x60\xd1\xd1\x7e\x6f\x16\x45\x33\xc8\x43\x48\x62\x12\x6c\xeb\xc9\x45\x6d\x37\x18\x7b\x5f\xdd\x7a\xf6\xe3\x42\xc9\x12\x97\x91\x6f\x7f\x63\x57\x3a\x08\xe6\x93\x38\x4e\xee\x92\x46\xcc\xeb\x80\xcd\xda\x4d\xa8\x0d\x3e\x6c\x8f\xfa\x10\x64\x21\x69\x2c\xad\x1b\xfa\xdf\xaa\x19\xa5\xcb\x24\x15\x26\x71\x56\xd7\x02\x9a\xaf\x47\x7f\x92\xca\x38\x18\x91\xf5\xbe\x16\x8d\xf8\x05\xfa\x53\x19\x27\x2a\xa9\x8a\x63\xd2\x37\xf4\x6f\xdf\xab\xac\x7f\x4c\xc6\x14\x3a\x93\xa2\x6e\x03\xbd\x67\xf8\xb9\x11\x95\x82\xdc\x0b\xef\x4c\x5c\xb7\xd1\x8b\x66\x29\xf5\xa8\xca\x36\x6c\xbf\xcf\x44\xa7\x68\x36\x1a\xc7\x85\xc0\x8f\xbc\xdd\xcd\x7c\x05\x58\x72\x19\xf2\x8e\xb1\xe5\x41\xd4\xed\x8d\xed\x46\xf4\x28\xe3\x47\x8f\x42\x0b\xe8\x3f\x88\xac\x18\x15\x55\x65\xa4\x00\xa9\x77\xe4\xe9\xdc\x06\x92\xd9\x31\x87\x55\x03\xd7\x2d\xc6\xc5\x0a\x93\x91\x51\x58\x99\xb4\x0d\x8c\xaf\x1d\xe8\x53\xc6\x84\xab\x81\x97\x36\xc4\x6b\xf5\xeb\xe2\x72\x01\xfb\xb3\x25\x61\x1e\x4c\x59\x01\xfc\x85\xee\xdd\x64\x08\x28\x2c\xf6\x61\xfa\x68\x6d\x46\xf5\x19\x19\x1b\x95\x44\x5e\xa6\xde\x16\x9b\xf7\xef\x38\x35\xbc\x73\x2c\x93\x20\xc5\x64\x64\x2d\x72\xe8\xe9\xba\xa9\x4c\xe2\x50\x0f\xab\x4f\xf7\x55\x79\xf8\x3c\x08\x90\x89\x01\xa4\x8a\xa9\x85\x81\xa7\x53\xbe\xd7\xa0\xae\x6f\x0b\x32\x4d\x4c\x1a\x4e\xb7\x05\x8f\x90\x97\x82\x32\x04\x2f\x35\xfb\xa7\x4c\xbd\x8b\xac\x7b\x99\x82\x45\xb1\xcd\x38\x77\x46\xd6\x1f\x92\xc4\x66\x5d\x8f\x15\x1c\x45\x05\xbb\x72\xab\xca\x0a\xc6\x6f\x43\x26\x41\x18\x8e\x74\x6c\x5e\x44\xd3\x3a\xcd\x58\x35\xec\x2b\x07\x52\x26\xb6\x9a\xe2\x9f\xbd\x3d\x76\x1d\xc7\x30\x7e\x2c\x29\x18\x8a\x8f\xf9\x52\x54\x26\x6d\xf4\xfb\xbb\x49\x34\xb9\x8c\x0a\x53\xc4\x90\xd4\xe7\xba\x81\xc3\x12\xc3\xf1\x61\xc9\x4b\x2a\x21\xc0\xc9\x39\x6f\xca\x7a\x9c\xe6\x93\x9a\x69\x7c\x49\xa5\x45\x28\x0f\xdb\xcd\xa4\x4e\xad\x3e\xfe\xbe\x5d\xfa\x23\xd8\x81\xd4\x22\x40\xef\xfc\xe9\x6c\xdf\x8d\xd7\xee\xa1\x12\x18\xb7\xed\x15\xa2\x51\xef\xd8\x8e\x5a\xff\x71\xb1\x63\x4a\x30\x5c\x3b\x41\xb9\x0a\xbe\x43\x6e\x86\xc8\xc4\xd1\x0d\x9a\x80\x61\xf1\xc6\x88\xba\x59\xf6\x5f\xd0\x84\xa9\x05\xa1\xbc\x81\x23\xfb\xae\x37\xa2\x6a\x9c\x4e\x53\x37\x5f\x8d\x8a\xe3\x5e\xc5\x09\xe7\xc0\x1d\xe4\x62\xd2\x52\xa8\x82\xc4\xd6\x1e\xb3\x22\x6b\x9e\xb2\x62\x48\x8f\x41\x15\x09\x38\x66\x96\x20\xcf\x30\xd8\x81\xd1\xe4\x1e\x5f\x88\x84\x34\xf2\xbd\x89\xa8\x91\x38\x95\x91\xbe\xee\x60\xa9\x90\x45\x56\xa3\xac\xdf\xac\x26\x57\x0e\x25\xc3\xbd\xd5\x60\x55\x68\xf3\xb2\xec\x41\x66\x2a\xd4\xc0\xb9\x95\x54\xac\xba\xb2\xe6\x42\xd4\x59\xe1\x51\x00\x8a\x86\x1a\x9d\x5c\x55\x37\xbb\xf2\x29\x53\x55\x7f\x44\x5b\x36\xba\x67\xf8\x69\xd9\x35\x26\xef\x86\x25\x8c\x58\x66\x80\xb7\xb7\x1c\x2c\xc4\x62\x7e\x3a\xf7\xce\x86\x62\x29\x4b\x1c\x08\xed\xae\x2c\x2e\xe4\xb7\xa8\xe2\x22\x48\xfa\x64\xee\xa2\xac\x27\x31\x9a\xe2\x8a\x73\x2f\x3e\x78\x10\x6f\xb0\xa9\xb2\x1f\xd3\x21\x90\x62\x71\xf7\x70\xca\x43\xac\xa2\x4e\x8e\x47\x34\xf5\xfb\x82\x14\xea\x46\xcf\x95\x8a\x52\xcb\x25\xe0\xd5\x7e\x3c\x57\x9d\x3f\x2c\x15\x4d\x07\xdb\xef\xa4\x48\xa8\x22\x65\xb5\x09\x05\x02\x7d\xd1\x3e\x3b\x03\x89\x31\xed\xe4\x96\x62\x4a\x0c\x12\x41\xd7\x0b\x51\xf4\xe2\x46\x54\xc5\xa9\xc0\xf4\xd8\xa2\xcc\x8a\xfb\x53\x97\xc4\x53\x09\x0f\x5c\x37\xbe\xad\x69\x7e\x19\xfc\x74\x12\x05\x98\xbd\x5f\x3d\xef\x5e\x96\x9b\xd5\xdd\x7e\xfb\xb0\xda\x8c\x52\xa0\x2a\x49\x45\x10\x0c\xa0\x2d\x9d\x2e\xb3\x77\xa3\x92\x11\xf8\x5e\xa5\x8c\x22\xb5\xe8\x10\x59\x3b\xce\x3b\xab\x34\xb5\xe0\x21\xd4\xcb\x52\xcd\x3f\x4b\x39\x9a\xc8\xde\x58\x2a\xa1\x35\x82\x88\x0e\x03\xb8\xb2\x3f\x64\x14\x42\x27\x7f\x94\x0d\x3c\x97\x6d\x1c\xd9\x2e\x8a\x43\x56\xcc\x5b\x0b\x71\xb9\xbd\x5d\x76\xdf\xa9\x76\x67\x73\xb0\x5b\x93\x9f\xa0\x50\x30\xcb\xdf\xca\x2a\x6b\xde\x0f\xd7\x90\xb7\x4a\x0a\x8e\x64\x1b\x12\xa3\xef\xaa\x7c\xab\xc4\x61\x58\xc0\x56\x8a\x44\x28\xa7\x2e\x51\x01\xc2\xe2\x5c\x27\x85\x9a\xf1\x43\x28\xca\xb0\x34\xb4\xaf\xa1\x79\x39\x15\x60\x5b\x79\x09\x99\x7c\x71\x15\x73\x91\x0c\xda\xd1\x06\x6b\x54\xc5\xb6\x61\xe4\x54\x43\xb5\xd2\x03\xa5\x00\xaa\x54\x2a\x30\x27\x87\xda\x7b\x1d\xea\xec\xf3\x18\x42\x69\x1e\xa4\xc3\x7e\xa6\x5d\xe9\x8b\x13\x93\xf7\xaf\x63\x85\x74\xe4\x4f\xa5\x06\xbf\x37\x2a\xad\x13\x2c\x67\xe7\xe5\xdb\xa8\x01\xc2\x1d\x06\xe9\xe8\x68\x7d\x04\xef\xc8\x42\xae\x1a\x3d\x1d\x44\x01\x71\x25\x5c\xe7\xae\xae\x74\x6b\xfc\x2e\x26\xe0\xf0\x37\x34\x89\x05\x73\x4f\x5d\xcd\x5f\xfe\xdc\x78\xb5\x51\xaa\x89\x90\x56\x08\xc8\xd5\x44\x9d\x87\x59\x3d\x0e\x24\xe9\xa9\x26\x32\xc1\x80\x04\xf3\x43\x8e\x2b\xdb\x1f\x52\x29\x87\xce\xc1\xb7\xc5\xb4\x2b\xad\x50\x9a\x18\xb0\x04\x51\x61\xf8\xc7\xb0\x3f\x56\x87\xcc\x60\x6f\xc9\x63\xf9\x66\x9f\x7c\xd9\x4c\xcc\xa2\x0e\xa3\xd4\x4a\x66\x69\x8d\xd5\x78\x57\x58\x99\x6c\x62\x93\x37\x15\xc6\x56\xd7\x0b\x7d\xe7\xc7\xac\x0b\x9f\x75\x28\x29\xb6\x46\x3c\x88\x72\x50\x60\xd1\x34\xd4\x91\x18\x74\xcf\x69\x24\x90\xeb\x8e\x32\x93\x38\x07\x02\x21\x6a\xb3\xa2\xfe\x09\xd5\x68\x7f\xd7\x8c\x69\xdc\xa8\x1d\x70\x19\xf4\xa0\x49\x67\x34\x4f\x34\xa7\x14\x7b\x69\x97\xf3\xc5\x7c\x18\xc1\x6b\x2e\xa2\xc4\x4b\x3f\x1c\x85\x82\xfa\x3d\x3b\xbe\x1e\xdf\x2a\xa1\x61\x18\x6a\xe8\x28\x4a\xb5\xec\xe8\xb6\x5c\x49\x09\xd5\xf7\x26\xb1\x81\x8e\x64\x80\x29\x56\xeb\xfe\x83\xb6\xf5\x11\xe4\xb4\xc7\x0d\x7c\xe8\x85\xe8\x48\xa5\xa1\xe9\xbd\x5a\x4b\x8c\xbd\x11\x95\x38\x4c\xc2\x7e\x1d\x13\x69\x91\x8e\x4d\xe5\xa4\x87\xf3\x7c\x2e\x7a\x01\x98\xc9\xc7\x88\xa9\x12\x1d\x4b\x5f\xe6\x28\xfa\x0e\xc7\xe6\xfc\x5c\x36\xeb\xa2\xfb\x34\xb1\x12\x36\x11\x69\x5d\x83\xd1\xab\x89\xc1\x36\x6b\x60\x61\xb3\xc1\x8d\xcd\x1d\x49\x82\x44\xbb\x50\x18\xa1\x35\x43\x6c\x97\x4e\x02\x8d\xf4\x1a\x2b\x33\x84\xab\x4d\x6b\xfa\x3a\x89\x42\xd0\x23\x02\x01\xbb\x02\x2c\x66\xe7\xba\xa5\xd2\x49\x62\x75\xd1\x8f\x15\xac\x94\xed\x54\x19\xd5\xab\x74\x0a\xc2\x33\x93\x61\xff\x09\xfa\x8a\x0b\x51\xe8\xc9\xf6\xa5\x45\xaa\xb0\x6a\x8b\x08\x9e\x76\xfb\xb2\x6c\xfb\xfe\x3a\x92\x02\x82\xde\xf7\x98\x84\x9b\x55\x20\xb0\x4d\xa4\x81\xb7\x81\x88\xf4\x75\x9f\x55\x4b\x93\x5c\x20\x72\x16\xe5\xe1\x98\x43\xbf\x24\x14\xb1\x95\x57\x23\xb2\x7c\x2b\x0c\x3c\x66\x87\xac\xe9\x0f\x5a\xca\x86\x99\x9e\x0d\x94\x23\xa9\x56\x21\xc1\x64\x6f\xaf\x4b\xf7\x99\x8c\x7b\x7f\x43\x8a\x52\x99\x76\x84\x27\x51\x77\x39\x6a\x30\xcf\x68\x9f\xf1\x4b\x95\xfd\x86\xf3\x41\x2b\x16\xa2\x33\x85\x38\x4d\xf2\x09\x97\x2c\xd5\x4a\x30\xbc\xd5\xed\x49\xb6\x0f\x36\x2a\x59\xbb\x42\x19\xe9\x2e\xab\x24\xf6\x58\x3d\x96\x6f\xf7\x65\x9e\xf7\xce\xcf\x8d\xc7\xd1\x01\x55\x2e\xe9\xf6\xf8\xf8\xcd\x06\x4c\x5d\xee\x5c\x6b\x1e\x52\x2b\x75\xe3\x37\x8f\x27\xe8\xe0\x34\x83\x8b\xc4\x69\xec\xd6\xf3\x72\xbb\xde\xdc\x98\x6f\x5a\x0b\x2c\x38\xd4\x28\xf8\x6e\xc5\x9a\xef\xc4\xf1\x38\x11\x5a\xa4\x1a\x48\x8a\x1b\x60\xeb\x67\x8e\xb8\xf4\x06\x58\x39\x0d\x51\x84\x3d\x33\x70\xc8\x9a\xbf\xa5\x8e\x47\x35\xb4\x3e\xbe\xbd\xcd\x07\xc8\x26\xbb\x9f\x36\xa9\x46\x1f\xcc\xc9\x78\x4d\x1e\xd1\x80\xcd\xe8\xb7\x3f\xe7\xa7\xee\xf2\x87\xc8\x4f\xa2\xb9\xa2\xae\x7f\xba\x80\xfc\x76\x57\x02\xa2\x29\x77\x09\x81\xaf\x70\x7e\xad\xc1\x3b\x52\xd3\x61\x09\x72\x24\xb4\x93\xda\xc2\x7c\x30\xfd\xe3\x56\xb4\x1f\x64\x6c\x0d\xc5\xd5\x56\x2f\xfb\x36\xae\x7e\x09\x08\xb9\x71\x30\x80\x42\x3b\x22\x91\x4f\x9b\xe7\x51\xda\xb2\x9d\x25\xad\x53\x8e\x89\x42\x7f\x03\x34\xb6\xd1\xd9\xde\x09\x8f\x8c\xa1\x8d\x9f\xae\x00\xa0\x3a\xc6\x86\x69\x0f\xdc\x70\xc9\xb3\x1f\x98\x2f\xac\x0e\x63\x9c\xc1\xb8\xda\x35\xfe\x07\xe7\x4f\x18\xf8\xcb\x1a\xa9\x07\xe2\x80\x3d\xf9\x8c\x3b\xce\x48\x6c\xe1\xaf\x50\x0f\x76\x9f\xb5\xb9\x03\xcb\x57\xe1\x1f\x8d\x31\x2b\x21\x74\xb7\x19\x1a\x72\x60\xed\xee\x35\xcc\x52\x6f\xca\xaa\x31\x65\x9e\xf9\x30\x09\x38\x95\xa1\x43\xdf\x6d\xb3\xf6\x06\x1d\x58\xee\x53\xf4\x28\xf0\xd4\xc2\x75\xda\xc0\xd2\x66\x90\x2e\x2d\xd1\x8d\x33\xb5\x55\x4e\xd1\xa0\x72\x51\x39\xd4\xe7\x95\x25\x03\x1c\x12\xcc\x53\xf4\xd5\x96\xcf\xc1\x31\xfe\x34\x43\x50\x56\xea\xbd\x3c\xf9\x2c\x0e\xc4\x69\x02\xde\xdb\x77\x62\xe2\x2b\xfd\x3d\x6b\xde\x31\x95\x39\xb4\x5e\x10\x8b\x34\x70\xb9\xa6\x95\x2a\xa7\x2a\xbd\x14\x62\x9d\x22\x30\xcb\xa2\xb2\xbd\x08\xc8\x2d\x62\xaa\xd1\xa5\x13\x05\x98\x1c\x84\x42\x95\x1a\x56\x66\x99\xd7\xbf\x41\x5c\x41\xca\x63\xcc\x72\xf6\x7c\xf2\x98\xcf\x19\x3f\x71\x1a\xd1\xb8\x13\x89\x32\xcd\x42\x1c\x57\xc5\xe2\x42\x33\x81\x42\xaa\x6c\x97\x6d\x0d\x9e\x17\xe7\x33\x9f\x0e\x84\x62\x72\x88\xbe\x19\xb5\x79\x4c\x5e\xba\x0c\x48\xea\x95\x73\xad\xcd\xed\xa8\xed\x6f\xac\x51\x49\x13\x64\x03\xf3\x9d\x7b\x0b\x71\xb4\x35\xa5\xe9\x0b\x97\x49\xe4\x52\xe3\xc8\x85\x0c\xda\x2b\x94\x3b\x32\x80\x27\xf1\xbf\x5d\x95\x16\x14\x4f\xe9\x50\x03\xcf\x46\x40\xe2\x36\x31\x2c\x05\x95\x18\xac\x28\x60\xe6\xd0\x0a\xeb\x0d\x5a\x93\x41\xc9\xc8\x4b\x45\xf9\xb6\xf9\xbb\x0b\x32\x1e\x50\x8a\x21\x94\x14\xcb\x2b\xd6\xeb\xdb\x76\x49\x55\x50\x86\xa0\x5b\xf8\xd4\x06\x41\xc5\xd7\x51\x9b\x2d\xe8\x40\x84\x30\x88\x77\xbe\x97\xd5\xc7\xe0\x3d\x4f\xb7\xcf\xf1\xef\x6a\x16\x47\xd6\x2d\x00\x51\x9f\xaa\xf3\xb6\x2f\xc7\x82\x36\x32\x49\xbb\x26\x39\xec\x9f\x79\x87\x62\x23\x4e\x17\x7e\x2b\x98\x10\xb0\xc8\x55\x37\xe5\x71\x83\xfe\xd5\x53\xd6\x5f\xc8\x84\xe0\xe9\x66\xe7\xb3\xd5\xc5\x5c\x1f\x5f\x29\x0a\x98\xe9\x18\x0e\x10\x2f\xfb\x5c\x5e\x8a\xb3\x8f\xbf\x81\x09\x42\x83\xbf\x80\xa8\xec\x61\x7b\xb2\x09\x64\x28\xa3\xae\xfa\x61\xb2\xfc\x7a\x36\xcd\x10\x06\x49\xe4\x31\xc4\xcd\x2d\xe7\xc8\x0f\xd6\x12\x91\x4d\x6d\xac\x9e\xe9\x1e\x28\xe5\x7f\x34\x54\xd2\x66\x70\x2d\x67\xf5\x17\xcf\x04\x4d\x0d\x15\x1a\x2b\x75\x1b\x51\x1d\x50\x9b\x7b\xf8\x29\x0d\x53\x16\x8f\xbd\x78\x87\xaa\xea\x2c\xac\xe1\x2a\xf2\x7a\x52\x7b\x2d\x1a\xb1\xc7\xa9\x76\x61\x2e\x47\xcf\x13\x11\x86\x3b\xd5\x2e\x2b\xce\x96\x2b\xf1\xb1\x2c\x3f\x4e\xbe\xd0\x60\x22\x66\x3b\xe9\x6b\x68\x90\x74\xd9\xde\x47\x6f\x3d\x4d\xc4\x6c\xce\xdc\xed\x2b\x96\x22\xf8\x86\xb1\xb9\x56\x3b\xf3\x97\x49\xb8\xa7\xb2\x7c\x2d\x2c\xf5\xa0\x7e\x10\xf9\x8f\xac\x78\xdb\x9e\x64\x9d\x4d\x9d\x6b\x13\x81\x25\x70\xf3\xec\x8c\x37\xdc\x8d\x9b\x26\xcf\xc4\x5a\x21\xaf\xd5\xbb\xa8\x5f\x10\x0f\x80\xd4\x13\x57\xd7\xae\x49\x82\x48\x76\x75\x8f\x99\xfe\x91\xd5\x65\x75\xb6\xb6\xad\x17\xb5\x6d\x87\xa5\xae\x57\xd7\x46\x9b\x33\xed\x39\x4d\xb6\xea\x1d\x0e\xe2\xa6\xd6\x0e\x35\x69\x10\x23\x56\xf7\x69\xf6\x27\x32\x03\x2f\x77\x0f\xcb\x97\xfd\x76\xb3\x7c\xf6\xcd\x7f\x26\xa5\x09\x58\xb8\xbf\xf7\x63\x1e\x07\xe2\x9c\x93\xa9\x27\x68\x6c\xdb\xb2\x4f\xf5\x11\x0a\x0d\xfa\xb5\x68\xba\xcc\xbe\x11\x2c\x75\x12\xb8\xcd\x7d\x6e\x35\xc9\xc6\x0f\xac\xb4\xf4\x64\x52\x4e\x6c\xac\x8d\x7b\xbb\xe9\xa9\x03\x12\x5b\xea\x7f\x24\xd2\x71\x4d\x57\x93\x6b\x68\xc6\x31\x07\xb0\x7e\xf2\xf5\x23\x03\x41\x8c\x28\xcc\xb9\x28\x54\x59\xfd\x6b\x20\xbb\xdf\xaf\x44\x20\x5a\x0c\x19\x89\xdb\xed\x73\xb9\x7b\x18\xef\x45\x06\xb8\xc4\xec\xcd\xbb\xa8\xf4\x42\x1c\x5d\x43\xe1\x97\x52\xe4\x7e\x4f\xf2\x03\x23\x82\x8d\xf6\xc7\x53\xfd\x8e\x32\x66\x55\x3d\x6d\xa4\x30\xa0\x03\xe4\x08\x7a\x17\xf5\xb2\x28\x4f\x6f\xef\x03\xc3\x6c\x4c\x28\x8c\xdb\xa8\x67\x4d\x73\x89\x63\xfa\xff\xfa\x5f\xff\xb3\x4a\xe1\xab\xda\x40\xbb\x1f\x0d\x5a\xa2\x59\x10\x48\x8e\x2d\xd1\x7b\x04\x22\xdc\x9c\xf6\xd3\xa2\x01\x0b\x88\x96\xc4\x13\x8c\x79\xda\x8d\x6b\x13\x9e\x05\x21\x21\x88\xfc\xd8\xd7\xd0\xac\xab\xec\x2d\x2b\xba\x5e\x8d\xc9\x40\x9e\x62\xea\x7a\xfe\x3c\x84\x4b\xb1\x20\x8c\xa4\x91\x3e\x7c\xaf\x3e\xda\xab\x20\xe5\xd3\x69\x92\xba\x66\x41\x28\xac\xd0\xe9\xbf\x4f\x3a\xfb\xab\xcf\xdd\xb0\x80\x86\x49\x14\x79\x8c\xca\x12\xe1\x61\xad\xbb\xe8\x38\xf5\xc4\x4d\x74\x0b\x0b\x68\x42\x69\xef\x42\xa3\xf3\x3d\x2b\xf4\x10\x6c\x75\xed\x9d\xb7\xe7\xe9\x10\x06\x53\x6f\x56\x1d\xce\x93\xbb\x65\x51\x90\x98\x4e\xc6\xd3\x27\x82\x06\x26\x95\x05\x9c\xc7\x32\x71\xb2\x2f\x16\xd7\x53\x7f\xc2\x18\xcf\x02\x2e\x1d\x70\xec\x67\x56\xd7\xf3\x6c\xfa\x7e\xb8\x0e\x28\x74\xa2\x8a\xf6\x7a\x53\x1a\x82\xe9\x15\x81\xa2\xd6\xa8\xeb\x9d\xde\xd7\x83\xfc\x05\x0b\x22\x16\x11\xd7\x38\xf7\x54\x8e\xbb\x65\x59\x10\x29\xf0\x39\xa8\x8d\x50\x1f\xe2\x0d\xac\x3b\x36\xd9\x8c\xfd\x68\x88\xc2\xa8\x17\x02\x1f\x74\xb4\xfd\xbf\x9a\xf5\xed\x05\x53\xec\xc2\x38\xe6\xe2\x6c\x65\x9d\x26\xf7\x17\x07\x1c\x93\x96\x5e\x8a\xa9\xb5\x0e\xed\xac\xfc\x6c\xdf\x6f\xcf\x32\x78\xd6\xde\xde\xe8\x1f\x97\x01\x69\xe2\x46\x26\x51\x60\xdc\x7e\xf7\x20\xea\x45\x79\x70\x02\x1c\x50\x0d\x7b\x7b\x9c\xd9\x66\x41\x12\x5b\xfa\x89\x1f\x36\x62\x82\x5e\xc7\xf1\x4b\x55\x9e\x8e\x53\x53\xc3\x82\x34\x22\xba\x43\x81\x94\x65\x7e\xd9\xd3\xcc\x82\x54\x1b\xac\x97\xb5\xcf\x87\xa5\x18\xf7\x77\xa1\x13\x74\x94\x91\x8b\x64\x56\x77\xe9\xea\x4f\x82\x40\x77\xa6\xd4\x29\xc6\x25\x77\xaa\xac\x8e\x08\xd9\xb0\xac\x48\x17\x7b\xa6\x1b\xaf\xc2\x18\x01\x65\x4d\xe9\x09\x35\x6f\xcc\x34\x65\x08\x7e\x2f\x5b\x1e\xc4\x87\x71\xac\xed\xe3\x57\x3c\xe5\x08\x1b\xff\x9c\x36\x3a\x02\xe7\x16\x2e\x8b\xaa\xcc\xf3\x43\xe7\x5f\xb2\x00\x82\x18\xbd\xa8\xec\x70\xcc\x2d\x0f\x0b\x7b\x01\x0d\x70\xbd\x84\xd8\x8e\xb7\x81\xe6\x3f\xb3\xe2\xeb\x49\x14\x6f\x8f\x99\xe8\x6c\x0a\x38\x69\x51\x9f\xde\xfa\x96\x89\xdf\x77\xe1\x30\x12\x24\x0c\x71\x0c\x3f\xca\xeb\x04\x6c\x8c\x10\x25\xac\xac\x64\x23\xaa\x66\x53\x65\x3f\x44\x83\xc2\x17\x77\x1d\xc4\x8b\x11\x02\x11\x2e\xf4\xe7\xb2\x58\xe2\xb4\xfa\x01\x57\x95\x8a\x4e\x03\x58\xd5\xb5\x90\x89\x91\x50\x6a\x34\x31\xd3\x0e\x39\x77\x98\x52\x1b\xcb\xef\xa0\x6e\x96\xbb\xc5\xc0\xa8\x12\x46\x0c\x26\x05\x17\x2f\xff\xde\xec\xd6\x0f\xcb\xbb\x2f\xcb\xc5\xe7\x3a\x57\x8c\x30\x19\xa1\x05\xb2\x05\xd1\xb9\x18\x10\x32\x8e\x7f\x97\x01\xc1\x22\xd6\xf3\xf2\xfb\xa2\xdd\xaf\xc6\x47\x39\x95\xb1\x95\xf2\xad\xdf\x7f\x8b\x24\x63\x24\x8a\x2d\xe1\x98\x5f\xe9\xf8\xaa\x76\xe5\xb8\x40\xdd\x0e\xb3\xb2\x4f\xdb\x77\x71\x80\x1c\xea\xfa\x75\xb9\x7b\xc9\x8e\xa5\x31\x7e\x44\x6c\x28\x56\x57\x90\x27\x6e\xa8\x46\xe2\x8e\xa7\x21\x41\xf9\xad\x06\xc4\xa1\x67\x17\x1b\xbf\xf0\x14\x0c\x8a\xad\x2f\x4a\x4b\x10\xe3\xcf\x15\x21\x45\xe0\x1a\xc6\x8a\xb7\xd2\x4b\x17\x05\x39\x46\x64\x1c\x20\xeb\x40\x79\x84\x62\xe3\x79\x48\x19\x91\x49\x22\x2d\xd7\x6a\x05\xf0\x94\xe5\x79\x56\x16\xbb\x9f\xe5\xc3\xa9\xd0\x15\xe8\xdd\x7b\x79\xaa\x85\xf7\x4c\x18\xd1\xc4\x86\x7b\x05\xfc\x6a\xee\x00\xe7\x5c\x37\xa5\xfc\x90\x50\xc5\x1d\xe2\x79\xb8\x05\x8d\x5e\xb5\x8e\x05\x96\xc6\xe7\x20\x4e\x0d\x36\xa8\x8c\x2f\x02\x29\x38\x46\x8f\xdb\x2b\x65\x32\x43\x21\x30\xa2\x87\x97\xcf\x6d\x2a\x2a\x2b\x6c\xf9\x65\xa4\x96\x30\xca\x53\x31\x02\x22\xc0\xb4\xcd\xa6\x82\xb7\x42\x5c\x6e\x9a\x37\x7e\xcf\x44\x31\xf6\xdb\x2e\x9e\xd6\xfb\xed\xc3\xec\xc5\xd5\x74\x59\x18\x44\x0a\xad\xc1\x40\xb4\xfd\xb3\xa0\x8d\x85\x41\x6c\xf7\x5b\x6f\x22\xbc\xce\x42\xf3\x5e\xb5\xae\xe1\x1e\xdf\xc2\xbe\x29\xf7\x6a\xca\x27\x77\xd5\x76\x84\x84\xd8\x4f\x6d\x53\x05\xd7\x9a\x2a\x58\x18\x86\x21\x03\xd7\xb5\xe3\x5c\x8a\x61\x78\xc0\xc2\x90\x0a\x7c\x2b\xc2\x67\x3b\x3e\x05\x4b\x4d\x2e\xae\x53\xcf\x9a\x36\xbb\x7b\xf1\xef\x85\x3a\x48\xc1\xeb\xf3\xd7\xe7\xf5\xf7\xe7\xfd\xee\xdf\x9b\xee\x9d\x31\x02\xd2\x51\x70\xe6\x39\x14\x6f\xe8\x83\x6f\x44\x6d\x81\xb4\xfa\x52\xe9\xbc\xe7\xa6\xeb\xe3\xbb\x71\xfa\x9a\x85\x2c\x8c\x51\xb9\xc4\x6a\xf4\xe0\x82\x71\xc5\xce\xa1\x2e\x50\x17\x59\xb2\x90\x25\x56\x8d\xf0\x0d\x9a\x79\x25\xd4\x07\x34\x36\x29\x85\x17\x76\x5b\x8a\xdd\xbc\x1d\x24\x8f\x85\x3c\x48\x78\x9f\xca\xb3\x84\x1e\x57\xa7\x7c\xc8\x15\x50\x3b\x2d\xb0\x0e\xb7\x13\x13\x96\x59\xe7\x0f\x84\x11\x35\x98\x1c\x6f\xaf\xb8\x5a\xac\x3f\x91\x47\x61\x61\xc4\xad\xc2\x9e\x12\xc5\xc2\x56\x0b\x87\x48\x14\x32\xb9\x30\xb7\x54\xec\xf7\xe2\xa4\x5a\x1f\xf9\x2a\x75\x78\xf7\xf2\x22\xce\xc4\x50\xef\xc6\xb2\x39\xfd\xd1\x1d\xe5\x08\xfb\x3d\xa2\x94\x19\xe8\x25\x26\xfe\x26\x73\x2c\x0e\xb4\x27\xb8\xf4\x0a\x93\x07\xf1\xcb\xce\xe2\x09\x58\xdc\x9f\x11\x32\xec\xa8\xdb\x5b\xc8\xcc\x80\xb7\xd7\x0d\x48\x02\x85\x04\xbc\xce\xfd\x3b\x1d\x8f\xe7\xad\xc8\xa7\x5d\xd0\x9f\xaf\xdc\x30\xe1\x02\x1b\x23\x66\xf9\x31\x2b\xe0\x09\xde\x44\x9e\x35\x7f\x63\x83\x08\x53\x26\x89\xf1\x5b\xee\x7d\x56\x8d\x20\x6a\x2c\x4c\x65\xcc\xb9\x6b\xa1\xc2\xed\x18\x35\x69\x4e\x45\xd1\x01\x6f\x58\x98\x02\x84\xae\xa7\x1a\x83\xf9\x8d\x38\x0f\x88\xb9\x58\x28\xa2\x60\x24\x67\x6f\x09\x51\x07\x73\x54\xc4\x0c\x6b\x78\xde\xff\xdb\xc1\xc8\x66\x5d\x6b\x89\x64\xa1\x10\x0c\x49\x0f\x9c\xde\x67\xcf\xa0\x39\x7e\xfd\x02\x04\x32\x21\x62\xa3\xdd\x0f\xa8\x06\xdb\x78\x28\x03\x11\xd3\xae\xdc\xb6\x11\x67\xd0\x93\x8c\x3e\x0b\x25\x04\x48\x9c\xda\xc6\x70\xb3\xe3\x71\x65\x9e\xe1\xe7\x05\x69\xeb\xf8\x14\x15\x87\x04\x5c\x11\x60\xeb\x59\x37\x6b\xa8\x5e\xeb\xac\x78\xbb\x43\xd2\x23\xd0\xe3\x2e\x4d\x16\xaa\x54\xe1\xf6\xb0\xf7\x98\xad\xdf\x18\x44\x05\xb6\x83\xce\x54\xe5\x5f\xc8\xeb\xd3\x4c\x38\x80\x59\xa8\x49\x88\x4d\x20\xdf\x21\xfb\x0e\xd9\xd5\x16\x08\x3f\x32\xd6\xb2\xd3\xb6\x9a\x0d\x58\xef\xfd\xdd\x69\xd7\x1f\x8e\x24\xa2\x56\x7b\xc0\x96\x02\xbe\x88\x5e\xd8\x87\x85\x5a\x76\x7a\xf1\x36\x5e\xf5\xcd\xef\xce\x5e\xfb\x61\xda\x50\x87\xf5\x9a\x97\xe5\xc7\xad\x7c\xbc\x1f\x0d\x04\x7d\x93\xdd\x50\x8c\x6f\xfa\xfa\x40\x47\xa9\xcb\xaa\x5b\xfa\xc3\x9e\x24\xa4\xfb\x59\xa3\x28\x3a\xc8\x4a\xd4\xef\x83\x88\x80\x06\x3c\xc2\xb2\xe6\xcf\x2a\x6b\xe0\x09\xda\xa0\xb0\xd0\xd9\xc0\x7d\x19\xad\x18\x1a\xc4\x56\xc6\xcc\x66\x6a\x5f\x40\x9d\xaa\xf6\xe8\x3c\x43\xe8\xfb\x55\x95\x0d\x46\x03\x9d\x78\xf6\xd9\x47\x51\xe3\x3d\x4e\x2d\x05\x25\x51\xec\x35\xed\xf0\x73\x7e\xcf\x46\x6a\x3f\x8c\x92\x44\xf2\xa1\xb0\xe7\x43\x89\x6a\x54\xd3\xcb\x18\x12\xb1\x9e\x3a\x6c\x7f\x74\xdc\xe5\xee\x70\x18\x86\x2a\xe8\x0f\xdf\x63\x09\x10\x15\xea\x3c\xa9\xd7\x68\xd3\xa4\x61\x98\x78\x21\xa5\xc7\xb2\xb5\xc9\xa7\xa2\xb9\xbf\xd0\x00\xf3\x83\xa9\x95\x02\x79\x52\xf7\xf9\x19\x1b\xd5\x6f\xb5\x74\xfc\xff\xfd\xaf\xbf\x21\x90\xa8\x17\x36\x65\x3d\x79\x14\x56\x13\xfc\x07\xca\x1d\x3e\x97\x16\xa1\x3f\xd8\x0e\x28\x55\x69\xec\x88\xe5\x4e\x47\x5b\xfc\x9c\xc6\xa1\x94\x9a\x2e\x09\xb0\x5a\x6d\xf0\xa3\x0d\x51\x0e\x8c\xb2\x94\x73\xe2\x3a\x0d\x7a\x56\xa0\xf1\x1e\x79\x9d\x9f\xd6\x5f\x40\x19\x7c\xa1\xaf\x35\xcc\xcf\xdb\xd2\x34\x3f\xc5\xa4\xa2\xc4\x28\x03\x9b\xe4\x72\x35\xba\xc7\xb2\xbe\xb0\x9d\x6e\x24\x0f\x63\xe1\x3a\x1e\x07\xf4\x03\x93\x31\x1c\xb0\xbd\x2f\xab\x67\x93\xdf\xe1\x69\x82\x3b\x19\x26\xc4\x67\x93\x6d\x8c\x46\x44\x21\x07\xe0\x31\x53\xe5\xb1\xde\xcb\x9e\xd1\x9b\xd1\x28\x24\x4e\x2c\xe0\x24\x73\x58\x16\x4d\x75\x1e\x60\x83\x19\x8d\xa2\x54\x68\x6f\x7f\xdc\xbb\xf6\x87\x24\x41\x15\x93\x67\x14\x7a\x7b\x7d\xde\xbd\xac\x96\xdb\xee\xa0\x66\xc8\x5f\xbe\xfb\x59\xfe\xdf\xb5\xd8\xb4\xa7\x72\xec\x54\x76\xc4\x8e\xf3\x29\x1d\x25\xa3\x31\x89\x10\x19\xb1\xbb\xc7\x26\x66\xff\x9b\x71\x68\x6c\xa2\x29\x7b\xf3\x7a\x1e\xae\xb6\x35\x4a\x60\xd1\x38\x61\x98\x5f\x94\xc5\xda\x5c\xe5\x80\x67\x34\x06\xa2\xc2\x9e\xb3\x56\xe4\x30\x06\x14\x39\x70\xe3\xf0\x9f\x9b\x1e\x00\x4d\x22\x49\xfd\xae\x83\x7e\xa1\xf7\x72\xa8\xbf\xf3\x24\xb6\xb2\xbf\x8e\xa2\xca\x51\x01\x0c\xeb\xdc\xb7\x16\xd3\xc8\x25\x1d\x5a\xe9\xc1\x4c\x4d\xa4\xed\x5f\xfb\x99\x15\xba\xfc\x19\x5a\xbc\xde\x05\x7b\x12\xa3\x89\x96\xdc\x49\x15\xb9\x16\xce\x1b\x31\x04\x15\xa1\x85\xd6\x59\x9f\x1f\xf4\x77\xc8\xae\xef\x5f\x54\x18\x6b\xa3\x6a\x6c\x28\x3d\x9d\xa7\x66\x49\x86\xa1\x72\xbb\xc3\x17\x71\x80\x17\xa8\x4f\xf9\x74\xfe\xca\x50\x60\xba\xd3\xbe\x9d\xbb\xac\x3e\x9e\x9a\xcb\x52\xf1\xf5\x35\xa3\x28\xc5\x6c\x7b\xfb\xee\x6d\x4e\x68\xfb\x5e\x56\xcd\xca\xef\x9f\x54\x87\x14\x45\x10\x6c\xf4\xd4\xfd\x95\x26\x61\xec\xeb\x03\xad\x0b\x72\xd1\xcc\xc4\xa8\xe6\x04\xe9\x17\x25\x34\x77\xdd\x79\xaa\x43\x75\xdd\x97\xdd\xd5\x20\x4c\xac\xfc\x46\xeb\xb0\xd7\xef\xe3\xd9\x08\x32\xc1\xfd\x11\x0a\xbd\x52\xe5\x93\xc8\x8a\x9e\xeb\x8e\x51\x13\x49\x9e\x74\x75\xc0\xaf\xff\x5e\x4c\xde\x9f\x89\x20\xe8\xd5\x04\xf6\x16\x77\x3c\xb9\x51\x03\xb6\x91\x62\x76\x77\xf7\xb2\xdf\x7d\xfd\xb2\x9f\x6d\xb7\xeb\xc5\x6a\xd6\xab\x32\x32\x46\x78\x8a\x50\xdf\x1c\x81\x26\xcb\xff\x9e\x84\x6f\xb6\x19\xb4\x81\x0d\xef\xbb\x3d\x43\x74\x05\xdd\x4c\xc1\x7a\x04\x7d\x63\x98\x97\x48\x7d\x68\x5e\xb7\x1b\xd3\x03\x88\xbc\x19\x02\xdd\x58\x1b\xa7\x48\x5c\xc9\xcb\xed\xee\x8a\x5a\x24\x6b\x5d\x58\x4c\xb9\xac\xf3\xec\x07\x7c\x11\x95\x86\xa2\x7e\x81\xba\xf4\x58\x14\xc6\x42\x65\xac\x75\x3b\x35\xf3\xa6\x6c\x23\xb9\x6d\x73\xd1\x28\x72\x95\xe1\xf5\xda\xbf\x53\xff\x71\x74\xb3\x40\x94\xcf\xf9\x67\x79\xeb\xd3\x4e\xe8\xb5\x19\xa3\xcc\x06\x68\xf2\x74\x5e\x17\x73\x78\x17\xb9\x69\xef\xc8\x37\x68\xae\xc6\x79\x43\x12\xfa\x4b\x53\x41\x83\xbe\x1d\x74\x55\xd4\xa7\x0a\xaa\x4e\x59\x70\xf9\xe3\x96\xc2\x09\x63\xd4\x04\xc2\x6e\x31\x55\xf6\x03\x2c\xcc\x75\xc8\x10\x81\x35\xb9\x41\xd4\xda\xf9\xf6\x8c\x31\xcb\x58\xdd\xda\xef\xcd\x7a\x37\xdb\xad\x3b\xf3\xcd\x98\xa6\x3c\x9c\xa8\x96\xad\xbb\x94\x13\xe3\xa1\x41\x95\xca\xa6\x3a\xcf\x4f\x17\x58\x3e\x3f\x88\x76\xbc\xe1\x7d\x83\xaa\x75\x61\x6f\xb5\xa5\x32\xc6\x99\x51\xae\x4d\xae\xf7\x13\x97\xa2\x2a\xb0\x81\xa3\x2c\xf3\xfb\xb2\xb2\x61\xd0\xf5\xd7\xc1\x39\xc4\xbd\x25\x75\x8c\x19\xd7\xe5\x74\x3e\xfd\xd7\x7f\x18\x1e\x07\xd4\x02\xeb\xd4\x07\x72\x92\x0f\x88\x88\xba\xb7\xa1\x04\xe6\xd4\x91\x07\xea\x77\xdd\xfa\xfe\xc2\x11\x55\x88\x30\xf7\x4d\x84\x22\xcb\xcf\xae\x85\x66\xb4\xc2\x59\x04\x04\xe3\xc7\x4c\x95\x88\x95\xf5\xbf\x1a\x1b\x20\x81\x2b\x82\xcc\xab\x4c\x77\x51\x1d\x4b\x0c\x84\x36\x23\xa3\x77\x20\x0e\x23\xbf\x87\xa5\x51\x10\xf6\xd2\x09\xff\x3a\x95\x53\xca\xa9\x76\x48\x8c\xdd\x07\x18\x78\xee\xdf\xba\x2e\x45\xc6\xd2\x38\x09\x53\x0b\xa9\x6e\xdf\xc3\x38\x78\x60\xa9\xd6\x9c\xbb\xf2\x5b\x5f\x59\xf0\x47\x65\xc8\x31\x16\xdd\x8a\x76\xcf\x18\x99\x0a\x49\x19\x42\x8d\x30\x36\x0d\xef\x40\xe8\x3c\x2b\xba\x1f\x95\x46\x44\xd2\xae\xa9\x05\xe4\x20\x91\x62\x7e\xfc\xd5\x55\x48\xa1\x13\xa7\xfc\xbd\x8b\xc1\x54\xcc\x63\x31\x6a\xdd\x5a\xa9\xd2\x51\x86\xf9\x21\x29\xd1\xcc\xab\xc6\xff\xf2\x95\xd5\xc9\xcf\xa6\x96\xf8\x4c\x95\x87\xa3\xa8\xc0\x35\x33\xb9\x95\xfd\x8f\x1b\xff\xfa\x73\x65\x8a\xd5\x63\x9b\xe9\xd8\xba\xee\xdc\xc9\xf5\x01\x90\x5a\xf0\x1d\xf2\xbc\x44\x5a\xed\xef\x20\xfd\x0d\xea\x80\x21\x70\xd1\xb7\x12\xd8\xd4\x4d\xbf\x75\x30\x2d\x74\xd0\x6f\x9b\x7a\xc8\x61\xe4\x47\x80\xed\xed\x5a\xf4\xd5\x8d\x21\x48\xc0\x8d\x82\x40\x25\x43\x9a\xd2\xfb\xe9\x71\x21\x53\xcb\xb9\xfc\x03\x5a\xd7\x72\x7f\x1c\x38\x90\x0c\xa4\xc0\x49\x61\xa3\xe1\x3b\x71\xae\xef\xcb\x91\x9c\x31\x63\x86\x25\xa9\x5b\xf3\x9e\xd7\x14\xa6\xab\xc0\x24\x61\x22\x2c\xb5\xdb\x83\xaf\xd2\x12\xff\x9e\x8c\xb2\x68\x12\x3b\xa7\x5f\x20\x47\x40\x9f\x37\xe1\xc3\x2f\xcf\x83\x00\x02\x3e\x41\x3a\x6c\x44\xd5\x0c\x1c\x5b\x1e\x50\x21\x5d\x45\xfc\xce\x72\x4d\xfa\xcc\xf7\x17\x31\x99\x02\x3c\x88\x6c\x86\xe5\x6b\x29\x72\x81\x06\xc2\x5f\x85\x44\x36\x5b\x36\x6a\x4a\x0c\xa3\xee\x70\x2a\x10\xb9\xdf\x88\x0f\x18\x16\xf8\x3e\x4d\x3b\x73\x22\x92\x34\xc5\x10\x60\x7b\xb2\x60\xeb\xc9\x71\x49\xb5\x63\xcb\x42\xe9\x7f\x57\x41\x73\x47\xc3\x84\xe1\xd9\x7b\x24\xe9\xc0\xa6\xb8\x6f\xa2\xca\xda\x09\xd8\x3d\x3c\x65\x56\xa8\x5c\x68\xfd\x74\x6a\xd7\x63\x71\xdf\x09\xa7\x5e\xde\x0f\x35\x06\xfb\x59\xca\x76\xea\x0f\x23\x62\xce\x88\x89\x93\x81\x21\x47\x20\x79\xf9\xeb\x3c\xaa\x2f\x72\xc6\x0d\xba\xe2\x8f\xaf\x8f\xaf\x43\x93\xc0\x99\x26\xc6\x5a\x37\x85\xbf\xff\x3d\x2b\x26\x8f\x1a\x85\x31\xeb\x30\x2b\xb5\x95\x31\xf2\x67\x47\x71\x82\x5b\xcf\xd3\xea\x79\xbe\xdc\xf9\xbf\xc6\x24\x46\x1a\xbb\xe7\xe5\x76\x77\xdf\xd1\xf3\x31\x1e\xeb\x38\x42\xb8\xd1\xc3\x76\xe1\xff\x96\x68\x16\x8f\x9b\x3b\x47\x0c\x11\xdd\xa8\x28\xf8\x94\xc9\xf1\x5a\x75\x8b\x27\x26\xc4\x97\x56\xff\x14\xd5\x61\x57\x4d\x31\x07\x3c\x31\x11\x46\x73\x59\x51\x63\xb3\xde\xb0\xb3\x98\x71\x11\x50\x2b\x8d\xa0\xde\x41\x9f\x5a\xd3\xd1\xac\x6e\x7d\x9e\xd6\xab\x70\x32\x0a\x77\xa2\x11\x3e\x71\x39\x5a\x5a\x5c\x50\x2b\x92\xe3\x44\x67\x6f\x74\x17\xf9\xc1\x91\x89\x99\x27\x6e\xfa\x75\x7e\x84\xb7\x89\xbe\x33\xe3\x22\x21\x81\x6b\x7c\x79\x82\x46\x5c\xd2\x8c\x5e\xfe\x7b\x19\x5e\x73\x01\x56\x29\xbb\xce\x45\xfd\xde\xda\xae\xa2\xdd\x87\x2e\x75\xa8\x19\x97\x3c\xe2\x96\x88\x2e\xcf\xcb\x66\x59\xa8\xea\x6c\xb5\x55\x40\x7d\x80\x37\x32\x5c\x0a\x4e\x5c\xe7\x9e\x4d\xa9\xdc\x80\x49\x33\xae\x94\x96\x0e\x2f\x7e\x0f\x57\x08\x34\x19\xd7\xc4\x73\xbe\xbd\x15\xed\xad\x2d\xae\x14\x29\xb9\xe6\x1c\xb1\x78\x7b\x9b\x61\xc0\xd0\x7a\x6c\x7f\x39\x84\xa1\x86\x11\xff\x59\x05\xaa\xf9\x0d\x73\x14\xe3\x10\x07\x26\x70\xe8\xeb\x43\xd6\xcc\xf1\xb9\x6f\xbe\xe2\xe1\x35\x7c\x21\x81\x1b\x6e\x41\xd8\xa2\x3e\x17\x6a\x0b\x85\xde\x66\x39\x14\xc3\x9f\x1e\xff\xa4\x11\x21\x92\x09\x14\xf0\x73\x2e\x8a\x8f\x6b\x2a\x05\x2c\x0a\x02\x82\x48\x97\xc5\xeb\xbc\xf3\x24\xa3\x20\xe0\x18\xfc\x3e\x22\xdf\xf2\x27\xde\x51\x37\xde\x60\x67\x82\x4f\x49\xdf\xa3\xc6\xba\x3f\x68\x02\x24\xbc\xb0\x29\xcc\x2e\x69\x33\xa1\x9c\x9e\x3c\xc2\x7f\xb8\x9b\x53\x11\x09\x25\xce\x94\x2f\x50\x48\x79\x1e\xda\x9b\x88\xa4\x96\xcf\xfb\x05\xd4\xbb\xa8\xde\xa0\x8d\xc3\x26\x8f\x17\xc6\x1c\x0d\xce\x0f\xab\x34\x8f\x62\x5f\x7f\xc7\x95\xbc\x58\x96\x51\x28\x02\xac\xd2\x9b\x53\xa1\xee\xab\xf2\xb0\x20\xfe\x36\x42\x13\x79\x78\xc6\xbd\xd0\x50\x9e\x90\x69\xa9\xa9\xaf\x35\x55\xb2\x88\x6a\xe0\xce\x8d\xd9\x88\xba\xb1\x79\xdf\xae\x67\xa0\x7b\x6b\x2c\xe4\xc4\x76\x02\x76\x05\xaf\x4d\x59\xd7\x3d\x2b\x11\x8b\x18\x0f\x3d\x3b\xc5\xb0\x2f\x21\x19\x2f\x8d\x88\x71\xab\x24\x83\xd9\xa0\x9e\x1d\xdb\x1f\x8d\x14\xb0\x4e\xa1\xb1\x75\x69\xb6\x5e\x89\x93\x45\x4c\xd8\x34\x70\xd7\x32\x60\x63\x61\xa8\x16\xa7\xe6\x8f\x91\x6b\x14\xf1\xd0\x32\xf5\x6d\x00\xaa\xf9\x49\xd7\xa3\x0f\x15\x31\x82\x26\xd7\x92\xbf\x1f\x6f\x60\xd9\xfd\xe0\x98\x63\x89\x6d\xfd\xf2\x65\xf6\xbc\x5a\xfc\xde\x33\x8c\x62\x4e\x10\xdb\xbd\xf9\xea\x5e\xc0\x68\xc5\x46\x71\x24\x30\xad\xb5\x3d\xfc\xa5\x0f\xa3\xfb\x4a\x93\xd0\x07\x2e\x1b\xa8\xea\x09\x49\x2e\x8b\x52\x91\x20\x4e\xcf\x92\x34\x8b\x06\x30\x07\x3b\x7c\x7d\xa9\x22\x0c\x3a\xbd\x8c\x4b\xac\xaf\x1b\x26\x68\x48\x59\x27\x8a\xbe\x78\x37\xc3\x7c\x5d\x24\x98\xd5\xd4\xcd\xea\x67\x00\x8d\x01\x83\xdb\xbf\x7a\xb1\x79\x16\xa9\x80\x28\xcb\xc6\x70\x76\x8d\x7a\x7f\x0c\x32\x59\x49\x37\x2a\x84\x0e\xa0\xb6\xd7\x70\x6c\xde\x47\x7e\x57\xa4\xa4\x40\x29\x43\x6c\x90\x6b\x7e\x96\x2b\xd7\x23\xf7\xdf\x71\x60\x10\x69\x16\x20\xc1\x75\x79\x84\x02\x9b\xf8\x5c\xe5\xb2\x3b\x4c\x84\xdd\xef\x54\x05\x07\x6c\x34\x6e\x44\x8e\xd4\xc4\xdd\x25\x40\xa6\x51\xd2\xa5\x6b\x5f\xab\x6c\xf2\x7a\x4d\x10\x4a\x89\x9a\x13\xea\x03\x9a\x7a\x2f\xad\x40\xfd\xb5\xfd\x37\x32\x81\x42\x66\xdf\xaf\x27\x91\x7d\x15\xd7\x6d\xd2\x95\xa9\x61\x08\x90\x9e\x47\x7e\xcc\xf9\x7f\xf5\xec\x1b\x46\x60\x94\x55\x1e\xbe\x6f\x93\xc8\x34\x1a\x61\xbe\xbd\xe7\x16\x93\x90\xe0\xbc\x7b\x42\x1d\x95\x43\x56\xb4\x11\xfe\x45\x23\x3d\x8b\x89\x11\x08\xf2\xdf\xcb\x53\x96\x5f\xf0\x2e\xb2\x38\x64\x92\xcb\x2e\x5d\x34\x3b\x64\xb5\x73\x2e\xc6\x97\x61\x54\x23\xe8\xd9\x90\xf1\x8e\x15\xb3\xd4\xa6\x08\xe5\x05\xa9\x12\x8b\x99\x08\xf1\xb7\xbb\x4e\xd2\x01\x00\x9d\xc5\x0c\x42\x0c\xa4\x31\x63\x8b\xf4\x9c\x88\x03\xb6\x2a\x22\x7e\x10\xa7\x0c\xb3\x81\xdf\x2b\x71\x3c\x4e\xf0\xbf\xd7\x63\xf8\x2e\x8b\xd0\xe5\x35\x62\x2e\x52\x0c\x5f\x5f\x77\x7f\xae\x2d\x90\x0a\xf4\x98\x5e\xf2\x1a\x84\xf4\x73\x20\xd7\x78\x06\xc5\x49\xc2\xc2\xb4\xfb\x52\x16\xbb\x79\xf1\x2d\x92\xc4\xd2\x13\xe7\xa0\xdf\x06\xea\xfa\x5a\x77\xef\x24\xe5\xd6\xda\xfb\xbd\x0e\x5f\xd8\xea\xa2\xef\xfd\x34\x06\xd7\xc4\x69\xac\x89\x55\xac\xb3\xad\x4b\x3d\x0b\xc1\xf8\x2e\x85\xb4\xd2\x1f\x07\x51\x7d\x20\x9c\xae\x8d\x09\xe0\x62\x14\x48\xbb\x72\xd0\x8f\x3e\x1d\x27\x87\x25\x09\x31\xa1\xf2\x94\xad\xfe\xe6\x42\x89\x25\x49\x90\x04\x21\x53\xe5\x65\xe1\x25\x96\xd4\xb6\x2a\xce\xb3\x66\x51\xe1\x34\xf2\x07\x84\x40\x4f\x61\xf6\xf8\x10\x76\x7f\x93\x56\xcb\xf8\x68\x4b\xdc\x5e\x0f\xad\x23\x52\x6b\x47\x30\xea\x95\xa3\xf7\x42\xeb\x59\xa1\x5f\xf0\xab\x6c\x5a\x43\x5b\x5b\x99\x4b\x37\x56\x45\x2a\xb6\x05\xb6\x4c\xc1\xe3\xa2\xfb\xb3\x21\xd8\x5b\x6d\x73\x9f\xcf\x65\x63\xd3\x9f\x17\xa0\x8f\xf1\x53\x2a\x63\xb0\x39\x0e\xf1\x1e\x59\xf1\xe6\x7d\x22\x77\x18\x94\xc0\xd2\x3a\xae\x94\xbb\xaa\xbc\x0e\xbd\x67\x49\xc0\x14\x20\xd9\x1f\x74\x35\xdd\x24\x88\x34\xf3\x34\x59\xe5\xa9\xa8\x57\x85\x4d\x79\x4d\xce\x74\xa0\xc7\x36\xe6\x9f\x65\x95\xbe\xfd\x1b\x84\x5a\x0e\xbf\xe5\xaf\xa6\x35\xb0\x83\x42\x7b\x42\x12\x4e\xc4\x20\x8b\xf0\x3c\x60\xe9\x1d\x3d\x6f\x42\x52\x2b\x61\x2d\x9b\xb3\x12\x5a\x1f\xca\x02\x6e\x78\x8b\x09\x31\x69\xa8\x7c\x53\x45\xa9\x3e\x26\x71\xc7\x64\x34\x8d\x23\xab\x50\x73\x3a\x93\x0f\x67\xbf\xfd\xed\x31\x22\xb1\x30\x82\xcc\xe8\x46\x28\x98\xfb\xdc\xd1\x0d\x90\x4a\xc2\x38\xc1\x7e\xa8\x63\x55\x62\x9b\xc5\x1d\x08\xdf\x38\xc9\x12\x26\x02\xac\x39\x5a\x5e\xa5\x1d\x32\x03\x74\xfc\x34\xd7\x63\x37\x77\x26\x0f\xc0\xf9\x50\x98\x5c\xb0\x5e\x69\x6f\x74\x12\x4e\x2c\x15\x4e\x56\x63\xc3\xc4\xc8\x12\x24\x9c\x25\x88\xae\x53\x39\x88\xea\x0b\x14\x28\x07\x3a\x2b\xf4\x93\xa8\x2f\x7a\xcf\xaf\xbb\x8c\x09\x67\x52\xf7\x0c\x29\xbb\xf7\xac\xd2\xcb\x5f\x7d\x05\x67\x32\x38\x09\x65\x30\x10\x3e\xb3\x65\xe6\xfb\xb2\xfa\x52\x96\x1a\xc9\x9f\x97\xa2\xea\x56\x64\x12\x05\x0c\x67\x72\x53\x5a\x1c\xdb\x1f\x53\xb3\xd8\x5f\x39\xa2\x14\xfd\x44\x4f\xef\x84\xf2\x46\x4f\xe2\x57\x1f\x7b\x27\x71\xc4\xac\xf8\xa5\xd6\xe8\x99\xec\xb2\x29\x00\x38\x49\x98\x51\x1d\xf9\xdc\x06\x7a\x96\x51\x96\x24\xb1\x42\x32\xb1\x6d\x06\xc3\x6c\x4a\x92\x24\x04\x7f\xd8\xa7\x9b\x7d\x24\x93\x24\x89\x64\x16\xe2\x82\x0e\x83\xa3\x80\x18\xbf\xff\x24\x05\x3a\x10\xa0\x3e\x8c\x0b\xe5\x3d\x9a\x60\xc8\x31\xe2\x4f\x35\x36\xa7\x69\xa9\xa0\xb1\xf3\xb3\x5e\x15\x9b\xb2\xce\x7a\x0a\x02\x96\xa4\x91\xc0\xd0\xa0\x0d\x08\x37\xb3\x51\x8a\x23\x91\x81\x47\x70\xe0\xdb\x25\xd1\x27\xaf\x57\x0a\x81\xd3\xfd\xfe\xf5\xf9\x6e\x3f\xbb\xeb\xd0\x6c\x89\x62\x8c\xa6\x9d\x0c\x2a\xae\xa6\x75\x71\x2d\x36\x4d\x54\x44\xb1\x7b\xdf\xc2\xfa\xda\x60\xad\x2a\xf3\x7c\x7e\x3a\xaf\x8a\x61\xe5\x25\xd1\x84\x61\x09\x0f\x11\x77\x03\xc6\x39\xff\x8b\x40\x78\xe0\x2b\x59\x59\x55\x37\x6e\x0d\xd7\xa8\x93\xae\x31\x67\xd9\x7e\xbd\xbb\xd1\x29\x69\xea\x28\x41\x9f\xb2\xc2\x2a\xac\x4d\xee\x0e\x98\xb6\x48\x2e\x51\x7c\x10\xda\x9d\x98\x44\x68\xc9\x36\x55\xf9\xbf\xa0\x9a\xbf\xb9\xcf\x24\xa0\x28\xa6\xb2\xef\x66\xab\xc7\x7f\xef\x1f\x57\x4f\x2b\x9f\xea\x49\x8c\x52\xe8\x99\x2e\x5e\xb6\x5e\xa3\xd8\x1e\x49\x83\x40\x63\xb6\xa3\xd7\x5d\xeb\xa7\xc1\xff\x15\x80\x21\x0d\x42\xb0\x1c\x20\xeb\x2f\xe1\x7e\xd9\x5d\x5f\xda\xbf\xfa\x94\xd0\xf2\x54\xed\xca\x29\x3b\x08\x4b\x03\x20\xa8\x30\x0a\x3a\x6b\x36\x19\x28\xc0\x34\xc9\x27\x81\x71\x7b\x86\x57\xaf\xb6\x79\x82\x39\xba\xb8\x23\xac\x6f\x1a\x32\x69\x62\x87\x05\xee\x73\x39\xfd\xe1\x34\x44\x16\x83\x76\xb3\xb4\x2d\x9a\xa0\xef\x3c\xaf\x0a\x4b\x69\x60\x1b\xfa\xfd\x66\x80\x3a\xe2\xce\x76\xfb\x21\x21\xc1\xfe\x40\x68\x0d\x32\x26\xbc\xc7\xc1\x5b\x4a\x63\x82\xcf\x6f\xa0\x51\xef\x1b\x91\x69\x9b\x15\xbf\x2f\x2b\x87\xdf\xe9\xbe\x04\x15\xa1\x09\x7d\x1b\x6d\xe1\x28\xeb\x5b\x6b\x86\x3c\xeb\xeb\x69\x6d\x2d\xa5\x3a\xc0\xc8\xaf\x8d\x22\xbe\x03\x7c\x74\xd7\x71\xad\xd9\x5d\xa7\xec\x97\x4a\x14\xcd\x2d\x48\x7f\xca\x08\xc1\xb5\x6a\x41\x42\x6e\xca\x4d\x7e\x8a\x51\x15\x5b\xed\x98\xba\xcc\x7f\x8c\x4b\xce\xe4\x12\x28\x33\x34\xd9\x24\xba\xe1\x49\x0e\x16\x5f\xca\x04\xa0\x14\xe9\x88\x83\x7d\xb5\x58\xef\xb7\xbb\xd9\x97\x25\xe9\x64\xfc\xbd\x1f\x94\x32\x08\x91\xdc\x6a\xf1\xe7\xe3\x95\xca\x7d\xca\x29\x08\xd1\x1b\x38\x3f\xa1\xef\xab\xf2\x70\x4b\x5e\x87\xa5\x9c\x5b\x68\x87\x0b\xc8\x5b\xf3\xb9\x3e\x35\xaa\x3c\x4c\x5f\x3c\x4f\x22\xfc\x50\x38\x57\xb1\xc0\xe8\x92\xc7\x03\x6e\x25\xd2\x0d\x56\x81\xf2\xbd\x0e\xed\x25\xfd\x2d\x46\x89\x88\x5d\x3a\xfc\xa1\x3c\xc0\x66\xca\xf1\xc5\x5a\x1b\x8a\x3b\x77\x55\xca\x8d\xc0\x6c\xd9\xf5\x0f\x18\xc9\x38\x8d\x1c\xa3\xe9\x93\xcd\xe2\xd4\xcb\x3c\xfb\x95\x79\xdf\x2b\x4d\x68\xa0\x1d\x40\xa8\x6b\xb6\xdc\xe4\x65\x73\xc5\x5e\xa6\x69\x18\xa1\xbd\xdc\x42\x6e\xbe\xc2\x79\x2c\xe1\x11\xb1\x7f\x0c\xfe\x19\x9c\x94\x2a\x74\x4b\xd1\xb9\xc3\x3e\xa9\x7c\xa0\x25\xcf\xd2\x54\x70\x44\xdb\x7d\xde\xc7\x94\x0a\x42\xb0\x0b\x31\xcf\x14\x14\x35\xec\xa0\x3a\xd4\x4f\xe2\xd7\xa2\xac\x9b\x0d\x54\x5b\x50\xd7\xd1\x29\xa9\x10\x61\x1a\x76\x14\x2e\xc3\xf8\x3f\x95\x4c\x07\xb2\x9b\x09\xd8\x8f\x06\xda\x56\xaf\xc6\x15\xd7\x7e\x3c\x1b\xf2\xa1\xf8\x30\x05\xab\x45\x63\x7b\x27\x63\xe5\x84\x2f\xc1\x09\x3e\x0d\x36\xee\x54\xaa\x30\x1d\x6a\x39\x3c\x65\x45\xe3\x18\xc2\xc7\x97\x51\x92\xda\x96\x1a\x51\xac\x0e\xc7\x1c\x03\xfe\x95\x77\xef\x06\xf0\xb5\xab\x08\xce\x14\x04\x30\x47\xcd\x7a\x81\x2b\xbd\x0c\x95\x52\x43\xac\x48\x7a\x56\xd4\x50\xa1\x20\xd2\xb6\xac\x9a\x3e\x06\x9a\x5c\xdd\xc4\x31\x3a\xe3\x0b\xdb\xea\x8d\x8c\x25\x18\x73\x4c\x26\x8d\x89\x05\x26\xa7\x61\xb0\x16\x6d\x12\xb8\x9e\x0f\xd0\x55\xa9\x31\x89\xe7\xf1\x75\x8f\x35\x3f\xb7\x1e\x76\x3d\x21\x3f\x61\x22\xa0\xa9\xc2\x05\x3e\xff\x04\x0d\x2a\x82\x84\x69\xe3\x2a\xac\x76\xc2\x5d\x1f\x47\x42\xd0\x0e\x9b\xe1\xf6\xed\x95\x76\x32\x26\xb3\x42\xaf\xf4\x05\xa9\xae\x3f\x2f\xb1\xed\x5e\x8f\xeb\x47\x6f\x7a\x04\x51\x04\x1c\x0d\xd7\x40\x15\x7d\x56\xe8\x79\x56\xe8\x70\x9c\x3e\xb8\x05\xa3\xe8\x2e\x65\x21\xda\x8e\x4f\x6e\x51\x82\x31\x99\xca\x7a\x08\xa4\x08\x03\x61\xc9\x1c\x01\x34\x09\xc6\x6f\x5d\x84\x94\x46\x0e\xa9\xd9\x3a\xd9\xb3\xc6\x82\x1c\x60\x60\x86\x86\xff\x4b\xc3\xff\x10\xe2\xdf\x6f\x18\x4b\x04\xab\xd9\x28\x17\xa7\x99\xed\x72\xf6\xbf\x4c\x03\x2b\x58\x7d\xd8\xa3\xc1\xc8\x8a\xb7\x55\x3d\xd4\x18\x67\x82\x26\x14\xcb\x47\x9d\x45\x05\xbd\x3d\x88\x3c\x5f\x88\x1b\x71\x97\xa0\x32\x20\xc8\x47\xdd\x34\x42\xbd\xef\xca\x4b\x85\x57\x26\x18\xb5\x7e\x58\xbb\xab\x2d\x44\x55\x9e\x6a\x4f\xc2\xd6\x1e\x53\x9c\xf4\x41\xc7\x93\x93\x4d\x9b\x5a\x72\xc1\x18\xc1\x0e\xa0\x3b\x40\xb8\xc4\x0e\x86\xcb\xee\xa6\x37\x33\xbe\x57\x4c\x04\xb4\xcf\x0f\xd5\xb4\xcc\x25\x98\x30\xd8\xf7\x2d\xb4\x18\xc4\x8e\x22\x4a\x18\xb8\xef\xb1\x3f\xb6\xb6\x6b\x9c\x2c\x12\x91\x53\xa9\x47\x17\x13\xbb\xeb\x27\xcf\x1e\x09\x86\x15\xea\xa7\xd5\xf3\xee\xdf\xdd\x55\x85\x0c\x7c\x1f\xc5\x28\x73\x20\x62\x0a\xdc\x0c\xf2\x1e\x37\xa9\x31\x06\xd9\x20\x11\xc7\xa9\xd5\x74\x5c\x3e\xae\x2d\xa3\xc6\x94\x2a\x99\x89\x58\x87\x71\x3c\xdd\x3e\x91\x9d\x33\x17\xea\x63\xb8\x79\x8e\xed\x85\x48\x02\x89\x5b\xd6\xfc\x54\x67\x05\xd4\xf5\x6b\x31\xec\x0b\xb8\xe9\xb9\x8a\x84\x87\xd8\xc0\x7a\x2a\x6a\x70\x95\x1b\x7f\x04\xec\xa7\xec\xe4\xf4\xff\xba\xd2\xf8\x3f\x7e\xcd\xa9\xa6\xda\xf2\x53\xe4\x39\x66\x3f\x10\x44\xf2\x49\x7b\x9d\x48\x75\x82\x60\x2f\x03\x30\xef\xca\x04\x42\x44\xa1\x71\xf9\xe7\xb5\xfc\x5f\x2b\x62\x7d\x4d\x31\xa1\x1d\x69\xd5\x29\xb0\x04\x68\xf3\x1e\x07\x5c\xcf\x23\xe4\xb7\x10\xa9\xe5\xcc\x7a\x83\xe6\x5b\x3b\x25\xb5\x5b\x73\x23\x97\x55\x48\xa3\x82\xd0\x63\xab\x4f\x58\xe6\x2b\x9a\x2e\xa5\xd5\x43\xd8\x85\x62\x56\xc3\xdc\x3a\x6e\xcf\xf0\xd3\x02\x16\xb0\xea\xec\xc9\xf5\xba\xa1\x80\x15\x5d\x27\x46\x01\x68\xf9\x1c\xbe\x63\xfc\x05\x95\xb2\x98\x51\xdb\x7d\x8c\x02\x46\x93\x87\x55\xa0\x50\xac\x60\x23\xce\x00\x9d\xd2\x6f\xbb\x61\x0d\xd9\xfc\xae\x46\xed\x42\x53\x8e\x2b\x64\x93\xd5\xa2\x78\x1b\x06\xb4\x42\x6b\x83\x60\xef\xfa\xa7\x38\x3e\x75\xcf\x08\x09\xc3\xb8\xa5\x13\x17\x76\x75\x82\x61\x1f\xc5\xe4\x09\x00\xac\x22\xd2\xa9\x86\x4d\xf9\x73\xc2\x78\x72\x69\x15\x93\xff\x90\x38\xf2\x86\xc3\x30\xe5\xbb\xa1\x9f\xe1\x67\xfb\x92\x6c\xe5\x61\x84\x3c\x1d\xcd\x5c\x63\x62\x66\x4d\x8d\xcc\x6e\xac\x0a\x19\xb0\x14\x31\x16\x6f\x99\xf1\x5f\x44\x06\x91\x48\x1d\x18\x6c\x96\xe7\x4b\xa7\x91\x5e\xaf\x4d\xd7\x83\x71\xeb\x62\x31\xf1\x9f\x72\x7f\x74\xbc\xed\x7b\x23\x54\x96\x5f\xc0\x80\x64\x60\xac\x92\x87\xd3\x9f\xb3\xf3\xac\x5d\xc7\x5f\xb3\xe2\x0d\x91\x81\x1d\xe1\xe4\x6f\x8c\xe2\xe7\xf8\x40\xf7\x73\x24\x0d\xb8\xf4\x74\x03\x6d\x8c\xfc\x9b\xc4\xad\x24\xa9\x16\x5d\xbf\xc4\x35\xb1\x2b\x3f\x4e\x84\xe8\x22\xe9\xac\x6e\x03\xed\x59\x25\xb3\x0b\x3f\x4a\x12\x29\x10\x3a\x89\xdb\x95\x47\xc8\x4d\x5e\x08\x91\x46\x5b\x24\x98\x27\x1f\xf2\xdf\x23\x8c\x0d\x92\x39\x2e\xca\xff\x9e\xb2\xf1\x11\x15\xa2\xb1\xff\xf2\xef\x11\x22\x43\x52\x6a\xb0\x78\xba\x17\x93\xf6\xa7\xf1\x6d\x51\x0e\x66\xc4\x36\x75\x43\xda\x6e\x6c\xc4\x24\x4d\x19\xa6\x1b\x6a\x71\xfe\x52\x96\x7a\x7e\xf6\x4b\x42\xb2\x34\x44\x85\xa3\x2d\x34\xab\x22\x6b\x46\x71\xf2\xdf\x2a\xb7\x4a\xa6\x00\x3d\x98\x76\x8b\x9d\x77\x5c\x8b\x83\xe3\x60\x09\x68\xe5\xe9\xbc\xfe\x79\xc3\xf5\x92\xcc\xa8\x04\xbc\x0e\xe6\x40\x40\xac\x3c\x35\x48\x3f\x7a\xec\xa6\x3a\x0f\x12\x34\x29\xed\xbe\x31\x3f\x63\x9f\xfc\x08\xf1\x2b\x79\x00\x5e\xf1\xe2\xa9\x7e\x1b\x92\xa6\xf8\x01\x84\x62\x44\xdb\xbc\x55\xb7\xb9\xab\x99\xe4\x71\x20\xd2\x4e\x6e\xa6\xec\x6f\x40\xd9\x36\xe5\xe2\x74\x58\x64\x4d\x06\xfd\x09\x60\xb0\x81\xc0\x6e\x11\x0b\x1b\x18\x7d\xca\x14\xc8\x64\x24\x13\xb4\x53\xfb\x5a\x18\xf8\x1d\xe3\xde\x68\x79\x44\x26\x46\x25\xbd\xd6\x1d\x99\x8b\xe6\x7d\xf7\x6b\x62\x9a\xae\x64\x39\x64\x1c\x46\x18\xe8\xca\xd3\x19\xb3\xf4\xdd\xbd\xc7\xb1\x41\xa3\x22\x94\x82\xa3\x6d\xf6\x45\x6b\xd5\xeb\xf7\x4f\x66\x54\x9c\xda\x52\x58\x27\x50\x4f\xad\x84\xf4\x7e\xb3\x7c\x59\x2c\x9f\xdb\x40\xdb\x5f\x3b\x09\x05\x76\x11\xff\x28\x51\x8d\x62\x08\xc2\xbc\xde\xe2\x26\x93\xd4\x20\x5c\xc0\xe9\xad\x35\x70\x7c\x2c\xbb\xb6\x3b\x99\x18\x69\xa2\x01\x15\xd5\xb5\xc8\x4b\xa6\x4c\xa0\x0f\x20\x9a\xc6\x03\xc5\xa5\x20\x82\xd9\x0e\x8f\xed\x51\xfc\x2c\x86\x80\xa9\xc9\x32\x13\x3c\x88\x5c\xef\xcf\xb3\xeb\x39\xc2\x8f\x23\xac\x5d\xed\x2e\x08\x92\x84\x2e\xdb\xd5\x6d\x24\x8e\xe3\xe8\x4a\x7e\xa2\x7f\x40\xc9\x52\xac\xd2\x38\xd0\xdf\x53\x56\x9c\xea\x7b\x80\x7a\x7d\x6a\xea\x46\x58\x6a\x15\x3f\x34\x8e\x2d\xb5\xb3\x83\xae\xdf\x9d\xaa\x01\x3f\x6b\x7b\x5c\x61\x9a\xee\x88\x8c\x59\xa3\xd2\xaf\x94\x3a\x40\x0c\x72\x6b\x2d\xd6\xc7\xde\xd8\x28\x06\x18\xe1\xfe\xeb\x04\x50\xfc\x39\xdc\x38\xa5\xd2\x46\x3a\x25\x01\x0d\xbd\x7b\x20\x15\x44\x41\xdf\x7f\x7b\x63\x15\x6b\x61\xac\x56\xaa\x2c\x4f\x13\xaf\x46\x6a\x93\x3a\x2e\x5d\x8c\x7e\x5f\xc0\x5c\x53\x84\x62\x2a\xa0\x0c\xbf\xfd\xf2\x65\x11\x87\xe4\x2a\xa6\x4a\x05\x5c\x21\x7c\xcc\x31\x6d\x3f\x96\xa2\x98\xd8\x66\x15\x68\x89\xf5\x94\x4c\x95\xc4\x25\xea\xb5\xed\x15\x74\x03\x48\x68\x67\x11\xf6\xba\xfa\xbf\x19\x1b\x26\x62\x3b\xc5\x9e\xee\x85\xf6\x45\x23\x85\x52\xd4\x0e\x26\x5b\x9d\xb7\x65\x6e\x9d\xb8\xc9\xaf\xd2\x80\x24\x56\xc5\x18\x40\xdf\x97\x07\x3f\xf5\x14\x25\x29\x52\x40\x60\x11\x5e\xd4\xf0\x4f\xa1\x3e\x8e\xe5\x4d\xaa\x2b\x7f\x16\xd5\xe8\x7c\x54\xad\x69\xda\x4f\x7f\x2b\xe6\x81\x27\x62\xc9\x8a\x79\x07\x61\x53\x4c\xa5\x1e\x28\xe2\x35\xb5\x5e\x96\xbb\xbb\xe5\x7c\x50\x0e\x54\x0c\x3a\xef\x71\x23\x9a\x36\x48\xb4\xfd\x03\xb8\x01\x8c\xdf\x36\xe7\x36\xe7\x6d\x69\x43\xbb\xa4\xcb\xa7\x86\x4d\x45\x3c\x0d\xe3\x01\x52\xfc\xa7\xff\x92\xd7\x5c\x66\x15\x71\x83\x94\xd3\xb6\xfe\xf2\x82\xde\x62\xc7\x67\xc6\x54\x04\x06\x5b\x5e\xb7\xad\x91\x44\x22\x07\x6f\x29\xdd\x80\x98\x29\xf4\xeb\x1f\xcb\xb7\x51\x24\xf4\xf9\xd6\xd5\x9e\x86\x28\x4a\x85\x91\xf7\x04\x3f\xa6\x52\xa2\xb0\x10\x9c\xd5\xed\x4b\x79\x01\xe4\x59\x03\x64\xb7\xbc\xe9\xe0\x5c\x90\x79\x33\x95\x52\x8a\xfb\x11\x54\x55\x39\x62\x87\x66\x2a\x95\x06\x89\xb2\x51\xf0\xaf\x7b\x5a\x11\xc7\xc0\x1d\xa3\xc4\x73\x07\xf1\x51\x22\x4d\x98\x63\xd5\x7e\x29\x4f\x17\x1e\x8b\x12\xc6\x7a\xc3\xad\x0d\xda\x8b\x11\x44\x44\xc9\x80\x60\x89\x72\xbf\x7e\x5e\x76\x7f\xe3\xb1\x6e\x57\xf4\x4f\x1f\x70\x2f\x8b\xa6\xca\xe0\xba\x38\x14\x53\x8a\x5a\xf5\xbb\xbd\xab\xc1\xb9\x3f\xeb\x50\x80\x6d\xd3\xe9\x74\xb8\x5e\x91\x62\x7d\xba\x20\x21\xe4\x48\x60\x68\x3f\xf1\x17\x71\x80\xed\x11\x54\x66\x32\xf5\x5b\x4e\xac\xee\x0a\xe9\x00\x21\x72\xf3\x13\x5f\x75\x74\x15\xa4\x3a\xf4\x4a\x8e\x36\xb1\xfe\x69\x6c\xa1\x00\x28\x5a\xe8\x31\xf8\xf0\x77\x0e\xad\x3d\x59\x07\x4a\x05\xbe\x79\x07\x33\xba\x93\xbe\x2c\x4d\x22\xc1\xb4\x93\xc1\x7c\x6d\xbd\x8e\x3c\xbb\x64\x49\xfa\xc7\xe8\x9a\x44\x85\x49\x8f\x2d\xf9\x56\x36\xf0\x72\xca\xa7\x4c\x23\x3a\x4c\x15\x12\x67\xed\x6d\xb0\xbd\xb5\x3a\xae\xe3\x1f\xa7\x01\x43\x69\x1e\x17\xe9\xb5\xf6\x6f\x38\x2b\x35\x0d\xac\x96\x92\x55\x54\x7d\xc2\x8c\x45\x1f\xf2\x6b\x0a\x02\x55\x48\x31\x3b\xeb\xd2\x94\x94\xfa\x6a\x93\x66\xa1\xc5\x3e\x1e\xab\x6c\xa2\xb9\xca\x34\x83\x14\xdd\xd0\x7c\x02\xdf\xd2\x9c\x5a\xdd\x0e\x0d\x99\x3a\x88\xdc\xcf\x5b\x1d\x91\x08\x33\xc1\x58\xca\x7c\x2c\xd5\x87\x93\x68\xf1\x87\x75\x14\x10\xe7\x59\xdc\x97\x17\x9f\xd4\x8d\x8a\x03\x8d\xfc\x24\xc8\xcf\x36\xe2\xfa\xf3\x03\x68\x8c\xe8\xf7\xc3\xbe\x47\xde\x75\xb7\x10\x27\x01\x36\x27\x67\x35\x22\x83\x26\xa7\x26\x91\x09\x82\x41\xd2\x64\xdb\x88\x8f\xeb\x42\x77\x4c\x27\x29\x41\x49\x26\xfb\x05\x9f\xdb\x1d\x22\xc3\x12\xd3\x4c\x5f\x74\xe5\xe9\x34\x16\x58\x78\xfd\xc8\xf2\xbc\x4b\x03\x6b\xc1\xac\xf3\x6b\x17\xd1\x93\xf8\xd5\x0b\xe1\x4f\xce\x17\x3c\x42\x49\x95\xd9\x97\x61\x98\xa1\x85\xd6\xca\x36\x91\x34\x2f\xd0\x7e\x75\xd5\x80\x1e\x7e\x5d\x49\x0c\x52\x12\x1c\xac\x3c\xd3\x5f\xa0\xc7\x61\xc6\x35\x12\x46\x1f\x81\x69\x29\x53\x34\xc3\x3e\x61\xb3\x18\xa4\x4a\x26\x69\x9b\xf1\x6b\x54\x71\x4a\xdd\x82\xf9\x7a\x9e\x90\x35\x32\xad\x74\x00\xc3\x2c\x7a\xe7\xa9\x5f\xff\xde\x3a\x64\xc8\xdb\x8e\x89\xb1\xac\xb0\x3b\xc2\x7c\xe7\x01\x29\x5a\x4b\x8e\xa4\x73\x47\xa8\x4c\x59\x1d\x5a\xf7\x72\xd4\x06\x7e\xba\x02\x5f\x1a\x18\x74\x0d\xd4\x92\x7c\x75\xec\xe9\x80\xf5\x7e\xab\xab\xff\x19\x7a\x42\x03\x55\xd8\x87\xf6\xf6\x13\x32\x7f\x37\x90\x06\xb8\x1a\x7f\x66\xfd\x9c\x33\xa1\xc6\xd0\xf7\x3e\xcb\x0f\x47\x51\xf7\x7f\x8f\x39\xe6\xa2\x3a\xf4\x6e\x55\x1e\x70\x57\x9e\x64\xd0\xb5\x51\xa9\x76\xbe\xc1\xdc\x1a\x95\xf1\x00\x08\x58\x82\x73\xf1\xbd\xac\xea\x76\xe9\x6c\xaf\xc8\xaa\xfb\xa1\x12\x90\x02\x67\xf9\x0d\x46\x7d\x45\x40\x14\x45\x43\xb0\x79\x59\xec\xf6\xcb\xdd\xc3\x7e\xbd\xe9\x0e\x19\x81\x0c\xfb\xf7\xab\x97\xed\x6e\xff\x7d\xb5\x7b\xb8\x7b\x99\x7d\xdf\xbf\xcc\x76\x7e\xfb\x81\x90\x28\x0d\x2e\xbc\xdf\xb5\xce\xa6\xad\x04\x4c\xd1\xc5\x17\x93\x0c\x42\x25\xd0\x79\xf5\x2f\x01\x65\x60\xf4\xf2\xd7\x11\x8a\x4b\xaf\xa4\x3b\xc7\xe2\x8f\xdb\x60\x09\xad\x7f\xf8\xc7\x64\x80\x96\xda\x46\x95\xc5\xc7\x0b\xa8\xec\xd8\x7a\x44\xcf\x1d\x26\xde\xfb\x04\x40\x19\xc3\x58\xe6\x70\xde\x36\x65\x05\xda\x2b\xd8\xf8\x4f\x04\x9c\x72\xdc\xd2\xff\x09\x55\x35\xc2\x40\x03\x4f\x88\x1c\xc2\xd1\x67\x79\xbe\x2b\x87\x30\x44\xe0\x52\x7b\x9f\x0c\x7b\x12\x2f\x75\xe1\x19\x70\xb0\xb5\xc8\x3a\x2f\xdf\x3a\x62\x32\x88\x38\x20\x3e\x66\xa6\x75\xe5\x7b\x60\x20\x16\x34\x71\x34\x9d\x5f\xa0\x80\xad\xca\xc0\xca\x03\x57\x17\xfc\x05\x10\xab\x04\xeb\xca\x6e\x4d\x78\xff\xea\x93\xe2\x0f\x24\x2c\x42\x67\x59\x95\x85\xc9\xaa\x03\x20\xda\x76\x08\x4a\x84\x44\xda\x5e\x8a\x37\xc7\xfe\xda\x6e\x27\x36\xfe\x9b\xe4\xb2\x21\x4d\x13\xd5\x09\x73\xd4\xef\x7d\x66\x0b\x52\x2d\xb0\xd8\x88\x01\xf2\x42\xe4\x17\x14\x81\x6e\x9c\x48\x34\x22\xad\xee\xcb\xaa\x29\xb2\x06\x7a\x31\x55\x06\xc2\x10\xb0\xdd\x4d\x85\x9e\x0b\x7d\x65\x3b\x1f\x5f\x4b\x45\xc6\x52\x47\xe2\x06\xb9\x28\x8b\x06\x5c\x39\xb5\xbb\x61\x15\x5b\x79\xf2\x43\x56\xf4\x41\x12\x68\xc2\xbc\x54\x87\xdd\xa8\x66\x79\x26\xea\xfb\xf2\x3a\x1f\x35\x03\x1d\x6a\x0b\xe5\x2b\xb2\xe6\xa2\x3f\x6c\x3a\x96\x6a\xcc\x14\x6c\xca\xfc\x3c\x2b\x44\x7e\x6e\xb2\x5f\x23\x44\x47\x37\x0e\xd0\xa7\x9d\xcf\x16\x5f\x5f\x37\xfb\xdd\xc3\xcb\xb2\x5b\x73\x5a\xc4\x84\x3a\xcf\x72\xf7\xb3\xfc\xde\xbf\x22\xad\x42\xec\xb5\xfb\xbe\x7a\xf6\x28\x0f\x80\x20\xb0\x5a\xdd\xe7\x27\x68\xde\x07\xc2\x68\xa3\x09\x09\x51\x08\x76\x1d\xab\xb2\xd0\xdf\xc5\x0f\x18\x56\x4c\x01\x52\xe9\x83\x91\x6f\x59\xd5\x9c\x7a\x69\xfd\xeb\x8f\x09\x52\x21\x7e\x60\xfb\x7d\xb6\x59\xac\x57\xcf\xff\xc7\x5f\xc8\x00\xc3\x29\xd2\xba\xb6\xbb\x12\xe7\xd3\x63\x76\x99\x22\xb6\xa3\x4d\x10\x53\x6e\x03\xec\x46\xbd\xaf\x5c\xd0\x65\xc5\x56\x7b\xba\x98\xcb\x49\xdd\x9e\x27\x5c\xe0\xdf\xfa\x35\x6b\xf3\x28\xea\x66\x9e\x79\x8f\xc3\x90\xd0\x10\xeb\xb1\x97\x26\x6b\x5a\xd3\x93\x15\x6f\x4f\x03\x20\xad\x1f\xc7\x53\xc4\x60\xc1\xaf\x06\x8a\x21\x4a\xd2\x10\x50\xd4\x09\x69\x21\x85\x15\xd4\x75\x67\x70\xfc\x98\x50\xd9\xa4\xbd\xad\x40\x0f\x94\x37\x98\xa1\xa1\x6d\xe9\xb2\x4e\xc4\x83\xe5\xaf\x1d\x1b\x77\x43\x39\x67\xa9\x67\xf0\xf8\x63\xfa\x88\xa8\xd5\x65\x23\xd9\xf6\x85\x40\xd1\x64\x0a\x16\xef\x30\x45\x0c\x18\x96\x10\x65\xbb\xcf\x84\xca\x61\xd5\xfc\xeb\x04\xd5\xf9\x3a\x5d\xe4\xd5\x9d\xc3\xb0\x44\x7a\x67\xe3\x7b\xfb\x1d\xa6\x9e\xa8\xe1\x8c\xe1\x3e\xd7\x6d\xec\x48\x51\x3a\x86\x14\x19\xce\x01\xd1\xc0\xef\x48\xa8\x39\x90\x28\x77\xc7\x23\x62\x59\xef\xbe\x40\x73\xb7\xde\xbd\xc0\x8f\xf2\xa3\x35\x34\x98\xf8\x1b\x66\x5f\xfc\xda\x35\x11\x07\x88\x7d\x49\xe4\x03\x8a\x3b\x50\xd9\xc0\xe9\x34\x51\x1a\x08\x44\x5a\x57\xe7\x63\x53\xfe\x14\xd5\xe0\x48\x64\x5c\x98\x89\xb7\xfa\xbb\x7c\xdd\x00\x94\x62\x62\x4a\xb0\x2b\x65\x93\x0b\x05\x03\x32\xac\xa1\x6b\x61\x62\x46\x75\x57\x9d\x3b\x0a\x05\x53\x5a\x26\x13\xb3\x28\x8d\x5d\x39\x4a\x0a\xf5\xf1\x45\xd4\xa3\xf9\x11\x8b\x14\x83\xf5\xef\x22\xb3\xcd\x2d\x53\x44\xb2\x49\x42\x6e\x59\x57\xf3\xb2\x86\x41\x5e\xcd\x24\x06\xd0\xd9\x5e\xea\x37\xa4\x42\x74\x0a\x76\x7f\x2b\xe4\x31\x29\xd1\x58\xbe\x6d\x4d\xd9\x6f\xa2\x63\x7f\x46\x1c\xa0\x5f\x21\xac\x0b\x0b\x28\xe1\xb6\x36\xce\x81\x9a\x18\xcc\x6e\xf6\xa6\xa9\xc4\xee\x82\xc5\x7b\x66\xdb\x94\xfc\xdd\x8b\xc8\x50\xe9\x72\x42\x59\x05\x1a\x91\x02\xf5\x32\x17\xc7\x1a\xf4\x7d\x59\x7d\xcb\x54\xd3\x17\xa4\x8d\x90\x32\x71\x6d\x68\x28\x79\x77\x5b\x36\x80\x19\xa1\x23\x2c\x92\xb8\x80\x08\x61\x17\xfd\x0e\xe9\x06\x49\x1e\xa1\x0b\x6b\x51\x8c\x3b\x07\xb4\xfd\xfc\xa5\xa9\xd0\x76\x6f\x41\x25\x06\x8a\x64\xcc\xa8\x88\x7b\xe5\xa1\xd5\x05\x91\x90\x1f\x13\x07\xc6\x0c\xf0\x5d\xeb\x01\xaf\x3a\x33\x4a\x26\x81\xab\x74\xd5\x30\xc1\x7c\x74\x43\x14\x66\x70\xad\x1f\x55\xfe\x5c\x56\x2a\x0c\x3e\xdf\x19\x8d\x0e\x04\x77\xc1\x90\x17\xbd\xbd\x2f\xbb\x77\x31\x82\x8e\x1a\x1d\x4a\xcc\x47\x3c\xa3\x57\x2d\xf2\x41\x6d\xdb\x68\xce\x13\xdb\x5d\xfd\x0b\x5d\xb7\x6b\xe4\x79\x46\x47\xa0\xd2\x4e\x01\xbc\xcf\x5d\x19\x88\x43\xa7\x45\x80\xe9\xbf\xd7\x02\x73\x9f\xfd\x51\xab\x50\x9b\xd5\x2f\xf0\x76\xca\x45\xb5\xae\xe6\xa5\xa8\xb4\x13\xd9\x19\x7f\x5a\x48\x00\x1b\x5f\x1c\xd2\xe9\x56\xc7\xc9\xa7\x66\x0e\x4c\x84\x53\xbf\xdb\xc1\x27\x08\x39\x37\xcc\x28\x81\x2e\xf7\x8f\xac\xce\x9a\x4e\x84\xd1\x3f\xac\x01\x81\xfe\xcb\x71\xc0\x31\x6a\x9f\x88\x07\x01\x67\x69\x8f\x4e\x5e\x16\x4d\xd6\x9c\x9f\xa1\x17\x21\xea\xbe\x3b\x0f\x02\x50\x1e\xdb\x7e\xf7\x20\x1c\xa8\xdd\x7d\x72\x1e\x90\x20\x21\xce\x3f\xd9\x5b\x38\xfe\xd5\xc9\xc5\x03\x12\x46\xd8\xca\xfc\x75\xf9\xf2\xbc\x7c\xdc\xcf\x36\x1b\x7f\x2f\x24\xb6\x48\xed\x4e\x6d\xf5\x24\x3b\x7d\xe6\xab\xa0\x22\x1e\x10\x23\xac\xd0\x57\x95\xbd\xbd\x41\xf5\x02\xc8\x47\xe7\x95\x39\x6d\x82\xe5\x96\x8f\xc4\x83\x50\x59\x0a\xa5\x36\x62\x9d\x0f\x44\x6c\xd0\xff\xbe\xe6\xcc\xf2\x80\x92\x10\x41\x72\x32\x07\xa1\xde\x67\xc7\x23\x88\xaa\x6b\xba\x9b\x72\x05\xf0\x80\x6a\x05\xfd\xeb\xed\x3a\xe7\xa6\xbc\xd0\x64\x7a\x67\x3c\xd4\xbe\xb4\xee\x81\x72\x2f\xc8\xd8\x53\xfb\x97\xc5\x69\x8c\x52\x2a\x8e\x38\xda\xd1\x3a\x62\x67\xe0\xf5\x57\xc5\x59\xa0\x8c\x13\x52\x79\x12\xbf\x7c\x3d\x7c\xf2\x7c\x3c\x0d\x90\x3e\x64\x00\x95\x79\x14\xd5\x1b\xdc\x82\xca\xf0\x80\x2b\xc6\x86\x6c\x06\x7a\x79\x85\x62\x82\x07\xdc\x50\xef\x38\xe0\xf3\x3c\x61\x63\xc0\x8d\x0f\x13\x85\x21\x5a\x50\xab\x13\x71\xd7\xe9\x6b\xf2\x20\x4a\x04\x8a\xa2\xdb\x5a\xc1\x05\x8e\xc4\x8f\x92\x06\xb7\x61\x4f\x7e\x38\x3f\x6f\xcf\x07\x59\xe6\xc3\xdd\x9d\x07\x31\xd3\x48\x55\x38\x10\x6a\xb8\xd1\xa3\x34\x3a\x2d\x61\x32\xb0\x55\x93\xe2\x24\xf2\xf5\x0f\xa8\xaa\x4c\xc3\x52\x23\xae\xfc\x21\x7b\x6b\xdd\x9d\x79\xa6\xf5\xcd\xa7\x4b\x23\x83\xcf\xf0\x15\x9d\x80\xa3\xfd\xbe\x4f\x1d\xf8\x8c\x07\xa9\x21\x18\xac\x6d\x1f\xbb\xb5\x21\x88\xcd\x42\x3b\x01\x24\xb8\xee\x2b\x0d\x56\xab\x48\x34\x7a\x89\x59\xed\x7c\x9e\xeb\xf3\x59\xa4\x14\x99\x71\x36\xeb\xe5\x9f\x57\x95\x8d\xfd\x38\x15\x20\x0a\x60\x7e\x3a\xbf\x94\xf5\xa0\x11\x85\x07\x92\x58\x80\x7f\xe3\x51\xc0\xb4\x3b\x42\x39\xce\xfe\x79\xa6\xb7\xe2\x87\xef\x92\xe1\x81\x54\x1c\xdf\xe0\xec\x20\x45\x5d\x0b\xed\xd5\x6b\x78\xa0\x52\xee\x91\x2c\x4f\xe2\xd7\x2d\x86\x1a\x1e\x28\xd5\x35\xac\xae\x4f\xcd\xb6\xa9\x40\x1c\x26\xfe\x0c\x0f\x34\x97\xe8\x64\x3e\x7a\x6d\xbf\xee\xc6\x34\x84\x68\xf5\x96\xcd\x3b\x06\x0c\x5b\x10\x95\x7a\xff\x67\x29\xa7\xaf\x47\x83\xb0\x3d\xab\xa5\xce\xcc\xf9\x33\xcd\x2d\x1e\x40\xac\x11\xe4\xb6\x78\x59\x7f\xbf\xdb\xce\x1e\x97\xfb\xc5\xe3\x7a\xbb\x7a\xfe\xb2\xdf\xad\x3c\x65\x01\x0f\x20\x21\x91\x1c\xc6\x71\x5b\x10\x39\x68\x5f\xfa\xc0\x0c\xc2\x6d\x8b\x05\x49\x8c\xfb\xd6\xf1\x5c\x89\x43\xd6\xbd\x50\x30\x69\x44\x7c\xbf\xe7\xa2\xac\x2a\x50\x7d\x31\xc5\x8d\x31\x40\x98\xa3\x45\xf1\x9a\x4d\x43\x23\xff\x99\x60\x97\xbd\x02\x09\x02\x89\x99\xe5\xa3\x77\x33\xaf\xf0\x74\x70\x12\x84\x06\xb3\xe1\x9b\x97\x25\xbe\x84\xed\x6e\xf6\xb2\x1b\xbe\x02\x12\xc4\xb6\xe7\x62\x50\xf6\xb4\x65\x19\xd0\x33\xd3\x40\xb5\xac\x95\xc8\x2f\x13\x8f\x9c\x90\x30\xc0\x79\xf3\xe7\xe2\x79\x37\xdc\xc5\x08\x09\x63\x5f\x97\xdf\x8a\xbc\xe3\x04\x44\x27\xd5\xc2\x3a\x47\xaf\x91\x10\x6a\xe5\x50\x2c\x49\xdc\x8f\xc5\x84\x2f\xd9\x8f\x4a\x25\xa2\xd6\x94\xc5\x0c\xb8\x36\x31\x27\x13\x3e\x1d\x2b\x6d\x75\xee\x90\x15\xf3\xd3\x19\xb1\x1f\x87\x3e\xd2\xe0\x24\x4c\x24\x1a\xf4\x85\x38\x1c\x45\xf6\x56\xbc\x40\x7d\x3a\x4c\xfc\x67\x4e\x68\x6c\x98\xbb\xaf\xf6\x39\xea\x4d\x76\xbc\x8d\x95\x73\xe7\xf8\x50\xaa\x81\xba\xb1\x30\xc2\xce\x67\xea\xdd\x7f\x4e\x98\x88\x24\x1b\xa4\xb6\xfa\xec\xd2\xf8\x72\x3c\x88\x8c\x4f\x68\xdc\x8b\x6a\x94\x22\xe2\x24\x22\x80\x58\xf0\x87\xaf\x77\x0f\xbf\x63\x04\xe0\x24\x12\x24\x31\x5d\x5b\x09\x32\x41\x5e\x7b\x77\x91\x70\x71\x27\xee\x64\x8f\x65\xd3\x40\x4f\xb8\x70\xd5\x31\xe2\x24\x52\x91\x72\xcd\xe4\x8e\x06\xdb\xbf\xe9\x48\xc7\xd4\x42\xc8\xd5\x09\x77\x71\xbb\xa4\xb0\xed\xab\xab\xe6\xb7\x13\xfe\xea\x8e\x4d\x62\x66\x02\xd7\xac\x81\x4e\x97\x75\x9e\xc7\x37\x9c\x84\x10\xdb\x5c\x69\x61\xbf\x32\xf3\x3f\x9e\x70\x8d\x5e\x77\xbb\x3d\x8d\xf4\x96\x39\x49\x43\xa3\x6c\xbb\x53\x7d\x6a\xff\x7e\x57\x09\x33\x9d\x71\xa9\xa0\xf1\x50\x64\xf8\x05\x70\xad\xed\xaa\x13\xbc\x6e\xef\xfc\x95\x44\x62\x6d\x31\x56\x14\xf6\x3f\xb3\xa2\xde\x77\x49\x5f\x4e\x84\x30\x88\xc3\xd0\xfe\x03\x6f\x04\x2a\x3c\x61\x2e\xd3\x0f\x92\xdc\x24\x9e\x59\x7e\x6f\x3a\x6e\x62\x4e\x14\x11\xb6\x0a\x80\xf0\x88\x1e\x26\xce\x89\x8a\xed\x0c\xaf\x01\xf4\xfe\x60\x01\xad\x99\x4f\xc8\x71\xa2\x29\x4f\xdc\xfe\xfe\x5a\xc3\x72\xb5\x89\x49\xd8\x47\x0d\x9c\xe8\xc4\x18\x0f\x58\x13\x3f\x26\x93\x0e\xa8\x76\x5d\x1b\x23\xd1\xca\x11\xf8\x62\x32\x01\x40\xa7\x88\x07\xf8\x89\x30\xe6\x2d\x34\x57\xda\xa1\x39\x31\x82\x4a\x4f\x22\x78\x2f\xb2\xfc\x16\x53\xe9\x20\x57\xca\x89\x91\xb6\xe9\xac\x75\x65\x9b\x4a\x64\x45\x56\xbc\xed\xb3\x3e\x88\xe2\x61\x10\xc4\x24\xe9\xa3\x04\x54\x09\xbe\x56\x7d\xe6\x61\x90\x86\x58\x5e\xde\x54\x70\x14\x15\xbc\x94\xf9\x98\xc5\x96\x87\x81\x34\x68\xd4\xea\xf7\x93\x31\x9e\x53\x80\x87\x81\x0e\xc1\x22\x88\x85\x46\x37\xa6\x2a\xf3\xbc\xfe\xb3\x7d\xbc\xf1\x33\x86\x21\x11\xd8\x08\x80\xc9\xab\x0e\xf7\x8a\x90\xe3\x09\xde\x98\x87\x21\x95\xd8\xc5\xa5\xcb\xa2\xdb\x74\x43\x4a\x63\x6b\xbb\xc4\x5b\xa6\x8a\xd3\xa1\xce\xde\xba\x43\x2c\xc1\xa4\x41\xd5\x7a\xaf\x50\x2d\x7d\x43\x26\x0f\x19\x4d\x02\xd7\xfb\xb9\x5f\xfe\x52\xef\x6f\xfb\xf9\xc7\xdb\xe2\xfd\x76\x57\xe4\x55\xeb\x15\x32\x6e\x85\x7d\x6b\x28\x5a\xc7\xf1\x66\xfa\x8c\x63\x73\x64\x8c\x59\x00\x0d\xbf\x7e\x64\x30\xf1\x5c\x43\x96\x26\xc2\x35\x25\xbd\x56\x63\x4f\xaf\x75\x3f\x3d\x85\xcc\x97\xbc\x94\x22\x1f\xd5\xdb\xc6\x7b\x6c\xc8\x85\x88\xbd\x42\x36\xee\x20\xdc\x3f\x33\x37\x5c\xf5\x38\xd6\x79\x76\x81\x35\x72\xe3\xa2\xc8\xa4\x91\xa3\x72\xf8\x69\x83\x76\xec\x0d\x6f\x72\xf8\xe3\x4a\x8d\x8a\x87\x91\x4e\x71\x96\xa8\x7c\xa8\xab\xc2\xc3\x98\x52\x22\x47\x9a\xb7\xb6\xb3\xc1\x91\x7c\x4e\xb8\x45\x3e\xad\x71\xe3\xc5\x4c\x2f\x2b\xde\xc6\x91\x68\x1a\xba\xdf\x4a\x22\x74\xa9\x30\x9d\x86\x9b\xe6\x36\xfb\x0b\x56\xc5\x20\xed\xce\xc3\x24\x20\x91\x75\x99\x51\xa6\x69\xdc\x73\xf3\x09\xe1\xff\xe4\x56\x92\xd8\x16\xab\xb0\xce\x0b\xf5\x97\xec\x47\xb7\x97\x87\xa9\x4c\x83\xd8\x6b\x4d\x9f\xf2\xc6\x53\xf6\x8d\xaf\x90\x6a\x2b\x4d\x64\x4e\x1d\xa3\x36\x0f\xa5\x88\xad\xb4\x43\x0d\x95\xe5\x04\x1f\x49\x4b\xf8\x51\x32\xc5\x6c\xef\xe6\x61\xbd\x7c\x5e\xfd\xb9\x5f\xac\x5f\xb6\xb3\xd5\xcb\x7e\xf9\xe7\xee\x65\xb6\xd8\xad\xd6\xcf\xfb\xf9\x6c\xeb\xbd\x95\x50\x49\x66\x86\xea\x84\x9d\xec\xf8\xe4\x51\xbb\x89\xaa\x94\xf0\x0a\xbd\x88\x0a\xb2\xbd\x08\xf3\xae\x37\x9a\x87\x0a\xb4\xa2\x7e\xd2\x23\xf5\xe0\x4f\x18\x64\xed\xae\x6c\xa5\xa1\x26\x1c\x27\xe5\x30\x07\x36\xe8\x6f\xff\xfc\xcb\xeb\x18\x24\x1d\xa3\x76\x10\x3a\xb0\x1a\xda\x34\x2d\x15\x8d\x06\x01\xda\xa6\x2c\x73\x87\xa8\x1b\x5f\x0d\x58\x20\x49\x97\x95\xaf\x37\x50\xfd\x1b\x44\x37\x43\x40\xcb\xd8\x5d\xe6\x75\x55\x34\xc9\x55\xb4\x9a\xdb\x6c\x43\x43\x18\x76\xd8\x62\xfb\xff\x15\xac\x2c\x0f\x8d\x83\x6c\xe5\x65\x0d\x55\x27\xdd\xcd\x43\xc3\x52\x04\xfe\x3b\x9d\x37\x1b\x22\xaf\x8a\x79\xd1\xd8\xff\x9e\xba\x74\x93\x37\x62\x24\xc5\xca\xa8\xbb\x29\xfb\xaa\x47\x49\x2c\x4e\x83\x24\x45\x1e\x80\xfa\xf0\x6b\xd7\x0b\xb0\xfc\xe1\x8f\x2a\x0b\x95\xae\xc4\xa4\xbd\x9f\x53\x12\x19\xe3\x80\xcf\x73\x68\x5e\x33\x87\xc2\x4f\xfe\xd1\x3f\x39\x25\x82\x7a\xc8\xda\x1d\x58\x71\x0d\xd0\x2f\x70\x2c\xab\xc6\xf5\x2c\xde\x9d\xa0\x23\x04\xf2\x3f\x1a\xc6\x12\xa1\x5e\x39\xee\x5f\x98\x55\xdb\xfd\x1a\x21\xe8\x39\xa5\x52\x22\xd3\x92\x16\x8d\x58\x40\xd1\xd8\x4c\x46\x77\xd4\x98\xd4\xc9\xdf\x5b\xb2\x1b\xd7\x3b\x7c\xcb\x6a\x0f\x27\x21\x65\x41\xec\xc8\xde\x2d\x4b\x7b\x47\x76\x32\xb9\x05\xc6\x53\x70\x5d\x0a\xf5\x16\x90\x0b\x15\xb0\x29\xc3\x7a\x44\x58\x2b\xf9\x95\x1d\x44\x03\xbe\x45\x84\x53\x4e\xb8\x76\x28\xd1\xea\x04\x7a\x7e\x42\xd5\xff\xd1\x64\xa0\x5c\x12\x04\x10\xd8\xec\xf9\x3f\xb3\xe2\xad\xa3\xbf\xe3\x94\x6b\xcd\xdd\x24\xef\x12\x88\x3d\xe8\xdf\x8b\x5f\x21\x87\x61\x8f\x27\xea\x4e\x36\x71\x34\x54\xb1\x68\x4f\x1c\xc2\xd5\xae\xc0\x64\x39\x8d\x48\x10\x75\x52\x84\x06\xaa\x4a\xe4\xdb\x46\x34\xa7\x49\x10\x49\x23\x1d\x63\x51\x1f\x0a\xbd\x36\xbd\xc9\x74\x47\x13\x16\xc7\x81\x43\x7a\x57\x3f\xc0\xa1\x2e\x3a\xa3\x46\x93\x18\x30\x61\xdb\x88\x3c\x3f\xef\xde\x11\x9e\xd3\x3d\xb4\x90\x86\x89\x9e\x78\x1e\x83\x86\xfb\xb2\x9a\x61\xdf\xf8\x94\xf6\x92\x53\xa9\x38\x3a\xae\xca\x16\x3b\x3c\x8e\xd8\x1f\xd5\x31\xd2\xa7\x61\x14\x79\x7d\x6b\xa3\x2a\xb1\x0e\x84\x63\x2d\x1e\xe9\x78\xfa\x21\xc2\x4e\xb1\xd6\x90\x88\xfa\xa3\xbe\x9a\x78\xa0\x3a\x21\xe8\xbf\x6d\xc5\x8f\xac\x78\xab\x51\xbb\xc9\x1d\xc2\x4a\xf8\x80\x92\x7f\x7b\xac\xb2\x06\x6a\x94\x52\x9d\x9f\x2f\xfa\x1b\x39\x85\xd8\x82\xe5\x25\xa8\xf2\x00\x1b\xa1\x32\x93\xd5\xcd\xc1\xf6\x30\xfa\x31\x52\xa7\x36\x1f\xb2\xcb\xa0\xfa\x67\x99\x15\x93\x2c\x2a\xa7\x26\x08\xd3\x01\x78\xc3\xae\x8c\xcd\xe2\x8f\xee\x30\xe7\x2e\x72\xb7\x74\xa7\xcb\xce\x6d\xa6\x26\x4c\xb0\x1f\xaa\x34\xd8\x89\xd9\xe5\xe2\x6e\xc0\x1f\xfe\x71\xcd\x4c\x53\xc3\x15\x46\x2e\x42\xeb\xa6\x7c\x44\xe5\x4f\x59\x7a\xfb\x3b\x6e\x68\x75\x99\x70\x4e\x4d\x92\x4a\x57\x2c\x5e\x0c\xf4\x52\x5e\xb7\x77\x0e\xa9\xcb\x59\x10\x08\xd4\xcc\x91\xa7\xf3\xe6\xf4\xd7\x5f\xee\x6e\x12\x7f\x34\x04\xc4\x20\xfd\x50\xbf\x06\x2c\x90\x9c\x05\x2c\x64\x0e\xa1\x08\x06\x37\x8a\x55\xf1\x82\x78\xb5\xd1\xd9\x11\x4b\x02\x5f\x8b\xd4\x0e\x41\x35\x7a\x2a\x16\x28\x86\xad\xb2\x47\x4c\x6f\x14\x83\xee\x67\xce\x08\x68\x6c\x9a\x29\x0d\x54\x8d\xf0\x7f\xa5\x3c\x46\x8f\x78\x20\x8c\xe4\xda\xc9\xc6\x57\x66\x34\x35\xe0\x1d\xdf\x0f\x28\x2e\x6a\xb6\x7e\xd6\x32\x96\x2a\x4c\x51\xcd\xaa\x06\x4e\x43\xf6\x2f\xce\x78\x94\x44\xb6\x6d\x6b\x5f\xe7\x65\xb3\xcf\x8a\xbd\xcc\xf4\x65\x63\xa2\x1f\x2e\x02\x24\x5e\x7d\x5a\x2f\x47\x97\x89\x08\xc5\x9c\xde\xd3\x76\x73\x51\xb2\xe5\x2c\x62\x29\x46\xff\xb3\xd7\xc5\xa2\x3b\x83\x73\x9c\x6d\x77\xe0\xa1\xbc\x9c\x45\xda\x66\xc0\x7f\xfc\xae\x41\x89\xb3\x98\xc5\x98\xf9\xc6\xc5\xda\x19\xbc\x4f\xe4\x1c\x39\x8b\x23\xf0\xcd\xd5\x4d\x0e\xb3\x42\x7b\xf3\xb8\x30\x7a\xc4\x05\xc0\x59\x12\x04\xb8\xcc\x1d\x63\xde\xb6\x97\x90\xe7\x2c\x91\x96\xd9\xc5\x9f\x2d\x72\x27\xd9\x67\xc9\xae\xa7\x53\x7d\x60\x31\x59\xca\xd3\x34\xe9\x70\xc5\xd9\xe1\x74\x58\x94\x45\x7d\x3a\xa0\xbb\xd6\x13\x33\x73\x96\x26\xc4\xb3\x58\xcf\x4f\x67\x9f\xab\xe8\x75\x8a\x3d\x91\xec\x75\xcd\x7e\xce\x52\xa1\x31\xf3\xf0\x34\x7b\x7e\x98\xed\x76\xb3\xe7\xcd\xcb\xfa\xcf\x7f\x2f\x9e\xbf\x3d\xef\x66\xdf\x96\xdd\xaf\x80\xf5\x64\x50\x86\x43\x7d\x80\x1e\x87\xec\x4c\xb0\xc8\xa0\xb1\x3b\xab\x1c\x9e\xda\x70\x60\xd0\xd5\xc8\x99\xa4\x41\x68\xa3\xd6\x1f\xe5\x47\x6b\xb8\x9f\xce\x9e\x9d\x9e\x33\xa9\x2d\xc5\x85\xc3\xa4\xe3\x1e\x3c\xbe\x47\x15\xdb\x5a\x70\x27\x4c\xdf\x35\xc8\x74\xf3\x56\xa5\x44\x7a\xa5\x8d\x79\xd6\x3c\x97\x6d\xa0\xeb\xf9\x63\xdd\x98\x36\x4e\x0c\x5d\x8d\x1a\x0e\x65\x9e\xd5\xef\x8b\x41\x8b\xfe\xe4\xc5\x68\xa1\xd0\xe3\xba\xcd\xc6\x33\xda\xf2\x99\x56\x06\x42\xf4\x38\xea\xa1\x08\x8c\xb8\x84\xce\x73\x66\xb4\x15\xbc\xf3\x9b\xe8\xeb\x62\xb6\x7d\xb8\x3e\x17\x79\x40\x22\xcc\x5a\xe1\xf4\x5d\x99\xe5\xaf\x63\x5e\xea\x6e\x2b\xe2\x41\xcc\x84\x0b\xd8\x9e\x30\xcd\xde\x19\xb7\x1b\x50\x4c\xce\x03\xc5\x10\xe7\x6d\xf5\x03\xf7\x7d\xbe\x84\x93\x84\x27\x2e\xa5\x73\x9f\x8b\xb7\x71\xb1\x92\xf3\x90\x12\xe4\x15\x69\x1f\x11\xe3\x9e\x21\x9d\x34\xe7\x94\x09\x84\x65\xd4\x1e\x82\xf4\xe2\x20\xff\xdd\x80\xd8\x4a\x16\xcf\x2a\xf1\x56\x16\xa3\x29\xc2\xa9\x50\x81\x1e\x7c\x63\x7d\x51\x7d\xf6\x03\x21\xc0\x3c\x3c\x6e\x72\x4f\x65\xd5\x75\x13\x70\xce\x04\x45\x21\x81\xff\x9e\xa0\x3a\x3b\xff\x7d\x57\x09\x64\x72\x19\xe0\x61\x38\x67\xd2\xd2\xa7\x7d\x7c\x7c\xf4\x0c\x8f\xd7\x7f\x8e\x47\x04\x4b\x82\xb3\xf5\xd7\xcd\xec\xdf\xfe\x02\x51\x62\x10\xda\xb7\xdf\xb7\xeb\xae\xf7\x92\xee\xcb\xea\x4e\x58\x96\x8f\xfa\x0a\x63\x2a\xe7\x91\x04\x4c\x1a\x1a\x00\xdc\xc8\xc7\x47\xe3\x20\x42\x7f\xd8\xb2\x92\xd7\x36\x76\x0d\x6f\xdc\x59\xcc\x45\x60\xd1\x62\xe3\xc5\xc8\xe3\x34\x46\x1b\xaa\x44\xae\x4e\xad\x03\x7c\x57\x9d\xde\xe6\xa7\xb3\x8d\x88\xc7\x6b\x8b\x27\x41\x84\x18\x9d\xd6\x09\xde\x96\xa7\x4a\xc1\x17\xb0\x22\x5c\x6b\xb3\xcd\x7e\x35\x00\xc5\x15\xc1\x0a\xce\x13\x6a\xb1\x57\x7b\xeb\xe2\x4e\xf4\xc2\xfc\x20\x0e\x58\xd6\xd0\x99\x38\x94\x85\xc6\xcd\x71\x57\x5a\x04\xd0\x34\xa5\xcb\x93\x84\x59\x96\x7f\xa7\x95\x75\xbe\xa4\xb2\xe0\x3c\x85\x00\x35\xc6\x2b\x14\x6a\xf5\xe0\xf5\x0b\xfe\x25\xce\xa5\x4e\x91\x2f\xbb\x8d\x18\xe6\xe7\x79\x95\xe9\xee\xfd\xa8\x24\xc4\xfc\xbe\x18\x48\x4d\x6d\x2a\xe8\x79\x2a\xdb\x21\xc6\x92\xad\x43\xdd\x9c\x77\xbd\xc3\xce\x21\x34\xa8\xa4\x24\xf4\xff\x9e\xea\xe6\xae\xcc\x73\x61\xb9\x6f\xa0\x7a\x11\x4d\x56\x4e\xee\x02\x18\xb3\x7c\x97\xc8\x00\x90\xd5\x5d\x64\xcb\x81\x45\x58\x7c\xef\x72\x27\xdd\x01\xa1\xac\xcc\x12\xfc\x7c\x71\xf9\x87\x9b\xc4\x62\x9c\x9b\x24\x04\x6b\xfe\x45\x3e\xe8\x73\x1b\xad\xdb\x28\xe0\x0a\x43\x28\xcf\x6e\x6e\x3c\x07\x34\x8f\x02\x61\x5b\xdf\xde\xcb\x53\x0d\xd0\x11\xec\xf3\x28\x90\xb6\x57\xbe\x9b\x44\x1b\x71\xb6\x2c\x4b\x55\x51\xf5\x8e\x49\x44\xa2\xc0\x37\xc0\x3c\x8a\x42\x1f\xd1\x3e\x63\xa7\xe8\x1d\x18\x28\x34\x54\xab\xbb\xc1\x06\xd4\xdd\x13\x49\x94\x70\x5b\xac\xcd\xf7\x0c\xc9\x03\x6f\x29\x3b\xf2\x88\x00\xa0\xed\x6a\x77\xdb\x36\x2c\x9a\x9f\xce\x3d\x43\xcf\xb8\x0c\x1f\xb5\x4f\x81\xf2\x7c\xed\x6c\xb6\xc4\xb1\xd7\xdf\x62\x14\x4a\x16\xc6\x4e\xc3\x28\x2b\xe0\xeb\x59\x8d\x17\x66\xd4\x06\xb1\xed\x2e\x69\x7e\x76\x5b\xf9\xf8\x4b\x47\x94\xcb\xa8\xaf\x5f\xcf\x45\x8d\xbd\xcc\x05\xa2\x5d\xae\xe5\x1c\x88\x3f\x91\x01\x41\x52\x55\xc7\x60\xe6\x3b\xf3\xc5\x00\x28\xc3\xa3\xd6\x39\xc4\xd0\xe6\x54\x15\xed\xda\xf0\x7f\x8f\xd2\x18\xfd\xf9\x4c\xaa\xae\xd7\xb6\xb3\xb7\x51\x1c\x02\x72\x4e\xad\x8f\x50\xcc\x33\x7d\xb9\x81\xfd\x1d\x54\x11\x8f\x62\x9a\x60\x2b\xfc\xec\xcb\xce\x5f\x39\x89\x80\xf0\xa1\xd4\x5a\xfd\x52\xaa\xd5\x64\x45\x47\x49\x0c\xe8\xea\x35\xa7\x02\x1e\x45\x6d\x83\x01\x9c\xec\x13\xfd\x26\x1e\xa5\x24\xc5\x2a\x85\xc9\x7e\x0d\xd6\x61\x94\xfe\x3f\xa4\xbd\x6b\x73\xa3\x48\xd6\x2e\xfa\x77\xfa\xc3\xfb\x01\x48\xc8\xcb\x47\x59\x96\xab\x34\xed\xdb\xb6\x54\xd5\x3d\xef\xc4\x84\x22\x2f\x2b\x6d\xb6\x11\x68\x00\xb9\xec\xf9\xf5\x27\x58\x99\xc9\x4d\xd8\xdd\xe7\x9c\x1d\xb1\xdf\xea\x31\x09\x82\x24\x59\xb9\x2e\xcf\x7a\x1e\x4a\xf0\x15\xf6\x3b\xce\x41\xc6\xd1\x77\xd9\xbc\x1c\xfc\xe9\xfd\x40\x46\x42\x26\xfa\x36\x6f\x5b\xcc\x5a\x8e\xbd\x74\x2a\xb8\xe1\x8e\x55\x3e\x94\x4d\xc2\x01\x6d\xd0\xad\x97\x4d\x93\x37\xad\x1c\xce\x90\xc2\x7d\xea\xce\x63\x87\x11\x13\x4c\x46\x15\x37\xe8\x50\xef\x6b\xf9\x06\x85\x96\xcd\x4b\x7f\x44\x3b\xda\x14\x74\xb5\x43\x83\x59\x38\x66\xa4\xf4\xf1\x5e\xb0\x18\x13\x96\xff\x8c\xea\x48\xa0\x2f\xf4\x54\x61\x97\x57\x55\x15\x43\x14\x3c\x5d\x91\x3a\x8e\x10\x2b\x7a\xc4\xe9\x4f\xa2\x24\x1e\x14\xea\x86\x15\xa0\x49\x42\x92\x20\x60\x03\xdb\xf5\x03\x42\x78\xbc\xef\xbb\xfc\xb6\x75\x66\xb5\x53\x03\xa9\xf2\xe6\xef\xd1\x94\x65\xd4\xd8\x14\xad\x00\x32\x54\x36\x27\x79\x74\x6d\x0b\xe1\x36\xac\x10\xd8\xb7\x57\x61\x23\xfc\x7f\xa1\x6e\x0e\x27\xcf\xba\x10\x46\xc8\x24\x9d\xc2\xf9\x3f\xeb\x78\x08\x27\x80\xe6\x61\x65\xec\xd0\xce\xf8\x4b\xb1\x48\xc7\xd8\xea\xfc\xed\x6a\x54\x7b\x67\x11\x90\x20\x9d\xb9\x0c\x6e\xf3\xe3\x62\x99\x22\x0b\xf8\x9d\x7c\xbf\x82\xd6\xcd\x94\xdb\xc9\x67\xab\x9b\x91\x18\x10\x04\xf8\x9f\x73\xde\x76\x7b\xf9\x70\x07\x24\x8d\xd1\xb6\xf9\x98\x00\xd7\xe1\xbc\xe6\xce\x88\x94\x58\xc9\x29\xc1\x81\xe7\xe7\x87\x35\x24\x63\x60\x46\xe7\x1a\x5f\x7d\x8c\xf1\x94\x7e\x60\x4a\x93\xcc\xa7\xda\x7f\x56\x33\x9a\xc4\x8c\x65\x91\x2b\xfe\x38\xb3\xb4\x7e\xb1\x6b\x28\xdb\xc6\x17\x28\x66\x43\xa9\x11\x3e\x49\xf3\x07\xc8\x53\x55\x3e\xc9\x3a\x6f\x3f\xb0\xbd\xa1\x9b\xb1\xf9\xe7\xcd\x32\x93\xa2\xe8\xf2\xe6\x98\xb7\x1e\x3a\xb1\x7e\x91\x75\x7b\x0d\xad\xcc\x8b\x4f\x61\x77\xd3\x17\xc9\xa8\x64\x6c\x10\xfa\xf7\xf9\xfa\x2e\x6a\x59\x6a\xda\xcd\x18\x8b\x53\xa3\xa6\x9a\x0b\x4f\xa3\xb4\x5c\x18\xc5\x63\x60\x3d\x95\xf2\xf6\xf1\x66\xb7\x30\x73\x4c\x24\x42\xf5\x51\xde\x5c\x1e\xaf\x1f\x44\x6c\x2f\xf1\x54\x3a\xae\xb8\xaa\xde\x57\x67\xfd\xd2\x27\x97\x18\x8f\x63\x16\xa0\x0a\x55\xbb\x6a\x6e\xf2\x77\x30\x8f\x55\xee\x08\x29\xe5\x11\x2e\xe6\x8e\x33\xa7\xec\x90\xeb\x6a\xda\x4b\x9c\x31\x0e\x02\x4b\xf4\x4f\xdf\xff\x79\xff\x10\x5a\x35\x32\x26\x84\x8a\x7d\x44\xf8\xa3\xf4\xec\x0f\x66\x55\x8f\x9d\x0a\x26\x8c\x41\x89\xe1\xa1\x70\xb1\xaf\xbe\x57\x27\xb0\xe7\x62\x6b\x66\x79\x25\xa6\xb4\xa1\x72\x0c\x52\x98\x39\x0f\x53\x27\x82\x69\x42\x83\x83\xee\x5d\x6b\xef\x76\xde\x54\x75\xa8\xd5\xcf\x26\x58\x73\x8e\x79\x61\x7d\xae\xff\xcf\x59\x0e\x29\x26\x66\x88\x51\x1e\x93\x7c\x7f\x3e\xba\x28\x62\x96\x81\x63\x26\x1b\xaf\xdc\x1d\xa6\x30\x5d\x32\x7e\x79\x13\x67\x86\xa7\xb8\x47\xff\x2f\x3c\xcb\x7a\x99\x60\x71\xa1\x5e\xc0\x8c\x50\xa8\xc3\x7e\xb7\xbd\x47\xb6\x66\xc7\x54\x17\xee\x14\xa2\x0c\xd9\x54\xa5\x31\x2e\xf0\xed\xae\x7b\x3d\x9b\x49\x88\x2d\xf7\xf2\x66\x81\x6a\x3c\x1c\xc9\x34\xb2\x1c\x1c\x65\xab\x5f\x5c\x5b\x5a\x38\x62\x33\x64\xed\xf2\x6f\xd2\xa9\xc5\xcc\xb1\xcc\xfd\x58\x16\x39\xce\xc2\xa2\xd8\x5d\xb4\x4e\x7e\xb9\x79\x33\x2b\x1c\x85\x86\x6b\x45\xec\x3e\xe6\x71\xf2\x27\x0c\xd2\xdc\x23\x01\xda\x27\x47\x07\x88\xcc\x5b\x3d\xac\x79\x72\x49\x1e\xb1\x04\x5b\x63\x4d\xde\x74\xee\xde\x61\xe4\x0e\xf2\x48\x03\x4f\x7b\x2d\x57\xe4\x29\x96\x79\xf9\x60\x97\xad\x2d\x8f\x23\xc7\xa7\x6d\x5c\x52\x63\xdd\xf9\xd3\x2d\xd4\xb2\x08\xca\x62\x0f\x16\x25\x4e\x9b\xcb\x6e\x91\x45\xf3\xc0\xe3\xc8\x89\xd3\x35\x85\x7c\x03\x57\xe8\x7e\x9c\xec\x34\x3c\xe6\x2c\x0b\x85\xee\x43\x55\xba\x56\xe2\xcd\x7f\x7e\x74\xce\x69\x3f\x46\x3b\x35\x41\x9f\x4d\x68\x1e\xea\x1b\x99\x17\x18\xbe\x3c\x3c\x5c\xf5\xa3\x6c\x86\xdb\xf9\xb0\x67\x05\x8a\xe2\xf3\x1c\x37\x3d\x2f\x7d\xf1\x44\x59\xd4\xd4\x71\xab\xfb\x1a\x0a\x78\x96\x2d\xfc\x3e\xd0\x0d\xfb\x71\x24\xce\x30\x52\x5d\xed\xff\x9a\xd9\x3f\xe3\x84\x30\xfc\xfe\x47\x77\x54\x1a\x47\x82\x39\xee\xa7\xcc\x38\x91\x31\xf6\xb0\x55\x5e\x4e\x17\xbb\x0a\xfa\x94\x0c\x27\x2a\x81\xfe\x2d\xfe\x31\x16\xef\x5f\x15\x21\xda\xe6\x69\x22\xb0\xc9\xea\xdc\x40\x8d\x20\xc8\x6e\x61\x05\x2b\xfa\x89\xff\xce\x19\xa8\x20\x00\x80\x66\x7b\xf2\xf2\xb8\x15\x98\xa9\xf3\xea\x46\xab\x67\x28\xdb\xdd\x1c\xa9\xc0\x45\x62\x31\x3f\x1d\xc2\xc8\xab\x8f\x4f\x16\x97\x90\x36\xc0\x70\x7d\x8f\xce\xef\x67\x53\x35\x2e\x31\x7e\x41\xbe\xd7\xbf\x1a\x49\x63\xe3\x38\x09\xaa\xda\xa0\x8c\xc1\xbe\xda\x9a\x2e\x7c\xb3\xf9\x8c\x7a\x68\xb8\x75\x49\xb5\xa4\x21\xe5\x5d\xd5\x1f\x9b\xf7\x53\x1e\xa0\x39\x71\x12\x06\x41\x86\xf0\x01\x47\xcd\x3c\xad\xf7\xf9\x21\x2a\x93\x24\x1b\xcb\xb6\xef\x70\x73\x1a\x89\xc2\xf0\x7f\x25\x03\xb9\xfe\xe4\x3f\xfb\x4b\xe8\x88\x8e\xa0\x31\x7f\x59\x7a\xee\xcf\x33\xd2\x31\x7a\x60\xf8\xfd\x47\xcf\x77\x9c\x71\xc5\x33\x9f\xe4\xec\x6e\x1c\xb7\xd2\x05\x53\xca\x75\xe4\x1c\x02\x97\xf7\x6f\xcf\x0d\xe6\x39\x51\xa0\xc1\x04\x62\xd1\x7e\xa8\x6b\xe1\xf1\xd2\xb4\xdd\xc3\xce\xac\x1e\xd7\x89\xc4\xa4\x61\xe7\x53\xe4\x41\x49\x2b\xe3\x3a\xb5\x58\x58\xff\x12\x6b\x36\x5b\x09\x3a\x33\x98\x35\x68\x2a\xdb\xcb\x6f\x85\xeb\x19\x62\xb0\x54\xf7\x58\xc8\x8f\xef\xb2\x28\xc6\xc9\x6a\x6e\x64\xaa\x52\x0f\xe5\x09\x8d\x1c\xe1\x90\xc9\x30\x8b\x10\x22\xd1\xc1\x30\x5f\x86\xa2\x1c\x68\x84\xed\x31\x98\xd8\x99\x20\x2e\xb8\xa5\x0a\x37\x8f\x6f\xf9\x1b\x84\xe2\x98\x73\xff\x7d\x68\x30\x7b\x16\x6b\x52\x6c\xf8\xc4\x60\x2a\x1e\xb5\x1e\xbb\xe3\x22\x8e\x58\xe6\x77\xac\x75\x85\x96\x73\x86\x7c\x1d\x6f\xd1\x22\x4e\x49\xe2\xdb\xd0\x87\x22\x9f\xe8\x0c\x39\xed\x99\x04\xfb\x42\x5b\xb7\xd3\x7f\xca\x20\x1c\x4e\x05\x91\xc4\xfd\x52\xf1\x8a\xb2\xfe\x18\x01\x93\x78\xe5\x97\xed\xfa\x21\x7e\x1c\x81\x2e\x45\xaa\x1c\x41\x83\x43\x29\xed\x7f\x85\x4c\xbf\xa0\x19\x51\x7c\x6c\xd3\xf2\xaa\xf4\x4b\x2a\x8c\xd0\x02\x9b\x4e\x1c\xcc\xd8\x45\x38\x23\x56\xc3\x4c\x50\xa0\x89\xbe\x34\xf9\xd8\x94\x8b\x45\x67\x3f\x8e\x11\x40\x66\xe1\xf5\xf6\xe6\x69\xfd\xb0\xbd\x1f\x29\xef\x66\x82\x09\xc1\x03\x14\x61\x5f\xad\xe6\xe8\x24\xc1\xe3\xcc\xc9\x46\x14\x67\x0d\x7b\xe8\x4c\x61\xfe\x25\xe8\x4f\xf0\x24\xc3\x46\xc5\x20\x8f\x38\x94\x37\x04\xcf\x12\x3b\x64\x13\x02\x9d\xfa\xfc\x17\xa5\xab\x5f\x7b\xe9\xfe\xba\x3a\x56\x3b\x00\x33\x4e\xc5\x8d\x0b\x33\x7f\x83\x4c\x6a\x6a\x11\x84\x88\x0c\xc2\x58\xf1\x93\xb8\x39\x17\x16\xdb\xe0\x87\xaa\x49\x67\x7e\xc2\xc6\xc6\xff\x3d\x3f\x59\xd3\xc0\x64\xf9\x2c\x8f\xa0\x65\x8d\x46\x08\x39\xf5\x43\xf0\x3e\x3d\x43\x26\x1c\x71\xf7\x3f\xee\x6f\x1f\xd6\xbf\x1f\x1e\x37\x4f\xdb\x87\x90\x9a\x16\x2a\xd1\x48\x70\xd5\x13\x65\x3c\x0d\xe0\x9c\xa9\xe1\x10\x2a\x8b\x31\x70\x3f\x60\xdf\x61\x32\xf6\x4f\x84\xca\x28\x82\x11\x1e\xf7\xb7\xfd\x9f\x34\x0d\x20\x04\xdc\xc6\xdc\xee\xe0\x0f\xea\x28\xc3\x83\xd7\x9b\x9f\x87\xfd\xea\xcf\xc3\xf5\xf6\xe7\x76\xf7\xf0\xd4\x1f\x4e\x04\x38\x78\x1b\x7a\xd1\xa8\xbb\xdb\xbb\xb9\x42\x8b\x0c\x53\x3b\x87\x6e\xcd\xfc\x01\xea\x5b\x6e\xdb\xcf\xa9\x4f\x33\xa1\x01\xc0\x11\xb1\xbb\x4d\xd4\xed\xd9\x23\xc2\x9c\x4c\x98\x58\xa3\x41\x82\xf6\xe5\x60\x5c\xcb\xdc\xa1\x0c\xf4\x24\x99\x30\x84\xe8\x38\x70\xd5\x74\x36\x78\xe6\x55\x0b\x50\x22\xf3\xc4\x10\x6f\x79\x01\xcf\x70\xd9\x3f\x37\x09\x03\xa6\x2b\xd6\x1a\x83\x7a\xb8\x4d\xe7\xc9\xae\xab\xe3\xf1\x5c\xe6\x1e\x46\xd2\xcf\x98\x05\x8b\xf9\xf9\x2e\x64\x2e\xa6\x50\x10\x19\x47\x3d\x41\xf2\xfa\x25\x2f\x66\x65\x65\x19\x8b\x48\x3b\x91\x9c\x5c\x23\x6f\xb9\x74\xdb\x08\x2a\x39\xbd\x41\xde\x5f\x27\x49\x62\x74\xf5\x4f\xdd\x9a\x47\x32\xa8\x1f\x83\x3d\x90\x24\x72\x92\xfd\x27\x97\xd3\x1d\xe5\x6d\x24\x89\x63\xdc\x5e\xaf\x1d\xeb\x5c\xff\xe7\x54\x6a\xd9\x6b\x3d\xdf\xc9\xfa\xb9\x4f\x1c\x48\xa2\x64\x1a\x02\x40\xa8\xdb\xce\x45\x1b\xcf\x89\x4c\x93\x88\xc7\x01\x21\x9d\x6b\xd8\xb5\x70\x22\xd3\x59\x97\x29\x01\xe9\xe3\x9d\xb6\x19\x38\x5f\xa7\xa6\x53\x66\x11\x25\xd4\x63\x0e\xba\x5d\xd1\xc5\x04\x17\xd4\xed\xc1\x51\x91\x59\x62\xdc\xf7\x7f\xee\xa2\x31\x9f\xe0\x0c\xc7\x38\x41\xd4\xd7\xa1\x86\x95\x4b\x55\xe7\xd6\xe6\xfa\x5c\xcc\x08\x05\x33\x49\x75\x96\xba\xe5\x5f\x76\x8e\x37\x8a\x40\xfb\x43\x8c\x3a\x7e\x7c\x05\xcf\x79\x89\xda\x4a\xd3\x53\x19\x8f\x50\x0c\xed\x1a\xd6\xc5\x59\xfd\x25\xca\x59\x72\x6a\xb0\xd6\xb0\xd9\x7f\x3f\xfc\xd8\x5d\x1f\x36\x7f\xae\xbf\xaf\xee\xbf\x6d\x0e\xeb\xcd\xfd\x7e\x17\x7e\x95\x03\xb5\xbe\xa2\x75\x0f\xbf\x36\x26\x9f\xf3\x41\x66\x52\x98\x34\x0b\xeb\xa8\xc8\x87\x50\x34\x5c\x42\x25\x4e\x2c\x13\xf1\x26\xdd\x2b\xdd\xe5\xff\x9d\xdf\xbc\xca\x12\x2c\x67\xdf\x6d\xf7\x17\x14\xd6\x5f\x86\x54\x52\x09\xa7\x8a\x22\x8d\xb9\x46\x49\xf9\xf5\x4b\xf7\xe3\xb7\xf9\x40\xe7\xbe\xc4\x49\x9a\x49\xa5\x49\x3c\xb4\x0d\x6f\xd7\x0f\x0b\x15\x0e\xa9\x13\xe1\xe5\xb5\x4b\x84\x03\x0d\x10\xcd\xd9\xd5\x34\x24\xb2\x07\xa1\xa0\xbf\x39\x7c\x02\x86\x59\x6c\xce\x7b\x28\x71\x3d\xf6\x7f\x16\x31\xf6\x64\xb9\x1d\x03\xf1\x21\xe1\x88\xd5\xe8\x85\xec\xb0\x9d\xe4\x2e\x2f\xa1\x6e\xfe\x74\x2a\xfa\xd3\x5f\x05\x95\x06\x11\x7f\x9f\xb1\x9e\x3f\xf3\x85\xf7\x23\xc1\x32\x74\x95\x30\xa8\xc4\xd6\xdb\x4b\xee\xa6\xc9\xaf\xa8\x28\x73\xd9\x3d\x57\x4e\xf0\x19\x94\xc9\x1a\x50\x71\xe4\x58\xfa\xb7\xf7\xdb\xfd\x76\x75\x7b\x78\x7c\xda\xae\x37\x87\xed\xfd\xfa\x69\x73\xb7\xe9\x03\x78\x15\x0b\x27\xe3\x9e\x97\x97\x71\xaf\x8a\x65\xc4\x7c\xf1\xfc\xdb\xc3\x23\xe6\x4e\xe7\x6b\x4d\x25\xc2\xf0\x41\x8b\x0c\xea\x11\x09\x7a\xa6\x12\xa9\x11\x5c\x37\xd3\xee\x19\xab\x59\x66\x8a\xc4\x12\x13\x85\xa7\xd9\x32\x0b\x87\x55\x86\xd9\x42\xc7\x7b\xd3\x4d\xbd\x99\x94\x46\x15\x51\x16\x3d\xa0\xbe\x41\xbb\xae\x8e\x5f\xf7\x88\x66\x8a\x80\x31\x43\x56\x6d\x5f\xcb\x7c\xbe\x15\xa8\x2c\x76\x64\x72\xce\x1b\x5b\x58\x8a\x2a\xa3\x6c\x44\x1f\xe6\x98\xfa\x16\xbd\x3e\x95\x51\xa7\x79\x21\xdf\xa0\x96\xcf\xb0\xd3\xb5\x3c\x8d\x2b\xae\x8a\x92\x14\xeb\x4c\x3e\xdd\x71\x9d\x37\xaa\xf3\x4d\x8f\x43\x60\xae\x68\xaa\xb0\xe0\xde\x20\x5d\x52\x80\x3b\xdc\x57\x9f\xd1\x14\x64\x8a\x4a\xe0\x5e\x40\x75\xb7\xba\xdd\xec\xf6\x3d\xb3\x49\xa6\x58\x92\x60\xcb\xda\xee\xdb\x7e\x36\xdf\x2c\x53\xcc\x49\x4b\xd5\xa3\xfa\xda\x20\xf2\x91\x29\xde\x7d\xab\x2e\x35\x7b\x07\x26\x97\x97\x5d\xa9\x4b\xc4\x8e\x99\xe2\x9c\xba\x9a\xd9\x90\x28\x6c\xfa\x6b\x0a\x8d\x38\x8d\x55\x5e\x5f\xd7\xd5\x69\x1c\x65\x28\x11\xb9\xc6\x14\xd7\xdb\x53\xe4\x25\xe4\x83\x15\x56\x32\x72\xac\x20\xcf\x9d\xaf\xe3\xda\x5b\x67\x4f\x24\x23\x8b\x29\x0d\x64\x40\x9c\xc3\x39\x67\x43\x13\x83\x86\xe1\x98\x97\x9d\xef\x30\x79\x47\x12\x62\xcc\x30\x82\xac\x8b\x8f\x60\x13\x9d\xab\xbd\xea\xdf\x92\xe2\x80\x02\x28\x07\x25\xcd\x33\xfc\x28\x7d\xa2\x7f\xba\x70\xb4\x86\x80\x30\xbf\x99\x50\x15\xfa\xe3\x26\x75\xec\x07\x27\x67\x41\xfa\xc4\x83\x32\xcc\x49\x86\xf4\x14\xe6\x8f\x85\x6c\x6d\x55\x1f\xfb\x01\xca\xe9\xca\xfa\xfe\x25\x47\xe5\xdb\x1f\x63\x8e\xe3\x14\xeb\xf1\x21\xef\xd3\xbf\x01\xa3\x63\x84\x0c\xf9\x0c\xd7\x6f\x7d\x6b\xcb\x70\xdf\xc6\x68\x9c\x81\xeb\x6f\x7f\x5e\xd4\x5d\x66\x13\x09\x71\x82\x89\x0c\xbc\xd3\x24\xfc\x06\x64\x04\xf3\xce\xaf\xb9\x7e\xc5\x78\x71\xbb\x7e\x58\x76\xf6\x74\x44\x33\x84\xd4\x1c\xf3\x72\xd7\xca\xd7\xbc\x7c\x9e\xf4\x41\xe9\x38\x4a\x52\xcf\x12\xba\xed\xa1\x75\x3a\x89\x32\xd4\x3d\x2f\x64\xd3\x1e\x6a\x59\x9a\xea\xd8\x1f\x4a\x15\x62\xa5\x6d\x55\xe4\xd5\x78\x7d\x69\x12\x8d\xd2\x39\xd7\x55\x39\x2c\x4b\x9d\x72\x4b\xba\x49\xb9\xfb\xe7\xf5\x66\xbd\xbd\x5b\x05\xaf\x58\x67\x91\x45\xa3\xe5\xda\xed\x1f\x5f\xa0\xac\x8e\x50\x56\xb3\x14\xaf\xce\xd2\x34\x73\xea\xc0\x79\xd3\x36\xcb\xed\x61\x3a\xd3\x10\x39\xeb\xe0\xc1\x57\x0f\xa5\x53\x1a\x0e\xc7\x4d\x8a\xd6\xa3\xcd\x0b\x18\xcb\x88\x05\x4f\x47\xd3\xc4\x20\x70\xe4\x6e\xf5\xe7\xc1\x8b\xeb\xad\xb6\x4f\xd7\x4f\x0f\x8f\xbb\xc3\xd5\xc3\x8f\xfb\xfd\x36\x88\xb1\x66\x9a\x45\x12\x37\x1b\xd4\x86\xa8\x56\x35\xc8\x49\x89\x4d\x33\xee\xb8\x76\xa5\x31\x78\x13\x9f\x14\xd8\x34\xd3\x26\x66\x93\x7c\xb7\x03\x1a\xfa\x2f\xd0\x8f\xe2\xa9\x63\x70\xd4\xd5\xf1\x38\x5a\x6c\x5a\x90\x08\xab\x3b\x58\xb8\x84\x05\xb4\x8c\x16\xc4\x58\xc7\xca\xfd\x4b\xd6\x0e\x96\x37\xad\xcb\x85\x71\x59\x46\xb8\xef\xa4\x3f\xb9\xe2\xde\xd8\xe8\x68\xc1\x12\xa4\x20\xf8\x47\xe5\x7c\xb4\x55\xe3\x8b\x51\x93\xc8\xcf\x0f\x96\x99\xd6\x9e\x54\xc7\x60\x59\x69\x9f\x17\xc5\x66\xff\x7d\xd5\x34\x03\xea\x5e\x4b\x91\x11\x13\x28\x95\xbd\xc1\x5a\xce\x7b\x69\x29\x13\x9a\xf4\xa2\xaa\xfd\x05\xa4\x0c\xd5\xd8\xbb\x8f\xf5\x4b\xae\x47\x8b\x51\x25\x4a\xfb\x4c\xd9\x55\x5d\xbd\x42\x2f\x86\xb1\xfc\x03\x8a\x50\x6a\xfa\xe0\xfe\x2e\x7f\xae\x2f\xaa\x3d\x5a\xa5\x36\x71\x0a\x7a\x95\x75\x16\x50\x76\x0e\xcc\x34\xf8\xd0\x2a\x53\xda\x3b\x8d\x2e\x3b\x37\x0a\x0c\xb4\xa2\x04\x3d\xc6\xbc\xd9\xb6\x5b\x5d\xf5\x7f\x16\x1c\xb1\xd6\x2e\x7b\xee\x45\x95\xcd\x25\xb0\x56\x2b\x43\x11\x39\x65\x73\xdb\xbe\xec\x41\x1e\x07\xcc\x5f\x7f\x2d\x70\xb0\x9c\x36\xc0\x34\xab\xba\x1d\xb1\x86\x74\x03\x14\xba\xdb\xd7\x5b\xfc\x12\x77\xa3\xbf\xb3\xde\x6b\xab\xea\x66\xf6\x5c\x9a\xa4\xe8\xba\xb9\xb6\xc6\x53\x51\x7d\x80\x13\xce\x18\x46\x18\x95\xea\x41\x93\xa2\x39\x9d\xcd\x68\x83\xd1\xda\x12\x8c\x60\xdc\x36\x7f\xb0\x55\xdd\xad\xc8\x61\xa5\x6a\x4b\xd1\x19\xfb\x7d\xf3\x10\xfe\x64\xb4\xc4\xae\x80\x2e\x06\xac\xca\x41\x7f\x27\x1c\x86\x14\x5f\x88\x73\x12\x91\x67\x76\xe8\x73\x5f\xe9\x09\x4d\xc1\x28\xfb\xa9\x81\xb9\xb6\x14\x03\x6f\x67\x28\xde\x60\x53\xea\x33\x34\xad\x34\xd5\x0c\x8a\xa6\x41\xa5\x0a\x77\x98\xb3\x3a\xe6\xed\x48\x90\x24\xd3\x36\x8b\x31\xa5\xd5\xf4\xb4\x6b\xce\x65\x5b\x2c\x6b\x69\x2b\x38\xc6\xdc\x1b\x73\x5e\x17\xd5\xd9\xf4\x57\x91\x19\xd2\x4f\xa1\x15\xcf\xcb\xe7\xf1\x4e\x69\xa2\x28\x4a\xe3\x49\x9d\x6d\xdc\x20\x62\xa2\x34\x42\xb6\xe0\xdf\xf7\x11\x5b\xca\x02\x5d\x66\xee\x4d\xa4\x52\x64\xd7\x3b\xe6\xe5\xcd\x19\xa9\x87\xbf\x55\xfd\xd2\x31\x71\xe4\x0c\xa4\x8b\x4f\x7f\x7a\xa8\xa9\x17\x47\xef\x07\x19\xc9\xd3\x31\xc8\x72\x99\xde\xc0\x90\xc8\x38\x96\xef\x12\x25\x2d\x0e\xbf\x43\x15\x56\x8a\x21\xd2\x89\x4f\xbb\x94\xb9\xeb\xde\x99\xdc\x27\x51\x4e\xd5\xc1\xe9\xe5\xca\xba\x96\x1f\x48\xd0\x3b\xfb\x09\xa5\x4d\x60\x41\xfd\x2e\x6b\xa3\x83\x96\x65\x66\x88\x89\xb0\xe3\x21\x38\xc3\xf3\xce\x0d\x93\x2a\x83\x4e\xd4\x6d\x55\xbd\xae\xda\x75\x10\x5a\xbd\x81\x7e\x3d\x9b\x4c\x30\x54\x53\xec\xc9\xe7\xc6\x7c\x8f\x61\x0c\x48\xdb\xcb\x38\x1f\x4e\x55\x3e\x18\x67\xc3\x28\x50\xbf\x42\xd6\xd5\xf1\xd4\xc2\x21\x61\xd3\xc7\x64\xdc\x60\x4a\x71\xab\x2b\xcc\x52\x0e\x02\x10\xb3\x27\xe5\x44\x61\x7d\x46\xf6\x4a\x16\x87\xee\xaa\xb2\x36\x8f\x50\xbf\xee\xe1\x7d\x1e\x1e\x85\xf3\x32\x87\x45\xf5\xbc\xe6\xa7\x73\x31\x4e\xe2\x1a\x2e\xdd\xf2\xde\x9d\x72\x3d\xa1\x21\x31\xdc\x68\xe4\x9e\x57\xd0\xae\x4a\x73\x53\xe4\xfd\xc4\x71\x4b\x65\x36\x6a\x67\xbd\xa9\xea\xef\x79\x33\x42\x11\x19\x11\xc7\xa8\x3c\x83\x0e\x5e\xff\xd1\x5e\x75\xd1\xfd\xc8\x16\x1a\x91\x00\x0c\x24\xb1\x37\x00\x33\x01\x9c\xe9\x0c\x08\xce\x95\xe7\x64\x76\xfd\xc5\x9f\x37\x5d\x85\x33\x84\x3b\xa3\x77\x07\xae\x02\x2e\x6d\x36\xb9\xc2\x64\xb8\x89\xbe\xe4\xcf\x2f\x21\x17\xb6\x83\xa2\x18\x7f\x1a\x02\x34\x27\x43\x83\xe9\xd5\xf9\xa3\x5b\x15\x9b\xfd\xf7\xd9\xb5\xa4\xce\x70\xdd\x5d\x57\xfa\xdc\xbd\x47\xc7\x1c\xb8\xbc\xe9\x18\x95\x1a\xd3\xd9\xa1\xff\xeb\xf0\x3b\x57\xe3\xe4\x82\x51\xd4\xd1\xb2\x8c\x98\xeb\x1d\xcd\xd1\x23\x92\xb5\x3f\x0f\x03\x21\xca\x3c\xdc\xe7\xba\x2a\xf1\xfd\xfa\x5a\x5c\x33\x01\x2f\x1b\xad\x25\x66\x3c\x4e\x55\xd3\xde\x41\xd3\xc8\xe7\xcb\x36\xa3\xc9\xea\x31\x11\x0c\xaa\xd5\x98\x1f\x1c\x2b\x9a\x8f\xea\x8c\xc6\xa4\x0e\x72\xfb\x04\x08\xcd\x0e\xb7\x66\x8c\x63\x83\x77\x99\x88\xbb\xfc\x7d\x83\x6e\xde\xa8\x0d\xd9\x58\x65\x31\x1c\x43\x8d\xcb\xca\x9c\x07\x0d\xfa\xaf\xc8\xc7\xc2\xc9\xda\xf2\xa0\xa1\x39\xef\xd3\x81\x28\x21\x6a\xe8\x9c\x46\x7f\x6a\x9a\xbf\x81\x88\xba\x0f\x5c\xd6\xf0\xe4\x9a\x7d\x3c\x01\xea\x25\xc8\x0d\x22\xcd\x5d\x1b\x5d\xd5\xfc\x15\x15\x98\x3f\x23\x8e\x79\xec\x30\x9c\x26\x08\x4d\xce\x22\x2a\x88\x49\x86\x3d\xbb\x4e\x53\xeb\xd0\xbb\x4b\xbf\x2d\x58\xf0\xc9\xab\x81\x98\x46\x94\x4c\xf5\x8e\xe7\xd7\x56\x19\x7a\xe3\xc8\xfd\xff\x08\x75\x78\xe3\xe1\xb0\xa6\x58\x84\xc0\xe4\x75\x78\xa2\x87\xa7\xdd\x67\x48\x28\x20\x31\x43\x70\x95\xc3\xbc\x15\x32\x3f\xfa\x32\xf4\xa5\x96\xd2\xfc\x4c\x12\x39\x9e\xe2\x40\x88\xee\x10\x3f\xcb\x28\x52\x20\x4c\x25\x2e\x6e\x2e\x06\x11\x9b\xd9\xb3\x11\x43\x70\xd1\x60\xe6\x68\x84\x1b\x5e\xee\xc9\x01\x62\x18\x66\xb3\x65\xd3\x05\xfd\x8e\x43\xf4\x92\x82\x71\x7a\xd3\x69\x6c\xa4\xaf\x2b\x3c\x61\xfc\xe3\x76\xf7\xe9\xa0\x2c\x49\x91\x49\xb4\xce\x9f\x5f\x5a\x3e\x3b\x48\x13\x81\x26\xb4\xf3\x49\x6a\x99\x37\x79\xf9\x7c\x0d\x45\xdf\x55\x03\x34\xcb\x42\xc6\xc7\xb5\x1b\x5c\x55\x4d\xf3\x87\x2c\x4b\xb9\xae\x3f\x2e\xa8\xd9\x33\xa0\x9a\x44\x7d\x78\x35\x66\x11\xcf\x80\xda\x2c\xee\x0b\x69\xd7\x30\x90\x34\xf9\xe3\x2c\x8b\x53\x2f\x65\x27\x03\x45\x42\x7f\x4c\x8b\x9e\x05\x11\xd1\x14\x47\x87\x23\x43\x70\xed\x20\x0c\x37\x7d\x36\x06\x44\xdb\xa1\x88\xbb\x2a\x8a\xa1\x13\x1d\xb8\x48\xd0\x56\x06\x15\x83\x49\x95\x0c\xb8\x25\xc8\xc8\x5b\x54\xcf\x3f\xb6\x8b\x29\x47\x90\x09\x15\x9d\xeb\xb0\xd3\x79\xd3\x0c\x51\x24\x48\xab\x30\x87\xbc\xca\x5f\x75\x95\x4f\x91\xfd\x60\xc0\x89\x51\x7a\x8c\xc7\x0e\x74\x0d\xc8\xe6\xb8\xe0\x01\x02\x70\x89\x7b\xc3\xaf\xbc\x2c\xf3\xf2\xb9\xf3\xa4\x77\x7d\x26\x0d\x00\xb4\xd2\x7e\x8b\x6b\xf2\xaa\xbc\xfa\xf8\x5f\xa8\x83\x1f\x0b\x56\xb8\x2d\xff\xf6\xe1\xdb\xa1\x84\x5f\xbb\x53\x5e\x36\x7d\x30\x70\xc1\xeb\xbd\x68\xf9\x6d\xc4\x2d\x96\x6c\x0c\x68\xf9\x01\x4e\xdd\xf7\xc1\xee\x7f\xe5\x6d\x0b\xf5\x1c\xc5\x65\x23\x9b\x22\x83\x44\x9f\x65\x73\xf9\x39\x80\xa7\x85\x4e\xd1\xfe\x1c\x93\xf8\xcc\x7c\xe7\xa7\x2d\x3b\x69\x36\xa1\x09\xf2\xba\x8e\x89\xa7\x82\x51\xb7\x09\x8f\xd5\xd0\x5a\xe8\xaa\x0e\xd0\x5e\xb4\x04\x5b\x22\x24\xda\x22\x93\xbf\xfd\xe6\x29\x3c\xc6\xbd\x4b\x96\x18\x99\xf9\x86\x98\x2e\x66\xf4\x18\xbe\x49\x98\x6a\x89\x4d\xd0\x31\xfd\xbf\x15\xf2\xb5\x84\xfe\xd5\xe9\x33\xa5\x04\x8c\xaf\x6f\xdc\xc1\xb1\xb9\x48\xb6\xdb\x54\xb3\xc8\xcb\xe6\x06\xde\xe8\x25\xd9\xad\xcc\x66\x5a\x05\x98\x26\xd2\xb9\x60\xd1\x79\xdf\x37\xf5\x8f\x21\xa1\xe1\x0c\xd0\xbe\x7e\xd1\xae\x5f\x40\x9e\xa0\x41\xf7\xeb\x0f\x14\x2a\x9f\x0e\xa5\x8c\x60\x31\xef\xb6\x7a\xfb\x9a\x7d\x36\xb3\x8c\x78\xae\x98\x60\x80\x83\x55\xba\x1a\x48\x07\x2c\xe7\x19\xba\x09\x6b\xd9\xbc\x3c\x9c\xc7\x22\x67\x99\x15\x54\x61\xfe\x11\xfb\x3e\x27\x1f\x84\x15\xca\x3a\x05\xc6\x87\x7b\xec\xa3\x3f\x3c\x6d\xbe\x6d\x77\xfb\xa7\x7f\xf6\x03\x6c\x8c\xdb\xfb\xc5\xf6\xb8\xbc\x66\x65\xe4\xe4\xc0\xf3\x06\xbf\x86\xf0\x40\xe3\x6d\xc9\xca\x4c\xc2\x10\xe3\xed\x5e\xe4\x09\x76\x2f\xb9\x6d\x47\x3d\x4a\x28\x57\xba\xb0\xa5\x59\xc9\x1d\x6d\xc6\xc1\x76\x96\x27\x60\x41\xa7\x53\x2b\x4d\x84\x60\x42\x94\xff\xee\xee\x35\xd8\x06\xab\x52\x27\x6f\xff\xf8\xf0\x47\xe0\xa7\xcf\xac\xa2\x34\x90\x2c\x7f\x87\xba\xda\xb6\x70\x9c\x59\x32\xab\x33\x96\xc9\x51\x9a\xd6\xbf\xfe\x89\xe7\x64\x75\x66\x31\xa6\xfe\xbe\x7d\xfc\x1e\x88\xaf\x33\xab\x99\x88\x5c\x44\xdc\xff\xc5\x13\x18\x63\x69\x4d\xce\x39\xf1\x33\xab\xc1\x44\xb1\x17\x26\x70\xab\xec\x11\x59\x5f\xc3\xf9\x26\x76\xf4\xa7\x4f\x1b\x94\xad\xde\x6f\xef\x36\x87\x9b\xa7\x55\xcf\xd4\x64\x8d\x8c\xd1\x0b\x29\x2b\xd4\xb0\x58\x5e\x54\x46\x31\xf4\xbf\xef\xb6\xf7\x07\x7c\xf9\xdb\xab\x1f\xc8\xa2\x30\x40\x6d\x2c\x28\x47\xc0\xe1\x12\x09\x83\x57\x6e\x2d\xe5\x88\x61\xd9\xf6\xa2\xce\xcb\xea\xbf\x99\xb5\x4a\x5e\x74\x85\xba\x6e\x6b\x1c\x40\xa3\x28\x52\x32\x19\xf5\x2a\x38\xef\x3b\x04\x9e\x93\xf7\x40\xa3\xd8\xc4\x68\x73\xd1\xd7\x44\xc5\x88\x21\xe7\x4a\xa3\x44\xb9\xba\xd1\xa1\x1d\xd3\x4f\x7e\xaa\x2a\xd6\x53\x60\xfd\xcf\xf4\x47\x48\x24\x89\x8b\x5d\x4f\x55\xdd\x4e\x62\x7d\x1a\x11\xa9\xc1\x29\x09\x3e\xc1\xf3\x58\xbd\x6a\x81\x21\x84\x46\xc4\x32\x2c\x6b\x38\x42\x3c\xd0\x05\x3a\x91\xdd\x5e\x7f\x93\x97\x79\x00\xea\xd3\x28\x4d\x2d\xc6\x99\x28\xe2\x6c\xf2\xb7\x7e\x76\x52\xea\x28\xb2\x64\xd3\x78\x66\x23\xd7\xbf\x6f\x2e\xb6\x90\xe9\x0f\xa7\x8a\x51\x9f\xf4\xda\x3c\x3f\x37\xbb\xbc\xd4\xd8\xf5\xf0\x7d\xac\x98\x36\x3f\xc7\xa6\x98\xdb\xbf\xf9\xb1\xff\xf1\xb4\x39\x5c\x77\x66\xa0\x5b\x14\x9b\xb1\xd4\x37\x8d\xb2\x04\x2c\x9d\xe4\x22\x77\x55\xf1\x36\xb3\x6f\x34\xca\x14\xc1\x4d\xe3\x34\xc8\x62\xcf\x46\x50\x2a\xd1\x50\x57\x63\xc1\xd7\x29\x6b\xd0\x68\x3b\xa6\x11\x95\xb1\x97\xda\xc5\xf7\xe2\xff\xca\x22\x86\xf0\xc8\x4b\x8a\x2a\x1a\x31\x12\xa1\xa5\xd7\x55\xf9\x5c\xcb\xd6\xc7\xb5\x37\x75\x75\xbc\xaf\x82\xea\x27\x8d\x38\xd5\x2c\x1a\xd8\x28\x7f\x42\xdd\xcc\xbb\x24\x69\x24\x22\xc2\xf4\x88\x3b\xa8\x56\xf9\xbc\x19\x6a\xba\x50\x44\xac\x91\xdc\xdd\x19\xeb\xab\x8f\xce\x03\x28\x3f\x81\xec\xd1\x48\x10\x85\x0b\xbb\x91\x16\x90\x9c\xfa\xb8\xd0\x94\x1b\xc6\xa6\x1a\x09\x0c\x50\x6d\xb9\xa9\x0a\x1f\x8e\x2c\x30\x29\xd1\x48\x64\x5c\x66\x53\x84\xfa\x6c\x41\x0b\x8f\x29\x0f\x86\x6d\x97\x5f\x68\x08\xd3\x48\x66\x49\xe2\xf3\xff\x01\x0c\x1b\xe4\xfd\xc0\xcc\x9b\xa4\xce\x23\x86\xae\x0b\x59\xee\xfe\x82\xce\x27\xee\x16\xd1\xea\x93\xf5\x28\x79\x8c\xb9\xa1\x73\xd9\xeb\x7a\xe1\x45\x78\x38\xae\x2c\x3e\xdb\xc6\xab\x92\x5c\x90\xb9\xd2\x48\x45\x8e\x4b\xf0\x24\x3f\xf6\xd5\x03\xb2\x56\x7f\x32\xa9\x8a\x5b\x44\xde\x7d\x83\x76\xf3\x26\x8b\xf3\xdc\x67\x0a\x3f\xaa\x2c\xcf\x06\xac\xac\x73\x83\xf7\xd5\x5e\xbe\xc2\xaa\x79\x9a\x67\x7e\x68\xa4\x93\x24\x4e\x03\x2d\x4e\x91\x9b\x4b\x3c\x1e\x8d\x34\x91\x48\x34\xb1\xd5\xf2\x34\x7f\x49\x5f\x22\x8c\x69\x64\x08\xc7\xf2\xa1\x0a\xfc\x51\x3f\x1a\xe4\x21\xbc\x60\xeb\xf7\xe3\x81\x72\x6c\xf4\xbb\x92\xff\xad\x51\x5a\x76\x94\xce\xa1\x11\x08\x9a\x46\x7e\xab\xff\xd4\x74\x4e\x6f\x00\x24\x45\x94\xcc\xb1\xef\xf6\x9e\x44\xcf\x34\x02\x23\x9d\x3a\xc1\xb9\x3e\x15\x5e\x73\xbe\xb7\x6e\x96\x13\xd7\xc5\x5f\xb6\x50\x3b\x7a\x90\xc3\x33\x38\x75\xea\x35\xfe\xcf\x51\xa6\x93\xc6\x91\x70\xc9\x0e\x97\xce\x86\x5f\xe1\xef\x71\x2c\x55\x12\xda\x9c\x76\xf0\xc9\x77\x13\xc7\x24\x45\x5a\x26\x97\xa6\x5d\x9d\x4e\x45\xd0\xf7\x98\x4c\x52\x1c\x0b\x19\x0d\xba\x3a\x37\x00\xdd\x8e\x38\xbd\x54\x12\x5b\x24\x65\xb2\xe1\x16\x48\x4a\x48\x7a\x09\xef\x9d\x7e\x6b\x31\x51\x12\x25\x58\x42\x21\x31\xb4\xcf\x2f\xae\xff\x38\x8d\x45\xe6\x25\x50\xee\xe5\x71\x90\x5e\xa3\x71\x6a\x52\xd7\xbb\x75\x82\xd2\xac\x6b\x30\xf9\x25\xb1\x74\x18\x6a\x9d\x94\xb0\x23\xf7\x7d\xb0\x2e\x49\xfe\x58\x83\xcd\xdf\x17\xb3\xd0\x34\xa6\x31\x45\x7b\x68\xaa\xf2\x15\x3e\x9e\x64\xf9\x7a\xb1\x11\xc7\x34\x8b\x90\xd8\xd4\x80\x95\xe7\xa2\x1d\xd8\x21\x68\x4c\xa9\xc0\xb0\xbb\xf3\xa5\xa0\x19\x2f\xb0\x98\x72\x08\x2c\xd6\x7b\x84\xaa\x56\x65\x3e\x6b\x5e\xa4\x31\x63\x19\xde\xf1\x55\x51\xbd\x7e\xab\xcf\xa7\x70\x32\xb3\x3a\x26\xa1\x10\xa4\x65\x6d\x26\x6b\x83\x47\x09\x6e\x5e\x25\xfc\x5a\x07\xb8\xf2\x6f\x97\x61\x3e\x8d\x39\x13\xe0\x05\xcd\x7f\xcf\xdb\x76\xb9\x21\x32\xc9\xe8\xbf\xb2\x7f\x87\x33\x78\x8a\x05\x24\xc7\x94\xea\x53\x40\x9f\x4c\x37\x97\x19\x52\x3a\x5f\x6f\x7e\x6e\x6e\x1f\x1e\xef\x36\xf7\xfb\xc3\x7e\xb3\xba\x3b\xac\x57\x8f\xe1\x56\x45\x26\xd0\xbf\x2b\xcf\xc7\x55\x39\xe2\x99\xa7\xb1\x50\x92\x59\x87\x49\x1a\xbd\x6d\x49\x12\xc7\x09\x8e\x65\xcd\x71\x6e\x98\xc6\x52\xc6\x48\xa8\x2f\x8d\x23\xb2\xf5\x90\xd3\x49\x9b\x01\x8d\xa5\x4e\x98\xf7\x70\x57\xa7\xfc\xea\x63\x6b\xbc\x92\xe6\xf5\x47\x29\x8f\x23\xbd\x2d\x3f\x5e\x25\x1a\xd1\xf4\x0d\x0a\xe1\x60\x82\x7f\xda\x18\x44\x63\x95\x26\x88\x5d\x84\xff\x9c\x65\x81\xa5\x8d\x7d\x85\xff\xfc\x36\x97\xc7\xa1\xb1\x32\x4e\x1e\xe7\xea\xc7\x3f\x0f\x57\xab\xf5\xef\x4e\x17\x32\x5c\x49\x47\x3c\x1b\x33\x75\x0d\xaf\x6f\xd1\xe6\xc5\x3a\x4d\x8c\xe9\xa3\xb2\xc0\x06\xd8\xa7\xee\xfd\x0d\x24\x51\x18\xae\x22\xd4\x3c\x51\xe7\xba\x7c\x44\x45\xc4\xc1\x91\xa5\xb1\x01\x86\x21\x36\xe6\x66\x08\x99\xcd\x03\x08\x8a\xf8\x02\xdf\xab\xdc\xa4\xf3\xe3\xd2\x89\xba\x22\xdf\x81\x8b\x0a\xe6\xfe\xe0\x65\x62\x72\x41\x22\xf8\xe2\xff\x4e\x05\x0a\x68\x0c\x26\xc6\x90\xc1\xca\x3a\x48\x8c\x4e\xee\x24\x89\x22\x0a\xfe\x0d\xbb\x7e\x67\x9f\x59\xde\x9a\x2b\x68\x7f\x01\x20\xa4\xa4\xc1\x2d\xa8\x73\x7f\x96\x2d\x64\x12\x45\x2c\x54\x25\xaf\x5c\x0c\x1f\x0e\x30\x65\x1c\xa8\xc3\xa0\x46\xe8\x28\x72\xa7\x49\xc4\x33\x11\xbb\x4d\xb6\xa7\x27\x1d\x26\x22\x0c\xb2\x34\x76\xba\x5d\x55\x0d\x4e\x91\xef\x3c\x41\x94\xcf\x6f\xc5\xba\x04\x5f\x67\xfc\xe0\x1d\xa5\x37\x2e\xae\x68\x52\x19\x34\x2d\xb6\xeb\x87\xbf\xb7\x63\x25\xb1\x70\x3c\x72\xce\xba\xa3\x79\x1a\xd1\x48\xd2\x24\x56\xd4\xb1\x60\xe5\x25\x12\x43\x3d\x7b\x87\x3d\x1c\x27\x89\xc0\x02\xe8\x7f\xdb\xe1\x2f\x12\x61\x2c\x27\x6f\xd5\x87\x4f\x37\x21\x96\x72\x16\xb0\x7f\x6f\x50\xce\x72\x83\x34\x49\x33\xc1\x74\x1f\x0a\xef\x03\xd2\xc4\x71\xb2\x7c\xd6\xb3\x38\xb6\x00\x49\xaa\x12\x04\x57\x39\xee\xce\xc3\xf5\xc3\xdd\x6a\x7b\x7f\xd8\x6d\x1e\x57\x4f\xab\xfd\xc3\xd3\x61\xb7\xfe\xbe\xb9\x5b\x1d\xbe\xaf\x76\xdf\xc3\x5d\xa5\xda\x49\xe0\x23\x84\x0c\x8e\x55\xb9\x29\xa1\x7e\xfe\x98\xcd\x6f\x06\x8e\xca\xf2\x54\x5d\xca\xb1\x4f\x77\x8c\x84\x71\xcb\xa9\xf7\xd4\x7a\x09\xb1\x70\x4c\x08\x4c\x21\x3f\xca\xff\x9c\x65\x9d\x7b\x1e\x9f\xce\xfc\x27\x7f\x59\x8a\xa4\x09\x27\xa9\x09\x54\x73\x0f\x48\x49\x36\xc3\xc4\xd1\x84\xf3\x88\xb8\x6a\x25\x96\xe3\x9f\x36\xc1\xd0\x26\x82\x38\x96\xec\xda\x0b\x35\x76\x2b\xff\x8f\xdd\x32\xb6\xb8\x7f\x16\x91\xa9\x6c\xa0\xb5\xfd\x26\x0b\xe9\x25\x61\xf9\x74\x7b\x4e\xa4\x14\x48\xe5\x7e\xfd\xf0\x6d\x82\xc9\x0a\x87\x2d\x41\xa5\x4e\xf7\xd3\x30\xa9\x93\xe3\xd1\x60\xc4\xd6\x85\x6c\x9a\x9f\x39\xfc\xba\xcc\x1d\xd3\x44\x09\x8b\x79\x50\x8b\xe1\x22\x52\x61\xac\xc2\x35\x94\x76\x5d\xfe\xc7\xbc\x6c\xaf\xaa\x6a\x22\x7c\x3b\x32\x22\x0b\x76\x25\xf1\x9b\x61\xa2\x23\xc5\x92\xb1\x2c\xa1\x43\x48\x8d\x35\xf5\x68\xa2\x09\xc5\xea\xb3\xaf\xc5\x07\xb3\xec\x33\xf8\x9f\x78\xf8\x89\x91\x14\xd9\x00\xf6\xf3\xa4\x95\x7b\x8d\x79\x55\x2e\x2e\x72\x7f\xb6\xf5\xb4\x18\xdf\xbf\xed\x1e\xd6\xdb\xd5\xed\x17\x50\xde\x6e\xb0\xe3\xa5\xec\xfc\xbf\xfc\x08\x63\xe6\xe8\xf9\x65\x21\x4b\x43\x6b\xf8\xfa\x05\xf4\xeb\x4e\xbe\x81\xde\xb4\x2f\x53\xaf\x95\x44\x09\x8b\x7d\x51\xb6\xbb\x9a\x9c\x45\x38\x83\xf3\x4e\x22\x1d\x27\x36\x14\x50\x7c\x84\x11\x0e\x19\xc1\xfc\x45\x56\x6d\x75\xbc\x85\xb7\x29\x6c\x2f\x0c\x03\x10\x2e\x4b\xfe\x06\xb2\x18\xe7\xa2\xe7\x0b\xf5\x93\x66\x97\x65\x43\x47\x22\xb0\x81\x19\xf2\xfe\x7c\x7c\xb0\xb8\x43\xee\x5a\xf0\x0e\x57\xf8\xf9\x98\xa6\x21\xfb\xb5\x93\x85\xf4\x12\x65\x0e\xe8\x3f\x22\x2d\xe8\x06\x42\xc6\x03\x2d\xf4\xb3\x7b\x85\x6e\xd7\x9b\x7e\x90\x24\x49\xc1\x7a\x40\xbc\x39\xeb\x8b\x20\x84\x24\x99\x53\x56\x43\x35\xbe\xcd\x1b\xd4\x1f\x55\xd9\x4f\x5a\x22\x12\x6c\xf3\x28\xc0\xb6\x24\x9a\x7e\x0d\x24\x51\x16\x49\xc9\xce\x25\xd6\x74\xee\x86\xb3\xac\xc6\x5e\xc3\xbb\x5c\xbf\xe4\xcf\xb2\x7c\x6b\x6e\xab\x8f\xaa\x90\xe1\x78\x9a\x09\xec\x70\x2c\xaa\x67\xc7\xd6\xd8\x78\xba\x46\x83\xdd\x5e\x66\x18\x67\xb0\xda\xfc\x13\x30\xfb\x74\x27\xf5\x4b\x3e\xdc\x5b\xca\x49\xe2\xa8\x25\x65\xed\x90\x3d\xba\x0d\x54\x71\x7e\x48\xc6\x22\x1d\x05\x40\x57\x55\xcb\xe7\x45\xea\x58\x4a\x32\x9b\x9a\xb1\xd3\x73\x9b\xab\x5a\x86\x1e\xbd\x8b\xb1\x19\x2e\x10\x0c\x8b\xac\x9c\xd4\xe0\x29\xa1\xc4\xe5\xdf\xe1\x5c\x57\xd8\x4f\x9f\xfc\x82\x7c\x36\x6f\x4c\xa9\xc4\x09\xa0\x84\xaf\x71\xa2\x74\xbd\xd0\x00\x40\x09\x8f\x15\x3a\x78\x5a\x96\x9e\x3a\x69\x12\xbb\x75\x81\x27\xb2\x2c\xdc\x54\x75\x7b\x1e\xe6\x88\xab\x24\xd3\xbe\x49\xcd\x4b\x81\x86\x43\x92\x1a\xe6\x3b\x2a\xda\x3c\x94\x28\xa6\x94\x54\x4b\x79\x1f\xa2\xa8\xc0\x8d\xfe\x6e\x7b\x87\x4d\xd1\x93\x6c\xa5\xeb\x90\x3e\x74\xfb\xbf\x1f\xae\x23\x07\x07\x3a\x34\xd0\xde\xca\x67\xdf\xf5\x35\xda\x62\xe2\xe9\xf7\xa7\x53\x81\xca\x84\x0e\x5c\x78\xf0\x95\xa1\xe6\xb7\xd1\x47\xae\x29\x68\xc7\x50\x6b\xf6\xd5\x8c\xb1\x61\x72\x29\xa0\x32\xb0\x16\xb8\x9a\xd1\x63\x17\x9c\x5d\xb2\x6e\x51\x62\x52\xce\xf8\x58\x02\x65\xe4\x63\x10\x93\x49\xcc\xe5\xbf\x75\xb1\xd5\x40\x9f\xd6\x1f\xb6\xae\x1a\x7e\xa8\x5d\x6f\xea\x4f\x24\x00\xb8\x54\xbf\x1c\x73\xbb\x50\x02\xc4\x64\x48\xdb\x02\xf5\x11\x3b\x49\x17\x49\x06\x28\x01\x6a\xb0\xb7\x7e\x7b\x7f\xfd\xd0\xb3\x4c\x51\x02\x2c\x85\xd0\x10\x72\x6e\xc1\xc9\xef\x4c\x7f\x80\x39\xe6\x55\x69\x7c\x4c\xba\xd3\x55\x3d\xef\x42\x08\x63\x55\x86\x3d\x88\xb2\x69\xa0\x6e\x37\xff\xf1\x84\xb3\x7e\x33\x09\xf3\x09\xd6\x89\x9f\x94\x00\xe6\x09\x6c\xb7\xfb\x8d\xc0\x14\x33\x7b\x67\xa9\x4c\x13\xcf\xc6\x74\x03\xd0\xdc\x9f\x8f\xde\x5f\x08\x03\x64\x8c\x35\xcc\x3f\xff\xf9\xbf\x93\x2f\xc8\x2a\xd3\x17\x6d\xfc\x94\x38\x12\x49\x5c\xbd\x5d\xb4\x34\x0d\xe3\x89\x55\x80\x35\x5b\x07\x00\xd0\x6d\xf4\x7e\x0f\xed\xaf\xaa\x7e\xfd\xbc\xed\x93\x12\x6b\xb9\x72\x22\x6b\xb9\xcf\xd8\x5d\x0a\x39\x4d\x9f\x28\x8d\x18\xb8\x1e\x9c\x40\x7b\x84\x45\xe9\x66\x5b\xee\x5f\x60\xe6\x4e\xce\xcf\x14\x11\xee\x73\x57\xd7\xab\x81\x77\x84\xa6\x91\x4a\x31\xf2\xdc\xf9\x86\xe7\xd9\x49\xd6\x75\x26\x06\x56\x12\xa4\x92\x7a\x38\xb7\xa7\x73\x7b\x09\xc8\xa7\x69\x4c\x18\x75\x0c\xa8\x9d\x95\x77\xc5\xe9\xe6\x5b\x55\x79\x80\xc6\x67\x34\x51\x34\x8d\x8d\x83\xf8\x61\x89\xda\x15\xf8\x5c\x5d\xa0\x2a\xc2\x17\x90\x26\x24\xc1\xd6\xb0\xb7\x1c\x7e\xad\xfb\x2a\xee\xaa\x34\xa1\x2e\x30\x7c\x9d\x69\x92\x51\x07\x49\xac\xf2\xf2\xa2\x22\x4e\xd3\x84\x27\x36\xf1\xe4\x34\x5f\x68\xb1\x76\x03\x53\x84\x1f\x1f\x3c\x51\x47\x39\xcb\xfd\xa7\xc4\x67\x20\x9a\x13\xd4\xc7\xa2\xaa\xcd\x13\xfc\x27\xdc\x70\x6a\x85\xf5\x58\x70\x87\x5f\xf5\xd0\xdc\xe9\x4f\x64\x49\x84\x6f\x74\x8b\xe0\xf8\x73\xd9\x5e\x12\x32\x85\x91\x24\x75\xe9\xe3\xbb\x8b\x5e\xfb\xf1\x87\x94\x66\x5c\xb9\xca\x41\x17\xf5\x79\xe2\xb0\xa1\x7d\x80\xa6\x94\x65\xae\x6d\x12\x7c\xb5\x6c\xd5\x1f\x51\xae\x4a\x84\xbe\x5f\xee\x60\x48\x63\x1a\xdc\xd9\x0d\x51\xe5\x0a\x1f\xb7\xd5\xf3\x1f\x43\x26\x9b\xf7\x47\x5d\xa3\xdd\x49\x4e\x1f\x28\x4e\xf8\x34\x66\xf0\xe3\x59\x24\x83\x12\x0c\x5a\x12\x47\x31\x35\x9b\x2d\x46\x13\xc7\xb1\x8f\x90\xba\xe9\x5b\xe5\x44\x39\x12\x2a\x54\xe1\x39\x17\x6d\xbe\xc8\x57\x41\x53\x9e\x3a\x08\x36\x76\x3b\x93\x3f\x47\x7d\xbe\x34\xe5\x2c\xa1\xe3\x1e\xc7\xcd\x3b\xe8\x01\xce\x43\x53\xce\x33\x2c\x66\x2a\x59\xce\xb4\x0d\x26\xef\x80\x4b\x86\x5e\x83\xe7\x19\x34\x00\xc7\x95\xd6\x70\x6a\x3f\x4b\x13\x75\x3b\x0e\xf5\x12\x1b\x01\x91\x84\x04\x03\x0b\x1e\x66\x2a\xa8\x76\x24\x40\x79\x01\x4d\x5b\x95\x70\xd8\xea\xca\xb3\x49\xda\xf3\x04\x12\x49\x53\xa1\x15\xf6\x15\x9c\xee\x3d\x0b\xef\x40\x14\x32\x2b\x56\xd3\x54\x18\xea\xda\x2f\xba\xd9\xbb\xcb\x3f\xf3\xc5\x53\x49\xc0\xf8\xde\x9c\xc7\xaa\x28\x96\xd9\x14\x68\x2a\xa9\x89\xfd\xe6\x77\x28\xe1\xbd\x3d\x60\xcd\xea\x60\x7c\x26\xe2\x60\xeb\xea\xd8\xff\xaf\xe5\xd4\x63\x2a\x41\x60\xcf\x43\x00\x2c\xad\x5d\x5f\xfd\x27\x37\xa6\x12\xc5\xa1\x47\xa2\xce\x64\x7e\xfc\x18\x9d\x24\xca\xe7\x11\x02\x66\xe5\x1b\x94\x73\x5b\xa6\x13\x6d\xf4\xa8\xcf\xcd\x81\x79\x3c\xf8\x60\xa1\x0c\x90\x6a\x0e\x98\xc9\xfd\xf5\x22\xdb\x3f\x64\xb3\x7f\x81\x9f\x01\x06\x48\x53\x2d\x2d\x26\xfd\xa5\x31\x3f\x11\x18\xf3\xb7\xd8\x87\x68\x6a\x12\x8a\x11\xf7\x76\xfd\x70\x58\xaf\x1e\xe3\x70\x3d\xc3\x98\xe8\x13\x90\xcd\x55\x75\x7e\x7e\x99\xd5\x79\x52\x23\x9d\xbe\x3c\x94\xe6\xaa\xaa\xeb\xea\xd7\xea\xb9\x06\x57\x44\xfa\x42\xa9\x8e\xa6\x40\xa2\x98\x87\xa5\x8b\xc0\xa3\xef\xb2\x34\x73\xfe\x03\x9a\xda\x84\xdb\xb1\xbe\xca\x84\xf8\x95\xa6\x36\xf3\xca\x1a\x55\x69\xe4\x2e\x2f\x7a\xcf\x3b\xb5\x5d\x1c\x84\x50\x47\x07\x3a\xec\x69\x38\x97\x5f\xa9\x95\xa0\x78\x48\x98\xa0\xa3\x8e\x66\x72\xc6\xa8\x48\xb3\x28\xd2\x08\x8b\xf2\xfd\x33\x35\x6a\xd6\x87\x63\x09\xd7\x1e\x49\xe2\xd4\xa8\xb6\x65\x7f\x48\xa6\x4c\x4f\x01\x71\x9f\x95\xe4\xb2\x44\x70\xb4\xd5\xab\xeb\x9f\xdb\xdd\xe6\xe9\xb0\xdb\xaf\x7e\xdf\x84\x0b\x25\x2a\xc5\xda\xd3\x8f\xeb\x55\xff\x27\x1d\x21\xed\xec\x8b\x6c\x02\x36\x7f\xd5\x7a\x80\xa0\x0b\xed\x17\x1f\x39\x4b\x34\xc3\xc6\x55\x8f\x1e\xaf\x25\xd2\x2d\x4c\xbe\x8b\x8c\x24\x06\x77\x97\xe6\xac\x10\x56\xb1\x7c\xc7\x44\xaa\xd8\x87\x72\xc3\xae\xe1\x8f\xa5\x40\x13\x3f\x61\xe7\x23\x84\x6e\x49\x7f\x30\xe3\x91\xed\x35\xe0\x11\x45\xfe\xd1\x99\xc2\xed\xf5\xec\x36\x32\x63\xb0\x32\x82\x49\xbc\xed\xd7\x7d\x93\x34\xa3\x44\xa5\x93\x2e\x79\x4f\x8f\x11\x7e\x95\xa6\x99\x13\x6a\x2a\x64\x7e\xdc\xb4\x2f\x37\xf3\xd4\x4e\x46\x15\x63\xa6\xd7\x48\x71\x4a\x1c\xe3\x64\x7e\xc6\x62\x82\xdd\x00\xef\x27\xb9\x79\x77\x19\xbd\x70\x75\x11\x3b\xb5\x9f\xab\x87\xfb\xd0\x8f\x43\x33\x61\x38\x78\xbb\x1b\xc6\xdf\x54\xf5\xf1\x5c\xcc\x9c\x86\x4c\x12\x69\xc7\xd2\x36\x57\xdd\xae\x31\x9d\x0c\xc9\x5d\x87\xf4\xe1\x98\x97\xed\x4d\xde\xbc\xfc\x55\xf2\xc5\x3b\xb7\xc1\x5f\xce\xa4\xa5\x98\x54\xed\xb5\xdb\xcf\xa5\x69\x56\xa5\x79\x94\x1f\x4f\xd5\x87\x2c\x2e\xd3\xbc\x99\x22\x8e\xf6\xbb\xf7\x08\xb7\x4d\x73\x86\x6f\x55\x61\x02\xb5\xf2\x04\xe5\xd0\x6f\x22\x99\xca\x8c\x20\x81\x23\xf1\xbd\xdb\x14\xbe\xe0\xdd\xa3\x99\x16\x49\x34\x96\x12\xf5\x41\xd4\x5f\x64\x58\xff\xea\xdf\x70\x71\x63\xf0\xa5\x5d\x8d\x60\xdc\x4b\x40\x8c\x4c\x5b\x57\x14\xdf\x1c\xf3\x51\x32\x3a\x33\x22\xc2\x55\xf8\xab\x05\xfd\xd2\xff\x51\xbb\xa4\xc2\xae\x95\xa5\x09\x3d\x4c\x7f\xd4\xf2\x74\x9a\xdb\xb2\xcc\x46\x04\xe7\x22\x08\xf9\xfd\xb5\x1c\xca\xfc\xdf\xd9\xf5\x2c\x60\xaa\x1a\xda\x97\xbb\xde\xd7\xa6\x51\x92\x62\x15\xed\x45\x36\x2f\x2e\x37\x1b\xb0\xb5\x93\x65\x44\x23\x12\x53\x97\x3d\xfe\xa8\xef\xe5\x11\x9a\xc3\x22\xe4\x95\xd2\x28\x63\x98\xab\xab\xa1\x94\x47\xd8\x9f\x8b\xfc\xf4\xd9\x48\x95\x51\xbf\x61\x77\xfe\xf0\x21\x99\xf8\x08\x34\x66\x3a\xe1\x3e\x40\x76\x15\x91\x91\x37\x4d\x93\x0c\x52\x9f\xed\x3b\xca\xb6\x57\x42\x9e\xbc\x19\x9a\x30\x83\xcd\xae\xed\x4b\x5e\x9b\x43\xff\x81\xa3\x97\xde\xab\x4b\x51\x4a\x68\x1c\xd8\x2c\x6e\xab\xb6\xad\x7a\xaa\x6c\x1e\x06\x30\xa7\x6c\x70\x70\x3d\x4d\x2e\x88\x58\x5e\x93\x94\x70\xe9\x78\xc1\x4e\x79\xf9\xdb\xf4\x88\x4c\x21\xc8\x82\xec\xab\xdb\xea\x57\xa8\x9f\xc7\x7e\x40\x96\x1a\x34\xb1\x35\x46\xd9\x8f\x97\x88\x94\xbf\xb7\x72\x69\xc6\x38\xc6\xe5\x87\xbc\xe9\xe2\xa7\x95\x6e\xcf\xf3\xf2\x25\xcd\x98\xeb\xc2\xfe\x52\xf2\xd1\x8f\xa5\x24\x89\xc6\xf8\xec\x9b\xba\x3a\x6e\x1a\x5d\x57\xbf\x96\x41\x25\x94\xc5\x11\x72\x43\xb8\x06\xb4\x1f\x63\xc8\x54\x73\xa8\xca\xe2\xe3\x70\x0d\x6f\xbf\xf5\x83\x29\x16\x52\xbf\xed\x77\xe3\x78\x97\x32\xcf\x8f\x79\x38\x9c\x26\x5d\xd4\x23\xff\x9c\x72\x96\x62\x12\x45\x62\xd8\x75\x46\xde\x83\x06\x33\xa6\x33\xe5\x91\xf1\x04\x06\xb3\x4c\x45\x42\x51\xc5\xfe\xe6\xc7\x97\xc1\x0b\x15\x9c\xa1\x39\x3e\x25\x27\xf4\x53\x67\x5f\x2a\x15\x22\xc3\x10\xe5\x54\xc8\x8f\xdd\x47\xd3\xc2\x71\x91\xad\x82\x52\x15\x65\xc2\x33\x79\xed\xa0\x34\x0b\xbd\x8b\x94\xaa\x04\x30\x3d\xb1\xae\x4a\x2c\xe1\x86\xe9\x50\x86\xa0\x3a\xcb\xdd\xc7\x63\xfe\xdf\xff\xca\xc7\x7c\x92\x5f\xa3\x3a\x89\x91\xb5\xf4\x70\x42\xcd\x98\xf0\x57\x1d\xe3\xd7\xfd\xcf\xe4\x1f\xfd\x9f\x20\x49\xf9\xd0\xa0\x3e\x2c\xe5\x60\xf0\xa9\xb6\x71\x24\x3c\x1e\xba\xee\x2f\x65\x98\x32\xd2\xa3\x2e\xce\xa7\x69\xce\x8c\x1a\x9e\x20\xe4\xe1\xba\xce\xdf\xe0\xa5\x2a\x72\x3d\xb9\x39\xab\x53\xdc\x83\x7c\xaa\xd5\xec\xf2\xce\x19\x5a\xcb\x53\x33\x8c\x70\x02\x2d\xad\xcb\xe7\xf6\x74\xec\x8d\xd3\xab\xf7\xc3\x58\xa4\x8c\xf5\x98\xa2\xcd\xd3\x9a\x31\x36\x7d\x13\x2c\xd2\x1a\x5d\x5a\x8f\xac\x7b\x55\x55\xf1\x58\x9c\xdb\x4a\xd7\x72\xe6\x8a\xb2\x38\x61\x30\x4e\x23\x84\xbe\x94\xf0\x53\x31\x63\xa0\x3c\x77\x91\xe7\x50\x5c\x2c\xf4\xb2\x58\x51\x4c\xc2\x23\x91\xc1\x53\x75\x6e\x47\x62\x3f\x73\x3c\xcc\x78\xf1\xb2\x18\x92\xac\x47\x0a\xec\xeb\x6e\x36\xa6\x57\x4e\xb8\x8a\xd3\xbe\xdd\xf5\xf1\xcf\xdb\x65\xd7\x8c\x25\x8a\x80\xeb\x7c\x2a\x70\x07\xda\xb4\x1a\x93\x22\xe1\x51\x12\x2d\xb2\x5e\x5c\x4f\x57\x79\x9f\x1d\x65\xc4\xf3\x9e\xed\x1f\xf6\xab\xdb\xc3\xe3\xc3\xc3\xed\x61\xfd\x70\x77\xb7\xdd\xed\xb6\x0f\xf7\xfd\x20\x4a\x10\x12\xbd\x7a\x7c\xda\x96\xd6\x81\xd3\x16\x4a\x49\x2c\x8d\x1d\x01\xc5\x56\x57\x93\xfe\x0c\xca\xd2\x34\x42\xb8\xc1\x1f\xb7\xa3\x34\x0f\x4b\x33\x81\xeb\xec\xf1\xe9\xfe\xdb\x61\x28\xa7\x87\xa3\xd4\xa2\xdb\xd5\xd3\x39\xf9\x72\xcc\x84\x32\x7c\xfa\x7d\xb1\x94\x73\x8c\xc4\xb1\xb7\xe8\x71\xd4\xbf\xd6\x1d\x12\x42\x0d\x4d\xf0\xdf\xab\x73\x3d\xbf\x7d\x11\x21\x04\xa8\x0b\xd2\x1e\xca\x47\x27\x67\xdd\x9f\x2e\xa4\xeb\x80\xf6\x04\x7a\x17\x9c\x7d\x7e\x5c\x16\x25\xda\x0b\x15\xae\x7c\x21\x71\x3e\x42\xc7\x88\x65\x47\x92\x80\x3e\xb7\xe9\x0f\xd2\xc8\x84\x82\xce\x9d\x7c\xdf\x1f\xe7\x2b\x82\x32\x27\x2d\xfb\x94\x1f\xcf\xd5\x5b\x8e\x9c\x23\xb3\xeb\x53\xa6\x9d\xc8\xed\x8b\xac\xc1\x7d\x3d\xfd\x24\x50\xae\xb0\x99\xe1\x00\xc7\xbc\xbd\x06\x47\xb8\x30\xa0\x25\x18\x03\x8b\xd0\xa3\x43\x03\xb2\xf8\xda\x6d\x66\x3c\x71\xbd\xf6\x27\x57\x83\x70\x9a\x77\xc3\x31\xa4\x54\xea\xe9\xf4\xd0\x85\xbd\xea\xa2\xdf\x0a\xa5\x32\xc3\x38\xe2\xd8\x20\xfd\xbe\xda\x0d\xb8\x78\x1e\xc1\x53\x14\xfc\xd9\x9c\x1b\xf3\x19\x51\xc3\x67\x25\xa6\xd9\x2d\x0b\x4e\x9d\x3b\x50\x3d\x75\xcf\xd7\x1d\x0b\x46\x8f\x49\x4f\x69\xfd\xec\x29\x89\x9a\x47\xa8\xb1\x92\xf1\x36\x2d\x44\x31\x45\x05\x92\x90\x42\x67\xa3\x60\x06\x9d\x62\x3a\x75\x09\x23\x0f\x82\x09\x7f\xe5\x19\x6e\x65\x7d\xc7\x63\x08\x31\xa6\x8f\x6a\x93\x08\x31\xc6\x87\x41\x91\xef\x93\x2f\xde\x5a\x86\xf5\x56\xbf\x1c\x9f\x16\xf4\xe4\x29\x8f\x63\x8d\xdf\xd7\xfd\xcf\xab\xb1\x35\xe6\x71\x66\x10\x3a\xe0\xbf\xac\xaa\x98\x40\x94\x38\x66\x09\xbb\xcf\xf2\xc7\xd3\xfa\xfb\x6a\xb7\x59\xbe\x05\x9e\x50\x65\x7d\x9d\x6d\x7b\xec\xfd\xc5\x70\x50\x3a\xf5\x91\xde\x67\xc5\x1b\xd8\xbc\xcf\xfb\xe1\x96\x42\x81\xd9\xef\x90\x54\xa0\x55\x29\xcf\xc8\xc2\xda\x67\xbd\x38\x11\x10\x24\xb9\x7e\xe4\x65\xeb\xdb\xb7\x27\xaf\x83\x13\x61\xe3\x51\x1f\xcd\x24\x8e\xf6\x43\x52\xe2\xb8\xa0\xbd\x7e\x7d\x7c\xc0\x0c\x9c\x19\x72\x93\x3c\xcd\x62\x7c\x2d\x41\xe6\xb3\x73\x48\x0f\x58\x48\x3d\x9c\xcb\xee\x95\xf6\x03\xb9\xe4\x41\xf8\x37\xd7\xed\xb9\x86\x89\x47\xcb\x53\xee\x2a\xe1\x4e\x48\x39\x4c\xcd\xb4\xa6\xcb\x29\x8d\x3d\x6c\x16\x05\xf0\x3c\x2e\xe6\x09\xa4\x19\xed\x4e\x9c\x69\x9a\xf6\x29\x41\x8c\xdd\x71\xb1\x96\xf2\x93\x24\x14\xe7\x71\x16\xf3\x00\x43\x19\x29\xc4\x87\xc3\x69\x86\xc5\xab\x1f\xe1\x07\x78\xe6\x3e\xcd\x47\x59\x37\xa0\x3f\x65\xf6\xf8\x9f\xd9\x65\x98\xa3\x04\xd8\x57\xe7\x7a\x2d\x9b\x97\x49\x98\xf3\xd7\x38\x0a\x2e\x32\x01\x03\x77\xc0\xe7\x3a\x9a\x94\xcb\xd4\x51\x07\xea\xea\x78\x82\x36\x77\xc2\xfa\x23\xc0\x3e\x57\x51\x9a\x89\x90\xa2\xe9\x1c\x99\xc5\xc4\x1b\x57\x19\xc1\xbc\xeb\x63\x21\x4b\x68\x1f\xec\xc3\x85\xe6\x18\xe5\x4a\xa4\x68\x1b\xda\xaa\x5b\x68\x7c\xff\xd2\x79\xbe\xe1\x98\x62\x98\xdc\x3b\x61\xeb\x37\x4c\xbd\xd4\x65\x3b\xc4\x95\xa6\x58\xe2\x72\xca\x7c\xe7\x1a\x09\x3c\x42\xe7\xe1\x54\x64\xe9\x82\x06\x97\x72\x2d\x28\xe6\xf4\xe0\x08\xf5\x33\x94\xfa\xe3\xba\x96\xbf\xf2\xf2\xf9\xa9\x73\x23\xc2\x6d\x69\x95\x59\xd6\xcb\xba\x8c\xa0\x31\xfd\x65\x4c\x16\xe1\x3e\xe1\x9a\x6d\xa0\xfd\x5e\x9d\x1b\xd8\x98\xe7\x59\xce\x91\x1b\x19\x79\xe1\xf1\x9b\x76\x6c\x45\x80\x45\xcc\x79\x6c\x88\xa7\x4b\x26\xdf\x3f\x48\x86\x3e\xfd\x13\xb8\xa6\xbb\xd9\x35\x41\x45\x99\x4f\xe4\x8c\x1b\xfc\x9c\x73\xfe\x3f\x93\x0b\x59\x86\x64\x81\x2f\x55\x11\x00\xdc\x71\x7f\x07\xd6\x31\xeb\xed\x5a\xb3\xed\x4e\xfc\x6d\xe4\xdb\x73\x1b\xc7\xd9\x80\x9f\x72\xfd\x17\x23\x33\xce\x2d\xa4\x89\xd3\x70\xc9\x8b\x8f\xf1\xd4\x89\xc8\x46\xe8\x8a\x62\x1d\x0f\x5d\x8e\xdb\x9e\x29\x81\x8a\xd8\x23\xd8\x8c\xfc\x58\x0f\xdd\xc1\xdd\x9e\xc0\x63\x33\x00\xef\x2f\x76\xbc\xc5\x95\x20\x12\x03\x49\xe2\x9d\xcc\x55\x51\x4c\x74\xa4\xfd\x10\xa2\xe3\xc0\xdb\xe6\x8b\x57\xfb\x5c\xbf\xc2\xdc\xf3\x10\x04\x74\xe0\x81\xd8\xdd\xec\xaf\x11\x0e\x39\x86\x42\x0a\x02\x46\x04\x75\x92\xa1\x90\x35\xbd\x1f\x02\x8e\x1d\x0a\xa5\x53\x1f\xab\x2a\xe4\x8a\x45\x9a\x66\x48\x21\x8f\x3a\x6b\x07\x3a\xe2\x87\xa4\x22\x15\x09\xc2\x1d\x42\x78\xf8\x47\x55\xae\xab\xa6\x0b\x12\xc7\xfc\x77\xcb\xdf\x82\x48\x2d\x55\x8e\xba\xe0\x39\x3e\xd8\x52\xcf\x23\xca\xff\x59\x0c\xcc\xa6\xfe\x74\xfc\xc9\xb5\x69\xac\x70\x97\xc4\xa7\x15\x42\xbf\xc8\xbf\xc1\x2b\x41\x05\xcd\x8c\x74\xa0\xe1\x53\x51\x7d\xec\x5a\x38\xf5\xd2\xa0\x54\x50\x91\xb9\x0c\x73\x5d\x55\xc7\x9f\xbd\x1d\x10\x2c\x4e\x8d\xe3\x5c\x79\xcf\x8f\xe7\xe3\x5e\xd6\xcf\xc3\x92\x62\x89\x63\xaa\x08\x65\x64\xea\x3e\x16\x7f\xfb\xe1\x76\x19\x05\xe2\x3c\x5e\xe4\x43\x37\x53\x2c\x96\xe0\x4c\x39\x19\x5f\xd7\xcd\x32\x62\xcf\xa0\x42\x30\xd7\x55\xd7\x4d\x78\x90\x12\x98\xce\x85\x90\x0c\xbc\xf0\x2d\xba\xf9\x60\xf2\xf6\x40\xe2\xc9\x06\x25\x84\xe6\x91\xef\xe0\x33\xf0\x70\x1a\x17\x47\xff\x45\x06\x4b\x34\xfa\xcf\xe4\xdf\x93\x3d\x7b\x94\xcb\x13\x92\x69\xe2\x35\x9c\x57\xe5\x25\x65\xe6\x74\xf5\x4a\xa9\xb5\x4f\xa8\xf7\x7a\x6c\x2e\xe8\xfa\x7a\xf9\xa8\x88\x21\xe8\xf9\x5a\x56\x6b\xd9\xe4\xe5\x98\xc4\x89\x0a\x9d\x2a\xcc\x43\xbc\xe5\xf0\x2b\xf4\x50\x4e\xe0\x21\x42\x53\x40\x76\xbf\xc2\xd5\x9f\x7e\x55\xdf\x65\xd3\x2b\x2f\x52\xa1\x8d\x94\xe3\x44\xfc\xa4\x4c\xe5\xc7\x18\xc8\xf0\xc3\xdb\x9c\x72\x3d\xcb\xee\x0a\x48\xad\x17\x17\xb0\xe7\xd2\xfc\x11\x74\xd4\xa9\x00\x95\x71\x9f\xfb\xba\x01\x44\xfc\x21\xe9\x4b\x7f\x58\x6b\xec\x38\x50\x52\xbf\x42\xcf\x5e\x33\xcf\xb3\x0a\xd0\x36\xe1\x43\x4e\xde\xeb\xfa\xfc\x91\xb7\x2f\x8f\x9d\xbb\x33\xa6\x8c\x59\x9a\xc6\xce\xd6\x0e\xef\xcb\xa6\x14\xc3\x3c\xef\x53\xde\xe5\x65\xfb\x55\x1d\x5a\x58\xe1\x7a\x2a\xbc\xe3\xb4\xeb\x3b\x7c\xc2\x43\x58\xe0\x09\x78\x83\xd3\x59\x42\xb7\xb3\x75\xcf\x7a\x03\xc1\xd7\x9f\x5c\x52\x46\x82\x08\xdf\x21\xb1\x43\xf7\x47\xd6\x1f\x5f\x69\x1b\x51\x19\x67\x09\x66\x54\xa4\x2f\x9a\x21\xad\x89\xe3\xaf\x04\xf3\x50\xae\x51\x68\xcb\xf3\x84\x4c\x7f\x2b\xe6\x2e\x9f\xd2\xf4\x8a\xae\x79\x91\xb7\x1f\xa3\x1c\xa3\x4c\xe2\xcc\x6f\x71\xaf\x50\x3a\xcd\xab\xdf\xc2\x21\x6a\x31\xa2\xdd\x3f\xc3\x1e\xe4\xd1\xb1\xaf\x8f\x08\x66\x66\x81\x9d\x24\xca\x38\x0e\xf7\xb3\xc2\xbf\xcf\x9c\x91\xe5\x18\x4b\x12\x9b\x66\xc6\x43\x91\xd0\x31\x89\xa7\x46\x5f\xa6\xdc\xc1\x95\xd7\x4f\x0f\x7f\x5c\xdf\xfc\xb8\xbf\xde\xde\x7f\x9b\x90\x00\x53\x99\x0a\xa7\x37\x7f\xba\xc4\x46\xc8\x54\x73\x8c\xe1\x8e\xf2\xfd\xd6\x85\x71\xdb\x16\x8e\xfd\x99\xc0\x4d\x32\xd2\x6c\x5e\x92\x5a\xa5\x32\x4b\x22\xa7\x7e\xfe\x0c\x65\x7b\x27\x5f\xe1\x6f\x29\x2d\xcc\x5e\x23\xcd\x74\x1c\xf5\x49\xa9\xeb\xfc\x39\x6f\x65\xb1\xaa\xdb\x01\xa3\x2c\xa9\xb1\x4e\xa9\xb6\xaa\x9e\x0b\x18\x3a\x87\xfc\x61\x26\x5c\xc3\x93\xab\x1c\xa0\xf8\xa3\x2c\x8a\x6f\xb2\x1f\xc0\x13\xc0\x64\x9f\x3c\xb7\x95\x07\x20\x04\xad\xc3\xe5\xc9\xe7\x26\x46\x5f\xf4\xe0\x09\x3f\x5c\xc8\xb6\x3d\x9e\x8a\xd9\x0c\x08\x92\x5a\x2f\x4b\xf6\x84\x9f\xc2\x05\x14\x4a\x8a\x34\xe2\xba\x2f\x01\x7b\xfc\x74\x5d\x1d\xbf\x57\x85\x99\x50\xd6\xce\x5e\x50\x67\x5c\x48\x60\x06\xcf\x07\xe2\x61\x04\xc7\x7f\xbd\x76\x64\x1c\x21\x1f\x88\x17\x24\x7a\xf2\x15\xa2\x99\x2e\x2d\x95\x92\xe9\xcc\x37\x07\xa0\xaa\xef\x27\xb3\xa1\x08\x73\xd3\x67\xcc\x5d\x55\x4d\xf8\xd4\xa8\x54\x5a\x60\xed\x7f\x7d\xd4\x98\x5d\x99\xfd\x84\xb2\x10\x09\xdf\xdb\xf0\xa3\x34\x73\x3e\x12\x2a\x0d\x71\x22\xb2\x18\x7a\xed\x73\xec\x97\x7d\x06\xd2\x1f\x66\xae\x42\x77\x30\x15\x34\x88\xc4\xc4\x47\xfa\x2e\xdf\xe0\x16\xb3\x91\x13\x20\xb0\x34\xdc\xc4\xbd\xb2\x4c\x13\x42\x03\x77\x61\x47\x9b\x34\x09\x12\x25\x24\xcc\xb8\xd6\xf1\xf2\x08\x47\xf9\x11\xae\x03\x4a\x62\xc3\xc0\x8d\xac\xff\x9b\x0f\x9a\x87\xfd\x51\x2b\x9d\x0c\x47\xf1\x28\x7d\x23\x1a\x0f\x60\x12\x3f\xc6\x82\x40\x77\x0a\xbd\xf0\x09\xea\x56\x25\x84\x63\xab\x84\xa9\x02\x1b\x21\x55\x24\x11\xb8\x63\x9a\x59\xbf\xd5\x62\xf9\x44\x11\xce\xd0\x73\xf2\x09\x18\x67\xf4\x66\x5f\xa7\x22\x92\x62\x94\xbe\x83\xc2\xfe\x0e\x1f\x0b\x69\x3b\x95\xc6\x14\xe1\x42\x5e\xe5\x39\x20\x97\xfe\x16\x7a\x57\xa5\x99\x72\xb9\x62\xe4\xc5\x83\x3a\x0d\xcf\x92\x6a\xc0\x1e\xa1\xfb\xc7\xaf\x52\xeb\x2a\x8b\x75\x00\x8e\xcb\x62\x44\x49\x46\x55\x96\x58\xf4\xee\x11\x31\x14\x98\xe1\xc6\x6c\x1f\x54\x51\xaa\x51\x52\x5a\x1e\x51\x6c\x6c\x33\xe6\xe0\x6c\xfa\x41\x3a\xf2\x72\x04\x2e\xbf\xbb\xfb\x95\x8f\x48\x62\x56\x23\xb5\x53\xaa\x98\xe1\xd1\x58\x5c\xff\xea\xfc\x31\xc6\x16\x2b\x66\x9d\x92\xde\x37\x99\x97\xbb\xf6\x6c\xed\x52\x2d\x75\x98\x1c\x9e\x01\x02\x25\x8e\x1f\x53\x57\x4e\xf1\xcc\x22\xda\xe0\x98\x97\x79\x89\x32\xb5\xfe\x8b\xe8\x75\x45\xa9\x12\x31\xc5\xfb\xde\x41\x7b\xc0\xd8\x1e\x9a\xf6\x70\x09\x87\x53\x22\x91\x88\x2a\xdf\x55\xc7\x32\x9f\xc8\x0f\x53\x25\x88\x40\xce\xd0\x7f\x54\xaf\x50\xeb\x21\xf5\xaa\x84\x86\xd8\x73\x4b\xf4\x96\xd4\xf5\xa7\x8e\x8b\x6c\x4a\xc6\x3a\xf6\xb4\xd2\x57\xf2\x79\x55\x9a\x6f\xb9\x6d\x57\xae\xcb\x65\x66\xc8\x67\x8f\x2e\x13\x70\xd9\x41\x99\x9b\x39\xb1\x14\x55\x32\x25\xb1\xcf\x92\x5e\xe7\x35\xe8\x8b\x6e\x09\x25\xb5\x8c\xf5\x20\x8b\xd1\x24\xe1\xce\xb5\x8c\x02\x80\xed\x70\xfc\x38\x0c\x9c\x7c\x54\x69\x50\x18\xf1\x1f\xcf\xc5\x88\x28\x7f\x76\x63\x26\x35\x02\x11\x9d\x2e\xe9\xd5\xf3\xfd\x84\xc3\xcc\xc1\x1f\x6f\xab\xe7\xa9\xe0\xf0\x24\x2c\x49\xbf\x0a\xef\x95\x31\x49\x14\x7a\x82\x2a\x87\x61\x35\xc8\x89\x3b\x80\x3c\x95\x31\xdc\xa7\xf6\xb1\xd4\x37\x49\x36\x2b\x1b\x25\xda\x06\x82\xc8\x06\x6e\xe1\x0d\x8a\x1f\xa7\x61\x2f\x54\x36\x89\x30\x67\xf5\x7b\xae\x5f\xd7\xd5\x11\xeb\xce\x28\xdd\x3e\xed\x55\x98\x4e\xa9\xd5\x06\xd5\x00\xbe\xdd\xad\x27\x8b\xc4\x1a\x92\xe9\xbe\xca\xb0\x0a\x0b\x50\x47\x91\x70\x58\x39\xc7\xd3\xbc\xd5\xd5\x08\xf9\xa8\xa3\xce\x68\x07\x74\xbc\x83\x05\x4f\xf1\x8e\x3a\x16\xa0\x1c\x41\xbc\x34\x53\x36\xc1\x51\x1c\xae\x63\x60\x18\xde\x9e\x30\xff\x32\xdb\xff\x74\x12\xb3\xc4\x37\x7e\x4c\xb0\x30\xfb\xca\x7f\x51\x23\x66\x69\xaa\x13\xa5\x3d\xc7\x0b\xe8\x57\xa7\x30\x3b\xab\xfa\x68\x12\x29\xfc\xb9\xab\xed\x7e\xf7\xd7\xa1\xa0\x26\x89\xc5\xad\xdd\xc0\x31\xff\xca\x8e\x69\xc2\x99\xa3\xce\x0b\x39\xc2\x63\x5e\xb6\x87\x5f\xae\x7d\xf1\x20\x8d\x39\xf8\xdc\x6f\xfb\x71\x68\xab\x03\xa6\xed\x2a\x14\x70\x99\x3c\x2f\x31\xb4\x5f\xdd\x7e\x17\x38\xb4\x50\x1f\x97\x37\x65\x9d\x92\x0c\x85\x8c\xb1\x6a\xf6\xa3\xe9\x51\xa7\xfd\x61\xa7\x53\xfd\x52\x99\xa2\x9b\xb3\x59\xab\x84\x4e\x99\x2b\xc0\xec\xfe\x9c\xac\x08\x9d\x2a\x8e\x91\xc0\x9f\xdb\x87\xe9\xdf\xad\x24\xbe\x3a\xf1\x60\x51\xbd\xb7\xe8\x02\xce\x81\x6d\xdd\x8f\xcb\x74\x8c\x24\x6e\x70\x44\x66\xcd\x59\x53\x91\xa6\x86\x50\xb7\xaf\x96\xa3\x72\x90\x66\x60\xb0\xfe\x62\x8b\xfc\x94\x8e\xb3\x49\x9a\xc7\x04\x13\x0c\x85\x6c\x50\x17\xe3\xd7\x88\xb6\x9f\x6a\x41\x08\x17\x23\xb5\x2e\x80\xff\xa2\x58\xf9\x92\xb7\xaa\x05\x17\xc6\xfa\x7c\xd2\x34\xf1\xaa\x85\x70\xfd\x0b\xb7\xd5\xdb\xa4\xb4\xaa\x85\xd2\xe9\xd8\x0f\xde\x96\x0e\x74\xd0\xc5\x14\x9f\x13\xba\x51\x2d\x7c\x17\x8f\x82\xa6\xad\x7e\x5d\x44\x62\xd3\x1b\x53\x49\x82\xb5\xff\xea\x3c\xee\x52\xd6\x8a\x3b\xae\xdc\x90\x29\x73\x52\x2e\xcb\xb2\xaf\xe1\x14\xc5\xad\xe3\x61\x7b\xcb\x5b\xa8\x83\xe3\xd7\x5f\x11\x7a\xe9\x8e\xef\x50\x57\x83\xb8\xfb\x2c\x49\xa7\x75\x92\x20\x4d\xb1\xe7\x25\x43\xe3\x30\xde\x7e\xb5\x36\x0c\xd5\xea\x07\x4a\xc9\xb3\x7e\x75\x29\xf6\xe9\x1d\x01\x31\x18\x21\x6b\x47\x4c\x39\x69\x22\xd0\x00\x44\xb2\x71\x7e\x6b\x6b\x2e\xaa\xa7\xd3\xcb\xd9\xcc\xcd\xc9\xd5\xfe\xb6\x8b\x75\x76\xdb\x55\x28\x55\x6a\x4b\x9d\xe0\x5e\x5b\x9f\x9b\x16\x0c\x86\x22\xaa\xaa\x5e\xfb\xe3\x22\x46\x24\xed\x29\x7f\x87\xe2\xb9\xce\xfb\xbb\xb0\x9a\x51\xd7\x06\x96\x3f\xe6\xe3\x65\x69\x22\xc3\x3c\x1b\x60\x53\x15\x38\xfd\x81\xe5\x73\x66\xac\x4c\x1c\x3b\x18\x49\x59\xf5\xef\xcf\x24\xc2\x49\xb0\x38\x3b\x7f\x95\xcf\x12\x6e\x26\x51\x3c\xf5\x8d\x38\xd7\xd2\x3c\x41\xb1\xd0\xe9\x6f\x12\xad\xe4\x20\xeb\x77\x07\xad\x44\x84\xca\x7c\x96\x16\x6b\xcd\x73\xec\xaa\x49\x40\x21\x93\x5f\xd3\x56\xa7\xc7\xaa\x69\xb7\xba\x5a\x95\xa6\x0b\xc7\xc3\x3d\x93\x38\xb1\xcc\x27\x25\xff\x52\x81\x85\x1a\x42\x92\xcc\xf4\x1c\xc1\x48\x3c\x3a\x53\x39\x08\x03\x95\xc1\x80\x0a\xde\x41\xaf\x7f\xec\x36\x0f\x23\x5a\x37\x6a\x88\xb1\x68\x15\x0c\x80\x69\x66\xb4\x96\xd4\x10\x70\x79\x60\x6c\xca\x69\x65\x31\x66\x87\xea\x8e\x72\x34\x01\xd8\x2f\x87\x21\x24\xe6\x40\x24\x32\xf7\xde\x54\x35\xe4\xcf\x81\x6f\xbc\x1b\x6c\x90\x32\x38\x6f\x76\x27\x28\xdb\xf5\xb9\x69\xab\x23\xd4\xfb\x77\x7f\xd7\x37\x55\x7d\xb7\xfe\x63\x19\xd9\x62\xb2\x34\x56\x51\xcf\x5b\x87\xeb\x75\x6c\x52\x0d\x4d\x2d\x51\x7e\xd3\xdb\x83\x3c\x4e\x43\x0d\x43\x41\x4b\x57\xf2\x6f\xeb\x1c\xde\xc0\x7d\x56\xb3\x79\x62\x8a\xe0\x36\x76\x2e\x67\xdf\xae\xe1\xc4\x20\xec\xb4\x33\x51\xff\xfc\x9b\x35\x15\x23\x39\x60\x0d\x0c\x13\xfd\x0e\x16\xb3\xae\x9a\x76\x5f\x75\x01\xf2\x83\x17\xb3\x9b\xdd\x82\x22\x3a\x92\x21\xf3\x81\xe0\xbd\x4f\x5e\xbe\x62\x14\xd1\x24\xbe\xfc\x61\x02\x2b\x8d\x3f\xac\x95\xb6\x0e\x08\xd8\xfa\xd9\xf5\xe4\xb4\xbd\x27\x64\x4c\x9c\x39\x28\x78\xf7\x49\xa2\xad\x19\x75\x71\xa4\xff\xb3\xf4\x4f\x38\x93\x53\xbc\xc9\x6e\xab\xfd\x51\xe6\xff\x39\x83\xef\x07\xb9\x08\x9c\x26\xf3\x61\x24\xa8\x71\xa5\xb7\x5b\x2a\xae\x4d\xc8\x0f\x00\x9d\x66\x1e\x44\xfc\xa3\x81\xba\xfb\xff\xa5\x9c\xf7\x75\x1b\xb0\x92\x79\x45\x93\x55\xd8\xda\x67\x43\x2c\x8d\xb1\x0a\x72\x82\x1a\x5d\xb4\x01\x35\x30\x59\x33\x56\x39\x4f\x5f\x9a\xb7\x16\xe4\x71\x94\x76\x37\x16\x32\x2c\xd8\x23\x3b\x91\x2c\xae\xf3\xcb\x62\x0a\x44\x71\xa4\x7d\x7f\xad\xe7\xb9\x72\x62\x3c\x13\x63\x0d\x31\x61\xda\x7b\x52\x7d\x83\xde\xf6\x78\x2a\x10\x7c\x2d\x47\xe5\xb3\xa9\xa3\xeb\xcf\x4e\x48\xca\xb3\x00\xea\x43\x79\xde\x06\x15\x71\xd7\x2f\x32\xbc\x48\x20\xc4\xf1\x71\xdc\xc3\xaf\xff\x73\xce\xff\xfb\xdb\x82\x76\x1a\x85\x34\x96\x48\x12\x21\x1d\xdd\xa6\x4f\x18\x5e\xc8\x0a\x4e\x57\x19\xa4\x5e\xfb\x34\xc4\x2a\x3b\x28\x3e\x85\x27\x4c\x5e\x36\x64\x91\x93\x15\xbe\xca\xdb\xaa\x2c\xf2\x12\x90\xc3\x36\xdc\x72\x46\x35\x36\x0f\x76\x71\xfd\x5a\x9e\x9e\x40\xea\x97\x3e\x2b\x01\x99\x54\x84\x0f\x84\xaf\xf2\xbd\x97\xc1\x9b\xde\x5d\x26\x2d\xfa\x14\xff\xcc\x4b\x8b\xf6\xa9\xbf\x80\x8a\x14\x78\x53\x8b\x81\x46\x38\x40\xa3\x2c\xf2\x8e\x94\x83\xac\x6e\x75\x35\x72\x9d\x81\x46\x0c\x29\x2e\x6d\x5d\xfd\x17\xca\xa9\x9f\x02\x94\x13\x64\x20\xbd\xaf\xda\xee\x6d\x8f\x5d\x15\x60\x89\x21\x71\x80\x14\x79\xda\x2b\xec\xc6\xee\x9e\xb0\xe9\x47\xb1\x08\x6b\x58\x63\x47\xa6\x3f\x14\x23\xd2\xd1\x7f\xad\x83\x63\xff\x49\xb8\x37\x9d\x6d\x1e\x51\xf4\xae\xcf\x27\x67\x1a\xf1\xa7\xff\x2e\x78\x71\x39\x9a\x02\x2e\x28\xda\x76\x84\xf8\xdd\x54\xf5\x1a\xea\x36\xb7\xf9\xa4\x71\x6b\x56\x14\x9a\xd7\x88\x86\x89\xe5\xda\x11\x49\xaa\x4a\xdd\xc9\x57\x68\x36\xed\x4b\x68\x11\x58\x64\x32\x4a\xa2\xfe\xdf\x31\x72\x10\x44\xc4\x58\x36\x51\xfa\xaf\x47\x46\xf4\x93\x27\x11\xcc\x62\xad\x01\x43\xa6\xcf\x1b\x59\x40\x58\x23\xa0\x77\x68\xa7\x3c\x21\x20\x29\x45\x6d\xda\xbb\xaa\x6e\xe5\x2c\x13\x09\x92\xa5\x30\x12\xc8\x35\x3d\xcf\xc5\x7c\x3f\x05\xc9\xa4\x1a\xd6\xb6\x1c\x17\xda\xc3\x08\x91\x20\x58\xe1\x66\xb3\x39\xec\x36\xb7\x9b\xf5\xfe\x70\xb7\xfa\xf3\xf0\x73\x75\xfb\x23\xb4\x17\x80\x04\xc0\x7c\xbd\x81\x37\xbf\x93\xf9\x03\x4a\x73\x4c\xde\x74\xb6\x73\xd5\xd3\x7c\xdf\x54\xf5\x62\xeb\xe1\xd4\xbf\x03\x05\x91\xb2\x3d\x16\xb0\xdb\xc2\xbf\x49\xa4\x80\xe8\x2f\xaf\x25\xc3\xfe\x88\xef\x50\x14\xd5\xb7\xaa\x30\xb8\xd0\x62\x44\x7c\x65\x61\x90\x49\x58\xea\xe4\x32\x1d\x51\x2f\x96\x20\x70\x62\x3e\x03\x49\x80\x61\x02\xbf\xbb\x63\xa5\xf2\x22\x2f\x5f\xbb\x1d\x7c\x1a\xbc\x80\x91\x31\xa6\xfd\x4e\xe7\x9e\x76\x7a\xf2\x09\x58\xae\x90\x6a\xf7\x74\x6e\x07\x04\x9e\x8d\xb8\x04\x5f\xee\xa9\xba\x47\xc1\x52\x64\x83\x0f\xd8\x38\x4f\x66\x72\x23\x36\x12\x51\x1a\x20\x27\x08\x37\xb8\xaf\xba\xc0\x66\x52\x5f\xb1\x71\x44\x31\x60\xf1\x6f\x3b\x24\x11\x26\x93\x69\x93\x38\xc2\x14\xa4\x74\xcc\xa0\xfb\xaa\x27\x3a\xb0\xf3\x91\x69\xc6\x9d\xa3\x8b\x15\xec\xc7\xe5\xde\x27\x4b\x32\x8b\x7d\x8a\x12\x89\x70\x4b\x68\x9a\xa0\xdf\xbc\xb8\xea\x2d\xd1\x80\x4b\x61\x8a\xee\xb5\x29\x23\xb8\xc8\x6f\xab\xe7\xab\xf3\xc7\x72\xa1\x69\x76\xa5\x94\x0b\xdc\x4e\x0f\x5e\x98\xfd\x2f\x08\xe3\xa9\x4d\x15\x31\x41\x6d\x77\xff\xff\xad\x32\x61\x33\x11\x59\x1a\xd8\x11\x7c\x96\x6e\x49\x1d\xb4\x1f\xae\x30\x4d\xfe\x58\x57\xdb\xf5\xc3\x84\xc7\x9f\x5a\x0a\x9a\xf8\xc4\xd0\x94\x1d\x27\x80\x32\x2c\x4b\x89\x19\xea\x20\xdf\xce\x0b\x1a\x1f\x9f\x4c\x0e\xe3\x1c\x53\x93\x7f\xfe\xf9\xe7\x1a\xeb\xdc\xfe\xef\x9c\x32\x4c\x62\x1f\x72\x54\x62\xb6\x5f\x45\xac\x96\x4b\x15\x84\xdb\x9f\x64\xf9\xfa\x50\x06\x7c\xf0\x74\x4e\xa4\x88\x50\x93\x77\x53\x9e\x8f\xf9\x5b\xc8\xbf\x59\x29\x21\xf5\xd5\xbb\x89\x52\xe1\x72\x20\x62\xa5\x36\x28\xe6\xd3\x7d\x64\xf8\xfe\xaf\x47\x6a\xa5\xf3\x5f\x84\xc8\x90\x80\x8b\xbc\xe4\x72\xb0\xd2\xc6\xb8\xa3\xed\x7e\xde\xe6\xcf\x2f\x93\xda\xb8\x95\x56\xa0\xe7\xb3\x91\xed\x1d\x60\x64\x37\x3d\x57\xa7\x9a\xd9\x59\x6d\x66\xd9\x3e\x58\xc3\x53\x4c\x47\xf5\x66\x7f\xf3\xdc\xad\xde\x4f\x56\xbe\x51\x29\x36\x7f\xf5\x94\x22\x4f\xc8\x5e\x7c\xd1\x8f\xe4\x87\x43\xcc\x21\x09\xc4\x15\x65\x9b\x97\xcf\xbe\x62\xf0\xc9\xf0\x24\x0a\x4c\x62\x4f\x03\x7e\x3f\x1c\x64\x4e\xf1\xc0\x53\xd7\xb6\x72\x2c\x6d\x13\x2f\xa6\xb0\x2c\x08\x91\xc5\x5e\x5e\xf8\x19\xa5\x6b\xeb\xbe\x34\x61\x41\x49\xa4\xaf\xbc\x93\x55\xdd\x0b\xb5\x86\x63\xc6\x21\xf4\xba\xf7\xee\xea\xad\x5d\xe4\x7d\x93\x23\x63\xc5\x22\x66\xda\x5a\x19\x73\x9f\xd6\x70\x69\xe7\x5e\x0c\x7b\x70\x83\x58\x14\xd1\x18\x33\x93\x87\x67\x68\x77\x2f\xf9\x09\x75\x16\xc7\x17\x62\x51\xcc\xa9\xe3\xf1\xd5\xd5\xc8\x87\x67\x51\x6c\x52\xec\x0c\x9a\xf0\x5e\xb0\x28\x06\x85\x55\x97\xfb\xeb\x3d\x09\x7f\x4b\xb8\x94\x9d\x95\x78\xab\x5a\x78\x28\x5d\x35\xee\xb7\xf3\x88\x1c\x72\xe2\x43\xb0\x28\x11\x80\x3e\xf9\x55\x58\x2d\x93\xf5\xc4\x22\x92\x45\x98\x4a\x58\x57\xe7\x53\x55\xce\xb8\xf3\x16\xe4\x5f\xf9\x58\x99\x7a\xfa\x74\x04\x32\xaf\xca\x89\x5c\x7d\xdd\xf3\x3f\x9e\x55\x91\xeb\xd9\x4f\xa6\x24\xf3\x6c\x16\xed\xb7\xce\x24\xe7\x8d\x53\x87\x5e\x4a\x10\xb1\x28\x05\x0e\x3e\xab\x8f\x2c\xad\xdd\xfc\x6f\xcd\xaa\xae\xe5\x07\x96\x7f\x67\x6b\xff\x5f\xff\x5e\x26\x09\x9b\x5f\x54\xa2\xdc\xca\x21\x77\xf4\x5d\xbb\xd7\xfc\x92\x2e\x63\xfa\x74\x19\x49\x31\x30\xf5\xf6\x7c\x07\x61\x83\xef\x0e\x39\x86\x2f\x4f\x89\x0f\x75\x4f\xeb\x31\xfd\xd5\x4c\x03\xf5\xe4\x5a\xbe\xfb\x23\xc8\xc2\xcf\x06\x52\x0a\xa1\xbf\xb6\xfb\x1c\x3d\x52\x61\x6b\xe6\x17\x64\xb1\xc5\x0b\x3a\x59\x0e\x0f\x07\xbc\xfa\x70\x06\x65\xc9\x28\xb0\x88\x13\x87\xbd\x91\xbe\x43\xfa\x2a\x37\xa9\x9c\xc4\xfd\x2c\xe2\x92\x61\x90\xdb\x7d\xd8\xdf\xa1\x38\x2d\x6c\x43\xd3\xfb\xe0\xc6\x51\x61\x7b\x38\xd9\x2d\xc8\xb7\x45\x8a\x0a\x16\x49\xc2\xb3\x5e\x26\xfb\xba\x17\x14\x62\x91\xcc\x52\xcc\x9a\xaa\xf3\xc7\xcd\x6e\xdf\xff\x95\x3b\xbd\x66\x04\x28\x23\x77\x4c\xfd\x0a\xed\x44\x84\x3b\x8c\x54\x8e\x98\xc7\x09\xcf\xea\x41\x6b\xcb\x1f\x57\x92\x44\x3d\xc0\xd2\x75\x63\x5e\xcb\x56\x8e\xb9\x96\xc3\x48\xc5\xa5\x09\x50\xe1\x63\x20\xe5\x99\xcd\xbc\xb2\x1a\x31\xd2\x3e\xe0\xf0\xc4\xea\xe1\x12\xda\x26\xd8\xa8\xb0\xb9\xdf\x3d\xc1\x1b\xd4\x0d\xf4\xb9\x91\x69\x10\xd0\x8f\x77\xa5\xb7\xd0\xdd\x31\xbb\x9c\x89\x5d\x0c\x95\x37\x9d\x21\xdb\x1a\x97\x3e\x18\xb7\xc1\xb0\xc8\x68\x81\xbd\x95\xce\x45\xbe\x97\x47\x58\x22\xf8\x67\x11\xa4\xda\xfa\x79\xee\xbf\xb8\xfd\x9c\xd9\x79\xf9\x2d\x83\x25\x18\x56\xaf\x6f\x57\xdb\x3b\xcf\x11\x13\x6e\xd1\xd2\x38\xb6\xbe\x68\x1e\x7a\xa7\xfa\x63\x2c\x09\x1d\xb4\xff\x28\x1d\x1b\x88\x2b\x26\x84\xe3\x82\x60\x25\x6c\xf3\x7e\x2a\xaa\x59\x0d\x84\x45\xd6\x98\xb8\x5b\xe3\xdf\xea\x5c\x0f\x76\x9c\xc5\x49\x64\xd0\x2e\x94\xbe\x27\xbf\xdb\x36\x9a\x9e\x48\x32\x0c\xea\xbc\xce\x99\x1e\xff\xd8\x8c\x8d\xbc\xa1\x6e\xb0\x72\x92\x29\x85\xcc\x8f\xd7\x32\x2f\x3e\x6e\xab\x6a\x9a\xbf\x60\x71\x62\x44\xec\x3d\xac\x9d\x2c\xf7\xfb\x3d\xc2\x55\xa7\x63\x48\xa2\xa0\x27\x73\x6e\xda\xea\x88\x50\x85\x3b\x79\x3a\x61\x32\xe2\x3c\x23\x6d\x66\x31\xa1\xae\x3d\xd0\xd3\xe7\x0d\x14\x3e\x3b\xa8\xdf\xf2\x19\x0a\x98\xc5\x44\x3a\x76\x22\x9f\xf2\x09\x81\xfe\x62\xb3\x3e\x8b\xb3\xc8\x46\x6e\xa7\x7c\xbb\x01\x40\x9d\xdc\x70\x24\xce\x10\x55\x5a\xc2\x3b\xca\x35\x84\x3f\x73\x27\x9f\x79\x77\x33\xf2\x81\x59\x4c\x63\x81\xab\xd0\xa5\x2c\x7b\xc8\x90\x5f\x32\x9f\xb8\x7d\xb3\x05\x35\x8b\x75\x17\x23\xe0\xf0\x73\xa9\x8d\x7d\xe6\x3f\x40\xc5\x9a\x41\xba\x98\xc5\x94\x71\x2c\xef\x0c\x00\x8d\xcd\xd3\xb7\x4b\x20\xf2\xfc\xaa\x4a\xca\xde\xfe\xe0\x33\x9c\x9d\x93\xec\x8f\x33\x1a\xa3\x29\xc7\xd2\xe4\xc0\x07\xb1\xaf\x65\x5e\x86\xc4\xc2\xa2\xd4\x09\x8b\x19\x8f\x83\x9a\xc7\x13\x34\xed\xee\x7c\x44\x5c\x48\x4f\xa2\xc4\x62\xa6\x35\x06\x82\x7d\xaf\x64\x0b\x66\x5b\xfe\xac\xda\x25\x04\xc3\x92\x2b\xc2\x62\x1e\x39\xaf\xf5\x97\x2c\xdb\x6d\x7b\x57\xd5\xb0\x7f\x91\xe5\x3f\xab\xf3\x6c\x09\x72\x26\x84\xd7\xac\xc6\x1a\xc7\x25\xd7\x0c\x8b\x65\x16\x19\xe5\xb7\xa3\xe7\xaa\xbc\xc9\xe7\x0c\x08\x2c\x96\x96\xeb\x38\x64\x56\x67\xc9\x50\x16\x2b\x02\x18\x83\x35\xa5\x7c\x85\x23\x7a\xba\x3d\x79\x0b\x8b\x55\x46\x62\x6f\xd4\x42\xdb\xe6\x2e\x40\xc8\xe7\x30\xb9\x85\x06\x8b\x65\x0a\x3c\x16\x2b\xa9\x03\x43\xa5\xeb\xa2\x46\xee\x91\xc1\xe3\x89\x35\x49\x8d\xeb\xa2\x28\x3f\x7a\x89\xb3\xe9\x93\x6b\xa9\x31\x66\x47\x05\x9e\x95\x31\xfb\x6a\x10\xb8\x9b\xd9\x40\x1f\xec\xb0\x58\x1b\xc7\xcc\x83\xcc\x2e\xfa\x55\x3e\xc3\xb5\x0a\x8f\x6a\x44\x24\x22\x8c\xf0\x4b\x8f\xf6\xe9\x8f\x98\x38\x53\x3d\x79\x95\xe3\xbe\xf8\x4a\x0e\x91\xc5\x06\x34\x66\xa5\x1c\x14\x7d\x24\x60\xf5\xa5\x7b\x12\x1b\x4b\xc1\x33\x8b\xdd\x56\x6d\x0b\xf5\x47\x17\x82\x87\xdb\xb0\x9c\x07\x58\xc9\x42\x1b\x27\x8b\x2d\x70\xcc\xfd\xa9\xf3\xc7\x7d\x55\x1f\x67\xa9\x1a\x96\x44\x90\x62\x5c\x79\xeb\x65\x4a\x59\x12\x13\x92\xf6\x2d\x90\xae\xbe\x31\x7e\xf0\x24\x96\x31\x42\x06\x10\x4c\xe4\xb9\x6d\xc6\x7b\x5e\x92\x50\x81\xc4\x48\xa8\x9f\xd9\x79\x4e\xbd\x0a\x0c\x4b\x12\x1d\x21\x41\x7f\x2d\xf3\xc6\xa1\x04\xb6\xb6\x73\x46\x3e\x61\xb8\x60\x09\x49\x41\x63\xcf\x83\x7c\x85\xbf\x00\x2b\x4e\x37\xb5\x84\x50\x12\x3a\xed\x1e\xf3\x77\x28\x56\x35\xc8\x75\x55\x54\x9f\xcb\x1c\x4c\x7f\x39\x25\x31\x92\xe0\xdd\xe5\xba\xae\xbc\xda\xed\x6c\xf2\x52\xe2\x7a\x64\x54\x55\xbd\x1e\x65\xfd\x3a\x9d\x87\x14\x22\x92\xf4\xdd\xc7\x9b\xd2\x5c\x07\x4c\x17\x4b\x32\xae\x30\x82\xcb\x9b\x11\x20\x6e\xf2\x39\x24\x34\x8d\x48\x28\xe5\xaf\x65\xb9\xc7\xdc\xc6\xe2\xfe\x9d\x50\x99\x11\xbf\x82\xbf\x57\xa6\xf8\x2e\x9b\x2b\x80\xb2\xdf\x3d\xa6\x4b\x22\xa1\x2a\x8b\xfc\x26\x36\x67\xd4\x9e\x0d\xb4\xae\xe5\x42\x23\xb4\xe3\x67\xd5\x8e\x85\xec\xff\x67\xe0\xb5\x5c\xf8\x2f\x7f\x05\x16\x65\xb8\xe4\x9b\x5f\xf2\xb4\x9a\x88\x94\xb1\x84\x65\x12\x33\x05\xbb\x73\x0d\xed\x6c\x8d\x31\xe3\x78\x56\x1e\x8b\x73\xf3\x28\x3f\x6e\xf3\xde\x8e\x27\x9c\xb9\x96\xae\x93\x3c\x37\x72\x76\x49\x91\x19\x34\xc3\xbe\x40\x29\xdf\xd1\x84\x24\xb3\xe7\x17\x36\x4d\x03\xff\xe5\xfb\xbe\x0a\x4e\xe3\xa7\xbd\xb2\xcb\xcb\x43\x12\x82\x95\xc0\x91\xbb\x9d\xcc\xde\xa0\x24\x80\x1e\x85\x4b\x5e\xfc\x51\xcd\x5f\x84\xe4\x29\x46\xfc\xdf\x57\xdb\xbf\x26\x55\xf8\xd2\x48\x24\x12\x22\x95\xfd\x05\xe9\xdf\xe3\xd3\x66\xd8\xb2\x12\x2d\x2d\x3a\x50\xc8\x16\x35\xaf\xe4\x87\x31\x46\x72\x47\x77\x83\x2d\x5d\xd7\x57\xe1\x80\x49\x22\x60\x3d\xdc\xf9\x60\x10\x3c\x15\x0e\x42\x12\x21\x06\xe5\x70\x90\xaa\xaa\xdb\xc3\xa1\x3f\x60\x40\x8e\xb4\x4c\xef\xf2\x12\xc6\xda\xb9\x6e\x14\x89\x62\x41\xd3\x51\x39\xff\x1a\xde\xbe\x48\x86\x30\x12\x81\x53\xb5\x47\x45\x4b\x2c\x90\x74\x9f\x53\x59\x19\xb8\x29\x42\x5f\x04\x23\x71\x42\x94\xdb\x3b\x8a\xab\x6a\xf6\x1d\x93\x38\x53\x99\x57\xd0\x6f\x8b\x89\x54\xe4\x27\x75\x86\x89\x93\x4f\x12\x41\x78\xd4\xb7\x78\x41\x19\x1a\x64\xd6\xe3\xc7\x4a\x84\x23\x88\x74\xbc\x89\x97\xf7\x40\x12\xc7\x38\x73\x28\x9c\x91\xff\xda\x65\x27\x69\xac\xb9\xab\x1e\x6f\x8e\xa7\xf6\x63\x62\x79\x48\x9a\xa4\x48\xb1\x71\x75\x2e\xcb\xc9\x87\x45\xa8\xa0\xc8\x03\xb6\xeb\x42\xa0\x71\xd5\x6d\xd9\xb2\x10\x2a\x33\x44\xe5\xfa\xc6\x58\xa9\x5f\x4d\xd5\xbb\x09\x84\x5a\x6a\xc4\x18\x99\x5d\x9a\x31\x32\x70\xf6\xa2\x58\x44\x88\xed\x09\x2d\xb1\xda\xfb\xff\xb6\x24\xb3\x7c\x93\x2c\x8d\xd0\xa1\xb4\x5e\x11\xf0\xa6\x57\x46\x63\x84\x71\xca\x7b\xc5\xbe\x34\xfc\x95\x47\x3a\x19\x0c\xc5\xaa\x7c\x86\x62\x2d\x6b\xb3\x83\x3a\x64\x43\xf9\x92\x27\x48\x78\x9c\xa1\xe9\x40\x64\xd7\x53\xf5\xea\xb3\x34\xe1\xa8\xb2\xa9\xe7\xdf\x71\x7a\xd3\xaa\x92\xb5\xf9\x22\xd3\xc9\x08\x07\x83\x1c\xa9\x6e\xc5\x1c\xae\x42\xf3\xff\xf2\x0c\x0a\x42\x44\x34\x9a\xef\xc6\xc3\x06\xf3\x79\xd0\x4c\x64\x94\x22\x6e\xf1\xd0\x40\x61\xc3\xfd\xc9\x8c\xa1\x12\x12\x14\xf9\x73\xae\x8a\x49\x1a\x9f\x11\x69\x01\x67\xf1\x51\xd6\x79\x33\x59\x34\x2a\x36\x98\xf5\x7c\x02\x59\xdc\x49\x53\xe7\xe6\xad\xb9\xcd\xdf\xa0\x3e\xf5\x25\xe2\x6e\x90\x45\x65\x48\x05\xad\x3a\xeb\x2e\x96\x2f\xfb\x97\xa0\x52\x8a\xbe\x52\x80\x8f\xaf\x9e\xe1\xe1\xed\x13\x88\x37\x23\x4a\xba\x56\xac\xc1\x58\x11\xa5\x89\x1e\x87\x84\xfb\x97\xba\x2a\xfb\x38\x94\x68\xc9\x03\x4a\xf3\x0e\x9e\xe5\xa4\x50\xc9\x88\x56\x99\x70\xfa\xd0\xce\x34\x3c\xd8\xb5\xe3\xf1\xfe\xf0\xe2\x40\x8f\x30\x82\xab\x75\xe3\x65\xa0\x25\xc5\x69\xb8\x1d\x92\x19\x44\xeb\xc4\x09\xb5\xba\x8d\xf3\xe1\x34\xcc\x92\x31\x19\x06\xca\x87\x21\x6e\xf9\x5e\xd5\x4d\x7f\x1b\x90\x68\xa4\x30\xbd\x49\x7e\x3c\xf6\x8e\x00\x01\x49\xb0\x09\x3a\x0f\x2a\x36\x63\x09\x37\x46\x6c\x6c\xc0\xe1\x57\x3f\x76\xd0\x85\xd6\x37\x70\x21\x3b\x37\x9b\x3e\x9b\x8a\xd4\x2f\x92\xc5\xac\x27\x23\x56\x48\xed\x81\x05\xee\xd7\x9a\xdf\x66\x1b\x37\xb1\x42\x41\x68\x0d\x9d\xc2\xfd\x91\xd5\xe4\xd3\xc6\xf7\xbf\xfa\xa0\x2f\x09\x7b\x19\xb1\x26\xc3\x04\xd1\xa6\x7d\xc1\xf7\x76\x03\x60\x94\x1c\x7e\xc4\x0d\x4b\xa3\xcc\xe9\x1b\x9f\x6b\x95\xb7\x7d\xb2\xbe\xf9\x29\xcf\x45\x78\x3d\x69\x04\x34\x55\x01\x5d\x10\xac\x8c\xc3\xdf\xb8\x36\xae\x71\x6e\xff\xbb\x6c\x5e\x46\xb8\x4d\x96\xc6\xc4\x29\x57\x3c\xd7\xb2\x0c\x5a\x77\xe3\x0f\x21\x8d\x39\xa3\x72\x50\x8b\x74\xad\x50\xfe\x58\x62\xb2\xd8\xc7\x65\x7d\xc8\x01\x66\x06\x66\x58\x7c\x63\x29\xa1\x2a\xb4\x08\xaf\xe5\x18\xc7\xc3\xd2\xee\xc3\x49\xdd\xfb\xbf\xa9\xea\xbb\x0f\xfc\x9c\xcf\x23\x70\x3f\x4b\x33\xa6\x42\x35\xe7\xee\xa3\x8b\x2d\xca\x41\x37\x98\xa5\x19\xa7\xb8\x9b\xba\x6d\x07\x9f\xc6\x67\xf5\xc3\x08\x96\x72\xf0\x79\x8f\x6d\x89\xd5\xb4\xbc\xfd\x70\x8d\x44\x9e\xd9\xfc\xa2\x5e\x7a\xd1\x1e\xcf\x52\x9e\x39\x5a\x79\xd7\x70\x6a\x26\xed\xcb\xd3\xf7\x9d\x72\x2a\x1d\x89\x7f\x75\x54\x79\x89\xf5\xb3\x79\x05\x8a\xa5\xdc\x30\x24\x30\xc0\x94\xcd\x63\x51\x21\xf4\xbe\x27\x44\xba\x6c\xc4\x5c\xd8\x97\x53\xa1\x0c\x0f\xc9\xb7\xbe\xe7\x62\xf9\x15\xc8\xd8\x26\x7e\x27\xbb\x87\xf7\xd6\x07\x5a\xfb\xfd\x9d\xa7\x9e\x4d\xc7\x44\x6a\x2c\x95\x42\xc5\x5e\x24\x1d\xd3\x6c\x15\x86\xe2\x03\x7e\xde\xcc\xd6\xae\xd4\x8a\x78\xae\x5f\xbc\x90\x70\x5f\x84\x08\x3f\xaf\x62\x8a\xb6\xf7\x15\x3e\x7c\x44\x7d\x21\x6c\xcb\x52\x45\x8c\x4d\x07\xdb\x73\x80\x50\xd7\x65\xa9\x12\x0a\x75\x4d\x36\xfb\xef\xef\x49\xff\x47\x1d\x47\x81\xbd\xfd\xd0\xbe\xd4\x00\x78\xed\xcd\x7f\x9c\xf0\x88\x1f\xa5\x49\x8a\x61\xc6\xf7\xfd\x7a\x3d\x59\xec\x9a\x39\x82\x89\x53\x9d\xbf\xe5\x05\x3c\x0f\x8d\xa0\xd3\xa9\x33\x2a\xc5\xb6\x15\x4f\x45\xd0\x56\xaf\x65\xe7\x6a\x86\xcb\x80\x49\xd0\x87\x34\xa0\xda\x0b\xb1\xe8\x31\xba\x87\xa5\x56\xb0\x20\x47\xfd\x04\xa3\x62\xf4\xec\x5d\x59\x29\x85\xd7\x5b\xef\x67\x1c\xf5\x99\x7b\x86\x91\x6e\x8c\xc1\xb0\x36\xa4\xf4\x31\xd9\x36\xee\xf1\x9e\x35\x4c\x4c\xd6\x8d\xb5\x4c\x83\x4f\x79\x8e\xe5\x3f\xdc\xe1\x2c\xa2\x91\x08\x9f\x6b\xf7\xad\x7a\x6f\x2f\xf4\xec\x2f\x46\xa3\x59\xd4\x7d\x8a\xb8\x09\x75\x3b\xe7\xfc\x8a\xd6\x6d\x0d\xdd\x27\xd8\x78\x65\xd7\x21\xac\xc9\xe2\x88\x60\x06\xf8\x65\x64\xea\xb2\x24\x66\x28\x9f\x78\xcc\xcb\x3e\x55\x37\xb7\xbe\xa3\x6b\x24\xdc\xe9\xba\xac\x57\x8f\x43\x03\x06\xcb\x08\x07\x11\x05\xd3\x73\xf2\xbd\x87\x4f\x55\x01\x8b\x00\x2c\x96\x11\xc3\x5c\xd5\xbd\x46\x06\x67\x4f\x44\xfb\xd1\x5f\xce\x26\x88\xb8\xee\x8e\x81\xd9\x57\x46\x7e\x6c\x4b\xd7\x42\x19\x5e\x4d\x96\x5a\x17\x78\xe0\xb2\x4c\x0e\x50\x36\x67\x24\x88\xc1\x74\x8e\xa3\x94\xcd\xab\xb2\xd7\x35\x76\xfa\xdc\x57\x1f\x71\x14\x85\x2b\x64\x32\x46\x8b\x67\xab\x5a\x03\xf2\xd7\xcc\xe6\x33\xd3\x26\x41\xf8\x6d\x50\x58\x67\x19\x8d\xe2\x20\xc3\xb7\x2a\x8a\xc7\xba\x7a\xcb\x0d\xd4\x9e\xa8\x6f\xfa\xaa\x28\x55\x8e\x9e\xc5\xef\x7a\xbd\x8e\xfd\x25\xa6\x98\x65\x94\x51\xec\x91\x40\x59\x8a\x5c\xff\xac\x8a\xd7\xe6\x97\x7c\xee\x3f\xa3\x8c\x32\x9d\xea\xf0\x6e\x1f\xab\xea\x34\x71\xd5\x33\x6a\x08\xbe\x97\x6d\x55\x8e\xea\xe5\x2c\x63\x71\x14\xa4\x50\x5c\x41\xf1\xb2\x69\x81\x65\x4c\x46\x68\x49\x77\xbb\xeb\xeb\xfd\xfe\x8b\xc6\x00\x96\x31\x10\x98\x02\x0f\x0f\x55\x83\x19\x55\xa7\x59\xc6\x59\x8a\x1d\xc2\xb7\xab\xfd\xf6\x7e\x0c\xb7\x67\x19\x17\x4e\x2b\xea\x88\x2a\xb2\xd8\xe2\x85\xc5\xa0\x9e\x96\xa6\x1f\x47\xb0\x0b\x20\x44\xdf\x79\xd9\x42\xd9\x7d\xef\x8b\xe5\xbf\x4c\x10\x00\x18\x76\x8c\xfb\x11\xb4\x71\x7a\xeb\x82\x59\xc4\x57\xea\xaa\x69\x6f\xaa\xda\x13\x66\x23\xeb\xc1\x27\x8e\x72\x26\x40\xa6\x8e\x24\xac\x7a\x3d\x9f\x76\xa7\x3a\x6f\xe7\x6b\x44\xc6\x4e\x82\x4c\x9d\xd1\xb3\x72\x64\x3b\xe1\x51\x24\x49\x90\xdb\xe2\x6a\xbd\xda\x2d\xe2\x5b\x27\x37\x28\x85\xeb\x93\xc1\x91\xa1\xf1\xeb\x22\x90\xff\x0b\x17\x29\x5c\x4b\x2b\xf4\x07\x8b\xf2\x4b\x14\x17\xcb\x14\x05\x44\x00\x0f\x6c\xe7\x00\x06\x01\x89\xb3\x71\x52\x01\x04\x2c\x45\x0d\x97\xb5\xeb\x4c\x41\x84\xc1\xd0\xdd\xd3\xd5\xed\xe4\xc5\x2b\x9b\x10\x0f\x0a\x0f\xf5\xa4\x2a\x14\xb0\x16\xb7\xf6\x4c\xf3\x04\x1b\xdd\xbf\xc9\xe6\x47\x03\x66\xf6\x43\x5a\x39\x79\x1f\xbf\xc9\x3e\x56\x55\x31\x6a\x51\x9d\x8d\xd5\x2a\x26\x03\x7f\xfe\x2d\x48\x3b\xf8\x08\xb3\xa9\x30\x34\x0a\x48\x5a\xd7\x7d\xb8\xbc\xe0\x20\x31\xe8\xa2\x34\x6d\xaa\x5f\xc7\x5e\x56\x06\x89\x13\xe4\xb9\x7b\x78\xc2\x42\xd4\x5f\x84\x9f\xe1\xac\xcc\x48\x5f\x15\x57\xb3\xd2\x4c\x66\x89\x41\x44\xda\x5b\x0e\xbf\x0e\x35\x48\xf3\x31\x96\x64\x9a\x5e\x88\x46\x5c\x27\x0e\x68\xdd\xcb\x53\xfe\x16\x0e\xe9\x0c\xc9\xda\x0b\xd9\xb4\x8f\x83\xd3\x46\x63\x9e\x22\x58\x00\x6a\x9d\x44\xd3\xac\x0d\x4d\x52\x8e\x8b\x7f\x77\xb5\x9d\x5c\x2b\xd1\xd6\x35\x37\xfb\x64\xcf\x85\xee\xab\x1f\x47\x0c\xc7\x72\xd0\x8d\x54\xa3\xb2\x1c\xcd\xac\xc3\x27\x60\x5b\xb3\x2c\x5c\x16\xbb\x8b\x58\xba\x27\xdb\xd7\xd0\xbc\x54\x85\xf1\x1f\xf3\xec\x8a\x34\xca\xd4\x10\x6e\xfb\xee\x20\xec\x85\xbd\x1a\x8b\x27\x86\xd1\x82\xa1\xdb\x06\xc7\xbc\x1d\x2f\xd7\xbf\x97\x0a\xa3\x8c\x1b\xed\x3b\xb0\xbf\xff\xb1\xf6\x73\x33\x7e\xdd\x94\x33\x43\x3c\xd0\x39\x6f\x02\x15\x43\x2f\x85\xe3\x07\x89\x84\xe9\xcc\xcb\x0a\xef\x4e\x52\x03\xea\xda\x2f\xff\xa4\x50\x82\xaa\xfe\xf9\xb6\x2d\x1c\x27\x55\x99\xf9\x68\xcd\x85\xaf\x73\x78\x4d\xde\x7a\xd2\xca\xe8\x87\xc9\x84\x4b\x32\x34\x4e\x3b\xca\x87\xd9\x18\x25\x52\x27\x0d\x5d\x9d\x3e\x4e\x5d\x70\x1b\xee\x5e\x59\x8a\xa1\x4c\xde\x74\x57\x36\x7f\x45\x60\xc1\xa8\x16\xae\x1b\x41\x05\x17\xed\xa1\x98\x39\xb1\x54\x9b\x04\x33\x9e\x57\xfb\xfd\xe3\xe6\xa9\xd7\x3d\x66\x14\x88\x40\x88\xa6\xca\xdb\x4f\x61\x62\x61\x28\x4d\x59\xe2\xc1\x3d\xad\x13\x8b\x18\x9b\x52\x0a\x4a\x63\x84\xb5\x7e\x91\xf5\x33\xec\xa1\x8f\xbc\x59\x24\x53\x3e\x56\xf5\xee\xe2\x81\x45\x38\xc4\xf4\x17\xbb\x7d\x94\x78\x6e\xde\xdd\xa9\xfb\x12\x97\xc4\xcb\x19\x4b\x04\x60\x92\xa0\x3a\x41\x28\xb3\x8c\x78\x7a\x18\x4b\x8c\x45\x1f\xec\xad\xea\x45\xfb\xc2\x21\x12\x03\xf3\x66\x6d\xbd\xfe\xee\x18\x4d\xc4\xe4\xb1\x18\x49\x93\xa4\xd7\xcc\xf0\x7d\x92\xcd\x24\xd2\x67\xa9\x89\xb2\xe0\xcf\x75\xa1\xe5\x18\x5a\x3e\xb9\x56\xc6\x28\xae\xef\xf6\x05\xf6\x7d\xb7\x4c\xf7\x67\x9d\xa2\x5c\x4c\xf3\x53\xd6\xf9\x08\x4c\xcd\x18\x95\xbc\xe7\xa8\x3a\xb7\xf0\xe4\xf5\xbd\x9c\x5f\xf6\x5d\x86\x88\x32\x4c\x05\x55\x31\xf5\x20\x37\x64\xae\x36\x72\xc9\x9c\x32\x46\x9c\x12\x75\xf7\xd7\x55\x5e\x5f\xd7\x55\x70\xb6\x18\x4f\x5c\x2d\xb3\x06\xdb\xd9\x05\xe7\xd1\xa2\x1a\x47\x67\x23\xa0\x6e\x10\xe4\xd3\x8f\x26\x51\x60\x16\xda\x94\x6d\xfd\xd1\xc5\xe5\x5f\xf6\x9c\x33\x26\x88\xe5\xbe\x4b\x4d\x57\x81\xfe\x93\x31\x91\x26\x58\xf7\x3c\xca\xba\xce\xe5\x33\xdc\xe6\x1a\x4a\x0d\xc8\x0b\xb7\x7d\xbc\xd9\xbd\xc8\xa0\x21\xcd\x98\xa0\x11\x5a\xe8\x36\x6d\xc7\x56\x92\x09\x90\xbe\x31\xd7\x3c\x56\x4d\xfb\x50\x5e\x61\x12\xef\x4b\x98\x0c\x13\xa0\x3c\xb3\x25\xd6\xed\x9f\x64\x39\xcb\x5e\x30\x49\x5d\x6b\xd0\x40\x45\xed\x7b\xa9\x7f\x3b\x5f\xb6\x6c\x33\x26\x8d\x73\x57\x5d\x82\xbd\xdb\xd6\x6f\xaa\xfa\xa1\x84\x1e\xcb\xdb\x0d\xc9\x0c\xef\x09\xda\x10\x79\x7c\x27\x3f\xae\xf3\x66\x8c\x30\x61\xd2\x50\xc4\x43\x79\xaa\x09\xc7\x67\x1e\x00\x01\x4c\x25\x46\xd1\x71\xd3\x1b\x66\x53\x9a\xfe\x30\xcd\x50\xc7\xb8\x45\x16\xa1\xa1\x46\x11\x0e\x73\x6b\x75\xd0\x3f\x2c\xc1\x75\x62\x4e\x37\x23\xa6\xb5\x44\xba\xd6\x73\x59\xe4\x4d\xbb\xaf\xab\xd3\xcb\xc7\xec\xd3\xd3\xda\xa9\x48\x75\x06\xfb\xf7\x6f\x23\x0e\x40\xc6\x4c\xca\xc2\x77\xe3\xd4\xf7\x26\x8d\xe5\x8c\x41\xac\x62\x3a\x6e\x8d\x08\xbc\xf9\xb7\xf9\x31\x9f\x7f\xe2\xe0\x73\x69\xed\xa4\xe7\xbe\x8b\x5e\x96\x5c\xb3\x10\xeb\x33\x48\x28\x32\xab\x4d\x68\xf7\x0a\xa9\xa0\x98\xd0\xee\x31\x06\xd2\xe1\x16\x50\x3c\xfa\xdc\xb4\x41\xb6\x36\x1c\xb7\x94\x20\x46\x70\xb3\xff\xf9\x34\x79\x0a\xab\xa3\xa0\x46\xd9\xd7\xd1\x67\xcb\xc7\xea\x18\xa9\xdd\x8d\xfc\x68\xf6\x55\x88\xa8\xa6\xcf\x67\xc1\x62\x5c\x1a\x9e\x0f\x61\xe8\x61\x79\xcd\xb6\xce\x21\x32\xe4\x11\x95\x38\x87\xd7\xd5\xfb\x68\xbb\xe7\x91\x49\x82\xa2\xa4\xd3\x2f\x03\x07\xd1\xda\x3a\x41\xf0\x5c\x15\x79\xf9\x3c\x96\x03\x63\x3c\x8e\x14\x0d\x71\x73\x6f\xd8\x78\x9c\x71\x47\xf6\xd9\x40\xfb\x5d\xe6\x35\xa6\xdc\xe8\xf4\xde\x79\x4c\x13\x4c\x90\x54\xc8\x6d\xb1\x29\xcd\xe8\xaa\x54\x60\x19\x75\x65\xe4\xa9\xed\x93\x58\xcb\x7b\x2b\x8f\x35\x41\x92\xf8\xc0\x26\x67\x72\x0d\x4f\x55\x51\x2c\x7a\x84\x9d\xb3\x8a\xb4\xcd\x77\xdb\x7b\xac\x9a\x05\xaa\xc9\xc3\xf6\xfe\xd0\x53\x20\x30\x4e\xa8\x0d\x06\x1e\x4d\xc9\x38\x0d\xe5\x87\xa4\xd2\x38\x36\x63\x67\x62\x67\x8d\x87\xb3\x9b\x4c\x0d\xa7\x3c\x4c\x6d\x99\x77\x7e\xf0\xa6\xdb\x34\x42\xe6\x86\xa7\x40\x2c\xe9\xbb\x35\x1d\x8c\x64\x56\x03\x9b\x3e\x48\x96\xa6\x68\x7f\xe4\x58\x1d\x65\xfe\xb4\x19\x98\x24\x76\x50\x77\xdf\xbc\xe2\xf4\x9c\x83\xf8\xe9\xca\x18\xb8\x00\x4b\x87\x73\xad\x12\x7c\x24\xfa\xe4\x73\x2e\x73\x4a\x05\xc6\x69\x94\xa1\x65\xde\xff\x39\x5e\xe2\x9c\x0a\x8d\x6d\xc5\xcf\xc5\xb9\xdf\x97\x38\xb3\x12\x11\xd1\xb7\x55\x6d\xba\xa5\xf7\x58\x23\xa6\xe6\xef\xe6\x92\xa7\x93\xca\x23\xc0\xf4\xfb\xef\x1f\x0a\x6a\x2f\x30\x35\xbb\x37\x6e\x53\x9c\xd6\xd0\x6c\xd8\xad\x5e\x4c\x34\x87\xd8\x7a\xbc\xcf\x72\x11\x8b\xc4\x7a\x6c\x5e\x69\xf3\xfa\xd8\x85\x57\xae\x3c\xe3\x03\xe0\xd9\x1a\x10\x99\xc5\x90\xe5\x20\xcd\x5b\xe7\x43\xad\xd1\x9d\x5c\x4c\xc1\x73\x21\x34\x84\x17\xf6\xeb\x1e\x7e\x79\x9d\x8f\x59\x76\x81\x0b\xe1\xb8\xf2\x6e\xbf\x4d\x42\x72\x2e\x89\xab\x6a\xa1\x07\x5b\xd5\x93\x02\x2a\x97\xa9\x4e\xed\x18\xa4\xbe\xaf\x9e\xa0\x0b\xf9\x2f\xb9\x74\xc3\x19\x19\xb8\x8c\x2c\xc2\xa6\x77\x98\x24\x9b\xdd\x89\x54\x14\xb7\xcb\x00\xef\xec\x56\xf9\x7c\x88\x65\x18\x47\xe6\x0d\xf6\xb1\x75\x4f\xbf\x72\xbc\xbe\x41\xdb\xcf\x0f\x54\x5e\x80\xd2\xfd\xdc\xb4\x1b\xe2\x2f\x7c\xfc\xbf\x03\x24\xe2\x4a\xb9\x8a\x70\xb7\x65\xc8\xe2\x2b\xd5\x70\xc6\x95\x6f\x1d\x3a\xd4\xee\x0d\xdc\xc9\x57\x78\x2c\xbe\xe0\xba\xf7\xe7\xe9\x84\xa7\x97\xcc\xb2\x5f\xd0\xca\xf2\x70\x22\x89\x30\xa8\x76\x0c\x86\xc9\x61\xa0\x2f\x67\x5c\x53\xce\x21\x10\x6e\xe8\xd7\x4b\x96\x1c\xc6\xb5\x66\x71\x8f\x10\xec\xac\xa1\xdb\xb7\x6f\x72\xb5\x80\x4b\xe6\x86\x02\x16\xde\xec\xb9\xd4\x0e\x58\x5d\xae\xea\x67\xfc\xda\xc7\x50\x8e\x19\x22\x8a\x1b\x1e\x07\x56\xb8\x3b\xf9\xee\x25\xcd\x77\xa7\xca\xbb\xf7\xe1\x51\x8c\x70\x41\x46\xd1\x6d\xb6\x3d\xd4\xd4\x1f\x84\xc8\x25\x51\x1b\x58\x12\xca\x0a\x97\x00\x96\x38\xc1\x5a\x03\x4d\x5b\x57\x33\xd7\x80\x83\x30\x48\x84\xd3\xed\xbd\x77\x70\xac\xea\x8f\xce\x6d\x7a\xae\xf3\xf6\x03\xeb\x50\x84\x8c\x73\xd9\x1c\xb4\x81\xb8\xb7\x9b\xb3\x6b\xd9\x28\x43\x1e\x90\x5d\x55\x54\x47\x78\xc7\x17\x37\xc2\xe4\x73\x9b\xb8\x56\x34\x33\x6b\xc4\x5b\x7e\xff\x36\x15\xd8\xfc\xbf\x83\xf6\x7c\x7a\x92\xd6\x16\xb3\x76\x9c\x30\x4e\x5b\x04\x43\x48\x97\x37\x69\x6e\x65\xd3\xae\x0b\x90\xf5\x85\x44\x33\xe3\xd6\x4a\x9f\xf3\x40\x7b\xb3\xaf\x4e\x3f\x4e\x0b\x8e\x8c\x88\x12\xa1\xdc\xf6\x70\x74\xe0\xc5\xd5\xd3\x9f\xe3\x46\x74\x26\xa2\x14\x20\x20\x12\xa4\x52\x79\x7b\x87\xed\x5e\xbb\xf3\xf1\xe8\x1d\x02\x3f\x30\xd6\x2a\x0e\xb1\x4b\x91\x43\xd9\x76\xf7\xe7\xae\xb5\xbd\x5e\xae\x95\x88\x44\xa4\x58\x88\xbb\xda\x07\xcc\x98\x48\x80\x21\x9f\x41\x9f\x32\xad\xab\xf3\x29\x9f\x9b\x33\x41\x04\x48\x87\x7a\x6a\xce\x50\x07\x48\xaf\xe7\x49\x9b\xb3\x95\x31\x91\x11\xa7\xaa\xf0\x7b\x17\x2f\x95\x3b\x28\x6c\x17\x64\x24\xfd\x61\x4e\xd1\x9c\xaf\x8a\xf6\xea\xfc\xf1\x55\xb3\x75\xe7\xec\x6b\x44\x78\xbc\x79\xbc\xe2\xa6\x34\xd5\xaf\xa5\x2d\xfa\xef\xfe\x1b\xae\x1b\x53\xa4\xe1\x0c\xab\xff\x3a\x6f\x50\x61\xe9\x6b\xb1\x1f\x26\x68\x62\x07\xf8\x65\xb3\x84\xdc\x13\x2c\x02\xec\xe0\x73\x49\x05\xdf\xc8\x0a\xba\x3a\x1e\xc1\xe9\xfa\x7d\x6d\xa1\x04\x4b\x32\xdc\x23\xee\xf2\x12\x61\xab\xb2\xee\x99\xce\xba\x83\x0a\x7d\x45\x4c\x3e\x4c\xab\x9c\x82\x25\x80\x74\x2d\xdf\x9e\x7e\x4e\xff\x2e\x5c\x11\xeb\x19\x4a\xa4\x02\xda\xbc\x9f\xbe\x0d\x19\x6b\xc1\x20\xd2\x64\xa8\xbd\x62\x66\xe7\xfe\x1c\xbc\x5f\xc1\x59\x86\x02\xcf\x06\x6c\x17\x63\x04\x25\xaa\x90\x30\x5a\xb4\xce\x82\x6b\xd0\x23\x36\xdb\xb1\x5c\xe1\x72\x69\x79\xde\x38\x9b\x4e\xb7\x88\x70\x59\x13\x2b\x8c\xb5\x3f\x5c\x7f\xc5\x41\x4d\x10\x03\x42\x24\x8c\x9a\x50\xe7\xdd\xb6\x70\x0c\x16\x46\x48\x92\xa2\x36\x7f\x83\xec\x5d\x48\xde\x37\x5e\xb1\x32\x65\xb8\xcc\xf6\xff\xf8\x7b\xac\x08\x4c\x48\xe9\xe8\xf1\x90\x2f\xb0\x3c\x0f\xf1\xd3\xf4\x65\xaa\x14\x1c\x82\x1d\x21\xda\x7e\x5b\x5d\x5c\xbb\x1e\xb2\x32\x3a\x55\x64\x34\xf1\xb0\x9b\x90\xb2\xef\x9f\x47\x09\x8d\x88\xf0\xef\xff\x98\xbc\x6a\x25\x0d\xc6\x04\xf6\x0c\x21\xbd\x2f\x34\x4b\x43\x2c\xe6\x7c\xd1\x87\x5f\x33\xd4\x66\xc8\x20\x08\x2d\x52\x2f\xeb\x7b\xcc\xcb\x83\x34\xb3\x4c\x92\xd0\xe0\xa0\x7f\xf0\x0e\xda\x7b\x1b\x23\xd0\xfe\x7c\x3b\x12\xc6\x68\xea\x29\xc8\xae\x64\xf9\x0a\xf5\x5a\x96\xc6\xa9\xc5\x9c\x2f\x94\xc6\x99\x80\x28\x09\xf8\x0d\x27\x43\xd8\xb7\x1f\x4f\x39\xad\xfb\xe1\x22\xf6\xe1\xe7\x75\xf5\xab\x2c\x2a\x39\xe6\xa1\x67\x02\x62\x8d\x90\xd5\x83\xf6\xf0\x78\xac\x06\xe5\xea\x12\xab\x17\x4e\xf0\xc2\xae\xff\x0b\x2a\xef\xdc\xda\xff\x9f\xd8\x3e\x61\x33\xd7\x4c\x7f\xaa\x4e\x71\xb8\x29\x6b\x2c\x1d\x11\xcc\x8c\x41\x10\xdd\x31\x11\xe8\xdf\x5d\x2f\xae\x8b\xdc\xbe\x62\x30\x65\xc2\x82\xa0\x9e\x83\x73\xd3\xbe\xac\xe5\x69\x07\x45\xb1\x2d\x6f\x42\x52\x47\x46\x24\x02\xd5\x37\x65\x9a\xea\x18\x8a\xe4\x48\x03\xdd\x8f\xa2\x8c\xf8\xe4\xd1\xef\x1f\xba\x73\x94\xf3\x7a\x8a\xa8\x1b\x42\x4f\x19\x09\x61\x7c\x54\x11\xd4\xea\x9b\xfe\x42\x86\x52\x1f\x14\xcf\x90\x6a\x0b\xdb\xac\x8c\x65\xea\x34\x04\x5d\x7b\xf1\x6d\xa5\x5f\x67\x9f\x90\x8c\x8d\x48\x1d\xd3\xe1\x59\x15\xd0\xbd\xea\xf9\x00\x4b\x32\x9f\x97\x7d\x38\x81\xe7\xa1\xd8\x3c\x0f\x9c\x03\xa3\x3b\x4f\x62\x07\x8d\x6d\x2b\xc7\xd3\x7f\xc8\x75\xe8\x5f\x90\x89\x04\xf4\xed\x31\xd3\xd7\x0c\x34\x24\x4c\x92\xd8\x91\x73\x63\xa5\x3c\xe9\xff\x6a\x21\x8d\xfb\x70\xb0\x75\x3b\xfe\xe4\xe5\xc8\x54\x68\x44\x71\x77\xcb\xbf\xae\x8a\xc2\xb3\xa4\x2e\xbf\x4a\x99\xa5\x09\xf7\xf0\x7f\x34\xd4\xb3\xe7\xcc\x14\xc1\x6c\x3c\x6e\xd6\x79\x9b\xbf\xc1\xa3\x6c\x5f\x3e\xa3\xf1\x09\x27\x69\xa6\xa9\xcf\x7f\x5e\x83\x2e\xf2\x99\x28\x24\x93\x19\x38\x75\x97\xce\x57\x0b\x3a\x58\x3f\x9a\xbc\x7c\xbe\x46\xfe\xea\x81\x75\x24\x3c\x37\x15\x34\xed\x69\xd2\xfa\x0d\x34\x74\x7d\xfe\xed\x30\x70\x64\xd8\x25\x95\x0c\x3b\xad\x4b\xf8\xd5\x45\xd6\x47\x59\x60\xda\x68\xbe\x14\x58\x96\x62\x17\x69\x23\x8b\x37\xf9\x0c\xf7\x15\xca\x8a\xfe\x0a\xed\x78\x3b\x28\xdb\x7d\xf5\xa9\xc8\xc7\xec\x5a\x8a\x63\x8e\xcc\x6d\xd3\x9b\xd0\xce\x06\x17\x5a\x98\xa3\x53\xb4\xcb\x88\x8c\x53\xd9\x9b\xf7\xb6\xbe\xdc\xdb\x96\xdf\x05\x4f\x12\x24\xfa\x40\x61\xf5\xdf\xfa\x3f\x72\xe2\xd2\x2c\xe7\x13\x2a\x41\xf6\xf4\x2a\x8b\x95\x7c\xc9\xb9\xc0\x20\x2c\xc0\x6c\xbb\xf7\x73\x3e\x1e\xcf\x65\xe7\x5b\x7b\x11\x49\x3f\x54\xc4\x11\xca\x7d\x62\x52\x25\xa0\xca\x87\xfc\xbf\x14\x84\x62\x5f\x06\x6e\xf9\x48\x29\xe0\xc4\x07\x9f\xeb\xaa\x27\xd8\xea\x46\x69\x0d\x5e\x9d\x0a\xea\x6f\xd0\x7a\xd8\xdd\xfe\xfd\xea\x4b\x72\x65\x26\x05\x38\xb5\xce\xed\xf5\x60\x96\xa5\x12\x4e\xdc\x5e\x55\xae\xcd\x7a\x5f\x4d\xe0\x17\x7e\x94\x26\x54\xa7\x9e\x88\xa4\x9e\x6a\xb2\x33\xa9\x53\xc5\xfc\x46\x81\x52\x72\x27\x39\x5c\x5e\x33\x41\xd2\x71\x32\x6d\xb5\xc5\x18\xfd\xd4\xf6\x6d\xd4\xb3\x6f\x54\x0b\xc0\xbd\xff\x84\x98\xa9\xfb\x1e\x7a\x2c\xb5\xb5\xd8\xcd\xae\xa4\x79\x76\xbc\x70\x9f\x02\x5f\xfd\x19\xc6\xb8\x86\xac\x9f\xd5\x3b\x14\x4f\x70\x92\xae\x43\xe2\x7c\xa1\x90\x38\x0a\xa5\x24\x64\x1c\x83\xf8\xbb\xd5\x9f\x87\xfd\xc3\xef\x9b\xfb\xc3\xd3\xe6\x8f\xd5\xd3\xf5\x2e\xdc\x07\x88\x54\xd8\xbe\x11\x33\x9a\xdd\x3e\x48\x8b\x00\x69\xdf\xbf\xfa\xa3\xac\x97\x99\x7a\x99\x04\xe3\x94\x6b\x03\x93\x79\x7f\x7d\x90\xc8\x71\xb3\x7a\xcf\x03\x09\xc4\xe6\xbd\x85\x51\x2e\x4f\xda\xd8\x60\x1a\xc9\x04\x84\xe9\xf4\xca\x96\x19\xa1\x47\xfc\xf4\xde\x8c\x7c\x5d\x53\x92\x56\x80\x57\xba\x1b\xde\x9f\x8a\x22\x45\x7c\xf8\xe9\xb8\xa6\x9c\xf4\xc2\x60\xc2\x55\x94\x24\x48\x08\xe1\x3e\xd5\xee\x85\xce\x7d\xd1\xf1\x60\x96\x21\x3b\xdc\x4d\x31\x01\x49\xa9\x48\x53\xb4\x24\xfe\xeb\xef\x8c\xcd\x14\x7d\xaa\x08\x23\xd4\x21\x38\xeb\x06\x6e\x2b\x59\xa2\x3e\xd7\xc8\x78\xff\x4b\x0c\xad\xd8\xec\xdf\x1e\x90\xf4\xaf\xf4\xdf\x63\xc3\xa6\x08\x8f\xec\x58\xfa\x4e\x16\x3e\x07\x35\x8b\xf8\x15\x91\x1c\x71\x1c\xea\xfc\xb1\xf2\xfc\x03\x93\xd9\x52\x44\x59\xc4\x29\x22\xb0\x6e\x94\x7c\x50\x69\x2a\x51\x5d\xc4\xf3\xf8\xfe\x01\xf9\x24\xad\xa4\x52\x4a\x10\xfb\x8c\x5f\xc4\xf1\xdc\xc2\x05\x95\xfe\xdc\x9d\x59\xd8\xa8\x55\x0a\x49\xc2\x83\x3a\x72\x55\xdc\x00\x5c\x70\xc9\x32\x95\x65\x29\x73\x34\x4f\x6f\x39\xfc\xea\x19\x9c\x86\xd7\x91\x75\xab\xcd\x95\x88\x71\x83\x5d\xee\x5f\x50\x99\xe0\x99\x0a\x82\xa8\x9b\x77\x0d\xa7\xcb\x86\x5f\x95\x49\x89\x5c\x97\x4f\x9b\xdd\xe6\xe9\xe7\xc6\x7f\x3b\x93\x26\x58\x95\x19\x85\x28\x1d\x69\x8c\x67\xa2\xf0\x07\x58\x96\x60\xd2\xa0\x79\x91\xe4\x3b\xbc\x2f\xa6\x99\x15\x93\x89\x23\xe4\x93\x47\x08\xdd\x26\xb3\x3b\x65\xda\x62\x07\x6e\x51\x3d\x4f\x9b\x48\x14\x33\x11\xf6\x35\x6e\x4c\xde\x5e\x57\x5d\xc0\xbf\xe4\x00\x29\x41\x8d\x65\xbe\x2d\x66\xaa\x57\xcb\x94\x60\x49\xa0\xd3\xe8\xec\x9c\xb3\x93\xd3\xb3\xb5\x63\x7d\x44\x45\x5b\x47\xbb\xe2\x58\x98\xe7\x15\x67\xa5\xa2\x24\x72\x7c\xab\xad\xac\xd7\xe7\xfe\x37\x54\x6c\xd0\x7c\xec\x1e\x1e\xbf\xc8\x84\x85\xc1\x89\x41\xe2\x8e\x03\x6e\xfd\xd8\x9d\xb5\x35\x1b\x27\x55\x35\x1b\x49\x8c\x13\x6a\x6e\x5f\x1c\xbe\xb0\xff\x3d\x6a\xb8\xef\x6b\xab\xce\xed\x65\xab\xae\x52\x20\x89\x1c\xe1\x71\x6f\xf3\x66\x91\xa8\x92\x29\x4d\x04\x46\x2b\x4e\xbd\x60\x2d\xcb\xaa\xcc\xb5\x2c\x86\x20\x63\x1c\x9b\x5c\x34\x17\x2b\xad\x05\xd6\x63\x7b\x91\xb1\xaa\xb4\x79\x00\x6a\x28\x0d\x02\x49\xc0\x15\xb4\xdb\x60\x06\x95\xc9\x42\xdf\x44\x69\x7c\x2c\xf7\x7f\xce\xf0\x89\xb8\x3d\x53\x10\xbb\xc0\xfb\x54\x57\xc7\x6a\xdd\x4b\x37\x33\x65\x69\x86\x85\x84\x9e\xd3\x75\x66\x7b\x2c\xc8\x20\x54\xfc\x6d\x86\x49\x70\x23\x74\x4c\x69\x14\x7a\x71\x73\x73\xf5\xe1\xc0\x55\x50\xaf\x5c\xb7\xda\x14\x25\x19\xce\xb1\x69\xe2\x88\xba\xe1\xea\xfc\x11\x42\x12\x4d\xa8\x44\x9a\xd1\xe6\x04\x58\x07\xec\x3c\xaa\xa5\x76\xbd\x30\x5c\xb0\xb4\x87\x01\x56\xe5\x04\x9b\xfa\x63\xc0\x34\xfa\xd1\x69\xe2\x6a\xc4\xea\x9c\x17\x66\x6b\xa0\x6c\x73\x9b\x7f\xce\x5e\x30\xe9\xe1\x0a\xfc\x19\x63\x1e\x8d\x51\xd1\x75\x68\xfa\x1d\x7f\x12\x3a\x95\x09\x6a\x90\x7c\xdb\x8d\xaa\x62\x3a\x55\x06\x78\x2f\xd3\xe4\x2a\x92\x9f\x3c\x60\xa6\x0d\x84\xfe\xbd\xa4\x37\xf6\xd9\x60\xec\xb3\x7f\x87\x91\x90\x11\x07\xb0\x7b\xbf\xbe\xff\xfd\xeb\xdd\x4e\xa3\x8a\xa1\xef\x3b\xc5\x8e\xa7\xbe\xf9\x67\x91\x10\x43\x53\xcd\xd0\x4f\xf2\xf4\xc9\x7f\xc8\xa2\xe8\xa3\x35\xcd\x92\x0c\x13\xa6\x48\x6a\x66\xab\x7a\x0d\x43\x59\x68\x51\x89\x75\xf9\x9f\xc1\x32\x6b\xc6\xb5\x2f\xfd\xbb\x12\xc9\xf4\x66\x98\x75\xe4\x9a\x65\x85\x68\x80\x60\xfe\x34\x8f\x9d\x8e\xf9\xbe\x8b\x1d\x9e\xee\x7e\xef\xff\x4e\x22\x84\x14\xf6\x1a\x53\x5e\x80\x37\x1c\x36\x12\xb2\xa9\x5a\xfd\x6d\x5e\xbe\x42\x3d\x22\xc3\xf1\x43\x05\x4d\x10\x0c\xed\x1a\x56\x57\x65\x59\x9d\x4b\x1d\x7c\xaa\x30\x86\x59\xdf\xdc\xd1\x0b\xe4\xcd\xee\x5f\x1a\x13\x93\x50\xa9\x35\x9f\xc1\x0f\xb5\x8e\x2d\xc6\xb5\x27\x59\xb7\x1f\x87\xd0\x4c\xac\xb5\x8c\x31\x02\x2d\x30\x07\x2c\xf3\x23\x98\x11\xd5\x3c\xd3\xda\x28\x0f\x39\x6a\xdd\x6b\x9a\x87\x20\xfd\x38\x87\xd5\xf1\x9a\x52\x0e\xdc\xec\xbd\xd3\x71\xfa\x68\xc6\x58\xcb\xb4\x89\x1c\xe9\x38\x0a\x0c\xeb\x57\xf0\x44\xba\x87\x26\x3f\x9e\x67\x56\x51\x1b\x41\xc8\x88\x86\x6b\x91\xd1\x7b\x6a\x17\x8c\x14\x28\x58\xb5\xd2\xdd\x46\xdb\xa0\x33\x54\x9d\xaa\xe2\x63\x7e\x65\xa9\xb0\xff\xd4\xc2\x54\xdc\x99\x69\xc8\x9c\x50\x52\xdf\x98\xf2\x60\x1f\x1c\xc2\xa3\x5f\x29\x40\xad\x03\x99\x96\x4e\x00\x76\x76\x6d\xb0\x3c\xf1\x32\xd2\x37\x55\xfd\x9c\xbf\x81\x41\x6e\xc8\xc9\xa7\x6d\xc1\x51\x95\x5c\xaf\xfe\xe9\x2f\x6b\xe2\xc4\xa9\x90\x39\x3f\x6e\x42\x9b\x31\x24\xd4\x2e\x18\x6e\x47\xdb\x80\x89\x45\x1c\x1c\x2f\x4c\x50\x69\x1f\x77\xc7\x9f\x74\xad\x99\x58\x13\x39\x46\xe4\xae\x5f\xc6\xed\x09\x8b\x91\xa3\x89\xad\x63\x2b\x73\x2d\xf9\x21\xdd\x6f\x92\x98\x22\x16\x1c\xad\x63\x5e\x3e\x37\x07\xcc\x5c\xf6\x87\x89\x42\x78\xa3\x2f\x71\x2d\x47\x99\x61\x2c\x35\x14\x86\xae\xe3\xb2\x6a\x9f\xc0\x09\x50\xad\x7a\x77\xc8\x24\x2c\xd1\xfe\xbb\xbb\xc9\xeb\xa6\x45\x16\x8c\xa6\x27\x86\x67\x86\x48\xc7\xb4\x72\x5b\x3d\x3b\xef\xdb\xac\xab\xe3\xa9\xc8\xbb\x69\x79\xac\xab\xca\x2e\x92\xba\x31\x93\x26\x56\x47\xc1\x0f\x71\xd5\x01\x6f\xb0\xa6\x73\x97\xc5\x31\x62\x11\xb1\x5d\x05\x93\x72\x3e\x72\xbd\x19\x02\x4e\x93\xc5\x82\x89\x51\xc2\x72\x60\xed\x6c\xc7\x70\x40\x43\x95\x4c\xe2\xa0\xf9\xd4\x6b\x82\x8c\xdd\x7c\x43\xb5\x6b\xe5\x3e\xf7\x51\xd1\x6f\xe3\x49\xeb\xe6\x2c\x0a\x01\xf2\x65\x68\x68\xa8\xb1\xc8\x4a\x70\xb5\xdd\x0f\x93\xc8\xd2\x18\xa3\xf8\xdd\xea\x76\x73\xd8\xdc\x5f\x1f\xae\x57\xfb\x4d\x7f\x90\xb3\x80\x1a\x5f\x6f\x1e\x66\x97\x63\x22\xc3\x78\xdb\x65\x9e\x06\x89\x48\x66\x78\xda\x13\x30\xdd\xc9\xbc\xf4\xf9\xe9\xba\x5d\x95\x26\x28\x25\x2f\x5a\x2c\xc3\x99\x48\xd2\x91\x80\x7f\xe7\x27\xfe\xd9\xfd\xea\x6f\x4b\x9b\x8a\xe1\xd2\xe9\x23\xae\x2b\x54\xa7\xcb\xdb\xed\xfa\xe1\x33\x98\x66\x38\xc5\x2a\xc1\xfa\x4e\xd2\x5b\x79\xae\x41\xb6\xd5\xe4\xc3\x34\x82\x48\xe6\x01\xc7\xc8\x59\xf1\x59\x0b\x91\x11\x69\x8c\x0e\x64\x17\xeb\x3e\x3e\x6d\x7f\x8e\x66\x4e\x64\x3a\xd8\x90\xce\x7c\xca\x87\xf3\x5b\x6e\xaa\x3a\x9f\x21\x36\x8c\x90\x1a\xe3\xb2\x7b\xf8\xe5\xd2\xa3\x77\xf2\xf5\x13\x16\x1f\x23\xa3\x08\xfb\x33\x76\xa7\xbc\x34\x05\x4c\x96\x86\xcc\x34\x6e\x1a\x4a\xb6\x45\x55\x9b\x81\x26\xc3\x48\xe3\xa4\xfd\xf2\x32\xbf\x50\xee\x9f\x14\x04\xc6\xf9\xc5\xd1\x5e\x6a\x94\x00\xee\xf6\x52\x78\x93\xc5\xb9\x0b\x30\xf7\xdf\x17\xbc\x38\xa3\x64\xcc\x49\xa0\x12\x46\xbf\x5d\xaa\x02\x9a\x11\x23\x8c\x51\x92\xe3\xfe\xa7\xce\x1f\x03\xd1\xf0\x74\x52\x75\x22\x10\x6b\x7c\x38\xe8\xaf\x80\x11\xc6\xc4\x8e\x90\xc2\x73\x22\xac\xf4\x92\xc0\xd7\x85\x60\x24\x33\x86\x70\xe4\x92\x3a\x15\xb2\xec\x3e\xb0\x21\xf6\x34\xdd\x0b\x85\xde\xaa\x5f\xcb\x76\x26\x31\xc6\x8c\x51\x0e\xe9\x75\x2c\x3f\x6e\xc1\xb6\xdb\xd2\xb3\xca\x86\x2b\x40\x2c\x53\x2f\x65\xd2\xf6\xaa\x0c\xd0\xac\x82\xba\x79\x73\x49\x20\xd3\xdf\x18\xc4\x16\xbb\x4b\x6d\xfe\x3e\xa2\xd2\xae\x3f\x76\xf8\xd4\x8b\x74\x57\x06\x12\x27\xeb\xf9\xfd\x5c\x3e\x77\x27\xf4\x2e\xa2\x81\xc4\xd5\x42\x57\x98\xc4\x18\x65\x1c\x0c\x08\xf0\x56\x44\x55\xf3\xf2\xb4\x01\x2b\xb1\x10\x54\x95\xc5\xc7\xea\xa8\x64\xd3\x48\x33\xa4\xc3\x8d\xa5\xae\xb3\xf1\x98\x97\x8f\xb5\xb7\x79\x03\x0e\xa7\x1f\x65\xd5\x40\x82\xf3\x04\xcf\xe7\x42\xd6\x8e\x46\xc5\x0d\x80\x28\xa3\xd2\x37\xa2\x21\xed\x46\xfd\xdb\xd2\xc7\x0a\x11\xa3\xa9\x8f\x07\x3d\x5a\xfb\xe6\x0c\xc5\x3c\x18\x84\xc8\x3a\x4e\xcd\x43\xc0\x1d\x4d\xf2\x6b\x10\x47\x89\xc8\x1c\xef\x70\x0d\xc6\x2b\xa8\x4f\x7f\x28\xce\x12\xe5\x10\x9b\x08\x3e\x73\x4e\x55\x38\x66\x99\xb1\x3d\x56\x78\x75\xc1\x0d\xcb\x20\x21\x19\x36\x4b\xa8\xc0\x4b\x35\x3b\x6c\x1c\x28\xab\xaf\x58\x20\xb5\xdb\xf8\x35\x42\x9a\x46\xf8\x1a\x7f\x3e\x01\xb4\x3f\x42\xad\x03\x32\x9e\x22\x6a\xd2\xeb\x91\xaf\x9e\x76\x9b\xf5\x61\xfd\xb4\xb9\xde\xee\x0f\xbb\x1f\x8f\x8f\xb7\xc1\x71\x00\x9a\x45\xf8\x5d\x1d\xf3\xf2\x90\xf7\x90\xf8\x83\x17\xa3\x1b\xf5\xe8\x01\x4b\x38\x72\xaf\xba\x4e\xcc\x2e\x8c\xdb\xbc\x9f\xaa\x7a\x3e\x23\x2c\x71\xd5\x00\x5f\x27\xbd\x86\xa2\x47\xca\x02\xd3\x51\x42\x7c\xdc\xe8\xa6\x7a\x5f\xcd\xb2\x70\xc0\x20\x89\x3d\xb3\x75\xff\x27\x0b\x58\xd8\x78\xb8\xdf\x3c\x6e\x9e\xd6\x9b\xfb\xbd\x4b\x72\xec\x0e\x8f\x9b\xa7\xc3\x90\xc8\x05\xae\x13\xf4\x5b\x9d\x40\x56\xae\xab\xba\x9c\xf8\xe9\x20\x22\x89\x26\xa2\xb2\x16\xea\xab\xaa\xae\xab\x5f\x41\xac\xed\xcb\xa8\x05\x44\xe6\x00\xbb\xa7\xb3\x7a\x85\x8f\x20\xa3\xc3\x40\xc8\x08\x01\xa8\x36\x2f\xa0\x59\xc6\x4a\x81\x50\x71\xa8\xe7\xad\xea\xfa\x16\xca\xe7\x61\x52\x85\x4d\x84\x03\x42\x19\xbc\x8b\xc9\xcb\x95\x11\x55\x7c\xdc\x35\x8e\x53\xd6\x99\x8f\x70\xba\xa4\x36\x09\x95\x92\x4b\xa0\x05\x48\x2d\xb0\xaa\xe4\x80\x4a\xe3\xaa\x6b\xf0\x58\x40\x89\x4c\xbb\x45\x2a\x5d\x7f\xea\xe1\x2d\x0e\x94\x8e\xa0\xb4\x8d\x7a\x0d\xf4\x66\x22\x5e\x17\x46\x40\xea\x5c\xf9\xbf\xac\xeb\x7e\xba\xb3\x82\x4e\x74\x50\x8b\x5a\xbd\x3d\x3f\x9e\xfa\x8b\x1b\x12\xa3\x02\x47\xf7\x6d\x16\x98\xd6\xef\x53\x07\x60\x78\x1c\x0d\x0a\xef\x18\x86\x5c\xd7\xb9\x9d\xcf\x80\xb1\x91\x60\x7e\x45\x3c\x42\x3d\x22\x30\x0b\x17\x02\x29\xb0\x44\xbf\xee\xfe\xdf\x42\x52\x17\x00\x2c\xda\x24\xbf\x5d\x3c\x94\x97\xbd\x0e\x60\xb9\xc0\x92\xd4\xf5\xe6\xe7\x61\xbf\x59\xdd\x1d\x1e\x1f\x9e\xf6\xbd\xf4\x3f\x03\x2b\x38\x96\x3b\x37\xef\x8e\x89\x64\xe9\x77\xac\x8e\xd0\xcb\xc5\x6f\xd6\x9f\x68\xa3\xc4\x62\x7e\x56\x57\xf5\xd7\xb4\xd8\xcc\x46\x19\x60\x58\x32\xb4\xef\xbb\xf5\xf2\x58\xc3\x56\xcf\x7a\xa6\x6c\x44\x25\xba\xc9\x8e\x52\x1f\x69\x66\xe7\xc1\x5a\xd8\x5e\x6c\x44\xad\xb5\x43\x48\x7c\x93\x17\xc5\x8f\xd3\xec\x7a\x71\xa2\x39\x8c\xfc\xaf\x55\xb3\x3d\x76\xc6\x21\x2f\x9f\x97\x59\xfd\x99\x8d\x95\x42\xf6\x98\x53\x0d\x36\x7f\x07\xf3\x5d\x36\x2f\xc9\x7c\x8c\xcd\xd0\xb5\xfd\xfd\x5c\xc3\xa8\xed\xd3\x26\x69\x84\xeb\x5e\x62\xa8\xb6\x93\xba\xee\xc2\xfe\xd9\x5b\xb1\x89\x51\xb8\x5f\x4d\xe5\xf3\x51\xda\x32\xd8\x16\x4b\x04\xc3\x78\x4c\xa1\x31\x80\xda\x35\x60\xdd\xe4\xb2\x9d\x64\x8f\x2d\x11\xd2\x93\x69\xbf\x42\x89\x19\xc8\x49\x26\xc2\x12\xc9\x12\xd7\xd5\x90\x37\xd3\x2c\x96\x25\x56\x51\x11\x96\xaa\x7e\xc9\x4b\xf8\xbb\x54\x3d\xb3\x37\x9c\x0a\x8e\xfb\xbc\x27\xe3\x43\x25\x3d\x28\xcd\x1c\xa6\x64\x53\x15\x65\x3d\x41\xd2\xb1\xd2\xd8\x84\x34\x09\x54\x6c\x16\xc9\xc4\x04\xd0\x80\x9e\x02\xea\xc2\x10\x46\x11\x8a\x1c\x52\xf6\x37\x75\x75\xf4\x41\xcd\x72\x5d\xd0\x52\xa1\x11\x4f\x87\x65\x33\xd7\x5f\x55\xd5\xdd\x8f\x07\xe2\xcf\x51\xd6\xaa\xff\x27\x9c\x0b\x94\xf9\xb6\x85\x95\x67\x5d\xff\x36\x17\x8b\x60\x96\x29\x10\xee\x6d\x55\xdd\x2a\x9b\x55\x64\x2d\xcf\x74\x90\x63\xfb\xd1\x98\x4d\xfb\x32\x5b\x10\x5c\xbb\x4a\xcb\xb3\x3c\xc2\xe3\x20\xf1\xcf\x2c\x37\x4c\xc9\xc0\xa3\x6b\x3c\x8e\x77\x7a\xae\x20\xe0\x9a\x50\x26\x24\x83\x77\x70\x5c\xe6\x13\xb5\x92\x64\x01\x4e\xe4\xfc\xf3\x49\x0f\x97\x55\xb1\xc1\x82\xcc\x76\xfd\x30\xaf\xec\x58\xa5\x65\x08\x4f\xbb\x25\x5b\x42\x71\x03\x97\x04\x63\xb3\xc9\xd7\x89\x43\x10\xd8\xaa\x28\xaa\x5f\x4b\x60\x45\x6b\x80\xa3\x85\xc0\xa6\xbb\x6f\xbb\xfd\x38\x79\x64\x21\x72\x55\x31\x2f\xbc\xfc\xc7\x66\x1b\x6e\x15\x58\x86\x5c\x1a\x9d\x8d\x1d\x5a\xb9\xfa\x2f\xc8\xc6\x04\x4d\x14\xea\x62\x79\xb0\x6a\x9f\xe2\xb2\x56\x31\x6c\xf3\x3c\xf9\xb6\xd2\xa7\xa1\xa4\xca\xa3\x88\x2a\x44\x86\x1c\xe5\x2b\xdc\xe6\xff\x39\xe7\xe6\xb1\xce\xc3\xc1\x38\xa1\xd1\xdf\x83\x0c\x7d\x01\x45\x09\xd7\xa2\x31\xf3\xd5\xb4\xc9\x8a\xe2\x51\x0c\x8e\x3e\xa0\xcf\x98\x99\xdb\xea\xf9\xb9\xf3\x47\xa6\xe3\x12\xea\x38\x47\x3c\xba\xb2\xf3\xcb\xdd\x32\x5d\xfc\x16\x78\x94\x68\xa9\xf5\x14\x23\x7c\xf5\x81\x3e\xa0\x93\xd4\xf9\x80\xc5\xd0\x94\x47\x84\x51\x04\x47\xae\xf3\x9e\xbe\x63\x40\x79\xf2\x88\x18\x0e\x8e\x28\xeb\xde\x57\x7a\x7e\xdc\x6f\xf7\xe1\x68\x9a\x12\xac\x83\x8c\x40\x3e\xf8\xe5\xc5\xfd\x00\x9a\xe2\xbb\xb4\xe7\xd2\x34\xfb\xca\xfb\xbb\xd3\x5b\x4f\xa9\x25\x2e\x07\xd5\x05\x8b\xb8\xb5\x7a\x8b\x76\x0b\xe6\x79\xa1\x5e\x36\x3b\x5d\x25\xda\xe9\x6b\x3b\x41\xa0\xf0\xd3\x0c\x9c\x44\x74\x58\x09\xf7\x55\x38\xc2\x13\x17\x3d\xbd\x55\x3d\x22\xaa\xff\x1a\x78\xc4\xa9\x8d\x5d\x77\x9e\xd9\xec\xbf\xdf\x85\x4d\x80\x47\x5c\xbb\x24\x4d\x67\x72\xc3\xf7\x38\x31\xbd\x3c\x12\x91\x44\xf7\xbc\xa8\x9e\x77\xbf\x00\x2e\xd3\x53\xcb\x2f\x4f\x68\x97\x56\xce\x1b\x2f\x2a\xeb\xc3\x83\x7e\xe1\x0a\xcd\x70\x80\x5f\x95\x3d\x5d\xf7\x6c\x26\x85\xb1\x18\xf4\xdd\x41\x2b\x7d\x1e\x69\xa1\xf8\xc5\x23\x49\x08\x06\xca\xdd\x5b\x91\xb5\xd7\x22\xb9\x3a\x4f\x8b\x6c\x3c\x92\x96\x05\xf6\x76\x44\x12\x7e\x4a\x1d\xc2\x23\xc5\x39\xf2\xb6\x7e\x56\xcb\xe2\x7e\x9c\x4e\x68\x84\xd0\xb4\xf5\xea\x7a\x75\xa8\x1d\xdc\xa9\x39\xbc\xc8\xda\x1c\x7a\xc6\x7d\x1e\x69\x49\xe9\xc0\x3e\xb0\x71\x68\xa6\xfe\xbe\xb4\x89\x02\xab\xec\x15\xb4\x5d\xd4\xbe\x72\x6a\x29\xb3\xe9\x30\x92\xfe\x3f\xac\xbd\x59\x73\xe3\xb8\x92\x3d\xfe\x75\xfa\x61\x1e\x08\xae\xc0\xa3\x6c\xcb\x65\xdd\xf6\xa2\x6b\xc9\x5d\xdd\x33\x31\xa1\x48\x00\x09\x9b\x6d\x8a\xd4\x90\x54\xb9\x7c\x3f\xfd\x3f\x98\x00\xb8\x49\x72\xf5\x2f\xe2\xff\xa4\x08\x11\xdc\x40\x2c\xb9\x9c\x3c\xc7\x8c\x85\xce\x16\x45\x31\x76\xb8\x78\xa0\x75\x9c\xda\xf8\xc9\xdf\xc7\xa6\xbd\x45\xbc\x50\x5e\xcd\x03\x0c\x2c\x33\x2f\x09\xec\x13\x48\x28\xf0\x17\xc1\x94\x13\x8c\xbf\xf3\xa4\xc7\x2a\xc3\xb3\x6f\x6c\x44\xc2\x71\x14\xbe\xb4\x01\xe5\xaf\x04\x81\xe7\xbf\xce\x40\xe2\x2c\x08\x33\x69\x4b\x17\xd7\x75\xbe\x87\xfa\xd3\x83\xc1\xa6\x6b\x08\x0b\x42\x24\x76\x09\x5b\x14\xf7\xdd\xdb\xa0\x9d\x25\xab\xa9\xe2\x79\x0d\xb5\xc2\xe2\xcf\x89\x75\x38\xab\x16\xe7\x2c\x40\xa6\x6d\x34\x94\x10\xa8\xfe\x1a\x8c\x09\xee\x88\x34\x57\xaa\xb2\x7b\xca\xe8\x4b\x33\x16\xc5\x64\xa2\x96\x15\xbc\x8d\x02\x40\x9c\x31\x1d\x63\xe0\x9c\x32\x5b\x98\x75\x05\xad\x7a\xbb\x18\x6f\xe0\x2c\x14\x9c\x00\xb6\x95\xfc\xbb\xa7\xcd\xe3\x2c\x34\x9c\xbc\x95\xdb\x63\x7b\xac\xa9\x36\xe5\xec\x42\xc1\xfe\x99\x06\xe8\xec\xa5\x23\xc6\x95\x63\x2b\xdc\x1d\x4b\x63\x41\x28\xfe\x58\x64\x75\x9f\xda\xce\x96\x2d\xa1\xc5\xa5\xd3\x4b\x9c\x93\xa4\x9c\xfe\xf8\xce\x89\x40\x91\x65\x45\xe2\x0e\x13\x8e\x6b\xce\x22\x6d\x75\xbf\xda\xea\x75\x24\x98\x4d\xa5\x0b\x63\xde\x2d\xce\x62\xae\x03\x8f\x45\x87\x16\x5f\xab\xfa\xf3\x0f\xcb\xee\x3c\x7d\x97\x18\x22\xd2\x3c\xb7\x1b\xdb\x93\x59\xb4\x6f\x05\x5a\x1d\x8e\xb1\xff\xc7\x59\xac\x21\x52\xa3\x21\xea\x2b\x41\xa6\x97\x4b\x92\x2c\xcc\xdc\x26\x3a\xa0\x9b\x88\xea\xc3\xb7\xc8\x2c\x99\xda\xa6\xaa\xfb\xb7\x4a\x04\x9a\xb4\x0f\x67\xae\x54\x35\xb5\xa5\x38\x4b\x94\x8a\x1c\xd4\x45\x55\x3f\xb0\x7e\xc4\x0f\x9b\x34\x3c\xd9\x82\x87\xb5\x9a\x25\x26\x48\xdc\x20\xdc\x12\x74\xf4\xbc\xc2\xe2\x74\xcb\x63\x89\x49\x28\x49\x0e\x5a\x3f\x40\xf9\xb9\xad\xae\x0a\x50\xef\xc4\x79\x3b\xf5\x45\x38\x4b\x05\x5a\xdc\xb9\x4d\xf1\xff\xc8\x35\x5a\x51\x54\xbf\x86\x30\xd2\x9e\xb5\x84\x64\x58\xb6\xf9\x0f\xbc\xad\xea\x3b\xaa\xda\xf5\x2d\x32\xc6\x69\xb5\xb5\x1b\x14\xc9\x9e\xb8\x23\x3c\xb0\xf1\x09\x55\x54\x4d\x5e\xbe\x8e\x92\x5b\x9c\x89\x44\x70\xdd\x77\x58\xf7\x9c\xdd\x5a\xe1\x76\x06\xaa\xd8\x3c\xf3\xb8\x22\xd1\xb4\x16\x7d\xbb\x79\xfa\x82\x81\x83\x33\x91\x59\x2c\x8f\xd5\xfe\x2b\xaa\x1a\xeb\x81\xb5\x8d\x33\xc1\x91\x74\xc1\x9f\xef\xaf\x2d\xb6\xaf\x2f\x5d\xe0\x0c\x02\x63\x6c\x5c\xfa\x47\xf5\x8e\x73\xda\xfe\x39\x96\x65\xda\xf1\x80\x96\x1d\x71\xb9\xbd\x73\xc6\xc4\xf2\xcf\xeb\xbb\xc5\xe3\xb7\xe5\xee\x79\xb1\x5d\x3d\xf9\x7b\x48\x6d\x21\x26\x1f\x48\x51\x6d\x3d\xd0\xf6\x9d\x40\xdf\xdc\x19\x2a\x70\x7b\x73\x67\x14\x76\xbb\x64\x35\xe6\x05\xe3\x4c\x41\x46\xf0\xa6\x8f\x31\xb3\x89\xcf\x63\x8f\xaa\xd3\x39\xd3\x46\xca\xd4\x2d\x4f\xbe\x22\x75\xcc\xea\x3b\xbd\x2f\x32\x9b\x1a\xd3\xd8\xcb\x25\x4d\xe7\x14\x46\x82\x20\x5a\xbf\x02\x79\x70\x66\x20\xa3\xca\xaa\xd7\xfc\x07\x96\x23\x51\x0c\xce\x0c\xf2\x50\xf8\x30\x7f\x9f\x3e\xba\xbc\x60\x86\x81\xb6\x51\xcb\x9e\x77\x0d\x0a\x1c\x5f\x31\x0c\x4c\xec\xe7\xcd\x23\x7e\xf4\xc5\xc8\xf5\xd4\x67\xe6\x61\xd7\x6f\xcc\xf1\xa2\x9f\x06\xd2\x79\x18\x9a\x94\xdc\x3a\x72\xa8\xef\xab\xf9\xb6\x19\x46\x41\x44\xd0\xee\x9d\x9c\x25\x98\x79\x18\xa9\x90\x02\xd0\x6f\xd5\x87\x9d\x84\xa7\x96\x61\x18\x21\xb7\x2b\x17\xf4\xc9\xa8\x13\x32\xbf\xb3\xc9\xb9\x51\x8a\x8e\x87\x91\x91\x64\xc2\x7e\x90\x03\xdd\xed\xbb\x57\x55\xfb\x76\x5b\xd5\x38\x2f\x20\xe4\x61\x1c\x6a\xed\x3a\xe6\xfe\xfe\x0f\xcb\x4d\x10\x26\x93\x4f\x1a\xc6\x71\x40\x36\x2d\x61\xa7\xbf\x57\xf5\xbb\x0f\x7a\x3b\xe7\x92\x87\xb1\x48\xb2\x6c\x54\xfd\x09\xaa\xa5\x58\xd2\xf4\x5e\x49\xa0\x09\x28\xdf\xcd\x86\x7f\x7b\xee\x46\x1e\x26\xa1\x54\x0e\x6c\x8b\xab\xe6\x5b\x35\xac\xf8\x61\xca\xb8\xaf\xfc\xb7\xd1\x61\x17\x02\xf4\xfd\x95\x86\x9a\x5c\x68\x3b\xb7\xee\x9e\x6e\xee\x77\xe2\xa1\x3f\x39\x61\x06\x7b\x02\xee\x13\x22\x59\x1e\x66\x29\xd2\x46\x4f\xa3\x66\xcb\x97\x7f\x6e\xaa\x42\xef\xbe\x2d\x1f\x97\xcf\x3e\x40\xc4\xc3\x8c\xdb\x5c\x3a\xad\xfe\xb9\x7a\x8b\xcf\x9b\x3b\x61\xa6\x63\x42\xf9\x0c\x0e\xc5\xf4\x38\x37\x2a\x12\xbd\x85\xf7\x8c\x87\xaa\x6e\xb1\x3e\xf5\x5c\x79\x28\x58\x40\x91\xfc\x65\xe7\x61\xd4\xb9\x7a\x29\x73\x12\x92\xe8\x8f\x87\x60\x35\x73\xde\x1c\xab\xc2\xad\x67\x8d\x1b\xee\x26\x83\xd4\x43\xd5\x97\x7b\xc8\x8b\xe9\x07\x95\x89\x24\x59\x86\x55\x63\xd1\xa6\x7a\x46\xda\xe3\x9b\x01\x23\x83\xe3\x1b\xd5\x09\x8c\x9c\xa4\x50\x45\x8a\xc2\xff\x37\xcb\xdb\xc5\xcb\xbd\x15\x5c\xbb\x7f\xba\xfe\x7d\x77\xf3\x42\xeb\xda\xe3\xa8\x21\x2d\x9e\x16\x73\xba\x5d\xdc\xbb\x65\x70\x1c\x23\xe7\xa1\xe2\x16\xea\xe3\x65\x06\xb1\x1d\x41\xb2\xff\x9f\x0a\xae\x78\xa8\x23\x2b\x72\x48\x5b\xcb\xf9\x4f\xa5\xd3\x80\x9c\x16\xbc\x3a\xb6\x6d\x6f\x24\x86\x1a\x6d\x34\x98\x60\x64\xd7\x23\xfb\x3b\xc4\xc0\x60\x30\xd0\xb7\x90\x40\x55\xdd\x73\x3f\x5e\xf0\x8c\x2f\x3c\x1f\x9a\x20\x51\x83\xc6\x70\x35\x61\x01\xe6\x11\x0b\x2c\x07\xcf\xa1\x37\xcc\x9f\x51\xe5\x87\x1c\xcb\x96\xf5\x6d\x50\xd3\xc7\xfd\xeb\xe9\xe5\xdf\xab\xc5\xe3\xd5\xea\xab\xad\x2f\x0a\x65\xa2\x3c\xbf\x58\xd9\xb4\x50\xb6\x44\x11\xda\xdb\x14\x51\x88\x71\xec\x40\x90\xeb\x1a\x75\x7e\x36\x5d\x77\xf6\x97\x9f\x44\x05\x26\x03\x28\x8a\x18\x4b\x5c\xe5\x8c\xa5\xf8\x68\x4e\x3a\x6b\x76\x42\x8c\x54\xc8\xd3\x1c\xe5\x4c\x71\x73\xd2\x89\x51\x94\x59\x62\x6c\x8f\x0d\xdb\xd6\x47\xbc\x85\xa2\x9f\x23\x51\x24\x58\xe6\x23\x3c\x56\x5a\x8a\x22\xec\x16\xd9\xd8\xb7\xb1\x6a\xdd\x36\x7d\xf4\x8c\xaf\x23\xe8\xe7\xff\xb0\x74\xe6\x16\x90\x5a\x92\x23\x1f\xdc\xfc\xdf\x14\x46\xce\xa3\x24\xc9\x40\xcd\xca\xdf\x1d\x29\xe6\x6c\xe7\x8e\x12\x19\x27\xae\xe9\x72\x7b\x37\xbb\x4e\x9a\xc4\x14\xd4\x6a\xda\xaa\xfe\x7b\xea\x6b\x47\x29\x47\xb2\xe2\x9e\x0e\x87\xb1\x7f\x11\x65\xa9\x21\x88\xde\x20\x2a\x3c\x44\x84\x7d\x13\xc1\xa8\x22\x33\xdf\x1f\x48\xf1\x3d\x2f\x5f\x77\xc7\x72\xac\xd9\x35\x06\x2f\x4e\x1f\x89\x8b\x00\x8d\xaf\xc2\xf8\x86\x6d\xb7\x64\xfc\xfb\x04\xba\xc5\x23\x11\x46\xcc\xf3\x21\xfd\x13\x80\x0b\x8f\x04\x0a\x82\xfa\x82\x7a\xc7\x7a\x0f\xe5\x79\xce\x06\x1e\x09\xa3\x2c\x2d\xf1\x4f\x1b\x98\x9d\xed\x9a\x11\xc4\x49\x66\x7d\xf1\x3d\xbe\x83\x7f\x67\x48\x91\xf8\x80\xf6\xaf\xfb\xf6\xaa\xd2\x9f\x36\x9c\x3c\xf5\xf8\x23\x50\xd2\x0c\x39\x37\x27\xf8\x3d\x7d\x4a\xc9\x84\x34\x5e\x85\x6a\xac\x82\x7c\x36\xdb\xc2\x23\x19\x31\x70\x81\xd6\x6e\xaf\x6c\xce\xc6\xa2\xf9\xf9\xd5\x21\x92\x89\x11\x6e\xdc\xbe\x94\x43\xa2\x41\xf7\xc4\x98\xbb\xf3\x6b\x5a\x24\x21\x25\x4e\xac\x9e\xbb\x64\xa2\x5b\x7b\xd1\x72\x8a\xa4\xb2\x3c\xbe\x2e\x0e\xba\xad\x0e\x07\xd4\x2f\xe7\x61\x46\x1e\x2e\x29\xdc\xb6\x1f\x29\xd4\x34\xac\x6e\x9f\x5e\x1e\x6f\x68\xdd\xdf\x5d\x2f\xd6\xeb\xe5\xcd\x58\x7d\xb3\x6b\x66\xeb\x9d\x54\xfd\x79\x68\xe1\x58\x4f\x46\xaf\x56\x82\xf0\x80\x9e\x81\xe0\x3b\x5e\xd6\xf0\xe6\x91\xc9\x2c\x7c\xcb\xe2\x97\x7a\x40\x11\x8f\x03\x13\x0a\x87\x0c\xd9\xe6\x58\xb3\x69\x7d\x8d\x6b\xc4\x22\xa6\x1c\xc6\x61\x71\x38\xf4\xdb\x59\xcc\x78\xe0\x79\x6a\x36\xa8\xea\x79\x0c\x33\x0e\x23\xcb\x35\x2b\xf3\x76\xff\xcb\x92\x4d\x1e\x87\x1c\xe8\x95\x72\xca\xd0\xf4\x9a\x48\x67\x87\x4b\x1c\x45\x2c\x46\xbf\x46\xd2\x2e\x3c\x72\x4c\xe2\x48\x88\xd4\x91\x06\x6f\xf3\xbd\xa3\xdb\xfd\x67\x52\x8b\x3c\x8e\xa3\x90\xc2\x08\x16\xb7\xfc\x47\x35\x83\xd1\xf3\x38\x8e\x23\xee\xae\xfe\x0f\xaf\x7c\xe1\x4e\x49\xc0\x28\x5a\xe4\x15\xd2\x4a\x38\x34\x6f\xd5\xbc\x1b\x13\x61\xad\xdb\xa7\x1a\x9f\x6a\x9c\x10\xe9\x5d\x0c\xa0\xc5\x89\xe2\x4a\x8f\x4c\xfb\x59\x49\x2d\x8f\x53\xa1\x48\xfe\xab\xc8\xdb\x16\x4c\x3e\x0d\x2e\xc4\x29\x44\x89\xc5\x0f\xe4\x9e\x39\x66\xc0\x95\xf0\x38\x0b\x24\x81\x65\x77\xf0\x33\xc7\x66\xb0\xf8\xf9\xec\x05\xb3\x50\x51\xed\x03\x15\x45\x5c\x13\x87\x0b\x0c\xdb\xe4\xd8\xfa\x8e\x33\xc8\xc8\xd5\x2c\xf1\xc3\x67\x7e\x26\xb9\x21\x1e\x0b\x16\xf4\xf9\xd8\xa2\xd8\x1e\xeb\xb2\xf3\xff\x7f\xeb\x8f\xca\xc8\x69\x0d\x38\x4f\xc6\x5a\xad\x94\x7f\x3e\x0f\x28\xe5\xb1\x64\xe8\x88\x21\x4a\xac\xa1\x5b\x30\x3e\xdb\xfe\x25\x95\xb4\xc2\x55\x58\x6a\x47\xed\x3c\xee\x02\x65\xd0\x72\x62\xed\x0e\x75\x55\x19\xbf\x34\xc6\x3a\x34\xda\xb1\x7a\xb6\x7f\x7c\xa9\x47\xe3\x4f\x70\x5c\x73\xc4\xeb\xd1\x74\x96\x67\xa3\xea\xea\xe3\xc4\x92\x98\x0e\x0a\x64\x09\xc1\xac\xba\x7f\x6f\xbf\xdf\xf8\xbb\x63\x6c\x37\x70\xbb\xe2\x7f\xbb\xda\x9e\x75\x83\x63\x4c\x13\xb2\xce\x7f\x40\x29\xf1\xe7\x16\x61\xdf\x3d\x6a\x5e\xbe\xda\xf1\xec\xaf\x66\x02\x4e\x49\x88\x83\x05\x3f\xfd\x0b\xd4\xfb\xa1\x6a\xe7\x54\x36\xb3\xf7\x31\x32\x4a\x6d\x41\xfa\xa1\xa8\xa6\xd0\xfb\xd3\xb6\x3a\x26\x2e\x98\x57\x68\x96\x87\x4a\x39\xf8\x01\x4f\x02\x65\xb3\x96\x1a\xe5\xf1\x75\x87\x54\xed\xd4\x0d\x7c\x09\x0d\x6e\x7f\x3e\x1d\xdb\xc3\x29\xf1\x9e\x3f\x55\xc7\x14\xf4\xfd\xfd\xf1\xe9\xfb\x78\xc5\x4c\x58\x20\x74\x2f\x19\xd7\x42\x31\x48\x63\xf1\x84\x45\x19\xc5\xd9\x4e\x60\x7a\xb7\x75\xb5\xbf\x81\xc3\xe1\xe4\x9d\x07\x43\x30\x61\x26\xcc\xac\x26\x2c\x91\xa2\xe7\xfa\x9c\x8e\x1c\x4f\x42\x99\x59\x6e\x6b\xca\x0d\xff\xd6\xff\xab\xc9\x2b\xf9\x98\xc8\x29\xf1\x13\xf2\x10\x9e\x84\x0a\x7a\xd6\xed\xcf\x03\x76\x4f\xb6\xd4\xf9\x30\x9b\x98\xbf\x51\x04\x81\x2d\x1b\x7c\xfe\x73\xd2\x01\x91\x11\x54\x68\xee\xe3\x94\x84\x70\xe9\x46\x35\xc2\x7e\x6a\x33\x25\xb1\x93\x6e\xb4\x41\x25\x32\xda\x3d\x0d\xf3\xd9\x41\x9c\xc4\x12\x32\x3d\x36\x1c\xf5\x79\x5e\xf8\xfe\x06\x52\xf9\xc4\x17\x3d\xe3\x35\x4c\x33\xf7\x3c\x49\x53\x81\xc2\x43\x56\x3b\x1b\xf3\x11\x7f\x5a\x9a\xa8\xd5\x89\x29\xe1\x4e\xc9\x04\x8b\x86\xa7\xb6\x1d\x19\xf8\x63\x52\xa5\x96\x7c\x38\x7f\x7d\xc5\x7a\xd3\x92\xe6\x42\x79\x84\xa2\xf8\x8c\xce\x7f\xb0\x6e\x93\xf5\xf4\xa7\x5d\x57\x4d\xaa\x37\x79\xc2\x93\x20\xb3\xd5\x93\x37\xfd\x5f\x2a\x4b\xfb\xca\x5b\xc7\xce\x32\xbd\x26\xc4\x29\xb9\xb3\xcf\x54\xe3\xad\x61\xef\x4f\x05\x61\x31\x01\x07\xea\x36\x53\xd5\xda\x15\xd7\x5f\xe8\x70\x99\x68\xaa\xc8\x25\x41\x33\xab\x59\x31\x14\x33\xce\x92\xbe\x3c\x91\x26\xa6\x1d\xfc\xba\x33\x25\xaa\xeb\xea\xf0\x39\x19\x19\x2a\x0c\x49\xaa\x17\xb4\x7e\xaa\xf3\xd7\xbc\x9c\xae\xbc\x89\x4a\x98\xcf\x19\x3f\x7b\x6e\x14\x5b\x00\x7c\x5b\xd5\x63\x19\xfa\xfe\x82\x99\x89\xdc\xea\x74\x41\x3d\xfa\xff\x6d\xa7\x4c\x74\x16\xf8\x78\x4b\xf7\x9e\x53\x81\x22\x9e\x68\x48\x08\x2d\xa1\x30\x2f\xce\x45\x88\x12\x6d\x14\x4d\xbe\xc5\x3e\x7f\xad\x06\x54\x21\x4f\x90\xc5\xc1\xc0\x74\x77\x8b\x67\x49\x95\x79\x82\x3c\x61\xe9\x40\x0c\x15\x6e\x8e\xfd\x97\x33\x61\x14\xbb\x2c\xd3\x63\xd5\x7a\x90\x80\x27\xde\x6e\xfa\x66\x29\x24\x04\x5f\xbc\xb9\x79\xde\x5d\x3d\xbd\x3c\x6e\xff\xf2\x68\xb1\xc5\xf5\xf5\x50\x14\xc7\x13\xa3\x04\x0d\x2c\xd2\xe1\x1d\xb8\xab\x79\x62\xd0\x02\x5f\xe5\x10\xec\x3e\x35\x4d\xd3\x80\x85\x32\xf0\x28\x0b\x2a\xb7\x52\x58\x3c\xf7\x60\x66\x9e\x86\x22\xb6\x8a\x22\xc7\xcf\xab\xcf\x6d\xb5\xaf\xce\x0f\xb1\x34\x4a\x43\x8a\xae\x52\xc5\x91\x8f\xab\x79\xa4\xd0\x6f\x7d\xa3\xc4\x53\xac\x53\xf4\xd5\x95\x35\xb8\x9f\xea\x3c\x6d\x3b\x4f\x23\xa5\x69\xfe\x93\x9e\x5c\xf7\x45\x7b\x19\x82\x33\x36\xf7\xd8\x4e\x48\x23\x23\xa8\x62\xb3\x2f\x5d\xd9\xb4\xd5\x61\x14\x64\x49\xe3\xc0\xe2\xbf\xf3\x66\x47\x66\xc7\xce\x16\x0e\x4f\x07\x44\x1a\x07\x09\x21\x36\x0c\xb6\xea\xcd\x2d\x59\x56\x32\xf1\xb6\xaa\x1f\x48\xc1\xbd\xb7\x86\xd2\x58\x6b\x57\xfe\xee\xc2\x9b\x4f\xc6\xe5\x1a\x67\x57\x4d\x32\x70\xa0\xe5\xf2\x7d\xba\xa4\xa6\x89\x56\x21\x0e\x12\x94\xd6\x27\xb2\x8b\xe4\x6c\xb0\xa5\xa9\x04\xb2\x08\xee\xa0\xae\x3f\x47\x83\x35\xcd\x82\x0c\xec\x16\x50\x6e\x2b\xaa\x6c\xef\x16\x99\x0b\xc6\x4d\x9a\x25\x91\xd5\xc0\x71\xec\x7b\xcf\xbb\x21\x39\x7f\xbd\x58\xf7\x17\x4d\x78\x8a\x3e\xd0\xf1\xe3\x6c\x69\x0c\x4f\x33\x6e\x5d\x80\xe6\xd8\x1c\x70\xee\xeb\xa5\x99\x54\x62\xc4\x4b\xfa\x0d\xfa\xc2\x12\x9e\xf2\x40\x51\x12\x9d\x32\xa2\x2f\x84\x43\x5e\xf4\x1d\xcb\x33\xb4\x4a\x68\x54\xaf\x48\x01\xa4\x11\xf3\x21\x4f\x39\x6a\xe2\xea\xb5\x84\x27\x3e\x3f\x7b\xe1\x7d\x81\x0b\x61\x09\x45\x0a\x84\xfa\xaa\xce\xf5\x2b\x3e\x02\xa5\x5a\x70\x66\xc2\xa7\x32\xe1\x44\x75\x4f\x80\xcb\x6b\x28\x7f\x50\x5d\x4b\x1f\x7f\x9c\x1b\x2a\xa9\x62\x40\x84\x71\x8e\x42\xea\x5f\x55\x5e\x3a\x57\xf1\x8c\x4f\x9f\xaa\x30\x26\x05\xd6\xda\xaa\x7d\x74\x66\xe3\x4c\x8e\x9f\xa7\x3a\x44\x5f\x47\x39\xce\x46\xcd\x5b\xe9\xc8\x24\xfd\x96\xe6\xd6\xa6\x6e\xeb\x1f\xe4\x17\xe7\x27\xd8\x3a\xe5\x63\x49\x40\xa2\x19\xb7\x28\x4f\x11\xa4\x17\x09\xdd\x94\x90\x17\x33\x11\x4a\x9e\xa2\x8a\xc9\x4c\x22\x30\xce\x4e\x4d\xb3\x6f\x59\x90\x99\x48\x7b\x0d\x78\xe8\x8e\xb8\x6a\x1e\xef\xe4\xba\x0e\xcb\x58\xa4\x03\xca\xed\x1d\xfb\x64\xdb\x99\xbc\x48\xc6\x12\x4e\x76\x03\x15\x1c\x2c\xfe\x7a\x7a\xd9\xee\x6e\x9f\x17\xd7\xbb\xab\x27\xbf\x1c\x66\x4c\x32\xe9\x0d\x01\x68\x91\xa5\x69\xda\x1f\x32\x16\xd2\x41\x12\x2d\x9b\xff\x3b\xe6\x75\xed\x79\x75\x78\x16\x06\x3c\x1e\x94\x6c\x6d\xe4\xd8\x07\x56\x9c\x89\x65\x1f\xdc\xaf\x9c\x59\x08\x9c\x88\x4c\xdf\xdf\x7d\x76\x2d\x8b\x02\x46\x79\xbd\xeb\xa7\x87\x87\x97\xc7\xd5\xf6\xaf\x9d\x43\xfa\x2e\xbe\x79\x3f\x3d\x8b\x99\x3d\xed\xff\x4e\x4a\x4d\xfb\xde\x48\x22\x4d\x8c\x8c\x7e\x77\xb8\x3d\x96\xba\x39\xad\x87\xe7\x59\xca\x10\x12\x47\x67\xeb\xe9\x75\xfc\x7d\x52\x37\x62\x6a\x7d\x53\x4d\x94\xa4\x78\x96\xc6\x92\x28\x3f\xea\x72\x9c\x1b\xcc\x32\xb0\x51\xd1\xcd\x76\xf1\x3c\x69\x9f\xa9\xcc\xd2\x6a\x76\x0b\xa4\xe5\xc1\xec\x85\x3f\x5d\x13\xae\x23\xf0\xb9\x89\xe2\x88\x91\xff\x5f\x64\x99\x1e\x29\x80\xf4\x00\x50\x3e\x75\x07\x62\xd7\x1c\x74\x44\xe4\x08\x47\x6b\x06\x8c\x18\x80\xe8\x18\x5a\xe9\x36\xbd\xc6\x91\x6f\x95\xc9\x20\x0c\xac\x10\x05\x61\xb0\x1d\x93\x40\x7f\x34\x53\x8a\xf5\x0c\x78\xaf\x78\x8a\x30\xe6\x99\xe4\x9c\xc8\x99\x9a\x28\x71\xd6\x71\x7f\x40\x24\x9e\xcd\xe1\xe9\xea\x79\xb4\x10\x66\x52\x5b\x0d\xea\xee\xd0\xe2\xfe\xfe\xe9\x9a\x42\x33\x9b\xdd\x78\x73\xce\x94\xb2\x94\xe4\xde\x8b\x58\xb6\x6f\xd3\x85\x3e\xd3\x9a\xeb\xee\xd6\x77\x2b\xf5\x2b\x89\x03\x9e\x21\x4f\x3c\x45\x6d\xd7\x01\xd5\xd1\x31\xb7\x4f\xec\xaf\x0c\x85\x91\x6a\x60\x36\x5f\xe9\xeb\xb2\x9d\x85\x52\x33\xd4\x20\x42\xbf\x8c\x5b\x36\x2a\xaa\x53\x99\xb5\x32\xd2\x17\xa4\x3f\xe4\x3f\x6f\xab\x7a\x7f\x2c\xe0\xac\xc9\x93\x19\x17\xe3\x5b\x2f\xd7\xcb\xc6\x7b\x4a\x3c\x08\x0d\x73\xf2\x86\xa7\xc8\x5f\xdf\x26\x89\x83\xac\xa7\x0b\xb4\x9d\xf0\x8b\x74\x9c\x3f\x13\x25\x4d\x25\xfa\xec\xba\x7a\xb5\xfb\xe3\x03\xd4\xef\x47\x8f\xf9\xe1\x8c\x19\x0a\x9a\xdc\xf6\x7f\xa4\x56\xc8\x7b\x67\x6d\xb8\xb3\x6f\xc3\x43\x2e\x69\x1b\xa2\x11\xef\xf2\xc4\xb8\x28\xb5\x07\x26\xf8\x8f\x38\x68\x6e\xce\xcc\x0f\xfa\xef\xa2\x71\x32\xac\x22\x3c\x04\x49\x73\xeb\xea\x58\x97\xdf\xc0\x8f\x5a\x1e\x31\xe6\x45\x1a\xae\xab\xfd\x01\xca\xcf\x33\x15\x78\x9c\x47\x71\x44\x31\x33\x2a\x2f\xbb\xc8\xc9\xf6\xa5\xb1\xcc\xa3\xd4\x92\x6a\xd0\xf4\xa1\x78\xcb\xee\x87\x75\xef\xe7\xeb\x39\x8f\x15\xa3\xed\x60\x67\xf2\x32\x6f\xde\x7a\x69\x38\xde\x79\xa6\xb4\x35\x43\x51\x78\x66\x8d\x39\x93\x20\xef\xdc\x10\xda\x72\xf1\xa7\x45\x9d\xd2\x66\xf2\x3b\x5a\x58\xed\xb8\xa2\x80\xf3\x94\xe9\xd0\xaa\xb6\xd6\xef\x38\x9b\xae\x3c\x95\x71\x46\x40\xa3\xe5\xf3\xb5\xb7\x8a\xb7\x4f\xbb\xe7\xe5\xfd\x72\xb1\x59\xf6\x97\xd0\x59\x6a\x7c\x17\x16\x55\xbd\xc5\x7e\xb9\xe2\x19\x8b\x25\xfa\x94\x27\xfe\xc8\xab\x63\xe3\x34\x74\x7d\x83\x88\x51\x54\xef\x79\xb1\x5d\xee\x96\xdb\xbb\xdd\xf7\x3f\xbf\xf7\xc7\x1c\x1d\xde\xbf\xff\xda\xda\x7e\x1a\x2f\x96\xdd\x88\x53\xd2\xcb\x97\x2d\xac\x03\x30\x6d\x20\xdc\x62\xe3\xeb\x61\x6c\xb5\xd3\x97\xe0\x12\xce\x55\x16\x30\xcf\x10\x89\x40\xfd\x4b\x8b\xe3\xd9\xa8\x0a\xe7\x46\xe8\x60\x2c\xc1\x7a\x85\xfd\x47\x14\x69\x90\x8e\x2b\x5e\x77\xd5\xd8\x53\xf7\x8d\x90\x87\x96\x46\x0a\xf6\xd1\x34\x9c\xcf\x21\x4d\x88\x08\x61\xd7\xf5\xde\x91\x32\x20\x6e\xa3\x1c\xef\x62\x1c\x20\x25\x23\xe8\x8f\xbc\x3e\x36\x84\x82\x76\x07\x64\x06\x54\xdf\xf2\x56\xed\x49\x1d\x16\xeb\xed\xcf\xfe\x98\x32\x32\xf1\xf4\x85\x2d\xbe\x5a\x2e\xf4\xe1\x54\xcd\x8d\xaf\x2f\x7b\x9e\x90\x09\x4d\xdf\x5f\xc5\xb6\x14\xf7\xfb\xf3\x76\x56\x0e\x31\xeb\x28\x95\xa2\x0e\x7d\x50\x1a\xf5\x09\x83\x05\xe7\x4a\x2b\x52\xfa\x36\x39\x99\x9a\x93\xa5\x96\x6b\x05\x04\x32\x6d\x2a\xd3\x5e\xc3\xc1\x55\x69\x7d\xab\xa0\x58\x95\xe3\xe4\x26\xd7\xda\xb2\x8e\xfb\x8d\xe0\x2a\xd7\x3d\x21\x4f\x77\x14\x95\x43\xbf\x60\xdd\xe0\x4c\x1b\x61\xf6\xc8\x06\xb2\xc8\x4b\x0c\x14\xb9\x1e\x47\x9c\xa7\x83\x46\x04\x68\x43\x3b\xf2\x58\x97\x8f\xb7\xdb\xe9\x8b\x09\x16\x06\x54\x33\xf3\x5a\x6d\xab\x47\xfc\xd9\x5a\xb0\x9d\x3f\x98\x32\xc2\xe1\x59\x74\x97\x13\xfb\x19\x53\xc0\x9c\x0f\x34\x0a\xc6\x43\xaa\x6d\xb7\x66\xd4\xd5\xd5\xd3\x3c\x3a\x3b\xf6\xce\x04\x13\x92\x32\xdc\x12\x9b\x76\xf7\x0a\x03\xcc\x56\x30\x0d\xf4\x01\x2d\x33\xe7\x34\x96\x22\x42\x11\x64\x61\x5f\x35\xb3\x68\xac\x3c\x62\x4f\xc5\x33\x7d\xcd\x88\xc5\xf4\x26\x9b\x3d\xd4\xed\x7d\x5e\xbe\xff\x72\x9b\x15\x91\x4a\xc8\x27\x26\x51\xaf\xf1\xb8\x71\x6c\xf4\x5c\xc4\x19\xd3\x6e\x98\x3e\x95\x93\xb2\xe6\xce\xda\x1e\xc9\x19\x72\x11\x2b\x24\x6e\xdd\xc3\x51\x16\x79\xf3\xd6\x59\xcf\x4e\xe9\xd8\x35\x48\x43\x49\xc5\x53\x37\x1b\x36\x5e\x27\x44\xca\x79\xe6\xa4\x28\x8e\x16\x42\xe0\x63\xca\xd3\x17\xcc\x52\x4e\x9c\x2f\x96\xc6\xe5\xb6\xaa\xff\x35\x8e\xf9\x9f\x1d\xf6\x22\xcb\x52\x82\x81\xd1\x22\x45\xee\x49\xe7\x4c\xcc\xda\x08\x21\xdd\x16\xf4\x52\xe6\xa7\xda\x28\x5c\xf0\x98\x91\xe1\x45\x59\x03\x1b\x50\x9a\xbc\x01\x4f\x94\x8b\x0b\xb6\xc7\xba\x6c\xb6\x1f\xd5\x4b\x59\xc2\x1e\x2f\x44\xe4\x84\x60\x21\x85\xd0\xae\xef\xff\x1c\x00\x1e\x67\xd7\x43\x21\x32\x5b\xc4\xd9\xfe\xf2\x63\x0a\xe0\x54\xcd\x4c\x5b\xf9\xa2\x28\x7c\x45\x87\x5d\x37\xae\x3e\x9f\x4e\x57\x3f\x01\x60\x35\xe2\xbb\xd5\xcf\x6f\xf9\x63\x6a\x5f\x2e\x00\x6d\x88\xcc\x2d\x8d\x17\xfc\x2b\x21\x23\x20\xc8\xdb\xa2\xce\xfb\xbd\x4d\xc8\x38\xa1\x1c\x77\x73\x94\xd6\x91\xbb\x50\xba\xeb\x9b\x27\xd2\xa5\x7c\x29\x92\x4b\x0a\x5d\xc7\x13\xbd\x3c\x2e\x94\x74\xc9\x49\x6c\xda\x21\xad\xe1\x6f\xaa\xb4\xf0\x74\xe4\xdf\xdf\x70\xa6\x6c\xc0\x85\x32\x8c\xb2\x87\xeb\xe7\xe5\xe6\xe9\xfe\xc6\xed\xaa\xfe\x64\x8d\x29\x1b\x93\x8e\xde\x60\x0b\xb9\xdf\x4c\x05\x06\x86\x90\x88\x9b\xce\xcd\xd9\xb1\x1d\xf9\x0f\xfd\x41\x88\x68\x8c\x38\x50\xf6\x63\xd5\xfe\x37\xd6\xd5\x6c\x20\x19\xcd\x69\x49\x3b\x8c\x40\x65\xdb\x1c\x6b\xef\x46\x40\x10\xa4\xe0\x08\x88\x2e\xc8\xcf\xfb\x86\x59\x40\x51\x8c\x82\xea\x30\x86\x05\x0d\x98\xb2\xbc\xd2\x0d\xb6\x7f\xe4\x0a\xbb\x3b\x75\xee\x52\x8b\x37\xf8\x80\x0d\xfc\x12\x89\x31\x59\xf7\x21\x0c\x80\x32\x11\x7e\x0f\xfd\x73\xbd\xa0\x64\xcc\xa2\x9c\x15\xd8\xce\x71\xcf\x10\xc6\xb6\x2c\xa1\xc1\x76\x27\xa1\x41\x47\x7d\x0b\xcd\xae\x41\x1c\xb6\x04\x88\xb4\xc5\x5c\xee\x6a\xd4\x88\x53\xf1\x43\x0e\x71\x88\xc2\x05\xd0\x5d\xc4\xf4\x44\x51\x8c\x43\x9c\x04\x84\x7d\xed\x06\xc4\xb6\xfe\x5c\xd7\xd5\xcf\x4f\x02\x34\xfb\xe3\x82\x67\x8e\x6d\x60\xec\x68\x41\x12\xea\xc8\xd2\x5b\xfc\xbc\xcb\xbb\xa9\xf2\xf9\x8c\xaa\xaa\xf5\xea\xa6\x6f\x21\xd1\x4b\xa5\x2e\x1d\x5c\xa0\x73\xb6\x17\x67\x16\x09\x48\x94\xf5\x59\x5c\x87\xec\xda\xca\xbe\x72\xb3\x3b\xd4\xf8\x63\xf7\x81\xf8\x3e\x25\xc1\xe3\x90\x60\x6a\x02\xfb\x60\xc7\x02\xea\x41\xde\x97\x43\x16\x33\xca\xa3\xd1\x6a\xaa\x1c\xd5\x44\xd3\x1f\x4d\x83\xd8\x4d\x95\x45\xe3\x2a\xab\x4f\xdd\x66\xc8\x52\x5b\xcd\x43\xec\x2f\x2e\x30\xe3\x8d\xfc\x8b\x1f\x2e\x33\x61\xa2\x47\x9f\xfc\x5f\xd5\x3b\xd6\xe7\x59\x08\x39\xf0\xc4\x4a\xe0\x6c\x9e\x6e\xb7\xd7\x8b\xf5\xee\x7e\xf5\xd0\x97\xb7\x00\x47\x24\xbe\xa8\x7d\x5e\xe6\xfb\xe3\x7e\x0b\xef\x58\xaf\xeb\xaa\xad\x54\x35\x4a\xb6\x83\x08\xd1\x41\x62\x5d\x8c\xd4\xc6\x74\x46\xf5\xd7\x93\xf9\x0f\xc0\x80\x4c\xb6\x55\x71\xdc\xff\x39\xc9\xe5\x00\xc4\x9c\xb0\xe5\x6f\x58\x57\xdd\x1a\xb2\xad\xee\xb0\xae\xba\xe5\xb5\xf9\x6d\x6c\xb3\x01\x24\x96\x81\x6c\x46\xc0\x32\xda\xb3\x3b\xab\x8e\xcc\x06\x2c\xf5\xae\x86\x61\xd4\xc8\xd8\x64\x43\x68\xdc\xad\x96\xfd\xec\x19\x3a\x5f\x66\x11\xe5\x1c\x0f\x2e\x8d\xed\x46\x83\x8d\x70\x36\x8b\x1f\x90\x17\x20\xe7\xc0\x3e\x90\x1a\x12\xe6\x18\x24\xdb\x97\xba\x68\x7e\x9b\xd2\x34\x70\x50\x32\x20\x8b\xc1\x41\xbe\x6e\xd1\xbf\x9b\x93\xe8\xed\x5a\x58\x85\x63\x4b\x5c\xd5\x7e\x3e\x40\x09\xaf\x23\xa9\xd0\xb3\x9b\x12\x20\x47\xb0\x34\xef\xe3\x79\x78\x86\x7c\x86\x03\x42\x16\x4d\xf0\x50\xfa\x66\xb4\x02\x99\x4c\xd0\x8c\xee\xbc\xdc\xab\xed\xf5\x79\x83\x14\x8c\x88\x6d\x89\x80\xd6\x14\xe0\x9e\xac\x3b\x32\xc8\x02\x1c\x8b\xc7\x8d\xc4\x23\xb9\x0c\x30\x13\x96\x55\xe0\xc7\xd8\x39\x1d\xe7\x52\x07\x96\xad\x13\x59\x75\x2e\x99\x0c\xa8\x8f\xd1\x05\xed\x89\x80\xe2\xfc\x63\xca\x90\x59\x80\x1d\x96\x9a\x82\x86\x66\x48\xe7\xc8\x30\x4a\x69\x71\x24\x64\xba\xce\xa1\x9c\x59\x3c\x32\x44\x2b\x2d\xb7\xcf\xcb\x11\x9b\x1c\x97\x51\x8c\x23\xb9\xd8\x7b\x28\xf5\x44\x6a\xf8\x5c\xae\x4a\x46\x26\x02\xec\xab\x76\x46\x14\xee\xee\xab\xcb\x38\x96\x5e\x8c\xba\xc7\xf7\x9c\x0f\x5b\xcb\x18\x53\xca\x23\x97\x4e\xdf\x68\x8d\x75\xaf\xf4\xc4\x65\x12\x85\x64\xac\xee\x3a\x73\xfa\x1a\x6a\x59\x95\x37\x55\x51\xc0\x29\xfd\xd9\xb4\xab\x12\x91\xd1\xf6\x68\xa5\xb0\xdb\x0b\xa5\x76\x32\x01\x2b\x00\x6d\x50\xbd\xad\x6b\x5c\x90\xd6\xd4\xc0\x7e\xe7\x5b\x69\xcb\x7c\xd6\x60\xbb\x5e\x9d\x11\x39\xe3\x32\x41\x41\xc4\x17\x50\xb7\x63\xa5\x5d\x77\x34\x0d\x82\xa8\x57\xe6\x99\x89\xd9\x4c\x9f\x27\x55\x29\xa1\xea\xf7\xf0\x73\xf1\x5a\x95\x63\xfc\xa4\xcc\x24\x6a\x1c\xd9\x03\xb3\xaa\x0b\x99\xa1\x65\x42\xb1\x80\xaf\x85\x31\x79\x91\x8f\x5e\x82\x4b\x46\xa4\x6e\x3e\x42\xbf\x69\xab\x1a\xa7\x71\x31\xc9\xd1\x2e\x33\xf2\xf8\xb9\x6b\xdf\xfc\x2a\xe1\x8f\x8a\x38\xe4\xbe\x56\x09\x57\xd7\x4f\x9e\x8c\xa3\xa8\x7a\x5e\x32\x2e\x21\xcd\xac\x14\xbc\x57\x6f\x3d\xe7\x2a\x4a\x30\x11\xb1\x41\x5b\x1c\x85\xa5\xf0\x3e\x6b\x5b\x48\x99\x1a\x62\xe7\xf9\x40\xf9\x2d\x37\xd6\x8f\x9b\x60\x9d\xa5\x4a\x6c\x0e\x98\x28\x02\xbb\x6e\x77\x9c\xb8\x77\x27\x6e\xa5\x54\x09\x5a\xb4\x13\xbe\xe6\x25\xf9\x70\xfe\x00\x07\xaa\x65\x03\xbb\x2f\x6d\x0e\x38\xba\xbe\x16\xc4\x4f\xe9\xc8\x76\x76\xeb\xbb\x21\xde\x21\xb5\xb4\x8a\x8b\x07\xeb\xac\x39\x2d\xe6\x95\x7e\xee\xd6\x63\xdf\x08\xd3\xcc\x93\x50\xee\x6c\x01\x57\xd7\x3b\xbb\x66\xae\x58\xca\xa5\x09\x63\x0a\x4c\x81\x5f\x91\x6f\xab\xbe\x2e\x07\x8a\xc5\xfc\x7d\x4c\x1c\x64\xc2\xd1\xec\x6c\xc6\xa5\x6e\xb3\x61\x65\x32\x11\x3b\xc6\x03\x47\x25\x39\x3b\xae\xad\x1e\xed\x00\xcb\x5b\x95\xcd\xb1\x1e\x0d\x0d\x15\x24\x9a\x6c\xff\xe6\xad\xaa\xdb\x5e\x6b\xf5\x02\xd8\x4f\x05\x5c\x10\x0d\xf7\x7f\x2f\x9e\x77\x4f\xfb\x32\xd7\x76\xce\xfa\xa3\xd2\xe2\x2e\x77\x07\xa8\xdb\x1c\x0a\x02\x64\x4c\x3e\xbb\x62\xcc\x50\x08\x7b\x83\xed\x6a\xfd\x7c\x9e\xe5\xef\x0c\xb4\xea\x14\x70\x35\x9e\xa6\x2a\x8c\x20\xb6\xa9\x1a\xcb\x81\x37\x06\xcd\xaa\x28\x94\x98\xf6\x21\x51\x8b\xb2\xb1\x21\x3e\xdf\x40\xa7\x9e\xa8\x74\x5d\xc0\xe7\x88\xc7\xd6\x35\x88\xa5\x2d\x44\xdf\xc3\xcf\x35\x7c\x36\xeb\xe1\xda\x31\x86\xc4\x69\x55\x63\x5b\xe7\xf8\xe3\xb4\xc6\x66\xda\x7d\x89\xb2\xb2\xbf\x23\x5e\xcd\xf1\x54\x57\xa9\x40\x12\x71\x78\x83\x86\x28\x09\xce\xcf\x1d\x95\x2a\x4d\xf0\x59\xab\x5e\x3c\xa9\x97\x54\xa9\xe6\x38\x30\x59\x62\xdd\xdc\xe4\xcd\x01\xcb\xa6\xf3\x26\x7d\x9b\x2c\x8e\xa8\x47\xbe\x63\x61\xc0\x61\x18\x06\x96\x31\xae\x32\x1e\x52\xf9\x58\x75\xc0\xf2\xaa\x72\x04\x42\xe7\x87\xa0\xea\x76\xaf\xcc\xd2\x2d\xd6\xd5\x0f\x5c\xd7\x15\x15\x00\x9e\x7f\x7f\x8e\x3d\x57\x32\xad\x65\xc7\xb6\xea\x85\x0c\xfc\xcd\xb9\x89\xa8\xee\x1e\x6c\xa5\x80\xb7\x2b\xdc\x51\xa1\x80\x40\x93\x9e\xa8\xf2\x3b\xe6\xfd\x21\xc3\x48\x83\xd4\x63\x6e\x3b\xf7\x01\x7a\xab\xe9\x7f\x58\x30\xc4\x90\x47\x8c\x95\xf1\x10\x45\x8e\x9d\x93\xa8\x20\x0a\xd2\x70\x42\x18\x37\xb8\x80\xb6\xb7\x17\xa6\xc5\x7a\x61\x99\xda\x86\x0d\x41\x41\x02\x04\x75\x18\x84\x64\xa7\x1c\x83\xe7\xbb\x10\x64\xa0\xfb\xc2\xdc\xab\xea\xf8\xfa\xf6\xab\x33\x24\x0a\xc2\x6e\x1f\x1b\xfc\xbd\xac\x3e\x0a\xd4\xaf\x33\x1f\x54\xa9\x98\x45\xd0\xd7\xa1\x54\xe6\x6b\xc3\xac\x6b\x6e\x9d\x74\x1f\x2a\x18\xa1\x16\x94\x32\x86\x52\x03\xd4\xe9\xb6\xc4\xad\x1d\x66\x3d\x86\xcc\xd3\x52\x0f\x62\xf8\xd3\xab\x63\xa2\xc8\x82\xf7\x7b\xd4\x43\x5e\x62\x3d\x58\xe7\x0a\x39\x8f\x13\x4f\x6a\x4c\x5b\xc1\xd4\xe4\x75\xcd\x0c\x97\x14\x84\x5e\x3e\x5f\x87\x61\x34\x36\xca\x95\x31\x8a\xc2\xa0\x7f\xdd\x7a\xcf\x40\x07\x81\xf5\x95\x4c\x5e\x37\xed\x76\x0b\x3f\x27\xdb\x8b\x0e\x38\x8b\x5d\xb0\xd2\xc1\x68\xee\xf2\xd7\xb7\x46\x55\x35\xbe\x34\xfd\x80\xd3\x81\x0e\xc3\x31\x4b\xb5\x5b\xe8\xfd\x61\xc6\xb3\x38\x19\x74\xef\xc6\xd4\x26\xae\x45\x08\xc2\xe5\xd9\xdf\xaf\xc6\x59\xa1\xe9\x07\xd0\x11\x58\x25\xe7\xee\x7b\x55\xb3\xfd\x40\x47\x18\xa1\xb3\xf1\x76\xaf\x15\x14\xb3\x87\x88\xc3\x88\x3e\x1e\x96\x7a\xa5\x2a\xd6\xff\x1d\x27\x64\x01\xee\xc0\xe4\x73\xdc\x80\x8e\x95\x15\x68\xfe\xc8\x4b\x5d\x7d\x84\xd6\xf2\xe8\xec\x6c\xaa\x5d\xf7\x19\x1f\x9d\x20\xa3\xe9\xed\xf9\x86\xd6\x55\xd3\xe4\xb2\xc0\xeb\xb7\x6a\x10\x17\xe7\x3a\x55\x48\xb9\x69\x22\xe9\xda\x7c\xa5\x0b\xf2\xff\x94\x4e\xd1\x59\x1a\x13\xee\x54\x43\x0b\xb7\x55\xbd\xc1\x4b\x36\xb4\xe6\xb1\xa2\x00\xb9\xc6\x62\x51\xb4\x24\x87\x37\x9b\x12\x9a\x67\x82\xac\x04\xc7\xd7\x70\xca\x6c\xce\x35\x37\x8c\xfc\x9e\xc5\xd5\xd3\x9f\xfe\x3f\x11\x24\x3d\x23\x6b\xd3\x60\xbb\xd2\xdb\x3a\x3f\x10\xf9\x23\x7a\xce\xb7\xe9\xb3\x88\x40\x12\x0c\xf3\xda\x03\x9b\xc6\x36\xb4\x16\x91\xd5\x57\x2a\x8f\x7b\xc2\xd4\xf5\x9d\x28\x52\x01\x89\x77\xcb\xc6\xce\x48\x77\x04\xbd\xde\x4d\x0e\xc5\xe2\xf9\x4f\x3b\x4f\xc7\x51\x34\x2d\xb4\xd2\x43\x94\x79\x59\xab\x30\xf8\x65\x45\xa3\x86\x54\x92\x43\xe6\x60\xca\xfe\xad\x66\x3d\x07\x59\x4c\x75\x1c\x76\x2a\xe5\x7b\xbc\xcf\xcb\xbe\xcf\x20\x4b\x0c\xcc\x24\xd5\x09\x4a\x52\xcf\xaf\xc2\x93\xc0\x95\xa3\x2c\x8a\xa2\x67\x41\x9d\x3e\x90\x4c\xe2\xac\xaf\x9f\x23\x3b\xf4\x71\xc8\x76\x68\x29\x02\x88\x49\x34\x44\xbf\xe2\x08\x9e\xa3\x55\x64\x0d\xfe\x5e\x8b\xd6\x5a\x57\x5e\xb1\x80\x6b\x65\xb4\x2f\x77\xd9\xe4\xaf\x2e\x0a\x3e\xbb\x37\xb2\x84\xb6\xdf\x07\xf8\x9b\xa6\xf0\x08\xd6\xae\x31\xb6\x00\xb0\xc6\x96\x27\x1e\x0f\xce\x90\x38\x23\x5b\xca\x35\x66\x9c\x32\x46\xdf\xa1\xd4\x16\x47\xd6\x8e\xb4\x15\x2f\xe3\xf0\x35\x22\xa3\x0c\x8a\x8f\x8b\xd0\x18\x7d\x3a\x5e\xd8\x4f\xb5\x61\x22\xd4\x03\xd8\x65\x23\xc7\xba\xbf\x5c\x9b\x28\xa3\x64\xf0\x1d\x7c\xbc\x5f\x56\x18\xe5\xda\x64\x19\xe1\xe3\xb6\x35\xfc\xc0\xa2\xc8\xcb\xd7\xdb\x1a\xf1\x9f\xc9\x3d\x71\x0c\xb2\x30\x76\xf2\x7d\x83\x78\x33\xc7\x80\x33\xe2\xae\x22\xe7\x68\x31\x25\xd3\xfb\x72\x77\xc3\x40\x26\x81\x57\x2f\x22\x87\xe6\x14\xcc\x89\x81\x04\xda\xec\xc1\x98\x06\xcb\xd3\x02\x97\x2f\x97\x15\x64\x89\xfd\x3e\xf4\x38\x0e\x7e\xfd\x2b\x6d\x94\xcb\xc1\xcc\x3e\x6c\x82\x0c\x2c\x75\xc6\xd5\xb1\x2e\x27\xb4\x11\xd3\xdb\x47\xa9\x0d\x9f\xee\xec\x20\xbf\xa0\xaa\xce\x31\xe2\x31\x59\x97\x16\x84\xb1\xb3\xb9\x19\x4f\x92\xe7\x2d\x2d\x77\xe6\xf4\x44\x15\x13\x7c\x90\x92\x18\xf7\xe3\xb2\xc2\xc9\x8c\xc4\x38\x89\xd1\x6d\xdd\x37\x47\xea\x05\xff\xf5\xe2\x2c\x20\x93\xd7\x2b\x04\xdb\x10\x8c\xe5\xa9\xe9\xf6\xca\xc6\xfe\x6c\x60\x4f\xda\xf0\x2b\xed\xb9\x36\x30\x89\x24\x4d\x22\x67\x10\xfe\xfe\xd7\xf5\xa2\xd4\x9e\xa6\x60\x66\xe8\x7f\x15\x8c\xc0\xc4\x11\xf4\x7c\x20\xbe\x17\xe3\x7c\x36\x26\x98\x58\xd2\x93\xb2\xfa\x30\x05\xbc\x4f\x99\x25\x2e\xdc\xe3\xa4\xec\x01\xd3\x34\x41\x33\x82\x8a\x91\x19\x5c\xd5\x53\xd5\x47\x8e\x29\x47\x9f\xde\xbe\x87\x86\xc8\x23\x3d\xed\x3d\xc7\x54\x58\x0e\xcf\xc1\xf8\xb9\x10\x02\xc0\x2c\x50\xbe\x6a\x66\xdd\xf5\xc5\x39\xe6\xa2\xe9\xd7\xe1\x59\x96\xfa\x3a\x9b\x4f\x28\xdb\x9b\xba\xca\xdb\xa5\xaa\xca\x6a\x9f\xff\xdf\x11\x77\xdd\x62\xdd\xe2\x4e\xf8\x67\xe1\x52\x91\xa5\xd1\x33\x29\x0e\x19\x0b\xe4\xa8\x99\xf4\x7b\x4b\xaf\x13\x09\x5f\xa5\xc9\x51\xa4\x4a\xba\xe8\xfa\x8d\x65\x6e\x5c\x0c\x52\x54\xb3\xf9\x28\xa4\x31\x7c\x48\x3a\x0c\x1c\x08\x7e\x77\x43\x08\x8c\x1a\x2b\x04\x5d\xf7\xd5\xa4\x27\x11\x5f\x84\xd4\x66\x7a\xc8\x1e\x24\xe6\x07\x5a\x8a\xcf\x11\x16\x20\x88\x90\x4c\x84\xdd\x6e\xd7\x60\xbb\x25\x59\xef\xf9\xe5\x20\xa2\xb5\x7b\x57\x56\xdb\xb7\xba\xfa\x98\x0c\x97\xf1\x88\x50\x31\x23\x3a\x57\x47\x14\x39\x20\xf8\xe6\x6b\xc2\xf9\x0e\x53\x32\xa3\x4f\xfc\x6d\xd8\x77\x50\x27\x8a\x48\x09\x1f\xae\x3d\x3d\x03\x9a\x30\xa5\xc0\xc6\xbf\x96\x93\xc0\x32\x9a\x38\xb4\x6c\x48\x14\x85\xd9\x7c\xc0\x61\x64\x84\xa3\x49\x0d\xd5\xfd\x74\x4e\xd9\x1c\x5a\x88\x06\x2c\xf1\xb6\xab\x16\x79\x46\x62\x63\x3d\x3f\x10\x8d\x41\x2a\x5f\x79\x25\xdc\xe5\xfa\x6a\xeb\x2d\x66\x13\x44\x49\x62\x85\xd5\xe9\x2a\x33\x10\x9c\x09\x74\x4c\xc5\x16\x2d\xa9\xa3\xf9\x69\xd2\x4c\xcc\x6a\x13\x86\x16\x21\x66\xf1\xea\xd5\x0f\xd4\x8e\xcc\xbd\xbb\xd9\xe2\x70\x28\x3c\x15\xff\xa4\xeb\x4c\xc8\x13\x2a\x98\x34\x0d\xe5\x47\x69\x55\x7c\x3c\xee\x1d\x67\x8e\x6f\xa4\x63\xca\xfe\xe6\xbd\x58\xc2\x6c\x5b\x30\x91\x23\x01\x74\x69\x94\x63\x67\x91\xcf\xb8\xd4\xb8\x89\x32\x06\x74\x99\xc6\x63\x02\xfd\x0d\x22\x94\xe4\x89\x5d\xd1\x13\xf4\x74\x32\x26\x56\x99\x0f\xd1\x39\x65\x4f\x8b\x69\xec\x76\x4a\xc4\xae\x9f\x9a\xe1\x29\x63\x6d\xd9\x29\xda\xb7\x1a\x9b\xb7\xaa\xd0\xd3\x0e\x4a\x54\x46\x10\x70\xca\xf3\x2e\xb7\x77\xcf\x90\x0f\x61\x36\x93\xa6\xd2\xd3\x12\x2c\x8a\xe2\x0e\x61\x38\xc2\xb5\xaf\xc6\x9f\x14\x0c\x35\xbd\x25\x7a\x7e\x17\x31\x29\xc4\x1c\x7a\x3d\x8c\x71\xe8\xd1\x64\x86\x11\x14\x77\xa1\xa0\xd4\x9f\xbf\xde\xeb\x0d\x8f\x22\x4a\x63\x7b\xca\xb3\x09\x96\xc5\x88\x00\x2d\x0d\x40\x67\xb5\xc0\x3e\xd7\x61\x7f\x04\x12\xb2\x88\xf7\xf0\x73\x5d\x5b\x64\xec\xb0\x44\xac\xb1\xf6\x79\x64\xdf\x1e\x58\x46\x7d\x88\x4d\xf7\xf1\x4e\xc4\xc9\xb9\x91\xa1\x20\x34\xc6\xae\xb7\x94\x2e\x92\xf9\x8f\x4e\xd2\x82\xa2\xb0\xbe\xd4\xa8\xdf\xf2\x2f\x21\xe4\xe8\xff\x30\x98\xe6\x2b\x8d\x34\x21\x07\x07\x30\x81\xc2\x7e\x05\x5b\x2c\x3e\x4d\x30\x18\x85\x96\xa1\xe8\xbf\x97\x2f\x23\xc5\x0d\x6e\x74\x16\x92\x39\x6f\x43\xf3\xcf\xa5\x26\x12\x5f\x7f\x50\x59\xd5\x9b\x06\x0c\x5a\x7d\xe0\xeb\x02\x61\x88\x67\x19\x4c\x62\x32\x7d\x36\xdb\xc5\x76\xb9\xbb\x5a\x6e\x77\xcb\xc7\xc5\xd5\xfd\xf2\xa6\x6f\x20\x80\x8a\x18\x1c\x84\x93\xcd\xbe\x12\x2a\x4b\x21\x5c\x63\x5e\x36\x23\x98\x8a\x31\xb1\xe0\x30\xac\xe1\x96\xd7\x8f\x00\x9e\xbe\x01\xa6\xf4\x3e\x7f\x57\xf9\x7c\xfe\x1a\xc3\x69\xe6\x3c\x56\xef\xc7\xeb\xaa\x6c\x8e\x7b\x8a\x94\xaf\x0b\x28\xcf\xee\x2e\x22\x08\x23\xab\xba\x63\xa9\x2c\x9c\x51\xb3\xe9\x97\x1b\x11\x84\x32\x10\x16\x80\xae\x4b\xfc\x38\x45\x16\x88\x20\xd4\x56\x7a\xc3\x22\xb4\x77\x6f\x58\x1c\x66\x6a\x69\x22\x88\x22\x16\x59\xfe\x1e\x04\xab\xd3\x4f\xd1\x6b\xef\x75\x89\x20\xe2\xa1\xee\x16\xe8\x9b\xdb\xb1\x0c\x96\x08\x92\x04\xe9\x7f\xeb\x4e\x3d\xe2\x09\xf4\xfd\xac\x21\x78\xf1\xe0\xf9\x4e\x48\x24\xd2\xb7\x5c\xd5\x55\x79\x07\x23\x47\x62\xd6\x2e\x0d\x75\xd6\x93\x60\x8f\x49\x30\x67\x99\x55\x11\x64\x22\x24\x84\xd5\xf3\x1f\xcf\xc3\x90\x13\x41\x86\xd6\x4e\x39\x89\x3c\x4e\xcf\xe6\x71\x08\x6c\x9a\x11\x61\xe3\x8c\x88\x08\xb8\x91\x96\xc9\x81\xed\x9c\xdd\xe4\x6f\x21\x82\x30\xb0\x65\xd1\x56\x06\x77\xf6\xb1\x44\xa8\x03\x1c\x2a\xc4\x66\x07\x41\xa1\x2d\x1c\xd9\x1c\xe0\xa3\xa4\xec\xba\xc7\x65\x9c\xed\x10\xa1\x14\x25\x90\x0b\x34\x2d\x4b\x67\x6f\x21\x4c\x1a\xf1\x11\x29\xde\x57\xce\x80\x08\x40\x18\x08\x7a\x08\xe1\x2b\x76\xdd\xbb\x68\xdb\xaf\x53\x99\x22\x90\xcc\x6a\xe3\x75\x3e\xb9\x8d\xdc\x41\xf9\xee\xfb\x42\x66\xda\x38\x48\xc1\x88\x5f\xd8\xa1\x32\xc7\x8b\x84\x08\x54\x68\x7d\xb8\x43\x8d\x0f\x73\x88\xd4\x70\x37\x15\x09\x6e\x3c\xff\x67\x7e\x58\xe9\x66\xd8\xd1\x44\xa0\x38\x52\x11\x99\xae\x1e\x06\x99\xa1\xb3\x8b\xa0\x08\x94\xb4\x84\x7a\x0f\x79\xfb\x8e\x9f\xe3\x31\xa2\xa4\x5d\x37\x3a\x43\xb7\x0f\x1b\xf8\x63\x26\x26\x98\xcd\x01\x3e\x5d\xf6\xe7\x1c\xd6\x57\x04\x3a\x8c\x09\x7f\x45\x03\xf5\xea\x68\x7a\x3b\xba\x3b\x94\x90\x39\xeb\x41\x0e\x03\x7c\xcc\x35\x40\xa6\x28\xa5\xbc\x38\xb6\xd5\xad\x87\x38\x4f\x81\x90\x22\xe8\xec\x58\x1c\xa4\xcd\x6e\x76\x0f\x8b\xe7\xdf\x97\xdb\xd5\xe3\xb7\xdd\xb7\xe7\xa7\x97\xb5\xbf\x98\x41\x2b\x28\xf9\xea\x8b\x7a\xcf\x89\x10\x0b\x16\x64\x09\xb9\xbe\x4d\x55\xe8\xab\x4f\x47\x29\xe0\xd7\x06\x16\x70\x6b\x35\xfb\x4d\xa6\x47\x49\x3e\xf4\xa5\x61\x82\x05\x10\x79\xc2\x6d\x4f\xd2\x78\xa2\xff\x26\x58\x60\x6c\xbd\xf9\x7d\xf5\x7a\x95\xeb\x07\xd0\x5f\x0b\x26\x0a\xc6\x22\xa9\x2c\xb0\xb3\x1d\xd3\x0a\x0b\xc6\x62\x4d\x39\xc9\x0f\xc2\xd8\xae\xab\xaa\xd8\x0e\xca\x28\x82\x31\x11\x93\xff\xf5\xf8\xb4\xdd\x2d\x5e\x6e\x56\x5b\xbf\x31\x74\x87\x78\x88\x03\xb7\xfc\x93\x71\x91\xfd\xc9\x27\x64\x4c\x09\x8a\xf6\x6a\x68\xde\xbc\xa3\x23\x58\x1c\x49\x5a\x0e\xab\xf2\x03\x6b\xe3\x43\xb7\x82\xc5\x59\xe2\x21\x38\x84\xa0\xfc\xfd\xaf\xeb\xd9\xf5\x62\xae\xa8\x1c\xc5\x7e\x75\x5a\xc7\xaf\xaa\xea\xfd\xfc\x4a\xc7\x62\x63\x45\x0e\x0f\x55\xad\xaa\x19\x8c\x4e\xb0\x24\x0a\x29\xd2\x39\x68\x06\xde\xe7\xcd\xb8\x22\x6f\x7a\xb1\x04\x04\xb3\xea\x47\x96\x08\x10\xad\x04\x8f\x7f\xf6\xc4\x68\x1b\xb5\x3c\xca\x6d\x35\x46\x52\xcd\x3e\x45\xca\x2c\x85\xc3\x55\xb7\xda\xcd\x0e\x45\x36\x56\x01\x5a\xf7\xb0\x35\xd4\x73\x19\x41\x07\x3f\x13\x2c\xcd\x12\xe3\x9a\xef\xa0\x24\x01\xfb\x33\x88\x61\xc1\x52\xce\x08\xb9\xdb\x39\xfc\xc7\xc3\x4b\x83\xf5\x09\x28\x6e\xb8\xa6\x09\x5c\xdd\x39\xaa\xf7\x5d\x5e\x3a\x3d\xf8\x6a\xde\x77\x99\x61\xa9\x0f\x78\x57\x55\xa1\xab\x8f\x72\xa0\x60\x8e\x83\xbe\x55\x4a\x45\x16\x43\xca\x70\x46\xc9\x29\x18\x8f\x23\x5a\xf9\xcc\xb1\xdc\x35\x50\x6a\x59\xfd\x9c\x3d\x3e\x17\x8a\x34\x7d\x16\xdb\xed\x78\x86\x33\x11\x73\xa2\x0d\x27\xa8\x4a\xae\xaa\xdd\xb0\xdd\x33\x11\x8b\x34\xee\x89\x9a\xe7\x45\xc9\x82\x09\xa3\x08\x28\xfe\x0d\xaa\xd7\x23\xcc\x38\x6a\x04\x93\x2a\x25\xb0\xcd\xba\x46\x8d\x9d\xf7\x52\xf5\x9f\x59\x6a\xe6\xf8\x8b\xa8\x80\xcc\xbb\x91\x93\xab\xab\x40\x4b\x37\x89\xc9\x7a\xc5\x7d\x55\x9e\x5d\xe1\x98\x42\xe3\x14\x20\xa0\x6e\x37\x05\xec\xf7\x58\x53\x0c\x78\x36\x9d\xff\x27\xf9\xdf\xf9\x0a\xec\xe5\xd1\x04\xd3\x8c\x51\xca\xd1\x5a\x80\x2e\xff\x40\x0b\xeb\x98\x05\x40\x30\x1d\x1b\x4a\x98\xf9\x05\x08\xf5\x58\x06\x49\x30\x9d\x65\xa4\x0c\x63\x2b\x4d\x37\x58\x58\x5a\xe1\x13\x83\xf6\xfc\x5c\xc3\x34\xcb\x32\xc7\xa3\x37\x41\x3e\x4f\x7b\x1e\x21\x21\xf7\x59\x55\x65\xd3\xd6\x36\x1b\xbe\x1c\x3e\x9c\x09\x42\x82\xbf\xf6\xa1\xd7\xe7\xaa\xba\xa8\x9d\x30\x31\xa5\x05\x33\x51\x9a\x26\xe3\x15\xe9\x76\xce\x66\xd3\xb5\xc9\x28\xe6\x7b\x7d\xb7\xdc\x6c\x26\xc3\xc9\x24\x56\x5f\xe4\xe9\x79\xf5\x6d\xf5\xb8\xb8\xdf\xad\xd6\xb7\x9b\xdd\xdd\x62\x73\xd7\xb7\x50\x48\x0e\xfd\x76\x5f\x95\xf8\xb9\x25\xd9\x3a\x7f\x48\xdb\xa2\x84\xbc\x69\x8e\x78\x8d\xb5\x53\x89\xc3\x2f\xc2\xe5\x22\x0c\x82\x04\xc2\x9e\xbd\xcd\x52\x82\x8d\xf1\x68\x22\x64\x91\x05\x33\xba\xf0\xd7\x19\x52\x17\x11\xb2\xd8\x92\x1b\xef\x3f\x3b\x2f\x24\x3f\x92\x8c\x61\x1f\x7c\x13\x21\x4b\x75\x18\x0c\xb1\xe6\xa1\x3c\x4b\x84\x4c\x22\xc1\x8a\xa8\x48\x6a\x47\x3a\x4b\x8e\xfd\x6d\xc7\xfa\x36\x98\x52\xf5\xd0\xca\x3c\x54\xfa\x58\x38\x7d\xce\x33\x2c\xc3\x22\x0c\x23\xa9\xe5\x5c\x76\xcd\xd2\x12\x7f\xa1\xba\x26\xc2\xc8\x30\xaa\xa0\xd8\x60\xbb\xc3\xf6\x6d\xf7\x9a\x9b\x29\x65\x88\x08\xe3\x98\x51\xb2\xce\x2d\x47\xb8\x28\xf5\x37\x24\xe5\x2d\xdc\xdf\xe2\xd7\x99\x72\x11\xc6\x89\xa5\xc9\xa3\x59\x46\xf1\x9a\xd9\x71\x0c\x93\x78\x28\x6d\xa8\xd1\xe6\x25\x9a\x16\xf6\x87\x79\x53\x63\xa5\x9e\x77\x45\xa5\xde\x5d\xd4\x74\x3c\x8c\xc2\x84\x87\x99\x05\x9a\x20\x4c\x59\x9d\x45\x98\x18\x43\xd5\x83\xfb\x4a\xe7\xe6\xb3\xd7\xe4\xda\xc2\xcf\x53\xa5\xbc\xf3\x1b\x79\x98\x06\x96\xca\xf4\x70\x94\xc3\xac\x09\xd3\x28\xa5\x7d\xd3\xa5\x74\xf2\x06\x4f\x02\xd0\x5f\x5f\x36\x8b\x0d\xe5\x04\xe5\xf1\xf3\xea\x69\xfb\xf3\x02\x2f\xcd\xf9\xde\xe5\x3c\x21\xc6\xcb\xfa\x58\x36\x4f\xc7\xf6\xc9\xf4\xc5\x52\x9d\xf7\xd0\xf3\xb5\x5e\x0c\x89\x4f\x07\x83\x00\x0b\xb0\x18\xb6\x8c\x8b\xec\x4d\x22\x14\x5a\x05\x82\x44\x0b\x7b\xc2\x67\x67\x55\xf5\x4f\x00\x21\xcf\xc4\xa0\xd4\x33\x63\xfa\x9b\xdd\x1c\xb2\x38\x10\x43\xe4\xeb\xea\xf8\x79\x3d\x26\xbc\x9a\x35\x16\x56\xae\x09\xda\x16\xba\x79\x45\x38\x9c\x47\xfc\xa0\x84\xaf\xb3\x36\x27\x58\xc4\x13\x79\xbc\xe9\xf5\x64\x26\xa8\x3e\xf6\x0e\x9a\xb7\x67\xeb\x0d\xe9\xb3\x45\x44\x22\x54\x1c\xc0\xe7\xe3\xe1\xf3\xe9\x38\xd1\x92\x10\xa1\x82\x90\x92\x82\xff\xc2\xea\x00\xb5\xfe\xec\xff\x97\x92\xd0\x10\x37\x8b\xbf\x36\xcb\xeb\xa7\x47\x2f\x7d\x2d\x42\xa5\xad\xb2\xe3\x2b\xb6\xb7\x55\xdd\xbe\x11\x09\xc4\xf3\x50\xf5\xec\xdb\xe9\xd4\x72\x39\xfb\x2d\xe4\xae\x6a\xb1\xb8\xd0\x99\x5a\x58\xe6\x22\x28\x8a\x4d\x6f\x70\x86\x28\x33\xf2\xb5\xaa\x03\x96\x13\xae\x22\x11\x9a\xd8\x6a\x86\x4c\xab\x82\xa6\x17\x35\xa8\x28\x29\x92\x37\x04\x11\x26\x3c\xea\xa4\x45\x14\x28\xe3\x94\xda\xfc\xf4\x88\x02\x03\x54\x41\xbc\xbe\x5f\x6c\x6f\x9f\x9e\x1f\x76\xb7\x4b\x22\xa0\x5d\xfa\x06\x2c\xb0\x32\x9a\x7b\x2c\x10\x1d\x23\xc0\xd5\xe7\xe6\x28\xdb\xcf\x03\x9e\x8a\x44\xd3\x09\x96\x26\xb8\x3a\xd6\x25\x10\x59\xb9\x97\xae\xf0\x2d\x50\x52\x64\x8e\x60\xc1\xcd\x5b\x7e\xf0\x66\x5c\x7d\x2a\xdd\xef\x4e\x09\x43\x0c\x92\x89\x7a\xd1\xf9\x91\x17\x85\x51\x60\x11\xf3\xdd\x7a\xb6\xad\x61\x20\x89\x16\x51\x98\xa0\xec\xfa\xf7\x3f\x58\x57\x2f\xab\xbe\x73\xa3\x10\x2d\xd6\x85\x22\x10\xdd\x10\x5d\x3b\x9a\xfc\x73\x4b\x79\x14\x65\xd2\x96\xc6\x60\xdd\x54\x9d\x93\xdf\xd8\x5c\x7e\xd5\xf4\x17\x8c\x94\xe5\xc0\xec\x16\x4d\x8d\x70\x73\xe2\xa5\x44\x11\x5a\x06\x3a\x42\xb4\xd9\x4f\xbd\x9b\x61\xb8\x44\x94\x84\x56\x73\xe4\xdb\xd3\xbd\xbf\x72\x2a\x38\x73\x55\xb2\x8f\xc7\xbd\x83\x1f\xbf\x34\xa8\x6f\xab\x7a\xe6\x78\xcd\x3a\x26\x55\x61\x06\x7e\x18\x5b\xd9\xa7\x89\xb5\x19\xa5\x0a\x53\x4b\xc5\xe6\x92\x16\x4f\xe5\x6b\x35\xea\xbd\x54\x47\x89\xe5\x76\x2f\x8a\x7b\x54\x55\xd9\x8e\xb0\x2b\x22\xca\x42\xd0\x23\x6d\xd9\x7c\x6e\x16\x47\x59\xa8\x43\x5f\xe9\x71\x5f\xf5\x97\xcd\x32\xed\x62\x4b\x24\x30\x69\x91\xf1\x43\x1a\x5f\x44\x3c\x16\xc6\xc9\x34\x51\x90\x0c\xc6\x19\x1d\xdf\x26\xcb\x6c\xcd\x58\xfb\xd6\x5d\xc0\x67\xc1\xfc\x51\x6e\xb8\x43\xef\x2d\x6a\x99\xb7\xf5\x69\x60\x5c\x44\x22\x88\x32\x67\x0b\x50\x50\x7c\x66\x4b\x44\x20\x58\xea\xc2\xc2\x14\x3a\x19\xf2\xda\x7e\x27\x8e\x24\x63\x94\x21\xb9\xca\xdb\x22\x7f\xef\x7b\x46\xa6\x9c\x2c\x15\xb3\x39\xca\xf3\x96\x5f\x24\x31\x4e\x52\x4f\x04\x34\x26\x12\x74\xc7\x55\x68\x03\xaa\x9e\xa6\x67\x54\xf5\x46\x07\x29\x68\xde\x7c\xc0\xe1\xae\x6a\xaf\xab\xa2\x9f\xdd\x2a\xb2\x9c\xc3\x83\xc2\x06\xf5\xef\x80\x57\xf7\xed\x52\x2b\x78\x4d\xb5\x63\x67\x97\xe0\x48\x27\x41\xcf\xb7\x4b\xde\xec\xa3\xa7\x87\x11\x91\xce\xd2\x34\xea\x91\x7f\xcb\xba\xbe\xae\xf6\x12\x66\x31\xaf\x08\x51\x58\x64\xab\xc9\xbd\xf9\x7c\x3c\x01\x74\x8b\xc8\x84\x40\xdf\xb2\x45\xb0\x80\xe6\x66\xd5\x59\x8e\x37\xa3\x37\x36\x91\x15\x72\xa5\x64\x60\xbb\x87\xf9\xb7\x34\x31\xa7\x7a\x1a\x93\xbb\xe0\x46\x1a\xcf\xa8\xa6\x44\x64\x12\x4c\xdd\x7c\xd8\x11\xdc\x62\x77\x6c\xb0\xde\xd5\xa8\xa0\x99\x99\x58\x91\x11\x40\xdb\x78\xf3\x56\x7d\xdc\xe0\xfe\x58\xd7\xf0\xea\xb4\xba\xfb\xe9\x63\x84\x89\x6d\x92\x53\x55\xb5\xb6\xda\x15\x13\x0b\x63\x24\x21\xed\x4f\x31\x0a\xa2\xa1\x1c\xeb\x19\xfd\xa4\x88\x03\x63\x6c\x25\x37\xb9\x1b\x57\x38\x7b\xa0\x98\x25\x29\xf9\x70\xf2\xf8\x49\x18\x50\x8f\x8a\xed\x1e\xf0\xfc\xbe\x18\x87\x71\x46\xfb\x22\x65\xf9\xfe\xa6\x5d\xf9\xf0\x2f\x0f\x2e\x13\x71\x14\xa2\xd7\xf4\x72\x0f\xdd\xad\xdd\x93\xd8\x54\x1c\xc5\x48\x21\xde\xbc\x6c\xb0\xa6\x85\xf2\x4b\x9a\x34\x11\x47\x89\xa2\x91\xb9\x05\x0d\x03\x9b\xc7\x9a\xaa\x60\x06\x3a\x1b\x11\x47\x46\x27\xfd\xee\x66\x3f\xb7\x05\xe8\x7f\x1d\xba\xe9\x2c\x5f\xaa\x05\xba\x79\xfa\xbe\xdb\xbc\x3c\xfa\xcb\xc5\x51\x1a\x99\xde\xe9\x5b\x14\xc5\x0d\x1e\xb0\xd4\x58\xaa\xbc\x37\x7e\xe2\x18\x33\x4a\xf3\x59\x8b\xdc\xd6\x3f\x91\xe8\x67\x5e\x9e\x94\x35\xbb\x53\x92\x2c\xe6\xd1\x28\xad\xd1\x87\x43\xc2\x09\xcc\x71\xf8\xd7\x9f\x07\x49\x66\x99\xc1\x4b\x4d\x5b\xf3\xb4\x12\x6e\xb2\xbd\xc4\x29\x20\x19\x01\xee\xb9\xe0\xd8\x50\x45\x8b\xe9\x7a\x7b\x88\x44\xc6\x82\xc5\xe4\xac\xfd\x1d\x3a\x4e\x85\xdf\xfa\x03\x82\x22\xcb\xf5\x19\xd0\xfe\xd4\x39\xf4\x27\x48\x46\x50\xf2\xfd\xb1\xcd\x37\x58\xea\xe5\xf6\x8e\x88\x8a\x72\xd3\xf9\xc1\x65\x6b\xeb\x42\x2f\x1a\x9a\x31\xa4\x09\xeb\xf9\x6d\x2c\x4d\x2a\xc9\xf1\x77\x43\xf7\x5c\xa1\xa2\x88\xc1\x48\x13\xba\xcd\xfc\x2a\x7f\x5d\xd7\xd5\xbe\x1a\x51\xb2\x8b\x58\x4a\x6b\xbb\xbe\xbe\xaa\xd9\x9e\x18\x2b\x1d\x52\x29\xc1\xd5\xe2\x7a\xf1\x5b\xff\x9f\x09\x74\xaf\x0f\x66\xce\xdd\x52\xa1\x96\x7c\x10\xee\xa0\x6a\xff\x49\x9d\xcf\x7f\x8d\xfa\x56\x19\xc1\x5c\x00\xe7\xca\x8a\x5d\x9d\xf2\xbd\x8b\x18\xe3\x8c\x00\xc0\xb7\x45\x3e\x26\xdd\x15\xb1\x89\xb4\x07\x8b\xbf\x1c\x4e\x89\x3b\x44\x6c\x62\x5b\xee\x77\xb0\x1a\x16\xfd\xc4\xa0\x3c\x6e\x1f\x73\x88\x0d\xc4\xa1\x97\x1b\xba\x7a\xf9\x6b\xf5\x38\xa6\x4e\x15\x49\xc0\x40\x0f\xa5\x4b\x0e\xbe\xfb\x55\x3d\xbe\x48\x98\x93\xd9\x5f\x57\xdf\x1f\xee\x89\x9d\xcd\xdb\xbf\x09\x4b\x25\x64\x23\x85\x20\x67\x65\xd9\xa4\xe9\xcd\xd1\x96\xee\x8f\x6a\x33\xbb\x33\x14\x89\x4d\x4a\x6c\x1f\x48\xb4\xe4\xd8\xe3\xd9\xb9\x6f\x22\x14\xad\x9b\xf7\x8b\xdb\xd5\xe3\xe2\x3e\xf3\xa7\x86\x71\x34\xd1\x7f\x99\xc3\x55\xce\x3a\x53\x49\xc4\x02\xe9\x8a\x41\xbd\xc1\xf8\x0c\x13\x1f\x68\x14\xbf\x4e\x22\x08\xb9\xdb\x52\xbf\x61\x89\x8d\x67\x93\x99\xf6\x48\x84\x48\xce\xf3\xca\x46\xf3\xd6\xc7\xce\x4b\xb2\xea\xf3\xb3\x9b\x1b\x26\x5c\x85\xd3\x92\xea\xb0\x26\x4b\x63\x12\xa7\x19\x8b\x7c\xbd\x6e\xb7\xb3\xde\x41\xf1\x23\x2f\xfb\xed\x21\x49\x74\xac\xd0\xef\xf0\xbd\xd1\x38\xbb\x49\x1a\x08\xee\xf6\xd8\x6b\x38\xe4\x2d\x14\xf3\x06\x61\x4a\x21\x70\x2b\x16\x4d\xd0\xf5\xc5\x50\x92\x2f\x92\x54\x20\x5d\xc0\x99\x94\xeb\xa3\x5c\x5d\x3f\x8d\x56\xda\x24\x4b\x0c\xed\x7a\xcd\xf1\xd0\x0d\x96\x7d\x1f\x5d\x4f\xb2\x54\xf1\xb0\xa7\x09\x2d\x96\x3f\x0f\x13\x5b\xc5\x7f\xd2\x2c\xcb\x24\x0e\x58\x1e\x32\x27\x1e\xab\x91\xf2\xff\xf4\x81\x33\x1e\xe0\x48\x09\xbe\xaf\xf7\x74\x9b\x3e\xbf\x14\x38\x3b\x51\xe7\x9b\x32\x90\x88\x24\x53\x40\x7b\xd1\xd5\xd3\xe3\xcb\x66\xfb\xfd\x69\xa4\x80\x2d\x92\x4c\x73\xca\xbc\x12\xf3\x5a\x3f\xbd\x7a\x61\xdf\x79\x64\x37\xc9\x34\x10\xf6\x98\xba\xf5\x06\x9b\xb6\xae\xfa\x89\x91\x19\x34\x71\x5f\x49\x37\x00\xaf\xa7\xe3\x88\x87\x29\x19\x50\x05\x34\xed\xd5\x51\xbd\xf7\x4e\x5d\xc2\x85\xcd\x9d\xb6\x35\x68\xc2\x75\xdd\x9d\x49\x3e\x5d\x54\x70\x38\xdb\x2d\xee\xca\x22\xb4\xee\x62\x5e\x76\x8e\x4b\x83\x8e\x72\x85\x0c\xd3\xab\xcf\xa7\xb2\xff\xe8\xdd\x5a\x65\x6c\xb5\xc3\xdb\xa5\x88\xa5\x6f\x9a\x32\xd9\x2f\xe6\x84\x1e\x3f\xe5\xfe\x12\x09\x30\xa5\x42\x4f\x07\xf8\x31\xce\x8a\x24\x10\x0b\xaa\xe7\x79\x29\xd5\xa8\xac\x49\x24\x90\x84\xcc\xc5\x77\xfa\xe7\x02\x2e\xa3\xb8\xdf\xa7\x4f\xa2\x3c\x73\x20\x99\x48\x64\x14\x12\xa1\x9d\x65\x2d\xde\x56\x87\xb3\xeb\x6b\x22\x63\xab\x1a\x74\x80\xbc\xbf\xbf\x0a\x99\x50\x63\x49\x40\x92\xec\xfe\x7a\xb9\x54\x61\xa2\x1d\x5a\x7e\x50\x55\x9e\x75\x85\x8a\x84\x8f\x0e\x3c\x1e\xf7\x4e\xb3\xa1\xbf\x69\x8a\x7e\x27\xb8\xb2\xdd\xbe\x29\x7a\xfa\x93\xf3\x91\xda\x44\x07\xd8\xcb\x84\x2c\x4a\x6d\xf1\x80\x53\x88\xe8\x38\xff\xed\xcf\x0a\x35\x79\x27\x57\x55\x6b\x77\x82\x53\xef\x3f\xd1\x71\x46\x4e\x86\x95\x24\xde\x38\xd1\x85\xc5\xc3\x40\xfd\x24\x12\x0d\xce\x12\xab\xf3\x09\x2d\x82\x48\x30\x48\x82\x01\x56\x56\xe3\x57\x6a\x5d\xfe\x14\x16\x7b\x71\x7c\xf2\x27\x3b\x93\x7f\x43\x14\xf0\xb3\x0f\x86\x51\xd4\x67\x4c\x8e\x6d\x65\xcc\x09\xd6\x5b\x24\x26\x55\x94\x2d\x2b\xe0\x58\xaa\xb7\x81\x99\x45\x24\x06\x53\x32\x40\x7e\x74\x86\xca\xc2\x4f\xf3\xfb\x97\x29\x75\x88\x48\x03\x16\x50\xf9\x39\x55\x57\x3c\x5b\x77\xd3\x99\x99\xbe\x45\x14\x1a\x4b\x50\x7a\x6c\xa6\x1a\xd9\x83\x75\x90\x06\x09\x52\x30\xdf\x6f\x5e\x67\x05\xc7\x44\xca\x82\x30\x71\x64\xa7\x7d\x01\x86\x48\x59\x14\x06\xe3\x3a\xa6\x2f\xe2\x39\x69\xc4\x6d\x45\xc4\x6b\x8d\xde\x01\xe8\x8f\xd8\x72\xb3\x6f\xd8\x6e\xdf\xf0\xfb\x5b\xe5\x2f\x1f\x43\x4a\x32\x2a\x96\x6b\x10\xea\xf6\xc4\x12\x4a\x63\xb4\xdc\xc1\x56\x1d\xc8\xee\x13\xfd\x34\x4d\x93\x98\xdb\xfd\x01\x8c\x7d\xb6\xa1\x78\xae\xfb\xe0\x97\x81\x7a\xd3\xae\x4e\x92\xc4\x67\xd1\x37\xf9\x6b\x89\xf5\x08\x65\x2f\xd2\xc4\x00\x45\x3e\xe9\x43\x34\x3b\x57\xfb\x3c\x3c\x44\xaa\x2d\x1b\xde\xb1\x9c\x6b\x46\x8a\x34\x45\x41\xd8\xb8\xf7\x46\x5d\x10\x81\x9c\x98\xd3\x69\xc6\x21\x71\xc2\xf1\x9f\xdd\x63\xdc\xd4\xf0\xe1\xef\xc3\x63\x11\xb8\x9a\x0b\xac\x21\xef\xff\x16\x40\xb9\x1e\xac\x5f\xfb\x8e\xe5\x3a\x25\xd8\xdc\x5f\xf7\xd7\xff\x0c\xae\x2d\x52\x8e\x29\x39\x18\xf6\xce\x5b\x78\xef\xac\xce\xd9\x90\x14\x02\x28\x0c\xf4\x23\xc7\x8f\x8d\xcf\x4c\xf5\x3e\x4a\x2a\x64\x68\xc9\x50\xbb\x7d\xac\x67\x27\xdd\xde\x6d\x2e\x9b\xe3\xa9\xd0\x16\x1d\xf2\x81\xf9\xa4\xe6\x42\xa4\x92\x31\xe9\x66\xd9\x77\x27\x26\x65\xa9\x9c\x28\x28\xe2\x03\xb3\xae\xf0\x5c\xa4\x32\x4b\x29\x53\xd7\x7d\xfd\xf5\x5b\x55\x0e\xd7\x01\x2b\x67\x73\x5f\xbd\x5a\xdf\x60\xb2\x80\xa5\xca\xc1\xe0\x3e\x30\xa7\xc5\x79\x3d\x2c\xb3\x7d\x0b\x99\x24\x3e\xd4\x42\x36\x25\x95\x09\x9e\x4e\xfa\x54\xa9\x98\xd2\x1f\xa4\x6a\x3b\xa2\x7b\x10\xa9\xe6\xb1\x4e\x5c\x94\xc0\xf1\x55\x35\x13\x6e\xa5\xd9\x3d\xb5\x34\x11\x73\x3e\x47\xb7\x78\x7c\xcb\x4d\x1b\x9e\xc7\x80\xa4\x18\xa5\x23\xb8\xd3\xaf\x3c\xb6\x14\xb5\x95\xe4\xeb\x21\xdc\xdd\xc2\xd1\x8d\xe9\x7a\x55\x36\x47\x63\x72\x95\x63\x49\x11\xf6\x66\xcc\xb7\xe3\x9f\xcc\x30\x85\x6e\x95\xbc\xa3\x72\xc4\xba\xc5\x49\x80\x27\x35\x71\x10\x78\x35\x92\xd7\xce\xa3\xbd\x30\xf0\x27\x33\x25\x0b\x82\x94\x46\x3e\xf1\xd3\x4d\xa0\xd6\x22\x0b\x32\x0b\x3f\x52\x8f\xb9\xc2\x6f\xc7\xcf\x95\xfe\xd9\x1f\x52\x42\x51\x91\xdc\x72\xf1\xe0\x69\xca\x3c\x06\xc4\xb7\x61\x41\x44\xc3\x36\x6f\x2c\x80\x68\x7a\x63\x16\xa2\x55\xc5\xb0\x8b\x8b\x1b\x85\x6b\xcb\x24\x74\x3e\xeb\x77\xbe\x12\xd5\x5f\x2f\xb2\x85\xf7\x77\xc7\x3d\x94\x5f\x2c\x98\x19\x8b\x0c\xb7\x1e\x11\xc2\xc1\xda\x6b\x3f\xf2\xa2\xe8\xb9\xdc\x44\x16\x46\xa0\x9d\x15\xfe\x80\xda\x25\x04\x67\x83\x2e\x0b\x63\x4d\xcb\x13\xf1\xa6\x3e\x95\xf3\xa3\x32\x20\x9a\x8f\xbc\xe9\x55\xce\xce\x03\x80\x45\x16\x05\x08\x2e\x4a\xb3\xd2\xd8\x67\x7e\xb2\x48\x70\xda\xe2\xdf\xaa\x63\x5d\x7c\xae\xfb\xca\xe7\xfe\x38\x46\xc4\xa1\x94\x37\x8b\xe2\xf0\x06\x2f\x87\x83\xcf\x34\x33\xd7\x22\x4e\x22\xa2\x71\x6c\x5f\xeb\x0d\xb6\xf7\x79\x1f\x5b\xcf\x62\xb0\x14\x68\xd7\x27\x34\x06\xd3\xbe\x4a\x02\xe4\xc9\xa8\x46\xcb\x69\x1f\xcc\x1a\xa5\x09\xed\x98\x3d\xac\xc3\x95\x88\xf8\xc3\x2a\xa5\xb8\xf9\xc6\x29\xe0\x8f\x3a\x62\xd8\x2f\xb3\x34\x48\x3d\x1d\x63\x37\xb8\x6f\x5c\x68\x60\xe4\x2e\x7a\x9f\x2d\xcb\xa4\xb5\x3e\xbb\x99\x44\x10\xf8\xae\x21\xcd\x88\x66\x61\x19\x78\x5c\x43\x1e\x00\x01\xc0\xf1\x07\x96\xed\x1c\x04\x72\x7e\x4f\xca\x38\x43\xcf\x51\xb1\xfc\x89\xfb\x43\x7b\x5e\xdb\x4a\x64\x3c\xd6\xf4\x5a\x54\xa9\x8d\xe5\x56\xcf\x07\x08\xe7\x21\xad\x3d\x16\xb1\x68\xe9\xdf\x55\xfb\xb4\x2f\xf3\xb1\x0f\xfc\x5f\x27\xfe\x70\xc6\x25\xa7\xf5\x1c\xa8\xc0\xe4\xb9\x7b\xfa\xe3\xfc\xe2\xc0\x4c\x62\x0b\xac\xc6\xaa\x7d\x22\x03\xa1\x49\x0a\xcd\x62\x94\xba\xd5\xe4\xe2\xb8\x93\x89\x76\xf8\x76\xaa\xeb\xda\x35\xd8\xee\xf3\xf2\xb9\x9a\x27\x77\x33\x15\x33\x32\x17\xd6\x2f\x57\xf7\xab\x6b\x4b\x81\xb4\xdb\xae\x1e\xbc\x23\x95\x29\xa1\xb4\xd3\x0c\xd8\xb4\xd5\x61\x94\xee\xca\x94\x14\x14\x7b\xbb\x2d\xba\xad\xe4\x06\x0b\xf8\x5c\x28\x85\x4d\x33\x2c\x7f\xb3\x7e\xd5\x0c\xa2\xb8\x27\xd6\x1a\x48\x68\xfc\xe1\xcc\xe2\x52\x72\x07\x51\x6e\x28\x8f\x8c\xb3\x00\x50\x66\x98\xd5\x2b\xf2\xe6\xd7\xb6\x1a\xbb\xb1\x99\x89\x83\xcc\x55\x34\x38\x6e\xc4\xd9\xe9\x02\x68\xfa\xee\x2d\xdf\xea\xb8\x8b\x79\x10\x49\xb2\x57\x09\x76\x7b\x66\xa5\xe7\x01\x58\xb4\x74\x73\x40\x95\x13\xb7\x3e\xbc\xd2\x12\x31\xb9\x07\x67\x2c\x49\x6c\x41\x4d\xbe\xc6\xfa\x66\xeb\x51\x12\x9c\xa5\x82\x82\x08\x75\xd7\x65\x69\x34\xfd\x1a\x9c\x29\x85\xdd\xa3\xef\xf6\x79\xd9\x92\x28\x83\x4b\x63\x9c\xfd\xca\x3c\x0c\x33\xea\xce\xef\xfd\xcb\xf3\x10\x34\x85\xce\xcb\xca\x87\x32\x67\x21\x4c\x1e\x85\x2a\x70\xae\x20\x19\x66\xfa\x7c\xb4\x9f\x47\x3a\x4b\xc2\x81\x0b\xde\x7b\xc3\x3c\x0e\x35\x01\xbd\x6c\x19\x6b\xb7\x33\x9e\xa6\xec\xce\x07\x6b\x79\x9c\x02\x65\x5e\xad\x30\xc3\x3c\xd9\x3c\x6b\x0b\x81\x03\xcc\xb4\xb7\xb8\xef\x15\x1b\x67\x7e\x3b\x8f\xa5\x8a\x1d\xfa\x73\x51\x23\x50\x74\xe1\xc2\x05\x4d\xec\xa3\x41\x57\x2f\xe7\x23\xe4\x3c\x36\x82\xbc\x4b\xb2\x8c\xef\xbd\xe0\xfa\x00\x9f\xf7\x7d\x90\x04\x91\x1e\xa9\xd1\x3b\xb9\xd9\xaf\xe0\x2c\x3c\x49\x85\x71\x2b\xa5\x2b\xcd\x28\xdb\xb1\x20\xc3\x60\x59\x9c\xb1\x61\x79\x02\xa0\xbc\x35\x7d\xa8\xca\xce\xd4\x79\x9c\x8d\x9d\x34\x4e\x28\xb2\x67\x10\xc7\xa6\x36\x4f\x55\x40\x35\xb5\xf9\xf8\xcf\x0c\x94\x2f\xb4\xbd\x86\x43\x73\x2c\x4e\x79\xb8\x04\xcf\x14\x27\x78\xbc\xa3\x2d\xb7\x54\x8a\x13\x4b\x8f\x73\x8c\x08\xc2\xb6\xcf\x5f\x6b\x68\x71\xc6\x71\xe6\x1a\x89\x48\xab\x5e\x23\xec\xf7\x71\x7a\x6e\x6a\xa1\x71\x21\x62\xe5\x34\x06\xae\x97\xdb\xb4\x7b\xa4\xab\x4f\xa7\x83\xd1\xdf\x52\x80\xa2\xed\xad\x5b\x60\x6e\xf2\xf9\xbd\x20\x16\x94\x9a\xdd\x05\x3f\x6f\xaa\x57\x54\x03\xe6\x96\x03\xa4\x34\x5b\x4a\xfc\x39\x95\x61\x7b\xa6\xd5\xa8\x6f\xa6\x52\xab\xa1\x40\xb4\xfb\x0e\x0f\x3a\xf9\x18\xa0\x13\xf2\xb4\xaf\x6f\x9f\x66\x2f\xa0\x82\x2c\x8a\x9c\x89\x79\x32\x54\x15\x4b\x68\xc7\xa2\x2c\xa6\xad\x00\xfc\x6a\xc0\x28\x86\x8c\xb0\x58\x4f\xab\xc7\xdd\x7a\xf9\xbc\x5b\x6e\xef\x96\xcf\x04\x84\x7a\xf2\x34\x75\x82\xab\xc8\xee\x09\xa0\xf5\xa6\xad\xf3\x69\xc4\x8e\xa5\x93\x7d\xe8\x1c\xab\xc7\x65\xaa\x8f\xee\xda\x46\xb1\x41\x34\xa2\xae\xfe\x83\xe5\x9c\xc5\x6e\xf6\xcc\x29\xa3\x80\xb8\x13\x73\x7c\xb9\x5f\xad\x27\x62\x8e\x82\xeb\x20\x23\x40\x23\x05\xea\xd7\x55\x55\xcc\x7a\x50\x47\x56\xf0\xc7\x19\x25\x57\x57\x4f\xfd\x91\xc4\x44\x4e\x9d\x63\xc0\xcb\xbb\x63\x18\x1b\x82\xb1\xb8\xb3\x2e\x94\xbe\x4e\x47\x0a\xa6\x3c\xf1\xd9\x70\x7a\xb5\xd9\x48\x32\x32\xd0\x8e\xac\x73\xf9\x03\xcb\x6e\x8f\xdf\x52\x99\xd1\x6c\x96\x18\x69\x68\xbc\xd0\x52\x78\xb5\xbd\x9e\x8e\x15\x83\x56\x41\xad\xad\x3e\x4a\x55\xe7\x58\x5f\x43\x51\x48\x70\x45\x7d\x03\xad\xd5\x64\x5a\x89\x80\x89\xd8\xb1\xe6\xaf\xae\x9f\x36\x27\x0a\xec\x42\xb0\xc8\x92\x48\xd8\x15\x68\x4b\x65\x62\xe7\x3f\x8a\x60\x99\xb0\xbe\xf6\xcf\xbc\xed\x7a\xfc\x37\xff\x3f\xb7\xd8\x52\xc7\x6a\xfc\xb5\xed\x24\x98\x48\xa9\x40\xb6\xf3\x9c\xee\xab\xaa\x39\x9f\x59\x3a\x35\x7c\x4e\x76\x01\x82\x44\x11\x6a\xba\x6a\xd1\x96\xed\x4f\x84\xb7\x85\x88\x50\x87\xba\x4f\x7d\x0e\x48\xcb\xf3\x0f\x16\x27\x11\xf9\xa2\x4a\x06\x26\x41\xe3\x33\x0c\x22\x49\x02\xed\x51\xe0\xd6\xee\x9c\x05\x09\x45\x22\x84\x63\x3d\xc2\xd5\xf5\xd3\x3f\xdb\xc3\x44\x9a\x00\xd3\x23\x02\x72\x03\x0a\x57\xfb\x83\x45\xc5\x9c\x49\x87\x4e\x06\x95\x48\x8d\xc8\x7a\xfa\xcf\xab\x63\xdd\xd7\x1a\x09\x91\xa5\x82\x96\xa7\x07\x82\xbf\xd9\x0c\xe9\xef\xf8\xd9\xf3\x58\x70\xdf\x0e\x15\xf7\x28\x84\xf6\xa8\xb1\x6c\x57\x37\xa4\xa2\x3d\x5e\x25\x05\x67\x5a\x3a\x68\xd9\x42\xff\x20\xa0\xdd\x79\x97\x49\x70\x6d\x28\xe2\xb5\x39\x1e\xb0\x7e\x29\xda\x1a\xd6\xd5\x07\xd6\xa3\x6a\x05\x21\x18\x24\x72\x08\x09\x17\x9d\x71\x56\xe2\x65\xe1\x40\x21\x44\x62\x6c\x39\x75\x55\x95\x9b\x76\x88\x1c\x08\xa1\x32\xda\x30\xf2\x32\x6f\x1f\x61\x8f\x9b\xcf\xbd\xac\x8a\x73\xa6\x96\x80\x80\x65\x6a\xc2\x1a\xd2\xdf\xda\x5f\x0d\x32\xe9\xd5\x4b\xa7\xb2\x4d\xd3\x57\x04\x93\xc6\xf2\x02\xce\xee\x44\xe9\x4a\x08\xc9\x53\x9b\x7a\xa7\xc1\xf9\x52\xe6\x6d\xe3\x18\xd5\xa6\x43\x41\x25\x09\xed\x8f\x16\xa1\x6a\xc5\x6e\xfc\x93\x29\x95\x84\x43\x60\x7b\x09\x75\xf1\xb9\x2a\x55\x75\x8a\x5d\xf6\xed\xb5\x12\x43\xce\x97\x70\xd1\x27\x9c\xce\x42\x68\x13\x19\x36\x42\xf4\xf5\x8c\x3e\x0b\xd2\x6d\x3a\xf4\x35\xc0\x42\x60\x2a\x29\xb2\x75\x86\x7e\x5d\x08\xcc\x22\x36\xca\x85\x5a\x69\x84\xfe\xcc\x0c\x28\xea\x33\xe2\x77\xe8\xac\xe8\x66\x3a\xc0\x50\x24\xa1\xe3\x39\xfb\x1d\x3f\x9b\xf9\x0d\x74\x44\x50\xa3\x5e\xbe\x66\xe0\xef\x14\x02\x91\xd3\xce\x46\xcc\x21\xf9\x7f\xb0\xe7\xf8\x16\xc2\x24\x86\x24\x45\xd4\x71\xbf\x28\x72\x2c\x9d\x9d\xd0\xbf\x95\xc9\x42\x8a\x83\xc8\x89\xfb\x30\xbd\xb7\x31\x8a\x64\x04\xba\x47\x6f\xda\x53\x98\x1e\x04\x81\xa0\x81\x45\x3c\x9b\x25\x14\x9b\x4b\xfa\x53\x5d\x53\xa4\xa6\x7d\x5f\x78\x5c\x98\xb3\x19\xe6\x09\x8b\xe3\xa9\xaa\x8a\x80\x20\xd2\x04\x3e\xd2\x23\x95\xb0\x99\x58\xa8\x27\xa8\x1e\xef\x02\x10\xa4\x89\x74\xb6\xed\xfd\xd3\xeb\x74\x28\x00\x13\x82\x7b\x8c\x8c\x2b\x52\x8d\xff\x42\xf0\xfa\x11\x02\xc2\x34\xec\x11\x2b\x84\x18\x1a\xd0\x3a\x10\x02\xd0\x0a\xdb\xbe\x41\xf9\xfe\x57\x75\x9c\xf6\x20\x84\xca\x4a\xbd\x59\xb6\xfc\x7b\x68\xda\xb1\x93\x04\xa1\x8e\xa8\x3c\x56\xbd\xbd\x97\x95\x46\xcb\x57\x33\x7b\xbc\xc8\x80\x14\xee\x12\x45\x5f\xde\x2b\x20\x0e\x2c\xcb\x8c\xcd\xdf\x38\x7e\xec\x4d\x0b\x83\x18\xc4\x2f\x49\x20\xa6\x37\x4a\x42\x2d\xd3\xc9\x2a\xf1\xd2\x60\x7d\x5f\x29\x57\xe9\x38\x8d\x80\x42\xa2\x02\x13\x4f\x31\xb1\xcb\xde\x3b\xeb\x0c\xc4\x18\xfa\xb0\xdf\xe6\x78\xb0\x3a\xdc\xb3\xee\x49\xe3\x31\x60\xda\xc7\xc3\xd7\xdd\xb0\x08\x47\x18\x25\x48\x33\x1b\x87\x7d\xb9\x7b\xf9\xb6\x7a\xec\xff\x35\x11\x15\x3a\x55\x6e\xf4\xef\xa6\x82\x2a\x93\x95\x70\x04\x2b\x71\x67\x67\x71\x48\x18\x9e\x3b\x38\x1c\x3e\xef\x73\x33\x62\x66\x11\x90\xe9\x44\x79\xef\xd5\xd1\xc3\xfa\x43\x9c\x85\xa1\x8b\xfc\xd2\xbc\xe9\xd9\x98\xb9\x6f\x10\x45\xe8\xea\xae\x37\xc7\xfd\x09\x85\xa7\x00\x9e\x6a\x5f\x98\xdd\xd9\x00\xdf\xf3\x59\x58\x0c\xb8\xd2\x94\x07\x5b\x57\x05\xd4\x67\x73\xed\xc0\x8d\x22\x9b\x6a\x12\x33\xfc\x47\xd2\xd8\x02\x84\x12\x7e\xe3\x75\x1f\x7a\x7d\xaa\x78\x25\x00\x58\x1c\xf0\x11\x61\xfd\x6d\x91\x1f\xfa\x39\x01\x19\xaa\x41\x67\xa8\x73\x7f\xa1\x3d\xd6\x53\x8c\x13\x80\x50\x94\xdf\xde\xe7\xe5\x19\xc6\x0f\x01\x20\x03\xa2\xc1\x5d\x9f\xbc\x1e\x28\x4d\x42\x34\xab\x32\x6f\xa1\x58\x57\xfd\x7d\x65\xa0\x08\x5a\x41\xd9\xe5\x0d\xb6\xbe\x6e\x73\x24\x35\x31\x7d\x0b\xa9\x11\xbd\x00\x51\x95\x7f\x6d\x75\x83\x0e\x2d\xf4\x71\x0f\x3f\x6f\xe0\xb3\xbf\xa9\x8e\x6d\xb0\xa5\xaf\xdb\x7e\xa8\x4a\xfc\x7c\xa0\x4a\xa8\xdf\xce\x2e\x54\x18\xab\xcc\x06\x36\xbb\x25\x11\xeb\xa5\x5f\xbd\x89\x64\xb8\xc9\xfd\x16\x01\x28\xad\xa8\xb4\x43\xd4\x3f\x54\x9f\x63\x7e\x24\x01\xa8\x2c\xb9\x43\x81\x3f\xb0\x78\x39\xeb\x94\x7c\xfd\x63\xaf\x23\x83\x48\xf9\xda\xce\xab\xfc\x02\xdc\x5b\x06\x1a\x69\xbb\xa6\x5c\x91\xe7\xb0\x9b\x7c\x18\x19\x18\x83\x30\xa6\xd6\x72\xda\x19\xcb\xce\x0b\xec\x93\x2d\x92\x29\x9b\xac\x9d\x56\x98\x75\xeb\xc9\x89\x66\x95\x90\xcc\x25\x77\x08\xef\xe1\x15\xfb\xdd\xb2\x3e\x6d\x19\x06\x96\xa5\xa0\x3c\xee\x7b\x35\xa9\xe6\xcf\xed\xe7\x61\x32\x03\x65\x98\x4a\xeb\x6e\x15\x08\xf5\xd6\xca\x08\xa1\x0d\xd1\xdc\x41\xf3\x36\xe2\x4a\x3c\x81\x48\xcc\x67\xd0\x99\x10\x82\x8c\x23\xa0\x61\xeb\x42\x96\x13\x07\xfc\x76\x9e\xbb\x94\xb1\xb0\xf8\xc9\xc5\xcd\x1f\xab\xcd\xd3\xf3\x6e\xfd\xf4\x74\xbf\x5b\x3d\xf6\xc5\x37\x32\xd6\x8c\x52\xae\xc4\x85\xb9\x6b\x06\x92\x47\x21\xd3\x04\xa8\xf6\x71\xfd\x74\xfd\x57\xff\x9f\xd2\x14\x30\xa5\x70\xf6\xc8\x2b\x97\x59\x94\x11\x0f\xee\x3d\x8e\xd5\x46\x84\xe4\xb1\x05\x0e\xf5\xa4\x03\xae\x94\x75\x3a\x51\x24\x57\x60\x8c\x8f\xd8\x78\x6a\x83\xfe\x83\x72\x0d\x64\x05\x2b\x57\xf5\x95\xeb\x49\x55\xa2\x14\x9c\x91\xa9\x53\x51\x02\x37\xaf\xca\xc5\xd8\x19\x95\xc2\x44\xbd\xfa\x2c\x36\x4d\xb7\x28\xae\xeb\xaa\x33\xb9\x86\x5b\x00\x53\xde\xd0\x5e\xd7\xf9\x0f\x2c\xf0\x15\xf5\xd4\xe8\x9a\x5a\xa3\x12\x42\x24\xcb\x6c\xeb\x5d\xe0\xe5\xcf\x37\x70\x94\x40\xd3\x97\x83\x2c\x4c\x60\x0c\x77\xaa\xea\xbd\x65\x5d\xd9\xed\xf3\x4b\x2a\xa5\xdd\x69\x96\x16\xc8\xcd\xce\x11\x43\xa7\x90\xc0\x33\x82\x07\xe1\x4f\x54\x47\xc7\x94\x6d\x2b\xa6\xcf\x83\xc6\x25\x70\xed\xe5\x88\x1f\x6c\x90\xc7\x22\x1c\x56\xc4\xba\xb4\xc9\x65\x91\x97\xaf\x63\x39\x3b\x21\x65\xec\xc0\x7d\x6f\xd5\xc7\x40\x3d\xd3\x73\xf6\xb8\x56\x2a\x92\x94\x7e\xc8\x9b\x05\x49\xc5\xe2\x6c\x25\x97\x2a\xd1\x8e\x09\xad\x84\xe2\x73\xce\xe0\x29\xa4\x92\x96\xf5\x6a\x08\x03\x8f\xa2\x3a\x17\xba\x46\x07\x96\x4f\x82\xc6\xeb\x4a\x55\x96\x85\x37\x2c\xf5\x48\xd7\x53\x48\x9d\x58\xda\xf1\x1a\x7f\x54\xef\x5f\x28\x8e\x0b\x89\x3a\xa2\x44\xd7\xd2\x71\x64\x3e\x57\xc7\x02\xdb\xde\x04\x90\x88\x11\x31\x1f\x7e\xc3\x76\xd7\xd9\x51\xbb\x91\xc4\x86\x90\x26\x49\xad\x9e\xbf\x55\xaa\x58\x50\xa9\xcc\xca\x61\x79\x4e\x20\x29\xa7\x10\xce\xde\x65\x91\x46\xa4\x01\x78\x2a\x98\xe6\x58\xb4\xdb\x31\x17\xf9\xf4\xa1\x55\xc0\x25\x38\x5c\xc2\xba\xc6\x7d\xde\xdb\x85\x8a\x05\x48\x82\xa6\x26\x2f\xda\x1e\x93\xe7\x8f\x89\x28\x88\xbd\xe3\x4b\x03\xeb\x0f\xa8\x73\x59\x9c\x29\xce\x9a\x3f\xf8\x64\x44\x29\xa6\xac\x7b\x65\xeb\xbc\xd6\xd5\xc7\x65\x5e\x2e\xa1\x18\x5a\x50\xb2\x4b\x43\xc2\x24\x5a\xa4\xa2\xc8\x92\xe5\x79\x15\xd9\x66\xd7\xbc\x41\x8d\xfd\xe1\x54\x52\x96\xcd\x20\xea\x69\x9c\x49\xc5\x81\xa6\xe0\xc7\x35\x69\xd8\x56\x79\x71\x77\xdc\xeb\xf6\x73\xf9\xb3\x1b\x8a\x73\x55\x0b\x6f\x03\xa9\x24\xd0\xc6\x95\xc2\x2d\x57\x8f\xe7\xe7\xb7\x4a\x58\x20\xd3\x9e\xb3\xe4\x44\xe0\x7f\xda\x38\x4d\x63\x9f\xac\xb8\x5e\x6e\xd3\x59\x92\x79\xb4\x4b\xcf\x7f\xdc\xf9\x19\x53\x64\x4d\xda\xce\xbc\x45\xdc\xbc\x8d\x14\xcb\x7c\x23\x8e\x81\x23\x8b\xe9\xc5\x89\x85\xe2\x3c\xa5\xb1\xeb\x94\x89\xf7\x07\xc8\x5f\x4f\xf2\xaa\xff\x7f\xfd\xfa\x7b\xea\x88\xf2\x52\x60\xf9\x5c\xcf\x89\x20\x75\x8d\x80\x70\x3e\x76\xa7\x0a\xd9\x3a\xff\xcf\x7f\x60\x5a\xaa\xa2\x3c\xef\x63\x55\x6e\xe1\xb0\xae\x8a\xe2\x96\x7c\x95\xdf\x4e\x81\x51\x4a\x84\xb1\x32\x43\x8d\x9b\xd3\x39\xfa\xed\x74\x16\x29\x10\x96\x89\xda\x91\xc5\x60\x01\xb3\x9c\xa9\x02\x13\xa8\x3e\xf8\xd2\x7d\x22\x4b\x73\xd2\xb9\xc0\xe7\x62\x18\x4a\x8a\xd0\xa7\x27\x9c\xd1\x3a\x72\x44\x95\xd4\x8a\x56\x30\x79\xfc\xcc\x2f\xac\x30\x4a\x41\xcf\x13\xff\x57\x75\xdc\x1e\x25\xce\xb4\x2c\x85\x52\x32\xf6\xfc\x0b\x8e\xa7\x8c\xf9\xc8\xa8\xd2\x41\x60\x46\x9c\xc1\xfd\x4d\x26\x4f\xa9\x13\x5b\x9c\xbc\x6b\xeb\xcf\x65\x0d\x0d\x6e\xf2\xf2\xb5\xc0\xc7\x4a\xcf\x90\x1d\x4a\xa7\x21\xba\x1d\x69\x7d\x94\xef\xf8\x79\x32\xbc\x67\xed\xb3\x8c\x76\xd0\x5d\x8f\x2f\x53\x5a\x84\xf4\x39\x34\x16\xd8\xe2\x9d\x25\x92\x99\x9d\xe5\xc0\x98\x25\x7e\xfc\x81\x75\x33\x24\x5e\x14\x06\x82\x5c\x4f\x8f\x78\x3f\xbf\x68\x20\xb3\x66\x3e\x68\x7d\x0b\xdd\xe6\x33\xff\x8c\x18\xc9\x54\x8c\x70\x93\x16\x4e\x01\xc5\xa2\x28\x16\xf5\xeb\x2f\x22\xc7\x0a\x33\xe3\x79\xb7\x16\x45\xf1\x9c\xbf\xbe\xb5\x77\xd0\xef\x1e\x0a\x31\xa1\x8a\x7c\xeb\x3d\x8f\xd1\x65\xca\x88\xc0\xd8\x05\xbf\x28\x1c\xf1\xd9\xd7\xd4\x27\x3a\x08\x34\xa5\x44\x9f\xb1\xa8\x40\x53\xa4\xe5\x42\x43\x96\xd1\x5a\xb7\xc5\x86\x54\x86\xaf\x7d\x05\xf9\xe9\x5e\xe8\xa3\x74\x3a\xc8\x54\x38\xae\x66\xb8\xad\xea\x49\x28\x48\x07\xbc\x4f\xa5\x56\xe5\x85\x25\x5a\x77\xcb\x9d\xcb\x6b\x50\x0c\xd1\x32\x74\x4d\xba\x4c\x33\x66\x75\xbf\x65\xfb\xa9\xe4\x79\x00\xad\x0e\x63\xeb\x77\x4d\x0a\xbe\x37\xcb\xe5\xcd\xa4\xea\x5b\x87\x3c\x43\x8a\xde\x34\x76\xca\xdf\xd0\x54\x05\xf5\xd6\x1b\x20\x3a\xe4\x00\xdd\xac\xbb\xaa\xab\xf7\xb9\x2f\xa0\xa3\xd4\xb2\x76\xab\x63\xfd\x00\x3e\x21\xa6\xe3\x90\x2b\x18\xe4\x7e\x2c\xf0\x71\x52\x37\xaa\x93\x20\xe5\x2e\x21\x70\x3c\xac\x8b\xaa\x1d\x02\x50\x53\xbb\xdb\xc2\xd0\xc7\x1d\x9d\xa4\x11\xe1\x57\xdc\xab\xef\x0c\x8d\xca\xe9\xb2\xa7\x13\x11\x5a\xd0\x4c\xad\xaa\x12\xc6\xc6\xb0\x4e\x51\x89\x64\x28\x06\x3a\x7e\xfe\xb3\x7a\x68\x9d\x1a\x4e\xf9\xcc\x2b\x6c\x9f\xca\xab\xc1\xf2\xd0\x59\x68\x59\xad\x2d\xbf\x9c\xdf\x56\x67\x0c\xb1\x42\x67\x59\x4c\xa2\xdf\xbd\x37\xb4\x99\x87\x12\xb5\x60\x2c\xb5\x4c\xbf\x05\xb5\xba\x1f\xf1\x66\xfc\xd7\xac\x29\x87\x6c\xa8\x80\xdf\xe5\x25\x6d\xdb\x47\x12\xec\x98\x55\x92\x6b\x08\x0d\xe5\xf1\x6c\x81\xfc\xa4\x33\x20\x92\xb1\xee\x9d\xf8\xab\xaa\xae\xab\x8f\xbc\x7c\x5d\xb5\x33\xb5\x21\xa1\x21\xc9\x88\x9c\xc8\x1a\xb8\xe3\x18\x96\x06\x80\xc4\x31\x03\xdb\x25\x62\x70\x03\x35\x28\x99\x3a\x0c\xfe\xb2\x7d\x1b\x93\xc6\x09\x0d\xc6\x6e\x60\x76\x6f\xfa\x47\x7a\x9f\x42\x4b\x66\xcb\xde\xdc\x22\x7c\x5b\xd5\x8b\x39\x10\x43\x4b\x06\xb1\x71\x91\xcd\xdb\xaa\x1e\xc4\x03\x66\xcd\xa2\x30\x71\xe1\x2e\x8b\xdc\xbb\xaa\x7e\x4e\xec\x34\x2d\x39\x2a\x67\xa3\xb8\x0c\xfb\xc6\x55\x99\xf4\xa2\xf6\xb3\x4f\x28\xb5\xce\x06\xf1\x1c\xab\x91\xd5\x4c\x97\x64\xad\x64\xe0\x56\x6d\xd0\x45\xcf\x48\x2c\xb4\x0e\x32\x42\x2c\xfc\x0e\x75\x31\x51\xeb\xed\x0e\x49\xda\xdd\x0a\x68\x08\xfc\x3b\x0a\x8d\x69\x1d\xe8\x4c\x0f\x1a\x41\x57\x45\x65\x53\xed\xfd\x94\x9a\x23\x7a\xfc\x79\x5c\x12\x7c\x66\xf9\x6d\xc2\x76\xa2\x51\x58\x79\xa5\x06\xdb\x87\xe6\xf5\xfc\x56\xaa\x0d\xb7\xc9\x97\xc7\xbc\xa8\xf6\xd8\xeb\xf2\x09\x6d\xb4\xf6\xd1\x96\x47\xfc\xb8\xa9\xca\x6e\x63\x9b\xdc\x18\x59\xa0\x98\x73\x83\x16\xe7\xd9\xff\x04\x32\x6d\x2b\x8c\x4c\x8d\x78\x5f\xb5\x6d\x45\x39\x75\x77\x30\x0c\x52\x0a\xe6\x9a\xaa\x56\x78\x93\xff\xb0\xf8\xa6\x11\xaa\x18\x43\xa6\xa8\xc5\xcb\xea\x7b\x67\xc9\x4c\xef\x1f\xf2\x94\x52\xe3\x92\x38\xeb\xbb\x05\xbe\x3a\xb6\x03\x51\x8d\x6f\x25\xe3\x8c\xcf\xf8\xa1\x4f\xd8\x6c\xce\x0f\x52\x8c\x02\xc1\x02\xaf\xba\x45\xd4\x9d\x96\xdc\xfa\xa7\xcd\x55\x3f\x56\x43\x14\x15\xa3\x98\x51\x1e\x82\x04\xcb\x17\x5a\x3f\x57\xc5\x89\x96\xe3\xfc\xf2\x60\x69\xcb\x7f\xe4\x75\x7b\x84\x82\xe2\x1b\xcd\xe6\xb8\xdf\xa3\xe3\x49\x9c\x8c\x37\x8c\x53\xcb\xd1\x5e\x1d\xb0\x74\xf2\x81\x36\xdc\x37\x14\x35\x60\xa2\x81\x18\x12\xaf\x3e\xdb\x6a\xff\xad\x2a\x26\x68\x75\x4c\x99\x25\xdc\x05\xad\x6f\x86\x40\x28\x92\x26\xbf\xfd\x7b\xb5\xdf\x1f\xdb\xce\x4f\xea\x3d\xcb\x33\xac\xa7\x02\xd3\xcc\xd0\x94\x7f\xee\x8c\xd1\xfe\x32\x32\xa1\xcd\xea\x8f\xf5\x76\x7a\x57\x13\x99\x99\xce\x4d\x3a\x99\x9f\xc8\x03\x20\x0f\x7c\x97\x7f\x87\xb2\xfd\x73\xbc\xa5\xfb\x16\x4c\x59\x49\x92\xe6\x5f\x95\xb4\x74\x33\xd3\x74\x95\x6f\x17\xa7\x7a\xe2\xfd\x4c\xc6\x3d\xf7\xad\xa4\xf2\xae\x21\xf9\x06\x03\x78\xd9\xb7\x10\xb1\xc5\xf5\x3b\x5b\x0b\xf5\x55\x51\xc9\xdf\xfa\x83\x56\xdb\xc8\x8a\x1b\xfc\x4d\x28\xed\x7f\x81\x7a\x3f\x54\xfd\xa8\x13\xc2\x04\x99\x1b\x39\xb3\x57\x11\x10\x49\xd1\xcb\x61\x7a\xc4\xfd\x2f\x46\xa2\x00\x43\x46\xf6\xb2\x24\xe2\x48\x8d\x93\xcc\x13\x02\x63\x04\xa0\xdf\xc3\xcf\x6b\x38\x4c\xf4\x4a\x05\x02\x06\x89\x73\xa9\x1d\xc5\xca\xf9\xcd\x08\x01\x43\xda\xb7\x96\x55\x43\xac\xe1\xc3\x05\x32\x41\xa1\xda\x42\x8f\x60\x6c\xee\xa0\x0a\x6c\xc6\xf8\x1b\x25\x12\x4d\x5e\xef\x6d\xdc\xe0\x5c\xbf\x2b\xcd\x88\x0c\xc2\xea\xfd\x4f\xf2\xdc\xb3\xf7\xd5\x81\x09\x1c\x15\xaa\xaa\xf2\xf2\x1e\x5f\x3d\xc5\x81\xbf\xaf\x66\xa1\x70\x60\x28\xda\xe6\xe6\xfd\x77\x16\xcb\x31\x5a\x5a\x34\xb7\x60\xdf\x57\xa2\x17\x2e\x06\xa2\x57\x81\x5a\x00\xc1\xfd\x3d\x0a\xf4\xf9\x3a\x0b\xd9\xd7\x06\x30\x6a\x9d\x64\x0e\xd5\x7a\x5d\x1d\x0e\x17\xa4\xc8\xf8\x79\x9f\x00\xb5\x91\xb4\x4c\x7e\x1b\x23\xa1\xa6\x37\xc0\x20\xa6\x39\x72\x5b\x40\xeb\x08\x7b\x96\x3f\xe7\x63\x0b\x59\xc2\x5d\xb9\xfe\xc3\xe7\x17\x31\x04\x34\x4c\x90\x98\xb7\xce\x1b\x5b\x13\xe7\x64\x6a\xfd\xe1\x24\x49\x7a\xbb\xee\xbf\xab\x6a\x7f\xff\xc3\x2b\xf3\x4c\xc3\xa9\xb3\xab\x26\xa9\xf4\x5e\x40\xf3\x4e\x08\x85\xab\xaa\x7a\xdf\xb4\xd0\x8f\x46\x13\x40\x1c\x5a\x96\xfb\x77\x3c\xc1\xa8\x4e\x2e\x67\x18\x53\x94\x24\xec\x96\x8c\xf3\xc9\x20\xdf\x50\x1a\x13\x8f\x78\xd9\xa8\x28\xe3\x2d\x2f\xf4\xcd\xe2\x69\xda\x43\x26\x0c\x52\x36\x84\x7c\xef\xf3\x92\x08\xc4\x67\x83\xf0\xd2\xaf\x37\x5e\x4d\x98\x25\x64\x1e\xf8\xe8\xea\x98\x06\xce\x35\x89\x42\x86\xbe\x18\xdd\x2a\x51\xf5\xde\x75\xf7\xe9\xb9\x6f\x96\x44\x91\x1a\x11\x2c\x6c\x5a\x28\xf0\x5c\x16\xc7\xc4\x41\x46\x61\x0d\x07\x5d\xa6\xd8\xac\x45\x1e\xfb\x99\x34\x86\x19\xcf\xba\x32\x4e\x63\xaa\xd4\xf8\xbe\xf2\x28\x56\x93\x18\x49\xd1\xe4\x5c\x55\xbd\x42\x6b\xff\x95\xd2\xd0\x50\xda\xa3\xa8\x5e\xa9\xfa\xf9\xc7\x30\x38\x4c\x2a\x62\xab\xcf\x13\x4e\x03\x48\x26\xd5\x42\xf5\x64\xa7\xd6\x5b\x70\x4e\xe4\xc9\xe4\x19\x26\xa2\xc9\x12\x4d\x65\x73\x0d\xec\x71\x5d\x55\xc5\xe0\x6b\x99\x4c\x08\xd2\xdf\xde\xb4\x47\x9d\x57\xfd\xbf\x52\x4f\x04\x3b\x47\x41\xce\xbc\xa2\xe8\xf1\xac\xe7\x44\xc2\x89\x82\xc9\xc9\xf6\x4e\x89\x1d\xed\xe7\x88\xa7\xe9\x66\x77\x22\x64\x61\xea\xf0\x91\xe4\xc6\x9d\xa9\xa1\x36\x32\x11\x54\xb5\x2b\x89\xdb\xe0\x17\x23\x5a\x65\x92\x74\x62\xd6\xcb\xe7\xeb\xe5\xe3\x76\x77\xb3\xfa\x63\x75\xb3\x7c\xf6\x6f\xa6\x0c\x52\x21\xab\x4b\x5e\x6f\x3a\x07\xee\x58\xa0\x5b\x57\x7f\x8d\x29\xfd\xda\xf5\xe9\x2e\x4f\x8c\xea\x8b\x97\xeb\xed\xea\xe9\xd1\x22\x9b\xfb\xfa\x05\xa3\x83\x94\xec\xd9\x7f\xd7\xf9\xe1\x50\xf4\xc0\x48\xa3\x93\x80\xec\xd9\x22\x97\xb3\x0f\xae\x79\xe8\x95\xcc\x9f\xf1\x70\x6c\x5d\xbe\xc0\xb6\x99\x76\x13\xaa\x80\x08\xa7\x1e\x16\x7f\xee\x6e\x16\xab\xfb\xbf\x76\xce\xa7\x7d\xba\x7f\xda\x6d\xd6\xcb\xc7\xfe\x31\x4c\x1c\x22\xeb\x63\x85\x77\xb9\xd6\x58\x4e\x28\xeb\x2d\x29\x6b\x1a\x0f\x0a\xfc\x13\xc4\xd8\x9c\x44\xc9\x2f\xb2\xc6\xc4\xc6\xef\x83\x0e\x01\xb1\x78\xc5\xf9\x3a\x6b\x4c\xa6\x83\xd8\xeb\x77\x3b\x61\xf2\x09\x33\xca\x64\xe1\x87\x20\x88\xa5\x0e\xfa\xd8\x8d\xa3\xf0\xfc\xa7\x21\x43\x7f\x0d\x1d\x72\x7b\xcf\x0f\xa8\xf5\x33\x12\xe9\xcf\x45\xe4\xfe\xe4\xab\x42\x10\x18\x93\x3a\x11\xcf\x1c\xca\xeb\xaa\xec\x9e\x3b\x4c\x52\x39\xab\x00\x85\x80\x45\x22\x4c\x26\x51\xbf\x39\xcf\x21\x04\x21\x8b\xc8\xb6\xb9\x45\x7c\x1a\xa3\x7c\xcf\xdf\x3b\x0c\x0d\x2d\xe6\x67\xf8\xe0\x9c\x59\x08\x41\x94\xc8\xd4\xc9\x4b\x8e\xa9\x83\xfd\x51\x19\x93\xa4\x5b\x1f\x6c\xbd\x34\x94\xcf\xf7\x5c\x64\x2c\x0d\xd5\x75\xfd\x79\x68\xab\x6f\x4f\x23\x13\x01\x82\x38\x60\x26\x18\x98\x17\xa7\xdc\x84\xe3\xb1\xd1\x35\x55\x44\x50\xbc\xc5\xbd\xac\x06\xfc\x00\x04\x31\x72\xca\x8e\x60\xe7\xf5\xb6\xb8\x2a\x5f\x1a\x3d\xb2\xae\x20\xc8\x52\xeb\xfd\xba\xd7\xeb\xe6\x6a\x91\x3b\x66\xe3\x13\xb8\xdf\x7f\xcd\xd3\x15\x67\x1f\x46\x24\x8a\xc5\x93\xe0\x65\xf4\x5b\x7f\xc8\x48\x9b\xd8\x2d\xf2\xf2\x7d\xb9\xba\xf9\x6d\x54\x0f\x3c\xeb\x1b\x91\x46\x64\x21\xed\x3f\x27\xcc\x3f\x10\x40\x24\x69\x22\x3c\xe2\x07\xa1\xe4\x4e\xb7\x54\x08\x20\x31\x04\xa6\xbc\xca\xb5\x35\xb7\x2f\x10\xbc\x43\x00\x4a\x91\xb5\xb4\xb8\x79\xf0\x88\x0e\x08\x64\x98\xb2\x6c\xe2\x71\x7b\x1f\x7a\x7a\xb2\x14\x4a\x0e\xec\xa1\x9e\x90\xe7\xab\xf9\x26\x65\x46\xe1\xd6\xfd\xb1\x58\x35\x1b\x30\xe7\x2d\x9c\xae\x1d\x10\xe1\xf3\x6a\x7f\xc0\x7a\xf2\x49\x55\x12\x86\x36\xf2\xd4\xb6\x17\x12\x42\x10\xe8\x20\x45\x35\xc2\x4c\xac\x55\xfb\x93\x05\xfe\x12\x3a\xce\x04\xe5\x09\x8e\x6d\x55\xe7\x0e\x56\xd3\x1f\xcc\x04\xf6\xf9\x57\x07\x02\x18\x7c\x14\x08\x34\xda\x0c\xec\xab\xe5\x87\x5e\x94\x9a\xf6\x95\xe8\x1f\x05\xb0\x20\x30\x8c\x0b\x17\x6f\xbe\x86\xa2\x58\xb7\xf5\xac\x4f\x4d\xa4\x22\x27\x47\x48\xae\xdc\xa6\x33\xe2\xbe\x8c\xa9\x02\x0b\x40\xd2\xd6\x4d\xf3\x08\x8b\x6a\xf9\x7c\x1d\x06\x93\xd5\x1e\x58\x60\x4c\x18\x0d\xa2\x94\x7e\x82\x33\x26\x45\x32\x16\xb2\x25\x63\x61\xf6\xa1\x19\x53\x48\xcb\xe4\x5b\x55\xe8\xb9\x70\x02\xb0\x50\x26\x14\xbf\xda\x0d\x7b\xfa\x44\x37\xe6\xfc\x43\x47\x9d\xf1\xe0\x58\xda\x46\xe2\xb3\xc0\xe2\x88\x59\x81\x74\x68\x2b\xbc\xb7\xf5\x32\xfe\x90\xe4\xe4\xfa\x91\x46\xe4\x50\xbf\x00\x2c\x61\x81\xa5\x3b\x83\x72\x8d\xb5\xa9\xea\x53\x97\xe2\xbc\xaa\x3b\xb0\x14\x04\xb9\xd5\xb8\xcf\x5b\x5f\xf8\xb0\xc1\x93\x48\xfc\x74\x96\xb3\x54\x29\x88\xa7\x3a\x10\xe7\x8c\x06\x60\x59\x98\x0d\x72\x3a\x14\x7b\x38\xb7\xc5\x02\xcb\xe2\x8c\xb9\x18\x9d\x4d\x9b\xde\x56\x03\x60\xb2\xbf\x6d\x86\x6e\x55\x38\x16\x6d\xee\xcd\x95\x6d\xfe\xfa\xd6\x16\x9f\x6b\xa0\xae\x9a\xb2\x4a\x00\xe3\x21\x27\xf6\x6d\x68\xdb\xb9\xff\x07\x8c\x2b\xa0\x95\xd3\xe1\x09\x3a\x2b\x72\xc4\xda\x0f\x4c\xa4\x71\xe8\x0c\xdc\x53\x72\xf5\xe9\x0b\x40\x14\xf9\xbc\xfa\xa3\x43\xa5\x58\xa8\xd2\xac\x19\xd7\xf1\x90\x92\x5a\xa9\x6a\x5c\x7f\x07\x0c\x64\x92\xe1\x98\x8f\xe8\x12\x24\x17\x98\x94\x2a\x8a\x7b\x76\x8f\xb6\x1f\x3f\x12\x33\xaa\x1b\xe9\xfe\xbb\xcd\xeb\xa6\xfd\x8e\xf8\xde\xb3\x67\x02\x53\x59\x80\xd6\xfc\xd7\xb8\x2f\x1d\x6b\x89\x87\xde\x03\x53\xda\x58\xa4\x27\x49\xe6\x5a\x58\xe4\xa4\x6e\xde\xb5\xc3\xc8\xea\x7a\x40\xbd\x77\xfc\x14\xb4\x22\x35\xf7\x73\x94\x2b\x30\x04\x43\xc8\xed\x96\xa0\x0e\x63\x64\x11\x30\x94\x19\x79\xe0\x0f\x79\xd9\x6e\x2b\x6b\xa3\xce\xce\x36\x01\x45\xf2\xa9\x2c\x78\xd8\xd3\xa7\xdd\x6a\x52\x1b\xa6\xb1\x42\x82\x16\xb5\xb3\xf9\x95\xaa\x05\x30\xa3\xe2\xc4\x56\x43\xba\xbc\x51\x5d\xc3\xe7\x93\xb9\xc2\x12\x4d\xae\x72\xa8\x73\x6c\xe6\xda\x44\xa7\x9f\x22\x64\x49\x4a\x56\xcc\x6b\x0d\x65\xaf\x50\x34\x64\x13\x2e\x04\x95\xfd\xc9\x10\x81\x25\xd3\x7d\xac\xea\x3d\x14\x63\x12\x2e\xd7\x24\x64\x22\x75\x59\xc7\x3f\xaa\xa3\x7a\xc3\x7a\xb6\x21\x4d\x5f\x2b\x0c\x23\x4b\x95\xfd\x91\xbb\x94\x87\x5f\xfb\xc3\x30\xe5\x54\xb9\xb9\x28\x24\xd4\xae\xb0\xe2\x8f\xf8\xb7\xf3\x71\x87\x0b\x17\xe7\x96\xd6\xd5\xb1\x86\x0e\x6c\x02\x7e\x10\x87\x51\x6c\x6b\x42\x64\x51\xa9\xf7\x13\x7e\x01\xdf\x08\x14\x81\x29\xd1\x45\x49\x54\x9f\xc9\x86\x30\x96\x9c\xac\xe8\xdc\xa5\xbc\x76\x71\x7f\xc4\xc4\x64\x8f\xc1\x8c\x4a\x19\xc2\x84\xc5\x04\x82\x58\x28\x62\xb0\x19\x6f\x6a\x61\xc2\x39\xa1\x36\x96\xdb\xbb\xa7\x8d\xff\x33\x0d\x62\x62\x65\x97\xb9\xb6\x14\x57\x17\x3a\x33\x0b\x6d\x55\x64\x3b\x62\x32\xbb\xad\x6a\x2a\x5f\x23\xd1\x83\xed\x47\xe5\xaf\x99\x19\x3b\xbb\x4d\x55\x3b\x86\x22\x7f\x84\xa7\xc0\x44\x6f\x25\x6f\x0e\x45\x3e\x0d\x5b\x74\x2d\x50\x8f\x64\x93\x9d\xe5\x31\xdb\x6c\x42\x9e\x09\xd2\xef\xb2\x21\x00\xe2\xd9\xba\x1e\x29\x7f\x9f\x89\x47\x41\xc8\x79\x18\x8e\x72\x1c\xbe\xed\x99\x50\x10\xb5\xcd\x42\xcf\x74\xf5\x4a\x41\xdd\x6e\x20\x5f\x58\xde\x43\xae\x52\x5a\xb6\xdd\xbf\xbb\xb6\xda\xd1\x68\x9f\x3d\xb5\x08\x15\xd9\x99\xbd\x00\xd3\x58\xe7\xd2\xb7\x89\x58\x08\x8e\x6d\xef\x47\x4f\x30\x60\x41\x49\xaf\x25\xea\x07\x6c\x1a\x78\xc5\xdf\xe6\x1c\x32\x10\x76\x26\xa7\xc5\x7e\x40\x5e\x3e\x54\x65\xb7\x70\x36\xd7\x95\xc7\x8d\x00\x55\xce\x7b\xc4\x40\x55\x2b\x5c\x5a\xb0\xd4\xa0\xbf\x3e\x52\x84\x80\x50\x08\x0e\x76\xb7\x3f\x36\x78\x8b\xf8\x87\xa7\xc2\x01\xc2\x32\x38\xb8\xc0\x7d\x05\x65\x63\x55\x29\xae\x3e\xaf\x8b\x7c\xf4\x25\x85\x66\xc1\xf0\xad\x2f\x14\xcf\x42\x08\x69\x68\xd2\x3e\xef\x75\x09\x6c\xd6\x37\x8e\x5d\xa5\xad\xdb\x18\x2e\xc0\x50\x4e\x58\x77\xc7\x86\x71\x08\xda\x22\x0b\x96\x3f\x0f\x79\xf7\xb7\xa5\xd8\x1e\x4a\x76\x21\x94\x31\x37\x24\xe8\xdc\xad\xd5\x4d\xfb\x8c\x6d\xdd\x8f\x6e\x29\xb3\xb0\x5b\x64\x97\x05\x1e\xde\x80\x84\xec\x3e\xf7\x58\xb6\x23\xfb\x34\xd4\x19\x27\x37\xfd\x06\x6f\x2e\xb2\x32\xfb\xa6\xda\x16\x70\xee\x54\xb5\x3f\x1c\x5b\x5c\x1c\xeb\x13\xbd\x11\xd7\x14\x83\x80\x3c\x87\x6e\x97\xe8\x3c\x3f\xcb\x43\x34\xfa\x66\xc8\xa2\xd0\x22\x5d\x3b\x03\x6e\x36\xb2\x30\x34\x81\x23\xb1\xef\xdc\xcb\x95\x2b\x13\xf8\x67\x2e\x6a\x88\x69\x94\xb8\x0c\xc0\x43\x5e\x3e\xa3\x7a\xeb\xba\x66\x7e\x8b\x14\xad\x86\x66\x37\x67\xfb\x25\xaf\xb9\xad\xea\x33\xcb\x39\x6a\xed\x29\x0b\x5c\xb0\xe4\x92\xad\x78\xe1\x91\x4c\x94\xa6\x6a\x4c\xdc\x69\x1d\xb6\xff\x61\x59\xfa\xbf\xe3\x82\x2d\xdf\xdc\xd1\xdb\x6a\xf8\x6c\x86\x9c\xa1\x3f\x28\x75\x2c\x9d\x3e\xae\x4f\x96\x4f\x34\x72\x21\x34\xc8\x98\xed\xdc\xeb\xaa\x21\xee\x97\x9e\xe1\x18\xa2\x20\x16\x81\x33\xdc\xee\x8e\xe5\x18\xf4\x38\x7d\xe8\x28\x48\x52\x36\x16\xb1\xb3\x91\xac\xc4\x5a\xa4\xfe\x77\xd4\x9c\x4b\xa2\xdf\x6a\xbf\xa2\x02\x70\x0c\xa3\x10\x05\xd2\x72\x04\x83\xd6\x8b\xe7\xc5\xb4\xbf\x23\x96\x46\xe4\x32\xfe\xeb\x81\xc2\x36\x5f\x44\x63\x21\x62\x2a\xb1\xfa\x92\xa0\x35\x2d\xf1\x4f\x66\x5b\x1d\xce\x8f\xe0\x28\x0a\x65\x08\x9e\x6c\x9e\xb8\xf7\xce\x1a\xb7\x51\x94\x28\xef\x50\x5a\x85\x66\x28\xa0\xfe\xbc\x3a\x96\xe5\xe7\xc4\xbe\x8d\xa2\x4c\x5b\x45\x10\xaa\xa6\xb0\x1c\x7c\x67\xdd\xec\x28\xe2\x29\x15\xfc\xaa\xea\xc7\x7e\xca\x13\xe8\x1b\x18\x54\xbd\xac\x5d\xef\x42\x44\x49\x18\x20\x73\x59\x34\x68\x61\x55\x3a\xea\x06\x7f\x58\x04\x94\xdf\xd9\xe7\x7b\x6c\x3f\x0f\xc3\xff\x3a\x24\xee\xfc\x1d\x09\x10\x7d\x19\xd6\x88\xd2\x20\x24\xb8\xea\x0d\x7c\x92\x31\xfd\x30\x97\x3c\x84\x28\x15\xa9\x67\x53\x5e\x96\xfa\x50\xe5\x65\xbb\x86\x1a\xf6\xcd\x49\x19\xd7\xf4\x34\x99\x11\xca\x81\x3a\x71\x60\x2a\x86\x28\xd3\x09\x61\xb7\x69\xe6\x8d\xb7\xfe\x28\x43\x20\x8f\x5b\x1e\x3f\x89\xa9\x0d\x86\x4c\xec\x29\xfe\x72\xd2\xc3\x3c\xb3\xaa\x2d\xb2\xb9\x40\x10\xef\xdb\x71\x49\xbb\x8f\xc5\x72\xf8\x68\xc5\x85\xe2\x17\x7f\x8e\x30\x14\xd4\x5d\xd7\xf0\x19\xaf\x6b\xfc\xf4\x44\x3d\xce\xb8\xe4\xde\xb4\x8c\xb8\x8e\x79\xdc\xbb\x15\x1e\xdf\x3e\xbd\x9a\x48\x53\xe3\xb6\x37\xab\xa5\x66\x7d\x8a\xe5\xeb\xeb\x29\x28\xae\x6b\x6d\x49\x06\xe4\xb1\x2e\xd7\x7f\xde\x5b\x5b\x79\xfd\xe7\xfd\xa5\x1c\xd1\xec\xd1\x05\x04\xa9\x1d\x21\xe5\x20\xd5\xbe\x2a\x7b\x31\x79\x88\x84\x62\xd4\xe5\x15\xf1\xe4\x40\xf1\x52\xfb\xfd\x33\x82\x30\x4a\xdd\x93\x3e\xc0\x44\x46\x6e\x3a\x84\x24\x0b\x69\xa7\x79\xae\x64\xd5\x96\xf9\xfb\x69\xed\x09\x44\x2a\x54\x1e\x39\x61\xe3\x86\x4d\x5e\x95\xb7\x88\x0e\xe4\x33\x7d\x6a\x1d\x24\x6a\x24\x61\x8c\x7a\x54\x52\x0f\x91\x8e\x02\x32\x69\x3b\x3b\x74\x04\xe8\x85\x48\xab\x8c\x9c\x3a\x0f\x20\xec\xba\xea\x1e\xf5\xeb\x69\x8c\x7c\xd6\x4b\x1a\x45\x68\x26\x38\x41\xab\x50\xa2\xfa\x75\x13\x53\x49\x29\x3c\x1b\x49\xb6\x94\x6d\xbb\xd5\xf5\xd3\x6e\xb3\x5d\x7c\x5b\xb2\xdd\xfa\x79\x49\x31\xc9\xa4\x3f\x41\xc5\x16\x19\x0f\xef\xb8\xba\x7e\x1a\x3a\xbf\x71\xd5\x85\xfb\x7d\xde\x34\x17\x63\x4f\x11\x9a\x84\xf2\x01\xcb\x46\xc1\x01\x1d\xc2\x7b\xf2\xd4\x31\x0b\x6c\x25\x8c\x7d\x5d\xca\x2e\xfb\xf5\x24\x66\x51\x1a\xe8\xc1\xec\x7f\x32\xa6\xc8\xcb\xbe\x7c\xee\xa4\x3b\xa6\xd7\xd5\x8c\x1e\x7d\x51\xd7\xce\xac\x5d\x35\x8f\x95\x2f\xd3\x9e\x3e\x43\x88\x9c\x9c\x87\x87\xfc\xaa\xaa\x74\x81\x67\xc5\x97\xbf\xde\x1f\xe3\x28\x0b\x69\x8c\x3e\x5f\x5f\x8f\x85\xe9\x20\x8e\x24\xa7\x75\x67\xbb\x5c\x5c\xdf\x4d\x8f\x68\xbb\xdd\x10\x48\xe2\xd8\x9b\x8e\x71\xd2\x8d\x78\x2a\x82\x9a\x51\x26\x42\x9c\x26\x31\x29\xad\xbe\x62\xbb\x28\xf3\x3d\xaa\x39\xc9\x37\xc4\xa9\x0e\x28\xf3\xff\xb0\xd8\xee\x5e\xfa\x62\x0b\x88\xb3\x10\xb0\x8f\x8a\xac\x8c\xfb\x18\x93\xf5\x27\xce\x22\x5b\xfc\xb5\xfc\xf3\xa9\x4f\x71\x5d\x0a\xcd\xfb\x53\x30\xe0\xf6\x61\x5b\x68\xbd\xd9\x16\xf3\x20\xa4\xfa\xc9\x7f\xad\x1e\x37\xfd\x7f\x71\x44\x05\x4c\x96\xb9\xe3\x8e\xb8\xc3\xfa\x63\x29\xd0\xe4\xab\x09\x28\xd5\x57\xd3\x41\xcc\x95\x2d\x24\x6d\xb1\x69\x37\x1f\x70\xd8\x7a\x14\x06\xc4\x82\xf1\x2c\x73\xd8\xa0\x6d\xbe\x9f\x83\x01\x21\x16\x61\x48\xd9\xa1\xbc\xe9\x0c\xa2\x12\xf6\xb8\x85\xae\xfb\xa7\xef\x0c\x0c\x84\xc3\x27\x5a\xd6\xf8\xe9\x45\x80\x49\x2a\x43\xfa\x51\x5d\x26\x42\xf6\x4d\xb9\xb6\x45\x5d\xcf\x4b\x8a\xec\x7f\x5f\xae\x76\xdf\x57\xdb\xbb\x1d\xb1\x8b\xfe\xd6\xb7\x42\x72\x42\x9b\x6e\x52\x79\xb1\xd1\xf3\x7d\xab\x32\x95\xea\xbe\x08\xa3\x75\x1c\x62\xd3\xc7\x57\x60\x52\x97\xd6\xbf\xe9\xac\xf4\xb2\xc1\xb3\x06\x41\xac\x19\x10\x75\xe6\x35\xd4\x96\x59\x79\x52\x8c\x0b\xb1\x56\x29\x15\x83\x2a\x28\x8a\xfb\x5c\x86\xb3\x61\x85\x81\x4e\x92\x91\x44\x9e\xaa\xb4\x55\x33\xdb\xf4\x95\x99\x10\x63\x0c\xb4\x73\x98\xaa\xfe\xd9\xff\x67\x42\xa2\x27\xff\x38\xfc\xdc\x12\xcb\xda\xd8\x64\x88\x0d\x33\x14\x5b\x5e\x5c\xdf\xff\x75\x63\x4d\x25\x7f\x24\xca\x6c\xe9\x46\x55\x6f\x71\x24\x76\x0d\xb1\x31\x8c\x3c\xde\x3f\x8a\xea\x55\x11\xee\xe2\xec\xf7\x48\x82\xc0\x92\xfc\xf5\x26\xeb\x15\xb6\xe7\x75\x0d\x20\x09\x18\xc4\x91\x0f\xa7\xd0\xba\x79\x53\x57\x87\xf3\xe2\xd0\x90\x04\x3a\x63\x63\xf6\xa0\x6e\x9b\xff\x2a\xfe\x3a\x3b\x9d\x45\xda\x52\xbf\x58\xce\xe5\xbc\xcc\xf7\xc7\x29\xee\x10\x12\x96\x08\x52\xd4\xd8\x59\xf1\x93\x7f\x16\xeb\x4e\xc2\x08\xa9\xb0\x7f\x0f\x3f\x7d\x56\x6c\x8c\x79\x87\x24\x44\x4c\x07\xce\x07\xc7\x3d\xd6\xfa\xd0\x58\x12\xf3\x90\x84\x2b\x17\x9a\xb8\xe3\x72\x65\x19\xcd\x27\xef\xc5\xe6\x37\x8d\x75\x44\x56\xf6\x01\x4e\xeb\x31\xff\x59\x87\x24\x49\x4a\x11\xf1\xbb\xaa\xc4\xcf\xcd\x51\xbd\x17\x54\x6c\xdd\x3f\x75\xa2\x62\x82\xfa\x6d\xeb\xe3\xfe\x70\x0b\xf5\xbe\x0f\xa7\x26\x89\x02\xaa\x94\x78\x29\xf3\xce\x27\x1c\x8d\xc6\x24\x31\xe8\x50\xbe\x57\xc7\xb9\x6e\x1e\x24\x19\x93\xcc\x0a\x83\xd5\xf9\x7b\xe7\xbc\x77\xeb\xe2\x00\x84\x83\x84\x47\x52\x8c\xc5\xeb\x9e\xe1\xbd\xbf\x34\x4f\x62\xef\x94\xdf\xd6\x88\x9b\xce\x87\xa9\xb1\xe8\x0f\xcb\x88\x6c\xea\x12\x7f\xb6\x94\x45\xf3\xc2\x7c\x90\x88\x44\x53\xf9\xea\xb7\x3a\xd7\xea\x28\xc7\xb0\x54\x48\x64\x18\x58\xce\x8e\xa3\xfc\x55\xc9\x26\x24\x32\x61\x94\x82\x70\x74\xf7\xb3\x4d\x2d\x91\x29\xa7\xba\x47\x2f\xe8\x34\x72\x5d\x13\x69\x54\x66\x57\xc6\xdb\x63\x49\x51\xad\x11\x0b\xdd\x64\x7d\x49\x94\xab\x5e\xbf\xab\xf6\x78\x55\xe7\xfa\xf5\xc4\x14\x1f\x82\x93\x17\xbe\xae\x0a\x81\x60\x52\xab\xed\xb7\xc9\xd6\x98\xa8\x38\xcd\x12\xa7\x72\xee\x93\xc6\xfe\x50\x9a\x10\x1a\xa4\xa8\xaa\xf7\xe3\xc1\x6b\x46\x5d\x98\xe8\x2a\x13\x21\xf4\x60\xfa\xe9\x80\x57\x3a\x4e\xbc\x16\x34\xc9\x6b\xad\x6e\xae\x3e\x1f\x67\xa2\x04\x90\x68\xc8\x48\x4a\xa7\xdb\x55\xa1\xcd\x7f\x4e\x9e\x13\x53\x41\xd7\x20\x65\xdf\xfe\x4f\x19\x52\x1a\xef\x6a\xb5\xbd\x7e\x5a\x3d\x7e\x5b\x78\xbe\x33\x48\x50\xa7\x04\xa1\x74\x21\xfe\x71\x28\x7b\x1c\xea\x4f\x4c\x1a\x46\xc2\x39\x7e\x97\x92\xd8\x7d\x53\xf0\xe1\xa4\x3f\xa0\xce\xad\x56\xcc\xa7\x9a\x47\xb4\xd2\x20\x13\xc4\x81\xbb\xcf\xcb\xeb\x63\x3b\x36\x2c\xd3\xc0\x09\x3b\xfe\x91\xab\x6a\x54\xcf\x07\x69\xa0\x2c\xf6\xee\xf6\x65\xfb\xf2\xbc\xdc\xdd\x2c\xff\x58\xde\x3f\xad\x1f\x96\x8f\xdb\xdd\xed\x8b\xc7\x19\x40\xca\x00\x99\x25\x43\x51\xef\xe7\x48\x9a\x20\x65\x4e\x71\xdc\x56\x90\x55\xc7\x5a\xe1\x06\xc7\x75\xff\x90\x86\x59\x44\xe9\xeb\x5c\x55\xcb\x52\x0f\x70\x5e\x48\x43\x99\x19\xd2\xd6\x55\xd5\xb4\x4a\x0f\xd2\x28\xb4\x64\xc6\x56\x6b\xd0\xd6\x3c\x9e\x30\x2e\x42\x1a\x71\x41\x1e\xce\x6a\x42\x90\xf9\xe4\x40\x78\xa0\xda\x9b\x9e\xf6\x03\xd2\x58\xe8\x14\x7a\x1a\xb9\xdb\xfc\x67\xef\xaf\xa6\x31\xa6\x91\x55\x73\xdc\x1f\x8a\xc9\x04\x4d\x63\x63\x4b\x86\x1c\x17\xf1\x4d\x8f\xdf\x76\xc7\xd3\x28\xa5\xf8\x92\x39\x40\xed\xac\xfe\xdf\x46\x74\xa8\x90\xa6\x29\x12\x02\x64\x67\xc8\xfc\x39\x9e\x94\x63\x41\x9a\xa2\xb6\xbc\x5a\xf9\x0f\x7c\xc0\xc1\x16\x4a\xb3\xcc\x48\xe1\x5d\xfa\x6e\x8c\xdf\x56\x56\x22\x79\xd6\x0f\x3c\xb1\x45\x00\xbf\x3f\xfd\xfe\x34\x8a\x93\xa5\x3c\x4d\xa8\x6a\x61\x9d\x4b\x39\x7b\x2f\xe1\xe2\x62\x76\x47\xba\xae\xa1\x27\x69\x1c\x56\x8d\x54\x20\x23\xf7\xbe\x2a\x8b\xcf\x51\x6d\xf3\x35\x94\x37\x55\x7f\x21\xcc\x6c\xde\xe5\x1c\xae\x27\xf6\xbd\x00\x49\x44\xb2\xb3\xae\x6c\xec\x70\x70\x0c\xca\xcd\x49\x88\x36\x95\x2c\xc9\xc0\xbb\xd9\xdd\x71\x17\x88\x9b\x8e\xbc\xce\x67\x22\xac\xd7\x82\xa4\x65\x97\x7f\xae\x17\x8f\x37\xbb\xd5\xe3\x76\xf9\xfc\xc7\xe2\xfe\xb7\xbe\x55\x46\x99\x88\xf7\xbf\xdf\xd4\xa8\x5f\x94\x12\xd4\x5f\xff\x7e\x7e\xc6\x3e\xee\x9a\xea\x38\xa3\x14\xeb\xb1\xd1\x96\xb9\xe5\x61\x38\x43\xa7\x8a\x08\x02\x2c\x2c\x06\x64\x81\x33\x3b\x6e\xfa\x0e\x5a\xc7\x7c\x84\xdd\xd7\xb7\xb3\xba\x8d\xae\x05\xf7\x35\x61\xd3\x10\x7d\xaa\xb5\x85\x74\x91\x72\x9e\xa9\x16\xb3\x13\x31\xe2\x3e\x05\xb8\xa9\x0a\xbd\xa8\x11\x9a\xc9\x84\xc3\x08\x69\xed\x52\x55\x5d\xa3\x6a\x77\x16\x38\xb0\xef\xa5\x16\xc2\x24\xfd\x9f\x48\xfc\xaf\x6f\x6d\xac\x70\x35\x68\x4d\x09\x25\x28\x9c\x38\x94\xbf\x9c\x89\x04\xea\x1e\xbd\xb3\x28\x8a\x35\xd4\x23\x74\x47\x16\x84\xd6\x36\xdb\x7e\xbf\xd9\x3d\xed\xcb\x5c\x57\x45\xe1\xe5\x61\x20\x0b\x32\x4d\xb9\x4d\x2f\x7a\xb5\xf3\x7b\xeb\x39\x50\x2b\x64\x81\x90\xac\x4f\x83\xf8\xaa\x7c\x7f\x4c\x33\x4a\x29\xfa\xe0\xf4\xaa\xcc\x67\xce\x52\xc6\x98\xc5\x0d\x74\xa6\x7b\x67\x7a\x8e\xc6\x72\xc6\xe2\x20\xb3\x4a\x9d\xf9\xeb\x2b\xd6\xdd\xf6\xe7\xaf\xcc\x30\x23\xe8\xdf\xe3\xe2\xdb\xa2\x5b\xd9\xfd\xff\x61\x6c\x7c\xb2\xa0\xb3\xc3\x17\x45\xb1\x28\xf5\xd5\xb1\x9e\x05\x09\xb2\x50\x04\xc4\xfb\xbb\xba\xf9\x73\x3c\xc7\xb2\x50\x84\x7a\x44\xb7\x35\xf1\x31\xcf\x8e\x9b\x2c\x62\x1c\xd4\x48\x5c\x86\x48\x8e\xfd\xb2\x39\x6b\xaa\x65\x32\xa0\x8a\x7d\x05\x73\x37\x62\xea\xfd\x99\xe4\x65\x16\xb3\x88\x2a\xa7\x49\x4b\x77\x22\x84\x36\xde\x16\xb3\x38\x11\x19\x23\xb9\x9f\x4a\xbd\xff\x3e\xd8\xe0\x59\x9c\x00\x05\x9f\x4d\x51\x7d\x60\x4d\x2c\xab\x17\x54\xd7\x20\x8b\x79\x14\xb9\x54\x62\xe7\x88\x39\x4a\x94\x55\xb9\xed\xa5\xdd\x66\x2f\x93\x64\x89\x85\xdd\x7b\x81\xa9\x13\xbd\x84\xd9\x1d\x12\x08\xa9\xa3\xdc\xbf\x24\x43\xa8\xf7\x79\xd9\xe3\x3e\xfd\x63\x27\x4a\x66\x03\x27\x33\xed\x82\x4e\x53\x22\x9c\x75\x50\x1a\xc7\x04\xa8\xb6\x15\x0c\xf7\xcf\xeb\xf3\x73\x3b\x4b\xc1\x0a\x7a\x59\xaf\x96\x48\x2e\x0e\x05\xf6\x99\xb4\xc1\x46\xea\x06\x9f\x0f\xb1\x65\xa9\x31\x54\x91\xe9\x11\xd3\xed\x1b\x55\xce\xb9\xa4\xa0\x6b\x94\xc5\x8a\x70\xa3\x6d\xd5\xce\xe9\x23\x21\xcb\x52\x5b\x0b\xd1\x60\xfb\xfb\x5f\xd7\x33\xe2\xdc\xfe\x3e\x19\x67\x96\x9e\xac\x6a\xac\xb6\xfa\x2c\x69\x37\xb1\xf5\xb2\x4c\xc6\x94\x16\xbe\x5d\x2e\x77\x0f\x2f\xf7\xfd\xad\x4c\x48\x35\x12\xfb\xbc\x7c\x80\x9f\x57\xc7\xcf\x61\x4f\xca\x78\x90\x92\x9d\x56\x5a\x4c\xec\x04\x3b\x92\x71\x16\x11\x62\xc3\xa5\x5b\x49\x33\x6a\x8d\xd0\xc7\xe6\x32\xce\x4c\xe6\x88\x56\x7e\xff\xeb\xda\x0d\xf0\x35\x7c\x16\x15\xe8\xf1\xbe\x9a\xf1\x90\x07\xa1\x9f\x3b\x55\x3d\xcf\x8f\xbb\x56\x22\x34\xb4\xbe\xcb\xe3\xe7\xe2\x77\xa4\xe0\xeb\x34\x32\x77\x61\x9e\x89\x44\x53\xc8\xc4\x42\x52\x77\x70\xd2\xd9\xc2\x58\x6c\xd4\x16\xde\x71\x5d\x7b\x36\xb5\xe1\x02\x90\x04\x84\xaa\x5b\x95\x6d\x5d\xfd\xf6\x2b\x56\x44\xc8\x80\x07\xd4\x31\xa4\xe6\x71\x31\x27\xf4\x2b\x1f\xea\xb4\x9e\x03\x32\x19\x30\xca\xa5\xea\xaa\x6c\x37\x58\x14\xcf\x27\x81\xf0\x4c\x86\x4a\x10\xac\xf3\x50\xe4\x13\x56\x4a\xc8\xa4\xd3\x1c\xaa\xb1\x39\xee\x71\x56\x1a\x04\x99\x0a\x63\x2a\xd9\x39\x74\x73\xfe\x0c\xaf\x0d\x64\x0a\x18\x73\x31\xc8\x07\xdc\xe3\x58\xce\xbf\x6f\x01\xe4\x94\xdd\x3e\xbd\x3c\xde\x2c\x08\x56\xfb\x7d\x71\x7f\xbf\xf4\x71\xaa\x0c\x03\xa5\x86\x65\x92\x96\xfe\xaf\x7a\xf4\x6c\xfa\x39\xc3\x24\x20\xd4\x7a\x9b\xef\xd1\x82\xc9\xa7\x23\x05\x53\x5b\x5f\x4f\xd0\xd6\x1f\x08\x85\xb3\x2a\x66\x57\x31\x01\xcd\x9e\xd5\xcd\x72\xe1\x1f\xcf\x84\x29\x95\xc6\x7d\x23\x5f\xc3\x06\x5a\xd5\xe7\xea\xc6\xef\x80\x3c\x60\x96\xd7\x1e\xad\x8c\xfd\x17\x76\x01\x0f\x62\x1e\x25\x9e\x53\xce\x4a\x7c\x2f\x4b\x4d\x6b\xed\xc4\xd3\xf1\x29\x27\x1e\x24\x36\x10\x7e\x6e\x0b\x99\x5d\x9a\xdb\xaa\xcd\xce\x2e\x78\xcf\x8b\xe2\xfa\x84\xa1\x1a\x78\x20\xac\xe6\x7e\xde\xb8\x1c\xa7\x7f\x05\x16\x8a\x98\x79\x9b\xc3\xea\xdd\xfe\x07\x6f\xb0\x21\xae\x23\xd4\x9e\xa8\xc6\x85\x72\xc6\x4e\x06\x67\x29\x92\x42\xb4\xad\x4e\xfd\x3e\x0e\xf2\xf1\x90\x09\x0c\x27\x70\xda\xd3\x57\x3d\x7d\x93\x30\x33\x62\x6c\xf5\xba\x45\x9b\x38\x72\x7c\x13\xa3\xa9\xea\xcd\xd9\x57\x0b\x7d\x22\x28\x3b\x4a\x46\xf0\x28\xd1\x69\x36\xde\x55\x2d\x22\xea\x8c\x72\x00\xf0\x48\x69\x82\xf5\x3f\xd4\xcf\x08\x87\x09\xbd\x0c\xf0\x38\x91\x04\x6a\x5c\xdc\xac\xc1\x47\x50\x78\x92\x26\x64\x74\x7c\x5b\x5c\x6f\x87\xff\x8c\x2b\x7c\x94\x43\x9a\x66\x8c\xe9\x71\x5f\x79\xc8\xc4\x0c\x42\x45\x33\xc9\x22\xe0\x09\x67\x54\xbe\x48\x65\xb7\x75\xcf\xcb\xde\x1f\xcd\x8c\x15\xbd\x38\xc3\x2b\x3f\xfd\xfc\x09\x58\x20\x12\xd1\x48\x47\x7c\xf6\xe6\x89\xcc\xb4\xa7\x4d\x02\xf5\xee\x77\xa8\xd9\x10\x4a\x43\xcb\xb5\x57\x56\xed\x3d\x36\xcd\xf6\xad\xf7\x8f\x79\x8a\x48\x75\xea\x16\xcc\xea\xca\x66\x66\x37\xc9\x62\x43\x79\x21\x57\xe6\xee\x21\xcd\x93\x5d\x89\x67\xc0\x6d\x02\xe7\x2d\x37\xa7\x92\x47\xa3\x0f\xcb\x43\x4d\x51\x39\xfa\x48\x77\x84\x9b\xdc\x94\x70\x68\xde\x28\x4f\x7a\xa1\x17\x78\x66\xc5\x80\x64\xae\x77\x2d\x71\xb3\xf6\xc2\x97\xc0\x85\x66\x14\xc6\xee\xfc\x49\xf5\x56\xd5\xe7\x13\x03\xe7\x2f\x2c\x74\x6a\xf4\xb4\x30\xfe\x5b\x37\x84\x5f\x49\xaf\x64\xd6\x8f\xc0\x25\xb3\x3b\x50\x79\x6c\xee\x87\x25\x97\x03\x47\x8a\x7f\x1f\xcb\xbc\x25\xa1\xae\xfe\x80\xcc\x22\xd5\xd7\xd4\xe9\xa3\xb2\x81\xa6\x75\x9f\x9a\x1f\x7a\x19\x34\x52\x9e\x81\x52\x98\xd7\x70\x00\x35\x44\xfc\xb8\x66\x8a\xac\xd5\x3d\xfc\x7c\x80\xe6\xbd\xff\x3b\x93\xc4\x11\x47\xa6\xae\x93\x84\x9a\xe8\xef\x02\xd7\x68\x41\x72\x37\x35\x94\x0f\xfd\xbf\x18\x26\xb4\x03\xb8\x3d\xff\x71\x9c\xd9\xe0\x18\x59\xfe\xb5\x27\xcf\x95\x44\xa6\x5a\x7f\x54\x0a\x8a\x14\x43\x7d\x98\xcc\x33\x54\x9c\x96\xe1\x9e\x79\xab\x40\xfd\xda\x07\x07\xb9\x89\x52\x0a\x29\x78\x79\x89\xdd\xf5\xd3\xc3\x7a\xf1\xf8\xd7\xee\xdb\xf3\xd3\xcb\xba\x6f\x95\x02\xf0\x81\x04\xe6\xf6\xe9\x79\xf7\xb4\x5e\x3e\xd3\x0e\xb4\xe9\x1b\x81\x11\x76\x41\x56\x55\xa9\xa1\xfe\xfc\x06\xcd\x38\x62\xc3\x8d\xb6\x62\x3a\xb7\x05\xbc\xce\x2b\x88\x6c\x13\x11\xc4\x11\xc6\x8e\x9f\x61\xbc\x34\x8a\x20\x4e\xa9\x96\x45\xe7\xe4\x31\x7e\xb3\x18\xca\xc1\xca\x10\x41\x62\x19\x35\x5d\xa1\xc7\x5f\x0f\x57\x5e\xb1\xb7\x3b\xa6\x7c\x32\x91\x2c\xdb\x5e\x0c\x08\x44\x90\x71\x52\xf0\x7b\xfa\xfe\xb8\x7c\xde\xf4\xff\x8a\x90\x6c\x21\xb2\x48\x2f\xb8\xd8\x67\xf5\x36\x41\xb0\x90\xa9\xcc\x0b\xeb\xe0\x71\xbf\xb5\xb6\x5d\xb3\xfb\x6d\xd6\x0e\x24\x21\x59\x75\xb5\xc8\x6b\xaa\x8f\x1d\xac\xdd\xd9\x34\xfd\x9f\xff\x9d\xdd\x23\x0c\xad\x3a\x46\xaf\xda\x33\xc8\xaa\xcd\x1a\x46\x69\xe8\xc7\x39\xe4\x7a\x7e\x34\xe3\xc4\xd2\x51\x1d\x7c\x29\x93\x65\x5c\xef\xa5\xc4\x40\x84\x52\x12\x10\xe2\x69\xfd\xbc\xb8\x1b\xfe\x34\xc6\xa1\x28\x96\xd6\xd3\x5d\x77\xb6\x69\x1f\x54\xe2\xb3\xc7\x8d\x64\x42\xd3\x90\x24\x9d\xec\x96\xe1\x2f\x15\x47\x92\xd0\x0d\xf7\xab\xe7\xc5\x9f\x5f\xea\x92\xb8\x13\x92\x50\x86\xa3\xac\xe6\x74\xb5\xeb\x8e\x7a\x9e\x59\xef\x5a\x7f\xb9\x3f\x8a\x2c\x08\xe2\x01\x9d\xf7\x8b\xc2\x3c\x77\x0e\x47\x6b\x4e\x37\x14\x6e\x20\x1f\xb1\x54\x8e\x1d\x7f\xda\x12\x78\x6a\x09\xe5\xe8\xea\x4e\x93\x6e\xb6\x25\x09\x19\x8b\x5e\x93\xf9\x1c\x79\x1e\x08\x99\x0a\x8a\xf4\x52\x55\xd8\x23\x94\xe3\xfa\x02\x21\x53\x4d\xee\xde\x01\x9a\xf6\x36\xff\x81\x0f\x79\x79\x6c\xfb\xf9\x2d\x24\x04\x22\xb4\x46\x69\xfe\x1f\x24\x30\x64\xdd\x10\x6a\x76\xf6\xac\x3a\x88\xa9\x7c\xc5\xce\x9f\xf5\xf3\xea\x8f\xc5\xd6\x26\xb4\x77\xd7\x0b\xbf\x10\x08\x14\x99\xb1\x0b\x5e\xb7\x32\xe9\x1d\x21\x46\x77\xe5\x88\xd3\x0d\x04\x6a\x5b\x22\xe4\xb9\x16\x69\xe5\xbd\x60\x23\x08\x13\x18\x2f\x88\x44\x03\xa8\x73\x3b\x7c\xc0\x7a\xde\x9d\x86\x01\x79\x1a\x40\x74\x65\x0e\xcb\x36\xeb\x2b\x03\x92\x32\x04\x13\x45\xcc\xd3\x6f\x68\xa4\x20\x2e\xf3\xce\x76\x73\xe0\xc2\x53\xb3\xe7\xe4\x14\x7a\xd2\x63\x83\xf5\x54\xcb\x07\x20\x88\x43\x8f\xef\x5a\x14\x05\x19\x66\xcd\x39\xdd\x55\x80\x20\x49\x29\x54\x4e\x34\x59\xcd\xce\x15\x28\xec\x46\x42\xf3\x00\x41\x16\xd1\xbc\xcc\x55\x65\xe1\x21\xfd\x01\x6d\xb5\x43\x0f\xf6\xd5\x37\xd8\xb6\xa4\x6f\x39\x9e\x21\xc0\xd0\x0a\x2f\xf6\x89\xbb\x85\x31\xdb\x59\x42\x12\x42\x69\x59\x23\xb6\xfc\xfa\x32\xbb\x1a\x40\x68\x32\x88\x7b\xd2\x52\x5b\x62\xfb\x79\x2a\x38\x0f\x10\xb1\x2c\xb3\x4b\x42\x61\x76\x4d\x3b\x40\x39\x21\xca\x80\xcc\xe1\xe6\x28\x1b\x8a\x23\x7f\x99\x97\x81\x58\x58\xf9\x8c\x75\xfe\x33\x3f\xfa\x6b\xc4\x2a\x48\x5c\xe5\x5f\x6e\xaa\x4a\xdf\xe0\x8f\xb3\x69\x5a\x48\x22\xe6\x33\x4b\xf6\xdd\xc7\x6e\xbb\x6f\x13\x5b\x2f\xeb\x6f\xd0\xf8\x8c\xea\xfc\x00\xa1\x34\x04\x1b\x61\xa2\x66\xef\x9b\x1a\x41\xdb\x66\x31\x51\xe8\x03\xc8\x18\x86\xb1\x4b\x3a\x9f\x95\xf5\x00\xe0\x49\x28\xa3\x3e\x8a\x72\x4f\x69\xe7\x4b\x06\x16\x70\x89\x54\x94\xec\xd0\xc3\x58\x5f\x80\x8c\xf8\xba\xd2\xe9\xd9\x22\x4e\x89\xeb\xdb\xc2\x43\x1e\x3e\xbf\x57\xf5\x7b\x73\x91\x32\xe5\x4b\x04\x14\x40\x14\x70\xf4\x64\x80\x9d\x13\x7f\x29\x59\x39\x7d\x04\x88\x85\xb1\x3a\xbb\x9e\x68\xf5\xdf\x47\xe8\xfc\x1f\x5f\x64\x06\x20\x34\x6d\x01\x8b\x22\x57\x93\xbe\x94\x2c\x4a\xc6\xaa\xf4\x3d\xb0\x78\x8a\x39\x9b\x3c\xef\xf9\x92\x77\x00\x19\x86\x04\x68\xb1\x20\x70\x97\x2d\xba\x10\x35\x07\xc9\x03\xb2\xde\x87\x7d\xb1\x7f\x24\x19\x53\x27\x4c\x14\x2c\xf2\xaa\xbc\x86\x43\xdf\xc4\x18\xc7\x09\x41\x86\xca\x06\x8a\x33\x85\x9f\x00\x2a\x15\x96\xbd\xb3\xaa\x8a\x2b\xca\x7e\xfb\x03\x1c\xb4\x9b\x72\x54\x0c\xb2\x28\xf5\x86\x0c\x2a\xaa\x1c\x77\x8d\x74\x28\x42\x07\x48\x75\xd6\x60\xf9\xfa\x64\xcc\x89\x64\x3e\x80\x06\x83\xbc\x97\x85\x5f\xe8\x1f\x58\xb7\x79\x73\xa1\x64\x18\x00\x3b\x17\x9d\x80\x3f\xaa\x3d\xd6\x7d\x99\x0b\x20\xe7\x23\xe8\x73\xf7\x29\x46\x16\xd8\x59\x50\x00\x20\x32\x0a\xeb\xdc\xd4\xf0\x31\xac\x94\x68\xac\xf8\x62\x93\xff\x6c\xdf\xfa\x08\xf6\x4c\x64\xb7\x6b\x06\xe4\x1d\x2a\x82\x4b\x39\xe6\xd1\x11\x80\x10\x0c\x4b\x79\xe2\x76\x4d\x07\xd8\xb6\xc1\xc6\x6e\x03\xb1\x7b\xff\x06\xf6\x54\x6e\xdf\xa7\x8f\xc1\x48\x93\xb9\x38\xaf\xf5\x23\xfc\xff\x28\x28\x1c\xbe\x77\x5e\xb2\xfb\x5f\x06\x61\x12\x3a\x37\xce\xd2\x32\x74\xab\xce\x1a\x3e\x66\xd9\x62\x19\xf0\x48\x90\x11\x49\x15\x24\x37\xb2\x3f\x5f\x5a\x99\xca\xce\xfb\x26\x9e\xa7\x9e\x4b\x63\x74\xae\x34\xd1\x69\xec\x79\x12\x6e\x9c\x9e\xc0\xa2\x80\x28\x22\x7f\x54\x2d\x36\x8f\xde\x92\x92\x4c\x00\x15\x22\x7d\xab\xa0\x78\x80\x9f\xf9\xfe\xb8\xf7\xa4\x5c\x5f\x02\x6f\x64\xc8\x32\x52\x45\x69\x8e\xf2\xa9\x7c\xa2\xd4\xd5\xeb\x2f\xc0\x3a\x32\x0c\x13\xb2\x2a\xec\xc2\x62\xe9\xe9\x89\x1f\x98\x54\xbc\x4f\x95\x55\x4f\x74\x64\x41\x86\x31\x52\xd2\x49\x55\xfb\x7d\xde\xfe\x31\x06\x08\x7d\xc5\x68\x07\x32\x4c\x79\xc4\x3c\x01\x53\x3b\x32\x26\x65\xc8\x95\x27\x41\xd8\xd6\x78\x92\x6a\xf7\xad\x44\x60\x54\xff\xec\x7f\xe7\xe5\xeb\x7f\xde\xf2\x39\x60\x74\xfa\xba\x51\x0c\x82\x79\x7f\x6e\x59\x62\xfd\xea\x3d\xc0\xff\x8f\xb6\x37\xeb\x4e\x1d\xc9\xd2\x40\xff\x4e\x3e\xf4\x83\x86\xd0\xf4\x08\x18\xdb\x54\xda\x86\x02\x7c\x4e\x56\xd7\xea\xc5\x8a\x61\x07\xa8\x2d\x24\x4a\x83\x7d\xc8\x5f\x7f\x97\x76\x0c\x1a\x10\xce\xec\x7b\xd7\x7d\x39\xce\x24\x42\x73\x0c\x7b\xf8\xf6\xf7\x31\x12\x46\x98\xd7\x98\xb7\xc6\x86\x1a\x81\x38\xe5\x3f\x8f\x83\x24\xeb\xfd\x34\xbf\x8e\x5e\x8c\x6e\x92\x08\x07\x29\x31\xce\xf4\xd7\xbe\x57\xd8\x69\x5a\x81\xa1\x01\x3e\x13\x62\x8a\x8d\x44\xf7\x0a\x69\xe0\x28\xcb\xf0\x5a\x34\xf5\x3c\x3d\x0e\x04\x9c\x4c\x27\xe9\xa3\xd9\x37\xaf\x81\x9e\xfb\x10\x1f\xdb\x1e\x23\xaf\x53\x09\x79\xd1\xe4\x1c\xac\xd2\xaa\x6e\x8f\xdc\x08\x3f\x63\x6b\xf2\x34\x17\x45\x43\x2c\xba\x79\xca\x22\x4f\xd1\x27\xd0\xaa\x82\x7a\x25\xd6\x72\x10\x05\x30\x9d\x42\x1f\xe7\x89\xca\x6b\x23\x78\xa5\xa6\xe7\x0b\x8e\x44\xdf\x9e\x29\x51\xac\xa5\xf4\x01\xb3\x67\xa6\xba\x64\xf4\xe1\xfa\xa6\x10\x8b\x84\x8b\xd5\xf5\x07\x4d\x14\x08\x9f\x69\xbb\x79\xae\x2e\xb2\x7a\xa6\xd5\x09\x46\xee\x03\x8b\x05\x20\x9a\xed\x44\xab\xd3\xa1\x4c\x2f\x70\x16\x6e\xe8\x4c\xa6\xd7\x58\x2c\xb9\x27\x2c\xfc\x02\xaa\x8d\x8e\x6f\xed\x4a\x7e\x67\xe2\x26\x8e\x40\x3c\x27\xda\xc5\xad\x7d\x6b\x19\x9b\x29\xb2\x54\xb6\xdf\xfb\x79\xdb\xb3\xed\x19\xa5\x8a\xec\xf2\x92\xf2\xa2\xea\xf6\x18\x46\xb9\xa2\x67\xc4\xb2\x52\x9e\x5e\x68\x0d\x87\x34\x3f\xd0\x92\xa5\x75\x75\xb8\xa8\x4c\xc0\x41\xa6\xf4\x4e\xec\x94\x89\x48\xa2\x0e\x9f\x59\x7f\x1f\xa8\x9d\x44\x82\x81\xe2\xd0\x2a\x4a\x0e\xeb\x4f\xd4\x06\x38\xda\xcf\x29\xa4\x8b\xd5\xc6\x07\xad\x17\x3d\x2d\x21\xf9\xad\xff\xc4\x80\x48\xc3\xee\xb6\xca\x55\x58\x66\xd4\x21\xa0\x66\xd9\x5d\xd0\x5c\xa4\x56\x99\xda\x7e\x28\xd9\x6e\x11\x6a\x68\xbf\xd2\x5f\x33\x5d\x5b\xd6\x5b\xd2\x99\xa4\x8a\xa3\x4e\x14\x39\x1d\x71\xcf\xb5\x8d\xd2\x35\xe5\x45\x25\x74\xc4\x30\x5d\x20\x82\x49\x26\x10\x53\x79\x4e\xf3\x7a\x51\x9c\xcf\x4d\x9e\xd6\xd7\x61\x3a\x97\x3b\x6e\x48\x35\x6b\xd9\x9c\xf2\x8f\x9e\x88\x85\xe9\xe0\x05\x94\xd9\x5d\xb3\x57\x20\x85\x74\x5d\xc3\x6c\x92\x39\x24\x8e\xfc\x64\x80\x43\x7e\x68\x3e\x86\x70\x1b\xee\xba\x8e\xf1\x0f\x94\xe6\xc1\xae\x37\x94\xb8\xeb\x85\xc8\x92\xa0\xe0\xed\x37\x30\x55\xee\x26\x11\xc6\xe0\x57\x9b\xd7\x5e\x82\x96\xbb\x34\xc1\xe8\xcd\x73\x3a\xdf\x0f\x80\x46\xdc\x15\xcc\xe8\x34\x2d\xeb\x93\x8e\x67\x28\x5a\x40\xf4\x08\x50\x4c\xbd\x87\xc5\x70\xbd\xd8\xfc\xd5\x67\xf0\x1c\x40\x9b\x46\x59\xb1\x3a\x2a\x8e\x4c\xf9\x83\x0f\xcf\x3d\xaa\x38\x33\xd4\xe0\xc2\x02\x03\xa8\xa1\x1c\x4d\x53\xee\x3b\x21\x53\x6c\x01\xfd\x4a\x26\xee\x87\x04\x83\xc7\x1b\x9a\xd1\xcf\x92\x0e\x9a\x12\x82\x7e\x8c\x68\x94\xc9\x32\x87\xfa\x0b\x40\x6b\x80\xb4\x3e\xa0\xfd\xa6\x24\x56\xb2\x31\x16\x26\x32\x11\xfb\xe7\x84\x06\x2a\x12\xf7\x63\xf6\x62\x8c\x93\xc1\x2b\x0b\x1c\x81\x6e\x72\x6d\xd1\x36\x28\xb5\x62\xa6\x11\x0f\x63\xa6\x68\xe2\xa6\x3c\xd9\xe1\x74\x69\x0d\x45\x8c\xb8\xef\xea\x82\x7f\xbc\x98\xdc\xda\x60\x40\x84\xd2\xd5\x42\x52\x36\x2c\xff\xf0\xf4\xdf\x03\x28\x17\xf2\x14\x87\x6a\x47\x79\xdf\x3d\xd8\x5f\x65\x8c\x75\x7e\xb6\xc6\x6f\xc4\xee\xa3\xbb\xc5\x01\x20\x0d\x65\x5a\xfd\xa0\x59\x2a\xde\x6e\xcc\x18\x1e\x47\xae\xab\x2b\x36\xfb\x7c\x8d\x94\x27\x4c\x3a\x3a\x44\xfc\x7d\x2c\x86\x53\x4f\x45\xc4\x90\xdf\xfa\x13\xaa\xfa\xd7\x26\xa3\x75\xbf\x36\xde\x74\x14\xd4\x4a\x0e\x66\xd9\xac\xdd\x59\xec\x63\x72\xcf\x41\xdd\xa3\x8f\x34\xcb\x5e\xa1\x3a\x6d\x8a\x76\x74\xde\xc9\x09\x4e\xb0\xcd\x51\xce\xa5\x87\x84\xbd\x98\xe1\x1b\x80\x9a\x47\x1d\x85\x4b\x55\xbc\x33\xbb\x55\x92\xfb\x26\xbd\xc6\x85\xa7\xa4\x84\x8d\x2d\x0d\xf0\xe7\xd8\x6c\xe7\x22\x02\xf4\x9a\xad\xc0\x79\xbb\x67\xec\x8b\x3d\xd8\xe0\x36\x07\x29\x0c\xa8\x6d\x91\xd6\xd7\x5d\x56\x1c\xe9\x58\x13\x5b\x77\x95\x7e\x82\x88\x9b\x5d\x0d\x34\xab\x4f\x4f\x65\x2a\x26\x15\xb4\x87\x07\xc5\x01\xba\x5f\x97\x8c\x5e\x5f\xa1\x67\x8e\x4e\x0e\x53\xe1\x78\x2a\x77\xfa\x3a\xfb\xe3\xb0\xd9\x2e\xb1\x30\xa2\x27\x3c\x47\x85\x43\x09\x24\x26\x0a\xf8\x56\xd4\x1d\x83\x82\x70\x5d\x96\x18\x98\x61\xda\xba\x15\xb6\x34\x59\xb8\x5e\x82\xd6\xee\xfa\x0b\xcb\xdb\xfb\xb3\x4c\xb8\x8c\xe3\xd0\xaa\xda\xc7\xd2\x48\xb1\xc9\x6f\x2a\x3c\x9a\xc8\xb8\x0f\xac\x1a\xfb\xba\xe3\xee\xa0\xea\x6f\x55\x7c\x15\xb5\x6c\xe6\x98\xde\xee\xb3\x39\x75\xcf\xee\x7b\x11\x32\x40\xe8\x02\xdc\x1d\x3f\xc1\xd9\x3e\x9c\x1f\x38\x68\x54\x2c\x7f\xf1\x12\x6a\x8c\x08\xf7\x9e\xc1\x8f\x13\x45\x86\x6b\xd8\x82\x5b\xc3\x64\x5b\xb9\xdb\xca\xbb\x2d\x9c\x15\x3e\xc4\x98\x52\x79\x2a\x01\xf2\x1e\x6b\x5e\xdb\xa2\x28\xb4\x4a\x9a\x8b\x11\x02\x50\x90\xc0\xc7\xb9\xf9\x73\xb9\x3a\xbc\xae\xde\x56\xaf\xef\xaf\x87\xcd\xfb\x76\xf1\x3c\xdb\x2d\x6d\x1f\x11\x63\xf8\xbc\xa9\x5a\xbf\xb8\x1f\x0c\xed\x0f\x0a\x11\x12\x35\xf5\x5e\x67\x7f\x2c\x66\x1b\xa3\x4d\xbd\xd9\x2e\x0f\xab\xc5\xda\x9c\x2b\x76\xdc\xb0\x93\xef\x1a\x67\xaf\xa6\x67\xbf\x88\x29\xa5\xa1\x49\xe2\xcc\xce\x13\x35\x41\x22\x16\x71\x14\x98\x68\xf6\x15\x60\xf9\xeb\xa2\xa2\xdf\xe7\x3e\x7f\x65\xbf\x92\x52\xc4\x52\x85\x03\x5f\xa1\x2c\x53\x93\x81\xfc\xb6\x68\xbe\x97\x8d\x10\x89\x17\x61\x95\x9a\xaa\x24\x37\xa5\x33\xa3\xc5\x51\x24\x81\x87\x9e\xd7\xe9\x70\x31\x44\xd3\xed\x8f\x11\x62\x02\xbf\x6e\x05\x70\xa9\x48\x42\x17\xd5\xed\x87\xfa\x45\x7f\x85\x52\xbf\xe5\x31\x10\x89\x16\x09\x31\xf2\x6b\x8b\xa6\xbe\xa3\x68\x43\x45\x02\x12\xa1\x01\xef\x8c\x5e\xbf\x89\xf9\x09\xea\x05\x49\x68\x51\x08\xec\xe6\xe6\x19\x8b\x71\x08\x14\x39\x2e\x5d\x5d\xe6\x5b\x30\xae\xdc\xe0\x79\x53\xe2\x64\xb5\x4f\xf6\x7f\x7c\xed\xdc\x53\x22\x45\x23\xe1\xcd\xd9\x62\xbf\xfa\x61\x07\x2c\x8f\x04\xd5\xfc\x5a\x0b\x68\xc7\x7b\x36\xa7\xf9\x98\x6c\x9a\x0a\x11\x50\x4d\x17\x23\x8b\x26\xbf\x25\x83\x11\x22\x8a\x99\x62\x7d\xa3\x65\xfd\xcf\xc9\x41\x2f\x80\x1a\x85\xab\x1d\xaa\x06\x8d\x4e\x01\x21\xf7\x75\x7b\xbb\x33\x9a\xd0\xe4\xc0\x68\x11\x32\x54\xd7\x79\xdf\x6f\x5e\x06\x2b\x80\x8c\x34\xc1\x1c\xe4\x9d\xbc\x36\x05\xd7\x0d\x30\xf2\xf7\x89\x7c\xe0\x0a\x0b\xd0\x83\x70\x7d\x3b\x99\xc0\x0b\x05\xc6\xa9\x6a\xc8\x1f\x80\xa7\x67\x9a\x6d\x32\x6a\xa5\x3f\x28\xf8\x81\x92\xb7\x3c\xd9\xe4\x1c\x10\x37\x36\xa1\xde\x8d\xd2\xac\xde\x94\xe8\xca\x0e\x44\xbc\x06\x2f\x17\x08\xd3\xa5\x5f\xb3\x3f\x0e\xcf\xeb\xdd\xfe\xa0\x99\xe6\xcc\x39\x03\x8f\x70\x8d\xa7\xae\xb7\x69\xf5\x31\x2d\x0b\xaa\x3b\x87\x9e\x1b\x9b\x9c\x79\x53\x6a\x8c\xb2\x69\x8b\x02\x44\x0e\x3f\xd1\x33\xec\x52\x3e\x2f\xfe\x8a\x42\x71\x78\x9f\x91\x17\x10\xc4\xc3\x63\xf5\xff\x6f\x83\xcb\x46\x5c\xe1\x38\xd0\x7b\xc8\x53\xeb\xb9\x42\xc4\x55\x61\xc6\x2a\x57\x9c\xab\xdf\x87\x44\x20\xf6\x62\x7c\xa5\x87\x1c\xbe\x9e\xe8\x38\xcf\x01\x71\xe8\x63\x35\x92\xf1\xb8\x36\xdb\xdd\xf0\x6d\x98\x7e\x11\x8d\x1c\x5b\x3e\xda\xae\xe4\xd0\x43\xc2\x8d\xaf\x49\x3d\xad\x90\x9a\x0f\xcb\xaf\xee\xdd\x23\x8d\xd4\x66\x73\x02\xfe\x31\xf0\x41\x06\x63\x15\x62\x46\x54\x2e\x99\xd7\x0d\xcd\x9e\x8a\x7a\xb9\x7f\x1e\xdd\x67\x12\xc5\x98\x59\x7c\x9d\x6d\xb7\x6b\xe3\x44\x40\xc2\x43\x34\x6d\x2e\x65\x51\x17\xbc\xc8\x06\xe2\x01\x14\x28\x11\x9e\x8a\xe3\xd3\x8e\xd3\x07\x28\xf5\x54\x74\x05\xef\x6a\xe0\x62\x41\xeb\x88\x69\x48\xd4\x4b\xfa\x9f\x26\x15\x69\x7d\x9d\xe5\xc2\x50\xb6\xdc\x04\xb3\xcd\x61\x5c\xd1\x7a\x40\xdf\x38\x47\xcf\x6b\xad\x4a\x2f\xf3\xbf\x56\x5c\xa5\xc0\xb8\x92\x8d\x52\x00\x0b\x0c\x51\xe9\x16\xee\x53\x44\x42\x6e\xca\xa2\x90\x6b\xf9\xdc\x9c\x69\xeb\x1f\xce\x84\x58\xdb\x87\xe5\x09\x41\x77\x5f\x13\x07\xf5\xd4\x9d\xef\x7c\x1d\xe1\xfa\x58\x32\xf3\x71\x65\xbd\x5b\xb4\x8d\x89\x13\x98\x42\xdc\x9a\x9f\xd2\xfc\xb8\xc4\x45\xb6\xcf\xaa\x00\xc2\x0b\x70\xe7\x4d\x73\x45\x74\x52\x3c\xa4\x15\x9c\x19\x2d\x3f\x46\x34\x94\xc3\xd7\x25\x22\x89\x5c\xcf\x1a\x9c\x3b\x5d\xe3\x0b\xe0\x26\xdc\xb0\x0c\x77\xb1\xd6\x1e\x2d\x35\x05\xe9\xc7\x28\xae\xbe\x30\xb5\x59\x18\x0b\x9b\xd8\xcb\x41\x86\x52\x2a\x63\x1f\x39\x82\xf7\x25\x35\x25\x07\x0f\x69\x75\x93\x3a\x19\xbd\x29\xc9\x22\x74\x80\x65\x3b\xe6\x0f\x5c\x4b\xa0\xab\x46\xe9\x38\x04\x22\x83\x4e\x93\x50\x96\x34\x1b\x25\x8b\x86\x4f\x2f\x9d\x80\x63\x00\x34\xa3\x55\xad\xb1\x5c\x9d\x46\x48\xdb\x2c\xb0\xc0\xa3\xc9\x91\x1d\x47\x39\xe5\x33\x03\xae\x55\xd3\xce\x74\x6d\xdd\x2c\xed\x98\xe0\x43\x23\xaa\x5c\xd6\x50\xa2\xa2\xeb\x83\x05\x3a\x49\xd7\xf3\x99\x82\x33\x48\xf9\x5c\x34\xe5\x1d\x62\x20\xe9\x86\x2e\x2e\x1b\xaf\x2a\xed\x33\x69\xb5\x37\x3d\x6d\x69\x73\x18\x0b\xa8\xa6\xfc\xa9\x71\xf1\x7a\xc7\x9b\xbf\x59\x1e\x86\x07\x71\x8f\x68\xa4\x6a\x3d\xb5\xbe\x8e\xae\xe1\x79\x2a\x80\x7b\x84\xfa\x1f\x05\xbb\xb3\x44\x49\x3f\x62\xc8\xcd\xf2\x50\xe4\x9d\x4d\x69\xda\x62\xc0\xf0\x08\x52\xd7\xcd\xab\x4b\x5f\xed\x81\x4a\x3f\x61\xd8\x8a\xfe\x1d\xc6\x57\x84\x5e\x31\x07\xcf\x3d\xfc\x96\x3e\x53\xec\x65\xba\x20\xba\xee\x4b\x04\xfc\x45\x44\x5a\x12\xee\xf7\x54\x67\xa7\xc5\x4d\xa9\x0c\x3c\x65\x4c\xef\xb7\xb3\x89\x22\x77\x19\xf8\x41\x68\xa1\x3f\x7b\xa0\xe7\x81\x17\x2e\x03\x2e\x85\x30\xa2\x6d\x6b\xb9\xac\x4f\xeb\x7c\xf9\xbe\xb5\xcd\x10\x32\xaf\xc7\xcf\xbb\xb4\x52\x81\xdd\x1b\x0d\x25\x43\x72\x0f\x24\xcd\xc3\xb3\xaf\xce\x17\x93\xa1\x92\x11\x55\x64\xe3\x65\xdd\x8c\x8e\x8b\x38\xc1\xcc\xea\x02\xca\x3a\x95\xa9\x55\x50\x6b\x5b\x40\x15\xaa\x43\x55\x4f\x94\x06\xc9\x08\x38\xd7\x8c\xed\xdb\xa2\x82\xbc\x3d\x03\xe2\x68\x46\xcf\x1e\x53\x89\x98\x26\x71\xb4\x1f\x31\x66\x21\x51\x45\x6a\x48\x81\x3a\xcd\x8d\x21\x63\x29\xb0\xa2\x65\xb5\x3b\xb7\x06\x31\xd8\x60\x96\xa4\x9c\x7a\x4a\x6e\xf6\xfa\x7d\x7a\x5e\x32\x4f\xa1\xcd\x54\xe8\xc0\x90\x5c\x99\xf3\xb0\x44\x22\x57\x74\x5a\x2d\x68\x29\x90\xfb\xde\xea\x73\x19\x80\xa8\x64\x8c\x72\xa5\xbb\xab\xc3\x92\x77\xae\xc4\x7d\x2c\x48\x99\xe5\x39\xfc\x82\xc3\x6e\x7d\x78\x58\xfd\x98\x1d\x76\xb3\x9d\xbd\x1a\x28\x7d\xd6\x7f\xfe\xf3\x9f\x7d\x53\x4f\x72\x21\xf1\x1e\x55\x1c\xec\x09\x72\x47\x87\x2e\xff\x6f\xe5\xf2\x92\x4b\x82\xe8\x05\xfc\x58\xfb\xaf\x42\xed\x04\xbf\x75\xad\x48\xcb\x9d\xe2\x9b\x18\x7d\x4b\xe1\xd2\x48\x98\x2a\xb3\xe9\xfa\x1b\xdd\x13\x08\xf7\x23\xeb\xfc\x64\x20\xed\x47\x81\x44\xe2\x44\xd9\x43\xa5\x82\x64\xa3\xcd\x4a\x82\x08\xd1\x23\x52\xac\x34\xed\x12\xa9\xbd\x67\xdd\x2e\x5d\x07\x15\xdb\x5f\xd2\x1c\x68\xf9\x00\x9c\x5e\xdb\x45\xb7\x3d\x95\x29\xa9\xb4\x5d\xbd\x98\xf8\x7a\x9f\x68\x2a\xc4\x63\xed\x8c\x0c\x26\x95\x92\x24\x42\xaf\xf5\xbb\xf4\x4f\x98\xe5\x62\xdb\xab\xee\x18\xbc\x35\xe6\x38\x8e\x74\x9c\xbe\x94\xf0\x21\x87\x5f\xf5\x01\xb4\x17\x79\xf8\x82\xf4\x6f\x15\x0a\x33\xc7\xe1\x0a\x9d\xa8\xbe\xe3\x73\x51\x56\xb0\x3b\x15\xe0\xde\x03\x37\xea\xc3\xdc\x24\xc4\xac\xd9\xf6\x5f\x6f\xd6\x96\x60\x8e\xcb\x64\xe0\x76\xb1\xb5\x09\x9f\x8b\x39\x5e\xcc\xd0\x79\x78\xf9\x7d\x71\x9b\x0c\x65\x8e\x27\x12\x2c\x3d\x78\x5b\xbd\xce\x4d\xad\x3c\x73\x7c\x16\x63\xd4\x75\xf5\xfa\xb0\xfc\x43\xf4\x49\x59\x99\xe3\x8b\xc8\x51\xcc\xae\x22\xad\x2e\x4d\x0d\x8f\xf4\xd3\x24\x75\x98\x43\x48\x80\xc0\x54\x5c\x98\x97\xbf\xea\x92\xae\x2f\xca\xdc\x32\x1d\x62\x69\x12\x9b\xaf\xd7\x07\xb8\x64\xc5\x75\x36\x55\x8f\xc7\x1c\xa2\x05\x31\x54\xb0\xeb\xbd\x82\x12\xcd\xb0\xa7\xb2\x68\x6e\x78\xf6\xb4\x5b\xcb\x1c\x22\x62\x0c\xc1\xb5\x93\x70\x2d\x65\x8f\xde\x7e\xf8\x5a\x08\xc4\xc4\x31\x30\xdb\xfb\xa8\x12\xe6\x04\xc2\xc7\xf8\xe5\x82\x66\x99\xe1\xb9\x16\xa3\x77\x1c\x26\xb1\x1b\xda\xfd\xec\xb6\x34\x90\x39\x91\x0b\x44\x45\x06\x4b\xa0\xe2\x2e\xbd\x20\x73\xa2\x30\xc6\xa4\xa0\x65\x88\xd7\xae\x67\x7f\x2f\x60\x4e\x1c\xb2\xc4\xeb\x58\xae\xf6\xc5\xfe\x75\xf9\xc7\x9d\x27\x8d\x25\x48\x5d\x9c\x71\xa8\xfb\xdb\xce\x08\x1b\xc8\x9c\xc4\x97\x18\x66\x53\x38\xae\xd7\xf7\x97\xfd\x6a\xf3\xb2\x32\xac\xdf\xcc\x49\x92\x04\x91\xc5\x5a\x9b\xf2\x5f\x40\xed\x67\x4f\x20\x42\x4b\x47\x4d\xdb\xe7\xf4\x13\xec\xbd\x52\xea\x62\xe5\x9a\x56\x53\xaf\x4f\x8f\x30\x7e\x3b\x94\xab\xbc\xc2\xe1\x1b\x7c\xfd\xdf\xf2\xd7\x98\xc3\x99\x8b\xfb\x01\xfa\x8d\xf4\xeb\x1b\xb7\x91\x39\xc2\x71\x71\xb5\xcb\x1a\xfe\x71\x9d\x37\xd7\xdf\xec\xef\x8a\x28\x98\xb6\xe6\x17\x22\x29\x54\x7d\x10\xea\x45\xa0\xd5\xa6\x69\xb9\xdf\x9a\x73\x3f\xa5\xc9\x1c\x70\x95\x2c\x9f\x61\xa2\x98\xcf\x5e\x66\x6f\x8b\xa5\x9d\x57\x10\x12\x04\xf0\x08\xa8\xa1\x3c\xa7\x39\x74\x4c\x2e\xf6\x7d\x01\x53\x5f\xc1\xc8\xec\x89\x7f\x34\xe5\x75\xc2\xe1\x63\x8e\x64\x32\xf2\x4c\x89\x35\x43\xa6\xb8\xe1\x03\x4a\x11\x63\x70\x74\xb6\xed\xca\x2e\xdb\x5f\x99\x0a\xb7\xea\x78\xde\xeb\xec\xed\x7d\xf6\x72\xd8\xad\x9e\x30\x64\xb2\x5a\x3f\xd8\x9e\xd2\xc1\x6c\x5a\x96\x56\xf5\xc2\x30\x9e\x84\x64\x9c\xaa\x51\xaf\x55\x6d\x85\xcc\x75\x1c\xea\x6b\xc4\x15\xea\x29\xec\x9a\xf3\x7d\x33\x95\xb9\x4e\xe4\x62\xa2\x12\xa5\x6b\x2c\xa9\xee\x5b\x93\x65\x23\x92\x04\xe6\xba\x1e\x10\x93\xe0\x4a\x4b\x5c\x88\xd3\xfc\xd8\xcf\x6f\x33\xd7\x85\x08\x9d\x83\xdd\xea\xe5\xc7\x72\x6b\xb8\x76\x76\xbf\xbf\x98\x0e\x1e\xf1\x48\xa0\xe1\x66\x5b\x0d\x11\x7f\x58\xbd\x21\xb7\xa5\x91\x76\x9e\x1e\x2f\xae\x17\x04\x68\xb6\x62\x35\xe0\xed\x5a\xea\xfa\x22\x4a\x14\x17\xa0\x00\x38\x83\xb8\x11\x5b\x60\x2e\x09\x7c\xa1\xf3\x7e\xbb\x2f\x7a\xe9\x1b\xb5\xcc\x25\x21\xc1\x49\xa4\x83\x28\x48\x02\x63\x9a\x58\x84\xa6\x23\x15\x42\xf3\x0f\x7e\xe7\x7f\x32\x97\x70\x1a\x84\x1a\x0c\x6d\x21\xcb\x0c\xb9\x83\x43\x15\x98\xe7\x78\xfe\x1e\xd5\xb8\xc6\x3f\xdd\x52\x81\x0f\xcf\x1c\x00\xc3\x98\xf4\xbe\x68\xb7\xdd\x9b\xec\xc5\xb0\x73\xc8\x94\x49\x8b\x79\x99\x1e\xf4\x6f\xdc\x4d\xa7\x86\xdb\x4d\x75\x53\x14\x59\x2f\x10\xa9\x7b\x44\x7e\x80\xd5\xb4\x5a\x84\xad\xd2\xaf\x68\x38\x21\xdc\x88\x85\x14\x13\x46\x39\xeb\x19\x4f\xcc\x8d\x89\x8b\xc1\x0e\xa4\xa4\x14\x77\x29\xa6\x87\x4b\x89\x1b\x07\x11\xa2\x90\x8c\x44\xcf\x86\xd6\xa7\x2f\x7a\xbd\xb3\x9a\xb8\x89\x23\xdd\xb8\xa3\xa6\x18\x2c\xd8\x6e\xe2\x53\x95\x39\x7d\x5b\xed\x57\xb3\x97\xc3\x6c\x31\x48\x71\x30\x37\x89\xfd\x50\x17\x00\x5b\x2b\x7b\xf4\x74\x49\x1c\x63\x2a\x66\x9e\x15\x9c\xd3\xd6\x70\x2a\x6e\x71\xf0\xcc\xe5\x81\x2d\x05\xd3\xae\x66\x9a\xb5\x93\x68\x78\x32\x1e\x26\x28\x88\x87\xd3\x0e\xce\x17\xcf\xdc\x88\x10\xb1\xa0\x16\xf5\xf5\x08\x76\x21\x77\xc1\xd3\x00\x5e\x25\x25\xfc\x50\x9c\xfb\x14\x30\x7d\xb3\x9c\xb9\x10\x38\x6e\xd8\x19\xef\xfb\x13\x3c\x17\x22\xb3\x67\x12\x0e\x1a\x09\x5f\xb4\x04\x64\xde\xb4\xd7\x90\x51\x88\x09\xfe\xcd\xf6\xbf\xf7\x7f\xcf\x63\x65\xae\xe4\x5c\x51\x16\x9e\x2f\xd9\x41\xa5\xae\xd5\xb0\xbe\x5b\xb2\xc2\x5c\x29\x02\x64\x4f\x52\x59\xd4\xf9\x08\xdf\xce\x3c\x47\x93\x4f\x97\x5a\xc3\xc4\xac\xf0\x9e\x4b\x94\x2c\x4b\xbb\x24\xce\xb2\x6c\xde\x5c\xef\x98\x0f\xc3\xd1\xe1\xb9\x81\xe3\x59\xae\xf5\x65\x7d\xda\xf2\x4f\x61\xcf\x29\x1c\x14\x4c\x69\xdf\xea\x7c\xbf\xf8\x65\xcb\x3c\x99\xe7\xf9\x4a\xe9\xc8\x54\x72\x96\x56\xab\x92\x79\xc8\x69\xdd\x3e\x83\x2a\x9b\x84\x58\x6b\x3c\xf5\x87\xbe\xe7\x7b\x11\x66\x03\x2f\x4d\x96\xa1\xda\x8c\x59\x38\x8b\xbe\x8e\x14\xf3\x08\xf1\x85\x76\x60\x30\x09\xfb\x5e\x8d\x25\xad\xdb\x3e\x09\xb3\x81\xa4\x5f\x8b\xd9\x66\xdc\x4e\x29\x86\x90\xda\xe7\x98\x99\x1b\x08\x3c\x81\x65\x00\x87\x12\x25\xef\x7a\x35\x9c\xa3\x37\x14\xf8\x8a\x4a\xe0\x7d\xf7\xb0\x7f\x9f\x2f\xed\xf1\x34\x42\x64\xd6\x31\xfd\x84\xdf\x1b\x51\xdc\x99\x7e\x5e\x2c\x54\x95\x37\xbe\x60\xc5\x36\x66\x8a\x81\x5f\xe9\xe5\x62\x73\x0d\xcc\x4b\x5c\x50\xcc\x35\x4a\x1b\x5e\xc1\xeb\x7a\x55\xaf\xcc\x4b\x02\x1f\x09\xac\x44\xfb\xed\x53\xd6\xd4\xf0\xb2\x98\xed\x9e\x6f\x0d\xa7\xd1\x3d\x24\x91\x4c\xfa\x8c\xde\x0f\xb4\x18\x4e\x3b\x2f\x49\x1c\x8c\x54\xcf\x9f\xe6\x43\x3d\x64\xe6\x25\x52\x21\xb3\xda\x19\xf9\x48\xd3\xec\xf0\x59\xd4\x50\xbe\x15\xb5\x59\x0f\xec\x87\x67\x5e\x1c\x9b\xd8\xf8\x4a\x8b\xe2\x98\x02\xe8\xfb\xa6\xa5\xc7\xa8\x60\x46\x06\xaf\x11\x69\x3d\x2a\x2a\x63\x1e\x8f\x5c\xf4\x05\x44\x81\x5e\x6e\x21\x17\x45\xd6\x3a\x3b\xe5\x5f\xf3\xa7\xde\x79\x21\x3c\x71\x59\xd2\x41\x48\x47\x3a\xb6\xc3\xbe\x82\xbb\x98\x39\xdd\x2e\x17\xcb\x55\xbb\x77\x6f\x66\xff\x5a\xbf\xef\x0f\xfb\xe7\xed\x72\xf7\xbc\x7e\x31\x56\x89\x07\x91\x1b\xa0\xc5\x70\xbd\xc0\xbc\xfb\x31\x44\xdb\xf4\x65\x76\xf8\x52\x9c\xba\xba\x41\x12\x11\x93\x01\x01\xab\x66\x9f\xfc\xfe\xce\x65\x1c\x63\xd9\xd2\x7f\x1a\x9a\xd7\xa9\xa0\x02\x1e\x60\x86\x22\x0a\x7f\x52\x5e\x8c\x2a\xa0\x99\x27\x99\xa2\x20\x3b\xa7\xb9\x1a\x4f\xcb\xc6\x2c\x19\xbe\xe3\x29\x49\x4a\x49\xd3\xf2\x3a\x12\x00\x66\xbe\x43\x63\x0c\x21\x96\x45\x96\xed\xbf\x8a\xc1\xcb\xe9\x53\xbb\x32\xdf\x11\x1e\x06\xfe\xd2\xfc\xb3\x18\x01\x9f\x98\xef\xc6\x01\xde\xc0\x4c\x88\x87\x6b\x4e\xcf\x93\x0c\x52\xa3\x8a\x23\xe6\x7b\x6e\x88\xd1\x00\x8c\xcb\x66\x45\x65\x65\x61\x4c\x7b\xa2\xaa\x1a\xab\x2f\x8a\x52\x61\xfa\x67\x3f\x72\x11\x62\x88\x73\x2d\xad\x2a\x53\x6b\xc5\x7c\xe2\xbb\x8e\x22\x60\xfa\x52\x28\xfa\xce\xf8\xf0\x83\x04\x10\x52\x2e\x55\x0d\xea\x60\x83\xf4\x03\xa1\xe8\xec\x0c\x41\xf0\x6d\x30\x89\xf9\xa1\xaf\x92\xc3\x36\x42\x77\x84\xb1\x2e\x0c\xf3\x43\x1a\x62\xfd\xd5\x05\x1f\xdf\x9e\x3f\x4a\x3c\xb5\x3b\x67\x05\xa3\xd9\x03\x4d\xb3\xeb\xc0\x70\xf4\x23\x4d\xa6\x55\x0b\x5d\xea\x62\x1a\x62\x00\x34\xa5\xe0\x57\x5a\x3f\x02\x1c\xcc\xef\x94\x50\xcc\x88\x50\xf1\xbf\x4d\xd5\xb6\x2c\xf3\x3a\xad\x33\xb8\x8b\xc7\x61\x3e\x8b\xe3\x40\xcd\xfe\x7f\x2c\xbe\x01\x50\x30\x9f\x47\x01\xb2\x09\xd5\x29\x94\xfb\x53\x09\x1d\xf7\xa2\xee\x20\x68\x84\xab\xea\x7c\x3d\x5f\xa3\xbb\x66\xf6\x6f\x1f\x28\xa0\x63\x8b\xa1\x7e\x35\xda\xf6\xf4\x03\x8a\xcf\xfb\x3a\x3d\xe6\x48\x16\x29\xbe\xf5\x2f\x5a\xea\xc4\xf8\xa6\xb4\xd1\x6c\xe6\x83\x08\x3c\x0d\xb2\x79\x4c\x69\x3d\x19\xea\x6f\x7b\x01\x06\x68\x4c\x18\x6d\x96\x65\xa3\x1e\x32\x91\x8a\x8a\x07\x95\x16\x20\x17\x36\x22\x3e\xfa\x94\x92\xa9\xd0\x45\x05\xf5\x26\xfd\x05\xd9\xa2\xc8\x34\x81\x4b\x97\x8d\xe8\xbb\x1e\xbe\x94\x09\xba\x4e\x0f\x2f\x3f\x34\xa2\x80\x11\x97\xf8\x58\xa3\x3c\xa7\xd5\x07\xd4\xc3\xb2\x5d\x46\xdc\x20\xc6\xb8\x1d\x6b\xae\xad\xd1\x86\x97\xb9\xbb\x34\x0c\xdf\x17\x71\x69\x82\xcf\x71\x6c\x77\x36\x84\xda\x6a\xb6\x08\xbb\x52\x13\xcf\x67\x4e\x60\xe3\xc2\x5b\x4d\xb9\xfc\x9a\xe6\x1d\x11\xcd\x7f\x75\xc0\x67\x73\x10\xb5\xba\x29\x96\x09\x60\x9d\x67\xd7\x5e\x09\x47\x67\xc9\x10\x4f\x12\x8c\xfb\x6a\xc8\x19\x3a\xd0\xdf\x27\x1c\x19\xf1\x03\x65\x6c\xca\xbe\xfe\x61\xef\x9c\x7e\xe0\xa3\xa6\x80\x82\xff\xf6\x5c\x1c\x42\x84\x83\x69\xdb\x97\xd5\x6e\x66\x7f\x03\x25\xa7\xd9\xed\x96\x78\x2f\xfb\xe2\x4e\xee\x64\x7a\xf8\x11\x22\x05\x0a\xfe\x0a\x5d\x36\x63\x26\x1a\x09\x02\x8a\xf4\x47\x69\x5e\x41\x59\xbf\xa6\x19\x54\xb5\x51\xb4\xfe\x0b\x6f\x85\x04\x09\xa0\x78\xf3\xee\x02\xe5\xf9\x85\xb2\x6a\x0b\xac\x28\x73\x7b\x6a\xc6\xa5\x26\xb8\x4d\xcf\xcd\xf9\xf9\x2a\xca\x02\xe3\xb7\xc8\xe4\xad\x3b\x85\x41\xc8\xe3\x2e\xec\xf1\x5d\x01\xcb\xdf\x1b\x38\x21\xa8\x4c\xc3\xee\xe5\x7d\xff\xdf\x7d\x6b\x8d\x44\x41\xe4\x52\x8d\x0c\xb6\x81\xe8\x7d\x7a\x1e\x7b\xf6\x24\xe2\xaa\xb8\x72\x5f\x5c\x06\x27\x48\x78\xc2\x3b\x74\xfd\x9c\xe6\xff\x69\x26\x69\x29\x19\x49\x04\x41\xfc\x87\xe6\x4a\xdb\x94\xc5\xa5\xa8\x4c\xf5\x66\xdb\x9c\x80\x91\xe0\x4a\x8f\xa7\xda\xa0\x1f\x6c\x90\x6e\x6c\x5e\x10\xea\x45\x38\x95\x24\xf0\xd3\xa6\x84\x59\x96\xed\x9a\xf3\x5b\x73\x7e\x2c\xca\x0e\x8a\x6b\xfb\x0a\xa3\x6b\xba\xca\x65\x81\x86\xa9\x26\x46\x54\x21\xdc\xfe\x7c\xa0\x3e\xc3\x80\x02\x9a\x25\x96\x5e\xec\xfb\xc5\x8c\xd0\x24\xc4\x72\xce\x1c\xea\xaf\xa2\xfc\x78\x2a\x8b\x2f\x4b\x4a\xa2\xbb\x30\x21\x23\x1d\xb5\x9b\x8b\xcb\x2d\x75\xff\xbf\xdd\xd0\x3c\x1b\xa7\x2e\xb2\x3d\xed\xff\xf8\xe7\x7d\xfc\x0b\x23\x9c\x71\xee\x5b\x3d\x2c\x46\x47\xde\x3f\x11\x0e\x51\x5a\x55\xad\x4b\x74\x0b\x6c\x31\xbd\x22\xee\x6b\x48\x9b\x49\x56\xbf\x40\x2e\x46\x4a\xfb\x8c\x40\x4c\x70\xc7\x6a\x2a\x28\xdf\x7a\x65\x94\x8c\xc8\x28\x41\x4b\x8f\x35\xd7\x81\x92\x42\x2f\x93\xd5\xbf\x62\xe0\x7a\xaa\xd2\xea\x67\x6b\xec\xbd\x42\x0d\xe5\x0c\xe5\xed\x07\xb0\xa8\xef\x07\x75\xe0\xfa\x01\x06\x67\xce\xed\x73\xbd\xd1\x33\xcc\xd5\xc1\xbf\x8d\xba\x91\xc8\xc4\x70\xf6\x40\xcf\xa3\x4a\x07\xd3\x29\x26\x54\x3b\xc3\xbb\x4b\x91\x57\xc5\x20\x9b\x36\xfd\xc5\x03\x37\x8e\x30\xb2\xbe\xdb\x2f\x16\xfa\x45\x04\x9e\x4b\xd0\x0d\x95\x8a\xe8\xd7\x58\x03\x01\x49\x58\xec\xf5\xd8\x38\xff\x4f\x99\x94\xe9\x70\x41\x40\xb8\xd2\x57\xa3\x62\x12\x21\xa9\x7b\x05\xc4\x25\x9e\x8d\x11\xbd\xd2\xfc\x7a\xdf\x62\x0f\x82\x30\x56\x36\xc9\x57\x5a\xb7\xee\x44\x59\x5c\x2c\xd1\xd1\x20\xef\x32\x75\x6c\xe4\x20\xc2\x7c\x43\xeb\x14\xf2\x5a\x09\xa5\x9b\x7d\x2f\x08\x35\x0b\xb6\x48\xab\x4b\x46\xaf\x9f\x70\x4a\x79\x06\x42\x2b\xcd\x4c\xbf\xe0\xc8\x53\x85\x8b\x4a\x0e\x6c\xb4\x59\x07\x51\xa4\xa4\xcb\x37\xdb\xe5\xeb\xea\x6d\x79\xd8\x2e\x5f\x96\xb3\xdd\xf2\xfb\x9d\x28\x88\x9d\xc8\x70\x67\x3f\xd0\x9a\x56\x50\x4f\xa0\xa6\x59\x10\xbb\x81\xc3\x06\xe4\xfb\x0f\xcd\xb0\x82\xcc\x74\x8c\x02\x64\xcb\xbd\xa8\xf8\xd0\xb7\x2a\x97\x2c\x88\xc1\x73\x3c\x9b\xa7\x5a\x4b\x4c\xdc\xb6\x8b\x8b\x0a\x56\x7d\x7f\xeb\x89\x4b\x24\x18\x72\x44\x28\xc7\xd4\x96\x2c\x48\x42\x55\x6a\xc1\x0c\x89\x56\x9f\x64\x9b\x05\x49\x04\xa4\x8b\x8b\xcf\x8b\x22\xeb\x52\x9c\x76\x2b\x0e\x12\xe1\x62\xc9\x11\x2b\xca\x2e\x0a\x11\x50\xe1\x51\x61\xf9\x12\xd4\x06\x61\x9a\xa4\x83\x85\x2b\xad\xc1\x9e\x8b\x07\xe0\x28\x94\x26\xe6\xf7\x31\xd4\xff\x27\xce\x58\x16\xb0\x30\xc6\xf0\xf1\x6c\xb5\x7d\xd8\xae\x37\x3a\xc4\x6a\x2e\x2f\x68\x82\xec\xae\xed\x7e\x02\x65\x7d\xfd\x1e\xba\x67\x0f\xa2\x88\x78\xcc\xe1\x4b\x71\x85\x8e\xc4\xbc\xb5\x8d\xd4\xbd\x15\xe9\x29\xdc\x24\xe4\xbc\x10\x6a\xa5\xf9\xad\xab\x1d\x8b\x4d\x2f\x0a\x68\xfa\x1d\x38\xcd\xf8\x88\x6d\x6d\x78\x03\x92\x13\x25\x13\xbe\x7b\x7f\xeb\xef\xa7\xa1\xe3\x2b\x58\x06\xcd\xb2\xe2\xeb\x96\xfa\x8a\x85\xae\xef\x4b\xab\x0b\xb8\x4f\xa1\x34\x1e\xc9\x90\xc9\x80\x85\x5e\x10\xa3\xb4\x50\x67\x25\x6d\x60\x48\x12\xcc\x42\x0f\x14\xd3\x9d\x12\x89\x34\x1c\x47\x83\x1b\xf2\x7d\x95\x3e\x63\xed\x1d\xd5\x4a\xf1\xb0\x75\xa6\x86\x0c\x2a\x2c\x24\x84\xa2\xd1\xd2\x1a\xd9\xb3\x4f\x5a\xd3\x72\x25\xdf\x0a\xfd\x5f\xd5\x0e\xee\xb8\x28\x61\x20\xdc\x58\xe5\x9f\xca\xbe\x3c\x1a\x0b\x03\x70\xd0\xaf\xc0\x12\xa4\xae\xb0\x95\x85\x21\x11\x31\xed\x58\xe6\xaa\xf9\xf5\xa1\xe0\xa8\xbd\x30\xd8\xae\xc2\xd8\x49\x7c\x1c\x37\x6f\x6f\xeb\xf7\xb7\xc5\xf2\xf0\x73\xf5\xf6\xb6\xdc\x1e\x1e\x96\xb3\x87\x97\xd5\x9b\x09\xf8\x84\x31\x4b\xd0\xdc\x13\xa0\x50\xcd\xdd\xef\x8a\xbe\x41\x45\xf8\x86\x79\x63\x16\xc6\x92\x23\x3e\xec\xd8\x60\x01\x27\x80\xd8\xd0\x2b\xa3\xed\x37\xb1\x1e\x4c\x98\x48\xe2\xa8\x35\x51\x17\xc1\x97\x9f\x7f\xab\x16\x99\x85\x34\x66\xc4\xee\x48\xf4\x56\xad\x7a\xa2\x9e\x78\xea\xef\x37\xb1\xf2\x90\xd2\x30\x11\x4a\xec\x72\x12\x90\x67\xba\x09\x8a\xb0\x1e\xa5\x1c\xd4\xda\x88\xe8\xcc\xaa\x6f\xf5\x17\x01\xaa\x90\x45\x1c\x79\xac\x68\x5a\x8a\xb2\xb8\xac\x72\x8c\x6d\x37\x5d\x7c\xe7\x86\x1c\x69\xe2\x1c\x8c\xfb\x86\x74\x22\xcd\x8f\xad\x67\x62\xde\x2f\xe3\x09\x42\x2e\x68\x5e\x7d\x59\x82\x3f\xdb\x28\x5c\xc5\xba\x7f\xa2\x69\x8e\x98\x36\xdd\xc0\xa3\x00\xab\x11\xb2\xa2\x02\xbd\xdd\x1b\x53\x73\x70\x61\x11\x45\xc8\x0c\xd8\x49\x2f\xb6\x73\xe7\x95\xe6\x0d\xcd\xb2\xeb\xbe\xb8\xb7\x99\x8e\xee\x5f\x44\x14\x9d\x9f\x13\xad\x14\x45\xc2\x86\x8e\x8d\xe3\xc8\x89\x95\x8a\x7d\xd3\xda\x4e\x8f\x70\x63\x3e\x99\x6e\x92\x62\x44\xfc\x48\xcf\x70\xc0\xe2\x04\x33\xff\x22\xd7\x55\xbc\x03\xa9\x16\xde\xee\x93\x83\xb2\xc8\xf5\x85\xa2\x43\xa4\xf9\x47\xe7\x27\x0d\x4f\xee\x32\x07\x34\x64\x7d\x57\x53\x7b\xa8\xe7\x2a\x31\x18\xac\x4e\x83\x7d\x71\x4f\x8f\xd6\x74\x0f\x23\x54\x34\x5a\xee\x57\x0b\x7b\x0a\x1e\xe0\x9e\xf2\x38\x7b\x5b\xfc\xeb\xbb\x38\x44\xe4\xd3\x18\x63\xb2\x8b\xf9\x6e\x62\x21\xbf\x6b\x12\x8e\xd7\xeb\x88\xb8\x80\x54\x39\x1a\x6f\x87\x59\x85\x49\x2b\x2a\x22\x9e\x8f\xd0\x2d\xfa\x09\x65\xbf\x46\x73\xf8\x54\x24\xa2\x48\x15\x8a\x39\xed\x94\x7f\xc0\x28\xbd\xd1\x8e\x28\x2c\xab\x78\x58\xfd\x58\xed\xd6\xdb\xc3\x66\xbb\x5a\x98\x15\x26\x0a\xbc\x18\x53\x58\x98\x05\x9b\x43\x5f\x02\xd7\xfc\x3b\xb8\x5a\x10\x2a\x25\x30\x2a\xce\x69\x6e\x0b\xcf\x0f\x74\x1c\xd9\x88\x82\xd8\xe3\x8e\x06\xd5\x2e\xeb\x13\x12\x4b\x76\x7c\x69\x2c\x0a\x63\x0f\x0b\xb6\x57\x8b\xf5\x80\x19\xfd\xef\xed\xbc\x51\xe4\x80\x0a\x6f\x88\xff\xad\x29\xfb\xf6\xc3\x45\x44\xe0\x7a\xf5\x47\x9f\xe3\x8f\x45\xb1\x9b\xe0\x6b\x79\x9a\xed\x0e\xdb\x65\x47\x32\xcd\xa2\xd8\x57\xd4\x12\xf8\x8c\x83\xb1\x1a\xfb\x8c\x6b\xb9\xa5\x45\x6b\xb5\xe6\xad\x13\x5c\x4d\xd8\x2a\x51\x1c\x24\x18\xe8\x6c\x57\x86\x79\x8a\xf4\x03\x0d\xe7\x5d\x88\x3b\x8a\x63\x50\xd4\x29\xb3\x3f\x0e\xf3\xd6\x6a\xf8\x97\xae\x02\x19\xd8\x10\x51\xe2\x00\x86\xfc\xdb\x6d\x5b\x45\x31\x5b\x9b\x0c\x23\x2c\x3f\xef\x28\x3c\xb3\x28\x71\x9d\xc0\x37\x96\xa4\x59\x10\x47\x0a\x58\x6d\x2f\x81\x21\x44\xe4\x19\x11\x0f\x3a\xb3\x57\x8d\x24\x2c\x58\x94\x88\x88\xf5\x83\xf1\xaf\xc5\x27\x42\x56\x8b\xa6\xde\x97\x8d\x5d\xd4\x22\xca\x7d\x0c\x3b\x7f\x42\xa9\x52\x76\xfa\x77\xe6\xd3\x90\xf7\xe8\x7b\xd2\x4c\xa4\xf9\xb1\xef\x68\x0c\xdc\xaa\xa9\x7f\x7b\x2f\x96\x41\x8c\xce\x2c\xe2\x41\x77\xfc\x54\x14\xd9\xa8\x40\x42\x77\xe4\xbe\x8b\x31\x94\xd7\xd9\xdb\x52\xd1\x75\xd3\xb2\xce\x27\xe8\x2a\xee\xda\x7e\xdf\x6e\x83\x11\x87\x84\x77\x36\x2b\x1a\x1d\xad\xcd\x31\xfc\x12\xc2\xf5\x91\x32\xcb\xf2\xf7\x9b\x8f\x30\x49\xbd\x6b\x0f\x8a\x34\x33\x3e\xf2\xe6\xaf\xcb\xe3\x24\xe4\x96\x45\x42\x90\x38\x36\xb1\xe7\x97\xf9\xae\xc8\x84\x95\xf2\xf6\xcd\x7b\x00\x27\x44\x17\xfa\x09\xf2\x75\x53\x2f\x4e\xe9\xa5\x7a\xeb\x94\x1e\xee\x4c\x2f\xf0\x14\xa3\xac\x55\xee\x82\x2c\x1b\x3d\x1a\x10\x0f\xeb\xf6\xd2\xfc\x93\x0a\xd8\x64\x34\x87\x5b\x9e\xa8\x5b\x67\x2c\x02\x1e\x49\x30\x5a\x82\xba\x44\xf1\x96\x35\x48\x75\x8e\x5d\xa6\xca\x29\x68\x56\x02\x15\x57\x03\x52\xe8\x54\x11\x75\x3f\x2f\x52\xe2\xc1\x02\xb2\xf4\x13\xca\x59\x7e\x84\xac\xda\x2e\x1f\x26\x38\x70\x47\xf7\x13\x7b\x31\x20\xc8\xbd\xf5\x55\x7f\x0d\x91\x95\x64\x74\x37\x1e\x55\x4b\x77\xa5\x2a\xa7\x90\x7c\xf2\xb7\x51\x17\xae\x6a\xa2\x9b\x1c\xf3\x6e\xd3\x86\x4b\x4c\x28\xc5\x30\x61\x8d\xf3\xa7\x67\xa7\xc7\x44\x42\xec\x77\xf5\xf0\x8f\x00\xfb\xe2\x86\xdf\x99\xc5\x01\x88\x04\x39\x75\x75\x2c\xbc\xbf\x4a\xc5\xa1\x03\xa1\x18\x18\x07\xfb\x53\x59\x34\xc7\x13\xb2\xf6\xb3\xec\xde\x5d\x85\x6e\xe8\x25\x66\x41\x40\xf6\xa5\x67\xa0\x36\xd6\x62\x3a\x05\x02\x55\xae\xb4\xd9\x84\xe3\xf8\xc1\xd8\xf1\x69\xa1\x92\x6f\xdf\xbc\xee\x50\x10\x34\x91\x5f\x1f\x7e\xbf\x05\xfe\xb2\x38\x0a\x23\x4c\x51\xfd\xf7\xf3\xfa\xbd\x3f\x9d\xe3\x28\x12\x52\xe8\xfd\x04\x6b\x92\xf5\x17\x1a\xb3\x5c\x0c\x1f\x29\x8a\x39\x52\x95\xfc\xfe\xaf\x05\xc2\x02\x47\x57\x8b\x39\x41\x3b\x9a\x35\xd7\x55\x0d\x67\xf7\x37\xfb\x3b\x33\xf5\x12\xcb\x5f\x3c\x6b\xc4\x88\x12\x8e\xc5\xd4\xe5\x98\xdc\xa9\x3d\x74\x98\x27\x20\x30\x6d\x97\x40\xc7\xae\x9f\x1a\x5a\x8a\x94\xe6\x13\x01\xe6\x98\xfa\x21\x38\x96\xbc\xb9\x13\x77\x3e\x77\x27\x8a\xd4\x1e\xad\xca\x01\x9e\xe8\x19\x9e\x53\x21\x6e\x5e\x1d\x95\x61\xc0\x10\x57\xb1\x5f\x6e\x1f\x67\x8b\x25\xc2\x98\x66\xa8\xa7\xb0\xdc\x2e\xdc\x30\x30\x27\x64\x4e\x82\x90\xc6\xed\xf2\xe1\x69\xf5\x62\x7f\x75\x19\x27\xbd\x61\x33\xcb\xc5\x63\x59\x68\x6c\xea\xf7\x35\x31\x2c\x66\x61\x88\xe5\xd5\x02\x6e\x25\x9c\x4d\x17\xc6\x40\x6f\x9e\x77\x66\x3b\x8f\x15\x4c\x79\x20\xf9\xf4\x17\xfe\xc3\xf0\x36\x38\x57\x08\x45\x85\x65\x30\x56\xf7\xe8\x2a\x42\x55\x26\x9b\x35\xf9\x3d\x57\xe4\x29\xb5\x45\xc6\x8f\xce\x29\x02\x1e\x76\xca\xfe\x45\xde\xba\x4b\x8a\x3f\x5c\x27\x60\x74\x47\xe1\x70\x03\xa3\x5d\xf1\x42\x11\x53\xf4\x3e\x34\x10\x55\xcd\x8e\x70\xe2\xde\xef\xd2\x73\x88\xd7\xbb\x9f\x83\xec\x8a\x21\x58\x2c\x23\x8a\x41\x42\x8d\x3c\x7d\x2d\x72\xb8\x0e\x62\x2b\xb1\x8c\x13\xcc\xb4\xaf\xff\x2c\xf2\xc1\x16\x98\x38\x2e\x35\xa1\x65\x0c\xe7\x68\xd1\x91\x81\x2f\x9a\x38\x41\x80\x53\xe4\x9c\xe6\x56\xde\xb2\xfd\x95\x21\x76\x6c\xbf\x9c\xbd\x0e\xc8\x91\x59\xe2\x30\x25\x19\xd6\x79\xef\x4f\xc5\x68\x8c\x0c\x5e\x78\xe2\x7a\xaa\x36\x0c\xf9\x7b\xce\xb0\x4f\xb3\xcc\x0a\x18\xb3\xc4\xf5\x5d\xcd\x4a\xc6\x8b\x5c\x2c\xe8\x65\xd9\xa3\xe5\x35\x7d\x12\x55\xd5\x8a\xfb\xa1\xc9\xff\x75\x32\x3b\x2c\xf1\x1c\x8a\xf9\x54\xe3\x01\xe8\x75\xdf\x44\xfa\x86\xf7\xe3\x05\x0c\xc3\xfd\x3a\xd3\xd1\x29\xca\xd9\xb3\xb1\x18\xfd\x8a\x13\xad\x4e\x3d\xfa\x4c\x96\x78\x3c\xc2\x30\xb9\xf2\xbb\xe7\xcd\x75\x1a\x5c\xf3\xed\xde\x9a\x04\xbe\x23\xe2\x1b\xdf\x6d\x7c\x12\x33\x6d\x92\x20\x94\x32\xea\x62\x0a\xab\xd1\x1a\x96\x84\x71\x12\x28\x68\xf0\x67\xf1\xd1\xab\xb7\x30\xcd\xd4\xa1\xba\x98\xa6\x5d\x39\x2a\xac\x41\x1f\x5f\x23\xe4\x0e\xe2\x98\x29\x2b\x4a\xec\x36\xbd\x43\x24\x11\x57\x4c\xeb\x8b\x34\x2b\x7e\x99\x2b\xc4\x9e\x92\x59\xc6\x04\x46\x55\xa7\x35\xee\x03\xf3\x49\x4d\x50\x96\xc4\x41\x82\xa3\xfd\x25\xad\xeb\x0c\x76\xed\x56\xd3\x95\x60\xd8\x53\x06\x8a\x61\xaa\x35\x39\xdf\xe0\x48\x6b\x04\xd1\x0e\x6e\x25\x4e\x22\xd4\xb7\xaf\xce\x34\xcb\x16\xf4\x82\x36\xee\xd8\x76\x4d\x12\x37\x52\xeb\x81\x82\x5b\xf4\xc8\x83\xa7\x23\xe7\x49\x42\x9d\x58\xbf\xed\x97\xcb\xaa\xfa\x59\x94\x1f\xad\xc9\x3c\xec\x23\x58\x48\x6d\xa8\x54\x23\x39\xec\x78\x4e\xa4\x8f\x90\x0c\x4e\xcb\xb5\x34\x34\x7f\x77\x2e\x26\x7d\xd0\xf0\xd0\x55\xb5\x6f\xca\xfc\x81\xd6\x74\x47\x3f\xfb\xd5\x68\x2c\xa1\x81\x12\xbc\x3f\xe0\xfc\xc9\x60\x86\x44\x0c\x2a\x22\x60\x67\x31\x8d\x14\x99\xbf\x66\x94\x51\x80\x83\xf5\x27\x94\x65\x2a\x60\x35\xad\xf1\xcd\x12\x16\x05\x91\x71\x42\xf6\xdb\xd9\xdb\xee\xd1\xb2\xb7\xb2\x84\x81\x62\x47\x7b\xa2\x39\xc5\xaf\x33\x53\x5b\xfe\x65\x8c\xc6\x4b\x38\x23\xaa\x5c\x28\x4f\xff\xa3\x71\xb1\x76\x68\x71\xe1\x60\xa4\x5c\x49\xbb\xce\x84\x50\x1c\x0c\xed\xd8\xa7\xfc\x46\x14\x82\x25\x1c\x1c\x55\x3e\xa4\x72\x71\x06\xd3\xd3\xab\x63\x65\x09\x38\x81\x40\x45\x08\xa8\xdb\x55\xf8\xbe\xfe\x1a\x4b\x20\x70\xd0\x44\x96\x69\x56\x0f\x2e\x5b\xf5\x5f\x31\x24\x31\x73\x6d\x6e\x5a\x13\x83\x77\xc8\xcb\xdb\x2c\xf8\xf0\x9e\x41\x28\x67\xb4\x2a\x64\xbd\xa0\x17\x43\x18\xa6\x5b\xa5\x20\x9a\xf5\xe3\x99\xd6\xfc\xb4\xce\x0d\xcf\xba\xee\x40\x1d\xc7\x4d\xb4\xd2\xf2\xbc\xb5\xe5\xc6\x38\x0e\xea\x50\xc5\x73\xb2\xbc\x0e\xd6\x77\xea\x30\x47\x91\x7f\x0b\xf1\x06\x5f\x0b\x5a\xc3\xb1\x5d\xed\xb4\x65\xd4\x77\xa0\x06\xf7\x4b\x5d\x57\xc7\x56\xd7\x6f\x3f\x96\xdb\xdd\x6a\xfd\x76\x78\x58\x2e\x56\xaf\xb3\x97\xc3\xe3\x6c\xb1\x5f\x1b\x94\x3b\x75\x81\xf8\x1d\xd7\x3b\x92\xaf\xa4\x7f\xa2\x86\x26\xa3\xfc\x63\x52\xec\x75\x14\xeb\xa5\x9e\xce\xaf\x23\x40\x2b\x47\x7e\x2f\xf8\xc6\x1c\xa7\x5e\xe2\xb9\x4a\x02\x30\xd7\x8c\xa2\xd3\x5f\x96\x7a\x22\x42\x61\x96\x97\xa2\x14\x7f\xf4\x48\x1c\x18\xf5\x40\x98\xf7\xf9\x4a\x8f\x29\xd7\x09\xc1\xe1\xe1\x81\x9f\x38\x8a\x78\x1e\x51\xed\xad\x73\xa8\x91\xec\xe6\xc3\xd1\x80\x25\x8e\x2e\xf2\xd1\xdc\xac\x87\x42\x1e\x1e\xe6\x66\x6f\xa6\x61\x18\x98\xb0\xd4\x43\xc1\x47\x17\x08\x45\x8c\x7e\x4e\x5f\x89\xd1\x52\xc0\x32\x1a\xf9\xdc\x35\xbc\xfb\xeb\xf5\x70\x12\xd0\xd6\x83\xd7\x9a\xf8\xad\x57\x5e\xba\xf6\x28\xc9\x71\x79\xaa\x8f\x43\x64\x0e\x8d\x99\x86\x06\x22\xf7\x47\xbb\xad\x69\x07\x7b\x02\x3c\x44\x63\xa9\xd0\x2b\x58\x14\xb2\x2f\xac\x75\x3a\xfd\xa2\x93\x90\x20\x00\xa7\x52\x36\x4f\xa5\x6c\x49\x64\x97\x95\x94\x8f\x8a\x9f\x89\x39\x28\x09\x69\x60\x2a\x8e\xab\xce\xb4\xd2\xcd\xd4\xe3\x81\xe6\xa1\xfe\x4f\x43\xb3\x54\x5e\xe7\xe9\x14\xfc\x82\x52\x96\xa0\x3c\xc1\x63\x53\xa9\x69\x3e\xb9\x92\x52\xca\x18\x6e\x92\x48\xab\x39\x00\x33\x51\x26\x1c\xd7\x70\x61\x2b\x0a\xc8\xd1\xdb\xe0\x0e\xc3\xc0\xde\x27\xe0\xb4\x57\xc9\xf7\x85\xe2\x2c\x49\xd9\xfd\x38\x81\x39\xdc\x8b\xd0\xf4\x60\x54\x1c\xff\x22\xc9\x46\x81\x03\x53\x56\x32\x2f\xa1\x67\x71\x50\xe9\xa9\x9a\xb9\x76\x96\xec\x8b\xef\x6d\x6d\x2a\x89\x44\x6a\xaa\x43\x45\x25\x3c\xd2\xcc\x42\xa1\xa8\xe4\x31\x4e\x9e\xe5\x25\x45\x66\xc6\xfe\x6a\xc1\x1c\x9f\x22\x00\x11\x68\x99\x5d\x8d\x90\xcf\xc3\xfb\xe0\x6d\x31\xc7\x97\xe8\x3b\xfe\xd0\x8a\x7d\xc8\x89\xa3\x09\xec\xa7\x1f\x8a\x39\xe0\xea\x84\x24\xd6\x20\x6b\xd3\xcb\x9c\xd0\x25\x8a\x3c\xee\x7c\x45\x32\x46\xfd\xab\xe7\x48\x25\x32\x58\x34\x59\xb5\xeb\x72\x35\xcc\xf3\x54\xd5\x9d\xad\x2e\x7b\x28\x9b\xe3\x6d\xf4\x81\xf9\x82\x73\x1b\xfa\x58\xe5\x9f\x9a\xd0\xc9\x0c\x30\x46\x78\x24\x90\xec\x79\x5f\xa6\x03\x81\x43\xc6\x02\x97\x22\x10\x69\xf9\xb0\xfc\xe3\x6f\x11\x41\x30\x16\xc6\x01\x33\x74\x48\x06\x5d\xc6\x42\xce\xd1\x9e\x17\x90\x21\x86\xf4\xbb\xf2\x68\xc6\x22\x07\x02\xa2\x19\xfe\x94\x06\xb4\x19\x2b\xf6\x9e\xa3\x30\x46\x12\x41\x8c\x3b\x3e\x29\x3e\xa2\x1b\xe6\x5d\xc6\x62\x37\x20\xc6\x1f\x41\x31\xd6\xbe\x37\xd0\x6e\xc6\xae\x76\x69\xff\x98\xc8\x73\x0e\x6c\x7f\x96\x48\x89\xc5\x06\xe8\xab\x18\xf0\xb6\x6e\xa3\x9e\xc0\x91\xa0\xf6\xc4\x55\xfe\x99\xa2\xec\xc6\xd7\x58\xed\x97\x31\x46\x88\x16\xa1\x3f\xa7\x39\x4e\x9f\xd1\x1d\xf3\xc0\x61\x41\x2f\x9a\x64\x82\x3e\x1d\x30\x94\xf1\x44\x91\x9e\x5c\xa0\x4c\x0b\xb1\x5a\xac\x11\xd2\x68\xdf\xb5\xf0\x95\x5e\xcc\x6c\xbb\x3f\x2c\xd6\x6f\xfb\xed\x6c\xb1\x3f\xcc\x1e\x1e\xb6\xcb\xdd\xce\xf6\x09\x12\xac\x9b\x3d\xab\xd0\xd0\x90\x39\x84\x31\x11\x13\xb0\x23\xc6\xf8\x10\x68\xdd\xf7\x54\xbc\xdb\x6e\xb1\x02\xcf\xae\xe7\x6b\xfb\x5b\x6b\xb3\xa3\x7d\x63\x9c\xdb\x29\x72\x12\xc6\x04\x53\x09\xc3\x13\xad\x96\x79\xd1\x1c\x4f\xca\x36\xec\x68\x59\x47\xc3\x0a\x42\x4f\xa5\x02\x14\xe1\x25\xd4\xcd\x8d\xe2\xfe\x30\x8d\x30\x3d\x01\x81\x72\x64\x7e\xc8\x90\x76\xde\xea\x4e\x98\xbb\x97\x81\x8f\xbb\x7d\x5a\xa9\xf2\xf5\x71\xc9\x1e\x93\x81\x7a\x33\xa8\x51\xba\xab\x5b\x0b\xcf\xcc\x47\xee\x84\x34\xd1\x34\x78\xbb\x31\x33\x1f\xe3\x8e\x04\x5f\xf1\x34\xcb\xe2\x55\x05\x97\x87\x1d\x3c\x22\x10\x1d\xbb\xfa\x63\xaf\x13\x8d\xd3\x50\x49\xee\xbb\x5c\x51\xcb\xc1\x27\x64\xc5\xa5\x9b\x15\xdc\xf7\x5c\x2c\xb5\x95\x45\xc9\xd2\x1b\x1d\x91\xe1\x80\xe6\x7e\x18\x60\xac\x99\x35\xba\x4c\x4c\xb3\xaf\x4c\x2f\x5d\xdc\x8f\x03\x53\x9f\xd5\x0c\x0b\x90\xb8\x4f\x7d\xf4\xbb\x9f\x7e\xee\xbb\x88\xb1\x6e\x23\x8e\x87\xf0\xf4\xfd\x7a\x3f\x7b\x39\x6c\xb6\xcb\xd9\xcb\xcb\x7a\x81\x32\x0e\x5d\x17\x69\x80\x8b\x7a\xac\xbc\xaf\xf2\x3a\x1e\x57\x6e\x0f\xbe\x68\x6c\x8e\xf5\xa5\x92\xe6\xc5\xd9\xfd\xed\x5e\xc0\x49\x28\x3d\xed\xaf\xfc\xb3\x81\xaa\x5d\x03\x6f\x89\xc5\x19\x27\x94\x22\x98\xae\x3a\x15\x5f\x6a\xf6\xdd\xd6\xc4\x33\x1e\xf8\x1e\xae\x51\x58\x56\xff\xc8\xcd\x9c\xe0\x01\xf1\xa8\x11\xb1\xdb\x34\x2c\x4b\xf9\xc4\x56\xcd\x83\x48\xa0\x33\x71\xf8\x7b\xe0\x34\x9d\x26\x9e\x3a\x51\x1c\x03\xf4\xaa\xdd\xef\xc6\x92\x79\xc0\x29\xf2\xa5\xcb\x26\xcb\x50\x89\xb4\xdd\x29\xe6\x45\x2e\xaa\xf1\x93\x49\xa5\x60\xa8\x05\xed\x91\x49\xa4\x9b\xf4\x3c\x0c\x12\xf4\x37\x75\x90\xa5\xda\xa7\x59\xf6\x56\x7c\xd9\xe6\x88\x09\x50\x55\x82\x87\xfd\x6c\xf7\xfb\xe1\xc7\xec\xe5\xdd\xa4\xd0\x78\xec\x48\x25\x6d\x62\x7f\x08\x44\xd0\xcb\x0c\x58\xf7\x65\xa3\xad\xb9\xd1\xd0\x8f\x43\x81\x99\xb2\x99\x10\x8a\x7b\x09\x6b\x2b\xfb\x51\x61\x1e\x27\x8a\xe6\x63\xbb\xfc\x61\x2f\xd2\x9a\xb0\xb8\x83\x66\x29\x4f\x6b\xba\xa1\x47\x94\xb1\x2b\x46\x4f\xce\x62\x92\x74\x3c\xbd\x8f\x70\xef\x2e\x98\x90\x11\x6e\x05\x5e\xa2\x06\xa9\x6b\x1a\xc0\x35\x8b\xf7\x02\x32\x60\x58\x85\x38\xbc\x06\x8f\x12\x54\x55\x7f\x2d\xf8\xc7\x03\x8c\xd7\x17\xce\xa5\x83\xb0\x7e\x6e\x79\x7d\x8d\x3d\xcb\x21\x81\x88\x0d\x5f\xd5\x9d\xa9\x0a\xd2\x53\xa4\x37\xe9\x31\x5f\xe7\x76\x2a\x4a\x5f\x45\x2e\x5e\xbe\x05\x91\x73\x19\x44\xa1\xd3\x07\xa4\xfd\xbf\x42\xab\x72\x19\x27\x48\xd7\x23\xd2\x4f\x8d\xe6\x1b\x15\x6a\x73\xc9\x85\x91\x9f\x9d\x2b\x0a\xb6\x9e\x31\xc4\x25\x38\x18\xc7\x7a\x4c\x07\x95\x49\xc2\x71\x42\x2c\xdb\x32\xea\x32\x38\x96\x95\x0f\x5f\xd9\x3e\x4c\xe1\xa7\x71\xff\xda\x5d\x20\xaf\x37\x8a\x0b\x65\x70\x8b\xc2\xe1\x80\x7e\x8d\x0d\x51\x29\xc1\x2a\x8c\x53\x35\x1d\x4d\x03\x13\x6e\xe0\xa1\xb5\x71\xc0\xb8\xa6\xb5\x76\x1f\x34\xee\x6d\x78\x56\x37\x56\x9e\x8e\x42\x52\xf5\x36\x99\x51\x78\x47\x78\x6e\x84\x59\xb7\xc5\x6c\xf5\xd0\xad\x9b\x93\x26\x91\xf0\x02\xcf\x57\xfc\x80\xc5\x4c\x88\x2d\x7c\xa6\xf0\x35\x1e\x97\xc2\xa3\x49\x18\xe8\x7a\xc5\x37\xf8\x85\x92\xb7\xc3\x42\x3b\x8f\xfc\xd7\x9d\xff\xd7\xa7\xf0\x1d\x4e\x15\x39\x60\x55\x8f\xb0\x32\x82\x50\x4a\x6c\xa9\xd4\x41\x95\x6c\xdf\x61\xc5\xd2\x47\x04\xc4\xe7\x5a\xa3\x9e\xef\xd3\x33\x88\x7f\x36\x45\x17\x52\xfb\x7e\x00\x89\x20\x48\xb0\xf4\x82\x17\xb9\x4c\xcb\xb3\x2a\x42\x3f\x0c\x59\x05\x44\x3b\x56\x89\x59\xff\x37\x59\x51\xdb\x82\xa6\x9b\x95\xd0\x1e\x91\x20\x8a\x21\xe5\x77\xd9\x91\xc6\x7f\x6f\x57\x53\x11\x50\x82\x05\x59\x8a\xa8\xc9\x70\xf8\xdc\x10\x4d\x33\x11\x80\x8f\x6b\xcf\xa5\x35\xa1\x7c\x0b\x3f\xd4\xad\x91\xab\xf8\x05\x4f\xb4\x7a\x4d\xab\x0a\x04\xaa\x9a\x5f\x8a\x34\xaf\x77\x0d\x33\xb0\x7d\xd3\x39\xe0\x08\x03\xa8\x20\x17\xaf\xb4\xfc\x80\xf6\x9a\xb3\x5c\x6c\xdf\xb6\xb6\x0b\x57\x55\x73\xad\xf1\x3d\x98\x35\x89\x17\xab\xdc\x78\x71\x3e\x17\xf9\x83\x7e\x89\x93\xcb\x07\x5a\x70\x48\x65\x25\xd2\xfa\x89\xde\xc1\xbe\x89\x24\xe2\xa1\x30\x89\xf3\x2f\xf8\xb5\x43\xb5\xb9\xa6\x1c\xa2\x19\x05\x75\x08\x12\x27\xd1\xa6\x2e\x14\xf1\xa8\xb9\x25\xea\x52\xc4\x5c\x4a\x2c\xba\xd3\x62\x55\x7b\xa0\xe7\x2d\xf0\xf4\x92\x76\x1e\x9f\xa0\x9e\x8a\xeb\xcf\x9f\x57\xaf\x83\xa7\xa2\x04\x40\x87\x53\x95\xd6\xb9\x76\xc5\x8a\xb2\xb2\x3e\x77\x35\x60\x04\x63\x82\x8a\xb0\x47\x32\x32\xf0\xe8\x04\x73\x44\xa2\x2b\xe3\x11\x74\x39\xb8\x18\xf3\x7d\x83\xd2\x7e\xd3\x6b\xcf\x83\x62\xb2\x10\x0f\x40\xb3\x6a\x53\x16\x1a\x34\x6b\x8f\x88\x9c\xc4\xf0\x42\xf5\xaa\x8e\x47\x2f\x92\x71\x47\x11\xe2\xea\xe9\xa6\x8c\xb1\x2d\x18\x92\xa9\x61\x6f\xee\x04\xea\x7d\x56\x15\x94\xf5\xf2\x3f\x5e\xa8\xb6\x20\xcf\xcc\xe8\x91\xdf\x22\xb8\x50\x91\x19\xc5\xb3\x75\x4a\x2f\x93\x00\x63\x21\x3c\x2f\x71\x74\x60\xad\xb5\x7c\x7b\x79\x6f\xd3\x23\xf0\xd1\x77\x55\x02\x32\x48\x74\x45\x07\xe2\xed\x6d\x17\x15\x5f\xbf\xe1\xad\xfc\x8b\xa9\x2e\x98\xaa\x10\xe5\x34\x37\xe6\xd0\x4a\xbe\x4c\xd8\xdf\x42\xb4\xd6\x2f\x8e\x63\x8a\x65\xfe\xe6\xca\x40\x5c\x70\x6d\xe8\x74\xdb\xb3\xae\xff\xed\xff\xcf\x84\xbe\x55\xf4\x3f\x23\xa0\x5a\xfc\x6f\xd7\xfc\x14\x6b\xed\x57\xfd\xfb\xa4\xb8\xdf\xe0\x58\x93\xd5\x12\x10\x83\x21\xb2\x7c\xda\xec\x4e\xb4\x3a\x6d\xb1\x7a\xb5\x9f\x18\x11\x32\x0c\x95\xbb\x7d\xa6\x65\x7d\x8f\xa7\x32\x36\x9d\x99\xc0\xa8\xa2\xd2\x40\xa9\x60\x6c\x5f\x83\x93\x04\xa8\x1a\x83\x6e\x69\xbb\x0e\x99\x06\xd7\xf1\x31\x3b\x7c\x50\x3c\x28\xbf\x8f\xb1\x4e\xe0\x25\x0a\x4c\xa6\x7f\xd5\x90\x8f\xea\x94\x5e\xcc\xf7\x04\x8f\x0a\x5c\x71\xb2\xe2\xf8\x9e\xa7\x9f\x50\x56\xf0\x58\x94\x1f\x20\x16\x14\x69\xbe\x4d\x37\xa1\xf4\xf6\xd5\x96\xb0\x96\x5d\x96\xa8\x3b\x93\x74\x62\x63\x19\x15\x55\xfd\x58\x94\x5b\x03\x87\xd4\x8f\x0a\xbe\x27\x98\x2a\x25\x56\xb1\xd9\x7e\x9e\x1e\x7c\xa1\xe8\x1e\xda\x1d\xf8\xa1\x2c\x72\x78\x00\x49\x9b\xac\x9e\xe9\x2a\xf5\xc1\x78\x02\x42\x13\xc7\x1f\x52\xc0\x8c\x53\xac\x40\xa4\x42\xe0\xb2\x82\x96\xa2\xbd\xa7\xdf\x6c\x83\xc2\x0b\x20\x5f\xd1\x99\xa6\xf9\x2b\xcd\x1b\xfb\x20\x81\xab\x2a\xcd\xcd\x96\x66\x7f\xf7\x5c\xac\xa7\x4a\xf3\xd6\x74\xab\x60\x5c\xde\x3d\x39\xf7\x21\xf0\xbc\x44\x53\x8a\x9a\xb4\xb8\xa6\xed\x1e\x7e\xab\x20\x09\x41\x91\xe7\x20\x5c\x10\x17\xb7\xdc\x56\xdd\x40\x00\x89\xdf\x39\x59\x8a\x21\xe0\xf0\xbe\xd9\x2c\xb7\x88\x97\x32\x68\x2d\x08\x89\x22\xfe\xe9\xb0\x21\x16\x06\x38\x9e\xa8\xc3\xeb\x87\x01\x78\xb4\x23\x29\xf8\xad\xfb\x99\xd8\xca\x6e\xbd\x21\xb5\x2b\xdd\x5f\x54\xc9\x42\x28\x08\x8e\xab\xd9\xf6\xf7\x3d\x3d\x1e\xa1\x3c\xb8\x07\xc7\xb1\x67\x05\x8e\xb8\x90\xb7\xf7\x97\x97\xc3\xf2\x6d\xb1\xfd\xd7\x06\x75\x67\x67\x2f\x4f\xeb\xed\x6a\xff\xfc\x7a\x58\xd9\x27\x8a\x92\x18\xa1\x61\x79\x91\x3f\x36\xf9\xb1\xb5\xca\x46\xb5\x7a\x10\x6b\x09\xff\xff\xe5\xe5\x7b\x25\x7a\xa8\x03\x88\xb9\x87\x81\xd7\x61\x76\xf1\x36\xa6\x68\xba\x4b\x3f\xf2\x6d\x94\xe7\xe7\xcb\xab\xc2\xd2\x8e\x3e\x55\xe2\xc4\x18\x72\x02\x64\xc8\x52\x02\x18\xa6\x29\x56\xa5\x6a\xcf\x45\x53\x1e\x33\x5a\x55\x3f\x3c\xdb\x24\x68\xa2\x7d\xd3\x39\x54\x35\x82\x72\x4c\x1b\x05\x8a\x25\xea\x19\xad\x6a\x05\x3d\x53\xa1\xa5\xfe\xf0\xa3\x52\x55\xac\xe0\xb6\xf5\x07\x66\x09\x4d\x13\x8f\x14\x75\xd4\x99\xfe\x9a\x03\xd2\xd7\x3f\x74\xf9\x21\xe0\x2c\xc4\x68\xf0\x6e\x3f\xdb\xa2\x16\xff\x6e\xb3\xdc\xbe\x9a\x56\x11\x04\x4c\x91\xa1\xa5\x99\x78\xd8\x2d\x69\x75\x45\x03\xab\x4a\x8f\x7f\xf1\x89\x45\x98\x28\xa8\x86\x22\x22\x1a\xa8\xe4\x33\x00\xaa\x76\xb1\x1a\xaa\xba\x5d\x26\xa7\x6d\x0c\x00\xaa\x22\x1d\x5f\x56\xd9\xd8\x7c\x99\xfe\xde\x05\x92\x04\x89\xb6\x31\x94\x84\xea\xb4\x11\x2d\x1d\xe2\x3b\x83\xd3\x75\x22\x86\xa3\xd5\x41\x3a\x14\x90\xce\xe2\x21\x3d\xa6\x7d\x2b\x40\xba\x94\x62\xcc\x70\x59\x9f\x9e\x0b\x91\x41\xf9\xdb\x5d\x86\x09\xe9\xca\x44\x73\x62\x68\x80\x43\x3f\xa0\xa1\xfb\x78\x89\x40\x02\x85\xe5\x27\xe4\xf5\x16\xab\x7b\xb6\x69\x35\xe4\x4d\xb4\x5c\x39\xe3\x17\x24\x7d\x12\x18\x99\xb2\x76\x60\xfb\xc4\x7c\x75\xe9\x13\x30\x92\x17\xef\xcd\x98\xa7\x42\xfa\x11\x27\x9a\x17\x46\x81\xc6\x27\xa7\xbd\x24\x7e\xa0\xea\x1c\xaf\xaf\x50\x9f\x0a\x31\x30\xed\x24\x89\x42\x87\x59\x95\x86\x0d\x94\x72\x24\xe9\xcf\x24\x11\x31\xf2\xcf\xcc\x9a\x76\x37\xa0\xdf\x20\xf9\x24\x81\xc0\xa8\xce\x6b\xc6\x4b\x1c\xcb\x5a\xae\xce\x3c\x56\x90\xb8\x98\xe3\xa0\x42\xbc\x14\x45\xcd\x8a\x3b\xf9\x62\x19\x50\x0f\xb1\x57\xe7\x34\x6f\x77\x1b\xc3\x87\x65\xce\x13\x82\x52\x00\xaf\xe0\x26\xca\x36\xba\xaf\xc8\x4b\x12\x66\xd9\x2b\x36\x46\xff\x24\x1f\xe9\xd6\x30\x19\x25\x3c\xe9\xeb\x38\x4c\xa9\xf1\x31\x19\x09\x0f\x15\x05\xab\x53\xd1\x64\xad\x23\x07\x65\xad\x38\x84\xea\xa6\xec\x57\xe8\xca\x48\x86\x8c\x76\x35\x49\x3b\xc8\x32\xb7\xb5\x89\xb4\x5e\x8d\x79\x92\xd8\x15\xa2\x5d\x95\xde\x36\xfb\xc1\x40\x8d\x35\x8d\xdd\x85\x5e\x6f\x06\x53\x6f\xc8\x1a\x3b\x51\xc6\x71\xa0\x23\xea\x02\xb9\xe2\x06\x83\xd5\x73\x86\x23\x3b\x96\x14\xef\x6d\x96\x9e\xd3\x6f\x22\x11\x32\xa1\xcc\x0c\x91\x4d\x09\x15\x64\xd9\xfb\x65\x5f\xf4\x6f\x9f\x72\x11\x7a\xfd\x24\x86\x32\xfb\xa6\xd8\x9f\x99\xa4\xd2\xc7\x09\xa5\xf7\xc8\x81\xa1\x2b\xb9\xef\xe3\x1e\xf9\xfb\xc3\xca\x9c\x9c\x13\x6e\xa0\x99\x3b\xbc\xfd\xbe\x21\x26\x85\x47\xb1\x4c\xae\x63\xe7\x33\x94\x3d\xd3\xcb\x91\x14\x1e\x60\x25\x01\x6b\xae\x73\x5a\xa5\xfc\x3d\x4f\x6f\x38\xe6\x4d\xd7\xc4\x35\x9a\x6a\x1a\x7e\x89\x42\x72\xe5\xa8\x36\x72\x8a\x9c\x92\x49\x41\x15\xa7\x00\x0a\xb2\x8d\xcb\xdb\x25\x78\x04\xa9\x73\xcf\x69\x8e\x0c\xe2\x18\x2f\x7b\x2c\x4a\xc5\x09\x76\xd2\xb9\x4c\x35\x3a\x5d\x2f\xb6\x4b\x1a\x50\x07\x5d\x40\x6d\x43\x0c\x05\x25\x99\x04\x29\x02\xae\xdf\x86\x22\x3d\xec\x11\x29\x49\x49\x58\xa8\x88\x79\xe8\xe5\x91\x96\xd3\x02\x50\x4c\xca\x20\xf4\x15\xf7\x39\xe5\xa7\xbd\xe2\xd2\x1b\xdd\xbe\x0c\xa4\xa2\x34\xca\x79\x71\xbe\x64\x50\x77\xd7\xe0\x11\x68\x92\xab\xdf\x26\x34\x15\xb8\xe3\xba\x2a\x02\xf6\x95\xe6\x79\x9a\x1f\x0f\xe7\x22\xaf\x4f\xbf\x99\x46\xc6\x14\xc3\x63\x71\x7c\x83\xaf\xdb\xa9\xc7\x1d\x57\x04\x48\xcf\xa2\xe9\xe2\x5a\x3b\xc1\xca\x9a\x4c\xda\x67\xdc\xf1\x22\x60\x7a\x00\x69\xce\xc1\xb2\xa4\xd7\x17\x45\xea\x3d\xea\x2a\x94\x08\xce\xa5\x04\x3b\xa0\xcc\xbd\xf9\x81\x1b\x44\x83\x91\xa6\xf1\x54\x07\xde\x93\xf4\x33\xbd\x09\x89\x22\x23\x29\xa9\x22\xc8\xa6\x81\x49\x54\xb2\x33\xf6\xca\xea\x8f\xfd\x8d\x7d\xd9\x9b\xa6\xdc\x09\x3c\xc7\xb7\xc2\xf0\xad\xbf\x88\xda\x24\x8f\x45\xf9\xd6\x9c\xff\x06\x54\x91\x3b\x61\x10\x71\xbd\x4f\x60\x41\x31\xcd\x7a\x91\xba\x6a\xf4\x06\xc2\x38\xf4\xf4\x4a\xb9\xa0\xf9\xbc\xb9\x76\xab\x19\x77\x22\x3f\x89\xfb\xf2\xda\x6b\x86\xfe\xfe\xf8\x1b\x45\xb1\xaa\xa8\xab\x20\x17\x07\x83\xb3\xbf\xa5\x04\x18\x5e\x38\x4e\x1c\x12\x1b\x97\x1e\x93\x6a\x18\xda\x37\x51\x22\xee\xc4\x94\xe1\x8b\x5b\xbe\xfd\x03\x1d\x28\xd9\xe4\xd3\xb8\x4a\xee\xc4\xa0\x56\xac\x3e\x8b\xf7\x06\xca\xdb\x14\x00\x77\x92\x84\x70\xd7\xe0\x08\x78\x59\x28\x73\x70\xaa\x2a\x87\x3b\x09\x53\x6c\x8a\x98\x2e\xd8\x01\x0a\x9c\xeb\x26\xea\xf8\x21\x33\xc5\xfb\x56\xd3\x82\x3b\xd4\xf7\x31\xe1\x38\xef\x74\x9d\xed\xf2\xde\xb6\xca\x58\x41\xa7\x2a\x25\x65\x37\xfd\x01\x69\xc0\x15\xf9\x57\x73\x5d\x75\xc7\x46\xaa\x9e\xe2\xa2\xb2\xf8\xcb\xfa\xf4\xb3\x53\x45\x34\x7d\xa8\xc0\x87\xcb\xe1\x17\xa2\xdc\xb4\x84\xd2\x6b\x9a\xcf\x15\xf3\xa9\xe9\xc8\x12\x25\x8b\xd8\x41\x1c\x61\xbe\x7f\x1a\x19\x54\xdc\x61\xc0\x3d\x69\x30\xc9\x9a\x3b\x40\x8b\x10\xe9\x1e\x3c\x54\x08\xfd\x59\x5a\xee\x4b\x2a\x65\xca\x7b\xb5\xf5\xc3\x59\xda\x73\xe8\x87\x5f\x8f\xc7\x8a\xb5\x7f\xa7\x0c\xdd\xc9\x55\x8a\x3b\xc2\x11\x08\x29\x9f\x09\xa1\xb5\xd8\x47\x5f\x4b\x10\x40\x4a\xfc\xed\xbf\xde\xd6\xfb\xa5\xb9\x41\x70\x1c\x9b\x96\x5e\xe5\x4f\x8d\xf9\xca\xb1\x69\xf7\x63\x2c\xd3\x47\x4c\xf8\x2a\xff\xd6\xae\xe0\x8e\x74\x7d\xaa\x15\xe8\xac\x52\xf1\x8d\x06\x1d\x77\x64\xc4\x50\xda\x38\x6f\xce\xc6\x57\xab\x6c\x1b\x57\x2c\x24\x66\x4e\x3d\xd3\x5c\x8c\xb6\x45\xee\x3a\x90\x38\x5d\x52\xe3\x2e\x9a\x88\xbb\x6e\x98\x50\x9c\x24\x2f\x6b\x9d\x9e\xe1\xae\xc7\x39\x2e\x45\xcf\x4d\x73\x46\x8a\xe2\x5c\xb4\x8e\xc7\xdf\x62\x58\xe3\xae\x1f\x78\x5c\xaa\x08\x6e\x4d\x79\x3d\x8c\x7f\xb7\xcd\x0c\x9d\xdf\x33\xba\x8e\x56\x6c\x8e\xbb\x7e\xec\xf9\x61\x07\xec\xd7\x78\x98\x9f\x3d\x7e\x26\xee\x12\x2f\x40\x35\xd3\x43\x21\x65\x96\xe6\xd0\xaf\x1c\x9d\xdc\x56\xb9\x4b\x02\xc0\x09\xf5\xd0\xd4\xdc\x6c\x93\x7f\x55\xc7\x39\x19\xb8\xb2\x67\x0c\x88\x4f\xac\x3c\x8c\x35\x0c\x7b\xba\xff\xdc\x0d\x79\xc8\x75\xc9\xc4\xa6\x4c\x3f\xd3\x0c\x8e\x93\xcc\x1a\x6d\x4f\x55\x10\x5b\x02\x2f\x46\xb8\x01\xee\x46\xc4\x41\xdf\x73\x83\x39\xff\xdd\x44\x49\x8e\xee\x18\xbb\x89\x67\xc8\x2e\x4f\x34\xcd\x7f\x16\xe5\x87\xb9\x97\xd8\x97\x58\xfe\xad\x90\x33\x1f\x90\xb7\xd3\x1e\x8d\x98\xc9\x75\xd5\x4d\xa2\x04\xa7\xf6\x8f\xb4\xac\x1b\x9a\x99\x08\xc5\xf4\x80\x76\x93\x24\x8e\x15\x69\x97\x42\x92\x0f\x86\x42\x22\x14\x56\x05\xce\x69\x3d\xc3\xe2\xae\xa7\xf4\xb3\x67\x36\x0e\xbf\x54\x22\x15\x83\x8f\xc6\xf1\xee\x6f\xb0\x27\xba\x1f\x73\x15\x92\x6b\x5e\xe4\x73\x43\x55\x3f\xbc\x29\xe4\x61\xea\xa8\x8e\x15\x79\xf9\xf8\xe5\x32\xce\xb0\x22\xc6\xcc\x58\x1d\x79\x9c\x88\x93\x72\x97\xcb\x50\x76\x1a\x0b\x48\x78\xb6\xab\x69\xdd\xf4\x30\x92\x6d\xa7\x08\x81\x9c\xcb\xfd\x73\x6a\x8a\x76\x74\x93\x08\x15\x45\x32\x02\x7f\x70\xa4\x3c\xf7\x3d\x1c\xee\x82\xa3\x18\x48\x0e\xb8\xcb\xb7\xc6\xc2\xcf\xdd\x6a\x31\xba\x63\x08\xc1\x28\x6e\xcf\x1e\xce\x69\x8e\x2a\x06\xed\xb0\xde\x94\xc5\xaf\xeb\xe8\x1d\x40\xac\x18\xfd\x31\xbf\x7e\x4e\xf3\xe9\xe1\x07\x94\x84\x6e\x5f\x68\x58\x2d\xbc\xa6\x15\x44\xa0\x20\x80\x2a\xd5\x76\x67\x0c\x48\x57\xc6\xb2\x8b\x13\x69\x2b\xde\x3e\x9b\x04\x2e\xd5\xd7\x50\xcc\xb8\x1d\x87\x38\x77\xa5\x54\x82\x59\x67\x05\x9f\xc1\x7a\x21\xd5\xe4\x39\x3e\x08\xed\x1a\x62\x72\x6e\x94\x77\x1b\x0e\x0a\xcf\x25\x21\xa5\xa6\xb6\xee\x3a\x7d\xa3\x9e\x1b\x24\xc9\x90\xb5\xbf\x19\x88\x9a\x73\xcf\x05\xe5\xce\x41\x7d\x52\xca\x83\xa3\x2d\xdd\xf3\x1c\x05\xf0\xae\x34\x2f\xde\x16\x2e\x45\x89\x62\x5a\x93\x23\xc7\xf3\xa8\x44\xd6\x08\xae\x87\x61\x3f\xf5\xc0\x3d\x4f\x7a\x80\x2a\xf2\x4d\x99\xef\x2e\x59\x5a\x0f\x22\x26\xdc\xf3\xa3\xc4\xd5\xfa\x0a\xed\xec\x69\xbd\x41\x5d\xb2\xf1\x98\xd2\x69\x2f\x84\x7b\x44\xb3\x4e\x5a\xbb\xf3\x07\x8e\x45\x43\xad\xfd\x5d\x04\x87\x7b\x24\x71\x4c\x1c\xb4\x35\x30\x84\xb5\x85\x8c\x3d\xea\x11\xcd\xd2\x3f\x87\xbe\x8c\x36\xf7\x42\xcf\xc3\x98\xc6\xcb\x7a\xf1\xfb\x61\xf7\xb2\xde\xef\x6c\x4b\x9c\x98\x04\xb9\x62\x6c\x30\x63\xf1\x36\x11\xcd\xbd\xc8\x09\x15\x59\x11\xb4\x7e\xc2\x83\x96\xd5\xdc\x97\x94\x7f\xa4\xf9\xb1\x23\x34\x6f\x7b\x72\xe4\x75\x50\x39\x9d\xc7\xa2\x74\x97\xf5\x69\xe3\xd9\xe6\x30\x44\x82\x5d\x4c\xae\xad\x9b\xd1\x6e\xef\x45\x10\xc4\x8a\xeb\xb2\x35\xb6\x07\xee\x35\xf7\x62\x4a\x91\x64\x73\x3b\xdb\x2f\x0f\x8f\xeb\xed\xe1\xe7\x72\xf9\xbb\x6f\x5b\x65\xa0\x4c\xf5\xe2\xc5\x8a\xe6\x73\x2f\x09\x43\xa4\x7e\x1b\xd2\x77\x3d\xc0\xa7\xcd\x91\x8d\xc7\x52\x12\x29\xce\xf2\x4b\x59\x64\x45\x7e\x7c\x1e\x37\x83\x9a\x00\x95\xf6\xf7\x2c\xcd\xef\xb7\xd6\xbb\x47\x69\x88\x08\x9f\x4d\xf1\x01\x5a\xb1\xca\xdc\x22\x05\x8e\xd1\xef\xb4\xda\xa8\x01\xf5\x06\x60\x0a\x69\x38\x52\x79\x69\x54\xb0\x1e\x86\x6b\x89\xdc\x0d\x23\x9b\xc1\x43\xb8\x1a\x7e\xe9\x9f\xab\x7f\x9a\xa3\x39\x17\x58\x6e\xf0\x91\xd6\xf5\x75\x51\x94\xf6\x23\xeb\x76\x41\x7d\xae\xb4\x23\x2f\x63\xc6\x5e\xee\x09\x20\x0e\xb5\xe1\x96\xd6\x47\x6a\x87\xba\x15\xe2\x1b\xbf\x38\xf0\x55\x75\xa0\x21\x33\x9d\xe2\x3d\xe7\x9e\x14\xdc\x0f\x06\xac\xed\x4a\x12\xb5\x19\xa1\xb4\xb8\xef\x04\x14\xab\xd9\x7a\xa5\x01\xe2\xad\xf9\x9e\x35\x8a\xfb\x4e\xac\xf0\xd5\x25\x06\x71\xe6\x50\xcf\x72\xd1\xb1\xc8\x6b\x18\x01\xf7\x3d\x17\xb0\xbe\x84\xf6\x69\x86\xb9\xef\x45\x01\x86\x85\xb5\xb4\xcf\x43\x9a\xa5\x47\xc8\x39\x0c\x3b\x25\x80\x63\xf8\x85\x56\xf5\x81\xb5\x26\xa8\xc1\x59\xd3\x5c\xe0\x0f\x75\x7a\x86\x43\xc7\x25\xc0\x7d\x42\x04\xde\x15\xce\x0a\x15\x32\x56\x32\x9d\xb6\x43\x12\x22\x20\x4a\xc5\x03\xfa\x57\x23\x1c\x9c\xa0\x97\xcd\x10\xbd\x9a\x02\xee\x13\x08\x99\x2a\x6c\x17\x3a\x93\xfc\xcf\x9b\xda\x31\xee\x07\xc4\xc1\x32\x37\x40\x68\x7a\x5a\xe4\x98\x57\x5c\x0f\xe3\x01\xdc\x0f\x92\x04\x23\x71\x3f\x56\x6f\x83\x5b\x88\x62\x55\x67\x60\x8c\x5b\x2c\xe8\x91\xed\x30\x1d\xe5\x44\xb9\x1f\xd1\x00\xd7\x46\x86\x92\x0f\x37\x31\x32\xee\x27\x22\xc6\x54\xb3\x86\x12\xcc\x72\xf1\x58\x94\x88\xce\x9c\x06\x5a\x4d\x83\xf5\x27\xad\x4a\x3f\x11\x14\xf7\x09\x46\x6b\x7e\xea\xe3\xfe\x74\x6a\xd0\x19\x1b\xda\x3e\x75\x03\x14\xa8\x59\xa6\xa2\xa8\x26\x21\x36\xb6\xa3\x02\x47\xbd\x41\x59\xd4\xfd\x77\x43\x65\x82\xd6\xe0\x53\xeb\x39\x0c\xde\x1a\xa3\x09\xe8\xa4\xde\x2b\xcd\x7b\x45\xc0\x63\x87\xcc\xe7\xc4\xc3\x84\xd5\xcf\x97\x57\x73\x30\xa7\x09\x2a\xd1\x9e\xd0\x8f\xd0\xae\x11\xba\xd2\x6a\x14\x4c\x5b\x61\x3e\xe7\x0c\xf7\xd2\x0c\x3e\x21\x7b\xbf\xcc\xaf\x1b\xc8\x8f\x4d\x7a\x63\x67\xf9\xc2\x27\x88\x85\xe0\x5d\x02\xb3\xfd\x51\x21\x79\xad\x51\x6a\x8a\x97\xc6\xa9\xa8\xd1\xcb\x11\x5c\x70\x65\x91\x54\x0d\x3c\x34\xed\xbe\xd1\x3a\xcf\xd3\xb7\x28\x24\xa7\x3a\xbd\xb2\x39\x2d\x7f\x71\xb8\x74\x74\x71\xf6\x4b\x02\xc4\xb1\x4d\xfc\x09\x80\xf3\x84\x8c\x14\xf7\xa5\xab\x92\x08\x47\xa8\x77\x59\x51\xeb\x58\x90\x69\x0c\x29\x91\x9d\xac\xa8\xad\x5e\x19\x9d\x22\x61\xb1\x8e\xcd\x2b\x2a\x91\xc7\x8c\x1e\xad\x8c\x88\xce\x26\x73\xe2\xc4\x4e\xa0\x4d\xf9\x47\x5d\x46\x32\x5c\x49\x89\x93\xc4\x98\xc2\x7d\x2d\x58\xaa\x17\xc8\x59\x66\xb5\x6c\x38\x71\xc3\x08\x3d\x56\x31\xa8\x8b\xbe\x83\x2e\xec\xb2\x12\x9c\x78\x8e\xe7\xb8\x1d\xbf\x16\xa6\x62\xa1\x7c\x2c\xca\x5d\xc3\xfe\x17\xc6\xfe\x32\xf1\x5c\x07\x49\x8a\xe0\xd7\x25\x2b\x4a\x58\xee\x9f\x2d\x7f\x2b\x27\x5e\x10\x62\x1d\xc6\xb2\x3e\xed\x81\x76\x52\x5f\xc3\xa4\x77\xff\x9e\xb4\x54\xc0\x48\xa2\x9e\x93\xd6\x46\x52\x71\x9e\x76\x9e\xb5\x4b\xf8\xae\x2e\xca\x6e\xf3\x20\x84\x24\xc8\x02\x72\x28\x69\xfe\x31\xbf\x4e\x14\xb3\x70\x42\x02\x4f\x41\x2f\x2f\xf4\xba\xd4\x91\x95\x59\x2e\x6c\x5d\x36\x8c\xfb\x87\x04\x0d\xf6\x87\xf2\x4a\x85\xbd\x50\xec\x61\xfe\xea\x40\xab\x2a\x3d\x2a\xe2\x8b\xf2\x3a\x3e\x92\x7a\x68\x51\xeb\xbd\xa4\xdb\xb6\x91\x32\x17\xd7\xa7\xe1\x01\x81\x74\xc2\x81\x66\xac\x89\xd7\x2b\x90\xe1\xd0\xf9\x24\xa1\x1b\x09\xa3\x88\x82\xd9\x19\xa5\x3d\xd5\x37\xa1\x48\xc8\x3c\x5c\xc7\xff\xd3\x80\x49\x88\x72\x12\x8a\x18\x01\x08\x4b\x2d\x4d\x31\xba\x8b\x88\xb8\x18\x5f\xc6\x24\xe2\xe6\x69\xd9\x5f\x5f\x48\xec\x84\x58\x90\x59\xb4\x76\x78\x6b\x69\xd9\x86\x28\xc1\x3a\xb3\xd9\xe3\x4f\x1c\x6b\xc3\x73\xc6\xb1\x8b\x7a\x4f\xa6\x6e\x17\x4b\x73\xe7\x57\x25\xe9\x34\xea\x0a\x91\x62\x14\x57\x6b\xf5\xbe\xff\x2e\xba\x5e\x34\x26\x2a\x6d\x59\xd3\x5f\x83\x1b\xa4\x2c\x0c\x75\xfa\x95\xd7\x96\x74\x85\x66\x87\x23\x06\x7d\xcb\x03\xfc\xa7\xc7\x5b\x34\x6d\x38\x11\xca\xa3\xc8\x10\xb2\x18\xf6\x84\x81\xa7\x3a\xdc\x03\x08\x05\x8e\xc1\xb2\x8a\xb6\x96\xea\xbc\x28\xb2\x2d\xce\xd9\xca\x8e\x4c\xe6\xf9\xbe\x76\x16\xda\x49\x30\x0c\x15\x0e\x47\x39\xf3\x22\x2c\x4f\x6c\x3d\x81\x59\x8a\xec\x7d\xbf\xdd\xc4\xbd\x4c\x5f\x4e\x3d\xc5\x17\xa2\x61\x21\x0f\x40\x45\x96\xe6\xdd\x75\xa5\x92\xef\x35\x1b\x39\x66\x61\xea\x6f\x4b\x6f\x38\xe1\x5e\xe4\x26\xaa\xd4\x11\x95\x3e\x6c\x29\x16\x27\x9c\x11\x06\x16\x59\x61\x52\xed\xed\x54\x7c\xc3\x20\x61\xaf\x80\x53\x1f\x21\xbc\x00\x2d\xcd\x07\xa0\xf5\x49\x15\x19\x1f\xd2\xd4\x9c\x4f\x10\xa1\x3c\x14\x23\xdf\x57\x8f\x43\xc2\x04\x02\x95\x2b\xfe\x48\xb3\x0c\x46\x4a\xc3\x6d\x6b\xe2\x5a\x45\x37\xac\xda\xb5\x2d\x91\xaa\xb5\x2d\xbb\x40\x3c\x81\x38\xc6\x88\x46\x93\xbf\xa4\xf9\x47\x7b\xdb\xaa\xbe\x44\x7d\x0f\x0b\xab\x98\xdc\x71\x08\x24\x02\xe3\xdb\x3a\x74\x64\x38\x65\x6e\x56\xab\xd1\xdb\x04\x50\x0b\xc8\x9a\xa5\x65\x73\xde\xd3\xcc\xc4\x63\x88\xa4\x31\x6e\xc1\x6a\x11\x99\xe5\x45\xbb\x1c\x4d\x64\x2e\x02\xd7\x21\xf8\x0e\x5f\xf7\x9a\x8c\x89\x07\xae\x1b\xc5\xb1\x41\xe9\x5a\xbe\x5f\xcd\x24\x6c\xb8\x7e\x27\x20\xf3\x3c\x70\x3d\xc5\x65\x63\xf5\xe6\xa7\x47\x41\xe0\x85\x2e\x82\x99\x0e\xe7\x74\xbc\x09\x06\x9e\x48\x30\xcf\x23\x01\x1e\x8b\x72\x56\xd6\x3f\x8b\xf2\x63\x61\xdd\x1d\x4b\xdf\xc5\x03\xdf\x53\xba\x95\xaa\xd1\x8a\xbe\x5b\x26\xc8\x78\x74\x55\xdf\x8f\x84\xb0\x2a\xc6\xb3\x3c\x2f\x9a\x9c\xdf\x02\xc9\x4c\x6f\xe9\xe3\xd7\x47\x09\xe7\x9f\x69\x2e\x8a\x2f\x6f\x68\xfb\x05\xc4\x0f\x10\xac\x9d\xa5\x12\x34\xc8\xb0\xf7\x96\x4c\x27\x01\xb8\x6f\x0f\x90\x20\x77\x63\x83\xc3\x7b\x20\x10\x0a\x13\x71\xa3\xf9\x27\xed\x53\x76\xf1\x20\x74\x00\x11\xeb\xb8\x02\x77\xf4\x65\x3c\x08\x49\x88\x01\x71\x2a\x44\x7b\x3f\x5f\xbd\xa1\x3d\xfc\xf8\x61\x48\x11\x4f\xac\xa5\x64\x87\x8d\x91\x07\xe8\x50\x1f\xd2\xea\xb1\x41\xf4\xe5\xf0\xe6\x22\xa2\xac\x53\xd4\x1d\xab\x8b\x2f\x28\x0f\x29\x4e\x52\xd3\x1e\xf9\x28\x30\xa5\xe7\x1f\xfd\x80\xb1\xcc\x12\x0f\x22\x29\x24\xb1\x98\xf4\x1b\xd6\x2b\x3b\xfe\x75\xf7\xd8\xa1\x7e\x60\x8b\xec\x67\xb9\xd0\x50\x46\x73\xc9\xd8\xf5\x13\x55\xb0\x4e\xcf\xba\x8c\x74\xf4\x50\x34\xf2\x31\xe6\xdd\xa5\x14\x74\xf6\xa1\x27\x7d\xc9\x03\x2a\x95\xc4\x6e\x5a\x59\xfe\xec\x17\x95\xd0\x30\x3d\x98\xcf\x90\xe5\xc3\x60\xd7\x7a\x95\xaf\x3c\xe0\xb1\xaa\x9b\x37\xc4\x4f\x8a\x31\x6a\x87\xc4\xc3\xb3\x2c\x53\xa0\x31\xd3\x37\x11\xb8\x04\xcd\x21\x13\x90\xf7\x33\x0b\xa6\x83\xde\x75\x2a\x8b\x0f\x7f\x04\x50\xe3\x51\x85\x85\xd2\xfc\xd8\x67\x2f\xd3\x87\x09\x47\x95\xa7\xfd\xde\xd0\x6f\xd2\xe8\x3c\x10\xa1\xad\xae\x45\x27\xaa\x7a\xcf\xeb\x34\x6b\x47\xf3\x78\xb0\x40\xe0\xe1\x36\xbc\xa0\xb9\xb8\xb6\x5b\xc7\xaa\x5a\x5f\xec\xee\x18\xc8\xc0\xf3\x89\x96\x99\x57\x0a\x0d\x69\x85\x13\x61\xdb\xfe\x6b\x7b\x51\x8e\x91\xdc\xb4\x5a\xf1\x02\xb9\xb8\xd0\xe9\x52\xad\xa1\xe3\x24\x8a\x60\x22\x85\x2f\xc5\x45\xd9\xfe\xab\xf0\x5f\x48\x8d\xd6\xab\x1c\xef\xcc\xc0\xd0\xa1\x0e\xfa\x60\xaf\xf4\xb2\xef\xd6\x87\xd0\x75\x14\xc4\xa4\x82\x7a\x99\xa1\x2a\xde\x2b\x88\xb4\x13\xc7\xe2\xa1\xeb\x45\x4a\x0b\xd2\xd0\xbd\xcf\xc1\xe0\x0a\x79\xe8\x25\x1e\xba\xc5\x34\xcb\xd6\x17\x28\xfb\x85\x8d\x3c\xf4\x24\xc5\x52\x01\x5a\x55\x50\x8f\xc9\xba\xda\x66\x89\x8c\x36\x02\x32\x18\x32\xa9\xea\x0e\x7e\x1c\x2b\xe6\x40\x2c\x83\x53\xd9\xaa\xea\x19\x32\xfb\x2a\x7c\xe6\x63\x71\xf0\x19\xce\x45\xa9\x72\xc3\xc3\x2f\x1c\x12\x2f\x51\x62\xe0\x8a\xd0\x0b\xd9\x37\x8d\xe5\x7b\x03\x26\xb5\xc7\x48\x0d\xea\xc9\x3b\xaa\xb1\xe9\x91\x11\x12\xa6\x89\xd5\x5b\xa7\xf7\xe1\xbd\xb5\x2d\xcc\xcd\x85\x24\x42\x1b\x5e\x29\x1a\x1c\x2e\x50\x1e\xfa\x4e\x64\x18\x52\x05\x9d\x9f\x67\xe9\x9f\x7f\x5a\xb6\x39\x1e\x46\x31\x0f\x49\xa7\xd7\xd3\xfd\x4e\x63\x53\xc1\xbd\xaa\xe1\x5c\x4d\xe1\x5b\x78\x18\x13\xa5\x92\x82\x22\x68\x3f\x8a\x1a\xde\x8a\x05\xad\x4e\xf3\x01\xa5\x66\xdb\x4d\xe2\x06\x72\x29\x2a\x5d\xf4\x3c\x82\x76\x8d\x99\x5f\x87\xbf\xf6\x8d\xdc\x30\x96\x5c\x90\xbe\x3a\x9a\x02\xdd\x8d\xa3\x9b\xc3\xfb\x4c\x20\x54\xfa\x19\x18\x88\x9e\x8f\x27\x52\x98\x80\xc0\x39\x30\x87\xb2\xbc\xbe\x74\x09\x9d\x90\x3a\x2e\x56\x41\xf0\xa6\x2e\xa4\xec\x51\xaf\xf0\x90\x79\x5c\x15\x00\x9e\x80\x7f\xa8\xf5\xe4\xa5\xa8\xaa\x5d\x9a\x73\x58\x69\x42\x47\xb5\x0f\xda\x23\xa2\x48\xbb\xeb\xe7\x34\x3f\xa4\xd5\x86\x5e\x31\x26\xde\xe5\x12\x42\xee\xba\x98\xc1\xa5\x4d\x5d\xec\x81\x96\x0f\xc5\x57\xde\xfa\x2b\x03\x9a\x53\x1e\x82\x1f\x23\x48\xf0\x5c\x88\x54\x5e\xdf\xe0\x57\xbd\x29\xe1\x9c\x36\x67\x9b\x2b\x1a\xed\xb4\x21\x10\x0a\x03\xc9\x40\x7c\x0f\x39\xc8\x94\xa7\xd4\x7a\x0b\x21\x44\x41\xa2\x9c\xae\x59\xc5\xd3\x54\xe1\x68\x46\x2f\x0b\xe2\x28\x51\xc9\xdd\xba\x5d\xe9\xaa\xdd\x57\x5a\xf3\x93\xf2\x47\x4c\x17\x11\x62\x8c\x46\x7d\xb9\x7d\x81\xe4\xbb\xc1\xc0\x5b\x09\xa5\xeb\x32\x2b\x92\x64\xca\x41\x4d\x9b\x9f\x68\x4e\xab\xfa\x25\xe5\x90\x57\xe8\x49\x55\x66\xcf\x9c\x34\xa5\x43\x49\x3d\x5f\x3b\xda\x3b\x55\x71\xdd\xee\xc0\xe5\x99\x0e\x52\x7f\x7d\xaf\x2a\x94\x34\x26\x18\x33\xa5\x4d\xd5\x4b\x4f\x44\x4e\x14\xe1\x3e\xae\x60\x9d\x8f\x30\x0c\xe3\x76\x25\x79\x3c\x72\x58\x84\x19\x3f\x38\xa7\x35\x6a\x7b\x5c\x51\x1f\xae\x99\x4a\x37\x9a\x43\x84\x1a\x8c\x4d\xde\x49\x7e\xf3\xc8\x75\x54\xdd\x36\x6f\xdd\xc5\xd5\xad\xb4\x2a\x8f\x5c\x11\x60\xc0\x66\xc5\x8b\xc1\x98\x37\xcd\x10\x2a\x4e\xa3\x92\xde\x53\x74\x6f\x3b\x71\x9c\xb0\x07\x55\xd8\xdc\x1b\xcf\x91\x27\x85\xe4\x06\xbd\xa5\x78\xfe\xc7\x97\xf0\x03\x90\xda\x65\xc5\x44\x98\xca\x63\x9b\x13\x04\x11\x40\x17\xb7\xc6\x0a\x98\xd1\xf1\xa1\xe7\x21\xc0\xb4\xfe\x55\x94\xe9\xd1\xee\xce\x51\x18\xa9\x00\x84\x9a\x18\xb4\x5f\x27\xcf\xa3\x50\x04\xc8\xfb\xfc\x67\x9a\xd7\x07\xbd\x8a\xee\x0b\x3d\x32\x07\x4b\x78\x14\x33\x8a\xa6\xc4\xac\x64\xfb\x02\x0d\xfe\xe7\x1b\xa9\xfc\xb6\x97\x14\x5c\xbb\x5c\xad\x89\x3a\xf2\x49\xa3\xc4\x8d\xd5\x3a\x5f\xa4\x56\x81\xd6\xdc\x4c\xe2\x79\x91\x72\x38\xc5\xb8\x18\x91\x47\x09\x05\x2c\xa7\x6a\x57\x25\xa5\xf5\x31\xc8\xfa\x44\x34\x24\xb8\xb7\xa5\x95\xdd\xbd\x54\x44\x68\xf4\x18\x34\x0e\x82\xc4\x46\xc5\x9f\x52\x39\x1e\x09\xcc\x51\xf8\xfa\x4d\xc1\x3f\x74\xe6\xd7\x5c\x83\xd1\x20\x34\xae\xa7\x36\x6f\x55\x96\x50\x8d\xfb\xd1\x50\xe4\x44\xf1\xf1\xeb\x12\x0e\x1b\x78\x1f\x5d\x8f\x73\x57\xaa\x7c\x2e\x94\x47\xc8\xf9\x75\x59\x9f\x1e\x4a\x3a\xf6\xe6\x23\xce\x01\x09\xb7\xa8\xf2\x99\x5e\x53\x55\xde\x69\x23\x8a\xba\x1b\x38\x21\x02\x7d\xdb\x0d\x67\x49\xcb\xec\x8a\x20\x08\xd7\x36\x73\x0f\x61\x48\x07\xd9\x64\x32\xcd\xcc\x5e\xfc\x97\x95\x89\xc3\x47\x03\x88\xd1\x16\x9e\x7b\x2f\x94\x1d\x54\xad\x69\xd6\x8c\xd6\x8c\x08\x20\x21\x61\xb7\x96\x4d\x67\xd6\x62\x27\xf6\xd0\x08\xda\xa4\x73\xa8\xe9\xe0\xa3\x22\x4b\x22\xf2\x81\x4d\x3a\x13\xd3\xe7\xf3\x23\x15\x1f\x68\xa7\x5a\x6b\x22\xdc\xe9\x25\x22\xcc\x73\x1d\x0b\x59\x94\x16\xde\x14\x13\x26\xa9\x2a\x3b\xc9\xa1\xec\x17\x1a\xf5\x42\x7a\x31\x11\x01\x02\x82\x71\xd3\x1e\x8a\x55\xf3\x98\x80\xef\x1a\x67\x64\x44\x03\x39\xf6\x7e\x4c\x00\x39\x0e\x88\x2a\x81\x4b\xab\x15\xde\x23\x26\xd8\x57\x79\x48\x7e\x1b\xdc\x73\x40\x04\x82\x19\x67\xef\xfb\xe7\xc3\x76\xf9\xba\xfe\xb1\x5c\xff\x7c\x33\xea\xb0\x3c\x0e\x12\xc5\x17\xa1\xa3\x64\xaa\x0a\xe5\x95\xde\xaf\xee\x1f\xbe\x92\x40\xc6\x88\x33\x2f\x34\xe1\xce\x41\x85\xba\xa6\xcc\x85\xd1\x91\xa1\xe3\xab\x92\xca\x76\xb7\xd6\xfb\x47\x6b\x3f\xad\xf3\x91\x3f\x12\x87\x3a\x67\x6f\x76\xca\xb7\x62\x40\x9b\x7d\xe7\xce\xc2\xd8\x8b\xfb\xdc\x79\xfb\x76\xfb\x3e\xef\x6a\xb8\x8c\x16\xc1\x38\x14\x0e\x92\x12\xd8\x4a\xfc\x69\x58\x44\x1c\x8a\x24\x06\x1d\x68\xef\x85\x3d\xe3\x10\x7c\x46\x7a\x60\xe6\xd6\x65\x2a\xca\xc1\xde\x1a\x47\x7e\x14\xba\x56\x3f\xb9\xa4\xc7\xce\x4e\x8e\x23\x0a\xc8\xbc\xaa\x82\x7a\x87\x0a\xb2\xec\x90\x8d\x45\x48\x79\x1c\x31\xea\x7a\x86\x9b\xae\x6e\x32\x9a\x96\x70\x58\x14\xe7\x4b\x0d\x07\x93\x6b\x8d\x63\xcf\x47\x6c\xd9\x67\x51\xd3\x43\x93\x1f\xb8\xd6\x70\x29\x46\x27\x8b\x23\x1f\x0d\x77\x1d\xe6\xbb\x07\xdd\xf9\x2e\xf5\x12\xc7\xb1\x8f\xd3\xe1\x47\x81\x85\x27\xe9\xf1\x54\x57\x66\x64\xdf\x71\xa5\xe2\x58\x52\x4d\xca\x2c\x6c\xd4\x04\xc4\x0d\x3b\x29\x8f\x13\x27\x08\x54\xb5\xeb\xa6\x75\x9b\xbd\xd1\xfd\x27\x09\xc5\x6d\x73\x01\x7c\x61\x45\x72\x79\x9c\x68\xf3\x61\x71\x2a\x8b\xbc\xa8\x14\xd4\x45\xc3\x29\x4c\x1f\xca\x88\x97\xf4\x32\x5b\xaf\x30\x16\xfc\xe3\x31\xe5\x80\xa9\x5b\x1c\x0f\xaa\x9c\x43\x2f\xd7\x13\x70\xab\xff\x1a\x1d\x2b\x3d\x8c\xd1\x56\xa8\x9d\x78\xe7\x3d\x30\x8f\x8a\x01\x24\x55\xaf\xa9\x4f\xc5\x2d\x05\xc7\xf8\xd0\x98\xe1\x3a\xaa\x16\x8b\x12\x44\x5a\x83\x30\xf6\xed\x6f\xd3\x81\x7c\xcb\xec\x7d\xef\x9c\x5c\x20\xe9\x82\xf6\x93\xd2\x1b\x78\xe6\x98\xc4\xe2\xde\x79\x20\xc4\x1a\xf7\xf5\x9b\xc1\x51\xc6\xdc\x21\x48\x7c\x80\x0a\x04\x9d\x93\x38\xbb\x83\x7a\x8a\xb9\x17\x63\xae\x28\x2b\xa8\x78\x83\x2f\xa5\xcb\x67\xe9\x4b\xec\xf2\xc7\xe3\x04\xa3\x81\x26\xf3\x8c\xe6\xe8\x77\x01\xb5\x98\x53\x07\xa8\xa6\xd1\xca\xd3\xea\x64\x6f\x90\x29\xe9\xb5\x4a\x81\x66\x2c\xb4\x32\x16\x32\x4c\x14\x9a\x11\x6d\x57\xc3\x46\xa0\xb4\xf7\xc5\xe4\x2a\x0f\x3e\x68\xed\x33\x5e\xe4\xa2\xa7\x3f\xbd\xa5\x35\x3c\x40\x5e\x9c\xd3\xbc\xe7\x5c\xc7\x20\x88\x92\xd0\xae\x8b\x6f\xe5\xb3\x4d\x77\xf0\x80\x9b\x35\xf3\x67\x3a\x5d\xcb\xc1\x63\xe9\x32\x0c\xfa\x55\x05\x4f\x69\xb6\x42\xf2\xef\xfa\xba\x96\xc8\xc1\xd3\x31\xc2\x4c\x1e\x9c\x38\x21\xa3\x9e\x2d\xad\xd6\xba\x2d\xbf\x99\x46\xce\x99\x2e\x44\x6b\x7d\x1c\x04\xde\xcc\xaf\x03\xe2\xae\xe1\x2d\x27\xae\xef\xe1\x8c\x6c\x2a\x28\xab\x49\x70\x6e\xe2\x06\x14\xad\x34\x8c\x13\x74\x35\x41\xba\xd5\xa3\x1e\xd3\xa4\x9f\x1d\x4c\x76\x24\x9c\xc1\x13\x8f\x3b\xf8\xc8\x07\x2a\xc4\x86\x5e\xf7\x56\x97\x6e\xa8\x39\xf7\x7f\xf9\x63\xce\x0c\x01\x12\x61\xa9\xc8\xcf\x85\x72\x3d\xcc\xec\x95\x25\x4b\x12\x5b\x2d\x30\x56\xf3\xe6\x09\x89\x1d\x5f\xc1\x56\xf3\xe3\x1e\xca\x33\x6b\xc4\x11\x54\xa4\x78\x98\x4e\x4c\x08\xf5\xfc\xc0\x46\x0c\xfa\xf4\xba\xbb\x0b\xb5\xd7\x0b\xa8\xe2\xa9\xa1\x42\xac\x6a\x38\x0f\x2d\xd5\x24\x74\x02\x2c\xb9\xb0\x49\x2f\x6e\xb9\xf0\xcc\x09\x42\x37\x41\x8c\xf7\xe3\x62\xbd\x7a\x73\x1d\x3f\x9c\xc4\x93\x4e\xed\xd9\x49\xc8\x00\x51\x52\xaa\x40\x21\x55\x15\xf7\xc3\x32\xbc\x71\x38\x25\x89\xc3\x18\x29\x55\x35\xaf\xe5\x2c\xc7\xea\xd5\x91\xf7\xd7\x9f\x44\x49\xcc\x14\xe3\xd6\x4f\xc8\x78\x71\x86\xd7\xea\x38\xd8\x4b\x93\x24\x00\x8c\x3a\x63\xdc\xd6\xbc\xa6\x27\x54\x88\x34\xcf\x48\x1d\x9a\x18\x64\x68\x99\xf2\x34\x3f\xa2\x73\xd4\xae\x3a\xa6\x47\x1c\x0a\x2d\x96\xb7\xa0\x65\x9e\xde\xf2\x22\x98\x8e\x92\xb9\x3a\xd2\x5f\x3e\x52\x56\x6a\x5c\x74\x97\x03\x49\x98\x1b\x22\x49\xeb\xe3\xfb\xfe\x75\xbd\x37\x0b\x5f\xc2\x1d\x89\xb1\x61\x15\x12\x30\xf7\xd9\x0e\x4c\x04\xa9\xd9\xe5\xc3\xba\xae\x09\x17\x8a\x4d\xc7\xf2\x9e\x4c\x84\x5b\x12\x11\x26\x18\x19\x31\x76\xcd\xc3\x47\x36\xa0\xc3\xe2\x09\x50\x17\x47\x6c\x0e\xbf\xea\xdd\x07\x02\x01\x74\x8b\x74\x12\x0c\x7a\xab\xa8\xcb\xbe\x98\x88\x20\x25\x92\x48\xac\x08\x4a\xab\xae\x8c\x7c\xf8\x46\x64\x18\x61\x9c\x05\xce\x54\xe1\x61\xed\x08\x96\x89\x44\x87\x13\x03\x5d\xbd\x0a\x80\x44\x72\x81\xb9\x7d\x44\x91\xd9\xe5\x8f\x3a\x9e\x87\x98\x5b\xad\xd1\x37\xa6\xcf\xe4\xd4\xe1\xb1\x0e\x66\x4b\x28\x4b\x28\xd1\xcd\x5e\xd8\xfa\x8e\xc1\x7d\x51\x47\x28\xcf\x1f\xa1\x20\xe6\x7d\xbb\xf7\x06\x26\x75\xbd\x10\x7d\x67\xc8\x45\xdd\x39\xcd\xd4\x0d\x5c\x2c\x24\xa9\xd2\x63\x6e\x7f\x0b\x29\x92\x16\x20\x44\xad\x07\x74\x9e\x9a\x24\xd4\xa5\x14\x6b\x41\x35\x2d\x68\xbb\x31\xa1\xbd\xba\xe9\x56\x5e\xd3\x93\x45\x58\x4f\xb5\xd8\xae\x7f\x3e\x20\xf3\xe2\x72\xff\x3c\xa0\x30\xe6\xd4\xf3\x39\xa6\x46\x7e\xa7\x17\xc8\x68\x7f\xe5\xa1\x5e\xa0\xec\x2f\x95\x3c\x78\x2b\xea\x5d\x91\x89\xe1\x16\x68\x7a\x86\x31\xc6\xc7\xf7\x9c\x0f\x19\x48\x27\x06\x18\xf5\x7d\x85\xbe\xff\x57\xd1\xd4\x0d\x83\xb2\xea\x19\x58\xd4\x0f\x05\x82\x67\x32\x90\xb5\x9f\x8c\x3e\x80\x1f\xfb\x08\xff\xc7\x2a\x8b\xa5\x85\x65\xd0\x20\x51\xa8\x2e\x75\xa3\x9d\x3c\xf1\x9e\x7e\x8c\x87\x1f\x0d\x68\xe8\x75\x55\xbe\x07\x99\xd1\xe3\xe8\x2a\x01\xa8\xca\xf1\x12\x2e\xd9\x75\x96\x8d\x39\x23\xdb\x0e\xa1\x17\xf6\xf0\xaa\xda\x74\xfb\x77\xac\x6d\x07\x1a\x3a\x02\xbd\xf5\x4f\x45\x4d\x81\x1b\xa4\xb9\xd7\x50\x28\x31\x10\x04\x87\x28\x94\x70\xaf\xa2\x55\x77\x8a\x42\xc7\xf1\x7b\xfb\x70\x6e\x2f\x62\x3a\xc4\x2e\x12\xee\x49\x45\xd8\x69\xf6\x4f\x1a\xf3\x10\xab\x05\x0d\x7b\x4e\x2f\x96\x4e\x63\xce\x84\x46\xe2\xc0\xe6\x64\x52\x44\x34\xe1\x8a\x8b\x7c\xa4\xd3\x39\x6d\xe4\x50\x2a\x59\x40\x3a\x3d\x6d\xe4\x69\xef\x63\xf1\x28\x73\x1c\x01\xa6\xa4\x78\x30\xd7\x58\xc8\x43\xc3\x3b\xb2\x4f\x27\xb7\xcf\xd8\xfc\xcf\xf0\x75\x70\xa6\x38\xa9\x9e\x30\x50\x25\xd3\x7a\x49\xcb\x1c\xc4\xfc\xaa\xdd\xc9\xd1\xdb\xe3\x5a\x52\xa8\xa6\x1f\xd0\x7d\xa0\xbb\x56\x0f\x15\x09\xc1\x48\x79\x45\xb3\x4f\x7a\x04\x65\xbd\xd9\xc0\x38\x05\x87\x2b\xa6\x6b\x93\xdc\x5c\x55\xeb\x4f\x0b\x9d\xa6\xe0\x11\xa4\x37\x2b\x3f\x35\x58\x6e\x34\x09\x21\x54\x90\x0a\x25\x4a\x66\xd2\xa7\x06\xfa\xf1\x77\xea\x12\x7a\xa9\xe7\xde\x36\x46\x21\xa6\x86\xe7\x74\x43\xaf\xad\x39\x6b\x2f\x99\x50\x4c\xb2\xa2\x57\x3a\x86\x22\x53\x48\x38\xc2\x14\xab\x0b\xe4\xa2\x35\x79\x9e\xe8\x5f\xd4\x89\x51\x60\xb1\xb4\x76\xe1\xeb\xf5\x3d\xef\x06\x8b\x2d\xe5\x1c\x1d\x21\xa3\x50\x17\xe0\xce\x15\x03\xc3\x58\x47\x53\x77\x94\xae\x34\xe4\xaf\x4a\xb3\xa7\xfc\x67\xcf\xc3\x57\x9d\x98\xa3\x95\x12\x2a\xa8\x97\x22\xad\x47\x31\x74\xe6\x08\x70\x35\x9e\xf5\x11\x0c\xeb\xe6\x44\xb9\x00\x73\x83\x38\x24\xdd\x7e\xd0\x8f\x86\x32\x4f\x06\x1e\x0c\xf9\xb7\x5e\xa1\xa6\x82\xf6\x76\xee\xc1\x4d\xf9\x1c\x70\xcf\xd9\xaf\x96\x5b\xff\xb0\x9d\xd9\x4a\x22\x46\x88\x1b\x18\xa2\x5f\x28\x9f\xd2\x4f\xa8\x16\x3f\x17\xd3\x33\x8a\x11\xa9\x44\x49\x70\x51\x3b\xd4\xb4\x3c\xda\x2a\x18\x16\xb8\x09\x2e\x95\x07\xdc\x72\xc8\x21\xe5\x45\x45\x33\x18\x16\x14\xd9\xce\xb1\x1f\xc5\x9d\x32\x14\x6c\x8b\xa2\x1e\x5a\x6f\x2c\x8c\x42\x84\x77\xbc\xfd\x98\x0f\xc6\x04\x0b\x29\xc1\x7d\xb0\xc8\x11\xb8\xd4\x9f\xb7\x2c\x72\x29\xd2\x40\xaa\x00\x72\x83\xf2\x69\xd3\xb6\x0c\x8b\x49\x88\xc5\x48\x9b\xac\xa9\x9b\xea\xc1\xe6\xa1\x59\x1c\x28\x1d\x76\x71\xfc\x35\xb2\x6e\x58\x1c\xc6\x9e\x62\xda\x83\x95\xae\x95\x9a\x75\x8d\xd2\x43\x3a\x69\x05\x32\xb5\xaa\x4c\xc3\x90\x3c\xa3\xb1\x92\x25\xb8\x14\x17\x3e\x3a\x3b\x8b\xbd\x48\x0e\xa2\x34\x3b\xc8\x64\x3f\x88\xcb\x18\x13\x98\x27\xdc\x3d\xaf\x36\xdf\xc0\x35\x19\x13\x8a\xcf\x0b\x05\x58\xb3\x51\x32\x91\x71\xca\x68\x7b\xa7\xbb\xf4\x7c\xc9\xa0\xab\xf3\x63\x82\x05\x08\x97\xa6\x42\x2c\x4e\x4d\xfe\xe1\x6b\x3c\xc7\x4b\x6a\xb3\xa4\x0c\xc2\x08\x8b\xd0\xf7\x25\xfd\x84\x0c\xca\x8a\x53\xeb\x3f\x32\x90\x8e\x34\x02\xfd\x52\xa6\x59\x8a\x9c\xbc\xe7\x01\x7b\x14\x67\xd2\x65\x18\xbd\x59\xa4\x25\xcf\xa0\xdb\x12\x98\x74\x25\x26\x97\xdb\x1d\x35\x1c\x85\x39\x98\x24\x80\x10\x61\x85\xf7\xe9\x15\x39\xdd\x79\x07\x32\xe1\x58\x1e\xf3\x9a\xe6\x75\x17\x3b\x36\x8d\xc2\xd1\x14\x98\x75\x6b\x82\xb7\x4b\x4b\x97\x33\x8d\xff\x4d\xf4\xf6\xc8\x1d\xea\xe1\xc4\x39\x9c\x91\x02\x5b\xec\xe9\xb1\xe7\x7f\xff\xd7\xc8\x13\xe7\x0e\x53\x54\x8c\x69\xbf\x92\x69\xf0\xf2\xb9\xeb\xc7\x1a\xb6\xf4\x45\x4b\x31\xce\x53\x70\x97\x25\x9e\x2e\xd2\x2a\x0f\xbc\x38\x9f\x9b\x3c\xad\xaf\x46\x7e\xa9\xff\x0c\xdc\x73\x02\x34\x91\x15\xb5\x5c\xbb\x83\x88\x09\xa6\x7c\xd3\x39\xf2\x89\xa6\x67\x78\x4d\xf3\x57\x5a\x1e\xc7\x01\x72\xee\x87\x2e\x0d\xed\x0b\xde\xd3\xfc\x63\xb8\x24\xf1\xc0\x8f\xb0\x8e\xff\xe9\x17\x52\x44\x54\xe3\x66\x2e\x91\x17\xd5\x5a\xe3\x96\x14\xf4\xf1\x06\xdd\xce\x03\x11\xa2\x69\x4d\x4b\xfa\x35\x28\xa7\xe3\xa1\xef\xfb\x9e\x45\xb0\x2f\x8a\xe6\xd2\x25\xab\xfe\xed\x75\xc5\x82\xf1\xff\x0c\x23\x72\xff\xf6\xcc\x57\x08\xe3\x44\x71\x45\xd0\xf2\x43\x81\xcd\xab\x5d\xef\xfc\x49\x20\xb4\xca\xed\x02\xca\x3a\x95\x29\xa7\x37\x8c\xf6\x9c\x87\x5c\x79\x5e\xf3\xd9\x7c\x65\x0f\x15\x11\xa2\x22\xb7\x58\x17\x97\xe6\x47\x15\xd5\xf8\x41\x9b\x6c\x94\xb4\xe5\x51\xe0\x9b\x7a\xe7\x3d\xd0\x73\xb5\xce\x5f\x50\x95\x07\x39\x7e\xcc\xf9\xa2\xd0\x87\x08\x17\xdf\x2c\x4b\x87\x55\x36\x3c\xe2\x04\xf9\xd8\xd4\xae\x48\x33\x30\xd5\xc4\xd3\xb1\x0a\x1e\x49\x8e\x95\x8a\xab\xc5\xfa\x8e\xb3\xc2\x63\xcf\xf3\xf4\xfe\x85\xab\xa6\x3a\x63\x7e\x5c\x9c\x68\x9e\x43\x76\xd3\x3b\x0c\x4c\xef\x53\x8f\xd0\xd3\x34\xc7\x04\xd3\x62\x5f\x69\xd9\x69\xfb\x4f\x6e\x1b\x3c\x66\x24\x08\x74\x39\xe1\xa7\xb5\xfc\x1f\xcb\xe2\x6c\xa2\x18\x63\x8d\xe7\x49\x58\xb0\x3e\x5b\xe2\x31\x4f\xe9\x6c\xad\x16\xeb\xf5\x05\x72\x6b\xfe\xf0\x24\xf4\x0d\x8f\x2c\x94\x4a\x59\xf4\x37\x03\x58\xfd\xce\x6a\x31\x01\x0e\x9e\x70\xa5\x6a\xa2\x0a\xb6\x3a\x55\x8e\xe1\xab\xa6\x6e\x94\x68\x76\x00\x5c\x5d\xc7\x26\xdb\x58\xc7\x95\xb7\xae\x0b\xda\xc0\xed\x4c\xcf\x3a\x83\x8b\xd3\x80\x83\x21\x5d\xca\x8f\x69\x0e\x13\xae\x30\xa7\xa1\x2a\xc3\x53\xd8\x0f\xac\x79\xfb\xa9\x68\x07\xba\xf3\x44\x01\xda\xd2\xbb\xba\xb9\xa4\xa2\xe7\xa4\x70\x4a\x7d\x48\xba\xc4\x29\x94\xb5\xc6\x4a\x0c\x9e\x9b\xb9\x0c\xb3\xd3\x1d\xe8\xec\xce\xa7\x64\x42\x69\xd4\x55\xbd\xdd\x6d\x32\xc1\x31\xe1\x4d\x71\x4e\x02\xdc\xbd\x2e\x4d\x75\x9a\x5f\xeb\x51\x66\x91\xf3\xc4\x41\x6a\x02\xac\x6f\xea\xfc\xc0\x9d\x29\x71\xe2\x1c\x02\x34\xad\x14\x49\xe6\xd3\x48\xae\x98\x73\xe1\x24\x98\xbc\x80\x5f\x75\x49\x1f\x68\x4d\x5d\xcc\xb2\xb6\xfb\xd3\xdf\xbe\x47\x91\x28\x9f\x4b\x79\xd9\x34\x7b\xa5\x39\x3d\x5a\x0b\x9a\x0b\xc6\x3d\x1d\x97\x3a\x43\x7d\x82\xa6\xfa\x51\x34\xfc\x04\x65\x85\x80\x51\x3b\x12\x05\x10\x26\x7a\x6b\xe1\x2c\xcb\x6e\x05\x8b\x74\x5f\x70\x38\xa6\xc3\xa0\x3e\x1d\xea\xe2\xd0\x54\xf6\x2c\x40\x54\x49\xd1\x41\x05\x20\xdf\x0a\xab\xe1\x60\x3a\x44\x81\x6f\xdd\xfc\x99\x10\xf7\x58\x84\x38\x87\xd8\xa5\xb4\x87\xdb\xc2\xb7\x32\xf8\xb4\xd2\x0d\x71\xd5\x5c\xd0\xea\x84\xe4\x0c\xf6\x06\xa5\x17\x61\x24\x77\x43\xeb\x32\xe5\x1f\xcf\xcd\x35\x3f\x0d\x76\x22\x19\x0b\x0c\x1b\x3f\xff\x98\xbd\xd8\xdf\x78\x80\x3b\xe7\x23\x40\xb5\x05\x0e\xe9\xe7\x3d\xe8\xa4\x70\x48\x08\xcc\x14\xa2\xbe\x42\xeb\x0e\x9a\x6b\x0b\x47\x87\x20\xfe\x7b\xf9\xb6\xde\x61\x3e\xd6\x2e\x36\xb6\x87\x87\x05\xa8\x19\xad\xd4\xa3\x1d\xa4\xdf\x3e\xdd\x41\x5f\xc4\xf4\x73\xdd\xb8\x2f\xc9\x34\x13\x9f\x69\x55\xdc\xc1\x1d\x0b\x97\x51\xa6\x42\x62\xe8\xb5\x19\x96\x2f\x2e\x3c\xdf\xc7\xb2\xd2\xfa\x44\xbf\x26\x91\x1e\xc2\xf7\x69\xa0\xab\x35\x0d\x33\xa9\x69\x91\x02\x4d\xe4\x79\x53\xe6\x53\x25\x64\x82\x10\x07\x6d\xfe\xf7\xb7\xe7\xc5\x37\x91\x48\xdd\x3b\xf0\x55\x09\x2b\x15\x62\x29\x1a\xbd\x89\x0d\x7a\x84\xbe\x82\x64\x35\x79\x05\x59\x86\xb5\x55\xe6\x5e\x42\x22\x43\xbb\xbd\xb4\x63\xf7\x09\x33\xb6\x26\x6a\x28\xa2\x58\x09\xfd\x53\x5e\x63\xb1\xc0\xf2\xd7\xa5\x28\x5b\x97\x65\x71\x6a\xcd\x7e\xb5\x03\x8e\x9e\x3c\xe6\x09\xc2\xc5\x31\x2f\x6e\xb7\x8c\x69\xc2\x28\x2e\x12\xf0\x30\x3d\xf7\xcf\x86\x96\x75\x8f\x16\x6f\xd4\x8d\xba\x4a\x23\xa2\x4e\xeb\x6c\x8c\x5a\x14\x54\x10\x64\x5a\x49\xab\x55\x5e\x5d\x80\xf7\xb2\x3e\xba\x07\x73\x3c\xcc\xf9\x0a\x9a\x66\xd7\xe7\xa2\x29\x7b\x92\xd0\x5c\xb0\x18\x80\x0f\x1d\x29\xc5\xcb\x33\x7d\x2f\x8c\x46\x98\xd2\x39\x1c\x15\x03\x53\x51\x64\x1d\xc6\x53\x70\x97\x63\xe9\x49\xa6\x84\xd4\xcc\xaf\x4c\xc9\x9f\x7f\x95\x45\x7e\xd4\xab\xc9\xba\x7c\xcf\x2b\xa8\x57\xb9\xce\x42\x98\xbe\x82\x6b\x65\x48\xb3\x0c\xd3\x5f\x50\x4d\x6c\x09\x02\x5c\x25\xa5\xf3\x05\x29\x42\x39\xb6\x34\xed\xaa\xed\x04\x08\xc5\x9f\x83\xae\x95\xd9\xdc\xef\x79\xef\xdf\x6c\xb5\x42\x7a\x4c\x23\x9d\xb2\x6c\x43\x6b\xc8\xeb\x7e\x20\xa4\x7b\x2f\xd2\x8f\x30\x2b\x7d\xa0\xfd\x2a\x8a\x71\xa7\x20\xa0\xed\x60\xdc\x1a\xe0\x38\x38\x84\x79\x8e\x09\x91\xbe\x14\xfc\xa3\x68\x6a\x15\x45\xb5\x3d\xa8\x22\x1b\xac\x6c\xb5\xa4\xfa\x7c\x83\x33\x83\xd3\x3a\xa6\xca\xf4\x39\x3c\xae\xde\x56\xbb\x67\x7b\x3c\x57\x02\x63\x95\x06\xa2\xf4\x81\xaf\xff\x76\x1d\xbd\x38\x82\x4b\x04\x32\x8e\x1e\xbe\xd2\x2c\x7b\x1c\xae\xb1\xe0\x02\xc7\xe2\xc1\x67\xc8\xb2\x02\xb7\xd6\xd1\xa4\x6c\x6e\xe8\x26\xc0\x73\x54\x31\xee\xb9\xa9\xe9\x11\x72\xef\x71\x42\x70\xdb\x74\x75\x13\xcc\x99\x48\x80\xea\x30\x7a\x30\x2f\x71\x90\x65\x48\xab\xa9\x17\x4d\x79\x67\xd7\x35\xfd\x85\x42\x86\x19\x3a\x23\xc5\x2b\xd4\xd7\x6c\x35\x3b\x3e\xf8\x11\x73\x9d\x4e\xe9\xa5\x0f\x14\x07\xbf\x5d\x88\xec\xac\x30\xca\x20\x83\x79\x05\x24\x12\x18\xd1\xb9\xd0\xab\x0a\xfa\x55\x26\x2b\xdc\xfb\x63\x15\x10\x9a\x1b\xce\x6d\x0e\x81\x27\x14\x9b\xd9\x89\x96\xa0\x69\xe0\xd1\x4d\xec\x51\xba\x40\xc0\xbd\x98\x74\xb5\xe6\x76\x8c\x43\x20\x59\xa4\xb3\x1a\xcf\x45\x59\xc1\xee\x54\x8c\x2c\x54\x08\x63\x2f\xec\x27\xb7\xe7\xd7\x97\x1e\x6f\x5f\xeb\xbd\xd9\x09\x05\x51\x2c\x4d\xa8\xf3\x01\xce\x34\x17\xe3\x93\x45\x89\x63\xe8\xc3\x70\x99\x40\x4b\xae\xe0\x1f\x8b\x89\x77\x13\x7b\x2e\xa6\x25\x98\x1a\xb2\x26\xfc\x5e\x4e\x90\xd0\xf6\x66\x1b\x24\x0e\x47\x1e\x11\xcb\x98\x6c\x36\x41\x48\x5c\x81\xc0\x4b\xcd\x3e\x52\x94\x36\xd9\x07\x89\xa7\x04\x36\xd5\xb7\x7a\x4d\xf3\x27\x5a\x3d\x16\xe5\x43\x49\xbf\x0c\x64\xc8\xbe\xf1\x84\x28\x75\x9f\x1a\xa8\x75\x38\x81\x3a\x61\xa0\x11\x1b\x6a\xbd\xc8\x8a\x0a\xc4\x4a\xaa\xbf\xb6\x57\xe0\x33\xd1\x39\x65\x27\x7a\x86\xfa\x4f\xdb\x18\x29\x3a\xaf\xb4\x9a\xd9\xfc\x07\xd0\xc4\x41\x1d\xcd\xd5\xec\x75\xd9\xaf\x13\xb7\xcd\x04\x69\xff\xd0\xa8\x45\x32\xcc\xb4\x7f\x39\x41\xb0\x98\x48\xf3\x63\xad\xf2\x76\xed\xb9\xf1\xd1\x80\x8a\x10\x8b\xc3\x17\xc5\xf9\x42\xf3\x2e\xc2\x00\x14\x02\x4c\x0c\xce\x7e\xcc\x56\x2f\xb3\xf9\xcb\xf2\x30\x5f\xbf\xbd\xef\x5c\x4d\x48\x6a\xba\x31\x97\x69\xc9\x68\xb1\x29\x61\x99\xb7\xeb\x2e\x07\x63\x81\xdc\x24\x4b\x46\x33\x57\x44\x1c\x94\xea\xfb\x71\xd2\xbe\x34\xdd\x78\x80\x7b\x8c\x82\x6b\x6a\x49\xb6\x91\x8a\x0c\x07\x00\xd7\x53\x2b\x1d\xcc\x53\xd1\x63\xe1\x00\x49\x04\xed\xf6\x28\x55\x24\xb4\x28\x2e\x57\xdb\xce\x15\x86\xa3\x5d\xa4\x17\x46\xe6\x65\x84\xb0\x05\x09\xcc\xd1\xfc\xcf\xf9\xd8\x6e\x96\x8e\xef\x53\x9d\xf5\x7f\x03\x15\x86\x9d\x34\x6d\xa4\xc3\x80\x90\x81\x9b\xa0\xf1\x00\xe3\x14\xe6\xb7\x41\x6c\xe9\x08\x45\x44\xb3\x79\x99\x99\xdc\x8e\x74\xa9\x0e\x3d\x29\xb5\x3a\x4d\x83\xa1\x1b\x3d\xe9\xe2\x76\x57\xe6\x62\x0b\xa2\xe1\x60\x73\xde\x07\xd3\xc5\xf7\x18\xb2\xf2\x6e\xe8\xb5\x68\x30\xe8\x8e\xfe\xd1\x94\xb7\x17\x9b\x43\xa4\x2b\xb5\x2f\xa3\xb2\x6d\x93\xdc\x5a\x92\x78\x5a\x08\x1b\xbd\x8e\xe7\x2b\x2b\x53\x91\xfe\x39\x70\xc5\x4d\xcf\x20\x71\x34\x23\xe4\xf3\x85\xbd\x15\x02\x50\x38\xad\xbf\xe2\x4c\xd0\x37\x8f\x62\x48\x92\x08\x86\x3e\xa8\xb2\x1d\x11\x85\x6b\xd7\x50\x73\xeb\x04\x82\xb0\x1f\x2a\x9c\x63\xb9\xb9\x79\x17\x81\x4f\xb4\xd2\xa1\x45\x79\xce\xba\x8d\x63\x70\xcb\x81\x84\x58\x85\x4a\x7e\x2d\x4e\x69\x26\xfa\xfb\x80\x0c\x03\x8a\x45\x07\x59\x71\x4c\x47\xe5\x9c\x32\x64\x01\x46\x69\x76\xfb\xd9\xf6\xc5\x1e\x00\x11\xb1\x52\x48\xbb\xc6\xe0\xff\x65\x14\xa8\x95\xed\x60\x60\x81\x2f\xc5\xb1\xbf\x5d\xc4\xff\x75\xf3\x3f\xf1\xe0\x79\xe3\xd0\x71\xc2\x81\xbe\x94\x2d\x46\x18\x7e\x82\x98\xba\x18\x83\x5a\x2c\xb6\x7d\x0f\x45\x26\xae\xe3\xe9\x04\xc4\x63\x96\x1e\x4f\x35\xd6\x3f\x4d\x60\x1c\x64\xe2\xc6\x01\x37\xe8\x34\xc5\xba\x30\xb1\xc6\xcb\x24\x52\xd6\x4c\x5a\x6d\x74\x42\x56\x7b\x75\x93\xdb\xa5\x4c\x12\xa2\x28\xf9\x74\xd6\x74\xd8\x4a\x43\x47\x49\x3f\x7f\xf2\x65\x7d\xc2\x68\x99\x69\x89\x08\xa6\x45\x59\x73\xfd\x1d\xae\xd5\x64\x74\x5f\x52\x1e\x82\x29\x63\x1a\xc4\xca\x25\x63\x8a\x75\x0f\xab\x9e\xb4\x0a\x54\x6f\xcb\x91\x4c\x38\x86\x3e\xe1\x0d\xbe\x54\x8e\xe1\x0e\xfc\xcd\x8e\x4f\xee\x4a\xd2\xad\x47\x7d\x00\xf0\x74\x85\x84\x39\x8c\x78\x8a\xe4\x3a\xa3\xfc\xa3\x35\x91\x37\xb4\xac\x6f\x38\x71\x7a\x7b\xb2\x14\xae\x83\xcb\x92\x25\x1a\x7f\xed\xa0\xc4\x52\xf8\x8e\xa3\xd5\x60\xef\x44\x5a\xa5\xf0\x03\x74\x5b\xe1\x7c\xc9\x8a\x2b\xc0\xab\xaa\x22\xa9\xf6\xc5\x1b\x7c\x2d\x77\xeb\xcd\xe8\x2b\x08\x11\x21\x3a\x23\x87\x2f\xfd\xaa\x74\x03\x88\x44\xea\xf5\x71\x77\x81\x7e\xa2\x76\x10\x83\x13\x8e\x43\x5c\xae\x43\x66\xb3\x33\xa3\x55\x45\x45\xcf\xc3\xb4\x8f\x26\x1c\x87\xa9\xdd\xef\xd0\x81\xcc\xee\x84\xbe\xf4\x01\xae\x43\x70\xeb\xd6\x7a\x30\x69\x59\xd5\x0f\x0d\x64\xee\x6f\xa3\x6e\x44\x71\x50\x43\xe2\x0f\x73\x17\xc2\x71\x83\x10\x3f\x5b\x96\xd6\x08\xcd\x84\xbc\x5e\xfe\x4a\xab\x7a\xa8\x86\x25\x1c\x37\x51\x55\x92\x47\xa8\x0f\x88\x42\x3a\xa4\xed\x54\x19\x76\xf2\xdc\x10\xa7\xd3\x7c\x3f\xef\x4d\x33\xe1\x78\x34\x40\xb7\xb9\x82\xfa\xa9\x30\x39\xd5\xe1\x2d\xfa\x7e\x40\xb5\x21\xf5\x56\x8c\x79\x55\x85\xe3\x73\x82\xb1\x80\xfc\x17\xdf\x40\x39\xe7\x57\x73\x6a\xe2\xa8\x44\xa1\xd6\x02\x52\xe5\xbe\xb8\x0a\xab\xe2\x8e\x3e\xa2\xcf\x1c\xe2\x51\x4c\xa8\x6c\x8a\xfc\xcf\x74\x0b\x9f\xba\xf2\x61\x6e\x2b\x93\x84\x43\x82\x08\xf9\x0f\x54\xe5\xde\x57\x3b\x89\xe7\xcd\xd5\xaa\xe0\xfe\x4c\xeb\x53\xd1\xd4\x3f\xa0\x9c\x0e\x13\x0b\x87\x08\x07\x75\xae\x8e\x0a\xb4\x66\x24\x59\x0a\xfb\x4a\x88\x8c\xd1\xc9\x79\x58\xfe\x18\xc0\x19\x84\x13\xba\x51\x44\x2d\x41\x06\x46\x99\x86\xe7\x0e\x3d\x55\xdf\xb3\x4b\xdb\x79\xb4\x68\x67\xa7\xb1\xe5\x4d\x8f\x48\x10\xae\x35\xc0\xca\xee\x57\xea\xa2\xd0\xd5\xec\xe5\x71\x66\x7f\x93\xc2\x10\xb9\xa2\xc7\x68\x83\xf3\x8b\xc6\x0e\x91\x28\x52\xec\xde\x2f\xb8\x6b\x99\x1f\x99\x44\x9c\x8c\xf2\x41\x9e\x69\xc9\x8a\xd2\xd2\xaf\xe9\x3e\x71\x94\x10\xc5\xd6\x51\xcd\x9b\xeb\x5b\xf1\xd5\x31\xce\x74\x5f\x23\x16\x04\x8d\xd8\x3e\x31\xc9\x0d\xf7\x9f\x70\x92\xd8\xc7\x02\x1e\x45\xa0\x74\xb8\x34\xa3\xd5\x52\x38\x34\x8e\x9d\x44\x33\x76\xcf\x84\x68\x77\x48\x63\x2d\x09\x87\xb9\x04\x77\xcf\x07\xf8\x2c\xea\x1a\x06\xa3\x93\x45\x22\xf0\x7b\x0e\x01\x0a\xeb\xdf\x0d\xa9\x0b\x87\x73\x17\xb9\xe1\x5f\x0b\x2c\x17\x30\xf0\xf9\x09\x89\x84\xd1\xc0\x13\x24\xc6\x54\x15\xa6\x21\x57\xbc\x70\xef\x65\xf5\xff\xbf\xfe\x35\xd7\x4b\xb8\xe1\xc4\x5f\x68\xd7\x4f\x60\x01\x7a\x3b\x35\xd2\xaa\x4e\xb9\x7d\x3f\x22\x51\x42\x43\x9a\xcf\x4e\x33\xab\x54\xb8\xb9\x0c\xe7\xb8\xa0\x9c\xc6\x7d\x79\x8f\x40\xcb\x7b\x04\xff\x35\xf8\x6b\x0f\x80\x30\xf4\x43\xf3\xe5\xf6\x05\xda\x52\x7a\x56\x99\xab\xcb\x40\x29\x17\x97\xed\x16\xec\x07\xa3\x11\x22\xa5\x62\x9b\xc5\xdd\x6a\xb9\xde\xf1\x8c\x56\x95\xe1\x9c\x15\xae\xe3\x83\x20\x83\x32\xe5\xe7\xd5\x62\xca\x50\x15\xae\x23\x88\xd0\x8b\xd8\x22\xad\xaf\xaa\x90\xc5\x24\xd1\xa6\xd9\xda\x84\xeb\x86\x2e\xd6\xf2\x08\x48\xeb\xeb\x00\x47\x26\x5c\x37\x66\xac\xff\xda\x28\xa6\x96\x91\x88\xca\xf4\x90\x0a\xea\x54\x9f\xca\xe2\xab\xfa\x79\x02\xab\x1f\x92\xe6\x47\xad\xdb\xa9\x2c\x84\x39\xc8\xa2\x84\x45\x96\x4a\x39\xba\x6d\xcf\xa7\x58\x7b\xd2\x54\x46\x54\x62\xa8\x20\x20\x5c\x2f\xf4\x94\xb4\x2f\xcd\xf8\x2c\x17\x4f\x26\xad\xd5\xb6\x28\x4a\x80\x34\x17\x0b\x93\x36\x7c\xe8\x2b\x14\x09\xd7\xf7\x08\x46\x32\x58\x73\xdd\x60\x06\xbb\xef\x65\x0a\xd7\xf7\x95\x84\xcd\xef\xff\x5a\x1c\xf6\xcf\xdb\xe5\xee\x79\xfd\xf2\x60\x1b\x43\x21\x54\x25\x49\x9a\x65\xa9\x61\x38\x34\x8d\x09\x71\xa3\xae\x4e\x13\x37\xd8\x37\xf8\xea\x80\x14\xa3\xcd\xc8\xf5\xb9\x8b\x81\xce\x03\x2f\xce\x97\x06\x11\xdf\x4a\x22\x7f\x72\x22\xba\x84\x40\x38\xca\x80\xf4\xed\x1c\xe1\x86\x4e\x8c\x4c\x1d\xff\x2a\x9a\x97\x62\x90\x26\x15\x6e\xe8\x71\x8c\xba\x22\x0e\xa4\xa9\x6e\x6b\x25\x3a\x83\x48\xb8\x91\xeb\x11\xbd\x4c\xbe\xe7\x69\x5d\x75\xcc\x43\xdf\xc2\x4e\x84\x1b\x89\x24\x08\x0d\x96\x68\x7b\xcb\x3b\x29\xdc\x84\xb8\x5a\x33\xa9\xfe\x07\xe5\x1f\x97\xa2\xfe\xb6\x1a\xe7\xaf\x34\xce\xf4\x59\xa9\xaf\xa4\x70\x14\x73\xe9\xb9\x28\xeb\x14\xec\x17\xa5\x21\x89\x22\x5b\xaf\xbf\xec\xd3\x8d\xf4\xbc\xda\xc1\x5d\xd2\x50\x95\x81\xbe\x80\x38\xde\xd7\xc8\xd7\x9d\x99\xb6\xe9\x20\xe7\xed\xee\xa0\xb9\x79\x7e\x1b\x75\xa2\x0c\x44\x27\x0c\x50\x8d\x9a\x79\x10\x52\x9b\xc5\xde\xff\xfa\x51\x64\xcd\xd9\x4e\x3b\x0e\x22\xf6\x0c\xe0\x64\x5e\xfc\x72\x4d\x83\x88\x08\x51\x00\xf6\x0d\xad\xec\xf3\x0a\xcd\x22\xa6\x76\xa7\x91\xda\xe7\x68\x4c\x89\x44\x02\xeb\xe8\x43\xb6\xb3\xd1\x5c\x04\x27\x70\x43\x1b\x7a\xfc\xde\x3c\x73\xa5\xe3\xa0\xcc\xdd\x1b\xfc\xc2\x8a\xe4\x95\x9d\x37\xd2\x71\x8c\x9a\xc6\x03\xad\xe9\xc1\x8d\x6d\x0b\xf3\xd1\xf5\xba\x95\x8a\xe8\x0c\x45\x57\x0a\xc0\xd0\x26\xfc\xaa\x21\x17\x96\x52\x65\xf2\x73\x78\x8e\x27\x3c\x62\xfc\xf8\x5f\xf5\x2d\xa2\x55\x78\x8e\x64\xe8\xf3\x16\x5f\x39\x08\x55\xa8\x39\xec\xe0\x06\x01\xe2\x93\x54\xb2\x60\xfa\x3a\x6e\x24\x70\x92\xcc\xf2\x9a\xf6\x10\x91\xc2\x73\x39\xc5\xf8\xf5\x6a\xb1\x56\x62\x73\xb4\x14\x96\x4c\x57\x78\x5e\xa8\x8b\xe0\x4d\x9d\x02\x94\x9f\xcd\x80\x1f\x4f\x78\x1e\x25\x98\x11\x6d\xfd\x2a\x0c\x1a\x75\x0a\x3e\x9b\x2e\xeb\x23\x3c\x8f\x91\xb0\x63\x82\x58\x1e\x8f\xa3\x52\x76\xdd\x8d\xb8\x9e\x61\x27\x7d\x04\x68\x8d\xa4\x11\xf2\x54\x78\x84\xa8\xa2\x8c\x97\x79\xfb\x28\xff\xb0\x3f\x47\x1c\x81\x3a\xbc\xb0\x85\x82\x56\x7a\x52\x78\x51\xac\x5e\x13\x6e\x72\x36\xbd\x75\x67\xea\xda\x63\x54\x01\xe2\x25\xe5\x45\x47\xe4\x6d\x1a\x79\xcc\x05\xda\x6c\x2f\xeb\xc5\x01\x13\x9f\x4f\xcb\xb7\xe5\xd6\x24\xd4\x84\x17\x3b\x8e\x54\x2c\x74\xdd\x42\xea\xc5\x11\xe0\xa7\x48\x91\x53\x7d\xb8\x83\x7b\x71\x92\xb0\xd0\x70\xae\xd7\x0a\xdf\x32\xea\xc1\x98\xe3\xf5\x42\x20\x08\x47\x19\x4e\x50\x2f\x16\x84\xf7\x09\x49\x56\x52\x45\x88\x0c\x07\xc2\xb7\xd5\xed\xc2\x8b\x21\xc6\x64\xf9\xeb\xea\x0d\x19\x7c\x1e\xde\xb7\x3d\xc9\x55\xe1\x25\x8e\x40\x82\xda\xd7\xd9\x1f\x2a\xe9\xab\x1e\x7e\xbf\xfe\x7d\xf9\xb6\xb3\x9d\xbc\x00\x8b\x53\xed\x3d\xf4\x40\xd2\xf6\x43\x26\x21\x93\xfd\xda\xb5\xd1\x73\x24\xb1\x8a\x29\x36\x97\x63\x49\x05\x6c\x4e\x05\xe4\xe9\xaf\xd6\x42\xaa\xc6\x3d\x93\xc0\x1f\x44\x57\xae\xc8\xe5\x78\x5b\xaa\xdd\x3b\x84\x79\x09\xeb\x76\xc0\x5d\x71\x86\x51\x0a\x56\x78\x09\x8f\x3c\x55\x82\x5c\x5c\xde\xf1\x26\x6c\xf2\x48\x78\x8c\xb9\x18\x86\xfd\xb8\xf2\x3e\x1c\x46\x78\x8c\x0b\xdf\x28\xb7\x41\x46\xaf\xdf\x95\x99\x0b\x8f\x13\x22\x3d\x14\x02\x6f\x32\x7b\x0a\x1e\x04\x2a\xd7\xb7\x5d\xce\x76\xef\xdb\x7f\xd9\xdf\x13\x50\xd5\x59\x85\xac\x39\xbd\x6c\x81\xf2\x93\x12\xd4\xa2\xcc\xe4\x3f\x84\x27\x3c\x1f\x13\x70\x8b\xa2\x14\x8c\xe6\xf6\x77\xf0\x19\xfa\x7a\x8a\xb3\xe2\x31\xcd\x2d\x9e\x6d\x38\xc6\x64\x04\xa4\x9f\x0a\x9f\xa7\xe2\xb1\x28\xdb\x91\x36\x7a\xed\x32\x96\x89\xf6\x0c\x67\x42\xbc\xa4\x55\x8f\xdc\x5d\x78\x92\x2a\xd1\xdf\x53\xef\x16\x24\x24\x68\x11\x56\x35\xfd\x80\x9f\xb4\x9d\x83\x07\x8b\xb5\x16\xbe\x43\x95\x26\x54\x87\x00\xb5\xa1\x84\x6f\xaa\xa3\x84\xef\x26\x0e\xe6\x78\x37\xdb\xd5\x62\x79\x88\xcc\xe9\x5c\x91\x60\x88\xb1\x3d\xbe\x32\xb8\x12\xd3\x26\x3d\x34\x32\xde\xdf\xfa\xd2\x27\xc2\xf7\x62\xa5\x8a\x63\x40\xce\xcf\x34\xfb\xec\x80\x1b\xc2\x27\x41\x88\xc7\x69\x86\x1a\x4c\x9f\x0d\xbe\xa8\x4f\x82\x28\xe9\x25\x13\xd6\x72\x53\x42\x5d\x5f\xc7\xbd\x12\x8a\x55\xb3\x29\x2f\x5e\x6a\x6e\xcf\xce\x68\x94\x58\xa1\xe4\xc9\x98\x85\x1f\x10\x8e\xd0\xff\x43\x5a\x7d\x4b\x13\x2f\xfc\x20\x8e\x70\xf9\x7e\x9e\x6d\xff\x31\x34\x5d\xee\x25\xc2\x84\x1f\xd0\x98\x6a\x21\x6a\xac\xbd\x84\x3e\x25\x91\xf0\x43\xa2\x08\xf9\xea\xe2\xa5\xe1\x1f\x57\xfb\x33\x15\x18\x1e\xe1\x19\xd0\xfc\xfd\x32\x7a\xd6\xc8\x51\xe0\xd1\x4a\x51\x3b\xd0\x0c\xb4\x57\x8c\xc5\x89\x13\x10\xb8\xd1\xe7\x8d\xbc\x08\x6d\x79\xcc\x70\x3c\xa4\x9f\xe6\xaa\x91\xef\x21\x3a\xba\x03\x12\x7c\x92\x5b\x20\x81\xf0\x23\x08\x85\x8e\x10\xda\xf1\xd4\xd1\x29\x09\x3f\x76\x25\xe6\xac\x66\xfb\xfd\xf6\xf0\xb4\x7e\x79\x58\xbe\x3d\xad\xd7\xbb\xa5\x6d\x67\x32\xa2\x16\x01\xb8\x2c\xa9\x69\xa0\x89\x87\x71\x5b\x6d\x14\x2f\x46\xf4\xc0\xc2\x67\xbe\x8b\x20\x3e\x7c\x50\x43\x81\x7f\x07\x87\xd3\x19\x11\x7e\xbb\x55\x2a\x25\x55\xe5\x86\x98\xeb\xb1\xd0\x57\x15\xa2\x56\xc9\xef\x6f\xda\x9e\xff\x7f\xfd\x35\xf7\x95\x40\x90\xf4\xaa\x13\xa1\xcf\x64\x20\x7c\x1e\x08\x2f\x36\x05\x34\x20\x96\xf5\x49\x05\xfd\xef\xcc\x66\xce\x42\x4c\x5d\x9d\x9b\xec\x8f\x69\x83\xc6\x17\x6e\x88\xec\xa6\x17\x5a\xd2\x33\xd4\xd0\x5a\x63\xa5\x22\x88\xb3\x63\x52\x10\x07\xa1\x36\xfc\xd4\x2e\xcf\x58\xbb\x31\x3d\x5b\x46\xb3\x06\x3c\x27\xd4\x81\xca\x39\xd4\x9d\x09\xe1\x03\x89\xd0\x84\x3d\x1b\xb9\x3a\xdb\x10\x44\x89\xd6\xa3\xdf\x16\x19\x8c\xa3\x9b\xe3\xf3\x27\x80\x28\x10\x0c\x84\xf6\x3d\x1a\x13\xba\xed\x22\x2c\x37\xec\x9a\xc2\x07\xae\xf8\xa1\x15\x2c\x34\x3d\x37\xe7\x15\x2f\xb6\xe3\x7a\x22\xe1\x83\x70\x30\xdd\xda\x21\x26\x61\x54\xf9\xa3\x3b\x4a\xe6\x88\x60\x34\x39\x7a\xec\x2b\x6d\x87\x48\x29\x42\xab\xb2\xd0\x76\x63\x5d\x2d\xd6\x0f\x69\xc5\xfb\x0b\x83\xe4\x1c\x61\x58\x0c\xd2\xfc\xf8\x63\xa5\x49\xff\x04\x71\x02\x86\x43\xf9\x67\x3a\xdc\x89\xe3\xa1\x37\x37\xaa\xda\xb6\xcf\x41\x9c\x44\x51\xb0\xed\x4f\xa0\x6b\x55\x74\x83\x4b\x22\xb4\x3b\x15\x71\x6f\x7f\x0d\x27\x6e\xc8\x70\x03\x63\xad\x6b\xdd\x3d\xbf\x37\x2c\xf6\x1b\x1a\x9e\xc4\x8d\x22\xbc\xd0\x2e\xa7\x97\xea\x54\xd4\x8a\xb8\xfd\xbe\x0a\x69\xff\x25\x12\x37\x51\x5c\x1c\x47\xcb\xe7\x8e\xfe\xa4\x51\x43\x1d\x33\x89\x0a\xe2\x32\xae\x72\xe9\x75\xa1\x79\xd7\xe2\xdb\xb4\xe5\xf4\x6c\x23\x2e\x8f\x30\xe8\xf0\x96\x7e\x14\x86\xad\x51\x10\x9f\xb8\xbe\xce\x0c\x2c\x9a\xaa\x2e\xce\x50\xbe\x6d\xe1\x3f\x33\xce\xbf\x1f\xef\xc4\x0f\x22\x14\x4f\xcb\x68\x2e\xda\xa1\x3d\x32\xae\x88\x1f\x12\x04\x09\x29\x7e\xae\x6f\xb6\x61\x42\x62\x4e\xf4\xee\xb5\xf6\x86\x7b\x00\x21\x09\x43\x9d\xcf\x25\x06\x9b\x78\x47\x32\x22\x08\xe1\x0e\x1e\xa6\x6a\x0d\x11\xe3\x3a\x19\x84\x27\x41\xa2\x42\x1a\xf5\x14\x05\x25\x89\xfb\xf3\x84\x04\x3c\xd2\x9a\x41\xc8\xa0\x3e\x53\x3e\x5b\xd5\x63\xee\x13\x24\xf4\x94\xd9\x68\xc3\x2f\x3f\x53\x64\x22\xf9\xea\x3a\x28\x59\xd1\xb2\xc8\xb2\x97\xc2\xfe\x1a\x29\x86\xf3\x97\xd9\x66\xbf\xde\xa0\xdd\x6b\x9b\xa8\x2a\x4f\x3d\x42\xfd\x03\x2a\x84\xea\xa2\xbb\x23\xee\x54\x8c\x0b\x12\xb2\x00\xe9\x7b\x4e\xb4\x3a\xbd\x56\xc7\x1b\xb7\xf5\x5b\x80\x6d\x57\xc5\x37\x18\x8d\xa1\x0c\x84\xec\x85\x4d\x8d\x50\xcd\xf0\x8b\x44\x81\x8f\xd1\xb3\xa2\x4f\xea\xf1\x9e\x6b\xe9\xe0\x05\xd6\xe6\x1b\xb3\x87\x44\x54\xa0\x5c\xcc\x9c\xe6\xbc\x28\xdf\xa0\xfe\x2a\xca\x8f\xc1\xa4\x8b\xb8\x87\xce\x12\x12\x51\xe2\xf7\xad\x30\x42\x50\xf5\xe3\x3e\x24\x76\x28\x86\xef\xeb\xd6\x2a\xfc\x57\xd1\xd8\xdf\x7d\x06\xdc\x66\xb4\x6f\xd7\x33\x12\x33\x8e\x1d\x2e\x45\x91\x1d\x04\xb2\xc5\x0c\x1f\x27\xf1\x13\x34\x76\x4c\x84\x4a\xd1\x58\xd9\x52\x13\x41\x12\x19\x20\xae\x4b\x41\x85\x15\x2f\xc2\xe8\x14\x52\x72\x4d\x95\xa7\x65\x3c\x74\x03\x75\x23\x87\xf6\xb3\x99\xf3\x91\x2a\xa2\x20\x5c\x33\x62\x3d\xad\xf7\x4f\x8b\xf5\xca\x8e\x08\x11\x46\x68\xe7\x61\x64\x79\x0b\x9f\x40\xb3\x34\x3f\xf6\x3d\x63\x02\x84\x44\x1e\x46\xf1\x73\x81\xf8\xb2\xa5\x2a\x48\xf9\x0e\x7c\x22\x08\x08\xc0\x02\x7f\x65\xcd\xbf\x15\x62\x94\x98\x21\x92\x38\xdc\xc4\x43\x8a\x69\xef\x83\x48\x91\xa8\x62\x2e\xf8\x5f\xe0\xb5\x96\xa4\x1e\x3e\x59\xe0\xb8\x21\xe6\x82\x37\xcb\xed\x62\xf9\xb6\x57\xc0\x8c\xdf\x4c\x23\x78\x66\xf7\xd8\x35\x17\x28\x39\x08\xa8\x4c\x0c\xd4\xea\x68\xdb\xe8\x4a\xe0\xfa\x9e\x79\xc5\xeb\xe6\x33\x15\x45\x99\xd2\x65\xde\xde\xff\x79\x74\xff\x81\xeb\x2b\x9a\xde\x0a\xea\xd9\xe5\x92\x8d\xb2\x39\xc3\x45\x2c\xf0\x5c\x05\xb9\x6e\x5d\xb5\x0a\x32\x13\xe4\x6d\x7f\xc7\x34\xdc\xe6\x79\xb6\x5b\x1e\x16\xcf\xb3\x97\x97\xe5\xdb\xd3\xd2\x36\x0b\x97\x7a\xd6\xb2\xb3\x3c\xce\xad\x69\x9a\x5b\xda\x42\x11\x10\xca\x48\xa0\xab\x44\x2c\xbc\xff\x2e\x40\xef\xdb\xd5\x3b\x20\xd2\xc1\xcd\x49\x85\xbc\x14\xfd\x88\x2a\xcf\xff\xab\x9c\x83\x3e\x41\xe0\x04\x9a\x74\x0b\xea\x59\x09\xb7\xf5\x75\xb6\x1f\xc7\x40\x63\x71\x51\xea\x6b\xa9\xc1\x1b\x88\x20\xa4\x5c\x2b\xa5\xb5\x46\xc4\x8c\x73\xb8\x20\x0d\x87\x92\x8c\xbb\xab\x10\xd4\x1e\x28\x43\x4b\x76\xd5\xc5\x91\x82\x50\x04\x91\x7a\x8f\xc8\xc9\xf9\x4a\xf3\xeb\xfd\x8c\x51\x10\xb9\x8e\xd5\x28\x04\x10\x73\xca\x3f\x1e\x01\x66\x98\xc1\xed\x2f\x64\x41\xe4\x72\xde\xc5\x8c\x26\x62\x04\x41\x14\x2b\x46\xf5\xa1\x42\x95\xa9\xf4\xec\xf6\x8e\x20\x62\x21\x8f\x4d\x68\x45\xd1\x8d\x8c\x94\xec\x4d\x47\xa0\x98\xc3\x7b\x6c\x5a\x63\x3d\x55\x55\xcb\xf3\x66\xe4\xbf\x05\xb1\xa3\xe2\x7c\x54\x88\x69\x83\x22\x88\x5d\x30\x1a\xd9\x87\xa6\x1a\x07\xf6\x82\x38\x88\x91\x38\x42\x29\x87\xec\x0a\x59\x2f\xac\x47\x6f\x5e\x6b\xcc\x13\x1c\x9e\x47\xfb\xe5\x62\x49\x51\xd9\x00\xa3\x7d\x8b\x9f\x0b\xf3\x7b\xe2\x51\xcd\x11\x9d\x65\xbf\xa7\x55\x35\xdf\x2f\x46\x6f\x2a\x21\x89\xc5\x0c\x35\x67\x45\xb9\x59\x8d\xfb\x84\x3e\x56\x15\xb0\x33\xdf\x64\xb4\x96\x45\x79\xb6\x17\x08\x63\xac\xf4\xc2\xf5\x37\xb7\x70\x34\x11\x24\xb1\x88\x54\x75\x47\x47\xe8\x32\x7a\xd4\x24\x89\x82\x0e\x9e\xf8\x5e\x66\x93\x96\x68\x90\x08\x8e\x55\x66\x22\xad\x2e\x19\xbd\x9a\x12\x13\xd3\x0a\x0a\xd5\x53\x54\x9c\x96\x4f\x4d\x9a\x8b\x3f\x19\x94\xc7\x61\x6c\x30\xa0\x81\xc0\xf7\x60\x41\x0b\x23\x74\x47\x7f\x48\xd0\x58\x01\xde\xb1\xf0\x54\x21\xd2\xae\x6f\xf4\x0c\x3a\x50\xa6\xc4\xc1\x87\xdf\x94\x79\x80\x05\xa5\x8b\x97\xd5\x63\x51\x3e\x51\x7b\x5d\x16\x29\xd5\x26\x45\x4e\x90\xe6\xc7\x21\x99\xb6\x08\x58\x2c\x30\x2a\x70\xd1\x54\xa0\x6b\x69\x5b\x98\xc4\x6a\x82\xaa\x61\x15\x2f\xd3\xa1\xbe\x8e\xee\xc3\x7d\xc0\xf4\xd8\xef\x3f\x9f\xef\x17\x50\x8b\x80\xb3\x00\x57\x63\x95\xfa\xfd\x3d\xad\x7b\xb9\x85\x80\x0b\x85\xb4\x51\xb4\x12\x7f\x8e\x97\x5b\xa0\x31\xe8\xea\xee\x0b\x26\x6c\xec\x81\x52\xc4\x89\x4e\xa5\xe1\xf6\x84\x85\x1a\xc3\x1b\x0c\x1d\x1a\x61\xac\xee\x61\xb9\x59\xef\x56\xfb\xdd\xe1\xf7\xe5\xc6\xe4\xcd\x43\x97\xd0\xff\x87\xb3\x37\xeb\x6e\x1c\x47\xb2\xc7\xbf\x4e\x3d\xcc\x03\x57\x90\x7c\x94\x25\xd9\x56\xa7\x65\xbb\x25\x39\xb3\xea\x3f\xa7\x8f\x0e\x96\x80\xcc\x36\x45\xaa\x49\xca\x4b\x7f\xfa\xff\x61\x04\xc0\x4d\x94\xb3\xe6\xf7\x30\x93\xd5\x26\xc4\x15\x08\xc4\x72\xe3\x5e\xa4\xab\xf8\x05\xe2\x74\x56\xca\xc6\x4d\xcc\x73\xc0\x05\xdc\xc2\x40\x55\x4f\x7a\x22\xfd\xcd\x3c\x09\xd8\x17\x29\xa9\x4c\x3f\x23\xb0\xd9\xf0\xab\x30\x4f\x07\x5e\x6c\x32\xbf\xab\xaa\x3a\x83\xea\x80\x8b\x8a\xf9\x90\x20\x05\x71\x1f\x81\xf0\xb7\xca\xbb\xf1\xc4\xff\xef\x4f\x58\xe6\xeb\x08\xaf\xdb\x44\x72\x8d\x03\xd5\xb6\xf4\x8e\x77\x82\xc1\xaf\x02\x16\x61\xae\xc4\xb4\x9d\xde\xf1\x23\x58\x86\xc4\x3f\x26\x36\x7a\x16\xc6\x31\xe6\xe8\x37\x85\x28\x6a\x5e\x76\x24\x82\xc3\x37\xc5\x42\x9f\x93\xf3\x0d\x6a\xdf\xbc\x89\x6a\xff\xce\xcf\x59\x6d\x2b\x30\x8c\xc5\x8a\x77\x42\x33\x33\xa3\xb7\xbf\x3b\xc2\xa7\x59\x43\x73\x9e\x93\xa7\x08\xe3\x53\x73\x49\x84\x00\x45\x59\x9f\x73\xd8\x17\xa7\xb1\x1d\x66\x11\x8f\xd0\xfb\x23\xe7\x6a\xbc\xe8\x26\x9c\x54\x16\x09\x81\xbd\x3f\x3d\x70\xac\x62\x71\xe0\x89\xb0\xa5\x6e\xc4\x00\x17\xd9\x73\x09\xe3\x3f\xb9\x27\xb1\x38\xa4\x26\xef\x9a\xbf\xa1\xd0\xf1\xef\xea\x73\xf6\x67\x82\x48\xac\x5a\x0a\xd3\xa2\xdf\x44\x35\xb9\xbe\x58\x2c\x24\xd2\x9f\x37\x31\x32\x6a\x1f\x81\xaa\x2e\x11\x88\x8a\xc5\x0a\x90\xc1\xc5\xb2\x68\xd4\xdc\xca\x81\x76\xc5\x15\x96\x38\x1a\x67\xcf\x43\x71\xd8\x5a\x40\xe3\x25\xfc\x86\x71\x3f\xc0\x8a\x1a\xca\xc5\x3d\xa4\x18\x54\x5c\x44\x09\xc3\x47\xe3\x52\x60\xe6\x63\xb3\xdc\x2e\x37\x3f\x97\xfb\xe7\xa7\xa7\x87\xfd\x6c\xb1\xd8\xd8\x4b\x73\x4d\x6c\x0d\xe7\xbc\x71\x3c\x9a\xa9\xbb\x3d\xc1\x15\x59\x53\xc5\x84\x4b\x94\x07\x69\xbe\xaf\x5e\x79\xf3\x09\xf7\xa7\x9e\xff\xca\xa4\x1b\x71\x42\x69\x7c\xa4\x23\x45\x08\xc5\xa4\x17\x6a\xab\x4c\x78\x3c\x42\xe3\x55\x75\x4f\xe9\xb6\xa3\x42\x1e\xd3\xdc\x7c\x87\xf2\xa2\x22\xc9\x94\xcb\x90\x15\xf1\x9c\x63\xf4\xd8\x25\x99\x99\x0a\x24\x37\x90\x9c\xba\xe8\x08\xec\x2e\x19\x08\xa7\xe7\x8e\x52\x1a\xd1\x7a\x48\x93\xba\xa6\xf8\xb3\x99\xb9\x28\xbc\x62\xc7\x68\x1f\x7b\x48\x45\x51\x96\xbc\x34\x56\xa4\x18\xa3\xee\xcc\x60\xf0\x84\xa0\xf4\xf0\xe1\x9c\xf1\xf2\xbe\xe8\xe6\x36\x68\x1f\x03\x14\xbc\xd6\x05\x91\xa8\x62\x3a\x72\x74\xbf\x64\xf2\xd3\xf8\x1e\x43\xe2\xcd\xdf\x38\x9d\xf6\x5c\xb1\x63\x23\xf1\x9b\x2e\x3f\x52\x19\x0e\xfb\xf1\x85\x65\xe2\xb4\x81\x42\x7e\xae\xe0\x7b\x75\x37\x15\x39\x8c\x9c\x8d\xb4\x6a\xb6\xcb\xa1\xb1\x88\x5c\x87\x12\xe8\x2f\xd9\xa0\x83\x5b\x45\x5e\x40\x9a\xb4\x27\xfe\xb5\x2b\x14\xff\x32\x90\xbd\xe1\xaf\x03\x27\xf2\x3c\xfb\x92\xf6\xa7\x12\xf6\xa9\xb4\x81\x77\x14\x4a\x1f\xf3\x6c\x7b\x2a\x01\xcf\x33\xe0\x84\xd5\x48\x25\x20\x83\x24\x1f\xb7\x13\xa9\x88\x79\xc2\x51\x43\x4d\xde\x6f\x0b\x32\x11\xe3\x31\xc2\xe0\x9f\x9b\x7d\xfc\xcf\x79\xdb\x2b\xaf\x22\x26\x80\xba\x21\x71\x7b\xdc\x37\xfb\x28\x71\xc6\xef\x3e\x5b\xfc\xd9\x74\x78\x12\x31\x15\x99\x69\x81\xfe\xb1\x81\x95\x8c\x7f\x64\x06\x47\x81\xe2\x44\x62\xb4\x85\xba\xc3\x96\xaa\x28\x62\x11\x85\x7c\xc5\x47\xfe\x5e\x50\xa3\x3e\xe4\xf5\xb7\xd2\xa5\x2a\x8a\x62\x82\x5a\x50\x8c\xd7\xe7\x08\xe9\xbe\x68\x1c\xf9\xa6\x6f\xa5\x71\xb4\xa9\xd6\x05\x73\x5e\xaa\xdf\x06\x25\xdf\x07\x2b\x51\x2c\x22\x0c\xba\x5b\x35\x15\xeb\x7c\x4f\x50\xfd\xa8\x88\xf3\xd8\x40\x62\xb0\x5a\xd8\xac\xf3\xff\xb7\xcb\x72\x70\x30\xb7\xd1\xb8\xb9\xf7\xc5\xb9\xac\x2e\xde\x91\xdd\x68\x5b\x77\x30\xe2\xda\xd1\x7d\xac\xfc\x43\xc1\xf3\x69\x28\x42\x24\xbc\x24\x31\x08\x09\x94\x12\xec\x6f\x6c\x91\x88\x25\x92\x5e\xd3\x3e\xdb\x55\xc3\xab\x5d\x31\x7a\x5c\xa1\x13\x44\x3f\x10\xce\xb5\x71\xfb\x3c\xfb\xa9\x65\x98\x10\xb5\xc4\x6b\x91\x8e\x70\x5e\x91\x4c\xa8\x43\xd8\xa6\x77\xf6\x24\x91\x30\xb8\x09\xa9\x02\x49\x2c\x2d\xb9\x72\xdb\x93\x2a\x10\x6e\x6f\xcb\xfb\x63\xc4\x93\x3e\x88\x63\xcc\x6f\x14\x37\xca\xac\xe7\x0c\x66\xa3\x59\xa3\x64\xec\x4a\x43\x36\x3f\xd3\x35\x94\x2b\x59\x8c\x87\x00\x47\xd2\xb5\x1a\x2a\xa3\x82\x6e\xe9\xd7\x06\x45\xd3\x08\x12\x0f\xe3\xf4\xf9\xaf\x39\x35\x52\xa2\x1f\x37\x7a\x5f\x20\x38\xe6\xeb\x0e\x3c\xe7\x43\xb8\x57\x04\xca\x45\x10\xf8\xcd\xe3\x0d\x55\xa2\xf7\x54\x0b\x5c\x2c\x1f\x9f\x8c\x46\x99\x8a\x9d\x40\xe2\xc2\x22\xa0\xfe\x2d\x6a\xc2\x5c\x78\x0b\xbf\xab\xa4\x0c\x6e\x29\x76\x18\x35\xdc\x51\x84\x6a\x13\x6d\xe3\xc9\xd6\x85\xc2\xe6\x24\x57\xce\x25\x95\xc5\xdd\x60\x18\xf1\xc7\xe8\xb8\x90\xb1\x71\xe0\x1f\x4d\x75\xb2\x47\xaa\x51\x3d\x21\x09\x76\xd5\x3e\xac\x26\xf4\xd2\xb2\x7e\xc5\x37\xb5\x3d\x15\x79\x35\x36\x8f\xb1\x1b\xf1\x64\x30\x25\xce\x44\x37\xf5\x2f\x7b\x3c\x0e\x30\x3d\xb9\xb7\x0f\x08\x32\x2d\xce\x97\x6d\x1a\xfd\xc9\x17\xbb\x10\x23\x8a\xe9\xae\x90\x32\xb1\xf7\xe3\x31\xc0\xad\x96\x82\xc0\xfa\x1b\xda\xbe\xef\xf8\x77\x7b\x0b\x36\xf6\x12\x37\x20\x04\xd7\x17\xb6\xa4\x8d\xac\x49\xec\x87\x01\x8a\x85\x40\x25\xcb\xe2\x63\xb4\x8a\x62\x3f\x21\x2a\x3a\xd9\xdf\x45\xe6\x85\xb2\x53\x2a\xf6\x75\x88\x6e\x8d\x4a\xdf\x67\x47\x3b\x51\xe3\x40\xfa\xc8\x68\xd5\x98\xff\x6d\x7a\x68\x22\x96\xc1\xd7\x36\xc3\x42\x8f\xfa\x99\x28\x8d\xba\x98\x3d\xd9\xdf\x87\x4a\x20\x32\x8e\xb8\xfc\x97\xb9\xba\xf9\xb2\x58\xe2\xc1\xca\x89\x23\x5f\x63\xd9\x05\x8b\x32\x0b\x78\xef\x09\xcf\x0c\x1f\x33\x92\x94\x15\x5f\x1c\xb3\xd6\x01\xba\x8a\x7b\x88\x63\x9f\x47\x26\xf7\x72\xf3\x45\x9a\x4b\xa3\x01\x01\xc7\xfd\x3b\x95\xc5\xd3\x09\xf2\x66\x7b\x6b\xd9\x4e\x54\x13\x8a\x30\x02\x7f\x0d\xc0\x5a\xf6\x28\x27\x0a\x8e\x0a\xea\x67\x7e\x99\xf3\x88\x63\xa5\xb1\x0b\x26\x7b\x47\x12\x99\xeb\x6c\x8d\x2a\x4e\x42\xe2\x9f\xa7\xc5\xbc\x7a\xbc\x7d\xda\xac\x11\x86\x82\x8e\xec\x72\x6b\x33\x90\x71\x12\xd1\x2c\xa0\x0d\x1e\x1d\x18\xcb\x10\xde\x53\x08\x1d\x9e\x9c\x3b\x31\xa6\xd0\x4c\x06\x08\xc9\x51\xae\xbc\x2f\x1e\x28\x69\x4a\xbc\x48\x05\x00\x3f\x52\xf9\xf6\xb3\xa8\x2f\x66\x1b\xe7\xa4\x13\x49\xde\xc1\x2a\x3f\x9d\x47\x99\xa5\x58\xba\xa4\x24\x8a\x5a\x87\xfb\xb3\x0d\x04\x62\x15\xb4\xda\x81\xc6\x80\x58\x0f\xa5\x63\xe2\xf9\x05\xe9\xe8\x6c\x2a\x61\xe8\x58\x57\x75\x21\xdf\x9a\xb8\x67\x0e\x65\xcd\xd3\xfc\x5b\x52\xb2\xd1\xc3\x29\x4d\x1a\x80\x3c\x4b\x8f\x3d\x7d\x0f\x15\x83\xef\x61\xc6\xe6\x27\x91\xcc\x0d\xf6\x96\xe6\x20\x71\x41\x95\x3c\xaf\x9f\xa1\xb4\x64\x41\xc3\xfb\x03\xa1\x31\x68\xfc\x77\x91\x92\xe6\x04\x25\xdb\xa6\x6f\x04\x54\x1c\x18\x3c\xf4\xf2\xf3\x94\x96\x5f\x8b\xae\x00\x19\x6b\x27\x89\x0d\x13\xce\xf3\x6a\xdf\xac\xa7\xbd\x1b\x0c\x6e\x29\x71\xbc\x84\x74\x13\x78\x99\x91\x64\x42\x47\x83\x3f\x5d\x68\xb4\x3f\x64\x31\x62\x1d\x91\x2d\xe8\x54\x14\xd9\x30\x9f\x94\x38\x8c\xa3\x9c\xd9\xb6\xc8\x78\x69\x55\x6e\x54\xe2\x70\x48\x86\x7d\x75\x94\xbc\x30\x87\x5d\xc7\x47\x56\xb7\xf7\x26\x6c\xbd\x2d\x8b\xa3\xa5\x8a\x99\x7c\xfa\xc4\x65\x21\x7a\x5f\x87\xf4\x1d\xe6\x45\x5e\x35\x23\x27\x42\xe6\xc4\xe5\x0a\x9d\xe3\xbb\xb2\x38\x9f\xf6\x61\x7b\x35\xa1\x5d\x0a\xcf\x3f\xe5\x44\xb7\xf3\xe0\x14\x9e\x1f\x32\xd7\xe4\x09\x91\x81\x75\xfa\x8e\xbc\x80\x68\xa1\x28\xcd\x68\xb9\xe9\x3a\x5a\x34\x95\x78\xc2\x95\x8e\x45\xaa\x60\x39\xe3\xc2\x55\xec\x67\x7e\xfb\x35\xed\xa2\xc8\xec\xfe\x92\x78\xc2\xb7\x49\xd2\x9f\x3d\xf1\xb4\x49\xb7\x2b\xf1\x03\xc6\x4d\x73\xf8\xec\x00\xf9\xa0\xcb\xc3\x0a\x02\x8e\xe3\xa2\x81\xd1\x4f\xfc\x50\xe1\xab\x6a\x0b\x39\xe8\x6b\x3c\xe5\xd9\xd7\xcd\xf9\x6b\x22\xfa\x4e\x7c\x16\x21\x2b\xe4\x2b\x47\x7e\xf7\x1f\x00\xa7\x34\x3f\x0c\x29\xf0\x55\xe2\x47\x1a\x37\x85\xb4\xba\x81\x03\x56\xa9\x51\xd4\x76\x04\xa2\x4e\x7c\x4e\x9b\x69\x33\xcb\x4d\xa9\xa7\x37\xcf\x13\x5f\xf9\x5c\x5a\x32\xde\xb2\xa2\xb4\xc1\xc0\x4d\x4a\x02\x15\x60\xc6\x6c\xb1\xfc\x39\x7f\x98\x6d\xb7\xfb\xdb\xdd\xc3\x7e\xfb\xbc\x5c\xda\x02\x4b\x12\x7a\x21\xee\x06\x7f\xf1\xfc\x0d\xa0\x71\x0a\x8a\x0c\xaa\x20\x6e\x8f\x47\x11\x76\xce\x37\x0e\xd9\x06\x8e\x45\x0d\xbf\xfa\x5b\xff\x77\x2e\xf6\x54\xc8\x79\x41\xaf\x3e\xfa\x64\x61\x4c\x32\x20\x23\xc0\xc7\x35\x27\xab\x37\xc1\x42\xad\xac\x3a\x19\xe9\xb9\x20\x59\xd6\x2c\x9b\x56\xd8\x53\x09\xf3\x14\xf6\x49\x88\x73\x99\x3f\x80\xae\x07\x50\xc3\x84\x25\x1e\xd6\x09\x7e\xa4\xf9\xe1\x1f\xfc\x38\xa0\x41\x56\x09\xe3\x1e\x62\x7e\xb9\x52\xdb\xb6\x20\x7f\xb9\x2a\x22\x16\x98\x62\x03\xc6\x47\x46\x12\x69\xfc\x4c\x83\xf5\x16\xc5\x2c\x8a\x0d\x41\x9a\xe7\x8f\x26\x57\xa4\x65\x68\x9d\xf4\xe9\xdc\x4b\x12\x3b\x94\xf9\xe0\x59\x56\x7c\x34\x6e\xdc\x32\x4b\x91\x86\xfb\xa2\xfc\x64\x7f\x10\x4a\x6c\xcb\xad\xed\xfc\x2b\xb2\x0d\x60\xf1\xf1\xd1\x60\x1a\x3a\x65\x1a\x95\xc4\xca\xc3\xcd\x7e\x56\xd6\xbc\xf8\x1d\x81\x89\x4a\x12\x4f\x10\x13\x17\x76\xa8\x5a\xbe\xb8\xef\x31\xe7\x09\xf7\x23\x65\x3c\x8e\x35\xff\x34\x13\xc1\x1e\x13\x1c\xcd\x6f\x4b\x11\x73\x65\xae\x99\xe1\xc2\x0d\xb1\x3e\x81\x6a\x5f\x65\x31\xb0\x76\xc3\x8b\x8a\x80\x23\x8d\xb0\xc8\xf2\x13\x94\xd0\x42\x0c\x13\xe9\x3b\xe8\x98\x19\x7f\x96\x9f\x3a\xa6\xe2\xe9\x33\x49\xe6\x58\x29\xac\x21\x81\xd0\xb6\x18\x74\xdf\xaa\x44\x85\x74\xcd\x0e\x85\x3a\x34\x49\xdf\x45\x18\xd3\x32\x05\x2a\x51\x40\xb5\xe1\x0a\x8c\xb5\x1b\x71\x84\xa9\x04\xe2\x40\x98\x16\x94\x72\xce\x8f\x27\x9e\x1e\xf2\xd5\x62\xda\x9b\x49\x20\x8e\x6c\xbf\x23\x85\x18\x43\xb6\xcb\x66\x00\x28\x53\xd6\x5a\xe6\x58\xc2\xfd\x0b\xf8\x25\xd5\xcb\xf8\xb4\xd2\xc7\x74\x53\xe3\xac\xed\xee\xf7\xcf\x9b\x25\x41\x82\xef\x37\x4b\x5b\x6a\x4d\x40\x92\xda\xe0\xcd\x72\x77\xbf\xdc\xc8\xae\x78\x98\x68\xc6\x4c\x34\x9d\x2b\xcc\x84\x97\xd7\xfd\xd7\x44\x73\x12\x8c\xae\xce\x95\x2c\x53\x01\xbb\x32\xe5\xd9\xe8\x95\x68\xed\x12\x19\xed\x1e\x77\x65\x1b\x54\x73\xc7\x0f\xb0\x0f\x4d\x67\xe7\xea\xd5\xa8\x78\xc3\x28\x13\x31\x9c\x71\xdc\x49\x34\x97\x66\xbf\xbc\x79\x3b\xcc\xea\xe5\xa7\x7c\x9d\x16\x76\x51\xdc\x91\x1e\x06\xa1\xd8\xfc\x40\x0e\x7e\xd9\x5e\x5b\xb9\x88\x0f\x68\xa6\x10\x4e\x1d\x7b\xc0\x75\x05\xf2\x08\x88\x54\x29\x6a\x1a\x6c\x69\x15\x14\x77\x7d\x85\xa8\x99\xf9\xd3\xe3\x6e\xb3\xba\x79\x69\x1c\xe0\xed\x7e\xdd\xc2\x0b\xb8\xcb\x22\xb4\x7a\xaa\x45\xb8\xc0\xf5\xf2\x2d\xf7\x82\x00\x29\x34\x6d\xe6\x00\xb1\x4a\x57\x18\x08\x15\xf7\x13\x6a\x5d\x32\x65\xbb\x0a\xca\x2d\x85\x59\xe6\x78\xe0\x50\x61\x62\xc7\xab\x37\x8b\x96\x1a\xcc\xe9\x76\x1c\x47\x70\x14\x1c\xd3\x2b\xaa\xa1\xa3\xdb\x0c\x94\x52\x5d\x50\xbd\xfd\xaa\x6a\x38\xf6\x50\xa3\xb6\x11\xbd\x03\xcb\xd9\x3c\x32\x0f\x79\x10\x04\x2d\x28\x62\x9b\x1a\x53\x6e\x97\x13\x0f\x45\x1c\x5b\x09\xda\x1a\xb6\x50\xf7\xf8\x8f\xaf\xba\xc9\x3c\x54\x20\x4c\x1f\xdb\xcd\xb9\x4d\xa5\xf6\x3b\x86\x06\x66\x92\xb3\x20\x66\x84\x6b\xcf\xde\x4c\xca\x95\x7e\xd4\x6c\x60\xf4\xe4\x30\xc1\x56\x31\xf2\x8d\x38\xe3\x8e\x32\x25\xeb\x9b\xe2\x28\xfa\x90\x4a\xce\x44\xac\x6d\x18\x8a\x9d\x8e\x95\x21\x0c\x18\x92\xb6\x28\x1e\x79\x09\x32\xc0\xa6\x15\xe2\x33\x2a\x54\x63\x1c\x7e\xe7\x28\x8c\x31\x39\xd9\xdc\x2a\x2f\xe5\x2b\x7a\xeb\xd8\x6c\x7a\x6c\xe9\x0d\x15\x8f\x9d\x18\x93\x8f\x98\xfa\xdf\xfb\xfb\x4e\x1a\x57\xf1\x58\x78\x48\x7b\x66\x08\x81\x05\x7a\x3d\xd7\xb1\x73\xf6\x57\xca\x07\xa4\x9f\x2c\xba\x13\xe9\x88\xf4\xa6\xce\xe2\x98\xd6\x3f\x53\x05\xc5\xe4\x1b\x4e\x3c\x70\x8c\x1d\x5b\x9a\xf0\x63\xce\x4f\x43\x33\xc0\x13\x11\xba\x96\x8b\xc8\x74\x12\x1a\xa4\x9d\x1b\xb1\x7f\x5d\x16\xf7\xec\xcf\x94\x83\x1d\x28\xb8\x69\xfe\xf3\x0c\xe3\x34\x14\x17\x8e\x1f\x05\xc6\x5e\x91\x70\xea\x2d\xd5\x7c\x6d\x4e\xea\x2a\xf2\x81\x0b\x1f\x22\x3e\xd2\xd3\xca\xf8\xe5\x16\xd1\x59\x64\x2e\x22\x92\x2d\x90\x45\xfe\x0e\x65\x6d\xd4\xef\x2c\x64\xd0\x0e\x12\x24\x96\x56\x1a\xb9\xd4\xe1\x8b\x90\x6e\x64\x41\x37\x37\xbc\xae\x33\xf8\x71\x1e\x57\x98\xb9\x54\x1c\xab\x0f\x26\xd1\x73\x97\x96\xd9\x1f\x13\xf2\xea\xdd\x0f\x94\xa7\x6d\x9f\xd4\x03\xf0\xaa\x89\xdb\x20\xaf\xd2\x77\x40\x23\x71\xc5\x00\xa9\x30\xc6\xed\x2c\x87\x8f\x59\x5d\xb7\x9c\x4d\x8a\x2b\x26\x10\x49\xbd\xbf\xc2\x14\x6e\x87\x29\x81\x24\x16\x3f\x7f\xf6\xfd\x37\xae\x74\x84\x11\xe2\x8f\xb3\x2a\xaa\xa7\xf2\xc0\x73\x83\xf4\x1b\x05\xe9\x1c\xfc\x10\x01\x25\x9b\xbb\x3f\xa9\x97\x6a\x3a\xc9\xd4\x9f\x0e\x90\xc4\xe8\xc1\xdd\xf0\xfc\x0d\xb7\x93\x3d\x69\xa8\xcc\x8b\x3c\x07\x59\x37\x7f\x6e\x49\xa1\x1f\xe1\x03\x87\x0c\x83\x48\x0e\x82\x58\xbc\x9b\x0d\xf7\xf9\x7c\x3a\xb5\xbc\xe9\x8a\x83\x22\x41\x0c\x6c\x88\xb8\x88\x58\x87\x2f\x4f\x3b\xe0\xd2\xf6\x82\xa0\xf0\x87\x66\x8d\x9a\xf3\x08\x47\xb9\xc8\x29\xf3\x73\xb5\x98\x3d\xf4\xf0\x67\xc2\xf3\x89\x0a\x70\x3d\xdb\xdc\xad\x1e\xf7\xdb\xe7\x87\xd5\x6e\x6f\xa0\x5c\xb3\xbb\xe5\xfe\x66\xd6\xe2\xdc\x85\x17\xd2\xaa\x3a\xe0\xec\x1c\x31\x2a\x29\xe1\x31\x85\x9d\x86\x88\x97\x30\x73\x7d\xcc\x5b\xa8\x04\xf2\x73\x37\x53\xf1\x68\x9b\xce\xa7\x08\x36\x94\xf0\x0d\xda\xe3\xb6\x2c\xfe\x0b\xb9\x19\xb3\x87\xeb\xa9\x18\x11\x68\x8f\xba\x8d\x71\x86\x6e\x8a\xe2\xf8\xc7\x54\xea\x48\x84\x51\x82\x2d\x35\xcb\xdd\xfd\x73\x7f\x9a\x88\x30\x01\x2c\x2f\xac\x91\x51\xd3\x6e\xb2\x82\x71\xe5\xdb\x1c\xf5\xf2\x78\x6a\x61\x52\x82\x81\xa3\x89\x1e\xef\x93\x7a\x58\x6f\x7b\x84\xfe\x03\x83\x24\x98\xe6\xd8\x4a\x6d\x79\x1d\x7b\xba\xda\x17\x6f\x28\x8a\x95\x91\xdf\x3e\xa6\xf9\x16\x78\x66\xa4\x5d\xfb\x76\x5b\xc4\x0e\x43\xd0\xc5\x91\xbf\x19\x7e\xa3\x27\xdd\xe2\x54\xaf\xbc\xa0\x38\x09\x91\x4c\xa2\x71\x05\x0c\xa9\xd0\xf0\x9d\x27\x7e\x82\xb5\xad\x56\x0e\x77\x5c\x92\x10\x89\xaf\xa5\xe9\x38\xbe\x19\x89\x17\x28\x91\x84\x9c\x27\x96\x92\xe0\xc8\x91\xe0\xac\xdd\x20\x04\x77\x79\x10\xd8\x84\x14\x71\xb9\x6e\x21\xcb\x7e\x4f\x92\xaf\x04\xf7\x99\x1b\x50\x5c\xb1\xe7\x83\xb5\x23\x78\x28\x31\xcd\x65\x33\x2d\xf3\x22\xbd\x86\x3f\x16\x3c\x01\x0c\xd6\x97\xeb\xd9\x7c\x02\x2c\x26\xb8\xd4\xc8\xae\x78\x22\x75\xd3\x4e\xdc\x58\x09\x91\x38\xa1\x65\x0c\x01\x79\x2e\x53\x5b\x32\x1d\x65\x6e\xcc\x70\xc9\x3c\x54\x3d\xbb\xc9\xd2\x5c\xcd\xcb\xe2\x7c\x4a\x8d\x23\xd9\xc7\x10\xb6\x5f\xde\x65\xdd\x56\xe0\x32\x3b\x0f\xa4\x74\x9d\xa0\x6d\x9f\x2a\x0d\xc3\xee\xc3\x58\x3c\x4d\x09\x09\x7e\x62\x6e\xce\xa4\xd1\x78\xf9\xb5\xd7\xe7\x1c\xdd\xa1\xbd\x34\x12\x61\xc3\x1f\x29\xe6\x30\xb3\xfb\xed\x1b\x73\xd1\xbe\xd8\xc9\xcc\x88\x80\xc8\x45\x14\xf8\xf2\x69\xfb\x9c\x9d\x07\xe1\xb1\x00\x45\x9c\x43\x39\x7c\x9a\xda\x86\x71\xbe\xfe\xce\x3f\xe6\x1c\x3a\x22\xbf\x5d\xf6\xfa\x11\xec\xa1\x58\x68\x43\xe5\xb6\x29\xb0\x26\x63\x0f\x68\x4e\xa2\x0e\x86\xa0\xfd\xfc\x35\x59\xbd\x94\x8e\xef\x85\xfd\x82\x58\xe3\xaa\x0e\xb3\xfd\xd2\xf1\x85\xd7\x85\x7d\x8f\xbb\x9f\x2f\x7f\xd8\x23\x21\xc3\xaa\x6e\xcd\x3f\x07\xb9\x16\xe9\x24\x12\xdd\xdf\x53\x59\xd4\x28\x2e\x6d\xb5\xc8\x27\x27\x9f\xf4\x18\x43\xa7\x8f\x30\x15\x4f\xe7\x5a\x16\x2d\x6d\xd7\x78\xa8\x12\x68\xa0\x9a\xb5\x4d\x94\xee\x0b\xe0\x97\x84\x8f\xa3\xbc\xa5\xf9\x71\x10\xb9\x21\xf1\x63\xd6\x5c\x43\xfb\xb2\x9a\x19\x89\xb8\xd2\x75\x9a\xd7\xcf\x65\x51\xe8\x27\x8d\x14\xe3\xf6\x78\xe4\x88\x8e\x72\xa2\x2c\xf1\x89\x90\x58\xe4\xe6\xf9\x49\x0f\xc9\x4d\xad\xa5\x92\x11\xf7\x20\x34\x96\x71\x0b\xf5\xf9\x84\xc5\xbb\x2a\xb5\x08\x2e\x19\xc7\xae\x1f\xb7\xfe\x5a\x5f\xdc\x7c\x60\x1e\x65\x2c\x12\x4c\x1c\x68\x77\x68\x6f\x50\x74\x2d\x20\x7b\x53\x9c\xeb\xe1\x07\x68\xcc\xa4\xa2\x70\xea\x9d\xd7\xb8\xe7\xed\xc5\x58\x64\x58\xc9\x24\x0c\x03\x32\xa7\xff\x3e\x1b\x68\x94\xdd\x79\x2e\x71\xe4\x32\xe1\x0a\x0b\xab\x47\x7c\x92\x49\x66\x13\x3b\x52\xc4\xe8\x11\x19\x87\xe8\xdc\x57\x1d\xfb\x5b\xe9\x75\x99\x28\x1f\x42\xdb\x39\xd1\xd8\x42\xca\x36\xf6\x64\x5d\x46\x3f\xe0\x7e\x84\x7a\x39\xb7\x03\x92\x1e\xc9\x65\x8c\x59\xcb\xdd\xee\xb1\x4f\x67\x69\x8e\x8a\x80\x61\x09\x0f\xab\x18\x4d\x7c\xd2\xe3\x81\xff\xcd\x0d\x8a\x50\xe2\x1b\xfe\xe4\xe7\xf2\x7c\x44\x80\xc9\xaf\xa2\x7c\xeb\x5a\x9b\xa4\xe0\xd2\x7a\x79\x77\x63\x7b\x2a\x85\x56\x68\x9b\x21\x57\x48\xf4\x7b\x93\x96\xed\x74\x94\xdc\x45\x72\x62\x7c\x90\x0d\xd4\x65\x0a\xad\xae\x89\x92\x52\x70\xb4\x28\xeb\xd9\x9f\xfb\xc5\xf2\x79\xb6\xd9\xbd\x6c\x96\xfb\x87\x95\x2d\xd5\x4a\x15\x40\x60\xf8\x40\xee\xc6\xca\xb0\x4a\x2a\xa9\x1c\x23\xab\x86\x24\x68\xa3\xc3\xc0\xa8\xb7\xf2\xc7\xfd\xee\xbb\x74\x96\x04\xa1\x2c\x63\x00\xa2\xd0\x76\x25\xf0\xea\x5c\x4e\xc3\x32\x94\xe3\x01\x2a\x47\x7d\xc0\x5d\x51\xcf\x4c\xe0\x38\x69\x0b\x94\x03\x84\x86\xc3\x94\x57\xf9\x06\xf5\xde\x6e\xdd\x2f\xd5\x90\x4c\x5a\x29\xd7\x8d\x50\x84\xd4\x80\xb5\x16\xa6\x91\x7a\x7f\xf3\xf4\xf2\xb8\x5b\x2d\xb7\xfb\xd9\xe2\xe7\x6a\xfb\xb4\xd9\xb6\x3f\xe0\x09\xba\x2b\xbf\x96\x7e\xbf\xf7\x44\xb9\x52\x1a\x34\x81\x7c\x9d\x4f\x64\xc6\x7e\xfb\xef\x64\x16\x40\x79\x71\xe4\x5b\xc9\xfe\xd0\xb1\x17\xf3\x12\xf2\x24\x30\x99\xd3\xf8\x9b\x03\x7a\x0f\xe5\xe9\x98\x11\xc9\xc5\x67\x87\x97\x37\xc7\x7c\x87\xe9\xa8\x25\xda\x2f\x87\x85\x7c\xe5\xbb\x31\xf2\x1e\x9e\xf3\xc6\x77\x6a\xb6\xe8\x4e\x3e\x7a\x60\x08\x95\x1f\x68\x4c\x7d\xb4\x8e\x16\xe6\xb2\x86\x37\xdf\xf8\x3b\xcd\x87\xd8\xbe\xb4\xaf\xc9\x07\x95\x18\xc4\x58\x33\xd7\x0d\x2f\xf2\xc0\xd6\xda\x74\x82\x0a\x1c\xdf\xe9\x98\xfd\xfe\x71\x2e\x8b\x72\x14\x37\xa9\xc0\x89\x70\x9e\xff\xe4\x76\xcd\xa8\x40\x93\xe4\x6b\x8f\xcd\xef\x2f\xe0\x76\xee\xab\xd0\xf3\xb0\x2f\x63\xb6\x6b\xef\x29\x14\x61\x0c\x6d\xf7\xcb\x1d\x3f\xc2\x43\x71\x48\xe5\xe8\x61\x98\x13\x5b\xd4\xfe\x73\x09\xab\xf9\xd3\x25\xb5\xae\x52\x2c\x09\x74\xf3\x56\x30\x7b\x87\x7c\x61\xb3\xac\x04\xae\xbe\xc6\xc1\x85\x1d\x2f\x78\x04\x1d\x32\x69\x5f\xc2\xb1\x6b\xcd\x52\x91\x43\x64\x25\x04\xb8\xea\xe7\x5f\xba\x33\x44\x71\x84\xbb\x2f\xd7\xba\x59\x38\xfb\xf6\xb7\x9c\xb4\x05\x6f\x32\x2e\xdf\xb6\x39\x4f\xb3\xf1\x62\x3c\x5f\x40\x6a\x55\xec\x02\x26\x8b\x3b\x36\xf9\xcd\xf2\xd7\x6c\xd3\xae\x8a\xc7\x97\x75\xbb\x10\xe2\x30\xb0\xf4\x42\x0f\x05\xcf\x77\xc5\x73\x51\xd6\xba\xc8\xd2\x62\x3a\xfa\x54\x31\xf7\x30\x9b\xb6\xe6\x6f\xc4\xf1\xca\xff\x06\x51\x8c\x4a\x98\x34\x8c\xb6\xb8\x05\xdd\x95\x3c\xaf\x01\xaa\x9e\xcc\xb0\x19\xc8\x9d\xc0\x98\xc3\x9a\x08\x74\xac\xa7\xd2\xe6\x64\xec\xc6\xaa\xb8\xef\xf0\x3e\xd6\x6f\x96\x2b\x23\xdf\xf9\xb7\x0c\x77\x13\xc8\xa2\xd3\xf2\xb2\xeb\x75\x61\x28\x21\x1d\xac\xa2\x9e\x32\xfe\xe5\x5d\x31\x4d\x42\x26\x91\xe1\x20\xa7\x8c\xe1\xe8\x21\x84\xd5\xb7\x6a\x26\xaf\x3d\xb1\xf4\x19\x2a\x67\xde\x58\x2a\x68\xd5\x6c\x4a\xa8\x22\xb6\xc7\x68\x70\x6a\x26\x4a\xe1\xa1\x15\xce\x9a\x63\x43\xf3\xa0\xdc\x04\x71\x00\xa2\x28\xde\xee\x2e\x88\x77\x94\x62\x9a\x53\xbb\x8d\x2c\x8e\x69\x7e\xd8\xf0\x5c\x15\x47\xc2\xbc\x2c\xcb\xf2\xe2\x9e\x95\x22\x1d\xe7\x6e\xd2\xdc\xcf\x36\x8b\xf9\xec\xb9\xbd\x9e\xf6\xc1\x35\xcd\x80\x50\xd5\x2d\x18\xed\x52\xae\xd6\xfc\x00\xdc\x04\x77\x5c\xd3\xc3\x5f\xad\x8e\xa7\xa2\xac\xbb\x54\xb2\x82\xc8\x0b\x5c\x9b\xea\xc5\xb6\x41\xdb\x0f\x7b\xe5\x84\x91\x42\x21\x50\xdc\xf0\x76\xf7\xed\x69\x12\x8e\x75\x6b\x85\xd0\xa8\x5e\xba\x4d\x41\xa2\x63\xb7\xeb\x45\xfb\x75\x0b\xad\x89\x04\x4e\x8d\x6c\xc4\x4f\xbb\xac\x24\x3f\xc1\x7d\x8f\x01\x4e\x01\x97\xae\x01\x0a\xdd\x16\x25\xa4\x07\x22\x7f\x1a\xa5\xa7\x86\x76\x1e\x1c\x4f\xe0\xec\xb5\x5c\x2f\xdf\x43\xa1\xc1\x65\x1a\x51\x85\x1a\x6a\xf9\xba\xe0\x5f\x83\x4d\x0d\x5c\xf0\xfc\xa0\x7b\xe1\x2f\xdb\x05\x15\x57\xfb\x9f\x19\x3c\x4f\xe2\x29\x0c\x4a\x9a\xf4\x18\x86\xe7\xf1\x13\x85\x89\xc5\x45\xaa\x75\x2a\xcf\x59\xfd\x85\x82\xa0\x23\xa7\x0e\x7c\xae\x1c\xaf\x23\xfb\x22\x37\xf2\xe6\xab\xf9\xef\x31\x79\xae\x02\x5f\x2a\x25\xad\xe2\x75\xe3\x30\x12\xe8\x71\x74\xca\xc0\x21\xa1\x0f\x1b\x53\xb4\x8e\x36\x04\x92\xa3\xbd\x9b\x37\x13\xbf\xfd\xa3\x16\x98\xab\x5d\xf0\x62\x73\xce\xa0\xb2\x9b\xd6\x4c\xa9\x51\x56\xfc\xff\xf2\x2f\x52\x24\x0e\x3f\x53\x18\xb8\xd0\xa3\xfa\x7e\xe7\x35\x2f\x91\xcb\x60\x1a\x91\x35\xfa\x6a\x21\xe7\x76\xef\xc5\x0a\xfa\xe8\xa1\x99\xab\xdc\x4e\xeb\x70\x25\x8b\x5d\x7a\x84\x0d\x12\x07\x4e\x4e\x6b\x60\x9a\x4b\x62\x60\xcb\x7e\xfc\x35\x1f\x2e\x4b\x88\x99\x0c\x45\xcf\xc8\x51\x0e\xe5\x06\x25\x64\xc7\x43\x13\x46\xd2\x4f\xc6\x5f\x68\xc2\x6e\x93\x12\x1a\x55\x16\xcc\x0f\x12\x27\x76\x5c\xd3\x36\x5b\xf3\x01\x7f\x18\x24\x61\x80\x4c\xaf\x3a\xfd\x04\xf5\x50\x1c\xbc\xa9\xaa\x04\x24\x9c\x0c\xdd\xae\xb8\x2b\xe6\x45\xde\xc4\xa5\xf6\x04\x3c\xd4\x4c\x99\x46\xff\x79\x71\x14\xbc\x46\x9a\x9d\x8b\x9b\xe0\xb1\x87\x75\x01\x52\x81\x97\xf5\x99\x67\xfd\x8e\x53\x10\x8c\x48\x70\xee\xa0\x7e\x2e\x8a\xac\xf9\x4c\xe5\xb1\xdf\x81\x0c\x22\x0a\x11\xfe\x80\xc2\xf3\x84\x07\x1e\xbd\x19\x11\xb5\x94\x40\x5b\x44\xfa\x50\x09\x66\x78\x23\x2a\x74\x31\xd6\x3f\xa4\xba\x5e\x55\x3b\x0b\x53\x01\x08\x18\x33\x89\xdf\x59\x96\x11\xa9\x9e\xd9\xc4\xdb\x25\xa6\x19\xf3\xa8\x17\xa0\xea\x85\x8b\xda\x09\x89\x84\x61\xa4\x1f\x7d\x9d\x37\xbb\xf9\x09\x27\xb1\x39\x2c\xf1\x12\xb6\xcc\x1c\xb2\x4c\x75\x78\xf7\xcb\xaa\xb6\xc8\x8b\x8e\xc8\xe2\x6f\xe1\xf5\xb5\x1f\x07\x8c\x6e\x76\x7a\xbb\xb4\xc3\x92\x10\xab\xe6\x2d\x7d\x31\xed\x20\x03\x17\x68\x54\x28\xd1\xbe\x8e\x3d\x93\x9a\x9f\xf7\xf0\xb4\xc3\x47\x0c\x42\x86\x2e\xc7\x16\x5f\xa8\x91\x3d\xaf\xb6\x17\x2b\x49\x87\x8c\xb8\x76\x1a\x9f\x9f\x72\xee\xcb\xfa\xb5\x31\x37\xe3\x71\x3c\x44\x63\xf2\x05\xbc\x0c\x1a\x43\x3f\x4c\x1d\xeb\x50\x02\x32\x00\x36\xae\x2a\x06\x8e\x2d\x5d\x24\x35\x50\x78\xf1\x24\x04\x53\x33\x88\x9d\x4e\x79\x07\xb3\xb9\x44\xf1\x39\xf0\xa1\x75\x24\x19\x72\x15\x41\x5e\x9d\x4b\x98\xf7\xda\x55\xec\x0d\xc4\x8e\x87\x0d\xdb\x19\xaf\xea\x3e\x2d\x84\x8e\x1d\x89\x4c\x30\x4d\x74\x9e\x66\x70\x00\xd5\x18\xf0\x87\x56\xf4\x50\xe9\x18\x1c\x84\xde\x0b\x40\x25\xe4\xa2\xac\xc7\x95\x5a\x9d\xf8\x09\x56\x26\x6e\x78\x7e\xc8\x78\x1f\x82\xa6\x13\x0d\xdc\xe0\xdb\x4e\xcb\x21\x45\xab\xe6\x9a\xd0\x1c\x26\x31\xd4\xe2\x6c\xfa\xaf\xc4\xf5\xcc\x4a\xd7\xca\x8b\x10\x9d\xa3\x41\xbe\xf2\x72\x51\x70\x59\xb4\x45\x4c\xad\xb8\xee\xac\xf9\xb6\x48\xb3\x1d\x1c\x4f\xcb\x4f\x09\xd8\x87\x37\x9a\x31\xf6\x37\xda\xc1\x52\xb6\x11\xa6\xe9\x67\x41\xb5\x76\x94\xa3\x5a\x7c\xa5\x1a\xbd\x6f\xed\x07\x09\xe9\x91\x65\x56\x44\x4f\x69\xcd\x12\x74\xe6\x8a\xe6\xfb\x1a\x1e\xf5\xd1\xcf\x58\x82\xde\x86\x24\x1a\xe0\xf1\xd1\x88\x93\x9a\xbc\xad\x00\xaf\x2f\xa4\x69\xc1\x71\xbc\x50\x36\xa7\xd8\x3c\x3d\x2c\xf7\x37\xb3\xf9\x8f\xe5\xa3\xc1\x0c\x81\xe3\xba\xae\xcf\x5a\x2f\x64\x58\xa2\xbd\x28\x62\x81\xe3\x7a\x0c\x1f\xe2\x9d\x5a\x2e\x86\xaa\x50\xe0\xb8\x51\x8c\x99\x44\xc9\x33\x79\xea\xcc\x61\x73\x20\x11\xc6\xad\x43\x78\x26\xc1\x7a\x38\x6a\xf9\x6d\x21\x57\x97\x2c\xcd\x83\x65\x0d\x8e\xab\x3c\x2c\x72\x50\xe9\xe8\xe2\x11\xbd\x30\x46\xc4\xf3\x47\x51\xaa\xac\x15\x40\x04\xc7\x8b\x3d\xe2\x2c\x6a\x5c\xbf\x22\x87\x55\x8e\x77\x3e\x43\x9a\xd4\x5b\x9e\x55\xed\x1d\x7a\x89\x44\xea\x17\xe3\x3e\xda\xa0\xa3\x15\x5c\x6c\x9c\x24\x52\x84\x7f\x5e\xcf\xaf\x37\x62\x82\xe3\xc7\x1c\xb7\xa0\x92\xe7\x8a\x17\x83\x35\x0d\x4e\xa0\x22\x9f\x54\x85\xbe\xee\x8a\x42\x55\xfd\xc4\x3f\x38\xa1\x4b\x3c\x24\x4d\xe8\xdb\xca\xa8\x77\x0b\x03\x9c\x30\x14\xd2\x94\x81\x9a\xb0\xba\xef\x59\x83\x13\x0a\x6a\xe4\xa8\xa0\xb1\x39\x8d\xd3\xf8\x77\x0c\x2b\x38\x4c\x46\x21\xa9\x5c\x8e\x6b\xda\x53\xb5\xb1\x31\x4e\x09\x9c\xc8\x55\x28\xcc\xd0\x61\x05\x66\x87\x69\xeb\x0c\x4e\xec\x6a\xbf\xed\x61\xde\xfb\xf6\xd6\x63\xe9\xab\xb6\xbc\x84\x6e\x5c\xab\x64\x39\xbc\x56\x0c\x02\xe1\xe5\x96\x53\xae\x04\xe8\x7d\xa1\x44\xfa\x48\x7f\xdc\x04\x41\x48\x56\x73\xe5\x2e\xb8\xe3\x39\xd0\x76\xec\x9e\xad\xca\x7a\x07\xc8\x03\x47\xb8\x31\x7a\xb1\x27\x94\xb8\xb9\xf9\x1a\x1c\x03\xc0\x17\x4d\xd9\x41\x0b\xbc\x99\xae\x27\xfe\x4d\x66\x17\x70\x24\x23\x49\xc0\xcd\xec\xf1\x6e\xb9\x7c\x5c\x74\x2f\x47\x72\x17\xc0\x6a\x32\xef\x4f\xbc\xfd\xe0\x52\x90\x45\x69\x1c\x21\xea\x92\x1c\xae\x46\x05\xa1\x95\xc0\xdd\xa5\xc3\x0a\x39\x38\x8d\x25\x95\x06\xd8\x90\x15\x4d\x18\x57\x8d\xbb\xb7\xc1\x01\xd7\xc5\xad\x0c\xb7\x9f\x75\x13\x67\xdc\xf2\x34\x3b\x97\xdd\xe7\x1d\xe5\x8f\xbe\x7d\x44\x08\x25\xb4\xa0\x86\xfc\x8c\x1d\x64\xed\xca\x00\xc1\xb0\x9b\xe2\xe1\x2c\xbf\xba\xbf\x25\x01\x35\x3d\xf5\x79\xa8\xaf\x58\x08\x68\xb6\xfe\xc6\x34\x15\x35\x3c\xe5\x8f\xf0\x81\x69\x90\x5b\x80\x6a\x5f\xe4\xd9\xd7\xfe\xe7\xea\xb9\x07\xa3\x00\x47\x7b\xa4\x7e\xbf\x58\xce\x57\xeb\xd9\xc3\xd6\x5e\x54\x0b\x02\x34\x1d\x79\x8a\xb9\xab\x2d\x72\x1f\x2d\x73\xd5\x9f\x02\x5a\x46\x28\xbf\x49\x73\xbe\x6b\x3e\xfc\x9e\x84\x15\x5c\xc7\x03\x30\xac\x9f\x77\xbc\xea\x50\xa7\xb1\x3d\x1e\xbb\x58\xc6\xfb\x4f\xf5\x8a\xcd\xce\xd3\x09\xea\x66\x1c\x61\x7f\x8e\xfc\x0d\x66\x39\xf2\xae\xd8\x9d\x10\xab\xd0\x26\xad\x3f\xfc\x9c\xae\xa3\x01\x13\x44\x5c\xa9\x6d\x7a\xb8\xf9\x6a\x3d\xbb\xc1\xbc\x71\x7d\xa1\xb0\x5b\x31\x2f\xac\x1d\x75\x03\xd0\x98\x00\x3d\x9e\xeb\xb4\xf9\x16\xf3\x22\xcd\xd1\x76\xf3\x23\x0c\x45\xb8\xae\xdd\x71\x28\x38\x16\xe8\x34\x61\xaf\x16\xbc\xe6\x93\x1d\x56\xe0\x32\xa9\x43\xd3\xac\x8c\x99\xe3\x21\x75\x93\x1d\x04\x31\x42\xa7\x6e\xd2\x5a\x16\x69\x3e\x4f\xeb\xaf\x2e\x1d\x02\x6e\xa4\x00\x2b\xf7\xd6\xb3\x1d\xde\x4b\xec\xd1\xdb\x2b\x89\x0b\xf4\x66\x37\x1f\xb7\x2b\x4f\x38\x56\xe0\xc6\x11\xc3\x46\xf7\x87\xe2\x40\x91\x89\x6d\x68\x23\xf1\xf0\xed\xf9\x38\xbe\x8e\x04\x8e\x10\xc7\x9e\xa4\xce\xef\x7a\x8c\x46\x67\x50\x31\x96\x5d\xc9\x8f\xba\x39\x67\x59\x75\xe4\x9d\x62\x19\xb8\x89\xa3\x30\x17\x63\xfa\x1e\xda\x66\x96\x0b\x96\xb8\xe1\x79\x93\x30\x49\x0c\xde\x78\x87\xca\xd0\x1b\x38\x51\xba\x7a\xce\xa9\xd2\x73\xca\xd2\xde\x55\x94\xef\x0a\xaa\x87\x61\x68\xbb\x83\xcf\x76\x6a\x24\x20\x30\xa6\x3e\xad\x16\x9f\xcd\x8a\xde\x8f\x66\x13\xf7\x03\x4c\x70\xee\x52\xb9\xe3\x72\x57\x50\xff\x6b\x7b\x30\x42\xdb\xb6\x9b\xf7\xf7\x39\x97\x47\x6a\x40\x43\x39\x7a\xaf\x3c\xd1\xda\xe4\xd8\x9f\xe1\x34\xfe\xba\xc2\x73\xd0\x2c\x52\xcc\x69\x48\x98\x86\x35\xf1\xd1\xdb\x10\x91\x36\x6c\xf7\xe4\xff\x5f\xd4\x8e\xc0\x15\x02\x12\x23\x05\x8e\x09\xaf\xa5\x29\xb3\x77\x23\xa4\xab\x70\x82\xa3\x2c\xf9\x1a\x90\x25\xce\x20\xfa\xa6\x62\x7b\xfb\xab\x20\x51\x96\x1f\xbf\xd9\xd4\x10\x11\xd0\x38\xee\x2f\xcd\xb7\xb4\xbc\xdc\x2d\x90\x1c\x1a\x3f\xc8\x06\x85\xf4\x80\x56\x5d\x65\xb4\x40\x94\x0c\x44\xdc\x63\x8b\x9d\x68\xb9\x05\x57\x01\x49\xae\x91\x19\xa3\x6e\x49\x73\x08\xa2\x98\x99\x8e\xb4\x09\x38\xc3\xe5\x32\xb7\x2e\xa2\x0b\x22\xc2\x8f\x53\x65\xa9\x04\xdf\xfb\x63\xc0\x6b\x67\xc7\x68\x27\x32\x05\xc9\x96\x8c\x60\x50\x86\x1c\x8d\xd7\x5c\x23\xa3\x5d\x3d\x70\x8a\xbe\x37\xb5\x5a\xb4\x8c\x4e\x36\x23\xf3\x24\xfe\x4d\xc1\xc4\x54\xfb\x13\x78\x8e\x17\x9a\x1c\x71\xb3\xc2\x26\x21\xd1\x17\x69\x6b\xf0\x1c\xc1\x98\xc5\x75\xbd\xf6\x75\x8c\xa6\x7a\x20\xcc\x6f\xdc\x28\x40\xb4\x0d\xe6\x47\x41\x91\x85\x1b\x16\x9d\xc0\x73\x85\x13\x87\x26\xfc\xc2\x45\xfd\xa4\x47\x37\xec\x99\xf4\x34\x51\x18\xf5\x94\xc4\xcc\x71\xdf\xa1\xfa\xb6\xf5\xba\x6f\xda\xce\x7d\xf0\x7c\x8f\x21\x5f\x08\x71\x37\x53\x14\x37\xba\x81\x20\x02\x2c\x49\x6e\x37\x77\xfd\xd5\xe9\x85\x9c\x27\xac\x15\xea\x2b\x2f\x7b\x27\xc0\x0b\x95\x87\xfb\x23\xf1\x25\x3e\x67\xbc\x0d\x05\x3c\xe6\x7b\x58\x78\xdc\xf0\x74\x70\xd6\xc8\xd5\x56\x8e\x7c\x79\xe4\xe9\x34\xd6\x1f\xbc\x88\x05\x58\x5a\x38\xa6\xb9\x89\xc1\xdb\x13\x24\x7e\x60\x30\x15\x0f\xe7\x5c\xbe\x7d\x75\x3c\x9f\xe0\x45\xd2\x75\xf8\xb0\x91\xc8\x0b\xff\x18\x7c\xc8\xd8\x17\xd8\xd8\x43\xd9\x89\xc6\x0e\x04\xfd\x9d\xe1\xff\x64\xb8\xbd\x58\xf8\xc8\xb6\xbe\xbd\xfb\x73\xd8\xb5\x06\x5e\xac\x9c\xd8\xf8\x00\x84\xe7\xbb\x6c\x4e\x02\x2f\xd6\x86\x55\xd5\xc4\xfc\x53\xd0\x23\xf0\x12\x1f\xc2\xd8\x26\x2e\x52\xc8\xeb\x67\x9e\xaa\x97\xd3\x15\x45\x60\xf0\x92\x88\xdb\x57\xb4\x3d\xf2\xb2\xed\x52\xa9\x1e\x90\x74\xde\xde\x61\x12\xd3\x72\x6b\x5e\x56\x13\xe5\xa6\xef\x70\x57\x16\x1f\xf5\x40\x84\x16\x3c\x1e\xba\x98\x27\xfa\x95\xd6\x24\x81\x8f\x52\x12\xf7\x45\xf6\xdb\x70\xce\xe3\x8c\xc4\x33\xe1\x9d\x67\x67\x4c\x8b\xed\xab\x9a\x1f\x60\x2f\x90\xcb\xb5\x6a\x69\x1e\xc0\xe3\x5c\xe1\x3d\x3f\xae\xd6\xb7\xb3\x49\x1d\xfd\xdf\xb1\x70\x99\x13\x09\x5f\x23\x4a\xc3\x64\x9f\x80\x5f\xf8\xbb\x9e\x08\x49\xad\x64\x85\x39\x11\x62\x2a\x9c\x9e\x86\x82\x4b\xc7\x14\xa0\x26\x94\x13\x46\x63\x41\xb6\x2a\x55\x69\x0e\x25\xa1\xf7\x86\x37\x27\x25\x60\x0b\x61\x2a\x0b\x8c\x5c\x42\xfb\xf8\x8a\x11\xeb\xd3\x02\x50\xde\xca\xce\xf9\xdf\x34\x16\x98\x1f\x43\xe0\x06\x66\xb1\xec\x8a\x63\x31\xe8\x11\xb5\x43\x14\xc3\x72\xd4\xf3\xec\x61\x68\xf1\x86\xcf\xa0\x81\x1c\x91\xff\xef\xaf\x07\xfb\x4b\xad\x23\xd9\xa7\x64\x7c\xa6\xa0\xf4\x1b\x9a\x48\xf0\xdd\x84\x38\xd9\x2a\xa8\xa7\x38\xe0\xc1\xf7\x7c\x8d\x7d\x31\xe4\x60\x5d\xec\x9c\xfd\xd9\xef\x7b\xa1\xe3\x39\x36\x3f\x3a\xee\xf4\x04\xdf\x77\x23\x54\xa0\xfe\x2f\xb5\x3b\xcc\x32\xa3\x46\x61\xb7\x38\xdf\x0f\x82\xd0\x94\x0e\x88\xfd\xec\x07\x7c\xb5\xc7\x18\x20\x66\x1f\x9b\xd7\x53\x58\xe9\x75\x9a\x6f\xb0\xab\xdf\x69\x87\xc4\x4a\x87\x03\x9e\xf3\x6b\xa8\x00\xf0\x7d\xa9\x70\xc3\x23\x5d\x0b\x59\x13\xe5\x77\xe7\x07\xf8\x81\x13\xa2\x59\x4b\xad\xd4\x59\xf7\xdb\xc0\x89\x91\x5e\x95\xf2\x79\x23\xa0\x0e\xf8\xa1\x8a\x78\x6c\x2c\x05\xcf\x4d\x0a\xc7\xa4\xf3\xec\xad\xb2\x18\x1c\x62\x68\xb5\x10\x9a\x14\xaa\x5e\x8b\xec\xd5\xdd\xdc\x67\x3c\xc2\x15\x41\xb5\xb7\xe1\x8d\x45\xae\x87\x88\xda\x9b\xc6\x3d\xc0\xae\x9c\x1c\xac\x8e\x1c\xf8\x11\xe3\xd8\xf4\xfd\x61\xbd\x07\xdc\x72\xc7\xa5\x53\xf0\xa3\xc4\x43\x18\xd0\x6c\xb5\x59\x6c\x9e\x9e\xf7\xf3\x87\xd9\x6a\xbd\x9f\xad\xd7\x4f\x2f\x8f\xbb\xf6\x64\x9a\x23\x16\x45\x15\x39\x3c\x9d\x7a\x49\x6c\xf0\x13\xe9\xe1\x02\x21\x62\xab\x6f\xfc\x77\x3f\xd1\xc4\xf5\x9c\x56\x77\x90\xc3\xf6\x2b\xaf\x5f\xa1\x4a\xdb\x13\x71\x87\x47\x12\x53\x61\x55\x5d\x1a\xb2\x82\x53\x06\xab\x1a\x8e\x63\x78\x14\xf8\x3c\x50\x08\x61\x7d\xe5\xb9\xca\x60\xb3\x5d\xcf\x69\xc6\xee\x3e\x2f\x1a\x19\xaf\x2c\xd1\xe9\x25\xdb\x9c\x18\x48\xab\x6e\x97\x42\xe9\x8d\x5e\x16\x0f\x89\x90\x91\x52\x0f\xdf\x67\x6b\xbe\xfb\xab\x3d\x5d\xe4\xa2\x13\xa0\xa7\xa0\xec\x76\x8c\xd4\x4c\x98\x04\x64\x63\xdc\x08\x7f\xd0\x1e\xd5\xda\x37\x3c\xf0\xdb\x13\xe2\x62\x26\xdc\x01\x5f\xf8\x2e\x4e\xe1\x3d\x42\xaf\xb6\x50\x7f\x33\xe3\x44\xc2\x04\xb5\xb5\x18\xd1\xab\x81\xe8\x04\xf8\x02\x88\xdd\x95\xa0\x10\x32\xad\xd2\x22\x5f\xa4\x25\x98\x1c\xb0\x89\xa4\x7d\xe9\x11\x30\xf0\x94\xf1\xaf\xc6\x93\x6e\x61\x7f\xe0\xcb\x04\xc8\x85\xa0\xe6\x7b\xac\xbc\xd8\x43\xdc\xc1\x7e\x6c\x12\xff\xda\xaf\x67\x9b\x1f\xcb\xdd\xea\xf1\xae\x3d\x2e\x84\x2f\xac\xc8\x72\x17\x9f\x4f\xef\x38\xbe\x04\x85\x3b\x0e\x25\x91\x9a\x17\xb7\x7b\xda\x63\x6f\x41\xd7\x57\x0f\xbe\x12\xb1\x17\x0f\xb1\xa0\x45\xd9\xd6\x2f\x87\xe6\x11\x14\x75\x3a\xe6\x75\xb5\xb0\xd2\xe8\xfd\x04\xa3\xaf\x39\x65\x2f\xd2\xea\xe1\x44\x02\x11\x74\x20\x70\x02\x67\x40\x43\x03\xfc\x68\x34\x10\x75\x0d\x25\x5b\x17\x79\xfd\x5a\x75\x83\x25\x5e\x66\x5f\x41\xbd\xa0\xf6\xe6\xc9\x58\x3d\x70\x42\xd2\x9b\x68\xe2\x60\x8f\x93\x4a\xfb\x74\x3f\x15\x04\x4e\x92\xa0\xbb\xd0\x02\x1f\x0c\xa1\xdb\xc5\x54\xe8\x3b\x42\x81\x1b\xc4\x08\x80\x6d\xa9\xbc\xa7\x43\x84\xc0\x0d\x83\x81\xdc\xe9\x4b\x9e\xfe\xe7\x0c\xa3\x2c\x3c\x04\x2e\x73\x19\x02\xbe\xdf\x2a\xc4\x68\xd8\x3f\x47\x4c\x9a\xea\x67\x5a\x36\x73\xae\xdd\x20\x03\xcf\x65\xd2\x6d\x09\x33\x3b\x4e\x17\x92\x18\x19\xde\x84\x27\x1c\xb4\x0a\x58\xcd\x99\x80\xbe\x43\xe0\xe9\x18\xe1\x6b\xf3\xc5\xfc\x8f\xee\x4f\x8c\x94\xb5\x5f\x30\x19\xfc\x47\xff\xf1\x7d\x27\xf6\xcc\x63\xc9\xb7\x3e\xca\x69\xf4\x72\x7d\x41\xd2\xc2\x9c\xfa\x65\x17\x40\x1e\xff\xf4\x76\x14\x34\xb3\x01\x2b\xdc\x05\x2d\x79\x7b\x2b\x41\xac\x03\x31\xc0\xa6\x1c\x26\xd4\xc8\x9b\x73\xb1\xc0\xfc\x24\x74\x62\x04\x2b\x98\xc6\x3f\x4c\x9b\xaf\x67\x7f\x36\xff\x6d\x3d\xde\x80\x85\x01\xe6\xd6\x4f\x94\x6f\xa2\xd8\x6b\xa2\x48\x0d\x01\x63\x3e\x69\x8e\x41\x75\x3e\xc2\x33\xad\xdd\xf6\x34\x52\xe0\x5e\x34\x53\x6a\xfe\x9a\x9e\x76\x70\x3c\xe1\x3a\x3a\x5f\xe2\x29\x21\x60\xa0\xd0\x9b\x47\x9b\xb0\x2b\xb6\x78\xb5\xbe\x85\x08\x22\x57\x05\xa6\xf3\x97\xbe\xaa\xbd\x4e\x14\x2b\x2c\xe8\x9b\xdb\xed\xd3\xa8\x4f\xcf\xbd\xd8\x8f\xd0\x59\x38\xa5\xf2\xed\xe5\x64\x4f\x13\x6b\xd6\x73\x65\x48\x32\xcb\x1c\x4a\x14\x51\x46\x1a\x1d\xe7\x73\x35\xb8\x31\xee\xb3\x30\x6a\x59\x84\xfa\x41\x52\xc0\x05\x31\x2d\xd7\x20\x5f\xf3\x54\xf2\x6c\x94\x1e\x08\x84\xaf\xc2\x64\x08\x66\x9f\x82\xb1\x43\x20\x94\x8b\xde\x91\x69\xb0\x26\xf2\xfe\x75\x9a\xd7\x69\x7e\xb0\x50\x6b\x33\x54\x06\x1c\xfb\x11\xb2\x73\xfe\x55\x9a\xb3\x35\x01\x7b\x8b\x12\x82\x40\x32\xe2\x2c\x3a\x15\x17\xbd\xe4\x66\x84\xf2\x38\x7e\xbc\xc5\xba\x9d\xf8\xca\x27\xe9\xed\x1e\x24\xe7\x5b\x7b\x1a\xa8\x30\x41\x87\x63\xde\xeb\x42\x19\xad\x2f\x15\x4b\x94\x03\x81\x4f\x28\x65\x5a\xc1\xe0\xed\x01\xe7\x6e\xd8\xed\xf0\x83\x63\x3a\xf0\x71\xdb\xe1\x59\x36\x8e\xb3\x03\xad\x1c\x69\x70\x83\x1b\xd2\x8f\x1d\xb9\x42\xa1\xe3\x85\xc8\x8d\x82\x7d\x8e\x13\x12\xe2\x57\xf6\x7e\xfb\xeb\x40\x20\x1a\x66\xd4\x00\xf5\x3d\x17\x1b\x84\x0e\xf8\x98\xce\xad\xd2\x23\x12\x1a\x3c\xf5\xf8\x43\xc7\x95\xee\x89\x7f\xe2\x7e\x65\x13\x42\xd7\xf5\xa9\x6d\x1a\x7d\x44\xfb\xf1\x43\x37\xe1\xe8\x22\xfc\xbb\x48\xf3\x3b\x7e\x04\xf3\x02\xa6\x35\x50\xe3\xf6\x47\x4a\x75\x0a\xa8\x0f\x45\x5d\x17\xcf\xbc\xe4\xc7\xdf\x3d\x91\x2b\x95\x66\x17\x6d\x11\xbd\xae\xb7\xfe\xd6\x10\x7a\x8a\x21\x79\x9d\xfd\x86\xa1\xef\x09\xee\xd9\x66\x37\xf9\x76\x40\xf3\xb6\x3a\xf2\x6b\xe5\xa8\xd0\xf7\x99\xef\x98\x76\x3e\x94\x7f\x9e\xee\xcd\x34\xa3\x03\x97\x90\x4d\xb3\x2c\xa3\x4c\xcf\xc0\x31\x09\xc3\x98\x63\xb6\x65\xb9\xeb\xcb\xca\x40\xc8\x34\xf9\xfe\x06\xeb\x84\x81\x1c\x16\x28\x7a\x5d\x5c\x10\x46\x81\x8b\x50\xee\xc7\xe5\x4b\xab\x23\x05\x61\x0c\x2c\xe4\x3d\x25\x7b\x53\xf7\xea\x41\x4d\x20\x4c\x22\x72\xb4\xe7\xaf\x30\x30\x16\x61\x92\x38\x61\xd0\xd5\xaa\x97\xbb\xfb\x2b\xaf\x81\x33\xed\x46\x9d\x6f\x30\x33\xfb\xf8\xf0\xf1\x78\x94\x0c\xe9\xdc\xbe\xeb\x11\x84\x90\x8b\x04\x93\x47\x37\x0f\x4f\xf3\x1f\xdb\xfd\xf3\x72\xb3\x47\x22\xee\xf6\x74\x32\x11\xee\x88\xdf\xf9\x4a\x3c\x6f\x7e\x21\x1c\x8f\x1b\x0c\xec\xbc\x94\x96\xba\x62\x72\x9b\x0d\x85\xe7\x22\x71\xe3\x91\x7f\xde\x40\x3b\x97\x45\x20\xb1\x9e\x84\x8c\x0a\xbb\xbe\xa6\x13\x84\x82\x39\x48\xd0\x91\x15\xf2\x6d\xa0\xb5\x36\x7a\x2e\x19\x90\x90\xfc\x66\xb3\xd9\xec\x07\xaf\x5b\x4a\x17\x37\x55\x7a\x22\xa3\x09\x89\x14\xa1\x8b\xe2\xa2\x6d\xfc\x6a\x54\x30\xbc\x9a\x72\x9d\xc0\xeb\xc0\x74\x86\x41\xe1\x22\x9f\xfc\x4d\xef\x20\x84\x2a\x26\xbf\x0b\xcb\x7c\xc7\xe2\xcf\xaf\xff\xda\x3b\x56\x9a\x9a\xdc\xaa\xf4\x90\xbf\x9c\x16\x90\xc1\x81\xd7\xa0\xb0\x87\x66\xe2\xe3\x4e\x13\x15\x40\x08\x8e\x83\x10\xcb\xfd\xed\xea\x76\xf7\x97\x3d\x39\x48\x07\x29\x8f\xf6\x3d\x06\xf7\x0d\x62\x89\x47\x3e\x59\xa8\x21\x22\x1a\x27\xdb\xe3\x36\x98\x78\xcc\x49\x24\x96\xa3\x0c\x08\x17\xbd\xda\x6a\x66\x3f\x2a\x73\x7d\x37\x51\x43\x6a\xb4\xae\xd1\xda\x8e\x89\x42\xd7\xbb\xb0\x2b\x8f\x17\xfe\x35\xf3\xdc\x04\xdd\x33\x64\xef\x69\xa6\xd8\x2d\x8c\x62\x19\xe6\x05\x21\xa6\x3d\xd2\xbc\x6e\x5c\xf4\x6c\x18\x2e\x31\x0f\xb4\x30\x01\xd1\xd3\xc9\x74\x7c\x0c\x40\x7a\x83\x89\xca\x7c\x27\x20\xbc\xd9\x97\x68\x91\x92\xf6\x50\x44\xba\xf1\xcf\x65\xba\x92\xc5\xb7\xc5\xa3\x2b\xe7\x4e\x34\x5a\xe1\x3b\x5b\x2a\xe8\x25\x44\x99\x2f\x35\x7e\xb4\xdd\x47\xc1\x73\x55\x7f\x74\x07\x94\x8c\x4d\x56\x65\xaf\xa0\xa5\xa5\xde\x9f\x4b\x6b\xab\x58\x20\x88\x14\xf8\x03\xd2\x5f\x3c\xaf\x41\x3d\x0d\xc5\x51\x81\x05\x12\xa4\xdb\xab\xe1\xd9\x5f\x86\x1e\x51\x89\x3f\xa4\x55\xfd\x58\xd4\x86\xb9\xd3\x02\x2c\x81\x31\x27\xc0\xcc\x23\xaa\x40\xe3\x34\xf8\xe9\xb7\xc7\x00\x5c\x31\x60\xd6\x6d\xec\x86\x71\xec\xcc\x98\x04\x98\x95\x25\xfb\xe7\x99\xe7\x75\x3a\x12\xdf\x6a\x46\xc4\x48\x83\x31\xe7\x65\x91\xf5\xd7\x2f\xe3\x3c\xf6\x9d\x5e\x29\x26\x6d\xbf\x6d\x33\x11\x1e\xe1\x63\x0d\x35\xef\x15\x19\x99\xf0\x18\xc6\x12\x15\xd1\xeb\x19\x8d\xc6\x75\x6f\x40\xe2\x61\xd7\x2e\xf6\x8e\x75\xc4\x9f\x63\xdd\x30\x60\x42\x28\xec\x16\xda\x9b\x7a\x32\x3d\xe1\x2c\xaf\x3e\xc6\x1c\x73\x43\x3c\x12\x30\x29\x85\xdd\x31\x8d\x06\x92\x98\xaa\x6d\x30\xe5\xc6\x20\x6d\xa3\x5d\x81\x3c\xde\xe3\x11\x21\x73\x85\xd9\x0b\x5f\xf2\xaa\xc8\x0c\x1e\x77\x57\xd8\xde\x98\xd1\x4d\x83\x9b\x20\x8a\xa2\x99\x5b\xd3\x4e\x1f\x6b\x5c\x1b\xea\xe0\x3c\x57\x35\xc0\x90\x3b\x09\x18\x44\x09\x26\x46\x91\xc2\x8f\xf2\xc6\xd5\xd8\xf9\x62\xda\x23\x84\x52\x4b\x21\x31\x6d\x98\x99\xf6\x01\xaf\x65\xb5\x2a\x36\xb3\x9d\xdd\x6c\x98\x0e\x42\xd6\xc9\xe0\x63\x71\xf4\x5b\x60\xae\xf1\x63\x22\x47\x28\xdc\xc4\x8e\x69\xde\xac\x66\x62\xea\xec\x61\xbe\x20\x72\x3d\x29\x5d\x6b\x59\x8e\x69\x3e\x2f\x2c\x25\x9a\x1d\x00\x0c\x1d\xd2\xd5\xe2\x4f\xfb\x27\xcf\x09\x11\x87\x7f\x07\xf5\x43\xca\xab\x22\x7f\xd9\x3c\x7c\xef\x18\x45\x9e\x47\xdc\x5d\x6d\x5d\xb7\x4b\x3a\x4f\x27\x6c\x23\x2f\x88\xd1\x9f\xb5\x52\x8e\xdb\xe5\xc3\xc3\xea\xf1\x6e\xff\x32\xef\x5a\xc4\x21\xf2\x12\xc5\x75\x2b\xe8\xba\xa9\x7e\xf1\x43\x87\x77\x86\xc8\x57\x02\x85\x03\x6e\x21\x87\xb2\xe8\xaf\x96\x88\x71\x82\x43\x5a\xcc\xf8\xda\x2a\x63\x7d\x97\xff\x8d\x22\x57\xa0\xa7\xb1\x3d\x4d\x25\xb1\xfb\xb9\xa9\x28\x12\x3e\x32\xb9\xf0\x3c\x3f\xf3\x6c\x2f\xd3\x12\x69\xbb\xd2\xfc\xb0\xef\xeb\xca\x40\x14\xc7\x41\x60\x62\x46\xe4\x7e\xfb\xce\x2d\x89\xe2\x58\xe3\x03\xdf\x3f\x3d\x3c\x2d\x96\xf3\x1f\xdb\xf6\x2c\x3a\xe1\x06\x1e\x3d\xe7\xa5\x1a\xb0\x8e\x9b\x21\x49\x60\x64\xa2\xee\x2c\x7c\x2e\x4a\x12\x4e\x74\x97\x1c\xdb\xd1\x86\x09\xa1\x66\xcd\xb6\x19\xde\x28\x51\x11\x02\xd5\xb9\x52\xcf\x45\x96\xca\xaf\xcd\x39\x33\xdb\x4f\x70\x21\xf9\x33\x3d\x0b\xb8\xc7\x88\xee\x11\xb2\x34\x87\xda\x9a\xec\x88\x27\x44\x6e\xb3\xff\x48\xf3\x7f\xa0\xd4\xf5\x98\x7f\xdd\x0c\x14\x52\x12\x51\xe1\xf9\x7b\xe6\x60\x88\x24\x08\xcc\x00\xed\xee\x57\x9b\xc5\x7e\xb7\x5a\x6e\xfa\x0b\x2a\x52\xcc\xc3\x4e\xd4\xef\xc4\x50\xec\x50\x11\x04\x66\xfb\x3e\xf5\xa9\x9e\xda\x4b\x29\xc9\xf0\x93\x54\xa5\xb4\xa7\x07\xdf\x47\x15\x23\xa2\xd9\xc8\xd5\x25\x6b\x4c\x2f\x0e\x88\x20\xe1\x9a\xba\x40\x3b\x19\x17\xb8\xe2\xf2\x47\x90\x90\x4a\xf1\xba\x50\x08\x0f\xbe\x49\xb3\x1e\xf7\x7e\xf7\xb9\x74\xe8\x62\x33\xda\xfe\x54\x16\x12\xaa\x8a\xd8\x3c\xaf\x9c\x54\x27\xae\x67\xf4\x6a\xb6\x96\xb9\x78\x58\x26\x8e\x34\x77\xd0\x2f\xd8\xc0\xd7\x23\xb2\x61\x99\x67\x8d\x1d\x1e\x87\xca\x94\x79\xf7\xff\x6e\x79\x31\x20\x76\xa4\x44\x5c\x9e\xb4\x1c\x7c\xdd\xce\x12\x3b\x8a\xa0\xe1\xff\x7c\x79\xda\xbc\xac\xdb\xbf\x42\x14\x99\xde\xc8\xf4\x78\x3e\xfe\x82\x94\xaa\xeb\xf6\xb8\x1b\x25\x08\x51\xc0\xbe\x70\x95\x0d\xed\x79\xec\x4a\xa5\x4c\x89\x74\x55\xc3\xd1\x46\x93\xdf\xd5\x3d\x8d\x9d\x8c\x3d\xce\xb1\xab\xb9\xf1\x30\xbf\x65\xb2\x80\xd8\x77\x25\x42\xfd\xc8\x14\xef\x05\xe1\x77\xf6\x68\x5a\xff\x18\x0d\x0d\xc2\xa8\xd5\xa8\xaf\x6e\x8b\xf2\x02\x74\x11\xfb\x9a\x23\x7e\x04\x65\xcf\x54\xca\x73\xc3\x5f\x7d\xd1\x0f\x08\x71\xc0\x89\xba\xc5\xf0\xa4\xa0\x63\x7e\xad\x50\x1a\x07\x82\xd4\x56\x7f\x2e\xb7\xbb\xc6\x6a\x7a\xfb\x59\xbf\x1e\x11\x07\x10\x63\x46\x60\x55\x57\x73\xec\x53\xba\x2f\x8e\x83\x5c\x43\x1c\xba\x6e\xdb\xd9\x0e\x07\xb7\xfd\xb3\x52\xa1\xa9\xc0\xde\x3d\x6f\xd7\xfc\xb3\x95\x40\x85\x98\x39\x5a\x7a\x56\x7c\x3b\xad\xe0\xb2\xb3\x0a\x62\x16\x49\x34\x38\x96\x67\x0b\x15\x99\x2c\xa9\x47\x7b\x22\x29\xdc\x4e\x5f\xe6\x0e\xea\x59\x55\xc1\x74\x7b\x12\xc4\x51\x48\xd9\x9d\x4d\xbe\x26\x68\xd1\x06\xfe\x63\x4f\x14\x89\x80\xb9\x7d\xb0\xc9\x6d\x59\xe4\xa8\x8d\x7d\x5b\x94\xeb\xae\xb6\x3f\xa0\x0b\xb7\xbf\x05\x85\xc8\x16\xbb\x01\x3d\xcf\x36\xbb\xd5\x7c\xf5\x6c\x98\x5c\x07\xaf\x33\xd2\x01\x96\x05\xf7\xcd\x26\xbf\x29\x32\xa0\xde\x99\x89\xd4\x42\x1c\xbb\x89\x6b\x4a\xde\x3f\x79\x99\xf2\xdc\x60\xb0\xa7\x1f\x2e\x09\x3c\xc7\x28\x65\x3d\xa4\x93\xac\xef\x10\x27\x31\x35\x05\x59\x4c\xf3\x0e\x8e\xa7\xa2\xe4\xd9\x4b\x7e\xf1\xf6\xb9\x1f\x70\x93\x32\xdc\x15\x93\x5d\x95\x10\x73\xe9\x63\x95\x09\x0b\xec\x2b\x05\xe8\x84\x5a\x59\xac\x3f\xda\x41\x21\xee\x83\xb4\x59\x52\xfb\xd3\xf7\xc9\xaf\x58\x3a\x1c\x67\x07\xf5\xa5\x35\x3e\xaf\x19\x36\x3d\x3a\x24\xbe\xf8\xc6\x25\x3d\x3e\x97\xc5\x71\xb0\x7b\xc7\x52\xe8\x48\x21\xe7\x0e\xd4\x50\x1e\xd3\x1c\x0c\x27\xcf\xf0\x2c\xc0\x98\x20\xf6\x87\x0f\x9b\x13\x1c\xbe\x3b\x48\x04\x0e\xf8\x09\xf9\xb9\x42\xe5\x11\x73\x85\xc4\x61\x2e\x7a\xfa\xfc\xac\xd2\x1a\xdb\x4f\x1a\x5f\xfc\x7c\x09\xa7\xb9\xb8\xf7\xc4\x61\x0c\x51\xa7\x3d\x6d\x57\xd6\x9e\x96\x73\xc4\x90\xca\x73\x6b\x28\x13\xd7\x77\x71\x4a\xd4\x9f\x3b\x5e\xbd\xad\x47\x64\x50\x90\xb8\xb1\xeb\xd9\x6c\xeb\x91\x67\xd9\x9c\x9f\x5a\x48\x53\x9f\x45\xfb\x1a\xda\x32\xf1\xb8\x50\x7d\x38\x9a\x85\x5c\xb5\x0f\xeb\x7b\x89\xa1\x56\xc5\xca\xce\x72\x24\x85\x01\x89\x1f\x50\xeb\x25\x0a\xee\x51\x47\xca\x7d\x2b\x2f\x00\x89\x9f\x78\x42\xb4\x70\x99\xe5\xe1\xd0\x9e\x39\x08\x7d\x69\x48\x82\x6a\x78\xd2\x5d\xe5\x2d\x09\xb8\xc6\x6e\xb0\xe5\xe2\xb1\xfd\x93\x74\x70\xdb\x6c\x53\x34\x13\x4c\xfb\x90\x84\x0e\x89\x01\x1d\xf9\xe7\xee\xb5\x84\xea\xb5\x65\xa4\x83\x84\xf9\x1c\xd7\x42\x9d\x1e\x01\x85\xc9\x5a\x84\xc8\xe8\x24\x51\xd4\xb6\x17\xe1\x27\xb2\x27\x88\x64\x88\x2b\x19\xea\xd7\x5d\xf1\x50\xbc\xc3\xd7\xa6\x83\xcd\x26\x91\x76\x85\xf9\x12\x56\xa8\x72\xf7\x39\xab\x86\xde\xe0\xc0\x11\x49\xe2\x20\x42\xfd\xb5\x13\x2f\xeb\x1c\xca\x8e\xde\xd0\x1e\x67\xc4\x86\x96\x56\xd5\x19\xca\xc7\x0e\x5b\x98\xc4\x4c\xa0\xa9\xb5\xf9\x58\xa3\x99\x7a\x0b\x8d\xf3\xac\xd3\xf2\x78\x45\x04\x3e\xb6\xbf\xe7\x81\x61\x7f\x04\x4c\x38\xcf\x72\xd5\x63\xae\x9e\xf4\xba\x93\xc4\x4f\x92\xa0\xed\xa2\x7b\xc9\x75\x51\xbe\x8d\x51\x26\x49\x12\x6a\x65\xbc\x05\x6c\x69\x4c\xff\x0b\x33\xcb\xf1\x39\x9a\x37\x89\xa2\x92\x35\xc5\xa3\x35\x96\xed\xda\xb9\xc1\x1d\x82\x4c\xa7\x15\xc6\xd1\xab\xe7\xdb\x2d\x16\xad\x5f\x9b\x99\xd5\x73\x90\x12\xee\x13\x73\xf7\xfa\x69\xd3\xcd\x1f\x11\x04\xae\xc5\x02\x9d\xf8\x47\xde\xed\x36\x9d\x44\xc2\xf0\x66\x44\xe8\x60\x22\xa9\xf1\x60\x61\xdc\x82\x91\x08\x21\x10\x70\x68\x6b\x47\x58\x36\xac\x5e\xd3\x93\x29\x8c\x5f\xe2\x91\x13\x01\x09\x26\x28\xaa\xf4\x90\xb7\xb1\xe1\xa4\x17\x99\x48\xd7\x0f\x0d\x02\xf5\xf3\xcb\x24\x34\xed\x93\xc8\x10\x22\x02\x07\x6c\x1b\x1b\xb6\xfc\xac\x21\xaf\xc6\xcd\xea\x90\xc8\xc4\xe5\x71\x0b\x17\x29\x6b\x93\x91\x1e\x4e\x37\xd0\x02\xd1\xaa\xc4\xf9\xbd\x2b\x7e\x01\xbc\x4d\xef\x2d\x89\x8e\x99\xec\xa8\x0a\x9d\x3f\x26\x5c\x53\xee\x28\xca\xb2\xd8\x97\x72\x5b\x16\xc7\x6f\xeb\x69\xdc\xd5\x09\xb7\x74\xd8\xa7\xb4\x2a\x14\x0c\xb0\x59\xdc\xf3\x05\x22\x00\x6a\xa8\xda\x4a\x43\x73\xd6\x45\x01\xd5\x63\x51\xcf\x4c\x6a\x13\xff\xde\xaa\x8c\xec\x5e\x79\x7d\xcf\x9b\xe3\x37\x00\xb9\xe5\xd4\xb5\xa7\x6c\x66\x87\x6f\x79\x63\x0d\xd7\x7f\xfa\xdf\x6b\x08\x54\xee\x73\x85\x8e\x94\xc6\x92\xd1\x73\x09\x2b\x2b\xd3\x02\xdc\xd7\x94\x24\x3e\x40\x46\xfd\x6a\xbd\x66\xe2\xce\xb9\xe6\x41\x98\xe0\x5c\xa1\xc4\xc8\x6b\x59\xe4\xd0\x9f\xb0\x9c\x39\x80\xb9\x43\x5d\x9c\xcb\xfa\xb5\xf9\x06\x94\x92\xb5\x87\x63\x85\x65\xca\x07\xfe\xdf\xaf\x79\xa1\x88\x19\xaa\x3d\xa8\x18\xba\xb1\x5c\x60\x2a\x66\xb0\x49\x9a\x21\x11\x38\x28\x4a\xb6\x83\xaa\x0e\x87\xb3\x84\xf3\x48\xa0\xc2\xc6\x73\x51\x64\x5b\x38\x94\x70\xa0\xa0\x7f\x0c\xa8\xb6\xc3\x15\x95\xd5\xf7\xd4\x67\x89\x94\x24\x25\xe4\xc3\x59\xc5\xa5\xcf\x71\xbb\x55\xe9\xfb\x9c\x57\xaf\xfd\xdb\x95\xa1\x89\x20\xa1\x1e\x6c\xa0\x5c\x86\xa4\x58\x41\x7c\x96\x43\x3c\x80\xe7\xd8\x41\x9a\xf0\x00\x24\x9a\x35\x0d\x97\xe6\xca\x8b\xb1\xbd\xfb\xe6\x66\x37\xb1\x0a\xb9\x52\x1c\xed\x24\xc9\xde\xef\xeb\x62\x8f\x06\x64\x78\x0e\x70\x1c\xeb\x76\xad\xf9\x27\x3e\xe6\xc0\xef\x6a\x87\x29\x84\x59\x6e\x69\x23\xbc\x82\xe7\xe5\x3a\xa2\xbd\x4b\x18\x4a\xcd\xe7\xa2\xaa\x9b\x59\x34\xe9\x8c\x73\x1d\x13\x9f\x8c\x2c\x72\x99\x9d\x15\xec\x8a\x33\xbe\x8b\x6b\x5e\x1f\xd7\x22\xd1\xbc\x2d\xd9\x53\xd6\x68\xa0\x30\x37\x34\x2e\x5c\x4b\x8f\x93\xca\x55\x55\xf3\x2c\x1b\x12\x83\xd2\x18\xe1\xb8\x2e\xe5\xf2\x28\x37\x87\xb4\xe7\x43\xec\x85\x70\x44\x10\x9a\xcb\xde\x65\x85\xe0\x59\xb5\xed\xc9\xd8\x98\x41\x6e\x40\xbd\xa6\x69\x75\x5f\x94\x15\xac\xf2\x6d\x7d\x56\xe3\x31\x00\x58\xe5\x9d\xf3\x5c\x7d\x3d\xf0\x31\xb6\x5b\x78\x61\x88\xc9\x3c\x95\xbe\x9f\x78\x6a\xd7\xb1\xf0\xa4\x87\x1b\x7b\xc5\x35\x60\x35\x6b\xf7\x3b\xab\x73\xc1\xcf\xde\xad\x41\xe1\x47\x01\x63\x2d\xff\x47\xeb\x30\x81\xfa\x4e\xee\x08\x84\xcf\x23\xcb\x1a\x74\x03\xf5\x0f\xf8\x1a\x3d\x5b\x10\x00\x5a\x88\xd5\xfc\x09\xd1\x82\x5f\x27\xbb\x61\x8b\x80\x47\xc8\xf1\x7e\x84\xf2\x2d\x83\x4d\xd1\xb6\x9f\x88\xd0\x0d\xd0\x5d\x4e\xab\x66\x9b\xa0\xbe\x9c\x89\xe8\x48\x84\x2e\xb3\xa0\xf7\xbb\xc7\xcd\xf7\x89\x09\x11\x32\xae\x82\x8e\x39\xc0\xe6\x67\xef\x7a\xba\x56\x83\x5c\xab\x08\x25\xc3\x16\x79\x34\xbd\xaf\x65\xf1\x51\xd1\xd6\xf6\xc0\x89\x51\xfd\x1d\xb1\x48\xcb\x66\xd3\x97\x60\xff\x67\x3b\x3b\x98\xab\xdc\xd0\x66\x0a\xb1\xc0\x66\x4a\xff\xc3\xbb\x62\x91\xc6\xcc\x4a\x5a\x91\x4c\xb1\xf9\x73\xe4\xfb\x98\x8e\xb0\x55\x87\xa1\x4a\xcc\x70\xfe\x8b\x24\xf4\x98\x49\x30\xde\x14\x69\x06\x65\xd5\xcb\xfc\x8b\xc6\xfd\xc0\xb2\x60\x71\x9f\xfe\xbb\xe7\xf3\x7f\x8f\x68\x16\x09\x4b\x62\xb3\x7d\xae\xa1\x1e\x56\x3d\x44\x12\x93\xf6\xe6\x6b\x51\x9d\xf6\x3d\x71\x78\x10\x09\x0f\xd1\x70\xcc\x5b\x56\x2e\xdb\x9b\x74\xe5\x32\x3a\xc6\x0e\xc1\xc6\x15\x9e\x55\xb7\xc5\x19\x9b\x43\xcd\x41\xee\x4a\xcc\x25\x19\xe1\xe3\xb1\x02\x19\x08\x9e\x48\x84\xa9\x66\xe9\x7f\xce\xa9\x6d\x47\xbc\xf2\x96\xb8\x00\xee\x74\xcd\x94\x18\x72\xdb\x0b\x09\xee\x21\x1e\xe8\x9c\xa7\x75\xf5\x0c\xe5\xb2\x7e\x9d\x8d\x27\x9b\xe0\x12\x93\xca\xa9\x2c\x82\x56\xdb\x0f\x84\x90\xa1\x95\xf4\x98\x65\xd9\xa6\x38\x77\xdd\x3a\x42\x06\x5e\x62\x31\xee\xf5\x2b\x94\x1d\x5c\x52\xc8\x88\x21\xdd\xce\xec\xfd\x99\xea\x5c\xf6\x80\x72\xc1\xeb\x37\x72\x5c\x10\x05\x80\x50\xcc\xf7\x0c\x3e\x81\x18\x93\xaf\xac\x4d\x95\x78\x58\x4d\xdc\x3d\xed\x66\x0f\x97\x1d\xae\x02\xdc\x00\x37\xb3\xc6\xfb\x2f\xce\xb5\x91\x26\xb6\x07\x65\x82\xcc\x22\x1d\x5a\x83\xda\x9e\xda\xe3\x00\xb8\x15\xd9\x66\x83\x75\x9a\x5b\x6a\xf7\x7f\xd6\x63\x2b\xa0\xb9\x87\x1d\x37\xd8\xf0\x69\xfa\xf9\x47\x23\x80\x73\x4b\xd5\x31\xbf\x27\xc4\xbe\xef\x0f\x10\xfb\xd2\x71\x12\xdc\x6d\xec\x2d\xe1\x3b\x1d\xce\x4c\xe9\x68\xce\x7b\x2a\x4d\xbc\xaa\x4e\x45\x8b\x8a\x93\x6e\x42\x44\x52\x69\x0d\xc7\xdd\x48\x5a\xde\x0c\xf1\x5c\x40\x2f\xfb\xe9\xdc\xdb\xb6\xa5\x97\x48\xc4\xd9\x34\x66\xac\xcd\xc3\xfc\xe3\x69\xf5\xb8\xa3\xd7\xda\x8e\x93\x9e\x91\x2f\xb4\x6c\x22\xa3\xd3\x07\x0e\x97\x24\x19\xd6\x93\xff\x05\x19\x04\x09\xc6\x08\x6b\x50\xf0\xd9\xe9\x7e\xda\xa3\x91\x83\x0e\x3d\xaf\x1a\xd7\x19\x17\x09\x7a\x29\xa6\x21\x78\x78\x05\x26\x02\x5b\x22\x7a\xc9\x89\xa9\xcf\x68\xcd\xa4\x45\xde\xeb\xf5\xfa\x16\xb1\x2f\x19\x70\xac\x8e\xdd\x17\xca\xd6\x01\x65\xec\x09\xac\x6d\x18\xaa\x9c\x27\xbd\x1a\x17\xe2\x65\xcc\xa8\x28\xde\x38\x7f\xc0\xf3\x5d\xf1\xd2\x8c\xe9\x5c\x41\x99\x38\xe0\x13\x48\x41\x96\xd0\xec\xe9\xc8\xcf\x3a\x2b\xe1\x42\x4a\xd5\xfe\xc0\xf7\x3c\xd5\xa2\xa3\xb6\x2d\x9a\x72\x34\xca\x74\x0d\x18\xf6\x2a\x29\xa1\x1a\x2b\x60\x81\x4c\x64\x88\x14\x08\xeb\xaf\xdb\x74\xfe\xca\xbb\xaf\xcb\x43\x17\x89\x97\x21\xc3\x5b\xfa\x0d\x6c\x45\x0a\x47\xb1\xa0\x5f\x82\x1e\xba\x7f\x52\x78\x0e\x32\x5b\xe9\xb2\x38\xde\xc3\xe7\xfc\x95\x97\x7d\xc0\x97\x14\x09\xb1\xdb\x7e\x41\xd5\xcb\x0a\x48\xa1\x18\x26\x21\x11\xae\x80\x12\x18\x36\x48\x6a\x6f\x54\xc6\x11\xbe\xde\xc3\x99\x97\x0a\x35\xd7\xdf\x5b\x50\x96\x94\x3c\x40\x92\xed\xbd\xc1\x3b\x3d\xa6\xf9\xbf\x47\x55\x3f\xa9\x9c\x08\x89\xb2\x69\x0d\x0e\x37\x14\x16\x8c\x9e\x53\x45\x2d\xe0\x1e\xd1\x5f\xc4\xef\xd6\xa5\x0f\xa4\x82\xc0\x01\x9b\xf4\xd4\xc3\xc6\xcd\xa1\x2d\x92\xe0\x44\xd2\xe4\xa2\xb1\x65\x3c\x2d\x17\x65\x71\x6a\x3b\xef\xda\x77\xa7\x7d\x07\x33\x27\xc8\x61\xfa\x58\xd4\x8f\xe7\x6c\x94\xb8\x96\x9a\x31\x6a\xaa\x25\x21\xed\xfe\x4a\x51\x8e\x17\x2b\x63\x1a\xef\x52\x5d\x4f\xa5\x14\x95\x9b\x10\xdf\x89\x94\x24\xfd\xff\x72\x1a\x33\x1c\xdb\x81\x3c\xd2\xcc\x42\x8f\x4d\x27\xe4\xee\x61\xf8\x46\x95\x0b\xa1\x47\x39\x53\xe2\x1f\xf9\x95\xe6\x6b\x5e\x97\x29\x55\x64\xdd\x76\x98\xa6\x3d\x9a\x38\x43\xd1\x5d\xeb\x03\x17\xda\x54\x94\x19\xee\x39\x80\x7c\x32\x7f\xa5\xaf\xdc\x3e\x9b\x67\xf4\xbc\xf6\xad\xb4\xe4\xe8\x7e\xbd\xd0\x93\x08\xe7\x2c\xc8\x97\xf8\x76\x16\xab\xc0\x13\x86\x06\xbc\xc8\xb5\xe5\xf9\x04\x15\x04\xbe\x63\x10\x85\x2b\x49\x30\x2e\xa8\xa1\xfc\x7b\x92\xf5\xa0\x82\x90\xd8\x02\x4f\x5d\xa2\xad\xdf\x86\xb2\xca\x97\xf5\xeb\xe8\xb6\x03\xee\xe1\xb3\x52\x12\x85\x98\x47\xa6\xbe\x5b\x20\x18\x42\x18\x49\x7a\xfc\xf6\x9c\x2b\xec\x11\x1a\x7a\xe5\x2a\x74\x5c\xec\xcf\xdb\x16\x59\xaa\xb6\x35\x3f\x9e\x36\x56\x02\x61\x34\x50\x72\x2f\x31\x72\xb5\xa5\xba\x4d\x2d\x7f\xf1\xb7\xf5\x0c\xc5\x9c\x40\xd2\xf6\x2c\x8b\x5c\x55\x0f\x69\x0b\x76\x50\x91\x4f\x68\x36\x44\x7c\x43\xf9\xcc\xe5\xdb\x9c\x97\xaa\x0f\xfb\x52\x49\x60\x55\xf5\xb3\xb7\x71\x0a\xa4\xfd\xf8\x49\x1c\x62\x8a\xfe\x95\x57\xdb\x22\x3f\xfc\x2a\xd3\x1a\x4a\x54\xa0\x1b\x45\x06\x4a\x84\x3e\x49\x36\xc2\x29\x83\x26\x3c\xff\xae\x1a\xab\xa4\x24\xde\x5a\x69\x83\xdb\x31\x0d\x82\x92\xa0\x10\xec\x72\xe2\x48\x0d\xba\xfd\x48\x07\x20\x39\x33\x0a\xb4\xf4\x18\x85\xeb\x8d\xb7\x66\x65\x1e\x47\xef\x57\xc7\x8e\x69\x69\x43\x3d\x6f\x6c\x3e\xaf\x2e\x04\xcf\x01\x1c\xd7\x0b\x9c\x6e\xbf\xfa\x07\x57\xb0\xad\x81\x67\x69\x7e\xf8\xbb\xbb\x15\x38\x61\x64\xc8\xd5\x6c\x7d\xfa\xaa\xe2\x15\x34\x96\xc8\x69\xd5\x79\x49\x10\xee\x62\x00\xd6\xd2\x67\x9f\x29\xcc\x9b\xe5\x3a\xc5\x86\x08\xe0\xba\x09\x2e\x37\x05\xc7\xf4\x0a\x93\x39\x80\x0b\x0c\x59\x44\xea\x62\xf3\xf0\x8c\x37\x45\x0d\xb2\xdd\x96\x08\xbe\xd4\x71\xd7\xf0\x83\x93\xd0\xc0\x46\x48\x69\xbc\x71\xaa\x3a\x99\xb0\xc1\xa7\x80\xc0\x49\x9c\xd8\x92\xca\xdf\x5e\xf2\x11\x98\x61\x61\xe8\xe2\x13\xb5\xcc\xa3\x48\x39\xfa\xd7\xfe\x6e\xf3\xf4\x62\xa8\xf3\x00\x42\xe5\x21\x0f\x1a\x56\x26\xb5\xd5\x4c\x31\x2a\x01\xd6\xe6\x03\x8b\xa9\x97\xb7\x6c\xfc\x67\xa4\xe8\x5e\x40\xe3\x5c\x8c\x36\x93\x71\x9d\x04\x98\x26\x21\x3e\x5a\xe5\x65\x2f\x10\x04\xa6\xa9\x19\xae\xb1\xf9\x18\xb7\x53\xf1\x69\x57\xec\x80\x1f\x27\x73\xb6\x97\x1f\x35\x4a\x14\x74\xe2\xbf\xf6\xcc\x31\x4b\xa2\x1e\x56\xe0\x7e\xf7\x30\xbf\x6a\xc7\xc6\x72\xb1\x3d\x33\x70\x05\x09\x07\xb1\x52\x18\x7e\xd8\x49\xd7\x79\x66\xfd\x4d\x09\x12\x8f\x11\xbd\xb4\xf1\x8f\x89\x31\x7d\xb8\xa8\x20\x09\x7c\x94\x9f\xdb\x80\x4c\xe1\x1d\x54\xcf\x4e\x8e\x1e\x95\xbb\x60\xdb\xe1\x5b\x57\xb9\x8d\x1c\x41\x28\xc0\x98\x78\x4f\x60\xf3\x37\x18\x35\x68\x0e\xcf\x25\x80\x60\x9b\x1f\x90\x62\x40\xa4\x06\x15\x64\x90\x42\x46\xba\xa5\x0b\x5a\xc3\x82\x17\x03\x97\x1c\xa4\x0c\x98\xd5\x85\xb5\xf8\x21\x4b\x93\x60\x4f\xa2\x1c\xa7\x47\xe6\xbf\x4e\x65\x59\xac\x0b\x75\xce\xc6\x4d\xae\xd7\x76\x96\x2b\x5f\x1c\x0c\x07\x19\x62\x59\x4c\x10\x45\xb7\xf0\x57\xe3\xaf\xcc\x2c\xb9\xa1\x19\xae\x5d\x5f\x76\x13\x64\x56\x76\x88\x88\xbf\x21\x49\x3a\xfc\x54\xda\x57\xd8\xdf\x80\x54\x6e\xa3\xd3\xd0\x10\xed\xb8\x31\x61\xc5\xce\xa2\x85\xd4\x2d\xa0\xe6\x69\x36\x32\x7f\xda\xe1\x9e\xe9\x6f\x2a\xf9\xe9\x35\x3d\x8e\x8c\xad\x76\x03\x07\x2c\x36\xe2\x77\x6c\x12\xe6\x27\x9e\x27\x7c\xd3\x71\xbc\xfc\x3c\x11\x13\xc0\x95\xd4\x9c\xf6\x44\xe8\x62\xb8\xf3\xeb\x71\xb9\xd9\xef\x66\x3f\x96\xfb\xed\xfd\x6c\x63\x91\x1f\xda\x53\xd4\x24\xdf\xbc\xb6\x1c\xb2\x1d\x85\x8a\xed\x51\x50\x38\xd9\x20\x57\x4d\x64\x54\xf3\x03\xd8\xd2\xb7\xf6\x83\x10\xdd\xb4\xc5\xec\x74\xda\xbe\x7d\xb5\x7f\x0e\x3d\x37\xb0\x32\x57\x28\x71\x7f\x49\xbf\xa0\x7d\x1e\x81\x29\xb0\x19\xdf\xac\xeb\x5e\x9c\x48\x04\x69\x9f\x4b\xd9\xea\x6a\x76\xec\x93\xa3\x67\x0d\x92\x00\xa3\xbf\x2e\xa4\xad\x48\xde\xd3\x1e\x57\x89\xe7\xb5\xd2\xf4\x6b\x3b\x75\x74\x28\xa3\xd8\x60\x9f\x9a\xe7\x1f\xb6\x95\x6a\xa6\x18\xca\x23\x62\x1a\xe4\x17\x88\x2a\xad\x47\x69\x0a\x1d\x39\x21\xf6\xc3\x6d\x7f\x1a\xd0\x6d\x07\x18\xd3\x51\x08\x48\x17\xba\xdd\xcd\xee\x96\x6d\x69\xbf\x8f\xbe\xd1\x11\x73\x31\x9e\x10\xe7\xaf\x5d\x9a\x59\xb8\x49\xcf\x35\xd2\x51\xe4\x22\x56\xfa\xb5\x50\xd9\xed\xb8\x71\x53\xc7\x51\xa8\xa9\xdf\xe0\xdd\x75\x26\x18\x12\x41\xc7\xd2\xc3\x92\xe9\xed\x39\x47\x7a\xec\xc6\xae\xf7\x4d\x98\x4e\x44\x80\x29\xd3\x65\x7e\x78\x3b\x57\x3b\x90\xaf\x56\x42\xa8\x1b\x11\xf2\x68\x28\xce\xda\xdb\xbe\x87\x37\xc4\x7d\x22\x94\xa3\xe5\x3a\x09\x0e\xb3\x23\xa3\x04\x1f\xdd\x60\x42\x50\x40\xc4\x5e\x91\x73\x62\x08\xac\xa1\xa2\x8a\xb3\xe5\x5c\xb1\xc7\x55\x88\x48\xe1\xe5\xb1\x31\x5e\x00\x5b\x28\xdf\x47\x1f\x46\xf8\xda\x09\x86\x60\xe2\xad\xec\x4a\x6e\x5a\x44\x91\xec\xea\x7b\x8d\xa7\x74\x6d\x1d\x09\x41\x8d\x5e\x5c\xa9\x35\x70\xd4\xd2\x2d\xe6\xc5\xbb\x06\x3d\xdd\xcb\xaf\x65\xe8\x20\x68\x63\x56\x5d\x66\xe4\x86\x37\x29\x45\x88\xd9\xf3\x5d\xab\x8b\x61\xa5\x62\x2f\x95\x2f\x40\x2b\x27\x56\x2d\xc4\xef\x99\x53\x87\x4f\xd5\x07\x31\x6a\x15\x32\xa4\x15\x97\x36\xdf\x3c\xf4\xdc\x34\x88\x00\xe1\xa9\x0f\xc5\xe1\x3b\x18\xb2\x19\xad\x05\xf5\x23\x40\x96\x1e\x52\x91\xc1\xae\xf9\x1c\xb9\x42\x86\x9a\xa9\xde\x75\xfc\x99\x76\x1c\x2f\xc4\xc2\xd6\x7b\x0a\x1f\x3b\x73\xaf\xc6\xc9\xd0\x8e\x13\x78\x98\x45\xb4\xab\x61\xfe\xb4\x5e\xaf\xb6\xdb\xd5\xd3\x63\x3b\x42\x90\x8c\xec\x76\x39\xff\x9d\x98\xa1\x76\x5c\xe6\x40\x64\x02\xf2\x27\x24\x4f\xc2\xac\xbe\x4c\x7b\x9f\xb3\xff\xce\xb5\xe3\x07\x1a\x2b\x52\xcf\x50\xea\xa2\x3c\x36\xbe\x68\x91\xd7\xaf\xd9\x97\x69\x99\xfa\x63\xf8\x30\x7e\x4c\xd0\x6b\xe2\xe9\xed\x05\xfb\xda\x09\x23\x1f\x71\x31\x8b\x2d\xdd\x67\xdf\x83\x68\x8e\x26\xd8\x0a\xb4\x4f\xab\x9b\x12\x40\xa5\xf9\x01\x65\x76\xeb\xb1\xc2\x5a\x77\xad\x28\xa0\x86\xd9\x73\x5e\x41\xfd\x2b\xcd\x54\x13\x64\x5c\xce\x04\xed\x44\xb1\x40\x14\xfc\x3d\xaf\x5e\xef\x28\x3a\xb5\x9b\xb2\x76\xe2\x88\xdb\x2e\x54\x22\x48\xb0\x19\x4d\xed\xc4\x9c\x74\x58\x96\x9f\x75\xf3\x05\xed\x9f\x93\x38\x01\xd9\x75\x8d\xb8\xde\xd1\x1e\xe1\x10\xba\xfe\x50\x6a\xb5\x26\xae\x3f\xb4\xb2\xc2\xec\xcb\xc6\xb5\x98\xca\x0f\x68\x47\x38\x1e\xda\xde\xdc\x2c\x43\xe2\x73\xb3\x07\xdd\x10\x23\xab\x66\xa5\xdf\x35\x61\x42\x65\x9b\x3c\xb4\x23\x42\x29\xc2\x5e\xbe\xb4\x15\xdb\xba\x50\x84\x1e\xbd\x47\x91\x28\x69\xb0\xe3\xb3\xb2\xe4\x5f\x9e\x3d\xa3\xf4\x64\x64\xb1\xd3\xc4\xa2\xd3\xcb\x50\x68\x47\x86\x09\x4e\xa6\xc5\x6a\xdb\x0a\xf5\xed\x57\x8f\x3f\x97\xdb\x5d\x4b\xdd\xaf\x1d\x99\xf8\x64\xe2\xa0\xaa\xe7\x69\xfd\xb5\xcd\xf9\xa9\x7a\x2d\xae\xad\x06\x29\x39\xfa\x48\x8a\xd7\x7c\x8d\xf5\x90\x3f\x2e\x0a\x36\xa3\x9f\x28\x8f\xdc\xaa\x03\x90\xaa\xf5\x0d\xcf\xdf\xaa\xd1\x14\x50\x71\x82\x6e\x08\x65\xe3\x6f\xa1\xd7\xc7\x35\x1a\x28\x38\x6e\xb8\x6b\xfe\xb9\x9a\x3f\x11\x90\xac\x4f\x37\xa8\x1d\x64\xf9\xb6\x5c\xfe\xf2\x15\x0d\xbc\x37\xba\x1c\x78\x3e\x6e\x34\xd6\xd1\x5d\xe6\xaa\xeb\x7c\xd6\x0e\xf8\x9c\x9c\xc5\x41\x21\x64\x38\x11\x5c\xc7\x8d\xec\x67\xf9\xc0\xc2\x5c\x13\xa5\xd9\x69\xeb\x3a\x89\x22\x02\x4c\x5d\x43\xf9\xeb\xd5\xd6\xa8\xfe\x18\x9e\xc3\xf5\x35\xe2\x33\x1f\x9e\xe6\x3f\xf6\xdb\xc6\xa9\xb1\xbf\xf7\x84\x44\x54\xee\x43\xfa\x9f\x33\x7c\xf6\x89\xba\xcc\x00\xdf\x0f\xb1\x12\x50\x9d\x32\xca\x31\x8c\x5e\xa9\xeb\x0b\x86\x86\x3e\xad\x50\xbe\xda\x06\x46\xda\x0d\x62\x8d\x51\x4c\xf5\x5a\x7c\xac\x07\x91\xa5\x9d\x3a\x6e\xc8\x34\xe6\x71\x0d\xfb\xe6\x01\xf1\x1d\xc6\x0b\x9a\x9e\x18\x6e\x18\x53\x03\x73\x05\xf5\xfd\x8f\x7b\x59\xa4\xf9\x77\xf5\x38\xed\xb2\x28\x44\x66\xcc\xed\xab\x15\x21\xf9\x2d\xa7\x91\x76\x23\xc6\xb0\x49\x82\x2b\x35\x9f\x5d\x84\xda\x7f\xc3\x3f\x1e\x9e\x8d\x53\x25\x91\x90\x66\xcd\xfb\x95\xaf\x80\xfe\xfe\xf0\x56\x63\x16\xc5\xf6\x85\x99\xda\xc2\x68\x00\x4f\xbc\x4e\x0c\xe9\x3c\xea\xed\xd0\x6e\xe2\xd1\x54\x39\x95\x70\xe2\x25\x6c\x8a\xec\x82\xe4\x7d\xf4\x36\x93\x00\x30\xd7\x90\x22\x06\x6f\x51\xe4\xed\x77\xe7\x1e\xa0\x5c\xdd\x05\x27\x7a\x07\xd6\xd0\x2e\xf7\xa9\xf0\xf2\xd4\xc1\xba\x4c\x02\x78\x78\x19\x1e\xbb\x58\xe4\xff\x80\x74\x57\xdc\xe4\xa3\x72\x48\x73\x5c\x20\x30\xf7\x58\xa8\x54\x7f\xed\x57\xf3\x27\xcb\x37\x38\x1a\xa7\x5d\x9c\x2f\xcb\x4a\x96\xc5\xc7\xfa\x0b\x0b\x1e\xed\x1d\x6b\x81\x15\x13\x55\x8c\x3a\xeb\xaf\x92\x75\x69\x57\xfa\x01\x90\x72\xf2\xd7\xb6\xe6\xe3\xdb\x96\x2c\x20\xa9\xf3\x03\x6c\xa1\x46\xbf\xa1\x1f\x0e\x6a\x57\x26\x7e\x68\x5a\xf2\xb6\x6f\x69\x3e\xc9\x7f\xa3\x5d\xc9\x21\x26\xaa\xa9\x55\x55\x9d\x3b\x0d\x62\xed\x4a\x49\xa8\x1e\xec\x4a\x39\xe7\xea\xa6\x4d\xa0\x4f\x7f\x2e\xe5\x25\x58\x8b\xb9\xe7\xe5\xbf\x6f\x79\x79\xec\x1e\x5e\xf9\xb6\x4a\x96\xab\xd9\x07\x6e\x80\x0f\xbc\xb2\x1a\x9f\x76\x50\xc8\x99\x99\x3f\xd4\xcd\xd1\x6a\x72\x8e\xee\x58\x29\x81\x99\x8f\xbc\x50\x3c\x43\x4a\xa2\xed\x6b\x51\xd6\x0f\x69\xfe\x36\xe5\xbc\x69\x57\x01\x45\x04\x07\xa2\xfb\xae\x66\xa8\xea\x36\xd8\xda\x5d\x08\x12\xd3\x93\xf8\x06\x8f\xf0\x61\x33\xc8\x53\xa1\x89\x76\x01\x42\x23\x5b\x20\xbf\x64\x06\x2f\xb9\xe1\x2a\x54\xc3\xde\xc4\xe1\x6d\x6b\x57\x05\xa6\xbc\x58\x58\xf4\x95\x67\xd2\xce\xd3\x0b\xc0\x73\xbc\xc8\x31\xf9\xf1\x47\xf8\x78\x69\x95\x1f\xed\x61\x3f\xc4\x2c\x0a\xf2\xe7\x6a\x00\x44\xc5\xbc\xf2\x12\xf6\x79\x41\xf0\x23\x59\xb4\xf5\x59\xed\x39\x81\xe7\x47\x56\x19\x7e\x6b\xdb\x54\x2e\x66\x84\xe7\x7a\x11\xf6\x98\xfd\xf8\x6b\x2e\xd2\x3a\xb0\x3f\xf7\x1c\xea\x94\x35\xdc\xce\x34\xcb\xa7\x1d\x32\xcf\x8f\x20\xf6\xae\x31\xa1\x74\x38\x06\xed\x05\x42\x49\xc2\x0e\xec\xeb\x9e\xf0\xc7\xe0\xdb\x78\x61\xa0\x30\xc9\xfd\x72\xf7\xb3\xcf\x44\xa8\x3d\xe6\x05\xc8\xd2\xde\xf6\xd0\x11\xd4\x79\x78\x2f\x2c\x94\x98\x39\x47\x17\x1b\x23\xc8\x26\xe6\x1a\x5e\x81\x89\x10\x71\xef\x0a\x32\xfe\xb5\x92\xc5\x18\x23\xaa\x3d\xa6\x99\x36\x00\x81\x55\x35\x27\x36\x9f\xd1\x85\x22\xd7\xd3\x1d\x84\xad\x9e\x24\xe5\xd0\x5e\x14\xa8\x84\x34\x68\xbf\x28\x9c\xed\xb9\x9f\x5e\xc4\x12\xbc\x0f\x8e\x14\xc8\xcb\xff\x5c\xb1\xee\x76\x74\xe4\xd8\xce\xf4\xde\xba\xf5\xa2\x18\xa4\xb0\x81\x71\x05\x3d\x1a\x33\x3b\x40\x84\xd4\xbb\xc0\x4b\x45\x8c\x27\xfb\xc6\xf4\xf7\x8d\x87\x97\x28\xea\xc4\x83\x8c\x9f\x5a\xdd\x63\xed\x09\x3f\xb0\xfc\x2e\x37\x9d\xe2\x97\x3b\x7a\x13\x42\x85\x68\xec\xfa\x30\x38\xa3\x6d\x96\x7d\x6d\x21\x57\x83\xee\x65\xed\x49\xc7\x41\x76\xb9\xe7\xdd\x1a\xa1\x5c\xb7\x9d\x37\xe9\xa9\x28\xf6\xa1\xa5\xd1\xdb\x14\x75\x71\x8d\xc3\xc7\xfe\x20\x71\x71\xb6\x98\xd4\x11\x59\x5b\xf4\x71\xc7\x95\x6e\xed\x29\xc9\xc0\xec\xd7\x38\x75\x2e\x51\x53\xda\x03\x8f\x84\xc9\x74\x85\x19\x6f\xcc\x58\x2c\x20\x2f\x70\xb7\x6c\x5d\x74\x24\x94\xe1\x46\xee\xbb\x85\x20\xff\x82\x74\xda\x1a\x78\x20\x48\x47\xcb\x3a\xc2\xc1\x1d\x1f\xf9\x2e\x4d\x24\x84\xbe\xcb\xd3\xfc\xa1\xa8\x6b\x28\xbf\x86\x58\x3f\xdd\x2c\x69\x6c\x6f\x5b\x3d\xce\xef\xdb\xbf\x05\x31\x96\xbe\x1b\x87\xa2\xf8\x28\xca\x4c\x75\x47\x88\xe3\x55\x9c\xbf\x28\x6b\x70\x3e\xb5\x3c\x33\xc3\x2b\xfb\x8e\x47\xef\x1c\xe5\xe5\x50\x5d\xbd\xed\xe2\xd4\xbe\x13\x87\x08\x64\x7a\x58\xde\xcd\x1e\xf6\xcb\x3f\x9f\x97\x8f\xdb\xe5\x76\xdf\xaf\xac\x6b\xdf\x91\xcc\x16\xe3\xa6\x4d\x84\xef\x48\x15\x6a\x2b\x12\xd4\xd1\xeb\x4f\xfa\x55\xbe\xeb\x08\x4e\x65\x65\x05\x70\xec\xdb\x00\xdf\x8d\x1d\x9f\x38\x75\xec\x4c\x9b\x22\x62\x19\x9d\xcf\x73\x48\x54\xf1\x47\x81\x5d\x05\xf6\x5c\xbe\xe3\x04\x7d\x40\xe8\xc5\xed\xd8\xad\xd9\xf7\x03\x17\x81\x30\x19\xaf\xea\x99\x52\x9d\x8c\x54\x73\x88\x85\xa4\x5a\xca\x8f\x48\x54\xd8\xae\x1e\xdf\x0f\x49\x37\xb1\xf1\xca\xd3\xfa\x9c\xf1\xb4\x84\x3d\x01\x31\xf7\x89\x1d\x14\x78\x3e\x66\xe9\x0e\x25\x37\xe8\x38\x2c\xfc\x3c\x16\x1f\x7f\x2b\xa1\xa8\xfd\x20\x02\xd4\xdd\x5b\xa4\x87\xb4\xe6\xd9\x2e\x6d\x71\x22\xda\x0f\xb8\x22\xc5\x6c\x5a\x16\x8f\xe7\xa3\xd7\x1e\x92\x2c\xa0\xa8\x58\xdd\x34\xcb\x60\x64\xde\xfc\x90\x53\x31\x1a\x81\x27\xb2\x2b\xc8\x6b\x9f\x31\x12\x2b\xc0\x8c\x97\x7c\x83\x7a\x34\x93\xfd\x28\x4a\xd0\x8f\x47\xc8\xdc\xa2\x2c\x4e\xa8\xf0\xd9\x16\x55\xb4\x1f\x25\x5a\x12\x4e\x7c\x95\x63\x5e\xb2\xbd\xab\xd8\x55\xd8\xa9\xf3\x50\xe4\xaa\x68\xaf\x18\x7b\x0c\x5d\xbb\x3b\xc0\x40\x6a\x80\x2a\xd1\x7e\x1c\x50\x02\x8f\xe0\x05\x13\x61\x81\x1f\x33\x6e\x74\xbd\xb2\x2c\xcd\x0f\x8b\x81\x01\xf5\x63\x11\x62\x55\x94\x24\x94\x28\x11\x3c\x91\x88\xd3\x7e\x22\x34\xee\x94\x0f\x69\xf9\x36\x98\x94\x89\x0e\x25\x71\x0b\x63\xa2\x9b\x9a\x71\x46\xef\x93\x7b\xae\x07\x3d\xf6\x7b\x84\x89\x2f\xff\xf3\xd2\x5c\xe7\x8f\x76\x0c\x23\x06\x5e\x4b\xad\x9a\x1e\x1b\x67\x6f\xf4\x34\xc2\x0b\x10\x31\x7b\x07\x39\x54\x69\xb5\x26\xe6\xac\x6b\x00\xbb\xd1\x3a\x14\x21\x73\x4c\xa9\x9f\x08\x0c\x28\x63\xdb\xfb\x38\x32\x16\xca\x1d\x32\xde\x8c\x15\x8b\x06\xbb\xa9\xaf\x62\x22\x17\xc0\x19\xdc\x04\x4c\xad\x7a\xd0\xdf\x9b\xc0\x10\x06\x58\x26\xab\xf9\x1b\x94\xb7\x60\xb3\xc9\xf6\xa5\x40\x22\x70\x6b\x92\x3c\xdf\x42\xa6\x17\x40\xac\x7d\xf6\xb0\xf6\x1c\x64\xc3\x9e\x6d\x56\x4f\x8f\x3d\x21\xbe\xe6\x88\x8f\x59\xa8\xcd\xc3\x7c\x0b\xcd\xda\x5a\x5a\xc1\x27\xed\x6b\x90\x46\xd5\x82\x97\x35\x2a\x72\xf4\x4c\x9e\xd6\xa1\x63\x3a\xad\x16\x5f\x39\x3f\xa6\x72\x49\xd8\x93\x11\xec\x4c\x07\x8e\xeb\x63\xb5\x72\xf9\x3c\xeb\x2f\x91\xc0\x09\x85\xb0\x0d\xac\x45\xb3\x2d\xdf\x16\x58\x72\x1e\x73\xd7\xe9\xc0\x89\x93\xa4\xcb\x93\x4a\xa8\x2a\x4c\x31\x55\x3d\xb8\xa2\x0e\x7c\x07\x10\x72\x69\x08\xa5\x76\x9f\x7d\x2f\x22\xf0\x83\x28\x88\x3b\x84\xed\x2c\x57\x37\xe7\x72\x88\xb1\x35\x23\x03\xdf\xb7\xb0\xc7\x3d\xa1\xf2\xd2\xfa\x6b\xcf\x27\x58\x3b\x74\x10\x86\x2a\x74\xdb\x7d\xb5\x2d\x03\xd8\x8b\x86\x9c\x1b\x64\x45\x8d\x3e\xf9\x06\xde\x21\x3f\x37\xdf\x8e\x6c\xc2\xe8\x45\xb1\x88\x56\xc8\x53\xc9\xf3\xc3\x79\x3b\x41\x86\x7d\xf5\xdf\x2b\xa6\xfd\x7f\x46\x17\x10\xbe\x2d\x32\xac\xbf\x36\x80\xb8\xb2\xa9\xba\x60\x33\x92\x47\x0e\x96\x3e\x9e\x68\x11\x4f\x72\xf3\x99\xc1\x91\x4f\x00\xf6\xbd\xe4\x6d\xf2\x0a\xf1\x21\xa3\xe7\x8b\xc2\xc8\x25\xa6\xc0\x39\x3f\x71\x91\x66\x69\xfd\x45\x3c\x96\xc3\x45\x13\xb4\xe3\x25\x66\x79\x6d\xb5\xe3\x99\x97\x57\xb2\x4f\x41\xec\x25\xb8\xbc\xb6\xb7\x7d\x2a\x1b\x1d\xc4\x5c\x20\x8e\xfd\x5c\xa9\xba\xfd\x9b\xa4\x4a\x40\x05\xb5\x41\x6b\x1a\xd7\x6b\x82\xb7\x5d\x07\xb1\x76\xf1\x13\x73\xa5\x5a\x59\x33\x1d\xf0\xc6\x06\x63\xb9\xe2\x63\xcd\xf3\x2f\x6a\x1d\x59\x80\x4c\x55\x3b\x44\x3a\x02\x57\x2c\xf2\x10\x35\x3e\xff\x3d\x2f\x8f\x45\x3e\x21\xd5\xa3\x03\xe9\xf3\x38\xb8\x50\x9f\x1a\xbd\x3e\xa9\x19\x16\x7f\x2c\x5a\x81\x6e\xf7\x57\x5a\xbf\x36\x26\x10\xc5\x6c\x2e\xe2\xe6\xd1\x6b\x02\xdf\x43\x8f\xfd\x36\x83\xcf\x14\x21\x36\x83\xb7\x05\x01\xa9\x72\x22\x77\xe6\xc8\xb3\x0a\x80\x07\xd0\x17\x5f\x74\xdb\x03\x10\xaa\xa0\xa7\x3e\xd6\x6f\x8f\xb8\x98\xa0\xd3\xf7\xa5\x7d\x1f\xa1\x9a\xcd\x5e\x57\xd5\x3c\xaf\x53\xde\x17\x3b\xb4\xa3\x14\x21\xfa\x6e\x56\x77\xfb\xc7\x97\xf5\xcd\x72\x63\x6e\x21\x74\x3d\x81\x94\x8f\x0f\xc5\x11\xb2\x14\x5f\x50\x76\x6a\x99\x5d\xcd\x20\xcf\x71\x62\xe3\x5e\x5a\x9c\x27\x42\xfe\x6b\x7e\x3c\xf5\x29\xa8\x6c\xb2\x24\xf4\xa5\x44\xda\xe8\xf9\xfd\xea\x71\xb9\x5d\xee\x97\x7f\xce\xef\x67\x8f\x77\x4b\xab\x74\xa1\xc3\xc0\x21\xce\x36\x6a\x6a\x5d\xaf\x16\xed\x01\xce\x5c\xe8\x09\x34\x41\x79\x5b\x94\x6d\xe9\xcb\x1d\x39\x7e\x61\x20\x34\x62\xab\xd2\x6a\xc2\x22\x85\xa1\xaf\xd0\xb1\x4a\x2b\x4b\x02\x3c\x58\xac\x61\x18\x78\x08\x74\xc6\xf6\xc0\xf2\x4b\xd6\x85\xdd\x2c\xc3\x30\x50\x08\xce\xe6\x87\x12\xe0\xb6\x2c\x8e\xcf\x85\x6a\x8f\x85\x34\x19\x7e\xcc\x1e\x58\x7f\x1a\x84\x61\x14\xd8\x24\xc7\x33\x20\xdd\xde\xbc\x44\x6c\x00\x92\x3c\x5a\x2a\xf2\xc9\x85\x18\x86\x31\x11\x30\x34\x8b\x0b\xdb\x6d\xfe\x18\x1d\xd7\xae\x17\x5a\xf4\x24\xaf\xba\x3e\xb2\xa7\x72\x79\xac\x4f\xd3\x6a\xf1\x3a\x64\x4a\x5a\x35\xf4\x13\x2f\x31\x4a\x4f\xf3\x73\x71\xae\xec\x97\xb4\xf7\x1e\x39\xdc\xb3\xad\x41\xfd\x00\x2f\x8c\x98\xc6\x54\x9c\x2a\x1e\x8b\xbe\xef\x1e\xc6\x6e\x80\x0e\x0b\x3a\x62\xf3\x22\xcd\x6f\xd2\xc3\x0d\xef\x1d\x67\x11\xaa\xc5\x74\x36\xbe\xea\xd5\x2f\xbb\x5b\x8c\x23\xe2\xcd\xb0\xb4\xa3\x45\xd9\xce\xbc\xc4\xe5\x96\x71\x7d\x43\x2f\xb2\xaf\xe8\x79\x65\x89\xd8\xdf\xfa\x01\x16\xf8\x48\xa8\x6c\xfe\x25\x33\x58\xe5\x0b\xfe\xd5\x9d\x3c\x82\xc8\xf6\x57\x3d\x14\xf9\x61\x95\x9f\x6c\x79\x5b\x87\x49\x1c\xd8\xf2\xe0\x9c\xd7\xb6\x7e\x8f\xef\x25\xb4\x43\x0c\xc6\x1a\xb3\xf0\x96\xdc\xfa\xe6\x6b\x5b\x9f\x15\xe4\xf5\x6a\x31\xb9\x34\x78\x68\xe4\xf2\xd2\x23\x1c\xda\x16\x46\x1d\x0a\xc1\x6c\xff\xf5\x23\x7c\xda\xfa\x38\x0a\x9b\x8c\x26\xb5\xf4\x5d\xf4\x7f\xd7\xfc\x0d\xf6\x8b\x7e\x7f\x9c\x0e\x65\xc8\x1d\xb3\x59\x2f\xeb\x57\x30\xb8\xcd\xe9\xa8\x31\x54\x3e\xc1\xbc\xb1\x19\xac\x25\x19\x31\x2d\x63\xbb\x32\x3d\x1c\xa0\xac\x28\x95\x6d\x7e\x01\xb1\x83\x48\xce\x41\xd3\xe9\x60\xe2\xb9\xac\x1d\xaa\x3c\x83\x25\x5c\xcc\x56\x9b\x6b\x8c\x8a\x3a\x04\x21\x70\x53\xa1\x86\xd8\x4b\x08\x60\x37\x52\xfb\x02\xf3\xdb\xa7\x02\x5b\x23\xcc\x4d\x31\x27\x74\x1d\xab\x9d\x47\xf4\x3c\xd3\x57\x62\xae\xeb\x63\xc7\x2b\x41\xa9\x09\xb4\x70\x79\xb1\xff\x99\xf0\xcd\x99\x1b\x51\xf2\xb4\xb9\x46\x7a\xe8\x59\xe8\x69\x78\x90\x66\x1e\x67\x9a\xd4\x09\x4f\x95\x05\x21\x5e\xcc\xd7\xde\x2a\x63\x7e\xc0\x13\x03\x85\x1b\xf6\x2f\x0d\x9f\xc1\x0f\x25\x2e\x88\x9f\x45\x76\x3e\xc2\xea\x68\xf0\xd8\xa4\x6f\x3c\xb6\x7f\xcc\x07\x0f\xcb\x79\xfb\xd4\x56\x64\x07\x0e\x77\x2f\x5d\x68\xfe\x99\x96\xcd\xd0\x2c\x70\xb8\x45\x86\xda\x8e\xda\xf1\xb5\x02\x26\xb0\x0e\x3a\x2b\x8f\x48\x80\x99\xa5\xb7\x76\x72\xb3\xd0\x0d\x3c\xab\x41\xd2\x46\xc3\xf6\x98\xef\xd9\x5a\xd6\xc6\x24\x3e\x51\xc8\xee\xca\x0b\x08\x63\xe9\x23\x9c\x8d\x6b\x3d\x6a\xd1\xd3\x2c\x14\x10\xf6\xbd\x01\xcc\xa0\x2e\x79\x99\xa3\x58\x83\x19\xc4\xdc\x84\x38\xc8\xb2\x54\xeb\x67\xe4\xeb\x6d\x0f\xc5\x44\xdf\x0e\xf5\x2b\xc6\x0a\x2d\x0d\x87\x66\x4c\x11\xc6\xe1\xc7\xf3\xd3\xf3\x7e\xb5\x5b\xae\xf7\xf3\xa7\xc7\xdd\x66\x36\xdf\x0d\x49\xff\x35\x8b\x1c\x17\x5b\x2b\x3a\xa8\x09\xaa\x5b\x99\xf9\xd1\x09\x6a\xd8\xe1\x01\x17\x44\x51\xfc\x25\xc0\x70\xa1\xdb\x43\x91\xe3\xb7\xc1\x7b\xb3\x83\x6c\x8a\x0c\xc6\xd8\xa5\xd1\xd9\xa4\xc6\x6c\x1c\xd4\xaf\x7b\xcd\xb3\x4c\xf0\xce\xb9\x19\xcc\xb7\x38\x10\x88\x3c\xe4\x4a\x35\xde\xd7\x91\x67\xd3\xf0\x06\xcd\x92\xd0\x09\x4d\xaa\xd9\xf0\xa3\x42\x39\xab\x2f\x99\xa7\x34\x4b\x24\x77\x3b\x5a\x3c\x4c\x7f\x55\xd3\x89\x4b\x96\x68\x97\xb5\xca\xef\x47\xd8\x40\x75\xce\xea\x4b\x3e\x69\xcd\x38\xf3\x91\x3f\xf5\x0e\xbb\x11\xfb\x55\x10\xc6\x19\xe0\xc6\xd4\xd6\x9e\x9b\x01\x87\xc3\x1d\xe1\x5c\xac\xc5\x65\x1c\x02\xd6\x57\x61\x5e\x14\xf2\x7c\x6c\xf5\xf5\x46\xf7\x25\x22\x81\x00\xf1\xbb\xb3\x10\x50\x76\x9a\x13\x9a\x89\xd8\xc5\x8c\xfb\x07\xd4\xaf\xc3\x14\x01\x13\x89\x93\x24\x3d\x05\x87\xa7\x72\x4a\x16\x61\xfc\xef\x64\xc2\x91\xc9\x20\x41\x23\x47\x60\xf1\xd1\x1a\x53\x92\x89\x2e\x17\x71\x53\x94\x65\xf1\x91\xe6\x07\x8c\x30\xfb\xa8\x57\x33\x1c\xbc\x08\x71\x16\x2b\xfc\xa3\xd1\xd4\x1d\x8e\x48\xfc\x9e\x14\x6c\x13\xd8\x3d\xf3\x73\x05\xea\xa2\xcd\x42\x33\xed\x4a\xac\x69\x54\x27\x90\x29\x54\xdb\xaf\xa3\x28\x86\xd2\x06\x3a\x72\x1c\x8d\x40\x4f\x7e\xae\x8b\x7f\x9c\x95\x05\x63\xea\xc8\x71\x13\xac\xab\xef\x0f\x2d\xaa\x8b\x38\xcc\x86\x0e\x59\xe4\x06\x4c\x9a\x56\xa0\xc6\x2d\x4f\xf3\x43\xeb\x68\x36\x3e\xd8\x6e\x5a\xf3\x5b\x47\xae\x72\x10\x42\x70\xee\x1a\xd0\xb1\x0f\x6e\x22\x64\x88\x3c\x9f\x80\x8d\x54\xe0\xbf\x2f\x16\x0f\x9d\x35\x8a\x3c\xc5\xb0\xa7\xf1\x6e\xfe\xf4\xe7\xd3\xaf\xc7\x6b\x21\xdc\xc8\x85\x89\x3c\x4d\x5c\x53\xa8\x68\x82\x90\xa3\x36\x0a\xa8\x1a\x8f\x60\xaa\xe8\x3d\xd5\x96\x69\x4e\xe7\x3b\x24\x61\xd2\x38\x8f\xcf\x50\xfe\x82\xf4\x36\x2d\x2b\xea\x44\xb5\x77\xea\x87\x09\xf7\xb1\xc3\xeb\xc7\xf2\x71\xbf\xdd\xcd\x1e\x17\xb3\xcd\x62\xdf\xc4\x26\x9e\xdf\x0e\x02\x9d\x98\x65\x86\x99\x2b\xa3\x99\x3c\x98\xbe\x51\xe0\x87\xa6\x88\x50\xe6\xe4\x7a\xb6\x49\xc6\x28\x08\x88\xae\xa2\xb3\xa8\xfd\x64\xde\xe8\x2d\x04\x21\x75\x4a\x21\x62\xeb\x49\xe3\x3e\xf6\xad\xd3\x1b\x85\x3c\x41\x2f\x01\x3e\xf1\x5d\x6d\xc8\x9b\x29\xca\xaf\x41\x6d\x2a\x62\xd2\x47\xa4\x22\xb2\xbc\xee\x3e\x0a\xca\x2a\x99\x83\x51\xe0\x99\x3e\x7e\x04\x9b\xab\x73\x55\xf3\x5a\x0e\x63\xb0\x28\x0a\xc0\xca\xa1\xac\xab\x03\x02\xea\xcb\x09\x35\x16\x1d\x45\x2c\x46\x7b\xb3\x23\x07\xec\x85\x80\xce\xdf\x41\x8c\xa2\x48\x09\x1e\xd8\xc7\xa6\x0e\xc2\xd6\x48\x45\xb1\xeb\x61\xb5\x72\xf5\x6f\x5e\x75\x5d\x65\xcd\xdf\xfd\xc4\x64\xca\xac\xa8\xf8\xb6\x86\xd3\x68\x41\xc5\x9e\xa0\x40\x1e\xd2\xb6\x95\xa2\xfb\x38\xb1\x20\xc1\x90\x66\xa9\x2c\xd2\xf7\x2b\xef\x38\x56\x12\x51\x97\xcb\xb2\x5c\x57\x1d\xd6\x60\xf0\x08\x89\x13\x21\x60\xb3\x35\xa5\x37\x50\x75\x9c\xfb\x7f\xab\xff\x43\x47\x49\xec\x4a\xe3\x0f\xff\x02\x9e\xd5\xaf\x4f\x7a\xd0\x93\x39\xb0\x65\x51\x12\x87\x16\x8a\xdf\xa2\xec\xb7\x75\x51\xf2\xce\x6a\x70\x97\x21\x05\x7f\x0e\xbc\x84\xaa\xfe\x91\x17\x1f\x39\x26\x8c\xbb\xd6\x29\x1d\xf1\xc0\x41\x89\x46\xf8\x24\x23\x76\x5b\x94\xc7\x73\xc6\xdb\xc3\x91\x9b\x10\xe0\xed\x74\x9b\xb6\xc9\xf9\x48\xf8\x2c\x8a\xda\x16\x57\xae\x78\xcd\x5f\xca\xb1\x39\x93\x4a\x60\x8f\xd3\x62\xf9\x73\x3f\xd4\x0e\xd4\x91\x12\x12\xe9\x27\x75\x59\x1c\xc9\xbe\x0e\x2c\x6b\xa4\x7d\x90\xe4\x00\xe6\xaa\x71\xe8\xef\x8b\x73\x39\xc1\x1b\xa1\x23\x1d\x11\x76\xc4\x64\xdf\xba\x54\x49\xec\xf8\xa4\x42\xba\x7c\xd9\x3c\xb5\x7f\x63\xae\x49\x19\x9c\xbe\x97\x87\x31\xe3\xdd\x10\x94\x3b\x90\xd3\xb2\x76\x89\x58\x59\xae\x19\x25\xba\xc5\xc1\x24\x89\x5d\x21\x31\x5e\x42\x65\x87\x75\xaf\xef\xe1\xd2\x82\xc5\x3e\xb8\x48\x1a\xb3\xb7\xa0\x8a\x09\x7e\x1a\x1d\xfb\xcd\x3a\xb0\xf2\xf2\xdb\x33\x26\x28\xf5\x39\xdb\xf2\x0c\x9e\xcb\x42\x42\x3b\xd5\xe3\xd0\x75\x31\xcf\x73\x1f\x2c\x06\x88\x45\x1d\x87\x21\x51\xf5\x99\x0a\xdd\x7c\xb2\xcc\x1f\x87\x9a\xf2\xb8\xca\xf6\x57\x56\x96\xfa\xd8\x9e\x87\x79\x24\x33\x88\x04\x30\x8d\x4f\x42\x9a\x0a\x5d\xea\x3a\x66\x61\xc8\xe2\x7e\xc7\xf1\xe8\x1a\x2c\x51\x9e\xa5\xb4\xae\x2a\x82\x07\x4c\xdf\x0d\xd3\x1e\x66\x84\xd6\xb3\x3f\xf7\x4f\xcf\x8d\xf9\x7e\x7a\xb0\x19\x90\x38\x76\x7c\x34\xb9\xe6\x27\xf3\xa7\xf6\xe3\xc7\xa1\x46\x57\xb9\x2e\xf9\xa0\x42\x10\xc7\x1c\x42\xdd\x36\x6e\xf9\x43\x4a\x71\x33\x26\x49\x34\x62\xf8\x9e\x5f\x79\x79\xe4\x75\x39\xea\x69\xd1\x31\x77\x3d\x6d\x32\x2f\xeb\xea\xe0\x0d\x2c\x70\xcc\x85\x46\x89\x7e\xe2\xd9\x1e\xe5\x5f\x63\xe1\x78\x58\x01\x33\xed\x8b\x53\x64\x04\xdd\xc8\xd0\x64\x39\x0c\x42\x6c\x25\x0b\x03\x1e\x1f\x9d\x53\xc5\xb8\x2b\x29\x14\xfc\x58\x5f\x6b\xb3\xd1\xb1\xf4\x7c\x6c\x99\x3a\xa4\xef\xc4\x67\x3d\x51\x6a\xb3\x43\x93\x18\x2d\x94\xce\xd2\xd3\xba\x78\x6f\xdb\x9c\x76\x45\xff\x3b\x4b\x0d\xb8\xec\xa9\xf5\x7c\x03\x55\x71\x2e\xe5\x80\x2e\x9c\x92\xad\xed\x64\x57\x9e\xc2\xfe\x8d\xc6\x7f\x9a\x61\x70\x09\xea\x16\xe0\xea\x8e\x6f\x7f\x06\xb1\xeb\xb4\xfb\x46\xe3\xfb\x92\xd0\x84\x39\x0c\x11\x09\x84\x62\xd3\xe0\xcd\x8f\xd1\xeb\xd1\x8e\x34\x76\x2d\xb7\x39\x80\x49\x4f\x3b\xd6\x6e\x44\xcc\xab\xc0\xa7\xf5\x1d\x7a\xe7\x8c\x25\x36\xa6\x1b\x53\xd4\x57\x43\x18\x9d\x53\x93\xbc\x2b\xcf\x32\xd4\xcc\xf9\x55\x16\x6d\xda\x27\x71\x3c\x57\xab\x41\x92\x60\x5e\x14\x88\xc1\xb9\x12\xd3\x25\x8e\xe2\x3a\xb0\x7d\x45\x8a\xd8\xff\xda\x1d\x34\x71\x63\x0f\x83\xc7\xe5\xee\x7e\x4e\x5b\x7c\xd1\x1d\x13\xe4\xba\x10\xdb\xf4\x9a\xf2\x02\x83\x7b\x4d\x3c\xbf\xe7\x94\xcc\xf9\xe9\xb6\x28\xd1\x99\x5a\xf3\x34\xef\x69\xa0\xeb\xc4\x63\x91\xef\xf5\xb2\xb1\xd3\x09\xfe\xc4\xe3\x12\x0b\x46\x58\x69\x0b\xf6\x1c\x8d\xd6\x06\x9a\xd5\x82\x7b\xd8\xde\x40\x5a\xf6\xd5\x6b\x71\xce\x14\xb2\x47\xb4\x97\x10\x94\x12\xbf\x2f\xea\x87\xe2\xbd\xbb\xb2\x0e\x31\xf5\x87\x4d\x25\xee\x5e\xe7\x72\xda\xdf\x18\xbd\xb6\x80\x6b\x41\xea\xef\x85\x3d\x53\x00\x3e\x31\x71\x53\x08\xf6\xc0\x8f\xa2\x98\x4c\x93\xd9\xe8\xa8\x09\xee\xc2\x6e\xb2\xdf\xa7\x4a\x21\x47\x4b\xda\x26\xd8\xa8\x2d\x8a\x05\xff\xeb\x99\x79\x6f\x53\x3c\x49\x28\x62\xdf\x37\x8c\xe5\x69\x09\x0a\x29\x99\x16\x70\xb2\x0c\x46\x3a\x61\x09\xa1\x94\x1a\x3b\xf7\xf2\xd8\x18\xb9\xfd\x66\xb6\x5b\x59\x83\x96\x44\x91\xc0\x60\x3e\x87\x8f\x1d\xaf\xde\xa6\x6b\x25\xa3\xa7\x8e\x62\x90\x4e\x2b\xf6\x88\xa2\xb6\x03\xd2\xed\xe1\xe8\x66\xe3\x90\x6d\x48\x7a\x9f\x56\xe8\x5c\x8e\x05\x0d\x86\x33\xa6\x99\x55\x9c\x7a\x30\xd7\x70\x14\x50\x52\xe5\x6c\x34\xaf\x12\x49\xa1\xca\xcd\xf2\x71\x79\xbb\x9a\xaf\x66\x9b\xbf\xec\x63\xf1\x48\x62\x34\xd2\x09\x7b\xff\xe2\xef\x3d\xbc\x79\xdf\xb2\x26\x3c\x16\x48\xa8\xb9\xad\x4b\xe0\xc7\x2e\x6e\x20\xdc\xee\x34\xef\x87\x4e\x84\xef\xf6\xfb\x30\x11\xa8\x65\x2f\x2f\x02\x27\xe9\xe8\x5c\x96\x9f\x44\x23\xd2\xa3\x11\x1e\x3e\x88\x74\xa9\x77\xd5\x92\xd9\x93\x31\xf9\xb6\xec\x90\x48\xd1\x52\x57\xcd\xb3\xa2\x32\x71\x9a\xbd\x01\xad\x29\xa5\x31\x6b\xd6\x19\xb7\x24\xf4\x9a\x3b\x0e\x69\x18\xea\xf4\xd4\xe2\x2b\x2c\xcb\xd1\xf0\x1b\x70\x27\x24\xd6\x08\xe4\x37\xe5\xd9\x5d\xc1\xb3\x4d\x9f\x36\x41\x73\x87\x69\x64\x26\xb7\x7e\x5f\xd5\x78\xc1\x4b\x4c\xba\x5b\xc6\x78\xcd\x9d\x48\x90\x92\xc1\x58\x8d\xfe\x7b\xb7\x89\xbb\x01\xf5\xe3\x17\x1a\x41\x49\x19\xc9\x54\xda\x83\x4a\x63\xe3\xdc\x66\x75\x67\xff\xe4\x05\x2e\x5e\xe7\x84\xe5\xa7\x9b\xa2\x78\x6b\x8f\xb0\x08\x8f\x6c\x80\xab\x9b\x54\x64\x53\x59\xb7\xf6\x9f\xf6\x37\x9c\x52\xa2\xf4\xf0\x68\x0d\xad\x9f\xc2\x7d\x47\xf9\x16\x71\xbf\x31\x3c\xc8\xdf\x7e\x2c\xee\xf3\xc0\x85\x36\xcf\xfd\x61\x60\x54\xb6\x7d\x47\x73\x1f\x1c\x4c\xa0\x9a\x1a\x49\xdf\xb3\xe0\x41\x22\xf1\xd8\x16\xea\xdd\x67\x8f\x21\x7f\x74\x89\x40\xb3\xc4\x74\x76\x35\xae\x4f\x55\x15\x65\xe3\xfd\x7c\x9f\xa1\xe7\x58\x9f\x31\x48\x4e\x94\x4b\xbc\xf9\xfa\x26\xf7\xc9\x43\xe6\x61\x54\xbc\x3e\xf1\x0b\x7a\xc9\xfe\x92\xe2\xcc\x95\x2a\xee\xf5\xe5\x0f\x27\x3c\x67\xa1\x8b\xda\xf1\x32\x03\x5e\x52\x44\x6c\xaa\x35\xf6\xa9\x59\x12\x12\x3c\xb9\x2e\xd3\x37\x98\xf3\xac\xfd\xf6\x51\x4c\x61\x1b\xc1\x17\xb0\xaa\x33\x42\x2f\x58\x2f\xc1\xeb\x9c\xe2\xe8\x5f\xc3\x5c\xf1\xff\x7a\xff\xb2\xa7\x93\x42\x9b\x82\xd1\xf2\x13\xe4\xbc\xa8\x46\xae\x15\x8f\x1d\x97\x34\xf3\x0e\x65\x8f\x95\x44\xf3\x38\x4c\xf0\xa3\xee\x66\xf3\xdd\x6a\x3e\x7b\x98\x6f\x5e\x56\xdb\xb6\xae\xc7\x13\x4f\xa9\xe6\xf0\xbf\xb9\x7c\x3b\x15\xf5\xbc\xc8\x15\x9a\xf4\x21\xfa\x81\x27\x81\x16\xbe\x81\x17\xed\xca\x33\x82\x04\x7a\xc0\x3d\x9e\x44\xa1\xa4\x0e\x0b\x5e\x57\x7d\x91\xfe\xd1\xa7\x49\x92\x08\xf7\xe1\x41\x06\xec\xe6\x6b\xcb\x35\x0c\x32\xac\x9c\x7b\x49\x12\x5b\x64\xc4\x6a\xfe\xb4\xf7\x9c\xfd\x02\x24\x9a\xd9\x76\x8c\xef\xb8\x56\xcf\xe9\xf6\xdc\xdb\x0c\x87\xd7\xe4\x21\x60\xa6\x8c\x96\xbf\xed\x95\xb6\x0f\x30\xbd\xae\x79\x22\x84\x30\x11\xb3\x85\x53\x4d\x3f\x11\x57\x01\x33\x88\xb2\x59\xcf\xab\xa5\xa4\xd5\xf0\xa4\x82\x11\x7e\x68\x6f\x4b\x73\x88\x93\x30\x86\x06\x35\xd7\xae\x7b\xaf\x5c\x48\x17\x29\xf6\x9a\xa0\xea\xb6\xe4\x72\x0e\x69\xd6\x6b\x32\xba\xb2\xa4\xa5\x6b\x88\xdc\xe0\xc3\x30\x17\x14\x45\xf6\xb7\x9a\x67\x9b\xdf\x2a\x9f\x4a\xc6\x8d\x4d\xfa\xba\xbd\x78\x1e\x29\x03\xf4\xee\x0c\xf7\xe2\x5d\xf1\xde\x6c\x20\x3d\xc6\xca\xff\x19\x8f\x17\x20\xba\xf6\xee\xe7\xb2\x38\x95\x69\x31\x3a\xa9\xf2\x49\x0e\x42\x9c\x4b\xec\x6d\xff\x3e\xe9\xcc\x21\xa0\x5a\xcd\x71\xbf\xdc\xdd\xa3\x6f\xdc\x58\x2e\x4c\x3f\xb5\x73\x09\x84\xb0\x1c\x25\x37\x50\xd7\x50\x56\xd8\xcc\xd3\x27\x51\xd4\x1c\x74\x80\x40\xe3\x99\x90\x03\xc3\x06\x9a\x1a\xdd\x0e\x50\xdf\x95\x3c\xaf\x01\x88\xc2\xcd\x1c\xd6\x6e\x9c\xe0\xc4\xe7\xef\x2d\xb2\x99\x4a\x61\x53\x06\x47\x27\x3c\xf1\x2d\xc7\x11\x29\x2a\xb4\x27\x12\xae\x6b\xd8\x53\xf7\x27\xec\x74\xd8\x8b\xaf\x7d\xb3\x11\xef\x89\xef\x6a\xf2\xf9\x85\x13\x05\x31\x39\xa3\x8d\xc7\x02\xbf\x40\xf4\x39\x4d\xcc\x20\xd7\xa7\x64\xc0\xa9\x84\x54\x16\x46\x81\xdc\x1e\x8b\x48\x6d\xa4\x31\x53\x4f\xf9\xae\xe4\xaa\x07\x4a\x13\xae\xf0\x28\x60\x4c\x0f\xa3\x30\x50\x78\x9e\x69\x01\x9b\x3f\xed\xb7\x7f\x6d\x77\xcb\xf5\xa0\x8d\x46\x78\xcc\x41\x77\x01\x77\x25\x74\xaa\x17\x90\xd5\xfc\x6a\xba\xfb\xdb\xc9\x28\xbc\x88\x61\x9b\x83\x61\xe6\x9a\x5b\x0d\x64\x7b\x98\x3b\x58\x26\x30\x55\x74\xac\xde\x8e\x4e\x20\x24\xc6\x0e\xa7\xa2\xaa\x77\x1f\x69\x3d\x08\x5b\x85\xa7\x7d\xa4\xf3\xa5\xbc\x30\xf5\x90\x5e\x12\x23\x6a\x11\x86\xcc\xc0\xba\xdf\x20\x7f\x04\x0c\x42\xb0\x78\x84\x0c\x1e\x8e\xbd\x9d\x90\x85\xb8\x32\xce\x93\x92\xb5\x76\x90\x08\x2d\x5a\xf5\x11\x3e\x6b\xdb\xfd\x35\xde\x27\x86\x3f\x62\xae\x36\xb4\x91\xd5\xe9\x3c\x62\xd2\x1c\x0d\x8d\x58\x84\x36\x59\xf3\x34\xdb\x9e\x05\x4e\xcd\x5f\xaf\x90\xcf\x1e\x88\xfe\x33\xbf\xb1\xb7\x1b\x07\xce\x40\xb6\x16\xe3\xf1\x29\x8d\x91\xee\xe4\x71\xec\xc5\x54\x34\x2f\x2b\xd8\x3c\x3c\xdf\x03\x6f\x89\x51\xcc\x90\x44\x11\xd1\xf6\xcf\xa2\x86\xed\x59\x98\x86\xc5\x41\x55\xc3\x94\x4d\x05\x17\xdc\x33\xaf\xe2\xbe\x47\x34\x39\x58\x3c\x82\x4b\x07\x03\x54\x7b\x97\x88\x38\x3c\x42\x5e\x8f\x80\xe0\x42\xc8\x44\x26\xc6\xf3\x41\xf6\x09\x5b\x2f\x1c\x4d\x09\xa1\xc0\x23\x53\xf3\xb5\x28\xf9\xc1\x06\x47\x42\x3a\x42\x9b\x64\x38\x65\x98\x5a\x05\x1e\x2d\xa4\x17\xa0\x98\xe6\xfc\xc9\x08\x1b\xb6\x07\x62\x1f\xab\x5f\xd8\x65\x31\xe7\x79\x13\xe3\xf7\x92\x05\x42\x6a\x4a\x0a\x35\x9e\x30\xf1\x45\xce\xcb\xaf\x53\xcd\xf3\xc6\x9a\xe3\x63\x0c\xae\xa3\x3c\x17\xfb\xf3\xf7\xc7\xf4\xd0\x4c\x6a\xd3\x48\x86\x30\x91\xaa\x1b\x14\x60\x24\x6a\xdf\x88\x75\xe1\xa7\xa5\xb3\x86\x0f\x0f\x42\x61\xcd\x50\x17\xc5\xe8\xb5\x68\xa6\x91\x10\x63\xb7\x79\x5c\xf4\x4d\xa1\x68\x1e\x12\x1b\x5e\x97\xbb\x5d\xa7\x18\xa2\x85\x96\x1e\x62\x8f\xc9\xae\xef\x80\x1f\x97\xbb\xfb\xc9\x84\x96\xd0\xd2\x47\xfe\xfe\xfb\xcd\x5f\xdf\x79\x66\x42\x43\xd2\x83\xfd\xed\x8f\x69\xbe\x37\x9d\x02\xa3\x7b\x05\xc1\x93\x5e\x8b\xaa\xb9\xea\xcd\x17\x12\x01\xf6\x4f\x29\x1d\xce\x15\xb1\x28\x3e\x9e\x8f\x50\xa6\xd2\xc8\x04\x0d\x06\xb9\x21\x91\xb0\xbf\x41\xd6\xb6\x35\x4a\x37\xa2\x8e\xb0\x9d\x82\x6d\x5d\x9c\x4e\xe3\x89\x24\xdd\x48\x5b\xed\x46\x83\xab\xf6\x87\xa7\xf5\xc3\x04\xb1\x91\xdb\x79\x4b\x9a\x69\x4f\xee\x6b\x17\x43\xdb\x5f\x69\xae\x8a\x0f\x72\x82\x8c\x85\x9e\xfc\x70\x32\x00\xe2\x28\xa4\xa8\xed\x42\xb0\x4a\xcb\xd0\x65\xd8\xa9\x34\x7f\x5a\xaf\x9f\x1e\xf7\x37\x2f\x8b\xbb\xe5\x6e\xc0\xae\xaf\x65\xe8\x79\xb6\x6d\xee\xf9\xe9\xe9\x81\x08\x42\xdc\x64\x78\xd7\x21\x27\x81\xa0\x7f\x14\xe7\xac\x9d\x74\x92\x39\x81\x13\xa2\x43\xf9\xf8\x63\xbf\xfb\xeb\x79\xd9\x1e\x08\x34\xda\xc6\xa2\x3c\xf0\x3c\xfd\x2f\x94\x71\x7b\x04\x62\x41\xfd\x36\xcb\x76\x57\x96\x91\x1b\xb2\xd0\xd2\xc7\x96\x6f\x50\x9f\x32\x2e\xe1\xdb\xce\x45\x19\x31\x97\x77\x21\xe8\x80\xbf\x67\x5a\xe2\xe5\xfb\x5d\x45\x46\x91\xc2\x19\x8d\x8d\x1a\xcb\xdd\xfd\x5d\xfa\xde\xd8\xfd\xc7\xa2\xac\x5f\x9f\x8b\x76\x1b\x94\xb1\xeb\x05\xaa\x95\xd0\x2c\x72\x35\x05\x64\x94\x71\xa0\xd0\xea\xff\x39\x1f\x40\x24\x65\x2c\x7d\x24\x19\xd8\xcd\x16\xcf\x4f\x0f\xcb\xfd\xcd\x6c\xbb\xdc\x6f\x96\xff\xb4\xc7\x93\x40\xf0\xa1\xc4\x61\xdf\x3f\x19\x7e\xdc\x84\x07\x6e\x2b\x8b\x40\xf9\x06\xbc\xe9\x69\x50\xb4\xe4\xbe\x40\x6f\x6a\x77\xb3\xec\xe8\x8a\xed\xb1\x90\xd8\xbe\xd3\x6a\x37\x7b\x1a\x3d\x0a\xe7\xc4\x0f\x4c\x93\xcc\x00\xca\x87\x2c\x31\x66\xa4\xf0\x1c\xe8\x1a\x5f\x36\x50\x41\xf9\x8e\x36\x60\x03\x32\x3d\xa5\x30\x46\xf4\xca\xc6\x0b\x26\xf2\x19\xfc\x62\x77\xbc\x9a\x72\x95\xa4\x0a\xa8\xb4\xb9\x4e\xf3\xb4\x09\x11\x97\x48\x61\x63\xef\x5d\x31\x07\x45\xc1\xb0\xca\x53\xc3\xdb\x4b\x9e\xbe\x43\x59\x8d\xb5\xbd\xb4\x54\x20\x38\x56\x0e\xce\xb9\xda\xa3\x6d\xb6\xa7\x00\xd7\xc3\x50\x64\x29\xcb\xb6\xd6\xf1\x77\xd1\xc0\xe6\x14\x3a\x0e\x84\x1e\x72\x77\x22\x02\xb0\xc7\x7f\xad\x95\xa3\x7d\x64\xab\x43\x62\xeb\x79\xd1\x38\x7d\x08\x00\x43\x42\xed\x87\xa2\xb8\x12\x82\x28\xcf\x8f\xd1\x14\xad\x6f\x77\x2f\xf6\x5c\xbe\x50\x58\x7b\x38\xf1\xaa\xea\x88\x84\xda\xa3\x0a\x70\xfe\x91\x40\x3d\xfa\x07\x0a\xf1\xfd\x6b\x38\x16\xe5\x17\xcd\x96\x2d\xfc\xe7\x0c\x5d\x51\x57\xf9\x5a\xe2\xe4\x14\xf5\x6b\x77\x46\x33\xbd\xcd\x90\x80\xf9\xd8\x78\xb8\xdd\xcd\x36\xbb\xf5\x72\x37\x5b\x3c\x3d\x3c\xcc\x36\xed\xe1\x88\xd9\x16\x43\xec\xd8\x5c\x55\xd5\xb9\xf5\x2f\x55\x00\xd2\x8b\xfb\x9d\xbe\xbd\x57\x13\x68\x4f\x77\x73\x87\x54\xc4\xaf\x13\x68\x68\x15\x86\x1e\x0b\xbb\x80\x63\xc2\x41\x53\x21\xa7\x1e\x9b\x3b\xa8\xe7\x59\x33\xfb\xe6\xbc\x86\x43\x61\x65\x36\xb4\x0a\x41\x22\x94\x5a\x30\x66\x2a\x3b\xb7\xe7\x5c\x59\xe5\xec\x63\xfb\xd0\x4c\x05\x8e\x68\x83\x06\xd4\x7e\x42\x22\xe0\x11\x77\x83\x4a\x82\x04\x69\xc5\xda\xe7\x1b\xa1\x7a\x55\x12\x72\x0c\x10\xc9\x66\xdd\x41\x3e\x4d\xba\xe7\xf6\xa4\x86\xb4\x4a\x22\x89\x6e\x1e\x36\x8d\x62\xf3\xaa\x3d\x1d\x8f\x5c\x46\x0c\x72\xc5\xc9\xf8\x35\x06\xea\x6e\x07\x28\xe9\xb9\x26\x59\x52\x17\xb3\xe1\x56\xa5\x38\xf8\xb6\x8d\x7b\xd4\x6d\x6a\x07\x68\x92\x5e\xc2\xe9\xba\xaf\xaf\x73\xc5\x69\x25\x7c\x60\xd2\x6a\xab\xa2\xd3\xda\xd3\x13\xb5\x63\x84\x8f\xa1\x87\x3c\x1f\x9b\xf9\x77\xaa\xc1\xbe\x6b\xbb\xa1\x28\x19\x3a\x98\x59\x3e\xa6\xf9\x68\x2b\x53\xb2\xf1\x71\xfa\xd4\x51\xdf\x3b\x35\x4a\xb1\xd0\x37\xb4\x57\xb7\x45\x59\x9f\xf3\x11\x38\x45\x29\xa0\x48\x88\x28\x26\x77\xe9\x11\x6e\x78\x65\x3b\x68\x7b\xef\x5f\x69\x6a\x68\x3b\x10\xbe\xc4\xb6\x92\xec\x47\x4f\x07\x92\x63\x0f\xd2\x62\x79\x3b\x7b\x79\xd8\xed\x77\xcb\x3f\xed\x16\xab\xb4\x1b\x92\xe0\xad\xa1\x69\xdf\x15\x76\x6f\x1b\x3e\xa3\x8e\x88\x0d\xd1\xd0\xad\x19\x0a\xde\x81\x7c\x8f\x56\x5a\x91\xd0\x29\x06\x8e\x5b\x90\x65\xfb\xbd\xc1\x09\x42\x4d\x4c\xe5\xa4\x07\x81\xe9\x8a\x56\xb8\xf3\x8f\x7e\xfb\xeb\xb7\x54\x65\x1a\x5c\xe9\x60\x2b\x69\xdd\xe7\xc8\xb8\x96\x00\xb5\x45\x2d\x68\xec\x7f\x60\x3b\x5d\x6d\x7d\xa3\xed\xbd\xb1\x83\x12\x19\x61\x21\x88\xea\xf7\x2b\xb5\x2b\xb6\xd0\x97\xaa\x33\xe3\x82\x90\x63\xa7\xe7\x06\x71\xb4\xdf\x49\x89\xfd\x3d\x13\x0d\x81\xf0\x90\x5a\xa5\xc2\x00\x64\x5b\x03\x7f\xbb\x38\xe3\xf0\x2d\x84\x86\xf9\xe6\x11\x3e\x3f\xcf\x55\x7f\x23\x07\x96\x04\x08\x8f\xc7\x3f\x0e\xf9\x33\xaf\x12\x27\x00\xe3\x01\x42\x9a\x32\x5e\x1e\x10\x2c\x51\xb4\xa7\x03\xa2\xcb\x40\x11\x5c\x7f\xbf\x7d\x79\x7e\x7e\xb0\xb5\x01\x88\xdc\x04\x37\x7a\x23\xf3\x7a\x91\x21\xed\x07\x7e\xf6\x27\x9c\xc4\x38\xc4\xb9\x2c\xd3\xba\xb8\x10\x74\xd4\x10\x73\x09\x1d\xd2\x7a\x7b\x3e\xf5\x34\x39\x86\x53\x1b\x92\x30\x70\x4d\x5e\x0b\x0d\xba\x01\xf4\x4c\x15\x98\x20\x89\xc0\xe7\x5d\x3d\x70\x96\x2b\x4c\x85\x8e\xbf\xd4\xe0\xb5\x24\x49\x88\xc5\x53\x94\x29\xd8\x42\xbd\x38\xc3\x05\x33\x43\x3b\x54\x60\x8e\x27\xcd\x2b\x28\x47\x89\x95\xd1\x49\xc1\xe5\xdd\x86\xb2\x37\x37\x70\xed\xdd\xd9\x1f\xe9\x98\x0c\x66\xcd\xcb\x9a\x48\xd4\xdb\x79\xcb\x1d\x62\x17\x2f\xe1\x1d\x78\x76\x93\x5e\x70\xa3\xfc\x0e\xad\x37\x7a\x14\xce\xe8\xab\x7e\x40\xba\x81\xff\xf4\x3a\x8e\x81\x47\xc2\xa3\x76\xba\x21\x64\xf2\xda\x89\x22\x11\x9b\x18\xd5\x0a\x4a\x8d\x3e\x20\x4f\x98\x87\xdc\x6a\x16\x2b\x55\xfd\xb3\xb6\xbb\x20\x48\x10\x88\x6d\x85\xcf\x1a\x72\xb5\x6f\xfe\x0f\xfb\xa7\x46\xf3\x45\xf9\x12\x55\x07\x9a\x10\x7e\xce\x47\x59\x5d\xb7\x1d\x15\x29\xee\x74\x90\xf4\x1b\x2e\xdf\x5e\x2a\x28\x57\xed\xb3\x29\x4e\xf0\xe2\xe7\xa7\x95\xfd\x13\x78\x4c\x82\x49\x9b\x9e\x2e\x34\x12\xcd\x3f\x83\x6f\x0b\x10\x61\xa6\xeb\xaf\x5f\x37\x83\x45\x09\xda\xc3\x28\x05\x3e\x4f\xd0\x18\x9e\x01\x1d\x85\x76\xa2\x08\xf1\x08\x94\x89\xb9\x21\xca\x8a\xa7\x13\xe4\x15\x16\xa2\x26\x93\x1b\xda\x8b\x03\xe9\x99\x2c\xf5\xb9\x86\xab\xe5\x0c\xed\x41\x82\x33\x73\xf5\xb8\xda\xad\x66\x0f\xc3\x25\xac\x7d\x06\x08\xfd\xb9\xd9\xdd\xdf\xf4\x52\xf2\x3a\xf0\x88\xae\x6f\x7e\x7f\xbb\x47\xea\xaa\xe7\xe5\x66\xdf\x4f\x26\xe8\xc0\x8b\xc2\xe8\xfa\x82\xfa\x16\x8b\x63\x4f\xa1\x3d\x14\xaf\x36\x05\xde\xe2\xbd\x89\x5d\x6d\x49\xd3\x65\xe3\x2d\x60\xf4\x60\xa1\x23\x30\xfe\x26\xf6\x11\x62\x5d\x18\xa0\x6e\xc7\xe3\x13\x65\xb5\x64\x97\xf5\x2b\xae\x23\x6c\xc4\x33\xe4\x48\xed\x28\x40\x5a\xa4\x63\x9a\xa7\xf9\x61\x95\xcb\x66\xe2\xbe\xc3\xc0\xdb\xd4\x21\x38\x8e\x81\x76\xa2\x00\x99\x9c\x26\x8c\xd0\x21\x10\xc0\x9b\x97\xc7\xaf\x1d\xcf\xdf\xa6\xda\xe8\x35\x93\x21\xe6\x2f\x17\xcb\x9f\xcb\x87\xa7\xe7\x75\xf3\xb6\x6f\x5f\x1e\x17\x7b\xa4\xfd\xd9\xad\xd6\xcb\xed\xf3\xac\x7d\xed\x4c\x03\x66\x27\x4e\xcd\x93\xf6\x27\x99\x8e\x98\xcb\x7c\x1b\xa2\x95\xc6\x41\xb5\x0b\x40\x47\x3c\x76\x4d\x1c\x30\x7b\x3f\x50\xdb\x1f\x85\x36\xfd\x9c\x8e\x4e\x3c\x1f\x3b\x67\x0a\xa3\xf0\xb4\x27\x72\xc8\xc9\x3c\xc8\xff\x06\xff\xb2\xbf\x8a\x95\x85\x55\x23\x0c\xa1\x5f\x47\x1d\x3e\x6c\x22\x1c\x9f\xea\xd1\xf2\x6d\x81\x90\xbc\xcb\x92\x9f\x1d\xaa\x1d\x0c\x2e\x6c\x51\xf4\xb1\x38\xa6\xa8\xa7\x78\xcf\xdf\xdf\x21\xaf\x66\xf5\xf5\x4e\x0c\xcd\x63\x37\xec\xf2\xf8\xf7\xc5\xb9\x82\x3d\xcf\xd5\x1e\xb7\x92\xfd\x05\x61\xf5\xd0\xdc\x6a\xe1\x84\x01\x5c\xc4\xfd\xa3\xf6\x61\x3b\x36\x66\xbe\x6b\x31\xff\xd8\x14\xd7\x78\x63\x3a\xcd\xe0\x65\xb3\x1a\xfa\x51\x5a\x24\x80\x05\x30\x5a\xe9\x77\xbc\x79\x9a\x3f\xf9\xb9\xec\x6f\x83\xa3\x07\x11\x9a\xf4\x2b\x4e\xbc\x71\xf1\x88\xb2\x62\x38\x42\x46\x02\x83\x37\x9d\x96\x55\x8b\xbf\x1c\x7c\x54\xc5\x5d\x30\x99\x94\x9b\x8c\xcb\x37\x9d\xf1\xae\x28\xd3\x6d\xce\x5a\xf1\x04\x93\x64\x1f\x6d\x4f\x61\x4f\x8d\x6d\x78\x51\xc5\x39\x62\x50\x6f\x06\xe9\x37\xad\x23\x81\x35\x38\x6a\x4b\xc1\x16\xbc\x91\x73\x60\x07\x72\x8e\x88\xc9\x1f\x69\x7e\x50\xc5\xb1\xfd\xbd\xf0\x75\xcf\xa7\x45\x9c\xaf\x79\xab\x38\x99\x86\xaf\x5e\x83\xa3\x08\x4a\xdb\x04\x17\xb3\xb2\x4c\xdf\x79\x36\x31\xe9\x34\x40\xe2\xb5\x1d\x1f\xcd\xb4\x87\x5c\x7e\x0d\x14\x5a\x9b\x91\xbe\xe3\x38\x11\x10\x4f\xe3\x81\x20\x73\x9d\x48\x5c\x73\x30\x16\x98\x21\x3b\x9d\xb3\xcc\x12\x59\x3c\x1b\xe4\x62\xef\x82\xbe\xe3\xb8\x5e\x82\x5b\x32\xba\xc2\x3b\xe0\x47\xe2\xa9\xa7\xcc\xd9\xd3\xfb\x34\x8e\xb4\xf9\x5d\xec\x91\x10\x0c\xcf\xc0\x9d\x5a\x16\xbe\xe3\x78\xae\x40\x37\x7b\x7b\x16\x8b\xf4\x7d\x74\x61\x2f\x70\x90\x82\x62\x3d\xfb\x73\xbf\x59\xde\xbd\xd8\x10\xd8\x77\x1c\xdf\x49\xb4\xd3\x31\xd7\x3f\xf3\x2f\xc1\xe5\xdb\x98\xb4\xd4\x77\x9c\xc0\x57\x38\xf9\x51\xcc\x72\x57\x4c\xf3\xee\x8e\x6e\x2a\x00\x8e\xb3\x74\xf9\xb4\x5d\x6c\x66\x6b\x7b\x4d\x16\x09\xc3\x32\x5e\x1b\x29\x49\x0c\xdd\x07\x24\x07\xcd\x30\x6d\x88\xf7\x8a\xc6\xcd\xca\xd5\x22\xd5\x1a\x4a\xc8\x29\xa4\xbd\x86\xcc\xf4\x1d\x27\xf2\x43\x4c\x0f\x59\x64\x66\xaf\x5b\xf4\x6a\xab\xc2\xf0\x8d\x47\x01\xa9\xa1\x18\xaa\x38\x2b\xa8\xa2\xec\x13\x24\x5e\x9f\x8f\xb9\xf1\x31\x7e\x41\x7a\x78\xad\xfb\xbc\x5a\xdd\x6b\x48\x7c\x22\x3f\xde\xe3\x03\x37\xee\x58\x75\x55\xe6\xb3\x19\xce\x29\x57\x90\x56\x1b\x38\x8c\x66\x62\x22\x24\x76\xd6\x63\x8c\xdb\x4c\x1f\x4c\xff\xe7\xf6\xbe\xb8\xcb\x23\x92\xf8\xfe\x6c\xd6\x29\xe5\x89\xb1\xc0\x3c\xb4\xd4\x58\x73\xe9\x7c\x94\xe6\x97\x1e\x15\x83\x25\xcf\xf7\x07\x18\xe9\x17\xba\x9e\x1d\x15\xb8\x6e\x2b\x89\x20\x8b\x52\x5d\xa1\x76\x6b\x86\x0a\x85\x75\xad\xe3\x3e\x3f\x1f\x09\x64\x54\xb5\xb7\x29\x29\xf3\x46\xbb\x55\xda\x44\x98\x58\x25\xe8\x72\x42\xbe\xe3\x88\x30\x51\x36\x3a\x1c\x42\x6b\x87\x2a\x4f\xcd\xa3\xf4\x66\x8d\xe0\x0e\xee\xe7\xa7\x12\xde\x77\x1f\x40\xd2\x5d\xed\x39\x79\x8c\xa2\x4c\x7b\x05\xb2\x50\xed\x9f\xa5\xe7\x25\x1d\xc0\x76\xcd\x3f\xdb\xa4\xca\x78\x63\x6e\x06\xfb\x4e\xe2\x5a\xb6\x80\x83\x55\x51\xa7\x8d\x7e\xa2\x74\xd0\xfc\x22\x72\x70\x0b\xde\x8a\xce\x2a\x36\x7f\x96\x7e\x44\x62\x02\x5f\xdb\xe2\x08\x7d\x26\xe3\x81\x30\xbe\xef\x38\x2a\x24\x21\x4a\x5b\x2e\x31\xf9\x1f\xf7\x3a\x21\x7e\xf3\xa3\x04\xb0\xdf\x2e\x95\x45\x63\x5c\x7c\x7b\x5d\x08\xa8\xc9\xb0\x82\xfa\x98\xe6\xa7\x71\x47\x52\x33\x22\x12\x58\x5e\xc2\xbd\xc3\x00\xd7\x2b\x54\x22\x54\xa0\x16\xe7\xc1\x77\x72\x9d\x30\xc6\x9a\xd5\xe2\x65\x43\x6a\xb8\x46\xcd\xb7\x3d\xce\x48\x25\x5d\xf2\x4c\xbe\xc1\xb0\xba\xd9\x1c\x16\x44\x6c\x40\x50\x95\xf4\xbf\xff\x45\xee\x74\xfb\x7d\xbd\x7f\xd9\x61\x9a\x32\xd1\x04\x3f\xaa\x76\xc5\x0d\x46\x1b\x69\x0f\xb5\x3a\x7c\x7c\xd7\x15\xe4\x0a\x13\xe6\x67\xb6\xd9\x3d\x5c\x19\xe8\x05\x3e\x16\xc6\x4c\xa3\xe1\x43\x21\x87\xdf\xcf\xf5\x82\x04\x4c\x91\xc4\x80\x4b\x7e\x41\xba\x9e\x8f\x1e\xc4\xe7\x0a\xd5\x0a\x36\x58\x4a\xea\x7d\x68\xd7\x97\x80\x2d\x20\x06\xcf\x3e\x38\x16\x38\xd4\x7a\x26\xce\x65\xbe\x92\x45\x2f\xf7\xe0\x3b\x6e\xe8\x27\x08\x8f\x27\xee\xfc\xcd\xe5\x96\xd9\x8c\x09\xb5\x65\xad\xfb\xef\xe4\xf4\x73\x43\x4e\x1a\x1e\x98\xe6\xd8\xa6\x87\x9c\xd7\xe7\x12\xda\x8b\x30\x1e\xf8\x66\x73\x5d\x1d\xf9\x01\x6e\xb2\x73\x59\x82\x9a\x8d\x2f\xc4\xc0\x75\xe2\x36\xb1\x7e\xc7\x8f\xb0\xe6\xf2\x35\xcd\x61\x74\xb9\x48\x83\x67\x1a\x2d\xb2\xd9\xf3\xea\x27\x94\x55\x6f\xb6\xc4\x9e\x13\x6a\x4b\xec\xd1\xc2\xf5\xec\x41\x9f\x23\x0e\xf6\x0e\x8e\x55\x5d\xe4\xc3\xb7\x18\x07\xcc\x37\x70\x86\x75\x8a\x8c\xae\xc3\xeb\xc6\x61\x84\x11\x1f\x51\x00\xf1\xe3\x29\x83\xbb\xf6\xb7\xb1\x46\x4a\x86\x9b\xc6\x64\x0e\xd2\x9c\xcd\x41\x49\xc2\x4b\x8d\x9b\x7a\x16\x08\x36\x31\xed\x4c\x13\xe9\x6d\xdf\x71\x93\x24\xc2\xad\xb6\x09\xb7\x0d\xab\xdb\xdf\x40\x02\xf8\x8e\xcb\x13\x41\x2d\xa6\x28\xd8\xd9\x6a\xc7\xff\x26\x15\xe4\x3b\xae\x48\x48\x2f\xad\xf1\xd2\x6f\x2a\xab\xf8\xe4\x3b\xae\x0c\x3c\x15\x59\xbd\xd8\x0d\x62\x1b\xe5\xe2\xdc\x98\x75\x2b\x84\xd5\x0c\x12\x12\xbd\x2f\x4c\x82\xaf\x1e\xef\xf6\x9b\xd5\xbc\x5d\x9d\x52\x33\x0c\x6c\xa8\x85\xbc\xa2\xde\x38\x7b\x50\x85\x9e\x93\x18\xe4\xec\x81\xd7\xd0\x7c\xd2\x7d\x05\x99\x56\x96\x43\x66\xf8\x66\x54\x08\x68\xb2\x4d\x12\x83\xa8\xd2\x2e\xa2\xf3\x66\xa0\x72\x90\x4c\x02\xa5\xf8\xbd\xfd\x7c\xf6\xdc\x5e\x52\x93\x6c\x9e\x81\xf7\x5e\x59\xb2\xc0\x13\xec\xd3\x20\xe2\x14\x74\x04\x17\xbc\x06\xb7\xe5\x95\x6a\xc6\x48\x8d\x51\xb7\x39\x13\xc9\x69\x95\xc5\x04\xc9\x82\xef\xb8\xda\x09\x58\xd0\xb5\xa3\x2d\xeb\x57\xfc\x3e\xd6\x66\xba\xda\x53\xbc\x65\xcd\x3d\x50\x0d\xa4\x6d\x2f\xb6\x63\x12\x1f\x06\xcd\x9a\xad\x2a\xda\xf0\xe6\xb5\x50\xd0\x72\x58\xff\x42\x12\x4d\xe8\xa4\xfe\xdb\x97\xaf\x95\xb0\xe2\xea\x44\x34\x54\xfd\xd1\x62\x95\xed\xc6\xe0\x39\x46\xa2\xb7\x42\x12\xa8\xfd\xa9\xf5\xef\x9b\x63\xdc\x8d\x2d\x9f\x25\xcf\x60\x89\xec\xcd\xaa\xe7\x61\x79\x0e\xf0\x98\x6a\x65\x75\x99\xc2\x3b\x0c\xfa\x88\x7d\xc7\x73\xc3\x10\x11\x44\xf3\xfb\x59\x7f\x29\x7a\x9e\x2f\x5d\xa3\xe6\xb9\x3f\x91\xfa\xd6\xf0\x19\x3d\x8f\xb9\x68\x73\xe6\xf3\x3f\xbb\xea\xdd\xa4\xaf\xe5\x79\x31\xc7\x93\xfd\x55\x9c\x67\x25\x6c\x52\xf9\x3a\xb8\x96\xef\x44\x89\x01\x58\x60\xd3\xf4\xec\x66\x75\xdf\x4a\x02\xb7\xef\xc1\x77\x81\x93\xd1\xc9\x37\x90\x17\xe7\xfc\xff\xe7\xec\x4f\xb6\x1b\xc7\xb1\xed\x71\xf8\x75\x72\x70\x07\x04\xc0\x06\x1c\xca\xb2\x1c\xa1\x1b\x6e\x54\x92\x1c\x91\x59\x77\xd5\xd2\x42\x73\x60\xb3\x4c\x91\xfa\x48\xca\x61\xd5\xd3\x7f\x8b\x07\x00\x3b\xd1\xce\xfa\xff\x6a\x90\x8e\x12\xc0\x1e\xcd\x69\xf6\xd9\xbb\x7f\x0d\x8c\x2a\xe9\xe4\x39\x77\x00\xf9\x64\xb9\xa2\x2c\x0e\x6d\xe1\x1d\x2e\x6b\x78\x69\x44\x4b\x4d\xbb\xf1\x18\x19\x8f\x17\xf7\xf7\x4f\xcb\xc3\xe3\xea\xd7\xe1\x79\xb7\x72\x84\xc8\x6d\xb3\x0e\x90\x4a\x7d\xd5\xbc\xd6\x4d\xd6\x39\x07\x34\x4a\x52\xe5\x12\xa4\xbf\x44\x95\x97\x95\x5e\xbe\x62\x28\x75\xf0\x9d\xa2\xc4\x4a\x15\xbd\x40\xd3\x69\xdc\x4e\xae\x1e\x0b\x82\xa9\xa8\xfb\xa7\x6f\x07\x2f\x40\xb1\xfa\xb8\xc6\x30\x77\xdd\x41\x1b\x8f\x2d\x38\xdd\x64\x5a\xf7\xc6\x17\xe5\xdc\x78\x02\xab\xbb\x2c\x9f\x92\x4d\x5e\x47\x3c\xdb\x43\x52\xe5\x4b\x99\x3d\x4d\xc4\xf8\xfe\x52\x16\x04\x16\xe5\xfe\xd1\xec\xc0\x0a\x09\x4c\xbb\xa4\x21\x8e\xb5\x53\x3b\xaf\x0e\xf4\x20\x3b\x0d\xdc\xb6\x51\x0a\xc4\x48\xf9\x82\x0a\x1b\xb2\xfd\xca\xba\xa1\x22\x24\x81\x55\x4f\x54\xe2\x32\x5f\x90\x73\x15\x65\x1a\xdf\x91\x48\x8c\x71\xe1\x89\x5b\x14\xa4\x99\x8c\x29\xa9\x14\x86\xb2\xac\xc9\xd1\x73\xcc\xb7\x4d\x5a\x50\x2f\x37\x0d\xf9\x35\x08\x78\x7c\x21\x15\xc6\x58\xc5\xe0\x5d\xd6\xf6\xb1\xee\xca\xaa\xf5\x00\x7d\x35\xcf\xc6\x0a\x82\x77\x2f\x44\x33\x1b\x63\x46\x0b\x0c\xd5\xdc\x00\x03\x69\x52\x4c\xd7\x52\xaa\x0d\x60\x3d\xaf\xea\x88\xf3\x37\xdd\x8e\x4a\x41\x5a\x09\xa5\x0e\x1f\xe5\xe3\xb6\x2c\xa0\x86\xd9\x88\x6e\xe7\x52\x7f\xf2\xa6\x4d\xc8\xfc\x80\xb1\xac\xc0\x8e\x6e\x1d\x1e\xa0\x79\x2d\x75\x9f\x53\x64\x01\x23\x84\x23\xf8\x75\x71\x4d\x89\xc5\x02\x46\x29\x8b\x4d\x9f\x05\x5d\x14\xfa\x27\x5c\x03\x6e\xbf\xde\x0c\x19\xa5\x96\xf8\xfd\x37\x64\x77\x65\xf5\xa0\xfc\xb3\x32\xca\x22\x24\x2b\x39\x68\xc8\xaf\xa8\x72\xda\xf6\x90\x21\x6f\x15\x96\xe2\x39\xf8\xee\x5a\xb7\x7e\xd2\x06\x19\x95\x86\x43\x9e\xd1\xd0\xd6\x2c\xde\x9e\x1b\xf5\xea\x4c\xe0\x7d\x79\x73\xbe\x7c\xe6\x49\xfa\xe3\x62\x85\xd6\xee\xc9\xa7\x28\x27\x37\x6f\x52\xc7\x18\x65\x4b\xf3\x5c\xf6\xf1\x61\x6a\xcd\x30\x46\x05\xd2\x63\x6e\xa8\x7f\x3c\x66\x42\x0c\x42\x9c\x44\xdd\x3c\x15\x80\xd5\x96\xae\x29\x4c\xac\xf4\x5f\xb7\xc3\x2f\x17\x7b\xdf\x16\xc7\xda\x1b\x5c\x88\xee\xac\x87\x03\x99\xc5\x3a\xc1\x89\x77\xcc\x0a\x1f\xf3\xfb\xf6\xdb\x15\x68\xb1\x80\x25\x61\x80\x49\xad\x4e\x13\x71\xd1\x0c\xa7\xf6\xe4\xcb\x24\x3c\x20\xd0\x69\x8e\x3d\x3a\x39\xd0\xb6\x41\x01\x16\x72\xbf\x15\xe5\xef\x62\x5b\xe6\x88\xfd\xa9\xe7\xaa\x8f\xda\xce\x60\x81\xf6\x3a\xab\xe5\xb9\xaa\xa1\x23\x07\x9d\xbc\x4a\x4e\x8c\x7f\x30\x5b\xf4\x92\x29\x91\x0f\x14\x48\xce\x5d\x0d\x50\xdb\x39\x55\x48\xd6\x88\xc5\x7d\x04\x93\xa6\xbb\x06\x4e\x7e\xbe\xb1\x54\x12\x05\x9d\xe5\xb2\xda\x7f\x77\xb5\xf9\x53\x7d\xd2\xb6\x2b\xc4\x18\x8c\x5a\x7e\x5f\x6c\xd7\xfb\xbf\xfc\x19\x04\x65\x89\x2b\x0d\xbe\xdd\x6d\x26\xc7\x08\x66\x79\x53\x11\x68\xf0\x7b\xf2\x20\x82\x73\xe4\x98\x54\x65\xf1\x0e\x95\x0d\x5f\x4e\x73\x32\x23\xc2\x2c\x77\x9c\x0c\x62\xf4\x5a\xad\x2c\xc3\xea\x08\x15\x06\xb0\x7e\xf5\xfa\x2f\xfe\xde\x64\xa4\x99\x95\xce\x5b\x17\xcd\x78\x9c\x4b\x4e\x30\x62\xf7\x50\xca\x2c\xcf\x8a\xb7\xe1\xde\xcb\x64\xca\xb0\x1a\x73\x07\xcd\x7d\xf9\x82\xbb\xc5\xf8\xb9\x24\x98\x24\xec\x4a\xab\x16\x79\xfe\x00\x75\x2d\x5e\x60\xb2\x3f\x30\x45\xa3\xd8\x79\x40\x5b\xf1\x06\x6b\xa7\xfb\xfb\xc9\x38\xd2\x01\xc7\x89\x9a\x67\xc7\xac\xb9\x2b\x2b\xac\x57\xcd\xb3\xba\x59\x8f\x17\x1b\x48\x42\x6d\x97\x13\xab\x42\x54\x76\x13\x02\x74\xc2\x44\x47\xe5\x9d\xe7\x9f\x32\x29\xfa\x98\x11\x03\x48\xb9\xa5\x45\x75\x85\x12\xb7\x50\x0d\x62\x53\x93\xe7\x31\x91\xc1\x69\x7c\xbf\xfa\xb6\x7a\xbc\xf5\x57\x35\x86\x60\x51\xc6\x5f\xb7\xfb\xa5\xfb\x2d\x0c\xe2\x90\xda\x59\x7b\xf9\x5f\x5b\xa8\xe0\x5b\x08\x11\x68\x03\x23\x71\xa1\xd6\xdf\x44\xd6\x39\x7e\x21\x91\x82\x76\x34\x74\x15\x28\x31\x22\xd1\x77\x9d\xa8\x24\x89\x83\x76\x3d\x1f\xdf\x84\xb7\x1c\x86\x9f\x37\x64\x84\xe3\xa2\x01\x3a\x6b\x3a\xc7\x7d\xf4\xb6\x43\xa6\x2c\x3d\x24\x56\xa8\x15\x6f\x43\xf7\x7b\xf4\xb6\xfa\xe4\xd6\x4c\x84\x22\x0c\x59\x80\x4c\xfe\x27\x28\xce\x79\x93\x1d\x05\x26\x9f\x6c\x68\xb3\x97\x35\x75\x9d\x23\x41\x91\x4d\x64\x57\xaa\x0c\xfa\xd4\xec\xf8\xf1\x22\x21\x70\x7b\x76\x34\x1c\xee\xd7\x98\xc7\xb8\x22\xb9\x0d\x66\x87\x6e\xc8\x64\xb8\x85\xb1\x01\x04\xe5\xfe\x79\xce\x87\xe3\x39\x4c\x98\xa2\xa6\xdb\xb6\x31\xe7\xf6\x28\xfa\xdb\x4a\x03\xc0\xc8\xce\xa9\x2a\x91\x47\xd2\x2f\xe1\xa3\xf5\x29\x14\x61\xe4\x39\x00\xde\x45\x7e\xee\x1c\xe9\x50\xf0\x44\x26\x1d\x21\x7b\xf1\xad\x2a\xcf\xa7\xc9\xbb\x16\x32\x41\x6e\xa3\x5b\x90\x4e\x98\xc4\x91\xb6\x7d\x01\x0e\x61\x41\x28\x85\xc2\x7d\xd3\x9c\x0b\x75\x08\x16\xb1\xf7\xde\x42\x15\xa7\x18\x87\x3c\x9c\x84\x7a\x5b\x37\x70\xc4\x94\xc1\xfc\x49\x94\x64\xda\x4b\x2f\x57\xe7\x7a\xee\xaa\xbd\x6b\x10\xea\x28\xc0\x0c\xbf\xd0\xf8\xf9\x46\xe7\xe4\x83\xff\x76\xac\x4a\xd3\xff\xf6\x17\x46\x1c\x11\x9a\x3f\xad\xc7\xbc\x29\x67\xd2\x81\x9f\xed\xfc\xc3\x1b\xd2\x09\xba\x43\xeb\x1a\xd5\x90\xba\x8f\xa6\x35\x60\x9a\x14\xda\xcd\x6d\x07\xcd\x58\xef\xfe\x93\x17\xaa\x21\x09\x11\xa1\xb6\xd8\xfe\x58\xed\x5b\xff\x13\x33\x99\xdb\xa7\xe7\x6e\x36\x87\xda\xd8\x2a\xb4\x43\x59\x58\xb3\xe7\x4e\x64\xf9\x98\x5f\x8f\x05\x21\x84\xdc\x95\xdb\xbc\xb4\x36\x54\x56\xbc\x74\x90\xed\x2f\x63\xe3\xa1\x61\xa1\x25\xc3\x3b\xe5\x59\x73\x93\xe9\xc9\x48\x31\x91\xf5\x90\x8f\x97\xe7\x1a\xaa\x6b\xd0\x66\xdb\x85\xdb\x9a\xe2\xba\x63\x20\x1e\x45\x8f\xa2\x20\x88\xad\xb0\x97\xd6\x2b\x51\xe5\x97\x9b\xac\x9a\x45\xe6\xb6\x5d\x29\x8d\x1d\x71\xfe\x90\x15\xfa\x13\x05\xd7\xf6\x80\x24\x8c\x1c\xa3\x7f\xfb\xb0\x37\x03\x63\x3e\x0a\x92\x08\x69\xd6\x1f\xcb\xea\x28\xf2\xec\x3f\xb0\x45\xed\x16\xdf\x9a\x86\xe8\xe0\x67\x75\x3b\x66\xdb\xbd\x42\xe4\x30\x28\xec\xc0\x2e\x12\x81\x69\x18\xe4\x1e\x32\xb9\xb4\x6d\x4a\x88\x11\x8d\x07\xaa\x00\xda\x8f\xe2\xd0\x41\x91\xef\x6a\xac\x6d\x33\x20\xca\xaf\x7d\x45\xd4\xf8\xf1\xa9\x4c\xa2\xc1\xee\x5f\x5c\x91\x03\xb1\x20\x62\x02\xb4\x8d\xc5\x9d\x6e\xcb\xb3\xcc\x87\xc4\x3d\xfe\xe6\x42\x95\xa4\xa2\xb3\xb6\xcb\xca\x1b\x40\x51\xc2\x34\xc2\x08\xc4\x59\x67\xcd\xb7\xf3\x10\xd9\x31\x82\xdf\xcc\x6c\xf3\x51\xc2\x2d\xa0\xb5\x5d\x9f\x3d\x05\xa8\x5f\x99\xfc\xd7\x1c\xae\xf9\x51\xa2\xad\xa2\x56\x05\x75\xa6\xcf\x22\xb7\x51\xec\x4d\x55\x1e\xb3\x3c\xef\x5e\x24\x4f\x62\x61\x43\x47\x08\x7d\xc4\xf4\x93\x6b\x4a\x59\x2a\x03\x9f\x9f\x51\x90\x9d\x2c\xd9\xc3\xbc\xff\x1e\xa5\x69\x82\xd9\x1c\x84\xdb\xec\x84\x99\xcd\xbd\x62\x3f\x89\x17\xdc\x3d\xed\x6e\x9e\xf6\xfb\xa7\x87\xee\x72\xa9\x51\x91\x33\x1b\xdf\xa1\xba\x4e\x2c\xb6\x7d\x84\x42\xfc\xd2\x24\xde\x36\xbe\x13\x11\x27\x82\x77\xe1\xd2\xfb\xac\x9e\x6a\x59\xb5\x7d\x12\x5b\xc9\x86\x94\xe2\xc8\xbd\x8d\xf6\xf0\xcd\xe5\xe6\x7c\xb9\x5e\x36\xfc\x41\x69\x8a\xc4\xf1\x3f\xe0\x58\x16\xa5\xf2\x80\x08\x16\x44\xd2\xe9\x5f\x59\x95\xe1\x73\xf5\x29\x91\xfa\xe7\xf0\xb5\xf6\x2c\xca\xe0\x9c\xc0\x75\x39\x87\xba\x1e\x50\x40\x1e\x36\x55\xd9\x80\xfd\xa7\x45\x70\x77\x53\x49\xc7\x96\xfb\xb3\x6e\xca\x53\xbb\xf8\x6c\x45\x56\xfb\x12\x4f\x16\x44\xc0\x22\xcc\xdb\xc2\xcb\xcb\x30\xde\x10\x81\x00\xb4\xea\x1c\xb0\xe4\x5c\x67\x05\xd4\xf5\xe7\xfa\xd6\xed\x21\xed\x46\x63\xa9\x5e\xb2\xfa\xf5\x8f\x49\xa3\x0e\x2c\x29\x72\xf6\xee\x51\x13\xe3\x0e\x86\x24\xda\xe1\xe5\x97\xd5\x45\x57\xf3\x75\xda\x6d\x47\x05\xb8\xe5\xeb\x9e\x2c\x97\x05\x71\x40\x19\x7a\x0f\x1d\xcf\x8a\x67\xe1\xf7\x2f\x22\x26\xda\x56\xa8\x7c\x7b\x5a\x76\x3f\x81\x45\xaa\x78\x70\x37\x0e\xad\xbf\x71\xde\x62\xaa\xb4\x8d\x51\x78\x85\x27\xc7\x77\xcd\x82\x98\x05\x31\x9a\x2c\x43\x84\x32\x4a\x17\x8f\xb3\x92\x48\xc7\xde\x74\xb7\xce\x78\x22\x42\xa7\xdc\x3b\x8e\x29\xbb\x0e\x61\x10\x13\xe9\x53\xc2\x8f\x65\xb3\x3b\x8a\xaa\x99\x83\x8d\xb4\x7d\xc3\x10\xe3\x79\x8b\xdd\x72\x39\x34\x6b\xe2\x28\x05\x5b\x60\x59\x16\x70\xb9\x11\x5d\xf4\x29\x8e\x44\x94\xb8\x17\xbf\x58\xe5\xe6\x16\xde\x31\xf7\x5e\x67\x13\x53\x32\x8e\xb4\x25\xa0\xa8\xa1\xf9\x29\xaa\xcc\xa1\xbc\x4b\x29\x64\x7e\x99\xdc\x71\x92\x58\x56\xbd\x63\x27\x7f\xe8\x68\xce\x7c\x3b\x27\x8a\x8c\xaa\x85\x6c\xf4\x72\x98\x33\x8f\xb9\x34\x48\xa0\x81\xb4\x7f\x08\xd2\x9b\x0c\x85\x38\x6d\x4d\xbd\xf6\xa3\x37\x39\x88\xba\xf9\x27\x54\xe5\x1f\xa3\xfb\x10\x14\x70\xb2\xeb\xac\x76\x58\xa3\x11\x13\xd3\x68\x82\xc5\x22\x0c\x30\xc8\xa7\x21\xb7\xc8\x8d\x07\xf1\x06\x53\xb9\x9c\xc9\x60\x10\x3c\x42\x8f\xe0\x74\xb0\x13\xe5\x70\x7c\x84\xdf\x9b\xbc\x6c\xf6\xe2\xc3\xd7\x18\x8f\x5f\x8d\x90\x04\xe3\x3c\x4e\x5d\x18\x63\x2a\x73\x29\xc4\x58\x40\x84\x84\x4e\x75\x23\x0a\xbd\x28\xf4\x16\x24\x8c\xb3\xc1\xdc\x53\xb0\x74\xc0\xd7\xd9\xf5\x63\x8c\x9f\x1a\xfc\x3e\x7e\x7c\x19\x30\x5f\xa1\xe9\x62\x37\x59\x59\xac\x8a\xab\x1c\x4f\x2c\x03\x8d\x26\xc3\x0e\x1a\xe4\x5b\xd0\x9e\xae\x6a\xfe\x15\xc9\x50\x83\x33\x1b\xfe\x71\x16\x08\xe5\x6b\x57\x5d\x2b\x04\x5d\x96\xf9\x7f\x43\x3d\xce\x82\x58\x85\xd6\x84\xeb\x87\x8c\xad\xde\x07\x4b\x01\x3a\xb9\x47\x95\x50\x4c\x6b\x42\xf3\x7a\x90\x23\xe3\x20\xd6\x21\xe0\x6a\x7c\xae\xa1\xfa\x2e\x6a\xef\x09\x4f\xbc\xb7\x58\x1b\x8a\xe9\xcd\x6f\x9b\xdd\x2d\x72\xa0\x59\xb7\xc8\xdd\xdb\xec\x2d\x02\x83\xd4\x16\xcf\x3d\x6c\x16\x8f\x7f\x0d\x54\x64\x59\x90\x04\x2c\x42\xd9\x36\x79\xbe\x2c\x1e\xd6\x23\x07\x2c\x09\x94\x25\x77\x74\x98\x0f\x8b\xb4\xef\xf3\x61\x09\x09\x0c\x26\xf4\x97\xd5\x90\xc6\x72\xf6\x3d\x25\x34\x52\x08\x7d\xb4\xd5\x20\x4f\x66\x53\x9e\xd6\xc5\xa2\xb8\x6c\x72\xd1\xa0\xb5\x31\xe9\xae\x0c\x0a\x44\x1d\x2c\xbe\xba\xb5\xc4\xbc\x89\x95\xb0\x88\x05\x72\x40\xd8\x4d\xbb\x06\x65\x19\x73\xed\x1e\x6a\xb7\xdb\x9b\x8b\xa7\x21\x99\x5c\x81\x81\xb1\x22\xe8\xde\x18\xb3\x42\x54\x59\x59\x78\xe0\xa1\x1f\x82\x49\xc8\x29\x92\x85\x6d\x9e\xd6\x8f\xfb\xc3\xf6\xe9\x69\xff\xf8\x74\xbb\x3a\x6c\x9f\xba\x44\x71\x12\x2a\x35\xd0\x58\x3d\xe8\xd6\x95\x19\x8d\xe3\x24\x34\x56\x88\x67\x59\x1e\x4f\x95\x38\x8c\x89\xf2\x27\x2f\x2b\x0a\x6d\x11\x2f\xa6\x9c\xfd\x6f\xb1\x40\xf2\xc6\x87\xcb\xde\x93\x64\x75\x4d\xc6\x6e\x96\x2f\x48\xc2\xe9\x7f\x8d\x29\x60\xd5\x0a\xb2\x3e\x3d\x88\xe2\x2c\xf2\xfc\x72\xe3\x55\x1d\xba\xf3\xc6\xae\xf6\xce\x80\x7a\x5d\xe4\xf9\xee\x7c\x7c\x3c\x1f\xef\xca\x6a\x29\x0a\x8d\x34\x5a\x48\x90\xf8\x32\x19\xc9\x49\xac\x15\xbe\x3e\xe4\xf4\x79\x17\xf9\x24\xb3\x9e\xc4\x10\xa1\x55\xde\x88\xe2\xed\xe9\xec\x03\x07\x49\x62\xb4\xe9\x50\xbf\x8f\xf0\x7b\xbd\x7c\xb2\x7a\x92\xf3\x2f\x82\x6b\x19\x0f\x8b\x4f\x17\xe7\xe6\xb5\xac\x26\xa8\x5b\x16\x24\xa9\xd6\x8a\x39\x06\xfe\xe2\xe6\x7c\xf1\x97\x13\xc4\x84\x4e\x35\x5f\x1c\x6b\xac\xca\xf1\x4d\x2a\x36\xb8\x23\xfd\xbb\x94\x7f\x4f\x6c\xd3\xf6\x4f\x44\x30\xe4\x4d\x5a\x7d\xb4\x7e\xf6\x27\xf4\x12\xfe\x18\x11\x84\x5e\x72\xc1\x16\x52\x1e\x8e\x59\x71\xae\x0f\x06\xa6\xef\x53\x53\x4b\x30\x8c\x59\xb0\xd5\xb3\xc7\x38\x25\xc0\x38\xfa\x13\x59\xbd\x5e\x2e\x26\xa1\xb9\x04\x78\x4c\xc2\xaf\xe8\x2e\x3a\x56\xa0\x6e\x18\x82\x36\xc6\xe9\x42\xbb\x64\x73\x67\x56\x27\x86\x45\xd0\xbe\xad\x45\x39\xac\xc6\x6f\x1b\x62\x1a\x86\x03\x2e\x07\x9d\x89\xc9\x9d\x98\xd8\x06\xb6\x4d\x56\x68\xeb\xc5\x4e\xac\x05\xde\xde\x6d\x0f\x09\x5e\xee\x7e\xce\x80\xda\xdb\x6e\x32\x45\x91\xb0\x5d\xa9\x32\x91\x0f\x37\x5e\x4e\x38\xc1\x4d\x0d\xb3\x2f\xc4\xff\x4a\x23\xc6\x8d\xb3\xbb\x8e\x22\x1f\x28\x1b\xbb\x0e\x2c\xb2\x8c\x50\x37\xb7\xcb\x65\xf7\x9b\x08\xcd\x30\x67\xd3\xad\x21\x9c\x09\x69\x29\x57\x5b\xaf\xae\x35\x66\x3c\x6a\xc1\xbf\x41\x1e\x06\x8a\x91\x31\x2f\xb7\x8d\x84\xd8\x68\x7c\xbb\x05\xdc\x95\x15\x64\x2f\xc5\x63\xd9\xac\xdb\xaf\xe2\xcf\x1d\x02\xc3\x44\x6c\x71\xbb\xfa\xf3\x6f\x41\x5d\x5f\x26\x12\x78\x44\xad\xbc\x77\x01\xbf\xbf\x89\xe3\xa7\xb9\x78\xdf\x3b\x4d\x3b\x1c\x6d\xd3\x54\x3f\x5d\x68\x3f\x0e\xff\x67\x10\x92\xe4\x91\x4a\x71\xa7\xdd\x41\x9e\x63\x8a\xc1\xaa\xe1\x83\x57\x59\x1d\x0f\x6e\x1e\x47\x2c\x1e\xaa\x58\x6c\xe1\x28\x10\x61\xec\xc1\x40\x5d\xbf\x08\x69\x30\x17\x74\x94\x88\xe5\x71\x42\xd0\xe1\x3c\x78\x59\xac\xe7\x2a\x9b\x29\x41\x67\x01\x4f\x88\x2d\x4a\xd4\x65\x51\x76\x69\x26\xce\x83\x10\x05\x9c\x24\xf2\xec\x0e\x78\x32\xe6\xe3\x26\x9c\x27\xa9\x74\x2c\x7c\x08\xac\x2f\xa7\x70\x14\x2e\xd2\x04\x97\xc2\x83\xee\x32\xda\xe3\x61\xce\x85\x21\x08\x6f\xcb\x05\x96\x94\xb4\x2b\x00\xe8\x5b\xe1\xd7\x1b\x2e\xa9\xd1\x9d\xda\xb9\xf5\x73\x5d\x0d\xdb\x15\x21\x73\xdb\x3b\x31\x60\x79\x64\xdf\x46\x70\x11\xae\x82\x00\x2f\xa3\x9c\x11\xda\xe5\xeb\xbb\x41\xa8\xe3\x98\xb0\x8e\xf1\xbc\xb8\x42\xdb\xfa\x6f\xaa\x55\x82\x15\xc7\xb7\x59\x8d\x5c\x44\xde\x63\xfa\xa3\x6b\x57\x38\x24\x31\xdd\x8f\x24\x3f\x7d\xe8\x9d\x03\x91\x18\x72\xcc\x1b\xb5\xd6\xdd\x8f\xd4\xea\xbd\xf9\x54\x6e\x3d\xba\x73\x88\x19\xc6\x75\xf6\xd9\x8b\xf3\x86\x3f\x2f\x38\x67\x01\x37\x51\x10\x49\xa7\xcd\x34\x10\xb5\x6d\x5b\x24\x43\x0e\xc6\x6f\x95\x38\x8d\x5e\x4e\x1a\x48\xc0\x94\x73\xd5\x43\x93\x41\x4f\xd6\x3d\xd7\x95\x48\x85\x06\x8c\xc0\x1a\xb8\x05\x62\x5b\xa7\xc5\x07\x23\x40\xde\xe8\xfb\xa4\x34\x88\xb0\xe6\xda\xd5\x3d\xe3\x03\x4f\xfd\x9b\xf9\x19\x97\x52\x61\x65\xa7\xab\x4f\x98\xef\xda\x2e\x90\x30\x17\xd0\x7d\x2c\x9f\x8c\xdd\x95\xbb\xfa\xaf\x41\x9c\xba\x3f\x2b\x8b\x20\x74\x01\xbb\xc1\x04\xfd\x9b\x5b\x09\x69\x68\xc0\x6f\x42\x79\x7e\x28\x30\x7f\xe5\x1b\x99\x41\xd3\xc6\xf2\x27\xb4\x3b\x54\xb7\x70\xa6\x61\x14\x62\x85\xa9\xa3\xd3\x18\xc7\x6b\x46\xdf\x31\x8d\x52\xfb\xb5\xc0\x27\x72\xf6\xaf\xe2\xb7\x3f\x4f\x4c\x35\x96\x71\xff\xb8\x48\xcb\x9f\x96\x55\xf2\xdc\x94\xd5\xb8\x28\xbf\xed\x18\x51\x5f\xce\xb0\x29\xcb\x1c\x79\xea\x7d\x5b\xe2\xd8\x56\x6b\x91\x43\x4f\xa7\xd6\x36\x18\x8b\x33\x93\x79\xe9\x77\x8a\x94\x53\x1e\x45\x5e\x11\x45\xe6\x59\xfd\x8a\xb0\xa8\xb7\xd9\xca\x93\xb6\x7f\x6c\x7d\x81\x06\xe1\x9c\x96\x64\xd9\x55\x5f\x77\xa7\xd4\x8c\x89\x0e\x6b\x34\x49\x79\xa7\x69\x18\x59\xae\x3f\xcb\x80\xe8\xf8\x25\xc7\x17\x49\x63\x9e\xba\x94\xbc\x82\x9b\x69\x44\x34\x15\x32\x01\x5f\x5a\x84\x29\xf5\x4c\x65\xa7\x4f\x51\x44\xa9\x0c\x6d\x8c\xbb\x53\x72\x72\x2e\xba\x6f\x76\xa8\x6f\x9b\xdc\xb2\xbb\xd2\xe4\x7e\xa4\x20\xb8\x34\x9c\x4f\x2f\x95\xd0\xb0\xcc\x45\x3d\xbd\x65\x45\x6c\x14\x72\x53\x95\xf5\x09\x99\x1d\xeb\x27\x99\x67\x36\x49\x39\x9a\x94\x8a\x91\x48\x3b\x6b\x7a\xdf\x11\x66\x8e\xbc\xeb\x54\x31\xc0\x44\xe2\xa1\xf5\x9c\xf5\xe6\xe7\xc6\x1a\x0a\x03\x25\xef\xfe\xca\x3a\x48\x71\xa4\x6f\x57\xf7\xab\xc5\x6e\x75\xb8\x5d\xec\xbd\xad\x9d\xea\xd8\x92\xd2\x08\xad\x7f\x42\x65\x29\x30\x87\x30\xe9\xb9\x01\xaa\x39\x45\x32\xcf\xf5\xf2\x09\xd5\x96\xfc\xcf\x29\x43\xca\xbb\x3f\x57\x8f\xfb\xd1\xf3\x40\x90\x60\x34\xa5\x27\xa4\xc5\x28\x75\xd6\xcf\x1c\xa0\xb6\xe8\xcd\x6a\x55\x4e\x22\x94\x29\xb0\xd8\x2b\x52\x3c\x3a\xdd\x74\x97\xf5\xe9\x4f\x10\x07\xb8\xba\x48\xd1\xa8\x57\x3f\xef\x2d\xb5\xe6\x15\x56\xb8\x3b\x84\x21\xa6\x69\x97\x1d\x4f\x28\xe9\x6a\x91\x6c\x65\xb5\xfe\x0c\x90\x9d\x9a\x24\xa4\x96\x3d\x3c\xcb\xf5\x1e\xc4\xf1\x41\x9c\x4e\x3d\x01\xc7\xec\xcb\x32\xa9\xd5\xc4\xf3\x74\xed\xa7\x4c\xdd\xba\x34\x65\x27\xd8\x4a\xa2\xb1\x61\x99\x1a\x25\xb1\x72\xe1\xa1\xdd\xcc\x3c\x9f\x51\x9f\x03\x11\x81\xa4\x68\x36\x7d\x5d\x86\x83\xe7\xf4\x91\x7a\x41\x74\x82\xe6\x7b\xdd\x4e\xf8\x57\x44\xed\xbb\x58\xdf\x90\x65\x98\x05\x82\x86\x02\x6b\x30\x1d\xf0\xce\x12\xc0\xf6\x85\x59\x2c\x10\x8c\xc4\x68\xbe\xbb\x78\x4b\x97\xc5\xf5\xcd\x91\xf2\x49\xee\x9e\x99\x83\x06\x5d\x73\xaa\x71\x78\x9f\x2a\xe4\x1b\x77\x8a\x72\x1d\x0d\x6a\xdb\x43\x81\xaf\x0c\x7c\x3c\x1f\x97\xaf\x59\x97\x9f\x17\x51\x64\x45\xa0\xea\x63\xdd\x29\x34\xf8\xb6\x38\x4d\xfd\x4a\x75\x07\x30\x20\xc5\xef\xda\x25\x42\x6c\x37\xf9\xb9\x29\x55\x25\xd4\x65\xa1\x5e\x33\x78\xef\x4b\x8c\x47\xdd\x13\x16\x21\x9f\xa6\x53\x43\xac\xca\xa3\xd3\x8b\xd1\xb3\xd8\x2c\x91\x08\xcb\xbf\xe9\x04\x7c\x30\xd5\x72\x4d\xf7\xcb\x02\xc1\x25\x45\xa0\xf4\xe3\xf3\xc3\x61\xbf\x5a\x3c\x78\xf0\x98\x48\x23\x21\x1c\x06\x73\x07\xd5\x7b\x76\x4d\xa1\x34\x2e\x2b\xfc\x9f\x81\xe1\xf9\xf5\x9f\xee\x02\x80\xfa\x10\x9d\xa9\x0e\xcd\xeb\xe4\xe6\x52\x30\x51\x1f\xa7\x28\xdf\x66\x8d\x01\x21\x18\x21\xed\xa8\xfe\xc7\xc3\x3f\x96\x7d\x14\x5c\x08\x4e\x3c\xca\xcd\x42\x69\xfc\xef\x4a\x05\x2e\x8d\xbd\xa9\xca\x7f\x83\x6a\x16\x2f\x30\x45\x05\x09\x19\x08\xe2\x10\x7e\xeb\x6e\x36\x5e\x19\xa2\x73\x9f\x4a\x0a\x85\x71\xb4\xca\x8a\x95\xc3\xc7\x27\x33\x58\x48\x13\x62\x2e\xaf\xce\x5e\x8a\x9b\x9b\xa7\xb1\x3e\xc6\x90\x1e\x9f\x05\x42\xb1\x20\xea\x2a\xf7\xdb\x53\xce\x5d\x59\x31\x1a\x3a\x1e\xe1\x3e\x42\x3a\xb9\xa8\xd2\x14\x71\xe5\x65\x61\x91\xa0\xeb\xe2\x47\x27\x2d\xda\x36\x83\x44\x57\xec\x5d\xa0\xa6\x2a\x38\x78\xf7\x06\xdd\xec\x6e\xf9\x62\xff\xba\x12\x53\x20\xe4\x5f\xe3\xb8\xdf\xf4\xba\x60\xe3\x03\x68\x8f\xd8\x12\xa3\x51\xb8\x42\x68\x42\x31\x21\xdb\xc7\x85\xee\xce\x85\x46\x6a\xe2\xea\x8a\x99\xa2\xed\xaf\x2c\x5b\x34\x6a\xc6\x74\xe9\x4d\xd7\x08\x5c\x63\xd1\xe3\x9f\x59\x61\xfa\x11\x61\x42\x22\x9d\x6d\xfd\xd3\x3e\x5f\x59\xcd\x1a\xf0\x32\x80\x00\x03\x60\xc2\x0b\x0f\xbf\x41\xd1\xa1\x61\x87\x5b\xd2\xe4\x30\x23\x44\x5f\xc9\xe7\x05\xdd\xbf\x4e\xfb\x4a\x2a\xb9\x67\x1d\x6d\x9c\x6d\xf2\x15\xc6\x50\xb2\x30\x48\x9d\xd9\xb7\xb6\xef\x6a\x28\x46\xd5\x76\x48\xc5\xc8\x7f\x9b\xf5\xc7\x25\x13\x29\xbe\xa2\xd6\x4b\xeb\x62\xe2\x75\x7d\x2a\xab\xe6\xbe\x7c\xc9\xd4\x68\xb9\x92\x61\x48\xf1\xa2\xb6\xee\xff\x66\x88\x9e\x1e\x8e\x53\x19\x91\x14\x9d\x76\xc4\x57\xdb\x0d\xd2\x6a\xeb\xf8\x4f\x23\xa3\x44\x22\x1e\xcb\x02\x18\xc7\xb1\x34\x19\xc7\x21\xe6\x06\x70\xfb\xef\xaa\x02\x9c\x62\xcc\xf0\x3a\x71\xac\xa0\x63\x81\xd9\x54\xe5\x87\xb7\x27\x65\x9c\x86\x34\x1e\x86\xff\x0e\x90\x67\x2f\x99\xcc\xc1\xb2\x6f\x74\xe1\xd9\xf9\xb7\x9b\x50\x4a\x8d\xfb\x1a\x83\x9c\x9a\x4c\x22\x82\x51\xdc\x2a\x7b\x87\xe6\x3f\x0e\x34\x39\x19\x35\x9c\x32\x74\x60\xce\x35\x54\xdf\xaa\xf2\x77\xf3\x3a\xde\xcd\x24\x37\x1c\x77\x9b\xef\xbb\x1b\xff\x53\x2a\x0c\x62\x13\xfd\xc7\x72\xf9\x7a\xdf\x2c\x82\x10\x17\x2b\x2c\x67\x7e\x7a\x58\x2f\xff\xec\x5a\x9c\xf1\x0d\x99\x2e\x4b\x27\xac\xe1\x9a\x64\x12\x62\x5c\xf8\x80\x16\x88\x45\x26\xb4\xbe\xe1\xb3\x35\x08\xff\x98\x71\x90\xfc\x91\xd2\xb2\x52\x67\x6e\xc9\xeb\xe4\x4a\x59\x20\x35\xb5\xdc\x60\x0f\xa2\xae\xb3\x77\xc8\x2f\x18\x91\xb1\xc2\x8f\x4f\x45\x9e\x15\xf0\x33\xd3\x50\x7e\x1b\x78\x21\x52\x33\x00\xe9\x29\x30\x7c\xf8\x60\x34\x8f\xa5\x8e\x6d\x4e\xec\x28\xaa\x97\xac\xc0\xba\xec\x59\x5b\x5e\x6a\xcd\xbc\x94\xc8\xa6\xac\xeb\xf6\x8b\xfe\xca\x8a\x71\x2a\x63\x7a\x88\xa1\x28\xd9\xb6\x2d\x65\x56\x7c\x2f\xcb\x6e\x10\x42\x64\xf5\x59\x9d\x21\xf4\x9a\x55\xda\xf2\x3e\xdf\x5c\xd7\x05\x48\x43\x35\xb2\xa0\xfc\x7e\x15\x39\x8c\x33\xff\xd2\x80\xad\xb9\x5b\x19\x03\x58\x69\x05\x57\x11\x4f\xff\x72\x55\x60\x38\x16\x3c\xd6\xea\x15\xf4\x39\x87\xa1\xa4\xde\x28\x43\xe4\xfa\xd3\x94\x22\x94\x4a\x95\x85\xca\xcf\x1a\x9e\xef\x3c\x7e\x52\x51\x23\x51\x25\xef\xb9\xb6\xa1\xd3\x99\x72\x5f\x16\x28\x16\x70\xed\x09\x8c\xd6\x48\xf6\xb0\x14\x5d\xd0\x4a\xb5\x06\x4c\x60\x45\x83\x5e\xcb\x2a\xfb\x0f\x3a\xb3\x77\xe7\xdc\x64\xd7\x49\x50\xc5\x98\x46\x6b\xe0\x80\x44\x37\xd6\x81\x9a\x7d\xe7\x8a\x81\x10\x9d\x78\x96\xbf\x56\x98\x18\x2f\xfb\x81\xbb\x4e\xbb\x4f\x0f\xd3\xbf\x2a\x62\x16\xec\xd0\x99\xbe\xdf\x11\x47\xd5\x5b\xf4\x2a\x12\x36\x24\x0a\xae\x7e\x61\x5f\x7a\x0e\x99\xf9\xfb\x48\x42\x08\x3a\x75\x18\x9f\x74\xf1\x27\xe3\x22\xb4\x35\xa0\xdb\x51\xd2\x52\x71\xd3\xe1\x25\x1d\x1c\x69\xf7\x5a\x9e\x86\xe0\x54\x95\x32\x5b\xf6\xf2\x0d\xeb\xae\x1c\xb8\x79\xad\x27\x3b\x88\x4a\x93\x00\x53\x85\xa7\x76\x40\xdd\xe5\xc2\xcf\x68\x25\x02\x81\x86\xdf\xed\xea\x7e\xf5\xcd\xd6\xa6\x7d\x5f\xec\xbe\x1f\x56\xeb\x4d\x42\x7c\xb4\x52\x49\x62\xd5\xa0\x4f\xe5\x69\x60\x6b\x2b\x45\x34\xe1\x76\x5f\xba\xad\xca\xd3\xee\x55\xe8\xf2\xf7\xbe\x3f\xb9\xa2\x36\x1b\xeb\x69\xb7\x37\xc8\x7c\xda\xb5\x2a\x2b\xed\x30\x54\xf4\xff\x2e\x0a\x9d\x43\xfd\x88\x00\xd5\x77\xb0\xd3\xc9\x17\x75\xf9\xe3\x40\xca\xa8\x2b\x99\x1f\x48\x2a\xb9\x76\x9d\x06\x18\xb3\xec\xc5\x4e\x3e\x49\x62\x5e\x33\x2b\xe0\xd1\x02\xed\x34\x4b\x38\x68\x17\x1d\xcf\x47\xaa\x3f\xe5\x69\x19\xbf\x6d\xad\x08\xd2\xc6\x7e\xa8\xfc\xdc\x2e\x4e\x58\x9d\x3b\x0c\x3b\x29\xad\x54\xec\x29\xf1\xd7\xbb\xdd\xf3\xea\xf6\x70\xb7\x7d\x7a\x38\x3c\xed\xbf\xaf\xb6\x87\xe5\xf3\x76\xbb\x7a\x5c\xae\x57\xbb\xae\xbf\x56\xbc\xa3\x96\x5d\x1b\x54\x6d\xd1\x19\xd4\xad\x2d\x0c\x7a\x40\xcc\xd4\x4d\x6f\x48\x64\xa4\x07\xec\xd7\xbf\xb2\xc2\x6e\x80\xfe\x94\xc0\xad\x52\xdf\xa1\xca\x5e\x5e\x9b\xe5\x6b\x96\x8f\x90\xa3\x0a\x74\x8c\x2e\x03\x22\xa2\x2d\xba\xeb\x1e\xf4\x4b\x6b\xdd\xbc\x83\xc8\x3f\x07\x6f\xcd\x97\x12\x28\x93\x08\x4c\x36\xb5\xd6\xd6\x3f\xcb\xa3\xcc\x60\x34\x90\x8d\xb0\xe5\xc4\xb6\xfe\x7d\x3f\xaf\x57\xd0\xbd\x62\x1d\x50\x8d\x2f\x04\xf7\x94\x6e\x3e\xcd\xce\x3d\x1d\x24\xda\x97\x66\x74\x01\x8f\xa2\x79\x9c\x89\x67\xbb\x03\x08\x8d\xb1\x08\x5d\x5b\x0d\xf7\x1e\x2d\xfc\x87\xef\x10\x49\xdc\x07\xdb\xd9\xb4\x2e\xfe\x71\x16\x55\x03\xd5\x5d\x56\x88\x1c\x79\xdf\xba\x6e\x8a\xe0\x08\x7f\x80\x46\x6c\xa6\x25\x93\x9a\x52\x92\x3a\x85\x97\x59\x2f\x79\xf2\x67\x64\x9a\x68\x1a\x26\xc8\x3e\x2f\xcf\x17\xd2\xf4\x0c\x61\x6d\x0b\xb7\x94\x05\x2f\x80\xe2\x01\x05\xe4\xe8\xee\xb9\x56\x46\x19\x16\xe6\x3d\x7e\xf7\x49\x0a\x1d\xca\x14\x3d\x9f\x27\xd5\x94\x2f\x95\x38\x76\xbf\x6b\xae\x31\x37\xfa\xde\x9a\x3f\x17\xa7\x9a\x80\xf2\xa8\x4f\x38\x08\xae\xd5\xaf\xaf\x72\xee\xe3\x27\x8e\x82\x00\x43\xe3\xcb\x3b\x5f\x78\xa7\x63\x16\x23\xc4\x0f\x41\x1d\x68\x67\x5d\x7a\x7b\x43\xc7\x91\xf4\x0b\xa0\xa3\x0b\xa8\x27\x44\xd5\x6d\x27\x4e\x49\x38\xc6\xb0\x6d\xa1\xb5\xe7\xe6\x6d\x2a\xcd\xe3\x08\x7d\x29\xfb\x58\x7e\xe5\x99\x98\x77\x03\x59\x88\x2f\x50\x49\x9a\x73\x81\x86\xe8\xed\x7a\xb7\xb9\x5f\xfc\x75\xf8\xb9\xbe\x5d\x75\xcf\x96\x92\x98\xe8\x2e\x4f\x8c\xc9\x9b\xb2\x72\x4b\x0a\x8e\xbc\x30\x70\x3d\x45\x68\x61\x88\xf2\x7c\xb1\x01\xad\xac\x8f\x19\x68\x99\xc4\x88\xea\x14\x68\x39\xf5\x59\x47\x2d\x65\x08\x96\xe2\xf1\x19\x65\x02\xe7\x49\x45\x59\xa0\x95\x09\x80\x0f\x8d\xd0\x4f\xb4\xf3\x5d\x77\x1d\x0b\xcc\xb9\xda\x62\xd8\x32\xd7\xc3\x4d\x49\xeb\x14\x20\xf4\x70\xae\xea\x88\xc1\xfc\x7f\x9c\x07\x35\x2a\xae\x1f\x24\x80\x9b\xda\xdd\xfa\xf1\xcf\xd1\x09\x0c\x55\x08\x2c\x75\x59\x07\xc7\x14\xe6\x1b\x93\x84\x26\xbe\x48\xed\x58\x76\x18\x56\x6d\x54\x4c\x1d\xbe\x57\x63\xae\x63\xb8\x7a\x68\x03\x44\x8b\x81\xb4\xa8\x70\xeb\x76\xdb\xa5\xdf\xb0\x20\x48\x38\x7e\xae\x43\x33\xe5\x3f\x9b\x7d\x13\x10\x24\xd2\xcf\xa5\x07\xf1\x61\x77\xa3\x7d\xf9\x0b\x8d\x9b\x49\x4f\x2e\x62\xcb\x78\xf4\xef\x73\xdd\x8c\x03\xf1\xb6\xfe\x7e\xd4\x9d\x80\xe5\x1d\x37\xe8\x7a\x7e\x1d\x59\x07\x62\x48\xdc\x91\xf6\xf9\x52\x8f\x45\xee\x07\x08\xd0\x58\x49\xde\x2f\x57\x37\xe7\x42\xe7\xfd\x24\x02\x9a\x06\xf8\xc1\xf6\xbf\xb3\xa6\x0f\xbb\x03\x0b\x59\x1c\x78\x3c\x53\x7e\x86\xf1\x5c\x26\x0e\x21\x0a\x61\x48\x91\xdb\xed\xb5\xfc\xfd\xb3\x6c\xa0\xfe\x2e\x6a\x87\xed\x9a\xbc\x81\x30\xb2\x02\x73\x8e\xc3\xfb\xbb\xa8\x57\x85\xee\x1c\x2d\x08\x8d\xd5\x0a\xf1\x92\x7c\x63\x58\x0a\x44\x89\x8c\x93\x71\x20\x73\x59\x5d\x76\x65\xfe\x24\xff\x0d\xaa\x8b\x66\x42\x24\x01\x23\x0f\x9b\xaa\x6c\xca\xe6\x72\xea\x4e\x10\x47\x56\xab\x43\x68\xbd\x40\xbd\x8c\x3f\xa6\xb8\x9f\xc1\xe6\x06\x71\x94\x20\xb6\xe3\xe6\xdc\x2e\x9d\x58\x9f\xf6\x19\xf5\xd7\xf8\x29\xe3\x38\x34\x2e\x8c\xd3\xcf\x44\x88\x15\xc3\xd8\x89\x2d\xf4\x04\xfd\xad\xcc\xf5\x52\x74\xa1\x39\x88\xb5\x2d\x31\x10\x5a\x3b\x27\xd9\xa7\xb5\xc6\x93\x06\x92\x20\x40\x90\xd9\xe6\x69\xf9\xe8\x0f\x4e\x62\x2d\x60\x50\x0e\x2e\x94\xb5\x5a\xc7\xb6\x3f\x24\x89\x42\x67\x75\xd5\xbc\x3a\x68\x50\xbb\x94\x0c\xd0\x9d\xde\x34\x00\x1e\x84\xa8\x06\xd7\x39\x79\xc8\x6a\x8a\xb1\xa7\xbf\x99\x0f\x3c\xe0\x71\x38\xc2\xc7\x5f\x17\xff\x00\xa7\x3c\x60\xc3\x82\xa8\x9b\x0b\x6e\xbb\x7d\x50\x77\x9a\xe3\x05\x2e\x6d\xe2\xb8\xb2\x04\xb3\x0f\x30\x30\x54\x20\x55\x0c\x13\xb0\xce\x3b\xf2\x5a\xfd\xe3\x3b\x4b\x4d\x8c\x9e\xcf\x6e\xbf\xd8\x3f\xef\x0e\x8f\x4f\x87\xdb\xd5\xe2\xde\x9f\x42\x44\x56\x5a\xc9\x9e\x02\x2d\x1a\xb4\xe6\x3f\xa5\x09\x6b\x8f\x11\x29\x9a\x99\x27\x2b\xc9\x65\x2d\xd8\x03\x0d\x0e\x77\x20\xab\xb3\xa8\xba\x8f\x2f\x43\x29\x5c\xd1\xc0\xf7\x32\xd7\xf3\x25\x24\xa0\x02\xa0\xb2\xef\xf5\xb9\x32\xac\xef\x9f\x72\xa4\xb6\x7d\xfa\x71\x37\x5c\x3d\x41\x01\xf1\x91\xc0\xa7\x13\x14\x43\xcd\x1d\x16\x80\x8e\x42\x70\xf5\x2e\x4e\x3b\xfc\x53\xe9\x6f\x16\x00\x24\x09\xda\x5c\xbb\xa6\x3c\xf5\x2a\x45\x83\x8b\x19\xa6\x11\x4c\xd4\x88\x37\x70\xd6\xe3\xf8\xa9\x8c\x50\x61\x8f\x0a\x5f\x62\x86\xe2\x8a\x2b\x03\x8c\xb4\xc3\x5f\x97\xcf\xc5\x49\x9c\x3b\xa7\xcf\x10\x12\xa1\x15\x63\xbf\xcb\x63\xa9\x61\xbd\xb9\xdb\xf5\xb5\xcb\xbe\x1b\x8d\x2d\x86\xca\x29\x0a\xdb\x49\x80\xc2\x94\xe5\xb9\xb5\x08\x56\x56\xd6\xe4\x6a\x1d\x1d\x06\x8d\x0c\x31\xc0\xa9\xb7\xa1\x1d\xfd\xf2\xa8\x03\x0d\x38\x6e\x4c\xa8\x64\x7f\x53\x7a\x84\x93\xa1\x61\x88\x96\xf0\xc1\xa6\xdb\xf5\x59\x35\xad\x1f\x86\x66\xd5\xe8\x41\x0d\x33\x01\xc2\xfa\xbd\xc3\x33\x69\x0e\x63\x89\x45\x5b\xa7\xf2\xb7\x7b\x93\xd7\x35\x21\xfc\xff\x48\x12\xff\xcb\x1f\x60\x18\x16\x76\x3f\xef\x2d\x2b\xde\x7e\xc8\x15\x39\x13\x73\x35\xa1\x09\xa5\xf4\x1b\x56\xf5\x06\xcd\xed\x15\x42\xcc\x44\xb1\xc6\x54\x0d\x02\xa2\x3c\x90\xdf\xb7\xa5\x0a\xb1\xb6\xb9\xa8\x1d\xf6\xfb\xa6\x3c\xbf\xbc\x4e\x72\x7a\x26\x4e\xec\x8e\xf4\xfd\x6e\x10\xe2\x36\x31\x48\x1c\x9a\xc7\x76\xf7\xd3\x77\x65\xe5\x52\x51\x6b\x2b\xd7\x39\x6f\x6d\x98\x24\xe2\x18\xfc\x78\xc8\x72\x40\x46\x8b\x7a\x65\x09\x0f\x7d\xbb\x32\x3c\xb0\x08\xee\xee\x8b\x24\x86\x20\x9f\xd4\xd3\xe3\x6a\xb3\xf0\xe5\x85\x86\x47\x89\x61\x9e\xfd\x36\x7b\x17\x0d\x6e\x44\xad\xf5\xfe\x50\x16\xcd\x6b\x7e\x69\xd7\x8d\xf3\x69\x7a\x1f\xd3\xf4\x97\x11\x34\x41\x4d\xaf\xc3\x4d\x57\xa3\x66\x44\x6a\x61\xd7\x3b\x51\x34\x59\x6b\x88\x62\x56\xf9\xbe\xcf\x2a\x1b\x21\x18\x78\xf9\x67\x51\x41\xeb\xc9\xd6\xc3\x6f\xec\xba\xc9\x38\xc4\x37\xbc\x71\xf8\x69\x57\x31\x33\x0b\x85\xef\x0e\xb1\xf2\x40\x35\x34\xae\x76\xd0\x13\x34\x8c\xbe\xbd\x4c\x22\x5c\x27\x1d\x99\xc3\xee\xed\x9c\x5f\x71\x6e\x7e\xed\xa3\x19\x29\x6c\xb8\xd1\x93\xfc\x14\xd9\xa9\xb5\x17\xcb\x2b\x18\x70\x6f\x53\x19\x09\x21\xca\x4b\x43\xa1\xd7\xaa\xf4\x6c\x10\x46\xbb\x72\x77\xaf\xa3\x77\x63\xc7\xe0\x3c\xf8\xd8\xe8\x24\x4e\xe3\x6b\x3e\x43\x94\x88\xe9\x46\xf0\xe7\xbc\x86\xe3\x17\x01\x3c\xc6\x22\x33\x0d\x2a\x17\x15\x6c\xce\x79\xa6\x50\x1c\x3b\x2b\x5e\x36\xb9\xb8\x12\xb2\xf5\x87\x41\x2a\x1d\x69\xd1\x7a\xf9\xd4\x64\x9f\xb9\x87\xc6\x50\xa1\x6d\x35\x20\xb8\xcc\x30\x68\x5f\xcc\xdd\xbd\x18\x12\x04\xd4\x22\x31\x5f\xa0\xf1\x96\xe3\xb7\xec\xdd\x87\x8f\x87\xa7\x24\x41\x90\x52\xd4\x4a\xdb\xae\x90\xbf\x70\xbf\x7e\x70\x69\x68\x12\x04\x60\x30\x81\x73\x77\xce\x55\xe5\xeb\x85\x49\x40\x88\xb5\x60\xda\xc1\x9e\x7d\x40\xbe\x11\x17\x21\xaf\xc3\x60\x5f\xe2\xbb\x48\x40\x42\xee\xa8\x75\x2e\xbb\x5f\xf7\xdd\xb9\x85\xb4\x62\xaa\xd6\xc4\x5f\xb5\x96\x41\x27\x82\xce\x48\x40\x25\x25\x2e\x67\xb5\xb8\xa2\x0f\xbb\x8a\xe3\xb6\xfd\x01\xb1\x13\x98\x6d\x71\x7e\xe4\x93\xf9\x63\x7c\x2b\x54\x03\x7e\xb5\x1d\x34\x36\x8a\x8b\xec\x45\x6e\x89\xe5\xf3\xb5\x22\xee\x50\x66\xac\xc0\x88\xc9\x2a\xd8\x88\xac\xe3\xbe\xb6\x52\x3d\x73\xcb\x0e\x09\xc2\x90\x18\x07\xb4\x80\x49\x2d\x2e\x09\xc2\x24\x45\x91\x8c\x3c\x7b\x79\x6d\x4e\xa5\x2f\xad\x24\x41\xe8\x9e\xfc\x5c\xb8\x84\xe7\x27\x67\x8f\x85\xe0\xce\x71\xb8\xbf\xff\xe9\xd2\xbc\xc4\x9f\x25\x36\x56\xe4\xe1\xbd\x6c\xe0\xa9\xd8\x4c\xca\xe0\xaf\xd4\x5e\x18\x09\x92\x38\x24\xae\x6e\xd2\x62\xd8\x76\xb7\x57\xfc\x73\x24\x48\x92\x50\xb0\x9e\xad\xcf\x6d\x92\xeb\xe5\xd3\xec\xfe\x4f\x82\x84\x13\x24\xb6\xb9\x2f\x5f\x7a\x95\xcf\xac\x2c\x6e\xe5\xd6\xcd\x5a\xd0\x93\x37\xc3\x49\x04\x8e\x30\xe5\x16\x6a\xf4\x99\x41\x5b\x4e\x4c\xa8\x76\xaf\xe5\xef\x21\x7b\x0a\x09\x78\xa4\x7c\x01\x7a\x2f\xde\x91\xa9\xb7\x62\x2c\xe0\xd1\xf6\xe4\x01\x12\x33\x3f\xf4\x54\xa9\xf8\x2b\x13\xbc\x4b\xcf\xd0\x49\x35\x19\x09\xb8\xd4\x48\x39\xd2\xbe\xc9\xc7\xb2\x5d\xdf\x6f\x44\xa3\x5e\xbf\x18\x8b\xdc\x04\x8e\x0e\xe8\xb1\xb4\x25\x13\x33\x6b\x08\x09\x64\x10\xdb\x5c\x2f\x54\x65\xd3\x05\x1f\x49\x20\x55\x84\x42\x7e\x05\xfc\xb6\x05\x5f\x9f\xcd\xb3\xbf\xa9\x42\xf0\xa7\xd3\x49\x28\x9d\xe1\xdb\x4c\xbe\xa6\x0a\x14\x71\xcc\xe9\xdb\x32\xcf\x9f\x51\x27\xca\xb7\x71\xbb\x45\x3d\xde\xed\x47\x49\x1d\x12\x28\x08\x11\x61\xe0\xf4\x47\xaf\xa2\x19\xa3\x4b\x68\x66\xe2\x4e\x15\xf5\xa0\x07\xe0\x0b\xd7\x01\x22\x05\xf6\x6d\xdd\x54\x00\x3a\x2b\x5e\xac\x59\xd1\xb5\xab\x50\x24\xfd\x4a\xf0\xfb\xd3\x54\x16\x69\xad\xc0\xb0\x63\x34\xac\xcf\xf9\x7c\x96\xa4\xed\x67\x2c\x06\x42\xbc\xc0\xcd\xc5\x56\x08\xcf\xa4\x0c\x49\x60\x42\x85\x48\x90\xd6\xdc\x98\x2b\x15\xfc\x6c\x9b\x23\x24\xa0\x0c\x81\x27\x47\xf1\x61\xfd\xb0\x3f\xba\x06\x8e\xf4\xf8\x2e\xeb\x8b\xc2\x21\xc3\xc0\x2d\x21\x24\x08\x3d\x21\x4a\xeb\xe4\xbb\xd0\x74\x3d\x50\x1b\x6b\x3b\xa5\x32\xec\xa9\x0f\x6f\xe1\x1d\xf2\xf2\x34\x49\x62\x10\x42\xb4\xc2\x02\x9f\x43\x01\x1f\x43\x1a\x3d\xfe\x77\x6b\xf7\xf8\x3d\x10\x9a\x24\x58\x4d\xe4\x88\xc6\xb7\x1d\x84\x89\x10\x6a\x24\x46\x25\x6e\x84\x7a\xdb\x97\xf7\x99\x01\xdf\xc2\x68\x84\x48\x16\x8c\xf1\x6c\x72\xd0\x2f\x0e\x4c\xe6\xdb\xc3\x18\x8b\x57\x75\x59\x20\x36\xa7\xdd\x92\xab\x11\xb9\x7d\xdb\x89\x47\x88\xc2\x9c\x60\x6d\x46\x18\x1b\xf6\xaf\xc9\xed\x32\xc9\x3b\x46\xfb\x5b\x90\x55\x56\x5f\xb9\xde\x83\xb5\x9d\x44\x24\xc2\x35\xcd\x05\x37\x10\x50\x63\x84\x1a\xaf\x1e\x24\x8a\x88\xd0\xce\x44\x5f\xba\x28\x17\x2a\xc9\x8b\xaa\x35\x81\x61\x72\xe3\x51\x44\x70\x11\x78\x10\xed\x22\x57\x94\x1a\x1e\xb2\xe2\xcb\xa8\x18\x21\x51\x9a\x52\x8b\xfd\x77\x7b\x1e\xe8\x8e\x40\x8c\x90\x48\x86\xca\x46\xf0\xf2\xb7\xd6\x74\x81\xa1\x64\xd6\xf4\x4c\xca\xa1\x18\x3f\x4e\x79\x59\xc1\xea\xe1\xe9\x71\xef\x05\xdf\xdb\x66\x4d\x91\x67\xe3\x9f\x59\xf3\xc3\xeb\x30\xb1\x76\xbb\x57\x88\x30\xf8\xdf\xf2\x52\x97\xf3\x0b\x3a\x49\x74\x2c\xe5\x80\x56\xde\xbf\xd8\x6b\x57\x81\x10\x1e\xda\x5a\x86\x17\x68\xe8\x78\xe5\x21\x9c\xdb\x1a\x5d\x0b\xef\xd9\x9d\xab\x77\xb8\x4c\xde\x20\xd7\x56\x05\x5e\xec\xb2\x09\xaf\x2e\x23\x24\xa5\x91\x13\x9b\x6e\x27\xc9\x0d\xa6\xa6\xf6\x1f\xd3\x4e\xdc\xca\x65\x37\x3d\x24\xed\xae\x2a\x8f\x9f\x01\x5f\xdd\x51\x22\x56\x68\x54\x55\xe7\x4f\x52\x7e\x84\x88\x94\xe3\x9e\xd3\x2e\xdb\x8f\x65\xb3\x2a\x5a\x0f\xc6\x8a\xa4\xf8\x77\x29\x29\xa4\xdc\x8f\xfe\x1b\x68\xea\x07\xa1\xbb\xf7\x2f\x95\x16\xb1\xe7\x0b\x23\x7d\xe1\x02\x21\x8a\xc6\x98\xf3\xcd\x2a\x07\x4b\xac\x45\x0e\xdb\x73\x51\x74\xd1\x36\x42\x74\x64\x69\x29\x2c\xc1\xcb\x1c\x44\x88\x90\xd6\x09\xb0\xf6\x15\x7a\x47\x0e\xe0\x6c\x6b\xff\x7d\xc4\x8c\xd0\x40\x01\x4e\x94\x76\xbf\x2c\xb3\x21\x0e\x92\x50\x42\x45\x2c\xd1\x0e\xc9\x54\x59\x15\x5b\x51\xa8\x71\x76\x9f\x50\xc2\x62\x64\x83\x1c\x62\x67\x26\xfa\xcc\xa3\xf7\x46\x89\x4a\x94\x23\x01\x9b\x56\x37\x10\x4a\x09\x55\xbe\x8e\xb6\x0b\x9e\xfa\x36\x1a\x48\xd5\x61\x56\xff\x71\xce\xd4\x9b\x2d\x76\x1f\x3d\x35\xa5\x91\x4d\x3d\x14\xf0\xfb\xe9\x34\x8c\x90\x7c\xb6\x67\x76\xc7\x09\x0c\x57\x65\xaa\xdc\xbf\x56\x50\xbf\x96\xb9\x66\xdd\xb5\x63\x83\xe3\xf0\x77\x95\x35\x5e\xfd\x53\x67\x35\x78\xd7\x6b\x38\xe4\x29\x0b\x48\xac\x3b\xe9\xb8\xba\x41\x59\xbf\x71\x4d\xdb\xc4\x19\x6c\x8f\x01\x9c\xf6\x6a\x52\x7b\xf1\x59\xea\xc3\x1f\x46\x95\x65\x22\xaa\xc0\x97\xe4\xe0\x78\x9a\x4c\x15\xca\x9c\xaf\xd2\x80\x7a\x75\x1b\x45\x6b\x69\xaf\x9a\xd7\x01\x6f\x7a\xdb\x4f\x6a\xfc\x9a\x47\x0c\x8d\xd9\x44\xea\x00\x9f\x4c\x68\x48\x62\x74\x13\x0e\x9d\x58\xda\x18\x8a\x30\x57\x6b\xe8\x0f\x8d\x28\x02\x91\x8e\xf7\xa5\xb0\xa5\x96\xcd\xb9\x2a\x26\x37\x1a\x85\x21\xb3\x91\x25\x55\x16\x23\x78\x82\xeb\x90\x24\x0c\x35\x82\xe5\xf9\x72\x73\x59\x35\xaf\xf3\x13\x98\x72\xce\x52\x07\xe4\x6b\x5f\x66\x79\x6e\x90\xba\xa6\x76\x14\x80\x84\xf2\xc9\xdd\x71\x4d\xb0\xf2\x51\x9e\xa7\xb2\x6f\x8c\xd0\x34\xb1\xbc\x19\xd6\xa8\xc0\x64\xe8\x7f\x11\x5d\x23\x34\xe5\x56\x58\xf4\xbe\x7c\xb9\x2b\xab\xb7\x45\x61\xf9\xf0\xa6\x89\xb8\xf1\xad\xa7\x12\x90\x5d\xb3\x4b\xa3\xa0\xfc\xe0\x06\xaa\x5f\x90\x2d\x0a\x6d\x91\x45\x8b\x77\x91\xe5\xb8\x53\xa9\x12\xdb\x27\xef\x31\x85\x18\x35\x6a\xda\x6d\xfa\xb0\x5b\xdc\xaf\x76\xfb\xc5\xb7\x55\x37\x9e\x53\x48\x12\xb7\x2a\x0f\x05\xd0\x5c\xab\xd0\xa1\xb4\x34\xac\x45\x37\x15\xfc\x91\xca\x51\x59\x3c\xa1\x40\x9b\x72\x3a\x4c\x6d\x83\x23\x8e\x5b\x59\x28\xaa\x2b\x57\x45\x94\xd2\x5d\x59\x6d\xc4\x25\xb3\x74\xe3\x35\x14\x7a\x6a\xa4\x50\x2d\x80\xf7\x74\x95\x1d\x4f\xe1\x27\x34\xf5\xed\x01\xad\x9d\x37\x10\x4d\x58\x3d\xde\x0e\xbc\x59\xaa\x0d\xc3\xe0\x53\x5f\x31\xbc\x05\x33\x57\x2a\x4c\xa8\xe1\x12\x37\x08\x69\x73\x5b\xd7\xd7\x62\x01\xb5\xf5\x62\x5e\x48\xa1\x9e\x46\xd5\xff\x67\xdc\x1d\x38\xce\x21\x8c\x9e\xef\x5e\x3d\xcd\x10\x61\x84\x71\xc4\xc4\x37\xe7\x62\x22\x96\x3f\xbe\x1e\xe1\x96\x08\xf4\xd0\x8d\x00\xb4\x10\x3f\x2f\x0d\x21\x8c\x68\xae\x3b\x5c\xa0\xc9\xb3\xd3\x98\x59\x95\x30\x1a\xda\x54\xf2\xfa\xe9\xcf\xa7\xdf\x45\xb7\xfa\x33\x1a\x07\x68\x06\xdf\x66\x45\x39\x2a\x70\x71\xed\x2c\x0a\xad\x34\xae\xf8\xd8\x41\x9e\x77\xb2\xae\x6d\x93\xa1\x68\x94\x97\xe7\x06\xab\xa7\xb3\xe2\x65\x94\x2b\x20\x2c\x74\xba\xb2\xcb\xdd\xea\xfe\xef\xaa\x67\x08\x0b\x81\xe2\xeb\x41\x6c\x9e\xad\x3c\xc0\xd8\xa1\x33\x7a\xc7\xf7\x15\x42\x8a\xd3\xd5\x66\x57\xef\xb3\xe2\xcd\xc5\xe2\x7e\xc0\xa7\xd4\x02\xff\x45\xaa\x95\xb0\xd0\x84\x08\xd9\xdc\x9d\x40\x65\x22\x6f\xdd\x5f\x3d\x56\xbd\x63\x84\x45\x61\x42\x2c\x80\x1a\xaf\x89\x5f\xfa\x6e\xb8\xab\xb2\x08\x34\x06\x29\x2b\xa1\xc6\xec\xab\xae\x3d\x0e\xa8\x95\xb4\xca\x45\x76\xec\x6a\xcd\x86\xe0\x50\xc2\x62\xc2\x10\xd1\x66\x23\x45\xb7\x57\x8e\x38\x8b\x99\xe2\x28\xc0\x52\x37\x00\xc7\xa9\x19\x36\x1e\x21\xb1\x11\xd8\xf7\x11\xce\x55\xe9\x88\x2c\xba\x0b\x19\x29\x7b\x3b\x45\xd4\x70\x2f\x2a\xd8\x95\xb9\x5e\x17\x0f\x22\x1b\x14\x55\x12\x96\x44\x14\x63\xe4\x18\x63\xd9\x41\xb3\xaf\x40\xd4\xe7\xea\x32\x19\x8f\x09\xe7\xa4\x4f\xa6\x3c\xd7\x50\x39\xb6\xca\x75\x71\x73\xce\xdf\xe6\x1c\xe7\xb9\x7f\xf9\xb3\x19\xab\xff\x75\xf7\x5a\xfc\x1e\xda\x27\x8c\x07\x0a\x81\xbb\x93\xda\x4f\xc2\xb8\x66\xc8\xd2\xf9\x22\x8e\xad\xcd\xfd\x19\x37\x7a\xdb\x91\x63\x90\x6d\x40\xfb\xf3\x65\x89\x7c\x3b\x87\x21\xf2\x65\x3d\x50\x59\x41\x5a\x3f\xdb\xba\x4f\x97\x12\x6e\xf5\x09\x9d\xfa\xcb\xbe\x3c\xa3\x7e\x57\x6b\x87\x39\xc1\x92\x71\xa1\xc8\xe4\x22\xa9\x73\xed\xb2\x42\xc3\xc7\x93\xb1\xc5\xdc\x93\x34\x1e\x61\xa9\x8a\x11\xf8\x71\xc8\xea\x75\x81\x91\xe2\x2b\x9a\x20\xd7\x53\xa4\x34\x70\x04\x44\x3e\x22\xfc\x35\xd3\x15\x61\x42\x18\x8c\x95\x22\xc5\xce\x38\x7b\xe5\x9c\x26\x26\x13\xbb\x74\x9a\xac\x18\x4e\x7b\x15\x06\x28\x50\x5d\xc0\xef\x4f\x99\x51\x09\x53\x10\xc5\x49\x5f\xe9\xda\xbd\x3a\x2d\xac\xd0\x76\xe3\x46\xd6\x64\x4d\x31\x91\x40\x2a\xd0\x06\x19\x68\xb3\xaa\xfe\x2d\xae\x42\xed\x5f\x56\x9d\x7e\x36\xf1\x4d\x1a\xa2\xb5\x0c\x4e\xff\xd6\xbf\xa7\x4f\x6e\xdf\x28\x66\xdc\x30\x78\xb8\x38\xa1\x9a\xf1\xf4\x0c\x83\xd4\xd2\x9e\x6b\x78\x37\x9d\xdf\x15\x06\xd2\x22\x99\xfb\xaa\x4c\xb4\x62\x47\x53\x3f\x6c\xb7\x30\x17\x62\xc3\xc5\x05\x55\xaf\x57\x18\x6b\x99\x8e\x82\x90\x85\x81\xad\x1c\x3d\x57\xc5\x6e\xbf\xbc\xdd\xce\x8f\xa9\x90\xe9\x34\x71\xee\xd2\x34\xbb\x39\xed\x69\x74\x6c\x09\x5d\xdf\x87\xc2\x0d\xae\x35\x4c\x22\xac\xd5\xb2\x02\x66\x83\x24\x4a\xdb\x24\x30\xba\xf6\x03\x4e\xb9\xcb\xf1\xf5\x6b\xe7\xf4\xe3\x8c\x9f\x22\x54\x56\x2c\xcf\x05\x94\x96\xa5\x86\x41\x72\x8e\x84\x31\x95\x38\x1c\x9b\x57\x38\x14\xe5\x31\x2b\x44\x7e\x10\x45\x71\x16\xf9\x01\x51\x10\x50\x37\x87\xaa\xe3\x7b\x21\x61\x2c\xac\x8f\xda\xc1\xf3\x40\x1c\xe7\x3f\x65\x18\x6b\x8a\xdb\xd4\xf7\xcb\xa9\xed\x37\xa2\x23\x20\x61\x92\xc8\x54\x7a\x1c\x20\x8a\xfd\xce\x8e\x9f\x90\x33\x2b\x30\xb6\x39\xd7\xaf\xa3\x13\xf0\xd0\x46\x22\x96\xeb\x3e\x8b\x45\x42\x2e\x14\xe2\xd5\x5d\xa2\xbe\xdd\x67\xac\xb5\x3b\x19\x44\xdc\x10\x1c\x96\xc7\x52\xaf\x3e\x4e\x5f\x56\x46\x93\x30\x8d\xd3\x50\xb8\xa1\xf0\x5d\x58\xda\xcc\xe3\x90\xfd\x75\xb4\xe3\x86\x29\x4f\xf1\x4b\xda\x02\xac\xcd\xf7\x3f\xdb\x25\xb4\x9e\x98\x0e\x61\xaa\xc2\x30\x18\xbc\xc9\xdb\xb2\xdd\xad\x3c\xcf\xd7\xdc\x66\x13\x8a\xc0\xf2\x8e\xe1\x2e\xb1\x75\x94\xd6\xfe\xbc\x4b\x24\x68\xa2\xfe\xf4\x22\xa2\xd4\xe1\x0e\xf6\x50\x1d\xbb\xcb\x63\xf5\x05\x34\x57\xe1\xa0\x50\x08\x0b\xcc\x5c\x35\xaf\xb7\x99\x82\x28\xf0\x67\x52\x9a\x20\xaa\xc1\xfa\x50\x9b\xaa\x3c\x8e\x4d\x9a\xc9\x4d\x6a\x9d\x20\xb6\xef\x5b\x99\xeb\x4c\x1c\xfb\x28\x4b\x08\x81\x91\xff\x15\x66\xb9\xdb\xa9\xa6\xe1\xa7\x10\x58\x8a\x61\x8f\xa6\x3a\x5f\x57\xd9\xfa\x3e\x69\x2a\x90\xd8\x4f\xea\x4c\x0d\x86\x2e\x28\x0a\xae\x8a\xea\xd0\xce\x1c\x27\x39\x7b\x95\x14\x23\x21\x18\xae\x10\x5f\x02\x75\xf6\xd6\x08\xbf\x7c\x44\x01\x03\x15\x76\x75\x58\xe3\x1a\xb3\xd1\x3d\x44\x41\x18\x61\xe8\xee\x1b\x14\xcb\xd7\xec\x74\xad\x1a\xc7\xff\x9b\x1d\x3a\x0a\x44\x82\xc0\xa8\xef\xa2\x6a\x4d\xe3\xd6\x4c\x95\x97\x9b\x4a\x74\xe3\x3d\x0a\xc0\x58\x5d\x41\x28\xc0\x64\x2a\x13\xd5\xa5\x63\x40\x72\x5d\x08\x01\x0f\xa0\x5c\x18\x93\xe5\x28\x44\xd9\xc3\xaf\x48\x44\x58\xc0\xd2\x11\xe4\xb6\x5d\x33\xb1\x2e\xac\x40\x37\xaf\x47\xd7\x7d\x65\xfa\x7d\x15\xf3\x1c\x2c\x39\x11\x89\xed\x4a\x8d\x09\xd1\x46\xe8\x61\x55\xfa\x68\x48\x46\x04\x14\x6e\x06\xc7\x4b\x4f\x91\xeb\x9a\xa8\xd6\x48\x8e\x6d\x6c\x89\xc3\x90\x31\x91\x44\x21\x53\x26\xf4\x63\xff\x78\xca\xaf\x4c\xbc\x28\xd4\x49\x6a\x19\xe4\x8a\xe6\xe6\xb2\x68\xca\xe3\xfc\x9a\x1d\x45\x31\xf5\xc1\xb0\x65\x0e\x99\x9e\x9e\x28\x52\xdc\xa7\x09\xd1\x9b\xb8\x8b\xfc\x4d\xc4\x51\x1c\xb8\xc7\x74\xd9\xa6\xc9\x0e\x13\x25\x89\x52\x1e\x9f\x56\xb6\x13\x62\x7d\x3b\x4f\x8f\x4e\xa2\x44\x02\x56\x5a\x65\x47\xf1\x02\x3e\x6b\xe9\xaf\x94\x68\x86\xc8\x87\xa2\x2c\x7e\xe2\x28\x19\x10\xcc\xb9\x0a\x39\x12\xf1\x20\xc4\x2a\x49\x5b\xe5\x3e\x4f\x39\x4c\x22\x6e\xac\x5e\x70\xa6\x4a\x32\x00\x80\x91\x48\x04\x69\x34\x24\x36\x99\xe1\xb0\x6b\x3b\x09\x54\x53\xb8\x11\x75\xa6\x66\x68\x5d\xaf\x0c\x89\xd9\x3d\x2b\x12\xb1\x2d\x98\xf2\x24\x65\xcf\x45\xf6\xff\x3b\xc3\xee\x64\x79\x2f\x87\x4b\x6d\x24\x62\x8d\x1c\x08\xdd\x6d\x79\xe6\xb4\xc9\xfb\x13\x3a\x52\xe0\x33\x35\x98\x95\xb8\xc2\x7f\x90\x48\xf2\x18\x67\xdb\xc3\xe3\xe6\xaf\xe1\x56\x13\x29\x65\x31\x17\x0f\x8b\x3f\x0f\xab\xfd\xf7\xd5\xd6\x37\x68\x12\x5a\x9e\x25\x71\x19\x6c\x42\x91\x4e\x22\x2c\x5c\x6a\x5d\x2e\x94\x22\x45\x54\x41\x93\xc9\x2c\x6f\x77\xf5\x7e\xa5\x89\x80\x1a\xe2\xc0\x01\xed\x0e\x79\x25\x7b\xdf\x76\x61\x04\x99\xd8\x4f\x42\xbd\xf9\x9a\xd5\xf1\xc3\x41\x6c\x8b\x10\x5d\x49\x8e\xbe\x52\xcc\x9e\x7f\xcd\x20\x6d\x31\xaa\x75\x80\x9f\xce\x13\x0d\xa2\x4f\xf8\xfd\xe6\xa7\x89\xe1\x44\x39\x41\xdd\x9f\xe2\x9c\x37\xb3\x2a\xd1\x6d\x3f\x1d\xa0\x92\xe6\xc3\x65\xbc\x85\x7c\xe1\xc0\x46\x46\x5b\x6e\x6d\xe7\x13\x01\xea\x0b\xf8\x57\x6d\xc0\xc6\x4d\xd0\x5e\x1c\xc0\xb7\x49\x1c\x10\x8d\x83\xd1\x57\x01\x38\x1e\xda\xcf\x56\xa8\xd1\xbb\x89\x83\xd8\x3a\x1a\x43\x86\xe4\x51\x65\x1c\x89\x03\x1d\x33\x39\x08\xb3\x9f\x4e\x65\x35\xd9\x8a\x62\x12\xb3\xd4\x72\x43\xf8\xc8\xcb\xd8\x08\x88\x29\xb3\x05\xc7\x28\x19\x7f\x53\x8a\x4a\x6f\x05\xca\x13\x8e\x74\xe3\x67\x32\x2b\x31\x4d\x19\xe7\x5e\xb2\x07\xd7\x40\x8b\x03\x9d\x5d\x49\x63\xc6\x15\x38\x7e\xb4\x5b\xd1\x88\x1a\x9a\xb9\x5a\x45\x12\x33\x19\x62\x86\x7c\x81\x40\x58\x21\x73\xc0\x58\x41\x3d\x57\x13\x44\xe2\xb0\xbd\x8d\x9e\x64\x63\x57\x1e\xe1\x47\x76\x9c\xac\x0a\x71\x98\x52\x36\x64\x37\xd4\xb8\x50\xfa\x37\x10\xd1\xd0\xef\xca\xdf\xa0\x80\x99\x42\x40\x12\x47\x49\x8a\x08\x01\x0b\x95\xaf\x9f\xcc\xe4\x3e\x22\x49\x71\xb7\xf5\x1b\xd8\x53\x71\x03\xaf\x22\x37\x5f\xd6\x38\x7c\xe2\xb0\xc4\x71\x6c\xf9\xc2\x6f\xf6\xcb\x53\x5f\x0b\x88\xbf\xe3\x4a\xdf\xee\x26\x75\xb3\x05\xe4\x44\x54\x36\x8a\x3a\xac\xcd\x20\x71\x0c\x04\x1f\xf8\x01\x9a\xaa\x3c\x95\x79\x56\x77\x2d\x26\x44\x42\x73\x07\xae\xac\x0f\xa6\xac\x0e\x15\x66\x0e\x26\x8f\x94\x04\x31\xfa\x80\xdf\xb6\x4f\xbf\x96\xdf\x17\x5d\x22\x29\x4e\x02\x10\x89\x5f\xc9\x7c\x6d\x03\x3a\x33\xfb\xf2\xe7\x80\xad\x99\xc4\x09\x11\x41\xe7\x50\x20\x2d\xec\xdf\xb1\x12\x77\x07\x1a\xf4\x05\xef\xb3\x06\x8b\x5f\x5c\x38\xa6\x3b\x6f\x92\x22\x3a\xe2\xd8\x6b\x83\xf9\x02\x1b\xdf\x03\x52\x6d\x69\xbf\x4c\xf9\x5c\x75\x9f\x9a\xc7\xb1\x97\xe4\xb7\xa3\xbc\xbe\xbb\xc2\x26\xb9\xae\x69\xc8\xd4\x90\xd2\x6b\xf5\xd1\xcc\x8a\x21\x63\x57\x8d\x68\xb6\xfd\x6a\xf1\xe0\x15\xba\x07\x5a\xaf\x6d\x0f\x63\xb0\xe6\xee\xbe\x2c\x0b\xb8\xdc\x97\x4d\x03\x5d\x32\x29\x16\x01\x41\xc6\x81\xf7\x0c\x7e\xff\xca\x30\x19\xf4\x34\x4c\xa2\xc7\x32\xe0\x96\xc6\xf8\xbf\xb6\x5a\x93\x89\xd5\x1a\x4b\xc2\x64\xe8\x2d\x9e\xa3\xe3\x37\xb9\xb6\x5c\x63\xc9\x15\x96\xfc\x3e\x95\x2f\x55\x99\x77\xef\x4d\xaa\x98\x3b\x19\xc7\x1f\x7f\x2d\x2d\x0c\x6e\xfd\x52\x94\xd6\x6b\xea\x36\x93\x58\x49\x82\x97\xf1\x9b\xe1\x8f\xac\x69\xa0\xb0\x61\x6c\xd7\x45\xcb\xc4\xd0\x2e\x80\x74\xbd\x07\xc6\x10\x31\x34\xce\x3c\xbc\xdf\x45\x20\xfd\xf1\x86\x1a\x4c\x13\xb8\x14\xe5\x73\xa1\x1c\xdd\xb0\x6f\x97\x89\x1a\x08\x7d\x96\x13\x79\x08\x12\x1b\x2d\x10\x58\xa6\x2e\x2a\x1f\x59\xa1\x49\x10\x31\xe3\x16\x34\xbb\x0d\x3a\x1c\xf1\x70\x2f\x48\x82\x44\x20\x1d\x46\x56\x64\xcd\x48\x01\x63\xbc\x7e\x27\x84\x70\xde\x15\xec\x6d\xfb\xc1\x9b\x10\x22\x6c\x3e\xa2\x2c\xdf\xde\x00\xae\x63\x1c\xa3\xdb\x4d\x48\xaa\x30\xfa\x6e\xa9\x9c\x32\x05\x3b\xb0\x19\x69\xd7\x4e\x99\xa5\x94\xb8\x7d\xb0\xb3\xac\xfb\x3d\x15\xa1\x27\x84\xed\x54\x4b\xe6\xfd\xe4\x24\xe4\x61\x60\xc3\x4d\x2e\xfe\xdd\x47\x9b\x26\x1d\x95\xe2\x76\xea\xb7\x0b\x06\x6a\x75\x40\x55\xaf\xcd\xae\x34\xcd\x52\x9c\x1e\xcb\x66\x0b\xa2\x1d\xa5\xfe\x2e\xa2\xc4\xa0\x0f\xa8\xca\x3c\xcf\xea\xae\xa4\xc2\xb5\xc6\xd2\xd6\xff\x59\xae\xc0\x0e\x6c\xec\x5b\x35\x4b\x7a\x5e\x1f\x5b\xd7\xa2\xb2\xf9\x6d\x3d\x89\x21\x61\x2e\x0e\xf6\x3d\xd3\x1a\x8a\x4d\xbb\x53\xfa\x24\xe1\x74\x89\x4d\x62\x93\x12\x5f\x18\x64\xd5\xee\x6e\x44\xd3\xe4\xb0\x41\x64\xed\xfc\x17\x4d\x02\xab\x60\xf8\xb5\x8e\xb9\xef\x2c\x39\xb3\x7c\x78\x58\x6b\x77\x44\xb2\xcc\xc5\x72\x39\x9e\x6f\x09\x67\x81\xd5\xa5\xf0\xdb\xf3\x50\x1c\x8c\x24\x3c\x91\x18\x07\x3c\x8a\x8f\xb5\x2a\xc7\xdc\x85\x24\x49\x39\xc7\x70\xdc\x40\xd8\x6a\x57\xde\x79\x75\x2e\x92\x88\x84\x20\x5d\xd0\xc1\x1a\x08\x6e\x93\x76\x90\x93\xb5\x1e\x32\x75\x91\x44\xc8\xd8\x53\x82\x2d\x5f\xc5\xf1\x54\x8f\xbe\x94\x0c\x65\x12\x7b\x96\x09\x58\xab\xf2\x21\x9b\x24\x14\x12\x15\x04\x38\xae\x8f\xe2\xc3\x9a\x71\x1b\xa8\x16\x55\x93\xa9\x2e\x78\x9b\xa8\x40\x40\x07\x17\xaa\x6f\x2e\xff\x04\xb5\xff\x18\x4f\x2f\x45\x28\x3e\x71\x56\x63\x7c\xe9\xee\x5c\xe8\x91\x67\x95\xe8\x48\xa7\x9e\x8f\x62\xfc\x04\x3a\x11\x88\x90\x77\xca\x37\xd7\x4b\x4b\xa2\xd3\xd0\x8b\x25\xfb\xf5\x0f\x6f\x75\x1c\x89\x4c\x40\x2a\x24\x6f\xae\x55\x59\x21\x13\xb2\x17\x8c\xfc\xbf\x7f\xfd\x8f\xff\xeb\x7f\xf0\x87\xa8\x80\xf7\xa6\xd8\x83\xc8\x33\x84\x96\x77\xbc\x0c\x93\xcf\x0e\x3a\xd1\x96\xff\x44\x8a\x06\xf6\xbf\xcb\x3b\x28\xfe\x93\x1d\xfc\x0d\x18\xa3\x8c\x1b\x9d\xd6\x68\x7c\xb6\x69\xfa\x41\x8d\x31\xe1\x41\x2c\x10\x6b\x74\xc6\xda\x2d\xf7\x08\x37\x97\x1f\x30\xcf\x95\x41\x78\x90\x24\xc2\x5a\xdb\x2f\x57\xf8\x8f\x91\xbd\xcb\x83\x14\x90\x3b\x4d\x8b\xcb\xc2\x34\x50\xad\x8b\x87\xac\x38\x37\xdd\xc6\xce\xa9\x62\xb6\x18\xc7\x22\x85\x67\xca\xa7\xa7\xf6\xf4\xf8\x56\x58\xac\xa4\x67\x7a\x7e\xc8\xb4\xb6\x7b\x9a\xf2\x00\x28\xce\xd2\xc4\x7f\x28\xcb\x4f\x8b\x91\xd4\x2f\x8a\xe3\x09\x67\xc2\x62\x46\x16\xb9\x7a\x85\xe3\x67\xef\x80\x81\xc1\x2c\xf4\xc1\x19\x8c\xe3\xef\xc2\xc3\xc8\x78\xb9\x0f\x24\xe4\x52\xe3\x01\xc4\x23\x4a\xb0\xf0\x7b\x59\x16\x43\x3e\xb9\xb6\xc1\x5a\x3a\xde\xc2\x8c\x5d\x3d\xcc\xb8\x53\x6a\x01\xbd\x56\x9b\xb0\x82\xac\xcb\xb1\xf2\x48\xc4\x5e\xf4\xb5\xa3\x35\xb4\x08\x84\xc0\xf5\x88\x89\x15\x39\x39\x74\x3a\x30\x1b\xd4\xa5\xde\xc2\x3b\x2e\xac\x1d\xb4\xd1\x45\xd5\x68\x77\xa0\x61\x18\x68\xb0\x93\x6e\x5f\x3a\x4e\x30\x7f\xe5\x84\x27\x38\x72\xef\xca\x3c\x2f\xbb\x5f\x79\x44\x88\xd3\x2c\x6a\x6f\xc8\x74\xbf\xa7\x21\x22\x7b\x6e\xd7\xfb\xee\x27\x65\x79\x13\x3d\x0b\x53\x23\x72\x5b\x0c\x3c\xbb\x8a\x72\xae\x05\xa2\x6b\x8e\x90\x37\xe8\xb1\xce\xae\x9f\x9c\x83\x46\xe2\xc0\xe7\xc7\xdd\xd3\xfd\xed\x01\x25\xe1\x6c\x79\xf9\x6e\xfd\x4f\x9f\x0d\xe6\x69\x48\xb8\x03\x1a\x17\xa0\x9a\x43\x53\x1e\x8a\x52\x0f\xc8\xda\x08\x4f\x53\x8a\x55\xa8\x5b\xf8\x9d\x55\x30\xfa\x1e\x82\x19\xb0\x2e\x79\x2e\x2e\xfb\x0f\x87\xb5\x9a\xc2\x39\x46\xff\xdf\x1d\x29\x23\x8a\x85\x2f\x8b\xf5\x37\x9b\x32\x1e\xa0\x9b\xb9\x92\x80\x79\x0e\xab\x17\x71\xf3\xcd\xff\xae\xa5\x12\xd0\xfb\x2a\x48\x5d\x6d\x19\xf1\x5d\x07\x88\x15\x96\xca\x21\xd8\xf5\x98\x15\x5f\x71\x67\x13\x6e\x02\x83\x8b\xa9\x0d\xa7\xf8\x1a\xf7\x4f\xfa\xea\x04\x4b\xf8\xbe\x97\x47\x40\xa5\xb3\x99\x08\x05\x37\x3a\x65\x7a\x80\xb8\x77\x85\x95\x33\x0e\x71\x1a\xc4\x80\x46\x47\x47\x28\xd3\xf4\x42\x09\xbe\x8b\x90\x18\x5a\x12\x5a\xfb\x1d\x70\xf6\x54\x94\x58\x2c\x53\xa6\xbb\x7d\x22\xa5\x44\x21\x1a\xef\x15\x31\x70\xcb\xb2\x1f\x98\x29\xe5\xdc\x2b\xac\x3c\xfe\xdc\x23\x90\x6f\x7c\x5d\x2a\x53\x74\x78\xb5\x47\x4d\x1e\xba\xbd\xf5\xd0\xf4\x54\x43\xbe\xb7\x52\x18\x67\x45\xe0\xe1\x27\xc2\x84\x24\x65\xcc\x12\x36\xbf\x74\x05\x14\xc3\xcd\x31\x65\x2a\xc1\xd0\x58\xc7\x98\xf7\xd9\x5a\x38\x1c\x43\x69\x14\x58\xc0\xf2\xb8\x28\x69\x94\x8e\xf3\x05\x0b\xe3\x98\xc7\x98\xa3\xca\x75\x8d\x43\xcf\x66\xce\xbb\xdd\x69\x6c\xf3\xa4\x71\x90\x62\xba\x02\x5d\xb5\x4d\xf6\xf2\x72\xb9\x11\x85\xcf\x5b\xa7\x49\x20\x35\x77\xf2\x82\x28\xaf\xbb\xbe\xed\x9a\xb8\xc4\x74\xb5\xc5\x70\x60\x8c\xa0\x0b\x9b\x4e\x51\x4c\xa3\xb7\x9b\x28\x89\xe1\x76\x18\x16\x09\x91\x94\x47\x32\x22\x8e\xfd\xe9\x5b\xd6\x5a\x8e\xd5\x27\xab\x45\xca\x85\x65\xcd\x35\x19\x56\xac\x2e\xf3\x0c\x11\x54\xd6\x92\xd9\x8b\xfa\xed\x8f\x69\x7f\x3b\x72\x6e\xb2\x3c\xcf\xca\xa2\x7e\x11\xfd\x65\x53\x6e\xcd\xfb\xbb\xf2\x5c\x68\x0b\xef\x1c\x42\x73\xd3\x34\xb5\x9f\xf1\xc5\xa6\xd1\xac\xae\x52\xfd\x5c\x4f\xa4\x4c\x48\x2a\x68\x98\xba\x88\x0f\xfa\xde\xd3\x68\x40\x2a\x58\xa0\xc3\x0e\x47\x8f\xa2\x15\x62\x16\xb0\xf6\x5f\xfe\xf5\xa7\x4d\x6d\x2c\xa7\x86\xe6\x5b\x5e\x4a\x0b\x1c\x19\xb8\x5f\xa9\x80\x10\xd3\x3e\xf5\x49\xa8\xf1\x10\x15\xc6\x16\x98\xe6\xe5\xcb\x9c\x12\x14\x49\x65\xa0\xf4\x88\x66\xfc\xba\x3c\x20\x95\x01\x24\xd1\x20\xd2\x6c\x97\xbe\x29\xc4\x3f\x55\x41\xcc\x55\xef\xc0\x1d\x50\x0f\xce\xdf\x88\x62\xd6\xad\xae\xa1\xb1\x40\xa3\xff\xd8\x37\x33\x1a\x37\x2a\x49\x10\xea\x7d\xf8\x91\xfd\xce\x86\x4b\x76\xaa\x85\xc2\x16\x8c\x69\xbc\x6e\xcb\xf3\xcb\xeb\xae\x29\x8b\xe9\x9d\x6a\xc9\x24\xf4\x12\x80\x23\x28\x5c\xaa\x0d\xc3\x20\x40\xa6\x4a\x1f\x54\x72\x2d\x26\xe0\x58\x1c\xfc\xb0\x5b\xee\xff\x16\xd6\x92\x1a\x4a\x70\x74\xe3\xb4\xef\xd8\x8d\xe7\xd1\xd7\x9f\x84\x7a\x52\xc3\x52\x16\xb8\x7d\xf6\xae\x12\x33\x80\xaf\xd4\x24\x09\xe6\x19\x76\x20\xf2\x29\x5e\x25\x35\x29\x47\x87\x6c\x57\x94\xbf\x35\x14\x0b\xe4\xed\x71\x8d\x22\xa0\xd2\x85\x9c\x71\x6f\x78\xc8\x3e\x2b\x66\x11\x41\x9c\x20\x4f\x42\xad\x2a\x31\xd6\xd3\x22\x22\x48\x52\x64\xf6\x5e\x54\x0d\x7c\x0c\x3f\x86\xa0\xc2\x16\xae\xce\xcb\x08\xff\x77\xa1\x76\xc1\x62\xeb\x01\xdd\x3f\xff\x5c\x0f\x4b\x37\x04\x8b\x43\xaf\xff\xb9\xc8\x73\x2b\x1e\xea\x9b\xb8\x45\x87\xb8\x94\xb2\xee\x7e\x17\x11\xc6\x06\x90\x14\x7b\x44\x3d\x45\x04\x93\x56\x17\x13\xc1\x3a\xb7\x65\x33\x2d\x05\x11\x4c\x72\x74\x37\xd7\xcb\xa7\xc3\xc3\xfa\xb1\x17\x4c\x26\x22\x0c\x64\xec\xb4\x78\x17\x9e\x5e\x68\x32\xea\x45\xe4\x28\xdc\xa7\x0c\x02\x58\x01\x75\x05\x51\x77\x07\xc5\x21\xd5\x72\x70\x90\x69\x6d\x6d\x63\xa3\x68\x9f\x7c\xaa\x84\xa5\xe8\x20\x7d\x83\xe6\xb9\x86\x6a\xad\x3f\x49\xd8\x88\x24\xb6\x0a\x4f\x77\x4f\xcf\x8f\xb7\xab\xed\xee\xf0\x73\xb5\xb3\xc2\x95\xf7\xeb\xbb\x3b\xff\x68\x89\xb6\x50\x86\xfb\xf2\x05\x5d\xcf\x11\xde\xd3\xf5\xe1\x4c\x61\x3a\xb3\x83\xe9\x5b\x2e\xc0\xdb\xdd\xc1\x07\x17\x9a\x6b\xa6\x3f\x3f\xc4\x05\x17\x80\xe8\xd0\xba\x11\x6f\x30\x92\x8e\x1d\x3f\x58\x1a\xa9\xc4\x02\x9f\x35\xc0\xf1\xeb\x4c\x80\x3f\x24\x31\x26\xc0\xb4\x53\x03\x3e\xdd\x8e\xa5\x44\x59\xf1\xe2\xa5\x36\xfd\x83\xa6\x92\xa2\x4f\x75\x14\x1f\xd9\xf1\x7c\xec\x40\x20\xae\x59\x04\x44\x85\x9e\x5e\xc0\xfa\xd2\x74\xf2\x42\x45\x4a\x30\x17\xa8\x5c\xb0\x71\xe9\xbb\x4e\xb5\x0b\x89\x10\x22\xc1\x74\xbd\xb0\x55\x7d\x0e\xf1\x3b\xee\x23\xc3\x20\x8e\xbd\x36\xa1\xd7\x0b\xd8\x57\x97\xf6\xdf\xfe\xae\x64\x1c\x60\xe5\xf0\xfe\x61\x90\xdc\x11\x52\x6b\x84\x88\x0f\x45\xb0\x71\xc8\xb4\x6f\x77\x9c\x16\x9b\xbc\x30\x95\xd0\x88\x0d\xc2\xe5\x8d\x68\xbc\xfe\x76\xdb\x18\xab\xc4\x73\x75\x37\xd6\x54\x9e\x83\xe8\x09\x1d\xdb\xe9\x80\xec\x8d\x96\x5e\xb4\x29\x1b\x18\xc0\x8f\x47\x0b\xae\xd0\x9c\x61\x70\xfc\x2e\x17\x52\x0a\xff\x2b\x04\x01\xba\x18\x3f\xb2\xba\xee\x0a\x65\x89\x80\x30\x0a\xe4\xc0\x08\xae\xbb\x86\xd8\xd6\xa2\x64\xf5\x1d\xd6\xa5\x59\xb5\x0c\x07\x8f\x42\x8b\x7f\x7e\x81\x31\x91\xad\xec\xc7\x40\xee\xfe\xda\xf3\x1d\x3f\x9b\x11\x51\xe4\x68\xfa\xb1\x02\xfb\xa1\x2c\x5a\x5b\xd8\x23\x34\x1c\xeb\xa7\x1f\xdc\x32\x48\xd2\x48\x0d\x6c\xe6\x2f\x4d\x76\x49\xa3\x54\x39\x6a\xf7\x91\x90\xce\xd8\x09\xff\x82\xb7\x87\x48\x9a\x28\xcc\x0d\xdc\xc2\xb9\xb6\xa5\x54\xb8\xfd\x7c\x76\x41\x1e\x23\xdf\xc2\x66\xf1\x6d\x35\x74\x9c\x24\x4d\x6d\xde\x04\x01\x08\x0b\xad\x5b\x4b\x70\x10\xf0\x95\x54\x87\xa9\xea\xa8\x67\xac\x3b\x3a\xb9\xc4\xff\x45\x3d\x5a\x80\x4f\x95\x74\x66\x97\x02\xc9\x88\xf4\x19\x23\x2b\xd0\x3c\x91\x97\x20\x92\xc5\x56\x43\x76\xf9\x7d\xb5\xfc\xf1\x22\x8e\x12\xaa\xfd\x6f\xef\x25\x4b\x96\x0a\x74\xa0\x85\xd6\x76\x84\x59\xeb\xea\xef\xcc\x2a\x7f\x34\xc8\x74\x18\x9c\xf6\x8c\x40\xe3\x79\x29\xc3\x84\x23\x25\x41\x2e\xea\xc6\x42\xb2\x9f\xde\xa1\x12\xfd\xbb\x09\xb9\xe1\x3e\x16\x66\x6d\xc4\x3f\xce\xd7\x2c\xe8\x44\x46\x89\x0c\xc7\x14\xa0\x57\x1f\x7c\xbe\xb8\xee\xef\x7e\x9e\x5c\x26\x8d\x02\xd4\x2d\xef\x7d\x72\x19\x69\x5b\x44\x52\x9c\x8f\x0f\x7e\x66\xc9\x98\x80\x82\x6e\x43\xbd\x07\xd3\x7c\x17\x9d\x61\x26\x63\x6a\x84\xc5\x8b\xa0\x3d\xde\x45\xcf\xba\x8f\x17\x87\x14\x43\x14\xbe\x70\xf5\x7a\xa3\x90\x49\xa2\x85\xdb\xb2\x57\xc7\x53\xe3\xf2\x7b\xbe\x51\x10\xc4\x79\xc1\x31\xb3\x0a\x49\x99\xba\x2f\x5f\xe6\x7c\x42\x99\xa8\x10\xe9\xae\x5d\x68\x7f\x31\xa0\x2d\xf5\xcb\x81\xe4\xd2\x6a\x93\xb7\x6b\x58\xa6\xfc\xaf\x29\x13\x28\x0d\xd2\x6e\xe0\x9b\xed\x6a\xb7\xb8\x5f\xd1\xae\x2d\x01\x1c\x5b\x42\x6b\xb4\xd6\xe6\xc7\x68\xaa\x39\x22\x80\xdf\x6a\x75\x33\x64\xbc\xde\x97\x2b\x55\xd6\x97\xba\x81\xab\x24\xd6\x1c\x80\x66\xf0\xcb\xe8\xd1\x44\x02\x88\xe7\x9e\xd8\x4c\xd3\x2f\x3e\x75\xab\x26\xbf\xfb\x93\xb5\x9b\xab\x8b\x13\x66\x4d\xf6\x1f\x28\x96\xaf\xa2\xf5\x22\xa1\xca\xea\x26\x53\x13\x53\x52\xb6\xfb\x89\x0b\x30\xfc\x84\xaa\x6e\x3d\x20\x94\x68\x2d\xab\x2b\xa1\xe8\xe9\x95\x54\x88\xe1\xf5\xb3\xe5\xdf\x78\xc8\xa6\x68\x7b\x29\x80\x44\xf1\x80\x24\xcd\x6b\x22\x62\xf6\x16\xf4\xf3\xdf\x20\xdc\xa4\x94\x31\x3a\x37\xad\x95\xb0\x14\xa7\xac\x4f\xd0\x4a\xa5\x00\xd9\x9f\x97\xd5\xe5\xd4\x94\x8b\xa6\x3c\x76\xa3\x40\x69\xea\xf4\x60\x0b\xfd\xd5\xce\x27\x35\x31\x02\x15\x31\xe0\x7d\x5c\xe7\x24\x81\x32\x70\x83\xd6\x26\xe6\x32\x18\x97\x63\x4a\x88\x53\x1e\xb9\x9d\xfa\x26\x6b\xfe\x2c\xab\xdd\x59\xa9\xe1\x29\x62\x81\xd5\xd5\x42\xeb\x47\xf8\x6d\x4b\x4e\xe7\x6a\x12\xfb\xdb\x01\xd0\xda\x21\xc0\x9f\xae\x36\x30\x1f\x55\x96\x26\x88\x11\x49\xdb\xf8\x5a\xb1\xd1\xbe\x2a\x4d\x20\x43\x97\x95\xdb\xdd\x8c\x9e\x9b\xb8\xeb\xa8\x20\x20\x18\xdd\x6b\x4f\xbf\x38\x65\x57\x9c\x46\x5f\x14\xf8\xa9\x20\x92\xdc\x25\x4b\xc7\x40\x33\x1b\x66\x70\xbd\x48\xc4\x02\x97\xa2\xb0\x24\x7f\xb3\x68\xeb\xae\x37\x80\x13\xeb\xcb\x97\xab\x8f\xf1\xca\xab\x68\xaa\xa8\x53\x49\x9e\xb3\xad\xc6\xaf\x50\x51\x19\xe3\x54\x17\x45\x76\x14\x1d\x7d\x7f\xfb\xbb\x46\x03\xc2\xaa\xc3\xc3\x7c\x86\xd4\xf5\x65\xcc\x52\xf4\xb7\x8b\xde\x6b\xeb\x25\x4d\x99\xcd\x89\x62\x91\x8d\x9a\xbc\x80\xcd\xb8\x57\x22\x1f\x0f\x20\xc5\xc0\x72\x8e\xff\x2c\x5b\xbb\xd3\xb2\xf7\xce\x6e\xc7\x8a\x41\x88\x73\xc4\x29\x55\x7c\x4a\x6d\x4f\x54\x48\x6d\x04\xe1\x5c\x58\x86\x2f\xbf\x0a\x75\x17\x0d\xa9\x12\xde\x7a\x44\xfa\x29\xf7\x7b\x94\x10\xe3\x62\x04\xf7\xa2\x6e\x76\x0d\xe4\xf9\x44\x5a\xf8\xd3\x39\xa8\x22\x08\x91\x0c\xd4\xed\x8c\x3b\x64\x47\x1e\x8a\x18\x8f\xa3\x51\xdd\x51\x51\x2c\xdd\x3e\xf7\xb7\x9c\x8e\xb3\xce\xb1\x3b\x51\xac\x42\x34\x8f\x7c\xca\xbd\x35\x67\x7f\x65\xcd\x6b\x87\x74\xf8\x9a\x80\x73\x12\x7d\x52\x09\x0f\xb1\x48\x13\x63\x55\x25\xbe\x06\xd7\xc2\x53\x4b\x81\xdb\x5e\xe0\x1f\x67\x38\x7f\x62\x3e\xa9\x94\x10\x32\xe4\x74\x5f\xe4\xf9\x80\x4c\x9f\xa8\x34\x4c\xa8\xe3\x24\xab\x1b\x51\x34\x45\x1f\x6d\x52\x22\x90\xb8\x36\xdf\x2e\x9e\x3e\x19\xc0\x82\x06\x18\x27\x79\xa9\xe0\x32\x9c\xfe\xbe\x39\x64\x88\xce\xfd\xe6\x8c\xa5\xa1\x76\x8e\xef\x12\x5b\xd2\xb3\xda\x4b\x32\x7b\xf9\xb4\x49\x3f\x49\x13\x2c\x57\x76\xa2\xdb\xed\xb6\xbf\x2a\xf4\xee\x94\x67\x9f\x64\x53\x94\x14\x9c\xb5\xef\xee\xe6\xe9\xf9\x71\xff\xd7\x61\x71\x7b\xbb\x5d\xed\x76\xfe\xd9\xa4\xa1\x9c\x5f\x87\x2e\xc7\x81\xa5\xd9\xd4\x92\x92\x26\x02\xa7\xd5\x3e\x8f\xde\x55\x10\xcb\x30\x19\xaa\xc7\x8e\xe4\x5e\x88\x32\xca\x60\x62\x7d\x7d\xbb\xf8\x36\x0c\x47\xe8\x80\x45\x3e\x2c\x87\x6c\x2d\xd7\x4c\x52\x44\x13\x65\xa3\xc3\x96\x4b\x9a\x1c\x32\x55\xa2\x52\x8b\x57\x4f\x1f\x46\x04\x34\x4d\x85\x21\x1e\xd9\x35\x23\x0f\x4d\x34\x35\x96\x82\xb6\x0b\x31\x8f\x97\x06\xcd\x48\x8c\xcf\xf2\x2a\xea\x1d\x56\xc7\xfd\x2c\x9b\x69\x38\x51\xb3\x88\x60\x89\xdc\xfa\xbd\x74\x31\xe8\xee\xf0\x48\x49\xea\x31\x53\x97\x55\xf3\xba\x2e\xa6\xc7\xc6\xca\x04\x3e\x85\x61\x03\xf6\x4e\x6c\xc7\x33\xde\x7c\x05\xb8\x71\xc2\xe2\x84\x7e\x22\x7d\xe9\x2f\x92\x26\x30\x60\x35\x18\x6d\x42\x3a\x24\x96\xca\xa9\x80\x8f\xa6\xee\xc1\x6f\x3a\x24\x0c\x17\xf3\xac\x7e\x28\x0b\x68\x5e\xc5\x6c\x94\x42\x87\x54\x1a\xa7\x81\x7e\x93\x0b\xf5\xe6\x79\x70\x26\xbd\x84\x75\x0b\x64\x59\xbe\xb5\x2b\xc2\x7d\x66\xe6\x8b\x7f\x27\xe9\xc6\xff\xfb\xd7\xe4\x51\x42\xd0\x88\x47\x38\x64\x35\xf2\x61\xdc\x67\xc7\xac\x7f\x14\x23\x74\xd8\xa1\x1b\xdc\x22\x78\xb5\x9d\x0d\x87\xb3\x8e\x09\x67\x72\x90\x5c\x5b\xf5\xce\xf2\x78\x46\xe9\x38\x61\x11\x1b\x2c\x6e\x56\x7b\x71\xfa\x55\xc6\x27\x4f\xad\x7c\xf9\xe3\xea\xc6\x1b\xf1\x3a\xe1\x96\xe6\xba\xce\x5e\x0a\xd0\x8b\x79\x28\xc2\x97\xcb\xe4\x3c\x32\x7a\x3c\x09\x35\x4f\x34\x38\xd3\x62\x7b\xb3\x58\xce\x7f\xbb\x34\xb0\x9c\xd4\x4a\x58\x70\x97\x15\xa1\xf5\x77\x9a\x72\xe9\x75\xa3\xec\x4c\x1c\x7f\x89\x34\x65\xc4\xf9\xc2\x58\xb7\x68\xad\xb7\x6b\x98\x7a\xff\x06\x85\x90\x68\xeb\xd9\xdd\xd3\x62\x6f\xc6\x3d\x64\x28\x6d\xee\xa7\xdc\x57\xd9\xcb\x8b\x25\x13\xf7\xf7\x23\x63\x1b\x3a\xde\xff\xb5\x59\x1d\x56\x7f\x6e\xee\x9f\xb6\x1d\x8c\x56\xcb\x14\x90\x4b\x03\xb9\x8c\x39\x9f\x9e\x57\x73\x34\x1e\x0d\x40\xaf\xec\xe8\xda\x80\x30\xe4\x46\x6d\x30\x45\x8d\xa2\x24\xab\xce\xab\xd2\x90\x00\x06\x56\x33\x85\xf1\xc8\xee\x67\x27\xa2\x54\x94\xda\x0a\xbc\xd9\xdf\x81\x50\x45\x1d\xa7\xa6\x2d\x0d\xf0\xbf\xa7\xca\x1b\x21\xbb\xa6\x12\x0d\xbc\x5c\x86\xe1\x7d\x60\x69\xac\x46\x04\xad\x7f\x95\xe7\x0a\x43\x42\x63\x81\x14\x02\x0c\x28\xaa\x6c\x21\x33\x56\x47\x21\x4e\x20\x24\x06\x95\xa1\x0e\x79\xa9\x44\x7e\x97\x79\xce\x36\x67\xc1\xfa\xcf\x06\x11\x09\x91\x8a\x29\xab\xbb\x42\xe5\x3f\xc6\x1d\x92\x50\x44\x9e\x44\x0d\xb9\xee\x3e\x19\xe4\xa3\xb1\x0e\x91\xb1\x91\xae\xb2\x80\x83\x12\x95\x7f\x53\x10\x33\x62\x73\x4f\xa5\x86\xc1\xf6\x0a\xb1\x48\x82\x64\x68\x9c\xb6\x96\xdb\x2c\xa2\x14\x12\x19\x60\xd1\x93\xf2\x64\xec\x9b\xaa\x2c\xcd\xd4\xe1\xf1\x4b\x05\xf1\xd6\x37\x24\xd2\x60\xb9\x2f\x56\x33\xbc\x4f\x09\x6a\x09\x70\x6e\x7a\xd1\x06\xd0\x2e\xaf\x3e\x26\x4c\xf2\x5d\x55\x82\x6f\x77\x09\x55\xd3\xe5\xd5\x80\x83\xc4\x4a\xa6\x5b\x18\x91\x33\x40\x4a\x0d\x66\x06\x31\x54\x5d\x6f\xa0\x42\xfa\xb9\xae\x35\xb5\x44\x90\xbd\x92\x2f\x72\x1f\xef\x4e\x00\x7a\x18\xf1\x84\x14\x52\xcc\xc0\x5a\x80\xc8\x98\xc7\x71\xfc\x86\x52\x10\xb8\x03\x6d\x26\x92\x5f\xd7\x4b\x45\xe7\xeb\x43\x0a\x90\x0c\xb2\x3c\x6b\x55\x8e\xf6\x05\x10\x44\x60\x49\x87\x8d\x20\xdd\xc2\x14\x87\x07\x42\x44\x68\x36\x43\xa5\x68\xb0\xf4\x2a\xe0\x04\xa4\x26\xb8\x6e\xe4\xe5\xcb\x22\xcf\x07\xa4\xf9\x04\x20\xe0\x81\xee\x30\x6d\x08\x7b\xc0\x1c\x54\x59\xad\x8b\x49\xc0\x78\x70\xa7\xc0\x69\x92\xf4\xbc\x76\x08\xe0\x9c\x35\x3d\xc0\x90\x00\x79\xcb\x76\xc8\xd3\x68\xb2\xe6\x8a\x9d\x94\x80\x49\x09\x0a\xc6\x3a\x14\xd8\xa1\x41\xf0\xe1\x97\x18\x3e\x13\x10\x12\xba\x32\x0b\x8c\xd9\xdb\xa1\x3a\xb1\x03\x4c\x10\xd1\x81\xf2\xe8\x23\x7c\x34\xdf\x6c\x91\xeb\xa2\xd0\x0f\xe2\x03\x53\x8d\xcf\x45\x93\xe5\xed\xcf\xab\x4f\xb4\x68\x89\x09\x92\x40\xa7\x1e\x4a\xe2\x5f\x9d\x09\x52\x3a\x2a\x53\xb8\xba\xe3\x01\xda\xd9\x04\x46\x21\x52\xe8\x20\xb4\x5d\x97\xf7\xa5\xa3\x84\xbd\x0a\x58\x8c\xaf\x4d\x92\x00\xb3\x09\x53\xc2\x7a\x62\x88\xd1\x9e\xbe\x74\x59\x65\xad\x97\x6d\x21\x2b\x93\x77\x40\x23\x86\xf9\x30\x67\x6a\x6c\x07\xa9\x43\x43\x13\x85\x01\xa4\xac\xfe\x25\xaa\x2a\x2b\x2b\x0b\xc3\x9f\x9c\x40\xd9\xa5\xfa\xb7\x77\xaa\x41\x5b\xcb\xab\x87\x34\xfa\x9e\x3a\xc1\xca\x89\x3d\xe4\xf0\x22\xda\x4e\xe3\x2f\x6d\x98\x30\xae\x42\xe7\xd8\xee\xb1\x67\x9d\x35\x25\xfa\x24\xb8\x20\x38\xc0\xc5\x02\xe9\xe6\xe7\x0c\x05\x77\x96\x50\x50\x1c\xce\x7d\xb5\xe7\xaf\x61\x01\xcb\xfc\x8c\x34\xa1\xb1\x80\xdb\xac\x43\x97\x3c\x74\xf1\x7f\x13\xb1\x10\xad\xca\xd2\x15\x0f\xbb\x75\xb6\x87\x79\xae\x8b\x0d\x54\x3e\x26\x66\xe2\x20\xc1\x57\xb2\x2c\xb3\xe2\xd0\x05\x88\xba\x56\x10\xb8\x75\x08\xbf\x9c\x5b\xc0\x55\x7f\xbb\xff\x9f\x6a\x70\x67\xda\xdd\x75\x12\x2a\x31\x70\xfd\x08\xbf\x37\xaf\x9e\xda\x94\xfb\xc6\x38\x08\x3d\x7f\x6f\xb3\xbb\x1c\x65\x99\x8f\xbc\x70\xc3\xa3\x00\xe2\xbf\x4f\x35\x0e\xd7\xa9\xd1\xfe\x62\x52\x41\x89\xb3\xe5\x31\x9a\x8d\xa9\x0f\xcf\x18\xd2\xf5\xe1\xd6\x16\xc5\xe0\xce\x57\x9f\x27\x55\x69\x07\x8f\x9a\xd6\x7e\x19\x11\x58\xe4\x6d\xe7\x35\x6a\x71\x54\x03\x08\xb4\x11\x49\x8c\x59\xbf\xfa\xb5\xac\x1a\x2b\xe3\x33\x89\xd4\x19\x91\x28\x1e\x76\xab\xe7\x16\x3e\x83\xbd\x19\xc1\x21\x71\xfe\x54\x55\xe6\x79\x7f\x8d\x34\xb0\x38\x99\xa6\x3c\xad\xeb\xfa\x9c\x15\x2f\xeb\x42\x67\xef\x99\x3e\x8b\x7c\x14\x49\x35\x32\x54\x8e\xf3\x00\xd6\xca\xa9\x4a\x0e\xe0\x1a\x46\xc6\x89\x9a\x11\x60\x72\xad\x2a\x92\x16\xc3\xbb\x7e\x3c\xdc\xac\x6f\x0f\x77\xdb\xc5\xf2\xb0\x7f\xf2\xb9\x53\xa3\x13\x8a\x5c\x69\x1b\xd1\x3a\x9e\xf5\x0d\x40\xd1\x2e\x4b\x23\x63\xd0\x68\x99\x78\x38\xee\x1d\x72\x26\xfa\xa3\x41\x50\xe6\xc3\x1c\x77\x22\xcb\xf7\xc3\xd0\xc0\x2b\x14\xbb\xa6\x3c\x9d\xba\x04\xb0\x31\xc4\x8a\xd3\xe7\x59\xf1\x76\x9b\x55\xa0\x9a\xfc\xf2\xc7\x17\x72\xd9\xc4\x18\x65\xc3\x3b\xb7\x50\x34\xa2\xfd\x4a\x5d\x05\x35\x76\xa0\x41\x20\x04\xa6\x25\x11\xb4\x87\xeb\xd1\x8d\x6f\x22\x4c\x28\xc7\xd1\xe3\x71\x7f\x5f\x6e\x04\x34\xa0\xd4\xaa\x64\x1f\xb3\x22\x3b\x9e\x8b\x95\xdf\xd5\x69\xc0\x18\xc5\x84\x0c\xf2\x10\xe1\xb6\xe3\x1b\x22\x1b\xe8\x39\x0a\x0d\x9e\x2d\xe0\xae\xac\x3e\xc9\x8f\xce\x5b\xfc\xfd\xda\x4e\x03\x66\xac\x36\x6b\x5d\x9a\x46\x89\x13\x19\x01\xb6\x69\x10\x6a\x89\x65\x54\x7d\x11\xfb\xea\x7e\xbf\x9c\x44\x26\x69\x10\xa9\x08\xe9\x9c\xb2\xa2\x39\xb7\xab\xab\xc9\xcb\xdf\x7f\x8c\x9f\x35\x32\x96\xe9\xb0\x1d\x74\x75\x87\x5a\xa6\x41\x4c\x62\x5c\x10\x5b\xeb\x53\x21\xb4\xeb\x6f\x16\x16\x7f\x5c\x98\x86\x1d\x7a\xf2\x20\x11\x38\x37\xf7\xd8\x6e\x50\xb5\x07\x68\xf4\x17\x72\x30\x0d\x0d\x26\x77\x17\xc7\x96\xf8\xe7\x66\xb9\xec\xbe\x67\x2c\xa9\x97\xd8\xbb\x2f\x5f\x26\x07\x24\x94\xa1\xed\xe1\x4b\x02\x7f\xc2\x6b\xa6\x72\xd8\x9d\xc4\x27\x52\x82\x83\x43\xc3\x00\x03\xa9\x03\x52\xe1\x25\x74\x0a\x9b\x34\x48\x22\x85\xc0\x23\x79\xbe\xec\x96\xfb\x1f\xb3\x6b\x0e\x0d\x12\x19\xd9\xaa\xa0\xed\xda\x1f\xc8\x99\x4d\x06\x5a\xe2\xac\xbb\xb2\x42\x65\x81\x45\xa1\x9f\xce\x8d\x2a\x27\xfc\xb3\xdc\x1f\x94\x38\x62\x8c\xbb\x61\x89\x21\x0d\x78\x2a\x13\x04\x62\xac\xbe\xdd\x5f\x13\xc6\xd0\x20\xe5\x3a\xf4\x75\xa8\xde\xcd\xb8\xcb\x4b\x2c\xa3\x19\x15\x7e\xf9\xfe\x69\x88\x41\x36\x0c\x3a\x81\xae\x47\xa1\x11\x1a\xa4\x2a\xc6\x44\x48\x6b\x0b\x88\xc6\x51\xa9\x74\x8d\x90\x42\xdc\x11\xc0\x65\xc7\xf3\x71\x72\x72\xc1\x22\x8c\xbc\xad\x3e\x4e\x25\x56\xe4\x79\x41\xdb\x59\xf5\x8d\xc1\x71\x51\x60\x57\x2b\x4f\x16\x8d\x72\x24\xfe\xb2\x22\x56\xc9\xd0\x47\xbf\x2b\xab\xc3\x97\xf9\x62\x1a\x88\x94\xa3\xe3\x88\x14\x30\x83\x85\x91\x06\x92\x0a\x5c\x8b\x0e\x03\xc6\x72\x1a\x48\x90\xa2\x97\x6b\x3c\x96\x0f\x59\xe1\xa1\x08\xab\x49\xa2\x9d\x06\xca\x18\xa5\x3d\x5e\xbd\x6e\x3f\xf0\x12\x25\xc7\xbe\x8a\xe2\xd2\x40\x53\x6e\x0b\x93\xb3\x02\xb3\x8e\x08\xcf\x9e\xbf\x7b\x4d\x0d\x46\x18\xac\x3a\xaf\x95\xcb\xf5\xbc\x50\x9e\x54\xc9\x77\x0d\x23\x16\x76\x9f\x64\xf7\x5b\x9c\xc6\x70\xec\xae\x9b\xa5\xa7\x42\xfd\x0d\x9b\x13\x1f\x99\x55\x34\xd0\x2a\xc6\xca\x08\x4b\x8e\xb9\x5f\xce\x6e\x6c\x34\x80\x80\xf2\xce\xd6\x3f\x17\x8d\x0f\x8d\x8d\x4f\x06\xb1\x0a\x1c\xe7\xf2\x41\x83\x11\xe7\xbc\x39\x58\xcb\x5c\xe4\x07\x3d\xc7\xa4\x4f\x03\x10\x01\xb5\xb2\x27\x9d\x2c\x6f\x39\xbd\x49\xa3\xad\x18\xc2\x00\x5a\x36\xbe\x3f\x12\x50\x8a\x56\x95\xb5\xd6\x77\xd0\x34\x39\x58\x1a\x98\xba\xc9\x9a\x6b\x50\x08\x25\x01\x23\x68\xdf\x6f\xca\x46\x94\xf5\xcd\xb9\xd3\xa9\xa4\x84\x48\x89\xa6\xe6\x93\x4b\xc7\x23\x36\xd8\x37\x52\xc2\xd1\xee\xfd\x76\xfb\xc3\xff\xc4\x52\x11\x38\xd5\xc1\xc6\x94\xd5\xd1\x6f\x0c\x8f\x70\x3e\x8a\xea\xcd\x32\xd0\x0c\xe8\xdd\x28\x09\x23\x8d\xf8\xbe\x17\x71\x04\x5b\xf1\x32\xac\x18\xa4\x24\xe4\xa9\x0e\xfb\xf2\xcc\x39\x4f\x9a\x92\x10\x62\x2b\x1f\x7d\x2a\x7f\xd3\xf9\x21\x45\x22\x19\x72\xe6\x41\x82\xb6\xcc\xe3\x01\xaa\xb7\x1c\x46\x5e\xf7\xff\x5d\x49\x6e\xba\xc3\x63\x1a\x45\xde\x4f\xe8\x28\x85\xe7\x53\x25\x5f\xfd\x71\x67\x4b\x20\xc4\x5c\xfe\xf6\xdb\x77\x8f\x30\xa1\x84\xcb\x14\xfd\xfa\xf6\x55\x0c\xdc\x4b\x4a\x38\x48\xc4\x26\xee\x9e\x6f\x1e\xd6\xbb\xdd\xfa\xe9\x71\xbb\xfa\xb5\xd8\xde\xfa\xf6\x94\x04\xa4\x0f\x40\xdd\x01\xb4\x13\xb2\xab\x52\x7b\x43\x13\xab\x81\xea\xdd\x67\x2e\x29\x49\x85\xc2\x65\xaa\x7e\x2d\x7f\x3f\x5c\x7e\x96\x4d\xf7\x3d\x52\xa7\xaa\x2e\xb4\xde\xa9\xb2\x1a\xd1\xd2\x51\xd2\x9a\x7f\x3d\xe1\x85\x53\x62\xb8\xb9\xf8\x02\xa0\x85\x0b\xde\x5f\x51\x8d\x7e\x99\xdf\xa1\x44\x32\x82\x65\x95\x26\xab\x50\x04\xb5\x79\x32\x5d\xb9\x7a\xbd\x1c\xd6\xd1\x51\x22\xa5\xc2\xa4\x6b\x6b\x79\x1d\x32\x94\xdb\x3b\x98\xac\xd0\xad\xf7\xf2\x3d\x2b\x9a\xd6\x3f\xb5\xf0\x88\xef\x20\xf4\x1f\xa3\xeb\xa8\x90\xfb\xfa\x95\x8e\xfd\xc0\x37\xc9\x94\x77\x95\x23\x59\x59\x3c\x88\x8f\xa5\x38\xf9\x56\x2d\x43\x3f\x0a\xff\x71\x86\xea\x32\xde\x33\x88\x06\x82\xcd\x37\xe7\xcb\xac\x75\x3e\xfe\xf8\x26\x8c\xd0\x86\x6e\xc7\xf3\x80\x8f\x7a\x68\x79\x52\x62\x62\x86\xd8\xb6\xef\x0f\xc3\xcd\x90\x06\x31\x45\xe2\xac\xbb\xec\xe3\x06\x1a\x46\xba\xdf\x85\xe6\x69\x17\x22\x76\x69\x60\x73\xce\xa7\x7e\xb1\xef\x2e\xd3\xc8\xc5\xed\x56\xb5\xaa\xca\xdf\xe8\x7b\x1c\x6a\x8b\xac\x1f\x7d\x9c\x76\x0a\xe2\xfe\x6b\x89\xcf\x26\xec\x2e\x9f\x06\x62\x28\x25\x40\xa8\x0b\xb8\xdd\x88\x89\xd5\x42\x69\x12\x62\x63\xeb\x06\x38\x55\x59\x9b\x54\x99\xf6\x13\x90\x0c\x14\x62\xad\x13\xd0\x0d\x06\xca\x92\xc0\x18\xa4\x23\x69\xe0\xc3\x11\x00\xfa\xb6\x30\x06\x5b\x16\x67\xab\xdc\x07\x81\x09\xdf\x21\x21\x98\xd6\xb3\x83\xb9\x23\x00\x19\xad\xab\xbd\xa8\xf2\x5c\x26\x8e\xd2\x28\x4c\x53\x5f\xaf\x57\xc1\x3b\x2a\x7c\x8c\x2e\x12\x45\x3a\x0d\x7a\xca\xf9\xdd\x6b\x66\xe5\xc3\xc7\xb7\x12\xf1\x24\x0d\x7b\x97\xde\x87\x04\x5a\x6f\x02\xb3\x0f\x33\x59\x78\x4a\xe3\x84\xe0\x2e\x7c\xb0\xc2\x1f\xa5\x7a\x7b\x1e\x57\x00\x53\x1a\x73\xbb\x0d\x89\xaa\xc9\xea\xa6\x5e\x54\xcd\xef\xb2\x7a\x9b\x67\x02\xa6\x34\x16\x29\xae\x4a\xfb\xed\x63\x0f\xeb\xa3\x34\x89\xec\xc6\x98\x97\x2f\x18\xc7\xc3\xd2\xab\xae\x51\x6a\x4c\xe4\xdf\x56\xe2\xa5\x2c\x86\x87\xf1\x28\x8a\x5d\x20\xbd\x97\x04\xe7\xa3\xf5\x84\x72\x61\xb0\xcc\x01\x89\x90\xd6\x75\x2e\x0a\x3d\x3c\x45\xca\x52\x54\x08\xbb\x2f\x5f\x9c\x28\x3e\x64\x75\x7d\xfe\x44\x0f\xac\xdd\xf8\x20\x1a\x14\x91\x8f\x29\x05\x28\x15\x49\x10\xb9\xd2\x8f\xef\x65\x6d\xa1\x1c\x73\x33\x94\x0a\x9e\x5a\xca\x2f\xbf\x08\xb5\xce\x57\x4f\xa6\x47\xa9\x24\xd2\xf3\x93\x88\xaa\x12\x97\x43\x3e\x00\x66\x50\x2a\xb9\x4a\x90\x71\xeb\xc7\x6a\xfb\xb8\xba\x3f\x6c\x16\x8f\x6b\xbf\xcc\x53\x88\x02\xa4\xcc\xd8\x40\x21\xf2\x66\x5e\xcc\x8d\x52\x50\x0a\x2b\xf1\x3a\xd9\x6e\x91\xe7\x07\x81\x60\xe3\xd1\x27\x66\x41\x18\x63\x99\x93\xee\x17\x33\x16\x24\x0a\xf3\xaf\xf7\xcb\xc5\xee\x7b\xf7\x23\xa7\x98\x6c\xc5\xd5\x7e\xf8\xb8\x2c\xd0\x21\x77\xfe\xc5\x77\xa8\x4a\x4f\xa8\xbb\xfa\x38\xdd\x95\x15\x72\xc9\x3e\x8f\xc1\xd7\x94\x91\x98\x0a\x17\xcc\x73\xaa\x59\x03\x05\xc2\x7a\xda\x59\x58\x11\x88\xf7\xb2\x81\x5d\x21\x4e\xf5\x6b\xd9\xb8\xba\xc0\xc5\xb9\x29\xbf\x66\xb6\xa7\x8c\xc6\x36\x42\x33\x85\xf5\x8f\x53\x86\x2e\x5a\x42\x19\x35\x96\x79\x6e\xb7\x59\x3c\x74\x2b\x05\x63\x24\x44\x03\x7b\xf5\x61\xab\x45\x5c\xf8\xf0\x9f\xbf\x96\x5f\x1b\xd2\x8c\x49\x2b\x92\x23\x4e\xa7\xd6\xfa\x19\x51\x5d\x50\xc6\x54\xcc\xe3\x2e\xd6\x5e\x5d\xb5\x26\x98\x86\x2d\xe0\xa3\xc9\xcb\xa6\x18\x5a\x36\xc8\x55\x89\x9b\x5e\x59\xb5\x56\x11\x9a\x56\xfb\x51\xb0\x9a\xb2\x88\x59\x0e\xa3\x0a\xea\xf3\x11\xbc\xc4\x9e\x6f\x8c\x03\xa4\xa5\xfa\x27\xc8\x4a\xcc\x96\x05\x9c\xa7\x54\xc1\x94\xc5\xcc\x66\xb1\x4f\x88\x10\x24\x5d\x4a\xa8\x6d\x81\x60\x84\xde\xed\xc9\x92\x71\xc6\xdf\x0c\xb8\x73\xe7\xf7\x71\x16\xc7\xc4\xc4\x3d\x8c\x77\xcc\x1f\xda\xf5\x01\x61\xf3\xaf\x4f\x0f\x6b\x5b\x1a\x3e\x9e\xa6\x2c\x8e\x0d\x0e\x97\xa3\x78\x83\x7d\x79\x14\x4d\x39\x61\x17\xa4\x2c\x4e\x01\x61\x00\xdf\x7c\x99\xf4\xed\xa5\x10\xc7\x4c\x6d\xdb\xbd\x7b\x7e\x46\xb1\x84\x01\x6e\x39\xcb\xed\x6a\xb1\x5f\xdd\x1e\x76\xfb\xc5\x36\xf4\xd7\x4c\x12\x8a\x39\x13\x9b\x93\x68\xba\x28\x13\x65\x89\x8e\x19\xda\x1b\x2f\x70\xdf\x05\xd3\x28\xe3\xcc\x92\xcf\xfe\x12\xf5\xeb\xa4\xfa\x81\x32\xae\x38\xeb\xb9\x04\x6e\x6f\xfe\xd9\x4e\x2b\xc7\x47\x39\xfd\x46\x5f\x8f\xbe\x34\x52\xd4\xab\xa1\x88\x0b\x7c\x8a\x34\xf1\xdd\xb9\xe5\x64\x02\xbd\x2c\xab\xe9\xfa\xc7\x52\x4d\xf1\xb6\x7e\x03\xbc\x6d\x2c\xe4\x62\x92\xf4\xa7\x4c\x44\x10\x0c\x8a\x95\xbd\x89\xc3\x44\xc2\x5c\xf4\xde\xca\xae\xae\x3f\xe5\x8b\xe9\x0e\x10\xb8\xb4\xff\x6f\x79\xa9\xc0\xcb\xbb\x50\x26\x94\x40\xa9\x28\xb4\x48\x2d\x70\xee\xb1\xd4\xdd\x9b\x93\x44\xe2\xa4\x18\x48\xd7\xf7\x10\xa3\xab\x1c\x0a\x65\x92\x2a\xe4\x3f\x79\x58\xfc\x79\xd8\xae\xee\x57\x8b\xdd\xea\x70\xdb\x09\x05\x50\x26\x15\x27\xbc\xcf\xb1\x20\x27\xdf\x2c\x15\xf2\x78\x5f\x67\x12\x2c\x6b\x8f\x12\xc5\x66\xe0\x26\x33\x69\xac\x06\x6f\xa6\x4a\x8c\x16\xd3\x91\xce\x14\x65\x8a\x06\x18\xb6\xc3\xe0\xe9\xa6\xf9\xe8\x7e\x8f\x52\x84\xf1\x2f\xcb\xe3\xb1\x9f\xc1\x4a\x46\xa9\x65\x3b\x57\xa5\x0d\x9a\x67\xef\x48\x41\x3c\xf6\x8b\x7d\xd5\x5d\xea\xcc\x37\xa6\x23\x15\x73\x87\x2e\xdc\xf4\x2b\x8a\x56\x11\x52\xd4\x3c\x74\x3c\x74\xf3\xa3\x44\x83\xd5\x34\x3f\xbc\x40\x73\x0f\x2f\x50\x68\x51\x5d\x36\xf9\xb9\xde\x0a\xcc\x20\x0f\xa3\x55\x4c\x1b\x8e\x45\xe7\x0f\xeb\xfb\xfb\xf5\xd3\xa3\xe3\x11\xf1\x97\x84\x84\x60\x98\xa1\x39\x57\xc5\x93\x31\x4b\x51\x58\xdb\xfb\xae\x2a\x8b\xe6\x57\x56\xe8\xf2\xb7\x25\xcc\x39\xa2\xd8\x6e\x3b\x3b\xfd\x91\x82\x19\x2c\x4e\x7c\x2d\x9b\x72\x0f\x1f\xdd\x28\x05\x23\x94\xf6\x72\x66\x0e\x41\xb0\x13\xa6\x83\x9a\x7d\x0d\xb6\x72\x27\x31\xb1\x41\x81\x4b\x5f\x5b\xf2\x74\x77\xb7\x5b\xed\xfd\x25\x0c\xa4\x54\xf9\x60\x47\x6b\xd1\x34\x4d\xf5\x45\x91\xd4\xff\x6b\x65\x1c\x0d\x49\x68\xe9\x79\x96\xa2\xda\x8b\x8f\x6c\x26\x52\x10\x12\x1e\x45\xdc\x97\xa1\x58\x8f\xa7\x43\x4b\x7d\x19\xbe\x0b\x69\x28\x84\xab\xbc\x1e\x12\x9a\xd2\x90\xa6\x1c\xad\xe2\x45\x6b\x9a\xdc\xc2\xd1\xbf\xf3\x90\x85\x82\xc2\xa0\x2a\xe0\x8f\x19\xec\x08\x0d\x59\x6c\x0b\xa7\x3d\x8a\x0a\x23\x58\xd9\x9c\x06\xd3\xac\x4d\x1c\xfa\x5d\xaf\x0f\xd5\xce\x73\xaa\xd1\x30\x64\x1a\xcb\xda\x75\x5f\xa1\xd1\x6e\x83\x56\xf5\x75\x30\xad\xc2\x88\xc5\x4e\xe0\xbe\x13\x2e\x39\x74\x6d\xae\x32\xe2\x68\x75\xd5\xe7\x89\x2f\x68\x18\x73\xee\x4b\xe8\xad\xdc\xf3\xe4\x3b\xc4\x52\x28\x57\x44\xf8\x4d\x1c\x61\x7d\x32\xd3\xbb\x4d\xb4\x35\x75\x2f\x3b\x14\x72\xee\xbd\xb2\x90\x87\x5a\x74\xb7\xb7\xec\x2b\x75\x9e\x8b\x7e\x05\x0d\x79\xcc\x13\xe1\xa3\xb8\xea\x6d\x37\xc0\xdd\xbb\x1e\x29\xb5\x04\xb8\x88\xa6\x40\x7c\xe4\x78\xef\x0c\xd3\x48\x45\xdc\x15\xce\xa1\x85\xd6\x5e\x09\xba\x2b\xa4\x49\x84\xc5\x11\xfb\xc5\xe8\xee\x44\x14\xb9\xb2\x98\xe6\x41\x7c\x0c\xe4\x0e\xb9\xef\x20\x03\xa4\x2d\xc2\x54\xc9\xd3\xe3\xb3\x9f\xdd\xa1\x0c\x02\x1e\x75\x23\xe1\x26\x2f\x5f\xba\xa2\x44\x1a\x4a\x2e\x74\xa7\xa6\xdb\x1a\x07\xf7\x65\x53\xcf\x17\x7d\xb5\x9d\x35\x16\xc9\x60\xa9\x16\xb8\xf2\x08\xd7\xa6\x62\x81\x7a\x37\x3f\x6e\x7e\x06\xa4\xfb\x51\x32\xdc\x3e\xbc\xac\xaa\xb5\x25\xba\x56\x13\x79\xa1\x2e\x1f\xa5\x44\xf6\xce\xe5\x75\xe4\x2f\xd4\x22\x8e\x4d\xe7\x5b\x61\x70\xb3\xe7\x7a\xf5\xcb\x5c\xa8\x35\x93\xce\xa2\x47\x90\x09\x54\x38\x7b\xfe\x98\x18\xa3\x21\x28\x8d\xdf\x08\xa5\x0e\xc9\x24\x7a\x1f\x05\x40\xb0\x82\x78\x23\xde\x56\x3f\x1c\xbb\x27\x8d\x90\x7a\x78\x80\x1f\x16\xaa\x19\x64\x52\x22\x92\x02\x06\xcd\xb0\x1e\xb5\x4f\xbd\x44\x34\x32\x41\x3a\xd1\x91\x6f\x3d\xc2\xdb\x12\xea\xc7\xd2\xea\x12\xf9\xdf\x9f\xcc\x43\x59\xc1\xfe\x55\x14\xf8\x33\xe8\x9b\xcb\x2d\xe6\x8f\x3b\xa7\x20\xa2\xa9\xa5\x13\x1b\x56\x67\xb5\xbb\xea\xf8\x09\xa8\xe4\xc6\x12\x86\xb4\x4b\x3a\x16\x9d\x3b\x0c\xd4\xa4\x23\xa3\x09\xe2\x2c\xa4\xd0\x2f\x9f\x84\x71\x23\xa6\x94\x36\x8e\x1d\xf6\xb1\x3c\x4e\x6b\x48\x69\x14\xc6\x06\x1d\xa5\xef\xe2\x78\x84\x0a\x19\x00\xfc\xed\x86\x1a\x10\x16\xb5\xde\xef\xc6\x7b\x6c\x14\x45\x96\x69\x49\x67\x75\x6d\x95\x1a\xc6\x27\x8d\xb8\x65\x8c\xc1\x0d\x04\xf3\xa9\x83\x10\xdf\xe7\x19\xa8\x28\x0e\xb5\xcd\x6d\x6b\x28\x9a\xcc\x64\x50\xed\x4b\x1b\x6d\x1c\x0d\x95\x28\x8e\x42\x01\x9d\x62\x84\x4b\x9e\xdc\x8f\x57\xac\x28\x91\x9a\x79\x88\xa4\x35\xa5\xca\x6a\xa0\x3e\x32\x9a\x1d\x51\xa2\xad\x95\xf2\x2a\xea\x2d\xd4\xa7\x12\xe9\x25\xc7\x17\xe5\xc4\xf8\xf1\xb9\xa8\x9a\x76\x8f\x6c\xae\xa0\x1a\x34\xe2\x40\xa3\xc8\x03\x6f\xad\xe3\x78\x03\xa6\x1d\x19\x53\x48\x03\x8d\x04\x49\x4d\xbf\xcc\xfb\xa9\x15\x09\x99\x22\xc7\x8a\x3c\x67\xb9\x5e\xbe\x8a\xea\xa5\x2b\x56\xa5\x91\xd0\x0c\x0d\x96\xe7\xbc\xa9\xc4\x63\x1f\x36\x8c\x84\xd6\xa9\xb5\x48\xf2\xfc\x56\x64\x77\x65\xf5\x19\xe2\x90\x46\x8a\x46\x96\x85\xd6\xba\x33\xc3\x9a\x06\x1a\x29\x16\x29\xf7\x04\x38\x0f\xeb\xd9\xf5\x24\x52\xc6\x25\x62\x4e\x79\xe6\x25\xd4\xfd\x29\xb4\x20\xe8\x9c\xdf\x23\x50\x07\xd3\x9f\xe3\xd8\xd2\x1c\x64\x92\x46\xda\x68\x1c\xac\xbf\x45\xd6\x34\x83\x44\x34\x8d\x40\x19\xc4\x7a\x09\xad\x6d\x69\x5b\xc7\x08\x35\xeb\x81\x46\x86\x31\x34\x3e\x70\x00\x3e\xd7\x50\xdd\x5c\x46\x6e\x5d\x64\x52\x83\x04\xda\x0e\xf7\x8c\x01\xf1\xc9\xd4\x88\x83\x98\xa1\x25\x7c\x68\x3f\xa2\xab\x85\xa4\x71\xc0\x29\x02\x12\xd6\xe5\xb9\xfb\x49\x4b\xe4\xb1\x6e\x37\x9b\xf9\xf0\xa3\xeb\x48\x88\x53\xea\x6d\xc4\x0b\xd0\x51\x62\x2b\x26\x51\x88\x11\x8f\x76\x03\x45\xfd\x37\x1b\x98\xf4\x64\x70\x34\x26\x0e\x26\xfa\xad\xcc\xf5\x8d\xdd\x9e\x91\x71\xb0\x6b\x4f\x19\x26\x26\x2c\xa5\xb4\x65\xc0\x1f\x13\xce\xbb\x8e\x94\x06\x89\x05\xea\xf9\xb5\xcb\x56\x26\x38\x43\x77\xf4\x99\x63\x1a\x06\x56\xc6\x11\x11\x67\xad\x77\x9c\x35\xbb\xd7\xb2\xbf\x6f\x1a\x12\xe2\x72\x26\x22\xcf\xf4\x02\xe3\x9e\x5e\x4c\x74\x54\xe8\x31\x8b\x21\xa6\x31\x35\x3a\x15\x9e\x69\xb6\x80\xcb\xe4\x6e\x59\x1c\x18\x70\x16\xfa\xd1\x16\x1d\x5c\x33\x33\xd1\x38\x64\x11\xb2\xc2\x78\xf6\xfd\x76\x99\x47\x74\x4f\x8d\xd9\xa4\xef\x9f\x16\x19\x7d\x6d\x3f\xc6\x61\xc8\x1d\x8d\x24\xee\x5d\xe8\xea\x62\x50\xb0\x6c\x5f\xec\xfc\x13\x85\x82\x85\x0e\x87\x67\xbb\x75\xbf\x73\x0c\xa3\xbc\x9e\x0b\x5d\x81\x6e\x7d\xdc\xee\xeb\x45\xd2\x44\x72\x60\x18\xda\x2b\xed\x4b\x7b\x82\xf1\x3d\x45\x2a\x44\xe8\x83\x6c\xd4\x24\x77\x1a\xc7\x91\x31\xd2\x47\x43\x5b\x87\xa6\x99\xbe\xcf\x38\x16\xcc\xe5\xc5\x5c\x05\xeb\x93\xfc\xb7\xaf\x60\xbd\x66\x0f\x19\xa3\x3c\x69\x1c\xf3\x04\x43\x03\xe5\x40\x7b\x81\xc6\xb1\x63\x1a\xfe\x25\x8a\xf9\xf0\xfb\xe4\x1e\x8c\x44\xa6\xbc\x81\xfc\xca\x78\xd4\x25\x81\x26\xc1\xb0\xe6\xba\xac\xea\x83\xed\x3d\xed\x29\x28\xae\x56\x76\xb7\x6c\xc7\x86\xe5\x62\xf4\x77\x96\x68\xe9\x93\x93\x2e\x21\x73\x83\xdb\xe5\xf8\x8b\x71\x4a\x3a\x81\x87\xf3\xe9\x74\x69\xdd\x11\x34\x20\xa7\x6b\x02\x0f\x49\x6a\x13\xf6\xf3\xdc\x56\x5f\x06\x07\xe2\x94\x58\x56\x3b\x1b\x95\xb8\x17\xf5\x90\x10\x60\xe6\x35\xa4\x51\x8a\x69\xa7\x87\x87\x51\x0e\x22\x4e\x63\x91\x76\x86\xdf\x49\x34\x59\xbf\xf6\xc6\x22\x49\xd1\xb5\xac\x85\x81\x07\xd1\xbc\xee\xce\x72\x7e\x17\x88\x45\xa2\x11\xfd\x78\xbf\xfa\xb9\xba\x3f\xb4\xfe\xfb\xcf\xc5\xfd\xf3\xaa\x3b\x91\x34\xca\xb1\x2d\x42\xd1\x1c\x8e\x67\x9f\xbb\x8a\x65\x60\x83\xab\x37\xe7\xcb\xa6\x02\xcb\x4d\xa7\xde\xbc\x78\x30\x9f\xac\x20\x92\x58\xc6\x64\xac\x84\xb0\xfa\xfd\x95\xee\x33\x3b\xb1\x4c\x04\x2e\x20\xbf\x3c\xf6\xed\x93\xc5\x53\x99\xd8\xa6\x9d\x4a\x14\xfc\x9d\x7c\x41\xad\x63\xaa\x87\xc4\x9f\x98\xbf\x83\xa1\xd9\x12\x03\xb7\x1a\x07\x2f\xd0\xec\xcf\x55\x81\xac\xd7\xe3\xb3\x18\xa1\x62\x18\x21\x68\x5b\x4f\xa4\x1b\x4c\x46\xdb\xbc\xd1\x51\x7c\xa0\xe9\xd6\x3f\x45\x12\xf0\x34\x8e\x47\xd3\x0a\x0d\x97\x7d\xe9\x80\xf8\x57\x52\x23\xfe\x38\x63\xf9\xcc\x5c\xb4\xe7\x7b\x79\xae\x61\x2f\xde\xa0\x83\xcb\xd3\x84\x04\x89\xc1\x58\xb8\xa8\x7c\xea\xb4\x6b\x8a\x6c\x8d\xc4\xb9\xb6\xbc\x9d\xc8\x18\x3e\x93\x9f\x4d\x48\xbb\x9b\x39\xd3\xd3\x72\x81\xc3\x4c\x9d\x2e\x4d\xa8\xa4\x98\x5e\x14\xd6\x86\xb5\x00\x49\xff\xfc\x09\x63\x02\xab\x44\x5d\x74\xff\xa6\xfb\x3d\xb6\xa6\xd1\xe7\x7c\xbc\x34\x61\x92\x90\xa0\x43\x09\x8c\xa4\xec\xfd\xeb\x4f\x42\x92\x22\x2e\xe7\x11\x40\xd7\x83\x34\x44\x12\x52\x2e\x3d\x1d\xf4\x50\x8b\xd8\x35\x47\x01\x8b\xdc\xb9\x95\xa8\xb4\x18\x1b\x2c\xf3\x93\x31\x89\xa9\xe5\xbb\x7d\xaf\xd4\xc8\x36\x48\x62\xce\xa4\x4b\x34\xaf\xd7\xeb\xc3\x96\x4d\xae\x16\x83\xc0\xc8\x3b\x4a\xb1\xb7\x66\x4f\xfb\xe6\xb3\xe2\x9c\x35\x97\x81\x6b\xc7\xe8\xff\x8c\x8e\x4a\x98\xc4\x58\x81\x7a\x6d\x2f\x56\xbc\x00\xea\xa4\x5c\x65\xef\x7a\x9b\xf8\xda\x3e\x4e\x12\x29\xb5\x73\xba\x9e\x5b\x5f\x9b\xac\x8b\xe6\x8e\xb9\x2d\xe0\xae\xbb\xcf\xff\x99\x1d\x69\x3c\xd0\xb8\xe8\x22\x05\x4a\x6b\x24\x14\xbe\x16\x68\x50\x8b\xfa\x77\x88\xce\xd9\x5a\xe0\xd1\x3d\x72\x29\xa8\x2b\xee\x78\x3c\x1f\x91\xe9\xac\x77\x90\x13\xae\x52\x9c\x82\x0d\x54\xc7\xac\x40\x78\x44\x6e\x6e\xc1\xa2\xef\xbb\x4e\xda\x26\x4f\x90\x8e\xa9\x73\x77\x93\x34\xa4\x68\xb5\xb6\x1b\xf1\x2c\x6b\x4a\xdb\x85\x23\x15\x5e\xcf\x04\x8f\xbb\x01\xea\xc0\x75\xa7\x49\x0c\xee\xc2\x06\xe5\xd1\xbb\xd2\xae\x1d\xfa\x12\xf5\xc2\x7e\x13\xe2\xcf\x28\x92\x18\xf3\xb4\x87\x5e\x0b\x64\x36\xa1\x9b\x88\x34\x64\xa2\x47\x72\x8f\xb3\xb4\xae\x8f\x4c\x23\xcc\x17\x3c\xef\x6e\xff\x1c\x0e\x6f\x15\xd8\x9a\x5f\x04\xb9\x3a\x0e\xe0\x2e\x04\xe5\xfb\xa8\x04\xdd\x19\xcf\xfa\x5d\x34\x76\x9e\x8f\xaf\x00\xcc\x7a\x5e\x56\xf1\x11\xe9\xce\xaf\x6b\xd2\x7d\x5f\x23\x03\x8c\xc1\x61\x34\x27\xcf\x8e\x59\x53\xf7\xb3\xc0\x04\x12\x6b\x37\x4f\x65\x9e\xef\xb3\xe6\x6a\xce\x19\xc5\x98\xb5\x22\x9f\x4f\xaa\x7f\x16\x1e\x24\x12\x4d\xef\x4d\x75\x39\xc2\x87\xad\x79\xb8\x16\x84\xf9\x64\xdf\xf4\xe7\x48\x29\xda\xc9\x9e\x31\x79\x71\xbf\xea\x4e\x2f\x38\xeb\x8a\xc9\x47\x65\x58\xae\x03\x49\x22\x0c\x5e\x02\x82\xb2\x77\xd9\x4b\x31\xcd\xc9\x72\xa2\x42\xac\xb1\x69\xef\xa8\x5e\x4c\xc4\x6e\xb0\x19\x23\xc8\xe7\x93\x05\x99\x7f\x36\x17\x86\xcb\xe7\xff\x5b\x74\x92\x13\x1d\x25\x16\xb8\xee\xc3\x12\xad\xdd\xfe\xad\xab\x66\xa1\x9c\x06\x3a\x72\x39\xdc\xf3\xe9\x17\x64\x4b\x71\x9a\x2f\x64\xa7\xad\x5f\x82\xf0\x3d\x9b\x5e\xfb\x92\x7a\x73\x72\x20\xd7\xc8\xab\x7c\x23\xe5\x7f\x99\xc4\xe2\x34\x15\x38\xd1\x9e\x4e\xad\x25\x5e\x74\xc5\x79\xbe\x59\xd8\xb2\x91\xac\x03\x16\x5b\x34\xc7\x2f\xc8\x7c\x17\xc6\x34\x06\x6a\x30\x8c\x33\x7b\xa3\x13\xd3\x93\x33\x13\xa3\xcf\xd6\x88\xda\x4f\x66\x1e\xc6\x14\x93\x19\x2f\x65\x8e\xb6\xc5\xa0\x6a\x8f\xf2\x50\x27\x4e\x1f\xa3\xd0\x5b\x30\xfb\x9f\x13\x1f\x96\x87\x46\x63\x64\x1d\x53\xda\x7f\xcc\x41\x45\x79\x94\x32\x34\xb5\xb4\x0b\xa0\xde\x3a\xf6\x97\x3b\xa1\xba\xca\x72\xca\x23\x50\x08\x59\xb4\x5e\xeb\x43\x56\x34\xa0\x6f\xcf\x15\x16\x7d\x43\xa7\x32\x43\x79\x64\x42\x0c\x9c\x7c\xeb\xa3\x03\x22\xb7\x90\xae\xf1\x9d\xc5\x32\x26\x96\xcb\xc9\x26\x7b\x3e\x0d\xb9\x8f\xbf\x64\x6c\x64\xe2\x10\x1f\x6d\xaf\xc7\x12\x0b\x3d\x66\x83\xc4\x3c\x51\x56\x6a\x2e\xab\x77\x58\x31\x78\x73\xb9\x42\x48\x0e\xd6\x75\x9e\xe8\x40\x77\x4a\xfb\xa3\x58\x60\xdb\x84\x49\xc7\xfa\x77\xd6\xa8\x57\xa7\x96\x39\x79\xa0\x44\x4b\xf4\x89\x5a\x23\xde\x3e\xf0\xfc\x13\x70\x90\x98\xfd\x5a\xbe\x66\x05\xd4\xb0\x2c\xcb\xb7\x7e\xfb\xe0\xa9\x63\x59\xc5\x85\xe1\xf0\x73\xb5\xdd\xad\x9f\x1e\xfb\xc6\x14\x57\x1e\x2c\xf1\xfd\x94\x50\x65\x6e\xa4\x75\x81\x03\x9e\x46\x16\x96\xb5\xda\x7e\xef\x4e\x0b\x41\x10\x76\xec\x53\x43\x4b\xf7\x8b\x0d\xd2\x2f\xb2\x3c\x35\x52\xf8\x88\xb2\x28\x36\x15\xbc\x5f\x97\x27\x52\x2e\xa8\x42\xeb\xd5\x41\x06\x3b\x6d\xe9\xf9\x77\x24\xb8\x52\x8e\xd1\x7a\xdb\x6e\x5e\xe7\x2b\x62\xca\xd6\x5c\xb2\x62\xf4\xef\x16\x21\x86\xa7\xec\x5e\xa3\x0a\x00\xe3\x33\x50\x68\x3b\x3e\x07\x56\x32\xd7\xc4\x4a\x6f\x1f\x7a\x23\xf8\x17\x40\x37\xe3\x34\x37\x89\x8b\x65\xaf\x8a\xd6\x16\x1b\xa8\xf2\x53\xae\xa5\x25\xc4\x68\x97\xe7\xb2\x59\x16\x23\x52\x4d\xca\x41\x03\xc2\x49\x6e\x17\x77\xff\x7c\x1a\x7b\x8a\x9f\xfc\xb5\x07\xa6\x01\x4d\x11\x99\x59\x67\x2f\x45\x6b\x94\xde\x66\xe2\x58\x16\x7a\x5e\x86\x7a\xca\x9a\xe4\x0b\x9e\x47\x6f\x31\x0d\xa4\xc5\x05\xbd\xd8\x0a\x41\x74\xea\x33\xad\x3b\xb5\xaf\xf1\xfe\x9e\x06\x0a\x30\x10\xe0\x51\xde\xc3\x4a\x09\x9a\x06\x26\x22\x6e\xe2\xad\x9d\x34\xd9\xf8\x13\xa7\xa4\xfd\x9f\xbd\x1c\x86\x99\xb3\x09\x8d\x0e\x4d\x91\xc5\xa8\xfb\xac\xc3\x39\xe4\x97\xc3\xfe\x45\xa7\x94\xc4\x69\x17\xe1\xb2\x9a\xcb\xb3\x66\x6e\x4a\x65\x42\x86\xd4\x09\x4b\xef\x86\xfd\x31\x3c\x9b\xd2\x6c\x20\x9d\x7b\x2b\xb2\xfc\x72\x57\x01\x6c\xca\xac\x5b\xd4\x53\x46\x0c\xda\xc5\x39\x98\x86\x4c\x9e\x8e\x45\x01\xd8\x5a\x88\xb2\x82\x2b\x35\x84\xc9\xc7\x64\x3a\x08\x92\x3e\x64\x74\x8b\xe1\xc1\xe3\xdf\xee\x56\xf3\x6b\x5e\x1a\xb2\x00\x2b\x27\x1a\x10\xc7\x4e\x3f\xdd\xdf\x73\x98\x10\xea\x70\x00\x8b\xac\xba\xf5\x5c\x41\x68\x71\x96\x97\xe1\x2b\x08\xb9\xfd\x82\xff\xb8\xcf\x8a\xb7\xa1\x93\x95\x86\x42\x22\x6a\xda\x1b\x95\x37\x8d\x9a\x11\x5f\xa7\x69\xa8\x2c\xbc\xc7\x61\x0e\x4a\x75\x3e\x7e\x56\x9d\x43\xd3\x88\x5b\xdc\x55\x7b\x07\x7b\xeb\xd1\x32\x3a\xbc\x9f\xc8\x58\x72\xbc\xe2\x7c\xf4\x95\xc5\xfd\x42\x98\xc6\x09\x20\x3c\x3b\xab\x9f\x72\x0d\xd5\xe7\x72\x03\x34\x8d\x85\x25\xcb\x1f\x48\xa4\x6d\xa0\xaa\xcb\x2b\x8d\xb4\xc9\x1d\x26\x60\x23\x52\xef\x48\x5e\x62\x83\x95\xfd\x8b\xe5\x91\x15\xc8\xfd\x77\x79\x99\x83\x90\xa4\x5c\xd9\xd4\xe8\x0b\x34\xb7\x65\x01\xdb\x81\x56\xcd\x9c\x69\x9c\x72\xb0\x75\xca\xdf\x44\x21\x2c\xc1\xf6\x08\x9c\x3e\xff\x68\x69\x60\x13\x60\x15\x86\x39\x9d\x34\x58\x59\x2d\xf3\x0c\x3e\x21\xb4\xa4\x69\x2a\x34\x5a\x2e\x1b\x71\x3a\xd7\xaf\x62\xf4\xa5\x05\x65\x88\x2d\x18\x33\x3a\xf8\xb5\x3c\x15\x34\x81\x51\x65\xf1\x38\x06\x99\x0a\x6e\xeb\x27\x9e\x6f\xd6\x8b\xfd\x62\xbb\xb9\x5f\xfc\xd5\x73\x45\xd2\x54\x12\xe5\x91\x8a\x9e\x2f\xa6\x6b\x8a\x52\x14\x22\x37\x22\xcf\xa5\x98\xe6\x53\x52\xc9\x0d\x82\x6d\x2e\x50\xcf\xe4\xd7\x52\xd9\xda\xe2\xa3\xa8\x85\xe5\xfc\xf0\x67\x57\x41\x1a\xb9\xa0\xe0\xbd\x13\x88\x11\x7a\xa2\xe5\x44\x53\xa5\x14\x5a\xc5\xef\x3e\xba\xb1\x81\x6a\xcc\x85\x48\x53\xa5\xd3\xc8\xd1\x44\x1d\x0a\xf8\x68\x0e\x59\x03\xc7\x43\x56\xb4\xa3\xa3\x81\x83\xa9\xca\x23\xfe\x34\x1f\x18\x4d\x15\x10\x69\xf5\x3f\xf3\xaf\x46\x6c\xbb\xd2\x3a\x5d\xee\x7d\x36\x75\x3c\x52\x4d\x04\xf3\x9c\x4b\x5b\x00\x1c\x76\x97\x6f\xe7\x3e\xce\xda\xf6\xe0\x23\xba\xff\xab\x78\x48\xaa\x19\x0b\x3b\x3e\xd0\x01\xfa\x3a\xd5\x91\x09\xcc\x48\x19\x4d\x0f\x09\xf9\x7c\x2f\x11\xe0\x62\x6e\x69\x9d\xec\x18\x9a\x47\x13\x75\x07\xd8\x8a\xd1\xb2\xc8\x2f\x08\x67\xa9\x1e\x7a\x30\x63\x0a\x42\xe1\xda\x73\x42\x40\xcb\xa0\x54\x9b\xa6\x86\xc5\xe8\x32\x62\x56\xf8\xb0\x5f\xaf\xb6\x07\x7a\xb8\x5f\x3f\x78\x46\x37\x9a\x9a\x48\x22\x9a\xf1\x36\x13\x4d\x79\x74\x8c\x68\xf3\x6f\x56\x90\xd8\x84\x96\x29\xd1\x59\x70\xa3\xef\x23\x28\x11\x03\x65\x29\xa8\xd6\xc5\x7b\x36\xd4\xbc\x1e\x9f\x8c\xaa\x48\x07\x63\xcd\x84\x71\x34\x5a\x50\xa3\x85\x5d\xe8\x51\x36\x17\x2b\x50\x5d\x42\x73\x16\xf8\x20\x58\x0c\x18\x0d\x83\x76\x0f\xb5\xde\x57\xbf\x24\x0a\xc6\x63\x9f\x29\x40\x4a\x05\x57\x87\x22\x26\x02\x9a\x54\x30\x61\xcb\xe7\xef\x17\xf7\x36\x11\x3f\xb9\xaf\x90\x72\xcc\x33\xca\xf3\xc5\x47\xc9\xd7\xc5\xe6\xcf\x7b\xe7\xfa\x8f\x57\x0c\x11\x46\x16\x97\x20\xb4\x9e\xcb\x6b\x5c\xad\xed\x22\xa2\x44\x39\xf8\x05\xc6\xd1\xf6\x25\x96\x0d\xce\xbf\xc5\x88\xda\x4a\x9e\xbb\xa7\xed\xa1\xf7\x14\x44\x14\xda\xba\xc7\x5b\x50\x22\xcf\x8a\x8f\x41\xb8\x40\x44\x91\xb4\x92\x3d\xbf\xc5\x09\x0b\x4c\x3b\xd2\x09\x2a\x22\xae\x6d\x9d\x35\x3a\x81\x07\x85\x4b\xe1\xe1\x38\x17\x92\x13\xb1\x14\xc6\x7a\x9f\xc8\x6a\x2d\xea\x4e\x5f\x84\x8a\x84\x48\xf4\xb3\x17\x39\x88\xe1\xb5\x13\x01\x8e\x44\x1d\x89\x4e\x87\xca\x4d\xbe\x87\xb6\x45\xa1\xee\x9d\x77\xc6\x40\x57\x52\xd3\xbb\xda\x22\x81\x10\xa3\x2b\x50\xd6\x37\xb8\x94\x3e\x19\xdf\xc4\x03\x46\xd3\x41\xb5\x88\xcf\x55\xf5\x72\xe4\x54\xf0\x88\xe3\x80\xb8\x83\x4a\x0d\x6f\x92\xa7\x80\xf1\xc0\x47\xf8\x68\x6e\x84\xbc\xac\x3f\xc1\x5b\x0b\x2e\xa5\x5f\x39\x07\xe8\xd9\xb5\xae\xbf\x2a\x0d\xa5\x82\xeb\x10\x17\xa8\xc5\xed\xcf\xc3\x40\xda\xa9\xbb\x3c\x24\x58\x0f\x77\xf2\xa7\x6c\xe0\xe6\x7c\xc1\x75\xdd\xf5\x48\xa9\xad\xe9\x54\x15\xe8\xcc\x6f\x23\x13\xb2\x70\x2a\x52\x6d\x89\x83\x6b\x68\x6c\x74\x0a\x47\xfd\x64\xac\x8b\x34\xc2\x78\xdb\xb3\xab\x36\xca\xf3\xc5\x0b\x14\x56\x1d\xa4\xac\xe6\xf9\x46\xa9\x10\xc0\x30\x4b\x70\x5f\xbe\xb4\xab\xdf\xbe\xb4\x70\xbf\xd9\x81\xcd\x07\x76\xa7\x10\x26\xd5\x8e\xd0\xae\xaf\x2a\x9f\xc8\x6f\x8c\x2f\x25\x63\x61\xa9\x78\xe1\xf7\x16\x4e\x65\x6b\x5f\x3a\x8a\xc1\xe9\x92\x69\x67\xdf\xff\xb1\x7f\xcd\x39\xa0\x42\x8a\xd8\x69\x64\x64\x79\xde\x53\x8c\xf8\x56\x63\xb8\xe7\xe6\xc4\xec\xe8\xe1\x3d\xfa\x2e\xea\xd7\x83\xbb\x29\xdf\x4f\x25\x11\x86\x96\x8e\xa2\x51\xaf\x50\x8f\xb6\x40\xa1\x20\x4c\xdd\x98\x6b\x87\x0e\x96\x64\xd8\xd5\xf8\xcb\x50\xb2\x00\x61\x13\xd7\xed\x75\x5b\x9f\x1f\x91\xbd\xeb\x02\xc9\x39\xba\x45\xc7\x44\x1c\xf7\x4e\x89\xf2\x6f\x5f\x70\x69\xf8\xfe\x82\x22\x3c\x0f\x81\xcd\xb8\x21\xcf\x78\x8e\x92\x50\x2b\xc8\x52\x43\x73\xe7\x8d\x87\xd1\xfb\x97\xa8\xc9\xd2\xce\xb1\x3c\x7b\x41\x0c\xd9\xec\x33\x48\x22\x34\x4e\x45\x74\x28\x70\x3d\x3f\xab\x66\x5d\x8f\x3c\x7d\x49\xb9\xa5\xd1\x01\xdd\xda\x90\xbf\x20\xbb\x75\xc0\x37\x8f\x05\x93\x2c\x90\x71\x38\xc4\xb8\x3c\x17\x75\x99\xeb\x91\xb7\x24\x99\x62\x68\x83\x89\xe2\x52\x16\xb0\x2a\x74\xbf\xf0\xc9\x90\x11\x1f\xe3\xde\xe4\xa2\x80\xc6\x61\xae\x67\x51\x08\x32\x8c\x2c\x39\xcc\x6a\xbb\x5a\xdd\xac\xb6\xdb\xbf\xba\xd3\xc4\x94\xd9\xfa\x2a\x51\xc1\xdf\xd6\x8b\x4d\x3f\xef\x70\x54\xc8\x50\x46\x48\x13\x5c\x9e\xa0\xf0\xe4\xc2\x7f\x0c\x78\x04\xa6\x38\xd6\x51\xd4\x0c\xfb\x4d\xee\x59\xdb\xe5\xc1\x46\xc8\xb7\x70\x14\x98\xab\xdf\x81\xe8\x3c\x74\x19\xd1\x08\x77\x30\x09\x2f\x59\xf1\x50\x5e\xd7\x0c\xca\x48\x52\x34\x19\xdb\x29\x08\x7a\xb8\xb8\xee\x72\x51\xbf\xba\x29\xe9\x3a\xc7\x91\x48\x9d\x5b\x8e\xe5\x61\xd6\x8a\x1c\x3d\x65\xcc\x03\x1d\x5b\x17\xd0\x95\x03\x4d\xb6\x0b\x19\xa7\x16\xa0\xb5\x81\x66\xb0\xd8\xca\xd8\xa4\x88\xaa\x7b\xfe\xf3\x76\x68\x4c\xcb\x84\x92\xd0\x69\xcc\xb6\x93\xc9\x97\x1d\x5c\xe3\x60\x64\xc2\x42\x34\x0b\x45\x6b\xc5\xd7\x3d\x20\x5e\xf2\x48\xa0\x93\xa1\x7c\x18\xa2\x27\x00\xa0\x92\xab\x80\x77\x3c\x87\xe7\x13\x54\xd7\x76\x9a\x4c\x79\x4c\x7a\x5a\xc5\xa5\xa8\xb4\xc5\x80\xcf\xe7\x5d\xbc\x1d\x24\x05\x8b\xf1\x5d\xe0\xac\x1b\x16\x4b\x4a\x11\x4a\x34\x2d\xb7\x8b\xc7\x6f\xab\xd5\xe3\xed\x21\xea\x5a\xe2\xc8\x0a\x1f\xe5\xd0\xa3\x06\xc7\x77\x23\x04\xd7\x96\x9c\x3e\xc3\xa0\xcc\x52\x34\xf0\x52\x56\x93\x0c\xbd\x14\x46\xd2\x61\xe1\xc9\x43\xfe\x09\x9e\x44\x4a\xaa\xb0\xf2\xbc\x9d\x6c\xf3\x7e\xa6\x94\x92\x63\x0a\xf9\xf8\x82\x0c\x73\x93\xdd\x03\x4b\xf9\xd0\xe3\x59\xad\x0f\x9b\xd5\xf6\xf0\xbc\xf3\x35\x8d\x52\xf1\x04\x45\x5f\x16\xff\xf4\x15\x1b\x7f\xcb\x29\x30\x7f\x0b\x2a\x65\x38\xde\x1d\x7e\xd9\x9f\x5f\xf3\x18\x3f\xee\xc3\xe6\xaf\xed\x48\x65\x72\x72\x38\xa4\x51\xe0\xdc\x26\x5c\x00\xd7\xc5\xa2\xb8\x6c\x5c\x79\xeb\x35\x02\x4b\x1a\xa2\x91\x93\xee\x6e\xb1\xdc\x3f\x6d\x0f\xd4\x5f\xcf\x24\x09\xaa\x04\xb7\xe3\x05\xd7\xb7\xb2\xe3\x8c\xb8\xcd\x6a\x1b\xc9\xf2\x5d\x53\x40\x87\x69\x61\xaa\x4c\x59\xee\x87\xe1\xc8\x36\xc2\x06\xbf\x7b\xfa\x66\xfb\x00\xed\x39\xee\xce\x85\xae\x44\x56\x5f\x2d\xd4\x46\x2b\xf4\xe1\xb6\x4f\xbe\x0e\x49\x05\x2a\xe2\x4e\xf1\xff\x16\x8a\xcb\xa6\x82\x63\x76\x1e\xf8\x4e\xdd\xae\xab\x02\xc3\x31\x87\x8e\xf1\xe5\x3b\xa1\x40\x96\xe5\x5b\x77\x1a\x23\x2d\xaf\x96\x0d\x70\x7c\xbd\x57\x29\x02\x92\xbb\xd7\xb9\x50\xcd\xd9\xca\xd0\xfb\x53\x51\x4a\x30\x3e\x97\x67\xef\x70\x02\xa7\xb6\xdd\x35\xc6\xb6\x26\xcb\x9a\x8b\x7d\x82\x5a\x51\xb0\x08\x9e\xac\x40\x50\xec\xfc\x48\x54\x2c\x62\x91\xa5\xd9\xaf\xde\xa0\x19\xa5\x27\xbe\x72\x9d\x14\xd3\x80\xdf\x2d\xcf\x6a\xa7\x79\x36\xde\x4d\x54\x18\x52\x9c\xad\xb8\x08\xf0\x64\xb0\x36\xa9\x30\xb6\x3a\xfc\x56\x9c\xce\xe9\x3e\x74\x94\x8e\xe3\x2f\xa4\xc2\x34\x60\xba\x63\xc1\xb6\xcc\xfc\x13\x98\x81\x8a\x48\xa8\xdd\x42\xfa\xbf\xa5\x74\x05\x25\xeb\xcd\xdd\x0e\xeb\x0e\xc7\xe7\x8b\x63\x81\xd5\xc4\x8f\xe5\x11\x0e\xef\x59\xa1\x5a\x5f\xaa\x7b\xd5\xb1\xa1\xa9\xe5\xbb\x15\x3a\xcf\x0a\x20\x34\xe8\x9b\x18\xba\x83\xe0\xe6\xdd\xba\xde\x9e\x51\xfc\xd3\x77\x48\x48\x2c\xe3\x41\x52\xa2\x5e\x28\x35\x5e\x6b\x54\xa2\x01\x13\xad\x87\xad\x38\xc2\xb0\x2a\x50\xf1\x98\xe2\x76\x96\x21\x82\xc7\xda\x2a\x5d\x5b\x6a\x6b\xf4\xb7\xab\xbb\xd5\x76\xbb\xb8\xb7\x60\xe4\x03\x22\x44\x7c\xa5\x8e\x4a\x63\x86\xb3\xe3\xf0\x02\xcd\xaa\x79\x7d\xae\x87\xe4\x62\x54\xa5\xa9\x95\xed\x70\x89\xd0\x1f\x70\x99\x6c\xda\x4a\x44\x11\xb7\x03\xe9\x57\x99\x69\x17\x1a\x9a\x22\x7b\x94\x48\x63\x2b\x9c\x5b\xee\xb3\x1c\xd6\x58\x48\x6c\x93\xea\xdd\xd7\x10\x10\xa0\xcc\x48\xeb\x4f\x6f\xca\x32\xef\x89\xf4\xa8\x92\x61\x0c\xc1\x0c\x22\xbc\x4f\x41\x29\x19\xdb\x04\xe8\xc3\xe2\xcf\x91\x2a\x2b\x55\x32\xf5\xb5\x36\xcd\x46\x58\x26\x9f\x47\x71\x35\x60\x54\x40\x02\x87\x94\xb4\xdb\xed\x5d\x59\x5d\xd1\x99\x51\xa5\x62\x81\x40\x83\x63\xa9\x33\x73\x69\xf7\xc2\xa5\xb8\x82\xa3\xf9\xbe\x40\x90\x72\xfa\x30\xa0\x66\x9b\x45\x74\x28\x1d\xd8\xe2\x35\x3d\x47\x10\xdd\x36\x4b\x1c\xcc\xf8\xf8\xd6\xc6\x18\xd2\x6e\x51\xa5\x19\x41\x74\xef\x52\xd4\xaf\xc7\xb2\x80\xcb\x68\xae\xeb\x84\x86\x1d\xad\xa0\x4f\x49\xe0\x9c\x19\xcf\x07\x48\xa9\x72\x58\x89\xbb\xf5\x76\xb7\x3f\xec\xf6\xab\xcd\xe1\xe1\xf9\x7e\xbf\xde\xdc\xaf\x57\xdb\x51\x32\x5d\x81\xe0\x48\xfc\x21\xb3\xaa\x79\xfd\x63\x60\xdc\x2b\x00\x0a\x2e\x44\xf5\x90\x61\x5a\x61\x7c\xb7\x46\x42\x3a\x60\xff\x9a\xdd\x5f\x75\x10\x09\x8c\x1e\xac\xf5\xbe\x5c\x58\x6b\x71\xf4\xce\x74\x10\xa9\x78\x28\x14\xff\xe7\x66\x31\xef\xb4\x68\x92\xa4\x58\xd0\xbf\xdb\xac\x96\xeb\xc5\xfd\x7a\xb7\x3f\xec\xbf\x6f\x57\x3e\x0d\xad\x89\x00\xac\xe3\xd8\xc2\x49\x64\xd5\x12\xe3\x15\xf3\xae\x96\xa6\x60\xe5\x07\xeb\xb3\xdc\x09\xf3\xc9\xea\xa8\xa9\x91\xa9\xe9\x82\x83\x9d\x51\x78\xbd\x4c\x69\xc6\x94\xb6\xa1\xdf\x2d\x66\xa4\xa6\x05\x64\x9a\x25\x14\xe7\xa7\x3c\x57\xc5\xee\x3a\x3a\xa2\x99\x4c\x7c\x26\x62\xb3\xb6\x45\xc1\x34\xf5\x0f\x16\x85\x01\x6a\x47\x1e\xd0\x8e\x59\x7d\x34\x95\xf0\xe6\x60\xdd\xf5\x31\x90\xda\x30\xd1\x3b\x88\x7c\x29\x8e\x27\x91\xbd\x5c\x55\x26\xba\xce\x31\x37\xb8\x62\x76\xcc\x29\x00\x8f\x5d\x31\x9a\x8e\x53\x86\x44\xe5\x03\x3c\x48\xf5\x3e\xc9\x07\x73\xdf\x17\x40\xf6\xf9\x6d\x64\x01\xb8\x85\x5c\x4c\xcc\x27\x9d\xd0\x38\x1d\xc8\xfc\x8a\x23\x26\x17\xea\xd9\x53\x26\x69\x8c\x45\xfb\xce\xc0\x7c\xcc\x14\x7c\x3b\x5f\xd6\xda\x57\x8d\x69\x1e\x84\x38\xee\x6e\x45\xa1\x2f\xdd\x8f\x82\x49\xed\x06\x63\xeb\x04\x9f\x8b\xac\xb9\x6c\xe1\x74\x6e\xc4\xb5\xa1\xae\x39\x00\x44\x03\xa2\xaa\x1d\x34\x8f\xa5\x25\x48\x68\xc7\xf9\x63\xe9\xc4\x82\x5d\x77\x41\x6c\xdc\x03\xa5\x86\x45\xd5\x78\xe8\xfd\xfc\xdb\x15\xcc\x80\x55\xc2\x45\x79\xfd\x65\x79\x3c\x95\xc5\x1c\x37\xed\xf8\x9e\x44\x94\x28\x37\xda\xf6\xaf\xb0\x6b\x2c\xb6\x77\xb0\xa9\x6a\x91\x84\xb8\x3c\x88\x63\xbf\xd1\x6b\x91\xf0\xd0\x0e\xbd\x8e\x99\x1e\x83\x0d\x93\x27\x16\x60\x09\x50\x8e\xe2\xc3\xae\x8b\xbd\x7b\xa7\x25\xb7\x10\x68\x5b\x2e\xb8\x5c\xad\x7f\xae\x6e\xd1\xf2\xdc\xac\xb6\xeb\xa7\xdb\xae\x9b\x4a\x70\x23\x7a\x5c\x2d\x37\xc3\x85\x49\x4b\xb0\xd1\xce\x6f\xa5\xc8\x1d\x01\x90\xe7\xa9\xfa\xd2\x9d\xd6\x2a\x08\xad\x7d\x6e\xa5\xea\x7c\x7d\xd3\xe2\x1d\xaa\xeb\x29\xa2\xa8\xf0\xe4\x31\xc7\xfa\xe5\x54\xa9\x69\xcc\x5d\xab\x14\x38\x46\xec\xcf\x05\xba\xa7\x77\xd9\xfb\x7f\x09\xb7\xd0\x4a\x06\xa4\xa7\xf0\x70\xa9\x9f\xfa\x8f\x09\xdb\x68\x9f\x43\xd6\x20\x08\x73\xb4\x3d\xd9\xa0\xd6\xf5\xc1\x6e\x4c\x7f\x74\xbd\x14\x71\x4b\xf1\xfe\x35\xab\xf4\x30\x44\x3a\xb9\x79\xc3\x82\x98\x7b\x5f\x05\x37\xe8\x49\x7b\x44\xf1\x5d\xdd\x67\x2f\xc7\x51\x86\x04\x82\x44\x20\x0d\xed\x6b\xf9\xfb\x41\x14\x17\x5b\xc0\xb2\x2f\x7f\x64\x79\x3e\xc9\x00\x01\xa1\x9d\xee\xf2\xee\x04\xea\xff\xcf\xda\x9f\x75\x37\x8a\x64\xfb\xc3\xf0\x77\x39\x57\x75\xd1\x17\x40\x0c\xc0\xff\x4e\x96\xe4\x4c\x75\x79\x6a\x4b\xce\xac\x3a\xbd\x7a\x69\xc5\xb0\xc3\xa6\x8d\x40\x0d\xc8\x43\x7f\xfa\x77\xb1\x23\x82\x49\xc8\x59\x67\xbd\xcf\x4d\x67\xb5\x09\x21\x04\x41\xc4\x1e\x7e\x43\x26\xf2\x71\x63\x7e\xf0\x1e\x42\x08\x3a\xea\xdf\x59\x07\x26\xb1\xaf\xc5\x68\xbf\x81\x88\xdb\x81\xcb\xc7\xfb\x9f\xab\xfd\xcf\xc5\x8f\x75\x38\x22\x4c\x01\x09\xc0\x6a\x80\xdf\xed\xd6\x8f\xd7\x8b\xa5\x5f\xb1\x81\x12\x81\xab\x9e\x3e\x1d\x0e\x9f\xfd\x1f\x25\x2e\x95\x0e\x6d\xdd\x2e\x51\xc7\xb2\x6a\xce\xd1\x9a\xf3\x8f\x12\x28\x4b\xa5\x93\x47\xb8\x76\x9a\x4a\x93\xd5\x18\x28\xb3\x19\xe3\xf3\x09\x95\x03\x1b\x91\x5f\x81\x28\xee\xcd\x64\x18\xa3\xb6\xad\x8e\xb6\xfe\x0f\xe2\x53\x0c\x2b\x35\x33\x02\x36\xc0\x18\xc1\x7a\x4d\x83\x2c\x00\x07\x4d\x9b\x9c\x93\x53\xa6\x07\x98\xf8\x36\xf4\x70\x02\x14\xc3\x88\x0d\x58\x1a\xe0\x5d\x30\x59\x7e\xe8\xfe\xa6\x39\x22\x93\xd4\xfe\xd8\x0e\x7d\xcc\x5c\xc7\x7b\x54\x57\x00\x06\xcc\xd7\x15\x7a\x8d\xf4\xd1\x65\xf2\x88\x60\xd5\x6b\xef\x05\x89\x46\xfb\x3a\xc4\x41\x80\xab\xdd\xed\xb7\x25\xae\xd4\xc3\xb9\x16\x87\x31\xa6\x15\x16\x4e\x73\x33\x42\x7f\x4f\x9e\x43\xac\x18\x1a\xf7\x5d\x75\x9f\x05\x85\x22\x87\x4d\x06\xd5\xd4\x90\x3a\x82\xd8\x24\xd8\x13\xf7\xda\x7c\x37\x28\x72\x75\xe1\xdc\x29\xb5\x6f\x7a\xed\x99\xee\xeb\xe2\x39\x2b\x00\x2a\xd7\x8b\xfb\x7a\x86\xa4\x69\xe8\x8c\x9d\xf2\x7c\xab\x7a\xc8\x3c\xa4\x69\xec\x1d\x57\x2c\x57\x63\x87\xf0\x5e\x7f\x58\x46\x04\x51\xd1\xf7\xce\x59\x0d\xb7\xbb\x1d\xd4\x83\x01\x0c\x0b\x6d\xed\x26\x34\x00\x8c\x81\x64\x40\x5d\xf8\x2d\x34\x72\x0c\xc6\xab\x33\x28\x92\xa2\xd1\xc6\xa1\x68\x8e\xb7\x1e\x2d\x3d\xf4\xf4\x8e\x40\xc5\x02\x4b\x37\x7b\x38\x64\xcd\x4a\x7c\x22\xaa\xca\xf2\x4a\xf4\x97\xf6\x25\x11\xa8\xf6\x07\x5b\x88\x70\x5e\x36\xfd\x34\x1f\x6f\x40\xa0\x89\x85\x62\x5b\xc3\xe3\x32\x3f\xaf\xc8\x8c\x4f\x6b\xe2\x44\xf5\xf2\x2c\xfb\x5a\x55\x99\x9c\xfe\x30\x93\x68\x4c\xf6\x8e\x15\xbc\x65\xe5\xa9\xee\xcc\xcf\xfb\x86\x83\x09\x68\x84\x8c\x3e\x78\x7b\xec\xbd\x76\xe7\x1f\xbc\x09\x98\xc1\x0a\x9b\xd3\x52\x58\x78\x5a\xec\xa5\xe1\xb1\x0e\x9c\x89\xb6\x0d\xcc\xee\xd6\xbb\x79\x2d\x5d\xbf\x9a\x99\x90\x2b\x14\xf6\xc1\x12\xef\x03\x1c\xfd\x43\x34\x51\x18\x75\x9d\x2e\x68\x16\x55\xd5\x1d\x20\xdc\x6f\x4c\xdb\x93\xdc\x95\xa7\x0a\x0b\xf7\x08\x34\x9b\x7a\x1a\x44\x26\x4a\xac\xab\x18\x9e\x7f\x86\xfa\x6c\x22\x29\xb1\x51\x82\xb0\xf3\x4d\x61\xca\x1b\x5b\x99\x9a\x0c\xa3\x81\x25\x59\xd8\x1d\x6b\xe4\x83\x3b\x8f\x86\xec\x4b\x17\x86\x72\x62\x7f\xa3\xd5\x67\x1d\xa7\xfa\x03\xb1\xaf\xf1\x37\xb2\xc4\x28\x1b\x62\x36\x55\x06\x6f\xd0\x05\xc4\xe8\x83\xf9\x50\xd6\xcd\x80\x7e\x62\x18\x88\xa8\x8d\xd6\x9f\x64\xf6\xd8\x43\x01\xfc\x51\x4e\x62\x14\x55\x1d\x49\x66\xfd\x0a\x50\x37\x3f\x0f\x0d\xa7\x24\xf1\x22\x64\xd7\xf7\x33\x7a\x08\x26\x8e\x14\x5e\x8b\x9d\xa9\x23\x29\x22\x13\x47\x40\xd2\xee\xe9\xb9\xe6\x89\x57\x2c\x19\x7f\x51\x4c\x63\xc4\xc1\xad\x16\xbb\xf5\x9e\x84\xfb\xd5\x7a\xb9\x8f\x82\x30\xf1\x3f\x2a\xe6\xca\x6e\x67\x99\xde\xb5\x91\xdf\x43\x7b\x8e\x76\xa2\x4f\x31\x7c\x5f\x2e\x4f\x26\x96\xd4\x07\x0d\xcb\xe5\xf7\x2e\x19\x18\x2e\xe1\x26\x89\xd2\x40\x75\x14\x9b\x5b\xa1\x5e\xb2\xa2\xbb\xf5\x49\xca\x85\xe9\x34\xa5\xdb\x3b\xbb\xd1\x57\x9f\xbb\xc5\x3d\xe6\xcb\x73\xf5\x74\x93\x68\x9b\xe3\x3e\x96\xea\x75\x50\x98\x30\x89\x96\x58\x21\xc3\x5c\xd5\xc6\x37\x3d\x17\xd7\x24\x10\x60\x38\xe1\xb5\x0b\x37\xaa\x5c\xf5\x95\x2b\x23\x14\x41\xbc\x09\xc6\xa4\xf6\x5b\xa1\xfe\xad\x9b\x8c\x83\xff\x99\x64\xca\x46\x06\x09\x36\xd0\x5e\x44\x8d\x0d\x1f\xd0\x8f\xa5\x2c\xb1\x1f\x58\x4f\xc9\xc7\x46\xb2\x04\x1b\x86\x8b\x53\x53\x1e\x44\x03\xba\xab\x8d\xfa\x01\x90\x68\x57\xd3\xdb\x8a\xb7\x5e\x7b\x65\x7c\xdb\x75\x42\xd1\xcf\xdb\xaa\x42\xf5\x8d\xb4\xc9\x30\x20\x96\x48\x86\x49\xbc\xc5\x64\x88\xcc\x57\x38\x0c\x30\x61\x5c\xeb\x67\xb3\xbc\x5f\x37\x2f\x73\x4b\x00\x18\x89\xc5\x57\xa1\xf5\x5e\x8c\x1d\x34\x26\xaf\x9c\xe1\x10\xb9\xa5\x65\x08\x95\x9a\x2c\x05\x06\x28\x75\xe5\xc3\xf5\xc7\x11\x85\x35\x7f\xdd\x21\x23\x41\x10\x5b\x1e\xb2\x83\x64\x8c\x56\x8f\x90\x45\x6e\x54\x18\xb1\x20\xf6\x9d\xf6\x83\x84\x0a\xb1\x74\xc5\xc4\x41\x9c\x04\x21\x57\x7c\x60\x60\xba\xbf\x7e\xba\x5b\xed\x1d\x43\x93\x04\x28\xb1\xd3\xee\x5e\x05\x7c\x34\xd8\x83\x0b\xeb\x76\x17\xeb\x23\x94\xb9\x77\x81\x04\x11\xb7\x9e\xd4\x42\x77\x1a\x43\xf3\x3f\x26\x8a\x13\x2c\x2d\x49\x8c\x08\x14\x9c\x59\x54\xcf\xbe\x6c\x24\x88\x40\x41\xe0\x53\xbb\xf2\xb8\x9a\xfa\x28\x93\x80\xa4\x1a\xab\x36\x6d\x76\xb4\xbb\xdf\x2d\x6e\x46\x75\x29\x12\x30\x65\x10\x5e\xf9\x0e\xd9\xae\xec\xd8\x47\x24\xe0\x0e\xa2\x80\xf2\x7d\xf8\xd8\x36\x7a\x72\xcf\xb8\x33\x82\x78\x78\x5c\xdf\x6e\xee\xd6\x8f\xfb\xe5\xf7\xc5\xdd\xb7\xf5\xea\x4b\x88\x15\x09\x62\x92\xe0\x7b\xf5\x3b\xb4\xd3\xef\x7b\x79\x80\xa3\x38\xef\x04\xb8\xc1\x09\x28\x4b\x68\x2e\xb3\x42\x14\x1f\xfe\xea\x12\x43\x23\x57\x58\xb5\x11\x94\x3f\x90\x86\xd2\xe1\xb7\xda\x95\x65\x44\xeb\xf4\x6f\x69\xd4\xab\x51\xc5\xff\x1a\xf3\x48\xff\x19\xfd\xcb\x9f\x27\x95\x56\x9c\xe2\x05\x96\x9f\xb2\x3f\xbf\xa0\x09\xa2\xff\x9c\xf6\xcc\xd8\xac\xf2\xab\x85\x9e\x04\x42\x44\x38\x15\x4d\x55\xfe\x17\x0a\x97\x91\xb4\xab\xd5\xd5\xe7\x90\xa8\x77\xe9\xd3\x60\xcd\xc9\xb5\x6d\x2c\x2c\x0e\x52\xd4\xb5\xd0\x65\xf5\xd0\xa3\xa9\xda\x51\x31\x42\xfc\x84\x46\x8c\xd1\x95\x68\x9a\x1c\x2e\x3b\xfc\x92\x40\x11\x03\xac\x5b\x03\x6b\x98\x3c\x62\x45\xed\xfc\x92\x8e\x09\xd9\xed\x81\x24\x50\x82\x0e\x76\x25\x84\x5d\x62\xdc\xf7\x50\x81\x45\x7f\x4f\x59\x2d\xe3\x5b\x3d\x2b\xea\x4f\x02\x25\xad\x16\xaa\xbd\xbd\x6b\x9d\x9d\x69\xaa\x92\x40\xb3\xd8\x58\x2d\xa9\x0f\x79\xfa\xcc\x8a\x7f\x9c\x44\xd1\x74\x80\x15\x12\x18\x1a\xda\x82\x40\x59\x1d\x5f\x46\xd7\x6c\x52\x86\x5e\x52\x1f\x9e\x6c\x4c\x02\x23\x6d\xd1\xb2\x86\x66\xbd\xfb\xfe\xd8\xe6\x8a\xc3\xfa\x43\xbf\x0f\xb7\x43\x29\x4e\xdc\xe3\xa9\x19\x38\x73\x91\xc0\x68\x82\x02\xed\xb7\xb7\x03\x4f\x69\x12\x06\x91\xc1\xcb\x2c\x8f\x50\x3c\x96\x03\xaf\xba\xd1\xaf\x09\x03\x16\x21\x83\xd3\x2b\xc4\x4e\x3a\x8e\x24\x0c\xe3\xc8\x90\x91\x2c\x1b\xc2\x98\x3c\xdf\x6d\x53\x38\x9e\x91\xff\x5e\x12\x25\x18\x08\xaf\xd5\x23\xa8\x21\x23\x71\x80\x7d\x20\x21\x61\x01\x8a\x63\xd9\x0a\xc0\x94\xb2\x42\x42\xa2\x23\x64\x64\x3a\x85\xc8\x3c\x77\x0f\x75\xf2\x23\xfe\x49\xfe\x35\xfd\xcf\xe4\x9f\x61\xcc\xff\xd5\x9d\x26\xc5\x34\x0a\xbf\x7a\x57\xba\xa4\x72\x80\x86\x0e\xfd\x40\x48\x31\xb3\xac\x9b\x4a\x1d\xcf\x74\xd4\x07\xbb\x3d\x09\x69\x10\x60\x0b\xd6\x00\xd4\x57\x9f\xae\xdd\x30\xbe\x67\x94\x59\x6a\xc1\x21\xb3\x2e\x29\x3d\x1a\x9d\x84\x54\x12\xec\xe3\x23\x0f\xfa\x16\x90\xf9\x3f\x2e\x57\xb4\x63\x2c\xf7\x73\x71\x7a\x80\x26\xc3\xb7\x74\x38\x91\x42\xaa\x08\x52\x4d\x30\x50\x3a\x7b\x73\x2f\xfd\xff\xd9\x57\x30\x64\x89\xc4\xec\xa9\x9d\x27\x77\xd0\x98\x47\x78\x83\xe2\x04\x23\xa6\x90\x1b\xca\xe3\xc0\xeb\xd9\x6c\x6a\x8f\x95\x9f\x0c\xd1\x16\x9e\x9c\x3b\x51\xf1\x5f\xc7\x6d\x93\xcb\x89\x23\xcb\x28\x53\x22\xcf\x17\x85\xb6\xd1\xef\x3e\x98\x57\xd8\xf2\x9f\x91\x56\xcc\xd6\xc9\xe0\x8c\xdb\x69\x24\x4c\xb4\xb5\xe9\xc9\x0a\x55\x1e\xe0\x1a\xa0\x3b\x92\x32\xa3\x5c\x56\x82\xd8\x48\x39\xd2\x50\x9e\xdf\x40\xc2\x54\x9a\x50\xf4\x15\xca\x6f\x22\x6f\xb3\xa9\x7a\x32\x05\x04\x97\xde\x9c\xd0\x2b\x1d\x9f\xa1\x3d\x48\x28\xe2\xc8\x32\x33\xe3\xdf\x46\xd3\x51\xc4\x16\x0b\x81\xc5\x73\x2c\x42\x61\xf9\x64\x98\x6c\x91\x50\xa4\x1a\x71\xd0\x9d\x9d\xc5\x76\xb7\x1c\xff\x72\xc9\x8d\xe5\xf0\x66\xff\x85\x7b\x33\xc2\x0c\x92\x50\x51\xeb\x21\xb7\x13\x39\x0c\x2a\x9a\x24\x54\x8c\x49\x57\xe7\x42\xc9\xdc\x0c\x9d\x59\xbe\x50\xe0\xed\x17\xa9\x50\x31\x9b\x06\xdf\x94\xcf\x5b\x68\x30\x64\x1e\xbd\x3c\x3a\x20\xf8\xc3\xae\x4e\xf2\x3c\x18\x23\xa1\x4e\x6c\x6b\xf4\x34\xce\x4b\xcf\xd1\x53\x24\x04\x96\x08\x8b\x58\xfd\xf7\xa9\x6e\x40\x3f\x8a\xac\x43\xfb\x91\x10\xb8\x8c\x3b\xfb\xe5\xbb\xb2\xb9\x2e\xab\xd7\xae\xb4\x48\x42\x10\x56\xc4\x74\x6b\x09\x23\x8e\x9d\xa0\x43\x7f\xdc\x48\xeb\x13\x61\xe9\x4f\x4b\x2f\xe0\x9b\x75\x6f\xa0\x01\x6b\x8c\x2c\xad\x13\x96\xf5\xa9\x72\x07\xa3\x30\x20\x8c\xfb\x36\x78\x0e\xcf\x42\x97\x2b\xb0\xc9\x7b\x53\xce\x12\x3d\x09\xe6\xc7\x0e\x8a\xfd\xf7\x3f\x1f\x96\xe7\xc0\x38\x12\x85\x2a\xe6\x48\x85\xdc\xec\x9e\x16\x37\xfb\xe5\xfd\xed\xc3\xfa\x6e\xbb\xd8\x75\x10\x04\x12\x45\xc4\x84\x0e\x0c\x06\x95\xed\xe4\xbb\xf8\x63\x63\xee\x00\xf4\x85\x7a\x13\x89\xa2\x44\xa2\x0a\xcb\x7a\xef\xd0\x49\x9d\x2c\xee\xaf\x56\x97\xf1\x79\x48\xc4\xb1\x1c\x21\x73\xf1\x0a\x91\x74\x32\x0c\x4e\x81\x73\xf0\x1f\x6e\x38\x8d\xa4\x27\xb0\xdf\xaf\xd6\xb7\x23\xf4\xe5\xa8\xb4\x40\x22\x16\x52\x5b\x00\x6b\x53\x87\x5d\xb2\xfe\x63\x5b\xe6\x7a\xff\xf0\xb8\xf9\xd1\x69\xf3\x91\x88\xb1\x54\xbb\xcd\x4a\x89\xe2\x34\x0d\x28\x22\x1e\x18\x0f\x78\xc7\x48\xdc\x0a\x15\x8c\xe2\x7d\x3f\x92\x59\xee\x15\x42\x73\x4f\x45\xe3\x44\xa8\xfc\x17\xf1\x38\xe5\x58\x4a\x39\x15\xd1\x6f\x93\x5a\xc8\x57\x1e\xc9\x17\x6e\x5b\x1c\x30\x54\x30\x59\x54\x59\x21\xf6\xff\x3e\xe9\xe7\x5e\x7d\x86\x44\x71\x28\x88\x1c\xea\x8c\x3f\x40\xf5\x53\xbc\x4d\x62\xed\x28\x4e\x84\x13\x11\x6a\x9e\x8a\xa6\x5d\x9b\x7a\x3c\x21\x89\x62\x43\x3d\x72\x60\x83\xe6\x60\x28\x9f\xe7\x25\x59\xc6\x3f\x3e\x09\x93\xd0\x2d\xf4\x8f\xbf\x72\xfa\x20\x51\x42\x00\xd5\x62\x4e\x35\xe8\x76\xf7\xa8\xbc\x9e\x9a\xff\xea\x84\x19\x5c\x50\x9c\x60\xf1\xa2\x79\xb5\x51\xf3\x3f\x4e\x53\xa7\x31\x12\x25\x31\xa5\xbd\x1d\x82\xfd\xb9\x5e\x3d\xf6\xba\xac\x3c\x5e\x79\x72\x05\xa9\xc0\x0f\xf9\x36\xe8\x5c\x05\x82\x44\x89\xb4\xa5\xf6\x76\x69\x99\x9a\xd7\x4f\x46\x6a\x62\x11\x9e\xc8\x7e\xbf\x37\x6d\x62\xd3\x3d\xfa\xc4\x10\x94\xeb\xc2\x89\x78\x03\x6f\xd8\x79\xe9\x8e\xa6\x61\x88\xf2\x7c\xfb\x46\xbc\x41\x35\x89\x1d\xa3\x94\x51\xe4\xa9\xfd\x79\x3a\x40\x95\x9d\x0e\xed\xfa\x3a\xe4\xea\xb7\x23\x62\xac\xc7\x6c\xdb\x54\xb4\x3a\x1d\xee\x00\xcb\xdb\xdd\xe1\xc4\x2a\x8e\x66\xc5\x5b\xf9\x3a\xdf\x43\x23\x91\x88\x22\x8c\x08\xf7\xcf\x65\xa9\x67\x37\x9e\x48\xe8\x84\x39\x1f\x0e\x27\x5d\x3f\x5c\x70\xa6\xe7\x83\x88\xcf\xe9\xa3\xdf\x95\xdf\xb3\x62\xa8\x8c\xee\xc6\xcb\xc0\x4a\x94\x94\xae\xd4\xbb\xaf\xd0\x2d\x79\xb5\x45\xce\x39\x60\x61\xe0\xe1\x24\x7f\x87\x4f\x04\x99\xf8\x4f\x11\x4b\x85\xb4\x2f\xb8\x53\x47\x06\x7d\x05\x05\x98\x4c\x65\xa2\x97\xa5\x23\x91\x4c\xad\x5e\x97\x2a\x8b\xfa\x74\x80\x0e\xdb\xba\xe9\xaf\x41\x52\x84\xac\x7b\x87\x84\xe5\x04\x4b\x3a\x2e\x60\xba\x0f\xa9\xc8\xc2\xe4\xf0\x32\x55\x05\xcd\xa2\x41\xad\xe2\xc9\x53\x84\x50\x24\xe1\x80\x27\xe0\xf4\x5c\x7e\x1b\x57\x0a\x49\x04\x11\x93\x5e\x7c\xc3\xd7\xa2\xc2\xd4\x5f\x21\x88\x04\x0b\xe2\xe2\xb0\xb1\x31\x7f\xf7\xf7\x14\xe1\x2c\x3f\x1e\xdb\xb8\xaf\x67\x9a\x8f\x1f\x20\x48\x8b\x3c\xa8\x1b\x10\xf9\xde\x36\xae\x2f\xcc\x66\x50\x0c\x33\x81\x53\x81\x9a\x47\xb6\x10\x31\x3d\x9d\x11\xa8\xd7\x87\x0d\xb4\x3b\x78\xc7\x98\xe5\xea\x42\x0b\x81\x44\x26\x16\x58\x87\x15\x07\x9b\x45\x7a\x47\x92\xee\xb0\x95\xe6\xbb\x39\xbe\xfa\x2e\x79\x77\x28\x25\xa8\x35\x51\xc0\x47\x63\x4d\x34\xbf\x95\x9e\x36\x44\x22\x23\xa2\x84\xb9\xa3\xe8\x08\xe7\xbc\xe0\xfa\xe3\x16\x45\x8a\x9c\x5d\xac\xf0\x6f\xfa\x1b\x67\x0c\xc7\xdf\x79\xd5\x66\x65\x7f\x2d\x2b\x26\x81\xe0\xd2\x49\x38\xee\x0f\x59\xb1\x3f\x88\x8f\xfd\xf2\xe7\xb2\x5d\x61\x1f\x31\x87\x9f\x7f\x25\x48\x68\x08\x0a\x52\x3e\x67\xa6\x41\x71\xab\xf9\x1b\x45\x22\x4a\x69\xdf\xe2\xb7\x3c\xae\x0e\x25\x79\xe1\x23\xd2\x12\xcd\x9c\x22\xcf\xca\xc1\xa9\x7e\xf3\x87\x4d\x8c\x0d\xcb\xce\x5c\xb5\xf2\x95\xe4\xbd\x39\x15\xba\xde\x37\xe5\xfe\x58\x95\xff\x06\xdf\xb8\x24\x84\x12\x6b\x84\xb9\xef\x08\x7f\xed\xcb\xde\x2b\xce\x4c\x2e\x80\x9a\xd0\xb8\x46\x8e\x6d\x8e\xfd\xcc\x9a\x97\x99\x80\x84\x30\x21\x30\xc8\x82\x79\xb8\xe3\x28\x6d\x22\x3c\xe0\x5e\xbd\xee\xee\x74\x40\x69\x45\x68\x3a\x0c\x46\x7b\x3c\xc5\x93\x8d\x94\xf9\x08\xe1\x9a\x81\xe3\xaa\x2c\xae\xc4\x64\xd5\x1e\xcd\x61\x12\xc7\xd6\x4b\x12\x85\x63\x8b\xeb\x53\x55\x88\xde\x8a\x75\x5e\xe8\xc3\x47\x17\x24\x4e\x43\xe4\x8b\x76\xa4\x52\x4c\xb9\x86\x00\xdc\xf9\xf4\x89\x24\x09\x43\xde\xa2\xeb\x7d\x67\xf9\xa4\xb4\x47\x52\xca\x42\xdb\x8b\xac\x60\x05\x79\xf6\x06\x15\x72\x74\xca\x5a\xe4\xeb\xb7\x4b\xb4\x3e\x42\xd2\x38\x09\x87\x7b\x9a\xab\xd8\xcc\x01\x85\x08\x49\x4d\x8a\x38\x20\x93\x97\xe2\x75\x2c\xa1\x45\x88\xe0\x0c\x97\x8a\x07\x10\xaf\x38\x57\xfb\x1a\x35\x21\x42\x32\xd4\x1b\xf8\x09\xd9\xf6\xf2\xc5\x08\x47\x2d\x16\x4a\xc1\xb1\xf9\xdd\x6d\xcc\x3d\x2d\xd6\x0f\x03\x2b\x77\xe8\x5f\x5f\x57\x40\xef\xae\x44\x1a\x50\x9e\x6b\xf3\x2c\x1a\xd0\x36\xab\xb7\x7e\x11\xbf\x8d\xcc\x79\xff\x6f\x69\x23\x51\xc6\x6a\x2e\x21\xd8\x1f\x97\x8c\x5b\xd1\x9c\x2e\x40\x37\x09\xd1\x52\x23\xce\xee\x68\x15\x37\xea\x4d\x71\x8f\xf2\x47\x88\x9a\x51\x9f\x17\x3e\x05\x6d\x5e\xd6\x39\x15\x96\x55\x7d\x53\x76\x26\x8b\x84\x00\x0b\x13\x57\x0c\xbd\xef\xdc\x0a\xb3\xb7\x2c\x87\xe7\x01\x58\xe7\xbc\xb0\x43\x20\x4d\xb1\x9d\x93\xd5\x67\xc6\x0c\x6e\x84\x61\x16\xb0\xef\x58\x4f\x5b\xc8\xcd\xa3\xed\xc6\x74\x03\x6c\xe1\xcd\x4b\x9b\x6e\x87\xdc\x56\x42\x4c\x6c\xe2\xa0\x5b\x85\xae\xb1\x02\xb8\x6d\x44\x73\x3a\x97\x14\xea\xaf\x8b\x06\xc4\x6e\x73\xfb\x8e\xfa\xe0\x58\x98\xa3\xbb\x42\xc3\x34\x44\x35\x27\x5d\x16\xed\x6f\x76\x0a\x7d\xfe\xa0\xb4\xeb\xdf\xd1\xcd\xf8\x49\x1c\x42\x23\xda\xa5\x3d\x9e\x89\xe0\x2c\x90\x26\xdf\x42\x68\x80\x95\xd5\x75\xf3\x82\xd3\x77\x7c\x1a\xa2\x42\x54\x79\x5a\x68\x7d\xb5\x5b\x0e\x34\xc8\x2e\xe7\xac\xed\x64\x73\x69\x08\xa5\x3c\x10\x7d\x4b\x0f\x4d\xf4\x45\x23\x2e\x2e\x1d\x43\x16\xfe\xa5\x52\x22\xa5\x10\xe0\x23\xf9\xf9\xf3\xa7\xbf\x19\x8c\x69\x04\xba\x3d\x3c\x6e\x96\x6b\x0f\xb4\x27\x94\x25\x0c\xa9\x4b\x77\xf0\x8e\x7d\xef\x4b\x5f\x3b\xfb\x6a\x52\x26\x39\xea\xa9\xb4\xd3\xa6\x8d\x83\xae\xcb\xd3\xc0\x3a\xcb\x0b\x41\xb4\xe3\x62\xc4\x91\x60\x4a\xdb\x6e\x2c\x3f\x21\xeb\x13\x5a\xca\x99\x62\x03\x6b\x93\x79\x48\x31\xa1\xb1\x0e\x22\xe6\xb8\xe9\xb6\x79\xec\xbb\x14\x34\x49\x03\xec\xed\xd8\x98\xe0\xde\x5c\x75\x52\x8e\x84\x26\x4a\x20\xc9\x6a\x2f\x2b\x00\xf4\xd5\xc1\xf3\xd2\xe0\x6f\xf6\x1f\x3f\xcc\x30\x5c\x85\x0f\xa2\xb6\x1e\x3d\xd8\xa7\x3f\x2f\xfb\xb9\xe1\x69\x14\x62\x7f\xed\xdf\x65\x56\x5c\xbb\x5c\xee\xac\xed\xde\xc3\x35\x09\x4d\xa5\xc2\xc0\xb8\x28\x0b\xa4\x19\x62\x56\xdf\xeb\x96\xfc\x9f\x6a\xf4\x54\x26\x31\xfa\xc8\x2c\x36\x8f\xab\xc7\xfb\x87\x36\x4b\xf4\x08\x14\x42\x65\x6a\x42\x3a\x42\xd4\x8f\xb4\x7f\xdd\x28\xc5\xd2\xb4\xfd\xbd\x7f\x17\x6f\x62\xfb\x2e\x8e\xbb\x81\xca\xc2\x0c\x46\x86\x50\xa5\x08\xee\x86\xed\x93\x59\x81\x12\x9f\x5e\x36\xd4\xaa\xb7\x58\xfe\xff\x78\x5b\xa4\x3a\xe1\xd2\x8c\xd1\x91\xb1\xbf\x4c\xad\x62\x54\x02\x58\x8a\x42\x54\x9f\x3f\xe2\xf6\x02\x8a\x2e\x19\xa1\xda\x84\x91\x4f\x82\xbb\x30\xfc\x13\x29\x0a\xf3\x93\x11\x4c\x84\x29\x16\xea\x0b\xbf\x54\xe5\x7b\xfd\xe4\x94\x01\x2d\xb9\xd9\xda\x23\x8e\x11\x82\xed\xa7\x28\xd1\x03\x67\x79\x5c\x01\xce\xd6\x19\x13\x58\x05\x19\x55\x74\xab\x8b\x89\x22\xe5\x56\x8f\xa7\x2a\x1f\x97\xc7\xa8\xa1\x0c\x06\xae\xcd\xdb\x06\x8e\x16\x76\xec\x8f\x03\x27\xc9\x60\xe9\x69\xaf\x6c\x89\xf4\xc5\xba\x6b\xce\x4f\xf5\x2a\x46\x57\xc4\x82\x00\x30\xd7\x93\x99\x9d\xa1\x89\xff\x3b\x0f\x43\x57\xfb\x43\x6a\xf4\x56\x74\x2b\x35\x0b\x52\xaa\xa2\x0e\xc0\xbf\x59\xde\x4f\x4d\x84\x08\x0b\x04\x20\x53\xd5\x64\x7d\x64\x8d\x4d\x94\x4d\xd1\x94\x8f\xd8\x9b\x9d\x7c\x40\xa6\xfe\xfb\x56\xa7\xe2\x19\xb0\x0b\x72\x14\xb6\x40\x7f\xfe\x12\xb3\x40\x11\xf4\x36\xc3\x7d\x72\x8d\x4c\xf7\x61\x79\x99\x85\x91\xf0\x4e\x2c\x6d\x04\xe4\x56\xf4\xe1\x0e\x31\xd8\x26\x58\x48\x62\xc4\x00\xe4\xe5\x3b\x54\x4b\xc8\xf2\x29\x6e\x8b\xb0\x90\x51\x70\x51\xf6\x23\x62\xaf\xe1\x38\xe8\x44\xff\x6d\xdc\x93\x26\x2c\x4c\x12\x2f\x5a\x78\x9d\xe5\x87\xe9\xc9\x00\xf0\x25\xc6\xfd\x06\x3a\x42\xff\xa9\xc7\xd1\x13\x46\x88\x05\xcd\xdd\xb5\x21\xe6\x18\xc7\x47\x18\x65\xda\xf7\x5c\x36\xa8\xcb\x3c\x70\xcc\x99\xe9\xef\x13\x46\x63\x8a\x15\x5f\x78\x6b\xf7\xce\xc3\x25\x19\x62\xc2\x68\x4a\x05\xed\x20\x50\x6d\xe8\xf3\xd0\xde\x94\x33\x4e\x0f\x61\x54\x5b\xd3\x63\x6d\x75\x3b\x7e\x94\x1f\x2e\xcb\x4c\xfe\x36\xf8\x5f\x37\x98\x87\xa1\xf6\xee\x25\xb6\xe5\xf7\x8b\xd2\xfe\xe4\xb2\x78\x94\x52\x87\x89\x58\x7c\x8a\xa2\x59\x55\x65\xd6\xac\x55\x59\x94\x87\xec\x3f\x27\xd8\x2f\xcb\xc3\xb1\x81\x3d\x99\x5c\x23\xe7\x4c\x39\x7f\xc3\xab\xd3\x67\x3b\x48\x14\x9f\xe3\x97\x8c\xc5\x21\xc7\x66\x57\xbf\xce\xcd\xf3\x11\x4f\x43\x1d\xcd\x2f\xa5\x71\x08\x8b\xa3\x50\x5a\xb2\xf3\xfb\x23\xd4\x65\x3e\xec\x21\x4d\x46\x32\x83\x90\x31\x79\xfa\x7c\x14\xc5\xeb\xe4\xfa\x63\x6d\xb5\xa3\xb6\x8b\x9b\xf5\x7e\x7d\xb7\x5a\xaf\xfc\x0c\x48\x82\x14\xab\x1f\xc7\xb2\xcc\x07\xfd\x00\x96\x38\xc0\x95\x2e\x3b\xdb\xcf\x51\xeb\x6c\xfc\xdb\x13\x1d\x61\xb1\x11\x65\xad\x57\x5b\xbb\x0e\x57\x56\xa6\xd7\x9f\x31\x8d\x44\x68\xc6\xf1\xcd\xcc\x6c\x10\x5c\xa2\x91\xc0\xcf\x4c\x99\x81\x27\x70\x9b\x60\x71\x2f\x4a\x7f\x2b\x3e\x1e\xaa\xec\xbf\x70\x5f\xc0\x6a\xba\x91\x30\x01\x01\xb2\x16\xbe\x79\xf3\xb5\x91\x90\x07\x61\x92\xa6\x8e\x7a\xd2\x88\x8e\x24\x56\x6f\x8a\xad\x7a\x01\x7d\xca\xfb\x71\x2c\x32\xd1\x00\x83\xb7\xe8\xae\x44\xf2\x10\x30\xd7\xc3\xb6\xcf\xa2\x02\x31\x2a\xec\x33\x19\x2b\x94\x2b\x46\xc5\x07\xb6\x2e\xf4\x30\x6f\x67\x32\xa5\xa8\x42\x25\x2a\x99\x61\xb1\x7c\x49\xaf\xbb\xd7\xf2\x1c\x3f\x4b\x98\x4a\x24\xb7\x5e\xcf\x6a\x08\xed\x24\x4c\x53\x0b\x8b\xf9\xfd\x24\xa1\x12\xfe\xaf\x90\x04\xdc\xa6\x6f\x59\x1b\x40\x17\xcf\x5b\x8f\xc8\x27\x0c\x24\x0f\x8c\xaf\xd6\x9c\xaa\x1a\xea\xa1\x3c\x38\x61\x86\x72\xdc\x7d\x56\x3f\xac\x58\xfc\x17\xfb\x2f\x33\x8c\x7b\xb0\x48\x56\x98\xf2\xfd\xbc\xce\xe0\x07\xa6\x24\xc0\x24\xfe\x54\xa8\x51\x13\x98\x19\x29\xb0\xb3\xd9\x05\xd5\x16\x5b\x37\x5f\x6d\x98\xdd\x77\x78\x10\xc7\x8a\x0c\xda\x56\x6f\xa0\xaf\xe6\x3c\x82\xfd\x70\xa1\xd2\x61\xc5\xe0\xea\xf3\x9c\x77\x4d\x78\xa0\x04\x26\xb2\xc7\x4e\xab\x66\x60\x18\x49\x78\x18\x59\xd5\x6a\xdb\x6f\xc7\x5f\x74\x33\x48\x54\xfe\x36\x5c\x7e\x79\x48\x62\xd5\xcb\x02\x8f\x0b\x4e\x93\xdf\x12\x12\xe5\x6b\x64\x57\x65\xa1\x67\xd3\x5b\x4e\x62\xed\xbd\x05\x1f\x00\x29\x6f\xe7\x22\xfd\x84\xd3\x30\x8e\xfb\x5a\xcb\xbe\x16\x39\xec\xc5\x5c\xf5\x93\xd3\xc4\x9a\x2b\xea\x2d\xf4\x7c\x87\x2b\x04\x78\x76\x7d\xcd\x33\xd2\x22\xe1\x4c\xd8\x3a\xbc\x86\x5a\x55\xd9\xb1\xdd\x5d\x23\x7f\x7f\x98\xb6\xb0\x60\x94\x11\x18\x6b\x87\xcc\x3f\x15\x4e\xa8\xb4\xbc\x81\xed\xe6\xf7\xcd\x70\x8a\x70\x0e\x20\xa3\xb3\x7e\xa6\x3f\x1a\x07\xd6\xad\x72\x7b\x3a\x1e\xcb\xaa\xcd\x5d\x1b\xa8\x8c\x50\xd0\x06\xb2\x37\x65\xf9\x7a\x3a\x76\x43\x63\x45\xac\xad\xbf\xfa\x54\xf9\x34\x9e\xe9\xef\x5c\x2c\xec\x17\x1e\xc4\xc7\xc3\x8f\x2b\xff\xe9\x84\x00\x7a\x44\xd7\xc2\xc0\xf7\x12\x55\x99\xcc\xe4\x96\x27\xc2\x06\x88\x9e\xb7\x37\x5e\x76\x78\xa2\x25\x45\xff\xeb\xe5\x7a\x3f\x28\x3a\xf0\x04\x52\x84\xeb\xb7\xcb\xcc\x6f\x63\x72\x00\xe1\x69\x92\x0a\x2b\xd3\x5c\x37\xe5\x61\x60\xd2\xe4\x8f\x2b\x42\x9c\x87\xfb\x73\xd1\xee\x66\x65\x57\x60\x68\x8f\x21\xe2\xc9\xbe\x4d\x16\xcc\x7f\x5d\x5e\x9a\x7b\xa9\x16\x28\x08\x6d\xf2\xec\xb8\x7b\x81\xf6\x0a\x17\x85\xfe\xd9\x5f\xa7\x90\x5a\xab\x01\xac\x7a\xd9\x97\xab\xb9\x8c\xad\xb8\x19\xd6\x53\xde\xe6\xf4\x48\x08\x97\xa9\xc1\x92\x80\x7d\x0f\x50\x05\xaa\x7e\x41\xc6\xd0\x18\x2f\xe6\x2f\x48\x71\xed\xe1\x94\xb8\xd6\x3f\x94\xe5\xa4\x9c\xc4\x55\x2a\x31\x65\xd8\xdb\x73\x3a\x88\xca\xee\xf3\x08\xf6\xd1\xaf\xda\xc4\x75\x36\x0c\xe0\x0a\x38\x8a\x7c\x20\xa2\xc8\x96\xfd\x7b\xcc\x29\xe1\x5a\x04\xb8\x29\xf6\x50\x2d\x2b\x4a\xb8\xb8\xbd\x7f\xba\xdb\xed\xef\xaf\xaf\xd7\x8f\xeb\xd5\x7e\x77\xbf\x7f\x78\xba\xba\xf1\xe6\x83\x84\x43\x64\x79\x28\xd6\xc8\xb4\xb6\xa6\xad\xf5\xbb\x4b\xe4\x27\x13\xc6\x88\x38\x72\xe8\xbd\xa1\xfe\xc9\x6c\x93\x22\x0e\xa2\x00\x51\xdb\x96\x8c\x86\xf3\x24\xf1\x87\x18\xc3\xd0\xfb\xe8\xb3\xe8\x38\x8c\xb9\x37\x90\xfe\x91\x69\x28\xd1\x71\xa7\x81\xc3\xcc\x5a\x17\x87\x89\xe5\xad\xd7\x60\x17\xba\x23\xaa\x42\xef\x3e\x26\x7e\x6a\x6e\x74\x14\x29\x1a\xbb\xa4\xe6\x1b\x34\x37\xe2\xfd\x13\xaa\x45\x33\x4c\x26\x62\x12\x2a\xd4\x54\x3c\xe6\x1f\xc3\x97\x35\x6e\x63\x63\xe9\x7a\x63\xa3\xde\x7c\x4c\x52\x6b\x1e\x0c\xcd\x84\x68\x42\x62\x16\x1a\xcc\x5c\x7e\x82\x68\x67\xf0\xe8\x84\x8c\x5b\x6f\x6a\xa7\x73\x32\x8e\xca\xc7\xd7\xcd\x52\x40\xfd\xab\x4e\x20\xcf\x1a\x5e\xfa\x80\xf9\x2f\xc5\x8e\x31\x03\x82\xc2\xa7\x8e\xa8\x3c\x5a\x77\xcf\x8a\x2a\x53\xc8\xd5\x97\x35\xd7\x98\x27\xd6\xbd\x08\xdb\x4a\x65\x61\x41\x5c\xeb\xff\x6c\x8a\xc6\xaf\xaa\x31\x87\xc8\xfa\xae\x88\x3c\xf7\x8e\x4f\x8b\x42\xdb\xac\xc4\x74\xe4\x58\x12\xc7\xa1\x45\x1d\xd5\xd0\x7c\x2b\x73\x3d\x8d\x2d\xfc\x28\x9a\xa0\x1c\x1a\xee\x6c\xd7\xa7\x1a\x84\x6b\xaf\x9d\x23\xeb\x49\x1c\x9b\x28\x74\x99\x1a\x45\x34\xcc\x79\x26\x15\x27\x44\xe2\x2b\xf5\x20\x8e\x62\xf4\x98\x12\x90\x48\x03\x59\xb7\xe9\x5b\x95\xa9\x7f\x9c\xe0\x34\xd9\xd5\xe2\x34\x54\x98\xe7\x0d\x18\xf6\xb3\x5b\x45\x9c\xea\xd8\x4a\xcf\x55\x00\xfa\xb3\x1c\xa4\xce\xb1\xe0\x29\x8a\x16\x2f\x5e\xb3\xf3\xb2\x58\x2c\x12\x85\x95\x45\x14\x6d\xba\xf5\xfb\x76\x37\x05\x65\xa8\x8c\x5b\x6e\x36\x47\x53\x63\x33\x6e\xd0\x0e\x8b\x25\x4b\x11\xaf\x86\x82\x14\xd9\xe1\x98\xc3\x9d\x38\x40\xe7\x75\xee\x47\xf1\x04\xb3\xc9\x46\xa0\x9d\x6a\x69\xb2\x6e\x22\x4b\x6d\x15\x6e\xda\x33\x6f\xdb\x40\x7e\xaa\x92\x35\x99\x11\x2a\x84\x28\xf1\xed\x79\x0d\x1f\x8f\x65\xd9\x8c\xae\x48\x51\x4b\x00\x42\xa5\x72\x51\xc3\xcf\xb2\xd2\xdb\x3e\xe9\xf0\xa3\x54\x8c\xdd\xc1\xbe\x98\xef\x66\xc3\x5f\x34\xd3\x26\xb1\x8e\x04\xaa\x3f\x3e\x7c\x5f\x6c\xd7\x04\x7d\x1d\x77\xfb\xdd\xe6\xd6\x03\x0d\x62\x43\x15\x76\x9c\x9f\xc5\x01\x56\xd6\x6a\xac\xbb\x23\x49\x10\x06\xc8\x35\xde\x36\x15\x88\x43\x0f\x0d\x4c\x02\x15\x20\x86\x41\xb5\x9b\x64\x3e\x2c\x53\x8e\xa6\x55\x12\x86\x5c\x06\x23\xe9\x9a\x7e\x75\x48\x42\x63\x7d\xe8\xfc\xaf\xdb\x55\xa7\xba\x81\x73\x8d\x4a\x37\x3c\xa2\x1c\x22\x8b\x45\x1b\x38\xd9\xfb\x83\x42\xa1\x02\x82\xdd\x6b\xed\x3b\xee\xe6\xc8\xec\x96\x99\x44\xda\xdb\x92\xbd\x42\x71\x75\xaa\xc6\x42\x64\x24\x21\x24\xc0\x0a\x9e\xc8\xf3\x71\x2c\x90\x10\x16\xf2\xd0\xef\x97\xe8\xd5\xf5\x0b\x68\xc4\xfc\x82\x94\x10\x20\xa8\x96\x77\x53\x3e\xef\xc4\xeb\x79\xb5\xf4\x17\x39\xe6\xdf\x5c\x55\x74\xf4\xaf\xc7\xa3\x24\x34\xb0\x22\x65\x78\xe3\x37\x07\xf1\x0c\x9b\xe2\x78\xea\xc9\xe8\x21\xbf\x88\xe8\xf8\xe7\xbf\xa6\x95\x91\x84\x86\x81\x89\x3c\x20\x23\x53\x65\x55\x5c\xb5\x6f\xf0\x94\x8e\x42\x12\x9a\x04\x48\x9d\x2a\xc0\x43\x17\xc6\x82\x8d\x7e\x58\x0a\xa8\x0d\xf4\x56\x36\x70\x5f\x6c\xcb\xfc\x34\x5b\xf1\x1c\x5e\x81\x8e\x90\xcc\xf0\xb0\x78\xfc\x7d\xb8\x3e\x25\x14\x42\x7c\xd3\xea\x32\xd7\xdb\xad\xff\x2b\x8f\x2c\x85\xcb\x09\x6e\x43\xf5\x96\xa9\xf9\xbd\x39\xe1\x51\x8a\x05\xce\xed\xfd\x9f\x8b\xee\xe3\x04\x70\x5b\x2d\x47\x35\x8a\xf1\xe3\x8b\xc1\xaa\x7b\xdd\xdc\xfc\xd8\x93\x30\xdc\xaf\x57\x9b\x5d\x87\x74\x4f\x92\x88\xa2\x7e\xf5\xc1\xda\x5a\x7d\x3a\x35\xa6\xb1\x6c\xf9\xf8\x84\x09\x50\x5c\x69\x41\x55\x16\x6f\xba\x02\x35\xf0\x62\x9b\x87\xfd\xfa\xcf\x1a\xdb\xd0\x59\x9d\x2a\x51\x64\x5d\xca\x98\xa4\x24\xc0\xd2\x2e\x4e\x83\xdb\x4f\x5f\x21\x9e\xdc\x82\xd4\x44\x31\xf1\xc9\x79\xf1\xd9\x83\x58\xeb\x5e\xbc\x60\x72\xb1\x22\x88\x2c\x6c\xe8\x25\xf3\xdf\x25\x42\x82\x3f\x79\x8f\xd5\x42\x44\x3c\xb4\x7b\xac\x33\x5e\xc0\xeb\x8d\x82\xe9\x69\x38\xc1\x3a\x93\x83\x81\xff\x9e\x35\xcd\x59\xcf\xea\xd2\xe6\xec\x4e\x21\x99\xc6\x15\xce\xf1\x17\x2e\x9b\x3c\x91\x44\x1a\xa5\x79\x67\x04\xef\x10\x48\xd6\x26\x65\xa2\xd2\x40\x12\xa5\x95\x08\x9d\x9d\x60\xc7\xed\x23\x89\xa6\x04\x85\xf9\xf6\x1a\x9c\xc5\xc4\x08\x1b\x7f\xea\x55\x0a\x43\x3e\xa9\x15\x8d\xaf\x45\x4b\x83\x41\xaa\xa5\xd9\x59\x9f\xb4\x41\x10\x9b\x68\x23\xb0\x82\xf3\xfd\xc7\xdd\x68\xbe\x43\x14\x19\x6b\x73\x83\xf6\x58\x6d\xcc\x59\xf7\x82\x95\x24\x01\x6a\x34\xf7\x78\xc1\x57\x28\xae\xcb\x6a\x56\x6f\x7e\xf0\x6e\x01\x8b\x71\xef\x6f\xaa\x4f\x4f\x95\xed\xce\x96\x5a\x94\x63\xbb\xb8\xbf\xc1\xde\x67\x47\x93\xf9\x03\x9a\x60\x0c\xeb\x4c\x31\xdd\x12\xfc\x2b\x63\x81\x5f\xc5\x5e\xf3\x8f\x1b\x4c\x98\x5a\xf9\xf5\xe6\x0a\xdd\x28\x65\x3e\x35\xea\x23\x89\x21\x01\xa6\x1f\xb6\x83\xd3\x29\xd2\xed\xca\xee\x05\xf0\x03\x29\x11\x81\x87\xa7\x5a\xe8\xa4\x9d\x16\x37\x59\xdd\xfc\x10\xf9\xa6\x18\x6f\x22\xdd\xc7\x84\x1e\xb6\xb4\x6f\xb3\x02\x2a\x91\x5f\x30\xc8\x69\xc7\x5b\x17\x09\x74\x72\xd8\x65\x50\x45\xdd\x05\x18\xe6\x54\x02\xda\x24\xa8\x73\xf1\x1e\x7d\x3c\x0d\xa2\x74\xa0\x13\xec\x2e\xd4\x5e\x98\xf5\x91\xf0\xe3\xa8\x42\x2f\x96\x5b\xd1\x86\x35\x77\xf0\x65\x0b\x26\x0d\x98\x46\xd1\xfe\x97\xec\xf9\xc5\xe9\xef\x74\x27\x02\xee\xdb\x11\x9b\xda\xc2\xe2\x91\x1e\x71\xf5\xb9\x6d\xd3\xe7\x71\x02\x90\x86\x61\xcc\x7d\x54\x57\xd4\x2f\x25\x60\x4b\x0a\xba\xc3\x2a\xe2\x43\x99\x09\x34\xa1\x69\xdf\x9c\x68\x7c\x57\xd3\x28\x30\xdc\x81\xf5\xd6\xa2\xca\x33\xa8\x9b\x8e\x3b\x37\x19\x19\x5a\x1d\xae\xd5\xfa\x8f\xef\x9b\x6f\xdf\xf7\x3f\x3c\xde\x35\x8d\x92\x48\xc6\x4e\x82\xc3\x46\x77\xa0\xbd\x48\xf3\xe7\xf4\x2c\x26\x45\xe6\xc5\x8b\xa8\x97\x65\xf1\x06\x55\x33\x51\xba\x69\x87\x58\xb2\x63\x1b\x38\xae\x3f\x8e\xbf\xf5\xad\xb8\xb3\xf5\x3b\x25\x24\x61\x03\x66\x89\xed\x17\x75\x37\x89\xc4\x09\x16\xef\x56\xba\xac\x6f\xb3\x26\x7b\x1e\xb2\x04\x52\x22\x03\x6e\xfb\x79\xcd\x4b\x56\x3c\xdf\x64\xd2\xcf\x90\x94\x69\x15\xf7\x88\x85\x5f\x19\xfd\xba\x0f\x71\xae\xb0\x7c\xb0\xf7\x1d\x9d\x4b\x62\xd2\x24\xe5\xb1\x65\xba\x66\xf5\xff\x42\x55\x4e\x64\xdb\xfd\x18\x45\x51\x4e\xc7\xf6\xb5\x16\x95\xa7\x65\x77\x87\x63\xac\x0e\xc8\x28\x44\x9c\xb5\x1d\x35\x8a\xa7\xd2\x58\x09\x94\x6d\x29\x4e\x07\xb7\x58\x3e\x82\x2a\xab\x89\xbd\x02\x49\x63\xcd\x34\x1b\xac\x5f\x3d\x73\xce\x65\xcc\x69\xc2\x14\x86\x02\xeb\x8f\xbe\x6e\x9a\x26\xa9\xc5\x32\xba\xe5\xfa\x0e\xde\xb1\x66\xf2\x08\x22\xdf\xac\x66\xc3\x65\xf7\x41\x11\x73\xbc\xbd\x87\xac\x80\x73\x2b\x4f\x92\x8a\x94\x59\x07\x05\x7c\x0b\xba\x0c\x74\x5d\xe8\x9e\xe3\x48\x52\x21\xb9\x89\xbc\x4b\x99\x4d\x4b\x67\xb4\xb4\x49\x2a\x54\x18\xdb\xec\x5a\x7c\x42\xb5\xc5\x86\x5e\xe7\xa3\x43\x52\xc9\x25\x49\xdd\xec\x7d\x2b\x11\x33\x68\xca\x6a\xde\x52\x87\xa4\xca\x48\x2b\xee\x55\xdb\xa2\xd6\x97\x65\xba\x14\x22\xbb\x94\x63\xd6\x85\x19\xf7\x05\x87\xa1\x6e\x3c\x0f\xa8\xef\xfd\x7d\x5e\x09\xf5\xfa\x78\xc6\x8a\x4b\x21\x52\x94\x4d\x5e\xb7\x5d\x79\x9d\x55\x87\x09\x9d\xd8\x8f\x4f\x19\xb2\x9a\xf7\xd6\xf8\xe3\xcc\x02\x91\xa4\x26\x49\x03\xdd\xc1\x66\x31\x82\x18\x75\xc6\x06\x23\xb5\xed\x7d\xb8\xe2\xe2\xf8\x7e\x4f\xbe\xd7\x38\x58\x51\x9f\x48\x1d\x0e\x19\xfa\x6e\x8f\x1f\x90\x08\x22\xc1\xbd\xa2\xe4\x8d\x40\xcb\xd9\xc1\xae\x2c\x82\x48\x21\x2b\x44\x42\xb3\xd0\xfa\xbc\x9f\x3f\xff\x8e\x89\x88\x13\x74\xe4\x3c\xc2\xf3\x33\xe8\xed\xe7\x41\x96\x1e\x29\x28\xa2\xd8\x60\xb1\x17\xea\x26\x3b\x08\x2b\x05\xf1\x50\x36\x5b\x00\x3d\x4a\x71\x04\x91\x9c\xd1\x0e\x3b\xd3\x5e\xfb\xe4\xb8\x0e\x50\xfb\xce\xd1\x70\x71\x7d\x99\xb8\xef\x13\x41\x80\x73\x97\x29\x5b\x0c\xdf\x8d\xa8\x9b\x07\x91\xe9\x33\x78\xb4\x7b\xdd\x04\x05\x95\x20\xa8\x63\x79\x3b\x6b\x41\x33\x7c\x9b\x04\x4b\x42\xeb\x4f\x6e\x15\xed\x01\xaa\x71\xfc\x7f\xce\x2e\x3f\xef\x9a\xb6\x27\x41\x84\xcc\xed\xe2\x8f\xfd\xd3\xe6\x6e\xd7\x69\xc4\x12\xc1\xc0\xfa\xdb\xd9\xb8\x7e\x28\x7b\x31\xbe\xe1\xb1\x8e\x70\x5b\xb5\x22\x69\xab\xa7\x47\x24\x17\x78\xc5\x41\x22\x12\x12\x62\xc8\x83\x8b\xc4\xdf\x4b\xd9\xfd\x3d\x16\xe8\x16\xf3\x2c\xea\x6e\xeb\xf7\x87\x94\x15\x44\x56\x65\xd1\xf4\x49\xac\x48\xb4\x25\x58\x58\x18\xe8\xb4\x94\x2f\xd2\xc4\xaa\x75\x3d\x94\xc7\x53\xbe\x6d\xc4\x50\xcb\x8b\x88\x34\x05\xf7\x8e\xe5\xa0\x46\xd2\xf0\x44\x08\x65\xab\x91\x57\xa2\x86\xdb\x72\xd0\xdb\x12\x32\x60\xd4\x25\xa0\xed\x41\x04\xf6\x3e\x1d\x07\xb6\x71\x6e\x9c\x8a\x02\xa4\x30\x20\xdc\xae\x27\x16\x76\xbf\x48\x71\xdb\x7d\xd9\xbe\x94\xef\x68\x66\x0b\xcb\xf3\x25\x4b\xa8\x38\x62\x9d\xad\x53\xd5\xbe\x31\xb3\xab\x91\xd0\x29\x45\xc1\x11\x1f\x62\xb5\x73\xb8\xd7\xe7\x24\x42\xcb\xc8\xa9\x62\xb4\x2b\xdb\xae\xf4\xb5\x7d\x01\xdc\xb5\xc1\x3b\x4b\xf4\x1e\x33\xfd\x55\x0a\x2f\x20\x0e\x91\x14\xd4\x64\x50\xd1\xee\x6c\x49\x22\xf4\x00\xf1\xfe\x7b\x56\x3c\xeb\xf2\xd0\xfd\x68\x13\xd8\x26\x9a\x63\x5c\x6f\x8a\x6f\x65\xa9\xb7\x8d\x28\x7a\x7b\x11\x9f\x55\xc9\xc0\x58\x7b\xbf\xa3\xc8\xb4\x2d\x29\xfc\xcc\x5e\xb3\x07\xf1\xfc\x45\x6f\xb8\xbb\x3c\x19\x32\x2b\x5a\xf8\x50\xd6\xcd\xcf\xac\x3e\x73\x01\x19\x79\xc9\xcd\xa6\x84\x32\xe4\x3a\xb5\x16\x84\x56\x85\x0b\x46\x53\x44\x86\x09\x47\x68\xf8\x42\xbf\x65\x75\x59\xd5\x0f\xa2\x6a\x0a\xa8\xea\xd1\xba\x20\xc3\x94\xe2\xce\x7b\x57\x6a\x98\x18\x00\xfa\x57\x4e\x86\x26\x09\x3b\xdb\x4a\x34\xa2\x18\xce\x14\x49\xe2\x0e\x97\x81\x6d\xfb\x4e\x08\x96\x48\xa2\x6d\xbd\x58\x89\xba\xc1\x5d\x65\xd8\x27\x77\x63\x68\xc8\xb1\x7a\xd7\xce\xd6\xcd\xf2\x7e\x66\x9b\x95\x8c\x5b\x0c\x8b\x2b\x4d\x2f\xf2\xdc\x56\xa7\xbb\x4b\x60\x09\x45\x20\xc4\xcf\xf5\xfa\xf7\xed\x3e\x0c\x68\x77\x40\x72\xd4\x7b\x3b\x64\xc5\xd8\x13\x81\x48\x66\x04\x2e\xad\x1d\x37\xa0\x9d\x9b\x8f\x30\x16\xf3\x26\x92\x4b\x61\x58\xef\xb4\x6f\x37\x52\x7f\x8e\x58\x87\x89\x0b\x85\x57\x1d\xde\x79\xf6\x0d\x90\x09\x93\x18\xa6\x5b\x35\xc1\x5e\x7e\x4c\x34\x70\x46\x48\xb8\xf8\xef\x57\x96\x65\xfe\x7b\xa4\x15\xb1\xf7\x9b\xd9\xe6\x7c\xdb\x9b\x49\xf3\x64\xa2\xa2\xb4\x77\x32\xc2\xb8\xea\xde\x0c\x20\x20\x6e\x58\x1a\x6a\xe4\x2d\x7e\x6b\x03\x30\x35\x6c\x59\xcb\x54\x13\xeb\x3f\x24\x4f\x9f\xa8\xf6\x31\xff\x62\x4a\x11\x01\x96\x63\x5f\xb2\x63\x1b\x12\x1c\x30\x1d\x79\x84\xff\xf8\xf3\xc8\xd8\x72\x66\x9f\x2d\x82\x77\xf1\xdc\x7d\x83\x14\x90\x5a\x97\x01\xbd\xd7\x7d\x7c\x25\x55\xa8\x50\xa9\xaf\xef\xe9\x76\x47\x78\x84\xdd\x87\x5d\x75\xea\x75\xde\x86\x8b\xac\xd4\x49\x40\x78\xef\xbc\xe5\x14\x9c\xae\x4f\x85\x9a\xcc\x03\x9d\x52\x84\x17\x0b\x29\x0a\x5d\x16\x4e\x70\xc5\x15\x8f\x26\x77\x09\xa4\x44\x8e\x87\x29\x2b\x05\x7f\x2d\x28\x97\x46\x58\x8b\x87\xdb\x4c\xbd\x8e\x44\x1d\x89\x34\x46\x21\xf1\xd3\x0a\x59\x0f\x0b\x01\x2a\x88\x08\x8a\xe6\xea\xd2\x66\x87\x87\x39\x0d\xb9\x09\xcd\xb7\x7f\xea\x2a\xa4\x51\xd0\x6e\x23\x95\x30\xa6\x3f\x69\x44\x25\x22\x3e\xfc\x2a\xa8\x27\x19\xb4\xa2\x22\xb4\xca\xad\xd0\x6c\x55\xa1\x47\x9e\x20\x6e\x08\xd3\x82\xba\xa2\xe0\x37\x51\xa3\x16\xd5\xad\xf8\x98\x9c\x87\xab\x50\x38\xd3\x8e\x25\x1a\x82\xe4\x8b\xb1\xd4\x45\x37\x4e\xeb\xfe\xdd\x69\x5f\x99\x87\x5c\x9c\xc5\x1a\xa3\xe5\x59\xc5\x11\x05\x47\x13\xbb\x29\xeb\x7e\xad\x50\x31\x05\xac\x44\x1d\x7b\xe3\x80\x8e\xde\x72\x96\x4c\xaa\x38\xb6\x21\xdf\x51\x9c\xea\xde\x11\x8e\xa8\x58\x5a\xa5\x00\x9f\xe4\xef\x9b\x72\x0f\x4d\xd6\x1d\x56\x41\xe4\xd8\xd3\x23\x8f\x75\xa2\x62\x1d\x2a\xab\xca\x62\x6d\xc4\x07\x4f\x23\xa1\x69\x1a\x78\xe5\xed\x77\x44\x86\x5e\x6a\x96\xa8\x44\x68\xd5\x35\x0d\x6f\x40\x3c\x9f\xe0\x1c\x6a\x36\x64\xfd\xa8\xd4\x31\x13\x6c\xf4\xe5\x67\xa5\xe3\x41\xfe\x25\x09\x3c\xa2\xd2\xd0\x82\x13\x6b\x61\xda\xdf\x75\x31\xc0\x1d\x7d\xaf\x4c\xb0\x77\x73\xac\x60\xa3\xca\xed\x44\x54\x9e\xa8\x54\x29\x63\xb3\x84\xdf\xe1\x73\xa4\x1d\x37\xf9\xc9\x82\xc6\xb1\xc3\x83\x5c\x55\x02\x53\x2c\x31\x79\x5a\x82\x31\x1d\xf7\x89\x9e\xff\x91\xcb\x97\x2c\xd7\xd5\x10\xc9\x3f\xf9\x98\x10\xe8\x0d\x8f\x19\xac\x4d\x3c\x26\xed\x08\x25\x01\x30\x7e\x6e\xda\x14\xf6\xbd\x5c\x65\x6f\x56\x14\xce\x1f\x57\xd4\xa0\x0e\xe8\xf5\x66\xb5\x18\xbe\xbc\x4a\xa5\x8a\xb8\xe5\xec\xe6\xa4\x5e\x3f\x1d\xb2\x63\xdb\xd7\xd1\x94\x26\x24\x21\x1d\xe0\x1e\x91\xfa\x13\x4f\x09\xa2\x74\x0c\xba\x83\x36\xfd\x5d\xa8\xd7\x63\xd9\xdc\x6b\xdd\x9d\xc2\x28\x94\x7d\x73\xaf\xac\xb7\xe3\x20\x0a\x42\x85\xb2\xfc\x7f\xdf\xfe\x7d\xd9\xfd\xcd\x89\xc4\xb6\x69\xd6\xe0\x79\xcc\xae\x4b\x0a\xe2\x38\x89\x47\xfb\x89\x65\x05\x2c\xbe\x10\xa5\x21\x0a\x34\x89\x2c\x77\xac\xc0\x08\x74\xfd\xe1\x23\x3a\x65\x88\xb2\x16\x58\xaa\x9c\x90\x7e\x94\x61\x09\x6e\x0d\x0b\xac\x66\x74\xc0\x7e\x65\x94\xad\x83\xad\xd6\xd7\xc3\x7b\xab\x83\x28\x10\xee\xde\xde\x8a\x22\x33\x50\x37\x9b\x73\x45\x8c\xd1\xba\xa0\x83\x38\x02\x27\xd8\xa7\xa0\xae\x47\x26\x8e\xb3\xfb\xad\xff\x9c\x60\xe8\xab\x7a\x0b\xf9\x64\x79\xd2\x21\x0d\x10\xac\xb0\x2a\x1f\xcb\x7c\x9e\xed\x32\xde\xc1\x27\xff\xf3\xe5\x3b\xa7\x43\x60\x32\x75\x7c\xce\xd3\xf1\xc2\x6d\x9f\x7c\x26\xa2\x5a\xb9\xf4\x7c\xf7\x79\x84\x85\x7e\x13\xe8\xb7\xe3\x5f\x3a\x1d\x29\x10\x91\x97\xbb\x50\x6d\xe4\x38\xf1\x02\x99\xbf\x16\x42\xa5\xf0\xf9\x4c\x5e\x36\x85\x0f\x84\x34\x8b\x14\xb6\x12\x32\x55\x92\x5e\xdf\x46\xb3\x44\xa1\x8b\xe2\x75\xf4\x34\x7a\x70\x2c\x35\x81\x43\x95\xfc\xbd\x94\x8e\xa3\x31\xfc\xca\xc4\x0f\xd4\x11\x02\x0b\x30\xaf\xca\x8a\xda\x53\x4e\x26\x4f\x80\x01\x45\x85\x83\x9b\xf2\x79\x5d\x55\x65\x75\x5b\x8f\x4c\xb2\x88\xe6\x84\x6a\x2f\x77\x75\xcc\x8a\x47\xa8\x4f\x79\x73\x39\xee\x1a\x9f\x9d\x93\x04\xd3\xe2\x4c\x95\xae\xbc\x3a\x22\xfe\x6a\x4e\x05\x37\xbe\xdf\xbe\x6f\xcf\x7d\x80\xde\x13\x88\x68\xae\x02\x2c\x5d\x3e\x40\x71\x5e\xf8\x9e\x7d\x7f\x74\xcc\x29\x3e\x1f\xff\xd6\xf5\x7a\x2f\x63\xfa\xd0\xfc\x63\x4a\x99\x95\xa1\xc3\x15\x4a\x4e\x94\x79\xfe\xe5\x07\xc5\x14\x9b\xa2\xdf\x1e\x17\x0f\xeb\xfd\x76\xbd\xdc\xee\x77\xf7\xfb\x6f\x8f\xf7\x3f\xf7\x3f\x36\x77\xbe\x05\xac\x05\x8f\x85\xdb\x94\xae\xdb\x70\xe6\xae\x36\xef\xae\x93\xe1\x7a\x81\x7e\xa0\x10\x0c\x7c\x9f\xe8\x15\xe1\x3f\xe7\x35\x21\x2d\x93\xc8\x60\x09\xe5\xd4\x8c\x66\x84\x0e\x65\xe2\x66\xc4\xc2\x7a\x98\xff\x62\x8a\x6b\x66\x10\xe4\xd0\x6d\x64\x45\x93\xfd\xe7\x04\x97\x74\xd4\xfc\xa7\xb4\x42\x59\x12\xac\xe0\x94\x65\x23\xcb\x8f\xc9\x54\x82\x80\x0f\xdc\x78\xd7\xb5\x12\x47\xf8\x2e\x1a\xf5\xb2\x14\x79\x3e\x0d\x73\x34\xf0\xd0\xe0\xaa\x20\xaa\xb7\x0e\x50\xa5\x21\xe5\x08\x29\x3b\x6f\x80\x4f\x3e\xad\xb4\xe2\x9d\x8e\xd2\x8f\x32\x5f\x58\x95\x87\x09\x90\x47\x1b\x1a\x32\x97\x61\x6d\x1f\x16\x8f\xcb\xd9\x5e\xa5\x36\xca\x82\x24\x4e\x05\xee\x63\x08\xac\x9a\x17\x97\xf3\x1f\x80\x14\xab\x13\x59\xbd\x02\xe3\xa0\xf7\x3d\xf0\xde\xbd\x82\x10\x70\x40\x31\x81\x2e\x4f\x5a\xcc\xb2\xe5\xdd\xe8\x30\x04\xe5\xb0\xe1\x57\xaa\x3c\x1d\xcb\xce\x00\x6a\x59\x76\x8d\x32\x08\x09\x20\x90\x77\xfd\x01\xea\x74\x8e\x0c\x80\x48\x1b\x8c\xe8\x0b\x78\xdf\x81\x70\x1d\x7b\x3d\x69\x82\xff\x85\x7f\x06\xa7\xb3\x3f\x14\x7f\x01\x56\x3b\x46\xeb\x03\x10\x62\xf9\x8d\xa6\x2a\x0f\x2e\x60\xfb\x26\x1a\x78\x17\x93\xb6\x00\x10\x4e\xf1\xca\x2b\x7c\xcb\x07\xa1\x38\x10\xae\xb0\x7a\x89\x3b\xca\x4d\x29\xf4\xb9\x1a\xad\x1f\x09\x09\x17\xbd\x8f\xe6\x56\x14\xe3\x8b\x61\xd2\x3a\xfa\x21\x9e\x65\x5f\x1f\xcf\x7a\x6a\xc0\x5d\x67\x14\xe9\xaa\x6b\x51\x15\x97\x14\x2f\x80\x73\x06\x0e\x14\x7f\x5b\x16\xed\xdc\x9a\xf7\xe5\x99\x5c\x22\x8f\x83\x30\xea\xdb\x15\x23\xc8\xb0\x1b\x12\x87\x96\x6e\xeb\x95\x94\xd7\x03\x44\x37\xc4\xd4\x32\xf5\xda\xc8\x5e\x1c\x17\xcd\x4f\xc8\xa6\x1f\x07\x6d\x81\x12\x27\x79\xc8\x1a\x84\x00\x4e\x06\x18\x0b\x01\xb4\x41\xbf\x9d\x29\xa5\xcd\xbe\xc7\xd7\x9a\x30\x6b\xa5\xf4\x0c\xcd\xfe\x35\x2b\x9e\xad\xf2\xad\xbf\x92\x44\x06\x89\xf5\x6b\x78\x80\xba\x1c\xae\x39\x90\xc8\xa4\xf3\x60\xb2\x96\xf5\x03\x85\xa6\xf9\xdb\x99\x68\x13\xbb\x88\x63\x7f\x74\x16\x74\x1d\xfa\x76\x3c\x34\x0d\x0c\xaa\xad\x1f\x50\xab\x15\x6e\x8b\xe6\x38\x7e\xcc\x29\x4f\x91\xcd\x87\x6f\xeb\xa6\xae\x4f\x53\x12\x34\x08\xa2\x95\x03\x0a\x5d\x44\xd1\x80\x88\x45\xe4\x9e\xf0\x15\x36\xea\x5e\xc6\x98\x75\x10\x89\x45\xcd\x5b\x70\x3e\xf2\x13\x9f\xb2\xa2\xf9\x6d\x6e\xeb\x00\xc9\xac\x3c\xed\x21\x3b\x2f\x5f\x4f\x46\x72\x1a\x63\xa7\x65\x79\xd7\xfb\xc8\x13\x80\x28\xc2\xc7\x66\xd5\x7f\xbf\x55\x70\x81\x00\x0e\x20\x43\x6a\x9b\x71\x96\xa9\xe9\x4f\x60\x18\x4f\x1d\x6f\x05\x4b\x84\xbb\x0a\x4d\x2f\x27\x42\x4c\x83\x9d\xc7\x04\x09\x89\x6c\x15\xc6\x9a\x6e\xef\x1d\xdf\x75\xb3\x1a\xdf\x2a\x13\x6a\x81\xb4\xbe\xab\xec\x1f\x7f\xdd\xc4\xb8\xfd\x98\xc1\xa2\x87\xcf\xf5\x9c\xbb\xc3\x42\x1f\x2e\x01\xe3\x4d\xa4\xad\x71\xd3\x54\x4b\xe2\x67\xd6\xbc\x7c\xcf\x0a\xa4\x30\xda\x1e\xe0\x4e\x64\xf9\x6f\xe3\xcf\x42\x8c\xc4\xf4\x46\xbc\x82\x95\xde\x1e\x9f\x9b\x04\x36\x5b\x79\x86\xe6\x4e\x54\xaa\x9c\x1e\x0e\x53\x9c\xa2\x57\x67\x1d\x5e\x3f\x20\x8a\x11\x8b\x7e\x0d\x70\x18\xc0\x95\x0d\x21\x94\xda\xcc\x54\xe8\x4e\xed\x6d\xfe\xe7\x11\xa6\x50\x50\xfe\x1d\xe4\x08\xb5\x6d\x48\x4c\xb0\xe0\xd7\x8c\x72\x3c\x43\xa9\x4d\x87\x0f\x59\x61\x5f\xb5\xac\x78\xee\x9b\x81\x17\xbe\x84\xd2\x80\x8b\xbe\x34\xd3\x95\xcc\xba\x93\xc6\x11\x06\xc6\xb7\x0f\x3e\xd2\x32\x2c\x90\x08\x1a\x87\x8f\x06\x06\xee\x64\xc4\xc4\x41\xdc\xf7\xb7\xba\x3e\xff\xf8\xfb\x62\x95\xe2\x82\xf6\x54\x43\x85\x2d\x7e\xff\xe1\x24\xb1\x70\x3c\x2c\x7a\x35\x22\x7f\xcc\x9e\x07\xb2\xcb\xed\x71\x1d\x39\xec\x59\x33\x83\xc3\x35\x09\x24\x1d\x7f\xaf\x76\x40\xd7\x4d\x61\xca\x31\x43\xc3\xa4\x29\xc5\x17\x19\xed\xb4\xac\x83\xf3\x28\x75\x31\xa9\x24\xdc\x05\xb1\x6d\x26\xdd\xb9\x8d\xbb\xc3\xa2\x8d\xaa\x7d\x82\x8f\x7a\x3f\x03\x90\xa2\x91\x21\x04\xc3\x49\xbc\x7c\x19\x28\x6a\xfa\x31\x29\x20\xe8\xec\x35\xcb\xf3\x2d\xe4\x66\x7a\x58\x84\xc8\x6f\xdb\x23\x63\xed\xf9\xa5\xe9\x50\xd8\xdd\x25\x4a\x63\xc5\x09\x6a\xeb\x14\x34\x59\xaa\x8d\x62\x1c\xa1\x0e\xfe\x22\x9e\x0a\x94\x38\xee\x32\x3d\xa3\x98\xc1\x45\xc1\x12\xa9\xe1\xe1\x54\x0d\x44\x2b\xc7\x77\x43\x71\xc2\x7b\xdb\x66\x8b\x93\x45\xcf\x93\xee\x5c\xc6\x20\xfb\xfd\xfe\x38\x5b\xe1\xf8\x35\x4a\x72\xca\x80\x9e\xd4\xd3\xe6\x67\xad\x0e\x38\x16\x8c\x74\xe9\x3a\xd9\xd7\xd3\x6c\xc5\x68\x1a\x20\xf0\xb9\x13\x8e\xf9\xcf\x09\xaa\x4e\x8d\x0f\xbf\xed\x9f\xf4\x5f\xd3\xf3\xa6\x24\x75\x61\xd8\x95\x67\x0b\x75\x9e\x38\xc4\x68\x69\x73\xd0\xab\xdd\x76\xd9\xff\x4d\x22\x8d\x76\xb5\x5e\x6e\x6e\x17\x37\x7b\xeb\xac\xe5\x8f\x1a\x96\x60\xeb\xce\x8a\x8c\x60\xb4\xeb\xed\x8a\xba\xb5\x95\x06\x81\xe0\xda\xf6\xec\x7e\x81\xd8\xf1\xe3\x75\x80\x1d\xda\x07\xd7\xcc\xba\x98\x5b\xbb\xf1\xa1\x8a\xb0\x54\x5a\x9f\xa4\x65\x93\x1c\xbe\x12\x67\x9f\x7c\x38\x92\x09\xf6\xba\x3a\x37\x60\xdb\xb9\x45\x34\xca\xc6\x4c\xf3\x88\xb9\x7a\x00\x0d\x48\x64\x90\xbc\xd1\x80\x70\x1a\xf7\x61\x34\x34\x80\xa4\x01\x15\x12\xd7\x21\x25\x72\xe5\x8d\x13\xdc\x6f\x3b\x4f\x59\x69\xc0\x48\x84\x51\xf5\xde\xd2\x1b\xd4\xbc\x38\x03\x0d\x58\x2c\xb0\x3b\x5e\x95\x79\x3e\x82\x43\xd0\x80\x09\xa0\x41\xc7\x87\xdb\x9e\xa4\xd5\x4d\x9f\x20\x99\x68\xc0\x34\xe0\x0b\x29\xf2\x77\xf1\x59\xa3\x28\x55\x33\x1d\xc3\x99\xe4\x5e\xec\xe7\x20\xf2\xdc\x2a\x9c\xf8\x83\x71\x82\x9c\xfc\x59\xc2\xda\xf0\x47\xf1\x94\xe1\x3d\x90\x28\x12\x66\xb1\x63\x1d\x2e\x1d\x0f\x2b\x4b\xf9\x5f\x23\x0d\xf1\xb1\x13\x2b\xa3\x01\x07\x82\x29\x52\x9d\x15\xcf\xb9\xad\x3b\x7e\x13\x75\x9f\x0d\xd0\x20\x0e\x02\x9c\xa7\x5b\xd1\x94\xea\x25\xa3\xdd\xdf\x99\x92\x7a\xa0\xaa\x60\xeb\x04\x30\xfd\x85\x09\xb1\xee\xc7\xdf\x27\x6e\x48\x34\x48\x18\xa3\xa9\xa7\x2e\x2e\xbe\x2e\x6e\xd0\x20\xe9\x33\xdd\xdb\xac\xc8\xda\x90\x74\x8d\x5a\x46\xc3\x70\x8a\x06\x89\x89\x49\x67\xb1\x54\xa2\x09\x89\x3b\x92\x32\x86\xc2\xce\x59\x7d\x57\x36\xab\xd3\x31\x47\xe7\x4a\xcb\x0b\x1b\x1b\x92\xd1\x20\x4d\x99\x8f\xda\xdc\x59\x3a\x82\xd3\x68\xb5\xa0\x81\x88\x68\xac\x3a\xe2\x49\xf5\x89\x77\x6e\x74\x45\x22\xb6\x57\x34\x64\x51\x5d\xee\xc3\xd3\x40\x68\xe9\x2d\x7a\xd7\x1f\xc7\xb2\x42\x06\xaf\xa8\xfc\xce\x4a\x03\xad\x68\xe2\xd4\x68\xd6\x07\x91\xe5\x43\x93\xb4\xbf\x8d\xaf\x4e\x6b\x8d\x15\x9e\x5b\x10\x8d\xc5\x49\x21\xc1\xdc\xb1\xfe\xca\x79\x7c\x2c\x0d\xb4\x89\xb0\x7c\x6e\x85\x51\x9f\xac\xc6\xa4\xff\x7a\xa0\x36\x00\x12\x56\xbc\x00\xb6\xe8\xbf\xe6\x97\xc7\x7e\x6d\x02\xea\x2c\x8a\xac\x57\x16\x96\x7c\x47\xed\x4d\x1a\x80\x60\xcc\xea\xbe\x5e\x8b\xb7\xb2\x72\x12\x2c\xf3\x3f\xc5\x50\x03\xae\x04\x71\x85\x77\x26\xb3\xd4\x72\xa7\x7c\x36\xfe\x01\x86\xa5\x48\x09\x7b\xcf\x0a\xeb\xf7\xa4\x5e\x51\xf1\x47\x4e\x76\xff\x76\x24\x50\x9f\x32\x88\x3c\xdf\x17\xa7\xc3\x3e\x87\x37\xc8\xbb\xb7\xd0\x80\x41\x89\xca\xdb\xdb\x5b\x39\x16\xc3\xfa\x45\x7d\xea\xcb\xb8\x95\x86\x41\x10\x60\x5c\xec\x77\xdb\x1b\x78\xb6\x96\x6a\x59\xf1\x0c\x85\xfa\xb4\xb5\x4f\x3f\x98\x00\xb8\x92\x61\xf7\xfd\xe7\x26\x41\x34\x0c\x28\x8b\x84\x07\x45\xda\x5b\x3e\x08\x86\x68\x18\x70\x85\xd6\x4c\x7e\x5b\x2e\xd6\x1f\x33\x28\x49\x1a\x06\x71\x84\xd4\xf0\x3a\x7b\x2e\xa0\x0a\xbb\x8f\x2b\x89\xcf\x14\x21\x50\xf5\x23\xcc\xfb\x63\xd2\x30\x00\xeb\x00\x73\xea\x38\x32\x3d\xbe\xd2\x0f\x31\x80\x6c\xe0\xd5\xe6\xc7\x66\xeb\xf7\x3d\x1a\x86\x11\xc1\x18\x71\x71\xf7\xc7\x70\xb1\x08\xc3\xd8\xaa\xa2\x75\x3b\x9d\x6f\x87\xfb\xe3\xa9\xf6\x6d\xee\x2d\xe4\xf9\x35\xc0\xd5\x71\x32\x2b\xc2\x50\x25\xd6\x22\xc8\x4a\x00\x3a\x44\xc5\xec\x74\x0b\x43\x25\xbd\x91\xc8\x75\x05\x80\xb1\xc2\xdc\x0d\x8f\xa2\x94\x45\x7e\x11\xeb\xce\x35\xfe\x67\xb0\x54\x87\x51\xcc\x71\xd1\xfb\xfb\x9b\x38\xd7\x1e\xa5\x61\x24\x42\xa6\x7a\x3b\xcd\x02\x54\x0f\x35\x6c\x8f\xd2\x2e\x25\xb6\x61\xfa\x7a\x86\x11\x44\x43\x42\x34\x56\xea\x77\xdd\x6d\x25\x3c\x06\xe5\x6b\xf1\x1f\xcb\xc5\x83\x3f\x40\x83\x18\x75\x08\xf6\x4e\x49\xf6\xec\x39\x51\x96\x04\x49\xff\x1a\x4f\x7c\x20\x68\xc8\x38\x0b\xc0\x46\x3e\xae\x52\xec\x0f\x48\xad\x1d\x2f\x7e\xf1\x3b\x20\x7e\x7d\x22\x89\x38\x1b\xa3\xd1\x90\x9b\x14\x3f\xe8\x83\x8e\xad\x30\x90\xcf\xcb\x21\xd1\x30\xa6\x84\x58\x40\x4d\x6e\xbe\x7f\xca\x2a\xd3\x0e\x3e\x75\x69\xbc\xb1\x4e\x02\x42\x6b\x8b\xbc\xfb\x3a\x02\x0a\x13\x66\x3d\x70\xbe\x8b\xe3\xf1\xf3\x2a\xab\x9a\x17\x3d\x02\x02\xd1\x30\x49\x42\x04\x88\x59\x15\xd7\x8d\x2a\xfd\x81\x34\x60\x18\x02\xaf\x40\x9e\x9e\x37\x5d\x4a\xef\x8f\x86\x11\x16\xeb\xb7\xf7\xcb\xcd\xe2\xe6\x8f\xab\xfb\xa7\xbb\xdd\x9f\xfe\xa3\x32\xe5\x28\xd0\x61\x11\x58\x2e\xfe\xf0\x56\x31\xe3\xe7\x23\x53\x85\x43\xb1\x42\xf8\xcb\xdd\x25\x94\x4a\x22\x00\xa1\x4d\xc0\x54\x19\xf9\x2f\x54\xc4\x66\x86\x47\x0b\xa9\xb7\x6b\xc2\xb6\xcc\x75\x37\x40\x25\xa1\x0d\xfd\x21\x53\xa5\xac\x2c\xe8\xc6\x5e\x5f\xf8\xa0\xba\x05\x46\x81\xc4\xce\xb2\xf3\x9c\x72\x32\x3c\x6b\xa1\x5e\x96\x2f\xe5\xc5\x70\x2b\x34\x21\x41\x10\xa6\xb0\x78\xdf\xff\xc2\x0a\x8e\x79\xf9\x39\xf9\xad\x86\x01\x76\x87\xca\x43\x2d\xb2\x4a\x1c\xbc\x71\x07\x0d\x0d\xe7\xb6\x01\x58\xfa\x60\x6d\xb4\xa1\x47\x11\x04\xd4\xbf\xce\x9d\x9a\xbf\x9f\xaa\x51\x04\x1a\x4b\x7a\x16\x91\x7d\x09\x8f\xf1\xe5\xac\x8d\x22\x13\x23\x62\x0b\xdf\x93\x2d\x14\x6a\x22\x48\x48\x23\x12\x42\xec\xba\x3a\xb7\x9f\xbe\xee\x5a\x81\xfe\xd9\xd5\x94\x68\x44\x78\x82\xeb\xfc\xf6\x24\xaf\xab\xf2\xe0\xe9\x86\x93\x95\x2c\x22\x22\x46\xee\xb2\xb7\xed\xb0\x2a\x2e\x93\x41\x94\x46\x18\xa0\xa1\x29\x1b\x88\x03\x2a\x59\x63\x83\xc4\x7f\x1b\x65\x54\xd9\x22\xcf\x2a\x7b\xf6\x2c\xe8\xd0\x1f\x8c\xad\x1a\xaf\x2d\xb5\xaf\xae\xe6\xca\xda\x34\x62\x44\xb8\xfe\xf0\x66\x79\x3f\x32\x54\xa5\x11\xe3\x42\xf6\x3d\xed\x7f\x9c\xca\xbe\xdf\x30\x1f\xee\x47\x9c\x29\x9a\xf4\xe6\x40\xbb\xa9\xcf\x12\x8d\x62\x62\x55\xc7\xfd\xae\x19\x4d\x7e\x74\x92\x52\xee\x35\x24\x8b\xd3\x71\xba\x9c\x45\x09\xc4\xb2\x33\x64\xbf\x2e\xab\x3b\x78\x5f\x09\x1f\x5a\x45\x29\x09\x10\xb8\x77\x04\x78\xc5\xb6\x82\x3f\x20\x63\x88\xc3\x01\xb4\xf9\xe6\xdc\x1d\x94\x46\x32\xb1\x24\xc4\x1a\x2b\x00\xbb\x6c\x1a\x6c\x44\x52\x24\xda\x05\x1b\xdf\xa0\x08\x36\x3f\xba\x19\x28\xb5\x2d\x92\x7d\x83\x02\xea\xac\xb6\xeb\xec\x03\x54\x57\x43\x09\x6a\x37\x56\x85\x31\x02\x35\xf1\xe1\xbb\x27\x3a\x15\xaf\xa7\x91\x12\xcc\x3a\x8f\xb7\x49\x0e\xd6\x2b\x46\x05\x0d\x1a\xe9\x34\x4c\x58\x37\xc0\x15\x3e\x16\x8d\x95\x9f\x43\xa6\x43\x3f\x52\x58\x9c\xd8\x4b\xfb\xba\xa3\x84\x24\x88\x6a\x8a\xb9\xa3\x11\x04\x91\x17\x52\x6e\xaa\x13\x60\x18\x35\xb9\x76\x60\x76\x7f\x73\x94\xd4\xd3\x61\xba\x58\xe1\x5e\x39\x5a\xb2\x48\x10\x25\x18\x8b\xac\x77\x7f\x8e\xcf\x46\x82\xc8\x4a\xfd\x1d\x32\xdc\x05\x31\x79\x42\xb5\xae\xdf\xfc\x00\xae\xb0\x0d\x75\xcc\x85\x02\x2f\xdb\x7b\x16\xaa\x92\x20\x85\x34\xee\x30\xf2\x03\x59\x28\x4a\x02\x13\x23\x2f\x63\x97\x35\xc8\x10\xff\xc2\xc4\xee\x97\xb8\x42\x4a\xc2\x20\xa2\x8e\x67\xe0\x44\x33\xb0\x9c\x35\x9d\x49\x24\x14\x81\xb4\x46\xa8\x16\x99\xdd\x86\x34\x83\xad\xea\x57\xdc\x51\x4a\xa2\x20\x40\x77\xa1\xd7\xac\x69\x32\xa8\xc7\x78\x09\x4a\xa2\x90\x62\x6b\x3e\xc3\x0e\x3b\x9a\x5d\x39\xcf\xe2\x75\xa1\xbb\x15\x8b\x10\x0a\x69\xaf\xb7\xd1\x09\x03\x82\x3e\x33\x85\xa7\x84\x30\xab\x66\x8e\x75\x6c\xdc\x44\xfc\xe6\x42\x18\x35\x88\x0c\x5b\x5c\x2d\xbb\x3f\x69\xdb\xe1\x6e\xd3\xb8\xbf\x97\x99\x77\x55\x18\x0a\x0f\x9d\x6d\x12\x84\x01\x43\x17\x88\x02\xde\x97\x2f\x59\x8f\x05\x3c\x1b\x66\x65\x64\x85\xd6\xa7\xfa\x82\xe6\x07\x25\x31\x67\xb8\x51\xe1\xd3\xb6\xc5\xde\xd9\x6e\x4b\x3b\xd2\x42\x22\xba\xbd\xe9\xea\x54\x4d\x21\x55\x94\x24\x2a\xc6\x5c\x06\xcd\x53\x41\xbb\x36\xd5\xc5\x26\xb6\xfb\x54\x9a\x02\x56\xc1\x54\x59\xd4\xa8\x3b\x68\xdf\x3e\xcc\x36\x3b\xea\x1a\x25\xa9\xa4\x68\x90\xf4\xb8\x7d\xb8\xd9\xed\x7d\xf2\x4e\x44\x62\xcd\xd7\x9f\xa1\x79\x6a\xef\x5b\xff\x77\x8d\xb8\x5f\x84\xb4\x24\x49\x32\x8c\x57\x88\x10\xf6\xa5\x31\x79\xf9\xde\xfd\x4d\x52\xaf\x5b\x60\x6d\xf3\xda\xe7\x32\x14\x1b\x6f\x87\xf0\x44\x4e\x02\xe2\x8e\xd4\x3c\x31\xed\x1b\xdf\x19\xa9\x63\xb0\xf2\x4c\x35\x54\xcd\x39\x1c\x8d\x12\x15\x84\x78\xee\x6f\xa2\x3a\x69\x31\xba\x5a\x2d\x01\xd9\x30\x59\xed\xc0\x7c\x56\x73\x52\xcf\x69\xbe\x50\xa2\x8d\x8c\xed\x84\x6d\xb7\x56\x91\x7b\xa3\x4e\x77\x18\x8c\x42\x0d\xe9\x9f\x65\xd5\xbc\xe4\xe8\x1c\x39\xf8\x2a\x43\x84\xd7\x2f\x5a\xe4\xf9\x15\x34\x9b\x55\xf7\xeb\x0d\x0d\x70\x0e\x78\xbb\x59\xdb\xf3\xdc\x3a\x79\x87\x4d\xf7\xc6\x18\x63\x8b\xc9\x1a\xf4\x49\x35\xf5\x8b\xa8\xce\x65\x37\xed\x50\x1a\x50\x8e\x1d\xf9\x36\x8d\xcf\x91\x13\x30\x5e\x4e\x69\xc0\x0d\x3e\xf4\xfa\x45\x90\x55\xa9\xea\xe9\xe1\xd4\x12\x7b\xef\xdf\xb1\xf7\xe2\x73\x34\x1a\xa4\x80\x70\xdc\xbd\x6f\xb8\xdc\xc1\xfb\x56\x68\xfd\xeb\x84\xd5\x9d\x20\x04\x85\x27\x1e\x94\x09\xdc\x91\x28\xa1\x34\xf0\xeb\xa4\xf7\xe8\x7a\x14\x0d\xdc\x66\x83\x0b\x88\x44\xc2\x5d\xac\x75\xd5\xa8\xeb\xb2\x7a\xb5\x80\x53\x77\x98\x28\x4e\x7b\xcb\xd8\xf5\xfa\x76\x86\x66\x4c\x29\x0d\x13\x8c\x3e\x0a\x78\xff\xfd\xa4\xcb\x1a\xdd\x0c\xe7\xe4\xbc\xbe\x7c\xbf\x28\x8b\x0c\xde\x0c\xd7\x29\xbd\xcd\xba\xc9\x40\x19\xb7\x46\x98\x4f\xdb\x55\x53\x86\xeb\xdd\xf7\xee\x40\x6c\xd5\x80\xd6\x1f\xd6\xf5\x37\x13\xf9\x58\xe6\xd0\xb5\x54\xfd\x78\x1e\x30\x84\xd6\xae\x77\xd7\x79\x59\x56\x13\x56\xaa\x1f\x14\x32\xe4\xac\x9f\x8a\x76\x2d\xef\x3e\x2a\x85\x33\x60\x6c\xb2\x4a\x54\x3e\xdc\x2b\xbb\x9b\x15\x33\x9d\xb8\x17\x73\xfd\xb8\x8c\xa3\xb0\x7d\x29\x27\xd1\x20\x8d\x45\x8c\x30\x53\xa1\xf5\xa6\x40\x0f\xe1\x9b\xa9\x7c\x2b\xa5\x09\xa1\xdd\x99\xde\xa0\x68\x7a\x88\x1b\xa5\x09\x95\x58\xd7\xf7\xcd\xe2\x6d\xf6\xd1\x1d\xe2\x14\xa5\x3e\x96\x65\x51\x43\xd1\x78\x89\x47\x7f\x54\xc5\xba\x67\x8f\x7e\xcf\xea\xa6\x83\x58\xcf\x57\x3d\x68\x02\x8a\x76\xf1\xd7\x6d\x1b\x62\x5d\x61\x9c\x35\x59\xa4\xff\x19\x3a\xfb\x1c\x4a\xd3\x28\xc5\x90\x78\xb9\xdb\x7e\x95\xd9\xd0\x94\x24\xb1\x7b\x7d\xaf\xb3\x1c\x6e\x7c\x3c\x34\x7e\x6b\x52\xc3\xb1\x06\xb0\xb7\x5a\x4f\x17\xe4\xe6\x29\x95\x09\x49\xb8\xf7\xfe\xfa\x13\x44\x65\xb7\xc7\xee\xc1\x48\xa5\x50\x2d\x0d\x0b\x24\x9d\x8c\x4c\x1b\xb3\x5f\x6c\x5b\x5e\x7a\xfb\x46\xb7\xab\x3b\xbd\x8e\x6d\xed\x38\x1f\x2b\xa7\x74\x17\xa0\x02\xad\x99\xdf\x0c\x67\xec\xd7\xfe\xff\xfe\xf7\x4c\xc5\x93\x52\xc5\x00\x89\xd5\xb7\x59\x51\x76\xd7\xc1\x2c\x69\x19\x6f\x94\xbd\x49\xf7\xa6\xeb\xed\x51\xaa\x54\x24\xbd\x90\x77\x9e\x5f\x65\xba\xbe\xfa\x5c\xe8\x53\x31\x71\x46\xa0\x54\x87\xe0\x79\x78\x4b\x81\x11\x8f\xd7\x70\xec\x1e\x9e\x4e\x59\x6c\x95\x95\x2c\x18\x73\xe8\x5a\x40\x29\x44\x04\xf5\xe0\xd1\xa9\x34\xcf\x9e\x3b\x9b\xc0\x09\x5c\x93\x52\x50\x96\x5c\x60\x39\xc6\xd6\xb4\xa5\xbf\x64\x16\x04\x5c\xf2\x2e\x4c\x07\x5b\x67\xbc\x2e\xab\xa5\x98\x08\x6b\x53\x16\x84\x21\xa1\x1d\xe2\x00\xf6\xaf\x9f\x6a\x8f\x76\x2c\x7b\x0d\x45\x89\xe6\xeb\x93\x06\x13\x65\x21\x0f\xbc\xe6\x67\xfb\x2b\x87\xf5\x39\x16\x11\x25\xd5\x80\x02\xd3\x39\x82\xd7\xdd\x08\xc3\xb0\x81\x71\x3c\x4d\x68\x29\x5e\x65\x97\x32\x92\x5a\xe7\x88\x67\x68\xee\x4f\x37\x99\x28\x50\xf4\x49\x8d\xdb\x18\x8c\x45\x02\x51\x7e\x3d\xfb\x6f\x2a\x51\x32\xbe\x6c\x46\x84\xb7\xc0\xf5\x5e\x18\xc3\xde\x87\x1f\xc5\x03\x6c\x52\x66\xaa\x5c\x96\x87\x63\x0e\x0d\x5c\x75\xc7\xd2\x10\x8b\x50\x59\x31\x94\xba\xb9\x2d\xbb\xda\x32\xe3\x41\x8c\xab\x24\xd6\x94\x1f\xaa\xb2\x34\xf7\xe6\xe9\x98\x67\x05\xa0\x45\xe3\x2f\x0a\xab\xbf\x92\xed\x76\x5f\x12\x53\x83\x61\xe4\x1f\xd7\xb7\x83\x0a\x07\x4b\x52\xdb\x60\x16\x5a\x3f\x96\x39\x0c\xad\xc3\x67\x97\x32\x96\x46\x14\xe9\xec\x59\x61\x3a\x72\xba\x8f\x79\x59\x4a\x23\xd5\xbb\xf9\x5f\x0d\x68\x74\xc3\x45\x8b\xa5\xd2\x62\xec\xdb\xf7\xfb\x0e\xde\xbb\x4f\xeb\x48\x0a\xef\x00\x9d\x5b\xc2\x87\xc7\x82\xfb\x21\x46\x62\xbb\xf9\x54\x1c\x85\x7a\xdd\x6b\xd1\x88\xfd\x73\x55\x9e\x8e\xb5\xab\x33\x0d\xf1\x7f\x94\x89\x50\xe0\x2a\x7a\xb3\xd8\xee\x76\x8f\x9b\xc5\x4d\x18\x11\x7f\x2a\x41\x92\x34\xfd\x9f\xff\xf7\x3f\x9b\xa2\x3e\x55\xd0\xc9\xa5\x50\x26\x28\xc5\xaa\xca\xbb\x83\x17\xf9\x09\x26\x98\x01\x67\xce\xe4\xfc\xd5\x3e\xe7\xbc\x4c\xba\xe1\x09\xd8\x6a\x70\x7b\x61\x78\x57\xc7\xaf\x3e\x13\x8a\x07\x18\x92\x66\x1f\xa3\x06\x01\x93\x91\x6d\x6c\x39\x2f\x01\xd7\x8b\x19\x10\xe7\x29\x93\x44\x63\x7b\xa5\x80\xf7\xb1\x13\xe1\x7c\xb2\xf4\x65\xb8\xc0\xa4\x62\x94\x3a\x8f\x7d\xdb\x9f\x6c\xc3\xc0\x11\x9b\x90\x32\x95\x58\xc3\xae\xda\x46\xc2\xff\x85\xdd\xc7\xe4\x0d\x57\x42\x63\x18\x7a\xaa\x31\x3c\xfc\xba\xc4\xc8\x74\x18\xe2\x93\xbc\x29\x9b\x06\xaa\x4f\xd4\x19\x71\x64\xb1\x51\x73\x94\xfa\xf1\x22\x40\x13\x45\xe4\x81\x8a\xba\x46\x83\xab\xf3\xbc\x99\x41\x64\xd2\x21\xd7\x68\x2d\xaa\x36\xb4\xaf\x77\xe5\x30\xc3\x65\x40\x68\x68\x39\x36\x87\xac\x78\x74\xce\xc0\xab\xb2\x18\x12\x0e\x29\x03\x63\xcd\xab\x6d\x82\x52\x03\xfc\x35\xac\x2c\x65\xa6\xcd\xfa\x6d\x86\xa3\xf2\x93\x86\x1f\x65\x33\xd5\xe6\xa5\xcc\xb0\x04\x2b\x45\x0b\xa5\x00\xea\xba\xac\x3e\x7f\x56\xe2\x78\x84\x2a\x8e\x7c\x58\xc9\xc3\x20\x4c\xdc\xfe\x70\x7d\x82\xbc\xde\x74\x9b\x31\x0f\x99\xc4\x00\x68\xaf\xb3\x5a\x65\xc7\x1c\x7e\x60\x31\xf6\x62\xb9\x91\x87\x82\xa1\x90\xe8\xe2\xb1\x5b\xf5\x79\x14\x11\xac\x64\x2d\x4b\x55\xf6\x08\xb3\x4b\x6f\x3f\x8f\x0c\x41\x7b\x3c\xf8\x00\xd5\xbe\xfd\xdf\x84\x2b\x3d\x5c\x50\x64\x9f\x5c\x01\x49\xad\x09\xed\xd5\x7f\x9a\xfd\x30\x0b\xe1\x44\x31\x65\x89\x8b\x0d\x38\xea\x67\x6f\x45\x41\x39\xd1\xb1\x05\x30\x88\x46\x48\x51\xc3\xaa\x7c\x2f\xf2\x52\xe8\xa7\xca\x07\x95\x9c\xf2\x90\x7b\xb3\x44\xd1\x88\x4b\xbe\x20\x94\x53\x61\xb8\xe8\x9a\x0d\xc7\xe9\x3b\xec\x47\x01\x45\x8e\xc2\x73\x25\x9c\x62\x0a\x82\x7d\xca\x62\x28\x0c\x38\x39\x33\xd3\x16\xa6\x5b\xa1\x4e\xc0\xe4\x84\x3c\xb5\x3a\x0f\x98\x45\xfc\x0e\x9f\x93\xd5\x80\x73\x13\x20\x74\x6d\xf5\xb8\xf8\xdd\xa7\xba\x3c\xe1\x96\xa0\xe7\x37\xc6\xf1\x66\xc6\x93\x94\xab\xa0\x4b\x60\xa1\xba\x79\x0b\x27\xdf\x9a\x48\x6a\xf1\x26\x1f\x0e\xe1\xe3\xb5\x82\xa7\x97\x97\x0a\xc6\x5c\xa2\xeb\xfa\x15\x9b\xd5\xd9\x10\x25\xbd\xe0\xf0\x52\x54\xda\xaf\xfa\x3c\x35\x56\xe7\xca\xd7\x65\xcf\x0d\x0c\x29\x17\x91\xc1\xa2\xca\xd1\xe6\xa6\x57\xa2\x78\xf5\x1f\x17\x24\xd6\x56\x02\xb3\xcd\x99\xec\xee\x39\x8e\x5f\xb9\x24\x16\x76\x35\x8f\x4e\x99\x89\x8b\xb9\x8c\x2d\xc3\xc7\x2b\xe7\x38\xb3\xd8\xf1\x2f\x92\x71\x4a\xc6\x20\x7a\x3d\x44\xd1\x53\x2e\x8d\x46\x06\x0d\xb4\xb9\xc3\xd5\xa9\x9a\x87\xd6\x51\xae\x42\xe1\xe1\x9e\x77\xf0\xd1\xeb\xb7\x5c\x95\x1d\x1e\x81\xab\x94\x21\xdc\x7f\x7b\xba\xbb\xde\xf5\x7f\xe4\x90\xda\x3d\xe5\xfa\xfc\xa6\x29\x21\x31\x2e\xaa\x9d\x56\xf0\x30\x14\x73\xab\xe3\x24\x9e\x9e\x7c\xde\x58\x37\x3c\x74\x24\xb3\xce\x04\xf3\xd7\x0f\x89\xc2\x36\x73\x1b\x78\x8b\xaa\xde\x14\xc6\x47\xba\xdc\x44\x20\xdd\xba\xeb\x62\xbc\x0a\x14\x64\x6f\xa0\x07\x90\x1c\x6e\x58\x9a\x86\x8e\xbe\xb3\x73\x5a\xf2\x3b\x10\x87\x9b\xb3\x42\x2e\x37\x49\x12\x39\x63\xe6\x9f\xed\xa4\xfd\xb4\xfc\x89\x39\xbf\xf1\xaf\x6a\x8b\x36\xfa\xe3\xe3\xa7\x6e\x52\x83\x10\x47\x65\xbb\x10\x3d\x2d\x96\x72\xd3\xa6\x0e\x76\x93\xeb\x16\x71\xfb\xb0\xdb\xec\xb1\x9c\x24\x1a\xdc\x18\x2e\x49\xe7\x99\x83\x33\x7a\x70\x4c\xd0\xbe\x47\x80\x2d\xa8\x3a\x9c\xf5\x07\xff\x8a\x4a\xf3\x7f\xfd\xd7\x7e\x79\x1c\x84\x5a\xf6\x66\x7c\xd8\xe2\x1f\xb6\xac\xe2\x80\x29\x54\xf9\x7a\xb3\xf4\xf9\x9e\x54\x37\x0b\x62\xf2\x1f\x92\xd6\x8a\x5c\xe6\x42\xbd\xb6\x69\xf4\xfa\x71\x19\x45\x64\xfc\xe4\xe2\x90\x1b\x6c\xed\x1d\x7b\xb4\xc7\xdf\x9c\x4a\x96\xaf\xe1\xc6\x61\x1c\x21\x67\xc2\x52\x68\xa7\x7a\xbc\x7e\x90\x00\x0c\xd5\x5f\x44\xa1\x65\x05\xe2\xb5\x3b\x20\xad\x31\x7b\xef\x68\x3f\x4d\x7e\x2f\xa5\x97\xc3\x69\x10\x47\x21\x04\x9e\x9b\x1d\x2c\xf2\x0e\x79\x4d\x63\x22\x0d\x71\x78\x9a\xb5\x45\x7c\x9e\xf5\x91\x63\x62\x18\xc6\x79\xdf\x45\xfd\x72\x6f\x56\x3e\x90\x8f\x29\xd7\x98\x1c\xbf\x66\x79\x6e\x27\xcb\x75\x59\x7d\x43\x99\x79\x3f\x84\x85\xb6\x10\x86\x37\xdf\x93\xbb\x67\xbe\x82\xc5\x46\x58\xa1\x83\xaa\x02\xe5\xec\x08\x9c\x9f\xed\x64\x64\xa2\xac\xbd\x8c\x2d\x91\xae\x9f\x9f\xcf\x9d\xd9\x69\xcc\x54\x88\x7c\x08\xd1\x34\x70\x38\x36\x4e\xee\xf6\xde\x2c\xaa\x26\x53\xf9\x74\x34\x8f\x04\x62\x3b\xa0\x79\xf9\x2e\x0a\x9d\xc3\x66\x20\x86\x32\x5e\x79\x63\x4e\x22\xf0\x69\xdb\x8b\xa8\xe0\xc5\x09\xb7\xb4\x37\xff\xea\x73\x82\x66\x6e\x87\x33\xbc\x47\x0e\xbb\x5e\x2f\x0a\xed\x39\xfe\xf6\x96\x21\xa6\xfc\x97\xd6\x96\xfe\x6c\x1c\x90\x97\x8a\x56\x0e\xf7\xc6\x0c\xc3\xf1\x98\x0b\x40\xa5\x46\x0b\xd6\x88\xf6\x1e\x91\xe5\x9f\x45\x1c\x9a\xc4\x35\xaf\xda\x80\x60\xcf\x46\x00\xa5\x38\xe6\xca\x22\x31\xd6\x43\x6e\x24\x8d\x93\x28\xc0\xba\x2d\xe6\xd3\xe5\xc9\xb9\x68\x0c\x82\x91\x38\x61\x96\xac\xdb\xce\xa1\xe6\xe5\x11\xf2\x6c\x42\xd0\xa7\x71\xc2\xb5\x33\x31\x6d\x5f\x52\xbf\x1e\x8e\xfc\xd8\x68\x9c\x08\x89\xf7\xea\xfb\x9f\xe3\x0b\x10\x0a\x51\x58\xb6\xba\xb4\x7d\x29\xdf\x27\xf7\x38\xd1\xaa\x4f\x49\xdb\x48\x03\x01\xd9\x93\x42\x69\x9c\x86\x41\x68\xbc\xa0\xb1\x95\xbf\x77\x7b\xdb\xd7\xeb\x4b\x1a\x0a\x04\xbe\x3d\xdc\x3f\x3c\x8c\xae\x2b\x35\x01\xf6\xc2\x5d\x45\x7a\x04\xc9\x8b\x46\x62\x8c\xfd\x7f\x7d\x9d\x7e\x8c\x86\xfe\xc5\xac\xd6\x5d\x8c\x10\x29\x8a\xbc\x6f\x57\xf7\xdf\xd6\xbf\xee\xa6\xc5\x42\x0a\xcc\xe9\xe0\x0d\x1e\xa0\x5a\x77\xfd\xc0\x58\x28\x83\xcb\xe5\xc1\x9a\x46\xd8\x4a\x5f\x36\xcd\xd5\x62\x49\xd2\xc8\x39\x80\x0f\x21\xcc\x34\x96\x2c\xc4\x2e\xcf\x4d\xf6\x9f\x13\x7c\x38\x59\xbc\x01\xef\x7d\x7c\xd9\x4a\x00\xda\x71\x3e\xbc\x7c\x7c\x87\x69\x59\x25\x56\x5a\x24\x56\x8b\x12\x74\x8d\x3d\xd0\xeb\x81\x32\x8e\xff\x46\xcd\x64\x67\x63\x82\x2e\x7e\xf7\x7a\xda\x29\x8f\x21\xb2\x81\x61\xa6\x4a\x44\x87\x76\x64\xf2\x69\xdc\x17\x1b\x66\xd0\x86\x66\x5e\xa0\xf8\xeb\xa9\x62\x12\x83\xfa\x3e\xfb\x1a\x0d\xca\xd5\x1c\x59\xd3\x0f\x35\x56\x94\xc2\x6e\x99\x8b\xac\x9a\x11\xc1\xa1\x49\xc0\x00\x61\x85\x8d\xa8\x9e\xa1\x19\x8a\x31\x4e\xc6\xa5\x96\xfe\xa5\xcb\x0e\xe8\x98\x84\x01\x41\xd1\x04\xed\x2e\x64\x64\x66\x47\x93\x90\x02\x36\xaa\x3a\x25\x7e\x5b\x24\x6b\x73\x98\xa1\x26\xf8\x5f\x44\x41\xb8\x93\x46\xcc\xce\xaa\x63\x2e\x3e\xbf\x89\xc3\x85\xbc\x2b\x89\x20\x50\x69\x47\xbd\x73\xe2\x6e\xff\x1d\x53\x7a\xc6\x27\x26\xa1\xc4\x25\xe6\xc7\xfa\xae\xa7\x73\xd1\x84\x10\x4b\xfc\xcf\x54\x79\x56\xe4\x9b\x9e\x81\x31\xec\x4a\x63\x46\xdd\xde\xc8\xde\x56\xca\x8f\x88\x13\xb4\xc4\xea\x8a\x6d\x33\xcb\xf2\xf0\x5f\xbf\xb2\x24\x2c\x48\xb0\xe2\xd8\xbc\x64\x95\x5e\x9d\xa0\xc7\xfb\xd3\x84\xd1\x10\xfb\xa1\xeb\xdd\xf7\xfd\xee\x7e\xff\x73\xbd\xf1\x47\x38\xa7\x28\x36\x67\xca\xea\xf5\xd1\x46\x90\xf3\xc1\x48\xc2\x8d\x24\x4e\xe0\x0c\x75\xb2\xec\xbe\x38\x2a\x98\xcf\xf9\xfc\xba\x4f\xc7\x3a\x8d\x55\x27\xe4\xae\x60\x59\x81\xb6\xed\x0c\xd7\xb3\x9a\xc5\x60\x24\x82\x33\x2c\xa8\x2c\xef\xef\xae\x37\xdf\x3a\x01\x26\x7f\xf5\x32\xb4\x36\x21\xed\xf6\xda\x46\xab\xa7\x0a\x3a\x07\x2f\x9a\x48\x20\x28\x41\x70\x53\x3e\x5f\x65\xfa\xfe\x08\xc5\x17\x0d\xf3\x0b\x19\xf2\xf4\xb8\x3b\x35\xa4\x31\xce\x84\x47\x27\xcd\x30\xfa\xb1\x69\x48\x38\x16\xd2\xb0\xa6\xbf\x55\x2f\xd0\x3d\xde\x34\x14\x21\x8a\xa7\xe0\x8b\xbd\x82\x43\xf9\x55\x1f\xc9\x7f\x46\x07\x26\xec\x79\xe8\x03\x7e\xd7\x54\x37\xbf\xff\x4c\x14\x85\xd8\x37\x5a\x96\x79\x59\x0d\x85\xb0\xc7\x13\x32\x8d\x52\x2e\x98\xab\xf9\x8d\x8b\x7a\x29\x09\x62\xe6\xe5\x08\xe0\x0d\xf2\x65\xd6\x64\xff\x85\xc2\x01\x37\xc6\x5f\x47\x85\x44\x8d\x22\x8c\xb0\xd6\x8b\xd1\x2e\x34\x21\x93\xd2\x94\x9a\x08\x49\x30\x59\x1b\x74\x6c\x4f\x47\xa8\x6e\xa1\xb9\x60\xd6\x4a\x53\x16\x84\xa8\x97\xf5\x54\xe4\xd6\xfb\x6c\x33\xda\x00\xdb\xe3\x32\xf6\x4d\x9c\x15\x1c\xcf\xae\x8d\x05\xda\x5a\xb3\x3a\x67\x90\x3e\x8a\xad\xa7\x23\xa9\x48\x7b\x40\xea\xc4\x79\x63\x3e\x18\x4a\x19\xeb\x38\x75\x3b\x34\x38\x9e\x55\x5a\xa7\x29\x93\x51\x08\x9d\x62\xc7\xa3\xc5\x14\xf9\xd5\xf0\xcb\x9a\x5c\x1a\x87\x09\x62\xf7\x6f\x45\xf5\x3a\xf4\xaa\x6c\x8f\x68\xdd\x39\x2f\xdb\x2d\xc5\x33\xea\x69\x9a\x50\xa1\xff\xbf\xec\x0a\x9d\x3d\xc7\x24\x91\x98\xd6\x59\xd8\x6e\xf7\xb5\x42\x08\x5b\x41\x7c\x76\x65\xcb\xf6\x2b\xa7\x25\xd9\x3e\x49\x4d\x13\x19\x78\x3b\x9a\xad\x85\x98\xa2\xd4\x79\xfb\x29\xeb\x46\x65\xb2\x0b\xe2\xc9\x34\x4d\x14\x0b\x9d\x7e\xfd\x33\x2c\xf3\xb2\x9e\x68\x9e\xd2\x54\x84\x26\xe8\x33\xc6\xed\xc9\x2b\x78\xd1\x54\x90\x18\xcd\x4b\x64\xbb\x84\xd9\xb0\xee\x2d\xcb\xf3\xa9\x99\x36\x4d\x05\x07\x94\x9d\xda\x1f\x7d\xea\x30\xa6\x74\x8c\xef\x8a\x10\x96\x54\x07\xed\xe3\x80\xd3\xc1\x33\x40\xa2\xfd\xf4\xb4\x32\x4d\x2d\x71\xf6\x6d\x79\x6a\x2c\x45\xd0\x1f\x82\x88\xc8\x3e\x61\x9e\xf2\x82\x68\x2a\x59\xc2\x2d\x7f\xa0\xcb\x9a\xbd\xe4\xae\x4f\x39\x53\xc9\x69\x62\x29\xe3\x6f\xe5\x2b\x7c\xab\xc4\xa5\x3c\x33\x55\x21\x00\xe9\xac\x8c\x26\x5a\x7f\x34\x55\x44\x0f\x6c\x64\xda\x95\x02\x17\xb6\x21\x65\x7f\x58\x62\x4f\x55\x12\x07\xca\x57\xa4\x5e\x44\x56\xdc\x80\x7e\xbe\x20\x4f\x43\x53\x25\xb8\x0d\x75\xc4\x73\xf7\x68\x94\x56\xc2\x96\x89\x6e\x4a\xa1\xff\xf8\x05\xc1\x94\xa6\x3a\xe4\xc8\x10\xbe\x72\xc4\xf3\x79\x89\x34\xbf\x7a\xa7\x9a\x68\x74\x5d\x45\xef\xc5\xf6\x05\x2c\x4f\x3e\x72\x4c\x75\x22\xa9\x2d\x11\x3b\x0e\xe1\xed\x29\x6f\xb2\x3a\x7b\xee\x06\x28\x82\x94\x88\x43\xd6\xd7\xad\x53\x90\xf6\x8f\xff\xae\xcb\x62\x29\x26\xba\xfa\x6e\x8c\x89\x43\xac\x1a\xe6\xa2\x6e\xee\x2b\xa1\x5c\x2b\xc5\x9f\xc2\xa4\xd6\x3e\xc5\xa9\x82\x5e\xa0\x69\xd3\xd4\x28\x83\x50\x39\x9b\x01\xb9\xf7\xea\x41\x7c\x5e\x97\x95\x97\x98\x9a\xbf\xd1\x48\xfc\xf2\xe2\xeb\x98\xbb\xf9\xa9\x22\x82\x90\xa2\xab\x44\x7b\x69\xbd\xfb\xe3\x20\x2c\x11\x01\x8d\x50\xa8\xdf\xb2\x7a\x7a\x44\x8e\x7f\x64\x22\x92\xb1\x27\x0f\xd9\x75\x6a\xa8\xb9\x33\xbe\x12\x41\x48\x18\x41\xcf\x68\x81\xdf\xe6\xab\x08\x7e\xb4\x4c\xbc\xe7\xe2\x1d\xbc\x5f\x3b\xdb\x72\x57\x0e\x75\xd9\xb9\x1b\x4a\x05\x73\xf4\xde\x06\x3b\x99\x16\x55\xdd\x5d\x23\x95\x61\x20\x07\xee\x35\x4e\x86\xb6\xd0\x3f\x6f\xbe\x5e\x82\x05\x0b\x08\x58\x64\x7a\x63\xb6\x78\xb1\x6e\x1b\x1c\x3e\x61\xc1\xc0\xda\x04\xee\xbd\x6c\x65\x55\x97\xc5\xf4\xc7\x8d\x4f\xcc\x83\x98\x3a\xc4\x3a\x9a\x4a\x0f\x2d\x02\xa8\xe0\x24\xf0\x9b\xc6\xc1\x02\x06\xab\xf1\x37\x72\x9d\x58\xa5\x26\x31\x11\xad\xa3\x82\x03\x43\x3d\xfa\x93\xe3\x0e\xd7\xaf\x96\xf2\x38\x33\x35\x45\x0c\x3a\xb4\xf4\x8f\xd7\x6c\xa1\x6d\xa9\xf0\x82\x08\x35\x15\x49\x48\x85\x57\x79\xff\x5c\xf7\xd7\x7c\x61\xb4\x22\xb8\xca\xbd\x83\xdc\x66\x5d\x44\x2a\x12\x90\xcc\x2d\xcb\xa2\x7a\xde\x87\xfb\x0c\x6d\x05\xfc\x51\x93\x70\xee\x59\x6d\x6d\x54\xa7\x47\xbd\x77\x91\x06\x1a\x7b\x74\x6d\x04\x3d\xdb\x28\x10\x69\x1a\x26\xb6\x8e\xf0\x73\x79\xbf\xf1\x01\x63\xfb\x67\x5c\xca\xed\x4a\x37\x51\x31\x1c\x6c\x4a\x22\x15\xa1\xd7\x0b\x72\xa1\x9a\x11\xa7\xbc\x79\x10\x55\x93\x0d\x7b\x51\x22\x95\xd2\x37\xdd\x1d\x5e\xce\x36\xb8\xaf\x2a\xa1\x5e\x3b\x3c\x80\x10\x01\xc4\x66\xe0\x0b\x65\x2b\x3b\xd5\x30\x85\x14\x22\x4d\x3c\x5f\x66\x53\x98\xf2\xba\xac\x56\x59\x7d\x3c\x35\xb0\x28\xb4\x93\xdd\xbc\x28\x5a\x32\x79\x67\x24\x89\x10\x44\x8e\x8b\x14\x32\x91\xff\x04\xd1\xbf\x08\x32\xb1\x5a\x9c\x8f\x4f\xab\xc5\xcf\xfb\xc7\x9b\x55\x77\x40\x87\x88\x30\x75\x3e\x65\xe2\x03\x09\x92\x63\x1f\x44\x2a\x14\x37\x18\x19\x2e\x7e\x2c\x36\x37\x8b\xab\x9b\xf5\xfe\xfa\xfe\xe9\x6e\xb5\x7e\xdc\x6f\x9f\x1e\x1e\x6e\x3c\x73\x40\x28\x15\x87\xbc\xef\x98\xae\xca\x0e\x5b\x2e\x74\x08\xf6\xf9\x67\x6f\x30\x14\xbd\xbf\xb8\xc6\x0b\x4d\x22\xaa\xba\x5a\xb6\xd5\xe7\x9a\x5c\x97\xe6\x2e\x6b\xce\x0e\xf0\x20\xea\xfa\xea\xf3\xb7\x39\xe4\xab\x00\x9e\xa2\xd0\xc3\x5b\x06\xef\x9c\xfb\x4b\x02\xb0\x1c\x31\x0b\xea\x9b\xeb\x4c\x08\x43\x62\x0c\x55\x10\xc5\x3e\x13\xb8\xd9\x61\x32\x00\xeb\x4e\x9d\xa9\x72\xb8\xc4\xcb\x30\x8a\x10\xd4\x27\x74\x57\x8d\x77\x2e\x77\x97\x02\xb1\x7e\x46\xca\x28\x60\x58\xcb\xb7\x6b\xcb\xfa\x71\x19\x05\xb3\x0c\x8b\xf3\x32\x8b\x44\x89\x53\xd7\x92\x74\x05\x07\x7f\x49\x44\x06\xa1\x05\x7d\xa1\xaf\xe4\xa8\xcf\x22\x29\x80\xb7\xeb\xc0\x3c\x75\xd3\xfe\x1e\xd8\x2c\xef\xa3\x42\xcf\x74\x93\x24\x63\x11\xb1\x9d\x36\x5b\xb6\x5c\x18\x93\xe5\xd9\x10\xcc\x3a\xba\x2c\x4e\x18\x2e\x0d\x78\x70\x7c\xa7\x65\x4c\xec\xaf\x5d\xc1\x9b\x05\x81\x3a\xb6\xcf\x5f\x51\x48\xa4\x32\xe6\xb6\xe0\x5b\x9f\x0e\x87\xb2\xf8\x0e\xd5\x78\x2d\x4b\xfe\x36\x1e\x2d\x14\xc2\xfb\xd6\x77\xab\xfd\xed\xe6\x6e\xb7\xb9\xfb\xe6\xef\x40\x92\x58\x61\x5d\xe4\x9e\x2f\xcb\xea\x2b\x2f\x18\x2a\x13\xc9\x51\x95\xef\xcf\x53\x95\xf9\x33\xa4\x49\x8c\x70\xb6\xb2\xc8\xad\x64\xdd\x37\x68\x76\x20\x0e\x23\xb8\x90\x14\x06\x90\x09\xd4\xbe\x75\x7b\x7b\x93\x7e\xf3\x17\x9a\x0c\x1c\x9b\xa9\x94\xa1\xc0\x8e\x9d\xb1\xa5\xdc\x76\x16\xde\x74\xb6\x0d\x54\x4a\x62\x2d\xae\x9c\x19\x5a\xf3\xb2\x59\xde\xff\x10\x55\x86\xfe\x0e\xf3\x41\xb4\x94\xd4\xca\x73\xfc\x52\xe1\x6b\x30\x1b\xa5\x90\xc8\xe7\x78\x44\x39\xc8\x5d\xfd\x92\x55\xcd\xec\xcb\x26\x15\x0b\x71\xad\xb9\xd8\xa3\xf7\xe3\xd2\x04\xf3\xb8\x1c\x9d\x91\x1f\xce\xfa\xf2\x52\x07\x89\xd7\x0b\xba\x11\xd5\xb3\xe3\xf3\x8c\x70\x73\x7e\xa4\xd2\x81\xf0\x99\x6b\x1b\x7a\x62\x33\xe8\xcb\x28\x43\x6a\x10\x89\xe3\xec\xb5\x13\xfc\x61\xb0\x95\x4a\x6d\x22\xaf\x91\xf6\x08\x06\x2c\x2c\x65\xfc\x71\x60\x06\xc1\x42\x87\xac\x68\x37\x09\x05\xf9\x97\x33\x05\x64\x84\xf3\xea\x7f\xff\x77\xf9\x15\x8e\x50\x82\x0e\x31\xce\xb7\x61\x97\x73\xf8\x9a\x3f\xa5\x49\xe3\x8e\x93\xda\xde\x13\x18\x18\x0a\xdb\x21\x2a\x60\x0a\xdb\xce\x56\x27\xc7\xbb\xba\x7f\x17\xf5\xcb\x60\x6e\x5c\xb0\x28\xfb\xe7\xbf\x06\x52\x8d\x54\x05\x2a\x55\xbc\x5b\x2c\xbd\xe9\xe6\x57\x4a\x41\x54\x05\xda\x0a\x8f\x3b\x5f\x17\xf1\x0c\x2b\x39\xbe\x8d\x2a\x4c\x65\x4a\x3c\xee\x2e\xcf\xbf\x55\x42\x39\x2e\xc0\xb8\x8e\xae\x42\x49\x2d\xbd\xe5\x45\xfc\x36\xbc\xae\x10\x0c\x8a\x04\xf4\x02\xaf\x4e\x89\xca\xf7\x7e\xdd\x33\x55\x91\x33\x67\x6f\x37\x20\x0f\x75\xc5\x7b\xe0\xac\x8f\xa8\x8a\x24\xef\xe2\xce\x4c\xbd\x16\x62\xda\x2f\x52\x24\xb4\xb1\x0d\x36\xcb\xac\xa8\x75\xfd\x5d\xbc\xc1\x37\x5c\xa2\xab\x87\x2a\xb3\x76\x11\xb3\x13\x5e\x91\x88\x60\xf7\xbc\xcd\xcf\x31\xc8\x59\x55\xe5\x71\x8b\xd4\xf7\x71\x57\x70\x5a\x4c\x53\x24\xd5\x88\x1b\xdd\xbd\x54\x00\xab\x1b\x17\xa0\x58\x3a\xa3\x1b\x42\xa3\x10\x1d\xbf\xae\xee\xff\xf0\x5d\x6d\xc5\x94\xf5\x33\x14\x5a\xaf\xad\x8d\xde\xf6\xd8\xe6\xa8\xfe\x38\x8f\x79\x27\x1a\x72\x70\x64\xef\xde\xf3\xc2\x0f\x12\xe9\x28\x30\xf2\x1a\xdb\xde\x29\x70\x76\x72\xaa\x38\x0a\x45\xcf\x23\xcf\xcb\x0a\xac\xae\xde\xfc\x8a\xa4\x62\x92\xe0\x06\x3d\x80\x48\xab\x98\xc5\x58\xc6\xb9\xbb\x5a\xec\xc2\x20\xfa\xab\xf8\x3b\xff\x69\x99\xf8\x86\xd9\x23\x08\xed\xe8\x37\x93\xa8\x51\xc5\x5a\x21\x9d\xdc\x69\x8a\x20\xb5\xe4\x77\xe8\x7e\x7b\x02\xa1\xdf\x2c\x11\x95\xb0\x82\xba\xc9\xc6\xd8\x24\x95\x80\x88\x9c\xe0\xed\xe9\x98\x5d\x65\x95\x9e\xa9\xf0\xfd\x15\xa2\xf6\xf8\x8e\x08\x91\xa6\x69\xaf\x38\x70\x38\x1d\x1c\xe9\x76\xae\x62\xaf\x84\xe2\x58\x83\xc8\x9c\x02\x67\x7d\xee\xb5\x4f\x95\xd0\x5c\x5a\x54\x60\x53\x41\x36\xb6\xc2\x6b\x8f\x26\x58\xb8\x57\x65\x56\xb4\xab\xf6\x58\x70\x8a\x2a\x29\xad\x36\xf3\xba\x40\xc9\x7f\xcb\x07\x9d\x7c\x83\x0a\x13\xac\x8d\xd9\xcd\x68\x95\x89\x43\x59\x5c\xb8\x1d\xfe\x13\x54\x22\xd9\xbf\xb2\xe9\xd3\x4f\xc8\x36\xc5\x99\xa9\x11\x55\x5a\x86\xcc\xf4\x7a\x3f\xbb\xb2\x9d\x85\x75\x23\x0e\xc7\x4b\x13\x50\x9b\x18\x11\xe7\xb2\x9d\xab\xe3\x15\xcf\x8d\x00\x65\x05\x2e\x0e\xe2\x63\x29\x8e\xce\xdc\x7b\x53\xbc\x41\x31\x00\x99\xeb\x80\x49\xec\xdf\x19\x04\xdb\xad\x20\xcf\xde\x2e\xd3\x76\xe7\x23\x59\x1d\xa4\xc6\xd8\xd8\xe6\x50\x56\xa2\xb7\x50\xa5\x3a\x50\x12\x3b\x09\xcb\xbb\x51\xf3\x51\x47\x34\xb1\x4c\xec\x2a\x93\x30\xc7\x91\xd7\x11\x95\x68\xe7\x54\x94\x73\xf1\x60\xff\xdd\x91\xb2\xa2\x74\xb8\x4f\x55\xe5\x07\x66\x9d\xe5\xa9\x59\x8a\xe3\xfc\x9d\xd3\x24\xd4\x58\x1c\xca\xfb\xba\x6f\xe2\x0f\x11\xab\x64\xfb\xfa\xa9\xda\xad\xa9\x9e\x6c\x8a\x9a\x06\x04\x51\x72\x05\x7c\xf8\xd2\xde\x78\x19\xd7\x34\x8e\xb9\xec\x48\x5d\x76\x1b\xf1\xea\x1d\xd3\x93\x29\xed\x21\x77\xde\x90\xaa\x8d\xa3\x2e\x5c\x35\x63\x0a\xe5\x83\xb6\x50\x1d\xa1\xb0\xd5\x80\x55\xf9\xde\xdd\x51\xc6\x25\x86\x08\x2e\x67\x9b\x74\xa9\x35\x8b\x19\xda\x8c\xbb\x9a\xb1\xaf\xe9\x9e\x83\xae\x35\x33\x04\x91\xfe\xd5\x79\x3c\xac\x99\x51\xb8\xc7\xf4\x82\xb8\x88\xf3\xea\xf9\x91\xed\xcd\x6f\xa7\xae\x1e\x02\x72\x2e\xcc\x1a\x1e\xa4\x58\x13\x13\x27\x9d\x35\x65\xf5\x5d\xd4\xdb\x46\xbc\x5e\x50\x0e\xa4\x9a\x53\x60\x6e\xf7\x6a\xf3\xae\x45\x56\xe9\xaa\x3c\xce\x98\xc9\x50\x1d\x87\x11\xb1\x32\x6a\x85\x1a\x17\x20\x74\x1c\x45\xca\x15\xbb\x9a\xde\x18\xc6\x1d\x4c\x88\xb5\x3e\xb4\x22\x3a\x1d\x78\x51\x27\x2c\x0a\xdb\xbf\xff\xe7\x24\xaa\x06\xaa\xbc\xb3\x8b\x1b\xec\xbf\x3a\x51\x11\xd5\xde\xf1\xf8\x57\x6b\xe1\x5f\xec\xff\xcd\xd3\x06\xfa\xa8\x55\xa7\x11\x4d\x83\xae\x92\x79\x7d\x52\xaf\x9f\xe5\xc9\x5f\x51\xca\x24\xc2\x5f\xb6\x2f\x59\xb3\xcc\xcb\x02\xea\xbc\xac\xf4\xe4\x37\xa7\xc2\x96\x4a\x45\x5d\x43\xd5\xac\xff\x13\xdb\x09\x1d\xdb\xe0\x28\x76\xa3\x24\x50\xaa\x7d\xa8\x5a\x0f\x5b\xa6\x4f\x7d\xd5\x4d\xab\x28\x44\x06\x41\xe6\x17\x99\x87\xaa\xd4\x27\x35\xa1\x5e\x69\x45\x14\x89\x06\xdc\xd8\x4e\xca\x89\x6a\x95\x70\xcc\x89\xff\xfc\x73\xbc\x5e\x28\x63\xa5\x35\x0f\xed\x56\x21\xf2\x9e\x4f\xa4\x0d\xb5\xbd\x97\x17\x51\x5f\x01\x14\x37\x59\xf1\xda\x15\x57\x46\x59\x91\x36\xce\x70\xfe\x61\xfd\xb8\x7f\xda\xae\x1f\xf7\xb7\x8b\x3f\xf6\x8b\x1f\x8b\xdd\xe2\x71\xbf\xbc\x7f\xba\xdb\x75\xa7\x4c\xa5\x67\xda\x2e\xa7\xa8\x08\x08\xd3\xd4\xe3\x83\xb7\xef\xe2\xcc\x5c\x84\x42\x28\x34\xca\x3f\xaf\x0f\x65\xd1\x5c\x57\x50\xfc\xf7\x73\x37\x35\x79\xa6\x10\x45\x29\x8e\xc2\x17\xd0\xff\xcd\x61\x85\x73\x51\x37\xaa\x3c\xc8\xb2\x3b\x40\x39\x0d\xbc\x11\xc8\xfc\xfa\x00\xed\x8a\x6a\x4b\xde\xe8\x8d\x38\xf9\x36\xc6\x50\x33\xf3\xe7\x0e\xd4\xcb\x0e\x01\xa9\x5d\x6d\x1e\x68\xc8\xb0\x84\xf4\x5c\x95\xef\x3f\x61\xda\x6f\x00\x1a\x4a\xd4\x68\x78\x5c\xec\xd6\xfb\xd5\xe2\xcf\x7d\xd8\x7d\x50\x05\xdc\x6d\x30\x36\xcd\xb6\x7c\x8e\xfe\x9d\x00\x26\x98\x71\x41\x8a\x2d\x3f\x6c\x1c\x9a\x1f\x93\xed\x29\xaa\x07\x98\xe0\xae\x81\xd0\x65\xf5\xa7\x21\xf7\x02\x18\xa4\xe8\x27\x2c\xea\x36\xc6\xf4\xb3\xeb\x2f\x6d\x52\x10\x07\x56\xca\xa1\x39\x49\x7f\x79\x31\x09\xa3\x68\x68\xd4\x3f\x78\x9a\xd3\x4f\x13\xc3\x1d\xf2\xd2\x75\x15\x51\x8b\x68\xce\xef\x82\x42\x2c\x18\x5e\x66\x51\x16\x3f\x6f\x2e\xd0\x64\x20\x09\x94\xaf\xb3\x21\x4c\x77\x72\x34\xb5\xae\x68\xb2\x2c\x9b\xa7\xe3\x77\x51\x3c\x97\xa7\x8e\xa6\x02\x89\xe2\xd8\xad\xad\x1c\xa0\xfc\xab\xd4\x0c\x12\xb0\xa0\xcb\xeb\xac\xd0\xbb\x17\x58\x9e\x2a\x18\x3e\xfe\xc4\x44\x34\x1e\xd4\x44\xda\xe5\xdb\x4a\xec\x3d\x4f\xeb\x64\x90\x26\xd6\xfb\x15\x3b\x4c\x0b\x7c\x08\x43\xf4\xc9\x99\x65\x11\x85\x54\x87\xe8\xa2\xbb\xae\x1b\x6f\x3c\x3b\x39\xa7\x60\x06\x5c\x9e\x7a\x77\x3a\x58\x89\xeb\xd5\x80\xde\x33\xff\x3c\x84\xb0\x40\x99\x76\x97\xc5\xd8\xff\xc2\x8f\x17\x2a\xe6\x43\xaf\x02\x91\x5b\xed\x8b\x6e\xd1\x02\x61\x42\x46\x07\xa1\xe5\xdc\x8e\x02\xc2\x48\xec\xbc\x63\x5f\x72\xc8\x29\x02\x19\x78\x09\xff\x36\xb6\x1e\xb0\xb8\xbb\x01\x24\x0a\x02\x9f\x6b\x5b\x66\xcf\x43\x55\x3e\xb7\x27\xbf\x37\x0f\x0e\xfd\xb5\x3a\x15\xcf\xe0\x50\x88\x7e\x9d\x04\x29\x39\xaa\xee\x1c\xc4\x87\x2b\x60\x5f\x9d\x7c\xdc\x06\x8a\x85\xd4\xb5\x69\xdd\x2e\x8c\x7e\xf2\xdd\xe1\x94\xe3\x5b\xdb\x2e\xf7\x67\xee\x2c\xdd\xbf\x53\x47\x71\x0a\x9a\xb1\xd8\x0c\xa4\x18\x3a\xd7\xe8\x11\x1c\xb8\xbb\x44\x10\x56\xab\x1b\x50\xa2\x16\x1e\xcb\xf2\x30\x79\xbc\x86\xa4\xa6\x53\x9f\xdc\xbf\x8f\x6c\x26\x29\x98\xc4\xf6\x03\xde\xd5\x7d\x31\x80\xcb\x2a\xd5\xef\x50\x60\x94\x4c\xa0\x5b\x44\x0a\x98\xe4\x06\x26\x08\x20\x21\x13\xf5\x26\x9c\xc9\xbf\xf9\x01\xc4\x0a\xf2\x3f\x2c\x6f\xa7\x1f\x05\x92\x3a\x56\xd2\xf2\x74\x2e\xae\x4e\x4d\x18\x28\x44\x6e\xab\x97\x57\x25\xce\xbb\x70\xe3\xb3\x85\x26\xc5\x5a\x73\x2e\x87\x7b\x97\x89\x02\xe3\x44\x74\x9a\x21\xab\xb7\x4d\x44\x27\xdf\x16\x51\xa6\xdc\x5e\x66\xbd\x25\x9f\x8a\xac\x2c\x36\xba\x9e\x07\x93\x98\x88\xd9\x97\xab\x38\x1d\xee\x8d\xeb\xc0\xeb\xee\x6b\xb5\xe5\x83\x79\x50\xf7\x53\x51\x97\xb9\x3e\x93\xb2\x30\x84\x87\xb8\x37\x20\xe8\xda\x7e\xed\x4f\x00\x5f\x7f\x33\x2c\x48\x42\xdc\x35\xab\xde\xa1\x68\x7c\xd5\x9c\x6a\x94\x35\x97\xa5\xbc\x15\xaf\x50\xaf\x2b\x15\x05\xde\xf9\xe3\x82\x95\x9e\xc7\xf3\xfe\x6d\x72\xaa\xc4\x1a\x14\x7c\x73\xa0\x9a\x7b\xf3\x98\x3d\xff\x82\xe5\x6f\xb8\x04\x64\x9c\x09\x0f\x97\x75\x96\xc2\xb5\x5b\x79\xfd\x44\x32\x5c\x07\x88\x71\x5d\x96\xc5\xf3\x79\x87\xc5\xc4\x0e\x82\xda\x2f\x15\x37\xbe\x2a\xee\x46\x24\x4a\xe1\x86\xb7\xaa\x50\xac\x6a\xf4\x94\x53\x4a\x99\x63\xe2\xd4\xa7\x03\xac\x0b\xa8\x9e\xe7\x25\x64\xa9\x49\x79\x8a\xe5\x6b\x6b\xe5\xe5\x2e\x73\xb8\xaa\x18\x11\xf0\x80\xfb\x10\xa4\x68\xaa\x32\x6f\x77\x4e\xfc\xc2\xbc\x53\x67\xa5\x46\x84\xb1\x97\x37\x6e\x53\x87\x2b\x18\xab\xe3\x19\x41\xe2\x29\xbb\xc4\x7f\x54\x06\x24\x72\x6f\x15\xc2\xd7\x67\x8a\x75\xed\x9a\x07\xbd\xe5\x20\xe2\x16\x01\xbc\x18\x71\x1f\x85\x1a\x15\xd9\xda\x76\x53\x3e\x3f\xe7\x60\x69\x5b\xfe\x7b\x14\xb7\xb6\xbc\x7b\x29\xf4\xb3\xb5\x30\x1f\xa7\xd6\x93\x29\xa0\x14\x01\xd7\xf1\xbc\x82\x66\xc8\x66\x9a\x0e\x34\x94\xb8\x7d\xeb\x4c\x6b\x9f\x1a\x08\x02\x19\xfa\x6c\x41\x9d\xda\xb9\x78\x2b\xfe\x5d\x56\x59\x93\xf5\x13\x02\xdc\xda\x7d\x14\x9f\x5f\x81\xf3\x2e\x75\xa8\x06\x77\x00\x18\x75\xad\xf0\xea\x19\xea\xc6\x13\xbc\xba\x2f\x52\x94\x0f\x8d\x44\xbc\x3c\xa7\x3f\x0c\x04\x91\xe0\x2e\xb2\x70\xeb\x9f\x39\xe5\x17\xf3\x88\xf1\x8f\x35\x24\xc6\x37\xc0\x6a\xe9\xdf\x94\xc5\xf3\x12\xe5\xe7\x27\x55\x37\xf2\xaf\x29\x28\xcc\x7f\x1e\x44\xd4\xa9\x71\xef\xb3\xba\x1c\xca\x88\xb3\x20\x08\x05\xe6\x8e\x98\x32\x15\x22\xc7\x22\xd6\xdc\x95\xb0\x20\x88\x13\x2c\xc1\xb4\xbb\x7d\xa6\xb0\x36\xd1\x9d\x45\x58\x8a\xfc\xd0\x69\x12\xf1\x08\xf6\x3f\xe6\xe7\x03\x0b\x42\xd7\x53\x41\xc9\x49\xf1\x0c\x6d\x5e\x3f\xfe\xce\x28\x50\x32\xf5\x95\x30\x57\xcc\xde\x7d\x1e\xc7\xdc\x1e\x16\x44\xa1\xa5\x8e\x38\x05\x01\xdc\x21\x26\xc1\x2e\x0b\xa2\xd8\x56\x81\xfd\xb7\xf5\x86\x1e\x2c\x88\x24\x60\x2f\x7e\x27\x3e\x76\x59\x9e\xdf\x0d\xc4\x14\xc7\x27\x21\x29\x8b\x6c\x48\x70\x25\xaa\xe5\xc0\xa9\xdc\x1d\xa7\x3c\xc0\xa8\x58\x8a\x3a\x53\xce\x6c\x7b\x00\x16\x6e\x07\xc4\x51\xd4\xbf\x9b\x50\xd7\x93\x96\xb4\x1f\x97\x70\x7c\xbd\x17\xcf\x59\xb7\xf3\xdd\x0e\x13\xef\xbf\x58\xc6\x99\x5c\x3f\x4b\x44\x34\xa8\x15\x78\xdf\x91\x41\xff\xfc\xec\x0d\x60\x01\x83\x04\xd1\xe2\xa7\x1a\xaa\xf5\x07\x72\xaa\xe7\x0a\x97\x2c\xe0\x01\xc5\x80\xa0\x6a\xf7\x8a\xfb\xf7\xa9\x55\x3e\x0b\xb8\x24\x38\x1b\xaf\x45\x96\xc3\x79\x83\x6c\x7c\xad\x49\x94\x12\xb7\xf9\x23\xe0\x68\x46\xee\x82\x05\x09\x65\xc6\x05\x52\xf6\xa9\xf6\xbb\xe0\x43\xef\xea\xe3\xef\x7e\xc2\x24\x42\x78\xdf\x01\x5e\xb1\x20\x3d\x08\x26\x58\x90\xa4\xdc\xc4\x1d\x2a\x1f\x6b\xe2\x0a\x6e\x45\x71\x12\x79\xfe\x39\x99\x4d\x09\x68\xcc\xac\x16\xc5\x6b\x36\xdc\x2d\x58\x90\x18\xbb\xd7\xdc\x96\x85\x1e\x78\x49\x9d\x2f\xc2\x2c\x10\x9c\x7a\x78\x8e\x7d\x9f\xbb\xe4\x97\x05\x92\x2a\xee\xa2\xb5\x9f\x37\xb7\xbb\xab\xf2\x54\x4c\x38\x1b\x38\x06\xf9\xf6\x57\xa2\xf6\x45\x93\x0b\x4f\x46\xca\x10\x1f\xa1\x73\x2b\x77\x25\xa2\x6f\x59\x95\xff\x36\xba\x22\x15\x08\x2c\x5c\x23\x40\xb1\xcd\xe6\x2a\xf1\xbe\x6d\xa6\x0c\x2c\x16\x28\xc2\x60\xa8\x78\xbd\x2c\xf3\x36\xc9\xaa\x2e\x20\x23\x59\xa0\x4c\x6a\x25\x24\xf1\x02\xda\x9b\x6a\x84\x6a\x4e\xd5\xaf\x78\xc7\xee\xe3\x3a\xa4\xa1\xdb\xd2\x7e\x0a\x2f\x01\xe5\x9c\x82\xc7\xd5\x5e\x16\xe8\x54\xa2\x2d\xf2\x3b\xce\x97\x59\x55\x74\x16\x68\xa9\x94\xf3\xdd\xde\x6f\x8f\x65\x51\x97\x55\xbd\x6f\xf7\xdf\xbd\xfc\xdc\xff\xbd\x94\xd3\xe1\x9a\x62\x24\x75\x07\x4d\x03\xaf\xbd\x31\x00\x0b\x00\x38\xca\xf4\x0a\xad\x7f\x40\x95\x99\x0c\x34\x72\xdf\x2e\xfc\xaa\x61\xc7\x7b\xfc\x13\x0d\x8d\xd0\x94\xb9\x3e\x82\xca\x4c\xa6\x7e\xf1\x76\x98\x14\x10\x26\x5d\xbf\x7f\x1e\xfd\xb6\xc7\x02\x23\xc1\x92\x86\x45\xae\xee\xe0\xa3\x59\x55\xe2\xbd\x0f\x73\x58\x18\x04\x42\xb9\xc7\xa0\xb3\x66\xdf\x0c\x63\xbe\x49\xeb\x86\x85\x41\xa8\x31\x3a\x77\x56\x3b\xf5\x75\x59\xdd\x9f\x1a\x55\x76\xac\xe9\xd1\x9c\x08\x03\x06\x08\x04\x74\x09\x03\xba\x93\xad\x44\xf9\x30\x2a\x57\xb2\x30\x48\x15\xae\xc3\x0f\x8f\xeb\x3d\xaa\x2a\xef\xee\x77\x8b\x9b\xfd\xee\xfe\xf7\xf5\xdd\xb6\x1b\x24\x39\xb7\xa0\x3a\x7d\x52\x80\xa0\x90\x31\xf5\xc4\x8d\x0b\x9d\xd5\x1e\x4a\x03\x6e\x0b\xf1\xda\xfd\xd2\x50\x89\x14\x97\x9a\x36\x64\x19\xac\x44\xf3\x0b\x63\x18\x85\x36\x80\xbc\x3a\x7e\x0c\xdf\xe6\x30\xe2\x04\x91\xe4\xdf\x44\x61\xf5\x95\x50\x8d\x78\x1e\x1f\xc8\x42\x12\xf0\xd8\x4d\x06\x44\xde\xb4\x99\x1b\xdc\x66\xc5\xe4\xc5\x0d\x49\x48\x11\xc9\x5c\x6e\x56\x88\x1f\xdd\xfb\xaf\x23\x9c\xe1\x6b\xb2\x3d\x0e\x50\xd0\xb3\x17\x4c\x52\x0b\x86\x38\x62\xf0\x5e\x0f\xd6\xb1\x90\x28\x2b\x1f\xd8\xbe\x2c\x00\xaf\xf9\xe7\xd5\xe9\xf3\x47\x99\x9f\xfa\x69\x40\x34\xc1\xdc\x07\xad\x8f\xb6\x1d\xe1\x72\xfc\x92\x87\x2c\x48\xb1\x05\xbb\x5b\x2f\x6e\xf7\x8b\xd5\xea\x71\xbd\xed\x1e\x10\x63\x61\xaa\x3c\xfe\x07\x73\xd4\xb7\xfe\x11\x73\x6d\x22\x6b\x82\xd2\x3e\x32\x24\xbd\x8e\x2f\x3e\x16\x31\xf5\xed\xca\x52\xc3\xd0\x63\xd7\x8d\x48\xc2\x18\xb3\xf2\xed\xb8\x74\x31\x39\x4f\x1a\x27\x7e\x91\xec\x9a\xa6\xd7\xb9\xe8\xee\x44\x1a\x6b\x2e\x1d\x0e\x67\x84\xf1\x3b\x2b\xbe\x0e\xbe\x3a\x4d\x6d\xf8\xdc\xc9\x96\xe9\xbd\xa5\x63\x6f\x1b\x51\xbf\xa0\x42\x59\x79\x6a\xa6\x57\x22\x22\xdc\xf8\xcd\xa9\xd0\x53\x5e\x93\x1b\x22\x52\xaf\xff\x8c\xec\x92\xdf\xb3\x89\xff\x0d\x0b\x85\x56\xc8\x47\xdb\x96\xaa\x4d\xfa\xbd\xbc\x22\x0b\x25\x4f\x70\xb7\xd9\xfe\x5c\x3c\xec\x6f\xd6\x77\xdf\xba\x7d\x22\x94\xc0\x51\x0e\xd5\x29\x3f\xfa\xc2\xd9\xf8\xc4\xd2\x58\xe8\xb1\x0f\xd0\xbc\x89\x95\x3b\xac\x22\x2b\x0f\xa3\x1c\x75\x1a\x45\xa5\xbb\x83\x69\x88\xdb\x70\xbb\xfb\xbf\xc2\x67\xbd\x3f\x13\x50\xe1\x74\xfc\x8f\xfb\xa0\x16\xda\x50\x37\x0b\xca\xaa\xd9\x4b\x51\xec\x4b\x33\xb9\x32\xa0\x5c\x3b\xd4\xe0\xd5\xcd\xbc\x56\x38\x0b\x0d\x8d\xd0\xb4\xf9\x50\x3f\xcf\x57\xc2\x58\x68\xd2\x44\x5b\x1e\x76\xe1\x2c\x57\x59\x14\xa4\x71\x68\xad\x70\xab\x2a\x6b\xca\x87\xb2\xcc\x07\xe6\x86\xed\xf1\x04\xa7\xe9\xc1\x81\x0b\xc6\x62\x7f\x2c\x0a\x89\x40\x83\x34\xe7\x8d\x0a\xc8\xaf\xee\x21\xa7\xdd\x30\x2e\xb1\xbd\x6f\x71\x7a\xb6\x9c\xe3\xd7\xee\x3e\x8a\x8a\x42\x6d\x13\xb6\x63\xf5\xa6\xfd\x47\x23\xb0\x8a\x5f\xb6\x74\x70\x53\x3e\x67\x6a\xca\x77\x1d\xdd\x89\x88\xa5\x06\xe3\xf5\xdd\x4b\xe5\xbb\xa0\xfe\x5c\x4c\x5b\x87\x86\xa5\x28\xde\x44\x7d\x5d\x89\x67\x7f\x84\xa7\x9c\x23\x87\x01\x1b\xe5\x50\x5d\x89\xe2\xd5\xc3\x81\x59\x14\x2b\x01\x68\x4f\xaf\xa1\x7d\xf6\x4f\x53\x83\x0e\x16\x25\xc4\x2a\xe7\xc8\xf2\x94\xc3\x0a\xde\xc6\x28\x63\x16\x25\x22\x40\xc9\x96\x6f\x79\x29\x45\xee\x7f\x7b\x6d\x75\xdb\x87\xb7\x20\x51\x01\x06\xbf\x5a\x7c\xd6\x7b\x4c\x39\xfa\x45\x23\x4a\x8c\xb5\xe8\x41\x7b\xa8\x76\xbf\x79\x80\xea\x4f\x10\xdd\x75\x0a\x9a\x20\xcd\xee\x45\xbc\x81\x5e\x65\xb5\x75\x5c\xe9\xcb\x9d\x2c\x12\x29\x43\x2c\xb7\x6d\xe1\x2e\x8b\xcf\xab\x46\x9d\xe5\x8f\x2c\x92\x52\x63\xda\xea\xb5\xee\x3a\x2d\xbe\xc9\xbd\x56\x29\x91\x2e\x5d\xbd\xee\x6a\x56\x2c\xd2\x51\x8c\x7d\x99\xa7\xa7\xcd\x8a\x76\x7f\x64\x4a\xbb\x4a\x20\x76\x98\xe6\x79\x92\x6e\x30\x04\x09\xa6\x2b\x7b\xef\x94\xe5\x41\x15\x8b\x42\xdf\x42\xf3\x52\x4e\xcc\x1d\xfc\xc7\x42\x7b\xdd\xed\xb2\x5e\x56\xaf\x26\x2f\xdf\x17\xaa\xc9\xde\x86\xa8\x8d\xf1\x17\x19\x4a\x70\x01\x7f\x2c\x8b\xe7\x9f\xff\xf8\x6b\x08\x3c\x16\x19\x4e\x8d\x4b\xba\x30\xa7\x9f\xf6\x41\x58\x64\x34\xc7\x08\xeb\x61\xfd\xb8\x5c\xdf\xed\x16\xdf\xd6\xfb\xfb\x6b\xb7\x83\xef\xb7\xf7\x37\xab\xfd\xe6\x0e\xf7\x76\x7f\x7b\x8c\xb1\x8a\xba\xc8\xa8\xc2\xee\xf8\xcc\x73\x31\x46\x5a\x7b\xbf\x2a\xd3\x9d\xf6\x20\x23\x41\x60\xed\x63\x8f\x55\x79\x74\xd9\xc7\x68\x7a\x92\x20\xb1\xda\x11\xb7\x8b\x3f\xf6\x57\xeb\xdd\xfe\xc7\xe2\xe6\x69\xdd\x7d\x1a\x92\xd4\xc5\x79\xe8\x3c\xbb\x9e\xe8\xbb\x31\x12\x9a\x00\x57\xa0\x9b\xf2\xf9\x27\x64\xfe\xf5\x9e\x97\x69\x60\x84\xc6\xcc\x37\x90\x6e\xc4\x41\x96\x8b\xc6\xb5\x33\xc6\x2d\x7a\x46\x18\x91\xc8\xe5\x38\x8a\xaa\x6e\x1f\xac\xc5\x20\x9e\x19\x85\x33\xc2\x58\x8a\x85\x1e\x57\x0c\xca\xa1\xda\xbb\x77\x9f\xf8\x1f\xc1\x52\x41\x8c\x4f\xe2\xbf\x3b\xfa\xf4\xa0\xd5\xc7\x08\x13\x12\xf3\x3a\xd9\xa8\xa7\x5a\x0f\xd6\x76\xc2\x94\x66\x91\xe7\x30\x67\x39\xfa\x2c\x4c\xaf\x95\x07\x94\x3b\x0c\xda\xd3\xa6\x18\x15\x9a\x18\xe1\x61\x1a\x0c\x43\xfd\x61\xca\x44\xe2\x30\xc2\x8d\x05\xad\x4a\xbc\x2f\xdf\x2a\xab\x40\x35\xf9\x99\x65\xf8\x38\x58\x22\x89\x0c\x91\x2f\xd7\x3e\x37\x37\x77\x1c\x34\xd7\x47\x19\x24\x91\x29\xee\x7b\xe8\x37\xd5\xbc\x97\xf8\xba\xac\xff\x73\x65\xcf\xeb\x47\xa5\x41\x1c\x3a\xf1\x21\x04\x9b\x40\xf7\xe3\xd3\x28\x41\x26\xc0\x0b\xe4\xc7\x47\x5f\x94\x61\x24\x25\x61\x1a\x0f\x31\x72\xd5\x64\x4e\xa4\x5c\x0d\xb2\x15\x94\x22\xfa\x8b\x79\xf6\x64\xba\xa4\x8a\x72\x8b\x5b\x39\x08\x84\x86\x5a\xb1\xe0\x81\x56\x13\x23\xa2\x9d\x54\x9e\x95\x55\xf5\x85\x81\xf9\x18\x93\x48\x91\x60\xea\xf5\xf6\xa6\xbe\x4a\x2e\x89\x04\xfb\x68\x76\x65\x59\x0d\x37\x0a\xa2\x02\x86\x05\x2d\x79\xaa\x8a\x8d\xab\xfb\x5c\x98\xed\x3a\xb5\x96\x3e\xc5\xe9\xe0\x74\x22\xfc\x49\xb4\xa4\xc4\xa1\xde\xfb\x19\x15\x46\x89\xeb\x0e\x31\x02\xdc\x65\x88\x98\x85\x5d\xd8\xb6\x09\x68\xc3\x92\x5e\x3e\x7d\x5d\xe8\xa6\xcf\x56\x88\x09\xc0\x87\x89\xcb\x53\x55\x7d\x13\x07\x68\x73\xab\x07\x51\x35\x61\x37\x26\x94\xca\x3d\xcb\x4d\xed\x93\xff\xe2\xb9\x13\x82\xed\xb7\x1f\x62\x80\x61\x1f\xf5\xea\x6e\x35\xbc\x21\x34\x08\xb4\xf7\xeb\xde\x65\x50\x45\x0f\xbd\x85\xf6\x54\x61\x98\xd1\x20\x22\xc4\x35\x67\xf6\x35\x62\x3f\xf6\x23\xb1\xdc\xf3\xfa\x09\x0d\x24\x8b\x52\xe7\x40\xb6\x29\x94\x25\xc3\xe8\xfb\x91\x3d\x22\xa3\x01\xa4\xbc\xab\xd4\xdd\xff\xbc\xf1\x57\x17\x06\x96\x43\xf3\xfb\xc3\x60\xaf\xa3\xa1\x26\x68\xbe\xfa\xed\xe1\xc9\x62\x8e\xbb\x03\x46\x33\xd2\xf5\xfc\x5e\x61\xb6\x8f\xd9\x0e\x03\x14\x70\x68\x40\x1c\x7e\x20\x34\xec\x79\xbc\xa4\xd0\x28\x0c\x11\x4e\xb1\xab\xb2\x77\x18\xcd\x20\x1a\x11\xee\x8c\xa5\x1b\x91\x1f\xca\x02\x3e\xc1\x9a\x35\xfa\xe3\x71\x28\xa9\x7f\x6d\xe3\xbd\xc0\x9a\xe7\x23\xb4\x3f\x17\xab\xa0\xfb\x27\x54\x76\x50\x08\xad\x3b\x94\x6f\xce\x4c\x66\x5f\xbf\x94\xa7\x5c\xef\x5e\x2a\x2f\xb0\xdb\x9e\x8a\x25\x0e\x3d\x35\x12\xc0\x1d\xcd\x75\x1a\x25\x14\xc1\xdf\xc7\xde\xee\x85\xd1\x48\x58\xd1\xfb\x43\x56\x34\x57\x9f\xe3\x4f\x8f\x6f\x46\xa4\x03\xc3\x6d\x7c\xf9\x8f\x87\xd3\x78\xfd\xa3\x84\xc7\x91\x95\xb7\xca\x8a\xdb\xf2\x0d\x86\x5d\xd1\xbf\x0d\x52\x34\x1f\xf7\x52\x22\x23\xd4\x0d\xb2\x9d\xec\xf9\x0b\xa6\x5c\xc5\xce\x0d\x70\x91\x55\xab\xaa\x3c\x3a\x8b\xfe\x9d\xb0\x3e\x55\x93\x2b\xa4\x22\xc1\xe0\xe8\xbd\x13\x29\x75\x07\x98\x6b\x03\xd4\xc2\x58\x4e\x61\x0f\x3d\x63\x94\x09\x9b\x4f\x08\xd3\x40\xb5\xc7\xa7\x11\xee\x0f\x36\xc2\x70\x43\x78\xc2\x8c\xec\xed\x3f\x3c\xba\xd4\xeb\xff\x8e\xaf\x82\x27\x29\xb7\xc5\xe8\xa2\xb9\x2d\x35\x16\x3b\xbe\xce\xab\x69\x1c\xa4\x5a\x7b\xfd\xa0\xbf\x5c\xbc\x9c\x7f\x4c\x71\x12\x20\x0e\x0a\x19\x0d\xa3\x84\xf5\xac\x3b\xcd\x68\x42\xb8\x4c\xfd\xba\xf0\x08\x1e\x22\xda\x06\x4c\x30\x58\x14\x68\x62\x94\x8e\x3b\xf5\x4c\xdd\xee\xe7\x53\x30\x32\xa3\x69\x00\xe0\x4e\x66\x19\x33\xa8\x97\x71\x59\x28\x8d\xd1\x94\x50\x6f\x1b\xec\xaa\xd2\xe7\xa2\x2b\xed\x28\x40\x53\x48\x2f\xb2\xe0\x58\xed\xba\x0d\x92\xb0\x5d\x37\x7c\x9a\x29\xb7\xa0\xb2\x87\xfb\x9f\xdf\x55\xde\xf1\x53\x18\x15\x2c\xf4\xed\x12\x2b\x7f\xd7\x26\xcb\x0e\x97\x36\xf8\xa5\x32\x8a\x89\x37\x6f\x74\x2e\x11\xfe\x48\x2c\x31\xc0\xb7\x81\xb3\x2f\x63\xcd\xf6\x85\x19\xd5\x3c\xc1\x77\xcd\xab\x03\x9d\xaf\x7c\x93\x9e\xca\x28\xc7\xfe\xe2\xef\xf3\x37\x52\xc7\x76\x0f\x70\x59\xb7\xff\x6b\x92\x02\x0c\x7a\xd9\xed\x7d\x9a\x25\x33\x33\x0a\x61\xc0\x89\xef\xd1\x36\x55\x9b\xe5\x99\xec\xf9\xc2\x63\x03\xae\x44\x7b\x2b\xbf\x67\xc7\x63\x86\x58\x8a\x37\x1f\x66\x50\x90\x14\x19\x79\x70\x28\xff\x9d\xd5\xa2\x5b\x0d\x4d\xc8\xd1\x59\xc1\x67\xcf\x57\x88\x7f\x1f\x2a\x75\x76\x23\x39\xb1\x8f\xdb\x3a\x67\x2a\x51\x68\x7b\x0b\x2f\x17\x07\xe7\xb6\x76\x16\xa4\x29\xe9\xa5\x30\x06\x19\xe9\x6c\xc4\xc0\x02\x69\xed\x09\x3d\x1a\xd1\x37\x1e\x3e\xb7\x9f\x07\x59\x8e\x2b\xc0\x2c\x00\xdb\xa7\xb5\xe7\xbe\xb2\x7d\xcc\x76\x42\x5d\x97\xd5\x55\x6f\x93\x36\x09\x21\x59\x28\x38\x6a\x3b\x16\xa7\x3c\xcf\xcc\xe7\x90\xb9\xed\x47\xa8\x44\xa6\x7e\x7f\x83\x3a\x13\xee\xae\xb0\x88\xd9\x12\xbe\x35\x00\xf9\x2c\x34\xfa\x8b\x6d\xad\x04\xb8\x1f\x13\x13\x46\x3b\x5b\xdd\x3b\x78\x47\xe0\xc2\x97\x33\x87\x45\x31\x05\x6b\x70\x77\xec\x4e\x63\x18\x06\xc3\xfb\xaa\xcd\xe8\x2f\x06\x75\xdd\xe8\x14\xb7\x85\x6f\xd8\xaf\x7c\x04\xa1\x3f\x07\xb5\x54\x46\x0c\x0f\x1c\x70\xce\x72\x4c\x0f\x13\x33\x61\xd6\x6e\xa2\x56\xa5\x1e\xe3\xc8\x8b\x31\xe4\xfc\x63\xa3\x31\xf1\x39\xe5\xe9\xd8\x6d\xae\x8c\xc6\x14\xb5\xee\x14\x9a\x02\xb6\x57\x75\xd6\x67\x61\xb4\xcd\xb4\xff\xe7\xff\xfd\xcf\xcf\xcd\xdd\xdd\xfa\x71\xb7\xf8\x63\xff\xf0\xb8\x6e\x53\x35\x7f\x12\x16\x69\xa9\x06\x05\xa1\xd5\xf6\xe1\x71\x24\x39\x38\xb9\x16\xe6\xb4\x4f\xb6\x20\x2a\xf5\xf2\x54\x43\x75\x26\xf4\x32\x9a\x45\xcc\x08\x0b\x5e\x74\xef\xe4\x76\xe8\xf6\x3c\xb9\xcd\x9c\x1b\xc4\x32\x56\xc8\x9a\xda\x96\xa7\x4a\x4d\xb3\x29\xc6\x85\xc1\x40\xfe\xb0\x87\x01\xce\xc2\xff\x9a\x38\xb1\x40\xe1\x1a\x9a\xc6\x55\x60\xce\xb8\x87\xf3\x8f\x38\x4e\x0d\x96\x0c\x7c\x72\x33\xae\x88\xcf\xef\x43\x2c\x56\xa1\xb1\x60\x3e\x39\x8e\x99\x58\xac\x62\xdc\xa1\x2c\x44\xf8\x76\x28\x08\xf4\x39\x79\x44\xb1\x0e\x70\x4b\x69\x57\x63\x8c\x78\x36\xe6\xae\x6c\x30\xc1\xf5\x67\x4b\x89\xc4\x66\xcc\x1b\xd4\x0d\x68\x9b\x34\x4c\xb8\x21\x8c\xa5\x4c\xf9\x04\x77\xfb\x9a\xe5\xf9\xdd\x94\xfa\xc1\x98\x80\xc0\x96\xc2\xf3\xd3\x7f\x07\xad\x0b\x26\x45\x84\x35\x56\x38\x40\x85\xce\x69\xf7\x6f\x50\xbd\x57\x59\x33\x0e\x1a\x93\x61\xba\xca\x14\xb7\xfe\xfa\x4d\xf5\xb9\x2b\x27\x73\x66\xfc\xb5\x9a\xa5\xd6\x13\x06\x77\xcc\x59\x6a\x0b\x63\x3a\xd6\x98\x26\x5b\xd8\x99\xe3\x3a\x7f\xa5\xd1\xe2\xf7\x64\xa6\xe3\xb1\xf3\xeb\xd5\xe7\xe5\xe6\x35\xd3\x89\xc2\xf8\xe9\xe9\xd8\x54\x50\x14\xdd\xcb\xa4\x75\x88\x65\x7f\xec\xea\xc3\xfe\xe6\xf4\xad\xd4\x7a\xf0\x40\x21\x50\x4c\xfb\x45\xeb\xc9\x33\xe5\x18\x83\x50\x5a\xd2\x47\xdd\x0c\xef\x28\x30\x1b\x74\x2c\xea\x1a\x0e\x32\x9f\x3e\x73\xe0\x92\x7a\x38\x53\xfb\xf6\x8e\xe4\xe9\xfc\x18\x19\xa1\xee\x92\x12\xc5\x4f\x7c\x14\x33\x9a\xd2\x8c\x19\x6a\x39\x2a\x47\x71\x2e\xc6\x35\x53\x3b\x62\x86\x85\x68\xc3\x50\x65\xcf\x2f\x0d\x4d\x27\xdf\x69\x62\xc0\x5d\x4f\x89\xc2\x26\x27\x77\xf0\xd1\xb4\xd9\xd6\x6d\x56\x2c\x0a\x7d\x2b\x3e\x70\x1f\x78\x2a\x9a\x2c\x6f\xff\xbc\xee\x6f\xa0\xd1\xb6\x32\x8d\x4a\x3e\x48\xf0\xeb\x3b\x71\x3c\x20\xd4\x19\x7e\xaa\xe6\x4c\xc2\x84\xf1\xc0\x04\x96\x9a\x5b\xff\xe1\x3f\x11\x25\x91\xee\x75\x11\x6f\xb3\xe2\x2a\xd3\x58\x6e\x3c\xe6\x53\x57\x20\xc6\x23\x61\x09\xd2\xcb\x52\x43\x75\x5d\x56\xcf\xdd\x17\x47\x46\x47\x6e\xe9\x7c\xda\xa0\x18\xec\xe9\x42\x22\xc4\x49\x0a\xe1\x80\x45\x9c\x15\xdf\x44\x8d\xa1\xda\x75\x59\xad\x2a\xf1\x3e\xd1\x52\x67\x9c\x52\xeb\xcf\x9c\x5b\x5d\xa1\x36\x4c\x16\xfd\x37\xb3\x94\x22\xce\xdc\x92\x96\x46\x72\x6d\x8c\xc7\x61\xe4\x7b\x36\x6f\x93\xdf\x12\xbb\xda\x25\xe2\x2a\xd4\x8b\xc8\x3a\x9b\x88\x73\x66\xe3\x30\x1c\xe3\xb1\x66\x28\xe1\x7b\x75\xfa\xfc\x56\x96\x13\x79\xce\xc1\x28\x4e\xe2\x33\xcb\xf5\x36\x91\x18\x7a\x1b\x31\x9e\x48\x4d\x3c\x86\x1e\x0b\x3d\x51\x77\xc4\xc8\xa0\xef\x20\x3f\xd9\x6b\xb9\x70\x4f\x55\x14\x81\x72\xc9\xe5\x7d\x3f\x1d\x94\x60\x18\x28\xfd\xef\x0b\x1a\x5b\xfc\xba\x14\xc9\x35\x0d\xe9\x70\x9b\xfa\x3f\x09\xc2\x8c\x01\xf5\xed\xc9\x04\xd6\x9b\xec\x2f\xf8\xbb\xa8\xca\x6d\x0e\x30\x4f\x25\x61\x5c\x73\x19\x51\x54\xa4\x35\xcd\x8b\x15\x47\x12\x39\xd4\xeb\x4e\xc4\x93\x71\x88\x52\x44\x8d\x64\xaa\xbc\x46\xc3\xcf\x6e\x93\xe6\x10\x03\x4a\x27\xb5\xf7\x71\x57\x2e\x6c\xc7\xe7\xc2\x37\x01\x08\x9c\x32\x47\xf1\xe9\x9c\xc6\xfc\x0e\xc0\x4d\xc0\xb8\x19\xdb\x7a\x91\xfe\x58\x42\x00\xd1\x57\xf6\x19\xec\x4a\x2b\xf6\x30\x0b\x28\x64\xdc\x30\x26\x63\xaf\x56\xdd\x26\x9c\x3d\xd6\x80\x9b\x24\xc5\xd5\xd1\xdf\xe6\xdb\x0b\x82\x1e\x8c\x9b\x34\xe1\xcc\xaf\x87\x43\x7c\x3f\xe3\x06\x0c\x2e\xa5\x1a\xde\x20\x2f\x8f\x50\xed\x6d\x8b\x19\x3e\x9a\x7d\x6f\xb3\x3c\x13\xce\xc6\x41\xc0\x91\x01\xf0\x50\x95\x47\xf4\x6b\x7a\x01\xe1\xef\x64\x1c\xa8\x08\x23\xfd\x87\xd2\x99\x7b\xd5\xdd\x11\x13\xa1\x10\xc4\x52\x54\xb2\x2c\xb0\x82\xe8\x0f\x85\x60\x1d\x04\x1f\xc4\x09\xed\x4b\x96\xe2\x78\x04\xed\x93\xdb\x73\xa8\x32\x8b\x23\x11\x61\xaf\x7b\xfd\xe0\x63\xa4\x98\x50\x29\xac\x64\x90\xad\x91\x6d\x3d\x1f\x38\xb9\x60\x95\x3d\xbe\x57\x31\x61\x51\xc4\x3b\xe8\xd6\xc0\xa0\x98\xc5\x44\x1b\x24\xbc\x58\x37\x9c\xdb\xbb\xd5\xfc\xed\x8e\x69\x10\x62\x68\x6c\x65\xdf\xae\x26\xf8\x58\x16\x53\x22\xb0\x46\xe3\x29\x41\x2e\xbd\x9d\x0c\xd2\x22\x51\xf8\x60\xda\x9c\x6f\xfb\xd2\x83\x44\xdc\x00\x96\x12\xec\xf0\x21\xe8\x03\x8b\x0b\xb3\x05\xdb\x98\x81\xed\xdc\x5f\x55\x20\x5e\x65\xd6\x0c\x5d\x80\x58\xcc\x59\xe2\x81\x10\xdb\xcf\xba\x81\x43\x1b\x25\x7a\xe9\xf4\xc9\x25\x71\x41\x22\x57\x71\xbb\x12\xea\xf5\x74\x3c\x37\x37\x62\x71\xac\x53\x94\x1b\xc9\x4b\x51\xec\xa0\x3a\xf8\x2f\x4a\x18\x58\x6d\x98\x77\x80\x63\x3d\xf0\x46\x67\x71\x22\x24\xb6\x1c\xff\xd1\x7e\x1d\xd4\x35\xe2\xc5\x86\x17\x99\xc8\x58\xba\x1d\xf8\xea\xf4\x39\x4e\xe0\x47\x73\x32\x91\x12\xc1\xd2\x1d\x7f\x60\xab\xca\xca\x3d\x7e\x1f\x82\xc4\x29\xe7\x98\x51\x17\xa7\x03\xaa\xe0\xb4\x7b\x63\xf7\x8c\x53\x15\xa0\x58\x73\x01\xef\x8b\x76\xde\xfa\xbf\x8b\xc0\xde\xed\xac\xc8\x9a\x99\xd4\x6d\x7c\xa3\x44\xc0\x94\xf5\x29\x3f\x67\x8f\x8d\x2f\x58\x04\x0c\xb1\x57\x3d\x75\xfd\xd2\x3a\x39\xbe\xcb\x22\x90\x08\xf3\xae\x9f\x9b\xee\x0a\x4d\x12\xf0\x81\x60\x9c\xfb\xb3\xd4\xd6\xb3\xe6\xf1\xfe\xfb\xf7\xee\x6f\x10\xc6\xd6\xaa\xf3\xb0\x2d\x7f\x7f\x29\xc5\xf7\x52\xf9\x63\x3a\xb0\x1a\x42\x8e\x2f\x57\xc9\xac\xb9\x54\x81\x8b\x35\xd5\xd8\xd7\xdc\x2c\xf3\xf2\xa4\xb7\x30\xf6\xdc\x60\x31\x80\xd5\x87\xb2\x6b\x77\x27\xb2\xdf\x6b\x80\xb3\xd8\x40\x18\xf5\xcb\xfb\x43\x55\x1e\xca\xdb\xb2\xa8\x1b\xa8\x90\xb9\x86\x88\xf7\x8e\x3d\x34\x76\xda\x19\x5d\x4b\x12\x04\x04\xaf\xc5\xc1\x7d\xeb\x6f\xc2\x5f\x46\x12\xd0\xd4\xf3\xd6\xbd\x5a\x65\x27\xcd\xeb\xeb\x7f\x49\x40\xad\x06\xa7\x7f\xef\xcb\xd7\x33\x21\xbf\xd1\x23\x48\x42\x66\xb5\xc9\x86\x46\xf6\x2c\x09\xe3\x38\x26\x03\x9c\x70\xef\x2f\xe2\x07\xc8\x08\x23\xf1\xbd\xd0\xdd\xd2\x56\x5f\x97\xd5\x97\xed\x83\x24\x4a\x14\x62\x35\x07\x61\x80\x05\x70\x34\x33\x82\x83\xbf\xfa\x77\x36\x24\x49\x48\x4c\xb0\xdb\xd7\xa3\xad\xb1\x1a\xbf\xac\x3e\x8f\x4d\x39\xb7\x03\x24\x34\x32\x31\xb5\x4b\x54\x59\x67\xcd\x4a\x64\xe3\x05\x23\xa1\x8c\x75\x15\x65\x27\x6f\x33\x14\xa5\x60\x09\x35\xc2\xf1\x02\x9b\x15\xe4\xf0\xec\xd3\xed\x09\x48\x29\x61\x41\x8c\xe5\x3e\x14\xc9\xb0\x1a\x05\xf7\xc5\x53\x51\x77\xb8\x5c\xf4\x78\xf2\x67\x65\x3c\x48\x1d\x08\xfb\xef\xa5\x5c\x8a\x62\x69\xf5\x37\x4d\x3b\x93\xad\xe9\xe7\x45\x32\xf4\x64\x56\x31\x4e\x71\x1f\xf3\x7a\x4e\x37\xe5\xa7\xc8\x9b\x4f\x9b\x18\x4f\x86\xa6\x91\xc2\x9d\xdd\x12\x77\xcf\x25\x7f\x58\xc2\x80\x21\xf3\xa4\x43\x1a\x74\x53\xb4\x0d\xa1\xa9\xf5\x15\x55\xe5\xfd\xb1\x5b\xfa\x12\xce\x09\x4f\x26\xb1\x54\xfb\x66\x2c\x4f\x75\x53\x1e\xac\x78\x7d\x56\x3c\xdf\xc1\x2f\x8d\x5c\xdd\x09\x63\x66\xad\x63\x9f\xa1\xb1\xc8\x39\xf7\xf4\xf6\xaf\x30\x49\x7c\x92\x98\x53\xc7\x1e\xf4\xe6\x01\x7f\x95\x12\x7f\xe1\x95\x89\x9d\x22\x02\xca\x2c\xde\x1b\x24\xd7\xfa\x43\x32\xe2\x4e\xbd\x73\x71\x6a\x90\x57\x33\xbe\xee\x44\x08\xac\xe3\x5d\xdd\xfe\xf0\x9f\x11\x41\x8c\x71\x26\x06\x47\xfb\xac\x76\x6c\x1e\x84\x0c\x0d\xee\xba\x08\x12\xab\x89\xe3\x1c\xdc\xcf\x56\xe4\x5f\xd5\xb5\x27\x21\x69\x22\x42\xdb\x28\xb1\x91\x3e\x7a\xd1\x8c\xdf\x71\x11\x5a\x7f\x8f\xdd\x0b\x3c\x88\xa6\xca\xca\x01\xbd\x0f\xb1\xbc\x98\x85\x36\xe5\xf7\xb2\xaa\x27\xfb\x7e\xa2\x22\x8a\x38\x79\xa7\x47\x7a\xbb\xb9\xdb\x3f\xdc\x2c\xfe\xec\xdb\xab\x89\x52\x1c\x0b\x19\x42\x29\x38\x36\xbf\x7f\xaa\xc9\x63\x53\x46\x44\xbe\x33\xd9\xa9\x36\xa2\x7b\xc5\xf0\x87\x25\xc3\x5f\xa4\x43\xc0\xa0\xe7\xbb\x47\xc5\x7e\x65\x3d\x37\xff\x6c\x35\xd3\xca\xc1\xd7\x36\xf5\x12\x21\x57\xf3\xd5\xda\x44\x1b\x83\x84\xcd\x43\x56\xac\x9b\x97\x07\x97\x70\x89\x81\x32\x28\x4b\x4c\x6c\xac\xcd\x0d\x52\x5a\x1f\x31\xa3\xfa\xff\x71\xf6\x26\xdb\x8d\xe3\x58\xfe\xf0\xeb\xe4\xa2\x16\x04\x07\x00\x5c\xca\xb2\xec\x50\xa5\x07\xb5\x25\x67\x54\x56\x9d\x3c\x3a\x18\x2e\x64\xfe\x83\x22\xd5\x24\x65\x87\xea\xe9\xbf\xc3\x0b\x80\x93\x68\x47\xf6\xd7\x8b\x8c\x2e\x13\xa2\x28\x12\x04\xee\xf0\x1b\xfc\x21\x41\x31\x9e\x69\xf7\xf8\x9b\xf3\x35\xa8\x8b\x1b\x65\xcb\xfe\x06\x1a\xf5\xa6\xb3\xf7\x09\x42\x84\x1b\xa3\x91\xab\xd7\xb7\xee\xbf\xae\x1c\xa5\x01\x4d\x31\x2d\xd8\x17\xf0\xb1\x55\x6f\xd6\xaa\x0b\x91\x01\x76\xd9\x99\xfd\x99\x29\x61\x01\xb8\x5e\x6b\xf7\xba\x7b\xaa\x86\x1f\x22\x6c\x3d\x40\x89\xe2\xb6\xca\x3e\x41\x01\xa7\xc4\x24\x52\x77\x3b\xf2\xb6\x3c\xc2\xed\x6a\x57\x8f\x92\xaa\xc9\x37\x1b\x81\x5a\x7b\x5b\xc4\x78\x84\xfb\xbb\xf5\xd3\x7a\xeb\x37\xff\x34\x8c\x22\x4f\x9c\x7c\x41\x45\x0d\xa8\xc6\x6c\xf8\xc9\xd7\x87\x2a\x92\x89\xb3\x33\xea\xb2\x95\xf9\x9f\x1c\x6a\x83\x1b\xad\xcd\xca\x9d\x02\xcb\x34\x61\x9c\x9c\xdd\x44\x88\xd6\x72\x8e\x85\xb6\x2d\xf0\x21\x4e\xbd\xe2\x50\x92\x46\x01\x90\x68\xa0\x4c\xe1\x8d\xd9\x3b\xa6\xce\x78\x02\xa4\x51\x18\x78\xdf\x61\x47\xbe\xff\x03\xf2\x52\x75\x12\x23\x49\x9a\x44\x24\xe0\x7d\x90\x63\xaf\x08\xf0\x9e\x76\xaa\xc8\x83\x72\xd6\xf0\xe5\x6e\x3f\x6b\x3a\xc4\xd3\xb2\xa8\x7b\x20\xd2\xb4\x78\x39\xda\x5f\xd3\x84\x06\xc8\x8a\xdb\x88\x4a\xc8\x32\x17\xdd\xb5\x50\x85\xce\xac\x8b\x9b\xa5\xf7\x52\xfc\x5b\x95\xe6\x34\xe1\x24\xf5\xbe\x6d\x6d\x08\x3b\x7c\xc5\x7d\xb0\x9b\x26\x3c\xc4\x0a\xbf\x2e\x3f\x8a\xba\xa9\xfa\x15\x37\x4d\x64\xc2\x6c\xb1\xf7\x74\x99\x65\x33\xa4\x34\x08\x30\x37\x38\x89\xcb\x23\xdc\x39\xe6\x27\xf1\x77\x99\x86\x0c\x5c\x96\xb3\x11\xf3\xc4\xaa\x24\xa5\x2c\x09\x88\x97\xd9\x2b\xce\x22\x7f\x7e\x87\xaa\xca\xf4\xb0\x99\x97\xb2\xd0\x20\x6b\xae\x01\xf5\xe6\x93\x6e\x7f\x28\x11\xd1\x90\x0b\xdb\xfd\x9d\x85\x28\xf6\x8c\x6b\xdb\xed\x83\xcf\xfe\x52\x1e\x44\x18\x79\x9f\xc4\xb9\xf6\x95\xdc\xe1\x57\x71\x92\x22\x92\xfa\xbe\x2a\xcf\xa7\x69\xab\xec\x1f\x13\xd4\x40\xca\x43\x0b\x64\x41\x3a\x5f\x9b\xf2\xf4\x3b\x76\xca\x85\x65\x0b\x2f\x33\xdd\x95\x8a\xd2\x34\x09\x3c\x4f\x04\x01\x65\xcb\x2b\xe5\x94\x24\x4d\x19\x15\xbe\x75\xd9\xa6\x6e\xdb\xf3\xf1\x37\x47\xbe\x73\x23\x04\x04\xc6\xcd\xf7\x7d\x9b\xf8\x0d\x1b\xa6\xd3\x4b\x94\x8a\x58\xb1\x2e\xa7\xcd\x3a\x0a\x6a\x53\x45\x52\xe2\x60\x44\xaf\x59\xd1\xdc\x91\xc9\xb5\x28\x62\xbc\x47\xfb\x7d\x25\xde\x45\x23\x26\xe9\x5c\xaa\xb8\x40\xb9\x24\x8c\xbc\x6e\xfd\xef\x54\xca\xe6\xdd\x76\x07\x5c\xab\xf2\x16\x84\x7e\xb8\x42\x4c\xa7\xca\x58\xef\xa3\x0a\xfe\xf7\x0c\x63\x1b\xfa\x24\xd5\x81\xa5\xaa\xbe\x97\x0d\xbc\x9c\xf3\xe1\xb2\x32\x78\x62\x3a\x4a\xad\xee\x73\xd9\x40\xbd\x17\x07\x91\x15\x5d\xad\x3d\xd5\x69\x88\x89\xcc\xbf\xdc\xff\x05\xe4\x93\x79\xa8\x25\x57\xdc\x41\x0d\x32\x91\x77\x6d\x3e\x2f\xcc\x74\x95\x3c\xf7\xb7\xba\x3b\x83\x40\xbf\x3c\xd7\x40\x2d\xab\xef\x55\xd9\xae\x71\xd5\x27\x79\x77\x0a\x86\x25\xde\x35\xe9\xff\x24\x25\x94\xa4\x26\x21\xcc\x51\x17\x4d\x56\x1d\xaf\xc0\xab\xa9\x01\x12\x85\x03\x73\x8e\xfa\xe6\x82\xff\xce\x24\xe4\xa9\x01\xc6\xad\x20\x7c\x9b\x63\xd9\xb7\xc2\xcb\xa0\xcc\xdf\x2d\x11\xd0\x08\x03\x1c\x21\xcb\xee\x95\x13\x01\x0b\x11\xff\x78\x14\x3f\x60\xd1\xae\x96\xf5\x71\x66\xf3\x9b\x8f\x3a\x05\x49\x42\x0c\xc9\x75\x95\x9d\x46\x38\x2a\x41\xa4\x41\x3b\x0e\xc4\x39\xb8\x16\xab\xc9\x2c\x62\xf7\x5b\x56\xa0\xad\x92\x33\x41\x76\x8e\x1c\x22\xcb\x7f\x1b\x9f\x5c\xa7\x89\xee\x67\xd9\xb6\x10\xa7\xfa\xad\x9c\xe2\xe5\x44\x48\x18\x2e\x67\xc7\x73\xde\x64\x56\xdd\xf0\x13\xad\xbf\xeb\xbe\x85\x08\x23\x9a\xb8\x12\xab\x33\x8f\xc1\xc0\x25\xf3\x4d\x4a\x11\x52\x86\x46\x07\x8b\x73\xf3\x86\xfc\xcd\x2f\x1f\xb1\x88\x98\xd5\xc3\x45\x85\x72\x67\x85\x37\x50\xbe\x49\x44\x24\x52\x2c\x22\x1e\x51\xea\x16\xe5\x09\x55\x76\xca\xfa\x34\x47\x44\xca\x58\x93\x66\x5f\xff\xc3\x91\xa2\x63\x52\x7d\xa1\x41\x90\x88\x08\xac\x4d\x56\xb7\x47\xaa\x8b\x67\xe9\x4e\x6e\x5b\x64\x24\xc2\x51\xf6\x4d\x95\x1d\x0e\x18\x2c\xf4\x78\xfa\xee\x0e\x8e\x3f\x13\x07\x04\x9f\x88\xb7\x2f\xbb\x39\x6b\x47\x16\xf7\x17\x1f\xa7\xb6\xbf\x7f\x42\x05\x5b\x91\x67\xcd\x65\x37\xa0\xc4\x88\x36\x33\x0c\xc6\x75\x81\xef\x6f\xc3\xfa\xc8\x8c\xf6\x50\x22\x92\x28\xc2\xd0\x6e\xef\x27\xfb\xf7\xac\xd8\x94\xcd\xf2\xad\x57\x9c\x49\x44\x42\xb9\xc7\x98\xa0\xcb\x40\x59\x8f\x0c\x19\xbe\x9e\xc8\x89\x8a\x23\x07\xba\xdc\xdf\xed\xfe\xc0\xfa\xe5\x7e\xf5\x8a\x88\xda\xc9\x4d\x48\xc0\xaa\x71\xb4\x81\x56\x59\x76\x20\x3c\x91\x00\x47\x25\x80\x2d\xa8\xa6\x74\x5e\xec\xda\xed\xad\xf3\x74\xaa\x7f\x4c\x3d\xfc\x13\x41\x29\x58\x5a\x42\x55\x89\xcb\xb3\x71\xdb\x66\xbd\x7b\x13\xcd\x37\xf1\x0e\x88\x9a\xed\x02\x4d\x41\x39\x25\x16\x83\x73\xc8\xc6\x6c\xf1\x44\x50\x45\x20\xf0\x8d\x7c\x2b\xda\x6c\x51\x2c\xdd\x05\x53\xd0\xe9\x48\x95\x03\xab\xa2\xf3\xbe\x52\xe3\xa0\x47\xf0\xc0\xaa\x2f\xf9\xeb\x9b\x8f\x31\x45\x9a\x10\x64\xa9\x82\x53\xab\x1f\x9f\x24\x65\x11\xaa\xfd\x38\xfa\xa3\xd3\x28\xf4\x07\x45\xa2\x3a\x18\x8d\x5d\x27\x27\x85\x7b\x3f\x50\x71\x5f\xbd\xdc\x82\xaa\xa0\x99\x7e\x8b\x0e\x12\xef\x60\x21\x46\x75\x2c\x21\xa8\xc4\xce\x08\x96\x5a\x57\x3f\x4f\xa0\x1a\xd0\x63\x40\xc5\x94\x86\x25\x04\x55\x91\xe3\x3b\x3f\x96\x05\x7c\x12\x20\x09\x25\x14\x96\x4b\xed\x52\x3b\x0c\x34\x85\x92\xca\x0a\x3e\x8a\x1f\xb0\x6d\xce\xed\x2e\xb5\xbe\x1d\xd2\x6d\x84\xe6\x16\xf3\x2d\xcf\x08\xdd\xb0\x0d\xb3\xe1\x22\xa2\xdb\x20\x11\x71\x66\x16\xbb\x6d\x1f\xec\x6d\x47\x51\x11\x5a\x05\xca\xe6\x8a\x6d\x1e\x64\xeb\x24\x7f\xab\x44\xe2\xc3\x40\x01\x61\x80\xe6\x80\x0b\x94\xfc\xfb\x4a\xa9\x39\x11\x10\x5b\x70\xe2\xa1\xd4\x6d\x92\x7f\x14\x4d\xa6\x96\x4e\x80\xbe\x83\xff\x0a\xd0\xcc\xab\xf5\x3f\x9d\x8f\x0b\x0c\xf8\xeb\x7f\x59\xb9\x9a\x7f\x21\x8f\x78\x78\x76\xff\x53\x0d\x49\xb9\xb5\x81\x79\x0f\xd9\x7c\x7e\x22\x4c\xa8\x62\x6b\x22\x5b\x43\x63\x95\xff\xaf\xb5\x13\x27\x53\xd3\x24\x96\x91\xf6\xf8\xbc\x5b\xce\x62\xf1\x87\xcf\x4c\x06\x89\x46\xc6\xa3\xd7\xf1\x7f\xb1\x5b\xd2\xfc\xf5\xc8\x20\x15\xb8\xf7\xd5\xe5\x11\xc6\x36\xeb\x89\x24\x41\xca\x46\x2a\xf1\x76\xbe\x59\x1c\x79\x37\x88\x10\xb4\x17\x7f\x59\xfd\xcf\xeb\x6a\xbb\xdb\x2f\x17\x4f\xcb\xd5\xc3\xea\x76\x7f\xf3\xe7\xfe\xe6\xf9\xe5\xe5\xf9\xfb\xea\x65\xbf\xdd\x2d\x76\xaf\xdb\xfe\x23\x92\x85\xbe\x9b\x9d\x97\x0e\x36\x47\x7a\x6f\xa6\x64\x32\x93\x65\x48\x14\x1a\x63\x59\xa9\x95\xb7\x2c\xd7\x5f\xb8\x13\x24\x32\xe4\x04\xa1\xac\x42\xeb\x59\xc7\x1b\x37\x2c\x52\xc2\x04\x5d\x93\x04\xbd\x6c\xdb\xf7\x77\xd3\x3e\xe5\x9b\x8b\x85\xe5\xcc\x65\x8c\x32\x02\x08\xda\x1b\xf3\x74\xbf\xf0\xbf\x29\xa6\x71\x92\x5e\xcb\x14\x8d\xc3\xb9\x4f\x5e\x54\x19\x0b\x8b\xb3\x72\x96\x1c\xbb\xe5\x40\x50\xb9\x3d\x9a\x62\xbf\xee\xdb\xf6\xf6\x9f\x83\x22\x8e\x4c\x12\x8d\xa0\xb0\xed\xeb\xcd\x76\xf9\xb2\xde\xec\xd6\xcf\x4f\xfb\xc7\xe7\xdb\xd7\x8e\x3e\x21\x69\x1c\x69\xa7\x27\xe4\x5e\x8b\x4e\x43\x70\xbc\x53\x48\xea\x4a\x1a\x8d\x37\x97\x5b\xe8\xf7\xac\x2e\xbb\x64\x43\x52\xa5\x10\x6f\xf1\x22\x8a\x1f\x59\x71\xb8\x11\x79\x7e\x5f\xe6\xba\xef\x1a\x78\x09\xd5\xe4\x2f\xff\x09\x6d\x70\x07\xbe\x39\x57\x63\xcb\x85\xcf\xea\x3b\xd7\xb3\x93\x82\xc0\x6c\x3e\xab\xdb\x87\x32\x61\xbd\x49\x96\x44\x56\x62\xa2\x8d\xdb\xac\xed\x9d\x6b\x67\xad\x90\x49\x3a\x98\xca\x2c\xe1\x16\x0d\x6c\x45\x16\x7c\x5a\xe6\x8e\x72\xe8\xc4\xf7\x97\x1d\xb4\x6e\x7c\x25\x69\x2c\xf1\xc7\x3c\xae\x9f\x77\xbf\x7e\x07\x05\xb1\xda\xbc\xc8\x6e\x78\x2e\x6e\xe0\x4d\xe4\xe6\xda\x2f\x69\x56\x7a\x21\x91\x82\x5a\x6a\xdb\x62\xb9\xe8\x30\x8a\x7f\x17\x01\xeb\x4f\x91\x0a\xbb\x37\x77\xe4\xc6\xb2\xba\x8a\xe1\xa5\x0c\x2c\xac\x50\x5b\x2a\xd1\x55\x32\xea\x8a\x74\x33\xf6\xba\xdc\x9f\x21\x02\x94\x27\x43\x31\x11\xfb\xc6\x8c\x9f\x91\x4c\x8c\xb6\x36\x38\xbb\xb2\x2c\x7a\x9e\x9e\x3f\x0c\x2c\x80\xce\xab\xfe\x8f\xb2\xe9\xd3\x5b\xa9\x80\xc2\xa8\xb9\xdc\x06\xcd\x9f\x03\x77\xa5\xe6\x12\x91\xe9\x4f\xa5\xcc\x41\x5e\x0b\xee\xb9\x61\xc0\xa4\x89\x3a\x27\x96\xd2\x11\x6c\x5e\xfa\x46\xb9\xff\x7e\xc3\x43\xe3\x99\x0a\x6f\x22\xcf\xa1\x38\xc0\x15\xa5\x49\x9a\x34\x50\x62\xd0\x6d\x69\xdf\xfd\xb2\xba\xb9\xcc\x98\x87\x25\xd2\x00\x49\x7a\xda\x5e\xfb\xfe\xa0\x27\x61\xfb\x86\xdc\xc1\x27\x38\x54\x15\x90\x14\x81\x95\x0f\xe5\xe1\xee\x5c\xfc\x42\xfc\x40\x05\x89\xc0\x58\xf9\xad\xd4\xf9\x5d\x59\x45\x7e\x9f\x55\x44\x47\x71\xea\xf3\x4f\x4f\x52\x18\x7f\x36\x74\xb2\x54\xaa\x3c\x9e\xce\x16\xcc\x33\x03\x3e\x56\xa1\x8e\x3d\x46\xc1\xea\x24\xf4\x88\x00\x15\x07\x06\xa5\x03\x51\xde\x5a\x54\xe2\xf8\x7c\x6e\x9e\xcd\x0d\x7a\x98\xde\xb5\x69\x93\x1f\x17\x6a\x2f\xc7\xbd\x81\xe6\xe6\x82\x6c\xe6\x4f\x7e\x52\xac\x01\xa5\xd3\xac\x9f\x88\xdf\xcf\xc6\x37\x29\x91\x96\x0b\x63\xb5\x77\x31\x3a\x72\xaa\xf3\x6e\x00\x8d\xb9\xb2\xde\x82\x8f\xb7\x8b\xee\x8f\x09\x21\xd6\x29\xa1\x5d\x12\x32\xf4\x51\xf3\x87\xd2\xd4\x0b\x71\xbf\x16\xca\xc6\xb2\x58\xea\x59\x9b\x45\x31\xe9\x0c\x28\x16\x6a\xdc\x49\x64\x75\xe9\xf2\x0b\xc5\x62\xab\x10\xd9\xde\x8a\x47\x34\xfa\x3e\x57\x45\x14\xa2\xd4\xdd\xe8\xd2\x18\x03\xcc\xb3\x30\xd7\x3e\xa0\xb4\x81\x3b\xc2\x03\xc5\x9d\x03\xce\xb9\x6e\x4a\x9d\x89\xc9\xfb\xa5\x78\x42\xb8\xf4\xd6\xe4\x65\x6d\x71\xb7\x93\xab\x4b\x49\xac\x9c\x47\x72\x56\xb7\xdb\x9b\x18\xf0\x3e\x54\x4a\x6d\x6b\xd2\x57\xfe\xfe\x2e\x4a\x66\xf6\xed\x52\x69\x1a\xf8\x1d\xa7\xbd\x9b\x4b\x17\xaf\x67\x65\xe1\x05\xce\x26\x17\x27\xb8\x02\x32\xf0\x4c\xdb\x95\x2f\x70\x18\xa0\xd7\x95\x00\xa5\x22\x3f\x53\x86\x2e\xa5\x93\x6f\x16\x86\xc6\xdc\x23\xf2\xb2\xb2\x78\x14\x8d\x7a\xfb\x0c\x8f\xa2\x24\xb1\x1d\x80\x0f\x68\xde\x46\xaa\xd2\x89\x92\x21\xc3\x6a\xf3\x31\x2b\x60\x00\xf9\x20\xdd\x47\xb5\xc2\xe6\xc6\x02\x9b\x1f\xf5\xa6\x2a\x4b\x53\x9a\x6f\xe7\xa3\x68\x63\xa4\xc9\xf3\x91\x60\xdd\x21\xb0\xd4\xed\xa8\x5c\x4e\x71\x63\x7b\xae\x4e\xf9\xb9\xee\x4a\xbf\x23\x40\x95\x52\xa1\xb6\x35\x93\x7a\x5d\x0c\xa1\x0a\x4a\x25\xa9\xad\xd8\x5b\x8f\x4e\xf5\x06\xc7\xa1\x3a\x78\xa2\x74\x18\x25\x9e\x22\xe2\xbc\x09\x66\x92\x4b\x3f\x38\x56\xbd\xde\x7c\xdd\xfc\x9e\xa9\x9e\xe1\xab\x34\xe3\x16\xf4\x20\xde\xe1\x11\x1a\x31\x62\xc2\x7f\x22\xa1\x3e\x30\x83\x9e\x31\x9a\xbb\x76\x8a\x4e\x94\xa1\x16\xef\x60\x69\xd0\x56\x29\x0a\xa7\x42\x9b\x2e\xbc\x40\x9b\xf2\x8d\xe7\x8c\x0e\x64\x8c\xa2\x24\x0f\xe5\xe1\x05\x34\xc0\x71\xd6\x0f\xc9\x0d\x26\xa1\x05\x63\x9f\x8b\x46\x1c\x46\xe9\x8d\x26\x51\x4a\xad\x7e\x6e\xa1\x17\x79\x6e\x93\x24\x7f\xcc\x58\xb5\x2d\x0d\x75\x53\x95\x97\xa5\xa8\x26\xdd\x56\x4d\x0c\xa7\x2e\x89\x5f\x34\xe5\xd1\x16\xbe\x66\x03\x52\x1d\x25\x0c\x65\x6d\xf3\xf2\xb0\x84\x2c\x77\xc6\x07\xe1\xc8\x52\x2a\xd1\x11\xd3\x98\xc7\x1c\x0f\xc7\x36\x19\xb9\xc2\x08\xea\x58\xc4\xa9\x43\x11\x6c\xcf\xd2\x0b\x54\xcc\x2c\xd1\x9a\x26\xc4\x5b\xe6\x60\x1e\xee\x48\x10\xe3\xab\xa2\xda\xa2\x0a\xdb\xe8\x30\xd3\x57\xe4\x15\x4d\x35\x45\x84\xe3\xed\xe2\xcf\xb1\x76\x80\x66\xa9\x41\xed\x80\x25\x54\x4d\x66\x32\x5b\xec\xe9\x75\xee\xe7\x79\x9b\x9a\x89\x00\x41\xf4\xae\x3b\x3d\xfb\x1a\x6b\xa6\x03\xfc\x8d\x05\xfc\x6c\xf6\x3a\x13\xd5\x65\x9f\xe9\xee\x7b\x0d\xc1\x3d\xac\x11\x3f\xe0\xe6\x7c\xc1\x90\x7d\x28\x65\xe5\x7f\x41\xff\xff\xce\xc7\x30\xee\x74\x3c\xd4\xc4\xed\xf0\x56\xa6\x14\x15\xd5\x06\xc5\x7a\x9d\x12\xc9\x93\x71\x8a\xb0\xef\xbe\x90\xf5\x5f\xe8\xfe\x5f\x3e\xfa\xaf\x9d\xec\xc3\xff\x7e\x75\x31\x69\xcc\x90\x5b\xfa\x0e\x55\x66\x2e\x37\xd0\x3c\x8a\x7a\xb2\x92\xeb\x94\xc5\x08\x5d\xf6\x06\x3b\x3e\x56\xd2\x69\x6a\xa2\xa4\xb3\xbe\x7e\x44\x8a\x7c\x77\x4c\x0a\xe2\xb6\xda\x5d\xe6\x95\x65\x13\x9d\x2a\x40\x5c\x41\xfb\x0d\x8f\xe2\xa7\xff\xb3\x88\x14\xe9\xd1\x30\x4f\xf0\x71\x2f\x72\xf1\x73\xd6\x63\x26\xd1\x42\x30\xac\x30\x94\xed\x8d\xa9\x07\x6a\x75\x89\x96\x21\x0f\x53\xa7\xa0\xb1\x6d\xda\x37\xdb\x76\xcc\xfe\x1e\x46\x40\xcb\xd0\xe6\x88\xdf\xb3\x02\x41\xad\xfe\xb4\x90\x00\xf7\x84\xaa\xec\x27\xe4\xb8\xdf\xe1\x1b\x30\x53\x07\xb9\x0e\x12\x35\xb0\x18\xcb\x3c\x9b\x9b\x65\x77\x4a\xa5\x50\x67\xdd\x7b\x48\x55\x9e\xee\xf2\xc9\x82\x62\x94\xc2\x5a\x94\x4d\x46\x45\xdd\x74\x7b\x95\x36\x46\x63\x43\xca\x9e\xca\xc5\x94\x33\xe2\xf5\x09\x04\xb1\xb5\xd2\x38\x55\xe0\x65\x11\xfd\x91\x34\x40\x50\x8f\x06\xf5\xa9\x7c\x0d\x04\x26\x46\x1c\x60\xdd\x2e\x0f\x8f\xe2\x27\x96\xc3\xae\x16\x0c\x08\x63\x41\xe5\x50\xeb\xa5\xdb\x46\x20\x4e\x21\x31\xae\xec\x82\x37\xb1\xfe\xed\x7a\x06\x9f\xaf\x8c\x3a\x13\x88\x75\x14\x58\x11\xf6\xe2\xbf\x50\x95\xdd\xf6\xb5\xca\x91\xe1\xd8\xa6\x8e\xa7\x6c\xfe\xe5\x86\xc4\x50\x32\xd4\xbc\xdb\x43\xa5\xc2\xe0\x57\x21\x87\xfb\x30\x0d\xb8\x74\xc2\x9c\xaf\xa7\xc3\x2c\x2d\x70\xb0\x0d\x02\x0d\xa4\x8e\xc7\xcd\xef\x2b\x61\x09\xa0\xb1\x40\xaa\x81\xbf\xa0\x07\x51\x68\xbf\x34\xcf\xad\x61\x40\x05\x13\x8e\x56\x2a\xa4\xbf\x97\x14\x12\x49\xbb\x5e\x2e\x72\xef\x6a\x54\x83\xf4\x03\x78\x68\xb1\x04\xa3\x66\xef\x5d\x55\x1e\x3b\x6d\xd8\xf1\xd2\x0c\x3c\x8a\x5d\x3f\xb2\xf6\x32\x39\x03\xd7\xe0\x27\xf8\x78\xbc\x0c\x62\x24\x48\x35\x8f\x86\x1a\xec\xbb\x72\x8a\xe5\x1a\x6d\xc0\xee\x53\x82\x3a\x19\x13\x5c\x34\x8a\x52\x77\x86\xfd\xd6\x78\xea\x2d\x9b\x00\x3e\x41\xa4\xb1\xe8\x8c\x5d\xd1\xf9\xff\xcb\xb7\x18\x64\x12\xba\x26\xb7\xf3\x4a\x1a\xde\x14\xc9\x82\xd0\x0c\x85\xa0\xbf\x67\x45\x31\x23\xb8\xe4\x87\xf3\xd8\x5a\x9f\xbf\x95\x1f\x37\x99\xee\x4b\x50\x20\xa5\xd1\xc4\x8b\xb3\x7d\x94\xc3\x2e\x2d\x28\x6a\xe5\xdb\x41\x54\xf9\x65\x84\xfc\x02\x1d\x19\x6d\xdd\x43\x9e\x5e\xb7\xfb\x5e\x92\xa2\x3b\x9e\xc4\xdc\x5f\x9f\x13\x28\xf0\x62\xbd\x3e\x62\x1c\xad\xe0\xa0\x69\x8c\x91\xea\xf2\xdf\xbf\x44\xb0\x74\x9f\xa0\xd8\x59\x5c\x3d\xfd\x73\x37\xcb\x1f\x9a\x2d\x08\x02\x84\x0c\xfb\xf8\x8b\x5c\x74\xe8\x56\x80\xd0\x70\xe1\x0d\x29\x45\xf1\x6c\x0c\xd2\xd2\xbb\x8c\x06\x80\x85\x58\xa6\x5e\x6f\xb7\x43\x68\x2b\x80\xd0\x31\xb1\x53\xfa\xa9\x1c\x50\x78\x66\x0a\x1b\x00\x8a\x51\xab\x45\x83\x38\x26\xa7\xc9\xd1\xce\x84\x51\x63\xd5\x04\xd4\xfa\x98\xb8\x35\x15\x49\x30\x2f\xeb\x4d\x05\x26\xfb\x39\x8a\xc1\x4c\x90\x5a\x9d\xca\xac\x7e\x2e\x6e\x44\xd3\xe4\xe3\xfe\xb1\x09\x34\xa5\xd6\x6e\x2b\x2f\x85\x46\x27\xc5\x9b\xcb\x35\x57\xc9\x90\xc0\xa6\x09\xed\x7e\xe3\x26\xd2\x17\x2c\x5f\x43\xa4\xc6\xd8\x66\xa5\x4a\x07\x2f\x74\x07\x42\x62\xb0\x74\x73\x9f\x0b\x9d\xa1\xbd\x69\x8d\x79\x67\xa7\xa3\x9c\x98\x30\x09\x98\x05\xd7\xab\xf2\x1d\xd5\xee\x27\x0d\x4f\x13\x32\x19\x06\xbd\xb5\xa9\x63\x6a\xe3\x6d\xb8\x11\x1d\xaa\xc4\x84\x46\x0a\xab\x83\x9a\xfd\xe2\x4d\x32\x91\x33\xc4\x6c\x43\x3f\xd1\x99\xfa\xcd\x6a\xfd\x98\x98\xa6\x58\x08\xd1\x59\x77\xc9\xb1\xb6\x3a\x95\x36\x4b\xf9\xdf\xf5\xf2\x79\xf2\x19\x1a\xdb\x66\x97\xc8\x65\x59\x8f\xde\x13\x43\x79\x40\x9d\xa1\xdb\x13\x74\x9d\x8d\xaf\x91\xec\x93\xab\xa7\x3c\x0e\xe3\x01\x91\xb4\xbe\xb9\xdc\xec\x96\x93\x27\x48\x15\xa1\xbd\xf7\x9b\xbb\x86\x41\x7c\x6c\x58\x2a\x71\xda\x3f\x94\xd5\x50\xbe\xc7\x30\x63\x2c\x51\x17\x2f\xa9\x9d\x22\xed\x16\x38\x7a\x37\x0d\x0f\x04\x26\xe3\xaf\x32\x13\x8d\xa8\xda\x05\xe7\x0f\x71\xce\x3f\x85\x2c\xfa\x8f\x85\x1c\xf1\x87\x26\xcb\x6d\xf4\xf7\x54\x5a\x95\x81\x99\xf5\xd4\xf0\x38\xb2\x40\x85\xb2\x68\xaa\xb3\x6a\xca\x39\x05\xdd\xc4\x70\xce\x51\x09\xa6\x5d\xf6\xb7\x4a\x1c\xe7\xe8\x2c\x83\x2b\x10\xa1\xf3\xa0\x32\xe7\x42\x8f\xad\x6b\x07\x49\xd6\x8c\x9c\xf2\xf8\x3c\x69\x44\x10\x82\xb8\x38\x4a\x2f\xca\x30\x19\x40\x05\xda\x8c\x1f\xca\x5c\xdf\x94\xe7\xc3\xdb\x15\xaa\xe0\x1f\xb3\x2b\xc3\x17\x7c\x63\x23\x22\x82\xfd\xee\x9b\xdd\x6e\x3b\x5e\xe0\xbe\x42\xf7\x4d\xc0\x8e\x46\x44\xdc\xb3\xdf\xa0\xeb\xba\x19\x21\xac\x33\x02\xa2\xf9\xbb\x3f\x2a\xc3\xf8\xb0\x67\x6b\x15\x04\x67\xef\xac\x0c\x09\xe6\xf1\x65\x91\x5f\xac\x4a\x66\xf5\x8b\xfd\xcf\xc8\x28\x42\xcc\x0f\x42\x5d\x7a\x19\x58\x23\x39\xa0\xa8\x89\xeb\x4f\xef\xa0\x6e\x86\x70\x60\xa3\x22\xb0\xac\xd6\x1e\x3c\x3c\x12\xa8\xf7\xc3\x58\x82\x39\x67\x9b\xef\xd7\xb8\xbd\xba\x03\x9a\x73\x04\x99\x64\x08\x6b\xc4\x25\x64\xfc\x49\x88\x28\xce\xa9\xc7\xf5\xed\xfe\xfe\x65\x71\xbb\xda\x2f\x17\xbb\xd5\xfd\xf3\xcb\x9f\xfe\x14\x26\x48\xb8\x25\x55\xd6\x6f\xd6\x28\x69\xb6\xf8\x6c\x4c\x48\x70\x1a\xe0\x2c\x6b\x2f\xb4\xb7\x5c\x9e\x0c\x8c\x44\xe2\xba\x8b\x2f\x22\xab\x5d\x75\xac\xfb\x3a\x11\x22\xc7\xf9\x4d\x14\x3a\xef\x98\xe6\x9f\xc1\x9d\x3e\xa7\x62\xcd\xa5\x4a\xc6\x48\x40\xd4\xb7\x4d\x95\x30\xc1\xfd\x6d\x54\x59\x98\xfe\x3b\x9f\x12\x5c\x6d\x0a\x46\x53\xce\x06\x4a\xbf\x0f\xd9\x31\x1b\x2e\x41\x34\x08\xa2\xc4\xbd\x8d\xa7\x72\xb0\x89\xb6\x07\x38\x16\x8d\x10\x4f\xf5\xfc\xee\x6f\x04\x0d\x02\x61\x78\x6f\x0f\xb5\xa9\x4a\x93\xe5\xb0\x3e\x1e\xce\x63\x05\x55\x1a\x04\x40\x2c\x7f\xde\x62\x42\xf1\xbb\xc7\x2b\x3b\x0d\x48\x44\x30\xfb\xb1\x2c\xf4\xa2\xeb\x0f\xd3\x80\xf0\x18\xac\x30\xe3\xb9\x12\x3d\xb3\x94\x06\x44\x6b\xfc\x4d\xbb\xa7\xf9\xbe\xc5\x79\x4a\x9e\xa3\x41\x98\x48\x6c\x1e\xe4\x99\x82\xa2\x86\x1d\x54\xc7\xfa\x9b\xa8\x1f\xc5\xcf\x91\xbf\xc5\xf0\x99\xd0\x20\xa4\x21\xce\x9b\x1b\x7d\x5a\x1f\xc5\x01\x46\xcb\xb0\xbf\x7d\x91\x0c\xb0\x38\xfd\xf8\xfa\xb0\x5b\x6f\xd7\xf7\xfb\xef\x8b\x87\x87\xd5\x6e\xac\x11\x49\x83\x38\x06\x2b\x36\x8a\x65\x72\xbc\xec\x71\xf2\xe8\xc7\x29\x21\xc8\xbc\x43\xae\x7b\xa6\x34\x48\x62\x83\xd3\x54\xb8\x52\xd8\xee\xad\x82\xfa\xad\xcc\x75\xec\xbf\x2d\xe1\x91\xd7\x77\x6e\xb7\xf2\xfa\xfe\x5c\xd4\x6b\xdd\xdd\x59\x4a\x0d\x0a\xb3\xcf\xae\x5f\xe7\x39\x56\xd7\xf8\x22\x29\x4b\x70\xf5\xba\xcb\xaa\xda\xca\x03\xdb\x69\xe5\x0f\xab\x14\x37\x35\x27\xb0\xdb\xce\xe5\xc7\xfa\x30\x1f\x84\x4d\xce\xcc\x03\x6a\xf7\x79\xd4\xdf\x7b\xe9\x8c\x73\x63\x7f\x3c\x24\xc0\x47\x76\x6a\x37\x19\xb2\x8e\x77\xa5\xad\xdb\x8f\xde\x68\x1a\x70\xca\x50\x64\x39\xcf\xde\xe1\x06\x1a\xf8\xd9\xd9\x1d\xd1\x80\xab\x14\x3b\xb0\xed\x93\xdb\x0f\xf9\x26\x34\x48\x53\x0e\xd6\xfb\xf2\x72\x6a\x06\x45\xfc\xff\x4b\xc7\x0a\x7d\x9f\x30\xda\xde\xee\x16\x2f\xbb\xfd\xe6\x65\xbd\x5c\x75\x5f\x20\x4d\x30\x68\x8f\x9e\xeb\xac\x18\xd4\x91\x27\xe7\x11\x22\xc4\xf7\x2d\xab\xff\x80\xaa\x46\x4f\x96\xa1\x38\x63\x3b\x40\x21\xc5\xcf\xa9\x69\xde\x8b\xa3\xb7\xe9\x9b\xdb\x38\x69\x20\x23\xe9\xad\x1a\x5c\xe1\xf6\x4a\xed\x9e\x06\x92\x13\x54\x8c\xfc\x23\x3b\x3d\x66\x87\xea\xf3\x8a\x2b\x0d\x54\xca\x50\xd8\xc6\x54\xe5\x7f\xa1\x58\x14\x4e\x25\xba\x3b\x0a\xa8\xdd\xa0\xe1\x54\x81\x42\xa0\x8b\xbe\x6c\xcf\xb2\xb9\x9c\x60\xb4\x12\x29\xed\xec\x89\xeb\xe7\xcb\x68\x25\x82\xc4\xa0\xe2\x05\xfe\xf1\x3e\x33\x9f\xfd\x2e\x50\x16\xf0\x72\xaa\x4a\x05\x75\xdd\xc9\x32\xf8\x99\xd7\xad\x92\xa3\x45\x92\x06\xa0\x53\xec\x26\x54\x56\x72\x66\x54\xf6\xa1\x81\x21\x1a\xeb\xea\xd2\x9b\xe7\x5f\x19\xdb\xd1\xc0\x50\x89\x79\xa7\x7a\x13\xd5\xa1\x8d\xd8\x3e\xb2\x46\xbd\xc1\x74\xb1\x33\x86\x62\x21\xa4\xc9\x8e\xb0\xcb\xa0\x72\x04\x56\x4a\x02\x16\x7a\x3b\xf1\x19\x49\x11\x4a\xc2\x90\x63\x47\xe3\x03\xb2\xbb\x91\x84\x19\x25\x21\xd3\x08\x69\x70\xce\xb1\x8f\x8b\xc9\x47\xd1\x3f\xdd\x26\x99\xe7\x5c\xdf\x74\x8a\xf0\xfe\xb0\x64\x08\x66\xa9\xe0\xbd\xfc\x01\x4e\xfe\x6a\x16\x50\x44\x49\x1c\xab\x54\xf4\xcb\x0a\xea\xc5\x4d\x05\xe3\x28\x41\x9f\x69\x97\xe8\xc7\xfb\x1a\x55\x32\xb6\xe2\x08\x4f\xa5\xf6\xf7\x8b\xd0\x94\x1b\xe3\x49\x26\x5b\x14\x71\xcc\xb5\x87\x18\x8e\x00\xab\xbf\x6a\xd2\xfc\xdd\x7f\xbb\x2f\xd6\x18\xb6\xd8\x10\x6b\xee\x3d\xe6\xff\xf9\x6b\xea\x9d\xda\xfe\x7f\xee\xf3\x2c\x10\xd6\xc6\xa7\xbd\x8b\x59\x71\xb8\x15\x0d\x38\x47\x47\xff\xdb\x58\xc4\x90\x41\x6c\xdf\x86\xf9\xa9\x4a\x18\x4d\x10\x01\x71\x2a\x3f\xa0\x9a\xbc\xcf\x84\x69\xbb\x25\xbf\x67\xf0\x81\x5d\x44\xd7\x79\x75\x87\x39\x09\x42\xea\x65\x27\x7c\x2c\xd3\x1f\x4c\x71\x85\x7c\x59\x3c\xdd\xaf\x56\x4f\xb7\xfb\xb8\x3b\x42\xad\xc0\x6a\xa6\xca\xef\x00\x3f\xc2\x01\x0b\x97\x12\x9e\x46\xc6\xfb\x51\xb4\x5b\xf1\xe4\x99\x72\x19\xa6\x83\x16\x6c\x78\xe9\x3e\xa7\x42\x11\x5e\x63\xfe\xb7\x13\x71\x7a\x4a\xd2\x94\x13\x87\x28\xc3\x4b\xee\x50\x1b\xcf\xc6\x57\xfa\x06\x8d\x30\xff\x21\xa5\xd1\x3d\xf3\x78\xf9\x26\x72\x73\x3b\x2e\x11\x53\x22\x62\xb0\x95\xcf\x5e\xea\x8c\x12\x91\x58\x99\xc1\x76\xfa\xdd\x89\x2c\x7f\x2c\xdf\xe1\xfb\x1b\x14\xdb\xa6\x3c\x9d\xfa\x79\x2f\x80\xe2\x1b\xfb\x90\x19\x0b\xf1\x74\x4e\xed\x59\x59\x3c\x42\xbb\x4b\x67\xf5\x35\xcb\x74\x5c\x81\x1f\xff\x40\x99\x80\xad\xbb\xf5\x92\x2b\x24\xf4\xc7\xd2\x58\x82\x0f\x84\x6c\x3b\xfd\x31\x2b\x06\xde\x8d\x7e\x9c\x8c\x50\x24\x22\x07\xd3\xc4\x7c\x72\x33\xa4\x51\x08\x7d\x5e\xed\xbe\xed\x4f\x50\xed\x6f\x5e\x16\xfe\xc7\x28\x12\x63\x10\xd2\x80\x38\xbe\x16\x6d\xec\xd0\x3d\x75\x25\x14\x2a\x65\x59\xc4\x2b\x16\x1b\xba\xfb\xa7\x54\x24\x64\xff\x3e\x63\x6d\x16\x41\xa1\x76\x6a\xcc\x2f\x02\x3a\x08\x62\xd3\x8b\x22\x89\xe2\xc7\xe4\x47\xe8\x30\xf5\x96\x2b\x4b\x51\x39\xb3\x0f\x67\x82\xe6\x63\x2b\xa2\x63\xeb\x23\x7f\xae\x5d\x43\x72\x8e\x2c\x41\x89\x4e\x12\xe9\x34\xdc\x73\x29\xd4\x8f\xfd\x5d\x59\xa1\x60\xde\x47\x95\x8d\x4c\x53\x3c\x96\xb3\xcb\x5d\x29\x31\x24\xf0\x8e\x5b\xdb\xac\x01\x97\xe5\x7f\xc5\x08\xa5\xc4\x08\xe9\x59\x5e\xb6\x48\xdd\xc7\xcb\xfd\x83\x30\x9a\x06\x5d\xf8\xb3\x3f\x89\xcb\x5e\xe5\x19\x14\xcd\xd1\x56\x30\xdc\xdd\x0d\x03\x93\x20\x52\x55\x68\xfd\x3f\x57\xed\x7d\x1a\x86\xd2\x8a\x55\x6c\xd6\xf7\xf7\x7f\xee\x6f\x16\x4f\xbf\x4f\x06\x44\x31\x89\x86\x95\xc6\x8d\xc8\xe6\xb5\xd6\xdb\xa1\xb6\x05\xf0\xb8\xf8\xd7\xfe\xcf\xc5\x9f\x3e\xea\x0c\x23\x15\xe2\xcf\x91\x99\x9e\x00\xd2\xfc\x00\x93\xc4\xbc\x03\xab\x58\xc5\x34\xff\xe1\x38\x25\x38\x19\x51\xce\x64\xdf\x13\x58\xc7\x77\x23\xa4\xa4\x73\x0a\xfc\x7c\xeb\x08\x69\x68\x6b\x5e\x5e\x48\xb7\xcd\x44\xf1\xb9\x2f\x47\x78\xd7\xc9\x87\x52\x8e\x8b\x8b\x9d\xd2\xd0\x49\xc6\x4e\x52\x2d\x3f\x5a\x08\x6f\xa9\xf3\x08\x5a\xe4\x3b\x1f\x5f\xf4\xd7\xca\x62\x8a\xfd\xcd\x4d\xe9\x9b\x46\x6d\x88\x4f\x2c\xe3\xf8\xec\x94\xf4\xfa\x03\x11\x86\xe2\xd6\x72\x75\x96\xe4\xe8\x46\x72\x22\xf1\x49\x9d\x4f\x27\xa8\x94\xa8\xe1\xd9\x8c\x12\xa1\x90\x27\xda\x74\x21\xc4\xf7\xac\xd0\xe5\x07\x59\x39\x54\xae\x1f\xc2\x22\xa2\x1c\xc0\xcf\xaf\xa2\xd3\xc8\x3f\xe4\x4a\x78\xc5\xdd\xd5\x29\xab\x4b\x3d\xd0\x3f\xa4\x21\x07\x8a\x75\xc7\x9b\xc7\xdd\xe8\x87\xa4\x8a\x23\xf8\xca\x51\x35\x3b\x0c\x19\x0d\x45\xa0\xb0\x86\xd6\x3d\xdd\xef\x68\xf8\x77\x57\x95\xc7\xfb\x41\x3d\x72\x7e\x2f\x0d\x05\x49\x91\x3e\x5d\xc0\xcf\xc6\xe1\x7d\x16\x72\x12\xb9\x84\x22\xa2\xc8\x7a\x90\x99\xee\x1b\xc0\x75\x77\x01\x26\x60\x3d\x97\x7d\x82\x83\xf9\x4f\xf4\xd7\x34\xd2\xfe\x0f\x21\x7f\xcd\x14\xfe\x69\x28\xb5\xb5\x0a\xb4\x51\xd0\x1d\xda\x99\xd8\x6c\x6d\xfe\x91\x29\x42\x03\x98\x91\x8d\xbb\xfd\xfc\x29\x2b\x66\x11\xee\x59\xf1\x9e\x21\x16\xa7\x57\x32\xa0\xa1\x92\x36\xa0\xc9\x54\x89\xbe\x46\xa0\x61\x70\x4c\x60\x40\xb4\xc9\xcb\x66\xfb\x37\x98\x68\xa3\xaa\x91\x3b\x07\x84\x89\xab\x19\x37\xe7\xca\x9b\x86\x77\xb7\x11\xe2\x34\x4e\x3a\xaf\xdf\x7e\xfe\xf8\xc3\x94\x62\xdc\x76\x23\xaa\xaa\xac\x77\xd0\x4f\x19\x50\x89\xcd\xd0\x7d\x71\x49\xdb\xe5\xfa\xb5\xc8\x9a\xc4\x0f\x32\x41\x8c\x32\x4c\x03\x98\xd5\x30\x40\x0e\x4d\x62\xbc\xc7\xc2\x6d\x79\xc0\x7e\xf3\xf8\xce\x19\x16\xe3\x9b\xe9\xb2\x1d\xd1\xa8\xb7\xad\x15\xc2\x1f\x24\x1c\xa1\xe1\xdc\x7a\xdc\x34\xe2\x07\xbc\x94\x4d\x39\x0b\xde\x1b\x9c\x15\x52\xcc\x42\x1f\x45\x56\xdc\x54\x99\xbe\x7e\xd6\x13\x5e\x17\x8d\x82\x18\x10\x5e\x29\xf2\xdc\x2a\x91\x75\x2e\x59\x34\x22\x3c\xc4\x3e\x00\x12\x59\xf2\x01\xeb\x6a\xfc\xb5\x11\x01\xeb\x50\xec\xfa\x05\x83\xd6\x0c\x8d\x42\x12\x20\x31\xef\xa3\x6b\x4a\xe3\xdf\x10\x9e\x8d\x9a\xf2\x07\xd1\x40\xbb\x97\xcd\x56\xaa\x68\x14\x86\xc4\xd8\x7e\x20\x22\x55\x87\x0d\x08\x1a\x85\x3c\x88\x46\x32\x1c\xf7\x95\x38\xc1\x16\xf2\xc9\x8a\x1c\x85\x32\xd6\x63\x43\x9a\xac\xf8\xe4\x0b\xa3\x40\x0e\x64\xe2\x5d\x5b\xee\xdf\x50\x4d\x9e\x60\x14\xc5\xa9\x84\x61\xd1\xb8\x7e\x3d\xf5\x46\x49\xff\x49\xfe\x1a\x94\x9e\xe8\xe0\x7f\xf4\x21\xfc\x97\x61\x75\x14\x25\x40\xd2\x61\x80\x04\x56\x5b\xd4\xff\xf6\x48\x12\xa1\x07\xeb\x84\xc8\x8f\xb3\x6f\xd2\xe4\xaa\x55\x82\xc4\xc1\x36\x65\xdc\x94\x65\xde\xa1\x19\x3f\x4d\x65\xa3\x38\xb6\x5c\xc3\x36\x7a\x5c\x74\xa6\x17\x63\xf1\x2a\x1a\xc5\x9c\xa1\x64\xa0\xb2\x44\xd8\xf5\x48\xbe\x9f\x46\xb1\x20\x48\xd0\x73\x78\x26\xc0\x69\x36\x29\x7f\xcc\x3f\x8f\x58\x46\xb8\x1e\xde\x2f\x76\x6a\x46\x16\xea\x4a\x32\x9d\x46\xb1\x56\xa8\x06\x58\x9f\x65\xf0\xc9\x8c\x4d\x88\x62\xd6\x40\x06\xd3\xd3\x4f\xd6\x37\x54\x45\xed\x1b\x5c\x58\xd6\x59\x14\xba\x19\x88\x74\x7f\xd5\xcf\xa1\x51\x02\x51\x98\x8e\x08\xc2\x36\xa6\xbf\xb9\xac\x46\x94\x00\x37\xbc\xdd\xb0\x75\xef\x05\x0f\xf5\xae\xc4\x00\xf4\x3b\x64\x9b\x5c\xa8\x09\x34\x9a\x46\x8c\x58\xb7\x30\xf5\x76\x2e\x7e\xc4\xeb\x7a\xa1\xfb\x25\x36\xe2\x61\x1a\x93\x71\x79\x0d\xc3\x0c\xdb\x72\x99\xeb\x29\xd1\x88\x0b\x2b\x9a\xe7\x3b\xcc\xab\xdd\xb7\xa6\xdc\x54\x65\x9b\x64\x54\x57\x01\xe2\x97\xbd\x08\x1a\x71\x23\x83\x21\x6d\xec\xaa\xdc\xde\x4d\xf9\xde\x9e\xce\x63\x7a\xf8\x7f\x22\xff\x1e\xa4\x5a\xa3\xce\xd2\xb1\x2c\x9a\xb7\xfc\x62\x25\x18\xf7\x87\xaa\xfc\xf0\x30\x3a\x1a\x89\x20\xc5\xf0\x13\x05\x93\x7a\xfd\x40\x1a\x89\x98\x05\x7d\x71\xac\xb9\x03\x70\x1a\xba\x9f\x84\x8d\x91\xd0\x01\x75\xed\xe0\x3b\x5b\xba\x39\xce\x39\xc3\xb8\xd1\x52\x45\x18\x8d\x89\xbc\x02\xa1\x2f\x8b\x73\x53\x8e\xdd\xc9\xfd\x38\x63\x15\xb4\xea\xee\xc6\xc3\xf5\xdd\x1c\x5f\x88\x8a\x18\x9a\xf3\xb6\x5b\xd3\x6c\x22\x10\xa9\x84\x68\xe5\xa5\xc6\xc5\x7b\x56\x1c\xea\xfd\xa1\x9c\x06\xa3\x91\xa2\x12\xab\x19\x6d\x20\xbc\x59\x3d\xdd\xae\x9f\xee\xf7\x8e\xc6\xe1\x83\xe2\x48\x31\x1b\x26\x7d\x7b\x58\xf6\x30\x1c\x1a\xa9\x54\x22\xea\xb9\x3a\x17\x6d\x5c\x86\xba\x26\xdb\xd2\x34\x4b\x71\x7a\x01\xa1\xde\xfa\xc9\xa6\x65\x84\xc0\xf9\xb5\x2a\x87\x70\x16\x7f\x54\x59\x8d\xec\xfd\xb9\x38\x09\xf5\x63\x53\x95\x8d\x95\xfc\x43\xec\xf0\x24\x3c\x8a\xb4\xb6\x4c\xe3\xfa\x7c\x3c\x76\x71\x59\xa4\x4d\x82\x1b\xf6\xeb\xd3\xfd\x2f\xa1\xf9\x34\x02\x93\xe2\xbd\x59\x6c\x6e\xfc\x09\x0c\x63\x08\xb6\x78\x1f\x79\x6a\x38\x38\xcc\x6c\xb5\x3b\x32\x82\x4a\x9b\xc9\x17\xe2\x08\xcb\xb7\x4c\x66\x73\x72\x50\x34\x0e\x02\x85\xf8\xf7\xc5\xc3\xe3\x6f\xfe\x4f\x49\xea\x1d\x90\x36\x6b\xab\x75\x46\xbb\x63\x3c\x32\xb1\x27\x5c\x0d\xd6\x6c\x7f\x58\x09\xcc\x6a\xb7\xe7\x13\x54\x36\x49\xfd\x1d\xcb\x21\x3f\xba\x13\x40\x8c\x42\x05\x7f\x9e\x8b\x0d\x38\xd7\x80\x5f\x97\xfc\xe3\xc0\x50\xfc\x98\xc5\xb9\x21\x74\x76\x58\x6d\x8c\x03\x93\x92\xc0\x22\x2e\x57\x4e\x5c\x7a\xae\xde\xe4\x46\x87\x6d\x8c\xd5\x3e\x55\xbb\xa6\x5b\x86\x7c\x79\x40\x39\xa5\xec\xf3\x48\xf9\xb3\x55\x63\x72\xf6\x48\x5b\x97\xe3\x81\xf4\xea\xdf\x62\x4e\xd2\x38\x01\x69\x2c\x1f\x1a\x1d\x79\x46\xb8\x5f\x1a\xb3\xc0\x66\x5d\x12\x51\x08\xb2\x14\x15\x5a\x3f\x4d\xea\x4d\x31\x23\x29\x2e\x1c\x68\x5e\xbc\x81\x6a\xf7\x56\x9e\x6b\x51\x68\x64\x3f\xdf\x95\xd5\xa3\xe8\xa9\x25\x34\x66\x09\xa5\xdc\xd3\x03\x1c\x8d\xea\x76\xa2\xd6\x42\x63\x26\x03\xee\x57\x01\x5c\x1e\xb0\xa6\x30\x0f\x69\xeb\x3e\xc2\x11\x14\x2f\xcf\x59\xae\xbd\x52\xac\x3b\xc6\xa3\x10\x25\x08\xb2\x7a\xdb\x54\x65\x71\xf8\x26\x7c\xdb\x94\xc6\x3c\x06\xa4\xec\x6e\xbe\x2d\xb6\xab\x70\x6f\xcb\xed\xbb\xf5\xe3\xaa\x1b\x90\x32\x44\xd2\xbf\x6e\x6f\xff\xbd\x78\x99\x4c\x40\x21\x6c\x16\xe3\xe4\xb4\xbe\xd2\x26\x1e\x7f\x50\x31\x8e\x05\x72\xa1\xf5\x12\x2d\xe4\x66\x91\xb2\x34\x56\x8a\x61\xa9\x2f\xab\x57\x78\x1f\x17\x85\xbe\xad\x32\xa4\x1c\x8d\x17\xb9\x58\x07\x32\x89\x46\x86\x98\xbf\x7d\xc9\x5b\xf1\x1f\x0b\x19\xae\x16\xa7\x37\x51\x43\x78\x7b\xae\x86\x39\x5e\xac\x43\x81\x1d\xd8\xff\x3d\x43\x75\xc1\x3d\xe3\xec\x29\xed\x7e\x84\x96\x98\x0b\xe5\x60\x9a\x24\x9c\xdc\x1e\xad\x55\xe8\xf8\xb6\x47\x74\x26\x38\x39\xe0\xd0\x27\xbf\x56\x03\x60\x59\x63\xab\x40\x34\xdd\x0c\x83\x20\xc4\xd8\x42\x9e\x2f\xde\x95\x6b\x34\x5b\x20\x10\xb8\x26\xfb\xd7\xcb\x5a\xc6\xfd\xf6\x05\x93\x8a\xc6\x40\x14\xf2\xd3\xac\xa6\x6e\x2d\x72\xa8\x61\x94\x53\xc7\x40\x53\xe9\xb4\x5c\xa7\x7a\x81\x34\x06\x16\x63\xfb\xc7\xeb\x49\xa2\x57\xd5\xf0\xc3\x22\x05\x57\xd7\xb8\x9a\x10\xed\x42\x31\x33\x81\x01\x58\xd2\x71\x93\xcf\x85\x5e\xf5\x73\xd4\xc4\x1c\x65\x45\xc0\x2b\xdd\x7e\xd5\x4a\x22\x23\x36\x28\x8d\x0d\xb5\x6d\x03\x44\x7c\xc9\xac\xd2\xfb\x36\x38\xf4\x89\x41\x12\xc4\xb1\xb0\x6d\x8f\x4c\x39\xe9\x05\xff\x6c\x13\x42\x05\xef\x84\x87\xeb\xb7\x89\x59\x0e\x4d\x88\x8c\x03\xe2\x15\xb4\xf1\xca\xee\xa1\x69\x06\x9f\x97\x89\x36\x43\x43\x96\xb1\xf3\xe8\xf8\xe1\x27\x61\x62\x79\xb7\x15\xd4\xb6\xd6\xd8\x01\x37\x29\xca\x96\xbb\xf2\x0c\xfa\x6a\x4d\x16\xc6\xe1\x74\x48\x22\x65\x52\x17\x98\x3c\xe7\x7a\xb5\x7d\xde\xf8\xb3\xc4\x81\x44\x58\xa0\xc0\x35\xa5\x5d\xf2\x36\xb9\x68\x4c\xe9\x41\x63\x34\x89\xb9\xf5\x35\x45\x0e\x37\x56\xcf\x07\x7c\x9d\xf1\x1c\x48\x92\xc4\x62\xa1\x85\xd6\x73\x80\x0a\x9a\x50\x6a\x02\xda\x59\x3e\x5b\x1e\xb7\xff\x22\xaa\x21\x74\x68\x01\x8f\xca\xb8\xb9\xac\x27\x25\xec\x84\x02\x60\x6f\xc9\x19\x47\x3e\x9b\xf9\xf7\x26\x61\xa9\x41\x4c\xbf\xa7\x16\xfa\x6f\x61\x52\x44\x74\x20\x4a\xa1\x5d\x1d\x73\xf3\x71\xed\x73\x3f\x5c\x15\x12\x9e\x28\x1d\x79\xa2\x64\x9b\x71\x7b\xeb\xc0\x11\x2b\x83\x26\x3c\xa5\x56\x57\xb6\x0d\x65\x6e\x7a\xf5\x0a\x77\x38\x0d\x18\xf2\x75\xd0\x30\xe9\x36\x7b\xef\x66\x4e\x1a\x53\x26\x07\xe5\xc9\x21\x80\x6d\x72\x29\x29\xe7\xcc\x72\x7e\x16\x36\x76\x7c\x9d\x71\x89\xf1\x63\x85\x55\xf9\xc2\x52\xd9\xaa\xd0\x35\xe9\xbe\x50\x19\x6c\xca\x9e\x2d\x52\xb6\x4f\x3f\xfd\x71\x9d\x22\x8a\x17\x63\x67\x12\x7a\x01\xed\xee\x79\x89\x24\xc2\x67\x99\x97\xa2\x98\x3c\x24\xc1\xa9\x69\x2f\xf0\xed\x2c\xbb\xd1\x26\xa6\x08\x93\x42\x7b\xde\x2b\xfd\x22\x37\x4a\x12\x49\x92\xfe\x9a\x7e\xcf\x9e\x7d\x98\x99\xc8\xd0\x36\x62\xbe\xaf\x6e\x36\xcf\xaf\x4f\xb7\xdd\xdf\x93\x20\xb1\xb6\xc9\xee\x49\x5a\x7a\xc8\xbc\xda\x3c\x4d\xa4\xc3\xa7\xb6\xeb\xdb\x58\x59\xb7\x3d\x66\xef\xd5\xb9\x86\x6a\x3a\xb5\x55\x08\xb8\x66\xbc\x89\x7a\x55\x94\xe7\xc3\xdb\x7c\x54\x9f\x28\x4e\x30\x80\x38\x9d\xa5\xe7\xb3\xfb\xd3\x2b\x25\x71\x29\xd7\x99\xde\x89\x1f\x60\xa9\x09\x9f\x68\xc9\xfb\x8f\x40\x18\x0d\x74\x2e\xed\x0f\x7c\x01\xa1\x3f\x7d\xde\x10\x05\x31\x9a\xcd\x2f\x76\xab\x7d\x44\xf6\xb7\xab\xe5\x3e\x0c\xc2\xee\xa9\x03\x0f\x46\x7e\xda\x77\x55\x79\xfc\x76\x39\x41\x55\x37\xa2\xdd\x42\x75\x56\xcb\x73\x55\x23\x50\x1b\x15\x0c\xe6\x2f\x0c\x34\xc4\xdc\xdb\x5c\x9d\x7a\x55\x80\x7f\xcc\x85\xb8\x89\xa1\xe0\xd7\x9f\x25\xe4\x79\xbd\xcd\x0a\x05\x0f\xc2\x43\xa0\xc6\xbf\xc0\x40\x6a\x6c\x68\x32\xf4\xb9\xf0\x25\x83\xaa\x7b\x5c\x34\x08\x52\xec\x66\x19\x24\x67\xe2\x3e\xda\x47\x38\x34\x60\x0c\x1c\x16\x7c\x57\x6e\xca\xc9\x76\x45\x83\x34\x46\x5c\x2d\xaa\x25\x58\xf6\xd4\xa0\xfe\x49\x03\x61\xc3\x2d\x7f\x9b\xda\x98\x7f\xda\x99\xa5\x81\xe9\x9c\xf9\xee\xcf\x50\x37\xf8\xca\x0e\x7f\x38\x25\xce\x64\xbc\x6e\xca\x0a\x9e\x4f\x56\xa9\x7c\xf6\x8e\xb6\xa1\x27\xee\x1c\xab\xdc\xa6\x37\x9f\x46\x4d\xe3\x6b\x88\x45\x00\xa2\x67\x67\x2d\x45\x9e\xff\x0e\xdd\x4d\x88\x25\xc1\x68\x03\x2a\x15\x86\xd1\xc2\x69\x0b\x76\x77\x30\x21\x3a\xf4\x9a\xa3\x68\x66\x7d\x99\x4d\xed\x69\xc2\x02\x54\x52\x2a\xe0\x67\x9b\x0a\x6f\x72\xd1\x7d\x03\x65\x49\xe0\x2b\x59\xdf\x20\x1f\x59\xa1\x5e\x6f\xe9\x94\x25\xd6\x84\x76\x63\x25\x8e\xf8\xb6\x83\xeb\x51\xca\x43\x9d\x74\xf2\xa1\xcd\xa0\xe2\x4e\x79\x62\x99\x96\xff\xaf\x94\x9f\xab\xe0\xb8\xb1\xa9\x50\xc2\xeb\xe0\x75\xa4\x5c\x07\x18\xfe\x87\xfb\x67\xfe\x09\x88\x98\x84\x41\x1f\xc1\xcc\x57\x7f\xa8\xa0\xdc\x67\xce\x48\x8a\x78\x98\xb2\x29\x29\x15\x8a\xa3\x58\xc9\xc3\xfd\xb2\x07\xa1\x52\x2a\x29\xd8\xdc\x14\xd4\xb9\x82\xd7\xc2\x29\x85\x8c\x60\xa8\x94\x4a\x41\xb1\xa6\xba\xbc\xf9\x57\xf7\x41\x19\x44\x7e\x4b\xd9\x81\x38\x76\x34\xc1\x6e\x80\x8a\xb0\x74\xbb\x40\x5b\xa8\x3b\x80\x5d\x39\x1f\x57\x4c\x7e\x8b\x54\x3e\x5a\x41\x10\x32\xe8\xd7\xed\xed\xf7\xd5\xda\x9f\x56\x87\x12\xc3\x0f\xab\xb8\x91\x83\xbe\xb9\x6c\x51\x82\x63\x72\xc9\xda\x58\x13\xcf\x5e\x82\xf3\x31\x2b\x9a\x4e\x29\xaf\x8d\x2a\x2a\x91\xb5\x7b\xd4\xa7\x75\x37\xaa\x8d\xc1\x94\xd7\x7a\xba\x2d\xbc\x51\xe7\xa7\x95\x8e\x6e\x46\x01\x27\x88\xd1\xef\x09\x07\xbf\xca\x19\xc7\x73\x1b\x38\x77\x92\xbc\xc7\x63\xd6\xa0\x14\xf3\x17\x49\x15\x35\xa1\x46\x05\x8f\x93\xa5\xe4\xdc\x9e\x27\x95\x15\x6a\x18\xb3\x41\x72\xbb\xb0\x2c\xdf\x4a\xcf\xbc\x73\x3f\x94\x05\x10\x78\x35\xb3\xa6\xd4\xdd\x8b\xc4\xc2\x38\x88\xc1\x93\xce\xab\xf7\x4c\xc1\xb0\x29\xc0\x42\x6a\xcd\xb4\x7a\xfe\xc6\x0f\x28\x6a\x2b\x57\x37\xbf\xa2\xb0\x28\x88\x11\xc6\x54\x9f\xf2\x09\xd5\xfd\x4a\x26\xf3\x3f\xd7\x9d\xa1\xbf\xfc\x59\x22\x2b\xe0\x24\xb4\xb6\x0a\x97\x9f\x7c\x19\x97\xf1\xdf\xd3\x88\xfe\x3f\xa6\xf6\xee\xfc\x31\xb5\x55\x0b\xd7\x39\xb4\xe8\xb4\x9e\x14\x45\x59\xcc\x39\x2a\xdb\x56\xe5\x39\x6f\x43\xee\xf1\x3b\xc9\x12\x62\x79\x4e\xe7\x53\x5e\x0a\xbd\x2c\x35\xfc\x76\xdd\xe3\x66\x09\x4d\x91\x24\x87\x90\x8a\xa5\x15\x36\x1b\x23\xb5\x46\x33\x9f\x25\x54\x84\x0e\xcf\x5d\x7b\x40\xf7\x27\x0b\x13\xa3\x41\x9c\x3a\x1e\x76\xfb\x46\xdc\x01\xcc\x2e\xb6\x8c\x06\x89\x72\x8b\xb2\x57\x40\xbb\x2b\xab\x45\x7e\x65\xc1\x34\xe8\x67\x31\x1a\x58\x11\x85\x6f\xaf\x0f\xbf\x0f\x97\x4e\x46\x59\x88\x55\x59\xaf\x35\xd5\x19\x8d\x7f\xf2\x1c\xa9\x8c\xe2\xbe\x83\xb5\xd0\xbd\x97\xe0\x64\x20\x93\x09\x7a\x75\x3d\x58\x05\x0a\x47\x28\x9c\x7d\xc7\x18\x53\x56\x97\xbc\xb3\xbd\x6e\xa3\x72\xd7\x9d\x9c\xee\xaa\x8c\xa7\x51\x64\xa3\xdb\xd5\xa9\x54\x6f\xed\x86\xb2\x85\xee\x31\x73\x43\x98\xe5\x36\x97\xb5\xc8\xaa\xed\x5b\x76\xc2\xaf\xf6\xbb\x08\x13\x81\x49\x99\xa7\x53\x9f\xce\x8d\x67\x96\xcb\x1c\x8e\xf5\x6f\x73\xe9\x11\x13\x9a\x82\xe5\x5e\x69\x80\xe3\x46\x4c\x17\x74\x26\x8c\xc0\x4a\xca\xbe\x98\xd5\x3b\xa0\x4c\x8a\x04\x71\x91\xd6\x43\xca\x46\x76\xe7\x09\x3f\x6e\x6c\x65\x4d\xe8\xdf\xfd\x67\xf0\x2d\x52\x5b\x67\xbf\xa6\xca\x61\x64\xf1\x48\x99\x54\x1c\xd3\x13\xdc\x3c\x8f\xe7\x06\xae\x55\x20\x3e\xab\xbc\xcf\xd4\x40\x99\x34\x21\x8a\x36\xb9\x8e\x0c\xee\x74\xdf\x20\x3b\xbc\x75\x0f\x42\x25\x0c\x71\x2b\xb7\xeb\xcd\x1e\x45\x3d\xfd\xdf\x85\x46\x00\xb2\xc8\xd1\xda\xa0\xc9\xde\x61\xef\xfd\x46\xea\x7d\x9e\x15\x3f\x7c\xca\xc3\x40\x4a\x0c\xe0\x34\x88\x06\x9f\xf3\x5e\x90\xb0\x3b\xa8\x35\xf2\x93\x2d\xe7\x7b\x52\x62\x63\x26\xb0\xb5\xf9\x4c\x95\x04\xb1\xe5\xdd\x81\xd0\xfa\x2d\xba\x72\xf1\x8d\xa8\xe1\x56\x1c\xc5\x01\x7a\xdd\xa9\xfe\x86\x9a\x28\xc6\x4e\xfe\x09\xaa\x36\xe5\x5d\x3c\xbc\xba\xd3\xf0\x20\x49\x29\xf1\x92\x9e\x73\x24\x0d\xca\x09\xa7\x18\xce\xdf\x66\x87\x4c\x42\x35\x82\x58\xf2\x30\xb5\xfe\x33\x2f\xeb\xe5\xf3\xb6\x11\x85\x16\x95\xde\x94\xb7\xfd\xe1\x18\xfb\x73\xed\x0a\x60\x97\x32\x6f\x8a\x4e\x79\x24\x63\x94\x4b\xc2\x0d\x64\xd3\xbe\x2d\x2e\xcb\xf3\x0e\x7e\x5f\xf7\x8d\x78\x04\x16\xbd\xba\x14\xef\xf5\x7b\xbd\x11\x0a\xaa\x3a\x0e\x93\xee\xf4\x60\x30\x96\x3b\x55\x80\x8a\x2e\xb3\x7a\xb0\x6e\x6c\x1c\xc4\xb8\xbc\x2d\xb4\x5e\xe8\xea\x9f\xe7\x3c\x17\x15\xea\x61\xcf\xbe\xe6\x3c\x0e\x09\x96\x80\x3f\x44\xdd\x6d\x03\xdb\xa6\xec\x51\x62\x3c\x21\x29\x16\x2d\x3a\xad\x8a\x79\x5b\x76\xca\x69\x12\x61\xfc\x7d\x73\xb6\x9a\x91\x13\x22\xcb\xfc\xf7\x53\x25\xb0\x32\x28\xa1\x00\x93\xa9\x4c\x54\x97\xa9\xa2\x0d\xe5\x54\x27\x18\xf3\x9e\x4e\x75\x3b\x39\xba\x3f\x83\x46\xea\xdb\xbe\xcd\xef\x8f\xea\x56\x5c\x9c\x76\xdc\x5d\x69\xe9\x5b\x5f\x19\xc2\x51\xce\xc0\x0a\xe6\xef\xa0\x10\x45\xb3\x83\xea\x98\x15\xbd\xfb\x5e\x37\x28\x0d\x49\x67\xd6\x6a\xae\x6a\xd2\x7e\x98\x09\x63\xb7\x01\x78\x31\x19\x12\xba\xf0\x81\xf3\x40\x72\x87\xad\x2d\x2b\xeb\x5b\xfa\x6c\xc6\xf1\x18\xe7\x84\x23\x74\xce\x36\xa1\x1e\x41\x67\xa2\x0b\xc4\xae\x03\xaa\x7e\x17\xe1\x9c\x46\xa1\xb3\x3e\x5c\xbc\xa3\xc4\x46\x7d\x2d\x0e\x4b\x39\x57\xa1\x0f\x61\xf0\xbc\xb8\x22\x3e\x64\x75\x73\x73\x59\x5f\x89\x04\x50\xce\x8d\x08\x3b\x15\xc9\xd1\x6f\x76\x14\x3e\xca\x53\x61\x7d\x0e\x5d\x54\x85\xb2\xd1\xa3\xda\xc7\x27\x4f\x5c\x24\xd6\xc8\x60\x7b\x82\xea\xf8\xe0\xe9\xb6\xed\xdf\x01\x75\x6f\x17\xeb\x97\xdb\x97\xe7\xcd\x66\xf5\xd2\x1d\x11\x29\xee\xae\xa7\xbd\xed\xcb\xee\xb1\xca\x67\xf5\x0d\x67\x68\xd8\x94\x0b\x63\xd9\x87\x9d\x4e\xd2\xa6\x2c\xfe\x9b\xf9\xd3\xc9\x80\xa2\xd0\x8d\x35\x40\x59\xd5\xaa\x2a\x3f\x96\x68\xa0\x39\xbe\x50\x19\x72\xdc\x56\x6b\x61\x2c\x60\xe3\x33\x8d\x9e\x11\xfb\x64\xf8\x2e\xca\x48\x61\x2b\x6e\xb3\xdb\xfd\xb9\xfc\xaa\x7f\xc5\x25\x67\x5e\x3c\xed\x11\xea\x5a\x1c\x26\xd3\x50\x1a\x86\x91\xe6\x6e\xb5\x78\xdc\x3f\xac\x1f\xd7\x3b\xff\x6b\x74\x90\x6a\xde\x6b\x94\x5a\x35\x1d\xbb\x70\xfa\x11\xb4\x03\xf4\xbd\x9c\x6b\xec\xd5\x74\x49\x96\xf3\xd0\x99\xf3\x77\xa5\x5c\x0b\x63\xa9\xb2\x65\xae\x3b\xfc\xfb\x08\x18\xce\xb5\x06\xec\xda\xb8\x3d\x07\x99\x24\xee\x10\x24\x1a\x2f\xf9\x66\xb7\xdc\x6f\x5f\xd7\xdb\xed\x6a\xbf\x5b\xaf\x5e\x3a\x30\x2e\x07\x9e\x20\x5e\x68\xbd\x5e\x3e\xff\xb2\x79\x34\x9b\x49\x73\x13\xc5\x48\xda\x5f\x14\x70\x2c\xb3\x91\xeb\xa7\x1f\xc1\x28\xea\xaa\xc8\xb2\xae\x97\xe7\x66\x4a\xa6\xa7\x69\x90\x6a\x6d\x4b\x17\x8b\xdd\xa3\x13\xc1\x1b\x7d\x49\x1a\x18\xeb\x49\xb7\xdc\x3c\x78\x0c\x9c\x3b\x42\x48\x98\x08\x04\xd0\x8a\x62\x23\xb2\xe1\x6e\x92\x12\xa6\x8d\xf0\x3c\xe3\x89\xb4\x10\x4d\x89\xb6\x44\xd5\x73\x0d\xd5\xc2\xe5\x94\x5f\x6e\x11\x69\xa8\x3b\xa5\xcd\x09\x06\xd0\x0d\x88\xa2\x94\x0e\xaa\x0a\x58\xfd\x18\xb6\x02\xd2\x88\x59\x98\x7b\x9f\xf2\xed\xbd\x51\x50\x37\x84\x73\xa4\xe8\xac\x1e\xd7\xdb\xed\xfa\xf9\x69\x7f\xf7\xfc\xb2\xbf\x79\x7e\x7d\xda\xfd\xd9\x0d\xd1\x12\x99\xb4\xce\x9b\x7d\xff\xfc\xe4\x7b\x4c\x69\x1c\xdb\x06\x61\x6d\x05\xb8\x90\x10\x67\x65\xb8\x44\x03\x4f\xe7\x23\x54\xa2\xdf\x33\xd3\x38\x89\x42\xde\xf7\xc8\xfd\x83\x5b\x8a\xa1\x70\x7e\x37\x96\x52\xf0\xac\xb4\xe6\x93\x1a\x6b\x3b\x0a\x93\xf5\xf5\x37\xd1\xc0\xaa\xac\x47\xaf\x50\x1a\xd3\xd0\x23\xf7\x11\x8b\x9a\x95\x85\x03\x8e\x63\xad\x79\x7c\xb7\x93\x24\xc0\xca\xee\xfa\x65\xb9\xdf\xac\x5e\xf6\xab\xdd\xb7\xfd\xe6\x65\xb5\xdf\x2e\x1e\xba\x9f\x9b\x50\x16\x4a\xeb\xe8\xe3\x2b\xd6\xcf\x27\x28\xbc\xf0\xc3\x1c\x92\x6d\xb6\xd4\x96\x26\xdc\xe6\x49\x1f\x20\x4e\x65\x81\x48\x91\x6c\x62\x79\x49\x53\x9a\x00\x8a\x0d\x6c\xa1\x59\xac\x72\x73\x0b\xef\xa8\x9c\x56\x67\x9f\xc0\x4d\x53\xa6\x03\x61\x25\xb2\x0b\x6d\x25\x10\xb2\xe2\x80\x3e\xa9\x7e\x00\x58\xcc\xda\x63\x56\x40\xb5\xd2\x07\xe8\x5a\x99\xdd\x08\x63\xeb\xb4\xbe\x27\xeb\x51\xfe\xe3\x2b\xe3\x5c\x62\xa5\xc7\xad\x01\x0f\xa5\x28\x36\x28\xbe\xeb\x4f\xc3\x35\xe0\x94\xa9\xcb\x3c\xd3\x59\xd3\x46\x07\xd1\x78\xfb\x4b\x85\x0a\x71\xa9\xd1\x90\x37\x62\x38\x69\x25\x51\x90\xf4\x93\xf6\xe6\x7c\x99\x22\x42\x53\x29\xb4\x71\x4d\x08\xdb\x84\xac\x17\x8d\x15\x1e\x1b\x5f\xa7\x54\x1a\x41\x19\x7b\x1b\xa5\x65\x3f\x21\x47\x1c\xf5\x64\x98\x92\xd2\x99\x70\x80\xfa\xf1\x68\x41\x28\x16\x02\x3d\xbe\xbf\x4a\xc7\xb4\x97\xb7\xcd\x72\x03\x7d\x9d\x33\xd5\x51\x88\xd7\xb4\x6e\xda\x0c\xc6\xff\x91\x5b\x34\xb3\xcb\xd3\xea\x1a\x9a\xdf\x66\xd9\xb6\xe3\x0b\xd2\x10\x20\x07\x6f\x73\xbb\xf3\xe5\xa5\x14\xc2\x18\x91\x40\x03\x26\x3e\xee\xe8\x1b\xa8\x5e\xb7\xb7\x93\x5f\x04\x5c\x61\xad\xc7\x96\x4b\x26\x3f\xc3\xa4\x21\xd2\xde\xdb\x1b\x8c\x29\x03\x66\x70\xfe\x7b\x0c\xa4\xd4\xe3\x1a\xb3\xfa\x74\x6e\xe0\x11\x8e\x65\x75\xd9\x66\xff\x9d\xbc\x32\x22\x20\x11\x2a\xa1\x3f\x94\x87\x41\xa6\xff\x65\x31\x4b\x04\x29\x08\xb0\x93\x1a\x2f\xdf\x79\x3b\x5e\x9d\xda\x24\x84\x0c\xc5\xc2\xbc\xd2\xe3\x78\x18\x09\x39\xf6\x99\x1e\x2f\xff\xcc\xca\x41\x15\x4f\x10\x29\xb1\x3c\x2d\xdb\x64\x1a\x5b\x78\x63\x38\x8b\x20\x8a\x60\xe8\xba\xae\x17\x1d\x92\x51\x10\x23\x93\x1e\xe5\xdf\x06\x94\x13\x3b\x8b\x3e\x0a\x13\x61\xa4\x51\x7a\xd9\x38\xf5\xa6\xdf\x86\xc7\xa8\x4d\x99\x56\x4f\xb7\xd8\x92\x6f\x17\x92\xc1\x3a\x22\x42\x6a\x10\xab\x88\x4f\xf1\x16\xc4\xa4\xe2\x2b\x42\x13\x98\x1e\xd8\xe5\xd4\x4e\xdc\xb1\x88\x58\x69\x1a\xfc\x49\x36\x00\x18\x09\x56\x8d\x6f\x50\x14\x19\xbc\x92\xac\xc6\x09\x8d\x06\xa9\xfe\x10\xa5\xd8\x24\x6d\x40\x58\xdd\xad\x36\x26\x70\x84\x94\x6e\x88\xc1\x16\x96\x84\x06\x7e\x8e\x3b\x9b\x22\x4a\x39\x86\xb8\x7b\xe4\x9d\x81\xde\x0e\xb6\x58\x11\x87\x14\xb1\x07\xaa\x3c\xca\xac\x00\xcc\x1f\x3c\x4f\x71\xe8\x26\x4b\x45\x6c\x42\xd9\xcb\x14\xdd\x34\x9d\xef\x97\xff\x3d\x93\x68\x60\xf4\xeb\x68\xc0\x53\xd2\x49\xc3\x60\xb1\xf5\x0e\xe0\x13\xbb\x50\x2a\x68\x4c\x70\xf9\x96\xe7\xcb\x63\xa6\xaa\xf2\x77\xb8\xd4\xa8\x0d\x8f\xdc\xe6\xd9\x3d\x56\x50\xa1\xb1\xb1\x8a\x78\x78\x51\x35\x43\x14\xbf\x7f\xcd\x05\x23\x54\xf7\x3f\x02\x0b\x0b\xb8\xec\x4e\xab\xa1\x03\x65\xab\xe4\xaf\xf1\x4f\x61\xca\x90\xce\x10\x2f\xcf\xcb\x66\xce\x34\x98\x8a\xd4\x84\x88\xa9\xff\x69\x3d\x6e\xee\xe0\x6a\x97\x15\x22\x65\x98\x1e\xdc\x9d\xf3\x7c\x23\x2e\x43\xb8\x97\x90\x81\x21\x6e\xf2\x3c\xc1\x47\x5f\xbf\x5d\x19\x03\xaa\x39\x0f\x21\x14\x42\x32\x4b\xd6\x42\xd2\x97\xdd\xda\xfb\x62\xb6\x90\xc6\xa0\x2a\xcf\xde\xd1\x07\x6d\xd6\xe2\x0e\x2a\x66\x33\x14\xbb\x56\x59\x75\xce\x65\x6f\x27\x3e\x79\x2c\x9a\x02\xc2\xb6\xb6\xde\x99\xb1\xde\x95\x77\x6d\x10\x31\xe8\xef\xcd\x87\x48\x42\x6b\xa2\xed\x52\x66\x27\xd8\xb5\xe7\x3a\x15\x10\x86\xa8\xe9\x08\xc7\xcc\xa9\xb1\x65\xa5\x7e\x29\xf3\xbc\x7c\xbf\x9a\x21\x10\x11\xf0\x52\xf6\xc2\x71\x36\xba\xf3\x24\x41\x6c\x85\xfc\x46\xa5\x2c\x01\x2a\x11\x51\xd7\x9c\xef\xd0\xb6\x53\x28\xa7\x30\x24\x45\x3e\xa7\xdf\x5a\x8b\x17\x10\x7a\xd0\xf4\x16\x26\x09\x70\xcd\x72\xd2\x20\xd3\x8f\x73\x92\xf8\x5a\xc7\x49\x54\xf0\x02\xed\xe2\x3e\xb4\x07\xb0\x03\x65\x10\x5a\x03\xda\x81\x5e\x52\xfb\x2d\x1d\xc6\xc7\xa7\x73\x32\x48\x63\x66\x2f\x08\x55\x56\x2c\xdd\xae\xde\x64\x83\xd5\x46\x92\x88\x24\xca\x4e\x7f\x1a\x8f\xfb\x33\x7e\x44\xaa\x74\x67\x2b\x3a\x14\x1c\xa1\x32\x0c\x43\x94\x1d\x44\xfc\x34\xb6\xd5\xfe\x86\xd0\xdb\x7f\xc2\xbf\x06\xf8\xe9\x0e\x35\x1a\xfe\xe5\x4f\x0a\x01\xd6\xbc\xac\x65\xd5\x4d\xa6\xef\xca\xca\x09\x7f\x67\xf2\x57\xe0\x68\x89\xf8\x79\x27\x3b\xe6\x88\xb2\xd7\x6a\xb7\x54\x46\x61\x6c\xac\xba\xf7\xe3\x94\xae\x26\xa3\x28\x26\x16\xad\xaa\x33\x73\x79\x44\x78\x10\xd6\x09\x7e\x25\xa3\x41\x65\xa4\x05\x96\x79\x2d\x22\xd9\x63\x3e\xdd\xc1\x38\x90\x28\x3e\x95\x83\x69\x9e\x8b\x36\xa0\x1f\xac\xd6\x92\x12\xc0\x7a\x6b\xd9\xa8\xee\x4f\x31\xb1\x9b\x9f\xf8\x01\x8f\x97\x2f\xc4\x98\xfd\xf8\x34\xc2\x92\x53\x3b\x7b\x10\x28\x3b\xa9\x69\x4b\xc6\x08\x92\x9a\x72\x51\x37\x63\x4c\x9d\xe4\xc4\x20\x6e\xe8\x16\xa6\xf3\x5a\xa6\xcc\xe8\xc4\xc1\x58\xf1\x22\x92\x5f\xa9\x1f\xfd\x2d\xeb\x12\x2a\x53\x6e\xa9\x64\x05\x7c\x78\xe5\x1e\x8c\x1a\xca\x72\x4c\x34\x92\x42\x59\xa8\xf7\x01\x9a\x5d\x9b\xea\x35\xd9\x3b\x38\xe9\x20\xab\x97\x38\x5c\x16\x06\xf1\xb0\x94\xa9\xc1\x8c\xed\x71\xf1\xf4\x6d\xb1\xdb\x2d\x9e\x36\x2f\xcf\xff\xfa\x73\xb3\x78\xf9\x7d\xf1\x87\xdf\xac\xa5\x8a\x2c\xd9\x13\x9c\x1c\xed\x8c\x04\x23\x95\x4a\xc6\xc8\x77\xb0\x3b\xf6\xe2\x30\xea\x26\xe1\x51\x8d\xac\xf2\x66\xe8\x46\x4a\xa5\x06\x2b\x80\x81\x11\x65\xa7\xbe\x4b\x25\x84\x82\x39\xa5\x94\x07\xd0\x87\xae\x4e\x3d\x7a\x9e\x00\x84\x39\xbf\xd5\x7d\x53\x76\x6c\xa6\xbd\x6c\xd7\x21\x1f\xd1\x4b\x13\xa4\x98\xaf\x0f\xf8\xa6\xa3\x84\x5e\x9a\x10\x70\x3e\xa3\x8d\xc9\xfa\x78\xca\x9d\x28\x1b\x2e\x4d\xe3\x5f\x69\xa2\x14\x37\xd0\x5e\x1c\xdd\x97\x45\xeb\x81\xa0\xf2\x64\xda\x19\x03\xc4\xb7\xa5\xdb\x7c\xa3\x2c\x76\xbb\x47\xe7\xc6\xc9\xdc\x45\xa8\x40\x08\xed\xaa\x69\x58\xc9\x58\x4c\xf9\x1d\x2a\x50\x1c\x8b\x45\xf2\x7c\xe9\xa1\xbd\xce\x5e\xc0\x0d\x21\x22\x71\x8a\x76\xcd\xbf\xa1\x2a\x9f\xca\x66\x8b\x99\xd0\xf8\x57\xa8\x90\x5b\x90\xcb\x46\x14\xe0\xf3\x60\x15\x8a\x14\xc3\xeb\xdf\x51\x44\xea\x34\xaa\x13\xab\x50\x33\x0f\x07\xb4\xd8\xe7\x5c\xbc\x4f\xdf\x1e\x15\x25\x26\x8d\x07\xf6\x49\x1e\xcc\xa1\x62\x91\x60\xc7\xfa\x8f\x32\xef\xaa\xea\x2a\x16\x3a\x70\x73\x76\xd5\xbc\xdd\x55\xe5\xb1\x8d\x46\xe6\x6f\xa1\x8a\xb5\x0c\x9c\x58\xe2\xf2\xf9\xf9\xb7\x99\x22\xb0\x8a\x8d\xc1\xe6\xc7\x09\x67\x27\x6e\x0b\xee\x48\xc2\x38\x03\xef\xe1\xd7\xee\xae\xdf\xc5\xfb\xd5\xb3\xfa\x0f\x09\xfe\xf2\xe3\xa5\x41\xec\xd3\x1e\x81\xb1\x4e\xfb\x70\x28\x75\xa1\x12\xcd\x50\x05\xca\xe2\x5d\xae\x35\x88\xa8\x4a\x8c\x95\x8c\x47\x58\xc7\xc0\x93\xef\x36\xab\x9d\x72\xfb\xc3\x15\xac\x48\x51\x22\x31\xbd\xda\x7b\x3d\x80\xaf\xd7\x72\x45\x23\x89\x20\x99\x85\xac\xb1\x8e\xf0\x47\x56\x35\x67\x91\x8f\x9e\x1c\x15\x31\x16\xbb\x6f\x44\x23\x8a\x41\x82\xa0\x98\x8e\xd1\x09\xcf\xa9\x26\xbc\x40\x36\x52\xd2\xf8\xe4\x2b\x79\x10\x62\x9b\x15\xcb\x91\x18\xf1\xfa\x4e\x88\xe2\x71\x17\x97\x5b\x15\xbc\x5b\xd1\x88\x9b\x79\xa8\x86\xe2\xc2\xde\x9f\xfd\x01\x9a\xb5\xee\x4e\xa1\x02\xd4\x7e\x11\x5a\xe3\xdb\x7a\xd3\xc1\xb7\x6d\xa1\x71\x92\x06\x2b\xae\x12\x04\xcf\xbc\x97\x0d\xb4\xbb\xe0\xac\xe4\x3d\x55\x1c\x38\x0a\x5f\x6c\xde\xb2\x3c\xf7\x66\x3e\xfe\x3b\xd3\x50\x45\x2e\xee\xc4\xc2\x4d\x07\xa4\x1d\x9f\x23\x55\x34\x1c\x02\x92\xf6\xe5\xe9\x17\x99\x9e\x12\xa9\x75\x0b\xc6\x46\x67\xcf\x82\xf4\x5f\x2c\x63\x85\xd8\xa4\xbc\x3c\x84\x09\x9d\x7c\x9d\xe4\x01\x0a\xda\xdf\x94\xe7\xb1\x4a\xd6\xa7\x08\x01\x25\x39\xb3\xc4\x5d\xa8\x9b\x7d\xb4\x17\xca\x3e\xd6\x76\xa1\xc2\xa9\xb7\x6f\xef\xd2\xde\xea\x41\x58\xe9\x2f\xff\x41\x00\x6c\x9f\xd8\x65\x73\x18\xc7\x2a\x45\x98\xb0\x5e\xb1\x19\x14\x8d\xd5\x27\x1a\x4e\x0c\x1f\x04\x29\x45\xac\x6a\x90\x17\xbf\x5e\xeb\xf7\x69\xcb\xa6\x1b\x09\xd2\xeb\x7c\x2f\xbf\x59\xd6\x00\x89\x46\xfb\x99\x52\x54\xe0\xa4\xb5\x11\xc6\xce\xdd\x3f\x7f\x51\x3a\x8c\x85\x95\xee\x83\x76\x27\xff\x63\x28\xf5\x37\xbe\x8b\x90\xc6\x98\xa2\xe2\xd1\x4e\x4a\x92\x0c\x21\x54\xca\x30\x85\xb2\x42\xba\x73\x5c\xa7\xca\x40\x84\x9b\x7d\x1b\xf9\xb7\x09\xf4\x4a\x54\xf9\xa5\xd3\x15\xb1\x83\x74\x10\x72\x5c\x26\x96\x0f\xfd\x5f\x54\xda\x7b\x99\x6e\x2d\x33\xfa\x93\x25\x4d\x07\x51\x94\x50\x5f\x0b\xb4\x0e\x15\x3b\x10\xc7\xd9\xd7\x45\x93\x00\x90\xe9\xf9\x00\xc7\xb2\xa8\x3b\x60\xcd\xae\xbc\xad\xca\x93\xff\x7a\x92\x44\x1e\x87\xbc\xea\x4d\x11\xdb\xbf\x1b\x6c\x25\xed\x9d\xdd\x1a\x5e\x59\x0e\xdd\x26\x52\x8f\x21\xa5\xd7\xff\xf5\xe7\xe1\x12\xc3\xa7\x97\xd5\x6d\x77\x6a\x93\xe0\xde\xfa\x5a\x64\x0d\x68\x23\x0a\x6b\x88\x7e\x85\xae\x70\xc3\xc3\x50\x23\xb8\xfa\x54\xfe\x80\x4a\x96\x3f\x3f\xb9\x35\x51\x10\x48\xef\x7a\xf2\x25\xc8\xcc\x8f\x67\x11\x32\x55\x3f\xaa\xac\x81\x5b\x30\x58\x38\x2b\x0b\xaf\x03\x3b\x9c\x5a\x3a\xe2\x4e\x4c\x55\xf9\x49\xae\xe3\x48\x85\xc3\xbc\xa4\x5b\x8f\x74\x12\x24\xca\xca\x1a\x56\x00\xe8\xa2\xf6\x8b\x2b\xa1\x84\x10\x57\x3b\xfa\x03\x30\x5d\xdc\x36\x70\xfa\x9f\x29\x0b\x4e\xd3\xd8\xaa\x4a\x22\xdc\x15\xbd\xfe\xdc\x01\xee\xd4\xdc\x9d\x36\x83\xdf\x42\x75\x1a\x58\x3c\xfe\xad\x5d\xc1\x3e\xca\x2a\xd7\x03\x71\x2c\x9d\x46\x0c\xf7\xb8\x7b\x04\x25\x0d\x34\x57\x74\x1a\x71\x6c\x96\x0c\x8d\x61\x7f\x81\x65\x99\x80\x6f\x46\x95\x67\x7f\xd6\xc4\xe0\xec\x7d\x5c\x3f\xed\xef\x5e\x2d\xe3\xea\xfe\x79\xd1\xbd\x0a\x82\xc4\xcc\x4a\x20\x96\x1f\xc8\xb2\x41\x39\xb1\xee\x68\x6c\xc5\x3a\xea\xf3\xc9\x96\x29\xfc\xdf\x13\xcb\x6a\x14\x4d\x79\x1c\x2e\xd2\x5a\xa4\x80\xd1\x65\xd5\xae\xd0\xbb\x8f\x72\x80\x57\xd5\x42\x85\x4a\x79\x01\x80\x46\x4c\xee\xb4\x22\x5a\xf7\x40\x91\x9b\xed\x23\x86\xbf\xa3\x29\xa1\x12\x6e\xa8\x8f\x41\xf7\xdb\xdb\xe5\x72\x5f\x0f\xb9\x5d\x5a\x87\x81\x77\x99\xfc\x67\x29\xbf\x97\xd5\x8f\x69\xde\xac\x75\xc2\x11\x66\xa2\xb3\xfa\x84\x9b\xd6\xf4\x96\x8e\xbe\x11\xe2\x18\x91\x77\xf7\x77\x9f\xb4\xc8\xdc\x13\x18\xbf\x3d\x26\x48\x90\x7e\xfa\xf1\x56\xe6\xe8\x70\xf0\x00\xc6\xef\x26\xda\xa4\x29\x26\x4f\x32\x17\xea\x47\xfd\x21\x46\x9b\x9c\x36\x10\x52\xcb\xe5\xbe\x3c\x17\xe8\x0d\x32\xe2\xb1\x43\x10\x04\x71\xc7\x82\xde\x66\x87\xee\xef\x89\xb6\x21\xdd\xb9\xd0\xa2\xca\x84\x6d\x72\xfb\x83\x60\x7d\xb6\x45\x3d\x24\x4b\x0c\x66\x09\x04\x86\xe2\xa3\xc1\x90\x07\x29\xcb\xee\x40\x0c\x1c\x33\xfd\xe6\x9c\x67\xa7\x5d\x39\x2a\xe0\xf9\x21\x26\xc5\xa8\x1c\x95\x06\x77\xbd\xba\x4a\xcf\xa5\x1d\xdd\x1d\x48\xc2\x00\xef\x8e\x95\xd2\xfb\x54\x4c\x01\x28\x51\x86\x39\x55\x6a\x71\x9a\x7c\x29\xe5\x89\x71\xdb\xd8\xf2\x01\xde\x21\xff\x25\x95\x71\x72\x15\x54\x5a\x15\x94\x46\xd4\x3f\x36\x36\xb2\xb2\x0b\xc7\xb2\xac\x9b\xcf\xcc\x7e\x29\xb0\x28\x25\xdc\xd7\x34\x0f\x59\x59\x3c\xc1\xcf\x06\xd5\xe7\xa6\xcc\x02\x48\x4d\x8c\xf1\xca\xf6\xf1\x65\x98\xd5\x59\x0d\x50\x37\x46\x30\x8a\xfc\x7e\x44\x4c\xf7\x95\x20\x10\xdc\xaa\xee\xdd\xa2\x57\x71\xed\xed\xf2\xe6\x7c\x71\xfa\x2f\x14\x9c\x05\xa1\x63\xf2\xb5\x2f\x98\xa3\x68\x0f\x7b\x3c\x6e\xa4\x8c\x04\x36\x1e\x1f\xee\x6f\x7c\xaf\x16\x64\x22\xe3\x0e\xe7\x54\x97\xdb\xa5\xe3\x43\xfa\xc3\xca\x5a\x37\xee\xf7\xde\x15\x7e\xec\xb4\xe8\x86\x69\x11\x76\x41\xda\x76\x37\x3d\x28\x81\xf4\xbc\x6b\x1b\x7b\xce\x63\x16\x00\x88\xc1\xfc\x6d\x7b\x3b\xd2\xca\x00\x88\x29\x3e\xf7\x1f\x59\x9e\x5b\x93\xb4\x41\xa5\x96\x74\x9f\x66\xb6\x8d\x7f\xf0\x25\xca\x7a\x5c\x12\x06\xe0\x91\x71\x5c\x68\x2c\xf4\x38\x1f\x90\x66\x4a\x58\x05\xe0\x9c\x84\x53\x79\x75\x3d\xae\x87\x00\x38\x63\x58\x7f\x67\x74\xfc\x27\x08\xbf\x56\x82\x09\x14\xf4\x25\xd7\xad\x13\xa6\x72\x36\x64\x7e\x0c\x11\xd2\xa5\xab\x88\x96\x9f\x4a\x29\x81\xa1\x56\x26\x48\x68\xbd\x3a\x4a\x51\xd7\x97\x67\x83\xb9\x71\x35\xef\xb1\x47\xc1\xf0\x40\x3b\xf1\xa0\xf5\x27\xe4\x05\x13\x04\xc0\x7b\x64\xc8\x5d\x2e\x26\x5d\x76\x43\x52\xc9\xdc\xa4\xf0\x51\x95\xc6\xc2\xe8\x5b\xbb\x38\x8f\xc7\x86\x91\x35\x0d\x1b\x70\xbc\x67\x05\x98\xa9\x09\xa9\xd5\x9b\x3f\x5a\x5f\xeb\x4e\xd5\x94\x9a\x50\x72\x6c\x67\x3f\x2b\x10\x45\xcd\x5f\xfc\xec\x34\x91\xa3\xb9\x59\x77\xef\xbb\xe7\x57\x6c\x7b\x5a\x15\x50\x3f\x26\x89\x19\x86\x3d\x7f\x64\x8d\x38\x66\xc5\x2f\x89\xb9\x86\x26\xd4\xee\x62\x75\x0d\x55\xb3\xfa\xdf\xd9\xba\x98\x1f\x4b\x13\xec\x08\x5b\x66\x29\xe4\xd7\x34\xec\xf1\xfd\x37\x8c\x6b\xbc\x75\x05\x7c\x8c\x7c\x97\xff\xf3\xd7\x67\x1f\x48\x6d\xc9\xe2\x74\x6e\x9e\x8b\x39\xf5\x04\x3f\x4e\xc8\xc4\x8b\x55\x09\xd5\xac\x0b\x53\x7a\x50\xa9\x1f\xa1\x34\x0b\x06\x31\xfe\x06\xbb\x43\x3f\x26\xd9\x96\xe1\xd0\x99\xd7\xdb\x77\x71\xfb\x96\x9d\xac\x20\xf6\x43\xd9\x2e\xa5\x1d\x5d\xca\x67\x0f\x26\x8d\x44\x6a\x75\x20\x8c\x2b\x7b\x5b\x72\xb5\xd3\xa5\xc3\xc9\x7d\xdb\x6f\xf9\x26\xe5\x21\xb6\xa9\x9c\xf2\xe1\x4c\xe7\xd3\xa4\x26\x46\xa0\x36\x0a\x5f\xa3\xc8\xe8\x16\xfa\x67\x2a\x44\x62\xeb\x09\xf5\xa9\x1e\x5f\x8a\x04\x8d\x00\x45\xf8\x99\xd5\x4d\xbd\x38\xeb\xac\x29\x91\x7d\x82\x4d\x15\xd7\x70\xb2\x00\xf6\xe3\x8c\xd5\xb1\x3b\x8b\x62\x36\x31\x45\xde\xc9\xa1\xce\x9a\x4a\xcc\x4a\x5c\x53\x63\x22\x86\x3c\x69\xbb\x16\x0f\xb4\x76\xa9\x31\x22\x0d\x5c\x42\xfd\x78\xf1\x5c\x33\xf7\xea\xb2\x20\x20\xb1\x09\x9d\x4c\x78\x9b\xb3\x7d\x2b\x7d\x07\x99\x05\x41\x6a\x5d\x5a\x74\x59\x94\xcd\xeb\xf6\xe6\x56\x9c\x4e\x83\xf5\xae\x1d\x90\x62\x14\x2c\xb2\x6a\xfb\xe1\xdf\x13\x16\x90\xc4\xea\x0d\x66\x85\x29\xbb\xbf\x51\x91\x38\x52\x8c\x13\xf5\x72\x52\x82\x8b\xf1\x5b\xcd\x02\x62\x6c\x09\x6b\x73\xb7\xf4\x1f\x0e\xd3\x10\x13\x29\x95\x83\xa8\xa6\x46\xc9\xff\x21\xf4\x0a\xcf\xed\x3f\x27\x24\xbe\xb0\xf2\x7c\xb9\x11\x75\xa6\x96\xa2\xd2\xf3\x89\x14\x0b\xa2\x48\x22\x41\xac\x2b\x64\xd4\x50\x59\xbd\xa3\xf6\xb6\x7c\x25\xfe\x31\x3d\x51\xcc\x91\x87\x8b\x65\x9f\x6f\x19\x12\x4d\x06\x85\x42\x16\x44\x3a\x25\xbd\xae\xf7\xba\x81\xe3\x27\x54\xd5\xd1\xaf\xea\x03\x96\x73\x2f\x85\xc6\x82\x98\xa4\x58\x2e\xe9\x84\xef\x59\x10\x73\x0b\x3e\xda\x17\xf0\xf1\x87\xb7\xc6\xde\x02\xe2\x43\xfa\x3e\x09\x0b\xe2\x54\x06\xd4\xfb\xa0\xb8\xc0\x69\xb2\x6d\xb3\x20\x31\x16\x19\xa2\x44\xe1\xf6\x17\xff\x71\x16\x82\x72\xab\xef\x37\x10\x79\xf3\xb6\xcc\x9a\xec\xbf\x53\xf5\x49\x16\xb0\x58\x0b\xe8\xf5\x31\x67\x84\x9e\x59\xc0\x58\x8c\x2f\x92\x83\xa9\xb9\xd5\xdc\xbe\xb3\x0d\x4c\x07\x8b\xd4\xd6\xdf\xcf\xcd\x5d\x59\x79\xb4\xed\xf4\x5b\x95\x51\xa4\xdb\x1a\x3f\x4b\x55\xfc\x60\xb0\x2a\x98\xc8\x52\x38\xd5\x93\xef\xe3\x54\xd9\x0d\xd4\xea\x55\xb4\x61\xd8\x43\xa9\x7e\x0c\xcc\xea\xaf\x00\x2b\x5d\xf0\xca\x02\xae\x52\xbc\x81\xe5\x09\x8a\x8e\x08\x38\x92\xef\x62\x41\x1a\x47\x68\x12\xf7\xef\x71\x55\x89\x05\x92\xa6\x91\x45\xce\x5a\xa5\xcb\xdb\x4a\x7c\x5c\xdd\x3c\xc9\x55\x1a\xf8\xd7\x6d\xf8\xd5\x8a\x5a\x41\x21\x34\xb2\x1d\x26\x6e\xee\xb8\x8e\x15\x75\xcb\xcb\xbd\x38\xc2\x73\xd1\xf7\xde\x59\xa0\x69\x68\x15\x56\x8a\x4b\x9b\x26\xad\xeb\x6d\xd3\xb9\x5a\xc6\x2e\x0c\x66\x01\x04\x49\xe8\xb4\xf0\x9d\xf7\x81\xa3\x6a\x7c\xe9\x4d\xc8\x02\x48\xad\xb6\x7d\x55\xe6\xf9\xed\x00\x61\x3e\x99\x7d\xa0\x08\x9a\xd4\xed\x3b\xe9\xa0\xd9\x78\x82\x05\x26\xe4\xa8\x45\x66\x2d\xdd\xfe\x29\xd4\x8f\x53\x39\x6f\x78\xc8\x02\x13\x71\x7c\x9e\x8f\x70\x10\x4b\x51\xe8\xcb\xe4\x7e\x1a\x19\x33\x39\x10\x2f\x1f\x3c\x28\xa3\xb8\x37\xef\xdf\xd7\xed\x54\x69\x93\x91\xc1\x4d\x33\xa0\xfd\x1d\x75\xca\xd6\x9f\xc3\x54\xfc\x2b\x4c\x48\x60\xe7\x33\xf8\xa6\x2d\xd2\xc4\x66\x7f\x27\x21\x24\x41\x6b\x8f\x07\x71\x94\xe5\xdf\x13\xb3\x60\x84\xe8\x14\xd9\x34\x6d\xb2\x37\x26\xf8\x33\x42\xc0\xda\x12\x75\xdd\xd4\x0e\x07\xdc\x3e\x4c\xd4\x73\x1c\x0e\x0f\xa9\x15\xab\x3b\x58\x2b\x8d\x64\x7c\xeb\x48\xc8\x79\x30\x11\xaa\xf6\xef\xe7\xcb\xb4\xa0\xda\x8e\x16\x78\x37\x11\x40\x53\x96\x75\x83\x74\x3a\x77\x30\x0a\x6c\x35\x26\x2b\x54\xf7\xa7\x84\x20\x90\x0b\x1d\xbe\x9f\xbb\xbf\x0a\xcb\xc5\xf9\xbe\xf9\x57\x2f\x11\xcf\x48\x1c\x5a\x33\xd4\x7b\x40\xbc\x81\x33\x88\xf8\xed\x7c\xe5\x3a\xc2\x48\x2c\x00\x51\x64\x05\x7c\xf4\x78\xa0\xee\x3c\x10\x62\x6b\xe9\x98\x15\xcd\x22\xcf\xbd\x10\x85\x3b\x9a\x08\xab\x44\xd9\x6e\x9f\x0e\x8d\xd8\xf5\xde\x3b\xa8\xfb\xfc\xa3\xa4\x71\x8c\x34\x91\x5e\x68\x0b\x09\x38\xb3\xa1\x00\x23\x54\x72\xc4\x56\xa1\x9b\x1f\x2e\xe7\x37\x02\xf5\x16\x47\x4f\x9a\x4a\x8d\xdd\x97\xfa\xad\xfc\x18\x7b\x91\xd9\x54\x6d\xf2\x00\xa8\x12\x78\x09\x76\x91\xb4\x96\x5f\x68\xeb\xd2\xfe\x77\x3a\xd6\x50\x2c\x0b\xfa\xcb\xbd\x6d\xde\xb6\x6f\xe5\x69\x32\x01\x18\x4b\x51\x6d\x5a\x8c\xf6\xf8\xf1\x45\x32\x61\xab\xc1\xcf\xc7\x22\x53\x7f\xc3\xf6\x96\x11\x66\x22\x64\x99\xeb\xec\xdd\x16\x2d\xe7\xdf\x6c\xc2\x03\x96\x38\x85\xc3\x9d\xa8\x7f\xfc\x0e\x97\x39\x3c\x1b\x23\x9c\x51\xa4\x47\x61\x9c\xf4\x3f\xe7\xac\x71\x46\x2b\xf3\x0f\x8a\xa7\x24\xe9\x38\x6e\x3d\xc4\x7e\x61\x21\xd2\x59\x3e\x30\x39\x9c\x3c\x34\x2e\xd2\xd0\xa9\xc8\x6c\xdf\x20\x37\xe3\xfb\x90\xc6\x21\x83\xae\x03\xdf\x27\x55\xc3\xdf\xd6\x2d\x12\x22\x06\xc1\x3f\xd1\x0b\xe8\x07\x09\x6b\xa7\xda\xbe\x50\x9f\x2f\xbe\x44\x48\x9b\x8a\xb7\x11\x61\xa6\xaa\xf2\xb1\xd4\xe7\x1c\xda\xd3\xb5\x6f\x4a\x38\xb9\x59\x12\x12\xee\xb2\x51\x6b\xc8\xe9\xe7\xbe\x62\x5a\x7a\xea\x56\x9e\x97\x1f\x9b\x1e\x5b\x3e\x58\x13\x89\x96\xd6\x21\xca\x3a\x93\x59\x88\xe7\xf6\x52\xb7\x61\x8f\x1f\xa1\x13\xf0\x8c\x4a\x6c\x9e\xf8\x03\xc0\xad\x4b\xcb\xa1\xd3\x24\xaf\x1f\xca\xc3\x01\xfa\x01\xca\x20\xa5\x65\xaf\xb3\x0a\x54\xf3\xa5\x15\x2c\x23\x26\xa6\x58\x6a\xbf\xcf\x4b\x89\xc2\x4b\x50\xb5\xfb\xde\xaf\x52\x31\x46\x0c\x84\x58\x7d\xb0\xf8\xc7\x6f\xa2\x7e\x5b\xf4\xbe\xb3\xd6\x5b\xb9\xac\xee\x00\x26\x15\xf0\x2f\xe3\xc4\x30\x48\x34\xaa\xb5\x65\x96\x3e\x82\xbe\x41\xd0\x9c\x7d\x14\x1d\x06\xce\x44\x6b\xb5\x1f\x07\xcc\x5f\x87\x9f\x21\x01\xdb\x86\xc6\xf0\x73\x81\xdd\x1b\x0c\x40\x73\xcf\xb4\x9e\xbd\x37\x61\x48\x02\xed\x4c\x8f\xda\x75\xa0\xce\x66\xc0\x7a\x2c\x8c\x48\x80\x2e\x16\xc7\x73\x93\xad\x9a\x2b\x58\xff\xf5\x5c\x0b\xa3\x84\x59\x87\x5f\x0b\x71\x5d\x15\xba\x5e\xf8\x48\x38\x8c\xa4\x42\x3a\x75\xfd\x26\x2a\x78\x43\x04\x79\xdd\x1d\x73\xd6\x86\x88\x96\x5e\xa0\x97\xf7\xf6\xdb\xe2\x65\xe5\x8f\xc7\x4c\x60\xad\x65\x5f\x41\xa7\x69\xb8\xf0\xac\x85\xf1\xaa\x14\xc6\x46\x86\x8e\xdf\xae\x61\x7b\xb2\x8c\x94\x77\xa8\xba\x0b\x49\x82\x40\xc8\xde\x8f\x04\x91\xfd\xdd\xb1\x08\x22\xeb\x3f\x67\xaa\xd2\x41\x33\x3e\x49\x22\xc2\x24\xb6\x68\xc8\xff\xf7\xde\xf7\x48\x59\x98\x70\x6b\x09\xdf\xbe\x6f\xe2\xe7\x44\x60\xb3\x3d\x1c\xe1\xeb\xb8\x3d\xcb\x8f\xb2\xf4\x6c\x57\x7f\x94\x72\x6b\x82\xb9\x47\x6c\x56\x21\xf2\x2e\xe0\x1d\xb5\xaf\xe3\x71\xf0\x19\x5f\x13\x5e\x58\xc8\x82\x00\x05\x6c\x8f\xe2\xe7\x77\xc8\x86\xe5\x89\xf6\x58\x8a\x4a\x21\xaa\x3c\x1e\x45\xd1\x69\xc0\xb0\x90\x11\x85\x61\xbe\x5f\xf7\x6f\xb2\xfe\x33\x91\x44\x76\x30\x9a\x13\xec\x6d\xf1\x63\x84\xd0\x64\x21\x13\x80\x95\x91\x45\xf3\xe6\x84\x9a\xbb\x04\x22\xe4\x42\xe0\xaa\xde\x86\x25\x53\x9d\x34\x16\x72\x09\x3e\xff\x5f\xbe\x89\x4a\xa8\xa6\x4b\x51\xfc\x08\x43\xb0\x04\x8b\x09\x05\x9c\x8f\xcf\x45\x77\xea\x34\x04\x4c\x18\x17\x7f\x2c\xd6\x0f\x8b\x9b\x87\xd5\x7e\xf9\xfc\xb8\x59\x3c\xfd\xb9\xdf\xbe\x6e\x36\x0f\x7f\x76\xe3\xb8\x0d\xf5\x5c\xd2\x87\x1c\xa0\x36\xf4\xc9\x8a\x43\x0e\x37\xe7\xcb\x27\x06\xa6\x2c\x14\xa1\x15\x56\xb9\xcd\x0e\x59\x23\xf2\x45\xd5\x0c\xf0\x81\x2c\x14\x71\x8a\x5d\xf1\x63\x7d\x5a\x5a\xfb\x92\xbc\xbf\xa3\x8a\x08\xe3\x7d\xd4\xb0\x08\x3a\x44\x2c\xf8\x31\x34\xc1\x9d\xd9\xca\x51\xdd\x2e\x76\xdd\x1d\x55\x94\x42\xbf\x67\x2f\x46\x45\xf3\xaf\x20\xd1\x93\x1f\xa0\x24\x41\xe8\x6c\x9b\x14\x0e\xb3\xd3\x50\x69\xc2\x7d\xd7\x6c\x88\xe8\xea\x85\x62\xfa\x09\xa5\x34\xb3\xc2\x9a\x98\x97\x9f\x9b\xb7\x67\xb3\x81\x6a\x22\x52\xe4\xc7\x1a\xeb\x47\x56\x94\xd6\xfc\xc0\xa1\x71\x3f\x59\xcc\x26\xef\x95\xa6\x32\xec\x8d\x68\x9a\xac\x6e\x32\xd5\xbd\x3f\xc0\x03\x3c\xf3\xdd\xc3\x7a\xb3\x59\x3f\x75\xbe\x29\x2c\x04\xc1\xac\xbd\x22\xd4\xcd\xbe\x2c\x60\x5d\x60\xef\x72\x75\x3c\x35\x97\x91\x94\x11\x0b\x41\x5b\xfe\x46\x0d\x8d\x07\x49\xdd\x42\x2e\x2e\x93\xe7\x62\xa8\x44\x8d\xd5\x7d\x05\x06\x2a\xa8\xdc\x76\x37\xbb\xfd\x87\x86\x73\x5c\xc1\xd7\x4b\x5f\xc9\x08\x8d\x23\xae\x7e\xdb\x0d\x75\xff\x58\x68\x8c\xd5\xe0\xcd\xea\x75\xb1\x79\x1b\xe8\x31\xd8\xe3\x51\x90\x00\x36\x5f\x3b\x3e\x41\x55\x1e\x2d\xad\xf0\xf2\x65\x3f\x9f\x45\x01\x0d\xb1\x28\xe6\x89\x16\xc3\xc5\x25\x0a\xa4\xc4\x66\xff\xe5\xe7\x0f\x0c\xaa\xfd\xdf\x43\x22\x35\x73\xca\xe9\xa8\xe6\xa1\xc5\x4c\xd9\x89\x45\x61\xa4\x91\xd9\xf9\x70\x56\x3f\x2e\x1d\xee\x8a\x45\xa1\xe2\x18\x60\xe9\xf2\xdc\x7e\xa5\xdb\x26\xda\xd8\xa9\xbd\x8c\x2f\xe5\xab\xfa\xdf\x1c\x02\xc1\xd8\x7a\xb5\xfb\x36\x8c\xc8\xa3\x28\xe6\x88\xd7\xda\x7e\x7b\x7e\xd9\x2d\x6e\x6f\x5f\x46\x97\x1e\xa5\xd6\x33\xaa\x72\x90\x05\xd0\x23\xc0\x04\x8b\x22\x19\xe1\xc7\x3b\xb1\x93\x46\xa8\x1f\x8b\x42\xb7\x6f\xc2\xaf\xa6\xe3\x7c\x33\xd3\xaf\x48\x51\x64\x04\x46\x44\xa6\xac\x14\x72\x41\x97\x17\x95\xf7\xd7\x6d\x8c\xb2\xda\x0b\xb8\xf7\xec\xca\xaf\x62\x8e\x28\x89\x05\x36\x37\xf3\xf6\xd6\x5a\x4c\xe9\xb3\x99\x2b\xfe\xb1\x28\x11\x12\x51\xe2\xf2\x7c\x71\xf6\xab\x93\xe3\x3a\xb1\x34\x08\xbb\x36\xef\xad\xc1\xe3\x80\x0b\xc7\x22\xaa\xb9\xcb\x63\x9a\xc5\x3b\x54\xc2\x21\x8c\x87\xea\x84\x6e\x24\x23\x52\x79\xdc\x3c\x16\x44\x5f\xca\x73\x27\xf9\xc5\x22\x96\x88\x78\x60\xdf\xe3\xa8\x49\x4e\x92\x6d\x00\x31\xfd\x5a\x9f\x8d\x45\x8c\x2a\x8c\x77\xad\x00\x63\x67\x5c\x36\xbe\xdf\x3c\xea\xe4\xe5\x30\x94\x1f\xc8\x29\xb3\x88\x0b\x81\x73\xd3\x95\xad\x10\x90\x32\x48\xca\xfc\x28\x90\xd8\x64\xb8\x2f\x73\x33\xd8\xb3\xa3\x94\x28\xf0\x52\xbe\xaf\x05\xd4\x4a\x9c\x40\xff\xcf\xb9\x6c\x60\x5d\x6c\xf1\xc2\xfd\x48\x41\xa4\x35\x5a\x6c\x77\xaf\x73\xbb\x95\x0d\xe6\xd1\xc0\x7f\x88\x45\x22\x12\x86\x7b\x94\x75\x0d\xaa\xf9\x54\x79\x83\x45\x82\x29\xac\xdd\x98\x73\xa1\xaf\x74\x42\x59\x24\x20\x44\x7b\x42\x0c\x48\x47\x1c\x9b\xf9\x52\x68\xa4\x88\xc6\x9e\x92\x83\xf5\x68\x2b\x80\x63\x83\x99\x85\x52\x55\x59\xd7\xd6\xf5\x76\xef\xb5\x13\xec\xff\xbc\xb9\x90\x20\x08\xfc\xd7\x2a\xa7\xa9\x2f\xce\xcd\xdb\xf5\xef\xec\x9e\x8b\x8e\x29\x3a\x4a\xac\x37\xcf\xeb\xc9\xf4\xd1\x1a\xac\x01\x04\xca\x90\xf9\xae\x0d\x52\x8a\xfc\x5a\x1c\x41\xa0\xb8\xeb\x10\x58\x79\x2b\xef\xb1\x78\x1d\xd3\x44\x10\xc7\x5e\xf9\x1e\x5d\x65\xca\x7c\xc4\xff\x64\x11\x80\x41\x6c\xc9\xe2\xa6\x5e\xa2\xee\xdd\xfc\xfd\x31\x89\x41\x74\xfb\xf2\xf9\xe1\xf9\x65\x7f\xff\xb2\xf2\x31\x42\x1c\x00\x80\x35\x45\x47\x25\x8b\xf1\xbb\x15\x13\xa2\x55\x3f\xdf\xed\x1b\xf1\xef\xf2\x28\x33\xd8\x0f\xfc\xdf\x58\x4c\xa4\xed\x9f\xfc\x3f\x67\x92\xb9\xbf\xcc\x87\x90\x31\x51\x69\xe0\x80\x4d\xbd\x84\xf4\x20\xeb\xbc\x66\xed\xb2\x38\x32\x81\x34\x8e\x82\x62\x0b\xd7\xe0\x04\xcc\xfa\xd2\x4d\x4c\x03\x12\xe8\x81\x5a\x7b\xf6\x5f\xb8\xcb\x0e\x6f\x3e\xac\x22\x53\x83\x92\xeb\xff\x8e\x7f\x39\x95\xd6\x92\x77\x53\x81\xce\x54\xff\x4a\xc5\x2c\x54\xb1\xf4\x3a\x4b\x9d\x50\xd5\xf8\xc3\x29\x08\x3e\xf2\x34\xb9\x56\x50\x99\xbf\x3d\x42\x0a\xd5\x7d\x50\xa8\x06\x59\x15\x4d\x5f\xa2\x8b\x05\x68\xaf\x88\x81\xea\x5b\xfe\xef\x92\x2b\xed\x82\xf0\x1d\x7a\x25\x7f\xb9\x6d\xc6\x32\x8d\x91\x93\xf5\xb8\x5a\x76\x67\x10\x61\xe0\xfa\xb6\xfb\xb7\xb2\x3e\x91\x2f\x51\x3c\x2c\x96\x32\xb0\x75\xd9\xda\x2d\xdb\xdb\x4f\xa4\x0f\x59\x2c\x8d\x74\x00\x39\x91\x1d\xdb\x39\x6f\xdd\x91\x44\xbe\xe9\xdc\x51\x59\x0c\xc4\x6a\xed\x09\xad\xff\xc8\xaa\x73\x7d\x0b\x66\x7e\x32\xc7\x90\x5a\x1f\x38\x74\xc3\xbe\x2b\xab\x6b\xb6\x08\x8b\x0d\x93\x0c\xba\x15\xa4\x14\xc5\x84\xa2\x35\x1a\x9d\x04\x61\x64\x3a\x8f\xef\xe0\xa7\x6c\x54\xa7\xcf\xe0\x47\x40\x90\x74\xc5\xb9\xed\xfe\xe6\xf9\xf5\xfe\x9b\xdf\x5e\x12\x42\x01\x03\xc5\x63\xa6\xaa\x72\x97\x9d\xba\xbf\x73\x2b\x2f\x55\xc0\x4f\xac\xd8\x74\x7f\x07\x2a\x1d\x18\x67\x9f\x8b\xba\xd9\x1f\x30\x65\xdf\x8b\xb3\xce\x9a\xbd\x2e\xd5\xb9\x17\xc3\x61\x49\xe8\xde\xdd\x3c\xab\x9b\x75\x03\xc7\x36\x38\x7a\x41\x61\xc1\x6a\x12\xbf\x25\x11\x91\x18\x67\x6d\x9b\xb3\x46\xd6\x75\xb7\xe2\x27\x71\xa8\x89\x97\xfe\xf1\xde\x54\xfe\x10\x4f\x1c\x3d\xb7\x79\x01\x95\x9d\x32\xdc\x6b\x70\x13\x98\xd9\xba\x13\xca\x74\x6c\xf3\xac\x76\xa5\x2f\xda\x1d\xac\x27\xa7\x5d\xb9\xe3\xb2\x84\x4a\x8a\x6b\x43\x53\xde\x44\xe1\x7c\xc2\x91\x50\x69\x2f\xbc\x28\x9f\xcd\x2e\x53\x3f\xa0\xa9\x9f\x3f\x8a\x09\x89\x80\x25\x14\x42\x04\x7e\xad\x7e\x36\x15\x1c\xb3\xf3\x10\xff\xc4\x12\x16\x4b\x94\x81\xc3\x67\x84\x0c\xe5\xdd\x6a\xf1\xe8\x8f\xa6\x91\x89\x3b\xad\xd7\xa7\xbd\x29\xd4\x34\x40\x19\x79\x4a\xba\x4f\x09\x4e\x22\x57\x38\x70\x37\x75\x6a\xb4\x32\xba\x37\x32\x52\xc8\x68\x3d\x66\x85\xed\xfa\xfa\xbf\x33\xeb\x15\xad\xbc\x56\x86\x3f\xa0\x02\x82\x31\x7c\x1b\x38\x8e\x41\x1d\xff\xb8\xc2\x8e\xb0\x44\x85\x04\x77\x1e\xdb\xab\x1d\xe1\x39\xfd\xee\x94\xa8\x38\xc0\x4a\xa6\x12\xc5\xba\xae\xcf\xb0\x2e\x74\xf6\x9e\xe9\xb3\x27\x73\xb7\x23\x28\xa6\x1b\x16\xbf\xb5\x99\xba\x03\xb3\x44\x71\x8a\xd4\xf7\xe3\xfe\x54\x96\xdd\x1a\x93\x68\x6a\xfd\xc1\x7c\xab\x6b\x6f\xfd\x92\x27\x1f\xd6\xa9\x56\xb4\xe7\x12\x5e\x8b\x37\x4e\xee\xb0\x56\x40\x5d\x01\xae\xbd\xde\x41\x0b\x2f\x81\xc8\x56\x05\x2d\x5a\xbd\x7d\xd3\xcf\xfa\x70\x2d\x39\xeb\x47\x73\x2e\xf5\x40\x1d\xe9\x66\xb7\x74\x45\x80\xf1\x38\x13\xca\x94\x7a\x8d\xe6\x7a\x68\xf8\xc9\x12\x13\x09\x94\x80\xd8\xac\x5e\x96\x7b\xf7\xae\xef\x9e\xf7\xeb\xa7\x3f\x56\xdb\xce\x03\x91\x25\x26\x8e\x11\x78\xbc\x05\x8c\xfd\x1e\x3b\x24\x21\xa3\x01\x49\x90\x81\xb3\xda\x7d\x83\xaa\xec\xfe\x1a\x11\x14\xc0\x79\x29\xf3\xfc\xa1\x6c\x1a\x70\xaf\xae\xeb\xa8\x33\x1a\x28\xc0\x27\xfb\x7d\xb1\xde\xed\xd6\x8f\xab\xd7\xa7\xdd\xfa\xe1\xfb\x7a\xf7\xed\xf6\x65\xf1\xfd\xf9\x65\xf7\xb2\x78\xda\xde\x79\xe5\x0b\x46\x49\x48\x51\x16\xe2\x84\x82\xc1\xdd\xab\x4c\x89\x88\x10\x4d\x2d\xcf\x97\x57\xb5\xec\x85\x70\x19\x25\xba\x03\x07\xdd\x01\x0c\x41\x51\x8b\x42\xdb\xc5\xb1\xf3\xca\xbc\x92\x3b\xea\x6e\x1e\x25\xda\x3e\x12\xeb\x0b\x86\x66\x04\xbf\xda\xda\xc6\xaf\x3a\x0d\x89\x16\x41\xa7\xc4\xbf\x7c\xcb\x72\x7d\xad\x4b\xc2\x68\x18\xc5\x98\x63\xc1\x4f\x5b\x17\xf2\xc1\xd4\x27\x2f\xc9\xe4\xc3\x71\x18\xc4\xa8\x37\xa4\x37\x15\xac\x55\xd9\xe3\x22\x18\x0d\x53\xed\xb7\xca\x45\xd5\x64\x2a\xb7\x4d\xea\x4f\xce\x64\x02\xcc\x88\xb3\x22\x6b\x2c\x89\xab\xbb\xa3\x51\x18\xd0\x0e\x7b\x87\x84\xf1\xfc\x32\xd0\xad\xfe\x4f\xd8\x87\xbd\xec\xaf\x79\x9e\x1a\xa3\x51\x64\xc2\x8e\xe3\x5b\xdf\x7f\xa5\xb0\x3d\xbe\x8d\x11\x27\xc4\xbd\x36\xdf\xca\x73\x0d\x2b\x7d\x98\x68\x9e\x4c\x7e\x49\x94\x52\x84\x28\x38\x6f\x96\xfd\xa9\x2a\x4d\x67\x93\xc3\x68\xa4\x63\x69\x3d\xbb\x0b\xa8\x44\xbe\x15\x39\xac\x0a\x3d\xbc\x6f\xb1\x32\x38\x83\x9e\x5e\x1f\x5f\xb7\xdd\x1f\x21\x94\xae\x25\x78\x3e\xfd\x9d\x6e\x07\xa5\x31\x8d\xad\x0c\x2a\x46\x38\x0f\xa2\x8d\xd9\x5f\xe0\x3d\xc3\xaa\xca\x28\xd2\xa6\x94\x71\xac\x06\xdd\x2c\x6e\xfe\xf4\xbb\x2d\xa5\x5c\x60\x13\xc6\x46\x7a\xf3\x9a\x47\xd7\xff\xdb\x7f\x58\xda\x1c\xd6\xa7\xc7\x8b\x3c\x6f\xf7\xd3\xbb\xb2\x52\x99\xcc\x3f\xe9\x74\x50\x26\x00\xd7\x34\x6b\x6f\xdc\xa6\x8d\xb6\x3e\xee\x10\xd4\x7e\x14\x88\x9e\x42\xd3\x20\xb6\x4a\xa8\xa9\xb9\x07\xa3\x3c\x30\x08\x63\x44\x26\x95\xd7\x93\xfa\x2a\x59\xa6\x9c\x04\x58\xb4\xc2\x95\xad\x0d\x0d\x7a\x31\xb4\xe9\xb9\xa3\xc0\x06\x51\xe7\xa6\xec\x79\x81\x8c\xf2\x34\x22\xac\x7b\xba\x8d\x2b\x4f\xcd\xd8\x69\x32\xca\xa5\x46\xb0\xc2\xf1\x9c\xef\xca\xbb\xea\x13\x30\xf4\xf8\x33\x29\xa7\x28\x61\x9e\xd5\x0b\xcb\xdb\x19\x89\x18\xcf\x4f\x60\x11\x2b\x70\xeb\x80\xfd\xb1\x93\x5b\xe0\x86\xc9\x54\x85\xb6\x3e\x8d\xb1\xb6\xf7\x20\xf1\x3f\x4c\xb1\xc8\xb2\x53\xf7\x37\x03\x3e\x1b\xa3\x9a\x24\x49\xe2\x3b\x97\xe7\x66\xac\x87\xcc\xa8\x4e\x28\x73\xf5\xb0\xc7\x52\x4f\x0f\xca\xc8\xb3\x3f\x6d\x82\x36\x1f\x35\x52\xd0\xa9\xea\x20\xd1\xdf\x40\x1f\x20\xbf\x38\x42\x61\x37\x27\x40\x9b\xd4\xa3\x21\x33\x5d\xdf\x5c\x16\xba\xce\x3f\xeb\xdd\x53\x30\x29\x7a\xd5\x99\xaa\x3c\xfa\xe2\x42\x4f\xd2\x62\xd4\x28\x86\x3b\xb0\x39\xe7\xf9\xb4\x3b\xd1\x0d\x49\x13\x2f\x18\x24\x7e\xfa\x50\x0f\xfb\xba\x2f\xf0\xbf\xe7\xcc\x4e\xa0\xc9\x33\x37\x40\x02\x2f\x96\xbc\x9e\xde\x0e\x63\x98\xb1\x81\xbe\xa5\x77\xbb\x47\xec\xae\x89\x05\x41\x88\xed\x77\x09\x8b\x4a\x66\xcd\x80\x64\xce\x18\x89\x6d\x77\xf9\xae\x6a\xa3\xc4\xf7\x7a\x51\x1d\xa0\x68\xb2\x42\x74\x03\x98\x55\x28\x44\xea\xc0\xf3\xc7\x27\x9d\x4f\x46\x84\x4c\x2d\x27\xf5\xe2\x1a\x89\xdd\xc2\xc5\x42\x22\x24\xf3\x0e\x5b\xe7\xc3\x54\xb7\x97\xb1\x90\x59\x7e\xb1\x5d\x2f\xac\x02\xd2\xec\x03\x65\xa1\x8a\x98\x93\x93\x38\x55\x9d\x6f\x28\x63\x51\x1a\x61\x23\x07\x7b\xd8\x87\x73\x05\x77\xe7\x62\xb6\xdb\xf4\x8f\xf3\x8c\xf0\x9f\x3b\x49\xcc\x09\xd6\xc7\xce\xce\xb0\x6f\x5c\xa1\x65\x31\x58\x70\xad\x67\xd3\xd8\x0d\x36\x2b\x0e\x4b\x71\x3c\x89\xec\xe0\x23\x46\x96\x10\x69\x1b\x36\xe5\xaf\x44\x01\xdd\x07\x58\x48\x51\xe5\xc3\x49\xd4\xea\xde\xdd\x6b\xf4\x9c\x19\x4b\xb8\xf5\xf2\x3d\x5f\xa0\x72\x28\xdb\x5f\x5a\xfd\xf8\xcf\x9a\x44\x07\x9e\xc5\x55\x6f\xa0\xfa\x0e\x19\xce\xb9\x28\x8a\xfc\x85\x73\x48\xac\x15\x5a\x55\x9e\x4f\x9d\x13\x9a\x5f\x99\x59\x1a\xc4\x48\x7c\xdf\x54\x59\xd1\xb8\xd7\x68\xdd\x61\x7e\x3e\x11\x6b\x63\x2c\x15\x11\x56\xa1\x51\xa0\xfb\x5c\xf4\x4a\xba\x8c\x89\xc0\x60\xd5\x4f\x8a\xe2\x87\xaf\xb1\xf8\x43\xd2\x6a\x94\x61\x66\x76\xae\xae\xe6\x5d\x6f\x3f\x44\x18\x75\x7b\x35\x93\x61\x10\xa4\xce\x96\xbf\xe8\x81\xfa\x8c\xc9\x98\x21\xb7\x3f\x2f\x0f\xeb\xee\x39\x29\x6a\x05\xec\xe0\x9a\x0f\xe3\x46\xe8\x24\xc6\x64\xdf\x42\x60\x9f\x8b\xfc\xb2\xe9\x5d\xe4\x26\xcb\x32\xd3\xcc\x4a\xa2\x6a\x30\x59\x01\x9b\xaa\xfc\x7f\xa0\x26\x86\x03\x7e\xa4\x16\x28\x08\xf5\x24\x8e\x59\xd7\x7b\xfd\x0c\x99\x6f\x3f\xc3\x83\x40\x6a\x18\xfa\xa7\xf9\xb9\x35\x20\xec\xfa\xa1\xd4\x91\x6f\x50\x8f\xe9\xd2\xb7\xa5\x38\x11\x06\xd3\xda\x7d\x56\x2f\xcb\xaa\x02\xd5\xdc\x9d\xf3\xfc\xe6\x7c\xc9\x26\xdb\x14\x27\xda\xaa\x82\xd4\x56\xb6\x29\x8a\x59\x77\x0e\x48\x5c\xdb\xf8\xf9\x64\x05\x2b\xee\xca\xaa\xbd\x18\xf5\x76\xbd\xd5\x8f\x7f\x43\x18\xa8\xc4\xce\xdf\xfc\x07\xee\x7d\x7e\xd8\x0c\xcd\x9d\xf1\x30\x09\x31\xe5\x57\x79\x59\x83\x6b\x41\xfb\x8b\x08\xb9\xc2\x35\xf4\x79\xf7\x6d\xf5\xb2\xdf\xee\x16\xbf\xaf\xba\x43\x4a\x80\x87\x48\x1d\xc5\xcf\xbd\x1a\x22\x27\xc7\xdf\x10\x91\x6e\xd1\x1a\xdb\xd9\x7f\x5d\x03\xe2\x31\x97\x54\xf6\x76\xa0\x7a\xfb\x96\x9d\x46\x4e\xa0\x7e\x9c\x09\x02\xb7\x81\xfa\x48\x6d\x7c\xa2\x24\x4c\x30\x21\x92\x50\x37\x8b\xe2\xe0\x59\xcc\x8c\x27\x71\x8c\x7a\x18\xcd\xc4\xcb\xc9\x1f\xa7\x49\x88\x74\x20\x84\xb9\xe1\x4c\x38\xcd\x75\xc1\xdd\x68\x26\x22\xcc\x79\xb1\x25\xef\x4b\x79\xab\xe6\x6d\x72\xb9\x4c\x32\x64\x72\xda\x39\xbb\x1c\x35\x79\xdd\x10\x1e\x44\xd4\x85\x11\x87\x0a\x70\xa3\xb2\x6a\x65\xe3\xb0\x90\x73\x62\x9b\x3e\xd6\x65\xe7\xd4\xb1\x6d\xda\x23\x9c\xb8\x7b\xb2\x74\xb6\xb8\xb3\x4d\x05\xce\xc1\x2e\xf5\x37\xc2\x52\xc4\x96\x65\x35\x05\xb3\x9d\xbf\x56\x7b\x0d\xaf\x3c\x14\x19\x4f\x03\x4b\xee\x3e\x8a\x3c\x53\x60\xc5\xf4\xa7\x45\x0c\x2e\x42\x4b\xc8\x6f\x44\x9e\x5f\xfe\x28\x9b\xae\x55\xce\x85\x60\x01\x19\xb9\xc4\x59\x80\xa8\x3f\x6c\xb4\x1e\x3a\x21\x3d\xfe\x79\xe3\x0f\x49\x2a\x10\xc5\xa2\x44\xb1\xbc\xae\x39\x8e\x9f\x97\x54\x1c\x73\x5c\x93\x15\x7a\x6a\xa5\x33\xbe\xcf\x2a\xa0\x81\xeb\xbc\xb8\xa2\xcc\xe4\xa7\xa8\x58\x61\x79\x5a\x95\x47\x2b\x01\x55\xfd\xc8\xe1\xa5\x2c\x9b\xdf\xa6\xc4\x48\xc6\x15\xb3\xde\x90\x79\x79\xb0\x34\xb7\xf3\x35\xb2\xaf\xbf\x48\x95\x46\xc2\xa9\x9c\x20\xa1\x16\xcb\x02\x7d\x25\x84\x2b\xc1\x39\xef\xc2\x1c\xaf\xd7\x86\xe6\x02\x57\x4d\x1d\xae\xb4\xa4\x2e\x5b\xfe\x79\x41\x4a\xf9\xf8\xb8\x56\x11\xd6\xe9\x9c\x96\xd8\xa8\x17\xc1\x21\xa0\xc4\x66\x80\x58\xe3\x82\xfd\x49\x5c\x06\x45\x0a\x0e\x81\x85\xe2\x62\xa5\xf1\xf7\x8f\xb7\x5b\x54\x8f\x9c\x98\xc9\x30\x0e\xa1\x95\x58\xee\xf4\x17\xc2\x76\xea\xe6\xd0\x49\xc4\x30\x0e\xd2\xc6\x8a\x9e\x82\xbf\x2b\xad\xd1\xa0\x8b\xb7\x06\xbf\x1e\x8c\x88\x98\x45\x8c\x0d\x82\xe1\x34\x08\x34\x16\x29\x51\x9c\x53\xb7\x79\xcd\x73\x7b\x02\x3b\x97\x54\xe7\xe7\xc9\xd2\x80\x12\x4c\xe5\x8e\xa3\x04\xdc\x1f\xe4\x81\x45\xa8\x23\xee\xe1\xf1\xf5\x61\xb7\xde\x3c\xac\x57\x2f\xfb\xcd\xcb\x6a\xbd\x7c\x26\x7e\x1c\x21\x29\x22\x9f\xb6\xff\xdc\x75\x7f\x62\x49\x6a\x75\x60\x0e\x6d\x96\x71\x07\x50\xdf\x9e\x61\x57\xde\x95\xd5\x8f\x7e\x4c\x1a\x8a\x4e\x2a\x69\x30\x0f\x3e\xb1\x6c\xf9\xff\xfb\xaf\xff\x3a\x2e\x95\xb4\x4c\xb6\x5c\x54\xf0\xf8\x7e\x7a\x10\xe7\x02\xa1\x18\xa3\x49\x90\x86\x22\xc0\xb4\x2c\x07\xd3\xf0\xab\x63\x1c\x53\xfd\x47\xa1\xaa\xd2\x59\x33\x0f\xe5\x24\x59\x1a\x82\xad\xe3\xdd\x0b\xa7\xcf\xea\x0f\x44\x01\x45\xc0\x12\xfc\x6c\xa0\xd0\x5e\x8a\xc2\x2d\xa2\xbe\xfc\x93\x46\x8a\x80\xc3\xbf\xed\x8b\xf3\x71\x5f\x9a\xfd\x79\x86\x4f\xd7\x8d\x56\x18\xd1\x66\xb5\xe5\x8e\x3c\x17\x37\xe5\x30\x87\x1c\x8f\x8e\x89\x45\xb8\xb5\x79\x36\x09\xa3\xe6\x57\x78\xb0\x34\x11\x1a\x53\xae\x36\x4e\x9d\xb0\x4a\x58\x4a\x03\x66\xba\xaa\xc7\xe4\x36\xd1\x40\xa1\xc6\xcb\xc9\xe3\x3e\xb6\x7d\x10\x9d\xd2\x94\xdb\xf7\xc4\x87\x18\x9b\xac\x3b\xc6\x02\x6d\xab\x08\xc8\xbb\x77\xce\x89\xdd\xc1\xd0\xd2\x44\x6c\xe1\x56\x1c\xfb\x4f\x25\x96\xfa\xb5\xce\xf3\x73\x9d\x95\xc5\xed\xb9\xee\x9e\x07\x93\x56\x0d\xda\x94\x55\xbb\xf5\x4e\x5c\x16\x58\xca\x89\x8a\xec\x92\x00\xed\x3e\x7e\x5f\x76\xe5\xd1\x94\x47\x02\xb4\x67\x94\x58\x4e\xc5\xf8\x86\x72\xaa\xb1\xa0\x6d\x6c\xf7\x0e\xe9\x13\x26\xab\xd5\x15\x96\x3f\xe5\x29\x48\x47\x5f\x47\xf6\xe6\xcd\xb9\x9a\x3a\x8f\xb0\x34\x8d\x02\x04\xfa\x7c\xff\xb6\x5a\x3d\xec\xb7\xeb\x7f\xfb\x60\x23\x6d\xbf\x29\xc5\xb9\x03\xea\xdc\xa0\xd0\x7a\xd7\x2a\x1e\xdf\xf9\x34\x4d\x94\x4b\x33\x6f\x41\xe4\xe8\x4e\x8a\xa8\x85\x2b\xc7\x61\x96\xa6\x52\x22\x48\xc3\x15\x82\x36\x15\xd2\x64\x7d\x47\xcd\x9b\x08\xfa\xc1\x2a\x41\xa8\x11\x36\x56\xb3\xa2\x0d\x54\xf7\xed\xc6\x81\x82\x68\x68\xfe\x0d\xef\x2f\x28\xf0\xa1\x2d\x58\xe4\x5b\xa7\x10\xc0\x52\x21\x01\x39\x5e\x8b\x27\x2c\x14\xbe\x8d\x44\x54\x27\xb3\x54\x32\x3b\x4b\x6b\x2b\x4f\xfa\x2b\xbd\xf3\x4f\x90\x0a\xd3\x93\x0a\x0b\x03\xb2\x22\x57\xda\x31\x2e\xce\xf5\x60\x2d\x4d\xa5\x08\x85\x2d\x34\x5a\xe0\xd9\x5d\x59\xfd\xcf\xfa\xf5\xb7\xee\x68\x64\x1d\x20\xce\x15\x42\xc6\xd1\x76\xa5\x9b\x81\x8a\x48\x9d\x76\xa9\xe5\xb7\xb2\xaa\x61\xfb\x56\x42\xfc\x69\x0d\xef\xef\xfe\x3b\xfe\x19\x2a\xb1\x4d\x88\x03\x34\x37\x17\x4b\x03\x9e\x0e\xd0\xb8\x9e\x5b\xa8\xeb\xb5\xd4\x0a\x4b\x15\x37\x14\x63\xf3\x1f\x00\xa7\x07\x51\xcf\x10\x26\x52\x25\x82\x14\x7a\xd9\x12\x38\x25\xfe\x88\x96\x1a\x67\x81\x95\xcb\xe8\x04\xe1\x3e\x79\x94\x10\x04\xda\x46\x41\x3f\x77\xf0\xb3\x19\x5a\x6a\xb1\x14\xc2\x94\xa4\xbe\x7d\xfa\x3e\x10\xfc\x18\x5f\x2f\xa4\x56\x5c\xdc\x64\xef\x80\xfe\x94\x56\x4f\x69\x5d\x8c\xe1\x2e\xa9\x49\x63\x2a\xdc\xd6\x6d\x11\xde\xf9\xa2\x69\x46\x6c\x9f\x6e\x91\x35\xa0\x53\xbb\x3d\x3e\x8a\xba\x81\xea\xd9\x2c\xa1\x82\x63\x59\x5c\xdc\x0c\x76\x27\x15\x81\x4c\x11\xd5\x79\xbb\xd8\x2d\x86\x6f\x83\x20\xb1\x4c\xc2\x8e\x00\xb0\x5e\x3e\xb7\x2b\xe3\xd7\xea\x73\x4c\x10\x95\x20\x0a\xc9\xb1\xf6\xc8\x50\xfd\xac\x3d\xca\x11\x31\x30\xb4\x0a\x7b\x81\xba\xcc\xdf\x7b\x8b\x95\xd1\xed\x15\x21\x4f\x03\xeb\x03\x24\x6e\x2e\x33\xf8\xef\x76\x00\x73\xb7\xf8\x4b\x79\x8d\x36\x70\xd7\xd1\x40\xa5\xd9\xea\x67\xef\x45\xd3\x94\xd6\x5d\xb7\xde\x9f\xa0\xda\x7f\x40\xe6\xaf\x36\x22\x01\x9e\xfa\x54\x66\x45\x53\x0f\xe4\x7e\xda\x43\x3c\x1d\x6a\xc2\x6e\x21\x07\x35\xc9\x59\x44\x44\x2d\xeb\x33\x47\x9c\xf3\x55\x91\x61\x72\x75\x5c\x4a\x82\xdd\x4c\xd1\x80\x4d\x18\xf4\x98\xe1\x30\xda\xb7\x44\x94\x46\xc4\xca\xfc\x79\x0d\x8f\xc9\xb7\xc7\x8c\x04\xbd\xa3\xfe\x55\xe0\xf1\xf5\x63\x4c\xb8\x95\x7f\xfd\xfd\xac\xcb\x7a\x53\x7a\x97\x74\x1f\x27\x8a\x24\x25\x48\x66\x82\xba\xc9\x8e\x13\xb9\x78\x26\x12\x01\x78\x6d\xdd\xdd\x71\x18\xcc\x36\xaa\xfe\x7b\x28\x41\x91\x18\x89\x0b\x15\x42\xa9\x07\x50\x20\xd1\xde\x53\x2f\x2b\x33\x70\xe1\x63\x82\xca\xd4\xf0\x4e\x5f\xde\x27\x44\xd7\x0d\xc6\x69\xac\x2e\xa8\x8e\x2d\x1d\xb6\xaf\x47\xf8\x73\xb2\x20\x45\x4f\xda\x07\x78\xcf\x44\xf3\x36\x92\x50\x60\x82\xc5\x06\x4b\xe0\x9d\x22\xbb\x9b\x59\x9b\xbc\x6c\x56\xc7\x53\x56\x01\x9a\xf2\x4c\x26\x6c\xbb\xe7\xca\xee\xb5\x6a\x83\x52\x9b\xc3\xcc\xa1\x41\x04\x93\x0c\xa7\x90\x81\xfe\x87\x32\x13\xe2\x2a\xfd\xb8\xf6\x40\x39\xc1\x9d\xcc\xb6\xbd\x8e\xa1\x8e\xd4\x0c\x76\x58\xa4\x84\x61\xd9\xe1\x79\xbb\x18\xc2\xed\x44\x1a\x5a\x89\xd5\xd7\x22\x7b\x87\xaa\x03\xf7\x0a\x41\xa8\x67\x0d\xac\x55\x79\x9b\xd5\xc3\xea\x92\x10\xcc\x20\x39\x27\xab\x1d\xc6\xa5\x06\xfd\x28\x7e\x4c\x97\x6d\x21\xb9\x41\xc9\xaf\xa2\x6c\x32\x73\x71\x9c\xfc\x5f\x6c\x0d\xfe\xa3\xa9\x56\xde\x85\x6d\xd3\xc9\xfe\x30\xa1\x78\xe8\x2d\x11\x37\x6d\x98\x8b\xf1\xcb\xb3\x99\x7c\xb1\x4a\x2d\xf6\xf0\x05\x9a\x2a\x83\x77\x98\x5f\x68\xb4\x89\xb0\xac\xf5\x26\xea\x17\x30\x58\xce\xf3\x5f\x03\x11\x41\xd8\xf4\x2d\x1c\xb7\x59\xf1\xf6\x47\x06\xde\x02\xa6\x1f\x12\xdb\x4f\xdf\x40\xf3\x8c\x72\x7a\x7f\x70\x9f\x3a\x08\x93\xd8\xe8\x6b\xf1\xf4\x67\x33\x9c\x3e\xc6\x30\xea\x42\x2f\xcb\xa1\x58\xb4\x6f\x72\x9b\x6d\x0d\x13\x61\x19\x24\x2c\xb6\x0b\xf9\x32\x17\x75\xed\xad\xf0\x99\x0c\x18\xb7\xbb\x81\x2a\x7b\xa9\xe1\xef\x90\xcd\x2f\x30\x32\x10\xca\xea\xaf\x58\x6e\xd2\x0e\xc4\x71\xea\x31\xc1\x64\x60\xac\x1b\x44\x9b\x89\xda\x71\x57\x6a\x9a\x4c\x46\x71\xca\xac\xd6\x99\x9d\x26\xa3\x1c\x44\xc6\x2c\xc1\x0d\x71\xfb\x7c\xb7\xdb\x2f\x17\x9b\xc5\x72\xed\x75\xd3\xdb\x38\x95\xd3\xc8\xee\x96\xb2\xdb\x16\x64\x6c\x6c\x89\x63\xfd\xb8\xc3\x3e\x91\xff\x7b\x12\x13\xdc\x4c\xbc\xf8\x59\x7d\x57\xce\x72\xa6\x99\x4c\xb4\x02\xac\xa7\xde\x6e\xfc\x87\x29\x58\x79\x46\x28\x0e\x95\x78\x87\x5b\x30\xa8\x87\x31\x51\x0c\x19\xae\x5b\x92\x49\x83\x6c\xde\x5d\x96\x83\xb7\x25\x1d\xdd\x43\x9e\x32\xcf\xbf\x5e\x1c\x90\x2d\x74\x6d\xce\xc2\x24\x57\x02\xc3\x71\xb4\x0e\xd3\xab\xe6\x6d\x71\xec\x7e\x2a\xd7\x12\xeb\x95\x2e\xca\xfd\x03\x2a\x9d\xa9\xe6\x5a\x3a\x83\xc9\x94\x25\x54\xfa\x86\x0b\x82\x05\x10\x7b\x22\x9b\x7d\x6e\xa1\x06\xdb\xb3\x67\xdd\x48\x41\x24\x7a\x27\xde\x9d\x0e\x4a\xbd\x0d\x49\x55\x73\x3f\x53\x50\x8e\x50\x4b\x2f\xc5\xec\xcf\x22\xc3\x10\x8b\xb8\xcb\xd7\x65\xff\x27\x27\x30\xd3\xcd\x94\x6b\x11\x70\x26\x75\xa0\x51\xb2\xe0\xad\xfc\x78\x14\xc5\xe5\xee\xac\x7e\xd4\xf7\xd9\xfb\x20\xf3\x1a\xfc\x2e\x4d\x38\x75\xc5\x8c\x6f\x6d\xac\x03\x7a\x75\x38\xfc\x76\xbe\x92\x51\x65\x52\x33\xee\x9a\xe7\xaa\x2c\x74\xbd\xcb\x8e\x23\xdd\x67\x26\xb5\x22\x88\x72\xf9\x80\xcc\x8a\xe3\x0e\x8e\xa4\xa9\xbc\x76\xc4\x73\x47\x21\xb0\xed\xdf\xd5\xbf\x7d\x47\xf2\x6f\xd2\x2f\x25\xf0\x10\xe1\xb7\xfd\xbd\x57\x01\xb7\xc4\x30\x7c\x4e\x43\x6e\x79\xdd\x8d\x10\x09\xfa\xed\x74\xae\x9d\xe7\x5f\x80\xf3\xce\x3d\x48\x43\x45\x81\x40\xf4\x05\xea\x1c\xed\xfd\x29\xa3\x38\x41\xf5\xcc\xfa\x04\x2a\x13\xb9\x63\x44\xba\x77\x63\xaa\xcf\xca\x54\x94\x58\xda\x9b\x13\x4a\x87\x6a\x92\xcc\xaa\x28\x0d\xb0\xf7\x8c\xb2\x3c\xfb\x36\x3e\xfc\x6d\xd8\xcf\x51\x91\x4e\x30\x0c\x93\xe7\xcb\x22\xbf\xde\xc3\x87\xf7\x48\xc5\x51\x80\xd5\xaa\x37\x51\xbf\x41\x3d\xc8\x8a\x55\x1c\xf3\xc0\x93\x44\x1f\xcb\xa2\x8d\x00\x71\x4d\x5b\x0e\xb9\x68\x2a\x61\x0c\x6b\x13\xed\x36\x96\x15\x87\x9b\xf2\x7c\x78\x6b\x3e\xb3\x1b\xfd\x3a\x99\x50\x34\x04\xdd\x07\x41\xaf\x45\xa6\xca\xca\x72\x42\xd7\x85\xe5\x0b\xfb\x81\x46\x61\xab\xfc\x41\x14\x3a\x2f\x2b\xdd\x1b\xe1\xcc\xfe\x46\x16\xa7\xf1\x80\xc2\x07\x55\x73\x71\xae\x18\x08\x8f\x19\xdd\x3b\x96\xa4\x68\xcf\x71\xb4\x72\xed\xeb\x7a\xec\xde\xca\x14\xd7\x21\x86\x4b\xa0\xde\xca\x39\x10\x9a\xe2\x86\x20\xa1\x6b\xb1\x3e\xb4\x51\x88\x9d\xac\xff\x47\x78\xbb\x3b\x95\x10\x96\xc7\x80\xb2\x9d\xa7\xc9\x2c\x90\x91\x42\x12\x50\xaf\x65\xba\xcd\xcb\x66\xe0\x36\xf0\xc9\x49\x15\x63\x94\x0c\x80\x9c\x0e\xb7\x3a\x56\xaf\x69\x87\x29\xa4\x01\x4b\x51\x14\xa0\x11\x4f\x3f\x69\xfc\x28\x90\x41\xe2\xda\x01\x77\xd9\x4f\x2b\x45\xe7\x0f\x19\x96\x92\x81\xfb\xc5\xe8\x41\xeb\x20\x88\x65\xe4\xfa\x21\x2f\x90\x8b\xcb\xf2\x71\xb9\x9b\xe3\xb2\x8d\x2b\x66\x3a\x08\x03\xe4\x11\xca\x2a\x93\xfe\x42\x75\x10\x5b\x6d\xda\xc6\x2a\xd7\x81\x73\x62\x43\xae\x4b\xdf\x39\xd0\x41\x12\x47\xf1\xa8\x82\x8d\x8c\x47\x04\xa2\xf9\x87\xab\x09\xd8\x0e\x66\x0d\xcd\xb3\x31\xc8\x2c\x1a\xbf\xad\x93\x1f\x12\xd2\x18\xf3\x36\xec\x86\x18\xdf\x7a\xf5\x07\x75\x94\xb8\x8a\xff\xcd\xf3\x66\x3b\x7f\x86\x28\x8a\x91\xd7\x3d\xec\xd4\xdb\x00\xa1\xbf\xaa\x28\x8e\x30\x87\xee\xe9\x76\xce\x9a\xbf\x7d\xd7\x36\x15\x0c\xcc\x68\xfc\x27\x92\x04\x3b\x61\xa3\x7b\xf2\x88\xd1\x6b\x1b\x05\x0c\x2e\x32\xa2\x89\x06\xaf\x7e\xbd\x47\x7a\xfd\x5b\x79\xda\x36\x65\x05\x2f\x2e\xef\x9b\xcf\xa5\x75\x04\x0a\x05\x5b\xff\x7d\x63\x35\xed\x44\xd6\x35\x3b\x74\x9c\xd8\x55\x65\x80\x65\x29\x3f\x40\xef\x3f\xc3\xfe\x8e\xa7\xa8\x8e\x39\x0d\xbb\x9b\xe2\x9e\xe3\x6b\xd1\x43\x82\x74\x6c\x14\xd2\xfd\x16\xf9\xe9\xcd\x77\xec\x35\xa3\x14\x03\xcc\x6c\x06\x33\x35\xcc\x21\x34\x67\x14\x5f\xab\xfb\x3f\x76\x28\xd9\x68\xeb\x4b\x1d\x36\x40\xa7\x9a\x19\xe5\x8b\x1a\x38\xff\xe6\xbb\x10\x3a\x35\x46\x93\x41\x86\xbc\x44\x99\xcd\xd1\xfb\x37\xd5\xf5\xd0\x82\x07\x8e\x2a\xbc\x6f\xca\xd3\xfe\x13\x5c\x81\x16\xae\xe2\x71\x80\xe6\xf5\x34\x2c\x82\x6b\xa1\x28\xf3\x71\xf4\xf3\xf3\x83\x55\xe0\xe4\xdd\x51\x13\xf8\x12\xe1\x6a\xf7\xcd\xbd\xd3\xeb\x5e\x0f\x46\xcb\x80\x05\x91\x8b\x50\x41\x8c\xec\xfd\x98\x96\x24\x44\x5f\x14\x4c\xd6\xbc\x2b\x8c\x3f\x26\x05\x1e\xd3\x90\x43\x03\x8f\x17\x34\x7d\x99\x20\x88\xb4\x8a\x09\x42\xd0\x3b\xdf\x74\xeb\x5d\x31\x99\xf4\x2a\x96\x24\xf6\x52\xf0\x00\xfa\xe6\x7c\x3c\x0d\x0a\x5f\xba\x8d\x3a\x64\xa7\xcf\x7b\xcd\x6c\x1b\x2d\xb8\x5a\x27\x1a\xb7\x8d\x53\x99\xf5\x92\x8a\xb6\xd7\xec\x31\x4f\x3f\x66\xec\x14\x99\x06\x12\xe1\x92\x50\x89\x42\x13\xfa\xdb\x2c\x52\xc2\x0f\xe5\x31\xa2\x08\xec\xd6\x74\xdf\x23\x39\xfe\x31\xc6\xdc\xfe\xe7\xaf\x4f\x20\x66\x5f\xaf\xf4\xda\x04\x81\x15\x48\xb4\x00\xd6\x99\x3a\x99\x36\x31\xc7\x97\x42\x9e\x2f\xfb\x53\x2e\x8a\x2e\x22\xd7\x86\xaa\xc0\x73\x88\x2c\x98\x60\x39\xb9\xe1\x46\x31\x2f\xd6\xbc\x2e\xde\x33\x0b\xd0\xea\x9c\x4b\xec\x20\x08\x92\x24\x75\xeb\xd5\xef\x7f\x2e\xbd\x6e\xc3\xe8\x44\x10\x40\x88\x63\x0a\x07\x70\xae\x07\xca\x0f\x40\x42\xd1\x7b\xd2\xde\x97\x22\x47\x66\xe9\xf8\x67\x00\x49\xc2\xb8\x43\x7b\xb7\xc9\xff\xf4\x38\x35\x78\xdc\xa5\xe7\xd8\x04\x5e\xab\x72\xe8\xeb\xc1\x20\x8c\xa9\xb0\x0e\x58\xcf\x85\xef\x90\x8f\x4f\x13\xa6\x80\x1d\xab\x9b\xfc\x0c\xdf\xb2\x3c\x7f\x1c\xd6\xd8\x21\x09\x0c\x56\x44\xc4\x87\xa8\x34\x32\x32\xea\xee\x50\x44\x70\xdf\x33\xa0\xde\xfe\x28\xd1\x04\x6a\x24\x4d\x3c\xbb\x62\x41\xc2\x43\x74\xe0\x7e\x28\x0f\x16\x8a\x54\xaf\x90\xf4\x37\xe9\xb0\x42\xc2\x25\x96\x08\xee\xf3\xf2\x63\x48\x53\x01\x2a\x43\xa4\xde\x58\xf9\xc3\xa5\xb5\xbd\x99\x9b\x33\x7c\xbe\x9b\x04\x14\x82\xc8\x91\x3f\xbc\xcb\xd2\xa6\x9a\x6c\xbc\xc0\x04\x8b\x3a\x4c\x67\x74\xef\xbf\x9c\x87\xa1\xe4\x9d\xf9\xee\x8f\x4f\x13\xfd\xe1\x6b\x07\x9c\x29\x8c\xae\xb1\xea\x6b\x67\xcb\xdf\xab\x10\x00\x57\xdd\xda\x76\x03\xcd\x38\x23\x85\x34\x0c\x91\x01\xb9\x5b\xbd\x3c\x6e\xf7\x8b\xa7\xdb\xfd\xf2\xf9\xe9\x76\xbd\x5b\x3f\xfb\xd2\x07\xa4\x71\x12\xa6\x3e\x29\xa9\xf4\x52\x9c\xae\x34\x1c\xba\x91\x96\x5d\xb7\x13\x3f\xa0\xb2\xfb\xa5\x25\xee\xfe\xad\xba\x16\xa4\xc2\xe0\x6b\xb3\xae\xc7\x8c\xdc\xf1\x4d\x4d\x41\x4a\x97\x67\xae\x50\x75\xec\xb7\x6e\x31\x70\x23\x44\x40\x82\x21\xb4\xb3\x4d\xe5\x5f\xae\x49\x24\x93\x6f\x17\xc4\x50\xd7\x39\xe9\x73\x7f\xdc\x0a\xfa\x69\x23\xa9\xad\xe7\x3c\x64\xff\x7b\xce\xf4\xf6\x43\x8c\x74\xc2\x40\xea\x00\x91\x8c\x1f\x5e\xff\x68\xf6\x2b\xbb\x7b\xaf\x22\xdb\x52\xa8\x7d\x6b\xed\xd9\xbc\xd6\xb0\xeb\xfc\x75\xfc\x69\x15\x4b\x98\xf1\xac\x60\x54\x57\x5b\x4f\x5f\x63\x1d\x4a\x4c\xa3\x1a\xa7\xc9\x82\x5e\xc0\xfe\x18\x4f\x11\x6e\x75\x93\x35\xed\x82\xbd\xe9\xc0\xe8\xa0\x21\x0e\xdb\xa5\xfc\xfb\x9b\xc8\xe1\xbb\x18\xfc\x50\x20\x1c\xfb\xca\x03\xd1\x86\x31\xa6\x0a\x20\x02\x2d\x87\xf5\x07\x77\x97\x2d\xa1\x64\xfc\xc8\x8c\x88\x52\x2b\x39\x79\x39\x35\xe5\x4b\x79\x84\x51\xe9\xdb\x04\x91\xed\xe1\x9f\x44\x91\xa9\x9b\x73\xd3\x94\x43\x89\x26\x13\x18\xcb\xb5\x6c\x37\x95\xac\x38\xdc\x4e\xd9\xca\x86\x44\x09\x46\x6c\x1b\x71\xd9\x94\x65\xbe\x6a\x23\xed\x42\xc1\x1d\x8c\x6b\xaf\x86\x44\x46\x3b\xed\xb3\x77\x11\xfa\x6f\x27\x22\x46\xa1\x3e\x71\xc2\x62\xf6\xf8\xda\x0d\x01\x66\xbc\x3e\x5f\x35\xb6\xfd\x66\x26\xa4\x0c\x93\x6c\xdb\x55\x9c\x3a\x85\x31\x13\x4a\xf0\xe1\x81\xef\xd7\xb5\x8b\x5c\x75\x0d\x3d\x30\x21\x08\x94\xd5\x15\x5a\x0f\x3b\x32\xbf\x2c\xd1\x9a\x28\x92\xd8\x6b\x5d\xbd\xc3\x40\xb1\x9e\x99\x28\xb6\x9e\x24\x9d\x18\x17\x68\x2b\xcc\x3d\x28\xe5\x5e\x17\x40\x4d\xa4\x9c\x86\x04\xd4\xcd\xda\x59\xaa\xd9\xe8\xe2\xb5\x6e\x6f\xbe\x05\x35\xe8\x49\xdb\xdb\xc4\x21\x47\x75\x22\xec\xcd\xfa\xdc\x66\x7c\x27\xe3\xd8\x3a\x4b\x28\x51\x37\x28\xe2\x3c\xda\xf9\xc7\xeb\xab\x89\x29\x60\xfd\xb8\x4d\x0c\xed\xfc\xba\x41\xe2\xf5\xec\x7e\x60\x62\x15\x20\x2e\x53\x14\xea\xad\xac\xee\x45\x3d\x24\x52\x9b\x58\x1b\xb0\x80\xcb\x5a\x18\xf8\x5e\x65\x0d\x60\xa0\xf9\xdb\x4c\xb4\x6a\x92\xc0\x24\x56\x07\xa2\xcd\xd0\x7f\x1b\xfc\x55\x22\x26\xe0\x70\xc8\xee\xaa\xab\xb2\x89\x49\x22\x82\xdf\xb1\x17\x5a\x7f\x2b\x73\xb4\x3e\xb2\x2d\xfe\xb0\x1b\x11\x63\x18\x7c\x93\x97\xca\x94\xd5\x71\x72\x77\x92\x36\x67\xb2\x3d\x8e\xaa\x71\xda\x18\x03\x15\x09\xc3\x48\x42\xda\x2b\x78\xdc\x6d\x86\x6b\x8e\x61\x2a\xc6\x92\xe2\xa9\xfc\xe8\x66\x34\x0f\x04\x06\xbd\x96\xad\xf2\xb8\x7a\xc2\x62\xe3\x7e\xbd\x7c\xde\x6f\xbe\x2d\xb6\xab\xfd\xf3\xd3\x6a\xbf\x79\x7e\x7d\xba\xdd\x76\x1f\x89\x42\x5c\xd9\x8e\x65\x81\x9c\xb3\xc9\xd2\x6e\x38\xd5\x88\x3a\x3c\x64\xef\x70\x3e\xdd\x64\x93\x05\xc8\xa4\x41\x14\xbb\x99\x3e\x50\x84\xed\x1e\x67\x1a\xc7\x28\x3b\x80\x65\xbf\x1b\x5f\x59\x30\x22\x8a\x90\x54\xb1\xfa\x63\x54\x6d\x37\x32\x24\x98\xec\xbc\x8b\xfc\x0c\x3d\xee\x6f\x7a\x51\x92\x01\x5a\xef\xea\x21\x89\x65\x84\xb6\x31\x52\x47\xe8\xf1\x81\x0c\x25\x67\xde\xe9\x0f\x81\x4a\x3b\xd4\xf6\x4e\xfc\xec\x32\x40\xa3\x92\x04\x79\xa6\xed\x8f\x9d\xd2\xb7\x47\x0b\x8a\x4a\x09\x44\x7d\xfc\xfd\xbd\xac\xdb\xf5\x67\x57\xa2\x9d\xb2\x1f\x23\x59\xcc\x9c\xdf\x0d\x56\x70\x47\x8f\x4f\x49\xe6\x5a\x74\x88\xa7\xbe\x83\x81\xf2\xfe\x64\x86\xe8\x30\xc1\x52\x7b\x17\xec\x0f\x52\xf8\xc9\x48\x4a\x5c\x42\xf7\x03\x8a\x17\xd1\x00\xf1\x0d\x5c\xa3\x29\x47\x64\x5d\x7f\x92\x71\xc5\x7f\x72\x26\x13\x5a\x95\x01\x4f\xa9\x5f\x3e\x3f\xed\x5e\x16\x4b\x8f\xf3\x31\x86\x26\x08\x11\xba\x39\x1f\xb2\x7a\xdf\x0b\xd9\xe3\x61\x1e\x04\xc2\x72\x53\x10\x5b\x79\x2f\x1a\xf8\x10\x97\xee\x98\x0e\x84\xa7\x99\x7a\x97\xd1\xfd\xa0\x7b\xc2\x03\x12\x47\xd8\x48\x2c\xab\xec\x90\x15\x22\x1f\x81\x33\x79\x40\x94\x95\xc7\xbf\x2b\x4b\x9d\x41\x9f\x8b\xf0\x80\x80\xcd\x38\x97\x79\x79\xd6\x57\x51\xd2\x38\x93\x18\xfe\x5e\x1e\x84\x22\x16\x61\x67\xb3\x72\x0b\x22\x7f\x41\x78\xa2\x3f\xac\x23\xb7\xcd\x36\xce\x38\xa4\x5e\x1d\xb3\xa6\x2b\x1e\xf0\x20\x4a\x63\xdf\x72\xbd\xf2\xd7\x98\x29\x38\xf3\x20\x92\x4c\x47\xce\x3e\xda\x3d\xf7\x87\xcf\x22\x07\x3f\xf3\x79\x10\x19\x1e\x40\x27\x1b\x80\x14\xf5\x39\xe0\x03\x0f\xe2\x98\x87\xa2\x83\xc7\x0d\xd9\x5e\xe3\x97\x89\x07\xb1\xb0\xf6\x28\xde\xff\x79\x10\xeb\xfb\x11\x8a\x21\xad\xf2\x20\x8e\xb6\xef\x68\xf9\xb6\xee\x68\x12\x33\xe5\x32\x0d\xc4\x62\x16\x97\xe9\xd4\xba\x2a\x78\xf3\x80\x12\x6b\x1a\xd7\x64\x50\x85\xfe\x4c\x34\x0e\xed\x35\x37\xe2\x00\x43\xf3\x21\x1e\xb0\xc4\x92\xb1\x2d\x3e\x08\xa5\x27\xca\x0c\x21\xd8\x5d\x68\xc2\x03\x26\x84\xd4\x03\x8e\xcb\xec\xa6\xc1\x03\x6c\x0d\xd8\x44\xd6\x7f\x92\xd3\x50\x86\xbe\xed\x54\x34\x6f\x50\x67\xff\x05\xaf\x77\x37\xb9\x5f\x5c\x28\x6c\x88\xdc\xfe\xeb\xc9\x7f\x3c\x4d\x04\xb6\xa3\x8c\x52\x53\x39\x1c\x1e\xa4\xd2\x66\x62\x35\xda\x49\x1c\xc1\x79\xbf\x09\xd7\xe1\x70\x95\x7d\x1e\xa4\xca\x92\xdc\x75\xb9\x2e\xd0\x9b\xa1\x9b\x7d\x32\x89\xbd\xec\xdb\xa6\x02\x07\xb5\xd4\xab\x5d\xb9\x7b\x83\xc9\xc5\x49\x11\x59\x81\x42\xdb\xa8\x42\x28\xfd\x28\xf2\xe7\x81\x94\x86\xf1\xc1\xf3\x5e\xeb\x4e\x77\x63\x51\x68\x0b\x27\xf8\xaa\x6e\xc4\x03\x69\x82\xc0\x17\x6f\xf1\x29\xdd\x5c\x76\x70\x3c\xe5\x53\x00\x32\x0f\x14\xe5\x54\x0f\x00\x8d\xb8\x3d\x7b\x04\xcb\xfc\x0c\x57\x4c\xa0\x5a\xa4\x38\x37\x6f\x50\x34\x99\x12\xfd\x8d\xd0\x3c\x22\xb6\x7d\x65\x21\xed\xee\xcf\x90\x40\x1c\x3b\xe9\xf5\x0e\x1e\xf5\xb9\xc3\x19\x0f\x80\xdb\xcc\x48\x0e\xbd\xbb\x51\xbd\xb8\x9d\xbd\x57\xab\x6b\x5f\x28\x75\x9f\x37\x51\xc0\xad\x97\x9d\xfe\x86\x05\xfd\xc9\xcf\x36\x11\xc3\xb6\xe2\x7b\x06\x1f\x2f\xc2\xeb\xbd\x71\x42\x42\x8a\xf3\x64\x55\x55\x65\xf5\x50\x1e\xe6\x0a\x2d\x9c\x10\x4a\xb8\xa3\x61\x6c\x4f\x99\xa7\x10\x73\x42\x38\xb5\xe5\x9c\xec\x80\xf5\xb4\x42\xa3\x23\x0a\x54\xf5\xea\xf6\x75\x08\x59\xe5\x24\x64\x3c\x02\x8f\x06\xb3\x81\x1b\x0a\x88\xd4\x7e\x40\xe4\x54\x4e\x2a\xd0\x00\xc7\xe7\xaa\x7d\x93\x90\x2d\xba\x2b\x67\x3c\xb7\xfd\x87\x42\x1e\xf1\x4e\xfd\x13\x81\xa7\xee\x6b\x3f\x19\x2f\xba\x10\xfa\x7b\x56\xc0\x5a\xb7\xcf\xd3\x64\x50\x2d\xae\x96\x39\xff\x09\x09\x58\x74\x73\x55\x89\x7b\x71\x1c\xbb\xdf\x71\x12\x87\x36\xe4\x3f\x54\xa2\x68\xbc\xfb\xe3\x8c\x18\x3e\x27\xb1\xb0\x9c\x0c\x6c\x80\xf7\x11\x15\x27\xb1\x64\xd4\x95\xc5\x6e\xaa\x4c\x1f\xe0\x7b\xa6\x9b\x71\xfd\x84\x93\xa4\xdd\x4c\xda\xb0\xec\x43\x9c\x7c\x8d\xc6\x1f\x22\x1c\xc1\xc4\xdb\x6f\xdb\xc1\x96\xde\xfe\x3d\x8d\x2c\x4d\xca\xd9\xa4\x5a\xe2\x69\xd7\x37\xe8\xa6\x41\xe2\xe8\xf6\x4f\xab\xa7\xe5\x75\x09\x8a\x93\x44\x31\xe4\x44\xfd\x5e\x5e\x4a\xff\x19\x1a\x6b\x8c\xb3\xb7\xf7\xb7\xf5\xe8\x5b\x69\x62\x4d\x0c\x34\xa8\x3c\x2b\xd0\x10\xcd\x1f\xd1\x31\xc2\x26\xb3\xf6\x89\xba\xbf\xb1\x88\x20\xce\xd2\x51\x81\x7e\x25\x0b\xd4\x07\xc8\x9c\x30\x6e\xec\x47\xb5\xfe\x54\x1b\x80\x13\x66\x0c\x06\x06\xbe\x21\xbb\xf3\x9d\x5a\xab\xba\xdf\xae\x11\xd5\x04\xbc\xc8\x09\xa7\x09\xca\x94\x65\xb5\x45\xd7\xdd\x55\x00\xf8\xd4\xe7\x8b\xe2\x9c\x70\x9d\x06\xac\x93\xe5\xb5\xee\xc5\x73\xd6\xda\x6e\x78\x1a\x0b\x04\xce\xb4\x41\xfa\x13\x7c\xb8\x6d\x0a\x65\x32\xaa\xc9\xbb\x4b\x52\xae\x10\xe9\x6b\xad\xf6\xda\xe8\xf1\xbe\x2c\x5f\xa0\x06\x51\xa9\xb7\x36\xca\xf3\xb7\x32\x4d\x39\x6a\xe1\xda\x5a\xe5\x13\x7c\x6c\xca\x3c\xff\x4c\xe9\x7a\xf2\x1d\x60\xb5\x8f\xb6\xd9\xf1\x94\x3b\xa2\x97\x3f\xad\x08\xac\x72\xf0\xee\xe5\xf9\x69\xfd\xaf\xfb\xe7\x87\xdb\xee\x08\xb3\x24\xb4\x0e\x40\x1e\x75\x47\x24\x60\x69\xe4\xa5\x2c\x44\xae\xcb\x81\x54\x1b\x27\x02\x68\xda\x1b\x20\x60\xa2\x0e\xf3\xb8\x3d\x4e\x54\x48\x90\x21\xbc\x5d\xfd\xeb\xcf\xe5\xb3\x87\xd2\x70\xa2\x40\x39\x38\xcb\x50\x6a\xbe\x9f\xd0\x3a\x89\x63\xab\x76\x3c\x78\x4d\xb4\xa4\xf1\x28\x48\xb7\xe5\xd6\x45\xa1\xb1\x48\xf1\x65\x9c\x43\x00\x28\xca\x41\xe4\xa2\xb6\xd1\xc6\xfe\x3d\xf0\x27\x36\xb1\xc4\xd5\xfb\xe5\xe5\xe5\x79\xf4\x2a\x18\x48\x91\x60\x77\x7b\xf8\x79\x0b\xc7\x73\x55\x89\x03\x2c\x5d\x33\xa7\xbc\x46\x92\xce\xde\x83\x30\x08\xb8\xa7\x60\xac\x7e\x36\x50\xd4\x59\x59\x58\x19\x3b\x31\x50\x75\xf2\x83\x05\xc5\xe6\xa0\x12\xc5\x50\xf8\xcb\x1d\x25\x3c\x25\x56\x19\x1c\x81\x31\x4e\xb2\x63\x78\x9a\x7f\x4c\x3f\x60\x75\x4d\x6c\xc5\xae\x29\xab\x21\x78\x77\xb6\x9b\xcb\x43\x92\x72\x44\xd2\xd4\x27\x28\xc6\xda\xe3\xe3\x5b\x1a\x86\x21\x4f\xdc\xea\x8d\xbe\x66\xcf\xc5\xba\x68\x63\x09\x81\x7e\xa8\x5d\x4c\xd2\x07\x69\x61\xa8\x01\x73\xa8\x1f\xef\xcd\xf0\x3e\x87\x51\xc2\x78\x47\x78\xe8\x17\x97\x30\x4a\x29\xb8\x5d\xe7\xde\x86\x8a\x8d\x07\x0c\xf1\x30\xd2\x94\x0e\x51\x13\x63\xa6\x77\x7b\xdc\x60\xd0\xdf\x40\xdd\x6c\x3c\xf6\x9b\x87\x31\x51\x84\x76\xd5\xf2\xeb\xbd\xd9\xef\xc9\x61\xac\x39\x7e\xb9\x3c\x5f\x48\x10\xdc\x8a\xf2\xae\xac\xc8\xca\xc3\x4e\x79\x18\x83\xf0\x10\xda\x6f\xd9\xe1\xcd\xa2\xd0\xdc\x31\x4a\x65\xe8\xbd\xcc\x45\xef\x2d\xe1\x8e\x32\x6d\x03\xb3\xbd\x7d\x85\x6e\xff\x3f\xca\xde\xac\xb9\x71\x1c\xd9\x1e\xff\x3a\xfd\x70\x1f\xb8\x82\xc0\xa3\x2c\xcb\x55\x9e\xf6\x36\x96\xaa\xab\xe7\x7f\xe3\x86\x22\x01\x24\x64\x8e\x29\x52\x43\x52\x76\x79\x3e\xfd\x3f\x98\x00\xb8\x89\x76\xf7\x6f\x1e\xa6\x3a\x0c\x90\x22\x41\x2c\xb9\x9c\x3c\x07\xca\xd7\x4f\x2c\x5c\x77\x01\x0f\x90\xc9\x91\xd5\xd3\x1f\x01\x55\x3d\xbb\x35\x4f\x4c\xcc\x2e\x21\x19\x8b\xdb\x07\xbf\xd4\xae\x58\x76\x6d\xfc\xbd\xd3\xd4\x66\x62\xe1\x88\xd7\xf8\x86\x45\x75\xea\xcf\x6b\xdf\x45\xa6\x96\x4e\x19\xeb\xb7\x5c\xf5\x06\xef\xd5\x72\x15\x3c\x27\xce\x4a\x57\x34\x6d\x8b\xad\x17\xf0\x79\x3c\x12\x61\x48\xa9\xfb\xab\xf3\xc7\x43\xf5\x6e\xb5\x1a\xfe\x4e\xe1\x1b\x8f\x04\x4b\x60\x8c\x20\xbd\xa9\x6a\xf2\xa8\xa7\x4f\x21\x04\x90\x2a\x92\xdd\xf8\xb1\xd4\x63\xcc\x23\x8f\x84\xb6\x1c\xd1\xad\x47\x47\x3d\x96\x38\x9a\x07\x92\x19\x26\x16\x38\x13\xff\x63\x43\x43\xae\x97\x4a\x23\x35\xd6\x31\xec\x99\x05\xbf\x26\x9e\xe0\x91\x92\x8a\xfc\xc0\x73\x43\x42\x25\x38\x4b\xca\xf3\x48\x99\x00\x98\xfb\x2c\xb6\x7a\x63\xe6\x60\x44\x3a\x16\xc4\x88\x7a\x2a\xa0\x1c\x3b\x41\x91\x66\x01\xcd\xab\xf5\xf3\xe3\x76\x75\xfb\xbc\xff\xe3\xf1\xc7\xfa\x3b\x95\xe5\xdc\xae\x37\x7d\x27\x29\xe2\x81\x29\x7e\x8c\xbd\x71\xb9\x9d\xd9\x8f\x99\xc0\xab\xe1\x0d\x80\xb9\x65\x39\x4a\x1e\x61\x1a\x65\x4e\x07\xe7\x1b\xa1\x94\x29\xb1\xf4\x37\x41\x17\xfe\x1e\x8e\x09\x72\x41\x00\xfb\xff\x29\x99\xc7\x23\x93\x58\x6f\xa0\x3a\x79\xd1\x2b\xdf\xc0\x13\xf2\xd0\xdc\x82\x7d\x82\xa6\x39\x55\x75\x3b\x7b\x19\x03\x40\x50\x41\xeb\x4a\x2f\xd8\x61\x91\x51\x81\x30\xf4\xa8\x79\xf9\x47\x5e\xc0\x08\x73\xcb\x23\xa3\x39\x85\x38\x5e\x3f\xd4\xf2\x6a\x89\x83\xc0\x78\xa0\xfb\x7a\xf5\x38\xe1\x1c\xf7\xbb\x56\x1c\x44\xc2\xc3\x48\x7f\x34\x58\x97\x70\xc4\x4f\xf0\x7c\x3c\x0e\x44\x40\x30\x39\x20\x59\x95\xdb\xe3\xb1\xaa\x5b\x28\x9a\x5d\xe5\xd8\xbd\x27\x0f\x1f\x07\xca\x52\xc4\x92\x1d\x53\xe7\xcd\xab\xea\xcc\x7b\xbb\xfe\xfd\x34\x8f\xc3\xc0\x90\x25\xfa\x8e\xf9\x7d\x5e\xe6\xc7\xf3\xd1\xad\x68\xdf\x0e\x9c\x62\xcc\x57\xe7\xfa\x80\xf5\xef\x70\xca\xff\x0d\xbe\x2d\x62\x19\x25\xa6\x4e\x50\xb7\x13\xa9\x73\x1e\xc7\x61\x4c\xf9\xa0\xfb\xaa\xc6\xd5\xad\xff\x6b\x1a\xa4\x64\x10\x58\xc1\xd8\x47\x33\x7b\xe0\x34\x0e\x03\x6f\x96\x77\x27\xfe\x75\x45\x14\xfc\x4d\x0b\xc7\xd3\xac\x2b\x0b\x6c\x59\x89\x0b\x66\xfd\xb6\xc0\xc4\xc4\x63\x06\x4c\x47\xfd\xc9\x41\x32\x65\xcd\xd5\xb9\x78\x9d\x01\x60\x78\xff\x2d\x98\x8e\x49\x63\xe6\x1f\x70\x82\xf2\xad\x79\xaa\x8a\xc1\x75\x8b\x99\x41\xe6\xac\x5f\x4a\x94\xb7\xed\x28\x16\x3e\xfd\x4e\x19\x0b\xd3\xc4\xcb\x4e\xd0\x06\xe4\x08\x57\x67\x6f\x91\xa1\x70\xe1\x8a\xf6\x5b\x55\xad\xab\xa6\xbd\xa9\xea\x1f\xe5\x27\x09\xc9\xe1\x3a\x0e\x01\x21\x43\x41\x56\xe7\x76\xcc\x5c\xe3\xda\x21\x14\x44\x01\x22\xcf\x1f\x0e\xdc\xf5\x33\x6f\x5f\x36\x73\x17\x27\x96\x32\xea\x43\x44\x79\x59\xd5\x1b\x9d\xb7\xcd\x05\xb4\x95\xc7\xca\x84\xdc\xf8\xe7\x7c\x6b\x57\xa7\x93\x37\x86\x5c\x8c\x66\x32\xec\x18\x43\xea\x50\x71\xe4\xed\xcf\xf4\x6f\x78\x8c\x89\x74\xe4\x53\xf2\x98\xb7\xcf\x63\xc2\x9c\xe4\xff\x16\x9c\x6e\xf6\x7f\xb3\x83\x8f\xff\x6f\xe8\xff\xc4\x29\xa6\x34\x7c\xc9\x11\x3e\x60\xf8\xaf\xf1\x0d\xc3\xfe\x29\x04\x90\xd6\xc2\xa0\x9b\xd7\xdc\xd4\x4e\x4e\xd1\x9e\xd7\xaa\x0d\x7e\x3d\x60\xfb\x5e\xd5\xaf\x13\x70\x99\xbf\x01\x02\x59\xe3\xfe\x84\xb8\xc6\xb7\xe6\x25\x3f\xcd\x7a\x19\x16\x4a\x1b\xe5\x33\xe7\x52\x5b\x80\x77\x73\x5b\x3e\x57\xd5\xfc\xab\x19\xa5\x63\x47\x4a\x74\x07\x0d\x69\x42\x5d\x43\x4b\x54\x33\x9f\xec\x2f\x06\x13\x8a\x94\xf8\x27\xa0\xa7\xa4\xd0\xca\xf8\x41\x2e\x2e\x62\xda\x81\x18\xd6\x58\xb6\xcd\x13\xd6\xf7\x55\x39\x9f\x1b\x49\x10\x33\x31\xd2\x08\xb1\x87\xf8\xb4\x87\x66\x14\x14\x3c\x97\xaf\x65\xf5\x5e\x7a\x78\x9b\x5b\x2f\x49\xc8\xe2\xc4\x99\x5b\xd2\x59\x55\x67\x2f\x4d\x3e\x65\x5a\xe4\x49\x28\x38\xd5\xb1\xb7\xf0\x51\x54\x63\x76\x70\x9e\x44\x61\x62\x03\x02\x54\x18\xe0\x0e\xfa\xc1\x44\x4d\x22\x95\x12\x8d\xcb\x09\xdb\x11\xf3\xea\xf4\x5d\x62\xa6\x48\xd5\xd1\x8f\x93\x87\xd6\x5e\xd8\xd2\x49\x77\xf0\xb2\x1e\x12\xba\x6f\x6b\x0f\xab\xe7\x49\x92\x44\x64\xbe\x6e\xb6\xbb\xaf\xc2\xba\x49\x82\xa1\xf2\xf8\x37\x82\x29\x2d\xe5\xc4\x78\x92\x3a\xd6\xa7\x1e\xd2\x04\x9f\xae\xfa\xaf\x4f\xc1\x24\x0b\x43\x65\x05\x1d\x9b\x16\xb5\xdb\xbe\xa7\x3f\x96\x85\x16\xb9\x03\xed\x0b\x96\x39\xf8\x04\x33\x4f\x32\x1e\x64\x36\xe0\x5a\x9d\xbe\xc1\xf1\x1b\x4e\xec\xfc\x24\xe3\x80\x59\xbf\x41\x74\x4f\xb9\xb8\xe1\x25\x22\xd5\x6c\x18\x36\x2b\xb1\x38\x7d\x48\x91\x89\xc4\x71\x8f\x75\x53\x61\x5b\x9d\x6b\x85\xb3\x53\x6e\xf6\x2d\x80\x25\x9e\x83\x87\xce\x5d\x07\x35\x9c\xdd\x18\x4c\xa0\xb1\x7f\xc4\xee\x00\x3b\x5d\x20\x90\x78\x22\xc3\x98\x50\x2a\xa6\x2a\x8a\xea\x7d\xde\x28\x2c\xf5\xe3\xe9\x5c\x14\xbb\x17\xec\x0e\x0a\xef\xc3\x26\x12\x80\xd8\x73\x09\x68\x1c\xd2\x73\x0c\x72\x39\x3c\x91\x32\x0b\xe4\xe0\x37\xec\xc3\xac\x6f\x31\x40\x45\xc7\xbd\x54\xdb\x6d\xa9\x73\x35\x63\x5c\xe1\x89\x8a\xe3\x38\x75\x1e\x62\x5e\xa3\x1e\x52\x40\xbe\x43\x92\xd0\x2f\x5c\xdf\x6e\x77\xcf\xb7\x57\x3f\x48\x27\x60\x20\x35\xec\x3a\xe8\xc8\x56\x8f\xd1\xfa\xbb\x41\x6c\x6e\xcb\xab\xd3\xfc\x87\x74\x20\xc3\xc8\x6f\x77\x57\x1f\x4f\x75\x55\x99\xdf\x96\x36\xcb\xe9\xd8\x68\x29\x08\xa2\x37\x22\x75\x98\xe5\xba\x79\xa2\xb5\x2d\xe5\xf8\xc7\xfd\x7e\xb3\xfb\xbe\x9f\xe8\xe1\xb8\x2e\x18\x24\xca\x59\x42\x50\x1f\xf6\xd1\xec\x0e\x18\x49\xaa\x28\xbe\x7f\xb8\x1b\x65\x03\x79\x82\xa9\x2d\xc8\x1e\xc4\xe9\xe6\x94\x0e\xae\xa3\x49\xb9\xd5\x4f\x73\xf3\xd3\x5a\x18\x7d\x2b\x20\x41\x76\x5e\xa0\x79\xa1\xd9\xd7\xd6\x23\xa7\x62\x86\x2c\xb3\xd7\xa4\x41\x6c\x88\x3d\x6a\xa5\xff\x7d\x6e\xda\xeb\xdc\x98\x5c\x9d\x8b\x19\x0e\x8f\xa7\x21\x0b\x98\x5b\xed\x37\x88\xa3\xe8\x50\x1a\x29\x1b\xa7\x94\x64\x9b\x35\xbb\xbc\x28\xac\x99\xb6\xae\xaa\x42\x57\xef\x7e\x91\xa5\x31\xe3\x91\x22\xe1\xe1\x8f\xc9\x41\xda\x35\xf8\x38\xfd\xe3\xfb\x25\x89\xa2\xeb\x95\x48\x15\xb9\x05\xf0\x63\x7b\x3d\x7b\xbc\x34\xb6\x94\x7f\x76\x61\xfe\x8e\x97\x98\xe5\xe5\x9b\xa6\x4c\xc5\x30\x1a\x4f\xee\x31\xb7\x3e\x55\x93\xa6\x19\x23\xac\xb7\x2b\xd9\xd8\xe2\x4c\xbe\xca\x77\x93\x96\x57\xe1\x1b\xb6\x9b\x46\xd5\xd5\xfb\x43\xe5\x22\xc0\x93\x0f\x98\xa6\xca\xd0\x61\xfa\x54\x57\xbf\x3e\x2e\x04\x2e\x78\x9a\x6a\xa5\x7b\xc6\xc6\xee\x99\xea\x6e\x1b\xdb\xcb\x8f\x7d\x7e\x51\xfe\xc8\xd3\xd4\xc4\x34\x26\xaf\xf8\xd1\x3c\xa3\x9a\xb5\x66\x22\xa1\x1d\xfa\x7e\xf5\x6d\xf3\x70\xbd\xfa\xe3\xd6\x07\xd8\x52\x91\x59\xe1\x3a\x38\x9d\xb0\xd4\xbf\xa3\x2b\x64\x59\x4a\x21\xa4\x42\x33\xa2\x02\xaa\x41\xa9\xaa\x68\xe1\x1e\x9b\x06\x0e\x07\x9f\x51\x4a\x41\x5a\x7c\x55\xaf\xe9\x3b\xe4\xa9\x52\x40\xc6\x1c\x92\xa9\x27\x3e\x2f\xcb\xca\xc2\x05\x67\x2b\x37\x05\x13\x2a\x7f\x60\xbf\x40\x5e\x3e\xd5\xf8\x36\xeb\xa2\x02\xa4\x52\xb0\x1e\x7e\x74\x4f\x02\x18\xcb\x87\x5c\xaa\xb4\xe5\x92\x6b\x0f\x93\x5a\x66\x9e\x6a\x6e\x81\x89\x16\x15\x37\xa7\x2d\xe1\xa9\x36\xb1\xa5\x11\x70\xe2\xa2\x8e\xf4\x7c\x36\xbc\x18\x65\x04\x7d\xe9\xfc\xeb\xed\x59\x8e\xc0\x22\x3c\x45\x81\xf4\x61\xba\xd3\xe4\xe1\x66\x37\xbb\xbf\x01\x4c\xdc\x9b\x5e\x61\x4b\xa9\xe3\xd9\xbd\x8d\xe4\xe4\x3b\x5b\x29\x8e\x78\x7f\xbf\xfa\x73\xbd\x7a\xfa\xad\x6f\x45\x42\xb0\xb8\x1a\x89\x9e\x9b\xdd\x02\x68\x7d\x27\x84\x54\x79\x7e\xee\x75\x91\xbb\xd8\xbe\x9f\x89\x2c\x8c\x19\x0d\x02\x1c\xb0\x6c\xa7\xb3\x94\x85\x2c\x24\xa8\xc6\x5d\x75\xb8\xc6\xa6\xad\xab\xd9\x76\xc0\x42\xc4\x80\x7b\xdd\xa5\xab\xf3\xc7\x1a\xea\x25\x94\xb2\xdf\x65\x58\xc4\xa3\xc8\xd9\xca\xdf\xab\xd9\xbd\x22\xec\x83\x69\x9b\x37\x28\xce\x34\x39\x5c\xb6\xcd\x3a\xde\x58\xdf\x5e\xff\x36\xbd\x1f\x5a\xf2\x52\xcb\x2f\x76\x95\xb7\xc7\x9e\x73\x98\xb3\x38\x48\x30\x19\xb0\xaf\x9d\xb5\xfb\xad\xe7\x52\xe0\x2c\x4e\x62\x8a\x1b\xf4\xb9\xfc\x69\xf9\xcf\x79\x6c\xb7\x4d\x67\x14\xa3\x60\xef\x48\xfe\xda\xc6\x79\xa7\x63\x97\x24\xa9\xcf\x1d\xad\xb4\x9d\x38\x97\x58\x61\xce\x12\x21\x23\x57\xd8\x57\x95\x4d\x5b\x9f\x55\x4b\xb4\x70\xbd\x61\xc9\x52\x69\x68\x6f\xfa\x77\x95\x97\xce\x3c\xef\xfd\x07\x47\xd4\xc5\x19\x43\x45\xfc\xb5\x24\x54\xe0\x0f\xaf\x05\x2b\x9e\x65\x81\xa2\xaa\x27\x2f\xa8\xba\x87\xe9\x63\x67\x49\x48\x45\xa4\x55\xb9\x3d\xcb\x07\x7c\x5f\xce\x74\xb1\x8c\x59\x0a\xbc\xbe\xb8\xb7\xac\xde\x4d\x01\xaf\x3e\x7b\xd5\x0d\xf6\x1f\x39\x7c\x82\xb9\xf8\x14\xe4\xc5\x19\x17\x11\x79\xba\x58\xea\xdb\xf5\xe3\xb6\x85\x03\xfa\xa8\x3f\xe3\x22\xa3\x68\xcc\x4d\xfe\xeb\x0a\xdb\x90\xf9\xbf\x8b\x48\x01\xeb\x55\x55\xfb\x90\xf3\x28\xfc\xc3\x7d\xcf\x24\xf4\x44\x53\xd7\x79\x73\x3a\x3b\x81\xe4\x91\x89\xc3\x04\x5a\x31\x97\x1f\xdb\xcd\x6c\x68\x84\x31\x84\xd5\x2e\xf1\xfd\xb6\xc5\xb1\xea\x1e\x67\xc0\x12\xf2\x96\xff\x79\x3d\x36\x28\x99\x4c\x0d\x19\x94\x80\x85\xb9\xc6\x37\x0f\xa0\xf5\xcd\x2a\x05\xaa\xa1\xbc\xab\x0e\x37\x88\xbb\xea\xf4\x63\xe6\xf8\x33\xc5\x84\x53\x73\x6d\xd7\x2e\xe4\x3e\x38\x03\x4c\x41\xe2\xb1\x63\x2e\xc5\x63\x37\x70\xd7\xac\xb5\x7d\xa8\xab\xdd\xef\xfe\x4f\x18\xe8\xcc\x17\x4e\x57\x27\xa2\x16\x59\xc0\xfb\x70\x86\x91\x1c\x99\xeb\xdf\xcb\xe6\x8a\xd4\xeb\x2f\x7c\x4c\x1f\x4b\x60\x18\xdb\x8c\x88\x0d\x42\xda\xea\x17\x57\x0c\xd5\xff\x36\x13\x3d\x37\x38\xd5\xc8\xd0\xd8\xf7\xea\x51\x9c\x21\xa6\x64\xb3\x0d\xe8\x9a\x2f\x3d\x01\x66\x62\x66\x62\x2a\xc9\xb5\x19\xdf\xc5\xee\xfd\x5e\x61\x94\x26\x1e\xdf\x6e\x9f\x5e\x3b\x31\x8b\x66\x62\xff\x67\x41\xc0\xd5\x20\xbf\xed\xc2\xf9\x97\x60\x8e\x2c\x94\x4c\xb8\xef\x46\xa4\x78\x7f\x07\xf5\xdb\x5d\xa5\x75\x36\xe6\xf5\x24\x16\x12\xd2\x50\xa1\x42\xe3\xbf\x77\x97\x28\x34\xe0\x2c\x30\xcb\x17\x47\xbb\xe4\x0c\x65\xc9\xb3\x48\xc6\xa8\x7c\x0d\x6f\x55\x5c\x9f\xcb\x03\xba\xa3\xcb\x8f\x48\x16\x27\xd6\xd8\x2d\xdd\x99\xec\x75\x0e\x49\x75\x2b\x0d\x1c\xef\xc4\xb4\xd4\xbb\xbb\x4a\x91\x92\xd1\x63\xb9\xa8\xa1\xdb\x0d\xd3\x5f\xbc\x42\x8c\x68\x61\xe1\x36\xfc\x4e\x2c\xd7\xf5\xb2\x8e\x19\xcf\x92\x88\x51\xa9\xff\x09\x0f\x87\x02\x65\xd5\x3f\x47\x12\x0b\x0a\x9f\x1d\x2b\x8d\x23\x0a\x4e\x9e\xa5\x11\xa6\xdc\x83\x1d\x5c\x88\x7f\x88\x43\x4e\xb7\xf2\x2c\x75\x34\x62\x07\x6c\x6d\xc4\x6c\x1c\x80\xce\x52\xa1\xd0\xb5\xde\xbc\xdc\x57\x25\x5e\x64\xfe\x3f\x79\x45\x16\x18\x52\xa0\x7c\xc0\xf7\x95\x52\x35\xea\xbc\x45\x7d\xa1\x1f\x39\x7d\x14\x16\x85\xc6\x8b\x22\x97\xe7\x93\x55\x2b\xf2\x6d\x2a\xa4\xc3\xea\xe6\x79\xb5\xde\xef\x1e\x9f\xfa\xbf\xeb\xde\x8e\x24\x76\x44\x3b\x99\x74\xf3\x95\x16\x0b\xcf\x18\x06\xa9\x4b\x8a\x8f\xf1\xc9\x5d\x83\x0f\x96\xa8\x73\x9d\xb7\x16\xf0\xfc\xc7\xb8\xb2\x8b\x67\xcc\xf0\xd0\x43\x7d\x69\x87\xbd\xaa\xce\x7d\x9d\x3c\xcf\xb2\x30\xa2\x5c\xbe\xf2\x5c\x5f\xfd\xfa\xce\x32\x6e\x2d\xa5\x66\xa8\x97\x1c\xa6\xcd\x42\xf1\x01\xcf\x78\x1a\x10\x02\x64\xc8\x8a\x9a\xe4\x3b\x34\x2f\x7b\xf7\x3e\xfe\xce\xdc\x24\x91\x8d\x3a\x39\xd2\xa3\xdb\xf2\xcd\xa9\x65\xf4\x0f\x26\x00\xa8\x8f\xc9\xeb\xa6\x25\x3e\x36\x8b\x82\xf6\xcd\x4a\xd0\x66\xd2\x22\x1c\xd7\x45\x6e\x8c\x6f\x80\x34\xb1\x8c\x37\x50\x14\xb7\x4e\xb2\xed\x6f\xf1\x90\xf2\x0c\x32\x46\x58\x52\x5b\x2e\x47\x5e\x62\x3f\x4b\x25\x53\xe4\xc7\xd2\x59\xdf\xd3\x9f\xf8\x46\xb4\xe1\x83\xe3\x38\x46\xed\xc8\x6c\xf5\xd0\xc9\xa4\x8c\xb8\x14\xf4\x85\x3a\x08\xcf\x94\x3b\xe8\x3b\x27\xd0\x9f\x8a\xfd\xfd\x75\xcc\x09\x4f\xea\x89\xe3\x6d\x46\x7e\x52\xc6\x3e\x7b\x15\x9d\x58\x65\xf0\x3e\x13\x76\x85\x25\x9a\x5c\xe5\x50\xe7\x1e\xba\x36\xbb\x02\x6c\xfe\xf3\x7e\x5d\xe5\xe5\x64\x9b\xd5\x5a\xd0\xaa\x6a\x8a\x6a\x06\xbf\xe5\x19\x06\x21\xe5\xba\x6e\x77\x8f\x9e\x8d\xfe\x69\xf3\xbc\xde\x3c\xec\xfc\xd5\x98\x59\x56\x92\x6d\x5e\x1e\xce\x05\xd0\x34\xc5\xa6\x4d\xfa\x76\xb0\x78\xfd\x7f\x7f\x9c\xd4\x88\xc1\xa1\x9b\x7b\xa9\xb0\x6e\x31\xd5\x76\xec\xc8\x65\x70\x6d\x26\x09\xc9\xb4\xf8\x56\xd5\x79\x51\xc0\x92\x1e\xfe\x72\x3a\x9a\x07\x3c\x25\x94\xc8\x91\x88\x88\xa6\xd6\x16\x0f\xc3\x8c\xaa\x7e\x75\xde\x90\x5f\x44\x90\xec\xe5\x11\xe6\xa1\xdb\xb6\x7c\xfc\xa7\x67\xf5\xf3\x80\x39\x1e\xc6\x48\x55\x17\x50\x14\xa3\x1a\x1f\xce\x23\x13\xd3\x8e\x7c\x82\xba\x2d\xb1\xee\x45\x9b\xc7\xc6\x00\x8f\x8c\xc5\xd8\xe0\xaf\xbc\x1d\x09\x35\x70\x1e\x03\x62\x34\xae\xae\x6a\x26\xc2\x7d\x9c\x27\x61\x4a\x8a\xe4\x17\x3a\x85\x73\x9f\xfa\xeb\x81\x4a\xb8\x75\x36\xdd\x64\xb6\x3a\x05\x8b\xeb\x86\x27\x9a\x51\x94\x08\xc6\xb4\x68\x9c\x27\x26\x0e\xc6\xca\x85\xbb\xea\xd3\x47\x19\x99\x94\x3c\x65\x48\xa1\x29\x4b\x3a\xbb\xf9\x4f\x6a\xcd\x98\xf4\x7f\xc6\xff\xf8\x2d\x87\xa7\x59\xc6\x6d\xe9\x04\x1d\xcf\x1a\x41\x17\x79\xd9\x8f\x56\xaa\x90\xa0\x00\xf0\x76\xa0\x6f\x70\xe5\x97\x8d\x6f\x37\x3a\xd6\x0e\xe6\x3c\x05\x27\x2c\xbf\x2a\x93\x61\x68\xe3\xbd\xaf\x9d\x03\x70\xbe\x34\x26\xa6\x8f\xc7\x94\x65\x89\xa2\x2d\xe5\x0e\xf5\xb0\xa3\xf0\x2c\xb1\x89\x46\xed\x73\xdf\xcd\x64\x73\xe7\x59\x96\x11\xb3\x4b\x83\x2d\x61\x95\x9a\x99\x9a\x86\x0b\x86\xf5\xff\xd1\x27\x8a\x78\x26\xac\xe9\xf4\xff\xcc\x51\x36\x7d\xd7\x0c\xe4\x50\xc7\x37\x2e\xbc\xe3\x9c\x87\x9c\xeb\x01\x17\x70\x57\xa9\x57\xc2\xba\x8d\xb7\x34\xce\x59\x94\xd8\x18\xfd\x19\x1f\xeb\x1b\x28\x7a\x88\x1b\xe7\x5a\x11\x4b\xc4\x7f\xf6\x9d\x79\x37\x89\x2b\x75\xd3\x8e\xec\xce\xe6\xac\x2b\x5f\x3d\xe7\x9b\x94\x95\xab\x79\x82\x8f\xfc\xbf\x3e\xd1\xc7\x21\x4c\xa9\x5a\x48\x5b\xb6\x90\x5d\x8d\xd8\x3c\x55\xef\xc3\x48\x43\x96\x10\xbc\x8a\x12\xe9\x5e\xa6\x81\x38\x0e\xa6\x53\x1e\xd0\x90\xef\xfd\x73\x75\xbb\x1b\x91\x6c\x70\x2e\x53\x3b\xc9\x50\x55\x3e\x91\xe0\x89\x2d\xfa\x2e\xc2\xd0\x89\x7f\x57\x1d\xa6\x98\x8a\xcf\x24\x5f\x39\x97\x90\x10\x2a\x6a\xfd\x78\xfb\xe0\x74\x31\xf7\xf7\xbf\xef\xf6\xbb\xc7\xdd\xea\xce\xdf\x17\x23\x4e\xba\x61\x4d\x5b\x9d\xf6\xd0\x83\xe7\xb8\x89\x54\xec\x2a\x45\xab\xee\x24\xfa\x8c\x6b\x72\xe4\x4e\x71\x13\x2b\x6d\xe5\x90\x9b\x97\xfc\xb3\xa7\x32\x29\x27\x64\x01\x68\xed\x80\x5f\x74\xab\xbe\x59\x06\x30\x8a\xe7\x3a\x86\xfe\x09\xe7\x19\xe7\x06\xed\xde\x51\xe2\xfb\xbe\xed\xbe\x60\xeb\x52\xdd\xfa\xc2\x80\x98\x7c\x01\x11\xa4\x92\xaa\x55\x8a\x73\x31\x26\xa9\xe4\x22\x60\x9a\x72\x91\x83\xd3\x3f\xa7\xd8\x9a\x38\x44\x22\x10\x92\xb9\xe0\x24\x1d\x2a\x3f\x88\xd3\xbc\xb7\x6d\x44\xa0\x33\x2a\x5d\xc3\xa6\x3a\x8d\x98\x7b\xb8\x08\x55\x4c\x8c\x47\x6f\x55\x8b\x93\x84\x92\x88\x24\x92\x71\x63\xb5\x5e\x9e\x6a\x7c\xcb\xab\x73\xf3\x5c\xf5\xdf\x44\xc4\x82\x11\x9a\x78\x40\x94\x2d\x92\x19\x8c\x3e\x89\x48\xe2\x14\xf9\x84\xd6\xba\x6a\xa1\xe8\xeb\xfc\x64\x81\x4b\x19\x13\x91\x38\x08\x06\x65\xd3\x88\x81\xb8\x3d\xd7\xa3\x5f\xf3\xdd\x92\xd0\xc3\xc6\xa9\x62\xe5\xdf\x55\x5e\x16\x79\xd3\xee\xf1\x6d\x0e\x26\x10\x09\x57\xa9\xb5\xb7\x88\xa9\x16\x07\x06\x59\x2e\x12\x05\x56\x81\x1b\x2c\x4b\xa4\xdb\x8a\x52\xdf\x8c\x69\xc8\x46\xb8\x76\xfb\x91\x96\xc2\x92\x22\x8d\x2d\xe8\xe7\x6a\xb7\xde\xfc\xe9\x6f\x9f\x9a\x84\x39\x4d\x98\xea\x4c\x46\x71\x9f\x8f\xbb\xac\x8b\x58\xfa\xda\x2c\x08\x22\x1b\xcc\xcc\xdf\x70\x9b\x0f\x70\x5c\xc1\x84\xa6\x00\xb8\x3d\x0a\xff\xbf\xfc\x74\x9a\xc7\x80\x45\x96\xa6\x90\x79\xbe\x3f\xb7\x83\xd8\x7d\xb3\x97\xcc\xf7\x59\x59\xc1\x11\x59\x38\x7e\x53\x22\x1d\x9e\x3c\xed\x79\xc6\x06\xc3\x85\x00\x0b\x8d\xb5\xbc\xfa\x5b\x22\xc6\x01\x4f\xcb\xc6\x05\x80\x55\x7a\x00\xad\x6d\x88\xfa\x93\xea\x84\xd9\x70\x4c\x5f\x02\x64\x1c\x5a\x67\x9d\x22\x4e\x0e\x4f\x45\xe4\x52\xe3\x43\x45\x00\x26\x44\x55\xe0\xe3\x49\xbf\x63\xff\x1c\x32\x95\xda\xba\xf3\x1f\xa7\xb6\x92\xe7\xa2\x68\x86\xb2\x3d\x2e\x64\x66\x15\x71\x2d\x4d\xec\xb5\x3f\x67\xa7\x9f\x57\x66\xa9\x76\xe2\x9f\xd8\x52\xba\x61\xec\xc1\x0a\x05\x92\x62\x86\x0a\xab\xe9\x63\x29\xdd\x17\xe9\xf7\x45\x72\x5f\x1e\x4e\x42\x0b\xcb\xf2\x20\xcf\x1f\xd7\x39\x1c\xab\x72\x06\x1c\x12\x5a\x26\x74\x7c\xee\x61\x9e\x22\x71\x1d\x30\x09\xe8\x7d\x9f\x56\x04\x25\xfd\x6a\x37\xc1\x84\xc7\xa2\xb7\xf5\x5a\x5c\xe4\x81\xe0\x02\xa5\xa0\xbd\x7a\x20\x5e\x1a\x45\xaa\x04\x2a\x24\x0f\xc2\x4e\xc5\x1d\x16\x78\x7a\xa9\x4a\xbc\x64\xcb\xe4\xc2\x04\x9c\xaa\x49\x1c\x7e\x64\x59\xe4\x76\xcc\x72\xc5\x21\x08\x62\x74\x35\x18\x34\x8b\x7a\x95\xeb\x9b\xaa\x9e\x17\xa6\x72\x08\x98\x05\xd2\xee\x40\x56\xd5\x78\xa3\x85\xc0\x28\x82\xe3\xfa\xc4\x2f\x7d\xc4\xbf\xc7\x65\xd0\xdf\x41\xfb\x94\xe7\xb6\x84\x53\xf3\xd2\xc7\x00\x20\x0c\x79\xa6\xc7\xbb\x1d\xf1\x6c\x4d\xa4\x25\xbf\xbe\x77\xc8\x95\x1c\x30\xcd\x04\x90\x9e\xe7\x7c\xff\xe2\x0e\x51\x18\x92\x51\x43\xea\xaa\xd5\x89\x82\x08\xd7\x55\xe7\x86\xf6\xc8\x04\xbf\xfc\xbd\x27\x02\x51\xa8\x29\x00\x32\xd3\xf3\xf1\xd1\xb5\xf8\xff\x96\xdd\x61\x88\x94\x0e\x46\x59\xe5\x7d\x3c\x31\x74\x20\x32\x92\xbc\x46\xff\x7b\x57\xd0\x5c\xbc\x8d\xeb\x1a\x47\x8c\x62\xe3\x5e\xc4\x8e\xca\x4b\x1a\xab\xe1\x33\x0a\x80\x40\x1c\x47\x94\x68\xdc\x94\x04\x80\x9b\x8c\x09\x9f\x8d\x44\x12\x24\xa9\xd5\x6b\x68\x4e\x55\x3e\x73\x07\x21\x91\xe0\x53\xc7\x2b\x4d\x0b\xf2\x3b\x14\xe6\xba\x0f\x71\x40\x1a\x19\xe9\xcc\xd3\x4d\xfb\xf2\x54\xc0\xe7\xec\x46\x43\x28\x0e\xd2\x4c\x07\x16\xfb\x93\x17\xa4\x1b\x30\x2b\xb6\x3d\x8f\xa9\x0d\xfc\x35\x18\xd0\xf1\x02\x4a\xe1\xa9\x9d\xa1\x48\x5c\x1f\x26\x04\x85\xd9\x70\x52\x79\xef\x1b\x91\x87\x23\xc9\x6e\x4b\x42\xd3\x2f\x90\x49\x55\xdb\xe8\x51\xb3\x44\x12\xac\x16\xed\x58\xfa\x58\x82\xff\xc5\x2c\x4d\xa8\x84\x85\xa8\xcc\x67\x1a\x73\x1c\x38\x04\x16\xea\x8d\xa0\xd7\xd5\xfb\xb2\xad\x05\x82\x25\x3e\x6d\x78\x83\x53\xe1\x17\xdf\x03\x18\x11\x64\xca\xce\x88\x79\xa2\x6d\xd5\x3f\x80\x30\x11\x71\xa9\x5b\xd0\xce\x1d\x48\xdf\x00\x61\xca\x1c\xcb\xc7\xef\xa8\x14\xbc\x46\x29\xfb\x12\xcb\x00\x32\x88\xa8\xa2\xa7\xc4\x5f\x84\xa4\x78\xaa\x9a\x26\x97\x56\x47\xca\xdf\x55\x72\x24\xf4\xd9\x33\x16\x58\xb6\x05\x12\x03\x58\xa3\x72\x2c\x15\x4e\x76\x10\xa9\x0d\x1d\x77\xeb\x1a\xf2\xc3\xb7\x1a\xca\x76\xfb\x52\xe7\xc7\x53\x6f\x8f\x83\x89\x6d\xf5\xb9\xec\x63\x12\xfd\xac\x32\x09\x9a\x9e\x2f\x60\x3d\xaa\x08\x92\x41\x64\xc5\x59\x4e\x50\x37\xdd\xc7\x08\xd9\xfa\x05\xea\xc9\x8a\x92\x81\xe0\x14\x1d\xfc\x23\xb7\x02\x32\xe7\xe3\x03\xbe\x8f\x1f\x4e\x06\x08\xdc\x8b\xd8\xb4\xcf\xa8\xf1\x78\xba\xcc\x11\xca\x30\xd5\xe0\x49\x34\x3e\x5c\xc5\xf3\x04\x25\x33\xfd\x8e\x32\x46\xc1\x1d\x93\x64\xfb\x39\x41\xa6\xeb\x9c\x46\x83\xb8\x61\x55\xb7\x0d\x4d\x2c\x03\x63\x96\x59\xab\x5a\xec\xcd\x38\x99\x26\x22\x94\x73\x0c\xec\x22\xcf\x36\x97\xa9\x53\xfa\x6c\xb0\xfd\xf1\x7c\x3b\xb6\xc4\x7c\x07\x11\xa7\x24\x3c\x4f\xc7\x50\xb7\x74\x2f\xd3\x5c\x32\x15\x12\x59\x8f\x26\x54\xe3\xba\xeb\xf9\xdb\xa0\x95\x9f\x2b\xcf\xc7\x8d\xad\x1e\x6c\x36\x6f\xc3\x78\x33\x4c\x28\x06\xd0\x2d\xa2\x6e\x2a\xac\x86\xaa\xb9\xb9\x44\x3d\x97\x19\xa4\xb1\xab\xd4\xdc\x55\xab\xb7\xc3\x33\xb1\x7d\x5f\x9c\x7b\x0b\x22\x18\xee\x06\x9c\x07\x56\x5a\xaa\x85\xc9\xe4\x95\x22\xb0\x21\x17\x5f\x26\xbc\xff\x63\xf3\xbc\xed\xa9\x44\xb8\x14\x71\x92\x58\xe1\xc8\x53\x01\x0a\x2d\x4b\xf5\xdc\x10\x1b\xf6\x06\x29\x12\x4b\x55\xa8\xf2\x9a\x0e\xb2\xbc\x2a\xe7\x99\x29\x29\xb4\x95\x65\xa0\xa5\x4b\x0c\x8c\x49\xdf\x84\x86\x54\x08\xa4\xa5\xf4\xa0\xec\xca\x6f\x8b\x01\x04\x29\x63\x91\x75\x03\xf8\x8f\xf3\x1b\x96\xed\xb9\x79\x6b\x9e\x11\x8a\x7b\xd0\x75\xee\xdd\x62\x29\xa5\x1a\x28\xd0\x0d\xe4\x05\xea\xfd\xc9\xb2\x36\xed\xcb\xaa\x6c\x5f\xea\xea\x3d\x2f\x0f\xfb\x76\xbc\x12\xa4\x01\x2a\xda\xdc\xef\x95\xa7\xdd\x9d\xd1\x6c\x8e\x82\x32\x52\x1a\x45\x72\x44\x37\x9d\xad\x14\x06\x69\xb0\x48\xbe\xb8\x64\xf2\x4b\x15\x84\x9e\x17\xa5\xdf\x73\x67\xd4\x28\x5c\xaa\xd0\x4a\x5e\xee\x7d\x0c\x69\x79\xa1\x29\x6d\xe5\x3c\x0e\xdd\xec\xf6\x3e\xb2\xd4\x49\x62\x06\xfd\xac\xed\xf5\x7a\xfd\x75\x14\x47\x6a\x1e\xa7\x7e\xbf\xdb\xbf\x23\xbe\xee\xdb\x1e\xc9\xeb\xbb\xa0\xb5\x2f\xbf\x55\x95\xbe\xaa\x3e\x9e\x88\x4e\xda\x37\x62\x16\x90\xa3\x37\x1a\xbb\xe9\x0f\xa0\xd7\x66\xa6\xbd\x79\xb2\x03\xa1\x64\x9e\x34\x65\x8d\x75\x9b\x1b\xaa\x20\xfd\x0e\xcd\xcb\x5f\x3c\x34\x9a\x98\xa2\x13\xeb\x9b\x35\x39\x98\x67\x17\x5c\x70\xcd\x26\xcb\x3c\x0e\xe3\x06\xb1\xf3\xc8\x77\x58\xee\x5e\xaa\x73\x03\x73\xdb\x58\x05\xa0\xc8\xfc\x23\x2a\xfb\xbe\xbe\x59\x85\x92\x5b\x8a\x0d\x6f\x90\x54\xd5\xeb\xef\x88\xa7\x85\x45\xe8\xae\x88\x82\xc4\x42\x7d\x95\xb2\x08\xbc\xdd\xbb\xaf\x08\x54\x71\x6c\xcb\x10\xdf\xf3\x12\x49\xcc\x6b\xc6\x62\xed\xbb\xe9\x84\x0e\x83\xa7\xc7\xe7\x87\xf5\x6a\xfb\xdd\x5f\x9e\x04\xc2\x1b\x20\x36\x0e\x41\x66\xed\x25\x75\x2b\x57\x89\x4e\x28\x9f\x7c\x82\xbc\xbe\x08\x79\x4d\xbb\xa6\x42\xfb\x04\x91\x45\xb6\xf8\x1c\x8f\xff\xb4\x2a\x05\x8b\x08\x72\x20\x31\x84\xc2\x61\x94\x17\x31\xef\x8a\x65\x32\xf3\xe8\x97\x5e\x10\xe7\x30\x7f\x42\xc6\x0d\x21\x94\xeb\xfc\xf0\xd2\xf2\x64\xd6\x9a\x45\x9c\xdb\xbc\x28\x14\x37\xe7\xa2\xf8\xb8\xb1\xb4\xa8\xb3\x5e\xb1\x21\xb0\xbf\xfc\xf8\x64\x20\x33\x2d\x33\xb7\xce\x7e\x94\xb6\x6e\x76\x60\x73\x5c\xfe\x7c\x3c\xe0\x96\x62\x94\x3c\xd3\xf0\x5f\xbf\xf5\x7f\x37\x5e\xac\xa1\x67\x69\x99\xa5\x57\x67\x37\x42\x16\x86\x7d\x05\xb8\xc5\x7e\xf4\x64\x73\x5d\xb3\xa2\x53\x57\x11\xef\x60\x1b\x2e\x55\x66\x2a\x11\x44\x19\x38\xe7\x60\xf6\xee\x22\x42\x12\xf8\xb3\x74\x0c\xce\x02\x9f\x9d\x07\xbe\x6b\x26\xa8\x62\xc0\x93\xc4\x8e\x20\x24\x4a\x68\x49\xfb\xc4\x6e\xb3\xba\x1f\x8b\x66\x71\x05\xa9\x20\x84\x92\xf3\x2b\x88\xac\x0e\xf5\x1f\x50\x90\x18\x20\x3a\xe6\xe8\xdf\x16\x23\x11\xd3\x91\x00\x16\x10\x51\xc3\xed\xd5\x76\xd7\xdf\x9d\x59\xf6\xf0\xfb\xd5\xf3\xef\xbb\x7e\x90\x81\xdb\x52\x78\x6b\x95\xd2\x38\x93\x29\x3a\x1c\x33\x0a\x20\x22\xfd\xc6\x7b\xf8\xb5\x86\x93\x8f\xf3\x4f\xc7\x46\x46\x69\x64\x46\x91\xae\x69\x28\x4e\xc9\x94\x53\x80\x9b\x82\xb8\xab\xd2\x69\x60\xd0\x8e\x74\x53\xd5\xf7\x50\x9e\xe7\x26\x84\x52\x61\x86\xbd\x33\x7e\x74\xc4\xd6\xa3\xa7\x52\x09\xf7\x95\x6a\x53\x10\x8d\x52\x2c\x26\x7c\xcf\xbe\xb1\xe5\x22\xab\x76\x88\x81\x7e\xc2\x05\xeb\xae\xd4\x91\xa2\xda\x11\xbf\x7e\xb7\x58\x14\xab\x03\xc9\x6b\xb5\xf8\x8c\x07\x82\x62\x5c\x46\xd3\xfc\xd5\x00\x32\x1c\xab\x1e\x0c\xcf\x3c\x3a\xb5\x95\xc6\x98\xc8\xd5\x6c\xb7\x9f\xd8\xad\xc6\xd9\xbb\x63\xa8\xc9\xde\x6e\x72\x8d\x5b\x5b\x75\x36\x49\x31\x2b\x4c\x74\x6a\x45\x62\xca\x67\x5a\x63\x3f\x76\x7f\x3e\xda\x97\x8b\x82\x79\x12\xc0\x1f\x6f\x0a\x99\x0d\xc4\xf5\x44\x98\xa5\x9e\x09\x77\xfe\x05\xf2\x66\xd1\xf8\x52\x08\x86\x0c\xc3\xbb\x5c\x61\xd9\xe0\x8c\xab\x6f\xba\x30\xd0\x84\x64\xd3\x6e\xb6\xeb\xab\x75\x95\x97\x7f\x25\x78\xc2\x95\x89\x2c\x8b\xc0\x09\x6a\x38\x62\x8b\x75\xb3\xaa\x71\xdb\x3b\x20\xca\x44\x11\xc6\x5e\xe0\x97\x98\x85\x9a\x49\xf9\x9e\x0e\xb8\x0d\x70\xbb\xdb\x26\xd0\x37\xa0\x95\x51\xdb\x5e\x6d\x37\xfa\x6c\x6d\xc1\xf1\x21\xa9\x43\x16\xd0\x7e\x62\x69\xf0\x46\x85\x95\xbe\x1d\x75\x9a\x79\x8e\x88\x16\x88\x9e\x66\x54\xc8\x3e\xfe\x62\x3a\xe2\x3a\x71\xd0\x0a\x1b\xae\xa3\xd6\x7b\x98\xa1\x32\xbb\x7e\xfe\x75\xbe\x55\x85\xee\xf6\x2f\x37\x45\xa6\xbf\x1d\x49\x9b\x7b\x2c\xaa\xf7\x59\x5a\x52\xc7\xb1\xc5\xa8\x91\x41\xb7\x72\xa4\x74\x43\xa3\x65\x94\xde\xbe\x54\xef\x3b\x6c\xda\xab\xd1\x9a\xd2\x49\xa0\x50\xf7\x53\xb3\x38\x85\xe9\xec\x57\x93\x04\xb4\x45\x62\x77\x26\xc7\x22\x0a\x48\x27\xdc\x96\xee\xc9\x73\x51\xcc\xd7\xa6\x4e\x74\xe6\xfc\xd5\x3f\xaa\x16\x75\x67\xd7\xcc\x06\x20\x8d\x6c\x39\x2d\x34\x83\x97\xa9\x53\x16\x58\xee\xe1\xe3\xfc\x86\x2c\x0d\x28\x52\xfe\x0f\x50\xaf\xa7\xaa\x5d\x91\xf2\x8a\xa3\x17\xe9\xfb\x64\x9a\x08\xd4\xec\x6b\xf9\xe0\xc6\xc3\x05\x6f\xa6\xeb\x9e\xb1\x88\x86\xe8\xae\x3a\x7c\x0e\x31\xd1\x99\x44\x12\x30\xff\xf9\xe7\xd5\xc6\xef\xb1\x9a\x73\x0b\xbd\xcc\x8f\xa7\xc9\x4c\x12\xb1\x25\x54\x7c\x22\x31\xe9\xee\x09\x20\xbf\x08\xb8\x69\x50\xb6\x00\xbf\x45\x38\xce\x32\x3b\x5a\x32\xed\x88\x70\x6c\x44\x8c\x88\xd2\x66\xd7\x4b\xe9\xf8\xfe\x2d\x31\xd9\xa8\x96\xea\x22\xf2\xbf\x94\x81\x9d\xdd\x4c\x03\x86\xb6\xbe\xf2\x03\x6b\x0f\xa7\xd3\x2a\x4a\x29\x74\xfb\xfb\xfd\x7a\xf2\x86\x4a\x44\x44\xf7\xfe\xb0\x7e\xea\xff\x04\x31\x3d\xce\x4a\xeb\x6d\x7b\xd6\xc3\x71\xa0\x75\x14\x39\xa9\x5c\x0a\xa1\x3c\xd6\x9f\x33\x1a\x72\x8d\x60\x05\x53\xe0\xac\x2e\xbd\x35\x8d\x2a\x20\xe8\xa1\xd3\xdc\xd5\xfa\xb3\xfc\xb0\x36\xcc\xd0\xee\x37\xf0\x2b\x3c\x55\xcd\xbc\xae\xd2\x11\xc9\x8f\xae\xc2\xc8\xa4\x3d\xbb\x60\x5e\x1e\xbc\x9d\x8a\x41\xc6\x09\x52\x60\x81\x85\x99\x87\x95\x60\x18\x5a\xce\xaa\x47\xcf\xcb\xf4\x55\xd0\x03\xc3\xc8\x96\xa1\xd9\xf3\xf7\xea\xfc\x31\x57\x5e\xe2\x18\x71\x4e\x31\xe4\x99\x53\x32\xab\xf7\xf2\xd9\x01\x8c\x84\x35\x53\x6e\xd7\x8f\xfb\xab\xc7\x87\x1f\x5b\x4a\x22\xee\x43\xff\x7c\x91\x8a\x84\xa3\xf9\xeb\xd6\x8a\x5b\x38\xd7\x16\x5f\xf6\x75\x19\x3d\xc6\x00\xf4\x28\x44\xcd\xb2\xec\x8b\x63\x12\x73\xcb\x99\x6a\x2b\x8d\xe6\x00\x69\x4c\x52\x4b\x1d\x81\x8e\x55\xc3\xff\x39\x63\xb1\x18\x2a\xcf\x47\x7c\x8b\x1c\x13\x6e\x02\x2b\x5e\xfb\x36\xe1\x2c\xa4\x96\x2c\xf0\xaa\xc6\x25\x7c\x9e\xe7\xc4\x44\x06\x6c\xc4\xeb\xaf\x07\x12\x32\x8e\x69\x8a\x14\xb1\xd9\xe6\x87\xe3\x24\xe3\x87\x29\x67\xb6\x8a\xba\xdb\x82\xd3\xe9\x56\x85\x2c\x31\xc2\x22\x29\x8b\xce\x7c\xef\x2c\xb4\x31\x06\x02\x49\x90\xb9\x2f\x6b\x1b\x38\x47\x30\x13\x51\x00\xa3\xd2\xf7\xe7\x05\x3d\x7b\xdf\x15\xe2\xcc\x16\xfc\xff\x6a\x01\x96\x09\xdc\x5d\x57\x6e\x6c\x40\xcb\x21\xf2\xfe\x16\xda\x08\x45\x88\x96\x7f\x02\xdf\xc6\xfc\x6f\x1c\x45\xaa\xa9\xb6\x03\x28\x32\xbe\xab\x08\x7b\x71\x5b\xfe\x68\xf4\x38\x20\x86\x42\x70\x70\x34\x3c\x77\x9d\x8b\x67\xf1\xdb\xa3\x74\x0b\x0a\x64\x32\x1d\x49\x54\x12\xe8\xbc\x99\x63\x78\x10\x42\x95\xe8\x5e\x83\x8c\x1e\x7d\x4d\x10\xb8\xab\x6a\x76\xf6\x21\x68\x08\x5d\xae\x6a\xd1\x1f\x42\x30\x22\x74\xfe\xd0\x75\x5e\xa3\x6a\xab\xfa\xa1\xd2\xb3\xa9\xa3\x42\x4e\xee\x85\x3d\x15\x1c\x57\xf1\x7d\xa5\xa9\xf2\x62\x7e\x47\xc5\x24\xf0\x89\xb5\xf9\x68\xe6\x12\xda\x9d\x7f\xc1\xe8\x50\x2e\xf1\x7d\xf5\xd6\x56\xf3\xc6\x8c\x7c\x79\x8f\x28\x09\x43\x47\x81\x18\xfe\x8f\xfb\xd7\x77\x04\x0d\x14\x97\x21\xc8\xd4\xd1\x9a\x53\xdb\x97\x5e\xbe\x95\xa3\xd2\x0a\x84\xaf\x53\x7a\xaa\x2b\x7d\xbe\xcc\x3c\xb8\xae\x9a\xa7\x92\x02\x2c\x56\x88\x70\xfa\x56\x1a\x02\x02\xe9\x58\x87\x63\x0d\x85\xba\x39\x97\xca\xff\x8a\x46\xad\xbc\x9b\x5a\xb5\xf8\x05\x1d\x15\xa2\x48\x2d\x75\x0c\x1e\xf3\x76\x0d\x27\x90\x24\x71\xe2\xf5\xc2\xa6\x11\xc5\x71\xb0\x0c\x11\x05\x19\x04\x4d\xb7\x70\xce\x05\x4e\x88\x76\x46\x48\xef\x69\x68\xde\x1f\x66\xa9\x33\x6d\xd1\x44\x9a\xe8\xd5\xa8\x9e\x22\x3f\x94\x51\x65\xfc\x91\x85\xc6\x30\x65\xf3\x58\xea\x75\xb3\xfb\x3e\x9d\x77\x26\xd0\x56\x71\x6a\x6f\xac\xb8\x82\xbb\xca\x84\x09\x77\xc0\x98\x02\x5b\x24\xa1\xfe\xe9\x85\xa1\x60\xf6\x3c\x79\x7c\xf6\xd7\x44\x91\x24\xb8\xd4\x5b\x8e\xef\xdb\x13\xaa\xdc\xe4\x6a\x31\x03\x6d\x92\x30\x23\xd3\xd2\x6e\xfb\x6b\x38\xad\x4a\xbd\x50\x13\x66\x92\xc8\x66\x6d\x3b\x17\xe8\xe7\x25\x5a\x62\x9c\xe7\x9d\x0e\xcd\xfc\xf7\x98\xa5\x57\xdb\xda\x88\x73\xb7\x1f\xf5\x3f\x21\x33\xaf\x45\xb0\x7d\xf1\x3a\x65\xdc\x24\xca\x32\xea\xff\xb3\x75\xec\xda\xbe\x21\x0d\x24\x99\xcd\xc7\x6e\xa9\x7c\xac\xce\xad\x43\x78\xbb\x84\x09\x1f\xf9\x3a\x26\x4d\x91\xc2\xbc\xba\xea\xec\x95\x69\x42\xc4\x64\x31\x53\x36\x0a\x8e\xa7\x05\xc0\xb4\xc9\x32\xcd\x44\x8f\xbb\x77\x56\xb5\xb5\xa0\x9a\x91\x5f\x6f\x78\x98\xa9\x74\x60\x07\x68\x36\xe5\x21\x2f\xb1\xb9\xd5\x4d\xdf\x23\xb1\x9c\x60\xe7\x06\x3b\xa3\x1a\x4b\x6b\x82\x4f\xd6\xa7\xe1\xdc\x02\xe5\xda\x3e\xb5\x63\xa7\xef\x74\xcd\x18\x6e\x62\xaa\x24\xfd\xcf\x99\x98\x48\xfd\xb1\x6a\x04\xd7\x81\x7b\xda\x9f\x08\xa7\xaa\x5c\x08\x12\x19\x08\x53\x3a\xae\x9a\x97\xea\xfd\x1a\xdf\xd6\xe7\x7e\xb8\x21\x09\x08\x3b\xaf\x46\xf1\x1b\xcb\x32\xe7\x3b\x48\x4e\x6f\x59\xe4\x66\xf2\x39\xb4\x04\x2a\xff\xd3\xd5\xf6\x54\x0c\x9f\x0f\x13\x2e\x7b\x3c\xf3\x33\xb6\xe7\xba\xfc\xf1\xb0\x9b\x3d\x8e\x31\x91\xf6\x94\x79\x55\x55\xdc\xba\x39\x21\x82\x80\xc5\x64\x43\x10\x79\xf8\xae\xba\xdf\xde\x4c\xae\x14\x41\x20\x02\x02\xb3\xaf\xab\xea\x84\x75\xee\x35\x6d\xba\x86\x84\x24\xcb\x6b\xfa\xc9\xdd\xb9\xa7\x74\x17\x41\x60\x38\x71\xf8\x1e\xf3\xf2\xdc\x90\xe3\x99\x97\x87\xb1\x0c\xf1\xff\x4c\x7f\x23\x0a\x84\x72\x1e\xfe\x3d\xb6\xa0\x3d\xbe\x21\x8c\xb8\xef\x91\xd8\x25\x28\x73\x3d\x09\x47\xd9\x39\x38\x3a\x85\x44\x10\xb9\x1a\xcd\x03\xb6\x57\x72\xe9\xd4\xe8\xba\x18\xda\xbd\x75\x55\x2e\x24\x58\x47\x81\x68\x11\x44\x4a\x12\x44\x73\xb7\x79\x5e\xed\x1e\xfd\x0b\x76\x6b\x35\xb3\xb8\x83\xf3\x11\x27\xf2\xac\x22\x88\x53\x9d\xb2\x5e\x64\x6e\xd1\x1a\x14\x41\x67\xe8\xb8\xca\x8d\xad\x7a\xb1\xf5\x70\xe4\xc6\x39\x65\xf4\xe9\x00\x25\x2a\xa5\x01\x6a\xde\x11\x4f\x37\xdd\xa7\x5a\x3c\x04\x44\x90\x60\x48\x49\xc4\x73\x83\xf5\xd5\xf9\x63\x39\x7e\x26\x82\x34\xb5\x3e\xe5\x8f\xd3\xa1\x06\x8d\x63\x9a\x6d\x11\xa4\x99\x15\x59\xdd\x56\x07\x28\xfb\x3f\x8a\x90\x90\xe4\x14\x18\xb1\xdc\x79\xdf\xf3\x86\xe4\xfe\x66\xb7\x56\x40\xd3\x51\xd7\xa7\x31\x31\x9b\x08\x98\xd0\x5c\x4d\xca\x70\x3e\x26\xce\x80\xef\x66\x52\xaa\x4e\x77\x00\xb5\xbb\xdb\xfb\xdb\x9d\xbf\x45\x96\x98\xd4\xef\x13\x48\x54\x31\x14\x82\x5a\x80\x2c\x89\x00\x82\xd4\x9f\xe3\x23\xa6\xe7\x5e\x60\xd1\xf5\x92\x89\xa5\x5a\x7f\x80\x6f\x78\x95\xf7\x7f\xe5\x76\x6a\x9b\xbc\x20\x6c\x94\x23\x35\x74\xad\x2a\xd0\x54\x4c\x75\x72\xc8\x3e\x5f\x68\x2f\x67\xd5\xd8\x22\x50\xb1\x15\x7f\x29\xf1\x57\x5b\x83\x31\x05\x96\x75\x7f\x97\x94\x67\xbe\x30\x1e\x9a\x97\xee\xc8\xba\x90\xac\x11\x81\xc2\x40\xbb\x20\xc1\x50\x53\x3a\xfd\x11\x9d\x05\xde\x6f\xb1\xe6\x54\x55\x1f\x6d\x44\x71\x7f\xbc\x70\x3d\x45\x80\x21\xa3\xa9\xb4\xf9\x73\xb7\x79\xb8\xde\x5c\xef\xb7\x77\xab\xf5\xef\xfb\xa7\xcd\xf3\xed\xe3\xb5\x7f\x38\x4c\x38\x99\x84\xf7\xde\xde\xdd\xd5\xa0\x5e\x17\x4c\xcc\xd9\xbd\x15\x90\xe5\x6d\xb9\x76\xc6\x9b\xae\x08\x8c\x09\x69\x2c\xf2\xc6\xd3\x2a\xdd\x54\xcb\x61\x73\x11\x06\xcc\xe2\xcf\x8f\x48\x31\xf3\xa9\x5f\x21\xc2\x80\x5b\xb5\x0f\x6d\x81\x38\x13\x76\x56\x11\x86\x22\x06\x1c\xc7\x6a\xa2\xbe\x05\x43\x0c\x47\x54\x76\xbf\xd6\xbd\xe3\xe2\x7a\x44\x91\xa5\x61\x95\x54\x57\x6b\xcb\xf2\x9a\xbe\x31\x8d\xc2\xd4\x61\x77\x69\x19\x6c\xf3\xc3\x32\x1c\xf7\x12\x91\x30\xec\x28\x61\x94\x66\x51\x6f\xbc\xaf\xef\xd6\x5f\x20\x81\x44\x18\xb1\x94\xce\xe6\x51\x85\x43\x18\x5e\x96\x38\x88\x30\x92\x82\xc2\xf5\x37\x8f\x3f\x1e\xae\x37\xcf\xdb\xfd\xf6\xfb\xea\x79\xe3\x5b\x63\x16\x4b\x47\x6f\x79\x56\xd8\xf6\x59\x43\x11\xc6\x3c\x21\xc9\x68\x6b\x90\xdc\x63\x37\xa5\xcb\x76\xfd\x02\xf5\x21\x2f\x0f\xce\x56\x9e\xef\x22\xc3\xd9\x2d\xc2\x18\x6c\x42\xb6\x5b\x67\x14\x40\x58\xd1\xfe\x35\xfd\x62\xb1\x66\x68\x45\xfa\xea\x72\x53\x62\x7d\xf8\x18\x85\x6a\x3f\xf7\x74\x44\x18\x9b\x84\x62\x82\xcf\xb7\x4f\xab\x8b\x91\x3a\xcf\xb5\xd7\x44\x98\x38\xc9\x03\xb7\xea\x4b\xac\xbb\xc5\xf5\xdb\xe8\xa8\x58\x2a\x44\x72\x17\xa7\x61\x18\xba\x57\xa1\xad\x98\x14\x3a\xa6\xab\x2d\x64\x0c\x29\xa3\xf3\xe2\xb8\xcd\xa7\xef\xc9\x78\x46\x31\x3d\xa2\xf7\xb6\x7c\x8a\x5e\xce\x08\xe7\x63\xc2\x3a\x43\xc0\xc5\xe7\x3a\x23\x67\xdb\x4e\xd0\x05\x22\xcc\xc2\x84\x62\xc3\x54\xf9\x4b\x25\x07\xa3\x61\xcf\x04\x12\xf6\xcb\x89\x19\xdc\x80\x57\xfa\x16\x61\x26\xad\xd2\xd6\xc9\xba\x0b\xd1\xbe\x41\xef\x90\x8a\x90\x87\x68\xcb\x2e\xaa\xb2\x7d\x39\x59\x13\x6b\xa0\x71\x12\xa1\x88\x0c\x55\xa1\x1d\xf3\xd2\x4b\x74\x2d\xf3\x7c\xb9\xfe\x32\x0c\xa9\x86\xc5\x9a\xb7\x6e\xcc\xa3\xfd\x5b\xf5\xde\x4c\xdf\x46\x25\x89\x8c\x7c\xb2\x7d\xc8\x3e\x7c\x12\x78\xf6\x17\x89\x90\x8f\x49\x65\x48\xc1\x7f\x0c\x60\xfb\x92\x40\x4d\x84\x3a\x42\x8a\xdc\xdc\x57\x6d\x5b\x0d\xe8\x42\x11\xa2\x52\xc4\x32\xb0\xf7\x42\xe4\xcd\x0c\xcc\x2a\x42\x34\xe0\xd9\x5a\x6d\xad\xfe\xcd\xb9\x28\xc8\x1a\x9d\x7e\x47\x13\x21\x45\x59\x6c\x6a\x6f\x4d\xec\x59\xfe\x67\x4c\x2c\x69\xad\xef\xbb\x13\xe0\xa9\x6a\x5d\x08\x66\x3a\xa7\xa2\x20\xb6\x47\xc1\xea\xee\x34\x20\xe7\x96\xb6\x83\x28\xe0\x99\x19\xc2\xb6\xdb\xca\x74\x2e\xd8\xec\x6e\x61\x98\x58\x35\x0d\x6b\x54\xac\x08\xc5\x34\x9a\x3a\x51\x14\x5a\x9f\x79\xef\xa4\xe0\x77\xc9\x6e\x76\x8b\x38\xca\x68\xbb\x20\xda\x08\x52\xe7\x32\x35\x5c\x52\xc9\x88\x28\xee\x2c\xff\xde\xad\x7c\xaa\xe6\x39\x2b\xdf\x8d\x59\x55\x0e\xf2\x4c\xbf\x8d\xaa\x4a\x7d\x3b\x18\xca\x00\x81\x2d\x53\xc2\x5d\x45\x0a\x0d\x7d\x01\xe1\x67\x07\x45\x94\x30\xab\x0b\xd4\xd9\x7a\x7e\x9b\x8f\x12\x66\x8b\x58\x5d\x61\xda\x7d\xa5\xfb\x0f\x12\x25\xd2\xea\x06\x1e\x2d\x38\x61\x24\x8f\x20\xa2\xc4\x04\xbe\xd6\x6f\xa2\xf1\x21\xa2\x34\xb1\xe5\xcc\xe7\xd2\x65\x51\xc6\xee\x8d\x88\xd2\xb4\xa7\x66\x21\x8b\xc6\xed\x9a\xc3\x94\x8a\xff\xcf\xf7\x04\xcd\xc1\xeb\xd3\x95\xaf\x41\xe6\x7f\x81\x05\x31\x9d\xf3\xfb\xce\x1c\xb0\xa4\x53\xbe\x25\xe6\x3e\x5a\x72\x0f\xbf\x46\x6a\xac\xd3\x91\x60\x2c\x21\x07\xff\x1b\x96\xd8\xe4\x8d\xb3\x7b\x69\xd7\xf8\x5b\x4b\x25\x62\x22\xa5\x69\x8c\xa5\x2f\xcc\xbd\x55\x95\x7f\x88\x2c\x08\x49\xda\x91\x26\x04\xb1\x0e\x0d\x79\x4e\x11\x65\xa9\x55\x21\x2a\x72\x83\x56\x03\x7a\x9f\xbf\xf9\x46\x2e\x15\x97\xbe\x32\xac\x6a\xa6\xe0\xe5\xaf\x1f\x49\xc4\x21\x4d\x54\xec\x26\xc3\x55\x3e\xca\x6e\x88\x48\x70\x16\xc7\xbe\xa2\x7d\x4c\x59\xfd\x65\x14\xac\xbb\xce\x50\xa8\xba\xc8\x1b\xab\xc9\x73\x29\x56\x3e\x5a\x2a\x02\x13\x22\x0c\xf1\xbc\xfc\x9b\x5f\xa7\xbc\xc6\x55\xbb\x98\x12\x17\x11\x44\x8a\x92\x17\x3d\x5f\x63\x5d\x1d\x6f\x08\x1f\x73\x57\xb5\x2d\xd6\x1f\x63\x78\xb2\x88\x00\x12\xca\xb1\x54\x27\x2c\xc7\x9e\xba\x88\x54\x60\xb3\xba\xdd\x2e\xfc\xdb\x27\x63\x35\xb2\x29\x22\xc5\x22\x62\x13\x70\x3e\xe5\x43\xae\xf0\xdb\xf9\x63\xe4\x55\xda\x2e\x04\xbf\xac\xd4\xf4\xef\x52\x50\x2c\xf1\xfa\x05\x68\x83\xfc\x6a\xfb\xd1\x49\x44\xa6\x55\x81\xa6\x8d\xf9\x6c\x06\x6a\x10\x96\x3a\x00\x5b\xf5\x62\xb7\xc1\x02\x2d\xc4\xbc\xb9\xa9\x6a\x6f\x5a\x4c\x77\xcf\x48\x4b\xe1\xce\xdc\xf2\x9c\x97\x33\xf3\x37\xc2\x34\x56\x56\x70\xeb\xb6\xcf\x74\xf4\x83\x84\x8c\x11\x21\x0c\x95\xd9\x0c\x22\x03\xd3\xb5\x89\x00\x94\x35\xf8\x0e\xea\xf5\x1a\xfa\x09\x8d\x2a\x22\xe8\x97\x13\x9b\xbb\xb1\x3b\xe1\x27\xa9\xc9\xae\x3b\x23\xc3\x56\x56\x92\x22\x9b\x8d\x17\xa9\x9b\x2b\xa5\xcf\x27\x9f\x4f\xd4\x8e\x3f\x16\x2a\xe3\xd2\x66\x1f\xdd\x72\x76\xc7\xeb\xec\xb1\x31\xa4\x98\xd4\xbf\x41\xbd\x3e\x55\xed\xca\x3f\xb7\x89\x33\x32\x3f\x8e\xde\x4d\xf6\x7f\x4f\x0d\xd5\x1d\xd4\x55\xd1\x3b\x2a\x91\x31\xca\xf4\x38\xad\xf6\xbd\xfa\xa3\x1b\x28\xe2\xb4\x77\x14\x9f\x93\x0c\x9b\x88\x83\x80\x53\xdc\xb2\x9b\x89\x54\x64\x3f\x9a\x92\x71\xa0\x63\xf2\x7a\x8e\x79\x79\x75\x26\x09\x1a\xd7\x10\xf2\x24\xd5\x7d\xbe\xaa\x86\x55\x71\x2e\x67\x67\x64\x1c\x2a\x41\xce\x98\x77\x99\xfa\xf7\x9e\xce\xa1\x38\x8e\x24\x31\x8a\x98\xaa\xc6\xfc\x50\x5a\x3a\xf2\x4d\xad\x76\xd5\xa6\x56\xb7\xc7\x93\x45\xfc\x8d\xaa\xbe\x44\x1c\xc7\x52\xf6\x45\xb4\x57\x50\xbe\xd6\x55\x51\x5c\x75\x93\xdf\xf7\x48\x42\x0b\x10\x3f\x97\x0d\x42\xfb\xfb\x18\x5d\x34\xfd\xf5\x24\xd3\x69\xe4\xb7\xda\xfa\x95\x52\xd0\xb3\x17\x49\x93\x88\xa8\xf5\x4f\x16\xf5\x30\xd4\xd5\xde\x20\x3e\x9c\x8f\xe3\x4a\x73\x11\xa7\x80\x04\xc3\x79\x7a\xfc\x7d\xf3\x3c\xf0\x47\x8b\x98\xc5\x56\x0e\xb8\xd7\xe5\xcf\xab\xd2\x96\xcd\xf6\x3d\xb4\x44\xab\x7a\xa8\xf2\x23\x14\xcd\xbc\x8e\xc9\x77\x43\xe1\xd0\xf3\x94\xea\x98\x6e\x68\xae\x0f\x4f\xc2\xc8\x73\x05\xc1\xf1\x04\xf9\xa1\xa4\x89\x70\xf5\x71\xab\xa7\xb3\x2e\xe6\x52\xd3\x8a\xf2\xc6\x9c\x9d\xe3\x8b\x21\x84\x98\x1b\xcb\xcd\x4c\x81\x60\xca\x12\xad\xbd\xaa\xed\xf0\xdb\x10\x8a\xd4\xda\x07\x6e\x36\xe5\xe5\xc1\x49\x33\xfa\x1e\x89\xee\x63\x92\x6d\x55\xc3\x01\x67\x93\x52\x06\x61\xe8\xc2\x06\x64\xa8\x39\xbc\xc9\x1c\xf4\x24\x62\x29\x64\x30\x86\xb7\x3f\xd5\xbe\xec\x19\xb5\x0d\x99\x7c\x72\xea\xf8\xeb\x65\xca\x1c\x0c\xc5\x7a\xa8\x50\xb8\x0c\xdd\xf4\xc5\xa5\x94\x64\x96\x1f\xbb\x09\xf7\x70\x61\xcc\xc4\x4a\x5a\x1f\xc0\x58\x54\xdc\xbd\x95\x29\xf5\xaf\x83\x81\xf2\xe2\xe6\x56\x42\x15\x2c\x93\xc9\x08\xc8\x20\x62\xcc\x32\x8a\xc7\x1f\xf3\xd2\x49\x20\x7f\xcf\xfb\x11\x43\x54\x99\x3b\x50\xb7\x60\xf0\x92\xc5\xa5\xeb\x62\x28\x06\xe3\xcf\xa1\xfb\x0f\xaf\x54\xe7\x6f\x62\x12\xe6\x45\xca\xbd\x74\xc1\x4f\x94\x4d\xde\xce\xdf\xc6\x64\x8a\x0a\xbb\xf3\x32\x6f\xf7\x1a\xdf\xf6\x50\xea\xbd\x2b\x7e\xdd\xc3\x50\x56\xbe\xb8\x6f\xc6\x46\xc6\x99\x03\xd5\xb5\xf5\x19\x0b\x7c\xc3\x62\x39\x06\x98\x04\x5c\x11\x2a\x2d\x57\x95\xd7\x3e\xbe\xee\xc3\xe3\x22\x09\x50\x20\x7a\xdf\x7d\xdf\x8c\x87\x2b\x09\x13\x0b\x40\x37\x75\x55\xb6\x58\xea\xe9\x0c\x4a\x42\xa1\x29\xa2\x74\xa8\xa1\xd4\xeb\xaa\x6c\x2a\x8b\xa0\xb5\x91\xb6\xbe\x5b\x14\x72\x02\xf5\x60\x81\xaa\x7d\xc0\xf7\x7b\xf8\x98\xf1\x53\x8b\x24\x02\x61\x55\x6d\x98\xcb\xe8\xb8\xbf\xc7\x61\x4c\x44\x47\xc4\xbc\x4f\x9a\xa1\x6e\x9a\xde\x54\x35\x91\x89\xf4\x9b\x42\x12\xc7\x9c\x22\x4e\xaf\xd8\x3f\x3f\x69\xb0\xd0\x18\x37\x58\xbb\x33\xc5\x05\x12\x26\x43\x14\x0b\x2b\xd3\xb1\x55\x70\xdc\x0e\xe0\x51\x91\x24\xb1\xe4\x4e\x05\x67\x96\xdd\xf5\x1d\x58\x98\x2a\xcf\x17\x46\x4c\x30\xb3\x31\x4a\x32\xab\xdd\xbd\x5a\xaf\x37\x4f\xbb\xfd\xe6\xcf\xf5\xf7\xd5\xc3\xb7\xcd\xd0\x2c\x28\x24\xbd\xc3\xa6\xfd\x1d\xf3\x6a\x12\xd9\x4b\xd2\x10\x78\x2f\xb3\x44\x40\x8a\xe9\xaf\xa7\xdc\x56\x3e\x0d\x75\x8a\xf7\x50\x7e\x4c\xdd\x4a\xef\x76\x25\x2c\x0c\xd4\x58\xc1\xaf\xf5\x25\x10\x22\x61\x09\x27\xf9\x5d\x2c\xdb\xfa\x63\x4c\x05\xef\xda\xb3\x20\xa5\x1d\xc0\x72\xe3\xb9\xc8\xbf\x6f\xe3\x29\x15\x68\xe6\x8d\x13\xc9\xf0\x0d\x22\x35\x34\x76\xcf\x48\xbc\x0d\x23\x9d\xfd\x05\x0b\x28\x11\xcc\x6a\x0e\x48\xec\x8e\x28\xaa\x26\xde\x1f\xb1\x7d\xf1\xa5\xca\x22\x11\xd2\x02\x79\x75\x75\x0d\x1f\xcd\x0d\x31\x2c\x6e\x40\xbd\x3c\x8e\xa9\x02\xfb\xb7\x85\x40\x44\x0e\xf8\xee\x70\x9f\xcb\x67\x53\x02\xb1\x61\x43\x1a\xc9\xde\x76\x94\xa4\x1b\x6c\xd6\x04\x38\x13\x7c\x14\xff\xba\xaa\x4a\x3d\xaa\x41\x17\x89\x0c\x24\xe5\x14\x9f\xb1\xc5\xf2\x50\x4d\x3e\xa5\x54\x92\xe0\x8c\x2e\x5b\x35\x11\x16\x76\x5d\x54\x14\x62\xd6\xf3\x44\x4f\x58\xee\xfe\x37\x1d\xd0\x27\xec\xff\x66\x6f\xa0\x74\x48\x41\xbd\xff\xd4\x1f\x16\xef\x7e\x8d\x2d\xe4\xc5\x92\xc3\x98\xe8\x34\x23\xfb\x97\x4a\xe4\xc9\x49\x73\x35\x69\xd3\x5b\x6a\xb0\x82\xbd\x3f\x37\x9b\x91\x73\x9f\x68\x63\xc8\xee\xf9\x76\xb3\xbe\xfd\xeb\x98\x51\x82\x81\x25\xc7\x6a\x5a\xa0\x03\xca\x9a\xac\x5e\x95\x67\xf9\x73\x98\x04\x29\xd3\x48\xd9\xc2\xcf\x6a\xa1\x97\xaa\xb4\x44\x62\x54\x0c\x16\x64\x89\x0a\x4b\x98\x2c\xa5\x34\x08\x02\xe2\xc8\x7e\xab\x5a\x32\x92\x5c\x6e\xd1\x13\x99\x5e\x80\x9a\xbf\x24\x55\xe8\x6e\x67\x19\xda\xf0\xa0\xb4\xf7\x23\xc6\xef\x91\x06\x22\x4e\xc7\x4c\x1f\x54\xac\xf4\x69\xe5\x89\x48\x03\x6d\x81\x85\xa7\x70\xaf\xcf\x63\x8e\x2b\x91\x06\x26\x06\x4f\x66\xf1\x56\xbd\x4f\x72\x0a\x69\x98\x5a\x0c\x15\x15\x27\x3c\xbe\x61\x1d\x07\x83\x09\x99\x86\x5c\x52\x69\x18\x45\xa2\x7c\xaa\xc8\xb5\x45\x99\x55\xe7\xef\x59\x1d\xa0\x5d\x60\xd9\x17\x69\xcc\x23\x8b\x22\xfd\xcf\x19\x6a\xfc\x99\x97\xcb\x15\x24\x22\x8d\x15\x78\x87\xd4\xd3\xcc\x3c\x57\xef\xeb\xaa\x70\x38\x97\x79\xea\xd9\x5f\x66\x12\x70\xf5\x67\x77\xd0\xb4\x8e\xec\x6f\x60\xed\x9e\x75\x4f\xc0\x92\x03\xaa\xfd\x3d\xfc\xca\x8f\xe7\xa3\x35\x41\x7c\xab\xb4\x52\x34\x44\xce\xfa\x84\xf5\x88\xaf\x43\xa4\xa9\x0c\x28\x75\x78\x2e\x5f\xaa\x62\x96\x09\x4a\x53\xc9\x60\x24\xbe\x30\x2d\x8b\x98\x7e\xfc\x54\x85\x24\xb8\x77\x0f\xad\x7a\x39\x02\x55\x57\xd6\xf8\x06\x79\x71\x01\x51\xfa\x12\xf7\x29\xd2\xd4\xd8\x18\x6f\x83\x45\xb1\x39\x1c\xfa\xd7\x48\x4d\x18\xa1\x37\xef\xb6\x50\xe0\x63\x3f\x1b\x58\x92\x32\x2b\x91\xb2\x86\x8b\x22\x68\x91\x32\x14\x64\x06\xdd\x7f\x68\xef\x93\xa5\x59\x9a\x09\x67\x93\xf8\x34\x4d\xd8\xb7\x31\x2b\xe2\xf9\x98\x17\x93\x6a\xef\x85\x94\xbb\x48\x33\x13\x88\x78\x5a\xe4\xde\xcd\xc5\x95\xc3\xb7\x2c\xb1\xb7\xb8\x2b\x79\x10\xa4\x3d\x7b\xd6\xa9\x2a\x7b\x24\x9b\x48\x39\xe7\x89\x8d\x01\x49\x52\x7b\x9b\x2c\xea\x54\x48\x4b\xae\xd1\x99\xb1\x96\xaa\x67\x81\x83\x5d\xa4\x20\x80\xe8\xaf\xb7\x67\x42\x2f\xfa\x7b\x83\xd2\x54\x50\x63\x79\x0a\xd7\x76\xa5\xbb\x36\xc9\x4c\x16\x8e\x0a\x6d\xaf\xaa\xea\xf5\x32\x0a\x99\x4a\xe1\xc8\xaf\x49\xbb\xfe\xc7\xbd\xbf\x5c\x45\x91\xa5\x9a\x25\x76\x71\xab\xca\x93\xab\x8f\x65\x68\xf9\x5f\xff\xe3\xee\xaa\x11\x3d\x16\xaf\xc6\xe6\xe5\x1a\x3e\x46\x54\x3a\x22\x45\xb0\xb2\xe2\xf7\xa8\xf3\xd7\x1c\xfa\x3f\x6b\x20\x2b\xe9\xfe\xf6\xe1\xf6\xe9\xf1\xf1\x6e\xbb\xbf\xbb\xfb\x63\x7f\x73\x7b\xb3\xda\x87\x43\x1f\xa4\x70\x97\xc3\x94\x2d\x58\xb7\x69\x67\x00\x5b\x8a\x8a\xb3\xbe\xb4\x02\x58\xa0\x02\x12\xac\x91\x67\x1f\x6e\x19\x23\x4a\xfc\x76\x3c\x13\x5a\x15\x2c\x40\xad\x09\x2e\x7b\xee\xb6\x5c\x6c\x16\x0b\x8e\x2e\x4f\x0f\x16\x98\x8c\x5b\xda\x36\x52\xf5\x9d\x9f\xf0\x2c\x8c\x64\x80\x3d\x34\x8c\xb8\xa7\x86\xe8\x0b\x0b\x93\x2c\xb5\x1c\xa2\x57\xd0\x60\xca\x89\x78\x0a\x67\xc5\x59\x61\xdf\x19\x13\x5b\x92\xd1\x76\xcf\xe7\x54\xa7\x46\xa1\x05\x16\x25\x3c\xc9\xfa\x7a\x93\x9f\x79\x59\xf6\x65\xc5\x82\x45\xa9\xa1\xad\xe3\x54\xbd\x62\x2d\xab\xfe\x19\x22\x65\xd7\x56\xb7\xeb\x8e\x24\x1d\x04\x8b\xb4\x20\x0c\xe0\xe2\x21\x37\x1d\xf4\xc8\xf0\x68\x22\x9a\x38\x82\x44\x0b\x16\x87\x9c\xac\x0a\x1f\xc6\x7f\x3c\xb7\x13\x19\x33\xc1\xe2\x58\x79\x76\xcf\xce\x40\x6d\x71\x1f\x8b\xbe\x2d\xd5\x14\x06\x1c\x78\x7d\x76\xd8\x19\xc0\x78\x0a\x67\x9f\x3e\x66\x69\x90\x38\x58\xed\x40\x3e\x2c\x58\x9c\x31\x2f\x9a\xd3\xbd\xa4\xfe\x94\x41\xd0\xf7\x17\x46\x3a\xb5\x13\xb5\x40\x76\x2f\x58\xac\x03\x4a\xa2\x52\x16\xa5\xf8\x78\x82\x8f\x2d\x8e\x4a\xea\xa6\x9d\x53\x1e\x59\x85\x8f\x17\x28\x4b\xa4\x1a\xfd\xea\xdc\x8f\x4d\x8a\x59\xaa\x7b\x73\x6a\x53\xce\xc1\xbe\x82\xb1\xc8\x86\xc8\x3a\x6f\x34\x57\x9b\xf6\x85\x08\xf8\x40\x16\x78\x61\x3d\xb3\x2c\x4a\x7c\x25\xcd\x7a\xfd\x7d\x8f\x3a\x6f\xfb\xb5\xc5\xb2\x38\xa6\x07\xd9\x3c\xad\x97\x36\xd1\xc9\xb4\xce\x32\xab\xc9\x7d\xc0\xf6\x3b\xc2\x45\xd6\x99\xf1\xd0\x56\x38\x1e\xb0\xdd\x17\xd0\xb4\xfb\x43\x51\x49\x28\xf6\x70\xee\x7e\x72\x94\x61\x64\x3c\x63\xd2\x05\x8e\xda\xc1\xbc\xf0\x8d\x3c\x4a\x99\xb7\xf6\x27\x00\x76\xc1\x3a\x2b\xab\xdf\xd2\x7e\x94\x14\x78\xeb\xa3\x7f\x4c\x9a\x8c\x42\xe9\x3f\xa1\x50\x2f\x30\xa1\x10\x13\x4c\xf1\x28\x1a\xc7\x9b\xfc\xc1\x3e\x1d\x58\x1d\xda\x25\x4f\x3f\x40\xda\x81\xbd\x9b\xc6\x30\xb3\x12\xe6\x36\x63\xea\x84\x0a\xfe\x01\x1a\x1d\x08\xef\x33\xf8\xa9\x60\xa8\x03\x42\xc8\x91\x23\xe4\xfe\x66\x4c\x26\x1c\xa1\xc3\x54\xa3\xcf\xd2\x52\xdc\xd3\xe1\x3c\xfd\xec\x59\x60\xac\x1d\xdf\xba\xda\x99\x41\xe1\x51\x64\x61\x02\x5a\xfa\x09\xfa\x7d\x52\x54\xe1\x7b\x70\x0b\x6d\x97\xe7\x8f\xdb\x92\x20\x85\xe3\x5c\x47\x16\x22\x12\x7e\xed\x54\x57\xc7\x6a\x3e\x8b\xba\x56\xb2\x75\x64\xae\xad\x92\x39\x7c\xe2\xb5\x67\x51\x1c\x11\xfb\xac\x63\xd8\xf5\xe8\x8a\x69\xa7\x38\x43\x2a\x96\xf7\x51\x74\x4a\x01\x7c\xa6\x89\x3a\xec\x66\x59\x8c\x3c\x73\xd9\xf8\x6d\xfe\x5f\xbc\xb9\x7d\x78\xd8\xfc\xcb\xbf\x41\x12\x46\x4a\xf6\x4c\xf7\x2e\x65\xd1\x8d\xd1\xd5\xf9\x63\xf6\xfb\x49\x9a\x91\x5c\x5b\x4d\x28\xaf\x8b\xdc\x63\xff\xda\x09\xcf\x2c\xae\x60\x11\x7b\xed\x3a\xa5\x18\x47\x92\x8e\x3e\xaa\xd1\xea\x3c\xe2\x45\x7a\x0e\x91\x11\xc3\x30\x7d\xc0\xd3\xf9\x64\xb3\xde\xb3\x07\x63\xa9\xc5\x2b\x22\xd1\x4e\xed\xce\x25\x3e\x5e\x96\x87\x8b\x8c\xc9\x80\x14\x9c\xee\x1e\xbf\xed\x9d\xe5\x60\xce\x05\xed\x38\x5f\x26\x50\x32\x26\xd1\xb2\xe5\xaf\xff\xe6\x69\x96\x75\x63\x45\x65\x0d\xcd\x7d\x7e\x55\x55\xba\x18\xd7\xda\x8b\x8c\xa7\x11\xd1\x9b\xbd\xe7\xa5\xb5\xa6\xe2\xa1\x25\xa5\xf2\x5e\xbf\x49\xaf\xca\x0f\x12\x79\xfe\x3a\x1d\x93\xf1\xcc\xee\xb4\x27\xf8\x40\x5c\xd5\x35\xcc\x87\x88\x73\xa9\x06\x32\xd0\x3e\x16\x90\x71\x91\x52\x6d\x5d\x37\xf9\x6d\x69\xf9\x5f\x0d\x86\xe0\xcc\x1b\xf0\x3f\x4e\xf3\x8d\x28\x13\x02\x53\x4f\xd3\xbd\xef\xf9\xe1\xf7\x14\xcd\x29\x0f\x3d\x5e\x2e\x03\x26\xa9\xbe\x8d\xb0\x01\xcf\xd8\x9c\x8b\xd6\x4b\xea\x5d\x32\xcc\xf6\x33\x0b\x24\xa3\x03\xf0\x0a\x2f\x33\xde\x7f\x61\x82\x7f\x32\x70\x32\x8e\x29\x54\x5b\x53\x10\xab\x3b\xec\x26\x21\xc4\x4c\x72\x19\x3a\xb4\xf6\xce\x0b\x7f\xdd\xe4\xb0\x0c\x1e\x16\x99\x14\x01\x29\x8d\x11\xbb\xc4\x38\xef\x3f\xfb\x1c\x1a\xa3\x6c\x20\x95\x71\x15\x6b\xbe\x04\x70\xda\x15\x1d\xc9\x43\x83\xad\x55\x3a\x6d\x3f\x48\x40\x50\x3b\xc5\x92\xff\x99\x96\xcb\x89\x0c\x79\x40\xcb\x54\x52\x45\xf1\x7d\xef\xcf\x67\x28\xac\x76\xc0\xe6\x79\x9d\x45\xe1\x54\x71\x5f\x64\x28\x2d\x5b\x01\xc1\x24\xee\x2a\x28\x1f\xcb\x2b\x7c\x81\xc2\x0c\xc2\xe0\xff\x33\x8b\x9e\xcf\x5e\x1e\x35\xc8\x81\xa2\xc0\xd2\xe6\x56\xb5\xc7\xbe\x4c\xf7\x55\x34\x9a\xaa\x5f\xd6\x95\xc6\x7b\xc8\x0b\x8a\xc3\x8d\xb7\x66\x13\x81\xb7\xd7\x1f\xe4\x03\x1c\xb1\x39\xc1\x00\x38\xcb\x0c\x04\x04\x22\x72\x01\x16\x6f\x88\x8c\x2d\xfa\xe9\x8a\x34\xc8\xe8\x43\x7a\x91\x33\x12\x37\xdb\xef\xbe\x3f\x6f\xb6\xdf\x7b\x31\x4c\xc1\x03\xc9\xb8\x2d\xb4\xf9\x5e\x15\xb9\x86\x8f\x5d\xa5\x3d\x79\x8a\xe0\x91\xb4\xf9\xdb\x1a\x41\xef\x9d\x69\x5d\x0d\xec\xde\xfd\xe3\xf1\x48\xa6\xb4\x0c\xfe\x5c\x43\x8d\x5f\xd4\xdc\xbb\xee\x31\x98\xc0\x69\x39\xff\x0b\xa1\xde\xbd\x57\x04\x8c\x3a\x15\xf9\xdc\x60\xe0\xb1\x4e\x49\x66\xa0\x73\xca\x3a\x5b\xf7\x06\x67\xd1\x1c\x9e\x44\x19\x32\x87\xaf\xba\xfa\x58\xbf\x74\x1b\xec\xdf\xc0\x57\xf1\xe5\x38\x0b\x4f\x98\x15\x4e\x6e\xaa\x62\x4f\x9c\xb9\xcb\x47\x18\x4f\x84\x15\x27\x3e\xc2\xaf\x2b\x6c\xaf\xf3\xb1\x19\xc0\x13\x61\x6f\x92\x37\xdb\xee\x33\x6e\x7e\xe5\x33\x2a\x65\xc1\x13\xe0\xc4\xcd\xe0\x22\x73\x70\x44\x62\xae\x9e\x82\xe8\x27\x93\x88\x27\x80\xc4\x64\x4d\xb8\xff\x1c\x27\x6a\x61\x82\xa7\x60\xe9\x03\x95\x9f\x1c\x9b\x52\x5f\xa3\x2a\xc0\xc6\x5b\x46\xc1\x11\x9e\x85\x11\x01\x35\xba\xf7\xab\x77\x2f\xb8\x45\x68\xa6\x34\xce\x82\x67\xc6\x32\xbd\xf6\xf2\x5b\x37\x77\xbf\x5f\xcf\xde\x81\x47\x10\x79\x16\x8f\x06\xfb\x1a\xec\x9b\x02\x0e\x23\xe4\x08\xe7\xa9\x74\x1c\xb9\x65\xde\xbc\x78\x05\x1a\xdf\x28\x81\xa8\xd9\x4f\x48\x6e\x8e\x8b\xae\x0f\x8b\xd0\x75\xeb\x9c\xec\xd0\x0b\x41\x58\x21\xd1\xbe\x80\xc5\x77\x51\x8c\x79\xc2\xf6\x85\x7a\x99\xd9\xf7\x03\x29\xa0\x37\x13\x69\x5b\x1e\x99\xfe\x1c\x0c\x27\xfc\xee\x3f\xf2\xe3\x88\x8e\x42\x70\x19\xa7\x9e\x4e\x68\x4b\x1a\xea\x84\xae\xeb\x9f\x47\x8f\xc1\x56\x5c\x6a\x57\x00\xe0\xb3\xda\xb3\x77\x52\xa1\x65\x89\x3e\xe6\x87\x1a\x5a\xec\xdc\x9b\xce\x27\xe8\xac\xfc\xfe\x24\x58\x00\x9c\x71\x95\x25\x51\x32\x89\x78\x58\x50\xe0\x74\x87\xe3\x3a\xc8\x08\xa3\x7d\x97\x1f\x5e\xda\x3b\x3c\x56\xa5\x8f\x15\xfb\x0e\xb1\x8a\x9d\xb1\xbe\xfa\x80\xb2\xbd\xae\xab\xbc\xdd\xa8\xaa\xac\x8e\xf9\x7f\xce\xb8\x77\x2e\x55\xd8\xf7\x17\x91\x94\x13\x8f\x8a\x62\x75\xcb\x93\x15\x45\x04\xc3\x8e\xf5\x54\x54\xed\x22\x5f\x9a\xef\x2d\x45\x6c\x01\xb5\xb5\xae\x76\x1e\x93\xc3\x4d\x20\x2c\x1c\x9e\xd8\xe8\x9a\xdb\x72\x24\x99\x2f\xb8\x89\xac\x7a\x8a\x3d\x55\xf6\x47\xf8\xb5\x87\x85\x18\x9f\x08\x02\x4d\x88\x7c\xfa\xd4\x57\xe7\x3a\xc7\xce\x5f\x68\xce\x43\xce\x5b\x04\xa1\xc4\x9e\x88\xb1\xea\xcc\xea\x31\xe0\xc4\x77\x8a\x63\xc1\x47\x89\x71\xe2\x0a\x5d\x51\xb5\xce\x70\xa3\x2c\x25\xe1\xe6\xe7\xcd\xf6\x62\x13\xfa\x8c\x11\xa6\xbb\xca\x96\xcd\x11\x5e\xd7\x92\x64\x8f\x63\xef\x22\x10\x26\x18\x8f\xfc\xcd\xb9\xd4\xbb\xea\x71\x90\xe7\x11\x22\x90\x99\xca\x46\xf5\x9f\xdf\xaa\xe2\x02\x44\x3e\xdd\xea\x44\xc8\x55\x62\xc6\x3b\xc6\x9c\xef\x59\x88\x50\x05\xa2\xa7\xd9\x6c\xd5\xcb\xf2\xe7\x13\x51\x1a\x90\x79\xb3\x7b\xbe\x7d\x5a\x7d\xf3\x78\x77\x11\x65\x28\x71\xfc\x4c\x63\xb2\xaf\x61\xa1\x88\x48\x5a\x24\x14\x92\xb5\x3b\x9b\xc7\x22\xc9\x38\x3d\x43\x55\xde\xae\x1f\x97\x0d\x11\x91\x48\x4b\x4e\xb1\xad\x94\x22\xfa\xdc\xe5\xcc\xa2\x48\xa4\xa2\x04\xf9\x76\x75\xb7\xd9\xaf\x57\x4f\xfb\x1f\x5b\x7f\x16\x8a\x54\x24\xc4\x7f\x70\xf3\xe3\xe1\x7a\x3f\xa5\x44\x17\x82\x05\xc2\x51\xef\x58\x0c\xba\xb3\xe3\x5d\xe9\xb5\xef\x94\x46\xe4\xdd\x02\x19\x57\xdd\x9e\x32\xf3\x69\x04\xc7\x88\x92\x28\x9b\xab\x51\xe6\x41\x88\x34\xa5\x62\x1f\x43\x30\xb1\x55\x61\x99\xc0\x2d\x74\xae\x9f\x59\x42\x30\x02\xc2\x5b\x88\xa5\xb1\xb5\x6f\x9f\xe0\x2b\x85\x90\x92\xf0\x95\xdb\x23\xd4\xad\x03\x7b\xfa\x1b\x41\x94\x48\x1b\xbc\x7f\xab\x5e\xf1\xc6\x53\xc3\xf8\x56\xcc\x22\x9f\xb9\xfd\xe4\xe6\x2a\x48\xa2\xd4\x1a\x89\x79\x79\x18\x3b\x88\x42\x31\x2b\xf8\xf4\x80\xef\x13\x86\x91\x2f\xa8\x77\x84\x50\x3a\x25\x9e\x17\xef\x34\xda\x33\xe0\x52\xab\xe9\xef\x85\x9d\x85\x66\x89\xd7\x05\xba\xab\xd4\xeb\x12\xcc\x5f\xe8\xcc\x6a\x65\xc1\x01\xf2\xb2\x69\xf7\x12\xca\x7d\x35\x3b\x73\x04\xc6\x8a\xe0\x27\x23\x2f\xd1\xe7\x98\xfd\xfb\x62\x16\x52\xf0\x79\x8d\xdd\x9c\x5d\x35\x39\x0c\x7e\xa2\xeb\x62\x58\x44\xbb\x94\x9f\xd6\x3d\x29\xdc\xc8\xd3\x17\x06\xb8\x9b\x5e\x9d\xaf\x49\x6a\x94\xd3\x67\x31\x9a\xeb\xbe\xd6\x09\xea\x8f\x3b\x2c\x0f\x5e\x8d\xb7\x6b\x95\xc4\xfc\xdb\xed\x4c\x37\x90\x17\x0f\x55\x7d\x84\xa2\x3f\x90\x9f\x07\x42\x36\x01\x61\xa4\x68\x9a\xdb\xe3\x6a\x3e\x94\x73\xfe\x8b\xc9\x53\x40\x18\x1b\x0a\x44\x3b\xcf\xb3\xdb\xff\x47\x67\x39\x84\x28\x28\x24\xb8\x3d\x42\x51\x38\xf1\x80\xa1\xad\x3f\x6c\x3c\x9b\xcd\xb5\x45\x8b\x74\xe7\xdd\xf4\x67\xa2\x84\x1b\x87\x85\x20\x63\xba\xdf\xe5\x20\x62\x01\xb3\x38\xea\x73\x83\x13\x0e\x91\xae\x2d\xa4\x7c\xfe\xde\x0e\xa2\x63\x49\xf5\x76\xf9\xfc\x27\x20\x93\x36\x60\x5c\x9a\xbc\x3e\x8e\xf3\xdf\x8e\x19\x5d\x40\x24\x53\x32\x8e\xf7\xae\x5e\x7e\x42\x96\xdc\xf7\x51\x44\x31\xbd\xfd\x28\xd5\x4b\x5d\x4d\xb0\x70\x5f\x26\xd9\x20\x42\xe9\x74\x43\x0b\xd2\x58\xb0\x41\xd7\xc9\x54\x86\xd8\x84\x8c\xf7\xe7\x9f\x25\xb7\xfe\x99\x97\xba\x7a\xf7\xdb\x02\x24\xa9\x53\x62\xa2\xc4\xce\xb7\xf3\xa2\xbb\xfe\x05\x1d\xe6\xd7\x8b\x09\x52\x48\xc8\x54\x27\xd6\xfc\xfd\xf6\xf1\x66\xb7\xef\xb5\xa2\x04\xa4\x46\xd3\x69\x67\xa1\x96\x54\xeb\x31\xf1\x27\x81\x21\x64\x1e\x0d\x4d\x88\x15\xdf\x90\x75\xce\x38\xe5\x45\x4e\xa0\x5e\x07\xbe\xb8\x69\x82\x04\x32\x11\x8a\x91\xe3\x68\xef\x3d\x7d\xc2\x4c\xc5\xb4\x32\xaa\xb2\xb3\x87\xbf\x0e\x1c\x40\xa6\x64\x68\x8b\xac\xda\x3a\xc7\x37\x74\x6c\x48\x5e\xa3\x64\x7c\xa2\x02\xcf\x24\xdd\x98\x60\x8b\xb3\x98\x31\x70\x91\x51\xb9\xd8\xd5\x39\x2f\x16\xb6\xaa\xbe\x97\xe5\x8b\x19\x49\x94\xcd\x2c\x0f\x10\x81\xa1\x52\x8d\xdb\xed\xfe\x7e\x75\xfb\xf0\xe0\xb9\x22\x04\x88\x30\xa1\xb8\xd2\x3e\x6f\x3c\x57\xb7\x5d\x0d\xb3\xe4\x1e\x08\xb4\x75\x92\x64\xce\xbb\x83\xa9\xbf\x3f\x64\x29\xc5\x10\x6f\x77\xd7\x55\x51\x40\xfd\xd7\xd1\x1c\x00\x09\x91\xdb\x40\xf7\xcd\x48\x7d\x5e\x80\x8a\x34\x39\x2d\xdb\xf3\x09\xeb\x5d\x4d\xb5\x7d\xcd\xf3\xae\x19\x54\xe0\x05\xa8\x38\xa6\x19\xb3\x69\xa1\x70\x55\x1a\x4e\x94\xe6\x93\x41\x52\x99\xcd\xef\xe4\xcd\x3d\x15\xee\x7c\xd2\x4d\x07\x51\x18\x8d\x82\xb3\x73\x90\x1d\x68\x6e\xb3\x18\x26\x37\xed\xcb\xfe\xfd\x13\xc8\x33\x68\x14\xd0\x0d\xb8\xb6\x02\x3f\x57\x9d\x47\x71\x11\x8b\x5b\x76\xf9\x01\x19\x8b\x1c\xaa\xcc\x22\x96\x2f\x61\xc0\xd3\xe1\xf5\xd7\x61\x4c\x47\xee\x7a\x3d\x3a\xf6\xc1\x04\x29\x65\x28\xba\xe3\xb7\xa8\x0e\xc3\x9f\x81\xa2\x65\x8f\x4f\x9b\x87\xf5\x8f\xdf\x7f\xb8\xea\x61\x21\x03\x61\xf5\x9a\xf3\x86\x94\x19\x67\xd3\x40\x06\x92\x8d\x74\x86\x9e\xba\xfd\x6c\x1c\x6e\x5e\x5a\xde\x32\x90\x2a\xed\x4b\xb8\x17\xf2\xf7\xe3\xc0\xaa\x0c\xa4\xa5\x25\xb3\x9a\x62\x6a\x40\x27\xc9\x28\xb4\x6a\xe9\x14\x07\x5a\x06\x1d\xca\x28\x0a\xa3\x60\xa4\x86\xf8\x29\x75\x8a\x90\x51\x62\x15\xa8\x40\xeb\xf5\xb9\xcd\xed\x29\x95\x04\xf3\x5e\x69\x44\x67\xc1\x11\x5e\xf1\x71\x09\x85\xfb\xf7\x62\x62\x32\x4a\x81\x18\x4b\xfe\xec\xf5\xcb\x27\xf3\x4a\x46\x2c\x23\xdd\x88\x5d\xae\xa8\xd9\x06\x28\x5d\x63\x1c\xdb\xdd\xe7\xa9\x70\x31\xc8\xcb\x62\x6b\xee\xbb\xa6\x19\x51\x97\xc3\xb9\x75\x40\xe7\xd9\x0f\xc5\x19\x50\x29\xbe\x99\xc7\x38\x64\x6c\x2c\xbb\x00\xb9\xb6\x52\xe6\x97\x5c\xde\xbd\xde\xc2\xf8\x9f\xbf\x88\x75\xc8\x34\x60\x96\xf7\x86\x9e\x66\xa8\x14\xf4\xcd\x29\x66\xc9\x20\xfd\xe0\xe2\x7b\x17\x4e\x82\x4c\x33\x4e\x03\x74\x3c\x17\xed\x4f\xfc\xc4\xc5\x93\xa9\x02\x62\x23\xec\x76\xe9\xde\x8c\x9a\x0e\x00\x0b\x05\x95\x61\x5f\x63\xa3\xea\x9c\x62\xda\xe4\x5a\x53\xd7\x05\x1e\x33\x21\x59\x1a\x2a\x4b\xaa\x47\xa0\x53\x6f\x63\x4d\x61\x6a\x92\xc9\xd0\xd2\x18\xd0\x7b\x5e\xe5\xcb\x0c\x30\x42\x66\x71\x48\x11\x73\x7b\x96\x76\x63\xdc\xf4\x45\xe0\x8b\x0b\x5b\x66\xb1\x8d\x02\xed\x65\xbc\x54\xc7\x2f\x64\x86\x8c\x78\xcf\xbe\x6d\x1e\x9e\x46\x6b\x5f\xf2\x00\x43\x39\x08\x23\xb8\x07\xbe\xa9\xab\xe3\xba\x3a\x1e\xab\x72\x9b\x1f\x4a\x20\xb6\xfc\xbf\xc2\x8a\xff\xd5\xdf\xc7\x2b\x98\xc7\x56\x6f\x80\xa2\x28\x57\x50\xbe\x7e\x4a\x1e\x2a\x24\x57\x48\xde\xee\x3b\xe6\xf3\x82\x47\xc9\xb5\x22\x73\xb5\x39\x97\x8d\x25\x07\xb5\x5b\xed\x58\x7e\x43\x48\x8e\x81\x19\xca\x20\xc6\x13\xe7\xcb\x43\x5a\x72\x64\xb1\x83\x1d\x3e\xdd\xda\x64\xa4\xcf\xea\x4a\x60\x49\x6a\xc7\xad\x73\x5e\xe6\x94\x5b\x42\x4a\x40\x02\x0d\x6e\x1f\x1e\x7b\xe7\x4d\x2a\x61\xe5\x07\xe9\x78\xbf\x5d\x3f\x4e\x70\xa0\x12\x21\x34\x76\x63\xca\x4b\x5d\x57\xa7\x89\xc0\x89\x90\x68\xa2\x2c\x19\x0a\x90\xab\x72\x5d\x55\xb5\xce\x4b\x68\xf1\xf3\xdd\x7f\x79\x09\x98\x20\xa6\x98\xda\xc3\xd5\xea\xb1\x2c\xf2\x12\xef\xe0\x5c\xaa\x97\xa7\xba\x3a\x56\xe3\x05\x65\xd2\x84\x38\x29\xef\x57\x0f\xdf\x57\xbb\xdd\xea\xe1\xe9\xf9\xf1\xcf\x7f\xfd\xdc\x7e\xff\xe9\xf3\x58\x2a\x50\x09\x05\x84\xdb\xea\x2a\x8e\x96\x57\x9c\x0a\x10\x08\x9a\x5c\x03\xd1\x22\x58\x69\xac\x69\x97\x90\xa7\x14\xc1\x1b\x4e\xcb\xfd\x09\xea\xf6\x63\x2f\xf7\x07\xec\x8d\x08\x15\x31\x41\xe4\xff\xd7\x9b\xbb\xdb\x3f\x36\xcf\x9b\xeb\xfd\xcd\x66\xb3\xbf\xb9\x5b\x7d\xeb\x7b\x64\xd2\x2a\x39\x9d\x65\xd3\x57\x24\x2e\x0f\x83\x8a\x38\x52\x9d\xf4\x76\xfb\xf4\xd4\x93\xb6\xcd\xb2\x31\xbe\xab\x48\xa4\xd3\x22\xbc\xa7\xda\xd2\xfe\xf7\x0c\x83\xc0\x2b\xd1\x95\x26\x3f\x78\x58\xd9\x67\x5f\x62\xf2\x04\x31\x8f\x28\x54\x78\x24\x62\xc1\xab\xf3\x85\xa2\xaf\xeb\x97\x70\x8b\x48\xc1\x92\x50\xc5\x3e\x2e\xa5\x52\x08\x2d\x29\x09\xd9\xe5\x7f\x60\xe3\xc1\x65\xbe\x5d\x6b\x17\x93\x6e\x5d\x05\xca\xbc\x5a\x70\x9e\xeb\x51\xa9\x89\x3d\xff\x80\xd3\xe3\xec\xb3\x47\x8a\x25\x96\x40\xaf\xc1\xf6\xe9\xf1\xf1\xce\x2e\x89\x74\x52\x28\xa9\x58\x16\xd8\x59\x6c\xf3\xdd\x8e\x5c\x60\x8a\x96\x75\x5d\xb3\x38\x64\xa2\x07\xfd\xd0\x5a\xe8\xbc\x38\x1f\xe7\x53\x99\x60\xc4\x7f\x4f\xe2\x22\x9f\x9d\xa5\x93\x1f\xcf\x84\xa2\x87\xff\xfe\x8f\xef\x97\x7a\xa7\xc3\x70\x66\x02\x09\xc4\x6c\x45\x69\x27\x67\x91\xca\x20\xa6\x14\xe2\x5d\x75\xb0\x3a\x8a\x5f\xe7\xe5\x54\x26\x99\x1f\xaf\x7b\xf8\xb5\x1d\x40\xea\x4a\x70\xf0\x3c\xd4\xeb\x71\x40\xbd\xff\x29\x61\x0c\x41\xed\x2d\x73\x0b\xf1\x3c\x4d\x9f\x05\x18\x72\x36\x0a\xf6\x5c\x81\xd7\x04\x12\x0a\x14\x32\x9b\xc9\x03\xfd\x6b\x9c\xe5\x54\x60\x32\x0a\x8f\x76\xf6\xc8\xf6\x1d\x2e\xc8\x81\xa7\x87\xaf\x52\x1c\x08\x41\xfc\x6d\xa2\xd5\x2f\x94\xd2\x9a\x92\x7e\xf6\x10\x7a\x46\xb3\x88\x09\x53\x5a\x68\xd9\xed\x69\xbf\xe7\xef\xf9\xe8\x60\x51\x5a\x23\xe9\x88\xa3\xb2\xac\x84\x53\xcb\x76\x7a\x7c\x2a\x8c\x2d\x23\xb8\x46\x49\x24\xd6\x93\xfd\x5b\x61\x66\xb9\xe3\x1d\xdd\xf4\xfa\x05\xba\xb3\x15\x27\x78\xc7\xd0\x7f\x0f\x34\x81\xec\x4d\xc0\x3e\x77\xb8\x54\x5a\xa2\x8c\x4a\x59\xf7\xe8\x9b\xdd\xf7\xcd\x33\x94\x03\x5c\x5f\x07\x81\x09\xc7\x04\x94\xcb\x11\xe6\x99\xdc\xa2\xd0\x41\xe7\x87\x92\x60\x47\x5b\xbd\x8e\x07\x53\x07\x5c\x59\x27\x9b\x50\x86\x87\x6a\xa8\xce\xd4\xa1\x11\xe4\x76\x80\x6a\xbb\x3d\x60\x02\x2c\xd2\x51\x10\x5b\xea\x64\x57\x69\x83\x34\xc7\x8a\x62\x09\x43\xaa\xa3\x00\x52\xe3\xd3\x64\xe7\x66\x0e\xaa\xd0\x51\xc8\x8c\xd3\x42\x33\x63\x0f\x53\x47\x2c\x48\x7b\x90\xde\x1a\xd4\x8b\xe3\x74\x7d\xc6\x53\x55\x53\xbc\xb4\xb1\x4c\x58\xbe\xbf\xc4\x38\xf0\xb4\x55\x3d\x8d\xe4\xea\xdc\x56\x65\x75\xac\xce\xcd\x85\x96\xda\xf4\x39\xe2\x50\x90\x19\xe4\xb0\x88\x3f\x2e\x9f\x34\x0e\xad\x78\xd0\xba\xaa\x27\x00\x6f\x1d\x27\x31\xa5\x70\x5c\x71\x78\x3c\x2e\x0e\xd7\x49\xc4\xd1\xf1\xf8\x4d\x8b\xf2\x2f\x16\xc0\x45\x2e\x43\x27\x18\x91\x87\x4c\xf5\xdd\xdd\x08\xdf\x8d\x52\x65\xcb\x4b\x5f\xa7\xa1\x52\xae\x7c\x97\xa0\xf4\x79\x79\x70\x02\xe6\xae\x03\x63\x86\x3a\xa0\x31\x48\xda\xdc\x36\x98\x3e\x62\x97\xea\x97\xa3\x8b\xf5\x68\xee\x22\x68\xdd\x8e\xbd\x7e\x7c\x7a\x19\x56\xbc\xe6\x5a\x91\xd3\x7b\xb5\xf1\x5c\xb9\x42\x83\xb6\x15\xcc\x44\x55\xb3\xab\xce\xf5\x5f\xd3\xd5\x68\x09\x11\x11\x00\xcd\xf4\xd4\x3f\x79\x49\x95\x22\x4d\x1a\xa7\xeb\x3a\xab\xa6\x5f\x3c\xae\xb4\x0e\xe3\xc4\xf2\x9e\x51\x36\xf2\x63\x94\xd1\xd2\x3a\xb1\x35\x35\x79\xd3\x99\x6b\x79\x79\xbb\x7e\x24\xb6\xf7\xd9\x5c\x46\x48\xe3\x71\x1a\xe1\x21\x57\xaf\xe5\x8c\xc7\x4c\x68\x13\xb2\x80\x7b\xc1\xdf\xf2\xb0\x48\x97\x83\x41\xc4\xa5\x9d\x16\x6f\x79\x83\x75\x4f\x58\xb9\x38\x39\x31\x50\x59\x1a\xf6\x73\x9b\x02\x1d\xd3\x08\xf2\x97\xc3\x85\x61\x10\x73\xc7\x2f\xec\xee\x6b\x2a\x75\x6e\x14\xd4\xda\x33\xd0\x0b\x0c\x91\x93\xb7\x8b\x23\x22\xad\x9b\x1f\xbb\x3f\x7d\x7b\x14\xa4\x91\xa3\x85\x23\x4d\xc5\xd9\xf2\xc0\x28\x4a\xe9\x0b\xe6\xcd\xfa\xdc\xb4\xd5\x11\xeb\xef\xd0\x5c\xd8\xa0\x18\xb1\x98\xd0\x0e\x23\x6f\x71\x39\x0c\x3e\xbd\x2c\x0e\x42\x32\x97\xcb\x1e\x82\xb9\xab\x9e\x60\x5a\xfc\x8b\x71\x68\x49\xf4\xdd\xa5\x0f\x55\x6b\xc9\x78\x06\x1d\x2c\x81\x71\x6c\x6b\x49\x36\xbf\xff\xde\xff\x29\x71\xb5\x42\xcd\x6d\x79\x93\x97\xb6\x46\x6d\xb8\x40\xa4\xe8\x68\x92\x1e\xcb\xed\x47\xd9\xbe\x60\x93\x77\xb3\xd9\x73\xa4\x2c\x8f\x79\x0c\x46\x48\x07\xd6\xee\x1c\xab\x79\x44\x02\x63\x04\x1e\x7b\x56\xe7\x87\xca\x5a\x6a\xf5\x11\xf5\x72\x21\x34\x26\x89\x22\xc4\x57\x55\x83\x2a\xf2\xff\xe2\xde\xe9\x44\xed\xcb\xa1\x6c\x1c\x13\x66\x93\x4a\xff\x3c\x3b\xa9\xff\xdf\x96\x4c\x12\x4c\xb4\x0a\xb9\x97\x4c\xdc\x7d\x5f\x06\x5b\x61\x1a\xa5\xc6\xea\xd3\x91\x54\xea\x7a\x89\x27\x5f\x60\x1a\x2b\x18\x94\x59\x88\x43\xcc\xc2\x71\x97\x5f\x23\x4d\x14\x15\x27\xee\x5b\x78\xc5\x47\x63\x28\x9c\x3f\xf1\xc7\x7d\x47\xb0\x34\x25\x57\x9b\xdd\xf6\x9f\x3f\x06\xe2\x15\x64\xa1\x8d\x2a\x1c\xf3\xb2\xed\xac\xcb\xcf\x51\x4a\xb3\x9f\x66\xa9\x4c\xfc\x36\xd6\x3c\x63\xd9\x5e\x7d\xac\xda\x6a\xfa\xeb\x3d\x3d\x16\x66\x46\x13\x8b\xbc\x41\x1c\x71\x07\x20\x4f\x14\x81\x00\x37\x7f\xee\xf6\xeb\xc7\xfb\xa7\xd5\xc3\xbf\x2c\x0f\xf9\x7e\xf7\xf3\xb1\xef\x94\x86\x34\x26\xfb\x81\x99\x67\xd9\x88\x46\x2e\x84\x27\xea\xbe\x00\xd1\xf9\x2e\x52\x53\x8e\xe4\x35\x2f\x8a\x7b\x6c\x5e\x48\xc7\xe0\x62\xb3\x5b\x5c\x35\x5c\x87\x60\x4b\x98\xcf\xa5\x0e\x37\xa5\x1e\x01\x1d\x50\xa0\x26\xf0\xd6\x15\xa8\xd7\xf3\x69\x0e\xf8\x9a\xde\x08\x98\xdd\xae\xbc\xed\xb1\x21\xec\x91\x2d\x1e\x3d\x5f\xca\x1e\xf8\xab\xa4\xa1\xb5\x2e\x7b\x91\x97\xe9\x34\x94\x71\x22\xc2\xde\x4c\xcd\x8f\xe7\xa3\x03\x85\xfa\x47\x94\x69\xa2\x2d\xa8\xa3\x7a\xf5\x40\xa7\x3f\xf2\x8b\x5a\x3c\x94\x60\x67\xea\x9f\xee\x7f\x41\xf4\x19\xd6\x10\x15\xe3\x10\x8f\x08\x69\x3e\x59\xbe\x0a\x14\x38\x96\xcc\x45\xcd\xed\x59\x6f\x65\xc5\x83\x1b\x5f\x45\x48\xbb\xdb\x34\xd0\x82\x1a\x32\xca\x2d\xfd\xbb\xa9\x4a\x57\x7a\xf5\x39\x58\x18\xb5\x64\x2c\xf0\xe5\x2c\x37\x36\x1f\x34\x7b\x6b\x8d\x11\x05\x4e\xb7\xb6\x0e\xa1\x6a\xa7\x07\x11\x1a\x67\x5a\xed\xb0\x69\xa3\x7f\xf8\xc7\x30\xc2\xd6\x2f\x3d\xbd\x60\x99\xff\xfa\x9b\x20\x46\x34\x10\x65\xde\xa5\x2c\x2e\x92\x52\x26\x48\xd3\x28\x1c\xb9\xca\x76\x5d\x4e\xea\x95\x4c\xc8\x52\x0a\x47\x8d\xa8\xc3\x16\x19\x87\xa7\x63\x6b\x62\x16\x45\x5e\x51\xe6\xa5\x33\x51\xc7\xd2\x26\x83\xd2\xc9\xf8\x69\x4d\x92\x71\xcb\xfb\x4a\x28\x64\x32\x4b\x1f\xcd\x4f\xcc\x9f\x20\xd7\xbb\x8a\xf6\x28\xff\x54\x89\x86\xcc\x6b\x00\x9f\x15\x36\xcd\x3c\x1b\x66\x12\x8d\x04\x4f\x33\xb9\x0b\x01\x76\x36\xa5\xbf\x3c\x95\x4c\xb2\x9e\xeb\xaf\x46\x68\xce\x5e\x09\x49\x18\x16\x33\x8b\x3a\x72\x42\x14\x56\x4c\xba\x8f\x5e\xcd\x4c\x7f\xc3\x92\x88\x20\x2f\x8e\x1c\x31\xea\x6f\x93\x48\xaa\xa1\x57\x50\xa8\xdd\x9c\x62\xc5\x30\x66\x65\xe7\xf3\xe6\xc6\x16\x43\xdc\x58\x08\x5d\x7f\x82\x99\x2c\x06\xda\x40\x0c\xf6\x4e\xba\xe1\x68\x29\xe1\x28\x70\xf3\x0e\xf5\x9c\x0b\x76\xba\x92\x8d\x88\x5d\x8d\x5a\xe7\xeb\x34\xdb\xaa\xf0\x66\x83\x11\x29\xb2\x41\x73\xb2\xc1\x21\x8d\x65\x64\x18\x24\xb4\x0b\x2a\x28\x8a\x67\x54\xf9\x69\x5c\xfa\xf8\x75\x4c\xce\xff\x7f\x1f\x72\x33\x32\x89\x09\x46\x97\x97\x39\x29\x0a\x6c\x71\xb6\x0b\x18\x15\x24\xc6\xa3\xb2\x4c\xdb\x8d\x86\x0b\x56\x7d\x69\x18\x1a\x25\x32\xca\x52\x3a\x1e\x57\x2c\x50\x7e\x12\xa2\x19\x15\x60\xfe\x2f\x73\xb1\x09\xa3\xa3\x20\xe8\xde\xf2\x9f\x4f\xdb\xcd\xd8\x2d\x30\xda\x15\x08\x5b\x59\xf6\x5f\x79\xfb\x71\x53\xd5\x57\xad\x72\x23\xfd\x54\xa3\xc9\x89\x7c\xc6\xa5\xab\x27\x30\x3c\x7f\x0f\x95\x3a\xe2\xa1\x76\xf3\xeb\x44\x61\x46\x5b\x4e\x32\xeb\x86\x9a\xb2\x3b\x63\xcf\xda\x37\x99\x88\xe8\x8d\x1e\xff\xd8\x3c\xaf\xee\xee\xb6\x03\xbe\xd1\x18\x6e\x68\xd7\xb4\x21\x05\xed\x92\x3d\x9f\x9d\xa5\x13\xdb\xc0\x18\x19\xd1\x31\xee\x06\xcd\x85\x96\xb7\xaa\xfb\xc2\xf9\x54\x0e\x58\x18\xa3\x33\xcf\xcb\xf7\x00\x47\x2c\xb0\xe9\xdc\x02\x35\xf0\xff\x19\x83\x56\x40\xd3\xef\x1f\x8f\xc5\x34\xd8\x05\x41\x10\x18\xe7\x64\xa1\xa7\x34\xfa\xcd\x37\x25\x0c\x5c\xd3\xad\xb2\xae\x99\xc5\xef\x37\xb3\x7b\x84\xa9\x25\xf8\xf2\xa7\xd8\xc9\x2a\x02\x2d\x4d\x0b\x08\x42\x4c\x63\x97\x9e\x5c\x75\x7e\x52\xee\xe2\x83\xa1\xef\x10\x45\x36\x12\x5b\xe2\xbb\xa3\xcc\x2f\xbc\xf7\x0a\x41\x94\xe8\x70\xfc\x42\x1e\xb6\xf1\x05\xf1\x17\x04\x51\x26\xa9\x72\x99\x0c\xfc\xeb\xea\xbd\xdc\x55\x9b\x72\x54\x59\xe3\xbb\x41\xa4\xdc\xd9\xf4\x87\xf3\xc0\xe7\xa3\x15\x87\x19\xfd\xfc\xf7\xd5\xf3\xf5\x90\x93\x86\x20\x4e\x51\x1b\x67\xf8\x59\x3b\x9a\xf6\x92\x5d\xb5\x2a\x8a\x05\x2b\x0c\x82\x58\x21\xf7\x5a\x8b\x57\x04\x72\x5a\x88\xd2\x2d\xfd\x97\xbb\x3e\x0d\x63\x9a\x27\x56\xc1\xf3\xfe\x71\x77\x83\xe8\x5d\x98\xdf\xa6\x6f\x9f\xc6\x4c\x98\xde\x1a\x70\x96\x7d\x7f\x23\x16\x48\x65\xdd\x8b\xc7\xf2\x6e\x8e\x8c\x86\x80\x45\x40\xac\x36\x77\xd5\xc1\x32\x8b\xcd\xdb\x33\x64\x63\x5d\x24\xcf\x1a\x36\x1d\xb6\x4c\x48\x4a\xd9\xaf\x8e\xd8\xbe\x7c\x34\xed\x10\x3b\x82\x20\x43\x5b\x1c\x93\xab\xea\xb6\xb9\xa4\x53\x80\x80\x07\x28\xac\xc8\x80\xac\x4a\x7d\x53\x57\xc7\x1f\x65\xf7\x5f\x9f\xd8\x7e\x10\x70\xa1\x09\x86\xec\x5a\xdd\x36\x30\x7d\x22\x11\x33\xc2\x2a\x29\x6f\x84\xe0\x7d\x73\x98\x90\xe3\xf6\x23\x04\x71\x46\x6e\x4c\x89\xef\x7b\xef\xd6\x41\x00\xa8\x08\xf8\x31\x10\x05\x5c\x6f\xfe\xdc\x5d\x7e\xc5\xd9\xb3\x69\x16\x53\xed\x01\x31\xe0\x4e\xc1\xa4\x5d\x63\x42\x14\x29\x8e\xe0\x96\x72\x25\xae\x09\x83\x24\xb4\xb0\x20\x3c\xf5\x9c\xdb\x10\x60\x94\xd0\x81\x8c\xed\x0b\xd6\x3d\xd7\x7c\xbf\xbb\x43\x60\xc2\x88\xac\xed\x43\x0d\x1e\x71\x70\xf5\x61\x69\xbb\xbf\x32\x0f\x20\x30\x69\x4a\x19\xf5\x81\xcd\x11\xd8\x25\x99\x23\x84\x41\x1a\x93\xb5\x6b\xa5\x00\x09\x98\xea\xb1\xdc\x10\x06\x60\x29\x8e\x0f\xd8\xee\x5f\x72\xad\xb1\xdc\x3b\x43\x74\x36\xc8\x61\x08\x40\xd6\xc8\xf1\xdc\xe6\x5b\xeb\x3d\x51\x4d\x39\x1c\xa7\xda\x8f\x33\xbb\x13\xc2\x50\x32\xe2\x60\x58\x95\x15\x15\xe0\x0f\x46\xd0\xd7\x2f\x18\x46\x11\x12\x62\x6b\xfb\xb4\x59\xef\x9e\x7d\x15\x2a\x84\x11\x0a\xc2\xd3\x51\x81\xb7\x05\xd9\x7e\x5a\x85\x0b\x61\x9c\xa8\xc0\x62\xd9\x6f\x6a\xec\xc9\xbd\x9c\x8e\xa6\xbf\x65\xc2\x02\xf0\x28\xba\xfe\x45\x42\xf6\x7f\x8b\x07\x27\x84\x89\x34\x14\x51\x91\x79\x59\x1d\xf3\x4f\xea\x99\x20\x4c\x03\x1b\xc5\x72\x68\xa2\x55\xa9\x1d\x35\x94\x2f\x2a\xf8\x04\x90\x3e\xf3\x1f\xff\x37\xf2\x1a\xf9\x51\x2f\xd6\x3a\xfd\x4f\xff\x7b\x19\x27\xd3\xc6\x02\x06\x47\xa0\x58\x08\x53\xe9\xc4\x8b\xad\xc8\x50\x0f\xac\xf1\xc0\xf9\xb0\x7f\x66\xcc\x48\xfb\xd3\xa1\x8f\xbb\xc5\x7c\x87\x07\x50\x1f\xcf\x78\x9a\x42\x30\x21\x64\x2a\x0d\xd1\x45\x38\x3f\x1e\x3b\xef\xdc\x9f\x6b\x10\x32\xe4\xa1\x15\x68\x6d\xb1\x3e\xe6\x25\x3e\xdd\x5e\x4f\x57\x78\x67\xa3\xe3\x04\x68\xba\x6d\xab\xd3\x68\x69\x84\x19\xcb\x5c\x82\xb6\x3b\x60\x56\x7a\xd9\x47\x83\x30\xe3\x5a\xd8\x1d\xb2\x2f\x66\x9c\x6e\x82\x21\x0f\x0c\xfa\x9a\xf3\x7f\x9e\x81\x7c\x38\xff\xa4\x22\x40\x1a\xb5\x3b\xc4\x7a\xaa\x95\x07\x21\xb0\x38\x1d\x24\x7b\x1f\xf0\xfd\x19\xdf\xf2\xa6\x57\x84\xf2\x5c\x5c\xce\x38\x80\x50\x41\x28\x5c\xe5\xe9\xfe\xe4\x72\x6b\xdd\x82\x1a\x81\xb7\x5d\x4f\x2d\x20\xd3\x03\x86\x8b\xce\xa2\xde\x45\x85\x10\x03\x8e\xce\x4a\x75\x53\x75\xf9\xfc\x1c\x82\xdf\xfe\xc2\x2c\x8c\x03\x57\xb5\x4a\x65\xd4\x33\x63\x1b\xa2\x40\x82\x1e\xc3\x6f\x6f\x4b\x55\x1d\x97\x29\x1a\x20\x0a\x50\x68\xd3\x53\xfb\x90\x60\xc0\xe4\x8d\xa3\x50\x49\x82\xe1\xbe\xd9\x88\x2b\xc9\x5e\xfd\xe6\xdb\xd0\xa2\xe0\x64\x81\xa0\x5e\x46\xb6\x3b\x44\x11\xa4\x74\x64\xb8\x98\x64\xcf\xad\x34\x1a\x83\x28\x02\x41\xd5\xdb\xb6\x1c\xd0\xbe\xff\xac\x02\x00\xa2\x38\x52\xbe\x56\xd8\xa1\xb6\xe8\xad\x6f\xcb\x09\x0c\x10\xa2\x38\x16\xc2\x13\x79\xe7\xb6\x2a\xfe\xea\xe3\x12\xd7\x01\x51\x9c\xc5\x94\xed\x6f\xce\x27\x22\x99\xeb\xcf\xc1\xa8\x73\x26\xe2\xbe\x7a\xac\xdf\x4a\x66\xc2\x55\xae\x73\xa2\x33\xaa\x4c\xd0\xd5\xf6\x9c\xab\x5c\xf7\x6f\x95\x46\x09\x55\xfb\x5a\xb0\x24\x7d\xdc\xab\xf3\x47\xdf\xea\x4a\x97\x2d\x58\xd1\xd1\xc9\x5b\xfd\xb6\xe9\xfd\x53\xa6\x01\xfa\x0f\xe3\xf8\x04\x51\x9d\xfb\xa2\x8e\x19\x64\xd3\x5f\x96\x19\xa7\x10\x88\xea\xf5\xe6\xdd\x3b\x3f\x8e\xba\xdb\x3f\x05\x4b\x32\xda\xb2\x41\xeb\x7b\x6c\x1a\x38\xe0\xae\xfa\xe7\x19\xcf\x73\xbf\x7d\x3a\x57\x78\xac\x33\x5b\xf5\x76\x3c\x15\x94\x07\xf7\x0d\x42\x87\x43\x51\x8b\xb5\x52\xbe\x55\x50\x4c\x74\x4f\x20\x12\x2c\x20\x46\xe5\xf2\x7c\x1c\x40\x01\xfd\x4d\x84\x8a\x89\x1e\xe2\x7e\x7d\xb5\xfa\x1b\x81\x53\x88\x84\x31\x64\x80\x59\x35\x5e\x22\xda\xfb\x64\x50\x20\xb0\xe4\xac\xf7\xeb\xed\xc8\x8f\x81\x48\x26\x4a\xbb\x61\x58\x1d\x6a\xc4\xd9\xd4\x97\xc2\x62\x57\xbf\xfd\x5a\x43\x41\xbb\xce\xd5\x87\x45\x8f\x75\x3b\xeb\x25\x1d\x39\x44\x52\x25\x54\xee\x69\x7a\x3e\x60\xd7\x40\x79\x4e\x2b\xbe\xd3\x0c\x0e\x2c\x44\x9a\x67\x3c\xf1\x1c\xe5\x14\xf1\x1f\x95\x44\xb9\x3e\x26\xb4\xce\xf3\x55\xde\xfe\xf3\x9c\xab\xd7\x53\x7f\xba\x47\x86\x21\x29\x8d\x0d\xca\x6d\xb6\x8e\x72\x9a\x8f\x19\x7f\xc4\x38\x08\x12\x22\x41\xbd\x87\xfa\xf5\x19\xc1\x7f\x9c\x38\x08\x34\x1b\xbe\xa1\x2b\x67\x9b\xe6\xbd\xa6\xd3\x21\x0e\x92\x94\x92\x6c\xbd\x67\xf3\x86\xb5\x29\x06\x39\x69\xdf\x8d\x31\x4a\xfb\x7f\xdb\xf6\xc7\xcb\xec\x3e\x4a\x93\x9b\x7f\xaa\x9a\xd6\xba\xb5\x33\x2e\x39\xd7\x2f\x0c\x25\x8d\xd5\x36\xef\xbc\xce\xce\xdd\x72\x15\x85\xfe\x15\xc2\x24\x22\x33\xd1\x92\xd8\xee\x7e\xed\xa0\x79\x25\xf2\xf9\xe5\xbd\x2f\x0e\x13\x49\x98\x77\x67\xed\xcc\x9e\x3b\x14\x56\xec\xf9\xe1\xff\x1b\xcf\x99\x38\x8a\x25\xcd\x99\xdc\x29\x6e\x7f\x8a\x67\x83\x38\x82\xb8\xf7\x30\xdc\x48\x7e\x45\xf6\x03\x71\x1c\x6b\xda\xdb\x77\x58\xe0\x3b\xbc\xe1\xc8\x48\x8f\x63\x57\xfb\x7e\xc0\x16\xea\x83\xaf\xce\x81\x38\x49\x2c\x83\xfe\x75\x0d\x87\x19\x3b\xb6\xef\x21\x74\xe4\xc5\xf7\x4f\x58\x5e\xe5\xba\xb9\xfa\xb8\xcb\xcb\xd9\x74\x8f\x13\x13\x88\x81\x6e\x56\xbb\xf0\xb1\x87\xb4\x4d\xef\x99\x66\x32\xb4\x54\x9b\x6b\xcf\xe6\x42\x81\x99\x3e\x46\x02\x31\x8b\x85\xc0\xc1\x07\xe8\x1f\x98\xa5\x96\xb2\x0b\xcf\x35\x69\x07\xe9\xa1\x21\x09\x1c\xd9\xdd\x4f\xcc\xfd\xbe\x10\x67\xb1\xa6\x40\xc1\xc4\x5e\xff\x3c\xe1\xc8\x67\xf2\x86\x10\x67\x29\x50\x51\x17\xa1\x9f\x9a\x59\x2d\x6f\xe7\x5a\x28\x9a\x9f\xfb\x23\x1c\x72\x35\x9b\x73\x19\x08\x72\x64\x7e\xff\xbe\x9e\xcc\x02\x0e\x01\x55\x65\xd8\x64\xbb\x05\x9b\xcf\x83\xa8\xfd\xc0\x72\x29\x88\x69\xcc\x9c\x3b\xcb\x62\xfd\x92\xcb\xfc\xaf\x00\xa4\x97\xd5\x42\x10\x83\xb4\x2a\x42\x9d\x9f\xd8\x63\xfc\x67\xdf\x1a\x8c\x2d\x7e\x3d\x78\x9a\x80\x87\x4a\xe3\x27\x4e\x79\x2c\x83\x98\xde\xfc\xe9\x6e\xb5\xbb\x79\x7c\xbe\xdf\xdf\xfc\x78\xb8\xbe\x7d\xf8\xb6\xb7\x6a\x0a\xfe\x5d\xa5\x48\x09\x7b\x65\x0f\xb4\x3e\xd9\x3c\xbb\x97\x0a\xa8\xc0\xde\x20\xae\x2b\x22\xfe\x9d\xc4\x88\xa1\x5b\x35\x34\x7f\x09\xa8\x42\xe7\x5e\x67\x9a\x4e\x9f\x5e\xe9\x80\x00\x50\x8a\x98\xc4\x3c\xbe\x6c\xf6\x4b\x3a\x8c\x08\x72\x54\x3a\x64\xf5\x6d\x8b\xc7\x66\xc2\x78\x00\xb1\x4e\xa3\xd8\x8c\x84\xb4\xee\xaa\xee\xd3\x4e\x7f\x0c\x13\x61\x1c\xd5\x0a\xd6\x50\x38\xe4\x8c\x63\x5a\x98\x3d\x3c\x72\xf4\xdb\xf4\xea\xdc\xbe\x54\xdd\xd6\x5e\xcf\x9e\x0b\x35\x50\x1f\x4a\xb2\x5b\xd8\xf7\x4d\x55\x5b\xb1\x77\xbf\x61\xc7\x26\x8b\x32\x31\x31\xb7\x9e\x89\xd7\xec\xe2\x6e\x86\x47\x71\x2f\xe5\x74\x29\xe4\x00\xb1\xd1\x26\xb0\x24\xfd\x47\xc8\xcb\x89\xa8\x08\x24\x41\x64\x31\x29\xd6\xac\x25\x15\x6f\x2b\x14\xe2\x23\xcc\xa3\x8c\xfc\x74\x65\x27\x81\x4a\x89\xb3\xd4\x27\x4b\xff\xba\x2e\x1f\x92\x30\xe1\x1a\x3d\x49\x16\x15\xcc\x34\x44\x45\x06\xc5\x18\x6c\x30\xbb\x28\x62\x9c\x98\xe1\x74\x45\xda\x4e\x8b\x27\x77\x12\x99\x4c\x0f\x6e\xcd\xf6\xa5\x9a\x06\x01\x21\x49\xb2\x98\x84\x90\xb6\xa7\x02\x4b\xdd\xbb\x89\x61\xc4\xff\xe7\xab\x7f\xe7\x2b\xef\xab\xfe\x9f\x45\x75\x3f\xf9\xd7\x3d\x58\x1a\x31\x22\x0e\xbb\xab\xd4\x2b\xd1\x47\xdb\x56\xbb\x88\x66\x2f\x91\x82\x21\x14\x82\x95\x4e\x72\x13\xc3\xa6\xe9\x97\x52\x8d\x90\xa4\x3a\x46\x33\xf2\x1e\xba\xfd\xec\x8a\x48\x06\x47\x94\xdf\x5f\x7f\x33\x16\x27\x54\x12\xe7\xc4\x2f\xeb\x0f\x92\x24\x69\x96\x72\xfa\x90\x64\x81\x14\x83\xd5\xea\x35\xd1\xf2\x0b\xfa\x19\x48\x32\x8d\x74\xa6\xda\xb2\x41\xff\x47\x64\x24\x62\x54\xae\xcf\xf5\x5b\x6f\x36\x26\xdc\x70\x35\x30\x6d\x74\xde\x3b\x81\x71\x2e\x26\xcc\x0c\xf8\x03\x89\x90\x22\x75\x27\xd5\xfd\xc7\xa8\x88\xc4\x35\x43\x62\xeb\xf1\x5e\xaa\xf7\xfe\x4f\x22\x72\x9e\xec\x5b\xf5\x8a\x2e\xb7\xea\xdb\x94\xa0\xf0\x97\xe7\x90\xdc\xb4\x2f\x97\x4c\x89\x90\xc8\x98\x51\x9c\x8d\x36\xb7\x0b\xde\x4a\x48\x64\x92\x12\x02\x4b\x55\x8e\xd4\xd3\xdf\x5f\xa6\x16\x3a\xa6\xf3\x86\x8e\xa0\x11\x16\x08\x12\xc9\x18\x95\x80\x36\x2d\xbc\x62\xff\x47\x91\x10\xaa\xe1\x05\x6a\xdd\xfd\xd2\xf6\xfe\xa2\xaa\xd4\xf7\x44\x85\x5e\xbc\x12\x55\xdb\x79\xf3\xa3\x22\xc2\x4f\x2e\x52\x61\x28\x9d\xef\xf9\xfd\x43\xd7\xd5\xb6\x85\xd7\xbc\x3c\xdc\xe7\x65\x7e\x3c\x1f\x67\xaf\xa5\x24\x27\x92\xb3\xab\x1a\x5f\xaa\xbe\xd8\xd8\x96\x41\xf8\x6d\x2d\x51\x12\x68\x33\xda\x76\x4e\x9a\x85\x48\xf4\x5c\x5b\x2c\x71\xbc\x54\x33\x38\xba\xd3\xb5\x83\x44\x2b\x45\x70\xf4\x5d\x3d\x57\xf7\x98\xfb\xc2\x9f\x25\xf1\x20\xd1\x18\x0a\x5b\x48\xd7\x59\x91\x53\xc3\x26\xc1\x38\x26\xfa\x9a\x1a\x5a\xdc\x5f\xed\xd6\x7d\xf1\x27\x24\x86\x09\x61\x8b\x09\x7e\xd9\x2d\xbb\x6f\x00\x9b\xe0\x3d\xc2\x2f\x96\xf8\xf7\x38\x0f\x65\x62\x90\x06\x81\xd5\xae\x26\xe0\x16\x14\x7f\xc2\xb9\xee\xec\xb5\x7e\x5e\xa5\x41\x00\xb4\xc1\xfd\xe3\xf1\x5f\x63\xdb\x21\x0d\xc2\x70\xa0\x39\x26\x0e\x9a\x31\x08\x0d\xd2\x40\x29\x4f\xa6\xd4\x2b\xea\x8c\x08\xd3\x20\x0d\x99\xa5\xf5\x76\x8a\x0c\x3d\x4c\x7b\xc4\x0b\x08\x69\xc8\x25\x95\x28\x9a\x73\x49\x73\xa1\xb3\x97\x93\xe9\xc0\xa4\xa1\x8e\x12\x36\xa9\x28\x1f\x67\x37\x20\x8d\x52\x8b\x13\x24\x66\xd0\x19\xef\x30\xa4\x71\x28\x3c\x75\xe8\x75\xde\x9c\xce\x2d\x52\xda\xf9\xda\x41\x72\xb7\xb6\x78\xbb\xef\x9d\x49\x02\x81\x6a\x2c\xf2\xb7\xcf\x0e\x85\x34\xe6\x21\x51\x14\x38\xfc\x5d\xd5\xbf\x4e\x1a\x2a\x5a\x44\xdf\xa1\x96\x55\x3d\xaf\x2c\xfa\xcc\x98\xfa\x3b\xe8\x09\x48\x53\x61\x61\xbb\xf9\xb7\x32\x6f\x87\x11\x4c\x4d\x48\x4b\xd3\xd5\xd1\x5e\xd5\xf0\x06\x9e\x7f\x10\x52\x16\xc9\xcc\xbd\xfd\xe3\x7b\xb9\x00\xb8\x85\x34\x8b\x91\x34\x5b\xf6\x12\x74\xe7\x61\xf7\xb0\x5b\x7f\x8f\x4c\x80\x54\x17\x95\xf5\x37\x15\x31\x3c\x62\x0d\x84\x51\xfd\x24\x10\x94\x66\x68\x19\x9f\xfa\x2a\xeb\x73\xae\x67\x07\x4b\xca\x59\x40\x34\x1a\x04\xb9\x5c\xf7\xa6\x9b\x6b\x95\x51\x40\x85\x8e\xce\x6d\xf7\x5a\xd7\x4b\x39\x73\x1f\x3e\x4c\x65\x2a\xe9\x40\xc6\xd2\x12\xd8\x4d\xe6\x8b\xce\x62\xdd\x2b\xd2\x9e\x4e\xce\xe6\xf0\x8d\x9a\x05\x16\x15\x74\x2e\x5f\xa3\xdb\xc6\x66\xc8\x5d\x23\x46\x96\x49\xc8\x3e\xca\x57\xd4\xdd\x90\xa2\x8a\x88\x52\xbb\xc0\x63\x55\x36\xd7\x75\x75\x3a\xa1\xde\x55\xbb\x17\xfc\x59\xd5\xc5\x70\x4b\xb4\x68\xc0\xcd\x23\x91\x71\xf8\x3f\x9b\x38\xa2\x74\x8a\x2b\x97\x22\x0c\x42\x8d\xff\x71\xcd\x2c\x08\x14\x66\x2e\x8d\xb4\xb8\x19\xf9\x7e\x59\x40\x90\x87\xbd\x77\xbd\xe7\xdf\x69\xf9\xd8\x65\x61\x14\x38\x71\xc3\xea\xb4\x7b\xc9\xcb\x6e\xe3\xfd\x6d\xde\x85\x6b\x07\xfb\xbe\xbb\xfb\x63\x01\xf5\x0d\x2c\x4c\x6d\xfc\xa6\xce\xd5\xcb\x35\xb4\x20\x3d\x6b\xd9\xe8\x2e\x59\x6c\x73\xbf\x50\x28\xf7\x21\xa6\x6f\x10\x72\x4d\x29\xb9\xb6\xce\x0f\x07\xac\x9f\x1b\x57\x47\x38\xd0\xf8\x03\x0b\xb5\x24\x1b\xd9\x1b\xf4\x3f\xab\xfa\xf5\x79\x2a\x54\x37\x89\x6c\xfb\x69\xc2\xa2\x30\x08\xf9\x48\x03\xe5\x42\xe4\xe4\xff\x7c\xc7\x28\x21\x7c\x49\x77\x60\xbd\x41\xdb\x07\xdd\xfc\xbe\xc1\x22\x10\x24\x31\xe4\x0c\x93\x4b\x81\xa4\xc9\x41\xc0\x22\xa5\x2d\xc9\xa8\x8d\x15\xae\xe1\x34\xde\x15\x59\x64\x18\x73\x18\x99\x55\x51\x3c\x61\xf1\x96\x2b\xdf\x16\x6b\xee\xe0\xdf\x4d\x75\xae\xfb\x19\xc3\x92\xd4\x6e\x3d\x07\xcb\xe5\xda\x3d\xa1\x7a\xe9\x5b\xd3\x30\x21\xca\xa9\x47\xad\x47\xee\x3a\x63\x42\x13\x94\x8b\xe6\xd0\x1f\x36\x76\xfa\x97\xdb\xd5\x60\x6d\x30\xa6\x80\x2c\xbc\x75\x55\x9c\xef\x2a\x05\x85\x0d\x7e\x5e\x70\x71\x9e\x27\xe2\x9e\x93\xa1\xc8\xa2\xcc\x96\x35\xa9\xc9\xae\xc3\xb2\xc4\xe6\x95\x2c\xae\xe1\xbf\xe8\x71\x5c\xfe\x6c\xef\x87\x3e\xcb\x98\x60\x9e\x34\xad\xcf\x16\xcc\xa6\x51\x06\x01\xa9\x37\x76\xd6\x8d\x2c\x2e\xbf\x1f\x17\x01\x39\x99\xdd\x1e\x57\xc3\x7b\xe7\xf4\xb9\x16\x11\x5b\x36\x4b\x8f\x21\x69\xd4\x19\x97\x68\x94\x80\x09\x11\x11\x51\xc4\x56\xbd\x1c\x51\xbd\x16\xc3\x2d\x40\x7a\x71\xe8\xce\x0d\xf4\x12\x05\x89\x6f\xd6\x92\xae\x3b\x9e\x8b\x36\xbf\xfe\x28\xe1\x38\x38\xf8\xff\x1b\xfd\x5f\x3f\x09\x21\x48\x28\x8b\xff\x47\xde\x9c\xa1\xd8\xa1\x7a\x29\xab\xa2\x3a\x7c\x8c\x8f\x6d\x06\x11\x50\xf9\x04\x45\x73\x9a\xce\x76\x1a\xe9\x22\x03\x83\x24\x26\x88\xc6\x91\xb4\x20\xf2\xf2\x60\x81\x52\xb3\xaa\xb9\xae\x9f\x9d\xa0\x43\xd6\x72\xc4\xf5\x0b\x0c\x64\xca\x1c\xf7\x9f\x2d\x8b\x9d\x70\x3d\x4d\x8e\x6f\xa6\xb5\x71\xc8\xa5\x52\x7f\xc2\xda\x00\x0c\x63\x2d\xb8\xdb\x07\xd6\x3d\xe1\xfc\x6c\xb3\x40\x19\x87\xdc\x9b\x1c\x65\xcf\xc7\x33\xeb\x65\xb8\x65\xc1\xd9\xdd\x6e\x9e\x23\xab\x21\xee\x1f\xdb\x48\x20\xf7\xdf\x2d\x3b\x1b\xed\x7a\x46\x85\xf9\x1b\x6a\x17\xd9\x0c\x69\x25\x86\xfc\xda\xab\x54\xf8\x6b\x8d\xa2\xf8\xcc\x37\x6c\xaf\x3a\x5b\xaa\x39\x17\xde\x94\xcf\x82\xc4\xb2\x59\x12\xe3\x74\x67\xe3\x5f\x41\xdb\x16\xa3\x0a\xac\x61\xc9\x64\x01\x02\xd5\xf6\x7f\xa3\x97\xc0\xfa\x47\xe9\x8a\x62\x3a\xcb\x65\x9c\x6f\x75\xfd\xc3\x20\xd1\x23\x92\xf4\x02\x0e\xfe\x57\xc3\x98\x33\x33\xb3\x9d\xa2\xa9\xed\x94\x45\x51\x68\x45\xea\xb0\xe9\x99\x0d\x06\xf5\x59\xc8\x22\x65\xeb\x39\x4e\xf5\x84\x41\xe2\xc9\xaa\xab\x4f\x47\x36\x8b\xa3\x0c\x1c\x02\x79\x45\x8c\x7d\x77\xa4\x7d\xb0\xf8\x45\xb3\x38\x89\xa5\x53\x09\xbf\xc2\x12\x4d\xae\x72\xa8\x2f\x4a\x99\x96\x6d\x9d\x2c\x96\x01\x90\x1d\xf5\x71\x1a\x93\xf5\x41\x96\x04\xe0\x77\x46\x6b\x6c\x4e\x07\x2b\x81\x8c\xa8\xad\xf6\x5e\xb6\x6a\xde\x2e\x83\x74\x00\x84\x5d\x63\x93\x1f\xe6\x6a\x92\x90\x25\xca\x76\xb2\x23\x6e\x03\x54\xe5\x5c\x07\x04\xb2\x34\x08\xb9\x45\x57\x75\xf3\xb5\xfd\x0e\xcd\xcb\x6c\xf0\xd3\x48\xc5\xa1\x03\x81\xac\x57\x4f\x7b\xa2\x29\xd8\xee\x9f\x9e\x37\xfb\x21\x02\x99\xa5\xcc\x92\x7c\x83\xd6\x77\x78\xc8\xdb\x67\x50\xb8\xe8\xdf\x66\x2c\x32\x59\x3c\x11\xf3\x7a\x86\xff\xde\x96\x4d\x4b\x36\xf1\xf4\xe9\x58\x62\xab\xf4\x46\x64\x18\x33\x14\x41\xc6\x20\xe2\x8e\xfe\x80\x92\xb4\xcd\x2e\x2f\x8a\x7b\x68\xdb\x17\x7c\x1f\xfa\x48\x0a\x2f\xef\xb1\x86\x06\x1f\x46\xa3\x30\x04\x30\xa7\xeb\x3d\xcb\x12\x41\x16\x0d\xd1\xa2\x3f\x77\xd6\x0b\xd5\xed\xec\xde\xfb\x49\x97\x25\x32\x19\xdb\x84\x7f\x73\x52\x64\x99\xa2\xb9\xbc\x5f\xef\xad\xdd\xb3\xab\x5a\xbc\xcb\xff\x73\xb6\x36\xf8\xb8\x30\x12\xb2\x4c\x89\xd0\x4d\xbf\x87\xaa\xc5\x89\x70\x1f\x64\x5c\x58\x36\x7d\x4b\xb4\xb9\x2a\xf5\x3d\xfc\xa2\x75\xdf\x99\xb5\x7f\x95\xcb\xcf\x38\xc6\x14\x3d\xb0\x13\xe4\xb6\x59\xb5\xad\xcd\x20\x2d\x77\x17\x71\x48\x1a\xdd\x4f\x45\x75\x6e\x2b\xbf\xa1\x64\x02\xd2\xd4\xc2\x97\x50\x37\x4e\x4b\xeb\xc6\x1e\x76\xe3\xad\x38\x83\xd0\x4a\x1b\x6c\x1a\x05\x27\xfc\x0e\xa4\x44\x55\xcc\xf1\xec\x90\x41\x1c\x50\xf9\x3f\xd5\xa8\xf5\xa9\x6c\xa8\x87\x18\x42\x06\x69\x44\x70\xde\xef\xd0\xac\x61\x66\x1d\xf5\xdf\x4f\x6a\x2b\x94\x97\x37\xf7\xf9\xaf\x6f\xc3\xd2\x93\x68\x08\x3e\x4a\x39\xbb\x1f\x8d\x8b\x6e\x7b\x8f\x6c\x3a\x53\x95\x88\x88\x96\xf9\xae\x3a\xfc\x44\x7c\xed\x19\xcf\xe6\x21\xa2\x4c\x47\x91\x74\xf9\xd0\x8d\x15\x42\xfa\x6d\xde\xc1\x4a\x8b\x14\xd5\x21\x2f\xa7\x1f\x51\x73\x4d\x44\x2c\xeb\xe2\x2c\x27\x9b\x04\x32\x1b\x0c\x68\xb0\x2d\xf1\xdd\x42\x9a\xe7\xd4\x7c\x90\x99\x14\xfd\x78\xd1\xd9\xf6\xa3\xb4\x19\xde\xaf\xe1\x20\x99\x91\x99\x70\x3a\xd0\xed\xb7\x1a\xb1\xfc\x44\xcb\xcc\x76\xe7\x81\xd4\x44\x57\xd1\x59\x5d\x7f\xe4\x45\x01\x3b\x28\x3c\x1c\x82\xc7\x01\xd0\xbd\xee\x30\x3f\xf6\x8f\xcf\xe3\x24\x46\x1c\xf0\x1a\x14\xaa\xd0\x39\x94\x16\x21\x3e\xdd\x63\x78\xcc\x6d\x39\x45\xef\x9c\x75\xce\xd8\xe4\x63\xf0\x24\x0a\x92\x3e\x7b\xf7\x96\x2b\x24\x95\xa4\x51\xcc\x9e\x27\x8c\x1b\x5b\x1e\xb7\xab\x1e\x8d\x59\xbf\x40\x5e\x2e\x6e\x41\x3c\x31\x41\x10\x79\x51\x18\xef\x50\x4f\x07\x96\xa7\x41\x22\x3d\xcd\xd2\x57\xee\xef\x70\x28\xf2\x8c\x21\x77\x20\xe0\xfb\xeb\xd5\xd3\xd3\xf8\x3a\xdf\x85\xa7\x91\xeb\x52\xbc\x15\x0f\xd5\xb1\x5b\x2a\x16\xf2\x33\x9e\x15\x9c\xa7\x36\x5d\x9f\x37\x96\x77\xf6\x09\xf2\x05\xbd\xd2\xbf\xf2\xbd\xdd\xcd\x20\xb0\xfc\x35\xa7\x3a\xff\x2f\xde\x57\x25\x7e\x90\x4d\xe5\xbf\x14\x64\x22\x70\x31\x10\x89\x96\xf6\x80\x0c\xdd\xcb\x54\x14\x07\x95\x86\x96\x14\xfa\xf7\xfc\x3d\x9f\x8d\x98\x0c\x98\xc0\xa1\x9c\x6a\xa2\xae\x03\x5c\x42\x62\x58\x1f\x80\x7c\xb6\xc5\x20\x93\x72\xdd\xd1\x48\x4a\xa5\x44\xd8\xa3\x92\xc6\xa4\x76\xae\x83\x4a\x03\x82\x33\x39\xde\x04\xac\xf7\xa0\xf5\xde\x3b\xdd\xd3\x7d\x92\xeb\x10\xc9\x96\x52\xc4\xe7\x65\x01\x8b\xfe\xb1\x34\x43\x02\xa5\xbc\xe5\xf8\xfe\xfb\xbf\xd6\x36\x9d\x39\x07\x42\x72\x74\x14\x99\x1a\xa1\x7d\x71\x42\x8a\x6f\xfe\x16\x26\x4c\xf9\x20\xb5\xe9\xb8\xc4\x3f\x73\x51\xfd\x35\xda\xa6\xf7\xbb\x1d\xc3\x3d\xf4\xba\x6a\x3e\xc5\x18\x8f\x18\x06\x40\x04\xb1\xa6\x52\xfb\xbb\xcd\xbf\xae\x56\x9b\x67\x57\x30\x07\x22\x0c\x6d\x46\xf3\x40\x32\x59\x8e\xe7\x7d\xf2\xb3\x22\x4c\x62\x8a\xbe\xac\xd7\xdf\xff\x8a\x42\x14\x44\xa8\xa5\xc8\x88\xf5\xe7\x01\xdf\xbd\x40\xd9\x22\x15\x21\x88\x28\xc8\xa8\xda\xfb\xe7\xea\xee\x6e\xb3\xdb\xef\x36\x2b\x8f\x30\x13\x51\x68\xab\x2f\x56\x4d\x0e\xbe\x44\x7e\xe4\xbd\x89\x28\x8d\xc9\x1e\xbb\x3a\xd7\xe5\xfd\x6c\xbd\x88\x08\x52\x8a\x35\xfe\xeb\x0c\xe5\x0e\xf2\xbf\x57\x67\x00\x22\x09\x32\x4a\x73\x83\x6c\x6c\x08\xf5\x5c\x7a\xd7\x53\x24\x20\xc9\x9e\xd9\x9f\xbd\xc4\xfa\x27\xef\x94\x86\xa9\x47\xc3\x6c\xde\xa0\x38\xd3\x79\xe6\xc0\x2e\xdb\xf6\xac\xb1\x6c\x6f\xaf\xc7\xa5\x63\x20\x52\x6e\x0b\x5c\xec\x17\xa5\xd0\xca\x48\x48\x70\x76\x7b\x88\x29\x86\x5d\xa0\x69\xd3\x6c\x3a\xbf\xbb\x46\xf2\x74\x89\x22\xee\x7c\x21\x7a\x02\x82\xc5\x01\xc5\xdd\xbb\x79\x4f\x85\x52\x63\xe2\x3f\xdf\x47\x87\x4c\x4f\x4a\xe4\x07\x17\x69\x97\x1f\xb1\x18\x97\x0a\x4e\xde\x83\x69\x43\xfc\x38\x52\xbe\x8f\xed\x11\xc1\xba\x79\xeb\xc0\xe8\x9d\x91\xbf\x34\x6d\xb8\x4a\x3d\xff\xbc\x3b\x0c\x5d\x61\xfe\x79\x0a\x82\x14\x1c\x4d\x3c\xd4\xc8\x77\x4e\x83\xb7\x2a\x84\x72\xe1\x5c\xaa\x74\xf6\x0a\x69\x93\x10\x97\x50\x99\xa6\x90\xf0\x11\x7e\x0d\x30\x8e\xab\x8f\xc5\x0d\x9f\xea\xd1\xbb\xf9\xf0\x62\x85\xf1\x47\x12\x08\x20\x34\xb7\xbc\x94\xa3\x6c\xcb\xe3\x79\x68\x95\x29\x71\x98\xf6\x64\x47\x0b\x06\xbb\xc0\x2c\xb1\x20\xca\xce\x7e\x3a\x17\x38\x24\xd9\x92\x45\x6b\x90\xfb\xeb\x84\x26\xf2\x5f\xda\x98\xd7\x55\x55\xe8\xea\xbd\x9c\xf9\x2b\x02\x25\x12\xf4\x5e\xa3\x73\xcb\xe6\xed\x08\x54\xd0\x7d\x7b\x3c\x75\x8f\x94\x7b\x03\x55\x18\xc1\x88\xe2\xc7\x19\xec\x53\x62\x31\x80\x20\x4c\x7c\x62\x87\x0c\xb6\x05\xfc\x09\xf7\x5d\x63\xc1\xc0\x59\x0b\x37\x75\x75\xfc\x8c\x24\x12\x20\x40\x30\x72\x24\x39\x59\xff\x68\xce\x50\xe7\xd5\x5f\x29\x31\xb9\xcb\x23\xd0\xe4\x18\x75\x9e\x8f\xb5\x78\x6e\x3f\xb1\x47\x21\x66\x9a\x52\xd3\xdf\xb0\xdd\x3a\x9a\xe6\xbd\x0f\x55\x8f\x9f\x3d\x36\x21\x99\x51\x03\x93\xde\x67\x7b\xec\xec\xfe\x26\xa3\xe1\xe9\x4e\xe0\x19\xcb\x3f\x40\x12\xa7\xc4\xbc\x7a\xbd\x9d\xec\x75\x90\x70\xc6\xc1\xad\x8f\x73\x8b\x54\x6f\xfe\x5c\x55\x9f\x56\x5b\x2f\x81\xde\xfd\xad\x04\xa3\x1c\xfe\xe9\x05\x1a\x8c\xbc\x65\xdf\x8b\x30\x00\xa4\x21\x52\x36\xf6\x0d\xce\x45\x3b\x8e\x6b\x40\x6a\x12\x32\x84\xec\x2e\x64\x5f\x1c\xdb\x36\x2f\x0f\xcd\x98\x57\xe0\xf2\x9d\x53\x83\x14\x25\x7a\x81\xe6\x65\x71\x21\x01\x0b\xad\xa0\xf0\x8d\x7d\x6f\x42\x31\xf8\x9f\x65\x2c\xe0\x56\x3a\x89\xdc\xee\x21\x91\x3e\x4a\x04\xfb\xae\x2a\xa1\x12\x8a\x9e\x13\x45\xf6\x99\x99\x39\x28\x11\x98\x09\xbc\x00\xc9\x33\x6a\x3c\x9e\xac\x42\xa0\xc5\xf1\x4d\x6f\x9b\x85\x9c\x64\x7b\xbd\x63\xec\x6c\x83\xf5\x6a\x77\x4d\x51\x41\xda\xf9\x96\x5f\x2c\x4b\x22\x82\x34\xee\xb0\x69\xff\xf4\x6f\xc4\x05\x72\x5f\x12\xb2\x7e\xa4\xfa\x8d\x7e\x0a\x88\x80\x13\x52\xcc\xd4\xd5\x7f\xb1\x24\xe5\xe5\x11\xde\x12\x44\x9c\x7a\x11\x04\x0f\x54\x27\x68\x61\xfd\x69\xb1\x6f\x77\x4d\x46\x20\x7b\xa7\x19\xda\xcf\xd8\x7f\xdc\x7f\xb2\xda\x44\x62\x91\x41\xa4\xcd\x92\x97\xdb\x16\x66\x44\x10\xd0\xad\x13\x3a\xf1\x6f\xb0\xdf\x5d\xbb\xb9\x1d\x39\xcf\x82\xaa\xf0\xb7\x23\x31\xab\xd9\x2f\x40\x66\xb5\xe1\x7b\xc3\x3c\x3f\xf5\xb7\x91\x71\x1c\x30\x4f\x80\x3a\xaa\x5d\x99\x0e\xac\x4c\x32\xba\xc3\x0f\x62\x21\xbc\x7e\xdc\x8d\x64\x71\x00\x54\x12\x93\x63\xb4\x5b\xfd\xbe\xf1\xf7\x55\x19\x23\x81\x2a\xfb\x15\x9d\xcc\x66\x5f\x24\xbf\x14\x7e\x05\x54\x96\x1c\xf7\x35\x2f\x0f\xdf\x0a\xd0\xf9\xc8\xf2\x04\x54\x29\xa5\x01\x96\xf5\xed\x2f\x16\x9e\x09\x39\x05\xf1\x88\xc1\x68\x61\xc3\x05\x13\x47\x74\x70\x1f\xe1\x97\x4d\xc2\x61\xd1\xa3\x04\x65\x08\xbd\xe2\xb8\x87\x07\x2c\x4e\x38\x19\xca\x8c\x2c\xd8\x7b\x62\x47\xad\x11\xdb\x41\xd8\xf7\xb3\x98\xf5\x67\x29\xb7\x2f\xd1\x11\x32\xc4\x8c\x92\x41\x54\xbe\x4b\xe6\xff\x75\xf5\x5e\xc6\xdb\x9b\xe9\x7b\xc9\x28\xb0\x81\xb1\x9b\x02\x1a\x0f\x27\x90\x91\x56\xa8\x7c\x31\xd1\xba\x27\xc5\xec\x3e\x7e\x46\x3b\x01\x68\xdd\x33\xa5\xf1\xcf\x95\xa9\x40\xc6\xd2\x10\x02\xa1\x39\x15\xb9\xdb\xaf\x26\xed\x89\x8a\x29\x89\xba\xdd\xad\x9e\x77\x84\x8c\xfa\xe7\x8f\xdb\xe7\xe7\xcd\x9d\xff\xc5\x34\x00\x8f\x3a\x76\x02\xf2\xd3\x1b\xa4\xa9\xf2\x1e\xe2\x98\x73\x92\xdc\x87\xee\xc4\x9a\xbe\x6d\xca\x22\xc2\xa9\x96\xf8\xab\x1d\x0b\xdf\x76\x2d\xa9\xb7\xcd\xb7\x94\x9c\xb0\x64\x7c\x90\x5f\xa2\x33\xff\x67\x76\x4f\x6e\x47\x5a\x55\x85\x76\x9a\xb9\xff\x42\xe8\xe3\xf3\x92\x25\x8a\xec\x04\x39\x84\x12\xc9\x76\xd9\xe6\x3e\x1c\x2a\xb3\x30\xa4\x6d\x65\xaf\x09\xab\xd4\x8c\x49\x68\x41\xf2\xd0\x82\xb6\xbe\x3d\x7a\x06\x68\x90\x5c\xd8\xe4\xa8\x27\xa6\xfd\x9e\xb7\xee\x1c\x5c\xc3\xe9\xa9\xc6\x81\xc6\xa4\xbf\x02\x19\x45\x95\xfe\x73\xc6\xfa\x43\xda\x6d\x37\x1a\x1a\x91\xd8\xd4\xbe\x57\x65\xb7\x67\x36\x8e\x1f\xe0\x76\xfd\x58\xe3\xe1\x5c\x4c\x70\xc4\x52\x30\x46\x81\xf8\x02\x9a\xd1\x60\xff\xc4\xdc\x77\xe8\x6c\x1c\xd2\x81\xcc\x6b\x87\x3a\xf7\x2d\xd2\x58\x86\x9a\x3d\x45\xf7\xcf\x75\x61\xe9\xb8\xaf\x51\xc1\x47\x1f\x69\xf1\x75\xf4\x20\x55\x14\xd2\x66\xd3\x58\x00\xf8\xac\x7a\x42\x2a\x13\x5b\xe9\xcb\x17\x74\x19\x83\x6e\x8d\x4f\x07\x4f\x07\x61\xcc\x06\x8e\xf2\xa1\x42\x1c\xa4\x8e\xc1\x92\xc0\x9e\x8f\xc7\x27\xa8\x5b\x47\x1f\xdc\xac\x4a\x3d\xf8\x94\xbe\x2f\xc7\xc4\x9d\x47\xd5\x28\xdd\x25\x35\xe8\xa4\xd7\xc1\x5d\x43\xa3\x40\x5b\xba\x1f\x9f\x59\xf5\xfd\x4c\x46\x21\xf8\xab\xd5\x6e\x77\xb7\xd9\x3f\x3d\xde\x3e\xec\xf6\xd7\x9b\xf5\xed\xfd\xea\xce\xc7\xf8\x25\x46\xd1\x28\x5d\xbc\xc3\x23\xa1\x1e\xcf\xf5\xc4\xb6\x91\x88\x01\xa1\xb2\xf1\x98\xb7\xcf\x77\xeb\xd9\x0c\x37\x71\x60\x8d\xde\x51\x4c\x77\x3a\x61\x55\x90\xd9\xe8\x6f\x43\x90\xe8\x1a\xa9\x6c\x60\x1a\x9b\x51\x81\x41\x50\xbd\x5b\x49\xd9\x2b\x0f\x92\xf7\x63\xa2\xc2\x24\xa0\x39\xb8\xdd\x6c\xae\x07\xb8\xe4\xd0\x48\x06\x76\x9f\x85\xa9\xea\xb1\x01\xae\x42\x16\x93\x89\xfd\x8c\xa7\x69\x16\x78\xd1\x2d\x53\xa1\x00\xca\xc7\x7e\xc3\x72\xfd\x92\x9f\x28\x7a\xbf\xff\x86\x25\x2e\x68\x21\xcd\x5e\x37\x4a\x99\xe6\x93\x1d\xa2\x07\x7d\x3c\x55\x4d\x7b\xaa\x4a\x22\xdb\x76\x5a\x48\x13\x15\x4d\x50\x91\x89\xa9\x5e\xf2\x5f\x79\xa9\x5e\xd0\xe5\x9c\x96\x33\xd6\x2a\x0e\x2d\x1a\x21\x57\xd5\x14\x70\xa2\x62\xa1\x93\x21\x2c\x7f\x0d\xf5\x6b\x59\x69\xbc\xc6\xba\x0f\xee\xac\x3e\xc9\x2e\xa9\x18\x22\x4a\x10\x93\x86\x1a\x79\x0c\x05\xe4\x33\x08\x91\x4a\xa2\x30\x73\xf4\xa9\xb3\xe2\xc4\xd9\xdd\x12\x26\x3d\x03\xed\xcf\x91\x15\x66\xbd\x80\xa7\x81\x5a\xbf\xef\x8e\x04\x59\xbf\xad\xa5\x7f\x95\x04\xd0\xf2\xa4\xd0\x25\xdd\x8e\x3e\x62\x1d\x99\x91\x1e\x4e\x6f\x96\x2a\x49\x29\x80\x6f\x58\x1d\xb1\xad\x73\xf5\x54\x95\xff\xf5\x7b\x86\x62\x5a\x8b\xa1\x92\xba\x67\xee\x83\xe2\x69\xac\x19\xf6\x57\xa4\xa3\xa0\xb2\x20\xf2\x62\x15\xbb\x8f\xd3\x27\x61\x70\x95\x69\x46\xa3\xea\xc4\x31\xa6\x60\x54\x95\x19\x0b\x46\xed\xcc\xc2\x1f\x6d\x3e\xcc\x78\x9e\x59\xcd\x5c\x97\x84\xfb\x59\xd5\xaf\xc4\xa5\x33\xad\x94\x51\x9c\xa7\x7c\x08\xd1\xe7\x47\x28\xae\x66\x05\xe7\xa0\xb8\x0c\x08\x1c\xd0\xb9\xa6\xb8\x7d\xc9\x4f\x53\xf2\xaf\x59\xda\x79\xba\x38\xb9\xb2\x99\x24\x89\x87\xbc\x74\x14\x13\xfe\xb7\x05\x64\x44\x7b\xec\x68\xab\xb1\x0c\x96\xb8\x66\xc2\x2f\xff\xf1\xb7\xd2\x86\x4c\x83\xd5\xa1\xae\x8a\xaa\x1d\x6f\xe4\x0a\xe2\x8c\xa2\x9e\x3f\x88\x78\x97\x7c\xb1\xe6\x71\x96\xf4\x54\x20\x8c\xd1\xe3\xda\xaf\xfb\xe6\xb0\x7a\x87\x9c\xca\x9c\xce\x3a\x9f\x53\x80\xfa\xcb\x9c\x76\xce\x16\x0c\xde\x43\xbf\x95\x2b\x50\x46\x5a\x59\xed\x53\xde\x42\xd1\xcd\xbd\x81\x9d\x07\x94\xd4\x82\x66\xa6\xae\xb0\x79\x7c\x2f\x89\x5b\x6e\x11\xf3\xaa\x24\x26\x54\xa0\xda\xcc\x4b\x7d\x95\x8a\x32\xcb\x85\x0c\x75\x9b\x43\x61\xe3\xea\xab\xf2\x80\x45\xf3\x19\xc0\x42\x29\x99\x44\x93\x9d\x2e\xb7\x8c\xd9\xfd\x21\xa1\x14\x46\x64\x0d\x83\xd6\x0e\xdb\x31\x5b\x28\x4b\xd5\x37\x4a\x73\x69\x25\x84\xca\xbc\xdd\xfc\x5a\x15\xf9\x27\x2a\xc0\xa0\xb4\xb6\x46\x16\x65\xc6\xfb\x5f\xc5\x20\xb1\xe5\x01\xb6\xfa\x6d\x8b\xa4\x73\x37\x7b\x61\x93\x18\x2a\x9c\xae\x3c\x79\xfe\x8f\x32\x6f\x3f\xa9\xf2\x51\x26\xb5\x6c\x95\x56\x5b\x90\x28\x26\xfb\xa5\x61\x40\x53\x61\xce\x94\x37\x73\x92\x56\xf7\x3d\x55\x48\x91\xd3\x23\xa9\x4e\xfb\xa5\x37\x36\xea\x94\xd1\x22\x10\xbe\xa0\xa2\x9d\xdb\x7c\x3a\x48\xac\xce\x34\xcd\xc8\xbe\x50\x43\x07\x89\xe6\x0e\xb3\x7b\x3e\x39\x42\x8b\x4f\x69\xc3\x40\x07\x4c\x87\x16\x11\xf5\x65\x44\x50\x07\x59\x4a\x2c\x6c\x47\x4b\x33\xb3\x45\x5b\xa9\x34\x26\x28\x01\x1d\x68\xab\x33\xd0\x60\xdb\x57\x50\x6e\xf1\xc2\x33\xd3\x61\x20\xd1\xa6\xf1\xbd\x4b\xaf\xc3\x00\x2d\xbe\x03\xdf\xa6\xfb\x90\x0e\x13\x30\xb6\xc4\x4f\x8f\x53\x50\x7e\x1f\xd0\x61\x1a\xa5\xbc\xc7\xba\x9b\xbc\x1d\xae\xcc\xac\x6e\xb5\xf7\x89\x29\x36\xbf\x6d\xab\x53\x37\x1e\x37\x75\x75\x7c\x98\x4f\x7d\x1d\x85\x31\x3a\x1a\xe9\x12\x95\x15\xb7\x9d\x80\xcb\xbf\x3c\xa0\x75\x9c\x0a\x65\xbc\x51\x51\xe0\x01\x5a\x9c\x32\x68\xf8\x7e\x5c\x90\x05\xbe\x85\xf2\x1f\xf0\x96\x63\xad\xaa\xbc\x34\x55\xfd\xee\xd7\xb1\x4e\x44\x14\x45\x03\x54\xe2\x78\x3e\x2e\x28\x4d\x80\x4e\xa3\xc0\x92\x76\x77\x2b\x0d\x9b\xf6\x52\xad\x0e\x74\x9a\x4a\x0b\xaf\xfc\xf8\x6f\x7f\xa4\xeb\x54\x5a\x61\x6c\xbb\x2b\xb9\x79\xf2\xf7\xf2\xb8\x9a\x19\x0e\x03\x39\x26\x1d\xc5\xdd\x97\xfe\x89\xf9\x98\xa7\x14\x74\xa6\x2c\x7f\x07\x8d\x06\xc9\x25\x50\xdf\xcf\x10\x77\x9a\x27\x8a\x1c\x80\xdd\x9f\x8f\x9d\x0d\x3f\x24\x9c\xb5\x88\x12\xee\x19\x64\x3c\x0a\xc2\x6d\x45\xdd\x09\xbe\x10\x98\xd4\x82\x07\xb6\x74\xe8\x78\xaa\xea\x76\x0a\x4d\x9b\xbd\x8f\x00\xe1\x33\x53\x37\x38\x17\x8e\x9b\x7d\x61\x61\x2c\xda\xa9\xc1\x92\x04\xee\xc8\xa9\x9c\xbd\x07\x84\x11\x71\x47\x4c\xf9\x40\x5c\xa3\x8c\x34\x99\xeb\x12\xdb\x7d\xfb\x92\x37\xfb\xe6\xd4\x27\x04\xb4\xec\xbe\x8c\x77\x4f\xb6\x38\x4f\x11\x6b\x29\x63\xa2\xa3\x3a\x7a\x87\x6c\x4e\xcc\xed\xfa\xe9\x14\x84\xf0\xd1\x11\xeb\x2e\x50\x4e\x2a\xaf\xca\x6f\xd0\xaf\x0f\x0d\x8c\x2a\xb1\x74\x35\x54\x8e\x6a\x8d\x5a\x7b\xb1\xd6\xaa\x69\x6f\xaa\x9a\xb2\xe3\xaf\x63\xeb\x5b\x9b\xcc\xda\xe8\x5e\xce\xff\x3b\x34\x2f\xcf\x43\xbd\xa1\x36\x82\x51\xb0\x7c\xdf\x1b\x32\xbf\x3e\xa6\xe3\x80\x41\x68\xc8\xbc\xf8\xb1\xbd\xb6\x25\xdf\xbf\xf9\x86\x38\x26\xee\xdd\x13\x7c\x5c\x39\x29\xb2\x25\xca\x0c\xdf\x1b\x19\x95\xe0\x5c\xb5\xdd\xf6\x35\x93\x47\x01\x0c\x53\x46\x1e\xc7\x66\x73\x43\x22\x35\xd3\x67\x08\x33\x0b\xc0\xa9\xb1\x3d\xd7\xe5\x94\x0e\xd4\x77\x11\x91\x55\xf2\xa0\x3d\xc4\xe1\xd1\xb7\x67\xd9\x53\x88\x5f\xe4\xa5\x31\x0a\x43\x61\x0d\x9f\xc2\xfc\x9e\x7b\x22\x4b\xc0\x28\x49\x42\x77\x00\xae\xb4\xfe\xa4\xb4\x0a\xa3\x34\x20\xa2\x87\xbd\x47\xc8\x7c\x55\x1c\x89\x11\x03\xd3\x17\xd3\xb5\x38\x8d\x35\xbb\x3e\x71\x62\x0b\xde\x9a\x6e\xc9\x85\x63\x88\x37\x26\x0c\xb0\x7b\xbb\x1f\xf5\xf9\x70\x86\x8f\xb7\xe6\xa9\xaa\xdb\xf3\x01\xfa\x67\x4e\x44\x14\xf8\x98\x0e\xd4\xd0\x8d\x61\xaf\x0c\x3f\x7d\x92\x44\x06\x44\xda\x68\xbf\x38\x7d\xb9\x8f\xd9\x09\x3f\x8f\x37\x61\xea\x50\xb0\x7e\x96\x90\xeb\xee\x64\xc4\x96\x95\xbf\x00\x99\xc8\xdc\xef\x7c\x9c\x5a\x38\xd7\xa4\x0b\xd2\x43\x49\x31\x53\x36\x43\x68\xf2\x53\xe3\x09\x07\x1c\x48\xc5\x95\xda\xcf\xcb\x3c\x30\x33\x22\xe6\xde\x59\xfc\x8b\xb8\x93\xbb\x84\xc7\x96\x8f\xda\xa3\x72\x2d\xfa\xd4\x3f\x83\x08\xe3\xd8\xaa\xbf\x9c\x4f\xcb\x26\xe7\x32\x65\x3e\xa0\xe0\x31\x31\xf1\x3f\xd6\xf9\x21\x2f\xa1\xb8\xff\xb0\x38\x2d\x17\x62\xec\x7f\x40\xa6\x61\xe0\xa1\xa2\x2d\x36\xed\x3d\xfc\xbb\xaa\x77\x17\xa5\xc5\x28\xb4\x8d\x41\x6c\x49\x67\xc3\x8b\x7f\xf9\xdb\x80\x4a\x30\x9c\xe3\xc2\x97\xdd\x3a\x04\xa5\x88\x92\x74\x7a\x38\xa3\x4c\x43\xc2\x60\x38\x67\xbd\x1b\x0e\x55\x69\x9b\xfa\xa3\xb8\xeb\x97\x99\x06\x94\x4c\x11\xc1\xbd\xab\xfa\x9f\x7a\x10\x28\x79\x1a\x74\xdf\xf2\x1a\x3e\x08\xda\x64\x0d\xd1\xbe\x15\x23\x32\xcc\xbf\x15\xe7\xff\x9f\xb2\x37\xe9\x6e\x5c\xb7\xb6\xc7\xbf\xcb\x6f\x94\x41\x06\x20\x40\x82\xe4\x7f\x26\xc9\x72\x95\x5e\xb9\x51\x2c\x55\xd5\xcd\xcd\x7a\x4b\x0b\xcd\x81\xcd\x98\x22\x15\x92\xb2\x4b\xf9\xf4\xff\xc5\x03\x80\x9d\x68\xd7\x7d\x83\x94\x6f\x44\xb0\x03\xd1\x9c\x66\x9f\xbd\xcf\x56\xa1\xce\x17\x3a\xfc\xe5\x20\xe2\x47\xc1\xc4\xdf\x04\x19\xdd\x03\xa8\x30\xc4\x24\xde\xc3\x6e\xb5\xf4\xcb\x87\x7f\x38\x15\x85\x91\x83\x43\xe6\xeb\x63\xd6\x34\x57\xf3\x45\x29\x5b\xaa\x5d\xc0\xfb\xbd\x28\xce\x76\x3d\xf9\xc0\x87\xec\x56\x3b\xa5\x09\xb0\x81\xa2\xf9\x2c\x78\x07\xda\x35\x1c\x09\xea\xbe\x2f\xef\x36\xab\xc3\x6e\x71\xb7\xde\x1d\xd8\xe1\x69\xb1\xf7\x81\x66\xd0\x26\xc5\xae\x7d\x87\xec\x50\x0d\xcb\x63\x41\x1b\x99\x0c\xc5\xe0\xba\x41\x07\x84\x46\x96\x88\xc8\x11\x1f\x4d\x5e\x08\x78\x2a\x7b\x68\xde\x1e\xc4\x71\x36\xfa\x0b\x26\x88\x62\x7b\x83\xe2\xd9\x95\x41\x8e\xd2\x9b\x60\x58\x4a\xc8\x40\x99\x79\x12\xf0\x02\x23\x04\xae\x90\x2e\xd3\x84\xb8\xbd\xa1\x65\x0c\xa6\x1d\x3a\xce\xfb\x75\x13\xf4\x69\x4a\xfe\x27\x0c\x89\x52\xd2\xf3\x74\xfb\xf8\x8e\x35\xd7\x66\x9f\xdc\x10\x2d\xd1\xc3\x50\x03\x3e\xc3\x2b\x26\x09\x13\x40\x10\xc3\x98\x0d\x0d\x27\xdd\x7c\x58\x60\x16\x54\x33\xdd\xe5\x0c\x0d\x2d\x07\x99\xdb\x4f\xf7\x95\xc8\xda\x0f\x30\xaa\x9c\x18\x8f\x4e\x43\x65\x8c\xa8\xdd\xe5\xe3\xf2\x11\xd3\xa0\x4e\x15\x59\x18\x46\x85\x34\x96\xab\xd7\xef\x41\x53\xd4\x87\x61\xa1\xfd\xd8\x77\xe5\xb3\x45\x2d\xf9\x4a\x7d\xdb\xea\xb6\xac\x76\xa7\xb2\xa8\x61\x1e\xe8\x68\x58\xaa\x30\x44\x70\x2e\x34\x98\x41\xb1\x92\x61\x2a\xa6\xfd\x76\x8a\x7b\xd1\xf7\xa2\xc9\xf2\x9b\x1e\x60\xe6\x5b\x6a\x19\xf9\x84\x56\x01\xf9\x8f\xae\x52\xe7\x7c\x5d\x24\x65\x98\xa1\xa1\xe9\x03\x90\x79\x17\xac\x30\x61\xa0\x95\xdd\x74\x8f\x59\x71\x83\x9f\xfa\xc9\xf1\xae\xfb\x26\xad\x29\x8c\xae\x4d\x59\x34\x2f\x61\x32\x5a\x65\x4c\xa4\xa5\x74\x5c\xfe\x88\x15\xb4\xcc\x47\xdd\xe5\x79\x98\x70\x70\x11\x68\xc4\xea\x0d\xf1\x22\xbe\x4d\x4a\x14\xf5\x35\xb6\x9b\x79\x76\x5a\x61\xe2\x30\x0d\x3b\x3e\xc1\xa3\x40\x78\xf4\x80\x89\x6d\xd2\xc1\x71\x04\x10\xf8\xc0\x09\x3e\x92\x5b\x71\x1d\x09\xde\x30\x62\xf2\xf7\xf1\x7d\x38\xc7\xdd\x4e\x23\xc3\xc4\xa2\xd0\x3b\x68\x16\x0f\xfb\xe9\xf5\xb5\xa5\x3f\xbb\x2b\x9f\x1f\xa6\xb0\xf0\x69\x9d\xdc\x58\xfd\xd6\x16\x68\x4c\x5e\x2e\xa1\x1c\xed\x56\x61\xa3\x30\x4e\x9f\x66\xda\xc6\x1a\x63\x5d\xed\xdf\x76\xe5\x7b\x30\x09\x63\x04\x0b\xb4\xb3\x98\x77\x3f\x26\x14\x73\x65\x8e\x67\xff\x13\x5a\x38\x93\x80\x15\xaf\x95\x48\xd4\x3a\x2c\x8c\x34\x29\x31\xcc\xd6\x37\x23\xb7\x64\xed\xe3\x44\xa3\x7d\xd4\xa4\x81\xe5\x59\x55\x65\xf1\x06\x95\x8f\x67\xed\x4b\x64\xa2\x9c\xbe\x48\x4a\x19\x42\x6e\x2d\x2b\xe0\xd3\xea\xe1\x83\xa7\x4a\x43\x8e\xe8\xa0\x76\xec\x14\x7d\x28\xf2\x83\x72\x4a\x93\x86\x49\xe0\xb0\x6a\xdb\xb2\x78\x7e\x13\xf9\x13\x1c\xcb\xce\xe6\x36\x29\x04\x1e\xd2\x8f\x23\x71\xa3\xca\x7b\x81\x4c\xdc\xd3\xe7\x73\xee\xdb\xa2\xaa\xca\xf7\xd5\x63\xe7\x7d\x18\x11\xda\x24\xec\xb9\xa8\x9b\x81\x2d\xe4\x8f\x26\x29\xf2\xd0\xdb\xfe\xb6\x65\x77\xa2\x9a\xa2\x4e\x26\xab\x90\x24\x81\x35\x94\xa0\x6e\xbe\xa0\x83\xfe\x3c\x30\x1f\x8c\x34\x04\xb7\xd0\x93\xa8\x9b\x3d\x14\xf7\x59\x71\xee\xf9\x5e\x8c\x8a\x3b\x7c\xf3\x8f\xb2\xb9\xaa\x60\x32\x3a\x94\x96\x55\xa9\x04\xe3\xcf\xd1\x71\xc0\x9d\x07\xfe\x63\xb3\xbd\xcb\x64\x75\xfd\x8c\xbe\xa9\xd4\xe8\x17\x2f\x5c\x4d\xd0\x74\xf3\x1d\xee\x29\x46\x2b\x40\x79\xa5\x02\xde\x7b\x3b\x63\x2e\xe5\x37\xf9\x6a\xc0\x04\xc2\x22\xbe\x40\x63\x29\x7f\x7d\x5c\x40\x3f\x61\x8d\x70\x35\x5a\x0e\xac\x7f\x25\x09\x21\x31\x06\x48\x6c\x04\xed\x33\x66\x61\x49\x02\x62\xb5\xe2\x94\x57\x7c\xdf\x42\x65\xca\xea\x88\xc5\xda\x68\xec\x0f\x9f\x48\x92\x20\x90\x1e\x2b\xd7\x7a\x98\xb7\x4e\x20\x62\xa3\xa7\xed\xb8\xed\x1e\x5b\xc3\x34\xba\xd2\xdf\x27\x2d\xe3\xc4\x56\x36\xbf\x54\xe5\xfb\xc6\xec\xc0\x67\xe1\x1c\xc9\x81\x69\xa0\x72\x9d\xdc\x25\x15\x24\x61\x9c\xa1\xa5\x5e\x9f\x8f\xc7\xdb\x73\x73\xae\x1c\x9d\x58\x77\x3c\x0d\xb0\x56\xcf\x4e\xa3\x35\x02\xa1\xd4\xf4\x23\xb9\xb6\x21\x31\xb8\xe3\x1b\x91\xe5\xa0\xbf\x5d\xd4\x20\xcb\x22\x49\x98\x04\xc8\x7c\x59\x16\xf9\x65\x53\xac\x8f\x50\x3d\x63\x89\x53\x77\x98\x26\x61\xb7\x79\x94\x59\xd1\x21\x4d\x24\x89\x08\x37\x71\x37\x04\xe1\x0a\x64\x35\xe9\x89\x48\x24\xdc\xd1\xcc\xaf\x9b\x17\x17\x71\xfa\x6c\x86\x48\xc2\xb9\xc5\x95\x2d\xcf\xc5\x50\x5c\x42\x12\x9e\x12\xa7\x8f\x21\xea\x3a\x7b\x2e\xee\x5b\xbb\xfa\x4a\x6b\x52\x12\x2e\xac\x54\x49\x53\x3e\x3f\xe7\xe0\x79\x23\xc6\x3c\x21\xc3\xd5\x4c\x92\x98\x51\x11\xfa\xa0\x91\xd0\xba\x99\x4d\x3d\x8d\xdf\x2c\x4e\x34\xb0\x9e\xf8\xad\xde\x8a\x0b\xd2\x74\x60\x75\x42\x3b\x88\x16\xde\xd1\x95\x24\x4e\x01\xdd\x13\xab\x7f\x33\xe6\x52\x71\x4d\x92\x20\x95\xbd\xb7\xf8\x61\x56\xe3\x23\x23\xe9\x0a\x23\xea\xf1\xb3\x92\x24\xda\x52\xad\xd5\xd0\x60\x74\xdd\xaa\x5d\x2c\x7b\xb6\x8c\x0f\x06\x71\x9a\x28\x0c\x31\x09\x54\x5c\x5e\xff\x27\x60\x76\xa8\x05\xec\xef\xa3\xbf\x5d\x2f\xb6\xeb\x61\x27\x4f\xae\xd7\xcd\xcb\x95\x8d\x29\x89\x48\x23\x34\x62\x1c\x81\x6f\x33\x24\xf1\xb9\x66\xab\x95\x44\x68\x0b\xa2\x72\x98\xc5\xec\xbf\xa0\xaf\xa9\x76\x24\x91\x84\xc5\x1d\x69\x57\x86\xda\x29\x53\xaa\x14\x49\x54\x90\xc6\xd0\x89\x4e\xbf\xfa\x9e\xd7\x34\x46\x7e\x81\xdd\x64\xcf\x97\x44\x0b\xca\xc9\x88\xbc\x60\x10\x12\xec\xda\x30\xfc\x6e\x5e\x05\x30\xcf\xd4\x85\x4e\x17\xce\x61\x07\x4f\x67\xaa\x21\x86\x1a\x0f\x69\xb2\x82\xbc\x93\x5b\x18\x66\x85\x92\x9f\xad\xee\xbd\x86\x42\x8f\x43\x9f\x7f\x9f\xb6\x07\x0c\x58\x89\xa6\x81\xa2\x0b\x11\x0f\x6f\x1a\x90\x20\x05\x77\x53\x27\x17\xd1\x7a\xd4\xf5\x39\x6f\x44\xd1\xd4\xc3\x18\xb6\x0c\x08\xb5\x82\xba\x9d\x18\x76\x55\x1e\x27\x6e\xd6\xf8\xa3\x05\x24\xb6\xcc\x53\x37\x67\x91\x6f\x7a\xa1\x10\x19\x04\x81\xc4\xc8\x35\x86\x4b\xf6\xef\xd6\x0b\xf4\xc7\x38\x43\xf3\xfc\x8b\xc8\x85\x6a\x32\xf5\xc7\x27\x78\x64\x19\x04\x32\x8a\x63\xd4\x7a\xb7\xa6\xe5\xe3\x09\xc6\x69\x26\x19\x30\xc2\xb1\x10\x4c\x67\x6f\x34\xe2\x87\x80\x26\xcb\x0b\x8d\xf8\xa7\x69\x61\x19\xb0\x24\x66\x63\x26\x5c\x44\x6b\x41\x6b\xd8\x0c\x76\x9c\xd1\x1e\xf5\xa9\x8a\xa5\x0c\x98\x49\x04\xf7\x51\x5f\x91\x43\xb5\x72\xa4\x85\x6e\x73\x0b\x42\x16\x24\x56\x06\xa6\xb0\xc6\xc0\xf4\x11\x67\xe2\x3e\xed\x59\x32\xb2\x2e\x45\x53\x9d\x5b\x8f\xa5\xcf\xc4\x8f\xef\x1f\x0a\x19\xb8\x3a\xbf\x85\xe5\x0b\x47\x50\xc4\x28\x19\x2d\x83\x48\x30\x57\xd6\x6e\xb9\x0d\x0a\x9f\x9f\xff\xe0\x23\xf3\x80\xe1\xca\xfe\xa3\xcc\xf4\xa4\x7a\x74\x36\x07\x2b\x03\xce\x99\xec\x39\x65\x16\x96\xa0\x70\x3c\xd6\x03\xae\x28\x4e\xe4\x46\xf8\xe7\xe2\x26\x72\xb5\x02\x08\x84\x43\x8c\x0c\xf2\xa3\x62\xbc\x7c\x1c\x0f\x90\x41\x4c\x05\xe2\xb1\xa4\x28\xd4\x48\xe8\xa9\x3d\x64\x10\xa4\xd4\x1a\xb4\xe7\x7a\x7c\x08\x24\x16\x05\xa0\x4f\xb4\xe8\xdc\x79\x77\x34\xa5\x96\xde\xfe\xe0\x0a\x91\x7b\x86\x5e\x19\xa4\x22\x40\x7c\x50\x05\x35\xd8\xe4\xc8\x46\xf7\x29\x23\xdf\x48\x25\x88\x28\x69\x57\x9d\xac\x78\x76\x4c\xfd\x73\x4b\x79\x32\xe9\xb2\x54\x73\xec\x0e\x3d\xa4\xf8\x92\x41\x0a\x49\xe8\x96\xbb\x31\x41\xbc\x0c\x44\x18\xe0\x34\x52\xc7\x73\x7e\x2a\xdf\xe9\xe4\x51\x44\x44\x89\xf6\xee\x19\xf2\xb9\x2d\xcf\x55\xd1\xc9\x34\xc9\x40\xf2\x14\xd1\x98\x03\x99\x93\xd1\xc4\x93\x89\xc2\x60\xb4\x1b\x73\x2b\x64\x8c\xaa\x27\x5f\x51\x82\xd4\x81\xa7\x78\x82\xae\xb3\x94\x14\x1e\x72\x81\x69\x99\x5d\x47\xd4\x27\x03\xa5\x05\xce\xd6\x2f\xed\xc0\xac\xe1\x61\xf2\xdc\x9a\x06\x82\x7a\x91\x31\x8f\x48\x93\x01\xd0\x28\xec\x35\x58\xc7\x15\x01\xc3\xfe\xf5\x33\x0d\x14\x18\x27\x81\xd0\x1a\xb8\xed\x17\xfd\x22\x8e\x30\xe0\xb6\x97\x01\x68\xc0\x24\xc0\xdd\xe3\xe3\xfd\x66\x41\x0f\x8b\x9b\x9b\xa7\xee\x98\x49\xd1\x0b\x7c\x80\x4b\x55\xd6\x4e\x38\xce\x1f\x34\x10\x05\x83\x78\x4f\x76\x84\xba\x11\xc7\x6b\x5d\xb2\xd1\x9b\x51\xa2\x98\xb1\x88\x3c\xf5\xda\x8e\xaf\x73\xa1\xc6\x8e\x86\xa4\x41\x94\xa0\xb9\xd6\x88\x5f\xb7\x00\x4b\x8f\xba\x94\xd4\xf3\x85\x1f\xcb\x37\xf8\xdb\x79\x8a\x10\x48\x7c\x2b\xee\x72\x70\x97\xba\x81\xe3\x42\xa9\xee\x74\x95\x00\xeb\xd5\x58\xda\x9e\x58\x5e\xbe\x8a\x62\x2e\xad\x28\x29\x13\x11\x12\xd8\xd6\xef\x59\xa3\x5e\x6c\x00\xb5\x27\x95\x95\x34\xa4\x36\xfa\x87\x48\x99\x1b\x28\xb0\x9e\xa9\x83\x5e\x4a\x1a\x09\x2e\xd3\x1e\x12\xec\x6c\xc1\x0f\x0c\x47\x1a\x29\x83\xd1\xc0\x6d\x56\x34\x8f\xda\x5f\x83\x47\x9a\x45\x9e\xe5\x28\x2b\x9e\xd7\xc5\x73\x56\xf8\x2f\x47\x63\x12\xa3\x99\x95\xa9\x32\xa8\x9b\x01\x2d\xaa\xa4\x71\x62\xa8\xa3\xda\x46\x78\x6e\x77\xc5\x24\xa0\x58\x97\x5b\xc0\xbb\x55\xfa\x9e\xa9\xb0\x90\x34\x61\x96\xd7\x7e\xc4\x72\xdc\xae\x9e\xb7\x83\xf5\x71\xd0\x17\xa9\x0a\xed\x2c\xf4\xfa\x0a\x3d\x81\xee\xbe\x5c\x9e\x2f\x28\x7a\xe3\xdb\x1a\x88\x6c\x75\xa2\x75\x21\xef\x4a\xf5\xda\x0e\x9e\x75\xd1\x3d\xa4\x10\x89\x72\x28\xc4\x9f\x20\x4e\x65\x61\x3d\xa7\xc9\x30\x91\xb1\x01\xe5\x35\x1a\x8f\xa7\x06\x0e\x34\x18\x4d\x5e\x8a\x22\xa3\xce\x14\xb4\xc4\x65\xa7\x49\xa0\x4b\x52\x2d\x65\x6c\x3c\x2b\x13\xb5\xc0\xfb\x0f\xbe\x91\x61\x1a\x0b\xd3\x96\x99\xa5\x35\xff\x4d\xb2\x74\x36\x6a\x2c\xa9\xd1\x0c\xaf\xd2\xf6\x89\x13\xb1\xff\x63\x10\x91\x90\xd4\x40\x9c\x04\x5e\x5a\xa8\x79\x99\xae\xf9\x8c\x84\x01\x4a\x15\x5c\x71\xd6\x49\x46\xa2\x14\x6d\x3b\xa1\x14\xfa\x6b\x23\xcb\x86\x11\x29\x10\xe2\xfe\xe7\xd3\x1f\xb6\x92\xf9\xb0\x7a\x7c\xd8\x3f\x2d\x56\x7b\xdf\x02\x97\xac\x61\x08\xe6\x3c\x47\xbe\x3e\xee\x16\xc6\x82\x38\x92\x03\x01\x9e\x3c\xab\x9b\x4d\x31\x33\x4c\x18\x4b\xb4\x20\xbd\x20\x40\x59\xb8\x42\xad\x3e\x59\x25\x19\x33\x10\xfb\x12\x75\x1b\x8a\xb9\xae\x81\x93\x2c\x24\x56\xa7\xea\xe6\xe7\x50\x31\x42\xb2\x90\x89\x80\x79\xc1\x69\xdd\x05\x27\x87\x37\x08\x53\x86\xe6\x62\x5e\x76\xae\x26\x8b\x22\x81\x9b\xae\x14\x35\xea\xf2\x76\xbf\xf3\x00\x41\x0f\x3d\xa8\xd4\x6e\x66\x13\x57\x99\x45\x5c\x63\x1a\xe3\x84\xc3\xe7\x5b\xd6\xeb\x18\x48\x16\xc5\x96\xde\xc7\xc2\xa0\xbe\x96\xe7\x1a\x56\x79\xeb\xd1\xa9\xe9\x45\x62\x13\x8e\x98\xae\x37\xc5\x5b\x36\xc8\x1b\x8c\xdd\x0f\x16\x29\x8d\xa4\xd6\x5f\xa0\x80\x3a\x9b\x6c\x49\x8c\x13\x15\x3b\x8b\xd7\xe7\xcb\xeb\x45\xa1\xf7\x2f\x90\x55\xce\x12\xea\xc6\x05\x8f\x6d\x8a\xf3\xb9\x8b\x7b\x0f\xc1\xa3\x92\xc5\x24\xc4\x11\xfb\xf3\xe7\xcf\xdf\x55\xce\x49\x16\x27\x16\x8d\xba\xde\x7f\x75\x25\xd1\x9e\xd7\xd8\x35\x48\x5b\xd7\xbe\x1d\x85\x65\x55\x95\x84\x8e\x3e\x5f\x2a\x41\xd9\xd2\xcf\x7b\x61\xf1\x54\xae\x4c\xde\x37\x10\x81\x88\x3b\x0e\xb5\x8d\x46\x92\xed\xfe\xd2\x02\x78\x4c\x3c\xcf\x54\x0d\x8e\x5d\xd4\x1d\x94\x91\xa5\xf8\x6b\xfb\xe9\x6f\xe3\xae\x54\x24\xc6\xc8\x9a\x5d\xea\x9f\x40\x5d\x94\x63\x54\x06\x3d\x58\xf2\x99\x8a\xd2\x01\x80\xf1\x31\x9f\xf3\xcd\x98\x8a\x6c\x4a\x55\x68\xed\xc8\x09\x9f\xac\xbe\x87\xce\x2c\x7e\x78\x76\x71\x61\x3a\x92\x56\x2c\x1b\xb5\x4e\x1a\x70\x51\xe8\xdf\x1b\xde\xf3\xa9\x44\xc9\x74\x1a\x26\x91\x27\xe6\xc1\x9e\x18\x32\x8f\x49\xa6\x95\xc0\xf0\x4a\x25\xba\x85\x97\x69\xc3\x30\x71\x84\xb9\xf4\xcd\x7c\x20\x52\x32\xe0\x31\xba\x70\x3e\xf9\xf9\xa1\xaa\x85\x6b\x6f\x1c\xb9\xa9\x0f\x4c\xb6\xab\xfd\x16\x95\x46\x26\x33\xc0\x48\x96\xd8\x0a\x2a\x79\xbe\xec\xce\xe3\x32\x68\x19\x92\xd0\x82\x1a\x2d\x89\x71\x5e\x5e\x16\xcd\xdc\xce\x1d\x06\x51\x8a\x1a\x14\x6f\xa5\x15\x26\x6e\x9d\x84\xdf\x71\xbd\x0d\x56\x88\x30\x90\x91\xa1\x9e\xd5\xb3\x11\xb9\x5b\xa5\x67\x54\x31\x64\x48\x03\x63\x89\xda\x2b\x80\x06\x26\x03\x2b\xa4\xa1\x21\x6e\x03\xda\xb6\x73\xda\x72\xa2\x4c\x9d\xaa\x7e\x84\x85\x34\x96\x56\xc5\x1e\x6d\xaa\x6e\x39\x5d\x95\x55\x01\x15\x82\x75\x9d\x21\x72\xbd\xba\x86\x34\xb1\x42\x92\x38\x37\x6e\xcb\xea\x27\x64\xd3\x87\xd5\x06\x97\xf7\x76\x2d\xfb\x09\x19\x32\x3f\xb6\xbe\x45\x79\x6e\xbe\xfd\xd3\x05\xdb\x65\xc8\xc2\x2e\x8e\xfc\xbd\xd6\x5b\xa8\xbe\x9e\x0b\x5d\x21\xed\xdb\xe4\x7a\xcc\x08\x9b\x9f\xdd\x2d\xce\xdd\x72\x11\x86\x01\x0b\x1d\x64\xe0\xb1\x75\x7c\x9f\x32\xf5\xc2\x6e\x26\xdf\x32\xa4\x56\x46\x05\xab\x8a\xdb\x25\xf7\x20\x82\xb0\xbb\x02\x4b\xd8\x5f\x52\x38\x1c\x98\x7d\x21\xa7\x1a\xb7\x21\x69\x91\x07\x1f\x0e\xc7\x90\x33\x1a\xb8\x08\x31\x7a\x57\xed\x3e\x7b\xad\x55\x29\x43\x1e\x71\xd1\xd3\x46\x2e\xea\xba\x54\x59\xbb\xf6\x8f\x32\xe0\x32\xe4\x3c\x34\x5e\x5d\xab\x74\xac\x32\xe3\xeb\x88\xd8\x32\x39\xa3\xe0\xf1\xe0\x83\x71\x61\x75\xff\x0c\xb4\x06\x66\x21\x4e\xf5\x4b\x69\x03\x55\xcb\x8b\x8d\x23\x8c\x1f\x28\x26\x04\x03\xa6\xce\x35\x44\xc3\x69\xb0\x7a\x86\x31\x89\x7c\xb8\xfc\xf1\x0d\x2a\xd1\x05\xe4\xc2\x38\x48\xb5\x5b\x18\xff\xa7\xb5\xbb\x2f\xd3\x2b\x47\x01\x86\x5c\xca\x22\xbf\x0c\x73\x82\x23\x51\xdf\x4f\x21\x11\x32\x8c\x13\xa3\x9c\x40\xc9\xf7\x5a\xf7\x60\x20\x19\xc6\xa9\xd5\x9e\x6e\x3b\xfa\x4b\x66\xae\xe5\x3a\x86\x1b\x48\x18\x6b\x1b\xdb\x7a\x02\x91\xb7\x2b\xc5\x93\xb8\xec\x2b\xa1\xfa\x4d\x20\x8c\xb5\x90\x2e\xc0\xd0\x6e\x11\x63\x7e\xd0\xc9\x53\xa5\x94\x60\xbc\x0a\x59\x9d\xdb\x96\xa3\xc8\xf4\x27\xa3\x24\x8d\x2c\x4f\xf9\x16\x90\x95\xcf\xdf\x3b\xe5\x06\xd3\x00\x9b\xba\x46\x16\x29\x5b\x31\x3f\xb9\xa7\xb0\x32\x32\x2f\xa2\x9e\x48\x52\x8e\x4d\xc1\x30\x55\x14\xb1\x97\x2e\xab\xbb\x73\x25\xb4\xbf\x35\x2c\xe7\x3f\x40\x6a\x92\xb0\xc3\x83\xde\xfc\xb6\x52\x5c\x86\x82\x10\xd4\x8b\x3f\xdb\x12\xbe\x0e\x03\x26\x43\x41\x89\xa1\xbe\x44\xdf\xf2\x8f\x63\xd5\x92\x23\xd2\x1e\x5f\x25\x24\x58\x1b\xe0\xb6\xf9\x91\x20\x9d\x6b\x22\xe3\x84\x24\x1d\xcc\x6a\xdd\xbc\x78\xc6\x26\x7f\x3f\x15\x5a\x40\x3e\x4a\xc8\x21\x87\xd8\xf8\xd5\x94\x8c\xac\xad\x53\xe6\xba\xaf\xe6\x93\xa1\x52\xb6\x6c\xcb\x45\xee\x8f\x27\x51\x64\xfd\x51\x1d\x47\x3a\x19\x29\x48\x1d\x45\xd6\x9a\x93\x6f\xb8\x21\x67\x93\x08\x5a\xa8\x53\x82\xcb\xd9\xc3\xe2\xe1\xb1\xbb\x86\x34\x1e\xc4\xbe\x03\x55\xc1\x74\x91\x00\x62\x6b\x0c\x3d\x20\xc3\x46\x2a\xeb\x69\xab\x44\xcb\xce\xc9\xb8\x81\x37\x7f\x75\x23\x39\x62\x75\xef\xfe\xf8\x36\x9c\xc9\x11\x0d\xc2\xd8\x0c\x98\x4d\x90\x50\xab\x69\xae\x53\x40\xbf\xf3\x3d\xfc\xf5\xa2\xc0\x53\x7d\x5a\x0f\xe7\x47\xd9\x80\x05\x5d\x7c\x60\x8f\x44\xd4\x50\x8c\x5e\xbd\x5b\xad\xd8\x91\x45\x18\x31\x43\x63\x87\x0e\xd8\x14\xb3\xf8\x75\x19\x85\x24\x09\x46\x10\xa9\x2b\x35\x39\xdf\x30\xd2\x68\x4e\xa0\xb2\xd1\xbe\xdc\x41\xa1\x57\x2f\xa2\xc7\x29\xc9\x28\x62\x91\x4c\x7b\x66\xbc\x9f\x00\xaf\x3b\xe4\xb1\x1d\x5f\x28\xd2\x14\x53\x7f\xef\x65\xf5\x7a\x53\x16\xd3\xc3\x3c\x88\xad\xbc\x6e\x91\x75\xb0\x90\x45\x55\xcd\xad\x01\xd3\xd5\x20\xe2\x2c\x60\x43\x01\x84\x25\x7c\xb4\xe2\x44\x71\x68\xb1\xcd\xc7\xcc\x01\x0a\xf7\x3d\xba\x52\x46\xb1\x10\xa9\xe7\xc4\x15\x03\xd9\x4f\x17\xcd\x18\x99\x0f\x51\x6c\x34\x26\x92\xe1\x98\x21\x0b\xf2\x07\x77\x4c\x22\x1a\xba\x44\xc4\xa7\xa9\xa6\x28\xd1\x91\xf6\xc3\xa0\x82\x63\x76\x3e\xae\x44\x35\x37\xe1\xa2\xc4\x58\x7d\x2a\xeb\xb4\x38\x30\xdf\xb8\x49\x1a\x00\x96\x2e\xd9\x11\xbf\x2f\x6f\xcb\xea\x19\xf6\x2f\xf0\x00\xbf\x9a\x81\x64\x90\x8c\xd2\x50\xe1\xe6\x73\xd0\x2e\xf3\x89\xe1\x58\x27\x49\x72\x44\x65\xd7\x39\xa0\xbd\x8c\xd2\x54\x22\x5b\x1c\xb2\xd9\xa8\x31\x47\x90\x8c\x04\x63\x23\x4d\x8a\xdb\xb2\xba\xcd\x8a\xd6\xb1\x19\x32\xe8\x4c\xba\x4a\xa4\x0c\xf3\x2b\xaf\x99\x03\xb4\x76\x7d\x2d\xb4\x55\xa5\xad\xa0\x86\xea\x0d\xb4\x9d\x77\x2f\xa2\x7a\xbe\x4a\x82\x44\x02\x22\xaf\x94\xa1\xfa\xe8\x5c\x24\xb9\x55\x4f\xb4\x20\x81\xba\xf7\x6f\xdd\x71\x45\x6c\x30\x72\xf9\xb8\x3f\xac\xef\xd6\xf7\xeb\x87\xfd\xc1\xdb\x3c\x91\xd6\x31\x41\xf3\x25\x7b\x46\xd7\x7d\x04\x85\x93\x11\xd0\x14\xa1\xd4\x47\xf1\xeb\x58\x16\x70\x39\x4d\x0e\x47\x2c\xf6\x0e\x2c\xae\x83\x55\x5f\x13\xd2\x5a\xb3\x21\x0e\x49\x77\x52\x36\x91\x35\x92\x91\x61\x04\xa9\x40\xd7\xdf\xbe\xad\x7a\xa5\x1a\x19\x19\x6d\x91\xe3\xf2\x7c\xd9\x32\x57\xec\x2e\x79\x10\x71\xea\x8a\x4d\xd7\x85\x2e\xab\x1a\x2b\x85\xeb\xb1\xed\xcb\x03\x2d\x51\xdb\xaa\x6e\xca\x53\x6b\xea\x8f\xba\x90\x07\x26\x42\x38\xa1\x03\x17\x59\x4f\xdf\x32\xb5\x4d\x5a\x52\xa6\x10\xc4\xbf\x6b\xaa\xec\x74\x1a\xa7\x11\x39\xe5\xd2\xe7\xa8\x7f\x66\x1a\x99\x1f\x5b\x03\xf9\xb6\xac\x46\x9b\x14\x67\x24\x44\x99\xa0\x9b\xc5\x76\x3b\xba\x00\xa3\xc2\x0b\x2b\x6e\x5a\x33\xe2\x3e\xfb\xd5\x6d\x4b\x3c\x84\x38\x86\x8e\x82\xad\xe3\xe4\x1a\x72\x97\x4a\x1e\xb1\x38\xb2\x7b\x17\xe8\x7b\x24\x65\x1c\x77\x2e\xe7\x2c\xc0\xe2\x5e\xe4\x33\x19\xf7\x11\x0f\xb5\x72\xfa\x75\x4f\x65\x0e\xb7\xe5\xb8\xd6\x60\xf4\x0a\x9c\x43\xd8\x17\xf0\x7d\xed\xc7\x1d\xe7\x09\xc1\xb8\x8e\x8f\xda\x8c\x33\x1d\x9c\xab\x30\x68\xef\xdf\xe5\xbd\x7b\xee\xf6\x5b\x4c\x97\x4f\x3a\x9c\x6b\x42\x7b\x3f\xc2\x4b\x56\xcf\xce\x27\x9e\x98\x04\xa1\x53\x16\x13\x82\xd5\xfe\xd3\x1c\x07\x4f\x01\x74\x4f\xb6\xb6\xcd\x45\x61\x45\x2c\x3f\x44\x69\x8e\x5e\x5b\x72\x86\x95\xcf\xf9\x59\xbd\x5e\x76\xad\x07\xb4\x16\xc3\x08\x3e\x97\xa9\xc0\x7c\xaf\x39\xab\xd7\xac\x78\x7e\xed\x00\xd7\x92\x2b\x16\xa9\xf6\xab\xdf\x9f\xe5\x28\x01\xc2\x15\x57\x28\x71\xb1\x5b\xdc\xad\x0f\xf7\x9b\x87\x9e\x1b\x44\x72\x25\x05\x4e\x96\xd6\x84\xae\x41\xd4\x36\x6b\x0b\x30\xbe\x82\x26\x11\x7e\xb9\xa3\x6e\x86\x48\x47\x7f\x94\x5a\x71\x83\xdb\x4e\x1f\x39\xf1\x47\x34\xf8\x00\xd5\xc8\x29\x1f\x77\x19\xd0\x14\x03\x19\x9d\x2a\x68\xbb\xdb\xcd\x04\x1b\x38\xb0\x40\x5a\x8d\xf4\x4e\xdd\xeb\xbb\x23\x1c\x9e\x22\xee\x25\x87\x38\x22\x16\xf7\xe7\x0d\xd7\xd9\x4b\x26\x80\x9d\xa6\xcb\x6d\x55\xbe\x65\x1a\xee\xe1\x58\x56\x0e\x87\x3c\x64\xc4\x9c\x88\xcb\x5d\x6d\x9a\x1c\x04\x49\x3a\x7d\xbd\xd6\x94\x6f\x97\x01\x7f\x4c\x13\xdc\x3d\x5c\x74\x7c\xd7\xc0\xe9\x03\x74\x09\x07\x9d\x22\x84\x7f\xb7\x5f\x8e\x3e\x01\x80\xc4\x34\xc1\xd7\xec\xf9\x05\x6a\x54\xe3\x9a\xe0\x64\x46\xd7\x89\x49\x18\x61\x84\x65\xd9\xc5\x3b\x63\x92\x02\x92\x17\xff\x84\xec\xa1\xfb\x4d\x06\x18\xcb\xab\xc5\x9b\x93\xbe\x1b\x8e\xc7\x98\x28\x83\x9f\xd6\x64\x55\x6d\xf5\xaf\x57\x65\x7d\x2c\xeb\x3e\x7c\x1d\x07\x24\x44\xeb\x19\x0b\xb2\x9d\xbf\xee\x0f\xf1\xd4\xd3\x16\x96\xa7\x1f\xe2\x9c\xe3\x8e\x3d\xfe\x02\x31\x15\x01\xfa\x37\x4e\x1f\xec\xc6\x32\x99\xe3\x82\x3e\x5a\x3e\xe2\x90\x84\xc8\xbd\x67\xdd\x07\x97\x61\x98\xf9\xf2\x71\xc8\x53\x2c\x95\x3c\x66\x05\x7a\xba\xce\x06\xee\x69\x5d\x64\x3b\x34\x90\x95\xf8\xe6\xe6\x7f\x6e\xf6\x3d\x47\x95\x8c\xa3\xc0\x32\xd4\x23\x7a\x71\xff\x52\x95\x05\x3c\x6d\xc7\x7d\xc2\x03\x8e\x76\x8a\x79\xb7\x2e\x30\xd2\x9b\x0d\x83\xae\x31\x77\x9c\x6e\x8e\x1f\xcd\x52\x20\x8c\x3f\x0f\x4f\x42\xcf\x9d\xb4\xbc\x20\x34\x00\x0a\x05\xab\x52\x4f\xdf\x3a\xa6\x14\xeb\xef\x3a\xfa\xa7\xc9\xcb\xc6\x31\xc3\x20\xe2\x4f\x51\xa0\xec\xda\x6f\xd5\xc7\x65\x9c\x84\x80\x51\x9c\x9d\x30\xf0\xf8\x5e\x0c\xf6\xce\x38\x49\xe3\x88\x0c\xa5\xaf\x72\xeb\x0a\x4d\x6e\x2a\x98\x4b\x23\xbc\x64\x75\x6b\x5c\x57\x35\x2e\x71\xfe\x68\x62\x8c\xa3\xe1\xe8\xa2\xb1\xb3\x76\xa7\x2c\xcb\xdc\xcf\x9f\x58\xa6\x16\x80\x65\xa9\x7e\x71\xec\x53\x42\x03\x7f\x51\x69\x6c\x34\xbd\x3d\xc7\x31\x2e\x4c\x7a\x4a\x49\xa3\x4c\xdf\xeb\xce\xa4\xe8\x06\xa3\x26\x69\xd8\xd3\xd2\x6d\xcb\x72\x82\xc4\x88\xb5\xe0\x03\xe6\x64\x4b\x0f\x5d\x5d\x4e\x4d\xd9\x21\xb2\xe7\x76\xaa\x58\xab\x08\x57\x64\x5b\x00\xea\xa8\x2e\xdd\x31\x48\x13\xf4\xf4\xc4\xe9\x04\x85\xee\xab\xd5\x12\xd7\x0d\x6e\x9d\x8c\x4d\xac\x7c\x5d\x0b\xe2\x12\x7a\x6f\x20\x36\xa9\x05\x3a\xe4\xed\xf3\xd4\xfb\xea\xdc\xbc\x7c\xf0\x59\x8d\x09\x49\xd8\x83\xb7\xaa\x7a\x2b\xaa\xe6\xf2\xa3\xc3\x4c\xca\x84\xa4\x14\xb3\x0d\x67\x47\x1d\xf9\x64\xad\xbf\x45\xa1\xdb\x55\x7d\xc0\x2c\xd4\x36\x65\x09\x74\x7c\x01\x6d\x7f\x8e\x7b\x2b\x21\x46\xa8\x9e\xb7\xe0\x47\x56\x8b\x0f\x1d\xf9\x29\x90\xf6\x53\xc7\x3e\x21\x46\x21\xf0\x12\x72\x9f\xca\x4c\x02\x11\x59\x3c\xad\x03\x2b\x51\x07\x56\xa2\x0e\xa4\x44\x27\x60\xa5\x24\x90\x31\x46\x83\xeb\x97\xf2\xfd\x07\xd2\xa9\x8e\x1f\x3e\x50\x02\x71\x6e\x9d\x63\xa4\x8f\x59\xb1\x85\x51\x55\xa0\x6b\x4a\x23\x86\x05\xfe\x03\xdc\xed\x97\x4a\x14\xd3\xee\xa0\x06\x88\x97\xca\xdc\x34\x70\x9c\x97\xfc\x1b\x8d\x9c\x76\x05\x40\xc8\xdb\xad\x38\x2b\x18\x96\x5a\xcb\x24\x94\xa0\x5c\x10\x79\xbf\xb9\x5f\x1f\xf6\x8f\x87\xfb\xc5\xb7\xf6\xef\xfd\x62\xff\xb8\xde\x8d\x57\x93\x24\x04\x2d\x9d\x4f\xf4\xf4\xf0\x65\xf2\x68\x51\x1c\xa2\xa3\x08\xbf\xb2\xba\xb1\x36\x7a\xbd\xbc\xe0\x84\x1d\xf7\x1a\x8f\xa3\xc4\x4a\xcf\x15\xba\x7c\x67\xae\xca\xc4\xd6\xd1\xf5\x20\xc1\x84\xc7\x9d\x2e\xd1\x0d\x18\x40\xdc\xe5\x84\x7b\x59\x26\x71\x20\x11\xc4\x20\xac\xd7\x3d\xff\xa9\xe3\x30\xa2\x7d\x45\x8e\xd7\x95\x91\x49\x0c\x56\x9d\x12\x54\xb9\xc3\xb4\xf6\x6d\x6f\x81\x26\x09\x4d\x18\x1d\xb0\xd9\x3e\xc1\x1b\x20\x69\x6c\x1f\x6b\x4c\x52\x92\xe0\x9e\x94\x75\x2a\x36\x23\xdf\x24\x49\x99\x55\x45\xb4\x42\x63\x87\xda\x2b\xec\x77\xcc\x75\xe1\xff\xce\xc8\xc9\x76\x27\xdb\xa7\xcb\x54\x89\x01\xf3\xb1\x01\x9a\xa4\x91\xb1\xe5\x95\x8d\x78\xee\x8b\x3a\x65\x92\x8a\x04\xf5\xc1\x11\x86\x32\x32\xaa\x93\x54\xda\x2c\xa0\xa7\x86\x98\x31\x8b\x3f\x98\x2c\x82\x69\x0f\xff\xdb\x6e\xac\xa8\x41\x38\xda\xad\x12\x19\x0a\x1e\x74\xbb\xe6\xf8\xbe\x5a\x1a\xa4\x0d\x2c\x4f\x16\x6a\xb9\x83\x42\x2f\x2f\x9e\x8a\x7f\xe2\xa6\x7e\xa6\xbb\xef\xae\x07\x54\x20\xbf\xc1\x3b\x64\x2b\x71\x1a\xe9\x54\xca\x04\x38\x41\x38\x43\x79\x6e\x4e\xe7\x46\x4e\xc6\x1e\x70\x83\x5f\xc4\x91\xd4\x7c\x40\x8d\x21\x13\x10\x29\xc4\xdd\x4a\x79\x06\x2f\x6a\xf8\x41\x6b\xa5\x31\xb3\x5f\x65\xcf\x2f\x0d\x9b\x0c\x51\x00\xab\x20\x84\x86\xcb\x4d\x36\xa6\xa5\x9e\x5c\xc8\x10\x70\xce\xee\xb9\xf5\x9b\xe6\x48\xc9\x64\x62\x4c\x2c\x3d\x04\x71\x49\xfe\xd6\xfd\x6a\x2d\x76\xa1\xb5\x5d\x96\x07\x5b\xe1\x58\x54\x4f\xa6\x24\x88\xb9\x19\x14\x9a\x3e\x94\x15\x02\xef\xad\xbc\xf5\x1c\xae\x5b\xa6\x84\xd9\x49\x54\x43\x73\x5f\xea\x0f\xf8\xcd\x65\x4a\x22\x8e\x41\xb9\x73\x6d\xcb\xd5\xae\xf3\xe9\x69\x10\x5b\x5a\x5d\xbf\xf9\xaf\x8b\x26\xab\x60\x26\xf6\x94\x06\x8a\x46\xce\x7a\xd9\xb5\x2e\x48\xbb\x98\x7c\x30\xc9\xd3\x40\x81\x57\xd5\xf2\x32\xed\x33\x8d\x00\x70\xe4\x88\x21\x54\x39\xa5\x24\xf0\xa3\xdb\x86\x79\x9d\x10\xfc\xfe\xa5\x82\xfa\x65\xc0\x65\xe6\xdb\x6b\x66\xc5\xe2\x44\x55\x65\x50\xed\x9a\x6a\x18\xc7\x4b\xa9\x61\x98\x9a\x38\x8d\xc7\x8c\x3b\xca\x88\x95\x43\x78\x2b\xdd\x32\x3f\x57\x6d\x26\x53\x46\x23\x7b\x8f\xf3\x65\x52\x84\x31\x93\x1f\x4e\x43\x1a\x23\x84\xa9\x03\x5b\x0f\x45\x23\x64\x1a\xc6\x96\x40\xc1\xda\x24\xbb\xa6\x35\xc5\xae\x0a\x77\x65\x1a\xa6\x76\x3b\xc3\xd2\xb5\x9b\x32\xcf\x45\x55\xf7\x6e\xad\x2d\x2f\xc9\x27\x9e\x40\xc0\xc9\xdf\xed\x1f\x7f\x11\x49\x10\x28\x58\x01\x7a\x28\xad\xb1\xd2\xee\x76\xa3\xc7\x8d\x62\xc9\xdd\xec\xda\xf9\x12\xfc\x47\xe3\x68\x93\x35\xba\x2d\xdb\xaa\xbc\x29\x55\x8f\xfc\x69\x97\x3b\x66\x13\xf9\x5e\x6d\x64\x2b\xd4\xeb\xb4\xdc\x5d\xa6\x3c\xb1\x56\x79\xfd\x52\x56\x1e\xa0\xd2\xf3\xe8\xc9\x34\x0e\x2c\x2b\xc5\xa1\xe9\xe8\xa5\xba\x43\x90\x44\xbc\x0f\x28\x0f\x85\x0e\x64\x9a\x44\x96\xaa\x01\x7e\x9d\xa0\xca\xda\xed\x68\x5f\x5a\xa2\xff\xf1\xfd\x53\x12\x28\x57\xc6\xef\x98\x7b\xeb\xe5\xe5\x49\x14\xaf\x9f\x57\x6d\xca\x34\xa5\x36\xa3\xf5\xf5\xc7\x9f\xe3\xaf\x97\x72\x83\x35\x4c\xff\x39\x8b\xca\x23\x17\xa6\x15\xea\xa3\x5c\x6d\x9a\xa6\x41\xa4\x3d\x95\x40\x6b\xe6\x0e\x49\xe0\x65\x2a\x04\x37\x89\x77\x97\xab\x31\x36\x2f\x15\x42\xa0\xb4\x9c\x78\xeb\xda\x4b\x29\x31\x96\xdc\x57\xb4\xf6\xdb\x51\xaf\x4a\xf1\x13\xb2\xc9\x78\x92\x3a\x42\xff\xc4\xe1\xfb\xbe\x8a\x42\xf7\x10\x8e\x54\x11\x2b\x76\x6c\x2d\x9e\xa7\x72\xc0\x53\xe7\x5b\xf0\x18\xcb\xb1\xb6\x73\x78\x56\xdf\x26\x16\x7d\x19\xd8\xdd\x40\x8b\xba\xbb\x8d\xa0\x18\x28\x75\x92\xe9\x57\x1f\x61\xfc\xc8\x10\x84\x48\x51\xec\xcd\xcd\xea\x3c\x5d\x07\x21\xb5\x4c\xd2\x08\x7e\x84\xa6\xe9\x9c\x9a\x14\xb4\x45\x8e\x29\x61\x2b\x46\x6e\xb3\xfc\x43\xfe\xa8\xc9\x5b\x98\xd8\xe6\xc5\x8e\x87\xb3\xd7\xbd\xb0\x05\x6a\x1b\xed\x71\xcf\xa9\x49\x62\xe1\xd2\x39\x0f\x00\xd6\x27\x6c\xcd\xea\x49\xa7\x19\x13\xa1\x45\xbd\x50\x42\xc3\x31\x53\x1f\x90\x43\x4a\x41\xc2\x10\x27\xca\xe9\x50\x0f\xe0\x2c\x53\x9e\x86\xc9\x39\x32\x45\xd2\x7d\xaf\x2f\x39\x48\x48\x8a\x80\x45\x58\xe7\x04\xa2\x2a\x40\x4f\x0a\x38\xa5\x08\x22\xc2\xb8\x87\x9f\x65\xfe\x24\x2a\x2c\xa5\x6c\xeb\x28\xdc\x5e\x8d\x00\x41\x85\xf0\xa0\x01\x0c\x6d\xcf\x84\x56\x04\x55\x96\xa1\xc6\x95\xc8\x5b\xbd\x2f\xb7\x87\x6d\x2b\x30\x19\x4a\x09\xff\x6d\x5c\x4f\xe7\xff\xce\xfe\x5f\x77\x61\x46\x12\xad\x7b\x11\x90\xe1\x62\xed\x47\x97\x88\xa9\x03\x98\x20\x4d\x9c\x85\xe7\x65\x79\xd6\xa7\xca\xc7\xe3\x4b\xc4\xa0\xd0\x9d\x59\x9e\xff\x6b\xe3\xea\x99\xc8\x77\x4d\x3b\x30\x9f\xfd\x7c\x17\x09\x0f\x91\xc8\xb1\xac\x84\xca\xb3\xff\xc2\x3f\xce\x50\x5d\x56\x3d\xb0\x4a\x24\x31\x30\x18\xe4\xda\x9d\x99\x70\x8b\xc1\x13\xfb\xdf\x1f\xb0\xdc\x4a\x91\x48\x22\x12\x0f\x9e\x40\x47\x64\xe7\xad\xd2\x09\x08\x62\x72\x9e\x4a\x31\xb4\x74\xb4\xeb\xb9\x55\x44\xe9\x1e\xc8\x04\x98\x8a\xdc\xb9\xcf\xf4\xb7\x19\xd2\x21\x29\x52\x16\x04\x3e\xc2\xdd\xbc\x40\xe5\x88\x38\x3b\xad\xc1\xfe\x66\x22\x09\x9c\x36\x8e\x8d\x69\xce\xa5\xc2\x84\xd0\xb6\xa4\x40\x43\x7e\xc5\xfa\x30\x29\xf1\x96\x42\x32\x82\xdf\xe9\xe6\x71\xd5\xf3\xf6\xfa\x63\x22\xd4\xf6\xd5\x1c\x75\xdb\x38\x2f\x27\x14\x4d\x30\x4d\xb5\xdb\x2d\x86\xce\x93\x50\x26\x02\x3d\x66\xc5\x1d\x57\x95\x4e\xde\x5f\x2b\x81\x5e\xfa\x48\x0b\xf9\x93\x6c\xb9\x80\x20\xd2\x7d\x6d\xe0\x10\xce\x28\x20\x4e\x23\x70\x55\x76\x65\xe1\xcb\x2b\xc7\xf7\x33\x2c\xc2\xb0\x58\xe1\x8c\xd7\x6e\xd0\x9a\x10\x50\x97\xa7\x80\xf7\x89\x58\xf7\xa4\x8b\x0d\x07\xaf\xc4\x3b\x2d\x2b\x99\x87\xe7\x0b\x13\xc7\x18\xba\x46\xc9\x1f\x51\x5b\x46\xb9\xfa\xd3\x4a\x0f\x61\x54\xa4\x48\x67\x9d\x2c\x45\xf1\x5a\x95\xf9\x64\x5b\x95\x44\x29\x4c\x08\x34\xae\xb4\x7d\x94\xea\x96\x01\x4f\x10\x55\x92\xd5\x0e\x89\x70\x7b\xbe\xba\x42\x90\x5a\xd9\xb5\x4c\x95\x48\x52\x6b\xcd\x0e\xd6\x5d\x42\x24\x88\xf3\xd8\x57\x42\x23\xd9\xc9\x90\xb9\xe7\x2f\x26\x88\xdd\xa5\x68\x92\x62\x12\xed\x44\x0f\x68\x03\xf9\x5b\x50\x0d\x42\xf7\x50\x69\x0f\x0b\x6c\x9d\x86\xf1\xa7\x93\x8c\xe9\xa8\x13\x15\x59\x34\xaf\x36\xbf\xfc\x0f\x74\x06\x26\x2d\x85\x4d\x53\xfa\x54\xf9\xf7\xa7\xcd\xe4\xbd\x43\x1a\x24\xa2\xaf\xc5\xf5\x51\xa6\x35\xba\xe9\x7d\xe0\xb9\xf3\x6a\x65\x18\x3a\x2a\x2e\x2b\xb3\x66\xe3\xd5\x9e\xda\x52\xca\x28\xb4\x29\xa8\xbb\xc7\x2f\x87\x3e\x94\x6e\x51\xc0\xbe\x89\xb0\x9a\x2b\xe7\xc2\x6b\xdc\x82\xc6\x95\xea\xed\xfa\x05\x22\xcd\x31\x9c\xe4\x69\x31\x3f\x9c\xcb\xae\x3d\xe7\x22\x76\x85\x4c\xeb\xfd\xd7\x59\xe3\x59\xc6\x2c\x42\xef\x6d\x51\x55\x2f\x38\x23\x27\x61\x03\x99\x04\x12\x8b\xb2\xd0\x5e\x3e\x48\x68\x0e\x27\x47\x05\xd8\xbd\x43\x22\x12\x8f\xf5\x5c\x95\x45\xdd\x76\xc1\xc4\xb4\x90\x89\xd4\x68\x2f\xef\x37\xab\xd6\xaf\x9b\xde\x43\x0b\xea\x8a\x11\x50\xda\x70\x00\x81\x6d\xbd\x15\xac\x3c\xea\xab\x4b\xc5\xa5\x3c\x4f\xaf\x90\x9a\x00\x83\xb7\x6d\x6f\xd8\x3a\x0b\xaf\x99\x7f\x1e\x96\x63\x7d\x0e\x8d\x96\x22\xe0\x08\xdc\xcb\xcc\xca\x5a\x16\x0f\x13\x95\x7f\x29\x05\x0d\xd0\x14\xab\xdf\x85\x65\xcc\x44\x1d\xdd\x8f\x15\x88\xfc\x69\x2c\xb4\xaa\xa0\xa8\x07\x95\x15\x7d\xb4\xbe\xdd\x18\x31\xdf\xb1\xff\xef\x7e\xb8\x66\x4a\xa1\x22\x94\xd0\xce\xea\x65\x39\x1d\x09\x42\x59\x6e\x82\xdd\xfe\xc7\xea\x71\xf3\xf0\x19\x20\x56\x4a\x42\x70\x2d\x45\x6e\xb9\x47\xf3\x54\xca\x72\xda\x7b\x32\x08\x70\x4d\x78\x86\x66\x73\x14\xcf\x70\x0f\x8d\xd0\x9e\x58\x78\xd0\x2c\x0c\xb1\x22\x01\x9a\x97\x43\x56\x1f\x6a\x00\xdd\x0f\x02\x25\x62\x04\xf3\x6c\x8e\x8e\x49\x74\x3e\xdc\x36\xbe\x22\x10\x89\x59\xe5\xc7\x6f\xb7\x5d\x76\xd3\x5f\x10\x74\x28\x3a\x3e\x02\x95\x9d\xb2\x2b\x07\x51\x9a\x30\x40\xf1\xc1\x69\x4d\x89\x22\xa1\x65\xd9\xd5\xf0\x36\xa5\x47\x92\x8a\x44\x89\x8f\xe4\x2d\x77\xb3\xe5\xbc\x2a\x88\x25\x46\x8c\x90\xb6\x99\x79\x8e\x90\xa3\x18\xe4\xfd\x54\x10\x1b\xfc\x6e\x2b\x4f\xab\x38\x0c\x60\xff\x16\x1f\x83\x2c\x1b\x57\xfb\xd9\xb8\x7b\x54\x90\x4a\x69\x49\x52\xe4\x97\xcc\x34\xbb\x4e\x71\xae\x7b\x06\x20\x26\x18\xc8\xbe\xb4\x8e\xea\x6c\x51\x9c\xa2\xdc\x26\xea\x5c\x34\xc7\x46\x12\x47\xbc\x26\x52\xd1\x98\xc9\x01\xf8\x13\x72\x55\x1e\xc7\x2e\x8f\xa2\x49\x84\x89\x0a\x14\x7f\x7f\x34\xa6\x9e\x66\x9b\x15\x95\x89\x07\xc9\x2e\x73\xd1\x5d\x5a\x2a\xf4\xba\x17\x5a\x3b\xee\x2a\x79\x1d\x50\x1b\xdd\x89\xd1\x08\x60\xca\x0d\xb4\x2f\xbd\xf5\xed\x2f\xcc\x54\x8c\xf1\x24\x44\x69\xfe\xe5\x81\xa7\xc2\x28\x4a\xfb\x32\xd2\xc3\xee\xe9\x61\x7f\x38\x5d\xe3\xfc\x55\x18\x7b\xb2\x4b\x5b\xf7\xb8\x2e\xfa\x21\xaf\x42\x09\x11\xed\x58\x1b\x6d\x11\xfb\x30\x1f\x34\xb9\x67\x14\x24\x20\x86\xdc\x39\x97\x1d\xe4\xc6\x5f\x2c\x8a\x13\xe3\x42\x55\xab\xbc\xac\x1d\x69\xe2\xf2\xb2\xbb\xe2\xa9\x93\x2a\x4a\xac\x04\xf7\x4b\x39\xf0\x12\x55\x24\x88\xec\x1d\xb2\x65\x3b\x0c\x9c\xf4\xc0\x55\xce\xf4\xb3\x8e\x8f\x64\x8c\x26\xf3\x01\xe5\xbf\x86\xee\xb5\x8a\x34\xf8\xca\xfd\xc1\x12\xad\x22\x13\x26\x36\x8e\xaa\xb1\xd0\x77\x74\x39\xae\x6d\xb5\x7f\x8d\x0e\xe0\xa2\xd0\xed\xdb\x75\x13\x35\x26\xb6\x14\xf3\x19\x9a\x8f\x18\x66\x7d\xcb\x88\xa3\x73\xfa\xb0\x58\xfd\x35\x25\x1a\xa9\x62\x6e\xb5\x18\xfc\xec\xd8\xee\xaf\x56\xe9\x51\xc8\x53\xc5\x20\x91\x98\xe2\x94\x15\x05\x68\x4c\xfd\xb9\x23\x09\x0b\x11\x42\x7a\xae\xa1\x9a\xd5\x8e\x97\x2a\xe1\xb1\x71\xa4\xbe\xd6\xb9\x5e\x77\x76\xb1\x4a\x03\xf0\x04\x7f\x8e\xfc\x78\xc6\x89\x57\x69\x62\x2b\x43\x50\x6d\xa4\x35\xbb\xea\xfa\x5c\x89\xe2\x0d\x3a\xab\x74\x7e\x60\x89\x34\xc0\xfc\xcc\x43\xa6\x5e\x77\x0d\xe2\xe1\xbb\x07\x97\x01\x20\xb2\xe6\x70\xc2\x6d\xd3\x17\x34\x5f\x21\xb4\x26\x97\x94\xd2\xb2\x35\xff\x29\xaa\xac\xe8\x3e\xb4\x92\x12\xf3\xbd\xa8\x8b\x61\x97\x45\xd4\x2f\x70\x87\x35\xb7\xb8\x1c\x97\x37\x76\x85\x58\x85\x46\x49\x96\x4f\x53\x51\xfe\x02\x52\x23\xb7\xe1\xfe\xbd\xdd\x5a\xb0\xe6\xca\x6e\xc4\xdd\x18\x07\xa7\x42\x5b\x20\x6a\xe1\xd1\xb4\xd6\x6d\xe1\x30\x85\x75\xd7\x48\x5a\x9f\xc8\xf2\x4a\x7d\x10\xa5\x55\xa0\x03\xd4\xf0\x68\x3c\x67\x18\x5a\xca\xa7\x66\x40\xe7\x74\x95\x2f\xbb\x66\xb7\x93\xca\xc4\xf6\xa1\x0b\x78\x5f\xb6\xcb\x9a\x5e\x65\x4d\xf6\xdf\xa9\xef\xad\x8c\xb1\x8b\xab\x65\x09\xfd\x37\xa8\x66\x98\xff\xd0\x24\xd4\xdc\x51\xfa\xf7\x1c\x82\xa3\xd1\xa9\x49\x9a\xe2\xf0\xd8\xac\x1e\x07\x54\x5a\x52\x13\xc1\x11\x9c\xaa\xf2\x4c\xbd\x2e\xcf\x4d\xd3\x51\x5c\x68\x22\x04\x96\x6a\x1d\x4b\x9d\x99\xcb\x30\x0b\xf6\x41\x6c\xc7\x06\x2a\x1d\xf3\xbb\xd4\x44\xeb\x30\xf6\x05\x2d\xea\x75\x20\x31\x2c\x35\x31\x96\x4d\xd0\x49\x45\x4c\xd1\xac\x3a\x20\x12\xf7\xa6\xd6\x4e\x78\x7d\xd4\x1f\x78\xd9\x3a\x60\x31\x58\xae\x86\x57\xa8\x6e\x16\x8f\xf7\xa0\x33\x51\x64\xff\xed\x6f\xc4\xa2\x14\x5d\xab\x83\x5f\x21\x36\x05\xce\x8b\x2e\x1a\xa9\x43\x21\x70\xe5\x3b\x34\x2f\x59\xa5\x31\xd4\xd8\x4f\x3e\x1d\xc5\x11\xa6\x72\x05\x82\x4e\xf6\xd5\xb9\x6e\x76\xab\xf1\xd7\xd1\x91\xb0\xf5\x5c\xc5\x84\x5e\x5d\xea\x48\x51\xf2\x01\x93\xe5\x60\x0d\xd4\x9c\x5b\x2f\xb3\x81\xba\x19\xa0\x17\x74\x1c\x26\x48\x54\xe9\x14\x3c\xbb\x9f\x23\x6e\x21\x16\x5a\x3b\x2c\x04\x86\x74\x66\x27\xa3\x8e\xd3\x50\x5b\xa2\xe4\xfc\x0d\xbc\x62\xde\xb4\x88\xe3\xba\x20\x43\xc7\x69\x8c\x43\x6e\x2f\xea\xd7\x0f\x20\x99\x3a\x16\x11\x5a\x4a\x1b\xe3\xdf\xce\xb2\x53\xcd\x53\xcb\x0c\x97\x57\x9d\xc4\x80\x29\xce\x17\x51\xe9\x95\x18\x46\x8e\x75\x92\x6a\x5b\x1e\xb7\xf8\xc3\xff\xa4\xa2\x00\x33\x6a\x3a\xab\x91\x0a\xf9\xa1\xac\x9a\x97\x6d\x69\xe1\xf3\xbd\x59\xa5\x95\x10\x1e\x6b\xbb\x2e\xf4\xa9\xcc\x8a\x66\x59\x21\x4f\xcd\xf4\x8d\x47\x7d\xa4\x23\x82\xd9\xcd\x4a\x34\xf0\x68\xfe\x7c\xf0\x10\x1b\x0d\x24\xc4\xc5\xb1\x5b\x31\xca\x41\x52\xbd\xdd\xcf\x10\x88\x55\x16\x08\x0a\xed\x9c\xe5\x0f\xfc\x84\xbf\x8f\x0b\x12\x06\xcb\x80\x86\x48\x62\xb4\xa8\x41\x3d\x8b\x71\xa6\x4d\x83\x94\x23\xa2\xc3\x81\xb5\x32\xfe\x1c\x26\x88\x62\x87\x7b\xc5\x98\x16\x3c\x8b\x7a\xc6\x2e\xd1\x86\x2a\xe2\x6a\x4f\x97\xa2\x06\xab\x62\x38\x3f\xc1\x8c\x30\xb8\xa9\x55\x08\xf7\xf2\xc4\xf4\xfe\xa0\x49\x68\xec\xf8\x19\x33\xb5\xa8\x64\x36\x00\x40\xfa\xe8\x0a\x90\x44\x0b\xf9\x29\xc0\x77\x3c\xaa\x20\xa0\x01\x66\x51\xdc\x4e\x80\x08\x0a\xcf\xe9\x7f\x73\xe5\x58\x40\xa0\x42\x0c\x07\x6b\x78\xa3\x36\xfe\x4e\xb7\x9d\x59\x0a\x01\xa4\x68\x66\x19\xe4\xb8\xdc\x97\xb3\x5b\x89\x63\x62\x93\x40\x63\x2a\x7a\xe6\xf5\xa7\xb2\x2b\xc0\x03\x2a\x39\xf6\xd9\xbf\xcb\xac\x40\x95\xee\x59\xfa\x0f\x60\x81\xd5\xc1\x72\x71\x6d\xa8\x32\x93\x59\xdd\x36\x1b\xf5\x83\x59\xdd\x44\x09\x4c\x30\xe3\x82\xce\x68\xe2\x0c\x39\xaf\x7d\x13\x69\xc5\xd2\x4b\x63\xda\xa3\x77\x3d\x48\x19\x42\xce\x62\x5f\xab\x6f\x4c\x96\x67\x57\x5c\x2e\x10\x42\x67\x7d\x75\xe2\xa9\x88\x89\x99\xc6\x8c\xc6\xef\x13\x51\x45\x55\x57\xfd\xd6\x9c\xeb\xe5\xb9\x2a\x30\x35\x3f\x7c\xfa\x28\xe4\x58\xf0\x3f\x4c\x68\x8d\x4a\x29\x66\x53\x58\x10\x45\xa1\x0e\x7d\x0d\x74\xdd\x6c\xa1\xba\x99\xd0\x3f\x4b\x88\xd2\x30\xf4\xc2\x62\x8e\x69\x77\xfc\x84\x3c\x04\xed\x50\xa8\x56\xe9\xf7\x73\xce\x10\xe0\x4a\xe9\xb4\x1b\x10\x5d\xea\xf4\x43\x0b\xa3\x7f\xcb\x38\xb4\xcb\x6e\xeb\xbd\x58\x87\x71\xb8\xa2\x41\x1c\x09\x2b\x4f\xfd\x22\x2a\xb0\x25\x59\xee\x48\xc2\xa5\x70\x29\xdd\x8d\x2a\x17\xcf\xc3\x04\xf7\xe0\xfa\x89\xd1\x5c\xf8\xee\x28\x1a\xe8\x6a\x13\xdc\xf1\x94\x86\xb8\x15\xbd\x88\x1a\x2b\xd6\x26\x07\x13\xab\x27\x70\xae\x8a\xbb\xb2\x41\x8d\xd5\x91\x05\x00\x29\x93\x69\x4f\x5a\x84\xf6\x43\x35\x15\xca\x9f\x0b\x00\x43\x1a\x52\xc4\x30\xfb\xd0\x8d\x63\x54\xf6\x47\x95\x91\xbd\x66\xd9\x0d\x96\xa9\x4f\x30\x81\x20\x52\x4b\x76\x8a\x55\x66\x7b\x04\x42\xff\xe3\x0c\x83\x45\x67\xd2\x5c\x53\x07\x62\xcc\x81\xcd\x6f\x6b\x20\x89\x55\x95\x7d\x39\x66\x1f\x52\x7b\x81\xa4\x5c\xb9\x01\x36\x33\xa1\x64\xa8\x65\xff\x59\x66\x5c\x25\xd0\x8c\xa9\xa1\x1b\x79\xcd\x1c\x2c\x41\xa7\x0c\x53\x27\xf7\x8b\x3f\x0e\xab\xc7\xbb\xbb\xf5\x6a\xff\xf8\xb4\xf3\xbd\x03\x84\x07\xfd\x7a\xe0\x63\x6f\x57\x7c\x0c\x00\x49\x4c\x79\x4f\x4a\x8e\x9f\x7f\x10\x0c\x04\x10\x3c\xb5\xac\xa1\x55\x75\x3e\x35\xeb\x3c\xeb\xac\x74\x00\x6d\x61\x1f\xb9\xad\x58\x1e\xa3\x79\xc1\x80\xf6\x8e\xe3\x16\xaa\xba\x2c\xb6\xa2\x82\x62\x36\x22\x69\x08\xb3\x48\xc2\xaf\x90\xe7\x25\x06\xd3\x26\x5e\xbe\x09\x02\x81\xc9\x27\x2c\x43\x99\x23\xdc\x9d\x9f\x75\x26\xa0\x0a\xf3\x02\x4f\xa2\x81\xa0\xbb\x18\xd3\x7d\x60\xdf\x56\x4a\x8e\x06\x82\x09\x62\x13\x7b\xf0\xb9\x25\x94\xb2\x65\x52\x97\x19\xb2\x6b\x69\x28\x0b\x90\xb8\xf8\x70\x68\x3a\xd2\xae\xcd\x6a\xb1\x6d\xe7\x78\x07\xc9\x9c\x46\x38\x46\x56\x89\xa1\x8e\x01\x4d\x61\x0e\xde\x0a\xe1\x75\x94\xa6\x7e\x26\x19\x2a\x43\xc4\x68\x7a\x88\x6b\x56\xcb\xbe\x0c\xd9\x50\x25\x10\x4f\xf5\xef\x73\xdd\xba\xa5\xad\x6d\x66\xb3\x06\xa3\x87\x65\xc4\x60\x4c\x13\x7e\x81\x1a\x58\x64\x1e\x44\xe2\x5b\xd1\x14\x51\x1e\xa6\xfd\x06\xfe\x1a\x81\xcd\x9f\x05\xdd\xa5\x74\x84\xba\xa8\x47\xcb\xba\xf9\x52\x01\x6c\x73\xd1\x7d\xb2\x30\x8e\x69\x17\x83\xed\xd3\x21\xfe\x68\xc2\xd1\x86\x59\x8a\xd6\xc3\x9e\xb1\x2a\x4c\x28\x54\x64\xa3\x8f\x17\xb6\x1b\x84\xd9\x4d\xc4\x04\x16\x92\x9c\x8b\x1f\x65\x03\x3d\x83\x9a\x89\xa4\x95\x60\x7f\x86\xc6\x02\xc4\x97\x97\xd5\x4b\x79\x65\x87\x98\xc8\x58\xae\x88\x7d\x85\x83\x7d\x50\xa9\x68\xb8\x06\x2b\x73\xdd\x43\x4c\xbc\x41\x61\x92\x40\x76\x99\xe1\x85\x43\xe1\xf8\xf3\x12\xc3\x42\x1b\xbb\xb3\x20\x30\xd0\x96\x41\x0d\xaa\xdd\x0b\x16\xc4\xbb\x76\x69\x2a\xd1\x2d\xe8\x60\x1f\xcb\xcb\x72\xbf\x9a\x5f\x6b\x4c\x2a\x13\x82\xce\xc8\xd7\x6e\x4d\x37\x82\x68\xe8\xd1\xa5\x7d\x79\x18\x9d\xf4\x9e\x08\x43\xc4\x7b\x3a\xa5\x82\x0a\x60\x14\x67\x1a\x37\x96\x8c\x22\xa6\xf5\xa0\xa1\x01\xd5\x25\x8b\xbf\x54\xe5\xf9\x34\xbf\x56\x1a\xc9\x14\x92\xac\x98\xf2\x5c\x39\x29\x81\x75\x6f\xa2\x1a\x25\x28\xe9\x8a\x91\xe7\xbe\xae\x8e\x0d\xfa\x85\x98\x48\x3a\x42\x61\x61\x58\xfe\x74\xad\x2d\xed\x80\x9f\x50\x58\x26\x79\x0d\xb6\x31\xa0\xa4\xf1\x89\x44\x78\x83\x4a\x67\x96\x83\xab\x9a\xf5\x9e\x0d\xe8\x08\xe3\xe0\x37\x65\x6e\xbb\x9f\xfa\x1b\x1a\x99\x20\x2f\x8d\x45\xea\xb6\x2b\x5a\x19\x7c\x2d\xcf\xd7\x0a\x16\xb3\xe6\x8a\x31\x9a\x05\x03\x25\x6b\xb1\x15\xcf\xa2\x7d\xdc\xb2\xbb\xbe\x51\x61\xda\x21\x62\x1e\x0d\xbe\xed\x54\xe1\x56\x11\x92\x32\x64\x01\xbb\x6f\x2d\xbd\x2c\x1f\x84\xd6\x15\x09\x44\xea\xc1\xbd\x56\x13\xdf\xa5\x82\xeb\x61\x49\x96\x22\x34\xd6\xa1\x71\xa2\xe6\xa8\xe3\x99\xe7\x53\x0e\x50\x45\x58\x94\x22\x12\x56\x41\xd5\x74\x96\x62\x3d\x6d\xa4\x13\x69\x17\x14\xfd\x0c\xa3\xd5\x5d\x91\x30\xb6\x54\x4b\xa7\x0a\x9e\x0b\x51\x34\x77\x59\xf1\x9c\x97\xc5\xf3\x4a\x34\x5d\x9b\x28\x48\x30\x93\xe3\x97\x9a\xf3\x2c\x1b\xc3\xe7\xb0\xc0\xb9\x89\xa1\x08\x8f\xd3\x10\x07\xdf\xb9\xd0\x23\xd8\xa4\x22\x5c\x00\xd2\x68\xa1\x49\xb8\x3c\x5f\x70\x2d\x45\x26\xa0\xff\x43\x1d\xe8\x5f\xfd\x3b\xb0\x2a\x15\x89\x89\xcd\x39\x69\xd1\x08\x27\x03\xe8\xca\x80\x50\x2d\x77\x6c\x2b\x24\xff\x0a\xfd\x37\x8f\x63\xe1\x4b\x94\x16\x93\xa4\xa6\x22\x49\x4c\x84\xa3\x43\xcb\x73\x18\xd0\x15\x7e\x6c\x30\x2a\x92\x72\x82\x5c\x64\x47\x57\x5c\x3c\x88\xbe\x2b\x92\x3a\x88\xdc\x68\x52\x4e\x34\x06\x14\x11\x92\x23\x80\x5f\x9e\x2f\x8b\x3c\x9f\x67\x12\x9c\x0d\xc3\x0c\x2e\x61\xe4\x00\x07\x8f\x2b\xf8\xcd\x0c\x6b\xa5\x6b\x2d\x09\xc5\xc4\xd1\xb7\x17\xf1\x3e\xac\x32\x9e\x71\xe2\x15\x91\xad\xef\xf5\xff\xfe\xbf\xff\xb7\xb8\x1d\x55\xb7\x28\x22\x13\xcb\xf8\xe7\xbc\x0d\x4b\x4f\x3e\x71\x96\x14\x91\xa9\x46\x4d\xa5\x6d\x99\x5f\x6e\x06\xca\x4b\x93\xbe\x97\x82\x47\x2e\xc1\x74\x73\x6e\xd4\x8b\xcb\xc2\x63\x65\xea\x64\x3a\x28\xcd\x2c\xbe\x07\xb9\x3b\x7d\xc8\xe7\x13\x76\x65\x45\x14\x44\x88\x91\x43\x1e\x03\x57\xf1\x3e\x8d\x16\xf8\xa6\x46\x5a\xe5\xea\xac\x68\xee\x11\xe6\x84\x8f\xf1\xc9\xc5\xb5\x90\x5a\x7a\x1d\x1c\x8d\x1a\x45\xf3\x45\xab\x8a\x68\x0d\x81\x2f\x0c\xd9\x96\x65\x3e\x1f\x73\x51\x44\x43\x88\x59\xe3\x53\x55\x4a\x8b\x81\xe9\x8a\xc6\x15\x81\x40\x29\x0b\x0a\x7c\x03\x91\x63\xfa\xfd\x3e\x2b\x2c\x55\x55\xfd\x53\x64\xcd\x6d\x59\xad\x72\x10\x15\x4a\x2e\x74\x65\x09\x8a\x40\xa4\xb1\x92\xd0\x8a\xe2\xae\x5e\x60\x50\x34\x37\xbe\x3f\x70\xa1\x95\x27\xd1\x3b\x64\x85\xce\xde\x32\x7d\x16\xf9\xa1\xb6\x42\xe0\xe3\xd6\x86\x13\xa1\xbb\x0a\x74\xcb\xb9\xec\xcb\x3d\x26\x2d\x53\x8a\xfc\x66\xf5\xf9\xd4\x6e\xd8\x0b\xad\x9d\x16\x59\x30\x1d\xa2\x46\x71\xb0\x65\xb0\x7d\x64\xb8\x5b\xb9\x8d\xd2\x7a\x90\xd4\x5a\x3f\x43\x05\x93\x55\x37\x20\x24\xb1\x75\x67\x85\x65\x07\x38\xf4\x42\x18\xe5\xf1\xd3\xd8\xb6\x0a\x48\x1c\x62\xfd\xc0\x5d\x59\x3c\x6f\x73\xd1\x3b\xce\xff\xa2\x3d\xb0\x24\x76\xe5\x20\x1d\x20\x98\xfe\xef\xf4\x32\x3a\x46\x13\x52\xb6\x1b\xf6\xa6\xc0\x2f\xe5\x36\x41\x15\x04\x49\x88\xe1\xc0\x2e\x64\x88\x32\xa6\x67\x44\x69\x0e\xe7\x5f\x10\x98\xd4\x91\x9d\x14\xae\x7b\xfd\x25\x68\x00\xc6\xf2\x94\x1d\xe0\x78\xea\xbe\x73\x40\x79\x8c\x7e\xc4\xe3\xfd\xe6\xc7\x66\xe1\x7f\x65\x44\xa7\xc4\x83\x3e\xbe\x3f\x6d\xba\xdf\x59\x12\x24\xae\x8c\x3e\x2b\x9e\xb1\xf6\x64\x34\x25\x02\x06\x8a\x51\x27\x6d\x18\xdc\x95\xea\x75\x5d\xe8\x3e\x96\xa7\x02\x66\xac\x70\x6a\xcf\xb6\x53\xc3\xe4\x6b\x44\x29\xc3\xf8\x10\x14\x1a\x91\x55\x3f\x01\x5e\xfd\xe9\x91\xa6\x48\x31\x60\xad\x27\xc4\x65\xf4\x4a\x62\xd3\xb0\xf3\xa4\x8b\x79\x44\x8c\xe9\xf3\x4d\x07\xca\xfc\x55\x79\xcc\x91\x43\x65\xf7\xfd\xbe\xfb\x29\x21\xa9\xf3\x50\x7b\xf9\xeb\xbf\xc0\xe9\xeb\x4e\x8f\x99\xb5\x7f\xfe\x14\x55\xbb\x17\x0e\xab\x2d\x55\x10\x87\xa9\xaf\x70\x77\x03\xfa\x5f\xff\x3b\x1b\x1a\x1d\xec\x1d\x41\xcc\x29\x75\xc1\x80\xd6\x68\xc4\xbd\xb5\x42\x70\xf6\x87\xd9\x17\x3f\x07\x82\x58\x5a\x05\xf2\xbe\x5c\xe2\x8b\x68\xe0\x5d\x74\xa3\x20\x21\xc4\x31\x55\x39\x18\xcf\xba\x1f\x39\x49\x64\x29\xb0\x90\xd0\x60\xd9\x39\xfa\x2a\x48\x34\xc3\xc1\x50\xbf\x03\x9c\xa0\x9a\x00\x0f\x55\x90\x26\x04\xc3\xfd\x4f\x65\x3e\x32\x98\x82\x54\x1b\xab\x00\xdb\x88\x57\xb0\xe1\xef\x37\xc4\xb3\x62\x89\xb9\x0d\x74\xcc\x26\x76\x92\xbf\xcf\x6e\x3e\x9f\x04\x2b\x54\x90\x1a\x85\x37\x73\x08\x31\xf7\xab\x88\x15\xef\x40\x26\xe7\xa2\x59\xb4\x0b\x70\xbb\x16\x0e\xed\xae\xbe\x31\x50\xed\x2b\x3b\x7c\x80\x68\xb9\x5a\x3f\x0e\x6a\x61\xb1\x15\xc2\x3d\x7a\xd3\x0d\xa6\x5a\xf9\xbe\x65\x92\x60\x84\x0a\xd3\xde\x9f\x6d\x17\x81\x90\x36\x4e\xf2\xfd\xe9\xce\x3f\x0c\x56\x4b\xf9\x12\xef\x6e\x15\xe8\x0e\xda\xfc\x35\xae\xae\x03\x9d\xf8\x3e\xae\x39\xfc\xd3\xdf\x47\x85\x94\x29\x7f\x51\x53\x22\xcf\xfc\x64\x62\xab\x28\x45\xa7\xf2\x54\x95\xc7\x72\x55\x6a\xd8\x77\x75\x73\x23\x5e\xba\xa0\xbb\xa6\x0a\x90\x00\xae\x6e\x4a\x8b\xe1\xd8\xbd\xfb\x1a\x23\x15\x28\xe0\xf8\x16\xed\xce\x79\x93\x3d\x1f\x27\x4b\x80\xa6\x89\xb0\x05\x33\x1a\xe0\x78\x07\x6f\x8b\x42\xdf\xc2\x64\x87\x08\x74\x6c\xb5\x6a\x97\x65\xf9\x6a\x71\x13\x7a\xd2\x02\x38\x11\x1d\xb0\x1c\xb5\x0d\xa1\x81\xaa\xde\x79\x48\xb6\x0a\x4c\xa0\xa4\x1b\xdd\x3b\xf1\xd6\x0d\x10\x4a\x18\x41\x1b\x79\xb5\xff\xd9\x0c\xc6\x2e\x25\x4c\x63\x98\x69\x5b\xd9\x0a\xfa\x45\x9e\x97\xa3\xd1\x42\x49\x48\x94\x8f\x22\x21\xe5\x1d\x16\x9f\x8d\x1f\x8c\x92\x30\xc1\x15\x3d\xcf\x8e\x59\xb3\x51\xe5\x10\xdf\xa4\x28\x89\x24\xda\x89\xea\x5c\xd9\xd2\xb5\xf5\xa9\x54\x2f\xdd\x51\x6e\x05\x65\x74\x56\x23\x67\xb9\x2f\x84\x1f\xd0\x54\x28\x4a\x92\x58\xa5\x28\xd7\xec\xcb\x08\xa6\xe4\x1c\xa3\x1e\xa7\x44\x77\xc3\x0a\x03\x5f\x2b\x71\x1a\x8e\x6e\x4a\x00\x50\x19\xe4\xd0\x89\x53\x29\x1a\x10\xe2\x45\xeb\xef\x2f\x3b\x28\x1a\x84\xf0\x3d\x1a\x03\xd5\xa6\x6f\x24\x94\xe2\xe8\x6c\x34\x95\xb8\xcf\x0a\x4b\x1e\x3b\xa9\xc5\xf3\x2b\x15\x0d\x64\x8a\x5e\x42\x5e\x0a\xdd\x41\x7e\x27\xcb\x19\x0d\xb4\x24\x96\xa0\x1f\x59\x4f\x27\xee\x11\x0d\x0c\xc1\xe8\xea\x97\xaf\x9b\x6b\x07\xb7\x3d\x2c\xa8\x03\xf1\xae\xef\xbe\x42\x65\xfb\xfe\xaa\x70\x59\x51\xca\x6d\x60\x78\xe5\xf4\x16\x85\xbe\xcb\x0a\x18\x85\xc9\x26\x9d\x48\x55\x8a\xbe\xb7\x2b\x03\xef\x24\x89\x2d\x68\x17\xba\x3e\x61\x54\x7a\xca\xa7\x03\x92\xd3\x69\x5b\x14\x71\x10\x63\x1c\x94\xa2\x2c\x0e\x78\xc7\x71\x52\xea\xd6\xd0\x7d\xcb\x9a\x8b\x4b\x0a\x4f\xdf\x3c\x24\x62\x90\x6c\xb8\xc5\x08\xc0\xfa\x57\x0f\x18\x9f\xb4\x8e\x22\xcc\x60\x64\xb5\xad\x1a\x1b\x6c\xd3\x94\x33\x85\xf5\x50\xb5\x78\xcb\x8a\x67\x24\x26\xec\x46\x27\x0f\x13\x4a\x3c\x4b\x05\xda\x01\x16\x44\xf7\x70\x3e\x3a\x46\xff\xf1\x7d\x78\x6c\x09\xa4\xd0\xd3\x00\xdd\x7e\xb2\x0f\xa3\xeb\x93\x33\xd3\x04\x09\xfc\xfe\xf9\xfd\xe1\x6e\xb1\xe9\xee\x9f\xca\xd4\xf5\x9e\x8f\x9f\xf6\x91\x53\x45\xb9\x32\x68\x37\xb6\xa3\xde\x71\x36\x8e\x8c\x24\x1a\x47\x40\xc3\x7e\xb1\xfb\x14\x6b\xa7\x68\xcc\x35\x56\x92\x23\x7e\xc5\x97\xfe\x5b\x6a\x60\xdf\x22\x91\xf8\x94\xf9\x80\x0c\xcc\x1f\x4a\x8d\x25\x67\x3b\x4b\x47\x4e\xd7\x83\x8f\x5a\x03\x48\x8c\x55\x7c\x67\x37\x01\x9a\x30\x62\x71\xa4\x85\x7e\x28\xfd\x4d\x93\x58\x58\xa1\x40\x0b\xbb\xbf\xc9\xc4\xb1\x2c\x86\xba\xec\x8a\x26\x2e\xea\x06\xbf\x4e\x99\x75\x4d\x36\xde\xf2\xf7\x4d\x84\x14\x58\x93\x63\x1d\x52\x2f\x1a\xe5\x63\x82\xf7\xe5\x88\xbf\x6b\xd0\xc7\x92\xc4\x88\x02\xf4\x1c\x38\xe3\xa8\xb0\xa2\x92\x46\x88\x4b\xdf\x3e\xad\xef\x37\x0f\xeb\xa7\xc3\xe2\xe6\x66\x7d\xf3\xb9\x25\x4d\xdb\xb5\x02\x63\x46\x8e\x38\x6c\x16\xe8\x81\x7b\x4c\xe8\xcf\x70\x8a\x29\xf7\x8b\xdd\x7e\xfd\x74\xf8\xb9\xb8\xbb\x5b\xef\xfd\x33\x28\xc3\x2c\x6f\xf7\xe6\x8b\x85\x42\xfa\x3a\x67\x77\x5c\x47\x11\x72\x5d\x7d\x81\xa6\x07\x91\x75\x3d\xa3\x79\x18\xc6\x5d\x2e\x60\x52\x9c\xe1\xdb\xc4\xc4\x12\xf2\x62\x10\x74\xfe\xa5\xb4\x14\x94\x79\x5b\x47\xdf\x96\xd5\xb6\xcc\xf3\xcd\xcd\xbc\x43\x49\x81\x5a\xcc\xcb\x20\xbc\x76\xb9\xc9\x2a\xe8\x6b\xd3\xa7\x01\x01\x0a\xd4\xca\x87\x39\xff\x66\xef\xe8\x12\x47\x25\xa6\x73\x91\x42\x45\x81\xc7\x18\x1b\x33\xe5\xb9\xd0\x50\xb1\x61\xad\x52\x7b\x54\xa2\x21\xbf\xf8\xcf\x59\x20\x68\xff\xaf\xc6\x66\x7e\x13\x98\xfb\xdc\x70\xa6\x10\x6b\x54\xea\x3a\x55\xd9\xdb\x21\x2b\xee\x45\x56\x20\x87\xcf\xe1\xf0\xb7\x3e\xb6\x33\x68\x6e\x24\xc2\x65\xb2\x7a\xc8\x8b\xf0\xd4\x49\xb0\x8f\x8d\x18\x6a\x68\x28\x0c\x6e\x2f\xe5\xe9\xb6\xbc\x36\xea\xc7\xcf\x62\x62\x6d\x7d\xa6\x42\x7d\x81\x82\x0c\x52\x78\x8a\x11\x4e\x31\x0e\x73\xbc\xc8\x19\x24\xb4\x62\x41\x60\x98\xf5\xca\xe1\x2d\x2b\x27\xaa\x35\x8a\x05\xa1\x48\x7b\x8a\xdd\x2f\x5d\x4d\xc8\xfe\xd7\x3c\xc0\x48\xb1\xd6\x01\x50\x1d\x87\x95\x8f\x64\x8c\x52\xf5\xbe\xa5\x11\x9c\x76\xfa\xaf\xed\xc2\x5f\x0f\xfd\xe6\xb1\x22\xb8\x62\x34\x54\xb8\x1f\xba\x12\xc6\x3c\x07\xd5\x74\x5a\xc8\xfe\x75\x29\x8f\xed\x72\xb3\xdf\xef\x2c\xdc\xdd\x31\x07\xcf\xc6\x04\x18\x4d\x35\xe6\xd9\x34\xe4\x6e\x11\x19\xae\xc0\x8c\xea\xc4\x0b\x58\x3c\x1a\x83\xdf\x77\xe3\x10\x5a\x1f\x5c\x90\x05\x56\x49\xd2\x57\x50\xdf\x95\x62\xb2\xaf\x33\x16\x49\x02\x5e\x8a\x03\x57\xa3\x9e\x63\x84\x12\xdf\x28\x21\x89\x2b\x2d\x12\xd6\x72\x73\xd2\x4f\x23\x41\x82\xf9\xf1\xc0\x58\x62\x09\xdb\x9d\x52\x1f\x46\xe1\xd1\x51\x77\xfb\xe3\x79\x42\xde\xae\x18\xd3\xa1\xa7\x7f\xbe\x13\x15\x5a\x55\x37\x90\x4f\x72\xda\x8a\x85\x11\x63\x8e\x50\x63\x37\x2d\x55\xf7\x4d\x62\x85\xf0\x98\x03\xf9\xb5\x87\xba\x19\x7d\x9c\x28\x09\x13\x77\x17\x74\x6c\x03\x32\xee\xee\x48\x24\xa8\xde\xe8\xcc\x92\xad\xfd\xd3\xf6\x4e\x6f\xbd\xd6\xdd\xc5\x94\x55\x3f\xaa\x5b\xf7\xfb\x5c\xe8\xaf\xe5\xb1\x0b\x44\xb0\x58\x24\x96\x3f\xb0\xed\xad\x70\x58\x64\xa1\x58\x2c\x79\x68\xb5\xa6\x8f\xc7\xcc\xe2\xde\x46\x93\x8f\x25\xdc\x12\xc1\x60\xf5\xa3\x1a\xe9\xe3\x29\x96\xa4\x0a\x47\x0c\x54\x8a\x92\xcd\xf1\x94\xfb\xcb\xa6\x81\x4a\xa3\xbe\x18\x0c\x13\x1a\x74\x60\xaa\x30\x91\x28\x66\x35\x0f\xd4\xa8\x57\x84\x26\x48\x47\x69\xca\x4a\x81\x15\x44\x98\x2a\x4e\x28\x26\x43\xc9\x5c\x28\x11\xb9\xac\xf7\x95\xc8\x9a\xe9\x64\x95\x71\xea\x1e\x01\xb1\x55\xa3\x75\x40\x6a\x69\xa5\xf9\xd1\x0e\xe9\xec\x91\xf1\xd0\x94\x10\x62\xe9\xb1\xb6\x60\x2f\x58\x65\xcd\x05\x81\x2b\x9f\x8f\x37\x45\xa9\x44\xa1\xa7\x5c\x77\x42\x52\x8a\xa9\x24\xc1\x2c\x75\x9f\x03\x7d\x2c\xfc\x8e\xdd\xb5\x49\x15\xed\x98\x24\x3b\xf0\x9a\x62\x4a\x29\x4b\x66\x6b\xb5\xfd\x7e\x39\xe0\xa8\x3f\x0a\x56\x0e\x23\x2b\xea\x76\x00\xba\x5f\x75\xc0\x30\x31\xd9\x64\xc5\x4b\x53\x0e\xe0\xbf\xe3\x87\xd5\xcc\x92\x8e\x0b\x0c\x49\xdb\x4c\xd5\xd4\x1f\x63\x3a\x15\xe8\x23\x1f\xa4\x6a\xd4\xef\x4a\x34\x27\x4b\x80\x06\x19\x85\x5e\xae\xd2\xe3\xe6\x40\x4f\xcd\x31\x06\x01\xc7\xe5\x4f\x35\xe6\xd0\x45\xe7\x0f\x42\xeb\x83\x70\x62\x52\xa0\x0f\x35\x26\x18\x27\x4f\x07\xd4\xee\xf9\xf7\x9b\x87\xcd\xfd\xf7\xfb\xc3\xf2\xfb\x3f\x0f\x8b\xfb\xc7\xef\x1e\xfe\xa5\x18\x70\x81\x66\xf1\x3f\xf6\x7f\x74\x3f\x19\x8d\x8e\x56\x57\x51\xe2\x08\xbd\xa6\x83\xc8\x84\xca\x92\x16\x89\x5f\xbb\x53\xef\x44\x31\x63\x18\x8e\x8d\xcd\xd3\x7a\x35\x1c\xbf\x21\x21\x9c\xeb\x2e\x68\xb3\xbc\xdc\xc1\xb3\xc8\xf7\xa3\xe7\x9e\x1f\x37\x21\xa1\x56\xc0\x63\x71\x3f\x8e\xc2\x87\x81\x4a\x70\x4a\xac\x9b\x17\xdc\xb3\x86\x46\x82\x6b\x42\x53\xa6\xed\x42\xdb\xba\x04\x87\xe3\xe5\x00\x3d\x4c\x53\x85\xd4\xa4\x91\x67\x52\xf4\x65\x1d\x73\xe8\x56\xd7\x9c\xc9\x34\xd0\x1d\x5a\xe8\x19\xe8\x7a\xca\x94\xa4\xc2\x30\xe4\x2c\xee\xf9\x6f\xaf\x35\xde\x54\x18\x85\xda\x97\x04\x9d\xfa\x67\x89\x24\x8b\x59\x47\xbc\x30\xa3\xf7\xee\xda\x71\x63\x0b\x9d\x1a\xa8\x1b\x2b\x99\xb9\x12\x1e\x33\xae\xc2\x98\x31\x2c\x8f\xcd\x6a\x44\xe3\xef\x2b\xd1\xf3\x94\xbb\x26\x49\x14\x63\x09\xe6\xc1\xe5\xf7\x3f\xc2\xf3\xf9\xe6\x29\x45\x49\xca\xaf\xe2\x74\xba\x58\x29\xb8\xd1\x57\x48\x5c\x0e\xb5\x7e\x11\x27\xa8\x5f\x32\xd3\xf1\x77\x7e\x96\x5b\x09\x53\x22\x3c\x1d\xfc\x97\xbc\x94\x13\x9d\x46\x15\xa6\x3c\xc0\xf0\xe6\xc1\x2d\xf3\xae\x04\xff\x83\x4e\x49\xb5\xc6\x6a\x73\xbf\xa1\x22\xd9\xdd\x47\x94\x52\x2a\x4c\xc1\xc2\x35\xd0\xd5\xff\x06\x52\x48\xbf\x61\x84\xa9\x31\xe8\x46\xb6\xce\xd1\xaa\xcc\x50\x6e\x69\x4e\xb5\xf8\x37\xf6\xdf\x07\x63\x59\xd0\x14\x31\x05\xdb\xc7\xed\xea\xeb\x62\xf3\xb0\x5a\xec\xbe\xfa\x3b\x8b\x50\x06\xbd\x34\xad\xf5\xaa\xb2\x23\x60\x18\x64\xfe\x35\x24\xb1\x5d\x0f\xbf\x1a\xcb\x48\xbf\x2c\xc7\xa1\xc6\xa0\x6b\xc9\x08\xa6\x76\xac\x5f\xae\x47\x9c\x04\x2a\x94\xa1\xe5\x61\x6e\xe7\x48\x56\x3c\x8f\x2c\xe7\xd6\x27\xa1\x72\x18\x00\x82\x85\x52\xe7\x63\xbb\x38\x7c\xa0\xc7\xa4\x42\x15\x05\xca\xe3\x82\xbb\x74\xbb\x0a\xb5\x94\xc8\x35\x8f\x6c\x09\x3f\x01\x5e\x1f\x8b\xee\x18\xc4\x3a\x75\x35\xa2\xeb\xdd\x6a\x79\x03\x6f\x96\xff\x3b\x7b\x9e\x4c\x69\x50\x31\x26\x05\x7e\x78\xa6\x38\x15\x1a\xa6\x02\x6b\x36\xd7\x67\x97\x0d\x9b\xb3\xf1\x7d\xeb\x48\xf8\x22\x1c\xd4\x3d\x84\x11\x42\xbe\x3d\x2e\xa1\xa7\xb7\xa9\x44\xd1\x3c\x9a\x51\x55\x85\x6d\x17\x11\x61\x10\xb7\x7a\xc8\x54\x39\x2c\x05\x51\x11\x71\xfc\x46\xcf\xd0\xec\x32\x0d\x35\xa2\xd5\x66\x07\x44\x14\xa4\x14\x03\x76\x96\xbf\x7e\x5d\x2b\x91\x8b\x91\x13\x3d\x6e\x4e\x49\x1a\x86\x5d\x00\xc5\x46\x2e\x91\x5b\xd5\x9b\x27\x41\xd7\x92\x83\x45\x98\x63\x02\x0b\x1c\x0d\xc5\xa8\xb2\x62\x7e\x8c\x46\x8c\x08\x05\x83\xb9\x64\x23\x35\xd3\xa5\x35\x62\xdc\x0a\xb3\xbb\xb4\xfb\x5c\x00\x60\x72\xdd\x34\x92\xb4\x53\xb0\x1b\x85\x11\xff\x3e\xb9\xb4\xb2\x21\x91\x5c\xd4\x96\xad\xf6\xf0\x46\x5a\x0b\xec\xe0\x2e\xe8\xfb\x99\x69\x81\xc8\x81\x25\x3c\x3f\x8b\x6a\xe9\xea\x79\xdc\xc1\x90\xf0\x04\xe9\x61\x7e\x0d\x6a\x09\x54\x14\x2a\x81\x4a\x82\xcd\xd0\x80\x9a\xdc\x3f\x54\x42\x58\xd9\x59\xcb\xab\x37\x8c\x66\x46\x11\x0d\x71\x4b\xb1\xd4\xff\x8e\xd4\xf3\x62\xfd\x82\x61\x95\xf9\x70\xb5\x8b\x22\x1a\x61\xca\xe2\x8a\xc1\xe9\x73\x09\x89\xf9\xc7\x8b\x22\xce\x6c\xdd\x55\xa5\xeb\xc3\x11\x1a\x91\x1f\xd0\x34\xf2\x8f\xc8\x09\x41\xa5\x99\x63\x56\x34\x5b\x51\x35\xc5\x07\x7c\xc8\x2a\xe2\xdc\x20\x7e\xa6\x7e\x29\x4f\xbb\xa6\xac\x3a\xfc\xc5\xa4\x99\xa6\xb8\xab\xb4\x1f\xe1\xae\x6c\x3c\xde\x44\x45\x1c\xa8\x18\x8e\x95\xd1\x6d\xe6\xc5\x2f\xda\x93\x04\x38\x03\xff\xb6\xb5\x66\x9f\x40\xe8\xcb\x15\x80\x51\x45\x71\xc8\xb5\xad\x73\x76\x15\x8e\x6b\x0c\xba\x6e\xf6\x93\x91\x98\x10\x48\x9d\x87\x88\x90\xdf\x2f\x9e\xbf\x74\x22\xbb\xad\xa2\x24\xb4\xd1\x2f\xa7\x14\xfc\x73\x3f\xb9\x63\x12\x5b\xd5\xc8\x17\x51\xdf\x02\x62\x39\xb6\x55\x69\x26\x64\x72\x2a\x4a\xb4\xc5\x23\xb7\x43\xd3\x86\x53\xbb\xd1\x91\x80\xf1\x13\xf4\x67\x56\xbf\x6c\xf4\x2f\xa8\x17\xd3\xf3\xd3\x30\xc1\x46\x39\x98\x66\x5f\xea\x2e\x71\x15\xa5\x31\xc5\x4d\xef\xd8\x2e\x7d\x3b\x27\xd9\x73\x37\xa8\x09\xf6\x96\x7e\x94\xaa\x00\x0d\x75\x44\xdb\x8e\x16\xec\x48\x04\x54\xc9\x8e\x73\x6a\xe4\x3b\x45\x42\x5b\x79\xa2\x1b\x90\xe7\xe7\x39\x3e\x04\x15\xc9\x58\x77\xd0\xb1\xd7\xe9\x9a\x27\x75\x8a\xf8\xa2\x63\x56\xc0\xe1\xdf\xc2\xd7\x80\xb5\x07\xac\xc3\x73\xbb\x7a\xdc\x3c\x90\x94\xa5\x9f\x88\xd1\x4c\x6e\xa8\x38\x63\x56\xf0\xce\xab\x37\xec\xcb\xef\x45\xf6\x9f\x33\xdc\x8b\xd3\xa4\xe7\x74\x90\x04\x1d\x41\x11\x3a\xab\x5d\xcf\x03\x8d\x71\x28\x37\x20\x8e\x76\x39\x1e\x83\x27\x22\xa0\x89\xe6\x1e\x83\xde\x0e\x27\x74\xd2\x9f\xe0\xdf\xa0\x9a\xbb\x41\xa1\xf8\x88\xec\x50\x45\x10\x5a\xc5\xf8\x43\x3b\x9b\x5c\x4c\x11\x31\x06\x1f\x2c\x1e\x10\xc5\x68\x8a\x1c\x2c\x2d\x8e\x97\xc6\xea\x2e\x97\x86\x38\xa8\xe5\x39\x7f\xf5\x81\x9d\x6d\xb9\x98\xe6\xd6\x66\xe5\x1b\x55\x64\x02\x82\x99\x24\x97\xb1\x3e\x34\x99\x7a\xed\xbf\xbc\xa1\xd2\x2b\x03\xdc\x9e\xf3\xbc\x73\x4b\x07\xe7\x2b\x4e\xac\xef\x0c\x37\x5f\xfe\x6c\xca\x9b\x2f\x7f\xae\xaf\x38\x58\x14\x0f\x62\x8e\x4e\xd2\xae\x54\x99\xc8\xb1\xea\x68\xdb\x8d\x52\x1e\x68\x42\xac\xa5\xda\x4e\xa2\xac\xce\x8a\x67\x1f\x8c\x1c\xdd\x8d\xd3\x28\x90\x5e\xe0\xef\x50\x16\xb6\xd4\x61\xfd\x9f\xef\xed\xd4\xf4\x17\xa3\xb1\x15\x46\x71\xba\x19\x8b\x42\x77\x50\x99\xee\x71\x18\x61\xb8\x7a\x2e\xb2\x6a\x55\x75\xdc\xca\x8a\x33\x4d\x88\x83\xe5\x2d\xcf\x55\xe1\x80\x6a\x3b\x1c\x64\xf7\xe2\xf4\x99\xfd\xc9\x43\xc2\xb0\x24\xfb\x4b\x6b\x05\x20\x4d\xd7\xa6\x7e\x28\x9b\x5b\x0b\x10\x19\xec\x18\x3c\x8c\x0d\xbe\x45\xdb\x49\xf9\xbd\xf8\x35\xc2\x39\xf1\x30\xd1\xf8\x3d\xdf\xca\x06\x76\x6f\x27\x12\x0c\x82\xf7\x3c\x34\x29\xd6\x5b\xac\xf2\x73\xfb\x9d\x87\x76\x33\x8f\x54\x44\x6c\x95\xd3\xbf\xcf\x75\x73\xd0\x99\x31\x99\x3a\xe7\x1d\x96\x81\xf3\x38\xc6\xf1\x8a\x29\xca\xe5\xf9\x83\xcd\x92\xf3\x58\x06\xd6\x5c\x29\x1a\x91\xd7\x93\xd8\x35\x8f\x03\x2b\x8d\xad\x6c\x28\xcc\x11\x04\x8c\x2f\x11\x33\xa7\x10\x87\x96\xa7\x85\x63\x4e\x22\xba\x13\x26\x94\xf6\x1c\xcb\xfc\xed\x89\x26\x4f\x13\xc9\x2c\xc5\x63\xc9\xbd\xae\x01\x16\x2a\xde\xc1\x34\xa1\xc0\x63\x15\x05\xbe\x30\xec\xae\x7c\xae\xbb\x87\xd6\x42\x47\x0e\xe7\x53\x35\x77\x67\xf5\x7a\x59\x4d\x79\xc6\x14\x4f\x08\x97\x89\xd7\xa2\x15\xd5\x24\x0c\xc5\x93\xa0\x13\x34\x5b\x89\x42\x8f\xd3\x26\x3c\xe1\xb1\xad\x50\x17\x79\x8e\x30\x80\xa1\xd6\x90\xdf\xaa\x78\x02\x32\x09\x26\x3a\x09\xdd\x53\xa6\x91\xc6\x94\xb0\x73\xc4\x9b\xc9\x82\xc3\x53\x61\x43\xf2\xc7\x5e\xd9\x04\xdd\xc1\x6e\xcd\xe2\x82\xa6\xd4\x6b\xe0\x55\xd5\xa6\x68\x6e\xe9\xa2\xaa\xda\xf9\x71\xcb\x16\x55\xb5\x2c\xcb\xfc\x36\xf8\x9b\x5f\xfa\x7b\x20\xc4\x90\x8a\x56\x71\x11\x07\x58\xca\x3b\x64\x53\x72\x12\x4e\xbe\x85\x48\x5d\x29\xbc\x35\xfc\x07\x20\x58\xc5\x65\x6a\x73\xab\x7d\xd9\xbb\xc7\xa9\x75\x0d\x74\x62\x35\xcc\x4f\x8d\xc8\x3a\x4b\x88\x4b\x19\xa2\x55\xf0\xd6\x59\x1e\x5c\x2a\x1a\xba\xbd\x67\x59\x65\xea\xf5\x06\x1a\x91\x4d\x5c\x3b\x2e\x8d\x95\xc2\x59\xe7\x88\xc8\x5d\x96\xe7\xe7\x97\x6b\x88\xc4\x07\x59\xa4\x79\xa3\x95\x2b\x1e\x03\xf5\xb0\x8e\x4e\x11\xd1\x3f\x96\xa6\x3c\xb0\xc5\x7e\x39\x14\xcd\x4c\x1a\x95\x6b\x0a\x38\x9c\xd5\xe0\xfd\xeb\xf5\xfe\xeb\xb4\x59\xcc\x30\x8a\xf1\xe7\x9f\x7f\xb6\x03\x72\x50\xaa\xd6\x35\x90\x3e\xd1\x82\x7b\xec\x58\xd5\xda\x37\x32\xb6\x60\x46\x9e\x2f\x43\xb4\x6a\xa7\xc9\x3c\x0c\x25\x72\x20\x0c\xe1\x15\xcd\x0b\xbc\xbf\x88\x1c\x9e\x3b\xea\x62\xc5\x21\x4a\xa9\x9b\x62\x8e\x05\xc9\x55\x50\xef\x1a\xe1\xe2\x7e\xae\xf6\x4b\x71\x10\x14\x8d\xda\xaf\x65\x79\x19\x3d\x32\x08\x89\x7b\xc2\xb7\xcd\xea\xdb\x66\xf5\xd8\x73\x4d\xfc\x5f\x53\x1f\xe3\xae\x02\x60\x68\x95\x0d\xdc\xd9\xf9\x3a\x16\xc5\x0d\x55\xae\x8e\xa5\xd0\x9b\xd5\xe3\x67\x18\x92\x98\x84\x04\x3d\xe8\x9b\xec\x39\x6b\x44\xde\x0b\xb0\xb6\x87\x22\x64\x09\x68\xc4\x2b\xac\x27\xf0\x9e\x98\x70\x8e\x51\x24\x03\xb0\xba\x9f\xd8\x7d\x31\x49\xad\x54\x8d\x25\x7d\x5c\xbd\x88\x6a\xa3\x47\x01\xdd\x98\x48\x1d\x52\x47\x98\x7b\x98\x9c\x1d\x70\x20\x3d\x5f\xc2\xc2\xaf\x06\xe3\xa1\x13\x07\x32\x40\xdb\xd3\x8d\x7a\x38\x1f\x67\x25\x62\xff\xf5\xbf\xd3\xa5\x36\x0e\x64\x2c\xdd\x3c\xcb\xf4\x8d\xcb\x51\xf6\x91\x75\xdf\x4f\xa3\x5a\xff\x0f\xcc\x09\x7f\x45\x63\xf9\xd0\x96\xf7\xc3\x91\x10\xd3\xd8\x2e\xc7\x39\x54\xa7\xdf\x86\x33\xc7\x7d\x40\x45\xc2\x5c\xba\xe2\xdb\x45\x42\xe5\xe4\x68\xc7\x2b\x62\x4c\xc1\xd6\x7b\x6c\xee\x6f\xd6\x7f\x8c\xf0\x47\x1f\x25\xf7\xa6\xb7\x31\x04\x77\x2a\x17\x2d\x76\xb5\x0d\x23\x68\x76\xcc\xb4\x44\x70\xae\x93\x0a\x1c\xbd\x61\x18\x31\x2c\xbd\x32\x59\x21\xf2\xc9\xc3\x85\x91\xdd\x74\x0a\xf8\xd5\xa0\xd9\x9f\x77\x97\x0c\xb5\x24\x66\x94\x7b\x9e\xe4\xb3\x62\x2e\x04\xae\x1f\xab\x9f\x2b\x2b\xa4\x84\x6c\x6b\x7d\x11\xb4\x8a\xe3\x80\x79\xb9\xb9\x5d\xd6\x7e\xa9\xa7\x0f\x51\xca\x71\x7b\x43\x69\x17\x88\xd5\x4b\x6b\xe2\x15\x5b\x51\xbd\x5e\x6f\x81\x71\x1c\xd9\xb9\x2b\x6c\x74\x6c\x18\xcb\x8f\x63\x69\x55\x49\xda\xcd\x75\xfd\xeb\xf4\xbd\xa8\xca\x3c\x0f\xf8\x38\xf1\x38\xbd\x31\x84\x88\x93\x3d\xd8\xb1\xfc\x0d\x2e\xd7\x02\x9f\x2a\x4e\x02\x4b\x93\x85\x71\x77\x0c\x29\xdc\xf8\x9b\x26\x29\x4d\x3d\x11\xdf\xf7\xa2\xc9\xf2\xee\x80\x01\x12\xfb\x7c\x16\x16\x12\x57\xe3\x19\x96\xf2\xd0\x57\x70\x3e\x16\x58\x20\xea\x49\xc5\x7c\x83\x34\xc2\xa5\xd5\x86\xe4\x3b\x0d\x5b\x7f\x58\x30\x2b\x4d\xb6\x29\x6e\x00\x4e\xa3\xaf\x2e\x98\x40\xb7\xca\xe6\x72\xfc\xaf\x92\x59\x54\xa8\x15\x19\xff\x34\xbe\x18\x4b\x9e\x20\x66\x6e\x7b\x2e\x5e\x11\x11\x04\xd7\x51\x94\xf1\x97\x91\x3c\xc1\x30\x95\x41\xb0\x8c\xdb\xfe\x27\xfd\xa8\x68\x84\x41\x74\xbb\x44\x36\x33\x04\x2d\x33\x96\x6b\xac\x54\x42\xba\xe5\x40\x34\x80\x80\x4e\xb7\xea\xfc\x17\x07\xe7\xe1\x8a\x0c\xf9\x13\x77\x3c\xd6\xdc\x60\xc7\x9f\xce\x32\xcf\x14\x82\x42\x9e\xe0\xf9\x9c\x8b\x0a\x1d\x2c\xdf\x5d\x40\x98\x0a\xfc\x07\xcc\xc5\x25\x2b\x9e\xbf\xf5\xe1\x96\x18\x58\xe0\x95\xf6\x56\xe7\x26\xeb\xb8\xa5\xce\x03\xf0\xea\xcc\x5f\x77\xb6\xd1\x0a\xe7\xb5\xc9\x64\x59\x08\xa5\xb2\x87\xb2\xc9\xcc\xc4\xa2\x4b\x48\x9c\xc4\x1d\x57\x75\x1f\x3b\x4c\x82\x00\xc0\xbe\x41\xb3\x83\xdc\xd5\xb5\xfd\x25\xbb\x21\x09\x78\x80\xc2\x78\xdf\x7e\xac\x7e\x4b\x9a\xd2\xb6\xa6\x18\xc0\x7c\xcd\xf2\x7c\x59\x8a\x4a\xff\x6d\x18\x65\x4d\x02\x6d\xa8\xeb\xa2\x2e\x78\xe9\x0e\xd1\x28\x45\x77\x63\xb7\xe8\x09\x10\x54\xc2\x62\x19\xf7\xd4\x7f\x1e\xe3\x78\x28\x8b\xfc\x72\xb8\x81\xb7\xd9\x35\x38\x19\xfc\xdb\xbf\x07\x4b\x43\x2c\x64\xdf\xac\x1e\x9d\x0e\x9c\x3f\x60\x2c\x93\x5e\x85\x10\xaa\x6a\x84\xc4\x4e\x42\xc7\x80\x7d\xd8\xb7\x1e\xda\xa3\x23\x8a\xec\x8e\xc6\x96\xc2\xc7\x97\x87\xfe\x98\xc9\x81\x25\xa1\xb1\x7a\xf2\x35\x78\x65\xc5\xf9\xa5\x3b\x89\x82\x08\x13\x7d\x4e\x4f\xcf\x56\x40\xcd\x62\x9d\xaf\xa8\xa0\x06\xfe\x73\xc2\x89\xcd\x5a\x67\x45\x0d\x95\x45\x3c\x7d\x42\x66\xa4\x92\x98\x73\xc5\x9d\x6d\x61\x83\x39\xb5\xd5\x56\x9b\xbc\x47\xcc\x2d\x84\xb6\x80\xf7\x8d\xde\xbd\x64\x27\x07\x50\xf3\x9d\x11\xcb\x2e\xc9\x7f\xb0\x30\x87\x43\xdd\xb3\x6a\xa9\x24\x49\xc1\x43\x70\x97\x99\x9e\x0c\xdc\x24\xb5\xa1\xe2\x23\x6a\x28\xad\x5c\x6e\x6d\x0a\x2d\x4b\x52\x02\xa1\xea\x25\x11\x2c\x95\xf5\x47\xfb\x6f\xef\x66\x26\x29\x8b\x11\xba\xec\xbd\x94\xd5\x0c\xf2\x60\xd2\x2d\x69\x18\x22\xce\xc6\xa3\x93\x86\xe1\xdb\x91\xeb\x37\x1e\x6d\xff\xe2\xff\x3b\xbd\x90\x49\x75\xd8\x11\x88\xcc\x58\x33\x93\xc8\x55\x22\x48\x6c\x01\x1a\x70\x3c\x95\x95\xc8\xbf\x17\xdd\x92\x9c\x08\x46\x03\x87\x0a\x71\x8b\xbf\x43\x76\x0f\xe3\x33\xbe\xad\x4a\x92\x3e\x5d\xe2\x01\x17\xad\x3d\x31\x42\x5a\x4d\xff\x0e\xf2\x79\x89\x24\xca\xa9\x43\x35\x07\x51\xc9\xac\xa9\x0f\xc7\xac\x38\xa8\xdf\x69\x92\xa8\x44\xf2\x28\x8d\x47\x14\x25\x1d\xb5\x6b\x8d\x53\xff\x1a\xe0\xd4\x75\x80\x94\x0c\xdd\xc2\x77\x8c\xf2\x0d\x2a\x65\xa6\xf7\x70\x95\xfc\x08\xea\xf6\xec\xc8\x93\x11\xd3\x7a\xb9\xa8\xc7\x89\x5a\x37\x3d\xdf\x50\x7b\x44\x04\xe0\xc6\xfd\x7c\x25\xf3\xfc\x9b\x29\x91\x60\xa6\xa8\x75\x33\x96\xf0\x9c\x15\x03\x70\x42\xa2\x74\xc8\x42\xef\x52\xcb\x76\x25\xab\x47\xd1\x90\x44\x53\x2b\x73\x59\xd9\x2d\x7e\xd9\xa8\x19\xfb\x21\xd1\xc2\x8a\xfd\x20\x79\xc7\xa6\xe8\x78\x7c\x55\x02\x4c\x46\x74\xc0\x28\x3f\x12\x5a\x53\x09\x70\x8e\x54\xa4\x5d\x76\x1a\x1b\x59\x48\xd9\x0d\xc8\xcc\x33\xc0\x7d\xbe\xe6\x83\x50\x89\x33\x45\x06\xc3\xde\x52\x1e\x8c\x5b\x1a\x4a\x70\xac\xde\x88\xfa\x25\x53\x33\xe5\x62\x33\x7b\x84\x61\x14\x37\xa9\x17\x5f\xdb\x7b\xb5\xdb\x25\x26\xe5\xe8\x8e\xcb\x81\x0c\xfc\xe8\xc6\x29\x09\x39\xfa\xe4\x17\x10\xd5\xfe\xbd\x74\x8c\x8b\x7f\xf3\x47\x63\x22\x23\x5b\x40\x53\x9f\xf3\x46\x6c\xab\xf2\x4d\x8c\xa7\x47\x4a\x12\x8e\x53\x69\x5d\x64\xcf\x47\xd1\x9d\x09\x80\x1c\x0c\x37\x0f\x8b\xa7\xa6\xfc\x52\xe6\xfa\x0f\xf5\xf2\x3c\x08\xfd\xa5\x41\x22\x31\xa2\xff\x8e\x31\x65\x5f\x53\x92\x52\xa2\x51\x1e\x2f\xcf\xfe\x73\x46\xc1\x97\x6d\x59\xe6\xfb\x41\xd2\x21\xa5\x91\x09\xba\xb4\x1a\x06\xd4\x46\x35\x0a\x29\xe5\x1c\x88\x1b\x90\x3b\x91\x8b\x6a\xe2\x20\xa5\x2c\xb4\x35\x88\x65\xbb\x7d\xdf\x96\xd5\x8d\xb8\x58\x0e\x01\x3f\x73\x52\xc6\x01\x67\x9d\x4d\x75\xf6\x7d\x37\x8b\xaa\x0c\xfc\x49\xae\xbc\x14\x0f\xbe\xc0\xaf\xba\x99\x2c\xbb\x69\x18\x84\x94\x79\xe9\x6a\x5f\x57\x8d\xca\x38\xd5\x2c\x61\xa0\x4a\xa3\x54\x20\xd9\x23\x16\x92\xed\x31\x06\xeb\xdd\x88\x94\x13\x89\x30\xca\x61\xd1\xd5\x0e\x71\x0e\x5b\x71\xa9\x07\xb0\xff\xf9\x52\x54\x7f\x95\x80\x12\x37\x11\xbe\x66\xcf\x2f\xb5\x2a\x3b\x08\x4b\xca\x45\x2c\x86\xd2\xa9\xc8\xe8\xdb\x5e\xd8\x1f\xd7\x24\x74\x5b\x72\x31\xd1\xc4\x56\x69\x1c\x58\x02\x66\x6b\xc6\x81\x40\xe0\xd4\xb5\x68\x92\x4a\x93\xd0\x84\xc2\x79\xbc\xb6\x9f\x6f\xcb\x6a\x7d\x9e\x92\x32\xcf\xcf\xb1\x34\x65\x21\xc6\x78\x0e\x27\x71\x31\xfd\xa3\x89\x50\x0a\x4f\x22\x0b\x75\xf3\x88\xe2\x1a\x7f\x1b\xbe\xb8\x88\x74\xe4\x56\xbd\xc5\x59\x67\xf6\x9f\xe9\x4e\x99\x0a\x1d\x06\x9d\x0c\x1e\xca\xfd\xea\x61\x22\x25\x15\x86\x05\x6e\x27\xdd\x9d\xca\xa2\x2e\x3b\xba\xfb\xd1\x65\x54\x48\xb0\xf2\xfd\xfd\x25\x6b\xe0\xc5\x73\x0a\xa8\x54\xa5\xb1\xaf\xf7\xc6\xfc\x63\xbd\x85\xaa\x4f\x9d\xfa\x90\x4a\xaa\x59\x8c\xe6\x9b\x89\xfc\x89\x3a\x65\x32\xe9\x65\xa9\x2d\x65\xed\x2c\x02\x32\x05\x20\xe1\x10\x52\x89\x46\xad\xb5\x2c\xbc\x7d\x96\x9a\x84\x07\xda\xa7\x3b\x90\x9a\xc6\x1f\x30\x56\x1d\xa1\x41\x0d\xe6\xe2\xd9\xd6\x1d\xc1\x17\x28\x9c\x90\x87\x12\x41\x64\xb1\x2d\x42\xeb\x07\x78\x7f\x12\xff\xfd\xad\x47\x3f\x5c\xc6\x44\x90\xa6\x7e\x25\x5e\x96\xe5\x6b\x56\x3c\xaf\x86\xc5\xb9\xae\x15\xa5\x29\x4e\x7a\x8d\xa4\x38\x5b\xa8\x30\xee\xf2\xd4\x7a\x21\xfe\x39\x22\x4a\x10\x76\x7a\x27\xce\x85\x7a\x71\xe9\xc8\xf1\xb6\x21\x22\xc5\x51\x47\x70\x91\xe7\xf7\xad\xcd\xd3\xfd\x9c\xc8\x9e\xd2\xe5\x36\xcb\x8f\x23\x72\x81\xd1\x90\x10\x9c\xf2\xc4\x7a\x9e\x5d\x62\x6b\x7c\x9c\xf1\x38\x1a\xb2\x36\x3c\x1a\xab\xb5\x34\x5a\x9b\x05\x8f\x00\xa3\x07\xff\x73\xff\x3f\x43\x1f\x52\x70\x11\x22\xae\x47\xd4\xed\x0a\x61\x71\xff\x93\x58\xbb\xe0\x92\x52\x17\x90\x5e\x1f\x4f\x79\x79\xb9\x9e\xec\xbe\xa5\x22\x9e\xca\xca\xd7\x6b\x4c\x7a\x96\xeb\x80\xf4\x31\xf9\x79\xde\xce\xae\x69\x24\xd2\x3e\x28\xb2\x3c\x5f\x06\x72\x14\x4a\xc4\x42\x60\x00\xf1\x57\x59\x3d\x81\x3e\xbb\xdd\x38\x99\x42\xaf\x45\x42\x22\x24\x54\x3d\xbd\x57\xb7\x79\x29\x3e\x8e\xc8\x4e\x4e\x4b\x04\xaa\x3a\x28\x51\x2c\xcf\x13\x8f\x4d\x24\x92\x10\x8b\xcc\xb8\x81\xb6\x43\x5a\x93\x6e\xa6\x80\x48\xa4\x91\x4a\x7a\x5b\xe7\xd4\xc0\x81\xfa\x2c\xbf\x48\x79\x6c\x58\xa7\xad\x59\x61\x1e\xf8\x2a\x65\x25\x52\x6e\x15\xad\x1a\x10\x47\xdc\x1b\x1c\x18\x74\x4c\xb6\xac\x84\xe4\x96\x8f\x13\x43\xa6\xad\xe5\xeb\x66\xa7\x93\x98\x1a\xcd\x01\xe5\x08\x15\x6d\x44\xc7\xea\xa1\xf9\x43\x94\x59\x74\x41\x75\xae\xfb\x7b\x8c\x5f\x4a\xb1\xc4\x4a\x60\xe8\x37\x51\x28\xd8\x35\x70\xea\x4e\x37\x09\x62\x30\x75\x39\x26\x55\x57\x42\xc7\x01\xd2\x8b\x3f\x59\x46\x2a\x97\x55\xe9\xc7\xa7\x8e\x55\x08\x5d\xb2\xfb\xf5\x1f\xcd\x65\x5f\xe2\x3a\xb3\xaf\x84\xbe\x62\x60\x10\x40\x52\xf4\x0b\xeb\x2c\x87\x42\x81\xa3\x90\xf2\x07\xa5\xc2\x07\x5c\x3e\xdd\x8e\xc6\x3a\xe8\x04\x05\x6b\x6d\x9d\xc7\xd0\x35\xb0\x0d\x24\x21\x46\x53\xef\x0c\xd9\xd0\xc6\x21\x53\x65\x91\xfd\xc7\xdb\xd1\x27\xa8\x1c\xd4\x6e\xd4\x27\x92\xd0\x08\xe3\xf4\x8e\x87\x5a\x98\x51\x7c\x4e\x12\x19\xe1\xba\xfe\x84\x95\x72\x94\x90\xc5\xed\xfe\x5b\xc0\x77\x70\x6a\x76\xa2\xd0\xb2\xfc\xe5\x5b\xd2\x20\xc0\x24\x64\x27\xae\x79\x2b\x54\xe3\x49\xc6\xe7\x67\x9d\xa4\x9c\x48\x07\x14\x38\xe8\xec\x08\x45\x3d\xa4\xa3\x18\x8f\x6b\x49\xe3\x00\x03\x38\xce\x94\xad\x5a\xef\x17\x81\x90\xf3\xd7\x66\xd4\x58\x2a\x6e\x3b\x44\xbf\x3a\xbe\x70\x7f\x54\x13\x1f\xa8\x77\xfa\x0f\x96\x9d\xde\x0d\xbe\xd6\x46\xd8\x67\x2e\x22\x96\xf8\x73\x40\xa0\x67\x7d\xb7\xb8\x5f\x3e\x1e\xf6\xff\xdc\xae\xfd\xd5\x42\x02\xb8\xea\xf6\xf4\xbf\x03\x52\x7f\x25\xc3\x34\x41\x23\xef\x4f\x38\x8f\x2a\x75\x65\x68\x8c\xaf\x8b\xb4\xc8\xa7\x15\xaa\x9d\xb9\xa3\x51\x9c\xfa\x4a\x3f\xa7\x55\x55\x89\x49\x25\xa3\x8c\xa4\x8a\xc3\x0e\xb6\xdf\x60\xbc\xf1\xaa\x03\x27\x1d\x19\xf9\x95\xcc\xbb\x55\xe5\x84\x47\x1d\x9b\xc4\x64\xe8\xac\x58\xd3\xa4\x9d\x57\x2e\xb8\xbb\x71\xb5\xec\x9f\x72\xeb\xe1\x85\x50\xea\x60\x9f\xa9\xbd\x50\xdb\xb2\x11\x1d\x56\x45\xf2\x90\x63\x79\x4d\x71\x3e\x3e\x9a\x9f\xa8\x9c\xde\x1d\x02\x8a\xa0\xbf\x3b\x10\xba\x35\xf3\x77\x47\x51\x8d\x40\xe9\x32\x21\x54\x5a\x32\x20\xa7\xab\xd2\x93\xc5\xfa\x16\x2c\xf6\x34\x0e\xab\xd2\x15\xa1\x0c\xf3\xc8\x32\x51\x06\x57\x13\x47\xb5\xf9\x49\x92\x03\x9b\xea\x01\xe0\x19\x7d\xa4\xdb\xb2\x1a\x65\xf5\x64\x4a\xac\x2c\x1c\x56\x7e\xbd\x95\x99\x82\x7a\xb4\x47\x4f\x2e\x9a\x86\x51\xea\x68\x35\xdb\xa3\x8f\x66\x68\x77\xc9\xd4\xd5\x96\xb6\xae\xd5\xea\xf1\xa9\x29\xd7\xfb\xd5\xe4\x2b\x09\x66\xd9\xe6\x1f\x51\x7f\x2d\x2b\x0b\x91\xef\x4e\xf9\x34\xeb\x2f\x45\x18\x60\x90\xbf\x6e\x4a\x0f\x70\x9a\x7c\x25\x65\x2c\x2d\x4c\x6b\x27\x14\xcf\x63\xef\x74\x7c\x2d\x1d\xd2\xc4\x95\x12\x60\x71\xde\xf3\xc7\x3a\x17\x4a\x6a\x1e\x62\x36\xd5\x1a\x51\x9b\xc9\x8e\x2a\xb5\xb1\xfe\xb4\x44\xc1\x74\x2f\xff\x3e\x6b\x9c\x49\x88\x6d\xb0\x7e\xf1\x5c\x65\x58\xd0\x31\xe2\xef\xf0\x8d\x64\xa7\xc3\xbe\x2a\xf3\xb2\x5a\xf6\x49\x55\x09\x8a\xa1\x48\xc9\xed\xd3\x77\x0f\x53\x44\x46\x76\xea\x0a\x2e\x10\xb7\x3b\x66\x75\x57\xd2\x80\xf6\x7a\xd7\xcb\x72\x4a\x39\xa3\x5a\xbf\xa2\xbb\x1d\xee\x91\x2c\x1e\xed\x57\x8a\x18\x89\x7c\x35\x0d\xd4\xcd\xad\xc8\x72\x57\x38\xf2\x50\x36\xc3\xf5\x41\x05\x94\xe3\xd2\xb9\x58\xae\x66\x70\x8d\x2a\x60\xd6\x51\xd3\x50\x37\x55\x79\x79\x2a\x9b\x72\xbe\xbe\x4b\x05\x21\x4d\x7b\x89\xdb\x75\xe3\xa9\x4b\x3e\xaf\x00\x54\x41\x44\x02\x1b\x09\xec\x40\xe6\xbf\x14\xc2\x7e\x3e\xce\x11\xaa\x80\xb3\xa8\x97\x79\x5a\x96\x65\x0e\xa2\xb0\x79\xec\xf1\x43\x51\x9a\x18\xc7\x62\x62\xed\x3b\xff\x3b\x97\x71\xe0\xcb\xde\x0f\x28\xfe\x05\x0e\x1c\x59\x4c\x86\x8a\x62\x8a\x49\xdb\x91\x55\x25\x4c\x59\x1d\xbd\x46\x92\x3b\x1e\x46\x76\x2a\xd9\x2c\xc9\x4a\xf4\x50\xe7\xbf\x22\x1e\x1a\x5c\x07\x72\x47\xff\xfa\x9b\x28\xee\x70\x98\xf5\xf9\x88\xa5\xc1\xfe\xf6\x51\x28\xd0\x53\xb6\xb7\xff\x02\xc5\x97\x33\xca\x15\x7f\xd0\x75\x9c\x5a\x62\xc7\x6d\xd9\x94\xc3\x45\x4d\xf1\x30\x44\xf7\x62\x77\xec\x73\x5d\x2a\x0e\x14\xe2\xbf\x56\x8f\xf7\xf7\xdf\x1f\x36\xfb\x7f\x1e\x16\x77\x77\x8f\x3f\x17\x0f\xab\xf5\xe1\x6e\xb3\xdb\x77\xed\x22\x82\xdc\x15\xe7\x42\x95\x56\x91\xb1\xdd\x50\x90\xbf\x7c\x9c\x75\x18\x3f\x4c\x1c\xc5\x88\x20\x7b\x2b\xf3\xf3\x11\xf6\x97\x53\x17\x8d\x56\x71\x9c\x62\x21\xf4\x97\xdd\xa6\xfb\xc9\x68\xa4\x40\xcf\x0a\x63\x1f\x7d\x97\xe5\x6f\x63\x07\x43\x25\x5c\x22\x8b\xf0\x17\x4c\x82\xc3\x65\x96\x49\x0c\x9b\xe1\xf4\x69\xc4\x6b\xeb\x98\x3d\x94\x8d\x8b\xaa\xdc\xb6\x76\xb1\x39\x17\xda\x9e\xed\x9b\x6b\xab\xb9\xea\xb4\x83\xec\x04\x9a\x59\xcc\x94\xa0\x21\x25\x83\x42\x8e\x41\xce\x4f\x89\x38\x46\x70\xd3\x73\x7b\x85\x53\xdf\xf1\x42\x73\xe3\x36\xe2\xf6\xe2\xde\x43\xec\x07\xab\x30\x51\xca\x06\x32\x98\xa7\xb2\xfa\x94\x75\x78\x34\x70\x24\x8d\x04\xf5\xe2\x10\x28\xd6\xa2\xad\x17\xbb\xce\xc5\xa9\xc6\x17\xfe\x91\xa9\xa6\x9c\x22\x66\x94\x0c\x63\x44\x0e\xa2\xb2\xc3\xd6\x13\xe1\xb6\xbf\x5b\x2d\xb7\xd6\xc1\x40\x84\xe5\x03\x32\x82\x9f\xce\x8d\xb8\xd2\x0b\x52\x4a\x72\xc5\x9c\x1d\x31\xc7\x19\xa7\x94\x8c\x6d\x8d\x09\xae\x7f\xb7\x33\x80\x64\xdf\x4e\xe8\x88\x8c\x4a\x83\xfe\x32\x24\xe1\x2f\x6a\xf8\x4e\x6e\xa8\x22\xc0\xa2\xc4\x4c\x95\xbd\xb0\x93\x52\x2a\x09\xf0\x63\xe4\xa2\x6e\x7e\x5a\x12\x42\x0c\xf9\x38\x6c\x87\x6f\x65\x14\x9a\xae\x08\xd7\x42\x0d\x5a\x0c\xda\x66\x65\x31\x0e\x62\x2a\x1d\x28\x5f\xfe\xd1\xda\xac\x65\x75\x71\x20\xd3\xf9\x71\xab\xa5\x95\xdb\x18\x69\x3d\x7c\x5e\x0b\xab\x4c\x40\x11\xb3\x88\xec\x64\xbe\x82\xc1\x1f\x8b\x2c\x07\xe4\xfe\x71\xb7\x29\xea\x26\x6b\x2c\xd6\x65\x53\xb4\xcf\x88\xcc\x25\x23\xa7\x56\x99\x48\x25\xc6\x23\x5a\x72\x78\x16\xba\xbc\x81\x75\xad\xce\x90\x0b\x24\x00\xbe\x5c\x61\x17\xe7\x7b\xd7\x68\x4e\xe4\xe0\x45\xdc\x0d\x74\x40\x52\x1c\x75\x42\xeb\x45\x57\xd2\x84\xf3\x6d\xb2\x2b\xb7\x46\x22\xef\x69\xe2\x91\x8a\x7c\x40\x48\xef\x1b\x49\x6e\x0b\xca\x6a\x17\xf9\xc1\x24\xf1\xec\x4e\xa4\x69\xa0\x31\x10\x8d\xcb\x96\xf5\x8d\xd6\x6f\x73\x7c\x2d\xb3\x6f\xa4\x29\x27\x60\xa3\x1f\x3f\xcb\xea\x75\x51\xe8\xad\xb8\xac\x97\x7e\x85\xd4\x54\x1b\x8c\x81\x0d\xa2\xd5\xed\x06\xf7\x33\x6b\x5e\xca\x73\x33\x53\x19\xa4\x59\x64\x2d\x98\x9b\x7f\x0c\xb2\x84\x9a\x71\x86\x05\x8f\x87\xd6\x6e\x77\x45\xed\x1f\xbc\x50\x14\x10\x80\x8e\xcc\xc0\x0e\xd0\xfa\xd3\x04\x99\x8e\x74\x84\x6b\xd1\x4e\x28\x51\x1d\x96\xb9\x50\xaf\xd7\xd9\x16\x1d\x19\xab\xcf\x21\xb4\x5e\x95\xe7\xaa\x9e\xd4\x04\xea\x38\x11\x54\x7a\x0a\xdc\xdd\x09\x54\x26\x72\xac\xd5\xbd\x17\xa7\xd3\x9c\x04\xd6\xf8\x21\x12\x62\x29\xa1\xea\xd6\x9e\xec\xf8\x2e\x95\x4e\x53\xe9\x15\xdc\xee\xc5\xaf\x1b\x38\x89\xaa\x39\x23\xfd\xf0\xa4\xe7\x52\x41\x90\xb5\x10\xa3\x68\x07\x7a\x38\x8a\x5f\xaa\xe3\x67\xd1\x82\x58\x67\xb1\x46\x5c\xf0\xa3\x19\x8f\x18\x41\xac\xd9\xd4\x39\x28\xce\xa4\x48\xfc\x71\x1e\x59\xe9\x06\xad\xbf\x3b\x29\xf2\x0f\x98\xbe\xdd\x09\x92\x04\xb8\x3f\x8b\xe6\x97\x85\x87\xb7\xcd\x87\xbe\x80\x96\x4c\xa0\xb5\xed\x35\x48\x87\x42\xc7\x4a\xcb\x34\xe6\x74\xe4\x2d\x5a\x43\x70\x86\x54\xb3\x6d\x9c\x50\xd9\xc5\xb5\xa0\x2a\x6f\xe0\xf1\xfc\x96\xe9\xb2\xca\x44\xdd\x5d\x51\x87\x68\x8e\x1e\xbd\x7a\xd6\xf2\x7c\xf9\xbc\xf6\xc0\x9d\xa8\x99\xd5\xce\xfc\x69\xa9\x0d\x1d\xd2\x7c\xfe\xb5\x75\x4a\xf1\xb1\x4f\x70\x2f\x7e\x6d\xa1\xb2\x7c\xbc\xfe\x11\x20\xe2\x96\x4d\x1d\x0a\x8d\x51\xc2\x7d\x79\x03\xbf\x26\x9f\xd1\x70\x82\xe1\x81\xfd\xd9\xc1\x5d\xba\xdf\xe3\x84\x0d\xd6\x8e\x1b\xa4\x27\xef\x32\x22\x40\x84\xe5\xb7\x7a\x86\x41\xa9\x6e\xe2\x0f\xaa\x10\x6b\xff\xb1\x2f\xb7\x9d\x40\xd7\xef\x2a\xb7\x06\xde\x11\x04\x94\x21\x2b\xdc\x4b\xf6\xfc\xb2\xcc\x74\x9f\xd6\x80\x80\x05\xa1\x5b\x1e\xed\xe0\xb0\x1c\xb2\xa3\xd7\x82\x20\x36\x38\x82\x5c\xee\xdb\x16\x1c\xfd\x65\x0a\x82\x4f\x17\x21\x08\x4c\x88\x84\x56\xde\xe8\xb7\xa5\xec\x77\xed\xdc\x6b\x9e\xe0\x0d\x77\xa0\x87\xb2\xc1\x9f\x07\x78\x19\xa0\x21\xc5\x42\xe3\x85\xd6\xbb\x17\x51\x81\x76\x59\x9b\x2b\xec\xc8\xa7\x50\x32\xa0\x31\xf7\xcc\xee\xb7\x96\x83\xde\x57\xff\xf5\x09\x6a\x60\x54\xa1\x65\xb7\xf8\x39\x94\x3e\x54\xc0\xc2\x04\x7f\x57\xed\xfa\xbb\x1b\xa3\x3a\x80\xa5\x82\xd9\xe2\xf6\x76\xa9\x87\xfd\xbc\x74\x90\x82\x28\x14\x88\xe4\xf5\x1d\x60\x43\xe1\xed\x2a\x6b\xa9\xa0\xed\xbf\x3b\x71\x84\x4d\x03\xc7\x8e\xca\x07\x22\x23\xd0\xc9\xfe\x0a\x17\x23\x8a\xd1\x73\x71\x9d\xa4\x03\x8a\xfe\xbd\xf8\x75\x45\xcc\xaf\x20\x26\x42\x38\x23\xee\xa6\x54\xe7\x23\x92\xd4\xfd\xe7\xdc\xb3\x30\x07\x7c\xd2\x57\x71\xc0\x91\xcf\xca\xce\x22\xbb\x34\x4c\x5c\x0f\x88\xb5\x7d\x6b\x1f\x19\xde\x5d\x8e\xb2\xcc\xaf\x62\x93\x90\x04\x29\x50\x07\xca\x55\x2f\xde\xe2\x84\x34\x4c\x30\xc8\x80\xe7\x1e\x58\xf7\x73\x0c\xd2\x89\xc8\xdd\x8b\x22\x33\x50\x37\xe5\xb0\x2a\xcd\x37\xd3\xd4\x93\x09\x9d\x4f\x48\x27\x3a\x69\x20\x78\x8a\x9a\xa2\xcf\xa2\xbe\xef\x66\x27\xc8\xd8\xce\xce\x4a\x14\xaf\x6e\xcf\x39\x74\xc7\xa4\x55\xc5\xac\xa1\x79\x3c\x7d\x11\xbf\x09\x16\x81\x94\x09\xe6\xe2\x6c\x80\x17\x6d\x91\x12\x13\x71\xe3\x5e\x92\xc6\xa0\xe7\xe9\x70\x6f\xa8\x2e\xe6\x0e\x29\x1a\xa8\x21\xb7\xc2\x04\xad\x09\x2a\x8c\x31\x2f\xa2\xca\xa2\x00\xd5\xec\xfb\x5a\x74\x50\xa9\x87\xe8\x21\x09\xf0\xae\xc7\xc2\x80\xd2\xb1\xc5\x07\xb7\x6e\xe7\xf9\xd4\xfd\x0c\x31\x32\x08\x1c\x0e\x56\x8d\x74\x26\xdb\x0d\xca\x50\xe0\x13\x78\xb6\x8d\x25\x8f\xdb\xe9\x28\xe0\xd6\xc3\xad\x55\x95\x9d\x5a\xab\xac\x5d\xcb\xa0\x1e\x3b\xb8\xa0\x93\x90\x4a\x27\x0a\x73\x28\x4d\x5f\x27\x0f\x5a\x13\xd2\x47\xe7\xb2\xe3\xf9\xb8\xf1\x29\x01\xfd\x8c\xc5\x56\x98\x4d\x9b\x58\x1d\x00\x8c\xfa\x7a\xac\x03\xca\x8f\x1c\xfc\x32\x7b\x10\xa3\x7c\xba\x6f\x2f\x8c\xe8\x81\x78\xae\x38\xb2\x6e\xbf\x81\x67\x5c\x04\x13\x70\xa4\xf7\xf3\xac\x14\x8d\x97\x3b\xfa\x79\xf7\xc1\x2c\x36\x91\x05\x62\x1d\xc5\xaf\x9f\x90\xed\x33\xa8\xba\xc1\x6b\x54\x80\x01\x89\x17\x51\xcf\xc5\xd9\xc1\x18\x8d\x34\xad\x1f\xac\xef\xb3\x03\xcd\x10\x1e\xa1\x3b\x88\x5a\xfb\x34\x1a\xbf\xa2\xa1\x5c\x8c\x78\x1d\x51\x00\xc5\xfa\x80\xa3\x7b\x1b\x1a\x87\x88\xaa\x96\xd9\xf3\xcb\xe5\xe4\x87\x8b\xa1\x20\x31\x6e\xa5\xb3\xfa\x54\xb6\x8e\xdd\x07\x91\x3e\xc3\x52\x70\xfc\xd4\xd9\xa1\x1e\x16\x91\x1a\x26\x18\xd6\x57\x76\x34\x4b\x59\xf3\xd2\x39\x88\x86\x69\xab\x41\x65\xd9\x7c\x57\x90\xe7\x08\x85\xf2\x47\xdb\xf1\xea\x39\xaa\xbe\x9c\xa1\xae\x0f\xcd\xfb\x5c\x61\xa2\x61\x26\xb0\xdc\x6c\x2f\xa0\x5e\x37\xc5\x9b\xb0\x9a\xe4\xfe\x42\x21\xb3\xd0\x66\x5b\x88\x31\x89\x59\x8e\x7b\x22\x64\xd6\x79\x92\x8d\xea\xd6\x58\x13\x72\x83\xf6\xa8\xc5\xa7\x60\x70\x60\x6e\xfe\xbb\x9d\xda\x44\x24\x24\x62\xba\x8d\xfb\x81\x6f\x22\x6a\x8c\xec\x37\x84\x2b\xae\x04\x13\xc5\x54\x78\x9f\xbd\x6c\x32\x35\x5e\x32\x4d\xa4\x85\xcf\x00\x3a\x3d\xba\xb7\x09\x5d\x88\xe1\x71\x8a\x9f\x73\x50\x79\x1a\xa4\x33\xa5\xa7\x86\x27\x14\x53\x93\xab\xec\xf5\x55\x0c\x2c\x15\xc3\x41\x63\x66\x07\x0d\x51\x44\x31\x4c\x51\x25\x26\x56\x96\x35\xb7\x7e\x29\xdf\xbd\xd4\x89\x8d\x64\x8d\x7b\x34\xd6\x21\x32\x8d\x6d\x9c\x08\xae\x67\xa1\xf8\x09\xd9\x3c\xce\xc5\x9d\x97\x24\x11\xc2\xe9\xb3\x7a\x99\x35\x3b\x18\x37\xf3\x5d\x9d\x08\x05\x6a\x30\x43\x97\x99\x8e\x26\xfd\x9d\x6a\x89\xf3\xaa\x1d\x7d\x2e\x5e\x3e\x77\x25\x91\x52\xac\x42\x5f\x2e\xfe\xba\x62\x82\x32\x42\xa4\xe0\xc9\x86\xbd\x5d\xd9\x7d\x06\x21\x14\x96\xee\xdc\xdc\x3f\x0d\xf7\x65\x83\x29\xb5\x01\xf4\x75\x5b\x81\xce\x6c\xc8\x71\xce\xf7\xf4\x4f\x28\x59\x84\xa8\x03\x28\xea\xdd\x59\xea\xf2\x28\x32\x47\xaa\x54\x09\x4b\xd9\xea\x1b\x0a\x82\x2b\x21\x34\x2f\x1d\x5d\xdf\xf8\x9b\xa8\x30\xee\xe4\x26\xca\x1a\xff\x37\x2d\xef\x30\x2a\xb1\x62\x37\x42\x5b\x76\xb8\x39\xb3\xdd\xe8\xc0\x60\xd4\xea\x47\x56\x3d\x67\x23\xeb\xc3\xe8\x38\xc1\x84\x67\x59\xe4\x97\x65\x79\x2e\x14\xf2\xcc\xaf\x7f\x35\x36\x61\x35\x79\x22\x9d\x58\x30\xd1\x4a\xd4\x2f\xdb\xf2\x15\xeb\xb5\x47\x97\x03\x1a\x29\x9b\xa0\x3d\x1d\x16\xab\x75\xf7\x33\x8f\x31\x4c\x83\xf9\x0c\x53\x56\x5d\x28\xd4\x1d\x37\x91\xf4\x65\xf2\x1b\x2b\xc8\x32\xbc\xaf\x26\x44\x26\xc0\x86\x12\x03\x57\x33\xbb\x37\xa0\x35\x09\xc2\x00\xf9\x54\xde\x5f\x44\xe7\xbb\x8f\x86\x9b\x26\x81\xd4\x38\x22\x57\xfb\xc7\xbf\xb9\x9f\xa8\x4a\x22\x0b\x27\xfb\x77\xbb\x55\x7f\x9c\x32\xd1\x84\x45\x89\x4d\x43\xdb\x3a\xb7\xbe\xf4\x43\x13\x96\x30\xe5\xdc\xa9\xe6\x25\xab\x8f\x67\xf5\x02\xcd\x8b\x29\xab\x4b\xeb\xc9\x9e\xce\x63\x2b\xa8\x6d\x9f\x78\xa1\x1a\x14\x84\xbd\x22\x53\xd4\x84\x09\xea\xa5\x19\xef\x2f\x4b\x0f\x1c\xd1\x84\x81\xa2\xe9\x40\x84\xc6\xaf\x0b\x9a\x44\xda\xc6\x0a\xee\xb3\xa2\x19\x66\x5b\x35\xe1\x34\xf4\x54\xb8\x3f\x36\xdb\xa9\x24\x6b\x7b\x5c\x0c\xe4\xbb\xef\xe1\x28\x3f\x48\x70\x6a\xc2\x63\xa6\xc3\x01\x7c\x6e\x74\x9f\x84\x48\xcc\x7f\x68\xf4\x37\x31\xbf\xc6\xba\x63\xa9\xc4\xcf\x63\xa9\x38\x96\xe7\x3a\x2b\xa0\xae\x77\x97\xba\x81\xe3\xff\x89\xd8\x46\x93\x94\x5a\x16\x71\x94\x7a\x69\xd4\xcb\xe4\x6d\xd2\xd8\x3a\x94\xab\xa7\xc7\x9f\x37\x87\x9f\xeb\xf5\x37\x7a\xd8\xae\x9f\x36\x8f\x37\xfe\x59\x84\x13\xd4\x6a\xfd\xc4\x5f\x2a\x3f\xd7\x99\x0f\xbc\x6b\x22\x9c\x7a\xa1\x01\xd8\x42\xf5\xbd\xc8\x9a\x47\x33\xa4\x71\xef\x9a\xc5\x90\x58\x5a\xd3\x5a\xe4\xb0\xfa\x1d\xa0\x53\x13\xa1\xb4\x10\x1e\x16\x85\xb1\x7e\xed\xc2\x76\xe2\x19\x10\xa2\x3a\x7e\x4b\xc5\x12\xac\x7d\x03\x4f\x57\x8a\xa5\x60\x37\x95\xb8\x7a\x16\x15\x5a\x6d\xce\xb6\x3f\xa0\xae\xc5\xb3\xcf\xd2\x75\xc7\x53\xf4\x0d\xef\x17\x7f\x20\x4d\xcf\xee\xfb\x76\x7b\xf7\xcf\xee\x68\x0c\x18\xbb\xf7\xe2\x44\x36\xf2\x38\x1b\x2a\xd4\x44\x39\xd6\xa9\xed\x62\xf5\xed\xb0\xdb\xfc\xb9\xf6\x57\x01\x2e\x8c\x4d\xd4\x94\xef\x85\x75\xd3\x3e\x35\x8f\x34\x01\x87\x21\xd3\x90\x63\x48\x28\x9f\x86\x84\x34\x01\x63\x4d\x75\x57\xfb\xfb\x84\x20\x89\x0f\xba\xd7\xa4\x96\xb2\xc0\x66\x2c\xae\xb4\xb9\x6d\xab\x20\x30\x22\xb4\x1a\x9f\xf9\xf7\x22\x53\x65\xd5\xab\xf0\x8e\x1b\xd2\x50\xa5\x58\x8e\x51\x66\x45\xd3\xae\xb1\x5b\x51\x35\x99\xca\x4e\xa2\xf9\xcd\x8b\x05\x34\x32\x64\xbc\x6c\xfd\x15\x5c\xac\x0e\x28\x17\xa1\x25\x26\x7c\x73\xf6\xee\x30\xaa\xdb\x1e\x07\x14\x6b\xdf\x9d\x44\xf5\x8a\x29\xc3\xe1\xe4\x0b\x18\x0b\x2d\xfd\xbd\x5b\xf3\x86\x96\x89\x0e\x98\x00\xf4\x59\x6a\xf1\xf6\x7b\x66\xc2\x8f\xa1\x40\x3a\x08\x89\xc6\x0a\x04\x4f\xed\xd3\xf9\xf0\xde\x17\xd7\x41\x48\x39\x6b\x47\x7a\xeb\x2a\x83\xde\xc1\x07\xca\x8a\x3a\x08\xe3\x38\xb1\x4c\x64\x96\xd8\x1f\x8b\x67\x26\xfe\xaa\x0e\xb8\x13\x8a\x41\x2c\x6f\xbd\xa8\x5a\x37\xde\x07\x19\xda\xa3\x80\x31\xdf\xef\x0f\x77\x8f\xab\x6f\x87\xed\xd7\xc5\x6e\xbd\xeb\x0e\x46\xb1\x67\x30\xf7\x26\x8e\x8f\x74\xcd\x7f\x3b\x1e\x27\x26\xec\x78\x94\xd7\x05\xf2\xfa\x75\xf0\x64\x1d\xf0\x34\x0d\x84\x67\xfd\x85\xd3\x88\x11\x45\x07\xb1\xa0\x68\x32\x1f\xa1\x9d\x4a\x45\xf3\x35\xab\x31\x07\xe2\x0e\x27\xd4\xaa\x30\x3b\x5a\xb4\xc3\x0e\x9a\xad\x38\xd7\x03\x32\x56\x1d\x24\x21\xc3\x50\x83\x12\x79\xbe\x28\x74\xdb\x85\xdd\xe9\x3c\x4e\xa0\xa3\x29\x1c\xbb\x58\x3a\x48\x64\x1a\x50\xbf\xbc\x60\xf5\x41\x77\x40\x62\x32\xe0\xeb\xb6\xfb\x45\xf1\xc0\xe2\xe5\xea\x6e\xa7\xdc\xdc\x74\x47\x21\xc6\xcc\xa4\x38\x6e\xbe\x06\xfe\xc7\x94\x11\x8c\x44\xb4\xb6\x54\x6b\x30\xa0\x64\xc2\xf8\x33\xa5\x61\x82\xd4\xad\x8e\xde\xd1\xe5\x04\x22\x7f\x05\xc1\x23\xe6\x70\x13\xaf\xd0\x1c\xbe\x88\x42\xe8\x6b\x42\x49\xdf\x58\xa4\xdc\xf9\xe8\xd5\x33\x7c\x82\x68\xed\xda\x5b\xce\xbb\x2e\x21\xb4\x2f\x2d\x01\xc3\x6f\x22\x4e\xee\x74\x99\x6a\xc4\x8f\xec\x9f\x56\xa3\x29\x25\xb5\xc5\x19\x20\x48\xc2\xaa\x0a\x7f\x15\x6f\x6f\x50\xd4\x07\x79\xe9\xca\xc3\xfc\x4f\x48\x4d\x0d\x7a\x77\x3e\xfa\xf3\x15\x68\x6a\xc1\xe4\x85\xbe\x9c\xeb\xeb\x4d\x75\xf2\x1a\xad\x23\x8a\x25\x3c\xe7\xea\x0d\x2e\xd7\x99\x73\x1d\x68\xda\x81\x76\xef\xb3\x02\xaa\xfa\xb1\xd8\x0d\x26\x83\x0e\x63\x5c\x7a\x0a\x78\xdf\x57\x99\x9c\x63\x8a\xd1\x01\xd0\x20\xb2\xa4\x27\xba\xe3\x41\xf8\xc4\xef\xd2\x01\x84\x44\xf4\x02\x75\xed\x74\x70\x09\x06\x1b\x08\x9c\x3c\x22\x08\x2b\x05\xfa\x0c\x4d\xbb\xab\x59\x86\x2b\xcb\xc4\x5c\x16\x7e\x16\x7e\x2e\x80\xac\x29\x09\x0c\x5a\x94\xb8\xbf\xaf\x07\xf9\xbb\xe1\x9b\x50\xa2\x53\x54\x58\x5d\x3e\x3e\x7c\xdf\x1d\x50\x98\xf7\xf1\xfb\xc3\x8d\x4b\xf7\x6a\x4a\x80\xd8\x52\xc1\xd3\x32\xd3\x03\xc4\x62\x7b\xc4\x96\x3c\xef\xda\x2d\xb3\x35\x77\x50\xb5\x76\xf6\xa1\x12\x77\x4a\x20\x84\xab\xcf\x2d\xf4\x54\x8e\x65\xde\x50\xa1\x94\x07\xa8\x46\xe5\xd0\x0b\x98\xf7\x99\xc4\x38\xbd\x5c\x59\xc0\xaf\xe0\x26\x9a\xd2\x38\x30\x2e\x52\x87\x7a\xe2\x4f\xe2\x7d\xb4\xaa\x53\x9a\x28\x70\x64\x1b\xb5\xaf\x0e\xf1\xf2\xb8\x3d\x74\x51\x53\xaa\x23\x44\x26\xb4\x63\x70\x29\x90\xd8\x63\x3c\x7b\x29\x8b\x6c\x9e\xea\xdb\x76\xe8\x0f\x69\xca\x84\xc1\xfa\xad\x02\xde\x9d\x3f\x83\x05\x30\xbf\xd5\x00\xef\xdf\x65\xfc\xc9\x42\x92\x04\xbd\x1c\xea\xee\x35\x2b\x16\xa7\x13\x88\x6a\xb8\x26\xfb\xa6\x29\x41\xf7\x01\xab\x5d\x7a\x69\x33\x4d\x79\x62\x45\x73\x47\xaa\x23\x07\x79\xd9\x56\xe5\xaf\xeb\xaa\xa4\xf9\x01\x16\xa7\x36\xa8\x7c\x5b\x56\xed\x62\x39\x89\xba\x68\x9a\xa4\x02\x01\x8a\x59\x25\xe7\x69\xf2\x34\x4d\xa4\x40\xac\xdf\x0e\x9a\x2f\xa2\x9e\x22\x53\x75\xfb\x6d\x30\x18\xb0\x7a\x29\x4b\xfc\xdf\xe0\x15\x12\xa0\xb8\x9e\x36\xb6\xba\xc4\xfa\x45\x5b\x71\x79\x3c\x7b\x17\x55\x53\x91\xca\xd4\xa5\x5d\x5a\xe3\x03\xb5\xed\xa7\xcb\x3e\x55\x89\xc6\xc2\xac\x5c\xd4\xcd\x1a\x2f\xa3\xc0\x8a\xcf\xf8\x06\x10\x51\x97\xaa\xd7\x22\xcb\xa7\x0f\xa9\x93\x00\x9d\x1a\xec\x64\x1f\x58\x77\x9a\x5e\x1f\xe1\xa0\xda\xb3\x28\x67\x1e\x1c\x7f\xdb\xe5\x95\x34\xd5\x60\x09\xd5\xbb\xa8\x56\xf1\x79\x99\x98\xa6\x10\x47\x18\x84\xda\x6c\xdf\xf8\x68\xe4\x99\x48\x6a\xe1\x4b\x80\x1d\x5f\xe1\xf8\x54\x23\x35\xc6\x72\xce\xb5\x5e\xd7\x4d\x76\x14\x0d\x6c\x8a\x71\x72\x59\x33\x42\x63\x14\x34\x9a\xd4\xc7\x8e\x67\x2a\x23\xda\x96\x54\x38\xf1\x7e\x14\x81\xcb\xb3\xe7\x4c\x4e\xab\xec\x35\x0b\x78\x80\x15\x4a\x47\xf1\xcb\x23\xbc\x06\x4b\x30\x0b\x20\x8d\x5d\x60\x1f\x0a\x7d\x03\xb2\xb9\x03\xfd\xec\xfa\x74\xfc\x02\x8c\x2a\x39\xa0\x9f\xef\xe1\x0e\x3b\x55\x56\xf3\x5a\x18\x9a\x31\x62\xf5\xd7\x4c\x56\xe8\x75\x0e\x6f\x50\x6c\x8f\xdf\x1b\x35\xb9\x72\x28\xac\x06\x49\xc7\x23\xe9\x1f\x2f\x34\x29\x9a\x6f\x5f\xe1\x17\xe4\xeb\x4a\x79\x72\x89\x59\x93\x6f\xd2\x49\x91\x8e\xa5\x5b\xd9\x97\xe7\xcb\x60\x7d\x61\xdc\xc4\x48\x51\x23\xea\x1a\xaa\x66\x55\x56\x15\xa8\xe6\x8a\x2b\x57\xb3\x38\xb2\x81\xe5\x1c\x91\xfa\x8f\xe7\x46\x95\x9d\x6d\xc5\x62\x30\x48\x02\xf2\xb4\xde\xad\x9f\x7e\xac\x6f\x0e\xdb\xc5\xd3\xfe\x61\xfd\xb4\x3b\xb4\x96\xdd\xfa\xe6\xb0\xdb\xdc\x78\x7f\x83\x25\xc4\x18\xd6\x93\xfa\x2c\xd1\x0f\xf4\xc7\x52\x23\x1c\xbf\x94\xb5\xe0\xba\x03\xc2\xfa\xa7\xf7\x50\x29\xa1\xcb\xfb\x12\xb4\xf0\xc7\xd2\x24\xc4\xbd\x3e\xab\xca\xc2\x11\xfe\x4e\x2d\x51\x96\x2a\xca\x49\x2f\x47\x36\x99\x8b\x4c\x06\x8a\xd0\x71\xfe\xb1\x2f\xe1\x1d\x36\x33\xe8\x6d\xef\xf6\x4f\xc3\x5c\x95\x66\x92\x92\xc8\xf3\xfd\x82\xd0\x9d\xed\x39\x39\x9d\x72\x61\xb5\x69\x4c\x3e\xe3\x8c\xf8\x56\x61\x8c\xd3\xea\xcb\x1f\x3f\x56\x4f\x58\xf4\xf1\xc1\xc8\x97\x2a\xf4\xb4\x0a\xce\x79\x74\x24\x47\x5f\x45\xfd\xf2\xbd\xce\x8a\x67\x0f\x79\x9e\x66\xa4\xe7\xaf\xa7\x98\xc1\x3a\xf6\xba\x10\xa7\xfa\xa5\xf4\x36\xc2\xf4\xa4\xe1\xa6\xc0\x54\xa4\x90\x99\xd1\x41\xdd\x6f\x33\x57\x61\xdd\x25\xfa\x3e\x5d\x42\x98\x92\xc2\xe9\x57\x3b\x05\xc6\x4d\x81\xe3\x6a\xbe\xb5\x16\x09\x6e\x2b\x6f\xed\x84\x5c\x98\x06\x5f\x0c\x5f\x13\x8e\xd9\xf9\x38\xe9\x6d\x90\x56\x45\x48\x43\x3d\xf1\x78\x5c\x03\x13\x05\x98\xf7\xbe\x5f\xff\x3c\x60\xc4\x61\xb7\xb8\x5b\x1f\x6e\xbf\x3f\x78\x83\x3a\x24\x11\x43\xc3\xc1\x80\x7a\x59\xe4\xf9\x4a\x14\x1a\x43\x8b\xf5\xf2\xb2\x73\x9d\x64\x95\x48\x46\x77\x0e\x89\xa2\x18\x1d\x6b\xc4\x2b\xec\x7c\x85\xd4\xa8\xf0\xfc\x5f\xac\x5f\x99\xfb\xff\xfc\x24\xd9\xae\xc3\x80\x32\x84\x15\xfe\xcf\xf2\x8f\xed\xfa\x69\xbd\xff\xea\x1f\x32\xe8\xeb\x91\x7e\x4c\x72\x72\x3a\xa4\xa1\x56\x36\x92\x08\xef\xcd\x12\x26\xbe\x72\xc8\x82\x00\xbc\xeb\x81\x51\x78\x51\x37\x30\xd6\x85\xf4\x2d\x69\x42\x92\x1e\xf8\x39\x89\xea\xcd\xb9\xa5\x89\x37\x90\x7a\x53\xa9\xfd\x2f\x7f\x3d\x0e\xc2\x21\xa2\xd7\xcd\xcb\xf2\xdc\x93\xd4\xe9\x90\x25\x0a\xcb\x53\xf7\x2f\xf0\xf5\x7c\x14\xc5\x08\x06\xf6\x51\x71\xa5\x0e\x99\xd4\x81\xc5\x44\x9e\x72\xa1\xe0\x66\xb7\xf5\x76\xcf\xe4\xad\x43\x15\xc6\x6e\xb6\xde\x65\xc5\xeb\x4d\xf6\x0c\xf5\x95\xa3\xe1\xda\x46\xdc\xd2\x3d\xc2\xaf\x06\x0a\x6d\xc3\x23\xcb\xc9\x56\x1c\x46\x32\x85\x4e\x69\x74\x75\xb7\xba\xa2\x0b\x18\x3d\x27\x97\x49\xe0\xea\x59\x1e\xca\x2b\xe3\x29\x8c\xa9\x46\xc9\x2c\x0d\x6f\x5f\xb2\x37\xc0\x01\x36\xf2\x0b\xc3\x24\x51\xbe\xfc\x6a\x2b\xd4\xab\x78\x46\x6e\xc9\x47\xb3\x12\xc7\x93\xc8\x9e\x8b\x71\xec\x34\x4c\x14\xe1\x1e\x04\x80\xe0\xf5\x6e\xa3\x1d\x3d\x56\xca\xa2\xd8\x99\x1b\xbb\xd2\x34\x2b\x71\x1a\x69\xf1\xeb\x30\x95\x02\x89\x4e\xec\x9e\x77\x0f\x47\xf8\x5e\xe5\xb3\xe6\x7d\x28\x62\xe5\x0a\x8c\xed\x26\x16\x5c\x91\x21\xeb\x50\x24\x12\x8b\x55\x76\xea\xa5\xcc\xc5\x90\xff\x4c\x87\xc2\x24\x48\x52\xb9\x12\xcd\xe8\x77\xe9\x24\xd9\x9b\x2e\x80\x39\xc2\x41\xeb\x50\x0a\xe6\x6b\xa7\xbc\xcc\xdf\xfe\xa5\x82\xfa\xa5\xcc\x27\x8b\x79\xa8\x13\x2b\x52\xda\x09\x5c\x7b\x32\xeb\xf1\x00\x00\x88\x31\xdd\xd0\x0e\x42\x51\x65\x62\xf4\x3c\x60\x08\x12\x97\xbc\xd9\xfa\x8f\xeb\x2a\x38\x1d\x91\x54\x61\x5d\xaa\xad\xfa\xb3\x1f\xf2\x9a\x64\x4a\x47\x8c\x0a\xcc\x71\xee\x7e\xae\xd7\xfb\xcf\xc6\x4f\xc4\xa8\xd4\xd0\x5d\x71\xe7\x8a\xf4\xaf\x42\xec\x7e\xaa\x45\x8c\x5b\x15\xa0\x7f\x97\x59\xf1\x65\x82\x15\xd0\x51\x28\x6d\xcd\x53\xeb\x7c\xac\x7b\xfe\x6b\x1d\xf1\xc0\xc4\x0e\x36\x63\x05\x92\xe5\x94\xd4\x42\x47\x3c\x0a\xd0\x26\x69\xc7\xe8\xf9\x74\x80\x42\xeb\xde\xb6\x88\x78\x12\x60\xa2\xd3\x3a\x51\x0e\xf8\x65\xcb\x4a\xce\x03\x02\x90\x11\x1d\xb1\x8e\xb8\x56\xc2\xdf\x17\xda\xdd\xe0\x6b\x59\x37\x1d\xa3\xd1\x74\x2b\xfb\x8c\xd8\xc8\x5d\x30\xa1\x2c\x75\x98\xd3\x76\x18\x2e\x9a\xef\x93\xea\x05\x1d\x25\x21\xe1\xcc\xc7\xa5\xd1\x42\x98\x7c\x9d\x84\x47\x68\xb0\x2e\x2b\x10\x08\x3e\x1a\x0e\x83\x28\xd1\x04\x43\x3f\x37\x4f\x8f\x3e\x54\x13\xa5\xc4\x16\xde\xd5\xe0\xea\x7d\x3e\xd8\x84\x7d\xf3\xc8\xda\xa6\x4e\x4a\xfe\x2c\xb3\xb9\xe2\x03\x1d\xa5\xa9\x25\xee\x69\x3f\x7e\x03\x3b\xab\x4b\x74\x4d\xa7\x3d\x1b\x9c\x89\x52\xa5\xd1\x0a\x72\x58\x83\xb2\x6c\xc6\x4b\x45\x24\x98\x15\x12\x50\xa2\xf8\x52\x36\x65\x5f\xf6\x9e\xf8\x06\xa0\x11\x15\x7e\xa8\xcf\xf2\x0b\x14\x1f\x32\x50\xb8\xe6\x92\x04\x18\xbf\x7e\x5a\x3d\xf9\x7e\x91\xd4\x4e\xfb\x2f\xbf\x26\x55\x7f\x75\xd7\x42\xc6\x26\xf4\x1a\x0f\x3f\xb2\x42\x65\x93\x3e\xd0\x64\xa0\xea\xdd\xc5\xef\x41\xf7\x9b\x62\xa4\x65\x80\x69\x9d\xac\x50\xa8\x0f\xf3\x58\xb4\x2b\xc0\x72\xc6\xef\xef\x23\x78\x91\x36\xd6\xa8\x3f\x5c\x05\x09\x26\xf7\x37\x26\xea\x7c\xa8\xfa\xf1\x7d\x6a\x6d\x72\x92\xd8\xa5\xb4\x5d\x71\x1d\x4c\x65\x0a\x3c\xaa\xa7\x98\x23\xcd\x83\x94\x62\x1c\x50\x8a\x1a\xb6\xc8\xb7\x83\x22\x9b\x3d\xcd\x91\xe6\xd4\x88\xc4\xe5\x0b\x96\x97\xd6\x77\x5e\x14\x7a\x5f\x7e\xfe\x11\x38\x8b\x41\x42\xf7\xb8\x3e\xc8\xf0\x63\xb3\xad\x57\x1e\x05\xa9\x39\x4b\x2d\x98\xfe\xf0\x0c\x4d\xfb\x58\xd7\x60\x15\xcd\xc3\x80\x62\xc6\xcd\xc5\x09\x4b\x33\x79\xed\x28\x0e\x00\xf1\x0e\xf9\x59\xfa\xeb\x46\x22\xc2\x68\xfc\x66\xf5\xa5\xfb\x49\x59\x7c\x4e\x56\x64\x0d\xd6\x91\xd5\xd3\xeb\x80\x42\x33\xfb\x24\x2e\xfb\x72\x5a\xb6\xe7\xda\x70\xaa\x8c\xf1\x2f\x75\x63\x8d\x12\x7f\x03\xae\x85\x65\xff\xc8\x45\x76\x74\xe8\xc9\xd9\x2f\xc9\xe3\x28\xc5\xb4\xa2\xc3\xde\x21\x92\xe3\xb7\x31\xf6\xc9\x25\x62\xbb\xbb\xca\xf3\x65\x5b\x95\x1f\x52\xa3\xb9\xd6\x09\x09\x30\x00\xb2\x7d\x5a\xed\x0f\xfb\xf5\xe2\xde\x3f\x73\xc2\x52\xa4\xa2\x79\x5a\x2f\xee\x26\xaf\x9a\x44\xa9\xa1\x9d\x3a\x42\x59\xcd\x29\x79\xf9\xa6\x9a\x39\xed\x9a\x95\x5f\x88\x78\x1a\x5a\x0a\x27\x67\x04\x3b\x22\x21\x3f\x0c\xfe\x76\x3d\x0f\x78\x1a\xd9\xc2\xdc\x83\xbb\xc9\x43\xd9\x3c\x9c\xf3\x7c\xf2\x58\xa9\x0c\x5d\x91\xa5\xf3\x06\x77\x30\xac\xd6\xd7\x3c\x35\x21\x72\x94\x96\xe7\xa6\x46\x2d\xea\x1b\xc8\xb3\x37\xa8\xae\x38\x4d\xfe\xfe\xc9\x1f\x77\x2d\x41\x29\x9a\xfe\x37\xd5\x88\xbe\x4b\x73\xd1\xee\x86\x3d\x93\xa0\x4d\x46\x8c\xf3\x42\x1f\x7e\x48\xe4\x0f\x1a\xbc\xb7\x60\x9c\x87\x5e\xc9\xfd\x1d\x19\x8f\x26\x3e\x03\x17\x91\x85\x3a\x3b\x92\xe8\xdd\x73\xb1\x2f\x77\xcf\x62\x32\x51\x44\x1c\x60\x4d\x04\x14\x1a\xf4\xa2\x9b\xbd\x22\x8d\xb1\x66\x61\x87\xd8\x0e\x4b\x0c\xf1\xf9\x70\x11\x92\x23\xbe\x7e\xf5\xb4\x5e\xec\xd7\x87\xed\xfa\xe9\x7e\xb3\xdb\x6d\x1e\x1f\x76\x87\xa7\xc7\xbb\x75\x77\x61\x9d\x5a\x1d\x90\x76\xc0\x6f\xab\xec\xbf\x1e\x0b\xa4\xb9\x24\x56\xf4\xf1\x23\x00\xe4\x6d\x59\x41\xf6\x5c\x3c\x94\xcd\xa6\xf8\xee\xc1\x0e\x9a\x4b\xae\x1c\x97\x9e\x8d\xfa\xfe\x8f\x50\xaf\xa7\x81\x80\xc0\x6f\x94\xd3\xfd\x55\x62\x86\x14\x0a\x15\x88\x41\x19\xcb\xc4\x15\xe0\x52\x25\x68\x44\xa9\x76\x51\xc9\x2d\x39\x63\x55\x4e\xca\xc5\xba\xb6\x02\x2d\xed\x2f\xd0\xfc\x6c\xb7\x69\x84\x5e\x8e\xf6\x30\xae\x42\x8d\xc5\x39\x2e\x9d\x38\x06\x25\x0f\x4d\x1f\xae\x0d\xd1\xb6\xd0\x5a\x7d\xed\xa8\x22\x35\x07\xe6\x98\x05\x2c\x06\xf3\x14\x4c\xc6\x00\x24\x31\xd6\xc2\xda\xe7\x45\x21\x8f\x59\x21\x2b\xcd\x41\x24\xd2\x16\xf5\xa1\xb4\xf6\xbd\x28\x2e\xfd\xdb\xcf\xd1\x20\xfd\xde\x71\xe2\x00\x0a\xa3\x62\xed\xee\xfd\x50\xb2\xdf\xfb\x45\xdc\x30\xc6\x3b\xb5\xf5\x49\x5d\xa1\xe6\x46\x59\xdd\x92\x1d\x12\x9c\x34\xd9\x44\x1b\x63\xfc\x42\x46\x5b\x26\xc3\xba\x29\x4f\xc8\xac\xe1\xae\x12\x93\xd4\x98\x8e\x00\xee\x98\x39\x5a\xfd\xd1\xb7\x8b\x69\x68\xeb\x9c\x5d\x75\xfa\xc7\x41\xca\x98\x46\x89\x97\x2a\x6a\xcd\x6e\x5f\x42\xbf\xbc\x60\x24\xb5\xf3\xd4\xe6\xb2\x9c\x31\x55\x31\x96\xda\xd8\x22\xf2\xe1\x5a\x11\x53\x13\x12\xd3\x2b\xb3\x6f\xd9\x4d\x8f\x8b\xd3\x31\x53\xd4\x99\xd5\x98\xe2\x5f\x2d\xf6\xc3\xfe\xf0\x8d\xb4\xb6\x05\x11\x5f\x1e\xee\xfc\x6f\x21\x61\xa2\x8f\x05\x8e\xac\xeb\x38\x0c\xd2\xd4\x6a\xbc\xc1\x46\x95\xbb\x5e\x44\x4a\xc7\x61\x6c\x70\xe3\xc8\x0a\x8f\x58\x9a\x71\x0b\xe2\x10\x92\x88\x77\xb0\x4d\x37\x0d\x97\x30\xed\xdb\x88\xd8\x42\x20\xd3\x8b\x1c\xe9\x38\xe2\xa9\xb7\xe0\x7f\x56\xe2\x74\x72\xd3\xc5\x1f\x55\x21\xa6\x58\x1e\xd7\xcb\xd5\x52\x14\xaf\xdd\xef\x10\x20\x85\xe0\xe6\x78\x2a\x2b\x84\xc0\xae\xfc\x21\x1e\x72\xe3\xf9\x61\xca\xee\x04\x9e\x02\x82\x3a\xd6\x7f\xec\x0f\xab\xc7\xfb\xed\xe2\xe1\x9f\x87\xc7\x87\x75\x77\x58\x5a\xfe\x54\x44\x11\xe2\x3c\x1b\x3f\x7a\xaa\x98\x55\xdf\xbb\xfb\xee\x4f\x49\xb5\x85\xe9\x4a\xcf\x20\xa4\x63\x91\x48\xe1\xa0\xf4\xff\x38\x97\xc8\x3e\x39\xb9\x8e\x48\x14\x92\x3c\x6c\x1f\xb7\xdf\x1e\x37\x0f\xfe\x44\x09\x3a\x4d\x3d\x1b\x57\xf9\xeb\x72\x5b\x56\xbb\xb1\xb2\xd0\xb8\xc3\x55\x6a\x63\x99\xfb\xaf\xcb\xc3\xe3\xb1\xc8\x2c\x7b\x89\xbf\x9a\x66\xc6\x02\x84\xad\x4b\x23\x72\x98\x96\xb5\x7e\xba\xa0\xc7\x5a\x08\xd4\xb9\x3a\x64\x35\x12\x9e\xf7\x7e\x4d\xa1\x47\x32\x59\x83\x8d\x34\x86\xc0\xe2\x2d\x7c\x50\xad\x82\xae\xd6\xe4\x33\x92\x23\xbf\x22\xc6\x86\xa4\xf8\x05\x40\x67\x0d\x2e\xaf\x96\x0a\x74\xfc\x64\x86\x47\xcc\x05\x45\xbe\x54\xc2\x98\xac\xc9\xc6\x2d\x12\x22\x23\x46\x7b\xf3\x6f\x34\xd0\x13\x02\x02\x07\x20\x6e\x41\xdf\x77\x1b\x67\xab\x0c\xf9\x35\x74\x12\x30\x9d\x38\xb9\x18\x4c\x45\x5f\x2c\x54\xb1\x3f\x1e\x32\x2c\x22\x7f\xcf\x0a\x5d\xbe\xb3\x4e\x83\xd4\x1f\xa7\x44\x20\x2b\xe7\xfe\xf1\xdb\xfa\xe1\xf0\x84\x5b\xe2\xd3\x7a\xb7\xe8\x76\xc2\x84\xc6\x96\x50\x06\x0b\xed\x3b\x4a\x81\xf1\x9c\x4a\xa8\xb2\x1f\xf1\x28\x7e\x59\xcf\x16\x63\x5f\xdd\x53\x50\x08\xb0\x48\xcc\x86\xc4\xd7\xff\x61\x6e\xc1\xf9\xfb\xe8\x0f\xf5\xad\x8d\x95\x96\xec\x33\xb2\xeb\x2f\x8f\x7f\xf4\x8b\x9b\x6b\xc6\x28\x41\xcb\xbd\x7c\x2f\xa0\xda\x41\xe3\x66\xf2\xa3\x41\x2d\xb6\xb5\x7e\x86\x91\x67\x9d\x30\xca\x70\xad\x12\x76\x78\xed\xce\x4a\x41\x5d\x9b\x73\x3e\x1a\x68\x01\x4d\x66\xc9\x0e\x74\xc2\x40\x5b\xad\x27\xb7\x81\xb7\x93\x46\x5c\x0d\xd2\xf1\x39\xa1\x4c\x70\x63\xb3\xb0\xcb\xdb\xb2\xf2\x39\xf8\x71\xb3\x88\x2b\x9f\xdd\x5a\x1d\x45\xbd\xbc\x5c\x63\x9f\x75\x12\xb3\x00\xd3\x64\x08\xed\xb8\x5f\xfc\xe1\x3b\x37\x21\xb1\x49\xbc\x3e\xc9\xa3\x99\x3b\x35\x49\x6c\xc8\x6d\x0b\x95\x29\xab\xe3\x22\xab\x6e\x5a\xc3\xda\x1d\x15\x84\x09\x33\x84\x90\xf9\xdf\x39\x43\x9b\xab\x56\xc2\x67\xf1\x13\x19\x06\xa6\xaf\x94\x1d\xc8\x00\xf8\x06\x8a\xd9\x6a\x53\xac\x4c\x6b\x44\x3e\x94\xea\xd1\x89\x8a\xac\x04\x5a\xa9\x75\xbd\xcb\x8a\xe7\x09\x47\xab\x4e\x54\x2a\x71\xad\xf0\x00\xac\x9f\x65\xfe\x3a\x79\x19\x4d\x28\x06\x0e\xde\xa7\x5c\xc6\xb3\x09\xeb\x59\x85\x87\x0f\xe2\x1a\x89\x26\x1a\x69\x43\x1d\x01\xd4\x98\x8d\x77\xbc\xee\x24\x40\x0c\x7a\xdd\xb8\x08\x3f\x21\x60\x9b\x4e\x5e\x06\x02\x19\x23\x1b\xcc\xf9\xb8\x59\x3d\x62\xd8\x8e\xfb\x9e\x00\x9a\x86\x6e\xe1\xbf\xcd\x3a\x5a\x9c\xa1\xb5\x9f\x98\x24\xf5\xb5\x1c\xa3\x02\xfc\xa9\xbc\xbf\x4e\x49\xa2\xb0\xf4\x71\x8a\x61\x40\xae\x9a\x76\x63\xf6\x33\x31\x25\x3a\x0c\xff\x7f\xda\xfe\xa4\xbb\x71\x1c\x4b\x1b\xc7\xbf\xcb\xbb\xca\x45\x2f\x00\x10\x9c\xfe\x3b\x59\x96\x1d\xea\xf4\xf4\x5a\x8a\xc8\xac\xea\x53\x47\x07\xc3\x85\xcd\x0e\x8a\x54\x91\x94\x1d\xae\x4f\xff\x3f\xbc\x18\x38\x88\x76\xe6\xbb\xf8\x2d\xba\x23\xcb\x00\x29\x12\xc4\x70\x87\xe7\x3e\x8f\x76\x7b\x77\xfd\x0e\xcd\x0e\xdd\x88\xaf\x41\x5c\x39\x01\x5b\xce\x82\x3c\x84\x4d\xb7\x3b\x4b\xab\x7f\x33\xf9\x2e\x39\x05\xc0\xc0\xf8\x03\x48\x09\xbf\x16\xd9\xb6\x5d\x4f\xc6\x4c\x4e\x06\xd5\xd9\x70\x16\xe4\x2c\xb5\x81\xf7\x33\xee\xc5\xfb\xe2\x34\x35\x44\x73\x96\xa5\x58\x76\xf8\xee\x11\x6d\x21\x94\x9a\x47\x29\xc7\xbc\xc7\xba\xfe\x09\xca\x47\x93\x86\x6a\x93\xbe\x43\xc6\xf8\x94\xcf\x21\x9e\x6c\xb8\x79\x24\x22\xe4\xa7\xdc\x0e\x17\x53\xf6\xd7\xd6\x60\xce\x79\x1e\x8f\xab\xe5\x9c\x0c\x2a\xe8\x67\xb0\x5e\x5a\x18\x7d\x9e\xd8\x87\x2c\x5a\x87\x08\x1a\x13\x04\xf5\xcd\x2a\xb6\x79\x3c\xcc\xf3\x6e\xfa\xbb\x0c\x96\x52\xce\x81\x45\xfd\x2e\xf1\x56\xc0\xfb\x9f\xeb\xd5\xfe\x62\xe2\x4f\x07\x2b\x8e\x05\x9e\x51\xa7\xba\x9c\xe5\x30\xf2\x38\x49\x30\x7e\xd7\xf9\x9c\x2d\x94\xde\x2c\xc8\xe3\x54\x22\x86\xac\x7b\x2d\x1a\x7d\x40\xce\x44\x5f\x97\xe2\x7a\x24\x04\x30\x36\x87\x75\xeb\x6c\x60\xc1\xd4\x79\xa2\xd2\xd8\x1e\xab\x80\x45\xa3\xfe\xcf\x46\x04\x22\x9c\xb2\x74\x94\xea\x75\x33\x21\x04\xd7\x79\xca\x32\xac\x90\x0b\xeb\x7a\xbc\x7b\xe7\x42\xe4\x78\x54\xd6\x13\xd6\x5c\x9d\x0b\x9d\x22\x6d\xc3\x6e\xf3\xb0\xfd\x7e\x1f\xfe\x0a\x60\xec\x40\x5f\x41\xb7\xeb\xea\x46\xbc\x0c\x57\x18\xae\xa9\xb7\xff\x5e\x1a\xd1\xc1\xf5\x19\xf6\xf5\x43\x6d\xeb\xfe\xdb\x11\x02\x2d\x57\x60\x2b\xd3\x26\xaa\xd2\x56\x45\x7a\xc4\xd7\x3a\x0c\xac\x56\xd2\xd3\x6e\xdf\x88\x23\xe8\xfe\xbc\xbd\xfa\xd8\x5e\xcf\xc6\x1f\x58\x84\x84\x86\x9e\x9e\x6d\x84\x1a\xc8\x81\xb3\x28\x1a\x15\x54\xad\x4a\x79\x3e\xfe\xb6\xe0\xbd\x7c\xf5\x5f\xb3\xa9\x60\x08\x35\xd2\x89\x96\x40\xf3\x68\x66\x8f\x63\x72\x3b\xb1\xac\xb9\x7d\x0d\x55\x7d\xf4\x46\xba\xad\xec\x9c\xae\x5f\x41\x68\xc4\x6c\x54\xaa\x56\x3f\x2f\x64\x20\xb5\x20\x1c\x02\xea\xa9\x85\x06\x15\x4e\xda\x79\x9f\x44\x27\x6e\x4e\xec\x2d\x35\x6d\xf3\xe1\x04\xe1\x6f\xc6\xec\x57\x5a\x90\x5c\xa3\x34\xec\x73\x71\x3a\x05\x27\x4b\x10\xa1\xd2\xdc\xb1\xbb\x88\x26\xfc\x99\x2a\x1b\x37\x2e\x5a\x2c\x96\x2f\x40\x2f\x3c\x1f\x05\x83\x26\x0d\x5a\x56\x78\x5e\x4e\x4e\x29\x41\x4d\x6a\x8b\x95\x50\x3a\x6d\x59\x54\x57\x0b\x46\x13\xc4\x64\xa0\x5e\x0a\x92\x59\xfc\x25\x10\xc8\x5d\x19\x31\x8d\x89\x89\x1b\xd5\x8e\x70\x30\x22\x4a\x32\xdc\x40\x37\xfb\x6f\xaa\x3e\x82\x14\xea\x67\xc6\x88\x6f\xe5\x52\xe0\xa0\xae\x0a\x59\x8f\xa9\xe9\xa7\x33\x50\xc4\xb1\x90\x2e\x5d\xf3\xcf\xb2\xee\xda\x45\x37\x5a\xc4\x2a\xc2\x55\x73\x3a\xff\xe7\x3f\x63\x91\xf6\xf1\xac\x11\xb1\xa6\xe8\xec\xfc\x13\x9a\x7a\xf3\x6b\xae\x4e\x3b\x9b\x13\x09\xa5\x58\xde\xe9\x43\x45\x9b\xee\x15\x6d\x62\x5f\x76\xb9\x78\xb2\x88\x84\x0b\x92\x4c\xa4\x04\xf7\xf5\xed\x59\x34\xa2\xea\xe0\xb2\xec\x7b\x62\x8b\xfb\x3b\xe4\x06\x2d\x8a\x9d\x28\x07\xf8\x84\x48\x93\xd4\x2b\x4e\xf6\x3e\xc0\x1d\x54\x2f\x5e\xc7\x56\x8b\x34\xcf\x11\x89\x26\xca\x72\xd3\xbd\x3e\x7a\xc6\x20\x2d\x32\xa2\x13\xa7\x57\x66\x95\x57\x06\x7f\x7a\xfa\xb2\x79\xc6\xf3\xcc\x53\x6a\x04\xd2\x1b\x2d\x44\x14\x61\xf8\x43\x9e\x3f\x56\x95\xee\x77\xd5\x31\xd0\x4e\x08\xcd\x10\x7e\x24\xda\xe3\x7e\x84\xd6\xfa\x7b\x28\x2d\x21\x79\x2c\xbd\xdf\xda\xe9\xa7\x06\x56\x97\xd5\x82\x5a\x48\x49\xcc\x20\x7d\x77\x29\x5b\xf1\xa5\x71\xe4\xee\xa1\x92\x4c\x3a\xc3\xc3\x7d\x82\x95\x7e\x9b\xcd\x20\x05\x1a\xb3\xcd\xce\x6d\xfb\xa8\x74\xa1\xbe\x80\x83\x2f\x5b\x16\x42\xd3\x38\x73\xfe\xf4\xea\x63\x9e\x21\x17\x90\x73\xdc\xc5\x9d\xfe\x65\xf1\x06\x18\xad\x18\xf6\xaf\x19\xa9\xa2\x16\x00\x14\x03\x4d\xef\x00\x3f\xf7\xaf\x0d\x8c\x38\x0b\xb5\x00\x03\xc8\x96\xec\xcf\x55\x0f\xe8\x15\x86\xe4\x0e\x72\x61\x3f\x0a\x7a\x74\x30\xc0\x1f\x66\x5f\xdf\x44\x14\x41\xc1\xfd\x41\x75\xed\xb5\x3d\x97\xdf\xcf\x48\x83\xaa\x2c\xbb\x87\xa7\x71\xdc\x44\x92\x98\x20\xd9\x5c\x57\xdf\xd4\x0d\x28\xd1\x76\xa1\xe2\xd9\x73\x13\x0d\x54\xec\x63\xe4\xa5\x24\x59\xc6\x12\x67\x42\xd4\xb5\x41\x97\xf7\xf2\x74\x70\x9d\x69\x64\x30\x18\xff\x84\x21\xbb\xc7\x6a\x12\xbc\x91\x54\x31\x34\x37\x4e\x4d\xfd\xbf\xa0\x3a\x8b\x50\x0f\x8d\x86\xa0\x95\xbd\x7f\xdc\xdd\x17\xfa\x5b\x5d\x6a\xcc\xc6\x4e\xf0\x64\x92\xb1\x18\x47\xd4\xd6\xca\xac\xca\xd2\x1f\xa1\xbe\x5d\x50\x04\x8c\x6c\x8e\x27\x2f\xb4\xa5\x65\x94\xc8\x78\x3c\xda\x8e\xed\xb6\xa9\x8f\x7b\x10\xc7\x2f\x73\x7a\x32\x32\x0c\xa1\xb0\x96\x2a\xf1\xaa\xd0\xcb\x5b\x97\x4c\x98\x35\xc9\xd4\x94\xc1\xd2\x55\xd8\xb8\x4e\xa9\xa0\x08\x17\xc4\x63\xec\xba\xee\xae\x67\x9a\x60\x5a\xa6\x8a\x22\xbe\xcc\xe6\xf8\x8b\xee\xe3\xaf\xd5\x7a\xbe\x9c\xef\x32\x85\x08\xad\xfe\x11\x39\xdf\x6a\xb9\xae\x50\xcb\x8c\x44\x16\x30\x5b\xd6\xad\x53\x09\x3b\x0f\x0a\x1e\x5a\x66\x51\xcc\x1c\x20\x76\xf3\x26\xca\xf3\x05\xc3\xbd\x96\x19\x8f\x22\x47\xf0\x7e\x07\xe2\xe5\x0c\xcf\x58\x40\xb7\xaa\xf4\xba\xc6\x00\x49\xff\x41\x61\x10\xd6\xfc\x84\x67\x63\x3a\xff\x65\xc6\x73\x2c\x69\x38\x9d\xbb\xaf\xb2\xea\x32\x57\x5c\x0c\x91\x9d\x6d\xd5\x41\x75\xc1\x5f\xa4\xa5\x20\x12\x2b\x39\xee\xd7\x7b\xcf\xcd\x3a\xb2\x0a\xa5\x48\x28\x26\xfb\xad\xd2\xd4\x48\x0a\xd7\xb7\x6b\x2b\x50\x34\x24\x2d\xbf\x06\x48\x49\x01\x04\x45\x25\x36\xa2\xfd\x98\x2c\x07\x01\xb9\xc9\x3d\xc6\x72\xab\xea\xfd\xbb\x0f\x64\x4a\x49\x52\x4b\xeb\xc9\xb2\xdf\x46\x6c\xd7\x5a\x4a\x96\x22\x4f\xf7\xaa\x7d\x5d\x8b\xf6\x75\x72\x3f\x99\x1a\xee\xf6\x6b\x4c\x20\xf4\x46\x9e\x65\x20\x9a\x7d\x25\x99\xa5\xdc\xa1\xce\x9e\x9c\x78\xdb\x44\x4c\x4a\x4b\x29\x48\xac\x5c\x21\xc4\x35\x18\x71\x2e\x1d\x9b\xb4\xdf\xdb\xa4\x4a\x15\xd2\x67\xa2\x63\x36\x4f\xb6\xba\x3e\x10\x27\x86\x78\x30\xba\x41\xdc\xcd\x12\x93\xaa\x96\x90\x70\xbc\x99\x3d\xbb\xaf\xce\x1f\x73\x0b\x4a\x82\x96\x58\xf9\xb6\xeb\xea\xd3\x76\xed\x0b\x08\x15\x61\x16\xa6\x65\x8a\x53\xeb\xd5\x16\xa7\x2f\xab\x48\x6e\x85\xa8\x1f\xdf\x1f\xc7\xa3\xa5\x88\x4e\xb0\xec\xa0\xaa\x8f\x70\x78\x2b\x2a\x55\x74\x81\x83\x5b\x2b\x4a\x35\xda\xec\xd0\xbd\xee\xde\xc5\x69\xb4\xab\x2b\x1a\x5b\x63\xed\x79\x73\xb7\x59\xed\x36\x87\xfd\xf6\x7e\x13\xda\x72\x8d\xc7\x01\x6a\x5d\x1e\x8b\xaa\x68\x3b\x71\x11\xbc\x52\x54\x24\xd2\xb3\x57\xff\x2c\xca\x72\x62\x2d\x28\x0a\x06\x61\x04\x58\xd1\x70\x2f\x7e\x4d\x4c\x45\xc5\x22\x8e\x32\x53\x07\xa1\x03\x81\xe0\x97\x98\x40\xc5\x92\x0c\x21\x8b\xde\x91\x39\xfc\xfb\x3c\x4e\xe0\x8d\x75\xf1\xfe\x87\xcd\xce\x37\xc5\xb2\x44\xb8\xa9\xb2\xa9\xd4\x0e\xd4\x4f\x08\x8f\x12\xa5\x71\x94\xbb\xe2\x71\x51\x1e\x50\x05\x12\x25\xd6\xc3\x59\x39\xb9\x55\x94\x19\x45\x27\x14\x43\x8b\xdb\x90\xe2\x4a\x60\x40\xe7\xfe\x43\x59\x0d\x91\xb2\xa8\xc2\xe0\xc7\x99\xdd\x20\x91\xcb\xdd\xd5\xa5\xa9\x7a\xa6\xf6\xa1\x55\x2c\x8d\xd5\x6f\x40\x2e\xce\x50\x0b\x3c\x70\x97\x2c\xd0\xbe\x6b\x95\x10\xf0\xa0\xac\xdf\x8b\xae\xfb\x58\xc0\x02\xa9\x04\x6c\xd5\x83\xdd\xdf\xef\xc5\xaf\xbb\x7e\x2f\x3f\x37\xe2\x32\xd3\xa5\x52\xce\x12\x08\xec\x46\xc5\xf1\x7c\xbc\x2f\x2a\x24\x69\xf9\xbf\x67\x81\x72\x16\xcb\xa7\x8e\x4a\x55\x8c\x6f\xd9\x9e\x8f\xdf\x44\xa3\xd7\x62\x3c\xe7\x53\x10\x58\x52\xd4\x80\x82\xaa\x2b\x3f\xfa\x99\x00\xda\x27\x7a\x7d\xaf\x9c\x32\x1e\xd8\x50\xef\x6a\xa1\x41\x87\xb3\xc4\x73\x28\x84\xce\x92\x58\x19\xc4\xa7\xba\x2c\x2d\x78\xc6\xf2\xb6\x7d\x76\xe6\xfc\xcd\x7f\x7d\xe4\x54\xc9\x24\xc1\x8a\x78\x94\x20\x6e\xc2\xaf\x0a\x89\x7e\xd6\xf7\xca\xaa\x72\x4e\x58\xea\x67\x23\x22\x4d\x0a\x72\x26\x22\xeb\x42\x9b\x37\x23\x99\x72\xeb\x22\x4f\x68\xfc\xa6\x07\xb5\xd2\x51\x4c\x4d\x08\x0d\xa0\x54\xd5\xc9\x9b\x17\x4a\x27\x14\x51\x85\x96\x10\x7a\x02\x4e\xf3\xaf\xc4\x66\x26\x8f\x02\x0a\x08\x12\x52\xe7\xc6\x8a\x6f\x06\x34\x88\x02\x4d\x3d\x6b\xd1\xd3\xf6\x00\xba\xe8\x0e\x91\x2f\xc9\x55\x26\xce\xd1\x25\xb7\xec\x77\x1d\xd8\xd0\xc0\xa7\x79\x3b\x65\xa4\xf6\x75\xa6\x28\xbd\x38\x3d\xb6\x34\x21\xb6\xbc\x0d\x2b\x96\x6d\x75\x92\x3b\xe8\xa7\x82\x83\x5a\x13\x66\x88\xd7\xc9\xad\x8b\xca\x07\x2b\x16\x7f\x55\xd3\x24\x49\x23\x47\xbb\xbd\xd9\x7f\x9b\xfd\x28\xcb\x52\xdc\x95\x8f\x56\x9c\xf0\xe1\x66\x3f\x33\xd8\x34\xcb\x53\x5b\x47\x20\x0c\xdc\x7f\xa5\x87\xa2\x35\x93\x19\xd2\x86\xae\x77\x0f\x8f\xe1\x72\x20\x78\x82\xd4\x48\x97\x62\x6b\x9e\x8b\x63\x98\xb8\x3a\x8a\x19\x3a\xe5\x47\x2c\x23\xb2\xa9\xc5\xe9\x0b\xc4\x92\x69\x31\x89\x95\x39\x77\x31\x00\x8d\x74\x0c\x04\x8d\xd6\x07\x78\xdf\xd5\xe7\xee\x95\xd1\xf1\x41\xa1\xd3\x84\xe0\x7e\xbf\xd9\x7f\xdb\x3c\x1f\x56\xf7\x8f\xdf\x1f\xf6\xa1\x4d\x52\xb4\x47\xed\xf3\x3d\xd5\x75\x39\x05\x33\xea\x54\x51\x8c\x64\x56\xf0\xee\x05\x87\x96\xc1\xfe\xd3\xb1\xc8\x58\x82\x6c\xf4\x76\xc3\xaa\x9b\xe3\x10\x51\xd5\x59\x64\xc5\x86\xfa\x5b\x7e\x49\x34\xe5\xfb\x27\x1c\x05\x4b\x0a\x34\x79\x2d\x1e\xec\x4b\x8b\x45\xe7\x91\xc8\x46\xe1\x94\xf6\x16\x2a\x68\xfa\x73\xac\xdd\x86\x14\x8b\x16\xd4\x8a\xae\xdd\xd4\x75\x27\x45\x08\xe7\x69\x11\xa5\x48\xa5\x65\x4a\xf1\x09\x99\xb6\xd6\x22\x95\x98\xb0\x36\x67\xad\x27\x63\x2d\x14\x47\x75\x08\xbb\xbb\x1e\x8b\xea\xb4\x20\xac\xa6\xb5\x4c\x53\x44\x8c\x1c\x74\xd1\x3b\x32\xfe\x44\xd2\x2a\x62\xa9\xab\x95\x6b\x8a\xee\xe3\xa6\x3e\x57\x1a\xd7\xd4\x56\xff\x0a\x7d\x32\x40\xe8\x92\x29\x7e\x81\xbe\xab\x5f\x60\x81\xf4\x42\xf7\x9b\x13\xc6\x2b\xac\x6e\xff\xd7\xf6\xa9\xd6\x3c\xc9\xc7\x94\x44\x0f\xe2\x08\x7f\xf6\x5d\xe6\x5a\x1a\x43\xa0\x4f\xeb\x38\x42\x59\x5f\x7b\x42\x4d\x59\xe2\xb5\x06\x1a\xbb\x3b\x6a\x80\xa3\xcd\x70\xad\x1b\x31\x78\xfe\x1a\xa2\x9c\x8e\x94\x28\x9c\xb1\x61\xbf\xd2\x74\x09\x00\x89\x62\x2c\xae\x80\x4a\xff\x51\x37\x33\xa4\x3b\x50\xc1\xbd\x31\xe2\x4e\xd4\x81\x6d\x49\x03\xe3\x8a\x5a\xe8\xab\x39\x57\xda\xd1\x50\x2f\x7f\x55\x88\x22\x81\x11\x53\x5d\x6f\x43\x74\xe5\x93\xfd\x1c\xa2\x34\xc5\x35\x77\xbc\x80\xde\x43\x94\x2b\x6a\xc5\xb4\x7e\xdd\x8a\x76\x1c\xcf\x80\x08\xa4\x71\x51\x16\x3b\xf5\x37\x15\x34\x2f\x33\x6c\x38\x44\xc6\x16\x9a\x0c\x08\x63\x0b\xd9\xf5\x63\x07\x5c\x09\x4c\x9b\xff\x2e\x9a\xa3\xf8\xe4\x65\x38\x48\xea\x02\xab\x2b\x5d\x9f\xba\x61\x01\x42\x92\x27\xc8\xe9\x73\xb2\x15\xe2\x37\x80\x85\x22\x6d\x1c\xda\x05\x41\x04\x17\x26\x6a\xfa\xf5\x76\x6e\xb7\xeb\xd5\xd3\x05\x85\xc9\x02\x6f\x88\x86\x54\x1b\xcc\x5c\xda\x58\xcb\xa1\x36\x87\xf5\x6b\x71\x30\x75\x73\x78\xac\xe0\x30\xec\x5a\x90\xa9\x14\x3d\xfd\xab\xef\xff\xd8\x3c\x1f\x76\xfb\xcd\xd3\x81\x5f\xfc\x84\xf5\x1d\x66\x3f\x91\xe9\x08\xcf\x5d\xcf\x08\xd2\x5a\xf6\x58\x7f\xe3\x5c\x65\xc8\x64\xf1\x2a\x4a\x84\x6e\x34\x02\x25\xc0\x43\x33\x70\x44\xb9\x1d\x26\x05\x80\x7f\x14\xdd\xeb\x33\x18\x68\xa0\xba\x9c\x1f\x8b\x75\x27\x20\x1c\x61\x2f\xd6\xbe\xcc\x0b\x6d\x40\x08\x96\xa7\xe3\x5a\xb6\xb2\x9c\x51\xb2\xf7\x7d\x22\x64\x28\x38\x16\x81\x16\x6a\xa4\x90\xa9\x41\xe8\x1c\x0b\x34\xef\x3f\x7c\x7c\xc5\x37\x98\x44\x8f\x39\x19\x6e\xb6\xcf\xbb\xfd\xe1\x7a\xf5\x8f\xc3\xfa\xf1\x61\xff\xbc\xbd\xfa\xbe\xdf\x3e\x7a\xf8\x01\x48\x16\x21\xaf\xf7\x6e\xbf\x7a\xb8\x5e\x3d\x5f\x63\xd6\x3a\x34\xe6\x54\xa5\x01\xdc\xe1\x79\xa4\xa7\xef\x22\xb5\xad\x4c\xb7\xf4\xf7\x5f\x06\x1c\x40\x71\x25\x6d\x8c\x04\x25\x17\x0e\xed\x08\x6f\x02\x5a\x45\x89\xb3\xc6\x6f\xcf\xd5\xd5\xc7\x56\x3f\x89\x8b\x2c\x20\x40\xca\xa2\x31\x7f\xd7\xd5\xd3\x7c\x47\x30\x9c\x63\x96\xe1\xa6\x38\xb5\x0f\x75\x27\x42\x95\x3c\x18\x69\x61\x68\xaf\x20\x9a\x4e\x42\x60\x3e\x31\x24\x53\x48\x9a\x72\x1a\xe4\xd0\x1c\x5b\xd7\x28\x1f\x63\x68\x62\xb3\xff\xc8\x5d\xd6\x6f\x4c\x07\x51\xe9\x03\x86\xbd\x0f\x6f\x53\x4e\xe2\x71\xa8\xe9\xeb\xff\xef\xef\x9d\x69\x8c\xed\x1c\x6b\x0d\x33\x4f\xd3\xd0\x0c\x30\x78\xe4\xe6\xff\xbe\xfe\x36\x60\x8c\x7c\x97\x3c\x26\x16\xab\xd3\xed\xeb\x6b\x98\xd5\xec\x19\x26\x19\x82\x5c\x4f\xf5\x3b\x34\xd7\xf5\xfb\xa7\x3c\x47\xa1\x7f\xca\x22\x4f\x37\x8e\x2e\xb4\x53\x18\x75\x56\x0e\x7c\x8e\x8d\x32\x4c\x27\x58\x59\x7c\xb3\xbd\xfd\xb6\xbf\x7f\x7c\xd8\x78\x3a\x10\xc3\x89\x4a\x43\xd9\xa5\x55\x03\xb8\x1e\x5c\x4f\xc3\x05\xcb\x5c\x7d\x87\x17\x82\x16\x25\x5c\x8b\x8f\x55\xa5\x07\xbe\x59\x3f\x60\x5c\x6b\x8c\x54\x9b\xa2\x09\x59\x49\x13\x53\x4e\x5c\x84\x66\x6b\x3f\xe0\x5a\x54\x57\x58\xe3\x34\xca\x43\x99\x38\x8f\x11\xb5\xf8\xa3\x28\x4b\x51\xd5\x6f\xe2\xad\x7d\x16\xda\xd4\xa1\x82\xc5\x24\x92\x61\xa8\x07\x65\xf3\x9f\x47\x98\x25\x93\x26\x56\x1b\xaa\x77\xca\x11\x04\xdd\xbe\x0e\x18\x3f\x46\xc6\xd1\x74\x93\xa6\x8a\x78\x85\x78\x67\x3a\x3d\x9a\x70\x23\x95\xa1\x1a\xf7\xb1\xf6\x2b\xd7\x64\x89\x41\x83\x0f\x89\x64\x23\x76\x60\xe4\x40\xd9\xec\x4b\xe7\x94\x7a\x7a\xd5\x81\x15\xd3\xfd\xb8\xef\x12\x1b\xf4\x31\xbf\xad\xfe\xb1\x0a\x74\x44\x26\x4f\x32\x1b\xc4\x13\xcd\x56\xef\xeb\x67\x4c\x5e\xcd\xe6\x89\x20\x11\x82\xac\x8f\xb6\x5c\xcf\xe2\x90\xa6\x66\xb1\x11\x54\x61\x20\xe6\xee\xee\xc7\xe1\x2d\xa2\x07\x7f\x32\x18\xc9\x33\xee\xb4\xfc\xe1\xfd\x1a\x40\xcf\x9e\x5c\x71\x66\xd9\x1d\x35\x20\x3b\x63\xf1\x1f\x98\x95\xbc\x18\x95\xe4\x99\x2b\x15\x3b\xbc\x8d\x32\x4e\xed\x63\x55\x7e\xdc\xd7\x7a\xcc\x67\x61\x94\x60\x42\x07\x91\x5a\x57\xc6\xbb\x3c\x9f\x55\x3f\xa5\x31\xac\x55\x54\x3f\x8a\x52\xcc\x16\x98\x66\x19\x9a\x84\x78\xa6\xd9\x1b\xdd\xd4\xc1\x9f\xfe\x03\x8a\xfe\x10\xf0\x51\xcf\x7d\x3d\x91\xf6\xd5\x46\x67\x11\x9e\x19\xbb\xa7\xd5\x94\xe4\xc1\x80\x50\x88\x8b\x42\xff\x58\x94\x16\x73\xd4\x5f\x3a\x4b\xe3\x60\x77\x20\x44\xe6\x98\xcf\xf6\xec\x2e\x4e\x30\x63\xe9\x95\x80\x50\x2a\x29\x1d\xf1\xc1\xb5\x57\x42\xfd\x5c\xdd\x74\xd0\xac\xeb\x66\x8c\xa0\x04\x12\x31\x81\x09\xc9\xb6\x2c\x4e\xa7\x90\xba\x05\x82\x02\xa8\x83\x0e\x99\x65\xa1\x98\x0c\x0d\x90\x48\xc7\x08\xf3\x29\xda\x3d\xcc\x04\x55\x80\x70\x9e\x61\x11\x83\x7b\x9d\x41\xb4\x62\x7c\x16\x02\xe1\x71\x86\xec\x33\x98\x96\xda\x81\x3a\x63\xd5\xd3\x32\x30\x6c\xf6\x03\xd2\x30\x8b\x5c\x44\x16\x97\xdd\x6b\x71\x1a\x7b\x7d\x99\xeb\x16\x67\x16\x17\x6d\xa5\x27\xce\x9e\xdd\x66\x88\x6b\x01\x89\x55\x8e\x5d\xbc\xa7\x54\x5d\x7d\x5c\x41\x05\xa6\x50\x45\x38\x20\xfa\x5e\x22\x75\xe6\xe2\xe1\x09\x2a\x5d\x54\x2f\xb7\xe3\xd4\xd5\xa5\xea\x9d\x9f\x8e\x40\x62\x20\x88\xeb\x84\xde\x56\x18\xaa\xe1\x80\x24\x49\x84\x0c\x90\x68\xc6\x5e\x37\xe2\xdd\xd5\x00\x87\x76\x09\x58\x2d\xa2\xeb\xf7\x0a\x5f\x73\x5f\x5f\x89\xb6\x50\x93\xe5\x03\x24\xcd\x09\xb2\x4c\x43\xa5\xaf\xce\x03\x71\x26\x90\x8c\xa4\xe8\x6b\x57\x48\x5e\x7a\xd5\x29\x5b\x17\x1b\xee\x9f\x45\xb6\x86\xf2\x74\xee\x76\x5d\xdd\xdb\x32\x57\xdd\x65\x49\xc6\xdf\x25\x9d\x5f\x04\x00\x85\x5f\x32\xa9\xad\x0c\xfc\x2c\x87\x03\x24\x8b\x15\x82\x31\x85\x45\x4d\xed\xeb\xc7\xd2\x7a\x49\x5e\x74\x68\x1a\x5e\xe9\x2f\xd0\x76\x13\x9d\x57\xec\xf6\xf7\xe5\x2e\xe9\x36\x9d\x70\x59\xaa\x89\x0b\xc6\xd9\x52\xfb\x12\xb1\x55\xb3\xb8\x2b\x90\x9c\x32\xb4\xd3\x7f\x17\xd5\xcb\xe6\x71\xe7\x07\x2c\x8f\x0c\x16\x38\xf7\xdb\xf6\xd3\xb9\x2c\x91\x95\xa2\x39\xfb\x63\x06\x48\x9e\xa5\x68\x2e\xbc\xc1\x6b\xa1\x4a\x40\x4f\xec\x93\x65\x2a\x22\xe6\xd3\x0a\x03\x5a\x70\xd6\x25\xa6\x08\x93\xda\xbf\x43\x50\x9f\xf4\xbf\x24\x52\x21\x1d\x1b\xdf\xe3\xc3\xed\x61\xf5\xfd\x7a\xbb\x9f\xc3\x8b\x27\xaf\x2e\xa4\x40\xc3\xd9\xd4\xe7\xa6\x7b\x3d\xb8\x1a\xf6\xf9\x2f\x6a\x86\x16\xe2\xfe\xe9\xab\x42\x50\x20\x02\x34\x42\xd9\xf6\x0d\xc0\x53\x39\xd1\x63\x02\x22\x53\x40\xec\xb8\x85\x39\xe0\x66\xa9\x6a\x0d\x8d\x35\x96\xad\x4b\xf2\xf5\xea\x56\xd4\xa0\xcd\x63\xa0\x53\xaf\x0f\xf0\xab\x9b\xd6\x2c\xbb\x5e\xda\x49\x39\x3a\xf2\x78\x1f\xe2\xa8\x9b\xc0\xc4\xe7\x3b\x1a\xa9\x03\x23\x93\x45\x77\x2e\xe3\xde\x81\x80\x01\x84\x36\x9f\xce\xdd\x55\xa7\xfa\x27\xde\xfd\x7f\xb4\x24\x8c\xd6\xe8\xcc\xa3\x11\xf5\xad\xd6\xe5\xb2\x02\xc2\x64\x60\x28\xc9\x19\x16\xd4\xb8\x30\x2c\x2a\xbd\xf9\x04\x80\x05\x24\x4e\xc3\x2c\x93\x97\xa3\x24\xb7\x18\xf8\x63\x51\x5d\x15\x7e\x17\xa2\x94\x49\xe3\xd8\x9f\xd4\x33\xb4\x0b\x82\x2b\xb3\x87\xa0\x0c\x74\x3a\x82\x9b\xd7\xc5\x27\xfe\x2e\x50\xca\x63\x94\x8f\x7e\x7a\xde\xfe\x58\xed\x37\x07\xac\x53\x5f\xad\xd7\x43\x30\x09\x28\x4d\x39\x35\x63\x45\xce\xbf\x18\x03\x9a\x69\x2c\x0a\xeb\xed\x80\x36\xe0\x57\xfa\xbf\x1b\xbc\xcf\x3b\x14\xf7\x05\x32\x14\x05\x51\x29\xa0\x54\xa6\xc8\xf0\x2c\x45\xa7\x5e\x57\xd3\xa2\xfa\x0b\x53\x15\x28\x85\x28\xcd\xbe\xe0\x6b\x9e\x0d\x2c\x4b\x85\xb4\xf6\xff\xaf\xa7\xda\x27\x2d\xfa\x3f\x83\x15\x9c\x13\x06\x0e\x42\xcf\x4e\x75\xca\xf2\x3c\x71\xdc\x6a\x0a\xfe\xf0\xe8\x3c\xa0\x3c\x4e\x31\xe5\x5f\x54\x05\x9e\x54\xed\x65\x1a\x3e\x3c\x68\xcc\x34\x16\x8c\x1d\xc5\x2f\x2b\x1d\x3b\x56\x6d\x05\x1a\x47\x3c\xd1\x21\x5c\x62\x69\x10\xd7\x75\xd5\x76\x8d\x28\x2a\xa4\xf9\x0c\x6f\xb4\x90\x44\x01\x1a\x27\x09\xee\x97\xa7\x83\x75\xf4\x06\x43\x65\xf6\x2e\x31\x58\xa8\xe1\xad\x05\x82\x20\x83\xdd\xe5\xb2\xa9\xeb\x72\xb2\x8f\xd0\x24\xce\xa8\xd7\x42\xb9\xba\x5f\xff\x3f\xa1\x1a\x80\xa6\xb1\x42\x08\xdd\x4b\x5d\xea\xef\x9e\x00\xd0\xb7\xc9\x0c\xad\xf1\xe3\xb9\x43\x59\x76\x21\x9f\x46\x04\xf6\x9f\xdc\x30\xa3\x14\xfd\x90\xd5\x6b\x5d\x97\x30\xce\xe2\x03\xcd\x98\xc6\xf0\x86\xd0\x7a\x07\xa5\xea\x6e\x90\x61\xf9\x1a\xc4\x40\x21\xfa\x37\x1f\x3b\x03\xcb\xa9\xd6\xbb\xc5\xc5\x11\x8a\xea\xbe\xa8\xce\xc3\xb1\x4c\x45\x14\xa5\x83\x0c\x93\xdf\xb1\xda\x75\xbd\x24\x96\x0d\x54\x70\x86\x86\xd8\xc9\xfa\x1c\x76\x87\x2d\xa1\x6d\xf7\xa2\x45\xcd\x8b\xde\xfa\xfd\x1b\xea\xb6\x40\x45\x1e\x11\x17\x6b\xbf\x13\xad\x25\xff\xf1\x0f\x25\x89\x46\x0a\x50\x47\x28\xf1\xa3\xee\xa0\xf9\x92\x4c\x02\xa8\xe4\x09\x5a\x77\xff\x3e\x8b\x12\x0d\xf6\xc5\x2d\x97\xca\x58\x46\xe0\xa4\xfc\x37\xa2\x29\x3f\x10\xc0\xcb\xc3\x0f\x8b\xc4\xab\x36\x5a\xe4\xbd\x4b\x0c\x4e\x7f\x4b\x11\x8b\x15\x51\xe2\x54\x74\xa2\x1c\x68\x60\xfc\x6d\x14\xd3\x88\x9c\xf7\xbb\xe5\xef\xf0\xb1\x68\x93\x52\xa5\x28\x66\xc3\xcc\xb9\xd2\x5e\xe8\xc7\x35\xe9\x8c\x62\x45\x8b\xad\x1f\x9a\xa5\x1d\x67\x63\xa9\x05\xe1\x89\x93\x08\x45\x1c\x66\xef\xe0\x4d\x72\x33\xee\x20\xa0\xc0\x72\x3c\xec\x2c\x40\xe0\xf4\x31\xc2\x26\x03\x05\x21\xa3\xfe\xbd\x7e\x7c\xdf\x6f\x76\xfb\xf0\x24\x46\x13\x1d\xfc\x92\x15\x02\xec\x17\x59\x20\x80\x11\x93\x22\x24\xf1\x9b\x68\x5f\xab\x5a\x03\x56\xc5\x04\x30\x1c\x30\xca\x01\xc9\x39\xec\x4e\xe7\x10\xeb\x73\x7b\x88\xd1\x38\xc2\x58\xea\x5b\x01\xef\x23\xeb\xf8\x1a\x3a\x51\x94\xed\xbc\xb3\x24\x38\x21\xd7\x9c\x8c\x7f\x29\xca\xc1\xd3\x18\x7e\xab\xcf\x53\x07\x13\x58\x04\x80\xda\x3e\xf0\x0b\xd4\xd9\x95\x43\x7e\x6a\x5c\x2f\x4e\xdf\xfe\x16\x18\xe2\x46\x66\xcf\x6f\x75\xd3\xfa\x12\x3a\xd7\xce\x8d\x92\x8e\x31\xf8\x5b\xa1\x26\x36\x0b\x8b\xb9\xc0\xf8\xc0\x3f\xf6\x41\x20\x2c\x34\xc5\x29\xa2\x08\x0f\xc8\x05\x79\xe8\xea\x9f\x15\xd2\xbe\xb5\xa0\x6a\xef\xfd\x03\x8b\x21\x8b\xd2\x49\xc2\x25\x68\xdb\xfb\x1e\x46\x7b\x16\xdb\x7e\x75\xed\x3a\x18\xca\x73\x80\x25\x44\xb0\x31\x71\xb5\x0b\xa9\x8d\xab\x50\x80\x25\x0c\x78\x12\x24\xde\x35\x3c\xf6\xd6\xbe\xab\x09\x9a\x8e\x45\xc2\x89\x4e\x02\xf9\xc7\xba\xac\x5b\xd4\x77\x9a\x9b\x98\x2c\x65\xb9\x65\x20\x6a\x9f\xe1\xcd\x0a\xcb\x8e\xe7\x1f\x4b\x81\xca\x31\x35\x75\xff\x58\xdd\x35\x08\xbd\xa0\xef\x0e\x2c\xcb\x2d\xb1\x17\x32\x55\x36\x37\x05\x94\x3a\xf2\xcf\xae\x13\x85\x80\xb9\x03\x1c\x8b\xce\xb3\xbf\x7f\xad\xf8\x04\x4c\xa7\x96\xfa\xdf\xfb\xb2\x23\xc7\x8d\xe9\x54\x83\xaf\xf9\x18\x24\x88\xb6\x95\x2a\xcf\xbd\x7b\xb6\xf5\x25\x67\xcb\xa6\x09\xd3\x5a\x26\xe3\x8c\xf6\xff\xd6\xcd\xc0\xb7\xb1\xe4\xcd\xfd\xd7\x78\x5c\x20\x23\xee\x60\x0d\xac\x18\xed\x4d\x59\xd7\xcb\x59\x29\xef\xaa\x31\x80\x08\x43\xf0\x1a\xe4\xf9\xe5\xd0\x1b\x50\x1d\x52\x34\xba\x66\xa3\x20\x72\x05\xa0\xab\x73\x57\xbb\x13\x6d\x70\x25\x99\x81\x80\x03\x78\x80\xf7\x91\xfc\x21\x44\x84\xf0\xc4\x95\x06\x0d\xd4\x60\x10\x91\x2c\xca\xac\xe7\x55\x5a\x81\xcb\x19\x2c\x03\x22\x1a\x19\xac\x7f\x3a\x78\x63\xa7\x1c\xad\xce\x4f\xc2\x92\x10\x51\x95\xa6\xae\xaa\xed\x9f\xf5\x65\xc9\x3d\x44\x8c\x32\x7c\xd4\x27\xed\x8b\x14\xa6\x3f\xcb\x18\x43\xeb\xfd\xea\x66\x9c\x77\x84\x88\xc5\x71\xe6\x65\x9f\x3f\xdd\x00\x46\x0f\xc2\x12\x5b\x62\xd6\xf7\x9f\xac\xf7\x88\x49\x10\xcc\x73\xb8\x7a\x12\xc8\x27\x68\x7c\xd0\xdc\xf7\x8b\x54\x94\x7a\x39\x3b\x04\x6a\xfd\x9a\x59\x37\x11\x8f\x25\x46\xb2\x6f\x84\x65\xd8\x1a\x3d\x2e\x37\x11\x02\x0e\x8a\xf6\x7b\x0b\xcd\x37\xd1\x3e\x41\xd3\x2f\xfc\xba\xda\xd7\xf7\xb5\x2e\xcc\xf2\x31\x13\xc5\xd4\x12\xef\x96\x75\xd7\x81\x85\x64\x0f\xdf\x32\x66\x9a\x0f\xcc\x70\x83\x4c\x7d\xf7\x0a\xd0\x88\xcb\x78\x4b\x94\x50\x86\x48\x06\x09\x5d\xfb\x47\xd8\x72\xa2\x84\x29\xdc\xdc\xad\x36\xe8\x88\x9f\x19\xa2\x24\x4a\xb0\xe9\xea\xfc\x61\x4b\xaa\xbb\xd7\x77\x81\xc4\x0c\xe3\xe8\xc7\xe2\xd2\x89\x92\x38\x15\xb1\x87\xb4\x54\xa6\x78\xd9\x54\x5d\xf3\xb1\x1d\x11\x4d\x4e\xfb\xa7\xb1\xc5\x41\x20\xf1\xec\x63\xf5\xdb\x78\x1e\xa5\xb9\xf6\x95\xeb\x36\x94\xeb\xfe\x9e\x09\x86\x26\xb5\x76\xa7\xe7\xe4\xe1\x33\x2d\x9c\x1e\x7d\x7f\x4a\xdf\x94\xb3\x02\x16\x88\x72\x96\x60\x49\xd5\xfb\x9c\x92\x79\xf1\x08\x09\x97\x49\xce\x30\x37\xa3\x44\xc8\xac\xcc\x66\xad\x54\x29\x86\x32\x57\x47\xf1\x9f\xa2\x7a\xb9\x9e\x25\xde\x21\x52\x39\x20\x72\xe8\xdf\x6d\x28\x9e\x80\x48\x49\x91\x99\xb0\xd7\x78\x0e\xfe\xeb\xab\xf9\xb5\xc0\xd1\x13\xbb\xdd\x6d\x1e\xfc\xa5\x3a\xe1\x18\xa3\x79\xed\x1d\x97\xa2\x7a\x69\x1f\x00\xb4\x87\x8f\x42\xa4\x05\x70\x97\x35\x2c\x8e\xe7\x63\xbf\xf2\x31\x17\xf4\xbd\x2a\x82\x17\x10\x69\x90\x58\xbc\x78\xff\x71\x6f\x11\x0b\x97\x08\x1f\x88\xb4\x31\xe8\x21\x61\x58\x6b\xed\xb5\xdd\x3e\xd5\x1b\x59\x3e\x83\x7b\xef\x1f\x99\x40\xda\xae\x3e\xdd\x17\x55\x17\x32\x68\x10\x01\x64\x98\xe4\x7e\x80\xf7\xff\x7b\x86\x16\x8d\xb3\x31\x0a\x2b\x7c\x05\xc3\xc1\x52\xaf\x80\x28\x37\xad\x35\xdf\x3f\x4e\x5d\x7d\x73\xae\xb4\xcb\x36\x4c\x9f\x9d\x13\x21\x24\x1f\x14\xcd\x55\x37\x16\xc0\xfe\x9f\x6c\x8a\xee\x02\x4e\x59\x8c\xa5\x1f\x1b\xd1\x7a\x5f\x8d\xd3\xd8\xaa\xd1\x2d\x06\x93\xc6\x66\xde\xd2\x78\x2c\x57\xbf\x8d\x7e\x50\xc7\x1e\xc6\x63\x15\x00\xfb\x25\xf7\xad\x7e\xc7\xb2\xfa\x0b\x2f\xd4\x5d\xc4\x52\xc8\xf2\xf0\x52\xdf\xea\xb6\x5b\x55\x1a\x49\x10\xea\x66\x7d\x9e\x6d\x51\x9c\x09\x8d\x19\x82\x6d\xd5\x76\xa2\xea\x0a\x9f\xf5\x03\xce\x40\x63\xe8\xfc\xa9\xa9\x5f\xfa\x1f\x2a\x9c\x55\xf1\xdb\x17\x0c\xaa\x17\xff\x4e\xc7\x3b\x92\x09\xda\xc8\xd2\x69\x6a\x3f\x9a\xd9\x07\x89\x20\xc3\x0f\xb2\xaa\x8a\x23\x7c\xae\x84\x0c\x9c\x53\xb0\x65\x05\x96\xbb\xe5\x6b\x73\x80\xf3\x98\xa3\xfd\xb3\xdb\xaf\x9e\xf7\xdb\x87\xdb\xc3\xef\xdb\xbb\x10\x9d\xe3\x3c\x8e\x2d\xc2\x27\x54\x9c\x4e\x34\x22\x81\xf3\x24\xc7\xb0\xf6\xb5\x27\x9e\x06\xce\xd3\x44\x44\x33\x80\x95\xb3\x1b\x02\xf9\x7a\xd5\x7d\x12\xde\xe0\x31\x31\xc6\xf8\x6c\xd8\xb5\x05\x67\x4f\xc2\x74\x3c\x4e\x62\xed\xf9\x74\x36\x4d\x53\x37\xdf\x2b\x11\xd4\x20\x1f\xc4\x31\x44\x6f\xbc\x69\xcf\x13\xc2\xa5\xad\xfa\xf2\x1a\x0d\xa1\x41\x60\x0a\x66\x28\x3e\xbc\xaa\xeb\x9f\x73\x86\x52\xe0\x09\x58\xc3\xc6\xd4\x4d\x77\xae\xe0\x00\x95\x16\x0b\x8c\x14\xc0\xd3\x84\x60\xde\xe7\x58\xbf\xc1\xe7\x20\x34\xe0\x59\x6c\x89\x4a\xb0\xbe\xba\x3e\x9f\x2e\x44\xc3\x80\x67\x19\x43\x72\x01\x37\x86\x6b\x1f\x36\x31\x45\x73\xbc\xd4\xa4\x73\x17\xe5\x24\x4d\xc7\x15\xe9\xa6\xac\x7f\xf6\x6e\xd9\x27\xca\x6c\xd3\x5d\x82\xe7\xa9\xe5\x58\xfd\xf1\x78\xf7\xfd\x7e\xe3\x93\x4d\xc0\xf3\x8c\x21\x54\xd8\x13\x47\xab\x9f\xd0\xad\xc5\x69\xf6\xc0\x79\xae\xdd\x97\xd3\xbf\xff\x63\x3d\x9b\xbd\xb9\x04\xed\x92\x4d\xe3\x43\x6d\x72\x03\x91\x5b\x36\x5a\xa8\x4c\xdd\x28\xd8\xa1\x33\x30\x26\x87\x98\xbd\xac\x64\x44\x0d\x14\x74\xb7\xe2\x68\x59\xc5\x4c\xa1\x3e\x89\x87\x73\xc9\x62\x47\x64\xe2\x02\x00\x17\x4e\x2d\x97\x5a\xe1\x31\xf7\x2a\x5a\x37\xef\x5c\x6e\x02\x29\x1b\x67\x7e\x19\x97\x00\x96\x9e\xf3\xf1\x2e\xcc\x7f\x45\x6c\x45\xab\x15\x17\x3f\xd0\xd9\x30\xa9\x3c\x8e\xf8\x38\x72\x7a\x84\xaa\x0b\x12\x69\xc0\x75\x4e\xd1\xfa\x19\x84\x85\x0c\x65\x97\xc2\x42\xc0\x81\x58\xb1\xc2\xaa\xee\x0a\xf3\xf1\x68\x56\x8d\x2c\x3a\x0b\xfc\xf3\x85\xcd\x8b\xfe\x2b\x37\x3c\x47\x58\x46\xdb\xcd\x59\xbf\x81\x1b\x23\x7c\x39\xf7\xf6\x28\x46\x90\xa6\xa1\x4e\x63\x71\x68\x63\x92\xa5\x4a\x85\xf4\x6b\x5b\xa8\xfd\xeb\x70\x50\xc5\x44\x12\xe9\x71\x0b\xb8\x5d\x5b\x72\xb9\xc9\x73\xc5\x44\x03\x72\x13\x05\x15\xd4\x09\xd8\x06\x62\x4a\x32\xfc\x7a\xfe\x3c\x79\x7c\xda\x0d\x00\x23\x88\x99\x8e\x31\x35\x58\x9f\xa0\xba\xaa\x7f\x8d\x63\x7c\xae\x47\x44\x01\xe7\x31\xc2\x96\x71\xbe\x20\xa4\x66\x3a\x04\x71\xa4\x14\x2a\x51\x09\xd5\x9d\x85\xad\x82\xba\x2e\xde\x8a\x76\x06\x7e\x87\x98\xf3\xb0\x88\xaf\x8a\xae\xad\x27\xb9\x5b\x88\x79\x92\x20\x6f\xb4\x0f\x56\x5c\x9f\x45\xf9\xf8\x5e\x4d\x44\x66\xa7\x03\x10\x83\x40\x44\xf0\x49\x34\x56\xa1\x22\xe0\x6c\x7d\xc4\x6a\x36\x62\x09\x8d\x11\x71\x75\x53\x9f\x27\x26\x74\x9c\x64\x06\x79\x83\x31\x76\xf8\xd1\x6e\xab\x47\x63\x02\xfa\x09\xe2\xc4\xd8\x7a\x01\xe4\x8c\xfc\xa8\xe7\x27\x5f\x9c\x46\x16\xf2\xbb\xf1\x9a\x25\x56\xdf\xc0\xb5\x66\x89\x40\xcb\xf8\x0a\x1c\x21\xa3\x97\xb3\x5b\xcc\xb4\xc6\x59\x4e\xe2\xc1\x2b\xfc\x1d\x3e\xda\x89\x8d\x42\xc3\xe7\xc9\x04\x4f\x1c\x5d\x03\xea\x4c\xa2\xb8\xac\x6f\x53\x71\xa6\xdc\x04\x9a\x0d\x42\xce\xac\xf8\x73\x28\x59\xb6\x3e\x9c\x3d\x83\x67\x5d\xa3\xc8\x0c\x64\x89\xab\x81\xc5\x2a\x3c\x83\x60\xc4\x6a\xac\x7c\xac\x50\xf7\xdd\xff\xbe\x50\x2c\xb3\xe9\xdb\x97\x97\x32\x28\x57\x86\x6f\x2d\x69\x0c\x01\x91\x5e\x54\xbe\xce\x76\xfa\xeb\x32\x86\x28\x90\x8f\x80\x42\x95\x0c\x8c\xfb\x7e\x9e\xe8\x8c\x65\x6a\xcb\xa0\xf6\xef\xf5\x53\x6f\x3b\x7b\x82\x11\xdf\x0c\x02\x41\xa1\x28\xc6\x37\x46\x17\xbb\x76\x05\x40\x42\x36\x78\xfb\xf8\x7d\x2e\xf0\x3b\xed\xad\x63\x3b\xf3\x5b\x5f\xfd\xb7\x72\x01\xcb\xe9\x07\xd5\x39\x41\x92\x0b\x71\x76\x2a\xf1\xbb\x90\xa0\x87\x58\x0b\x43\x98\xc7\x9d\x58\x1a\x59\xdf\x04\xda\x62\x35\x9f\x37\x37\xdf\x1f\xae\x91\x0d\xfa\x70\xfd\xfd\x79\x35\x20\xa4\x20\x06\xa3\x73\xe6\xd4\x13\x9b\xc0\xdf\x3c\xa7\xb8\x81\xd8\x48\x40\xa6\xea\x87\xc7\xfd\xc3\x28\x22\x16\x1b\x9d\x63\xd0\x52\xfb\x42\x38\xe7\x0c\x3e\x5c\x6a\xd1\xda\x08\xc4\x64\x04\x12\xc2\x0d\x1f\xe3\x2f\x57\x42\xbf\x8a\xc6\xc7\xe4\x96\xf4\xd4\xfd\x85\x69\x2c\xb8\x4d\x86\x74\xa5\xf5\xac\x3c\xfa\x04\x12\xa2\x32\xac\x3a\xb2\x08\xcd\x7b\xd0\xc5\x25\xc6\x1f\x12\xa6\xb3\xc8\x89\x5f\x58\x69\xcc\x47\xe3\xb8\xd4\x66\x3b\x54\x12\x13\x45\xe3\x51\x60\x4c\x20\x51\x82\xff\xb5\x58\x50\xb4\x41\xca\xba\x7a\xb9\x9f\x51\x84\x0c\xf7\x48\x63\x35\xad\x3e\x40\xab\xf3\x0a\xb5\x1f\x37\x8b\x51\xf1\x24\xcd\x38\x6e\xe2\xab\xfd\xdd\x78\xb3\x49\x32\x4a\x73\xe9\x75\xbf\xe5\xf9\xc5\x3e\x3d\xfb\xe4\x87\x33\x1a\xe1\xb6\x68\x29\xf3\x9b\xfa\xb4\x1a\x55\xe8\x43\x92\x25\x4e\xe8\x15\x2d\x98\xe5\x8d\x32\xc9\x84\x88\x84\x8f\x61\x9d\xac\xa3\x3f\x1f\xa4\x4c\x03\x9a\xa1\x57\xfd\xaa\xb1\x27\xf9\x0e\x9a\xb7\xcf\x40\xa7\x90\xe4\x91\x41\x2c\xd5\xea\x74\xda\xcd\xb8\x91\x21\xc9\x93\x4c\xba\x30\xa1\xc3\x4b\x05\xb0\x30\x24\x22\x4e\xac\x8f\x6b\x29\x06\x11\x8f\xb0\x14\xa1\x48\x44\x22\x22\x1b\x53\x08\xf1\x80\x5d\x10\x52\x83\x44\xd2\x44\x3b\x96\xd0\xdd\x6b\xfd\xbe\xad\x3a\x68\xde\x66\x2c\xce\x90\x28\x62\x11\xdd\x48\xbf\xd1\xb4\x36\xd5\xdd\x9f\x2a\xe3\xe4\x42\xa2\x39\x78\x1d\x99\x47\x84\x94\xbb\xfb\x70\xe2\x3b\x24\x22\x91\xbe\x52\x16\x8f\xb7\xc5\x5c\x42\xa2\x13\x4d\x64\xd8\x33\xef\x45\xbf\x2c\x94\x68\x2e\x8b\xd3\xb1\x2b\x16\x78\xfa\x79\xb9\x72\xd9\xc7\xf9\xa7\xd1\x79\x3a\x32\xc3\x2c\x5c\x79\xd1\x4e\x4e\x80\x58\x45\x33\x0c\x3a\xf4\xe7\xc1\x98\x75\x02\x12\x60\x02\x6b\x0a\x0e\xc7\xa2\xea\xac\x5f\xbb\x3c\xf0\x20\x04\x71\xf8\xce\x50\xca\x30\x7d\x76\x43\x29\xc2\x92\x64\x6f\x77\x3d\x9a\x99\xf7\x95\x18\x4e\xd1\x03\x40\xe2\x08\xe4\xa9\x84\xee\x62\xce\xa5\x24\xcf\xd1\xf4\x2b\xda\x6b\x70\xf5\xad\x17\xc1\xbe\xcb\xc0\x5f\x4a\x63\x8d\x51\xb5\xb2\x7e\x79\x6a\xea\x63\xd1\xc2\xcd\xb9\x34\x45\x59\xce\xcf\xd2\x94\x51\x42\xe3\x81\x0b\x6d\xfe\xfb\x4c\x32\xe9\x9c\x62\x2b\x87\xf2\xb9\xf8\x03\xa4\x4c\x1b\x8c\x73\x98\x89\xc8\x39\xa4\x09\xa1\x99\x97\x09\x87\x5f\x5e\x1f\xf6\x2a\x04\x01\xd3\x84\x72\xac\x97\xdf\x6f\x37\xcf\xd1\xe1\xe9\x79\xeb\xa5\x02\x21\x4d\xb8\xc1\xb0\xd4\xc1\x46\x53\x31\x7c\x3b\x66\x86\x75\xdd\x52\xce\x51\x3e\x17\xbf\xdb\xe7\x78\x9f\xa1\x04\xc7\x5f\xa7\x95\x71\x73\x76\xd0\x5c\x6b\xbf\x1e\xe3\xc9\x48\x67\x89\x75\xdc\xaf\x0b\xf5\xf3\x15\x84\x5e\x07\xa6\x3f\x48\xb3\x4c\x7a\xaa\x61\x67\x3f\x2f\x56\x38\xf8\xde\xc2\x60\xfc\xf2\xd9\xea\x8b\x37\x36\x55\x6c\x49\x49\xc4\xa7\xce\x79\x9a\x29\x83\x0e\x1a\xda\xb0\x96\x2c\xe2\x06\x60\x30\xff\xd3\x3c\x83\x2c\x1a\x1b\xc1\xfd\x3a\x1b\x65\x3e\xa6\xb7\xcb\xf3\x08\xcf\x0c\xcb\x6b\xea\xd9\x8a\x7d\x23\x70\x44\x8c\xa9\x73\xdb\xd5\x47\x68\x9e\xea\xb2\x50\x23\xc1\xa7\xd9\xa3\xc9\x24\x43\x7e\x9d\x87\xab\x05\x7e\x96\xaf\xca\x16\x20\x95\x92\x23\x82\xd3\x5b\xe6\xbf\x7f\x28\xcb\x4d\xf1\x5a\x9c\x3e\x19\x3f\x25\x09\x42\xdf\x6d\xb1\xff\x25\xf1\x28\xa4\x9a\x64\x98\xdc\x82\x63\xd1\xa1\xfe\x02\xaa\xc2\xea\xc5\xae\x54\xa0\xf3\xe1\x6a\xa6\x07\xaf\x6e\x5c\x0f\x09\x29\xb0\x18\xd1\x4d\xbd\x55\xfc\x51\x89\x63\xa1\xd6\xa2\xd1\x23\x2e\x82\x79\x94\x29\x85\x88\x20\x25\xc5\xa9\xae\xcb\x61\xc6\x85\xfb\x71\x66\x86\xc2\xab\xd2\x05\x92\x7c\xb8\x62\x3c\xef\x20\x25\x82\x7b\xf4\x1f\x56\xa5\x4e\xe2\xea\x29\xa4\x11\x71\xdc\x46\x36\x60\x82\xe5\x64\x6f\xd0\xec\x6b\xfb\x78\xfd\x2b\xbd\x7f\xe6\xf6\xa7\x86\x25\x18\x3d\x7e\x85\xa6\xde\xea\x7d\x6d\xeb\x5e\xa7\xaf\x62\x62\x2e\x86\x00\xf8\xea\x74\xb2\x61\xad\xe0\x14\x64\x24\x8a\x30\x0e\xdb\x9e\xe5\xb6\xdd\x09\xb3\x5c\x55\x09\x19\x51\x12\xfd\x2c\x8c\xd0\x7c\x5f\xe0\xd5\x74\xfd\xa8\x14\x58\x51\x7b\x6a\xc0\xf1\xbb\xe9\x21\xca\x9a\x51\x1d\x23\x00\x3d\xcc\x73\x4f\xed\x3b\x97\xb5\x84\x8c\x91\x18\xf3\xcc\x42\xeb\x0b\x42\x93\xff\x9a\xe8\xa7\xfb\x0b\x40\x89\x50\x71\x81\x8f\xf4\x58\xcd\x2c\xe3\x2c\x32\x09\x6e\x62\x0f\x85\xfa\x09\xe5\x20\x4b\xd4\xb7\x80\xe7\xbe\xbb\xff\x40\x47\xc4\x9b\xf9\x19\x97\xcc\xbd\x52\x81\x6c\xf2\x4f\xa2\x6d\xe7\x05\xe8\xae\x6b\x1c\x51\xe6\x0a\x4c\x6e\x45\x7b\x53\x37\x7f\x8a\xf3\xec\x11\xe2\x94\x22\x3a\xef\x28\x9a\x9f\xd0\x15\xd5\x8b\xc7\xfc\x87\x76\xfb\xde\x48\x64\xb4\xad\x3c\xef\x52\xef\x06\xb0\xd0\x27\x37\x6a\xe0\xbf\x19\x05\x65\x66\x1f\x2d\xa1\x89\xd5\x0d\x84\xee\xea\x5c\x96\x0b\xfc\x1b\x90\x25\xa9\xad\x47\x47\x3b\xae\xf7\x59\x75\x7d\x0d\x9b\x56\x9d\xa1\x14\x17\x11\xa4\xd9\xa5\x59\xa2\x7c\x1d\xf2\x59\x2e\xee\x55\x59\x22\x18\x12\x42\x0f\xe4\x09\x9f\x92\xa4\xcc\x52\x83\x59\x4a\x74\xe2\xa6\xe6\x37\xd1\xbe\x36\x9f\xe9\xa5\x40\x96\x66\x89\xb0\x24\xb3\x68\x8c\x8d\x6b\x4f\x7d\x0f\x6d\x69\x68\x3b\x8b\xfa\xc5\x3c\xd6\xe6\xdc\xd4\xeb\xa1\x6a\x0a\xb2\x8c\xa6\x5e\xe4\xd3\x01\x90\x27\x56\x6a\x96\xe9\x3c\x92\xfe\xac\x50\x75\xa3\xa1\xd9\x5e\xcf\x7e\x28\x8f\x2c\xc1\x68\x59\xfb\xda\x1d\x7f\xb5\x20\x31\x52\xe1\x5f\x15\xa8\x58\x32\xfc\x59\x22\x94\xbc\xbf\x40\xd7\xef\x61\x42\x8a\xd4\x66\x5e\xfa\x53\xa0\xdf\x83\x30\x2a\xb4\x90\xff\xcb\x44\xce\xa3\x3c\xc8\x5e\x8b\xf2\x82\xb2\x14\x32\x49\x35\x02\xcd\x70\x74\x16\xa5\x90\x3f\x0d\xc0\xfb\x3b\x00\x03\x3b\xc2\x88\xa1\xb4\xe6\xee\x28\x0e\x93\xa9\x88\x43\xec\x48\xfd\x50\x25\xc0\x29\x74\x5e\x52\x24\x40\xa6\x14\x43\x03\x4e\xd7\xf8\x52\xd3\x9a\x4f\xc8\x54\xef\x58\x4d\xc2\xcf\xe5\xc7\x41\xd9\x63\x20\x74\x01\x4f\x5b\xf5\xf4\xf8\x78\x67\x6b\x63\xe3\xd0\x6a\x04\x5a\xa4\x0f\x97\x7c\x0f\xe7\x39\xb9\x11\x64\x3a\x01\x24\x53\x39\x9e\xcb\xee\x63\x1f\xd2\x50\xff\x43\x09\x19\xcc\xa7\xfe\x7f\xf8\xfe\x79\x8a\x51\x96\x73\xa5\xa1\x79\x6f\x8a\x6e\x02\x6f\xca\x40\x09\x04\x54\x9f\xca\x73\x8b\x79\xe7\x45\xbc\x40\x66\x62\x99\x13\x5f\x45\x5b\x99\xe2\xe5\xb7\x05\x2a\x5b\xc8\x4c\x62\x65\x8b\x5b\xe8\x36\xfb\x6f\x97\xbb\xa4\x31\xdc\xd6\x8a\x59\x32\x6a\x68\xf6\x41\x65\x1e\x72\xc2\x33\x44\xfc\x68\x78\x83\x5f\xbe\xac\x09\x72\x9a\x27\x98\x53\x78\xa8\x7f\x9e\x6d\x8d\xf2\x02\x72\x37\xa7\x22\x41\xee\x9f\xbb\xc7\x31\xe2\x1e\x72\x46\x59\xe6\x16\x7d\xd7\x9c\xa1\x9c\x48\xef\x4d\x1e\x2e\x67\xee\x3b\xe0\xb4\x5b\xd7\x47\xaf\x90\xf5\xdb\xb8\xcc\x7a\x7a\x09\xcf\x29\x1a\xc5\x0d\xbc\x41\x75\x0e\x6f\xc2\x55\x8e\xf0\x05\xa7\xde\x5c\xd4\xd5\x3c\x53\x92\xc7\x31\x63\xce\x48\xf6\x71\x85\x3c\x56\x39\xfa\x6f\xf7\x8f\x8f\x0f\xfb\xe7\xd5\xf6\x2e\x34\x18\x8b\x3a\x38\xbc\x8a\x4a\x97\x30\x48\x1c\x5e\x83\xcd\x6e\x7f\xf2\x46\x89\xa2\x38\xef\x9e\xa0\x3e\x8d\xe4\xc8\x3e\x9d\x5c\x79\xa2\x99\x97\xfd\x74\x04\x18\xab\x97\x21\x6e\x92\x27\xfd\x26\x6a\x0f\xb9\xe7\xba\x9c\xf0\xa9\x42\x9e\x72\x6e\x4b\x8f\xf1\x9c\x75\xa7\x69\xa5\x9d\xdf\xe6\x57\x53\x9e\x26\x16\xdc\xec\x58\x71\x16\x62\x37\x79\xaa\xe5\x28\x94\x7f\x2f\x8a\x6a\xe9\xec\xce\x53\x00\xa4\x38\x2b\x6c\x30\xed\xd1\xac\xca\xd2\xd6\x49\x0e\x8a\x1d\x16\x3d\x39\xbd\x2e\x23\x11\x7a\xc2\xfd\x0a\x2a\xac\x09\x58\xe8\x70\x7e\xe6\x59\x94\xa8\x31\x81\xc4\xad\x18\x9a\x64\xee\x5d\xfa\xd5\x9b\xe8\xc4\x52\x42\x35\xcf\x13\xcb\x68\xff\x2a\xca\x6e\xbb\x79\xf4\xd7\xf6\xcb\x90\x5a\x62\x21\x68\x7a\x4f\x77\x9c\x34\xf0\x7d\x44\x84\x88\xfe\xab\xa2\xbb\x17\x55\x37\xfc\x70\xae\xa2\xdc\x86\xc8\xd0\x61\xb3\x5a\x0b\x23\x42\xe1\xd9\x77\xcf\x35\xc3\x4d\xfa\xa6\xae\x17\x54\x39\x21\xcf\x81\x21\x66\x64\x07\x25\xaa\x8a\x2e\x2b\xdd\xff\x3f\x65\x80\x73\xc9\x15\x06\x25\xd7\x0f\x93\xf5\x27\x01\xa8\xf4\x9a\x2c\x98\xff\xc6\x38\xf5\xec\xc5\x55\x9a\x62\xac\xd7\xc1\x16\x83\x0a\xd2\x97\x8e\x52\x0e\xb9\xd5\x8b\x1c\x32\x63\x6b\x51\x96\x52\x0c\x88\xc4\x79\x0c\xd1\xfb\x95\x39\xc8\x44\xb9\x23\xf8\xdc\xb4\xc5\x1b\x1c\x1a\x10\x33\x47\x36\x07\x9d\xe2\x99\x26\xcf\x4d\xf5\x39\xd3\xd7\xdf\x1c\xa6\xb1\xad\x90\x9b\x3c\x99\x14\x9f\x2c\xe5\x40\x6d\x57\x41\xe2\x08\x2c\x07\x54\xef\x89\xbd\x8d\xac\x0a\xdf\xc1\x48\x2f\xaa\xe6\xa2\x3e\x03\x2c\xc7\x1f\x88\x82\x52\x4b\x8d\x66\x23\x56\xa8\xa9\xb3\x18\x5e\x15\x94\x0b\xcc\x95\x42\xab\x06\xd6\x44\x10\x2c\x66\xf8\x14\xa6\xa8\x44\x69\x63\x35\x6d\x68\x53\x1a\x1c\x2c\xe4\xa6\x10\xee\x21\xd4\xc7\xb3\x28\xda\x79\x6c\x40\x44\x69\x62\xa5\xbb\x2d\xec\xb0\xb7\xce\x2f\x43\x9e\x2e\x8b\x13\xfd\x6b\xfc\x9f\xf8\xe1\xff\x27\xfa\x97\xbf\x91\xb2\x51\x84\x83\x35\x2a\xfb\x67\x2d\xaa\x97\xdb\x3a\xa0\xff\x45\xd4\x7b\x3e\xff\xe7\xff\xf7\x7f\x56\x2f\x4d\x81\x0a\xd6\xcf\x75\xdd\x0d\x74\xe2\x20\x7a\xeb\x3a\xb6\x39\x14\x1c\xd7\xc0\x9b\xe2\x3b\xc4\x54\xa3\x6f\xfa\xcf\xed\xf3\x3a\xfc\x2d\xb6\xac\x84\x56\x05\x0c\x9a\x9b\xc0\x18\x3d\xb1\x4b\x7c\x6f\xa5\xd1\x35\xbb\xdf\x3e\x1c\xb6\x0f\x3f\x36\xbb\xfd\xfd\xe6\x61\x8f\x30\x42\x14\x8f\x3e\x3c\x3e\x6c\x0e\x4f\x8f\xdf\x1f\xae\x7d\x36\x5b\x24\xb9\x4e\x1d\x5f\xc5\xe6\x78\x2a\xeb\x0f\xb8\xe0\x0f\x1c\x79\x95\x22\x51\x39\x12\xe4\x94\x9d\x72\x03\xee\x1a\xd2\xd8\x72\x9c\x0b\xad\xff\xbb\x96\xde\x68\x71\xb2\x7b\x9f\x4e\xe2\xa5\x53\x5d\xa4\xb9\xc2\x22\xed\xfb\xdd\xe4\x6c\x15\x59\x6e\x90\x35\xe8\x54\x9f\xfe\xef\x19\xc2\xf1\x27\xf2\x94\x90\x7c\x70\x39\x27\xd7\x88\x34\x41\x07\x0e\xac\xe2\x65\x59\x74\x23\x71\x47\x10\x22\xb3\x1e\x89\x3c\x7f\xac\xeb\x37\x03\x66\x66\x41\x08\x21\x19\xf2\x2d\xdc\x08\x59\x8f\x01\xad\x42\x98\x0c\x43\x85\x87\x6e\x4e\x8b\x8c\x45\x77\x82\xf8\x50\x6c\x27\x2c\x8a\x79\xd9\x4d\x15\x2a\x56\xc2\x72\xba\x7d\x14\xd5\xcb\x95\xb8\x30\xf8\x84\x4e\xac\x68\xf5\xa8\x48\x40\xa8\xee\x92\x17\x1a\x84\x96\x16\x00\x55\xc1\xaf\xee\x69\x04\x3d\x13\x10\xe5\x58\x1f\x71\x5b\xeb\xff\xec\xde\xc5\xa9\xff\x17\xa7\x53\x6f\x76\x94\xc5\xc8\xe3\x15\x90\x09\x74\x8a\x90\x3a\x09\xe7\xf1\x5c\x5d\xf4\x93\xbd\xee\x33\x04\x8b\xbb\xaf\x89\xb5\x25\xe5\x2b\x42\x65\x8d\x30\x69\x9c\x53\x57\xcf\xdc\x8f\xd1\x6c\xec\x4d\x9e\xa3\xad\xd8\x14\x2f\xaf\x5d\x92\xcd\x5b\x41\x31\x3a\xae\xe7\xf8\x5a\x77\x19\x24\x25\x96\x59\x1e\xf1\x3d\x13\xf8\x84\xa4\x3a\x4d\xc7\x92\xa2\xbf\xcd\xae\x04\x89\x51\x97\xa2\x6d\xcf\xfd\x47\xaa\xb5\xff\xd4\x92\x89\x08\x2b\xce\x10\xfc\x67\x25\x63\xaa\x97\xf5\xab\xa8\x2a\x28\xbf\xe2\xca\x04\xc9\x64\x2c\xdc\x82\xd9\x83\x38\xda\xd8\xe4\xf4\x83\x4a\xa6\x24\x26\x8e\xec\x1c\xfb\xf7\x59\xa0\x40\xfc\x4f\x68\xaf\x3e\xc6\xa1\xe6\xe5\x23\x52\x46\x1c\x70\x5d\xac\x4a\xc4\x62\x55\x9d\x50\xdd\x43\xbf\x15\x7f\xa5\x18\x0e\x32\x12\x02\x1f\xec\xd0\xef\xf0\x16\xd1\xfb\x28\xcb\xe2\x65\x64\x9c\x86\xbe\xfd\x96\xc5\x07\xa9\xd2\x7e\x77\x02\x71\x1c\xcc\xb0\xe5\x43\x46\xc6\xdc\x61\x85\x20\xa0\x66\x64\x9c\x66\x08\x11\x5e\x5d\xff\xd8\xee\x90\x73\x61\xf5\xfb\x86\x85\x56\x25\x94\xf0\xec\x6b\x68\x8e\xa2\x29\x7f\x69\x53\xca\x84\x5a\x82\xfb\x43\x63\x03\x96\x21\x16\xe1\xaa\x71\x16\xf3\xff\x32\x4d\x64\x6e\x29\xd9\xda\xee\x72\x2a\xca\x34\xe3\xcc\xaa\xa3\x16\xd5\xc2\xfc\x49\xb5\x44\xaa\xd7\x9b\xfa\xd7\xbe\x11\xfd\xc9\x30\xde\x84\x64\x9e\x08\xd0\xa8\xcd\x73\xae\x7e\x8e\x36\x11\x29\x98\xad\xf2\x5e\xd7\xa7\x8f\x09\x04\x5b\x8a\x1c\x34\x5b\x20\x0b\xbf\xdc\x92\xa5\x24\x1c\x21\xb2\x21\xdf\x19\x78\xb8\x7c\x07\x26\x90\x6c\xc3\x2a\xdb\x38\x5a\xd6\x7b\x0c\xb0\x7c\xf2\x7d\x24\xd3\xb8\xb9\x15\x55\xdb\x35\x67\xd5\x59\xa5\x9f\x7d\x7d\x1d\x2c\x9f\xd9\xf8\x48\x13\xa1\x8a\xc7\x15\x34\x2f\xe3\x17\x54\xcc\xae\xb9\xa2\xed\x77\x1a\x1b\xc7\x9f\x05\x1f\xa4\xe2\xb1\xc5\xe7\xf4\x3e\xac\x33\x29\x6e\x60\xc2\xa5\x0d\x52\x27\xc4\xe6\x40\x5f\x41\xfd\x74\xd8\x57\x1f\x4e\x99\x65\xb4\xa5\x56\x69\xec\xe5\xd1\x8a\x56\x15\xa7\xd2\xc2\xb3\x96\x57\x89\x51\x39\x62\x4f\xba\xaf\x28\x5c\x27\x33\xcc\x68\x81\x55\x89\xfd\x4e\xfa\x5b\xf8\x1b\x10\xe7\x66\x28\x00\x6d\x2b\xa7\xf7\x43\x40\xfb\x8b\xa4\x83\x22\x3c\x46\x0a\x39\x71\xd6\x45\xa0\x42\x04\x45\x13\x8a\x63\x1a\xa2\x81\x2e\xee\x36\x79\x7c\x45\x75\x82\x3e\xd2\x0f\xa8\x74\xed\xa8\xd7\xa6\x6f\xa8\x58\x1a\x71\x1a\x24\x1f\x4c\xf1\x32\x0d\x38\x28\x96\x2a\xee\xd6\x56\xef\x8a\x3f\xf7\xbb\xd6\x2d\x54\x64\xf6\x4b\x51\x22\x73\x47\xd1\x7c\x2c\x70\x91\x8c\x7d\x9e\x0b\x2c\xcc\xc2\x8b\x46\x02\xf0\x30\x75\xc5\x17\xc8\x8a\xf0\xe5\x16\xa6\x38\xe5\x78\x1a\x81\x2e\xba\x7b\xe8\xc4\x62\x18\xa0\x3f\x6e\x51\xbf\xf1\x58\x87\x40\xa1\x8a\xb9\x4d\x4e\xf6\x46\xc1\x9d\xcd\x77\xe3\xd3\xd2\x4f\x22\x3a\xee\xb2\x44\x70\xc5\x2f\xe4\x31\xda\x05\xc7\x4b\x25\x5a\x28\x97\x4d\xdc\x15\xff\x81\xe9\xce\xa8\xb2\x84\x89\xcc\x03\x6a\x37\x2f\x33\xd5\x4c\x50\x99\x93\xad\xdf\x37\x75\xb5\xe8\x0f\xf9\x7e\xa0\x62\xe1\x33\x9b\x55\x11\x52\x33\x4a\xb0\xc4\xd3\x4c\xfe\x31\x93\x4e\xf0\x3d\x38\x77\x01\x39\x24\x98\xf2\xec\x90\x23\xa8\xa2\x12\x3c\x43\x8b\x01\x33\x35\xd0\xae\xca\xf2\x1e\xa5\x2d\xe6\x77\x82\x38\xb1\x53\xb1\xda\xc1\x02\x73\xdd\x22\x31\x8e\xbf\xd6\x80\xb1\xbe\xe4\x54\xdf\x07\x94\xcc\x33\x44\x1a\x1a\xe4\xa7\x6b\x2d\xa2\x60\xf6\xcb\xb8\xb3\x20\x5d\x63\x7b\x91\x14\xf3\x5d\x4c\x8a\x85\x4d\x07\x53\xcc\x03\x9b\x4a\x29\x41\x61\xca\x73\xb3\x6c\x2b\xf8\xfe\x9a\xc7\xc9\x60\x4a\x16\xff\xb1\x3b\x87\x5f\xbb\xf1\x30\xa7\x93\x7f\x7d\x0d\xc9\x9d\x4d\x51\xc8\x55\x42\x1d\xd3\xdb\xb7\xba\xd4\x93\xd0\xa9\x32\x79\x82\x1c\xba\x58\x9b\xb6\xff\x76\xb8\x5a\x5f\xfb\xba\x55\x4d\x28\x58\x1b\x40\xfc\x84\xe6\xba\x68\x4f\xa3\xdd\x77\xf9\xc7\x34\x89\xd2\x3c\xf3\xa2\x1d\xbb\x4e\x2c\x53\xd2\x82\x26\x89\x03\x29\x74\xc2\x9a\xc6\x98\x52\x42\x11\xa0\xf0\xeb\x99\xd5\xff\x90\x9e\x3d\x64\xd3\xbd\xde\x00\x84\x66\x11\x79\x01\x25\x47\x6f\xb5\x08\x8f\xd1\xc4\xc4\x4c\x79\x6a\x95\xb6\xab\x8f\x16\x84\x3f\x41\x9d\x5c\x42\x4f\x34\x25\x12\x77\xfd\x70\xb4\xf9\x3d\x4b\xb3\xc8\xa0\xe9\x88\x21\xd2\x27\xf1\xe1\xab\x28\x67\x31\xa7\xf1\xbe\xad\x59\x66\xe7\x12\x12\xa6\x16\xc8\xce\x37\x80\xe7\x35\xd3\x39\x71\xae\x80\xab\xbd\x40\x5b\xc9\xb5\x46\x71\x86\x62\x12\x36\xe3\x8f\x3f\x38\x9d\x6a\x3a\xca\x68\x46\x3d\x9a\x13\xeb\x98\xc2\xb5\xda\xaa\x9a\xbf\x40\x87\x2a\x0c\x73\x0c\x9e\xe6\x84\xe0\x71\x8b\x36\xfd\x5a\xb4\xaf\xf5\xd9\x4f\x0d\xcd\x95\xdd\x01\x4f\x88\x74\xd2\xba\x2b\x51\x92\x6b\x3a\xbc\x71\x66\xa5\x89\x1a\x8c\xbb\x1f\x5e\xcf\x47\x51\x61\x84\x41\xc8\x12\x0e\x48\x88\xfc\x3a\x64\x75\x75\xec\x66\xb9\x25\x2e\xb1\x12\xea\xd6\x5f\x98\xde\x36\x61\x36\x43\x67\x7d\x5e\x74\xf3\xbf\xd6\xe3\x03\x9d\x24\x3a\xd2\xce\x2a\x77\xc0\x7c\x7f\xda\x2c\x5f\x90\x92\x04\x3d\xb0\xdd\xfa\x69\xf7\xd7\x9f\x30\x65\x0a\x8f\xde\x42\xd5\x0b\xa1\x73\x9d\x46\x14\xb1\x7f\xbd\x43\xe1\x64\x3b\x0a\x59\xc2\xf7\x4a\xbc\x89\xc2\x85\x9e\xc6\x0b\xfa\xeb\x18\x93\x4e\x63\x97\x81\x74\x54\x4f\x4f\xd0\x4c\x78\x7a\x41\x67\xc6\x60\x58\x15\xdd\xbc\x1b\x80\xd6\xe5\x28\xc3\xb7\xcf\xa5\xca\xa6\x1b\xca\xd8\x32\xd4\x82\x90\x5c\x86\xfa\x2e\xcb\xf3\x33\x7d\x06\x41\x12\x5c\x39\xae\x46\x67\x8e\x30\xd6\x22\x95\x48\x8d\xaf\x02\x2d\xc1\x98\x8b\xfe\xb0\x53\xf5\xf9\x74\xc9\x7a\x39\x7b\x51\x21\x73\x44\x22\x3b\x24\xdd\x1a\x75\xfb\x86\x97\x10\x86\xd9\xe2\x99\xae\x3e\xd9\x40\xab\x6f\x91\x3a\x4d\x5c\xf6\x78\xfd\x2a\xca\x12\x7a\x0f\xd5\xa6\x7c\x67\xcf\xa9\x92\x58\x47\x61\x8a\x2e\x9f\x58\x5a\x25\x39\xa2\xa9\x8e\xe2\xd7\x4a\xb6\xbf\x17\x95\xae\x46\x5f\x57\xe9\x84\x5a\x17\xf2\x08\x6d\xe6\xff\xaa\xa9\x75\xe1\x9d\xfa\xcc\x17\xc0\x41\xad\x73\x82\xb9\x89\x50\xd3\x36\xfd\x75\xad\x15\x11\x5e\x11\xea\x08\x55\xf7\x47\x53\x84\x50\x81\x06\x43\x90\x8c\x12\x89\x83\x9d\x7d\x37\x36\xd9\xb5\xd1\x39\x9a\x9d\x13\xfc\xc6\x67\x4e\xf3\x64\x56\x1b\xb0\x71\x58\x70\x98\xd1\x6d\x35\x4e\xbc\x01\x49\x12\x0c\x78\xb5\xed\x29\x44\x2a\x7d\x93\x4a\x50\x31\xd0\x25\xf9\xaf\x84\x0e\x99\x78\x60\x5a\xa3\x54\xf1\xcd\xd9\x8a\x5a\xbb\x3f\x47\xb9\x05\x34\x62\x1d\xb0\xa8\xaa\xba\x5b\xb9\x80\xd4\x15\x98\xba\x01\x2b\x3a\xdc\xaf\xdb\xc0\x9d\x00\x91\xe1\x68\xfa\xf9\xf2\x4c\x14\xa9\x9b\xd8\x3b\x10\x47\x14\xc3\xd0\x3b\xe8\x76\x97\x18\x6a\x88\x33\x4d\x23\x0f\x85\x3e\x37\xd5\xed\xf9\x63\x75\x0e\x28\x04\x88\x0d\xc3\xd0\x27\xaa\x47\x8f\x57\x08\x24\x3a\xb7\xfa\x29\x95\xde\x56\x45\x77\x18\xfe\x0e\x68\xb6\xbf\xd7\xcd\xcf\x99\x60\x26\x40\x4a\x01\x93\x89\x0f\x75\xd3\xd5\x15\x66\x35\x37\xcf\x6b\x46\xbe\xda\x5b\x20\xcd\x32\x4c\xe2\xb9\x10\xdf\x5d\xfd\x06\x3b\xa4\x54\x9b\xa4\xd3\x17\x4e\xfa\xe9\x5d\x84\xc4\x9f\x16\xb6\x82\xe8\xfb\xe9\x42\xb7\xf0\xd2\x30\x86\x8c\x31\x2f\xe8\xbc\x2a\xcb\x3b\x07\xd4\xb8\x00\x6b\x43\x96\xf2\xd4\x06\x22\x1e\x9b\x17\x51\x15\x2d\xf6\xdb\xfc\x2a\xba\x99\x79\x09\x59\x2e\x12\x2f\x62\xa4\x3c\xc1\x17\x40\x4e\x04\x96\xd7\xdf\x3c\x7e\x7f\xb8\xf6\x4e\x76\x68\xd4\x09\x02\x3d\x4b\xd1\x76\xfd\x8c\xf1\x54\xbb\x00\x22\xa6\x08\x27\x3e\x16\xe5\xcf\x0b\x19\x30\x00\x61\x94\xcf\x74\xa3\xa1\xdc\x7c\xf4\x53\x60\xe6\xa9\x80\x8c\x58\x64\x53\x50\xbd\x2f\xd8\x6f\x75\x48\xec\xd8\x89\xe3\xa9\xbd\xa9\x1b\xc6\xef\xeb\xaa\x7b\xbd\xb8\x4a\xb9\x3a\xcd\xd6\x7a\xac\x53\x3c\x4f\x7f\xec\x62\xa0\x59\x16\x2f\x23\x2e\x4b\xe8\xcf\x38\xeb\xf3\x16\xa7\xd7\x51\x6f\x91\xe2\x26\xa4\xad\xce\xee\x27\x14\x50\x73\x41\xae\xfe\x3a\xa9\xbc\xa4\x1a\x94\x75\x65\x65\x90\x7d\xa3\x49\x75\x36\x09\x88\xbb\x6d\x74\x74\x60\x52\x96\x85\x8f\x08\x2e\xe1\x73\x40\x96\xb5\xaf\xcf\x53\x80\x2c\x32\x0e\x44\xbd\x42\xa4\x2c\x2c\x68\xe3\x03\x80\xa4\xa8\x93\x63\x44\xdb\x6d\x5a\x25\x42\x96\x13\x0c\xb0\xc8\x91\xb1\x74\x0e\x4b\xa1\x27\xfb\x16\x18\x30\x58\x97\xea\x05\x70\xc7\xe7\xc7\x0e\x4a\xf3\x50\x57\xae\x8c\xa2\xf9\x18\x19\x4c\x86\x24\x12\xad\x96\x53\x03\x6f\x45\x7d\x6e\x4f\xa3\xf1\x37\x24\xcd\xac\x9c\x1a\x3a\x9c\x8e\xc0\x1b\x99\x6e\x0b\x75\xa9\xba\xb0\xf8\xee\x86\x46\x11\x12\x97\x98\xf2\xec\xb8\xf8\x67\xb3\xdc\x44\xa9\xad\x8e\x70\xe8\xe9\xa7\xcd\xf3\x7a\x13\x76\x2d\x13\xe5\xb1\x4b\x81\x3d\xc3\xbf\xcf\x45\x03\xa3\x68\xbc\xe1\x49\x8e\x87\xc9\xfd\xc7\x4d\x03\x48\x2e\xf3\xd7\xf9\x4a\xc3\x15\xc5\x57\xf6\x79\x94\x1f\x4f\x6b\xf2\x6b\xf1\xc9\xb8\xe1\x18\xaf\x7a\xaf\x9b\x72\x76\xa4\x9b\x58\x00\xe4\x8e\xc6\xa5\xa9\x4f\x75\x33\x02\x23\x98\x58\x47\x3e\x51\x7b\x25\x5a\xb0\x51\x9f\xd9\xf5\xc0\xb1\xa6\xb7\x3d\x4b\x1b\x28\x5e\x1e\xbe\xd8\x44\x18\x19\x38\x89\x8f\xc0\x9a\x38\xed\x91\xaa\x24\x73\x38\x81\xcd\xaf\x53\xd1\xbf\xe8\xf7\xde\x5d\x1e\x6a\x0c\x4c\xc6\x2d\x96\x66\xcc\x37\x50\x57\xe3\xe1\xf2\x1d\x53\x4e\xb9\x47\x7f\xbc\x15\x6d\x6f\x46\xa0\x8b\x33\xa6\x06\x04\x93\x41\x86\xc2\xef\x95\x43\x73\xdb\xc1\x5b\x92\x39\xec\xfb\x2a\x64\xc7\xe9\x0f\xa9\x73\xa5\xe0\x60\x2f\xfa\x1a\xdb\x38\xc7\x66\x98\x9c\xd9\xbd\x6b\xbb\x7e\x9c\x3d\xb2\x88\xa8\x24\x83\x6d\xb6\x08\xf5\x35\x22\xd3\x31\x22\x42\x01\x5a\x5f\xce\x64\x84\x64\x98\x65\xf4\x66\x68\x8b\x54\x1d\x7e\xbb\x34\x32\x8e\x52\xaf\x00\xe1\xf6\x52\xcb\x78\x34\xdb\xdc\x8c\x4c\x13\x34\x30\x2b\xf8\xd5\xdd\x21\x54\xc0\x35\x28\xa1\x31\x03\xbf\xb9\x7f\x7a\x0e\x7f\xd3\x0c\xc6\xa5\x3e\x4f\x0d\x6a\x59\xfd\xcd\xda\xd9\x6c\xec\x94\x1b\x4d\xad\x34\xf9\x2c\x3f\x37\x8b\x86\x18\x88\x39\x72\x49\x38\x2e\xde\x3f\xa0\xf0\x2c\xb1\xfe\xa1\x20\xe1\x7c\x90\x35\x16\x45\x35\x8b\x7d\x1a\x10\x56\x9e\x4d\x9e\x2f\x55\xcd\x97\x8d\xa2\xa5\xc3\xd9\x18\x0a\x58\xb3\x7c\xfd\x8f\xab\xd1\xed\x0d\x21\x0e\xbb\x73\xbf\xfd\x8a\x49\xcc\x10\x12\xe9\x38\x1f\x11\x3a\xe3\x80\xf5\x3b\xdc\x6d\x23\xaa\xce\x51\x9b\x8c\xbf\xbc\x21\xc4\xc4\x88\x77\xfa\xb6\x7a\x9c\xfc\x24\xd5\x0a\x8d\xa1\xcd\xfe\xdb\xcd\xf6\x61\xf3\xe7\xe1\x66\xb3\x09\x6d\x90\x20\x4f\x3c\x42\xa2\x27\x12\xcf\x93\xc5\x69\x08\xa3\x99\x95\x20\x41\x4e\xb6\xde\x2b\x1c\x25\x6c\xfa\x66\xc0\x88\x56\xdd\x08\x85\x5e\xc3\xe1\x45\xb4\xe5\xc0\xbe\x6b\x08\x03\x6e\x26\x39\xa6\xde\x34\xdb\xff\xf4\xcd\x91\x2b\x55\x56\xf5\xf1\x78\xae\x0a\x04\x1a\x36\x07\xdf\xca\x63\x48\x2c\xf5\xd3\xaa\x69\xc4\xb8\x36\x78\x3a\x04\x3c\xb5\xa5\x9b\x6d\xed\xbe\x6a\x50\x0d\xf3\x1d\xa4\x45\x8a\xb4\x58\x9b\x34\x22\xbb\x5a\x74\x34\x0c\x89\x89\xab\x84\x39\x4b\x5d\xf7\xd3\x65\x08\x46\x19\x12\x27\x96\x82\x76\xd7\x35\x75\xf5\xf2\xad\x2e\xf5\x7e\xb3\xdb\xfb\xd6\x04\x68\x3a\xa4\x72\xaf\xeb\xa9\x0c\xb7\xeb\x94\x46\x24\xf2\x35\x47\x0d\xe8\x50\x9c\x6e\x48\x9a\xd0\x6c\x90\xc1\xbf\x6e\xc4\x4b\xfd\x29\x03\xd8\xf2\xbf\xae\x4a\xc0\x90\x2c\xb3\xa8\x23\x2b\x7f\xbb\x6d\xff\x18\xc9\x57\x4e\x1f\x27\xcb\x35\xee\xf4\x76\x07\x30\xa8\xd4\xfd\xdb\x74\x44\x72\x29\x30\xf1\xb0\x3f\x9f\x4a\xb8\x86\x63\xed\x1f\x58\x90\xd4\x2a\xe5\xfc\x9a\x26\xfe\x42\x7b\x6e\x0b\xe9\x1b\x7b\xb6\x69\x0f\x16\x33\x45\x73\x14\xa3\x84\xb9\x21\x42\x2b\xf0\x25\x14\x47\x51\x96\x16\xdd\xb2\xb4\xdd\x19\x22\x93\x14\xfb\x1e\x84\xd6\x13\xc2\xff\xd9\xcc\x90\x29\xb1\xe1\xd5\xce\x4e\x8c\x90\x73\xb8\x70\xbb\x0c\x51\x20\xd0\x35\xf0\x67\xc8\xe5\x5e\x6f\x88\x32\x14\x21\xde\xf7\xb5\xfa\xb9\x14\xac\x5f\xcc\x2a\x1a\xa2\x73\x81\x0a\x6d\xde\xfb\x75\x98\x8f\x30\xd1\x41\xa5\x58\xa8\xe1\xc0\xeb\x56\xaf\xe7\x63\xf6\xdb\xa0\x89\x36\x01\x6c\x66\x07\x79\x81\xd8\xce\x10\x93\x32\x34\x90\x77\x27\x31\x24\x39\x0c\x25\x39\x23\xae\x48\x69\xc4\x89\x5f\x75\xd0\x18\x31\xab\x3e\x33\x94\x68\xc0\x60\x90\x12\xd5\xf7\x4f\x80\x54\x86\x12\x43\xb0\xf0\xa2\x3f\x17\xec\x89\xbb\xdf\xdf\xe3\x38\x6f\x3d\xd3\x8d\xa1\x34\xb5\x9e\x46\x1b\xf0\x98\x9f\xe8\x3e\xf9\xfe\xb9\x2d\x71\x95\xe7\xa6\x98\xcf\x54\x4a\x81\x47\xf6\x24\x7a\xc7\xc4\xb0\x86\xb2\x13\xb3\x3e\x8c\x1b\xac\x55\xc3\x6c\xe4\x7d\x31\xfc\x9e\x9f\x69\x34\xd2\x91\x8f\xb0\xed\x7f\x55\x0f\xe7\x65\x90\x89\xa1\x3c\xa5\x78\xee\xf5\xeb\x62\x83\x8b\xe2\xef\xa0\x5b\x32\x7f\x35\x30\x3d\xb6\x49\x4c\x00\x8e\x18\x1a\x33\x6d\x65\x2e\x46\x92\x8a\xbe\x89\xc7\xa9\x25\xea\x0f\xcf\x9b\x72\x62\xe3\xda\x41\xbb\x65\xa8\xe9\x34\x34\xa3\x60\xd8\x68\x8b\xfd\x5e\x15\xff\x3e\xc3\x7a\x28\xbf\x35\x34\xe3\x04\xd1\xf3\xf5\x7b\x79\xc4\x2a\xa0\x67\xf8\x77\x68\xcb\x52\xbf\xf8\x65\x09\x4d\x7b\xf8\x5e\x75\x45\x79\xf0\x74\x41\xbe\x97\x50\xb8\x51\xaf\x45\xf3\x5c\x9f\xa7\xea\xf8\x86\xe6\xd2\x48\x33\xa2\x6b\xba\x9b\x1a\xef\x86\xe6\x9a\xf0\x68\x96\xaf\x18\xa7\x9b\x5c\x37\x41\x2d\xca\xe0\xdc\x82\xd5\x69\x46\x04\xd0\x57\xae\x87\xa1\x22\xd2\x96\x44\xa8\xa9\x4f\x1b\x2c\xd1\x0d\xa3\x2c\xc0\x6a\x6f\xa3\x4e\x72\xeb\x2b\xf0\x47\xe9\xae\xe9\x26\x47\x25\x65\x56\xc9\x5f\xd5\xbb\x22\x80\x0d\x0c\x95\x46\x87\x58\x44\xef\x7a\xd8\x0c\xe5\xee\xb5\x6e\xba\xad\x5e\x95\x0d\x08\xfd\xb1\xf9\x55\xb4\xc3\x0c\xd3\xc2\x12\x34\x0f\x95\xe0\x6f\x94\x5e\x56\x82\x1b\x0a\x89\x15\xbc\xb3\xb8\x97\x49\x49\x8e\xa1\x26\xce\x31\xb0\xb9\x5d\x3f\x1e\x90\xe4\x81\x85\x96\xcc\x24\x16\x13\xfe\x06\x55\xf7\x7a\x18\xca\x09\xa7\xaf\xc4\x08\xcb\xd1\x2e\xdc\x89\xe3\xa9\x1c\x8a\x92\xff\xd2\xc6\x99\x7c\x17\x46\x8c\xd5\x4a\x70\xb9\x6a\x1f\xde\xf7\x11\x87\xbf\x58\x15\xee\x26\x2c\x49\x30\x11\x85\xca\xe9\xab\xea\x05\xca\x75\x00\x82\x2e\x2f\x40\xc6\x24\xc1\xa2\xa1\x7e\x18\x63\x72\xea\x1d\x2c\xa1\x7e\x7a\x47\xd9\xb0\x28\x26\x16\x86\x5f\x54\x57\x9d\xb2\x4e\x88\x6f\x12\x31\xe2\xfd\x8f\x36\xba\xbb\xf6\x39\x50\xc3\x38\xcb\x11\xb4\x8b\xf1\x96\x6f\xa2\xd1\x6a\xd4\xd6\x7b\x1b\x76\xb3\xba\x2d\xf4\xbd\xf8\x35\x2a\x05\x31\x2c\x26\x1c\xa5\x7c\xc2\x30\xfa\x99\xc6\xe2\x34\x4d\x5d\xec\xfc\x81\x39\x82\x4c\x64\x9e\x69\x27\xf1\x27\xc3\x92\x58\x63\xf1\xeb\x4d\x73\x56\xdd\x84\x29\xd6\xb0\x24\x61\x5e\xbd\x67\x77\x96\xff\x0b\xca\x86\x29\x96\xc9\x59\x0d\x4b\x54\x6c\x8b\xdd\xb5\xbe\x2f\x4a\x68\xbb\xba\xfa\xeb\xef\xba\x60\x74\xb2\xc4\x08\x84\xd5\x0f\x9c\x06\x58\x6e\xf4\xe1\x81\x21\x43\xda\x63\x9c\xfb\x98\x4d\x91\x14\x72\x87\x2d\x57\xf5\x5b\x20\x43\x47\x06\x25\x7b\xd8\xa1\x70\xa4\x8d\x33\x79\xb8\xd5\x67\x91\xaa\xc9\xdf\x47\x0e\x81\x61\xa9\xa1\x24\x10\x97\xfa\xc3\x7c\xd7\xfb\x05\x17\x51\x2b\x77\x45\x96\xc5\xe8\x19\x3a\x3e\xc8\x65\x46\xd8\xff\x9a\x7e\xa4\x2c\x33\xc4\x41\xf7\x9e\xce\xf2\x77\xf8\x18\x02\x89\x8c\x8c\xdd\x94\xc9\xb3\x65\x92\xe1\x26\x7b\x35\x58\x47\x2c\x83\x1c\x27\xb0\x13\xae\xb7\x41\xe9\xd9\x03\x1a\xc6\x95\xc7\x57\x1f\x1a\x68\x51\xef\xc3\x6a\x64\xa3\x70\x42\x0b\xa5\xd1\x60\x11\x0e\xfe\xbe\x79\x12\xa3\x59\xed\x8b\x9d\x77\x30\xe6\x63\xf5\x9d\x94\x66\x0e\x2e\xe4\x96\xea\x74\xa8\xbd\xa5\xc8\x24\x25\xa8\x05\x02\x55\x80\xbd\xfe\x11\x36\x14\xbf\xa7\x31\x45\x20\xf2\xd8\x6c\xe7\x16\x4f\x54\xf8\x0d\x53\x32\xb6\x7e\x58\x7d\xda\xe8\xf3\x98\x9c\xa3\x6f\x13\x48\x2d\xef\x02\x8e\xf7\x3f\x9e\x3e\xfd\x64\x4a\x4b\x6b\xce\x23\x5c\x1e\xc3\x53\x77\xf5\x3b\x34\x57\x17\x79\x07\xc3\x80\xc4\x9e\x30\x6b\xab\xea\x05\x40\xb4\x61\x90\x13\x5c\xd3\x0d\xb4\xe7\x63\x40\x9d\x4c\x56\x1e\xe4\x63\xa3\xdd\x2d\xdc\xd9\x0f\x81\x8e\xc2\x3c\x52\x1e\x6c\xe6\x1a\x0d\x8d\x73\x87\x4e\x3c\x9f\xf6\x0d\x88\xf6\xfc\x09\x5d\x98\x61\x86\x27\x8e\x9d\xe9\x0d\x44\xf9\x5c\xab\x9f\x93\xb3\x34\xa2\xcc\xd6\xce\xd9\x67\xf9\xde\x4e\xc8\x39\x7d\x9f\x34\x42\x37\xf3\xde\xc2\x71\x3e\x5c\x88\xd3\x44\x54\x46\xc2\x42\x17\x5c\x02\x73\x54\x3a\xb8\x54\xfe\x63\x22\xc6\x13\x31\x62\x39\xb5\xe5\x67\xbe\x4d\x58\xd5\x44\xeb\x8d\xa2\xc2\x8b\x2f\xe6\x5d\xc4\x27\xf5\x57\x58\x6b\x3f\x80\x41\x6e\x44\x03\x0b\x60\x6b\x13\x45\xcc\xea\x88\x3a\x3f\xa9\x68\xeb\xf7\xd9\x71\x1c\x45\xcc\x8a\xdb\xbc\xf4\x9b\xb1\xe9\x2c\xba\x61\x78\x3a\xae\x75\xec\xf6\xea\x1f\x58\x2d\xf3\x82\xd9\x6a\xbd\xaa\xb4\xe7\xc0\xfe\x2b\xdd\x54\x77\xa7\x58\x13\x0c\xde\x0f\xe5\x4d\xc1\xc0\xbe\x48\xd3\x0c\x0b\x3e\x4a\x74\x14\x39\x12\x91\x53\xdd\x8d\xc9\xec\x4d\x94\xaa\x5c\xdb\x79\x89\x75\xeb\xf3\x02\x44\x13\x65\x9c\xb0\x24\x60\xf9\xba\x73\x7b\x75\xfe\x08\xfa\x1b\x23\xb7\x24\xca\x99\xc4\x53\xa1\x1b\x73\x80\x8e\x53\xfc\x94\x0e\x30\xe0\x80\x6f\x49\xfe\xe5\x2f\x8f\x62\x0c\x6c\x28\x6b\xfc\x38\x53\x68\x3a\xe5\xf2\x38\xc5\x9c\xf0\x5a\x9c\xda\x73\xb9\x8c\x81\x36\x91\xa0\x16\xeb\x25\xca\xba\x73\x14\x93\x17\xea\xdc\xd3\x0f\x28\x58\x9a\x7b\x96\x15\xe8\x1c\x9b\xb6\x6f\xe3\x79\xe2\x4e\x4c\xab\x24\xf1\xd4\x2f\xf1\xcf\xfc\x29\x7f\x51\x9a\xa1\x1f\xd5\x88\x0e\xd0\x82\x08\x95\xfc\x26\x92\x5a\x25\x6a\xd0\x40\x58\xcd\x69\x35\x66\xb7\x52\x8c\xe2\xfc\xfb\x59\x74\x1d\x54\x7b\x51\xfa\x98\x44\xa4\x62\x1b\xa4\xde\x41\x77\xfc\x10\x0b\x27\x6f\xa4\xe2\x1c\xb7\xec\xbd\x9d\x76\xe3\xad\x24\x52\xda\xd2\x76\x04\xae\xbd\x9b\xa2\xec\xa0\x1f\xec\xdd\x7b\xd1\xa9\x57\xdf\x4f\x67\x11\xfe\xca\xc9\x32\xeb\x21\xb5\x8c\x6b\x02\x6e\xb5\xaf\xac\x62\xe4\x38\x91\x31\x1d\x5e\xd0\x06\xcd\xc3\xe7\x7a\x8c\xf9\x35\x91\xe1\x91\xc8\x3c\x08\x11\xae\x6f\xff\xd9\xd5\xd7\x2f\xff\x79\x9e\x67\xbb\x0c\x27\x4c\x23\xec\x7c\x1d\xc2\x6b\x9f\xe9\x68\x18\x4e\x84\x15\x35\xb5\x27\xd9\x13\x74\xc5\x98\xb2\x6e\xc6\x4d\x32\xa7\xb6\x36\x9c\xc6\x69\xca\x06\x04\xa6\xb3\x96\x27\xc7\x2e\xa7\xb9\xe2\xc4\xa7\x2f\xd0\x42\xb8\x17\xbf\xd6\xaf\xa2\x5f\x88\x81\xb0\xc5\x70\x16\x09\x64\x82\xb9\xde\xfe\xd8\xee\x1e\x27\xc9\x21\xc3\x59\x12\x41\x6f\xf2\xff\x9a\xbd\x6a\x44\x12\xea\xb9\x62\x5f\x0b\x97\xc3\x76\x59\x72\x2c\xec\xf2\xfd\x54\x8a\x29\x94\xfa\x34\x4a\xf1\x7f\x91\x15\x35\x9c\x73\x2d\x6d\x90\xaa\x83\xa6\x12\xe5\x75\xfd\x5c\xf7\xcb\xf8\x6b\xbc\xcd\x6c\x74\xb9\xce\x10\x76\xfc\x50\xbc\x40\x53\x88\xea\x41\x14\x8d\x18\xcf\x2b\x1e\x93\x1c\xe9\x03\x0e\x47\xd1\x41\x7f\x3a\x2f\x3e\x9d\xb3\x54\x79\xc2\x32\x2c\xe4\xd0\xd6\x52\xc7\x13\x0d\xb4\xd5\xc9\x1e\x0d\x65\x22\x18\xf4\x67\xcd\xf5\x59\xdd\xd5\xd3\x89\xcc\xd3\x2c\xb2\x21\x70\x78\x77\x98\x99\xd9\x90\xa6\x79\x8c\x0a\x3b\x3f\x8b\xea\xe5\xb6\x14\xba\x10\x5d\xdd\x60\x64\x21\xec\xd1\x3c\x85\x04\xfb\xe8\x99\x60\xb9\x6b\xce\x52\x4b\xc5\xd8\x3a\xb1\x93\xdb\xb3\x68\x74\x7f\x0c\xad\x5f\x41\xfd\x0c\x33\x9a\x67\xc2\x92\x25\x17\x55\xd1\x6d\x2b\xec\x3d\x0b\x58\xf0\x3c\x12\xe8\xf5\x3f\x95\xe2\xc3\xd4\x8d\x69\x00\xba\xf1\xeb\xe4\xa9\xb6\x24\x7d\x48\x79\x6f\x89\x9d\x3f\x3b\x16\xe6\x16\x09\x17\x09\xcf\x78\x38\x08\xd7\xe2\x34\xe7\x84\x36\x5c\x28\x89\x32\x63\x87\x0e\xc4\x71\x2f\x7e\x2d\x44\x98\xb8\xd0\xb6\x6a\xf8\xee\x71\xbf\xf9\x2a\x0c\xcc\x25\xe5\x84\x0e\xab\xc5\x86\x01\x27\x1e\x35\x97\xc2\x12\xd3\x9c\xab\xd3\x28\x18\xc0\x25\x64\x98\x87\x54\xa2\x2c\x17\xcb\x9b\x0d\x57\x24\xc5\xd3\x6e\x62\x43\x63\x34\x05\x05\x1e\xc4\xd1\x4b\xfc\x7f\x36\x1a\x2a\xb3\xa2\xa5\xed\x6b\xfd\x7e\x38\x5a\x8e\x89\x83\x18\x21\xc5\x0c\xd7\xcc\xa0\xaf\x67\x39\x51\x2b\x50\xdd\x0c\x64\x3d\xc6\x06\x1b\xae\xf3\x14\xcd\xd9\xfd\xe3\x7e\x75\x77\xd8\x6f\x56\xf7\x87\xfd\xe3\xef\x9b\x87\x5d\xb8\x9f\x66\x49\x36\x0c\xc8\x42\x6d\xc9\xf0\x78\x10\x5b\x62\xa5\xfe\xd4\xa1\xfe\x06\x90\x68\x3c\x6e\x1c\x77\x66\xff\xb4\xb3\x5d\x9d\x43\x1e\xeb\x74\xc2\x30\x67\xd1\xd3\x17\xfd\x64\x8a\x1f\xc7\xe6\xdf\xbf\xf7\xd3\xbd\xfc\x18\xb1\xca\x4f\x9f\xc6\x10\x1b\xce\x51\xa2\xd2\x08\x4a\xc0\x70\x80\x35\xa0\xbf\x05\xb0\x53\xdf\x2f\x45\xca\xed\x0a\xde\x51\x01\xa1\x7d\x2d\x4e\xdf\xed\x51\xe6\x8c\xf7\x51\xf6\x68\x74\xfb\x88\xa4\xb1\x2f\x4d\xac\xe0\x1d\xcf\x91\x85\xa9\x67\x62\x82\xf8\xac\xcd\x5b\xf7\xbd\x2a\xc7\xc4\x7c\x93\xfb\xc5\x24\x8a\x70\x19\x4d\x26\xc7\x93\x28\x66\x92\xdd\x17\xe0\x00\x13\xd3\x84\x50\x77\xea\x78\x68\xcd\x64\xdc\x62\x9a\x72\x8c\x5f\xfa\x9c\x1a\xb2\xdb\xcf\x54\x88\x4d\xcc\x58\x86\x52\x7a\xa6\x30\x45\xfb\x1a\x14\x8f\x4d\xcc\x54\x82\x34\x2e\x56\xf2\x09\x9a\xa0\x82\x68\x62\x06\xb1\xaf\x7e\x47\xe4\xe6\x52\xb1\xae\x89\x39\xd5\x0e\x39\xd7\x54\x5f\xa0\x2b\xfb\x8e\xc6\xa8\x51\x48\xdb\x57\x34\x7d\x13\x6f\x6f\xc3\x0a\x8c\x79\xae\xb3\x89\xaa\x3e\x5c\x7d\x58\x04\xfa\x27\x63\x1b\xcb\x0c\xcb\x15\x3d\x89\xef\x34\x97\x35\xf5\x41\xe3\x94\x59\x8a\xc0\xe2\x42\x63\xe2\xab\xaa\x24\x13\xa7\x31\x51\xb3\xea\x3f\x54\x24\xf1\xcd\x89\xc0\x95\x76\x5b\xd7\xfa\x5a\x4c\xd0\xfc\x26\x4e\x73\x83\xa6\xe6\xc0\x3a\x1f\x02\x65\x5f\xd8\xc1\x71\x96\xa6\x08\x39\x02\x35\xca\x9e\xf9\x36\x61\x03\x7f\x0a\x6a\x1c\xc6\x89\x32\xae\x89\x33\x93\x61\x45\xc2\x5b\xdd\xc1\xf3\xb9\x1c\xd1\x77\xce\x0f\xca\x30\xcf\x72\x42\x12\x36\x22\x41\xb7\xd5\x2c\x75\x85\x5f\x7c\xbc\x8b\xc6\xb9\xa4\x42\xfa\x19\xb3\x3d\x9e\xca\x65\x6b\xc5\xf7\x06\x6e\x29\x1b\x8a\xaa\x37\xd5\x8b\x37\xb8\xab\x5f\x02\x84\xc3\xc4\x82\x48\xed\x20\x83\xe6\xda\xbb\xe3\xd3\x89\x23\x72\x60\xee\xd1\x56\x0e\x8b\xb7\x2f\xba\xae\x18\x66\xb7\x90\xcc\xd8\x4a\x62\xd0\x07\xf0\xc0\x22\x13\xf7\xc6\x55\xff\xf7\xbb\xed\xf3\xea\x4f\xff\x47\x99\x5a\x16\xc2\x13\x96\x18\xec\xdf\xeb\xd0\xe0\x2a\xa2\x8f\xe2\x27\xac\xd6\xe2\x12\x9e\xee\xfa\xa9\x44\x60\x4e\xd9\xf1\x00\x85\x64\x94\x6f\x96\x5a\x0e\x42\xd7\x7f\x40\x11\x1a\x34\x89\x6d\xfc\xc3\x16\x29\x3b\xf7\xca\x37\x6b\xc2\x88\x0f\xe6\xba\xc1\xff\x03\x8a\x75\x1d\x02\x01\xb1\x66\x12\xe9\x77\x83\x03\x66\x31\xe1\x9f\x14\x19\x99\x58\x67\x04\x91\x9e\xea\xdc\x34\x23\x15\x41\x13\x03\x4b\x32\x5f\x19\x5f\xa8\x6e\x6b\x53\xe0\x9f\xdc\x05\x22\x40\xa3\xc7\x71\x9d\x0e\xb3\x77\xa6\x6e\xed\xbb\x0b\xe2\xcb\xb6\xef\x6a\xd4\x8d\x18\x9f\x7a\xb3\x7b\x9b\x98\xd1\xd4\x01\x46\x57\x83\xf1\x65\x5b\x13\x42\x73\xb4\x95\xf6\x41\x6c\xf6\x37\xdf\x92\x28\xbb\x97\x60\x68\x65\x75\xee\x6a\x17\xaa\xf1\xed\x60\xb0\x54\xfe\xdb\xea\xe1\xfa\xce\x5b\xb1\x09\x8d\x59\xca\x1c\x65\x62\xbf\x05\x7e\x52\xbb\xe6\x7b\x6b\xab\x25\xe0\xc2\x37\x6e\xd3\x1e\x3e\x58\xc2\x14\xc9\x46\x85\xf7\x9f\x55\x3b\x4e\xdf\x29\x8a\x2d\x68\x05\xba\xd7\x8b\xac\xd9\xf2\x15\x5c\xa4\xc2\xd6\xe4\xbe\xd9\xc2\x18\x15\x8a\xe4\x4d\xc2\x65\x44\x3d\x31\xfd\xee\x0b\x97\x7c\xf6\x6e\x31\x95\x76\x0d\x3f\x7e\x7f\x7e\x58\x61\x99\xe8\x26\x94\x85\x9a\x24\xee\x2d\x87\x60\x98\x6d\x2a\x5d\x37\x2d\x62\x22\xe7\xf6\xb7\xeb\x9f\x46\x09\xd6\x90\x3c\x89\x8f\x1f\xa2\x6c\xf7\xf5\xdd\x08\xb0\x7f\x79\xa8\x25\xa9\xc8\x7d\xf5\xc2\xa3\x31\x58\x67\xe8\xac\xa9\xb0\xa6\x93\x2c\x92\x89\x45\xbb\xed\xba\xfa\x74\x0a\x41\xe1\x24\xe3\x39\x48\x57\x14\x00\xfa\xbe\xae\x6e\xea\xe6\xde\x25\x1d\x12\xee\x3b\x25\x14\x63\x2c\x06\xd5\x0d\x56\x63\x01\x4e\x93\xe4\x24\xb2\x65\xc7\xf8\x65\x9d\x02\xf7\xb0\x82\x93\x3c\x75\x29\xd3\xfe\xd4\xbb\x2a\xe7\xa5\xf3\x26\xc9\xa5\x40\x9e\x53\x85\x50\xd9\xcd\xdb\x5c\xaa\xc8\x24\x82\x29\xcc\xdf\x0e\x64\x3e\x75\x11\x40\x9d\x26\x11\x89\x13\x18\x6e\x0a\xf9\xd9\xf2\x4d\x64\x14\x61\x35\xca\x69\x41\x59\x72\xde\x35\x36\x1a\x46\xc5\x1e\xbf\x2d\x94\x2e\x99\x44\x26\x06\x71\x05\x9e\xdf\xdc\xfd\x59\x11\xcb\xd2\xdf\x9e\x4f\xd0\xdc\x7f\x81\x5f\x0d\xfd\x15\x9a\x0c\x45\xeb\x67\xf0\x43\x6d\x21\x44\x9f\xbe\x8a\x8a\x62\x4c\x01\xf5\xdf\x0c\xe5\x6d\x67\xc3\xa5\xb8\xf0\x85\xfb\x58\x42\x78\xd1\xac\x90\x88\xd0\xe7\x63\xe6\x7c\x0f\x1f\xe1\x55\x52\x8a\x55\xd6\xa0\x5f\xe0\xa9\x78\xe9\xa7\xec\x73\x68\xcb\x63\x3c\x24\x0a\x27\xd2\xe0\xea\x82\xfc\xd1\x39\xfd\x45\x9d\x31\xdc\x3a\x1d\xe6\xb5\x6e\x42\xd9\x83\x49\xb4\xce\xad\x88\xf6\xb9\xec\x8a\xb6\x78\x39\xd4\x83\x44\x46\xdf\x2a\xf1\x78\x71\x94\x5b\x0b\x00\x9d\xd1\x4c\x04\x61\xeb\x84\xee\xb7\x0f\x87\xbb\xcd\xea\x7a\xf3\x7c\xb8\x79\x5e\xad\x0f\xfb\xc7\x27\x7f\x3f\x50\x29\x7a\x24\x45\x07\xc7\x1f\x75\x07\xdf\x4f\xcb\x7b\x69\x62\x52\xd0\x83\xa2\xd3\xa6\x7b\xbd\x0c\x4d\x24\x46\x24\xae\x90\xa1\xad\xcb\xb7\x61\x4d\x19\x63\x2c\x60\x0f\xab\xf0\x3e\xd4\x0c\x2c\x66\x52\xa2\x98\x74\x00\x2f\x57\x81\x79\xf5\xb1\x9d\x45\x8d\x53\x46\x72\xc6\x26\xbc\x2d\x7f\x0b\x5a\x31\x5c\x1f\xa9\xc4\xb9\x37\x96\x43\xe8\x73\x7e\x51\x93\x46\x91\xad\x9a\xe9\xf7\x90\x0a\x6e\x9a\x59\x49\x86\x49\x31\x16\x88\xc2\x5d\xa2\xdc\x7a\x50\xb7\x7b\xe1\x94\x8b\x48\x5a\xe4\xd0\x03\xaa\x54\xff\xd8\xec\x90\xeb\xfd\x69\xf3\xbc\x7d\xbc\x1e\x7a\x65\x28\x4c\x83\x39\xef\x4d\xf7\xea\xb2\xb7\x2e\xc1\x16\x86\x2f\xe5\x06\x30\x1b\x72\xbd\xdb\x37\x67\xb8\x71\xbc\x10\xfb\x21\x86\x9f\xc6\x54\x20\xc6\x5e\x68\xbd\xff\xb5\xaf\x7d\x14\x39\x20\xba\xbf\x5c\x71\x69\xcc\xac\xca\xfc\x40\xdf\x05\xed\x0e\xc2\xcd\x13\x23\x2d\xb0\xf5\xb5\x3e\x89\x9f\x03\x73\x97\x49\x53\x19\xe3\x52\xad\xe0\xfd\xba\x56\xe7\x61\x0b\xf7\xed\x40\x71\xa7\xc3\x14\x6c\x98\xe1\x69\x2e\x88\x70\x2a\x0a\xb7\xe3\x92\xe1\xcf\xfe\x5d\x9c\x90\xa9\x20\x2c\x75\x34\x3e\x0f\xb3\x99\x22\x40\x78\xa8\xc0\x7a\xb3\xe7\x61\x2e\xf9\x13\x25\x95\x0c\x84\x7f\xb0\x7e\x4b\x9a\x14\xd5\x98\x54\xc6\x1c\x29\x3c\xae\xe1\xcd\xa6\xd3\xee\x11\x7b\xe6\x82\xc5\xd3\xdf\x92\x89\x0d\x21\xb8\x10\x5b\xa0\xb3\xf9\x5e\x15\x5e\x75\xcb\xa4\x8a\x33\xe1\x92\x3a\xff\x5d\xcb\xcf\x2c\x83\xff\x5a\xb4\x74\x2f\x19\xc0\x5d\xe0\x38\x14\x89\x8d\xf2\x7b\xfe\x0c\x4c\x95\x48\x90\x8e\xf4\xe6\xfe\x8f\x3b\xff\x14\x3a\x8e\x92\xc1\xd4\xda\x09\x03\xdd\x87\x55\x5d\x9f\xbe\x92\x4e\xad\xe8\x79\xb3\x83\x6e\x33\x9b\xf6\x5a\x58\xc2\x99\x10\x29\x9d\x49\x28\x9b\x14\x18\xc5\x72\x66\x64\x0f\xbc\x2d\x4c\x98\x47\x20\x2c\xdd\x56\xef\xf5\xd6\xb2\x9e\xd9\xe1\x29\x48\x82\x1b\xa8\x39\x57\xea\xe0\x43\x00\xa9\x61\x80\x1c\x15\xc8\x06\xff\xe9\xc0\xfd\xad\x84\x78\x6a\xb8\xa1\x0e\x92\xfa\xbd\x05\xcf\x1b\xe8\x77\xe8\x59\xdf\x44\x23\x3f\x80\xd3\x96\x99\x96\x94\xfd\x9d\x0a\x1f\x93\x9a\x4c\x32\xb7\xa9\x0d\x04\x89\x41\xd7\x73\xd6\x37\x37\x58\x7b\x24\xba\x4e\xa8\x57\x64\xfc\x9f\x79\xe2\x19\xa1\x11\xee\x48\xfd\x9c\x3d\x74\xaf\x0d\x80\x9b\xb5\x9b\x7f\x4f\xbf\x40\x46\xa8\xad\x5f\x3b\x35\xf5\xaf\x8f\x15\x02\xc9\x26\x23\x37\x86\x6b\x9a\x8c\x30\xc6\x9c\xb6\x06\x3e\x99\x65\x0d\x9c\x3c\x5e\x46\x98\xc2\x7c\x53\x8b\xf8\x0e\xcb\x5c\x3c\x8e\x35\x7c\x16\x75\xca\x48\x92\x22\xf4\xea\x54\x63\x1d\xeb\x12\x61\xb9\xc9\x48\x4a\x6d\xf1\x2f\xb6\x2e\x69\x56\xf8\x69\x9d\x11\x91\x31\x77\x92\xcb\xf3\xc7\x08\x95\x6f\x32\xa2\x65\x92\x07\xd2\x0c\xcb\x93\x1d\xf4\xed\x4d\x46\xa9\x44\x70\x87\x5d\xa7\x21\x55\x34\xb1\x34\x33\xca\x12\x4c\x55\xdc\xfa\xfc\xce\xec\x49\x69\xca\x51\xd4\x08\x83\x94\xbb\xa3\x68\x3a\x35\x45\xce\x65\x14\xb8\x9c\xaa\x09\x88\x7c\x01\x42\x92\x31\x92\xc4\x72\x5a\x47\xfe\x03\xaa\x4f\x0c\x9c\x8c\x01\xc3\xf8\xc0\xd3\xf7\xab\xbb\xed\xfa\xf0\xbc\xd9\x3d\xde\xfd\xd8\x3c\x1f\x1e\x1e\xaf\xbd\xfb\x91\x45\x89\x56\x4e\x0e\x62\xd5\xfa\x19\xb1\x98\xf0\xcb\x22\xa1\x8c\xdb\xf0\x0f\x6a\x79\x24\x38\x4d\x30\x07\xae\x6b\x1f\xcf\x9a\xde\x22\x96\xe0\x38\x0d\x4a\x65\xbf\xea\xd7\xd5\x7b\x26\x8b\x4d\x8e\xc1\x7c\x63\x83\xcd\x33\xc8\x61\x96\x30\x2b\xec\xda\x20\xd2\xb7\x5f\x9f\x96\x20\x6d\x69\x75\x66\xa9\xb1\xca\x04\x58\xb1\xef\xf3\xd9\x9f\x9f\xe6\x59\x16\x69\x7c\x1b\x9f\x2b\xdc\xfc\xb2\x61\xff\x09\xef\x41\x98\x64\x59\x6a\x90\xa4\x42\x9e\x3f\xa6\x65\xf1\xd3\x60\xde\xec\xfd\x72\x49\xf2\xa1\x98\xee\x60\x60\x99\x14\xc0\x64\x82\x70\xcf\x75\xe8\x6a\x3a\xfa\xb7\x7d\x6a\xea\x63\x3d\x92\x8f\x32\x99\xe0\x0a\xcb\x9a\x7c\x0d\xc4\xae\x12\x45\xf9\x14\xd0\x5d\x99\xc8\x99\x74\x19\xf7\x63\xff\x01\x9a\xf3\x98\xb6\x63\x30\x03\x33\x01\x96\xe6\xfa\xd6\xee\x7b\xd6\x96\x9e\x8d\xa8\x30\x1c\x23\x99\xe2\x08\x95\x06\x3d\x0b\xf3\x4d\x5f\x40\x12\x1b\xb5\x7f\x81\xce\x62\xd3\xaf\xbc\x85\x9c\x29\x16\x23\x21\x33\x74\xaf\x63\x7f\xd1\xb7\xa6\x96\x8c\xe0\x60\x17\xe1\x5d\xa1\xa0\x6a\x3f\x87\x63\x2e\xee\xe2\x99\x32\x12\x6f\x52\x16\x06\x5c\x8c\x63\x67\x69\x89\x5d\x07\x9d\xc7\x89\x2b\xb6\x2d\xe6\x60\xb5\xbe\x11\x7d\xab\x83\x46\xa9\x9b\x79\xab\xc9\x2d\x90\xd7\xfb\x55\xf7\x1f\x4b\x87\x7e\x06\x84\xe5\xb6\xfc\xa1\x69\x9d\x3e\xcb\xac\x87\x21\x29\x96\x2c\xec\x8a\xe3\xa9\x84\xbb\xc2\xf8\x7d\x2a\x27\x24\x47\x33\xf4\x28\xaa\xb3\x28\x9f\x85\x31\x21\x89\x98\x53\x2e\xc0\xa1\x45\x03\xf0\x77\x4e\xda\x39\x7c\xd8\x9c\x45\x06\x53\xb5\x0f\xdb\x7f\x6e\x6f\xbd\xde\x96\xc9\x99\x53\xb6\x7e\xc1\x54\xe4\x75\x53\x9f\xda\x27\x68\xf6\xbf\x7c\x7b\x14\x47\x18\xe8\x39\x14\xad\x05\xec\xdd\x94\x62\xaa\xc0\x63\x72\x9e\x13\xf4\xb9\xa5\xa8\x7e\xfe\x10\xe5\x84\x29\xd5\xe4\xb1\x22\x98\x29\xe8\x8a\x23\x48\xac\xb6\x82\xcf\xf5\xc9\xdc\x35\x09\xcb\xc0\x45\x6e\x1e\x4b\x3d\x86\xaa\x7c\xea\xc9\xe7\x49\x42\xec\x74\x72\x41\xdd\x76\x24\x17\x68\xf2\xc4\x44\x48\x20\xdd\xd5\xdb\x60\x7a\xe7\xa9\xa4\xa8\xa0\xd4\x6f\xe1\xe7\xf6\x14\xca\x09\x4c\x9e\xea\x1c\x23\xb9\x3f\x56\x77\xdb\xeb\x20\x8e\x69\xf2\x8c\xc9\x94\x87\x93\xc1\x45\xab\xfa\x13\xdb\x06\x70\x97\xe2\x8e\x79\xce\x99\x31\xc1\x45\x0f\xa6\x7a\x9e\x73\xab\x95\x74\xf5\xb1\x7f\x05\x47\x55\x38\x99\x62\x79\x2e\x28\x9e\x60\xad\x28\x61\x53\xe9\x91\x1a\xb8\xc9\x73\x23\xb0\xca\x13\xf1\xd1\xf8\x18\x53\xe6\x9e\xd9\x43\x88\x28\xc3\xfa\xdf\xc7\x3f\x1e\x36\xcf\xbb\xc3\xea\xee\xee\x71\xbd\xda\x6f\xae\xa7\x69\x98\x5c\x18\x8e\x68\x9b\xd5\xef\x7c\x1c\xe5\xca\x25\x8b\x89\xdb\x87\x82\xf5\x3e\xfd\x01\x99\x19\x3d\x6c\x69\x8e\x12\x79\xd0\xe2\x98\x9b\x43\xa3\x99\xa9\x52\x5b\x3a\x77\x6a\x7a\x87\x7f\x71\x3e\x28\xa9\x11\x75\xe2\x91\xfa\x16\xc1\x34\x62\x69\x36\xb9\x82\xd8\x1b\x6c\xcf\x60\xa6\x56\x4e\xae\x89\x2d\x89\xbd\x11\x0d\x86\x78\x26\xef\xa6\xf3\x18\xf4\x17\xa5\x6d\x9f\xcc\x51\x20\x80\x7e\xdb\xe1\xc5\xeb\xb8\x60\xdd\xe0\xf2\x46\x9e\x03\x8b\xb0\x76\xf6\x58\xbc\xd8\x08\x4f\x08\x98\xfa\x0e\x11\xcf\xad\x0a\x1c\x26\xc0\x1c\x1e\xe0\x2f\x1e\x21\x26\x18\x8c\xb8\x2b\xba\xc9\x1b\x41\x2e\xbc\x0a\x81\x27\xd4\xb8\xe4\x14\xee\xbb\x69\xc3\x42\x6c\x6d\x5b\x0d\xd8\x9f\xe9\x34\x34\xb1\x4c\x06\xb8\x01\x9e\x2f\xdb\xeb\xf0\x9e\x93\x5b\x9a\x34\xc5\xed\xe2\xaa\xe8\xd6\x4d\xff\xd3\xde\x38\x17\x94\x00\xce\x20\x57\x98\x39\x45\x1f\x0b\xca\x23\xac\xdf\x1e\x29\x40\xf6\xdf\xd9\x56\xf0\xfa\x3e\xb9\xad\x82\xef\x1d\x7f\xa4\xbb\x9c\x2b\x8f\xf4\x5d\x32\x32\x10\x05\xec\x6d\x20\x76\xb0\x62\xa9\x55\xd2\xfc\x2f\x4b\xbf\x32\x4c\x41\xc1\x68\x86\x1b\x41\x6f\x89\x8d\x72\x76\x82\x69\x5b\x09\xf2\xe2\xf8\xb8\xd8\x80\x32\x15\xcc\x40\xea\x49\x31\x51\x8e\xc6\x92\xc1\x0f\x39\x52\xc1\x89\xc9\xf9\x44\xb1\x75\x6e\xa3\x0a\x9e\x64\x58\xf3\x88\x8f\xe7\x49\x97\xc7\x7e\xb1\xe0\xa0\xc9\x10\x4b\x99\x92\x2f\x4d\x5f\x9e\x1b\x86\xe5\x78\x6f\x23\x94\xac\x88\x39\xe8\xcc\x73\xea\x94\xb0\xff\x38\xc1\xaa\x1b\x13\xd0\xd0\xb1\xa5\x42\xfd\xbd\xe2\x4c\xa2\xfb\x17\x4e\x96\x11\x7c\x45\x24\x84\x12\x77\xf2\xdc\xf6\x6b\xb0\xf9\xd8\x15\xbf\x2e\x35\x51\x8d\x48\x68\x2c\x6d\xb9\x6e\x35\x1a\xb8\x84\xdb\x90\x2e\xb2\x20\xae\xb4\xb6\x62\x09\xbe\x31\xcb\x1c\x83\x84\xe5\xb7\x08\xf6\xfd\x18\xa7\x2b\x92\xdc\x08\xaf\x21\x3d\x06\x01\x88\x2c\xe6\x18\xa2\xda\xde\x6f\xfe\xdc\x4f\x1a\x44\x2a\xe7\xf9\x65\xab\x4d\x38\xa2\xc1\x77\x7d\x73\x4a\x05\x04\xb9\x4d\xcf\xee\xee\x1b\x8d\x32\x23\x1f\x1e\x27\xa2\x6f\x13\x60\xa5\x65\xaf\xce\x4d\x75\xb3\x5b\x2d\xe8\x6b\x18\x21\x8c\x55\x61\x98\x70\x0a\x1a\x21\x33\x83\x43\xb5\x11\xdd\xf4\xef\x2e\x7f\xa6\xe1\x0d\xca\xfa\x84\x6c\xd7\x67\x5d\x74\x68\x02\x62\x56\x0c\x7f\x64\x1a\x8b\x17\x2a\xb1\x30\xaa\x93\xf8\x78\x34\x26\xfc\x55\xc7\x0e\x27\x69\x31\xa5\x57\x45\x59\x5e\x44\xfc\xff\x96\xbf\x2a\x94\x36\x56\x72\x45\x74\x03\x5d\xa6\x11\x9a\x66\x11\x9f\xc8\x34\x4c\x16\x84\xce\x05\x56\x0e\xfe\xdb\xeb\x61\xfa\xbf\x4b\x8d\x54\x9e\x47\xb7\x33\x4f\x15\x6b\x8d\xd0\x2a\xb2\xdc\x12\xd6\x04\x3e\x9c\xca\xba\x3b\x8c\xca\x7c\x8d\x00\x9a\xe3\xc8\xf7\x46\x46\x55\xbf\x87\x3f\x6b\x1e\x39\x0c\xde\x9f\xfb\x1f\x96\xa9\xc3\x46\x9c\x9d\xcb\x36\xda\x03\x4c\x4c\xb1\x10\xf7\xad\x3e\xab\x29\xa9\x80\x11\xc6\xe4\x76\x3c\xdd\x83\xcd\xe0\x09\x97\x87\x9a\x24\xd2\x52\xd1\x5a\x0a\x8b\x67\x07\x5b\x7c\xf6\x33\xca\x3d\xa0\xa4\x99\x40\x09\xa9\xde\xb3\x12\xbd\x05\xba\xe0\x91\x48\x2a\x24\x22\x5b\x0e\x2e\x18\xd1\x9f\x0d\x75\xd3\x39\x92\xbb\x6d\xb5\xaf\xcf\x4d\x25\x26\x19\xe4\xc9\xd7\x92\xd4\x80\xc5\x2a\xba\xdc\xb9\x47\xf5\x8d\x7d\x62\xc9\x22\x8a\x00\x8a\xfe\x9e\xd3\x7c\xa0\x64\x51\x86\xc7\xaf\xb1\x6c\xa3\x63\xc2\x74\x23\x59\x28\xff\x11\xe1\xb5\x22\x96\x58\xfe\xcf\xd5\x9f\x87\xcd\xfe\xdb\xe6\xf9\xb0\x7e\x7c\xd8\x3f\x87\xe6\xdc\xa2\x82\x2c\xdb\xc8\x5f\x09\xf0\x1a\x19\x49\x50\x6c\xc2\x05\x3b\x42\x74\xc9\x08\x94\x23\xde\xb0\x59\x77\xc7\x69\xd4\x5e\x7d\x78\x75\xb7\xe9\xfa\x96\x3c\x53\x88\xee\x5b\xad\x56\x23\x54\x9d\x8c\xa9\x40\x88\xbf\xa5\x81\xea\x8f\x74\xd3\x8f\x70\xdb\xcd\x8a\x0d\x65\x9c\x65\xd4\x85\x0c\xef\x8b\xea\x56\xb4\x93\x71\x8c\x15\x55\x72\x2c\x15\x35\xdd\x00\x64\xc2\x01\xa3\xf2\x2f\xe2\x08\xdb\xca\xab\x94\xfa\xab\x93\x38\x46\x3b\x75\xfd\x64\x75\x9c\x3c\x32\xcb\x35\x67\x32\xb1\x44\x44\xc6\x14\x65\xd1\x1b\x5a\x21\x59\x35\xfd\x95\x9c\x49\x4a\xdc\xaf\x3c\x48\xbf\x43\xc9\x3c\xcd\xe2\x34\x30\x24\x9c\xea\xea\xfe\x5c\xda\x62\x34\xdf\x43\xc6\x11\xfa\x09\xad\x7a\x05\x7d\x2e\x61\x92\x7d\x9e\xb0\xba\x8d\x23\x43\x52\x66\x06\xbd\x9c\xde\x4e\xdf\x43\xd3\xa1\x5c\xfe\x92\xf8\x93\x91\x8a\x59\x2e\xac\x93\xd5\x4c\xd8\xdf\xfd\xe3\x34\x06\x7b\x48\x95\x44\x3c\xf6\x59\xfd\x43\xa8\xe6\xf5\xcd\x9a\x5b\xa3\xc7\x09\x90\x5d\x37\xe2\x3d\x34\x09\x86\x05\x7e\xeb\x57\xd1\x14\xdd\xc7\x78\x23\x95\x46\x83\x63\xe0\x05\xf5\xf3\xfe\x63\xf5\x32\x4a\x65\xf9\x2e\x46\x79\x7e\xa4\x7e\x11\x5c\xcd\x9e\xdb\x18\x85\x0e\x97\x2c\x74\x3b\xde\xd6\x14\x61\x11\x8a\xb3\x74\x8d\x28\x2a\xba\xbc\x06\x15\x8d\x0d\xf5\x26\xec\xf8\xc1\x14\x63\x2a\x76\x85\xc9\x4e\x45\x62\xa1\x90\xdf\xa8\x08\x62\x7c\x37\xc7\xf8\xeb\xaf\xe6\x5c\x78\xc7\xde\x46\xf2\x27\x29\xc0\x25\xbc\xe6\xec\xb9\x78\x9e\x4b\x84\xa1\xbc\xd6\x47\xf8\x09\x1f\xe1\xc6\x4a\xa0\x58\x03\x32\xc7\xef\x5f\x1b\x00\x1b\x70\x98\x5d\x0d\x19\x6e\x1a\xcf\x67\x5d\x88\xca\x49\xce\xf9\x5b\xc4\x9e\x35\xeb\xc5\xe3\x75\x7c\x03\x8b\x10\x02\x84\xe1\x49\x53\x9f\x9b\x10\x9d\xfc\x5e\x0c\xc3\x1a\xcb\xc4\x4b\x97\x1d\x7a\x0f\xe8\x20\x1a\x59\x74\xed\xe1\x04\xcd\x01\x50\xa2\x72\xfa\x2c\x31\x58\xad\xc1\x43\x7d\x82\x6a\xa8\x75\x9f\xe1\xf0\x5c\xe7\x44\xe4\xa9\x70\xe9\xfe\x87\x70\x60\xa8\x44\x2a\x34\xd9\x4e\xe2\xe3\x7a\xf5\x18\xfe\xaa\xd3\x58\x8c\xcb\xf3\xf6\x41\x9f\xc2\x77\x49\x21\xc2\x13\xe2\xad\x2e\xcf\x47\x34\xb3\x7c\x7d\xa4\xca\x18\x05\x08\x46\xa4\xfa\xf9\x5a\x97\x36\xa6\x15\x2a\x64\xd7\x97\xc6\xb9\xca\x12\x1d\x39\x74\x66\x10\x98\x74\xf6\xda\x97\x4e\x81\xca\x24\x61\x3e\x5f\xd1\xcf\xa6\x6f\xc2\xf1\xc4\x07\x20\x4d\x78\x30\x25\x50\x03\xfa\xbf\x61\x26\xf3\xde\x37\xd9\x32\xf7\xf7\x01\xc2\xa2\x72\x62\x4b\xa7\x84\xdf\x72\xe8\xec\x91\xf3\x4c\x5a\xf0\x76\x2d\xeb\xee\x82\x1d\xcc\x28\xc9\x28\x26\x87\x40\xd5\x6e\x16\x8f\xe9\x5b\x8c\x52\x90\x78\xc4\xfc\x35\x9c\x1a\x98\xe6\x2c\x17\x4e\x46\xa5\x49\x62\x44\x58\xd4\x45\x55\x1c\x45\x39\x70\x61\x1b\xa5\x35\xd3\x63\xdc\x7f\x37\x21\xf6\x9a\x2e\x30\xa0\x32\x73\x29\xbf\x15\xde\x68\x6c\x71\x2a\x10\x1a\xc7\x6a\xff\xfb\xf3\xd3\x78\xa4\x34\xa1\x02\x29\x7b\x8b\xf6\xe0\xad\x83\x83\x98\x98\x8c\x9a\x98\x94\xa5\x9e\x79\x70\xdf\x04\xe3\x5c\x53\xc3\xf0\x1b\xdf\xd5\xf5\xcf\x55\xb7\x2a\xcb\xfd\x2b\xb4\xb0\x17\x6d\xf7\x71\x03\x21\x48\xa5\x59\x44\xac\x2e\xc0\xb9\xe9\xdd\xb4\x0e\x5e\x9a\x79\x52\x40\xb3\x34\xcf\x5d\xdd\x2c\x96\x2d\x3e\xf5\xa7\xc6\x08\xd7\xf5\x3f\xe9\x10\x31\xe1\xff\x72\x08\x4d\x4f\x2b\x6e\x34\xcb\x23\x0c\x88\xd7\xc6\x40\xb3\x18\x1d\x9d\xce\x32\x1d\x45\x29\xba\x73\x37\x75\x3d\x5a\xd9\x3a\x12\x11\x52\x9d\xb4\xbd\xb7\x84\xbb\xc6\x26\x58\x87\x3a\x52\x39\x22\x11\x44\x6b\xd9\x73\x7f\x85\xa2\x15\x87\x95\xd0\x49\x66\xc5\x81\x4a\x8f\x10\xf6\xae\xb8\x6f\x97\x14\x8d\xe7\x6d\x55\x2f\x31\xa5\x8c\xe7\x86\x4e\x13\x81\x27\xd2\xfd\xea\x61\x75\xbb\x41\x60\xc9\xdd\xe3\xfa\xf7\xcd\xb5\x0d\x7e\xf8\x5b\xf6\xcb\xc5\x2b\xc1\x8c\xa9\x5e\x8d\xce\x94\xc2\x4c\x34\x2a\x17\x1c\x8b\xee\xa2\xac\x5e\x67\x4a\xe3\x0e\xb5\xd9\x7f\x7b\x46\x88\xd5\xb2\xfd\xa2\x73\x9e\x60\xf0\xc5\xa1\x0d\x91\x02\xbc\x84\xeb\xba\xfa\x09\x1f\xb3\x1d\x55\xe7\x69\xc2\xa8\x5b\xbe\x3e\x7c\xf2\x0d\xe5\x2f\xda\x7d\x5d\xdf\x89\xe6\x05\xa6\x45\x59\x3a\x57\x71\xa2\xfd\x22\xb8\xae\xcf\xb2\x04\xfd\xd4\xd4\xe6\x92\xd3\xc7\x5d\x20\x28\xcb\x1c\x57\xc6\x01\x9f\xc0\xff\x9d\x53\xdc\x13\xef\x56\xd7\x7f\x39\xba\x22\x8e\x10\x91\x69\x46\x3e\x84\x6f\xca\x59\xe2\xca\x16\x6f\x47\x85\x7b\xd3\xeb\x65\x64\xe9\xf6\xc4\xcb\x4b\x83\x36\xda\xfa\xfa\x09\x9d\xdb\x59\xcd\x80\x96\x91\x65\xd5\x94\xe7\xa2\xd4\x7f\x14\x15\x04\x88\x85\x96\x71\x4a\x2d\x36\xe8\xb6\xb9\xac\x1c\xd3\x32\x25\x98\x36\x39\x95\xa2\x33\x75\x73\xb4\x51\x85\xf1\x8e\xa3\x65\xa6\x30\xc2\xab\xc3\x60\x4a\x99\xe0\xd1\xf4\xbc\xda\x6f\x0e\xfb\x6f\xcf\x9b\xdd\xb7\xc7\xbb\xc0\xe8\xb3\xba\xf5\x29\x14\xad\x94\xce\xb4\xdb\xac\xd6\x0f\x37\x75\x73\x2b\xe6\x9f\x52\x81\xc1\x75\x8b\x25\xbf\x87\xab\xcd\xcd\xe3\xf3\xe6\xb0\x7b\xbc\xd9\xaf\x57\x4f\xbf\x0d\x7d\xd0\x25\xd2\xf5\xee\xb2\x0a\x50\x6b\x9d\x23\xab\xf7\x9f\x7f\xf9\x3d\xb4\x36\x88\x59\xde\xdc\xde\xee\x0e\xfb\xc7\xc3\xb7\xd5\x7e\xfd\xed\x40\x9f\x56\xeb\xed\xcd\x36\x90\x57\x68\x0d\x29\x0e\xfb\xfd\xfe\xa9\x7f\xa7\xde\x38\x3f\xec\x56\x01\x97\xa6\x35\x00\xc6\xff\x8a\x76\x85\xda\xc2\xb3\x09\x0f\x9a\xe7\xb6\x5e\xcc\x40\xd3\x88\xf2\xba\x68\x9d\x0c\x77\xa8\x7e\x9a\x5d\x00\x06\x2f\x30\x6d\x37\x4a\xb0\x01\x89\x99\xa7\xe1\xdc\x37\xe2\x0d\xca\x75\x3d\xcf\x32\x00\xe5\x40\x9c\x65\xb3\x42\x09\xf9\x09\xf6\x13\xa2\xc8\x52\x90\xe1\x66\x32\xc8\xe9\x18\x88\xb4\x41\x33\xbe\x04\x61\x0e\xa6\xa9\x8f\x07\x77\x5f\xac\xb5\xac\xce\x47\x57\x7a\xb9\xbc\x56\x21\x32\x1c\x37\x6b\x47\xe3\xf7\x35\xa3\xfb\xbc\xa0\xd5\xdd\x83\x47\x84\x59\xa7\xdd\xe2\x7b\x9e\xe1\xb4\xf2\xc4\x8f\x37\x75\xb3\xf9\xd5\x35\xe2\xaa\xae\xb4\xd5\x77\x9e\x4d\x1b\xe0\x8e\x4a\xcc\x61\x3b\x66\xad\x69\x2c\x71\xde\x7d\xaf\x0a\x4f\x7f\x68\x20\x4f\x01\xb3\x50\x25\x98\x8e\xe7\xb3\x2b\x72\x69\xb0\x6c\x75\x29\x9b\x39\x7b\xf9\xdc\x30\x2c\x38\x42\x23\x12\xb9\xff\x9e\x5c\xe5\xc0\x57\x1c\xf2\x78\x9d\x0c\xfc\xf0\x56\xa5\x65\xe9\x84\x07\x41\x95\x4f\xc9\x6e\xfb\x4d\x6d\x82\xb4\x00\xc1\x22\x4c\x62\x4d\xb3\xcb\x5f\x82\x18\x41\x48\x1b\xf6\xbd\x6e\x40\x1c\xff\x16\x7b\x96\x01\x49\x25\xc6\xc4\xbc\x55\x70\xc1\x43\x3f\xfd\x09\xc9\x4d\x66\xc5\x6a\xab\x9f\xe0\x8b\x76\xc6\xe3\xe0\xa1\x7e\x20\x63\xc3\xe4\xb8\xc0\x60\xf6\x25\xa4\x24\x98\x8a\x94\x42\xfd\x2c\xeb\x97\x31\xf7\xae\x01\x09\x19\xa2\x08\xd6\xa5\x38\xf5\xff\x37\x3e\xf8\x40\x91\x38\x71\x7c\x32\xaa\x9c\x07\xac\x40\xd1\x18\xe9\xc0\xba\xe2\x08\x77\xb5\xfa\xd9\x7b\x2f\x17\x5d\x84\x2f\x23\xd8\xaa\xda\xaf\xdb\xd9\xf3\x29\x2e\xd0\x31\x46\x0d\xf6\xff\x2d\xaa\x97\xff\xbc\x16\x8b\xe6\x33\xa8\x9c\x0a\xee\xe5\xb2\x97\x50\x0a\xa0\x34\x38\x59\x04\x0c\x3c\x0e\xe1\xc1\x6c\x39\x57\x07\x0a\xb4\x97\x81\xb5\x03\x33\xe0\x95\xfb\x6d\x87\x7a\x3c\xc3\xae\xab\x1b\x70\xa9\xde\x95\xe9\xfa\xa9\x09\xea\x67\x60\xaa\x35\xa0\x95\x42\xee\x9d\xee\x33\x50\xeb\x67\x8b\xf9\xa2\xe2\x1b\x80\x65\x58\xfa\x55\xd6\x2f\x9b\xee\x75\xff\x6b\x7a\x36\x81\x51\x2c\xd6\x83\xe2\xeb\xd5\x87\x27\x05\x9c\xbe\x99\xd1\x92\xd0\x91\xaa\xc3\x2d\x54\x41\x38\x3a\x5b\x24\x9b\x5a\xda\xe2\xc1\x98\x18\x5d\xfa\xf6\xb5\x7e\xbf\x17\x85\x63\x92\x0c\x8d\x69\xa2\x3d\xda\x40\x4c\xb2\x1f\x86\x10\x29\x46\x54\x90\x8e\x0e\xf7\xf3\x54\x9a\x21\x82\x62\xb2\x02\x6b\xbd\xc6\xf3\xd0\x10\x21\xc9\x20\x69\xf8\xbd\x85\xa0\xbf\x3d\x19\x19\x43\xa9\xb2\x11\x9e\xe2\xe5\xb5\xcb\xe2\xe9\xdc\x30\x54\xc4\x48\xa8\xb6\x6d\xf1\xdb\x3d\x00\xe8\xcf\xb6\x16\x43\xb5\x05\x88\x5b\xa8\xc6\x9f\xfe\x24\x33\x1e\x13\x8d\xb6\x99\xa8\x86\x3a\x12\x43\xc1\x9e\xfb\x6f\x05\xbc\x4f\xab\x11\x0c\x23\x2a\xf3\xea\x0d\x58\x54\x35\x32\xf1\x0d\x4b\x14\x7e\x26\x25\x3a\xf5\x0a\x33\xff\xdb\x44\x11\xc5\x30\x57\x05\xef\x6b\x71\x59\x8b\x6f\x38\xb3\xce\x6e\x10\x8c\x5c\x69\xed\x83\x2a\x86\xf7\x13\xd8\x9b\x68\x37\x45\x09\xb3\xe1\x8a\x79\x46\x07\x14\xef\x0e\xca\xd2\xe6\xfa\x96\x87\x24\xe6\xca\xf1\x09\xb6\xe7\xc5\x60\x81\x49\x92\x08\x2d\xbc\xd5\x7a\xed\x0d\x5d\x93\xe4\x14\x77\xd7\xe3\xc7\xa6\xea\x8a\xee\x63\x1c\xc2\x30\xa9\x61\x54\x59\x20\xe9\x24\x1c\x64\x32\x95\xfb\x34\xa3\xf5\x8a\xda\xc9\x98\x65\x5a\x58\xc2\x70\x50\xc5\xa9\x80\xaa\xf3\x5e\xaf\xc9\x33\x1e\xbb\x0d\xe7\x70\x1a\x85\xf1\xff\x66\x9c\xd9\x46\x2c\xc6\x3f\x95\x8b\x0c\x1d\xad\xa3\xf8\x09\x7f\x0e\xf9\x27\xd7\x2a\x58\xca\xc5\x68\xd1\xb7\x3e\x03\x59\xcf\x86\x46\x66\xc6\x32\xd5\x7a\xb0\xde\x58\x12\x67\x69\x63\x32\x52\x73\x07\x41\xb7\x61\xf3\xa5\x18\xad\x51\x2c\x43\x57\xee\x20\xcf\x1f\x5b\xd5\x2e\x33\x7a\xfa\xbe\x99\xa5\xa8\xed\xea\x75\x7d\x3c\x89\xe6\x13\xf0\x07\x3a\x75\xd9\xa4\xd2\x07\x41\xc6\x96\x27\xa1\xbb\x4c\x0e\x0e\xe1\x67\xa3\x85\xd4\x56\x1b\xb7\x38\x8c\x13\x24\x06\x62\x9b\xb5\x44\x32\x8a\x3f\xea\xe6\x62\x8e\xfd\x0f\xfb\xd7\xd4\x9a\x31\xfd\xb9\xa5\xbd\x04\x48\x75\x6e\xe7\xe2\xe2\x9c\x10\x42\x18\xe2\xc3\x8f\xb5\x2e\xcc\xc7\xe3\x09\xaa\x59\x7c\xbd\xef\x43\x13\xee\x36\xcb\x75\xff\xe3\xd7\xa2\x13\x6c\xfc\x15\xfb\x3e\x09\xa1\xc6\x45\x65\xac\xc0\xcc\x5f\xcd\x17\x7f\xa1\x00\x31\xe6\x24\x5c\x55\x7a\xa9\x6c\x66\xd8\xdc\xfb\x6b\x74\x8c\x05\xda\x57\xab\xf5\x1e\xda\x8e\x2e\xb2\x7e\xcf\xcd\x07\x4e\x08\x65\x09\xc6\x2f\x31\x16\x0d\xfb\xc2\xe5\x7f\xfa\x96\x58\xe7\x79\x80\x26\xa3\x62\xee\x3c\x0c\xd2\xf7\x52\x00\x2e\xcc\xf8\x04\xd0\x2c\x66\xa1\xfa\x6e\x10\xa1\x29\xbe\x83\x4a\x6f\xba\x57\x9f\xc7\xe1\x84\x30\x1d\xd9\xb4\x6f\xef\x0c\xde\x9c\x2b\x15\x82\x3a\x7d\x23\x68\x0c\x62\x56\xf0\xab\xc3\xb4\x83\x63\xcf\xed\x9b\x0c\xc1\x1c\x13\x6e\xba\xeb\xfa\xdc\x4c\x89\xd6\x39\x21\x51\x6c\x63\xd7\xa2\x37\xda\x6e\xea\x66\xed\x6b\x1a\x67\xc8\x86\xe5\xd3\x6a\x3e\x0f\x39\x21\x5c\x06\xd9\xb0\xd5\x51\x8a\xb6\x15\xba\x9e\x4f\x9e\x38\x33\x68\xdb\xec\xb7\x9b\x67\xe6\x9f\x35\x49\x6c\x0d\xeb\x44\xba\x6a\x14\x76\xed\xbb\xa4\x0a\x37\xd5\xbe\xc9\x13\xaa\xf9\x26\xa5\x2c\xf8\xde\x45\xee\x9f\x45\x57\xd4\xbe\x31\xa5\x19\xd6\x44\xc3\xaf\x53\xff\x14\x57\xe7\x8f\x87\xf3\x71\x07\xea\x62\x25\xcc\x0e\xc6\xfe\xd2\x5c\x7b\xb2\x43\x4f\x40\x39\x51\x19\xf8\xaf\xc9\x68\x66\x09\xc5\x98\x51\x40\x08\x85\xd4\x32\x36\x0a\x9c\xb1\xba\x68\x40\x75\xd7\x20\x8b\x45\x5d\x09\x4e\x88\xe0\x1c\x8d\xeb\xcd\x45\x49\xf1\xc2\xe4\x14\x5c\x83\x74\x85\x45\x8e\xc3\x64\x54\x02\xd8\x77\x10\x02\x37\x80\xf5\xde\xc5\x40\xf0\x6f\x80\x85\x93\x45\xbb\xad\x1c\xcc\x6c\x54\x8a\x32\x7b\x1a\x0d\x10\x0d\x89\xd4\xab\x8f\xf5\x67\x45\x55\x9c\x10\x19\x3b\xc6\x70\xe8\x9e\xe1\x65\xbe\xda\x65\x26\xcd\x28\x27\x7b\x3f\xa4\xc9\x7d\x07\x41\x92\x7c\x42\x36\x02\x8b\xdc\x15\x7d\x57\x19\xe1\x2b\x58\x0c\xd5\xfe\x76\xf3\x77\x39\x15\xc3\xf5\xd6\x27\x68\xc0\x29\x4c\xdc\xba\xea\xc3\x76\x8f\x05\x5d\xab\x4a\x5f\x9d\xc3\xfc\xd2\xd4\x60\x8a\x42\x77\xb7\xa8\x87\xb7\x80\x3c\xe4\x84\x40\x94\x23\x02\xb4\x3a\x1f\xbd\x91\x1c\x5e\xad\xf7\x2a\x62\xac\x53\x6a\x44\xf0\x5e\xfb\xbf\x83\x05\xc1\x5a\x58\x8e\x8f\x58\xd1\x7f\x1c\xb0\x72\xda\xf7\x32\xa9\x4d\xa1\x20\xb1\x6b\x61\x37\x99\xe5\xc9\xd3\x9f\x9b\xdc\x62\x93\x6f\xbd\x03\xce\x09\x25\xc2\xd6\xf2\x62\x3a\xd2\xbb\xa6\xd3\xc7\xa7\x94\x1a\x34\x29\x9f\x37\xbb\xcd\xf3\x8f\x00\x15\x3a\x5c\xad\xd6\x1b\x2c\xe1\xf6\x37\xa3\xa9\xc1\xc0\xfb\x5a\x54\xe3\xe2\xb8\xbe\x45\x0a\x04\xc7\xdf\xaf\x9e\x7f\xdf\xd8\xaa\x86\xc7\xc7\xbb\x31\xe6\x88\x13\xca\x28\xc7\xa0\x9f\x53\x77\x10\x8d\x38\x7e\x8a\x0f\x5d\xfe\x7a\x94\x65\x5a\x46\xa3\x23\x7a\xd5\x86\xd4\xdf\xe8\x2c\xeb\x3b\xe6\x02\x19\x28\x1c\x4a\xe9\x73\xe4\x6b\xdf\x17\x08\xd6\x28\xe1\xe8\xba\xbf\x45\x71\x62\x2c\xdb\x5a\xd9\x0d\x7f\xcb\xe9\x68\x45\x60\x1d\xea\xf4\xf1\xb8\xa2\x6a\x64\x73\x9c\x7b\x27\xa0\x62\x37\x42\xc1\x9c\x86\xc6\x5d\x10\x43\x16\xd9\x04\x69\xb5\x71\xbc\xce\x13\x0c\x2c\x27\x34\xa1\xd4\xa2\x96\x10\xb2\xf4\x17\x85\x71\x7d\xff\x38\xc2\x1c\x06\xc2\x10\xad\x75\x79\x11\x01\xe8\xbb\x41\x8e\x4b\x0e\x43\xd8\x03\x82\x8e\x13\x9a\x01\xb3\x3a\xdf\x18\xda\x7d\xaf\x3d\xa2\x83\x13\x9a\x47\x19\x4e\xda\x17\x1f\x7a\xc7\xbf\x69\x8f\xc7\x7a\xaa\xab\x97\x37\x51\xae\x6b\x14\xb5\x0f\x6f\x90\x73\xcb\xa9\xf4\x0c\xa2\x37\x77\xff\x1d\xfe\x6e\x94\xd5\x2f\x40\x22\xc3\x31\xb2\xf7\x1b\x66\x4e\x7c\x3f\x19\x5b\x3d\x42\x7f\xe6\xf7\x9e\xaf\x8f\x17\x4f\x5f\x4a\xea\x08\xcb\x05\x06\x43\x6a\xd3\xbd\x7e\xe6\xff\x70\x42\x55\x24\x31\xf7\x75\x57\xbf\xa0\xa9\x62\xd3\xf6\xcb\x7b\x1c\xd5\x29\x45\xcf\xfa\x80\x10\xe0\xe2\xb4\xbc\x41\x51\xad\x48\xee\x41\x33\x50\xc1\xee\xa3\xea\x5e\xa1\x2d\xda\x39\x64\x73\x7a\x15\x38\xea\xf1\x2f\x45\xc1\x16\x82\x50\xfd\xa5\x69\x8a\x85\x78\xb7\xe2\x68\xa5\x30\x40\x5f\x04\x3a\x2e\xcf\x6f\x3a\x0e\x69\x70\x42\x0d\x93\x56\x30\xdc\x06\xa3\x42\x36\x76\x00\xed\x70\xc2\x08\xb3\xd8\xd2\xbb\xfa\xe5\x8b\x92\x72\xd7\x99\xc6\x96\xfe\x4a\xd7\x65\x29\x9a\xc5\x9d\x93\xd1\x94\x23\xe2\xe1\xa9\xa9\xf5\xd5\x78\x47\x61\x34\x4d\x33\x97\x23\x7a\x46\x9a\x9a\xe6\xb1\xb2\xf5\xfb\xbf\xcd\x7e\x46\xe7\x28\x69\xb7\x2a\x0b\x29\xa4\x08\xa5\x48\x9c\x30\x46\x24\x19\x83\xa5\x7f\x40\xd3\x8e\x24\x05\xa7\xe3\xc8\x18\x93\x68\x87\x89\x50\x97\xd1\x5e\x28\x0b\xf5\xdd\x72\x40\x10\xef\xd5\x61\xed\x64\x0e\x38\x61\x91\x16\x11\x02\x82\x84\x2a\xaa\x79\x28\x65\xe1\xf8\x66\x3c\x02\xa5\xc3\x31\xe6\xe9\x54\xad\x8c\xe3\x27\xe3\xc9\xe3\x44\x11\x87\xbe\xa5\x3f\xc2\x02\x64\x5c\x44\x08\xaa\xc1\xf5\x8a\x86\xfb\x28\x4a\x3b\xbb\x85\xb6\xf5\x0e\xa5\x03\x59\x4f\x07\x80\x83\xc4\x08\xbc\xb0\x9c\x5b\xce\xb4\x7e\xf8\x0a\x9b\xc8\x09\x8b\x09\xc1\xfd\x06\x2b\x1f\xb6\x1a\xd0\xe7\xf4\xcf\x16\x4b\xc6\x9c\x2f\x30\x5e\x32\x43\x6b\x6e\x37\x54\x0d\x70\x5c\x95\xe5\xe3\xb9\x53\x18\x31\x59\x00\xbe\x61\xff\x18\x4b\x17\xb1\xf8\xd1\x12\x10\xae\xa7\x3c\xbc\xb3\x1f\x48\x52\x40\xfe\x39\x7b\x0a\x04\x8c\x1b\x96\xa9\xcc\xb6\x85\xcc\x5f\x22\x19\x1a\xa9\x4f\xa5\x18\x67\xb9\xfb\x16\x45\x31\x6c\xa0\x41\x74\xaf\xd6\x0e\x3d\x14\x45\x11\x9a\xc1\xc6\x05\xa0\xd2\x4d\x28\x7c\xe7\x84\xa5\x2e\x04\x7e\x2d\x2a\xe8\xea\x6a\x72\xcb\x34\x36\xa8\x66\x25\xb4\xbe\x17\xa7\xd3\x40\x3d\x32\xb4\x67\xb1\xf7\x20\x9a\xb6\xae\x44\xe9\x55\xaf\xa6\xbb\x89\xef\x9f\x26\x63\x5d\x76\xd0\x37\x00\xed\xb6\xda\xbf\x43\x78\xcc\x34\xa3\xcc\xd1\xec\xdd\x61\x35\xf3\x9c\x5f\xa3\xef\xa3\xb9\xc5\x12\x9e\xa0\xd2\xa8\xca\xf0\x2e\x4e\xf3\x6f\x32\xdd\xc0\x58\x16\xc5\x48\x1d\xf1\x54\x0a\x05\xab\xeb\x42\x81\x47\x6d\xfa\x91\xcd\x62\x4b\x9d\xdc\x42\x67\x60\x8a\x63\xe9\x5b\xb5\x25\x1a\x28\xda\x1b\x84\xe5\xcc\x8a\xf8\x5d\xaf\x9c\x5a\x6b\x0a\xbd\xda\x4b\x53\x86\xe5\x09\x43\x3d\x26\x0b\xe4\x0f\x98\x99\x40\x78\x57\x4e\x8a\xc4\xfd\x45\x22\x52\x0e\x95\xd6\xdd\x8b\xea\xe3\xf3\x03\x83\x09\x1a\xa3\xb7\xd2\x1f\xef\xa5\x8d\x5e\x4e\x71\x2b\x9c\x30\xc9\x24\x92\xea\x78\xf5\xb9\x6b\x0f\x6d\xed\xdb\x0c\xc1\x22\xf8\x83\x86\xd2\x1d\x72\xd3\x17\x50\x71\xc2\xfb\xcf\xf3\xe7\xc3\xe3\xc3\x6f\xc3\xdf\x6c\x11\x09\xd2\xbd\xe0\x0a\x77\xa6\x42\x3f\x0a\xa1\x97\x50\xb8\xa3\x3c\xaf\x1e\x6e\x37\xc8\x31\x7b\x48\x7c\x9b\xa6\x0a\xef\xb0\x7e\x7c\xb8\xd9\xde\x1e\x10\xad\xf5\xe7\xd3\xe3\xee\xfb\xf3\xe6\x70\xff\xfd\x2e\x74\x8b\x6d\xb1\xb6\xfd\xa1\x01\xfb\xb0\x1e\x50\x51\x7d\xaf\xcc\x1a\x01\x0d\x9c\x44\x58\xe8\xc0\x13\x99\x3b\x85\xaf\xae\x0e\x7f\x4d\x58\x34\xe6\x8c\xb7\xcc\xc4\xe1\x38\x81\x9c\x62\x4a\x16\xe3\x5b\x7a\x5b\xb5\xe7\x26\x04\xf1\xfa\x66\x99\xe4\x4e\xeb\xb5\x70\x7a\x71\x33\xf6\x3d\x4e\x22\x92\x2a\x47\xe6\xd1\xad\x1f\xef\xef\xbf\x3f\x6c\xf7\xff\xb0\xc6\xe7\xea\xfa\xfa\x79\x3a\xba\x11\x91\x8a\xe6\xce\x69\x7a\xde\x5f\x2d\x6f\xb4\x11\xd1\xda\x6e\xb4\xfd\x28\xfc\x18\x73\x2f\xf9\x1f\xa5\xc6\xca\x28\x6c\x1f\xee\xd7\x8f\x5b\xff\xa1\x22\x96\xd8\xf4\xef\xc9\x6e\xe7\xed\x9c\x2b\xc3\x77\x93\xa9\x25\xd0\xd4\xfa\x77\x80\xd3\x7c\x0e\x44\x11\xb3\x18\x69\x1b\x5d\xa8\xcd\xa3\xc1\x10\x89\x2b\x3a\x59\xb4\x1f\xa2\x48\x59\x5a\xa5\xa2\xbd\x39\x97\xa5\x05\x92\x4c\xd1\x5c\x71\xe8\xa9\x31\xbc\x16\x5c\x7f\x68\xba\xc2\x14\x8e\xe3\xf3\x6f\xfa\xfb\x11\xe7\x89\x9c\x60\xb4\xdb\x9b\x42\x8e\x7d\xba\x88\x0b\x43\xc8\xac\x6c\x65\xeb\x98\xd5\x2e\xea\x56\xfa\xfe\x32\x43\x3b\xb2\xac\x85\xf6\x07\xf5\xf4\x1d\xb9\x32\x68\x09\xf7\x36\x9a\xad\x09\xa0\xfe\xc7\xe2\x7e\x27\x0d\x44\x7b\x8e\x16\xa3\xdd\xd7\xa7\xdf\x42\xde\xa9\xef\xa5\x69\x22\xc6\x65\xb9\xc7\xda\x8b\x70\xff\xa5\xa1\x34\x7c\xbe\x24\xb2\x18\x51\x5c\xdc\x5f\x8a\xbb\xfd\x3f\x40\x6d\xfb\xfb\xc6\x59\x1c\xa4\x1c\x06\xdd\xca\xbe\x25\x4d\x33\x13\x88\x46\x7f\x5b\x34\x03\xa3\x44\xc8\xd4\xa9\x02\x05\xa5\xe2\xd1\xcd\x8d\x89\x48\xf0\x4c\xbe\xd5\xe7\x16\xd6\xe7\xee\x33\x43\x21\xca\x29\xc5\xe0\x52\x37\x02\xe8\x0f\xcf\x93\x73\x8d\xf2\x4b\x8e\xe9\xc2\x95\xcc\x7e\xe0\x49\xb2\xbc\xa4\xf2\x2c\x53\xc9\x08\xbd\xa6\x91\x19\xef\x78\xa1\xfc\xee\xba\x0b\x22\xf0\x5d\x4e\xfd\x61\x32\x42\xff\x7f\x1e\x44\x5e\xe6\xe8\xf3\xb7\x4b\x23\x8c\x19\xdf\xdf\xdf\xcb\xb9\x92\x4c\xdf\x9c\x99\x78\xec\x54\xde\xd4\x8d\xad\xc0\xf2\x41\xaa\x48\x48\xa9\x06\xcf\xf5\xa6\x68\x5a\x57\x0a\x60\x37\x34\xdf\x4d\x12\xcb\x19\x71\x57\xbf\x6c\x9a\x99\x9d\x1a\xc9\x28\xf5\x88\x4c\xc4\x3f\xec\xe7\xe6\x50\x24\x53\xed\x70\x70\xaa\xae\x2c\xaf\xe1\x76\xfd\xb8\x09\xa6\x44\x24\xa5\xe5\x30\x41\xb1\x2b\xb4\x85\xe1\x7c\x1c\xa9\xe2\x73\x12\xa9\x84\xa2\x12\xcc\xb7\x0f\xdd\xd4\x2f\xc1\xd2\x88\x54\x6e\x44\xe6\xbd\xb4\xf0\x21\x75\x26\x12\x31\x08\xd2\xdc\x8b\x06\xf5\xec\x8b\x63\xd8\xa3\x23\xad\x04\x86\xf7\x31\x2b\x63\x2b\xfb\xd0\xa5\x19\x03\x7a\xfa\x6e\x40\x49\x3a\x10\x4e\x5d\x83\x2a\xda\x19\x2d\x3b\x27\x11\xa4\x11\x46\xe4\x0e\xd7\x70\xdc\x15\xd5\xeb\x8f\x02\xaa\x6b\x11\x1e\xc7\x24\xb6\x04\xf5\x74\xee\xb6\x95\xc5\x94\x3e\xd5\xf5\xcc\xc9\x8e\x8c\x34\xe8\x36\xda\x87\x46\x17\xef\x7b\xab\x2d\x5f\x97\x35\x0a\xa7\xfb\x06\x27\xc4\x08\x5f\x25\x73\x6e\x2a\xd0\xdb\x0e\x8e\xe3\x08\x23\x67\x51\x6e\x46\xd4\x1b\x70\x07\x2f\xa2\x1c\x73\x59\x2c\x6c\x81\x9c\x25\x16\xc9\xdf\x76\xf5\x69\x6b\x85\xda\xa7\x4f\xca\x99\x4c\x50\x05\xff\x1d\x8a\xc9\x57\xe2\x9c\x64\x18\xd1\x44\x1e\x27\x38\xb4\xf5\x11\x1c\xed\x9e\xe5\x89\x16\x6f\x70\xf8\xa8\xcf\xcd\xa1\xed\x37\xfe\x83\x85\x4f\xcf\x2c\x26\xce\x29\x20\xa4\xdc\xc5\xb1\x58\xb8\x79\x2c\xb8\x63\x67\xdb\x17\x9e\x22\xb2\xff\x7b\x16\xe3\xc7\x3e\xa1\x94\x20\x4e\x9f\xa1\x0d\x32\x0b\x4f\xc7\xbc\x14\xd6\xd5\xff\x51\x74\xaf\x4f\x58\xf4\x70\x29\x4d\xc1\x09\x8f\x55\xc6\xdd\x8a\x5e\x29\x85\xd2\x27\x78\x82\xd8\x75\x71\x49\xdf\x30\x8c\x5b\x12\xc5\x88\xed\x3a\x28\x51\x5d\x35\x00\xfa\x47\x21\x9c\x80\xd9\x52\x7e\x84\x13\x9e\x12\x2e\xfd\xb1\xbd\x9c\x12\xf1\x1d\x53\x8a\xc0\x42\x1f\x0e\xbe\x2c\xcc\xe0\x84\x67\x2c\x42\x1e\xdd\x77\xf1\xe2\xe6\x57\x68\xe0\x36\x75\x8e\x12\x39\xb8\xf3\xbd\x87\xd8\x07\xcf\x94\x2d\xf3\xc6\x50\x5c\x33\x8a\xbf\xb8\xf6\x9c\x88\xdc\x73\x9e\x5a\xf5\xab\x21\x61\xc0\xf3\xc4\xd6\x70\xee\x90\xf0\x12\x0b\x1d\x9f\xeb\xde\x12\x5a\x1c\xdb\x3c\x8b\x8c\x33\x10\xda\x0b\xd1\x04\xdf\x27\x17\xb6\x72\xd2\x3a\x6b\x7a\x5f\x94\xe1\x45\x44\x6e\x49\xa7\x4e\xfd\x09\xb7\xb1\xb2\x77\xa1\x0d\x32\xac\xe9\x3d\x34\xa2\xd2\xf5\x71\x2d\x1a\xbd\x83\xa9\x84\xee\xec\x97\x94\x34\xf8\x34\xd6\xb3\xc3\xb2\xb1\x59\x07\x93\x63\x4a\xac\xb7\x9f\xf1\x9c\x88\xfc\x8f\x69\x02\x91\xe3\x08\x22\x1e\x94\x7a\x17\x44\x85\x38\xe1\xa0\xa9\xb1\x52\xca\xb6\x00\xfc\xd0\xbd\xd7\xa1\xcd\x24\x48\xa6\xa2\x8b\xd6\xbd\xa4\x8d\xd0\xce\x7e\x1d\x8c\xc2\xdd\xbb\x04\xd3\xb1\x64\xd6\x68\x32\x8d\x64\x89\xbf\x3f\xff\x71\x78\x3c\x56\x85\x8d\x45\xf8\x5f\x30\xda\x20\x8f\xe1\xa1\x85\x6e\x0f\xc7\xd3\x37\x68\x6a\x4b\x5e\x6c\x3b\xc4\x44\x58\x95\x79\x94\xbc\x6e\x5f\x1f\xc4\xdc\x55\x8a\x29\x89\x72\xa7\x76\x57\x54\x2f\xbf\x0f\x6e\x40\x4c\x99\x3d\x24\xd1\xf0\xf5\x49\x84\xde\x35\xc7\xf2\xf1\xd0\x2b\xb2\xc0\x56\x24\xf6\x71\x19\xa0\xd0\x96\x12\x34\xb4\x75\xf1\x32\xff\x55\xad\x85\xf2\xfa\x02\xc7\xa3\x08\x09\x91\x98\x82\xc6\x15\x70\xf5\xf8\xf0\x7d\x77\xd8\xdd\xad\xae\x7c\x0b\x23\xd6\x97\xec\xac\x1c\x3f\xae\xff\xe7\xc1\x35\x89\x59\x94\xdb\x05\x7d\x02\xd5\x35\x80\xd0\x12\xdf\xe4\x30\xff\xd6\xef\xfe\x94\x74\xb2\xef\xa9\x08\x86\x10\x9e\x9a\xfa\x6f\x66\xd9\xe2\x28\x8e\x30\xba\xf7\xf0\x34\x76\x8d\xe3\x28\x4b\x31\xac\x73\x68\x85\x19\xa8\xde\x7f\x7e\x29\x2c\xdb\x5f\xa6\xac\x88\x51\xbf\x85\x4e\x17\x68\xcc\xa3\x38\x72\x47\xe0\x01\xc1\x64\x07\x94\xdc\x68\x0f\x6a\x90\x8d\x1b\x3a\x9b\x18\x83\x6a\x9b\xee\xf5\x07\x54\xdd\xb9\x81\xd6\xcf\xea\x38\x4e\x68\xee\xe5\xed\x3d\x50\x7c\xf0\x2e\x7d\xa7\x54\x61\x00\xb9\x6f\x1c\x0f\x73\x9c\x02\x72\x4d\xe2\x79\x7a\x55\x57\xda\x02\xa7\x0e\x57\x9b\xd5\xb3\xef\x93\x24\x31\xae\xb8\xa2\xbd\x9f\x54\x6b\x86\xe6\x34\x86\x09\xc9\xf9\xa4\xc6\xcd\xf7\x32\x19\x9e\xf8\x8e\xd6\x75\x92\x70\x89\x13\x03\x58\x6c\xd8\x7b\x82\xb7\x8f\xab\xbb\xc3\xe6\xca\x27\x89\xe2\x94\x12\x47\x3a\x5d\x85\xcc\x08\xe6\xaf\xab\x30\xcb\x32\x66\xa8\x4b\xda\xfd\x31\x3b\xdb\xe2\x2c\xb5\x98\x92\x1d\x88\xf2\xa9\xc1\x22\x9e\x81\xbd\xdd\xf5\xc9\x99\x25\x16\xc0\xa4\xfc\x9b\x08\xc0\x7c\x4e\x62\x91\xd8\x44\x22\x7a\xf8\x8f\x01\xaf\x3e\x8b\x74\xc4\x42\x4a\x3e\x50\xb7\x2e\x1d\xd5\xae\xa3\xcc\x32\x64\x98\xe8\xa0\xed\xb6\x21\xb8\xfe\x4f\x68\xfc\x3e\x13\x4b\x9d\x4a\x39\xa1\x5e\xf0\xa2\x08\x36\x17\xe9\xfb\xa9\x84\xa3\x13\x8d\xe0\x2b\x30\xb3\xd0\x44\xac\x12\xe3\xd1\xb0\x21\x27\x31\x99\xe8\x4a\x00\xc6\xfa\xef\x1e\x6f\x0f\xbb\x53\x51\x6d\xac\xa9\x74\x19\xac\xfd\xd2\x4d\x88\x95\x4c\xd1\x56\xf9\xbd\x38\xfe\xf7\x7a\x08\x76\xc6\x3a\x12\xb8\x99\xf9\xb3\xcf\xd9\x67\x53\x13\x99\x4f\x4f\x9a\x58\xeb\x0c\xa1\xfe\x9b\xd5\x3e\xdc\xc7\x44\xb8\x4c\xf0\x14\x3c\x3c\x3d\x6f\x3c\xe2\x86\x93\xd8\x24\x11\xea\x19\xdf\xaf\x1e\xbe\xad\xf6\xfb\xd5\xc3\xd3\xf3\xe3\x9f\xff\xc8\xf7\xdf\xd6\x8f\x77\xab\x1f\x9b\xd0\x2d\x23\x38\xbb\xae\xca\x5a\x4d\x16\xb5\x01\xc1\x5c\x6c\xdc\xd6\xe8\x9d\xf5\x65\x36\x74\x89\x3f\x90\x93\x84\xe8\xdc\xc9\xfa\xaf\x45\xb3\x3b\x81\x2a\xc4\xec\x28\x48\x18\xe5\xc8\x6f\x74\x05\x1d\xfc\x1a\xc9\x2f\xfe\xff\x29\xfb\xb2\xee\xc6\x6d\xe4\xfb\xaf\x93\x87\x79\x20\xc0\xfd\x51\x92\xe5\x6e\x4f\xbc\x68\x24\xb9\x3b\xf9\xcd\xc9\xd1\xc1\x52\xb0\x38\xa6\x48\x85\xa4\x6c\x2b\x9f\xfe\x7f\x58\x05\x50\x24\x45\x3b\xf9\xbf\x4c\x4f\x0c\x70\x11\x88\xa5\x96\x5b\xf7\xfe\xad\x63\x36\x7c\x92\xaf\xc3\x88\xa2\x72\x6f\xad\x6f\x5c\x8f\xec\xc9\x28\x48\x53\xac\xe7\x5f\x83\xde\x97\x55\xed\x66\x75\x14\x7a\x94\xa7\x7e\xb8\x7b\xa4\x32\xb8\xbb\xf9\xf3\xf6\xae\x8b\xe3\x44\x21\x0f\x50\x76\x63\xfe\xbc\x5e\x3e\x2e\x7e\xef\xfe\x1c\x50\x40\xb9\xaf\x78\x3f\x7a\x62\x18\xa5\xf8\x46\x17\x82\xda\x1e\xe0\x22\x8a\x82\x20\x75\xe5\x4c\x2e\x7d\x00\x5f\x92\x42\xb6\x17\x19\x8d\xa6\xb8\x01\x70\x10\x06\xf7\x42\xb1\x31\xba\x83\xd8\x50\x88\xbf\x7e\x2a\x6e\xcb\x6a\x2a\x62\x15\x25\x7e\x82\x29\x39\x22\xe9\x76\x56\x68\x94\x04\x2c\xb6\x0c\xaa\x77\x8b\x27\xda\x22\x7a\x38\x48\xec\xe1\x03\x58\x9d\x99\xc3\x01\xd3\xd8\x03\x6d\xd2\xb6\x4b\x14\x21\xee\x0e\x27\x8b\xab\x55\xfc\x47\x80\xa2\xe1\x3b\xa6\xa1\x8f\xe3\x67\xf2\xb2\xec\x7e\x66\x1a\x46\x28\x7c\xda\xee\x0c\x6b\xc0\x6d\xe1\x5e\xd0\x7f\x90\x9c\x68\xd7\x31\x89\xb1\xd0\xc6\x51\x01\x22\x1e\x6f\x12\xf3\xd3\x76\x4e\x39\x86\xc3\x6d\x92\xb0\x7d\xe9\x61\x39\x41\xdb\x47\x03\x82\xe6\x1e\xdc\xa1\xdf\x43\x26\x0d\x7b\x0a\x8f\x74\x13\x7f\x3c\xdd\x3f\x3f\x2c\x77\xa1\xe7\xde\x49\x30\x86\x91\xfc\xdb\xd9\x76\x3d\x7b\xdc\x3c\x3d\x74\x0d\x3e\x4b\x6c\xf0\x68\x61\x4d\x72\x22\xb6\xab\xef\xa1\x78\x69\xf6\xc3\x73\x2e\x12\x91\x41\xb6\x36\xcb\x31\x35\x56\xfa\x6d\x7b\x98\x04\x35\xe8\x66\x15\x14\xc7\x5c\x9c\xfb\x0b\x3a\x92\x5e\x98\xfa\x9d\x02\x13\x4e\x8f\x7a\x7e\x26\x6b\xd2\x75\x49\xc9\x86\xc2\xfa\x32\x6f\xec\xf0\x8f\x46\x4f\x71\xaa\xe3\x79\x81\xe6\xbe\x54\xed\xc1\xa0\x61\x0d\xc7\x53\x33\x81\x50\x88\x54\xc8\x49\x8b\xcf\x56\x5b\x20\x37\xf9\x95\xfb\x17\xa9\x30\x44\xc3\xfc\xf6\xee\xde\x6d\x64\x91\x8a\x22\x8c\xe3\x1e\xd0\xaa\x7c\x84\x8f\x66\x01\x59\x7e\xb1\xde\x22\x95\x72\xb4\x4a\x56\xeb\xbb\x1f\xb3\xed\x12\xb1\xf3\xbb\xae\xca\xd5\xf5\xd2\x31\xa4\x14\x75\x43\x14\x5a\x56\xbc\x5c\x88\x30\x5c\x97\x84\x52\xc2\xad\x19\xd3\x7e\x6a\xca\xa7\x4d\xcf\x1d\xc3\x34\x02\xc2\xb1\xfc\x6c\x23\x72\xb0\xea\x27\x9f\x75\xf7\x53\x32\xe5\x4f\x45\x7b\xf7\xcf\xe8\x83\x03\x2f\xf6\x3c\x86\xe1\x97\x6d\x75\xfa\xa7\x5a\x87\xed\x55\x7e\x8c\xc9\x1b\x10\x55\x7e\x76\xb5\x69\x35\x22\xe9\xf4\xc0\x9c\x88\x59\x7b\xec\x93\xda\x5b\x55\x2f\x44\xd1\xc9\x9f\xb8\xf6\x28\x96\x56\x83\xb0\x59\x16\x4d\xa6\x85\x86\xcb\xc5\x91\xc1\x11\xba\x41\x0f\x60\x0e\x4d\xd7\x60\x12\x8c\x87\x1c\xc5\xd9\x16\x7a\xba\x16\xce\x9d\x5f\xd1\x3c\x62\xfd\x9f\xd0\x50\xdd\xe9\xe1\xdc\x8e\xb9\x1f\x62\x71\xf2\x7d\xf9\xb2\x69\xca\x63\x77\x71\x18\x4a\x9b\x54\xb9\x64\x84\xce\x43\x0f\x68\x38\x10\x1c\x00\x3a\xa2\xea\x63\xa6\x3e\x19\x65\xdf\x23\x1c\x01\x8a\x75\x5f\x14\xd1\x1e\x4f\xce\x90\x8e\x7d\xa6\x1c\xfb\xdb\xaa\x1c\xfb\x51\xb1\xcf\x55\x92\x5a\xe0\x63\xbf\x1c\xb8\x6d\x0a\x7c\xb2\x1a\xa1\x3a\x64\x3d\xee\xe7\xc0\x8b\x83\x30\x42\x77\xd6\xb4\x13\xeb\xc9\x74\x7f\x4e\x52\x63\xf9\x96\x95\x68\x76\x45\xa9\xa1\x1e\x67\x3e\xe2\x40\x91\x00\xfb\x20\x20\x4a\xef\x2d\x73\xd4\xa6\x20\x92\xc3\x2b\x64\xf5\x3f\x42\x6b\xc4\xa1\xcf\xa5\x15\xec\x46\xea\x68\xaa\x14\xd8\x8a\xaa\x3d\x14\x0a\x4a\xe6\x76\x5d\xa9\x26\x5b\x68\x7d\xad\x90\xd2\xb6\x07\x44\x9d\x84\x31\xf9\x45\x9e\xc1\x38\x35\x14\x47\x2c\x46\xbb\xd3\x22\x3e\xf0\xa8\xb9\xb3\xbc\xab\xa3\x9b\x45\x82\x64\x35\xe7\xed\x67\xb8\xb8\x7b\x71\xec\x73\xcc\x41\x1d\xc5\x79\xf7\x55\x9c\x21\x8e\x93\x18\x91\x7d\xad\x5b\x57\x7f\x1a\xb7\x88\x63\x21\x18\xa5\xe3\x2a\xd8\x34\xc2\x98\xc1\x01\xd8\x36\x23\x2c\xca\xba\x02\xed\xf3\x86\xcb\x2a\x06\xe3\x60\xe7\xed\x77\x58\x95\x65\xbe\xd4\x59\xb3\x0b\x5c\x87\x24\x00\x42\x6c\xe6\xa2\xde\xdb\xda\xda\xe7\x1a\x90\x24\x60\x8c\xe4\x1b\xbe\x5a\x12\x69\x0c\xf8\xb4\x3e\xfb\x55\x66\x6f\xb8\x8c\x12\xa3\xd0\x1f\x30\x00\xae\x78\x3b\xf0\xe2\x34\x35\x24\x76\x46\x26\xf3\x8d\x38\xb7\x46\x38\xf3\x3c\xcf\x9d\x51\xb1\x08\x95\x53\x7d\x42\x0a\x90\xfb\xf2\xe5\xb1\x6b\x8b\xa8\x54\x12\x7f\xfb\x8f\xbb\x95\xfb\xbb\x4c\xd2\x54\x76\x4c\xe6\x77\x45\x13\x05\xbf\xf4\x60\x0a\xb1\x0a\xc3\xc0\xe2\x0c\xb7\x9b\x2d\x19\x91\x3d\x10\x7c\xdb\x43\x44\x38\xaa\xf3\xfa\xb5\x19\x9c\x67\xfd\x74\xde\x34\xbe\xd1\xdd\x41\x0a\xc4\x62\xc8\xd3\xf9\xd7\xc7\xa7\x9f\xdd\x8d\x0d\x84\xe0\xfc\xc7\x3c\xdf\x1d\x29\xef\xe1\x9a\xb5\xa7\x1c\xdd\xea\xb7\x89\xe1\x1f\xf0\xc9\xb5\xdd\x99\xf0\x28\xa9\xd7\xee\xaa\xf0\xbd\x35\x24\xc7\x93\x5e\x87\x21\x7a\xd3\xff\x23\x0e\x1d\x2b\xe7\x56\x50\x22\xa8\xe7\x54\xc6\x10\x42\x68\x8b\x42\x49\x82\xc9\x42\x7e\x06\x3f\x0b\xd2\x30\x21\xe4\xdb\xff\x40\x21\xc3\xa9\xab\x2f\x1c\x0e\x46\xd7\x1d\x5c\xe9\x56\x6b\x9f\x65\x35\x29\xac\x93\x1f\x38\x7c\x4f\x10\x9c\x75\xdb\x5a\x35\x08\xe4\x0d\xd7\x28\x68\x0e\x54\xf1\x74\x38\x9e\x1a\xb8\x8e\xe6\xc4\xc6\x02\x09\xbf\x2f\x3b\x10\x5c\xdc\xba\x13\xac\x8b\x8b\xd7\x2b\xa8\x7a\xf5\x9b\x6d\xbb\x24\x55\xf9\xb1\xca\xc3\x63\x79\xc8\x2e\x8b\xc9\x28\x8e\x01\x33\x78\x79\xa9\x37\x17\x84\x5c\x6c\x5c\x15\x49\x97\xee\x7c\xde\xdc\x5c\x1a\x01\x69\x7b\x72\x30\x0d\x1b\xc1\x1a\x13\x8f\xc7\x88\x17\x7f\x39\xed\xe5\x70\x33\x4a\xbc\x30\x82\x80\x22\xbf\x0f\x59\x71\x91\x63\xfc\xa5\x6b\x8f\x55\xe0\x4a\xc5\x51\x46\xf9\x2a\xd7\x9d\x78\x11\x95\x61\xb7\xcb\xa7\x2b\x2a\x83\xee\xdc\x4c\xbc\xd8\x23\xde\x49\x6b\x72\x3c\x88\xe2\x7c\x2f\x0a\x7d\x85\xa9\x1b\xaa\x6c\xb7\x57\xa6\x02\x53\xc5\x18\x5d\xfe\x67\xc6\x40\xe2\xa5\x04\xfd\x51\x22\x57\xcb\x83\x98\x74\xad\xc6\xe6\x5c\xe2\xa9\x04\xe9\xea\x7f\x6b\x9d\xc9\xbe\xe1\x98\x30\x06\x69\x1f\xc7\x7d\x23\x1a\x41\xd5\x7f\x59\x73\x1e\x0d\x04\x53\x9e\x25\x05\xab\x6b\x54\x4f\x1f\x9f\x63\x09\xd3\x44\x23\x89\x65\x17\x94\x8f\xb4\xba\x54\xc3\x3b\xf1\x38\x94\x72\x10\x39\xf9\x21\x4e\xf9\x95\x04\xde\xb4\xcb\x94\xf0\x24\x42\x6b\xef\x53\xac\xba\xeb\x27\x83\x34\x75\x7b\x9b\x8b\x25\x0c\xe5\x51\xda\x5e\x1a\x6c\x90\x67\x2e\xea\x4c\x4d\xe2\x1d\x12\x9f\x25\xc2\x06\x15\xd0\xc2\x5c\xf4\xf0\x81\xe3\x97\x1e\xec\xda\x89\xaf\x42\xcc\xdb\x3c\x89\x3a\xab\xff\x3e\x0c\x97\xf8\x4a\xe3\xd0\xf4\x03\xe7\x57\x3c\xc0\x6d\x3f\xe0\x8e\x47\xf0\x36\x2b\x04\x31\xde\x58\xa6\x79\x4a\x97\x7a\x5d\xcf\xd4\xef\xc3\xf6\x28\xe3\xd0\xa5\x80\x6d\xaf\x20\x10\x54\x5e\x2b\x0c\xdc\x80\x3e\xa9\xc9\x62\xe6\xb6\x63\x22\x4c\x68\xeb\x6e\x1e\xce\x3f\xcb\x4a\x0f\xce\xad\xee\x87\x07\xca\x47\x88\x85\x69\xdf\x2e\xfb\x0b\x7a\x6c\x7a\x81\x97\x84\x31\x78\xbc\xb3\x78\xfe\x0e\x61\x37\x80\x79\x27\x91\x8c\xb0\xda\xb3\x7e\x07\x38\xd6\x03\xb5\x12\xdb\x23\x8e\x3c\x69\x49\xb8\x50\xd4\xee\x5e\xd4\xcd\x8f\x7a\x2e\x9a\x26\x87\x0e\x67\xe3\xce\xb2\x24\xb6\x11\x23\xa2\x64\x7c\x10\xaf\x50\x0d\xf5\x9a\x86\x9f\xd6\x5d\x95\x7a\x98\x0c\x5e\x67\x6a\x80\x4f\x4a\x92\x40\x85\xf6\xb8\xa5\x64\x58\x37\xd5\x52\x4f\x2a\x3e\x88\x70\x8d\x5c\xfe\x24\xf5\x13\x3c\xbc\x5a\xf7\xf7\xd9\xc2\x73\xd5\xab\x78\x81\x1b\xd9\x75\x09\x22\xf4\x06\x5c\x96\xd4\x76\xe8\x3e\xc2\x60\x36\xa5\x51\x88\x48\x61\x69\xad\x9a\xe6\xf2\xc1\x53\x49\x32\x09\x54\x42\x6a\x0b\x63\x5d\x9b\xe6\xb6\x06\xfc\xdc\x1a\xc0\xa3\xc5\x20\xb8\x40\xaa\x25\xa1\xf5\x23\xbc\xa3\x99\x98\x5d\x7b\xce\xa3\x69\x23\x12\xcf\x81\x48\x90\x0f\x0c\x84\x0d\x85\x62\x49\x21\x0f\x90\xcb\xaf\x7b\x01\x01\x90\xb0\x8e\x95\xec\x07\x14\xba\xac\x26\x55\x7b\x03\x2f\x91\x69\x1a\x84\x2e\xad\x78\x86\xca\x92\x00\xb9\x56\x25\x5d\x41\x84\xc5\xa6\x39\x07\xdc\x75\x30\x81\xf2\x3b\x26\x68\x3a\x58\xb3\xcb\x37\x53\x8c\x92\x2a\x17\x28\xab\xd5\x6a\x1e\x3a\x90\x9f\xfd\x7b\xba\x62\x01\x9f\xb4\xd5\x13\xf7\x34\x03\xe8\x98\x64\x83\x19\xa5\x5b\x1b\x64\x54\xc9\xf3\x59\x4c\xcd\x5d\x12\xc6\x88\x68\x1b\xd6\x20\x3b\x94\xc5\x14\xba\xc2\x5d\x98\x06\x98\xb8\x46\x18\x21\xbd\xc5\x84\x6d\x96\xe8\x94\xa4\x6b\x29\x78\x5a\x76\xe5\xca\xc3\x4f\x03\x5e\x4a\x2a\xb0\xf8\x16\x4e\xe3\xa7\xf5\x69\x16\x79\x59\xc0\x34\xeb\xe3\xc4\xde\xd8\x4b\x5b\x26\xc0\xc9\x62\x7d\x43\x03\xcb\xa6\x39\xbb\x36\x40\xa9\x82\x4c\x95\x7c\x60\xc2\x27\x00\xb1\xe9\x36\x70\xa8\x9a\x71\xf8\x2c\x31\x40\x98\xab\x0a\xfe\x3c\x65\x15\x68\x8b\x5d\x19\xcc\x95\xd4\x63\x12\x8b\x1e\x8e\x3b\x84\xed\x59\x09\x40\x2a\xcd\xaf\x1f\x4a\xdd\x0f\x07\xa6\x5e\x42\x3c\xb4\x96\x9c\x64\x72\xf2\xa6\x9e\x22\xb0\x6b\xeb\x04\xf7\xbf\x79\xea\x01\x29\x73\x7c\x43\x9f\x63\xd1\xf3\x52\xa7\xbf\x78\xca\x84\xc6\x7d\xb9\x2c\xf2\x33\x26\x21\xbe\xb5\xce\x2f\x9a\x89\x3d\xe2\xce\xb6\xa3\xa2\xa2\xe3\x17\x68\x9a\xf2\x78\xba\x2a\x2e\x4b\x99\x09\x14\x51\x02\x9a\x0a\xea\xfd\x43\x59\x88\x4a\xed\xcf\xad\x35\xed\xc6\x33\xe5\x01\x27\x76\x27\x1b\xdb\x1a\x9e\x4e\x29\x17\x11\xa3\xb4\xc0\x8f\xb2\x93\x35\xb7\x59\x68\xc6\xbb\x4e\x04\x19\x43\x8b\xef\xf6\x94\x9b\x2c\xcf\x5b\xe3\xcc\xf9\xdc\xce\xba\xe0\x17\x87\x21\xe9\x78\xf5\xad\x19\xcf\xff\x70\x37\x03\xee\xf4\xf1\x2c\x2f\xeb\x64\x91\x41\xea\xb3\x10\x41\x86\x16\x20\xb1\x3a\x75\x39\xc0\xd4\x97\x94\x58\x78\x2b\x1b\xa8\x77\xa6\x8b\x50\xa6\x81\x50\x98\x90\xb6\x28\xb0\x9f\x20\x5e\xbf\xb7\x06\xde\x22\x17\x75\x9d\xa9\xae\x1b\x98\xd0\x65\x1e\x44\x23\x86\xd4\xd7\xb6\x4f\xe8\x33\x3c\xf7\x26\xd9\xbe\x06\xa7\xde\xf4\x3e\x31\xfa\xe8\x61\xc0\x5d\xb5\x28\xb1\x00\xa0\xc2\x8a\x8d\xca\x5f\xd7\x0d\xa6\xa1\x91\x18\x8a\xd9\x9c\xe4\x21\x6b\xfa\xd8\xf1\x81\xd5\x92\x46\x91\xc0\xf4\xdd\xe2\x61\xe1\xf0\x2d\x43\xde\xfb\xd1\x7b\xc4\x91\x8c\x9c\xde\x03\xbc\xcf\x5e\xae\xc2\x02\x69\xac\x89\xd2\xce\x49\xb0\xac\x7b\xd8\xdc\x34\x69\x07\x66\x84\x51\x7b\x32\xa6\xbf\x9a\x52\x0e\x4e\xf9\x16\x8f\x31\x2b\x38\x79\x1c\x45\xb3\xd3\x34\x49\xf0\x34\xd8\x55\x18\x6d\xed\x83\x9b\x6c\x0f\xe1\x6b\x3c\xb8\x67\xf7\xf7\xb3\xc7\x1e\x6c\x30\x95\x41\x8c\xdf\xff\x9b\x7d\xc4\x6a\xe0\x58\xa6\x52\x05\xfe\x45\xd2\xda\xe1\x80\x1f\xc4\x87\x12\x23\x04\x51\x2a\x75\x1a\xca\x81\x64\x8a\x35\x50\xe6\xa7\x3a\x2b\xda\x5d\x60\xd8\x5f\xc5\x12\x8d\x39\xca\x16\x3f\xdc\x3d\xee\x6e\x9e\xd7\xb3\x5e\xce\x22\x55\x69\x84\xdb\xd3\x5b\x06\xef\xbe\x8b\x3b\xa4\x5a\x0a\xcc\x4c\xb7\xce\xc0\xaf\x70\xae\xd7\xa0\x20\x7b\x1b\x03\x1d\x53\x48\x88\x3c\x80\xaa\x12\xfe\x1e\xc4\x75\x19\x75\xd0\xc4\xff\x53\x43\xb3\x58\x7c\xdf\x81\xce\x9a\x5d\x38\x9c\xd1\x86\x47\x88\x38\x5a\x6e\x16\x4f\x83\x1d\xcc\xf8\x3e\x8a\x87\xd5\xa7\xc3\x65\x6e\x76\x8d\x32\x40\x6c\x27\x8a\x28\xbf\x3c\x88\x8f\x5f\x1d\x2f\x4e\xdb\xa8\x7c\x5b\xc7\x57\x7c\xcb\xde\xe0\xa1\x2c\xe0\x3c\x17\x9d\xf1\x28\x3c\xad\x83\x4b\x51\x3c\x72\xd6\xce\x45\x0d\xfa\xa9\x6f\x04\x0a\x16\x30\x73\x51\xb2\xfa\xe1\xd4\x7c\x86\xb3\x41\xb0\x54\x60\x6d\xf7\xfc\xfe\x69\xf1\xeb\xe6\xf9\x71\x7b\x77\xbf\xb8\x5f\xce\x1e\x9f\x57\x9b\xed\x6c\xf1\x6b\x77\x33\x99\x3a\x1b\x91\x28\xc5\xeb\x3e\xa6\x5a\x30\x13\x68\x9a\xdd\x0e\xba\xb4\xb9\x46\xf3\x09\x66\x92\xb8\x3f\x87\x7b\x05\x34\xad\x37\x7d\xbd\x5e\x05\xf7\x48\x07\x6a\x51\x66\xc5\x8f\x2c\xcf\x05\x21\xbf\xdc\x5b\x71\x69\x94\x25\x3a\xf8\x6d\x35\xc3\x78\xe7\xe8\x80\x11\xbe\x48\xa9\x14\x0a\xbf\x3d\x3e\x0b\x1f\xfb\x49\xa6\x43\xf8\x9a\x07\x84\x38\x7c\x79\xe9\x3e\x97\x08\x3c\xa6\xed\xfa\x7e\x28\x8b\xd6\xec\xc4\x38\xed\xb6\xa4\x8a\xa5\xc9\x28\x83\x08\xc2\xc0\xa9\x0f\x77\xfc\xc1\x64\x9c\x8d\x5f\x32\x48\x85\x55\x7b\x6f\x4f\x9a\xcd\xa1\x3d\xaf\xea\xa6\xa3\x61\x73\xbd\x94\x8f\x48\x8e\xbc\x14\x85\x13\xc4\xec\x9a\x42\x4c\xc3\xb8\xd1\x1f\x6b\x5f\xfc\x1d\xf5\x44\xe0\x89\xd0\x13\x21\xd8\x2d\xac\xac\x0e\x22\x9f\x9f\xae\x05\x58\xda\x7e\x8c\x04\x31\x56\x27\xe9\x34\xeb\xbf\x4c\x63\x8a\xd0\xf7\x10\x50\x7b\x0b\xa0\x97\x2f\x2e\xb3\x21\x42\x9f\x44\x55\x2b\x40\x74\x25\xa6\x60\xcb\x2b\x55\x20\xd7\x39\xf6\x63\x9b\xb0\x9d\xa8\x85\x11\x61\xac\xd0\xdf\x41\xf9\x42\x7d\xc8\x8a\x09\x60\xaf\x08\xa5\xc1\x1a\xdd\x15\x14\x8d\x50\x65\x05\xfd\xd5\x2a\x62\x4e\xa9\xb9\x3a\x7b\x41\x19\x2e\x2b\xb0\x05\x55\x3d\x8c\xeb\x89\x18\x34\x26\xcd\xda\x37\xb8\x3d\x15\x57\x55\xbc\xc3\x93\x41\x24\x22\x45\x11\xf1\x5f\xb3\xe2\x45\x97\x07\x5b\x18\x75\xa5\x9b\x16\x78\x22\x65\xa1\x08\x7b\x49\xe9\x9a\x96\x47\xef\x10\x10\x29\x37\x8e\x08\xf9\x21\x2b\x36\xd9\x0b\xd9\x1d\x81\x75\x75\x85\x90\x09\x6a\x89\x91\xeb\xa4\x27\x39\x1d\x3e\x55\x32\x9a\xb4\x17\x84\xd0\xa4\x7c\x63\xa9\x60\x57\x22\x1b\xaf\x51\xc9\x23\xe4\xe0\xbd\xa8\x8a\x98\xc4\x0d\x96\x0c\x12\x8a\x64\xf7\xa8\x5f\xdb\x3f\xc7\x32\x41\xc8\x60\x77\x6e\x09\x15\x78\x92\xbb\x2f\xfc\x66\xad\x2a\x0b\x60\x1b\xef\x23\x2a\x49\x05\xef\x05\x67\x47\x51\x2d\xa1\x24\x95\x0c\xe3\x30\xda\x4a\x6d\x4b\xc3\x3b\xf8\xe6\xca\x24\x5e\xe8\x44\xbb\xd0\x52\xc4\xd2\xcb\x29\x4f\x52\xe8\x28\x44\xab\xb1\x2b\x8c\x2b\x2b\x34\xed\x26\xed\x01\xa1\x0d\x21\x64\x6b\xeb\x03\x67\x7f\x41\x47\xdb\x3a\x3d\x4f\xc0\x4b\x90\x95\xb3\x4b\xee\x36\x9f\xa4\x77\x04\xa8\x28\x20\x9f\xb6\x38\xd5\x17\xc2\xf2\xb6\x05\x98\xb0\xf5\xbf\xdf\x45\xbd\xdf\x9e\x8f\x9d\xc1\x2a\x0c\x13\x01\xd9\x70\x08\x85\x69\xcf\xa2\x1b\xd1\x1d\x39\xd2\xf3\x3c\x4c\x44\x5a\x16\xaa\xc9\xa8\xf1\xd0\xf4\x1c\xc6\x79\xa4\x27\x28\x08\x49\x67\xd2\x1d\x55\x5e\x6e\xc7\xe2\x2c\x6d\x47\x45\xb0\xc7\x9b\x2c\xcf\x5e\xa0\x50\x83\x65\x28\x19\x97\x81\xd7\xc1\x64\x3a\xee\xc2\xb6\x25\x88\x3c\x8b\x2e\x78\x7a\x83\x6a\x75\xdf\x11\x61\xb7\x8d\x82\xb4\xb8\x31\x01\x61\xf5\x20\xae\x32\x10\x5d\xe8\x7b\x38\xa0\xd2\x67\x29\xb2\xd7\x1f\x73\xd0\x2f\x70\x03\x2a\xcf\x8a\xd1\x94\x93\x7e\x98\x76\x51\x9f\xad\xa8\x5f\xdb\xf9\x92\x43\x9f\x2e\x72\x38\x1c\x81\x4f\x92\xce\x2f\xd0\x6c\xa0\x69\xae\x30\xb9\x32\xf4\x7d\x2c\x76\xde\xd1\x80\x59\x9b\xdf\x92\xd5\x7f\xbd\xa7\xc8\x30\x49\x22\x6b\x5e\x7d\x2f\x1b\xf2\x6e\x86\xbb\x94\x0c\x15\xe0\xf3\x4d\xf6\xb2\x27\x30\x64\xcf\x34\x90\x91\x47\x14\xca\xa6\xac\x14\xcc\x4f\x67\x29\x86\x3a\x8f\x6d\x17\x66\x20\xed\xac\x87\xa7\x23\x54\x7d\xe3\xe1\x5f\xa3\xce\x3c\xc5\x7d\x89\x6a\x83\x7b\x76\x8e\x8c\x14\x51\xe6\x2d\x9b\xfd\xfd\xb9\x19\x7e\xeb\xd8\x4f\x52\x8b\x87\xbe\x05\xf8\x99\x15\xba\x7c\x1f\x8d\x52\x1c\x10\x94\x45\x67\x75\x9e\xbd\xc2\xac\x6a\x46\x6a\x01\x6d\x9f\xc4\xc3\x80\x50\x6b\x2a\x3d\x1f\xb7\x7b\xb8\x29\x4f\x2f\xfb\x71\x27\xc9\x71\x5e\x75\x95\xfd\xc3\x08\x97\xed\x95\x78\x11\xc6\x89\xb1\x5e\x7c\x37\x7b\x78\x7a\x7e\xdc\xee\xee\x16\x4f\xbb\xcd\x76\xf6\x6d\xc9\x76\xab\x35\x65\xe0\x9d\x01\x2a\x93\x38\x41\xfd\xf5\x4a\x64\x35\x6c\x72\x71\x38\xf4\x1c\xaf\xe9\x85\x92\xe8\x10\x19\xe3\x11\xd7\x74\x0b\xb0\xfc\xc8\x3e\x61\x33\x90\x69\xc2\x43\x32\x6f\x8b\xc5\x05\x71\x63\x1b\x85\x07\x69\x47\x7d\xfe\x72\xe5\x82\x4a\x69\x25\x4d\xde\x45\xa3\xf6\x3f\x32\x0d\xe5\x7c\xf4\x6b\x65\x12\xa0\xb6\xc8\x7a\xf9\xb8\x5c\xe2\x4f\x76\xf7\x96\x26\xc4\xb3\x79\xb1\x3f\x15\xaf\xf5\xe0\xa3\xa9\x94\x78\x0f\x6a\x37\xa7\xd0\x91\x61\x5d\xb3\x21\xd6\x61\x09\x0d\xf3\x3c\x6f\xe7\x31\xe8\xc2\x07\x52\x27\x31\x06\x2e\x77\xe4\x42\x3c\xb5\xdf\x34\x43\xce\xa7\x09\x58\x85\xd4\xda\xc7\x19\x88\xc3\xb7\xfc\xf3\x24\xf2\x5f\xae\xac\x16\x09\x22\x41\x0c\x54\x8e\x67\xa5\xc5\x18\x3f\x99\xd1\xad\x40\x18\x8c\xd8\x75\x1c\x7b\xdb\x9f\x77\xa3\xe1\x02\x00\x6e\x2d\xfd\x15\x54\x07\x51\x40\xd1\x5a\x6d\x4d\x56\x9c\x0e\xf7\xf0\xd6\xab\x86\xed\x1f\x0b\xd2\x44\x01\xef\x74\xfc\x11\x68\xd8\x9d\x72\xd2\x18\x8e\x93\xc3\x2a\x0a\x2d\x7a\x52\x3d\xc3\xf5\xa3\xbc\x30\x70\xbb\x45\xa7\x3d\x23\x73\x3b\x47\x6f\xef\xee\xb6\xbf\x8c\xfa\x4b\x25\x53\x97\x67\x98\x0f\x78\xbf\x93\x71\x1c\x7e\x38\xfd\x94\xa7\x42\xf4\x0a\x56\x03\xbe\xea\xb6\x01\x14\x5c\x6a\x54\x1f\xce\x44\x30\x3a\xf2\xd4\x14\xf3\x0c\x4b\x5d\xbe\x76\x72\xd6\x2a\x1e\xf8\x2a\xed\x29\x47\x52\x31\x7b\x67\xb4\x2b\xae\x95\x4b\x9d\x76\x3e\x95\xab\x10\x54\x3e\x4b\x1d\x6c\x68\x0e\xc5\x5f\x73\x0a\xe5\x8c\x7e\xbe\x1f\xb0\x44\x59\x1c\x7e\x87\xe9\x1c\x15\x76\x8f\x5e\xca\x8f\x42\x87\x78\xb8\xad\x00\xbe\xb7\x8b\x62\xd1\x59\x0c\xca\x8f\x41\x73\xcb\x03\xf4\x4d\x10\xa9\xdd\x64\x69\xbf\xf2\x45\x84\x1e\xe1\x83\xf8\x70\x29\x95\x39\x34\xf5\x84\x78\x5c\xdb\x59\x32\xcc\x08\xe6\x60\x1a\x3f\x9e\x68\x84\x0b\x72\xde\x99\xec\xa8\xb8\xdc\x77\x3e\x54\x10\x28\xf4\xa6\x29\xcb\x2f\x73\x2a\xfc\x59\x94\x87\x43\x59\xd4\xb7\x65\x65\x41\xb5\x97\xee\x26\x12\x5d\x2c\x62\x71\xfb\x34\x1a\xbd\x20\x51\x8e\x48\xf4\x11\xde\x71\xc6\xde\x15\xb7\x59\x51\x8c\xf3\xbe\x2a\x48\x34\x82\xc2\x97\x45\x53\x95\x47\x87\x7a\x51\x61\x98\x48\x7e\x09\x65\x2f\x04\xd9\xe4\xcf\xc7\x23\x31\x45\x8d\x47\xa1\xed\x6e\x8f\xab\x9d\x29\x2b\xc8\x5e\x8a\x9d\x9c\x2a\xc3\x57\xa1\xf4\x49\x8b\xd5\x66\x07\xf6\xa2\x86\x8e\x4e\x48\x45\xa1\x87\x65\xf4\x68\xf8\x2c\x2f\x74\x00\x2a\x0a\x63\x65\x13\xe5\xd3\x3c\x58\x5f\xe3\x43\x54\x6c\xa9\x23\x68\x5b\x42\xda\xb1\x2b\x47\x59\xc5\xa1\x8f\x5f\x61\x2b\x8a\x97\xc1\x78\xc7\x40\x68\x0d\x17\x39\x1d\x86\x4d\x54\x0c\xb1\x37\x12\xf5\xdf\x2e\x3e\x99\xa5\x49\x28\x42\x5b\xdb\x71\x0f\xee\x13\x3f\x9c\xf2\x59\x55\x89\xf1\xc7\x49\x62\x4a\x76\xef\x70\x27\x7e\x84\x77\x82\xc8\x2c\x8f\xa5\x72\x1b\xae\x4a\x44\x8a\xa4\xc9\xdf\xa0\xb9\x17\x75\xf3\x50\x3b\xef\x4b\xa5\x4c\x91\xe9\x7b\x92\x87\xf2\x8a\x0a\x6f\xf4\x5a\x29\x17\x08\x33\x71\xaa\xbf\xef\x14\x4f\xbd\xc2\x33\xb8\xee\x71\xd4\x53\x46\xc2\xe0\xb0\xb5\x4e\xfa\x25\x07\x2a\x15\xa4\x09\xb8\xb3\xc5\x3e\xc6\x8c\x39\x15\x54\x0a\x24\xaf\xb3\x11\x45\xd6\x20\xb0\x63\xe4\x39\x2b\xe1\x19\xfc\x1d\x3f\xbd\x57\x98\xdd\x3a\x87\xf4\xb3\xcf\x3e\xba\x36\x25\x36\x45\x4b\x77\x60\xb9\x14\xc7\x0c\x29\xe3\x8b\x04\x21\xd6\x5b\xcb\xbe\xc7\x56\xa2\x14\xe3\x28\xeb\x8a\x53\x63\x69\x61\x0a\x13\x89\x86\x51\x04\x53\x29\x9f\xe2\xb1\x0d\x88\xc3\x45\x77\x8c\xe8\x7b\x2e\x7b\xa6\x4a\x12\x8c\x73\xca\x6c\xcc\x30\xa3\x74\x9a\x24\xba\x13\x8f\x99\x57\xa5\xd0\x0a\x89\x4c\x46\x63\xa9\x21\xc0\xd5\xe3\xd0\x09\x73\x07\xf3\x1d\x8d\x28\x30\x1d\xb4\xfd\x96\x3f\x7f\xf6\x82\x83\x0a\x42\x0f\x95\xe1\xb2\xfa\x12\xcc\x7a\xec\x69\x02\xb6\x5d\x64\x80\x2e\x8c\x0b\x71\x12\x8e\x8b\x1c\xde\x7e\x99\x9b\xf6\x04\xc3\x57\x79\x40\xea\x42\xac\xf2\xba\x56\x11\x60\x3c\xe9\x0d\x18\xfb\x64\x6e\x6a\xc6\x7c\xcc\x6f\xd5\x7f\x56\xcd\xec\x52\xa5\xe4\x5a\x35\x0f\xbb\x3a\xfd\x61\x05\x92\xe6\x0c\x22\xe1\xa6\x69\x4e\x44\x1b\xa3\xcb\x39\xb7\xda\x3b\xce\xda\x6f\x4d\xff\xab\x4e\x40\x15\x22\x3f\x44\xf1\x5d\x54\xfa\x5d\x54\xb0\x86\xba\x3c\x55\x0a\x6a\x14\xff\x72\x0f\xf4\xb9\x26\x72\x22\x68\x84\x23\xa8\x70\x04\x9e\xff\x68\xc6\x6a\x5f\x13\xa8\xd7\x42\x7e\x36\x4d\x59\x8d\x28\x90\x03\x4f\x63\x30\xa3\xe3\x21\xdf\x39\xee\xe7\xb6\x25\x49\x31\xae\xb8\x83\xe1\x48\x44\x31\x63\x51\x3f\xf2\x60\x59\x4e\xb6\xdf\x47\x3f\x35\x4a\x3a\xa9\x91\xd3\xd1\x2e\xb6\x7e\xf1\xbf\x8e\xd2\x54\xc6\x8e\x9b\xe2\x46\x34\x62\x27\x9c\xad\xac\xe3\x30\xf0\x6d\x35\xd8\x5b\xa6\x61\x79\xa1\x4a\xfb\x74\xc1\xba\x2b\x25\x69\x29\x51\xd5\x54\xdf\xc6\xd2\xb1\x89\xd1\xca\xc5\xca\xf4\x2b\x67\xec\x9f\xed\xff\x3a\x61\x21\xee\x44\x8b\xb3\x84\x2a\xeb\x60\x92\x3a\x09\x48\x07\x87\x4c\xa2\x85\xa8\x3f\xb1\x2e\x74\xa2\x62\x2c\x75\x24\xba\xcd\xb2\xa2\x74\xb2\xbb\x4d\x1a\x01\x86\x80\x1c\x12\xa0\x5d\x3a\xae\x88\x47\x8b\x34\x48\x2e\x7e\xf3\x73\x31\x8e\xb7\x69\x19\x48\xaf\x93\x75\xad\x9f\xde\x41\xcf\xcf\x77\xb6\x5e\xe5\x6f\xc6\x4d\x09\xdf\xb3\xe7\xe2\xa2\xcc\x8a\xfa\xf9\x12\x2f\x1e\x3d\x44\x8b\x14\x03\xf0\xcf\x9b\xe5\x1a\x39\xc0\x76\x14\x0f\x76\x6f\x09\x3c\x46\xc7\x08\x49\xd1\xef\x16\x4f\x1b\xcb\xc9\xd4\xb5\x4b\xc0\x8a\xe3\x4d\x79\x00\x2c\x06\x99\xd8\xf8\x5c\x57\xf0\x30\x0c\x77\x5f\xbe\xac\x91\x6f\x65\x3a\xfd\xe3\xf6\x37\x6d\x78\x82\x6c\xd2\x22\xcf\x33\x18\xb3\x52\x69\x13\x27\x88\xe8\x95\xa2\x78\x45\x15\xac\x3e\x5f\xd1\xe0\x37\x82\x17\x85\x54\xc9\x85\xa7\x6b\x6b\xd1\x8f\xda\xd3\x14\x8b\xd9\x0e\xe2\x15\xb7\xae\x6c\x8c\xd7\x04\x16\x32\x8c\x74\x59\x1c\xe9\xcd\xa5\x16\x0a\x18\x44\x68\xe3\xac\x41\x6f\xca\x8f\xdf\x45\xf1\x0a\x50\x07\xcc\x95\x21\x00\xb7\x72\x0e\xf2\x84\x16\xad\x5e\x65\x1f\x30\x24\xb1\x0d\x3c\xf0\x19\xb1\x9d\xbf\x66\x79\xde\x93\x84\x70\xb9\x69\x08\xbc\x38\xea\x47\x08\x49\x6d\xa3\xd2\x8b\x71\x02\x06\x02\x1e\x60\x4d\x83\xda\x97\x65\x0d\x54\xc2\x3c\x7a\x58\x00\xd2\x04\x68\x1b\x14\x04\x9a\xcc\x46\xbc\x91\x10\x7a\x1a\x99\x13\x5e\x54\xad\xc6\x4d\x09\x10\x4b\x13\x1e\xdd\xe3\x46\xe3\x2b\x6b\xef\x61\xf2\xcc\x9d\x34\xc5\xb8\xfe\x0a\x22\x9f\x54\x3f\x5e\xa0\x59\x9d\xe4\xaf\x70\x9e\x9f\x91\xb2\xb0\xef\x62\x41\x94\xc4\x18\xd5\x42\xc8\x6d\x51\x76\xd7\x4a\xcf\xbb\x90\x28\x90\x93\xb1\x2a\xbb\xe2\x53\x88\x79\x84\x14\xb7\xdf\xca\x1c\xdc\x8a\x86\x24\xa6\x82\xb1\x2e\x14\xf8\x83\x8f\x41\x5c\x20\x21\x44\xee\x96\xcd\xf7\xd9\xda\x01\xf0\x40\x79\x92\x2a\xd4\xeb\xc5\xa9\xca\x4a\x57\x27\xec\x5a\x65\x6c\xe8\x70\x74\x56\x3c\xa6\x5b\xbe\x86\x84\x80\x8e\x53\xfc\x02\x7b\x51\xef\xb3\x43\xd9\x94\xc3\xc8\x41\x72\x0d\x13\x1d\x9b\x5a\xa0\x35\x49\x46\xbc\xc0\x45\x99\xbf\x8f\x67\x06\xe0\x01\x46\x7a\x16\xd5\xf9\xd8\x38\x96\x89\xba\x6b\xd5\x42\x12\xac\x50\x5c\x40\x38\x60\x82\xd8\xeb\x40\x81\x1d\xa5\x1d\xf3\x5c\x73\x9c\xb8\x32\xf6\xe5\xc7\x31\x2f\x2b\xe8\xe3\x31\xa8\x93\xf1\xfc\xc8\x23\x42\xcc\x0c\xab\x65\xba\xf8\x45\x9f\xa7\x6b\x70\x6e\x19\x2f\x88\xf0\x14\xda\xc9\xd3\xd9\xf1\x85\x6f\xb7\x3f\xff\x19\x2e\xd0\x78\x82\x63\xa0\x49\x41\x36\x9a\x8f\x86\x79\xc2\xca\x4e\xbe\x95\xaf\x30\x6b\x5c\x20\x65\xfc\x75\xfa\x61\x42\x77\x29\x17\x1e\x77\x13\xb4\x82\x9f\x20\x8e\x65\x71\x23\x0e\xe2\x05\xda\x9d\x06\xa7\xd0\x9d\x1e\x3f\xcf\x57\x18\x0d\x3b\x10\xef\xf5\x2d\x95\x14\x5b\x16\x96\x5f\xba\x4e\x1a\xd1\xff\x42\xeb\x2e\xe5\x7b\x4d\x3e\xef\x3a\xa7\x5a\x90\xa0\x8b\xbd\xc9\xa4\x6f\x6f\x78\xaa\x49\x73\x96\x2a\x89\x5a\xf7\xdd\xa6\x5f\xef\x0a\x53\x5a\xed\x1f\xf7\x02\x5c\x84\x9e\xc5\xa7\xe9\x9b\x7a\x44\x06\x6b\x7c\xe6\x63\x84\xe1\xee\x70\x2c\x2b\xe4\x16\x42\x5a\xa8\x2d\xd4\xcd\xcc\xdd\xc1\x0f\x03\x5c\xbd\x59\x51\x43\x65\x2b\x12\x68\xaa\x84\xd3\x84\x6f\xee\xba\x88\x88\xc2\x32\x55\x3e\x74\xd6\x91\xf1\x25\x31\x1d\x9e\xcb\x53\x65\x95\xad\x47\xaf\xa4\x88\x9f\x76\x55\x95\xff\x03\xd5\x6c\x85\x73\x66\x4c\x10\xeb\x80\xf5\x20\x61\x8f\xe2\x00\xf3\xf3\xe2\xe9\x69\xb2\xac\xdd\x84\xdc\x37\x64\xaa\x9f\xaa\x87\x65\xdf\x97\x33\x61\xa0\x30\xba\xb5\xad\x4e\x87\x23\x9e\x99\x5d\x4b\xa4\x10\x26\xb9\xfa\x7d\x35\xbc\xc2\xf2\x55\xd7\xa7\x83\x3b\x17\x93\x0b\x70\xd7\x84\xa0\x11\xec\xfc\xdb\xca\x9d\xa5\x26\xf6\x38\x82\x74\x4e\xb5\x65\xeb\xbd\xd6\xbb\x09\x3c\xd3\x5a\x5a\xe1\xc5\x5a\xaa\x10\x76\x39\x08\x70\x5c\xf2\x42\x26\xe1\x89\xe0\x8e\x4c\xeb\xcf\x53\xd6\x4f\x1a\x99\x54\xfa\x98\xb9\x98\x43\x53\x0d\xd5\x0e\x3f\x4b\x0e\x0e\xdf\x24\x55\x91\x03\x60\x23\x01\xf0\x30\xde\x3c\x1c\xda\x54\x91\x89\xdb\xba\xfa\x64\xb0\xec\xae\x78\xff\x03\xcf\x08\x3f\x4a\x94\x83\x08\x6a\xa8\x70\xd3\x1f\xd9\x6c\xff\xe5\x7f\x0c\x74\x0e\xf1\xef\x69\x77\x87\x88\x19\x62\x42\x41\x01\xf8\x5b\x70\x67\x8a\x51\x21\xc9\xa4\xda\x16\x0c\xa7\x60\xa5\x87\xeb\xa0\xc1\x24\x04\x90\x3f\xb4\x8b\xa9\xa9\x06\x00\x9e\x31\xd7\xd0\xa4\x21\x6e\xb4\x09\x59\xe8\x18\xa3\x9a\x61\xe5\xdc\xf4\x28\x42\xea\xb9\x0c\xf2\x2d\xd2\xd5\x3c\x9d\xfa\x1e\x74\xef\x7b\x19\xab\x65\x28\xac\x5c\xe9\x64\xe0\xd1\x18\xdf\x06\x61\xca\xb2\xb9\x29\x0f\x17\x37\xc3\x18\x43\xcc\x0a\x94\xd5\xb2\x9e\xe8\xd4\xe7\x62\x9e\xc7\x03\x74\x5a\xc5\xe1\x6e\x0d\x42\x9f\x27\xb7\x1f\xe6\x79\x49\xa8\x4d\xe7\x62\x4e\x9a\x57\xcc\xf3\x52\x0f\x03\x63\x14\x09\x73\x1e\xf0\xb7\xaa\x7c\x6f\xf6\x8b\x12\x8c\xc9\x54\x06\x7d\x59\xd5\x80\x79\x2c\x4c\x10\x00\xfe\x33\x2b\xea\x7a\x2f\xaa\xd1\xeb\x71\x69\xc2\x31\xf2\x7c\x18\xb7\x77\x80\xa8\x76\xbe\x44\x7f\x8c\xa0\x42\x53\x9b\x24\xf3\xb8\x09\xd0\x63\x38\x4c\xa2\xef\x6c\x27\x9f\x49\x34\x1e\x1e\x4f\xcd\x5f\xcb\xa2\x7d\xee\xf4\xd6\xcc\x3c\x9f\x87\x88\x17\x74\xd0\x93\xd6\x69\xfa\xe4\x9e\x51\xe4\xc0\x0a\x4d\xee\x50\x94\x57\x35\x2f\xa3\x6b\x54\x80\xf8\x07\xb4\x19\xbf\x43\x7e\x74\xa7\x34\xf3\x82\xd0\x17\x94\x62\xac\xde\xa0\x5a\x16\x54\xed\x71\x22\xf8\xfb\x27\xa9\xde\x4f\x8e\xd0\xde\x91\xc7\xbc\x40\x1b\x4e\xaa\x04\x95\xb6\x45\x76\xee\x91\xa1\x17\x60\xa8\x61\x8d\xfc\x4f\x23\x05\x05\xf7\x4d\x43\xee\xe1\xca\xb4\x89\x46\x9b\x8c\xbb\x54\x88\x33\x2f\x04\x52\xc0\xaa\xe0\x20\xaa\x57\xe6\xfe\x1c\x31\xe5\x59\x2c\x97\x2d\xb1\x1d\x09\x8c\xff\x4d\x50\xcf\xdd\x26\x88\xc0\xa2\x2e\x9e\x0b\xf4\xfb\x3b\x88\x54\xff\x06\xac\xeb\x9f\x08\xac\x05\xb1\x82\xff\x28\x0c\x64\x9b\x12\x4f\x19\x1b\x21\xb8\xbf\xff\x41\x91\xea\xd8\x35\xa6\x21\x41\xbe\xde\xca\x06\x6e\xcb\xea\x39\x6f\xb2\x83\x68\xc0\x52\x47\xf6\xb8\x6e\xbb\x27\xa5\x51\x82\x74\x86\x0f\xe2\x7f\xf7\xa2\x6e\x1e\xcb\xa6\x63\xcf\x64\x5e\x1a\x93\x5e\xfa\x7d\xf9\x62\xa1\x5d\x9f\x4c\xa3\x54\xc4\x48\x67\xba\x80\xaa\x69\x32\x73\xbe\x18\xd5\x5f\xc1\x30\x98\x27\x18\xe9\xfb\xa1\xa2\x7a\x71\x9d\x70\xc1\x1e\x92\x5d\x36\x8e\x53\x91\x35\x67\xe4\xa5\x19\x75\x8b\x62\xdf\x32\x37\xce\xac\x6e\x44\xbb\x7f\x3b\xab\xb2\xed\x90\xc8\x70\x98\xfc\x5e\x88\x3c\x97\x42\xbd\x8e\x93\xe0\xee\x0a\x05\x94\x25\x7c\xda\xcc\xa1\xd9\xe4\x65\x73\xb9\x99\x89\xd0\xc1\x43\x14\xa9\xdd\xc5\xc6\x32\xab\xa3\x5f\x2a\x99\x16\x3d\xf5\x5e\x84\x1a\xf5\x64\x81\xda\x1e\x26\x90\xe8\xf0\xe7\xe5\x49\x3f\x94\x65\x2e\xf6\xae\x49\xf1\xc8\x73\x72\x68\xdf\x90\x53\x08\x49\xc5\x7a\xb2\x1e\x6d\xa7\x20\x46\x2e\x75\x29\x47\x3f\x44\x25\x9e\x47\xa4\x13\xcd\x1a\x54\xf6\x06\xe3\x2d\x4d\x25\xbe\xf0\x5d\xf1\x16\x31\x2d\xb5\xff\x57\x9e\xce\xe3\x3b\x49\x85\x20\xd4\xdf\x45\x79\x9d\x86\x60\x9e\x16\x1c\xa1\x54\xf5\xa9\x7a\x83\xf3\xb2\xd0\xb3\xc6\xbd\x9c\x96\x42\xdb\x68\x8e\x18\xee\xfa\x5f\xf2\x0d\x30\x4f\x2b\x15\x58\x2b\x62\x03\xa0\xf1\x50\x9e\xf2\xc9\x99\x07\x5e\x88\xb5\xf6\x52\xc3\x1b\x22\xb2\x3e\x99\xab\x10\x4b\xbc\xe3\x16\x83\xd9\x97\x1d\x00\x12\x9f\xb2\xb1\x7b\x50\xaf\xb3\x42\x5b\x6d\xca\xc9\x5c\x3a\x63\x5e\x00\x68\x54\x7c\xcb\x4b\x29\x72\x97\x8a\x1e\x21\xae\x87\xbf\x85\x79\xb1\x44\x07\x18\xd9\xa7\x37\xa7\x43\x4f\xe3\xbc\x6d\x15\x01\x56\xb8\xbe\x39\x50\x9c\xc5\x51\x8c\xee\x61\x25\x95\x85\x6e\x3d\xec\xac\xab\x1d\x60\x8c\xc7\xbe\x76\x1c\x77\x1d\x8d\xcd\x4c\x6b\x32\x66\x32\x7b\xca\xb9\x08\x26\xe3\x89\xbb\x2e\x25\x9a\x8b\xba\xa9\x16\x58\x0f\x3b\xc9\x73\xe8\x3a\xcb\xd8\x90\xac\xd0\xf9\x1b\xd5\x17\x53\xc0\xb9\xff\x43\x38\x90\xca\xd2\xa6\xb4\x49\x09\x17\x55\x73\x71\x92\x0d\x4c\x54\x71\x38\x5b\x83\x31\xdf\xe3\x58\x62\x68\x3e\x3e\x5e\x33\x55\xa2\x06\xe0\xc5\xba\x65\xcc\xd7\x24\x6d\x43\x4e\xf6\x37\x28\x3c\x5b\xfc\xd7\xec\x6f\x8a\xa1\xcf\xc7\x58\xc4\x04\x06\x50\x7e\x1b\xdb\x52\x83\x9f\x15\xf9\x54\x4e\xa6\x61\x10\x15\x66\x2c\xd2\xc6\x15\x22\x3c\x40\x23\x5a\xa7\x72\x48\xf5\x3f\x9c\x15\xb1\x1f\x3a\x95\x53\xbb\x2d\x7c\x43\x41\xeb\xe1\x37\x8c\xd3\x88\x90\x0e\x36\xf6\x86\xe3\x72\xea\x25\xd2\x19\x4b\x94\x54\x69\x2f\xaa\x32\x08\x4c\x4e\xce\x6b\x96\xf2\xd8\x96\x30\x0e\x0c\xa2\xab\x84\x88\x8d\x29\x30\x96\xfa\x0a\xe9\xef\x31\x86\xb1\xca\xc5\x19\x29\x7a\x06\xe3\x22\x18\x55\x16\xb7\xbb\xe6\xd1\x4a\x21\x5c\x18\x2a\xfb\x26\x62\xdb\x57\xa0\x29\x31\xcf\x1a\x55\x66\xc5\xf2\xdc\xfd\x18\xe1\x53\x52\xc5\x94\xd5\x80\xa5\x73\xf2\xac\x64\x22\xe0\x48\xbe\xb1\x28\x0b\xd8\x3a\x85\x47\xfc\x7b\xca\x5d\x5d\xfb\xe9\xf0\x64\xee\xcb\xa6\x81\xea\xec\x90\x9f\xae\x17\x84\x91\x25\xbb\xdc\xe4\xe5\x8b\x28\x86\xbb\x85\xed\x25\x3d\x0f\x0d\x24\xcb\xac\xd5\x5d\x2d\xa3\x10\x2c\x96\x6d\x55\x95\x47\xa8\x9a\x73\x7b\x2a\x5a\xe6\xbc\xd3\x35\xe3\x25\x63\x2a\x00\x8a\x6c\xa3\xea\xcb\x2d\xc0\x6d\x25\xd4\x15\xfa\x9e\x31\xa5\xe2\xb4\x2f\xc8\x45\x14\x72\x48\xf3\xff\xff\x93\x18\x64\x4c\xfb\x1e\xda\x42\x0f\x62\x2f\x72\xd1\xdb\xc1\x98\x8e\x00\xf3\xe0\xcf\x9b\x9b\xae\x18\x99\x31\xad\x35\x1a\xe5\xdb\xea\x04\x3f\xe0\x45\x14\xed\x25\x2e\x29\x65\xfb\x40\x44\xc2\x3d\xe8\x1e\x3d\xc9\xff\xb9\xbf\x9b\x94\x70\x51\x5d\x4d\x20\x0e\xf6\x27\xdb\x9b\x51\x0a\xe3\x6f\x76\x02\x6c\x4a\xe3\xbe\x1d\xf7\x7c\x8e\xf9\x9b\x76\x18\x9f\x0c\x26\x68\xd6\x94\xa8\xed\x7a\x08\x8e\x22\xf5\xad\x1f\xf2\x28\x8e\xaf\x9d\x97\xdb\x36\x25\x18\xf2\x5b\x55\x70\x14\x15\xac\xcb\x3c\xa7\xcc\xcc\xe4\x3a\xe0\x9e\x54\x58\xbd\x8d\x38\xa2\x35\xa8\xf2\x0d\xaa\x45\x99\xe7\xa2\x81\x4a\xe4\x4f\xc5\x1c\xf6\x22\x37\x97\x14\xd3\x24\xc6\x90\x71\x16\x0a\xc4\x24\x3c\xc2\xfb\x33\x79\x6d\x0f\x94\xc1\x1a\x75\x93\x29\x66\x63\x36\xf3\x65\xef\x53\x70\x1e\x04\x9e\xad\x7f\xda\x1d\x73\x51\x40\x5f\xaa\xbf\x6d\x0f\x25\x06\x90\xa5\x4b\x8d\x6d\xd4\x1e\xf2\x3c\x2b\x5e\xd6\xfd\x64\xf5\xe8\xa7\xf1\x84\xa3\x6b\x22\xb4\xc6\x6d\x77\xaa\x2e\xb2\xed\x95\x78\x17\xd0\xc4\x27\x10\x84\xde\xca\xe5\xbe\x47\xee\x02\x5d\xb0\x2b\xad\x7d\xe4\xde\xd5\x8f\x0d\xe2\xa8\x73\x78\x43\xc3\x6a\xb4\x9d\x71\x5f\x78\xe2\xc2\x2b\xdd\xdf\xaa\xb9\x2f\x02\x94\x13\xee\xe6\xcf\xc7\x27\x1f\xcd\x57\x12\xd1\x63\x87\x5d\x71\x3a\x10\x5d\x97\xbb\x47\xe0\xf9\xb8\x07\x35\x20\x0e\xdb\xf7\x12\xc3\x30\xab\xfe\x58\x06\x22\x72\xb1\x3f\x82\x48\xf4\x68\xf9\x19\x0f\xb9\xc4\x6c\x1b\x39\xb8\x17\x0a\x92\xeb\x83\x87\x47\x01\xf1\x74\x6e\x97\xbd\x14\x59\xfb\xe7\x44\xda\x4d\x61\xf6\x26\x1a\x51\x5d\xa3\x7d\x19\x8f\x22\xa6\x02\x4b\x97\x37\x3b\x5d\x48\x8a\x46\xb3\x2a\x8a\x02\xeb\x20\x39\x4d\xb9\xe9\xf1\x88\x22\x62\x30\x5c\x94\x07\xca\xb9\x8e\xbd\x24\xf2\xa9\xfe\x1b\xfe\xd1\xfb\x7f\x13\xf9\x8d\xff\x72\xef\x0f\x77\x4b\xcd\xd3\xf6\xd1\xff\x3b\xd5\xcd\xad\xc8\xf2\x35\x41\x03\xdc\xaf\x8c\x03\x4a\x81\x58\x10\x44\xbb\x3d\x61\x46\x07\xea\xf1\xfc\x8a\x43\xaa\x04\x30\x00\x03\x80\x1f\xe3\xb1\x26\x02\x02\x8a\xb2\xdc\x96\x95\xdd\x66\x9c\x3b\xc5\x13\x4e\x42\xaf\x8e\x0b\xe5\xb9\x20\x9a\xdc\xae\x3d\x81\x38\xb2\xc3\xb3\x24\x7e\xb3\x07\x9b\xdf\x77\x5d\xd2\x30\xc2\xdc\xf4\x4b\x39\x17\xea\x75\x5b\xf6\xb0\xa3\x5d\x97\xf6\x36\x84\x23\x98\xe0\xcb\x60\x3c\x4d\x19\x27\x7e\x87\xfa\x24\x6d\xd9\xe9\xbf\x4e\x97\xea\x53\xc6\x53\x41\x34\xc6\x05\xbc\xdf\xa9\x72\x72\x49\xfe\xd3\x7f\xdd\x1d\xad\xdd\x86\x68\xaa\xa2\x18\x65\xc2\xdb\xf6\x04\xb4\xf5\x3f\x11\x33\xb1\xbd\xb0\x06\x75\xbf\x4b\xc7\xb8\x1b\xdb\x32\xb8\x0d\x7c\xa1\x24\xf7\xa9\x6c\x75\xc0\xb8\x08\x05\x69\x25\x0f\xb5\x50\x5d\x6b\x2c\x81\x58\x8f\xf6\xed\x7a\x76\x7f\x96\x1c\xf0\xcf\xa6\xac\x5e\x1f\xba\xbf\x2a\x4f\xe2\x5c\x70\x7c\xb3\x9f\x15\x5e\x8f\xde\x40\x79\xca\x49\x1f\xfc\x1c\x51\x0e\x33\xae\x62\x8d\x51\xcd\xdb\xa7\xe7\xc7\x9b\xe5\x7a\xf7\x73\x76\xbf\xdc\x76\x0f\x94\x0a\xa1\x0e\x48\x52\x58\x5f\x53\x03\x30\x0e\x09\x47\x8d\x91\x7b\xc2\x2f\x61\x59\x85\x6b\x52\x69\x70\xc9\x6b\x52\xdc\xb1\x2c\xf3\xc9\x38\x14\x07\x4d\x2a\x14\x35\x34\x37\xb3\xa7\x59\xa1\x89\x91\x2a\x7b\xf9\x64\x69\x03\x00\x65\x17\x0a\xa1\xd0\x7a\x18\xfd\x2c\x93\xf8\xd2\x62\x85\xad\xaf\x58\x56\xcf\x85\x2c\x91\xf7\xe5\xfe\x33\xda\x48\xe6\x7b\x9e\xb6\x12\xc0\xaa\x2c\x34\x9d\x9d\x1d\xbe\x9a\xf9\x5e\x60\x04\x15\x60\x0c\xf4\x11\x98\xcf\x3c\xcf\xc5\x1c\xee\xc1\x34\xed\x31\xf8\x13\xb2\xe1\x8f\xf4\x59\x4c\x74\x89\x3b\x82\xd4\x3e\xd7\x50\x2d\xb2\x4f\xa8\x5d\x18\x52\xbb\xa3\x8b\x02\x55\x66\xce\x3f\x87\xf4\x37\xe3\x7f\x7b\xb8\x48\x8a\x95\x4e\x86\xbe\x7c\x1e\x45\xa4\x6d\x50\x20\xdd\x80\xdb\x4b\x7c\x2e\x69\x07\xec\xc0\xb1\xeb\xd9\xf3\xc6\x35\xfa\x10\xa3\x36\xcd\xb7\x8f\xc5\x85\x94\x77\xf4\x01\xfd\x20\xf1\x88\xba\x5a\x34\xb0\xca\x45\xf1\x64\xa8\x66\x79\xfa\x70\xf5\x83\x34\x35\xac\x3b\xc6\xfa\xf4\x86\xcc\x0f\x44\xca\x45\x2f\x98\xef\xb0\x14\x9f\xb1\xc3\x0c\xbc\x0b\x3f\x0c\x88\x64\xab\x3d\x1a\x9a\xf2\x70\x57\xcf\x4f\xe7\x31\xac\xc4\x76\x8d\xd2\x54\x43\x0f\xc9\xf3\x38\xad\x1d\xde\xf6\x14\xc2\x0f\x2d\xbd\x56\x57\x6d\xcb\xfc\x24\x11\xd0\xb1\xc2\xf5\xf2\x96\x9f\xc3\x7d\xda\x6b\x48\x4a\xf3\xa6\xcc\xfb\xf0\x4b\xe6\xa7\x21\x60\xac\x49\xbf\x7c\x0c\x83\x0d\x7e\x9a\x48\x8c\x35\x03\xba\x98\xbd\x33\xc0\x4f\x53\x2e\x2f\x45\xce\x3f\x45\x55\x89\xa2\x39\x8f\xde\xe2\x1f\x45\xcd\x7c\x11\x9b\x54\x10\x36\x65\xff\x38\x08\x96\xf8\x42\x06\x18\x4e\xd9\x55\x14\xca\xbb\xfc\x5d\x21\xbc\xf5\x90\x15\xbb\xba\xb5\x14\x06\x66\x97\x2f\x85\x8a\x7b\xa4\x31\x59\x27\x6a\xc5\x7c\x29\xa9\xba\xd2\xd5\x3a\x0c\xfd\x86\x7f\x0d\x13\xb2\xcc\x97\x2a\x01\x42\xde\xc9\x1c\x6e\x60\x8d\x80\x49\xb5\x47\xf1\xa9\x9d\xcf\xb9\xbb\xad\x8a\x34\x73\x02\xde\x74\x0b\x24\x38\x9f\x4a\x02\x31\x5f\xb7\x7e\xdf\x25\x48\x64\xf7\xf9\xe1\x3e\xe2\xeb\x98\xea\x9d\xdb\x73\xa2\x3d\xf5\xb6\xf7\xbf\x1f\xa1\xba\x18\xfc\xbe\x4e\x15\x82\xb9\x11\x32\xb1\xbd\x7b\x58\x76\x0d\x8a\xb0\x50\x4e\xad\xdc\x10\x57\xd4\x78\xdd\x80\xcf\x70\x6c\x5b\xe7\x2b\x6b\x84\xbb\x1a\x02\x81\x70\x8c\x6e\x41\xe2\x04\xed\x89\xd1\xb9\x7e\xa9\x87\xa7\xef\xf1\xd4\xd8\x10\xdc\xb8\x9d\xa3\x3e\x44\x59\xc0\x43\x96\xe7\x5d\xf6\x8f\xf9\xa0\x79\x4a\xb8\xe9\x17\x0a\x7d\x5c\x21\x35\x98\x6f\x42\x4f\x0b\x5b\x33\x4e\x6f\xbd\x2d\x2f\xfc\xb2\x53\x89\x11\xe6\x9b\x58\x63\xb2\x69\xb3\x5c\x3c\x3d\xde\x6c\x76\xf3\xe5\xf6\xe7\x72\xf9\xb8\x5b\xb7\x07\x8c\xdb\x53\x02\x2f\xf4\x25\x9a\xe4\x50\x37\x3b\xa1\x5b\x33\x09\x3f\xa6\x29\xab\x5f\xba\x5c\x4f\xb7\x52\x03\x2f\x0d\xa8\x40\xe3\x24\xf3\xac\xde\xbb\xe8\xc0\x30\x0b\xca\x6c\x67\x26\x18\xfa\x6c\x48\x90\x97\xc3\xa1\xfb\xcd\x01\x37\x81\x2d\xd2\x7d\x39\x15\xba\x74\xcb\x28\xf0\x19\x47\x4d\x59\x7d\xaa\x9b\xa6\xac\x90\x72\xff\xe8\xc8\xe9\xdb\xe6\xd4\x4b\x9c\xa6\x03\xa2\xb5\x26\x0f\xb1\xc0\x0f\x7c\xfc\xe4\x65\x01\xda\x09\x92\xb0\x20\x08\x0d\x22\x8b\x55\xa0\xba\x3f\x45\x80\xc8\x05\x89\xfa\xde\xf5\x0c\x8b\x26\x08\x8b\x77\x03\x5d\x90\x29\x08\x85\xa0\x8a\xdf\x76\x55\x3f\x9c\x9b\x3d\x7c\x7c\xae\xf2\x1a\xb0\x20\x62\x52\xd8\xfe\x0a\x88\x99\x08\x0b\x3f\x7a\xbc\x23\x2c\x88\x2c\x1d\x1b\x49\xab\xf4\x4b\x87\x59\xfb\x5a\x4e\x4d\x74\x71\xaa\x88\xf7\xff\xb2\x6a\x83\xd8\x8b\x3c\xe1\x80\x3b\x68\xcf\x3a\xad\xa8\xf1\xba\x09\x62\x8f\xa4\x73\xa9\x40\xcb\x11\x66\xba\x46\x60\x78\x0e\xd2\xc9\xf6\x74\x6c\x1d\xf8\xd6\x34\xa0\x68\xff\x78\x54\x63\x63\xd0\xd3\x95\x59\x63\xde\x75\x7f\xcb\x0c\x12\xe6\x63\x38\xe0\x36\x7b\xd9\x5f\xb3\x03\xd0\x39\xd8\x79\x1c\x41\x9a\x86\xb8\x5d\x39\xff\x68\x8d\xb5\x95\x5f\xd3\x93\xb2\x40\x06\xa9\xcb\xac\xb6\x5e\xcd\xfd\xd3\x76\xf4\x7e\x32\xa6\x68\xab\xa5\x7b\x33\xe6\xef\x8c\x57\x77\x5d\x12\x22\x33\x53\x56\xaf\x90\x07\x7f\x34\x82\x52\x6a\x7c\xae\xa6\x6a\x24\x4a\x45\x4f\xbf\xa2\xe2\x02\x89\x66\x68\xfc\xbe\x8b\x42\xe7\xd3\x64\xf9\x2c\x50\x7e\x1c\xf7\x0a\x87\x45\x0e\xd7\x15\x9e\x2c\x50\x96\x0a\xe7\x20\x3e\x68\x82\x58\xbe\x73\xd7\x0c\x02\x4b\x97\x9d\xe8\xfc\x4c\xeb\xab\x9d\x29\xd0\x71\x82\xc0\x94\x9b\xe5\xe2\xee\x61\x76\xbf\xfb\xbf\xe5\xfa\xa9\x5b\xfe\x5a\x7a\x98\x33\xbf\x2f\xeb\xe1\x8f\x4a\x3e\x2d\x52\x9c\x1e\x44\x2d\x13\xf4\xb3\x88\x41\xa1\xac\xfa\xa4\x92\xb6\x0b\x70\xc0\x2e\xef\x22\x7f\xdd\x96\xa8\x5f\x30\x28\x8b\x74\xdd\x80\x61\x79\x5c\xaf\x88\x91\x25\xed\x9e\xba\xb3\xfd\xec\xbb\x87\x1e\x8b\x4c\x30\xe0\x53\xe9\x63\xb4\x58\xe8\x99\xc0\x99\xb2\x9b\x73\xbb\xb6\x87\xf3\x25\x64\x69\x60\x88\x58\x8e\x90\xd1\x3b\x2c\x3a\x1b\x85\x3a\x42\xce\x21\xb0\xa9\x98\xef\xd9\xcb\xfe\xa7\x18\xe3\x79\x59\xc8\x83\xc0\xf7\x6d\xc9\xc2\xaf\x59\x5d\xcf\xb7\x8b\xd6\x91\x74\x99\x96\xcf\xa8\x12\xed\xd5\xbe\x97\x7a\xd0\x55\x21\x89\xb7\xb2\x5a\xd6\xaa\xba\xd4\x5f\x4d\x0f\x78\xe8\xfb\xd2\xf9\xff\xad\x61\x6c\xb5\x56\x5c\xa3\x8e\x42\xab\x1b\x72\xaa\x60\x35\x42\xac\xb7\xed\xb1\xdd\x20\x5d\x68\xe0\x4a\x8a\x78\x38\x5f\xc3\xd6\x0e\x1e\xf1\x42\x3e\x66\xc5\xff\xc4\xf4\xe1\x13\x06\x02\x34\x7c\x9a\xa7\x1e\x75\x0e\x99\x87\x49\x6d\xfb\xd7\x55\xd5\xf7\x6b\xc3\x30\x10\x18\x01\xcd\xea\xfa\x34\x8a\x73\x87\x61\xe8\x68\xcb\xca\x0a\xae\xeb\x53\x58\x18\x71\x88\xd2\x0e\x18\xf3\x58\x6a\x20\xa5\xb7\xd1\xa4\xfe\x2f\xff\xe3\xbf\xe1\x1f\xee\x9a\x28\xc4\x40\xf5\xbb\x3b\x60\x27\x0f\x99\x30\x32\x5a\x5e\xca\xd9\x51\x17\x62\xf8\x72\x89\xaf\x90\x1b\x60\xe7\x40\xab\x95\x46\x84\xee\xe5\xd4\x9a\x1e\x8e\x24\xf4\x22\x2b\xd7\xe9\xa4\xd3\x07\x44\x41\x6d\x0f\x61\xc9\xd2\x09\xde\xbd\xb8\xa2\xab\x67\x61\x62\x0d\x26\xa1\x35\x61\xa5\x28\xdd\xff\x5f\x16\x47\x7f\xf4\x56\x78\xe2\xba\x6b\xe2\xf4\x6d\x3f\x17\x8a\x44\x5f\x8e\x89\x30\x0d\x0d\xa6\x83\x67\xf7\xf7\x4f\x8b\x9d\xd3\x84\xed\x5a\x63\xc6\xed\x61\x84\x5f\x60\xd9\xec\x1d\x7a\xfe\x33\x46\x1d\x7b\xa5\xf0\x34\x16\xf8\xef\x8e\x95\x23\x45\x20\xf7\xf4\xaa\x66\x7e\x38\xb0\x52\x51\x45\xe7\xf7\xc5\x6a\xdb\x3f\x86\x42\xa9\x7d\xd2\x8e\xa8\xe0\x58\x56\x0d\x19\x30\x83\x47\xaa\x98\xd8\x89\xc5\xa9\x29\xd7\x50\x34\xf3\x73\xeb\x9b\x4c\xfb\x46\xa1\xd6\x31\xe6\x96\x0a\x78\x5f\xa3\x34\x06\x19\xb1\x03\xd3\x78\x74\x09\x80\xc0\xb2\xef\xb7\xd6\xab\xeb\x68\x5e\x59\x08\xc6\xc7\x54\xcb\x3b\x64\x17\xa6\xc1\xf6\xcf\xe4\x50\x20\x8a\xfb\x6b\xa5\xad\x2f\x42\x1b\xa1\x61\x54\x52\x99\x23\xe2\x68\x8c\x29\x66\xa1\x09\x62\x4c\x2e\x68\x50\xa5\x06\x74\x1b\x5b\x9f\x77\x04\x97\x63\xa1\x49\x83\xd4\x82\xec\x2d\x68\xc4\x59\xf4\xa1\x11\x9a\xb9\x6a\xe0\x5d\xb3\xaf\x00\x2c\xb9\xe8\xf2\xcf\xbb\xce\x6e\x09\x8d\xa1\x4d\x49\xe5\xe5\x05\xb2\xdb\xcf\x41\x44\xcc\x4b\x30\xc7\xbf\x5c\xaf\xef\x7b\xa1\xe3\x88\xb3\x08\xe3\x17\x5a\x94\xdd\x9f\x7c\xe2\x95\x5b\x88\xc3\x51\x64\x2f\xc5\x67\xe5\x20\x9f\x8a\x6a\xf5\xbf\x7c\xe4\x0b\x23\xa3\x2b\xa2\xfa\x64\xfb\xbd\x63\xa9\x67\x91\x2f\x43\x61\x39\x1a\x9f\xeb\x1e\x9d\x26\x8b\xda\x0d\x53\x93\x9b\xbc\x2a\x5f\x5b\x53\x16\x45\x10\x29\x78\x7d\xdf\xab\x84\x1d\x7e\x99\x28\xe4\x69\x28\x1c\x5f\xeb\xc7\xea\xb2\xa2\xef\xf4\x85\x44\xec\x6f\x30\x21\xf6\x56\x91\x97\x20\xf8\xd6\x86\x71\xe0\x70\xcc\xbf\xa2\x50\x99\x48\xf8\x45\x91\x62\xc6\x06\xa0\x96\x39\xbc\x5d\xd0\x56\x83\xbd\x20\x8a\x40\x20\x2c\xee\x2f\x10\x75\x23\x74\x4d\x5a\x3e\xce\x48\x8f\xe2\xc8\x58\xc4\xd5\x53\xf5\x22\x8a\xec\xaf\xf1\xae\x1b\xc5\x8a\x1b\x7b\xf2\xda\xf0\xc6\xdf\x7d\xb2\xe1\xf5\x49\xc8\x84\x9b\x6c\x44\x5c\xf7\x9f\x13\x54\xe7\x09\xfa\x2f\x16\x25\x11\xc3\xe8\xeb\x5b\x99\x9f\x0e\x24\x76\x3a\x9c\xd5\x51\xa2\x21\x8c\x6d\x28\x1d\x53\xe4\x9f\xd0\xc6\xdb\xee\x69\x44\xba\x58\xae\xfa\x72\x49\xf2\xa5\x9f\x99\x43\x5f\x11\xaa\xd9\x3b\x0a\x26\x23\xc2\xb5\xfc\x79\x72\xe0\x37\x16\x09\x88\xa3\xe4\x42\xe7\x30\x91\xf6\x8e\xa4\x22\x61\x07\x7b\xc4\x1c\xf3\xac\xe9\xe5\x62\xfe\xfb\xc7\x70\x24\x94\xa7\xfd\xc4\xa1\xd5\xd6\xd0\x54\x19\xbc\xf5\xf8\xd6\x0a\xd3\x85\x93\x23\xe5\x1b\x04\xf8\x42\x9e\xbd\x64\x57\x50\xae\xd1\xeb\xab\xc8\x4f\x1c\x96\x95\x72\xe5\x0f\x70\x28\xab\xb3\xcf\xe6\xed\x18\x74\xf7\x4c\x68\x57\x96\x70\x2e\x1d\x9f\x12\x8b\x54\x1a\xf1\x9e\xc2\x37\x45\xc6\xa7\xbe\x92\x52\x1a\xf1\xbd\x79\x6b\x06\x77\xf4\xbf\x2c\x52\x86\x0a\x11\x9f\xef\x17\x5f\xa4\x0e\x22\x2d\x62\xbc\x9c\xea\xc5\x9f\x37\x37\x8b\xe5\xe3\x76\xb7\x5a\xdf\x2d\xba\xd5\xad\x55\x1c\x59\x39\xd6\xed\x3e\xab\x34\x39\x66\x28\x6d\xd6\x88\xc3\xb1\xeb\x66\x48\xc4\x4b\xe5\x20\x8a\xd3\xf1\x79\x7d\xdf\xfd\x44\x08\x49\x4a\xad\x86\xc6\x81\x8b\x86\x6f\x01\x91\x46\x87\xca\xa6\x13\x5c\x49\x91\x6b\x8d\x3d\xfc\x9c\x79\x56\xbc\x6e\x4b\x4a\xac\xfd\x1c\x14\xf0\x8d\xd6\x81\xe1\x44\x7e\x58\x23\x47\xd6\x3c\xfb\xba\x3a\x90\x45\x26\x0c\x88\x84\xc9\x91\xde\x4e\x5a\x2e\xb1\x97\xc6\x41\xd2\x23\xff\xb9\xa9\xca\xc2\xed\x74\xb1\x27\x02\x2b\x88\x79\xa9\x09\xf6\x83\x41\x90\x35\xf6\x80\xe4\x6e\x1e\xb2\x22\x7b\x40\xc2\xa3\x2b\xe8\x53\xd7\x13\x3c\x4a\xcf\x23\x45\xc7\xe0\x75\x63\xe6\x0b\x0c\x26\xe8\xac\x02\x45\x0c\x15\x33\x62\xa8\x73\x2f\xc3\x12\x2f\x6a\x47\x6c\x9f\x35\x97\xe2\xf4\x55\x05\xaa\xa3\x18\x61\x31\x4f\x09\x01\x84\x00\x50\x72\xcb\xfb\x12\x8c\x2e\x76\x15\x73\xed\x25\x9e\xf3\x50\x06\xc8\x02\xdb\xc1\xf7\x0d\x86\xc9\x4c\xd9\x67\xd1\x64\xb1\x2f\x59\x62\x3d\x80\x9f\x90\x4d\x80\xa6\x62\x5f\x71\xbc\x72\xbd\x5c\xde\x0e\x2f\x35\x46\x2a\x67\xa4\x7f\x96\xe0\x8c\x83\x40\xeb\x80\x52\x4b\x54\xfc\xe1\xfe\x2e\x52\xcc\x1f\x5b\x46\x8a\x6b\x84\xcd\xb4\x11\x12\x07\x86\x21\x7d\x0d\xad\x85\xf5\x6c\xeb\x96\x40\x1c\x4a\x2a\x43\xba\xc4\x91\xfa\x14\xf0\x83\xed\x24\x8e\x3c\x61\x94\xcd\xed\x61\xe6\xb9\xfe\x9e\xb5\x76\xf6\x79\xf4\x89\x23\x9f\xa3\x68\x86\xab\xfe\x68\x1d\xbb\x1e\x65\x7c\xff\x7c\xb9\x3a\xe1\xbe\x9c\xce\x71\xe4\x47\x58\x90\x65\xc5\x53\x37\xd9\x5f\xd0\xfd\x92\x48\x01\xee\x9e\x77\xf5\x34\x47\x30\x8b\x63\xbb\xeb\xd2\x87\xbe\x75\xfa\xc2\x89\x6b\xf6\x03\x0a\xc8\x1d\xa1\xf8\x26\x0e\xb0\xca\xc5\xf9\x71\xe4\xfb\xc7\xb1\x30\x28\x7a\xb9\xbd\x5b\xae\x77\x7c\x37\x7f\xfe\xdd\x95\x61\xb2\x38\x89\x58\x6c\x7a\x44\xbc\xa0\xaf\xb5\x32\x58\x9c\x46\x12\x4d\x2f\xac\xa9\x75\x5a\xec\x93\x41\x56\x77\x41\x4a\x5a\xba\x1a\xc8\xb6\x6f\xcd\x45\x94\xdb\x9c\xc8\xe9\xc5\x82\xa7\x9e\x8d\x13\x11\x5a\xa3\x27\xd4\xc8\x62\x11\x47\x71\x57\xc1\xdf\xd4\xfd\xe8\x53\x2c\x62\x1d\x75\xb8\x2f\x1b\x72\xc5\x48\xde\xf0\x6d\xa4\x1f\xe0\x03\x6e\xca\xf7\x22\x2f\x85\x7e\x38\xd5\x99\xfa\xda\xa1\x8d\x65\x12\x19\x47\x39\x57\xe6\x99\x3a\xdf\x40\x23\xb2\xbc\xb6\x15\x45\x03\x37\x25\x96\x22\x09\x7a\xef\x71\x90\x50\x0d\x38\x1e\x6c\x37\x15\xfb\xc2\x4e\xdc\x6d\x39\xcf\x85\x7a\xbd\x1f\xd3\x8f\xb0\x58\x25\x1a\xef\xb5\x59\xfe\x7a\x25\xed\xc6\x62\x25\xfd\xd0\x77\x64\x08\x37\xa0\xb2\x83\xc8\xbb\xa1\xd2\xa1\x91\x84\x78\x25\xa6\x29\x3a\x1b\xea\x3e\x81\x2b\x8b\x35\x90\x4c\xc4\x21\x2b\x9a\x01\x89\xd1\xf0\xf7\x43\x02\x51\xec\x2a\x81\x0e\x47\x04\xdb\xe8\x2e\xab\xfc\xf5\x94\x07\xc1\xb5\xa2\xb2\xd2\xc6\x94\xd5\x81\xbe\xfa\x48\x50\x9a\xc5\x86\x7b\x78\x28\x7e\x9b\x6d\x17\x5f\x41\xbc\x62\xa3\x09\xb3\x49\x34\x55\xf3\xcc\xe1\x6f\x07\x4f\x4d\xbc\x44\x53\x06\xbb\x35\xee\x29\x27\xb6\x6b\x3f\xd9\x2f\xae\x5d\xc6\xb8\x56\x7e\xfd\xf5\x12\x4e\x4d\x3c\x45\x5a\x2b\x47\xaa\xb0\x1c\x6d\xb7\x89\x67\x22\x04\xa4\x38\x77\x71\x87\xbb\xd1\x66\x67\xf3\x9b\x9b\xdd\x76\x39\x7b\x70\xf7\x62\x51\xc0\x48\x50\xf0\xa5\x12\x6f\x63\x9a\x20\xdb\x89\xa7\x41\x70\xd9\x68\x1e\xe1\x7d\xb1\xfc\x65\xd4\x03\x42\x4c\x4f\x50\x32\xab\xf3\x17\xa6\xa6\x6b\xf2\xdf\x3f\x7a\x2c\x44\x43\x2a\x7e\x96\x70\x23\x82\xc8\xd1\xfa\x9c\x6a\xb8\x2e\x9a\x67\x89\xcf\x38\xa3\x8c\xc4\x07\xf1\xcf\x5f\x04\x82\x58\xe2\x73\x09\x64\x69\x17\x50\x89\x06\xba\xda\x8a\xde\x7e\x1b\xf4\xc9\x44\xdd\x75\x51\x82\x6e\x50\x56\x64\xcd\x26\x7b\x29\x00\x75\xe6\xba\xbb\x1a\x0f\xb3\x4c\x18\x2a\x42\x9d\xc6\x4b\x9c\x24\x09\x7c\x21\x2c\x8f\xc0\xa9\x86\xea\x50\x16\xf0\x49\x46\x33\x09\x52\x02\x82\x2d\x37\xab\x5c\x34\x9d\x65\x9f\x84\x1c\x10\x34\x35\x3f\x0d\x32\x62\x49\x98\xa6\x98\xa1\xd9\x40\x05\x45\xd6\x9c\x91\x96\x2d\xcf\x4b\x75\x21\xbe\x63\x49\x68\x28\x37\x54\x11\xfc\xbe\x53\x2d\x6c\x5b\x34\x82\x2c\xdc\x96\x46\x72\xee\x9f\xbc\x5b\xe4\x0b\x84\xd3\xbe\x65\xaa\x29\xab\x0c\xb0\x98\x87\x0d\x5e\x27\x8a\x7d\x2c\x81\x2d\xe0\x7d\x87\x0c\x14\x3b\x53\x56\xbb\x02\x3e\x9a\xdd\xb1\x27\x03\xc0\x92\x28\x89\x31\xfa\xb3\x10\x79\x3e\x93\x65\x75\x45\x12\x65\xfb\xc5\x82\xa5\x76\x5c\x5f\x60\xdb\x3a\xb7\x3d\x71\x63\x96\x24\x3e\xe9\x28\xbb\x24\x19\x4e\x89\xa5\xa8\xda\x15\xd9\x8d\x5d\xa2\x89\xb2\xd3\x52\x71\x58\xb2\xf9\x9e\xbb\xde\xb1\x92\xbb\x7f\x26\xd6\x6b\x92\xfa\x29\x46\x74\x4d\x96\xe7\xad\xbd\xe7\xfe\x2c\xa2\x04\x6c\x84\x71\x3a\x6a\x94\x08\x20\x6d\x4c\x8c\xe5\x5b\xed\x6e\x3b\x6d\xad\x0a\x53\xbb\x63\x62\xa4\xe8\x41\x0c\x6b\xcc\x58\x22\x15\x87\x0b\x16\x0a\x29\x59\xb2\xe2\x65\xdd\xe5\x13\x2c\xfe\xcf\x85\x56\x13\xa9\x62\xac\xa3\x7e\x11\xf5\x6d\x59\xfd\xfa\xd3\x65\xe1\x12\x15\x6b\x60\x97\x5c\x5e\x8f\x4a\x77\x60\x41\x26\x4a\x78\xca\x82\x55\x9e\x0a\x22\xa8\xfc\xd2\x87\x4a\x94\xf4\x30\x8f\x81\x5a\xd1\x87\xc1\x74\x50\x86\x68\x10\x5b\x3b\xa5\x26\xe8\xff\x14\x49\xb1\xed\xad\xad\x52\xb5\x22\x13\x85\xea\xc3\x6f\xcb\x71\x26\x69\x34\xba\x3a\x0e\x1d\x8c\x01\x99\xbd\x29\x57\xe2\xde\xc0\xb0\x20\x89\x1d\x85\x68\x75\xe8\xa4\x3d\x6f\xab\xf2\xd0\x69\x2b\xb3\xc4\xf8\x02\x95\x4c\x46\x5a\xec\xd7\x93\xa3\x7b\xdb\xd4\x13\xc4\x05\x4d\x3c\x1f\xf8\xb3\xa9\x8c\xa3\x57\x40\xc8\x52\x4f\x11\xf9\x26\x11\x87\xff\xe7\xd4\xfa\xb7\xdd\xd7\xef\xb6\x8f\xd4\x33\x3e\x16\x2d\xaf\x9e\xe7\xf7\x77\x0b\xd4\xae\xba\x16\xa5\x63\x29\xf3\x98\x17\x74\x29\xa3\xcd\xa9\x3e\x42\x7b\x82\xad\xac\x84\xfd\x70\xea\xb4\xbd\x51\x61\xef\x06\x8d\xf2\x39\x0c\x15\x56\xfe\xbf\x04\xcf\xdb\x9b\x19\xc4\x0c\xcc\x67\x9b\x65\xdf\x70\x4d\xb9\xaf\x30\xe2\x89\x0e\xdd\xae\xdd\x11\xba\x96\x30\x05\x2a\x61\x41\x07\x60\x01\x55\x33\x8c\xee\x5e\x25\x2e\x86\xad\xc3\x17\xe0\x11\xc3\x60\xbc\x12\x79\xbe\xdd\x67\xf5\xb6\xbc\xe8\x44\xb1\xd4\xf7\x12\x13\x3b\x32\x5d\x78\xcb\xca\x53\xfd\x88\x54\xdb\xfd\x53\x28\xf5\x65\x82\x81\x61\xfc\xeb\xb6\x7c\xce\x8a\xe6\x97\xeb\x48\x58\xea\x03\xc3\x5c\xe7\x53\x25\x4f\x7d\x62\x2f\x96\x06\x51\x6a\xa0\x9f\x73\x5e\x40\x9e\x5f\x29\xa3\xb0\x34\xf4\x49\x31\x63\x51\x66\xc5\x16\xdc\x69\x9d\x46\x8a\x4e\xf3\xba\x41\xfa\x3f\x24\x47\xb5\xb2\x61\xa3\x80\x5f\x1a\x19\xa1\x91\x43\xea\xf2\x1b\x63\x4b\xaf\x67\x09\xba\x06\x79\xc9\x34\x8e\xc0\xd9\x9b\xe4\x07\x0d\xe7\x42\xa2\x39\x3e\x19\x0d\x24\x3a\x1f\x90\xca\xc3\x35\x43\x1a\xd8\xb0\x10\xa9\x00\x8c\xde\x26\x0d\x42\x44\x95\x2e\x3f\x8e\x59\xbb\x57\x10\x29\xc9\xb8\x93\x96\xc8\x80\x23\xde\xde\x32\xb1\x7b\x2b\x1b\xf1\x57\x56\x16\x99\x7b\x86\xf0\x35\xb8\x22\x95\xe6\xae\x81\x4f\x62\xbb\xa9\x48\x88\xad\xe0\xb7\xd5\xac\xbb\x54\xfa\x0c\x2c\xf3\xc2\x66\x27\x06\x00\x8f\x54\xea\x08\x37\xe6\x47\x91\x55\x65\xe3\xb4\xec\x58\xaa\x80\x63\x29\x2c\x54\x6a\x5b\x3e\x8a\x26\x7b\x83\x79\x95\xe9\x17\xa8\x87\xae\x6c\xaa\xa5\x17\x4b\x67\x11\x94\xa7\xba\xab\x93\x64\x29\x44\xe0\x8a\xeb\xd0\x1f\x7f\x14\x07\xa8\xfb\x80\xfc\x14\xe2\x30\x49\x3b\x84\x36\x56\xa1\x5a\xa3\x7a\xda\xfa\x1b\x47\x01\x4f\x7d\x3a\x32\x77\x4f\x61\xd0\xd4\x7c\xcf\x0a\x2b\xfa\x3f\x1a\x69\x30\x09\x46\x83\xef\xe6\xeb\xc1\xf4\x34\x91\xf0\xa9\x00\xdf\x1a\xc1\x4f\x6f\x9d\x8d\x9c\x1a\x23\x10\xb7\x65\xb2\x63\xbd\xb6\xb8\xa1\xe1\x2c\x11\x5e\x42\xd3\xa0\x47\x4a\x54\x5f\x75\x21\xd4\xc5\xff\x4e\xfa\xa5\x17\x47\xee\x52\xc8\xc2\x93\xa4\xc2\x53\x41\x21\x0e\x23\xa9\xa4\xc1\x89\x2a\x98\x17\xfa\x86\x0a\x3d\xd6\x68\xd9\xde\x8b\xba\x59\xec\x45\x6b\x19\x76\xc9\x59\xd7\x57\x84\x89\xd3\xcb\x78\x2f\xc0\x91\x87\x0c\x86\x45\x30\x1d\x45\xaa\x0f\x66\xad\xb7\xa5\x0b\x27\x8c\xba\xf2\x88\xe0\x0c\xa8\x64\x09\x99\x72\x9e\xbd\xe0\x89\x36\x4e\x2a\xdd\xd6\x96\x8e\x47\x89\xa7\x5c\xba\x4d\x00\xd7\xda\x6c\xfc\x22\x01\x0b\x39\x72\xab\xde\x3d\x2c\x6f\x96\xbf\xb9\x7b\x07\x5c\x8a\x0b\x55\xca\x23\x34\xef\x65\xf5\xba\x28\x8b\x82\xb4\xe7\xa6\x31\x49\xee\xda\x88\xa1\xeb\xb6\xb9\x99\xf5\x3f\xb9\x08\x52\x72\x03\xfb\xac\xe8\x2e\xb8\x35\xba\x43\x1a\xa0\xad\x27\xb0\xe6\xc1\xfd\x51\xf9\x78\xf9\x4e\x9e\xaa\xc2\x6e\x45\x8b\x1c\xc4\x34\x89\x65\xdb\x3f\x94\xa6\x73\xdd\x07\xd1\xc2\x7f\x06\x3c\x15\x21\x23\xc2\x0c\x74\xf6\xbc\x0f\xd9\xa8\x21\x94\x4b\x84\x21\x4b\x4c\x27\xa4\x06\x77\x85\x29\xef\x8a\x1b\x71\x65\x31\x8f\xef\x9b\x2a\x52\x6d\xbf\xf9\xb6\x9d\xaa\x53\x4e\x86\x93\x2f\x94\x3e\x22\x1d\x9c\xe5\xd8\x31\x15\x7c\x8d\x75\x10\x91\x22\xbd\xd5\xf5\xd3\x66\xa1\xca\xec\xaa\x24\x7a\xf0\x90\xc8\x04\x48\x08\x7e\x7b\xb7\xdc\x6c\xdd\x6e\x26\x62\x4f\x22\xfc\x47\x68\x3d\xab\x5e\x4e\x07\x2c\xbf\xb3\x42\x00\x1b\xbc\xfc\xb3\x90\xb6\xbb\x41\xc4\x93\x4b\xe4\xb6\x3d\xc5\x46\xf4\xa9\x57\xd1\x9c\xa9\x97\x8b\x63\x1e\xd9\x10\x66\xad\xaa\x4c\x8e\x8e\x0c\x91\x78\x91\xb2\xc8\xa6\x5b\x71\xc8\xf2\xf3\xb8\x9d\x2b\x34\x6d\xaa\x53\x0e\xf3\xd1\x02\x48\x02\xe1\xe9\x5e\xed\x57\x6b\x8b\x4e\xb2\x5b\xf4\x6d\x57\x91\xf2\x04\x4f\x57\x5d\xbe\x17\xdb\xec\x9a\x95\xd9\x75\x0b\x7c\xe0\x2e\x54\xd6\xe7\xb1\xee\x43\xe8\x07\x10\x4f\x7b\xa1\x50\xca\xc6\x8f\x45\x76\xd8\x41\xb3\xdf\xc9\xf3\xe8\x34\x11\x12\x62\x44\xcd\xea\x72\x02\xcb\x2b\x54\x48\xd4\x4d\x07\x51\xd7\xe3\x54\xa8\x73\x51\x85\x0a\x35\x56\xb1\xd3\xe7\xe9\x1b\xda\xd3\x99\x20\x7b\x99\xf6\x4d\x48\x04\x7b\x99\xc2\x72\xb9\x59\xde\x88\x11\xa0\x41\xe8\x50\xc5\x17\x49\xa4\x6f\x55\x79\x3a\x8e\x93\x54\xae\x67\x9c\x84\x54\xdc\x77\x9e\x15\x1a\xab\x59\x3f\xa9\x05\x15\x5a\xfa\x68\x58\xd4\xe2\x0d\x7a\x64\x0b\xae\x15\x22\x69\x2b\x98\xdc\xb1\x01\xfa\x36\xab\x0e\xbf\x8c\x75\x57\x98\x00\x01\x82\x30\x4d\x75\xf3\x13\xdc\xd1\x2f\x40\xc7\x8a\xe4\xb3\x48\x8a\x65\x79\x38\xe6\xe5\xf9\x13\x7a\x79\x26\x0c\x23\x1e\xca\xbe\xc3\xb4\x28\x35\x60\x90\xca\xf5\x31\x54\x5b\x74\xec\x88\xd6\x28\x5e\x3f\x4a\x5e\xc8\x76\xad\xe9\x81\x34\x8f\x6e\x7d\x64\xa4\xc2\x72\x1f\x5d\xf2\x20\x09\x89\xe6\x43\x34\x23\xf8\xb9\xe4\x89\xa7\x9d\x9e\xe8\x6f\xed\x6e\xb1\xb8\xb2\x2b\xa5\xcf\x3d\x64\x4d\x5a\xe5\xe2\xbc\xc9\x0e\xc7\x1c\xba\x3a\xf3\xa4\x37\x3c\xd2\x17\x1e\x1a\x75\xca\x3e\xc3\x55\xcd\xbb\x66\xcd\x12\x1b\xc5\x1a\x48\x8a\x32\x19\x04\x7e\xca\x3b\xa2\xe1\x1b\x51\xbd\x16\xe5\x88\x34\x9a\xc9\x40\x44\x9c\x84\x5b\xeb\x7d\x3f\xce\x3e\x9c\x18\x32\x90\x24\x6a\x8f\x41\xc0\x32\x97\xe7\x6f\xcd\xf9\x08\xfd\x08\xac\x0c\x83\x28\x16\xae\x3c\xfc\x28\x32\xbd\x82\xca\x58\x08\xd4\x27\xfe\x90\x8c\x8c\xad\x83\x20\x42\x9c\x53\x8d\x30\xbd\xe1\x38\x45\x46\xa1\x95\x6e\xc3\xc6\x37\xd9\x4b\xeb\x6d\x4d\xce\x5f\x99\x78\x2c\x71\x8c\xe9\xab\xaa\x34\x59\xa7\x97\x3d\xce\x0b\xc9\x24\x0c\x30\x85\x7f\x03\x6f\xbb\x01\x2c\x57\xa6\x81\xc1\xdc\xf8\xae\x29\xb7\xe2\x63\x6c\x64\xcb\x34\x49\x71\xa5\x2e\x44\xbd\x1f\x09\xca\x8c\xde\x26\x55\xcc\xe9\xe1\x6c\xf6\xd9\xb1\x76\x9c\xab\xae\x59\x2b\x64\xb6\xda\x8b\x7a\x92\x76\x86\x49\x11\xc4\x98\x02\xfc\xf6\x74\x7f\xe3\x48\x93\x1f\x6f\x16\xee\x06\x22\x15\x2c\xee\x3e\xf0\x43\x96\x43\xdd\x94\xc5\x30\x30\x2e\xa5\x17\x22\xf3\x65\x7d\x3e\xc8\x32\x1f\xac\x52\x29\x79\x84\x62\xcc\x7b\x84\xb6\x59\x8f\x70\x34\x41\x64\x48\xac\x03\x20\xd4\x9e\x34\x22\x06\x3e\x84\x74\xfc\x4d\xf7\xd9\x1b\x1c\x01\xaa\x1f\xb8\xfe\x26\xc8\x05\x06\x4f\x56\x9c\xe2\xe8\x3d\x0b\xf8\x73\xc1\x07\x26\x55\x2c\x99\xe9\x2b\x9f\x39\x73\xd9\xb5\xeb\x18\xbd\xd6\xf5\xb6\xcf\x21\xc3\xa4\x4e\x02\x21\x2e\x95\x01\x33\x63\xb2\x3c\xbb\x02\x54\x48\xf0\x48\xc6\x75\xb3\x7a\xda\xa6\xee\x5a\x08\x48\x79\xe3\xb7\xd9\xf3\xcd\xe0\xa6\x90\x04\xca\x74\x75\x1f\x2f\x16\x0b\x3d\xba\xa3\x12\x68\x58\x60\x76\x0a\x87\xad\x27\x99\xcd\x24\x80\x71\x9a\x33\x1b\x2c\x07\x44\x85\x74\x34\x1b\xa9\x87\xf2\x22\xc9\xed\x9b\x0b\xb5\x1f\x4f\x42\xe5\x09\x81\x8e\x6d\x5e\xaa\xd7\xe7\xa2\x2e\x73\x3d\x44\xb0\xba\x6e\x5a\xe1\xc7\x5f\xcd\x7e\x7f\x7a\xde\xee\x6e\xd7\xb3\xc5\x6e\xfb\xb4\xea\x1e\x02\x0c\x23\xe0\xaf\x59\x07\x42\x54\x8c\x8b\xd8\xb1\x2f\x3c\x96\xdd\x5f\x03\xd2\xbf\x9a\x57\xe5\x2b\x54\x77\x87\x2b\x5c\xd9\x34\x16\x4c\xb1\x98\x8e\xdd\x63\x05\x77\x8b\xa7\xe9\x75\xa2\x98\x21\x1d\x8b\xc5\xd3\xe3\xed\xdd\x37\x12\xe1\xfe\x6d\xf5\xb4\x79\x5e\x2f\x77\x37\x77\x3f\xba\x77\x30\x21\xbe\x83\xae\x9c\xc4\xdb\xa5\x25\xc2\xd1\xc8\x0a\xd2\x01\xdb\x85\xae\x85\xab\x04\x2d\xf3\xdb\x53\x23\x06\x97\xf8\x40\xcc\xb6\x16\x5a\x34\x08\x23\xf6\xa8\x72\xfa\xc5\xc1\x2a\x60\x1e\x0f\x7b\x67\x74\xa1\x07\x35\x78\x83\xaa\x89\xd1\x4f\xc4\x98\x47\x7b\x58\x60\xa5\xd8\x4e\x0d\xcf\x0b\x15\x44\x86\xa8\x3d\x66\xf7\xf8\x96\xc9\xf4\x3a\x50\xa1\x22\xde\x96\xbb\xc5\x13\x74\x49\x79\x15\x31\x9b\xd1\x6f\xad\x63\xc4\xa4\xd5\x5d\x93\x2d\x76\xe9\x08\x9c\xe0\x7d\xc4\xfd\x31\x7c\xcf\x18\x24\xc2\x23\x8f\xe5\x11\x43\x15\xed\xf6\xa9\xf6\x40\x04\xb1\xb6\x4f\xc2\x82\xe8\x22\x57\x84\xe2\x43\xad\x49\x0f\xff\xd8\xa8\x1f\x3d\x33\xf1\x13\xc7\x6a\xb7\x99\x3d\x66\x4d\xf6\x17\xe8\xc1\x3e\xa5\x12\xc9\x10\x7e\x98\x03\xd6\x19\xb9\xe4\x4b\xfb\x56\xd6\xd7\x15\x2f\xd0\xbd\x9e\x14\xe8\xf7\x3f\xdc\x3d\x0e\xe2\x61\xbb\xc5\xf7\x5b\xd7\x27\x8d\x52\xdc\x7a\x8f\x7b\x51\x03\xbb\x39\x55\xfd\xf8\x5b\xdb\xea\xa4\xd3\x9c\x52\x0c\x5a\x38\xc3\xd7\x4e\x15\x89\xa7\x3b\x99\x01\x5b\x0d\x45\x19\xd3\x7e\x1a\xb6\x9b\x4b\xf6\x42\x11\x05\xcc\x1d\x7a\x7b\x51\xc1\x9e\xe2\xb9\xee\xe9\x22\xe6\x48\xed\x70\x10\x1f\x0b\x71\x5c\x75\x19\x0a\xd5\x9a\x49\xed\x03\x31\x7b\xeb\x30\x79\x9f\x7c\x47\xa9\x23\x70\x2a\xca\xd5\xa9\x6e\x40\xaf\x44\xd5\x5c\x01\x2a\x95\x34\xca\x86\x31\x9a\x5f\xe1\x5c\xcf\xcf\x5b\x77\xac\x5f\xee\xd5\x6e\x36\x21\xa6\x7e\xb6\xbb\x87\xe7\x7b\xf7\x3a\x2a\x49\x19\xef\x7c\xf6\xcf\x04\xfd\x98\x52\x26\x45\xd3\xa1\x44\x76\xc6\xb2\xec\x76\x1a\x1d\xc4\xe8\x16\xde\x2e\x97\xbb\xc7\xe7\x87\xe5\x7a\xb6\x7d\x5a\x77\x8d\x9a\x18\xfa\xb7\x50\x37\xb7\x0f\xb3\xaf\x3c\x26\x05\xb1\xc1\xc5\x35\x9f\x2d\x06\x09\xbc\xcf\x3d\x39\x05\xa9\x87\x89\x99\x79\xd6\x54\x65\x01\x1d\xb2\x4f\x41\x1a\xe3\xce\xfc\x83\x88\x91\x29\xfa\x3f\x9a\x8e\x90\x1a\xcf\xe2\x46\xe6\xff\xb7\xa6\xda\x01\x67\x01\x4e\x42\x34\x94\x91\x12\x65\x88\x30\x23\x57\x97\x07\x78\x42\x05\x63\x91\xd7\x7d\x76\x00\xed\x79\xbe\x63\x81\xc5\x25\xe5\x14\x48\xd7\x57\x47\x96\xf6\xbc\x38\x26\xfd\x26\x30\x6b\x78\xbf\xdc\x81\xe8\x95\x96\xf3\xbb\xfe\x76\xa7\x3d\xdf\x43\x2b\xf1\x71\xf9\xf3\xe9\x71\xd9\xfd\x35\x35\xd2\x15\xf2\xfe\xcc\x8a\x7e\x02\x44\x7b\x46\xb9\x54\xe3\x46\x14\xaa\x39\x89\x6a\x2c\x93\x39\xdc\x9c\x34\x0b\x25\x82\xcf\x3b\x4c\xb1\x95\x27\x7b\x2e\xb2\x66\x30\x46\x57\x18\x82\xe4\x9f\xed\x14\x9a\x89\x40\x47\xce\x5c\xac\x44\x03\x2f\xe7\xd9\x84\x6c\x11\xd3\x4c\x0b\x34\xf4\x91\x86\x06\xa4\xfb\x4d\xdc\x8b\x31\x95\x0b\x28\x7b\x3f\xf0\x2d\x5d\x0f\x45\x58\x1a\xd1\x1a\x84\x48\xae\x35\xbd\x13\x6b\x9f\x19\x70\xd4\xeb\x15\x08\xbd\x2b\x8b\xfc\xbc\x7b\xed\xb4\xc6\x98\x0e\x42\x83\xd1\xd3\xe7\xc7\xe5\xaf\xdd\xdf\x04\xc3\x8a\x02\x4c\x73\x0d\x3e\x50\x20\xfc\xd4\xce\xa9\x0e\x7c\xb3\xc8\xb1\x6a\x7a\x54\x6f\xa1\x43\x2d\x9c\x48\xc9\xc3\x99\xcc\xe6\x69\xfb\x51\x87\xc0\x30\xcc\x3e\xcf\x9a\xe6\x5d\x34\xcd\x44\x7a\x5b\x87\x26\xc6\xd2\xcb\x21\x76\x0c\x31\xc3\xd3\x7b\x8b\x8e\x23\x91\x12\xeb\x6e\x55\xf7\xc4\x4f\x98\x4e\x3c\x0f\x35\x61\xb1\x74\xfd\x5b\xf9\x89\x59\xac\x93\x38\xd4\x96\x46\x6d\xd3\x54\x93\x61\x3e\x9d\x48\x15\xda\x72\xf5\x3e\xb6\x87\x8c\xbf\xe1\xe2\xd2\xa9\x52\x88\xab\x31\x65\xf5\x02\x77\x0d\x1c\xae\x0e\x22\xdb\x51\xc4\xa1\x6f\x81\x52\xff\x16\xba\x37\x43\x47\x37\x14\x31\x29\x2b\x97\x18\x34\x1c\x1f\x30\x5a\xb2\x24\x0e\x2d\x9d\xed\xfc\x74\xc6\x5c\xf0\x27\x3f\x55\x46\x0c\x48\x7a\xfc\xdb\xc3\x76\x34\xf0\x32\x06\x04\xed\xad\xbf\x3d\x76\x77\x4e\x14\x26\x2e\x89\x79\xfe\x9a\x7f\x6a\x74\x03\x19\xe2\x39\x72\x57\xdb\x0c\x6c\xf7\x77\x19\x31\x27\xb4\x0a\x1f\xf8\x35\x86\xd0\x35\x2d\x21\xc4\x84\xf8\x77\xd0\x7d\x02\x31\xad\x3c\xae\x2e\x91\xba\x95\x68\xa0\x68\xba\xd2\x8f\x31\x6b\x88\x56\x26\xc0\x05\x8f\x46\xee\xf3\xfa\x6e\xfa\x53\x02\x67\xee\x34\x45\xd9\x81\x8b\x66\xce\xf0\x6e\x10\x10\x2e\xcb\x64\x95\x13\xed\xd9\x96\x8b\x7d\x96\x4f\x68\x7a\xb5\xbd\x09\xf2\xf8\xe7\x09\xa0\x50\xfb\xe7\xcd\x7c\xb0\x9c\x40\x2b\x2c\xe9\x46\xce\x8b\x5e\x85\xa4\x06\xa3\x31\x26\x4c\xfc\xba\xff\x2e\xe5\xfc\x4c\xf1\xa0\xcf\x50\xbb\xc3\xc7\x9a\x88\xd4\xfa\xf0\x03\xed\x8e\xb9\x38\xef\xfe\x3c\x65\x7f\x4d\x1d\x7c\xda\x80\xc6\xc0\xfa\x5b\x06\xef\x9d\x2a\xf3\xa5\x8e\x13\x3c\x19\x22\x4e\xec\x16\x0a\xa8\xa4\xd8\xf7\x5a\x54\xe0\xc5\x6e\x9f\x3b\x69\x28\x9a\x7e\xfa\x00\x18\x27\x0c\xa5\x65\x4b\xbe\x85\x83\xc8\x07\x29\x6e\x60\x01\x0f\xa9\x0c\xf8\xed\x04\x39\x95\x44\xd7\x5d\x63\xe2\x63\x22\x40\x8a\x46\xed\x9d\x7f\x7c\x5b\x95\x87\x07\x51\x9c\xb7\x65\xfb\xbf\x3d\xeb\xe5\x53\x3b\x06\xfc\x40\xa2\x8c\xcc\xa9\xc8\x9a\x0d\xe4\x48\x22\x38\xfc\x4a\xe0\x8b\x48\x5e\x2c\x66\x44\xbc\x3a\xad\x64\xf7\x36\xa1\x97\xa0\xef\x75\xb3\xfc\xb1\xe8\x87\x46\x87\x37\x8a\x38\xa5\x89\x7e\x0c\x72\x17\x10\x19\xd2\x6b\xdc\x8b\x7a\x03\xaa\x1a\x67\x97\x20\x16\x31\xda\x1e\xcb\xf5\x82\x73\x7f\xd3\x88\x42\x8b\x4a\x4f\xd8\x2a\xc3\x94\xca\xe8\xe1\xb1\x22\xe5\xe2\xdb\xf9\xda\x01\xe8\x21\x49\x02\xfc\x78\xed\xc7\xc5\x14\x04\xf1\xe1\xb9\x5c\xf1\xf4\x11\x09\x89\x4c\x31\x22\x90\xd5\xdb\x3d\x54\x30\x43\x0c\xd7\xac\x59\x94\x65\xa5\xb3\x02\x8d\xec\x89\xfc\x3c\x24\x5a\x84\xdc\xed\x38\x70\x1d\x12\xfc\x32\xc8\x0d\x89\x01\xb4\x75\x70\x19\x51\xe5\xc3\x3d\x96\x46\x75\x6c\x83\x9f\x65\x73\x87\x2f\x9f\x7a\x11\x84\x8e\x9e\x18\x2a\x95\xd5\x23\x59\x66\x06\x22\x64\x08\x0f\x9e\x8b\x1a\x06\x4c\xce\x6d\x53\x8a\x78\xf7\xac\xbe\x40\x3f\x29\xee\x32\xab\xeb\xec\xa5\xe8\x22\x5a\x20\x99\x08\x6c\x6c\xe0\x39\x2b\x1a\x62\xfa\x19\x6f\xd5\x9f\x66\xa0\x2f\x07\x25\x48\x1e\x48\x9b\x55\x2a\x4f\x85\x82\x95\xb8\xd2\x24\x66\x20\xa5\x87\xf2\x84\xbf\xae\xbf\x2f\x26\x42\xf3\xd7\xb6\x23\x48\x48\x91\x40\x6e\xa3\x44\xa5\x00\x59\x82\xfa\x6b\x4f\x69\xa6\xfa\x49\x02\x8c\x6b\x3c\x17\xd5\x98\xda\x71\xf8\x1a\xad\xe1\x79\xa9\x76\x7c\xc8\x7a\xe2\x7b\x44\x41\x72\x55\xc9\x08\xca\x90\x16\x6c\xaf\x0c\xe1\xdf\x65\x56\xd8\x47\x0c\xd4\x1d\xc6\xc4\x40\xa0\xb9\x62\xdc\xaa\xae\x75\xd5\xb7\xee\x17\x68\x6d\xbc\x0e\xc4\x77\x67\xec\xde\x95\x9f\xad\x24\xf6\xf0\x2d\x20\xf5\x90\x73\x58\x61\x02\x68\x7a\x06\x82\x64\x36\x3e\xee\x08\x93\xa8\xb0\xf8\x9a\x2f\xb3\x7f\x3d\x1b\xf1\x0a\x80\xf1\x49\xf3\x10\x71\x3d\x6c\x50\x14\x0f\x26\x92\x18\x70\x3e\x15\x2a\xab\x28\xcd\xae\x69\x7a\x0d\xb6\x4e\x93\x84\x98\x27\xfa\xac\x18\xec\x93\x1d\xc0\xa4\x14\x57\x5c\x55\xd0\x94\x55\x26\xdc\xac\x36\x2c\x91\x68\x7b\x90\x0c\x86\xa8\xf2\xf3\x5d\xa1\xca\x03\xc8\x49\x49\x79\x66\x98\x0e\x50\x99\xba\x7b\x3e\x1a\xa1\x9d\x4f\x64\x18\x10\x12\xe7\x90\x15\xed\xb9\x9d\x15\x2f\xdf\x4a\x91\xaf\x6d\x0c\xc8\x75\x32\xbe\x5b\x88\x2b\x71\x06\x1b\x5a\x1a\x93\x96\x0c\x1f\xcc\x15\x38\x12\xb4\xd9\x57\x82\x4e\xcc\xf8\x2c\xc6\x40\xfa\xf6\x2f\xd0\xe2\xb5\xe3\x6f\x34\x7e\x94\xe2\x18\x58\xa4\x0d\x82\x6c\x07\x09\xd5\xd1\x7d\x82\x38\xf5\x45\x57\xf4\xdc\xce\xa0\xbb\xc3\xb1\xfd\x21\xed\x9c\xfe\x51\x36\x50\xb7\xdf\xa7\xac\x7a\x15\xcc\x26\x48\x80\x32\x85\xf6\x82\x2e\xc5\x6a\x02\x21\x53\x5b\xff\x46\xc7\x94\xad\x3d\xb8\x94\xcd\x8f\x32\x2a\x26\x30\x0a\x93\xce\x59\x7d\xd3\xe3\x31\x19\x0d\x4b\xc8\x52\x8c\x77\xe8\x12\x27\xb7\xe3\xe0\x19\x75\x4a\x21\x61\x16\xc5\xe7\x42\x1d\xb6\x29\x0a\x48\xef\x8f\x20\x8a\x73\x31\x14\x23\x64\x26\x0a\x43\x3c\xc9\x8f\x14\xb9\x20\xfb\x75\xd6\x5d\x0d\x31\x1d\x2c\x59\xa1\xb7\x7b\x58\x9c\x2a\xb4\xc6\xdc\x21\x63\x62\x2f\x20\x59\x02\x34\x07\xcb\xac\x40\xd8\xf1\x57\x7c\x25\xc3\xa7\xc7\x31\x47\x54\xb0\xdb\x8a\x36\xe7\x42\x67\xca\x95\xe5\x75\x3f\x22\x11\x94\x3a\xf9\xe1\x52\x27\x1d\x0a\xd0\xa4\xa9\x8c\x5c\xa6\xb8\xd3\xd0\x59\x94\x65\x9e\x15\x2f\x04\xaa\x1d\xfd\xe0\x34\x05\x6e\x5c\xa2\xa0\xee\x08\x51\xbf\xaa\x48\x31\x22\x48\xe2\x4e\x05\x09\x8f\x44\x3a\xa5\xbe\xc1\x27\xe6\x80\x11\x1a\x5c\xba\x97\x74\x9e\x47\x5f\x4c\x86\x21\x6e\xd1\x87\x07\xf1\x31\x3b\x1e\x31\xfb\xe2\x9a\x24\x39\x29\xe6\xa2\x8e\x67\x5b\x94\xa4\x48\xb7\x3c\x9d\x1d\x79\xdb\xf0\xae\xda\x27\xeb\x78\x23\x0c\xb8\x08\x5e\xbd\x5d\x2f\x7f\x43\x4b\xdd\xd0\x7a\x75\x77\x03\x4f\xf0\xc0\x4a\x84\x54\xe7\x1a\x41\xca\x87\x89\xa2\x81\xa9\x88\x86\x01\x20\xac\x06\xd5\xdb\x3a\x3c\x87\x6d\x34\x01\x47\xff\x63\xd7\x01\x8a\x9e\x8b\xbc\x27\xf8\xfc\x8f\xc2\x70\x89\xbb\x99\x54\x18\x59\xaf\x30\xae\xd6\x85\xa8\xb9\xe7\xc5\x46\x3b\x29\xa1\xb5\xf8\x6b\x56\x3b\x61\xce\xc1\x07\xe7\x1e\xd7\xa4\x96\xe5\xd2\x74\x57\x5a\xd3\xdc\xf3\x41\x60\x92\xf2\xd0\x3f\xd5\x56\x14\x11\xb6\x5d\x02\x13\x6b\x0b\x53\xca\xcb\xf3\x43\x56\x40\x55\x6f\x1d\xbe\xba\xb7\xa9\xd1\x7f\xfe\xf7\x8f\xeb\xff\x63\x6f\x14\x26\x31\x3a\x8e\x48\x8b\xb1\x8b\x76\xab\xf5\x72\x33\xbb\x5f\xee\x50\x00\xdd\x3d\x2d\x84\x50\x50\x25\xc2\xa9\x46\x2f\x3b\x2b\x5e\x2e\x8e\x2c\xf7\x22\x9f\x21\x7e\xb9\xfd\xdb\x7d\xa9\x5e\x37\x13\x16\xdd\xbf\x86\xc3\x10\xb3\x40\x6a\xab\x55\x86\x0a\xd3\xbd\xa1\x8c\x99\x88\x91\xd4\x35\x6f\xd6\xd0\x88\xac\xb3\x75\xb8\x17\xeb\x08\xe3\x0d\x54\x33\x53\x56\xff\x3e\x55\x59\xad\x6d\xfa\xd2\x75\x4a\x19\xf3\x2d\x5a\x9e\x52\xfd\x2e\x73\x3f\xcd\x47\x33\x91\x70\x69\xef\x61\x49\xc9\x44\xde\x4c\x21\x16\x5c\xb7\x90\x88\x8c\xf2\xac\xd0\xe7\x3d\xd1\x2c\x76\xaf\x11\x53\xfd\x6c\x6b\xf2\x5a\xb7\x64\x34\x17\x52\x63\x90\x7d\x28\xab\x27\x66\x81\x48\x7c\xa4\x54\x69\xc6\x9c\x60\x6d\x93\x50\x09\xa2\xb1\x8a\x72\x75\xae\xc4\x21\xd3\x97\x26\x89\xef\x7d\xd3\x9e\x58\x97\x0b\x84\x47\x24\xbd\x50\xbd\x65\x0a\xb6\x95\xc0\x1c\x5f\x89\xc2\x31\x53\xa9\xc1\xf6\x12\x2d\x49\xa2\xe9\x03\x54\x47\x52\xca\x3d\x01\x41\xe0\x10\x66\xed\xd6\x48\xb4\x6f\xb3\x42\xff\xbc\x5f\x7e\x5c\x51\x45\x8f\x6e\x2a\x43\xa2\x82\x23\xe6\xb0\x3c\xfb\xcb\x15\x23\xde\x96\xe3\x9f\x2f\x13\x86\x99\x88\x23\xc0\x2b\x56\x66\xb8\xbf\xa7\x29\xb2\xaa\x80\xaa\x4f\x72\x08\x70\xff\xff\x09\xa3\x73\x4f\xa5\x14\xf2\x2d\xe0\x7d\x56\x21\x4a\xe8\xca\xa7\xfd\xaa\x22\xd9\xde\x45\x7b\x12\x6b\x66\x8b\x52\x96\xfa\xbc\x10\xc5\x4d\xb9\xdd\x67\xb5\x7b\x5b\xcd\x7d\x2c\x05\x5d\x3d\x3d\xdd\xef\x96\x37\x77\xdb\x1d\xeb\x9a\x82\x4e\xd1\xc3\xed\x47\x13\x52\xb0\x6d\x3f\x89\x26\xd0\x62\xfd\xfb\x6a\x3b\x7b\xee\x2e\xd7\xcc\x95\xd6\xb6\xfe\xd4\x2f\x83\xd9\xab\xb5\xc0\xc2\x1d\x28\x54\xa9\xe1\xd7\xdf\x17\xb7\xb9\x78\xb9\x48\x31\x70\x0f\xda\xa3\x7c\x5c\x0d\xd6\xbd\x35\xc4\x20\x22\xd7\x4a\x2f\xb5\x16\x75\x76\x59\x86\x60\x88\xef\x89\xf4\x0c\x2e\x90\x01\xce\x3c\xa1\x31\xd6\x5b\xc0\xfb\xfc\x54\x61\xea\xfd\xe9\x08\xc5\x28\x57\x3a\x1c\x44\xc6\x98\xef\xa7\x03\x65\xc2\xfb\x52\x39\xfe\x19\xce\x58\x42\x2f\x7b\x10\xc5\x49\xe4\xf7\x0b\xf7\x9e\x8c\x47\x0c\x23\x7b\xed\x4c\xcc\x69\x0d\xd9\x96\xc0\x0f\x31\xd9\xf0\x5e\x65\x0d\xec\xde\xf7\xa2\xd9\xbd\xb7\x1e\xe4\xee\x45\xe8\x97\x6b\x8f\xd0\x5d\xa5\x43\xde\x97\x8e\x6e\xf7\xa4\xc9\x75\xcf\x42\xce\x24\xeb\xb1\xf9\xb6\xbf\xf1\x52\x8d\xc0\x59\x18\x40\xaa\x1c\xeb\xd2\x80\x2c\x8b\xb3\x30\x55\x8e\x79\xfb\x41\x7c\xdc\x40\x2e\xce\x17\x01\x6c\xce\x42\xe1\xa7\x36\x5c\x49\x05\x53\x84\x03\x7d\x3c\x1d\x6c\xd1\xa5\x4d\xa0\xba\xee\x9a\xb2\x1c\x8e\x04\xa5\xd3\x62\xb3\xed\x51\x48\xb0\x89\x1a\x9a\xdb\x53\xb1\x69\x06\x98\x3f\xce\x62\x2f\xf6\xa3\x8e\x68\x6e\x14\x70\x72\x7d\x58\xa8\x6c\x0c\x68\x5e\x56\x55\xf9\xde\x35\xf8\x0a\x8f\xdd\xa3\xd5\xf1\xb0\xda\xe5\xbf\xf4\x8b\x83\x6d\xd7\xd4\x0f\x70\x4f\xbf\x79\xde\x6c\x77\xf7\x77\x0f\x77\x5b\x77\x13\x11\xc6\xe8\x03\xd7\x0d\x88\xbc\x83\x8b\x73\x26\x20\x0d\x50\x6e\x6c\x2f\xde\x07\xb4\x08\xf5\xa5\x87\x74\x94\x38\x4b\x9d\x35\xa0\x31\x41\x30\x5c\x3e\x4c\x80\xc6\xb9\xbc\x81\x66\x77\x2e\x4f\xd5\xee\x45\x1c\x60\x57\x50\x65\xd3\x60\x28\x24\xf7\xd3\xf6\x4c\x7d\xce\x9b\xac\xdd\xc7\x2f\xc7\x2d\x93\x9c\xa4\xf6\x85\xd6\xd7\x3b\x35\x53\x9e\xc6\x8f\x7d\x2a\x5c\xda\x70\x2c\x63\xc3\x99\x8e\x39\x58\xd5\x42\x5a\x0a\xb7\x65\xf5\x3a\x4a\x53\x73\xa6\x25\x95\x76\xe4\x60\x9a\xbb\xc5\x53\xdf\xec\xe4\x0c\xb8\x56\x4e\x02\x88\x92\x53\x53\xfb\x05\x83\x90\x83\x6f\x65\x13\x76\x2f\x65\xae\x77\x87\xac\x10\x3d\x0c\x02\x67\xa0\x63\xdc\x52\x6c\x9d\x6e\x7d\xd7\x6d\xc7\x6e\x85\x23\x79\xaf\xec\x11\x8e\xf5\x5c\x76\xce\xbd\xd8\x4b\xec\x0c\x6e\xdd\x1a\x24\x68\x6a\x57\xc0\xf4\xb2\x6a\xd7\x37\x66\x61\x37\xa6\x3c\x94\x93\x19\xa7\xfe\x77\xe0\x3c\x02\x8f\x3b\x9a\xab\x8f\x65\xb3\x1f\x0e\x12\xf7\x43\xfa\xa2\x87\xac\xc8\x0e\xa7\x43\x5f\x53\x85\x73\x5f\x90\xe4\xd1\x6c\xbe\xe8\x45\xbe\xda\xbf\x6b\x84\x10\x3f\xc2\x3b\x29\x74\xe1\x6c\x1a\x92\x36\x93\xa1\x97\xd8\x2b\x02\xc3\x11\x9a\xf7\xfd\xaf\x8f\xbd\x9a\x44\x2d\xda\x8e\x11\x03\x3c\x02\x28\x44\x3a\x51\x7c\xcb\x79\xc4\x03\x4d\x24\x4a\x75\x53\x95\x67\x35\xa2\x72\xe8\x7a\xc5\x8e\x77\x7c\xcc\x69\xce\x79\xe4\x0b\x37\xd9\x49\xd0\xa6\x03\xd5\x0d\x6f\x12\x87\x5c\x9a\xcb\x2c\xc9\x44\x6e\xc5\x9b\xf3\xf2\x9a\x05\x71\xf4\xa1\xe2\x14\x92\x0b\x02\x0a\xcb\x37\x88\x8c\x86\x86\x6c\x9a\xf7\x89\xf3\x84\x79\x78\x92\x22\xa1\x55\xbf\x8a\x72\x58\x73\xe0\x7a\x87\x12\x21\xb2\x3b\x28\xea\x53\xd5\xde\x7a\xf4\x0b\x92\x58\x46\xd1\x90\x6b\x67\x05\x55\xdd\x8b\x65\x4d\x9d\xc4\x3c\x49\x63\x8c\x15\xa2\xc2\xb8\x5b\x34\x3c\x8d\x18\xd1\x9e\xda\x7a\x17\x72\x0d\x9e\x4c\x57\x10\x7b\xb9\x41\xaa\xfc\xd0\xa6\x94\xee\x1a\x38\x0c\x2a\x9d\x47\xcf\x92\x9e\x87\x91\x32\x2d\x1a\x01\x45\x53\x9d\x55\x0e\xd5\xab\x7b\xa6\x64\x2a\xf6\xba\xaa\xc3\x77\xc8\x26\xaa\x0e\x39\x97\x01\xf7\x9d\x62\xda\x1e\x44\x63\x59\x13\xbb\x9b\xc4\x94\x54\xdf\x59\x55\xe6\x49\x87\x9c\x73\xc5\x53\x61\xb3\x05\x0e\x9b\x37\xea\xe0\x53\x8d\x83\x2d\x8a\xb7\x7a\x9b\x5f\x9a\x69\x5c\x49\x19\x24\xd6\x97\x29\xeb\xc1\x3a\xd2\xbe\x8f\x79\xd4\xe6\x8a\x06\xad\x6d\x8b\x91\x0e\xf9\x90\x51\xbe\x9d\xf2\x10\x5f\xe4\x07\x38\xd7\x81\xc2\x0c\x65\xa7\xd4\x3a\x19\x21\x19\x5f\x24\x24\xa6\xe0\x9c\x09\x4a\x3a\x73\xd3\xe3\x03\xbe\x8f\xd2\x60\x87\xec\x85\x40\x0b\x8f\xf0\x3e\x15\x6a\xe2\x1c\x12\x8e\xb0\xca\x65\xb3\xdf\x96\x48\x73\xe6\x4c\x35\x6e\x98\x87\x51\x2b\xa1\x35\xa9\x5a\xf5\x19\x31\xa6\xdf\xd1\xf8\x02\xe9\x86\x0b\xa8\x1b\x44\x72\xd6\xcd\xac\x38\x6f\xcb\x4d\x8f\x35\x61\x7c\x89\x92\xe8\xd3\x3d\x2c\x36\xee\x70\xf4\x3d\x29\x11\x5b\x27\x5b\xb3\x85\xa2\xd0\xae\x89\xc5\x12\x8b\xeb\x4d\x9e\x1d\x69\x7d\x6e\xde\xb3\x46\xed\xb7\x65\xcf\xd0\xf3\x59\x02\x08\xc1\x3e\x0e\x6b\x1c\x86\x8f\xf6\x99\xe0\x6e\xe7\x69\x8d\x49\xe2\x3e\x76\x6d\xc0\x75\xdc\xa3\xab\x23\x4e\xed\x01\x59\x56\xd7\x93\x32\x74\x42\xeb\xbb\x62\x8e\x25\x2e\xab\xaa\x7c\xa9\xc4\x61\x5c\x72\xc7\x7d\xee\xc5\x48\x3e\x2f\xf2\x81\x22\x0a\xf7\x79\xc8\x51\x63\x43\x9e\x6a\x25\xaa\x9b\x52\x21\x76\xbb\x5c\x95\xd5\x36\x6b\x4e\x79\x39\x40\x3b\x72\x9f\x0b\x1f\xab\xdf\x7e\x5b\xb8\x1b\x04\x5e\x10\x92\x8b\x58\x77\x19\x96\xc4\xb5\x45\x2a\xec\xc4\x38\xee\x86\x55\x79\xdc\x0f\x53\xae\xba\x64\xd5\xd6\x85\x40\xb8\x1f\x82\x8f\x36\xd2\x1c\x9a\x1b\xeb\x77\x9e\x2f\x6d\x24\x13\xef\xd8\x5d\x93\xa9\x23\xcd\x8f\x62\x1f\x4f\x1f\xa2\x0f\x7a\x2f\x7f\x74\xd4\x41\xdc\xdd\x28\x92\x3e\xa3\x23\x42\xe4\x57\xa5\xbb\x9f\x48\x81\x0d\x9f\xa1\x05\xd5\xab\x3c\x6e\xd7\xcb\xd5\xdd\xcd\xce\x16\x8b\x3d\x2e\xd6\xcb\x87\xe5\x63\x37\xa5\x12\x4e\x85\xe0\x15\xd0\xef\xdc\xc3\x7f\x4e\xd0\xd9\x93\x7e\x22\x13\xdc\x46\x6f\x1e\xfa\x19\x42\xee\xa7\x41\x82\x9e\x8c\x53\xf5\x70\xdc\xfa\x53\x7b\x9b\x9f\xa6\x9c\xdb\x1d\xd0\xd1\x17\x61\x58\x7f\x7e\xbe\xd3\xe3\xc0\xab\xbd\x44\xc4\x24\x5f\xa7\xe1\x0d\xf2\xf2\x08\x95\x81\xee\x9d\x44\x1a\x21\x0f\xe0\xae\x86\x66\xbd\x59\x6d\x54\x06\x85\x82\xc9\x65\xec\x4b\x46\xd6\xb5\x14\x4d\x93\x8f\x78\xae\xb9\xaf\x7c\x11\x90\xfa\x69\x55\x8c\x38\x2c\x27\x37\x28\x5f\x05\x49\x28\x2e\xf5\x60\x63\x7e\x41\xee\xeb\x00\xcc\x05\x2c\x6e\x15\xbc\xdd\xe3\xb4\x48\x70\x76\x3c\x17\xd9\xc7\xae\x83\xd4\xee\xe6\x59\x21\xaa\xf3\x6e\x5b\x09\xdd\x0b\x4e\xba\x6b\x94\xe1\xa9\x25\x01\x45\x39\x17\xe8\x0b\x0d\x73\x1f\x18\x4f\x2d\x0b\xe8\x4d\xf9\x58\x36\x33\xe4\xf2\x42\x93\x66\xb0\xf2\x21\x06\x0c\x4d\xec\x74\x56\x1f\x45\xa3\xf6\xc3\x92\x5d\xee\x1b\x4f\x46\x44\x52\x77\xcc\x85\x82\x87\x52\x9f\x46\xa1\x5c\xee\x9b\x88\x0a\x3e\x6a\x61\xe0\x4b\x5a\x32\xee\x1b\xc9\x90\x7e\xa0\x4b\xc3\x7f\x96\x36\xbc\xde\x7e\x8c\x22\xde\x98\xdd\xb1\x3d\xec\xed\xfb\x05\x1e\x57\x5c\xd9\x5a\x2a\xf7\x6c\xa4\xe3\xa6\x19\xc4\xbd\x4b\xb6\xd5\x5d\x21\x52\xac\x54\xbe\x5b\x3c\xed\xb6\x77\xf7\xf7\xee\x4e\x2c\xa5\x05\xdc\xfe\x1d\x03\x5b\xbd\xe2\x4a\x1e\xf0\x58\x9a\xe4\xa2\xd3\x67\x33\x0c\xf9\x27\xc8\x79\x1e\xf8\x4a\xe2\xdd\x8e\xe2\xbc\x28\x8b\x37\xaa\x7c\xc7\xd2\x96\x09\x93\x72\x72\xac\x82\x00\x08\x4e\x45\xd4\x14\x0d\x54\x73\x8a\x50\x21\x6c\x6e\xf8\xb4\x30\xf4\x12\x27\x0e\xde\x6e\xcb\x0f\xe2\x83\x68\x19\x9e\xcc\x7c\x8c\xc4\xe7\x41\xbb\x85\x89\x7e\xed\xe4\xcd\x05\x92\xef\xb4\x9a\xed\x3c\x98\x3e\x0a\x82\x30\x4d\x15\x25\x3e\x00\xeb\xeb\xf1\x2b\xde\x83\x69\xc6\xef\x65\xa3\xbf\x56\x91\xc5\x0d\x66\xa8\x83\xc4\x5a\x35\x7d\x2d\x2e\x1e\x84\x86\xe4\xd1\x49\x6d\xc4\xb8\xed\xe0\x0a\x8c\xc4\x83\x28\x14\x0e\xef\x87\x0f\x7f\x2e\xb2\xb1\x55\x13\x44\x29\x20\x71\xf3\xce\x41\xbf\xae\x20\x5f\x3c\x88\x84\xe6\x41\x7f\x2c\x1e\xb2\x02\x34\x9e\xec\xb7\x65\xb5\xfd\xed\x93\x01\x88\x0d\x85\x0e\x6e\xca\x75\x27\xe2\xcb\x83\xc4\x4b\x7c\x49\x40\xa7\xaa\x1c\x46\x6d\x47\xd7\x27\xc2\x80\xcd\xbc\xe0\x52\xe8\x06\xb1\xa6\xc9\xfb\x19\x40\x80\x07\x69\x1c\x99\x0b\xf8\xb4\x3a\xaf\x41\xe8\x49\xa4\x12\x0f\xd2\xc4\x1e\x28\x76\x5d\x20\x7b\x2a\x89\x60\x6c\xcb\x91\x42\xc8\xe8\xfd\x44\x92\xa6\x96\xae\x13\x54\xe3\x32\x24\xa4\xf3\x6f\x75\x9e\x93\xae\xab\xf2\xc8\x78\xb6\x40\xe1\xb2\x5a\x83\x2a\x8b\xa1\x37\xf4\x05\xd7\xf8\x88\xfb\x96\x07\x42\x78\x98\x8a\xdb\x34\xa5\x7a\x1d\x40\xba\x78\x20\x13\x8e\x49\x8a\xc5\x5e\x54\x88\x25\x44\x92\xef\xda\x52\x44\xb9\x4e\x8a\x23\x88\xa2\x80\x77\x2c\xff\x98\x38\x6d\x03\x1d\x49\x0c\xce\xd0\x51\x35\x3b\x66\x9f\x2c\x64\xad\x49\x26\x0a\x25\xd0\x9c\xac\xe3\x2e\xb3\x68\xd9\xdd\xc0\x67\x0e\x20\xa0\x8a\x39\x32\xea\x37\x18\x2e\x11\xd5\x79\xea\xf8\x0b\x20\x0d\x70\xae\xff\x28\x1b\xf8\x7e\x92\xa3\xb9\x0b\xc2\x27\xc1\x4c\xdc\xb4\x77\xf6\x64\xa9\x07\xb6\x48\x00\x22\xc1\x1a\xa4\xda\x05\x63\xf0\xe4\xe8\x12\x7c\x3c\x00\x49\x55\xd2\x08\xba\xed\x60\x22\xa3\x47\x99\x34\x0d\x30\x9d\x46\x7a\x19\x77\xaa\xa4\x6a\x42\xd7\x2c\x52\x24\x29\x59\x55\x59\x7d\x10\xea\x12\xbb\x0e\x0c\x68\x3c\x27\x97\xf3\xd5\x00\x04\xf2\x77\xd9\x7e\x1e\x18\x43\xb5\x7b\x96\xf5\xb3\x2c\x9a\xf6\xf8\xed\x77\x09\x59\x10\x60\xe5\x0b\xe6\x22\xef\xb3\x7a\xa0\x0d\x36\x18\xc9\x90\x45\x86\x69\x37\x0c\xb6\xde\x76\x7e\xf6\x3a\x76\x0d\x1e\xb2\x24\x75\x8a\x07\xb7\xa2\xde\x8f\x35\x98\x78\xc8\x44\x2c\x02\x87\xf6\x7e\xcc\xf6\x59\xee\xd0\xab\x3c\x64\xa0\x10\x22\x5f\x3c\xd4\x2f\xee\x6f\x3c\x02\x44\x0b\xd9\xfa\xf5\x01\x4b\xa1\xed\x12\xf8\x5c\x76\xd1\xd3\x7a\x35\xcd\xc3\xcd\xc3\x20\x4c\x10\xff\xbe\x17\x75\x3b\x13\xa6\xf5\x4a\x79\x18\xc4\x1e\x0a\x54\x10\x5f\xd5\xe2\x7e\x76\xf7\xb0\xfb\x39\xbb\xdb\xee\x56\xcb\xf5\xdd\xd3\x8d\x7b\xaf\x40\x32\x44\xd9\xb9\x18\xd3\x2f\x23\x00\xfd\xd8\x8e\x19\xbe\x4b\x18\xf8\x98\x6a\xa0\x90\xe2\xcd\xe9\x70\x38\xaf\x72\x71\xee\xdd\xe6\x34\x45\x51\xe5\xae\x86\x04\x79\xcc\x2c\x85\xfe\xc8\xaa\x0a\xa3\x90\x84\x8f\x6a\x68\x1e\xe1\x54\x95\xa8\xa4\xe3\xc6\x64\xf0\xe9\xa3\xd4\xa0\x3b\x96\xd3\x7e\xb5\xaa\x70\xb5\x75\xf7\xd1\x12\x7c\x57\x05\x47\x14\xff\xc3\xa1\x8a\x8c\x40\x6b\xac\xc9\x0e\xb0\x2d\xe7\x65\x55\xfc\x72\x69\xc1\x13\x15\x6c\x2c\xfb\x0b\x82\x72\x1e\xc6\x3e\x01\x94\xa8\xba\xc0\x6e\x97\x93\xf4\x7a\xe3\x0b\xe3\xd4\xbf\x70\xf0\xac\xda\x95\x31\x7d\x8a\x84\xb1\xf6\x71\x5a\xda\xcc\x7c\xbb\x57\x61\xa6\xb6\x4f\xa9\xc4\xc3\x24\x94\xbe\x13\x38\x2f\x46\x0c\xba\x3c\x4c\xe2\x38\xbd\x24\xf9\xa8\xe6\xad\x1b\xfa\x2f\x92\x12\x61\xa2\x28\x09\xf4\x9c\xb7\x7d\x2f\xd1\xf9\x30\xd1\x31\x8a\x3e\xd8\xdc\xeb\x0e\x99\x2d\x5c\x63\x1a\x44\x6e\xf4\x17\x4e\x8b\xa0\x5f\xfa\xe0\xba\xc5\x1e\x73\xe5\x07\xa5\xca\x44\x6e\xc7\x6f\xf5\x3e\x7d\x56\x85\xa9\x0c\x91\xc4\x83\x32\xcf\xb6\x76\xe0\x53\xb0\xe6\x67\x20\xad\xff\xfe\xf1\x45\x5e\x96\x87\x42\x0b\x20\x61\x72\xdc\xe1\x06\x45\x7f\x3c\xd4\x41\x8a\xe4\x77\xc8\xcc\x30\x88\xc6\x87\x3a\x24\xfe\x5e\x52\x7c\x19\x93\xac\xda\x4e\xe0\x69\x0c\xa2\xcf\x45\x9d\xa9\x4f\x77\xc2\xb1\x4b\x16\x9a\x38\x21\xea\x4d\x61\x41\xef\x96\x00\x8d\x9a\x23\x4f\xc5\x0e\x9f\x53\x35\xbb\xae\x3e\x9e\x47\x2c\xd2\x98\xe3\x7a\xc1\x3a\xa5\x91\x68\x28\x8f\x58\x22\x91\x7f\x50\x9e\xce\x68\x12\xfe\x0a\x43\x2a\x09\x1e\x71\x8f\xa1\xd9\x7e\x21\x11\x7f\x63\xa9\xbb\x9c\xfb\x3e\xa9\x0f\x34\xe2\x15\x9e\x46\xd1\xb7\xc8\x8f\x42\x61\x59\x2a\x6e\xcb\x4a\xc1\x93\x31\x35\x34\xc3\x63\x6e\x38\xdd\x22\x3f\x52\x58\x34\x83\x12\xfb\x77\x7a\x66\x1a\x2c\x6b\x43\x42\xa8\xc1\x54\x88\x7c\xd0\x09\x15\xd0\xd5\x8f\xf0\xd1\x89\x7b\xce\xdc\xab\x05\x32\xc0\x55\x53\xf6\xe8\x07\x6c\x53\x94\x78\x98\xeb\x51\x86\x91\x45\xc0\x57\xaa\xd7\x18\xfb\x4e\xad\x2b\x53\xd7\x1c\x85\x3c\x8a\x52\x42\x38\xa0\x10\x0f\xe8\x9e\x1b\x3a\xec\x17\x03\x4b\xd5\x85\x03\xc1\x42\x04\x26\xcc\xd4\x28\x89\x24\x16\x03\x7c\xa3\x40\xeb\x85\xbf\x3e\x19\xdd\x32\x11\x3c\xbc\x54\x92\x77\x6a\x06\x03\x15\x7c\x1e\x25\x5a\x62\x1e\x47\x65\xcd\xa4\x55\x13\xa5\x3a\xc1\x6f\xba\x6b\x7d\xb1\x41\x86\x7d\xf8\x38\xe1\x09\x73\x51\x82\x7b\x10\xc5\xf9\x5e\x14\x1a\xc3\xb2\xa3\xcf\x37\xa4\x3c\xe4\x91\x48\x02\x62\x87\xb6\x11\xc7\x2f\xf7\xc2\x48\x88\x04\x09\x00\x09\xca\xd3\xda\x85\xd5\xb5\x37\x1b\x61\xc5\xb5\x8b\x72\x8a\xac\x78\xbc\x68\x43\xdb\x1e\x32\x66\xcc\xef\x0e\xd3\x4d\x99\xeb\xae\x86\x87\x47\x52\x45\x88\xc8\x5f\xea\xd3\x14\x11\xc0\xb5\xfd\x11\xe9\xc0\x70\xa4\x39\xfd\x38\x8a\x42\x3f\xc2\x0b\x92\x92\x30\x9e\xcc\xb3\x66\x21\xea\x91\xa9\x16\xe9\x10\xf0\x5c\x2c\x47\xfa\xc0\xf5\x68\xe6\xea\xd8\x33\xc2\xaa\x24\x38\x5b\xca\xe2\xfb\x6c\x0f\xf0\x24\xc6\x3c\xb4\x28\xb1\xf0\xd9\x22\x5c\xbb\xe6\x50\x80\x53\x39\x03\x92\xbf\x1f\x70\x32\xf0\x08\x22\x93\x5c\x58\xa8\x30\xc9\x37\x2b\xf4\x43\xf6\xe9\xba\x03\x01\xc8\x08\x67\xe5\xa4\x06\xa8\x44\x1e\x81\xa4\x2a\xc1\x53\x95\x8d\x96\xb8\x09\x43\x9f\x59\x59\x85\x3c\xa7\xba\x5f\x77\x95\x11\x41\x4a\xb0\xd3\x3b\x55\x62\xd2\xe7\xf2\x13\x0c\x04\x8c\xf5\xd3\xb4\x65\x35\x28\xa1\xe6\xb1\xa7\x83\x84\x72\xea\x1f\x0d\x41\x25\xcb\xd6\xbf\x70\xcd\x2c\x20\xff\x9c\xf2\x0b\xae\x56\x6c\xf8\x76\x31\x8b\x7c\xad\x3a\xf3\x78\x9e\xe9\xe1\x97\x88\xb9\x21\xe2\xbd\x3d\x54\xe5\xb0\x4c\xc6\x76\xf0\x23\x8f\x61\xdc\x40\x60\xa4\xae\x57\x43\xcc\x63\x5f\x52\x81\xa7\xcc\x74\xbd\xab\x91\x12\x6d\x47\x0f\xea\x7e\x66\x1c\x78\x1c\x05\xb0\x0f\xe2\xa3\x1d\xfc\x55\xe9\x70\x30\x71\xe8\x79\xbc\xe3\x50\xad\x87\xbb\x79\x1c\xfa\x10\x13\x51\xff\x5d\x3f\x15\x1c\x47\x1e\x8b\xda\x75\x52\x62\xa4\xe0\x65\x3f\x3a\x80\xe2\x28\x24\x67\xa1\xdd\x99\x44\x96\x9f\x71\x23\x79\xae\x2f\x37\x8e\x62\x0f\x99\xf6\xea\x83\xc8\xf3\x0b\x63\x2b\x8f\x23\xed\x61\xba\x86\xca\x19\x28\x0a\x6e\x9b\x62\x4e\x86\xbf\x12\x79\xbe\x2c\x34\x6e\x3a\x03\xe8\x24\x8f\x63\x19\x5a\x2f\xa9\x5f\xba\xf2\x65\x34\x2c\x8e\x21\x40\xb7\xdb\xe6\x30\xd7\xf0\x3f\x50\x57\xac\x72\xc9\xd5\x45\x09\x11\xb5\x54\xe2\x0d\x72\xd2\x8e\xff\x9a\x25\xeb\x4b\x53\x36\x6e\xcd\xa2\xc4\xc9\xd1\x80\x76\x9f\x7f\x64\x7d\xc7\x89\x31\xbe\xe5\xad\xdd\x8a\x82\x6a\x75\xea\x8b\x22\xd3\xa8\x77\xca\x7c\x63\x93\xab\x76\xe1\xde\x66\x85\x28\x5a\xfb\xa6\x87\x3e\x89\xd3\x90\x92\x36\x16\x48\x43\x9a\x33\xd7\xca\x0b\x3c\x4e\x13\x6e\x3a\x71\xd5\x76\x3a\x3c\x08\x87\x6f\x8a\x05\x37\xaa\xff\xac\xe9\xe5\x1d\x0b\x45\xc2\x2c\xf8\x81\x6e\xcb\x8a\x28\x4e\xbb\x79\x23\xc3\x14\x01\x67\xdf\xb3\x55\x05\x2a\x2b\x4f\x97\x96\x98\x23\x75\xed\xb1\x2a\x4b\x73\x2b\xb2\x09\xc8\xba\xed\xa9\x92\x10\xb9\x88\x76\x96\x62\xfb\xf5\xd4\x23\xd8\xfb\xc4\x20\x73\x97\xa6\x42\x59\xdd\x03\x4b\x22\x37\xf9\xa0\xd1\x03\x75\x48\x84\x6e\x4d\xe6\xb2\xd7\x0b\x71\x1c\x05\xb1\x62\x2d\x08\xb0\x57\x81\x06\x38\x3c\x6f\x7f\x7b\x1a\x73\xb5\x38\xce\xca\x7f\x75\x1a\x4d\xc9\x24\x8d\x0b\x8f\xc1\x23\x4e\x2e\x2c\x5a\xc9\xea\xa6\xa2\x9a\xd3\x03\xb2\x81\x4d\xcf\x2f\xf0\x7d\x3e\x34\x9e\x44\xe2\x86\x16\x40\x1a\xd5\x91\xc3\x75\xaa\x21\x4f\xa6\x1f\xc9\x88\x8d\x27\x11\x10\x5e\x75\xca\x45\xc3\x1f\x68\xc2\x08\xb5\x8f\xb0\xac\x0d\x99\xc2\x46\x7b\x82\x49\x23\x16\xf4\x38\xa2\xa0\x50\x30\xda\x06\x8d\x60\x8e\x32\x83\x34\xfc\x47\x54\x15\x3c\x36\x8a\xa3\xae\xc8\x11\xc1\xf0\xab\x1e\x35\x24\x4f\xbc\x88\xac\x29\xa1\xdb\xf5\xa3\xb3\xa6\x67\xab\x8d\xb5\x71\xff\x35\x1c\xfb\x4f\xfe\x6c\x6f\xcc\x78\x84\x05\xb2\xf2\x74\xbe\x5f\xcc\xd6\x6e\xeb\x4c\x98\x88\x10\xc3\xb3\x39\x96\x45\x5d\x56\xa0\xef\x1a\x38\x7c\x2b\xcb\x35\x8a\x5c\x75\xbd\x24\xf3\x4d\xc7\xe4\x27\xa1\x99\x9f\x1f\x4f\x07\x6b\x55\x5d\xac\xfd\x84\x49\x1f\xd1\x09\xc7\x5c\x5c\x25\xe2\x5c\x38\x2d\xf1\x23\x85\x73\x6d\x2f\xea\xaf\x0a\x31\x79\xe2\x1b\x89\x41\x29\xdd\x7a\xc5\xdf\x44\x3d\x3f\x55\x97\x23\x23\x09\x38\x50\xf5\x6a\x2f\x04\x7e\x5b\x95\x87\xaf\x13\x07\x49\x60\x8d\x62\x0a\xb8\x0c\x1f\x18\xa4\x21\x26\x88\x0f\x67\xaa\x7e\x76\x8f\x0a\x75\x10\x3b\xaa\x7e\x4b\xe9\x43\x4a\xa9\xc3\xcb\xa3\x30\x36\xb1\x93\x7d\x79\x84\xf7\x31\xa1\xff\x94\x4f\x98\x44\xa0\x7d\x47\xed\x37\x6f\xca\x9f\x59\xb3\xdf\x34\xea\x6a\xb1\x7f\x22\x73\x74\x5d\x36\x32\x21\x8b\xe4\xbe\x4e\x0c\x24\x93\x6f\x40\xed\x91\xdc\x12\x57\xd1\x64\xb0\x37\x89\x0d\xb3\xdc\xbb\xe2\xb0\xee\xcb\xfa\xf1\x24\x09\x88\x2f\xde\x08\xdd\x8d\x50\xa2\x63\x3a\xbf\xa1\x19\x7b\x2e\x49\xaa\x62\x47\x54\xbe\x81\xd6\xae\xe9\xe7\xef\xfb\x36\x62\x22\x38\x60\xa2\x8f\x76\x3d\x1c\x69\x14\x6a\x18\xbd\x9b\x48\x18\x1d\xf7\x19\x54\x1e\xfa\x61\xee\x35\x84\x51\xda\x3e\xca\xea\x44\x8f\x90\x3c\x89\x04\x1f\x67\xb2\x2d\xe0\xc0\xa2\xc2\x99\x63\x4c\x73\xb7\x51\x29\x13\x14\xc3\x73\xd1\x92\x76\x62\x7d\xdb\xde\x3d\x32\x5f\x8b\x69\x3f\x20\xd1\x41\x8c\x31\x10\x09\x8b\xb2\xa8\x9b\x0b\x64\x20\xd1\x61\xe4\x3b\x2f\xf7\xa9\xb0\xf0\xe9\xe9\xd9\xa9\x23\x82\xdf\xba\x9a\xfa\x2b\x5a\x86\x6e\x15\x01\xd7\xae\x1c\xf1\xa1\x7e\x19\x0d\x39\xf8\xa1\x2b\x87\x7f\xbe\x2b\x9a\x64\x3a\x02\x90\x40\x28\x84\x70\xf4\xd5\xab\xaa\x93\x99\xe6\x09\x48\x0f\x95\x5d\xb1\xb6\xce\xc6\xf7\xda\xa9\xd9\x97\x46\xed\x79\xfe\x97\x48\x72\x02\x32\x74\xac\x22\x84\x7e\xb7\x91\x15\xdb\x73\xf0\x6b\x0d\x4b\x3c\x75\x41\x0c\x6d\x8e\x1d\x19\x04\x4f\x4c\xc0\x10\xcf\x4a\xe1\x95\xd5\xf7\xdf\x3a\x32\x3b\xea\x90\x7a\x91\xc7\x6d\xc4\x79\x68\x61\xa7\x5e\x2a\xd2\xcb\x34\x42\x60\x59\xd7\x24\x42\x69\x6b\xfd\x8a\xd6\x46\x1a\x8e\x5b\xea\x49\x8d\xe7\x6e\x46\x11\x70\x0c\xc2\x4f\x11\xa8\xf3\xd4\xd3\x12\x4b\xd9\xe4\xa9\xc2\x1c\xd3\xac\x28\x5b\x3b\xef\xcb\x10\x7f\xea\x41\x47\x7b\x8d\xf7\x1c\x08\x8a\x4e\xad\x88\x94\x85\xa9\xd5\xdb\xae\x1b\x4c\x18\x42\x55\x77\xd3\x3d\xe5\x3e\x47\xee\x9f\x5d\x56\x3f\x9c\xef\x41\xbc\x9c\x06\x69\xf5\x94\x5b\x9a\xf4\x59\x95\x15\xfd\x83\x30\xe5\x22\x46\x7b\xf1\xff\x66\xff\xe7\x7c\xfc\xd4\xe7\x21\xc6\x52\x3a\xcb\xe8\xbe\x7c\xb7\x09\x8c\xae\x4b\x1c\xa0\x0b\xbb\x51\x65\x75\xcc\x10\x8c\x31\x1a\x96\x20\xd2\x89\x2d\x4d\xbe\xfb\xf6\xd4\x8e\x46\x3b\x1c\xa4\x29\x33\xee\x9a\x84\x31\xd5\xb5\xac\xe1\xad\x7c\x85\x91\x3f\x91\x06\x09\x30\x7b\xab\x0d\xfa\x66\xc3\xb3\x38\x0d\x24\xa0\xc0\xc2\x5c\x54\x0a\xf2\xb2\x10\x6f\xf5\xba\x3c\x88\xae\x59\x91\xd2\xfe\x3c\xfb\x50\xab\xaa\xfc\x7b\x0f\x35\x0d\x13\xaa\xfb\x47\xc2\xd6\xeb\x49\x6e\x7b\x45\x91\x8a\x5c\xa6\xfa\x97\x51\x93\x48\x1d\x01\x48\x7b\xec\xaf\x5b\xa7\x02\x0b\x7f\xfb\x41\xea\x34\x92\x01\xe2\x59\x28\xc8\x69\x83\xbd\xc3\xa1\x89\x03\xc9\x5c\x1c\xd4\x71\x51\xae\x5a\xe7\x77\xe8\xbb\xa6\x89\x07\xb8\x11\xde\x67\x06\x06\xdf\x37\xf1\x13\x8c\xd7\x20\xd9\xe7\x6e\xd9\xba\x85\x9d\x81\x9a\xa6\x5c\xa3\xa3\x96\x59\x47\xb2\xcb\x62\xe0\x99\xc0\xbb\x6e\x01\xf1\x8e\xae\x97\xb3\xfb\x87\xde\xb2\x77\xcd\x21\x30\x0b\x3e\x5d\x13\xb5\x76\xeb\x94\x5d\xca\x98\x5c\x37\xc5\x31\x8a\xd0\x1a\x6d\x6b\xa0\xbc\xfa\xe8\x46\x26\xc6\xad\x66\x55\x16\x7f\x65\x1b\x54\x6d\x1d\x8d\xab\xe0\x61\x6a\xfd\xdb\x37\xa8\x1a\x27\x39\x38\xac\x12\x71\x7d\x85\x87\x59\x85\x9b\xd9\xdd\xfd\xef\x0e\x7b\x92\x0a\xad\x70\xd9\x1f\xb2\x62\x83\xcc\xdd\xf8\x53\xe3\xe7\x8d\x8b\xe2\xa7\x32\xe2\x68\x6b\xa0\x4a\xcd\xc8\x2e\x48\x65\x7a\xc1\xee\xd9\x7c\x5c\x17\x2f\xb9\x3c\x5a\xb1\x30\x62\x2e\x4a\x7e\x3c\x35\x56\x15\xa4\x94\x39\x1c\xea\x5f\xa6\xaa\x19\x52\x15\x41\x28\x07\xde\xcd\x54\xde\x2a\x55\x5a\x2b\x71\x49\x0d\xb6\xd6\xad\x3b\x97\xca\xaa\x97\xdd\xbe\x85\x91\x49\x92\x6a\x16\x4a\xd1\x89\xe4\x54\x15\xa8\xe6\xf6\x54\x60\xe7\xbb\x7a\x21\xf2\x1c\xf4\xd3\x45\xd7\xcc\x5d\x14\x09\x2c\x96\x22\x76\xe7\x39\x14\x60\x32\x95\x89\x2e\x99\x9c\x1a\x9f\x70\x68\x12\xcb\x7e\xed\x96\x37\x78\x65\xe1\x05\xc6\x11\xb7\xcc\x85\xbe\x60\xd8\x05\x4b\x39\x42\x76\x91\x4a\xbe\xa7\xc6\x38\xed\x98\x08\x96\x92\x1c\xf2\x4b\xf6\x06\xab\xaa\x6c\xf7\xec\xaf\x52\x08\x82\x19\x1f\xf9\x2c\x56\x55\xf9\xd6\x5f\x12\xc2\x8f\x19\x15\x8e\xec\xcb\xf7\x87\x33\x3a\xe5\xc3\x38\x8f\xf0\x13\x81\xde\xc1\x01\x74\xd6\x7a\x23\x83\x04\xa7\x08\x84\x89\x2e\x85\xad\x0b\xd1\x58\x0b\xe2\x62\xce\x8c\x63\x96\x22\xf4\x3c\xaf\x4b\x92\xd9\x02\x1e\x77\xbb\xc8\xf7\x71\xb2\x58\xd9\xac\x2a\x93\x8e\xc7\x61\x34\xf9\x44\x6b\x55\x6a\xca\x15\x1e\x44\x75\xbe\xcf\x7a\x5a\xa9\x5c\x44\x11\xa3\x0a\x92\x06\x8e\xdb\xf7\xb2\x17\x86\x10\x51\x64\x70\xa7\xc2\x04\xdb\xa0\x21\x26\x24\xbb\x40\x5d\x59\x3a\xa5\x87\x16\x82\xeb\x28\x39\x73\xa5\x8f\x3d\x92\x11\x3a\x13\x46\x6f\xa9\xa8\x20\xb4\xfd\xde\x99\x9e\x9f\xff\x41\xd6\x46\xc4\x41\x88\xfb\x65\x3b\x39\xe7\x59\xb3\xfc\xf3\x24\xf2\xcd\x49\xa9\xcb\x26\x2f\xe2\x24\x26\xd1\x6b\x68\xa0\x3a\x64\x85\xdb\x2f\xa9\x9e\xd6\xd5\xd5\x7e\xe5\x69\x8a\x58\xd0\x5e\x88\x34\x12\x7f\x0d\xe6\x44\xac\x02\x74\x21\xb6\xfb\x4c\xa9\x5e\x89\x90\x88\x95\xc1\x2d\xb2\x10\xcd\xa9\x12\xf9\x73\xd1\x9d\x81\x22\x31\x1c\xe5\x3d\x31\x41\x56\x88\x7c\xb4\x78\x84\x34\x1a\xec\xb1\x75\x7f\x2a\xd4\xeb\x94\x75\x2d\x34\x57\x18\x7b\x3a\x88\x0f\x2a\x89\x1e\x52\x37\x71\x01\x5e\x8c\xbc\xce\x6b\xd4\xae\x39\xf4\xa2\xbe\x5d\x07\xc1\x08\x8c\x6b\xf3\x35\xa3\xc9\x0c\x52\xa0\xcd\xb9\xd9\x67\xc7\x41\x85\xc7\x34\x3a\x60\x60\x9d\x7d\xf2\xb9\x0c\x0f\x30\x4a\x68\xe1\xcb\x68\x3a\x77\xbf\x7e\xd4\x35\x48\x30\x51\xb2\x7d\xbe\x71\x54\x48\x5c\x98\xc4\xa0\xb5\x27\x4f\xd7\x20\xcd\x2f\x23\x4b\xd2\x8b\x35\x81\x85\x45\xbd\x9f\x0b\xf5\x4a\x08\xe8\xf2\xda\x80\x93\xcc\x0a\xdb\x09\xad\x11\xd5\x71\xcc\x9d\x76\xd3\x84\xb0\x90\xbd\x86\x33\x0f\x6b\x95\x2f\xf5\xfc\xee\x57\x55\x9f\xc5\x22\x24\xe7\x1c\xed\xf4\x76\x37\xb1\x7e\x4a\x7e\x1a\x7d\x23\xe9\x33\x62\xfb\x5b\xe6\xe7\x66\x5f\x65\x5d\x7a\x5b\xfa\x49\x14\x93\xa5\x81\x80\x43\x2b\x32\x59\x56\x9b\xec\x05\x67\x1c\x5c\x91\xb1\x0d\xfe\xdb\xde\x25\x60\x42\x04\x36\x72\xdd\x37\xc5\xbe\x8e\x15\xca\x20\xf2\x29\xed\x27\x0a\x3a\xcc\xc6\xaf\x1d\x24\x9e\x23\xc0\x5c\xc3\x0b\xd2\x8f\x0e\x69\x1d\x7a\xf7\x02\x83\x99\x50\x0a\x1e\xba\x9f\x17\x7a\xc2\xdd\x00\x49\x65\x10\x5d\x38\xbc\x30\x4c\x03\x65\xc3\x11\xdb\x4c\xbd\x42\x33\x3f\xf7\x0a\x0a\xae\xd5\xec\xfa\x2b\x5a\x86\x82\x23\x05\xc3\x41\x7c\x6c\x3f\xbe\x89\xba\x0f\xc3\x93\x11\x0b\xb0\x11\x63\x3c\x3b\x61\x2e\x69\x6c\x19\x05\x02\x9d\xd4\x1f\x59\x9d\x95\xc5\x6f\xee\xcf\x89\x0a\x50\x38\xd0\x56\x5d\xf4\x1d\x4a\x29\xc3\x18\x2d\xe8\xe1\x64\x77\x8d\x51\x64\x21\x59\x96\x5f\x6d\x3a\x60\x28\xb5\x97\x86\xb6\xf8\xf8\xae\x9e\x9f\xce\x13\xea\x9e\x8e\x1c\x80\x4b\x08\x81\x40\xfb\xfb\xeb\xca\xc8\x6b\xa3\x55\x42\x4a\xd2\x59\xe4\x1b\xe1\x81\x7a\x71\xc6\x24\xc8\x30\x91\x8e\x9e\x12\x5b\x9f\x8c\x71\xaf\x6f\x18\xc7\x68\x87\xaa\xf3\xfe\xae\x28\x4d\x40\xde\xaf\xae\x44\x56\x6c\x9a\x4a\x9c\x07\x40\xee\xae\x57\xe0\x53\x82\x46\x43\xf5\x80\x14\x2c\x5f\xe8\x08\x7d\xb2\xb3\x5c\x4d\xd5\xe1\x23\x42\x3f\x88\x2f\x52\x84\x14\x73\xe9\x43\xf1\x46\xe3\x6c\x12\x2d\xfd\x8b\xf6\x70\x5f\xe5\x24\x0a\x5c\x1f\xe3\x69\x6f\x48\xc8\x34\xd3\xe2\xd8\xb4\xbf\xe1\x9a\x38\x9c\x2b\x8f\xd1\xb1\x5f\xd3\x3d\x91\x1a\x01\x8d\x47\x7f\x38\x1e\x8a\x25\x14\x60\xc3\x54\xf6\xcb\x95\x22\x05\x57\x0c\x04\xfa\xab\x80\xcc\x2a\x0a\x1c\xec\xcf\x0e\xbb\xe2\xbe\x46\x8e\x99\x59\xeb\x8c\x77\x5a\x1d\xa3\xa7\x70\xed\xe3\x89\x8c\x5f\x04\x0e\x63\xc8\xd7\x97\xdb\xa8\xf2\xbd\x00\x33\xa3\x82\x2c\x36\x54\x5e\xe9\x2b\xf8\x72\xe5\xfb\x1e\xde\xbe\xdd\xd6\xfe\x4d\x98\x92\xed\x3e\xab\xd7\xce\xe3\x50\x41\x44\xa8\x9e\x6f\xe2\x00\x9b\x63\x56\x65\x4d\xef\xd8\x54\xa1\xc7\x04\xeb\x69\xee\x7e\x8d\x4c\x55\xa1\x67\x30\x9e\xbc\x05\x71\xb0\xda\xee\x7d\x4e\x56\xae\xc2\x80\x64\x67\x90\x0d\x7d\xc0\x0a\xdb\xbb\x89\x8e\x6d\x5e\xbc\xd0\x33\xfd\x96\xd5\x65\x55\x7f\x45\x0c\xc1\x55\xc4\x13\x64\x23\x70\x6c\x02\x7d\x4d\x03\xae\xa2\x20\xb5\xb8\xce\x02\xea\xac\xee\xd5\xdb\xa9\x28\x14\xe8\x23\xc0\xc5\x6f\x50\x51\x1a\x46\x91\xc3\xaa\x8d\xa2\x99\xfd\x85\xaa\x62\x46\x88\xa9\x17\x68\x66\xc7\xe3\xd0\xd7\x55\x71\xa0\xb0\x0a\x6f\xb9\xfa\xd1\x5f\x8a\x2a\x0e\x89\x1a\xab\x21\x85\x95\x83\xb8\x8c\x75\x0c\x22\x34\x1d\x7c\x0a\x63\x2c\x33\x87\x95\x73\x7d\x12\xcf\x28\x4a\x1a\x76\xd1\x30\xd7\xc2\x0c\xa6\x28\x1f\xee\xe7\xbb\x7b\x78\xb9\xcc\xc2\x24\xf6\xd0\x23\x79\xc8\x8a\xcb\x6d\x62\x8e\x30\xa2\x1f\x59\xf5\x52\x8e\xb2\x7a\x2a\x8d\x88\x8b\x0e\x67\xe4\xf7\xec\xde\x81\x25\x94\xf0\x12\x0c\x04\x21\x05\xdd\xad\xd0\x50\x9e\x9a\x6d\x49\x0a\x35\x75\xdf\x60\xbe\x22\x55\x1e\x7d\x2f\xc1\x0d\xe2\x5f\x6e\x17\x4f\x77\x8f\x8c\x31\xef\x8b\x52\xb5\xd1\xa5\x92\x91\xd0\xe1\x72\xfb\x7d\xe9\xec\x10\x25\x25\x73\xba\x16\xd7\xd0\x1f\xa5\x22\xe9\x05\x96\x60\x9d\x24\xfc\xfe\x02\xbd\xd4\x19\x2d\xea\xd1\x9a\xd6\x10\xa0\xb1\xd7\xec\x2b\xa8\xf7\x9d\x82\x32\x57\xda\x80\xdf\x15\x89\x3b\xc6\x09\xda\x46\x87\x77\x00\x8f\x38\xda\x6e\xa8\x2a\x62\x73\xca\x54\xd6\x55\x38\x28\xf0\x84\x31\x3d\x6c\xd9\xac\xd0\x03\x45\xea\x2f\xb0\x9e\xd7\xe3\x08\x9e\xf1\x9d\x7c\xed\x76\x5f\x95\xef\x94\xb8\xba\x6f\xcf\xf5\x66\x0d\x6f\x78\x2a\x3e\x96\x4d\x3f\x31\xab\x80\x05\x09\x81\xb0\xf3\x52\x0c\xf8\x23\xb9\x32\x9e\x08\x64\xaf\x48\x68\xd9\xec\xbf\x5e\x79\xc6\x03\x02\x4f\x82\xa8\xd4\xde\xd1\x48\x0f\x07\xc4\x70\x93\x30\x17\xf6\xf9\xf3\x74\xc9\xb0\xb8\x76\x1d\x23\x1b\xf8\xb1\xac\x9b\x7f\x97\xf2\xd3\x03\x67\xb8\xc0\x8c\xd1\x68\x15\x6c\xd7\xcb\x25\xe2\xf9\xec\xef\xd3\x1e\x4b\xd0\xa8\x7d\x85\xf3\x1a\xfe\x3c\x65\x55\xb7\x46\xb4\xc7\x25\x8e\xd7\xf7\xd9\xfa\x66\xb7\x98\xad\x76\x77\x8f\x56\x2d\xce\xf5\x60\x51\xa7\x58\xfa\x90\x15\x98\x25\xbe\xb0\x8b\xf4\x23\x67\x9a\x49\x8e\xb5\x93\x3b\xa1\xcb\x63\xb3\x11\x07\x58\xe4\xa2\xae\x67\x1f\x19\x0c\x3d\xd9\x4f\x90\x7e\x9a\x19\x92\x75\x94\xa2\x78\x25\x14\xfc\xb6\xb7\xd2\x91\x06\xa9\x63\x5a\x13\x2f\x50\xcf\xe1\x25\x2b\x96\x5d\x38\x55\x07\x91\x48\x09\x80\x5e\x37\x7d\xcd\xd3\xab\xc4\xc1\x84\xc6\x1d\xd7\x61\x10\xa0\x00\x87\xce\x6a\xd1\x9a\xd3\xbd\x3c\xba\x0e\xd3\x88\xb8\x03\xea\x55\xd9\xd3\x14\x9a\x9c\x83\x3a\x0a\x22\x54\xe3\x3d\x0a\x95\x99\xac\x6e\x0e\xa8\x36\xbb\x86\x3f\xdd\xdd\x62\xa5\x10\x6c\xb1\xfd\xf8\x32\x30\xaa\x13\x13\x92\x0e\x09\x0a\x6f\x7d\x59\xc6\xae\x53\x9e\x60\x72\x70\xf3\xf3\xee\x76\xbb\xb9\xd0\x37\xbb\xe6\x28\xc0\xc0\xe7\xaf\xbf\x2f\xf0\x9b\xf5\xcb\xb8\xb5\xf0\xa5\x23\xa9\x1c\x61\xad\x86\x37\x11\x26\x42\xa9\x32\x17\x54\x5b\x45\xee\x0e\x52\xe8\x20\xb0\xa4\x67\xd5\x93\x19\x2c\x21\x2d\x95\xc6\xf8\xcc\x3b\x64\x6b\x71\x45\x44\xc6\xb5\x12\xa9\x0b\xa3\x3c\x88\x22\x33\x50\x37\x77\xba\x9e\x9f\x49\x8c\x00\xeb\x12\x87\x17\xe8\xb0\xc3\x49\x2d\xf2\x0c\xcd\x90\xe1\x60\xe8\x34\xc2\x24\xd5\x6b\x96\xe7\x35\x16\xa6\xb9\x17\x35\x31\x71\xab\xae\x9f\xee\x97\xbb\xe5\x6f\x8b\xef\xb3\xc7\x6f\xdd\xae\xa9\x8d\xf4\xfc\xc8\xa2\xf6\x5b\x4b\xa8\xf5\xc1\xfe\xf3\x79\xb9\xdd\xf0\x13\x80\x17\x01\xc2\x00\xbf\x97\xcd\xe2\xb2\x4d\x02\x63\x3e\x79\xb1\xb9\xc8\x0e\x6b\x10\xda\xd6\xaf\x4d\x7d\x72\x60\x41\x88\x88\xc0\x55\x99\x8b\x2a\xab\x9f\x8b\xec\x0d\xa3\xe1\xfd\x13\x13\x58\xa8\x62\x1a\xed\xd6\x9a\xd3\xb6\x4a\xa2\x57\x9f\x07\x2c\xf2\x98\xb5\xb3\x40\x4f\x6b\x76\x72\xe0\x29\x31\xca\xd7\xad\x17\xb1\x34\x06\x54\x33\xcd\xc6\xc9\x81\x6b\x96\xa8\x0b\x8b\xe1\x5d\xbd\x3e\x15\x17\x51\xcc\xb6\x5d\xa0\x0b\xf1\x9f\x93\x28\x1a\xa4\x40\x9b\x0c\x7b\xfd\x8d\xf3\xf6\xc9\xb8\x72\x13\x62\x55\x58\xbd\x3f\x35\x37\xe5\x3b\x92\x6d\x8d\x7e\x8a\x1f\x9a\xc8\x16\x49\x7e\x2b\xc5\x80\x39\x9f\x83\x2f\x53\x24\x98\x7d\x7c\xb8\x1d\x0c\x63\x90\x6a\xf4\xa3\x6f\x9f\x1f\x6f\xee\x1e\xbf\xed\xbe\x3d\xcd\xee\xbb\x36\x1d\x23\xe9\x74\xf9\x71\xe9\x1f\x7a\x3e\x66\x31\x5d\x59\xfa\x12\x91\x6d\xd0\x35\xa7\x02\xc3\x38\x15\xb4\xa7\x08\x95\x31\x4e\xae\x55\x08\x65\x6a\x58\x27\x87\x7a\x29\x92\xb9\x18\xc4\xae\xa3\x0e\x95\xdd\x7b\x57\x77\xa4\x07\xcd\xe2\x4b\x23\x49\xb0\xd0\x09\xb7\xb2\xaa\xa5\x63\x8c\xee\x70\x9c\x22\x3f\xc6\x1d\xf6\x5e\xc8\xa6\xac\x4e\x87\xc1\x78\x44\x2a\x41\xab\xd0\x42\xf0\x9e\xe4\xff\x40\x35\x6b\x50\x70\x6c\xae\x90\xed\x10\x4b\x11\x5b\x36\x47\xeb\x54\xcc\x28\xa8\x35\x7c\x60\xe2\x85\x88\x87\x6a\x8f\xdf\xe5\x07\x45\x93\xdc\xf3\x12\x26\x31\x56\xa2\xb3\x3a\xcf\x5e\x61\x01\x39\xc8\x6a\xa2\xba\xd5\x75\x8f\x34\x77\xb0\xa2\x41\xa1\x77\xef\xe4\x84\xd4\x53\xbe\x4f\x35\x1e\x1d\x90\x0f\xd2\x30\x0c\xa1\x0b\x6d\xa3\x80\xc1\xbd\xa8\x1b\x02\xb6\xde\xdd\x8c\x7e\x59\x1a\x46\xc6\x56\x92\x36\x25\xf1\x5f\x64\xc5\xcb\xfc\x54\x67\x05\xd4\xf5\x0d\xbc\x7d\x96\x7c\x1f\xbd\x6f\xaa\x48\x2f\xe3\x78\xca\xf3\x09\xc2\x7f\x0e\x22\x0e\x9c\xe5\x8f\xed\xe8\xe2\xdf\x15\x3f\x97\x77\xee\xc5\x85\x54\xe8\x4e\x1d\xcb\x3a\x93\x39\xac\x41\xc3\x01\x3f\xc6\x38\xff\x0c\x42\xa7\x4e\x74\xe1\x01\x5e\x84\x2c\x47\xd1\x38\x10\x46\x90\x04\xcc\xbe\x7c\xbf\x5d\xb5\x0e\xe6\xac\x2b\x30\x02\xe5\x27\xc0\x2f\xf5\x51\xa3\x7b\x6b\xcf\x73\x20\x31\x9b\xa4\xaa\x0e\xe7\x81\xa8\x03\x07\x1d\x46\x98\xa5\x6b\x0e\xc7\xff\x9c\xa0\x3a\x6f\x00\xa6\x25\xb7\xdb\xae\x09\x09\xe0\x37\xfb\x0b\xe6\xac\xbb\x4f\xe4\xa1\xf5\x44\xaa\x2f\x73\xac\xa3\x3c\x1e\x5c\xbe\x06\x20\x00\x4f\xda\x62\x3a\x2c\x31\x0d\x5d\x8b\x09\x14\x7a\x75\xfb\x52\xe7\xa4\x20\x12\x3d\x74\x6d\x89\x8a\x89\x36\x68\x50\xf4\x03\x46\x13\x83\x1d\x74\x4e\xf2\xa1\xf3\x3d\x8c\xe7\x7b\x60\x0b\xca\x4f\xf5\xb6\x3c\x91\x6b\xee\xc8\xa7\x06\x3f\xc9\x78\x92\x44\x5d\xa9\xee\xf8\xf6\x52\xc0\x6c\x3c\x45\x8b\xf4\x12\x9c\x70\xbb\xc6\xf0\x0e\x8c\x25\xe8\x04\x0d\x2c\xf2\x49\xb4\x98\xf1\x23\x2e\x44\x5f\x26\xa0\x35\xb4\xda\xd9\x3e\xde\x65\xaf\x02\x4d\xc3\x7a\x28\xe3\xa7\x3e\x5a\xa1\x76\x53\xef\x45\xcf\x8d\x9f\x0a\x8c\xdd\xce\xd6\xbf\xad\x84\x7a\x15\x36\xea\xe2\x5a\x4d\x8c\xd6\x90\xb0\x34\x7c\xbb\x6a\x00\x9e\x30\x41\x18\xa7\xce\x08\x9f\xfe\x0d\x61\x0c\xb8\xa5\x03\x42\xe5\x07\x05\x6d\xbd\x17\x0c\xff\x1f\x67\x6f\xd6\xdc\x38\xae\x6c\x0b\xff\x9d\x7e\xd8\x0f\x04\x31\x90\x7c\x94\x65\xb9\x4a\xb7\x3d\x7d\x96\xaa\xab\xfb\x9c\xb8\xa1\xc0\x90\xb0\x79\x4c\x91\xda\x24\x65\x97\xf7\xaf\xff\x82\x09\x80\x93\x68\x77\x9f\xfb\xd2\xd5\x61\x40\x1c\xc1\x44\x0e\x2b\xd7\x32\x19\x37\xae\xc2\xf7\xa3\xbc\xed\x15\xb4\x63\x2b\xe2\x28\x0d\x8a\x1a\xf3\x54\xa7\x15\x2c\xc5\xcc\x9c\xd7\xa0\xe9\x7f\x03\xae\x6b\x2d\x6f\x96\x9a\x4d\x6d\x4a\x38\xa2\xf4\x5d\x0b\xcc\xf5\x66\x75\x7d\xbb\x0d\xe4\xeb\xb1\x4d\xb9\x06\x2f\xb8\xfc\x59\xbe\xbf\x3f\x7f\x9a\x72\x96\x0e\x90\x6b\xcc\x2e\x3e\xe6\xbf\xa0\x98\xc8\x36\xfe\x37\x11\x17\x4d\x05\xfd\x01\x04\xc2\x60\x37\xbf\x76\x2f\x50\x4c\xb6\x7e\x9b\x91\x0c\xfd\x83\x52\x1e\xe1\x26\x2f\x66\x32\x7a\xdd\x38\x20\x2c\xe0\x4a\xff\x6a\x9a\xe9\x2f\xd3\x0c\x3c\x87\x87\xa3\x7c\xea\xd6\xf1\x0e\x55\x76\xa6\xa7\xcf\x52\x45\x3c\x19\x1e\x8a\xa1\xd4\x13\xdc\x88\xcd\x14\x8d\x84\x07\xcd\x74\xef\xe4\xeb\xfc\x87\x95\x34\x13\x2e\x48\xdc\x15\x79\x08\x73\x7c\x2c\x1c\xa6\x64\xae\x78\xf1\x50\x8f\xa0\x0f\x56\xc9\xc8\x81\xb7\x1d\xd2\xd2\x5d\xc4\x77\x59\x9b\xb5\x3c\xf5\x73\x94\x46\x47\xd0\x39\x42\x63\xfa\xef\x89\x6b\x6f\xb5\xa0\xe8\x48\x5f\x83\x3a\x3f\x0f\x4a\xe8\x7e\xd4\x08\xe9\x64\x69\x5f\x40\xbf\x3e\xd6\x55\x65\x7f\xbb\x90\xa7\x0e\x53\x13\x83\xeb\xf6\xa0\xce\x1f\xb3\x05\x64\x14\x18\xd7\x04\x72\x0d\xd7\xb0\xdc\xcb\x61\x41\x46\xe8\x56\x78\xb5\xda\x47\xac\xf3\x2c\xaf\x02\x50\x12\xe9\x78\x64\xad\x72\x0c\x1f\x9a\x53\x55\x36\xee\x2b\x9d\x1e\xd4\x12\x1d\x2a\x58\x77\xd0\x4a\x23\x5b\xf9\xe3\x29\x78\x32\xd6\xaa\x24\x38\xf7\x3f\xab\xfa\xd5\x16\xd5\xfb\x7d\x0f\x16\xa1\x51\x94\x44\x7c\xcc\x80\xfb\x6d\xff\xd0\x0f\x81\x03\xfd\x3b\x9c\xde\xe4\x76\xc6\x4e\x2b\x8d\x88\xe2\x21\x9f\xd2\x3e\x9c\xa0\xa7\xcc\xa3\x11\xd1\x2a\xb0\x9f\xae\x0a\x27\xae\xf9\xdb\xe4\xa7\x31\x89\x10\x8f\x70\xb5\xef\x02\xf6\xff\x65\xb8\xdf\xfd\xdc\x85\x9c\xf6\x8c\x49\x83\x33\x3c\x76\xfb\x46\xf3\xf2\x65\xc1\x95\x76\x41\x2f\xfa\x55\xc7\x8f\x8b\x0e\x17\x1a\x51\x02\x81\x03\x6b\x77\x3e\x3e\x58\x57\x8d\x6b\xfa\xe1\x24\xf2\xca\xfe\x4e\x5e\x7c\x02\x00\x9a\x9e\x86\x66\x8c\x0e\x92\x4d\x4f\x08\xdb\x1c\x00\xbd\x34\x62\x22\xc5\xa8\x09\x5b\xe0\x03\x57\x74\x1a\x06\x25\xa3\x03\x1f\x98\x99\x94\xbe\xba\x51\xa1\xb2\xf0\x35\x3b\x94\xc5\x32\x57\x3b\x8d\x38\x4f\xb5\x43\xf1\x7c\x7c\xcb\x6d\x5b\x85\x43\x88\xd8\x49\xb9\x79\xfe\xf8\x40\xa3\x35\xeb\x04\xa3\x91\xd0\x1a\x2f\xe4\xdf\xdd\xbe\xde\xf7\xf1\x8f\x97\x20\x8d\x12\x13\xe1\x56\xf2\x3f\xf2\x3f\xff\xf9\x35\x32\x3b\x34\x4a\x25\x0d\xcb\x6f\xab\xab\x51\x15\x83\x46\x59\x44\xb9\x93\xf5\x91\xc8\x6c\x15\x2e\xc1\xec\x2b\x23\x3f\x66\x67\xc8\x14\x53\x81\x80\xaa\x2a\x8a\xad\x81\xb2\x9d\x6a\x57\x2d\xd5\x51\x68\x24\x13\x86\x5c\xc3\xeb\xfa\xe3\xa4\xa1\x9c\x5c\x9b\x54\xdc\x09\x24\x42\x69\x56\x45\x81\xbc\x6f\x98\xbf\x9a\xdf\x9e\x84\x04\xf9\x8f\x56\x6f\xad\x9e\x1c\x41\x59\xd7\x20\xff\x26\xcf\xc5\x14\x5b\x4f\x23\x1d\xbb\x67\x92\x37\x41\x01\xf8\xa1\x9e\x24\x83\x66\x8b\x52\xc7\x0e\x91\xa0\x6b\xf3\x3f\x41\xca\x39\x0c\x25\x54\xf3\xc0\x4a\xd5\x39\xa4\x5f\x61\x4a\x69\xa4\x25\xc3\xdd\xdb\xe6\x65\xde\xbc\x4c\xb8\xbd\x69\x64\xe2\x34\xa2\x23\xc5\xdb\xc7\xaa\x41\xe7\x72\x6c\xe5\x69\x64\x84\x93\xa3\x7f\x94\xb5\x34\x79\x03\x97\xf0\x30\x1a\x19\x70\x59\xe4\x6f\x80\x82\xf8\xa3\x4f\x20\xfd\xd7\x78\x25\x03\x4b\x03\x47\xf8\xf9\xe4\x45\x51\xc3\x79\x40\x5b\xeb\x50\x16\xaf\xcd\x7f\xfa\x95\x61\x81\xdb\xa8\x5f\x9a\x9d\xd9\x0a\x3c\x14\xd3\x47\x66\x21\x0b\xe2\xdb\x43\x24\x46\x49\x14\x39\xe9\xcf\x6f\x55\x3b\x7a\x8a\x24\xea\x1c\x6a\xd7\x24\xd1\x06\xf8\x62\x5e\x56\xa7\x02\xfe\x0a\x10\x08\x4a\x22\x66\xb2\x78\x5a\x5c\x75\xed\x45\xcd\xae\xad\xf3\x81\x16\xc5\x6f\xf7\x94\x44\x49\x8c\xce\x8e\x03\xe2\x79\x95\xcf\xf9\x8b\xf9\xef\xff\xfb\xaf\xf0\xb3\x25\xca\x4f\x4a\x08\x4b\x51\x48\xc8\xc1\x15\xd6\x2f\xb2\x28\x60\x24\x6a\xbb\x6c\xc7\x08\xf1\xd4\xba\xd8\xb2\xd6\xab\x0c\xf9\xc1\x38\x95\xb8\x57\x59\x18\x72\xf9\x94\xc4\xd6\xe5\x4e\x1a\xe8\xe5\xf6\x36\xc7\xbc\x6d\x3b\x3f\xac\x99\x38\x61\x83\x27\xd6\xfd\xca\x81\x56\x51\x91\x13\xa7\xec\xab\xcf\x29\x0a\x29\xa1\x54\x39\x51\x04\x79\x04\xcc\xd2\x75\x46\x34\x28\x94\x51\x42\x55\x06\x3c\xac\x88\xe9\x3b\x25\xd4\x38\x1e\x30\x5d\x54\x0d\x5c\xe5\xc6\x49\x76\xf8\x41\x46\x84\xd3\x71\x2a\xdb\xe6\xdf\xc7\xfe\xaf\xdc\x65\xee\x30\x9e\xee\x36\x21\x30\xce\x13\x9f\xac\x69\xc2\x84\xc5\xec\x4e\xe7\xad\xb6\x57\xc3\x2b\xe7\x22\x56\x59\xe0\x4b\x0c\x4f\xb1\x19\x46\x0d\xe2\x19\x7b\x8a\xf8\xc2\x2c\xe2\x3e\xc2\x74\xcb\xb1\xe8\x80\xfd\x0f\xfb\x8f\x13\x1c\xee\x7b\x11\x1f\x4a\x44\xe4\x18\x91\xea\xaa\x6a\x1f\x2c\xaa\x3d\xf5\x43\x52\x21\xad\x57\x09\xef\xff\x07\x2e\xa4\x9b\x29\x11\xd6\x15\x66\xee\x57\x57\xeb\xf0\x9b\x84\x30\xcc\x66\xb5\xde\x39\xc2\x0e\xb6\x87\x73\x7f\xcc\xc4\x46\xf8\xe5\x5d\xf8\x68\x0b\xc9\x01\x4a\x52\x4e\xb0\xca\x74\x0f\x65\x35\x36\x3f\x24\xcb\x28\x3e\x20\xd4\x52\x46\x8f\xbf\x1f\x31\x16\x09\xbe\x0c\x58\x58\x48\x89\xbb\xb2\xaf\x98\xca\xbd\xf7\x5f\x8e\x64\x86\x89\x11\xf2\x46\xea\x76\x27\x8f\xa7\x02\x26\x2e\x02\x91\x8a\x60\x37\xcb\xaf\xa3\x6c\xba\xd0\x6a\x0c\x59\xea\x46\x63\xdc\x63\x65\x51\x3c\x9c\xa0\x96\x43\xe5\x65\x78\x27\xd2\x68\xe5\x2c\xf1\x0e\x70\x5a\x7f\x67\xca\x5a\xcc\xa4\xdd\x6d\xef\xb7\xf7\xdf\x0e\xc8\x94\xea\xb4\x1b\xc3\x0c\xad\xa9\xa7\x2b\x6c\xf5\xcb\x5c\xc8\xab\xbf\x15\x23\x62\x2e\x50\xe1\x29\x70\xb2\xfc\x1d\x50\xe1\xcb\x9c\x17\x25\x46\x6a\x22\x46\x41\xde\x24\x44\xfa\x84\x91\x69\x56\x2c\x1a\x7d\xbe\x46\x99\x0c\x42\xbf\x06\x56\x42\xb0\xf3\x61\xdb\x6b\xad\x50\x62\x34\xc3\x65\xee\x7b\xc6\x0f\xa7\x51\xcb\x46\x37\x9a\xa2\x55\xc4\xb6\xd4\xc7\xba\xfa\x35\xdb\x9e\x09\x44\x8e\xdb\x68\x55\xb6\x90\x17\x93\xd5\x03\x29\x75\xb6\x43\x35\x77\xf2\x57\xaf\xbd\x4e\x09\xd8\x0c\x8b\xc1\xbe\x5c\x36\x3c\x3b\x0f\x49\x5e\xcc\xb3\xf4\x85\x34\x7f\x10\x4b\xd2\xd4\xdb\xb3\x83\x0f\x64\x0f\xe8\x32\x37\xdd\x2d\x1c\xe0\xa2\xaa\x4f\x89\x8d\x09\xe6\x33\x9c\xc5\x0e\xdb\xe3\x3f\x7b\x2f\x56\x50\x9d\x8d\xd0\xcd\x93\x98\x6e\x3a\x37\x8e\x40\x62\xee\x6b\x3d\xc0\x97\x9a\x4f\x2d\xfa\x7c\x9d\x84\xa5\x15\x93\x98\x21\xb8\xb4\xb3\xbb\x3e\x0f\xd2\xfd\x51\x53\x9f\x01\xff\x9e\x3f\xbf\x40\xe3\x6a\xc7\x33\x9d\x72\x1a\x13\x26\x12\xde\x13\x87\x4c\xcb\x7b\xa3\x05\x12\x13\x21\xb1\xbb\xf2\x6e\xf5\xe7\xe1\xfe\xc7\xdd\x61\xf5\xc7\x6a\x7b\x1b\x4e\x16\x0b\x81\x28\x88\xf5\x8f\xa7\xa7\xcd\xfd\xfe\xf6\xaf\xc3\x76\xb7\xfb\xb1\xb9\xee\xc7\x55\x42\x43\xf9\xc0\x98\xd9\x15\x50\xee\xa8\xd5\x0f\x81\x2d\xe6\xb1\xae\x4e\x50\xfb\x2c\x1f\xf9\x54\x0f\xc5\x17\x8a\x26\xab\x2c\x66\xd4\x41\xba\x91\x10\x72\x96\xa7\xa2\x31\xf3\x89\xa5\x36\x28\xc3\x77\xef\xfe\x30\xbb\x1e\xc6\x33\x64\x20\x5b\x57\x01\x2e\x3e\xfb\x6c\x2e\xf0\x27\x34\x66\x52\x22\xd2\x4b\x17\xb2\xe9\x4e\x3b\x3b\xa2\x04\xa4\xd0\x78\x7c\xa9\xa0\xcc\x7f\x05\xc4\xc5\xa4\x3b\x95\xc6\xdc\x0a\x34\xef\xb8\xb6\xf7\xd5\x5a\x36\xed\x65\x82\xdc\xcf\x15\x51\x82\xb5\x1c\x47\xea\xf9\xff\x64\x49\x96\x81\x82\x34\x16\x10\xc7\x41\x8f\x0c\xea\xd7\x02\xf6\x35\xc0\x53\x55\xb5\x81\xd7\x6a\xec\xb9\xc5\xc2\xd2\xa0\x95\x7f\xe7\xda\x17\x70\xbd\xaf\x2f\xb0\xb0\x34\x4e\x08\xc1\x18\xf0\x80\x25\x87\x7d\xf5\xcd\x85\x47\x73\x29\xf0\xd1\x0f\xb2\x24\x93\xbd\x30\x06\xb2\xcc\xcb\x5a\x1e\xc7\x82\xb8\x34\x4e\xa4\x36\x1e\xea\x86\x6a\xc3\xff\x8f\x46\x75\xa9\x70\x4e\xe3\x34\xcd\xf0\xc5\x35\x2f\xd5\xfb\x13\x4a\x8b\xde\x54\xf5\x5d\x55\x7a\x8c\x16\x11\x93\x67\x91\x19\x85\xbb\x55\x58\xc7\x9b\xfd\xf7\xd9\x23\x90\x11\x8b\x95\x2f\x82\x85\xda\x55\x3b\xe7\x21\xa0\xb1\xa4\x06\xbd\x15\x04\x6f\xed\x5a\x79\x59\xa7\x0c\x13\x53\x07\x53\xf0\xeb\x49\xe6\xc5\x07\x46\xff\x4b\xe4\x01\xdd\x6c\x86\x5b\x31\xfa\x82\x7e\xf1\x05\xf1\xcd\xdf\xfa\x39\x99\xf4\x1e\xfb\xd5\x39\x2f\x4c\x5e\x3e\xe3\x43\x9f\xdf\x88\x15\xc8\x73\xd4\x93\x57\xf5\x12\xef\xee\xe9\x4c\x3f\x3b\x45\x2d\x3a\x21\x16\x5a\xfd\xf2\x47\xd5\xf9\xc0\xcd\xb9\xe8\x9e\xe5\x5a\x96\x06\xeb\xf8\x57\x1f\xbb\x52\x9e\x9a\x97\xca\x81\x11\x3e\x59\x11\x4a\xa6\x98\xa5\x79\xab\xda\xee\x13\xb9\x92\x45\x51\xb5\xdb\xeb\xd9\xe9\x34\x8b\xb1\xd4\xb4\xfd\xff\xf6\x87\xeb\xcd\x7a\x7b\xb7\xba\xdd\xdd\xac\xd6\xbd\x1c\x25\x8d\xb5\x48\x1d\x6a\xa4\x73\xaf\x5c\x81\x70\x7e\x0c\xe0\x2c\xf3\x81\xdf\xbe\x9a\xec\xad\xcb\x97\xa6\xc1\x20\x60\x22\x24\x3a\xa7\x6f\xd4\x24\x8e\x34\xec\x60\x42\x01\xe7\xe1\xdc\x76\xe1\xc5\x45\x27\x00\x8d\xbb\xdd\x90\x07\x27\xd4\xf5\x57\x9a\x4b\x21\xfa\x6e\x5e\x86\xcb\xcd\x33\x49\xce\x3d\x38\x3f\xcb\x46\x06\x9b\x23\x36\x7f\xac\x66\xef\xd0\xd2\x18\x1b\x9f\x57\x1a\x86\x7c\x74\xf7\x67\x1d\xc7\x83\xf4\xc1\xe1\x5c\xb6\xb9\x2f\x03\x50\x1a\xc5\x8e\x20\x07\x0b\xb1\x79\xd9\xca\xbc\x1c\xb6\x6b\x1a\xd1\x08\x4b\x0c\x07\x5c\xd5\xe1\xaf\x84\x27\x18\x6b\x5e\x6d\xf7\x7f\xdc\xf5\x7f\x84\x28\x72\x9a\x0d\x1f\x07\xed\xdb\x39\x26\x17\xde\x79\x05\xc6\xe7\xc5\x6f\xb1\x24\x3a\x1b\x8f\xd3\x34\x30\x0e\x3b\x3e\x18\xfd\xf1\xdb\x27\x5c\x43\xe7\xa9\x08\x3b\xa5\x4c\xb8\xb6\xbe\x3c\x34\x53\x4e\x0f\xcd\x64\x8a\x12\xa9\xeb\xef\xab\xb0\x85\x51\x1e\x39\x43\xe7\x7a\xaa\x37\xc7\xbc\x69\x50\xf2\xea\x38\xfb\x34\x28\x57\x11\xbe\x96\xf5\xd3\xea\xe7\x35\x8a\x55\x6c\x56\x4f\xb7\x7f\x5d\x6d\x9f\xae\x0f\x9b\xfb\xeb\xc3\xf5\xea\xaf\xfe\x98\xc6\x86\xf2\x4e\xc8\x6c\xcc\x84\xcd\x29\x15\x44\x22\x0d\x22\x8a\x68\xc8\x02\x1d\x84\x30\x24\xb9\x4c\x03\xe6\xe8\x5b\x5f\x4f\xa6\x34\x61\x11\x86\xcc\xe1\xa0\x8b\x4e\x77\x58\x9b\x34\x51\x14\xfb\x4a\xd0\x70\x5f\xe7\x8d\xae\xde\xa0\xfe\x58\x0e\xdb\x68\x4a\x85\x53\x7b\xd4\x2f\x60\xce\x7e\xd5\xc9\xa9\x96\xd7\xe0\xcb\xf7\x30\x8e\xff\xa6\xd3\x06\x22\x4a\x53\x01\x08\x45\x41\x7d\x81\xfc\xdf\x67\xb8\xd4\xdd\xa6\x34\x8b\x22\xa3\x86\xfa\x83\x33\x32\xa3\x6a\x10\xa5\x19\x61\xe8\x6d\xfd\x01\xc8\xdf\xf1\x67\xff\xf7\x54\xa0\xc9\xb9\x92\xa5\xae\xea\x9b\xaa\x3e\x9e\x0b\xd9\x0f\x2a\x4d\x87\xe4\x01\x8a\xd8\x4e\xef\x52\xa6\x14\x3f\x8d\x1f\x65\xde\x7e\x0c\xd0\x3e\x4a\xa5\x51\xd1\x10\x4e\xf9\x8e\xd0\xfe\xb9\x2b\xe6\x65\x68\xf7\xfb\x9d\x2b\xb9\xe7\xd3\xd6\xd7\xcf\x13\x97\x9f\x71\xd2\x51\xaa\x04\xc3\xd0\x04\xde\xa0\x6c\x67\x08\x62\x4a\x55\xe2\x84\xaf\x9f\xbf\xa0\x32\x0d\x53\x95\x2b\x57\xd9\xbc\x28\xa6\x2a\x97\xf3\x7f\x3f\xd1\x9e\x9a\xbd\x41\x65\xb2\xd8\xb7\x5e\x5e\xd5\xa1\x98\xd7\x9f\x4d\xd3\xcc\xda\xd1\x66\xd8\x99\xfd\x4b\xee\xca\x30\xd9\xe8\x58\x84\x25\xb8\x32\xff\x83\x12\xc7\xcb\x7b\x1e\x35\x91\xa5\x8e\x40\xbe\xec\xcc\xf2\x1a\x3d\xa0\x20\x91\xb1\xbc\x68\x0d\x93\xd2\x29\xc7\x35\x55\xe1\x59\xbb\x26\x09\x28\x6a\x12\x82\x44\xc6\xa7\xba\x7a\x93\xb3\xdc\x1e\x85\xd4\x51\x2e\xda\xe2\xdc\xbc\x2c\x43\x52\x29\xb5\xda\x85\x0c\x57\x9d\x4d\x0f\xcb\x93\x45\x82\x60\xaa\xc2\x55\xb1\x3c\x19\xe5\xb7\xfc\x0d\xbe\xf7\x58\x4b\xca\xa2\xcc\x51\x8e\x17\x79\xe9\xb4\x44\x86\xd2\x03\x65\x24\x4e\x98\xe7\xd5\x19\xa3\xa5\x86\x5c\xd7\x94\xcf\x82\x32\x22\x41\xf9\x9a\xb9\x47\x0d\xec\xbd\xb7\xfb\x24\xcb\xd7\x21\x39\x35\xfb\x59\x9c\x3a\xb6\x16\xdf\x84\xda\x93\x78\x76\xbb\x71\xe7\x29\x97\xe6\xdb\x50\x13\x60\x31\x64\x88\xf7\x5c\xe2\xe2\x49\xc3\x1c\x6b\x31\x1d\xe1\xbe\x32\xef\x1d\x8e\x1b\x68\x50\x09\x0f\x93\x05\x28\xec\x30\x7d\xa0\x8c\x82\x81\x51\xb8\x89\x78\xae\x31\x46\x91\x32\x46\x1c\x89\x35\x26\x75\xba\x87\x5a\x2e\xe4\x74\x18\xb3\x09\x26\x54\x56\x93\x6a\x17\x65\x5c\x27\x68\x39\x0e\x9e\x58\x75\x5f\x2d\x01\x22\x28\x13\x71\x6c\x7d\x62\x0b\x79\x08\x5c\xfe\x28\x1c\x45\x50\x27\x64\xe6\xa5\xab\x86\x3f\x6b\x54\x4b\x43\x03\x72\xa9\xd3\x4b\x99\x90\x12\x69\xa0\xb7\xfb\xfd\x5d\xff\x23\x90\xd8\x5f\xff\x58\xe7\x47\x39\xbd\xd8\x6e\x79\x92\x71\x81\xfd\x66\x4c\x78\x1f\x26\xa5\xc2\x86\x0f\x52\x16\x52\x97\xfd\xeb\x4a\x99\x2b\xc7\xbe\xe7\xed\xcb\x75\x2d\xdf\x91\x5e\xde\x8f\x65\x44\xa4\x8e\x28\x0a\x91\xbe\x3b\x59\xf8\xd5\x35\xc2\x03\x53\x26\x39\x87\x5e\xea\x18\xf9\xc2\xf7\xef\xd5\xb5\xfc\x68\xc6\xc4\x0d\x94\x49\x6b\x6c\xff\x4a\x1e\x54\xa0\x73\xa1\x4c\x91\x38\x72\xdc\x3a\x8d\x3e\x83\x33\x3f\xd3\x27\xa2\x08\x43\x6c\x54\x3d\x17\x0b\x0b\xe3\x94\x61\x5a\xf2\x76\xbd\x99\x3c\x1a\x25\x68\x80\x6e\xdc\xc9\x5f\x57\x73\x80\x9a\x9f\xa5\x19\xcb\xfc\x5e\x79\x82\xfa\xb1\xea\x1f\x8d\x56\xc2\x41\x87\x5a\x59\xb7\xf7\xf0\xab\x1d\x85\x25\x7e\x8a\x21\x02\xeb\x8c\x75\xd5\xb9\xe2\x87\x02\x6c\xfb\xdb\x42\xa2\x81\x19\x92\x06\x44\xed\xef\x79\xf9\x6c\xaa\xa3\x4b\xe6\x8f\x23\x45\x66\xac\x2b\x0e\xdd\xc3\xfb\x0e\xea\xd3\x5c\x75\x89\x32\xe8\x6c\x86\x4f\x2f\x83\xc9\xb5\x2c\x02\x22\xe5\x09\x4e\xc5\xc7\x72\xf1\x2b\xfc\x56\x48\xee\xda\x37\xcd\x4f\x50\x4d\x3e\x14\x02\x67\xf3\x64\x82\xb8\xae\x43\xe1\x2c\x12\xbf\x40\x06\x4c\x57\x16\x68\x86\x71\xf3\xe6\xcf\xfd\x61\xfd\x70\xf7\xb8\xba\xff\xeb\xb0\xdb\xaf\x7e\xdf\x1c\x86\xcc\x25\xb3\xdc\x3a\xf4\xcd\x0b\xe8\x57\x30\x87\x59\x57\x34\x65\x36\x75\x3a\x5c\x27\x59\x3b\x45\xad\x7d\x15\xea\x1e\xb3\x67\x60\x55\x8c\xbd\x17\x8e\x23\xfc\xee\xc7\xed\x7e\xfb\x78\xbb\xdd\x3c\x1d\xb6\xeb\x07\xea\xcf\xc7\x23\x12\xa1\x80\xd5\xae\x9e\x54\x5c\x3a\x47\x2d\xf0\xa6\xfe\xac\xea\xd9\xa1\x79\x94\x11\xea\xf8\xd7\xdf\x16\x9a\xf1\x29\x27\x22\xa5\x71\xa8\xed\x9d\x4e\x45\x3e\x14\xf6\x78\xcc\x0d\xe2\xd3\xef\x56\x7f\x1e\x02\x24\x6c\xf7\xe3\xf1\xf1\xf6\xaf\x7e\x86\xa0\x58\x10\x05\x5d\x35\x1f\x4d\x0b\xc7\x49\x2a\x92\xc7\xe0\x94\x80\x9f\xaa\xff\x40\xfb\x2a\x91\xec\xb7\x1f\xf3\x14\x91\x88\x03\xc9\xf5\xb8\x43\x6b\x9e\x17\xe5\x94\x39\x47\xfb\x1e\xda\xd7\xbc\xdb\x4f\x57\xe6\xad\xdb\x07\x5d\xde\x79\x95\xd7\x13\x8d\xc4\xcf\xa1\xe1\x94\x33\x1a\x33\x27\xfc\xd2\x77\x5d\x3d\xbc\x8e\x20\x0c\xb3\x48\xf2\xbf\x69\xb8\x04\x2e\x18\x72\x04\x74\xcb\xb4\x0b\xf9\x96\x71\x81\x94\xf3\x34\xc5\xad\x3d\x20\x68\xfe\x8d\x6c\xee\x93\x85\xc1\x79\x96\xa0\x80\x01\x98\x67\x78\xcc\x9f\x8f\xe1\xa3\xf0\x3b\x09\x17\xb1\xc2\x6e\x95\xee\xf3\x74\x94\x24\x23\x9e\x58\xca\x85\xa5\x5c\x05\x62\xff\x16\x6a\xec\x5c\xad\x67\xf9\x47\x9e\x30\x97\xe1\xc4\xe8\x37\x9e\xe7\x68\x78\x92\x3a\x04\x98\x3d\x17\x9d\x83\xb4\x1c\x42\xf3\x24\x73\xec\xc9\x8e\x55\x6e\xf7\x52\x05\x3f\x9d\x27\x8a\x9a\xa0\x97\xd1\x53\x8c\x2f\x15\x1f\x67\x07\x34\x6e\x1f\x40\xed\xba\x00\x8a\x0c\x63\x10\x63\x8c\x74\x97\x97\xbb\x22\x3f\x9d\xe4\x33\xdc\x20\x69\xd8\xee\x73\xd1\xe0\xe1\xa7\x08\x65\x09\x05\xaa\x5f\x97\xde\x5e\xbf\x98\x52\xa2\x11\xd7\xd2\x1a\xc7\x03\xe2\x10\xb8\xdb\xf2\x27\xe4\xe1\x4a\x52\x41\xf1\x4a\xd6\x50\xb7\x4e\x53\x12\xfe\xae\xd9\x66\x76\x41\xa9\x26\x98\xfe\xf6\x04\x98\xe1\xc0\x99\x50\xa9\x4f\x36\xdd\xde\xfe\xe1\xf0\x8b\x31\x0f\xa3\x32\x72\x85\xc8\x16\x9a\xf6\xbe\x7a\x5f\x17\x3d\xc0\x87\x72\x49\x1c\x87\xbf\x4b\xd1\x6e\x9e\xd6\xb1\x6b\x88\x08\xd5\xc3\xe5\xcb\x90\x86\x87\x72\xe0\x5d\xfe\x0b\xcc\xae\x95\xfa\x75\xea\x27\x73\x69\x1c\xd8\x03\xc3\xaa\x5a\xb6\xf0\xe3\xf4\x89\x2f\xca\x25\x70\x6c\xcd\x7a\x82\xe6\x7c\x74\x7e\xd6\x6a\x54\x65\xe8\xaf\xd5\x4a\xce\x7a\x4f\xe8\x09\x4e\x95\x97\xfc\x9b\x7e\x34\x13\x97\x94\x2b\xe5\xea\xf7\x25\xfc\x6a\x43\x13\x52\xdf\x85\x43\xb9\xa6\xdc\x91\x68\x74\xfb\x96\xdb\xb3\x8a\xf1\xe2\xd1\xc0\x22\xe9\x85\x1c\xa7\x64\x1c\xd3\x27\xa2\x41\x8d\x52\xdd\x53\x4a\xd5\x7f\x7d\x52\xec\xe3\xda\x26\x98\x22\x7d\xcf\x4b\xe7\x25\x7c\xa5\x56\x4b\xb9\xd1\xd4\xfa\xfe\x3b\xef\x65\xfc\x13\x9d\x5e\xca\x81\x10\xfc\x64\x77\xd0\x9e\x4f\x9e\x8a\x69\x36\x83\x52\x8c\xd4\xf7\xae\x33\xa8\x33\x0d\x0d\xa6\x17\x97\x13\x48\xdc\x46\x4e\xbe\x63\xb5\xde\xde\x4c\x36\x0d\x6b\x21\xf3\x4d\x8c\xdf\xa1\x28\xaa\xc9\xa6\x2d\x22\x41\x10\xca\xba\x83\x91\x65\xf8\x2c\xb3\xb8\xf8\x0c\x44\x64\xb3\xc8\xc3\x2f\x31\xc1\xeb\xd2\x7a\x23\x4f\x5f\x90\x28\x75\xb4\x3f\x5e\xad\xbf\x69\xde\x2f\xd4\x28\xbe\xca\xdc\x0a\xc2\x58\xa0\xa7\x72\xc4\x6d\x33\xd3\xd3\x4f\xb3\xf8\xcd\x41\x89\x24\x72\x05\x7a\xd6\x5e\x4c\x86\x0a\xa2\x28\x3e\xa1\xfd\x84\x44\x70\xf1\x69\x8a\x38\xb2\x18\x01\xe2\x1a\xfc\xd9\x7d\x75\xe7\x39\xa0\x70\x72\xe6\x58\x68\x64\x8b\x59\x15\x45\x60\x57\x6c\x9e\x02\xbd\xe1\xec\xd0\x3a\xc2\x86\x1b\x69\x6d\x5e\xe4\xb2\x85\x5b\x78\x0b\xc2\x15\xdd\x28\x21\xe3\x4c\xeb\x72\xcb\x03\x15\x94\x69\x54\xee\x3b\x37\xb0\x3b\xa3\xdf\xf7\x3e\x6c\xe7\x82\x66\x14\xc3\xc2\x55\x51\xff\xa7\x71\x7d\x9b\x61\x04\x52\x3c\x7b\xa8\xe8\x0e\xe6\xe5\x72\xc9\x2e\x9f\x99\x73\xa7\xb7\xfa\x56\xb5\xd0\x6c\x5b\x38\x2e\x85\x48\x82\x27\x89\x1c\x28\x7a\xb6\x4d\x73\x46\x04\xcf\x3f\xcc\x55\x2f\xa5\x0f\xc2\x81\x81\x60\xbe\xf1\x2a\x2f\x9f\xab\xdb\xfc\xf9\xa5\xbf\x35\x91\x02\x62\xd0\x03\x83\xc7\xa8\x1e\xb3\x88\x3b\x10\x42\x5a\xf4\x29\x9f\xf6\xeb\x65\x8f\xc2\xcf\x4b\x12\x2d\x7b\xf7\x6f\xeb\x69\x01\xa6\x98\x24\x91\x48\x49\x3d\x53\x8f\xcf\x9d\x04\x6d\xc9\x30\x23\x15\x11\x22\xbe\xf3\x32\x6f\xa7\xf5\x11\x91\x89\x18\xd9\xd0\x0f\x48\x99\x88\xaa\x6a\xd3\x4f\x2c\x93\xb1\x13\x02\x74\x0c\xfd\xab\x63\xbb\xaf\x3c\x5b\xff\x7c\xa6\x8e\x51\x35\xb8\x76\x16\xc3\xed\xaa\xe1\x3c\x52\x08\x0c\x44\x0a\xd7\x13\x3a\xb9\x49\x99\xa6\xb8\x7f\x5c\x6f\xfe\x38\xdc\x6c\x82\xeb\x2b\x94\x20\xb8\x8b\x6b\x59\x9b\x18\x17\x99\x2b\x55\xb6\x43\x94\x13\xb6\x5b\xa1\x52\x8b\x26\x6b\x27\x8b\xa3\x2c\x0f\x65\x75\x94\x65\xbe\x47\x62\x92\x3e\xcf\x24\x0c\xb3\xd6\x73\xb3\xbf\x2c\x86\xa5\xc2\x24\x99\xe8\xe3\x96\x05\x41\x79\x2a\x4c\x6a\x8d\x2f\xcd\x20\xbf\xb7\x2c\x5f\xe7\x89\x17\x61\x24\xc7\xe0\xb6\x17\x6a\xa8\x9e\x67\x47\x01\x02\x9e\x1e\xfb\x78\x3a\xb7\xe0\x49\xb0\x66\x87\x01\x9a\xa2\x02\x0e\x74\xaf\x7d\xe2\xf2\x0a\x00\x86\xe2\xbc\xbb\xcd\xe6\x7a\x77\xd8\x3f\x1c\xbe\xaf\xf6\xeb\xef\x07\xd2\x79\xf6\x61\x8e\x15\x0c\x3d\xf6\x7a\x5b\xde\x9c\xfa\x3f\x1a\x1d\x41\x88\x66\x51\x2c\xa7\x7b\x55\x17\x74\x85\x54\x58\x30\x41\x1d\xca\x41\x69\x5d\xbb\x83\x99\x97\x3a\x93\x28\x92\xd6\x09\x28\x75\xaf\x47\xcb\x39\x4b\xf9\x17\xff\x84\x23\x50\x15\xae\x09\xd5\xc3\xe6\xd9\x9a\x84\xf0\x0c\xbd\xc0\xdd\x5f\x6b\x9f\xda\xc0\x56\xe9\x3e\x11\x1b\xa6\x69\xa7\x04\x9e\x37\x3f\x01\x5e\x37\xe5\xcc\xfa\x25\x04\x18\x26\x7d\x91\x59\x66\xa8\xa5\xf9\xf6\x6d\x9a\xc4\xb1\x13\xc9\xb8\x7f\xdc\xed\x17\x70\x57\x49\x1c\x2b\x4f\x79\x3d\x6e\x63\xa4\x49\xcc\x13\xe4\x6b\x70\x70\x43\x6c\x54\x1b\xa1\x4b\x97\x5c\x9c\x24\x36\x36\xcb\x02\x9b\x53\x2b\xeb\x8f\x9b\xce\xff\xbc\xcc\xe1\x25\xd4\x52\xc5\x7a\x25\x4f\xf3\x0f\x64\xcd\xa7\x29\xcf\xe9\x69\x3b\xb7\xbe\xb3\xcd\xd7\x4f\x3f\xbe\xe1\xb2\x79\x7c\x7a\xb8\xfe\xb1\xde\x1c\xc8\xef\xdb\xdb\x80\x3f\x4d\x78\x4a\x31\x89\x1c\x80\xd4\x68\x52\xc6\xfb\x7a\x22\xd2\x0c\xdf\x18\x3c\x4f\x82\xc4\x24\x11\xcc\x04\x89\x9b\x3a\x37\xcf\x70\xd7\x8b\x8a\xd3\x24\x49\x08\x49\x42\x4a\xa1\x7e\x85\x36\xb4\xeb\x86\x71\x6d\xf1\xf5\x95\x3e\x49\xb6\x1e\x18\x87\x87\x39\x86\x60\x72\x6a\xfd\x52\x55\x0d\xfc\xfc\xfe\xcd\x81\x3b\x83\xe3\x33\xbd\xdb\x94\xc7\x4a\x8c\x09\x35\xeb\x4b\x5d\x07\x9a\xa4\xd2\x31\xe0\x3f\x43\xbb\x6a\x7d\x6e\x6f\x7e\xa4\x8c\x52\xed\xc1\x0e\xdd\xe2\xbc\xf1\x14\xe6\x13\x2b\x96\xc8\xd4\x91\x3d\x1f\x7d\x74\x10\xae\x59\x11\x89\xcd\xd9\xbf\x6f\xf7\xfb\xbf\x0e\x57\x3f\x9e\xee\xc7\x5a\xa8\x34\xd1\x3c\xc5\x82\xc3\x5f\xd5\xb9\x6e\xe1\x75\xf2\x40\x75\x46\x44\xec\x52\xf5\x87\x63\x5e\x82\x39\x34\x63\xcc\x6c\xa2\xad\x0c\x10\xbf\x00\xe5\xd9\xae\x1f\x96\xb0\xff\x34\x31\x91\x93\x0f\x3f\xbe\xa2\x51\xec\xe1\xdc\x34\x31\xca\x62\x59\xee\x90\x37\x1e\x95\xb1\x52\x73\xa7\x30\xb1\x5c\xf9\xaf\xeb\xf6\xc7\xbd\x63\x4e\x0c\x23\xc2\xb5\xea\x9e\x1b\xa8\xef\xe4\x2b\x2c\xa7\xc1\xbf\x0c\xad\x12\x2b\x05\xc2\xd5\xe5\xe9\xb4\x0a\x0c\x02\x23\xf6\x00\x9a\x46\x52\x39\x9a\x16\x0c\x57\x26\x1e\x50\x4a\x32\x8e\xde\xd5\xdd\xea\xcf\xc3\xcf\xef\xdb\xfd\xe6\x76\xbb\xdb\x6f\xae\x0f\xeb\x11\xa0\x28\x25\x32\x4a\x54\xa8\x6c\x35\x6d\x75\xbc\xce\x9b\xce\xf6\xde\xc0\x27\x95\xdd\x94\x00\xc1\x0c\xf2\x5b\x90\xfc\xef\x1e\x8c\xbb\x6a\x27\xcd\x8d\x24\x07\x2e\x7b\x3a\x12\xbb\x9b\x1d\x85\x8a\x88\xfa\xf3\x22\x5b\xcc\x77\x59\xd8\xdb\xdc\x8e\xa8\x34\x68\xca\x44\x94\xb0\xd0\x28\x05\x6f\x79\x75\x6e\xae\x65\xfd\x5a\x56\x06\x96\xb9\xa8\xba\x9f\x58\x84\x52\x37\x2f\x55\xdd\x0e\x3d\x1a\x34\x65\x86\x63\x92\xf4\xea\x5c\x96\xe3\x2a\x4b\xca\x33\x81\x39\x98\x5e\x99\x64\xf1\x4d\x74\x41\x29\xf3\xd9\xae\x1f\x79\xd9\xce\x64\xd4\x3f\x71\xc7\x27\x06\x3d\x15\x3c\x76\x7d\x2a\xc6\x84\xfa\x69\x2f\xfb\xf2\xdb\xec\x6c\x16\x22\x33\x4e\x67\xef\x03\x43\xe0\x74\xf9\xa5\x89\x48\x12\xbf\xef\x3e\x9e\xd5\x48\xfd\x60\xf6\x5c\x12\x43\xb1\xb9\xd0\x39\x40\x93\x5d\x33\x4d\x45\x16\x80\x6f\x0e\x5c\xbe\x87\x79\x0d\x3e\xcd\x98\xd4\x74\x40\xee\x38\x4b\xd5\xad\xea\xda\x65\xd5\x3e\x07\x43\xf8\x03\x48\xeb\x0a\x38\x63\x26\xa2\x4b\x53\x9c\xaa\x58\x82\x09\xc4\xa5\x0b\x61\xeb\xe5\x9d\xa9\x44\x65\x59\x48\x65\x55\x36\x6f\x9f\xb0\x1e\x3c\x9b\x94\x59\x04\xed\x9d\x64\xb7\xa5\xfc\xa8\x8b\xc5\x54\x65\xaa\x29\x4f\x5d\x35\x1c\x79\xc6\x9c\x13\x7e\x35\xca\x04\xa4\x9a\x3a\x76\x80\x20\x5b\xbb\x9d\xd7\x66\x52\x9d\x45\x48\x01\x86\xa9\x9f\xc6\x13\x8c\xad\xab\xa3\x2f\xe2\x6e\xcb\x47\xa8\x75\x7f\xb8\x8c\x47\xbd\x18\x62\x5e\xbe\xc9\x22\x77\x69\x35\x4f\x76\x1b\xa6\x99\xd8\xb8\x12\xe1\xa3\x3c\xf7\x3b\x7b\x6a\x88\x32\x3d\xf9\xed\xd5\x59\xa9\x02\x76\x55\x7d\x81\x09\x4e\x0d\xe5\x18\xda\xaa\xf3\xc7\x9f\xa5\x3c\xce\xf0\x02\x29\xf8\x8e\xe0\x2e\xf8\x77\xa9\xb0\xa8\x1f\xe1\x0e\xf9\x53\x61\xf5\xfd\x93\xb4\x5b\x6a\x09\x60\x23\xf6\x63\xf5\xfe\x5f\x55\x39\xd9\x13\xb3\x28\x8b\x31\x38\x18\x2a\x44\x0f\xe5\x27\x08\xb5\x2c\xca\x0c\x2e\xe6\x4d\xfb\xb2\x96\x65\x29\x55\x3e\x33\xd6\x59\x24\x99\xc3\x67\x23\xf9\x8d\xff\x88\xbe\xe6\x63\x99\x04\xb1\xe1\x91\x64\x24\x4b\xd1\x53\x6c\xf3\x23\xdc\x82\xed\x9c\xf7\xaa\xec\xde\xc2\x48\xdc\x99\x66\x71\xec\xda\xe0\x76\xeb\xfd\x9f\xfd\xdf\x68\xcc\xd3\x19\xf6\xd8\xf5\x9a\x06\x52\xf9\x85\xe0\x2b\x8b\xb9\xee\xfd\xc6\xaa\x3a\x86\x26\x8e\xe9\xfd\xc7\x49\x82\x19\xdb\x7b\x78\x91\xc5\xc8\x46\x65\x71\xaa\xad\xcf\x7f\x2e\x01\x48\x32\x9a\x44\x58\xb6\xf5\xfa\x59\xbd\x24\x14\xcd\x98\xd6\x99\x70\xc6\xba\x5b\x7d\x58\xd1\x5f\x8c\x97\x33\x4e\xb2\xe0\x7b\x39\xf4\x51\x5e\x3e\xff\xcc\x4b\x53\xbd\xdf\x60\x4d\xfb\x35\xe8\xe5\x86\xf9\x46\x47\x62\xd4\x2e\xda\x39\xcb\x7d\x1d\x3a\x4c\x4a\xa8\x13\x42\xc4\x38\xed\x80\x04\xe2\x1e\xc9\xb9\x68\x25\xb2\x44\xf8\x26\xd5\x6e\x99\x4f\x69\x4f\x68\x96\x24\x19\xa2\x02\xa5\x31\xee\xf3\xb8\x34\x9c\x59\x6a\xe4\x08\x82\x3c\x74\x60\xdd\x54\xf5\xef\xf0\xe1\xf6\xa7\x70\xbc\xd4\x2a\xe3\x02\x7b\x80\x9f\xb2\xfd\xa4\xf5\x89\x66\x52\xe9\xc0\x18\x79\xeb\xc8\x9b\xcd\x05\xd0\x7c\x52\x9c\xc9\x54\x46\xb4\x27\x34\xb9\x72\x16\xf7\x52\x2b\x9d\x66\x0a\xa2\x50\xc2\xb9\xad\x64\x79\x93\x17\x45\x4f\x46\x39\x7d\x37\x86\xc5\xc2\xd9\x25\x5d\xd5\x66\x5f\x7d\xd6\xe4\x36\xbb\x70\x93\x38\xf2\x78\x64\x57\xad\x77\x1f\xc7\xa1\x46\x96\x01\x71\xea\x73\x2e\x1b\xe0\x50\x11\xbb\x53\x5e\x0e\x35\xa4\xe5\x64\x43\x06\x99\x53\x36\x96\x05\xd4\x4e\x95\xbf\xba\x58\xc8\x96\xcb\xc0\xea\x3f\x5b\x35\x36\x31\x01\x29\xea\xe9\xcf\x27\x95\xfc\xcc\x4a\xa7\xe7\x93\xf7\x32\xec\x63\xaf\x54\x46\xa9\x93\xdf\x7f\xac\xab\xe6\x04\xf5\xe3\x08\xaa\xf1\x0f\x1a\xb5\xfc\xc7\x28\x29\xe5\xf8\xe2\xd7\x35\x98\xbc\x5d\xcb\x7a\x6c\xb1\x24\x96\x71\x3d\xdc\xcc\x27\x78\xe7\x52\xa7\x54\x32\x66\xd1\x32\x60\x89\x12\x71\x34\xd3\x97\x2b\x99\x48\x75\x48\xde\x3f\xcb\x36\x70\x05\xce\x51\xa2\x92\x25\x14\xfd\x0a\x5b\x54\xb2\x9d\xac\x4f\xc9\x12\x89\x2d\x92\x9b\xf6\x65\x0f\xf5\xf1\x3a\x88\xe3\xf9\x61\x41\x24\xd6\x52\x11\xbc\xdf\x6d\x36\xf3\x32\x83\x14\xa9\x45\x9f\xe7\x1e\x9e\xff\x21\xb6\x54\x0a\x10\x98\x9f\xbf\xae\x4a\x74\xec\x76\x50\xb6\x57\xe7\x2e\x1a\xbb\xae\xce\xea\x33\xf5\x04\x2a\x93\x84\xd3\x68\x10\x83\x70\xc8\xde\x30\x96\x2a\x4c\x80\xdc\x7d\x4c\x5b\x92\x64\x62\x13\x96\x0d\xba\x7d\xb9\x74\x3d\xa9\x41\x41\x60\x7a\x86\x34\x71\x5c\xdf\x4e\x8a\xf0\xc1\x5e\xc9\xe7\xfd\xc7\xa9\x2f\x2d\xcb\x34\x15\x48\xdb\x61\xb1\x0d\xf5\xaa\xce\xf5\x45\x86\xf0\x13\xdd\xac\xd1\x39\x52\x27\xa7\xaf\xce\x1f\x23\x58\xbe\x4c\x4d\x86\x21\x82\x0c\xad\xd0\x03\xe3\x4c\x98\x92\xc5\x36\xe0\x53\x56\x6f\xb2\x95\xf5\x65\xee\x40\xca\x34\xc1\x16\x4a\x54\x1a\xfb\x86\x6d\xd2\x43\xd1\x5b\x2a\x9e\x61\x49\x6e\xf3\xb8\x1b\x99\x7e\xa9\x52\x1e\x79\x3f\x79\x8a\x06\x09\x9f\x8c\x54\x52\x61\xd1\xeb\x3d\xf0\x00\x1f\xa4\x31\x1f\x73\xce\x45\x2a\xb5\x8a\x30\x96\x58\xbf\x80\xdd\xae\x43\x58\x2b\xb5\x49\x94\xd3\xf3\xca\x8b\x5e\x63\x8a\x4a\x88\x45\xe6\x1b\x47\x10\x1f\x3d\xf9\x44\xc0\x6a\x19\x8d\x52\x96\xfb\x17\x68\x2f\x29\x05\xa8\xb4\x09\x77\xfc\xec\xce\x08\x5e\x83\x34\xb7\x3d\xc9\x15\x55\x11\x35\xc8\xd8\x74\x21\x4a\x39\x7d\x2d\x2a\x82\xd4\xf8\x6a\xe5\xd7\xce\xa0\x22\x84\x59\xcf\xf8\x75\xf7\x31\xae\x78\x2a\x12\x03\xde\xcf\xd5\xb4\xa2\xaf\x48\x46\x53\xff\x0b\x04\x86\x2c\x11\x85\x84\xa9\x9a\xc7\x7e\xb9\xee\xf2\xde\xf5\xc7\xb5\xe5\x73\x25\x2a\xe6\x8c\x0f\x0a\xc8\x8f\x55\xdd\xda\xaa\x98\x7b\xa3\x8a\x92\x14\x91\xf8\xab\xed\xc3\x2e\x5c\x07\x4d\x84\x23\x50\xef\x76\xca\x5d\x2b\xdb\xf3\x45\x88\xb3\xd8\x26\xa3\xa8\x94\x6c\xbc\x0f\xaf\xfc\xf7\x31\x7d\x15\x8a\x47\x06\xad\x05\xbc\xfd\x9e\xeb\xd7\xca\xda\xaf\xf7\x0e\xc5\x49\x2c\xfc\x73\xf9\x03\x30\xc3\xb2\xd0\xf1\xa6\x84\x4e\x02\xb5\x5f\x90\x8a\x29\xe4\xf3\x28\x86\x53\x42\x3b\x09\x2e\x1f\x38\x3c\x42\xed\xfc\xe9\xe9\x71\x12\x93\x69\x8f\x50\x19\xbf\x9c\xc4\x1a\xf4\xb5\x3a\x97\x09\x19\x4c\x42\x02\xd9\x5b\x72\x95\x92\x18\x4b\xe0\x75\xfc\x47\x68\x79\x0c\xbf\x4d\x33\x2d\xfc\x1e\x34\xc2\x0d\xae\xda\x69\x9f\xd8\xf4\x32\x52\x09\x2e\x51\x93\x1f\x8f\xb0\xef\x6e\xfb\xb3\x40\x53\x65\x49\x8a\xc4\x87\x27\xf4\xe4\x5c\x2b\xf1\xf4\x89\xcb\x58\x63\x5a\x75\xe8\x34\x80\x41\xff\x76\x39\xca\x54\x4a\x48\xe1\xdd\xc4\x23\x1c\x6b\xf8\x77\x73\x49\xf4\x4c\x95\x26\x02\x79\xc0\x65\xdd\x0e\xbe\x96\xd2\xa9\x40\xb0\x07\x22\x5c\x77\xed\xf9\x94\x9b\x9b\xe2\x6c\xed\xc7\x63\xee\xa1\x58\x21\xa5\xa7\xb4\x75\xb4\x3e\x4a\x99\xc9\xf3\x36\xb1\xc0\xfc\xab\x23\xea\x77\x86\x6c\xe7\x2c\xfa\xec\xe6\x8c\x00\xc4\xd9\xf6\x12\xe8\x55\xfd\x17\x74\x71\x7c\x7f\x28\x29\x03\x31\xbb\x73\x76\x43\x96\x7e\x12\x7b\x2a\x63\x2c\x3a\x88\x2f\x55\xdd\xf4\xb6\x5c\x19\xab\x90\x76\xc3\x37\x1b\x8f\x1c\x08\x65\x05\xc5\xa2\xf8\xc9\xb3\x93\x40\xbe\xf1\x92\x2d\xd3\x67\x64\x13\x32\x16\x5f\x7e\xb0\xfb\x17\x08\x65\x88\xa0\xa4\xdf\x1f\x33\x61\xe0\xed\xcb\xef\x7f\xad\x17\x3f\x8c\x59\xcd\x43\x59\x9b\x88\x89\x9f\x79\x97\xeb\xba\x1a\xe9\x4e\x51\x1d\x65\x90\x0c\x5a\x77\xf7\x81\x00\x4c\xb0\x49\x1b\x1a\x19\xd3\x3f\x53\x1d\x19\x9a\x06\xff\xa8\xa8\xda\xed\x27\xfb\xad\x26\x4c\x79\xe0\xf4\x5b\xf5\x0a\xc8\x2e\x16\x46\x78\x86\x06\x0d\x79\x8e\xbb\x78\xb8\xdb\x36\x9a\xbe\xe2\xa0\x89\x8d\x30\xc2\xee\x22\x9f\x2b\xb0\x55\x0d\xbe\xe0\x1b\x26\xc4\x34\x45\x1c\xec\xe3\xc3\xdd\xfa\x61\x7b\xdf\xff\x39\xa1\x08\xfe\xbc\x86\x37\xd7\xa0\x7e\xf0\x6c\xdc\xa6\x9f\x91\x71\xbc\xa6\xc7\x1f\x57\xb7\xdb\x35\xa2\x91\x7f\xec\xae\x0f\x8f\x9b\xa7\xc3\xdd\x6e\x73\x1f\xda\x04\x35\xa5\xd2\x35\x2d\x9d\xd5\x31\x0f\x9a\x1b\x8b\x56\x48\x53\xee\xa4\x72\x74\x75\x3c\x15\xd0\x42\xaf\x22\xdd\x1f\x4b\x70\x7c\xcd\x9b\xe3\xa9\xaa\x61\xc2\x20\x44\x35\x4d\xa8\x93\x77\xae\x8a\x37\xd8\xcb\xe6\xf5\x93\xb3\x70\x91\x21\x96\x0d\x1b\x90\x7f\xf6\x7b\xaf\xe6\x26\x45\x60\x43\x51\xb9\x2c\xd7\x83\xfd\x6d\xd2\x3a\xe8\xa7\x09\x9a\x61\x0d\x07\x23\xfe\x27\x68\x5c\x98\x00\xc6\xdf\x59\x98\xe5\xfb\x06\xfb\xce\x23\x54\xe0\xfa\x7a\xe7\xd3\xc2\x70\x34\x80\xbb\x2e\x20\x6b\xae\xa0\xfd\x6d\x09\x58\xa3\x05\x90\x28\x10\x5d\x86\x1a\xa6\x4b\x39\x0c\xc0\x00\x2d\xc0\x22\xcd\x93\x7b\xec\x8b\x6a\x5b\x8b\xc9\x72\xff\xf3\x94\xc4\x88\xc1\x79\xac\xaa\x22\x90\x7e\x86\x43\xa7\xa9\xa3\xbc\xef\xbc\xf6\x61\x3d\xa4\x9a\x46\xd0\x4b\xdc\xdd\x55\x06\x50\x71\x0a\xd9\xc6\xfc\x94\x4c\x12\x7c\xc2\xb2\xc0\x67\x0c\x64\xcc\x37\x1f\x26\x49\x26\x10\x9c\x7f\xa8\xde\xcb\xe6\x8b\x66\x57\x2d\xb9\x73\x65\x30\x84\x6d\x65\x5e\xb8\xca\xf7\x4c\x73\x88\x6a\x99\x38\x34\x7f\x5f\x66\xb8\xd0\x9a\xa7\x5a\xa6\x02\x45\x32\xcb\xf3\x2b\xac\x4e\xa7\xfe\x56\x65\x66\xd0\xdb\xaa\xca\x7b\x78\x0f\x28\xe8\xcf\xb8\x6e\xc2\x6f\x0c\x10\xa7\x94\xb5\x1b\x15\xd0\xc2\xa0\x8d\x4c\x0f\xa1\xad\x3e\x16\x2a\x2c\x5a\x45\xd2\xfa\x12\xc1\x55\xb7\xfe\x56\x75\x2d\x3f\x7c\x1e\x78\x12\x28\x6a\x15\xab\xd0\x4d\xef\x75\x6b\xbd\x2c\x60\xbf\x4d\xe8\xce\xfb\xc8\x1c\x3f\xe7\x7f\x4d\x1e\xb3\x52\x1a\x13\xf5\xb9\xae\x70\xaf\x0d\xdd\x7d\x5a\x13\x82\xa9\xda\x17\x97\xdd\xbd\x54\x71\xa2\xda\x10\xe1\x80\x6e\x2e\x46\x09\xb0\x39\x6d\x62\x8d\xe6\xdd\x55\xc9\x6e\xaa\x1a\xb4\x6c\xda\x0b\x75\xad\xc9\xbf\x24\xdc\x8c\xe1\x20\x89\x6f\x8b\xb9\x3a\x37\x8e\xf0\x6a\xc6\x60\x39\x7b\xd2\x26\x13\x58\x3f\xfe\xf3\x6a\x0f\x13\xe2\x07\x6d\xa4\x44\x8d\xb0\x63\x65\xa0\xd8\xf6\x6b\xd4\x68\x86\x6e\xd7\xd9\x71\xd0\x5c\xca\x1c\x84\x3d\x53\x03\x49\x32\x08\xc1\x34\x5e\xc3\xdd\x88\xe5\x28\x4c\x4a\x58\x1c\x07\xff\x73\xf3\xfc\xdc\x2f\x1b\xcb\x1d\x11\xfb\xe3\xb9\x94\x65\x3e\x61\xf8\xd0\x56\x19\x11\x74\x41\xab\xe3\x49\x96\x1f\x23\x46\x14\x6d\x0d\x63\xda\xc7\xfe\x6f\x50\x1f\xce\xa5\x6f\x61\x39\x28\x68\x87\xe3\x5b\xb0\x1e\xcf\xe1\x5b\xf5\xa7\xe4\x92\x6e\x9a\x89\x48\xea\x1c\xf7\x10\x2b\xdc\xa1\x1c\xef\xf4\x6d\x9a\x08\x00\x21\x44\xe7\x06\x6a\x5c\x0a\xb3\xd7\x6d\x08\x71\x74\xd5\x2a\x2f\x77\x5a\x5e\x2c\xff\x30\x8b\x65\x81\x09\x7b\x5d\x39\x1a\xa9\xf9\x71\x14\x24\x03\x57\x76\x17\xca\x3f\x8e\x2a\x97\x26\x66\x92\x7b\x34\xb4\x5b\x40\xf3\xdf\xd3\x18\x02\xf3\xe2\x20\x73\x15\xc6\x24\x0b\xe8\x2b\xb4\xeb\xdd\x1e\x39\x4f\x54\x18\x16\x27\x18\xee\xe6\xba\xda\x55\xc5\x44\x92\x8a\x1a\x96\x70\x8c\xc8\xbe\x9f\xcf\xe7\xf3\x51\x96\xbb\xff\x95\xfc\x7b\xf7\x7b\x9b\xfa\x64\xc5\xff\x38\x11\x10\xd3\x1f\x5a\x25\xee\xd1\xb4\x08\xc5\xf8\x29\xf3\x36\x2f\x9f\x9f\x60\x2c\xe2\xe6\xa7\xf2\xc4\xb5\xb3\xee\x4e\x52\xc3\xba\x96\xb6\x5d\xf7\x5c\x72\xd4\x08\x96\x61\xca\xb4\x97\xdf\xbb\x46\xb0\xe0\x27\xf9\x35\x23\xa4\x41\xb1\x2e\x89\x09\xcb\xaa\xfe\x78\x28\x5d\xbf\x93\xaa\x64\xed\x03\xcb\xb0\xe2\x8d\xd0\xd2\xf7\x86\x75\xf6\x1b\xef\x3a\x10\xfa\xcc\xae\x51\x80\x6b\x0f\xbf\xdd\xde\x6c\x6e\x1e\x9e\xee\xfa\xab\xb3\x12\x4b\x8d\x4f\xf0\x7c\x2e\x64\x3d\x4b\xe8\x99\x24\x16\x46\x04\x6e\x85\xfe\x8f\x89\x4e\xbc\x9e\x5d\x7b\xf1\x03\x65\x75\x20\xfc\x9e\xc0\xef\x2f\xd0\xab\xe1\x07\xda\xd9\xb4\x10\x1c\x2d\x9b\x0d\x93\x32\xc3\x86\xd2\x6e\x0f\xa9\xc4\x6d\x61\xf2\x4a\x53\xe5\xd4\xea\xf2\x66\x0f\xf2\xe8\xc5\xe6\x5c\xee\x62\xd8\xf8\x4c\x06\x51\xe2\xa2\xa2\x52\xef\x86\x56\x29\xa3\x22\x8e\x8c\x8d\x21\x6c\xee\x5c\xa9\xce\x47\xe8\xc7\x63\x86\x8c\x07\x8e\x69\xfc\x7c\xfc\x89\xe5\x8f\x30\xc8\x29\x66\x18\xd0\xcb\xd8\x41\xbb\x96\xe5\x5d\x8e\xa4\x97\xc3\x26\x6d\x54\xe2\x44\x20\xae\xb6\xf7\xbf\x6f\xfe\xea\x7f\xaa\x62\x04\x0a\xdc\xad\xfe\x3c\x6c\xf6\xdf\x11\x4e\x1c\xc6\x34\x95\x2a\x1e\x4b\xe9\xcf\xd2\x06\x46\x27\x8e\xd1\x20\x3c\x42\x4c\xf9\xe5\x55\x39\xf0\xb3\x51\xa3\xbb\xe0\xc3\x6b\x59\xe3\x86\x7a\x05\x28\xe3\x36\xef\xb3\x33\x26\x75\xfc\xbe\xee\x41\xff\x1c\xac\xd0\xe9\x34\x6a\x5d\x1a\xb1\x92\x8c\xee\xcd\x68\xa2\xa2\xa0\xe3\xba\xff\x3e\x3b\x32\x50\x86\xdb\x68\x7e\x3c\x15\x07\xd7\xa9\xfc\x84\x9a\x99\x9f\xbc\x72\x10\x76\xc4\x93\xf2\x1d\xea\x6a\xec\x5a\x91\xc0\x15\x11\x66\xa7\x31\x46\xb1\x35\xbc\x81\x33\x25\x33\x30\xe5\x92\x06\xe0\x3c\xc5\x6e\x40\x45\xa8\x1f\x77\x0b\xc7\xaa\xdc\x41\x61\x11\x39\xdd\x0f\xa6\x98\x90\xdd\xed\x57\x4f\xfb\xc3\xee\xf7\x07\x72\xf8\x71\xbf\xdd\xef\xfa\x71\x93\x62\x41\xfe\xee\xe3\x5b\x51\x29\xf8\x82\x90\x3b\xfc\xc0\x6a\x12\x0d\x11\x7c\x55\x5f\x7d\x2c\x56\xc0\x0d\x58\x83\x88\x98\xd5\xd9\xb4\xff\x4b\x1b\x07\x51\x2a\x8d\xcf\xc9\x0f\x44\x66\xe1\x86\x21\xca\x84\x57\xed\x0f\xdc\x7c\x8f\xb2\x69\xe6\x93\xb4\x70\x89\xbd\x2e\x7c\xdc\x57\x57\xe7\x7a\xe6\xff\x40\x64\x2c\x3a\x80\xb7\xf0\x06\xb5\x0c\x9c\x6c\x14\x88\x72\x1d\xd3\xab\xc9\x8e\x09\x04\x54\xea\x9b\x35\x77\xb9\xed\x8d\xc8\xe2\xcd\x43\x1c\x31\x8c\xe3\xbd\xfc\xdc\x58\x6c\xef\x5f\xf3\x99\x36\x4b\x02\xe5\x53\x55\xa8\x8f\x6f\xed\xc7\x09\x7e\x1b\xb2\x11\x10\x27\x8e\xb1\xe4\xbd\xaa\xcc\x7b\x55\xbf\x36\xeb\xbc\xcd\xe7\xa8\x09\x88\x81\x63\xf3\xee\x37\xd7\x39\x53\xce\x63\x6b\xa0\x34\x46\xbb\x7b\x2b\x9b\xf6\x80\xa9\xb3\x83\x03\x7f\x1c\x64\x69\xdc\x1f\x5e\x64\xf3\x72\x38\x0f\xb1\x17\x50\xe0\xd8\x0f\xf1\x13\x5e\x83\x67\x09\x8c\x68\xe4\xf3\xfa\xbd\x6a\x8b\xbc\xdf\x7b\x80\x69\x27\xf3\x7d\xaa\xab\x6e\x13\x08\x5d\x51\x01\x35\xb4\xb8\x97\x83\x20\x31\xf2\xb2\xa1\xb0\xd4\xec\x7a\x85\x76\x4e\x1e\x7a\x46\xd3\xf4\x46\xb0\x22\xdd\x1c\x5c\xfa\xbb\xb6\x3a\x8d\xfd\x32\x48\x62\x8d\x6f\xbf\x75\xe4\x4f\xed\xf7\xea\x08\x58\x7f\x0e\xe3\xcc\xb2\xa0\x15\xfe\x58\xc3\x49\xe6\x66\xd3\xbe\xec\xdf\x61\x94\x0b\xfc\x1c\x44\x05\x89\x90\xe8\xae\x3b\x14\x91\xa7\x43\x02\xe3\x1a\xf9\x66\x0b\x31\x91\x0e\x91\xa2\xbb\xc8\xc9\x65\x03\x27\x60\x0b\xc8\x08\x4d\x83\xf8\xc8\xfa\x61\x89\x39\x93\x42\x16\xa7\x42\xf4\xad\xd9\x79\xf9\x3c\x62\x01\xf4\x53\x64\x44\x89\x4f\x89\x3d\xe5\xed\x59\x16\x17\xe5\x05\x90\xa9\x49\x3c\xfb\x8e\xcf\x35\xfb\xb4\xc9\xf4\xc9\x2b\x9a\x60\x85\xa0\x8b\xbb\xd6\x2f\xb2\x7e\x86\xff\x73\xbf\x5f\x2c\x6d\x83\xe2\x32\xf4\x6e\x5e\xcb\x56\x1e\xe2\x00\xc2\x05\x4d\x09\x1e\x64\xbf\x20\xba\xd8\x8d\x5a\x9a\x0e\x84\x89\x57\x34\x9e\x3d\x35\x13\xa7\xc2\x51\xdc\x8e\x2d\xc7\x02\x6a\xd4\xcf\x07\x91\xa0\x46\x41\x1f\x07\xdf\x78\x99\xf9\x8b\xbc\xcb\x28\x2f\x62\x23\x92\x20\x0b\x5e\x2b\x5f\xa1\x1e\xba\xc0\x6d\x9c\xd1\x24\xee\xf5\x91\x7f\xe6\x48\x03\x3d\x71\xe3\x6c\x9c\x31\xe9\x21\x12\xfd\xce\xde\x2d\xc3\x30\x4e\x8d\x53\x74\x44\x27\xd4\xbf\xad\xe9\xeb\xb0\x8c\x70\x4c\x73\xc2\x2f\xd0\xe7\x16\xae\x41\xcb\x8f\xa0\xe9\x36\x47\xb4\x7d\x95\x9f\xb6\x4c\xc8\x50\xf2\x7b\xac\x8a\x5c\x7f\x4c\x08\x17\xc2\xa4\xd4\x22\x70\xae\x1e\x24\xae\xa9\x65\x5a\x21\x9a\xe8\xdb\x10\xd9\x7d\x9c\xa0\xd7\xb0\x9a\x1e\x81\xa7\x16\x3d\x57\xb7\xb9\x85\x2e\x85\xbf\xe1\xe9\x99\x1e\x42\x68\x81\x6d\x32\x27\x6f\x17\x02\x93\xd8\x7c\x56\xc2\x3a\x5b\xf2\xfd\xdb\xf8\xa3\xb6\x49\x94\x21\xa6\xcd\x9d\xff\x9f\x76\x6f\x4c\x4d\x8e\x4d\x22\x2b\xba\x87\x6e\x4a\xc9\x67\xa7\x4d\xa8\xa4\x03\xd7\x74\xdf\x91\xff\x95\x3d\x98\x7c\x0d\x36\x11\xa1\x93\xd2\xb1\x26\xde\x9e\xf5\xeb\x87\x83\x2c\xcd\xcc\xb5\x4d\xb5\x40\x58\x77\x8b\x9a\x49\x0d\x89\xa2\xd7\xd3\x28\xce\xb0\x59\x22\x62\x6c\xf6\x0b\x5d\x58\x23\x3f\xdf\x66\xa9\xab\xee\xf5\xd4\x15\xab\xa2\x78\x02\x1f\xc0\xdd\xf7\xd9\x52\x9b\xa5\x92\x7b\x8c\xb9\xc9\xcb\xe7\x11\x7b\x9c\xcd\x32\x10\xae\x99\xd1\x9e\x4b\x13\x48\xab\xbf\xec\xb6\x1f\x2e\x5e\xa5\x22\x28\x63\x7f\x93\xc7\xa9\x39\xb3\x1a\x52\x6c\xfe\xf3\xc4\x43\xe5\x33\x14\x6b\x59\x9b\x1d\xd4\x61\xd3\x4a\x27\x87\xf5\x99\xcb\x74\xec\x21\x85\x60\xc1\x1a\x9a\x20\xcd\xed\xfa\x45\x96\x25\x14\xf7\xf0\xfe\xb7\xaf\xfd\xeb\x05\x68\x84\x42\x57\xd6\x65\x38\xb1\x77\xc6\x25\x20\xd6\x8e\xac\x74\x69\xdd\x03\x75\x6a\xef\xbd\xb7\xe1\x9b\x19\xa7\x36\xcd\x82\x31\x11\x09\x35\x35\x44\xbb\x5d\x8f\x62\x9a\xd0\x76\xc6\xa2\x88\x69\x0c\x21\x27\xc8\xfc\x2f\x33\x76\x2c\x22\x1e\x42\xd4\xf4\x3c\x32\x98\xbd\xfe\x64\x72\xa2\x1d\x02\x01\x9a\xf6\x70\x55\x95\xe6\xb1\xea\x76\x27\x2c\xb8\xde\xc9\xff\xa9\x10\x4d\x1e\xe6\x66\x4e\x69\x09\x65\x25\xf1\x8d\x75\x3b\xc3\xa3\xac\x51\x70\x20\x4c\x92\x02\xdb\xee\x1b\x69\x61\x07\x33\x5e\x7a\x16\x11\x9d\x21\xa3\xc0\xf6\x7e\xff\xb4\x79\xdc\x5e\x3b\xd2\xea\xc3\xfe\xfb\xd3\x66\xf7\xfd\xe1\xf6\xba\x3f\x8c\xb5\xdc\x99\xc4\xa2\xf0\x59\xcc\x05\x9e\x85\xd9\xcd\xc4\x51\x8a\x10\x97\x3a\x7f\x7e\x69\x49\xfc\xdb\x6c\x94\x72\x3d\xd0\x20\xec\x6b\x69\x2e\xec\x82\x9f\x49\x23\x48\x7c\xe0\xbe\x75\xe0\xab\x27\x78\x83\xf2\x0c\xeb\xf0\x11\x99\xd9\xb1\xa9\x50\xc2\xe7\xef\x6f\x00\xbc\x09\xdf\xc3\xb8\x51\xb0\x9f\xa9\x59\x48\x0a\xd4\xd8\xf8\x1f\xa0\x14\xd7\x18\xcb\xe1\xa2\x1a\x89\x51\xb0\x88\x42\x2c\x95\x07\x47\xf9\x96\xfa\xfd\xfe\xa7\x43\xbc\x18\x3a\xcc\x82\xd8\x27\x32\xb6\x37\xbb\x4f\xde\x36\x4b\xa5\xe4\x33\x69\xc7\xaa\xfe\xb1\xbb\x9e\xbd\x25\x9e\x30\x50\x41\x17\xd5\xd3\xe9\xcb\x8f\xea\xfc\xb9\xd2\x57\x1f\x25\xb1\x48\x58\xa9\x7b\x2e\xea\x4b\xd3\xd7\x4d\x50\x78\x43\xf7\xa0\x5b\x59\xf7\x3b\xe2\x3f\x25\x02\xf3\x47\x49\x98\x46\x77\xe2\x4e\xfe\x1a\xaa\xd5\x2c\x4a\x64\xe2\xdd\xc4\x26\xd7\xc3\xb1\x3f\xb3\x00\x53\x0b\xfd\x95\x29\x63\x51\x9a\xa4\x4e\xf9\x0d\xa9\xf4\xdd\x72\x5c\xac\xd4\x84\xf9\x9a\x22\x1d\xe8\xf7\xed\xef\x9b\xfb\xbf\x8d\x64\x58\x94\x5a\xd7\x8b\x84\xec\xb7\x07\x35\xa1\xbf\x65\x51\x16\x31\xe6\xdc\xa0\x45\x54\x2c\x8b\x32\x41\xb4\x93\x7c\xf8\x9f\x73\xd3\x22\xda\xbd\x71\x7e\x82\xeb\xf7\x98\xcd\x4e\x8c\xd3\x81\xab\x9a\xb6\x6f\x7d\x64\x51\x96\x11\xdc\xf9\x1d\x83\xee\x54\xa0\x92\x45\x92\x38\xed\xbb\xdd\xe6\xab\xe6\x18\x16\xc9\x44\x62\xae\xf1\x5c\x62\xac\x80\x0d\xf4\xbb\xce\x71\xea\x0f\x94\xc5\xc2\x91\xd3\xcf\xd8\x79\x59\x24\x8d\x42\x77\xef\xea\x5c\x14\x48\x6f\x38\xda\xd7\x59\x64\x62\x86\x05\x7b\x03\x0d\x36\xf0\x82\x71\x50\xb1\x61\x5c\xa2\x9f\x84\x66\xe5\x76\xb3\xdb\x85\x01\x4b\x32\x2c\x10\x20\x5b\xe1\xf2\x03\xb4\xa9\xeb\x55\x2f\x2a\x69\xee\xa0\x91\xf3\x24\xb1\xcf\xed\xa4\x3e\xa4\x60\x24\x22\x31\xf6\x25\xa3\xf1\x7c\xab\x5a\xd8\x9d\xe4\xf1\x98\x97\xcf\x37\xa1\xd8\xc5\x08\xe1\x02\x9d\xcd\xc7\xe2\xdc\xca\x12\x82\x1c\x24\x23\x44\xa5\xd6\x75\x66\x3b\xb4\xb3\x7c\x1b\xfd\x48\x53\x34\x27\xf2\xcd\x79\x92\x45\xd5\x34\x63\x9b\x40\x62\xcf\xc5\x1f\x72\x26\xdf\xb1\xc3\xe1\x22\xab\x3d\xf9\x62\x48\x0c\x24\xf2\x08\x91\xff\xaa\x8e\x2a\x87\x79\x2a\xdb\xcf\xa3\x52\x60\x3b\x98\xcb\x89\xfa\xc2\xc8\xd0\x10\xc0\x48\xe8\x56\xe8\xbe\x2c\xba\x42\x82\xd6\x5e\xfa\x84\x11\x26\x1c\xbb\x09\x8a\xed\x9d\x40\xfb\xf2\xe9\x72\x81\x8d\x11\x96\x38\xa3\x7d\xea\x42\xab\x1a\xf6\x95\xeb\x6b\x7c\x74\xb1\x61\x7f\x50\xe9\x84\x3f\x30\x48\xbb\xed\x93\x75\x8c\x30\x93\x61\xe8\x57\xca\xd3\x6b\x5e\x8e\xf2\xaf\x8c\x70\x4e\x02\xd3\x72\xe7\xa9\xfe\x36\xca\xa7\x30\xc2\x65\x84\x52\x07\x27\x57\x13\x47\x22\xa0\x73\xd9\x4e\x0e\x20\xe2\xd4\x92\x9e\x15\xcb\xb1\x8a\xb8\xa4\xdf\x42\x2c\xc4\x88\x10\x02\xa3\x66\x27\x5e\x3f\xcd\x1c\x32\x22\x32\x57\x7d\xbb\x85\x5f\xf9\xb8\xba\xd4\x8d\x24\x08\xd9\xf8\xb9\xba\xbd\xdd\xec\x0f\xab\xeb\xeb\xa7\x30\x94\x28\x8d\xb1\xdc\x1f\x1b\xc4\xcd\xef\x37\xab\xbb\xc3\xea\xfa\x8f\xed\xee\xe1\x69\x77\xd8\x7d\x5f\x3d\x6d\xfa\x99\x96\x19\xe5\x15\xca\x1f\x7e\xde\x2e\x6f\x00\x24\x4d\x0c\x73\xd2\x9d\xb5\xc9\xcf\xcd\xe4\x32\xd2\xd4\x95\xbc\xab\x13\x94\x8f\x35\x6c\xd7\x0f\xc8\x1d\xae\xc3\x78\x46\x4c\x66\x3e\x6d\x95\x5c\x3e\x5f\xc6\x2d\x7a\x7f\xab\x53\x55\x14\xd5\x0e\x4e\x9d\x77\x9a\x97\x08\xab\x33\xfd\x81\xb5\xf1\xbc\xd0\xe1\x99\xdd\x57\x06\x46\x9d\x3c\x8c\x64\x46\x3a\x16\x1c\xdc\xbb\x43\x37\xe5\x57\xa4\xcf\x8c\x64\x36\x13\x5e\x82\xe7\x76\x38\x99\x24\x09\x16\x33\xb0\x19\x64\x2d\x8b\x62\xdf\x39\x0b\xc5\xc7\xa3\xd4\x23\x35\xfa\x21\xff\x17\x7e\x16\x83\xcb\x7d\xc9\xf2\xb9\xd2\xc3\x7e\x43\x24\x85\x64\x0c\x44\xfa\x64\x95\xab\x28\x33\xbe\xcc\x38\x2e\xca\x32\xa2\x88\x62\xa1\xc3\xc0\x49\xec\x4e\x98\xa1\x96\xb7\x22\xa2\x98\x8d\x1c\x48\xf1\x0d\x5b\xe9\xdc\x63\xf3\xf8\xbc\xe1\x66\x35\x65\x03\xa2\xd6\xf6\xbd\xa0\x8c\xe8\xc4\x29\x0d\xbb\x6c\xa2\x23\x35\x59\x75\x2e\xeb\xcc\x1a\x13\x23\x24\x2a\x56\xb7\xf9\x11\x7e\xca\xbc\x5f\xcd\x06\x20\xf4\xff\xef\xa4\x5d\x66\xf7\x67\x04\xa8\x13\x2a\x3a\x20\xa6\xa8\x3a\xb7\x43\x19\x90\x11\x90\x4e\x59\xf8\x1b\xb4\xb7\xb2\x34\x33\xae\x27\x16\x47\x29\xc7\xbc\xb0\x1e\x3c\x95\xb5\x9c\xb6\xe2\xb1\x38\x02\x96\x8a\x85\xe4\xb1\x1f\x26\x91\x52\x26\x20\x52\x1e\x8b\x0a\xd9\x8c\xc7\xae\xf6\x27\x4d\xa6\x0b\x9b\x5a\x4c\x32\x47\x86\xe5\x23\x99\xc7\x42\x7e\xe4\xe5\xb3\x2f\xef\xfa\x39\x2c\x65\x08\xce\xdf\xfc\xf2\x6c\xa8\xf3\x20\x69\xf1\x33\x89\x59\x66\xd1\x32\xb7\x81\x56\x30\xf4\x71\xfa\x71\xae\x23\xf4\xc7\xf0\x36\xfa\x9c\xf5\x23\x36\xf3\xf7\x8e\x57\xcc\x8d\x10\x8e\x99\x57\xbf\x9e\x4f\x87\x40\x41\xb1\x69\x5f\x76\xed\x85\x64\x9e\xff\x8d\x20\x19\x66\xc5\xf0\xc8\x37\x67\xac\x60\xfd\x07\x66\x4f\x51\xa4\x22\xf0\xac\xac\xeb\xea\x7c\xca\x2f\x9e\xb3\xd0\x06\x01\x15\xfd\x19\xa1\x5e\x5e\x12\x71\x22\x12\xda\xc3\xd0\x8b\xf9\x99\xd2\x2c\x32\x7c\xca\x80\x3c\xb6\x03\x71\xaa\x9c\x1a\x8e\x83\x88\x17\x1f\xf3\x9d\x7c\x76\x77\x59\x0c\x61\x27\xfb\xaf\xa7\x3f\x2f\x93\x4b\x2c\x96\xcc\x25\x70\xef\xe1\x3d\x30\x54\xce\xef\x4d\x25\x16\xdb\xf9\x4f\xd5\xfb\x2c\xa4\x88\x55\xaa\x93\xcc\x3d\x98\xbf\x40\xd6\x9f\x6c\x71\xb1\xd2\x8e\xd4\x0a\x1d\xbb\xff\xef\xdc\xf9\xf9\x33\x7e\xdd\x74\xb6\x0e\xfd\x0f\xb5\xd2\xca\xab\x78\xa1\x71\xd0\xf9\x49\xce\x04\xef\xd2\x30\xd5\x46\xd8\x01\xd1\x04\x81\x94\x6e\x19\xdd\xb6\xfa\x13\x28\xf5\xec\x0a\x4d\x94\xc5\x49\x4f\x08\x1d\x18\xf0\xc3\x53\x37\x24\x41\x29\xe3\x6f\xdb\xa7\xdb\xf1\x96\x11\x9b\x38\x31\x23\xfc\xf8\xfe\x7c\x9a\xb5\x07\xb1\xd8\x50\xa2\xa5\xc7\x7c\x4e\x7f\x6b\x1d\xb6\xf8\xf8\xda\x8e\x8b\xd1\xac\xf3\x52\xf0\xa1\xde\x6d\xef\x0f\xdb\xf5\xc3\x48\x85\x0c\x25\xc7\x5c\x82\x14\x77\x9f\xd0\x31\xbd\xfc\x51\x81\x12\x29\x75\xed\x7b\xed\xcb\xe4\xd4\x5d\xf4\x4d\x91\x81\xac\x69\xb1\x59\xfd\x93\x88\x23\x4c\xb7\x06\x83\xf0\xbb\xfc\xb9\x96\x9f\xd2\xba\xb1\xd8\x72\x17\xa8\xa9\xbc\x0b\x11\x6b\x59\xac\xbf\xa6\xab\xed\x2b\x4c\xa3\x6c\x26\xa3\x11\x73\x08\xc0\xfd\xb7\x35\x5e\xf4\x84\x23\xf9\xb3\xa4\x26\x32\xc1\x7b\xae\xdf\x56\x16\x4f\x55\x51\x34\x57\x1f\x88\xf8\xf7\xe3\xb1\xa0\x58\x51\xc7\xbe\x86\x6d\xd0\x34\x71\xd4\x9f\xb6\xa7\xbf\x37\xae\x61\xe8\xd7\xc7\xf2\xd7\x4b\x69\xe2\x00\x11\xd2\x98\x7d\x85\x32\x7a\xc5\xbc\x03\x82\x51\x2a\x19\xba\x64\xab\xeb\x3f\x87\xda\x23\x12\x7e\x61\x19\xd9\x95\xc6\x1e\xca\xe7\x2a\x2f\x9f\xf7\xbf\xae\x3e\x9c\xca\xd4\xf4\x29\xb0\x54\x26\x3e\xe7\x04\x75\x2d\x8b\x4b\x3d\x7d\x46\x79\x64\xf0\xd2\x4b\xa8\xc2\x39\x78\xc6\x30\x93\xda\x45\x84\x1f\x77\xa8\xee\xdf\x45\xa3\x7f\x1f\x7c\x51\x6e\x5d\xf4\xb4\x2b\x64\x33\x59\x2d\x34\x21\x0e\xaa\xd8\xb8\xaa\xcb\xec\x66\x93\x04\x94\xba\x00\xbf\xfe\xb6\x10\x0f\xd2\x04\x12\x84\x3e\xdc\x14\xd5\xf3\x51\x16\x85\x6f\x2e\x3f\x7d\x82\x25\x61\x34\x4d\x98\xeb\xdf\x44\x68\xc8\x37\x14\x7e\x0c\x43\x99\xc0\xe7\x83\x7c\x27\x9d\x5b\x65\x36\xbf\x7c\xcb\x8c\x97\xcb\x9a\xb1\x00\x30\x9a\xea\x14\x97\x67\xe0\x63\x1e\xca\xa7\xdd\x98\xc5\x80\xa3\xf3\x1e\x9f\x82\xf0\x4c\xd3\x8f\x9a\x18\x31\x25\xe7\xa6\x8b\x34\x9a\x11\x42\xd1\x4f\xc8\xa4\xa2\x5e\x23\xc2\x69\x43\x6c\xca\xb6\x9e\x9f\x3f\x33\x8e\x8a\x01\x31\x4f\xbd\xc0\x6b\xdf\x11\xc5\xa8\xd4\x80\x5d\x2e\xa1\x9a\xfd\xf3\x45\xba\x36\xf8\x70\x1d\xd2\x7a\x2d\x34\x9f\x5f\xa9\x3c\x64\xa3\x6e\x6e\xea\xea\xd8\x23\xca\xbb\x89\x2e\x19\xa2\x9a\x26\xe8\xd9\xf4\xf6\x85\xaa\x38\xc6\x8a\xbc\xf3\x77\x1c\x01\xdc\x80\xf9\x60\x54\x19\x2e\x6c\xc0\x6d\x76\x61\x95\xdb\x81\xa6\xeb\x53\x19\xcd\x7c\x05\x65\xd7\xc2\xe9\xa1\x74\x8f\x73\xfa\xfe\x0c\xd3\x5e\x5a\xa2\x34\x3e\x7f\x12\x46\x52\x27\x02\x35\x25\xd1\x3f\x3b\x4d\xf8\xc1\xf9\x1c\x73\x61\xfd\xab\x1f\x0d\xc7\x00\x12\xe9\x09\xd2\x0a\x43\xec\x59\xc6\x8d\x02\xd1\xd6\x99\xf6\x9b\xce\xd3\x45\x56\xa1\x89\x02\x0a\xa3\x96\x38\xf4\x61\x68\xf0\x9e\x01\x84\xa7\x37\x65\x19\x31\x3d\xee\xf4\x4b\x0b\x4c\x2d\xe3\x12\x1b\x75\xba\x80\xee\x84\x8e\xc5\x6c\x02\x4f\xbc\x74\x90\x43\xc8\x84\x6a\xe4\x08\xd1\xce\xa8\xcd\x38\x6e\x32\x9d\xeb\x3c\xb4\xc6\x61\x68\xed\x64\x09\xf1\x03\x40\x96\x99\xdf\x96\x76\xd1\x2e\x0a\x91\xd4\x13\xb1\x95\xdd\x62\x71\x30\xee\xa1\x0f\xa4\x73\xa8\x15\xba\xe7\x8d\x7e\x81\xa3\xf4\x9e\x40\x58\x31\x2c\xe6\x09\x1e\xe0\x90\x97\xba\x38\x9b\x5e\xb2\xe9\xbf\xe9\xff\x9d\x9e\x29\x56\x36\xea\xa5\x3a\x56\x35\x4c\x51\x2a\x9d\x95\x16\x08\x1d\xbe\xcb\xcb\xfc\x0e\x16\xf1\x20\x9f\x9b\x28\x46\x09\x60\x9c\x78\xcc\xcb\x87\x3f\xd6\xe1\xe2\x58\x24\xb9\x93\x71\xeb\x85\x33\xf3\xaa\x7c\x02\x69\xfa\xeb\x67\x89\x45\xde\xa6\x1e\x60\x36\xd9\x70\x19\xd3\xdc\xf3\x18\xc3\x88\xe0\xfa\x14\x1c\x95\xe6\xa1\x5c\xd4\x0e\x9e\xde\x1a\x03\xaa\x4d\xd8\x7f\xfc\xf1\x17\x37\x38\xc6\xd3\xb1\xda\xc0\xba\xe8\xfb\x35\x17\xee\x7c\x92\x5f\x9c\x6e\xcb\x8c\x2b\x8e\xf1\xdd\x5b\xd5\xc2\x4f\xe8\xd6\xf6\xd0\x7e\x34\xbb\x38\xa1\x14\xf6\xed\x61\xc3\xf8\xc7\xa1\x09\xdc\x6f\x13\xf7\xf1\x12\x42\x31\x3d\x9f\xd0\x19\x02\xa3\x6d\x75\x2e\x8d\x5f\x46\xfb\xfc\x08\xdd\x53\x25\xb3\xf5\x94\x00\x4b\x75\x90\x35\x7b\x3e\xd7\xf0\x3b\x7c\xf4\xf2\xe7\x9f\x21\x35\x7a\x4f\x9e\xa5\xb1\x54\x48\xc8\x13\xbd\xc2\xea\xc6\x5b\xb9\xd9\x29\x52\x11\xe1\xe6\xd0\x42\xd3\xde\xc8\xbc\x78\xac\x61\x50\x4e\xed\x27\x59\x6e\xfd\xee\xb4\x69\xb4\x3c\x85\x22\x5a\x33\xb0\x6c\xf4\xef\x25\xa3\xae\x0f\x5f\x1a\xf3\xfb\x87\x9e\xc7\xd6\xa3\xab\xcb\xb8\xc1\xaf\xf6\xe8\xfc\x21\xa4\x62\x9e\x2c\x54\x15\x69\x44\xb6\xb8\xd6\xb4\x97\xbc\x36\x3f\x01\x5e\xc7\xd4\x99\x8c\x29\x11\x31\xef\x9a\xdf\x41\x17\x24\x95\xed\x35\xc8\xa2\xf9\x9e\x77\x91\xfd\x6c\xef\x60\x4a\xc5\xa9\xcb\x3d\xbc\x97\xeb\x3a\xef\xdd\x1a\xa6\xa9\xc9\xa4\xcf\x1d\x1c\x4f\xd0\x22\x10\xdf\x47\xb2\x61\x4a\x6a\x7c\xa3\xed\xa9\x5a\x57\xe5\x33\x14\xf2\x08\x65\x90\xfd\x62\x4c\x83\xf5\x41\x42\x39\xc9\xcb\x30\x93\x71\x15\x05\xe5\x9a\x29\x66\x84\x31\x23\x5d\x1c\x93\x37\x88\x4f\xec\x45\xb7\xbb\x91\x0c\x11\xe3\xf0\x0b\x3d\xa8\x9f\x90\xcf\xac\x80\x31\x02\xa1\x3c\x9b\x62\x94\x48\x60\x90\x2a\x5f\xee\x54\xaf\xf0\xd1\x90\xd9\x8f\x20\x4b\xdd\xeb\xae\xf3\xe7\x67\xa8\x57\x2d\x52\xb9\x4d\x5e\xa0\x35\xd2\xa1\x4e\xce\xea\x8b\x68\x84\x47\x84\xb9\x34\x60\x55\x98\x71\xba\x8b\x47\x8c\x6b\xa7\xe5\x97\x5f\x30\xc0\x4d\xbf\x05\x4e\x32\xa7\x6e\x7a\xf3\xf0\xe3\xfe\x7a\xb5\xdf\x3e\xdc\x7b\xa9\x98\x21\x77\xc5\x89\x76\x52\x38\xd7\x60\xce\xba\x45\x0e\xd6\xc5\x6d\x82\x13\x93\xba\x5a\x71\x17\x83\x8e\xdf\x00\x8f\xb9\x2b\x25\xa0\x32\xc0\xad\x6c\x6f\x3d\xcb\x4a\xfa\xaf\xc9\x01\x62\xe1\x72\x5f\xd2\xbc\x41\xd9\x7d\xd7\xfe\x8b\x09\x87\xa1\x5e\x28\xd7\xe5\xac\x0e\xab\x73\x5b\x21\xbb\xef\xf4\x32\x68\xa6\xbd\x4e\x7d\x7b\x27\xcb\x8f\x3e\xcc\x1e\x61\xc2\x86\x8f\x80\xb3\x08\x78\x0f\xb9\xbf\x3a\xd7\xe5\x83\x46\xea\xde\xb0\x0c\x38\xef\x16\x56\x08\x55\x8d\x3a\x17\x41\x1b\x96\x71\x9e\x12\x14\x8f\xb9\xb9\xdb\x1f\x86\x12\x45\x18\xcc\x2c\x02\x42\x91\xe9\xe8\x80\xbb\xec\xa1\xed\xdb\x4f\x18\x17\xc2\x22\x87\xc3\xf7\x4b\x40\x68\x98\x01\x46\x3a\x92\x4b\x47\xcd\xd7\xe7\x95\x91\xf5\xd1\x77\x8e\xbb\x96\x98\x00\x7b\xfb\x52\x5a\x70\xf6\xba\x12\xef\xa6\xad\xd7\xdf\x0f\xb7\xb7\x7f\x1c\x68\x44\xfb\xe3\x1b\x2f\x53\xe6\x9a\xcf\x1c\xea\xf4\x93\x83\x4f\x17\x54\x9a\x00\x02\x13\x0f\x0d\xb4\x0b\xd2\x81\x8c\xa7\xc6\xf8\x38\xb2\xce\xc7\xe4\x51\x8c\x67\xa9\x46\xe3\xfe\x22\x1b\x74\x02\x5c\x52\xa6\x1e\xd2\x60\x5c\x26\x32\x76\xdf\xea\x43\x2d\x75\x01\x4e\xaf\xc7\x0f\xaa\x94\x61\x93\x4c\xdf\x14\x71\x36\x79\x3b\xc3\x09\x33\xae\x55\x1c\x08\x74\xfe\xa8\x30\xdb\x3d\x31\x07\xdc\x10\x8a\xd0\xac\xa3\xfc\x15\xea\x79\xfd\xeb\x36\x04\x30\x29\x74\x40\x4c\xb6\xef\xa1\x6c\x9b\x51\xea\x86\x1b\x11\x19\xda\x0b\x1f\x9e\x3f\x66\x58\x87\x4f\xde\x84\x11\x29\x62\x78\xd7\x0f\xfb\xfd\x64\x05\x98\x2c\xa3\x3e\x05\xbf\x87\xe3\xe9\x3b\xd4\x15\xd2\x74\xf5\xe3\x36\x42\xbc\x5d\x21\x9b\xf6\x10\x3a\x5b\xcc\xc1\x19\xf4\xc1\x31\xe4\xc6\x66\x46\xf4\x6a\x95\x9e\xa7\xd5\x8f\x01\xcb\x30\x4c\x3f\xd4\xd0\xbd\xe5\x31\x57\xe6\x65\x51\x90\x5b\xe2\xc8\x4f\x9a\x97\xea\x1d\x2b\xaa\x47\xd9\xe6\xba\x19\xff\xca\xcd\x14\x51\x2c\x13\xd3\xef\x6b\x0e\x98\xe3\xc8\x84\xfa\x19\x1c\x30\x8e\x3a\x75\x5e\xfb\x81\x1c\x6a\x38\x4a\xc4\xa1\x1e\xda\x71\xd8\x22\x22\xeb\x98\x69\xd4\x08\xcf\xb7\xc8\x4b\xca\x04\xe1\xae\xc7\xd5\xc0\xdb\x66\xff\x7d\x54\x89\x0d\xc7\x8a\x09\xc1\xc4\xf9\x73\x55\x99\xe6\xe1\xf7\xe9\xe2\x14\x71\xe6\x60\xb3\x98\x54\x76\x54\x0c\xdf\xc0\x65\xae\xfa\xab\x89\x33\x27\x29\xfd\x74\xee\xcc\xab\xff\x23\x8d\xa8\xa5\x43\x15\xa2\xa7\xfe\x61\x82\x49\xc0\xf2\x66\xf7\x18\xf6\xf5\xc7\xb7\xd0\xb0\xc6\x04\xd3\x8e\x01\xfa\xdb\xfd\x7e\xd5\xd7\x66\xa6\xcb\x55\x70\x70\x4d\x5c\x9b\x22\x7f\x3e\x4a\xdf\x81\x31\xa9\x47\x08\x91\x0a\x0c\x6b\x1d\x01\x75\xdb\xd3\x01\x32\x21\x32\xc0\xf8\xfd\x74\xae\x9f\xb1\xb1\xeb\x93\xf8\x54\x24\x54\xc5\xc6\x13\xd5\x8e\xd3\x74\x58\xea\x40\x3a\x2b\x57\xdb\x1a\xfd\x19\x1d\x87\x17\xd9\x4c\xbf\x50\x91\x65\x29\xba\xa0\xb2\xae\x25\xf6\xc2\xdc\x54\x41\xb2\x65\xf6\xa8\x65\x92\x21\x23\xcf\x4d\xf5\x9a\xb7\x81\x4c\x80\x09\xc5\x09\xf6\x0d\x56\xb5\x81\x3a\x88\xe3\xce\x1e\x8a\xb2\x56\x79\xed\x9c\xe9\xd7\x2b\x74\x94\xf5\x44\xd2\xb9\xcd\x97\xaa\xd6\xc2\x70\x29\xd9\x05\x1d\xd5\xf4\x0c\x46\x66\x48\x0e\xf0\xeb\x34\x3c\x0b\xa3\x64\x1a\xa8\xb7\xb0\x6f\x65\xd1\x00\x0a\x63\x9c\xc8\x2a\xca\x56\xb5\x55\x09\x6b\xd9\xbc\x5c\x49\xa7\x4a\x1c\x8e\x05\x91\xc2\x37\x53\x95\xbb\xb3\xda\x38\x28\xd8\x2c\x6d\x2e\x80\xbb\xf4\xd9\x0e\xca\x5e\x3f\xff\x4b\x8c\x0e\x13\x56\x44\x6e\xb5\x34\xba\xae\xde\x3b\x47\xb1\x90\x8b\x12\x60\xd3\x4b\xb6\x42\x13\x1b\x30\x1a\x6d\x55\xff\xcf\xec\x4a\xac\xd2\x88\xcc\x5d\xd7\x60\x76\xf9\x73\xff\x2d\x59\x6d\x7d\xe7\xa0\x3d\x97\x7e\x23\x9a\x3e\xc8\x24\x4a\x6d\x32\xb0\x0f\xe1\xfe\x77\x40\x9d\x90\xee\xbf\xed\xf9\x92\x91\x67\xfc\xaa\x92\xc8\xc8\x2c\x1a\x17\x05\x3e\x71\xec\x17\x79\x3b\x59\x42\x22\xe2\x64\xc0\x65\xdd\x80\x47\x13\x61\x5b\x4c\x8b\x49\xd1\x01\x14\xc8\x92\x38\x02\x0c\x86\xf7\xf9\x33\xd4\xdd\x1b\xfb\x2d\x0c\xc4\x29\x2e\xf5\xf2\x7c\x1c\x87\x65\x4d\x3f\x6e\x68\x68\x14\xdb\xbd\x54\x27\xfc\x7a\xd0\xc4\x22\x59\x0f\xd2\x8a\x4c\x6e\x89\x45\xae\x5c\x79\x3c\x7f\xaa\x8f\xc4\x12\x96\x3a\x41\x8e\xb6\x3a\xd7\x25\x3a\xb9\x9b\xd2\x8c\xc8\x83\x58\xc2\x20\x42\xaf\x65\xbb\x7e\xd8\xbd\xcb\xd3\x28\x05\x94\x70\x92\x88\xc8\x8b\xcf\x2e\x34\x19\x76\x13\x80\x06\x0a\xc6\x6e\xff\x9d\xc6\x23\x89\x20\x1c\x77\xc8\x0b\xbf\x69\x76\x18\x91\x38\x35\xf0\x1a\x74\x2b\xcb\xe7\x4f\x7a\xdd\x59\x22\x8c\x40\x88\xc0\x11\xe5\x2b\xb7\xe5\x65\xd3\x36\x4b\x04\x64\x48\x88\x07\x27\xfd\xbe\x50\x91\x4d\x92\x38\xc5\xfa\x17\xfa\x8f\x62\xd0\x03\x0e\xc3\x54\x0a\xdd\xd7\x77\x03\x79\xf4\x8c\x40\xf8\x82\x8f\x9c\x25\x89\xe6\x18\xc1\x36\x6d\x75\x0a\xe4\x7f\x7e\x28\x25\x32\xc2\x72\x74\xd5\x6e\xfe\x7d\x96\xc5\x6f\x3d\x97\xf0\x74\x89\xa6\x8c\x22\x2c\xc0\x2b\x4a\xac\x5f\xf2\x62\xb9\x63\x86\x25\x69\xea\x9c\xaa\x67\xf8\x9a\x78\x98\x25\xa9\x55\xae\x62\xf6\x32\xed\x50\x1b\xf6\xe1\x24\xe3\x1a\x91\xbf\x4f\xae\x97\xeb\x63\xf7\x22\x63\x2e\x2e\xec\xc3\xdf\x00\xe4\x96\xe3\x65\x7f\x0a\x29\x98\x76\xbd\x5b\x66\x2c\x7f\xf1\xc9\x72\xd0\x46\xb8\xa0\xe5\x0b\x85\x9d\xe9\x2f\x4c\xe2\x40\xd2\x87\xb6\xba\x45\xa7\x66\xf2\x60\x21\x36\xd8\x35\xa9\x3f\x79\x9a\xc0\x63\x74\x1e\x64\xd9\xbc\x43\x7d\x51\x8c\x99\x1e\x4b\xb8\x2c\x1d\x94\xc6\x95\xc2\x77\x08\xdc\xed\x81\xd4\x2c\x01\x60\x68\xdc\x8f\xf2\x17\xaa\xb3\xb8\xa2\xf8\x23\xd4\xb6\xaa\x8f\x03\x15\x2c\x4b\xac\xe4\x58\x47\x5d\xaf\x76\xfb\xe1\x6f\x29\x2a\x31\x37\xd0\x5e\x0f\x84\x00\x61\x50\x29\x2c\x38\x1f\x65\x79\x96\x45\x67\xcc\x5d\x6b\xf7\x97\x85\xc4\xc4\x5a\x99\x11\x2f\x9f\xb4\xae\xaa\xc2\x54\xef\x53\x84\x22\x4b\x23\x26\xb0\xe2\xf7\x50\xe7\xcf\x79\x89\x6d\xbd\x0b\x85\xb1\x94\x08\xc0\xbd\xbd\x33\x07\x2f\x18\x93\xe7\x5a\x16\xb5\xeb\xc5\x0b\x73\xa4\x2b\xbe\xf6\x0a\x70\xeb\x87\x3b\x3c\x96\xe3\xb2\x42\x6f\x63\x7a\xf2\x98\x09\xcc\xb2\x07\x06\x4b\x97\xdc\xbf\x93\xcd\xeb\x0c\x27\x97\xd2\x28\xc1\xa8\xbc\x7b\x3f\xc7\x5e\x71\xed\x67\xde\xbe\xac\x74\x7b\x96\x85\x87\x36\xce\x7f\x45\x5c\xf1\xc4\xc0\x1b\x14\xd5\x09\xc1\x8f\x20\x5d\x50\xd9\x38\x21\xdc\x70\xf1\x94\x49\x0c\x28\xd4\xf9\x63\xe0\x9f\xf4\x63\x8c\x6b\x44\xd4\xde\x81\xc9\xe5\xc8\xac\xa7\x2c\x49\x23\x15\x38\x32\x9e\x40\x43\xd9\x3a\x30\xc2\x71\x4e\x89\xc5\x52\x26\x63\x44\x7d\xdb\xaa\x46\x9f\x7e\x09\x61\x1e\xa6\x9a\x2c\x56\xa3\x3c\xe8\x40\xd6\x36\x89\xf0\x53\xae\x9d\xea\xb0\xa7\x34\x72\xe2\x5c\x33\x07\x20\xe5\x86\xc6\x3a\xc0\xd4\x2e\x08\x40\x66\x09\xe5\xd9\xff\xf9\x43\x08\x9e\x61\x4f\xfb\x7f\x00\x9a\x17\x59\x4a\xa5\x02\x0a\x24\x15\xc2\xb9\x4a\xfa\x45\x1e\x4f\x83\x83\x9c\x26\x8a\x66\x71\xdf\xaa\xf7\x07\x32\x33\xce\x73\xd1\x69\x9a\x52\xa4\x8b\x73\x91\xbe\xfc\x15\x7e\x9c\x6a\x89\xce\xcf\x8b\x6c\x3e\x23\xf3\xeb\x67\xba\xbc\xfb\x41\x1a\xb3\xf9\x85\xd9\xd8\xf9\x49\xb2\x28\x22\x81\x99\xf5\xd7\xd5\xa9\xc1\x4d\x6e\x16\x7c\x8e\x3f\xf3\x34\x53\x31\xf8\xbd\x78\x75\xe5\x8f\x75\xf5\xb1\x50\x71\x4a\x65\x24\xb0\x90\xfb\xd7\xb9\x44\x55\x9c\xe9\x89\x65\xa4\xc1\x43\x30\x9f\xaa\xf3\xf3\x8b\xcf\x82\xce\x0e\xc1\x01\xa3\xd5\x6e\x5b\xeb\x9c\x5c\xe7\x21\xbb\x2c\x40\x75\xae\x35\xd4\xbf\x2d\x6d\x87\xa9\xe4\x36\x0a\x4b\x04\xbf\x89\xaa\xcc\xbb\x85\xd2\xf3\xf7\xb0\x54\x0a\xd7\x46\xb0\xc3\xe2\xb9\xcd\x6b\xc7\x58\x32\x4f\x72\xf6\x9b\x41\x2a\xb3\x8c\x70\x74\x27\xe1\x2a\x2f\x8a\xd1\xdb\x54\xc4\x22\xd1\x4c\x0f\x48\xd8\xd7\xf9\x5b\x1e\xc8\x86\x58\xaa\x23\x8a\x28\xd6\x9b\x3f\x9f\x56\xfb\x4d\xff\x57\x21\x10\x43\x5e\x56\xc6\xb5\xd1\xf6\x1f\x94\x49\x04\x66\xd0\x9f\x6b\x59\xb6\x9e\xb8\x76\x92\x84\x4e\x4d\x9a\x61\xaf\x98\x93\xac\x1a\xaa\x66\xa9\x25\x80\xd5\xd7\xce\xc8\xd8\x29\xe1\xd6\x27\x09\xa5\xd4\xd2\x08\xcf\x56\x56\xed\xcb\xb0\x37\xa7\x36\x75\x3d\x82\xab\xee\xb3\xcd\x21\xac\xbe\x2c\xca\x34\x7a\x09\xd7\x95\x6d\x47\x19\xb9\x2c\x02\x8b\x26\x18\x0d\x6f\x09\x6d\x67\x08\x82\xce\x8c\x9f\x42\x22\x21\xbd\x4f\xf4\x3c\x8a\xde\x32\x62\xbd\x0e\x79\x59\x7c\x3c\xca\x70\x93\x19\x4d\x1d\xed\x3e\x9a\x8f\x47\x57\x8e\x58\x5e\xe8\x19\x55\xa9\xf4\x04\x6e\xf5\x35\xbc\x0d\x0d\x49\x2c\xa3\xd6\x62\x33\xff\x1b\x36\x12\x5d\xd0\x7a\xcd\x0e\xc4\x12\x95\x79\x66\x86\x87\x73\xab\xab\x23\x3c\xd8\x1d\xe8\xaa\x34\x2e\x21\x7b\xf5\xb1\x29\xdb\xbc\x9d\xad\xd3\x8c\x59\x93\xd9\x01\xed\x12\xce\xcd\x09\xc3\x24\xf1\x53\x8b\xc5\xd5\xd9\x8f\xb8\x52\x58\x6b\xba\x7e\xf8\xf3\xaf\x81\xb9\x83\x65\x82\x19\xec\x9a\x6d\x5f\x60\xe0\xe6\x63\x99\x90\x09\x12\x66\x1d\x86\x12\x16\xae\xd8\x41\x86\x99\x65\x89\x86\xd0\xcf\x7e\x9b\x6b\x28\x1b\x78\x82\xfc\xa8\xce\x75\x03\x97\x36\x37\x4b\xa5\xc6\x10\x0f\x9d\xaa\xf2\xf3\x1c\x76\x96\x25\x4e\x88\xe4\x2e\x2f\xa7\x30\xb8\x2c\x93\x36\xf5\xd0\x7c\xd4\xd8\xbb\x05\xf3\x3c\x8f\x4f\xb2\x0c\x22\x34\x43\x3f\xee\x77\x0f\xb7\xd7\x87\xd5\xed\xed\xc3\xda\xa5\x41\x37\x7f\x3e\x3e\xdc\x6f\x02\xbb\x2d\xcb\x64\xc4\x7b\x76\x27\x87\x94\x1f\xb7\x40\x74\xe3\x19\xbe\x67\xe4\xa6\xb6\x52\x63\x9a\x7f\xa9\x81\x8a\x65\x92\xc7\x88\x18\xed\x4c\xc7\xbe\x5a\x5e\xfb\x99\x26\x8e\x7c\x05\xe9\x4b\x65\xd1\xef\x77\x99\x4e\xa4\xa1\x23\xa0\xda\xf7\xea\xdc\xc0\xfa\xdc\xde\xd4\xd5\xf1\x32\x1b\x9a\x99\x08\x90\xd0\x11\x97\xaa\x77\x89\x77\xde\x47\x9b\x3d\x0c\x13\x39\x63\x61\xf2\x46\xbe\x55\xef\x63\x5b\x16\x0c\x40\x66\x88\xc2\xdb\xec\x22\x3e\x07\xa1\x5c\x95\x66\xbc\xa8\x4d\x9c\x20\xa3\xd0\xed\xe6\xa6\xff\x93\x94\x59\xcf\xa1\xdc\xb4\x8f\x50\x6f\x4a\xa8\x9f\xe7\x2b\xd5\x00\xf5\x5a\x2b\xdb\xd2\x6f\x08\xd3\x09\x90\x12\x1e\x5e\xc1\xa7\xea\xd4\x2c\x03\xe3\x54\xc3\x74\xe8\x06\x5b\xe0\x2f\x60\x32\x4a\x15\xa6\xd6\xc2\x73\xe9\xd6\xd7\x02\x2b\x16\x93\x91\x11\xe9\xe8\xea\xa7\xd7\x24\x49\xc2\x89\xd7\x47\xc7\x02\x91\x1c\xe0\x36\x32\xe6\x2c\x96\x3d\x03\x21\xba\x49\x23\x33\x1e\x26\x99\xc8\xcc\xd0\x71\x4d\x5f\x64\x1a\xce\x43\xb3\x34\x36\x23\x78\x02\x3e\x80\x9b\xaa\xf6\xc5\x98\xd9\x64\xe5\xda\x56\xfd\x37\xef\x76\x40\x3f\xc6\x19\x47\x41\x8f\xc7\xa7\x0d\xf2\xea\x38\xb0\x6a\x3f\xaa\x04\x56\xba\x9f\x00\x0c\xd4\x70\x9c\x1d\x58\x44\x29\xa2\x15\xae\xd7\x7f\x7e\xd6\x9c\x37\xdf\x95\xa5\x90\x69\x08\x7b\x02\x15\xe0\xe4\xcb\x91\x09\x51\xe8\xe9\x5b\x17\x81\xdd\xc9\x5f\x6b\x79\x1a\xe9\xf8\x30\x99\xc8\x0c\x7d\x12\x94\xf4\x85\x16\xea\x66\xe6\x31\x2d\xe7\x43\x64\x16\x0b\x04\xe2\xcb\xa6\xc9\x9f\x91\xdb\x7b\x0c\xd9\x94\x99\xb5\x89\x08\xe2\xf1\x4d\xfb\x5d\xb6\xfa\x65\xb2\xb0\xfc\x3c\xc9\x92\xc8\xe7\x9b\xba\xbf\xce\x7d\xa2\xe9\xed\x4a\x9e\xe0\xb3\xbf\x95\xcf\x63\x73\x24\x65\x22\x42\xfa\x68\x90\x0c\x12\xfd\x68\xea\x18\xfa\x7d\x03\xd5\x73\x0d\xce\x2a\x7e\xa5\xb8\xf9\x49\x52\x67\x39\xa2\x90\x8a\xe8\x38\x70\x51\xa2\xc9\xd8\x98\xe7\x99\xad\x90\x4a\x64\x49\xd4\xb7\x40\x5e\x55\x7d\x5a\x4e\x2a\xe1\x30\x1f\xba\x3a\x5e\x1d\xfa\x3f\xea\xd8\x91\x87\x99\x63\x5e\x06\xf0\xc3\x66\xfb\x98\x24\xc9\xa7\x81\xe8\xd8\x84\x7f\x1d\x85\xce\xaf\xdf\x24\x98\x0b\x3a\xca\x57\x78\x2c\x64\x79\x91\x53\xf7\xf3\x34\x8b\x31\x41\xbd\xae\x8a\x02\xf4\xa7\xb3\x32\x07\x55\xae\x51\x01\x69\x22\x60\xc5\xa4\x56\xa9\x2f\x6c\x07\x41\xac\x8b\x5a\xbb\xd4\x90\x60\x00\xb4\xaf\x73\x35\x57\xab\x5b\x62\xd7\x63\xd2\x70\x4e\xb9\xe3\xf0\xa8\xac\x27\xdf\x97\xba\xdd\x95\xf9\x69\xb0\xaf\x12\x22\xee\x68\xda\x3d\x2f\xd2\x94\x19\x8b\x49\x88\x75\xa0\xe5\x59\x9d\x4e\xf7\xb9\x7e\x2d\x87\x5d\x5d\x02\x4f\x11\x4a\x71\x95\xb7\x6d\x0d\x23\xa8\xfe\x42\x22\x54\x5a\x42\xd0\xbb\xc2\x02\xd5\xd5\xf9\xe3\x4a\xea\xd7\x87\xb2\x3f\x96\x25\xa9\x63\x5e\xad\xaa\x42\x76\x16\x7e\x1a\x5b\x49\x4b\x2c\x73\xea\xa4\x58\xec\x78\xb0\x36\xd7\xb9\x2c\xe6\x6c\x91\x4c\xda\x98\x85\xe2\x83\x77\x0e\x46\x8d\xcc\xd3\x67\x64\x33\x26\xec\xb8\xc9\x71\xc2\xf9\xca\xa4\x35\x32\xf3\x42\x2c\x7f\xc8\x22\x37\x57\xb2\x81\x5b\xe4\x3f\x7e\x28\x07\x0f\x7d\xc6\xdd\xc1\x54\x14\x33\xee\x49\x8f\x03\x90\xf7\x6f\x4c\x87\x8a\x92\x94\x86\xde\x09\x99\x9b\x47\xa9\x5f\xe5\xf3\xdf\x4a\xdc\xf4\x3f\x96\x58\x04\x2b\xe1\x3d\x10\xc5\xcd\xdf\xc4\x64\x13\x50\x84\xd8\xd8\xb3\x9b\x38\xc0\xca\xf8\x1b\x08\xad\x0e\x8a\xc4\x14\xf3\xb4\xce\x5f\xf4\x00\xb5\x30\x66\x9c\xc8\xc2\xf5\xe6\xcf\xdb\x6d\xef\xc9\x2b\x02\x51\x66\xc2\x2e\xe7\xd4\x67\x9e\x40\x76\xdb\xff\x30\x43\x10\xe9\x61\x45\x75\x83\xec\xa9\x61\x28\x8e\x20\x09\xad\x36\xf7\xe7\xe3\xa1\xff\x7b\x6a\x10\xa9\xe2\xd4\x61\x07\x59\x51\xa6\x62\x49\xb0\xf4\xaa\x65\x6d\x9a\xc3\x11\xda\xe1\xc6\xfd\x0c\x96\x65\x4e\x38\xce\xb9\xff\xe8\x92\x3b\xe5\xb6\x70\x0c\x66\x62\xcc\x7b\x9f\x10\x68\x35\x30\x95\xfa\x61\xce\x49\x8a\xae\x69\x55\x14\x13\xba\xdd\x6e\xc8\xa9\x97\xe2\x3b\xab\x5f\x83\x94\x47\xff\x94\x93\xc8\xe0\x91\x6f\xf3\x7f\x9f\x73\x93\xb7\x1f\xa1\x9d\x39\x8c\x0b\x85\xbc\x4c\xdb\xf5\x43\xb7\xe8\xea\xfe\xef\x89\x63\xb2\xed\xf6\xf1\xcf\xf2\x36\x61\xb5\xab\x24\x15\x9e\x6a\xaa\xed\x02\xd6\xc3\xd5\x7e\xfd\x63\x77\x3d\x7b\x0a\x89\xa4\x98\x31\x3a\x38\x7b\xbf\xd3\xb5\x3c\x75\x61\x44\xc0\x73\x4d\x67\xa7\x91\x6b\x75\xf0\x0d\x8f\x55\x2b\x8b\xe9\xcb\x4f\x49\x8a\x98\xd0\xdd\x7e\xb7\xdf\xec\xf6\x64\xf8\xbb\x53\x66\xbd\xca\x31\x1e\x9a\x3c\xac\x34\x95\x58\x54\x6b\xb4\x2c\x4b\x30\x57\x75\x55\xfe\xa7\x8b\x7c\xfa\x07\x9d\x6a\x8d\x56\x70\xd3\xbe\xdc\x56\xe5\xf3\xe6\x17\xd4\x1a\xdf\x53\xf8\xbe\xe3\x21\xdf\x90\xce\xbf\xb8\x4c\x4b\xc5\x43\xc2\xf6\xaa\x97\x83\xe9\x97\x50\x06\x56\xf9\x1a\xfd\xb6\x3c\x9d\xdb\x45\x28\xff\xf4\x90\x92\x08\xac\x86\xaf\x1f\x6e\x1f\x9e\x0e\x8f\xdb\xfb\xdf\xc3\xc1\x14\x55\xb8\xb5\x35\x6d\x75\x1a\x67\xc9\x95\x12\x11\x26\x67\x9b\xfc\x79\x54\x0a\xf4\xe2\x9d\x61\x92\xa6\x80\xa0\x82\x2b\x68\x7f\x6e\x56\xcb\x3e\xa5\x32\x09\xc1\x90\xf3\x5b\x77\x98\xc9\x73\x34\x89\x4a\xfc\xfb\x76\xfe\xf0\x52\xdf\x3f\x53\xa0\x53\xd7\xf5\xf7\x92\xd7\x06\x83\xa3\x30\x2f\x4c\x00\xd7\x1c\x3e\xb0\xdb\xcf\xc0\x57\xd3\xe3\x59\xc9\x05\x8c\x88\xdc\x5c\xb3\xc9\xc4\xaa\xe8\x88\x44\xe8\x58\x1d\x42\xdb\x48\x2d\x8b\x49\xe9\x2a\xcc\x63\x11\x26\xb8\xee\x3e\x26\x7a\x9c\x9f\x80\x95\x27\x16\x5b\x13\x62\xb1\x81\xcd\xcb\x1d\x87\x9a\x39\x2a\xfb\x2f\xd4\xee\x34\x49\xa5\x4c\xfa\xa6\xe6\x51\x27\xaa\x1f\x8f\xa3\x8c\x87\xf1\x9e\x44\xe4\x53\x9f\xa7\xff\x91\xa3\x10\xad\xa1\xad\x73\x78\x83\xcd\xaf\xce\x9d\x1f\x51\x68\x32\x1d\x1b\x83\xaf\xe9\xfb\x6e\xfd\xcf\x6f\x8e\x6a\x85\x01\x11\x8a\x29\xf8\xfa\xd6\x62\x09\x4d\x53\xad\xb1\xb5\xbe\xdb\x90\x1e\xab\xe2\x12\x2b\x3e\xbf\x81\x21\x84\xd5\x2c\x71\x29\xe5\xf7\xa0\xe0\xd1\xdb\x42\xcd\x94\x25\x9e\x14\x77\x00\x69\x8f\x7f\x6a\x34\x25\x01\xac\xd7\x27\xe9\x67\x7b\x43\x37\x0b\x33\x2f\x81\x80\x21\x0c\x4f\x6f\x81\xc7\x42\x3b\xe6\xff\x37\xd7\xb9\xe7\x69\x78\xc3\x51\x38\x4f\x43\xab\xfb\x1f\xb2\xce\x55\xd1\xc3\x27\x97\x24\x5a\x99\xe6\x4a\x61\x94\xeb\x52\xc4\x0b\x3c\xc4\x69\x98\x08\x09\x4f\x83\x7f\xd0\xb4\xd5\x11\x6a\xc7\x68\xb1\x5e\xb8\x4a\x41\x01\x42\xce\x64\x48\x09\xe9\x84\x80\x8d\x7b\x13\x89\xe9\xfd\xa0\xf9\xf1\x77\x6f\x62\x7a\xd5\x09\x65\xb8\xb7\xbd\x43\xde\x13\x0c\x87\x21\x23\xc0\x0e\xac\xb8\xf2\x75\xe6\x3e\xeb\x2c\x21\x58\xe9\xba\xfa\x63\x15\x7e\x93\x49\x1b\xfb\x7b\xbb\xe4\xe7\x60\x3a\x83\x14\xd9\x27\xc2\x9b\x59\x05\x5a\xf0\x7e\xdd\x4a\x2a\x70\xcf\xbf\xad\x9e\xc9\x12\x63\x27\xd3\x52\xa6\xc6\x85\xcd\xab\xba\xf6\x01\xfe\xb6\xb9\xa9\xab\xff\xcc\x6b\x01\x5a\x11\x8d\x58\xb7\x42\xf6\xc8\xf0\xe9\x04\x4d\x62\x47\x1d\x8d\xc6\x1a\xad\xc9\xec\x8a\x35\x77\xa5\xff\xe3\x01\x3c\x7f\x44\xb7\xff\xe7\xe5\xf3\x06\x9d\x81\x7e\xb5\xe8\xc4\x22\xb8\x01\x3f\x9d\x10\x1b\x2c\xcb\x6b\xcc\x4e\xa0\xc0\xf8\x70\x11\x69\x4d\xbd\x1f\x0f\xe6\xa1\x86\x2b\x59\x60\x8e\x6c\x7e\x51\x60\x05\xa6\x9d\x5d\xd9\xc6\x57\x2e\x06\x39\xd3\xe5\x13\xd9\xd8\xe1\x26\xfc\xa8\x8b\x28\xdd\x0b\x9f\x3e\x14\x6b\x5d\xbb\x6d\x03\xbd\x58\x4d\x29\x9f\xe1\xeb\xae\x45\x13\xc5\xda\x07\xff\xb6\x1a\x10\xed\x26\xa2\x12\x6d\xf2\x55\xe0\x5e\xba\x81\x56\xbf\xfc\x36\xfb\xad\xb4\x58\x54\xee\xa2\xd6\xbc\x7c\xbe\xad\x9e\xfb\xee\x4d\x43\x38\xf3\x2c\x46\xed\xf5\x50\x1c\x41\xb0\xd3\x63\x5d\x1d\xab\xee\x8e\xf7\x63\xc9\x8a\xe9\xb3\x32\x24\x33\xb1\xea\x59\x85\xc0\x4c\xc2\x1a\x43\xa4\xd3\x49\x3a\xe2\x8d\x36\x67\xd5\xe8\x2e\xc0\xe9\xe3\x13\x43\x64\x26\xc1\x67\x43\x64\x6d\xae\x6b\xf9\x7e\xc9\xe6\xcd\x0c\x65\x4e\x30\xea\x47\xa0\x98\x74\x26\xa5\x57\x9b\x58\xfc\xf8\x0c\xb3\x86\x74\xbf\xea\xe9\x4c\x98\x11\x11\x60\x3c\xb4\x1f\x53\xdd\x5e\xf2\x99\x4f\x9f\x9f\x30\x31\x7e\xc4\xd8\x90\x72\x49\x1e\xc7\x4c\xc2\xed\x48\x80\xed\x2e\x2f\xab\x7a\x5f\xc3\x6c\xff\x34\x09\x30\xa7\x20\xd4\x56\xa7\x6d\xd3\x9c\x07\x7b\x63\x32\xa5\xb1\x65\xe5\x59\x1e\x67\x31\x8a\xe9\x82\x98\x80\x90\xda\xb4\x2f\x13\x29\x49\x66\x94\xe2\xb8\x0f\x61\xee\xc5\x11\xb4\xed\xb7\x77\x9b\x7e\x58\xc7\x69\x3c\x30\x6a\xad\xfb\x14\xd6\x08\x36\xbd\xfc\xe1\x18\x1d\x39\x68\xad\x23\xc8\x77\x09\xff\x19\x77\x3b\x33\x9a\x19\xd0\x23\x44\xc5\x4d\x55\x3f\xc9\x8b\xb7\x67\x98\xc2\x0e\x9f\xa2\xaa\x5e\xcf\xa7\x91\xb2\xfc\xc5\x34\xfc\xc6\xff\x41\xc9\x77\xc4\xc0\xc4\x0c\x18\xcb\x5c\x49\xb2\x3d\xd7\x25\x8a\x37\xdf\x54\xf5\x8f\xa6\x5b\x66\xb3\xe0\xd1\x80\x35\x48\xc3\x7f\x92\xb9\xd9\x96\x4d\x2b\x8b\xe2\x38\xa2\x29\x31\x36\x75\x6d\xbb\x6a\xc0\x95\x19\x6b\x34\x78\x13\x72\x2f\x8f\xe3\xb6\x0f\x37\x01\xa2\xd8\x28\xdd\x5f\x40\x67\x61\x5c\x9f\xd7\xf4\xfe\x80\x30\xe0\x9e\xb4\xf9\x35\xf8\x4f\xcb\x9c\xeb\xff\x9a\xfd\x30\x23\xd6\x7d\xfb\x9d\x7f\xdf\x80\xf7\x38\x57\xa5\xe9\x5e\xe8\x57\xcf\x06\xe2\x28\x66\x63\xbe\xa5\xf7\x9b\x1a\x00\x57\x50\x5f\x89\x1d\x07\xf1\x10\x47\xae\x31\x7b\x23\x9b\x8f\xc7\xee\xcd\xb7\xe3\x74\xfe\xe7\x4d\x08\x10\x0b\x8e\xc5\x87\xde\xeb\x98\xaf\x15\x88\xa5\x19\x9a\x55\x3d\x1d\x7f\x18\xd2\x1a\x19\x24\x47\x02\xcf\x75\x3f\x66\x33\x69\x42\x3d\x76\x5b\xda\xea\xe2\xc0\x8c\x6a\x35\xa2\xf8\xf5\x9c\x2c\xe1\xf7\xdd\xfb\x31\x2e\x4f\x62\x01\x86\x3f\x6b\xea\xd8\xd0\x8e\x9e\x6e\x65\x7e\x50\x13\x63\x08\x2d\x8b\x1a\xa4\xf9\x70\x02\x6c\x93\x3b\xe6\x31\x43\xe9\xed\xfd\xd3\xea\x7a\xf3\xb4\x1b\xd5\x35\x80\x77\x66\x15\xdd\x7b\x94\x79\xfe\x56\x54\x4a\x16\xfb\xd0\x3f\x15\x66\x09\x9a\x20\x17\xd5\xad\x54\xd5\x74\x40\x00\x0c\x24\xf3\x77\xd0\x42\x7d\xd9\xfc\x9d\xce\x16\x49\x92\x46\x18\x03\x3e\x3a\xbe\x84\xa7\xaa\x28\x50\x9c\xf3\x33\x8c\xd7\xc5\xcf\x4d\xe6\xca\x00\x27\xb8\x5e\x6d\x97\x2d\x2a\x24\x99\xc0\xf6\x6e\x83\x92\x2b\xe8\xfc\x23\xe5\xf3\xfc\x3b\x83\xc4\x3a\x54\x5c\x91\x1f\xf3\x36\xc8\xba\x35\x7e\xa7\x0b\xf7\x99\x0a\x17\x68\x15\x60\xdb\x64\x06\x6c\x87\x34\x8d\x1c\x4b\xae\x6c\x56\xb6\x85\x3a\xc4\x7a\x20\x99\xc4\x72\xe6\xc0\xf9\xe9\xb3\x2f\x63\xe1\x70\x06\x92\x33\x3b\xe8\x48\xef\xba\x10\xa9\x0b\x5a\x9b\xe5\x0e\x46\xd0\x44\x06\xa2\xf2\x41\x6f\xab\x3d\x77\x96\xe4\x5a\xb6\xe0\x7a\x11\xc7\xe1\x3f\x68\x9f\x3a\x0b\xa2\x79\x52\x2f\x62\xe3\xc6\xff\x12\xb1\x9c\x8d\x04\xad\x2d\xa6\xfd\x1f\x77\xfb\xab\x11\x86\x19\x4c\x16\x61\x14\x77\x73\x3b\x45\xf2\x82\xb1\x42\x79\x9d\xc9\xad\xae\x02\xe1\x9f\x1f\x04\x1a\xe8\x8d\x75\x55\x9a\xfd\x8b\x7c\x9f\x8e\x4a\xfc\x52\x3b\x87\xab\x34\xb7\x17\xe8\x29\x00\xeb\x35\x75\x91\x63\x29\x3f\x85\xfe\x94\xaf\x17\x90\x8d\x29\x41\xb0\x7d\xfd\x8c\x12\x06\xe3\x12\xb4\x8d\x98\xeb\x2d\xb0\x55\xfd\xbc\x20\x89\x1a\x66\x09\x15\x98\x00\xd7\x2f\xf2\x78\xea\xde\xc0\xcc\x37\xb3\x51\x66\xe2\xa1\x4b\xe8\xfa\x5c\x3e\xc3\xdf\x01\x12\x6d\x24\x19\x0a\x76\xb6\x06\xe6\x58\x2f\x1b\x69\x8a\xd0\x89\x40\x20\x32\x5b\x17\x96\x10\x48\x20\x54\xbc\xaf\xaa\xf3\xf3\x4b\xfb\x08\x35\x1e\x61\x7a\x61\x44\x29\xb4\x53\xcf\xb9\x75\x42\x7f\x73\x3b\x65\x89\x02\xdc\xff\xef\x64\x3d\x54\x75\x2c\x01\x07\x9b\xc7\x3c\xee\xec\x17\x31\x8b\x53\xd9\x53\xf7\xdc\xce\xce\x18\x7b\xc8\x12\x36\x13\x35\x7a\xc4\x67\x17\x26\x08\x83\x84\xea\x88\x34\xf9\xd1\xed\x76\xaf\x17\x53\x12\xa0\xc1\x3d\x76\xc9\xa2\xeb\x39\x89\x32\xb3\x94\xf1\x20\xe5\xe8\x85\x07\xf1\x39\xcc\x67\xa5\x09\xf7\x2c\xed\x2e\x36\x09\x7f\xcf\x84\x95\x21\x2f\x8c\x28\xa9\x78\x18\x4a\x23\xdf\x2d\xe9\x44\x02\x67\x56\xd8\x72\x60\xd8\xa1\x56\xf9\x86\x85\x1b\x80\x95\xee\xb1\xca\x56\x98\xc4\xb5\x3a\xe6\xd6\x01\x8d\x03\x3c\x63\x71\x1f\xb5\x09\xa5\xf8\xa8\x0f\xae\xdf\x6b\xf5\x26\xf3\x42\xaa\xbc\xb8\xa8\x72\xdb\x84\x6b\xe4\x87\xc8\x9b\x5e\xb5\x20\x9c\x33\x11\x14\xbf\x8e\x13\x22\xbf\x42\x67\xc1\x58\x3b\x84\xd9\x24\x49\x13\x34\x6c\x17\x2b\x33\x4c\x30\x11\x06\x6a\x6f\x9d\x59\xf7\xed\x69\x63\x08\x86\x4d\x19\xc7\xdc\xe2\xff\x79\x3c\xbc\x3b\xe9\x33\x3f\x90\x09\x57\x67\xc4\x1c\x8c\xc7\xb7\x7b\xc4\x80\x7b\x37\x23\xec\xf7\xf0\x13\x8c\x11\x8e\xd8\xdb\x66\x10\x35\x8b\xa0\xd9\x7e\x42\x92\x18\x08\x4d\xab\x55\x0d\x5f\xc9\xac\x31\x9b\x49\xdd\x33\x45\x3a\xfd\x9d\x41\x74\x6a\xfe\xb5\x66\x26\x42\xf0\x28\xb6\x38\xe4\x65\x7e\x3c\x1f\xa7\x4e\xb1\x95\x99\x40\xd4\x9e\x41\x76\xf0\x5b\xf9\x7e\x01\xfa\xb5\x32\xd3\x98\x4f\xaa\xb0\x49\x63\xdb\x20\xf1\xd8\xe0\x3c\x5b\x29\x09\x1a\xc9\x49\xbf\x6c\x7f\x02\xc5\x25\x26\xa4\xd7\xb2\x85\xe7\xaa\xfe\x98\x6c\xe2\x56\x49\x1b\xa1\x6c\xa3\xab\x3d\x63\x22\xe3\x16\x6c\xff\x26\x95\x26\x18\xa4\xbb\xf4\x70\xff\x57\xe0\x28\xa0\x73\x0f\xef\x57\xf9\xf3\x33\x34\xed\x75\x3e\x27\x35\x9b\x3d\x35\x1d\x3b\x28\xd3\xfd\xc3\xed\x2d\x62\x20\xb0\x1c\x3e\x30\x32\x32\xab\xa9\x60\x7a\x1c\x17\xd2\xd9\x73\xd0\x49\x94\xf9\xd7\x74\x08\xe2\x57\x07\x2b\xf5\x64\x01\xff\x6b\x19\x58\x6a\x75\x4a\x1d\x53\x71\xe5\xea\x88\x2e\x80\xfa\xe4\x43\xd1\x19\xc5\x14\xd2\x51\xfe\xea\x5e\xd9\x00\x65\x1b\x97\x51\xad\x56\x2e\xff\xed\xd5\x07\xbb\xad\x72\x1e\xc3\x4e\x0f\x6b\x08\xc7\x64\x1c\xb2\x15\x8e\x0b\xbe\x61\x9c\xa7\xe8\xc8\x3b\x26\x80\xdb\xce\xd5\x1d\xda\x77\xd3\x30\x49\x59\xae\x06\x25\xd4\x55\xa0\xb5\x08\x57\x65\x0c\xa0\x1f\x74\x75\xfb\xb0\xfe\x7d\xf5\xf8\x18\x98\xbe\x2c\xc4\x80\x6d\x7b\x8e\xcf\x57\xe6\x66\x5e\x0b\xb0\x90\x68\x44\x6d\x6f\x3a\xaf\xa5\x94\x17\x4e\xa1\xb5\xdc\x15\x62\xd6\x3f\xd7\x87\x69\xf9\xca\x5a\x4b\xf1\xab\xa8\x4e\x9d\x53\x52\xbd\x1b\xdb\xbf\x5a\x1e\x45\x11\x47\x2f\x3c\x6f\x1c\xf5\x43\x31\x94\xf5\x79\x14\x31\xea\x92\x72\xf9\x73\xf9\xe3\x84\xdc\x0c\xa3\xa7\xc2\xa3\x08\x1c\xb8\xac\x0b\x00\xbb\xe7\x8c\xae\xe0\x72\x9a\x80\x47\x8c\x08\xc4\x46\xf8\x4a\xc0\x4d\x81\x48\xd8\xbf\x29\x33\xcd\x8f\xc1\x04\x42\xd1\x10\x4a\x28\x4f\xcd\x79\xb8\x56\x96\x6a\x70\xce\x34\x7c\x49\xcd\xb7\x7c\x60\x4e\x09\xca\xd1\xc8\xdc\x3c\x56\xd5\xe4\xbd\xf1\x88\x1b\x4e\x2d\x92\x1a\xf8\x00\xa1\x9b\xd2\x74\x27\xea\xb3\xda\x3c\x12\xc4\x25\x01\xdb\x46\xf7\x7f\x02\xc1\x5c\xce\xab\x7d\x58\x36\xb7\x3c\x4a\x52\x8e\x79\xcd\x00\x52\xb8\xdd\xfc\xb1\xb9\x3d\xf0\x70\x88\x44\x72\x6c\xe2\x69\x5e\xaa\x73\x61\xae\x60\x16\x11\xcc\xee\x22\xb1\xda\x41\xb4\x8d\xb9\x86\x51\x25\xee\x93\x7a\xf3\x22\x1a\x9a\x47\x29\xb5\x09\x75\x40\x6f\x28\xd1\x81\xd4\x2f\x9f\x5c\x7d\x16\x71\x57\x8f\x70\xa5\x95\xa1\xa8\xc2\xa3\xcc\x9a\xd0\x92\x80\x2d\xec\x93\x22\x00\x8f\x64\xe4\x3e\xfa\x67\x68\x7f\x3f\x97\xcd\x7d\x60\x99\xe3\x91\xcc\x48\xe4\xc9\x40\xff\xd2\x5f\x12\x91\xf3\x48\x09\xd7\x39\xf2\x04\xed\x53\xee\xa5\x8a\x48\x9c\xfa\x51\xcd\x14\x22\xbf\x82\x61\x09\xce\xc1\x3f\x81\x8a\x0f\xf7\xa8\xb3\x0c\x51\x48\x80\x05\x3c\x90\xc5\xf6\xfa\x22\xb1\x37\x35\xaf\xfd\x66\xc9\x23\x2d\x15\xc2\xc8\xdc\x96\xfc\x0d\xda\x4b\x2a\x0b\x1e\x99\xcc\x49\x69\x8d\x7c\x75\x8f\x86\x04\x83\x01\xc6\x65\x7f\x4b\xf8\xa5\xaf\xdf\x87\xa7\xf4\xe3\xf4\x3c\x26\x09\x0d\xb3\xb4\xc6\x5a\xb9\xa7\x31\xa9\x0d\xd4\xdd\x86\x14\x9a\x98\x03\x9d\xc9\x42\x61\x80\x47\x10\x83\xe9\x4b\xe7\xf7\xf0\xab\x5d\x7f\xe8\xe1\xa3\x03\xb0\x98\x23\xf3\x1c\xcf\x9f\x30\x03\x84\xc9\x16\x62\x32\x02\xf6\xcc\x5e\x26\x89\x62\x2d\x93\x11\xbf\xf0\x5a\xd6\x33\x86\x2d\x4e\x22\xe6\x5a\xd2\xf2\x66\x75\xbb\x1e\x9a\xc7\x83\x39\x23\x11\x53\x18\xad\x6c\xfe\xdc\xac\x7f\x20\xba\xed\xdb\x6a\x77\x78\xf8\x63\xf3\xf4\x7d\xb3\xba\x0e\xb3\x08\x97\x18\xde\x3e\xfe\xb8\xfa\xd6\xff\x4d\x6b\xec\xdf\x09\xe9\xb7\x43\x59\x19\xd9\xca\x03\x8c\xb3\xbd\x9c\xc4\x22\x41\x0b\xe4\x8c\xd8\x13\x76\xa2\xf9\xee\xcf\xf1\xcd\x92\x58\xd1\x4c\xf9\x46\x8d\x55\xe9\xb5\x77\x17\x57\x9e\x67\x03\xe6\x84\x4a\xc6\x50\x38\x59\x0e\xad\x83\xdd\x5f\x13\x64\xba\xd8\x36\xbd\x74\x33\x1c\x4f\x37\x75\x75\x7c\x28\x4c\x4f\xa3\x56\x05\x34\x03\x27\xdd\x93\x46\x26\x4b\xbf\x16\x16\x57\x35\x61\x3c\xc6\xcf\x33\xf0\x40\x3b\xc6\xcd\x8f\x65\xc3\x42\x38\x89\xd1\xb8\xa2\xbb\x1e\x5a\xe4\xa6\x07\xe4\x84\xfb\x8e\x66\xe3\x5b\x82\x2e\x4c\xf0\x12\x49\x01\x27\x3c\x56\x84\x79\xb8\xcb\x8f\x32\xd7\x7b\xd9\xbc\x7e\x97\xcd\xcb\xd6\xcc\xd6\x87\x60\x0a\xb7\xb8\xfd\xd3\xea\x7e\x77\xb3\x79\x3a\x3c\x3e\x3d\xfc\xf9\xd7\xe1\x8f\xcd\xcd\x9f\xe1\xde\x05\x77\x9c\x75\x81\x48\x6c\x6a\x01\x3d\xf0\x26\x0d\x93\x05\xc5\xae\xf7\x9b\xa7\xab\xfe\xf7\xca\x89\x49\x5f\x0f\x29\x13\x4e\x12\x61\x31\xdd\xb8\x2e\xaa\x73\x3b\x2d\xa9\x4d\x2f\x30\x91\x71\x42\x87\xfd\xff\xb1\x86\x63\x3e\xbc\x97\x44\x19\x16\x3b\x5b\xd5\xbd\xb2\xa7\xea\xdc\x79\x8a\xd7\x4f\x17\xad\x5e\x97\xc9\x32\x4e\xd2\x2c\x45\x84\xbc\xcd\xeb\xc6\x35\xe5\xb9\x4f\xe8\x36\x3f\x06\x14\x03\x27\x59\xc4\x53\x47\xb1\xd9\x79\xdf\x8f\xb2\xec\x09\x41\x38\xc9\x32\x88\xe4\xc4\x35\x1e\x60\xad\x9c\x64\x32\x12\x0e\x3c\xfd\x03\x1d\x54\xdf\x4d\x75\xd9\x53\xc5\x49\xa6\x19\xef\x89\xdf\x42\xb7\xeb\xe6\xd7\x49\x96\xe6\x52\xe8\xf6\x5f\x13\xca\xd9\x70\x04\xb0\x41\x65\xf0\x2e\x2f\xc7\x3d\x89\xb3\x89\x8a\x3b\x12\x90\x53\x0d\x48\x99\x3b\xea\xcc\x09\x33\x8c\xe3\xa1\xf4\x35\xd9\x89\x22\xf3\x88\x28\x80\x13\x05\x8e\x08\xfa\x79\x90\xc8\x5f\x7b\x15\xc6\x81\x18\x7b\x7d\x21\x1b\xd9\xfd\x10\x1c\x3b\xb6\xbb\xb2\x7d\xb5\x3b\x15\x79\x8b\xc0\xbc\x19\x9d\xe4\xf4\x77\x9a\x1a\x44\x52\x48\xcf\x75\x34\x4a\x91\x70\xa2\x4d\x1c\x3b\x8e\xbf\x69\x4b\x1a\x27\x46\x70\x34\xb7\xd7\xa0\xce\xcf\x17\xb9\xd7\x89\x85\x31\x36\x42\x78\xe3\xae\x2a\x83\xdf\x7c\xac\xde\x46\x17\x34\x6c\x43\x04\x28\x20\xcf\xa7\xf7\xbd\xee\x47\x7a\xf6\xb3\x67\x0e\x2c\x8e\x9d\xdc\x4e\x69\xaa\xf7\x31\x01\x06\x27\x36\x12\x11\x09\x88\xad\x6e\x4b\xf7\x5b\x7b\x3f\x9e\x24\x82\x06\x94\xdc\x01\x63\x01\xf9\x81\xfe\xe4\xe8\x52\x2c\x28\xa4\x6c\x00\xd7\x6b\xd6\x93\x57\x0e\xff\x37\xbe\xcb\x38\xa2\x91\xf6\xfa\xbf\x87\xc7\xa7\xed\x1f\xab\x3d\xfa\x49\xbf\x85\x61\xc3\x48\x1f\x73\x62\x99\xe7\x38\x6a\x99\xe1\x31\x8d\x29\x26\xcd\x2d\xe8\x97\x3f\xaa\x16\xee\x64\x5e\x0e\x58\x6d\x1e\xd3\x4c\x65\xa1\xec\x0c\x25\x20\xb0\xab\xff\x68\x62\xaa\x5c\x82\xf6\x5a\xe6\x45\xff\x47\xa6\x93\xc8\x1b\xba\xcd\xf1\x54\x54\x1f\x00\x17\xad\xda\x5f\x71\xfc\xf1\x98\xdb\x14\x53\x4e\xba\x2a\x9b\xb6\x3e\xeb\x51\xef\xfe\xf4\x6d\xc4\x82\x90\xc8\xc5\xc7\xbf\xae\xa0\x6d\xa6\x75\x5a\x8e\x54\x88\x30\x2c\xce\xab\xfe\xef\xb1\x0a\x2e\xd4\x35\x58\x79\x2e\x5a\xdf\x79\x7b\x91\x1c\xe2\xb1\x10\x8e\x1a\xe5\xaa\x96\xc8\x31\xb4\x40\x90\x7a\xe1\xd6\xc4\x09\x4f\x9c\x47\x11\xbe\xa1\x56\xe6\x73\x56\x5e\x1e\x27\x42\x20\x77\xf7\xe6\xdb\xb7\xdd\x61\xff\x70\xf8\xbe\xda\xaf\xbf\x1f\xc8\x5a\x06\xbb\x13\x27\x29\xc5\xee\x02\x97\x4e\xbe\x86\xe3\xb9\xae\xe5\x33\x38\x82\xe4\x90\x59\xe0\x71\x92\x69\xdc\xac\xc0\x5a\x40\xa2\x94\x3b\x7c\x1e\xfd\xb0\x62\xa8\x98\xf5\xfd\xdb\x8f\xd5\x38\x17\xc9\xe3\xd4\x52\x08\xac\x01\x3d\xb1\xa5\x1f\xcb\xa8\x45\x20\x2a\xca\x18\xa8\x73\xff\x7e\x33\x2d\x21\x19\x75\x36\x39\x34\x44\x33\x0c\x3b\x78\xc5\xee\xe1\x66\x7f\x58\xaf\x1e\x0f\xdb\xfb\xc3\x66\xff\x7d\xf3\x34\x9a\x80\x99\xb1\x95\x79\x83\xba\xcd\x1d\xe8\x7f\xd7\x56\x83\x08\x0f\x8f\x25\xa5\x0e\x29\x5c\xcb\xb2\xdd\xd7\xd5\xe9\x65\x99\x7a\xa8\x9b\xe9\x84\xd5\xef\x72\x24\xcb\xaa\x47\x6b\x5b\x02\xc5\xd0\x41\x3a\x62\x95\x4f\xbc\xda\x30\xd9\x3a\x69\xc6\x9b\xaa\x86\x67\xc4\x2a\xf9\x76\xb4\x27\x68\xce\x85\x83\x5a\x7c\xd6\x4b\xe9\x0f\xa1\x92\x04\x63\xe4\x55\x5e\x5f\xd7\xd5\xe9\x51\x7e\x5c\xe5\x6d\xf3\x44\x67\x19\x76\x1e\x6b\x2d\x8d\xea\x57\x87\xc3\x0a\xdd\x9c\x0b\x9b\xbb\x8a\xd6\x02\xdf\xdc\x70\x12\xc3\x9c\x24\x15\xc2\xf8\xae\xaa\xf6\xe5\xbe\x6a\xef\xcf\x45\x11\x6e\xda\x18\xd0\xba\x87\x72\xca\xa2\xa8\xfa\x65\x00\x91\x89\x71\xd5\xff\x78\xba\xed\xff\x96\xba\xee\xb7\x1a\xa4\x59\xd5\x6d\xde\xf9\xae\x13\xfb\x02\x99\x93\xdc\x6d\xa0\xbd\x6b\x9e\x2f\xe4\x98\x78\x6c\x25\x43\x4e\xc6\xfd\xc3\x9f\x93\xa5\x65\x95\x63\xc5\xff\xb1\xbb\xbf\xf8\x60\x26\xfb\xe6\x34\xcd\x1e\x82\x13\x1a\x91\x68\x90\x26\x9b\xb9\x54\xcb\xef\x90\x46\xd2\xbd\xc3\x67\x68\x7f\xe6\xcd\xcb\xde\x13\x27\x4d\x27\x11\x29\x11\xeb\xba\x79\x83\xfa\xc3\x48\x27\xf6\xf6\xbf\x53\xa8\xe2\x34\x4e\x2c\x04\x74\x2a\x92\xff\xe2\x66\xba\x2a\x8d\x4f\xe1\x01\x72\xe3\xf8\xc9\x94\xa5\x19\x0b\xd4\x1d\x05\x7e\xba\x97\x85\x72\x4e\xa9\x4d\x30\x56\x33\xd0\x42\xdd\x39\x46\x3f\x71\x9b\x7e\x30\x93\xe2\x15\xa7\x3c\x72\xd4\x9d\xd2\x98\x7d\xfe\x49\x01\xbd\x9b\xa5\x44\x78\xb1\x9d\x33\xec\x3f\xb0\x3f\x72\x78\x0f\xd7\x25\xe2\x0c\x21\xfc\xff\x3e\x43\xfd\x41\x16\x18\x12\x38\x15\xca\xd5\x54\x4f\xb8\xcf\x6d\xf7\x0f\x87\x17\x59\x9b\x29\x28\x9f\xd3\x84\x3b\x35\xc9\xce\x43\x0d\xb0\x93\xd6\x21\xbf\xa6\x16\x8f\x26\xca\xa5\x2b\x7d\x33\x67\x5e\x3e\x0f\x69\x34\x4e\x53\xee\xf8\xf0\xaf\x36\x9b\xa7\x5d\xff\xc7\xc4\xa0\x67\x77\x40\x7b\x13\xba\xe0\x77\xe7\x53\xf7\x1c\xa7\x9f\x4a\xf8\x85\x4a\xd0\xa8\xad\x65\x51\xf4\x8c\x0a\x7f\x17\xd3\x0e\xc6\x9b\x66\x71\xa4\xd5\x08\x64\xf9\x0a\x25\x3a\x04\x4b\x0f\x28\xe3\x4e\x1b\xd5\x15\xd9\xb7\x4d\x73\x06\x33\xe2\xcd\xe0\x34\x53\x16\xf5\x50\x3a\xfb\x1d\x91\x1b\x50\x71\x44\xb2\x30\x28\x05\xf4\x12\xbb\x78\x27\xeb\xaa\xec\x8c\x62\x6f\xc3\xa8\x94\x8c\x47\x9e\x11\x0d\x33\x87\x55\x03\xe6\xe0\x6f\x66\xf1\x8a\x54\x02\xc8\x09\x39\x00\xc1\xaa\xa2\xe8\x7b\xca\xc2\x71\x75\xec\x32\x57\x47\xf9\xeb\x11\xea\x71\x0a\x9c\x53\x2d\x13\xe4\x9d\x7d\x82\xf7\x41\xfb\x9c\x53\xed\x19\xd7\xb4\x2c\xfd\x65\x4e\xb2\x40\x54\x1b\x47\xca\x75\x72\xad\xd2\x23\x02\x46\x4e\x8d\x8e\x03\xb7\xe2\xcf\xaa\x32\x8b\xc9\x0a\x6a\x4c\x96\xf8\xbe\x88\x6b\x78\x9b\x5e\x93\xb1\x1a\x03\xe9\x93\xfc\xd8\xfc\x6a\x6b\x39\x2d\xbe\xfb\x49\xc0\x65\x3c\x86\x34\xb8\x5c\xec\x97\x1d\xf6\x9c\x82\xb0\x58\x8a\xf1\xd0\x85\x6e\xd1\x8e\x31\x73\x9c\x82\x76\xbc\xa5\x0e\x30\x5d\x1c\x87\x54\x0c\xb5\x90\xba\x95\x22\x0b\xfd\xa3\xbc\x93\xcd\x2b\x98\x8d\xac\xcb\x31\xda\xac\x9f\x6a\x31\x82\x70\x0c\xfc\x27\x99\x7f\xbe\x24\x17\x92\xd0\x9c\x45\x3c\xc6\xc6\xba\x2e\x76\xea\xaf\x8d\x45\x82\xa0\xc7\xb9\xdf\xaf\x2f\x3b\xbe\x39\x8b\x52\x99\x7a\xc2\x85\xb5\x6c\x5e\x7a\xb6\x4a\xce\x22\x49\x33\xe1\x94\x0d\xab\x3a\x48\xc6\x8d\x40\x22\x61\xaf\x62\x84\xe8\xb4\x87\x8d\x77\xd6\xed\x1d\x9c\xd9\x59\x82\xa0\xa4\xe1\x47\xcc\x20\xcb\xbe\x8a\x9b\x11\xda\x82\x33\xa2\x29\x82\xf6\xdb\xea\xd0\xf9\xab\x79\x10\x2c\xe6\x8c\x80\x2b\xbb\x37\xe7\xe3\x76\xfd\x80\xa5\x26\x16\xc6\x62\x11\xa5\x71\x80\xa2\x99\xea\xbd\xbc\x06\x5d\xc3\x71\xf4\x18\x3a\x0b\x64\xc3\x9a\xff\xd1\xa0\x42\xf3\xeb\x8c\xca\x85\x33\x6a\x9d\xd8\xee\x44\x79\x67\x5f\x5d\xea\x25\x70\xc6\x28\xc1\x0a\xf6\x53\x67\x01\xbe\xc9\x23\xca\xe2\x6c\xf7\xdf\x96\x83\x19\xc6\x52\x82\xc9\xba\x89\x9e\xcb\x9d\xd7\x73\xe9\xef\x83\xa5\x12\x11\x80\x9e\x20\x62\x65\x9c\xa5\x08\xc4\x50\x61\x96\x34\xd8\x1d\x29\x8b\xe2\xea\x63\x2a\x70\x3b\x3f\xab\x76\x8c\x84\x03\x4e\xd8\x4b\x95\xcd\xbe\x0b\xc6\x53\x86\xf4\xa8\x07\x5c\x7c\x4e\xbd\x68\x5b\xbe\xe5\x2d\x18\xcc\x59\xcf\xdd\x9a\xc1\x16\x32\x9e\x8a\xf0\xe1\x3e\x6e\x5d\xab\x12\x11\x93\xfd\x88\x09\x02\xf8\x7d\xdc\x8d\xb7\x7f\x26\xa4\x89\x06\x89\x3d\xdf\xf9\x30\xf9\x5d\x9a\xc6\x58\xcc\xde\xfc\xba\x92\xad\xc4\x5e\xe5\xa1\x7e\xde\x0d\x4b\x7c\x05\xea\xfc\x31\xd2\x19\xe1\x2c\xa3\x8e\xef\x04\xe1\x84\xc8\x36\x19\x28\xe6\xe6\xef\x5b\xc6\x31\xe2\x44\xcc\x4b\x75\x92\xaf\x7d\xca\x63\xbe\x70\xff\x09\xc8\xa2\x3b\x98\xeb\x56\x08\x54\x91\x0e\x5a\xe8\xb9\x22\x7f\xeb\x27\x49\x8c\xa2\x47\x6c\x7b\x61\x44\x3a\xcd\x90\x67\x68\x1f\x5f\x2a\x28\xf3\x5f\xb3\x09\x2a\x72\xfd\x12\x9f\x89\x30\x4c\x6f\x4d\x45\x22\x4a\x07\xbe\xc6\xf9\xb1\xb4\x46\xe0\xe4\x31\x2f\xf3\xf2\x7c\x1c\xd0\xc0\xc3\x9e\xcd\x94\x65\x4e\xd2\xe3\xa3\x71\xf2\x46\xc7\xbc\x28\x06\x0f\x9c\x69\xee\x36\x01\x84\xab\x56\xfa\xf5\xea\xfc\x81\x89\x51\xcf\x18\x36\x3d\xa1\xe6\x86\xb2\x91\xe2\x7a\xd8\x6c\x16\xd3\x40\x4c\xa7\x89\xa2\x43\x51\xb3\x3f\xa3\xcc\xac\xdf\x0c\x0f\xc7\x8f\x09\xf1\x17\x67\x5a\xbb\x9e\x35\xfc\xc2\x51\x55\xac\x1f\x32\x14\x62\xd6\x0b\x27\x54\x75\x33\xdd\xea\x98\xc9\x94\x62\xc8\xfc\x50\xbf\x62\x8f\xca\x65\x38\xfa\x77\xb5\x90\xe5\x25\x61\x8c\xd3\x41\xfb\xd6\x17\x48\xaf\xa0\x3d\x8c\xb0\xe6\x9c\x19\x2b\xe5\x00\x14\xee\x1b\xcb\x38\xb3\x89\x4a\xed\x50\xd1\x1a\x88\x84\x39\x8f\x78\xac\x7c\x6d\x0e\x61\x6e\xa5\x86\x45\x85\x64\xce\x23\x2b\x93\x38\xa8\x6c\x34\x50\x36\xe7\xe6\x41\x61\xa4\x39\x5b\x7e\x9c\x28\x62\x1c\xc2\xa8\xfa\xf5\x11\x78\x36\x16\x97\x16\x27\xc6\x78\xf2\xd9\x19\x8f\x21\xe7\x31\xcf\xb4\x0a\xcd\xa4\xcd\x38\x7f\xc4\xe3\x54\x4a\x4f\x43\xb8\x6d\xe1\xb8\xaf\xb6\xa5\xc3\x04\xff\xd3\x62\xc2\xf2\x33\xe6\x54\x53\xe6\xf3\x52\x7e\x63\xbd\x83\xb6\xce\x75\xb3\x1c\x0e\x72\x6a\x0d\x33\xc1\x1f\x3b\x20\x56\x31\x0e\xd7\xc8\x23\x82\xb9\xa3\xdd\x59\x05\x2a\x8e\xc9\xe6\x15\xf6\x3c\xce\x23\xc9\xc9\xa0\x8e\xee\xbd\x15\xf4\xa2\x2f\x68\x66\x47\xdb\x1b\xc7\x08\xa4\xdb\x8d\xa1\x69\x27\x99\xef\x30\x2e\x9c\x7c\xc9\x35\xc8\x02\xea\xdd\x80\xd1\x0b\xe3\x86\xa3\xe4\xc2\xa9\x7b\x4b\xa8\x6f\xd3\x0f\x28\x12\x85\xbb\x0a\x3c\x3f\x5f\xa2\xa7\x39\x17\x82\x10\x70\xf0\xf5\x7d\xe5\x14\xa1\xa7\x13\x12\x61\x1d\x73\xc1\x00\x95\x9e\x18\x68\x9e\x24\x91\x0c\xca\xa4\xba\x42\x7f\x8e\x2c\x47\x1b\x3c\x49\x52\x30\xa3\x5e\x45\x67\x8f\x1d\x27\x81\xef\x5b\x1c\x90\x3b\x9c\x27\x99\x72\x2a\x4b\x3e\x63\xef\xf5\x53\x16\xcd\x05\x4f\x24\x0f\x8a\x0c\x3f\x41\x9e\x2e\x98\x7d\xbe\xe8\xdb\xe0\x3c\x51\x0c\xb9\xdc\xb1\x61\x6b\xbe\xcf\xcd\xa6\xea\x04\x9d\x71\x5c\xf6\x53\x35\xa0\x4f\x1e\x71\xca\x25\xe2\xd4\x8e\x88\x8d\xc3\x1d\xd5\xab\x2a\xcd\xce\x34\xa6\xff\x0e\xbf\x4d\x39\xe2\x5f\xe4\xe9\xd4\xcc\x33\xdc\x61\x8a\x71\x20\x43\xb7\x6f\x05\xe1\xbf\x4b\x37\x8f\x67\x11\x68\xff\xf1\xed\xe5\xf3\x12\xf1\x11\xe7\x99\x80\x18\x7a\x39\xbb\x0b\x66\x73\xce\xb3\x54\x21\x58\xd9\x15\xc1\xd6\xf2\x78\x92\xf9\x73\x39\x9f\x94\x11\x2a\xfa\xe4\x36\xf4\x2f\x34\x53\x31\xb2\x60\x3b\x31\xc5\xd5\x64\x15\x84\x39\x32\x96\xa8\xf3\xf5\x37\xbd\x45\x97\xd1\x36\x97\x34\x8d\xcc\x28\xe3\xd4\xf9\xe7\x0e\x8e\xb4\x18\x48\x70\x45\x29\x86\x40\xcf\xf2\xa8\x0a\xa8\x7b\x03\xa0\x2c\x61\x03\x4b\x1d\x40\x73\x9b\x37\xed\xb8\x03\x9d\x73\x1d\x39\xad\x43\x47\xc8\x30\x21\x24\x59\x5c\xf8\x3a\x89\x30\x3e\x73\x3c\x7b\x13\x90\x24\xe7\x5a\x66\x4e\x73\x15\xcf\xb7\xe4\xa3\x70\xc3\x22\xec\xcb\x3b\x60\xbe\xe6\xb6\xd2\xaf\xe7\x53\xf8\xb9\x49\x85\x4a\xbd\xa2\x4f\x79\x06\xfc\x48\x1c\xab\xdc\x24\x27\xce\x8d\x66\x22\x78\x9f\x7e\x23\xda\x9c\x2a\xfd\x82\x26\xf8\x2d\x30\xbc\x70\x6e\xac\xfb\x90\x0a\xb0\x6d\xca\x66\x6f\x16\xa4\xa3\xc2\xc6\x5d\xe7\x47\x33\x05\xc0\x73\x0e\x2a\xc1\xeb\xd4\x48\x50\xfb\xfa\xa9\x44\x68\x28\x24\x7d\xf9\x89\x2e\x73\xd2\x86\x33\xd9\x14\xfb\x05\x3c\xe2\x73\x08\xc4\xb8\x25\x49\xcc\x67\xcb\xa0\x6c\x1f\x2c\xa6\x7c\xfb\xa7\x61\x85\x1d\x1a\xa1\x7c\x59\xfb\x5c\x8f\x8e\x62\x44\x4c\xc3\x78\x8f\x3b\x0a\x83\x20\x59\x90\xf6\x97\xe5\xeb\x35\xb4\x32\x2f\x9a\x31\x2a\x89\x73\x6b\x1d\xbd\x47\x21\x9b\x16\x4f\x7d\x78\x23\xe2\x3b\x6a\x67\xbb\x1b\xf1\x07\x13\x24\x11\x88\x9a\x7e\x5c\x5f\xcf\xb0\x8b\x5c\xc4\xb1\x6b\xd7\x6a\x06\x55\x1c\x0c\xae\xc6\xca\xdd\xd3\x07\x23\xe2\x2e\x10\xf2\x58\xf6\xf3\xf1\xb1\x6a\x90\x18\x7b\xe8\x6d\x99\x21\xbf\xc6\x5f\x90\x88\x05\x68\xd5\x53\x39\xe1\xa7\xd3\xf4\x97\x92\xb1\x68\x68\x98\xf2\xf9\xf0\xfe\xc1\x2c\xda\x4a\x41\x55\x12\xb6\xe5\xc7\xd5\x88\x3b\x73\xfc\xa0\x04\xb5\x14\x4b\x6a\xc1\xca\x37\x8f\x72\x50\x17\xe7\x82\x31\x6b\x44\x7f\x4d\x8e\xc6\x77\x8e\xfa\xe7\xa2\x33\xcc\xf1\xd0\x25\xfc\x75\x16\x57\x30\x90\xb4\x27\xe8\xfa\xa3\xca\x7b\x69\xdb\x70\x52\x4e\x5d\xaf\xab\xdb\xf4\xea\xfe\xcf\xc2\xa5\x6e\x4f\xc4\x7d\x88\xe1\xef\x22\xcd\x70\xb1\xac\xf2\xd7\x81\x46\xa8\xfb\xb3\x23\x43\x7d\x78\x5a\xad\x6f\xb7\xff\xb5\x39\x7c\x5b\xed\xfa\xb1\xcc\x05\xcc\xa7\xba\x6a\x9d\x52\x5e\x28\x4b\x57\xd8\x1f\x3d\x2b\xf6\xfa\x5f\x25\x52\xf8\xda\x7e\xfb\xe7\xfa\xb1\x38\x3f\x0f\x27\x4b\x34\x47\x06\x9e\x2e\x10\xf2\xa9\xc6\xb7\xe9\xc7\x2b\xd2\x08\xa2\x6c\x20\x69\xce\x7f\xc1\x0c\xce\xc7\x45\x6a\x15\x1a\x2a\x9b\x97\x79\xf3\x82\x6d\xa7\xab\xd2\xec\x1c\x6a\x21\xac\x7f\x91\x19\x95\xca\x69\x03\xde\xfe\x97\xfb\xce\x7e\xff\xf9\xb2\xec\x73\x09\x19\x65\xb8\xfd\xcc\xf5\xd2\x26\x7c\x64\xd3\xf5\xa3\xe3\x14\x69\x3c\xac\x17\x8e\xf3\x41\x73\xb8\x0c\x2d\x58\x68\xdb\xe8\x82\xef\xe6\xc1\x98\xb9\xfa\x3b\x17\x3a\xd5\x8e\xa8\xc9\x4b\x6f\x9f\x86\xa5\xa5\x55\x82\x89\x60\x19\x9a\xe8\x46\x23\x12\xcb\x95\xde\x84\xfe\x94\x75\x73\x05\xad\xec\x87\x01\x82\xca\xbf\xbb\xeb\x47\xa8\x9d\x43\x3f\x7d\x9a\x96\x6a\xaa\x02\xc5\x4f\x29\x8b\xad\xae\x6e\xf0\xc1\xce\x3d\x6f\x61\xc1\x19\xdd\xb2\x6a\xe5\x02\x00\x64\xf6\x6f\xb8\xb9\x24\x22\x02\x8b\x2f\x77\x43\x17\xd7\x6f\x61\x88\x67\x91\xeb\xf2\xbb\x05\x14\x76\x66\x37\x37\xd3\x5d\x25\x89\xb8\xeb\x08\xb8\x7a\xcf\x67\xbf\xcd\x98\xf6\x65\xf2\x60\x8a\x12\x12\xb9\x46\xaf\x06\xfa\x2a\x42\x42\x98\x46\x64\xd0\xfe\xe1\xf7\xcd\xfd\x61\x7d\xbb\xda\xde\x1d\x7e\xae\xb6\xfb\xed\xfd\xb7\xc3\xe3\xe6\x69\xfb\x70\xdd\xcf\x94\x89\xf5\x78\xc3\x11\x8d\x22\x4f\x88\x71\x94\x91\x37\xe7\xce\x5d\x5e\x6c\x76\x39\x3b\x58\xfd\xb4\x28\xf0\x79\x69\xa0\x7f\xa6\x09\x65\xae\x71\xad\xc9\xff\x03\x0f\x76\xeb\x3f\x2a\xd2\x0f\x27\x8a\x0c\xed\x03\x4b\x8a\xfa\x3c\xa1\x19\x01\xde\x7f\x31\xdf\x46\xf5\xde\x30\x41\x32\x04\xe3\xe4\xba\x62\x83\xe4\x11\x4f\x98\x01\xe9\x4b\x87\x57\x35\x40\xf7\xfc\xe7\x4a\xfb\x3c\xe1\x84\xa0\xab\x53\xc2\xfb\x27\x72\x2a\xb3\x3b\xe2\xdd\x27\xe1\x16\xfc\x8f\x2b\x68\xd7\x2f\x30\xec\x68\x09\xe7\xc6\x1b\xca\xbe\x49\x6a\x76\x3e\x41\x22\x77\x37\xe8\xbb\x8d\x5b\x1a\xa6\x84\x47\x7f\x57\x7f\xfd\x9b\xe7\x2e\xa4\xa0\x3c\x74\xfc\x39\x48\xee\x5a\x9e\x96\x43\x82\x24\xe1\x2e\x7a\x70\xfd\x83\xdb\x12\x19\xda\xde\xe0\x02\xe4\xcc\x93\x24\x89\x4c\xea\x90\x89\xdb\xf5\xc3\xdf\x75\xe9\x86\x1f\x65\x2c\x0e\x95\xcb\xd1\x0d\x8f\xf6\xd8\x24\x4d\x2c\x06\x25\x3f\xab\xc2\xd6\xf2\x18\x90\x65\x4e\xb9\x34\xcc\x49\x35\xf8\xed\xe5\x6d\xf6\x11\x65\xb1\x08\xb6\x70\xa2\x44\x13\x86\x53\x8e\xdf\xd8\xc0\x77\x3e\xda\x84\xff\xf1\x3f\xe1\x60\x3a\x8d\x86\xe5\xe8\x70\x5b\x6d\x85\xf4\x42\x1f\xb3\xf3\xca\x98\x60\xc7\xda\xb7\x73\x51\xe4\xe3\xf0\x31\x91\x69\xe6\x60\x98\xa7\x29\x01\xf3\x3f\x7d\xdb\xfe\x30\x8a\x01\x76\x83\x1c\x1a\x68\xef\xaa\x1a\xc6\x4e\xd0\x3f\x09\xe0\xa7\x4f\x51\x29\x81\xec\xb4\x8e\xf9\xaa\xb3\xf5\xae\xbb\xcf\x0f\x6b\x11\x05\xc5\xa3\x6d\x0b\xc7\xde\x07\x9a\xd5\x40\x17\xbd\x90\x44\x43\x44\xe3\x31\x60\xae\x0b\xd1\x37\xf3\x3c\xdf\xf4\xee\xb4\x75\x92\xf2\xba\x3a\x9f\x66\x86\xd5\x10\xaa\x03\x04\x08\x1f\xe0\x15\xb4\x8b\xa0\xbf\xc4\x98\x54\xd1\x80\xf7\x6e\x5a\xa8\x7f\x87\x8f\xd9\xea\x01\xce\x03\x98\x6f\x55\x14\xd8\xc5\x9e\x0f\xcb\x0e\x52\xab\x93\x31\xbb\x8d\xc7\x74\x3b\xff\xe9\x93\xdb\x05\x6b\x31\x07\xf6\x0d\xda\xbb\x8f\x5d\x89\x2f\xc5\x0f\x59\x66\x98\x13\x4c\x38\xf6\xfd\x77\x3c\xb1\xdc\x49\xc5\x78\x6a\xd6\xfc\xf9\xa5\x9d\x6e\xb4\x69\x24\x33\x1e\x05\x20\x84\xeb\x50\x7c\x82\x93\xef\xae\x28\xe0\xa6\xaa\xb1\xda\x82\x2a\xf2\x98\xa4\x1a\x49\x1c\xf0\x34\xd2\x9a\x87\x98\x72\xb6\xfb\x4d\x9f\x7a\x1a\xa7\xcc\xfa\x2a\xf2\x6a\x7d\xfb\x54\x15\x90\x90\x98\x66\x51\x16\x13\x9a\x45\x09\x4f\x49\x94\xc5\xd3\x27\x98\xd2\xc4\xc9\xd8\xb9\xab\xbf\x95\x68\xc7\xe5\x62\x74\x9b\x32\x42\xbc\x7e\x4d\x89\x9a\xab\xcd\x6f\xd3\xcd\x25\x4c\x93\x16\xed\xa4\x3a\x7f\xdc\xca\xa3\x0a\xd5\x87\x94\x47\x02\x93\xbb\x4e\xe4\x09\x29\xc2\xb0\xb5\x74\x6b\x1f\x4e\xfd\xfa\x48\xb9\x34\xe8\x28\x1b\x28\xe4\x87\xf7\x93\x57\x23\xd5\x2d\x9e\x0a\xc9\x49\x12\xb4\xf4\x5a\x59\xec\x4e\x55\xd9\x54\xf5\xdf\x68\xea\xf2\x54\x00\x73\x32\x83\x2e\x73\xb9\x2d\xbb\xf5\x17\x0e\x9a\x90\x0c\x2b\x88\xb5\xd4\xb0\xaf\xae\x64\x03\x97\xcd\x55\x3c\x4d\x68\xec\x18\x7a\x2a\xaf\x41\x37\x78\xd2\xb3\x93\x25\x4c\xa3\xe1\x7a\x84\xba\xa9\x4a\xb9\x35\xe0\xc8\x22\xc3\x30\x8f\x70\xf7\x54\xb2\x81\xad\xae\xc6\x59\xbe\x34\xf5\x2d\x15\xa3\x6a\x40\x3c\xc9\x19\xa5\x19\x17\x71\x68\x4a\x7a\x93\xad\xfc\xa4\x76\x91\x4a\xe1\x78\x98\x6a\x40\x76\xd0\xb0\x4b\xfa\x51\x45\x58\x12\x18\x55\xbb\x0d\xd6\x2f\xae\x91\x71\x4f\x75\xa6\x71\x7b\xf9\x00\x59\xd3\x1f\xe5\x28\x0b\x9f\x1a\x9e\x09\x5f\xb0\xbb\x73\xe5\xfd\x66\x73\xcc\x43\xa3\x30\x4f\x4d\x26\x94\x1a\xc5\x25\xb7\xd8\x26\xed\xb9\xc2\x3f\x2e\x9f\xdb\x17\xbc\xba\x3c\x35\x32\x49\x10\x39\x36\xb0\x91\x7d\xb9\x71\xa5\x40\x52\x4c\xc5\xae\xee\x6e\x1f\xde\xa0\xb3\xdf\x5e\x7d\x64\xba\x54\x21\x49\x83\x6c\xea\x4e\xbf\x40\x51\xe4\xe5\xb3\xe3\x7e\x9d\x1d\xce\x1a\x64\x7b\x7a\x1b\x4a\x48\xa9\x4d\x29\x16\x52\x8f\x79\xb9\x1b\xea\x69\xe4\xc7\xee\xba\x9f\x21\x19\x96\xa2\x9a\xf3\xf1\x18\x7a\x29\x3c\x3e\xac\x9f\x62\x9d\xc2\x69\xef\x43\x5f\xa1\xf3\x81\x28\x95\x79\xbd\x2c\x8b\x84\xc2\x3c\xf7\x13\x74\xab\x41\xb7\xa3\x26\x89\x2c\xca\x64\x10\xdf\xeb\x89\x4d\xb1\xec\x34\x3d\x04\x91\x19\x02\x02\x5d\x83\xd7\xae\x85\xd3\x34\x54\x1a\xff\x37\xfc\xc4\xbb\xf9\xdd\x25\x75\x26\xaa\x99\x1f\x52\xbb\x16\x26\xdb\x33\x3b\xf1\x2c\x8e\x53\xcc\x83\xdd\x5e\xad\xfb\x3f\x69\x43\x7a\x45\xe1\x89\x46\x6d\xf3\x92\x9f\xfa\x59\xd6\x25\xd9\x9c\x17\x76\x95\x9b\x4f\xf2\x95\x19\x65\x29\x22\x74\xae\xb6\xbb\xfd\x66\x82\x89\xc9\x28\x33\x81\xf1\x37\x7c\x76\xf7\x3d\x67\x1b\xcf\x18\x91\xc8\x34\x86\x3e\x4d\x7e\x84\x07\x7b\x0f\xef\xeb\xba\xfb\xce\xfa\x29\x5c\x62\xbf\x83\xd7\xa8\x1a\xcb\x62\xf1\x8c\x89\x0c\xc3\x26\x74\x11\x7b\x02\xb1\x8b\xf5\x3c\xbb\x5e\x96\x38\xf6\x8b\x6e\xa5\xbd\xe6\x45\xf1\x35\xc8\x26\x63\x59\x82\x11\x54\x35\xca\x44\x6d\xcb\xdb\x1f\xfb\xdf\x66\xf3\x4c\x84\x14\x28\x06\x90\x17\x64\x20\x41\x9e\x9e\x9d\x47\xda\xf8\xe8\xc3\x4a\x6f\xb9\xc2\x10\x65\xe8\xcf\x98\xd0\xec\x83\x3b\x58\xf3\x60\x0f\xb3\xf7\x2c\xb8\xcb\xc8\xcc\xb7\xfe\x30\x9c\x70\xe4\xb7\x36\x80\x68\xc4\x1e\x14\xbe\xdc\xeb\xc4\xb3\x24\x71\x5a\xb2\x33\x80\x78\x3f\xea\xd4\x41\x6f\xb7\xf7\xeb\xc9\xcb\x4d\x8c\x46\xd8\x6e\x20\x69\xdf\xbf\xd4\xd0\xbc\x0c\xa1\x43\x96\x52\xe5\x0a\x55\x4d\xa0\x10\xf0\x28\x96\x3e\x3c\xcd\x32\x1a\xa5\x4e\xb4\xf3\x63\x1d\x98\x2f\x78\x26\x63\x27\x2e\xa5\x65\x6d\xbc\x37\x86\xe0\xe4\xe9\x85\xc9\x6e\x87\xf2\xf2\x32\x23\xfa\x93\xfe\x20\x82\x63\x47\x69\xb0\x7a\xdb\x12\xa3\x9e\x2f\x37\xa6\x4c\x42\x16\xd4\x8a\xef\xe0\xa8\x46\xb4\x0c\x73\xb0\x7a\x30\x88\x99\x8a\x0c\xca\x26\xf5\x92\xf9\x01\xc2\x89\xe4\x54\xcb\xa9\xee\x4c\xc5\x1a\x43\x9c\x87\x77\xec\x26\xf8\x99\xb7\x2f\xf3\x32\x87\x5f\xbf\x69\xf8\x05\xcd\xb0\x7e\xe9\x77\xbb\xc3\x18\xe8\x9d\xe9\xc4\x7d\x67\x98\xa6\xde\xea\xea\x47\x63\xd6\x50\xb6\xe3\xbd\x2c\xd3\x2a\x56\x88\x0d\x7d\xee\xc2\xb8\x3d\x42\xae\x16\x5a\x48\x32\xad\x0d\x16\xcf\x8f\x95\xc9\xed\xc7\xb8\xac\x13\xcf\x66\x82\x52\x98\x42\xbd\x5a\xdf\x0d\xda\x3b\x3c\x03\xcd\x5d\x9f\x22\xb4\x0f\xe5\xba\x2a\xce\xc7\xf2\xb7\xf1\x9d\xd8\x8c\x5a\x9f\xfa\xb9\x3a\x23\x92\x72\xf1\x3b\x95\x84\xc6\xf8\xa5\xdc\xc2\xb1\x2a\x77\x50\xd8\xeb\xba\x3a\x79\x82\x37\x2e\x09\xa7\x48\xae\xef\xc2\xad\xf1\x9d\x4a\xa2\x32\x0c\x95\xaa\xf2\x6a\x2c\x9b\x34\xb9\x78\x49\x4c\x82\x56\xe0\xd0\x56\xea\xfc\xf1\x19\xab\xc5\xfc\x47\x96\x0c\xa5\x4a\xf4\xef\xc3\x26\x2b\xe3\x2e\xa4\x0d\x77\xa5\x5f\xa1\x7d\x78\xef\xd9\xa6\xa6\x07\x89\x25\x45\x82\xff\x90\x3e\xda\x83\x3c\x3e\x42\x6d\xfb\xd7\x29\x69\xa2\x70\x75\xbc\x7e\x68\x9f\x61\x9f\x80\x83\x24\x4d\x89\x70\x32\x8e\xb5\xcd\x1d\x4f\x90\x1c\x06\x95\x93\x59\xf1\x9e\x06\xea\x2a\x16\x60\xfa\x4c\x85\xa4\xda\xed\x22\x1e\xfb\xed\xcb\x55\x33\xfe\xbd\x7f\x16\x3b\x49\x16\x39\x01\xfc\xee\xfb\x9f\xed\x46\xf2\xff\xa7\xec\xcd\xba\x1b\xd5\xb1\xbf\xe1\xef\xf2\x5c\x9d\x8b\xbe\x40\x80\x06\xde\x3b\xc7\x49\xaa\xd2\x27\x83\x3b\x76\xea\xf4\xb0\x7a\x79\x69\xd8\x4a\xe8\x60\x70\x03\x4e\x2a\xfd\xe9\xdf\xc5\x96\xc4\x64\x92\x3a\xff\x9b\xae\xd3\x41\xc6\x18\x84\xb4\x87\xdf\x90\x52\x96\x51\x1f\x58\x39\xfd\xc5\x31\x88\x4e\xa6\xc2\xcd\xb3\xee\x86\xe5\xcf\x28\xe0\xd3\xb3\x84\x27\x15\x6e\x99\x4a\x87\xa2\x09\x2e\x5f\x9b\x11\xf5\x7d\x36\x67\x78\xec\xf0\x76\x88\xde\xb9\xae\x6a\xe4\xdf\x82\xff\x27\x9c\x8f\xa7\x09\x9a\xfa\xec\x1e\x76\xab\xdb\xfd\xea\xe6\xf1\xf2\xf1\x61\xb3\xb9\xba\xdc\x63\xf5\x67\xdb\x0f\x53\x59\x46\x46\x46\xee\x9e\x6a\xf0\x5d\x36\x2f\x7d\x62\x23\x85\xb0\x0e\xf8\x1c\xdc\xf9\x83\x05\xcb\xbc\x7c\x27\x85\x11\x58\xe1\xda\xe4\x9b\x7c\x94\xc5\x4a\x19\x53\x0c\x64\x7f\xdc\xac\x27\x7f\x4e\xe2\xb4\xc7\xb5\xee\xbb\x48\x65\x2e\xfb\x1c\x16\x13\x29\x19\x64\xa2\xc7\xe4\x8d\x65\x26\xce\x1f\x98\xe4\x0e\x96\xf5\x60\xed\x1d\x94\xa7\xbb\xaa\x6e\xa0\x18\xaf\x9b\x52\x8a\x04\xab\x13\xaa\x7b\x06\xd5\x71\x64\xf9\x43\xa5\x22\x5c\xf9\x78\xd8\x29\x3a\xf7\xd4\x66\x2a\x15\x4b\xf0\xdd\x70\x2e\x36\xd7\x00\xcd\x4d\x79\x71\x9c\x4f\x0a\x25\x00\x09\x35\xdd\x4f\x6d\x4c\x75\x38\x53\x60\xa7\x52\xe9\x88\x25\x83\xcc\x81\x34\x60\xbc\x7c\x74\x18\x00\x71\x24\xc7\x00\x88\x73\x9f\x03\x2a\xb5\x4e\x11\xc8\xef\x99\x68\xab\x03\x94\xa6\xcb\x71\xee\x64\x69\xce\xca\x63\xd2\x24\x54\x85\xea\xca\x5a\x16\xc5\xb4\xe3\x24\x0d\x75\xb6\x92\x9b\xc7\x2b\xf4\x73\xbf\x7c\x7a\x44\xa9\xf4\xfe\x38\x44\xd4\x4f\x95\xa7\x36\x2f\xf2\xff\xe1\xc2\xfa\xf8\x99\xcd\x11\x95\x90\x72\xc4\x7e\xac\x65\x6d\x02\xd3\x2a\x1c\xb2\x96\x91\x11\x10\xa5\x4b\xb5\x71\xf3\xf0\x71\x61\x38\x85\x4d\x15\x96\xd0\xfe\xfa\xd7\xc9\xe3\xb3\xdc\x39\x38\xe4\x65\x00\x0c\x9d\x63\x98\x55\x64\x1d\x92\xa3\x01\x59\x74\x6b\xe4\xcc\x1b\x9a\x2a\xc2\x25\x6e\xfa\x03\xd4\x6a\x7f\xac\xf3\x37\xd9\xc2\xbe\x91\x05\xec\xf1\x71\x7c\xb9\x56\xa2\xe0\x9a\xd7\x58\xf8\x03\xe0\x35\x71\xf2\x8b\xfe\x60\x4c\x78\x90\x06\x58\x5f\xac\x9c\x7c\xc9\x1d\x34\x8d\x7c\x06\xdf\x9f\x9c\x4c\x1b\x15\xb3\x04\x41\xd7\xbd\x54\x38\x20\x8e\x76\x9c\x8a\xa9\xc4\x6b\xb6\x7e\xdb\x5d\x8c\xef\x88\x4a\xa8\xa5\x83\x03\xa0\x2b\x3c\xf4\x17\x92\x58\xc0\x16\xe9\x3f\xc2\x1f\xd2\x98\xa1\x9c\x9e\x9b\xf9\x49\xd4\x7c\x1c\x54\x10\x83\xa6\x8a\x46\x31\xa5\xc1\x09\xad\x7a\x1d\xf9\x4e\x2e\xdf\x04\x4a\x52\xac\x9b\xef\x9e\xee\x6e\x70\x75\xf9\x75\xf7\x57\x51\x41\xa4\xaf\xf2\x6c\xaa\xb6\x8b\x9a\x65\xb1\xa9\x2b\x3b\x2a\xaa\x4e\xc7\xcb\xd4\xfd\x6e\x68\xc7\x58\x1c\xc5\x52\x82\x92\x77\xdf\xbf\x3f\x62\xc6\x37\x1c\x60\x11\xb6\x69\x11\xbd\xeb\xf2\xc5\x5d\x75\x13\x5e\xa6\xe5\xfd\x52\x31\xad\x71\xc6\xde\xad\xfe\xbe\xbf\xbb\xb9\xfc\xf6\xb8\xba\x0c\xa4\x1b\xc5\x63\x6e\x93\xc1\x09\x6c\xfa\x6e\x29\x9e\x3a\xd3\xf6\xed\x76\xf3\x54\x06\xa8\xea\x8c\xaf\x4e\x15\x37\xde\x90\x0a\x5a\x27\xe0\x37\xf3\xb0\x1a\x81\xf4\x14\xb7\x06\x23\x83\xdd\x0b\x7c\xeb\x56\xbb\x3f\xf2\xe6\xe5\xc1\xae\x5f\xf2\x32\x34\x36\x94\xf0\x7d\x0f\x5b\x54\x55\x7d\x5b\x3d\xcf\x62\x17\x25\x74\x84\x6f\xcf\x51\xd6\x1a\x8a\x6f\xff\xc3\x10\x0c\xa7\xe8\x83\xb5\x23\x26\x9c\x12\x56\x62\x70\x8c\xf7\xe9\xff\xa0\x06\x3b\xbb\x7d\x99\x96\xa1\x3c\x36\xf4\x57\x7a\xf0\xbf\x92\x40\x9c\xe0\x94\xac\x57\x5a\xcf\x8b\x1d\x4a\x02\x4d\xb2\xd9\x56\x04\x1b\x59\xb7\xb9\xce\x8f\xbd\xa5\x3e\x55\x0a\x00\xeb\x08\xf5\x01\xc5\xe2\x66\xb7\x58\xd9\x0c\x95\x69\x77\x1e\x83\x75\x66\x3e\x44\x95\x36\x4e\xaa\xfd\x22\x6f\x7f\xe4\x06\xaa\xd1\x8e\xa4\x4c\xe2\xb8\x75\x79\xd9\xde\xc1\xa1\xaa\x3f\x9c\x9c\xd2\xe4\xf3\x86\xdb\x20\x34\xe4\x2d\x12\xdc\x15\x9c\x37\x3a\x95\x91\x14\x4d\x9c\xb6\x9b\xab\xf5\xcd\xea\xf6\x66\xbb\xdb\x6f\x77\xab\xdf\xaf\xf6\xbb\xef\x8f\x57\xfd\xd4\x32\x46\x29\x27\x1e\x2b\xcb\xd7\x66\x55\x14\x5e\xa7\x6a\x5c\x54\x55\xc6\x82\xf1\x69\xe6\xca\xd4\x4b\xbe\x37\x54\x01\x73\xcd\x69\x74\x8b\x6a\x06\xb2\x90\x02\xc5\xc0\x21\xc3\x5b\xfd\xb2\x7a\x96\x79\xd9\xe0\xbb\x1d\x9e\xd0\xd7\x11\x90\xb2\x54\xa3\xba\x51\x17\x01\xfb\x98\xf0\xa2\x92\xb5\x79\x6a\xf2\xf2\xf9\x72\x96\x81\x85\xef\xb4\xc6\xc9\x84\x48\xe3\x81\x37\xc3\x6d\x5a\x8c\x85\x75\x24\x38\x19\x14\x45\x7d\x8a\x3c\x1d\x42\xe2\x24\x75\xd6\x39\x0b\x25\x99\x85\x1a\xbc\x26\x31\xc5\x6a\xc1\x6d\xf5\x7c\x57\x95\xf0\xb1\xab\x66\x0d\x89\xa5\xca\xa3\x26\xd4\x89\xcc\x3f\xfc\x6f\xec\x39\x42\x35\x61\x32\x98\x9c\xcc\x2c\xc6\xa8\x26\x3a\xb3\x3a\x68\xe7\x7c\x38\xb9\xcc\x51\x5d\x55\x27\xd4\x62\xed\x67\xaa\x53\x33\x41\xd3\xe8\x44\x44\x14\xa3\x02\x59\xbe\x0e\xc8\x01\x7f\x30\x25\x04\x0b\xe3\x7b\x38\xe4\x6d\xcf\x63\xf2\xf2\xf1\x93\xe7\xa5\x53\x92\x06\x74\xbb\x83\xcb\xfb\x14\x6d\x76\xc3\x53\xc6\x48\x00\x61\x05\x37\x40\x30\xe3\x7c\xc2\x0f\xa4\x09\xb1\x49\x2f\x60\x75\x99\x37\xb8\x6a\x8d\xf3\x11\x4d\xb3\x28\x75\x0e\x6b\x85\x2c\x9f\xdb\xf1\x5d\xa3\x4a\x48\x7f\x67\xf6\xcf\xa3\xf4\x34\x1c\x36\x80\x3c\xb7\xee\xdb\x07\x13\xb0\xd9\x2f\x62\x34\xc5\x99\xbd\xab\xe5\xdb\x34\x96\xd3\x4c\x0a\x9e\x06\x02\x26\x46\xa6\xdb\x3c\x04\x6c\x9a\xcb\x28\x73\x68\x4a\x14\x94\x1f\xa0\x7e\xe3\xe7\x9f\x46\xe3\x7f\xe6\xaf\xc3\xb2\x7f\x1e\xd5\x42\x11\x9c\xdf\xa7\xd2\x4e\x78\xee\xe1\x30\x10\x9c\xcd\x6f\x39\xbc\xa7\x01\x2e\xae\x33\xe2\x68\x2c\x58\x94\x9e\x16\x48\x75\x26\x09\x2a\xe3\x1c\xe4\x4f\xb7\x15\x8e\x74\xf4\xfb\x21\x34\x68\xe9\x3a\x96\x6a\x3f\x75\x64\x4c\x61\x70\xe2\xbc\x1f\x57\x01\x26\x53\x5b\x25\xc6\x8c\xf1\xf2\xa3\xf2\xab\x56\x89\x13\x6e\x7c\xc9\x9f\x5f\xa0\x69\x2f\x72\x33\x79\xc4\x2a\xa5\x08\x22\xed\x9e\xe1\xb7\xdc\xb6\xdd\xf2\x84\xcb\xec\xb8\xf9\xa6\x55\x96\x21\x02\xf1\x16\xc5\x25\xfb\xbf\x5a\x11\xb4\x69\xf0\xad\xb9\xf8\xc0\xf4\x67\xc1\x42\x9a\x6a\x4d\x12\xdd\xd3\x6f\xf2\xff\xf5\xdf\xaf\x69\x84\xd2\x60\xe0\x04\x39\x6f\x7a\xa2\x81\xd6\xc6\xe1\x9e\x1f\x54\xf5\x3a\x5b\x86\xb4\x49\x05\x16\xaf\x8f\x61\x27\x59\x68\xd8\x2f\xb2\x82\xb5\x51\x9c\xa4\x23\xbe\x67\x51\xd5\xf8\x9a\x84\x33\x43\x64\xb4\x63\x06\x1b\xd7\x78\x98\x45\x49\xa3\x97\x1f\x58\x46\xbc\x89\xdd\x9f\x6e\xb9\x4d\x6f\x0a\x08\xb7\xb4\xbf\x87\x17\x75\x75\x3c\x16\xa1\x41\x39\x9d\x98\x36\xca\x9c\x4e\xfe\xa9\x2f\x03\x87\x4b\xb6\x22\x65\xbe\x2c\xb1\xfd\xef\xfc\xbe\x5b\x69\x9c\xd4\x00\xe2\x03\x36\x8f\x37\xeb\xab\xfd\x7d\xff\x49\xad\x53\xbf\xf4\xfd\x0e\x28\xbf\xb8\xc8\x54\x32\x11\xcb\xa8\x77\x08\x5e\x4e\x0b\x0c\x51\x0c\x61\x39\x5d\x9e\x81\xea\x2f\x49\x14\x45\xfb\xab\xdd\x77\xff\x55\x26\xe6\xce\x1c\xd0\x56\x75\x17\xc6\xee\x0f\xd0\xbe\x54\x66\xba\x82\x4d\x1f\x9d\xff\x60\x12\x39\x85\x0b\x2f\x45\x30\x91\xc9\xa6\x26\x89\x33\xaf\x8c\xab\x21\x7f\x83\x60\x56\xd3\x1f\x56\x02\xf7\xd7\xe6\x74\x9c\x83\xf1\x4c\xa2\x1d\x15\xb7\xdb\x7b\xcb\xfc\x30\x53\x12\xa5\x26\xd5\x0e\x3a\x14\xfc\xd4\xf3\xb7\xbc\x80\xe7\x33\xdd\xae\xc9\xf4\x32\x94\xa4\x99\x2f\xe8\x8f\x53\xef\xe9\x45\xd3\xc4\xd9\x2b\x96\xa7\x03\x22\xf5\xfb\x4b\xa2\x42\xa6\x1e\xca\xef\x76\xd7\x87\x1e\x6c\x6e\x58\xc4\x11\xc2\x5a\xfb\x8a\xe4\x35\xc0\xbe\x3f\x96\x28\xcc\x4d\x2f\xea\xea\x15\xea\x7b\x78\xad\x26\x2e\x09\x38\xc0\x09\x71\x82\xae\x0e\x87\x99\xaf\x33\x35\x4c\x67\x78\x9b\x36\x3f\x36\xfb\x8b\xd5\x6e\xd7\xb3\xd2\x0d\x17\x26\x12\xa3\xc6\xed\x80\x09\xe8\x2f\x9a\x5b\x37\xc3\x1a\x70\xc5\xcc\xee\xe7\x2e\x81\x3d\x8d\x90\x31\xee\x75\x2d\x96\x54\x46\x6b\x94\x11\x92\xe1\xe4\xc0\x6e\xc4\x12\x6f\xc1\x64\x92\xe8\xf1\x0a\x17\x98\x03\x5f\x16\x45\x4d\xa6\x0c\x19\x25\x3d\x07\x59\xf7\xb5\x19\x23\xb9\xd3\x27\x70\x34\xaf\x06\x6d\xe1\xe1\x12\xee\xa0\x91\xbe\x9b\xff\x8b\x66\x7c\x38\x8f\x05\xcc\x48\xef\x30\x1e\x2f\xaa\x11\xfa\xcc\x28\x1e\xa3\xf9\x7c\x97\x9c\xdf\x56\x6f\x70\x0b\xed\x00\x65\x33\x9a\x30\xed\x51\x77\x43\xed\xfa\x5f\x24\x1e\x20\xc8\xa9\xaf\xa4\x76\x81\x7a\x50\x15\x48\xff\x1d\x3e\x9e\x18\xe3\xdd\x4e\xee\xe6\xa5\x08\xa3\x95\x9b\x62\x46\xb6\x72\x8b\x76\x60\xdf\xc0\xf9\xbb\x3d\xd8\x6d\xfe\xb3\x05\x98\x7f\xc2\x68\x81\x7d\xbe\xb7\xaa\x0d\x62\x79\x67\xd1\x9c\x31\xda\xa2\x5b\xdf\x09\xdb\x78\x4f\x25\x5e\x7a\xf7\xd0\xd6\x98\x9a\x4e\x07\x43\xec\x6c\x71\xda\x1e\x56\x37\x91\xe1\x9d\x7e\xbd\x4d\x9c\xa5\x56\x18\xbc\x29\x4e\xcd\x19\x5c\xc7\xd8\x2c\xc6\x85\xa8\x46\x6d\xba\x51\xb6\x63\x2c\xb8\x4c\xae\xf6\x7d\xad\x20\x87\xea\x8f\x43\x44\x2d\xe2\x20\xe5\x54\x6a\x90\x42\x94\x01\x4d\xc3\x1c\x09\x9d\xfd\xfe\x1b\x21\x82\x24\x76\x96\xe7\x95\x71\xba\x7d\xfd\x81\x14\x8d\x94\xfc\x82\xf6\x85\x27\x22\x85\x38\x71\x51\xc5\xdf\xd7\x0f\xf7\xe3\x30\x07\x62\xe6\x14\xa2\xbc\x08\xad\xcc\xcb\x16\x4a\xe4\x91\x54\x66\x1c\x68\x42\x9c\x39\x2e\xd5\xfe\xf0\x81\x2c\xff\x09\x5d\x01\x12\x4a\xc3\x2b\x78\x87\x71\x46\x5b\x79\xbd\xa1\x00\xb5\x82\x84\x27\x10\xa4\x57\x07\xdf\xff\x8b\x8f\x9b\x69\x2d\x02\x12\x41\xa4\x67\x3f\xee\x0f\x79\x79\x9d\x97\x25\x7c\x6c\xa0\xfe\x0e\xe6\x19\xe6\x52\xe0\xe1\x33\x19\x8f\xe8\xb8\xf7\xb0\x88\xc5\x80\xa4\xcb\x5d\xbb\x38\xff\xfb\xc3\x26\x5c\x79\x4a\x52\xec\x00\xa3\x1d\xd1\x16\x3e\xc1\x9e\x0d\x5f\x95\xf2\xcc\x3a\x4f\x8f\xf6\x32\x7f\xeb\xcf\xa2\x9d\x94\x5e\xdd\x82\x3c\xfc\xc0\x6e\xff\x40\x87\x85\xd4\x38\xe3\x76\x69\xcc\xee\xe7\x4d\x79\x71\x42\x8c\xd0\x9f\x64\xbb\x84\x73\x58\x83\xfa\x14\xdd\x26\x7d\xd3\x0e\x1e\x6b\x8b\x20\x5e\xa0\x46\xe2\x7a\x7c\xb5\xfb\xee\xb5\xcf\xc3\x01\x6b\x50\x34\xb6\xac\x4a\x6c\x08\xe2\x6a\xb9\x7d\xa9\xea\x76\x90\x77\x5c\xca\xce\xf9\xbf\xa7\x51\xeb\xbf\x62\xbf\x0a\x00\x07\x92\x46\x13\xd9\x10\x33\x44\x98\x97\xa0\xbb\x8d\x6d\xf6\x62\xe2\x67\xd0\x47\x12\x8e\x27\xc7\x83\x70\x65\x66\xf3\x49\x49\xe8\x2b\xde\x06\x88\x98\x60\x5b\xbd\x80\x37\x28\xf6\x74\x7f\x9c\xa8\xa3\x81\x50\xce\x3b\x04\xeb\xda\x7d\xa4\xde\xfc\x76\xd6\x29\x9e\x9d\x36\x4b\x32\xcc\xc7\xb7\xc7\xaa\x7a\x6d\x5a\xa8\x47\x09\x3d\x64\x8c\x6a\x27\xf2\x5e\xaf\xab\x52\xcb\xb9\xe7\xda\x42\x0c\x03\x32\xe1\xb8\x74\x74\xa1\xfb\xa6\x97\x5a\x00\x69\x64\x70\xeb\x08\x84\xcb\x19\xbc\x05\x54\xaa\x62\x27\x7d\x3d\xd8\xd1\xb8\x01\x71\x14\x4e\xa3\x78\x68\x29\xba\x4a\xff\xca\x98\x87\x4f\xc4\x95\x40\x69\x92\xf6\x49\x63\xf3\xf2\x35\x49\x66\xb4\x06\x28\x20\x98\x48\x1e\xaa\xb7\x91\x1e\xf1\xc5\xc7\x43\x09\x77\x55\xd9\xbe\xcc\xde\x4a\x1d\x3b\x7b\xd4\xa1\x12\x6a\xc6\x20\x7d\xd0\x9c\xa1\x62\x40\xb7\x4e\x6e\xdb\x1a\x26\x0c\x27\xd0\x19\xa0\x65\xd3\xd5\xa9\xbb\x2b\xcd\x10\x53\x81\x36\x51\xec\x74\x16\x5d\x4f\xdb\xbf\xf2\xd3\xdf\x68\x98\x00\x77\xcf\x10\x7c\xd3\x25\xd6\xe3\xb4\x03\x0c\x64\xd1\x70\xdb\x51\x65\x13\xfb\xf8\xc3\xc0\x29\x2c\x68\xf6\x3a\x42\x9a\x85\x76\xd6\x53\xe1\x3c\xaa\xbd\xbf\xea\x84\xc6\x0c\x90\x11\x2c\x6f\xbb\x92\x4e\xbf\x7c\x7d\x19\x35\x80\xed\xa6\x34\xa6\x73\x20\xeb\xbd\x6b\xd3\xf9\xeb\xb6\x51\xa4\x3c\x59\xb6\xbd\x87\xf7\x9d\x2c\xa0\x6c\x9b\x55\x69\x82\x80\xd0\x4b\x3e\x6f\x1c\xd8\x28\x71\x34\x07\xac\x9e\xc1\xe9\x10\x80\x5d\x5f\xf2\x46\x6d\x94\xb9\xf7\x5a\xbf\x74\xd1\x92\x92\xfa\x15\x1b\x0f\xcb\x53\xca\x46\xc6\x35\xac\x9f\xa1\xdd\xeb\xb3\xc6\x84\x25\xc4\x22\x22\xa2\x45\x05\x44\x0f\xd9\xdb\xf4\xe9\x94\x8d\x13\x67\x59\xd3\x9b\xe7\x21\x2e\x61\xb2\x81\xda\x58\x00\xf7\x9a\x76\xbb\x0a\xd1\xe8\x0b\xd2\x18\x36\x89\x55\x34\x92\xb1\xba\xab\x4c\x6e\xf3\x7e\xa3\xea\x0e\x33\xd3\x4b\x1e\xe4\x35\x42\xea\x86\x56\x8c\x4d\x62\xf7\x25\xdd\xc7\xc7\xfa\x40\x36\xa5\x69\x9a\x85\x9b\x38\x98\x82\x53\x9b\xf2\xd8\x7a\x6c\x79\x7b\xff\x7d\x7c\x40\x13\xe7\x46\x2b\x3f\xfa\x82\xd8\xf4\xa6\xd1\x84\x59\x1e\x88\xcf\x03\xf9\xc8\xb2\x24\x43\x73\xa9\xe0\x04\x30\x58\xf0\x52\xcb\x38\xa8\xa0\x10\x52\x15\x50\x63\x10\xba\x24\x37\x4e\x2d\x03\x48\x49\x98\xe2\xa3\x19\x3d\xfa\x47\xcc\x3e\xc2\x6d\x9c\x66\x3d\x77\xd6\x53\x74\x43\x9e\x67\x45\xcc\x42\xa1\xd9\x93\x87\x46\xf6\xe7\xd3\x13\x09\xca\x50\xbe\xfd\x28\x3f\xb6\x07\x59\xf7\xcc\x95\xb9\xc2\xc2\x39\x4c\xca\x0a\x4b\xf0\xcd\x7d\x94\xff\xd9\x41\xd3\x8e\xca\x6a\x7e\x40\x16\xf1\x58\x05\x42\x4c\x51\xd5\x0f\x35\x22\x39\xc2\x51\xe1\xac\x93\x8f\xdd\x4f\xde\xf5\xf7\x34\xcb\x0c\xbe\x88\xd8\x6d\xbc\x96\xf9\xa0\x43\x68\x65\x1a\xa5\x3e\x48\xff\xe1\x0c\x82\x5c\x15\x64\x12\xe2\x58\x49\x13\xd4\x32\x3a\xe6\x41\xb8\x64\x96\x22\x58\x15\x39\x64\x42\x17\x85\xf8\x56\x66\x5f\x9c\xdc\x55\x6b\x79\x3c\x82\xf9\xb4\xa8\x6b\x15\x38\xc6\x6c\x73\x94\xef\xe5\xfa\x25\x2f\xa6\x71\x91\x55\x56\xe9\xa1\x75\x37\x92\x34\xb0\x3a\x23\x5e\xc9\x1d\x9f\x73\x77\xfd\x85\x9c\x15\xdb\xac\xd6\x6e\xde\x4c\x48\xe9\xcd\x14\xc8\x65\x4d\xec\x2a\x7c\x7b\x6c\x47\xe4\x47\x24\x96\x4e\x7f\xa4\x49\x18\x73\x94\x82\xdd\xa9\x46\x19\xf1\xad\x7c\x1b\xee\xa5\x49\xa3\x10\xea\x60\xa9\x71\x7d\x2e\xc5\x3f\xaf\x8b\x4c\x0b\x60\xd6\x08\x86\xd8\x94\xef\xf2\x7f\xff\x93\xe3\x58\xd5\x9a\x0c\x90\x61\x83\x8f\xb0\x07\x5d\x91\xfe\x30\x58\xe6\x83\xc0\xb5\x2c\x0d\x36\xf0\x3e\x53\x13\xf3\x1f\x01\x2a\x10\xd3\xfa\x50\x3f\xcb\xf2\xfa\x54\xea\x73\x60\x76\x3f\x52\x62\x17\xcd\x40\x91\xbf\x41\xfd\x31\x4a\x1e\xbb\x63\xa8\xb7\x71\x6a\x60\x04\xee\x9d\xbd\x59\xc0\x00\x41\x13\xc1\x45\xb9\x9f\x57\xa0\x34\x26\xa5\x17\xa7\xe7\xbc\xb9\x1f\x96\x3b\x4b\x33\xac\x8e\x8f\x38\xb7\xcd\x75\x55\xaf\xeb\x8f\x63\xdb\xef\x85\xd6\x0a\xc5\xfd\xdc\xdd\x7f\x47\x46\x65\xe3\x1b\x5e\xcb\xeb\xb4\x15\xd6\xb8\x24\xde\x29\x49\x2c\xa5\x98\xd3\x45\x81\x45\x24\x4e\x50\x90\xc0\xe6\x65\x98\xbf\x17\x1f\x57\xa5\x39\x56\x79\x39\x31\x16\x61\x11\xd1\x26\x04\xf9\xf7\xa7\xc3\x36\x37\xa1\x82\xc7\xa2\x98\x38\x63\x10\xef\x9b\xeb\x41\x13\x60\xba\x79\x76\x63\xc2\xa8\x24\x4a\xf0\x36\xf5\x69\xf6\x07\xda\x44\x2f\xdd\x53\x16\x25\x31\x71\x72\x12\x4e\xda\x60\xf5\x0c\x65\xbb\x9d\xf5\x6e\x58\x94\x0a\x8a\x5d\x0a\x8b\x5b\x8a\x3f\x6f\x79\xe1\xb6\xfb\xfe\xf2\x28\x71\x82\xd2\x68\x13\x8d\x9a\x9b\xdf\xf3\xa6\xad\xea\x0f\xc4\x1f\x8e\xa7\x0d\x8b\x68\x4a\xd2\xee\x5d\x5a\x6d\x6f\xae\xfe\xde\x9f\x80\x4a\x0c\x09\x2f\x41\x17\x23\xe1\x80\x70\x94\x2b\x8c\x75\xda\xfc\x00\x0f\x6f\xe1\xe9\xb3\x88\x11\xc7\xf9\xc1\xe8\x74\x6a\x8e\xc1\x22\xa6\x35\xa2\x2d\x9a\x63\x5e\xce\x14\xb0\x59\xc4\x75\x8c\x09\x81\xd3\x5b\x6a\x36\xb2\xe9\x09\x73\x2c\xe2\x60\xa9\x97\x7b\xbc\x59\x3f\x8c\xa4\xc0\x7b\x9c\x48\x18\x29\x22\xe9\x14\xa7\x4e\xaa\x5b\x0c\x64\x3d\xf8\x4a\xcd\xee\xb6\x88\x9d\x40\x81\xd7\x24\xb9\x84\x63\x0d\x7a\x02\x83\x3a\x57\x05\x61\x91\x10\x14\x5b\x98\xfb\xde\x9b\x66\x82\x2b\x67\x5d\x98\x91\x8d\xc1\x66\xd7\x75\x75\x98\x87\x26\x67\xbb\x04\x8b\xb2\xc4\x79\x1f\x37\xd0\x3a\x3e\xe0\x57\xc6\x5a\x2c\x92\x8c\x62\x42\xf4\x9c\xbf\xc1\x4c\x14\x7d\xf9\xd7\x4a\xe5\xac\xee\xbd\x90\x92\x53\xb8\x9c\xe8\xbf\xcc\xbf\xc1\x50\x7c\xc2\x25\xbc\xe3\x05\xe5\xff\x83\xa0\x07\x77\xee\x24\xce\x22\x95\xca\x74\xcc\x50\xc5\x06\x2a\x34\x2e\x32\xea\x51\xf5\xb3\x89\xa7\x89\xe4\x72\xaa\x3e\xdc\xcf\x07\x9d\x28\x04\xac\x23\xd8\x72\x7f\x5b\xe9\x57\x97\x53\xb9\xaa\xd9\x67\x1d\x61\x16\x19\xc6\x31\x17\x7b\x85\x8f\xee\xd6\x9f\x37\x00\x59\x04\x71\x94\x66\x63\xb6\x43\x33\x1b\x60\x79\x3a\x32\xa2\x46\xec\xfd\xa7\x89\x10\x8b\xac\x06\xec\xec\x1f\xf2\x02\x9a\xb6\x2a\x21\x88\xf1\x4d\x4e\x4a\x22\xe9\x24\xbe\xbc\x69\xdf\x48\x53\xf2\xba\xaa\x17\x2e\x93\x90\x88\x22\x53\xa2\x5f\x3b\xaa\x76\x59\x6c\x9b\x11\xc2\x12\x7c\x79\xa0\xd6\x71\xf4\xe3\xdb\x7a\x84\xb2\xeb\x0e\x3a\x63\xc8\x26\xaf\x21\xc8\x18\x55\x61\x7a\xcd\xce\x23\x29\x42\xaa\xb5\x2c\xb4\x47\xda\x2c\xce\x0e\x42\xc0\x9a\x81\x68\xb6\xbb\x38\x93\x62\x61\x84\x58\x37\xa3\x1f\xb7\x1e\x6e\xcc\x48\xac\x84\x18\x6c\x13\x2e\xf3\x32\x0f\x0a\x40\xd3\x8f\x26\x29\x24\x49\xef\x71\xff\x26\x5b\x34\x33\x9c\xf8\xc5\x30\x92\x12\x57\x21\xdf\x42\x6b\xf2\xb7\xeb\xaa\xde\xc9\xf2\x75\x76\xa2\x94\x38\x60\xe8\xcd\xeb\xa9\x96\x7f\x2a\x5b\x61\x24\x4d\x64\xe2\x0b\x36\x1e\x87\xb2\x3d\xca\x72\x5c\xfc\x61\x24\x65\x02\x71\x68\xcd\x4b\xf5\xee\xb4\xea\xe6\x77\x32\x15\x3c\x1d\xa6\x90\xe3\xc8\x2f\x2f\x44\x84\x32\x40\x19\xae\xca\x98\xf9\x59\x58\x4a\x95\xed\x25\x57\xc3\x2f\x67\x5a\x62\x49\xe9\x78\x6a\x5e\x26\x46\x57\x0b\xb5\x13\x46\x98\xd5\x89\x47\x6a\x6d\x3f\x9a\x16\x50\x8c\x65\xa9\xa0\xcc\x08\x8f\xb5\x53\x1f\x9d\x72\x73\x06\x8b\x84\xd5\xd7\xba\x10\x8c\x70\x4a\x80\x79\x63\xbd\xf6\x2e\x77\x10\xaa\xdb\x4a\x86\x95\x9c\x88\xc4\x89\x23\x75\xeb\xc4\xeb\xb8\x39\xca\x48\x16\x41\x10\x6c\xdd\x1e\x41\xdf\x98\x51\xe6\x89\x47\x91\x55\x59\xc2\xcf\x76\xa6\xff\xcc\x48\x96\x09\x4c\x5a\xdc\x42\xf2\x08\x5d\xba\x83\x16\x23\x13\xb9\x97\x30\x58\x4a\x6c\xe8\x1e\xdf\x8e\xb8\x00\xae\x43\x4f\x80\x91\x4c\x47\x3e\x28\x6d\xa0\x1e\xc9\xbe\xe6\xe7\x42\xc4\x5f\xd6\xb7\x18\x91\xb1\x41\x2e\xff\xa6\x46\x71\xf8\xde\xfc\x90\x11\x99\xba\xa0\xd4\xa3\x32\x27\x01\x07\x91\x3a\x22\xd9\x08\xb0\x3d\xc4\x65\x8c\x48\x93\x01\x4e\x4c\xf9\x06\xdf\xa0\x5c\x57\xe6\x4b\x55\x75\x46\xb4\xc8\xbc\xda\x50\xd3\xf4\x04\x6c\x31\x56\xe4\x98\x6f\x43\xc4\x28\xe7\x5b\xf6\xad\x72\x81\xd9\x50\xc1\x60\xc4\xd8\x28\x3c\x9f\xbf\x9d\x64\xd9\xe6\x6d\x0e\xf3\x19\x04\x91\x5b\xb5\xaf\x8a\xe3\xcb\x28\xd8\x65\x04\xac\xf7\x40\x80\xc6\xc1\x5e\xba\x8c\xf8\x0e\x7a\xd3\x89\x61\x0b\x27\x36\x15\x41\x77\x13\xb1\x1d\xae\xd6\xb0\x44\x4e\x09\x1f\x30\xc2\x2d\xc0\x1f\x78\xe6\x8b\xba\x9a\x5d\x56\x1c\x25\x80\xbd\x1e\x3b\xc6\x13\x75\xbf\xed\xe2\xe3\x7b\x75\xfa\xb4\x76\x19\x3e\x4d\x25\xb6\x5a\x5f\x2a\x53\x5c\x57\x35\x09\x7b\x7d\x1c\x49\xa3\x7a\xb0\x35\xce\xe5\x0d\xd4\x3d\xd7\x84\xc5\x44\x52\xd4\x1c\x97\xae\x34\x09\x8f\x23\x39\x0b\x04\xc2\x43\x39\x4b\xf8\x59\x4c\x80\x52\x47\xb5\x0a\xa4\xb4\x2e\xc2\x71\x44\x9d\x41\xa4\xee\x93\x2b\x8d\x49\x86\x77\x59\xc9\x56\xbf\xf4\xeb\xdd\x79\x8e\x3a\x3b\x4b\xb8\x93\x71\xcc\x28\x71\x38\xfd\x79\x0b\x27\xfc\xa4\x44\x68\x44\x8d\x76\xaf\xe1\x23\x18\x38\x20\x38\x6e\x71\x19\x8f\x13\x05\x28\xbe\x8b\x6a\x1c\xd0\xb4\x5d\xfa\xbb\xbc\x9f\xc4\x89\x16\x48\xbd\xda\xdd\xdc\x5d\xdd\x3e\xac\x7f\x9f\xe1\x2a\xbb\x01\x19\x32\x55\xd0\x78\x17\xd1\x8c\x23\x71\xb8\x61\xfb\x8f\xd3\x24\x26\x30\xba\x7d\xce\x75\xd0\xc9\x5d\xe0\x46\xfe\x79\x6b\x94\xc5\x94\xa9\xa0\xef\x8b\xc1\xf7\xca\x27\x07\x33\xaf\x01\x16\xf3\xd8\x69\x29\x1c\x3e\xb6\xf2\x0d\x65\xe7\xc2\x01\x03\xa1\x01\x7c\xe3\xab\x1d\xe1\x90\x88\xa4\x88\x02\xd9\xfc\xb4\x64\xe8\x1c\x06\x52\xc0\x50\xca\xe9\xdc\xba\xbe\xdc\xea\x0c\xc8\x13\x06\x33\x8d\x00\x8a\x7d\xc0\x78\x76\xaf\x8c\xe7\xc6\x4c\x6f\xb1\xe0\x06\x7b\x92\x35\x52\x0a\x9b\xf6\x0f\x80\xd7\xab\xd0\xf4\x66\xb1\x50\x09\xa7\x3d\xba\xad\x37\x13\xea\x0e\xe8\xd8\xc1\x9a\x02\xea\xe4\xc7\xd8\x76\x98\xc5\x02\x52\xe4\x42\xae\x2e\x56\xe3\x57\x3e\xce\xc0\x01\x67\x6a\xa9\xa1\x57\x8e\x64\x71\x66\x2d\xa6\x97\x25\xbc\x8f\x95\x97\x26\x4b\x57\x2c\x05\x04\x99\xea\x47\xa9\x54\xde\x6e\xf3\x7a\x54\xc7\x9c\xd5\x86\x58\xdc\x2d\xe9\x30\x32\xfb\x9a\x26\xca\x7e\x90\x8a\xad\x5b\xdd\x9b\x6e\xe6\xc2\xc1\xbd\x54\xb3\xdb\xa4\x89\xc2\x16\xe3\xf7\xb4\x7f\x8d\x35\x8b\x78\x34\x58\x06\x85\x96\xf9\xfe\x3f\x79\xf3\x92\xcf\x97\x1a\xcd\x1c\x02\xed\x25\x7f\x76\x28\xc2\xc1\xce\x83\xc5\x46\x3b\xc5\xcd\x12\xde\x1d\x7b\x76\xf6\x61\xc8\x08\xe8\x79\xce\x3f\xb9\x31\x36\x93\xc1\x4b\xf9\x33\x77\x00\x37\x32\x89\xb8\xc3\xf8\xe1\x56\xec\x90\xc5\x3d\x0d\x97\x25\x91\x8c\x60\x14\xc0\xe5\xfa\x15\x16\xea\x8f\x2c\x89\x8c\x23\x8d\x79\x46\xd0\x02\xec\x88\x25\x91\x25\x08\xda\x6a\xab\xe7\xe7\x02\x7e\xcf\x8b\x62\xfb\x9e\xb7\xfa\x25\x7c\x17\x89\x38\x82\x34\xd1\x0c\xd3\x02\x38\xbc\x45\x7f\x94\xc6\xa8\x18\x60\xf3\x37\xe8\x16\xe3\xfe\x12\x09\xe7\xd8\x10\x2c\x64\xd3\x5e\x82\x6a\x6f\xc1\x3c\x43\x7d\x35\x58\x17\xb0\x84\x64\x09\x86\xc8\x08\x8d\x6f\xa0\xb0\x03\x89\x8a\x25\xc4\x28\x6c\x44\xee\xd5\xa9\x2e\x17\x2f\x9c\x00\x41\x57\xa6\x2e\xd7\xac\xdb\xab\xff\x12\xea\xee\x29\xa1\x7f\xf1\xff\xfa\x81\x31\x55\x18\xbb\xaf\x77\xa3\x0d\x31\x49\x98\x36\x89\x17\x1a\x9e\x04\xe6\xde\xb7\x83\x25\x69\x14\x65\x32\xb0\xde\x7e\x7e\x61\xb5\xd5\x0d\x55\x78\x1b\x1e\xe5\xeb\xe9\xb9\xfa\x95\x55\xd1\x64\xda\x24\xa9\x80\x48\x8d\xe3\xb6\x55\x0d\x72\xf6\x5b\x53\x23\x88\x67\xa5\x0c\x16\x52\xb3\xd3\x80\x74\xc9\x3b\xee\x8e\xae\xe0\x1c\x42\x28\x3f\x84\xc6\xd2\x64\x93\x16\xf4\xb7\xba\x7a\x6f\x5f\x26\x85\x37\x96\x50\xe5\xaa\xcb\xb5\xcc\x1b\x30\xc3\x8e\x98\x50\x70\x66\x55\x8e\xe7\xd7\x4d\xba\x71\x55\x92\x25\x4c\x12\xea\xb6\x97\xf7\xcd\x4b\x55\x82\x4b\x54\x96\xd7\xbe\x84\x19\x15\x0d\xd0\xa3\x8b\xdc\x4c\xca\x3f\x63\x63\xcd\x2e\x3d\x8a\x90\x82\xe2\x4c\x17\x2e\xa0\x1d\x0b\xf6\xb0\x84\xfb\x66\xfd\x7b\x5e\x18\x1d\xba\xcf\x7d\x19\x27\xe1\x46\xc4\xae\xf3\x7e\x9a\x79\x2d\x76\xc7\x20\xd1\xbd\x98\xcf\x5d\x65\xe6\xc7\xad\x21\x8e\x5e\xe4\xef\x99\x43\xfd\x2e\xff\xa4\x8c\x66\xd6\xcb\xd6\x7a\x5b\xd9\x1e\x9f\xca\x92\x4c\x08\x6c\x76\xfe\xa7\x5b\x84\xba\xac\x71\xbb\x30\x45\xfc\x58\xa9\x9d\xb1\x25\x6a\x88\xf6\x5d\x76\x96\xe8\x24\x49\x79\x60\x08\xdf\xca\x32\x94\x76\xf3\xe1\x19\x68\x4e\x31\x6c\xfc\x56\x03\x94\xef\x55\x5d\x98\x6b\x59\x1f\xc6\x4b\x7b\xa2\x0d\xe0\x72\xbb\x79\xba\xf8\xd6\x2e\x49\x99\x8d\xd7\xac\x44\x5b\x9e\x78\xc5\xe5\xab\xf6\x65\x2d\x8f\x17\xa7\x8f\x9b\xf2\xba\x7f\x51\x4d\xa2\xb1\x0e\xef\x9e\x4d\xd0\x2d\xea\xc3\x97\x59\x0f\x75\xf1\xed\x31\x34\x52\x62\x56\x75\xc1\xbe\xf5\xd7\xf9\x4a\x62\xa8\x06\xd4\x3a\x41\x18\xf1\xd0\x33\x1e\xc5\xdd\x89\xd1\x16\x49\x26\x07\xa8\xcf\xb5\x15\xe6\xe7\xb3\x12\x82\xe9\x64\xfd\x3c\x9b\x09\x00\x42\x0c\x2e\xa0\x17\xa7\x26\x2f\x47\x29\xf8\x27\x67\xb4\xb1\x76\x70\xf1\xfc\xcd\xa3\x7d\x97\x41\x11\x2c\xb1\x5c\xa2\x4d\xd1\x3e\x58\x26\x1c\xa1\x34\x50\xea\xd1\xaa\x6f\xb9\x14\x59\x5f\x15\xc4\x2e\xe1\xb4\x24\x93\x58\x45\xad\x6b\xf0\x3d\x57\xad\x1e\x2d\x76\x56\xa9\xde\x4e\xb3\xbb\xc9\xc7\xaa\x76\xad\xee\x6b\x80\xd1\x1c\x9a\x5c\x52\x1a\x51\x8b\x79\xd9\xc3\xcb\xfd\xd8\x2c\x98\xa5\x11\x63\xe8\x45\xf8\x56\xb5\x10\x25\xf7\xd5\xa8\x91\xca\xd2\xc8\x3a\x13\x6f\x0f\x14\xc3\x12\xcd\xe4\xd3\x24\xa6\xf8\x4b\x5f\x64\x3d\x90\xbf\x59\x1a\x67\x99\xcd\x42\xeb\x1e\x05\x63\xea\xea\x70\x57\x95\xb8\xd1\x8e\xd7\xe5\x34\xa1\x56\x92\x91\x6a\x54\x2d\xcb\x17\x39\x89\x46\x96\x1e\xf3\x64\x45\x49\x13\xa3\x70\xf3\x08\x10\xb9\xb5\x33\x80\xfb\x3f\x70\x01\x58\x9a\x1a\x27\xde\xd0\x05\x9c\xce\x3a\x61\x52\x14\x4d\x59\x96\x64\xd0\xc3\x59\x7a\xf8\xf1\x9d\x3c\x1e\x47\xbc\xf9\x7f\xfd\x7b\x14\x01\xa7\x2c\x73\xaf\xaf\xe3\x80\x6d\xab\xc2\xec\xaa\xe9\x44\x4c\x99\x75\xbc\xe7\x26\x48\x15\x4c\x8a\x94\xe3\x77\x37\xe5\x02\x90\xfa\xd6\xf7\xee\xd0\x15\x3a\x44\xf4\x0b\xac\x46\x96\xf2\x8c\x86\x3e\x9d\xeb\x78\xce\xd3\xf5\x94\x9b\x08\x79\x87\xeb\xa7\xfb\xd1\x7e\x9a\x0a\x2a\xf0\xcf\xf7\x3f\x76\xfd\x9f\x44\x4a\xb3\x50\x56\x3c\xba\xc2\x78\x5e\x95\x97\x03\x72\x20\x8c\xcc\x94\x85\x80\x9a\x5b\x7f\xf7\x0a\x0d\x74\x12\x3c\xa5\x12\x04\x82\x09\x7b\x71\x8a\xdb\xbc\x7c\x0d\x27\x50\x8a\xa3\x3b\x02\xb6\x05\xb4\x3e\xab\x8e\xa4\x5a\x6b\x47\x83\xaf\x4e\xa5\x49\xd7\x32\xac\x5f\xa9\x06\x67\xe5\xfd\x0c\xed\xf7\x8f\xe3\x3c\xa8\x4b\x0d\x89\x23\x11\xfa\x3c\x5f\x17\x6b\x97\x57\xa9\xd4\x48\x81\xd3\x44\x57\xa1\xdd\xb5\x3d\x1d\x8f\xc5\x87\x0f\xc4\x9d\x0f\x1f\x78\x0d\xfe\x70\x55\x06\x94\x93\x64\xad\x31\x8f\xfb\x73\x8a\x93\x2c\x05\x62\x52\xff\x9e\xf7\x9a\x05\x9f\xef\xc1\x29\xa4\x1c\xfb\x70\xef\xb2\xd9\x56\xb6\x5d\xcb\xe3\x5d\xbf\x61\xa5\x36\xe1\x3a\x0b\xdb\x26\x18\xec\x02\x8e\x09\x7c\x8c\x46\x09\xc3\x55\x65\x7f\x6a\x60\x9d\xb7\x79\x97\x9d\x37\xb7\x18\x12\xfc\x67\xee\x5c\xf2\x55\xab\xb7\x3b\x93\x46\x3d\xf8\xdf\x65\xd9\xc8\xe6\xad\x59\x17\x70\x68\xfa\xe9\x41\x23\x9d\x78\xdc\x65\x09\x75\xae\x27\xaa\x5c\xa3\x1c\x81\x92\x88\xa2\xfd\xca\x60\xd4\xd9\x63\x6e\x19\x25\xdc\x01\x4d\xfa\xda\xff\xba\x0b\x15\x46\x4d\xc5\xaf\x8b\x42\x94\x58\x8e\x15\x94\x3e\xde\x4c\x7d\xbc\x99\xfa\x78\x33\xed\x07\xda\x50\x83\xac\x7a\x19\x16\x46\x63\xc8\x6c\xaf\x4c\x2d\xeb\xf6\x52\xb6\xf0\x60\xb1\x3b\xea\x47\x24\x91\x76\x72\xd4\x5d\x06\x98\xb7\x1f\x57\x3f\xe7\x6c\x79\x46\x93\xc4\xb0\xa8\x87\x5c\x78\x72\x84\xb7\x73\xfa\x72\x77\xa3\x49\xf7\x9e\x8d\x20\xb3\xfd\x04\x99\xce\x78\x9a\x78\x6a\x27\x66\xb0\x78\x09\xcd\xc3\x7b\x09\xe6\x0e\x8c\x47\x05\x87\x95\x98\x26\x92\xd8\xb0\x14\xa1\x59\xcd\x45\x55\x35\xed\x48\x5b\xcb\x8f\x4b\x15\x43\xb5\x2a\x69\x8c\x5f\xd1\x1f\xd4\x7f\xfc\xa9\x26\x57\x3b\x6a\xc4\x2e\xc4\x22\x94\x71\x87\x24\x0b\x7d\x8a\xaf\x34\x4f\xfc\x47\x78\xc4\x10\x26\xb4\x6f\xce\xa4\x84\x19\xe5\x4c\x10\x5f\xac\xda\x97\xa7\xc3\xbe\xb2\xdd\x54\x5e\xae\x16\x8a\xf0\x19\x69\x84\x77\x74\xd8\xfd\x44\xbb\x94\xc5\x0c\x8e\x72\x23\x52\x11\x1a\xf9\xa5\xa9\xea\x1b\xb3\x8c\xf6\x64\x54\x90\x18\xf5\xc9\x1c\x8e\x74\x9a\x02\x8f\x2b\xd7\x34\x4b\x9d\xfa\xdb\x6a\x77\xe7\xfb\xab\xb3\x1f\x94\xd9\x74\xd2\xb1\x44\x97\xc9\xd9\xf3\x95\x51\x86\x26\x65\xc1\x99\xf4\x6a\xf7\x7d\xbf\x5e\x6d\xc2\x24\x94\xd2\xf5\x1e\x5d\xd5\x1a\x93\xe0\x3b\xf9\xb3\x3f\x6a\x29\xf5\x88\x8f\x2e\x9b\xf6\x61\xee\x6c\xb1\xa5\x2a\x4d\x50\xc8\xfd\x3f\x55\x48\xf6\xa8\x8e\x35\x26\xc7\x08\xc0\x70\xa2\x27\xe1\x88\xd0\x41\x34\xf1\xb1\x52\xd5\xb9\xbd\xe0\xf4\x27\x6a\x10\x08\x8a\xf9\x2e\x9b\x97\xb2\x32\xb0\x83\x52\xd6\x72\xb4\x13\x51\x43\xb4\x82\xe0\xc7\x81\xf4\x93\x66\xe4\xb2\x3c\x3d\x9b\xa1\x1a\x73\x03\x27\xdb\x7e\xd3\xb8\x8a\xd3\x27\xee\x6f\x8c\x1a\x06\xce\xd9\x79\xf5\xb4\xbd\x0a\xdf\x07\x9c\xa2\x25\x64\x0b\x4d\xfb\x08\x23\x1d\x4e\x46\x21\x8b\x23\x7f\x29\xb7\x79\x09\x67\x46\xe7\x8c\x5a\x62\x1c\x91\xba\xae\xde\xcd\xee\x50\x95\xf0\x41\xc3\xa7\x6d\x4a\x14\xca\x09\x75\x11\xda\xa4\xdd\x17\x6a\x7e\x88\x17\x11\xe3\xe4\x11\xcb\x00\xd7\x55\xbd\x94\x32\x53\x0b\x09\x5a\xa1\xfc\x7e\x15\x1e\x37\x8b\x48\x8c\x05\x6d\xc7\x72\x79\x78\x85\xd2\xed\x4e\xfd\xf1\x58\x63\x55\xed\xfa\xe1\xe9\xfe\xf2\xea\x71\xbb\xdf\x3c\x3c\xdc\xee\x57\x97\x97\x8f\x61\x04\x51\x2a\xf3\xc8\xeb\x75\x21\x9b\xa6\x0f\x74\x42\xb1\x67\x08\x6f\x58\x4c\x62\x5c\xe1\xda\xc3\xb1\xdb\x96\x62\x3d\x72\x81\x9d\xce\x21\x16\xc7\x59\xe6\xea\x3d\xcd\xa9\x5b\xa7\x7a\xa5\xae\x70\xdc\x2a\x44\xc9\x1f\xeb\xea\x50\xb5\x3e\x9d\xf2\xc7\x92\x24\x43\xd9\xae\x7d\xed\x59\xc2\x8b\x53\xa9\x8b\x39\x31\x3a\x77\x29\xe8\x5d\x65\x9c\xe3\xfb\xec\x42\xd2\x20\x48\xee\x4c\x2a\x26\x29\x2f\x4b\x95\x7b\x75\xfd\x1a\xb0\x6f\xab\xbd\x1a\xf4\x42\xce\xb4\x7f\x18\x4b\xad\x53\xa9\xf3\xdf\x99\x2f\xe8\x22\x32\x46\xa3\x0c\x2b\x94\xf0\xf3\x98\xd7\xe3\x40\x89\xd1\x24\x46\x20\xa2\xdb\xc4\x3c\x51\xf1\x0b\xb4\x35\x63\x94\x12\xcc\x09\x6e\xf3\xf2\xbf\xe3\x38\x9c\x51\x9a\xe1\xa2\xbc\x8d\xd9\xd0\xe0\x60\x94\x69\x8c\x20\x1e\x7e\x4e\x07\x67\xdc\xeb\x5e\x39\xde\x2f\xaa\xac\x9a\x7c\x40\xf6\x4c\x8b\x1a\x4c\xc4\x5a\xba\xa2\x46\xe9\x1e\xdc\x60\x81\x14\x4e\x29\x12\xb7\xa9\x3b\x6a\x99\x2f\xeb\x5f\x23\xcb\x37\xd7\x0b\xd5\x61\x26\x32\x8d\x4c\x53\x7c\xc3\x36\x85\xd4\x80\x4d\xe7\x45\x70\x09\x63\x42\x39\xca\xb6\x8b\xbe\x77\x50\xc0\x73\x2d\x0f\x4b\x32\x6c\x8c\x09\x9b\x70\xc7\x5a\xf8\x79\x87\x80\x04\x1f\xe8\xf9\xc3\x99\xa7\x26\x1c\xe5\xc9\x89\x98\x05\x02\x3c\x63\x99\xa0\x08\xb4\x87\x46\xcb\x19\x3c\x89\xb1\x0c\x98\x88\x42\xc2\x06\x57\x25\x02\x0e\x3d\x42\x74\x9c\x33\x31\x99\xa4\x41\x96\xf8\xa6\x44\xd9\xa0\x93\x2c\x26\xc6\xca\x8c\x49\x48\x48\x3a\x20\xec\xc1\x78\x88\xe7\xd6\x91\x47\x46\xee\xfa\x8c\x29\x95\x90\x78\xb2\x02\xce\x2b\xa5\x4c\xe9\x04\xc9\xe3\xdf\x1e\xfe\xfe\xf7\xaf\xf2\x7f\xa6\x6c\x1c\x40\x3d\xd7\x35\xc0\x6e\x68\x07\x32\x9d\x50\x4c\x10\xef\x6e\xee\x77\xb8\x24\x5c\x6d\xb7\xc3\x31\x19\x7b\x84\x8d\x53\x05\x3d\x1d\x56\xc5\x73\x55\xe7\xed\xcb\x61\xf2\xdb\xb5\x96\xda\x8b\x5d\x8d\x5f\x61\x6d\x33\x64\x30\x3f\xe7\xb6\x9d\xd1\x5b\xfc\x08\x63\x29\xf2\x1e\xdf\xaa\x01\x25\x37\x66\xdc\xf9\x61\x90\x70\xf0\x9a\xa6\x3b\x79\x0c\x96\x2e\x5d\xce\x84\x13\x7c\x71\x1f\x65\x40\x19\x19\x34\xfc\x42\x7d\x6c\x12\x0e\xfc\x65\xec\xac\x17\x3e\xa6\x8c\xf5\xe1\xb7\xef\xb9\x3e\x9c\x66\x15\x27\x66\xa3\x28\xf2\xe0\xd4\x6e\x3b\xd8\x93\x28\x5c\xa9\x15\x02\x2b\xd5\xdb\xaa\xf7\xfd\x67\x9c\x00\xc3\xfa\xbc\x87\x7e\x5c\x61\x1d\xa3\xd4\x1f\xe7\x08\x79\xff\x81\xd8\x3a\xd5\xa8\x63\xf5\xfe\x9b\x07\x7a\x8e\x28\xea\x8c\xa7\x09\xc3\x9c\xb0\xa7\x96\x38\xdc\x35\xd4\x8f\xa0\xab\xf3\xe4\xc6\x7f\x8a\xc6\x49\x88\xf4\x50\xec\xe7\x71\x81\x63\x18\x86\x52\xcd\xfc\x7e\x70\x85\xad\x41\x07\x5d\x9d\x0d\x12\x4e\xe9\xa8\xf1\xcd\x9a\x2f\xce\xc7\x94\x40\x61\x26\xd5\x8b\xb0\x05\xbb\xf6\xd9\x2f\xe7\x49\x64\x5d\x43\xef\xba\x1a\xb2\x14\xce\x15\x45\x14\xe0\x6a\xf7\x30\x5e\xd2\x38\xb7\x80\x91\x21\xf6\x5e\x9e\xca\xbc\x9d\x37\x8a\xb8\x04\xd0\x9e\x3c\x8c\x5d\xbf\xe0\x12\xb0\xd0\x7d\xe7\x86\xc7\x58\x9c\x41\x98\xf4\x44\xf0\xee\x8c\x82\x39\xb1\x64\xfc\x32\xd8\xe1\x06\x22\x31\x46\x91\xcc\x1c\x0a\x96\x6f\x18\x28\xa7\x3f\xe6\x14\xe9\x7a\x9d\xc4\x39\xfa\x70\xf6\x21\x13\x07\xb9\x92\xcb\xed\xee\x5e\x1e\xc0\xe9\x5e\xf9\xc3\x36\x72\x96\xeb\x06\x8a\x7d\x7d\x06\xd5\xe0\x56\x50\xb4\x1f\x08\xc5\xe9\x99\x2a\xc1\xf4\xbb\x44\x44\x52\xac\xdb\x35\x41\x5d\xbe\x7b\xf1\x3d\x74\x92\x89\x28\x75\x22\xc4\xaa\x0b\x3d\x51\x4f\x2f\x1c\xe0\x02\x49\x10\xfb\x23\x4a\x7a\xba\x95\x7a\x79\xf5\x17\x24\x62\x58\x64\xca\x4b\x8d\x26\xe8\x68\x2c\x10\x4e\x44\xe2\x2c\x68\x21\x3f\x8d\xfd\x35\x96\xaf\x96\xf0\x84\xc5\xbd\xe5\x18\xd4\xcd\x85\x2c\x5f\x9b\xcb\x5a\xda\xf6\x4e\xb6\xa7\x3a\x6f\x3f\x46\xc8\x16\x11\xc7\x02\x7b\xac\x17\xbb\xeb\xbb\xfe\x6f\xd6\x3a\x3d\x07\xec\x5c\x39\xbe\x7a\x60\xc6\x4f\x8a\x1c\x22\x01\xcb\x92\xa0\xd5\x39\xb1\xe4\x63\x22\x15\x84\xf4\xfb\x5f\x60\xd7\xff\x92\x6b\x3b\x6c\xa0\x82\x45\x49\x14\x42\x26\x68\x5f\xbc\xc7\x60\x38\x3d\x8b\x05\x04\x06\xa8\x4f\x40\xc7\xcd\xd3\xd9\x5d\x61\xb1\x16\x9e\xda\xd9\x3e\x74\x8b\xf3\x72\xe9\x2d\x8c\xe6\x34\xe9\x3d\x4a\xa6\x88\x01\xc1\x69\x8a\x84\xef\xd5\x63\x7f\xbf\x84\x74\xfb\xf1\xfb\x5c\xcd\x7f\xe4\xf3\xcd\x44\x26\x15\x72\xb9\xeb\xfc\xf9\xa5\x8d\x67\x78\x45\x21\xbb\x79\xe4\x48\xd1\xcd\x32\xf8\x6d\x36\x65\x24\xb0\xcc\x84\x68\x1b\x11\x17\x4b\xd9\xe5\xe4\x69\xa9\x48\x63\x5f\x7b\x55\x14\x9b\x20\x7c\xda\xfd\xd5\x6a\xa7\xa4\x8f\x13\xfb\x5b\x25\x8b\x47\x90\x7a\x88\x5d\xbb\x11\x10\x07\x31\xee\xdc\x3c\xc3\xfd\x18\x0e\x72\x1e\xfa\x08\x95\x28\xc4\x54\xb9\x0c\xb1\x77\x45\x3c\x87\x14\xf8\xf1\x9a\x70\xe3\xec\x39\xa0\x34\x77\xcd\xf3\xb6\x34\x9f\x40\x05\x05\x10\x85\xcb\xe0\xe5\xd5\x9a\xd0\x29\xb3\x9c\x09\x48\x69\xe4\x4b\x19\xab\x53\x5b\xd5\xb9\x91\xe6\xaa\x00\xdd\x56\xf5\x60\xf2\x1c\xc6\x9a\x08\xc9\x0e\x37\xf7\x37\xbb\x9b\xd5\xed\xfe\xc7\xd3\xc6\x29\x71\xed\xb7\x4f\x9b\xcd\xed\x3f\xfa\x73\x02\x68\xf0\xf6\x20\x75\xfb\x6d\xae\x96\xc0\x84\x8d\x62\x13\x44\xc5\x4b\x03\x75\xf1\xd1\xed\xef\x23\xb0\x91\xb0\x89\xd1\x66\xc4\xc3\xf5\x9b\xf8\x38\xae\xc8\xa2\x54\xa4\xce\x21\x1a\x1e\x41\xe7\xc7\x1c\x46\xc7\x58\x86\x72\xf9\x12\xd3\xc2\x47\xec\x73\x5d\x05\x33\x15\x96\x11\xa2\x30\xd0\xec\x12\x3a\xef\xe0\x6a\xfe\xa8\xf3\x16\x10\xbc\xd0\x8f\x8a\x25\x4e\xbf\xcd\xd5\xe3\xda\x4b\x8e\xed\x77\x0f\xfb\x8b\x9b\x7f\x5e\x5e\xfd\xe8\x07\xc9\x2c\xf3\x16\x37\xa1\xf1\xfe\x65\x95\x26\x8b\x65\x8a\x3c\xec\x3f\xf2\xa2\xc8\xe5\x61\x94\xd7\x66\xb1\xe1\x88\xef\xbb\xc8\xdb\xbf\x85\xbf\x25\x8c\x39\x10\xa6\x4b\x27\x4c\x8b\x5b\xdf\xa7\xb4\x63\x96\xa5\x34\xd2\x9e\x07\x25\x55\x01\x5d\x12\x7f\x59\xbd\xf7\xdf\x91\x5a\x10\x34\xb4\x54\xc2\x6c\xb8\x76\xe2\x0f\x7e\x08\x8d\x98\xf2\xba\xa8\xd7\x79\x29\x8b\x2d\x7c\xa2\x52\xd6\x0d\x75\x12\x75\x21\xd6\x18\xa9\x45\x9f\x2d\xd9\x19\xd5\x96\x07\x3d\xcf\x16\xe4\xeb\xa6\xce\x87\x2f\x65\x22\xc3\x44\x1a\xda\x17\x6c\x6a\x85\xbf\xf3\x84\x63\x4b\x12\x8d\x33\x1e\xe1\x3f\xa0\x5b\x47\xdc\x5f\xd2\x3b\x60\x19\xa7\x0a\x93\xca\xe6\xfd\xe3\x08\x88\xc1\x0a\x07\x6c\x44\x3d\x42\xc5\xa3\x2c\x17\x32\x90\x4c\x48\x83\xc0\x86\xf0\x7b\xfe\x78\xc9\xdd\x2d\xfc\xac\x60\x90\x09\x43\x90\x4b\x54\x9e\x0e\x41\x88\xb2\x3f\x92\xc5\x51\xcf\x5f\x69\x57\x27\x93\xb7\x01\xef\xf2\x25\x1b\xaa\xfb\xa8\xcc\xcc\x50\xe6\xec\x26\x16\xcc\x29\xb7\xd3\x4f\x64\x24\x36\x7d\x95\x61\xd2\x9b\xfe\x64\x7c\x06\xe0\xe9\x0b\x5d\x28\xd0\x1c\x65\xc8\x5b\x96\xc8\xac\x2c\x93\x2c\xc3\xc6\xa4\xaf\x60\xa1\x06\xec\x6c\xe2\x49\x29\xf1\x4d\xb8\xc8\xdb\xed\xee\x72\x92\xe4\x85\x11\x8a\x40\x2f\x0e\x26\x75\xdb\x7d\xf3\xc0\x61\x62\x99\x52\x4e\x02\xc3\x22\x61\x26\x74\x6e\xe6\x13\x5c\xb3\x18\x2b\xe7\xea\x34\xf5\xe2\x63\x99\xe6\x4e\xfb\x23\x3c\x3d\xdc\x5c\xe3\xf9\xc7\x05\xf1\x0c\xc8\xd2\x78\x04\xe9\x64\x87\xce\xb4\x70\xb0\xb1\xd0\xe9\xec\xdb\xb8\xe2\x8c\x4b\xb2\xfc\x52\x40\x6c\xa8\x76\x20\xf7\x43\x8e\x6c\x7b\xdf\x94\xb3\x50\xf7\x01\x57\x06\x59\xc4\xb8\xd7\x28\x98\x93\xc9\x59\x06\x5d\x16\x81\x3d\xb4\xe6\x87\x2c\x4e\xf0\xdb\x19\x3a\xcc\x0f\xb4\xa9\x1e\x68\x57\x70\xa3\x2b\x9f\xbe\x4e\x2e\x49\x46\xcc\x04\xe1\xa5\x4d\x0d\x6f\x79\x91\x3f\x83\x91\xb3\xf7\x60\x72\x62\x19\x31\x40\xce\xe1\x6d\xf5\xdc\x3d\x6e\xe7\x16\x93\x9f\x49\x4f\xfa\xbd\x5a\x12\x9e\xe2\x8b\xb7\x7a\xf6\x2d\x8f\xaf\xb0\xbc\xd3\x1b\x26\x89\xee\x55\x17\x7a\x2c\xfa\xb4\x13\x13\x06\x1a\x27\xcc\x81\xca\x33\x63\x13\xdd\x70\xdc\x4a\x5c\xb9\xce\x4c\x82\x96\x62\x26\xf7\x3f\xe3\x47\x2f\x63\xc6\x03\x20\x64\x7b\x52\xc7\xaa\xf5\x3b\xce\xf4\x72\x63\xe5\xe8\xe7\xdf\x56\xdb\xfd\xe3\xd5\xdf\x9e\x6e\x1e\xaf\xee\xae\xee\x43\x53\x4c\x26\x10\xa3\xa0\xe1\x25\x4c\x35\x75\x96\x23\x27\x99\x80\xc6\x79\xb0\x7b\x81\x55\xd9\xbc\x43\x7d\xd3\x4c\xe6\xa3\xa4\x29\xa0\xaa\x83\xd7\xf5\x43\x59\x3f\x27\x36\xd9\x0e\x6d\x70\x49\x55\x82\x48\xb3\xcb\x53\xab\x5f\x82\x46\xe8\xf2\x37\x52\x65\x9d\xc3\x9b\xeb\x69\x8e\x14\xa0\x98\x64\x11\x20\x3f\x42\x9d\x3e\x1e\xab\x06\xbe\x3d\xde\xae\xe7\x41\xd5\xf4\x64\x8c\xc7\x6a\xe8\x06\xaf\xbb\x67\x36\xb9\x7a\xa6\x1d\xe1\xc2\xdd\x8b\xbb\x8f\x49\x35\x6c\x76\x2e\x4e\x29\x46\x5b\x79\xf3\x50\x5e\xc8\xb6\x9d\xb9\x2a\x85\xae\x84\xe4\x99\xd3\x0d\x71\x7b\x62\x17\x60\x6c\xa1\x6d\xc7\xfe\xb2\xbf\xca\xbe\x3e\xcd\xf0\x65\x66\x5c\x49\x27\xd0\x57\xbf\xf5\x3a\xc9\x4c\x4a\xc6\xd2\xd4\x2f\x1d\xab\xa2\xb8\x06\x18\x90\xfa\xd3\x89\x2a\x2d\x09\x3a\x70\xdb\xfc\xb9\xec\x43\x97\x49\x40\x25\x55\x62\x30\xf5\x87\x37\x59\x9c\xb0\xb4\xeb\x6a\x17\x7e\x66\x4f\x2f\x4c\x59\x21\x45\x80\x58\xd6\x79\xf7\x8e\x34\x23\xa0\xe2\xb4\xfd\x16\x1a\x0a\x52\x83\xb0\x66\xf0\xd7\x82\xfa\xad\x5f\xe1\xfd\x08\x43\xc5\xd0\xc3\x75\x2c\xbd\x29\x69\x47\x1a\x88\x91\x4d\xf0\x78\xb5\xbd\x7a\xfc\xd1\xcb\xaf\xee\xaf\x1f\x1e\xf7\x5e\x68\x33\x0c\x85\xc4\x5d\xe4\x33\xb4\xdf\xe1\xe7\xd6\x49\x32\x4e\xbe\x0e\xc0\x11\xdd\xdd\xb3\x3b\xe4\xe5\xc5\xe9\x63\xf6\x4b\x6d\x9c\x20\xfa\xc0\x99\x8c\xb6\x9f\x11\x88\xf1\xe1\x4d\x6f\xbb\x55\x19\x26\x57\xfd\x2e\xb8\x6d\x87\xc4\x4d\x45\xa9\xab\x07\x38\xc8\xc2\x4d\x69\xab\x0d\xd4\xff\xac\xca\x4f\x40\x3a\x8a\x98\x44\x8d\xb4\x9a\xbc\xe8\x9a\x3f\x18\x47\x1c\xbb\xca\xbe\x89\x76\xcc\x7b\xd8\x9b\x8a\x3d\x5b\x1b\x37\xa7\x6e\xf7\x78\xc0\xf8\x35\x1c\x4e\x22\x8a\xc4\xcd\x6e\x23\xbd\x80\xb6\xb9\xae\xea\xa9\xdb\x1b\x53\x49\xa2\x82\xeb\xce\x65\x55\x82\x72\x0a\x7d\x87\x31\xa9\xa6\x1f\xe9\x90\x98\xa1\x78\x77\xaa\xdb\xbe\xc4\xa6\xd2\x24\x8e\x02\x0f\xe2\xa9\x81\x7a\xb1\xcc\xa6\x50\x8b\x14\xdf\xba\x2e\x4c\x19\x04\xf2\x99\xa2\x34\xc5\x86\x68\x73\x52\xdd\x53\x9a\x03\x1a\x17\x23\x30\x45\x99\x72\x42\xbb\x7e\x93\xdf\x37\x2f\xb2\xf7\x9e\x63\x8a\x1a\x82\xed\x90\x2e\xf4\xbe\x96\x39\x4a\xb0\x7f\x3b\x7d\xdc\x57\xab\x53\xfb\xf2\xdb\xe4\xfe\x53\x88\xa3\x78\xd4\xbc\x43\xc9\x85\x4f\xd6\x0e\xc5\x48\x84\x94\xc9\x6f\xd5\x65\xfe\x3c\x4a\xf9\x17\x2a\x9e\x8a\x51\x1b\x0c\x7d\xef\x2a\x73\xea\xb7\xf7\xe9\x19\x79\xc4\x84\xee\x75\xf5\xa1\x9d\x6a\xb3\x32\xc5\x69\x22\xfd\xe5\xad\x91\xb5\x7e\x0d\xb0\xa9\xaa\x59\xb9\x4e\x71\x6e\x32\x27\x26\x05\x5e\xfe\xde\x09\x3b\xed\xaa\x8b\x93\x79\xee\xbb\xf1\x4a\xa4\x5a\xfa\x8b\xda\x48\xfd\x8a\xfa\x62\xf3\x82\x95\x12\x3a\x0d\x40\x5a\x5f\xb3\x5c\x44\x4d\x4f\xaf\x20\x13\x26\xea\x15\x8a\xcf\xa8\xd1\xe3\x95\x55\x49\xe6\x34\x6d\x9b\x6e\x03\x3c\x1e\xbb\x93\x80\xc1\x0c\xee\xbc\xda\xa0\x24\xe7\xc2\x4b\x0a\x5d\x06\xd1\x85\xbc\x2a\xbd\xa8\xfe\xf4\x1a\x54\x2c\x30\xbf\xf5\x08\x89\x89\x36\x15\x53\x4a\x39\x13\x6a\xbf\x4a\x35\x2f\xbf\xc3\xc7\x64\xd9\x50\x3a\xce\x42\x4e\xd2\xad\xc8\x3d\xd4\x64\x76\x7f\x8c\x96\xb8\x81\xc3\x7f\x4f\xbd\xab\xf7\xf4\xd9\x43\x9c\x10\x27\x37\x7c\xac\x6a\x7f\x17\xc4\x2f\x2d\xb7\x47\x41\x86\x82\x18\xf0\x76\x16\x60\xdb\x24\x9e\x5d\x00\x30\x2b\x7c\x31\xba\xbf\x6d\x62\xae\x71\x31\x99\x46\x90\x31\xa4\x2f\xb8\x54\xf5\x3a\x2f\x8a\xf3\x5c\xe3\x57\xac\x96\xbf\xcc\x0a\xd7\x0b\xf4\xe3\xee\x8b\x34\xf6\xab\xbb\x75\x67\xb2\x2e\xda\xc4\xd8\xc4\xfb\x2a\x39\x48\xd0\x79\x83\x7c\x31\x46\x54\x96\x0a\xcc\xa3\xaf\x1e\xd7\x71\x9c\xe0\xf6\xb1\xdf\xee\x56\xfe\xc4\x3a\x22\x1c\x31\xce\xff\x7b\x39\xe9\x97\xd3\xf4\x4e\xe9\xee\xed\x4a\x02\xe5\xc4\x73\x65\xfb\x0f\x66\xb1\x1a\x79\x2b\x7e\x3b\xc9\x5a\x96\x2d\x80\x71\x62\xfa\x93\x8b\xd0\x24\x31\xb1\xe8\x77\x14\x87\x0d\xda\x05\x1b\xd8\x19\xd8\x60\x71\xed\xd0\x71\x96\x61\x62\x5a\x56\xe8\x2b\xb5\x7b\xe9\x11\x1b\x3a\x21\x0c\xd9\x79\xdd\x55\xee\x5e\xea\xea\xfd\x11\xf0\xf5\xb9\x95\xae\x19\xec\xb4\x42\xee\xab\x76\x5c\xc8\xd3\x49\x2a\x90\x65\xed\xc8\x67\x5e\x68\xc5\x8c\x52\x1d\x9d\x66\x1a\x6b\x62\xce\xcc\x70\x01\x69\xbf\x84\xa2\xd1\xdd\x06\x96\x8c\xca\x66\x5e\x2e\x7d\x4e\xab\xfe\x53\xb3\x39\xcc\x8f\xf1\xdc\xd6\x34\x56\x4e\xe3\xaf\x9b\x24\xdf\xe1\xe7\xba\xea\x72\x13\x57\x15\xc1\xeb\x19\x22\x7e\x4d\xb3\x84\x27\x2e\x63\x77\xe2\xf7\x07\x74\x32\xa8\x8e\xf2\x79\x98\x5c\x9a\x31\xe5\xfb\xef\x3e\x27\x58\x9d\x8b\x1e\x85\xa1\x36\x41\x1b\xd5\xdd\xd5\x6a\xfd\xdd\xd9\xd8\x8f\xca\xf9\x9a\x13\x8a\x1d\x8a\xaa\xce\x9f\xf3\xde\x39\x93\x69\x9e\x71\xac\xb5\x05\x51\xa9\xba\xce\xe5\x33\xdc\xe6\x1a\x4a\x0d\x37\x07\xf9\x0c\x37\x9b\xeb\xed\x4b\x2f\xae\x1d\x3e\xa6\x49\x1c\x94\xad\x5f\xba\x59\x5f\xf6\xd6\xa3\x4c\x67\xcc\x09\xe9\xe1\x7d\x68\x4f\x0a\xd6\x45\x7e\xfc\x4c\x2e\x68\xfa\x2b\x32\x95\x7a\x32\x34\x86\xeb\x1b\x57\x23\x1c\x57\xb7\xb4\x4c\x05\xee\x1c\x5d\x4c\xbc\xb4\xab\x6b\x69\x29\x8a\x52\x5c\xec\x2e\xc2\x67\x74\x42\x78\xaf\x2c\x7c\x38\x56\x25\x94\xed\xd2\x02\xa7\x75\x9a\x58\x57\xc8\xd7\x95\x01\xb3\x05\x5d\xf7\x9b\x8c\x36\x99\x42\x51\x83\x7d\x5b\xe7\xcf\xcf\x50\xdf\xc3\xfb\xe6\xc7\xa6\xdb\x13\xa0\x5b\x96\xbf\x2e\x5d\x69\xa3\x22\x8c\xe5\x9b\xa1\x57\x72\x73\x39\xbb\x74\x48\x12\x64\x13\x60\x9b\xe4\xb6\xea\x29\x32\xf3\x61\x20\x30\xe8\xd8\xc1\xe1\x58\xd5\xb2\xfe\xd8\x7c\xd4\xf2\xd0\xd7\xde\xb4\x25\x0a\x97\x8e\x61\xb1\x5a\x9e\x33\x96\x19\x24\x40\xf4\x04\x9b\x3f\x9b\x01\x84\xcf\x5b\x17\x0a\xdc\xc3\xfb\xaa\x06\x39\x4d\x9e\xc7\xb0\xd2\xb3\xff\xed\xcf\x61\x22\x19\xc5\x63\x2d\xb7\x5f\x2d\x9e\xe7\x1c\x39\x13\x81\xb3\x1d\x3d\xc8\x57\x78\x38\x2e\x5a\x75\xcf\xbf\x14\x14\xeb\xa5\x2f\x72\xd9\x2c\xe2\x43\x4d\x64\xdd\x28\x07\xa0\xc6\x77\xa2\xf1\x45\xce\xc5\xf1\x84\x46\xf8\xfe\x6f\xaa\x80\x1f\x31\x84\x2b\xbc\x43\xb7\x55\xf9\x7c\x51\x9d\x9e\x5f\xda\x25\x0c\x6d\x3c\x57\xec\x4a\x66\x38\x2d\x43\xb8\x46\x45\xcf\x41\x5a\x7c\xf9\x91\x1a\xa2\x59\x44\xc7\xed\xc0\x8b\x53\x7b\x16\x50\x98\x38\xd6\xd8\x4b\xd5\xb2\x44\xbb\x4b\xdc\x3e\x16\x9f\xb1\x89\x53\xad\xd4\xe0\xae\x6d\x7a\x6f\x0b\x66\x12\xe6\x18\x3f\xeb\x97\x3a\x6f\xda\xea\xf8\x02\xf5\x63\xa5\xf2\xf2\x31\x64\xf3\xa6\x4b\x61\x11\x10\x24\x9b\x97\x1d\x14\xf0\xb3\x3f\xc0\xb5\xb1\xa3\x40\xd6\xd9\x39\x74\x97\xb1\x91\x35\x94\x6d\xe3\xfe\xb9\xaf\x9c\x6d\x75\x68\x02\x1b\xca\x04\xc2\xcb\x1e\x57\xbb\xab\xfd\xfa\xf1\xe1\x8f\x4b\x04\x69\x6d\x43\x7b\xcc\xb0\x54\xe2\xea\xf0\xfb\x49\x41\x2d\xfb\x36\xa7\x61\x8c\x1b\xdf\x51\xbd\x70\x37\x79\xbc\x9e\x19\xa6\x9c\x90\x8d\x5b\xcf\x0e\xc7\xe6\x7a\xd2\x6f\x37\x4c\x67\x08\x97\x90\xc6\x5c\x43\xdf\xa9\x30\x9c\x64\xbd\x0e\xe2\xfe\x54\xb6\x79\xd1\x1f\x49\x0c\x7a\xaa\xbd\xc8\xe6\xbb\x2c\xda\xd1\x47\x8c\x4d\xe3\x11\x9b\xab\x5b\x3e\xa4\x6e\xbb\x84\xaa\x3e\x8c\xdd\x26\xfd\x78\x91\xa5\xa9\x6f\x88\xf7\x89\xd9\x2e\xef\xa6\x63\x0f\x0e\x37\x19\x25\x88\x4a\x91\xe5\x5b\xb1\x03\x3d\x61\xa7\x1a\xc5\x12\xe3\x4a\x65\xef\x28\xd8\x7d\x0e\x09\x99\x3d\x71\x65\x33\x85\x7a\xb9\xb9\x7e\x3d\x1d\xbd\xc2\xc6\x34\xfe\x30\x46\xf5\xb7\xd3\x43\x53\xe6\x22\x9b\xd3\xf1\x10\x59\xe5\xb8\x08\x4e\xf6\x7e\xb9\x6c\x66\x40\xc5\xb8\x4e\x5f\x15\xb8\x1f\x3e\x39\x62\xd6\x79\xaf\xf8\x4f\x46\x76\xfe\xac\x96\x50\xcf\x4a\xb6\x16\xea\x91\x43\x03\x33\x36\xd6\x81\x8f\xfb\xa9\x8f\x05\x83\x28\x95\xb1\x0d\x28\xe7\x25\xe8\x18\x44\x8c\x39\x6c\xaa\x03\xc8\xfd\xfe\x8f\xf5\xa4\x40\xfe\x97\xd3\x02\xae\x06\x22\x1d\xbb\xfd\xc4\x95\x7f\x1e\xec\xaa\x7d\x29\xa0\x3d\x8b\xbb\xfe\xd4\xaf\x04\x22\x52\x64\x9a\x3c\x14\xb9\x0d\xf3\x16\x88\xb2\xf8\xf6\x3a\xfa\xc9\xaa\xfd\x56\x57\xa7\xe3\xf2\x33\x02\x62\x79\x12\x8f\x0d\x47\x36\x75\xa5\x61\x24\x55\x02\xc4\x4a\x04\x4f\xec\x5d\xaa\xe1\xcd\x12\x9d\x57\x79\x55\x5f\x7c\x78\xb0\xf6\x72\x77\x01\x62\xea\x3c\x3a\xa5\x31\x41\x3d\xef\xb7\xd9\x08\x49\x78\xea\xa5\x50\xb4\x23\x55\x34\x83\x4b\x2f\x83\x24\x71\x76\x07\x5d\xbe\xbe\x5a\xef\x1e\x1e\xfb\x03\xa9\x88\xbd\x6c\xfa\x57\xb9\x2b\x24\xcc\x59\xc7\x75\x39\xb9\x9b\xaf\xcd\xe7\xdc\x6b\x48\xb4\x8b\xe7\x1a\x28\x8a\x5d\x37\x11\xd7\x55\x69\xf3\x10\xa7\x42\x9a\xba\x66\x74\xc0\xf0\x38\x84\xc8\x6e\x3b\x5e\x58\x20\xcd\xa8\x6b\x9b\xe6\xa5\x33\xcd\xf9\xe2\xfb\x52\x93\xe0\x6a\x52\x9e\x0e\x0f\xd6\x59\xc2\x5c\xc9\xba\xf8\xd8\x9c\x6a\xfd\x22\x9b\x3e\xc0\x02\x4a\x23\xec\x54\xdf\x56\xcf\xd7\xde\x6a\xfb\x93\x0e\x0b\x50\x9d\xe0\x9d\x29\xba\x1c\xbb\x69\xbf\x3f\x5c\xde\x5e\x3d\x86\x77\xd5\x8f\x61\xd6\x1a\x33\xd8\x74\x6d\xdb\xaa\x1e\x8a\x9a\xc0\x19\x47\xd3\x18\xb4\x97\xf8\x04\x25\xb1\x2c\x47\x38\x89\x98\xc9\x27\xd3\x96\x8b\x48\x45\x3d\x06\xf4\x15\xc3\xfc\xe9\xac\xe0\xda\x39\x82\xe7\xcd\x2a\x98\x16\xce\x27\x8e\xf0\xde\xd0\x8f\xcf\xb9\x75\xcb\xea\x68\xf1\x86\x2c\x31\xf8\x0b\x0e\x1e\x8f\xe0\xe7\xf5\x6f\x23\xd5\xc4\x4f\x2e\x2e\x93\x0a\x83\x93\x6f\xb2\x85\xf7\xbe\x85\x0d\x19\x24\x58\x61\xaa\xc1\x19\x22\x39\x7c\xb9\x3f\x28\x63\x47\x72\x0f\x01\x8d\xf7\xb6\xea\x0f\x6b\xea\xc4\x70\x4e\x47\xa8\xcf\x4a\xfd\xd3\xaf\x57\x32\x42\x7d\xf1\x6e\xe7\xfd\xac\x2a\x1f\x86\x2a\x8a\x71\x3c\x76\x1b\x3c\xc3\xf2\xbc\x9d\xf5\xf5\x0a\xa2\x29\xd3\xb4\x57\x84\x1a\xf4\xe2\xfa\x79\x67\xe2\x54\xfa\x9a\x85\x37\x68\x9b\x30\x2f\xc2\xa8\x84\x60\xa0\xbb\xda\x8d\x9d\xf4\x18\x18\xb0\xa8\x7d\x26\xb5\x1e\x4a\x81\x00\x32\x93\xa4\x77\x16\xc0\x72\xba\xeb\x38\xf7\x03\xc0\x38\x19\xdf\xaa\x28\xaa\x37\xa8\xc7\x89\xe9\xf2\xef\xb0\x8c\xb1\x68\x2a\xc7\xf5\x99\xb0\x99\xfb\x84\x8d\x62\x97\x72\xfe\xf7\x04\xf5\xc7\x06\xea\x43\xde\x34\x83\x6c\x35\xb3\x51\xca\x50\x79\xc9\x09\x38\x05\xeb\x4d\xd1\x1f\xce\x38\x4a\xb1\x34\xae\x5a\x1d\xfe\x4c\x32\x21\x7c\x50\xb1\x47\x95\xbe\x7d\x5e\xda\x2a\x1c\x8d\x53\x8d\xb1\x91\xf5\x5a\x66\xdb\xfc\xe7\x9f\x7b\x4e\x36\xa6\xae\xd8\xe5\x60\x07\x2f\x55\xfd\xdb\xe7\x9a\xab\xcc\xc6\x20\x84\x93\xbf\xff\xb8\xae\xea\xbb\x8f\x06\x0a\xdb\x4d\xa6\x80\x3b\xec\x05\x0f\xdd\x6b\xea\x3f\x95\xc6\xc6\xba\x66\xd0\xe7\x66\x69\x8b\x33\xd1\xa6\x89\xc5\x8e\xcb\xb6\xcd\xa1\xbe\xc8\xdb\xf1\x1c\xb0\x3c\xd5\x2c\x5c\x7a\xad\xf2\xd6\xd5\xa1\x46\x36\x07\xa3\xae\x98\xe5\x8c\xa5\x62\xc4\x67\xb8\x6a\x5f\xb6\x5d\xa6\x65\xfa\xb3\x49\x81\x35\xb4\x8b\xd3\x87\x23\xdc\xfe\x76\x96\x6d\x84\x91\xda\x55\x96\x9c\xf8\xc9\xa7\x15\xa2\xe9\x9d\x13\xa9\x41\x59\x96\xe7\x5a\x96\xed\x30\x2b\xce\x6b\xe9\xdd\x8d\x4b\xe7\x1f\x06\x0a\xc1\x29\x0f\x7d\xde\x9e\xba\xf0\x70\x3b\x82\xbf\xdb\x2c\x16\x44\xf4\x62\xe8\x26\x6f\x2f\xe5\x72\x47\xc4\x66\xd9\xc8\x2c\x6c\x3b\x40\x35\x6c\xa6\x9c\x52\xbe\xae\x9a\xee\x0a\xfd\x5d\xf0\x07\x25\x49\xb1\x4d\x7d\xf7\xd1\xc5\xac\xf1\xe4\x41\xc8\x98\x8e\xb6\xda\x99\x0b\x64\x18\x03\x2c\x89\x7a\x4b\x29\x54\xed\x76\x3c\x96\x70\x12\x65\x19\x46\xe3\x79\xb3\x91\xa7\xb9\xf7\x2b\xb3\x3a\x8b\x10\xaa\xb6\xdf\xab\x41\x10\x6a\x51\x16\x9a\x59\x2d\x1d\xe6\x07\x15\x65\xc6\x6a\xf8\xf3\x8b\xd2\xd6\xa2\x01\x8c\xec\xdd\xac\x4f\x03\x5b\xc2\x9a\x2c\x0d\x0c\xaf\xa7\xc6\x60\x1b\x6a\x81\xf9\x6f\x0d\x10\x4e\x42\x2b\x74\x6d\xce\x22\xa2\xe5\x5a\xb0\x85\xd8\xe9\x1f\xd4\xae\x7a\x7c\xb3\xba\x3b\x27\xeb\x59\xd0\x09\x62\x01\x6f\xab\x67\xa7\xee\x12\x53\x76\x76\xfe\x71\x54\x62\x6d\x94\x61\x8c\x30\x92\x0a\xbb\xf8\xd8\xa0\xd7\xfb\x74\x5c\x9a\xa0\x05\x2d\xce\x82\x9b\x72\x3d\x5a\x9a\xbb\x9b\x82\xe4\x5c\x05\xed\x23\x98\x11\x2e\xc6\x5a\x96\x7a\xeb\x96\xb6\x17\x3b\xab\x4e\xa5\xf9\x26\xcf\x34\xd3\x99\xb5\x1c\x9c\x0e\xb0\xc3\x45\xfb\x65\x73\x3e\x48\xc5\xd8\xd9\x38\xec\x7b\x88\xe2\x18\x5f\x6d\xad\xb1\x4a\x07\xf3\x99\x9f\x5e\x5d\xca\x47\x39\x3c\x8a\x62\xb7\x04\x38\x5f\xc2\xc7\xab\xf5\xd5\xcd\x8f\xab\xcb\xc1\xfe\x81\x47\x11\x4b\x99\xe7\x54\x3b\xe1\x52\xe7\x37\x74\xfa\xa8\x4e\x0b\x3a\x0e\x3c\x8a\x4c\x82\x39\xef\x51\x96\xb9\xee\x4f\x62\x34\xe5\xc1\xc5\xbc\x6e\x5a\x0c\xfb\x5d\x48\xe9\xea\xa0\xb3\x73\x58\x89\xd1\xf3\xb7\x1f\x53\x82\xd1\x78\x02\xf0\x28\x26\x1c\xd7\xd2\xbf\x6d\x2f\xfa\xab\x8d\x99\xc1\x8e\xf5\x8f\xaa\x78\x6d\xba\x7c\x36\xe9\x8f\x08\xab\x6d\x10\x7d\x42\x56\x66\xf3\x92\x1f\xa7\x35\xab\xbf\x4c\x2f\x23\x36\x04\x17\x4f\x23\x5b\xb9\x96\x85\x5e\x4c\x48\x78\x14\x5b\x89\x08\xf6\x7d\x17\x7b\x3a\x31\x83\xc7\x01\xd4\xcb\xa3\x34\xd2\x2a\xed\xc9\x74\xd8\x1b\xad\xec\xaa\x34\x83\x49\xde\xec\x84\xa9\xd0\xdc\x43\x1c\xdc\x5a\x70\x51\xcd\x16\x21\x1e\x51\x9a\x20\x1f\xc4\x00\x26\x84\xcb\x3f\x80\x2a\x8a\xcc\xe1\xbf\xaf\x1f\x6e\xee\xc3\xe5\x50\xd3\x6f\x84\x85\x6c\x5a\xa4\xf1\x84\x63\x2c\x4e\xb1\x4f\xa5\x4e\xdd\x2a\xd5\xff\x35\x35\xcc\x03\xaa\x47\x12\x75\xe1\xa0\x70\x12\x76\x06\x9a\xb6\xae\x3e\xd0\xdd\x38\x1c\xd2\x4e\xe9\x65\x1f\x8a\xbc\x57\xff\x3d\x8d\xd1\xbd\xd3\x8b\xe5\x36\x45\xcb\x22\x07\x84\x79\xb0\x58\x86\x0e\xc6\x5a\xcb\x1f\x11\x34\xc3\xd2\xf3\x16\xb9\x08\x27\xb4\x62\x9e\x5c\x9c\xc8\x2c\x8b\x03\xa4\xad\xce\x6d\x3e\xc6\x4a\x8d\x82\x0e\x1e\x65\x11\xc5\x9c\xf8\xda\x75\x75\xfa\x69\x23\xa9\x4d\x1d\x02\xd0\x65\x62\xbf\xcd\x2a\xcf\x7e\x98\x22\x99\x48\xfb\x74\x0d\xcc\xc5\x6e\xfd\x5b\x7f\xc8\xa2\xa2\xef\xaa\x1c\xeb\x74\xf3\x48\xc5\xc2\x99\x2c\x74\xeb\x66\xbb\xaf\x86\xaa\x3b\x8f\x14\x03\xbc\xa9\xd2\x74\x41\x98\x7e\x75\x15\x4a\x5c\xad\xe5\x14\x0f\xd1\x37\xb1\x78\xa4\x14\x0b\x8e\x2a\x55\x8f\x5d\xf8\xcb\xe4\x7e\x68\x19\x67\xa4\xe7\x55\x42\x7d\x0b\x6f\x50\x24\x23\x0b\x3f\x1e\x19\xce\x31\xca\x46\x65\xa7\x95\x59\x12\xde\x9d\xe5\x4a\x3c\x02\xc1\xd1\xfd\x36\x44\xd9\x17\x79\x31\xed\x1d\x72\x12\xc5\x12\xd3\xa9\xab\xdd\x7a\xf9\x61\x92\x28\x25\x08\x99\x68\xdf\xa1\x6c\x3f\x82\x1a\xfd\xbe\xb2\x7b\x39\xf2\x60\xe1\x24\xd2\x4e\xaa\xce\x43\x56\x93\xe1\xef\x0c\xe5\x31\xe0\xa7\x96\x6f\xa3\x4d\xa0\x3b\x62\xb1\xe8\x52\x4e\x21\xa3\x9c\x10\x4a\x02\x2d\x03\x7a\x71\x36\x4e\x08\x4f\x85\x8f\x8b\xee\x2f\xd7\xeb\x11\xef\x6b\x1e\x0c\x70\x42\x8c\x02\xd2\x93\x8d\x5c\x04\xe5\x75\xc4\xfc\x88\xc4\xc6\x99\xea\xe9\x08\x79\xf9\xbc\xae\x9a\xf6\x74\x80\xc7\xb9\x92\x21\x27\x29\x73\x7a\xf5\xb8\x4c\x36\x5a\x9e\xfb\x84\x4f\x66\x1d\x49\x75\x24\xa5\x03\x49\xff\xfc\xf0\xa5\x9f\xee\x0b\xbc\x99\xcb\x97\x91\x39\x27\x94\x09\x07\x1f\xf3\xca\xba\xf7\xf0\x7e\x09\x58\xea\xcf\xdf\x60\x71\xe1\x9d\x9f\x40\x39\x56\xd4\x5c\x02\x6b\x53\x03\x42\x45\x0c\x46\xb5\xbf\x42\x4e\xcd\x81\x2c\x7d\xbe\xce\x09\x63\xee\xf5\xfd\xdb\x49\xd6\xaf\xfa\x45\x9e\x87\xbf\x7e\x20\x8f\x00\x21\x0c\xb7\xd5\x33\x4e\xe6\xcf\x52\xb9\xf9\xc7\x0c\xc8\x00\x18\x71\xc1\xda\xf4\xe1\x72\x1b\x53\x8f\x58\xad\xab\xb2\xb9\xa8\x64\x3f\x47\xb8\xcd\xb8\xee\xdd\x1b\x4e\x45\xd8\xfc\x39\x11\x86\xe0\x5d\xd9\x7f\x5a\x44\x1f\xbf\x92\x44\x18\x8d\x48\xbf\xa3\xfc\x78\x38\x21\x20\xb4\x3e\xeb\x96\x73\x92\x09\xa7\x68\xdb\x65\x2f\xaa\xbb\xd5\xe7\x7a\x08\x9c\xc8\x38\x0a\xaa\x62\x8f\xd0\x74\x9b\x1c\x2c\x63\x0c\xba\xa1\x31\x77\x46\x7c\x0e\x91\x32\x84\xe7\xdd\xb1\x04\xe5\x07\xd4\xa9\x2e\xef\xe6\x53\x54\xaa\x18\x93\xaf\x17\x59\x9a\x22\xa8\x2b\xd7\xd5\xe1\xa1\x0f\x15\x27\xae\xef\xcb\x13\x47\x1a\x07\x6e\x71\x1c\x83\x9e\xe7\x84\xb1\xe3\x74\x86\xab\x84\xe3\xae\xfd\xe3\x6a\xbb\xbb\xb9\xff\xb6\x5f\x5d\xfe\xb8\xd9\x3e\x3c\xce\x54\xdb\x38\xd1\x19\x35\xde\x90\xce\xc9\xb2\x00\x2c\x53\x4e\x38\x31\x91\x43\x2d\xd7\x68\x33\x7e\x11\xce\x60\x52\x67\x10\xe7\x81\xaa\x5d\x1c\x75\x3d\x6c\xe2\xc4\x30\x86\xb5\x49\xf8\xa9\x01\x4c\x73\x27\x7f\xde\x94\x6f\x53\x43\x25\x4e\x40\x2a\x3a\x28\xf4\x78\x70\xee\x76\xd2\x8f\x0a\x23\xad\x06\xda\x6f\x76\xd7\x55\x3d\x86\xe4\x74\x87\x81\xf9\xc8\x79\x2f\xe7\x0b\xf0\x34\x0c\x22\x96\x38\x29\xaf\xa3\x2f\x4c\xed\xaa\xf7\x72\xf6\xd0\x6c\xea\xd6\xf4\x2e\xea\xc4\x62\xcc\xe2\xf4\xb1\xbe\x0d\x60\xe5\x5b\x55\xe7\x2d\x8c\xb9\x69\x1c\xf1\x88\xc8\xf3\x84\x9f\xc7\xa2\xca\xdb\x87\xf7\x32\x2c\xb0\x71\x44\x9c\xbe\xfd\xd1\x89\xdc\x9e\x39\x4b\x86\x61\xb1\x20\xce\x83\x28\xf4\x4d\xba\x68\x72\x7a\x67\x62\x02\x06\xdb\xd4\x50\x3a\xec\x64\x50\xfe\x0b\xdf\x15\x47\x16\x5b\xab\x68\xcb\x07\x87\xfc\x74\xb8\xac\xe5\x73\x55\x8e\x11\xf5\x3c\x8e\x13\x46\xbc\x4e\x27\x66\x79\x5b\x68\xdb\x22\x2f\x9f\x17\xab\xa1\x3c\x8e\x55\x2a\x03\xf6\x08\x60\x23\x6b\x79\x80\xb6\x2f\x1e\xf0\x38\xe1\x16\x31\xc3\xb6\x86\xbe\x22\x37\xfd\x6d\x29\x91\x31\xef\xe9\x74\x08\x2e\xf5\xda\xc4\x81\x1b\x39\x7a\xc5\xe2\x34\x8d\x31\x64\x0c\xf5\xfc\xf1\x8a\x10\xa7\x94\x6b\xdf\xde\x70\x3f\xed\x7e\x8c\x5a\x99\x0e\xcd\x5c\x51\xf4\x1b\xb4\x57\x6f\x50\x62\xe3\x22\x5c\x33\x8d\x09\x19\xc2\x81\xee\x1c\x93\x3b\x44\x29\xcd\x3c\x3e\xe6\xe1\xf4\x06\x75\x7b\xaa\x61\x6f\xa0\xd9\x9b\xba\xca\xdb\xf9\xa3\xa3\x86\x62\xe3\x63\x7f\x6a\x2b\xb9\x80\x9a\xe5\x31\x4f\x0d\x42\xcc\x3c\x58\xff\xa9\xf9\x44\xf0\x99\xc7\x3c\x73\xab\xea\xef\x57\xbf\x5f\xe9\xe1\xc1\x0a\x9a\xe0\x8a\xda\xe5\xe7\xa7\xe3\xb2\xe2\x03\x8f\x85\x49\x24\xda\xb5\x38\xcb\xf1\xab\xcb\xa7\xe5\xd7\x3c\xce\x22\xaa\xa5\xef\x43\x22\xad\x6a\x76\xa2\x2c\xe9\x1d\xc6\xfa\xf9\x3a\xb9\x41\x52\x72\x97\xcd\x7b\x17\x39\xf7\xa4\xc6\xb5\xd6\x91\x35\x65\xf8\x8c\x49\xd0\x31\x64\x54\xae\x9b\x9c\x53\xb1\x14\x03\x8e\x95\x19\x38\x1c\xdd\x5f\xc1\x7a\xac\xee\x1f\xf9\x60\xe1\x1d\xee\xac\x66\x02\x09\x9e\xd2\x98\xcd\x48\xaa\x24\xc4\x61\xe9\xfc\x3f\x48\xb8\x1a\x2d\x1d\xd3\x4d\x7a\x3f\x8a\x8b\xdc\x24\xd3\xf5\x35\x36\x09\x55\x9e\x34\x73\x0d\x10\xaa\xa3\xd3\x3b\x05\x24\xc3\x38\xc1\x71\xf4\x1e\x8e\x50\x9e\xfb\x76\x8e\xf0\x17\xfd\xb9\x41\x45\x89\xdf\xd9\x6e\x2b\xd9\x3f\x67\x9b\x38\x81\x8d\xc1\x25\x63\xf9\x01\x5a\xa3\x5c\x7c\x8c\x6c\xff\x73\xd7\x05\x9e\x44\xdd\xbc\xf4\xf6\x50\x55\xb7\x60\x3b\x7a\x03\x36\xe3\x26\x3f\x21\x89\x94\x45\x31\xe0\xed\x6e\xf5\xed\x6a\x4f\xc2\x09\x62\xc9\x8d\x0e\xbc\x06\x0f\xc3\x5a\x0c\xf3\x92\x84\x4b\xe4\x88\x5f\xb4\x50\x0e\x62\x55\x3c\x49\x64\x82\x98\xf5\x2d\x02\xe4\x51\x99\x69\xde\x30\x1a\xbf\xb0\x49\x62\x1c\x15\xad\x67\xb4\x76\x91\xdb\xd7\xbb\x65\x92\x66\x71\x2c\x83\xa2\x8c\x6c\xc1\xd7\x24\x26\x93\xfa\x2c\xb8\xfa\x54\x46\x9c\x27\x34\x16\x08\x49\xf2\xf2\x5d\xbe\xa1\x91\x97\xcf\x8b\xe8\x84\xd9\xc5\xd0\x24\xc1\xd2\x06\x34\xce\xbc\xc7\xfc\x01\xf9\xf3\x4b\x98\xe0\x09\xa5\x0a\x17\xd2\x4d\x7e\x1c\xdb\xc2\xf2\x84\x32\x65\x32\x0f\xe0\xdc\xcb\x53\x5b\xe1\x87\xf7\x17\xa7\x8f\xfd\x71\x00\x94\x74\xe3\x9c\x37\x5e\x97\x2c\x43\xfd\x96\x6b\x70\xc8\xa0\xb3\x34\x04\xaf\x2b\xcc\xb5\x04\x2d\xd7\x07\x21\xf5\x5c\x1e\xaa\xd2\x04\xec\xf8\x9f\x29\xe4\xf2\x84\x6a\x9e\x4e\x78\x27\x9f\x41\x99\x86\x58\xf5\x3c\x09\x4b\x28\x44\xa8\xe1\xb6\xae\x8a\x02\x74\x9b\xab\x02\x3c\xd4\xe0\x57\x85\xdb\xe9\x84\x63\x5c\x30\x35\x02\x6f\x3f\x95\x79\x55\x4e\xee\x28\xcb\x64\x88\x40\x37\x95\xa3\x33\x5c\x02\x18\xc7\x2f\x9b\xbe\xe6\x09\x53\x14\xd7\xa5\x9d\x59\xd4\x8c\xe7\x09\x8f\x1d\x60\xc9\xb5\xdc\xcb\x12\x8a\x6d\x3e\xf3\xd0\xe5\x09\x4f\x22\xc4\x6c\x81\xef\x4c\xc9\xba\xf5\xd8\xf6\xc9\xfc\xe2\x34\xc1\xfd\x0b\x33\xc8\x35\x96\xd1\xc2\x35\x73\x41\x82\x78\xff\x98\xfe\x3e\xbd\x58\x0e\x02\x7b\x36\x6f\x39\xbc\x87\x88\xb2\xfb\x55\x3d\x0b\xd5\x8f\x13\x3c\x45\x76\xfa\xfe\x19\x90\x9a\x87\x17\xe4\x9f\xf9\xdd\xa8\xaa\x91\x64\x54\xa3\xb9\x86\x3c\x1e\xa1\x34\x9f\x2b\xec\xf3\x44\xc6\x71\x12\xbc\xf6\x8a\xaa\x7b\x27\x50\x9f\x6f\x7a\x7d\x52\xc6\x7d\xb0\x90\x17\x67\x47\xbd\x74\x52\x0b\x4d\x3b\x07\x52\x84\x0b\x52\x51\x2f\x7d\x75\x37\xb5\x1b\x9d\x3d\x16\x95\x6a\xc4\x79\x5f\xd4\xf0\x52\x9d\xf7\x4d\xe6\xaf\xea\x2f\x48\x3d\xff\xd7\xbf\x87\x8b\xf0\x9d\xf1\x67\x79\x70\x4e\xc6\xfd\xdf\x65\x12\xf7\xcd\xa2\xc1\x5f\x34\x1c\xd7\x32\xc3\x16\xd3\xfb\xb0\x5c\x42\xe6\x24\x60\xba\x47\xb6\x6a\xbd\xb9\x59\xf3\x60\xcf\x3b\x57\x3c\x01\x63\x11\x94\xb7\x9a\xe8\x98\x4d\xc7\xd8\x88\x38\xc3\xaf\xd1\x2d\xbc\xb9\xfc\x12\x52\xc1\x13\x4b\x1c\x37\x7b\x24\x93\x76\x5d\xd5\x4b\x58\x0c\xf7\x81\x34\x92\x91\xf0\xf5\xb8\xab\xe7\xe7\x33\x61\x1c\x9e\x12\x9a\x2a\x47\x54\x7c\xbb\x69\xb6\xd2\x2e\x43\x17\x78\x4a\x98\x04\x3d\x83\x9b\x8c\xea\x11\x29\x51\x19\x0d\x86\x44\x2e\x6a\x74\x00\x8d\x3f\x5e\xa0\x9c\xae\x22\xfe\x03\xb1\x10\x88\x01\x08\x3a\x5f\x01\x48\x33\x43\xcc\xf2\x34\x89\x54\xc2\x1c\xc3\xb8\xec\x8d\x4c\x79\x9a\xa6\x02\x9b\x2a\x16\x75\x4f\x1e\x9d\x50\x3c\xa6\x3d\x0b\xde\x1b\x3c\x4d\x05\x08\x5f\x08\x9c\x53\x69\xa6\x5f\xc7\xa2\x14\x43\x96\x2e\x85\xc4\x02\x1e\x98\x89\xf2\xdf\xf4\x57\x30\x0d\x28\x26\xbe\xd7\xd8\xd2\x3f\xac\xca\x59\xe5\x60\x7a\x72\x4e\x08\x36\x9a\xba\x60\x7c\xf0\x3b\x0d\x07\xd3\x08\xeb\x78\xb8\xf8\xb8\xda\xb2\x3f\x22\x2c\xc7\x3e\x71\xae\xab\x4d\x97\x27\x91\xee\xd5\xc6\x08\xfd\xa6\x9c\x5b\x7b\xf3\x34\x8b\x13\x5c\x84\x1e\x1f\x6e\xaf\xf6\x9b\xd5\xd3\xf6\x6a\xbf\xba\xbc\xeb\xab\xa8\xa9\xa4\x12\xd9\xc6\xe8\x12\x79\x21\xbb\xb8\xe3\xcf\x09\xdf\xf1\x54\x0a\x27\x3b\x6f\x65\x5e\x34\xd2\xf6\x5f\xa9\xe2\x5e\xce\x30\xa0\x71\xa7\x0b\x70\xaa\x94\x74\xd6\x46\x41\x41\xc9\x85\x45\xbb\xaa\xcb\x31\x3f\x99\x73\x3a\x12\x4c\x8c\xa8\xf2\x70\x71\xfa\xc0\xb5\x7d\x7a\x53\xb5\xd1\x08\xd5\xc2\x1a\xd2\xce\xf5\x34\x3c\xf2\x24\x5c\x9f\x86\x04\xcf\xb4\xae\x0e\xc7\xd3\x68\x12\x69\x10\x3c\xf6\x54\xfd\xbc\xe9\xcb\xc6\xa9\x06\xc7\x79\x6f\x46\x60\xa9\xcb\x3f\x81\x6b\xf4\x1f\x37\x59\x94\xaa\x69\xfc\xd7\xad\xa4\xd5\xa9\xf5\x96\x2f\xb3\x9b\x63\xa4\x63\xbc\xe9\xbe\x08\x31\x3d\x1f\x64\x80\x4d\xb6\x2e\x75\x5f\x3f\x6c\xa1\x28\xc6\xea\x51\x3c\x05\xc9\xd1\xf5\x60\xfd\x51\x9f\xfa\xdf\x6c\x23\xc6\xbd\xa7\x05\xca\xef\x2d\xbe\x16\x56\x12\xdc\x5d\xe1\x67\x5b\x4b\x24\xc8\xd6\xb5\xfc\xd8\x00\x4a\x07\x04\x7c\xc3\xe4\x62\x28\x61\x2e\xa6\xee\x36\x90\x01\x4c\xcd\x29\xe1\x14\x61\x39\x77\xd0\xd6\x55\x59\xf5\x8b\x2d\x8d\x45\x86\x29\x76\x89\x3b\xe6\x83\xbd\xab\x7a\xb7\x79\x4e\xe3\xcc\xa1\x42\xb0\x83\x76\x01\xad\xaf\xa2\x90\x80\xf6\xf8\xe4\x16\xd3\x58\x26\x48\x6f\xdf\xb6\xe6\xe9\xa6\x0c\x14\x80\x30\x27\x68\x42\x0d\xf6\x21\xf2\xe6\xa1\xd7\x06\xe4\x34\x8d\x54\xe2\xa7\xe9\x0e\xe4\xe1\x13\xfb\xa0\xe9\x12\x4a\x53\xe9\xd4\xbc\x1c\x2a\x75\xb6\xee\xd1\xd4\x90\xc4\x99\x79\xd4\x15\x92\xd1\xc2\x01\xca\x14\xee\x01\x79\xb3\x3d\x1d\xa1\x0e\x53\x72\xfa\xe4\x29\x97\x1a\xf3\x9c\xde\x17\x27\x78\x79\xce\xa2\x1c\xca\x2d\x31\x71\x5f\x77\x5a\x15\x45\x6f\x3d\xb9\x7c\x7f\x44\xec\xca\xe5\x38\x05\x9b\x56\xbe\xc2\xa4\x14\x4d\x85\xe0\x58\xb2\xf6\x82\x63\xfb\xab\xbf\xaf\xbf\xaf\xee\xbf\x5d\xed\x1f\x57\xbb\xab\x7e\x90\xca\x50\x00\x00\xe9\x55\x93\x9a\x0a\xcd\x12\x89\x05\xbb\xaa\x18\x5b\xfb\x73\x2a\x63\x89\x5c\xf4\x83\xcc\x1d\x76\x66\x71\xdd\xa4\x32\xb3\x58\xbe\xcc\x9b\xe6\x04\x5f\xc8\xac\x70\x2a\x95\x42\xa1\xbc\xcd\xed\x6a\xb7\xba\x7b\x78\x0a\x14\x4f\x4e\x15\x4d\x51\x37\x66\x65\xde\xba\x48\xcd\x78\xd8\x51\x7f\x98\xc7\x89\x1c\x20\x79\x09\x8b\xc3\x11\x1d\x39\x86\xe3\xac\x1f\x7f\xd1\xad\xbb\xa3\x14\x75\xfc\xa2\x50\x9d\x44\x28\x9d\x19\x64\xb6\x26\xd0\x20\x4e\x75\xea\x49\x5e\xd0\x7e\x87\xe2\x78\xe7\x7e\xd3\x46\xd6\xed\xdc\xf5\x8f\x53\x4d\x39\x52\x9a\xde\x91\xe5\x71\xb6\x7e\x53\x4d\x01\x0b\xa6\x7d\x64\xd0\xad\xcf\xdb\xdd\xc3\x6c\xea\x68\xee\x10\xba\x37\x87\x23\x48\xfd\xd2\x65\xec\xdd\xaa\x50\x9d\xc3\x12\xc2\x07\x64\x9a\x04\xdf\x38\x57\x59\xd9\xab\x8f\x7d\x5d\xbd\xcf\xa6\x9a\x49\x09\x4a\x04\x6f\x6f\xb6\xbf\x8f\xba\x3e\xd4\xd0\x0c\xbb\x01\xef\x55\x61\xe3\x09\xf4\x8b\x77\xa9\x03\x96\xbb\xb1\x7b\xd8\x3b\x26\x70\x0a\xa9\x8e\xdc\x6e\xda\x68\x59\x5f\x56\xfa\xd4\x5d\x67\xb5\xa9\xea\xa1\x85\xd8\xbf\xb4\xa0\x33\xac\xae\x04\xc9\xc4\xbb\x9b\xfb\x9b\xbb\xa7\xbb\xfd\xf5\xd3\xfd\xe5\xcd\xfd\xb7\x70\x4e\x6b\x22\x8c\x1c\x1a\x5c\x03\x6f\xc1\xb6\xab\xf6\x01\xe9\x08\x7e\x04\x8b\x00\x20\x19\x69\x80\x3a\x87\xbc\x9f\x1f\x13\xc2\x13\x67\xc4\x2b\x1c\x3f\xca\xf2\x75\xab\xab\x7a\x96\x34\xb0\x98\x3a\xb4\xce\x33\x3e\x25\xc4\xd5\xce\xbd\x48\x38\x4b\xd2\x04\xc6\x26\xf1\x58\xbe\x0d\xc7\xa8\x91\xe3\xe6\xd2\x3c\x0a\x0e\xc3\x20\xc1\xb8\xfb\xf6\xe1\xdb\xfe\x9f\x50\xbb\x2d\xd1\x1f\x63\x9e\x8d\xdb\x05\x70\x3f\x9d\x1b\x6b\x7f\x44\x82\xe8\xfd\xb7\xaf\xda\x97\xcd\xc0\xe8\x9a\x5e\x22\x93\xc0\x9c\xbb\x66\x0d\xe3\x34\x84\x71\x42\x70\x3b\xf7\xc6\xa9\x0e\x7f\xe6\xdc\x4e\x5d\x0e\x08\xfd\x75\xa0\x4a\x93\x0f\x7f\xe5\xfb\xdc\xb2\x9c\x33\xee\x7b\xe7\x58\xcb\x73\xc9\xc3\x63\xde\xcc\xc4\x69\xe3\x65\x3b\x0f\xce\x04\x89\x90\x68\x90\xeb\x8a\xdc\x0d\xcf\x51\x10\x67\xd9\x75\x07\x45\x55\x8e\x9d\x61\x39\x13\x89\x8d\x1c\xa6\xfe\xa6\xdc\xe5\x73\x81\x01\xce\x84\xd0\xb8\x65\x9e\x1a\xa8\x57\xe3\x95\x8f\x65\x14\x10\x15\x70\x77\x75\xbf\x7b\x78\xdc\xf6\x7f\x06\x23\xac\xef\x1f\xd7\xd5\xe1\xf1\xac\xd7\x37\xbb\x64\x19\x3b\x5d\xbf\x5e\xad\x0e\xb6\xdd\x14\xd0\xfd\x12\xc9\x64\x4a\xb1\xc5\x8b\x54\x48\x59\xdc\xc9\x16\x6a\x99\xcf\xee\x9b\xe4\x09\x8c\xa7\xc8\x55\xfb\xb2\xab\x10\xe0\xd9\xe4\xcf\xfd\x99\x24\x43\xba\x66\x17\x86\x7c\x97\xb5\x59\xcb\xe3\x44\xea\x86\x33\xc5\x9d\xbf\x5a\x0d\xd2\x7c\xec\xaa\xeb\x53\x61\x87\x6e\x36\xd3\x91\xc0\xf8\xc2\xe6\xa5\x2c\x3e\x82\xdc\x07\x67\x3a\xcd\x10\x03\x53\xc2\xbb\x63\xbd\x2f\x6f\x26\x4c\x67\xd6\x95\x8a\x40\x23\xf0\xf1\x33\x4f\x12\xce\x0c\xd7\x28\x07\xd4\xdd\xf6\x5d\x75\x7f\x3a\xac\x9d\x03\xd2\xe4\x45\x67\x10\xa5\x68\x49\x71\x0f\xef\x0b\xe2\x0f\x9c\x41\x2a\xd1\xcf\xf5\x11\x9b\x11\xb3\x3b\x06\x8c\x70\x4f\xcb\x0d\xfe\x0b\x58\xbb\x0f\x3f\xca\x42\x46\xb2\x10\x8b\xf6\x0d\x91\xe5\x35\x91\x47\x5a\x62\xe7\x75\x65\xcc\xc5\x6e\x3d\xea\x52\x77\x73\x00\x63\xa1\xa5\xde\xf1\xe8\xbf\x1c\x66\x2b\xac\xed\x3c\x8e\xe3\x00\xc5\xfa\xfd\x43\x2f\x14\x6f\x79\x0c\xca\xb9\x0d\xcb\xa2\xb8\x74\x05\xe7\xb5\x2c\x0a\x25\xf5\xeb\xe4\x26\xf0\x24\x75\x6c\x94\x67\x67\xf1\xb4\xc4\xe0\xe1\x3c\x81\xc8\x97\xae\x4d\x97\xf5\x03\x56\x2b\xcf\xcc\x56\xe7\x04\x7b\xce\xd3\x28\xc6\x0a\x8c\xa3\xeb\x3d\x58\x8b\x2d\xca\xa7\x63\x51\xc9\x4f\xb4\xd7\x78\x97\x58\x60\xc9\xf1\x6e\x75\x73\xbf\x5f\x3f\xdc\xdc\xef\x37\x5d\xe0\xb0\xfb\x7e\xf5\x38\xb0\xcf\x39\x4f\xc1\x15\x2c\xbd\x82\xe2\x37\xf9\xc9\xce\xce\x29\x71\x8a\xa6\x4e\x19\xce\x41\xf4\xe7\xdd\x43\x4e\x63\x07\x91\xb5\xc5\xa9\x79\xb9\x7a\x5c\xc7\xd1\xec\xaa\x18\xd7\x58\x49\x5d\x3f\xfe\x63\xb3\x7b\xf8\xe7\xc3\xed\x78\x85\xe3\x0c\x0c\xca\x84\xad\xca\x67\xf0\x91\xb8\xaf\x32\x7d\x19\xf4\x71\x1e\x13\x8c\xa8\x5d\x12\x3b\xd0\x75\xfb\x6a\x19\xe7\x49\x82\xbb\x78\x21\x1b\x07\x26\xda\xc8\x40\x9c\xe2\x9c\x6b\x62\xd3\x20\x7d\x56\xbd\x97\xe0\x82\xa4\x9b\xf2\xea\x13\x7e\x0c\xe7\xdc\x28\x6c\x17\x5e\x79\xbd\x13\xd7\xaa\xc1\x6d\xeb\xba\xaa\xbb\xff\x7b\x70\xcb\xc2\x42\x4f\x8e\x8b\xc8\x49\xd8\x7a\xa3\x55\xdc\x85\x7d\x6f\xb7\xdb\xe3\xf3\x33\xe7\x44\xce\x05\x33\x89\xef\xfa\xcc\x95\xa4\xbb\x83\x16\x9d\x93\xbf\x3f\x5c\xde\x86\xdf\x24\x24\xc5\xa9\x56\xd5\x06\x6a\x57\x34\xee\xf6\x87\xc9\x9b\xcd\x85\xb1\x4a\x0c\xb4\xa1\xf3\x76\x30\xcf\x32\x83\xe2\x04\xdd\x7d\x0b\xa7\xce\xac\x73\x4c\x41\x3b\xc1\xb2\xed\x95\xf7\xc6\xfd\xa7\xe1\x0c\x32\x02\x95\x0c\xad\xca\xd6\xc1\x6c\x02\xe5\xe9\xdf\xb3\xfb\x2a\x79\x14\xdc\xa6\xd6\xb2\x7c\x93\x8d\x2b\x15\x8f\xb3\x05\x2e\x8d\xc2\xb4\x1c\x9e\x9f\xbb\xe7\xfc\xda\x2f\x26\x5c\x5a\x8e\x2b\x9f\xcd\xeb\xa6\xdb\x66\x27\x5b\x09\x57\x46\x62\x3e\xf1\xdf\xb2\x25\xd1\xeb\xf0\x57\x23\x65\xf0\xaa\xfe\x02\x80\xc1\xb5\x71\xf4\x3a\x57\xf9\xfd\x55\x95\x35\x7c\x08\x62\xb7\x7e\x54\xcd\x39\xfe\x74\xce\x25\xe5\xdc\xa4\x8e\xfd\xfb\x96\xc3\xbb\x67\x41\x3a\x75\xf9\xe6\xa6\xbc\x9b\xc5\xe8\xe1\x23\x4c\x63\xf1\x6b\x0f\x87\xbc\xbd\xa8\xba\xfd\xc6\x75\xac\xe6\x00\xa2\x5f\x16\xed\xfa\xf1\xc3\x6b\x03\x52\x61\x91\xb9\x95\x3f\x0f\x7d\x63\x85\x5b\x48\x81\xf5\xd8\xe2\x9d\x6c\x5e\x67\xcf\xdc\x5a\x12\x47\xa1\x5f\xf2\x0a\xf3\x56\xc7\xf4\x1e\x89\x28\x81\x8c\x0f\x78\xac\x91\xf0\x03\x17\x11\x48\xc4\xc2\xbf\x43\xfb\x32\x4b\xe6\xba\x28\x04\x35\x65\x6e\x77\xff\xe8\xff\xc4\x5c\x82\x7c\x75\x7c\xa9\xab\x72\x07\x4d\x3b\x71\x93\x9c\xff\xfb\xb9\x7b\x11\x17\xb1\x65\x76\x68\xb1\x8f\xad\x88\xb9\x48\x74\x82\x70\xb7\xc3\x74\xe7\x17\x94\x27\x5a\x06\x08\x64\x5e\x06\x62\x78\x38\x2a\x34\xd2\x9c\x6c\x20\x6f\xf8\x55\x34\x1c\x67\x51\x86\xfc\xce\x43\xee\xbd\x0d\x9a\xdf\xfe\x4c\xd9\x54\x30\xed\xec\xc7\xf6\xa1\x55\xe2\xcb\x0d\x7f\xaa\xfa\x21\x78\xac\xf0\x8d\x3b\x95\x0d\xc8\x62\x6e\x39\x74\x06\x05\x12\x9c\x12\x4c\xd4\xda\x65\x8d\x39\x2e\x38\x38\xd1\x4c\x2d\x0b\xfd\xb7\x53\xae\x5f\x37\x75\x75\xa8\x1c\xff\x6a\xfa\xd5\x22\xb1\xb8\x90\x1c\x5d\xcb\x33\xdd\x17\x27\xfd\xfa\xa1\x4e\x1f\xbb\xc9\x6b\x2d\x84\x96\x41\xc8\x20\xcc\x81\x9b\x7e\x86\x64\x52\x82\x1d\xf5\x2f\x2e\x87\xf4\x56\x48\xc9\x9c\xd9\x48\x29\x03\x87\xe4\x69\x0e\x58\xe6\x42\x42\x86\x51\xc5\xb1\x90\x1f\xbb\x6a\x04\x7d\xf7\xc7\x55\x6c\xb1\x2a\xdb\xd6\x39\x38\x61\xa9\x33\x1d\xeb\xd9\x3d\x52\x46\x43\xe0\xb2\xf7\xea\xd8\x0d\x06\xdb\x8b\xed\x75\xa1\xd3\x38\xe9\x96\xd9\xa3\x6f\x95\xed\x0f\x8f\xc8\xe5\xd8\x14\x9e\x25\xbf\xb8\xb6\x0a\x9d\x3a\xf4\x1e\xca\x65\x61\xb9\x38\x1c\x30\x51\xe2\x97\x51\x44\xde\x2d\xc1\x30\x84\x89\x5d\x31\xe4\xe8\x61\x31\xcd\xc5\xc7\x48\xd1\x35\x9c\xca\x28\x1e\xb0\x3e\xdd\x37\xe0\xa3\x41\x23\xd2\x1e\xba\x30\x3d\x2b\xc4\x0e\x35\x87\xd7\xb4\x72\x7d\xb1\xe9\xdd\x01\x6e\xf8\x14\x20\xdb\x85\x55\x7f\xad\x54\xff\xa6\xd8\x88\x63\xee\xfb\x57\x79\x90\xed\x28\x40\x10\x96\x67\x08\x10\x45\x0c\x63\x33\xc9\x31\x84\xe5\x8a\xc6\xa3\x5a\xc6\x5d\x5e\x7a\xc5\xd5\x9e\xbc\xda\x0d\x02\x7c\x43\xd7\xe5\xc7\x18\x23\x99\x91\xc4\x60\x52\xd7\xb4\xb2\xcd\x35\x86\x92\xce\x50\xda\x3d\xf0\x33\x06\x33\xcf\xe2\xc4\xc1\x47\xf6\xd2\x98\xde\x7e\x6c\xf0\x95\x9d\xce\xb1\x2c\x4e\x29\x32\xf2\xf6\x13\x9d\xb5\xe6\x25\x3f\x2e\x2f\x8a\x59\x12\x11\xd4\x6a\x6d\x5a\xf9\x0c\xb7\x30\x12\x07\xed\x8e\x51\x6c\x58\xbf\xc8\xe6\x25\x74\xe4\x82\xae\x3c\x2a\x93\xfc\x2b\xfe\x77\x28\xc8\x85\x8f\xd0\x08\xd1\xa5\xee\x4a\xa7\x30\x7c\x9e\x25\x1a\x30\x58\x08\xfd\xfb\x5e\xce\x68\xec\xdd\xc3\xb3\x54\xf0\x90\xa8\xaf\xe5\x04\xa5\xce\x33\xca\x52\x13\x50\x0e\x4d\x53\xe9\xbc\xdb\x82\x76\xab\x07\xaf\x32\x35\xf6\x22\x9f\xcc\x86\x8c\x4a\xed\x68\x3b\x2e\x87\x9d\x89\xe4\xfa\x41\x2c\xd1\x58\xb8\xef\xe2\xd8\xab\x9b\xa7\xbb\x70\x45\x8c\x39\xd1\x9f\xe6\x28\x0f\xe1\x6f\xdc\xf8\x1f\xe3\x48\x99\xde\xaf\xbb\x34\x5b\x0f\x09\x7f\xf2\x29\xc6\x9f\xea\x49\x65\xdc\xc6\xc1\x0d\xe3\xb6\x7a\x9e\x3d\x55\x91\xa4\x7a\xdc\x30\x7f\x44\xa4\xd7\xd8\x9f\x49\xfc\x8b\xa4\xff\x9e\x74\x90\x33\x21\x63\xbc\x8b\x45\x7e\xa8\xea\x5c\x07\x18\x4d\x96\xc5\x0a\x3b\xa3\x97\xdb\xdd\xde\xcb\x46\x85\x43\x32\x95\xe0\xea\x6f\xdb\xef\xab\x98\xb2\xef\xb2\x79\x79\xf4\xc8\xa6\x79\x50\x97\x49\x6a\x68\x40\xfe\x77\x6b\x62\x0f\x38\xd8\x56\xa7\x7a\x42\x7d\x0c\x1f\x30\xa9\x1e\x22\xb4\xdb\xdc\x29\x72\x4e\x6f\x83\xf2\x26\xa4\xeb\x0f\x05\xf5\x7a\xa8\x23\x67\x4a\x26\xd2\x93\x43\x1b\x67\x3e\x3e\x86\xa4\x67\x4a\x72\x09\x3d\x0d\xb9\x99\xa3\x6c\x32\x13\x67\x18\x7a\x5f\xe4\x1f\xa7\x02\x26\x9b\xf5\x42\xc2\x9a\x41\x9c\x06\x33\xb2\x7b\x78\x77\x55\xda\x75\x75\x08\x14\x9d\xe9\x35\x43\xe2\xd6\xf5\x67\x68\x2f\xdc\x2c\xdc\xb6\xb2\x69\x73\xdd\x4f\x68\x10\xa9\xd3\xfe\x2d\xe4\x87\x7b\xd1\xc3\x01\x13\x87\x2e\xf5\xdd\xc7\x37\x44\x34\x85\x42\xef\x62\x76\x94\x59\x61\xb0\x63\xdd\xbe\xd4\x00\xdf\xab\x16\x6d\x1f\x2f\x4f\x63\x9f\x02\x9e\x59\xc5\xc5\x88\x2e\x1c\xb8\xa8\x7f\xc8\xbc\xbb\xb8\x11\x7b\x38\x3c\x1a\x19\x89\xcc\x51\x6f\xbd\x62\xfd\xd7\x00\x0e\x19\x59\x83\xae\x4a\xcd\x4b\x0e\x85\x69\x9e\x3c\x37\x83\x4b\x42\x2c\x0a\x77\x14\x37\xbf\x5f\xa1\x12\xd9\x57\x77\x59\x12\x19\xa3\xda\xd6\xa9\x31\xf3\xca\x92\x8c\x09\xe3\x99\x67\xc7\xfe\x0e\x1f\xe7\xea\x71\x93\xc9\x28\x63\x02\xd8\x4d\x50\x27\xb7\xb7\x74\x2b\xe4\x74\x0a\xc8\x38\xd6\x58\x3e\x30\xf0\xb6\x0e\xfe\x0f\x83\xdb\xc0\xf4\x07\x26\xa9\xd2\x6a\xd4\xd6\xbf\x93\x3f\x9d\xb2\xe9\xe2\xcb\x2b\x13\x26\x11\x4a\x88\x65\xf5\x6b\x80\xeb\xa2\x7a\x0f\x0f\x5f\xa6\xb1\xc5\x70\x4b\x9d\x3e\xf6\xcd\x50\x1c\x96\x34\x4a\x99\xf3\xd8\xf8\xfd\x1f\xeb\x47\xf8\xef\x29\xaf\xc1\xec\xaa\x47\xd0\x90\xbf\x8d\x79\x47\x5c\x52\x45\x30\xb7\x91\xc6\x04\x8f\x94\x2f\x73\x08\xc9\x52\x8b\xe8\xb6\xee\xda\x67\x8e\xff\x61\x04\x53\x48\x60\x91\x06\x49\xfb\x57\xa5\xa9\xea\x06\xc6\x9e\xdf\x63\x0d\xc6\xe9\x73\x63\x42\xa3\x8e\xc8\xd5\xc3\xf6\x02\xda\x51\x20\x24\x59\x46\xb0\xde\x77\x0f\xef\xe8\x35\xd3\x3d\x0b\x04\x88\xfb\x88\xfa\x13\x95\x96\x45\x7e\xef\xf4\x2b\x33\x83\x77\xf8\x07\x3c\xc3\xa2\x6d\xe2\x79\x5b\x52\x32\x60\x51\xd0\xd4\xee\x3d\x7b\x26\xfd\x0a\xc9\xa5\xc4\xdd\x64\xff\x06\x0b\x79\xd3\x79\xa2\x22\x45\x1c\x51\x3b\x28\xc8\xfc\x01\xf9\x98\x4e\xca\x65\x16\x25\x01\xcc\xb9\x96\xc7\x2b\x5d\x35\x68\x1c\xdf\x1f\x16\x60\xe2\x91\x08\xe6\x35\xaa\xa9\x9e\x27\x6c\xc3\x17\x66\x59\xcc\x7c\xcd\xe0\xe2\xdd\x03\x88\x50\x24\x64\xdd\x05\x25\xf3\x39\x9e\x59\xe3\xa0\xc0\x95\x9a\x1d\x91\xdc\x3d\xb3\x6e\xf1\xac\xaa\x62\x6c\xa4\xc1\xa5\xb4\x29\x04\xe6\x59\xfb\x50\x18\xb7\x8b\xdd\xc3\xfb\x65\xde\xe0\xe4\xe9\x27\xfe\x39\x57\x42\x2a\x2a\xb0\x56\xe9\x84\x12\xf3\xaa\x5c\x95\x66\x7d\x6a\x1f\xac\x0d\xa7\xd7\x3c\x42\x22\x0c\x1a\xea\x4d\x5b\x24\xd2\x24\x19\xf3\xfb\xde\xb5\x93\x26\x7f\x3c\x15\xe7\x50\xe7\x5f\xfd\xeb\xcf\x06\xc0\x10\x09\x71\x79\xf3\xc7\xf2\x02\x2a\xc1\x46\xd8\x62\x52\x88\xf3\xe9\xef\x80\xcd\x68\xda\x4b\x65\x8e\x40\x73\xfd\xe1\xcc\x09\x07\xc9\x53\x03\x01\x92\x3d\x1c\x95\x29\x0c\x6e\xaa\xfb\x63\x0d\xfb\x5c\x57\x8e\xbe\x36\x5d\x58\x54\x9c\x3a\xfa\xea\xad\x7c\x93\x3e\xac\x9c\x3c\x27\x15\xf3\x18\x1d\x39\xf0\xc3\x53\x95\xfd\x7e\x84\xc2\x34\xe1\x54\xaa\xde\xb1\xea\x17\xf8\x74\x15\x73\x8b\x9e\x50\x2d\x34\xed\x4d\x13\x36\x19\x7f\xfd\x2a\x91\xd6\x79\x9f\x9f\x4a\xd3\x2b\x57\xfa\x63\x69\xa4\xb0\x8d\xae\x9c\x88\xe1\x44\x6f\x6e\x32\x8e\x13\x47\xb4\x92\xaf\xb0\xae\xaa\xd7\x7c\x5a\xbc\x55\x29\xc4\x3c\x1e\xa8\x7f\x17\xe7\xac\x99\xe5\x95\x5d\xa5\x36\x43\x7b\x16\x2d\xcb\x2e\x61\x0d\xd7\x4c\xa9\x93\x61\x3e\xba\x90\xb5\xf7\x3d\x0a\x58\xe5\x7e\x9c\xd4\x41\x4f\x30\xc0\xf2\x83\xe9\x86\x59\x9d\x19\x41\x87\x0f\x19\x43\x53\x8f\xf6\xe8\xc5\x9d\xfd\x31\x16\x01\x3e\xa0\x5e\xc7\xe2\x5b\x2d\xcb\x60\x72\xd5\x0f\x4a\x41\x79\x7d\x69\xa7\xeb\xb9\xb8\x4c\x2b\x26\x15\xea\x7b\x9e\xbb\x8e\x2d\x57\x0d\xc2\xcd\xe6\x24\x45\x62\x54\x23\x2d\x6c\x4f\xaa\xad\xff\xf9\xd7\xeb\xe5\xad\x49\xf1\x58\x05\xdf\x52\x03\xc7\xf6\xe0\xa8\xb8\x2f\xf9\xb1\x99\xca\x29\x4d\x2f\x8c\x67\xae\x84\x55\xf7\x01\x7a\xd0\x48\x0e\x2b\x5d\x37\x24\x75\x34\xca\xd2\xd9\xc5\x4e\xbf\x57\xc4\x0a\x57\x85\xeb\xa7\xdd\xd3\xe3\xea\xef\xe1\x53\x22\xa5\x63\xa9\xac\x16\xf6\x49\xd4\x1f\xe3\x80\x84\xec\x6f\xd0\x76\x2b\x04\x42\xbf\xc7\xbf\x5a\xa8\x24\x72\xf8\x89\x09\x06\x4f\x65\x34\x52\x3e\x58\xfb\xa3\xaa\x5f\xa1\xbe\x6c\x37\xd5\xd9\x9b\x97\x89\x4c\x5a\xa4\x2b\x3f\x7a\xae\x58\xff\x79\xa1\x51\xa7\xea\xf1\xf2\x8f\x71\x95\x58\x49\x46\x83\x14\xfe\x6f\x23\xef\x03\xae\xa4\x95\x22\xee\x45\x8b\x70\x7f\x9b\xbe\x50\x2a\x62\xc4\x19\x49\xa0\x9b\xa0\x6c\xe1\x33\xa4\x5b\xf8\x00\x71\x3a\x1e\x5d\xbc\x81\x8d\xa6\x55\x69\x76\xd5\x44\xe0\x78\xf6\x5c\x15\x71\xe4\x74\xed\xb0\x2b\x4b\x51\x8c\x52\x22\x43\x47\x46\x5f\x76\x9d\x1f\x95\x91\x53\xf4\x2d\xc3\x45\x6e\xa1\xb0\xfd\x4f\x00\x47\xe6\x0b\x24\x8c\xbb\x7e\xe2\x84\x11\x9a\x58\xec\x83\xf6\x52\xaa\xae\x1c\x34\x93\xa8\xe5\x4a\x27\x80\x55\xe3\xee\xed\xf5\x44\xb2\x4f\x89\x77\x4a\xf3\x28\x1b\x72\x04\xb4\xe5\x9c\xed\x71\xca\x48\xc6\x06\x55\xe3\xd5\xdd\xcd\x76\x3e\x40\x71\x8c\xf5\x43\x0a\xec\xfb\x29\xee\x19\xc6\x51\x18\xa5\x05\x92\x58\x2b\xcf\x5a\xde\xa3\x3a\xc3\x6f\x63\xf4\xd7\xbf\xe8\xac\x6c\xac\x0c\x38\x42\xfc\x33\xf8\xf6\xd2\x13\x9e\xda\xad\x10\xe3\xea\x94\x02\x42\xa4\x27\x3c\x62\x96\x7f\xd3\x45\x01\x8b\x40\xea\xd9\x57\x00\x57\x08\x61\xb1\x55\x7d\x38\x15\x72\x53\x83\x76\xc8\x29\x7f\xdc\x76\x49\x7e\x97\x21\x15\x32\x3f\x6c\xbf\xdf\xec\x96\x37\x3a\x1d\x51\x1d\xbb\x32\x45\xd3\x6c\x7d\x5e\x3f\x0b\xfb\x75\x04\x12\x37\xdf\xbd\xa7\x82\x2e\x9f\x89\x24\x51\xe2\x20\x3c\xd0\x36\x0f\x65\x98\xe5\x9a\xa4\x4e\x40\x61\xd0\x2d\xf2\x70\xf6\xdb\x5e\x22\x88\x6b\xc2\x95\x0c\x6c\x6d\x97\xaf\x5e\xc2\xcf\x73\x28\xae\x26\x8a\x6a\x8f\x4b\xfa\xf6\xed\x2a\x50\xc7\x45\x38\xaa\xa5\xb5\x33\x0b\xf6\x07\xbb\x5f\x20\x8d\xea\x38\x51\xd6\x9f\xe8\x38\x21\xa3\x7c\xa5\x33\xc9\x75\x42\x08\x16\x2e\x1e\x8e\x67\x28\x46\x9d\x50\x87\x6d\xea\x8b\x7b\x5f\xef\xb6\x3a\x01\x65\x1d\xc8\x67\xef\x55\x32\xf7\x83\x17\x29\xd7\x69\x4c\x5c\x81\xdf\x75\xd9\xba\xf9\x37\xbf\x1b\x94\x38\xa8\xe8\x8f\xbc\xc9\x55\x5e\xe4\xed\xc7\x25\x1c\x42\x06\xaf\x29\x8d\x52\x3a\xb1\x92\x0f\xa4\xb5\x11\x7e\x89\x7c\xf2\x34\x19\x23\x69\x34\xdd\x10\x27\xa9\x4d\x18\x06\x1a\xb7\x39\xa7\xd6\xe9\x54\xb5\xe6\xa2\xec\x5c\xf3\xc8\xb1\x2d\xbc\xd8\xe5\xbc\xd4\xb1\xc4\x0f\xd4\xdc\xfb\x91\xe6\x65\xde\x5e\xb5\x2f\x97\x30\x98\x99\x4c\x35\x2f\xe2\xe8\x2f\x93\x57\x56\x73\x60\x41\xc1\x1a\x51\x8a\x1b\xa9\x5f\xc7\x54\x22\x3f\x4c\x10\x96\xf9\xbe\xd1\xf2\xa3\xef\xc7\x59\x7c\x43\x76\xbb\xdd\xaf\xb3\x09\x2d\x52\x81\x41\xde\xbe\xad\x36\xfa\x93\x55\x59\x0b\xea\x84\xba\x1a\x68\xcf\xcc\xc2\x16\x43\x00\x2d\x38\x47\x5e\x57\xdd\x20\x9f\xfb\x63\x53\xe5\x9f\xad\xf9\x5a\x68\xcd\xb2\x49\x8f\x7b\x77\x79\x35\x12\x1c\xe3\x5a\x80\x95\x48\x0c\x96\x87\xe0\xe9\xc4\x75\x96\x44\x88\x5d\x85\x5a\xc7\xd1\xdd\xe3\xed\xe4\xcd\xca\x04\x8d\x49\x5f\x38\xd9\xbd\x80\xd3\x45\x9d\x8e\xb1\x59\x90\xaf\xbb\x87\x9f\xa8\xc8\xe0\x05\x7a\xfe\x5a\xcd\x3b\xd9\x5a\x12\x16\xa4\x97\xef\x9c\xc2\x02\xae\x54\xd8\xe9\xec\xd2\xa5\xcd\xec\x69\x49\x2e\x8c\x0b\xad\xb1\x20\x77\x2d\x8b\xe2\x62\xee\x5f\x3c\x1a\x6d\x20\x56\xbd\xd7\x05\x46\x72\x41\x93\x41\x77\x49\x32\x0d\x15\xe4\xbc\xf8\xf0\xfe\xa8\x93\xa6\x9e\x56\x5d\xfa\xda\xbd\x3b\xf9\x01\xce\x2c\x49\xb9\x56\x3a\x45\xc3\xc6\xef\xb2\xb9\xaf\xbc\x4e\x5c\x38\xbf\xd6\x12\x43\xdc\xd2\xf6\x7f\x32\x89\xc5\xb2\x83\xdb\xae\x42\x90\x34\xf6\x53\x0b\x03\x25\x75\xfa\xa9\x75\xae\x02\xf5\xaa\x7f\x6a\x10\x39\xc3\xa0\x7b\x78\xdf\xc8\xa6\x99\x91\x96\xbe\xd4\xf9\xe5\xda\x32\x8b\x3e\xd0\x79\xf3\x03\xbd\xf8\x1c\x26\x36\x9c\xda\x72\x20\xc6\x37\x49\x2e\xab\x93\x2a\xe0\x22\x2f\x0d\x98\x8b\x22\x77\x7a\x0d\x31\x65\x73\xf7\xa8\xd9\xf9\x95\xc4\xdd\xf4\xf2\xee\x72\xd3\xad\x57\xa1\xf6\x6f\x22\xc2\xb0\x55\x8c\xea\x0f\x0f\x76\x5d\x1d\x0e\xa7\x32\xef\x69\xe2\x26\x4a\x35\x27\x81\x04\xe6\x5e\x81\xf1\x0e\x69\x22\x63\xb0\x6c\xb6\x7e\xd8\xdc\xf8\x9e\xca\x57\xd5\x22\x43\xa2\x94\xda\x50\x93\xfb\xd9\x6e\xc1\xab\xf6\x4e\x1e\xa0\x21\x09\xd7\xce\xce\xd7\x2f\x5a\xe1\xef\x86\x24\xde\x76\x6c\x93\xff\x84\x62\x5d\x15\xd5\x14\xd8\x12\xa6\x88\x89\x23\x27\x9e\x8b\x25\xf1\xf0\x90\x4c\x2c\x32\x99\x05\xcd\x88\xe3\x5a\xd6\x93\xa0\xdd\x0f\x4a\x04\xc5\x9a\x0e\x62\xa1\x36\xd5\xbc\xe0\xd1\x8f\x72\xb7\xf4\x5e\xde\x57\x1e\x06\x34\x0e\x3c\x4d\x62\x00\xa1\x76\x3e\x9f\x99\xb4\x34\x67\x67\x02\xe3\x1c\x6e\xe0\xfd\x72\xa2\xa9\xf2\x49\xa0\x69\x52\x12\x61\x37\x61\x5d\x7f\x1c\xdb\x6a\x2b\x9f\xe5\xaa\x86\x52\xce\xec\x07\x4f\x33\x85\x23\x6e\xd2\x58\xe3\x3d\xf1\x65\x73\x57\x3e\x08\x8c\x97\x4f\xbe\x8b\xc6\x46\xb0\xa0\xfa\x81\x78\x9e\x71\xed\xd3\xd0\xd4\x6d\xd4\xd6\x7b\xcb\xae\xfa\x99\x41\x0d\xc5\x0d\xf2\xea\x71\xcd\x63\x82\xb7\xe6\xae\xea\x81\x30\xd3\x59\xc1\xb2\x08\xc3\xb8\x22\x3f\xe4\xe8\xea\x8d\xc8\xec\x3f\xe4\x5b\xbf\xfe\x19\xa6\x8d\x8b\x72\xa4\x5b\xb4\x26\xa9\x9a\xe1\x91\x45\x48\x58\xae\xab\xab\xd2\x79\x58\x86\x43\x82\x38\x1f\x3b\x75\xfa\xc0\x25\x69\x71\x55\x36\x22\x21\x9e\x28\x5b\x3a\x4e\xc0\x27\xfd\xef\x30\x3c\x55\x48\xbc\x43\xd8\xc6\x36\x7f\xde\xb6\x27\x75\x1e\x10\x87\xc1\x56\x63\xe1\x0f\xc2\x66\xb2\x85\x76\x85\xe0\xfc\x11\xa3\x61\x7a\xd7\x33\x01\x78\x43\xfe\xf6\xb4\xda\xde\x84\x5f\x92\x29\xa7\xab\x70\xfd\x77\x57\x95\xf5\x7f\x96\x84\xd0\xc1\xc0\xea\x6a\xf7\x3d\x5e\xe0\xad\x18\x69\xa3\xcc\xb9\x47\xb7\x2f\x93\x79\xaa\x22\x19\xbb\x34\xf9\xc3\x29\x4c\x35\xab\xd2\x6c\xc7\x94\xa4\x49\xa5\xe0\x93\x1b\x62\x12\x27\x8a\xfc\x03\xea\xd3\x61\x72\x7e\x43\x09\x76\x2b\xaf\x36\xdb\x8b\xa1\xbf\xdd\xfd\xd9\xc1\xf3\xfb\xb4\x7a\x2d\x8f\xfd\x41\x45\x18\xf5\x18\x95\x9b\x5d\xff\x57\x2b\xb8\x6f\x3c\x75\xbb\x57\xd8\x19\xfc\x51\x88\x78\xea\xa3\xcb\xfb\xca\xcc\x43\x21\x03\x89\xc2\x15\x56\x1a\xe3\x01\x2e\x21\x62\x99\xdd\x7a\x4b\x34\xce\x68\xdd\x7d\x0d\x6a\x64\x07\xf2\xfe\xa7\x54\x11\x88\x0c\x4d\xe5\x60\x70\xec\x54\x1b\xc2\x4f\x05\x12\x3b\x70\x15\xc8\xba\xf8\xb8\xc8\x6b\x57\x8b\x78\xec\x35\xbc\x39\x10\x4e\xb0\xc8\xb9\x79\xbc\xf9\xe7\x95\x77\xff\x18\x8e\x25\xa9\xb7\xd0\x0c\x0c\x83\xe9\x97\x13\x43\xa9\x8f\x05\xbf\xc9\xc3\x90\x71\x0f\x23\xe2\xc8\x51\x53\x8e\x55\x3e\x2f\x21\x43\xcc\x84\x30\x63\x2f\xb2\x31\xfb\x00\x62\x4e\x94\x0f\x1a\xfe\x00\x78\x2d\x3e\xbc\x32\xc3\x46\xd6\x6d\xae\xf3\xa3\x2c\xe7\x84\x06\x88\x25\xc3\x75\xef\x1b\xb4\x5b\x28\x8a\xd0\x17\xf4\x56\x25\x61\x90\xca\x50\x6e\xb5\x77\x3c\x59\x3f\xdc\x6d\x56\xf7\xff\xd8\x3f\xdd\xdf\x3e\xac\x7f\xdf\xaf\x76\xfd\x48\xe3\xbc\x4a\xfe\x07\x75\x75\xd3\xbf\xf0\x90\x46\x14\xfb\x56\x25\xfc\x9c\xc8\x1a\x41\xca\x04\x42\xd4\xda\x6a\x8b\xb3\xb7\xff\xbb\x31\x36\xee\x13\x4e\xef\xc7\xb6\xb8\x16\x40\xea\x0d\x63\x6f\xee\xaf\x6f\x6f\x7e\x84\x13\x50\x62\x12\xd1\xe3\x0a\x6c\xfe\xdc\x0c\xb8\xa4\x30\x84\x27\x98\x24\x07\xbc\xf0\x10\xd2\xff\x9e\x97\xcf\xdd\xfe\x79\x4e\x51\xfe\x8c\x34\xf7\x29\xde\x66\x00\x00\x01\xcd\x08\x52\x70\x83\xd2\xc9\x57\x60\x7b\xa0\x0a\x74\x12\xd8\x18\x63\xcd\x9e\xe9\x30\x16\xc5\x89\xaf\xc3\xdc\xac\x1f\xe4\xc8\x55\x7c\x94\x9f\x01\x8b\x89\x72\x8e\xb2\xd8\xdf\x1f\xbf\xf0\xc0\xb2\x18\x5f\xc4\x46\x76\x81\x44\x37\xcd\xe7\xcc\x0a\xe0\x69\x8a\x34\xa5\x02\x64\x97\xd2\x7e\x93\xc3\x73\xea\x12\x67\x24\x5d\x74\x0f\xd5\xb3\x42\x67\xea\x61\x1c\x38\xd8\x38\x1d\xea\x90\x9f\xfc\x62\x41\x74\x88\x35\x2e\x4e\x79\x61\xc6\x3d\x8c\xe9\x4b\x20\xb8\xf3\x9b\x3c\xc8\x9f\x5b\x59\xc0\x14\x00\x0f\x19\x4b\x30\xc6\xf1\xdb\x66\xaf\x30\x7a\x66\xc3\x37\xfb\xfe\x2c\x8b\x11\x57\x61\xaa\x47\x50\xa7\xfe\x9d\x92\x24\x31\xfe\xb2\x7c\x02\x80\xed\xfd\x6b\x80\x45\xdc\x06\x48\xad\x9d\x34\xb1\x6c\x01\xb1\x8e\xfd\x89\x2c\x58\x1d\x30\x0c\x41\x65\x2d\x1c\x54\x82\xd9\xc1\x99\xdd\x51\x16\xc6\xba\x68\xcb\x19\x34\x68\xe1\x56\xeb\xde\x9f\x2f\x6f\x5f\x6e\xab\xf3\x48\x7e\x12\x6c\x81\x16\x46\x38\xf2\x7c\xbb\xad\x74\x2e\x0b\xdf\xae\xda\xbc\x7f\xe6\x69\xd3\x7f\x10\x30\x71\x51\xfd\x75\x6b\xc5\x70\xe9\x6f\x83\xdd\xb8\xff\xbb\x89\x08\x89\x27\xc6\xd0\xd7\x08\x84\xb4\x50\xcf\x0c\x9c\x39\x40\x94\x60\x51\x0b\x11\x65\x58\x54\x3e\x27\xdf\x03\x44\x12\xf3\xb0\xb9\x4c\xd0\x4d\xe9\x50\x9a\x9f\x4c\x2a\x88\x33\x84\xee\xae\x1f\x6e\xee\xb7\x01\x25\x1b\x2e\x12\x14\xa7\xbd\x08\xf4\x1d\xb4\x2f\x95\x59\x5d\xdc\xf4\x47\x8d\xb3\xc1\x6f\xa1\x69\xf7\xb6\x3a\xd5\x37\x25\xe2\x63\xaf\x65\xd1\xc0\xd5\x7f\x6f\xab\xfe\x25\x00\xeb\xe8\xda\x48\xa1\x79\x2a\x9b\xd0\x73\x09\xc7\x6d\x44\xa4\x93\x59\x2b\xa0\x85\x47\x78\x3e\x7f\x8f\x2d\xa5\x88\x51\xe9\xb6\xf5\xaa\xfe\xc5\x63\xb7\x51\xe2\xcc\xa4\xbb\x5d\xc0\x23\x96\x43\x13\x39\x8c\xe0\x4e\x22\x74\xfd\x22\x51\x84\x77\x7c\x3d\x96\x18\x97\xfe\x1d\xf2\xd2\xbf\x3b\xd7\x55\xed\xe7\x40\xd8\x06\x6d\xcc\x53\x11\xf0\x6e\xf9\x4f\xa8\x77\x1f\x47\x18\x0e\x0a\x17\xdb\x78\xbd\xe8\xaf\x48\xee\x93\xc7\x68\x13\xc3\xf1\x59\x23\x49\xf3\xf9\x34\xfb\xa5\x67\xa4\x84\x4f\x7e\x7f\x62\x0c\x0a\xdf\x78\xe4\xc1\xaf\xc4\xa1\xfc\xa7\xd2\x28\x49\x65\xb0\x59\xcd\xdb\xbf\x4a\x03\xdb\x16\x64\xb7\xe7\xdd\x94\x6e\x56\xfd\xa2\xa7\x63\x29\x73\xf6\x27\xcf\xd0\x6e\x65\x79\x83\xb1\x27\x56\x43\xc6\xf1\xb1\xa5\x5c\x25\xae\x56\x3d\x5e\x46\x2d\x23\x12\xb5\x01\xbe\x4b\x95\x0f\xf7\x99\x31\x9e\x05\x3c\xe5\x4b\xb7\x03\x2e\x9a\xe3\x4c\x5f\x44\xcb\x98\xd3\x1d\x51\xd0\xb4\x08\xc1\x3b\xb5\xce\xc1\xab\x3f\x2b\x07\xd9\xab\xb9\xa3\x20\x2b\xae\x26\x4b\xa9\x91\xe5\x24\x92\x41\x97\x66\xd0\x9b\x0a\x07\xa5\x65\x2e\xd2\x96\x85\x19\x62\x20\xcb\x55\x82\xbc\x79\x44\x6b\xf9\x06\xf9\x2c\xb6\xb0\x5d\xea\x33\x76\x35\x9e\x64\x87\x56\x28\x11\xc4\xb6\xbb\xdc\x72\x7d\x6a\x2b\x6b\x47\x6b\xa2\xcd\x68\x86\x94\x71\x59\xb4\x50\x6f\x00\xea\x5d\xd5\xfd\xaf\x73\x83\x3b\x16\x52\x8f\xf7\xc5\xb9\xf0\x25\xb7\x99\x88\x70\x92\x0c\xa5\xd2\xc5\x6a\x90\xcd\xa4\x74\x86\x54\x27\x93\x23\x53\x75\x76\x58\x27\x98\x52\x63\xca\xbd\xaf\xec\x7e\xdb\xca\xd7\xfe\x1a\x65\xc4\x08\x0c\x5b\x9b\xdf\x64\xc4\x6c\xd6\x4b\xe2\xa4\x9c\x6f\xd6\x0f\xdb\x13\x1a\xf2\xf4\x9f\x27\x1a\xed\x02\xe1\x0d\xeb\xee\x83\x71\xcc\x17\x9a\xc8\xa3\x9d\xdd\x4a\xea\xea\xc1\x77\x79\xd9\xbd\x0b\xfd\x69\x2d\x70\x33\x11\xf3\xef\xf5\xd9\x97\xae\x4f\x45\x0a\x7a\x76\xa1\x97\x9a\xf2\x87\x74\x4c\x90\xf8\xf3\xec\xc5\x81\x9a\x5b\x28\x9f\x7b\xd5\x19\xab\xd3\x24\x1a\xbb\x9b\x4d\x9d\xdb\xb8\xd5\x22\x8e\x03\xf5\x55\xd6\x23\x90\xe7\xec\x2e\x1b\x65\x31\x42\x41\x15\x66\x07\x15\x31\xd3\x97\x0a\x80\x53\x5f\x69\xfa\x86\x90\xac\x62\xd5\xb6\x75\x80\xc6\x8d\xf2\x66\x6b\x99\x63\x9c\xaa\x2e\x8a\xb8\x59\x46\xf5\x88\x88\x10\xe2\x3c\x11\x2a\x44\x4c\x4c\x8b\x47\x22\x22\x71\x84\xbf\xfb\xa1\x32\x05\xa8\x89\xe6\xb1\x88\x48\x1a\x69\xd9\xdf\xaf\xdc\xc0\xa6\x00\x33\x53\x73\x12\x11\x61\x1a\x5f\x91\xc0\xab\xbf\x04\x9d\x1f\x64\x11\x80\xbf\x0b\x6b\x94\x88\x88\x48\x83\x98\xdc\x3d\xbc\x9f\x67\x86\x22\x8a\x69\xc4\x7d\x9b\xf3\x5b\xfe\x06\xe5\xa3\x0b\xca\x06\x03\xe0\xde\xcb\x33\x7c\x80\x33\xac\x57\xf4\x6a\x31\x32\x37\x0f\xa7\xaf\xe1\x46\x22\x4a\x78\xec\x25\x2b\x11\x38\xd6\x67\xe8\x22\x4a\x54\x8a\xd1\x83\xab\x3f\xbb\xec\xfd\x57\xba\x2f\xb3\x93\xa7\x69\x82\x4f\x3b\x98\xd4\x5c\x6c\xef\x96\xec\xd4\x97\x9d\xbb\x44\x94\x4a\x16\xfb\x95\xc3\x16\xf2\x39\x5c\x58\x0a\xae\xce\x82\x0c\x01\x9c\x48\x77\x39\x4a\x19\x0e\x6e\xf5\xdd\x20\x22\xc7\x5a\xee\x17\xce\x5f\x7c\x38\xec\x64\x39\x1c\x4e\x60\x5d\x95\x25\x7a\x7f\x2f\xb6\x6c\x45\x44\x55\x84\x41\xc9\xfd\xfa\x71\x32\x3f\x58\xec\x6c\xe9\x94\x34\xcf\x50\x8f\xa1\xac\x22\x62\x32\xc2\x37\xde\x80\x2e\xf2\x12\xd0\x85\x00\xbd\xed\x67\xcf\x99\xa9\xde\x14\x7c\x53\x55\x05\xae\xdf\x4d\x38\x09\x8f\x39\x06\x00\x5e\x5f\xb8\xff\x38\x09\x9f\xe6\x69\x0a\x7e\x96\x60\xb8\xba\x6a\x1c\x03\xca\x1f\x16\xca\x62\x05\xdc\x17\x80\x9b\x8b\x0f\x67\xbc\x15\xde\x7b\x11\xc9\x34\x41\x70\x86\x92\x0d\x8c\xb4\x75\x44\xa4\x88\x75\xc5\x6b\x14\x25\xe9\xcf\xa8\xb8\xfb\x59\x41\x07\x72\x2d\x47\xbe\x56\x5e\x4e\x7b\x79\x32\x28\x91\x45\x66\xa2\x57\x71\x26\x6a\x29\x22\x95\x11\xec\x1b\x5c\x82\x3a\x3d\xaf\xb1\x60\x34\x1f\xc0\x91\x98\xe7\x30\xd6\x5b\x54\x13\x59\x00\x7b\x88\x48\xe9\x84\xd8\x91\x04\xf9\xa6\xea\x1f\x8d\x66\x3a\x68\xb2\xb8\xdc\x0c\xd7\xe4\x7e\x6e\x98\x44\xe1\x5a\x76\x90\xe5\x49\x16\x28\x2e\x31\x48\x74\x05\x30\xd9\x62\x92\x2a\x22\xc3\x69\x94\x86\x68\xaa\x74\x01\xfe\xb8\x26\x26\x22\x88\x2d\x2a\x6f\xdf\xca\xa6\xed\xc5\x5c\xaa\x3a\xac\x85\x93\x1f\x41\x22\x1f\xca\xac\x9c\x65\xed\x71\xa8\x5c\x9f\xf5\x77\x05\x89\x92\x88\x7b\x7e\x91\x37\x88\xde\xd7\x0e\xf0\x16\x7e\x1a\x89\xb8\x48\xc7\x7b\xb1\x2c\x8a\x6d\xae\x8a\x51\xff\xd2\x0f\x24\x2c\xe5\x7a\x9c\x33\xe7\x53\xc2\x92\x20\x44\xda\x54\x0e\x32\xe4\xf2\x67\xf8\x0e\xa2\xdd\xc2\xd5\x82\x3c\x90\x09\xd6\x47\x90\x98\xb1\xa4\xbb\xb5\xe5\xca\x6f\xc2\xfd\xed\xf4\x03\x12\x23\xa4\xab\xb8\x7b\x41\xc4\x5d\x75\x37\xaf\x8e\x08\x92\x40\x82\x5b\xfe\x8b\x2c\xde\xba\xf4\xf1\x43\x07\xd0\x93\x20\x69\x0a\xe8\xc3\x79\x91\x17\xc5\x77\x28\xeb\x8f\x9e\x41\x12\x06\x50\x57\x09\x39\xd6\x95\x92\xae\x01\xd8\x1f\x62\xa4\xe7\x52\x4e\x02\xed\xee\x90\xd3\xee\x0a\x6e\x6b\x3f\xbf\xc9\xe6\x5c\xd1\x5a\x10\x9a\x78\x1a\x1b\x8c\x89\xbf\x82\x50\x66\x32\xe7\xc5\x31\x2b\x38\x8b\x39\x36\x67\xee\xd0\x11\x4e\xa0\x35\xc8\x10\x51\xa3\xec\xc9\xb5\xa3\xfb\x3d\x94\x17\xf0\x22\x9d\x33\xc0\x23\xbc\x2d\x89\xe4\x4f\xf8\x0d\xfd\xbc\x09\xde\x55\x3d\xd2\x3c\x89\xa7\xff\x19\xbe\xd9\xb8\xbd\x6a\x7b\xb5\x7e\xb8\xbf\xdc\x6f\x9f\x36\x9b\xdb\x7f\xf4\xbf\xcb\x88\x24\x64\xf3\x08\x40\xd8\x81\x3c\x3c\x95\xce\xf6\x78\x8c\xd1\xf6\xe3\xb9\x4e\x30\x44\xda\x1f\x2a\x93\xdb\x8f\x5d\x75\x7c\x3a\x9e\xab\x7a\x0b\xc2\x8d\xc2\x59\x14\x10\xe0\x25\x82\xf2\xce\x1a\xaf\xa3\xc2\x8b\x20\x99\x89\xc7\x9f\x79\xac\x54\xb5\x5c\x84\x10\x44\x26\x56\xa7\xa1\xec\xf2\x25\xef\x58\x10\x99\xda\xd8\xdb\x3d\x98\x6e\x83\x5c\xac\x3c\x7e\xf2\x35\x40\x4d\x14\x88\x69\x85\xb9\xed\xa2\x87\x7a\x36\x99\xa5\x4d\x4c\x37\xe9\x5e\xf3\xb6\x75\x02\xd6\xbb\x2a\x20\x51\x67\x37\x45\x25\xce\xa2\x1d\xf5\xe3\x27\xd3\x4b\x31\xea\x21\x5b\xf5\x21\x47\x85\x05\x59\x42\x79\xe6\xbb\xef\x47\x6b\x26\xb9\x43\x52\x8e\x0c\x4e\x04\x31\x89\x32\x34\xf0\x78\xbb\xe4\xd5\x6f\xfd\xab\xe5\xa6\xa9\x20\x46\x39\xd6\xb0\x13\xba\xe8\x26\xe0\xf9\x3a\x01\x86\x20\xe3\xf9\x1f\xd0\xae\xca\xaa\x7d\x81\xfa\xa9\x81\x22\x78\x55\x86\xaf\x06\x9b\x06\x28\xd9\xca\x31\x37\x2f\x65\xff\x5a\xda\x8c\x62\x48\xb8\xba\xbd\x7d\x58\xef\xb7\xeb\xfe\xef\x8a\xc7\x5e\xe6\xe4\xb1\x6f\x9c\xf4\x9b\x27\xb1\x5a\x61\x2b\x68\x75\xac\x8a\xa2\xea\x96\x80\x01\x21\xf9\x65\xdc\x12\x47\x11\xcd\x6c\xef\xf0\xea\xfd\xe2\xaf\xab\xda\xc7\x19\x8b\x3d\x19\x11\x47\x9c\x29\xe6\x57\xc4\xf5\x83\xc7\xc4\xfe\x36\x1b\x93\x39\x60\x72\x88\x90\xdd\xe2\xdf\xe3\x7a\x46\x72\xab\xd3\xcf\xc5\xa9\x4b\xcf\xdc\xcb\x87\x16\xd4\xdb\xd5\xad\x27\x17\x88\x38\x36\x11\x4a\x65\xbd\xc0\x4f\x3c\x6d\x55\x14\xae\x80\x1f\x06\x50\xab\x71\xf3\x75\xca\xe1\x93\x48\x25\x66\x24\x8b\x03\x95\xd5\xd7\x91\xeb\xfc\x7f\x93\x8a\xf5\xec\xfe\x30\x99\xc6\x4e\x0f\x42\xed\x75\x65\x72\x0d\x16\x15\xa8\x17\x13\x4f\x11\x33\xc8\xb0\x6f\xf8\xb4\x5b\xc7\x77\xff\xd8\x85\xef\xe5\x84\xe3\xec\xf9\xe6\x6a\x47\xdd\xfb\xfd\xb7\x01\xc0\x14\x06\xb1\x0c\xf1\x1e\x26\x38\xed\xc2\xe7\x4e\xea\x22\x16\x9c\x60\x82\xd3\xa7\xb7\xce\x85\x7c\x76\x4e\x21\x9d\x29\x2f\xb6\x89\x76\x93\x44\x58\xc4\xc2\xa6\xd2\x3b\x04\x55\x6f\x33\x7e\xfe\xb2\x98\x82\x88\xb3\x44\x4a\xf0\x7a\x85\x63\x40\x7d\x38\xcc\x08\x0c\x7b\x87\x0f\xe4\x3f\xf9\x05\x99\x4a\x10\xa4\xb5\xab\x0e\xaa\x2a\x64\xb8\x2a\x19\x29\x54\x5e\xf1\x90\xb4\x51\x5c\xb1\x2a\x8a\xd9\xd7\x49\x70\x36\x9b\x85\x6c\x1c\xc2\x7e\xff\x26\xbe\xcb\xe6\x65\xef\x87\x85\x73\xaa\x98\xeb\x2c\xdc\xff\x43\x3e\xc5\xe5\x8a\x58\x6b\x40\x6f\xa9\xfd\x51\x7e\x2c\x29\x24\xfb\x68\xcf\x8f\x36\x89\x44\x3c\x9c\x2c\x0a\x0c\x44\x9d\xb5\xd8\x99\x0b\x88\x88\x0d\x25\xd0\x83\x70\xef\xbd\x5d\x70\x38\xc6\x0d\xf6\xcc\xf6\x87\xbc\x9c\x6d\x1c\xb1\x91\x29\xc2\x8f\xd5\xe9\x63\xf8\x80\x65\x89\x4f\xee\x9a\xd0\x07\x9d\x96\x36\xc3\x38\x25\xdd\xae\x53\x23\x45\x7b\x57\x3d\x56\xc5\xc4\xa0\x5d\x24\x91\x60\xc2\x57\x52\x36\xf5\x52\x44\x99\x44\x86\x22\xd5\xd1\xa5\x4a\x8f\xd0\x7d\x5c\x0f\x78\x58\x91\x44\x10\xa3\x10\xb3\x3a\x79\x1c\xe4\x7c\xe1\x4d\x22\x60\xa1\x8c\x7f\x5d\x03\x20\x7a\x03\x03\x9d\x4f\x0d\xf8\x44\x12\x59\xe7\xa2\x84\x51\xec\x6d\xb7\x5d\xf9\x03\x44\x68\xe5\xb5\x24\x6e\xcc\x4e\x96\xaf\x41\x76\xd6\x1f\x4f\xa2\x98\x39\xa9\x2d\x24\xc2\xbb\xca\xd7\x3e\x8e\xf6\x7f\xed\x02\xdb\xe0\xdb\xde\x8d\xd3\x18\x31\xb9\xe9\xb9\x72\xee\x2c\x2e\x2e\x9a\x5e\x49\x42\x1d\xc3\xd1\xd5\x77\xdc\x7b\x78\xd6\x85\x10\x49\x22\x92\x90\xb6\x3d\xca\xb2\x3a\x8c\xad\x58\xbb\xa3\x9c\xb2\x51\x64\xb9\xaa\xd5\x88\x8f\x21\x92\x44\xa7\x41\xa9\x12\x67\xf9\xc5\xc7\x45\x6e\xc6\x38\x13\x91\xb0\xcc\x11\x8e\x7a\x3d\x6c\x72\xd5\xbe\x6c\xc2\xbc\x4e\x98\x75\x96\x72\x8d\x2c\xa0\xc1\x46\xc7\xec\x77\xf0\x88\x32\x8f\xf1\x32\xbe\x6f\x3e\x7d\x4c\x9c\xbb\xde\xed\x7e\xbf\xcf\x9d\x85\xc9\x12\x30\x6d\xf6\x19\x01\xe0\x57\xf6\x8b\xaa\x2a\xe2\x70\x35\x1c\x62\xd4\xeb\x75\x7b\xe4\x83\xbd\x85\xe7\xfe\xb7\x8a\x4c\x38\x33\xcf\x53\xbb\xab\x7a\x09\xb5\x80\xc2\x43\x53\xf5\xe9\x95\x0b\xe3\x3a\xb0\xaa\x90\xfa\xf5\xac\x7a\x2e\x12\x49\x28\x04\x87\x77\xb7\xb7\xcf\xb9\x3a\x22\x91\x71\xa4\xe2\x99\xd2\xda\x7c\x08\xd3\x18\x22\x87\x55\xf4\xba\xaa\xaf\x7e\xba\x96\xc5\x27\x48\xea\xf0\x41\xd1\x37\x51\x46\x54\x28\x7f\x50\x45\x29\x92\xe6\xba\xd3\x14\xe1\x7c\x43\xbf\x55\x24\x8a\x48\x0f\xb7\xb9\x29\x37\xb2\x69\xae\xf3\x62\x6e\x80\x2a\x12\x25\xa3\x60\x05\x7f\x91\xb7\xba\xca\xcb\x8b\x3a\x37\xcf\xf3\x9f\xa0\x45\x8a\x6a\x35\x77\x37\xf7\x53\x35\xa3\xee\x90\xc4\x14\xf6\xe9\x18\x8a\x74\x0b\xee\x5b\x22\x31\x3e\x92\x6f\xac\xfe\x02\x3b\x23\x12\x93\x52\x35\xa0\xe0\x5d\xf1\x2d\x1c\x12\x4e\x79\xa4\x2a\xe1\xa5\x3a\xf5\x7f\x86\x24\xc3\x57\xe0\x35\x2f\x8a\x4d\x15\x44\x63\x44\x02\xdc\x69\xe3\xf9\x3b\x03\xb2\xf8\x67\x3e\xce\xf9\xc2\x30\x99\xa0\x89\x8f\xca\x4b\x83\xf2\xbe\x58\xa9\x1c\x5e\xc5\xc9\x8c\x01\xb0\x28\x8f\xa2\xab\xc3\x21\x2f\x9f\x0b\xa8\xb7\x50\x14\x8d\x5f\x2a\xb6\xbf\x3f\xa1\xe0\x68\x5d\x3d\xca\x56\xde\x94\xcf\xf5\x02\x63\x66\x56\xe8\x5f\xba\x07\x96\x28\xe2\xca\x93\xcf\x35\x92\x46\x3f\x6f\x79\x8a\xc4\x26\x04\x6b\xd6\xba\x2a\x9b\xd3\x3c\x41\x48\x2c\x8d\x44\xa8\x87\x74\x0b\xd7\xd8\x18\x4b\x24\x96\x65\x08\x9d\xfc\xbe\x19\x87\x8f\x89\x95\x19\xca\xff\x61\xb5\x18\xe5\x32\x96\xb7\xd7\x34\x22\x16\x35\xd0\xff\xd3\xcd\x9b\x6e\x83\x38\xe7\x81\x87\x91\x89\x34\x69\x1f\xcd\xb5\x33\x47\x4b\x91\x92\xc8\x62\xe7\xe5\xa5\x8b\xd7\x7d\x53\x7b\x52\xbe\x4a\x49\x26\xc1\xf4\xcb\xd4\x10\xe3\xb5\xf2\x39\x00\x68\x44\xda\xc5\x0e\xdc\x21\x34\x5a\xf8\x39\xca\x53\xd3\x6e\x73\xf3\xa0\x28\x74\xfa\xcd\xcb\xe7\xd5\xb8\xef\x3b\x99\x14\x69\xa2\x12\x94\x3e\x0a\xcb\xaa\x2c\x42\x06\x1d\xce\x97\x92\x18\x93\xe6\x15\xbd\x1c\xdf\xbb\x14\x39\xb0\xff\xef\xff\xfb\x7f\x7f\xcb\xef\xb0\x15\xeb\xc3\xe4\x5f\xc2\x36\x45\x9a\xda\xc4\xe1\xd8\xbb\xbb\x7e\x31\x47\x84\xfa\x41\x34\x73\xf6\xe5\x50\xea\xca\xfc\x22\xf0\x4e\xa9\x49\xac\xf0\x69\x99\xd7\xd3\xbd\xfa\xd9\x42\xd9\x38\xab\xb9\xde\xab\xb1\x1b\x99\x46\xe3\x02\xc5\x6a\x3a\xe5\xfc\x28\x66\x29\xf5\x65\xd6\x9b\xc6\xa1\x2f\xb7\x30\x26\x43\x8a\x94\x4b\x8e\x89\xf9\xb9\x03\xc7\xf4\xd2\x04\xc9\x02\xbb\xe2\x7b\x55\x37\x30\xdb\x1c\xbb\x1c\x0c\xfb\x68\x57\x05\x1c\xf3\xe7\x5f\x1b\x38\x7e\x56\x41\xfd\x72\x97\x49\x85\x22\x92\x8e\xdc\x95\x96\x6f\x63\x46\x18\xba\x3d\xf6\xfc\xda\x6a\xfa\xab\xe6\xc5\x85\x34\x13\x3c\xee\x7e\xdc\xde\x42\xab\x5f\x70\x51\x41\x9f\x09\x54\x79\x9a\x5e\x81\xf2\x2c\xd9\x06\x5a\x17\x25\x7d\xe1\x8a\x25\x52\x95\x71\x6c\xd2\x63\xda\x31\xae\xe4\xcc\xc6\xe9\x34\xc2\x25\xf1\x11\xc5\x16\x17\x16\xa1\xe5\x1f\xaa\x05\xc3\x44\x36\x90\xde\xa7\x93\x20\x54\xc6\x52\x9d\x09\xe4\xa7\x38\xfd\xba\xa0\x5f\x33\x3b\x95\x22\x88\xc2\xbb\xcb\x8d\x29\xba\xc8\xac\x8f\x84\x53\xa3\x5c\xd5\x0a\x0b\xce\xa3\x0d\x2b\x35\x26\x12\x3e\xe3\xf3\x04\xbb\x91\x4b\x60\x77\x38\xc5\xf5\xbc\x79\xa9\x54\xf5\xbf\xbc\x98\xbc\x76\xa0\x63\xd4\x7c\xa9\xca\x8d\xfc\xa8\x4e\x9f\xa4\xd8\x29\x68\xe7\x07\xd6\x05\xf3\xdf\xa0\x8c\x7a\x53\xfd\x59\x50\x93\xda\x54\xe1\xca\x58\x56\xdb\xb6\xaa\xa1\xd9\xf6\x8b\x66\x6a\xa9\x44\x35\x8f\x6f\x23\xcb\xff\xb1\x6b\xf5\xe4\x44\x34\xca\x0c\xfa\x33\xb9\x70\x70\x2d\x8f\xcd\xaa\x34\x4b\x16\xcb\xcb\xcf\x84\x92\x8c\x20\x2b\xea\xae\x2a\xc1\xc8\x55\xa1\x65\x21\x97\x56\x06\x1a\xcb\x98\x87\x99\x14\x28\x66\x9e\x3b\x39\x7f\x09\x86\xe8\x92\xc6\x40\x71\xa9\xdf\x56\x85\xac\xef\x57\x9f\xd7\x43\x69\x22\x1c\x36\x01\x99\xc3\x8e\x4a\xea\xe6\xea\x4d\xb9\x2e\x43\xf4\x4b\x53\x2a\x64\xb8\x39\xbe\x67\x85\x2b\xf4\x0e\xea\xc3\xc4\x1f\x50\xd0\x94\x65\x83\xf7\xe0\x4d\x60\xfd\x0b\x9a\x2a\x83\x29\xcd\xf1\xad\xdd\x1f\x8b\x43\xbb\x6f\xfa\x7b\x4f\xa9\xe0\x98\x8c\xc1\xe1\x58\x54\x1f\x00\x5d\x50\x37\x26\xbd\x75\x23\x54\x10\xe7\x78\x28\x27\xd0\x36\x0c\x4d\x47\xb8\x4e\x41\x59\xe4\x7c\x1d\x55\x55\x9e\x9a\xe4\x6a\x08\x9b\x29\x42\x42\xbd\xc6\x41\xfe\xdf\x53\x6e\xf2\xf6\x03\xf5\x3d\xce\xd9\xdd\xff\xc7\x7f\xfd\x17\x88\x58\x62\xb1\xe5\x54\xe6\x6d\x93\x46\xde\x71\xeb\xea\x67\x5b\x87\x24\x95\x66\x89\x92\xa1\x87\x58\x9e\x0e\x93\x2b\xcf\x52\x9b\x3a\xb0\xdb\xfb\xa4\x32\x41\x33\x9b\xe2\x4f\x0a\x2e\x2f\x3f\xe0\x25\xd7\x43\x25\x61\xb2\xfb\x4c\x56\x22\x2a\x75\x86\x35\xa3\xbd\x96\xe5\xd6\xa1\xec\x1e\xde\xfa\xe0\x8b\x6a\x0a\x19\x1b\x09\x3b\xb8\xbb\xbe\x1a\xda\x15\x0b\x53\x46\x6b\xc7\xd5\xff\x3c\xea\xf7\x03\x8d\x57\xbb\xdd\x6d\x77\x0f\x8f\xff\x5c\xbf\x85\xfd\xbc\x3b\x80\xed\x9c\x4b\xf9\x71\x53\x6e\x41\xf7\x0f\xc8\x70\x83\x88\x08\xaf\xa1\x35\xa0\x95\x66\x27\xce\xb2\xd8\xa7\x3f\x97\x95\x9e\x1f\xd4\x4c\x0f\xc6\x05\x31\xf9\x3d\x6f\xdb\x1c\x9a\xe9\x7c\x02\xc2\xdc\x16\x71\x3a\x1c\x26\x1e\x18\x82\x42\x42\xb1\xd4\xe8\x5e\xed\x33\x08\xce\xd2\xeb\x06\x5d\x56\x1e\x82\x98\x1b\x54\x47\xd9\x81\x3c\x4c\x12\x32\x6a\x63\x8d\x91\xfd\x4a\x6b\x28\x4d\xbe\x96\x4d\x23\xff\x7f\xd6\xde\xa4\xb9\x71\x1d\xcb\x1f\xfd\x2e\xff\xd5\x5d\xf4\x82\x33\x80\xb7\x93\x65\x39\x53\x7d\x3d\x95\xa5\xcc\xac\xfb\x3a\x3a\x14\x07\xc0\x81\xcd\x4a\x8a\x54\x91\x94\x9d\xae\x4f\xff\x82\x07\x00\x27\xd1\xce\xfb\x8f\x78\xbd\xb8\xd9\x65\x42\x14\x45\x82\xc0\x19\x7e\xc3\xca\xda\x36\xe4\xaa\x9f\x1e\x86\x01\x01\x45\x9d\x17\x5b\x17\x9e\xb4\x03\x07\x80\x67\x41\x98\xa5\x6a\x30\x07\xdc\x6a\x2c\xdb\xdc\xe4\x33\xc9\xff\x6e\x1c\x30\x17\x70\xef\x7f\x95\xf7\xe7\x63\x7f\x02\x6e\x55\x3d\xf3\x16\x8f\xde\xab\xca\x1d\x0a\x23\x43\xab\xe3\x76\xf5\x75\x6c\x6d\xcc\xb3\x28\xb0\xc1\xa8\x46\x57\x35\xee\x0f\x24\x48\x34\xff\xd5\x7e\xff\xd8\xc5\x37\x7f\x43\xc4\x8e\x67\x11\x66\xa9\xab\xf7\x5a\x0b\x41\x2b\x97\xb2\xae\xb4\x15\x6e\x1e\xaf\x7f\x59\x9c\x45\x69\x32\x5a\xff\xae\xac\x60\xd2\xe5\x43\xc8\x62\x09\x21\xf3\x2f\xb7\xac\xa1\x7e\x5f\x82\x38\xf0\x2c\x46\x2d\xbc\xc2\x1c\x09\x97\x2e\x5f\x65\x12\x80\xa4\xd6\x0d\x29\x9b\xcf\x78\xf6\x3c\x4b\x22\x87\xfe\x2a\x10\xd4\x0b\xd1\x3d\x46\xda\xe8\x3c\x4b\xb4\x65\x39\x8d\xac\xc5\xfa\x23\x9c\x2a\x24\x44\x7a\xc4\xdd\x20\xb1\xcb\xb3\x34\x88\xe3\x71\x7c\xda\x53\xcd\x66\x3f\x21\x4d\x8d\x97\x72\x73\xd5\xd6\x05\x12\x17\xcf\x52\x96\x82\x45\x06\xe9\xb3\x72\x6d\x79\x4d\x55\xaa\xc9\xaa\x95\xa5\x10\x51\x97\xaa\x69\xeb\x7d\x65\x03\xfe\xc9\x33\x48\x15\x23\xa5\xa3\x36\x77\x10\x5d\xf7\xf7\x2c\x4e\x2d\x0b\x58\xd5\x70\x22\x6a\x45\xbf\xb0\x64\x59\xa2\x28\xff\x1a\x6c\x59\x9c\x83\x5d\xf7\x88\x17\xca\xc3\xbf\x03\x91\xba\xd3\x32\x54\x04\xd0\xd4\xd8\x05\xca\xb4\x76\x3f\xcc\x8a\xe9\x19\x8f\xac\xcc\x79\x17\x6d\xfc\x2d\xdb\x3a\x9e\x75\x53\x9c\x24\x69\xf0\x75\x5d\x95\x3b\xf5\x52\x55\x85\x63\xb4\xfa\x11\xdc\x86\xf1\xe6\x5c\x6a\x77\xcf\x57\xcf\xa3\xf7\x92\x83\x24\x3c\xd3\x5f\xe7\x23\xd6\xf9\xf0\xba\x89\x8c\x7b\xe7\xd1\xd5\x73\x97\xa1\xdc\xa1\xce\x61\x10\x81\xe7\x99\xe0\x16\x80\xbd\x6b\xcd\xd9\x7a\x18\xf4\x61\xb1\x1b\x01\x41\x8c\xa3\x96\xcd\x1d\x9c\x4e\x56\x06\x9d\xc8\x73\x1f\xcc\x5f\x60\x98\x49\x47\x21\x9f\x4e\x40\xc9\xa2\xd0\xed\xa5\xe5\x48\x8c\x82\x67\x2a\xe4\xb4\xac\x1e\xf3\xb2\x5b\xa4\x4e\xed\xc8\xc6\x92\x67\x2a\xce\xe2\x49\xd9\xd8\xf6\x4f\x3f\x6f\xee\x64\x2a\x0d\x4c\xec\x89\x93\x56\xcb\xe1\x6b\x75\xae\x9f\x29\x74\x1c\x37\xdb\xb8\xfb\x80\xce\x80\x38\x76\x06\x14\x15\xfd\xc7\x0f\x41\xa3\x05\xcc\x1d\x4e\xb0\xec\x79\xca\x33\xcc\xac\x71\xda\xcb\xb9\x7c\xae\x67\xe9\x47\x86\x82\x91\xb3\xf8\xf7\xdb\x6f\x93\xf5\x0d\xc1\xda\x53\x5a\xf0\xbd\xfb\xa3\x51\x8c\x48\x67\xf4\x2b\x2f\x54\xac\xec\x20\x16\x04\x8a\x0a\x71\x9b\xef\x9e\xd4\xc0\x59\x20\x2c\x64\x5d\x52\xab\xef\xaa\xf7\x86\xce\x27\x76\x58\x9c\x05\x92\x5b\x7b\xce\x9e\x45\x39\x69\x39\xb0\x40\x6b\x92\xc7\x7d\xdc\x3c\xad\x37\xf7\xfb\xc3\xf5\x96\x9c\xfa\xfc\xe1\x30\xb0\x6f\xdf\x6d\xf5\xfc\x81\x7b\x94\x1f\x28\xac\x48\x61\x8d\x25\xbe\xdd\x40\x7d\xc4\x7a\x8d\x75\x6b\x17\xde\x0f\x0a\xaa\x2c\x54\x09\xe9\x11\xda\x56\x48\x0f\x0a\xf7\x5f\x1e\x25\x11\x71\x4e\xfe\xcc\xd5\xcf\xee\xde\xe8\xfe\x40\x16\x50\xf7\x8d\x2a\xd7\x54\x58\x1f\xf1\x03\xbb\xc3\xc2\x72\x2d\x6e\x27\x3b\x0c\x8b\x98\x26\x10\x11\x21\x40\xa6\xae\xea\x9c\xc5\x8a\xd1\x5a\x7b\xe8\xd5\x00\xac\xe5\xf8\xec\x59\x24\x22\x0b\xb3\x01\x24\x32\x0e\xde\xfd\x08\xb0\x26\x1a\x7b\x03\xf5\xb1\xff\x23\x66\x14\x14\xaa\xaa\x54\x30\x27\x6c\x8e\xd7\x41\x96\xf2\x4c\x78\x37\x48\xa8\x2f\x4a\xbf\x2c\x8b\x42\xa5\x2c\x7a\xf1\x1e\xdf\x64\x55\xea\xf9\x00\x88\x63\xbb\xf4\x77\x6f\x57\xb8\x9c\xcd\xb0\xcc\xd8\xc6\xbd\xaa\x8e\x26\xaf\x8f\x36\xdb\x9b\x9d\x49\x24\x21\x31\x2b\x54\x8d\xba\xf2\x2e\x5e\x73\xc3\x18\xce\x20\x0d\x52\x36\xf0\x2b\x6c\xe2\xb5\xfc\xc0\x21\x43\x8b\xf8\xc6\x22\xf7\x2d\x9d\x2c\x99\xf4\xc3\x87\xff\xe9\x3f\xc3\x83\xc4\x92\xe5\x09\x41\x31\x6f\xa4\x5e\xa4\xeb\x17\x05\x24\x06\x02\x69\x1e\x7d\xdb\x5d\x1f\xd6\xab\x47\x7f\xdd\x4a\x73\x42\x2f\xd5\xf9\xf3\x4b\x1b\x27\xb3\x1f\x8f\xa1\xf6\xa8\x95\xfb\x2e\x9e\x35\x9f\xc9\x6e\x72\x66\x62\xab\xfc\xdb\x22\x1c\xbd\xf7\xe3\x41\x8d\xdf\x44\x63\xb8\xcc\x06\x0e\x0c\x0c\x91\x37\x0f\xe2\x24\xc8\xfa\x88\xb4\xdb\x52\x96\xe4\x8c\x38\x0f\x98\xf6\x52\xb7\x8f\xdb\x03\xea\xbc\x3d\x84\xbe\xbc\xcd\xc3\x30\x21\x38\x4b\x03\x06\xbf\x60\x4b\x0c\x14\x70\x5a\x85\x37\x45\x55\x5d\x14\xe2\xa6\xcf\x86\x87\x80\xcc\xc9\x2f\x39\x64\xd3\x7f\x8d\x01\x4e\x3c\x8a\x19\xa5\xd8\x50\x14\x4d\xdb\xbd\x19\x83\xcf\x26\xe7\x51\x12\x52\xd7\x3b\x6f\x36\xa7\x4a\xf5\x3b\x13\x8f\x05\xa3\x14\xd4\xd1\x27\x57\xdb\xeb\x5d\x7f\x48\x66\x0a\x7b\x92\xde\xbe\xaa\xd5\x4b\x7f\x48\x09\x22\x04\x9d\x6a\x7c\xfd\x5a\xe9\xa2\x57\xa1\xe1\x3c\x11\x8a\x1a\x02\x56\x15\x66\xa1\xff\xef\xc7\x99\x84\xea\x4d\xf2\xfc\xbe\xa4\xc1\xc6\x79\x2a\x6d\xcc\x47\x8e\x33\x9f\x01\x09\x2e\x93\x93\x2e\x85\xa0\x69\xdc\x27\x32\xcb\x8e\x78\xb3\x1b\x9c\xf1\x98\x76\xa9\xc3\x47\x12\xe2\xdd\x10\x20\x0f\x57\x4b\x0d\xb1\x6e\x3a\x8b\x88\x3c\x9e\xe9\xc8\x23\x04\xb6\x0d\x25\x5b\x43\x94\xca\x99\x4b\x4e\x41\xe6\xfe\xbe\xb1\x28\x05\xe7\x06\xd8\x5c\xf6\x02\x39\x67\xca\xf7\xdc\x6e\x6a\xc4\x55\x91\xbb\xba\x63\xff\xf8\xb9\xe0\x84\xc8\x39\xe6\x65\x8b\xda\xe1\xc6\x9c\x05\x54\xff\x74\xb8\xca\x42\xbb\x62\x74\xcf\x54\x55\xc7\x13\xd4\x78\xd5\x2a\x1b\x39\x7e\xab\x8b\x69\x02\xc1\x45\x02\xa4\x8d\x76\x93\xbf\x4e\x49\x25\xf4\x75\xd6\x7f\xa3\x9b\xbf\xeb\xea\x5c\x37\xc3\x21\x05\x9c\xff\xfd\x15\xc1\x7d\x0a\xa2\x44\xd9\x9e\x46\x0f\x35\x1c\x81\xc5\x39\x87\x8c\x51\x78\xb6\xd2\x7a\x5d\x95\x0d\x96\xed\x85\x65\x14\xe7\x20\xad\x70\x11\x51\xd0\x96\x8c\x43\x38\x97\x71\x4a\xf1\x75\x43\x0a\x6d\xd3\xcd\xd2\x4a\x4a\x0e\xa7\x93\x31\x0f\xbc\x1e\xe2\x69\xdb\xd8\xa5\x73\xf4\x20\xa5\x01\x8b\x3a\x24\x72\xb9\x85\x0e\x7e\x56\xd1\xe7\x2a\x64\x41\x2f\x00\xdf\x85\x91\x36\x7e\x9c\xde\x09\x95\xa5\xc4\x8b\x21\x6b\x94\x29\xeb\x6a\xae\x56\xfb\xd1\xbf\xa3\xe5\x95\x2b\x26\x88\xd5\x05\xb2\xa1\x1b\x7a\x33\xab\x63\x71\x85\x96\xd1\x6f\xcb\xef\xab\xda\x77\x36\xfb\xe0\x93\x6b\x15\x11\x6a\xc2\xa6\xc3\xdd\x3c\x99\xdd\xb6\xff\x49\xff\x77\xf6\x38\x51\xa3\x77\xf7\xfa\xd6\x10\x1b\xfd\x43\x3c\x08\x37\x21\x7a\xb0\x9d\xa3\xdc\x75\xfb\xb6\x37\xa9\x9f\x5e\xac\x89\x2c\x5a\xd1\x09\xaf\x38\xf5\xcd\x05\x3f\x42\x3f\x3e\x96\x84\x23\x69\xeb\x77\x52\xa1\x7f\xaa\x2e\x59\x90\xf3\x8f\x68\x49\xfa\x65\xce\x6e\x61\xb1\xe9\x25\x82\x20\xf1\x74\x3a\xd7\x3e\xe8\xb5\x37\xbd\x45\x11\x95\xe1\x17\x4a\x74\xe3\x57\x4c\x04\x99\xa2\xcd\x0f\xad\x72\x19\xde\x41\x79\x11\xd6\x0e\x0b\xdc\xec\xff\xe3\x7e\xc9\x13\x61\x16\x85\xe1\x00\xc0\x1e\xa3\x9f\x97\x04\x8e\xfd\xa7\x98\x26\x81\xfa\x02\x9a\xf6\xba\x8b\xed\xfc\x4a\x21\x42\x15\x64\x30\xb3\x80\xa3\x36\xab\x3f\x6e\x12\xcf\xf8\x5c\xf7\xd6\x9f\x5c\x44\x26\xa0\xfa\x31\x4d\xa5\xc7\xaa\x1e\x92\x41\x11\x07\x19\xc9\xbb\x2d\x4b\xdd\x8c\x97\x59\x11\x87\xd6\x25\x6c\xff\xb0\x5f\xdd\x3a\x18\xdd\x28\x32\x10\xb1\xc6\x08\x7a\xb6\xcb\xb7\x32\x57\xd5\x2c\xbf\x11\x31\x6a\x12\xad\xb6\x72\xbf\x48\xf2\x82\x7f\xa2\x77\x8f\xfa\x56\xb6\x79\xff\x53\x92\x80\x13\x75\x44\x57\xfb\x3a\x7f\x7e\xc6\x7a\x42\xcc\xe5\x22\x09\x63\xaa\x8e\xae\xab\xbc\x5c\xe9\xd7\xbc\xa9\x6a\xca\xce\x26\x16\x42\x9f\xce\x28\x91\x60\x4c\x22\xc0\x87\x83\xf2\x7e\x0a\x36\x0c\x1a\x73\x5a\xdc\xd8\x94\x19\x4f\x59\x5d\xbd\x43\xd9\x5e\xd7\x55\xde\x6e\x54\x55\x56\xc7\xfc\xdf\x67\x3c\x38\xc5\xaa\xc4\x5f\x5e\x96\x31\x12\x8e\x72\x38\x5f\x5f\xf5\x5e\x7e\x1d\xba\xd1\x44\x4f\x3c\xe4\xcd\xee\xbd\x6c\x5f\xb0\xc9\xff\xd3\xa5\xb1\xae\x03\xb6\xfc\x21\x1e\x30\xaa\x21\x5c\x57\xe5\x42\x75\xdb\x0f\x4a\x53\xe2\x07\x90\x08\x53\x5b\x9d\x4e\x1f\xc8\x87\x72\xc1\x59\xe4\x2b\xb0\xbb\xbc\xbc\x70\xde\x1d\x36\x72\xc1\x45\x48\x2d\x4e\x6c\x5f\x06\xdc\xac\x10\x4c\x40\x3c\xe9\x65\x9c\xce\xa7\x65\xf5\xb2\xe9\x17\x0b\xb4\x5b\x4c\x37\xea\xda\xc3\xa4\x86\x48\x59\x80\x42\x65\x55\xd0\x09\x6b\x4b\xa8\xa7\x53\x31\xeb\xbb\x0a\x19\x5a\x68\x8a\x77\xbc\xa3\x7c\x4e\x57\x6f\xfd\x69\x64\x1a\x90\x0f\xe5\x17\x6c\xaf\xa0\xfc\x89\xf5\x1a\x4a\x9d\xeb\xa9\x01\x31\x17\x12\x02\xe1\xe0\x05\x5d\x04\x7b\xdb\xdd\x8a\xa5\xb7\x41\x85\x11\x29\x7e\xe4\xcd\x97\xf3\xc8\xb3\xb1\x3f\x6a\xf1\x80\x27\x68\x5f\xdc\xec\xb4\x4a\x68\xfd\x71\x2e\x03\x8f\x59\x53\x3f\x27\x6c\x15\x2e\x74\x14\x06\x83\x68\xa0\xdb\xc1\x16\x19\x29\xdd\x58\x4e\x75\xbe\xb2\x6a\x73\xf3\x7e\x75\x7e\xff\x3b\xb7\x5c\x27\x11\xcd\x8a\x9a\xcc\x9e\x71\x10\x5d\xe4\x42\x83\x6d\xdb\x92\x5d\x87\x7f\xc9\x1d\x8d\x9a\xde\x7c\x3f\x10\xd3\x8c\x5a\x5e\x77\xab\x7f\x1e\xd6\xab\xfb\xef\xab\xdd\xe1\x7e\x75\xb7\x39\xdc\x6e\xee\xbf\x78\xee\x22\x17\x26\x56\x14\x75\x9c\xc6\xfb\xcc\xa7\x21\xb5\x30\x1a\xbd\x1c\xc7\xa6\x4b\x14\x15\x8e\x36\x77\x08\x14\xd7\x36\x66\x76\x08\xe7\xd1\x8e\x08\x81\x66\x14\x9e\xc2\x6c\xab\x84\xc0\x40\x64\x37\xd3\xe7\x67\xa7\xc9\xd5\x23\x42\xdc\x90\x30\x8d\x7c\xed\xf3\xea\x5c\x97\x4f\xf8\xef\x33\x36\xed\xb7\xbc\x6c\xef\x06\xb7\x8b\x25\xb5\x20\x0e\x61\x26\xc9\xd9\xe3\x90\xb7\x15\xfc\x31\x06\xdc\xf9\x01\x12\x29\xb7\xee\xd6\xbb\x1b\xaa\x9e\xcc\x70\x82\x10\x2b\x69\xfd\xe8\xcf\xa5\xa6\x02\xb5\xfb\x7b\x92\x49\x6d\xf5\xa2\x9e\xf0\x5f\xb6\xf1\x3b\xfd\x60\x22\x02\x23\xc7\x58\x97\xba\x3a\xee\x6b\x84\xe6\x5c\x7f\x50\x88\x81\x34\x00\x5b\xb8\x85\x02\x69\xf7\x9d\x53\xa1\x39\xa4\x89\x51\xa9\xdf\xb8\x06\x33\x93\xf1\x1e\x09\xa9\x66\x54\x4f\xb0\x7a\x4b\xdd\x2e\xf4\x9b\xe7\x3b\xbb\x8c\x2c\x90\x99\x1a\x0b\xa6\x0d\x42\x0e\x1c\x58\xec\xbb\x1f\x14\x5a\xdf\xc3\xe9\x67\xef\x64\xc5\x81\x65\x2c\xe9\x15\xa8\x3e\x6e\x24\x03\x33\xa1\xc7\xca\x77\xfb\x0d\x11\x50\x16\xf8\xda\xd3\x20\x02\x78\x16\x68\x3d\x40\xd5\x47\xec\xbd\x95\x69\xb1\xde\xfc\x3a\xe5\xf5\xfb\x9c\xc8\xc7\x81\x33\x43\xe5\x31\x3c\x9e\xda\xf7\xfd\xde\xe3\x44\x81\xcb\x24\x62\x63\x23\x4b\xe2\x71\xad\xeb\xf7\xa6\x85\x19\x40\x0a\x44\x6c\x19\x78\x5d\x82\x52\xea\xfc\x35\xd7\x67\x28\xd6\x70\x6a\x3e\x5e\x8e\x41\xf0\x8c\xca\x89\x3f\xf3\xa2\x98\x41\xf3\x97\xa2\x8d\x0f\xd8\x4a\x00\xcc\x3a\xd0\xe4\xcd\xf6\xa2\xce\x09\xa0\xe2\xd8\x3d\x8e\x7b\x67\xca\x38\x16\x6b\x78\xc4\x9a\x34\xfe\xfd\x70\x99\x84\xda\x85\x8e\x8f\x0f\x0f\xb7\x36\xe9\x8e\xfd\x51\x15\x18\xa7\xee\xf3\xf4\xf8\xd0\x25\x01\x53\x4c\x3e\x28\x85\xb4\x52\x9f\xaa\xf2\x3f\xf9\x14\xd5\x09\x4a\x0b\x39\x10\xd0\x6f\x10\x5d\xce\x1f\xcd\x5e\x0b\x9d\x2a\x42\xae\x3b\x9d\xb7\xfe\xbb\xb5\x91\x5a\x7a\xcd\x39\x8d\x35\xb4\x95\x8f\x85\xc0\xa8\x80\xfa\x2f\x37\x0f\x77\x0f\xf1\xf5\x6d\xde\x37\xca\xc1\x68\x2b\xb2\xfc\x02\xcd\x13\xb6\xe7\xfa\xa3\x4c\x02\x0c\x26\xa4\x2b\x31\xf8\xa3\x35\x55\x09\x85\xed\x3f\x4c\xae\x50\x86\x69\x68\xd1\x96\x94\x93\xf7\x7c\x52\x2e\x43\x26\x49\xd6\xb7\x3b\x47\xb7\x32\x4f\x15\x24\xb9\x8c\x12\x49\x4b\xea\x76\x75\xe7\x99\xe2\x87\xab\xd5\x6e\x92\x4f\xc9\x24\x0e\xa8\xb2\x78\xb0\x18\x70\x82\x7a\xba\x5b\xf9\x41\x31\x46\x26\xa9\x16\x91\x5b\x6a\x68\xed\x73\x28\xfe\xe9\x6b\x2f\x13\x61\x75\xc4\xe4\xf9\xfd\xcb\xbc\xf8\x25\x13\x1d\x13\x26\x7a\x73\xcc\xdb\xd1\x7b\xb3\xd5\x23\x95\x60\x37\x34\x8d\x14\x9b\x14\xad\x3f\xe3\x23\x4c\xf6\x5e\x99\xc6\x8c\x8a\x20\x77\xf0\xfc\x9c\x4f\x78\x2a\x32\xcd\x18\x33\x8e\xc3\xfe\x0c\x2d\x6a\xdb\xda\x78\x42\xd2\x66\xe9\x32\xe5\x89\x3a\xcb\xff\x5d\x8f\x43\xa6\x42\x53\xe6\x6d\x67\x9f\xcb\xaf\x3f\x18\x2a\x43\xea\x06\xb6\xd8\xb4\x5f\xa1\x59\x57\x75\x8d\xca\x42\xc2\x6e\xaa\xda\x1a\x33\x8d\x1a\x4c\x32\xd5\xe8\x7d\xc0\x36\x8d\x82\x13\x7e\x1d\x9b\x4b\xba\x41\x2c\x09\x35\x75\xa8\x29\xcd\xaa\xe9\x6c\x77\x0d\x69\x8c\x82\x9d\xca\xcb\x17\xc3\xd2\x20\xb1\xcd\x5b\xb2\x37\xfb\x60\x02\xf0\x44\xe9\xa9\x9b\xf7\x86\x6c\xdd\xab\xf2\xe1\x64\xa1\xd0\x7e\xa0\x31\x54\x46\xef\x01\xac\xab\xba\xfb\x35\xfe\xb0\x40\x1d\xbb\xe0\x46\xe7\x8d\xae\xca\xfe\x47\x0a\xc3\xad\x65\x5e\x37\xe7\xaf\x73\x2f\x03\xcd\x25\x44\x9a\xb2\xe1\xdb\xea\xf9\x2a\xd7\xb6\xb5\x40\xe8\xe2\xdf\xc8\x61\x70\x09\x46\x93\xff\x48\xe9\xa0\xd8\x93\x89\x22\x93\x80\x5a\x43\x2d\xc2\xd1\x92\xe4\x86\x9d\x6e\xfa\xdb\x65\x12\x53\x93\xe8\x40\x3b\xde\xc3\x09\x4b\x22\xab\xba\xa3\x2a\x02\xdb\x52\xac\xca\x73\x63\x49\x7b\x03\x7e\x42\xaa\xd8\x26\x3e\xed\x5b\xb5\x6b\xf1\x34\x42\xd8\x48\x95\x58\x51\x50\xaa\xb9\x5b\xe9\xec\x65\x54\x83\x1b\xaf\xb3\x44\xb9\x5b\x47\xd2\xa0\x5f\xa1\x79\xb9\xcd\x65\xfd\xfe\xc7\xd8\x4b\x83\x4b\x0d\x56\xf4\x92\x8a\xf2\x1f\x80\x4e\x96\xbf\x01\x93\x80\x1e\xce\xf6\x7e\x02\xa3\x93\x08\x48\xa9\xe5\xcf\x9f\x9e\x70\xe6\xd3\x47\x69\xd2\xd0\xf8\xaa\x59\xd9\x62\x8d\x16\x45\xf4\x78\x2e\x73\x8a\x64\xa6\x5f\x60\x44\x48\x40\x33\x82\x56\x68\x54\x23\x19\xc0\xd9\x7c\x33\xc2\x52\xc2\x1a\xac\x73\x28\xec\xbe\xb2\x6d\xbe\x35\x53\x4a\x35\x57\x81\x64\xdc\xaa\x42\xb6\x58\x1f\x51\x5f\x36\x6c\x54\xa0\x15\x25\x96\xdb\xb2\x2a\xf3\xb9\xc1\xcd\x52\xc7\x40\x85\x88\xd6\x9b\x14\xf4\x31\x2f\x07\x4f\x94\x19\x5e\x4c\x45\x4e\xc8\xea\x19\xdb\xf5\x4b\x5e\xe8\x66\x89\xdf\xa2\xa2\xc8\x10\xc4\xaa\xbb\x2f\xeb\x22\x9f\xcb\xad\x70\x15\x65\x48\xc4\x50\xaf\x99\x3b\x9a\x24\x2a\x32\x9c\x34\x3b\xfd\x31\xed\xe8\x8f\xfe\x78\x12\x68\xa9\x2f\x34\x3d\xf7\x2f\x75\x75\x7e\x7e\x21\xbf\xb7\x7d\xf5\x3b\xbb\x7c\x7f\xaa\x84\x85\x83\x3c\xf1\xc4\x1d\xef\xa3\x4f\x28\xeb\xfb\xe1\xf2\xa1\x27\x04\x8d\xf5\x56\x2f\x17\x58\x55\xa2\xed\xca\xac\xb1\x51\xe8\xf4\x8f\x47\x8f\x29\x4d\x24\x15\xbc\x07\xad\x83\xfe\x47\xa6\x12\xe9\x55\x2d\xcf\xc7\x71\x12\xd8\xcc\x34\x83\xb9\xca\xc0\x50\x72\x44\x7a\x27\x55\x89\x4e\xee\x64\xf3\xef\xb1\x32\x13\x57\x19\x46\x64\xad\x70\x05\xd5\x0d\x96\xcf\xeb\x17\x1c\x71\x56\x3e\xc4\x84\x2a\x06\x01\x35\xd4\x29\x46\x1b\xf9\x14\x73\xc5\x8c\x2d\x2d\x59\x19\x7c\xec\x97\x3b\xc5\x43\xdb\x4f\xef\x96\x9f\x7a\x42\x0b\x53\x3c\xb6\xaf\x73\x9b\x63\x9d\x8c\x1f\x39\x67\x56\xd2\x96\x54\xf5\xdd\x76\x3b\x9d\xf4\x5c\x69\x22\x6c\x76\x09\xea\x28\x3a\x50\x22\x8c\xb8\x43\x5d\xdc\x85\xb3\x59\x28\x78\xe8\xa2\xc7\xd2\x9a\xb2\xce\x8f\xa3\xb5\xb0\x21\x46\x18\x5d\xe8\x47\x34\x17\x25\x53\xa0\xba\xd0\x86\xdc\x4a\x3e\xf7\x44\xe1\x4a\xc5\x9c\x18\x42\x25\x36\x2d\x6a\xb2\xb8\x59\x15\xc5\xbe\x5a\x15\x45\x34\x7b\x11\x48\xe3\xd5\xaf\x88\x37\x55\xdd\xef\x80\x4a\x27\x8a\x42\xbb\xa1\x3f\xd9\x1f\xc9\x2c\x73\xe5\xb9\x5b\x80\xba\x5c\xa1\xbb\xd5\xfd\xcc\xc1\x98\x53\xe1\x02\xb4\x26\x81\xcb\xbc\x7d\x9f\x35\x82\x16\xa3\x08\x85\x52\x5b\xf8\xaf\xd5\xe1\x1d\x81\xa3\x95\x11\x98\xba\xd4\xe4\x4b\x5d\x9d\x4f\x0b\x25\x4f\x65\x40\x50\xa2\x7c\xcc\xcb\xf5\xa8\x1c\x77\x38\x5e\xed\xd7\xfd\x79\x54\x46\xa5\x0d\xe5\x2b\x53\x1b\x32\x9c\xf6\xdf\xa3\x03\x30\x96\x1d\x56\x43\x5e\xe2\xaf\x41\x71\x83\xeb\x28\xb4\x3d\x20\x79\xae\xcb\x9b\x73\x69\x89\x3a\x8b\xaf\xa8\x8e\x12\x13\x8f\x35\x7f\x3d\x08\xe2\xb3\xd6\x9b\x8e\x32\xad\xc3\x91\x13\x1c\x39\xbe\xfb\x63\xda\x90\x5a\xc7\xb9\xc1\xfa\xea\xfc\x3e\x9b\x1b\x3a\x0e\xed\x4b\xde\xb4\x78\xda\xbf\x55\x7f\x4c\x2e\x26\x4e\xa4\x72\x99\x42\xb7\x79\x7d\xa4\x7b\xf4\x79\xa0\xa5\x63\x06\x13\x38\x38\x31\xfa\xfc\xe5\x25\xa9\x35\x50\x7e\x56\x9b\x52\x8f\xde\x0d\x4d\x1a\x5e\xb4\xbc\xa8\xfe\x4f\x08\xb4\x0c\x34\x6d\x55\x23\x65\x8a\x63\x6f\xd3\x79\xf5\x77\x32\x41\x74\x1a\x82\x65\xfc\x93\xb2\x5f\x0f\xea\x18\x27\x53\xfd\x3f\xfe\x23\x82\x51\x83\x18\x34\x69\xee\x38\x3c\xc8\xf2\x66\xaf\x53\x48\x55\xe0\x88\x04\x58\x36\xe7\x66\x11\x15\xa5\xb3\x20\xa0\xf0\x82\xc8\xa7\xce\xb9\xf6\xa2\xdb\xd6\x8f\xb5\xec\xa3\x1e\x90\x6a\xbb\x36\x8e\x08\x3b\x3f\x71\x62\xf4\x20\x36\x4d\xa1\x84\x77\xbd\x9b\x0d\x54\xe0\x35\x4d\xd6\x7d\xde\x75\x69\xe7\xc6\x35\xd3\x98\xc5\xde\x2e\xbf\x84\xb2\xfd\x48\xf0\x72\x7a\xa3\x79\x94\x51\x23\x63\x90\x29\x78\xac\x8a\x5c\xbd\x7b\x51\x81\x5e\x2a\x64\x36\x87\x79\xf7\x0a\x59\x01\xa3\x73\x5d\x5e\x55\x55\x81\x50\x8e\x8a\x45\x9a\x4b\xe9\xd9\xdd\x5d\xbc\xb6\xfc\x26\x88\x2c\x24\x09\x89\x2f\xd8\xf6\x6e\xfc\x5c\x0b\x88\x49\xfb\x73\xd2\x32\xfd\xe0\x05\x84\x80\x53\xf9\x76\x97\x17\xaf\x58\x8f\x48\x10\x1a\xc2\x94\x7a\x9e\x65\xa5\xf1\xd0\xe4\x7a\x56\x33\xd0\x90\xd9\xca\x3c\x49\x94\xda\x5a\xcc\xa8\x18\xa7\x41\xa4\x54\x75\xfe\x9e\xd7\xed\x19\x8a\x39\x89\xc9\x8d\x92\x49\x40\x68\x14\xdb\x7c\x99\x57\x6b\x5c\x3f\xfa\xa2\xe3\xf0\x29\x8a\xc0\xfd\x4f\xff\x05\xa9\xa1\xb5\xe8\x34\xb2\x4d\xe6\x5a\x2b\xab\x1d\xed\x52\xf1\xbc\x79\xc1\xfa\x0e\xca\xe6\x06\x71\xed\x4a\x1d\x73\xf2\x96\xd6\x5a\x51\x8d\xe4\x98\x97\x56\x0c\xd4\xfd\x1d\x03\xa5\xc7\x74\x88\xed\x85\xb7\xfe\x87\xf5\x0f\x6d\x30\x24\x10\x7d\xb7\xc9\xc6\xc4\x32\x74\x67\xc5\xc0\x79\xf2\xbe\x61\xbe\xae\x1a\xdf\x77\xed\x8f\x66\xb1\x33\x04\xdf\xfc\xfb\x9c\x9f\x50\xaf\xca\xf7\xe8\xf3\xc2\x29\x06\x2c\xd4\x56\x22\xb0\x7c\xbf\xb0\x71\xe4\x18\x98\x84\x34\x6c\xba\xe0\xea\x09\xf2\x66\x88\x47\x30\x0c\x0d\x71\xe5\x1e\xee\xbe\xac\x61\x2c\xe8\x80\x61\x04\xde\xd2\xae\xe7\x52\x4e\xc8\x22\x18\x02\xcb\x5c\x56\xe0\xfe\x6f\x3a\x8d\x30\x54\x21\xb5\xf5\xf2\x16\x8f\x8d\x05\xfd\x4c\x2f\x2c\x4a\x23\x82\x89\x5a\xd8\xc0\x5d\x5e\xe4\xed\xc0\xa0\xc4\x28\x95\xce\x7a\xa8\x9c\xdc\xa1\x88\x71\x2a\x9f\xdd\xc3\xb9\xcd\xd5\x79\x12\xdb\x60\xcc\xa2\x28\x18\xb6\xcf\x6b\x68\x71\xcc\x1e\xc0\x18\x02\x22\x5a\x1c\xcf\xc5\xe3\xb2\x29\xf6\x30\x90\xea\x1d\xbb\x16\x4a\x4d\x5e\xe5\xc7\x13\xe4\xcf\xe5\x47\x8e\x50\x8b\x6f\x31\x26\x18\x11\x02\x08\xbc\xee\xc6\xa3\x8b\xa6\xfd\xf5\xa4\x22\xf4\x6e\x03\xdf\xab\x76\xb9\x47\xe4\xd7\x71\x4c\x15\xa3\xb9\xfd\xf6\x52\x6d\x77\xbd\xf1\x43\xbf\xb0\x60\x16\xda\x94\xa4\x40\xd3\xce\x30\x30\x98\x65\x2c\x72\x0c\x30\x0b\x10\x72\xf1\xdd\xb4\xc8\x8f\x19\x47\x4a\xc4\x1a\xdf\xf0\xa1\xa6\xf2\xea\xdc\x7e\xc0\x5a\xc7\xcc\x51\xab\x29\xf0\x2d\xaa\x3e\x3b\x45\x96\x32\xea\x17\xa2\x72\xa4\xef\x6e\xeb\xd9\xe5\xcf\xcb\x31\x3a\xb2\x2c\xa5\x45\xba\x6f\xf9\x91\x6a\x76\xfb\x56\xd5\x3f\xe7\x1a\x71\x1c\x19\x84\x81\x5d\x62\x4f\xd6\x6d\xb3\xdb\x88\x7b\xb7\xf9\x45\xa9\x0f\xe4\x31\x93\xa2\x5f\x8f\xbe\xcc\x55\xf8\x39\x8a\x2c\xf5\x08\xe8\xbe\x89\xee\x59\x2d\x4b\x05\x76\x14\x26\xa4\x4c\x71\xf3\xf8\xcf\x79\x69\x12\x41\x30\xf2\x5a\xec\xbd\x46\x1e\xe1\xdc\xa0\x9e\x1a\xdf\x71\x04\x48\x6c\x57\x01\x0c\x6e\x7e\x9d\x3e\xb8\xc7\x20\x03\x12\x80\x35\xd5\xb9\x6e\x5f\xf6\x08\xc7\x1f\x3d\x21\xad\x3f\x13\x4a\xa2\xc5\x5c\x3d\xae\xd7\x9f\x45\xc5\x28\x59\x46\x71\x0a\xb4\xed\xc8\x4b\x96\xa3\xe2\x10\x28\xdf\x58\xb7\xfe\xf8\x54\x20\xec\x1f\xa8\x0e\x05\x09\x35\x0e\x0c\x78\x13\x86\xc3\x41\x6b\xdc\x7f\x5b\x55\x3f\xbf\x9d\x7a\x50\xc0\x75\xfe\xba\x9d\xa7\xa5\xa8\x63\xa4\xa7\xd7\xed\xfe\x59\x18\xf4\xa7\x10\xbd\x8b\xbf\xc7\x99\x4f\x6f\x83\x96\x86\xf0\x8f\xbb\x3f\x3d\xf0\x08\x4d\x94\x50\x86\xed\x94\x6e\xe1\xac\x70\x9a\xb1\xa0\x49\x2d\x3c\xf4\x9b\x93\x98\xc9\xcb\xd6\x65\x6e\xa3\x17\xc7\x64\x8c\xca\x35\xdf\x4e\x55\xdd\x5a\xff\xc8\x79\x2f\xc4\x04\x69\xc8\xd9\x6f\x34\x9a\x6c\x15\x6f\x72\xd5\x26\xe0\x11\xc1\x42\x35\xbc\x93\xec\xce\x74\xc1\x32\x81\xe4\x7e\x9d\xf5\x35\x6c\xca\x23\x06\x5f\x45\x37\x30\x8c\x13\x22\x94\x13\x4f\x66\x87\xed\xf9\xd4\x1f\x41\xa1\xbc\x35\x78\x8f\xd3\xcc\xab\xf2\xba\x52\xe7\x89\x3f\xde\xf4\xc2\xa2\x40\x10\x20\x45\x8f\x12\x5b\xaf\xca\xea\x87\x84\x16\x48\xfc\xb8\x79\x3a\x7c\xdb\x6d\x9e\x0e\xab\xbb\x87\x6f\xf7\xfb\xfe\x70\x14\xca\x6c\xd4\x11\xac\xdb\x12\xeb\x59\xfa\x67\xe2\x2c\x4c\x12\x9f\x5d\x3b\xd8\xb9\x3f\x84\x99\x71\x55\x8c\x1b\x9a\xda\x2e\xd4\x9c\xc2\x87\x4c\x9a\x08\x2a\xdf\xda\xea\xdf\x65\x27\x91\x4f\xc0\x6d\x26\xcb\x12\x42\x50\x1f\xbb\xbd\x9a\xe4\x53\x5e\x30\xaf\xa7\xb5\xad\x30\x9a\x7f\x48\x44\x54\x82\xf8\x6b\x73\x7b\xfb\x8f\xd5\xce\x77\x0a\x0d\x33\x11\xf5\x8f\x35\x54\xbe\x45\xe6\x8e\xf0\x18\x2d\x86\xce\x93\x4e\x56\x96\xf6\xbc\xb8\x11\x18\x6e\x90\x70\x33\xa6\x7c\x5d\x7e\xc9\x8d\x08\x39\xda\x35\x8d\xee\xd4\x2d\x9a\xb6\x5b\x35\x37\xfd\xda\x6c\x44\x6a\x29\x1a\x4e\x2e\xd1\xd6\x9a\x6e\xaa\xfa\x72\xcb\x37\x02\xa3\x24\x73\xdd\x69\x6c\xda\xed\xf1\x54\xac\x17\x82\x34\x03\x32\xa2\x8e\x2f\x1e\xf3\xd6\x01\xbb\x96\x82\x72\x23\x59\x4c\x11\xe3\xf6\x7e\xff\xb4\x79\xdc\x5e\x1f\xee\x56\xff\x3c\x10\x9e\xc3\x5f\x9c\xca\x32\x8a\x6a\xee\xff\x73\xbc\x9d\x4c\x70\x25\x13\xef\xc5\x61\x25\x0e\x5c\x1a\xdc\x05\x1b\xeb\xcb\xa2\x95\xd1\x92\x13\x90\xf8\x64\xa7\x53\x39\x4a\xaa\x0d\x62\x16\x58\x33\x80\xfc\xd4\x56\x2f\x67\xa9\x86\x88\xc5\xa0\xd1\x54\x3b\x6b\xce\xa7\xee\x35\x6e\x26\xd0\xbc\xe5\xa7\x82\xc6\xba\x1b\x5a\xd7\xd4\x2f\x35\x62\x3b\x88\x88\xba\x31\x26\xb0\xd1\xae\x05\x74\x7e\xb3\xcf\x6c\xda\x7d\x30\x26\x50\x09\x73\x9b\xe0\xcd\x6c\xe7\x35\x26\x8c\x69\xe1\xa8\x49\x18\x79\x7e\x2c\xb5\x3e\x99\x04\xf0\xbd\x9b\x28\x07\x19\x13\x07\x54\x4e\xbd\xaa\x11\x7e\x9e\x4f\xf3\x8f\x66\xd6\xa0\x03\xac\x87\x95\xc6\xb2\x9a\x52\xeb\x44\x10\xa4\x11\xad\x7d\x36\x42\x26\x75\x8e\xf3\xcc\x28\x41\x04\x01\x8b\xa9\x09\xbd\x5e\xaf\x9f\x2e\x5c\xf4\x45\x10\xc8\x84\xba\xc8\xb6\x02\x3d\x61\x8d\x5c\xb4\x29\xe6\x5a\x58\xff\xeb\xce\x11\x82\x65\x4b\x28\x28\x77\x2f\x58\x98\x25\x94\x94\x08\xa2\xc0\x92\xb6\xad\xca\xdb\x60\x74\xea\x0f\xeb\x90\x02\x04\xe7\x9f\x47\xf1\x24\xa1\xec\xfb\x01\x98\xc0\x60\x6d\xb2\x3b\x93\xda\xfe\x71\x66\xf7\x22\x82\x98\x31\x70\x74\x9e\x91\x55\xf7\x6c\x8c\xb2\x88\x25\xfa\xfc\x65\x0d\x7b\x3a\x38\x09\x45\x10\x0f\x98\xe9\x3f\x46\x49\x8a\x08\x92\x44\x51\xcb\xfa\x54\xe3\x31\x9f\xb0\xf7\x44\x90\x86\xca\xe2\xf9\x5f\x6a\x6c\x5e\xaa\x42\x47\xfd\x91\x54\x43\x34\xf8\xe6\x78\xa9\xfb\x6e\x85\x1d\xc6\xa8\x94\x5e\xdd\x43\xde\x74\x0b\xc0\xb6\xa4\x2f\x9f\x5e\x5a\xaa\x18\xad\x3a\xb4\xa5\x42\xf9\x91\x40\xf5\xdf\x16\x64\xff\x20\xe8\x75\xdf\x96\x85\x5c\x5b\xa5\x66\x4f\x3b\xbc\xaa\xab\x79\xde\x2e\x82\x4c\x43\x88\x5e\x4e\xe3\xd7\x88\x32\x22\x02\xa6\x74\x60\x29\xc5\xb2\x51\x75\x2e\xff\x9e\x24\xa6\x08\x78\x94\x92\x98\x1a\xf5\x88\xac\x54\x93\x4f\x8e\x6d\x6d\xeb\xbe\x6a\xfd\x1f\x06\x00\x46\xf7\x39\x49\x16\xf9\xfb\x1f\x0f\x87\xbf\x36\xab\xa7\xc3\x9f\x9b\xcd\x63\x2f\x6a\x21\x02\xae\x6d\x67\x0b\x8a\x62\xa4\x4c\x3d\x42\x09\xbb\x71\x10\x47\x54\x5e\x3a\x4e\xd5\x72\xfc\xd1\x2c\x25\x24\xf0\x63\x71\x6e\xab\xf2\x12\x4c\xd4\x8d\xd0\x94\x05\x34\xd8\x8e\xdc\x8c\xc6\xf2\x75\xf3\xdf\x3f\xfd\x06\x99\x18\x6a\x92\x76\xcb\xe1\xea\x19\x07\xb3\xf5\xd5\xe7\xa5\x77\x11\x48\x63\x9d\x4e\x2d\x97\x73\xf2\x30\x54\xca\x8d\xd7\x56\x26\x02\x6d\xb5\x18\x48\x88\x40\x29\xa4\xa2\xc4\x4d\x5e\x7a\x25\xdb\x91\xcc\xb0\x3f\x9d\xce\x34\xa1\x0e\x9f\x90\xf4\x29\xdc\x5f\x31\x4a\x69\xb5\x5f\x27\x37\x9b\x46\xd5\xd5\xdb\x87\x5c\x80\xf3\x05\x82\xa5\xfb\xb4\xa4\x19\xd7\xe5\x27\x05\xf6\xb7\xd3\x04\x11\x03\xaf\x3a\x94\xff\x67\xe0\xaf\xfd\x4f\xc4\xfd\x9a\x64\x32\x2b\x50\xfe\x50\x2f\x26\x24\x22\x30\x2a\x26\x53\xae\xd7\xaa\x45\xfd\x67\xae\x7e\x56\xc6\x2c\x2a\x99\x8a\xc0\x68\x69\xe9\x9c\xbe\x15\x92\x3b\x20\x58\x8f\xbb\x5f\xa0\xda\x8a\xc0\x20\x24\xda\xbb\x5d\x8c\x6d\x06\x97\x9f\x55\x18\x24\x29\x95\x65\x6e\x73\xd3\x05\x80\x87\x20\xf0\x8b\x41\x18\xb1\xc4\xae\xf4\x36\xed\x1d\x4b\x60\x0e\x9d\x0e\x11\xc6\xa9\x0c\x4c\x9f\xd4\xaf\x8a\xe7\xaa\xe9\x0f\xb1\x38\x72\x1a\xea\xde\x41\xed\x38\x60\x11\x3e\x7a\x18\x7d\x0c\xdd\x9d\x40\x2a\xbb\xfc\x92\x12\xd7\x41\x91\xb8\xb8\x3f\x88\x16\x70\xb5\x29\xb1\x7e\xce\xc7\x11\xb0\x08\x93\x24\xa3\x1e\xf3\x0f\x68\x7e\x07\xbc\x17\x61\x62\x24\xc1\x56\x1c\xb5\x6d\x94\x07\x4d\xee\x6d\x98\xa2\x15\xd2\xb4\x2d\xa5\x83\x9f\x97\x07\x6c\x5f\x0e\xaf\xa3\x45\x38\xcc\x12\x49\x1d\x0d\x5b\x83\xb8\xce\x49\xea\xd1\x1d\x63\x31\x23\x1f\x8d\x5c\x55\xb1\xf2\x8e\x2d\x22\x64\xa9\x70\x6c\x4a\x6a\x68\xec\xdf\xf0\xc2\xb7\x6d\x14\x41\x88\x90\xa9\x98\x40\x79\xab\xf5\x7a\xf3\xb8\xdf\x5c\x4f\xa2\x68\x11\x72\x9d\xd2\xbd\xa1\x0c\xfa\xaa\x2a\xf5\x63\xd5\xdd\x88\x55\xa9\x1f\x5e\xb1\xbe\x83\x7f\x55\x75\xaf\xa6\x29\x42\xc8\x42\xaa\x7a\x3e\x6d\x6e\x36\x4f\x4f\xab\xdb\xc3\xd5\xc3\xfd\x37\x12\xe7\xbf\xdb\xde\x7a\xed\x3a\x11\x02\x13\x41\x32\xef\xce\xed\xab\xe5\x09\x1c\x82\xc4\xc0\xae\x3f\x64\xd7\xec\xb0\x7d\x7f\x4c\x6f\xbd\x0c\x6c\x97\xae\x29\x4f\x72\x7e\x88\xab\xc4\xf5\x62\x7f\xac\x9e\x3e\x94\x0b\x17\xa1\xe2\x48\x35\xd5\x21\x87\x84\xcc\x5f\xb2\x32\x2a\x54\x83\x5d\x16\x39\x9d\xf4\xf9\xf2\xf4\xfb\x74\x1a\x11\x73\xe4\x74\x97\xf7\x20\x7a\xff\xcb\x3e\x59\x36\x46\x27\x60\xa9\x19\x2b\xe9\xd3\x97\xf4\x32\x01\xea\x85\x9a\x6c\xa3\x1a\xb9\x0f\x65\x42\xad\x0c\x0a\x4f\x35\x19\x3b\x97\x89\x10\x03\x4d\xeb\x25\x29\x23\x8c\xde\xc0\x66\xdc\x88\xe9\x07\xa7\x29\x21\x7e\xbe\xac\xee\x36\x87\xf5\xc3\xae\x9f\x0d\xc8\x12\x6a\xbe\xfc\xb5\x5d\x7f\x5d\x6d\xef\x87\x92\x9c\x08\x11\x65\x6c\xe7\x74\xb7\x82\xda\xb2\xb4\x3f\x66\x74\x94\x0d\x24\x74\xaf\xda\xb6\xb8\x5b\x44\x41\xa0\x99\x6b\x6a\x52\xbe\xf9\x70\x6e\x55\xd5\x47\xd9\x22\x0a\x18\x0f\xed\xb5\xed\x7f\xd3\x63\x13\x51\x00\x9a\x60\xb0\x77\xef\xdd\x7e\x9f\x9f\x8f\x17\xea\x57\x9f\x3f\x89\x28\x30\xd6\x5f\x7a\x87\xed\xd7\x6a\x5a\xe7\xe9\x52\x32\x25\xac\xd8\x9a\xb5\x10\x87\x16\x89\x48\xf3\xa1\xdb\xb6\xff\x1c\x08\x12\x24\x7a\xce\x5f\xf1\xce\x3f\xa0\x28\x54\x08\x63\x8a\xf1\x0d\xe2\x38\x80\x8c\x42\x0c\x13\xd6\xb3\xa4\x7f\x60\x3e\x2a\xd7\xcd\xce\x6f\x04\xcd\x82\x55\x59\x95\x4f\x78\x9a\x7b\xf7\x8a\x28\xd2\x89\xb5\x35\xb7\xa5\xaf\x69\x2d\x41\x44\x71\x98\x0a\xe2\xac\x62\x37\x8b\x0a\xf2\xb3\xac\x9b\xab\xf7\x5d\x09\xa7\xe6\xa5\x72\x7d\xc6\xe9\x29\xe3\x50\x46\x7c\xd0\xb1\x82\x8f\xcc\xfd\x45\x14\x0b\x0c\x83\x7e\xed\x23\xc2\xf8\xcc\x32\x45\x44\x49\x1c\x50\x35\xe1\x3a\x6f\x9a\xaa\xa0\xa9\x49\x6c\x07\x87\xc5\xeb\x97\xf5\x28\xd1\x31\x55\x30\x9f\xb0\x39\x55\xe5\x32\x4c\x5b\x44\xa9\x93\xaa\x5a\x12\xb1\xf3\xff\x4e\x9e\x6c\x9a\x70\xaa\xb8\x98\xbc\xc6\x85\x28\x3d\xca\x02\xeb\x90\x50\x5e\x6f\xfe\xe9\xaf\x39\x8b\x12\x6e\x3c\x61\xbf\x69\xb1\xbc\x6c\x39\xf9\x91\x49\x40\xe9\x2a\x55\xf3\x87\x1c\x51\x44\x59\x66\x9c\x0a\xf5\xaf\xab\x5c\xf7\xb9\xb5\x88\x98\x49\x68\x61\xb2\x8a\x51\x87\xa9\x58\xd3\xf2\x6f\xe6\xa9\x4c\x79\x5f\xba\x25\x67\x20\x9b\x63\x93\x58\xa5\x1b\x04\x52\x59\x07\x08\x92\xcc\xdc\x36\xbd\x06\xed\xa5\xa0\xa2\x88\x64\x2c\x0d\x73\x1a\x00\x96\xd9\x0d\xa7\xc7\xc1\x8a\xdb\x8f\xca\x98\x2d\x3b\x76\xc1\x9a\xae\x54\xff\x77\xae\x69\x11\x7e\x7c\x18\xbb\x42\x8b\x48\xea\x88\x65\xbe\x4f\xdd\x62\xfd\x0a\x45\x7f\x2e\xe5\xdc\xff\x7b\x14\xe8\x3d\xbe\x2d\xa9\xd2\xf8\xe1\xcc\xc2\x7a\x9b\xb7\xfc\x84\x93\x2f\x51\xc2\xae\x19\x58\xb6\xf5\xfb\x98\x49\x3b\xcb\x0d\xfd\x70\x97\x98\x74\x19\xf1\x64\x5e\xe8\xc0\x8a\x71\x9c\xcb\x91\x6d\x15\xf7\x07\x35\x04\x56\x9f\x80\xf6\xdc\x49\x7e\x18\x61\x1c\x53\x57\xcd\x23\xfd\xd3\xc7\xba\xfa\x17\xaa\x76\x72\x99\xe8\x08\x10\xd7\xeb\xcd\x7e\x7a\x00\x15\xdd\x08\xcb\xc1\x7e\x30\xa6\xf0\x42\xe3\xfd\xbd\x32\xa1\x95\x5a\xef\x61\xdc\xeb\xea\x78\xcc\x9b\xc1\xea\x58\x44\x86\x33\x82\xe5\xb8\xfc\x85\xf0\x69\xbb\x89\x6d\xb9\x1f\x28\x63\x62\x31\x19\xc4\x81\xef\xfd\xde\x9f\x06\x81\xea\xbd\x07\x5b\xd6\x7c\xc4\x0b\x1d\xa3\xbf\x9b\xb1\xd9\x13\xc6\xa1\x8c\x65\x32\x08\x5c\x1d\xe2\x60\x72\xd7\xe3\x08\x2c\x77\xed\x5c\x56\x5d\x5a\xfd\x58\x40\x89\xb3\x25\x2d\x8e\x94\xe5\xfb\xda\xf5\x67\x9c\x6c\xce\xbe\x2c\x32\x31\x59\x8a\xdd\x57\x63\x73\x3c\x11\xc7\x81\x92\x7c\xd4\xea\x58\xbe\xd4\x38\xb2\xac\xbc\x7e\x46\xda\xa7\x7c\xd1\xb1\x5f\xfe\xee\x38\x8b\x92\xd4\x8b\xe5\xb4\x1e\xa0\xe6\x0f\x32\xcb\x41\xa7\x2c\x11\xca\x75\x51\x95\x48\xd8\xe9\xa9\x5a\xad\x88\x63\x61\x28\x4c\xbe\x76\x70\xcd\xe9\xda\x14\x27\x49\x4a\xfb\xf0\xfe\x71\x3b\xf9\x81\xa9\x8c\xa9\x1c\xfa\x78\xed\xb1\x16\x22\x4e\xd1\x62\xc2\x7d\x0b\xf1\xee\x7d\xa4\xcb\x29\xe2\x2c\x54\x04\xee\xed\xe2\xa1\xa1\xcf\x3c\x5a\xa8\x63\xc6\x02\xe5\xa2\x22\x7f\x99\x6e\x46\x0d\x8b\x74\xcc\xb3\x44\x58\x41\x8e\xea\xb4\xe9\xf6\x9b\xf6\xa5\x6f\xf2\x75\x47\x4d\xe4\x16\x80\xa2\x5b\x37\xf5\xb6\xc5\x63\x7f\x09\x22\x8d\xb5\xf3\xfd\x7e\x78\x2b\x27\x3f\x48\x08\x2b\x60\x76\xcc\xcb\xfc\x78\x3e\x5e\xe5\x7a\x4c\x9c\x12\xb1\x90\x46\xe3\x50\x65\x44\x7d\xf5\xde\x1f\x52\xc8\xbb\x07\xb1\xbe\x5d\xed\x76\x87\xab\xcd\xaa\x8f\x70\x62\xc8\x12\xf2\x25\xde\x39\x62\xb3\x45\x6b\x3f\x55\x1f\x84\x0c\xdc\x7f\x8c\x45\x96\x0e\xd9\x56\xa7\xab\x73\xff\x45\xc0\x35\x85\xae\xd4\x68\x99\x04\x64\xb1\x8c\x38\xb9\x70\xa0\x6b\x50\xdf\x57\xc7\x9c\x80\xa1\x5f\xe1\xf5\x75\x14\x32\xfa\xe1\x4a\x51\x9a\x4e\x56\xa8\x77\x79\xd3\x38\x7b\x0e\xab\x47\xb0\xb8\x8e\xc5\x0a\xe2\xd0\xb6\x80\x56\x7f\xad\x6f\xbf\x5d\xfd\xd1\xff\xdd\xea\x96\xda\x5a\x94\xb5\xa2\xa7\x46\xda\x52\x54\x1c\x6b\xa9\x29\x41\x20\x5a\xc9\xa6\xd4\x97\x95\x9c\xd8\x70\xed\x04\x9d\x40\x1f\x34\x1e\xcf\x75\x0d\xcf\x78\xb0\xf1\xeb\xe1\x5c\x6a\xac\x8b\xf7\xd1\x33\x37\xca\x7a\x54\xb4\xf0\xab\x5b\xcf\xef\xcf\xc7\x31\xaa\x5c\x24\x41\x6c\x35\x27\xf2\xe6\x11\xba\x5f\x3a\xbd\x17\x49\x90\x68\x5a\x0e\x47\x6a\xc7\x61\xdc\x7f\x36\x4d\x6c\xf0\x4c\xab\xd3\x7d\xd5\x2e\x29\x91\x89\x24\x60\x30\x14\xfe\x6d\x65\x61\xf6\x25\x8a\x93\xeb\x44\x73\x3e\x3a\xe3\x62\xfb\x48\x3c\x53\x51\x24\x61\x86\xf4\x3a\x3f\xad\xaf\xfd\x97\x87\x3a\x20\x32\x38\xea\xbc\xf5\x6a\xc1\xa8\xe7\xa8\xa2\xe1\xdd\x48\x42\x1d\x11\x67\xe3\x44\xcd\xeb\xed\xfe\xe1\xd0\xcc\x82\xa1\x24\x0a\x18\x9d\xd3\x4e\x93\x3e\xa7\x94\x33\x3a\x97\x48\x22\xd6\x37\x6b\x9e\xe1\x88\x5d\x8a\xeb\xbe\x71\x3e\x10\x98\x57\x1c\xe8\x12\xe9\x2b\x28\x67\xe1\x5c\x12\x47\xd6\x9f\xe9\xe4\x5f\x81\x6e\xaf\xf8\x9a\x37\x17\x2c\x1c\x91\xc4\xb1\x48\xba\xe9\x41\x4e\xdb\xd8\x9b\x5a\x8c\x5e\x8e\x24\x4e\xad\x12\xf9\x5b\x2f\xf9\x76\x3e\x9d\x8a\xbc\x5f\xd2\x92\x98\x45\xa1\x6b\xd6\x53\x85\x9f\x7e\xdc\x64\x2e\x27\x49\x20\x45\x17\xb3\x76\x8f\xfb\xae\x6c\x4f\x7e\xb9\x19\xaf\x34\x49\x12\x1a\x72\x56\xbc\xdb\xde\x1f\x36\xfb\xaf\x9b\xa7\xc3\xfa\xe1\x7e\xff\xe4\xbf\x26\x85\x94\x59\xf0\x4e\x5e\xe8\x3e\xd6\x59\x5c\xab\x93\x2c\x0e\x88\x15\xfe\x78\x2e\x0a\x8f\xed\x2f\xba\xf9\xfd\x3e\xc7\x58\x5f\x56\x1b\x92\x2c\x96\xa4\x90\xb0\x43\x2c\x26\x91\x48\x92\xa5\x40\x8c\x29\x87\x1f\x82\x9f\x58\x5f\x23\xe8\x62\x2e\x7e\xdd\x8d\xb4\xa2\x8b\xdd\x24\xb7\x10\x78\xec\x4b\x7a\x49\xa6\x52\xe6\x7a\x53\xf6\x46\x54\xf5\xf1\x2e\x2f\x71\x5b\x5e\x5f\x6a\xc9\xcc\x7f\x19\x46\x4e\x03\xa2\x51\x67\x5c\x43\x3b\xbb\xd3\x4c\x71\x6f\x60\x70\x43\x5e\xc2\x17\x96\x0e\x82\xbc\x56\xc2\x01\x1c\xff\x58\xe7\xaf\x79\x81\xcf\xfd\x9c\xe5\x49\x42\x3f\xd3\xa9\x31\xdc\x57\xbb\x32\x3f\xf5\xe2\x0a\x22\xe1\x2a\xd2\xd2\x7b\x42\x27\x87\x91\x0b\x8d\x48\xb8\x16\xb6\x91\x9a\xab\xab\x6a\x36\xd9\x38\xa6\xb4\xa2\x39\xaf\x89\x25\xda\x9e\x1b\x29\x04\x86\x89\xd7\xc5\x22\x9e\x69\x98\x4e\xc2\x8a\x44\x68\x41\x2a\xa5\x12\xca\x9f\xa4\x9e\xdf\x6d\x10\xd3\xaf\x03\x65\x8d\x0c\x6e\x1f\xf6\xfb\xcd\xd3\x5f\xfe\x0a\x65\x62\xed\x44\x0e\xf6\x29\x4e\x32\x84\x69\xac\x9f\xc8\x14\x03\x97\x15\x8c\x88\x6c\x8b\xbc\x44\x91\x48\x11\x58\x8d\x1e\x84\xe3\x63\x55\x15\xd3\xd0\x3a\x91\xc6\x42\xbe\x06\x5d\xfc\x71\x45\x34\x51\x11\xd0\x57\xed\xf6\xff\xb8\x48\x73\x07\x30\xd0\xec\xfa\x94\x89\x63\x0f\xa4\xb1\x07\xbe\x6d\x89\xbd\x77\x9a\x1b\xc4\x74\x63\x55\x36\x96\xe9\xfe\x20\xc3\x4b\xb4\x88\x1d\xf9\xb4\x39\x17\xed\x41\x0e\xb0\x54\x91\xa0\xeb\x96\x3a\xd2\xbb\x6d\xb6\x75\x6b\x9a\xef\xaa\x8e\xb0\x0c\x61\xd6\x7f\x48\xd2\x6b\xdd\x25\x8c\x9f\x4a\xb6\x8a\xc4\xc8\x8c\x80\x24\xbb\x99\x58\xea\x52\x01\x6c\xba\x21\x18\xb4\xbe\x6a\xd8\xb4\xf9\x11\x5a\x9c\x54\xc2\x27\x37\x22\x0d\x64\x4c\x89\x3f\xfe\xc2\x5a\xe5\x8d\x6d\xb6\x7f\x1a\xe3\xa6\x21\xb3\x85\x3c\xd0\x7a\xe7\x32\xda\xbf\x73\x6d\x93\x4b\x4c\x43\x08\xb9\xf1\xd0\x58\xaa\xa4\xf6\x65\xbf\x34\xe2\x42\xa2\x97\xe9\x68\xce\x4b\xa2\x72\x22\x8d\x74\x44\x2c\xbd\xa2\x7a\x7e\xac\xab\x63\xde\xe0\xb7\xd2\x9c\x0b\x93\x17\xc5\x78\x3f\x59\x0e\x5f\xd3\x58\x5a\x08\x4a\x6e\x0d\xa7\xac\x88\x14\x55\x3e\xfc\x45\xa4\x81\xce\x6c\x0d\xe3\xbd\x5b\xda\x3e\x74\xf9\x16\x69\x0a\x8c\x24\xbd\x7b\x0e\x81\x57\xa4\xea\xd1\xd5\xfd\x39\x4d\x44\xa2\xcb\x53\xa4\x9e\x65\x89\x4d\x5e\xe8\x34\x73\x51\xc5\x91\x14\xa9\x87\x70\x23\xcd\xd0\x1a\x15\x68\x3c\x15\xd5\x32\xc3\x53\xa4\x2c\x88\x08\x2a\x74\x00\xad\x7d\x61\x45\x7f\xd4\x55\x48\x59\x6c\x9d\x12\xda\x67\xdc\x61\xdb\x7d\x59\xe3\x5a\xd8\xcb\xbf\x97\x87\x19\xe5\x38\x57\x0f\xdf\xee\xf7\x7f\x39\x63\xe9\x69\xa9\x35\xe5\x51\x4a\x31\xe4\x76\xfd\x70\x78\xb8\x1f\xfe\x0a\x84\x19\x1b\xf4\x29\x9d\x31\xf4\xe7\x13\x8e\x83\x24\x1f\xb6\xe6\x2d\x6f\xd5\xcb\x0d\xa2\x85\x87\x8e\x76\xcb\x94\x83\x42\x4b\x6c\xa0\x98\xe3\xb2\xbd\x9a\x8a\xd8\x50\xaa\x67\xd1\xbc\xe3\x77\x33\x4b\xa6\x58\xde\x69\xe4\x99\x8a\x0c\x32\x2f\xaa\xe9\x32\xdd\x4f\x6a\xd0\x5d\x6a\x42\x2b\xc6\xed\xce\xb6\x59\xa6\x8a\x29\x22\x95\x52\x81\x67\x59\xdd\x23\x6a\xd4\x83\xb9\xa9\x1f\x4b\xf8\x8b\xd1\xbc\x91\x26\x22\x8a\x67\x41\x08\xb2\x07\x33\x9d\x2b\x2a\xcc\x98\xed\xe5\x79\xb5\x13\xbf\xcc\xa6\x2a\xe5\x22\x1c\xb9\x88\x0d\xba\x9d\x56\x1e\x79\xd0\xaf\x14\xa9\x12\xb6\x3a\x7e\xcc\xcb\x4d\x91\x3f\xe7\x63\x6f\x29\x91\x2a\xa5\x08\x9e\xf1\x63\xb3\xe9\xf2\xaa\xb1\x1e\x9a\x48\x75\x1c\x29\x69\x43\xac\xfe\x4f\x4c\x46\x56\x5b\xb8\x52\xd8\x34\x3b\x55\x8d\x84\x52\x26\x97\xaf\x4d\x28\x28\x81\xe9\xf6\x2d\xd5\x6e\xa0\x2e\x47\xf3\x1d\x43\x49\xda\x76\xd8\x6d\x0f\xf6\x8e\x4e\xb7\x92\xd4\x88\x5e\xb6\xd5\x63\xb4\xa9\xca\xd7\xfd\xc7\xb1\x84\x16\x6b\xf1\xa9\xc1\x28\x95\x93\xca\xfd\x45\xb4\x31\x4a\x6a\xb3\x20\x32\x44\x0a\x78\x38\x4d\x80\x45\x22\x0b\xb2\x84\x1a\x05\x64\xb8\x39\x41\xdd\x46\xbc\x1f\x62\xf9\x6d\xf7\xf9\x4b\x5e\x78\xa1\x27\x91\x05\x80\x14\x6f\xfa\xfa\xb0\x15\xdd\x1c\x62\x8b\x2c\xd0\x91\x74\xdb\xd4\x2d\x94\x7a\x6f\x73\x8c\x69\x00\x93\x85\x11\x47\x2b\xfc\x54\x35\xdd\x8a\x33\xb9\xb8\x30\x41\x9a\x01\x79\xf3\xe4\x5a\xc5\x97\x31\xfc\xe4\xb6\x64\xa1\x4c\x3c\x3c\xed\xc9\x86\x44\xae\x22\xdc\xe7\x34\x59\x04\x40\x6b\xa3\x76\xba\x81\xa8\x2f\x7d\x2a\xba\x51\x32\x08\x67\xa9\xd9\xa5\xb4\xcf\x14\xc2\xde\x7d\x4a\x53\x64\xe0\x9d\xb3\x8a\xe7\xaa\xff\x5a\x29\x32\x17\x29\x3e\x9e\x4f\xa7\x2e\x1a\x1a\x72\xe4\x2c\x0e\xb4\x1e\x32\xc1\x7f\x74\x51\xee\xc5\x76\x97\xc5\x69\x18\xa3\x2d\xb2\x62\x3d\xae\x0e\x4e\x87\x25\xc2\x10\x0d\xa8\x97\x67\x2f\x8a\x71\x35\x21\x4b\x8d\xe2\xc2\xe3\xa9\x6a\x83\xf9\x1c\xc8\x23\xb2\x2c\x34\xca\xf8\xb0\x30\x9a\x14\xb8\x32\x16\xea\xc8\x71\x89\x6c\x9e\xbf\xab\x0a\xfd\x88\xb5\x83\xfd\x4e\x6f\x23\x64\x82\x24\x10\x1d\xa7\x78\x75\x1e\x99\xb6\x88\x4c\x6a\xab\xff\x40\xce\xe6\x87\xf3\xe9\xa0\xf3\xd7\x9c\x2a\x65\x93\x2e\x8d\x1f\x8d\x11\x5d\x14\xb4\x8b\x46\x4b\x22\x53\x89\x01\xdd\x37\x74\x15\x5e\x2a\x21\x89\x4c\xa5\xa0\xb9\x45\x53\x54\x6f\xcd\x8f\x17\x2c\xbf\xd8\x6d\xc3\xfe\x48\xd2\x46\xb2\x52\x23\x03\x96\x5d\x64\xd8\xe5\x87\xff\xe7\xff\xf9\x3f\xff\x3e\x57\x2d\x10\xc9\x6f\x7a\x56\x23\x91\x00\x3a\xf4\x36\x9e\xaa\xba\x05\xe7\x97\xeb\x04\x3f\x86\x14\x2b\x33\x4a\x30\x67\x43\xb3\x4e\x6e\xfa\x6d\xd4\xbb\x57\x2c\x4f\x6b\xa3\x23\xc2\x87\x6c\xd7\x0f\xb6\x46\x7f\x61\x5a\x2a\x58\x60\x24\xd1\xdc\xa1\x3e\xc2\x33\x6a\x1c\xa6\x8f\x9f\x9e\x2c\x0c\x23\xa2\xb0\xad\xa1\xbd\x60\x05\x2c\x6e\xaf\x2c\x8c\x79\x18\x3a\x09\x3b\xac\xc7\xbc\x45\xc1\xc2\xc4\xaa\xdc\x90\x96\xe3\x9f\x79\x51\xcc\x76\x0b\x16\x66\x86\xfa\x6f\x55\x9d\x3f\xe7\x25\x14\xb4\x8a\xff\xc0\xfc\xf9\xa5\x1f\x12\x47\x56\x45\xae\x3a\xb7\xa7\x73\x9b\xcf\x7e\x52\x9c\x30\xb2\x4b\x39\x10\x03\xa6\x3b\xfd\x18\xa7\x38\x83\x58\x2f\xbe\x0c\x2c\xd6\x92\x3a\x18\x44\xd5\xdf\xec\xbf\x1e\xd6\xdf\x36\xfd\x97\x6b\x5b\xbe\x38\x97\x54\xbc\xd8\xfc\xb2\xc5\xc3\x59\x9d\x8f\x25\x61\x40\x6d\x18\x4b\xb6\x6c\xb0\x3d\x74\xff\x9e\xe0\x7d\x76\xb5\x09\xb7\xd0\x4b\x82\x5a\xd9\x72\xd0\x02\x1a\x81\x25\x60\x28\xe9\xef\xf6\xd0\xc7\xb3\x2c\x72\x35\xe0\x0e\x02\xff\xa4\x12\x69\x35\x9c\x74\xf5\x56\x16\x15\xe8\xfe\x5a\x34\x70\x17\xbe\xfe\xa8\xea\x09\xd7\x54\xb0\x34\x92\x60\x49\x0d\x75\x55\x56\x57\x50\xfe\x7c\x2c\xa0\xed\x52\x52\xff\xf1\x34\x95\x14\xed\x91\x8b\x3a\xa9\xf5\x38\x55\xa7\x64\xf6\xdc\x53\x6d\x15\x62\xa4\xdd\xde\x1f\xcc\xb8\x05\xc6\x52\xe4\x22\x9e\xee\x5a\x16\x75\xa9\x57\xed\x32\x4e\x82\xb1\x2c\xe5\x61\xaf\xad\x4d\x80\x53\x87\x21\xfc\x6e\xf5\xe9\xb6\xb3\xa5\x83\x31\xc6\x2c\xc3\xc7\x6e\xad\x7f\xcc\xce\xa7\x33\xca\x5f\xae\x6b\x84\x49\x01\x99\xf1\x2c\x25\xa5\x78\x2b\x70\x84\x7d\xfd\x86\x71\x6d\x9b\x90\x7e\xcb\x5c\x3d\x6e\x97\xf5\x57\x05\x13\x49\x12\x38\x43\xa1\xaf\xf9\xf3\x0b\x36\xed\x55\x1f\x5c\x33\xa1\x02\xab\xde\x34\x18\x65\x74\xe1\x4f\x51\x8d\xb6\x7e\x26\x74\x86\x6a\xc8\x37\x1d\x66\x6f\x39\xdf\x64\xc0\x24\x71\xd6\x5a\x68\x7e\xda\x42\x36\x95\xbe\x97\x10\xea\x82\x01\x6a\xd2\xe8\x7c\x7c\xda\xde\xad\x9e\xfe\x3a\xec\xf6\xab\xa7\xfd\x18\x65\x29\x98\x8c\x79\x8c\x23\x33\xac\x05\x01\x39\x3f\x1b\x25\x0f\x42\x57\x6e\xbf\x82\xa2\xa8\xda\x87\x93\x43\x18\xfb\x93\x29\x65\x6d\x55\x6d\x81\xae\xff\xab\x8e\x69\x82\xee\xef\x1e\xee\x37\x7f\x45\x2c\x62\x01\x1f\x8e\x25\x51\x36\xf2\x5c\xeb\x7e\x50\x9f\xc5\xcd\x68\x35\x82\x69\x16\x58\x21\x49\x55\xd9\x2f\xbe\xf2\x73\x6e\x39\xe4\x67\x5a\x2a\x6a\xab\x1e\xac\xe9\xf3\x88\xcc\xf5\x5b\x6f\xfb\xc5\x7f\xf9\xfc\xfc\x3a\xa0\x80\xd0\xa6\x2f\x63\x94\xcc\xdc\xdd\x42\x30\x13\x87\x71\xe4\x63\x9c\xc6\x83\xc2\x6d\xfc\xeb\xd6\xa7\xc9\xb9\x8d\x4c\xe5\x20\x8c\xe7\x6b\x88\x7e\xee\xf2\x20\x8a\xa8\x20\x8c\xaf\x6e\x19\xca\x7d\x6f\xc8\xcf\x62\x1e\xc6\x48\x37\xf7\x0e\xcb\xea\x75\x12\x2e\xf1\x50\xc6\x84\xad\x39\x61\xdd\xbd\xf4\x3b\x1c\xe9\xed\xf3\x81\xbb\x92\xfd\xef\x07\xb7\x61\xf1\xcd\xe5\x49\x2c\xb8\x17\x2b\x9b\xbe\xa2\x3c\x05\x85\x38\xae\x7e\x39\x09\x9f\x6a\x0c\x60\xe4\xa9\xb4\xdd\xc3\x2e\xe5\x3e\xd7\xa7\xc2\xcb\xf6\x0a\x9e\x65\x48\x5d\x1c\x63\xcb\x5b\xd6\xe7\x07\xe6\xf5\x54\xce\xd1\xd0\x02\x7c\xfb\xb0\xfe\xd3\x67\x6c\xd7\xdf\x9e\x56\xfb\x6d\x9f\x9d\x71\x01\x48\x95\xbe\xa7\xcd\x6e\xf3\xf4\x7d\x73\xed\xc7\xdd\x3c\x7c\xbb\xbf\xde\x3c\xed\xfa\x71\x32\x90\x7e\xfb\x25\x3b\xe6\xab\xf3\x3b\xd6\x13\x8d\x93\xe5\xad\x90\x43\xcc\x8c\x2b\xc7\xed\x8e\x50\x14\x8b\xee\x2e\x17\xf9\x1f\x87\x58\x24\xc9\xc0\x41\xff\x51\xe7\xed\x87\x1c\x74\xc1\x21\x51\x56\xc8\xac\xe7\x11\x4f\x5e\x46\x0e\x99\xa0\xda\x52\xb7\x80\x13\xf6\x55\x55\x75\x17\x12\xff\x16\x09\x38\xab\x71\xcc\xae\x31\xd3\xc8\xbc\x86\xe4\x2b\x96\x67\x5c\x5e\xa8\xb8\x64\x8c\x56\x8b\xff\xe6\xfb\xc3\xf5\x66\xbd\xbd\x5b\xdd\xee\x0e\x37\xab\xf5\xde\xeb\x47\x0b\x2e\x31\xa4\xe4\xf9\x66\xf5\x78\x53\x51\xc7\x61\x50\x8d\x15\x5c\x05\x8c\x70\x2b\xf4\xfb\xfa\xea\x58\x38\xfb\x1a\x25\x99\x72\x22\x99\xb6\xb9\xa6\xab\x6b\xdc\x34\xea\x8c\x05\x50\x9a\xf1\xfe\x91\x6c\xa5\x3f\x81\x62\x81\xf6\x69\x40\x73\x2e\x26\x6c\x0f\xc1\x75\x04\x18\xf4\x18\x62\xcf\x61\x77\x99\xc5\x58\x31\x6b\x72\xd3\xdc\x87\x91\x71\xa2\x7a\x9f\x4b\x8f\x5f\xf5\x80\xec\xc5\xd8\x8d\x23\x67\xe0\x44\x08\xbc\x84\x6f\x14\x4e\xaf\x07\x51\x49\xbf\x8a\x74\x33\x11\xb5\x85\x8b\x60\xdd\x5c\xe7\xcd\xe9\xdc\xe2\x55\x55\xea\xc9\xbb\x6e\x22\x46\x89\xa3\x05\xc9\x3b\xd6\xd9\xac\x63\xc4\x4d\x17\x98\x5a\x2f\xa2\xdd\xa8\xd7\xfc\x9b\x19\x6b\xb4\xb5\xe8\xa4\x62\xf0\xf5\xbe\xff\x46\x63\xbb\x87\x35\x9e\xe0\x7d\x7b\x24\x2d\x8b\x16\x8b\x59\x14\x24\xc2\x30\xf3\x2d\x84\x6b\x17\x22\x85\xfd\xb1\xc8\x70\x97\x1e\xe1\x20\x1f\x35\x4e\x54\x45\xc8\xd2\xd0\x29\x65\x92\x8d\xc2\xa5\x2e\xe2\x62\x3e\x2c\xa2\x2c\xa0\xac\xa4\x7d\x3f\x59\xbb\x07\xf7\xf7\x98\xa1\xed\xd8\x9f\xdf\x1f\xeb\xfc\x58\xd5\x3a\x87\xb1\x19\x90\x10\x49\x94\x50\x8f\x6b\xbb\x7e\x38\x3c\x7e\x5d\xed\x36\xd1\x00\x96\x5b\x6f\xee\xf7\xab\x2f\x9b\x61\xa8\xb2\xf3\x72\x4c\xee\x19\x9b\x98\x2d\xde\x50\x91\xc4\x40\x42\xba\x8f\xab\xa7\xfd\x76\xbd\x7d\xa4\x85\xeb\x70\xb3\xe9\xcf\x9b\xa6\x49\x4c\xc2\x50\xe7\x53\xde\xff\x4d\x26\x96\x45\x8e\xf8\xb3\xff\x1b\x5a\x99\x73\xb7\xa8\x1d\x56\xd7\xd7\x4f\x9b\xdd\xce\xe3\x3b\x45\x86\x5c\xb8\xcc\xee\xcb\x19\x6a\x28\x5b\x44\x3d\xde\xbf\x6e\xb1\x1c\x82\x6f\xc1\x02\x24\xf1\x07\x63\xcd\xac\x1f\x0b\xb8\xc4\x96\x4e\xed\xab\xc7\x4f\x8a\xc7\x21\xc1\x1e\x4f\x70\x6e\x70\x70\x12\x15\x82\x2b\x4c\xdc\x42\x49\x9a\x33\xd3\x1a\xb5\x1b\x24\xb2\x8c\xd6\xf4\xb6\x3e\x37\x43\x67\x6e\xd7\x33\xe5\x85\x80\x50\x2a\x97\xcd\xad\xfe\x71\xbb\x1c\x0b\x08\xe0\xc6\xc9\xb0\xb4\xeb\xe2\x8c\xf1\xe4\xbd\x12\xa0\xac\x6f\x58\x8d\x43\xa9\x7e\xdf\xeb\xfe\xd8\x13\x8e\xf0\x51\xb3\xcd\x5d\x80\x61\x44\x48\x77\xc9\xeb\xa1\x39\xe5\xe5\x61\xec\x6d\x20\x84\x02\xe3\xd4\x77\x55\x35\xe6\xf3\x0b\xa1\x74\x48\x79\x1e\x96\x7a\x45\x1c\xba\xcb\x5b\x3b\x26\xf3\x7f\x5a\x44\x14\xca\x58\xd5\x82\xab\x87\x7f\xf6\x40\x27\xa1\xc3\x80\x42\xea\xe3\x82\xb5\xd7\xb4\x84\x23\x34\x60\xea\x7a\xfb\x94\x91\xba\x15\xcf\xfd\x53\xcd\x5a\xae\x02\x23\xe5\x83\xf5\x87\xda\x46\xf6\x3f\x20\xef\xb2\xe4\xab\x0a\x6a\x3d\x1f\x9d\xa9\xd0\x72\x91\xf7\x2f\x38\xcb\x01\x85\x81\x94\xc0\x01\xce\x3f\xba\xf7\x4d\x16\xc2\xe8\x30\xf1\x19\x41\x7d\x3e\xe1\x08\xc3\x28\x8c\x89\x28\x97\x3d\xc2\xaf\x55\x59\x95\xef\xc7\xea\xbc\x84\x8f\x84\x00\x62\x19\x7b\x29\x92\xb9\x01\xd9\x9c\x60\x02\x81\x4b\xbd\xcf\x25\xa5\x7b\x53\x54\x0e\x04\x98\x59\x30\x5e\x0f\x97\x84\x28\xb1\x54\xaa\xeb\xaa\xb0\x70\xe7\xc4\x1f\x89\x75\x44\xfa\x81\xce\xb7\xd5\x69\x9d\x7e\x1a\x40\x40\x1a\x72\x12\xdd\xd8\x7c\xf9\xb2\x3b\xec\x1f\x0e\x5f\x57\xfb\xf5\xd7\x43\x78\xfb\x70\xb5\xdb\x6f\xfc\xfe\x09\x59\x9c\x50\x98\x71\xbb\xdf\xf5\x7f\x62\x32\x4d\xbd\x8f\x64\xeb\x24\xa3\xc7\x61\x43\x17\x15\xb0\x29\x60\xd6\xa4\xfd\xa7\x21\xd1\xde\x20\x99\xe4\x0e\xc9\x6b\x65\xfa\x79\x96\x44\xa4\x98\x42\x6a\x34\x97\x55\x3a\x60\x59\x42\x41\xcc\xd7\xf7\xe7\x7e\xe1\x04\x06\x51\x46\x2f\x68\x55\xf4\xd6\x4f\x02\x78\xa6\x04\x7a\x3e\x80\x25\xbb\x15\x73\xb3\x54\x01\x5c\xc7\x31\x73\x5d\x64\x24\xd1\xc8\xc1\x65\x60\x52\x6e\x02\x11\x89\xd0\xad\x26\x33\xfd\x88\x51\xf9\xfb\xf3\x7f\xfc\x99\x74\x4a\xe5\xa1\xf5\x97\xcd\xfd\x42\x01\x05\x20\xe1\x94\xf4\x7d\xcf\x47\x5e\x90\xdd\x9f\xd1\x55\xe7\x8f\xd5\x2b\x52\x62\xe6\x8f\x18\xd0\x13\xda\xf6\xd5\xb9\x9e\x9f\x54\x86\x9a\xbb\x78\xf3\x0b\x96\x78\x0b\x72\x76\x27\x24\x22\x75\x68\xc9\x10\x68\x44\x42\x17\x20\x4d\x44\x82\x6d\x4d\x0b\x56\xc6\x66\xb6\x86\x82\x52\x48\x64\xde\x55\xf9\x33\x6f\xbf\xe7\xaa\xed\x95\x94\xc6\x1b\x1c\x68\x13\x12\x79\x83\xfa\xe5\x87\xfd\xd3\x6a\x7d\x08\x79\x1a\x0c\x87\x63\x6a\xd0\x1e\xec\x5c\x5e\x36\x07\x12\x80\xa1\x21\x7b\x97\x3f\x7f\x7c\xdd\x2f\x1a\xb4\xcc\x86\x0b\x69\xb7\x34\x28\x9f\x10\xf4\xfd\x18\x08\x36\x9d\x7b\x26\x00\x13\x3a\x38\xe3\xa6\x7d\x19\x5a\x69\x60\xb2\xd8\x47\x4e\xdd\xf2\xd3\xb7\xbf\xb9\x3f\xae\x32\x12\x2c\xa1\x64\xca\xf7\x2d\xa7\xb7\xc8\x28\x45\x00\x52\x0d\x2d\xec\xaa\x73\xad\xf0\x0b\xb6\x3b\x3c\xe6\x2e\x2c\x9c\x8c\x96\x61\x68\x08\x98\xa7\x21\x2f\xde\x5d\xad\x72\x8e\x89\x95\xa1\x8c\xb4\x63\x4b\x51\x91\xe7\x00\xa5\x3e\x94\xf8\x36\x96\x3d\x10\x32\x32\xa9\xb1\x55\x1e\xf5\x52\xe6\x0a\x8a\x75\x75\x3c\x9e\xcb\xbc\x7d\x77\x5d\x23\x37\x2e\x96\x11\xd9\xdd\xab\xaa\x69\x67\xcf\x57\x26\x41\x12\x44\x23\x64\xd2\xde\x33\xc0\xfc\x87\x89\xb0\xef\x76\x3f\x22\xde\x51\x91\x66\xe8\x2c\xc9\x34\xc9\x08\x5f\xe5\x1e\xed\x69\xfe\x0d\xa9\x4c\x69\x0d\x76\xd6\xe6\xcb\x9b\xac\xcc\xe2\x30\x56\x03\xcf\x0c\x4b\xd2\x54\x27\x41\xd2\x3f\xce\x83\xf2\x80\x90\x2c\x44\x82\x46\x0f\xbb\xad\xe5\x29\x91\xc0\xea\x52\xe6\x21\x59\x96\x06\x6e\x13\xd8\xb5\x55\x0d\x63\x53\x62\x21\x19\x58\xca\xb2\x76\x73\xd2\x05\xda\xd3\x1e\x8a\x64\x68\xa8\x1d\x6e\xd7\x12\xca\x7a\xdd\x11\x9e\x02\x05\x38\x3f\xdf\xd5\xec\x33\x9c\x47\xc4\xc6\xd3\xa8\x0a\x12\xcb\xa2\xd6\xd8\x35\x9a\x41\xe8\xb8\x1b\x24\x42\x37\xff\xb6\x47\x78\xc6\x6b\xb4\x21\xf4\x4c\xaa\xd0\x87\xb7\x92\x1b\x2b\xf5\x64\x93\xfb\xeb\x73\xf7\x7b\x49\xcf\xf9\xa1\xec\x7f\x92\x08\x52\xb2\x4e\xc9\x9b\xd5\x59\xe7\x17\xd5\x10\x29\x58\x4c\x6c\x1f\xfb\xc4\xef\x20\x2f\xbd\x4e\xd0\xf4\xc6\x09\x88\xb4\xa3\x5d\x75\x9f\x3e\xb4\xd5\xa1\x25\xb7\xde\x66\x7e\x42\x60\x56\xa5\xc5\xc3\x57\x6c\xd9\x6d\x3c\xa3\x21\x85\x84\xf7\x4a\xef\xf0\x8a\x7a\x33\xe0\x00\xa6\x67\x03\xa9\x49\xcf\xc7\x36\x41\x2f\x67\xcc\x72\x15\x56\x82\x4a\xa9\x57\xb4\x49\x9e\xaa\x37\xdb\x08\xfb\xe6\xbf\x1d\xb5\x49\x1c\xbb\xf6\xb6\xaa\x7e\x9e\x67\xb5\x38\x89\x88\xb4\x7c\x81\xfe\xd7\xb9\x69\x0f\xbe\xd0\x70\x28\x2b\xed\x25\x91\xdc\x48\x13\x29\xfa\xa9\xda\xe6\x4c\x23\x0d\xcf\xd9\xcd\x33\x59\xa6\x9d\xf1\x89\xa7\xf1\x6f\xcb\xb6\xba\x27\x02\xa5\xc6\x5f\xb3\x2b\x30\x32\x20\x0f\xcf\xf6\xd7\x0d\xe2\xb5\x67\xd0\xf6\x1d\x25\x69\x4c\xa0\xd9\x2c\xc3\x13\x93\x48\x54\x05\x71\x4c\x56\x2b\x0e\x16\xbb\x7f\x58\x84\xf8\xa9\x20\x31\x54\x55\xfb\x51\xd5\x85\xbe\xca\xdb\xcd\xeb\xb8\xe0\x4d\xf7\x36\xf2\xff\x7c\x90\xd9\x7f\xdc\xdd\x55\x61\x2a\x69\x7e\x4e\xd5\x45\x84\x0a\x33\x45\xb0\x8e\xf5\xdd\xfa\x76\xd1\x7f\x78\x7a\x96\x0c\x43\xbb\xea\x7e\xcb\xfb\x66\x80\x0a\xc1\x72\x32\x9f\xab\xb6\xba\xc7\x5f\xed\xb8\x66\xa5\x42\x9d\x26\xba\x0f\xf6\x71\xfa\x2e\xaa\x08\x42\xc8\x7a\x60\x41\x2f\x55\x35\xf9\xd2\x38\xcd\x28\x14\x5f\xd5\x12\xd6\xbf\x61\x9b\xa8\x98\x19\x22\x23\x1f\xe1\x23\x38\x90\x8a\x41\x78\x76\xe9\xee\x54\x95\x4d\x45\x55\xe0\xc6\x2a\xf0\x2c\xae\x82\x2a\xc9\xac\x1b\xa3\xbd\xcc\x6d\xf9\x9a\xfb\x12\xad\x1b\x90\xc6\x92\x6a\x37\xba\xba\xcb\x75\x99\x3f\xbf\xb4\x4f\x67\xbf\x09\xab\x2c\x4e\xfd\x1a\xba\x2d\x5f\xb7\x7e\x09\x57\x2c\xb4\xc2\xcb\xe7\xb2\x5b\xd8\xf7\xbe\x98\xdd\xdf\x1c\xd6\xc5\x83\x7e\x46\xbc\xe5\x1a\xbf\xe4\xa6\x5d\x57\xba\xbf\xb7\x5e\x60\xe0\x5c\x8e\xc3\xac\xd9\xb5\x8b\x30\xca\x98\x57\xed\x40\x7d\xf5\xee\xf8\xa3\xd3\x9b\x22\x74\x48\x84\x48\x5f\xb7\x25\xaf\x95\xcb\xa2\xa7\x12\x5a\x91\xa6\x26\x41\x60\x9f\xc0\x18\x32\x08\xf8\xcf\x07\xdb\x87\x82\x38\x20\xfd\x1e\x67\xde\x32\xd1\xa3\xfb\x30\xff\x19\x5e\x6b\x05\xcc\x8a\xb5\xdb\x77\x87\xf6\xb8\x07\x73\x57\x95\xd8\xbe\xc0\xb7\x06\x6b\x8a\x6b\xdc\xee\x31\xfb\x45\xc0\x95\x72\x09\x31\xbd\x4a\x5b\xbd\x1c\x84\x28\x50\x92\x6a\xfa\xba\xae\x4e\x76\x17\x9d\x9e\x48\xa2\xb5\x50\x6c\xeb\xf7\x2e\x9c\x99\xb0\xb7\x95\x8a\x90\x2a\x42\x37\x90\xd7\x4b\xbe\xd3\x7e\x58\x16\x93\xd4\x8d\xbb\x0f\x36\x9a\xa5\x60\x7c\x0e\xf7\x59\x2c\xfc\x2b\xc5\x53\x2a\x23\x1c\x9e\xb1\xc4\x07\xb3\xae\x61\x46\xb0\x53\x4a\x58\x7f\xde\xf6\xad\xfa\x0b\xa1\xf6\xa0\x5d\x77\x54\x27\xa9\x15\x98\x37\x2d\xd6\x5b\x55\xcd\x3e\x8c\x01\x50\xe5\x85\x4c\xd5\x87\xf0\x51\x61\xca\x03\x57\xc0\xdc\xa1\x6a\x2b\x0b\x11\x5a\x9f\x67\xc1\x93\x32\x91\xa5\xca\x52\xaf\x6e\x92\x25\x2b\x13\xa1\x2d\x56\x59\xdd\x91\xf9\x0e\xae\x4c\x6a\x88\x16\x72\xbd\x23\x45\xd0\xe9\xbd\xd7\x81\xd2\x14\xc4\x18\xa7\x24\xd8\xcb\xee\xf8\xcf\xeb\x30\xb0\xaa\xd3\x7e\xe2\x3a\x65\x16\x77\x34\x4a\x6c\x98\xf8\x8c\xed\x15\xb6\x57\xd0\xe4\x6a\x38\x04\x38\x96\xea\xb3\x08\xc2\xee\x77\x25\x81\x1f\xa2\xec\x6d\xf1\x72\xc2\x1f\xca\x1a\x2c\x2e\x34\x3a\x0e\x32\x87\x3b\xec\x3e\x6f\x5f\xbb\x3e\xf6\xd6\x49\x9a\x89\x61\x5b\x38\xe6\xe5\xa9\xce\x5f\xa1\xc5\xe6\xa2\x08\xae\x93\x2c\xc6\xcc\xd1\x49\x6d\x16\x6e\x55\x75\x83\xbf\x53\xc4\xd7\x09\xc4\xb6\xd3\xde\x2d\x4b\x42\xcc\xce\x9d\xa6\x5a\x8c\x66\x66\xdf\x00\x9d\x8d\x12\x99\x95\x18\xdf\xdd\xf9\xeb\xcf\xb8\x30\x6e\x6e\x38\x8b\x93\x4f\xe1\x19\x9a\x61\x20\xad\xae\x56\x9b\xff\x5f\x39\x70\x09\xcd\x83\x00\x2c\x31\x9c\x60\x1d\x20\x3d\xa0\xf7\xd3\xca\x89\xe6\x71\x42\x55\xa4\xfd\x6e\xbf\xe9\xc9\x05\x9a\xa3\xa1\x57\x89\xb0\xc9\x37\xdf\xee\xaf\xef\x36\x87\x87\xfb\xdb\xed\xfd\x66\x54\x96\xd3\x22\xe1\xac\x57\x4e\xb6\x20\x91\xe9\xcf\x11\x89\xa2\xd2\xe1\x1a\x4e\x27\xd4\x17\xbe\xf3\x6e\x14\x70\xab\x34\x93\x3f\x42\x3f\x27\x41\x01\xb3\x1e\x42\xa0\x67\xfb\xa1\x96\xda\xc4\x53\xa0\x99\x35\x76\xf2\xc7\x55\x24\xb9\xf3\xe5\xca\xcb\x67\x0b\x0d\xc6\xe1\x68\x1a\x7b\x1e\x97\xdd\x49\xc6\xe0\x3f\x3f\x86\x1b\x5a\x91\xef\xb0\x3c\x07\xd9\xe7\x65\x0b\xad\xa4\x4a\x71\xe0\x31\x2f\x2f\xf2\x5a\x69\xe6\x2b\x4c\x2e\x47\xb0\xb9\xdc\x05\x31\x4d\xeb\xc0\xa0\xbb\x7c\x54\x2f\xd0\x27\xda\x5a\x87\x51\x16\xf5\x6f\xb1\x33\x5a\xf7\xc7\x22\x4e\xe0\xc3\x2f\x5d\xf6\xb3\x7c\x05\x18\x24\xdc\xb5\x99\x46\x25\xcf\x3b\x28\xcf\x50\x14\xbf\xc1\x62\x6b\x8c\x05\xe1\xb8\x36\xed\x0b\x85\xbd\x9e\x1a\x3b\x7d\xde\x86\x59\xd3\x2a\xd0\xda\x22\x82\x96\x77\x93\x6e\x1c\x1f\x2b\x02\x4e\x2b\x53\x76\x10\x06\x42\x83\xf7\xc8\x6e\xf2\xe6\x53\x99\x46\x81\x81\x32\xd1\x58\x27\xd1\xe6\x92\xcb\x5d\x24\x0c\x34\x10\x9a\xa8\xc0\x57\x2c\x0e\xc9\xe1\x34\xd6\x6b\x12\x18\x46\x31\x51\x58\x8e\x55\xd9\xb4\x58\x7f\x45\x28\x7a\x8a\x23\x86\x49\x4c\x6e\xad\x9a\x9c\x79\xf6\xd5\x63\x35\x7c\x4e\x45\x04\x65\x5c\xed\xef\xc6\x3b\x04\x46\x3c\x21\x7d\x85\xff\xb7\xaa\x8a\xea\xb9\x4b\x76\xbf\x40\xad\x87\xe3\x71\xc2\x3c\xc8\xcd\x61\x38\x46\x8a\xfa\xb3\xdf\x99\xc4\xf6\x65\x51\x4e\xd8\x6a\xbb\x7e\xf0\xa7\x49\x12\x43\x6b\x98\xcb\x02\x27\x5b\xc5\xec\x06\x24\xd2\x7a\x5d\x76\x11\x39\xd6\xae\xd0\x37\x6b\xd3\xb8\xa1\x69\x28\x48\xdb\x70\x5d\x35\x6d\x5e\x38\x2d\xb9\xc9\xcf\x4b\x39\xd7\x66\x20\xca\x9e\xa5\x2f\x1c\x2e\x3f\xa9\x2c\x62\x3a\xf2\xe0\x08\xdc\xaa\x8a\x4e\x66\x2d\xac\x9b\xbe\xe8\x3c\x46\xd2\x60\x96\x26\xbe\x62\xbe\x7b\x3f\xca\x6a\x6a\x9a\x27\x30\x63\x29\xfd\xf2\x2e\x3c\x1c\x75\xd3\x30\x53\x49\xea\x30\x65\x77\xef\x9b\xb2\xcd\xdb\x77\x1b\xbc\x4c\xaf\x88\x39\xab\xbf\x17\x68\x36\x65\x75\x7e\x76\x9d\xd6\x11\x6f\x79\x01\x19\x80\x22\xb1\xfd\x1e\x27\x16\xd1\x0c\x85\x19\x14\x0a\xa9\x03\xff\x85\xb4\x59\x1e\x6b\x6c\xda\xfc\x19\x47\x2e\x1a\x02\x21\x8e\xe9\xa6\xe5\xaa\xda\x94\xfa\x1a\x5a\x6c\x87\x8c\x13\x41\x0b\x99\x8c\x2d\xd7\xb0\xfd\x40\x31\xd1\x7d\x40\x66\x9a\x9c\x3b\x6d\x37\x74\x28\xdd\xbb\xc3\x2a\x34\x7d\x6f\xb6\x32\xed\x1b\xd4\xae\xce\xef\xa0\x9e\xd3\x47\xae\x98\x22\x0e\xe8\x73\xfe\x8a\x57\x79\xdd\xbe\x7c\x18\x8d\x8e\xc2\x7b\xd4\x46\x92\x4b\xf0\xcd\x66\x73\x78\xf8\x71\xdf\x57\x6c\x51\x1b\xf4\x0a\xcf\xc4\x03\xb8\xa9\xea\x5d\x0b\x3f\xe7\x90\x42\xc4\x30\x0b\xe5\xe0\x9b\xf4\x58\xd9\xee\xfe\xac\xf9\x89\x18\x01\x86\xbd\xfa\xc6\x7f\xe7\xe5\x73\x31\xdf\x78\x10\x63\x41\x2e\xe2\xe5\xb9\x28\xa8\x08\xe5\xd7\x2b\x7f\x3c\x53\xa9\x6b\xc2\xdd\xe3\xdb\xb6\xc5\xe3\xd0\x71\xf6\x43\x58\x64\x94\x5f\x2e\xcf\x65\x5b\xbf\xaf\xf3\x36\xbf\x64\x8b\xff\xcf\x05\x5a\xc0\x9f\x00\x43\x70\x7b\x3f\x89\x30\x2c\x11\x82\x67\x1f\x31\x41\x64\xfd\x57\xc9\xf3\xbc\x9b\xc9\x03\x62\x06\x8d\x96\x04\x5b\xf4\x4a\xf2\xbb\x97\xea\x6d\x7a\x07\x4d\x10\x58\x0c\xa5\xb1\x8d\xe5\xe6\xe0\x3b\x5f\x26\x70\xd0\xa7\xbf\x66\x7d\x52\x13\x30\x5b\xa4\x5e\x63\xd9\x3d\x1b\xec\xf1\xab\x26\x50\x8e\xa8\xdb\xc5\x7c\x3b\x6c\x1d\x07\x82\x42\x40\x0b\xe2\x98\x17\x67\x4c\x18\x01\x89\x42\xbd\x40\xf3\x62\x13\xdc\x4f\x77\x15\x13\x66\x40\x0b\xe3\x88\x95\x39\x11\xd1\x16\x26\x14\x09\x84\x17\x22\xbf\xfe\xa0\x01\xca\xda\xbe\x60\x7b\x9b\x43\x53\x95\xf7\x23\x39\xca\x0f\xbe\x32\x0a\x22\x63\x46\xdb\xff\x56\x2f\x99\x1e\x76\xe3\x04\x78\x14\xda\xfe\xa5\xae\xde\x0e\xf1\x21\xb7\x6a\xf4\xb4\x84\x1c\x80\x4a\xf7\x9e\x3b\x97\x57\x25\x8d\xf2\xd7\x1d\x45\x92\x84\x53\x64\xae\xad\x50\xfe\xf1\x54\x95\xc3\x16\x63\x22\x66\x89\xd2\x8f\x75\xa5\x37\x93\x07\x12\x09\x4e\x22\x48\x6f\xc4\xc0\xfe\xd9\xff\x19\x82\xc4\xb6\xea\x6c\x4f\xbd\x67\xf2\x8e\x33\x7b\x13\x07\x21\xf5\x39\x4a\xfc\xd5\xde\x10\xa4\x30\x3f\x62\x75\xee\xbf\x36\x0e\x18\x64\xbd\x52\x1b\x85\x10\xfb\xaa\x9b\xfe\x9f\xae\x2e\x26\x09\x21\x19\x22\x8f\x05\xd8\xa8\x49\x94\x0a\xc7\xda\x3d\xb4\x64\x7d\x68\x5b\xe1\x3f\x64\x52\xda\x86\xff\x79\x9b\x9b\x71\x7b\xcb\x64\x49\x92\x38\x7c\xd6\xed\x59\xfd\x7c\xdf\xb5\xbd\xcf\x88\x30\x59\xaa\x88\xf8\xfa\x02\xa5\x2e\x46\xe5\x78\x77\x98\xc5\x9a\x30\xe5\x3d\xf3\xd9\xbf\xbd\xf3\x84\xcc\x30\x6e\x21\xe2\xdd\x6d\xf6\x92\x89\xef\x7f\xfe\xb5\x9e\xfd\x34\x11\xc5\x44\xf3\xba\xed\x52\x83\xee\x2a\x27\x8f\x4b\x30\xab\x14\x5f\x56\xed\xe6\xdf\xe7\xfe\x79\x2c\xd5\x5d\x8c\x90\x81\x99\x9a\x45\x41\x81\xd6\x73\x68\x71\xd6\xce\x33\x5c\x23\x54\x80\x63\x39\x9a\xcd\x68\x69\x9e\x5d\x34\x0a\x0a\x4a\x7d\x84\x75\x80\x5a\xe6\x6d\x0d\xf5\xfb\xcc\x3e\x7e\xf6\x05\x26\xa1\xaa\xa9\x3c\xd7\x96\x36\xb3\xd4\x9b\x36\xc0\x13\xd2\xfb\x7a\xa9\xca\xb0\xcc\xcb\x7f\x81\xbf\x19\x20\x44\x68\xfa\x56\xd0\xaa\xed\x5e\x1e\xb8\x04\x6a\x1b\x19\x69\xe5\x42\xd1\x43\x5b\x1d\xe0\x63\x4b\xd1\xd9\xf5\x29\x04\x7a\xad\x6e\xdf\x0d\x8e\x04\x29\x8c\x32\xca\x02\x74\xa0\xc0\x6d\x99\x0f\x9a\x62\x46\xa7\x4c\x78\x13\xf3\xea\x15\x6f\xa1\x69\xe9\x87\x75\xf1\x46\x5e\x3e\x37\x16\x8f\xf5\x3b\x57\xbd\xee\x3c\xc6\xc3\xd3\x57\x45\xd1\x4d\xef\xa3\x2c\x66\x99\xb8\xd1\x60\xa5\x51\xf2\xe6\xaa\xce\x7d\xbb\x61\x5e\xbc\x98\x7e\x04\xd3\x88\x6a\xa7\xeb\xa7\x87\xdd\x6a\xfb\x64\x71\x8a\x87\xed\xfd\xfa\x69\x73\xb7\xe9\x29\x37\xc6\xa0\xe4\xf6\xce\xaa\x73\xdd\xe4\xaf\xbd\x0a\x77\xdf\xa0\x85\x20\x88\x62\x4a\xe5\x4c\x5e\xea\xd5\xb9\x06\x5a\x74\x9a\xbc\xf5\x5a\x7a\xe3\x6e\x1f\x04\x01\xa4\x44\x40\x7b\xa9\x8e\x28\xbb\x18\x67\x02\xe9\xf1\x83\xb4\xea\x2d\x57\x6b\x84\xc1\xe6\x92\xff\xd7\xc5\x7f\xdd\x47\xc2\xd8\x12\x85\x15\x94\xd6\xeb\xc8\xc9\x25\x4d\xd5\xf4\x21\x88\x12\x41\x80\x94\xeb\x20\xf8\x73\xbb\xf1\xbf\x21\x66\x01\xd5\x31\xbb\x39\xbb\x38\x47\x21\x88\x91\x51\x7e\xb4\xaf\x73\xb2\x84\xfe\x3b\xe6\x28\x10\x24\x91\xa1\xdd\xec\x5f\x55\x5e\x5e\x41\xdb\xce\xb2\x50\x08\x92\x4c\x13\x8c\xef\xdc\xe8\x47\x7a\xb3\x7c\x79\x06\x82\x84\xc5\x94\xd8\xbf\x92\x3e\x49\x73\x98\x3c\x75\x08\x12\x1e\xab\xf4\x02\xaa\x71\xfb\x6d\x3f\xfb\x06\x96\x31\xaf\x41\xb0\x6d\x1e\x6b\x7c\xc5\xd2\x0d\x9f\x50\xe0\x86\xd2\x1e\x04\x3c\x61\xf1\x80\x14\x75\xea\x53\x9b\xf6\xe5\xa1\xd6\x58\xff\xf8\x9a\x3b\x5c\xe7\x40\x49\x99\xfc\x3b\xf5\x56\x86\x40\xe8\x58\x4d\x88\x0f\xfa\x35\x6f\xbc\xad\xc9\xb2\xeb\x19\x04\xc0\x8c\xab\xda\x8e\x89\x86\x4f\x13\x0a\xd9\x47\x55\x09\x08\xc0\x58\x25\x09\xc2\xb3\x79\x37\xca\x0f\xde\xb4\xd9\x17\xcb\x30\xa6\x8c\x6e\xbf\xbd\xdb\x1c\xf6\x0f\x87\xbb\xd5\x9f\x9b\x43\x78\xd8\x7d\xdd\xee\xd7\xb7\x0f\xf7\xfd\x94\x91\x90\x08\x6b\xc7\x79\x89\xce\x59\xfe\x49\x52\x5a\x6c\xf4\x0f\x4b\x24\xf1\x27\x52\x5a\x44\xce\xab\xd4\x9a\x88\x2e\xf5\x20\x20\xd0\xdc\xc6\x96\xcf\xd8\xee\xde\xe0\x34\x7b\xc8\x9a\xcb\xd4\xb9\x24\x7c\x85\xa6\x8b\xfe\x5d\xb8\x66\x21\x94\xa3\x67\x6b\x02\x69\x2c\xf7\x9a\xd4\xc2\x16\xf5\x92\x21\x30\x71\x18\x53\x54\x7d\x2e\xb5\x8f\x91\x3e\xe0\x82\x43\x60\x52\x41\x6c\xeb\x02\x4d\x1b\xb1\xe9\x95\x85\x51\x14\x65\x59\x4f\x6b\x21\x40\x93\xbb\xb4\x1b\xc4\x66\xef\x88\x38\x10\x46\x31\xa7\xbc\xe6\xee\x7d\xc1\x95\xdd\xbd\xf0\x93\x6b\x0c\xa3\x18\x43\x87\x44\xba\xc5\xd7\x68\xfe\xbd\x3c\xa4\x80\xa6\x3c\xbb\xd2\xbd\x35\xeb\xf2\x5f\x17\x87\xd6\xc6\xb1\xb2\xb6\x5c\xb6\x1e\xf1\x7e\x37\xb2\x05\x82\x30\xc1\x58\x5a\xb2\x6c\xe9\xe0\xcc\xfb\x6a\x71\x71\x75\xe3\xd3\x00\x23\xe5\xc1\xf4\x56\xcc\xb5\xb9\x14\xc9\x85\x30\x45\xa9\x1c\x16\x63\x2d\x2f\xc4\x0f\xa8\x7c\x38\x3b\x73\x96\x31\x12\xe8\x6e\x5e\xaa\x73\xa1\x77\xa3\xa2\xa5\xbf\xd6\x8c\xf3\xd4\x65\x3b\xab\x57\xd8\xaa\x6a\x2c\xf6\x01\x61\xd6\x25\xdf\x9e\xee\x9d\x97\x54\xde\x9e\x7e\x05\x8b\x63\x6e\x5b\xaf\x6d\x97\x9a\x97\x38\xed\x45\xcc\x3b\x89\xfe\x53\x69\x0c\x3d\x6e\x97\xea\x4b\x17\xf2\x17\x10\xb2\x2c\xa0\x28\xcd\xfb\xc2\x8c\x81\xb1\xf3\x91\x12\x5c\x4d\xb8\x3b\x30\x7b\xa4\x4c\x4a\x8d\xd3\xb6\x81\x3b\xc2\x03\xe5\x00\x47\xa4\x1e\x7b\x42\x95\x43\x71\x83\x24\x20\x30\x3b\x09\x4f\x4c\x1a\x5e\x40\x5d\x17\x0b\xa3\x10\xf2\x4c\x7b\xa5\x23\xab\xab\x38\xcb\x3d\x20\xe4\x8c\xd9\xf2\x16\x40\xa9\xb7\x64\xf3\xda\x0c\xff\x59\x7e\x61\x42\xae\x22\x0a\x93\x36\xdf\x36\x57\xa3\xb0\x0e\x42\xc1\x02\x6a\x43\x77\x37\x71\x53\xea\x8f\x9d\xea\x3e\x41\xcc\x73\x7f\x2e\x11\x53\xd4\x66\xf2\xba\x69\x9d\xb1\xed\x75\xdf\xfd\x83\x10\x22\x46\x2d\xae\x7f\xfb\x14\xab\x3f\x10\x27\x91\xf4\x30\x33\x8d\xf5\x5d\x55\xe2\xbb\xed\x0e\xe3\x34\x5d\xed\xc6\x6a\xd4\x83\x9a\x08\xbe\xed\xa1\x59\xe6\x34\x43\x08\x59\x4a\x7b\xa1\x45\x47\xdf\xfb\x94\x0f\x42\xe0\x82\xa0\x26\x8f\x5f\xff\xb9\xff\xf3\x7e\x75\x7d\xfd\xd4\x1f\x01\x46\xa9\x16\x91\x1c\x0e\xaf\xb9\x1a\x9b\xc3\x7d\x14\x0b\x84\xa0\xad\xf1\x3f\x35\xce\xfd\xea\xe5\x3d\x9e\xbd\x2c\xd0\x05\x2c\xec\xc2\x73\x7d\xb9\xe2\x00\xa1\x4c\xad\xea\xea\x00\xa7\x98\x88\xcc\xf8\x4d\x28\x94\x82\xcb\x31\x4e\xe4\x5b\x97\x1c\xbf\xd5\xf9\x07\x80\x0e\x08\x25\x24\xb4\xc4\xd3\xa5\xca\xaa\x7f\x20\x2a\x8c\x3d\xe4\x72\xab\x2a\x42\xbe\x5c\xcf\xc1\x60\x10\xaa\x2c\xa5\x54\x6d\xb3\xff\x7a\xb5\xdd\xaf\xfc\x87\x75\xc0\x6d\xf7\xbd\x86\xb7\x27\x28\x75\x75\xec\x12\xaf\xe9\xe2\xa1\x4d\x1c\xa7\x03\x6a\x61\xbd\x79\xf0\x47\x30\x08\x48\xe1\x41\x3a\x44\x98\x25\xd5\x58\x8c\x3d\xea\x71\x4f\x14\x42\x13\xa4\x7d\xb5\xa7\x0b\x88\x8f\x83\x49\xd1\xd8\x68\x67\xf6\xa3\xbb\xfd\x88\x82\xd7\xf2\x05\xeb\xbc\xdd\x53\x9b\xfa\x0b\x96\x9e\xe6\x3e\x7d\xdd\x4c\x18\x52\xaa\x7f\xb7\xef\xbf\x55\x46\x84\x95\x31\x6d\x3b\x5d\xe1\x0d\x5a\x6f\x0b\x1f\x76\x0c\x22\x36\x7e\xf6\x46\x01\x57\xde\x7f\x6d\xfb\xfd\xf0\x34\xdb\x42\xa2\xd0\x70\x4a\x9c\xfe\x45\xd9\x17\xa1\x65\x16\x67\x76\x14\x45\x92\x36\x40\x54\xd5\x6d\xa5\x7e\x46\x4e\x6c\x07\xa2\x48\x31\xeb\xa4\x4c\x37\xea\x60\x6d\xec\x9b\x03\x4c\x25\x88\x21\x8a\x93\x90\xc3\xa8\x82\x32\xa9\x92\xf9\x31\x9c\x1b\x27\x95\xe1\x80\x8d\x37\x95\xf7\xe5\x5a\x5e\xbe\xa2\x58\x2b\xb2\xd7\xbf\xc9\xc9\xa9\xbd\xf6\xef\x7e\x94\x30\xa1\x46\xbd\x0c\xcb\xb7\x22\x7f\xba\xa6\x1f\x82\xda\xc3\xdc\x1c\xf7\xfd\xb3\xa5\x67\xb8\x17\x89\xc9\x7c\xd9\xed\x3b\x96\xba\xaa\x57\xa7\x53\xe1\x3c\x0d\x76\xaa\xea\x76\x73\x72\x84\xb2\x1b\xe3\x28\x51\x85\x28\x4d\x2c\xde\xda\xc9\x6b\x78\xc8\x81\x7b\xac\x9f\x06\x57\x51\xca\xac\x08\xda\x13\xea\xa7\x5c\xca\xaa\x1c\x12\x7b\x88\x52\x19\x19\xab\xbd\xaf\xcf\xca\x1a\xe5\x2c\x9f\x25\x4b\x42\x3a\xcb\xce\xc2\x02\x9b\xbc\xb9\x22\x80\xfa\x0c\xc0\x06\x51\xc6\x0d\xdd\xd9\xcd\x2f\xf5\x72\xd5\xaa\xf1\x22\x1e\x65\x22\x0a\xa4\xeb\xcc\xcc\x62\xdc\xdf\xf5\xd3\xba\x0f\x33\xaa\xff\xf5\x0c\x3f\xa7\x56\xe1\x0e\xb3\x48\xd2\x24\xf8\x82\xed\xd7\xea\x19\x26\x3f\x23\x8e\x46\x31\x7c\xc4\x52\x2b\xd4\x4d\xb8\x53\x5d\x57\x53\xfc\x0e\x44\x3c\xb0\x06\x5c\x9f\x5a\xe5\x2e\x6e\xfe\xee\x04\x22\x12\xc4\x32\x92\xb6\x6e\x3a\x20\x97\x20\x12\xa9\xe5\xe5\xae\x9a\x1c\xca\x35\x9c\xf2\x16\x8a\x35\xf5\x94\xce\x53\x7c\xc8\x79\xee\x96\x08\x51\xb7\x09\xa2\xd7\x55\x9e\x93\x35\xff\x7f\xfc\xd7\x7f\x5d\x82\xc4\x86\xa7\x1d\xb0\xf6\x85\x56\xb7\x93\x44\x32\xb0\x0b\x84\x2f\xf7\x3c\xd6\x95\xc9\xfb\x37\x52\x46\x11\xc5\x90\xdd\x6e\x7d\xd5\x03\x77\x20\x52\x71\x14\xb8\xa4\x9d\x44\x6d\x6e\xd7\x1b\xa8\xcb\xcb\x29\xec\x87\x6b\xab\x8c\x69\x3b\x13\xaf\x79\x75\x6e\x68\x79\x77\x8d\x64\x37\x4a\xa7\x32\x93\x13\x0a\xfd\x53\xf7\x4e\xcd\xd2\x84\x48\xcb\x84\x88\xd4\x5f\x48\x8c\x7c\x3d\xc8\x38\x43\xa4\x8d\xa4\xea\x3e\xd4\xed\x8f\xaa\xfe\x69\xf5\x38\xbc\x51\xe4\xe2\x83\x59\x6a\x63\x41\x84\x8c\xd1\xdc\x7f\x81\xe6\xe5\x2a\xbf\xd4\x7c\xfe\xdd\x24\x9a\x3e\x00\x44\x96\x1a\x67\xb5\x58\xb7\xb9\xf2\xca\x56\xe3\xb9\x6c\x22\xab\xc2\x73\x95\xb7\xaa\xca\xcb\xbb\x4a\xe6\x45\x7f\xb7\x4d\x6c\x8b\x8b\x36\x59\xed\x36\xb7\x7d\x0d\x79\xbb\xac\xbe\x03\x91\x91\x21\x85\x45\x87\x23\x96\xc4\x1d\xf4\x7f\x47\x5b\xc0\x23\x21\xe7\x5d\xfe\xab\x7d\x77\x76\x2a\x4f\xe7\x62\x58\x15\x8d\xb1\x88\xee\xee\x29\x40\xdb\xed\x85\x93\x25\x2c\x0e\x62\xab\xf4\x56\x9d\x7c\xcb\x7d\x5b\xb6\x95\xab\xfa\x2c\x2f\x3a\x71\x60\x2c\xfe\x5d\xa1\x07\x3c\x4d\xf7\xcd\xe1\x46\xc4\x61\x94\x12\x2c\x95\x54\x8a\xef\xdb\x66\x57\x15\x9a\xd4\x81\xe8\x4d\xf1\x83\x34\x7a\xc3\xf7\xe5\x5a\xf3\xec\xfb\x23\x66\x71\x72\x74\xdb\x3d\x60\x67\xf2\xc8\xe3\x38\x88\xc3\x01\x42\x49\xa6\x93\x23\x56\x05\xc4\x71\x18\x90\x3a\xe4\x0b\x34\x6b\xeb\x70\x7f\x29\x83\x30\x9d\xf5\x71\x9c\x58\xc1\x68\x72\xc4\x79\x2c\x40\x79\x54\xa6\x3f\x27\x79\xd5\xf5\x6c\x66\xbb\x70\x0f\x51\x6a\x9c\x06\x31\xb1\xd8\xbb\xa5\x6d\x4c\xc6\x83\x38\x65\x31\x85\x93\xd0\x34\xf9\x73\xe9\x55\x19\x96\xc8\xb6\xb3\x1b\x91\xea\x98\xe2\xaf\x1d\xb6\x57\xe7\x9c\x1e\xd9\xdf\xdf\xf8\xe2\x54\x4b\xa6\x06\xb9\x18\x27\x70\x31\x14\xca\xe2\x2c\x36\x52\xf5\x2a\x2d\xd4\xd0\xbc\x26\xc5\x9d\x41\x31\x05\xe2\x2c\x53\xe4\xfd\xb2\x7f\x09\x8e\xc9\x7f\xfa\xbf\xb2\x90\x3a\x91\x8e\xba\xd7\x2c\xf2\x00\xbb\x61\x9c\x70\x8a\x47\x1b\x15\xec\xda\xea\x34\x8a\xf8\xe3\x8c\xa9\x8c\xac\x0c\x2c\x9a\xa5\xfb\x6d\x33\x18\x75\x37\x46\x13\x22\xf2\xdb\xe9\xb9\x06\x8d\x77\xd0\xb4\xc3\x9d\xcd\x38\x23\x28\x3e\xa5\x14\x96\x40\x6c\xe1\xd5\x13\xe7\x21\x88\x33\x6d\xa2\xd4\x6b\x31\x0f\x6c\xdd\xcb\x0b\x66\xa9\x54\x54\x66\x28\xe0\xf9\x5b\x3e\x13\x2d\x87\x98\x65\x8a\xe4\x8b\x1f\x4e\x58\xee\xab\xfd\x0b\x3a\x62\xbe\x3f\x2c\x53\x8a\xcf\xee\xde\x7f\xe4\x23\x3b\xa7\x45\xc4\xe5\xf4\x7b\x79\xa4\xa8\xc0\x65\x75\xd2\xe6\xd6\xae\x63\x06\x90\xff\x00\xb3\x5e\x13\xae\x9c\x5b\x0d\xbc\x21\x37\x40\xc4\x21\x45\xdf\x55\xf9\xb7\x24\x1c\x20\x16\x5c\x11\x80\x69\xf7\x63\x7b\xb3\xf7\x3e\x75\x8b\x30\xcf\xcb\x4d\x32\x16\x60\x15\xd0\x57\xb7\xeb\x9e\xf0\x39\xe6\x7b\x42\x0c\x3c\x4e\xc7\x58\x07\x92\x4a\xdd\xf8\x1e\x75\x77\x9c\xd1\x22\xb1\xf6\xe8\xce\x5f\xef\xdd\x42\x32\x52\xf0\x28\xf5\x93\xd3\xbf\xfe\x13\x3f\x34\x37\x98\xfd\x28\x10\x11\x05\xf3\xc7\xbc\x3c\x37\xa4\x01\xec\x98\xf8\x93\x77\xc8\x17\x83\x63\x19\x20\xb1\xf1\x7b\x17\xa6\xee\x41\x4f\x17\xbf\xc9\xcf\x96\x19\x77\xca\x69\x06\xeb\x7a\xee\xfc\x02\xb1\xd4\x19\x31\x2f\xda\xfc\x88\xa1\xff\xa5\xd2\xc4\x24\x98\x4e\x6b\x26\x09\xf8\x5c\xac\xda\x2a\x89\x59\xda\x57\xd9\xd7\xe4\x9d\xda\xee\xf1\x78\x2a\x08\x5d\xe4\x47\x69\x43\x8e\xed\xc7\xc3\x66\xff\x95\x82\xc2\x5b\x68\x9c\x5c\x82\x1f\xa3\xa3\x58\x28\x6b\x0f\xe9\x59\xe4\x7d\x94\x1f\xeb\x38\x25\xce\x8c\xdd\xa9\xe8\x52\x1e\x3e\x9c\x2e\xfd\x67\x14\x31\xd9\x14\x34\x6d\x81\x77\x79\x49\x25\xfe\xfe\x8c\x29\x12\x90\x92\x74\x04\xb7\xc7\x53\x31\xbb\x21\x9a\x45\x10\x0e\xd1\x64\x33\xa5\x81\x41\xac\x25\xa3\x06\x06\x61\x17\xeb\x71\xa7\x78\x7a\x1e\x8c\x64\x64\xc9\xb5\x27\xc8\x3d\xc4\xcd\x6f\x0e\x98\x18\x41\x79\x9f\x82\x63\xf7\x22\xcf\x9f\x0a\x72\xbb\x67\xa2\x03\x68\x78\x21\x3d\x7b\xe3\xa6\x63\x4d\x68\x2f\xe8\xa5\xd2\xc5\xc5\xf3\x4d\x02\xe4\xa9\xab\x62\xdd\xad\xfe\xf2\xd6\xa5\x17\xc4\x28\x48\xc2\xd0\x4a\x9c\x50\x99\x88\x7a\x79\x76\x8b\x78\xf2\x5a\xb7\x9f\x16\x83\x67\x85\xc6\x24\xe4\x46\x3a\xc9\xfd\x07\x33\x76\xa2\x59\x57\xc7\x13\x94\xef\xcd\x24\x0f\x4e\x42\x6d\x5d\x21\x5f\x2d\x25\x7a\x52\xd8\xeb\x87\x64\x04\xd5\x3d\xa8\x02\xa1\x5e\x15\x85\x55\xdb\xf4\x86\x80\x90\x84\x18\x78\x29\xe4\x6e\x5d\xe4\x7f\x0c\x41\x69\x12\x05\xa1\xcd\x5a\x1d\xdd\xf5\x2b\x42\xdd\x4a\x04\xff\x54\x93\x28\xca\xa8\x8a\xb6\x47\x38\x7e\x45\xd0\xcd\xfa\xa5\xca\x67\x9c\x01\x48\x22\xb0\xda\xf0\x7b\xf8\x89\x44\x1c\xa9\x35\xd6\x1f\x9a\xeb\xce\xff\x5d\x9c\xad\x49\xa4\x05\xb9\x78\xe9\x8a\x0c\x8d\xbe\xe4\xa6\xbd\xcd\xcb\x11\xab\x01\x92\x24\x4e\x08\xbd\x77\x38\x56\x25\xbe\xf7\x7f\xcd\x32\xaa\x4f\xfa\xe5\xea\xfb\xe3\xfa\xd7\x02\x3c\x0b\x92\x44\x6a\xaf\x43\x3d\xd1\xd9\x9f\x2e\x44\x49\x1a\x30\xe3\xfb\xe8\x5b\x9b\xe4\x4e\x7c\xe9\x20\x49\x65\xe6\x54\xb3\x7d\x6f\x7b\xf9\x0d\x4c\x52\x89\x54\xe2\x5a\x91\xcb\xd7\x92\xde\x18\x24\xa9\x8e\x1c\x0a\xd4\xda\x52\xcd\xa6\x63\x96\x65\xca\xc9\xc3\xf4\x6a\x69\xb3\x42\x62\xc2\xd2\x98\xa2\x03\x0a\xe5\xb0\xe9\xbb\x1e\xfd\xf2\x91\xf0\xd8\x12\xc6\xec\xbb\xd1\xdd\xd3\xf8\xce\x1f\x13\xa0\x12\xd5\xef\x4f\xa4\x5a\x5b\x80\xfa\x79\x3b\xa7\xf8\x41\x97\x0d\x67\xbe\x50\x7c\xd6\x6b\x2c\xdb\x1f\x98\x8f\x5c\xe9\xbb\x11\x19\xc5\x83\x9b\x92\x52\x84\x71\x6e\xdb\x25\x4c\x34\x69\x9c\x96\xc5\x13\x62\xb7\xa0\x94\xea\xdd\x91\x69\xfb\x61\x92\x52\x84\x73\xe9\x76\xd8\x01\xbd\x91\x57\xe5\x6c\x15\x4a\x64\x82\x64\x86\xf5\x63\xbb\xbb\x7e\xb8\x5b\x3f\x6c\xef\xfb\x23\x19\x4b\xbc\x17\x10\x96\x50\xb4\xef\xb3\x3b\x2b\x99\x15\xc4\x79\x7c\xbc\x5a\x1f\x56\x8f\xdb\xfe\x83\x4c\xd3\x03\xd1\x9e\x69\x3d\xfe\x3a\x40\xcf\x0b\xb1\x3a\xfd\x76\xcf\xdb\x96\xa6\xea\xdf\x61\xe5\x58\xce\xb7\xf8\x9a\x9f\x9b\xeb\xd5\x43\x7f\x20\xcd\xa6\x5a\xbd\x17\xfe\x7d\xdd\x18\xa4\x5a\x3c\xe9\xd4\xb9\xc8\xf3\x1a\xa1\x68\x66\x17\xaf\xb8\x35\x9e\x3a\x10\x4f\x76\x77\xea\x36\x9d\x4a\x43\xff\x52\x60\x2c\x49\x6a\x07\x8f\x58\x3f\x63\xa9\xde\xbf\x95\xc4\xea\xee\x8f\xa7\xcc\x6a\x56\xb5\x78\x9a\x7a\x93\x42\x82\x99\x11\xde\x35\x1c\x51\x3f\x9c\x2f\x3b\x95\x9f\x45\xb3\x09\x72\xce\x47\x39\xac\xef\x52\x4c\xd2\x82\x04\xb5\x25\x49\xfa\x1a\x42\x17\x51\x36\x84\xd3\x18\xe0\x7d\xf3\x17\x18\x0d\x8b\x1d\x58\xd3\x9d\x74\x5f\xb9\x80\x94\x1c\xc6\x6f\x3f\xa2\x4b\x40\x62\x58\xa6\x53\x4f\xd6\xf0\x20\xdc\x69\x26\x92\x18\x69\x43\x8a\xbc\xb9\xa5\x8a\xe5\xec\xdb\x8d\x8e\xbc\x6b\xd3\x5d\x5e\x20\x3c\x23\xe9\x32\x5f\x6c\x07\xe3\xef\x4d\x83\x38\x46\x5b\x5b\x7a\xc5\x7a\x78\x21\xd3\x20\x01\x82\x9e\xb9\x94\x07\x3e\xf4\xd3\x87\x34\x50\xd6\x1e\x8f\x8a\x90\xfb\xea\x07\x4e\x35\xb5\x20\x0d\xb3\x58\xa6\x76\x8f\xb9\x46\x93\x97\x48\x3a\xe2\x7e\x3e\xa6\xa1\x56\x68\xbb\x92\x9b\xa7\xf8\xb0\x5e\x3d\xfa\x03\x51\x84\x89\x45\x5c\x94\xeb\x8a\x60\x05\x5f\x96\xd0\x48\xe3\xd5\x2a\x8d\x20\x35\x9c\xf6\x87\xba\x86\x9b\xee\xca\xfb\xb3\x61\x1a\x58\x76\x7c\xb7\xbd\xdd\x56\x4d\xbb\x2a\x35\x25\x1d\x9f\xea\x3c\x40\x1a\xab\x30\xf2\xef\x14\xd4\xcf\xd8\x5e\x3b\x19\x3f\x92\x9c\x99\xf5\x04\xd3\x24\x0e\x53\x35\x42\x15\xd1\x3b\xb4\xb4\xb0\xa6\x89\x91\x01\x8c\xc0\xc7\x94\x07\xce\x86\x2e\x9b\x8c\xcd\x1e\x40\x1a\x07\x84\xfd\xa5\xd4\xa5\xdb\xee\xc6\x4b\x5e\x9a\x45\xda\x39\xbe\xb4\xe7\xba\xbc\xc6\xf9\xbc\x49\x59\xa2\x49\x61\x85\x30\xe7\x77\x3d\xcf\x07\x52\x26\x42\xd2\x2c\xf9\xe6\x2c\x2f\xfc\x25\x4e\xbf\x9d\x29\x6b\x69\xb2\x55\x95\xbf\x31\x04\xcb\x6c\xbc\x1c\xf8\xa7\x61\x75\xca\x30\xa4\x30\xcf\x37\xd0\x3e\xa2\xd0\x41\xca\xb9\x26\xbb\xca\xf5\x5f\x57\x9f\x70\xb1\x20\xe5\xce\xb9\xda\x46\x50\x1b\x0b\xea\x72\xb9\xbf\x5f\x2f\x17\xfb\xd0\x29\x57\x49\x30\xc8\xad\xef\xe6\xd5\xe1\x7e\x94\x21\x98\x07\x05\xdd\x96\x5a\xbb\x2d\xbb\x59\xef\x8f\x6b\x49\x05\x05\xd0\xda\xb5\xa6\xfc\x91\x2e\x68\x75\x5b\xa9\x0f\xb3\x7b\xb0\xf8\xf4\x3b\x80\xc7\x04\xdc\xf4\xe0\x70\x7a\x0d\x9f\x67\x97\x2b\x01\x68\xd0\xf7\x6f\xb7\xeb\xd5\xfd\xe1\xf1\xe1\xfa\xb0\xf9\xe7\xfe\x69\xb5\x26\xb1\x8f\xab\xd5\xce\x37\xf4\x53\x15\xe9\xac\x7b\x93\xa6\x56\xab\x17\x01\xcf\xf2\xfc\x57\xdc\x84\xae\x3b\xbf\x81\xba\xdc\x80\x7a\xb9\x1a\x70\x74\x90\x6a\x69\x5f\xef\xc1\x6f\x76\xf1\xe6\x6a\x25\x29\xc0\x5d\x43\xa9\x2f\x72\xae\x7e\x8c\xa6\xc9\xf0\xb4\xba\xff\xb2\xd9\xdc\x5f\x1f\x44\xff\x25\x5a\x6b\x6b\xb8\x54\xfd\x7a\x9f\x83\x88\xfd\x18\x13\xd1\x92\x5d\xe2\xaf\x76\x2c\xdd\xb0\x86\x19\x0b\x19\x52\x0c\x15\x89\x02\xe5\x65\xde\x8e\x3d\x9d\xc3\x59\xb4\xec\x87\x27\x96\x32\xd7\x3d\xb8\x5f\x27\x67\xef\x32\x6e\xb7\xa4\xc8\x02\xea\x3a\x3c\xc8\xbc\x85\x92\x0a\xc2\xe3\xe0\x22\x45\xa5\x08\x2a\xb0\xfb\xb0\x21\x9b\x1a\x05\x14\x03\x55\xc6\x0c\x9f\xef\x57\x49\x63\x58\x22\x9c\x40\xf8\xa0\x40\x09\x59\x10\x0a\x61\x91\x17\xcd\x1e\xd5\xcb\xf8\x4b\xb3\x20\x53\xd6\xae\x45\xcb\xfe\x4f\x2c\x0d\x07\x64\x79\x5e\x3e\x6f\x4a\x3d\xc0\xa4\x21\x0b\x43\x46\x51\xee\xdd\xea\xfe\xeb\x6a\xbf\x5f\xdd\x3f\x3e\x3d\xfc\xf3\xaf\x30\xdc\x7f\xfd\xb1\x59\x7d\xdf\xf4\xc3\x98\xb1\x4e\x73\x2f\x70\x95\xeb\x0b\x69\xa4\xc9\x56\xda\x0d\xb6\xf0\x8e\xaa\xf2\xbd\xda\xfc\x75\x5a\x56\xc9\x42\x13\x27\xcc\xcb\x6a\x6c\x34\xc1\x94\x9d\xcb\xf7\xe4\xc9\x65\xa1\x51\x9e\x46\x69\x1b\x7d\xb3\x8d\x3b\x8b\xc2\x98\xf2\xc2\xbb\xd5\x9f\x9b\xa7\xeb\xd5\xc3\xe1\x66\xb3\xb9\x3e\xdc\x7d\xbb\xdd\x6f\x1f\x6f\xb7\x1e\x43\x0d\x59\x94\xc4\x5e\x35\x68\x55\x3e\x23\xc5\x48\x57\xef\x73\x87\x44\xee\x47\x33\x24\x50\x59\x53\x1d\x71\x24\x35\x06\x59\xa4\x14\x15\x95\xe0\xac\xf3\xf6\x1f\x67\x3c\xe3\xe6\x57\xde\x78\x49\x61\xc8\x22\x93\xd2\x06\x7b\x70\xe6\x82\x63\x27\x10\xc8\xe2\x24\x4b\x7a\x44\x30\xb1\x0a\x57\x79\x3d\xee\x68\x4c\x57\xcb\x2c\x4e\x35\x19\x0d\x59\xa7\x18\x2b\xc1\xf4\xa5\x82\xe2\x09\x41\xf5\x8c\x1c\xc8\x62\x6e\x53\x0e\x92\xa0\x24\xd5\xb2\xc3\x6e\xdd\x0b\xa1\x40\x16\xcb\x98\xd8\xc8\xe4\x22\x32\x7a\x97\xb3\xd8\x70\xc2\xf1\x9c\xba\xe7\x50\x10\xd6\xb5\x9f\x69\x49\xca\xc1\x69\xc1\xaa\xf3\xef\xd6\xf5\x2c\x51\x51\x3c\x54\x95\x2e\xb0\x20\x6e\x54\x16\x86\xa9\x63\x2e\x1c\x7c\x2f\xf9\xf0\xd6\xaf\xa5\x59\xa6\xb5\xcd\x75\xde\xf2\xb2\xf7\x4a\xf4\x07\x99\xb1\x5a\x29\x44\xe3\xa6\x77\xf8\x06\x67\x8b\x75\xc6\x43\x69\x17\xd2\x7f\x3e\x6e\xd6\xfb\xcd\xb5\xff\x2c\x8f\xad\x4a\x35\x68\x7d\xb5\x5f\x2f\x6c\x3a\x0e\xac\x32\x5b\x0c\x33\x9e\x88\x68\xe6\x7a\x43\x41\xa1\xb3\xbe\x19\x97\xd9\xdc\x27\x20\xb2\x80\x08\xbb\x72\x39\x0d\xe9\x49\xe2\x9c\x8c\xf3\xe7\x0c\x40\x51\x43\xe0\xba\x7b\x76\x71\x78\xb8\xde\xac\x0f\x51\x10\x05\xfe\xca\x65\x20\x69\x0a\xdc\xe3\xdb\xaa\xa6\x4a\xeb\x9c\x91\xf2\x5f\x8b\xbb\xe3\xc5\x6a\x3f\x2b\xc0\x67\x92\x2b\xe3\x13\xbd\x1a\xdb\xe7\xe5\x75\x3c\x93\x22\x61\xf1\x28\xc0\x59\xd1\x6d\xb3\xb4\xf1\xe9\x9b\x28\x65\x02\x83\x14\xc4\x94\x17\x31\xbb\xad\xd2\x80\x15\xa1\xa3\x28\x7b\xf2\x8a\xa8\x30\x22\x28\xd4\x99\x1c\x15\xaf\xec\x37\x2c\xa7\xc6\x99\x32\xca\x3b\x35\x5b\x1d\x98\x39\xa4\x62\x18\xaa\x83\x88\x84\xfc\x41\xeb\x0b\xf5\x73\xc8\x34\xa6\xca\x11\x5f\xdb\x95\xb7\xd5\x9a\x66\xd9\x19\x46\x86\xd0\x66\x23\x43\x28\xd3\x45\x9d\xc5\xb8\xcd\x96\x99\x28\x13\x0e\x6e\x7f\x55\x55\xc5\x4d\x38\x02\xac\xb1\x20\x48\xa4\x18\xe9\x8d\xbb\x74\x8a\xd6\xc8\xab\xf7\xc5\xfb\xcf\x82\x20\xb5\x6e\x6a\x43\xa5\x7b\x42\x77\x03\x16\x38\x2b\x94\x06\x5b\x12\xca\x1d\x23\xa2\x2e\x1c\x96\x27\x8f\x8c\x05\x3c\x91\xae\x0a\x65\xeb\xd1\x24\xb9\x71\xfd\x3b\x9e\x05\xb0\x30\x89\xa9\x10\xd6\x56\xcf\xcf\x05\x7e\xb7\x56\xd8\xcb\xb7\x9e\x85\x89\x22\xcd\x93\x13\xbc\x5f\xd4\xc1\x58\x98\x05\xe0\x9f\x0b\xce\x66\x14\x0b\x33\x20\x8a\x8f\x4f\xca\xa8\xce\xb8\x5c\xd7\x63\xa1\x80\xc8\xcd\x05\x1b\xb6\x3f\xe1\xc9\xba\xff\xae\xe1\xb4\x2d\x57\x6d\x5b\xa1\xe7\xa0\x01\x0b\x81\x65\x6e\x87\xff\x81\xf9\x94\x45\x38\xbb\x7a\x9d\x50\x91\xc1\x89\xc4\x3e\xe1\xab\x3f\x47\x14\x44\xdc\x25\x0a\x1b\xa8\x8b\xf7\x25\x19\x0d\x60\x91\x30\x18\xce\xc0\x95\x93\xa2\x23\x8b\x1d\xf0\xe8\x04\xef\x92\xd0\x04\x23\x15\xaa\xe9\xb9\x62\x2e\x29\x75\xf2\xa5\xa5\x1f\x79\xfb\xd2\xad\x81\x1f\x00\xdb\x3e\x76\xc9\x05\x96\x28\x20\x21\x37\xd2\x28\x2f\x4b\x54\x16\x20\x65\x53\x89\xbf\x55\x21\x67\x69\x18\x50\x89\xba\x86\x16\xaf\xba\xc4\x0a\xea\x1c\xe7\xb7\x2f\x0d\x03\x02\x01\xec\x5a\xec\xb6\xad\x86\x14\x72\x2e\x06\x29\x6b\x30\x4f\xc0\x0e\x2f\xde\x3b\x4f\x8d\xc6\x41\x3f\x4b\x31\x73\x73\x7e\x62\x14\xbb\xb8\x8b\xb2\x14\x99\x77\xe4\x38\x54\x17\xd4\x7b\x22\xff\x53\x8f\x67\x55\xe4\x8f\x50\x37\x60\xbc\x4e\x3f\x1d\xa2\x9c\x94\xba\x85\xae\x59\xad\xfb\x83\x3c\x73\xca\x3a\xc7\x63\x6e\xef\xdf\xa4\x18\xcf\x32\x8e\x14\x36\xc9\xf3\xfb\xc7\x9c\x01\x60\x2c\x15\x94\xc4\x5e\xad\x6e\x6f\xfd\xb9\x59\x16\x5a\x4d\x5c\x28\x2d\xff\xf6\xf1\xfb\x63\x7f\xcc\x70\x22\x14\x3a\xf9\xd8\x95\x97\xa3\x01\xc6\x21\x15\xae\xd4\x41\xd1\xc5\x1f\x8b\x9d\xa3\xd9\xd7\x73\xa5\x29\x5e\xfb\x17\xa8\x9f\x3d\x17\x13\x98\x08\x22\x3d\xf8\xec\x3d\x55\xd5\xac\xfc\xc6\x44\x90\x26\x2e\xa2\x7a\x84\xc6\x85\x67\xce\xe7\xda\x0f\x89\x15\x89\xe5\xab\x5c\x0f\x0b\xde\x58\x9e\x08\x98\x60\x89\x48\xbc\x16\x24\xd1\xbc\xe2\xfe\x10\x67\x10\xf9\x1d\xca\xa9\x97\x2f\xa9\xbf\x00\x13\x3a\xb5\xe6\x6b\x79\xdb\x77\xd3\x99\x0c\xc1\x5a\xc2\xc2\xe9\x1a\x8f\x55\xff\xe7\xc8\xea\x26\xff\xab\xca\xcb\xc3\x33\x5c\xbc\xb0\x92\xa1\x72\xec\x61\x67\x1f\x7e\x07\x3f\xb1\x5e\x77\x7b\xc1\x85\xed\x9f\xff\x0c\xb7\xfd\x14\xd0\xfa\x2b\xd4\xaf\xd8\xb4\xbd\xb9\xc9\xa6\xd4\x55\xdd\x90\xab\x98\x7f\x1a\xa3\x6e\xd0\x74\x56\x4b\x99\x51\x49\x72\x45\xed\xde\x2f\x5f\xd6\x8f\x55\x55\x5c\x8a\x45\x00\x53\x0c\xa9\xb5\x6a\x37\xc9\x55\xa3\xf2\x59\x11\x86\x29\x19\x50\x59\x9e\x2a\x1e\x74\x21\x97\x0d\x83\xd9\x1e\xe1\x3e\xa9\xd3\x80\x2a\x1a\x5d\xae\x74\x85\xed\xfe\xfd\xd4\xdf\x51\xcd\xad\x79\xc7\x40\xc1\xa6\x07\x4a\x8b\xc6\xa9\x26\x26\xed\xf4\x2a\xb4\x33\x30\x24\x55\x90\xb6\xb5\xe6\x6a\xb6\xcf\x3a\x34\xf0\x98\xd6\x69\x14\x3b\x9e\x72\x7d\xd1\x01\x61\x1a\x03\x5a\xab\x7d\xc9\x60\xe7\x35\x5b\x5b\xd4\x04\xf5\x71\xe3\x30\x08\x9c\x0b\xe0\xbf\x50\xb5\xae\xa1\x31\x88\xbe\xcd\x6e\x21\x06\x89\x70\x89\xc5\xcd\xb9\x28\xdc\xf0\x0f\xde\x50\x0c\xe3\xc0\x9e\xfa\xd8\x65\x6a\x43\x02\xc5\x8c\x51\x54\xeb\xd6\x50\xcd\x8a\xb3\x3c\x08\x24\x09\x50\x2a\x9a\x39\xeb\x17\x38\x9e\x2e\xcb\x0b\x3c\x88\x63\xda\x45\xf2\xb2\xc1\xfa\xd2\x5f\x73\x36\x98\xa5\x54\xeb\xa0\x28\xe0\xac\x2e\x7f\x16\x0f\xb4\x02\xd9\x43\x0d\xba\x1b\x71\x97\x17\xd8\xb4\x55\xe9\x19\xc1\x93\xa7\xcd\x03\x13\x49\x18\x85\x77\x7f\xe2\xc4\x08\x15\x78\x18\x05\x91\xcd\x1d\x9e\xbf\x95\xa4\xd6\x82\x37\x55\xfd\xb3\x5f\x05\x79\xa8\x25\xa1\xdd\xa9\x09\xd2\x6d\x60\x30\xa4\xab\x3c\xd4\x8a\x26\x00\x39\x0a\x7e\xf3\xb4\xfb\xb1\x13\xbe\x43\x8b\xf1\x28\x8d\x29\x87\xb1\xf0\xdb\xdf\xc2\xb7\xce\x33\xc0\xec\x70\x8f\xa2\xd4\x42\x03\x08\x32\x4b\x0b\xca\x30\xd5\x78\x94\xf1\xc8\xc5\x4a\x6b\x6a\x43\x4e\x99\x3d\x9f\xfd\xe3\xcf\xc0\x83\x04\x7b\x02\xa0\x67\xc5\x4e\x6e\x59\x1c\x44\xb4\x6e\xed\xde\xcb\xfc\xd7\xdf\xec\x83\xf3\x38\x48\x09\xd2\x54\xe2\xdb\xba\x72\x96\x4b\xb3\x67\x1b\x73\xab\x3e\x85\xed\x8b\xa9\xea\xb6\xcc\xfb\x66\x2d\x8f\x95\x01\xe1\x68\x67\x77\xa8\x07\xe9\x5b\x77\x3c\x31\x56\xd5\xdf\xdd\x94\x9f\xbb\x5e\xe3\x0d\x78\x1a\x45\x84\xc8\x07\xad\xc7\x1d\x80\x59\x3a\xb1\x50\x7d\xe5\x69\x64\xcd\x93\xf3\x66\x70\xce\x59\x8c\x62\x79\x9a\x86\xe4\x77\x0c\xd6\x43\xf5\xd5\xbe\x91\xd3\xa9\x98\xea\x80\x6a\xe2\x5f\xb1\xc8\xcf\x47\x07\x2b\xe9\x2f\x52\xf7\x5a\xad\xdf\x61\x51\xea\x0d\x78\x96\xd8\xa0\xe0\x6b\x75\xc4\xdb\x0a\xca\xe6\xc3\x7b\x7f\xf1\x4b\x32\x16\x12\xd0\xa6\xc4\xb7\x09\x54\x95\x67\x2c\xe1\x2e\x50\xfc\x8e\x4d\x9b\x97\xcf\xbe\x92\x31\xfd\x6e\x26\x93\x50\xf4\x2f\xbb\x73\x1c\xec\x62\x33\x7f\x1c\x03\x82\xc5\x5e\x7d\xfb\xeb\xb0\xde\xee\xff\x1a\x54\x40\x80\xf3\x10\x54\x36\xe9\x23\x78\x1d\xb8\x91\xc8\xfb\xf4\x7e\x72\x94\xe4\xb0\x02\x85\xc7\xc3\x37\xfd\xd9\x8c\x50\x8c\xb0\xda\x37\x38\x8f\xb4\xb8\x08\x91\xcc\x90\x6e\xdc\x5a\x7a\x57\xbd\xe2\xf2\x03\xf7\x1f\xc8\x62\x6a\x9e\x40\xd3\x3f\x0a\x91\x59\x94\xda\xa1\x1d\x75\x78\x38\x64\x48\x4b\xd3\x1a\xea\xc1\x4a\x67\xf6\xed\xc0\x63\xf2\x02\xec\x53\xa8\xef\x23\xec\xf5\x05\xb6\xe2\xb7\x38\x25\x2e\x23\xd9\x1b\xe9\xf6\x0a\x78\xc0\x65\x1a\xbb\x9b\x63\xb1\xc9\x57\xe4\xa5\xbc\x2a\xf5\x46\x55\xcd\x7b\xd3\xe2\x44\x01\x0b\xba\xa0\x9a\x20\x28\x1a\x15\xb9\x33\x4e\x6e\x80\x0a\x0d\xbd\x97\xb9\xcd\x53\x47\x50\x67\xae\x22\x4d\x8c\xc6\x7d\x75\x6a\xfe\xf9\x77\xdf\x73\x15\x87\x24\x57\x4b\xc8\x78\x8b\x56\xee\xcf\x27\x2d\x2f\x5f\xbd\x40\x9d\xf7\xa0\x3d\x7f\x14\x13\xed\xf1\x7a\xd7\x67\x6c\xb6\xb3\xe4\x80\x63\x9a\xa5\x61\xef\xc5\xe7\x5a\xbc\xfe\x98\x49\xa4\x7b\x7b\x28\x4c\xbd\xaa\xaa\x9f\x2b\x75\xc9\xe7\xe1\x68\x38\x9d\xe4\x74\x6e\x5e\xf6\xa4\xf6\xb7\xeb\x72\x55\x0f\x2b\x5a\x7c\x0c\x22\x10\x3a\x1d\xa7\x69\x5d\x5a\x72\x5b\xa9\x91\xd0\xde\xf2\xf3\x13\x61\x10\x24\xd9\xe0\x6d\x30\xa8\x6a\x83\x08\x13\xa4\x26\x47\x3f\x55\x28\x7e\xdc\xfc\x3a\x61\xd9\x4c\x9c\x51\x27\xe4\x20\x11\xa6\x48\x4b\xef\x6b\xd5\xa2\x0f\xc5\xfa\x63\x98\xc6\xd9\xb8\x94\x78\x8d\x2d\xe4\xf3\x56\xa6\x08\x51\x91\x10\x8c\xf5\x8b\x52\x6d\x55\x37\x07\x8d\xaf\x1e\xe9\x3e\x34\x26\x45\x88\x48\xfc\x3a\x52\x67\xbd\x7a\x7f\x84\xa6\x79\xab\xbc\x6c\x12\x1f\x57\x79\x44\xe8\x5c\xbc\xa8\x89\x70\x55\x9d\x7b\x8d\x6c\x10\x51\x1c\x52\x26\x76\x84\x5f\xf9\xf1\x7c\xdc\xdf\x5f\xf5\x47\x0c\x04\x13\xd9\xba\x63\xf5\x94\xeb\x8b\xf7\x95\xbe\x87\xcd\x6e\x6d\x64\x64\x0c\xbe\x0c\xf5\xf7\x70\x5c\x22\x89\xad\xc7\x50\x79\x3e\x36\x67\xaa\xa7\xf4\x91\xbc\x48\x52\xc3\xbd\x56\xb6\xfd\x30\x7e\x88\x05\x9f\xae\x55\x22\x61\x92\xde\xfa\xd3\xb9\xbd\x23\xb3\xbe\x39\x50\x77\x7a\x15\x69\xa0\x65\xe6\x85\x8b\xda\xb1\x52\x58\x77\xcc\x04\xdd\xb3\xd9\x9f\xeb\x9f\xf8\x7e\x75\xae\x9f\x1d\xc1\x7a\xf6\x0c\xd3\x34\xa3\xb6\xf5\xc1\xca\x53\xb8\x72\xe1\xe0\x20\xe3\x86\x65\x2c\x8c\xac\xc4\x3d\x75\x3d\x3f\x45\x8c\x7c\x00\x21\x16\x99\xb6\xef\x33\x55\x4e\x46\x91\xa1\x60\xa9\x26\x94\xb3\x5f\x85\x06\x93\x60\xc7\x42\x9d\x4b\xeb\x2c\x8a\xb2\x81\xe0\x81\xa4\x4e\xc0\xb6\x7b\xf6\x93\xbb\xc1\xc3\x24\x23\x39\xe1\xed\xed\xed\xea\xcb\xe6\xd2\xa7\x05\x84\x48\x34\x35\xaf\x0e\x03\xd6\xfa\x92\x6f\x23\x44\x82\x68\xc6\x6e\x08\xa3\x00\x6c\xa8\x19\x08\x91\x46\x8a\x79\x2c\xa4\x8b\xfd\x6d\x9c\xf2\x19\x92\x46\x40\x66\xc2\x74\xf0\x20\xbe\x81\xb3\xc2\x29\x5d\x42\xc8\xd8\xb6\xf8\x4f\xe4\xf5\x68\xe3\xc4\x89\x14\xc5\x74\x74\xaa\xe8\xb1\xad\x9f\x36\xab\xfd\xc3\x93\x35\xe2\x38\x6c\xee\x7d\xb5\x57\x48\x2d\xa9\xda\x2b\xdf\xcf\xd5\x79\x82\xb5\x15\x4a\x0f\x0e\x5e\x24\x8f\x77\xbb\x32\xe6\x83\x99\xa8\xe3\x8c\xd9\x66\xb9\xca\x4f\x39\x96\xed\xbc\xc5\x39\xfd\x9d\x5a\x84\x16\xb2\x87\x4d\x7b\x20\xe2\xbe\x24\x54\x2a\xc1\x21\x7d\xf5\x7e\x25\x49\xcc\xba\xcb\x83\x08\xc7\xf8\x08\xef\xbd\xba\x04\x08\x13\x84\x5e\x8a\x7a\x87\x45\x71\x0d\x79\xf1\x6e\x69\xaf\x93\xd2\xce\x7c\x8a\x98\x4c\x7b\x6c\x89\x55\xcb\x21\x32\xe0\x90\xfa\x3c\x62\xdd\x7b\x89\xcc\x3e\x89\x46\x31\x0f\xc5\xb7\x48\xc4\xe9\x8e\x00\x61\xc6\x48\x47\x1b\xcb\xd6\x71\x8e\xb8\x3f\x02\x96\xa9\x38\x62\x25\x4d\x2f\xd3\x8f\xd3\x51\x38\x36\x12\xbc\xae\xdf\x9f\xce\x97\x2a\x77\x8b\xcf\x00\x42\xad\xd1\x6e\xbf\xd7\x79\xa3\x8a\xaa\x39\xd7\xd8\xe5\x6b\xef\xbb\xfc\xb9\x9c\x07\x18\x10\x19\x9b\xf5\x7e\xfd\xf3\xfa\xf0\x70\x2c\x73\x5d\x15\x45\x5f\xcc\x81\xd8\x28\xed\xab\xbc\xbb\x9f\xd6\x4e\xcc\xe4\xcf\x7e\x8d\x83\xa4\xdb\x21\x6c\xe6\x7f\xd3\x6d\x10\xdd\x0e\xfc\x15\xf5\x33\x4e\xfd\xba\x00\x12\x66\xad\x9d\xf3\x86\x44\x44\x9c\x51\xc5\xf7\x41\xd9\x17\x20\x91\x20\xa4\xd7\x2a\xbc\x82\x56\xbd\x4c\x66\x3c\xa4\x10\x90\x54\xe3\x11\x7e\x3d\x86\xbd\xf0\x11\x40\x2a\x63\x4a\x1a\xbb\x0d\xcc\xe5\xd8\x4e\x48\xda\x0d\xc8\x32\x41\xac\x88\xab\xf3\xfb\xa1\x0b\x55\x0f\x56\x82\x2b\x2f\x47\x7d\x14\xc8\x32\x19\x79\x68\xd9\x98\x79\xe2\x0f\x33\xae\x62\xaf\xea\xf4\x8d\xb4\xea\xc7\x4d\x2e\xc8\x54\x20\xe0\x43\x08\x44\x3c\x3b\x1b\x8b\x53\xea\x85\x5e\x79\xf5\x3b\x00\x96\x58\x73\xb1\x03\x1e\xf3\xf6\xe6\xdc\x9e\xeb\x0b\xaf\xa9\x0f\x9e\x37\x63\x8a\x30\x75\xdf\xf3\xe6\x0c\x45\x5d\xa9\x9f\xed\x68\xc9\xeb\xd2\x24\x26\x06\x62\x9e\x4f\xb9\x6d\x38\x3b\x77\xcd\x03\xe0\x3c\x20\xb4\xda\x0e\x5b\xe7\xc7\x4c\x98\x36\xeb\x24\xbe\x00\x8e\xee\xa2\x28\xe6\x74\x53\xae\xaa\x5f\x61\xff\xb5\xc8\x98\x95\xe1\xa3\x22\x90\xfb\xab\x4c\x6c\xab\xa2\x7d\xae\x6d\x14\xe2\x3c\x3a\xfb\x08\x11\x24\x57\xde\x9a\xfa\xb1\x2a\xff\x93\xff\xb1\x90\xb0\x82\x54\x48\xef\xe0\x2e\x3f\x9e\x0a\x9c\xa4\x1f\xa0\x62\x41\xa0\x91\x17\x68\x6e\xa1\x7c\x3e\x8f\x14\xe3\x96\x37\x71\x50\x2c\x05\xbf\x48\x43\x5e\x76\x77\xe9\x7a\xec\x3e\x39\x1f\x0e\x3c\xf3\x9d\x98\x5d\xdb\x0b\x3c\x01\x28\x9d\xd0\x7b\x3f\xc1\x95\x3f\x42\xdd\xe6\x70\xa9\x75\xe7\x3f\x83\x48\x2f\x58\xae\x2a\x9a\x76\x91\x3f\x99\x86\x84\x22\xc4\x3f\xf3\xb6\xc5\xb2\xb9\xae\xab\xd3\xa5\xad\xba\x1b\x8b\x31\xa7\xb1\x27\xab\x75\x70\x43\x28\x97\x9e\x28\xea\x06\x99\x04\x42\xd7\x48\xb4\x3b\xd0\xe4\xe5\x32\x99\x24\xc5\x5a\xdf\x41\x3c\x34\x83\x56\x30\xc8\x40\x05\xe8\x2d\x66\xd7\x55\xa9\xa0\xbd\xc3\x63\x55\xbf\xc7\x11\x75\x9b\xfa\x61\x46\x05\xdc\x6f\x8a\xa4\xda\xfd\xed\x69\xbb\x29\x27\x8e\x78\x20\x43\x25\x9c\xac\x08\xc5\x34\x03\xe8\xdc\x4f\x4d\xcb\x1a\xb8\x28\xd4\xc8\x28\xb1\x90\x84\x53\x55\x4f\xa0\x03\x32\x62\x31\x71\x4f\xbb\x0d\x60\xf3\xdc\xaf\x4e\x32\x8e\x02\x4a\x44\x5e\x73\x7c\x5b\x36\x22\xf6\x03\x53\xae\x6c\x6f\x9d\x30\xef\xd6\x99\x73\x36\x44\x4a\xdd\x45\xd7\x07\x59\x57\x3f\xb1\xbe\xc1\xc1\x03\xfb\x6f\x72\x44\x64\x2c\x95\x2b\xda\x75\x5b\x95\x59\x43\xad\xaf\xa1\x85\xe1\x72\x75\x42\x75\xad\x12\xdf\x36\x65\x5b\xcf\x10\x2f\x32\x09\x5c\xce\x5b\x14\x44\x89\xe8\x82\xbd\xc6\xbe\x45\xfd\x29\xd2\x24\xa6\x35\x74\xbf\x59\xdd\x1d\x1e\x1f\x1e\x6e\x0f\x23\x42\xb5\x4c\x93\xd4\x89\x58\x3a\x55\x8c\x70\xac\x8f\x0f\x32\x55\x8a\xe4\x48\x08\xf8\xde\x8e\xd7\x37\x99\x39\x6f\x08\x27\x17\x38\xf6\xae\xe9\x5b\x44\x92\x25\x96\x75\xd8\x56\x3f\xfb\x3f\xa5\x36\x89\x3f\x76\xb9\xdb\xe4\x45\x95\x8c\x73\xeb\xf1\x5b\xa3\xac\x73\xdd\xbf\x47\x92\x09\x4e\x95\x05\xdb\x29\x9b\xed\x24\x92\x29\x2b\x61\x61\x7d\xa2\xb0\xfe\x0a\xc5\x6b\x5e\x3e\x77\x99\xd0\x13\xb4\x23\x87\x3a\x37\x9e\x8b\x84\x02\x60\x5b\x66\x70\xaa\x9d\xd3\x21\x82\x89\x48\x8f\x30\xa1\x63\x36\xa4\x1b\x02\xa9\x89\x7d\x9b\x00\x4a\x9d\x77\xe1\x56\x43\x68\x45\x3f\x80\x65\x64\x67\xbc\xd9\x15\x55\xdb\x4c\xa6\x27\x30\x23\x32\x1f\x04\xfe\xfa\x82\xe5\x67\x7a\xac\x20\x41\x27\x01\x9b\x68\x14\xd0\x25\x4f\x27\x83\x4c\xa3\xd4\x96\x10\xab\x72\x5b\xaa\x59\x21\x55\x4a\xa1\x49\x21\x4a\xe3\xa9\x40\x8a\xaa\xfc\x11\xc5\x33\xc2\x13\x74\x73\xa0\x6f\x8f\x4e\xa7\x81\xe6\x82\x52\xdf\xbb\x6b\x6b\x6d\xfa\x8c\xd1\xef\x42\x8f\x0f\x66\xbc\xe6\x18\xd8\xdc\xb8\xdd\xb5\x8a\xb8\x6a\xad\xba\x78\x5b\x7e\x67\x8f\x36\x1f\x37\x1e\xcf\xfb\x6f\x32\xd9\xd0\x49\x9f\x08\xba\x81\xd4\x26\x42\x17\x23\xfa\x3c\x78\x12\x22\xba\x61\x18\x42\xe6\x9a\x27\x6d\x81\x04\xd6\x74\xbe\xe0\xee\x57\x2f\x89\x04\x5c\xb2\x78\x25\xc6\x09\x99\x30\xed\x51\x7d\xac\x66\x32\xfb\x6a\x03\x3e\xd1\xde\x1c\x4f\x45\xf5\x8e\xc3\xaa\x6a\x40\x99\x41\x65\x61\x8f\x30\xef\x51\x9d\x27\x5e\xe3\xd3\x13\x1b\x29\x31\x1e\x21\xe6\x7b\x69\xeb\x89\x68\x82\x0a\x74\x46\xf0\xb7\x12\xdf\xbe\xd4\x88\xc4\x2a\x1f\x2f\xda\x2a\x84\xbe\x94\xf2\x03\xf1\xa7\x9e\x19\xad\x82\x0a\xa5\xf5\xd6\xf8\x52\x15\xfa\x98\x97\xed\xb7\xb2\x19\xcb\xc2\x4e\xa6\xb8\x8a\xd2\x28\xb2\x21\x6a\xb7\x1c\x97\x48\x0b\xda\x1f\xfe\xa0\x0e\x83\x41\x4a\xd7\x41\xc9\xdc\xb1\x38\x8b\x68\x42\xfd\x05\xea\xa5\x55\xd5\xf0\xe7\x94\x3c\x29\x3c\x53\x77\x24\x5a\x73\xfe\x00\xc1\xb7\x38\x61\x55\xcc\xad\x06\xf1\x55\x71\x3e\x41\x33\x79\x8d\x55\x2c\x0c\x2d\x81\xe7\xb2\x01\x83\xdb\x66\x14\x4e\x87\xfe\xf3\x49\x24\x8c\xf5\x65\x2c\x9b\x16\xca\x36\x2f\xab\x53\x81\xe4\x03\x72\xe3\x94\xb2\xfd\xe9\xd2\xc4\xaa\x14\x1d\xcc\xb9\x30\x79\x31\x95\x17\x05\x95\x02\x78\x81\xec\xbd\xad\x80\x0c\x24\x4f\x95\x6a\xf4\xec\x48\x2a\xd7\x13\x8c\x19\xeb\xe5\xf0\x40\x65\x32\x92\x5e\xea\x95\x8a\xd9\x24\xc1\x41\xa9\x7d\x55\x8f\xd4\xf2\x41\x65\xda\x32\xcb\x4c\x5d\x35\xed\xa4\xe2\xa7\x98\x60\x94\x6f\x7a\x0e\xdc\x73\xae\xa6\x4b\xa4\x62\x12\x49\xe9\xc9\x06\x65\xdd\xdd\xf1\x9f\xe5\x49\x44\xf8\xd9\x27\xfc\xf7\x39\xaf\x51\xdf\x20\xde\x57\xed\x1d\x7e\x50\xcf\xe8\xc6\x93\xf4\xdf\xfa\xc7\xfe\x33\x1c\xab\xe2\x0c\x8c\x0d\xb8\xaa\xff\x60\xb9\x54\x4e\xec\x07\x5a\x0f\x94\xab\xbc\x6d\xdf\xa0\x9d\xbd\xf8\x8a\x3b\x3f\x2c\xfb\x86\x39\x77\xbf\xd9\x18\xe1\xfc\x24\x24\xbe\x40\x31\x6c\x47\x4a\x18\x4e\x6d\x82\x76\x42\xa4\xf1\x0b\x46\x3c\xac\x0e\xf1\xff\xfe\x9d\xe2\x88\x12\x46\xd9\x59\x46\x0b\xd9\xba\x2a\x5f\xb1\xb6\xe2\x57\x17\x97\x24\x43\xa6\xdc\x3b\xf9\x88\xcf\xcf\xae\x4a\xf2\xc1\xe6\x32\xbb\xc5\x32\x8a\x49\xe6\xc5\xa9\x10\xff\xc0\xfc\x6e\xed\x7f\x92\x8c\x2d\x83\xe1\x1f\xeb\x87\x4f\x5d\x85\x96\x8b\x17\x4a\xa5\x01\xe1\xf9\xb6\xe5\x6b\xf5\x73\xa9\x77\x7a\x91\x43\x28\x85\x48\x28\x0d\xbb\xe3\x3f\x76\x01\x81\xce\xfb\x80\x40\xe9\x20\x25\x1f\x51\xb0\xfd\xbb\x85\xfc\x4c\xe9\x24\xa1\x8a\x99\x87\x86\x7a\x5d\xe1\xfe\xb0\xa6\x0e\x6d\xb7\x32\xdd\x56\xea\xe7\x1a\x9a\x97\xea\xfc\x01\xfa\x41\x69\x15\xa6\x6e\xbf\x38\x9f\x96\x15\xc4\x41\x69\x1d\xd9\x8c\x8f\x70\x6d\x8f\x0b\x02\x59\x33\x1d\xe5\xee\x23\x06\x82\x51\xe7\x70\x5e\x96\x5c\x9c\xeb\x93\x9a\x65\xe4\x04\x01\x14\x0a\x65\xc9\x90\xd0\xe2\x63\x01\x65\xf3\x60\xac\xe0\xc6\xe7\xed\x50\x85\x10\x91\x3a\x71\x4e\x56\x19\x36\x7a\xb4\x7b\xa1\x1f\x60\xac\x6f\x02\xb6\x2f\x50\xb7\xab\xba\x5d\x75\xeb\x6f\xbf\x97\x2a\x13\xb0\xd0\xc1\xfb\x76\x2d\x9e\xf6\x6f\xd5\x52\x17\xc2\x0f\x4e\x2c\xc2\xc8\xd7\x3b\xec\x62\x19\xf1\xc5\xd5\xd8\x3b\xe3\x81\x32\x9c\x93\xf0\xcf\x63\x5e\x14\x50\x2f\xce\x41\x3b\x52\x07\x4c\x52\x3b\xad\xaa\x41\x15\xf8\x70\x6e\x55\x75\xc4\x66\x19\xf2\xa0\x03\xff\x9a\xdb\x22\x41\x9f\x66\xd8\x84\xdd\xfd\x40\x1d\x2a\x49\xe5\xae\x5e\x27\x7c\xb0\xff\x58\x9c\x2d\x3a\x4a\xad\x7b\x50\x17\x90\x5a\xf1\xee\xfb\xf3\x8c\x03\xa6\x23\xe6\xfa\x14\x05\xe4\xc7\x5e\x46\x75\xf9\x37\xc5\xcc\x6a\xda\x68\x6c\xda\xba\x7a\x5f\x8f\xcc\xfd\xfe\x6b\xbc\xd9\xe8\x98\x59\xa5\xa3\xeb\xff\x7e\x1c\x6f\x54\x3a\x89\x52\x8a\x78\x73\x55\x45\x59\xff\xc7\x84\x51\xd7\xfa\xf1\xdc\xe6\x63\x79\x14\x9d\x18\xa0\xb2\xca\xe6\x69\x1d\xf5\xda\x35\x3a\x15\x8a\xe6\x49\x97\x0e\x9d\xe0\x7d\xd6\x9c\xd4\x29\x64\x5c\xf5\x94\x89\xad\x26\x2b\xa6\x09\xde\xbb\xdb\x49\x08\xeb\x42\xf5\x7b\xaf\xb8\xdd\x8c\xba\xa8\x3a\xc3\x2c\xb1\x28\x85\xe7\x17\x57\x6c\xe8\x0f\x19\x61\xe2\x5e\xc4\xe9\xd7\x24\x16\xd1\x8c\x09\x02\x11\xb9\xee\x62\x8f\x31\x5a\x7e\x3c\x3c\x65\xe0\x26\x34\xd6\xbb\x8b\x36\xa4\xe6\x3c\xce\x7a\xbb\xc2\x03\x0c\x7a\x35\xb3\x9f\xcc\x15\xcf\xac\x18\xee\xba\x3a\x1e\xa9\xc8\x34\x8a\x4c\x34\x57\xc2\xca\x4e\xd1\x1e\xb2\xcb\xbb\xeb\xf5\x78\x83\xbf\x15\x2c\x6b\xa1\x99\xc7\x21\x74\x41\x94\xc5\xcb\x8e\x1a\x83\xd3\xcb\x81\x28\xe4\xae\x44\x68\x41\xea\xe3\x88\x57\x43\x2c\x89\x72\x02\xb6\xab\xaa\x97\x48\xee\x7e\x28\x6a\x57\xc9\x2e\xf5\xc1\xb9\xe6\xf5\xa7\x31\xa9\x19\x5c\x5e\xba\xb4\x78\xa1\xc9\xae\xc1\x30\x7a\x8e\x48\x11\xe6\x63\xf5\xd6\xaf\xbb\x5a\x62\x4a\xcd\xb1\x9e\x30\x67\xcd\x3c\xdc\x51\x15\x48\x67\xd4\xd9\x5a\xe9\xfe\xe6\x25\x3f\xcd\xf5\x3e\x87\x1b\xa4\xa4\xa6\x86\x71\xde\xec\x5f\xf2\xe6\x2b\xd4\xda\x10\xac\xc2\x99\xd5\xfb\xb3\x9a\x2c\xf5\x78\x52\xeb\xd8\xdb\x2d\x50\x4d\x0b\xc7\x99\x6c\x22\x06\x41\x60\x8d\xd6\x60\xa4\x1f\x30\xf1\x8c\xf5\x03\x41\x65\x56\x80\x41\x36\xa3\x57\x07\x03\x93\x26\x54\x90\x20\x20\xe8\x6a\xde\xed\xc2\x30\x42\x9a\xa8\x37\x5f\x6f\xc6\x2f\x28\x86\xdc\x26\x08\x6e\xae\xb4\x40\x58\xd0\x49\xe4\xf0\x61\x12\x34\x7e\x13\x30\x92\xdc\xda\xce\x7f\x5d\xed\x36\x33\xfb\x6d\xc0\x48\xc5\x74\xf3\x9d\x3d\x81\xdf\xc7\xf6\xf9\x88\x12\xf0\xbb\x94\x66\xf4\xff\x75\x73\xa6\xff\xc7\x7d\x45\x1c\x5a\x74\xbe\x6d\x1a\x7d\xf9\x70\x91\xc4\x38\x01\x31\xcc\xa4\xe2\x14\x66\xd3\x49\x84\x71\x22\x69\xdf\xd9\x18\x24\x70\xf3\xe4\x86\xc5\x59\x42\x50\x79\xf2\x63\x3c\x24\x56\x4e\xf8\x70\x1a\x91\xb8\x30\xd1\xb6\x77\xf4\x27\xbe\x3b\x6d\x8a\xb1\x62\xd7\xe2\x4a\x8b\x09\x0a\x0a\x3b\x8e\x07\x35\xc2\x66\x8d\xd7\x28\x4c\x43\x10\x30\xae\xc4\xe3\xeb\x12\x33\x19\xd3\x54\x5b\xeb\xb7\x23\x96\x1a\x35\xa1\x5b\x3d\x09\x87\xe4\x57\xfa\x7c\x0e\x53\x9d\x30\x57\x25\xbb\xaf\x34\x36\xdf\x61\x0e\xf1\xc5\x14\x51\xc9\x81\x7f\xf9\x18\x5f\x5f\xe7\xaf\x1b\xa8\xbb\x84\x68\x3e\x36\x03\x49\xd0\x46\xdb\xaf\x7a\xcd\xbb\x57\x61\x98\xf1\x2e\x6a\x98\x3d\x0d\x9e\x66\x16\xf9\x5b\xe7\xa5\xfe\x56\xe6\xaa\xaa\x67\x82\xcb\x80\x3c\x0b\x68\x41\xa3\xae\x3b\x85\x5c\x43\x24\xe4\x87\xa8\x34\x75\x58\xb5\x1f\x6f\x93\x52\x10\x72\x34\x81\xab\x79\xdc\x42\xd3\x76\x73\x6e\x92\x29\x21\x37\xce\x36\x79\xb7\xf6\x28\x4d\x14\x01\x24\xb6\x49\x70\x5f\xb5\x50\xbf\xaf\xb4\xa5\xb9\x90\x9a\xca\x6f\x4b\x10\xe3\x38\xc9\x9f\x30\x0e\xbd\xfa\xed\xa3\xe5\x6b\x7c\x3b\xed\xab\x4b\xc8\x31\x8a\x0c\x19\x1b\x93\x16\xaa\xfa\xe8\xc2\x82\xd9\x40\x30\x59\xe8\xdb\x04\xc4\x69\xf8\xa0\x4c\x8c\x10\x00\x81\x26\x0b\x2c\xf5\x80\x6a\x41\x48\x2d\xbe\x6f\x55\x93\x9a\xd1\xe7\xed\x7e\x04\x06\x94\xe8\xed\xb0\xdd\x5e\x5b\x11\xad\xe5\xa9\x2c\x03\x1b\x34\xdc\xe6\x0d\x4c\x5e\x1d\x09\x21\x0c\x79\x9b\xb5\xd7\xef\xf6\x41\x02\x01\xcf\xa6\x92\x4a\x32\xc6\x06\x94\xec\x6d\xd5\xe4\x8e\x01\xde\x4f\x5e\x95\x25\xe4\xde\x68\x4f\xd7\x13\x3c\x4a\xbd\x86\xa2\xf8\xe1\x57\xf9\xf9\x79\x8d\xa0\xaa\x3f\xf5\x36\x7c\xa9\xea\x89\xce\xf0\x41\x85\x00\x35\x07\x96\x8d\x4b\x95\x93\x12\x15\x6a\xb0\x5e\xf2\x76\x39\x71\xfb\xec\xb2\xcc\x0c\x6a\x0d\xda\x9a\x89\x50\x2e\x75\xf5\x73\xbe\x0f\x98\x20\x05\xc7\x74\xd9\x55\xe5\xf3\x8f\x3a\x6f\xfb\xf2\xf8\x32\xe3\x0f\x0d\xb7\x72\x3f\x87\xbc\x79\xd0\xfa\xa6\x80\xe7\xf9\x39\x55\xac\x1c\x3b\xb8\x87\xa6\x93\x3b\xc1\x12\xe7\xd3\xc5\xbd\x26\x4c\xad\xb7\xea\xe1\xe8\x30\x72\x93\x73\x9a\x30\x4b\x69\x55\xd8\x3c\x12\x0f\x7c\x9a\x3c\xf8\x31\x92\x53\x2f\xe3\x74\x2e\x8a\x11\x09\xce\x84\x46\x64\xe0\x79\x1f\xdd\xfa\xda\xe5\xaa\xe4\xec\x3d\x49\x3f\x4d\xc4\x24\xa1\x41\x0e\x35\x6a\xc4\x4b\x4d\xb8\x49\x2d\x6e\xfc\xae\x99\xd8\xa5\x7d\x7e\xa5\x5c\x8e\x99\xa7\xf7\x91\x7a\x12\xcc\x33\x6b\x27\x8f\xd8\x24\x2a\xa4\x6d\x7c\xbf\xdd\x3c\x25\x87\xa7\xd5\xde\x77\xe8\xbb\x4d\xd7\xd9\xd1\xd7\xe5\xae\x3a\xe2\x82\x5e\x3c\x98\x34\x53\x32\xe8\x97\xd0\xa9\xfd\x18\x98\x4c\x84\x84\x77\x6a\xac\xcf\x20\x6a\xe7\x94\x35\x7e\x75\x4c\x66\x0c\x55\x95\x80\x34\xe5\x67\xe7\x67\x88\x44\xb4\xf8\xbe\xbd\xfe\x3d\x84\xc9\xf0\xc0\x04\xe8\x15\x78\xbb\x69\xd8\xad\xd2\x1f\xbc\x2e\x46\x70\xeb\xbc\xd6\x60\x4b\x6d\x06\x0b\xe3\x9e\x7e\xbd\x0c\x98\x4a\x7a\x1e\x0f\x79\x64\x74\x8f\x35\x6f\x67\x5a\xce\x46\x06\xd6\xae\xb5\xfb\x9e\xeb\xfd\x57\xff\xdb\x24\x28\x31\x95\x8c\xa0\x9f\xfe\x31\xff\xde\x48\xc9\xb4\x4b\x73\x1c\x7e\x0e\xea\xf7\x83\x99\x56\xb5\x8c\x0a\x12\x7a\x6f\x9f\x50\x3f\x52\xbb\x38\xff\xff\x58\x7b\xb7\xe6\x56\x71\x35\x6f\xfc\xbb\xbc\x57\x7d\x31\x17\x20\x09\x10\xff\x3b\xdb\x71\xb2\x3c\x9d\x83\x27\xf6\x5a\x6b\x76\xef\x9a\x72\xe9\xf0\xc8\x61\x2f\x0c\xde\x80\x93\xb8\x3f\xfd\xbf\x78\x24\x71\x0a\x49\xf7\xd4\xfb\x5e\xa5\x2a\xc8\x18\xb0\x90\x9e\xc3\xef\xd0\x1f\x4a\x12\xd4\xc9\x3c\x64\x75\xf7\x2f\xb0\x72\x20\xd8\xff\xaf\x6c\x75\xa8\x3e\x68\x38\xbb\xbe\xb8\xdf\x2d\x8c\x4e\x98\x77\xd0\xb0\x15\xfc\x69\x3c\x6c\x34\x17\xa1\x2b\x89\xdd\x5b\x6e\xcd\x88\xd4\x33\xbe\x17\xcd\x85\x35\xba\x87\xba\x59\x37\x2f\x3e\x3b\xf1\x97\xd5\x46\x9a\xe0\x5d\xf4\x2d\x2c\xbd\x4b\x4d\x0c\x10\xc3\x5d\x71\xa0\xab\xc9\xf8\x17\x18\x62\x82\x44\xdf\x73\x2e\x14\x2c\x3f\xab\x6f\x19\x23\x39\xa6\x1c\x59\xbd\x15\x55\x53\x7c\x22\x3e\x22\x83\x00\x24\xee\x91\x58\xb5\x5b\xbf\x83\xba\x0c\xe0\x8d\x6e\x4c\x48\x0d\x4a\x10\x1f\x84\xd6\x3f\x2c\x5e\xe1\xaf\x42\xc8\x2e\xf8\x97\x01\xa1\xca\xf0\x6e\xaa\x4d\xb2\x04\x3f\x06\x28\x76\xc6\x37\x85\x2a\xab\x0a\x54\x33\xc3\x9f\x71\x43\x69\xc0\x30\x85\xf1\x02\xd8\xce\xae\xf2\x6b\x26\xa4\x0c\x68\x68\xc5\x68\x7e\x65\xed\xa2\x75\xca\x8a\xa7\xc2\xb3\x1d\xda\x83\xd6\xc4\xb4\x7e\x29\x2b\x84\x78\x38\xa5\xd2\x3e\x50\xe7\x9f\x9d\x56\x84\xc8\x2b\x3c\x58\x4d\xeb\x36\xd4\x76\xa2\x39\x93\x3b\x64\x44\x59\xcd\x4e\x2b\x1d\x5d\x0f\xfd\x1f\xdd\x90\x48\x43\x62\x45\xcd\x5e\xa1\x68\x5e\xf6\x20\x4e\x1d\xa4\x2e\xf7\x97\x1a\xa7\x09\x0c\xcc\xb0\x26\xdf\x12\x43\x88\x4d\x46\x67\x6f\xfc\x33\x2b\x9c\x57\xdc\xf1\xa5\xf9\x38\xd8\x58\x38\x02\x88\xc6\xc7\x67\x8b\xbc\xe3\xfc\xc9\x20\x21\x01\xae\xf3\x0a\x37\xf4\x3b\x51\x0f\x14\x0d\x64\x90\xa4\x06\xf1\xa6\x48\xdd\x29\x8d\xff\x37\x67\x9a\xa5\x3e\xab\xee\x20\xde\x32\xe0\xa9\x35\xda\xf4\x25\x0f\x77\xfd\x83\x92\xb3\x0c\x52\x99\x10\xe1\xd2\xe4\xea\x75\x84\x21\x94\x41\x0a\xd2\x8a\x1d\x1f\xe0\xfd\x3c\x79\x72\x22\xd0\x96\x96\x63\x4b\xcf\xd8\xf3\xed\xdc\x22\xdd\xaf\xf8\xa1\xbf\x32\xd8\x59\x64\x20\x34\x37\x5e\xfc\xbe\x11\xbf\x40\xef\x5e\x26\x82\xa6\xed\x18\xeb\x37\xed\x24\x71\x91\x71\x3a\xdd\x6a\x07\xf3\x5e\x0a\xa9\xad\xb9\x22\xd6\x0e\x66\x76\x10\x19\x48\x69\x2c\x8e\x57\xeb\x75\xd1\x54\xe5\xb9\x9b\x92\xd2\x51\xed\x11\xd9\x77\x1a\xc4\x64\x83\x6f\x50\x49\x8a\x44\xa6\xe6\x52\x15\x4f\xc5\x53\x25\x54\xde\xee\xb6\xee\xa8\x8e\x58\xe8\x4c\xb9\x11\xf2\x04\x79\x3e\x58\x81\x64\xa0\x85\xd0\xb2\xbb\xe5\x26\x53\x8b\xaa\x12\xdd\xf7\x6b\xc3\xb0\x59\x2f\xea\x1a\xaa\x66\xfd\x6f\x42\x5d\x9c\x4f\x5d\x95\x90\xba\x81\x40\x14\x8a\x73\x59\x45\x0f\x5f\x77\xba\xef\xe8\xcc\x32\x80\x28\x40\x17\xb3\x6f\x65\xae\x47\x85\x36\x7f\x3c\x21\xa1\x8b\xe3\x97\x97\x6a\x5a\x5c\xf6\x83\x20\x20\xa2\x83\x6a\x7a\xed\xda\xc9\x20\xc3\xa8\x6d\x63\x89\xc2\x2e\x65\x9f\x2c\x22\x61\x10\xf3\xd4\x2a\x0f\x08\x8c\x54\x0e\x5d\xf5\x70\x74\xc2\x30\x24\x3c\x84\xae\x06\xe5\xda\x19\x13\xa9\x9a\x71\xa9\xfd\x9f\xe4\x7f\xfc\x67\x59\x44\x7a\x05\x8c\x9e\xf1\x33\x7b\x7f\x61\xc8\x2c\x43\xf5\xdc\xbb\xc3\x7e\x18\xa0\x50\xa0\x05\x61\x75\xbb\xef\xdb\xed\xfd\x3f\x0e\xcb\xa7\xef\x8f\xfb\x7f\x1c\xee\x37\x0f\x1b\x87\xf2\x91\x61\x98\x72\xd2\xc5\x01\x65\xae\xcb\xb7\xc2\xd1\x29\xfc\x00\x48\x84\x0b\x5b\x7e\x94\x56\xc6\x51\x54\xfe\x3d\x0b\x09\x0b\x63\x97\xcf\x7c\x83\xaa\xec\x05\x8c\xa6\x51\xaf\x0c\x89\xb6\x1d\xe0\xe5\x7e\xd7\x6f\xc2\x32\xa4\x24\x02\xd1\x71\x31\x2c\x98\x7a\x65\xcd\x0d\x1c\x02\x7f\xfc\x16\x84\x8c\x4a\xdc\xd2\x5e\x44\x25\xce\xa2\x3b\x0f\x83\x00\x9b\x74\x9d\xf7\x52\x3e\x5f\xce\x94\x61\x4c\xad\x60\xba\x6f\xae\xcf\x5a\x1e\xb8\xb1\x49\x10\x60\x50\xd5\xc5\x22\xd6\x9c\xa1\xaf\xe4\xcb\x30\x61\x01\x96\x67\x9b\x0c\x2a\xda\xfd\x53\x6a\xcd\x3f\xc4\x9e\x7f\x47\xd4\xd8\x9d\x80\x4b\xeb\x26\x81\xbd\x2d\x30\xcd\x53\x9b\x29\x38\x43\x3e\x51\x35\x59\xdd\x60\x39\xc1\x8d\x4e\xc1\xd6\xad\xb2\x1a\x43\xfa\xa1\x2e\xa5\x0c\x45\x64\x81\x4f\xae\xb8\xf3\x26\xce\x2e\x91\xf4\xa9\xf8\x67\x21\xf5\xf8\xb1\x49\x60\x84\x75\x13\x01\xea\x25\x34\x6f\x60\x3d\x08\x3e\xdb\xd7\xc7\x27\x50\x51\x94\xba\x25\x06\xf1\x93\xbd\x47\xa1\x0c\x15\xb7\x4a\x3f\xd2\xca\x8d\x61\xd4\x37\x7e\x20\x4a\x48\x36\xa2\x6e\xaf\x9b\x97\x7d\x39\x6b\xee\xea\x3f\xa1\x15\x82\x28\xf0\xb1\xc5\x37\xd9\x6b\xfd\xf4\x36\x90\xbd\xf5\xa3\x8c\xc1\xad\xf6\x5c\x36\x07\x7f\x35\x3a\xb0\xe8\x22\xb7\x18\xeb\x01\xfa\x54\x86\x9a\x58\x57\xc2\x93\x78\x47\x83\xbe\x41\x8e\x20\x43\xad\x08\xd2\x50\x9d\x72\xfa\x10\xe4\x8e\x6a\xb2\xdd\x04\xd1\x9a\x78\x85\x96\x2e\xea\xb6\x6d\x8f\xf1\xe5\x69\x6d\x6b\x87\xd6\x36\xc1\x41\xf8\x3a\xac\xa1\x0c\x41\x2a\x84\x5d\x9c\xa1\x3a\x43\x73\xf1\x2e\x06\x32\x04\x45\x82\xae\xd2\x50\x9e\xa1\x6a\xae\x0e\x5f\x81\x7a\x41\x36\x98\x1d\xec\x0f\x21\x98\xd8\x3b\x0a\x3e\x5c\x6d\x47\xf6\x93\xf5\xd0\x84\x11\x1a\xd6\xd9\x8e\xe0\x4d\x25\x8e\x65\xf1\x51\x95\x5c\x86\x46\xc6\x9a\x75\x21\xfd\xa3\x50\xed\xfc\x7f\x84\xc6\x4c\xc7\x41\x88\x80\xbd\xf5\xe3\xee\x19\x70\x6a\x4c\x82\x0f\x12\x04\xc6\x12\x53\x72\x10\xd5\x60\xf5\x20\x81\x00\x9a\xfe\xef\x18\x67\x9f\xd5\xbb\x25\x09\x19\x45\xbc\x7d\xbb\x10\x6e\x7c\xab\xd1\x1f\x13\x91\x23\x8a\xe7\x39\x54\xc6\x67\x41\xfd\x61\xe1\xcd\x4b\x97\x65\xa1\x67\x9e\x06\x21\xce\xeb\xd2\x9b\x77\xec\x2e\x72\x96\x06\x2f\x09\x49\x42\x4c\x59\xce\x9b\x1b\x3f\x25\x09\x8d\x59\xd0\xf5\x6b\xb6\x79\x39\x1f\xc9\x4b\xc2\x08\x41\x34\x0d\x22\x4a\x97\xd7\x8f\xc0\x7a\x49\x18\x08\xec\x3d\xab\x5e\x5c\xd5\xad\x80\x7e\x80\xe9\x5c\x54\x5c\x16\x3a\x15\xe9\x68\xc7\x24\x18\x4d\xac\x76\x67\xa1\xa0\x1e\x3d\x2b\x66\x74\xe0\x6a\xb0\xbf\xc3\x15\xc9\xa7\xe3\x1b\x8c\xe2\x10\x5b\xca\x79\xa9\x7e\xa1\x2f\xe0\x10\x2b\x24\x49\x94\xca\xa8\xa3\xa8\x9e\xd0\xdf\xeb\x15\xd0\x64\xa0\xd7\x72\x90\x24\x92\x06\x6d\x6b\xba\x4a\xfe\x27\x4f\x33\x4e\x05\x36\x9f\xba\x4d\x7b\x04\x8e\x91\x24\x09\x08\x42\xa0\xed\x8f\xf2\x96\x35\xea\x65\xb6\x43\xec\x87\x13\x85\x38\xed\xbb\x0a\xa0\x90\x59\x77\xd1\x09\x63\x91\xeb\x7d\x7f\x2f\x54\xc7\x69\x19\x3f\xb5\x44\x10\xdc\x96\x0d\xa8\x97\x76\x11\x7d\x10\xd6\xfc\xe6\xb6\x44\x5d\x84\x6a\x79\xdd\x15\xe2\x5c\xbf\x94\x4e\x4d\x72\xf6\xfd\x23\x5c\xc4\x98\xb7\x96\xd5\x51\x14\xd9\x9f\x50\x11\x7f\x11\x5c\x6a\x5b\x20\xc8\xf3\x67\x78\x05\xd1\x35\x60\x24\x49\x69\x80\x45\xa7\x4d\xbd\x59\x3d\x55\x97\xa2\x77\x16\x92\x24\x55\x8c\xb9\xa4\xeb\xae\x9c\xf0\x0e\x25\x11\x0c\x10\x2c\x81\xf8\xbe\x6a\x64\x03\x21\x89\x88\x19\xa6\xed\xeb\x95\x93\xe7\xfd\x59\x89\xf3\x79\x5c\xad\x9a\x47\x16\x48\x22\x94\x10\x81\x33\x3d\xba\x13\x0d\xbc\x75\x01\x25\x91\x22\xc0\x70\xb8\xac\xb2\x63\x56\x78\xcd\xae\xee\x28\x04\xc8\x88\x58\x66\x85\x78\x1f\x4d\x3d\x15\x24\x41\xec\x11\x08\xb8\x30\x8f\xef\x45\x91\x08\xab\xfe\x0f\x50\xb5\x91\x56\x83\x3a\x88\xdf\xb2\x1a\x8d\x5c\x86\x69\x2c\x51\x3c\xd5\xb6\x4c\xa9\x01\x4e\x63\x82\x9e\x24\x4a\x2a\xb4\xdb\xc2\x1e\xde\x04\x32\x2c\x89\x8e\xc2\x78\xe8\x50\x78\x70\x86\x1b\xe8\xa9\x7f\xd8\xac\x9e\x3e\xe2\xb7\xdc\x27\x0d\xb1\x76\xba\x59\xbd\xcf\x72\xb8\xcf\x5e\x67\x94\x8d\x24\x31\x29\xc8\x41\xe2\xf6\x08\x6f\x4e\x18\x7b\x34\xf3\x69\x48\x03\xdb\x0d\x42\x83\xe1\x07\xf1\x7e\x2f\x3a\x95\x23\x49\x43\x26\x11\x40\x78\x5f\x1e\xb7\xbd\x8c\xa3\xa4\x61\x9a\x20\xe2\x08\x63\x67\xbf\x81\xf9\x07\x4c\x49\x18\x05\x4e\xeb\xe3\x5b\x79\xa9\xe6\x6b\xcd\x92\xd2\x50\xf9\xa8\x71\x95\x35\xe2\x83\x0e\x86\xa4\x14\x84\xea\xdd\x34\x1d\x4f\xad\xa9\x2e\x0a\xb3\xb0\xcb\x18\x61\xf7\xbf\x68\x0a\x5d\xc6\xaf\x37\x65\xa1\x00\xdd\x49\xbf\x61\xb6\x36\xb5\x4d\x92\x34\x62\x0c\x7f\xec\xff\x14\xbf\xca\x57\x7f\xab\x91\x00\xea\x78\xc6\xfb\xec\x64\xad\xcb\x26\x6c\x05\x49\xe3\x94\x13\x57\x7c\xb1\x10\xd9\xe1\x24\xa2\xb1\x54\x58\x3f\xfd\xd9\x06\x8c\x03\x05\x45\x49\x13\x62\xad\x58\x76\xf5\xcb\xef\x5e\x77\x56\xd2\x84\x19\x04\x46\x2d\xf7\xeb\xc7\xee\x7f\x71\x84\xbf\x47\x2e\x6a\xbb\x2a\x1c\x5e\x43\xfa\x4d\xd4\x2f\x07\x77\x25\xfd\x40\x40\xfc\xd6\xb2\x2c\x75\x39\xac\x1f\x49\x9a\xa8\x64\xa0\xec\xe4\x60\xf4\x93\x67\x90\x28\x83\xdb\x42\x9e\x35\xcd\xa6\x5e\x89\x73\x7d\xc9\xc7\xc5\x58\x49\x39\x0f\x9d\xc8\x87\xf8\x05\x37\x16\x0e\xf0\x11\x04\x3e\x2b\x4a\x20\x69\x1a\xd9\xaa\x76\x1b\x28\x07\xf7\x4f\x3e\x05\xa1\x69\x2c\xb0\xb8\x65\xe7\x00\x76\x77\xf6\x20\xaa\x31\xa6\x70\xe6\x97\x4d\x79\x64\xad\x85\x5f\x44\x35\xd0\xf4\x6d\x0f\x08\x8b\xad\x11\x59\x51\x58\x3b\x90\xee\xdd\xa4\x22\xb2\x95\x88\xda\xcb\xcd\x23\x38\xfd\x46\x5c\xfb\xf2\x03\x15\x32\xb2\x26\xc3\xe2\xba\xbb\xc8\x8e\xc6\xdb\x35\x4d\xda\x11\xa9\x72\x60\x38\xac\xfe\x4c\x9e\xa5\x30\x5d\x3e\x8e\xa8\xcd\x42\x5c\x9a\x7a\xa2\x67\x38\xf9\x88\x0c\xad\xb7\x57\x51\x36\x7f\x40\x35\xa9\xf6\x50\x19\x59\x53\x8e\x73\x05\x0f\x59\xd1\x5d\x86\x8c\x43\xe4\xc9\xef\x30\x79\x5a\x66\xc7\x4f\x4e\xae\x58\xe4\xb3\xf7\x76\xc5\xbb\x11\x8d\x58\x3a\x0d\xea\xc9\x17\x29\x08\x99\x43\x1e\x1f\x4e\x59\xf1\x7d\xbd\xaf\xb7\x50\x59\x7b\xd6\x87\xb2\x82\xfd\x8b\x98\xbe\xc9\x9a\x87\x32\xee\xdd\x7b\x70\x8e\xf6\xfd\x3e\x37\x08\x54\x80\xb1\x15\xe2\xc0\x17\xab\x55\x9b\x8a\xfa\x63\x86\xa6\x18\x5b\x1d\xec\x5a\x70\x3f\xd4\x51\x1e\xdd\x07\x0b\x53\x19\xb9\xd4\x4d\x89\x6a\x1c\x66\x8d\x57\x20\x16\x2a\xab\xd5\x8b\xb3\xca\x27\x6b\x2c\x54\x32\x1e\x06\x03\xdb\x0a\x1c\x6a\xf2\x93\xe4\xe7\xb3\x9c\xe6\xab\x8d\x8d\x85\x60\x7d\x8f\xff\xb8\x56\x57\x51\x94\xaf\xbf\x5f\xe4\xee\x3b\x09\x42\xde\x5d\x86\x61\x23\x51\xa4\x36\x3f\x18\xcc\x60\x46\x34\x09\xf8\x40\x6f\x1b\x15\x94\xaf\x0d\x50\xf2\xdb\x47\xac\xb1\x64\x94\xa4\xa8\x54\x78\x12\xef\x07\x53\x56\xcd\xa5\xe8\x16\x1a\x46\x65\xc4\x7b\x09\x18\xac\x0e\xcd\xd8\x9d\x4b\x46\xb5\x8a\x7c\xe5\xdb\x66\xab\x8b\x0a\xec\xab\x73\x73\xa9\xbc\xf7\x84\x1b\xcc\x52\x85\xd8\x1d\x87\x7f\x1b\x89\xde\x4a\x16\x91\x14\x43\xa1\x43\x6d\xeb\x63\x59\x71\x5c\x9f\x4b\xf5\x82\xaf\xdb\x48\x26\xdb\x7d\x20\x4e\x42\xd4\x47\x7b\xc3\x0b\x5b\x95\xa7\xd3\xa5\xc8\x9a\xab\xf3\xca\xf8\xad\x1f\x15\x59\x18\x7a\x79\x5e\x7b\x0d\xe2\x0f\x35\x4f\x16\x73\x8b\xc0\xfa\xcf\x9b\x45\xd1\x40\xd6\xff\x3f\x65\x58\x7a\x7a\xce\xbc\xe4\xe2\xf8\x01\x24\xa1\x6d\x98\x0f\x30\xd9\x22\x47\xdb\x81\x0c\x79\x77\x27\x28\xba\x56\xe1\x3c\x52\x5e\xb2\x34\x66\x58\xbc\x12\x7f\x8a\x26\x3b\x0f\x97\x60\x26\x58\x84\xfd\xae\xd5\x4b\x9b\x7c\xdf\x66\xef\x93\x67\x20\xa2\xc0\x8a\x14\x60\x04\x8a\x52\x26\x4d\x26\x73\x20\x41\xaf\x3e\x26\x99\x30\x16\x55\xe8\x09\xa9\x08\xbe\x9e\x8d\x12\x99\x8c\xa9\x6d\x97\xaf\x31\x61\x9a\x1c\xe4\x09\xf2\xbd\x10\x1b\x33\x48\xa8\x98\x94\x09\x4a\x7e\xde\xec\x66\x90\xe2\x6e\x8c\x0a\x42\x04\xe5\x3e\x97\x32\x2b\x54\x99\x15\xeb\xe7\x15\x09\xbe\x00\xc6\xb6\x1f\xd1\xd8\x9e\x5c\x3e\x3d\x7e\xdf\xf9\x70\x95\x29\x12\x60\xf6\x76\x58\x1e\xac\x3b\x15\x2e\x96\x4d\xd9\xc0\x4d\x9b\xbe\x94\xe7\xf6\x99\x8f\xe2\x4d\x06\x84\x42\xe8\xfc\x50\x77\xfb\xc5\xc3\xf6\xb0\xfc\xbe\xfa\x7d\xbd\x3f\xec\x36\x7f\xac\xbb\x41\x94\x6b\x67\x4b\xe5\xf8\x77\xdb\xb2\xcc\x47\x15\x62\x66\x38\x50\x27\xd8\xb0\xfa\xe3\xf9\x7e\x26\xda\x9e\xcf\x12\x99\x49\x03\x0b\x4f\x12\x39\x6c\xea\x27\xff\xe4\xa2\x80\x01\xaa\x5b\xe4\xe5\xf1\x11\xde\x2c\x31\x75\x3c\xc5\xa2\x40\xa5\xc6\x45\x45\x6d\x30\x30\x71\x3b\x91\x51\x48\x01\xdf\x55\xd7\x1c\x14\x45\xd3\x09\xf1\x8f\x4f\x44\x98\xd5\x6f\x5d\xef\xef\xf6\xc8\x58\xea\x7e\xc0\x88\x18\xbb\x53\xf8\x15\xee\x1e\x4c\xd3\x1f\xe3\xa9\xeb\xe3\xdd\x65\xa6\x99\x79\x0b\x22\x1a\x04\xa9\x17\x64\xf5\xe5\x86\xfd\xfe\xa7\x73\xee\x09\xfd\x99\x28\x53\x98\x31\x5c\x90\x78\xe8\x54\x6a\x86\xf3\x3d\x62\x3a\x44\xf7\xb4\xb7\xec\x0c\xd6\x3a\x0d\xb4\xd5\x1d\xac\xbb\x21\x26\xb4\x31\x50\x38\xbc\x81\x38\x14\xa1\x0b\xe1\x1f\x44\xa3\x5e\x3e\xf6\x3e\xa2\x98\xc6\x91\xe7\xc7\xd9\xc6\x74\x3d\x26\x62\xfb\x71\x32\xc4\x44\xd4\x06\xc0\xdd\x17\x28\x4d\x6c\xf4\x6c\x45\xfb\xca\xe6\x65\xfe\x15\x8a\x62\xad\x8c\x0b\x91\x6d\xe9\x7e\x53\x6f\xc5\xb5\x5d\xac\x47\xe8\x36\x19\x25\x32\xc0\xb8\xed\x0d\x9a\x97\xd1\x53\x48\x40\xa3\xad\xd9\xba\x28\x8b\xe7\xf1\x11\x23\x51\x08\x66\x87\xac\xa1\xd5\x0b\xfc\xfb\xe2\x54\x4a\xc7\xd7\xc0\xa9\xa5\x8c\xed\xd6\x8f\xab\xc3\xea\xe9\x11\xc5\x82\x91\x44\xb5\xde\xed\xfc\xc9\x38\xe3\xb8\x6b\x1f\x9c\xcc\xc0\x68\xf2\x8d\xd7\xa8\x88\xeb\x00\xf5\x02\x5d\xdf\xe4\xf6\x52\xe8\x71\xfe\x1f\xa5\xc0\xad\x7a\xc2\xe5\xcf\x3f\x07\xd2\xb7\xb3\x7b\x5d\x24\x02\x88\xa3\x5e\x91\xc1\x16\x88\x8f\x80\xbf\x9a\x1f\x92\x90\x58\x77\x7a\x46\xc7\x4a\x9c\x66\x7e\x53\x15\x10\x4c\x47\x9a\x97\xaa\x7c\xab\x7f\xbe\x40\xf1\x2d\x43\x82\xdc\x37\x64\x5e\xfb\x40\x22\x52\x8c\x24\xb6\x76\x70\x9c\x5b\x9c\x22\xad\x2c\x89\xab\x2a\x2f\x85\x46\xaf\xd0\x9b\xf2\xad\xa0\xbb\xdb\xf5\xfb\x24\x1b\x8f\xb4\x12\xd8\x40\x76\xd8\x93\xdd\x8c\x4b\xbb\x8c\x80\xeb\x78\xa8\x9d\xd9\x91\xb0\xdd\x71\x43\xd2\xc4\xb1\x3b\x17\x8d\xa7\xdf\xcd\x4f\x27\x43\x0c\x06\xac\xfb\x4a\xbc\x42\xfe\x07\xe8\xec\xef\x09\x8e\xc8\xc8\x50\x08\x5c\xb5\xb0\xf7\x62\xeb\x7e\x02\xa3\x69\x34\x0c\x6a\xbe\x41\xae\x67\x0b\xa3\xf3\x2b\x5a\x64\x40\x58\x4a\x9c\x57\x99\xea\xc8\xf2\x93\x0e\x54\x1c\x90\xd8\x2a\xe7\x5a\x15\xd3\x0f\x87\xa9\xe0\x5e\x76\xcd\xc6\x10\x87\x2f\xe1\x16\x32\x0e\x95\xc1\xb6\xd3\xee\xe7\xfd\xd8\x6f\x5c\xc6\x84\x86\x88\x4a\xeb\x01\x01\xb6\xac\x3d\x0f\x52\x90\x31\x49\xc2\x20\xe9\xd4\x85\x32\x2d\x9a\xb2\x1a\x6a\xf0\xcc\xa0\x53\x64\x4c\x20\xd0\xce\x51\x77\x33\xed\xb7\xc5\x34\xa0\x38\x6f\x5f\xca\x5c\xf7\x64\x50\x7f\x7d\x34\xe4\x58\xf9\xa8\x4b\xd3\x28\x71\xf6\xb6\xde\xfe\x28\xc4\x58\xaf\xf3\xae\x28\xab\x21\xa4\x73\xa6\xa7\x18\xb3\xd0\x5a\x38\xb6\xfb\xa9\x44\x8c\x5e\x57\x5b\x8a\x99\x08\xb0\xe3\xec\x17\x64\xf4\xb0\x9c\xc9\xbb\xc6\x97\xcf\x80\xa5\xd6\xf0\x75\xd4\xdc\x72\x47\xa3\x40\x07\x5e\x64\x0c\x97\x8b\x55\x9e\x79\x1b\xcc\xf9\xdf\x2a\x8a\x25\x0b\xbb\xc2\x00\x64\xcf\x22\xab\x7d\x70\x88\xc5\x6d\xbf\x3b\xc4\xb1\x92\x09\x38\xe1\xeb\x6f\xf8\xf0\xfc\x11\x6f\x2b\xa2\x72\x0b\xe5\xea\x37\xbf\x38\x31\x31\x2e\x88\x85\x38\x81\x8f\x10\x62\x9e\x2a\x6f\xe2\xda\x85\x85\x0e\x14\xf0\x11\xf8\x2b\xe3\x54\x51\xcd\x3c\x2a\xc3\x02\x6c\xda\x5c\xc7\x11\x11\xdc\x20\x41\x29\x65\x83\xe4\x0c\xb3\x88\x4f\x0a\x19\xb1\xe0\x71\xe0\x06\x2f\x33\xad\xb3\xe2\xf8\x3c\xa3\xac\xea\x07\xa7\x06\x9b\x36\xbb\xfd\xd3\xf3\x7a\x77\xd8\x3f\x1d\xbe\x6f\xef\x9e\x17\x37\xeb\x43\xb8\x5a\x3f\xee\xbd\x90\xb5\x8c\x85\x12\xce\x88\xb5\x11\xb9\xe7\x88\x75\x07\x75\x8a\xf5\xb6\xac\x76\xc1\xcb\xf7\xba\xcd\xc0\x4c\x27\x6a\xeb\x07\x4a\x42\x83\x60\xe0\x8b\x7f\xce\xd4\xa2\xae\x51\x36\xd2\x37\x1c\xc3\x68\x3c\xdf\xa5\x8a\x71\x3f\xca\xac\x1d\xd6\xbc\xae\xb9\x8c\xa5\xb6\x37\x72\x2e\xfb\xdc\x29\x56\x21\x63\x62\x20\x4c\xb9\xbc\x6e\x46\x44\x6a\x19\x6b\x63\xdd\x1f\x5c\x26\xd8\x6e\x2d\x23\x01\x5e\x19\x43\x62\x59\x7b\xed\xaf\xd2\xfd\x4f\x58\x90\x9f\xa5\x4c\x7c\x7f\xbe\xef\x0e\x68\x40\x7a\x44\x7b\xff\x7e\x73\x4a\x02\x22\xb0\xf7\x2e\xec\x2c\xd8\x75\xff\x57\xe0\xf1\x47\x38\xab\x46\x37\x94\x84\xd2\x20\x7c\x5f\x58\xa9\xee\x21\x52\x5e\x26\x24\xb6\x10\x4a\x04\x04\x78\x40\xe2\xdc\xe6\x92\x90\x54\x18\x57\xc3\x9f\xcb\x9e\x13\x22\xed\xa6\x7e\x84\x66\x97\x55\xd0\xe7\xa7\x7e\xad\x4e\x68\x2a\x63\x27\x25\xbb\xbc\x0e\xd4\x36\xfc\x61\x25\x70\xba\x99\x3c\x3b\xd7\x6d\x12\x90\x43\x5f\x57\x4c\x58\x48\x1d\xe5\x0d\x41\x0b\x8f\xf0\xf6\x30\xe3\x16\xe2\x07\xa7\x11\x75\x7d\xd2\x76\xff\x1c\xa2\x26\x65\x12\x05\xfe\x1d\x18\x59\x4f\xc8\x24\x32\x56\xce\xa9\x19\x98\xd4\x23\xcc\xb6\x1f\x10\x31\xa7\x06\x78\xba\xe4\xfe\x47\x4c\xe2\x20\x46\xc4\x46\x9b\x96\xe4\x88\x49\x6f\x3e\xdf\xdb\xbe\xc8\x14\x92\x98\x1a\xb4\xdc\xda\x42\x55\xfb\x9e\x98\xc7\x4d\x8c\x6f\x30\x8e\x25\x3e\x8d\x93\xa8\x7e\xd9\x1f\xb4\xde\x8d\x45\x69\x64\x12\x2b\x19\x3a\xb6\xe9\xc1\xf2\xa2\x0e\x97\xfa\xb3\xd0\x28\x89\x0d\x20\x64\xcb\x2d\x0b\xa0\xb3\x6e\xb9\x4f\x12\xce\x98\xc3\x64\x22\xc3\xf1\xeb\xc5\x37\x49\x24\x47\x19\x85\x36\x59\xed\x28\xd3\x7d\xc9\x3d\x49\x14\xc3\xca\x8d\xa5\x3d\x4d\x66\x6b\xa2\x43\x54\x49\xcf\xea\x43\x9b\x3c\x1f\xb0\x9b\xe8\x3f\xc9\x49\xea\xc8\xe8\xbf\xa0\x38\x58\x2b\xf2\x37\x91\xb5\xa1\xd2\xe1\x3c\x6c\x46\x26\xbc\x7d\x96\xce\x4f\xda\xbf\x87\xf3\x57\xcb\x85\x9d\x95\x45\xd9\x88\x2a\xfb\x53\x58\x29\xff\x69\x0f\x36\x49\xb9\xe4\xae\xac\x75\x9b\xbd\x43\x3d\xfb\x8e\xa4\xc0\xc1\xbd\x03\x3f\x44\x95\xb5\x0b\x56\x7d\x5b\x56\x37\xe2\xec\x63\xb8\x44\x44\x0a\x85\x03\xb6\xf7\x8b\xfd\xe6\xf1\xfb\xc3\x61\xf1\xf0\xf4\xfd\x71\x7f\x78\xbc\x59\x75\x43\x12\x81\xaa\x1b\xdb\x0a\x6a\xaf\x20\xf1\x69\x9d\x71\xfc\xf4\x04\xa4\x26\xee\x60\x18\x0f\xdd\xd4\x96\x04\xb0\x6d\xe9\x94\xa2\x86\x02\xf2\xe3\x13\x48\x66\x65\x1c\x6f\x2a\x10\x27\x14\x8e\xed\x4e\x21\x39\x92\x97\x57\xa6\x1c\xc7\xcc\x89\x0a\x35\xe2\x37\x06\x67\xed\xad\x47\xe7\x1f\x3a\x10\x8a\x8d\xa7\xdd\x8b\x38\x43\xfd\x92\x99\x36\x15\xb9\x2f\xcb\x5f\x97\xee\x41\x19\x11\x63\xba\xff\x9a\xc1\xdb\xed\x24\x87\x4f\x8c\x02\x7c\x53\x10\x53\x85\x25\x7c\x2b\x44\x54\x0f\x0a\x06\x3c\x20\xda\x09\xaa\x16\x8d\xc8\xfd\xe5\xf2\x80\x06\x56\xac\xa9\x2a\x15\xd4\xb5\x97\x41\xdf\xa1\xb2\xde\xfc\xdb\xc1\x43\x6a\x69\x02\x56\xcb\x78\x29\xf2\x41\x17\xd2\x0f\x49\xac\x98\x64\x9b\x9e\x1c\x1e\x16\xff\x58\x1c\x16\xbb\xdd\xd3\x6a\x33\x60\x81\x48\x4e\xb4\x45\x6c\x3b\x71\x90\x1d\xa8\x12\xf5\x3d\x7b\x6d\x10\xc9\x09\x00\xa2\xcd\x2c\x91\xf6\x46\x5c\xdb\x29\x84\x1c\x86\x49\xfc\xcd\x89\xb1\x1a\x27\x38\x27\xd1\x07\xf4\x5c\x56\x4d\x1b\xae\x9d\xce\x50\xd4\xd6\xe1\xab\x5d\xd8\x27\x97\x4a\xe3\x10\x69\xb2\xcb\xcb\xd5\x16\x9e\xc7\x93\x80\xd3\x34\x35\x3e\x4a\x28\xba\xb6\x3a\x67\xa1\x15\xe9\x74\x68\xe4\x09\x26\x7b\xf8\xf7\x93\xe2\x20\x67\x00\xf8\xc5\xf7\xe5\x71\xa1\x6d\x9c\xbe\x15\x59\xf5\x21\xac\x9d\x3c\xfd\x28\x94\xa8\xd5\xf1\x22\x6a\x27\x65\xe2\x68\x66\xfe\xca\x22\xa2\x02\xd7\xae\xe8\xdc\xb7\x86\x48\x1e\x1e\x45\x0a\xd5\x04\xce\x8e\x05\xf2\x7b\x56\x1c\x75\x39\xe5\xee\x0f\xbd\xf1\xfd\x07\x13\x86\x08\x97\x05\xc2\x8e\xf1\xcc\x63\x0c\x0c\x8f\x8c\x4d\x73\x6b\x68\x16\x97\xa6\x5c\x66\x95\x15\x35\x1f\x3f\xf2\x98\x30\xdc\xa2\xb1\x08\xe4\x3f\x1a\x47\x1c\x37\x9c\xfa\x52\x9f\x61\xa2\x2a\x21\x79\x1c\xa7\xf6\x61\x6d\xbf\x2a\x2f\xf1\x38\x05\x94\x27\xb3\x95\x3a\x68\x5e\x48\x10\x26\xdd\x37\x38\x4c\xc6\xa8\xa3\xfa\x25\xfe\x93\xc7\x46\x60\x7d\x13\x57\xd7\x6f\xa5\xce\x47\x01\x03\x8f\x8d\xc2\x22\x59\x56\xaf\xf3\xec\x98\xc9\xfc\x2b\xfd\x4d\xc9\x93\x84\x28\x0b\x0f\xbf\x7e\x2f\xb2\x4f\x3a\xf7\x9c\xc7\x06\x31\x3c\x3f\x44\xd1\x60\x9b\xe0\x6f\xf8\x93\x4b\x9e\x86\x11\x06\x8b\x87\x23\x96\x8b\x50\xf1\x6f\x3e\x7e\xe7\xa9\x62\xa1\x2b\xed\xaf\x06\xe1\xf7\xf8\x2a\x04\xb5\x94\x54\x59\x56\x55\xf9\x36\x1f\x5a\x70\xa1\x15\xd2\xdc\x11\x8e\x3c\xd2\xba\x77\x03\x24\x53\x08\xa0\x39\x97\x75\xb3\x7e\xb7\x20\xbf\x4f\xf4\xdd\x27\xef\xcc\xf8\x8b\x64\x62\x85\x7a\x33\xcf\xd6\x1c\x22\x71\xb8\x4c\x84\xd5\x6e\xd4\x7a\x55\x5e\xaa\x1a\xa6\xaf\xe3\x2c\x6d\x79\xf4\xf8\x94\x20\x38\x71\x9e\xaa\x36\xed\xe8\x4f\xad\x43\x62\x86\xf2\xec\xa3\xc5\x9e\x6b\xa9\x11\xbc\xf3\xe3\xf9\x76\xa0\x6c\x25\xb9\x56\x11\xd6\x70\xd1\x44\xda\xc2\xc2\xad\xa0\xd8\x60\x41\x86\x50\x0a\x1b\xdd\x3f\x58\x89\x84\xd9\xdf\x0a\x68\x68\x59\x0f\x50\x29\x12\x8c\xbe\x04\x28\xc7\x3d\xa1\xa3\x00\x50\xf2\x4f\x12\xdb\xf6\x18\x25\xff\x64\xae\x3d\xc6\x0d\x93\x08\x36\x7e\x28\x2b\x0d\x23\x7d\x22\xc9\x4d\x6a\x78\xb7\x75\xd8\x0a\x94\x45\x7a\x2c\x61\xba\xa4\x1b\x90\x18\xef\xa1\x5e\xce\x2e\x3b\x8e\xca\xb1\x69\x10\x4a\xd4\xcb\x93\x1e\x63\xb9\x44\xa1\x4a\xf5\x02\xb3\x94\x67\x99\x06\x3c\x94\x66\xa0\x6a\x36\xe7\x68\xed\x87\x0a\x85\xa0\xd2\xac\xb6\xe2\xaf\xbb\xfe\xf7\x49\x43\x46\x8d\x5b\xf5\x91\x1c\x37\xfe\x64\x18\x09\x0c\xae\x44\x9e\x29\xc0\x5c\xa5\xf6\xb6\x5e\x53\x69\x97\x0f\x48\x8f\x01\xa9\x5d\xa6\xa1\x90\x18\x43\x5f\x0a\x53\xe6\x79\xf9\x36\x2e\xbc\xa4\x84\x48\xaf\x60\xd5\x26\x34\xab\x32\xcf\xc5\x61\xb1\x3c\x04\xe1\x28\x0a\x4d\x49\x42\x51\x2e\xc0\xcd\x26\x17\x8b\xd5\x3d\x0a\xc0\x8f\x33\x14\xf5\xcc\x1d\x85\xd6\xe6\x71\xe3\xe7\x47\x83\x28\x18\x96\xa3\x50\x61\x71\xae\xb4\x91\xd2\x30\xc6\xec\x10\x5e\x45\x7e\x11\x0d\xac\x44\x03\xc7\x41\xdb\xf7\x2b\xa4\x7a\x4a\x09\xc5\x1a\x69\x51\xb6\x9f\x86\xd9\x58\x7e\xfc\x6d\x06\xac\x80\x1c\x34\x93\x42\x49\xca\x98\x4c\xa5\x5b\x0c\xa6\x7a\x99\x7e\x88\x89\x02\xf0\xda\x22\x5e\x8d\xde\x7f\x3e\xd2\x0a\x4f\xfd\x23\x93\x28\x2d\x3f\x61\xfd\xc9\x34\x0e\x12\xb4\x1f\xa8\xcf\x65\x53\x0f\xea\xdd\x69\x4c\x03\xe2\x62\xf6\xef\x45\xf6\xef\x0b\xc6\x1b\x76\x21\xc1\x36\xf3\x9c\x8c\x8e\xff\xa8\xf4\x10\x40\xfb\x9c\xff\x28\x0b\x37\xa5\xb9\x1f\x61\x38\xee\x79\xf2\x52\x15\x4e\xe6\x57\x1c\xc1\xed\xcd\xfe\x0a\x12\x01\x58\x5f\x2a\x2e\xa7\xa7\xf3\xb0\xf8\x9d\x26\x10\x2b\x35\x56\x5e\x74\xf3\x62\x27\xba\x9e\x57\x9a\x86\x96\xf8\xa1\x5e\xda\xd7\xce\xeb\x84\x39\x3d\xf3\x09\xed\x69\x58\x4e\x4a\xd3\x44\x3b\xf9\xbf\x42\x8f\xc1\xe4\x33\xa0\xa6\x34\x35\x81\x8a\x3a\xb6\x61\x3b\xf7\xda\x90\x64\x75\x69\x4a\x63\xea\x59\xca\xa6\x4c\x05\x21\xc2\xb8\x22\xcf\xcf\x6e\xe9\x4f\x25\x0f\xbc\xc8\xec\x33\xd4\x16\x2b\xfa\x7b\x56\xe8\x02\xea\x7a\xfd\x0a\x13\x11\x31\x99\x2a\x46\xb1\x59\x28\xb1\x0e\xa5\xfe\x8a\x9a\x91\xaa\x84\x83\x7d\xec\xd7\x75\x71\xcc\x0a\xe8\x93\xf0\xee\xc7\x53\x5a\x62\x64\xdc\x6e\x0c\x58\x42\x51\xd7\x4e\xe2\x60\x72\x36\xe0\x54\x39\x9d\xb5\x4a\x63\xf5\xa4\x4f\xda\x43\xc2\xff\x63\xf2\xd7\x7d\x4c\x47\x01\x62\x25\xb6\xf9\xa5\x19\x21\x2d\x52\xdd\x46\x39\x8e\xf5\x93\x15\xbf\xa6\xaf\xaf\x06\x6b\x87\xa1\x45\x23\x36\x1a\x8a\x26\x33\x48\x7e\x1e\x5f\x95\x06\x0b\x24\x07\xdb\x57\xc5\x7c\xd3\x97\xc4\x52\x48\x6c\x9f\x09\x29\x4a\xe1\xa1\x72\x92\xb4\x37\xe5\x45\xe6\xe8\xe2\x7d\xa8\x5f\xca\x4b\xae\xf7\x2f\xed\x06\xee\x3f\x24\x13\xe4\x35\xad\x16\xfb\xc3\x76\xfd\x7c\x58\xef\xbf\x1d\x6e\x37\xcf\xbb\xfd\x61\xbd\x78\xbe\xff\xc7\x61\xb9\x79\xbe\x19\x50\xda\x64\x0a\x9a\x06\x64\x60\x8c\xe3\xc3\xee\xfa\xa3\xd6\x89\x4c\x01\x42\xcf\xad\x7d\x80\x46\x2c\xd1\x90\xe7\xf8\xd2\x7c\x18\x66\xf5\x34\x35\xa8\x52\xc3\xef\xff\x58\x75\x34\xc5\xfe\xc9\x9a\x48\x75\xda\x99\x83\x6d\x33\x35\xc2\x30\x35\x00\x6d\x4f\xf3\xd9\x7e\xa8\x08\x28\x43\x61\x3c\xdb\x9b\xba\xab\xca\xb7\xe6\x65\x5b\x96\x1f\x8d\x4b\x10\x64\x46\xad\xcb\x71\x73\x2b\xaa\xce\x38\x4d\x8a\xd0\x04\x78\x19\x02\x25\xb8\x27\x62\xc7\x6e\x0c\x09\x82\x28\xe8\xda\x1a\x68\xb3\xe9\x8f\xd0\xd8\x0a\x37\x97\xfd\xbf\x62\x86\x2d\xfa\xfd\x76\x4b\x82\x90\x23\x2e\xbf\x3b\x26\x24\xd6\xdf\x9f\x4b\xf5\x6b\x2b\xce\x50\xed\x54\x56\xd7\x65\x55\x2f\xf4\x6b\x7b\x93\xba\x1b\xa8\xad\xa4\x55\xfb\x10\x5e\x2a\x00\xec\xde\x2e\x8e\x1f\x8b\x97\x7f\x0f\xf0\x2a\x28\x8d\xf1\x5d\xea\x30\xd5\xed\x63\x5a\x5d\xa6\x37\xca\x82\x04\xd7\x12\x4b\xda\x70\x10\xc9\xd1\x02\x2e\x98\x0a\x91\xec\x7e\xbc\xf8\xf8\x93\xfb\x23\x3a\xf1\xce\xbd\x0f\x59\x71\x69\x26\x72\xf6\x52\x44\x32\x91\x16\x9e\xee\x96\x75\xa7\x88\xe7\x0e\xc7\x90\x20\x41\x41\xe8\xd7\xac\x2e\xab\xeb\xbe\xb7\xf0\xf4\x43\x92\xd0\xe0\xaf\xf8\xf4\x3e\xd3\xd1\x14\x49\xaa\x0d\x74\x7d\x84\x59\x3e\x85\xe0\x46\xa3\x1e\xdb\x41\x95\xa7\xf3\xa5\x81\x4d\xd1\x2e\xe7\xd9\x2b\x0c\x1e\xc6\xe4\xd9\xa5\x81\x15\xfe\xc2\xbc\x13\xcd\x7d\x3e\x9a\xa7\x48\x91\x4a\x89\xc2\x31\xa2\xfa\x5a\xb8\x5b\x8a\xd4\xc8\x24\xf4\xb1\xe3\xa2\xfe\x65\xc5\x17\xdc\x41\x41\x53\xec\x2f\x82\x46\x3f\x97\xaf\x6b\x4f\x42\xf0\x30\xb6\x3e\xc8\xd9\xf1\x08\x95\xf3\xc2\xbe\xf4\x6a\x6c\xdd\xeb\x26\x44\xaa\x95\x5f\x29\x45\xfd\x22\xdb\x81\xf3\x46\x43\x1f\xf7\x48\x21\x84\xc4\x3e\xe1\xc3\xf5\x33\x55\xb9\xbf\x2c\xd6\x08\x19\x10\x6c\xc3\xbf\x41\xa5\xfa\x26\xb0\xd0\x81\x15\xb1\xda\xb2\x9f\x37\xc3\xf5\x55\x68\x92\x5a\xf7\xc5\xfa\xf6\x52\xa8\xc9\xd3\xd6\xd4\x46\x2d\x87\xd3\x25\xff\xe4\x67\x03\x02\xc6\x2a\xec\x5b\xa5\xe4\x21\xa5\x4c\x40\x6c\x25\xc7\x4d\xf6\x0e\x9d\x11\xec\xf8\xf3\x86\x59\x1a\xb8\x68\x53\xf7\xce\x21\x1a\xa3\x89\x73\x9f\x06\xfe\xf3\x7f\xfe\x63\x12\xdb\x09\x93\x08\x94\xba\xdc\x5f\xcf\x50\x3b\x53\x3c\xff\xbd\x46\x10\x6c\x0c\x62\x3b\xa0\x27\xe7\x08\x23\xba\xda\xc6\x6e\xbd\x7a\x7a\xbc\x39\xec\xf6\xeb\xed\xd0\x18\xf3\xd2\x73\x52\xa5\x30\x46\x5b\x03\xef\xae\x11\x58\xe6\x2e\x01\x19\xdd\x84\x0c\x42\xab\x40\xe3\x04\x7d\xd0\x27\x7b\x96\x22\x28\x83\x24\xc6\xee\xee\xac\xbf\xf8\x78\x2e\xc9\x90\x06\x51\xd4\xd5\xdd\x16\x79\xde\x35\x2c\xac\x7c\x69\x37\x0c\x62\x0f\xab\xac\xda\x87\xf6\x5c\x96\xa7\x87\x29\x42\x45\x12\x22\x91\xd8\x00\xef\xa0\x2c\xfc\x6c\xa6\x3b\x2e\x09\xa3\x28\xbc\x5f\x5f\xaa\xd7\xec\xf5\x6b\x5d\x5d\x29\x49\xc2\xb1\x0b\xe0\x5d\x88\xfc\x25\x11\xb0\xe4\xb7\x5d\xf9\x6b\x38\xd9\x24\x25\xd6\xc0\xa0\x86\xe6\xe6\xb1\x5c\xeb\xac\xdd\x00\xc7\x2b\x9f\xa4\x49\x92\x5a\x09\x2d\xbb\x0f\x67\x65\xb1\x7e\x3f\x67\x95\x68\xba\x98\x48\x32\x49\x62\xab\xf8\x59\xbf\x2c\xf2\xfc\xc9\x8b\x85\x4b\x19\xa5\x54\xf6\x28\xd8\x39\xeb\x96\xcf\x56\xf2\x41\xb9\xc6\x9d\x2b\x86\x24\x8e\x3b\x89\xa2\x9e\x06\x85\xfa\x39\xb3\x6f\x9f\x4c\x88\xf6\xe4\x2b\x0c\x7b\x76\x0d\x9c\xd9\xe4\x11\x27\x89\x46\xa8\xb3\xbd\xc4\xe7\xa1\x0e\xb1\x9f\xdc\x92\x47\x29\xaa\x35\x9e\xec\x24\xda\x75\x09\x22\x56\x1d\xb4\x8b\x43\x6d\x1a\xe7\x8f\xa4\x69\x8c\x76\x32\xdf\xe0\x1d\xf2\x75\x9b\xe6\x7e\xb1\x8a\xb8\xcf\x08\x4a\x4c\xd7\xdc\xa7\x53\xfc\x8c\x14\x94\x4b\xde\x91\xb2\x3f\xb9\x67\xc1\x63\xea\x72\x8d\x75\xf3\x82\x92\xff\x13\x49\xf5\x76\x8c\x88\xac\x3e\x60\x9b\xb4\x64\xff\xfd\xd9\xa9\x44\xea\xbd\x2f\xda\xe9\x5e\x81\x6f\x87\x48\x49\x2c\x2f\xee\xd0\x58\xaa\xd5\xf8\x73\x32\xe2\xd2\x05\x57\x3f\xb2\xea\x32\xa2\xf7\x4e\xee\x58\x42\x80\x69\x02\xbc\xdb\xb2\xa6\xff\x02\x15\x32\xac\x37\xa3\x3e\x92\x65\xcd\xbd\x64\x13\x0e\xaa\x54\x44\x60\xc7\xce\x62\xff\xa4\x28\x7e\x4d\x07\xa8\x10\xdb\xb1\x67\x2c\x1c\xef\x20\x37\xd3\x01\x3a\x06\x6e\xa3\x6d\x57\x89\x9f\x11\x9b\x91\x52\xd3\x00\xfb\x07\x37\x98\x9e\xa1\x2a\xe8\xf0\x3d\x32\x44\x21\xb6\x15\xde\x55\x7e\xd1\xd0\x95\x70\xc7\x27\x31\x54\x20\x92\xa2\x7e\x73\xdd\xaa\xf1\x8f\xa2\x82\x34\x14\xae\x97\xd3\xa5\x80\x38\x05\x16\x58\x3e\x46\xc8\xa9\xfb\x46\x15\x72\x11\x5b\x3b\x98\x1c\x1c\xa2\x74\x94\xf6\xfa\x61\x42\xa0\xae\xe3\x8f\xf5\x6e\xbf\x79\xbc\x3b\x2c\x6e\x7e\x6c\x76\x4f\xcf\x87\xd5\xfd\xe6\xf6\xd6\x9f\x8b\x30\xc0\xe4\xa8\x6a\x43\xda\x38\x9c\x5c\x15\x11\x1d\x16\x09\x29\x1c\xe3\x9b\x52\x94\x58\x33\x93\x23\xf6\x8f\xb1\x7c\x75\x5b\x56\x13\x1d\x2e\x3f\x36\xb6\x19\x7b\x05\x9e\xd9\xe1\x44\xa8\xfc\x95\x50\x19\xa2\xb8\xfd\xf3\xfa\xe7\xe2\xf9\xe6\x70\xfb\xf4\x8c\x7f\xb7\x4f\xbb\xcd\xa0\xc0\xae\xa8\x36\xbe\xb4\xbd\x2c\xcb\xba\x99\xb6\x29\x15\x8b\x2c\x69\x03\xcd\x7f\x7a\x71\x21\xa9\x98\xb6\x4e\x62\xbf\x6f\x1e\x31\x4d\xf8\xb9\xde\x74\x87\x80\x23\x9a\x00\x45\x80\x1f\xe1\xbd\x59\x57\x62\xbc\x14\xaa\x88\x12\xeb\x77\x5d\x2e\x07\x76\xaf\x23\xfd\xaa\xf1\x0b\xa4\xa2\x44\x20\x2c\xf0\x01\x74\xd6\xdd\x65\xa4\x43\x8c\xac\x1c\x81\xf6\xe7\x50\xaa\xaf\xbf\x87\x24\x90\x98\x23\xf9\xbd\xae\x97\xc8\xf6\xfb\xa1\xe2\x8a\x61\x63\xf9\x47\x56\x35\x17\x34\x5c\xce\xd7\x03\x15\x71\xa9\x52\x1a\x21\x00\xe8\x15\xaa\xcc\x5c\xb7\x55\x59\x9a\x81\x0c\xd5\x6c\xa9\x42\xa5\xc6\x52\x6c\xda\x98\xf9\x41\xbc\x77\x57\xe7\x0e\x0b\x16\x93\xd8\x12\x43\x3a\x88\x44\x77\x2c\xb2\x85\x8c\xc3\x17\x34\x6d\x25\x12\x6b\xa3\xf1\x98\x1d\xa1\xca\xc4\xa3\xc8\xaa\xa1\x7e\x8e\x54\x82\xa7\x54\x23\x4b\xed\x33\x37\x1f\xa9\x64\x92\xc4\x98\x28\xe4\x99\xb2\x6a\x4f\xc3\x6c\x50\x49\xa5\xb9\x93\xa6\xf0\x39\xf4\xfd\x6b\x38\x99\xb9\x9a\x30\x94\xe1\x3b\x5a\xa4\x62\x73\xc1\xee\xea\xe0\x4a\x81\x40\xda\x81\x18\xd6\xc5\xbf\x86\x13\x09\x92\x54\x84\xdd\xca\xb8\x2b\x55\x26\x72\x87\xdb\x98\x6c\xa0\xca\x10\x86\xa6\x71\x53\x06\xd1\xed\x3c\x65\x7a\xf2\x73\x98\x84\xe1\x52\xea\x4e\x6e\x6b\xaa\x0b\xad\x3f\xdb\xf2\x94\xe1\x31\xeb\xa3\x14\x9c\x35\xfb\x72\x95\x67\x7d\x71\x51\x07\xa9\xc2\xba\xb2\xee\xf4\xd4\xc7\x8b\xde\xc7\x50\x58\x87\x8a\xe0\x9b\xb9\x7a\xc9\xce\xce\x4c\x7c\xd8\xf6\xd7\x24\xb4\xb2\x32\xfe\x97\xbf\x87\x57\xc8\xe7\x96\x24\x4d\x48\x84\x36\x94\xeb\x1c\x54\x1b\x50\x64\xcd\x75\xae\xcd\xaa\x09\xb1\xbb\xbd\x75\x85\x5f\xef\xbf\xcd\xd7\xea\x35\x15\xb6\xfb\x51\x43\x17\xa5\x3a\xa8\x52\xbd\xb3\xea\x12\x16\x5e\xf1\x09\x23\x49\x53\x61\x12\xe2\x90\x02\x77\x65\xde\xc5\x71\x9a\x4a\xe6\xd5\xdf\xcb\xb7\xc5\x05\x83\xa3\xf1\x14\xd2\x4c\x6b\x99\x7a\x4c\x79\x3b\x01\x0f\x59\xf1\x2a\xf2\x4c\xff\x01\x55\x89\xe1\x9c\x87\x0c\x69\x06\x09\x8a\x86\x61\xab\x0e\xa5\x7a\xe7\x6e\x3a\x0a\xb4\xf2\xd2\x80\xb7\x55\x79\x9a\xd2\x1d\x26\xd7\x1e\x31\x06\x7c\xd4\xa7\xd9\x97\xdb\x5c\x4c\x98\x2f\x3a\x62\x06\x41\x17\xfa\x5a\x88\x53\xc7\x9b\xd6\x51\x6c\xd1\xa3\xff\xaa\xcb\x62\x25\x9a\xdf\xe6\xbc\xf4\xfc\x50\xae\x70\x71\xbc\x2f\x8f\xcb\xcb\xf5\xb6\xac\x6e\x33\xf1\xd9\x45\xc5\x89\x02\x87\x86\x3c\xe4\xa2\x6e\x0e\xa2\xae\xa1\x39\xe8\x89\x65\xae\x1b\x9d\x04\x80\x9b\x5e\xfb\x08\x6f\x45\x96\xdf\x41\xf3\xbd\xa8\xbb\xf8\x4a\x27\x09\x45\x18\xd7\x0e\x8a\x73\x59\x88\xbf\xee\x18\xe9\x24\x15\xd8\x8d\x6a\xbf\x7b\xe5\x12\x7f\x54\x46\x79\x13\xd5\x10\xc6\xaf\x39\xb7\x44\x67\x9b\x38\x6f\xd1\xd6\xc7\x69\x35\x8c\x9f\x1f\x17\x80\xab\x0d\x14\x7a\x55\x66\xc5\x6d\x9e\x9d\x3f\xf3\x45\x72\x9f\x48\x75\x12\xbb\xb8\xe3\x7b\xa1\xa1\x7a\xb3\x0a\x57\xee\xa8\x20\x56\x1f\x4b\x68\xfd\x58\x7a\xb4\x23\x09\xc6\xb7\x21\xa8\x21\xbe\x0d\x72\xb0\xc6\x9b\x07\x93\x15\xba\x5d\x90\xbf\x65\x45\xb3\xad\xe0\xd5\x9a\x10\xed\x45\x47\x02\xd0\x82\x27\x08\x9c\xbe\x5b\x7d\xfb\x7b\x4a\xe8\x52\xcb\x84\x62\xf0\xf2\x22\x6a\x6b\xfa\xb5\x3e\x4e\x38\xe4\x5a\xca\x14\x61\xff\x77\xa5\x7e\xcd\xe0\xcd\xca\xa2\xfd\xf5\x2f\x21\x41\x60\x04\x6c\xdd\x0d\x5c\x45\xcb\xf6\xaa\xc7\xe7\x57\x8c\x09\xef\x57\x59\x36\x13\x76\xdc\xf4\xc1\x28\x66\x3d\xce\x2d\xe8\x5a\xe4\x7b\x91\x7f\x05\x16\x1c\xec\x3d\x5a\xc7\x02\xfb\x14\xbf\x6f\x9f\xb6\x9b\xa7\xcf\xd0\xc6\x1a\x28\x47\x99\xe7\x73\x2e\x1a\x53\x56\xa7\xee\xff\xca\x02\xc4\xac\x4e\xc4\x73\x1b\x2e\xd5\x77\x95\x28\x9a\x4f\xa4\x50\xa5\x36\xa1\x74\x9e\xac\x28\xcb\x33\x45\xbb\x4f\x47\xc7\x31\x16\x53\x36\xf5\x1d\x14\x50\x67\xf5\x6c\x31\x47\x9b\x04\x50\x88\xd4\xd1\x89\xd6\xef\x67\xa8\x32\x28\x26\xe2\x72\x52\x1b\x61\x83\xd6\x36\xc4\x77\x27\xc4\x65\xf1\x33\x97\x9b\xee\x63\x29\xa6\x9c\x77\xd9\xeb\xa0\x27\x32\x39\xb5\x94\x89\x85\xd9\xad\x44\xf1\x2a\x6a\x5b\x21\x72\x3f\x82\x7f\x0b\x20\x20\x86\x92\x21\x04\x73\x40\x66\x99\xfd\x6e\x08\x98\xd1\xa9\xe7\xe8\xdf\x8b\xba\xd9\xa9\xb2\xf2\x2f\x2c\x84\x3c\xc2\xa6\x25\x58\x91\xc2\xa7\x09\xcf\x1e\x68\x4c\x11\x42\x80\x22\x0b\x58\x54\xde\x68\x4f\x30\x07\x1a\xc7\x48\x81\x44\x74\xc0\xd7\x79\x34\xd0\xd4\xe0\xc4\xbd\x5d\xaf\x6f\x7c\x5d\x1a\x18\x21\x38\x49\xf3\xf2\xd8\x27\xb8\xc0\x88\x75\x60\x71\xd9\x23\x2e\x32\x8e\x88\xf1\x95\x65\x9a\x84\x28\xb1\xbd\xb0\xed\xf7\xe5\xfd\x66\x75\xd8\x2d\xee\xd7\x23\xe5\x12\x88\x49\x8c\x4d\xbe\xce\x21\xa7\xdb\xad\x75\x37\x44\x11\x84\x4d\xaf\x2b\x9f\xe2\xf1\xf9\x32\x14\x24\x21\xc7\x8a\x6d\x36\xd3\x9f\xff\xbf\xfd\xeb\xbf\x42\x81\x1e\x4a\x4f\x1f\x1a\x10\xa7\xc3\x07\xf3\x0f\x09\x3c\xb6\xba\x75\xb6\x62\x7a\xe7\xed\x58\x24\xa4\x32\xc5\x5d\x66\xff\xed\x79\xbd\xfb\xf6\x74\x7f\x43\xbb\x23\x9a\xe2\x4c\x9a\xdf\xaa\x86\xcb\x03\x08\xa6\x8d\xab\xf8\xdd\x83\xd0\x50\xc9\x52\x54\x7a\xce\x8c\x55\x82\x0c\x28\xea\xbe\x15\x97\x93\x85\xfb\x74\x97\x22\x23\x8a\x09\xbf\xc8\x73\xe4\xb6\xf6\xcf\x5c\xa6\x30\x14\xfa\x5d\x5e\x67\x5f\x52\x90\xd2\x78\x57\xa5\x12\x51\xdf\xff\x6f\x1f\xb6\xd4\x02\x19\xd2\xed\x7f\x51\xa9\x68\x5f\xee\xf0\x0e\xa7\xa5\x0b\x50\x9c\x62\x8b\xd7\xe6\xc8\x3b\x61\xe0\x78\x11\x95\x13\x3b\xf6\x37\xa5\x8c\x8e\xe2\x91\x69\xf6\x9d\x38\x21\x44\x3b\x13\xf9\x43\x56\x2c\xa1\xd9\xf5\xf5\x24\xd0\x94\x62\x1d\x62\xf7\x6d\xf1\xbc\x3e\x6c\xbf\x3f\xaf\xbe\x2d\x76\xeb\xe7\x5d\x77\x3c\xb6\xbe\x3b\xda\xa9\x92\x8d\x98\x49\xa0\x79\xe8\x55\xf4\x6d\xb3\x1d\xcb\x42\x98\xd9\x44\x7e\xe9\xd0\xc2\x8a\x2d\x2f\x37\xf7\xf7\x7d\xe6\x07\x10\xa4\xde\x7d\xb4\x38\xc2\x1c\xae\x09\x4c\xac\xc1\x1a\xb1\x58\x11\x32\xeb\xe5\x3c\x59\x29\x4c\x12\x8a\x5e\x8d\x68\x55\xe6\x65\xb5\x87\x8e\x62\x07\x46\x51\x4c\x72\x1a\x38\xa1\x16\xdd\xa5\x82\x07\xf1\xee\x8e\x9a\x20\xa0\x88\xd0\x45\x6f\xbc\x29\x93\xdb\x8f\x21\x8c\x84\xc3\xce\x43\xc7\x9d\xc0\xfa\xfe\xa4\x47\x60\x02\x4d\xa9\x1d\x5e\xf8\xb2\xec\xe8\xae\x4c\x28\x63\x3e\x34\xcc\xc1\x06\x41\x36\xcd\xc6\x0d\x51\x89\x4a\x7b\xf1\xa8\x0f\x10\x25\x43\x34\xf5\xd3\x72\xe1\x1a\x0e\xa8\xb3\x33\x3e\x0d\x8d\x23\xe4\x97\x9d\xb2\x62\x60\x65\x23\x0d\x4b\x69\x48\x7b\x7c\xae\x47\xbc\x7c\x52\xba\x1b\x9f\x93\x81\x7b\x22\x98\x8a\x1c\xc4\x08\x71\x62\x22\xa1\xa8\x67\x2d\xa3\x94\x98\x5f\x76\x4d\x9c\x12\xdb\x7b\x6b\xc4\x2f\xf8\xc0\x6c\x37\x49\xaa\x70\xc7\x78\xba\x34\xab\xbc\xbc\x7c\x92\x15\x19\x1e\x58\x71\xa6\x63\xf6\x0a\xab\xb2\xa8\xfb\x6c\xc8\xf0\x34\xc5\x08\x54\x5e\xae\xdb\xf6\xc9\x0f\xb9\x14\xe3\x87\xc7\x5d\x73\xf3\xe8\xaa\x89\x9b\x62\x2b\xea\x66\xe2\x71\x3e\xbf\xa5\x98\x94\x05\x68\x6a\x6c\x67\x5c\x47\x40\x99\x5d\x3c\x4c\x1a\x43\xec\x49\x6a\x4e\xd3\xb8\xfd\x19\x90\x5a\x5a\x58\x5c\xb6\x1b\x29\x02\x8d\xca\x9c\xfb\x9b\xf5\x18\x61\x68\x44\x92\x72\x2f\xc0\x23\xaa\xbc\xac\xf4\xea\x05\xea\x66\x0a\xb2\x37\x42\x5b\x42\xb4\xb5\x9b\xdd\x66\xc8\x25\x1f\x6f\x25\xc3\xa2\x83\x11\x86\x40\xe7\x81\x81\x90\x5f\xa7\x06\x3e\xa5\x44\x1b\x09\x76\x16\xa1\x80\xdf\xf0\xd2\x14\x4b\x06\x94\xdd\x83\x98\xdc\xbd\x06\x8a\x72\x64\xa7\xeb\xcf\xac\xb0\xec\x73\x77\x04\x48\xe2\x9d\xf5\xd6\xfb\x6f\x1f\x0c\x3a\xa4\x81\x98\x11\x4b\x88\x2b\x47\x38\x1e\x63\x42\x8b\xa5\x46\xfb\xd1\xcd\xe3\xdd\xe1\xf7\xf5\x72\xb1\xec\x8e\x46\x41\x90\xf6\xea\xcf\xcb\x2b\xa2\x4e\x86\xdb\x8a\x31\x1c\x90\x3e\x7c\xa8\x2e\x85\x6b\x5b\xae\x86\x4c\xdf\xff\x37\xeb\xba\x31\x2a\x42\x41\x43\xd1\xa9\xc1\x7c\x85\x16\x50\x41\x90\x58\x00\xcf\x32\xeb\x5c\x66\xdd\x11\xca\x38\x02\x3c\x8a\x8d\x4d\x49\x05\x9a\x0d\xd7\x2f\xbe\x86\xa8\x02\x66\x12\xe3\xa4\x2e\xb0\x9a\x9e\x8b\xa6\x44\x16\x10\x4c\x14\x29\x55\x10\x89\x98\xc6\x03\xe2\x66\x35\x8d\x21\xfd\x38\xc9\x30\xde\x75\x52\x5c\x2f\x65\xd5\x6c\xf4\x2c\x26\x46\x05\x91\x36\xd8\x82\xc6\x82\x1b\xf6\xe0\x97\x99\x87\x20\xaa\x20\x26\x0a\x6b\x7c\x56\x59\xe9\xfc\x2b\x2b\xea\x7d\x39\x1b\x8d\xaa\x20\x31\x16\xc2\xd5\xc6\x85\x33\xe6\xe4\x33\xe8\x21\x15\xf0\x30\x44\xf6\xb0\xa8\xeb\x36\x19\x1f\xdf\x46\x9a\x28\xc9\xfa\x06\xe3\x6f\xe3\x0b\x4f\x53\x6b\x5e\xee\xfe\xeb\x7b\x5d\xe3\x41\x22\x8e\x30\x4c\xc8\x2b\x35\x12\x61\xf3\x87\x85\xc2\x96\xf3\xcf\x51\x75\xcf\x1d\x94\xa1\x15\x11\x44\x86\x68\xf5\x0b\xba\xd4\x51\x05\x92\xa4\x48\x50\x3b\x99\xea\xc9\x4c\xbe\x52\x2a\xd3\x19\x18\x0d\x78\xf7\x1e\x49\x30\x7e\x66\x52\x53\x8f\x62\xbf\xbf\xff\x71\x68\x1f\xdd\x21\x8c\xfd\xd7\xa8\xc0\x8a\x97\x54\x96\x76\x30\x15\xda\x57\x81\xd6\x80\x28\x3f\x0b\x75\xb0\xec\xd9\x93\x03\xc9\x21\xf7\x65\xfc\x40\x81\x04\x58\xfa\x3e\x1c\xca\x4b\x73\xbe\xb4\x79\x79\x2e\xc5\x04\xb3\xac\x02\x48\x21\xb6\xdc\x97\x7f\x5f\x32\xbb\x14\x8f\xe4\x78\x54\x00\x0a\x9c\xde\xeb\xa5\x7e\x2a\xc0\x1a\x56\xfa\x63\x40\x30\x38\xb8\x14\x16\x2c\xde\x2e\xd1\x58\xa0\xec\x07\x68\x7c\x87\x85\xd6\xf6\xb9\x5a\xec\xfb\xdc\x8e\xa1\xc2\x40\x07\x5e\xa3\xfa\xb6\x37\x67\xfa\x14\x56\x35\xa9\x98\xa9\x90\xd0\x20\x4c\x3d\x8d\xe1\xd6\xdf\xef\x67\xf0\xdc\x1e\xda\xa4\x42\x12\x41\xd2\xdb\xf4\x0f\x31\xce\x2a\x24\x92\x52\xe3\x40\x59\x1d\xdb\x42\x85\x44\x73\x69\x51\xdb\x6e\x5f\x19\xd4\xcb\xfc\x10\xc3\x91\x16\xab\xaa\xf6\xb7\x5e\xad\x9f\xfc\x67\x69\x60\xd5\xc9\x3a\xdb\xbf\x4f\x1c\xa6\xfd\x70\xca\xf0\x97\xbf\x2b\x4b\x3d\x78\x23\x3f\x86\xe2\x2a\xa4\x8c\x61\x90\x9a\xd5\x77\x97\x2c\x9f\x08\x25\xab\x90\xc6\x76\x0e\xd9\xfa\xea\xcd\xf7\x9d\x9b\x66\x3e\xd6\x56\x21\x35\x56\xe5\x14\xcd\x4e\x86\xab\x5b\xc8\x62\x43\x79\xe7\xd7\x5c\x34\x6b\x87\x02\x9b\xd7\xc2\x54\x21\x4b\x18\x6d\xef\xde\x1a\xc9\x82\xfe\x74\x1c\x07\x2b\x00\x6c\x25\x8f\xa6\x98\xde\xf9\x47\xc2\x0c\xed\xac\x0a\xcb\xcb\xd9\xfb\x25\x8d\x9e\x45\xc4\x62\xdb\x92\xa8\xa0\x7e\xe9\xcb\x8c\x2a\x8c\x13\x86\x6f\xad\x86\x5a\x4d\x32\xda\xf6\xa0\xb0\x69\x88\x4d\x36\x7a\x35\x8f\x91\x8a\xeb\xfc\xde\x10\x26\x34\x46\x8d\xa2\xfa\x22\x6f\x91\x66\xf0\x29\x34\xb9\x2b\x91\xa8\x30\x61\x60\xac\x23\xc0\xcf\xac\x29\x3e\xf3\x4c\x54\x61\x12\x4b\x0c\xe7\x7e\x2e\xee\xef\xd7\x7b\x4c\x5f\xfd\x1d\x25\x92\xa2\x7a\xd5\x19\x2a\x53\x56\xa7\x67\x10\x1e\xdc\xa5\x42\x4e\x04\xee\xc3\xba\x74\x0a\x08\x50\x61\x05\xa5\x3b\xee\xbc\x6d\x6d\x24\xf6\x0a\x3f\x5f\x2e\xc6\x64\x50\xef\xbe\xf8\x15\xc6\x93\x8e\x43\x8a\xb1\x13\xee\xa0\xcf\xa0\x2e\x55\x7b\x70\x99\xe5\xf9\x20\x3b\xfa\x72\x17\x56\x61\x2a\xac\xdd\xbd\x15\xee\x3a\x81\x73\x37\xfe\xba\x55\xed\x3f\xab\x35\xda\x35\xfd\xc8\xd4\x0d\x9c\x46\x93\x56\x12\xc6\x62\xaf\x8a\x72\xca\x9a\x4d\xd1\xc0\x00\x92\x30\xc2\x3a\x0e\xbf\x23\xf4\xd7\x25\x63\xa6\x64\xd7\xf5\x9b\x13\x8f\x56\xa1\xe4\x06\x55\x5f\xd1\x9c\xb9\xac\xbb\x27\x2b\x25\x18\xee\x21\xff\x50\x75\xa2\x4c\x2a\x54\x4a\x60\x9c\xb6\x3b\x89\xaa\x81\xf7\x4d\xf1\x5a\x0e\x9c\x0a\x26\xbf\xbb\x0e\x8d\x1e\xb6\xa5\x3e\x11\x9d\x1f\x3f\x4f\x9d\xa4\x00\xbd\x23\xb2\x53\x2e\x1b\x3d\x36\x9d\x6a\xc6\xfd\x72\x89\x1d\x1d\xa4\x5f\x8e\xcf\x03\x2c\xc4\x52\xe5\x72\xf3\xc7\xcd\xfa\xc7\xc1\xce\x3d\x7f\x1b\x86\x04\x68\xff\xb0\x5a\x3f\x1d\xf6\xeb\xc5\x43\xf7\xff\x88\x60\x74\xa0\xac\x1b\xc1\xbe\x7c\xc8\x8a\x6c\xdf\xa8\xc9\xb9\x4d\x12\xd3\x68\xa4\xef\xfe\x0c\xf5\xf4\xe1\x1a\x1e\x61\x0d\xc8\x56\x7b\xbe\x5d\x75\x55\x3e\x88\xf3\x5f\xdc\xbd\x91\xba\x8b\x98\x2d\x13\xb9\xcd\x37\xe7\x63\x19\x12\x84\x09\x96\x85\x34\xbc\x7e\xd8\x75\x49\x10\x27\x18\x79\xc0\xfb\x39\xeb\x4a\x12\xaa\xdd\x5b\x15\xef\xd0\xad\xe7\x31\x5a\x2e\x1c\x6d\x2e\x24\x04\x19\x58\xbb\x82\x11\x93\x50\x91\xd0\x08\xe6\xee\xff\xb1\x6c\x60\x79\xc5\x1f\x61\xfc\x90\x08\xa1\x14\x37\x45\xff\xeb\x2f\xf2\x0f\x8e\x2f\x7e\x24\x8f\xa3\xb8\x87\xb5\x0d\x42\x08\x9b\xbf\x42\x31\x5f\x33\x55\x84\x08\x8e\x34\xb6\x5f\xaf\x6a\xa1\xe7\xb9\x65\x8a\x10\x99\xa4\xbe\x4b\x79\x78\x83\xec\xe0\x22\x95\x2f\x91\x63\x8a\x10\x15\x3a\x43\x23\xac\x39\xb8\xff\x52\xc2\xa4\x6d\xf4\xd9\x48\x6e\xb2\x95\x13\x2a\xad\x95\xba\x6f\x14\x4c\xd2\x6e\x45\xa2\x30\xc6\x86\xda\x52\x48\x31\xe0\x32\xe0\x01\x7c\x5b\x3e\xb4\xfc\x27\x4f\x2b\x4a\x48\xe2\x79\x70\xdb\x32\xcf\xbb\x10\x8a\xfb\x01\xdc\x9a\xc4\x1d\xa1\xf9\xaf\xe6\x7a\x9b\xe5\x39\xe8\xa7\xca\x5a\x7d\xe7\x80\xbd\x22\x0b\xa8\x1b\x85\x84\x24\xd2\x36\x5c\xfa\xbe\x5b\x3f\x1f\xee\x9e\x9f\x7e\xee\xbf\x1d\x10\x9a\xb9\x3b\x3c\xaf\x77\xeb\xe7\x1f\xeb\x1b\x7f\xa9\x71\x10\x63\x9b\xf2\xe1\xc7\x9d\x9a\xa1\xe6\x8c\xe6\x4a\x1c\x43\xe8\xb0\x81\xeb\x77\x9b\xc5\xdd\x55\xe5\xe5\xc3\x8b\xe0\x87\x0b\x81\x79\x33\x3e\x01\xff\x81\xee\x7b\x65\x0c\x5d\x97\xf5\x20\x2f\x7e\x59\x22\x3c\x8c\x03\x3a\x7c\x6d\x1e\xc4\x74\x3a\x72\x61\x05\x00\x85\x3e\x65\xc5\x9d\x33\x6f\xf0\x65\x1c\x45\x52\x16\x5a\xba\x8a\xa3\x3c\x1f\x1a\x2c\x18\xcd\x3b\x26\x29\x22\x62\xfb\x04\x3c\x7f\xac\x7d\x0d\xea\xc9\x37\x0a\xe7\x84\x86\x18\xa4\xdb\x2c\x87\x51\x53\xbd\x93\xf3\x0b\x83\x3e\x20\x64\xff\xf3\x51\xe5\xcf\x9d\x4d\xaa\x14\xc9\x76\x9d\xac\x78\xec\x7a\x41\xbe\xf5\xd1\x0d\xd4\x84\xc4\x5e\xdf\xac\xcb\x6c\xda\x74\x6e\x32\x13\x75\x40\xbd\x6b\xec\x22\xcf\x07\x64\xcd\x4d\x17\x71\x10\x9d\x84\x92\x76\xd6\x18\x26\x3b\x4e\x25\xbc\x27\xa7\xe4\xb1\x45\x3d\xb8\xf8\xd0\xb3\xb6\xbf\x50\x7b\x50\x44\xcb\x58\x3b\x5c\x4d\x47\xf4\xf2\xdb\x18\x31\x01\x43\x38\xe0\x42\x6b\x27\x6f\xf3\xe1\x5c\xa3\xe9\x66\x84\x8a\x7c\xd9\x29\xab\x60\xec\xeb\xaa\x88\x51\x16\x6d\x64\xb1\xcc\x5e\x8b\xe7\xc1\x8b\x7d\x4c\x32\x33\x62\x80\xe1\xca\x84\x70\x97\x94\x4d\x7e\x60\x63\x02\x2f\x74\xdb\xe5\x45\xd4\x75\x71\x15\x0d\x22\x62\xdf\xe7\x8b\x3c\x65\x75\x9d\x95\x85\x37\x02\x18\x58\x3a\x2a\x1a\xc6\x26\xb1\xec\xaa\x02\x79\x6e\x93\x59\x44\x43\x11\x28\xe1\xea\x6b\xb7\x56\x49\xb9\x76\x0c\xef\xee\x49\x8c\x3f\xa0\x4d\xe4\x0b\x42\x88\x0d\xab\xcb\xbc\x36\x65\xf5\x92\xf9\xe2\x88\xa2\x84\x84\xb6\x36\x8a\xbf\xcf\x7b\xd6\x5c\x6f\xcb\x6a\xd9\x28\xf7\xeb\x6e\x2b\x30\xd9\xfb\xc0\x7c\x56\x51\x22\xac\x9a\xd7\xa1\x2c\x6c\x1b\xc7\x42\x9b\x26\xbb\x2e\xa5\x81\xf5\x0c\xb1\xa8\x33\xe4\xd1\x8e\x54\x0f\x14\xa5\x06\x90\xa0\xe2\x32\x96\xd1\xfc\xa1\x4c\x71\x7c\x66\xdf\x77\x37\xab\x61\x38\x44\x99\x4e\xb0\x52\xfb\xfd\x71\xb3\x5f\xdf\x1c\x1e\x91\x44\xbb\x3b\xdc\x7e\x7f\xf4\x8b\x12\x8d\x08\xf5\x06\xee\x8f\xf0\x66\xfb\x6e\xd3\x8a\xeb\x10\x8b\x3a\xcd\xc2\x68\xcc\x14\xc8\xae\x20\x61\xe9\x83\xa5\xe3\x68\x70\x3f\x46\xd9\x5a\x7f\x65\xb5\x99\xa7\x14\xb1\x76\x80\x09\xe3\x01\x35\x7e\x56\x96\x6f\x8a\x00\xea\x2e\x21\x09\x12\x5f\xf9\xab\x8e\xb0\xbc\x5c\xe1\xc3\xde\x3f\xbf\x5b\x51\x1e\x5a\xdd\x9b\x13\xa0\x1f\xe1\x47\xd1\x65\x45\x39\xd1\xa9\x45\x20\x38\xc3\x0d\x6f\x66\x3d\x7a\xa3\x46\x72\x7a\x8a\xf2\x38\x46\xa2\x64\x2e\xea\x66\x3b\x55\x0c\x57\x94\x27\x1a\xcb\x73\x8f\xbb\xf1\xef\xc5\x15\x75\x88\x8c\xfb\x52\xe8\xff\x6e\x3f\x34\xb9\x9a\x34\x4d\x74\x3f\x0f\x96\x97\xeb\xd4\x8f\x71\xfc\x45\x22\x08\x54\xb7\xf4\xa3\xfa\xae\x95\xe5\xf6\x2b\x15\x15\xa1\x08\x45\x87\x65\x69\xb7\xec\x09\xdb\xe1\x93\xa5\x9c\x8a\x58\x80\xcd\x62\x1e\x66\x68\x7d\x8a\x8a\x34\xc6\xfe\xa5\x03\x05\x6f\xab\xf2\xfd\x6a\x45\xe3\x1f\x4a\xf5\xeb\x07\x99\x3c\x11\xa1\x24\x32\xf5\x34\xc8\xcb\x9c\x2a\x93\xa2\x32\x4e\xb0\x62\xd4\x35\xbf\xcc\xa4\x52\xad\xa8\x14\x24\x76\x4b\xf3\xf2\xba\x83\x93\x28\x9a\x4c\x79\x27\x45\xbb\x3e\xfe\x93\xfa\x49\x23\x4d\x20\xfb\xae\x8d\x6b\xc4\x60\x38\x3f\xbe\x51\x1d\x1a\x84\xd4\xad\x9b\x97\x1b\x91\xe5\xd7\x81\x9c\xc4\x74\xa4\x31\x88\x3a\x73\xe7\x5a\x8a\x3a\x53\x93\xd7\x18\x54\x84\x58\x8b\x5b\x51\xfd\x99\x8d\x7e\x7a\x00\x91\xda\x55\xb1\x80\x4a\xe4\xf7\xe5\x71\x72\x76\x30\xb1\x76\x76\xbf\xd9\xe9\x62\xd3\x9e\xfd\x8b\xcb\x75\xfd\x59\x0c\xb5\xc5\x8b\xdf\x45\x7e\x3d\xd7\x65\xf7\x6f\x6e\xa9\x75\xfb\x0c\xaa\xc3\xcf\x2c\xd7\x4a\x34\x07\x5f\x69\x1c\x2c\xf4\x2c\x48\x2d\x1e\xdf\xde\xdf\x58\xe5\x71\x3c\xb5\x58\x48\x43\xac\xf7\x9f\x2c\x25\x63\x5f\x6e\xfb\x54\xa8\x8d\x0a\x92\xae\xcb\x7c\x93\x15\x65\x77\x40\xc4\xb6\xb2\x87\x12\x9f\x93\xcb\x67\xa1\x34\xa9\x03\xb6\x3c\x15\xcb\x4b\xe5\x6c\x6c\x2d\x6c\xdb\x8d\xa1\xa1\x3d\x03\x76\xbe\x46\x64\xb6\x98\xcd\x57\x0f\x18\xa5\xdc\xaa\x18\x8b\x2a\x6b\xae\x56\xf5\xc7\x1f\x4a\x99\x37\xa9\xb7\xbd\xae\x7a\xd1\x2c\x46\x0d\x83\xc9\x6d\x33\x1d\x51\xe3\x41\x23\xa6\xbc\x54\xae\xf8\xbb\xfe\xf7\xd2\x2e\x96\x7e\xbf\x75\xe3\x23\x95\x80\x17\xd1\x6f\x43\x1e\x57\xf8\xff\xdf\xd4\xac\x15\x8b\x63\x6d\x51\xfc\xd9\xb1\x80\xa1\xbd\xb9\x62\x31\x58\xd7\x8f\xc6\x72\x66\x9f\x0a\xf8\xa4\xf0\xc2\x62\x23\x13\xab\x27\x22\x8e\xb0\x1a\x24\x31\xee\x78\x12\x2a\xbb\xf3\xce\xe9\x4d\xe1\x57\xb2\x99\xcc\x79\x9e\x77\xad\x58\x12\x5b\xd8\xef\xef\x59\xd3\x40\x31\xf6\x2a\x53\x2c\xe1\x12\x85\x04\xd6\xcf\x2b\x4e\x12\x9c\xcb\x0f\x9f\xa9\x95\x2b\x96\x40\x97\xdc\x5a\x39\x51\x1b\x54\xfd\x9d\x22\x21\xe3\x81\x45\xe2\x21\x4f\x79\x25\x0a\x9d\x69\xd1\x4d\x53\x9e\x04\xaa\xc3\xbb\xa3\x6e\xb9\x3f\xc0\xb5\xf0\xfa\xf1\xd6\xcd\x1f\x05\xc1\xbe\x17\x4d\x96\x8f\x1e\x7f\x1a\x85\x91\xd3\x07\xec\xa1\xcd\x56\xf3\xc6\x9f\x4b\x50\x1e\x9b\x1e\x66\x37\x94\xfd\x53\x4c\x30\x65\xd9\x3d\x3e\x3e\x75\xe1\xa9\x8b\x4e\xfd\xa8\x34\x89\x3b\xc1\x96\x67\xd1\x00\xeb\x3e\x0f\x82\x27\x3e\x72\x40\x31\x07\x4c\x6c\x46\xf1\x18\x93\x26\xc5\x49\x9e\x0b\x6c\x60\x09\x4f\x18\x1f\x3d\x64\x45\xa8\xb6\x20\xfd\x63\xbb\x4f\xdc\xb5\xdb\xf9\x6a\xe0\xe6\xe8\x87\x31\x96\x40\xbf\x01\x89\xa6\x99\xb8\x88\x2b\xa6\x64\x8c\x4b\xd9\xe6\xf1\xc7\x7a\xb7\x77\xca\x2c\xfe\x82\x15\x08\x24\x65\x28\x17\xe3\x2e\xba\x1f\x43\x19\x45\x65\xa7\x1b\x74\x5b\x56\x6b\x55\xd6\x56\x4d\xc4\x8d\xd0\x41\x02\x49\x47\xe7\x56\xd3\x24\x91\x69\x16\x63\x6f\xe4\xbe\x3c\xae\xc4\xe9\x2c\xb2\x63\xe1\xe3\xad\xc9\x40\x15\xe3\xe6\xa5\x4b\x35\x90\x03\x50\x4c\x3b\x8f\xd2\xc3\x41\x4d\xca\xe7\xa3\xbd\x88\x41\x40\xb1\xaf\x73\x38\xb6\xe9\x59\x53\x89\xad\xa8\xc4\x69\x34\x31\x80\x93\x74\xa2\xe6\xf2\x0c\xd6\x3c\x7e\xfc\xb4\xc0\x00\xa2\x29\x70\x8b\x5e\xdd\x3f\x62\x2a\xa5\x33\xd1\xad\xc9\x26\xa4\xb8\x35\xfe\x14\x55\x03\x6a\xb8\x69\x30\x23\x78\xea\xf5\xb4\x5e\xb2\x5c\x2f\x71\x11\x18\xff\xfa\x51\x00\xd6\xb0\xfc\xf9\xdb\xd3\x6a\x3e\x4c\x88\xc2\xc8\xe0\x5e\x88\xd2\xca\x1e\xc9\x3e\x40\xb0\xab\x28\x94\x01\x16\x23\xeb\x8b\xac\x11\x2f\x79\xc8\x0a\x9d\xbd\x66\xfa\x22\xf2\x43\x6d\xdd\xcb\x46\xf7\x15\x11\x26\xc1\xe9\x43\x81\x6a\x6c\xef\x73\x32\x84\x0a\x8d\x7e\x86\x32\x17\xea\xd7\x6d\x95\x69\x94\xd0\xb6\xf2\xbe\x6e\x08\x53\xca\x9a\xd8\xd8\x30\x62\xbd\xff\x36\x6a\x6b\xab\x28\x06\x8b\x68\x69\x63\xef\x3c\x1f\x13\xc7\x55\x94\x30\x81\x48\xb6\x4b\x81\x1b\x8e\x15\x8a\x41\xe9\xf1\x6e\x44\x64\x90\x1d\x61\x9b\xbe\x4f\xe6\x59\xbc\x8d\x8c\x6e\xbb\x2f\x4a\x8c\x22\x7c\x80\x0f\x78\x68\x33\x0b\x00\x67\x07\xf7\x91\x9b\x37\xbb\x7d\x44\x3c\xb0\x42\x1e\x47\xb7\x1d\x8c\x9b\x56\x11\x8f\x94\x6d\x4e\xda\x6a\xb4\x87\xdb\x4e\xf0\xb5\x7e\x70\x92\x22\x94\xf5\x67\xa6\x5d\x17\xb7\x3f\x4f\x9a\x32\x3b\xfb\xae\xe7\x09\xd9\x5d\x45\x29\x53\x88\x7b\xcf\xdb\x48\xe6\xc6\xd3\xe1\x7f\x8a\x57\xef\x2d\xa3\xa2\x54\x32\x44\xd5\xa3\x8c\x15\x5c\x4e\xf7\x65\xd3\xc0\x80\xf8\x3f\xbe\xa9\xd4\xd8\xc9\xb1\x12\xbf\xfa\x2f\xfb\x8b\xe0\xdd\x7d\x54\x10\xeb\xd5\x95\x67\x0a\x8a\x1a\xcb\xa9\x37\x50\x94\x18\x69\x7b\x85\x1e\x15\x09\x4e\xac\x22\xa7\xf5\xbe\xee\x31\x23\xed\x4a\xc6\xff\xd9\x29\x57\xf8\x27\x23\x52\x86\x3f\xfb\xc1\x59\xba\x8e\xdc\xf6\xc7\x73\x50\xc6\xd4\x2b\x80\x60\x51\x66\x26\xf4\x8c\x24\x44\x89\xeb\x3e\x3c\xe9\x2e\x76\x8e\x94\x04\xff\xf6\x79\x3d\x86\x5b\x44\xb9\x9c\xc6\xcb\x4d\xa4\x63\x9d\x76\x7e\x08\xf8\x84\x76\x83\x9f\x43\x9b\x08\x3b\x77\x36\x81\xba\x2f\xc5\x47\xa0\xc3\x27\x70\xc2\xbf\xfc\x3b\xba\x0b\x6d\x12\xda\x11\x35\xab\x59\x80\x97\x2f\x67\xce\xc0\x4b\x54\x64\x28\xe5\x9d\x73\xe3\xae\xb9\x68\x28\x9a\xd2\x38\xd9\x94\xd1\x43\x8d\xc3\x40\xf6\x6c\x44\x07\x0b\x7e\xc9\xea\x7f\x80\xf0\x3f\x69\x1c\x86\x36\x56\xef\x64\x3f\xbe\x17\xb6\x6e\xae\x57\x65\xf9\x2b\x9b\x34\x53\x63\x42\x62\xa3\xbc\xc2\x5f\xf6\x27\x74\x42\xfa\x2a\x26\x22\x66\xc3\xc4\x60\x55\xba\xc2\x81\x1f\xc0\x28\x67\x56\xcc\xff\xdd\xf9\x17\x0d\x1e\x7f\xcc\x94\xc1\x05\xe4\x94\x15\xcd\xa1\xc9\x4e\x70\xb0\xfd\x2b\xeb\xb8\x31\x3f\x6b\xe2\x48\x5a\xc7\x17\x68\x5e\x86\xe1\x64\x1c\xa9\x18\xa9\xc6\xd6\xab\xcf\x2d\x46\x70\x27\x72\xf1\xfe\xe1\xe5\xf9\x3a\x35\x8d\xe3\x50\x60\x60\x77\x23\xca\x8e\x9c\xe5\x1b\x88\xd5\x27\xdc\x04\x15\xc7\xd4\x0a\xe5\x6a\xf0\xb2\x13\xab\x49\x63\xd4\x0f\xe4\xb6\x7c\xb4\x7a\x7a\xbc\xdd\xdc\x1d\x6e\xd7\xeb\x9d\xbf\x89\x58\x2a\x5c\xa3\x7e\x96\x55\xae\x7f\x66\x1a\xee\xcb\x91\x77\xb9\x8a\x93\x28\xc6\x29\x8b\x96\x52\x6d\x48\x36\x84\x9f\xa9\x38\x89\x13\x6b\x61\x75\x29\x74\xfb\x3a\xa0\x14\x79\xe1\x83\xbf\x98\x6b\x13\x27\xfd\xec\x18\x28\xb4\xab\x38\x55\x56\xa7\xb4\x86\x06\xfd\x05\x67\xd9\xd6\x2a\x4e\x41\xe1\x1b\xd5\x61\x7d\x66\xd7\x60\x37\xd8\xab\x75\xca\xcb\x75\xdd\xbc\xdc\x97\x65\x23\xcb\xf7\xc9\x09\x85\x96\xb4\x33\xc9\xfa\x5c\x00\x6c\xfc\x21\x49\x22\x69\x99\xc0\xf5\x25\x9f\xb0\x52\x54\x2c\x63\x85\x9a\x57\x05\xbc\x79\x20\xf5\x6f\x1f\xfc\xbc\x55\xac\x88\x65\xd2\xfe\xeb\xa2\x8f\xce\xcb\xfa\x33\xe8\xfb\x7f\x4c\xea\x32\x73\x05\xd0\xcf\xea\xa2\xfe\xdb\x62\x6b\x6c\xe1\xa2\xbc\x59\x3b\xb9\xf1\x3c\x54\x5c\x2a\x3a\xa2\xb2\xcc\xc6\xdd\xd3\x2f\xd2\xa1\x4e\xc1\x87\xd6\x4f\x97\x66\x2f\x8e\xa3\x6e\x48\xac\xa9\x4d\x85\xdd\x56\xb7\x7b\xb9\x34\x9d\x75\x60\xff\xed\x9a\x0b\x0c\xc4\x5f\x44\x8d\x31\x16\x34\x1d\x99\x4d\xc5\xc0\x18\x56\x2d\xd7\xaa\xbc\xef\xd4\x4f\x55\x0c\x51\x4a\x62\x47\xf1\x38\x34\xe5\xa1\xce\x34\x1c\xd4\x08\x51\x3f\x7f\xab\x20\xa5\xb4\x1c\xd4\x77\x6f\x9f\x3b\x2c\x3a\xc6\x46\x11\x3f\x39\x6f\xb2\x5a\x5e\xaa\x3a\x2b\xb0\xb4\x3b\x9e\x17\x49\x40\x15\xea\x6b\xa0\x9a\x1c\x2a\xdb\xef\xbd\x25\xc2\x6f\x7e\x88\x8c\xb1\xa2\xaa\xe1\x7e\xaa\x43\xac\x92\x90\x01\x16\x79\x06\x85\x68\xaf\x5f\x39\xb3\x3d\x25\x84\x85\xd8\x77\xdc\x96\x0d\x14\x8d\xcf\x61\x12\xca\xd3\xa0\xcb\xc1\xc7\x75\x88\x84\x02\xa0\xc0\xa1\x12\x95\x3e\x60\xf8\x75\x68\xb7\xdc\xe1\x5b\x9c\x30\xaa\xb0\x5d\x75\xbb\x1a\x48\x4d\xa8\x24\x0a\x24\x56\x56\x25\x52\x71\x2d\xaa\x66\xf6\x71\x26\x91\x56\xa8\x23\xbf\xbe\x7d\x6a\xc3\xe9\x65\xaf\x0c\xe0\x07\x18\x7b\xaa\x36\xf9\x7e\xc9\x2a\x2f\x22\x3e\xb9\xd6\x98\x86\x48\x29\x10\xa8\x9f\x36\x7a\xc7\x92\x44\x10\x04\x6d\x2e\xce\xe7\x1c\x7a\x09\x78\x95\x24\x2a\x00\xd7\x21\xcf\x4a\x4d\x1e\x2f\xa7\xa1\xe3\xb1\x4a\x12\x88\xa4\xf7\x0e\xb7\xdf\x6a\x8b\x0c\xe3\xd3\xf3\xc0\x7a\x3d\x7d\xb7\x6f\x0b\x1a\x95\x0d\x12\x78\x5f\x6e\x4f\x38\x95\xc6\x81\xf5\x9d\x23\x5a\x8f\xff\x53\x09\x8f\x48\xea\xd2\xd7\x27\x63\x32\x24\x4c\x55\xf9\xf8\x51\x70\x49\x92\x78\xc6\x0d\x66\xf2\x48\x53\x16\xa8\x4e\x2a\xbd\x79\xb1\xa0\x83\x5d\x53\xaa\x5f\x13\x0c\xd2\xfc\x0c\x4f\x52\x61\x30\xf1\x59\xbf\x42\xd1\x2c\x2f\xd7\xdd\x80\xf1\x3b\xac\x63\x76\x4f\x40\x04\x24\x71\xc2\x73\x0f\xd9\x20\x82\xff\x27\xff\x1f\x3f\x82\x90\xa8\xf3\xc2\x7d\xb8\x8e\xd9\x8c\x2a\x11\x91\xc2\x77\x66\x51\x35\x99\x11\x6a\x26\xa5\x4c\x84\x24\x1e\x79\xfb\x20\xde\xf7\xe5\x0e\xf2\xb1\xc8\x8e\x4a\x04\x50\x9f\x8f\x3f\x8a\x13\x2e\x5b\xbf\x97\xd9\xaf\xd1\xae\x94\xc8\x90\x63\x5f\x1e\x4b\x5a\x8e\xb8\xd3\x91\x91\x54\x22\xb9\xb1\x8a\x7c\x03\xb5\x39\x07\xd7\x1b\x7f\x99\xa2\x0a\x57\xe4\xdf\xab\xeb\xb9\x29\xcf\xd7\x2e\xa6\x7d\xf8\xdf\xa0\x11\xc7\xf7\xa8\x92\xd0\x0a\xa9\x7a\xc2\xb9\x5f\xc4\x12\x05\x21\xa2\x48\x7d\xf8\x62\x95\x0a\xfa\xc3\x46\x23\x45\xd2\xc2\xa9\x10\x69\xef\x4c\x44\xb1\x58\x3d\xd1\xb5\x9d\xfc\xdc\x9a\x02\x16\xab\x32\x55\x6e\xea\x55\x5e\x76\x4c\x52\x95\xe8\x44\xe3\xa1\xba\x11\x85\x6e\xe3\xb3\xe1\x93\x84\x58\x8a\x3e\x15\xdf\x42\xb5\x82\xa2\xa9\x6f\xc4\xf5\xa9\xe8\x1e\xa7\x09\xac\xdd\x70\x56\xb7\x2f\x36\x4c\x38\x08\x2a\x31\x89\x35\xa8\xc1\x14\xe2\x06\xf2\x46\xfc\xdd\x00\x68\x72\x13\x46\x24\x64\xd4\xdc\xbf\x07\xd3\x74\x8a\xd7\xa3\x2f\xe5\x01\xd7\x08\x78\x42\x03\x01\x3b\x05\x66\xd7\x4c\x1e\xc8\x00\x8b\x0d\xa7\xac\xc0\xa0\x6a\x14\xc0\xf0\x40\xa5\xd4\x55\x55\xd0\x76\x66\x88\xb7\x1b\x5f\x1d\x0f\x4c\x84\xc1\x92\x2b\xcb\xda\xf3\xec\xcb\xad\xa8\x9a\x4c\x65\xe7\x0e\x93\xab\x78\x48\x75\xec\x75\x0c\x36\xcd\xcd\xeb\x68\x01\xe0\xa1\x08\xad\x2d\x8b\xeb\x25\x59\x93\x08\x54\x28\x99\x8d\x6a\x78\xa8\x98\x4e\xfc\x8c\xc2\xfb\x25\x83\xd9\xce\x43\x08\x1d\x1d\xc5\xe9\xd0\x74\xe4\x96\xac\x2c\xb0\xc7\xf2\x31\xcf\xe2\x21\x30\x2e\x3b\x07\x9f\xef\x59\xff\x44\x68\x18\x5b\xcf\xab\x97\xd2\x01\x52\xac\x11\x5a\x77\x9c\x5a\x30\x66\x1b\x0a\x9d\xa0\x03\xba\xf9\xa3\xa9\xf4\x7c\x94\xa1\xd6\xe3\x8c\x10\x80\xe2\x2c\x20\x21\xf3\x59\x95\xfa\x35\xce\xdd\x66\x57\x35\xce\x42\xc0\x22\xdc\xa1\x86\x66\xd9\x6e\x66\x79\x1b\xf9\xea\xa1\x16\x86\x1b\x19\x09\x2b\xdf\x91\xd5\x4e\xd5\x02\xb1\x2a\x9f\x94\xb8\x79\x24\x19\x71\x42\x61\x2e\xbd\x9e\x1c\xd7\x04\x5c\xd7\x6a\x73\xb2\xca\x7c\x48\x9a\xc2\x9a\xd2\x44\x26\xaf\xbf\xda\x58\x11\x70\x74\xda\x6d\x59\x35\x76\x96\x8e\xda\xb7\x3c\x86\x14\xc1\x0a\x48\xb3\xb2\x4f\xa9\x17\xa5\x53\x3c\xa1\xaa\x47\xf2\xec\xa0\x19\xc0\x02\xe6\x6f\x24\x01\x8b\x58\xb2\xa8\xa6\xf1\x26\xc7\xb9\x54\x18\x2e\xfd\x63\xbd\x78\x3e\xec\x7f\x3e\x39\xaf\x67\xff\x65\x69\x1a\x86\xbc\xd3\xa8\xc2\x30\xb6\x5d\x7e\x37\x37\xf3\x00\x65\x9e\x2a\xa6\xdc\xbb\x83\xdd\x73\x2b\x22\x1f\x0c\xdb\x63\x5c\x86\xb1\x57\xc6\x6d\xe7\xec\xae\x81\xb1\xc3\xba\xe2\x92\x2b\x91\xf8\xa8\xb3\xbc\x62\x4f\xef\xa3\xa2\x83\xe2\x52\x00\x26\x02\x87\xac\xc6\xf6\x16\xee\xbb\xe3\x21\x2a\x24\x21\xf4\x96\x39\xc3\x96\xfe\xe4\xd2\x95\x90\xd8\xb5\xc8\x45\x75\x84\xba\x19\xd6\x89\xb8\x52\x24\xb0\x4b\xa2\xc3\x6f\x6f\x6e\xa6\x3a\x2b\xf3\xaa\x47\xee\xf3\x3a\x04\xd4\x89\xb8\x29\xd5\x4c\x91\x64\xfe\x67\x33\x34\x8a\x89\xab\x95\x5e\x1a\xf0\xee\xda\xb6\x8a\xe5\x95\x0a\x46\x91\x08\x37\x8c\x87\x81\xdb\xaf\x57\xfb\x4f\xee\xd3\x40\x84\xbf\x78\x01\xef\x7e\x4e\xa5\x81\x10\xf8\x8a\x56\xa2\xd0\xe5\x29\xfb\x73\x32\x4b\xd2\x30\x0a\x71\xae\xfb\x57\x1b\x65\x33\x3e\xa6\xa1\x1f\x2b\xf1\xee\xf3\x84\x88\xd4\x8c\xf9\x40\xdb\x4b\x75\xee\xa2\xa4\x94\xa4\x09\x72\x7e\x7c\xfb\xc1\x9a\x84\x8f\x4f\x42\xa3\xc0\x9b\xb7\xd9\x62\x6a\x2f\x26\xa0\x52\x1a\x13\xe1\x2a\x39\x0b\x34\x59\x6f\xdf\xff\x76\xaf\x5c\x54\x93\x65\x20\xa5\x2a\xc4\xd5\xec\x0e\x9a\xef\xe7\x7d\xa6\x7e\xcd\x34\x7e\x53\x96\x70\x74\x87\x3d\x5c\x41\x54\x28\x96\xb6\xb2\x05\x8a\xdf\xba\x01\x56\x5d\xf4\x08\xcd\xa6\xc8\x9a\x4d\x71\xbe\x34\xd6\x17\xaf\x81\x0f\xed\xa3\xf9\x9f\x38\x65\x42\xc5\x56\x26\x18\x44\x35\x00\x54\xb8\xc3\x51\x9a\x62\xa1\x19\x5b\x4c\x59\x73\xed\x39\x1e\x2a\x8d\xa4\xc0\xb5\xac\x9d\x1d\xa5\x95\x86\xbf\xad\xe0\xdf\xdd\x61\x25\x52\xd7\x78\x7a\x16\x0d\xcc\x68\x8b\xb5\x63\x24\x12\x04\x6c\xaa\xbd\xec\xa4\xa0\x55\x1a\xc7\x1c\x11\xa6\x6f\x58\xb7\x9d\x5a\xa4\xa9\x34\x16\x94\x5b\x0e\xd8\x39\x2f\x27\xb0\xe3\x34\x36\x56\x71\x66\x60\xa4\x3e\xf4\x0e\x68\x07\x10\xde\x6b\x3b\xa0\x29\x4b\xfd\xd2\x27\x76\x69\x12\xd8\x92\xd8\x7d\x79\x74\x85\xe3\xe1\x5e\x99\x26\x81\x24\xd6\x40\xa0\xfc\x6d\x74\x3f\x49\x92\xa2\xd2\xc0\xae\x34\xcd\xa1\x73\xfc\x51\x69\xa2\x38\x36\x40\x5c\xd6\xbb\x2a\x8b\xba\xc9\x9a\xcb\x07\x01\x15\x95\x72\xc2\xf1\x0c\xeb\x1c\x71\x20\x83\x94\x22\xe5\x91\x46\xe0\x72\x01\x9f\x40\x32\xfd\x38\x01\xc8\x10\x5b\x2d\x76\xdf\xfe\xdb\x7f\x38\x0d\x94\xea\x76\xeb\x85\xb5\x90\xf8\x54\x0c\x42\xa5\xd2\x59\x36\x89\x5e\x32\x96\xfb\x43\x71\xa0\x7b\x62\x5d\x3b\xc7\xd7\xcd\xcb\xd4\x80\x7e\xfc\x7b\xc8\x24\x46\x19\x02\xfb\x91\x07\xf1\x3e\x12\x5c\x9e\xbf\x0b\x4f\x04\x72\xf5\xb9\xda\x36\xde\x88\xdf\x16\x52\x88\x02\xac\x74\x61\x11\xe7\xbe\x14\x23\x06\xa2\x4a\x41\x27\xf1\x80\xc7\x66\x1f\x18\x66\x80\x6e\x80\x09\x63\x8c\x86\x24\xa0\x45\x93\x17\x99\xf2\x47\x59\x04\xbe\xe0\x5b\xd7\x80\xe5\x3c\xab\xfd\xb4\x85\xea\xdb\xa5\xd0\xd5\x60\x6c\x6c\x1b\xc2\x06\x60\xeb\xd5\x12\x95\x08\x04\x45\x43\xc0\xbb\xbc\x94\x22\xdf\xe8\x32\x6f\x7f\xcb\x61\x94\x2b\x42\x46\x10\x43\xe4\x1e\xde\x24\xc5\x9e\x7d\x94\x22\x8c\x28\x7a\xec\x88\xac\xba\xa9\xca\x33\xee\xf4\x87\xee\x84\x31\x57\x66\xa0\xf8\xfa\xdb\xac\x70\xcd\x9c\x2e\x95\x12\x21\x07\x89\xc9\x0b\xfc\x0b\x54\x33\x47\xfd\x1f\x8c\x55\x56\x6c\x2c\xab\xb1\x2b\xd9\x66\x44\xf7\x50\x1c\x9b\x97\xd1\x6b\x22\x42\x23\xb0\xc4\x27\xb4\x9e\x93\x9f\x54\x82\x8a\x30\x74\xaf\xe1\x4f\xc8\x70\x0d\x7c\xc8\x54\x55\xfe\x0e\x57\xff\x2a\x0a\x0a\xa9\xec\xb7\xff\xf6\xda\xfc\x5c\x1b\x9f\x8b\x05\x56\x45\xfc\x19\x96\x65\x55\xac\x0b\xa8\x8e\xd7\xbf\x25\x40\xae\x04\xa3\xc6\xba\x02\xf9\xe5\xa2\xb8\x7e\xa2\x25\xa2\x44\x14\x98\x28\x75\x5a\x22\xf5\x68\x51\x11\x51\x14\xa1\xd4\xda\x22\xcf\x57\xe2\xdc\xa8\x17\xe1\x8f\xc4\x54\xa0\x80\xe4\xc0\x83\x77\xd7\x94\xe7\xf3\x20\x49\x17\x31\x93\x18\x2f\xcb\x4b\xde\x29\x9f\x7d\x7a\x15\xb1\xb4\xb2\x0b\x8b\x73\x59\x79\x9f\xdc\xbf\xbe\xcf\x58\x27\xb8\x85\x36\x19\x54\xc3\x58\x5d\xc4\x46\x19\x35\x98\x37\x3f\x36\xdb\xaf\x23\x5e\x91\x18\xa9\x87\xbe\x3d\x5e\xf0\xf8\x27\xc0\xaf\xfd\x9b\x47\x5b\x08\x4e\x24\xce\x56\x54\xab\xbb\x2f\xcb\xee\x59\x71\x69\xad\xbc\xfd\x37\xa2\xe0\x4c\x56\x1c\xf7\x2f\x55\xa7\x52\xfc\x75\x7d\x5a\x70\x15\x3a\x65\x94\x4d\xf1\x20\xb2\xa2\x11\x59\x31\x28\xdb\x88\x94\x40\x60\xf9\x4b\xfa\xa2\x6c\x97\x74\x5a\xa3\x18\x9f\x30\xe5\x69\xea\x02\xc7\xb1\xf3\xf9\x74\x9c\x24\xa8\xac\xd6\xe5\xf1\x65\x35\xd4\xfb\x54\x42\x84\x02\x0b\x5f\x87\x5e\x94\xd4\x92\x4c\xf6\xb6\x92\x3e\x99\xb9\x22\x31\x74\xc8\xaa\xdf\x15\xe5\x9b\xc9\xc5\x2f\x0f\xa4\x68\xa3\xdd\x1f\x99\x98\xae\x0b\x13\x71\xbd\xa9\x7e\xb2\x12\x3a\x24\x58\x6b\x41\xf1\xf4\xfa\xd0\xce\xd8\xc3\xb9\xca\xa6\x3c\x31\xa1\x29\xa3\xbc\xdf\xa8\x6f\xd1\xac\xbc\xcd\xe7\xc2\xc9\x85\x6a\x46\xb4\x17\x72\xf9\xd9\x7b\x27\x28\x01\x91\x41\x88\x5a\x5e\x8a\xe2\x19\xce\xf6\x66\x1f\xcb\x26\x33\x99\xfa\x68\x9c\xad\x04\x80\x9d\x3d\xbb\xfd\xe2\x6e\x7d\xb8\x7d\xfa\xfe\x7c\xd8\x6f\x1e\xd6\x87\x75\x07\x0b\x14\x26\x26\x58\x0f\x5f\x3d\xdd\x3f\x3d\x1f\x7e\x7e\xdb\x78\x5d\x5f\x25\x03\x95\x78\x61\x26\x04\x44\xd7\x4f\xc6\xb9\x63\x7d\x96\xcf\xf7\x41\x9a\x0c\x03\xd0\xce\x83\xa2\xd3\xde\xdb\x8a\xba\x86\x49\x65\x4f\x32\x66\xb8\xee\x52\x46\x93\x1d\xd1\x1b\x1b\x8b\xad\xe3\x81\x11\x25\x98\x38\xd7\xa5\xfa\x29\x2a\x30\xa2\xc2\x9e\x81\xbf\xda\x88\xc5\xd1\xd0\x27\xb7\x0d\x65\x46\x62\x6e\x5f\x49\x75\x28\x19\x09\x2b\x61\x75\xb7\xfb\xfe\x00\xba\x8b\x7f\x64\x04\x06\x85\xc1\x50\x6b\xf5\x47\xd9\x80\x35\xcb\xc7\x9e\xee\xc6\x4c\x25\x13\x67\xe9\x99\x32\x32\xa1\x8a\xfd\x16\x5a\x7b\x83\x10\x25\x63\x69\x10\xa8\x73\xfb\xc7\xfe\xa3\x1a\xad\x92\xb1\xb6\x2e\x67\x5e\x82\xb2\xcf\x26\x26\xe3\x0c\x43\x26\xc1\x2b\x5e\xdd\xcc\xfa\x2f\x93\xd0\xca\xaa\xdb\x30\xcc\xe1\x47\x46\x0c\x56\x99\xa4\x11\x8d\x7b\x7c\xcb\xc0\x7f\xd7\x0f\xd0\x02\xe5\x3d\x85\x2c\x2b\xeb\xb6\x39\xfd\x12\xad\x11\xfe\x72\x2e\xcf\x56\x2d\x62\x72\x99\x9c\x49\xdf\x45\xdd\xa8\xb2\x0f\xda\x24\x8f\x28\x4a\xe3\x1f\xda\xf4\x7a\x4e\xef\x0f\x87\x20\xd0\xd8\xe2\x1e\x76\x50\xe8\x4f\xe4\x02\x94\xe4\xdc\x6e\x86\x8b\xe5\x7a\x18\x04\xc8\x94\x1a\x4b\xda\x71\xf4\x81\x51\x18\x23\x45\xbb\x3d\x75\xeb\xec\x1d\x14\x13\xe5\x1c\x3f\x2c\xb2\x51\xbc\x55\x2c\xc7\x5e\x50\xdf\x83\xf1\x63\xe2\x44\x81\x4b\x4f\xec\x4d\xec\x4b\x47\x83\xb9\x2d\xab\x91\x6e\xe7\x90\xa5\x34\x99\x42\xfe\x64\x52\x61\x10\x68\xdd\x4a\x06\x59\x90\x14\x8a\x6a\x32\x12\x64\x76\x40\x86\xa9\x86\xfb\xf8\x57\x92\x4c\xa0\xce\xc9\xb0\x63\xde\x2e\x7c\x5d\xe8\xbe\x2e\x6c\x09\xfd\xc3\x6a\x22\x65\x62\x4b\x3f\x35\x34\x4b\xb4\xfc\x58\x1c\x2b\x80\xaf\x64\x0b\x86\xbb\xa2\x94\xd2\x5a\x77\xdf\x3c\xed\xfe\x7b\xf4\xcb\xa8\xc0\x92\xa7\xdf\x20\xab\xb7\x50\x2d\xb3\xe3\xf8\x30\x4b\xb1\xbd\x86\x5d\x63\xdb\x63\x7e\x10\xc5\x45\xe4\xf9\x24\x1d\x91\x8a\x13\xa5\x3b\xd6\xae\xfa\xb5\xbc\x2e\xaa\x66\x68\x93\x33\xbe\x1f\x4d\x64\x32\x22\x88\x2f\xaf\xf7\x70\x14\xea\x13\xf4\x83\x84\x80\xe0\x7b\xe6\x00\xd0\x97\xe6\xa5\xac\x6e\x2a\xf1\x96\x15\xc7\xfa\x43\x27\x6f\xbc\x7b\xf8\x33\x44\x16\xc3\x77\xba\xae\x8b\x26\x6b\xae\xbb\xa6\xba\xa8\x89\x73\xa6\x92\x00\xdc\xba\xf8\x97\xc7\x72\x42\x2d\x92\x86\x6a\xe6\xeb\xe3\x08\x64\xa9\x9f\xcc\x36\x9b\x54\xab\xb9\x1f\x1c\xdb\xee\xfc\x8b\xa8\x6f\x1e\x77\x1e\x10\x3c\xbf\x46\x19\x1e\x5b\x1f\xb1\xa2\x81\xea\x55\xe4\x3b\x50\xdd\xda\x60\x84\x95\x12\x1a\x9b\x09\xdd\x40\x2e\xae\x5d\x74\x2e\x8d\x34\xa8\x73\xff\xbc\x5e\x6c\xd7\xcf\x87\xcd\xe3\xfe\x79\xbd\xdd\xdc\x1c\x1e\x16\xff\x7d\x58\x2d\x9e\xef\x3c\x49\x56\x05\x91\x48\xc2\x51\x1b\xbf\x7f\x0f\x55\x90\x82\x50\x43\x00\xdc\xb6\x43\xe5\xab\x40\x70\x6e\x4d\xdc\xde\xed\x22\xec\xeb\x23\xfe\x38\x00\x6a\x7b\x9f\x4a\x9d\x99\xeb\x5f\xd1\xd6\x15\x21\x11\x19\x6e\xc7\x65\x35\xa2\xfd\x8c\x27\x8b\x22\xa4\x43\xac\xee\x44\x0e\xeb\x2e\x0a\x51\x44\x58\xca\xd3\xe1\x5c\x81\x73\x13\x85\x69\x60\x39\x1f\xdd\x29\x22\x23\xaf\x5e\xb6\x2d\xf3\x4c\x5d\x3f\xd3\x93\x9a\x05\x7a\x28\xa2\x02\xd3\x59\x61\x34\x22\xbf\x2d\x3f\x68\xe3\xb8\x91\x54\xc4\x08\xc0\x5a\x59\xe2\xde\x7f\x5d\xca\x89\xde\x83\x52\x2c\xb2\xbc\x08\x6f\xfe\x8e\xd7\xfb\x5f\x17\x98\x6e\x4b\x8a\x25\x69\x18\x0c\x10\x1a\xff\x75\x81\xea\xba\xd1\xf5\xbe\x5c\x42\xb3\x29\x34\x3a\x64\x8e\x26\x97\x8a\x28\xf7\x14\xe3\xf6\xe1\x79\xbc\x84\x05\xfd\x62\xdf\xe0\x61\xda\x2c\x52\x71\x90\x44\x2e\x4a\x7c\x3a\xbb\x9e\xde\xec\x7b\xa9\xe2\xc0\x0a\x32\x75\xd8\xf7\x9e\xcd\xad\x62\xc2\x30\x44\x5c\x3f\xed\xda\x90\xb0\xfb\xd1\xe2\x88\x2a\x3e\x5c\x3d\x7d\x9f\xa1\x3e\x4c\x9e\x4b\xcc\x09\xb8\x87\xbc\xbd\xc8\xdf\xe1\xda\x17\x3b\xc9\xa8\xd8\xa9\x12\x96\x28\x67\x74\x9d\xd5\xed\x46\xfb\x74\x6e\xa3\x75\x5b\x4a\xed\x66\x69\xc2\x53\x4e\xbd\x8e\x32\xbc\x66\xe5\xa5\xbe\xb9\x14\x47\x28\xcb\x62\x33\x12\xfd\x52\x2a\x11\x9c\xfb\x46\x42\x0f\xcd\xb8\x58\x04\xf4\xa7\xba\x4d\x4a\x71\x62\x9d\x8a\xec\x12\x3f\xb9\x1f\x9e\x50\xc2\x3d\xd1\xcb\xd7\x7b\x1e\xb2\x5a\x7d\x55\xeb\x50\x9c\x47\xd8\xa9\xb6\xc2\xb6\xd1\xe4\x9c\xa9\x61\xc8\x97\x41\xac\x77\x7b\x1a\xdf\x1d\xed\x42\xd7\x36\xc0\xa2\xd4\xc2\x49\xb1\x3f\xd5\x66\xf0\xa3\x8b\x96\x69\x80\x4d\x64\x61\x79\x0e\xbb\x0b\x12\x4c\x06\x9a\xeb\x4a\x49\x1d\xa0\x73\xc0\xc3\xe6\xf1\x70\xb3\xde\x2e\x9e\xf7\xdf\x9f\x51\xe9\xab\x1b\x00\x9c\xbb\x79\x76\x5f\x16\x47\xcc\x45\xba\x63\x26\xc4\x52\xbb\x0b\x70\xdc\x04\xb7\x51\xc0\xd0\x78\x56\x29\xc5\x94\x87\x8a\x3b\x59\x16\x5b\x36\x9b\x2a\xe6\x28\xa5\x22\x6d\x69\xe1\x65\x3e\x09\x6b\x95\x92\x09\x36\x21\x2f\x85\x57\xfb\x06\x3d\x92\xa7\x0d\x09\x9f\x4d\xbc\xbc\x48\xba\x52\x3a\x00\xac\x67\xdf\xe6\xd9\xf9\x9c\x35\x53\xa9\xae\xcb\x8c\x3f\xa6\xfb\x24\x30\x6b\x44\x2d\xb4\x7e\x84\x37\x8f\xca\xf9\x0b\x95\xf0\xf1\x4f\x0a\x90\xca\xb8\xef\x9b\x4f\xee\x0e\xc0\x02\x1f\x6a\x24\x0a\xba\x59\x3b\x79\x2d\xc1\x24\x98\x16\x89\x57\xa8\xc4\x11\x76\x65\xae\x07\x5e\x3d\x4a\x99\x20\x52\x56\x9c\x16\x2f\xcf\xe6\xb6\x17\x94\xbe\x9b\x9f\x83\x86\x0b\xa4\x15\x0f\x55\x9b\xbe\xb6\x80\x51\x3a\x88\x05\x66\x05\x59\x83\x7e\x40\x8f\x30\x71\xf6\x56\x3a\xe0\x7a\xe4\x92\xf4\xb9\x20\x9a\xd2\x61\x98\x22\xbf\xe0\x11\xde\x6c\x08\x32\x0d\x57\x27\xdf\x1e\x72\x6b\x72\x7d\xcc\x4e\x27\xc0\x75\xce\x4f\x32\x4d\xc2\x44\x26\xbe\xdc\x02\x6d\xce\xd3\x46\x20\xfb\xb2\x3b\x9e\x50\xa4\xee\x36\x48\x8c\xec\x1f\x9b\x26\x3c\xb0\x3a\xdc\xe5\x79\x28\x45\xdb\x1e\x10\x58\xeb\x3e\xfc\xfb\x02\x97\x4f\x38\xe7\x9a\x48\x8a\x77\xf0\x0c\x7a\x99\x5f\x46\x6d\x75\x4d\x63\x83\x97\xf4\x90\x15\x7f\xa1\x95\xa3\x69\xe2\x04\x7f\xdb\xbd\xb3\xd0\xe5\x09\xfd\xa7\xa6\x24\x73\xcd\x42\x82\x42\x81\x3e\x27\x1b\x63\xe2\x35\x63\x11\x52\x88\x91\xa8\xe0\x2a\x87\x28\x9b\x39\xe4\x94\xe9\x88\x10\xa4\x59\x5b\xff\xd2\x8f\x54\xc9\x2e\x24\xd6\x91\x30\xa9\x55\x83\x2e\xdf\xf4\xed\xa5\xd0\xae\x13\x3e\xbe\xa8\x48\x27\x88\xc0\xb8\xb5\xa5\x74\xff\x52\x7e\x52\x1f\xd5\x49\x9c\x5a\x47\x93\x57\x28\x9a\x95\xa8\xf4\xb3\xab\xad\xfa\xbb\xe0\x11\xc7\xb2\xc2\x29\x2b\x9a\xcd\xea\xe9\xef\xb0\xf8\x35\xe7\x12\xaf\xc1\xb9\x1f\x67\x7f\xc2\x5c\xf3\x5a\xa7\x69\xa4\xc5\x60\x6e\xfa\x37\x79\x2e\x9e\xd1\xa9\xa2\x08\x29\xee\xcc\x51\xd6\x85\xae\x3b\xd4\xbd\x16\x52\x22\xf3\xae\x8d\xc7\xb6\xcf\xeb\x87\xcd\x77\xbf\x6c\x6a\xc9\x38\x7e\xd2\x97\x19\xaf\x13\x5c\xab\x56\xb1\xc0\x44\xf5\x41\x54\x55\xd6\x73\x5e\xb4\x4a\x23\xe4\xb3\x1e\xb2\xda\xea\x71\x82\x7e\xaa\x46\x66\xdb\x93\xfb\x56\xa9\x8a\xa9\x23\x3f\xd5\x59\x3d\x4c\x30\xb5\x92\x16\xbd\xd7\x74\xd8\xc7\x6a\xd2\x87\xd5\x9a\x06\xde\x69\xe8\xa3\xb8\xa9\x0f\x69\x3b\x91\xd3\xf1\xe3\xd1\x54\x32\xc7\x7f\x44\x25\xcc\xdb\xb2\x9a\x4a\x53\x29\xad\x85\xf5\x12\xad\xc0\x52\x0c\xfd\xb5\x19\x15\x63\x91\xd9\xd6\x9f\xac\x2f\xb0\x3d\x04\x41\x40\xb1\x44\xb8\xbf\x34\x65\x95\x89\x7c\x26\x93\x87\x20\xd4\xbc\x2b\x00\x2c\xc7\x3c\xa7\x36\xab\xc0\x9d\xb1\x7c\x85\x4a\x57\xc2\x34\xab\x3c\x33\xa6\x3b\x1a\x51\x31\x40\xcf\x2d\x0a\x6d\x9d\x5b\x47\x7d\x64\x08\xc0\x2a\x81\xb7\x37\x67\xd5\x08\x67\x9f\x3f\x84\xa1\xb2\xce\xf1\x2f\x59\xae\x2b\x28\xc6\xcb\x3a\x84\x2c\xd5\x4e\x7a\x7a\x25\x0a\x7d\xbd\x17\x85\x45\x30\x8f\x6f\x27\x64\x06\x0b\xb0\xb7\x4f\x0f\x4f\x83\xc6\x09\x84\x5c\xc7\x72\x54\xd8\x1b\xe4\xce\x10\x72\x50\x6e\x53\xda\xb8\x24\xe3\x73\xa1\xd9\xf1\x65\xa5\x09\x36\xc0\xee\x00\x21\xe1\xbb\xe6\x62\x0c\x1a\x67\x4c\xa9\x99\x7e\x3c\x50\x2c\x9b\xef\x41\x9c\x16\x85\x5e\x7c\xd0\x4d\xf8\xe4\xe9\xd0\x20\x35\x2e\x7c\x40\x49\xed\xbf\x92\xa2\x53\x40\x13\x86\x0d\x56\x5c\xdb\x9f\xf2\xeb\xe9\x9c\x75\x69\x13\x30\x93\x12\xb7\xc4\x5b\xc7\xc4\xc9\xd6\x03\x51\x28\x11\x91\xec\x97\x20\x27\xb2\xbd\x6e\x3e\xe9\x5b\x43\x14\x2b\x5c\x76\xa1\x79\x99\x88\xcf\x29\x88\x43\xeb\x3e\xbf\xe9\x96\x14\xbd\xcf\x3e\xf2\x63\xfd\x68\x1a\x60\xee\xeb\x24\x91\xdb\x94\xb6\xb6\xa2\x78\xcb\x6b\x14\x04\x41\x77\xd6\x34\x26\x8e\x35\xe1\xeb\x0b\x5d\xf7\x0e\x62\x61\xf5\xc7\xe1\x84\x62\x61\x28\x32\x25\xc6\x1d\x40\x88\x45\xc2\xc0\x7d\x11\x54\x8f\x65\xf1\x0c\x80\x9b\x9d\x5f\x98\x20\x09\x28\x8a\xd4\x63\x0f\xd0\x05\x48\xf3\xb7\x9f\x84\xc6\x83\xc3\x9e\xe1\x98\x95\x85\xbf\xa4\x6d\xf6\x0e\xf9\x4c\x6b\x17\x92\x88\x24\x9d\x33\x2f\x3a\x52\x41\x9e\x0f\xaa\x28\x90\xa6\x11\x6e\x19\x3f\xe0\xd8\x11\x71\x40\x24\x02\x85\x7b\x9c\xa5\xc2\x4b\x76\xf6\x2d\xa3\xf1\x43\x14\x32\x41\xdb\xcc\x02\xde\x36\x7a\x2f\x8a\x5f\xdd\x09\x24\xc7\xca\xf5\xc9\xd1\x3a\xde\x0f\x42\x7f\xf8\x30\x58\xb9\xb9\x2d\x26\xd3\x5b\x71\x7d\x98\x37\xb7\x54\x20\x83\x30\xb1\xac\x82\x3e\x77\xef\xef\x40\x8a\x00\x83\xfd\xfb\xf2\xe8\x94\x96\x26\xcf\x40\x25\x54\xf6\x96\xf5\xed\x1e\x6a\xe5\x9d\x66\xd5\x56\x15\x28\xa1\x62\xdd\x37\xf4\x86\x6e\xb6\x0a\x74\x20\x70\xbe\xef\xac\x8b\xe5\xdc\xa6\x05\x9a\x25\xd4\xee\x26\x4e\x3c\xbe\xfb\xb0\xb1\x53\xe1\x08\xcd\xe1\x2c\xaa\xe6\x1a\xf6\x47\x54\x60\x55\x2d\xaa\x42\xe8\xd2\x8a\x62\x0f\x8e\xa1\x7b\x89\x6a\x10\xd2\xdf\x9b\x1f\x0f\x1e\x02\xf0\x50\xc9\xe1\x06\x35\x7d\x6d\xe7\x2e\xd4\x04\x0a\x95\xbe\x2e\xb5\xde\x62\x73\xb5\xdf\xd4\xc1\x04\x06\x71\xb3\x9e\x9f\x53\x7e\x86\xd4\x04\x43\x08\xbe\x04\x7f\x88\x3f\x87\xd1\x14\x98\xc8\x02\xb0\x0b\x38\x3a\x41\xf9\x67\x4c\x33\xbb\xa5\xdd\x04\x41\x12\x7a\xa5\x58\x2c\x29\xdd\x82\xab\xc7\x01\xfc\xcc\x0a\x5d\xbe\x0d\xf7\x09\x13\xb0\x48\x3b\x15\xb5\x5d\x69\x9a\x37\x51\xc1\x1a\x0d\x8f\x54\x59\x7d\x10\x06\x9c\x8f\x3b\x4c\x20\x8c\xea\x5d\x5e\x26\xb4\xdf\x41\xd0\x65\xc2\x30\xf4\x2b\x4d\xcf\xc0\x30\x21\x89\x90\x39\x7a\x0f\xba\xef\x4a\x98\x90\x24\xe8\xd3\x7a\x2a\x35\x8c\xec\xd6\x94\x09\x13\x6e\xdd\xdb\x9f\x7e\xae\x9f\x9f\x6e\xf7\xdf\x9e\xd7\xbe\xbd\x60\x48\x10\x06\xd0\xd3\x54\xc6\x17\x4a\x42\x83\x71\xfb\xea\xf6\x71\x68\xea\xa5\x0c\x51\x04\x05\x50\x6e\xe0\xbd\xd7\xf2\x33\x04\x08\x96\x49\xef\xac\x01\x45\xe5\x17\x17\x43\x89\x06\xda\xd5\xcb\x06\x1c\xbd\xba\x1b\x41\x03\x2c\x67\x78\xa9\x12\x8b\xca\x1d\x5f\x0d\x4d\xa8\xc7\x7f\xdd\x96\x55\x73\x29\xc6\x61\x83\x69\xb7\x81\x76\x26\x2d\xec\x7e\x38\xdc\x32\xc7\xeb\xae\x61\x94\x31\xbb\xb4\x1c\x45\x5e\xbe\xfc\xd6\xfd\x3b\xc5\xa2\xf5\x01\xbd\xc2\xb6\x65\x99\x4f\x5e\x4b\xc3\x04\x49\x9d\x60\xea\xb7\xf2\x52\xc3\x5a\x77\xd1\x89\x69\x17\xec\xb4\x8f\xaa\x70\x32\xf5\xb4\x18\x13\x11\x83\x8f\x4c\x5e\xae\xcb\x4b\xfe\x6b\x5b\xc1\x29\xbb\x9c\xda\x67\xfe\x11\xcb\x33\xfe\xd2\x48\xda\x8e\xfb\x29\xcb\x73\xb4\x28\xe9\x40\x29\x26\x0e\xad\xed\xf5\x41\x89\xe2\x53\xb9\xbb\xcf\xf0\x9f\x1f\x7a\x68\x26\x66\x89\x4f\x28\x2c\xf6\x73\xd7\xae\xba\x1f\x35\xb9\x4c\x12\x2b\x9c\xc1\xcd\x4b\x56\xe9\x9b\xac\xc6\xba\xfa\x30\x41\x32\x09\x0f\x93\x4e\xb5\x0c\xf4\x98\x78\x67\x78\x48\xd0\xc6\xaa\xcd\x06\x11\x1d\xb9\x83\x2e\x21\x31\x5c\x06\x08\xef\x5e\xe6\xd9\x79\x46\xf3\xdf\x8f\xd2\x0a\xd9\xa9\x1d\xa3\xe9\xa9\x9a\x44\x48\x26\x0d\x03\x62\xfd\x88\x1d\x04\xe4\xdc\xd7\xa4\x4c\x4a\xa3\xd4\xe1\xf5\xb7\x22\xd3\xe8\xe8\x34\xfa\x82\x34\x52\x96\x83\xd9\x4e\xc5\x17\xac\x4d\x6c\xea\xd1\x5b\x90\xc6\x11\xfe\xe2\xb5\x30\xd0\x63\x76\x16\xb9\x6f\x5b\x19\xc9\x2c\x89\xb1\xb2\x22\x1b\xa5\xc9\x3e\xa9\x82\x1b\xc5\x34\x9a\xcd\x79\x36\xe8\xcd\xf7\xe7\x81\x05\xbf\x32\x3a\x12\x28\x61\x71\x6e\x5f\x8e\xa7\x62\xa4\xce\x62\xb4\x56\x46\x0e\xe5\x35\xb1\x84\xda\xd9\x07\x8f\xbf\x09\x28\xa0\x7a\x87\x06\x99\x35\x13\xc5\xb5\xc9\x45\x01\xb3\x2e\x50\x16\x8c\xf0\x9a\x69\xa8\xda\xc9\xf7\x2d\x6b\x93\xed\xeb\x6c\xd8\xe8\x57\x2e\x88\xac\x12\xc6\x72\x71\x3b\xd2\xdc\x30\x10\xa5\xc2\x72\xeb\x4f\x58\xf1\x1b\x3c\xb7\xd3\xe8\x52\xc6\x3f\x25\xc4\x04\xdf\x01\x9f\x96\x3c\x97\x39\xfc\x36\xc7\x9b\x33\x20\x62\x04\x78\x23\x03\xb5\xde\x42\x75\x23\xba\x85\xb0\xdd\x26\x9c\x0e\xe9\xee\x2c\x8a\x5f\xdb\x32\x2b\x3e\x53\x4f\x32\x26\xd2\x49\x34\x60\xa0\xba\xc0\x75\x5a\x7e\x32\x26\x16\x08\x30\x5d\xe4\xcd\x4c\xd6\x61\x4c\x62\x7f\x39\xdb\xaf\x70\xc5\xfb\x76\x85\x74\x2f\x83\x0e\x02\x1a\xe0\xab\xd2\x74\x7a\xc3\xc3\xc0\x5b\x07\xa1\xe3\xcc\x6e\x4b\x3f\x7b\x75\xe0\x0b\x17\x48\xa0\xb2\xd5\x5c\x27\x62\xe4\x07\x50\x16\xf4\x5e\x20\x18\xea\x9f\x40\x67\xa2\x1a\xb7\x6b\x74\x40\x98\xe5\x19\xe2\xe4\x79\xcf\x4e\x97\xd3\xb2\x5d\xdc\x4e\xfd\x99\x04\xc7\xd9\x85\x8c\xa9\x5b\xf1\x0b\x3e\x02\x43\x75\xc0\x12\x6b\x25\x78\x2a\x8b\x36\xc2\xdc\xe8\x7d\xf9\x98\xa9\x5f\x85\x98\xf8\xd5\xeb\x36\x93\x32\xf1\xc0\xdd\xb3\x9e\x5c\x4f\x14\x1b\x8c\x7c\x54\x59\xe6\x37\xe5\x5b\xe1\x2f\x23\x4a\x38\x56\x88\x90\x34\x7d\xff\xb4\xfa\x1d\x9b\xe8\xdd\x51\x61\x01\x74\xff\x79\xa9\x9b\x4c\xd9\x4b\xfc\x41\xfc\xd1\x38\xb0\x73\x42\xd8\x65\x60\x30\x21\x75\x10\x53\x6a\x63\x0c\xd4\xcd\x05\xed\x21\xe5\xab\xb2\x2a\xa0\x42\x7c\xa0\xad\x2f\xf5\x6e\xf3\x3a\x48\x24\xc1\x68\x19\x5d\xd6\x7c\xc0\xcb\xdd\x41\x0e\x16\x4d\x86\xcf\xdb\xc6\xe1\x43\xd3\x6f\x37\x4a\xb8\x46\xfa\x29\x2b\xc6\x33\xbf\x3b\x9e\xa2\xec\xa2\xd0\xfa\x13\x59\x72\x3f\x30\xd2\x08\x65\x6a\x07\x42\xe5\xc9\x98\x93\x93\xe9\x90\x59\x37\xe1\xed\xe1\xfb\xee\xc6\xdf\x86\x24\x02\x77\xcc\xc7\xef\x0f\x87\xfd\xe6\xde\x73\x12\x75\xa0\x28\x47\x9d\x1a\xbc\xfa\x34\x9d\x4d\x5f\x74\xa0\x22\xcb\x39\xaf\x40\xc3\x09\x7b\x3c\x16\xb6\x36\xf9\x72\x15\xa7\xd8\xb8\x5a\xb7\x93\x70\xf7\x26\xce\x1f\x56\x8e\x36\x86\x9c\x9e\x5b\xa8\xd4\x57\xdd\xad\x2a\x9c\x0d\xc3\x3e\x2d\x3c\xe9\x40\x87\x36\x92\x3c\x57\xa5\x82\xba\xfe\xab\xee\xcf\x60\xe7\xd3\x81\xa6\xd6\xa8\xb7\xdb\xf9\x16\x53\x31\x20\x1d\x68\x1e\x08\x2f\x43\x60\xeb\x6d\xc3\x46\x81\x0e\x34\x58\xe3\xa6\x23\x34\x3f\xcb\xea\x17\x54\x73\x42\xc5\x3a\x00\x6e\x8b\xa1\x0f\xff\x58\x3b\xbc\xa2\x0e\x49\x9c\x60\x86\xe4\x85\xad\xbb\xf0\x7a\xfa\x30\x43\x92\x84\x18\x4a\x39\x9d\x1d\xd7\x67\x9e\x0e\x4a\x19\x56\x3a\x4e\xe2\xdd\xa9\x05\x20\x31\x0f\xfc\xce\xd4\x8e\xb0\x12\x04\x08\x90\xec\xba\x7b\x3a\x24\x32\x4e\xad\x7f\xbe\x14\xc5\x07\x44\xbf\x0e\x89\xb1\x1d\x7a\x70\xa2\x77\x95\xff\x20\x0d\xac\xe9\x0e\x76\x2e\x51\x4a\x3f\x9b\x5e\x3a\x0d\x00\x2d\xfe\x0e\xca\x66\x48\xb7\xf0\x35\x7f\x4a\x87\x94\x59\xdb\x12\xd7\xeb\xb5\x63\xfa\xbe\xd6\x07\xd3\x56\x1d\xd2\x28\x48\x6c\xde\x84\x09\xdd\xed\xd4\xac\x43\x87\x94\x5b\x61\x23\xc7\x65\x6d\x63\xb4\xf9\x17\x2b\xa4\x22\xc2\xba\xf1\xb6\x82\xb3\xc8\x5c\x43\xdf\x81\x92\x91\xd1\xf5\x29\x02\x67\x72\x1e\x15\x21\x66\x43\xfe\xc8\x34\x94\xbd\x84\xa9\x0e\x69\x7b\x8b\x18\xf5\xca\x3c\x53\xbe\x32\x52\x0c\x3b\xef\x3a\x64\x01\x43\xfe\xae\xf5\xfd\x46\x8b\x9f\xcd\xf2\xfb\xfe\xe9\x79\x4e\x3a\x42\x87\x4c\x59\xc1\x59\xac\xd3\xa2\x28\xd2\x33\xd4\xe5\xa5\x52\xdd\x86\x13\x32\xa0\x48\xe1\xf6\x22\x0c\xab\x97\x32\x1b\x1c\x8e\x62\x86\x1c\x7d\x9c\x1b\x0f\xeb\xc5\x83\x5b\x52\x66\xf7\xfb\xc9\xbd\x46\x3a\x41\x54\xd9\x01\xac\xa7\x9a\x1b\x3a\x1a\x13\xd3\x18\x4b\x50\x65\x81\x06\x74\x5f\xd5\x68\x75\x18\x6b\xcd\x9c\x08\xdc\xe9\x52\x64\xcd\xf5\x3b\x2e\xc6\x3e\x5a\xd4\x61\x02\xd6\x30\xe0\xfe\xfb\x8f\xcd\xe8\xb9\x25\x26\x41\x98\x5f\xdd\x08\xff\x2f\x4e\xa4\x51\x9e\x68\x94\xd5\xa5\x46\xf9\x96\xc1\xbb\xfc\xf9\x8f\x98\x26\x11\x4e\x9b\xa3\x38\xc1\xa0\x57\xae\xc3\x34\xb5\xb6\x6e\x3f\xd7\x9b\xc3\x6a\xb1\xed\xfe\xad\x34\x56\xb1\x6e\xba\x3d\x2a\x14\x01\xc7\x56\xcb\xc3\xe6\x71\x68\x8c\xa3\x43\x91\x5a\xf4\xee\x9e\xaf\xe6\xde\x66\x99\x52\x64\xbf\xbb\x50\xda\xaf\x6b\x43\x01\x30\x1d\x4a\x45\xac\x37\xc1\xfb\x19\xaa\x66\x22\xf5\xa4\x43\xa9\x43\x84\xfb\x9f\xad\xef\x39\x39\xe4\x17\xf5\xeb\x2a\x2f\x57\x84\x68\xf4\xaf\xb1\x34\x80\x51\xf1\x12\x0a\x30\x19\xc6\x29\xa3\x87\xaa\x98\xb5\xbf\x5d\xef\xbf\x7d\xdf\xdd\x6c\x9f\x37\xab\xee\xf6\x54\x64\xf0\x75\x59\xeb\xac\x79\x28\x75\xb7\xa4\x80\x4e\x50\x85\xf2\x24\xde\xef\x2e\x02\xdd\xa5\x40\x0f\xe2\x57\x1d\x1a\xae\x10\xfd\x56\x76\x70\x41\x27\x0f\xae\x43\x93\xda\x06\xde\xbd\xa8\x1d\xd6\x67\x9c\x28\x4f\x7e\x25\x63\x42\xee\x74\x3c\xdd\xa6\xe9\x9b\x1d\xfd\x3e\x41\x82\x44\x63\x2f\x21\xb3\x76\xfe\x93\x80\x88\x04\xce\xb4\xa7\x86\xe6\x5e\x54\xa8\xdd\xd4\x2d\xc7\x1d\xcf\x6c\x10\x36\x7e\xc0\x93\x6b\x12\x68\x86\xdd\xa1\xe5\x7a\x7f\xd8\xff\x63\xbb\xfe\xb6\xd8\x7d\x73\x37\x4b\x42\x41\x1c\x76\xa4\xc0\x66\x58\xbb\x65\x6e\xfc\xef\x44\x88\x4c\x95\x9d\x36\xbb\xb1\xb8\x8a\x26\x44\x87\xd8\x8b\x6a\xa7\x7f\x0f\x67\xd5\x84\x06\xa1\x52\x9d\x3d\xee\xec\x9e\x43\x28\x57\xdc\x65\xf9\x0e\x1c\x31\x09\x63\x35\xa1\x42\x20\x97\xcf\x94\x15\x64\xc7\x62\x79\xf9\x40\xa8\x1a\x3f\x6b\xc2\x88\x94\x36\x40\xf9\xd7\xa5\x6e\x06\x2e\xef\xc8\xdd\x3f\xdb\xd0\xda\x8d\x8d\x68\x8c\x81\x86\x05\x76\xd9\x3a\xde\xa2\x69\xda\xa8\xe1\x63\x7a\xa9\x49\xa4\x54\x3a\x84\x28\x7f\x21\x0e\xa1\x49\xcc\x35\x32\x23\xcf\xe2\xba\x39\x59\x25\x81\xa5\x28\x7e\xdd\x96\xd5\x5d\x59\x6a\xdf\xcb\x72\x83\x13\x11\x21\x97\xab\xda\xac\x9e\x66\x53\x0d\x4d\xb8\x12\x81\x73\x91\xf0\x82\x30\xfe\xa7\xf8\x08\x30\xfa\x04\x70\xd4\x33\xf4\xdd\x49\x53\x4e\x62\x4b\x59\x1e\x6c\xed\xce\xa0\x77\x72\xf3\x22\x8c\xb1\xcc\x71\xba\x22\xc5\x6a\x50\x7d\xd2\x44\xd0\x00\xe9\x8f\x5e\x00\xd6\x79\xeb\x80\xc6\xd2\x77\x37\x2a\x4d\x11\x22\x75\xf7\xe3\x09\xa3\xb2\x6d\x55\x1e\x2b\xf1\x51\x79\x60\xfc\xbd\x32\xb4\xe2\x99\x3f\x17\x1b\xdc\x55\x06\xe1\x35\x51\x24\xc5\x16\x3b\xfe\x0e\xe8\xc0\xec\xa9\xf8\x6e\x40\x1b\xaf\x6a\x3f\xe0\xd0\x4c\x2d\xff\x35\xd1\x34\xc2\xd9\x62\x1b\xcc\xa2\x6a\x8a\x41\x63\x69\x7e\xfb\x27\x5a\xf2\x10\xc1\x08\x79\x05\x42\x0f\x7c\x6f\x35\x81\x54\x63\x7a\xb3\x7b\x29\xdf\xdc\x43\xc0\x0c\x7e\x7c\x4b\x00\x1c\x6b\x04\x77\xd0\xdc\x97\xa2\x18\xb9\x36\x0f\x16\x04\x30\x80\x25\x51\x17\x97\x3c\xbd\x81\xee\x80\x28\xee\x0b\x69\x10\x05\x58\xfe\x6d\x3f\x8e\x15\x8b\xf9\xa0\x81\x06\x89\xe5\x00\xf7\xc6\x53\xae\x76\x3b\xba\x32\x1a\xc8\x18\xb5\x0f\xe4\x54\x3d\x6e\x3c\x6f\x68\xc8\xac\xa9\x3a\xca\x1a\x3c\x6c\x76\xfb\x2f\x64\x8c\x35\x0d\xb9\x75\xe7\x6b\x44\x9e\x5f\x7f\x7c\x50\xfb\xd5\x94\x88\x30\xb4\x6a\x7e\xd6\xbb\xb2\xde\xe8\x0f\x43\xc0\xb6\x95\x5e\x2e\x55\x66\xae\xa7\xec\xf3\x30\xc7\x7d\x80\x86\x0c\xd9\x85\x16\xfc\xe4\xcb\x94\x9a\x52\x88\xb1\x8d\xf5\x22\xea\x9b\xac\x3e\x5f\x1a\xd8\x95\xf9\xeb\xa4\x11\xac\x29\x0b\xed\x32\x62\xb2\x42\xef\x2e\xb2\x56\x55\x26\xa1\xb2\x5a\xdd\xe3\x67\xc6\xe2\x08\x69\x95\x6f\x90\x29\x8f\x5b\xd5\x94\x69\x85\xa8\x97\xc5\xb7\xdd\x7c\x27\xb2\x7b\x96\x11\x17\x28\x2d\xe9\x0b\xe2\xb3\xaf\x01\x8d\x63\x8a\x24\xad\xea\x52\x6c\xa1\x8f\xe1\xfd\x51\xad\x79\x32\x40\x03\xfb\xcd\x18\xf5\xc0\x26\x77\x96\x80\x42\x75\xfc\xc3\xc1\xaf\xf5\x58\x97\xb1\x88\xdf\xc3\xa1\xdb\x3f\x58\xbf\x81\x38\x9a\xbf\xa6\x3c\x10\x81\x8d\x63\x5f\x41\xe4\xcb\xec\xa3\x1b\xe4\xf8\xde\x38\x09\x1c\x83\xc7\xf6\xa8\x7b\x35\x70\x4d\x39\x0d\x20\x1a\xc7\xc4\x1d\x9b\x71\xfe\x19\xf0\x44\x63\x57\x24\x2f\xd5\xaf\x69\x89\x68\xf6\x55\xa5\xdc\xc4\xa8\x94\xd0\xe6\xd0\xfb\xea\x02\x79\xf9\xda\x51\x1a\x67\xa7\x6a\x1a\x46\xe0\x9d\x66\x6f\xe9\xe4\xc9\xa5\x84\x62\xd0\xb7\x59\x3d\x1d\x96\x4f\x8f\xdf\x77\xe1\xe1\x79\xe1\x21\xf1\xed\x61\x60\xae\x2e\xb5\xbb\xc8\x7f\x81\x6a\x3e\x48\xeb\x6b\x9a\x46\x14\x59\x28\x0a\xe1\xec\xce\x4b\xce\x1f\x4b\x15\x46\x54\x76\x3b\xea\x7b\x19\x1f\x6b\xf0\x9a\xa6\xa0\x83\x01\x48\xc0\xab\x1b\x0f\x81\xcb\x9a\xa6\x26\xa2\x43\x88\x05\x0a\xbd\xb4\x67\x61\x41\x37\x42\x24\xae\xb4\xea\x76\x95\x0c\xaa\x85\xdd\xc8\xc7\x17\x2e\x82\x50\x86\x5e\x7e\xb1\x38\xba\xd2\x25\xfa\x58\x4d\xf6\x6c\x2a\x88\xc1\xaa\x79\x8e\xd1\x11\xaa\xf2\x4c\x05\xa8\xdd\x48\xd9\x3e\x6f\x47\xc0\x47\xe0\x4e\xd7\x11\xd2\x54\x6a\x89\x15\xaa\xdf\x33\xf5\x4b\x65\xcd\x75\x18\xf0\x51\xa5\x39\x83\xae\x19\xbd\x28\xae\x48\xe0\xc6\x84\x7d\x74\xd5\x0a\xc0\xa0\xa2\x4f\x05\xf0\xe7\xd8\x13\x75\x32\x55\x94\x09\xec\xb3\xc2\x7c\x8a\xc0\xd0\x4c\xb0\x1b\x22\x31\x52\x7e\x84\xf7\xa6\x63\x2b\xfb\x1f\x44\x07\x29\xf6\xb7\xb3\x1a\x69\x34\xbf\x8d\xa6\x95\x0e\x99\x19\xe1\xb1\xfd\x0b\xfa\x97\xc9\x26\x85\x24\xc6\xc7\xd0\xa6\x04\x3b\x70\x40\x6c\xff\x18\x40\x05\xde\x2f\xf8\x19\xce\xb9\x50\x5f\xa8\x9c\x69\x0a\xc6\x50\x47\x06\xdd\xac\x9e\x76\x67\x50\x7f\x5b\xc7\xe2\x7f\xf9\xd7\x7d\xa1\x09\xac\xad\x8a\x04\x55\x9e\xe0\x19\x8a\xbe\x70\x46\xbd\xd8\x38\x56\x2d\xd0\xe7\x75\x28\xa6\x3b\x7f\x42\x16\x80\xf6\x74\xd6\x9d\x28\x1e\xc4\xfb\x6d\x35\xb1\xde\xd3\x2c\x30\x01\xde\xe5\xae\x7c\xcd\xa0\xe9\x21\x08\x9a\x85\x4c\x21\x3b\xed\x47\xa6\x9a\xec\xd4\xfd\xd7\x00\x96\x8b\xf2\xf2\xd8\xc5\xfe\x8c\x44\x3c\x24\x9d\xd5\x4c\xd1\x54\xd7\x61\x76\xc5\x08\x27\x01\x1b\x5b\x40\x0d\x62\xdf\xf6\x30\xae\x22\x6e\xa5\xd9\xd4\xeb\xd3\xb9\xb9\x8e\xeb\xa7\x8c\xc8\xc0\xdb\x48\x21\x47\xb9\x3c\x4e\x60\xae\x9a\x11\x95\x00\x1b\x60\x78\x37\x9d\xda\xe2\x4f\xc8\xe6\xca\x73\x8c\xa8\x34\xb2\x8a\x42\xc8\x98\x87\xa1\xa2\x87\x66\xc4\xa8\xd8\x36\x15\x8b\xc0\xd5\xfd\xdd\x11\x9a\x04\xde\x5a\x67\xe3\x32\xd9\xa1\xcf\xcf\xe4\x5b\x68\x22\x90\x92\xbe\xdf\xae\x46\xe7\x67\xed\x7a\xf2\x7f\xfe\xbf\xff\xf3\x47\x76\x3e\x43\x85\x0b\x4a\x9d\x1d\x6f\x85\xc2\xc2\xfc\xf8\x1c\x8c\xd9\x7e\x7d\x56\xbb\x40\x69\x44\xfe\xd4\x8c\x25\x29\x06\xfe\xb7\xf7\xab\xb1\x89\xa1\x66\xcc\x84\x48\x2a\xc3\xa6\xf5\xc8\x18\xc0\x0d\x88\x58\x8a\xb5\xe1\xbb\x9b\x95\x05\xc2\x87\xfe\xa3\x11\x27\x22\xf4\xc2\xf2\xcd\xea\xa5\x4d\x56\xdb\x69\x37\xbb\x35\xb3\x38\x04\x1d\x0e\x64\x4a\x07\xcb\x13\x8b\x59\x82\x26\xc5\x25\xc6\xb2\x61\x50\x5f\x4f\xb2\xf4\x85\x2c\x96\x30\x8e\xdb\xf5\x29\x2b\xa6\xf3\x33\x71\xf8\xcb\x87\xc5\x76\xdf\x0d\x8f\x23\x4b\xe7\x75\x5f\x74\x90\x97\xeb\x01\x46\x0e\x0e\x9a\x25\x02\xb8\x17\x11\x16\x55\x73\x5d\x4e\x9e\x68\xa2\x20\xb2\x8a\x57\xf0\x51\xa0\xa6\x8f\x2b\x59\x62\x00\x29\xf2\xbb\xbe\x83\x74\xb3\x9c\x5c\x24\x0f\x8c\x10\x9d\x1a\x0f\xa2\xf9\xe7\x23\x4b\xc6\x63\x16\xb8\xf6\xe7\xfa\x24\x45\x5d\x4f\x7f\xe8\x94\x48\xc4\x8e\xfb\x4d\x68\x62\xed\xe5\x47\x51\x43\x98\x4d\xc7\x3b\x61\x6b\x54\xd0\xf5\x77\x9f\xb2\x08\x0b\xcf\xca\xa9\xf7\xc2\x7a\xf2\x78\x44\x1a\xa2\xb6\x80\x14\x59\x5e\x5e\xba\x99\x2d\x84\x95\x85\xef\xb4\x9d\x6f\xa0\x11\x59\xde\xd5\x80\xa6\x0f\x6a\x7c\xf1\xc2\xd0\xd8\x69\x0d\x3c\x64\x9f\xf0\x66\x34\x93\xa1\xe0\x8e\x63\x6b\x15\xb9\xab\x4b\x3d\x7d\x33\x25\x49\x39\x74\xbe\x60\x73\x9e\x42\x9a\x49\x4a\x02\xe2\x97\x95\x0b\xbe\x84\x5e\x68\x01\x4b\x65\xc3\xa4\x8b\x49\x11\x62\x20\x6b\x9f\xc2\x4d\xd6\xbe\xb5\x53\x23\x52\xcd\x14\x49\x70\x83\x7f\x58\x6c\x1e\xf7\xeb\xc7\xc5\xe3\x6a\x7d\xb8\x5d\xaf\x0f\xdb\xf5\xf3\x6a\xfd\xd8\x4d\xc0\x36\xcf\x72\x0a\x6b\x6d\x80\x3e\x2f\x2c\xa8\x19\x80\xcd\xc6\xf3\xf2\x58\x6e\xbb\xc0\x25\x0a\x42\xab\xf5\xab\x07\xea\x32\x5d\xad\x67\x12\xc9\x47\x81\x8e\x0c\xf1\x3d\x22\x17\xf4\x3a\x4f\x4d\xdf\x19\x89\x42\x23\x34\x52\xba\xb2\xa6\x29\xff\xfd\x97\xac\x5a\x1d\x11\x11\xf9\xf5\x7a\x57\x9a\xa6\x23\x90\xe9\x88\xc6\x2a\x70\xb6\xa3\xed\x37\x21\xc8\xc8\x9a\x2b\x0c\xb7\xef\x88\xc6\x06\x67\x8f\x2f\x75\x3f\x8a\x13\xac\xdf\x87\x20\x35\x1c\x03\xd6\x6e\xb7\x5b\x38\x23\xaa\x28\x2a\x5b\x35\xac\x41\x0f\x3c\xbf\x7e\x45\x2c\x11\x08\xcf\x7c\xc3\x9a\x7b\xf7\x5f\xad\x52\xdb\xfb\x7d\x2c\x8b\x4f\x04\x6a\x74\x14\x89\x14\x5f\x86\xdf\x2f\xba\xac\x9f\xcb\x4b\xd3\x9f\x20\x0e\x13\x0b\xab\x6a\xe3\x13\xac\x10\xee\xa0\x79\x84\xa6\xfd\x9a\x6e\x0c\x51\x18\x32\xd8\xa0\x67\x5b\x95\x2f\x99\xcc\xfa\xda\x64\x14\x8b\x10\xbb\xba\xcb\xac\x31\x97\x6a\x14\x58\x45\x3c\xb6\x0f\xf2\xd0\x9e\x7c\x7e\xba\x47\x3c\x55\x11\x9a\x3d\x5c\x90\x79\xb1\xb9\x99\xa8\x8c\xeb\x88\x03\x43\x96\xd2\xf9\x52\xbf\xf8\x9c\xb5\xa3\xdf\xf6\x05\xf3\xc9\x3b\xe7\x17\x83\x28\x4d\x24\xd1\x1d\x69\xc3\x16\xb8\x87\xea\x91\x3a\x6a\x13\x46\x3a\x0c\xa8\x7c\x93\xf0\x52\x15\xf3\xbc\xe1\xc9\x3d\x08\x42\x10\x81\x03\xcd\xcb\x20\x44\x88\x84\x0e\xbd\x4c\xcc\xa2\x28\x2e\x22\x47\xd7\xb4\xda\x11\xeb\xdd\x20\x19\x04\x3c\xec\x5c\x1b\xe7\x5f\x95\x48\x06\x1c\xa1\x49\x5e\xc9\x64\x00\x2f\xf9\x52\x80\x50\x47\x92\x52\x84\x3b\xb4\x49\xee\x37\xa8\xca\x45\x5d\xc3\x7c\x2f\x5c\x47\x32\x0e\x7a\xad\xa6\x49\x67\xc9\x0f\xe1\x11\x86\xc0\x4e\x59\x36\x3b\xbe\x34\x2f\xe5\xa5\xfe\x18\x6a\x8d\x5e\x28\x15\x24\xb8\x01\xac\x50\xfe\x6c\xd7\x85\x4b\x91\x8e\x08\x36\x2d\x6f\x21\x93\x90\x4d\xaa\x81\x91\x86\x58\x8a\x0e\xb5\xfd\x52\x01\x8c\xea\x2d\x11\x44\x5c\xb0\x01\xa0\xc6\xb5\x2f\xc6\xaf\x0e\xa4\x82\x78\x32\xa8\xeb\xdb\x20\xdb\xeb\x52\x64\xcd\x14\x39\xa0\x23\x50\x96\x15\x56\xc0\x7b\xb3\xb0\xdd\x52\xb0\x79\xba\x1b\x60\x28\x41\x19\xe3\xfa\x72\x3e\x97\x55\x53\x8f\xe6\xbb\x51\xd4\xf6\x60\x71\xd2\x3c\x99\x61\x0b\x3c\x0e\x03\x8b\xde\xce\x0a\x3d\x82\xab\xe9\x38\x8c\x68\x62\xf7\x05\x55\x41\xb3\xb3\x8a\xfc\xee\x18\x09\x08\x16\xab\xcf\xa5\xed\x81\x7f\x46\x32\xf6\xc3\x09\xa7\x8e\x49\x7d\x2f\xba\x26\x4c\x4c\x58\x8a\xfb\xea\x48\xe0\xed\xcb\x92\x47\x4c\xb8\x62\x0e\xd0\x88\xcc\xf0\xb1\xdc\xf6\x78\x7e\xc6\x44\xa4\xb8\x3e\x3d\x64\x85\x1e\xbc\x01\x31\x31\x1c\xc3\xe7\x43\x2f\xf5\xe9\xdc\x45\xf6\xbd\x2f\xd4\xe4\x5c\x51\x24\xb0\x4d\xa9\xa5\x3f\x4b\x24\x3b\x1f\xad\x1f\xd9\x79\x58\xe1\x72\x03\x62\x61\xa1\xcb\xed\xc4\x6d\xde\xcb\x2a\x3b\xf6\x97\x10\x6b\x86\x56\xc9\x8b\xaa\xd9\x97\x97\x7f\x95\x97\x6a\x20\x5a\xf3\x97\x29\xc8\xf8\xd2\x92\x44\x23\x2f\xd5\x39\x90\x7c\x5d\x6c\x8c\x79\xc0\xd0\x8f\xd5\xc7\x2a\x76\x76\x22\xf7\x5f\x0c\x8b\xfc\xb3\x2f\x63\xcc\x09\x27\x66\xae\xa2\x31\x18\x92\x46\x08\x34\x3f\x9d\xee\x33\x39\x42\x1f\xe9\x58\x10\x5b\x7c\x6b\xaa\xeb\xd3\x19\x8a\xe7\xb2\xfc\x48\x68\x98\xff\xe1\x45\xa2\x2d\x7f\xca\x61\x3c\xc7\xc0\x67\xbf\xac\xc6\x82\x3b\x35\xb8\x7a\x75\x69\x32\x58\x95\x5d\x83\x35\x16\x82\xb8\x64\xc4\x96\x84\xfc\x1e\x39\x07\x03\xd5\xb1\x00\xed\x73\xb7\xa1\xcb\x81\x8e\x25\xd5\xd8\x6c\x59\x56\xe2\xb5\x3b\xb7\x54\x01\xeb\x44\x62\xb6\xee\xa1\x3a\xa0\xba\x1b\xa2\x28\xb3\xea\xf4\xeb\xbb\xef\xf7\x8b\x67\xec\x4e\x1c\x56\xbd\x63\x40\x3b\x42\x62\x7a\x8d\x66\x5a\xa7\x73\x03\x07\x36\x4a\xb1\x63\x13\x71\x44\x40\x22\x24\xb3\xd3\x4a\x76\x22\x16\xc3\xa7\x95\x04\xda\x06\x4e\xfe\x5e\xa7\x35\x9a\x24\x24\x84\x58\xfd\xc0\x12\x95\xec\xf4\xc0\x4c\xe1\xd3\x12\xfb\x5f\xfd\x1d\xf6\x8f\x92\x50\xdb\x9f\xda\xd7\xeb\x6e\x20\x87\xe3\x00\x97\xa7\x13\x12\x10\x04\x71\x79\x22\xec\x50\xb8\x6f\xf5\x7c\xdf\x0d\x23\x8a\x29\x9f\x0a\xb9\xf7\x7d\xf4\x5b\x25\x24\xb5\x68\x88\x6e\xa7\xbc\x45\x95\xa5\x93\x28\xea\xbe\x2a\x9a\xd0\xc0\x5a\xf6\x16\x97\xd3\x93\x99\x90\xc5\x9f\x8a\xf5\x79\x39\x89\xea\x13\xca\x22\x54\xfe\x41\xa3\xef\xc3\xcf\xf5\xfa\xf7\x03\xf5\x27\x63\x34\x55\x0e\xbb\xb3\xbc\xd4\x59\x31\xd5\x89\xd1\x09\xe3\x01\x02\xed\x0e\xd8\x3c\x74\xd2\x4f\x3b\x5c\x4b\xbb\x93\x68\x2a\xdd\x62\xf6\x00\x8d\x68\x7f\x03\xbf\xd9\xcc\x4e\xca\x24\x62\x49\x18\xf5\x96\xbd\x23\x3a\x91\x4e\xa2\x28\xed\x4d\x70\xef\xca\x5c\x8f\xf6\xa5\x24\x8a\x53\xdc\x44\x50\xe4\xd6\x69\xdf\x1d\x56\xcf\x4f\x3f\x3d\x28\x25\x49\xa2\x08\xb1\x27\x90\x23\xd9\xe7\x65\x90\xef\x27\x9c\xc4\x08\x33\xc2\xa2\x5e\x75\x5a\x41\xe5\x54\x37\x26\xd1\x78\xc2\x89\xc2\xaa\x32\xbc\x83\xba\x34\x08\x38\xb7\xbc\x62\x7f\xdc\x68\x84\xc4\x3a\xa7\x82\xd9\x2c\x21\x49\x99\x15\x8a\xb1\x8f\x7e\x8d\x56\x83\x87\x36\x98\xf7\x38\x99\x24\xe5\x16\x4c\xed\x83\xd9\x7b\x51\xe8\xbd\xf8\x05\xe5\xeb\x47\xf2\xcd\x78\x29\x49\x52\xad\xa5\x0b\xa4\xb1\x52\x7f\x5b\x56\x9b\x06\x4e\xb8\x04\x96\x8d\xaf\x80\x7f\xb9\x1c\x25\x22\x89\x50\x16\xc3\xa3\x05\x0f\x3f\x36\xdb\xed\xfd\x62\xb5\x7e\xe8\x33\x8e\x44\xe8\x50\xf7\x6a\x84\x9d\x36\xf6\xb8\x38\xdb\x8d\x25\xc8\xb0\x39\x0a\x67\xdf\xb6\x85\x4a\xf5\xb8\xa7\x44\x72\x8d\x0b\xef\xcd\xcf\xe5\x7e\xa6\x83\xf6\xf7\xaa\x55\x89\x4c\xa5\x8e\xfc\xbb\xf4\x95\x4a\x8d\x4e\xa4\x88\xb8\xe3\xc2\xdc\x80\xca\xa6\x7a\x16\x3a\x91\x8a\xab\xb4\x83\x93\xd9\xe0\xf5\x03\xfe\x29\x51\x41\x98\xf6\x06\xfd\x2b\x51\x38\x89\xe1\x41\x5b\x38\x51\x09\xe3\x9d\x5f\x6a\x93\xbd\xc2\x6d\x2e\x8e\x43\x82\x8f\x4e\x74\x10\x60\x73\x47\xa3\x16\x55\x56\xd4\xbb\xac\x38\xe6\x33\x0a\xdd\x7e\x7c\x48\xc1\x6d\xce\xdf\x8b\xec\xdf\x17\xd8\xe8\x27\x63\xf1\x45\xcb\xab\xc3\x19\xb5\x41\x01\xd6\xbd\x36\x37\x93\x39\xac\x79\x82\x33\xe4\x5c\x95\xfa\x0b\x5a\x70\x3b\x50\xa0\x43\xf0\xc9\xe1\xee\x7b\xd9\x3a\x9d\xe8\x54\x8c\x5a\xa9\xab\x12\x29\xc7\xf5\x40\x89\xd8\x8f\x54\x46\xda\x3e\x6a\x55\xc3\x0f\x51\x6d\x3c\x73\x68\xf2\x6d\x40\x44\xdc\x61\xc3\x0e\xde\x7f\xda\x7f\x1f\xf0\x14\xe3\xb5\xaa\xcc\xf3\xa7\x09\x83\x91\xfb\x31\x2a\x76\xfc\xae\x5e\xad\xac\xfb\xbc\x02\x8b\x1b\xb6\x74\xa1\x1f\x80\x42\x49\x9f\xf7\xda\x13\xd0\x0a\x57\x23\x8b\xdf\xfb\xf2\x39\x01\x30\x80\x6e\x16\x58\xa9\xb2\x29\xab\xdd\x0e\xe5\x01\x03\x7c\xa4\x3f\x37\xfb\x6f\x37\xcf\x8b\x9f\x8b\xfb\xc3\xfe\x79\x73\x77\xb7\x7e\x1e\x19\xec\x68\x1e\x48\x83\xfa\xa9\x96\x8c\xda\xcb\x04\x69\x4e\x8c\x4d\x7c\xdc\x2d\xd8\x3a\xc3\xa4\xc0\xc7\x69\x68\x1b\x07\xc2\x39\x85\x6f\x7f\xec\x0f\x9b\xe2\x75\x7c\x1b\x1f\xef\x9a\x53\x63\xf0\xa5\xb6\xb9\xc6\x48\xce\x64\xb6\x41\xc4\x59\x20\x95\xf2\x36\xd8\x16\x71\xdb\xd1\x96\x34\x67\x54\xa8\x5e\x57\x41\xb8\x54\xb5\xc6\x5a\xe8\x9c\x00\x99\xe6\x2c\x16\x1e\x3e\xfd\xe0\xed\x30\x09\xef\xae\x8f\xc5\x16\x70\xd0\xb7\x41\x91\xca\x36\xea\x9a\x70\x26\x05\x46\xfd\xda\xd6\x25\xeb\x71\x98\xc6\xa3\x20\x40\x24\xe8\xa6\xc0\x52\x8e\xcc\xa1\x26\xcf\xdd\x83\x8f\x28\x60\x20\x65\x6c\x43\xa6\xfb\x77\x9b\x33\x77\x98\xe5\xd2\x3c\x19\xd4\x15\xb5\xab\xd9\xf7\x5e\xbf\x6b\x3e\x99\xe4\x91\xe4\x3a\xf0\x4b\xd3\xba\xd0\x4f\xa6\x2f\x5d\xba\x21\xb1\x64\x58\x71\x5c\x5e\x54\xb9\x87\x7a\x58\xf8\xe6\x89\x60\x28\xf1\x63\x1b\x4b\x9b\xe2\xd5\x46\xb3\xb3\xcb\x20\xe7\x44\x21\x56\x6a\xdd\xbc\x6c\xa1\xc8\xba\xfb\xe6\x22\xa6\xe9\x40\xf1\xc9\x96\x4f\x82\xee\xa8\x55\xbd\x43\x2f\xa4\xac\x59\x5e\x77\x79\xd9\xb8\xc8\xca\x87\x3d\x3c\x65\x9a\xb8\x2a\xf3\x3d\xbc\x42\x3e\x67\x7e\xdc\xae\x1a\x31\x86\x7a\x08\xcc\x5c\x17\x4d\xa6\x85\x86\x5a\x97\x85\x50\x19\xca\x62\x8e\x9f\x8d\x48\x69\x68\x3d\x08\x3b\x0d\x24\xd4\x75\xeb\x5e\x7e\x2e\x93\x00\x0b\xa3\x37\x9f\xe4\xea\x5c\xea\x84\xbb\xeb\xba\x9b\xbe\xfa\x5c\x85\x01\x52\xa7\x17\xff\xb9\x7a\x18\x1f\xa0\x20\xbc\x6b\xdc\x7b\xbb\x39\xfa\xca\xe2\x78\x8a\xab\x38\x44\x70\xc4\x7d\x79\xb4\x69\xdc\xbe\x03\x54\x7f\xb9\x15\x73\x25\x44\x02\x03\xa4\x77\xbd\x85\xea\x27\x64\x93\xa7\xa5\x53\xc0\x3d\xa4\x53\xe9\xb6\xc2\x27\xfe\x22\xb5\x52\x89\x70\x7d\x42\x57\x68\x9f\x9e\x00\x18\x86\x13\x97\x42\xb6\x9f\x9b\x4d\x52\x39\x84\xb6\x68\xf7\xbb\x17\x71\xf0\xe7\x37\x41\x80\x6d\x76\xdb\xc3\xa9\xbb\x7a\xc0\xfc\x83\x36\x60\xb0\xcc\x68\xf1\x5e\xf0\x33\xeb\xd3\xe6\x34\xe0\x02\x83\x28\xcb\x51\x6c\x60\x25\x3c\x99\x50\xa7\x41\x1a\x86\x81\xa7\x52\x2e\x3b\x32\x9d\x4e\x43\x42\x51\xf9\xf7\x94\xa1\x8f\x38\x54\xaf\x23\x0e\xe7\xc7\x25\x2a\x0d\xdb\x2c\xcd\xd6\x6a\x4f\x65\x01\x7f\x01\x27\x4a\x43\x15\x60\xc1\xae\x6e\x5f\xd7\x55\x79\x3a\x41\xdf\x76\x4f\x43\xcd\xb0\xb4\x82\x1c\xc9\x13\x14\xcd\x52\xd4\xbf\xa0\xa9\x1f\xb2\x62\x60\xef\x3a\x7e\x06\x29\x89\x02\x85\xc0\x04\xf1\x0b\x1e\xae\x43\x84\x4c\x4a\x63\x8e\x7a\xaa\xab\xb2\xa8\xa1\x40\x3e\x6b\x1b\xb1\x4f\xc5\x19\x3e\x15\x21\xd0\x29\xd5\x56\x40\x1c\x81\xa0\x96\x38\xb6\x28\x8e\xbd\x57\xec\x28\x0d\x49\x99\x33\x88\x42\xd4\xdd\xc1\xe2\x2e\xfd\xb5\x30\x05\x08\x52\x29\xcf\xd0\x8c\x30\x7d\x69\x94\x24\xc2\xbd\xea\xe8\x6d\xd1\x09\xd6\x22\xb9\xaa\x63\x95\xeb\x34\x12\x89\xe8\xa7\xe6\xbe\x7c\x06\x95\xc1\x44\x73\x44\xa7\x91\x4a\xe2\x8e\xc3\x07\xce\x20\x77\xb0\x1e\xa7\x31\xd3\x56\xa7\x77\xb9\x5c\x3d\x6d\x1e\xbf\x82\x9a\xa4\x31\x04\xd8\x99\x7a\x7b\x81\x02\x57\xd8\x95\x28\x96\x60\xd5\xf4\xbb\x05\x21\xe5\xb1\xf5\xa4\xc8\x54\xb9\x13\x39\xd4\xa3\x5c\x20\xe5\x22\x36\x3d\xbc\xd7\x1a\x6e\x7f\xea\x93\xf4\x77\x2a\x12\x7d\x34\x97\xa6\x41\x14\x39\x54\x9c\x55\x2f\xf9\xb2\x14\x98\xa6\x29\x03\x27\x43\xe4\x72\x81\x8e\xbe\x30\xba\xed\x34\x4d\xa2\xb8\x5f\x04\xac\xca\xaf\x3b\x26\x68\x88\x8a\x25\x26\x2b\xf4\xf2\x3a\xa5\xb5\xeb\x54\xf0\x10\xd5\x5b\x36\xb5\xcb\x31\xbd\xa8\xb3\x3f\x2e\x18\x99\x4a\x07\xf8\x63\x92\x26\xde\xcc\xdf\x56\x3b\xba\xff\x6b\xcf\xd8\x92\x23\xa4\x4a\x2a\xb9\x51\xc6\xa3\x46\x3f\x60\xe1\x07\x4f\x4a\x2a\xa1\xd8\x98\xe5\xd3\x79\xbf\xcc\xa3\x92\x52\x15\x4a\x63\x1d\x3e\xaf\xae\x79\xd9\xf4\x3e\x78\x23\x9f\x9a\x69\x82\x30\xa8\xf2\xa7\xc0\x02\x9c\xde\x36\x15\x5c\x3d\xaf\x17\xfb\xa7\xe7\xdd\x48\x0f\xbd\x1d\x04\x48\xec\xc0\xd7\x37\xf3\x48\xde\xd4\xc8\x10\xab\xf3\x08\x91\xeb\xfe\xa9\x00\x52\xbf\x35\x9e\xcb\x0a\x95\x6e\x51\x20\x2c\x6b\xfc\xa4\x13\x41\x62\x7c\x37\x78\x25\x2a\xbd\xbf\x9e\x61\x04\xe3\x17\x81\xb0\xcb\xf4\xb9\x2a\x4f\xe5\x70\x09\xfe\xff\x39\xfb\xb2\xe6\xc6\x71\x64\xeb\xbf\xd3\x0f\xf3\x40\x10\x04\x97\x47\x6d\x2e\x6b\xca\xb6\x34\x92\xaa\xaa\x7b\x6e\x4c\x28\xb0\x24\x6c\x8e\x29\x52\x43\x52\xb6\xd5\xbf\xfe\x0b\x26\x00\x6e\xa2\xdd\x1d\xdf\xc4\xbd\x55\xd5\x02\xb8\x63\xc9\xe5\xe4\x39\x9c\xd0\x04\xe3\x9b\xea\xe2\xa8\xe7\x1f\x5a\xe6\x04\xc5\x49\x18\x1a\x0a\xc5\x54\xd7\x4f\x77\x37\x64\xe0\xc3\x01\xc7\x89\xf0\x99\x05\x33\x59\x0a\x8c\x2e\x95\xc2\x09\x78\x58\xdd\x63\x54\x1f\x3b\xc0\xc6\x78\x0c\x77\x5f\x91\xfb\x94\xa0\xdd\x7d\xc6\x70\x4f\x5b\x83\xa6\xb8\xcf\xa4\xa9\x31\x2f\xd3\xc5\xe9\xa6\xf4\xc2\x75\x4a\x0c\xa7\x8f\xb1\x5b\xd0\x9c\xfc\x9b\xe1\x16\x77\x02\x11\xb4\xf6\x1e\x1f\x6d\x7c\x9c\x86\x09\x31\x7b\x87\xe5\xec\xef\x47\x8d\x39\x15\x21\xae\xa4\x45\xf3\x85\xef\xe8\xf2\xe8\x1a\x82\x48\x20\xe8\xb0\x7b\xfe\xc9\xb9\xcb\x19\xf1\x31\x4b\xbd\xf9\xfe\x38\x25\xf4\x7f\x9b\xc4\xe2\x8c\x84\x5e\x7f\x61\x5d\x5a\x38\xdc\x5a\xe1\x94\x6c\x86\x4d\x8d\x38\xd9\x16\xc7\xd3\xbb\x1a\x4b\x30\x8e\x5d\x5d\x73\x85\x91\x87\x6d\x09\x32\xed\x04\xd0\x14\x67\x2a\x90\xc6\x4e\xc2\x41\x9b\xf3\x4b\x5d\xad\x3e\xce\x59\x17\x05\xe4\x0c\x14\xfa\x9a\x2a\xad\x1a\x33\xbc\xd9\xcc\xd3\xfc\x52\x5c\xaa\x25\x64\xe9\x1b\x94\xed\x68\x8d\x02\x00\x93\x6a\xc6\x28\xc1\x1a\xb9\xf0\xfb\x99\x0d\x44\xe2\xe0\x1f\x83\x27\x8c\x24\xc3\xbc\xde\x83\xa1\x4e\x9a\xb7\x9c\x50\x83\xc2\x05\xdb\x39\xa6\x11\xa6\xdb\x9c\x8f\xb8\x6c\x4c\xc6\xe2\x7c\x9a\xe8\x19\x30\xa3\xb4\xff\xce\xcf\x36\x08\xe6\x5a\x78\x84\x7c\x72\xeb\xa7\xfb\xd5\x6e\x7d\x98\x3d\x2d\x56\x7f\x29\x4e\x68\x0f\x4d\x82\x10\xeb\x83\x9a\x7d\x7a\xa3\x35\xea\xa0\xbd\xa7\xed\xb4\xe6\x89\x14\x48\x3d\xf3\x90\x66\x69\xfd\x32\x49\xff\xdb\xff\xd4\xf6\x28\x6e\x47\xc5\x1e\xea\x6d\x51\x64\xae\x1c\xf7\x26\x71\xcb\x39\x4f\x70\x8f\x52\x45\xbf\xca\x5e\x71\xae\x00\x41\x2c\x87\x92\xbf\xc1\x98\xce\xba\x69\xd6\x3a\xc1\x08\x13\xda\x61\x8b\x87\x27\x5d\x16\x27\x53\x7f\xf9\xc8\xbb\x4c\x24\x17\x2c\x30\x3a\x39\x18\xa1\x40\x31\x87\xfc\xe3\x06\x73\xe6\x3a\x87\x14\xb7\xc4\xe3\x25\x3f\x73\xf9\xba\xae\xe1\xd4\x57\x43\x71\xbd\x44\x18\x75\x35\x2c\xc8\x82\x7a\x28\x9e\x8a\xf2\xc4\xb3\x87\x54\xb7\x2f\x4e\x46\xca\x4a\xe1\xe6\x80\xee\xde\x46\x8f\x4e\xa4\xc2\x50\x9b\x71\xf8\x76\x57\x94\x1d\x79\x82\xe2\x2a\xf1\xbc\xfe\x98\x78\xe4\x39\x12\x91\xfc\xd6\x2e\xed\xe3\x35\xde\x1e\x08\xdc\x54\x8f\x1c\x36\xbf\x9e\x8e\xeb\xa7\x66\x59\xdf\xaf\xfa\xf0\x3d\xae\x83\xc4\xb3\x5b\xf3\x1d\x2f\x4f\xed\xcf\x71\xe2\x19\x03\xfa\xad\x78\x05\x27\x81\xe9\x1a\x95\x44\x6c\x83\x83\x6a\xb4\x88\x79\xe1\x79\x81\x07\xad\x11\xf1\xab\x68\x9c\xc1\xa7\xa2\x76\x42\xed\xfd\x59\x21\xbc\x98\x63\x34\x74\x3f\x7b\x58\xb5\xc7\xc7\xc0\xc4\x04\x2b\x1e\x6e\xf0\xd6\xbe\x1c\x3c\xa1\x20\x09\xa0\xbb\xe0\x44\x84\x7f\x9b\x9e\x83\x82\x08\xa3\xbd\x3b\xc9\xaa\x7e\x68\x47\x92\x20\xd2\xc4\x79\xda\x27\x9b\x9c\x26\xc2\xf7\x62\xcc\xf8\x1d\xd2\x9a\xe7\xe9\x9f\xfd\x20\xb6\xf0\x05\x80\xee\xf4\x3b\x26\x2a\x34\x05\x0d\x22\x8e\x55\x24\x52\xc2\xb9\x07\xc8\x19\x3e\x1b\x95\x06\xb4\x2b\x2e\x36\x04\xf0\x2b\xad\x5f\x30\x47\xc1\xb3\x71\x57\x65\x68\xb5\x06\x02\xd6\x46\xb8\xda\xf5\x00\xd0\xb1\x8d\x3c\x3e\xf3\x1a\xc7\x7e\x67\x8c\xc5\x76\xa6\x8a\x00\x38\xae\x71\xc7\xba\x38\xf7\x98\xe6\x9a\x06\x8d\x0c\x20\x2f\x8d\x79\x81\xf1\xb6\xd1\x2d\x30\xdf\xa4\xef\x2b\xe4\x15\xb0\xc8\xc7\x0a\x93\x84\x9f\xf8\x57\x82\x51\x8e\xf1\xa5\x9f\x8d\xeb\xee\x2e\xc4\x12\x53\xa1\xf5\x0c\xb5\x2d\x6e\x46\x88\xf7\x6d\x36\x4d\x30\xc5\x7c\x3b\x5a\x30\xf3\x37\xa0\x59\xb2\x7d\x42\xa2\x7c\x07\x66\xe2\x25\x3c\x15\x0b\x5e\x4d\x31\x4b\x29\x11\x52\x13\x2c\xeb\xd8\x63\x31\x26\x38\xa8\x74\xb4\x5d\xa3\x48\x39\xe6\xcb\x47\xfe\xf1\xcf\xcb\xe9\x3c\xba\xb3\x98\x06\x08\x0d\x11\x46\xbb\x65\x0f\x79\xfd\x0b\xd2\x31\x60\x40\xc4\x52\x60\xbc\xf4\xbd\x28\x4d\xe0\xb1\x5d\xa8\x44\x12\x04\x88\xba\x45\xa1\x5a\x94\xd4\x9c\x43\x5b\xc2\x21\x12\xa1\xc1\xf1\xf1\x15\x15\xee\x46\x8b\x7e\xfa\xdf\x76\xe3\x9c\x84\x06\x88\x2c\x8b\x37\x23\x1e\xd5\xfc\x3d\x34\x95\x05\x97\x11\xe6\xd1\xd6\x4f\xeb\xc3\x7a\xf6\xd0\x5f\x1e\x84\x20\x49\x18\x38\xe8\x61\x06\x15\xde\xc9\xe8\x29\x04\x8d\x10\xee\x8c\x61\x9a\xe6\x1a\xfd\xa5\x59\x88\x66\x87\x75\xde\x22\xaf\x7a\x12\x0c\xbd\x5c\x82\x10\x8c\x60\xe1\xef\x3d\xaf\x5e\x74\x6b\x8e\x08\xa1\x14\xae\xc0\xf3\xcd\xdc\x54\x11\x0f\x23\x90\x7f\xc3\xf7\x10\x42\x4b\x19\xba\xdc\xfc\x00\xd1\x20\x24\x65\x76\x4d\xc0\xcc\x25\xaa\xd7\xda\x26\x25\x3c\xdc\x27\xaa\xf4\x39\xff\x71\xbe\x2b\xca\xed\xcf\xed\xe8\xe5\x2a\x25\x5b\x71\xa0\xa2\xc8\xd6\x2e\x67\x22\x80\x19\x7f\xd6\xc8\xae\x23\x43\x9b\x6d\xd1\x7e\x84\x71\x3f\x5d\xa0\xb6\xc5\xf0\x35\x6a\x11\x22\x7c\x6f\x5b\x82\x4a\x71\xbd\x34\xfb\xd7\xf0\xb2\xd2\x8b\xe3\x00\x6d\x4b\x1c\x9d\x8d\xd5\x5c\xdd\xf4\x90\xa8\xff\xf7\x8d\x9f\x9a\x25\x78\xda\x21\x97\x84\x52\x6e\x8a\x4e\x8b\xf3\xe1\xb9\x1f\x7c\x97\x84\x26\xcc\x14\x37\xa1\xbd\x32\xab\x6b\xde\x2c\x2b\xfb\xba\x0b\x65\x4b\x12\x27\xd0\xb9\x8b\x6e\xa1\xfe\xf5\xc2\xb3\xa1\xa3\x25\x49\x6c\x88\x6c\x30\xe9\xb7\x87\x5c\xf5\xc9\x90\x94\x24\x4a\x80\x31\xf0\xb1\x52\xfc\xb1\xd5\xdd\x52\xd2\x0f\x43\x93\x0b\x43\xd4\xe2\x2c\xaf\xde\xa1\x34\x2c\xb7\x7f\x8b\xda\x45\x49\x5f\x1a\xa9\xd6\x37\x28\xd3\x2d\xaf\xaa\xe1\x8d\x51\x12\x10\xd4\xf4\xe5\x99\xec\x4c\x74\x49\x05\x37\xa4\x9b\x18\xc2\xc6\xec\xcf\x63\x51\x82\x29\xe0\x98\xb4\x79\x25\xd5\x3e\x7e\x70\xa7\xef\x73\x3a\x15\xb9\xe3\xe1\x18\x7d\x9b\x80\xf8\x86\x5a\xa5\x84\x96\x03\xfe\xb7\xb6\xcd\x50\xc9\x58\x19\x0c\xf7\x2b\x05\x6e\xb1\x78\x87\x66\x02\x5d\x6e\xc9\x1e\x5c\xcf\x44\xf8\x5d\x28\x29\x43\x3e\x85\x1f\x79\x0b\xda\x92\x2c\x21\x06\x85\x25\x8b\x1e\xef\x97\x6b\x94\x61\xa2\x7b\xa0\xdb\xf6\xfe\x87\xa3\x86\x49\x63\x59\x2a\x57\x92\xe3\x92\x75\xae\x5d\x73\xcc\xc1\x3d\xae\x96\xeb\x19\x7a\x8f\x9b\xdd\xe1\xf8\x6b\xf6\xf0\xb0\x72\xc1\x62\x19\xb2\x00\x8b\x44\xbf\xad\x1e\xdb\x9f\xc2\xd0\x98\xb2\xed\xf8\x18\xf3\x59\x7f\xf2\x89\x43\xc1\x7c\xa3\xd0\xea\x80\x80\xb6\x21\xa2\x01\xa6\x35\xfa\x45\x00\xf3\xeb\x63\xd1\x6c\x8e\x9f\x17\xa1\x77\x73\x20\x92\x12\xe3\x72\x35\x94\x28\x14\x07\xb3\xac\x7d\xc8\x48\x51\x1c\x39\x2d\xff\xc5\x7b\x39\x4a\xa6\xcb\x18\x14\x8e\xfa\xf5\x62\x83\x42\x66\x28\x6a\x30\x9e\xa8\x09\x8b\x31\x23\x85\x00\x4a\x63\x8c\x8c\x7b\x24\x21\x26\xe7\x8c\x2b\x58\xdf\xf2\xaf\x4c\x85\x83\x24\xf7\x23\xdc\x56\xe7\x08\x40\x37\x94\x5d\x0b\x07\x20\x1d\xc6\x69\x25\x57\x86\x91\xcd\xc4\x50\xf6\x45\xa6\xf0\xf3\xbb\x47\x15\x1e\xd3\x49\x97\x15\x98\x17\xf9\xf8\x49\x85\x88\x1d\x19\xf0\x2c\xcb\x66\x17\x95\xd6\x45\x1b\xc2\x94\x32\x8e\x13\xc3\x68\x9a\x6b\x28\x31\x8a\xf8\x17\x61\xa4\xc1\x93\xa8\x40\x23\xa0\xe6\x11\x6a\xee\xd0\x40\x5f\xfa\xbe\x52\xc5\x4c\xc5\x8e\x4b\x38\x95\xb0\xd1\xb3\x73\x3a\x7e\xf1\x10\x10\x14\x24\x2b\xce\x98\x12\xe8\xd5\xce\x49\x00\xa3\x5c\xf1\xd2\xa9\x63\xba\x8c\xa3\xd4\x7e\x82\x05\x5b\x18\xc5\xb1\x49\xcb\xf6\x49\x75\x14\x50\x23\x2b\x82\xa5\x1f\x46\x41\xb7\xe8\x08\xee\xba\x48\x8c\x75\x82\x27\xef\x5f\x79\x9a\x38\x8e\x67\xe3\xd3\xb5\x31\x91\xf6\xf6\x15\xf1\x29\x16\x70\x22\xf3\x30\xe2\x99\x7b\x6c\x3f\x4a\x91\x24\xa0\x6d\xbe\x81\x6b\x7f\x7c\x34\xc4\xa4\xe5\x13\x9f\x5f\xae\x7d\xd9\xb8\xe1\xec\x52\x94\xc6\xd4\x1f\x0c\x8e\x59\xbd\x96\x85\xbb\x10\x0d\xb9\x07\x7d\xfb\xd4\x98\x92\xc3\x8d\x46\xd1\x48\x93\xa4\x13\xc5\xdb\xf1\x1a\x36\xda\xe6\xa1\xee\x79\xf6\xd6\xdb\xcf\xdd\x11\xc0\x90\xec\x05\x72\xd5\xec\x07\x4d\x87\x6e\x66\xaa\x80\x05\x88\xed\xd5\x69\x09\x9b\x7c\x3c\x2a\x46\x81\x6f\x15\x24\x61\xec\x19\xcf\x73\xf5\xc6\xb3\x8b\x43\x27\xd8\xae\x71\xdf\x4d\x55\x41\xc2\x85\x7d\x73\x53\xd9\x56\x15\x24\x4e\xd7\x05\x03\x03\x5f\xe5\x37\x15\x53\xba\xc5\xad\x6f\x36\x0f\x47\x50\x69\x7d\x24\xe1\x60\x0f\x52\xa1\x67\xfc\x56\x71\xb9\x3e\x2d\x17\x9f\x14\xf5\x4f\x0f\x94\x48\xfb\x98\x03\xf8\xce\xaf\xfc\xb5\xfd\x24\x31\xf5\x03\xab\x31\xf2\x04\x1f\xf5\x77\x18\xad\x28\x2a\xa6\xd2\xea\x76\xeb\x12\xaa\x17\x04\xa1\x48\x1b\xf4\xea\xd7\x3f\x8d\x9e\x26\x66\x1e\x1a\x27\x3f\x74\xb1\x2d\xf2\x3f\xd3\xf6\x7a\x1c\xd0\x4e\x5a\x1e\xdc\xf2\xae\x12\x2a\x14\xed\x17\x55\x9c\x20\xef\xd3\x7b\x2a\x95\x40\x40\xfb\xfc\x41\x3f\xaa\xe6\x5d\x0e\xf2\xa6\x5f\x42\xce\x14\x27\x11\x5a\xa5\x0b\xae\xa1\xef\xde\x2b\x1e\x11\xc4\xbb\xe4\xf0\xee\x7c\x4e\x9b\x0c\x9d\xde\x3f\x1a\xa7\xdb\x12\xce\xe5\x50\x59\x7b\xcb\x36\x09\xa6\xbd\xe6\x4d\xed\x36\x5b\x0c\xc0\xbb\x9f\xb5\x91\xbf\xaf\x81\x1b\xbc\xfe\x5d\x2b\xbf\xa3\x94\xa4\xa1\xb2\x4e\x7e\x71\xc9\x25\x2c\x32\xe0\xa5\xd3\xab\xed\x8a\xbd\x5d\xef\x58\x63\xe4\x60\xbf\x6d\xc9\x47\x94\x22\x1e\x46\xb4\x4c\x96\xc6\xfd\x18\x1a\x6d\x52\x74\x27\x8e\x67\xac\x61\x39\x9e\x8b\x22\x3b\xf6\x65\xab\x55\xf3\x3f\xcc\x6c\xec\x81\x97\xf2\x65\xbd\xdd\x0d\x47\x1b\x50\x0d\x64\x40\x11\x33\x4c\xf2\x2a\x88\x15\x84\xfd\xc2\xc5\x39\xd4\xc3\xea\xb1\x2f\x33\x02\xf6\x3f\x07\x2f\x58\x2b\xa3\x1b\x5e\x68\x0d\xe5\x31\x75\x6f\x0a\x3c\x2f\xc6\xba\x7f\x53\x24\x75\x9f\x9e\x9b\xeb\x9d\x78\xd5\xb9\x40\xe0\xd1\xc8\xa9\x69\x1e\xd2\xfa\x92\xf1\xb4\x84\xa3\x85\xc1\xc5\x6d\x27\xa9\xb4\xdf\x56\x77\x61\xac\xfc\xa6\x5e\x61\xf8\xcd\x81\x04\x0c\x2d\xe8\x1a\xb9\xf6\x77\x80\xc6\xed\x6f\xa3\x3e\xa1\xe7\xb0\x7e\x0f\x05\x96\xdb\xa8\x8b\xac\xfb\x09\x1a\x20\xa1\x0f\x41\x17\x73\xb2\x86\xd0\xc0\xc3\x00\xa2\x8d\x15\xd1\x37\x61\x6f\x37\x04\xb7\x58\x81\xcf\xa2\xd8\x88\x61\xd9\x54\xe1\x70\x41\x1d\x3d\x87\x1f\x1a\x0a\x9c\x97\x56\x5a\xae\xf9\x8d\xa0\x59\x6e\x29\xdd\xbb\xd2\x5c\xf0\x15\xeb\x70\x3e\xdb\x32\xfd\x13\xda\x16\x30\x91\xfa\x3f\xf9\xf9\x67\x9a\x65\x7d\xad\xf8\xd1\x05\x35\x09\x0c\xd5\x65\x5e\x3b\x66\xa6\x27\x48\x9f\x5f\x44\x71\x29\x6f\x92\x3a\xf6\x20\x4a\x18\x18\xd6\x77\xc4\x76\x99\xb6\x09\x66\x8d\x66\x4f\x46\x2a\x9e\xa3\x5b\x16\x8c\xa6\xcd\x96\x5f\xab\x3b\x80\xa3\xb8\x6e\xcb\xe2\xe3\x46\x88\x64\x74\x8b\x81\x0e\x50\xba\x6f\x97\x56\xaf\xfd\x4d\x11\x98\x17\x38\x7a\x76\x97\x7f\x69\x3e\x2c\x56\xd2\xb9\x2e\xc4\xc7\xed\x2c\xe3\x55\xdd\x31\xa1\xe1\xa2\x38\xbc\xd3\xd0\x97\xaa\x63\xcd\xfa\x06\xa7\xd3\xf5\xf1\x52\xa5\xb2\xaf\xad\x64\xbb\x46\x49\x22\xfd\x2e\x79\x00\xfc\x34\xd6\x93\x54\x10\x33\x03\x31\xd0\x3c\xcd\x4c\xd9\xc0\x5d\x69\x20\xf3\x3c\x9b\x5f\xff\x0d\x65\xd1\xf6\xe4\x11\xe2\x3c\xb8\x52\xdb\x12\xa9\x3f\x1b\xa7\x1c\x05\x62\xa7\x77\x21\x48\x3c\x8d\xb6\xc0\x29\xcd\xef\x8a\xf2\x09\xde\x0f\xc5\x39\x95\xee\x7c\x49\x40\x91\x82\x2d\x2b\x9e\x53\x79\x94\x43\x54\x3b\x24\x41\x88\x24\x96\xa9\x02\x8e\xf0\x0d\x17\x99\x9f\xda\x1b\x21\x61\x86\x14\x4e\x9e\x2e\xd9\xb9\x78\xf7\x3f\xbb\xa1\xc8\x38\xd6\xbb\xd9\x61\x15\xb4\x57\x82\x00\xb3\xd3\xab\xa7\xe5\x3d\x2f\xdf\xba\x60\x10\x70\xdf\x20\xfd\xad\x7a\xe5\xf7\x34\x7f\x56\xc5\x09\x6d\xa2\x09\x79\x40\x05\x3c\x50\x84\x39\xc0\x6c\xae\xd3\x67\x0b\xc5\xf8\x2c\x79\x39\x5c\xd7\xdc\x49\xb8\x62\xda\xd6\x7b\x97\x15\x18\x4d\xd3\xe1\x75\x44\x18\x9b\x00\x9e\x95\x66\x40\x82\xcd\x2f\xbd\x51\x10\x89\x51\x83\x31\x20\xad\x9d\xbd\xb5\xd8\xb5\x72\x63\x77\x3e\x14\xcf\x26\x81\xfd\x45\x49\x2b\x48\xa6\x30\x4b\x08\xa7\x73\x56\x5c\x01\x56\x1f\x50\xca\xb4\x02\xc3\x30\x51\xf5\xac\x25\x90\x89\x40\x7b\xb2\x86\xaa\xfe\x99\xc2\xbb\x7b\xb1\xca\x22\x59\xd7\xf9\x5b\x5a\x83\xb9\xe4\x28\xb6\x0a\x2a\x04\xf4\x6b\x2d\x53\xdb\x80\x6f\xc5\x75\x49\x84\x86\x2e\x84\x82\x55\x6e\x76\x25\xac\xc6\xd5\x6e\x00\xcc\xc7\x35\xff\xf1\xf2\xfc\x0c\x59\x3b\xaa\xb5\x17\x30\xda\x7e\xb3\x1a\xf2\xfa\xc7\x6e\xfd\xdb\x94\x3f\x00\x5a\x11\x61\x9d\xe1\x4e\x99\x7e\x88\x71\x37\x3d\xb5\x27\xa2\x9e\xb4\x3c\xbc\x1f\x5e\xd2\xea\x0f\xe0\x6e\x73\xd1\x9e\x34\x30\x93\x15\x2f\xb3\xeb\x4c\x15\xe7\x1a\xca\x11\xe6\x49\x93\xc8\x28\x4d\x9d\xf8\x07\x26\x8f\x6e\xa8\xe7\xb4\x1f\x73\x0b\x33\x3e\xf7\x3c\x79\x4d\x03\x82\xa1\xd0\xdd\xf5\x63\xf5\xf1\x57\x36\xcd\xf4\x70\xd1\x94\xab\x30\xee\xe1\x60\x70\x35\x5b\xe7\x0b\x18\xc7\x14\x74\x90\xc4\x0e\xbc\xda\x15\x96\xb9\x5b\x61\x94\x9b\x4a\x2d\xa8\xea\x3d\xd4\x86\x93\x9e\x67\x4b\x57\xb3\xa0\x43\xdf\x04\x1a\xcf\x06\x5c\xba\xd1\x96\x08\xa5\x47\xf0\xa1\x43\x16\x47\x76\x37\x74\x82\x47\xcf\x62\xf4\xc2\xc3\x28\xc1\xbc\x15\x06\x8d\x27\x78\xc5\x27\x4d\x06\x77\x6c\x6c\xaa\xc6\x00\xd1\xcb\xbd\xe1\xab\x43\x61\x54\x15\x5c\xd4\xfa\xd0\xaf\xe9\xff\xec\x85\x8e\x6e\x4c\x9a\xba\x9a\x0a\xea\x7f\x5d\xa0\x9a\xcc\x3b\xe9\x50\x85\x18\x99\xb3\xb4\x4e\x3b\x90\xe9\x39\x85\xde\x20\xb6\xfd\x22\xa0\x08\x49\x6b\x5f\x5f\x1c\x12\x43\xff\xbc\x5a\x6c\x9e\x96\xfb\xe3\x76\xb5\x3b\xde\x6f\x7e\xec\x5c\x7b\x42\x4d\xd0\xe5\x9f\x05\xf8\xbe\xc3\x8a\x6b\xee\x47\x98\x48\x37\x75\x46\xbf\x2e\x1f\x29\xff\x59\xd4\x1d\x29\x82\xe6\x54\x63\x70\xd1\x84\xd7\x9e\xe0\x1d\xad\xe3\x09\x67\x5f\x73\xc5\x30\x9a\x72\x6c\xac\x3a\xb8\xa9\x9d\xb0\xbd\x04\x31\x12\x19\x25\xf0\x0c\x4b\x1d\x07\xe0\x0f\x2d\x82\x18\xb3\x7a\x58\x5f\xd7\x0f\x00\x68\x19\x71\x2c\x1d\x36\x14\x62\x06\x2b\x51\x8f\x02\xf1\x5a\x26\x11\xe2\xfc\xce\xa8\xd8\x34\x28\xa1\x76\x3d\xb4\x09\xc5\x3d\x41\x59\x0c\x2f\xad\x48\x60\x48\xac\x1e\x67\x8b\xbf\x4c\x52\x4e\x17\xb0\x34\xab\x82\x13\x41\xf8\xd1\xac\xa9\xbf\x8d\x3d\x3b\xad\x92\x10\x6d\xbe\xc3\xfe\xb0\xe0\x59\x36\xdb\xae\xdb\xeb\x4b\x1f\x79\x6d\x4e\xfc\xe3\xc9\xe9\x10\x2a\xad\x40\xa0\x4d\x64\xf4\x44\xfe\xd5\x22\x16\x34\xf8\x86\xc5\xc6\x2e\x78\x26\x5a\x35\x0e\xec\x6b\x48\x18\x32\x86\x9c\x2f\xe5\x33\x38\x78\xb3\x6d\xd3\xda\xc3\x5b\xb1\x3c\xda\xfb\xb4\x9c\x88\x68\x63\x5f\xf0\x88\x97\x04\x96\xe9\x60\x63\xb5\xa5\x9a\xdb\x17\xbc\x27\x6f\x36\x22\xf6\xe8\x40\x1d\xe0\x11\xdf\xb0\x85\xbe\xf3\x5a\xbe\xf4\xcc\xa1\xa6\x25\xc1\xf1\xf5\xde\x12\x20\x95\xc3\x7a\x73\xf0\x48\x94\x24\x76\x6d\x5b\x39\x8b\x16\x3c\x22\x04\x62\x71\x8d\xec\xc3\x16\xca\xb4\x50\x9b\x37\x67\xb4\x37\xed\x0a\x03\x9c\x70\x82\xf2\x19\x72\x3b\x1a\x7a\x46\xcf\xf0\x01\x7d\xe2\x45\xdc\xc9\xf0\xaa\xc6\x09\xc5\x0c\xab\x6b\xf5\x35\xb1\xec\x1b\xfb\x33\x2f\x87\xc6\x15\x78\x3e\xd5\x98\x3e\xb9\xe3\xaf\xf0\xfb\x8f\x45\x7b\x54\x2c\x91\xa3\x6f\x3f\xeb\x7e\x02\x85\x1c\xd3\x8b\xd5\x7e\x4a\x98\xb7\x37\xa1\xc0\xa3\x89\xf2\xc3\x56\x8d\x8a\xb7\x2b\xd9\x2d\x33\x49\xbb\x4e\x81\x17\x90\x10\xd1\x5a\x4b\x5e\xec\x2e\x19\x54\x0e\xd9\x3f\x53\x0a\x6e\xe9\x62\xfe\xee\xdf\x7d\x2a\xce\xd1\xc8\x60\x01\x0f\x2d\x16\x7f\x9e\x71\xf9\x7a\x93\xbe\x06\x8f\x35\x3b\x38\x8e\x61\x5e\x55\xa9\x34\x8e\x9c\x6d\x0b\x69\x98\x48\x27\xe1\x85\x75\x2f\xcd\xca\xdb\x47\x04\x83\x17\x45\xda\xb7\xa2\xf2\xdf\x78\xd5\x83\xec\x81\x17\xf1\x08\x93\x07\x48\x39\x8d\xb1\x4d\x9b\x9c\xb5\xed\x71\x0c\x22\xb2\xc9\x85\x9e\xa5\xda\x36\x27\x21\x2e\x2a\x8d\x0f\x8d\xf0\x93\x43\x61\xe8\x43\x86\xcf\xc8\x3d\x8d\xb9\xbb\x33\xa6\xab\xaa\x61\xbc\x1c\x3c\x4e\x69\x94\x58\x63\xe0\x6e\x33\x7a\x78\xde\xb8\x98\xcd\x20\x38\xf1\xb2\x1e\xb1\xba\x4f\x2d\x22\xd0\x18\x0c\x58\xce\x7e\x34\xc1\x56\x7c\x2a\x77\x29\xc1\x69\x62\x60\x03\x15\x94\x6f\x30\x53\x7f\xf9\x4d\xdd\x81\x90\x24\xa4\xab\x88\x40\x62\xa2\xe9\xcb\xcb\xa0\xd5\xac\x5f\x14\x27\xcb\x1c\x3b\x32\x6b\xc0\x93\x90\x20\xb3\xe7\x09\x03\xd9\x43\xf8\x45\xb7\xde\x81\xa7\x12\x8a\xf6\xa9\xcb\xba\xe1\xe4\x47\x0f\x60\xec\xae\xd9\x03\x20\x09\x23\xc3\x89\xb6\x46\x26\xbe\xfa\x3a\xba\xb2\x26\x5e\x68\x63\x63\x8f\x45\x5e\xbf\x64\xd7\x5e\x6d\xef\xcf\x22\xbb\x9c\xc0\xb0\xde\xb4\xbb\x18\x10\xcf\x37\x89\x24\xc9\xf3\x91\x54\xd1\xe4\x3b\x20\x1e\xa3\xb8\x0b\xef\x0a\x91\xe6\xf7\x45\xa1\x7a\xb1\x26\x20\x9e\xf4\xb1\x48\xfb\xf0\x81\x19\xa9\xd7\x3e\x3e\xb3\x69\xa5\x00\x23\xb1\xdb\xe2\x32\x22\xfc\x1a\x7e\x1d\x42\x42\x10\x46\x9e\x6e\xe7\xe4\x84\xda\x22\xa6\xb4\xc8\x97\x43\x1b\x07\x88\x1f\x50\x54\x00\x9b\x29\x65\xf2\x7a\x36\x92\xd8\x5f\x7a\x27\x04\x2f\x2f\x1d\xa2\x0d\x88\x0f\xa6\xa2\xca\x61\x21\x1f\xd2\xaa\x7d\x06\x4a\x13\xb4\xa6\xef\x67\x0f\x87\xf6\x37\xed\x21\x7b\xc9\x0e\xd4\xbe\xf8\xd8\xf1\x6b\x15\xc4\xae\x2d\xf0\x8c\x96\x47\x5a\xb5\xe9\x1a\xd7\x42\x58\x5b\x68\x7a\x78\x29\x8b\xf7\xd5\xa8\xf6\x6a\xc9\x8b\x16\x76\xd0\xac\xe5\x15\x54\x8d\xa7\xd9\xc3\x33\x02\x09\x20\x40\xfe\xc3\xc5\x15\x13\x08\xe7\xb4\x76\xf2\x5e\xbd\x0c\x2f\x10\x46\x03\xdc\x4b\x8c\x13\xe1\xb0\x22\x83\x87\x66\x09\xc7\x52\x26\x99\x71\xb9\x28\x8a\xb3\x55\x1e\x03\xd5\xb8\xcc\xc3\xca\x75\x77\x44\xb3\x89\xe2\x06\x55\xd8\x71\x5e\x19\x45\x0a\x77\xd5\x50\x00\xa2\x65\xfe\xcb\xe5\xeb\xf1\xe4\x64\x2a\x80\x84\xe0\xa1\x1f\x7a\xee\xbc\x95\x05\xcf\x5b\xdf\xa5\x86\xd1\x37\x8d\x03\x0f\x2d\xcc\xc3\xe6\x30\x7b\x38\xce\x76\xdf\xdd\x89\x62\x49\x90\x1c\x7d\x2d\x0b\x04\xf5\x98\xdb\x6c\xa5\xf2\xff\xd6\xfc\x27\x09\x89\x30\x88\x98\xf1\x93\x28\xb6\x03\x9d\x3d\x77\x9d\x24\x90\xd2\x9b\xd2\xbc\x68\x3b\x30\x8d\x19\x40\x2c\xe2\xc3\x65\x18\x2e\xa7\x7e\xed\x38\x90\x44\x12\xe2\xb7\x65\x65\xb7\x72\x53\x76\x59\x20\x9c\x30\x4f\x60\x7c\xd4\x18\x7a\xbd\xab\x70\x12\xa3\x17\xb6\xe5\x58\x20\x52\xa4\xf9\x54\xc1\x21\x10\xce\x0c\x1c\xb2\xb2\xe3\x17\x3e\x0d\xb7\x8d\x5e\x85\x50\x1a\x63\xa3\xae\xb6\x73\xd3\x09\x0c\x02\x51\xd2\x43\xa8\xcb\xc3\xec\x8f\x99\xfb\x4d\x87\x12\xab\x79\xee\x7e\xa0\xa8\x61\x3f\x89\x08\x44\x73\x53\xa4\x7e\x80\xaa\x5e\xed\x16\x91\x6f\xc9\x6e\xc0\xf7\x98\xc4\x85\xc0\x32\x88\xb7\x22\x51\x8d\xe1\x84\x42\x95\x9f\x66\xff\xbe\x70\xdf\xc1\xf7\x92\x30\x8a\x1d\x47\x1a\x4f\xb3\x79\x09\x5c\xba\xd1\xe8\x13\x4a\x85\xdd\x2b\x1d\x43\x8b\xe5\x55\x74\xaa\x8a\xb9\xda\xf5\x06\xdf\xe8\xe4\x44\xfb\xc8\x08\x56\xa1\x22\xa0\x21\xa2\xb4\x4d\x3e\xf1\x10\xe4\x82\x24\xb5\xfb\xe3\xea\x69\x79\x5c\xb6\x00\x0d\xf0\xfd\xd8\xe0\xea\x65\x06\xbc\xfc\xd7\x25\x95\xaf\xf3\xcb\x75\xcb\xdb\x79\xe2\xfb\xb1\xc2\x7c\xb6\xbb\xad\x66\x9f\xbf\x0d\xbf\x81\x4f\x89\x01\xa4\x8b\xcb\x75\x37\x5f\xf4\x93\xf4\xe0\x53\x3f\xc2\xdc\x16\x22\x1a\x36\x37\x47\x52\x0f\x01\x3b\x0a\xb2\xef\x70\x35\x91\xfe\xd1\x3b\x75\x3d\x39\xc1\x52\xfd\xc6\x74\x9c\x2a\x93\xb2\xdd\x58\xc8\x62\x5b\x02\xb2\x87\x67\xf4\xb7\x7b\x6e\xa3\xfd\x42\x63\x2a\xbb\x29\x5b\xce\x67\x61\xe4\xd4\x64\x5b\xc5\xe9\x87\x1b\x4b\xc9\x67\x32\xc1\x60\x48\x5d\x67\xfb\xd6\x35\x01\x3f\x24\x84\x63\x41\x69\x0e\x83\x15\xcf\x0f\x6d\x59\xad\xf1\xce\x10\x37\x32\x5c\xfb\xff\xc6\x5f\xee\x54\x32\xc1\x2f\xbf\x9a\xed\xff\x78\x58\xdf\xad\xbe\x32\x4d\xfd\xc8\x8f\xc2\xb8\xb5\x26\x8e\xc2\xa4\x8c\x5d\x63\x40\x6d\x0e\xbd\xde\xd7\x5c\xde\x90\x21\xb9\x6e\xcc\x4f\x3a\xc6\xb7\x7d\x4b\x43\x0e\x7e\x14\x1b\x00\x0a\x0a\x64\x3c\xf5\xca\x22\xc0\x8f\x20\xc1\x34\xc9\x5b\x61\x38\x72\x47\xef\x2f\xf6\x62\xf4\xdf\x4d\x94\xb3\x2b\x43\x6f\x9b\x35\x1a\xa2\xfb\x22\xe3\x65\x5a\x0c\x5e\x65\x1c\x70\x6d\xa0\xaa\x8b\xd5\xd3\xe1\x78\xf7\xe3\x69\x79\x7c\xda\x3c\x39\x3a\xed\xb6\x1b\xe3\xd2\x16\xc2\x57\x90\xab\xe7\xa2\x18\xc1\x5e\xc0\x4f\xa4\x40\x13\x5c\xa5\x95\xb8\x94\x15\x56\xa6\x8c\xfb\xf0\x84\x21\x17\xc0\xb3\x13\xc5\x01\xe5\x0a\x37\xc0\xe7\x1c\xa8\x35\xfc\xff\xfc\x61\x0e\x6b\xdf\xe1\xf0\x2c\x22\xa1\x74\x4c\x30\xf8\xe5\xaa\x32\xfc\x8c\x5c\x19\xcd\xcc\x13\x37\xc2\x38\xb8\x8e\xae\x72\xd5\x33\x6e\x7d\xc1\x22\x6d\x39\x02\xdb\x20\x3e\xf8\x82\x13\x0c\x6f\x2e\xef\x7e\x0e\xde\xa2\x50\x89\x34\x61\xb8\x4a\xa6\x23\x96\xf5\xa6\x55\x2b\x6b\xba\xcd\xa1\x7e\xbc\xd4\xcd\x1a\xd0\xf3\xb3\x90\x3e\x2d\xe8\xa2\xac\xcb\x4b\x9d\x42\x3b\xf9\x15\x24\x60\x9d\xb0\x6f\x7f\x9a\x7b\xdd\x68\xfd\x70\x63\xae\xfb\x10\x73\x74\xfd\x2a\x40\x33\x9d\x7e\x32\xbb\x21\x09\x74\xd4\xa9\x2e\x1e\xf7\xb3\x87\xd5\xa0\x8e\x13\x7c\xed\xfb\x08\x4a\xb5\xe0\x22\x54\x47\x43\xf9\x36\xa3\x3a\xdb\xa3\x27\x6a\xfa\x72\x2c\xc5\x32\xd4\x0a\xbb\x36\xb5\xf5\x65\x12\x08\x7c\xcd\xc3\x58\xf7\xeb\x3b\x4c\x19\x4f\x7b\x07\x2a\x70\x4c\x8b\x8d\xff\x32\x7c\xa1\xd4\x0b\x04\xce\x94\xc5\x6e\xb6\x76\x3e\x26\xf5\x98\x17\xba\x7a\xe4\x8e\xd2\x04\xa8\xc7\x43\x5c\x58\x2b\xae\x01\x69\x80\xa6\x27\x26\x25\x11\x18\x51\x77\x9b\x2a\x30\x55\x50\x6d\x89\xf8\xe4\xcb\xa4\x84\x03\xda\xf9\x48\x2b\x75\x78\xe1\xef\x5d\xb9\x31\x50\x3f\x31\x99\xd8\x7b\xe0\x99\x25\xfc\x19\x1e\xcd\x62\x23\xdb\xb3\x5c\x1f\xba\x14\x27\x50\xc6\xb9\xec\x63\xbb\xa6\xb4\x72\x6d\xd7\xd0\x33\xe8\xa4\x95\x73\xf7\xf7\x75\x71\x9e\x59\x5d\x32\x67\x9e\xd0\x30\xa2\x38\x35\x65\x91\xe7\x20\xbb\xd0\xed\xb8\x6e\xce\x75\xd7\x0a\x2d\x85\xdf\x15\x37\x12\xcc\x5d\x5c\x68\xf4\x16\x06\xe5\x2d\xc3\x3b\x8b\xb8\xc6\x2f\x58\x68\x9d\xa5\x79\x17\x36\x19\xec\x48\x34\x0e\x08\xb5\x01\xe5\xb9\x69\xf8\xbc\xd6\xa2\xf5\xf6\x69\xcc\x0c\x5d\x14\xf2\x70\x9e\xce\x3c\x7d\xce\x31\xb9\x9b\x76\x74\x87\x83\xee\xda\x16\xf2\x5b\xea\x8d\x2e\x1a\x82\xf6\xc8\x28\x35\x31\x7c\x17\x89\x67\x9c\xf0\x34\x4f\xeb\xbe\x69\xfd\x97\xf6\x16\x4d\x18\x98\x23\x2b\x63\xfb\xf7\x71\x1e\xb6\x0b\x97\x1c\x17\x99\x45\x49\xea\xf4\x95\x67\xeb\x6a\xff\x52\x94\xed\xc8\x15\x94\xe2\xba\x71\x2e\xe1\xcc\x4b\x30\x21\x9f\xb6\x91\xf9\x66\x81\x82\x9a\x77\x55\xb7\x40\xa5\x6f\xd2\x1c\xb6\xa4\x67\x99\xbe\x4d\xf3\xc7\x01\x95\xcc\xe3\x76\x73\x9e\x3b\x04\xc9\xce\x54\xa1\x4f\x47\x8d\xed\x71\xca\x8f\x02\x66\xc8\x6d\x8a\x6c\xb0\x9b\x50\xc5\x28\x66\x18\x72\x78\x47\xc5\xbc\x2c\xcd\x5f\x9b\xb7\xbd\x7a\xda\x4f\x56\x4f\x01\x55\xd2\xc7\xfd\x67\x7f\x98\x1d\x8e\x8f\xb3\xdf\xdb\x33\xe9\x98\x45\xed\x56\xbb\x9a\x0d\xfc\x19\x0a\x81\xa1\x4d\xcd\x8b\x7a\xf5\xbf\x0b\xcf\x86\xd2\x0a\x83\xdb\x0d\x3c\x4f\x28\xeb\xf0\x99\x8c\xe6\x17\x72\xa4\x10\x78\x21\x71\x71\x1d\x37\x3b\x7a\xdc\x0e\xae\x53\xdc\x66\x79\x9f\x73\x9e\xd7\xf3\xa2\x5d\xb9\x02\x42\x3c\xac\x7c\xea\xea\x45\x21\x20\x11\x4f\xac\xb4\x7b\xd6\x5b\xf7\x03\xc2\x09\xae\x63\x96\xc5\x71\x78\x27\x04\x04\x42\x72\xdb\x55\xa0\x8d\x49\xf4\xa1\x15\x9f\x0b\xf3\xdb\xd3\xf8\x22\x44\x0c\xd1\xaf\xd5\x5c\x76\xc3\x24\xa0\xcc\xc3\xd1\x39\x5f\xee\x1f\xb1\xe6\xec\x2f\x2b\x85\x20\xa0\xa1\x47\x79\xc7\x1d\xda\xbc\xc7\x91\x77\x12\x04\xb1\xd6\x26\xed\x93\xe7\x50\x3e\x5c\xe4\xeb\x75\x60\xc9\x04\x81\x60\x18\x62\xf8\x9e\xbe\xa7\x37\xd8\xc2\xcf\xd4\xc4\x63\x77\xb0\x8c\x99\xcd\x2e\x5a\x59\xbd\xfa\xd2\xbe\xf8\x40\x25\x2c\x6c\x39\x8e\x2f\xa5\x09\x89\x7d\x62\xe3\x06\x2c\x96\xd2\xe9\xf6\xc2\xbb\xdb\xfc\xc7\x7d\x00\xc3\x0d\xe7\xa2\xaa\xea\xde\x30\x0f\x98\x16\x7c\xa4\x05\xe6\xaa\xb0\xa7\xaf\x16\x6a\xe9\xcb\x1e\xf3\x4e\x1f\x00\x0e\x41\xa4\x8c\x9e\xf3\xaf\x8b\xc0\x99\x3c\x7c\xa5\x31\xb3\x02\xb9\x59\x51\xb5\xf9\x17\x77\x68\xcc\x83\xa4\x45\x15\xfc\xa5\xc8\xcf\xf0\xa6\x92\xd0\xc8\xfc\xcc\xd6\xdb\xd9\x1f\xee\x84\x49\xc2\x82\xae\x82\x04\x23\x4a\xe7\xf1\x72\xe0\xba\x72\xc9\x3b\x66\x50\x7e\x1a\x8f\x05\x2e\x62\xf4\x5a\xf8\x69\x6d\x3c\x62\xf7\xbb\x34\x44\x2d\x18\x91\xba\x03\x64\x7b\x31\x2c\xf2\xd3\x2f\x8f\x6b\x4e\xac\x38\x14\x92\x74\x22\x9f\x66\xfb\xd9\xa5\x0e\x99\xc1\x74\x97\xef\xbc\x54\x8f\x1d\x6e\x07\x02\xe5\x19\x59\xa9\x25\xf0\xfa\xc5\x10\xc2\x1e\xd3\x34\x6d\x9b\xa9\xa1\x2e\x7d\x86\xfa\xd8\x2c\xad\xd5\x31\x03\x5d\x1f\x75\x51\x1e\x4b\x48\x47\xc9\x46\x68\x4c\x31\xa4\x60\xb0\x94\x82\x77\xe6\x82\x9f\xf0\xa3\xf5\xb4\xf4\xdd\xe1\x51\x1c\xda\x12\xf0\x5e\x38\xfe\x2b\x38\x05\x04\x3a\x32\x4e\xe1\x61\x71\xc3\x75\x3f\x31\x3f\xb5\x00\x8b\x2f\x32\xe8\x27\x04\x6c\x0c\x88\x38\x20\xd0\x40\x3d\xfb\xcc\xfd\x5a\xaa\xe1\x75\x99\xe7\x45\x98\x65\x58\x20\x6d\xe8\x8f\x3c\x6d\xdf\x37\xf3\x02\x8a\xf5\x8b\x8d\x5f\x4d\xdb\x1f\x19\x0d\xa3\x8e\x17\xdc\x48\xc4\xf5\x83\xd9\x8c\x90\x84\x1a\x07\xc2\x40\x3a\x0c\x15\x81\x6b\x6c\x16\xbb\x1b\x20\xe3\x5f\x45\xe8\xa7\x91\x79\xcd\xd9\x42\x9c\x9d\x2f\xf0\x71\x28\x66\x95\x4c\xd3\x5e\xa6\x1f\x98\xef\xf1\x24\x68\xf5\x37\x8d\x56\xe9\x68\xe8\x32\x9f\x98\x9c\xe5\xfa\x69\xf1\xa3\xbf\xc1\x31\x9f\x0a\x8c\x27\x37\xc3\xac\x7e\xe1\x9f\x83\x04\x80\xf9\xa1\x8f\x81\x03\xa8\x5f\xc2\x66\x17\xde\xbc\x8f\x91\x96\x4d\x9f\x28\x36\x14\xa6\xcf\xa9\x8b\xa0\x31\xca\x3d\xd1\xe9\x83\x4c\x91\x0a\x4c\xfd\xcb\x1d\x2c\x18\x86\x89\x91\xd8\xa6\x25\xe4\xb7\x3b\x99\x4b\x0a\x0e\x6f\x34\xf0\x85\xb6\xc0\x9f\xf4\xf9\x19\xca\xed\xcf\xed\x1e\xcb\x2e\x3e\x19\x1c\x81\x2f\x99\x6e\x83\x5d\x37\x6c\xf3\xc0\x02\x2a\x5c\x06\x67\x07\x55\x91\xbd\x8d\xc3\xe8\x2c\x48\x22\x84\xda\xcf\x2f\x8d\xd3\xe0\xb8\x3a\xff\x2e\x83\x92\x3d\x09\x4b\x28\xce\xc7\xa7\xa2\xac\x5f\xb6\x45\x06\x16\xac\x3a\xe0\xe0\x02\x16\x26\x3e\xde\xae\x79\x9d\x8f\x08\x71\xcb\x0b\x05\xb3\xea\x00\xfc\x64\xd0\xd9\xa3\xdb\x8b\x94\x8f\x10\xd7\xa3\x01\x55\xef\xe0\x0d\x6b\x5a\xdb\x71\x6b\xc9\x36\x7c\xcf\xf6\x8f\x21\x41\x1c\x4f\xa1\x75\x2a\x53\x9e\xdd\x71\x09\xa2\x28\xdc\xfe\xcf\x92\x84\x31\xd2\x22\x04\xde\xd2\xe2\x52\x19\x70\x71\x3b\xab\x12\x9d\xa0\xd5\xb6\xbf\xc8\xc1\x78\xe3\x94\x62\x66\xd7\x52\x77\x61\xdb\x0e\x30\xb6\xda\x77\xb2\x5c\x6f\x2e\x2c\x7e\x10\x83\x10\x90\x65\x7c\xa8\xd9\x00\x8c\xcb\x08\x43\x40\xdb\xe5\xb6\x67\x35\x36\xde\x3d\xe9\x54\x78\x67\x17\x14\x0f\xbf\x29\xe7\x02\x26\x3c\xe5\x27\x8e\x61\xb1\xe2\x48\x96\xf2\x17\x0c\x91\xc0\x04\x95\x18\xe6\xc7\xd8\xe9\xa5\xfa\x44\x72\x62\x3a\x27\xc1\x04\xd3\xac\xcf\xdd\x39\xd2\x89\x19\x5d\x4a\x7a\xac\x8b\xae\x8c\x54\xd6\xbb\x21\xa1\x02\xa3\xe0\xb2\xe4\x65\x6a\x59\x9f\x47\xcf\xa9\x22\x82\xa2\x71\x0f\xc5\xb3\x0d\x5b\xb9\x0c\xc5\x2d\x4b\xf1\xdf\xaa\x0a\x6f\x4e\x99\x38\x57\x67\x92\x5b\xf5\x93\x97\xa7\x62\x40\x72\xa3\x9f\x9b\x87\x1f\x8f\xab\x63\xe4\xb9\x87\x00\x15\x62\xad\xe6\x31\xcd\x15\x7c\x4c\x91\xb6\x01\xd3\x84\x22\xec\x20\xe3\xb9\x32\x94\x9e\x06\xf7\xed\xce\xa1\xe3\xc8\x10\xf0\xc1\xbb\x49\x2c\x0c\x33\x75\xa6\x57\xe8\xb1\x30\xb6\x50\x98\x79\x2d\x07\x70\x37\xd7\x23\xa1\x58\xdc\x78\x0f\x69\x39\x66\x0d\x1d\xf6\x24\x5e\xe8\x28\x89\x76\xc0\xb3\xb4\xea\x55\xc1\x40\x48\x24\x0d\xfd\x21\x6b\xf7\xf4\x87\x0e\x89\xd2\xb8\x8f\x2d\x9b\x95\x53\x14\xb5\x8b\xcb\x8f\x6e\x8c\x80\x76\x97\xfb\x95\xfe\xf9\xe7\xe1\x7a\x1e\xd7\xfd\x42\x48\x23\xcd\x8d\x95\x60\x98\x97\xdc\xaa\x39\x31\xb0\xed\x11\x2c\x21\xe8\x01\x65\xf0\xb6\xed\xcb\x8b\x40\x18\x52\x4f\x78\x66\xd1\x1f\x4e\xbc\x30\xa6\xc6\xb0\x7a\x28\x9e\x1f\x0a\xf9\x8a\xc5\x5c\x78\xa5\x6e\x22\x0f\x8c\xdd\x30\x8e\x19\xf2\x4a\xd8\xd2\x8f\x29\x7d\x24\x08\x93\x20\x90\x6d\x6e\xa2\x39\x67\xda\x18\xf9\x06\xe1\xe1\x16\x97\x30\x09\x15\x95\x4e\xc3\xae\x55\x83\x9e\xf4\x77\xc3\x44\xb1\xd0\xa9\xc2\xf6\xcd\xeb\x90\x0b\x86\x45\x2d\x69\x5e\x41\x59\x1f\x8b\x52\x8d\x18\x34\xfa\xc1\x61\xe2\xbb\xa7\x10\x7e\x02\x26\x32\x56\x5f\xca\x7c\x5d\x99\xf4\xc6\x64\x6a\x23\x14\x8c\xc5\xbc\xf5\xf9\x7e\x42\x99\xea\xb4\x53\x4b\x1e\xf5\x4d\x22\x4d\xc7\xfc\xee\x7b\x7e\x82\x9f\xfc\xf2\x29\x09\x1d\x84\x82\x7b\xdc\x29\xad\x2c\xac\x63\x55\xd5\x4e\x33\xc0\x3d\xab\x0c\x09\xd2\x10\xbb\x5c\xc3\x0c\x45\xb6\x21\x7d\xce\x31\x83\xfc\x54\xd4\x26\x93\x6c\xbb\x2b\x12\x78\xcc\x16\x6b\xa3\x76\xe0\xf0\x9a\x8a\x1a\x04\xae\x34\x73\x2f\xbb\xee\x2c\x76\xa5\x3d\x3e\xa2\xae\x9c\x75\x7f\x39\x37\xbb\xd3\x1b\x1f\x8d\x1e\x15\x51\x74\x62\x1f\x8a\xe7\x66\xb8\x35\xff\xbf\xc3\xb7\x84\xac\x0c\x08\x8d\xb8\x8d\xab\x87\xc0\x14\x66\xab\x2f\xf9\x63\x3a\x5e\x1b\x42\x08\x13\xac\xd0\xca\x38\x3e\x66\x99\x42\x1b\x5c\x08\x41\xfa\xb8\x1d\x1d\xa7\x24\x8f\x6c\x1f\x1d\xf8\xa2\xdb\x32\xf6\x90\xfe\xe9\xa8\x3b\x27\x17\x11\x0d\x4a\x58\x87\x9e\xa7\x39\x32\x91\x3d\x7f\xb2\x8a\x47\x1e\x63\x41\xe2\x88\x0e\x35\x1a\x95\xc3\x29\x72\xfb\xa7\x3b\x32\xa2\x9a\xb4\xcc\xf9\xab\xc3\xfd\x6f\xa3\x33\xf3\x10\x25\x34\x3e\x03\xc4\x44\x9e\x20\x88\x39\xcc\x1d\x16\x09\x22\x92\x18\xc9\x71\x34\x67\x9e\xc9\xe8\x00\xa2\x12\x64\x0d\x97\x5d\xa1\x29\x44\x04\x3c\xcc\xdc\xe2\x8f\xe3\x78\x7c\xe4\x07\x1a\x31\x81\xf9\xe5\x84\x5c\x14\xd5\x43\x8f\x35\x10\x22\x9f\x89\xc8\x8d\xbe\xe3\x0b\x37\x2a\x9b\x8d\x49\xb3\x37\xea\xa5\x79\x91\xff\x1b\xca\xa2\xfb\xb9\xe6\xaf\xd0\x1e\x0c\x46\x2d\xae\x71\xca\x0a\xe3\x00\xf7\xdf\x8f\xaf\x09\x16\x46\xef\x21\x57\x98\x6b\x46\x7e\x24\x48\xdf\x46\xb2\x33\x10\x51\xcf\xf3\x59\xaf\x16\xe1\x93\xe2\x98\xdb\x3f\xfb\x2e\x49\x44\x03\x0a\xae\x04\x54\x5f\x37\x83\x45\x63\x7c\xc2\xc1\x78\x89\x68\x10\x20\x5e\x7e\x36\x4f\xeb\x5e\xe0\x22\xa2\xcc\x90\x79\x98\xfd\xb8\xe4\xcd\xce\x7c\x2a\xde\x46\x15\xf9\x10\x05\x01\xc3\x4f\xa0\x4a\x9e\xe6\x3b\x1c\x74\xad\x98\xe8\xa8\x27\x63\x86\xe6\x0e\xd7\x83\x96\x57\xaa\x1a\xd2\x8a\x0c\xdf\x4e\xe8\xf9\x8a\xba\x31\x31\xc6\x2a\x3a\x63\x3c\x0a\x89\xe1\x9b\xdc\x1f\x56\xdb\xe3\x7e\xfd\x6f\x97\x35\x8c\x42\x1e\xf9\xcc\x7d\xe2\xf7\xb4\x7e\x99\x21\x7d\xc2\xa1\xbc\x40\xd7\x25\x46\xb0\x7f\x7e\x39\xdd\x02\x7f\x21\x0a\x35\x53\xbe\x51\x73\x7b\x34\x7e\xf1\x1c\xea\x23\xf4\x40\x42\x51\xc4\x69\xdc\xc3\x06\x1f\xca\x54\xbe\x66\xb0\x2c\xde\x73\x97\x38\xb6\x1d\x63\xf0\x5c\x2c\xc4\x2c\xba\x06\x7e\xb1\xcf\x78\xf5\x92\xe6\xcf\x06\x64\x36\x1a\x1e\x49\xe2\x21\x5c\xa6\x27\x59\x6e\x32\xbd\x13\xe2\x5c\xbd\xd7\xd7\x87\xc7\x45\x89\x56\x86\x22\xbd\x86\xb3\x99\x02\x7d\xdb\x37\xe2\x2c\xc0\x64\xb9\x2a\x2c\x82\x0f\x69\xd9\xf3\x9b\x2f\xcd\xc3\x04\x33\xc3\x5b\x28\xab\x94\x1b\x62\x92\x09\xea\x6e\xd7\x5b\x19\x57\x55\xa7\x25\x20\xff\xcb\x43\xf1\x4c\x66\x79\x91\x5f\xdb\xd9\x2b\x88\x51\x51\xdb\xf2\xeb\x53\xfa\x92\x66\x8d\x89\x38\xa4\x9c\x87\x48\x02\x77\x6c\xc3\x77\x30\x82\x14\x44\x52\x6b\x6a\x68\x7f\xe7\xc6\x4f\x98\x40\xec\x43\xa4\x42\x86\xdc\xa1\x68\xba\xec\xcf\x50\x9e\x7a\x31\xc3\x48\x09\x81\x96\xf6\xe1\x30\xdb\x2d\xdd\x8f\x90\x84\xb8\xbc\x89\xcb\x75\xce\xe5\xab\x13\xcd\xe9\x55\x77\x41\x04\xd2\x03\x4b\x19\x60\x58\x3d\x1b\xb7\x65\x40\xbd\xd8\x76\x34\x4c\x37\xbb\xd9\xd3\xb7\xd5\xea\x69\x79\x0c\xdd\x29\x34\xf1\xd1\x89\xcc\x80\xbf\x81\xd3\xd0\x1a\xcc\x6b\x9d\x08\x57\x54\xb8\x83\x73\x51\x8e\xce\x1d\x7b\xda\x47\x54\xf3\x1f\x8b\x7d\xcd\x73\xc5\x4b\x35\x49\x55\x73\xbb\x62\xc4\xc4\x8f\xb4\xad\x92\xee\x03\x55\x21\x26\x2c\x4c\xba\xe4\x6b\x0b\xba\x1b\x99\x07\xc3\x55\x24\x26\xb1\x2f\xad\x46\xca\x3f\x2f\xcf\x5c\xf1\x2f\xc8\x72\x6e\xc6\x4a\x4c\x04\x89\x3a\x62\x51\x0b\xbb\x9a\xa7\x59\xd6\xdb\x8b\x26\x8e\x02\x40\x58\x24\x8e\x2e\x5b\xb9\xb4\xca\x55\x6b\x74\x39\x8f\x20\xf6\xbd\x80\x5b\xba\x54\x8c\x7f\x39\x0a\xb4\xbf\x70\x0c\xbe\x76\x18\x62\x3f\x36\x3c\xf6\xe8\x0f\xfc\x4a\xb1\x8c\xd6\x35\x49\xe2\x2a\x53\xed\x6b\x6b\xac\x87\xc6\x98\x18\x93\xbb\x41\x4c\x93\xc8\x14\xef\x9b\xaa\xb9\xb4\xc8\x07\x78\xaf\x38\xf0\x04\xae\xec\xeb\x6f\x87\xfe\xac\x8d\x03\x19\x92\xc0\x91\x82\xa4\x8d\x3f\xde\xe3\x2d\x80\x38\xf4\x40\x88\x8e\xec\xa9\x55\xdc\xe9\x19\x3b\x71\x14\x02\xc6\x88\x55\x5a\x82\xac\xf7\x90\x65\xbb\xde\x19\x22\x69\x18\xb7\x97\xab\xbb\xd9\x8f\x87\xc3\xd1\xd1\x66\x2c\x36\x7b\x97\xc0\x8c\x63\xcf\xc3\x82\x96\x4e\x4d\xe0\xf0\x02\x8d\x75\x38\xb3\x82\x0b\x9f\x71\xca\xda\xe3\x13\x10\x38\xd6\xb0\x76\x7c\x99\x5a\x9e\x45\x77\x76\x1e\x10\x0c\x48\x2a\x87\x4e\xfd\x5a\x4d\x0d\x62\xae\x4d\xc4\x04\x67\x8b\xdd\x4e\x87\x98\x35\xdb\x51\x44\x0c\x57\xd5\xf9\xc5\xec\x95\x55\x4f\x0b\x73\x78\x4a\x11\x99\x4d\x6b\xbd\x43\x57\x17\xb3\x2d\x5f\x61\x17\x62\x01\x21\x0e\x0b\x23\x15\xf4\x39\x6f\x94\xed\x2e\x7d\x53\x97\x7e\x57\x0e\xd1\x50\x31\x70\x4e\x68\x9b\x26\xed\xa7\x22\x6e\xf6\xf0\x18\x64\x44\x9b\x1d\xe8\xbf\xcd\xe2\x7e\xdd\x8e\x4c\x8c\x58\x7b\x4c\xb9\xcc\x76\x59\xbc\x5b\x3a\xab\x49\xf3\x31\xd6\x91\x41\x2f\xb9\x37\x6e\x4a\x3f\x8b\x12\xc1\x1f\xa3\xae\x82\x32\x83\xb5\x37\x6a\x02\xa6\xb2\xdf\x9c\x7b\xb8\x50\x27\xc4\x33\xb8\x9f\x87\xf4\x7f\x97\x54\x4d\xe0\x83\xbe\x9e\x6b\x09\x91\x1c\x33\x22\x36\xb6\x84\xa0\xd0\x51\x7a\xa9\xcb\x43\x26\x44\x09\x2f\xfe\x32\xd9\xe9\x3a\xea\xc4\x05\x69\x9f\xe0\x7d\x6b\x32\x79\xb7\x2e\x62\xe2\xfb\x11\x25\x96\x32\x67\x07\x7a\xc0\xed\xe8\xba\x84\xc0\x45\x5b\x0d\x9c\xd6\x00\xdb\xf5\xb2\x7d\x7e\x3f\xf6\x1d\xb9\xc5\x7c\x69\x37\xf0\xdf\x26\xb6\xea\x84\x7a\x01\xf2\x1b\x71\xa5\x44\x7d\x95\x93\x1c\xa6\xae\x6b\x1c\x28\x0b\xc5\x32\xa4\xb0\x5b\xfc\x10\x90\xcb\x81\x58\x7d\xef\xbd\xd0\x98\x61\x01\xde\xd9\x04\x86\xcc\x51\x3d\xf2\x23\x48\xa8\xd0\x98\xc4\x3a\x39\xbd\x1d\xdc\xfe\xcc\x64\x5e\xe7\xbf\x56\x6b\xd7\x31\x08\x43\x04\x37\x38\x90\xdb\xa1\x78\xe4\xf9\x75\x6c\x98\x25\x41\x42\x70\x71\x43\x1b\xfa\x78\xd8\xcd\x16\x47\xdf\xf3\x3c\xaf\x3d\x8d\x8c\x5d\x98\x6b\x76\x79\xbe\x94\xed\xef\x5a\x48\xfb\xbe\xd0\x18\x79\xe3\xd9\xa2\x00\x8c\xfa\xb5\x75\x79\x7f\x91\x90\x4b\x58\xa0\x91\xc5\x7d\x5d\xb5\x31\x0b\xdb\x12\x92\xc4\x27\x03\x9e\x68\x13\xef\xeb\x16\xbf\x24\x04\xce\xec\x77\xf8\x8c\xf4\x76\xaa\xa6\x0e\x92\x48\x18\xfa\xfe\x01\x50\xc0\x9d\x35\xa6\xbe\x93\x68\x34\xa4\xa5\xb7\x34\x43\x4d\x27\xca\x65\xeb\xef\xdd\x17\x19\x96\xac\xf3\x0f\xf7\x22\x46\x03\x2f\x4e\x38\x86\xa7\x52\x94\xa1\x36\x5c\x4e\x37\xbb\x74\xfb\x41\x62\x6e\xb8\xf4\x2c\x7b\x03\x06\xc8\xc6\x43\x39\x11\xb1\xd7\xea\x2e\xcf\x79\x05\x3f\x76\xed\x77\x17\x4c\x61\xdc\x65\x3e\xdb\xaf\x7a\x42\xec\x90\xc8\x50\x98\xf2\x92\x34\xcb\xba\x40\x53\x22\x35\xc3\x32\x7c\xf3\x30\x86\xf7\x1c\x0b\x3e\x27\xf0\x03\x89\x6a\x36\xd5\x9e\x2b\x34\xbb\xd4\x2f\xd3\xd0\x89\x04\x02\x86\x8c\x4f\x85\xad\x16\x39\xfe\xef\xd2\x47\x0c\xf4\x17\xfd\xff\x23\xee\xe1\x41\xc6\x08\xcf\x70\xb1\x8c\xd5\xe1\xbe\xee\x0c\xce\xe1\x4b\x00\x88\xa8\x83\x41\x1e\xe3\xa3\xe0\x55\x2a\x5d\xc0\xaa\x9a\x43\xfd\x0e\x90\xbb\x02\xc0\xa3\x43\x9f\x1b\x2f\x73\x7e\xa5\xdd\x08\xd7\x9e\x89\x9f\x7d\x4b\x4f\x27\x8b\x44\x9d\x0c\xca\x4e\x8f\x61\x9d\x28\x1a\xb9\x88\x52\x63\x5f\x1e\xde\x8b\xf6\xcc\x9c\x63\x5c\xe0\x58\x41\xf6\x49\xf4\x2e\xd1\x60\x98\x1c\xcd\xeb\xbf\x2b\x8b\x3f\x21\xbf\x4d\xc0\x72\x8f\x85\x71\xe8\x4c\x99\x7d\x6b\x7b\x70\x4f\x09\x4c\x8b\xdd\xf3\x52\x2d\xf8\xd9\x95\x90\x4f\x5e\x8b\x13\xcf\x70\x7e\x5a\xb1\xda\xae\x34\x6e\x80\xb1\xe4\x24\x08\x5c\x35\xc3\xb6\x2c\xfe\x0b\xb2\x3e\x14\xe8\x0d\x7d\xb2\xce\x71\xa2\xa5\x08\x5d\x68\xd1\xac\x36\x13\xe2\x98\xc0\x7d\x2b\x49\x2f\xc0\xa8\x72\xbb\x9f\x63\xf3\x0a\x1e\xaf\xb7\x55\x04\xdd\x45\x7c\xe0\x49\xbb\xed\x3d\xf0\xaa\x3e\x7c\x18\x44\xfd\xfc\x7a\xcf\xdb\x78\x0d\xf7\x75\x88\xae\x84\x41\xf9\xaf\xf5\x13\x80\x02\x75\x40\x3a\x62\xe8\xa6\xe6\xd8\xd5\x9e\x4e\xa3\x4d\x7f\x73\x4e\x03\xa9\x44\x27\x09\x51\xe4\xd3\x53\x80\xd3\x48\x5b\x46\x29\x68\x71\x5d\xe3\x8c\x1f\x0f\x88\xaf\x83\x1e\x4d\x0c\x1d\x7d\xf9\x20\xa0\xcc\x6e\x95\xdf\x20\xf7\x5a\xdd\xdb\xae\x07\x23\x09\x92\x87\xf5\x70\xe6\x68\x44\x2f\x78\x26\x27\x62\xf4\xa3\x83\x79\xc8\x6d\xf9\xcd\xae\x90\xb6\x04\xc6\xe4\x3b\x86\x1d\x43\x42\x5c\xd9\xba\xc5\x13\x2f\x2f\x65\x3f\x87\x36\x3a\x71\x18\x78\x46\xdf\x8a\xe7\xc5\xac\x79\x3d\x7d\xdd\x2f\xe0\x61\x28\x71\xf6\x8a\xcb\x35\xcd\xc7\xee\xec\xf8\x54\x32\xc6\x50\x4d\x5a\xb9\x9c\x11\x86\xcc\xee\x2c\x84\xa0\xfd\xf6\x11\x35\x8c\xa0\xb3\xed\x66\x04\xd6\x72\x1d\x94\xd9\xbb\x91\xe2\xab\xf9\x1c\xec\xa9\x78\x77\x8d\xb1\x47\x30\x40\xfe\x5e\xa6\x35\xec\x6e\x69\xbf\x5d\x37\x11\x5a\x29\x00\x84\x56\x97\x85\x4e\x33\xd8\xa6\xb2\xbe\x94\x43\x46\x23\xe0\x09\x0b\xb1\x8c\xff\xae\xa8\x5e\xb8\x15\x6c\x76\x57\x4b\xb8\x1f\xf1\xde\x4a\x7a\x8f\x3a\xa0\xbf\x4d\x15\x6c\x74\xd7\x4e\x80\x23\xe7\xd5\xd1\xb0\x38\xf4\x25\xed\xa6\xc1\x9e\xe6\xcf\xe1\xa8\xe4\x5c\x45\x02\x5d\x5a\x5d\x47\xfe\xe8\x2b\x0b\x9a\xa0\xb9\xdf\xad\x0d\xed\xb2\xa0\x02\x43\xb8\xf5\x0c\xf5\x7c\xbd\xec\x15\x8b\x70\x60\x44\x5b\x47\xe7\x1e\xd2\x36\x95\xc7\x21\x06\x6a\x18\x6f\x0d\xdc\xc8\xc5\x45\xee\x8a\xf1\xe0\x02\x1d\x73\x27\xf7\xbb\xda\xdc\x9b\x68\xcb\xf4\x68\x10\x1e\xd5\x28\x6a\x6c\x2d\xcd\x01\xb4\xc5\x75\x61\x01\x74\x80\xa1\x6d\x9a\x3f\x16\x87\x56\xd7\x65\x7a\x52\x0b\x2f\xd4\x21\x41\xc3\x2a\xbf\xf0\x0c\x19\x19\x7a\x15\x28\xc2\x4b\x84\x7b\xc6\x96\x06\xbb\x42\xd0\xdc\x5f\xf9\xa4\x93\xee\xb8\x20\x41\x4c\x95\xa9\xe9\x18\x5a\xe2\x82\x84\x21\x5a\xa2\xc8\xa9\x14\x8d\x96\x03\x41\x20\x22\xd2\xd2\x13\x0e\x65\x26\x40\x10\xcd\x30\xfc\xd3\x0c\xf9\x9f\x3c\x7b\xeb\xd5\x2f\x83\xf0\x09\xc5\xfa\x0f\x1b\x7b\x47\x52\xd3\x16\xce\x2b\x7c\x96\x60\x9c\x5f\x34\x26\x4f\xae\xac\xed\xa3\x51\x00\x42\x8d\xca\xf1\x41\xf8\xdc\x54\x73\xce\x79\x0e\xbc\x3c\x6e\x4a\x2e\x2f\x59\x31\xea\x44\x89\xe1\x7e\xd6\x00\xd5\x81\x37\x3e\x4a\x59\x9c\x0c\xdd\xc7\xf4\x17\xa0\x94\xba\xe8\xf2\xfe\x9a\xd7\x2f\x50\xa5\x7f\x22\x55\xb7\xec\x13\xc4\x4c\xbf\xce\x66\xa9\xc5\x22\x8c\xe2\x82\x1e\xfc\xe7\xfa\x93\x9f\x7c\x7e\x9a\x84\xd2\x89\x3e\xce\x51\xcd\x1c\x51\x8a\xd3\x43\x30\xf0\x09\x92\x85\x3f\x36\xa3\x84\xa7\x99\x8d\xca\x75\x05\x0d\xae\x9f\x86\xd8\xa6\x90\x1a\x2b\xdd\xb2\x2e\xaf\x6b\x38\x59\x32\x08\xdb\x8f\x91\x10\x51\xff\x56\x3f\xae\xf1\xf3\x5b\x02\x39\x10\x2c\x4c\x90\x6b\x03\x77\x34\x03\x7d\xc4\x20\xd6\x38\x9a\x2e\xc2\x90\x39\x1f\xa6\x19\xbf\x4b\xcb\x47\x3e\x1a\x41\x91\xef\x63\x82\xbb\x79\x4d\x36\x74\xec\x22\x4b\x22\x52\xb1\xe3\xfc\xda\xa7\x23\xf5\x2c\x10\x31\x11\xdc\xce\x81\xbd\x7c\x81\x2c\x4b\xf3\x67\xdc\x69\x1c\xe4\xcb\xf5\xd3\x1a\xc9\xab\x36\xbb\xd9\xe2\x61\xfd\xef\xd5\xf1\xdb\x6c\x7f\xc4\xaa\x11\xd7\x23\xa1\x54\xf4\x2b\x70\x7a\xde\xd0\x67\x20\x8f\x30\xb0\xff\x88\x1b\x97\xa9\x73\x9e\xdc\xbf\xdc\x99\x03\xe2\x0a\xb0\xed\xc0\xb1\xb0\x9f\xaf\xc7\x4f\x12\xc4\x11\xd6\x7e\x97\xe5\x20\xf8\x23\x12\x26\x50\x8d\x65\x59\x16\xe7\xa7\xa2\x4e\x7b\xfb\xdd\xe7\xd5\x1e\x82\x0b\x66\xbc\xa3\x33\xc8\x54\xa7\xd2\x39\x94\xd3\xc3\x49\x52\xa2\x0d\x0a\x1f\xef\x74\x75\xb8\x77\x22\xcb\xa3\xa5\x41\x46\xa6\x32\xf3\x5c\x16\x12\xaa\x6a\x67\xa1\x59\x13\x1e\xb6\x90\x4a\x22\xe6\x66\xff\xce\xcf\x2e\x9a\x36\xbc\xaa\x8a\xa2\x80\x38\xd6\xa0\xdb\xac\x98\x00\x5f\x05\xdd\x22\x3a\x4a\x0c\x0a\xcd\x63\x21\x3b\x04\xe4\x1c\xea\xba\x19\xda\x8d\x59\x37\xfd\x90\x5a\x85\x28\xa5\xa0\x4b\x80\xbb\xa2\x6c\x79\x2e\x41\x7a\x61\x82\x21\xaa\x33\xbf\x0a\x2e\x5f\x0f\x85\x4d\x3f\x7f\x86\x58\x94\x5e\x64\xe2\x7a\x3f\xea\xf2\x32\xac\x00\x94\x24\x0c\xc2\x36\x07\x75\x57\x02\xcc\xf2\xf4\xc4\xb3\x66\xe9\xb1\xff\xb2\x62\xe8\x13\x5f\x4d\x92\x58\x09\x23\x1c\x5a\x64\xfb\x96\x96\x08\x24\x49\x0c\xc8\xba\xe5\xe3\xdd\x5d\xf2\x77\x7e\x6d\x9b\xb9\xd2\x36\xf6\x90\xcd\x1e\xa1\x7e\x29\xd4\x68\x5b\x95\x7e\xa0\xb9\xe7\x68\x7a\x9b\x8f\x7c\x32\x01\xd1\x0f\x57\x9d\xf8\x8f\x61\x77\x11\x90\xc8\xad\x1b\xf9\xeb\xf7\x3f\x16\xc3\x6f\x23\x7d\x69\xe8\xb1\x4c\xb2\x1b\x83\xc3\x77\x45\xd9\xda\x3b\x33\x43\x57\xe7\x6e\xd0\x57\x1e\xda\xe7\xe2\xd2\x2c\x6c\x7d\xde\x27\xdb\x81\xfa\xcc\xb3\x95\x8a\x90\xd7\xe8\x23\xb5\xbe\xac\xed\x12\xf8\x80\xab\x39\xcf\x87\x2f\x3c\x88\xa3\xd8\xa4\x26\x72\x5e\xc3\x3f\xb9\x7c\x3d\x17\xed\x85\x43\x9a\xe0\xd7\x40\x43\xc5\x04\xe6\x5c\x0b\x0f\x71\x11\xb2\x0c\xa1\xe9\x9f\x60\x98\xd4\x6f\xc4\x98\x41\x46\x9e\x46\x84\xd4\x19\x09\xe2\x1e\xbb\x73\x44\xd4\x54\x46\x3c\x42\xcd\xef\x8a\x8f\xc1\x6d\x45\x94\x71\x93\xf1\x79\x2b\x5e\x61\x0b\xa5\x85\x0c\x4f\x23\x56\x02\x77\x54\x92\xa0\x33\x67\x09\x11\x26\x3c\x60\x19\xf1\x10\x37\x1a\xf8\x30\x26\xeb\x94\x00\xc1\xf4\x16\x23\x23\xc1\xcc\xab\x02\x3c\x6a\x02\x54\x24\x23\xa5\xa4\xe7\x82\x1a\xa7\x53\x5a\xd7\x80\x7c\xaf\xa3\x6e\x71\x4c\x31\x5c\x08\x2a\xad\x77\xd0\x8c\x61\x59\x7f\x02\x0f\x90\x31\x8f\x11\xd3\x76\xc9\xcf\xfc\x52\xc1\x90\x5a\x09\x64\x02\x3a\x91\xfd\xb1\x6d\x28\x5e\x2c\xc4\x68\x7a\xa7\x96\x3c\x30\x39\x8f\x0a\x8c\x76\xed\xcd\xaa\x3a\xea\x2f\x3c\x1f\xad\x0b\x53\x1b\x92\x42\xe9\x8a\x84\x7f\x9c\xcf\x50\x3e\xa4\xa7\xb4\xee\x17\xf5\x4b\x41\x68\xe2\x59\x43\xe6\x0b\x6a\x43\x90\x82\x32\x53\x73\x68\x84\x1f\xad\xc1\x3a\x7c\x01\x82\x01\xba\xb3\x6b\x7e\xfa\xb6\xdb\x6c\x0e\xed\x45\x62\x65\xf8\x68\x6c\xcc\xa0\xdd\x4e\xf7\x30\xae\x5b\x92\xd2\xc6\x0e\xab\x96\x76\x06\xb1\x3f\x8d\x1b\xba\xe5\xa9\x9a\x8d\x62\x13\x52\x46\x9a\x25\x2d\x75\xef\xb6\x84\x54\x16\x03\x27\x5b\xaa\x80\x23\xfc\xc2\xa1\x8b\xb1\xd8\x60\x56\x6d\xf9\x15\x60\x26\x47\x1a\x4a\x7d\x11\xd5\x9e\x7a\xca\x6d\x41\x97\x54\x11\x45\xc6\xe5\x56\xae\x14\x1c\xa4\x70\x14\x43\x92\x2a\x26\x36\xce\xa4\x00\x4e\x3f\x0e\xbf\x6f\xc6\xa5\x92\xed\x85\x5b\xab\xf9\xd6\x41\x1e\xbe\x26\xa5\x09\xd6\x5f\x96\xbc\x84\xb5\xda\xf1\x56\x1e\x0d\xa4\x8e\x22\xc7\xc5\xf8\x23\xd7\x69\x9e\x56\x2f\xa0\x7a\x62\xcf\xa0\xbc\x30\x41\x36\x92\xd7\xd7\xf5\x62\xd3\x98\xb6\x51\xd4\x36\x81\xb6\xe1\xf1\x4c\xab\x66\xbc\x5f\x64\x9b\xff\x55\x3e\xf3\xd0\x96\x30\x6a\xeb\x9f\x32\x47\x82\xa2\x71\x4c\xfa\x7a\x5e\x2e\x58\x64\x68\x06\x74\x3a\x4a\x45\x04\xdd\x61\xcc\x1e\x36\x30\x0d\x1a\x5f\x12\xd7\x30\x24\xb8\x2f\x8a\xec\xff\xa2\xff\xb8\x16\x65\xc4\x0e\x06\x32\xc6\x93\xd3\x53\xb1\x28\xc2\x2c\x90\xd1\xf1\x3d\x4c\xf0\xea\x4e\x3f\x4c\xe8\x79\x8a\x74\x23\xdf\xd2\x91\xef\x2d\xe9\xfe\xdf\x2b\xcc\x51\x51\x18\x19\xf6\x8b\x66\x1b\x31\xee\x74\x07\xc6\x51\x91\x14\x58\x45\xf7\xbb\xfd\x1f\xf1\x46\xf7\x1e\xb3\x28\xb1\x6f\xe6\xdb\x76\xff\x88\xdc\x54\xc3\x51\xa6\xe2\x28\x32\x18\xe9\xe5\xcf\xf5\x7e\xb3\xdb\xbb\x73\x73\x19\x73\x0b\x2e\x31\x91\x9a\xee\xb2\x82\x47\xf8\x3d\xb9\xe2\x67\xf4\x3f\xfa\x18\x56\x25\x24\x0f\x3b\x45\x19\x78\x2e\x3e\x21\xa1\x06\x25\x20\x31\xd5\x7d\x69\x8e\x3c\x16\x7c\x18\x49\x57\x32\x34\x84\xc0\x48\xb4\x34\xb6\x0e\xbb\x15\x5f\xc9\x58\x4a\xdd\xf3\xd4\x57\xeb\x6d\x14\x45\xb8\x3f\x6a\xde\xa6\xea\x94\x94\x8a\x1a\xc8\xf9\x39\xe3\x12\x8e\xd5\xff\x2e\xbc\x84\x49\xe4\xc4\x70\xd6\x28\x09\x01\x26\xd9\xcf\x97\xea\xe5\xb7\x5e\x77\xdb\xac\x3c\xe5\x75\x75\x38\xd5\xe5\x04\x5f\x0c\x27\x15\x19\xc1\x2a\x4b\x0f\x52\x0d\xc1\x53\x4a\x09\x15\xab\x41\x5c\xdd\x70\xf1\x5c\x7a\xd4\xa4\x2d\x45\x69\xf0\x8f\xbe\x93\xa2\xc0\xa7\x2e\x81\xdc\x5c\xf0\xa9\xa8\x9f\x2e\xd9\x08\x81\xa0\x40\x9b\xb7\x50\xa1\xd6\x52\x5a\xc2\x12\x32\x7e\x1d\x0d\x0a\xd0\x80\x61\x18\x55\xcc\xcb\x82\x2b\xd9\x95\x28\x82\xc7\x05\xd2\x15\xe9\xa2\x94\x1d\x79\x18\x80\x27\x12\x5c\x2e\x97\xbc\xb8\xbf\x08\x1b\x8d\x74\x6d\x52\x20\x58\x0e\x45\xb5\xe7\x69\x77\x2e\xa9\x12\x1b\x39\x6b\x5c\x79\x8b\x89\x9e\x08\xe8\x83\xa7\x0c\xb3\x45\x65\x29\xc7\x6f\x64\xf4\x6c\x3f\x12\x9a\x80\xae\x34\xb2\x01\x08\x43\xde\x5e\xca\x6a\xe4\x28\x01\x51\x5e\x60\xaa\x73\xe4\x16\x4a\xb4\xa7\xdc\x4d\xf9\x09\x38\x18\xa6\x29\x07\xda\x68\x83\x78\xc1\x9d\xeb\xd2\x47\x0c\x82\xcf\xa9\x72\x84\xeb\xc8\x10\xea\xb6\x4d\x44\x39\x8c\x6c\x4c\xf0\xa5\x42\x1e\x39\x2b\xf8\xb5\xd1\xb3\x4f\xf0\x6a\x40\x43\x86\x23\x7f\xf6\xcd\x95\x8c\x02\xe5\x66\x90\xdd\xf3\x12\xe0\xd4\x0b\x2a\x00\x95\x0c\xb7\xcf\xe5\xa5\x2d\x98\xfe\xac\x38\xa9\x77\x05\x65\xb0\x57\xc6\x66\xeb\x5b\x66\x10\x28\x93\xa9\x33\x0c\x6b\x8f\xab\x43\x1b\xb3\xef\x7a\xc4\xda\x94\x0b\x1a\xd4\x46\x33\xea\xeb\x92\xa7\x93\xc8\xe3\xa9\x19\x05\x8c\x70\x4c\xd9\x5a\xba\xc0\x71\x8a\xdb\xf6\x0a\xad\x6a\x3b\x9a\x1e\x5c\xa5\x6d\xfa\x09\x22\x9b\xcc\x84\x52\xfa\xde\xdd\x66\xbe\xff\xed\x53\x94\x06\x24\x20\x10\x0d\xda\xb8\x3e\xe5\x69\x07\x58\xb9\x31\x9d\x05\x06\x1e\x52\x2c\xcc\xfd\xb6\xdb\xfc\x5a\xdc\xcf\xbe\xd4\xd2\x03\xe0\x09\xc7\xc9\xea\x9c\x64\x7f\x34\x1a\xa5\x47\x50\x2d\x8a\x17\xa7\x92\xf7\x80\x61\x20\x83\x00\xfd\x6f\x01\xba\x28\xc1\x2e\x01\x06\x8c\x5c\x8d\xcf\xc1\xbd\x08\x99\x99\xfa\x9a\x1f\xcd\xcf\x1a\x23\xdc\xa9\x5e\xe5\xea\x9b\xf1\xed\x5c\x9b\x8a\x39\x0e\xee\x87\xc2\x60\xc8\x26\x18\xf6\x26\x17\x64\x50\x49\x88\x1b\xe9\xd1\x0a\xfb\x75\x40\x8b\x69\xb3\x11\x80\x18\x42\xb4\x0a\xea\x4d\xb9\xe0\xf2\x05\x0e\x96\x28\xf7\x5c\x94\x35\x94\xdf\x78\xb5\x28\xaa\x71\x76\x0c\x20\xf0\x83\x0e\x3c\x6b\xe8\x71\x06\x81\x59\x00\x96\xa0\xed\xf3\x7c\x81\xa1\x16\x03\x00\xc4\xd2\x67\x3d\x4e\xf2\xe6\x02\xee\xc9\x21\x09\x43\xdd\x33\x20\xcc\x27\xe7\x3d\x41\xa1\xe1\x07\x04\xee\xe3\x3c\x73\x66\x80\x85\xfb\x7f\x25\x6d\x0d\xd0\x2c\x8f\xcd\xfc\x98\x2f\x66\x0f\xb3\x7a\xe0\x6c\x35\x77\x87\xbb\xa6\x09\x7d\xde\xa5\xcf\x2f\x35\x94\x73\x5e\xd7\x26\xd7\x3e\x2c\x16\x0a\xcd\xfa\x4d\xa6\xfe\x8b\xb8\xab\xe9\x20\xc0\xfa\x76\x84\x77\xa0\x26\xac\x67\xb5\xbd\x1f\x0b\x65\x6c\x22\xd7\x33\x34\x01\xcb\xed\xec\x61\xb6\xb6\xa4\x82\xa0\x3d\x5f\x1a\xc9\x3f\x34\x71\x57\xb9\xea\x55\x7d\x6b\x8f\x29\x84\x55\xc1\x1b\x97\x97\xde\xef\x84\xfb\x38\xbd\x4c\xa8\x75\x9d\x57\x26\x91\x80\x15\x32\x28\xb0\x3f\xe0\x2f\x8d\x87\x90\x00\xed\x7b\x1e\x46\x95\x8f\xee\x33\x34\xfe\xdf\x54\xaa\x5e\xd3\xc8\x08\x4a\x37\xbb\x9d\x63\x18\x1a\xd4\x60\x6a\x9a\x08\xe4\x9a\x72\xd5\x88\xc3\xd9\xa1\xa9\xf6\x29\x6b\x63\xfd\x8f\xcd\x12\x04\x79\x73\xab\x9f\x5b\x99\x3a\x60\xa6\x16\x70\x96\x9b\xd2\x33\x43\xfe\x60\x1b\x99\x17\x21\x8d\x1c\x6f\x3c\xf6\x60\x67\x78\x12\x87\xc7\xb3\x88\xa0\xde\xd5\x2f\x5e\xcb\x17\xb7\x45\x98\xa4\xf1\x3a\xb7\x9b\xb6\xa9\x11\xb4\x07\x84\x4c\xda\x7a\x32\xa4\x1c\x1c\x9d\x2e\x14\x31\xf2\x31\xf4\x35\xf1\x6d\x53\xec\xc5\x98\x2a\xab\xde\xd3\x5a\xbe\xb8\x30\x59\xae\x0c\x9c\x7a\x93\xa9\x4d\xde\xf5\xb5\xfa\x48\xcd\x5a\xb4\x2c\xf9\xfb\x8d\xa5\xa7\x63\x46\x0c\xb1\xdd\x6c\x33\xc9\x9b\x38\x31\x41\x74\x1c\xc7\x0e\x0d\xb4\x2f\x64\xca\x33\x9b\xaf\xdd\xbe\x7f\xa9\xad\x00\x3a\xd6\x1a\x97\xee\xc7\xf5\xd3\x71\xfd\xf4\x73\xb5\x3f\x74\xd2\xf6\xa0\x93\x00\x68\xe0\xa0\xcf\x03\x0c\x6b\x2b\x43\x19\xdb\xbf\xbb\xc8\xa1\x4e\x62\x43\xc0\xbe\x80\x0c\x44\xb5\xe5\x65\x7d\xfd\xd6\x7b\x5b\x3c\x60\xdc\x4a\x64\x58\xd3\x6b\x6f\xd7\xc5\xd1\x1a\xf6\x15\xf8\x40\x0b\xcf\x47\x1c\x10\x5a\xdc\x8f\x85\x32\x2a\xe3\xed\xf8\x10\x5e\xd0\x93\x3e\x55\x2d\x11\xf2\x68\xd9\xd6\x22\xf2\x91\xcb\xd3\x2c\x04\xdb\xac\x18\x96\x30\x4e\xbd\x6b\x21\x22\x7c\x29\xc8\xb3\x5f\xbd\x40\xe9\x62\xbf\x3b\x63\xb0\x7e\x52\xa6\xa2\x05\x18\x8a\x11\x71\xb9\xde\x15\xe5\x3d\x97\xaf\x50\x7e\x2b\xb2\x51\x34\x51\x4b\x2f\x8c\xb4\xc3\x89\x94\x7c\xc0\xbd\xe3\xba\xc8\x10\xdd\x85\xd5\x07\x96\xa6\x7e\xa5\xd8\x37\xbc\x05\x45\x4c\xd1\x18\x57\x7f\x59\x18\xe7\x8e\x48\xc0\x97\xfd\x1c\xd1\xc2\x59\x6c\x37\xf1\x70\xad\x54\x80\xca\x07\x6f\x29\xbc\xff\xc8\xad\x33\xb2\x83\x0a\x99\xeb\x3b\xef\xb9\xed\x2d\x51\x95\x90\x97\xf5\xaf\xa2\x7c\x35\xbb\xea\xfc\x3a\x53\xa7\x69\x89\xc9\xee\x3a\x20\x7c\xd9\xf2\x7c\xb4\xfe\x79\x87\xc4\xd0\x9a\x50\x04\xdc\x6f\xee\xee\x56\xbb\x3e\x48\x5a\xeb\xd8\x04\x9d\x76\xf3\xbb\xbf\xc2\xab\x69\xcf\x23\x26\x41\x89\xb1\x99\x21\x72\x62\x84\x58\x9f\x9a\x5b\xda\xf3\x7c\xe6\xdb\x08\xba\xd9\xa9\x2f\x25\x1c\xc5\x25\xcd\xd4\x28\x5c\xa5\x3d\x42\x5a\xf5\x31\xf4\x87\x4e\xa0\x52\x5e\x0e\xcd\x7d\xed\x11\x4a\x50\xdd\xdb\x04\xab\xd7\xf9\xe1\x05\xf6\xd7\xaa\x06\x6b\x6e\x35\x1d\x8c\x90\xf7\xf1\x70\xbf\xf9\xb1\x9f\x3d\x2d\xdb\x06\x16\x38\x8f\xdd\x61\xf3\xbf\x0a\xe3\x6b\x8f\xa8\x08\x6d\x60\xb3\xb3\x1c\x33\x4b\x53\x31\x7c\x40\x5f\x06\x58\xa3\x78\xea\x11\x45\x6a\x8f\x4a\x1a\x18\x3d\xa4\xe2\x5c\x54\x70\xf8\x18\x3d\x6b\x10\x06\xb4\xab\x45\x75\x01\xb2\x7d\x2f\x9d\xe5\x3a\x72\x1a\x82\x8b\x15\x55\xe9\x73\xde\xcc\x64\x63\xb2\x18\x66\x18\xcc\x1a\x0e\x6f\x29\xe0\x1a\x37\x9a\xc5\x66\xb7\xb3\xc4\x8e\x23\x5d\x24\xed\x31\x3f\x0c\x9a\xdd\xec\x77\x7e\x29\x2f\x28\xff\x38\x44\x62\x37\x3d\x04\x06\xd2\x7f\x3c\x3d\x6c\x16\xdf\x8f\x9b\x1f\x87\xf5\xd3\xb7\xdd\x6a\xbf\xda\xfd\x5c\xb5\x7d\x22\x86\x68\x17\x0c\xba\xb5\x3f\x26\x3c\xb0\xc1\x19\x34\x97\x0c\x7a\xe3\xae\xe8\xbb\x2e\xda\x0b\x7d\xc9\xb8\x53\x41\x18\xe1\x03\xb4\x17\xb2\x10\x33\x28\x86\x80\x7c\x02\xd3\xa9\xbd\x30\xa1\xb8\x84\xce\x37\x4f\x3f\xf6\xc7\x87\xd9\x61\x71\xdf\x9e\x3b\x61\xa4\x23\xb9\x30\x5a\x20\x46\x1a\xfa\x0c\xcd\xc6\x70\x13\x17\xd6\x5e\x44\xbd\x48\xb8\x6c\x17\xcf\xb1\x86\xa9\xb8\xed\x44\xd0\x58\xa8\xf9\x2b\x98\x9a\x8b\x4f\x53\xc0\xda\x8b\x78\x18\x52\xc7\x2f\x30\x30\xcf\x5c\x31\x57\xe2\xf7\x13\xeb\xee\x30\xc1\x50\x8f\x10\x21\x40\xfb\xaf\x38\x83\x3f\x49\x0d\xbb\xf3\x48\x89\x01\xb0\xd5\xe1\xfe\xd8\x6c\x6c\xbd\x8c\x99\xf6\x62\x3f\xc6\x4f\x64\xdc\xa6\x01\xc8\xd5\xf5\x08\x24\x9a\x72\x67\x7e\x45\xd2\x9f\x51\x6b\xe2\x27\xa6\xf2\x54\x8e\x07\x5f\x9c\xc4\xd8\x64\x46\x36\xc2\xc9\x1f\xd2\xaa\xc6\x8c\xf9\x84\x34\xb4\xf6\x12\xcf\x88\xd3\x88\x4b\x99\x6f\xcb\xf4\x54\x94\xca\x95\xba\x8f\xae\x9a\x10\x8a\xf4\x20\x8f\xb3\xa7\xfb\xd9\xe1\x30\x7b\xda\xee\x36\xbf\xff\x11\x1e\xee\xf7\xed\x83\x25\xd2\xd4\x25\x1a\x1b\xab\x59\x6f\x77\xbc\x1e\xcf\xa9\x04\x04\x32\x20\x9e\xcb\xe2\xe3\xfa\x49\x32\x6d\x34\xd8\x38\x31\x74\x66\xb8\xd3\xce\x79\x95\xca\x75\x2e\x0b\x47\x6b\xa5\x3d\x1e\x05\x68\xcc\x8b\xbf\x03\x9f\xd7\x1e\x4f\x22\xe1\xca\xe5\x2c\xd6\xec\xa5\x74\xe0\x11\xed\x09\x4f\x61\xdd\xfe\x33\x3f\x59\x0a\xfb\xb6\x85\xc5\x81\x0b\x58\x2d\xee\xad\xf8\x4e\xdc\xb6\xc6\x34\x0a\x1c\x2d\xdc\xb6\x4c\xdf\xd2\x0c\x9e\x41\xdd\x54\xb0\x69\x4f\x24\x1c\x13\x7a\xdf\xb9\x09\x27\xae\x76\x0b\xdf\xfb\x72\x23\x90\x2c\xa4\x7a\xa0\x98\xe5\x82\x5f\xda\x93\xdc\x63\x36\x0c\xf1\x98\xe6\xe9\xb6\x28\xb2\x55\x73\x67\xac\xeb\x00\x58\xe9\x6a\xa3\x09\x87\x97\xb4\x1a\xdd\x90\x94\x26\x8a\x50\xbd\xf3\xf3\x7a\x39\x26\xb5\x19\x4d\x2d\xa9\xfc\xc8\x42\xa6\x16\x37\xc8\xb0\xa6\xb9\x2d\xa6\xb6\x9f\x61\x7e\x6d\xa6\xfc\x58\x2d\x5d\x7b\x52\x47\x18\x2c\xd3\x69\x96\xe1\x08\xad\x30\xe7\xf8\x09\x60\xcb\x1a\x77\xda\x53\x31\xa3\x16\x2d\xfa\x04\xef\xfb\xba\x04\xa8\x7b\xda\x0d\xae\x97\x52\xbe\xd3\x79\x19\x69\xff\x0f\xfa\x01\xa5\x78\xb6\x77\x50\xbc\x9f\xa1\x6d\x5a\x14\x52\x67\xfd\xd8\x2f\x8f\xdf\x36\xb3\x87\xf6\xf7\x28\x44\xab\xfe\x88\x0b\x91\xcb\x34\x58\xf4\x7d\x5f\x4e\x7a\x34\xec\x20\x0e\x91\x98\xa3\x7a\x29\xde\x8d\x8d\xe1\x1a\xb8\x46\x0b\xb0\x18\x91\x71\x7f\xe3\xed\xbd\x68\x9b\x62\x78\x86\xfa\xa9\x50\xe3\x29\xa5\x19\x4d\xa0\x03\xb1\x75\xd5\x2d\xae\x3d\x89\x30\xe5\xe1\xe0\xe5\x1d\x6b\xb2\x26\x5e\x98\x70\x83\x05\x2b\xe5\x0b\x62\xc6\x1a\x0b\xe8\x36\x1e\xa9\x89\xc7\x3d\xa1\x3a\x9f\x7f\xf6\xc6\x6b\x5e\x7e\xe5\xf5\x37\x87\x48\x49\xda\xe5\xa8\x31\x35\xef\x00\x6e\xd4\x8e\x35\x21\x2c\xe2\x6d\xd1\x50\x7a\x39\xfd\xe2\x59\x36\xf8\x9c\x84\xc4\x1c\xa9\x3c\xbf\x41\x0e\xa5\x0b\x43\x4d\x44\x72\x46\x37\x40\x24\x0f\xd9\xb0\x64\xc2\x29\x2c\xb9\x77\x4b\x08\x78\x91\x6a\x79\x6f\x8a\x61\x6d\xc2\xd0\x63\xd5\x84\x26\x94\x04\x56\xf9\x15\xf2\x8a\xd7\xf0\x80\x95\xa6\x8f\x45\xde\xd8\x98\xa3\xe7\xa2\x60\xb6\x2c\xdd\xb8\xf7\xb3\xea\x52\xa6\x8f\x45\xde\xa9\x11\x69\x42\xb5\xf4\x78\xcb\xcf\x7c\xae\xe1\x48\xbd\xe1\x83\x33\x2f\x42\x60\xb5\x68\x7c\xc8\xbb\x34\xcb\x36\xe5\xf7\xd4\xd2\xed\x76\x71\x30\xf6\x9f\x1e\xc8\x22\xfc\xcf\x0d\xe2\xe2\x2b\xa0\x85\x26\x21\xf1\x03\xbb\x82\xfc\x58\x3b\x59\xad\xc1\x5d\x84\xbe\x46\x62\x3b\x13\x18\x68\x81\x8f\x88\xdd\x0b\xdc\xc3\xc4\xca\x50\x3d\xce\xd7\x87\x99\xb3\xfb\x48\xe2\x81\xea\xa4\x8f\x97\xf0\xfa\xe7\xf4\xe8\x4a\x7c\x8d\x9c\x73\x8f\xfc\xbf\x50\xd5\x57\x83\x95\xfe\xe7\x25\x97\x3d\xbb\x89\x24\x11\x40\x5f\xe3\x6b\xcb\xe5\x2b\x7f\xb6\xe9\xd7\x09\x7f\x43\x93\x04\x12\xa4\xe5\x59\x3f\xfd\x9c\x3d\xac\x97\xc7\xcd\x6e\x89\x06\xf9\xb7\xa7\xd9\xe1\xc7\x6e\x35\xdc\x3e\x09\x67\x22\x0e\x5d\xc4\xc8\x5a\x6f\x8a\xb8\xab\xf3\xc8\x90\xb5\xa2\x89\x6c\x03\x1d\xcd\x60\x9e\x5f\xd7\xcb\x3e\x08\x48\x13\x1e\x27\xbe\x70\x5c\xa3\xf8\x04\x6e\xd6\x4d\x5a\x2b\x84\x83\x49\xa1\xdb\xa2\xc6\x3b\x80\x6a\x96\x2b\x53\xe2\xf1\xcf\xc7\xc9\xe8\x92\x26\x5c\x0b\x34\x71\x90\x3f\x15\x83\xec\xee\x46\x85\xaf\x8c\x16\x55\x31\x2f\x8a\xac\xfd\x55\x48\x84\x5a\xec\x2f\x52\x42\x55\x59\x48\xcd\x40\x2d\xfe\x4b\x57\x4c\x13\x49\x5b\x2c\xc3\xfe\xcc\xdf\xf3\xcf\x50\x0f\x4d\x4f\xe1\xa2\xf0\x36\x0e\x80\xb3\xfe\xab\x99\x25\x6d\x0e\xf7\x94\x66\xaf\x73\x17\xf7\x1e\x0d\x12\x45\x63\x93\x53\xc7\x55\xae\xc5\x48\x20\x93\x32\x1d\xcd\x3d\x15\x85\x68\xaf\x08\x23\x46\xd8\xa3\xba\xd2\x04\x3c\xe5\xd9\x2d\xac\x59\x94\x9a\x6d\x67\x71\xa9\xea\x42\xa5\x3c\x1f\x5d\x12\x02\xda\x05\x20\x9c\x00\xc5\x5d\xd1\xb2\xcf\x38\xd5\xf9\xd1\xd5\x81\x1b\xb5\x4c\x21\xa7\x77\x03\x02\xc2\x28\x54\x9c\x2d\x15\xe3\xba\x79\x9b\xcf\xbd\xfd\x87\x80\xf6\xe3\xb0\xe3\xcf\x3c\x14\x96\x6e\x78\xb8\x3d\xdb\xce\x3a\xf0\xb1\x7a\x6b\x7f\x79\x6c\xa1\x19\x9a\xe8\xc4\x40\x01\x6d\x41\xc0\x9f\x25\x8c\xea\x4c\x35\xd1\x3c\xc2\xd7\x54\xd5\x25\xf0\x53\x5a\x5f\xdd\x83\x0d\xf0\x4a\xda\xf7\x34\xb5\xc8\xe4\xeb\xea\xa3\x59\xfa\x3e\x11\xae\xd5\x3e\x49\x24\xd8\x97\xbb\xcd\xf8\xb5\x6f\x02\x8e\x7a\xfa\x54\x63\x50\x11\x6b\xe9\xf4\x65\x1a\xd0\x33\xd8\xae\x7d\x3f\x10\xdc\x2e\x98\x8f\x50\x73\x2c\x98\x28\x87\x7b\x85\xef\x33\xc3\x30\xc8\x95\xda\xd7\x17\xd5\x63\xfa\x1d\xfe\x35\x18\x7f\xbe\x2f\x24\xb2\x7d\x74\xda\x0c\xf6\x0d\xdc\x90\x92\x6a\x9f\xfa\x3a\x8a\x46\x5c\xad\xbb\xa2\xf8\x74\x1e\xb9\xc3\x62\xcf\x99\x46\xcd\x62\x30\x42\x43\xba\x4e\x52\x42\x4b\x8b\x3c\x87\xba\x9a\x30\xb2\x7c\x0a\x0c\xf7\x0d\x05\x3a\xcd\xc1\xd2\xd1\x4f\x6f\xc5\xa3\x7b\x08\x88\x89\x14\xe6\xf0\xde\xb2\x80\x0e\xde\x5e\xe0\x4b\xc4\xe8\xa0\x0b\xd4\xaf\x38\x1e\xde\x41\xc0\x00\x53\xb2\x03\xad\x2a\xd7\x16\x07\x5e\x62\xc2\x16\x2d\x21\x9c\xf6\x03\x08\x10\x74\x9c\x5f\x4e\xe6\x86\xab\xd9\x1b\x4f\x33\x2c\xf6\x87\xc6\x43\x45\xfa\x89\xc9\xdd\xc1\x67\x4c\x38\xf4\xe5\xe2\x85\x37\xc3\x13\x4a\x34\x56\xfa\xb5\xa7\xda\x67\x61\x98\x58\xd3\xf0\x2e\xcd\x60\xb2\x10\x4d\xfb\x2c\x32\x32\xfb\xcf\x50\xff\xc4\x4a\x63\x5b\x44\x31\x30\x0b\x7c\xc6\x29\x02\x63\xb6\x3f\xe6\x0f\xeb\x05\xf2\xc9\xee\x0f\xb3\xdd\xe1\xb0\x7e\x5c\xed\x0f\xb3\xc7\x6d\xdb\x51\x85\xc8\x65\x83\x9c\x50\x1d\xdb\xae\xf6\x19\x48\x8c\x1e\xb4\xda\x73\x77\x70\xeb\xe9\x8c\x9e\x13\x24\xa8\x81\xbd\xd2\x27\x1c\xd3\x7e\x08\x1a\xdf\x83\xb8\x5c\x67\xea\x2b\x8f\xc1\x8f\x48\x84\x31\x90\x1f\x4f\x77\xbb\xd5\xea\xdf\xab\x1e\xbf\xb7\xf6\xa3\xd8\x84\xef\x94\x01\xc0\xac\x3e\xd2\x7a\x18\x75\x1f\xc6\x93\x3e\xff\xcd\x9d\x4f\x82\x93\x95\xda\x67\xc5\x33\xcf\xed\x76\x38\xba\x25\x05\x58\x80\x3d\xbf\xd6\xb0\x32\xfa\x86\x4e\xb6\x52\xfb\xb1\x4f\x70\x5c\x66\xc5\x7b\x3f\xc0\x37\xeb\x0b\x2d\xb8\xae\x01\x4b\x4c\x10\x4a\x17\xc7\x43\x07\x9b\x6b\x4f\xc5\x35\x9e\xea\x85\xe7\x2a\x83\x39\x8c\x67\x6f\x2c\x03\xf4\xbf\x67\xeb\xdd\x72\xb7\xd9\x1e\x91\x29\x12\x45\x96\x16\x6d\xe4\x59\xfb\x49\x24\xfc\xd6\x68\xae\xbe\xa5\x6f\x9f\x70\xa2\x69\x3f\x89\x13\xc4\xea\x22\x65\x11\x4a\x8e\x54\x43\xbb\xc2\x4f\x92\xd0\xd5\x2b\xda\x1d\x64\x7e\x5d\x55\xb2\x2c\xde\x47\x34\x63\xda\xe7\x3a\x46\x76\x93\x8c\x57\xf5\xc2\x01\xb9\xfa\x14\x02\xda\x17\x1e\x04\xa4\xab\x2c\xec\xa4\x42\xb5\x2f\x20\x21\xda\x86\x57\xed\x4f\xd2\x0a\x74\x1b\x74\xa7\x9a\x5f\xf7\x85\xae\xdf\x79\x39\x90\xad\xd7\xbe\x54\x89\xd1\xaa\xba\xa8\xd4\xa8\xdc\x95\x2e\xa8\xe7\xab\x88\x0b\xd6\xcf\x95\xa7\x45\x6e\xf9\x19\x5c\x17\x00\x21\xa9\xd1\x99\xdf\xf7\xeb\x63\x6c\x3b\x25\xb1\x42\x05\xe5\xff\x3f\x8c\xcb\xf0\x85\x53\x22\x25\x06\x91\xb5\x29\xb1\xea\x03\x80\x26\xf3\x96\xb1\x3b\x0e\x28\x16\xf1\x9c\xd2\xdc\x94\xa6\xb7\xc0\x50\x4d\x7d\x69\x88\xa7\xe0\x94\xd6\x77\x97\x7e\x05\xc8\x5f\xdc\x8c\xaf\xc0\x33\xb6\x1b\xe2\xbe\x8e\x67\x0c\x0c\x1e\x5f\x8a\x4e\x89\x40\x53\x1a\xf8\x31\xef\x80\x1f\x45\x86\x1b\x8c\x5d\x06\x77\xf0\xbf\x4b\x5a\x82\xba\xe3\xe9\x28\x15\xa3\x29\xe5\x1e\x82\x6e\x78\x69\x62\x8d\xf6\xe7\x20\xe4\xe8\xb3\x34\x77\xfb\x65\xaa\x56\xd3\x20\x16\x41\xe8\x34\xd8\x5b\x06\xc3\x4d\xde\xe3\x8c\xb6\x3d\x43\xc6\x90\x80\xde\xd0\x9a\xf4\xe6\xcd\xe8\x8c\xa1\x16\x4a\xb6\x26\xd1\x23\xff\xb0\x2a\x72\xbf\x20\xfd\xf4\x08\x40\xbc\xc9\x8b\x29\x6d\xeb\xf9\x9f\x34\x0a\x08\x8e\xad\xc6\x4c\x18\x93\x6c\x7d\xfd\xe2\x23\x50\x28\xfa\xd8\xd5\x39\x94\x29\xbc\x8d\x7c\x63\x1a\xd3\xa4\xb5\xdf\x4c\x9e\xa2\x1f\x90\x71\x2e\x10\x4d\x24\x47\x94\x1f\xd6\xf5\x0c\x26\x2f\x15\x44\x23\xe4\xd6\x68\x8d\x8e\x77\xd9\xa1\x50\x96\x3b\x24\x4e\xb0\x22\xea\x74\xad\x91\xaf\xb1\x87\xf1\x71\x3d\x44\x62\x45\x32\xe5\xeb\xb2\x78\xcf\x2d\x1d\x89\x6d\x55\x1e\xc3\x8a\x22\x84\x11\x0d\xce\xac\x48\x40\x8c\x5a\x6a\xbd\x29\xd3\xe7\x34\xc7\x40\xe9\x17\x9a\x05\x7f\xe7\xaf\x89\xf4\x56\x73\x25\xe9\x5b\xac\xd2\xc3\xf9\x91\x7f\x18\x35\x9e\xd1\xdb\x55\xd4\xf3\xe8\x44\xbd\x9a\x71\x21\xbf\xb4\x86\xa8\x62\x86\x8f\x1d\x23\xd5\xc0\xcb\x7e\x22\xdd\x75\x01\x15\xdb\x9d\x1a\x21\x6d\x96\xa4\x74\xb0\x27\x52\xa5\x3d\x1e\x3b\x1e\x02\xc7\x88\x93\x9e\xc6\x94\x68\x9a\x6a\x5f\x8a\xae\xd6\xf7\x0e\xc0\xe5\xc5\x47\xd6\x06\x6d\x8c\x69\x4c\x52\x35\xd3\x73\xc9\xd3\xec\xea\x48\xb2\xa7\x9f\x44\xb3\x08\xa7\x58\xfb\x16\x0c\x7e\x7e\x7c\x56\x49\x90\x06\xce\xc4\xc5\xcd\xd7\x9b\x5f\x3b\x2b\xa6\x77\x3e\x45\x9c\x32\x22\xf1\x0c\xd6\x7d\x20\x1a\xaf\xa9\x06\x85\x5b\x60\x6d\xb0\x0b\xa6\x20\xd6\xbe\x90\xc0\xf3\x8d\x3e\xc5\xfe\x7e\xb6\x5b\xdd\x6f\x1e\x96\xab\xdd\xfe\x88\xff\xe1\x7a\xf8\x9e\x07\x96\x72\xd8\x8e\xcb\x8d\xc6\x20\xe4\x90\xfa\x73\x70\xff\x81\x1f\x28\x6e\xb4\x18\x2f\x79\x9d\x42\x75\xec\x53\x67\xe8\x80\xc6\x9c\x58\x87\xe6\x2d\x55\xd0\x2b\x68\xbb\x03\x50\x62\xac\x1d\x31\x72\xff\x02\x1a\x2b\x84\xa9\xd8\x5a\x3c\x03\x5c\xf8\x6d\x62\x15\x0f\x82\xc8\x47\x2c\x0d\x1a\xc8\x66\xc9\xb8\xc5\x5f\xeb\x80\xf9\xbe\xf0\xba\x84\x56\x96\xa5\xcf\x90\xa3\x5e\xf6\x28\x9b\xd9\x74\x15\x89\x41\x29\xed\xeb\xa2\x3c\xcd\xd3\x52\x8d\xf2\x31\x01\x0b\x62\xcc\x2c\x76\xd5\xd2\x2a\xad\x7f\x1b\x59\x44\x6d\x58\x3d\x60\x51\x94\x68\x9b\x97\xb2\xfc\x0f\x69\xfd\x92\xe6\x7d\xdd\xdf\x7f\x8c\x6e\x42\x52\xe4\x51\x70\x7a\xb8\x7b\x54\x9a\x99\xb6\xbe\x83\x30\x94\x58\x34\x60\xf4\x85\x0e\xf1\xea\x77\x34\x62\x8e\xfb\x1f\xdb\xed\xc3\x1f\xee\xa6\x63\x9f\x60\x80\xd5\x82\x74\x52\xdd\x85\x42\xff\x3a\xa5\xaf\x83\x18\x4c\x01\xc6\x33\xd4\x47\x9e\x65\xcd\xce\x76\x1a\x0b\x85\xea\x20\x09\x24\xef\xe8\x64\xc6\xd4\x19\x97\x21\x1a\xd1\x1d\xc3\x18\xb1\xc5\x9b\x4e\xc5\xed\x0b\x6c\xb8\x0e\x78\x98\xe0\xfe\x71\x30\x2a\x51\xaf\xbd\x0d\x24\x10\xd4\x43\x6b\xbe\x59\xb9\x1f\x31\x57\xd8\xa3\x66\xd1\x81\x88\x13\x8f\xbb\x72\xc4\x43\xd8\x12\xbb\xb6\x03\x4f\xaa\x90\xd9\x71\x32\xcb\xb2\x03\x64\x59\x8b\x5f\xd3\x81\xf2\x0c\xdd\xad\xf5\xc1\xff\x75\xe1\x59\xcb\x24\x35\xbf\x0e\x1c\x86\x40\x35\x03\xd3\x89\x92\x23\x63\xab\x6a\x53\x92\x81\xd2\x01\x6a\x2e\xf2\x4f\x12\x1e\x93\x5b\x5c\x00\x44\x60\x4a\x41\x1b\x07\x65\x8f\xe8\x0e\xc7\x66\x3f\xe9\xdc\x34\x4e\x96\xe1\x8a\xab\x8b\xf3\xa0\x4e\x55\x07\x20\x8d\x6c\xdc\xf6\x22\x26\x12\x3c\x01\x68\xe2\x13\x87\xec\xc7\x0c\x03\x66\xed\x56\x6d\xc6\x5c\xa3\xe3\xa9\x31\xca\x90\x2b\x7e\xbd\xc3\x3f\xfb\xa6\x69\xa0\x39\xe3\x9d\x88\xf5\xce\x72\x95\x0c\x67\x26\xf3\x88\xc6\x9d\xc5\x46\x25\x2e\xf5\x6d\xcd\xc1\xe8\x80\x40\x45\xfe\xc0\x7c\x5e\xe7\xdb\xcc\x55\xed\x68\x46\x48\x5b\x28\xb6\x84\x37\xc8\x8a\xf3\x2d\x5d\xb8\xeb\x2a\xb4\xb3\x86\xe6\xa9\x5a\xab\xae\xf6\x55\x33\x5f\xf8\xc2\xf2\x99\xa3\x84\xd8\xe5\xbc\xd6\x8b\xc3\x72\x74\xf7\xbe\x94\xda\x68\xcc\xe7\x80\xc4\xb8\xe5\xd5\x45\x08\x19\x25\x7e\x68\x82\x24\x97\xca\x80\xe2\xba\x35\x81\xd1\x98\x1b\x22\x6b\x9e\xe6\x9f\x70\xf4\x68\x46\x21\x46\x50\x49\x75\xe2\x65\xdd\x38\xe8\x50\xd6\x37\x4c\x0b\x83\x80\xf7\xdf\x1a\x49\xac\x19\x82\xb1\xab\x5a\xaa\xe5\x8b\x2b\xf3\x1b\x0c\x1e\xc6\x68\x82\xf1\xb5\x3d\xf4\xc0\xc4\xdd\x49\x58\x28\x7c\x8c\x38\xe6\x12\x8a\x0b\xda\xf7\xdb\xd6\xc6\x65\x2c\x36\xc5\x19\x46\xd4\x75\x7c\xa8\xf6\x13\xdf\xd8\xff\x6f\x50\x36\x2b\x72\x71\x5f\x67\xf2\xb3\x22\xe9\x9b\xbf\x87\xf7\x19\x51\x89\xc1\x33\x07\xa7\xdc\xc1\x1b\xe4\x8e\x2c\x4c\xb3\x28\x0c\x88\xb5\x2c\xee\x8b\x31\xa4\x57\xb3\x38\xf2\x02\x84\x75\x39\xa6\x0d\xcd\x62\xc5\x64\xd2\x33\x92\x7f\xec\x97\x1d\x41\x89\x66\x49\x48\x31\xb2\xdd\x56\xd6\xfc\x51\x5c\x4a\xdc\x49\x56\x6f\xe3\x79\xc4\x78\x00\x22\xe9\x51\xe2\x0e\x2a\xf0\x47\xc3\x91\xeb\x88\x26\x6e\x38\x96\xf5\xcb\x0d\x5d\x84\x66\x82\x52\x14\xc2\x53\xbc\x86\x55\xae\xd6\xb2\x70\x77\x25\x12\x8d\x9f\xe3\x5c\xbc\x43\xe9\x4f\xfa\x50\xad\xac\x95\x3b\x84\x87\x58\x39\x6c\xd1\xb4\x1b\x37\x71\x99\x0c\x8d\x17\x83\xe0\xc1\x4d\x3e\xbe\x09\xe5\x85\xd2\x1f\x28\x7b\xc2\x60\x80\x8c\x46\x9b\xb2\x72\x50\xf2\x85\xa7\x43\xae\x66\xcd\x20\xb4\x50\xd8\x56\x24\x56\x8d\x9d\x37\xdb\x53\x33\x93\x68\xb3\xab\xdf\xd8\x9e\x63\x5a\x72\xac\xe7\x1c\x17\x1d\x35\x2d\x02\x8d\x7e\x7e\xa9\x5f\x0a\x2c\x53\xee\x6f\x6c\xa1\x17\x32\xb0\x4b\xfe\xd1\x12\x3a\x1c\x79\x29\xd2\xba\x3a\x62\x8a\x79\x78\x1f\xa1\xc7\x01\x4b\x7a\x1d\x80\xc8\xe2\x57\xa6\xa9\x39\x74\xe8\x69\x13\x31\x3e\x59\xd9\x72\xa8\xaa\x99\x52\x13\x26\x4a\x48\x3c\x88\x02\xa7\x80\x2d\x33\x5e\xf6\x41\x22\x21\x89\x44\x8c\xc9\xb3\xfc\xd3\x34\x82\xeb\xa9\x04\x92\x87\xfd\x5c\x7d\x9b\xed\xdb\xc3\xb5\xc6\x12\xb5\xd7\xab\x80\xf2\x09\xea\xf7\xa2\x7c\x1d\x59\x35\xa1\x1f\x44\xda\xc9\x81\xbf\xa4\xa5\x0b\xbe\x8d\x50\xad\xb6\x73\xc0\x12\x0c\xae\x65\xbc\xc2\x44\x73\xfe\xdc\x87\x94\x84\x41\x6c\x24\x42\xac\xb2\x07\x86\xd3\xaf\xe3\x53\x70\x8e\x81\x41\x6e\x39\xac\x1f\xfa\xc7\x0b\x5f\x40\x2b\x21\x36\x7a\x42\x46\x35\x1e\x78\xac\x6c\xc4\xa0\x57\x1c\xee\xba\x30\x1e\x76\x24\xa9\x18\x9b\x68\x17\x8f\x76\x11\x0e\x99\x94\x48\x0a\x04\xf5\xcb\xa1\x18\xd1\xf2\xf7\xba\x45\x24\xc4\x12\xa7\x76\x90\x3a\xc1\xbd\xb2\xe4\x63\xe2\x25\x1d\x46\x01\xb1\xf4\xf4\x6a\x5e\x14\xaf\x68\xb9\x59\xfe\x07\x32\x9a\xf1\x61\x14\x24\x71\x47\x79\xf0\x63\x0f\xff\x33\x1e\x80\x6b\x66\x81\x32\xca\xfa\xf9\x40\xbb\x4b\x87\x91\x50\x18\xb3\xcb\x11\x47\x3a\xe6\x5d\xd0\x61\xa4\x01\xb1\x5e\x0f\x9b\x6f\x47\x1c\x6c\xf6\x96\xbf\x62\xae\xd6\x61\xa2\x14\x35\xb8\x66\x64\xc9\x77\x9c\x2f\xa3\xef\xc6\x83\x76\x41\xdd\xf1\x5c\x15\xa7\xf8\x86\xb7\xab\xe9\x64\x92\x58\x0b\x5e\xf3\xac\x78\x76\xe4\x48\xae\x55\x1a\xc9\xef\x67\xa8\x1f\x40\x3d\x43\x69\xc2\xda\x83\x79\xc9\x95\x0e\x62\xc7\x4b\x72\x45\xc3\x60\xb8\xf3\xd9\x7e\x82\x18\x04\xeb\xdb\x05\xb6\xfc\xba\x3a\xdc\x2f\x31\x9c\x34\x98\x3d\x22\x88\x90\xc1\x16\x87\x13\xc6\x07\x5b\xf5\x31\x1d\x4a\x4a\x23\xa3\x94\x5e\xbc\x23\x85\xe1\xf1\x9e\x67\xed\x48\x92\xa1\xa1\x77\x3d\x00\x3f\xf5\xca\x14\x26\x9d\xe5\xfe\xa0\x91\x71\x84\xbb\x84\x09\x13\xf7\xcc\xa2\x50\x8a\x80\x6a\x37\xee\x7b\x2f\x45\x4a\x23\x95\x65\x10\xea\x53\xbe\x60\xa8\xbc\x00\xbb\x98\x69\xb5\x07\x50\x0b\xc3\x2c\x90\x3a\xe5\xa5\x78\x58\xb6\xf1\xf7\x0c\x82\x50\x11\x23\x26\xfe\x70\x79\xbb\xd1\xf0\xd2\xa1\xf2\x3d\xde\x32\x61\x36\x5e\xf0\x5d\xf1\x35\x5c\x2f\x54\x94\x83\x11\x33\xd6\x97\x5c\x75\xd0\x85\x50\x25\x11\x36\x3c\xf2\x57\xf8\x8a\xe5\x64\xd2\x13\x19\x0c\x30\x95\x00\xc6\x3e\x8e\x15\xd4\x35\x56\x46\xef\xa0\xea\xe5\x1d\x42\x25\x35\xae\xa7\xdb\xa2\x5d\x05\x15\xc4\x94\x38\x6a\xec\xe2\x74\xce\xe0\x63\x51\x9c\xc4\x68\xb0\x68\x29\x9d\x55\x68\x6d\xe6\x9e\x5d\x18\x79\x94\x21\x46\x6a\x89\xd2\x10\x28\x9d\x80\x16\xb8\x7b\xc4\x88\x50\x1f\xcd\x26\xfc\xe6\x4b\x38\x15\x5f\x19\x6c\xee\x98\xc0\xb0\x08\x3a\x13\x66\x96\xdd\xc8\xa6\xb8\xf5\x25\x22\xa0\x71\x27\x38\xf3\xc6\x98\x19\x98\x42\x91\x0f\x44\x5a\x4c\xef\xe2\x85\x9f\x86\x84\x42\x3a\xa2\xc4\x8b\xa3\x56\x4a\xe7\x46\x43\x5f\x47\x34\x48\x42\x1b\x0a\x98\xcf\x97\x13\x56\x5f\x44\x93\x5e\xec\xf2\x74\x6a\x29\xe1\xe8\xf0\x81\x68\xa2\xb5\xad\x77\xbe\x2f\x2e\x55\x9f\xc0\x59\x47\x54\x44\xba\x05\x78\xe4\x69\x7d\xbd\x4b\x73\x9e\xcb\x94\x67\x56\x7c\xaf\xed\x17\xa3\x5f\xbb\x3f\xcc\xbe\xaf\x8e\x06\x5c\xf8\xb8\x7e\x3a\x1e\xee\x77\xab\xfd\xfd\xe6\x61\xd9\x76\xd4\x04\x77\xae\x8e\x12\x6f\x36\x1c\x9d\xa3\x67\xd0\x11\xb1\xae\xec\xe6\x3d\x3b\xa1\x5c\xc6\x0e\xfe\xe7\xce\x16\x44\x01\xf2\xde\x22\x5a\xb0\x8f\xf6\x1f\xbd\x8a\x80\x4b\x94\x27\x13\x97\xeb\xea\xf9\xb9\xfd\xfe\x81\x0a\x90\xdd\x55\xd7\x20\x5f\xd2\x3f\xdd\xcf\x8c\x19\x22\x13\xed\x9e\xd5\xc9\x19\xb8\x76\xae\xb1\x76\xc2\x8a\x66\x9a\x35\x0a\xa9\xcf\x5b\xc7\xc9\xf5\x94\x01\x6e\x30\x38\xda\x31\x5b\xd3\x81\x39\x86\x77\xc8\x20\xa1\x5e\x8b\x1b\x5d\x3f\x1d\x56\xbb\x9f\x2d\x74\x29\x0a\xb9\x87\x79\x4b\xae\x94\x61\xd9\x2d\xca\x43\x31\xcd\xb3\xae\xa3\x66\x3d\xeb\xf4\x12\xf7\xe7\xa2\xac\x0d\x58\xe0\xd3\x62\xb1\xe6\x18\x81\x9e\x58\x33\xdd\xbe\x35\x36\x2d\x32\xcd\xe3\xba\xb6\xd9\xcc\xdd\x6d\x44\xbe\x41\xed\xda\x40\xdc\x25\xbf\xa1\xfd\x73\x1d\x93\x08\x89\x01\x97\xe9\xa9\x27\x07\xa7\xa3\x48\x03\x38\xa1\xf9\xc2\x68\x0d\x20\x68\x19\xaa\x1a\xcd\xf6\xe1\x14\x49\x02\x0f\x83\x31\x0f\xc5\xf3\xfc\xf2\x49\x0c\x2f\xe2\xd2\x60\xa4\xea\xa2\x79\x19\x86\x38\xb3\x28\x07\x21\xae\x88\x83\x82\xc4\x66\x57\xcc\xd3\x4f\x9f\x4b\x70\xc0\xf5\x00\x01\x86\x48\x36\x3f\x68\x96\x2a\x8c\x5b\x9a\xed\xe6\xb5\x3a\xd6\x6f\x1b\x2c\x1b\x0d\x3a\x15\x24\x0e\x32\xff\x73\xbd\x1d\xbd\x21\xc5\xcc\x2d\x59\x79\xcc\xdd\x62\xda\x22\x8f\x54\x1c\x61\x29\xcb\xb6\x48\xab\x3e\xb1\x8d\x8e\x14\x57\x21\xef\xc9\x14\x7d\x95\x55\x8c\x20\xf2\x62\xcb\x63\x9c\xa7\xff\x1b\x9c\x07\x04\x73\x9c\x52\xf7\xc5\xfb\xe3\x45\xbe\xfc\xc8\xeb\x34\xb3\x6c\x76\xc7\xd1\x43\x69\x69\x24\x12\x17\x0f\xeb\xd5\xd3\xe1\x78\x58\x3f\xae\x8e\x87\xcd\x71\xb9\x5a\xac\x97\x2e\x4c\x19\x7b\xc4\xc7\x7d\xde\xc0\x62\xb8\x68\xeb\xad\xc6\xc0\x90\xd8\xa3\x8c\xd8\x05\x7c\x53\x1a\xd0\xa6\xe3\x17\x73\x7f\xdf\x01\xfc\x4a\x73\xd5\xe2\x3c\x63\x42\x18\x12\x55\xd5\x03\x0e\xd5\xc1\x6d\xc6\x24\x32\x92\x49\xf5\x3a\xaf\xea\xde\xb2\x19\x13\x91\xb8\xca\x25\xcb\x39\x3f\x3d\xae\x62\x3f\x01\xb0\x36\xcd\x8d\x8b\xe6\xba\x68\x8d\xf9\xbc\xb4\xb2\x95\x3d\x23\x7e\x17\x1d\x53\x6d\x32\xa7\x75\x7a\x02\x4b\xab\x3f\x7c\xfe\xc0\x8b\xd0\xf8\x55\x70\xe2\xb9\x3a\x94\xe9\x88\xb9\xb2\xe9\x21\x1d\x24\xe9\x31\x7d\x2e\x91\x1d\x62\x32\xd7\x1e\x07\xc4\x30\x22\x1d\x79\x8f\xe3\x6b\xfa\xe1\x18\x51\x18\xa8\x9e\xa7\x39\x5c\xca\xbe\x6a\xa2\x8e\x59\x14\x62\x50\xb5\x59\x53\x6d\x44\xde\x24\x39\xda\x52\x24\x1d\x87\xd4\xa8\x2d\x5c\x5a\xb1\x11\x1d\x87\xb1\xc0\xd0\x36\xb2\xbe\xef\xd3\x5c\x82\xef\xb5\x6d\x42\x21\x25\xc2\xfc\x72\x6d\x96\xc9\xbb\x22\xcb\x1a\xdf\x77\xf4\x00\x91\xdd\x89\x50\xb0\xd8\x45\xee\x6d\x5b\x4c\x23\x9c\x7b\x8b\x66\x3f\x44\xb8\xdf\x46\x77\xe4\x4b\x83\x75\x23\x8e\xad\xaf\x60\x54\x3e\x66\x59\xb6\x2d\xb2\x0c\xb7\xb5\x51\xdc\x24\x4e\x98\x47\x49\xaf\xf6\xec\x53\xe4\x78\x1b\x02\x8d\x93\xd0\x60\xb4\x4a\xa3\x25\x35\xfa\x5a\x22\x31\x1f\xfc\x19\x0c\x3b\x45\x4f\xd0\x5f\xc7\xd2\xe7\xb8\x21\x8b\xc6\xfd\xf2\xfc\x76\x40\xab\xc0\x33\xe1\x5e\xd4\xd4\xeb\x1c\xa4\xe1\xbd\x2a\x4e\x70\x0f\x33\x76\xdd\x90\x96\xf8\xa6\xe0\x69\x78\x57\x4a\x05\x2e\x96\xba\x39\xa7\xf9\x0d\xea\x29\x06\xdf\xf0\x19\x3f\xa4\xf9\xeb\x60\x30\x40\xe8\x23\x72\xfa\x5b\x09\xd0\xf1\x44\xdb\x46\x2d\x18\xaa\x37\x41\x29\x7d\x9f\x7e\xe6\x5d\x7f\x72\x4f\x5a\xc6\x60\x0b\x39\x9f\x0a\x03\xcd\x32\x25\x07\xdf\xe1\xfa\xfb\x27\x13\x4e\x43\x88\xe4\x57\x8d\x55\xb1\x3a\xfe\xb1\x9a\xed\x8e\xdf\x57\xab\x6d\xab\x0c\xad\x63\xad\x95\x2b\x57\x3d\xda\xac\xb7\x8b\x10\x9c\xc6\xc6\x72\xe2\x79\x46\x72\x34\x87\x8f\x1a\x49\xd1\xb6\x45\x91\xb9\x0c\x86\xed\x43\x7d\x85\xcf\x78\x74\x72\xad\x86\xa9\xa2\xfe\x7b\xba\xab\x3a\xa1\x2c\x41\x88\xa6\xec\x88\x41\x5d\x4b\x92\x30\x65\x09\x56\x9e\x8a\xba\x2d\xb4\xd7\x09\x15\x89\x5b\x7a\x1a\xc3\xed\xd2\xd8\x5d\x37\x3a\xdb\x3a\x09\x98\x19\x4e\x3d\xf2\x94\x21\x11\xcc\xf0\x4e\x18\x4b\x0c\xc9\xac\x91\xe5\x46\x1c\xea\x8f\x73\x57\x27\xed\xba\xc5\x24\x30\x5a\x53\xf9\xf3\x03\xb4\xb6\x52\xc2\xb8\x17\x58\x01\xb9\xcf\x72\xf6\xae\xa7\x52\xb8\xc9\x57\x2f\xc5\x79\x5f\x17\xa5\x8d\x38\xb9\x56\x48\x9c\xa4\x0f\x42\x40\x96\x65\x71\xae\xc6\xfb\x42\x12\x12\x8e\xcc\xb5\xbb\xd9\x61\x75\x3c\xac\x57\x3b\xea\x8e\x0f\x7d\x11\xf9\x3d\xae\xce\xcf\x61\x6a\x49\x18\x7a\xa0\x2c\x45\xce\xa1\x40\x6e\x6e\xd7\x12\xc7\x88\x7b\xd9\xf2\x8b\xdd\x55\x47\x11\x96\x24\xe4\xc2\xca\x55\x98\xec\xf4\x8f\x66\xbf\xef\x18\x53\x75\x12\x0a\x23\x55\x6e\xac\xac\x27\x78\x9f\xd2\xbc\x6a\xba\x49\xcf\x6c\x85\x46\xd9\xaf\x8f\x4d\x20\xe1\x3f\x86\xff\xe9\x8e\x91\x4a\xa9\x7e\xd4\x72\x5b\xc2\x2d\x9b\xb6\x4e\x42\x05\xd2\x24\xab\x70\x5f\x30\x8e\xfb\x92\xd7\x9c\x8c\xa3\x96\x7f\x59\x05\xf3\xf7\x06\x73\x08\x1e\x46\x3d\xdf\x0d\x95\xbe\x71\x01\xda\x11\x12\xea\x00\x47\x4e\x9d\x42\x49\x1e\x1c\xc9\x4f\xf3\xbb\x29\x1c\x41\x3a\x38\x95\xd6\x33\x24\xe4\xc1\x18\x94\xad\x04\x9e\xbe\x5a\xd4\xfc\x9f\x43\xd4\x0c\x69\x44\x75\x12\x27\x89\xc1\xad\x5c\xeb\x97\x22\xef\xd9\x98\xcd\xac\xf2\x6c\xc4\x7c\x0b\xc5\xb9\x3b\x24\x69\xac\x68\xcb\x11\x06\xe5\x12\x6e\xfc\x36\xd7\x8f\x27\x8e\xde\x64\x5e\x94\x65\xf1\x6e\xf9\x02\xe7\xd7\x8d\xf8\xaf\xcd\x42\x39\xc4\x70\x92\x88\xc8\x94\xce\x98\xaa\xe0\xae\xf4\xba\x69\x8a\x7d\xcb\xd6\x3a\xbf\x94\xb9\x55\x33\xfb\xd2\x1b\x4f\x44\x24\x64\xec\x2a\x66\x4c\x98\xab\x97\x33\x4b\x84\x36\x61\x60\xd3\xfc\x71\x07\x30\x5a\xae\x84\x56\x68\x2e\x6e\x7e\xae\xf7\xf3\xcd\xe6\xfb\x6a\x69\x9c\x31\x03\x95\x72\xbd\x24\xf3\x99\xc1\x6f\x16\xe5\x30\xc4\x9a\x48\x26\xb0\x98\xdc\x06\x9a\x8f\xe7\xe1\xf9\x55\x10\xa3\x5d\x75\x3f\x7b\xb8\x43\xe3\xaf\x6d\x88\x8c\x94\x4f\x63\x3a\x1b\x6f\xc3\x35\x00\x41\xee\xdc\xa3\x99\x85\xfd\x64\xa1\xed\x01\xdc\x78\xc2\x3a\x4b\x9f\x5f\xea\x65\x91\x0f\x84\x29\x74\x02\x02\x3c\x1b\xd3\x58\x16\xc6\xff\xef\xaf\x28\xdc\xa3\x91\x0c\x7a\x94\x00\x8f\x69\x5e\x37\x6f\xa6\x2c\xce\x5f\x23\x19\xb8\x17\x51\x24\x1a\xe0\x4a\x61\xf0\x6c\xd4\xca\x03\xd4\x88\x3a\x22\xcf\x4d\xfe\xc6\xab\xc1\x7d\x71\xe2\x19\x12\xf3\x67\xa8\x55\x2b\xa3\xac\x39\x21\x4a\x39\xf6\xc3\xb4\x54\x45\x79\x1e\x02\x57\x7a\x91\x27\xee\x7b\x1c\xd5\x74\xd3\x0a\x39\x5a\xda\xcd\x81\xfb\xd4\xe8\x69\x3f\x43\xbd\x96\xc5\x12\x74\xc6\x3b\xcc\x1d\xf7\xa5\xc0\xd4\x27\x5a\x20\x6a\xaa\x3c\x86\x53\x65\x20\xab\x15\xd4\xfb\x83\xc3\xe7\x0e\xde\x3b\xa7\x00\xba\x4f\x00\xe9\x96\x58\x1e\x78\x21\xaa\xa4\xcd\x91\xbb\x62\xf1\x92\x9e\x91\x81\x61\xf0\xf0\x01\x35\x39\xc9\x67\xa8\x67\x65\x6d\x4a\xd5\x3a\x3d\xf5\xe1\xa8\xe6\x41\xcc\xb1\x90\x29\xad\xf6\xfc\x04\x4b\x3e\x4d\x17\xa4\x79\xc0\x19\xb5\x27\x45\x16\xc2\xf9\xe8\x8b\x04\xca\xc3\x48\xe5\x91\xbf\x41\xc9\x9f\xd1\x5c\xfb\x22\x9d\xc1\x19\x49\xb4\x8d\x80\xf4\x44\x69\x34\x0f\x99\xc2\x31\xf9\x6b\xf7\xd0\xb7\x76\x78\x18\x25\x98\x6c\xb3\xea\xbd\xa3\xab\x87\x3c\x44\x0d\x28\xe9\x82\x8f\x53\x64\xd2\x9a\x87\x92\xeb\xd0\xf1\x77\x76\x01\xe5\x71\x39\x16\x0f\xa5\x42\x65\x1c\x8b\x3f\x5b\xd5\x2f\x3f\xaa\xf1\x25\x23\xa0\x38\x51\xcf\x19\x28\x44\xbe\x8c\xb6\x00\x1e\x47\x1a\xe3\xdd\x06\x51\xf7\x85\x3f\xc3\xe3\x38\x42\xdf\x1d\xe5\x1e\xce\xbc\xaa\x3e\x53\x86\xd0\x3c\x89\x7c\x30\x34\xbc\x1f\x2d\xaf\xe1\xaa\x6c\x07\x78\x92\x04\x26\x6b\x7b\x46\xd5\x50\x8c\x07\x57\xf3\x2b\x96\x72\x0d\xaf\x99\x24\x0a\x01\x2d\x98\xb9\x4c\xf3\xe7\x23\x86\x91\xaa\xf6\x44\x82\x29\x13\xc2\x02\x75\x14\xbc\x82\x63\x1f\xec\xcf\x13\x08\x94\xec\x86\x58\xb3\xd5\x6c\xde\xdb\x56\xee\x2b\x16\xb8\x4a\xd8\x13\xac\x32\x7e\xae\xba\xf9\xc3\x63\x8e\xa2\xaf\xb6\xee\x0e\xaf\x7b\x37\xae\x4c\xe5\xc2\xb7\xc2\xed\xf0\x3e\x24\x53\xfd\x64\x3c\x09\x5f\xa2\xfd\x69\xa3\x24\x77\x65\x91\xd7\xad\x4e\x9d\xe6\x32\x32\xf8\xce\x67\x93\x3b\x34\xab\xdd\x7a\x24\xe7\xab\xb9\x4c\x24\x46\xee\x30\x65\x87\x39\xac\x5f\x90\xee\x78\xda\xbb\x7d\xc9\x63\x4b\x48\x6e\xd7\xcc\xc6\x78\xb1\x02\xa2\xd3\x3b\x07\x57\x81\x17\xf0\x0e\xa8\x39\xc2\x88\x8f\x1e\x44\x31\x19\xf3\xee\xf5\x18\x3e\xa6\x2f\x03\xba\xee\xc0\xc4\x60\xa6\x97\xfb\xc3\xb1\x83\x88\x73\xa0\x3e\x73\x60\x3d\xfe\x81\xbb\xfc\x24\xf3\xad\xe6\xc0\x03\x14\x4c\xbb\x2b\x79\xfe\x6a\x61\x21\x90\x93\xf6\x44\x8a\x26\xa1\x0b\x7b\xfe\x2c\x1a\x2b\xe3\xae\x28\xf7\x90\xab\x5f\x90\x36\xae\xe3\xea\xc3\x04\x9f\xdc\x01\x3a\x31\x21\x29\xbb\x5f\xdd\x7e\x63\x0d\x10\x18\xc0\x5e\x5d\x17\xfd\x7d\x43\x78\x2c\x42\x00\x4c\xab\xac\x8f\xa1\x82\x3a\x1d\xf2\xe8\x0c\xce\x26\x3c\x4e\x65\xcb\x6d\x6a\xf2\x0c\x58\x6c\xd4\x9e\x53\x99\x8a\xd7\x67\xa4\xff\x75\x6a\x2f\x7d\xa5\x63\x67\xe5\x09\x92\x28\x04\x50\xaa\x22\xcb\x78\xd9\x71\xdc\x68\xe1\x43\xc0\xd4\x98\x15\x71\xf8\x58\x82\x7a\x0a\xb3\x84\xf5\x87\x9b\x4e\x82\x12\x1e\xf2\x8e\xfd\x6c\x5b\x16\x75\x61\x2f\xf9\x8f\x71\xbe\xe1\x33\xcd\x42\x2d\x68\xc0\x7c\x2b\xf4\x99\x15\xd7\x7d\x0d\xe7\xbb\xc2\x49\x8e\x68\x41\x15\x15\xa4\xa3\x9c\xbd\x4f\xab\xdb\x8d\x45\x50\x6d\x4a\x0c\xd0\x4a\x59\x19\xad\x60\xb5\x6d\x4c\xd3\x11\x2d\x81\x08\x42\xc5\x5a\xe6\x7b\xa3\x39\x55\xa3\x16\xdc\xe0\x4d\x05\x42\x82\x53\x66\x73\xc5\xb1\x22\x80\x98\x9a\x62\xec\xba\xbc\x36\x86\x0c\x7f\x1e\xc5\x0f\x45\xa0\x19\x02\xdf\x56\x87\xfb\xc7\x9e\x85\x28\x18\x8b\x1d\x9d\xff\x04\xa7\x57\x30\xba\xc7\x30\x22\x08\x2a\xbc\xd4\x7a\x8f\x53\xc1\xe2\xaf\x7b\x04\x85\x5a\x44\x61\x80\x38\x84\xc2\x94\xf7\xb9\x5f\x35\x51\x91\x23\x2c\xaf\x6a\xa3\xb2\x6c\x0d\xc0\xd6\x6e\x16\x71\x1c\x50\xd9\x02\x99\xfa\x25\xc2\x82\x87\x31\x5a\x97\xe7\x5f\x2e\x9f\x39\x7a\xd5\x32\x02\xd2\x31\x79\xe1\x5c\xea\x34\xf0\xa6\x16\x77\xa1\x3c\x86\x11\x75\x03\x16\xee\x28\x69\x26\x52\x3b\xee\x08\xee\x11\x1b\x86\xdd\x42\xce\xb3\xfa\xba\x4c\x2b\x71\x29\xab\x2f\x7c\xfd\xe1\x5d\x02\xf5\xb0\xb0\xc7\x4c\xdd\x4e\x46\x66\x78\x1d\xe0\x31\xa6\xef\x6c\xf8\xea\xfb\xb5\x27\x85\xed\x52\x2a\x42\x87\x90\x68\x87\x2c\xb5\xcc\xef\xed\x07\xd7\xa1\x16\x16\xae\x8f\x5c\xc9\x36\xdf\xf3\xc0\xab\xda\xfe\x73\x0c\xdb\x97\x1e\x00\x71\xcc\x7e\x28\x2f\xff\xb8\x58\x5c\xca\x5b\x16\x03\xe9\xc7\x3a\x8c\x1d\x79\x66\x57\xe6\xa1\x6e\x22\x9b\xc3\xb7\x27\x7d\x45\x85\xa5\xa2\x98\xf3\x0a\xdc\xfa\x75\xfb\xfc\x92\xea\x80\xb4\xf9\x9a\x22\x53\xc5\xfb\x68\xf1\x94\x81\x60\x18\xb0\x78\x49\x9f\x5f\x70\x4b\xc3\xc1\xd2\x37\x6d\x24\x8b\x0c\x81\x7b\x73\x33\x16\x53\xd5\x4b\xb6\x4b\x96\x40\x68\xa3\x89\xc7\x89\x5b\x60\xdc\x48\x9d\xa2\x65\xe3\x20\x81\x53\x3b\x88\x0c\x29\xa0\x11\xb0\x42\x94\xf4\x5f\xc5\xa1\xa6\xfd\x49\x19\xc5\x52\xdb\x08\xf9\xb1\x34\xb5\x50\xae\x85\x07\x06\x27\xff\x51\x97\xfc\x58\xa7\x27\x38\x8a\xe2\xf2\xfc\xd2\x3e\x48\x1c\x44\x56\x59\x14\x55\x0d\x06\x20\x6d\x99\x90\x90\x52\x17\x5b\xaa\x1f\xa0\xaa\x0e\x2f\x7c\xfc\x32\x13\x16\xe3\x86\x79\x32\x35\xd7\xfb\x33\xcf\x51\xd8\xc3\x35\xcb\x04\xbf\x46\x6a\xe3\x3d\x1b\x3d\x5c\x5d\x24\xa7\x04\x91\xe7\x25\x7f\x9f\x5f\xae\x37\x8d\x7e\x62\xc0\x8d\xfc\x7d\x5e\x14\x18\xcd\x74\xa1\x03\xc9\xb9\xe2\x3d\x12\xb6\x65\xfa\xb6\xf8\xbb\x65\x60\x52\xf8\x09\x0e\xc3\xd7\x34\x7f\xde\x9f\xd3\xb2\x25\x10\x91\x22\x01\xdf\xce\x0c\xc3\x89\x8b\x62\xf6\x9d\x3f\x2a\x25\xf5\x90\x36\xc7\x7e\x57\x5b\x4e\xaa\x2f\x9f\x0a\xb2\xb8\xe3\x12\xf0\xec\x2a\xb6\xbc\xe6\xfc\x94\x4a\x44\x53\xf4\x8a\x30\x24\x28\x0f\x15\xb1\x36\x39\x7c\xff\x92\x55\xc8\xf6\xd7\x44\x53\x83\xca\x7d\x03\x9e\x99\x75\xf1\xb7\x61\x8f\xd8\x47\xe2\x53\x28\x79\x05\x3b\x0c\x9e\x0c\x5f\xb1\xf2\xac\xe2\xcd\xd9\x28\xa1\x18\x6c\xb9\xa1\x54\x19\xdc\xbf\x22\x8c\x24\x76\x7d\xfd\xc9\xb3\x54\x39\xcb\xc4\xe8\x10\x2d\x3b\xd7\x4d\xf9\x54\xe1\x3a\x35\x90\x71\xfe\x74\x6c\xff\xff\xfe\x3d\xf8\xa0\xca\x07\x60\x16\xa1\x65\x36\xa3\xc6\x1c\xe1\xb2\xde\x5e\xc4\x77\xb8\x4e\x3b\x54\x8a\x26\x81\xab\x84\x7b\xe4\x06\x79\x40\xfc\xd8\x2d\x92\x8a\x2a\x82\x7e\x6d\x91\x67\x86\x15\xa9\x5a\xf0\x7c\x59\x20\x81\x84\xed\x12\x28\x53\x8f\x79\x84\x53\x5a\xaf\xca\xb2\x28\x47\xaf\x37\x24\x86\x5f\x01\x49\x6e\x2c\x14\x65\x0c\xfa\x9b\xf8\xb4\x2a\x24\x49\x60\xa3\x1e\x97\xf3\x68\x4c\xb7\x37\x18\x06\x2c\x21\x2e\x85\xb3\xc8\xd2\x6e\x85\x52\xa1\xa0\x9d\x18\x2d\x6b\xc3\xae\x46\x86\xcd\xc6\xd8\xec\x9a\x7b\xa3\x28\x45\x5a\xd1\x34\x64\xba\xc7\x48\x08\xcf\xd5\xe1\x05\xcc\x10\x5b\xb7\x8f\x1f\x6a\x23\x60\xb2\xd8\x6d\xf6\xb3\xf5\xee\xb8\xbf\x5f\x6f\x8f\x3d\xa9\x2e\xad\xa2\x88\xa0\x81\x85\xa8\x5a\xac\x97\x6f\x2d\x5a\xd7\x23\x89\xd1\x16\x3a\x54\x69\xfe\xbc\xe4\x7d\x4f\x52\xc5\x24\xf1\xc3\xd6\x20\x76\x00\xb4\x25\x9c\xc7\x85\x42\x2a\xa6\x89\x0c\x1d\x44\x47\x88\xb4\x5e\x3e\x7d\x1f\xec\x6a\x2a\x0e\x08\x82\x78\x06\xb8\x20\xbb\x9f\x7d\x86\x0f\x52\x71\xcc\xf1\xa0\xea\xfc\x59\x9e\x6b\xf8\xd9\x12\x99\xe0\xeb\x5a\x7d\x9c\x8b\xea\x52\xc2\x22\x2b\xaa\x89\x2f\x3e\xb9\x28\x29\x11\x49\x14\xe8\xde\xd5\x62\x77\xe6\x9f\x64\x6a\x95\x48\x88\x61\xb3\x40\xc4\xfb\xec\x71\xf3\xe3\x09\x9d\x88\xe3\xfe\x30\xfb\xb6\x22\xc7\xed\x6e\x75\xdc\xcf\x1e\x56\xce\x19\x50\x02\x7c\x0c\x0c\xd9\x74\x73\x63\x20\xf2\x29\x19\x92\x29\x02\x01\x25\x2d\xd6\x28\x95\xc5\xa2\x28\x47\x1b\x9d\x92\x81\x01\x3a\x1e\x11\xf4\x6d\xa2\x3b\x16\xa3\xd7\x0a\x21\x5d\x3a\x1c\xe6\xcd\xa2\xa8\x24\xa3\x3a\xec\x05\x9d\x06\x36\xfa\xe8\xc1\x25\xd3\xe8\xf0\x3d\xa4\x6f\x50\x9e\x8b\x22\x7b\xab\x1e\x79\xbe\x48\x6b\x97\xdd\x52\xca\xef\x95\x46\x6c\xb4\xcb\x8d\x8f\xa6\x24\x44\x86\xf7\xac\x36\xa2\x99\xb6\xfa\xd5\x9d\x43\x07\x12\xb7\x9c\xb5\x04\x51\x8c\xd0\x48\x4a\x87\x81\xec\x98\x78\xfa\x51\xcd\xf6\xf0\x98\x63\x45\xd0\xcf\x87\xc3\x50\x67\x42\x2b\x2d\x55\xd0\x15\xc0\x58\xb1\xc8\x9e\x7a\xa2\xe9\x06\x1e\x51\x34\xee\xbd\x12\x5b\xdd\x3c\xb8\x11\xf0\xc2\x24\x36\x01\xce\x2e\x70\xf2\xa5\x91\x00\x9e\x50\x48\x40\xa6\x9b\x41\xdc\x56\x1e\xff\xe6\x5a\xb5\x36\x46\x13\xaa\x31\x59\x29\x83\x47\x28\x5f\x0d\x1d\xe7\xb0\x18\x30\x0c\xfe\x71\x83\xbf\xe8\xfe\x35\xc6\x2c\xb7\x3d\xfc\xff\x4c\x8a\x92\x59\x8f\x09\x7c\x20\x8c\xb7\x50\x9d\x54\xbe\x7e\x56\x80\x07\xbe\xf6\x90\x2d\xd6\xd0\x25\x6e\x76\x7b\x57\xc2\x6a\x09\xc2\x1c\x4a\x06\x82\x48\x22\x72\xa9\x59\x9c\x31\x48\x3b\xcb\xd5\xb6\xc5\xcd\x43\x10\xe9\xc8\xeb\xdc\x6d\x53\x55\x35\xbc\x14\xf3\x04\x2e\x2b\x82\xdb\x04\xc7\x37\xa8\x7b\xc8\x68\x60\xc4\x08\xbe\xfd\xe4\xd9\xeb\xb5\x4c\xc1\x02\x4d\xdb\x66\xe9\xe3\x0d\xfc\x4c\x55\x9e\x7e\xb4\xbf\x6a\x86\xa0\xa4\xc5\xe2\xf7\xfe\x6a\x07\x21\x11\xa6\x2c\xd9\xc8\xe8\xf6\x5d\x18\x08\xb9\x12\x56\x56\x78\x8a\xb9\x78\x6a\xee\x42\x44\x00\x67\xa7\x8b\x4c\x36\xae\xe6\xae\x6f\x1f\x42\xe4\x1b\x26\xb8\xe5\xea\xe7\xea\x61\xb3\x5d\xed\x86\x15\x34\x10\x25\x46\xad\xbb\x7a\x29\xde\x8f\x6e\xbb\xe0\x6e\xf0\x1c\x75\x51\x1e\x11\x3e\x98\xe6\xc7\xd5\xe1\xfe\x08\xff\xbb\xa4\x6f\x3c\xeb\xb6\x21\x88\x89\xc6\x22\x45\x8e\xc1\xcd\x6a\x56\xe2\xeb\x69\x9f\x2a\xf6\x83\xc0\x22\x47\x57\x56\x7e\xd1\x31\x09\x7e\xb9\xdd\x43\xcc\x58\x68\x64\xae\xbf\xe1\xb7\x6f\x4f\x18\x69\x84\x36\xe3\x52\xed\x5c\xb8\xaf\x49\x3e\xdc\x91\x82\x60\x19\x9d\x59\x25\xab\x22\x53\x29\x94\x25\x9c\x33\xc8\xd3\xea\xa5\xbc\x31\xf2\x21\x16\x81\x34\x98\x83\x0c\xea\x09\x56\x1f\x88\x95\x87\x18\x0f\xd1\x93\xaa\x75\x39\xbf\xb2\x0d\x52\x41\x22\x25\x3e\x4a\x33\xe9\xee\x8b\xaa\xfe\x8a\x53\x57\x03\x67\x11\x82\xb1\x7b\xe5\x6a\x9f\x22\x06\x41\x08\xc3\x07\xf9\xab\x28\x33\xb5\xb8\x9c\xfb\xba\xba\x83\x7d\x0b\x04\x44\x08\x6e\x6e\x86\x17\x7c\x8c\x09\x23\xa6\x6f\x45\x6a\x1f\x13\x33\xcd\x0b\x78\xe6\x35\x74\x72\x30\x43\xcb\x11\xa4\x4e\x30\xc1\x76\x0f\x59\x8b\xf4\x05\x45\xa4\xa9\x62\xaf\x06\xb4\x4c\xc3\x4b\xa8\x90\x13\x83\x24\xe2\xa7\x66\xa1\xeb\x01\xae\x41\x25\x1c\x33\xa0\x83\x94\xde\xe8\x16\x15\x08\x6d\xf5\xf6\x37\xba\x97\xb9\x04\x20\x54\x4b\x87\x28\x9b\x2a\xda\xea\xce\x01\x7e\x40\x5b\x90\x6a\x35\x51\xdc\x0d\xc0\x28\xde\x89\xb3\x77\x1f\xd2\xd7\xcf\x3e\x1f\x84\x54\x19\xe7\x54\x5e\xca\xb4\x4e\xe1\x26\x67\x0b\x20\x08\x06\x15\x51\xd9\xef\x5f\x17\x28\xaf\xfb\x6e\x42\x69\x4f\x78\x08\x33\xda\xaf\x1f\x10\x38\xd4\x5b\x3f\x34\xa1\x06\x82\xf4\xe1\xb7\xbf\xd8\x1c\x72\x0f\x78\x6a\x6b\xdb\x41\x19\x49\xb4\x8f\x73\xfa\x89\xec\x80\xd6\xbe\x90\xc2\xf1\xdd\x34\x96\xdb\x17\x6f\x5a\x53\xcf\xa8\x61\xe7\xf0\x51\x3f\xa6\x79\xbd\x2d\xaa\x2a\x15\x19\xf4\x3c\x27\x4d\x79\x12\x37\xc3\x71\xfe\xb0\x59\x7c\x77\x3f\x06\x81\xc6\x37\x82\x15\xe3\x2d\x37\xb7\xd6\x01\x33\xd8\x9a\x4b\x6e\x03\x19\x2e\x5a\xd2\xf3\xc3\x75\xc0\x8d\x66\x68\x8d\xdb\x45\x65\x90\x2c\xd3\xaf\x5e\xb3\xc8\x84\x3c\x6c\x88\x73\x96\xab\xf9\xa5\x6c\xdf\x5d\xe8\x87\xa6\x28\xcb\x14\xe8\xa0\xad\xf3\xa5\xb5\xa6\x43\xce\x03\x13\x1b\x47\x3a\x1e\x6e\xb8\xb5\xda\xf3\x41\xec\xb2\x9f\x5b\x53\x11\xda\xe1\x32\x86\x1f\x5c\x47\xda\xe8\x20\xbb\x65\xba\x9b\xda\xa3\x90\xb7\x4e\x7c\x15\x3a\x66\x5a\xcc\xfe\x82\x1a\x50\x3f\x68\xe1\x11\x69\xc0\x2d\x8d\x89\xb1\x42\x73\x59\x8e\xe2\x79\x5a\x50\x1f\x93\x1d\x48\x8f\xb8\xcf\x79\x9a\xad\xda\xe3\xe3\x10\x8d\x84\x23\x57\x6a\x66\x8b\x47\xbe\x88\xe3\x6a\x99\xf8\x1e\x46\xa4\x20\xaf\x4b\x9e\xcd\x79\xfe\x3a\x8c\x21\x68\xa9\x12\x84\xc4\x40\x2f\x60\xd3\x35\x6a\xc0\xf4\xdc\xe9\xf8\x0e\xa9\x5d\xf7\xc6\xcf\xac\x7c\x6a\xd3\xde\x59\xd6\x33\xe8\x99\xe7\x79\x54\x62\xb1\x5d\x9b\xdf\xef\x1f\xd9\xb4\x73\xc3\x73\xf1\xdf\x34\x7f\xfe\xf7\x4b\x6a\x59\xa1\x7f\xb3\xad\xc4\x0b\xf0\x83\x0b\xf8\x94\x41\xa0\xff\xc1\x9b\x23\xa8\x91\x69\x7e\x58\x2f\x56\xbb\xf5\xa6\x9b\x7a\x4d\x5b\x14\xe3\x46\x79\xe2\x1f\xcd\xd6\x93\xe6\xcf\xdf\x0a\x8b\x5f\x6d\x5a\x35\xc5\x18\xb5\x70\x55\xca\xcc\xf3\x7c\x8f\xe1\xa2\x61\x2a\x64\x52\x67\x8b\x35\x2d\xc2\xc7\x02\xaa\xbb\x4b\x55\x94\x7c\x70\x19\xca\x40\xb4\x14\x5c\x3f\x1c\x18\xda\xf7\x5c\xb3\xf4\xa5\xec\x81\x3a\x1c\xa5\x92\x5b\xdc\x48\xd8\x76\x8c\x31\x7a\xd9\x0c\x35\x9f\xee\x6b\x9e\x2b\x5e\x9a\x14\xc9\x44\x92\xb3\x39\x40\xb1\x58\xb7\x58\xb0\x01\x90\xda\x39\xa5\x7e\x67\x0b\xc6\xff\x19\xd6\x38\xff\x9f\xff\x1f\x77\x1e\x08\x50\xeb\x65\x32\xb6\x71\x99\xa8\xeb\x6b\x8f\xd3\x92\x5b\xad\xaa\x5c\xd9\x9c\x90\x13\x7d\x64\x9e\x17\xc4\xc4\x91\x4f\x36\xd6\xb8\x95\x27\xec\x67\x8c\x47\x1f\x33\x80\x88\x1b\xb5\x80\x34\xbf\x73\xaa\x1d\xcc\xf3\x98\x17\x21\xff\x88\x1d\xad\x9f\x23\x53\x9b\xbe\x44\x62\xd2\x64\xb1\x7a\x18\x7c\x25\x16\xb3\x16\x3a\x71\x11\xaf\x3d\x51\xf5\xe1\x43\x31\xc1\x83\xa8\xa5\xd7\xad\xcb\xe2\xea\x14\x62\x5c\xa0\x99\x79\x5e\xe8\x69\xea\xa0\x70\xbc\x96\x2f\x43\x12\x31\xd7\x49\x68\x1c\x7e\xa9\x75\xba\x6c\xb6\x60\x69\x77\x66\xc9\x6f\x45\x9b\x3b\x02\x9b\xe6\x78\x30\xa5\x66\x85\x83\x02\x1e\x0a\x47\x42\x6b\x7b\x44\x34\x0c\x5c\x58\x0c\xb8\x82\x52\x14\xce\x2b\x69\x47\x55\x14\x69\x04\xe9\xfc\xb7\x2a\xf2\x05\x1f\x1b\x11\xc3\x77\x17\x41\x10\x41\x5b\x9e\x5e\x16\xd5\xd9\x54\x78\x0d\x64\x1c\xb1\x9f\x44\x1b\x76\x2d\xfe\x6c\x73\x0f\xcd\xcf\x5a\x63\xc9\xd7\xb7\x32\x55\xf2\x22\x60\x9b\xf1\x5a\x17\xe5\x69\xf0\x1d\xe2\x20\x50\xaa\xa7\x85\xb2\xaf\xf9\x6b\x9a\x3f\xbb\x6c\x8b\xeb\x25\x22\x65\x78\x34\xae\xdb\xb2\x50\x97\x09\xf1\xf5\xe1\xad\xc7\x52\xe3\x2c\x7b\x2b\x6a\xd8\xa2\xc6\x61\x7b\x2a\x1d\x26\x16\x2d\xb0\x2b\xb2\xac\x78\x1b\x52\x0b\x33\xcf\x4b\x02\x8a\x36\xd3\xe3\xec\xf7\xe3\x76\xb7\xfe\x39\x3b\xac\x8e\x77\x3f\x9e\x96\xeb\xa7\x6f\x7d\xd3\x9b\x79\x9e\x08\x05\x16\x48\xb8\xd5\x0d\xb5\xad\x87\x5c\x3f\x4d\xaf\x24\xc0\x00\x09\x37\x11\x9d\x5b\x70\x2c\xf3\x3c\x19\x46\x48\x90\x6a\xb5\x08\x87\x7e\xce\x3f\x06\x5f\x50\x86\xda\x77\x45\x64\xad\x35\x77\x07\xb0\x78\xe1\x65\xcb\x4a\xc0\x9f\x27\x81\x02\xcc\xf3\x94\xef\x2b\xa7\x2d\xc6\x6b\x7e\x24\x41\x2f\x1a\xc9\x3c\x0f\x22\x8a\x89\xdf\xfd\x1e\x59\x7f\x07\x1f\x0b\x12\xb0\xc2\x6a\x8d\xbd\xfd\x6f\x28\x8b\x1b\x62\xf1\xa6\x97\x0c\x88\x68\x51\x21\xd6\x35\x6d\x27\x0b\xf1\x22\xe9\x00\xfe\x87\x97\x1e\xa1\xfd\x90\xa5\xa4\x5f\x4d\xcb\x3c\x42\x82\x10\x5d\xab\xa3\xa9\x49\x7b\x82\x8f\xda\x20\x75\xb7\x45\x9a\xd7\x93\xe6\x04\x1e\x95\x98\x00\x9b\x35\xfa\xdc\x5c\xfb\x4b\x5e\xf7\x69\x3f\xd9\x9d\x35\xe4\xda\x08\xeb\x99\x90\x9c\xe1\x81\x9c\xc4\x45\x37\xbd\x81\x26\x49\x97\xaa\xb4\x38\x89\xa9\xeb\x4e\x32\xa4\x33\x8f\xf8\x01\x41\x8b\xc2\xca\x70\xce\x72\x65\x90\xc1\xbc\xe4\xa7\xa9\x48\xfa\x17\x44\x9a\xcd\xd9\x18\x33\x3a\x9b\x88\x8d\x1c\x15\xea\xbb\x3e\x51\x80\xf5\xbc\xff\x6a\xda\xfa\x96\xc5\xb4\x46\xd8\x3f\xfa\x03\x88\xf8\x5c\x49\x53\x60\x2e\x5f\x07\x02\x9d\xfd\x77\xe8\x83\x08\x0d\x3b\x9d\x53\x9e\x65\x1e\xa1\x54\x21\xd6\xc7\xd6\x46\xfe\x4c\x3b\x85\xdb\xe1\x3b\xa5\x42\x60\x19\xf7\xe1\xc5\x34\xcf\xdd\x19\x02\x4f\xc3\x90\x4b\x75\xde\x73\xec\x3e\x19\x25\x41\x6c\xe8\x3f\xd3\x3c\xad\x57\xe7\x42\xbe\xf4\xcb\x8f\x9a\x76\x4e\x10\x1f\x99\x17\x0a\x8e\x46\xb3\x72\x74\x3f\x2c\x8a\xf1\x91\x57\x79\x5d\x5e\x67\x4a\xf5\xa2\x89\x93\x93\x90\xb0\xc4\x08\x6a\xe2\x5a\x6e\x0c\xc1\x05\x14\xc3\x35\x81\x84\xc4\x8f\x8d\x0e\xf9\x18\x11\xdb\x34\x0a\x03\x71\x15\x06\x66\x8e\x76\xe2\x23\x2f\x3f\x09\xc8\x34\x07\x28\x3f\xd1\x6d\xf1\x1b\xa8\x5b\xc9\x7c\xe6\x91\x48\x13\x6d\x65\xde\x8c\xec\x5d\x51\x1e\xdd\x6b\x88\xbd\x04\xe3\x00\x4f\x2b\xcb\xa6\xdd\xfc\x16\x1b\x95\x67\x67\x16\xf3\xce\x44\x22\x31\xf7\x74\x5f\x4f\xa8\x31\x3a\x47\x97\x4b\x7c\x6e\x74\x45\xa1\xaa\x8f\x94\x1c\x39\x4a\x53\x7d\xe3\xd5\x8f\x8a\x3f\x03\xf3\xe6\xcd\xfe\x55\xb9\x13\x26\x2c\x12\x2d\x3f\x40\x9e\xea\x81\x14\xed\xe4\xcc\x49\xa2\x10\xc7\x7a\xb9\x56\xee\x24\x3c\x50\x61\x17\x42\x78\xe2\x27\xd8\x5f\x4f\xa2\xc8\x6e\x91\x65\x4d\xe7\x88\xa3\xc5\x62\xdf\xe4\x63\x3a\xe9\x7f\x32\x8f\x08\x4f\x10\xa3\x83\x86\xc0\xf0\x87\x82\xe7\x1d\x62\x7f\x74\x8f\xee\x10\x0e\x91\x8d\xaa\x96\x3e\x0a\x2c\x4f\xbc\x20\xa1\xc5\xc0\x6b\xdd\xd7\xfc\x74\xae\x26\x14\xf3\x99\x47\x24\xf3\x3d\xd6\x2d\x91\x0f\x1c\xd5\x71\xf8\x27\x58\x17\x7b\x10\x50\x8e\xca\x15\xc7\x54\x16\x7d\x7c\x65\xd3\x14\x07\x4e\xce\x66\xcb\x4b\xbb\x44\x8c\x9e\x5b\x2b\xc5\xec\xee\xbd\x3f\x83\x5c\x2f\x87\x0b\x89\xef\x29\xa9\x83\xce\x63\x3b\x14\x2b\xde\x11\x10\x4f\x1a\x1d\x3e\xf1\x98\x13\x61\x58\xe7\x3a\xe3\xbd\x9d\xc5\x27\x54\xe2\x18\x5e\xfd\xbe\x5d\xed\x0e\xfb\xe3\x76\xb3\x79\x38\xce\x96\xcb\x5d\xdb\x21\x8a\xb1\x5c\x8d\x2b\xb5\x45\xc2\xd9\x53\x6f\xad\xfd\xa4\xd0\xb1\x39\x0c\x18\xda\x6f\x47\xe5\xf4\x37\xf6\x5d\x69\xb6\x5b\x39\x7d\xdf\xa7\x68\x5f\xcf\x7e\xce\xd6\x0f\xb3\xf9\xc3\xea\xb8\x7e\x6a\x23\xf9\xee\x0e\xfc\xd8\xf7\x88\x63\x1e\xc7\x22\xd8\xd6\x3e\xf3\x7d\xe5\xa3\x13\x89\x92\x2f\x65\x5a\x5f\xe7\x25\x80\x23\x75\x6c\x3b\x41\x82\x20\x1e\xf8\x30\xbc\x1a\xf6\x67\x1a\x18\xbe\x25\xae\xd4\x53\x51\xf3\x5b\x9e\xa7\xc9\xef\xeb\x53\x45\xfc\xc0\xb2\xd2\x38\xaf\xc1\x36\x05\x9e\x41\xab\x96\xf0\x5f\x90\xf5\x54\x5c\xaf\xed\xc8\xf1\xed\x14\xb9\x2d\x54\x69\x99\x85\xc7\x1d\x49\x80\x30\xbf\x13\xae\x43\x8f\xfc\x75\x90\xe9\x6c\x3a\xc4\x12\x3d\x0b\x5c\xf6\xfe\xb8\x77\xcb\x88\xcf\x12\xa9\x7a\x5c\x3b\xdb\x12\xd6\x8b\xcd\x5d\x09\x26\x9a\x31\x1c\x97\x3e\x13\x09\xa6\x94\x01\x05\xff\x26\x23\xea\xf1\x2d\x27\xa4\x3d\x38\x66\x49\x60\x81\x07\x73\xc3\x6b\xd6\x2c\x37\x26\x95\x3a\x1c\x87\x3c\x0e\x51\x17\xf2\x99\x9f\x90\x96\xe8\x47\x85\xa8\x1e\x0c\xe5\xbb\x5b\xe1\xdc\xf8\x8c\x97\xca\x95\xbf\x0c\xcf\x21\x28\x31\xf8\xd8\x73\xd6\x67\x7f\x68\x5a\x62\x61\x62\x4c\xd7\xbc\x7e\xa9\x7a\x00\x9b\xa6\x0d\x08\x02\xab\x2e\xb9\x63\x72\x9a\x5f\x3f\xc1\xd5\x32\xcf\x97\x89\x50\xee\x1e\x3a\xbc\xcd\xf0\x3e\xa4\x24\xc8\x08\xfe\x3d\xad\xeb\xeb\x60\xb4\xa9\x88\xa1\x75\x82\x7a\xa0\xd3\xbb\xe4\x68\x7e\x2a\xae\x90\xb3\xca\x06\xc0\x6f\xd0\x3a\xed\x74\x01\x6a\x48\xfd\x56\x5a\x03\x52\xf5\xc2\x10\x6b\x18\xb7\x3d\xb5\xaf\x00\x2c\xc0\xa1\xd9\xcc\x0e\xc0\x4f\xa3\xa2\x9f\xe1\x3d\x68\xf0\x99\x83\x66\xa5\xea\x81\x57\xf5\x0f\x5c\xf3\x06\xa3\x8d\x7a\xd2\xa4\x57\x11\x82\x7f\xb9\x8e\x17\x4c\x4a\x7c\x83\xab\x5f\xef\x17\xbf\xb5\x3f\x49\x8c\xee\x63\x7e\xc3\x81\xe5\x86\xe6\x00\xf5\x83\xd8\x04\x44\x52\x83\xcd\xbe\x2b\x4a\x43\x35\x61\x65\xf9\xdb\x7e\x9a\xd2\x96\x9c\x13\x8d\xfe\x49\x3c\x23\xf3\x28\x8b\x04\xb2\x11\x8b\xcb\x75\xd1\x4b\x23\x8d\x7a\x85\xbe\xd5\x73\x36\x2f\x7e\xa2\x30\xae\xe9\x14\xc4\xf8\xcc\xeb\xbc\xd9\x49\xd7\xa7\xc6\x0f\x18\xbc\x94\x30\x8c\x0c\x43\xbe\xb8\x94\xf9\x27\x55\x73\x4d\xb7\x38\x72\x7a\xeb\x36\xc1\x85\xac\xdf\x3d\xef\xc2\x75\x54\x21\x46\x7f\xb7\x86\xa3\xc4\xfd\x1c\xf9\x26\xfd\x63\x23\xc7\x83\x92\x93\xa6\x39\x64\x98\xb2\x79\xd8\x2c\xbe\x9b\x0e\x9b\xf5\x53\xdf\xca\xf9\x3a\xcc\x43\x23\x90\x61\x9f\xb1\x7d\x24\xfa\xc9\x3c\x1a\xcb\xc4\x09\x5f\x36\x73\x27\xcd\x9f\x67\x6d\x1d\x6e\xaf\xac\x81\x79\x34\x21\x09\xae\xca\x3a\xed\x6a\x7c\x7f\x42\x59\x21\x7d\xd6\xf4\x5b\x4e\x88\x31\xbe\x2e\x39\xd6\xb7\xdd\xc6\x01\x9b\x3e\xbe\x40\x0f\x74\x91\x01\xcf\xef\x8a\x42\x2d\xca\xeb\xd9\x02\x63\x9a\x66\x46\x4c\x72\x90\xe7\xc7\x2c\xe5\x79\xfb\xbb\x0c\x71\x43\x4e\xf3\xb7\xb4\x86\x7b\xa4\x87\x2d\x87\xbb\x2a\xe5\x1e\xe8\xb8\x83\x53\x37\xd6\xc6\x27\xb6\x2d\xe5\x34\xc4\x82\x82\x13\x4f\x73\xc4\x71\x23\xb6\x00\xa3\xe3\x6d\xd4\xb7\xe9\xa6\x4c\x0c\xde\xbc\xcf\xa1\xd9\xed\x1c\x4f\x2a\xc2\x40\x7a\xae\x26\x18\xaf\xbc\x35\x1e\x09\x4c\x82\x88\x99\x47\x65\x10\x24\xba\xe7\x29\x6d\x4b\x78\xce\x79\x5e\xf7\xe5\x1f\x9b\x6e\x71\x60\x66\x1d\xaf\x5e\x36\x97\x2e\x77\xd7\x34\x71\x8e\xbe\xe4\xd9\xec\xe6\x06\xe9\xd3\x6b\x34\x90\xf1\x17\x5e\x81\x6f\x94\xc4\x0d\xcd\xe7\xca\x92\xc6\x32\x8f\x2a\x48\x90\x34\x35\x87\xf7\x85\x63\x27\x65\x1e\x05\x42\x14\xb4\x61\x5a\xa8\xd7\x6a\xc1\xcb\xe7\xc2\x90\xa7\xf4\x43\x98\x14\x12\xa3\xdb\x69\xde\xcd\x2f\x38\x94\x97\xaa\x1e\xba\x71\xae\xa7\x08\xb0\x10\x41\x19\x8c\x7b\x97\xc5\x6f\x2f\xaa\x13\x0d\x7d\x76\xc7\xd9\xc9\x6c\x19\x36\x46\x14\x78\x1e\x41\x9b\x6b\x97\x56\xaf\x03\xa9\x5c\xd7\x4e\x3d\xac\x77\xe7\x86\x20\x55\x63\x69\xdb\xbf\x2e\x70\x71\x2f\x2c\xf0\x98\x76\x22\xae\x8f\x70\x12\x50\xa2\xca\xe2\x54\x40\x2a\xf0\x12\x0f\x31\xdc\x47\x59\x9c\xce\x17\x43\x71\x57\x2d\x2e\xa3\x4d\x2c\xf0\xa4\x51\x03\xb3\x55\xd2\xee\x42\x84\x30\x66\xa7\xa0\x91\x3a\x34\xb8\x93\xdb\x4c\x78\xd3\x37\x14\x98\xb9\x42\x81\x08\xa3\x90\x39\x39\x60\x02\x12\x19\x25\x6b\x91\xaa\x4d\xf3\x11\xf7\x69\xb3\x74\x7d\x92\xfb\xe9\x6f\xf5\xf6\x78\x3f\xd6\x56\xfb\xab\x59\xfe\x10\x1b\x96\x5d\x47\xbb\x61\xe0\x27\x04\x6b\x6f\x4f\xfc\xe3\x50\xec\x21\x73\x21\xe0\xc0\xd7\x1a\xf1\x8b\x9d\xde\xee\x3a\x77\x5c\x56\xcc\x0b\xa8\x4f\x30\x6f\x59\x63\x7d\x9d\xcb\x85\x76\xab\x5a\x40\x69\x20\x6d\x39\xcc\xd7\x8e\x45\x10\x24\x46\xc9\xec\xdd\xf1\x1a\x58\x4e\xe2\x01\xee\xa6\xe9\x27\x08\xf1\x1d\xa7\x38\xc8\xd7\xea\x72\x5a\xb4\xf4\x0c\xcc\x0b\x22\x2a\x51\x82\x4b\x01\xaf\x5f\x30\x9c\xa3\x09\x6b\x1b\x13\x2f\x64\xad\xa7\xdf\x8a\x00\xb8\x56\x41\x69\x34\x70\x84\x1c\x1b\x90\xeb\xa0\xe3\x30\xea\x8a\x7b\xca\xe2\x8c\x11\x87\x6a\x20\x69\x65\xfb\x26\xc2\x47\x3c\xc4\xb9\xa8\x21\xaf\xd3\x16\xe7\xe6\x9a\x75\x80\x2c\x58\x79\x71\x4a\xf3\x5e\x12\x60\xb8\xc3\x05\xff\x8f\xb2\x37\xd9\x6e\x1c\xc7\xb6\x86\xdf\xe5\x1b\xc5\xa0\x06\x04\x48\x90\xe0\x3f\x93\x64\xd9\xa1\x9b\x6e\x54\x96\x9c\x91\x59\x77\xd5\xd2\x42\x73\x60\xb3\x4c\x91\x2a\x92\x0a\x87\xea\xe9\xff\xc5\x03\x80\x9d\x68\x67\xdd\x41\x46\x64\x08\x60\x8f\xe6\x34\xfb\xec\x2d\x54\x8a\x4f\xe3\xbd\x9d\xd9\x57\x27\x03\x81\x15\xa3\xf7\x4f\x77\x07\x84\x83\x6e\xea\x7d\x59\x2e\x1d\x84\xa3\xed\x40\x28\xb5\x8e\xae\xd0\x16\xd5\x36\x71\x0e\xbd\xdd\x11\xc9\xd4\xf2\xfa\xde\x41\x56\xbf\x89\x41\xe8\x32\x92\x69\x22\xdc\xea\xa0\x7c\x5c\x47\x4f\xb2\xc7\x6d\x37\xa5\x21\xf1\x2a\x84\xca\x86\xff\xde\xa1\xd8\xdc\xd4\xae\x62\x7b\xbc\x40\x44\x2a\x65\xf8\x80\xdb\xc5\xf3\xfe\x71\xcc\x78\xda\xb6\x2a\x40\x5c\xd2\xc9\xb1\x97\x4d\xa8\x9f\xc6\xa7\xd2\x01\xf7\xf2\x10\x56\xbf\xdf\x1b\xa5\x91\xa6\x89\x19\x42\xea\x07\x4c\xb4\x2c\x88\x0c\x89\x3d\x05\xc2\x6e\xa2\x40\xda\xb6\x32\x40\xfd\x1f\x93\x97\xe5\xc4\x5c\x8a\x4c\x6c\xb7\xf4\x1a\xaa\x9f\x99\x82\xaf\x2a\x63\xdb\xde\x42\x25\xae\xf6\x75\x48\xea\xd9\x71\x5b\x0e\x7a\x4a\x89\x24\xf6\xf7\x99\x19\x0b\x8d\x5d\x63\xee\x58\xc0\x82\xc0\x72\x25\x57\xd9\xeb\x5b\x43\xf9\xf8\x5c\x2c\x08\x0c\xbe\xc2\x7b\x71\x2e\xd4\xdb\xd6\xc2\x25\xeb\x61\xba\x8b\x05\x8c\x38\x6a\x0f\x27\xfe\x00\x95\xc7\xc4\x8f\x5f\x06\x23\x8c\x7b\x88\xb5\x45\x65\xd6\xc3\xb9\xc7\x08\xd3\x4c\xf4\xd5\xf1\x37\x59\xdd\x2e\xa2\x1d\xa5\x56\x6f\xa2\x33\x1a\x48\x44\x95\x0f\xb9\xc9\xfd\x59\x28\xe3\x58\xf9\xb9\x7b\x2b\x3f\x0e\xe2\xdc\x94\x47\x54\xe2\x6c\x97\xa5\xc3\xa9\x2b\xe1\x68\x3b\x0a\x89\x25\x1c\x3f\x33\xf8\xf8\xdc\x59\x63\x11\xd7\xdc\xc9\x25\xb7\x0e\x98\x8b\x27\x7f\x01\x88\x6b\x8f\x01\x2e\xed\xfd\xa1\xc3\x7a\x03\x3f\xb1\xfc\xca\xb5\x32\x4a\x99\xe9\xa9\xdc\xa7\xb6\x03\x63\xcc\x11\x41\xdb\x2d\xfa\x50\x43\x6e\xda\x1d\xb0\x3a\xab\xc9\x56\xc2\x18\xd7\xae\x0a\x0a\x79\x23\xdf\xa0\x79\x9b\xdc\x3e\xd3\x09\xda\xe4\x3e\x68\x54\x3c\x40\xde\xbf\xac\x38\x10\xb6\x28\xce\xcb\x50\xe1\xd6\xe7\xd6\x9a\xc1\x0b\x8f\x45\x88\xe5\x21\xa3\xf4\xe8\x6e\xe0\x4e\x0c\xfb\xca\xd0\x97\x5c\xee\x06\xca\xd3\x2c\x60\x5c\x45\x18\x7c\xa9\x85\x81\x29\xe9\xd8\x78\xb4\x33\x6e\x2c\x05\xfa\x09\x63\xd2\x3f\x00\xde\xfd\x49\xd2\x20\x44\xf8\xea\x1d\xb4\x26\xc1\xd8\x95\x60\x29\x89\x92\x5e\x31\x38\x2b\x6e\x2a\xf1\x91\x15\xaf\xf5\xf2\x82\xff\x9c\x86\x53\x58\x6a\x04\xfa\xcf\x7e\x6a\xa3\xd7\x76\xc5\xdb\x38\x5e\x29\x98\xa0\x01\xb2\x6a\xe0\x68\x5a\xf5\xab\xbd\x6f\x4e\x24\xa6\xa3\x4f\xe7\x3c\xb7\x2e\xea\xec\x82\xc3\xa4\xb0\x6b\xb8\x8b\x42\x5b\x6e\x9e\x21\x90\x64\x0e\x3d\xc8\x02\xa6\x42\x85\x61\x86\x07\x51\x2f\x8a\xf3\xb7\xee\x57\x8d\x3e\xee\x29\x03\x85\xb5\x6e\xe0\x23\x74\x4c\x0b\x86\xb0\xfe\x03\x16\x8d\xed\x4b\xa7\x3b\x5d\x0f\x41\x8a\x7c\xf2\xfe\x21\x21\xba\x63\xb3\x69\x3e\xca\x4d\xf1\x53\xe4\x99\xbe\x15\x79\x0d\xeb\x7f\xdf\x97\xdd\x37\x05\x4d\x30\xed\x67\xe1\xe8\x5b\x68\x5a\x87\x6b\x07\x55\xe6\x7c\x66\x7b\xe2\xee\x85\x1b\x1a\xa7\x49\x1f\x23\x19\x55\x90\xf8\x2e\x32\x42\x78\x83\xd0\x57\x56\xf0\xe4\x26\x8d\x61\x49\x34\xe0\x67\xbe\xce\xf6\x75\xa3\x32\x0e\x52\x6a\xfc\xce\x72\x94\x19\x14\xcd\x7d\xfb\x1a\xd6\xbf\x14\x9c\xa6\x70\x49\xec\xae\xb0\x9e\xa4\x1c\x2b\x0d\xac\x5a\xd3\xcc\xbf\xd8\x98\x04\x56\x1f\xfc\x61\xf3\xb8\xee\x7e\x0b\x85\x2f\xbe\xbd\xa9\xca\xd3\x63\xd9\xf4\x4b\x4e\x4c\xc1\x90\xd8\xed\xa4\x4f\xa7\xd6\xef\xab\xdf\xfd\xb2\x10\x87\x2c\x44\x6c\x10\x96\x87\xf5\x30\x38\x6c\xb1\xe8\xfc\xd5\x9f\xdb\xef\xeb\xe7\x3f\xba\x9f\x63\x81\x91\x57\x9b\xcf\x9e\x09\xeb\xc7\x61\xe2\xca\x89\x5b\x07\x73\x30\x46\xe3\xd0\x84\xb1\x2b\x9e\xb0\x46\x6d\x3d\x45\xeb\xfa\x3d\x3d\x8e\x78\x84\xd8\x4e\xff\x92\xdb\x89\xbb\x41\x5f\xaa\x72\x0a\x58\xfd\xf5\x58\xc8\xb0\x00\xdc\xd6\x07\x5d\xc5\x92\xbf\xc8\xc9\xc4\x8c\x69\x8e\x32\x0d\x18\xe4\xf2\x3f\x2a\xe9\x25\x34\xae\x56\xb6\x38\x4e\x6d\xc2\xb9\xb5\xd2\x6a\x68\xbe\x9f\xe5\xb7\xae\xc5\xc2\x51\xcf\xc5\xa9\xe3\x68\xe8\xda\x84\xc5\x2a\xd7\xd0\xdc\x6f\x2d\x68\x7e\x5b\xd6\xd3\x62\xc3\xb6\x23\x50\xf4\xeb\x1b\x10\xc7\xdf\x00\x4e\x59\xf1\xda\xad\x59\xe3\x9e\x89\xb1\xe9\xcd\xdf\x16\xa3\x8c\x78\xcc\x99\x42\x06\xb7\xdd\x87\xa8\x8e\xcf\xa0\xaf\x33\x7b\x71\x4a\x75\x6a\xd9\xc0\x56\x58\x0e\xda\x0c\x84\x18\xe7\xd1\x68\xe3\xb7\x96\xa6\xc0\xd3\xde\x71\x5d\x9e\x2f\xed\x3a\x7f\xfb\xc7\xe4\x0e\x53\x11\x8f\x41\x23\xbf\x81\x14\x72\xe7\xc1\x25\x7d\x47\x11\x08\x21\x5c\x6d\x45\x55\xc3\xee\x94\x67\x8e\xca\xdc\xd6\x73\x8f\xb2\x93\x93\x43\x3d\x6a\x0d\xf3\x47\xed\xf0\xbd\x2d\x2b\x24\x18\xf5\x0f\x2b\x04\x68\x9b\x7e\xa9\xcf\xe0\x61\xed\xbe\x51\xb2\x18\xe3\x77\x03\x50\x4d\x3f\x0e\xa4\x0e\x07\x0c\xd3\xbe\x0c\x6a\x62\x0c\xc6\xd2\x18\xac\x67\xcb\xc1\x34\xc9\xe4\xee\x94\xb4\xd1\x81\x47\xf8\xb0\x32\xb2\x9f\x2c\xf1\xff\x6d\xfe\xd2\x9f\xd6\x58\x3c\x0b\x8a\x90\x66\xde\xef\x89\x35\x8b\x54\xe2\x19\x7e\x5f\x47\xa6\x7b\xac\x53\x90\x8e\x95\x0e\xfd\x0b\xde\x35\x28\xab\x8c\x89\xe5\x91\xe2\x15\x3c\x5b\xb3\x6b\x06\x12\xc4\xca\xe7\xf5\x77\xa3\x18\x54\x0c\x2a\x40\xbc\x80\xdd\x2d\xd7\xfd\x5b\x05\x20\x48\x94\xd3\xa0\x16\x2c\x72\xe5\x4c\xc2\x2a\x09\x09\xc0\x60\x96\x03\x79\x8c\xb0\x92\xd2\xde\x70\x8d\xfb\xc4\x37\xdf\x2d\xd4\x2a\x98\xd6\x95\xd6\x6f\x99\xa3\x5f\x7f\x40\x10\xc6\xf4\xd4\x46\x19\xcf\x5f\xf2\x13\xaa\x5d\x79\xee\xcb\x0a\xe7\x40\xd4\x7e\xcd\x49\xa8\xb0\xc2\x66\xae\xc8\x69\x5b\x36\xa2\x29\xff\x8a\x34\x67\xbc\x4d\x26\x21\x58\xe5\x82\xd6\x34\x7a\x7a\xba\xb7\xc2\xad\x94\x8d\x5e\x5c\x12\xb5\x8e\xa3\x8d\xaa\x55\x42\x0f\x92\x6d\x49\xeb\x64\xb5\x9f\xd0\x89\xd6\x5c\x19\xe7\x5f\xc6\x74\x13\x16\x59\xb3\x19\x21\xf3\x1d\x0f\x6f\xde\x4e\xbd\x4a\xe4\x59\x3d\xdc\xf0\x92\x58\x47\x48\xf3\x83\xd5\x36\x56\xbf\xd9\x71\xb8\xcf\xda\x46\x49\x22\x54\x00\x83\x15\xd9\x06\x25\x47\x89\xf5\xc9\x11\x3c\x0a\xad\xcc\x59\x5d\xc3\x51\xe6\x97\xdd\x9b\x38\x66\x57\xd4\x29\x9f\x3c\x0b\x4f\x42\x8c\x6a\x14\x65\x75\x44\xa2\x2b\xbd\x16\x55\x7e\xf1\x94\xd0\x7e\x80\x26\x29\x4b\x71\xfc\x16\xf0\xb1\xec\x69\xd2\x27\x43\x42\x70\x4b\xb3\x2a\x2a\x51\xcc\x72\x29\x63\x1f\x5b\x75\x8d\x61\xa4\xff\x23\x66\x2a\x11\x46\x22\xf8\xd3\x59\x55\xcb\xf3\xe5\x1a\xe2\xce\x82\x44\x86\x91\x17\x00\xf8\xed\x71\xf5\x2c\x1a\x78\x6e\x97\x94\x1d\xca\x7d\x9f\xab\xfe\xa9\x34\x49\xd0\x67\x41\xc7\xf7\x94\x5f\xa6\xa4\x85\xff\xb7\x05\x23\xd1\x2c\xb5\xc5\xee\x4d\x79\x1a\xf3\xd2\xb4\x8d\x9c\xf3\x64\x24\x0c\x4a\xd2\xf1\x78\x85\x84\xe3\x32\x56\x9f\x65\xad\xaa\x4c\xc2\xa4\x39\x4d\x84\x83\xe2\x2c\x5f\x16\x57\x29\xf3\xf1\x9b\x02\x30\x88\x93\xc6\xb5\x61\x08\x68\x1b\x6d\x35\xc3\x68\x10\x0f\x12\x50\xca\x9b\xf6\x79\x0e\x95\xe9\xb0\x06\x9c\x70\x5b\x3f\xeb\xd1\x58\x77\xb3\x94\x80\xe3\xcf\xc0\xc3\x90\x21\xa2\xc9\x71\xba\x5a\x1a\xb0\xac\x78\x1d\xfa\x63\xfe\x53\xb4\x9d\x31\xb9\x7d\x14\xbf\x9e\xa1\x68\x06\xea\x39\x6d\x63\x14\x22\x37\x40\x86\x55\x1c\x0d\x58\xa5\x2d\x17\x98\xfe\x6c\xa9\xf8\xec\x6f\x7f\x4e\x69\x33\xfc\x76\xbb\x59\x96\xe5\x7b\x56\xbc\x5e\x21\xe2\x78\x94\x86\x52\xf5\x24\xd6\xf3\xe7\x8a\x52\x85\xc9\x0b\xc4\xac\x60\xe1\xd0\x7c\xc4\x8e\x47\x92\x5a\x4d\xd4\xac\x68\x9c\xbb\xd5\x4c\x66\x11\x8f\xb4\xc0\xec\xb8\xc9\x4e\x16\xfe\x3b\x86\x44\x72\xa6\x52\xe3\x54\xf7\xec\xee\xbd\x29\x56\x96\x63\xa8\x1d\x57\x42\x35\x5d\xe1\x22\x0b\x78\x9c\xd0\xd0\x42\x7a\xe5\xf9\xd5\xb2\x68\x1c\x9c\x6a\x74\x69\x0e\x46\x9c\x15\xf8\x5d\x80\x27\xd4\xd6\xd3\x94\x9d\x45\x8c\xda\xc7\x7f\xb1\x89\x76\x07\x03\xe6\x05\xd6\x2f\xcf\x4f\x7f\x7f\xd9\x3c\x3e\x7e\x51\xeb\x39\x3d\x94\x59\xc8\x73\xe5\xb5\x7e\xee\x4b\xf5\x3e\xf0\x99\x79\x12\x53\xac\x4b\xc0\x28\x06\x09\x26\x5f\x28\x11\x12\xf7\xe3\x7f\x95\x59\xf1\x74\x6e\x96\xa2\x69\xf2\xf1\xd4\xe1\x69\x14\x31\x3b\xb8\xda\xed\x2c\xbf\x3c\xa0\xe0\x7c\xaf\xcd\x7c\xb5\x58\x62\xd0\xae\xfb\xc3\x9d\x45\x04\x02\x03\xef\x8f\x59\x33\x4a\x42\x73\xc1\x53\x0b\x4e\x68\x1d\xfe\x33\x16\xd6\x75\x7e\x04\x17\x32\x42\x87\xbf\x7e\x2b\x3f\xb6\x65\x99\x77\x6b\xcc\xf8\x29\x64\x90\x32\x5f\xdd\xf8\xe8\x78\xcc\xf7\x1f\x65\x7b\x77\xdd\x1c\x91\x92\xc7\xae\x22\xf0\xe1\x32\x51\xc1\x63\x01\x57\x1a\x48\xe8\x11\x1f\xa7\xd6\xa6\xdd\xdc\xcc\x68\xe8\xb2\x80\xeb\xc0\x30\x67\xc2\x58\xa2\xad\x27\x63\x27\xdc\x2c\x16\xbe\x3d\x20\x0e\xd0\x74\x6c\xed\xe5\xf5\xfe\xfb\x0b\x0a\x67\x51\x7f\x5f\xda\x30\x8c\xa2\xa3\x0e\x64\x7d\x2a\x8b\x1a\x9e\x4e\xa3\xd9\x0d\x61\x42\x78\xc7\xb7\x93\xe9\xdf\xfe\x5c\x0d\x22\x10\xdc\x84\x0c\x8d\xec\x37\x10\xa7\x5d\x59\x35\x2e\x93\xe2\x4d\x06\x6e\xa2\x58\xf8\xf0\x98\x38\x82\x8b\x3c\xf8\xb3\xa7\x41\x14\x58\x36\x65\xbf\x6b\x0d\x23\x4f\x69\x10\x33\x04\xc2\xf4\xca\x3d\xb7\x65\x75\xdb\x15\x6f\x76\xdd\x52\xce\xba\x6c\xfb\xfa\x98\x75\xc7\x13\x65\xf3\x2d\xe8\x60\xef\xa0\xfb\xb2\x29\x01\x4f\x2f\xe5\x42\x38\xe5\xa5\x6b\x32\x9c\xf7\x32\xd9\x96\x07\x69\x55\x1e\x8f\x59\x8f\x5c\xbe\x7a\xc9\x29\x25\x76\x1e\xac\xef\xee\x76\x87\xfd\xd3\xe1\xfb\x62\xbf\xfa\x7e\x20\xab\xe7\xa7\xd5\xce\x9f\x98\x3a\x3d\x0f\x9b\xd2\xe8\x56\x52\xd0\xcb\xc9\x32\x92\x52\x2e\x11\x99\xa8\x44\x61\xe9\x53\xdb\x37\xd7\xbd\x32\x6a\x52\x04\xab\xe2\x92\x51\x74\xf7\x1d\x06\x4a\x58\xea\x91\x5b\x91\xe5\x03\xd3\x08\x57\x02\xdf\x29\x14\xa8\xeb\xbb\xcc\x9a\xe2\x5c\x9f\xbb\x9f\x95\xf4\x55\x7e\x18\x19\xb9\x81\xbc\x17\x08\xf6\x7d\xb4\x4a\xf4\x90\x77\x69\xf4\x02\xa2\x48\xf0\x51\x36\x66\x08\x08\xf2\x7d\x78\xe4\x83\x62\x48\xdc\x39\xc7\x33\xcc\x82\x94\x11\x26\x5d\x42\xd3\x91\x6b\x0c\x98\x9a\x59\x90\xc6\xa1\x54\xd1\x18\xfd\x5d\xef\x27\x90\xb2\x34\x66\x76\x9a\x38\x0a\xb7\x1f\xe7\x3c\x2b\x1e\x90\x69\x7a\x3b\x88\x35\xa6\x49\x62\x50\x2d\xd2\x40\xa3\xde\xae\x18\xb9\xdb\x0e\xc0\x30\xa2\x69\xcb\x25\xfc\xaf\x82\x84\x88\xd2\x45\xab\xbc\x83\x5c\xa5\x22\x01\x4f\x5f\x84\x02\xb4\x73\x65\x8a\xae\xab\x34\x14\x23\x91\xe2\x57\x77\x29\x15\x1a\xd5\x47\x6c\xf6\xed\x62\x62\x0b\xc7\x67\xcd\x9a\xff\x2a\x7d\x9c\x2a\xa6\x8d\x75\xd0\xac\x7c\xb6\x2d\x1a\xee\x1a\x01\xd1\x08\x8b\xdd\xdd\x70\x4d\x4c\x55\x1a\xc8\xd0\x71\xea\x39\x14\xbe\xd5\xc0\xff\xd4\xb6\x1a\x3e\x99\xd2\xa1\xab\x84\x12\x9d\x8b\x99\xea\xd8\x8a\x06\x1d\x41\x67\xe7\xe3\xe8\x13\x68\xae\xb0\xe9\xf7\xc5\xfd\x8b\x8f\xd6\xa4\x26\x30\x10\xf9\x82\x73\x57\xc3\x30\x94\x63\xf9\xe4\x71\x4d\x6c\xd0\x9e\x5e\xfc\xfb\x2c\xfe\x6a\x13\xf3\x3c\x39\xe3\x71\x63\x12\x65\x3c\x67\xb6\xe5\x29\xba\x3d\x17\x53\x80\x54\x6a\xb8\xe5\xa2\xb0\x9f\xea\x20\x46\x03\x54\xb4\x8f\x8b\x94\xb7\x22\x87\x4d\x7d\x9f\xfd\x84\xae\xc5\x24\x78\x1c\xba\x74\x87\xfa\x4d\x54\x50\x1f\xea\x32\xf7\xef\x49\x90\x20\xf1\x35\x13\x96\x28\x09\xd5\xb4\xbb\xd6\x30\x09\x6c\x12\xac\xb8\xd8\xf8\x66\x8d\xe6\x6f\x73\x1d\x62\x12\x24\x02\xd1\xcf\x12\x97\x75\xfb\x0a\x1d\x2a\x48\x9c\x60\x91\x90\x7d\x28\xbd\x68\xa6\x67\xd4\xd6\x41\xae\x4a\xb9\xe8\x52\x89\x82\x52\x40\xef\x62\x29\x0a\x55\x56\x77\xa2\xc6\x8f\x3b\x83\x33\x12\xa1\xd4\xa1\x15\x22\x6e\x67\xa1\xd7\x42\x67\x81\x88\x52\xc3\x8c\xe7\xd7\xad\x0a\x8f\x5d\xf6\xe3\x54\x30\x2e\x43\xe3\xb5\x8c\xa6\x63\xd0\x7f\x13\xc1\x14\xc7\x71\xf4\x56\xd6\xcd\xc1\x72\x50\x4c\x6e\x80\x81\xc4\x52\x6b\xbb\xb2\xef\x4e\x42\x41\xbb\x4a\x39\xce\x34\xd7\x29\x4e\x18\xc6\x09\xff\xfe\xf7\xe5\x48\x7f\xcf\x37\x73\xcb\xc3\xee\x20\x30\xfa\xb1\xd4\x16\x14\xe4\xdb\x65\x44\x9d\x77\xdb\xe4\x08\x58\xb7\xe2\x19\x73\x7c\x71\x2c\x10\x49\xc2\x30\x3a\x5c\xc0\xc7\x8d\xe8\x46\x01\xa7\x14\xf3\x99\x58\x29\xba\x3e\x42\xf5\x0a\x85\xba\xec\x9a\xf2\xd4\xf7\x88\x10\x29\xdd\x0e\xd3\xe7\xcd\x76\xfd\x70\x43\xe2\xa0\x6b\x64\x1a\x0d\xc7\x1b\x10\xcd\x5b\x7b\x83\x5d\x83\xb6\xb5\x3c\xd6\x76\xd8\x65\xaf\x2e\x1e\x3d\x8a\x5d\x89\x54\x32\xf4\x2b\x65\x59\x8e\x31\x54\x22\x05\x62\xab\x94\x84\x7a\x3f\x9f\xfa\x5f\xad\x58\xa0\x55\x75\x28\x9a\xaa\xcc\x77\xc8\xd1\x82\x50\xa5\xd6\x77\x7f\x2c\x9d\xee\x92\x3b\x42\xc6\x26\x71\x1f\xfc\xa1\xee\x6c\x01\x4c\x8a\xb6\xb3\xf7\x36\xcb\x61\x60\x08\x0b\x4d\x0d\xda\x68\x3f\xa1\xd0\x77\x67\x51\xa1\x30\xfc\xf8\x3d\xea\x24\xc4\x52\x81\xbb\xed\xee\x06\x94\xb8\xb4\xcb\x45\x7b\xe7\xeb\xe2\x67\x56\x95\xc5\x71\x86\x0a\xcd\x1f\xa9\x12\x2c\x36\xf9\xc8\x8a\xd6\x7e\x3d\xe0\x4c\xae\x2e\x07\xbb\x52\x74\xb7\xa0\x34\x16\x1f\x9a\x73\xa1\x47\xaf\x04\xa8\xe5\x37\xf2\x55\x4b\x7d\xe4\x1c\xbe\x14\x02\x1d\xdf\x04\x70\xa6\xf9\x60\x99\x46\x80\xac\x6f\xd3\x1a\xeb\x55\x15\x14\x75\x59\xad\xde\x44\xf3\x60\xc9\x6d\xc6\xaf\x40\x06\x01\x45\x72\x08\xb7\xe3\x59\x69\x98\x6f\xbe\x31\x12\x11\x78\xb0\x26\x3e\x60\x97\x9f\xe4\xbe\x4b\x1c\xcb\x1e\x69\x94\x9f\x48\x38\x1e\xfa\x92\x44\xa9\x77\x62\x71\x8e\xef\x1a\x38\x91\xc9\x4d\x10\x61\xd3\x08\x4d\x69\x55\x13\xa6\x50\x34\x49\x84\xc4\x8a\xa6\xed\x7a\xff\x55\xf6\x53\x12\x13\x60\x32\x05\x37\xe6\xad\xc8\xb4\xe5\x36\xbe\x2d\xab\xad\xb8\x4c\x03\x5a\x92\x0a\x40\xeb\xda\x07\xc1\x56\x6f\xd9\xe9\x5a\xc7\x6e\x7c\x27\x51\x94\x20\xe2\xc0\x55\x6b\x4e\xee\x33\xe2\x0a\x27\xa6\x38\x37\x65\x51\x1e\xcb\x73\xbd\xb2\xc8\xde\x6e\x14\x4b\xc6\x55\xd0\x5e\xf4\x7f\xce\xaf\xaf\xad\x67\x7d\x6e\x86\x23\x43\x32\xa9\xd2\xb0\x53\xaa\x45\xa3\x75\x20\x51\xc8\x02\x19\xd3\xd4\xcb\x8d\xcd\x4b\x3d\x8d\xb7\x26\x19\x4b\xe1\x13\xe1\x3f\xfa\x15\xdf\x7f\xbe\x24\x4d\xa8\x83\x64\xec\x44\xe1\xe8\xcc\x66\x87\xbc\x4c\x64\x22\x5c\xd7\x67\x54\x47\x9d\x5f\x9c\x64\x02\xa9\x95\x49\x54\x28\x89\x3c\xc9\xd2\x4f\x5d\xf6\xf1\xb1\x9c\x0a\x54\x0f\x2a\xe5\xbf\x40\x35\x3b\xa1\x7c\x9e\x50\xa6\xc4\xda\xd7\x35\x34\xbf\x5d\xd4\x15\xaa\xf2\x6f\xd7\x99\x4b\x99\xd2\x18\x13\xfd\x2f\x45\x36\x5e\x91\x64\x1a\xca\x50\x3a\x40\xe5\xf2\xfc\x9f\xff\xac\x84\x81\xae\x2d\x8d\x71\xdb\x40\xce\xf0\xac\x70\xa8\x4f\x1f\x1e\x9b\xdf\x04\x65\xaa\x2c\x16\xdc\xe7\x5d\x3b\xcc\xac\x6b\x17\x22\xa6\x74\x24\x75\x72\xb5\xf5\x4a\xa1\x00\x27\x4a\xa6\x4a\xdc\xbe\x6d\xa0\x8b\xf8\x53\x48\x42\x12\xcb\xd3\x68\xaa\xb2\xb6\x19\xe6\xf1\x97\x96\x11\x24\x5e\xb0\xf4\x47\xd6\x58\xc3\xf4\xe5\x79\xf3\x65\x72\x5b\x2a\x87\x27\xcf\xb1\xec\xea\xb6\xac\x30\x4e\x37\x5e\xdc\xa5\x0a\x93\x50\xbb\x18\x65\x59\xf4\xcc\x1b\xf3\x23\x45\x45\xb6\x6c\xe1\xd0\x3a\xe8\xfb\xd2\xd7\x0e\xcf\x27\x4e\xa5\x8a\x25\x66\x80\x9d\x46\x89\xc8\x47\x02\xa4\x51\x60\xab\xbb\x7a\xfd\xd1\xbf\xd9\x9f\xdd\xd1\x9a\xa4\x68\x1b\xbd\x48\xef\x7f\xf8\x06\x11\x32\x4f\xa1\x86\x95\x5f\x03\xf7\x53\x6a\x91\x24\xbd\x82\xd7\xff\x94\xf2\x79\xca\x0f\xd2\x3f\x0d\x24\x0c\xd3\x4f\xaf\xd9\x4f\x18\x6b\xeb\x4e\xc7\xf2\xe0\x02\x20\x79\xc8\xbc\x2c\xdc\x29\x2f\x67\xcb\xd3\xdb\x7e\x4a\x24\xdc\x47\xac\xb3\x2b\x44\x8c\x04\x1d\x44\xa1\x87\xfe\x5e\x51\xf7\x4c\xd2\xbc\xd2\x80\xd0\xaa\x8b\x9a\xe5\xa3\x85\x43\x05\x41\xa2\xe2\x2e\x9b\xb7\xef\x68\x61\x86\x45\xaf\xa3\xff\xfd\xb4\xe1\xbf\xff\x5f\xf6\x4f\x7f\x71\x63\x6d\x88\x3c\x6b\x37\x24\xd8\x43\x75\xac\x27\x65\x92\x8a\x30\xbb\xf4\x39\x26\x52\x04\x74\xb5\xcb\xcc\xf0\x89\xfd\x88\x54\x14\xac\x5e\xcf\xe2\xe6\xf7\xcd\xee\xe9\x79\x5c\x78\xa8\xc2\x88\xe3\x6b\xc5\x9c\xfe\x93\x59\xbc\x14\x99\x2a\xab\x62\x53\xdc\xb6\xae\x61\x77\xc5\x90\x51\x5b\x30\x6f\xb3\x54\x13\x8b\x5c\x85\x3c\x4a\x52\xb7\xbf\x36\x2e\xe2\x66\x19\x7e\x9c\x3c\xec\x80\xa9\xb5\xed\x0e\x71\x12\xf7\x80\x17\x64\xd2\xb2\xe2\x30\xdf\xae\x33\xd8\x2a\x0a\x38\x96\xf9\x3d\x8a\xcc\x9f\x20\xa2\x29\x9a\x23\x15\x9c\x72\x6b\x0b\xf8\x06\x19\xa3\xda\xe5\xe1\x5c\x9c\x84\x7a\x5f\x9c\x2b\x71\xa5\x81\xdc\x76\x03\xeb\xe2\xa2\x9f\xd0\x71\xea\x3c\x19\x5f\x25\xd0\xc7\x57\x15\x53\x69\xea\x66\xc7\x4e\x55\xe2\x74\x69\xbd\xae\xd1\xd0\x53\x71\x92\x78\xd5\xf5\x76\xe3\xce\x8a\xd7\x5d\x53\x89\x06\x5e\x2f\x57\x1d\x39\xd2\x7c\xed\x5a\xc7\xa4\x5d\x16\x1e\x06\x40\xe5\xb1\xba\x51\xdb\x5b\x44\x88\x12\x3c\xc8\xf3\x65\x9b\xfd\x82\xdc\x2a\x10\xfe\x55\x36\x68\xb4\x1e\xa9\x18\x0c\xe7\xdd\xe4\x3e\x9e\x6a\xcc\x86\xcf\xad\x6f\x2a\x11\x2a\x71\xc4\xde\xed\x8c\xf9\x86\xd3\xa6\xdf\x01\x15\x67\x04\xe1\x1f\x03\x49\xb6\xc7\xf2\xbe\x2c\x5e\x91\x25\x78\x4e\x05\xc4\x1f\xc8\x49\xe0\x6c\xf6\x75\x75\xc6\xe8\xd7\xfe\xad\x82\xfa\xad\x75\xcc\x26\x5d\xb5\xd4\xb4\xa3\x5c\x42\x86\xb2\x87\xac\x87\x74\xa8\x34\x20\x68\x7a\x9b\xec\x17\xe8\xfb\xf2\x75\x72\x78\x1a\x08\x4c\xbc\x9d\x11\x26\x3f\xb0\xf2\x54\x1a\xc5\x1e\x9e\x80\x16\xfb\xf8\x2d\xb5\x9b\x4e\x32\x00\xa9\x6f\x0a\x53\x0e\x2c\x64\x25\x92\x10\x43\x07\x62\x07\x8d\x45\x84\x4d\x2e\xac\x98\x8e\xa4\xbf\xef\x1f\x90\x39\xfd\x78\xdf\x2a\xac\x34\xb5\x05\x7f\x3c\x88\x2c\x9f\x1e\x6e\xc2\xd8\x9b\x1e\x90\xa1\xf5\xf7\x54\xc0\x4b\xdd\x3d\xb7\x8e\x34\xba\xcd\x65\xff\x83\xc1\xcd\xb7\x1d\x93\x8d\x7a\xdb\x3b\x23\xeb\x93\xb2\xca\xf1\x30\xd4\x52\x7a\x3e\x4b\x9b\xd1\xea\xf5\xec\xaf\xcd\x85\xf1\x8d\x42\x12\x23\x95\x80\x0d\x8d\xda\xe0\xd9\x74\x3a\x00\x58\xc2\x4d\xa1\xf5\xbe\xfc\xaa\xfa\x42\x19\x1a\x60\x98\xa7\xca\xd4\x5b\xeb\xdd\x18\xf3\x55\xc2\xcb\x1f\xc4\x62\xcf\x4c\xf8\x52\x43\xb5\x68\xfa\xc4\xfc\x0c\xef\x1f\x0b\x74\x10\x48\x4c\x12\x77\xfa\xa8\x0e\x6c\x7e\xcd\x0a\x3d\x67\x29\xeb\xd6\x72\x0f\xba\x5d\xf7\xf7\x3e\x6e\xe1\x98\xc4\xc6\x17\x23\x54\xa0\x97\x7c\x12\x97\xce\x42\x9f\x7d\x78\x4d\x92\x04\x69\x43\x97\xe7\x0b\x5a\x40\x9f\xc4\x97\x35\x4d\x52\x0c\x0b\x78\x8e\x82\x0f\x51\xe9\x87\xac\xc0\x42\x84\x71\x71\xf7\xf8\x30\x69\x84\x27\x2d\xf5\x74\x1c\x87\x21\xb1\x91\x77\xec\x75\xe4\x28\xe6\xce\x35\x54\x77\xd0\x6c\x2d\x9b\xc2\xfe\xd7\x55\xcd\xc2\xe4\xbd\x46\xc2\xee\x54\xca\xa7\xf3\xee\x4a\x91\x0f\xf5\x5a\xda\x3e\xd2\x56\xee\xcb\xf3\x85\x04\xc1\xbb\xf7\x05\x5c\x2b\xd6\xc0\xb8\xa4\x20\x82\x96\xe1\x54\x76\x6d\x29\xc1\xfa\x2a\x47\xf6\xb5\x5d\x3f\x1f\xd6\xfb\xef\xeb\xe7\xc3\xf6\x79\x3d\x28\x93\xd3\xb1\xe6\xb8\x17\x1e\xec\xe4\x1a\x8a\x2e\xce\x8e\x7e\x9d\x70\x83\x71\x56\x24\xdb\xb9\x45\x0a\xf8\x91\x02\x8c\xef\x26\xad\x08\xab\xd5\x20\xf9\x92\x80\xcb\x66\x43\xe6\x7a\xf8\x73\x69\x9a\x06\x03\xa3\xf6\x60\x4b\x67\xbf\x75\xcd\x02\x99\x14\xee\x76\xdf\xbf\xf2\xd9\x34\x0f\x38\x32\x6d\x5a\x4a\xa2\x71\xde\x5e\xf3\xc0\x80\x55\xdd\xd4\x4f\xc6\x20\xea\xef\xeb\xcf\xc7\xa5\x42\xcc\xd2\xee\xe1\x7e\x26\x10\xa3\x53\xca\xb0\x36\xfd\x79\xbd\x5c\xdf\xaf\x9e\x36\x8f\xfe\x42\xa9\xb4\x55\x2e\x5b\xd1\x54\x65\xf1\x54\x40\xcf\x9d\xdc\x75\xd1\x11\x4e\x82\xc2\x25\x50\x9c\x99\xda\x7d\x77\x91\x1a\xd4\xda\xdf\x41\x9e\x7b\x85\x8d\xf6\x67\x1d\x62\x6e\xfa\x7b\xa9\x73\xf4\x9a\x3a\x1b\x40\xcb\x84\x22\x79\xc6\x51\xfc\x5a\x89\x93\x8b\xb6\xf9\xe3\x14\x8d\x2d\xef\x11\x9a\xf1\xf5\xd5\x9c\x54\x51\x28\x1c\xe8\xeb\x4e\x1c\xe1\x41\xa8\xb7\xac\x80\xab\x4e\x12\x37\x08\xa1\x75\x7b\x8a\x5b\x00\x3d\x0a\xc9\x4e\x4d\xd8\xaf\x82\x0f\x9f\x70\x74\xb5\x57\x51\x80\xb6\xf6\xf9\x34\x8c\xd1\x6a\xad\x63\xe3\x99\x0c\xca\xf5\xb1\x35\x83\xa1\x5a\xfc\x7c\x75\xee\xe3\x9c\xa3\xed\xcf\x08\xdc\x12\x93\xad\xa0\xce\x2a\x31\xc2\x7c\x69\xd0\x96\xcf\x52\x68\xdd\xcc\xda\xe3\xe3\x95\x06\x34\xa0\x29\x6e\xab\x2e\x6f\xaa\x73\x17\x3a\xd2\x86\x04\x88\xa6\xc5\x22\xa5\xec\x9a\x5f\xc4\x77\x4b\x00\xc9\x15\xce\x45\x5d\xe6\x4e\xb8\x64\x84\x1a\xd7\x86\x9b\xc4\xca\xbf\x3d\x83\xd0\x93\x5a\x2b\x08\x88\x15\x3d\x1d\x08\xd1\x8e\x92\xf2\xd1\x68\x42\x40\x10\xc6\x28\xc6\x21\x50\x19\xad\xab\xb9\x1a\xe5\xb8\x20\x88\x25\x66\x2a\x30\xf1\xe2\x09\x8e\x7c\x1b\xb7\xa1\x35\x0d\xae\x5a\x77\xcc\xcf\xc5\x02\x20\x51\x82\xea\x1a\xcb\xdf\xd6\x7f\xac\xca\x11\xe3\x08\x90\x24\x44\x20\xde\x51\xfc\x6a\x8d\x94\x8e\xdb\x17\x9b\x52\xb4\xa5\x0e\x52\xe8\x57\xb8\xad\x00\xfe\x33\xb1\x41\x81\xc8\x94\x39\x3a\xda\xdd\x5b\x76\x72\x6c\x24\xab\x5c\xd4\xf5\xf2\xf2\x50\x6a\xc8\x47\x45\x53\x40\x63\x45\xc3\x41\x9d\xd1\x52\xd4\xd0\x69\x2b\xb5\xed\x89\xc1\x44\xe1\x3e\x53\x7b\xa1\xf6\xa5\xd3\xce\xb3\xac\x19\x7f\x91\xf7\x1f\x2f\x0d\x40\xb9\xc2\x04\xc5\x6e\xbd\x7a\x7a\xbc\x39\xbc\xec\xd6\xcf\x87\xd5\xcb\xbe\xbb\x92\x52\x4e\x03\xa0\x42\x16\xac\x45\xa1\xdd\x66\x58\x8f\xf8\x4a\x20\x8c\x42\x04\xd3\x9e\x86\xd2\x92\xed\xef\x49\xea\xd5\xab\x3b\x83\x63\xea\xbf\x74\xa5\x4a\x10\x72\x40\xca\xbc\xd7\xaa\x3c\x9f\x6c\xf2\x0b\x9f\xdb\x7a\x39\x93\x5b\x0f\x25\xc1\xaf\x6d\x63\xff\x33\xb6\x3f\x44\xa1\x42\xfb\x41\x75\x97\x9b\xd9\x3e\x21\x92\x41\xec\x82\x71\xc1\x2f\x0f\xbc\xfb\x51\x89\xd3\x69\xba\xbc\x00\x23\x21\x62\x9e\x5c\x9e\xf3\xa5\xee\x42\x58\xc0\x52\xc0\x17\x99\xd5\x0e\x27\xe6\x7e\x4f\x82\xd8\xc8\x8e\x2f\x0c\x35\x27\xac\xcf\x3a\xbe\xd5\x84\x1a\x7c\x4f\xcb\x0a\xc4\x7b\x77\x2c\x8f\xd3\xc0\x4b\x4f\x1e\xc1\x67\x04\xbe\x0d\x72\x44\x90\x68\x2b\x1d\x88\xda\xd2\x15\x34\xe5\xcc\x0a\x0f\x9c\x08\x17\xdb\xe9\x48\xcb\xac\x68\x70\x33\xe2\x24\x02\x4e\x00\x87\xf9\xc1\x2a\x53\xc2\xec\xb9\x1c\x3f\x4a\x6b\x06\xac\x0b\x1d\xfa\x9b\xe5\x8c\x63\xf8\xc0\xca\xc3\x5b\x6a\xb7\x39\x24\x9c\xef\x1e\x83\x2f\xd9\xc7\x80\x36\x26\xc4\x45\x33\x5f\xa2\x0a\x3c\xe1\x98\x5b\xb7\xb1\x09\x0c\x60\x8e\xb9\x28\xae\xf2\x68\x9f\xe3\xa4\x21\x35\x29\x06\xd4\x5c\x44\xe0\x36\x13\xcd\x16\xaa\x75\xf3\x36\x28\x22\x04\xe1\x2a\x3c\xf3\xb2\x7c\x3f\x9f\x36\xbb\xa7\x90\x90\xf8\x40\x0e\x22\x3f\xbd\x89\x03\x1d\x7d\x03\x41\x2c\x97\xd1\xc3\x65\xa3\xcb\x7c\x55\x8e\x19\x70\x40\xb0\xd0\x46\xf5\x3d\x02\xbf\x50\x65\x55\x81\x6a\x5c\xf9\xc7\xb2\x2c\x74\xbd\x2f\x7f\xd8\xb0\xb9\xf5\x8e\x7d\xd4\xbd\x3b\x47\x4a\x11\x07\xee\x0a\x6b\xd1\xa6\x98\x5d\x98\x41\x52\x8d\x99\xad\xe5\xf2\x71\x74\x06\x99\x00\x3a\xc2\xbb\xf3\x09\x2a\x25\xaa\x71\xa3\x88\xb0\x9a\xf8\x67\xd9\xc0\xae\x10\xa7\xfa\xad\xf4\x25\xcc\x23\x72\xaa\x99\x0f\xa9\xa8\x95\xd5\xb0\x75\x7a\x58\x36\xd6\xf5\x66\xff\x1c\x1c\x10\xff\x73\xee\x68\x96\xa2\xc3\x88\xe8\xd2\xfb\xac\x6e\x76\xad\xe5\xa4\xae\x66\x9e\x8a\x25\x71\xd3\xa8\x75\x6b\xdb\x65\xc4\x05\x66\x5d\x07\x4d\x2d\x29\xc5\xa9\x7c\xef\x0a\x20\x47\xd1\x11\xd0\x31\x45\xed\xc9\x5c\x20\xe6\xe1\x1d\xb1\x13\xe3\xab\x68\xcd\xb1\x18\xaf\x40\xea\x68\x0c\x34\x2f\x8a\xcb\xbe\x5c\x14\xd3\xed\x0b\x62\x3b\xed\x94\x28\xf4\xe5\x5e\x74\x16\x1e\x80\x14\xb8\xbf\x1f\xb3\x22\x2b\xce\xc7\xed\xb0\x2e\xeb\xef\x67\x61\xb5\x11\x5d\x5f\x13\x4a\x5f\x31\xe6\x59\x73\x7e\x2f\xfb\x6c\xc7\xf8\x8a\x46\x25\x2a\xe8\x68\x6a\x54\xb3\x2f\x97\xe7\x0c\x99\x15\xdd\x26\x38\xea\x6e\x82\x44\x19\x4f\x59\x05\xa2\xed\x36\x53\xf1\x6c\x02\xce\x03\x5f\x45\x8f\xae\x89\xc7\x00\x78\x44\xc4\xa4\xbb\xe1\xa1\x03\xf6\x0e\x21\x11\xed\x7f\xbd\xca\x02\x0b\x0c\x21\x89\x8f\xa4\x6c\x5d\xb4\xa9\xfe\xc4\xe9\x31\x44\xc5\x63\x9f\xad\x75\xf6\x5f\xbd\x4a\x08\x0b\x0c\x35\xd2\xa7\xb8\x86\x38\x20\x13\x6a\x8d\xc1\x5f\x87\xf8\x04\x17\xcf\xf2\xcd\x11\x63\xe8\xfa\xe2\xb6\xf3\xfc\x96\x15\x65\xd7\x12\x53\xcc\xe7\xfe\xb4\x4b\x4e\x56\x16\xb7\x22\xcb\xa7\xce\xad\x89\x62\x40\x33\x5b\x89\x5c\xcd\xc4\xa6\x4d\x94\x6a\xaf\xf5\xb2\xcb\x33\xdd\x2e\x86\xc3\xbc\xba\xef\x65\x52\x8b\x4b\xd5\x1a\x63\x41\xf3\xb3\xd6\xb0\x20\x54\xd6\x58\xda\xd5\xa7\x6b\x9b\xc8\xf7\x02\xe3\x6b\x7f\x7e\x94\xd5\xa7\x20\x02\xd7\x3b\x21\x0c\x39\xc4\x0a\x50\xa2\x7e\x1b\xce\x77\x93\x28\xcb\xef\x88\xe5\xac\xef\x50\x8c\x36\x73\xc3\x8d\xc2\xd4\xd3\x7d\xf9\x3a\x2a\x5f\xb9\x29\xd5\xf9\x08\x45\x63\xc9\x87\xf4\x3c\x49\x8d\x49\x09\x40\x38\x8d\xeb\xd7\xcf\x1e\xd6\xe6\x2f\x92\xb2\x58\x4b\x47\x2c\x3a\x32\x1c\x4d\x1a\x4b\x24\x88\x39\x66\xc5\xba\x79\xdb\x42\xf5\x58\x5e\x95\xd0\x98\x54\x86\x29\x0c\x95\xfc\xbf\xb6\x78\x8d\x60\x1a\x61\x61\x58\x27\x12\x2d\xe1\x35\x2b\x3a\xaa\x57\x16\x18\xc9\x44\x4a\xad\xf7\xda\x3a\x39\x9d\x50\xf9\xc8\x3e\x31\xca\x18\xd4\xe3\x81\x5f\x36\x12\xfb\x5d\xe4\xe6\x3e\xeb\xf2\x24\x46\xcb\xc0\x4b\x94\x3c\xc2\x87\x03\xc5\xcf\x7f\x1c\x60\x96\xe9\x01\x79\xf7\x7e\x66\x0d\x9a\xff\xcb\x6c\xaa\x81\xe9\x19\x07\x0c\x08\x85\xdc\x04\x38\x9f\x2c\x20\xdd\x5f\x15\x74\x88\xa6\xb8\xbc\x16\x01\xbf\x0e\x19\x76\xdb\xa0\x01\x43\x11\x18\x82\xfe\x82\x83\x63\xdf\x83\xe9\x3e\x83\x71\xda\xcb\xcf\x87\xc7\xc3\xcd\xe1\xc7\xe2\xfe\x7e\xbd\xef\xda\x68\x80\xce\x3e\x14\x7a\x61\x49\x51\xba\x96\x84\x52\xd9\x95\xa7\x15\x05\xe4\xf5\xdd\x39\xeb\x90\x32\xc6\x48\xc0\x9c\x15\xb2\x65\x2c\xc5\xd8\xba\x20\xc8\xfd\x29\xdd\xf2\x79\x3c\x1f\x37\xaa\xec\x37\x65\x12\x04\x51\x80\x7a\xf6\xce\x3c\x71\xac\x78\xbe\x31\x0e\xa8\xe5\xd7\x85\xd6\x4b\x50\x43\x63\x78\xf8\xee\x49\x10\x68\x89\x29\xff\xdd\x9f\xab\x95\x3f\x9a\x24\x16\x10\x92\xd5\x4f\xe7\x46\x95\x08\xaf\x1b\x85\x0e\x49\x40\x38\x47\xc4\xd7\x6a\xfb\xc7\xd0\xc8\x25\x01\x25\xa9\xb2\x84\xc9\x06\x39\x99\xac\x0f\x3c\xae\xcb\x26\x01\x4d\x42\x2c\x21\x5d\xbf\x3c\x3e\x3d\x6c\x16\xdd\xcf\x42\x7b\xf3\x73\x83\xc0\xd5\x2e\x05\x30\x7e\x33\x54\xaa\xd4\x93\x1e\x66\x4d\x3e\x1b\xd9\x25\x01\x05\x5b\x54\x8d\x45\x6d\x65\x01\xae\xa8\x6d\xfd\xef\x51\x3d\x2b\x09\x42\x61\xb5\x9f\x6c\xa5\xf2\x55\x1d\x93\xeb\x15\x09\xcb\xd1\x2a\xcf\x95\xd7\x6b\x1b\x7a\x5c\x24\x88\x94\x64\xaa\x23\x08\x7b\x2a\x96\xf0\x26\x72\x33\xb9\x73\xa6\x4d\xe8\xa8\x4a\x6c\xf0\x72\x79\x59\x0f\x32\xaa\x53\xee\xf8\xb9\xe2\x29\x12\xc4\xd2\x32\xa8\x34\x9f\x54\x29\x4c\x62\xea\x24\x48\x52\x8a\x81\xdc\xb7\x8b\xae\x4a\x57\xd5\xfb\xd0\xa3\xb3\xff\x36\xbe\xc7\x44\x05\xc8\x12\x7e\xbb\x5c\xaf\xfd\xc3\x25\x46\x63\xd5\xb8\xcd\x02\x76\x24\xc0\x8c\x04\x22\x04\x1c\x6a\x55\xeb\x0b\xd1\x41\x21\x1b\x09\x04\x10\xcc\x57\xfc\x29\x8a\xd7\xfa\xed\x2c\xb2\xbf\x8c\x73\x92\x40\x12\x86\x1c\x10\x58\x35\xd4\x6e\xac\xea\x6d\xbc\x8d\x90\x40\x9a\xc0\xca\xb4\x61\x48\xda\x85\x26\xfd\x35\x15\xb5\x4a\x6d\xa8\x12\x2f\x54\x0e\x9d\xaa\x76\xdb\xc8\x38\x4a\x6f\xdd\x65\xaf\x69\xf7\x1b\xa7\x98\x41\x5b\x89\x06\x5e\xcb\xea\x72\x03\xd6\x15\x18\x5f\x53\x29\x19\x85\xc3\x25\xb6\x9e\xf0\xf5\x90\x40\x3b\x6e\xff\xcd\xea\x69\xd7\xfa\x03\x8e\xc5\x75\x72\x22\xa0\x21\x58\xdc\xbc\x1d\x8c\xc3\xda\x8a\x4d\xa1\xe1\xd7\x84\x7c\x88\x04\x10\x51\x8c\x4f\xb8\xea\x98\xdb\xb2\x6a\xf7\xb0\x6b\x0d\xbe\xc9\x51\x82\xa2\x3a\x5e\x27\x1c\x24\x8e\x65\x71\x25\x1c\xf4\x45\x00\xc7\x9f\x47\xb1\x14\xe1\x83\x96\xe3\xc2\x65\xb9\x26\xdb\xcc\x78\xfc\x80\xb1\x04\xcd\xd6\x7b\xfc\xfb\x59\x54\x0d\x54\x3b\x10\x75\x59\x7c\xeb\x42\x38\xd8\x4d\xc3\x50\x8b\x15\x1a\x31\xe4\x08\x18\xdf\x87\x89\x22\x5c\xee\x06\x44\x5c\xbd\xcb\x49\x02\x23\x0d\x1f\xc1\x48\xc7\x4f\x68\x7b\x91\x20\x61\xc2\x61\x23\x36\x27\x53\xfb\x64\x76\x3d\x09\x0e\x13\x12\xe8\x90\x38\x4e\x71\x0d\xeb\xe6\x6d\xf7\xf6\x49\x79\x0e\x21\x84\x46\x3d\xe5\xd1\xc3\x39\x6f\x9e\x7e\x42\x65\xf2\xf2\x63\xd6\xc6\x23\x84\x44\x92\x46\xbe\x70\x02\xd5\x0a\xb3\xe6\xed\xa9\x79\x83\x6a\xcc\xe0\x3f\x39\x8a\x1b\x32\x24\x25\x68\xcd\xcc\xdd\xa5\x6e\xe0\x1a\x8d\x3f\x3e\x90\x9a\x80\x2a\x6f\x31\x7a\xe4\x24\x21\x61\xbb\xca\xdb\xf7\x65\xa9\x9f\xee\x44\xdd\x29\xb7\xf6\x47\x87\x2c\xc2\x18\xa2\x65\x88\x79\x70\x16\x92\xcf\x7b\xf9\x4e\x9a\xa1\x99\xbf\xdc\xaf\xd6\xfb\xd5\xe4\x0c\x11\x55\xca\x66\xc1\x1c\x71\xce\x2b\x74\x24\x28\x84\x44\x22\x45\x14\xf9\xfe\x0d\x96\x50\x37\x5e\x26\xb2\x6d\x51\x12\xe9\x51\x8e\xe2\x1d\xb6\xe2\x72\x9c\x92\x46\x12\x92\x50\x8a\x95\xfa\xfb\x8f\x72\x61\xaa\x4c\x4d\x07\xce\xf8\xd3\x27\x0c\x02\x17\x7c\x79\x3c\x1f\xdd\x1c\xee\x80\x0a\xed\x48\xb0\xaf\x0f\x06\x83\x61\x02\x06\x24\x84\x07\x56\xc6\xc0\x16\x26\xda\x81\x36\x5a\x9a\x49\x4a\x39\x32\x85\xdd\x41\x01\x75\x56\x2f\xcf\x17\x1b\xa6\x98\x9d\x29\x24\x0d\x2d\x27\xc1\xfd\xcb\xef\xbd\xc2\x43\xfb\xbb\x08\x11\x22\x73\x67\x93\x3d\x7d\xbc\x8b\x10\x21\x00\x59\xac\x84\xd6\xb7\x15\x00\xba\xa5\xd5\x5f\x55\x29\xf9\x63\x95\x46\xbe\x1f\xab\xaa\x83\x7a\xe9\x61\x70\xd8\xae\x9f\x57\xeb\xc7\xbd\x15\x7f\xf6\x97\x91\x44\xa3\xcb\xd4\x9e\xe8\xdb\xe8\x45\xca\x28\xb2\x7c\x40\xe5\xc7\x69\x90\x32\x26\x44\xca\x88\xd8\xfd\x4f\x8a\x06\xf6\x1f\xe5\x2d\x14\xc7\xf3\xa1\x6b\x56\x01\x26\xe4\x0f\x42\xeb\x6b\x6e\x0f\x42\x14\xd3\x08\xb6\xda\x75\xb8\xa5\xdb\xb2\x7a\x46\x98\xe9\xa4\xa7\xa6\x14\x39\xd7\x7c\xcd\xd7\xe3\x72\x75\x45\x0c\x41\x08\xd0\xd8\xd7\x3e\x94\x5a\x2f\x0a\xdd\x4e\xaf\x25\x7c\x92\x70\x22\x04\x58\x8c\xb8\xa9\xdf\xc4\xf1\x3c\xf0\x0f\x08\x01\x6e\xf5\x70\x5a\xa3\xa4\x5e\x9c\x9b\xd2\x55\x2f\xf5\xc1\x22\x42\x40\x72\x3d\x50\x54\xb5\x35\xa7\x7f\x15\x7d\x1c\x8f\x1c\x23\x22\xee\x92\xb1\x0f\x59\x81\xc5\xba\xa3\xc7\xa6\x41\x44\xd3\x2e\xde\xbf\x1b\x24\x91\xc7\x0f\x42\x83\x58\x73\xe2\xb7\x2a\x33\xb2\xce\x68\x20\x25\xed\xca\x3a\x6d\xbe\xa8\x7e\x2a\xba\x56\x13\x50\xee\x3c\xe0\x49\x92\x6d\x7c\x2b\x34\xa0\x5e\xac\xf2\xe9\xfc\x33\xd3\x65\x95\x89\x75\xa1\x4f\x65\x56\x34\xdf\xe6\x8f\x08\x0d\x22\x4f\x5a\x37\x6a\xc4\x5f\x34\x3b\x52\x29\x8d\x13\x69\x4b\x49\xdb\x79\xba\x53\xa2\x52\x59\x73\xb1\xeb\xbe\xbf\x5b\xca\x55\xe4\x52\x17\xde\x45\xd9\x56\xa5\xc9\xfe\x62\x16\x50\xaa\x62\x4b\xa2\x68\x5f\xf2\x27\x55\x73\x7f\xf9\xef\xff\x06\x29\x4f\x68\x98\x5a\xb6\xfa\xe5\x66\xbf\x7a\xda\x3c\x6c\x1e\x37\x77\xdf\xba\x26\xa3\xbb\x20\x61\x57\x69\x0d\x53\xbb\x82\x86\x40\x50\x99\x1a\x46\xb1\x27\xd7\x18\x85\x16\x53\x72\x5f\xbe\x2e\xcb\x72\x2a\x29\x34\xb7\x09\xd2\x48\x58\xc5\x1c\xc4\x04\x5c\x55\x08\x13\xca\x68\x84\x08\xc6\x2e\xc1\x69\xcb\xe6\x97\xcf\xde\x4c\xa7\x2c\x4a\xd0\x46\x5b\x5d\x8a\x77\x95\x89\xea\x3f\xc3\xf9\x42\x59\x12\x60\x69\x9e\x8d\x4f\x2e\x47\x95\x9f\x9e\x9b\xba\x9b\x39\x94\x25\x69\x2c\x3a\x63\xc1\x97\x60\x6d\xab\xb2\x34\xa8\x12\x6d\xe9\x60\x7c\xe7\x34\x41\x52\x1c\x4b\x06\x32\xdc\x94\x5d\x87\x24\xe2\x91\x8d\x54\xbe\xda\xdd\x74\xc6\xe0\xec\x09\xc1\xbf\xac\xea\x25\x34\x11\x96\xeb\x12\xe5\xd6\xb2\xba\xa3\xfc\x1d\xbd\xcd\x44\x09\x2c\x2b\xa9\x5a\xd3\x2c\xab\x6a\x2b\x4e\xeb\xdf\x05\x17\x32\x91\xf6\x86\xad\x5e\x98\x29\x0f\xbe\xda\xb7\x4f\x67\x11\x9a\x06\x29\x16\xfa\x6c\x1e\xef\x56\xf7\xdf\xba\x1f\x35\x22\x41\x55\x69\x6c\x9e\x61\xd9\xb5\x24\x0a\xa1\x5a\x22\xab\x6e\xaa\xf2\xe4\x30\xc9\x96\x56\xdf\x75\x11\xa9\x0a\x43\x2f\xfe\xd2\x97\x9e\x7e\x56\xb0\xf0\x15\xb4\xe6\x13\x58\xc5\x78\x54\xc9\x38\xc2\x5b\x3a\x9c\x6c\x46\xe7\xa6\x84\xfa\xb1\x6c\xd6\xbf\xa6\xac\x9e\x6d\x57\xc6\x75\x57\x7e\xe5\x9d\xb1\xf9\x95\x46\x05\x12\x17\xbd\x0a\x71\xc7\x37\x3b\x47\xce\xbb\xb3\x82\x0f\x56\xf8\xb0\xfe\x2e\xea\xb7\xb1\xc4\x18\x23\x54\xc7\x54\xfb\x50\x59\x2e\xea\x89\x55\x4d\x35\x17\xb8\xdc\xae\xf5\x87\x28\xc6\x03\x58\xeb\xc0\xf3\x1b\x6d\x1a\x38\x8e\xbc\x3c\x6a\x08\x60\xe4\x14\xd5\x7b\x51\xae\x73\x10\x7a\x25\xd4\x70\x93\xf6\x70\x67\xc7\xf7\x3a\x19\xa4\x26\xe5\x69\xd0\x7f\xbd\x5b\x24\x83\xef\xbf\x9c\x51\xb6\xce\xc3\xcd\x88\x76\xab\x0c\xa7\x67\x30\x14\xfd\x98\xd5\xf7\xf5\x1f\x63\xc8\xe1\x97\x23\x3a\x0c\x62\xc1\x11\x5b\x95\xd5\xbf\x97\x88\xa1\x1f\x9b\x2f\x61\x20\xa3\xc0\xd5\x52\x39\x12\xf1\x65\xa6\x67\x2a\xaa\x49\x18\x28\x8e\x19\x27\x53\x56\xef\xbd\xfb\x15\x12\x1d\x82\xf3\xe0\x5f\x6a\x9f\x01\xec\xa7\x7b\x48\x4c\x80\x76\x6c\xaf\xaf\x65\x53\x56\xfe\x78\x9a\xd8\x08\x3a\x1c\x4f\xcd\xa5\xc3\xd1\xf8\x46\x6e\xc7\x98\x43\x82\x5e\x4d\xff\x90\x1a\x81\x3c\xe2\x75\x23\xde\x61\x86\x38\x93\x84\x21\x49\x30\x95\xb1\x59\x3d\x1d\xec\x2e\xde\x35\x08\xbf\xa5\x3d\x97\x39\x8c\x84\x54\x48\x18\x91\x14\xe3\x78\x6e\xf4\x79\x71\xa4\x07\x57\x3d\x3a\xbf\x13\x87\x11\x67\x28\xc0\xb4\x12\x79\xfe\x8c\x38\x8d\x4f\x02\x85\x24\x8c\x52\x8d\xc5\x2a\xb5\x7a\x03\x7d\xce\x61\x9f\x7d\x52\x31\x4c\x42\x16\x24\x89\xf4\x65\xe3\xc8\x22\x82\xe0\xb6\xe1\x6c\x0c\x19\x0b\xe3\x21\x13\x5c\xeb\x63\xdc\xc2\x97\x6a\x3f\x78\x94\xf2\xf9\xb9\xaf\xae\x1f\x73\x74\x1d\x74\xb9\x3d\x7f\x92\x12\x27\x21\xd3\x56\xa5\xf0\x15\x9a\x9d\x2a\x3f\xa1\x19\x1e\x78\x5c\x21\xd3\x06\x77\xb9\xc7\xb2\x58\x58\xa9\xa1\xac\x1c\xe8\x53\x0f\x0b\xd6\xfd\xa1\xfc\x9f\xd3\x8b\x9a\x04\x8d\xef\xa5\xa8\x33\x35\x19\x1a\x71\x90\xa6\x96\x28\x00\x8e\xd9\xf9\x68\x49\xf8\xfe\xc2\x42\xbb\xca\xd1\x90\x30\x6e\x0d\xc5\xae\xd8\xb0\x39\xd7\xa3\x72\xc8\xc1\x40\x8f\x69\x1c\xe8\x4e\xdd\xfd\xdd\xd5\xc8\x39\x1a\xd8\x3e\xda\x4a\xc2\x24\x15\x18\xfb\xed\xd7\xe8\xab\xab\x4f\x1e\x33\x11\x22\x91\x9d\x22\xee\x95\x01\x33\x1e\x58\x89\xd6\x68\x2c\x97\x45\x7e\x89\xe3\xb8\xbb\xaa\x86\x44\xf4\x8c\xd1\x33\xf7\xc5\x59\x12\x49\x1f\xbf\xfd\x85\xb5\xaa\x65\xb1\xdf\x3f\x58\xa4\xa0\x0e\xbf\x0d\x42\xb2\x24\x4c\xa9\xe5\xc2\x44\x85\x74\x8b\x2a\x18\xd6\x3d\x4e\x00\x06\x24\x14\x01\x89\x3a\x15\x11\xb5\x2a\xab\xd9\x64\x27\x09\x45\x6a\xab\xc7\xfe\x14\xff\x2e\xcb\x61\x25\x04\x09\x85\x4e\x31\x22\xb0\xfe\x69\x13\x81\x57\x9c\x98\x93\xd7\xa6\x24\x41\xde\x8d\x8e\x4b\xfd\x65\x77\xf3\xc9\x10\xd7\x01\x47\x1f\x67\x2b\x0a\x0d\xc7\xd6\xb5\xf4\x0d\x24\x76\x42\x4d\x8d\x2b\x1f\xec\x85\xd2\x26\xa7\x00\xa2\x7b\xd6\xd3\xf6\x9d\xd4\x13\x46\x40\x12\x9a\xc4\x96\xd7\x63\xd4\x79\x14\xb6\xf0\x1d\xd2\x14\x3a\x59\x36\x0b\xda\x9a\x9e\x42\x2b\x70\x7e\xda\x2a\x07\xd1\x2e\x01\xe8\x70\xba\x14\x72\x39\xf1\xb2\xa2\x80\x68\xc4\xe2\xbe\x22\x22\xe8\xd7\x12\x46\xf9\x06\x12\x05\x91\x42\x0a\x4f\x53\x56\xaa\xbd\x6b\xa8\x9b\x27\xf3\x84\xb1\x53\xa8\x67\x4e\x97\x1a\x2c\x91\x76\xd5\x41\xfb\x0a\xb3\x6b\x2e\x30\xe1\xfa\x50\x69\x45\x00\x2a\xa7\x16\x73\x0b\x30\xc4\x1a\xb7\x1d\x14\x81\x4e\xd4\xbe\xfc\x00\x8d\xe4\x1c\x4f\x66\xf5\x56\x66\xaa\xdb\x1b\x22\xaa\x42\x04\x3c\x59\x95\x83\xf5\xbf\x49\xe8\xac\xc3\xf0\x6f\xee\x6f\xd7\x31\x0c\x2c\x90\x03\xa9\xb5\x7a\xd5\x4b\xdf\x4a\x78\x10\x78\x56\x8b\x02\xd1\x64\x03\x6a\x71\x12\xb5\xdb\x8c\xf6\x96\x53\xf4\x88\x34\x28\xe3\x1b\x0e\x63\x86\xe1\x67\x3c\xbf\xd7\x5f\xaf\xfb\xd6\x38\x22\xc3\x71\xd6\xee\xa4\xab\xbf\xef\xc6\x5f\x2e\x0a\x39\xb5\x32\x64\xc7\xf2\x27\xec\xcb\x45\x05\xe2\xdb\xd8\x2c\xed\x3a\x32\x39\x50\xcc\x5c\x95\x45\x81\xac\xf8\x3d\x23\xcb\x10\x90\xe7\x0f\x12\x96\x29\x57\x7f\xc2\x5f\x38\xda\x85\xfc\x31\x40\x91\x70\xbc\xb5\xcb\xc6\x22\x3b\x7f\x9b\xdc\x3a\x00\x56\xfa\x78\x4f\xbe\x5d\xfb\x9e\x2d\xe9\xcf\xbc\x0c\x14\x89\xa2\x20\x94\x0e\x0c\x5d\x94\x1a\x8e\x65\x01\xb3\xda\xbf\x6d\xd7\x88\x60\x2d\x64\x01\x1f\xdd\x3b\x8d\x62\xc0\x58\xcf\x6a\xb3\x7f\x7e\xf9\xc3\xff\x1a\x47\x29\x5a\x2b\x76\x57\xbe\x2b\x73\xfd\xc9\x30\x8d\x19\xb7\xb2\xab\x22\x57\xa8\xd9\x0b\x35\xb2\x24\x3f\x9e\x8f\x60\x05\xfc\xc7\xb7\x10\xc7\xa9\xa3\xdc\xc1\xc2\xb9\x7a\x64\x86\x44\x89\x30\x3e\x3f\x36\xae\xe3\x21\x11\x4f\x99\x27\x56\xb7\x6b\xd5\xe0\x93\x70\xa5\x10\x38\xea\x84\xd1\x57\x80\xe5\xf4\x9f\xbc\x2f\xae\xc1\xdb\xc8\xad\x15\xd6\x2e\x30\x96\x92\xcb\x11\xb5\xbb\x6e\xa9\x31\xb8\x06\x76\x4c\x5f\xbb\xb3\x74\x94\x02\x18\x4c\x9e\x3c\x97\x88\xb8\x53\x93\xc7\x55\xc9\x21\x53\x6e\x26\xba\x9f\x6d\x47\x6e\x3b\x56\xf0\xb3\x7c\x87\x9d\x33\x4a\xfe\x2a\xa2\xe1\x0f\x06\x8e\xf4\x5d\x0f\xe2\xb5\x80\x26\x53\xf5\x75\xc6\x98\x44\x92\x84\x08\xed\x3e\x59\xde\x73\x5b\x06\xd7\xde\xf7\x20\xc7\x15\xe9\xd8\xca\xc9\xbf\x95\x55\xdd\xda\x7b\x70\x3b\x9d\x45\x3a\x09\x90\x64\xf7\xa3\xac\xde\x31\xea\xb2\x9a\x16\x95\x7f\x1e\xdb\x8e\x74\x62\x47\x9a\x86\x9f\x90\x97\xa7\x67\xfb\xb5\xc7\x1f\x5b\x2b\x03\xa1\x93\xe6\x83\xea\x20\x94\x82\x53\xd7\x08\xca\xbe\x26\x1b\x50\x5b\xad\x1f\xf7\x3e\x80\x16\x99\x20\x0c\x7b\x2b\x7e\x5b\x95\x4d\xa9\xca\xfc\x16\xe0\x19\x54\x76\xca\x26\x02\xa2\xed\x01\x21\xc1\x8c\xda\xe1\x11\x3e\x56\x9e\x13\x7a\x6a\x2d\x4e\xa6\x8a\x51\x02\x89\x4e\x2c\x43\xf1\x88\xe9\xcc\xf6\x60\x01\x0b\x55\xdc\xaf\x03\xcb\xf2\x13\xac\x0c\x61\x01\x70\x0c\x73\xad\xb6\xdb\x61\xdd\x3e\x69\x8d\x53\x9c\xba\xfb\x4c\x14\xff\x78\x3b\xf7\x34\xbf\x84\x11\xb0\xd1\x8d\xbb\xe7\xf5\xfa\x71\xb9\xd9\xfb\xdf\x29\x8d\xd0\xd8\xda\x8a\xbc\xdd\x10\xbe\x0a\xcc\x32\x1a\x01\xee\xb5\x0b\xeb\x0d\x7d\x8a\xae\x21\x8c\x0a\x89\x31\x49\xf7\x9d\xdb\x47\xce\x27\x65\xc6\x84\x85\x31\xc1\x30\xa3\xdf\x24\xe6\xe7\x17\x0b\x13\x22\xc2\x11\x1b\xc4\xd8\x0d\x75\xdd\x22\x1e\xdb\x85\xa3\x35\xce\xda\x1d\x7f\x9c\x3a\x64\x11\x17\x16\x7d\x38\xab\x53\x4e\x7d\x37\x46\x39\x5a\x5b\x1f\x1e\xf6\x07\xfa\x21\x9b\x84\x35\x19\x0b\xad\xfe\x8c\x87\xf9\x4e\x5a\xa5\x40\xfb\xf8\x28\x7e\x79\x62\x16\xdf\xa2\x3b\x55\xf8\x19\x3e\x4e\xd7\x29\x0e\xb4\xb0\x7a\xe0\xa7\x9b\xf2\x75\x10\x50\x66\x71\xc8\xb0\x08\xe4\x24\xea\xfa\x46\x74\x3f\x27\x31\x43\x7e\x3f\x14\xf6\xcd\x26\x4b\x20\xe3\x14\x8c\x2f\x3b\xdb\x56\xe5\xaf\xcb\x10\x80\xfe\x59\x64\x6c\xb0\xd7\x30\x1e\xa5\x08\x79\xb5\x18\xd6\x5f\x96\x43\xea\x2a\x8c\x7d\x95\xa9\x27\x8c\x2b\x8e\xb1\xa7\xe7\xf5\xea\x76\xf5\xf4\xc9\xd7\xe5\x20\x98\xdf\x32\xdb\x0b\xbc\xd4\x43\xc9\xd4\x49\x0c\x8d\xa5\x61\xc2\x10\xd1\x2f\xaa\x95\xa5\x85\x9f\xbc\x7b\x41\x03\xe9\xa0\x0c\xa8\x25\x2b\xae\xf8\x10\x09\x93\x04\x70\xd7\xff\x4f\x3f\x38\x64\xc8\xd0\x45\xde\xed\x17\xcf\xfb\xcd\xe3\xdd\x61\xc0\xdb\x42\x98\x22\x11\xb6\xc2\x31\x6b\x3e\xa5\x9b\x9b\xda\xf6\xa3\x99\xa3\xa4\x55\xfe\xd6\x55\x79\x42\x2c\xbf\x65\xeb\xfe\x7c\x02\x29\xb0\xf1\x7f\x09\x75\x73\xa8\xbb\x9d\xe2\x90\xe1\x56\xe1\x3a\xe9\xc8\x95\x33\x42\xb3\x6c\x5f\x88\xc6\xa2\xf9\x45\x63\xf7\x93\xd9\x75\x88\xe9\x48\xb3\xae\x7e\xc9\x5a\x5b\xf5\x94\x8d\x88\x30\x2d\x22\x99\x8e\x83\xcf\x83\xe4\x2c\x33\x84\x62\x66\x63\xf5\xf4\xf0\xf0\xf2\xb8\xd9\xff\x69\xe5\x89\x6c\x25\x44\xd7\x89\x32\x5c\x71\x6d\xee\x77\xf7\x96\x9d\x9e\x8a\x87\xf5\x62\x64\xc7\xfb\x31\x6f\xb4\xc6\xa5\xfb\x98\xbd\x62\x74\x6e\x54\x1e\x39\x19\x04\x71\x40\x19\x06\x65\x9a\xb7\x0a\xe0\x7b\xd9\x7c\x2f\xcf\x55\xed\x00\x5b\xae\x38\xea\x07\xb8\x4a\x3c\x12\x07\x4c\x63\x20\x25\x3b\x8a\x57\xf8\xde\xc9\x22\x90\x38\x10\xd6\xaa\x5b\x68\x7d\x53\x1e\x45\x66\x6b\xaa\x1c\x56\x68\x86\x8f\x9d\xc4\x24\x8c\x79\xe8\x97\x98\x8e\x20\xda\x9f\x8f\x4a\x2a\x2d\x14\xc3\xad\x3c\x9f\x56\x36\xbb\x03\xc2\x90\x78\x63\xfa\x5e\xd4\x6e\x71\x73\x61\x61\xd7\x25\x0a\x0c\xf8\xaa\xfd\x01\xaf\xc0\xe8\x63\xc5\x91\x94\x91\xf3\x5f\x5d\xce\x77\xd7\x64\xc5\xfb\xe5\xbe\xfd\xc3\x0f\xf1\x18\x51\x2a\x68\x27\x68\x28\xca\xe3\x41\x8b\xf2\xd0\xd7\x78\xb4\xed\x89\x85\xb0\x88\xf7\xe9\x05\x58\x2c\x90\x88\xf2\xee\x9c\xbd\x5a\x0b\x61\xae\x96\xee\xd3\xe0\xe3\x97\x31\xfe\x98\xc5\x06\xc1\xbb\x8b\x57\xa8\x87\x9b\x59\xcc\x12\x97\xad\xb5\x6c\x38\x9f\x69\x8b\xcf\x96\x90\x91\x98\xf1\x70\x68\x55\xa3\xcf\x3f\xb9\xb0\x08\x10\x15\x78\xb2\x42\x1b\x9f\xe1\x3a\x06\xc3\x34\x8e\x65\x8c\x1c\x47\xe7\xc2\x60\xb8\xcc\x2f\x06\x35\x12\xe9\x8d\xe2\x3a\x71\xac\x0c\x9e\x5e\x89\x62\xd1\x34\x33\xdc\x39\xae\x1f\x17\x46\x44\x5e\x7b\x4c\xbd\xfb\x41\xda\x93\x45\xf2\xe1\x9f\xee\xa0\x14\x74\xe0\xc7\xc5\xea\xbb\x63\xd0\xf4\x38\x89\x58\xc4\x12\x4b\xd4\xb7\x59\xf1\x5a\x8e\xde\xa9\x80\x34\x0d\x87\x95\xd4\x53\xce\x3c\x12\x0b\x43\x99\x73\xf7\xbb\xd1\xd4\x31\x6d\x91\x58\x46\xdc\xc8\x5e\x76\x22\xab\x1b\xf2\x09\xc5\xce\xe7\xd6\x5c\xac\x12\x9b\xb3\xf7\x28\xea\x19\xb7\x28\x56\x12\x10\x94\x06\xe6\xa3\x81\x6e\xe9\x89\x95\x0e\x53\xd9\x99\xbb\x5b\xa8\xdc\xca\x38\x64\xbb\x73\x5d\x75\xd2\x97\x84\x2c\x2c\xb4\x2a\x2b\xa7\x35\x47\xbe\xaf\x06\x04\x8d\xa0\xd2\xd6\xa5\xe7\xaf\x23\xb1\x06\x8e\x69\x9b\xd7\x72\x24\x1a\x41\x62\x48\x24\x24\x9e\xea\x5e\xa8\xc6\xa1\x31\x7d\x6b\x2a\xd0\x03\xc6\x8b\x17\xfa\xe6\x33\x42\x75\x12\x83\xb6\x84\x02\x9e\x34\xf4\x66\xf3\x38\xb1\x6d\x62\xd0\x0a\x23\x43\xb8\xd6\xf6\xa5\x4e\x24\x36\x34\x49\x5d\xc5\xff\x10\xb4\x15\x9b\x58\x20\x5f\xc2\xb6\x2a\xff\x05\xaa\x39\xd8\x8c\xc3\xe4\xac\x86\xa7\x3c\xf6\x16\xd1\xe2\xe6\xe6\x79\xbd\xf3\x8b\x77\x12\x88\x54\x07\x1d\x79\x50\xeb\x7c\x77\x5e\x77\x42\x28\xb3\xf6\x8d\x03\x8c\xd7\x63\x90\x41\x42\x22\x8d\x96\xd6\x6a\xf3\xbc\xba\x5f\x0f\x6e\x37\x21\x3c\x46\x5b\x04\x69\xda\x1e\x4a\xfd\x74\x72\x3e\xdd\xf0\xfb\x8f\x5f\x4f\x42\xa4\xd5\x8c\xef\xbf\x60\x2f\xc5\xf3\xe5\xca\x92\xd0\x40\xe2\x3e\xdf\x60\x52\xcc\x5b\x2c\x9e\xac\x8b\x24\x21\xb1\xea\xb2\x4e\xa2\xc6\xcf\x68\x3d\xaa\xec\x22\x49\xbb\xf0\x23\x39\xa2\x27\x08\xf3\xc7\x33\x1e\x77\x8c\x7e\x50\x8f\x05\x33\x48\xc2\x4c\x8c\x18\xb3\x03\x3e\xac\xf3\xdf\x3e\xb1\xe8\x93\x38\x12\xc8\x30\x7e\x0f\x75\x5d\x16\x87\xf0\xb3\x6e\x1c\x70\xa5\xb7\x5e\xf4\xa6\x81\xe3\x57\x59\xb3\xab\x60\x59\x92\x24\x84\x0f\xc4\xe7\x0e\xc8\xff\x51\xe8\xf2\xb8\xd8\x6e\x0e\xf0\xcb\x5a\x74\xc3\x99\x9a\x24\xa9\x55\xa9\xa9\xa1\x69\x1d\x22\xbf\xf9\xb8\x75\x28\xe1\x81\xc1\x88\xe8\xc7\x5f\x7c\x0a\x1e\x09\xac\x36\xf2\xe0\xda\x6d\x2e\xfc\x8c\x4e\x38\x0f\x9c\x8c\x8f\x2a\x0b\x2d\xaa\xcb\x66\xf5\x34\x7c\xff\x9c\x47\x98\xed\x7f\x13\xf5\x9b\xd7\x70\xfd\xab\xcc\xee\x68\x72\x27\x22\xa6\x5e\xa7\xbe\x35\x2f\x6d\x1a\x08\x45\x77\xfa\x41\x2d\x92\x00\x4b\x17\x8f\x59\xe1\xe2\x6c\x61\xd7\x94\x6a\xcc\x23\xd5\x23\x20\xf4\xe4\x12\x46\x22\x47\xcf\x4f\xe4\xec\x72\x24\x48\x79\x7f\x7a\x49\xb4\x67\xc7\x7b\x46\xe2\x0d\xb7\xb6\x62\xd9\x7c\x2f\x7f\x74\xfd\xc9\x24\x35\x88\xf0\x73\xfb\xd8\x8d\xc8\x6e\xcb\x79\xfa\x0d\x92\xa8\x88\xe3\x82\x77\xbf\xd8\x6f\x47\x23\x55\x71\x49\x1c\x48\xc5\xda\x17\x03\x32\x26\x92\x28\x93\x84\x6e\x33\xb1\x80\xea\xe7\x19\x0c\xea\xe4\xb6\x74\x6a\xd7\x00\xa1\xf5\xb9\x86\xea\x8b\x20\x51\x02\x31\xf5\x54\xf1\xfb\x5f\x1d\x95\x81\x03\x0a\xfd\xf6\xe3\x6d\xec\x15\x26\x20\x05\x3a\xb7\x50\x4e\x6b\xdd\x48\x02\x40\x11\xda\xb8\xda\xf9\x74\x5d\xd7\x10\x62\x08\xdf\xd6\x7b\x7f\x7f\xba\xff\xf3\x93\x9b\x31\x91\xc0\x1a\x35\x14\x80\x1a\x67\x8e\x12\x13\x2b\x8c\x08\x7d\x17\x95\x56\xa5\x06\xdd\xc7\xf9\xff\x4b\x53\xc7\x9f\x08\x22\x0b\x97\x7b\xb3\xfe\xcc\xf8\x29\x78\x10\x25\xb8\xd7\xdc\x8b\x42\x5b\xb9\x7d\x37\x5e\xa6\xfd\x62\x2b\x62\xe0\x33\x43\xcb\x0b\x7e\xb6\xcf\x5c\x2f\x77\x14\x61\x01\xbe\x8a\xf5\xaf\xf2\x94\x8b\x02\x46\x91\x78\x4e\x52\xc0\x09\x0b\x9e\x53\xcc\xe7\x6d\xb6\xa2\xaa\x41\x4d\x36\x1e\x4e\x84\x40\x28\xd6\xf3\xfa\x7e\xbd\xd8\xad\x0f\xeb\xc7\x1b\x7f\xa6\x90\x27\xc4\x55\x84\xee\x8e\xa2\xba\xe2\x29\x74\xdd\xa2\x50\x62\x66\xbc\x3e\x9f\x4e\x65\xd5\x40\xe5\xd2\x0c\xf5\xb4\x5f\xec\x01\x2d\xcd\xaa\xcc\xcb\xaa\xfe\x83\x7b\x22\xd1\x3e\x79\xf4\xbf\x51\x30\x49\x24\xf1\x28\xb5\xa4\x55\x27\xac\x52\x03\x3d\xad\xf5\x25\x3c\x52\x29\xd6\xf2\x02\xf2\x0e\x0f\xdc\x18\x1e\x29\xe5\x91\xa2\x23\xbc\x0a\x8f\x8c\x51\xce\x06\x5a\x1c\x65\x36\x2d\x53\x1e\x78\xc7\x9c\x71\xa0\xc9\xf0\x85\x6e\xc5\xd9\xf3\xf5\x11\xce\x64\x82\x08\x42\x8f\xec\x76\x71\x2b\xfd\x05\x0d\x1f\xe1\x71\x62\x55\x82\x3a\x61\x98\x6b\xdb\x86\x27\x8c\x26\xa6\x97\x03\x98\x72\x1a\xf9\x5e\x22\xc1\x4c\xe9\x1d\xa0\x8a\xdb\x1c\x9f\x2c\xe1\x3c\x34\x98\xb7\x79\x06\x95\xc1\x4f\xd0\x8b\xa2\x2c\x6e\xca\x42\xcc\x05\x08\xfc\x21\x3c\xc1\x40\x50\xa7\x85\x9c\x8f\x06\x19\xe7\x29\x62\xc3\x3f\x20\xb3\x68\x8c\x6d\x05\x9d\xb8\x18\xe1\xdc\xa4\x88\x77\x15\xba\x2b\x88\x9d\x25\x46\x20\x3c\xa5\xca\x92\x95\x6e\xee\xd6\xcf\xdf\xa6\x6d\x26\xe8\x45\xbd\x3c\xdf\xc0\x9c\x71\xc7\xd3\x94\x21\xd0\x1d\x33\x2f\xd9\x69\xb4\xc3\x71\x21\x29\x2e\xb0\x96\x23\x7a\xd7\x51\x31\x12\x2e\xb4\x2d\x3f\x74\xd0\x3e\x04\xa4\x8d\x4f\x2c\xb4\xc0\x13\x17\x65\x93\x99\x4b\xcf\x09\x3d\x63\xf3\x72\x49\x04\xa2\x3c\x16\xf7\xf7\x4f\xab\xc3\xfd\xe6\xef\x2f\x9b\x9b\xc3\x7e\xbd\x78\xf0\x97\x93\x51\x98\x38\x01\xb4\x4d\xf1\xd3\xa6\x53\xe6\x5f\xbf\x4c\x04\x4d\xbd\x0f\x7f\xb3\xde\x8f\xee\x5a\x6a\xad\x53\xef\x0d\xd6\x4d\x79\x1c\x2b\xd3\x12\x2e\x41\x87\x66\x18\x88\x1e\x55\x41\x8f\xaf\xa4\x02\x43\xba\xac\x56\xfd\x54\xec\xdf\xb2\xda\x0a\x57\xb9\x0e\x3a\x94\x71\xe4\xa3\xe8\x8d\xc8\x77\x9d\x7a\x2d\xe1\x3a\x56\x68\x07\x1e\x4e\x15\x4c\x2a\x2b\x7d\x8f\x24\xe5\xb6\xee\xfd\x5f\xe7\xba\xf9\x84\xfc\xec\x6f\xa3\x3b\x82\xd8\x6a\xfa\x5b\xaf\x70\x1e\xbd\xf7\xa5\x11\xc4\x8d\x8e\xd0\x77\x52\xda\x2e\x8d\xe3\x38\x61\x1a\xc4\x36\x99\x5a\x41\x9d\xbd\x16\x8b\x7a\x75\xae\xae\x93\x73\x69\x10\x4b\x44\xbd\x81\xad\x9e\x42\xb1\x6a\x7f\x06\x12\x5a\x21\x62\x2c\x2d\xf4\x2e\xe2\xc3\xee\xe1\xf3\x70\x4f\x4a\x20\xc4\xe9\x9c\x67\x75\xe3\xf8\xec\xd1\xbc\x1b\x22\x5c\x67\xe2\x26\x29\xa5\x56\x01\xa0\xab\xd1\x5c\x3d\x79\xae\x54\x0f\xc8\x18\x3d\x7c\x4a\x4d\xa8\x6c\xac\xb0\xcc\xf7\xe5\xa6\x18\x42\x23\x53\xc6\x52\xd0\x03\x8f\xe6\x41\xf8\x50\x53\xca\x80\x63\x1d\x4f\x6b\x1e\xf5\xbc\x33\x24\x8d\x19\x24\xcc\x63\x31\x54\x55\xaa\x89\xe6\x19\x49\x13\x42\x90\xa6\xe2\xa5\x68\xce\xc5\xeb\x0f\x91\x9f\x2f\x7e\x25\x48\x93\x30\x4c\x2d\xd2\xb7\x68\x86\xe5\x08\x69\x12\x02\x2e\xc0\xb9\x97\x33\x22\x69\xa2\x12\xe1\x20\x5e\x3e\xab\x94\xa6\x41\x68\xac\x38\x69\x56\x8e\x79\x7b\x49\x9a\x52\x9b\x6f\x41\xc6\x82\xc1\x67\x1e\x7f\xc7\x34\xb4\xe5\x5c\x18\xc9\xf1\x64\x65\xf3\xb6\xb4\x3f\xc2\x61\xe1\x73\x51\x37\x7f\x82\xa8\xec\xb0\x1f\x14\xa2\x91\x54\x04\x09\xf7\x78\xa6\xf2\x78\x3c\x17\x59\x73\x91\x97\x99\x2c\x4f\x2a\x88\xf0\xb9\xf8\x1d\x34\xe7\x79\x01\x75\x92\x8a\x24\xb4\xc8\xec\xa6\x3c\x2d\x30\xad\x91\x15\xaf\xdd\x1a\xed\x3b\x99\x10\xc7\x75\x27\x42\x8f\x22\x57\xbe\x55\x02\xc5\x18\x0e\x12\x60\xdd\xc0\xb1\xfb\x06\xd2\xc4\x01\xed\xf0\x9b\xdc\xff\xac\xe2\x10\x39\xad\xda\x49\x70\x1e\x2f\x99\xa9\x26\x81\x0f\x11\xf8\x8d\xe7\x53\x5f\x6c\xf2\xf6\x80\x31\xed\x39\x05\x9a\xb2\x9a\x68\xf6\x92\x14\x52\x5b\xd0\x76\x5f\xbe\xd2\xcf\x32\x2a\x5f\xf2\x69\xfe\x6d\x88\x42\x4c\x01\x48\xda\xa5\xed\x07\xab\x64\x6a\x52\x1b\x43\x14\x27\x44\xc2\x3e\xc2\xc7\xea\xf6\x69\x3c\x36\x44\x90\x84\x46\x76\x10\x72\x84\xf1\x9f\x40\x65\x22\x6f\xed\xe3\xda\xb1\xb4\xcf\xfb\x03\x22\x10\x06\x79\x9e\xea\xa6\x54\xef\xcb\xf3\x65\x2c\x6d\x33\xfb\x6e\x44\xa0\x42\x44\x7b\x1e\x2f\x2f\x75\x56\xbc\x7a\x80\xa5\xbb\x65\x41\x08\xa4\x5d\xe1\x1b\xca\xa1\xe9\xae\x29\xb2\x62\xf1\x77\x56\xbf\xfe\x07\xa0\x3e\xcc\xf9\x8a\x56\x8e\x08\x22\x34\x96\x97\xfe\x9e\xbd\xbf\x5b\x22\xc5\xa9\xa2\xc9\xf8\x39\x88\x22\xa9\xdb\x94\x0e\x75\x99\x0f\x61\xdb\x82\x72\x8a\x01\x5e\x99\xe9\xf5\xc3\xd3\xe3\x7e\x53\xa8\x0a\x09\x6f\xfb\x0e\x0c\x77\xb4\xdd\xe2\x7e\x1d\x20\x88\xdd\xb7\x84\x31\x20\x21\x99\xdd\xbc\xd1\xce\x36\xe7\x5e\x93\x78\xf2\x21\x42\x01\x9a\x75\xf3\xe9\x24\x8a\xcb\xb6\x02\x03\x15\xa0\x1d\x39\x1c\x3f\x22\x52\x3a\xf1\x39\x40\x4b\x9a\x33\x7e\xfe\xc8\x24\x98\xcb\xfc\x2e\x3e\x07\x7d\x7f\xfd\x95\x98\xa1\x78\x86\x55\x59\xd4\xed\x4a\x5d\xbc\x7e\x1f\xd4\x8e\x4d\x5e\x5f\x2c\x2d\x2f\xbd\x50\xcd\x59\xe4\x07\x03\xa0\x3b\x51\x5f\x22\x92\x38\xa5\x6e\xf3\xdc\x9d\xc0\xd5\x1f\x39\x4d\x0c\x0f\xd7\x11\x09\x8f\x30\x34\xee\x70\x1b\xab\xac\xc2\x5d\xbb\x07\xf2\x09\xce\x05\x16\xcf\x6d\x33\xd5\x9c\x2b\xb8\xcf\x64\x25\xaa\x0b\x26\xff\xc6\xb7\xce\x55\x88\xe6\x60\x6b\xa2\x22\x3e\xa1\xf3\x6f\xfa\x4d\x40\xa4\x84\x60\xdc\x0d\x6b\x0c\x50\xf3\xbf\x2f\xf5\x68\xbd\x01\x0c\x44\x41\xeb\x3a\xc3\x88\xc7\xbb\x6d\x14\x98\x47\x3d\x96\x3a\x33\x97\xed\xc3\xde\xd3\xb6\x8f\xdf\x89\xd0\x0a\xfd\xfd\x2e\x8a\x3e\x01\xfe\x09\x19\x32\x8c\x0e\xe2\x1d\x3c\x3d\xae\x0f\x37\x83\x91\x23\x13\x8a\xee\x4d\x71\x3e\x3e\x19\xf4\x26\x77\x0d\x74\xc6\xbe\x50\x81\x26\x81\xc7\xc5\x1d\x61\xd9\x2e\x4d\xb8\xb3\x0c\x72\xd5\x42\x07\xb6\x2a\x61\xf7\xd6\x19\x83\x93\x8f\x0c\x89\xc1\xa9\xb8\x7a\x7a\xd8\x2e\x1e\xff\x74\x99\x8d\xc3\xfd\xd3\xea\xb7\xc3\x76\xfd\xbc\x79\xf2\x6e\x90\x00\x9e\xb0\xc8\x59\x53\x3b\xb0\xc2\xa8\x63\x3e\xd9\xeb\xed\x5e\x98\x80\xa3\x65\xd9\xce\x9a\xef\x87\xcd\xe3\xe1\x61\xf3\xf8\xb2\x5f\xfb\xe8\x9b\x30\x2a\x42\x52\xfa\x83\xad\x30\x70\xfb\x92\x15\xb4\xf6\x7b\xa4\x0c\x12\x91\xba\xf0\xd3\xcb\xee\x66\x3f\xfe\xd6\x32\x90\x69\xd8\x89\x18\x88\xfb\x52\xbd\x3b\x41\x73\x7f\x38\xa5\x49\xe0\x36\xa9\xcd\xea\x69\x04\x8d\x95\x61\x90\x3a\xdc\x4d\x01\x95\x68\xe0\x01\x8e\x65\x75\x41\xa4\xf7\xf5\x53\xf9\x63\xe2\x18\x83\x2c\xa2\xdd\x09\x97\x65\x89\xb2\x7f\xb3\x53\x48\x86\x3a\xc1\xec\xd2\x61\x88\x79\x7c\xf6\x33\xfa\x2a\xf2\x30\x9c\xe0\x32\x22\x32\xa6\x1d\x02\xc9\x6a\x5d\x3d\x99\xd5\x94\xf3\x90\xc8\x88\x4a\x7c\x06\x0d\xc2\x82\x14\xfd\xe7\x97\x51\x1c\xa6\x36\xb9\x95\xbd\xbe\x42\xf5\x62\xb5\xe8\x2c\x08\xdd\x77\xe1\x96\xc8\xaa\x79\xab\xca\x8f\xfa\xc7\x1b\x14\x77\x56\xb6\xc2\x8b\xb6\x3c\x96\xcd\xc6\xe9\xd9\xe8\x41\xec\x53\xb2\x28\xc6\x2f\xb7\xbe\x59\x95\x15\x38\x6d\x75\xf2\xdf\xa1\x31\x24\x4b\xad\x35\xf7\x50\x16\xaa\xba\x9c\x46\x9e\xbb\x8c\x23\x2b\x49\x8e\xc5\x9b\xa0\x6f\xb2\x9f\x9f\xbc\xdd\xd8\xf1\x92\xdd\x8b\x6a\x12\x93\x94\x71\x6a\x2b\x7e\xb3\xda\xf9\x2a\x35\x4c\x5f\x5b\x6c\x00\x47\x55\xa7\x89\x37\xa5\x8c\xff\xd4\x88\x95\x09\x15\xa9\xe8\xf6\x4b\x07\x0d\x9d\x5a\xce\x32\x49\x23\xaf\x88\x66\xca\xea\x78\x0b\x90\x43\x5d\xcf\x25\xa5\x47\xdb\xff\x5c\x6a\x5a\x26\xa9\x66\xcc\x65\xda\x1d\x58\xd4\xb5\xa4\x2c\xc2\xaf\xbf\x2b\x4f\x6f\xe5\x28\xaf\x24\x53\x9e\xa2\xc7\x7e\xe8\x82\x91\xb6\x14\xc5\x37\x0b\x8a\xcc\x07\xb2\xf5\xd9\x9b\xdf\xcb\xa1\x1e\xe7\xf8\x49\x52\x95\x58\x95\xe0\x06\x4e\x87\x1c\xb5\xc7\x5d\x8b\xa0\x56\x65\x0e\xaf\x7b\xf0\xe4\x3c\x03\xae\x09\x22\x05\x33\x41\x34\x92\x0a\x3b\xf5\xc1\xd7\xf9\xad\x47\x8a\x84\xe1\xae\x79\x2f\xea\x66\xfd\x0b\x54\x77\x2e\x69\x02\xe5\x36\xbd\x79\x5a\xdb\xeb\xec\xbc\x94\x82\x20\x20\x24\x6b\xe0\xe8\x9d\x94\xaa\xc7\x68\x7c\x96\xc5\x73\x47\x2b\xc5\xc2\xae\x94\xf2\x36\x2f\x71\x43\x7a\xfa\xf0\x8c\x0c\x73\xa8\x80\xc9\xc3\x68\xcd\xf0\xed\xf9\x7d\xad\xc3\xd1\xf8\x76\x43\xd1\xc9\xbd\x39\x1f\x8f\x97\xa9\xee\xce\x15\x36\x99\x04\x7e\x14\x02\xb5\x02\x9a\x08\x1e\x5b\xb5\xd3\xa8\x3c\x8c\x10\x11\x2a\x08\x25\x67\x2e\xd3\xb9\xcc\xf4\x90\xc4\x8a\xa8\x80\x9b\x0e\x75\xd9\xee\x20\x4f\xdd\x76\xad\x48\x28\x30\x7b\xf1\xb0\xf8\xe3\xd0\x7a\xf1\x3f\xd6\x37\x87\xe5\xd3\xcb\xe3\xfe\xcf\xae\x07\x4b\xd1\x9f\x81\x42\xdf\x89\xa3\xcc\xb3\xe2\xb5\xb5\xc7\x2e\x13\x02\xc4\x91\x47\xab\x88\x00\x1c\xaa\x37\x77\xab\xfc\x2c\x07\x98\x1d\x85\x1f\xe9\xff\xfd\x7f\xff\xaf\x34\x26\xcf\x0a\xd4\x80\x19\x4f\x26\x45\x29\xc1\xe4\xc8\x5b\x99\x6b\xa8\x5c\x74\x69\xc8\x15\x4c\x54\x98\x86\x51\xe7\x8c\x38\xfa\xb1\xe5\xc5\x49\x1e\xcc\x8d\x13\xee\x0f\x14\x14\xc1\x2a\xab\xed\x6a\xdd\x3a\x95\x5e\x5f\xb9\x6b\x66\xda\x05\xcf\xb6\x65\x9e\xd7\x3d\xb9\x18\x51\xa1\xb4\xb0\xb2\x1a\x1a\x4c\xab\x4c\xa9\xb3\xa6\x5f\xd0\x5f\x32\x0a\x54\xec\xa2\xe4\x9b\xa2\xa9\xca\xfa\x64\x77\xd4\x79\x6e\x01\x15\x81\x35\x98\xf3\xf2\xf5\x01\x19\xe1\x1c\xdd\xe7\x50\x0b\x96\x28\x16\x29\x14\x63\x95\xe7\xcb\xee\x54\x65\xd3\xf4\xb9\x62\x11\xa8\x21\x75\xfc\x22\xcf\x27\x91\x08\xdf\x51\x33\x1c\x1a\x15\x56\xb5\xb4\x7b\xf1\x0f\x80\xf7\x4e\xd3\x91\xa8\x98\x51\x2c\xc0\x86\x5f\xa7\xb2\x42\xd4\x71\xd7\x92\xda\x00\x7c\xf3\x51\x3e\x94\x45\xf3\x56\xdf\x8b\x8e\x6c\x8b\xa8\x84\x2a\x2c\x70\xb1\xa5\x54\x20\x8e\x48\xa7\x33\xbe\x78\x12\x59\xfd\x2a\xa1\x47\x0a\x03\x03\x25\x38\xf7\xe7\xf8\x30\x4e\x8c\xaf\xa5\x5d\x9e\xab\x5a\x4c\x56\x63\xc5\x19\x43\xa1\x89\x02\x7e\x35\xfb\xf2\x5c\x15\xa2\x35\xe0\x97\xa2\x78\xf7\x37\xc7\x13\x86\x84\xb7\x37\xcb\xee\x17\x1d\x69\x67\x63\x1d\x44\x25\xb3\xa6\x3e\x7c\x7c\x0d\x75\x50\x1c\x02\x9f\x46\x6a\xdd\xbe\x91\x74\x10\x51\xa9\xa4\x61\x0f\xc0\x3e\xa1\xd0\x0e\x0a\x36\x4d\xbe\x94\x08\x00\xc5\xa0\x6e\x17\xab\xfd\xd3\x84\x67\x93\x28\x11\xa7\xb1\xa5\xe6\x6b\x5d\x89\xb1\x7d\xeb\xbb\x24\x36\xcd\x26\x34\xca\x76\xd4\xb3\x01\x51\x25\x29\x31\x6e\xc6\xb4\xab\x80\x12\x95\x2e\xc4\x14\x35\xae\x64\x0c\x3e\xa8\x68\x73\x68\x28\xca\x49\x51\x72\x63\xda\x95\xc7\x81\x7b\x7a\x67\x12\x3f\xf6\x7c\x49\xbe\x4f\x6a\xc5\x08\x0a\xf8\x58\xff\x3a\xb5\x5f\xb8\xfe\x24\x25\xa4\x54\x98\x62\x61\xce\xc3\xcb\xfd\x7e\x73\xd8\x75\x65\x8a\x4a\x45\x9a\x38\x44\xc3\x0d\x1c\xcf\x15\xba\xd7\xf3\x1f\x44\xb1\x00\x41\xab\xff\x80\xac\x38\x77\x0b\x8e\x4a\x2c\xa4\x7c\x2b\x3e\x86\xeb\x90\x4e\x6c\x18\xf6\x41\xa0\x14\xc3\xa5\x1c\xd0\xe0\x7e\xe9\x2c\x29\x08\x69\x90\x74\xee\xbe\x7a\x47\x7b\x0d\x21\x6d\xf3\xb7\x65\x1c\x72\x41\x9e\xab\xc2\x03\x84\xe7\xed\x8f\xc9\x85\x8c\x88\x22\xe9\x2f\x34\x0e\xca\x0c\x17\x18\xa3\x2c\x59\xe2\xb0\x36\x7f\xea\x74\x5e\x5b\x36\xca\xb4\x9b\x15\xea\xa9\x7c\xa8\xc1\x7b\x31\x86\xeb\x61\xa0\x7e\x3c\xb7\x34\x09\x48\x6c\x65\x54\xce\xaf\x6f\xcd\xbe\xd4\x62\xb2\x80\x69\x1a\x28\x44\xb5\x7a\x0b\xe1\xb0\xde\x7f\xa7\xf7\xe7\x19\x10\xae\xa6\x91\x0d\x1f\xb7\x43\x17\x3e\xac\xb4\x92\xdf\xaa\x87\x03\x49\x53\x2e\x90\xd0\xae\xf6\x6a\x3f\x43\x1f\x4d\x53\x61\xf9\x48\x96\x9b\xdf\x76\xdb\xe7\xa7\xbf\x66\xf9\xd0\x54\x29\x1b\xcc\xaa\xb2\x49\x68\x4f\x87\x84\x7b\xc5\x09\xbb\xfe\x22\x9f\xf5\xf8\x11\xc3\xc8\x32\x80\x58\x20\xc1\x72\xca\x4e\xa3\x43\x6e\xab\xa9\x84\xd6\x37\x16\xdb\x3b\x08\xe8\x8e\x6e\x24\x8a\x13\xc3\x7c\x99\xce\xeb\x6d\x96\xe7\x8b\xea\x15\xc1\x5a\x7e\xaf\xd3\x2c\x94\x08\x97\xfa\xfe\xfc\xfd\x2f\xd5\x49\xfd\x21\x2c\xd0\xd4\x43\x32\x31\x72\x3a\xbb\xf8\x6b\x96\x0a\x6a\x61\x64\xa7\xfc\x90\x15\xaa\x3c\xc2\x93\x21\xc1\x7b\x77\x69\x9d\xe2\x84\x7a\x13\xf5\xba\x68\x3f\xb8\x1d\xb6\xc8\x4c\x34\x7e\x6b\xcc\x44\xb8\x21\xb7\x1f\xe8\x3b\x54\xe5\xa4\x39\x06\x16\x25\x83\x9a\xdf\x01\x65\x1f\xd1\x49\xa4\xb0\xa6\x69\x07\xcd\x0f\xf1\x0a\x15\xe8\x1f\x90\xcd\x23\xfd\x74\xc2\x34\xee\x6b\xcb\x97\x3f\xd7\xcf\x87\xdd\x7e\xbd\xf5\xfc\x7f\xdd\xcb\x4f\x63\x0a\xce\x5e\x71\x65\x45\xfe\x71\xd2\x24\xc1\x1d\x7c\xbf\xde\xed\xbb\xdf\xd2\xc4\x03\xdc\x64\xdd\x88\xac\xc0\x12\x10\xdf\x2a\xa4\xc6\x9a\x1d\x9d\xd5\xc2\x06\xfb\x17\xd3\xba\x78\x2d\x55\x84\x99\xad\x83\xae\x44\x56\xa0\x3d\x33\x49\xfc\x5c\x1b\x74\x5a\x25\x31\xb3\xb3\xac\x78\xec\x0c\x7c\xad\x12\xe3\xc5\xe8\x6c\x30\xa8\x02\x6d\x73\xea\x6a\x42\x0b\xe4\x02\x29\x5a\x87\xc4\xa7\x2a\x5c\xf2\xdd\xd5\x4d\xfa\x53\x6a\x4e\xf0\xee\x44\x51\x94\xe7\x42\xc1\x6d\x59\xbd\xcf\x20\xce\xfa\x37\x0c\x41\x8a\x51\x7b\x38\x4c\xf5\xc7\xe7\x97\x43\x0d\xcc\x0a\x2b\x29\x51\x37\x4e\x3f\x0a\xb7\xfa\xf3\x50\x87\x6c\x60\xa4\x6b\x10\x81\xe8\xc5\x2d\x70\xf5\xdc\xd9\x22\xcc\x4f\x17\x2b\x0d\x3a\xc1\x8b\xb4\x66\x0a\xaa\x7c\x8f\xad\x14\x6d\x62\x8d\xfe\xcf\x5d\x5e\x4a\x91\xbb\x44\xfa\xd0\x43\xd2\x26\xd5\xe8\x9f\x17\xf0\x31\x5a\x3c\x8c\x22\x68\x00\xb9\x6c\x90\x69\x1d\x76\x3d\x4d\xd2\x43\x10\xa4\x48\x82\xb3\xa8\x2a\xd1\xc1\x0f\x21\x48\x63\xbb\xf2\xb6\x2b\xf3\xef\x48\x54\x38\xb2\x53\x21\x00\x8a\x91\xc9\x29\x55\xee\xe4\xec\x24\x10\x63\xc1\xf4\x7d\x39\x30\xb4\x80\xc4\x2c\xb2\xb5\xcd\xe2\xe2\xb1\x6d\x84\x8e\x35\xde\x08\x10\x1d\x59\x19\xab\xb2\xcc\x6d\x6c\x03\x6f\xb6\x3b\x09\x00\x71\x21\x3e\xbc\x87\xb2\xf2\x1c\xa8\xab\xbc\xac\xe1\x8a\xcd\x61\x7e\x4f\x02\x4a\x09\x75\x72\x05\x5b\x5b\x3a\xf1\x35\x79\x3d\x81\x08\x64\x90\xf4\xf5\xa2\x9e\x27\xc3\x45\x6f\xb2\x72\xb2\x00\x03\x23\x92\x31\x5f\xff\xe4\xc0\xe8\x03\xbd\x38\x02\x8c\x25\x71\xd2\xd3\xf6\x3b\xf0\x40\x7b\xda\xa9\x5f\x0e\x71\x9a\x0a\xee\x17\xf3\x0c\x11\x9e\x37\xa8\xc1\x36\xbe\x64\x0c\x1a\x97\xd8\xe7\xf5\xfe\x1f\x3e\x2c\x08\x89\x21\x14\x8b\x55\x74\x79\x63\x39\x66\xbf\x4a\x70\x03\xa7\x00\x9d\x06\xf7\x0e\xcd\x76\xdd\x39\x16\x90\x46\x11\x22\x06\x86\xd9\xe3\x41\x88\x05\xd2\x28\xc6\x68\xb0\x85\x60\xce\xa6\x75\x40\x44\x31\x97\x3d\xa4\x05\x81\x07\xf5\x38\xd1\x07\x42\x01\x09\x06\x60\xce\xbe\x3c\xd0\x75\x90\x0c\x10\x2c\x59\xfe\x84\x4a\x57\xc2\x38\x5d\xe3\x51\xa8\x0c\x24\x50\x4c\x41\x49\xb4\xae\x27\x97\x50\x91\xe5\xbd\x39\x17\x3f\xcb\xa9\xdf\x01\x2a\x62\x38\x3c\x4c\x56\xd5\xcd\xe1\x94\xa3\xaa\x55\xd7\x66\x30\x80\x90\x67\xc7\xac\x99\x7f\x44\xc5\x23\x34\x08\x76\xfb\xbd\xd0\xc7\xac\xa0\xdd\xb1\x46\x93\xd8\xd3\x08\x35\x23\x6c\x91\xeb\xa1\x49\xe2\x94\x01\x87\x68\x84\xfb\xc1\xb8\xf4\x1d\x39\xe5\xce\x75\x7a\xbc\xdd\x4f\xcf\x92\xc6\xd2\xaa\xf9\xb9\x5a\xb7\x76\x60\x8d\xaa\xef\x40\x4b\x2d\x5d\x61\xea\x6d\x59\x41\xf6\x5a\x2c\xab\x4c\xbf\xc2\xba\x52\xfb\x72\x5d\xa9\xcd\xf1\x64\x25\xf2\x46\x60\x03\x7f\xb0\x31\x98\x8d\xcc\x34\x14\xad\xbf\x03\xd5\xa6\x7e\xaa\xb2\xd7\xac\x98\xe8\xfa\x11\x80\x90\xe3\x66\xa0\x5d\x3d\x6b\xcf\x16\x34\x39\x27\x44\x21\x58\x8f\xd1\xc2\x87\x7a\xd3\x10\x40\x71\x1c\x0e\xed\xdc\x13\xa7\xac\x11\xb9\xa7\xe2\x9e\x5c\x4b\x29\xaf\xef\x77\x3e\x2d\x5b\x63\xfe\xaa\xa6\xfc\xbf\xfd\xdb\x9e\xd1\x90\x30\x0c\x6d\x05\x57\x9e\xc1\x4f\x40\x61\xc4\x49\x0f\x23\x90\xd9\x72\xfb\xf4\x7d\x3a\x4a\x0d\x35\x04\x39\x52\x9a\xec\xd8\xe1\x91\x91\x56\xb4\xc9\x7c\x3c\xca\x84\xb1\xd5\x5d\xf5\xb1\x96\xb2\x6e\xf6\xe5\x76\x30\x52\x4d\x28\x12\x69\x19\xb3\xb3\xe2\x36\xcf\x4e\xdd\xef\x32\xb2\xda\x0e\x56\x52\xe5\x16\xe0\x13\xfa\x07\x13\xc5\x5c\xf9\xf7\x97\x8b\xec\x38\x33\xf0\x4c\x04\x8a\xb9\x3e\x3f\x5a\x4f\xbc\xda\xf4\x46\xec\xc8\x32\x31\x8c\x44\xb6\x26\xd7\x72\x99\x6d\xc5\x05\xe0\x33\x7c\xc0\xf8\x1a\x8c\x05\xe8\xc3\x6c\x54\x39\xca\xca\x1a\x96\x6a\xe9\x85\x3d\x0f\x58\x0f\x6a\xb7\xd2\x03\x12\x18\xdc\x02\xbe\xf8\x43\x51\xda\x12\x0f\x55\xf6\x88\x57\x13\x73\x5b\x43\xd0\x6d\x3a\xf7\xcf\x2b\x2b\xa3\x3c\xe1\xde\x19\xdf\x4a\xac\xb9\x72\x61\x90\x29\xea\xa9\x67\xac\x9a\xee\xdf\x26\x36\x3c\xe9\xe5\x3c\x1e\x32\x55\x95\x0f\x25\xd6\xf4\x8d\xcf\xce\x83\x04\xb7\xba\x9b\x3f\x96\xc3\xdd\xdb\xa4\x24\xb0\x52\x78\xe2\xb5\xfb\x29\xa4\x56\xe4\xa2\x2c\xae\x02\x7c\xbe\x4b\xac\x71\x39\xb1\x92\x52\x9d\xda\xfe\x97\x49\x32\x3e\x4f\x7a\x68\x52\x63\xd0\x02\xc8\x45\xdd\x95\x98\x63\x72\x50\xd4\x30\x80\x56\x1b\xc1\xb8\x4f\xd6\xac\x8b\xd7\xac\x80\x7a\xd3\xa5\x37\x8c\x48\xc0\xe8\xce\x71\xb0\xef\x79\x5f\xb6\x5b\x93\x4f\x2b\x8d\x1f\x40\xc8\x04\xbd\x76\xef\xda\x4d\x98\x5b\x89\x11\x10\x21\x3f\xab\x68\x37\xa8\xcd\x4d\xaf\x3f\x4a\x8c\x30\x32\xf1\xd2\x79\x9d\x7e\x7f\xd7\xa6\x31\xc8\xa4\x44\xfd\x96\xd9\xe2\x33\xdf\x24\x03\x82\x00\x97\x2e\xfa\x31\x26\x76\x31\x32\xb4\x8a\x5f\x8d\x47\x49\x3b\x33\x80\x76\x1d\xa2\x20\xf0\xa6\xda\x46\x95\x7e\xdf\xed\x9a\x05\x43\x70\xc5\xe3\xf3\xf2\x60\xeb\xa2\x7c\x83\x4e\xb1\x72\x44\x3b\x08\x40\x6d\xe5\xf9\xa1\x3a\x74\x3d\x0c\xa4\xba\x2b\xa8\xc9\xca\x62\x65\x25\xa7\x2d\x7b\xba\xef\xa5\x62\x83\xa6\xb5\x25\xf5\xb3\x68\xc8\xf5\x80\xeb\x99\x18\x4d\x15\x42\xb9\xfe\xed\x38\xa0\xbf\x43\xae\x37\x05\x02\x8b\xf4\xe5\xc9\x78\xc7\x75\xbc\xcc\x1a\x2d\x3c\xb5\x0a\xa8\x77\xac\xc3\x02\xcc\xef\x76\x0f\x60\x88\xc0\x3d\x7e\x2b\x4e\xa2\x12\xff\xf9\xcf\xa8\x4a\xc1\x98\x88\x47\x1e\x7b\x60\x47\xa1\x6f\x50\x02\xeb\x1b\xa5\x73\x45\xbb\x11\x67\xb4\xad\xbe\x47\xfe\x9f\x06\xb6\x50\xb5\x4b\xe4\x4b\xf1\x99\x68\x0d\x0d\x82\x38\xf0\x4b\xd1\xb2\x75\x4c\xcb\x21\xbb\xfd\xb4\xaf\x8e\xf1\x3b\x3e\x6d\xd7\x8f\x9b\xc7\xbb\xc3\x7e\xf3\xe0\xa2\x4e\x34\x20\x61\xc4\x23\x4b\x1c\xa2\x6c\x05\x4f\xbd\x68\xbd\x29\x24\x5d\x9c\xcf\x95\xd1\x80\xa4\x1a\xf1\x1c\x27\x71\x19\x1a\xc1\x34\x20\x60\x4c\x47\x18\x82\xdf\x0a\xf3\x89\x93\xe0\x13\x0d\x28\xa7\x3e\x04\xb7\x54\xe5\xf9\x54\x16\x3d\x3c\x7e\x08\x65\xa4\x01\x95\x31\x4e\x7d\xaf\x74\x62\x2d\xd8\x81\x9c\x38\x0d\xc2\x80\x3b\x92\x36\xb4\xb3\x90\x17\xd7\xca\x27\xf9\x1e\x91\x32\xe8\x27\x3e\x9d\xa0\x78\x06\xbd\x2e\xac\xa3\x3e\x8c\x60\xd1\x80\x45\x21\xe2\x7c\xc1\x71\x07\x52\x7f\x34\xe3\x9a\x8b\x0e\x84\x81\x6b\x72\xc7\x2b\x48\x03\x26\xb9\xcf\x43\xb6\xce\xf2\x60\x20\xd0\x20\x0e\x53\x67\x3f\xe5\x23\xb5\x2c\x1a\xc4\x06\xb0\x28\xb4\x4b\x21\x7e\xe1\xa8\xd1\x20\x51\x1e\x67\xd4\xcb\x39\x80\xfe\x84\x22\xde\x1d\xc3\x05\xf1\x32\xfb\x2b\x51\xe9\xfa\xb6\x2a\x8f\x58\x99\xf3\xd5\x66\x4e\x03\xae\x00\xf5\xbf\x76\xfb\xbf\x6f\x2b\xd8\xac\x9e\xf6\x50\x37\xdf\x21\x3f\x5d\xe3\xd4\xdc\x11\x29\x09\xa2\x1e\xc8\x68\x45\x9f\x9f\xcf\xf9\x35\xfa\x6f\x72\xa5\x94\xa6\x12\x65\xf3\xf2\x57\xa8\x32\x31\x7a\x71\x02\xac\xc1\x50\x83\x0d\x35\x8e\x92\x67\x7e\xbd\xa6\xc1\xdf\x46\x1f\x50\x12\x89\xb1\xe0\x76\x83\xbc\xc3\xf4\xea\x0a\x39\x0b\x7c\xb3\x20\xac\xc7\x6c\x2c\x94\x6a\xe8\xb7\xf1\x93\x48\x29\x5d\xa5\xae\x4d\x1b\x3b\xb4\xfe\xa2\x69\xcf\x88\x63\x73\xa7\xde\xe0\x28\xf0\x35\x7e\xb6\xb1\x4c\xb6\xa7\xff\xfd\xe7\x68\x73\xa1\x81\x34\x11\x2a\xe5\xee\x8e\x22\xcf\x37\x5d\xf0\x87\x06\x2a\x4c\xa4\x7b\xe6\xa7\xd5\xdd\x80\x42\xa7\x6b\xb7\x0a\xbe\x15\xe4\xe2\xe2\xc3\x1d\xae\xa4\xe7\x4b\x0c\x08\x71\x7f\x51\xfe\xc5\xae\x47\x03\xc5\xac\x78\xf1\xc7\x50\x30\xc4\xb7\x25\x8a\xab\x41\x89\x6e\x3f\x5b\xfb\x1e\x1a\x53\x1f\xdb\xc5\x9f\x4f\x2f\xfb\xc3\x62\xbf\x5f\x3f\x6c\xf7\x87\xcd\xe3\x7e\xfd\xfc\xfb\xe2\xbe\xeb\x06\x21\x92\x2e\x61\xe1\x93\x28\x06\x3f\x63\x76\xe0\x46\x1c\x8b\xe7\x52\xbd\x77\x2f\x05\x48\x47\xff\xb7\x82\xaa\x93\x99\xbd\x6c\x6e\xc6\x93\x17\x12\x89\xe0\xb1\xb2\x75\xea\x0f\xed\xf7\x7b\xbd\xf8\xac\xe7\xe0\xaf\x31\x38\x85\x06\xc0\x49\x14\x8e\x95\xf8\xc7\x4c\x50\x34\x00\x19\x7b\x8a\xae\x3d\x1c\x4f\xad\xf5\xb4\xbc\x78\x7f\x7a\x34\xc4\xb9\x3f\x02\x12\x9c\x79\x8f\xf0\xb1\x13\x85\xfe\xc8\xbc\x7a\xdc\x97\x94\xb8\xee\x60\x23\x28\x32\xd2\x2f\xa1\xc9\xe1\x32\x9a\x14\x46\x27\xb8\xce\x3d\xb6\xbe\x96\xfb\x91\x04\x5c\x47\xae\x14\xad\xab\xa4\x0b\x83\xd1\xcb\x21\x01\x48\x16\x77\x85\x44\x23\x1f\x8f\x12\x22\x14\x1d\xc2\xee\xba\xd2\x53\x4a\x08\xd8\x6d\x7a\xb5\xdb\x0f\x6f\x84\x10\xc3\xf1\xad\x49\xf9\x08\xcd\x47\x59\xbd\xdf\x55\xe5\x47\xf3\x36\x7a\x6f\x84\x52\x21\xdb\x01\xf1\x3f\x42\xbd\x9f\xca\xe6\x7b\xd6\x8d\x74\x42\x99\xc4\xc2\x2d\xf8\x09\x45\x33\x90\xb9\xa4\x84\x42\x8c\x62\xd4\xe8\x53\x7a\x5a\x63\xc4\xbf\x60\xc1\xc3\xba\xdb\x82\x29\x09\x95\x42\x7f\x7f\xa1\x91\xef\xa6\x35\x87\x26\x4f\x16\xc5\x49\xd4\x4e\xf8\x45\x03\xe2\xb8\x9c\x2a\x24\x53\xc2\x52\x5b\xf3\x62\xb3\x6e\xab\xac\xb9\x20\x32\xf4\xcb\x55\x8b\x30\xa1\x51\xc3\x78\x04\x8e\xfd\x1c\x5c\xe0\x8f\x52\x12\x1d\xd1\xb2\xd8\x7a\x12\x8a\xa1\x25\x43\x49\xcc\x02\xc4\x1e\x14\xe7\xe3\x4a\x14\x1a\x35\x59\xba\x07\x89\xc5\x20\xde\x60\xd3\x0a\xde\x48\xa3\x24\x91\x89\xe5\xbc\x01\x0d\x70\x3c\x4c\x63\xf9\xb3\x5e\x06\x25\x89\xd2\x36\x47\x54\x8d\x07\x19\xe1\x01\xc5\x72\xd6\x46\xbc\xcf\xf3\xb8\x53\xc2\x99\xc1\xb9\x96\xd5\x3f\xb2\xe6\x2d\x1b\x6c\xdd\x9f\x1d\x20\x8d\x74\xd1\x0c\x0c\xba\xcd\xa2\xe5\x29\xe1\x2a\x44\x2f\x58\x9e\xf3\xf7\xe7\x5e\x6b\xce\x78\x00\xc3\x1c\x16\x89\x12\x6e\x2c\xdd\x4b\xeb\xf9\x61\x8e\xa6\xdb\xf6\x49\x1a\x09\xe5\x62\xf3\x98\x11\xfc\xfa\x95\xa4\x31\x27\xd4\xc7\xe7\x45\xb1\x1a\x8e\xcb\x94\xd3\x50\xb8\x1a\x2e\x2f\x5e\xde\xc7\xb5\x29\x49\xd3\x20\x8d\x7a\x6b\x2c\x2b\x5e\x1d\x5a\x69\xaa\x72\x4e\x49\x2a\x12\x4c\x25\x1e\xd5\x6b\x05\xaf\x65\xd5\x0c\xdf\x7e\x6a\x0c\x66\x08\x3b\x1d\x3b\x6b\x7a\x1f\xcc\x24\xdc\x45\x89\x30\x29\xe2\x88\xda\x21\xbb\xac\xca\x77\xa8\x6e\xc4\x8c\x08\x11\x25\x92\x06\x36\xc5\x9e\xbd\xbe\x41\xdd\x2c\x33\x3d\x99\x26\x32\xee\xd4\x13\xda\x93\x1d\x68\x3c\x5e\x3d\x64\x12\xa5\x69\xc7\x43\xd6\xee\xf0\xf9\xf9\x08\x38\x29\xe1\xca\xe2\x74\x1f\x88\x77\x9f\x47\x82\x15\x93\x44\x58\xd5\x17\x51\x35\x4a\x14\xa7\x72\x5a\x13\x4c\x12\x7f\x97\x4a\xc7\xb8\x86\xd9\x38\x93\x43\xfb\xd7\x93\x67\x55\x20\x91\x33\xeb\x74\xae\xdf\xa0\xda\x57\xa2\x1d\x0d\x07\x7f\x0a\xcd\x62\x65\x45\x71\xdd\x06\xdf\x6f\x5f\x44\xf3\x00\x51\x33\x68\xe5\xfb\x61\xd7\x4f\x32\x60\x96\x0d\xd4\x80\x7a\xf3\x55\xc5\x5e\xaf\xa7\x35\xed\x36\x3d\xad\x01\x25\x20\x29\x62\x38\x3f\x46\xeb\x21\xa8\x10\x91\x55\x0f\x77\xf7\xe3\xd5\x14\x80\x60\x8c\xfc\xe4\xa0\xc8\xb7\xd7\xb2\x99\xae\xa7\x89\x08\xba\x72\x59\xfd\xf4\x31\x9e\x6b\x7e\x43\x6b\x7d\xae\x88\x0d\x98\xce\x31\x57\x39\xd9\x76\x26\x27\x95\x22\xf1\x1c\xbe\x98\x07\xa6\x2c\xfe\xd6\xb5\xe9\xd0\x0a\x7d\x9f\xf2\xf2\xd2\x74\x51\x1b\x4a\x8c\x66\xfe\x63\xed\xb2\xe2\x35\x07\xcf\xc1\xd0\xed\xb7\xb6\x23\x0d\x02\xe1\xb9\x91\x1f\xcf\xc7\xef\x88\xf3\x98\x2c\xc4\x94\x04\xa1\xe9\x89\x59\xbd\xa0\xcc\x5c\x98\x86\x52\xaa\xac\x31\x7e\x83\x7c\x74\x1e\x96\xe3\xb6\x5e\x1a\x46\x09\x17\x9e\x40\x79\x5b\x96\xa7\x1e\x19\x4a\x69\xc8\x8d\xd6\xc3\x28\xc8\x30\x1a\xe4\xfa\x44\x09\x31\xca\xbf\xbf\x46\xe4\x57\x89\x91\xe9\xee\x30\x06\x79\x0d\xd6\x04\x1a\x69\x83\xaf\xa8\x75\xe3\xed\xc0\xdf\x42\x75\x53\xe6\xb9\xf0\x0b\x14\x65\x84\xf3\xa8\x8b\x2f\xb6\x2e\x97\xc7\xa3\xb7\xb7\xb6\x2f\xc7\xc3\x9b\xb2\x90\x21\xe5\x6c\x3b\x07\xec\x5b\xbf\xc9\x14\x0c\xd8\x2f\xc6\x33\x8a\x32\x46\x39\x78\x7e\x0d\xdd\xb3\x8e\xfb\xe6\x38\x41\xa9\x86\xa6\x1b\xee\x4e\x51\x7a\x7a\xd9\x58\xe3\x3e\xfa\x70\xae\x44\xd3\xe7\xd5\x29\x65\x49\x02\x69\xbf\x2f\xa9\xb2\x1b\x1f\x34\x0e\x13\x74\x68\x57\x0f\xab\xfb\xd9\x54\xe6\x0c\x72\x81\xd2\x24\xa5\x76\x80\x0f\x88\xb3\xb6\x50\xad\x2e\x2a\xef\xce\xcc\xb9\x9d\x04\xc8\xa8\x3c\x7e\xde\x54\x31\x5f\x27\x7b\x03\x36\x5c\x83\x29\x3e\x51\x28\xd8\x56\xb0\xcb\x5e\x0b\xd0\xb3\xc6\xfb\x97\x3e\x11\x15\xb1\x15\xf2\x74\xc1\xbc\x87\x2c\x7f\x6f\xaf\x3e\xc8\x2d\x51\x2a\x8c\xad\x97\xcf\x5c\x9c\x68\x7e\x91\xa3\x52\x26\x16\x36\x77\x9e\xac\xd3\x54\xf1\x08\x63\x29\x32\xd3\x4f\xc5\x2e\x6b\xdf\xce\xd7\xae\x1a\xd5\x52\x60\x15\xdb\x9d\x57\x82\x1c\x4a\xe0\x51\xaa\x55\x80\x42\x49\x76\x19\x42\xff\xaf\x97\x31\xa0\x54\x6b\x16\x59\x3a\x3f\xb4\x9f\xc2\x9d\x4f\x24\x52\xaa\x21\xd1\x83\x58\xda\x3c\xcf\xd7\x27\x37\x05\x84\x24\x89\x7b\x57\x03\x03\x87\x02\xd5\x21\x82\xa2\x33\xd1\xbc\xe5\x65\x31\xcf\x25\x3b\x5f\x12\x31\x7e\x51\x10\x5a\xdd\x54\xbb\x5a\x60\x21\x81\x2f\x84\x9d\x74\x8c\x14\x77\x35\xbe\xbb\x46\x98\xe9\xb0\x36\x31\x27\xc3\x9a\x6e\x5b\x4e\x3d\xff\xd9\x4c\x6a\xc1\x7e\x4e\x61\x08\xdf\xe8\xc4\x7b\x0c\x83\xd8\x20\x6e\x35\xab\x57\xcb\xf5\xa4\x8d\x44\x0c\xad\x2a\x8f\x96\x74\x62\x37\x73\xe0\x6d\x1a\x52\x6d\xe9\x7a\xb6\x48\xec\x31\x26\x97\x9e\xbd\xbd\x30\x4c\x04\x56\x73\xe1\xf7\xef\x90\xe8\x34\x8c\x62\xcb\xaf\xdd\x74\x76\xd4\x67\x69\x57\x1a\xb2\xd0\x92\x63\x09\x94\xa9\x78\x2a\x46\x70\x39\x1a\xb2\x24\x41\x01\x7a\x17\x82\x7f\xde\x68\xbf\xaf\x86\x31\x61\x58\xd9\xb4\xd0\xda\xd3\x04\x7c\x25\x8c\x4b\xc3\x24\x12\x36\xe7\x94\x35\x0e\xf6\x3a\xdc\x10\xc3\x84\x05\x98\xb7\x3a\x1e\x30\x00\xdb\xf9\x3a\x61\xa2\xad\x3c\x49\xbb\x55\x65\x08\x49\x19\x1e\x05\x21\x75\x8d\x0b\xbd\xd1\xcb\xcb\x4a\x7c\xb2\x2e\x86\x3c\x00\x24\x59\x82\xa2\xc9\x9a\x2e\xde\xd9\xfe\x6e\x30\x80\xf0\x50\x16\x70\x59\x68\x0d\x1a\x75\x01\xe6\x54\xff\xa6\x67\xe4\x0a\x75\xf2\x16\x85\xae\x20\xab\x47\x37\xc6\x53\x6e\x30\xee\x50\x96\x48\x17\x91\xfd\x04\x0c\x62\x8d\x7d\xc7\x31\x3e\x78\xb8\x91\x84\x69\x18\x49\x39\x18\x3c\x6b\x84\xe7\x59\xfb\xd3\x39\xf3\x7c\x72\x3f\x69\x68\xc1\x0c\xbb\xbb\x9b\xbd\xbf\x0f\x11\x48\xac\x3c\x70\xe4\x09\x0f\xe2\x17\x8e\xf8\x3e\x94\x15\x8a\xd0\x52\xd9\xf8\x19\x31\x8e\x02\xfa\x4e\x3a\xc5\x98\xab\x3c\xe7\xf9\x90\xed\x92\x86\x02\x00\x63\xad\x76\x62\x8e\x39\x91\xc7\x03\x40\x18\x7b\x2b\x12\x06\xf5\x7b\x34\x94\xb1\xc0\x52\x91\x87\x8b\xea\xc4\x1c\xe7\x47\x90\x0a\xa8\xc7\xd2\x3c\x5b\xa1\x9a\xb5\x23\xf6\x1a\xd9\xae\xa1\x52\x96\x7d\x20\xab\x7f\x2b\xca\x8f\x62\x25\x26\x90\x0e\x1a\x6a\x9e\x22\xdc\xe8\xa3\x3e\xcb\x6f\xc3\x30\x89\x97\x1f\xa3\xa1\x16\x51\x44\x47\xc0\x0b\x34\x7e\x91\xb7\xd8\x77\x01\xcb\xac\xfb\x3a\x25\x84\x19\x5f\x0c\x68\x82\xb0\x7c\x37\x89\x3a\x0a\x49\xdf\xcc\x12\x6b\x31\x64\x45\x6b\x0f\x78\x63\xe9\xf3\x39\x0b\x8e\x03\xd2\x6f\x3a\xab\x5e\x68\xc9\xf5\x30\x84\x04\x3d\x00\xc3\x52\x37\x74\x27\x24\xf1\x15\xef\xef\x30\x6c\xd5\x1a\x57\xbd\x85\xf5\xbf\x84\x72\xf7\xe3\xf8\xa1\x0c\xa3\x3e\x4b\xb4\x77\xeb\xf1\x64\x25\x0e\x0d\x0b\x11\xf4\xb0\x29\x9a\xec\xb5\xdc\x77\x74\x38\x34\x34\x3c\x25\x9d\x6b\xbb\xce\xb3\xd7\x4c\xe6\x88\x29\xa9\xbb\x1e\x52\x20\x48\xa5\x19\x70\xfc\x4e\xec\xfe\x28\x08\x23\x2c\x91\xdf\xff\xfe\xcd\xff\xc2\x0c\xf3\xdc\x26\x59\xde\xbe\xe5\x02\x29\xf1\xab\xe3\x75\x4e\x94\x46\x84\xf0\xd4\xe9\x57\x77\x9e\x26\xfd\xa7\x6f\x64\x1c\x11\x60\x0d\xd4\xcd\x83\xdf\xcf\x22\xc2\xd2\x40\xfb\xf2\x4c\x1f\x96\x72\x77\x37\x02\x08\x4e\xae\x14\x87\x91\x5d\xdb\x2b\x71\x04\x94\xe5\x99\xe3\xea\xa2\x11\x91\x61\x6a\xd3\x47\x05\x74\x64\x00\x34\x0a\x13\xc2\x2d\x0d\x63\x9e\xdf\x67\x72\xf2\x1c\x11\xa1\xb8\xe3\xd9\xf4\xa0\x90\xf9\xa4\xf8\xa1\xeb\xa6\x93\x31\xe1\x56\x6b\x18\x60\x36\x71\x50\xc5\x4a\xa3\x28\x11\x88\x2d\xd3\xe5\xc3\x40\x6d\x63\x72\xc9\x44\xa7\x1e\xf1\x78\x30\x83\x42\xff\xf9\xad\x2a\x8a\xb4\x85\x69\xd8\x22\x8b\x4d\x97\x1b\x1f\x21\xbb\x68\x14\x81\xc6\xe7\xfc\x17\x2e\x04\xe8\xc9\x4d\x9e\x95\xb1\x14\x83\xb5\x56\x19\xc6\xc6\xaa\xfd\x8d\x33\x6e\xa9\xb7\x1c\x16\xc7\x27\xdf\xbc\x5f\xb7\x2f\xfb\xe4\x19\x8d\x62\x61\x45\x6e\xbb\xcc\xe1\xd0\x8f\xb9\x96\x2c\x98\x8b\x44\xcf\x94\x1b\x8c\xc0\xcc\xe3\x19\x13\x25\xb1\x42\x61\x2e\x24\x64\xd9\x67\x47\xb8\xeb\xd6\xe0\x28\x49\x42\xa4\x0f\x69\xdf\xe7\x30\x04\x11\x25\x32\x45\x63\x1b\x43\x63\xed\xf7\x40\xf5\x87\x60\xe0\x2d\x0e\x17\x08\x9c\xa8\x7e\x9d\x88\xb8\xb1\xa2\x6c\xf6\xa5\x2f\x45\xf1\x5e\x95\x79\xf7\x02\xd2\x48\x20\x97\xf9\x01\xfd\xca\x6e\x51\x8b\x52\x09\xb8\xa3\x36\x1d\x0a\xf3\xa5\xf6\x7b\x65\x24\x28\x68\x17\x15\x58\x2e\x5e\x5e\x3e\xc3\xc1\x4d\xbe\xbe\xe0\x04\x51\x54\x1d\x4f\xe1\x62\xb7\x5b\xef\x0f\xcb\xc5\x6e\xdd\x9d\x58\x44\xe8\x30\x7a\x65\xe2\x1f\x65\x95\x6b\xef\x6c\x4f\xc6\x80\x10\x90\xf2\x4e\xe5\xf9\x58\xde\x3f\xed\xd7\xa2\x2a\xa6\xdd\x24\xb3\x74\xb8\x0e\xd7\xd7\xbe\xbc\x1b\xc8\xe1\x75\x48\x13\x33\x3e\x40\x27\x1d\x86\x51\xde\xc0\x51\x14\xba\x5b\x90\x22\xcd\xac\xa4\xf9\x47\x6b\x72\xb6\x03\x89\x75\x2d\x89\x16\xfd\x48\xba\x9b\x62\xae\x69\xa4\xb9\x65\xea\x2e\xce\xc7\x1e\x1f\xe6\xdb\x94\xc6\xf1\xfc\xb0\x79\xdc\xdb\x42\xbd\x9b\x97\xe7\xc5\x7e\xf3\xf4\x78\xd8\x3c\x1e\x7e\xac\xd7\xbf\xed\x7c\x57\x20\x96\xd1\xbc\x9d\x1c\x36\x78\x89\xd7\xf2\xad\x34\x8a\x9c\x53\xb9\xdd\xb8\x80\x30\x1d\x6d\x8b\x11\x44\x80\xc8\xde\x76\x49\xeb\xe4\x60\xfa\x68\x48\x04\x31\xb3\x05\x6e\x1d\x67\xe9\x12\x1a\xaf\x54\x37\xf1\xf0\x23\x48\x09\xe6\xa5\x6d\x64\x26\xea\x18\x72\xba\x93\x49\x2b\x26\x84\xd4\x41\x98\x50\x59\x9e\xab\x19\x1e\x18\xdf\x1d\xac\x38\x52\x0d\xcd\xee\x24\x14\x6c\x8e\xa7\x73\x3e\x61\x06\xa1\x91\x09\x39\x4f\xfd\x97\x6f\xdd\xb0\xd1\xf3\x19\x61\x0b\xf4\xba\x54\xc6\x42\x8f\xeb\xc4\x28\x0b\x92\x24\x0d\x86\x55\x13\xa6\x81\xea\x06\x84\xce\xb3\xc2\xbf\x4a\x94\x81\xc1\x32\x7e\xd1\x9c\x86\x36\x1d\x23\x22\x8c\x7c\x41\xfb\x48\x6b\xd8\x7f\x4e\x46\x53\x8e\x3c\x95\x3f\x82\xf7\x6c\x1f\x0c\x0e\xa5\x4a\x52\x33\x48\x32\xbd\x0c\x94\xfc\xc7\xc3\x85\x45\x24\x31\x2e\x34\xf3\x08\xbf\x9a\xdf\xe0\xd2\x03\x67\xda\x56\x19\xfb\x48\xed\xe2\xee\xec\x19\x65\xb9\x6f\xa6\x31\xe2\x0f\xbc\x6d\xf0\xb2\xbb\xb1\x70\xb4\xe9\x45\x58\x80\x2c\x62\x8b\xf7\xfa\xcd\xa5\x73\xbf\x20\xd1\xa5\x2c\xe2\x29\xc2\x36\xb2\x7a\x97\xb5\x2e\x5e\x77\x3b\x22\xc4\x14\x51\x59\xac\x9f\x57\x09\x25\x2e\xa5\xaf\xaf\x5c\x97\x81\x69\xcb\x22\xc9\xd0\x99\xdf\x77\x1a\xdd\x7d\x1c\x8d\x45\x32\xb6\xea\x24\xa2\xb8\xc1\x80\x79\x6b\x34\x8f\xef\x45\xf1\xc8\xed\xf2\x0b\xd5\xed\xeb\xfe\x0d\x30\x16\x80\xad\xe7\xab\xd5\x19\xc6\x51\x4f\xc6\xe2\x88\xba\x77\xeb\x4c\x96\xae\x41\xe0\x39\x47\xb2\xfe\x7e\x25\x65\x8c\x2b\xd4\x59\x5d\xed\xb6\xa3\x28\x1e\x63\x22\x40\xa5\x84\xef\x50\xd9\x30\xac\x27\x63\x18\xbf\xed\x58\x84\x48\x56\xf3\xb0\xf8\x03\xc9\x7b\xef\x9e\xba\xdc\x18\x8b\x8d\x72\x55\xb3\xd9\x4f\x78\x7e\xbc\x9b\xf7\x5e\x58\x12\x5a\xd9\x4a\x04\x70\x6d\x61\xbe\x82\x9f\xb2\x84\x07\x4e\x5b\x09\x15\x4c\xa0\xfa\x39\x9d\x26\x2c\x51\xd4\x32\xa5\xfb\x01\xb8\xf1\xe9\x89\x6f\x5d\x0f\xeb\xb7\x66\xaa\x24\xbd\xa3\xc0\x12\xc5\x29\x1b\x78\x24\x8f\xe2\x08\x7f\x6c\x6e\x6e\xab\xf2\x78\x23\x4e\x57\x2c\x10\xd7\x65\x74\xbc\x3b\x91\xc6\x59\x68\x35\x77\x6c\xd2\x7e\x3a\x0b\xd2\x30\x4a\x06\x32\xaf\x87\x37\x9b\x8c\xf6\xad\x4c\x05\xbd\x08\xe7\x2d\x74\xb7\x9e\x1a\x4b\x59\xab\xa0\x68\x6a\x37\xf2\x5d\x93\x08\x04\x6e\x87\x56\x1e\x6c\xba\x63\xe1\x4d\x8e\xde\x93\xe0\x0a\xc9\x10\x84\xd6\x5e\x73\xe8\x2a\x0a\xf2\x5f\x72\x47\x52\x26\x29\xf3\xfa\xd5\x37\x18\x56\x3d\xf6\x22\x97\xbe\x4b\x68\x89\xc0\x1d\x61\xf9\x80\xf6\x9d\x32\x15\xda\x2a\xa1\xbb\x87\xd5\xd2\xff\xa6\x03\x16\x26\x43\x86\xe9\xdb\x21\x18\xa4\x1b\xbb\x86\x0b\xe6\x16\xe2\x8e\xfc\xf5\x1a\x9b\xc1\x8c\x91\x58\xd4\x81\xbc\x7f\xf5\x56\x5c\xba\x17\x17\x07\x5c\x73\xaf\x40\xd5\x71\x73\xd0\x38\xd0\x80\x01\x0b\x8f\xd1\xe8\xa2\x9d\x83\x78\x53\x4c\xc2\x08\x71\x87\x4f\xf7\x4f\xbf\xaf\xbf\x5a\x61\x62\x92\xd0\x01\xb9\x02\x62\x82\x47\xe0\xe1\xf1\x7c\x88\x09\x00\x92\x02\x8a\xa3\x65\x54\xb6\x35\xd5\xfe\xb2\x54\x71\x0c\xc6\x2b\x91\xab\xbb\x8e\xf8\x87\xc6\x21\x11\xd2\xcb\xd2\xdb\x3a\x05\xdf\xc0\x35\x82\x96\xec\xbc\xf9\xb2\xec\xef\xbf\x85\x48\xd2\x38\x94\xc2\x2b\xee\xdd\x8b\x76\xd7\xdd\xda\xf4\x21\xc0\x08\xce\x36\xd9\x5a\xe3\x50\x4b\x0c\x3c\x3e\x97\x43\x80\x11\x8d\x23\x1a\x60\x3a\xe2\x26\x2b\x44\xb5\xde\x7f\xb7\x65\xa2\x5d\x6b\x44\x30\x5e\xb0\xfe\x05\xea\xec\x75\xd6\xcf\xd5\xe4\x3b\xc7\x91\x31\x48\xd1\x8c\x78\x42\x53\x56\x8b\x57\x91\x15\x9d\x67\x16\xb3\x28\xc2\xa2\x5c\xc4\x40\x6d\x6a\xe4\x80\x7d\x9b\xee\x1e\x31\x63\x31\xd2\x5f\x1f\x40\x95\xf5\xa5\x1e\x22\x16\x69\xdc\xae\x89\xdc\x13\x4c\x1e\xcb\xea\xf2\xa3\xac\x74\x8d\xd4\x28\xbe\x87\x96\x3c\x18\x28\xd6\x63\xc0\xb7\xdd\x4c\xc9\xe4\x3a\x71\x10\xab\xb4\xd7\xa2\xfc\xcf\xd4\xc5\x8c\xe3\x38\x0a\x3c\x59\xaa\x9d\x4d\x33\xc9\xb0\x38\x56\x2a\xb1\xec\xaf\xd7\x42\x15\xd7\x22\x38\xf3\xb5\x9e\x33\x41\x4a\xde\xd7\x3c\xd0\x38\x61\x12\x5c\xc6\x63\x9d\xdb\xfa\xcf\xc7\x2b\x53\x30\x4e\xa4\xc6\xd7\xeb\x5c\x14\x17\x65\xf2\x8d\x10\x23\xaf\x94\x9d\x48\x87\x2d\x54\x07\x9b\x38\x38\xf4\x32\x12\xae\x2b\xa7\x0c\x37\x0d\xeb\xe0\xdf\xaa\xce\xac\x1c\x5f\x2e\x0d\x39\xe6\xb7\x72\x30\x4d\xc8\xa6\x8d\x71\x6c\x3f\x35\x0e\x79\x1b\x95\xe8\x54\x50\xbb\x54\x5e\x2c\x62\x19\x0d\xf3\x05\xfb\x2b\x27\xf7\x3a\x78\x15\x8b\x34\x55\x6e\x0c\x38\x24\xc0\x7d\x59\xc3\x2e\xd3\xf3\x95\x7d\x34\x16\x42\x2b\xea\x82\x20\xcb\x4e\x6d\x7c\x3e\x73\xf8\xc9\x6c\x93\x09\xc1\x88\x9b\x7d\x12\x59\xfe\x1a\x4d\x1e\xc9\xa3\xb8\xab\x98\xaa\xea\x4c\x58\x62\x30\x58\x8a\xa6\xc9\xc1\x64\x90\x4f\x6c\xc5\x58\xa6\x0e\xa2\xec\x1e\x7c\x77\xa9\x17\xfa\x98\x4d\x07\x97\x14\x29\xa6\xb1\xf6\xbb\x65\x77\x2d\x95\x18\x47\x17\x74\x07\xc5\xaa\xd4\xdd\x32\xa3\x24\xf7\xdc\xe7\x8b\x3c\xc7\xb4\x38\x0a\xea\x58\x5c\xc9\xc4\x63\x8f\x35\x30\x70\xa1\xec\xd5\xdb\xb9\x78\xa7\xfb\x12\x81\x60\x3d\x1b\x20\x8d\x21\xd2\x18\xa1\xad\xac\x91\xdd\xe1\x47\x47\x76\x69\x0c\x89\xc1\x94\xde\xe2\xc7\x8d\xff\xc9\xc4\x8c\x6a\x47\x41\x08\x55\x73\xd9\xe8\x7d\x69\x1d\xc1\xf1\x6b\x35\x86\xe0\x36\xb8\xbf\xf7\xcf\x97\x04\x01\xe0\x4f\x4e\xe5\x63\x95\x97\x75\x7b\xc5\xde\x4a\x4d\x82\x28\x46\x6f\x64\x58\xb1\x88\xa5\xed\x85\xc8\xeb\x46\x18\xa3\xb3\x5a\x9e\xab\x1a\x61\xf4\x73\x91\x56\x7f\x9e\x34\x41\x93\x03\x77\x25\xda\x9d\x5d\x08\xb4\x0d\x30\x92\x79\x37\x5a\x24\x93\x40\x27\x81\x8d\xa0\x08\xbd\xb4\x8b\x6c\x3d\x91\xee\xa3\x09\x09\xa8\x13\xb8\x2a\x9a\xdb\x5c\x34\x37\x22\xeb\x35\xd6\x7c\x9f\x30\x40\x76\xa2\x0e\x8b\xba\x29\x4c\xb9\x6b\x1d\x22\x3f\x0b\x93\x30\xb6\x5a\xbc\xfa\xdc\xa8\x37\x67\xf9\xed\xcb\xe5\xd9\x2f\x85\x49\xc4\x95\x71\xe5\xcf\x37\xa2\x11\xcf\x50\x9f\xca\xa2\xf5\x19\xbe\xd6\x6f\xf5\x22\x96\xfd\x84\x4a\x58\x18\xbb\x82\x44\x6b\x7b\xfd\x81\x6b\x66\x55\xfe\xcc\xf4\x74\x51\x4c\x58\x42\x3d\xfb\x11\xa6\x11\x6c\xd5\xf7\xe4\xf1\x58\x1a\x4b\x33\x34\x48\x40\xaf\xde\xb2\x5c\x4f\x3d\xd4\xa4\x9d\x07\x98\xc2\xc9\x85\x7a\xff\x3e\x7a\xd7\x09\xa5\x58\x9b\x36\xe5\x43\xf4\xcd\x91\xad\xd2\x6e\x37\x82\xcb\x40\xa3\xac\x3b\x3c\x4a\x85\xab\x6b\x3e\xc8\x71\x49\xc2\xe4\x44\x46\x0b\x0b\x04\x2f\xdf\x7f\x64\xcd\xdb\x50\xd0\x7e\xbc\x06\x8d\x33\x2b\x53\x14\x5e\xc2\x69\x8c\x6b\x19\x1c\xb3\x66\xf7\x8e\xb5\x98\x20\xea\x1d\xcc\x57\x36\x51\xa4\x11\x56\x1d\xc9\xef\x0f\x80\x77\x1b\x71\xc2\x78\xd9\xba\x6e\xb2\x63\x87\x0b\xa7\x49\xca\xb5\x25\x96\x1a\x28\xef\x0b\x44\x85\x5c\xe1\x25\x46\x96\x4f\x92\x0a\xe6\x56\xe9\x9f\x90\xef\xdf\x2a\xb0\x4e\x65\x57\x36\x48\x13\x01\x22\x10\x5d\x41\xd4\x27\x15\x05\xae\xaf\x14\x04\x1c\x6a\x74\xf3\xfb\x61\x37\xf9\xec\x2a\xe0\x98\xb0\x7c\x10\xbf\x0e\xab\xc5\xd6\x5f\x40\x73\x83\x6e\xc3\x69\x98\x7f\xec\x77\xb7\xc4\x38\x6a\x9d\x4d\xa1\xb6\x36\x91\x30\x28\x53\xee\xcf\x6e\x22\x63\xdc\xb5\xbd\x6f\xe7\x1c\xb0\x21\xa1\xec\xf8\x86\x79\x40\xad\x88\xbf\xe3\x0a\x1e\x25\xe4\x7c\x17\x16\xa0\xb8\x48\x6b\x17\x6f\x2b\xc8\x4a\xbd\xc2\x95\x67\x32\xa8\x79\x20\xb9\xd7\xe6\xb7\xd1\xbf\x65\x79\x9e\x16\xe4\x53\x1e\xa8\x10\x2c\xc9\xfe\x88\x01\x94\x72\x12\x68\x34\x6b\x5e\x8a\xac\xf9\x4b\x97\x98\x13\x1a\xa0\x25\x55\x9e\x9b\xba\x11\x58\x84\xeb\xa4\xe8\xeb\xee\x84\xa9\x75\x62\xac\x7c\xce\x42\x97\xa7\x76\x89\x18\xa0\xa1\x98\xef\x28\x25\x86\xf9\xfc\x46\xde\xab\x80\x0c\x56\x55\x4e\x4d\x8c\x11\x20\x64\xc0\x79\xd9\xf9\xa5\x9c\x87\x26\x0c\x53\x9f\x04\x1b\xa7\xe0\x46\x77\x1c\x1a\x1b\x5e\x45\x4f\x73\x8c\xf5\x8e\xfe\xd9\xbb\x69\x21\xfd\xdf\xc8\xad\x94\x3c\xe2\x1a\x0b\x84\xdf\x95\x7a\xa7\x2c\xae\x9b\xaa\x6e\xaa\xb9\xd0\x35\x8f\x84\x65\x8f\xe9\x49\x63\x0d\x54\x22\xb7\xa1\xe5\xf1\xe7\x8c\x64\x80\xbb\xc3\xd6\x7a\x55\xdd\xeb\x8a\x20\x44\x90\xec\x73\x29\x4b\x2f\xf5\xb6\x51\xe5\xf4\x68\xb0\x01\x82\x03\x16\x60\xe8\x27\x73\x2f\x30\x34\x9a\x15\xaf\x7d\xd6\x90\x33\xc6\x39\xed\x05\xb3\xfd\x7b\x19\x92\xe1\x53\x1e\x07\x56\x67\x6c\x71\x73\xb3\xd9\x6f\x9e\x1e\x17\xf7\x56\xa4\xfc\x70\xb3\x7e\x7c\x7a\xf0\xa7\x8a\x69\x8c\xe8\x10\x6b\x6c\x3d\xc2\xaf\x06\xc9\xbb\x90\xa9\xeb\xd2\x91\xc1\x0f\x4d\x78\x9e\xa4\x61\x18\xb9\x5d\x39\xab\xe0\xb1\x6c\xfe\x01\xd5\xf4\x41\x92\x54\x62\x7e\xa4\x2a\x73\x58\xb5\xf6\xf6\x97\x90\x1d\x9e\x28\xf0\x48\x35\x97\xa5\x1d\x66\x1c\x5c\x27\x1e\x1a\x15\x0f\xf8\x23\xff\x9b\xea\x23\xca\x53\x1a\xa1\xc9\xee\x77\x65\xc7\xb3\xf4\x1f\xd0\x73\xca\xf8\x6d\x7f\x89\xe6\x67\xfb\xa5\xf3\x55\xd9\xfb\x0f\x3c\x8d\xa2\x28\x75\x0e\x16\x62\xa4\x0e\x86\x24\xdf\x45\xfd\x76\x70\x67\xe8\x3a\x26\xb1\xb6\x70\xc2\xfa\x0c\xd6\x0e\xae\xa7\x71\x17\x2e\x62\x8e\xf0\x81\x77\xb8\xa0\xce\x6f\x3d\x3b\xf2\x24\x23\xa8\x75\xf0\x9f\x57\x68\x9e\x30\xb9\x39\xa2\x66\xa3\x5c\x72\xc0\x71\xf5\x20\x7e\x2d\xcf\x75\x56\xf4\x01\x21\xae\x20\xd1\x43\x1c\xec\xf2\xf2\x5c\xe8\xc7\x72\xf2\xbc\x3a\x22\x98\x57\x12\xdd\x7b\x59\xf5\xf2\x1e\x9f\x20\xdb\xb8\xe6\x09\xa2\xd9\x1f\x4a\x9d\x59\x01\xe5\xe7\x15\x0d\xbe\x5c\x52\x74\x1a\xa1\x31\x77\x0b\x4e\x86\xed\x13\xef\x97\x83\x8c\x90\xe1\xf6\x06\x8e\x3d\xfc\x86\x83\xd4\x58\x30\x57\x94\x88\x9b\xed\x7e\x06\xad\xa4\xd3\x52\xda\x09\xf3\x57\x83\x01\x0c\x43\xfe\x9e\x97\xc7\xcd\xe3\xa2\x27\x8e\xa0\xdc\x08\x82\x89\x78\xe7\xa1\x8f\x02\x09\x1e\x8a\xc6\x8d\xb6\xc2\xea\x47\x54\xae\xdd\x8a\x8b\x2b\xa4\xb9\x39\x7b\xa2\x29\x9a\x06\xa9\x41\x63\x5f\x5b\xa1\x3a\x5f\x8e\x83\x73\xa0\xfe\x36\x22\xce\xf2\x47\xe8\x24\xe9\xbd\x7d\x8c\x24\x7b\xb7\x29\x25\x44\xe2\xd7\xd5\x25\xd4\x4f\x1f\xc5\xba\x79\xfb\x2e\x0a\x9d\x5f\x15\xe9\xfb\xee\x71\xcc\x1d\xe0\x7e\x71\xd6\x59\xe3\x58\x7a\xc4\x3c\x3d\x3d\x4d\x69\x2a\xd0\x4d\x72\xea\x88\x07\x24\x57\xeb\x41\xf2\x29\x15\x86\x18\xf7\x76\xe7\x48\x18\x68\x4a\x15\xb1\xd2\x58\x50\x37\x7b\xa4\x66\x73\x02\xff\xeb\x02\x55\x30\x9f\xe1\x67\x56\x67\x65\x67\xad\xa7\x54\x71\xdc\x46\x7f\x8a\x3c\xd3\xc3\x92\xea\xaf\xbf\x5c\x1a\x8a\x08\xab\x38\xd6\xb5\x12\x27\xf8\x2e\x1a\xf5\x86\xa4\x42\x95\xdf\x2d\xc7\xf7\x15\x1a\x8a\x31\xe9\xf5\xd3\xce\xbf\x84\x01\x91\xac\xeb\x14\x11\x96\xf8\xc7\x6b\x6d\xaf\xd6\x6d\x39\x57\x77\xa2\x5e\xff\x52\x70\x6a\xd6\xbf\xae\xc5\xb4\xc6\x37\x15\x11\x8e\x45\xcd\x36\xd8\x97\xfd\x07\x2a\xcf\x82\x3f\xff\x7d\xa2\xc8\xda\xdd\x0f\x59\x01\x58\x0b\xeb\x7f\x4f\xa9\xd7\x0b\x7a\xb8\xb4\x4b\xfe\x6d\x05\x5e\xff\x7a\x9a\x7d\x48\x23\x29\x31\x60\x7b\x2e\x4e\xe2\xb2\x2d\xcb\x7c\xf0\xc1\x22\x1d\x40\x4f\x9d\x6d\x0b\x22\x87\x45\xb7\x63\x9b\x31\x65\x11\x30\xe1\x78\xb7\xaa\xce\xaa\xa9\xeb\xcf\x8c\xc6\x94\xa5\xb6\x92\x59\x1c\x65\xb6\xf2\x17\x8d\x03\x8e\xa6\x85\x12\x79\xbe\x83\xea\xe7\x67\x98\xa3\x94\xc7\x4c\xb9\xb2\xa6\xe5\xf9\xe2\x5d\x9e\x34\x55\x56\x90\x3d\xab\x77\x67\xf9\x2f\x50\x4d\x27\xcd\xe1\x3a\x88\x44\xa3\xc0\x7b\x3b\x37\xbc\x3f\x89\x60\x96\xaf\x41\x44\xa9\x80\x00\xfd\x80\x23\x02\x43\xb6\x30\x2e\x06\xa7\xa9\x30\xa1\x85\x77\xe0\x82\xb7\x28\xf4\x0e\xf2\x7c\xe1\x41\x20\xed\xfc\x6e\x3e\xaf\x8a\x99\xbf\xa4\xe4\x80\x1b\x38\x54\xaf\x20\x8b\xac\xbb\x94\x26\x4c\x59\x6b\xfb\xdf\x67\xe8\x63\x73\xa9\x8e\x3a\x3d\x55\xeb\x45\x58\x24\xd6\x5d\x55\x9e\x4f\x93\x21\xad\x65\x80\xa9\x9b\x9f\x19\x7c\x2c\xf2\xdc\x29\x14\xd4\x03\xb8\x49\xaa\xa5\x96\xde\x2b\x99\x58\x86\x29\xc4\x0c\x6d\x67\x9b\x31\xdd\xbd\x95\xa7\x87\x52\xc3\x35\x93\x76\xdb\x33\x21\x5e\x92\xc8\x96\x15\xda\x02\xb6\xcb\xa4\x9f\x09\x2c\xb4\xdb\x2a\x91\xd0\xf1\xf5\x44\x10\x58\x78\x95\xf5\x7e\x6e\x20\xcf\x7e\x0e\xf0\xc7\x22\xe0\x0a\x63\xfe\xff\xb2\x21\x94\x2d\x54\x75\xc7\xf6\x48\x45\x20\x19\x3a\x27\xde\x25\x5c\x8a\xfa\x1d\xae\x45\x46\x66\x91\x97\xd7\xa8\x12\x11\x28\x83\x7c\xac\x27\x7a\xb2\x73\x62\x6a\x85\x0b\xe2\xd8\xc3\xed\x22\xdc\xf3\x12\x53\x41\xe3\x14\x63\xcc\x59\xfd\x0c\x18\x2f\xbc\x2b\x3b\xf0\x82\xa0\x09\xc5\x05\x14\x95\x5a\xec\x8e\x39\x64\xee\xeb\x7a\x59\x93\xa2\xf5\xdb\x0f\xe7\x1a\xaa\x83\x6e\x9d\xf2\x03\x72\x09\x4c\x6e\x24\x8c\x53\xbc\xd5\xac\xc8\x9a\x1b\xbb\x2c\x77\xe7\x61\x2c\xc2\xdd\xeb\x67\xd9\x00\xf2\x0d\x75\x45\x3b\x57\x19\xa9\x6e\x4c\x08\x26\x03\x64\x93\x6e\xad\x16\x2f\xdf\x3a\x84\x9f\x8a\xd8\xa4\x18\x7a\xfd\xc7\xf7\xf5\x9f\xfe\xb7\x24\x92\xbc\xb3\xc7\xe4\xf9\x75\x54\x7c\x28\x12\x25\xb0\x66\x7f\x99\x35\x8b\xfc\xf4\x26\x26\x84\xc5\xdd\x6b\xe7\x01\xc1\x6f\x7c\x2e\xf2\xac\x6e\xfe\x7e\x16\x79\x66\xb2\xd6\xee\xaa\x9a\xe2\xea\x0b\x70\x6a\x6b\xdd\x74\xf6\xda\xa3\x69\x04\x17\x80\x25\x8c\xaa\xd3\x6f\x21\x5d\x93\xb1\x64\x10\xef\xb5\x6a\x17\x86\x1f\x6f\x50\xbc\xd4\xb0\x29\x76\x99\x06\x85\x8c\xf8\xd3\xc5\x7b\xb8\xf8\x8b\x34\x08\x53\xd5\xdb\xf4\xb8\x47\x8d\xef\x28\x8d\x2c\x04\x6a\xff\xfc\x30\xe1\x2d\xa3\x22\xe5\x14\xf3\xde\x53\x52\x4e\x14\x5f\x9e\x37\x6c\x44\x2a\x42\x66\x59\x05\x9a\xac\x82\x99\x78\x9b\x48\x95\xd5\x69\xb2\x36\x03\x46\xac\x7e\x17\xe7\x7c\x3a\x46\x04\x15\x60\x79\x1e\x1a\xa8\x46\x5c\x1c\x54\x08\x6d\x42\x39\x48\xc6\xde\x9f\xd5\xbb\xab\x3f\x1d\x61\xc0\x84\x00\x81\xa6\xc5\xa9\xca\x14\xdc\x23\xfd\x8d\xb5\xca\x5c\xbb\x0a\x2d\x34\xd1\x27\x21\xfe\x7e\x2e\x1b\xf7\x9a\x7c\x0f\xce\xa9\xea\x9e\xa7\x35\xa5\x47\xf2\x2d\x54\x68\x2a\x10\x19\x73\x38\xbc\x7a\x96\xb9\xf1\x1b\xd1\x11\xe9\x88\x31\xfc\x1b\xb6\xbc\xef\x85\x5e\x5b\x1e\xff\x7a\x7e\xeb\x12\x3a\x8e\x30\x57\xbc\xfb\xbe\x78\x5e\x1f\x6e\x9f\x5e\x1e\x6f\x10\x5a\xe0\xaf\x0d\x31\x37\xb1\xa7\xc1\x3f\x17\xb6\xe4\x6a\x3b\xc5\x5b\x08\x43\x14\xa2\x97\x4f\xa2\xaa\x61\xa6\x0e\x46\x98\x84\xe0\x96\x9d\x21\xb7\x2c\xb2\x7f\x4f\x26\x5b\x4f\x1c\xe0\x0f\xe1\xa9\x70\xe1\xa7\xfa\x7c\x9c\x26\xad\x84\x91\x0a\xeb\xfa\x6b\x27\x0c\x3c\x84\xf0\x39\x7e\xa4\xab\x34\xe3\xf9\x8a\x38\x9c\x4a\x02\x96\x55\xd6\xea\xbe\x8d\x82\x10\x73\x20\x5c\x19\x86\x56\x34\x49\xe5\x19\x14\xcd\xd1\x7e\x2a\x84\x48\xb9\x77\x26\x23\x09\xbc\x43\xbf\x2f\xcf\x97\x95\xa8\xf4\x68\xe6\x4b\x16\xc7\x80\x51\xb1\xac\xc9\x9c\x14\x73\x3d\xc0\xcf\x4b\x06\x1c\x17\x4b\x84\xf4\x60\xda\xc3\x7d\xc6\xae\x83\x31\xe8\xce\x3f\x2f\x17\xde\x7e\x90\x09\xa3\xc8\xf2\xe4\x14\xfc\xbe\xa2\x4b\xf5\x47\x18\x3d\x90\x9c\x78\x00\xf5\xf6\xfb\xf3\x6a\xde\xc6\x95\xad\x23\x2c\x3b\xb4\x5d\x3b\x0a\x6e\xcb\xea\x36\x33\x5d\xb2\x4f\x0a\x00\x5f\x0f\xb9\xc8\xf3\xef\x27\x89\x4c\x84\xc8\xc8\xf9\x0a\x8f\xe7\xb1\x4a\x61\xeb\x1d\x4a\x8c\x80\xff\x04\x2c\x28\x5d\x42\x01\x26\x53\x99\xa8\x2e\xb7\xa5\x4b\xf7\xcf\xda\x06\x52\x18\x8d\xd3\xd6\x15\xfc\x58\xf0\xfe\x8b\xb7\xeb\xa4\xd4\x96\x81\x7d\x99\x69\x9d\x15\xaf\xcf\x33\x14\x9d\xae\xa7\x12\x91\x2d\x56\x6f\x5f\xf0\x53\x01\x7d\x1e\x5b\xea\x38\x75\xd5\x32\x79\xfe\x0c\x83\x28\xd6\x27\x6f\x52\xa7\x29\x86\x79\xdb\x6f\xd4\x31\x52\x51\xa9\x35\x40\x3b\x7b\xda\xce\x2b\xc8\xf2\xf9\x15\x4d\x9a\xc4\xaa\x1b\x0b\x2b\x3f\x7c\x45\x70\x4e\x55\xc0\x94\x70\x30\x73\x4b\x77\x84\x8e\xf3\xb4\x93\x4c\x4d\xeb\xb6\x38\xed\xdf\xe7\xbd\x13\xfa\xa2\x8a\xa8\x20\xec\x09\x8c\xdd\xde\xfd\x35\x16\x5b\x11\x1d\xa2\xa7\xf8\x0f\x28\xca\xe3\x94\x71\x92\x2a\x1a\x58\xae\xcc\xcd\xea\xe9\x01\xa0\x39\x8f\x60\x30\x8a\x52\x81\xbc\x13\x36\xaa\x75\x25\xec\xf4\xd5\x8e\xa2\x5a\x2f\xd2\xe9\x5b\x7c\x72\x6b\x61\x04\x31\xef\x38\x11\x0b\x2d\x2a\x8d\xf1\x20\x7f\x75\x16\x2a\x99\xf8\x0c\xe5\xb6\x9c\x40\x14\xf9\xdf\x06\xff\xf0\x71\x1e\xc5\x12\x8e\x28\xf7\xd3\x08\xb4\x33\xa7\x83\x4c\x15\x93\x91\xb3\x42\x1b\x1f\x06\x19\xef\x7c\x13\x65\x57\xaa\x98\xe6\x18\x6f\xf7\x31\x04\x9b\x8a\x1e\x86\xba\x55\x12\x58\x50\x8a\xea\x57\xf0\xf2\xd4\x35\x46\xa1\xa6\xce\x37\xb8\xc1\x09\x33\x2c\x52\x53\x49\x2c\xb1\x9e\x07\x6f\xfa\x1a\x5e\xa6\x92\xd8\x4e\x19\xa1\xf5\x4d\x56\x63\x61\xad\x65\xd3\x9a\xd5\x1b\x1d\x1f\xcb\xb5\xf1\xec\x72\xc8\x47\x36\x6e\x4d\x89\xf6\x4a\x53\xf7\x59\xd1\x1a\xde\xeb\xfd\xf7\xb1\x7f\xa0\xd2\x28\x92\x74\x24\x37\x81\xf7\x39\x96\xf7\xef\x5e\x55\xca\xc1\x71\xa6\x82\x7a\x9f\x07\x62\x4c\x6e\x41\xa6\x48\xb9\x61\x90\x3f\xdc\xb2\x6a\xfa\xea\xac\xc2\xe5\x8c\x5d\x57\x49\x45\xe2\xa5\xea\xbb\x12\xdd\xf1\xd9\x64\x18\x23\xfb\x69\xbb\xd7\xbe\xd8\x52\xaf\xee\xe8\x24\xc6\x5a\xdd\xfa\x5c\x9f\x30\x4e\x32\xd4\x17\xa0\x4a\x1a\x40\x3d\x98\xfa\x7c\x3c\x7a\x53\xce\x35\x29\x66\xb4\xdb\xe2\xab\x0c\x7e\xc2\x03\xba\x44\xa3\x51\xaf\xd3\x84\xea\x5e\x79\x1b\x0b\x01\x06\x2b\xbe\x02\xa1\x70\x59\xc3\x2d\x6d\x5f\xbe\xb4\x83\xda\x86\x41\x86\xd9\x0d\xd7\xd9\x44\x36\xbf\xee\x73\x6b\xcd\x0f\xff\xd9\xe7\x97\x42\x65\xa2\x58\x47\x63\xaa\xe0\xf2\xe3\x13\x51\x47\xaa\x8c\x8e\x88\xe9\x2b\x84\x7a\x6c\x8d\x0e\x02\xa6\xf1\x5b\x64\x85\x7e\x84\x8f\x2e\x6c\x33\x8e\xb6\xe9\x80\x27\x28\xa8\x70\x53\xb6\x6d\xdd\xbe\xa7\x03\x69\x48\xd4\x57\x9c\xae\xca\x3c\x17\x87\xc5\xe2\x10\xd0\xb9\xa8\x9e\xa6\x24\x12\xc9\x60\x59\xcb\xbc\xc4\x50\x36\x94\xda\xfe\x72\xe5\xd6\x34\x8c\xc3\xbe\x0c\xd1\x93\xfa\xf8\xb1\xab\x29\x17\x18\x45\x3b\x9e\x6b\x75\xc5\x15\x4d\x35\xd5\x3c\x74\x64\x8d\xcb\xb2\xcc\x2d\x11\x7a\x87\x00\xee\xc6\x86\x0e\x19\xc1\x40\xdf\xff\xdc\x7b\x50\x97\x0e\x59\x8a\xe5\xbe\xbf\x97\x0d\x58\x40\xc6\x34\x57\xa1\xc3\x38\xa2\xba\xa3\x3f\x9f\xbe\xc4\x50\xa4\xda\x01\xc1\xbd\xc0\xcf\xb4\x4b\x94\x50\x90\x9d\x04\xce\xa0\xf2\xb8\x6b\x8f\x30\x72\xb3\xf4\x1c\x07\xf5\x50\x91\x6d\xf2\xa6\x22\x2e\x52\xe7\x15\xff\xb1\x3d\xcb\xf1\x9a\xa8\x23\x48\x30\xb8\xd0\x2b\x44\x3e\xa3\x3d\xab\x6f\x4b\x94\x72\x9b\x74\x67\x41\x84\xf8\xb1\x1a\xe9\xba\x47\x01\x2c\xdf\x43\x68\x3a\xa0\xf6\x7a\x06\x55\x56\xfd\x77\x89\x43\x69\xc9\x60\x2d\x02\xf2\x7a\x91\xd6\x31\x0f\x22\x4b\x14\x34\xe0\xc2\xa4\x3a\x21\x11\x86\x76\x06\x90\xdf\xac\x78\x9d\xad\x13\xd3\x89\xe6\x88\x86\x6d\xd7\x33\x1f\x1f\x9b\x8d\x48\x69\xce\x02\x0b\x04\x68\x97\x66\x8f\x53\xd4\x5c\xda\x20\x66\x05\xaa\xfc\x09\xd5\x40\x96\x93\x6a\x29\x03\x64\x6a\x2c\xe0\xe3\xa1\xd4\x90\xef\xde\xb2\x93\x4b\x76\xf8\x2e\x2a\x48\x85\xa7\x2d\x39\x44\x07\x51\xb7\x06\xea\x9d\xa8\x5f\x5a\xeb\x3a\x09\x02\xf4\x5d\xbb\x37\xa2\x04\x45\x68\x72\xd3\x38\x26\x80\x21\x48\x5c\xeb\xd0\xd2\x6b\xd8\xba\x71\x57\x98\x3f\x94\x3c\xa5\x10\x50\xa2\x2c\x57\x94\x3a\x57\x59\x73\x79\xee\x11\x84\xbe\x87\x0e\xa8\x53\x25\x68\xed\x64\x1f\xf8\xef\x5b\xd1\xa0\x5b\x6e\xb6\x4f\x4f\xdf\x0f\x37\x8b\xa7\x43\x48\x0f\xc2\x37\x13\xa2\x89\xad\x4b\x2f\x06\x53\x1e\x08\x08\xee\x40\x8b\xa8\xfb\x34\x0d\xa3\x00\x65\x14\x79\x74\x31\xbf\xbf\xc3\x18\xc9\x78\x9a\x00\x35\x29\xee\x9c\x0f\x50\xa9\x73\x0e\x93\xbc\xdc\x0c\x34\xc7\x1d\x17\x52\xc1\x58\x17\x5a\x09\x46\x60\x10\x08\x23\xea\x59\x5f\x4f\xad\x5b\xfa\xc7\xe4\xa2\xa1\xb6\x41\x2f\xcb\xd9\x50\xfc\xb4\x82\x18\xbd\x18\x0b\x85\x28\xd0\x28\x38\xb1\xdd\xfe\x36\x3a\x73\x14\xc6\x18\x17\x72\x23\x70\x6f\x6b\x28\xc6\x67\x67\x61\x8c\x59\xca\x4c\x95\xf7\x60\x9a\x11\x7a\x0a\x58\x62\x53\x98\xf7\x4f\x77\x87\xb5\x57\x67\x5c\x9c\x9b\x72\x60\x31\x00\x4b\x34\x31\x2e\x26\x79\x5f\xbe\xae\xab\xca\xb9\xae\x9f\xec\xf3\x10\x07\x32\x75\x88\xab\xbd\xc8\xa1\x40\x72\xa0\x39\x86\x46\x0a\x31\x8f\x45\xdb\xd5\xb2\x82\x3d\x23\x45\xca\xd0\x96\x81\x98\x2b\x84\xca\xe6\x59\xdd\xd8\x11\x77\x10\xf5\xfb\xe4\x2c\xdc\x50\x34\xbf\x35\xe4\xd0\x80\x9d\xdf\x9f\x14\x03\x8f\x7c\x56\x48\x23\x09\x72\x80\x0d\x9b\xc9\x46\x43\x9a\x84\x34\x1e\x94\x9c\x8d\x59\xb3\xfb\xa7\x16\x2c\xf6\x3c\xa2\x0f\xdb\x39\x29\x33\x0a\x82\xdb\x3a\xf8\x5e\x53\xf8\x94\xfd\x06\x97\xd1\xf6\x0d\x02\x38\xb2\x7f\xe8\xd2\x21\x2e\x10\x25\xfc\x5c\x96\x03\x9e\xae\x49\x65\x88\xb7\x78\x40\x52\x86\x58\xb7\xbd\x15\x1f\xd2\x53\xff\x73\x46\x3a\x63\xe2\xd3\x4e\x6d\x68\x90\x2c\xc1\xfa\xaf\x07\xd0\x99\x2a\xbf\x83\xc8\x9b\xb7\xc9\xe6\x00\x8a\x0b\xe4\xfe\x3e\x66\x45\x73\x10\x85\xee\x19\xa7\x66\xd7\x7f\x50\x90\x62\x11\x9a\xa3\x27\xf5\xf5\xd3\x93\xb7\xa5\x4c\xa2\x30\x12\x90\xa9\x77\x8b\x39\x1d\x7d\x9e\x4f\xff\x70\x87\x1b\x1d\xe2\x6c\xdf\x3c\xae\xd6\x8f\xfb\xc3\xed\xcb\xe3\xcd\xe1\xf7\xf5\x6e\xbf\x79\xbc\xf3\xf7\x6d\x40\x20\x52\x5a\xe5\xd0\x15\xcc\x83\x31\x40\x86\x48\x2c\x6b\x60\xbf\x65\xa7\x69\xad\xbc\x21\x89\xb2\xee\x63\x79\xd4\x7e\x71\x32\x84\x07\x58\xc9\x27\x74\x3b\xe4\xb3\x76\x1f\x72\x79\xe9\x07\x40\xc7\x7d\x72\x0e\xb0\x98\x6e\x40\x75\x9f\x73\xa1\x67\x34\x26\xa9\x21\x26\xe2\xca\x8b\x3e\xfc\x0c\x27\xe7\xa0\xa9\xa0\x5e\xa0\x60\x7b\x2e\x2c\x53\xc4\xbe\x5c\xd4\x75\xf6\xea\xd7\x0a\x13\x26\x0a\x31\x3d\x59\xfd\xbd\xd4\xf9\xd5\x7d\x44\x11\x53\x9e\x7f\xbf\xae\x4b\x85\xaa\x3d\xf3\xe5\x13\x26\x8a\x13\x5c\xb0\x36\x5d\x04\x46\x63\xa1\xe2\x7f\x03\x6d\xec\x9f\x89\x05\x96\x6b\x2a\x73\x1a\x41\xe3\xc1\x4d\x83\xaf\xe3\xfa\x86\xa5\x80\x55\x87\x8b\xcd\xea\xbb\x7f\xc6\x98\xda\xba\xfd\x53\xa6\xca\x53\x7d\x80\x21\xd5\x20\x35\x71\x4c\xa5\xcf\x4c\xba\xc8\x70\xe9\xcb\x23\x27\xeb\x92\x89\x93\x28\x41\x37\xf7\xdc\xa7\x36\x4d\xac\x04\xa6\x7e\x35\x08\x7d\xf3\xff\x73\xf6\x66\xdd\x8d\xea\xd8\xfb\xf0\xd7\xa9\x8b\xbe\x00\x24\x01\xba\x74\x1c\xa7\xca\x7d\x92\xd8\x1d\xbb\xaa\x7a\x58\xbf\xe5\xa5\x61\x2b\xa1\x83\xc1\x0d\x38\x29\x9f\x4f\xff\x2e\xb6\x24\x26\x93\x9c\xfa\xbf\x37\x27\x75\x8c\x98\x84\x86\x3d\x3c\xfb\x79\x2a\xf1\xdc\x47\xde\x4c\x0c\xc0\xbc\xac\x45\xd1\xef\x64\x26\x49\x18\x42\x13\x7f\x64\xf0\xbe\x03\x55\x41\x73\x03\xd3\xee\x4c\x14\x4f\xfb\xa8\xfd\xbc\x63\x6f\xd2\x80\x8a\xd4\xd5\x6c\x6d\xcb\x3c\xdf\x8d\xc8\x73\x46\xab\x9a\x49\xa9\xc4\x4a\xe1\x9b\x5c\x14\xcf\xb5\x78\x1d\xee\x19\x26\x15\x09\x82\xbb\x3b\x49\xce\xdd\x59\xd6\x4d\x75\x56\xcd\xa6\x80\x1e\xd2\x60\x78\xc0\x3c\x3d\xf0\x5d\x05\xf0\x94\xa1\x46\xff\x43\x59\x35\x7d\x93\xd0\x72\xdf\x38\x91\xa8\x5b\xbb\xbf\x75\x47\x93\x10\xed\x5d\x1b\x12\xea\x51\x5b\x53\xe8\xbb\x11\xa1\x50\x7d\x15\x81\xa3\xe6\xb8\x2b\xab\xa5\x28\x74\x77\x2f\x11\xc5\xc8\x45\xd8\x09\x12\x59\x0b\xb4\x1e\xe5\x83\x8d\x20\x56\x21\x02\x65\x6b\xae\x73\x66\x93\x7e\x92\x01\x8b\xaf\x29\xef\x3a\x66\x96\xb1\xe4\xbe\x3f\x47\x44\x18\x4f\x13\x4d\x23\xd4\xeb\xfc\xfa\x66\x64\xbb\x6a\x8e\x50\xac\xfe\xf5\x5b\x6f\xd2\x4a\xce\xde\x89\x3c\x97\x33\x97\x18\x61\xcb\xdc\xf5\x54\x10\x1a\x6e\x99\x63\xd4\x21\xfc\x60\x84\xe8\x48\x85\x96\xb4\x02\xcb\x30\x76\xcd\xd0\xaf\x37\x5a\x29\x0c\xe6\x7f\x5d\x3c\xac\x0e\xbb\xef\xdb\xed\xfd\xbf\xba\x43\x00\x58\xe8\x7c\x40\x18\x47\xbb\xfb\x7e\xfb\xb9\x9c\x2c\x40\x90\x86\x31\xe9\xf2\xaa\xb7\xbb\x43\x0d\x48\xd7\xb0\x3d\xcb\x3f\xe0\x52\x23\xe1\x85\x6f\x2a\x22\x84\x51\x34\x20\x8e\xce\x3a\xec\xa0\xc4\x06\xb4\x2d\x4b\x7c\xf6\x72\x08\xcb\xd2\x11\x3f\x3c\xb5\x8f\xdb\x37\x03\x63\x49\x61\x9c\x5c\xe2\x6f\x21\x4b\x8c\x01\x89\xce\x60\xcf\x43\x34\xf0\x7b\x8d\x31\x86\xbb\xd0\x05\x6e\x39\xfe\x9b\x5c\x91\x3a\x93\x20\x10\x24\x18\xec\xf9\xbd\xf0\xd6\xd4\x64\x24\x41\x68\x04\x8b\xbc\x09\x51\x1e\x4b\x04\xe0\x8e\xaf\x16\xd1\xc4\x6a\x9b\x9c\xe5\x31\x6b\xb6\xb9\xc8\x8a\x06\x7e\x35\x33\xdc\x71\xd3\xaf\x4a\x82\x28\x8e\x95\x57\x07\x81\x3c\x47\x28\xe7\x87\xe2\x20\x24\x88\x44\x48\x5c\x04\xa3\x6a\x5e\xd0\xa6\xe9\xbb\x80\x04\x24\xd0\xdc\x16\x73\x7b\xfc\xf5\x28\xc0\x42\x02\x22\x18\x72\xe1\x3d\xad\x76\xab\xc5\xd3\xf2\xdb\xe1\x76\xf5\x63\x75\xbf\xd9\x3e\xac\x1e\xf7\xbe\x0d\x25\x14\xcd\x3b\x34\xa3\xf7\x03\xcc\xed\xa7\x5f\x87\x04\x34\x71\xe4\x88\x38\xcf\xb1\xb3\x1e\xca\xb7\x0c\x3e\x0b\x92\x93\x80\xb1\x08\xa1\xd4\xa2\xf5\x3b\x1f\x44\x25\xf3\xab\x78\x7f\xd7\x92\xa6\x1d\x7d\xbe\xf3\xae\x27\x30\x04\x12\xb0\x98\xa0\x39\x73\xbb\xfe\xba\xde\xde\x2f\x96\xab\xdb\x9d\x7f\xaf\x38\xe1\x18\x0b\xfc\x6a\xbb\xda\xc3\x9a\xfd\x30\x99\xf4\x54\xcc\x75\x97\xce\x80\x93\xc8\xf4\x90\xa8\x80\x04\xb1\xb0\x98\xf9\xfb\xf2\xf9\xa9\xb4\x33\xfd\x23\x26\xb7\xc9\x0b\x27\xdc\x72\x8f\xb4\xfb\xe2\x63\x59\x1d\x7d\xd4\x88\x04\xa9\x96\x28\xe0\x62\xb2\x02\x77\xdd\x9b\x73\xa1\x73\x58\x6f\xef\x76\x13\x99\x93\xd1\x3a\x47\x02\xae\xc0\x8a\x5f\x56\x59\xd1\x60\xa5\xcf\x27\x70\xe0\xf1\xc3\x08\x69\x90\x79\x74\x9a\x55\x73\x2b\x9a\x63\xc9\x9f\x1f\xba\x32\x84\x50\x38\x9f\xb5\xd2\x1f\x05\xcf\x49\xa0\xa8\x35\xd4\xde\x5f\x44\x0e\x3f\x45\xd1\x60\x4c\xcb\xfb\xb7\xed\x71\xe5\x95\xb2\x2c\x27\xeb\xf8\x8b\xaa\x38\xf5\x21\xdc\xc1\x33\xad\xf6\xdf\x26\xed\x74\x14\x63\x42\xf9\x41\x34\x0d\xbc\xff\x2c\xa7\x52\xef\x1f\x4c\x40\x4d\x29\x02\xfd\x0b\xfc\x14\xbd\x57\x46\x02\x6d\x84\x76\x72\x33\xeb\x06\x8e\xfb\xb2\xf5\x64\x6f\x41\x36\xb3\xdb\x32\x09\x80\x30\xea\xda\x5b\x53\x70\x5f\x8e\x50\x05\x93\x1b\x43\x92\x52\x33\xf0\x4d\x50\xeb\x76\xb2\xb4\x84\x01\x33\x52\xf9\x5c\x4a\xef\x3c\x0e\xf9\x6d\x49\x18\x98\x00\x5f\x01\x13\x8b\xeb\xa2\xab\xb0\x26\x61\x18\x13\x64\x82\x44\xed\xce\xc3\xc3\x62\xfd\xd8\xe3\x74\x49\x18\x25\x96\x51\x10\xac\xd4\xa2\x5b\xaf\xfe\x13\x39\x4a\x87\x1e\xb9\x49\xc2\x88\x87\x68\x2d\xfc\xb0\x29\x98\x15\x72\x2a\x5e\xc6\x3c\x15\xb3\xfd\x1b\x46\x42\x44\x36\xc9\xf2\x8c\x39\xe2\x01\x57\x5d\x7b\xd0\xca\xfc\x7f\x2b\xdf\xb2\xac\x23\x52\xf6\x07\xa5\xe5\x2c\x39\x5d\x2a\xb7\x3d\x4c\x68\xa5\x48\x48\x98\x42\xf7\xd2\x55\xb9\xa1\xde\x62\x77\x3e\xd1\x29\xae\x63\x87\xa3\xa8\x5e\x9d\xbe\xc2\xec\xa7\x08\x69\xa2\xf1\x53\xd8\xf5\xa0\xcb\x5f\x4c\xed\xdb\xe9\x8b\xce\x2e\xd1\x21\x4b\x2c\x40\x4b\x95\x45\x01\xaa\x99\x97\x6e\xf2\x6d\xd3\xd0\xd1\x20\xee\x4e\x65\x51\x77\xc0\xcf\xbf\x8d\x1c\x38\xd7\x38\x89\xad\xf5\xfb\x9e\x35\xc5\x80\x84\x8b\x84\x09\xb7\xe5\xee\x1d\x45\xcf\x8d\xcd\xda\x74\xc7\xc1\x56\x73\xbb\xe0\x67\x0d\x15\x52\xa7\xe2\xb6\x3c\xc9\x83\xba\x33\x38\x0d\x2d\x5d\xb1\xbb\xa2\x0d\xc0\xcf\x01\xd2\x48\xc8\x05\x84\x43\xa1\xd4\x75\x51\x37\xc3\x66\xff\x89\xfe\x6f\x58\xd3\xd3\x0e\xb0\x1e\x2f\x42\x3a\x50\x7d\xf7\xcf\x41\x78\x9a\x84\x22\x31\x08\x68\xd0\x76\x47\xd1\x67\xd5\x11\x78\x77\xaf\x27\x63\x8d\x15\xfc\xf7\xe5\x73\xeb\xfa\xec\x30\xd5\xf3\xfa\xb9\x2d\x41\x42\xc9\x13\xdc\x09\xcb\x02\x96\x50\x34\x1b\xd3\x91\x96\x92\x50\x85\xd2\x47\x7a\x2d\x22\x37\x2b\x9e\x6f\xce\xfa\xd9\x33\xf1\x91\x50\x45\x71\xe2\x68\xd1\xda\x35\xeb\x09\xea\x32\x7f\x83\x0a\xc9\x3f\xc7\xf7\x51\x69\x8c\x94\xb8\x36\xab\x7f\xb0\x3a\x3d\x22\x3f\xd8\x2d\xba\xbb\x1e\x17\x88\x09\xcd\xb6\xe2\xb2\x6b\x44\x37\xb5\x95\xb0\x58\xda\x1f\x02\xa3\xb1\x1f\x8f\xcd\x8f\xfe\x8e\xbf\x95\x02\xbb\xd9\x4a\x51\xbc\xfe\x9c\xb2\x7c\x8e\x9f\x5b\x87\x1c\x39\x41\x3b\x9c\xe1\x13\x58\x6b\x0a\x6b\x0f\x3d\xca\x70\x1e\x74\x48\x50\x3f\x06\xe3\x3e\xa2\xca\x2f\xbe\xba\x7d\x5d\xbc\x39\x42\x06\x3d\xe9\x24\xa0\x29\x86\x38\x4f\x65\x89\x48\x68\x07\xc2\x1e\x7c\x64\x90\x56\xf5\x09\xb7\x63\x4b\xf4\x3e\xde\xb0\x43\x30\x41\xe2\xd9\x24\xde\xf6\xe5\xcd\xe9\xca\x96\x0b\xc1\x58\x6d\xac\x43\xad\xca\x0a\x46\x05\x26\x24\x34\xd4\x3a\xd0\x02\xc5\xe5\x67\x35\x19\x48\x68\x0c\x27\x2e\xa0\xf4\x50\xbd\xce\xfa\xcf\x24\x0a\x1d\xc8\xef\x35\xcb\x9d\xc5\x4b\xa2\x30\x8e\xb0\x74\x75\x5f\x89\x37\xc8\xfb\xb0\x26\x89\x42\x03\x08\x88\xa8\xcf\xb2\x35\xb2\x7e\xc7\x12\x26\x51\x64\x02\xe5\xe5\xc0\x5f\x44\x51\x80\x95\x01\x1e\x00\x29\xda\x36\x1c\x23\xcd\xf5\x7b\xd6\xa8\x97\x1e\xb2\x42\x22\xc2\xb9\x27\xde\x40\xa3\xa5\xb3\x94\xed\xb2\xd1\xb9\x43\x24\x22\x2a\x46\x17\x50\x89\x5c\x2d\xcb\xba\xa9\x6f\xce\x97\x76\xa7\x1f\xeb\xd1\x76\x80\x8b\x19\xd8\x04\x89\x88\x36\xdc\xf3\x3c\xbe\x64\xa7\x5b\x68\x44\x96\xd7\x43\x88\x3b\x89\x68\x10\x26\xb6\x62\x4f\x3b\x51\xdf\x31\xcd\x32\x89\x58\x48\x52\x67\xdd\x5b\x01\x95\x47\xa4\xc1\xba\x03\xf0\xe3\x61\x8c\xbf\x23\x11\xd3\x0a\xb1\x2e\x18\x14\xc7\x91\xb7\x7b\x29\xcf\xb9\xbe\x01\xe2\x3b\x22\xe6\x34\xb1\x5a\x28\x4e\x32\xb4\x3b\x20\x05\x49\xfa\x3a\x67\x97\x34\x41\xcc\xf5\x67\xb9\x70\x12\x25\x01\x0f\xad\xe4\x32\x68\x57\x47\x7c\x73\xf9\x18\xa3\x40\xa2\xc4\x70\x8c\x51\x6d\x86\xd6\xf6\x07\x17\x4f\x63\x8e\x7e\xe7\xf2\x2c\xcb\x6b\x81\x3c\x12\xf1\x40\x92\x4e\x62\x52\x34\x70\x5f\x62\xd5\xc3\x97\xfe\x30\xa5\x9e\xcb\x71\xb2\xa1\x4e\xee\xc4\x03\x8d\x75\x5a\x2e\x53\xfa\xb5\x12\xd7\x09\xc1\xf9\xd2\x56\x7f\x01\x06\x78\xaf\x4d\xa3\x9e\x3d\xb6\xfd\xb3\x40\xfb\xf4\xfe\x89\xc4\x48\xaa\xa7\x00\x74\x5c\xe5\x73\x84\x08\x24\xe2\xca\x96\xba\x62\x1e\xb8\x5d\x3e\xca\x73\x33\x69\x22\x4c\xe2\xb3\xe2\x96\xb7\xf3\x09\xea\x73\x3e\x4f\xee\x46\x22\xc9\x52\x7c\x7b\xd4\x99\x8e\xbe\x74\xbf\x1a\xa4\x9c\xb6\xfe\x8d\x2b\x07\x9c\x5f\x27\x22\x45\x34\xce\xcf\x02\x51\xe1\xa5\x2f\xe2\x21\x91\x16\xa9\xe1\x1e\xe7\x97\x8b\xcb\xad\xb8\x4c\xc7\x2d\xd0\x94\xf2\x01\xff\xea\xf7\x2a\xdb\x56\x60\xb2\x5f\xc3\x38\x32\x89\x20\x01\xcc\xd3\xb4\xaf\xe4\x4b\xc3\x9c\x5f\xf3\xff\x34\x3d\x21\x4d\xc0\x65\x52\xdb\xbe\xbb\x2b\xab\x6e\x97\xb1\x35\xf3\xdd\xb3\x83\x8c\xad\x74\x5d\x27\xb2\xec\xe8\x42\x26\x1f\xcf\x84\x01\x0d\x3b\x4a\xd2\xa3\x68\x86\x2b\x8a\x09\x43\x57\x62\x8a\x55\x1a\x23\xb9\x10\x12\x19\x19\x70\xa7\xaf\x67\x73\x1e\x4b\x5b\x71\x33\xe9\x22\x63\x48\x90\xfa\x64\xaa\x53\xb6\xff\x98\xe0\xb9\x6d\xcf\xd0\x87\xd8\x9f\x5b\xd3\xa4\x5f\x7c\x49\x10\x72\xac\x66\x78\xbd\xc8\x4e\x3b\xb8\x3b\x26\x28\xa2\xa4\xe5\xf9\x82\x0a\x34\x7f\xc0\xa5\x1e\x7d\x02\x12\x48\x85\x01\x26\x9d\xd5\x58\x83\x7d\x35\x7d\xfb\xf7\x26\x61\x92\xfa\x0d\xec\x50\xf5\x5e\x06\x89\x22\x86\x5b\xdf\xaa\x79\xc1\x29\xf9\x23\x83\xf7\x89\x0b\xd4\x2e\x7e\x98\x32\x40\xb7\xa9\x10\xe7\xa6\xbe\x2f\x9f\x33\xd5\x5d\x22\x66\x88\x1d\x6a\xad\x0f\xd9\x29\x9f\x11\x12\xf1\x94\xc5\x5d\xc1\xe1\xcd\xf9\x32\x60\x1b\x25\x84\x28\x16\xf8\x12\xab\xee\xc9\x87\xc4\xc1\x83\x87\x27\x00\xd4\xd2\x6a\x5f\x56\xcf\x57\x9c\xa2\xae\x11\x8d\x18\x26\x21\x33\x55\x0e\x25\xb0\x08\xa1\x84\xa7\x8e\x43\xdb\xe6\x6e\xde\x51\xeb\xfe\xfd\x5a\xbf\x73\x76\x31\x20\x94\x5a\xc7\x3f\xab\xd7\xc5\x3e\x83\x2a\x9c\x74\x0f\x55\x11\x32\x42\xb9\xfc\xef\xee\x5d\x9c\x06\x7e\x1c\x61\x09\x55\xc2\x13\x27\xf4\x6a\x3c\x93\x69\x47\x58\x6a\x30\x1d\xa1\x44\xdd\x5c\x89\x0f\x13\x12\x2b\x0b\xc4\x77\x85\x62\xb8\xa4\xff\x01\x97\xc9\x45\x12\x1a\xa1\x4f\xbc\xaf\xce\xc7\xd3\x4d\x56\x3c\x7b\x03\x80\x24\x94\x22\xf0\xe6\x24\x2e\x4e\x23\xa5\x3b\x12\xdb\xfc\x5b\x05\x6f\xe5\x2b\x56\x4b\x41\xd1\x64\xea\x5a\x0f\x8c\x90\xc4\x08\xdc\x5d\x30\x58\x32\x82\x2b\x8d\x96\x1f\x92\x4a\x82\x73\xfa\xd8\x57\x6f\xdf\x83\x69\xd6\x85\xe3\x6a\xf3\xb7\xe6\x94\x21\x6f\x59\xeb\x1b\x3d\xc0\x11\xbc\x3a\xc1\x07\xc9\xb5\xeb\xd4\x28\x21\x3c\xb1\x54\x05\xb9\xa8\x5b\xff\xbc\x2e\x73\x7c\xf0\x6d\x35\x00\x6e\xfa\xa6\x4e\x5c\x12\x7c\x26\x72\xb0\x2e\x10\x11\x53\x0c\xbc\x1e\xb3\x62\xff\xcb\x3f\x9f\x00\x3b\x69\xb2\x62\x9f\x9d\x4e\x50\xfd\xe3\x0c\xe7\x0f\xc2\x43\x44\x86\x29\xfa\x52\xf7\x8b\xe1\x04\x57\x41\xe4\xd0\xb9\x16\xe2\x8f\xa4\x9f\x33\x10\x11\x42\x34\x8d\x10\x95\xbd\xcc\xf1\x56\x43\x68\xdd\x87\x99\x61\x42\xb4\x63\x7e\x7b\x86\x66\x51\x81\xb0\x56\xd8\xb8\x05\x70\x70\x12\x88\xbb\xa3\xa8\x3a\x05\xf2\x9b\xcb\x5c\xca\x94\x10\x08\x2c\xd9\xba\x57\x10\x2d\xf4\xed\x35\x49\xc2\x24\x02\x31\x7e\x26\x13\x5b\xcc\x0c\xa6\xbd\xd6\xc5\x1b\x14\x58\x4b\x30\xfa\x18\x34\x08\x00\x01\x1d\x1a\xd1\xe6\x5e\xc3\x94\xd0\x30\xa0\xf8\x42\xdf\x8b\x2c\x2f\x9b\xbd\xc8\x72\x1b\xac\x99\xed\x74\x1a\xf2\x00\xbb\xf7\x6c\x95\x3c\x1f\x26\xb3\x86\x86\x3a\x0e\xd3\x2b\x98\xce\xcd\x3c\x4c\x87\xd0\x48\x0b\xea\x49\xc5\x6e\xe0\x52\x7a\x7c\x24\xa1\x04\x62\xab\xd7\x27\x1a\xb8\xcb\x0a\x91\x23\x56\x34\xec\x0e\x9b\x50\x04\x1d\x8a\x10\xa3\xa8\xad\x7f\xf3\x00\xad\xe7\x51\x4c\x55\x33\xdc\x49\x94\x58\xfa\xbf\xa3\x45\x76\xdc\x82\x5f\x51\x29\x4d\x09\x4e\xf6\x87\xf5\xe3\x61\xb7\xb8\x5f\x1d\x16\x0f\x9b\xef\x5d\x84\x94\x52\xae\x31\x65\xbc\x2f\xcf\x55\x4f\x03\x48\x28\x0b\x29\xd8\x0a\xfd\x63\x56\x2c\x5f\x44\xf5\x0c\x87\x13\xe9\x8e\xa6\x86\x41\x4f\x42\xb4\xaf\x00\x86\x64\x79\x84\x32\x45\x31\xc2\x7f\x5f\x3e\xe3\xef\xb6\xe2\x66\xfc\xcc\x71\x90\xb8\xe8\xa1\x29\x0f\xd8\x6a\x63\xc6\xe9\x5a\x42\xe3\x48\xc7\xd2\xfb\x4a\x68\x37\x0d\x62\xc4\x34\x8e\x0c\xc2\xd0\x1f\x97\x5b\x5c\x18\x46\x38\x25\x42\x63\xad\x14\x1b\x8b\x8b\xb6\x1b\xbd\xdb\xa7\x4d\x59\x5d\xd5\x1e\x8c\xb7\x01\x9a\x68\x86\xb9\xcc\xad\xa8\x84\xce\x8e\x10\x74\x1f\x29\xa5\x54\x0c\xa1\x8d\xa3\x88\x2a\x4d\x93\xd4\x58\x04\xd2\x29\xbf\x5c\xb9\x3f\xb3\x66\x16\x4d\x53\x83\x91\x77\xa1\x1a\xac\x23\x9f\xb5\x0f\x69\x2a\x14\x67\x2e\x6b\x34\x2e\x19\xe9\x4b\xc2\x08\xe5\x81\xc2\xfc\x3e\xb4\x2e\xeb\xee\xac\x14\xd4\x36\x90\xd2\x37\xb0\x12\x14\xab\xed\x53\xf7\x53\x92\xa0\x66\xc3\x93\x53\x6c\x6f\x37\x84\x31\x4a\x91\x50\xce\x2d\x71\x62\xfd\x52\xbe\xcf\x55\xd1\xfa\x66\x82\x10\xcf\xba\xff\x92\x55\xfa\xba\x5a\x81\x50\xae\x34\xca\x1d\xed\xa1\x6e\x06\x8b\x1c\xe5\x60\x41\x83\x3e\x04\xd3\x5c\xfb\x06\x54\x44\x06\x29\x99\x7e\xee\x41\xbd\x0c\xfc\x4f\x2a\x03\x2b\x0c\xf5\x0c\xcd\x0f\xa8\xb0\x5e\x64\x2e\x01\x31\x9e\xa8\x2a\x8a\x03\xee\x4d\xee\x9b\x46\x39\x56\xbe\x5e\x33\x6f\x28\xc7\x7f\xbe\xc2\x1d\x12\xaa\x99\x50\xb2\x47\xf9\xdf\xec\xf6\x43\xe4\x4a\x7b\x5c\x81\xa5\x2d\x92\x43\x59\x27\x42\xb5\x36\xa1\xb5\x1f\x91\xa0\x74\x88\x07\xbb\xb5\x13\x6b\xd2\x69\x10\x30\x8c\x81\x1e\x9e\xcb\xdc\x11\xff\x4c\xba\x06\xa2\x98\x7a\x55\xed\xb3\xea\x1e\x01\x88\x41\xb3\xc3\x64\x45\x56\xbf\x6c\x7f\x6c\xbb\x03\x32\x44\x08\x24\x0a\x05\xdd\x5c\x89\xf4\x13\x6a\x62\x81\x68\xbc\xfb\xf2\x19\x3d\x27\xc4\xa6\xc2\xbc\xec\x20\x61\x41\x18\x60\x86\x69\x50\xd2\xe4\xb2\x9f\xee\x86\x2c\x0c\x53\x7c\x67\x97\x88\x5d\x20\xbc\xcb\xe2\x74\x7c\x0b\x16\x45\x2e\x5b\x81\xcb\xf5\xb6\x2a\x15\x80\xae\xbd\x4e\xa0\x6f\x26\x34\xbe\xd2\x5d\x05\x79\x3e\x14\x6d\x21\x58\xc8\x32\xd0\x1e\xbe\xf1\xa4\x07\xdd\x71\x69\xd9\x12\xb3\xfa\x11\xde\xb1\xc0\xc3\x1f\x21\x09\x41\x1a\x1a\xe9\x2d\x71\x6b\xfd\x6d\x3c\x07\x22\x61\x44\x44\xb8\xe4\xd8\xf8\x2e\x32\x19\x0d\x47\x13\x23\x10\xa2\x79\x5e\xe5\xea\xd0\x80\x38\xfa\xf3\x68\xa2\x89\xf1\x3c\x3e\x65\xe9\x33\xd3\x84\x31\x1a\x58\x45\x37\x78\xff\x37\x9c\x6b\x97\x07\xc3\x2a\xb3\xd1\x85\x59\xcc\x90\x68\x1a\x7c\x68\x79\xdc\xf3\x0c\x20\xb2\xea\x3d\x97\x53\x53\xee\x0a\x10\xaf\x50\x0d\xca\x2b\x08\x4b\x12\x0e\x66\x04\x48\xee\x25\x10\x46\xc3\x8c\x25\x92\x63\xff\x0c\x95\x21\x3e\x2d\x05\x20\x2c\xa5\x1c\x4b\x33\x1c\x50\x77\xe4\x51\x4e\x9b\xc6\x09\xce\xde\x9b\xc5\xf2\x8f\xef\xdb\xc3\xdd\xe6\xbb\x5f\x83\x58\xaa\xac\x55\xf5\x0c\xcd\x9d\x38\x2b\x68\x6e\x2e\x58\x4f\xde\x0f\x0e\xce\xb9\x70\x06\xb0\xa8\x9e\x0f\xe4\x90\x15\xa7\x73\xf7\x61\x05\xb7\x15\x75\x35\x34\xf7\x8b\xc7\x5b\x57\xbc\x7b\x99\xbc\x9e\x8c\x12\x84\x90\xde\x64\xcd\xfa\x28\x1c\x35\xf7\x20\xa6\xc4\x24\xb5\x08\x09\xdc\xfb\x5a\x4f\xaa\xf1\x95\xb9\xbe\x81\x09\x02\x07\x66\xfb\x61\xb3\x18\x98\x98\x1d\x2d\xe8\x4c\xc5\x56\xd0\xad\xc6\x71\xec\x97\xf3\xf1\xa3\xe8\xd0\x2a\x20\xe2\xfc\xff\x59\x56\xaf\x7f\xd1\xcd\x9a\x18\x94\xe8\x7f\x12\xc5\xab\xd5\xb6\xcf\x3b\xb9\x83\xe9\xa5\x5d\x69\xfe\x6b\x96\xa3\x6c\x87\x2d\x35\xf1\x9c\x12\x84\x69\x1e\xe1\x47\x7e\xba\xdd\xb6\xc3\xad\xff\x5d\x45\x98\x7b\x3a\xc8\x70\xc2\xc7\x3f\x5a\x36\x19\xd0\x20\xec\x08\xd1\xa6\xa1\x83\xe1\xfa\xc8\x4c\x44\x10\xb9\x77\x74\x7a\x98\x58\xa4\xd5\x0b\x87\x92\x38\x08\x01\xf7\xe9\x0e\x8b\x35\xd2\xa5\xbd\x72\x85\xfd\x59\x4a\x63\x99\xe1\x57\xe8\xec\xd0\x81\xbc\x8b\x6b\x14\x12\x2b\x3e\xd3\x6e\x45\x17\x8b\xc0\xaf\x9d\x30\xd7\xa8\xbb\xe2\x90\x58\xa0\x50\x6b\xdd\xf9\x04\x62\x59\xb9\x75\x63\xe8\x46\x4e\x9e\x22\x24\xda\x2a\xdb\xda\x71\x7a\x07\x30\x5e\xf0\xe2\x88\x11\xc1\x87\x82\x32\x77\x65\xc7\xc3\xb0\xcc\x45\xf1\x2e\x3e\x48\x4a\xc6\x24\x8e\xa2\xa0\xe7\x7f\xd9\x97\xab\xc9\xd4\x9f\xb4\xa7\x4c\x09\xd1\xe1\x9e\x6f\x3b\xb5\x76\x12\x53\xa7\x95\x6a\x83\x69\x55\x07\x51\x98\x9c\x6f\x12\xcf\x01\xba\xa8\x24\xf6\xe5\xb8\x01\x8b\x2c\xf6\xfa\xa7\xa8\x4e\xbb\x13\x74\xa1\x8e\x98\x71\x5b\x0e\x79\x76\x35\x36\xb6\x9f\x3d\xaf\xd5\xa4\xa7\x99\x52\x58\xb0\xb3\x5c\x7e\x3b\x3c\xac\x1e\x17\x07\x6f\x54\xc5\x31\x51\x16\x4e\xd8\x65\x70\x17\xeb\xe5\x47\xc6\x59\x1c\x27\xc6\xcb\xcd\x5e\xa9\xcb\x7f\xa0\x3c\x46\xe2\x58\x07\x48\x03\xeb\xb4\x07\xca\x42\xe4\xab\x5f\x27\x28\x6a\xa8\x87\x7a\x6d\x24\x8e\x0d\xb1\x55\xbf\xad\x31\x54\xbf\xdc\x95\x2e\x20\x1d\x8e\x41\xd0\x24\x4e\x1c\x54\xe0\x94\x0b\x05\x8b\xa2\x7e\x1f\x38\x18\xa3\xa1\x98\x2a\xc5\x98\x0f\x59\xaa\x57\x1f\x8b\x8b\x39\x8d\x64\x3c\x48\x95\xa3\xde\x28\xd2\x20\xf8\x16\x82\x68\xb4\x89\x5c\x50\xe0\xab\x38\xc2\xba\xeb\x7b\x21\x14\x38\xb7\x04\x69\xcb\xb3\xe7\xc2\x95\x25\x4d\xb6\xf2\x58\x6a\x8e\x21\xd5\x1d\x34\x0b\x34\x09\xcb\xea\x62\x3d\x99\xa2\xb9\x8a\xfc\xc7\x2a\xd4\xf8\xb1\x77\xe2\x78\xca\x61\xf5\xb4\x8c\xc8\x6c\x75\x9d\x6f\x1e\xc5\xe8\x1a\x3e\x64\x45\xf6\x00\xeb\xaa\x82\xb7\x52\xb5\x36\xe9\x0f\x94\x67\x9b\xd7\x37\x99\xb8\xe6\x23\xd7\xb4\xf7\xa7\x63\x15\x01\x15\x0e\x0d\xb7\x3a\x8a\x2c\x9f\xc2\x30\xe6\x5c\xc7\x58\xa5\x16\x64\xf4\xdf\x73\x75\xd9\xb5\x1e\xbc\xff\x9d\x5b\x06\x7d\xaf\x2e\x7e\x77\x2e\xc6\x1a\x60\x24\x56\x32\x21\xb1\xcf\x67\xc3\xf7\x2a\x8b\xc6\xab\x8a\x32\xca\x95\x05\x6a\x31\x66\x79\x24\xb1\x4e\x2d\xad\x43\x56\x3b\x74\xd3\x20\x9b\x41\xa6\x83\x47\xf3\xc4\xa1\xcf\xfb\x58\x8e\x5f\x3f\xe6\x27\xb9\x96\x16\x5c\xf7\x0c\x4d\x47\x9a\x5f\x0f\x85\x4c\xff\x13\xfa\x4c\x77\xac\xb5\x0d\xd0\x1e\xc5\x2f\x0f\x85\xe8\x8b\xd3\x49\x0c\x41\x2a\x95\x93\x72\xc4\xc3\xf3\xcb\x02\x44\x96\x65\x40\x9e\x2f\x77\x65\xd5\x6e\x52\x96\xa4\xed\x83\xd4\xf1\xb4\xbe\x7e\x36\x28\x1f\x03\x31\xb1\xe8\x78\x6a\x55\x0e\xd7\xe9\xc6\x24\x20\x29\x42\xa5\x6f\x5a\x7f\xf5\x5f\x87\xed\xea\x69\xd9\x43\x7b\x92\x40\x04\x18\x5a\x6e\x5e\x40\x8a\xe2\xb5\xfb\x19\x08\x1a\xb4\x9b\x3f\x2b\xe8\xe0\x28\x49\x98\xb2\x98\x0f\xa5\x4c\x71\x25\xde\x35\xa2\x19\x87\x41\x93\x30\x4d\xc4\x30\xff\x8c\x9e\x77\x7d\x05\x07\xf9\xdb\xf8\x24\x2e\x31\xef\x91\x7f\xc2\xcd\xe8\x9b\x82\x05\x24\x39\x62\xe1\x3f\xb3\x3c\xef\x90\x6f\x24\x89\xb8\xdd\xad\x5a\xeb\xfd\xfe\x87\x25\x2b\xe7\xdd\x41\xc1\x95\xe3\xcc\xf3\xf4\xc5\xa3\x3e\x4d\x22\x15\xa2\xd9\x6b\x6d\xd6\x4c\xe1\x83\x38\x94\xc3\x6f\x25\x3c\x46\x68\x72\x92\x10\x6a\x03\xff\x36\xbc\x7d\x5d\xad\x42\x12\x92\x0a\xaa\x46\x0b\x76\x3b\xd8\x75\x5f\x54\x33\x62\x1d\xba\x5a\x9d\x27\x7d\x43\x39\xc1\xdc\xff\xb6\xac\x86\x5a\x36\x24\xa1\x00\x38\x10\x5e\xb2\xff\x0e\x84\x0f\x26\x67\x33\x61\xf5\x5a\x6d\x4a\xe3\x3e\x93\x95\xa8\x2e\xed\xe7\xbb\xb3\x79\x9f\x2f\x9f\x84\x65\x13\x66\x42\xb4\x25\xd6\x55\x59\x7c\x13\x85\x1e\x1a\xce\x49\x2c\x02\xa2\x3b\x5a\x7d\x93\x35\x9b\xea\xbe\xbc\xce\x9a\xcd\x9b\x6c\x49\x12\x18\x6e\x75\x90\x30\x8f\x95\xf7\xcb\x4c\x92\x30\x86\x99\x42\xab\x4f\xb1\xa9\xda\xa5\x7f\x89\xf8\xee\x01\xce\x2e\xf5\x8d\xb9\x42\xac\x37\xb6\xf5\x8b\xc5\xa7\xf9\xb8\x24\x31\x56\x8a\xd8\xf9\x41\x58\x26\xf6\x06\xf5\x44\x27\x90\x24\x3c\x08\xb0\x4e\x6b\xf5\xeb\x25\x93\xd9\xf0\x03\x73\x0e\xc8\xd3\x66\xaa\xf2\x4f\x28\xf6\x97\xb1\x48\x34\x49\x44\x60\xab\xf8\x7d\x18\xa4\x35\xef\x9c\xff\x3c\x99\xcc\x82\x47\xd4\x86\x52\xfc\x4a\x99\x08\x03\x18\x71\x00\x51\x37\x42\xd7\x0a\x61\x2d\xb5\x0f\x98\x26\x92\x2b\xa4\x68\x78\x2c\x9b\xbb\xf2\x58\x92\xdb\xee\x80\xb1\xb1\x2e\x4b\x3b\xd6\xe3\x3f\xd0\x19\x9b\xc5\x33\x25\x4a\x38\x6a\xb4\x76\x45\x87\x06\x2b\xd6\x42\x32\x79\x44\x2d\x2d\xfb\x2e\xf6\x70\xbb\x97\xce\x98\xd5\x89\x36\x44\xc6\x23\x2f\x0a\xf9\x1f\xf3\x2b\x60\x66\x62\x18\x41\x80\xaf\x7d\xcc\xdd\xe5\x28\xcb\x7c\xdc\x7b\x26\xa1\xc8\x9f\x76\x18\xb2\x81\x1e\xe4\x65\x5b\x95\xbf\xae\xc3\x46\xb3\xe0\x5b\x7f\x25\x65\xc3\x64\x07\xa7\xc9\x86\x74\x34\xc8\x17\xdb\x6f\x12\x61\x7c\x08\xd3\x43\x14\x4d\xde\xda\x68\x2b\x1a\x8f\xd4\x22\x56\x35\xd5\x75\x74\x1a\xa4\x11\x02\x03\xbf\xff\xf1\x15\x6b\x12\xfc\xef\x61\xc8\x18\xe9\x55\x88\x33\x93\x61\x59\xd5\xac\x0f\xe0\x3f\x41\x1a\x12\x61\xdc\xc6\x75\x9c\x78\x64\x69\x48\x63\x3b\x38\x9e\x56\x36\x46\x89\x85\xdc\x03\x61\x76\x92\x86\x1c\x52\xe6\x37\xab\x46\xe4\x1d\x18\x77\x72\xa9\x28\x52\x5a\xf4\x3c\xef\x2f\x65\xd5\xac\xf5\xd8\x33\x4b\x29\x65\xcc\xd5\x3d\x6c\xc5\x05\xe0\x63\x4d\x21\x92\x52\x16\x25\x9d\xda\x79\xeb\x0b\x76\xc1\x82\x94\xc6\x81\x25\xdc\xa8\x04\x34\xe0\x88\x49\xd0\xf3\x9d\xcf\x44\xa7\x34\x21\xd4\x42\xa4\x5c\x2a\x10\xf4\xae\x11\xea\xf5\x05\x95\x8d\xc6\xdf\x25\x65\x81\x96\xa4\xdb\xe8\x9b\x4c\x65\x27\x51\x34\x37\x97\xb5\x9e\x36\xa4\xa9\x5b\xa6\x15\xbc\x81\x5e\x35\x2f\xed\x30\x5a\xbd\x09\x59\x7e\x00\x12\x4b\x59\x4c\x91\xdc\x4d\xd4\x35\x3c\x17\xe2\xa0\xb3\x2a\x6b\x9a\xf2\xa0\xb3\xc3\x5b\xd9\x94\x93\x2e\x65\x49\x14\x83\x33\x23\xd6\xdb\x91\xb5\x93\xc6\x8c\x21\x0a\x67\x79\xbf\xd9\x8d\xb5\xf4\x49\x1a\xcb\x04\xfd\x3e\xdd\xec\xa1\x6e\x3e\x16\x2e\x21\x69\x42\x2c\x55\x70\xe9\x38\x03\x27\x85\x89\x3e\xdb\xeb\x5b\xd3\xd0\x03\x46\x5c\xc5\xee\x84\x9b\x95\xa4\x89\x88\x10\xf5\x64\x3a\x26\x2c\x7f\x24\x0d\x43\x44\x81\xbc\x08\xaf\xda\xdd\xb9\x31\x69\x9a\xd2\xc8\xe5\x6d\x1a\x27\x51\x3d\x17\x31\x4c\x79\x44\xb9\xb3\xd8\x0b\xb8\x44\xf7\x70\x2c\x07\x49\xba\x54\x44\x29\x77\xb6\x8d\x17\xbc\xbe\x76\xa6\x52\x41\x9c\x6c\x70\x57\x99\x32\x47\x94\x44\x52\x91\x52\xf4\xad\x0a\x1f\xaa\xfa\x5d\xb8\xd4\x6c\x84\x2e\x15\xa9\xb2\x4e\x5e\xf6\x06\xe2\x5d\x5c\xc6\x89\xe2\x54\x72\x9b\xe4\xb0\xd3\xc7\x13\x76\x63\x30\xf5\x32\x9d\xe0\xdd\x1c\x51\x3c\xc4\x52\x77\x4b\xcb\xe6\xf5\x9a\x47\x6b\x5d\xaa\xc3\x08\x43\xd2\x8b\xa2\x28\xcf\x85\x82\xbe\x86\x92\xa4\xda\xc4\x26\xf2\x0b\x2f\xe8\x6d\x85\x20\xe5\xef\x45\x1f\xad\x48\xb5\x51\xc8\xe9\xa4\x06\x56\x88\x15\x45\xee\x3f\x1f\x04\x09\x73\xe9\xf8\xcc\xcb\xf9\xb4\xbf\x1a\x44\x94\x36\x25\xfa\x47\xdd\x15\x21\x15\x08\xeb\xb2\x05\xa6\xab\xff\x85\xdc\x39\x78\xfc\x6f\xa3\xbf\xdd\xaa\x01\x02\x10\x68\xff\xef\xf3\xc9\x6f\x0d\xee\x88\x61\x9c\x27\x23\x30\xca\xc0\xdf\x48\x8d\xe4\xa9\x33\xb3\x97\xa2\xf2\xc8\x3f\xeb\xca\xf5\x95\x7c\xfe\x36\x3c\x08\xa4\x76\x42\x25\x59\x85\xe1\xb7\x7e\x3f\xe6\x51\x94\xa0\x0c\x96\x8d\xf2\xfd\x5c\x0e\x88\x4b\x86\x06\xdc\xbc\xd1\xcd\x69\x90\x20\x0e\x5c\x95\xc7\x63\xd6\x34\x00\xf5\x90\xa0\x85\x70\x1a\x8a\xc4\xf1\x0e\xaf\x8b\xb7\xac\x81\xe9\x5a\xc3\x69\x62\xd5\x9a\x1f\xd6\x8f\x87\x9b\xd5\xfe\xf0\x63\x71\xff\x7d\xd5\x9d\x0e\xd4\x83\xa3\xac\x7d\xbd\x2d\xeb\xac\x97\x21\x19\xce\x61\xce\x28\xc3\x5b\xb5\x86\xc3\x6d\x25\xde\x5b\x8f\xd8\x5f\x87\x69\x89\x92\x10\x6e\x09\x77\x4c\x37\xbf\x6d\xc1\x8e\x9f\x38\x51\x96\x29\x13\x4d\xd4\x60\x7e\x3d\xe4\x9c\x6a\x44\xda\x23\xc7\xf0\xed\xdf\x77\x33\x80\x24\xce\x79\x40\x9d\x1b\x74\x2f\x0a\xdd\x15\xfd\x4c\x5b\x59\xc6\xd9\x53\x3b\x86\x2b\xb8\xcf\xfe\x77\xce\x34\x96\x15\x0f\xa7\x19\x17\x86\x5b\x12\xd6\x9e\x31\xf2\x76\x3a\x65\xb8\xe4\x96\x94\x39\x53\x25\x66\x5b\xd5\x38\x37\xc6\x55\x60\x79\x03\x5c\x7c\xc8\x07\x14\x38\x44\xd2\xc8\x0e\x2b\xb1\x7c\x11\x59\x01\x7a\xe9\x6b\x78\xc6\xcf\x6b\x92\x40\xbb\xe8\xc1\xc6\x87\x44\xac\xd4\xcb\xf0\x6b\x19\x43\x11\x0a\xb0\xb8\xfd\xb1\xde\x6d\x9e\x76\x87\x9f\x8b\xfb\xfb\x95\x77\xc5\xb8\x31\xd2\x8a\x9c\x62\xc6\xf2\xc9\xda\x10\x93\xfb\x18\x83\xec\x7d\x1e\xa9\x69\x73\xea\xf6\xa0\x08\x42\x13\xf7\x8b\xce\xcf\xec\xcf\x3f\xb7\xa2\xd0\x9d\x3b\x38\x00\xd9\x8e\x07\xb4\x08\x22\x82\xb0\xc0\xd5\xf7\xdd\xcd\x70\x46\x8a\x80\xca\x80\x39\xb6\x9c\xe1\x9b\x88\x20\xb6\xc9\x9e\x03\xea\x00\x1d\x9d\xea\xe0\x28\xa9\x3c\x1e\x1b\x22\x54\x2c\x74\xa3\xba\x2f\x22\xb4\x05\x41\x96\xf8\xc0\xb5\x23\x32\xc1\x76\x4d\x59\xd7\xeb\xa2\x29\xf7\x2f\x70\x97\x55\xdd\x61\x1a\xa4\x58\x14\xd6\x9a\x59\xdf\x44\xbd\x15\xed\xae\x34\x31\x5e\x04\x65\x14\xd7\xa4\xdd\x59\xda\x3a\x8e\xeb\x02\x4b\x22\x68\x22\xb1\x18\xb1\x28\x8f\x59\xd1\x6e\x5f\xc3\xc4\xab\xa0\x2a\x15\x16\x9c\x99\x3d\x3f\x1f\xb3\x02\x46\x12\x36\xed\x71\x01\xe0\xab\x9a\xfe\x5b\x56\xed\x90\xaf\x5b\x03\x64\xf2\x28\x2c\xb0\xd5\x14\x42\x6b\xd4\x96\x9e\xce\xb2\xf9\x2a\xdd\xd1\x8a\x29\x18\x44\x9a\xbb\xf2\x2a\x4c\x1e\xd5\xa3\x3c\x8c\x60\x10\x23\x98\x66\xd9\x2e\x74\xf5\x8c\xb5\x2d\x62\x12\xe3\x62\xe8\x4c\xfd\x51\xdd\xf3\x9c\x2b\x2e\x62\x88\x70\x9c\x3d\x88\xa2\x11\xa7\xff\x76\xe8\x63\x91\x10\x13\x43\xa7\x64\x7d\x3e\x4e\x6e\x94\x4a\x12\xb8\x25\x7c\x83\x34\x92\x3d\xf8\x5e\x70\x2a\xb0\xa8\xc3\x1b\xd7\x48\xbd\x00\xed\x3e\x35\xf3\x38\xfe\x9c\x98\xa7\xd6\xeb\xf3\x5c\xf4\x77\xe5\x07\xc0\x03\xc1\x93\xd4\x7b\xfd\xf6\x92\x76\xff\x09\xfc\x61\xa3\xd0\x00\x58\xdd\xff\x18\x8d\x71\x41\x6c\x0e\xfe\x19\x9a\xef\xeb\xe2\x03\x94\xaf\x10\x89\x56\x2e\xf4\x6b\x29\x4f\xaf\xa0\xc4\x42\x88\x18\x53\x53\xaa\xcc\xdb\xfd\x7e\x18\x9c\x14\x42\x06\x3c\x75\xa6\x72\xfb\x6c\x77\x70\x4d\xbd\x3b\x6f\x79\x74\x17\xa0\x96\xc1\xe5\x7c\x59\xf7\x8f\x0e\x06\xdd\xca\x77\xc8\xf6\xe5\x5c\xac\x52\x08\x93\x60\x2d\x99\x67\x91\xee\x01\xf3\xce\xec\x9f\xe3\x39\x27\x42\x9a\xc4\x74\x8c\x6c\xfb\x4a\xe8\x21\x1f\x1b\x11\x8a\xc4\x78\xf8\xb6\x2a\x4f\x43\x8d\x21\x22\x94\xb0\x21\xc6\xa7\xc5\xe3\xd7\x95\xf5\x3e\x68\x77\x4c\x46\xd8\x3f\x36\xba\x8d\xdd\xb0\x1c\x56\x77\x08\xad\xc0\x07\xce\xaf\xb9\x37\x89\x80\x54\x23\xa6\xed\x58\xea\xcc\x5c\x0e\x6e\x42\x86\xfd\xaa\x3f\x7e\x07\xc3\x74\x68\xdd\x50\x54\x8f\x18\x87\x26\x85\xd1\x82\x07\x3d\xc5\xa3\xb2\xba\xff\x1f\xc2\x05\x65\x20\x63\x4c\x22\x78\xf6\xf1\x9b\x4c\x87\xf3\x4e\xb2\x0c\x99\x21\xee\x35\x90\x76\xa3\x39\x68\x87\x6f\x9e\xb4\x93\x94\xa3\xb6\xd7\xf9\x28\xfc\x27\x95\x11\xe1\xca\xa1\x8c\xb7\xe5\xcf\xc6\xcc\xe3\xc9\x65\xa4\x35\xa2\x62\x7e\x7e\x5d\x0e\x07\xb3\x24\x69\x04\xa2\x63\x47\xce\x2f\x58\x95\xe3\x0f\xb2\x20\x64\xde\x82\x42\xfe\x39\xe7\x83\x8c\x2f\xcd\x48\xe0\xa1\x22\xdf\x0b\x2c\xd7\x47\x05\x91\x6c\x1a\xd0\x94\x8c\xda\x89\x33\x8c\xf1\x95\xe7\xe6\x16\x54\x76\x1c\x68\x8d\xfc\x6d\x72\x96\xa4\x08\x6e\x6c\x17\x33\x7a\x5f\xaa\xd7\x11\x39\x1d\x91\x31\x95\x81\x83\xd3\x3f\x9e\x8f\x0e\x89\xe2\x78\xda\xe6\xb3\xe5\x32\x36\xb6\xbe\x19\x8b\x59\x51\x33\x1e\x63\xd2\x67\x91\xff\x84\x6c\x92\x7a\x1a\x9f\x99\x08\x86\x9f\x40\xf7\xac\x58\xa3\xf4\x85\x4c\x64\x64\x79\xf3\x31\x85\x0e\xe7\x63\x6e\xdd\xa0\x47\x68\x86\x33\x42\xa6\x31\xa1\xd7\x14\x5d\xa8\xf8\xec\x2f\x95\x42\x84\x75\x1b\x0e\x17\xa5\x27\x10\x1d\xc9\x03\xc9\x1c\x73\x99\x7d\x86\xb9\x10\xbd\x6f\x4b\x08\x66\x56\x0f\xed\x5a\x57\xee\x26\x5f\x50\x84\x21\xb2\xab\x65\xaa\xb4\x57\x1a\x8f\x7d\x29\xa4\x30\xd6\xb8\x2a\x15\xd4\xf5\xae\x81\x3c\x17\xd5\x68\x22\x4b\xa1\x03\x69\x99\x63\x6b\xf5\x32\x00\x96\x48\x19\x81\x74\x10\x58\xab\x33\x30\x5d\xb5\xe6\x27\x85\x0a\x29\x56\xc7\xe4\xa2\x6e\xfe\xc8\xd4\x6b\x69\x4c\x3b\x67\x6f\xce\x78\x8d\xae\x91\xf2\x0c\xf4\x7f\x2f\x65\x6f\x3f\xf5\x1f\x4c\x85\x1a\x3f\xd8\xe6\x71\xbf\xd9\xfe\x95\x84\x02\x91\x8a\x24\x18\x72\xdc\xad\xf7\x93\x3e\x52\x09\xe1\x9e\x07\xf0\x80\x3a\xbe\xdd\x43\x24\x3a\x8e\x3a\xe2\x85\xd6\x15\xfb\x89\xd8\xd4\xe6\x5c\x75\x9d\xa0\x09\x43\x8c\x1b\xd6\xb2\xf4\x79\xef\x8f\xba\x62\x7c\x6b\x9d\x30\xac\x05\x39\x1c\x3c\x9c\x7b\x6e\x76\xe9\x54\x6a\xe9\x28\x6f\x31\x10\x68\x69\x9e\x84\x2f\x86\xed\x7a\x16\x64\x68\x52\x9f\x40\xfe\x26\x72\x73\x9f\x99\xee\x65\x8c\x26\xda\x25\xf7\x30\x12\x07\xa2\x5a\xe0\x67\xfe\x34\xd8\xaa\x02\x9a\x62\x8c\x7c\xbf\x1e\x2d\x2f\x2a\x88\xad\x4c\x1c\xa6\xd5\xac\x24\xc2\xb8\x5f\x55\xc8\x29\xc6\xba\x9c\xe8\x93\x2a\xff\xff\x95\x25\xa9\x50\x12\x44\xc0\x3e\x94\xe5\x5f\x7e\x66\x15\xd1\x00\x59\xe6\x56\xa2\xbe\x3c\x64\x85\x45\x22\x8c\x26\xb2\x8a\xd2\x28\x35\x8e\xef\x4a\xe4\xce\xbd\xec\xc4\x8c\xba\x56\x90\x22\x7b\xe0\x9d\x50\x20\xcb\xf2\x75\x10\xbe\x56\x84\x86\x38\xf4\x24\x5c\xcb\xf4\xfd\x96\x0f\xa5\x48\x12\x21\x99\x84\x8d\x02\xdf\x8a\x4b\x7d\xd7\xee\xc8\xbd\xc4\x30\x51\x44\xb0\xc4\xd2\x72\x29\x91\xab\xbb\x5c\x3c\xd7\xdd\x21\xa5\xb0\x47\x9e\xa0\x3e\x1f\xa1\xa3\xee\xe9\x69\x7b\x88\x22\x06\xd0\x5a\x7a\x11\xf5\x7a\xb9\x41\x16\x38\x3f\xa1\x15\x15\x60\x3d\xff\xaa\x7c\x47\x82\xc0\xbc\x9c\xc8\x79\x11\xc5\x28\xc7\xa0\xdf\x3d\x1c\xa7\x74\x60\x44\xc5\xd4\xd6\x9d\x9e\x00\x5e\x2d\xe8\xd6\x1f\x88\xad\xda\xe2\xbf\x56\xab\xd1\x60\x49\xc2\x34\x56\xbe\xd8\xc6\xf2\xf8\xe0\xa8\xe8\xfd\x70\x95\xa4\x16\xfc\x60\x5d\xac\x03\x16\x57\x1c\x86\x39\x5b\x95\x92\x34\xed\x95\xc6\x1f\xa0\x11\x7a\x90\xe1\x1a\x0f\x83\x94\xb2\xc8\xa5\x1b\xd1\xd1\x5b\x18\x93\xe5\xd9\x90\x89\x62\x3c\xc6\xd2\x58\x61\xdc\xf8\xfb\x5b\xb9\xec\xd8\x0c\x88\xe2\x29\x45\x3b\xe5\x54\xb5\xe3\xb7\x3d\x02\x7a\xd3\x81\x63\x94\x08\x2d\xa1\xee\xd7\xcd\xfd\xed\x61\xbf\x39\x2c\x37\xf7\xf7\xab\xe5\xfe\x10\xee\x7e\x6e\x9e\x6e\xbb\x56\x90\xc8\x74\x9c\x83\xb7\x20\x49\xcc\x1e\x78\x67\x62\x26\x5e\x3a\xb5\x3c\x94\x30\x0c\x7d\xdc\xae\xea\x6e\x07\xcd\x63\x69\x99\x82\xdb\xd5\xe0\xb1\x6c\x86\x9e\x8b\x92\x51\x8c\x35\x0a\xa7\x0a\x54\x56\x83\xdb\x8e\xf7\xa5\xfb\xc7\xe4\x93\x4b\x4a\x02\x57\x72\x5c\xe6\xba\xb9\xf6\x1d\x94\x8a\x0c\xca\x0e\x9d\x0b\x8b\x94\xf3\xf8\xb1\x49\x2b\x02\x18\xdf\xad\x2f\xf5\xb0\xa4\x40\x41\x60\xf9\x8f\xbe\xef\x16\xc3\xc9\x04\x89\xa3\x61\xed\x43\xb2\x03\x91\x56\xa2\x80\xdb\x2a\x58\x8c\xfd\x19\xb8\x42\xd5\x2b\x10\x21\xeb\x10\x3f\x6d\x37\x60\x1f\x0c\x84\x9b\x7c\x3b\x00\x1c\x84\x99\xea\x75\xb3\x88\x32\x54\x47\x16\x6a\xa8\xe1\x57\xfd\x52\xbe\x4f\xde\xc6\xb0\x50\xaa\x0e\x02\xb2\xeb\x63\x6c\xca\x68\xab\xa7\x5c\x43\xf3\x50\x16\xcd\x4b\x7e\x99\x59\xbc\x75\x60\x22\xc4\x28\xec\xf6\x2b\x0f\x11\xd4\x21\x8d\x44\x32\xa8\xe1\xe9\x62\x99\x61\x3c\xcd\xf1\x9e\xfb\x62\xb7\xfe\x9a\x04\x52\x0c\x63\x08\x59\x56\x4d\xbf\x64\x68\x02\x3a\xb6\x2c\x3f\x37\x65\xb3\x18\x5b\x3a\xbe\x54\x4e\x13\x00\x74\x57\x4f\x98\x78\xf3\x90\xbc\x01\xbe\x46\xd3\x90\xb8\xf0\xf7\xb1\x7c\xc3\x0e\x9f\x35\xb6\x34\xe3\x01\x76\x4d\x5d\x9a\xe6\x7b\x61\xe9\xb7\xc6\x86\xad\x8e\xb9\x0c\x92\x2e\xed\xbf\xbb\xe6\x93\x9e\x77\xf6\x74\x6c\x34\xe3\x13\x72\x96\x99\xd2\x13\x9d\x04\x49\xe0\xc8\xc6\x7e\x94\x4d\x6b\x9d\x8a\x4a\x1c\xaf\x45\xb0\xfe\x7f\xfe\xf5\x77\x21\x31\xd8\x18\x21\x92\xd9\x88\x0f\xf9\xc5\x66\x76\x24\x9d\x90\x04\xe3\xbf\x6f\xf8\x7c\x87\xac\xfd\xd6\xfe\x10\x35\x88\xa6\x47\xce\x8a\x6f\x98\xb2\xa8\xbb\x63\x3c\x41\xb7\xfb\x2b\x34\x5f\xcb\x52\xd7\xdd\x18\xe9\xfa\x36\x01\x8d\xdd\x7f\xe8\x98\x5e\xb7\xe2\xdc\x2f\xf3\x3a\x25\xa9\x8c\x7d\x5c\xa2\x51\x2f\x8b\x77\x71\xd9\x5a\xae\xe3\xc9\x18\xe5\x09\xc4\xac\x23\x1b\xf8\x13\x7c\xf9\xa5\x5f\x78\x34\xe7\x2a\xea\x52\x36\xfb\x72\xd5\xbc\x0c\xa2\xf3\x9a\x6b\x5b\xd5\x38\x16\x34\xbd\x56\xbb\x74\xcd\x45\xa0\xd0\xfe\x43\x44\x28\xb4\x1b\x9f\x35\xcc\xeb\x01\xd1\x20\xd1\x82\xa6\x38\x02\x16\xcb\x7d\xf7\x93\xe6\x98\x7c\x2d\x2b\xa1\xf2\xec\xcf\x09\x1b\x28\xd1\x32\xd4\x88\x21\xb9\xad\x40\x3f\x57\xbb\x77\x4f\xc3\x4c\xb4\x64\x46\x4b\x4f\x6c\x8e\xa8\xb2\xfd\x62\xb3\x83\xc6\x02\xfb\xdb\xe5\xd1\xee\x45\xe3\xc1\x2b\x63\x69\x85\xab\xbf\x3f\x0c\x77\x33\x2d\x45\x8a\xb6\xe9\xb7\xb2\xca\xfe\x2c\x8b\xc0\x2f\x55\x5a\x51\x85\x62\x2a\x5f\x2b\x00\x4f\x5e\x44\xb4\x0e\x39\x32\xfe\xd7\x4d\xa5\x84\x27\x5b\x1d\xc2\x6c\xc6\xe3\x45\xa7\xa9\x25\x32\x79\x07\xf1\x8a\x6a\x81\x57\x35\x49\x93\x0e\x85\x98\x20\x1a\x3a\xab\x1f\x44\xdd\x40\x35\x87\xc6\x83\x40\x26\x68\xf5\xdc\x8b\x42\x2f\x3b\x6c\xb4\x50\xcd\xee\xba\xa9\xa2\xb1\x46\xb5\xdd\xf2\xd2\xee\x9a\x57\x16\xd7\x79\x80\x2a\x72\xe7\x84\x2c\xb0\xf4\xfd\x5a\x7b\x4c\x9d\x4b\xdf\xed\x45\x75\x2d\x16\xe6\xcf\x12\x21\x82\x48\x74\xe9\x39\x20\x27\xc7\x41\x68\xee\x0a\x3d\x45\x71\x19\x3b\x2f\x10\x85\xcc\xb8\x8a\xd5\xc7\x52\xc3\x75\x46\x08\x08\x8f\x62\xe5\xcf\xaf\xe0\xf1\x7c\xec\x4e\xa6\x3a\x05\xe3\x11\xa9\xad\xf9\x7d\xf0\x0e\x1b\xda\xd5\xfd\x1a\x03\x14\x62\x1f\xc8\x3a\x9c\xba\xdc\xaf\xbf\x0e\x63\xa1\x31\x57\x44\x57\xeb\x06\x8e\x5f\x26\x50\xaa\x59\x17\x00\xe2\x34\xc4\x41\x0d\x2e\x0a\xd3\x41\xfc\xc6\x6f\x12\xa7\x49\x14\x74\xf4\x65\x03\x92\x73\xff\x1c\x49\x18\xa7\xce\x59\x9e\x8b\x5d\x8d\x87\x0c\x24\x5a\x60\x7e\xe8\x11\xde\x3d\xf3\xf5\xac\x6d\x3d\xf3\xa5\xd3\x58\x20\x2f\x88\xea\xe9\x56\xea\x01\xbd\x31\x81\x54\xd9\xb0\xfe\xcf\xac\xf0\x53\x06\x38\x4b\x30\x18\x84\xc2\x00\xab\xa7\xdd\x01\x39\x47\x76\x13\x04\x12\x70\xad\xd0\xc0\x10\x8d\xe7\x9b\xb9\x9c\x26\x1b\x2a\x88\x80\xa2\xd0\xe5\x02\x6d\xde\xfb\xb2\x0f\xad\x81\x34\xb1\xf4\x91\xb9\x41\xd1\xfa\xf0\x63\x2a\xa9\xb5\xf3\x2b\xf7\xa2\x78\x9d\xb9\xbe\x66\x21\xed\x75\x53\xbf\x74\xbf\xa6\x68\xf2\xdf\x97\xcf\x8f\xf0\x3e\x55\xc3\x9c\x65\xde\x01\xe0\x21\x66\x13\xb6\xa2\xae\x6f\x85\x5f\xf5\x01\x5a\x43\xcb\xc6\x8f\x3c\xf7\x81\xde\x9d\xaa\x6c\x50\xa4\xea\x5a\x1a\x06\x41\x2f\x45\xc5\xfc\x05\x4c\x9c\xe0\x0a\x31\x32\x8f\xc1\xc8\x90\x98\xf1\xcb\xdf\x9e\xbd\x9c\x68\x57\x48\xec\x78\xca\x89\x09\x92\x08\x17\x8d\xe2\x7c\x5c\x9c\xbc\x30\x0e\x31\x61\xa8\x2c\x85\x7c\x7d\x3c\xa8\x1c\x44\x31\xbf\xe6\x98\x88\x5a\x76\xed\xac\xfe\x6e\x83\x18\x38\x6e\x8d\xe8\xcc\x3d\x13\x31\x4b\xdc\x93\xd5\x8f\xa2\x75\x52\x4e\x1d\x40\xdf\x90\x34\x40\xbc\xfa\x6e\xbf\xd8\xaf\x0e\xdb\xfb\xc5\xbf\x3a\x5a\x46\x62\xa8\x60\x88\x58\xff\xdf\x19\xaa\xcb\x13\xd4\xe5\xb9\xea\x2f\x4a\x25\x89\x3d\xe3\xc0\x5d\x67\x43\x1a\xaa\x65\xd0\x91\x3f\xfd\x84\x6c\xa8\xc6\x4e\x4c\x4c\xa4\x24\x23\x23\xe4\x0e\x8b\x36\xae\x23\x85\x26\x66\x16\x49\xeb\x78\x2b\x90\x6e\x17\xcb\xd2\x1a\xa8\x44\x3e\x0f\x39\x34\x71\x42\x03\x37\xec\xfe\x38\x95\xa7\x76\xee\x4f\x69\xa3\x66\xe7\xbe\x89\xc1\x20\xc0\x6a\xf5\xfd\x6e\x94\x6c\x31\xb1\x09\xd0\xc1\x73\xd9\xa1\xc3\x6e\xbf\xf8\x63\x75\xd8\xff\xf4\x96\x9e\x49\x5c\x5a\xc3\x0a\x4b\xdd\x9e\xa7\xef\x91\x86\xa9\x8e\xbb\x0a\x9c\x71\x5e\xc5\xa4\x21\x78\xdc\xc8\xee\x2c\x6b\x55\x65\x27\x2b\x27\x3b\xde\xff\x4c\x0a\xd4\x71\xca\x59\x4a\x5d\xd8\x35\x70\x9a\xdc\x88\x47\x80\x98\xc1\xef\x58\x01\xb6\x2f\x6d\x06\x79\xb2\x9a\xdb\x79\x31\x29\x2d\x37\x9c\x59\x9d\xa9\xfd\xb7\xf5\xd3\xed\x61\xbf\x5e\x3d\x1d\x6e\xd7\xbb\xe5\xa0\x94\xce\x70\x25\x10\x16\xb0\x5c\x2e\x3f\xf3\xfa\x0d\x07\x5b\x9d\x55\x43\xb3\xae\x5d\xa8\x66\x30\xeb\x8d\x10\xdc\xb2\xee\xe0\xc6\xe4\xbe\xeb\x15\x1e\xc8\x37\x36\x3a\xec\x0a\xc2\xe6\xc8\xdd\x89\x91\x3c\xea\xb9\xe5\x6f\x4b\x75\xc6\xb7\x1d\x3d\x92\x22\x1c\x29\x3d\x6a\x61\x60\xa1\x35\xb5\x6a\x7c\x34\xf8\x9b\xfd\xe3\x5b\x25\x8e\x85\xa3\x5d\x8e\xda\x7d\xd2\x07\xa0\xf1\x83\xb1\xc9\x6d\x75\x10\x27\x81\xe3\xf1\x5e\x54\xcd\x7b\x59\xbd\x4e\x4d\x35\x03\x61\xca\xbd\xa6\xc0\x2a\x37\xe8\x63\xd6\xd9\x24\x36\x63\x20\x11\x68\x5d\x6d\xbf\x3f\x2d\xbf\x2d\x76\xab\xa7\xc3\xc3\xe2\x9f\x76\x51\x3e\x2c\x17\xdb\xc3\xed\xe2\x5f\x1e\x43\x6e\xc0\xe8\xa4\x57\xc1\x79\x10\xbf\x7c\x4d\xe0\xf8\xe1\x4c\x62\x43\xaf\x07\xa8\x5b\x83\x74\xff\x02\x8b\x8d\x1b\x07\x8e\x80\x60\xea\x46\xcc\xdb\x87\xc6\x08\x19\xea\x5e\x05\x4f\x95\x85\x65\xa8\xec\x83\x05\xc6\x80\xa5\x44\xac\xa1\x79\xc2\x28\x0e\x7a\x5e\x5b\xa8\x66\xf4\x87\x69\x10\x08\x4e\x5c\x71\x75\x79\xb6\xb6\xf0\xa4\x76\xb7\x1b\x2a\x34\x08\x39\xa7\xdc\xf3\x91\x94\x27\xf4\x25\x97\xa2\x81\x67\x27\x52\xe9\x75\x44\xaf\x87\x21\x0d\xa2\x84\x60\x0d\xa0\xed\xa9\xff\x9e\xc6\xa5\xe8\x34\x20\x51\x8a\xf1\xc4\x7f\x8b\xd3\x32\x2f\xcf\x6e\x81\xa2\x01\x11\x81\xaf\xfe\xdf\x83\x38\x0e\x96\x02\x1a\x50\x29\x8d\xb3\x3e\x56\x45\x53\x95\xa7\x8b\x3f\xc2\x12\x21\xe2\x01\x45\x98\xd5\x38\x18\xbf\x3a\x03\xcb\x5f\xb6\x7b\x58\xdf\xaf\xfc\x89\x31\x31\x14\x3c\xf8\x7b\xff\xcd\x54\xe5\x71\x6c\x4a\xd3\x20\x09\x4c\x4a\x3c\x36\xec\x5c\x15\xc2\xb2\x05\x3a\x1b\x65\x50\xf8\x48\x03\x1e\x8a\x28\x18\xab\x32\xf4\x8c\x89\xb7\x8e\xfb\x00\xf4\x15\xcf\x22\x0d\x04\x03\x7c\x0e\x55\xfb\x6b\x09\xde\x21\xb4\x1c\xca\x76\x2e\xc4\x40\x03\x01\x11\x6e\x03\x0f\xa2\xae\x91\x76\x65\x07\xc5\x54\x9c\x9a\x06\x32\xb2\xae\xb7\x67\x53\x9a\x9b\xee\x34\x90\x84\x62\x71\x70\xeb\x62\x3e\x6c\x96\xfe\x51\x54\xc2\x90\x97\x0e\x9a\x97\x8e\x0b\xc9\x1f\xe2\x89\x57\x9c\x5f\xe4\xb9\x67\x37\x5a\x9f\x0c\xa2\xc6\xc1\x25\x77\xa2\xc0\x37\x17\x06\xd7\xea\xba\x29\x2b\xf8\x06\xc2\x55\x1f\xdf\x01\x8c\x85\x17\xc6\x8f\xa5\x14\x4d\xa9\x4f\x61\xe2\xa6\x65\xb3\x7a\x3d\xdc\x9c\x06\xca\x24\x3e\x5f\xb9\x05\x54\x05\x76\xd1\xa4\x31\x60\xda\xb5\x6e\x1d\x0b\xc0\xe5\xbc\xd0\x7b\xf1\xab\xbd\xff\x5f\x00\x22\xfd\x89\x3c\x64\x76\xbc\x20\x46\x1a\x13\x72\x2e\x5d\x37\x3c\x21\x75\xcd\x21\x32\x98\xbd\x50\xc8\x74\xea\xaa\x88\x4d\x55\x8e\x50\xd3\x6e\xbd\xa2\x01\x88\xd8\xbb\x66\xe7\x1a\x2a\x77\x78\x32\x8c\x0d\xd1\xe8\x91\x18\x80\xad\xcd\x54\xf8\x2e\x30\x2c\x26\x96\xfd\xe1\x7b\x3b\x02\xde\xab\xac\x13\x4d\xa7\x81\xd1\xb6\x5a\xdd\x5d\xf4\xee\x5c\x68\x84\x2e\x0f\x02\x8f\x34\x0c\x98\xa5\xb2\x5a\xe8\x6f\xd9\xdb\x44\xee\xe8\x63\xe2\xec\xee\xd9\xc2\x20\xa1\x81\xd5\x94\x56\xb9\xa8\xe0\xbe\x7c\x83\xb9\xc5\x21\x0c\x84\x42\xb8\x42\xd5\xda\x26\x4b\x31\xde\x48\x69\x18\x06\x11\xe2\x90\x1c\x17\x51\x57\x2a\x3b\x17\x9d\x4f\xa7\x80\xd0\xf9\x5f\xfd\x95\xa9\xc6\x80\xcf\x52\x9c\x7c\xb7\x85\x91\x30\x48\xcf\xfb\x53\x34\x75\x59\xe8\xf2\xd9\x1f\x20\x84\x9a\xd8\xf5\x27\x52\xf1\xce\x06\x4c\x69\x48\xb4\xcd\xfb\xae\x8f\xc7\x5c\x5c\xe3\x0c\x68\x48\x13\xc0\x12\x5e\xef\x55\xdd\x95\xd5\xdc\xa8\x0c\x29\x4f\x12\xb7\xbe\x2d\xac\x6c\x11\xe8\x7d\xa9\x3d\xa6\xb9\x6d\xc0\x91\x85\xe9\x16\xe3\x4b\xc3\xb5\x31\x64\xa1\x54\xa4\xe7\x14\x2d\xeb\x46\x96\x17\xbf\x62\xcc\xa6\xd0\x43\xdf\xdd\xad\xd1\xd0\x55\x66\x55\xeb\xa2\xb9\xcb\x20\xd7\x61\x77\x65\x99\x9a\xb4\x23\xc4\x46\x6a\xe6\x7a\xb8\x82\x7d\x12\xa6\xa5\x21\x33\x04\xc3\x7b\xf2\x7c\xd9\x35\x67\x9d\x95\x63\xc6\xb9\xf1\x77\x8f\x13\x6b\x0b\xdb\xda\x5c\xcc\xa3\xcd\x60\x54\x68\x18\x73\x8e\x93\x70\x3f\x4a\xf3\xd2\x30\x8d\x25\xe6\x29\x76\x65\x2e\xaa\x5b\x51\x8e\x0f\x26\x1c\xfd\xdf\x13\x12\xf5\x62\xe0\x06\x53\x97\x23\x89\x6a\xdf\x56\x82\xaf\xaa\xc3\x40\xcc\x13\x08\xed\xe2\x45\x37\x97\x7d\x25\xd4\xeb\x04\xbb\x46\xc3\x14\x94\xd6\x83\x38\xe6\xb0\x68\x66\xf2\x9a\x3c\x0a\x68\xec\xa5\x8e\x94\xc3\x44\x55\x1f\x2a\x39\xb9\xb3\x44\x10\x62\xe0\xed\x34\x58\xd6\xac\x02\x9f\x6f\x40\x62\x2c\xc9\x74\x6a\xe7\x95\x6e\x37\xeb\x42\x41\x9e\xc3\x18\xa2\x4c\x43\xa1\x22\xdc\x5b\x6c\x49\xc9\xa1\xce\x3a\xd9\x4f\x1a\x0a\x10\x18\xfa\x3e\x9d\xe7\x8b\x84\x68\x28\x8c\xf0\x84\xaf\x3f\x45\x55\x65\x65\xd5\xd5\x34\x82\xb6\xd8\xbc\x49\xe7\xc8\x28\x44\x0c\xca\xfa\x8f\xfd\x5f\x7a\xd5\x34\x94\xd2\xa6\x71\x51\x1c\xa0\xca\x9a\x8b\x35\x07\xad\xdd\x7e\xbe\x22\x66\xa2\xa1\x0a\x19\xf4\xb6\x06\xba\xb9\x9f\x25\xf2\x68\xa8\x5d\x25\xaf\x85\x2a\x7e\xb9\x8a\x3c\xd1\x50\x2b\x2e\x6d\xb5\xa3\x06\x38\x4e\x24\xab\xc6\xdb\x53\x08\x91\x45\x17\xb4\x36\xc4\x13\x98\x1b\x1b\xcb\xf3\xfd\x09\xc4\x0a\xea\xfc\xe3\x2c\x8a\xe6\x7c\xdc\xf6\xb3\x19\x20\xc0\x55\x10\x83\x7f\xab\x42\x87\x81\x3f\x62\x62\x12\x0e\x59\x25\xa7\xb5\x8e\xe3\xd7\x89\x02\x12\xe2\xb2\xbb\xdc\x23\x0c\xfa\x8b\xff\x99\x0a\x27\x40\x94\x9d\x3c\x44\x8b\x46\x21\x4b\xd0\x3f\x70\x09\x77\x84\xb1\x60\xe1\x49\x0e\xeb\xe3\x29\x47\xd4\xda\x35\xa3\x0e\x8d\xc2\xc4\x42\x7b\xff\x11\x4d\x0e\x44\xd4\xe6\xd5\x4d\x66\x9a\x97\xd5\xaf\x06\x90\xf2\xb4\x7d\x27\x94\xc3\x5e\x75\x1a\x16\x34\x8a\x94\x21\xd4\x19\xed\xdb\xf2\x34\x3f\xbe\x22\x92\x5a\x96\x01\x95\x97\x75\x9f\x05\xa4\x11\x11\x01\xd6\x99\x7e\x2d\xe7\xeb\xfd\x3e\x9d\x3f\x11\xa5\xcc\x62\x8f\xcb\xac\x58\xd7\xf5\x19\xb4\x4d\xed\xf7\xb4\x24\x34\x8a\x03\xe5\xc3\xc4\x37\x16\x88\x39\x22\x78\x18\x5f\x30\x49\xac\x77\xf1\xb0\x7e\xdc\x8f\x68\x4f\x68\x94\x70\x8b\xb2\x75\xea\xbd\x63\xae\x8d\xd9\xd4\x2e\x8d\x12\xa0\x28\x82\xbb\xd8\xee\xbe\xcc\xee\xb5\x5d\xbb\xd4\x38\xfc\xb7\x45\x91\xaf\xeb\xad\xc8\x26\xcb\x51\x94\x06\x11\xa6\x3f\xa4\x4d\xe9\xd6\xf7\x03\x9e\x53\x1a\xf1\x20\x88\x3d\xc6\xbd\x7e\x1d\x06\x9b\x69\xc4\x23\x85\x29\x24\x9b\xe4\x59\xbc\x89\x2c\x6f\x5d\x0f\x07\x29\xee\x66\x7a\x6f\x35\x44\x5c\x58\x55\x74\x04\x28\xd7\x99\xba\x69\xcd\xdc\xa6\xde\x42\x45\x82\xbe\x4e\x98\x46\x5c\x53\x94\x00\x3e\x66\x8d\x79\xd7\xc3\xc5\x39\x12\x84\x58\x5e\x03\x5c\x3d\xf2\xcb\xa1\x86\x1c\x54\x73\xc8\x86\xda\x21\x7e\x53\x89\x04\x0f\xa4\xee\xcc\xec\xc3\xff\xce\xe5\x75\x7d\x88\x6f\x2a\x38\x6a\x64\xd6\x4d\x79\xda\x41\x73\x3e\x75\x77\x04\x20\xc9\xa0\xe2\x63\x5f\x16\xb5\x67\x9f\x70\x4d\x24\x0b\xb1\x26\xea\x61\xf1\xf8\x4f\x2b\x22\xef\x0f\x70\x41\x6d\x99\x5d\xd9\x7a\xf8\xe8\x17\x1d\x9c\x22\xae\xfb\xed\xcb\xe8\x6b\x48\x2d\x91\x15\xac\x81\xba\xf5\xb9\x5e\x36\x6f\x50\xe5\xa5\xd0\x83\x7b\x01\xa4\xae\x68\xe4\x6b\x5e\x4a\x91\xa3\x5f\x81\x4b\xde\x5c\xdd\x24\x8d\x54\x6a\xf0\xf9\xb3\x7a\x53\xec\x20\xcf\xa7\x87\x85\x26\x5d\xf8\xef\x24\x96\x65\x05\x73\x61\xe7\xb6\x21\xf0\x0e\x27\xf1\x55\x1c\xa1\x7d\xb6\x9b\x0b\x6a\x76\xfa\x26\xca\x49\x5a\xb6\xdd\x83\x55\x02\x0e\x14\xe3\xd2\x74\x93\x0b\x82\xc0\xba\x0c\x65\x37\x4e\x5b\xad\xe5\x8f\x19\x6d\x02\x4b\xe0\x01\x05\x72\x45\x7f\x30\xb7\x34\xe1\x49\xc7\xe6\x3c\x66\xe9\x6d\x0f\x5a\x35\xca\x47\x78\x47\x86\x85\x89\x03\x7b\xfd\xdf\x0f\x33\x52\x34\xd2\xa9\x56\x96\x0b\xfb\x99\x75\xdf\x57\x03\xc3\xed\xea\x66\xbd\xff\xb6\xb8\x5f\xdc\x8f\x86\xaa\x76\xd8\x41\x47\x68\xbb\x2c\x91\xc5\xb7\xe9\x46\x39\xa4\xdc\xba\x16\x7b\xef\x3f\x45\xc6\x21\xf8\xfe\x80\xea\xf9\xf7\x42\xcb\x34\x32\x9a\xb1\x2e\x63\xf5\x8a\x3c\x25\xed\xb8\x9a\x7c\x3e\x12\x86\x14\x29\x1b\x9e\xbd\xbd\x3e\x71\x17\x48\x48\x24\x36\x68\xca\x02\x7e\x35\x55\x4f\x47\x42\x49\xa8\x9d\x48\x76\x23\x9e\x81\xf4\x14\x15\x94\x44\x51\x10\x89\x61\x95\xf1\x88\x1d\x85\x12\x46\x0c\xd2\x81\xc0\x2f\x2c\xdf\xee\x7e\x4e\x12\x43\x5c\x5e\xc5\x16\xd9\x5c\xe5\x31\x28\x61\x9c\xe2\x5d\xdf\xb0\xea\xa3\x37\xee\xe7\x8d\xf9\x39\xd8\x14\x25\x4c\x24\xe8\xa7\xf4\xd5\x79\xdd\xe8\x20\x4c\x0a\xf4\x48\xb3\x06\x8e\xf5\x5d\x59\xb5\xef\x85\x54\xef\xf3\xbb\x0d\x61\x5a\xe2\x2e\xb9\xdc\xde\xf9\x4b\xc4\xad\x85\x39\x90\xf8\x1e\xb0\xa9\xe3\x6e\x31\x35\x2e\x46\xd7\x8b\x13\x4b\xdb\x68\xa1\x19\x4f\x20\x72\xdc\x94\xad\xf5\x38\x2c\xbd\x0c\xa3\x74\x98\xd2\x76\xe2\x76\x83\xf8\x0b\x89\x95\xd5\x9a\xb0\xdb\xc8\x8f\x2c\xcf\x45\x56\x4c\x69\x33\xe6\xdf\x2a\x06\x26\x1c\xc2\xc9\x2e\x22\x17\x34\x48\xc7\xdd\x98\x04\x22\xd5\x68\x9a\x40\x75\x79\xb8\x58\x82\x9e\xf1\xd7\x4a\x78\x9a\xba\x75\xc4\x71\x1e\x55\xd3\x16\x92\x60\x36\xe0\x45\xd4\xdf\x0b\x87\x9d\x03\xdd\xe7\xe9\x26\xad\xc1\x7a\x88\xef\x53\x4e\xe5\xc1\x6b\x27\x26\xe0\xe9\xb8\x7c\xe1\x5a\x9a\x95\x92\x94\xf5\xb8\x16\x54\xbc\xfb\x72\x3d\xe7\x7d\x53\x11\x53\x18\x93\x39\x20\x74\xb2\xaa\x27\x3d\x92\x2a\x86\x29\x91\x17\x81\x2e\x0e\x74\x00\x12\x4a\x78\x64\xe3\xaf\x75\x76\xc4\x0d\x63\x23\xf3\xec\x79\x90\x2a\xf5\xcd\x84\x09\x5d\xd8\x66\xad\x41\xdc\x42\x17\x53\x9e\x3c\x3e\x57\x31\x2a\xa6\x17\x65\x71\x77\x2e\x9e\x33\x99\xc3\xcd\x58\x2b\xcb\x8f\x12\x7f\x02\x84\x58\xa3\x28\xcf\x97\x7d\x05\xf0\x49\x21\x38\x25\xdc\xd8\xf7\xd8\x67\x47\xf8\xcd\x15\x87\x08\x62\x11\x7e\x0e\x93\x24\x7c\xc2\x87\x12\x91\xc6\x68\xf0\x6b\x99\xef\x5e\xc4\x5d\x9e\x9d\x46\xaf\x2c\xb8\xf2\xbc\xa8\x0b\x2b\xa5\x3d\x53\x05\x4d\x89\xd0\x21\x46\x20\x1e\xd6\x8f\x58\xc8\xb7\xf9\xee\xed\x25\x22\xa9\xc1\x18\x16\x58\x20\xc4\xfe\xbd\xec\x8e\x08\x86\xbc\x65\x28\x85\x76\x25\x65\x31\x79\x6b\x08\xac\x14\xa9\xbd\x7d\xbd\xfa\xdf\x59\x8c\x6a\x62\x29\x81\x30\x90\x74\x98\xb0\x83\xfd\x07\xe6\x1d\x01\x6a\xa1\xed\xed\x9e\x7d\x27\xb2\xfc\x7b\xd1\x54\xe7\xa1\x2c\x0e\x0a\x7d\xf8\xc6\x9c\x23\x4d\x87\xa9\x00\xe6\x29\xf8\xdb\x36\xca\x42\x03\xca\xa2\x11\x59\x51\x5f\xf3\x96\x51\x62\x52\x6b\xc9\x7b\x9a\xb6\x0d\xca\x18\x3c\xbf\xcc\xe6\x8c\x29\x0d\x02\x85\x56\x5e\xd5\x36\x09\xf9\x78\x84\xd1\x20\x8d\x2c\x9f\x22\xea\xe9\x0e\xe4\xb4\x29\x0d\x38\xc3\x15\x6e\xf7\x6d\x3d\x84\xfd\x53\x1a\x12\x8d\x34\xf2\x1d\xf3\x5c\x9e\xdf\x95\xd5\x24\xf2\x38\x91\xe2\xa5\x94\xd2\x04\x83\xbd\x67\x1b\x27\x19\x5d\x91\x29\x69\x88\xab\x84\x6b\x6a\x57\xd1\xdb\x2d\xd7\x94\x01\xc1\xfa\xb5\x43\x56\xa3\xf4\xff\x0f\xcc\x57\x8c\x5f\x24\x96\x31\x12\x7f\x5b\x88\xfc\x43\x56\x20\xb0\x3d\xf2\x97\x88\x75\x8c\x99\xf3\xdd\x4b\xd6\x8c\x6e\x9d\x90\x18\x62\x5f\x1c\x5f\x35\xfd\x4d\x13\x4a\x74\xdc\x91\x82\x57\x8b\x49\x80\x81\x26\x42\x23\x3c\xab\x80\x77\x54\xfe\x1d\x2d\x12\x34\x91\x29\x8e\xd6\xec\xd4\x7a\xed\xe3\x13\x95\x75\x51\xec\xe2\xef\x49\x42\x9f\xe0\x74\x1e\xfb\x54\xc3\x20\x21\x4d\x8c\x90\x41\x1f\x53\xec\xd5\x3e\xfd\xe3\xa6\x2a\xc6\xed\x6e\x7d\xb3\x5c\xf8\xdf\x44\x10\x21\x1e\xfd\x54\x95\x0d\x28\x7c\x0d\xa1\x1a\x98\x29\xee\xa7\x54\x88\x08\xab\x52\xef\x37\x5f\x0f\x37\xd0\xdc\x97\xf5\x87\x14\xd5\xee\x0c\x19\x4a\xd4\xa2\x28\x8b\xfc\xf2\x4d\x54\x6f\xd3\x8a\x7b\x4a\x25\x8f\xb1\x5e\x71\xbd\xdc\x1c\x6e\x36\x8f\xdf\x77\xd1\x61\x77\xff\xf5\xf1\x70\xbf\xda\xed\xfc\x33\x4a\xb0\xa0\xf6\x5e\xa6\xa5\x2a\xbe\x37\x59\x9e\x35\x97\xf9\x49\x47\x15\x8d\x11\x8b\xaf\x44\xae\x06\x46\xe6\xa0\x81\x96\xda\xfb\xda\x87\xa6\x3c\x94\x1f\x0a\x6b\x74\x9f\x4b\x19\x10\xd6\x5b\xc8\x9e\x6d\xb8\xde\xdb\x6a\x54\xc7\x8c\x0e\x25\x7a\xb7\x15\xce\xba\x91\xaf\x3f\xbe\xbf\x4e\x95\x88\x06\xa6\xc1\x7d\xf9\xfc\x99\xb7\x46\x35\x4f\x30\xf5\xd5\x5a\x23\x57\xc3\xcc\x84\xa1\xe5\xc8\x6f\x47\x67\x56\x3c\x0f\xeb\x97\x28\x35\xd4\x42\x59\xb0\xe0\xb1\x81\x6d\x2e\x8a\x7a\x63\x7e\x40\xa1\xaf\x85\x66\x46\xf5\x99\xfe\x7c\x57\xd9\x73\xaa\xca\x53\x59\x8b\xfc\x47\x39\xcd\xaa\x53\x16\x52\x82\xc1\xe4\x55\xf3\x72\x7f\xf1\x28\x26\xca\xc2\x44\x5b\x30\xd6\x60\xa9\xbb\xb9\xf4\x9a\x0a\x9f\x7a\xda\x2c\x14\x21\x7a\xb2\x3e\xd4\x6c\x19\x32\xea\xee\xe2\x4a\xa2\xd2\xf7\xbf\x87\xb8\x58\xca\x42\x23\x71\x3b\xc7\xd2\x39\x51\xc3\x7d\x29\x8a\x4d\x71\x03\x2f\x22\x37\x03\xf6\xf5\x0f\xf2\x66\xee\x22\x51\x4c\x69\xef\x78\x3f\xc2\xfb\xed\xa5\x10\xc7\x4c\xb9\xe4\xdb\x62\x1c\x51\x1f\x6f\x50\x2c\x92\x89\xa6\x9e\x0d\x14\x0b\x2a\xf5\x9c\x49\xcd\x48\x60\x75\x89\xfc\xb0\xee\xfa\x65\x51\x8c\xbc\x5a\x46\x02\x8e\xd1\x7f\x79\xbe\x3c\x3c\x2e\x47\x3b\x11\x23\x34\x42\x03\xed\xdf\x22\xfb\xb7\xc8\x7a\x10\x28\x65\xc4\x50\xe8\xe5\xe2\x3c\xb1\xf9\x5f\x46\x3b\x7e\x2b\x0a\xc2\x68\x4c\x11\xa2\xd3\xba\x2d\x50\x34\xbe\x28\x7c\x6e\xc3\x66\xd4\xc8\xc4\x81\x44\xc3\x41\xaa\x85\xb1\x24\x62\xce\xb6\x5c\x3c\x43\xd1\xac\xf5\xcd\xc5\x17\xe3\xde\xc0\x64\x90\x33\xc6\x39\xde\x71\xf5\x78\x7b\xb8\x5d\xec\x57\xdd\x55\x20\x94\x3e\xac\x6c\x6f\x0b\xf5\xfe\x45\x34\x4b\xe1\xe8\xee\x06\x95\xc6\x7e\xa3\x61\x71\x62\x33\xc9\x3d\x4b\xcd\xdc\x2a\xc1\x62\x2e\x90\x80\xfe\x11\x50\xcb\xc6\xff\xaa\x53\xdd\x6b\xa6\xef\x4e\xa0\x32\x27\x48\xb9\x2c\x0b\x2b\x50\x39\xd9\x60\x59\x42\x52\xc2\x06\xdb\x21\x06\x8d\xaf\xa2\x71\xf3\x5d\x9d\x10\x8b\xa3\xae\xa1\x79\x3a\xff\xb5\x10\x89\x3b\x2b\xa5\x91\x31\x5d\xe0\xf1\x1e\xde\x16\x85\xbe\x6b\xad\x3d\x0c\x9c\x57\xf5\x34\x69\xc4\x78\x14\x6a\x57\xb6\x82\x38\x9c\x8e\x96\xd0\x1d\x17\x21\x23\xc2\x1b\xa4\x93\x7e\x12\x2c\xe5\xbd\xba\xdb\xae\xcc\x33\x8d\x4a\x88\xf3\x89\x0e\x26\x20\x30\xb1\x57\xff\x69\x2d\xb2\x59\x48\x00\x65\x32\x32\x81\xa3\xb4\x71\x88\x98\xc5\x71\x3a\x2c\x14\x0b\x30\x14\x70\x2a\xb3\xa2\x79\x2a\x4b\x84\xad\x7d\x99\x9d\x97\x8a\x89\x20\xf2\x86\x3e\x9c\xf6\xef\xe5\xb0\x40\x6a\x7a\x59\xcd\x6c\xd5\x72\x9e\xbd\x41\x75\xf1\x5c\x46\x9f\x77\xba\x8e\x00\xad\x9e\xac\xd3\x5d\x59\xe8\xb7\xd6\x52\xa9\xdb\xfe\x34\x53\x89\x7e\xca\x34\xb3\x4a\x95\x96\x59\xf5\x05\x5c\xe1\xde\xb0\x58\x88\x32\x9d\x4a\x66\xe3\x5d\xc5\x52\x9c\x5a\x1b\xd2\x1f\x81\x98\xa0\xa9\xbd\x7d\x5a\x1d\xba\x0d\x14\x8d\x62\x4f\x57\x47\x19\x24\x8e\x32\x1f\x4e\x79\x39\x8f\xcf\xa0\xcc\xc4\x29\xb1\x6a\xed\xcd\xb9\x2a\x6c\xe6\xd7\xc7\x8b\x6c\x93\x38\xa0\x80\x2c\xd9\x75\x53\x9e\x86\x42\xa8\x34\x0e\x18\xf3\xf2\x09\xed\xfa\x33\xd5\x53\xf9\x08\x16\x10\x07\x71\x9a\x74\x15\x0c\x28\x55\x15\x1d\x48\x77\x51\xb0\xbc\x79\xed\x06\xfd\x33\xc3\x80\x70\x25\xbe\x8a\x0f\xa5\xe3\xdd\x69\x61\xa0\x5c\x0c\xbd\xb9\x02\x94\x7d\x70\x46\x04\xd6\xb8\xb0\x44\xb5\x1f\x60\xfc\x06\xd5\xa2\xb4\x75\xeb\x31\xa0\x27\xcf\x55\xb1\x5e\x6e\xdc\xe2\xee\x0f\x72\x89\x56\x24\x58\xf6\x3a\xc4\x7f\xf8\x63\x51\x18\x1b\xeb\xb5\x16\x45\x56\x3c\xef\x50\x14\xc7\x1f\x8b\x14\x82\x27\x8f\xe7\xbc\xc9\x5a\xdb\x74\x8b\x05\x12\x1f\x92\xbe\xd0\x38\x4a\x13\x9c\x1e\x47\x87\x47\x19\x41\x39\x69\x4c\x44\x04\x56\x84\x4a\xd4\x25\x42\x89\x6e\x33\x63\xd6\xc5\xcd\x69\xb2\x3a\xc5\x94\x50\xb4\x10\xf6\xef\x25\x92\x7c\xa3\xdd\xf2\x17\xc0\x92\xdf\x2d\x38\xfa\x7c\x99\x8a\x29\x63\x18\xcb\xb5\xfc\x16\x63\xae\x23\x1a\x33\x42\x90\x02\x47\xa2\x48\x83\x7f\x31\x96\x58\x0e\xea\x1a\x9a\x6f\x99\xd6\x50\x2c\xcf\xad\x65\xf9\x65\x4c\xf8\x41\x63\xc6\xe3\x8e\x8c\x07\x23\xdc\x2e\x40\x3d\x7e\x79\xc6\xb5\x75\x61\xb6\xeb\xc7\xbb\x3e\xaa\x15\xc7\x84\xa3\xb1\xfb\x77\xa1\x5e\xeb\x6b\xaa\x05\x1a\xc7\x71\x6a\x91\x29\x65\x81\xc1\xc9\xae\xd0\x89\xc6\x49\x94\x60\x18\x7a\x8d\x30\x9b\x9e\x44\x84\xc6\x09\x05\x04\x98\x7f\x13\xea\xd5\xa2\xbb\xfa\x7d\x3e\x4e\x18\x41\xd8\xc7\xea\x0d\x49\x37\xac\xe0\xbc\xb3\xc3\x07\x56\xe1\x87\x0a\x97\x1f\xf4\x71\xd2\xfa\xb3\x6e\x2b\x38\x9e\x06\x11\xf7\x38\x31\x0c\x55\x3d\xb2\x42\x3b\x94\xc3\x88\x9b\x9c\xc6\xa9\x4b\x26\x38\xa5\x40\xac\x19\xbc\x3b\x23\xa1\xd1\x60\x22\x73\x11\xfa\xd2\xf0\xbb\xcc\x34\x2f\x2e\xb6\x3b\x21\x42\x6f\xdb\x09\xec\xb1\x83\xce\xde\xb2\xdd\x29\x1f\xc4\xd2\x3e\xdd\x02\x63\x19\x25\x7e\x23\x68\x17\xe2\xe9\x46\x11\x4b\x9a\x22\x17\xc7\x51\xbc\xc2\x2e\x3b\x9e\x72\xa7\xe4\x78\x75\xf9\xd9\xe0\x7e\xac\x22\x89\x1c\x5e\xa7\x41\xfe\x63\x3c\xf1\xbb\xa6\x3a\x48\x11\x29\xeb\x69\x19\x27\x73\x4e\xab\xc0\x11\xc0\x60\x91\x3a\xe6\xb9\xe7\x3d\x80\x58\xab\x24\x1c\xa8\x0e\x78\x40\xcc\x07\xe8\xc6\xe1\xba\xa9\x75\x8a\x40\xa2\x93\xf5\x32\x46\xd6\x7e\x0c\x21\x67\x3d\x2c\x0f\x53\x0a\xa3\xac\xb0\x6f\x46\x23\x74\x97\x6d\xb5\xf7\x18\xea\x33\xbc\x17\x88\x28\x1d\x28\x7d\x2c\xd4\x70\xf8\x80\xb1\x3a\x70\x59\xa1\x33\xe4\xa7\x2c\xf4\xae\x6c\x8d\xa1\x61\x3e\x39\x09\x62\x2e\x8d\x2b\x8d\x43\xf3\x76\x02\x26\xa5\x49\x20\x43\x2f\x19\xe1\x70\xf6\xa3\xae\x4a\x02\x63\xf1\x2c\x35\x34\x0f\xe2\xd7\xee\xea\x78\x98\x10\x74\xe6\xa0\x1f\xc6\x5d\x29\x45\x7b\xb4\x4b\xc2\xdb\x10\x66\x6b\xa9\x8d\x0d\xf2\xbf\x4d\xae\x97\x72\x4c\x44\x69\x68\xa0\x3a\x66\x05\x38\xb1\xf4\xa1\xe1\x9d\x84\x9a\x21\x27\xc9\x0f\x68\xee\xb3\x66\xbe\xe8\xa6\x6d\xa5\x91\x33\xec\x0e\xe5\x63\xdd\xc7\x1d\xef\xac\x49\x14\x51\xac\x7d\x40\xa0\xc2\xbf\xbb\x5a\x59\x9a\x10\x6a\x09\x08\x50\x74\xc7\x2a\xfe\x8f\x3f\x63\x42\xd2\x10\xf5\xa9\x2c\xa4\x2e\x2f\xeb\x49\x01\x07\x4d\x88\xa4\xe0\xde\x7e\x80\x21\x73\xcc\x5e\x76\x3d\x9c\x83\xb3\xd3\x84\xa8\x24\xf0\xca\x10\x87\xb2\xf0\x5a\x72\x77\x22\xaf\x61\xf5\xbf\xfb\x0e\xde\x92\xd0\x90\x45\x6c\xe6\x0e\x78\xe9\x71\x24\x3a\xa1\xa1\x49\xdd\x44\x7e\x80\xe3\x0d\xd4\x56\xe2\xf7\xdc\x03\x8c\x12\xaa\x29\xca\x04\x76\x74\x73\x37\xe2\xf9\x73\x0b\x39\xa1\x46\x6a\x0b\x9c\xbe\x15\x97\xfd\x4b\x56\x35\x17\xb4\xa5\xfa\x11\xc6\x02\x86\x3b\x1c\xc6\x24\x31\x60\xd6\xda\xb6\x3d\x65\x37\x4d\x98\x8a\x22\xac\xa0\xc9\x0a\x8d\x98\x07\x8c\x14\x8e\x39\x95\x47\x37\x8d\xa5\x4e\x22\x5f\x16\x3f\x93\x46\xf6\xcd\x40\x20\xdd\x90\xb0\xc9\xdb\xf1\x7a\x91\xc4\x86\x22\x42\xe9\x78\x40\x98\xf5\xe2\x74\x1a\xe6\x50\x93\x44\x13\x57\x2b\x99\x29\x38\x28\x97\x22\x0a\xbb\xc3\xc0\x30\xbc\xf4\x22\xda\xc5\x0e\x61\xa9\xa7\x1c\xd6\x0d\x1c\x3f\x34\x93\x3e\xdf\x2a\x92\x34\x96\x3e\xc0\x7d\xbb\xdb\x3b\x36\x40\x7f\x2c\xb1\x05\xa7\xeb\xdb\x0e\xf6\x98\xa4\xda\xb2\xbc\x74\x0c\x36\x56\x62\xd2\x1f\x35\x01\x06\xb8\x5c\x75\xe9\xed\xde\xda\xb5\x73\x58\x9c\x24\x35\xd4\x8b\xce\x7e\xcb\xea\xd6\x99\xbc\x87\xe2\xb9\x79\xf1\x77\xe2\x81\xc4\xb9\x90\xd5\x1b\xb4\xa8\xbb\x5d\x25\xe1\x61\x8c\x26\x9f\x55\x0d\x18\x10\xe5\xb7\x87\x0c\x32\xe4\x1e\x86\x24\x0a\x4f\x60\xa0\x82\x39\x0b\x75\xce\x7b\x4d\xb8\xe6\x4e\xe6\xdf\xfa\x20\xbd\x82\x05\x4d\x04\xb3\x34\xfa\xfb\xf2\x58\xaa\x32\x2b\x46\x96\x60\x22\x98\xad\x0a\x1c\x16\xdc\xed\xa0\x69\xa6\xa9\x8f\x44\xa8\x80\x59\x5c\xf3\x1b\x38\xf6\x9e\x9e\x10\xb1\xf5\xd8\xca\x6a\x9a\x9e\xfc\x30\xff\x9f\xa8\x30\x66\x5e\x1f\xe7\x74\xaa\x50\xd9\x08\x96\x2f\x50\x37\x5d\x0e\xfe\x4b\xd7\x54\x22\xbd\xed\x80\xcc\x70\xe0\x59\x27\x8a\x86\x5e\x92\xaf\xe3\x79\x25\xd1\x78\x15\x54\x69\x80\xa6\xf0\x2d\x1c\x4b\x55\x89\x26\x53\x5b\x91\xb7\xef\xd8\x5d\x44\x58\x97\xa8\x7d\xd8\xf6\x55\xda\x73\x87\x55\x13\x34\x51\x52\x08\x27\xd7\x73\x87\xa5\xdb\x1f\x8e\xdd\xc1\x42\xa2\x75\x88\x9e\xcf\xa1\x80\xf7\xc5\xb3\x4b\x8a\x74\x0a\x86\x1f\xac\x13\xda\x08\xd4\x65\xff\xd9\xc5\xa4\xf7\xe5\x88\xb9\x9f\x26\x40\xcc\x40\xa7\xdc\x0b\x1d\x4e\xbe\x17\xc4\x02\xe3\x31\x75\x76\x3c\x8f\xc4\x9b\xce\x1f\x24\x8e\x07\xff\xfd\x4f\x98\xc4\x7e\x7e\x00\x08\x15\x76\x02\x98\x9d\x13\xec\x8e\x1a\xcd\x7d\x78\x04\x13\x45\xb6\x73\xc6\x7b\x47\x1a\x46\x1a\xb7\xaa\x9e\x9f\xef\xaf\x08\x5f\xe7\xfb\x26\x0d\x13\x12\x78\x09\x39\xf4\x84\x56\x53\x67\x35\x0d\x55\xe8\x42\x0a\xed\xaa\x6c\x89\xfa\xfb\x9a\x45\x9a\x86\x86\x12\xe8\x18\x68\xd1\xf7\xda\x67\xcd\x44\x61\x99\xa6\x11\x81\xd8\x05\xcd\xd1\x9e\x1c\x22\xdc\x7c\x93\x14\xfc\xb2\xa2\xe0\x06\x9a\xd6\x20\x9e\x36\xe1\xca\xd2\x36\x9e\x65\xe6\x1f\x20\xd2\x09\x71\xb8\xbf\xae\x80\xc0\x41\x14\x27\x6f\x1b\x69\x8b\xdb\x6d\x20\xef\xd9\x37\x68\x4a\x02\xed\x81\xe1\x4e\x0d\x4f\x3b\xc5\xf2\x7e\x51\x4e\x69\xa0\x62\x47\xcc\x32\x5c\x0c\x52\x2a\x19\xda\x39\xcd\x0b\x20\x89\x4d\x6f\x28\xa5\x2c\x8d\x91\x39\x00\xd3\xe6\x3e\x56\xe6\x8f\x49\x89\x88\x8d\xf7\xc3\xbe\x13\xe2\xa0\x69\xac\x0d\x22\xeb\xfa\x02\xf7\x21\xa3\x25\x4d\x93\x20\xc1\xac\xd2\x41\x3a\x93\xd5\x55\x41\x74\x69\xbe\x34\x89\x79\x34\xcc\x90\x5a\xb6\x94\x71\x37\x24\x10\x60\x64\x61\xfb\xb4\x5e\xae\x0e\x0f\xeb\x5b\x7f\xf9\x54\x29\x4b\x32\x6b\xcd\x3e\xdc\x4d\x31\xc2\xe2\x19\xdd\x69\xca\x69\x84\xae\xc1\x77\x09\x08\x85\xea\xf0\x55\xa9\xd0\x14\xb7\x52\xf5\x62\x76\xaa\x47\x03\xa4\x32\x4a\x30\x82\x54\x9e\x9b\x76\x1f\xd3\x59\xf1\x3c\x90\x25\xa7\xa9\x64\x10\x4b\x9f\x54\x13\xaa\xe9\xa8\x87\x0e\xbe\x85\x0a\xc0\x57\x27\x3e\x89\xe2\x75\x32\xb0\x54\x14\x48\x4f\x1a\x76\x79\xbc\xca\xb7\xa4\x9a\x0a\x8c\xe9\xb8\xa4\x4a\xaf\xe2\xf0\x34\x2d\x5a\xa2\xa9\xe6\xa1\x0c\x3d\xaf\x69\xbf\xf6\x5e\x17\xe0\x0e\x16\xa5\x54\xcb\x30\xa1\x23\xd8\xfe\x55\xa1\xb5\x77\x4e\x53\xad\x2d\x61\x5b\x01\xef\xd3\x28\xd9\x07\x33\x14\x82\x14\xe1\x9e\xa8\xfb\x26\x72\x8b\xec\x99\x74\x81\x49\x2d\x38\xb5\x75\x8d\xcb\x73\x0d\x2b\xfd\x0c\x0f\x59\x91\x1d\xcf\xc7\xb9\x5d\x37\x35\x10\xe2\x06\xa9\xcb\x9f\x65\xf5\xba\x28\xf4\x56\x5c\xf6\x1b\x9f\x4f\xe5\x41\x1c\xa0\xc3\xb6\x2c\x8f\x27\x68\xb2\x51\xe6\xe9\xaf\x96\x99\x4f\x0d\x0d\x1e\x72\xe1\x1e\xd4\xc5\xba\xeb\x5d\x56\x3c\x63\xda\xee\x3c\x53\xee\xec\xce\x8a\x42\x26\x6c\xf1\x1e\x14\x7a\x75\x2a\xd5\x64\xe1\xe0\x11\x15\x56\xca\xad\x35\xf1\x6a\x07\xa5\xd2\x77\x65\x05\x6f\xdd\x38\xe3\x51\x1c\x21\x26\xb3\x93\x64\xa1\x9c\x08\xcb\xc8\x95\x1d\x4f\x65\xe5\x08\xed\xee\xca\xea\x83\x38\xff\x78\xc7\xe5\x34\xb0\x30\xb2\xb7\xf6\xd9\x27\x03\x89\xb3\x80\x60\xf2\x14\x90\x5f\x06\x10\x62\x35\xfb\x7d\x39\x8b\x2d\xc4\xac\x01\x71\x1c\x04\x22\x38\x4b\x38\x1d\x08\x37\x75\xaa\xd9\x94\x33\x25\xf0\xeb\x3d\xdc\x2e\xf9\x6f\x66\xe7\x79\x42\x12\x70\x85\x7b\x6b\xb7\x97\x90\xcf\xa3\x9a\x3c\x89\x2d\x52\xc9\x61\x00\x77\xa7\x72\xe2\x4d\xf2\xd4\x29\xee\x2d\x8e\x50\x65\x4a\x14\x8b\xac\xca\xb3\x02\x06\xfc\xe4\x6d\x1b\x81\xe1\xa8\xed\xe2\x5f\x3e\xf9\xc8\x79\x20\x43\xe6\x47\x41\x25\x0a\xf5\x02\xd3\x7a\xc0\xb9\x00\x1c\xe7\xdc\xc4\xda\x75\xc9\xc8\xfd\xe5\x5c\xa5\xb6\xfe\x05\xf7\xef\x91\x54\xd4\x38\x10\xe9\xdb\x6b\x25\x98\x5f\x33\x2c\xa6\xdc\x1d\x11\xdc\x98\xbe\x44\x6b\x9b\x55\xa2\x78\x11\xb8\xaa\x8c\x3b\xd9\x37\x17\x21\xb7\xb9\xe5\xca\x06\x3e\xf4\xf8\xc1\xa4\x0a\x39\xe9\x43\xe4\xa8\x10\x7d\x1d\x77\xe6\xd2\x50\xdc\x44\xee\x33\x09\x95\xaf\xee\x6c\x7f\xe6\xc8\x17\xb5\xbb\x5b\x8a\x53\x86\x30\xc3\xf6\x73\x5f\x67\x0c\x27\x90\x66\xae\x68\x1c\x25\x3d\xfb\x66\xbd\x39\x75\xe1\x26\xae\x62\x29\x65\xc7\x9c\xff\x19\x0e\x84\xab\x44\x32\x5f\x9e\xf3\x3c\x85\xa0\x70\x25\x0c\x66\x37\xca\x5f\xaa\x73\xb9\xb8\x92\xca\x52\x96\xb4\xab\xf8\x2c\x7f\xd3\xac\xfd\xca\x35\x03\xd2\xa1\x04\xaf\x24\x1b\xa7\x8d\x93\x04\x2d\x58\x07\x42\xee\x56\xd2\x0f\x2e\xad\x95\xaf\x65\xb6\x36\xce\xb7\x8b\xac\x32\x9d\xfd\x89\x9b\xb5\x8b\x0e\xce\xcf\x01\x6d\x42\x6e\x6d\x9f\x1a\x2b\x94\x6c\x9c\xc2\x9b\xfa\x1c\x94\xe5\xa4\x35\xa7\x5b\xa7\xa6\x7d\x75\x09\x11\x84\x1c\xa2\xbe\x5e\x1b\xb9\xca\x0f\x1e\x7c\x20\x02\xc2\x50\x16\xe7\x00\xed\x32\x82\x94\x18\x58\x20\x37\xce\x70\xa7\xf3\x53\x54\x04\x54\x47\xae\x50\xf9\x21\x7b\xae\x44\x03\x98\x51\x1b\x4f\x53\x11\x80\x44\xfb\xd7\x6e\x80\xab\xa2\xc9\x9a\xcb\x68\x44\x8f\xf6\x4b\x11\x4a\xea\x99\xf6\x7e\x94\x0d\x0c\x65\xc4\xfb\x3b\x87\x10\x11\x9f\x54\x81\xdc\x0a\x41\xd6\xf3\x79\x1f\x11\xa5\x1a\x4b\x0f\xe4\x0b\x1a\x14\xfe\xd5\x49\xc4\x7c\xd1\xdd\x1f\x17\x09\xd5\x23\x60\x19\xe6\xe4\x64\x1a\x47\xe8\x69\x1c\xec\xee\xba\xc6\xfa\xb3\x72\x62\x9a\x0b\xc6\x53\xc4\x40\x3c\x23\xf8\x15\xc7\xb4\xdf\xe8\xef\xfb\x02\x3b\x11\xab\x54\x59\xba\xe5\xdd\x51\xe4\x79\xd5\xa8\xc9\x6b\xc5\xc6\x92\xbd\x66\xb5\x97\xce\xea\xf5\x7f\xa9\x48\x13\x8a\xf0\x9f\xac\xde\x95\xf9\xdb\x44\x32\x92\x8a\x54\x46\x68\x94\xff\xaf\xba\x3c\x94\xfa\x9c\x77\x20\x7e\x91\x2a\x11\xf3\x41\x42\x7c\x51\x5c\x1e\x56\xdb\x8f\x15\x6b\xa8\x48\x41\x23\x16\xe9\xfb\xee\xf6\xb0\x5c\x3d\xee\x0f\xdb\xd5\xd3\xe1\xeb\xbf\xbd\x93\x26\x38\x0d\xb8\x5b\xf0\xaa\xe7\x0f\xe9\x87\x7d\x63\x0d\x56\x66\xbb\xb5\xe0\x2b\x2f\xa5\x37\x7e\x78\x11\x30\x34\x33\x1e\x96\x8f\x1e\x78\x2a\x04\xb5\xda\xe2\x56\x76\xaa\xdd\x53\xad\x2a\xfd\xf5\x02\x26\x84\x4a\x90\x2c\xac\xf5\x29\xa3\xc3\x72\xb1\xf5\xd7\x90\x8c\xc5\xce\xc1\xb0\xca\xeb\xef\xe5\xe4\xce\x2a\xb2\xba\x6a\xab\x87\xbf\x2f\x96\x7b\xa8\x47\x20\x1c\xa1\x44\x84\x94\x11\x59\xc7\x29\x31\xc1\x2a\x0b\x25\x21\x91\xbd\x84\xbc\x05\x2a\x0d\xcd\xb4\x79\xc3\x4a\x28\xa5\x30\x09\xb7\xd9\x3c\xad\x6e\x37\x9b\xe5\xb7\xc5\xda\x67\x6c\x84\x8e\x34\xc2\x5e\x6f\x32\xd4\x7f\x5c\x56\xe5\x7b\xf7\x44\x3a\x01\x47\xaf\xd5\xc9\xe2\x0c\x61\xed\x43\x88\xa7\x3f\x83\x5b\xde\x1a\xac\xb9\xeb\x68\x9c\xa8\xd0\x32\x41\x6b\x53\x97\x8f\x65\xb3\xe8\x39\x30\xc7\x06\xac\xd0\x2a\xb6\x7a\xe8\x08\xa0\xc6\x58\xca\x20\xeb\x31\xcd\x0f\x09\x48\x29\x4a\x7b\x2f\xcf\x75\x53\xea\x4c\xe4\x77\x65\x35\xc8\x2b\x0a\x80\x14\x59\x19\x1e\x16\x8f\xdf\x16\xfb\xfd\xe2\x71\xfb\xb4\xf9\xe7\xbf\x1e\x16\x8f\x8b\x1f\xdd\xf0\x32\x81\x8d\x5f\x62\xec\x6f\x61\xae\x62\x17\xed\xca\x4f\x7d\xe1\x3b\x42\x21\xaf\x86\xe0\xec\x46\x3e\xad\xb3\xf3\x57\x53\xb6\xa8\xfc\xe1\x72\x97\x55\xe3\x01\x20\x83\x88\x21\x85\x92\x25\x45\x7a\x2a\xa7\x8e\xa5\x0c\x22\x89\x8a\xb5\xea\xdc\x94\xc6\xf8\xd3\x22\x11\xa0\x2b\x83\xd6\xd9\xc2\xf2\x60\x7d\x13\xf5\x23\xfc\x9a\x18\xc3\x92\x04\x91\xb2\x45\xea\xbf\x5a\x83\x79\x9c\x0a\x91\xc4\x08\xdc\x02\x5d\x26\x78\x2f\xea\xd7\x51\x28\x44\xd2\x94\x22\xf3\x40\x6b\xcb\x7c\xf5\x1d\x28\x29\xb7\x9c\x3b\xa6\xcf\x86\x8f\x63\x80\x92\x85\x46\xf9\x34\xa8\x65\x3a\xdf\x98\x95\xad\x9f\xe9\xda\xc4\xa1\x85\xff\xa0\x03\x49\x96\x9e\x85\x87\xca\x38\x09\x98\xa7\xbd\xaa\x44\x61\xca\xea\xe8\xe8\x66\xbb\x60\x88\x6f\x29\x18\x26\x97\xd6\xcb\x8d\xa5\x6a\xe8\xb6\x6a\x19\x4b\x81\x72\xad\x7a\xcc\x6d\xe1\x8f\x82\xc6\x34\xda\x42\xeb\x47\x78\xb7\xf5\x1b\xea\xf2\xe5\xaf\x58\x9a\xa8\x4c\x62\x12\x5b\x21\x89\x3f\xfe\xb5\xf4\x4a\xa7\x93\x6f\x96\x52\xcb\x73\x54\x40\xeb\x6a\x8f\xf8\xc7\xa9\x4c\x55\x80\xe8\x31\x93\x41\x6e\x83\xb2\xdd\x11\xcd\x3c\xa6\xe9\xda\xd1\x93\xa9\xd6\x71\xec\x4b\x07\xaa\x8b\x0d\x88\x7e\x6a\xe3\xca\x54\x1b\xe5\xd6\x8e\x06\x57\xb7\xeb\x81\xec\x5a\x72\x49\xb1\x6e\xe6\xfb\xe3\xfd\x66\xf9\xc7\x61\xbf\x5a\x3c\x74\xc9\x76\x29\x88\x2d\x4d\x11\x3e\xd4\x76\xa8\x91\x08\xd0\x1f\x4e\xb4\xb0\x89\x8a\xc6\x8b\x6d\x0d\xed\x5a\x29\x35\x49\x5c\x68\xa4\x1d\x9f\x1d\x99\x46\xf7\x66\x2a\xb4\x1a\x04\x9e\x0f\xa8\xbb\xb2\x96\x9a\x0e\x08\x05\xb2\xc2\x09\xc2\x8f\xce\x06\x16\xa0\xb1\xdb\x7a\x90\xdf\xca\xbc\x75\xc0\xf7\xe2\x97\xbf\x04\xc8\x08\x7d\x20\xab\x1e\xd4\xae\x9e\x53\xfe\x49\x2a\x41\xc5\x71\x0f\x7d\xf9\x61\x41\x0e\x43\xaf\x70\xfc\x21\xc0\x10\xe9\x0b\xae\x11\xb7\x8e\x89\xa1\xfa\x1b\xe4\xa7\x19\x6a\xd3\xcf\xbf\x90\x21\x02\x93\x8c\x27\xbc\xd0\xbe\xbc\x3d\x17\xcf\x50\x16\xeb\xdb\xf1\x23\xaa\x20\x49\x30\xfe\xf9\x15\x9a\x51\x24\xdc\x1d\x0e\x59\x10\x75\x82\xee\x18\x0a\x76\xd8\x9d\x2f\x5d\x03\x1b\x8f\xc9\xea\xaf\x50\xc0\x4e\x65\xd0\x87\xdb\x54\xc4\x15\x22\x41\x6d\xba\xba\xe3\xa2\x5f\xb7\x16\x4f\x8d\x40\xef\xb1\xbe\x26\x55\x84\x09\xe2\x36\x89\x9e\x72\xf9\x23\x90\x95\x3f\x47\x06\x68\x9d\x64\xaa\xdc\xbe\x88\x1a\xc8\x88\xc4\x97\x2a\x1a\x1a\xf4\x06\xde\x32\x78\x7f\x80\xea\x35\xef\x63\x68\xe1\x28\x08\xe9\xda\xb3\x30\x0d\x49\x6f\xf7\xa2\x17\x57\xd9\xdc\xcc\x4c\x11\x40\xfa\xb7\xab\x60\xc7\x7f\xfe\x6f\x34\xb3\x15\x63\x91\xee\x59\x84\xe5\x40\x38\x6e\xf4\xcd\x14\x13\x80\x31\x22\x97\x0e\x1d\xc1\x5a\x14\x93\x31\x82\x86\x8e\xe2\xd7\xe8\x03\x30\x63\x39\xe8\xfd\x3e\xdf\xeb\x74\x2d\x0a\x94\xca\xba\x2e\xe4\xfe\x7f\x8d\x45\x0c\xe6\x9c\x4a\x22\x0b\xeb\x3c\x3c\x43\xf3\x4d\x54\xba\x5f\x5c\x55\x1a\xc7\x76\x45\x6f\xea\x49\x5a\x4d\xf1\x30\xe2\xce\x6f\x5c\xe5\xa5\x05\x72\x8c\x3f\x22\x0f\x2d\x2e\xbf\xb5\x77\x9c\xf0\xf7\xbc\x59\xac\x38\x11\xd4\x0b\xb3\x75\x5c\x15\x5d\x77\x70\x1e\x20\x0e\xe1\x84\x13\xba\x1d\x06\x77\x95\x98\x9a\x5d\x8a\x2b\x85\x16\x9a\xf3\x56\x2d\x25\xdd\x54\xf7\x97\x2a\x41\x09\x4e\x8e\xed\xd3\x6a\xb7\x3b\x3c\x2c\x9e\xfe\x58\xed\x3b\x9e\x20\xaa\x04\x0f\xb8\x53\xf9\xb5\xde\xc1\x87\x70\x98\xf1\xdd\x85\x12\x18\x51\xf9\xc7\x59\x54\xaf\x28\xe5\xd0\x5d\xd1\x58\x20\xba\xbc\xf2\xc4\xfd\xe0\x94\x2c\x48\xc3\x2e\x6a\x7c\x2c\xdb\xb5\xcb\x51\x38\xad\xba\xf4\x8f\x92\x10\xe2\xc4\x7b\x16\x47\xd8\x22\xe7\xc8\x13\xd4\xad\xed\xfd\xc1\x32\xad\xa4\x31\x38\x87\xb0\x64\x67\x63\x1e\xb2\xe2\xdc\x74\xcb\xa5\x52\x34\x46\x27\xd3\xd2\xc3\x0e\x6d\x31\xa5\x62\x4b\x4e\xf9\x07\x9a\x7a\x9f\x04\x54\x26\x93\x56\x69\xe9\x18\x8b\xaa\x0c\xea\xe5\x28\x5c\xab\x20\x48\x51\xba\x03\xf7\x6f\x66\x3f\xf0\x13\x1c\x45\xcf\x8e\x4b\x15\x24\x71\xe8\xb5\xc6\xf7\x22\x7f\xed\x7e\x57\x8e\x32\xef\xdc\xbc\x38\x4a\x8a\xc9\x00\x32\x91\xc0\xba\xe5\xfa\x5d\x9c\xee\xa0\x7b\x13\x13\xc7\xb1\x43\x46\x22\x93\xb2\x77\x99\xfc\xe6\x71\x1d\xf6\x54\x46\xe9\x10\xe9\xfe\x56\x8b\x9f\xcb\x4d\x67\x06\x2b\x03\x89\xb6\xdb\xf4\xaf\xe6\xae\xac\x5e\x71\x64\xd9\x63\x3a\x20\xd2\x62\xad\xf1\xa2\x77\x00\x0f\xe2\x75\x72\x5d\x1d\x30\xa1\x7b\x25\x91\xfc\x14\x06\xe3\x57\xd0\x41\x1c\xa0\xe2\xc5\xfb\x4b\xd6\xc0\x7d\x56\x4f\x8c\x24\x1d\xb2\x00\xa5\x32\xb2\xfa\x16\xea\xa6\x2a\x2f\xa0\x47\x23\x5b\x87\x8c\x58\x15\x39\x7d\xcc\x8a\xdd\xb9\x3e\xb5\xd6\xb8\xb3\xe0\xfa\x10\xad\x0e\xd3\x34\xa6\x9e\xd5\xca\xd5\xc2\x0d\xad\x4c\x1d\x4a\x82\xf5\x72\x5f\xa1\xb9\x11\x85\x2d\x98\x33\x0e\xa8\x92\xfa\x36\xc6\x6a\x43\x7f\x2f\x4e\x22\xd3\xb7\xd9\xdb\xba\x8b\xf3\xe8\x88\x1a\xa4\x31\xb2\xbc\x3f\xed\x3c\x5b\xdc\xaf\x0e\xf7\xeb\x87\xf5\xbe\x6b\x92\x84\xc6\x56\x39\x9c\xc4\xb9\x86\xce\x7a\xd0\x11\x97\x28\xc9\x24\x33\xad\xa1\xea\x63\xc7\xe3\xbe\x8c\x04\xa1\x0e\x88\x89\x31\xde\xfe\x8b\x6b\x12\xa8\xd4\x22\x7d\x30\x04\xf5\xe5\x3a\x46\xad\x89\x21\x40\x7d\x56\xe9\xb4\x2e\x4c\x69\xfd\xfa\xc9\xf7\xa0\xa1\xc4\x50\xc9\xb9\xf0\x08\xf5\x99\x32\x13\x4d\x65\x82\x92\x4a\xad\xa1\xb2\x31\xb7\x20\xba\x09\xab\xa9\x16\x68\x98\xa2\xc6\xba\x6a\xd6\xc5\x5b\x99\x29\xd0\xa3\xa4\xae\x66\x01\x41\xd2\xf6\x77\xc4\x57\x1c\x4e\x65\x99\x1f\xc4\x30\x6c\xa6\x19\x84\x18\xbf\xea\xa4\xfb\xd0\x3e\x9b\x2f\xd2\xd5\x71\x4a\x71\x90\xdc\x97\xcf\x16\x8e\x52\xbf\xb7\x3e\xee\xb9\x68\xae\xe8\x56\xe7\x83\x4f\x3a\x16\x91\xec\x35\x62\x90\xee\x72\xdc\xf9\x09\xa1\x18\xc4\x71\xaa\x3f\x03\xaa\xaf\x6b\xba\xf6\xf0\xf7\xc1\x72\x83\x0d\x49\x27\x3c\xf5\x99\xf0\x0e\x0d\xed\x92\x7e\xe3\xd7\x4d\x14\xb1\xd5\xc0\x3e\x98\x90\xe9\xca\xb3\x55\x53\x9d\x26\x81\x45\xbb\xbe\x94\xef\x5d\xe1\x61\x67\xf3\xeb\x94\x2b\x74\x0e\x0b\xdc\xbf\x07\xda\x6d\xdd\x94\xe3\x91\xec\xc8\x2b\xce\x55\xe5\xaa\xcf\xad\xf2\xbb\x28\x5e\xd7\xb7\x93\xae\xe1\x3a\x46\x7e\x0f\x93\x15\xda\x5a\xaf\x97\x2f\x73\xef\x27\x28\x45\xe3\xe1\xab\x25\x4d\xbf\x81\xa6\x5e\x17\x4f\xe2\xcf\xf9\x85\x5c\x0b\x46\x30\x70\xfa\xbd\xc9\xf2\xee\xd9\x44\x1a\x20\x93\xeb\x56\x34\x9d\x06\x00\xd5\x42\x49\xb4\x28\x8a\x73\x9f\x78\xe9\xdf\x58\x80\x56\x43\xd1\xd4\x65\x99\x4d\x71\xda\x5a\x52\x66\x99\x23\x9b\x17\x79\x9e\x64\xcb\xb4\x52\x56\x51\xe2\x70\x55\x74\x38\x0a\x32\x4c\x4e\x32\xd2\x92\x1c\x66\xc5\xeb\x27\x54\xeb\x93\x71\xa8\x43\x2d\x68\x3f\x91\x07\xea\xc4\x5d\x17\x68\xcd\xb4\x95\x78\x6c\xaa\x0c\xde\xc0\xe1\x8b\xdd\x51\x10\x41\x20\x06\xaa\xb9\x4f\x03\x16\x59\xd7\xc4\x48\x25\xfc\xf6\xd0\x4e\xd2\xf9\xa0\xa9\x36\x60\xd0\x86\xbf\x5d\xad\xb6\xdb\xc5\xbf\x1e\x3a\x6a\x49\x0a\x01\x09\x70\xb6\xe0\xe6\x3e\x0c\x7d\x8c\x17\x6f\x08\x48\xe8\x9d\xab\xfb\x52\xbd\x2e\x94\x1a\xd1\x21\x0c\xd7\x71\x08\x52\x83\x2e\x50\xf3\xd2\x87\xf8\xfc\x21\x49\x59\x38\x0e\x7f\xcc\xdb\x9d\x6d\x4b\x5c\xe5\xd7\xcb\xcd\x61\x71\x7b\xfb\xe4\xaf\x10\xc6\x09\x02\x2d\x6e\xee\xbf\xaf\x06\xb9\x09\x88\x94\x89\xbc\x0d\xd8\x4e\x85\x7b\x78\x03\xc7\x4c\x38\xb9\x72\xa4\x95\x07\x30\x2d\xb4\xc5\xfa\x8b\xfc\x3a\x0c\x06\x24\x50\x88\x9d\x80\x76\xe3\xbd\xc9\x2a\x3d\xb4\x31\x80\x10\x65\x02\x5f\x21\x82\x61\x9c\x01\x3d\x37\x05\xc2\x02\xe6\xd3\x9c\x16\x4a\x59\x9f\x73\x94\x8d\x47\xfc\x4a\xfb\xd3\x74\xf6\x01\x61\x52\x58\xb7\xa5\x3e\xc3\x67\xe8\x36\xa0\xda\x60\x81\x0c\x02\xbb\x82\x43\xfb\xe7\xab\x13\x1c\x1e\x8d\x30\x48\x82\x04\x4b\x4b\x2c\x32\xe4\xe7\x6a\xf5\x47\x17\xae\x86\x24\xd6\x18\xf0\x3e\xda\xe4\xe2\xb6\x2c\x3b\xe2\xcd\xae\x89\x00\x04\xc8\x59\xdc\x02\x66\xca\x47\x23\x0b\x12\xb0\x92\x73\xdb\x0c\x7e\xfd\x06\x9f\x0b\xa4\x2c\x46\xe3\xe4\xe9\x76\xf3\x61\x09\x91\x6f\x0a\x14\x77\xb9\xd6\x96\x3a\x58\x75\x93\x75\xd1\xc0\x33\x54\x07\xff\xd9\x36\x6f\x50\x99\xbc\x7c\x1f\x15\xde\x01\x8f\xba\xa1\x6a\x53\x04\x0f\x67\xcc\xb6\xaa\x31\xd0\xa3\xdf\x50\x81\x47\x14\xad\xf7\x12\x41\x63\x59\xde\x2d\x52\xc0\xdb\xdd\xab\xcb\xaf\x20\xdd\xe3\x15\x1d\x0a\x12\xad\xa7\x8e\xca\xe4\xb6\x12\xcf\xe5\xe4\xbb\x8a\xd0\xaa\x89\x98\xfc\x72\xdb\xae\xee\x1f\xc2\xc1\x41\xd0\x00\x79\xbb\x33\x0d\x45\x93\x99\xcb\x34\xe5\x0c\x02\x08\x58\x79\x89\x0a\xc4\x71\xd5\x2d\x16\x20\x89\x49\xdc\x78\xdb\x9c\x7a\x6d\x35\x7f\x7e\x2f\x6c\xf6\x9f\xc4\x5f\x4b\x72\xc0\x98\xe9\xe1\x54\xf9\x30\x00\x5a\xd2\x7e\x0c\xcc\xae\xe5\xa0\x98\xd5\x17\x79\xf7\x08\xd0\x21\x5a\x0b\x54\x2c\x30\x1e\xd9\x88\x5f\xc8\x44\xe2\x7f\x16\x36\xac\xb7\xdc\x3c\x6c\x57\xfb\xf5\x7e\xbd\x79\x3c\xfc\x58\x3d\xed\xd6\x9b\xc7\xae\x89\xe6\x98\x7c\x5b\xdc\xdf\x6f\x96\x07\x54\xe2\x5e\xaf\x7c\xf9\x20\xe8\x20\xf5\xdc\x72\x1d\x39\xec\x1c\x6f\x16\x68\x4a\x1d\xfc\xc3\x4e\x87\x65\x59\x37\xe8\x77\x7a\xea\x5c\x57\x1a\xde\x89\x97\x53\xd0\x89\x15\xd5\x16\x5a\xf7\x85\xf1\xee\x18\xb4\x06\x92\x3d\xb6\x2c\x8f\xc7\x73\x91\x35\x17\x14\x18\xfb\xa0\x77\x40\x24\xdc\xe5\x41\x30\xb7\xed\x6c\xa5\x71\x23\x43\x98\x2d\x1a\xad\xdb\xcd\xb3\x35\xca\x9a\x66\x1a\x55\x03\xc3\x95\x07\xc2\xac\x4e\x59\x5d\x6a\xb8\xc1\xec\xea\x50\xbe\x7c\x7c\x73\x13\x06\x80\x16\xfe\xfa\xb5\x80\xf7\xa1\x45\x6c\xc2\x30\x62\xc3\x8d\x66\x29\xf4\x5b\x7d\x0f\xa6\x59\x17\x76\xcf\xe9\x7d\x18\x13\x46\x02\xb5\x49\xb3\xda\x69\x9e\xce\xd1\xb6\x99\x90\xc6\x96\x4f\xf3\xe5\x6c\x4c\x0e\x53\x5e\x16\x13\x4a\x89\x1d\x87\xe8\x10\x81\x4d\x7e\x2b\x70\x62\x48\x4c\x84\x2b\xeb\xca\xe6\xa8\x72\x5c\x33\x9a\x90\x0e\x49\x81\x28\x8a\x83\x09\xfd\xca\x66\x68\x22\xb1\x6c\xce\x9a\x09\x65\x75\x74\x9c\xe6\x93\x08\x80\xa1\x69\x84\xd6\xd7\xf1\x72\x2f\xea\xe6\x09\x26\x65\xda\x86\x05\x06\x57\xab\x22\x53\xaf\x85\x38\xc2\xc6\x8c\xbf\xa4\x61\x61\x6c\xf3\xfa\x9e\x54\x67\x76\x2f\x33\x2c\xd4\x98\x60\xdb\x41\xb3\xcc\x9a\x4b\xa7\x4d\xfb\x99\xed\xf1\x79\x28\xcd\xb0\x38\x41\x8f\x0d\x4d\x56\x84\x47\x0c\xf3\xb3\x5d\x23\x8d\xb5\x2a\xbb\x97\xf2\x34\x79\xb5\x38\x10\x88\xb8\xdc\x3c\xae\x0e\xab\x87\x4d\x67\x10\x98\x38\x8c\x12\x87\x3d\xc4\xa1\x36\xb2\x57\x4d\x4c\xc2\xc0\xc5\xd7\x1f\xb2\x02\x95\x05\xca\xf7\x2e\xa6\x6b\x62\x02\x60\x25\x12\xea\xf3\x71\x2c\x08\x48\x4d\x12\x10\x6b\x5c\x22\x78\xaa\xfb\x35\xd5\xc2\x03\xa4\x1d\x38\xe1\x05\x26\xdc\xeb\xd4\x24\x92\x72\x17\x2c\x76\x58\x18\xc4\xf6\xae\x8b\xd5\xb9\x2a\x97\x83\x30\xbb\x49\xb4\xc6\x1d\x29\x2f\x9b\x8d\xc1\x2c\xd5\x67\xd2\xe5\xd4\xa4\x61\x92\x76\x82\x3d\x96\x49\xad\x1c\x08\x2b\xff\x27\x0c\xfc\x90\x4e\x09\x45\xcc\x7e\x01\xa0\xeb\x7d\xd6\x65\x22\x4d\xaa\x22\x6d\x3c\x37\x6a\x76\xea\xd2\xb1\x5d\xaf\x71\x1e\x47\xce\x92\xeb\x14\x57\xac\x7d\xe2\x1b\x28\x4b\xc5\x5c\xc0\x7b\x7b\xf7\x59\x78\x82\x11\x69\xe0\x32\x78\x85\xfe\xa3\xfa\x20\xcd\x6f\x84\xe2\x98\x81\xd3\xa0\x3a\x7a\x31\x23\xb5\x55\x32\xf8\xbe\xbb\xfd\xb9\x5a\x77\xbf\x82\x46\x03\x07\x11\xd5\xeb\xfa\x06\xb2\xe2\xd9\x67\x5a\xab\x01\xb3\xc2\xfc\x8d\x54\xca\xb0\x4e\xe2\x28\x7e\xf5\x41\x1e\xa3\x5b\x8f\xd0\x52\xba\xd4\x3d\x7a\xce\x80\x49\xf1\xa9\x9a\x97\xaa\x7c\xaf\x7f\xbe\x40\xf1\x04\xb6\x9a\x2d\x2b\x9e\x17\xfd\xe8\x33\x92\x60\x92\xe4\x41\xfc\xda\xf4\xba\x57\xd4\x18\x88\xd1\xe0\x69\xad\xbb\x1e\xfc\x3f\xc6\x43\x8d\x9e\x8f\x05\x01\x8b\x30\x8e\x9f\x89\x4d\x61\xcd\xd0\x6b\xb2\x88\xde\x08\x60\x41\x14\xda\x2c\xac\x50\xcd\x59\xe4\x5d\x08\x91\x05\x51\x12\xa2\xa3\xb2\x44\x88\x76\xf7\xab\x04\x4f\x05\x8b\xee\x69\x06\xf5\xcd\x65\xe0\x83\x8d\x06\x30\x0b\x48\x1c\x21\xe9\x39\xc2\xc0\x71\xcb\x8c\xfc\x95\x88\x88\xad\xa8\xc7\x51\xe4\xf9\xa9\x2c\xfe\xcc\xba\x23\xda\x32\xcf\x15\x2e\xa5\xb4\xcd\x41\x3f\x03\x7a\xf1\xb5\x6f\x43\x23\x1b\x21\xfa\x2f\xca\x81\x21\xb3\x81\xc7\x4b\xfe\x45\x48\xd5\x5f\x80\x06\x28\xcc\x66\x55\x3c\xbe\x7e\x7f\xdc\xcd\x8e\x2c\x16\x50\x69\x10\xaa\x2e\x9a\x46\x28\x8c\xaa\x64\x7f\xc2\x8d\x15\xf7\xba\x82\xfc\x8c\xdf\x9e\x1a\xea\x19\x59\xef\xaa\xb2\x68\x56\x0e\xab\x32\x23\xaf\xc7\x02\x16\x24\x08\xcd\xb5\xf9\xca\x4a\x7e\xf0\x38\x8c\xa4\x9e\x7a\x70\x53\x60\x8d\x52\xbb\xd7\x77\xfd\xc2\x62\x82\x7d\xb7\xae\xd5\x71\xde\x5f\x73\x0d\xe3\x50\x29\x17\xdd\x47\x0a\xa9\x9b\xfc\xdc\x8e\xfe\xc5\x47\xe3\x2a\xa6\x36\x97\x06\xbf\xb2\xba\xf9\x3c\x27\xc5\x82\x58\x58\x8c\xdc\x3b\x64\x0f\x36\x25\xf9\xb5\xf4\x92\x00\x2c\x48\x22\x03\x36\x94\xbb\xfe\xd1\x81\xb6\x59\x90\x88\x34\x82\x4e\x49\x13\xcd\xd6\x1e\xc7\x36\xee\xab\x04\x38\x72\x56\xb5\x3b\xe0\x5d\x59\x2d\xf2\xfc\xcb\x60\x48\x73\x19\x22\x27\xc8\x3b\x64\xcf\x2f\xc8\xf5\x80\x9e\x11\x32\x20\xf9\x26\x26\x40\x4a\x8e\x63\x1f\xb2\x1d\xea\x6d\xb1\x40\x86\x06\x93\xc3\x78\x89\x97\x3e\x85\xc1\x02\x49\x13\x5f\xb5\xdd\x3a\x62\xd7\x2a\x3f\x2c\x90\x4a\xa7\x7a\xa8\xcc\x84\x9a\x4c\x70\x2f\xda\x1f\x3c\x43\xf0\xaa\x70\xb4\xf2\xf6\x7f\xbb\x2f\xa8\x38\x57\x56\x0d\xd5\x6a\x48\x9c\x9b\x0c\x86\x38\x59\x0f\x97\xbd\x8a\xd4\x0c\xc7\x8b\xa3\x14\x67\x81\x4e\xb5\x12\x9d\x90\x96\x4d\xad\x0d\x03\xbc\x2c\xd0\x3a\xb0\xb8\x71\x91\x2b\x1c\x4a\x16\x20\xf1\x21\x32\xbc\x7f\x4d\xa0\x26\x1a\x92\xba\x76\xaa\x69\xeb\xed\x90\x95\x94\x05\xa0\x43\xef\x34\x3e\x88\x5f\x37\x30\x42\xbe\xb5\x87\xad\x77\xf4\xdf\xd3\xc5\xe1\x54\x58\x18\x24\x1c\x43\xca\x3d\x8a\xd8\x4a\x02\x67\xc5\x33\xa2\x23\xea\xae\xa1\x49\x91\x19\xc5\x21\xd1\x07\xb7\x6d\x0f\x69\x47\xdf\xff\xea\x40\xd1\x7f\x95\x77\x71\x67\x86\x5c\x22\xfb\xa4\xd0\x7a\x28\xae\xf1\x9b\x49\x1a\x77\x91\x28\xa4\xdc\x19\xef\xf7\xa3\xb2\xe4\x49\xb3\x58\xa3\x00\xc4\x7d\xf9\x8c\xd5\x93\x1f\xde\x65\x38\x7d\xc3\x48\x10\x1b\x0f\xd8\x3c\x7e\xdf\x3d\x6d\xee\xef\xbf\x74\x07\x52\xf4\x5d\x8f\x97\xf2\xa5\xdc\x77\xcc\x73\x2c\x24\x24\x46\x8c\xc0\xa9\x2a\x4f\x2f\xa8\x00\x36\x1b\x8b\x64\x21\x49\x19\x92\xcb\x0d\x4a\xa2\xba\x6b\xa4\x9a\x27\xce\x2f\x10\x5d\xfe\xe2\x3f\x74\x5e\xdc\x87\x85\x84\x5b\xfa\x2e\x44\xed\x00\xa0\xbc\xd4\x20\x63\xc6\x42\x22\x22\x5b\x75\x68\x21\x73\xdb\xaa\x2c\xaf\x88\x2e\xfe\xf3\x7f\x7f\xbb\x42\x8a\x74\xa7\x13\xda\xe3\xf6\xf5\x59\xf9\x0a\x9c\x81\xce\x6f\xf7\x5e\x34\x21\xa8\x79\x73\x38\x09\xf5\xea\x68\x5b\xb7\x6f\xa7\x39\xcf\xe2\x2f\xbe\x2c\x8b\x24\xd6\x3e\xdd\xfe\xc2\x8c\xd1\x68\xd0\xc5\x21\x0f\x49\x8f\x6a\xf2\xbf\x4a\xdb\xf9\xbb\xd5\xb2\x5d\x34\x7a\x2e\x09\x16\x26\xc4\xaa\xb1\x2f\x4b\x47\x9d\x3c\xba\x5c\x12\x1b\x8c\x1c\x21\xf4\x6e\x81\x1e\xe4\x76\xb3\xb9\xf7\x8a\x29\x3f\x56\xbb\xfd\xea\xb6\x6b\x9c\x80\x19\xd0\x8e\x2c\xcb\x6a\x84\xbd\x67\x61\x1a\x1a\xdc\x1d\xf6\xab\x7f\xde\x8c\x6e\x93\xc6\x0a\x4b\x89\xc5\x59\x67\x0d\x2a\xaf\xfb\xaa\x4e\x8b\x2c\x9d\x0b\xb0\xb1\x30\xe5\x21\xfa\xed\x27\x71\xf1\x98\x9e\xf9\xf9\x24\xa8\xe5\xb0\xb2\x26\x97\xde\x97\xf7\x99\xad\x3a\xc6\x2f\xc4\x5c\x2b\x25\x14\xe2\x56\x5d\xe0\xdd\x22\xec\xc7\x77\xd4\xca\x92\xa7\xa1\x9b\x3f\x94\x28\x4e\x5d\x03\x88\x80\xf4\x45\xa4\xb7\x60\x30\x6d\xff\x97\xdf\xb7\xdf\x3d\x42\xa0\x14\x57\xcc\x51\x12\xf7\xae\xac\x90\x0f\x72\xfc\x5a\x40\x55\xe4\xf5\xcc\xe0\xf9\x39\x87\x9b\x72\xa4\xfb\xc0\x42\x88\x25\x02\x04\xb1\x08\xf2\xa9\x2c\x8f\x93\xf7\x01\x93\xc6\x36\x3b\xf5\x8e\xb0\xa0\x89\x3d\xe1\xfc\x4a\x16\x1a\x12\x06\x69\x6f\x5f\xee\x90\x1b\xb4\xec\xc9\xdb\xa6\x6c\x81\xfe\xb4\x14\x22\xb7\x8e\x7d\x6a\xd6\xb2\x28\x08\x2c\xdf\xe1\x5b\x06\xef\x76\x81\x1d\x8c\xd1\x28\x20\x04\x53\x92\x4f\x8b\x7f\x75\x3f\x25\x5c\x2b\x74\x6b\x9c\xee\x7d\xf7\xbb\x40\xb0\x9b\x83\x73\x94\xe5\x28\xdb\xc5\xa2\x30\x52\xa9\xa5\x5c\x80\x51\x0d\x39\x8b\x42\xae\x59\x37\x48\xbc\x13\x3e\x7a\x9f\x28\xd4\x61\xe2\xa4\x36\x37\xc5\xb2\xcc\xcb\x6a\xb0\xef\x47\x51\x10\x20\x48\x14\x89\x3c\x0f\x27\x51\x35\x87\xae\x9c\x65\xfc\xb6\x84\x82\x72\x2a\x05\x43\x9d\x4f\x16\x11\x50\x48\x04\x6e\x9e\x07\xda\xb6\x2c\xa2\x01\x93\xc1\x40\xd6\xc9\x85\x44\x3e\x43\x12\xfd\x75\xe2\xe4\x13\xaf\xd7\xdf\x36\x0c\x12\x37\xbe\x7a\xea\xe7\xc1\xe1\x44\x20\xc7\xc0\xbb\x28\x9a\x7d\x79\x03\x3f\x5f\x3a\xb7\x93\x45\x54\x03\x4e\xa6\xb2\xb0\x49\xe7\x3b\x91\xe5\x33\x0c\xf2\xae\x35\xd6\xb0\x74\x75\xca\x5e\x76\x04\xc9\x25\xf3\x7c\x7a\x5f\x96\x0a\xc4\xb3\x5a\x30\xee\x22\xcf\x11\x44\xe0\xd7\xf4\x88\xe9\x34\x71\x88\xde\x4d\x25\x54\x0e\x48\xae\x88\xda\x4a\xa3\x91\x10\x33\x4b\x5a\x56\xbf\x94\xef\xa3\x65\x2a\x4a\x28\x71\x8a\xc8\x18\x9c\x2b\x1a\xa8\x96\xd5\xe5\xd4\x94\xbe\x01\x0f\x35\xe6\xf8\x70\xdb\x18\x54\xe2\xb0\x88\xa7\xd4\xaa\xfb\x34\x42\x66\x58\x54\xe6\x0e\x08\x1a\x0a\xcf\x25\xe5\xbf\xba\x4d\xb0\x0d\x43\xc7\x2c\x12\x31\x0f\x1d\x3c\xe2\x6b\x59\xea\xc9\xab\x0b\x45\x42\x27\x97\xa8\x67\x09\x99\x7c\x15\x13\x8b\x64\x12\x5a\xc4\x94\x2d\x9f\xe8\x09\xc2\x1d\x0e\x7e\x72\x65\x15\x72\x14\xb6\x3c\xdc\x96\x67\x99\xc3\x6d\x87\xd6\x64\x91\x8e\xb4\x97\xe7\xde\x42\x55\x4f\x02\xb1\x2c\x02\x92\x62\x81\xe9\x3f\x6f\x7e\x7c\x43\x67\x6d\x1e\x59\xc0\x22\x90\x16\xc7\xbd\xda\xb7\x3e\xd3\x44\x6b\xf4\x83\x31\x68\xc2\xc8\xaa\xcc\xb4\x5e\xd6\x4f\x80\xd7\x19\x02\x37\x16\x99\x28\x31\xcc\x63\x85\xd0\x8c\x99\x21\xf7\x63\x91\x49\x23\x0b\x8b\x03\xf5\x62\x79\xf5\x5a\xef\x12\x43\xb0\xfe\x65\x0d\x00\xee\xad\xc2\xaa\xa2\xce\x63\xfb\xc7\xcf\x48\x82\x08\x70\x38\x20\x01\x67\x56\x16\xeb\x31\xfc\x94\x91\x40\x59\x15\x29\xcf\x6d\x73\x38\xbd\x96\x57\x9f\xaf\x0f\x80\x32\x12\xc6\x29\xd2\xa3\xfb\x8c\x1b\x02\x87\x7b\x9d\x13\x46\x70\x94\x5b\xc7\xf6\x4f\x57\x64\x3f\xc6\x97\x33\x12\xc5\x29\xf7\x42\x53\xed\x96\x8d\x55\xa8\x11\x1d\x4d\x02\x12\x81\x46\x58\x9c\x38\x37\x65\x95\xfd\x29\x74\x59\x89\xc7\x73\xa1\xc4\xc2\xfe\x50\x9e\x7d\x0f\x89\xd9\x84\x01\x23\x24\x26\xe8\xc0\x37\xe5\x0d\x89\xc6\x99\x9f\xd9\x57\x23\xc6\xf8\xc8\x53\xbb\xa5\x3d\x96\x4d\x66\x32\xbb\x4a\xd6\xb8\x9a\xb6\xf6\x96\x5f\x9b\x52\x67\x72\xb9\xef\x4c\x68\x64\x81\x91\x4e\x9c\x01\x61\x2f\x33\x81\x52\x46\x68\xa2\x94\x95\x17\x69\xce\xa7\xd6\xe0\x12\xcf\x76\xb4\xcd\x7f\x41\x9a\xda\xf0\xfa\xd8\xe0\xfe\x31\xc2\xc9\xff\x9e\x71\x46\x58\x14\x93\x7e\xf1\x70\x83\xfc\x41\xfc\xfa\x09\xd9\xe4\x03\x31\x6a\x95\x4d\x71\xc3\x69\xb7\x3b\x4f\x72\xef\x8f\x73\xea\x01\x07\x96\x3d\xc2\x19\x97\xbb\x7e\x59\x21\x4c\x75\xe5\x0b\xfd\x47\x0e\xc7\xdf\x98\x41\x62\x85\x81\xc5\x11\x6c\xb8\xe1\xc3\xdd\x78\xfa\xe5\xdc\x15\xe2\xc4\x26\xb4\x11\x75\x31\x7c\xc4\x38\xa5\xb4\x47\x35\x7a\x15\xe4\x8d\x44\x02\xee\xd1\x43\xc4\xda\xca\xb3\x7b\xca\xb6\x6d\x9f\xf0\x62\x24\x86\x08\x33\xb2\x9b\xe5\x7e\x31\x5a\x69\x49\x62\x02\xf4\xd5\x25\x34\x77\xee\xcc\x19\x2c\x14\x23\x69\x60\x53\x66\x5f\x37\x9b\xaf\xc3\x5d\x9d\xa4\x91\x15\xec\xb5\x9d\xfc\x0e\x70\x05\x25\xf4\x0d\x63\x4b\x26\x3f\x92\x8b\x24\x5f\x26\x8d\x14\x8f\x3d\x2c\xd3\xb6\xb8\xd2\x79\x64\x84\x07\x16\xcf\xd4\x7e\xfb\xa6\x1c\x3d\x0d\x17\x5c\xd9\xfe\x32\x15\xd4\x2f\xdb\xb3\xcc\x33\x75\x67\x33\x01\x76\x6d\x15\xf9\xaa\x79\x19\xb1\x25\xfb\x53\x35\x45\x63\xd7\x72\x89\x66\x7f\xc2\x98\x41\x85\x11\x41\x53\x63\xeb\xfc\xef\xce\x05\x8e\x97\x27\xfc\x2a\x8b\xab\x13\x86\xd3\x51\x30\x95\x3a\x8a\x2c\x4c\x94\x37\x22\xef\x36\x42\x22\x78\x20\xfb\xb1\xbc\x6b\xca\x13\xf2\x93\x17\x8f\xf0\xcb\xe6\x57\x07\xe6\x0f\x11\x42\x20\xc1\xcb\xc3\x6e\xbb\xcd\x85\x02\x2b\x21\xfb\x5b\xf9\x07\x46\x64\xc8\x63\x3f\x8e\x6d\x40\x04\xe5\x73\x51\x41\x76\x70\x0f\x19\x5b\xf9\x95\xba\xf5\xe1\xa5\xa8\xeb\x76\xc1\x9a\x7c\x23\x19\x5b\xb5\xa8\x5c\xd4\xce\x00\xe8\x70\x3e\x8c\xc8\x84\x0a\x17\x13\xb6\xf8\xcb\x51\x39\x12\x23\xd2\x30\xac\x8f\xb3\xee\xfc\x5c\x6a\xb5\xff\x22\x2a\x88\x40\x0d\x34\x4a\xaa\xcb\x94\x7b\x8f\x11\x15\x6b\x4f\x22\x62\x59\xa9\xba\xd4\xfc\xa4\x9d\xa2\x18\xb2\x71\x24\xd5\xa3\xa9\xa3\xb4\x8d\xc8\x3c\xdc\x2f\xfd\x63\xea\x40\x23\xf1\x89\xdf\x1f\xec\x36\xb5\x7f\xa9\xca\xf3\xf3\xcb\xb6\x2a\x7f\x5d\xd1\x95\x4d\x9e\x5d\x9b\x20\xb2\xdc\x66\x5d\x5c\x8c\x80\xb4\xf0\x12\x8f\x5b\x9a\xf8\x54\x73\x2a\x33\xfe\x4c\x15\x63\xfd\xb0\x14\x8d\x7a\xb1\x92\x27\xc3\xbc\x88\x77\x23\x88\xa1\xb6\x36\xbb\xb2\xa4\xf4\x4f\xc2\xa7\x30\x51\x00\x07\x51\x4f\xaa\x3c\x9e\x72\x70\x0c\xa0\xf3\x2b\xac\xd1\x01\xed\xa5\xae\xe1\xf2\x84\xe2\x4f\xd3\x36\x29\x32\x48\xd8\xbc\x66\xef\xbd\xba\xdb\xd1\x00\x62\x24\x10\xc8\x1e\x1e\x10\xcd\x02\x79\x3e\xc0\x19\x30\x1a\xc6\x80\x51\xa9\xb7\xb2\x81\x45\xf7\xa3\x4c\xb1\x3a\xe9\x90\x83\x69\x96\x2f\x59\x3e\xf2\xfd\x68\x44\xb9\xad\x3c\x87\x1c\x9e\xd1\x70\xb4\x3c\x9a\x36\xf6\x73\xad\x1d\x32\x9e\x02\x34\x8a\xa5\xb0\xf2\x32\xc8\xe0\xed\x76\x8e\x4d\x85\x08\xc4\x01\x01\xfa\xec\x07\xf1\xd7\x48\x24\x8d\xbc\x10\x04\x46\x7b\x4a\xf3\x50\x6a\xac\x1f\xf8\x09\x3e\x5f\xc0\x68\x64\xe2\x34\x18\x64\x26\xaf\x59\xba\x18\x25\x54\x62\x00\x7e\x5f\xb6\xae\xa5\xcd\xe9\xef\x20\xcf\x7b\x77\x85\xb2\xd8\x60\x65\xc7\x51\xfc\x52\x5d\xe4\x9e\xb2\x24\xc4\x71\x64\x57\x8d\x47\x51\xa9\xf2\xb3\x50\x30\x65\x26\xc4\x38\xde\xa6\xc0\x70\x06\x96\x2b\xdc\x94\xe5\xeb\x8f\x20\x24\x72\x54\xf3\xdf\xb6\x65\x28\x44\x56\x97\xb9\xbe\x2b\xab\xbb\xb2\xea\x5f\x2a\x0e\x02\x23\x06\x86\x7f\xf6\x27\x58\xf6\xed\x1c\xaa\xeb\xc0\x17\x8d\x29\xd5\xac\x2f\x8b\x73\xb0\x7e\x17\xc6\x8f\x7c\x23\x16\xa1\x1d\x31\x34\x07\x3f\xe9\xff\x38\x0d\xd0\x9c\x72\xae\x89\xe5\x90\xee\x03\x58\x34\x16\x61\xe4\xa3\xde\x58\x72\x62\x8f\xce\xf5\x4a\x0c\xa1\x90\xbe\xbe\x76\x08\x51\x62\x34\x0d\x08\x96\x15\x3f\xed\x97\xcb\xcd\xfa\xd1\x12\xe5\x7d\xd6\xc3\x29\x4b\x90\x11\xff\x98\x15\x5f\x45\x4d\x17\x4a\x75\x2b\x1e\x4d\x95\x25\x30\xf4\x90\xcf\x4f\xd7\x0d\xca\x43\x6b\x68\xbb\x41\x3a\x7d\x32\x1e\x6a\x34\x35\xfa\xb0\xe9\xdf\x77\xfb\xeb\xfe\x9a\x5e\x94\x6a\xf4\x6a\x4c\x96\xe7\x37\xe7\x8b\xad\x57\xf9\x4d\x64\xba\xbf\x04\x8b\x49\x17\xc8\x7b\x10\xc5\xc5\x87\x4d\x26\x58\x0e\x46\xb9\x02\x4c\x8a\xb8\x08\xdc\x4e\x14\xaa\x39\x4f\xa3\xab\x1d\x17\x1e\xb6\xc7\x1d\xa1\x41\x22\x3c\x9f\xa8\xab\xb7\xb3\xca\x58\x8c\x72\x43\x31\xf5\x80\xa5\x63\xc7\xd6\x3e\xa8\xa1\x6a\x26\xf4\xae\xfe\x23\x8d\xce\x14\x29\xc3\x60\xa2\xbf\x05\x1a\x42\x99\xcc\xe1\x83\xa8\x16\x15\x3a\x41\x56\x11\xd4\xa6\x7d\xdc\xff\xf8\x3e\x8f\x5b\x62\x54\x0a\x89\x9d\xe3\x4c\xd2\x76\x57\x9d\x6c\x9a\x54\x07\x34\xe2\x9d\x02\xd9\x4d\x59\xe6\x28\x41\xe6\xb3\x65\x54\x87\x29\x95\x7e\x1f\xcb\x14\x5c\x95\x15\xff\xe7\xff\xa6\x41\x23\xaa\xa3\x04\x23\x59\x36\x6a\x61\x13\x8b\x1f\xda\x9b\x53\xfc\x1f\xa3\x9a\x25\x1e\x30\xd6\xa7\x05\xa9\x4e\x18\xf2\x8f\xbc\x94\xad\x29\xda\x88\xa6\x9e\xd0\xbc\x33\xaa\xa5\x41\x23\x6b\xf5\xb0\xde\xed\xd6\x9b\xc7\xc3\xdd\xe6\xe9\xb0\x5b\xdc\xaf\x76\xfb\xc5\xd7\x55\xec\xaf\x04\xb1\xa5\xf7\x7c\xf6\x6a\xa7\x37\xae\x22\xc3\x1f\xd7\x56\xb1\xde\x29\x88\xfa\x5a\xd8\x29\xac\xd8\x26\x22\xda\x75\x5f\xe6\x42\xbd\xde\x94\xbf\xc6\x76\x19\x0b\x65\x2c\x63\x07\xc0\xb6\x1b\xc3\xaa\xe8\xd9\x4f\x18\x0b\x75\x28\x93\x1e\xf9\xb1\x2f\x51\x1b\xc9\x1f\x8d\x84\x4f\x7f\xbf\xcf\xf7\xe0\x27\x72\x80\xad\xef\x6e\x41\x59\xe8\x26\xb6\xfb\x91\xbf\x2c\x89\x38\xc6\xef\xef\x37\xcb\x3f\x56\xb7\x08\xf5\xeb\x68\xc3\x5b\xf3\x40\xe1\x84\xdc\x7f\x1b\x5a\xaf\x8c\x06\x01\xe6\x3a\x5c\x18\x4a\x1c\x4f\x22\x7b\xbe\x26\x1d\x1a\x2e\x3d\x8c\xe9\x18\x4d\x7b\xcc\xdb\xcd\xc7\x71\x59\x1c\x18\x5c\x89\x8f\xf7\xa5\xd0\x8b\x42\x3f\x21\x97\xea\x97\x49\xa3\x38\x20\x71\xaf\xfa\x82\x35\xa2\xe3\x97\x8d\xb5\x8c\x99\x47\xa8\x3f\x64\x9d\x22\x09\x63\xb1\x21\x98\xb4\x7c\x12\x15\x2c\xd1\xa6\x71\x07\x12\xa6\x7d\x39\xce\x13\xbc\x95\xaf\xb3\x12\x3d\x8c\xa5\xdc\x4a\xcb\xb9\x5f\x07\x64\xd8\xa3\x77\x4d\x21\x54\xde\x30\xf1\x61\xf9\xf1\x23\xf2\x94\x5a\x6a\x04\xb4\x91\x1e\xb2\x5e\x9f\x67\xb6\xf3\xb8\x4e\xb5\x07\x12\xe7\xe2\xd8\x95\x9c\x31\x26\x84\x31\x3e\x6b\x86\x00\xbb\x43\xd5\x5a\x41\x07\xd1\x34\x70\x3c\x7d\x90\x44\x65\x42\x86\x98\xd5\x5a\xbc\x94\x65\xee\x04\x2c\x7e\x87\x60\xe0\xf7\x16\x61\x26\x20\x42\x43\x75\xb7\xff\x87\xcd\x66\xde\x0c\x00\x6d\xbe\x8d\x49\xb1\x56\xce\xfd\xda\xfa\x3e\xce\x51\x70\x0d\x64\x6c\xf9\xa9\x44\x9e\x3b\x13\xa6\xfb\x5a\x12\x18\xc6\x59\x04\x92\xe8\x3e\xc2\xfb\x36\x17\xc5\x35\x4d\xe4\x07\x99\xab\xb9\x9d\x91\x49\x30\x1e\xca\x1b\xa2\x47\x73\x85\x48\x65\x4c\xd1\x84\x8d\x37\xb5\xb6\x91\x55\x44\x1a\xc7\x87\xe6\x85\x18\xa7\x56\x02\xd3\x29\xe0\x7a\x7c\x38\x55\x59\xd1\x2c\x96\xe5\xb9\xaa\xa7\x37\xd5\xd2\x8a\xc4\x21\xd6\x34\x3a\x08\xa4\xc4\x7d\x82\xf6\x09\xd0\xb7\x3b\x14\x28\xfc\x8e\xbc\xf2\x87\xfa\xa5\x3c\xe7\x1a\x53\xbd\xbe\xaf\x20\x66\x58\x8c\xe7\xc2\x7f\x96\x16\xd7\x36\x9f\xdc\x09\x04\x45\xe8\x8e\x04\x55\x1e\xe1\x5b\x59\x8f\x79\x0d\xaf\x15\x81\x3e\xe9\x4e\x43\x22\x22\xfc\x14\xbc\x39\x57\xc5\x18\x7b\xcd\x98\xa1\x3c\xf5\x5c\xd8\xce\x13\xaa\x3f\xe1\xcf\x60\xcc\x00\xc5\x13\xd0\xb5\x18\x09\x7f\xcc\x8d\xcd\x7e\xdf\x8e\x03\xc7\x21\x87\x16\x81\x45\x72\xdb\x1a\xd9\x95\xea\xec\xb1\x38\x10\xd6\x5e\x41\xde\x87\xf1\xd4\x1f\x3f\x47\x1c\x68\x82\x8b\xcb\x4b\x59\xd5\xb0\x7b\x29\x61\x82\xfd\x9a\x34\x0f\xe3\x30\x70\xa1\xf3\xe5\x66\xf3\x19\x15\x07\x8b\x43\x6e\x49\x91\xe1\x08\xd5\x33\x14\xea\x32\x25\xf5\x9e\xb6\x57\x01\x0c\x15\x10\x6c\xd9\xd8\x8c\xaa\x39\x8b\x89\xb6\xb0\x24\xbb\xde\x2c\x2b\x61\x50\xe5\x60\x2c\x87\xe7\xda\xd2\xc8\xc2\xf7\x3c\x76\xfa\x06\x9a\x91\x4a\x7f\xdb\x42\x19\x0b\xc9\x39\x9d\x06\x02\x83\x57\xd7\x01\xd6\x6d\x87\x58\x85\x33\x0a\x26\xc5\x54\x04\x29\xf4\xcc\xb8\xfe\x53\x30\x25\x30\xf0\x2a\xcf\x97\xdd\x4b\x76\x1a\xd6\x64\x76\xa5\x99\xe3\x0b\x31\x80\xc4\x46\xb8\x5d\xcc\xa6\x44\xa6\x3c\x84\xa7\x7f\xb6\x27\xc5\x71\xcc\x70\xd5\x87\x5f\xa7\xac\xc2\xc9\x3c\x04\x67\xc4\x09\x0d\xfa\x4a\x27\x9b\x19\xf8\x99\x35\x2f\xe5\xb9\xb9\x05\x95\x1d\x85\xc7\x29\xb7\x2d\x01\x43\x1e\x37\x65\xa1\x5f\x33\xf5\xfa\x97\xdc\x32\x23\x8b\x2f\x4e\xa9\xd5\xcc\x2e\xab\xec\x39\x2b\xda\xe9\x32\xe9\xca\x34\xb5\xc0\x64\xa4\xcb\x2e\x34\xfc\x02\x6d\x85\x20\x3e\xe2\xba\x9d\x9c\x6e\x34\x6a\xa1\xf8\x6a\xd8\xa8\x43\x2e\xb3\x98\x03\xc3\x59\xef\x45\x58\xb7\xed\x72\xd6\x75\x01\x37\x0c\x31\xad\x27\x1b\x91\x1c\x97\xbd\xb7\x87\x55\x20\x3b\xf0\xd2\xa7\x3b\xc8\x79\x44\x2b\xe8\xce\x17\x24\x4e\x9d\x3f\xd2\x1c\xae\x10\xe9\xae\x91\x8c\x22\xe5\xec\xb3\x43\x05\xaa\xac\xf4\x61\x20\x81\xc6\x62\x19\x93\xb4\xe7\x0c\xbb\xf1\xa3\xcd\x57\xb9\x55\xd3\xcb\x29\x40\x4f\xae\x02\x2b\xc0\x7d\x50\x98\xbf\xfb\xad\x9d\x2d\x56\x52\x05\x6e\x67\x77\x39\xdd\xae\x4c\xc6\x49\x83\xf7\xb4\x93\xff\x6f\xc9\xfc\x58\xb3\x90\x78\xcb\xfb\x0d\x2a\xf1\x6c\xb7\x65\x1b\x8d\x18\xbf\x82\x96\x21\x72\xf6\xf8\x34\xc2\xa7\x98\x71\x16\x43\x04\x58\xec\xbc\xbf\xb9\xa7\xfd\x56\xef\x0f\xb2\x18\xb5\xfe\xdb\x51\x77\xc6\xb0\xde\x5d\x56\x0c\xd9\xe7\x7d\xbb\x18\x30\xcf\x9a\x15\xba\x0f\x8f\xc4\xa0\x09\x46\x55\x35\x78\x9d\xa4\x6e\x6c\x98\x40\x5b\x75\xbe\x4a\x14\xe7\x1c\xd5\x63\xbb\x43\xc0\x70\x6b\x2f\xca\xc6\x2a\x43\xcd\xef\x2c\xb6\x75\x12\x06\x16\x6b\x3c\x50\xe1\xc0\x5a\xe6\xcd\x30\x2f\x3f\x1f\x4b\x49\xc2\x90\xeb\x89\xde\xf3\xf2\xc5\x3e\xcb\xa4\x21\x67\x88\x45\x3e\xf4\x9b\xbb\x93\x6f\x40\xcf\xfc\x9a\xe6\x85\x25\x51\xaa\x03\x47\xe9\x82\x96\xfa\x07\xd9\xae\x24\x32\x36\x6c\xe7\x97\x27\x9b\x27\x1c\xb7\x21\x09\xc1\x7c\xef\xfd\xcd\xd3\x0e\x59\x68\x7d\x40\x6f\x7e\xab\x48\x88\x20\x96\x14\x79\x7b\xd8\x2d\x17\x9e\x4d\x96\x25\x44\xd9\xdd\xfe\x1d\xa3\x99\xfb\x0f\x2e\x32\x79\x40\xaa\x0c\xfa\xf2\xf7\x9b\x1f\xab\x7f\x6d\xbe\xdf\x6d\x9e\x56\x3f\x56\x4f\xfe\x92\x31\x55\x69\x9f\x65\x75\xdb\xf8\x16\xaa\xd5\x04\x58\xcf\x92\x98\x01\xef\xfd\xbc\x07\xe8\x4a\xa7\x27\xf7\x8b\x85\x25\x65\xbe\x66\x53\x06\x4b\x90\x72\x9b\xd5\xa7\xf3\x07\x84\xd0\x2c\x89\x65\x82\x7d\x35\x64\xa4\x75\x93\xef\x83\x2f\x90\x40\xea\x78\xe1\x6a\x3b\xe0\xb2\xe6\xf2\x3d\xeb\x56\x90\x24\x95\x96\x49\x70\x59\x56\x90\xe7\x56\x02\xe6\x93\x30\x4a\x92\xea\x88\xba\x92\x85\x0d\x66\x6b\x6a\xac\x18\xa9\x07\x1c\x87\x13\x1f\x38\xe1\x9c\x63\xf4\x60\xf9\xed\xa7\xbf\x2b\x17\x0a\x6b\x46\x74\x21\xc8\xa4\x27\xb9\x31\xb8\x35\xda\xcf\x78\x93\x97\xcf\x7e\xab\x49\x64\xa0\x31\x1a\xe7\xa0\x4f\x1f\xa6\xfc\xc3\xf1\x5e\x97\x48\xd0\x48\xc2\x6b\xe9\xc5\x1f\x40\x67\x62\x2b\x2e\x43\xb7\x2e\xd1\x41\x88\xb5\xeb\xbb\x73\x79\x84\xe2\x41\x54\xaf\xaf\xa2\x3f\x46\x31\x72\x24\x6c\x85\xe4\x95\x9d\xeb\x9b\x29\x5b\x80\x01\x85\x2d\x4c\xd9\x41\xb7\x20\x24\xa0\x43\xd9\xc9\xe5\x76\xfb\x7d\x62\x5c\x78\xd1\x4e\x0e\x5f\x23\x80\xd0\xf1\xba\xdd\xff\xc7\x03\xdf\x70\xc0\xad\x52\xf8\x30\xd5\xfc\x18\x31\x00\x9e\x75\xbf\x9d\xc6\x65\xe1\x44\x73\x11\x62\xba\xbe\xa2\xa8\xb7\x67\xa5\x61\x10\x0c\x34\x8b\x5a\x33\xba\x80\x49\x26\xf3\xd3\x35\x3c\x0d\x03\x8d\x16\x9c\x38\x9d\x7a\xfe\x41\x96\x86\x69\x10\xd8\x9a\x0e\x6b\x31\xad\x8b\x21\x56\x20\x0d\x25\xa4\xba\x67\xa3\x77\x01\xdf\x11\x14\x21\x8d\x22\xe6\x25\x6c\x16\x4d\x79\xdc\x95\x93\xe2\x34\x6f\x0c\xa5\x11\xa1\x88\x71\xfc\xbe\xbb\x3d\x6c\xbf\x3f\x2d\xbf\x2d\x76\x2b\xa7\x89\x7c\x78\x5a\xfd\xe3\xfb\xfa\x69\xfd\xf8\xf5\xe0\x79\x4a\x59\x1a\xa9\xc0\xca\x4a\x36\xa2\x6a\x1e\xca\x42\x54\xea\xe5\xd2\x6e\x03\x43\xaa\x09\x96\x46\xda\x16\x65\x9f\xa0\x32\x65\x75\x74\x1c\xcb\x8e\x68\x69\x00\x1b\x4d\x49\xc0\xd0\x36\xcc\x6a\x4f\x82\x8b\x04\x92\xdd\xe1\xc8\x18\xab\xfd\x6e\xb7\x2c\x04\x4d\x0f\x86\x43\x4a\x48\x88\x76\xfe\x7e\x73\xdf\xfd\x94\xa6\xb8\x02\x61\xd8\xe6\xb0\x79\x5c\x1d\x6e\x56\xfb\x61\x41\x38\x4b\x29\x31\xda\x43\xfc\x35\x8e\x9d\xf1\x8c\x4a\xa9\xa2\x86\xf7\x39\xd4\x37\xf0\x4e\x50\xf7\xe0\x8c\x73\x2c\xc9\xd8\xfd\xe3\xc9\xa2\xda\x0e\xb7\xab\xe5\xfa\x61\x71\xef\xa3\x21\x69\x1c\xdb\xca\xc5\xac\xb6\xc1\x4e\x98\xa0\x32\xd2\x98\x0b\xc4\xbd\x99\xaa\x3c\xfe\x18\x22\xf0\x59\x9a\xf0\x00\xf3\x92\xed\x12\xe4\x3a\x0f\xe7\x5e\x57\x74\xd1\x3a\x6e\x37\xf0\x6f\xa8\x7c\xca\x33\x4d\xa3\x28\xb1\x86\x4a\xdd\xa0\x6d\xd4\x6e\xdb\xb3\x71\x89\x34\xe5\xda\x53\x0f\x3f\x88\x5f\xf7\xa5\x7a\x1d\x90\xd7\xf4\xcf\x97\x4a\x8e\xc1\x3d\x5b\xbe\xe6\xd4\x54\xbb\x82\x1c\x96\x8a\xd4\xd0\xc4\x95\x38\xdc\x9d\x9b\xb3\x87\xed\x7d\xcc\xae\xc6\x52\xc9\x84\x90\x3d\x7b\x5d\x56\x3c\xcf\xb6\x9e\x9c\xa5\x45\x04\xa4\xb7\x2b\x4f\x83\x94\x4b\x0a\x51\x84\x94\xed\x07\x79\xbe\x6c\xcf\xcd\xbe\x44\xc6\xc5\xbf\x32\xa6\xc6\x1d\x02\x94\x6a\x4b\xcc\xf5\xcf\xc3\xdd\x6a\x75\xd8\xae\x9e\x96\xab\xc7\x76\xfc\xf8\xbb\x98\x28\x45\x1e\x8f\x73\xd1\x76\xda\x65\x8d\x25\x7f\xcd\x65\xd2\x63\x86\xc6\xbe\xf0\xed\xdf\xfb\x3f\x90\x73\xcf\x0f\x18\x1e\x70\x8d\x48\x9e\xfa\x54\x81\x18\xbb\xb7\x3c\x00\xaa\xad\x82\xe7\x8d\x35\x69\x06\xc9\x4b\x1e\x32\xc9\x07\x8c\xd3\x6d\x1f\xfb\x79\xce\x23\x42\x11\xe5\x6f\xb2\x37\xf8\x56\x9e\xab\x3e\xe2\xc9\x23\xa2\x10\x26\xe0\x98\xad\x3e\xf2\x31\x26\x19\x71\x1e\xe9\x38\x4d\x7a\x5e\x26\x5b\xcb\x7f\x1e\x42\x84\x78\x64\x54\xe2\x2c\xec\xfb\xb2\x69\xa0\xba\x78\x24\x89\x6b\x40\x13\x8d\xf1\xa2\x7f\xfe\xfd\xef\xdd\x4f\x90\xa2\xdf\xe0\x93\x5c\x1f\x33\xf8\x33\xce\x42\x3b\xf8\x73\x30\x0d\x9b\xec\x75\x9c\x85\x80\x40\x27\x5d\xe6\xb9\xa8\xf6\xe5\x7d\xf9\x06\x97\x9e\x14\x9b\x71\xa4\x00\x73\xdd\xf5\xe9\x3e\xcf\x63\xc6\x3b\x41\xf6\xd6\x67\x1b\xe5\x24\x78\x12\xcb\x80\xf5\x44\x9e\x43\xc0\xc9\xe4\x91\x92\x34\xf0\xb0\xeb\xf7\xbe\x0a\xfe\x46\x34\xea\xe5\xcb\x55\x98\xdb\x9f\x03\x5c\x77\x32\xdf\xc7\x53\x03\x07\x12\x8f\xd2\xb7\x3c\x31\x04\xb9\xa3\xec\xee\xf2\x84\x9e\xcc\x54\x42\x78\x92\x17\x98\x31\x3e\x78\xaa\x58\x62\x8b\x09\xdf\x40\xe4\x87\xd6\xe7\xf9\x3c\x4e\xe3\xcf\x33\xa9\xf2\x59\x6a\x1f\xb1\x1d\xbf\xb6\x50\x01\x77\x49\xc3\x85\x4d\x73\xad\x75\x7d\x73\x99\x92\xae\x8d\xdf\x5b\x06\x14\x8b\xeb\x2e\x20\x86\x83\x55\x06\x80\xa1\xdc\xe7\xec\x0d\x6e\x84\x7a\xfd\x60\x3f\xe7\x32\xd4\x18\x06\xb4\x7e\x49\x53\x56\x60\x6b\x14\xae\x90\x29\xbe\x7d\x9c\xe0\xb0\x5b\xd7\xe8\xaa\x6f\x45\xe5\x88\x45\x26\x43\x01\x98\xcd\xdb\x3a\xa6\x6a\x84\x72\x76\x30\x68\x0e\x2a\x75\x4c\x33\xed\x9c\x18\xd1\xd4\x31\x0e\x9a\x10\x27\xc6\x35\x9e\xd4\x26\x60\xda\x4a\x62\x16\xfb\x4a\xe8\x89\x87\xc4\x8d\x8c\x4d\x2f\xc4\xd4\x4b\x05\x8c\x1f\xcc\xe8\xc4\x4b\x1a\xfc\x0b\x44\xb5\x29\xbc\xea\x44\x36\xdd\xb3\x44\x10\xa6\x94\xd9\xba\x01\x35\x75\xbd\x45\xc0\x08\xe9\x82\xdc\x58\xf6\x5c\xb8\xb9\x3b\xca\x5e\x88\x30\xe2\x18\x2b\xdd\x67\xbf\xcf\x17\x36\xee\x4b\x41\xe2\x04\x1d\xb0\x02\xde\x6f\xb3\xe7\xac\x11\x79\xb7\x71\x8c\xd3\x59\xde\xda\x15\x24\xb1\xaa\xae\xcd\x88\xb3\xc9\x1f\xe4\x16\x6b\xbf\xfa\xff\x48\xfb\xb3\xe6\xc6\x71\x6c\x5b\x1c\xff\x2e\xf7\xa9\x1e\xfa\x81\x20\x89\x81\xff\x37\x59\x96\x33\x75\xd2\x53\x5b\x72\x66\xd5\xed\xe8\x50\x60\xd8\x90\x79\x4c\x91\x3a\x24\x65\xa7\xfb\xd3\xff\x83\x1b\x00\x27\xc9\x99\x75\x7e\x37\xa2\xa3\x9d\x25\x82\x33\xb8\xb1\x87\xb5\xd7\xfa\x09\xb5\xce\x1b\x98\x50\x73\x51\x99\xd8\x34\x88\xa1\xe0\xe2\x28\xcf\x04\x7c\xa9\xa4\x89\x6b\xb5\x45\x37\x6a\xd3\x02\x1c\xc2\xde\x54\x0a\x54\x8e\xbc\xfe\xfa\x7c\xb5\x85\xa6\x8d\xe2\x7e\x8b\x71\x1d\xbd\x9b\x23\xec\xcb\x7c\x29\x9b\x06\xb1\x6d\x07\xd9\xe6\x5a\xf6\x83\x2c\x47\xca\x0f\x94\xf1\x4d\xe9\xec\x85\x30\x25\x7a\x9c\xb5\x2b\x7e\x9d\xc6\x62\x52\x7e\x94\xa0\x31\x7a\xda\xb5\x2c\x4d\x75\x98\x7c\x9b\xb3\xd6\x54\x2a\x33\x96\xa2\xb0\xd4\x10\x75\x2e\x6e\x6f\xff\xfa\x5d\xa1\x54\x66\x3c\x4b\xe5\x80\x50\x9f\xbf\xd7\xfe\x3d\x64\xd2\xe9\xc3\xd9\xee\x76\xee\xaa\xb2\x09\xb2\xb4\x17\x48\xce\xa8\x94\x42\xe2\xb3\xbb\xc9\x0b\x68\x3e\x9a\x76\x78\xaa\x2a\x21\x29\x84\x8a\xba\xe9\x73\x1b\x71\x3a\xbe\xab\x71\x73\xce\xa0\x23\x71\x1a\x18\x14\xa9\x34\x3c\x13\xb6\x4f\xd5\x3c\x55\x6a\xc6\x83\x4d\x25\xb0\x28\x01\xdf\xcc\x7f\x31\xf5\x77\xd1\xf2\x4b\x90\x2e\x4b\xee\x80\x27\x85\xcc\x0f\xb3\x57\x07\x86\xa1\xeb\xb3\x39\xba\x95\xed\x3c\x75\x36\x1d\x6f\xa9\xc6\xae\x40\x30\x79\x7b\x26\x23\x3d\x1f\xab\x48\x6c\xbc\xb8\xb1\xba\x43\xfc\xd4\x4d\x55\x6f\x5a\xb9\x0a\x65\x1a\x69\x01\x10\xaa\x12\x32\x36\xdf\xfe\x5a\x0e\xb8\xcf\xde\x33\x90\xd6\x52\x0c\x91\x0e\x58\x35\xea\xdb\x19\xfb\xb5\x50\x5a\xcb\x31\xff\xe4\x83\xf1\x33\x9c\x91\x8a\x32\xed\x90\x18\x1f\xa7\xe6\xec\xbb\x51\x84\x08\x07\x3b\x68\xe5\x2b\xbc\x60\xb9\xa5\x79\xac\xaa\x62\x5a\xa9\x54\x24\xa6\x88\xb5\x0d\xf9\x83\x55\x5d\x9f\x67\xc8\xc2\x58\x29\xb1\x65\xd4\x91\x9b\x6c\x02\x46\x46\xc5\x89\xc5\x0c\x05\xe8\xaa\xf4\xab\x36\x2a\xe3\xf5\x27\x89\x95\x8a\x82\x08\xf9\xcd\xf3\x7d\x08\x48\x54\x12\x6b\x91\x04\x27\xb4\x8b\x21\xc7\xc0\x09\x95\x70\xa7\x48\xe7\x99\xd4\x3d\x52\x32\x09\x9b\x53\xdf\xf7\xfe\x15\xe4\xdb\xc7\x6d\xde\xc2\x08\x3d\xaf\x52\x1b\x23\x1b\xf3\x5b\x20\xc6\x6d\xa6\xc4\x4d\x9f\x9a\xc3\xf3\xa2\xb4\xa2\xa0\x59\x1a\xf0\x0f\xd0\x17\x12\x15\x8b\x8d\xf6\xcd\xc8\xdb\x97\x1a\x9a\xaa\x98\x39\xe1\x8a\x81\xc6\x48\x1a\x4a\xb3\x94\x45\x71\x91\x56\xe9\x93\x35\x5c\x31\x70\x08\x6c\x59\x14\xd5\xbb\x2b\x89\x5d\x5c\x26\x15\x8f\x22\x19\x58\xea\x16\xb7\xab\xa7\xa1\xbd\x51\x71\x92\x60\x1f\xf3\x4d\x01\x3f\xf3\x5e\x3f\xef\x77\x3c\xe8\x54\xf1\x98\x29\x27\x0c\xf0\xdf\xa7\xa6\x3d\x63\x3e\xeb\x06\xd8\x24\xf4\x99\x55\xe5\x3e\x6f\x4f\x06\xfa\x93\x72\x1a\x44\x25\x6f\x60\xde\x4e\xa1\x44\x4a\x28\x0c\x60\x92\x49\xe4\xa9\x04\x8b\x30\x94\xdf\xb9\x39\x1f\x7a\x02\x2e\x87\xf0\x4a\x80\xc5\x43\x3d\x37\x1e\x92\xe9\x7f\xcf\x92\x08\xdf\xfd\x21\x2f\x27\xeb\xa3\xca\x68\x2a\x4d\x2f\x35\xdc\x8e\x83\xb2\x7e\x88\x72\x3a\x86\x8f\x7f\xde\x4e\xf9\x87\x3e\x89\x41\x66\xef\x22\xd3\x32\x1d\xb3\x31\x2e\x83\x69\x1b\xae\x5a\x12\x27\xbf\xf6\x5d\xde\xcf\x1e\x8d\x4c\xd2\xc4\x86\x96\xc5\xfa\x15\xda\x31\x68\x53\xa9\x24\x75\xd2\x08\x18\x64\xaf\x0e\x79\x33\x15\x16\xa4\x4a\x47\x36\x1a\x64\x49\xbb\xf7\x32\x6e\xdd\x0e\xeb\x4c\xf2\xef\xd9\x44\xd3\x82\xc7\xee\x33\x2b\xcb\x1e\x2f\x0a\x33\xdf\x4f\x69\xe9\xa4\x7e\x5e\x64\x61\x47\x5e\x8c\xdf\x6a\x4c\x8a\xeb\x7c\x65\x2d\xd4\x4b\xd9\xfa\x42\xd9\xb6\x9a\x6b\x42\x5c\x0c\xe1\x14\x10\xa7\x0c\xf5\x96\xc3\x7b\x1a\x56\x71\x65\x13\x83\x8c\xfb\x0f\x58\xe6\x1e\xa7\xaf\x94\xa5\x8c\xb2\xa0\x92\xd7\x39\xfe\xbd\xfa\x49\x3f\x02\x28\xb6\xb8\xe9\x17\x3b\x0a\x30\x74\x44\x12\xf4\xb3\x74\x75\x3a\xf6\x96\x46\x47\x82\x18\x9f\xde\x45\xdf\x69\x72\x75\x3a\x92\xd4\x95\xaf\x8f\x47\x28\xcd\xa6\x3a\xd5\xfa\x82\xe8\x46\x58\x88\x35\xe1\x69\x62\xb0\xef\xee\x61\x33\x7d\xf7\x9a\x00\xc3\x9c\x91\x2b\xcd\x5d\x0d\x18\x54\x1d\x47\x42\x3a\xd7\xed\x00\xd7\xa0\xe5\x47\x08\xae\xaf\xd0\x2c\xd6\x53\xc0\xe3\xdf\x8b\x8c\x75\x2c\x9c\xeb\xf4\x1f\x38\x35\x23\xe3\xa8\x63\xe9\x74\x17\xa5\x31\xff\x3c\x49\x17\x0b\xff\xa6\xea\xef\xf7\x4c\x12\x86\xcd\x14\x87\x4a\xbf\xee\xc6\x6a\x8d\xbf\xd9\x2d\x73\x72\x0e\xbe\x6c\x53\xc9\xda\x3c\x94\xcf\xcd\x67\x29\x6f\x9d\x72\xc1\xf8\x39\xa9\x69\x55\x2f\x8b\xea\x64\x42\x72\x1d\x15\x80\x66\x77\xde\xbf\x85\x54\x0a\x94\x86\x78\xcb\x03\x72\x51\xa7\x2a\x46\x66\x83\xe3\xa9\x79\x71\x91\x47\xbf\x45\x53\x44\x71\x2e\x65\xdd\x7e\xe8\xdf\xa4\x84\x75\x0a\x1c\x8b\x01\xee\x4b\x5c\x60\xf9\x76\x36\x65\x58\x44\xa3\x28\xe4\x24\x0f\x32\x2f\x7d\x90\x35\x9b\x0f\x2c\x4e\xb0\x5c\xa0\x72\x73\x96\x62\xd7\x2c\xd5\x9e\x10\xa9\x81\x09\x19\x2c\xd5\x3c\xe3\x1a\x82\xd4\x61\x79\x6a\xbc\x0e\xe4\xf4\x1a\x78\x66\x53\x07\xe0\xff\xd8\x56\x2b\xa7\x93\x70\xae\x61\xef\x07\x0b\x42\x31\x1f\xec\x08\x64\x1c\xa3\x51\xbf\x49\x22\x9c\xb9\x06\x9d\x1f\x73\x28\xdb\xce\xc9\x97\x79\xd9\x7f\xfd\x5a\x68\x86\x08\x97\xd6\x49\xd3\x9c\x8e\x9d\x6d\xe8\x2f\x36\x4b\xad\x43\x10\x15\x55\x03\x81\xa3\xef\x6c\x29\x9c\x4f\xa4\x91\xe9\xd3\x19\xc4\x59\xf7\x34\xaf\x1f\xd6\xe1\xa0\x32\x8b\x91\xe1\xc4\x05\xd8\x57\xdd\x22\x79\xb6\x4c\xfc\xe3\x12\x60\x47\x4b\x6d\x24\x1d\xb8\xb8\x90\x3b\x08\xdb\xbd\xde\x7a\x54\xb4\x56\x84\x62\x5b\xe0\x0f\x50\xbd\x50\xdd\xa7\x33\x4d\x31\x82\x90\xb7\x55\xdb\x63\x15\x2e\x52\xd7\x52\xad\x53\x08\xf4\xe3\xd3\x2a\x92\xdf\x6e\x88\xeb\x03\xfb\xb2\x70\x02\xcf\xe1\x72\x80\x38\x03\xd4\x53\x17\x4e\x2c\xfa\x27\xdf\x1c\x24\x8e\x1e\xb3\x5b\x86\x4f\xa5\xb9\x38\x45\x80\x66\xa8\x21\x65\x8b\xea\x3d\x2f\xf7\x5f\x65\x5e\x4f\xdd\x43\x0d\x9c\x21\x0b\x96\x05\xaf\x9c\x8a\x9e\xce\xcb\xd0\xa7\xa9\x2d\x89\xb0\x4d\x34\x30\x67\x20\xbf\x95\x6f\x94\xf8\x04\x9c\xa8\x6d\xc6\xb2\x31\x17\xe3\x13\xbc\x41\xdd\xc0\x2f\x41\xec\x7f\xc7\x69\xd2\x56\x0a\x4c\x5d\xeb\xa2\x9b\xa8\x07\x59\xca\x7d\x3f\x4d\x4d\x14\x39\xdf\xbd\xc9\xf7\xe5\xe9\xd8\x99\x9f\x0b\x82\x53\x73\x73\x6e\xa2\x54\x60\x43\xe4\x0e\x3b\x8e\x31\xc9\x34\x39\xa7\x21\x89\x03\x04\x34\x2f\x72\x67\x64\x2b\x77\xfb\xba\x3a\x1d\xff\xe8\xcb\x43\xe3\x3b\x37\x84\xc7\x98\xbd\x7d\xf8\xba\x1c\x15\xc1\xff\x96\x39\xef\xf6\xc5\xbe\xec\xe5\xd3\xc3\x8f\x6b\x24\x4a\xed\x05\x23\xa8\x21\xca\x65\x41\x9b\xca\xb6\x4b\x79\x1c\x03\xdb\x0d\xd1\x54\x7b\x94\x07\x92\xf8\x38\x7e\xe9\xfe\x0b\x35\xc4\xf2\xcc\xe9\x6c\xe4\xfb\x3d\xd4\x9b\xd7\xdc\x7b\x2d\x49\xfc\x2f\x42\xfe\xfd\xaf\xc4\x73\x9a\x89\xd1\xbf\xd2\x7f\xff\x2b\x21\xfd\xcf\xff\xc6\xff\xf5\xff\x4d\xff\x3d\xd9\x8f\xb0\xc9\x7f\x26\x71\x37\xda\xff\xe2\x2f\x21\x16\x16\x89\xc6\x75\x55\xda\x7c\xff\x0b\xb6\x6a\x3f\x3e\xe1\x4e\xa8\x75\x1a\x9e\xff\x2f\xf2\x1d\xff\x5f\xff\x86\xf3\x67\x4a\x7b\x03\xbf\xda\x7e\xc5\x4b\x78\x3e\x1e\x1d\x7f\xea\x2c\x0a\x30\x69\x46\x43\x9f\xcb\xaa\xc4\xcc\xfe\xf5\x99\x47\x6d\x28\x95\xdc\x21\x46\x5d\xdf\xd7\x42\xeb\x33\xf9\x6d\x6a\x28\x33\x98\x79\xdc\x49\x53\x1d\xdb\xc5\xcf\x7c\x06\x14\x16\x9f\x4c\x1d\x9a\x51\xe3\x18\x95\x5d\xe7\xf4\x2f\xa5\x7f\xa8\x61\x4c\x07\x6d\x42\xe7\x89\x62\x26\xe0\x47\x55\xbf\x42\x7d\xac\xaa\xe2\x42\xd5\xc5\x30\xae\x90\xff\xf0\x0a\xf6\x79\x39\xc9\x86\x1a\x66\x22\xec\xe0\xfb\x73\x7d\x3d\xf6\xe2\x0c\xb3\x09\x3e\xc4\x2d\x14\x70\x7c\xe9\xa5\x7c\xa9\xe1\xb1\xc4\xaa\xb1\x7b\x14\x9d\x6f\xf7\x3c\x4b\x26\x1a\x4e\x33\xfc\x98\x7b\x00\xd5\x6a\xfb\xf5\xba\x1e\x8c\xa6\xe1\x59\x8c\x6c\x2a\x07\x6c\xbb\xdd\x42\xf9\x58\xc8\xb6\xdf\x68\x01\xdb\x0f\xba\x60\x69\x80\x09\xd3\xb0\x59\x28\x85\x19\x4d\xd5\xdd\x0b\x8a\x90\xf9\x0d\x59\xcc\x5d\xf4\x22\x3f\xb0\x0d\xa5\xad\x5c\xa7\xd5\xec\xe2\xa4\x8e\xb8\x53\xbf\xd0\xa7\x1a\xcc\x7d\xd5\x93\x69\x53\x23\xad\xb3\xa8\xd8\x0e\x80\x45\x01\x97\x2f\xfd\x35\x9e\xd0\xef\xac\x52\x97\xb6\xed\x1c\xd5\x87\xcd\x85\xb4\x82\xd1\x89\x03\xc4\x5e\x2f\xbe\x0f\x9c\x9d\xd4\x18\xc2\x50\x01\xb1\xb7\x39\x08\x0e\x22\xb3\x77\x68\x28\x4f\x75\x28\x10\x4e\x3b\x13\x8d\x11\x04\x0b\x07\x4a\x61\xa4\xde\x2d\x72\x75\xe7\x28\x58\xeb\x97\x96\x30\x4e\x67\x58\x94\xec\xbc\x1e\x87\x23\xaa\x9b\x76\xee\x9e\x1b\x88\x85\x04\x8f\x72\xba\x92\x66\xde\xcb\x63\x80\xca\xc0\x42\xe6\xcb\xb9\x2b\x4f\x52\x17\x06\x64\x1c\x7d\xd8\x87\xab\xa7\xdd\xb5\x57\xe2\xe8\xb7\x29\x61\x9d\x46\xc8\x3c\xfa\x32\x36\x49\xb1\x59\xa3\x00\xdb\x3e\xbc\x85\x26\xaa\xb0\xa3\x55\x69\x12\x79\x22\x4c\xf2\xc7\x74\x47\x9d\x61\x7a\xad\xc8\x0f\x79\xeb\x4a\x65\x8f\x50\xff\x05\x32\x2c\x2f\x10\x49\x07\x36\xea\x62\x62\x47\x35\xe1\xc5\x4f\xc6\x0d\x43\x40\x78\x8c\xbd\x02\xb7\xd5\x7e\x83\x92\x9e\xfb\x51\x5d\xf4\x12\xa7\x5d\xb7\x0b\xc5\x28\x7e\x2b\x6b\x93\x87\x6b\x85\x98\xa4\x4e\x44\xab\x7b\xbe\x58\x80\x5f\x56\xcd\xa1\xf2\xc8\xca\x31\xb8\x0d\xe2\x24\xf2\x31\x37\xf4\x9d\x84\xd3\x19\x0b\x09\xd7\xd8\xd7\x66\x7c\xc8\xfd\xe4\x8a\xd3\x6b\x1d\xa2\x6a\x48\x84\xc5\x76\x59\x2d\x4b\xaf\x6d\x82\x6b\xec\xfc\x38\x36\x1a\x38\xde\x46\x7c\x95\x14\xd2\xc8\xc9\x9f\xfb\x06\xfb\x16\xce\xb8\xa2\xc2\x64\xf7\x8a\xaf\x14\xd2\x94\x63\xe3\x1e\x36\x3b\x9c\x65\xe6\xc2\x20\x96\xf2\x01\x32\x14\x72\x52\xc0\x88\xc1\x09\x5f\x05\xd5\x89\x66\x5d\xfe\xf3\x04\x73\x42\x03\x60\x8a\x20\xfc\xe2\x2d\xd7\x6d\x55\xe7\x70\x3a\x74\xce\x6f\xae\xc7\x86\x0a\x98\xd5\x48\xb5\xe6\xcb\x49\x3b\xdb\x37\x17\x02\xcf\x4c\xec\xbc\xe3\x7d\xa0\xa4\xa5\xc0\x25\x63\x49\xa0\xf0\x7d\x47\xfe\x2e\x0d\x8f\x50\x6b\x28\x5b\x39\x9f\xeb\xc0\x8d\x42\x3e\xce\x2f\x57\x13\x0a\x23\xc8\x38\x38\x11\xbc\xce\x71\xfe\x02\x25\x34\xc3\xdb\xcf\x74\x82\xb9\xbf\x77\x80\xd7\x31\x4b\x78\xb7\x45\xa2\x92\x42\x51\xed\xb1\x60\xd4\x5d\xec\x6f\x40\x83\x20\x89\xfb\x2a\x64\x5b\x1d\x72\xfd\x73\x02\x47\x00\x19\x6b\x6c\x75\xf8\x22\x0f\x70\x35\x4c\x2a\x15\xf3\x50\x2e\x5d\x20\x8f\x5b\xe7\x50\x4d\x52\x2a\xd3\xf7\xa4\xb4\xcb\xf5\x8d\x53\x1b\xb3\xcb\xd0\xa9\xc1\x96\x63\xd4\x3d\xb9\xcb\xcf\x26\x97\x66\x1c\x6b\x75\x5a\x96\x57\xbd\xc1\x01\x60\x22\x0d\xf2\x86\xb7\xd5\xbe\x1a\x7e\x97\x48\x1c\x3f\xf5\x7c\xa7\x2b\x1d\x80\xc9\x8c\x03\xb5\xbd\x41\xd1\xcd\x15\x27\x64\xee\xb7\xda\xd8\x11\xeb\xe4\x8d\x13\x2f\xa9\xea\xa1\xb1\x76\xd4\x67\x34\x3b\xa6\x05\x8a\x26\x78\x29\x8b\x7c\x7f\x2a\x42\xc1\xc1\x46\x89\x20\x2c\x70\xdf\x3e\xa0\x71\x9c\xa1\x72\xa7\xcf\xc3\x46\x2c\x8b\x26\x94\xe5\xa5\xb9\xad\xf4\x2b\xa6\x5f\xfe\xce\x72\x61\x23\x13\x61\x0e\xf8\x09\x9a\xdc\x9c\x64\x31\x61\xf4\xb8\x14\xdb\x5a\x92\xc4\xb8\x72\x1d\x1d\x30\xc5\x09\x71\x74\x5f\x56\x5e\x95\x43\xc9\xcf\x92\x54\xa3\xa1\xc4\x0e\xe2\x3a\xee\x7f\xa6\x91\x75\x1d\xa6\x8d\xee\x7f\x93\x89\xf6\x48\x7a\x19\x52\x90\xa3\x75\xc5\xc6\xc4\xa9\x17\x8f\x74\x90\xa7\xaf\xdd\xc6\x9d\x59\xf1\x86\x55\xbe\xc9\xed\xc7\x11\xcc\xb5\x6c\xe5\x40\x21\xfb\x59\xa3\xf1\xdf\x73\xe6\x6c\x2c\x62\xe6\xb9\xc2\x70\x2d\x5e\xcc\x32\xed\xdd\x34\x70\x12\x49\x98\xb7\x71\xca\xe6\xc3\x0d\x18\x8d\xb4\xfe\x5f\xaa\xd3\x55\x3e\xfc\x08\x98\x08\x94\x2a\xaf\x46\xac\x36\x36\xc9\x18\x46\x13\x47\xc4\xe6\xfe\x08\xcc\xbe\xfd\x66\x9d\x62\x43\xba\xaa\xaa\xd7\x7a\xda\x25\xe2\x47\xa4\x24\x41\x08\x95\x7f\x41\xc9\x0e\x2d\xed\x28\x99\x61\x53\x21\xb1\x84\xb7\x7c\xde\x6c\x1f\xee\x76\xab\xa7\x65\x1c\xed\xae\x9e\x9f\xee\x77\x9b\xd5\xd3\xf7\xf5\x72\xb5\xbb\x5f\xdc\x85\x14\xb1\xa5\x29\xa5\xde\xa3\x78\x94\x8e\x66\x60\x7a\x42\xca\x29\x6a\x4e\x1d\x7d\xe4\x3e\x4b\x0c\x5a\x2a\x9c\x77\x3b\xb4\x25\xe3\xda\xf3\x1b\xbe\x01\xbf\x1c\x5a\x26\x53\x6c\x6a\x3e\x54\x26\xb7\x1f\xbb\xfb\xea\xed\x74\xb8\x58\x7c\xb6\x5c\x48\xdb\xa7\x9c\xf5\xeb\x45\x23\x63\x45\xe4\xa9\x58\xa0\xbd\x92\x0d\x3c\x3f\xad\x27\x9e\xa8\x15\x31\x15\x2e\xd2\xf9\x58\xfd\x04\x7d\xb9\xce\x61\x05\xa3\x18\xa4\x41\x37\x64\x94\x88\xb0\x59\x6c\xe2\x64\x40\x6f\x75\xd3\xb8\x6f\xd2\x1d\xeb\x3a\x4d\x0f\x97\x51\xc7\x24\x1d\xd8\xe5\x9d\x74\xe6\x83\x7d\x3e\x6b\xc9\xb3\x92\x24\xbd\xd3\x7a\x38\x1d\x76\x26\xd0\x60\xfb\xed\x4a\x68\xac\x28\x9f\x9a\xce\xff\x3a\x95\x6d\xb3\xee\x23\x85\xe9\x49\x55\xc6\x1d\x0f\x69\x99\x77\xb1\xb5\x2c\xbe\xc8\x03\xf2\xf2\xe6\xc3\xc1\xb4\xc0\x9e\x39\x97\x0b\x5b\xb5\x2f\x33\xb2\xb8\xd9\x6d\x28\xeb\x58\x15\x1e\x65\xf7\xcd\xff\x79\x69\xf5\x16\x53\x63\x02\x24\x09\x95\x00\x47\xf0\xb7\xc2\xb6\xba\xcb\xef\x17\xb4\x42\x7c\xf9\x51\x7e\x6c\x5f\x3c\xbd\x49\xb8\x52\x9b\xa6\x91\x33\xfc\x9d\x2b\x59\x63\x6e\xf4\x79\x5d\x4e\xe9\x26\xac\x15\x54\x27\x7d\xfe\x3b\xd4\xcb\x7c\x9c\xce\xa2\x28\x92\x4e\x1a\xc8\xf7\x5a\xcb\x8f\xc3\x25\xea\xbb\xde\x97\x66\x51\x94\x58\x2c\x5b\x79\x8c\x20\x1c\x8e\x55\x2d\xeb\x8f\x49\xfc\xcf\xa2\x08\x5c\xa5\x18\x0a\x79\x6c\xc0\xdc\x55\x65\xfb\x82\xa0\xe5\xf5\xf2\x01\x5d\xbb\x3f\xc2\x40\x1b\xa5\x08\x43\xaa\x8b\xf0\x13\x49\x39\xf7\x1c\x24\x77\x79\x01\x4d\xdb\x05\x41\x97\x1e\x3f\x8b\x88\x91\x89\x5b\xe6\x4a\xa8\x7f\x87\xf6\x9d\xef\x0b\x8e\x82\xd8\x37\x06\x7d\x72\x86\x98\x6a\x64\x75\xe9\x6c\x6b\x0d\xa7\xc3\x65\x90\x3e\x8b\x62\x29\xf0\x9b\x6d\x4e\xfe\x16\xf7\x40\x9f\x37\xd7\xe1\x9e\x62\x1d\x21\xda\x6a\xf1\xb4\xba\x09\xbf\x25\x49\x8a\x89\x4e\xd4\xb3\xc1\x36\xbe\xb0\x41\xd2\xc8\x04\xfe\xac\x80\xf8\xb9\x7c\x79\x89\xd4\x88\x82\xb8\x87\xf7\xab\x93\xd9\x9f\xf7\x80\x85\x71\x2a\xb3\xd9\x84\xd2\xc0\x42\x5d\x8f\x5a\xf1\xa7\x77\x93\x0a\x07\x76\x1f\x57\xf1\xc2\xa6\x4c\xa2\x33\x5b\xe7\xa6\xa7\xa3\x65\x51\x2a\x5d\x5e\x55\xc9\xb6\x2d\xa0\x5f\xb3\xfc\x56\xc6\xb8\xf5\xf0\xbc\xeb\x4a\x0f\x05\x90\xf3\xbc\x26\x8b\x38\x95\xe8\x12\xbb\x2e\x2c\x4f\x03\x11\xb6\x89\x14\xbb\xf5\xbf\x54\x25\x6c\xeb\xfc\x78\x9c\x70\xfe\xb1\x88\x67\x44\x66\xfd\x64\xf7\xed\x74\xd3\x07\xc1\xa5\x13\x9b\x3c\xec\xaa\x77\x64\x2d\xe9\x45\x13\x58\xc4\x6d\x12\xa7\xe1\xb9\xdf\xe6\x1a\xca\xe6\xb2\x3a\x40\x37\x34\xc5\x04\x9f\x45\x8c\xe7\x05\x2a\x78\x16\x89\x34\x71\x15\xf7\xc5\x62\x3b\x58\x18\x16\x09\xc5\xcc\x80\xf7\xf5\x56\x73\x22\x6e\xe5\x07\x66\x22\xf6\x71\x75\xdd\x7e\x3c\xbc\x97\xcd\xa2\xb9\x54\x5d\x18\x7d\xee\xb8\x4f\x10\x15\xeb\x19\x9d\x90\x50\x3a\xb0\x50\x4f\x4f\x21\x19\xc3\x9c\xae\x3a\x79\xf6\xad\xab\x8f\x27\x2f\xec\xfa\xc9\x8d\x2b\xc5\x70\x9e\xf7\x0a\x6a\x9e\xba\x7f\x16\xee\xb3\x48\x99\xc4\xeb\xa8\x9b\x65\x55\x14\x52\x55\xf5\x58\xfe\x60\xf2\xea\x67\xd1\x1d\x8b\xb4\x72\x32\x83\x9b\xfc\xb5\x52\xb2\x5b\x4e\xf2\xf2\x54\x5d\xe8\xb2\x62\x91\x49\x9c\xfc\x76\x5b\xad\xfe\xdc\xbe\xcf\xb8\x85\x58\x04\x5a\x06\x42\xb5\x0d\x14\xc5\x12\xf2\x62\xf4\x35\x85\x41\xc6\x09\xad\x39\x99\x85\x11\x36\x99\x45\x60\x89\xb2\xc3\x0a\xeb\xf1\xff\xb3\x7b\xb5\xd4\xd1\xf4\x6b\x17\x95\x63\xa5\xa0\xbb\x54\xef\x33\x33\x12\x11\x0a\x93\x86\x8f\xb9\xef\x35\x7e\x89\x24\x4a\x05\xf3\xf4\x91\xab\xff\x96\x75\xfe\x74\x2a\xe0\x17\x40\xc7\xfe\x3e\x48\x44\x25\xce\xca\xeb\xfd\x4f\x14\x1e\xf2\x3f\x13\xc2\xa9\x2f\x9a\x1c\xab\xf2\x0c\xfc\x3d\x49\x17\x33\x42\x04\xc7\x2c\x44\x7d\x6a\x9a\x5c\x96\x1e\x30\x19\x36\x2a\x8b\x49\xb0\x45\x01\x35\x2a\x3a\x99\x91\x4f\x33\xac\x12\xa4\x8b\x11\x86\x0e\x69\xa4\xa7\xfa\x96\xb7\x03\xbc\x74\x3a\xab\x48\x9c\x31\x64\x78\xfa\x02\x6d\xb0\x4c\x9d\xc1\x7d\xb0\x97\x96\x45\x46\x62\xa9\x8d\x4f\x84\x6c\x34\x94\xb2\xce\xab\x06\x8b\xdd\xd3\x3b\x89\xa1\xef\x28\xfa\x01\xaa\xc9\xdb\xcb\x0d\x42\x8c\x24\x84\x63\x4b\xf5\xbb\xbe\x0c\x71\x61\x24\x49\x38\xea\xa3\x69\x9f\x23\xbc\x83\xa6\x91\x01\x4f\xc7\x48\xc2\x04\xae\xc5\x3d\x5a\xb2\xef\xe9\x9c\xd1\x2e\x30\x92\x08\x27\xd4\x1b\x92\xb4\x9f\x77\x30\x0c\x67\x4f\x3d\xe8\xaf\x6f\x72\xbe\x96\x1f\xe8\x94\x2f\x4f\xed\x6e\x3a\x97\x49\xe7\x0d\x77\x13\xfe\x7f\xe2\x70\x71\x8c\x30\xc4\x7d\x6e\xa1\x69\xbf\x3c\x2c\xb6\x63\x93\x49\x98\x96\xd6\x84\x26\x44\xac\x26\xde\xae\x67\x47\x64\x96\x07\x7e\xf9\xaf\x08\x2f\xaa\xaa\xc2\x8c\x94\xed\xfc\x30\x6e\x1d\xdb\xd3\xf6\xdb\xf5\xe4\x0c\x22\xd3\xca\x57\x8a\x6b\x54\xdd\x6e\xa1\x2e\xcf\x57\x9e\xd9\x2d\x67\x2c\x72\x32\xa8\xbe\xad\x0a\x9d\x06\x64\x7e\x9b\x25\x3b\xba\xa1\x9e\x02\x2e\xd7\xaf\xbe\x24\x38\x3f\x96\x6b\x19\x41\x82\x83\xfd\x95\x57\xd4\x46\x22\xc4\xc1\xed\x66\x44\x46\x86\x39\x53\x81\x19\x2a\x44\x51\x0d\xb0\xcd\x30\x28\x16\xf8\x30\x0e\x18\xb1\xc7\x11\x11\x43\x38\x18\x42\x16\x46\x64\x2a\x50\x69\x54\x9d\x3e\x16\xe6\x97\x6f\x78\x8a\xea\xf2\xbb\x2b\x62\x38\x2a\xf1\x5c\xf7\xac\x44\x8c\x28\x05\xc4\xa7\xd2\x8a\x93\x7e\xfd\x40\x2a\x83\xb0\x51\x6b\xc0\x09\x78\xfb\x10\xa4\x18\x19\xd1\x26\xc5\x2e\x33\x15\x92\x44\xab\xed\xd7\xd9\xa3\x83\x8c\xa0\xe1\x3b\xc8\x57\xe8\xb3\x07\x8c\x80\xa5\x8e\xa3\xac\xaa\x77\x83\x84\x02\x23\x96\x28\x2f\x48\x59\x9a\x8b\x78\xe7\x4f\xec\x92\x4d\x1c\x4d\xb8\xa7\x2c\xb8\x93\xaf\xbd\x81\x25\x16\x62\x47\x37\x86\x4f\x70\x46\xbe\xe2\xc6\xc4\x51\xe4\xe8\xfb\x03\x6f\xc7\x47\x75\xba\x88\xc6\x65\x71\x64\x08\x52\x4d\x17\xb2\x41\x18\x72\x01\x2d\x60\x35\xd3\x9f\x2e\x26\xcc\xf1\x59\x7b\xa9\x41\x04\x95\x9e\xaf\x2a\x31\x31\x16\xab\x3f\xab\xcd\xdd\xd5\x68\xf1\x8e\x63\xe3\x5b\x84\xde\x56\x65\xe3\x1b\xe4\x82\x71\x8c\x93\x58\x80\x4f\x63\x5e\xe5\xa6\x6f\xe9\x3a\x23\xa7\x9f\x58\xa9\x38\xe1\x84\x0e\x2c\x41\x3e\x8e\x7e\xac\x8a\x62\x76\x6b\x89\x50\x51\x3c\x86\xe5\x5e\xe8\x41\x63\x71\x1a\x29\x04\x21\x3d\x76\xcb\x4f\x9b\x97\xf0\x38\xe4\x1b\x59\x9c\xc6\xe0\x48\x61\x3d\x29\xcb\x04\xf9\xcb\xe2\x94\x3b\x8a\x17\xf7\x2e\xbe\xe5\xe5\xde\x8c\xfa\xcb\x2f\xcf\xdf\xc1\xe8\xc7\x29\xb8\x7e\xe1\x6e\x36\x5d\x6c\xc9\xec\xef\x99\x52\x8e\x32\x39\xd2\x85\x69\xcd\x73\x03\x97\x7b\x92\x58\x4c\xb9\x04\x8f\xcd\xbf\x79\xde\x6e\x87\x56\xe4\x70\xd1\x2c\xa2\x76\x58\xbc\x1f\xfa\x57\xc5\x52\xc3\x74\xdf\x13\xb2\x45\xd6\x9a\x99\x8b\x15\x33\x88\x31\x2d\x80\xfe\x7a\x3c\x74\xf3\x84\x63\x70\xce\x88\xaf\xa8\xdd\xe4\xb2\x75\x79\x89\x65\x55\xbe\x75\xab\x9f\xd9\x56\x73\x2e\x43\x16\x0b\x93\x22\xd0\xf1\x6a\xfb\xd7\xf2\x4c\x91\x6a\xbc\xca\xc7\xc2\xea\x28\x1b\xba\x20\x46\xe9\xe7\xbf\x2d\x42\xfb\x19\x4e\xe0\x57\x65\x42\x16\x67\x09\xc3\x09\xe7\x64\x90\x03\xbf\xf4\xec\x3e\x32\xcd\x30\xee\x59\xd4\xed\xd5\xf2\xb7\x61\x2d\x8e\x47\xaf\xd6\x54\x2b\x8c\xa7\xe6\x32\x55\x2c\xce\x80\x63\x2c\x7b\x5f\x29\x59\xff\x42\xc7\xce\x0f\x57\x31\x20\xdc\x0e\x13\x83\x4b\x59\x14\x46\xb6\x72\x29\xcb\x3b\xec\x42\x18\x09\x5f\xff\x63\x2e\x82\xcd\x62\x65\x00\x55\x77\x43\xfa\xe5\xee\x03\x45\x51\xa6\xd7\xa3\xac\xca\xfc\xb2\xb6\x28\x0a\x64\x43\xf1\x0c\x61\xc1\x36\xc5\x3a\xa5\x66\x4c\x41\xed\x60\xe6\xcd\x63\xdd\xc3\xb5\xbb\x31\x1c\xbb\xaf\x5b\xa4\xce\x99\xdb\x23\x2d\x1c\x35\x9e\x54\xd5\x1b\x6c\xe0\x0d\xca\x01\xe0\xc4\x62\x9d\x19\xec\xd7\x68\xa1\x69\xe3\xdd\x1b\xd4\x85\xec\x62\x9a\x7d\x80\x5e\xdc\xc3\xfb\x7d\x65\x86\x53\x49\x97\x69\xc1\xec\xd6\xf2\x43\x17\xc3\x16\xc5\x62\x6f\x1b\x66\x0a\x2f\xd3\xb7\xaa\x35\xc7\x46\xbc\x43\x5e\xfe\x80\xfc\xc7\xd4\x5b\xc1\xc8\xdf\x0f\x34\xa9\x43\xc0\xba\x8f\xca\x45\xec\xf3\x59\x39\xbd\x53\x63\x13\x2c\x0f\x2e\x1f\xee\x3c\xdd\x50\x38\x16\x64\xc6\x66\x03\xd3\x09\x22\x94\xc2\x26\x29\xf0\xe1\xad\x7e\x1e\x0b\x39\x58\x59\x2b\x23\x5c\x64\xcd\x65\x2a\xae\xb3\xa4\x2e\x4b\xa2\x14\x12\x2f\xdb\xe4\x13\x36\xe8\x2b\xcc\x5e\x47\x42\x44\x62\x9d\x68\x4c\xf3\x0a\xf5\xdc\x93\x48\x88\x10\x71\x34\x32\xb1\x9b\x77\x59\x1f\x30\xa3\x7a\x21\x52\x4d\xe2\x44\x21\xab\xc0\x15\xb8\xca\x5f\x7f\xfd\x49\xac\x08\xbe\xd7\xa3\xfc\xa8\xab\xa2\x98\x59\x9d\x24\x89\xd2\xc8\xbb\xaf\xd7\x95\x76\x99\xaf\x71\xd6\x86\x25\x89\xb4\x98\x7c\xfd\x0a\x45\x7e\x3a\xdc\x43\xfb\x5e\xd5\xaf\x13\x14\x0a\x4b\x12\xed\x28\x47\x1d\xff\xca\xf3\x71\x79\x56\x1a\x67\x49\x9a\x24\xc6\x83\x6b\x36\x6d\xa5\x5f\xe7\x9b\x19\xc5\xf4\xc9\x1b\x2a\xeb\x3b\xd3\x87\x87\xe9\xd5\x68\x59\x92\x6a\xd7\xe7\xd4\x9c\x0e\x0f\xf6\xfe\x0b\x54\x87\xcf\x50\x05\x7e\x07\x9a\x46\x28\x23\x88\xb3\x14\xab\x4b\x3d\x51\x1e\x4b\x18\x4d\x11\x00\xef\x60\x62\xc1\xf6\xc8\x91\x6c\x08\x4b\xb8\xc8\x44\x8f\x15\xbf\x20\xb4\xe3\x87\x09\x6e\xb1\xfd\xac\xad\xaa\x7d\x01\x5e\x0e\x2a\x9c\x27\x4b\x53\xea\xe3\xe0\xa1\x9c\x38\xd4\x5a\x59\x92\x71\x97\x38\x41\x49\x9b\xba\xff\x55\x39\x82\x30\x75\x72\xca\x05\xbd\xb2\x10\x4b\x32\x43\x30\x27\x7c\x0f\xef\x4f\xcb\xd9\x73\xcc\x40\x39\xb1\xc8\x72\x5f\xe7\x66\xdd\x2c\xbe\x56\x75\x9d\xab\x02\xbe\x9e\x0e\xb2\xbc\xd4\x4e\x7d\x6e\x41\x13\x69\x18\x96\xdf\x3b\xbf\x61\xec\x40\x27\x8a\xb8\xb2\x96\x77\xa0\x1f\xe5\xd9\x7b\x54\x34\x55\xde\xc1\xc5\x07\xde\x8c\xab\x5f\x2c\x51\x52\xa3\xdb\xd6\x7d\xca\x37\x55\x3d\x89\xe8\x12\x65\x22\xcc\xeb\xb6\x3d\xd9\xc2\x4d\x55\x8f\x35\x58\x58\xa2\xc0\x62\x2d\x6e\xf3\x92\x1f\xbb\x20\xfa\x4e\x62\x1f\x45\xd8\x6a\x63\xbc\xf9\xa6\x18\x7f\x28\x17\x97\x9e\x44\xc7\x09\xe2\x21\xda\xfc\x00\x9e\xd4\x34\x6c\xe1\x02\x99\xdd\x37\x50\x9a\xc7\x1a\x3c\x45\x8d\x49\xc3\x76\x30\xcc\xb8\x6a\x63\x81\x84\xd6\xbf\x62\x92\x61\x89\xd5\x80\x6b\xcd\xc1\xd9\xd3\xf0\xcd\xa4\x24\x62\x89\x17\x67\xed\x82\x90\x53\xdb\x6c\xda\xaa\x1e\x02\xb9\x94\x10\x89\xd9\xcd\xe5\x4b\x9d\xff\xe7\x3f\x3f\xc7\xef\x21\x25\xb1\x53\xde\xd9\x43\x3b\x51\xc9\x1a\x7b\x36\x29\x61\x24\xf5\x95\x9b\xea\x08\xe5\xb5\x91\x28\x45\xdd\x34\x83\xd9\x4f\xe3\x24\xc3\x14\xda\x35\x38\x5e\xcc\xed\x0b\x2c\x02\xa0\xfd\x72\xfc\x99\x26\x91\x83\x48\x0d\x96\xfa\x6e\xd4\x80\x75\xe6\x10\xf8\x59\x36\xb2\x56\x69\x22\x39\xc2\x6c\x73\x4f\xc6\xe9\xbb\x61\x56\x3f\x1d\xfe\x92\xa5\xd3\xfb\x48\x63\xc1\x9c\x8e\x17\xb2\x88\x0c\x69\xcf\xb0\x9d\x53\x34\x95\xa6\x05\x79\xc0\xda\x64\xf7\x46\xc2\xeb\x4a\x29\x51\x7a\xe0\x43\xee\xf9\xab\x3e\x35\xe0\x29\x65\x0c\x09\x88\x72\xcc\xf1\xb8\x16\xe5\x70\x30\x96\x26\xe8\xb0\xa8\x53\x5d\xce\x38\x92\x7e\x19\x44\xa6\x19\x8d\x71\x4d\x6a\xeb\x5c\xbf\x16\xb0\x39\x85\x85\x27\xcd\xc0\x2a\x67\xd5\x8e\x50\xdf\xf4\x4d\xfa\x2c\x95\x44\x04\xfd\xb9\xc7\xea\xd8\x33\xd4\x2f\x9a\x9b\xfc\x27\x18\x64\xd6\xb9\xa9\xea\x2e\x8a\x59\xcf\xc2\xcc\x54\x52\x86\xeb\x81\x71\xec\x0d\xcd\x7c\x33\x73\x15\x6d\x5d\x4d\xd8\x84\x58\x2a\x0d\x41\x43\xde\x79\x01\x9b\x93\x42\x14\xc0\x79\x25\x98\xa5\x5a\xd2\x24\x09\xf8\xd9\xce\x77\x33\x3e\x0b\x31\x52\x9f\xe8\xad\x68\x0a\x69\x84\x25\x28\x17\xe8\x38\x40\xae\x83\x28\x4d\x3e\x95\x14\x6c\x46\x90\x70\xf7\xa9\x8f\x1c\x53\x2b\x9c\xa3\x81\x5d\x60\x87\xaa\x69\x77\x05\x48\x3b\xbb\x1f\x9b\xf1\x58\x04\x5a\x9a\xea\xfd\xb2\xfb\x4e\x23\xa0\x10\xa1\x55\x3b\x39\xf8\xe6\x2f\x7c\x3e\x4a\x88\xc0\xb0\xa0\x5b\xd2\x9e\x9c\x6e\x71\x67\xb3\xe3\x8f\x1e\x51\xc2\x28\x49\xa8\xa7\xaf\xe9\x66\xd6\x73\x03\x75\xd3\xfb\x31\x57\xf3\x6c\x0b\x25\x1a\x12\x11\x74\xcf\x36\x2d\x1c\xa7\xb0\x18\x46\xe3\x38\x41\x18\xad\x34\x66\x65\x72\xb7\xec\xdf\x00\xcc\x58\xa4\x66\x37\x15\x0b\x8e\x09\x85\xb7\xaa\x95\x03\x78\x78\x12\xd6\xd1\x58\x3b\x9c\xf9\xc3\xb1\xbc\xcb\xfb\x08\x8c\xc6\xa0\xb1\xa9\xfd\x4b\x59\x35\x79\x83\x88\xd7\x7e\x5b\x62\xc0\xf3\x2d\x79\x1e\xf4\xe9\x13\xa7\x69\x2a\x11\x45\xd4\x76\xe1\x4c\x51\xdc\x07\x92\x33\x46\x53\x99\xa4\x18\x24\x75\xf3\x72\x94\xd2\xa6\xa9\xa2\x08\xef\x6e\x4e\x87\xaf\xb2\x36\x4b\x79\x0c\xd5\x09\xd1\x0f\x01\x83\xdc\xd6\xaa\xd5\xae\xe8\x35\x9b\xb8\x48\x7f\x4d\x47\xde\xb4\xa3\x65\xbc\xf8\xc5\x51\xaa\xd3\x2c\x0a\xd9\x2d\x57\x04\xf0\x50\xa5\x71\xc3\xcc\xa8\xda\xc9\x10\x67\x83\xeb\xde\xc3\xfd\xf6\x69\x7d\xf5\x8c\xda\x3a\x77\x8b\x3f\x77\xf7\x0f\xbb\x1f\x5f\xd7\xdb\xd5\xed\x7a\xb3\x0d\x17\xcb\x23\x86\x80\xab\x2f\xd0\x06\xb8\x1e\xde\xcd\x6d\xfe\x36\xac\xfe\x94\x47\x8e\xe8\xbd\x73\xb0\x56\xb5\x8e\xa3\x69\x62\x90\x72\xaa\x82\x5b\x34\xea\x31\xbb\x96\x79\xf1\x71\x5b\x55\xed\xa4\x7c\x39\xbd\x3f\x61\x62\xe2\x5b\x84\x3d\x21\xef\x4d\x55\x7b\xd2\xeb\x89\x0b\x47\x33\xee\xb0\xa7\x06\x5b\xac\x82\xed\xa7\x19\x77\x52\x88\x3a\xaf\x31\x95\x37\x86\x10\x30\x9a\x09\xca\x7c\xd2\xdc\x0b\x65\x9d\xf7\x9e\x4c\x94\x00\x18\x95\x31\xc4\xbe\x54\x33\x96\xc8\x1a\xb6\x62\x7d\x4f\x17\xb2\x69\x72\x3d\x2f\x91\x85\x51\x5c\xbb\x5e\xb5\xe3\x61\x37\x6e\x7c\x64\x54\x5a\x67\x96\x6b\x9f\x95\x1d\x73\x02\x5d\x5e\x7b\xa9\x4a\x5c\x15\x25\x2f\xdb\xbb\xde\x25\xa6\x1a\x00\xeb\x2e\x8e\x87\x7a\x7d\x7b\xbb\xfe\xe7\xf3\xfa\x7a\xb7\x5d\x2d\xee\xc2\x10\x88\x63\x5c\x52\xde\x72\x78\x8f\xd3\xfe\xd7\xd4\xba\x9c\xd3\x49\xb9\xd7\xad\x65\x21\xeb\x8b\x48\x62\x46\x41\x2a\x31\xa6\x8e\xbd\xfb\xf8\xf2\x65\x8c\x66\x63\x14\x0c\x45\xef\xf4\xb6\xda\xdf\xe5\x7b\x77\x23\x81\x50\xff\xbc\x3a\x3f\xbd\x33\x1b\x3b\x28\x4e\x67\x9e\xfa\xee\x8b\x2e\x9c\x41\xaa\x4e\x74\x58\x66\x0f\xd6\xfa\xd6\x90\xce\xb4\x2f\xea\xfd\xc3\xa9\x7d\xb0\x88\x86\x6d\x6e\x64\x1e\x32\x7b\xd4\x9a\x58\xf2\x31\x8f\x5d\x95\x97\xd7\x63\xa1\x89\x8b\x56\x88\x45\x51\x34\x88\x39\xb9\xc4\xe7\xd0\xd5\xc3\x58\x94\x08\xab\x7a\x7c\x46\x78\x22\x4f\x9d\x49\x9f\x5e\x25\x8b\x68\x82\x46\xe2\x7a\x7b\x33\x06\x5b\x31\x46\x22\x47\xb5\x3f\xe3\x0a\x61\x8c\xd0\x08\x7d\xef\x89\xea\xf7\xb4\xcf\x99\x31\xa2\x24\xf1\xa5\x97\xeb\x53\xb9\x87\xaa\x9c\x0e\x9b\x5e\x04\x51\x1a\x39\x12\x1a\x59\x35\xb2\x4a\xc2\x41\xe2\x54\x23\x4e\xe0\x90\xa3\x30\xea\x0f\xd4\x01\xfc\x16\xb6\x26\x91\xc2\xc5\xe0\xdb\x87\xfe\x8e\x31\xcc\xc5\x6a\x04\x4b\x62\xe7\xf6\x95\x95\x81\x9d\x39\x1d\xe7\x26\x8e\x25\x22\x63\x10\xaa\x44\xba\x2a\x4d\xf3\x08\xb5\xd3\x19\x99\x0d\xcc\xa4\x70\x0c\xcd\x3f\x9f\x37\xd7\xe8\x2e\x0f\xbd\xdb\xdd\x66\x40\x36\xd2\xc7\xfc\x15\xde\xab\xca\x0c\x24\x38\x8c\xa5\x91\x93\x05\x18\xf1\x0f\x5c\x90\x67\x66\x9d\x1f\x81\xcf\xd6\x3b\x68\x98\x59\xae\x6a\x4c\x09\x58\xa9\xfb\x53\xb1\x34\x43\x0e\xb4\x9d\x3c\x1e\x0b\xb4\x42\x50\xb7\xb9\x9d\xf0\x68\x8f\x73\x74\xbf\x2a\x30\x30\x66\x24\x52\x15\x3e\xfd\xf5\xe7\xea\xcf\xdf\x39\x57\x9f\x4c\x47\x9e\x50\x7c\x81\x8f\x35\x7c\xbf\xff\x76\x79\x9d\x1f\x5b\x2e\x96\xe9\x2c\xb5\x13\xbd\xf9\x3f\x2e\xd5\x34\x99\x4c\xb4\xa2\x63\xa8\xc8\x98\x27\x95\x31\x15\x0b\x87\xad\xdd\xe1\x87\x10\xfa\x23\x67\x3d\x19\x8c\x29\x05\x48\xeb\x88\xaa\x38\xa8\xd9\xfb\xe8\xb1\x79\x63\xfd\xb2\xf3\xfb\x52\x86\x21\x82\x02\xdb\xf8\x50\x08\xbe\x3f\xb5\x8e\x23\x4c\x27\xbc\xd7\x79\x0b\xa1\x24\xf4\x0b\x2d\xaa\x7e\xb7\x24\x28\xbf\xdc\x76\x53\xec\x02\xeb\x1b\x63\x3a\xe1\x08\xc2\xeb\xfc\x6b\xbc\xca\xe9\x5d\x6b\x01\x48\xb0\xb2\x5d\xae\x77\xae\xb1\xe3\x97\x1a\xa8\xdd\x1b\x66\xb8\xb4\x3c\xbc\x63\xe8\x3d\xff\x58\x8d\xd6\x76\xe8\xdf\x42\x1f\x7c\x3f\x47\xb2\x32\x66\x8c\xa3\x07\x70\xa2\x7a\x0b\xf3\xd6\xcd\xb9\xe6\x17\x74\xd6\xd3\xdd\x81\x25\xf8\xf5\x04\xde\xe4\x7a\xaa\x88\x4b\xd8\xbf\x68\x68\x8e\x08\x7b\x70\x81\x1f\xcd\xd6\xbf\xda\x7e\x5d\xbe\x3b\xff\x36\x01\x54\x4f\x31\xb4\x43\xb6\x53\x27\xa0\xb6\x83\xc3\xb1\xf5\xc2\x78\x8f\x55\x55\xec\xca\xca\x31\xc3\xe9\x6a\xf4\x40\x6d\x2a\x9d\x2c\xa3\xfc\x70\xf1\x6d\x6f\xec\xac\x66\x66\x10\x37\xb4\x79\xeb\x41\xab\xc3\x76\x89\xf5\xa7\x2f\xf2\x3f\xc7\xba\x3a\x8c\x12\x41\x3c\x32\xcc\x01\x1f\xda\xea\x18\xba\xdd\x06\xbb\xc4\x23\xb0\x3c\x0e\x9c\x29\xa5\xcd\xf7\xbd\x27\x7f\x1e\x21\x71\x42\x39\xf3\x1d\xbc\x33\x27\x96\x13\x21\xcc\x98\xf7\xe5\xea\xf4\x71\xf5\xb1\x79\x3d\xcd\x90\xde\x8c\x13\x70\x10\x45\x24\xcd\xe8\x9e\xff\x72\x20\x92\x64\x3c\xb6\x0e\x1b\x71\x7c\xf9\x68\x72\x2d\x0b\x87\x2a\x0a\x5b\x53\x99\x80\xc1\xba\x70\x20\xda\x08\x5b\x28\x75\x9a\xdd\x58\x38\x5f\xeb\xea\xd7\xeb\x16\xa7\x46\x65\x3e\x31\xef\x68\x9f\xc2\x2a\x72\x5d\xca\xf1\xd3\xa1\x60\x33\x97\x5f\x6b\x51\x47\xc5\xcc\x68\x5e\xc6\x86\xbe\x3f\xd5\x28\x86\xe5\x8c\x6a\xac\x7b\xff\x58\x6f\xbf\x5e\x3f\x2d\x7e\x2c\x6e\x77\x3f\xd6\xf7\xd7\x0f\x3f\xc2\x85\x33\x41\x13\x31\x5a\x78\x6f\xaa\x1a\xf2\xfd\x3c\xb7\x10\x06\x9b\x08\x25\x57\x5e\x9c\x1f\xbd\xda\x7e\x5d\x97\x3f\x20\x77\xf0\x51\x3f\x46\x44\x11\xa6\x08\x26\xfc\x59\xbb\xbb\xe7\xdb\xed\xfa\xf1\x76\x1d\x38\x05\x19\x17\x31\x60\x44\xfb\x72\x2c\x4e\x97\xfb\xc1\x18\x17\xa9\x33\x8f\x8f\x98\xf4\xa9\xf3\xb7\x6f\xf0\xf1\x1b\x42\xe2\x4f\x44\x08\xe7\x07\xa6\x31\x1e\xb8\x84\x9f\xed\xd5\xe9\xa3\x3a\xb5\xe7\xda\xb9\x8c\x67\x2c\x4e\xd4\xb8\x3c\x81\x33\xee\xba\x0b\x3c\xc3\x5d\x64\x59\x84\x48\x81\xdb\x6a\x7f\x5f\xb5\xb9\x86\xbb\xe6\x8c\x99\x68\x62\xd4\xb8\x8c\x12\x19\x38\x31\x5b\xa4\x45\xae\x2f\xac\xd7\x5c\x46\xd6\x71\xbb\x40\xd3\x7e\xcd\xdb\x4d\x68\xdf\x1a\x89\xb7\x85\x6b\x90\x99\x63\x13\xc0\xef\x1d\xcc\x44\x49\x6e\xfa\xfe\x74\x24\xc0\x7f\x6c\xbb\x43\xde\x39\x7d\x25\x7c\x6c\xab\x6f\x00\xc7\xd9\xad\xeb\x84\x60\x18\xda\xca\x9f\x2b\x59\x77\xe1\x7f\x33\xb0\xd9\x84\x31\x54\xf1\x28\x90\xf9\xe9\xd7\x51\x20\x31\x4f\x54\x72\xad\x63\xc5\xfa\x98\xc8\x5c\xe0\x1c\x66\xdc\x28\x4b\xba\x99\xb8\xdb\xd9\xaa\x7e\x9f\x1b\xc6\x33\xb0\x86\xdf\x0b\x38\xd5\x69\x00\xa7\xc8\xd2\x75\xa8\x4e\x0e\x2c\x22\xe9\xd6\x1a\xfd\x92\x17\x66\xe5\x34\xa3\x2f\x4e\x0b\x41\x12\x9a\xb8\x2e\xf0\x12\x49\x61\xdd\xfa\xb0\x83\xf6\x65\xf7\x36\x9a\xe3\x82\xa4\x09\x71\x89\xd0\xd7\xb1\xa6\x13\x13\x04\xa2\x48\x05\x19\xa0\x00\x93\x68\xeb\x5c\x07\x4b\x2a\xe2\x28\x43\xf3\x13\xc8\xef\xee\xe4\xab\x5b\x05\xa6\x57\x12\x33\x00\xc7\xf0\xa4\x21\x7f\x3b\x97\x8d\x39\x43\x27\x0e\x8f\x44\xc4\xc2\xd1\x0b\x6d\x5e\xaa\xe3\x11\xea\xe2\xe3\x4b\x51\x29\xcf\x35\xd7\x5f\x86\x71\xcd\xe8\x88\xf3\x0a\x39\xe8\x8b\x98\xb4\x99\x90\x27\x13\x49\xa2\x1c\x71\xfc\x5f\x8b\x70\xb4\x44\x66\x98\xe1\xb8\x5d\x6c\xb6\xdb\xa7\xf5\xe2\x36\xa5\x2c\x6c\x4b\x89\x42\x60\x09\xb6\x1b\x23\xb2\xe5\x53\xe1\x82\xb0\x07\xd5\x98\x21\x0d\xaa\x69\xce\xf1\x9e\xf4\x96\xcd\x2e\x29\x15\x1a\xe1\x1d\xb2\x9b\x36\x77\xeb\xdb\x66\x7b\x66\x80\xc3\x48\x1d\x93\x2c\x50\x3d\x1c\xab\xba\x75\x62\x5b\x79\x65\xc2\x82\xb2\x2e\xbd\xfb\x1b\x6e\x80\x26\x04\x49\xb3\x7c\xa1\x36\x54\xbc\x6f\xab\x7d\xae\xfb\x31\x96\x21\xc3\xd2\xf5\xea\x76\xbb\xd8\x4d\x9e\x34\x8b\x0c\xe2\x08\xbf\x6c\xaf\xef\xa7\x1b\x48\x82\x05\xab\x27\xd0\x39\xbc\x81\xd9\x0e\xc4\x58\xb3\x8b\x66\x24\xc5\x36\x93\xbc\x59\xb4\xb7\x20\x9b\xf6\x8f\xc1\xd2\x9f\x3d\x3d\xa6\x68\x3a\xc4\x3c\x8b\x7d\x0d\x48\x15\x37\x9b\x5f\xdc\xc6\x98\xf1\x80\x43\xde\xfe\x6e\x72\xf9\x5d\x04\x75\xd1\x49\xcf\xad\x30\x2c\x8c\x22\x23\x0e\xae\x8d\x8b\xaa\x03\x89\x85\x4d\x32\xd6\xd4\x87\x40\xf7\xf0\xee\xca\x68\xd3\x03\x4b\xe1\xa4\x45\xf7\xc8\x38\xd9\x9c\x8a\xcb\xed\x87\x4c\x48\x15\x23\xfc\x03\xba\x40\x60\x9a\xcf\x10\x8a\xba\x1e\xe9\xb7\xaa\x85\xe6\x4e\x36\xaf\x57\x1f\x0f\xa1\xc5\x67\x36\x54\xc7\x4e\x09\x7a\x75\x7f\xbd\x7b\xb8\xd9\xdd\xad\xef\xb7\xbb\xeb\x9e\x1d\x85\x09\x43\x12\x07\x74\x0a\x50\x23\x47\x1f\xea\xbb\xf2\x3a\xbf\xf0\x31\xff\x09\xc5\x85\x15\x43\x98\x24\x8b\xbc\x49\x44\xdf\x71\x6d\xce\x48\x86\xfc\x48\x4b\xb9\xef\xe2\x3f\x54\x6f\x70\x53\x57\x07\x9f\xed\xb8\x1d\xb5\x1d\x87\xb1\x5c\xa0\xcd\xd8\xac\x7e\x43\x4b\xcb\x84\xcd\x48\x34\xc0\x17\x1e\xab\xe6\x1c\x2c\xf9\xbb\x15\xf3\x7f\xf9\xb7\x3f\xb1\x63\x25\x08\x60\xa5\x6b\x78\x9b\xcb\x5e\xb3\x2c\x32\x2e\xca\xfe\x1b\xf5\xfe\x21\xd3\xf3\x77\x43\xb1\xc9\x33\xcb\x62\x15\x23\xfc\x08\x35\x06\xb7\x43\x41\x3b\x8b\x21\x41\x0e\x09\x03\x9d\xef\x6b\x56\x3f\x8f\xf9\xc4\x93\xcc\x62\x70\xda\x3b\xe8\x43\x47\x3b\x28\x9b\x53\x1d\x88\xa0\x3f\x82\x9c\x5e\xb0\x0e\x59\x12\x71\x24\x9e\xef\x13\x17\x33\x5e\xbd\xd9\x65\x25\x91\xa2\xbd\xce\x63\x3f\x41\x9b\x29\xb3\x1b\xcb\x92\x2c\x4a\x7d\x73\x0c\x72\x15\x4f\xa2\xfa\xc9\x94\xcb\xa8\x31\x58\x9c\xbc\xc9\x4b\xf3\x67\xd8\x9f\x5a\x49\xc5\xc8\x1b\x1e\x9c\x86\xfe\x14\x2c\xd1\x49\x00\x24\x0f\xcc\x63\xe3\x80\x67\xe4\x8e\x64\x3c\x33\xe8\xb5\x38\xb9\x8d\xce\xa0\x34\xcb\xa2\x1a\x8a\x57\x99\x20\x9c\x79\xff\xdb\x01\x96\x1b\x2c\x14\xcc\xa6\x7d\x26\x62\x57\xf7\x29\x64\xe3\xa0\x6c\x3b\x49\x48\x7f\x0c\xab\xd2\x74\x14\xe5\x8e\xe4\xd9\x59\x96\x45\x09\x96\x7f\x7c\x97\x69\x33\xa7\x81\x9c\x9e\x27\x63\x16\x19\x0c\xb6\xd7\x2b\x07\x95\x79\x9a\xca\x2b\xb3\x2c\xe3\x16\x31\x79\xc7\xaa\x0d\x89\xab\xb0\x45\x3b\x78\x22\x6a\xdc\xa2\x99\x1b\x15\x69\x2f\x9f\x4e\x72\xc7\x80\x9a\x37\xd8\xd7\xa7\x65\x33\x9f\xfa\x52\x3a\xfe\xcb\xfe\xf9\x6c\x4e\xca\x73\xf5\xdc\x60\xc4\x74\x38\x42\x9b\xcf\x33\x17\x33\x54\x5c\xa6\xac\xc0\xc5\xf4\xcb\x5f\xdb\x8b\xf0\x91\xf3\x9a\x6a\xa6\xa9\x65\x9e\xdc\x68\x28\xfe\x64\x5a\x66\xe8\xe9\xec\x1a\x68\x9f\xaa\x02\x50\x5e\x19\xaf\xe6\x93\x7a\x62\x66\x98\xa3\x64\x6d\xa0\x5d\x35\x6d\x7e\x90\x2d\x18\x97\x8a\x9a\xda\xc0\x0c\xa4\xc5\x20\x2d\x6f\x1e\x65\x6e\x1e\x4e\xf3\xed\x96\x33\xb4\x14\x5d\x54\xff\x50\xc2\x75\xfe\xd6\xe0\x1c\x0d\x97\x66\x65\xc0\xe9\x63\xf5\xc3\x91\x64\x36\xe3\x28\x4d\x46\x29\xc1\xa4\x03\xfc\xd4\x70\xfc\x3c\x0f\x2b\x23\xe6\xea\xf0\x79\xb3\xad\x65\xf7\x22\x91\x46\xd6\x6f\x8c\x53\x05\x51\x28\x73\xb9\x1e\xa6\xa5\x2c\x8a\x6d\x7e\x80\xa6\x95\x87\xe3\xf4\x05\xca\x24\x22\xc8\xbb\xe5\x23\xb5\xc1\x60\xc8\xc4\xa6\xa8\x4b\xaa\x1d\x7f\xc2\xdd\x87\xd7\x2c\xf2\x9b\xd3\x4c\x71\xd9\xd7\xe1\x5f\xc1\x2d\x8f\x9d\xa3\x3a\xa3\x93\x67\x32\x05\x8e\xb7\xfe\x05\x5a\xe7\xb3\x8d\x9c\x65\x3f\x84\x11\x8b\xfe\xee\xae\xad\x65\x5e\x76\x1e\x77\xfc\xff\x4a\x71\x10\x8e\x1c\x47\xd8\x55\x6b\x7c\x49\x16\x69\xd8\xaf\x46\xe2\x4b\x97\xfd\x02\xc9\x4c\x06\xe3\x46\xaf\x59\x07\xd6\x6c\x34\x8f\x18\xc2\xcd\x02\x29\x28\x06\xcc\xe1\x23\x97\x9c\x32\xb4\xbd\x9d\x77\xd1\x5b\xac\x49\xf6\x5a\x76\x21\x6d\x3a\xc6\x19\xa3\x95\xf0\xf0\x88\x30\x46\x45\x88\x58\x9f\x85\x57\xd3\x87\x2d\x22\x6e\x82\xf0\xc4\x1b\x34\xed\x5c\xc0\x67\x76\xe1\x42\x3a\xf1\x69\x3d\x7c\xa9\x53\x34\x8a\xcc\x92\x0c\x83\xf5\xbf\x9e\xef\xff\x5c\xdf\x27\x7f\xf3\x03\x95\x99\x64\x42\x8d\x25\xcc\x03\xad\x9b\xdf\x2e\x13\x81\xbd\xfd\x37\x55\x75\x39\x6f\x2c\x25\xe7\x28\xfc\xfb\xdc\xc0\x6e\x15\x78\x0f\x96\x95\x99\x79\x27\x52\x72\x8d\x6f\xca\xb7\x38\xcd\x16\x1d\xa9\x52\x07\xe6\x71\x9a\x13\x3e\x3e\xf9\x3c\x0a\xfb\xf5\x6c\x52\x36\xc2\xbe\xf8\x7d\x6e\xb1\xcb\xff\xf2\x7a\x28\x35\x01\x84\x09\x2d\x50\x63\xb5\x79\xac\xab\x6a\x86\x48\x92\x26\xce\x70\xa1\xc2\xae\xe5\x5f\x43\x6e\x3d\x0c\xae\x5f\xb6\xa4\x49\x09\x36\x99\xfe\x29\x4b\x53\xcb\x09\x68\x52\x1a\x16\x39\x78\x9f\x31\x35\xe9\x7f\xcc\x2c\x52\xf1\x0c\x5c\x2a\x9b\xe7\xc7\xc7\xdb\xbf\xc2\x76\x10\x19\x66\xa6\x5d\x99\xf0\xb9\x81\xfa\x2a\x6f\x6f\x0a\x79\x99\x8e\x98\x49\x9b\x58\x44\xb4\x3c\xd6\xd0\xed\xf0\x73\x9b\xef\x65\x38\x96\x4d\x0d\x4e\xf6\x85\x2c\x9b\x97\xd3\x38\x36\x90\xd6\x30\xe4\xc6\x7e\xa9\xde\xef\x4e\x28\xa3\xba\xee\x2b\x72\x30\x14\x3d\xa5\x05\x40\x92\xd5\xcd\x3f\x9f\xd7\x4f\x4f\xab\xdb\xdd\xd5\xc3\x43\x5f\x29\x54\x51\xe4\xb2\xc6\x5f\x51\xbd\xbb\x8c\x7e\xfe\xca\x75\x54\x51\x3a\xa3\x99\x1b\x1c\x5c\x11\x86\x64\x09\x4a\x4b\xe8\x1a\x4c\xde\x5e\xcb\x6a\xfa\x05\x28\x42\x13\x6c\xbe\x30\x50\x40\x0b\x17\xdb\x76\x99\x22\xc6\xd1\xb7\x7d\xbd\xee\x2f\x34\xd6\x14\x7f\x32\xd5\xe6\xa4\x35\x40\x67\xaa\xfb\x3a\x9d\x1f\x93\x44\x12\xf4\xc5\x55\xb9\xe8\x5c\xe6\xf1\xfa\xa0\x92\xc8\x31\xd5\x1f\x72\x8f\x9b\xba\xa9\xea\x11\x8e\x5c\x25\xb1\x91\xa1\x56\x8c\x11\xc9\x70\x9a\x34\x03\x4c\xa5\x2f\x4e\xba\x3d\x0d\x65\xf5\xcb\x09\x2a\x95\x1a\x1e\x3a\x84\xbf\x42\x5d\x9d\xf3\x9f\x60\x34\xe6\x18\x2d\x5c\x45\xff\x1d\x33\x8e\x93\xc4\xb3\xa2\x54\x60\x9d\xf4\x15\x1b\x31\x67\xdb\x4c\x84\xc1\xc8\xae\x86\x63\x21\x35\x38\xe0\xfe\x4c\x5b\xdf\x8f\x65\x31\xc7\xd0\x0f\xb1\x6c\x1f\xab\xc3\x98\xd7\x72\xf2\xaa\x59\x0c\x48\x92\xf2\x5f\xd0\x8e\x52\xb5\x8a\x25\xc6\x25\x7d\xba\xa9\x78\x7b\x8e\x1d\x54\x2c\x4d\x11\xa1\xe4\x00\x15\x4f\xf2\x75\x66\x61\x14\xd3\x2e\x25\x64\xbd\x93\xe6\x2c\xaa\xeb\xb4\xdf\x14\xb2\xf7\xb1\x14\x33\x0a\x79\x7a\x16\xa7\xa6\xad\x65\x91\xcb\xb7\xe6\x11\xea\x53\xd8\xcc\x69\x82\x36\xb1\x0c\xe2\xd2\xd7\x93\x86\x57\xa6\x38\x73\xe2\xaa\xe5\xe9\x70\x23\xd5\x28\xc1\xa2\x44\x62\x30\x89\x9d\x97\xb6\xda\x6d\x3e\x0e\xaa\x6f\x2a\x54\x82\x39\x44\x0e\xae\x39\xd7\xd5\x7e\x59\xd5\xfd\x05\x09\x4d\x82\x9a\xb7\x2f\x37\x6d\x17\x0f\x1b\x68\xdb\x5e\x07\x36\x78\x02\x4a\x68\x1e\x8f\x69\xb7\x7e\x99\xcd\x50\x02\x8c\x9d\x10\xa9\x9e\x49\xbf\x30\x95\x49\x81\xee\x63\x1b\x9a\xe0\xfb\xbb\xc9\x20\x0b\x89\xf7\xab\x1a\x5e\xaa\xa1\x74\x38\xbd\x26\x95\x1a\x64\x03\x5e\x2f\x1f\x52\xcf\xfb\x1f\xb6\x64\x2a\xf5\x48\xcb\xc5\xf1\x88\xab\xc2\xf4\xa5\xea\x48\xf7\x74\x99\x77\x63\x66\x2c\xa6\xb4\xb6\x19\x19\x40\xa8\x97\x72\x8a\xca\x10\x11\x8f\x94\x2b\x26\x36\x56\x99\x2c\x46\x25\x87\x63\x21\x5b\x5b\xd5\x87\x5b\x79\x2a\xf5\xcb\x08\x84\xa8\x8c\x72\xcb\x79\xde\xdc\x79\x62\x18\x5c\xcf\x47\x15\x45\x65\x74\x2a\xfb\x02\xc8\x6d\x55\x9d\x87\xb4\xff\x8f\x7f\xdd\x79\x34\x21\x4a\x26\x3d\x50\x06\x3a\x5f\xee\xa6\xf3\x6f\xe3\x6b\x90\x3d\x92\x50\x93\x2c\x42\x3b\xd4\x13\x95\x0e\xfd\x72\x17\x97\x00\x1d\x13\x81\x54\xff\x8f\x5d\x64\xf0\xbb\x00\x5e\xc7\x89\xf3\xf0\xc3\xe4\xba\xce\x6b\xd0\x9f\xb4\xb4\xea\x98\xd9\xc0\x93\xed\x82\x8a\x0b\x06\x48\xc7\x5e\xb8\xbd\xdd\xbd\x8f\x08\x79\x98\x8e\x35\xc1\x42\xed\xf7\xd5\x66\xbb\xbe\xff\x82\x38\x84\xdd\xf2\x76\x7d\x13\xba\x73\x75\x22\x54\x0c\x9e\x2c\x37\x2f\xf7\x5f\x6a\x59\xfe\x3d\x66\x47\xa6\x13\x48\x88\x67\x31\x6e\xe7\x5e\xcb\x6c\x68\x9a\x24\x99\xed\x67\xc0\x55\x9d\x9b\xfd\xbc\x34\xa7\x53\x26\x75\x3c\x6e\x41\x3c\x3b\xe6\xf4\x55\xa6\x99\x8e\xe5\xa8\x57\xed\x06\xe0\x2e\xac\x05\xfd\x31\x95\x6b\x7c\xf8\x51\xcb\xe3\x11\xea\xdb\x11\x36\xf8\x93\x3e\x8f\xd9\x39\x20\xc2\xc6\xd1\x9d\x1a\x53\xc5\x32\x4d\x09\xc8\x78\x60\x93\xf5\x1a\x8d\xde\xdf\x9f\xde\x3a\x35\x16\xfb\x63\x1f\x97\xc3\x43\x67\x82\x7d\x12\x7d\x16\xfd\x10\xc9\x70\x99\xfd\x01\x57\xa7\x8f\x45\xf9\xf1\xb5\x3a\x35\xfd\xe9\x39\x73\x92\x21\xce\x88\x0f\x74\x3f\x4c\x73\x50\xe8\x92\xed\x3c\xa0\xf1\x57\xee\xae\xe6\x36\x65\x43\x4b\xc9\x44\x72\xdc\x8f\x10\xb1\x04\xea\x3b\xa1\xbc\xcf\x8f\xcb\x2c\x12\xa6\xcc\x6e\x54\x08\x8b\xbd\xdf\xdd\x74\x58\xcc\xdb\x7a\xb4\xd0\x89\x83\xe4\xcb\x9f\x8f\x55\xd3\xe4\x53\x58\x74\x18\x04\x24\x86\xfe\x82\x2e\xd1\x3c\x74\x63\x24\x72\x67\x7f\x7b\x5a\x05\x6c\x97\x96\x34\x76\x7c\xe3\xdd\xa7\x4c\xc4\xec\xc2\x24\x8b\x13\xf7\xb4\x7c\xa5\x6f\x7a\x40\xc9\x09\x1a\xcf\xf5\xfd\x7a\xbb\x5e\xdc\x22\x49\xf5\xee\x6a\x71\xbb\xb8\x5f\xae\xfa\x13\x08\xc3\xe9\x98\xcd\xc0\x4d\x33\x24\x66\x1d\xc9\x41\x85\xd1\x3a\xc6\xa8\xb3\x80\x76\xdd\x3e\x05\x34\xa0\x98\x3d\x7d\xc5\x98\x4b\x9a\xb6\x5e\x67\x7c\x8a\xed\xd6\x4a\x3a\x72\xc5\x6e\xfb\x78\xbd\xd0\xda\x48\x14\x3b\x2b\x64\xd3\xee\xea\xaa\xe8\x1f\x9f\xb6\x09\x66\x26\xb7\xd5\xb1\x9d\xd6\x02\xb4\x89\x19\xba\x18\xd7\xf9\x3e\x47\x2f\x25\x6c\x80\x08\xd8\xa0\x15\x7d\x07\xad\x34\xb2\x95\x17\x14\xca\x99\x86\xc4\x62\x74\x6c\x50\x41\xff\x5d\x1e\x27\x67\x80\x54\xe1\x9a\xec\xab\x19\x68\x2d\x6f\xea\xea\x70\x53\xd5\xb0\xaf\xbb\xf5\xfd\x37\x22\x86\xb3\x4f\x0f\x58\x82\x19\xe3\x1f\xf2\x0d\x5b\xbb\x83\x35\x78\xf2\x49\xb8\x8f\xfe\xc4\x32\x45\x0e\x16\xbf\x7b\xc8\x1d\x05\x77\x5f\x5b\x9b\xa1\xed\xd1\xb2\xd0\x5f\xe4\x9b\xff\xd9\x44\xd2\x20\x89\x98\xad\x01\xb6\xd5\xea\x67\x5b\xcb\xe9\x0b\x30\x91\xd2\xc8\xa2\xd9\xd7\x28\x6c\x5e\x80\xf3\xb8\xc6\xcf\xc5\x90\x04\x02\xaa\xe6\x4e\xfe\x0c\x8d\xe5\x57\xe7\xad\xee\x86\x68\xc1\x3c\x1b\xc8\x5d\xb3\x9f\x1d\xc5\xa4\xd2\xd7\xed\x56\x81\xe4\xb6\xc7\x76\x4c\x0f\x13\xb3\x94\x79\xa4\xfc\xd5\x28\x0b\x35\x7d\x80\x26\xe6\x04\x2b\x0a\xdb\x17\xb8\xbb\x7b\x78\x7a\xfc\x32\x7e\x5d\x26\x06\x4d\x5c\xdd\xd3\xf5\xa9\x9e\xa9\x51\x32\x93\x64\x19\x08\xcf\x22\x9f\x97\xfb\x27\xf8\x9f\x53\x5e\xc3\xa8\x7d\xc6\x24\x40\x91\xab\x6f\xb7\xf7\xa5\xed\x27\xd4\x42\x18\x33\x6f\x33\x93\x46\x91\x24\x03\xae\x7f\x26\xfa\xd6\x0f\x72\xb7\xd4\x4d\xcd\x49\x71\x73\x36\x39\xfe\x31\xdb\x2d\x65\x08\x36\x7e\x7c\x5a\x2f\x57\xbb\x00\xa6\x33\x54\xa4\xd8\xc4\xa0\x1d\x5b\x6d\xb3\xc1\xd6\x95\x7e\x6b\xc6\xb9\x87\x45\x22\xc6\xde\x21\xfd\xce\xa4\xe3\x99\xa1\x96\x22\xdc\x74\xe7\xfc\xaa\x31\x4e\x71\x76\xf9\x4c\x4b\x44\xc1\xe6\x37\x01\x92\x6a\x78\x22\x8d\xb7\xf1\x0e\xb2\x94\x43\x7d\xad\xfa\xad\x4a\x53\xec\x16\x2e\x9c\x2b\x0a\xbf\x32\xd4\x86\xeb\x08\x81\x0f\xcb\x97\xaa\x6a\x60\xf1\x0e\xb2\x3f\x8e\x8e\xf5\xb8\x05\x0c\x19\x7f\x2e\xf4\xee\x1b\x21\x00\x99\x4a\x8a\x61\x0a\x88\x4c\x11\xdb\x87\x41\x38\x5f\xc7\xd0\x93\x30\x2c\x8b\x98\xe6\x81\x70\x18\x5b\x2a\x3e\x85\xb7\x9b\x8c\x66\x49\x3c\x26\x06\x1b\xb7\x70\x0e\x6f\x20\x53\x8e\x9f\xf6\x2d\x87\xf7\x45\x51\xf8\xe7\xa3\x65\x3b\x33\xf6\x26\xd3\x11\x38\x5a\x17\xe4\x43\x7a\x02\xcc\xf0\xcd\x06\x49\xce\x83\xf7\x7b\x05\x6d\x73\x7f\x3a\x7c\xf6\x1c\x65\x96\x04\x41\xbf\x6d\xd5\x45\x69\x8d\x53\x82\xbf\x1c\xf9\x19\x69\x9d\x22\xe9\xd1\xe5\x52\x7e\x40\xfe\xf0\x0e\xf3\x8f\x51\xda\x0c\xc9\xd1\xb7\x5f\x17\x3f\x76\xcb\xbf\x96\xb7\xab\xdd\xed\xea\xfe\xcb\xf6\x6b\xb8\x59\x95\xb8\xe0\xe0\x1d\xf2\x9b\xaa\x3e\x57\x09\x67\x46\xe9\x28\x72\x8a\xf0\xcb\x97\xbc\xb8\x2c\x89\xc3\x8c\x36\xb1\xf5\xee\xff\xee\x76\xf5\x7d\x75\xbb\x0b\xe8\x41\x63\x94\x53\xc6\x6d\xa0\xfd\x3e\x74\xed\x7c\xf2\xcd\x18\xe8\x7d\x97\xb5\xae\x02\x8e\x6c\xc4\x50\x17\xc6\xd9\x34\x72\x4d\x6b\x48\x1c\x63\xa6\xe6\x0a\x32\x57\x64\x5d\xd4\x79\x29\x77\x72\xec\x75\x19\xc8\x58\x50\x59\x1f\x6a\xf5\x3e\xbf\x60\x2c\xb0\x38\xf0\xbd\xcb\x78\xfa\x2a\x81\x64\xce\x94\x5e\x87\x3a\xea\x6f\x53\x6b\x40\x74\x1a\x19\xdf\x35\x71\x03\x70\x7f\x3a\x38\xb6\x36\x7f\x31\x10\x73\x87\xac\xbc\x3d\x4d\xda\x5c\x20\x06\x89\x2e\x73\x17\xf9\x7f\xa2\x11\x32\x7d\x70\x90\x78\xcd\x8d\xc7\xba\x6a\x91\x43\xf7\xb7\x4c\x3c\x93\xf8\x0d\x12\x63\x33\xdf\x33\x33\x4a\x30\x4f\xcf\x91\x46\x12\x3f\x20\xe9\x32\xc2\xab\xf6\x65\x55\xfe\x2d\x90\x04\xa4\xb1\x23\xbe\xbc\xad\xf6\x0b\x14\x0f\x0f\x70\xbf\xcf\x6a\x83\xe3\x83\x8e\x05\x62\x18\xa4\x69\x46\xd3\xe9\x52\xf4\x84\x80\xf9\xe9\xcb\x4a\xb3\x18\x01\x61\xfe\x5a\x9b\x89\xc0\x0f\x83\x54\xb9\x9c\x27\xf6\x9e\xbc\xe5\xcd\xf0\x4a\x52\xa5\xd1\xf0\x1c\xe5\x47\x9f\x99\x84\x14\x22\x2c\xe6\x6d\xa1\x69\x57\xdb\xaf\x93\x77\x45\xe3\x04\x31\x2d\x0f\x47\x28\x1d\x07\x3f\x6a\x60\x5f\xb0\x73\x40\x63\xad\x3c\x3a\xe3\x0e\xbb\x3f\x3b\x7f\x75\x5d\xf6\x1e\x32\x50\xc6\x81\x8e\xe9\x02\xe4\xfc\x08\xda\xc6\x81\x60\xbd\x7b\x54\x8b\xba\x96\x1f\x73\xe9\xda\x60\xf1\x80\x02\xc1\xe4\x9f\x45\xaa\xfe\x5c\x9e\xc9\xac\x30\x60\x91\xc4\xe4\x26\x5e\x6e\x78\xa0\x37\x32\x2f\x3e\xab\xf7\x01\x8b\x5d\x0d\xd5\x2b\xac\x3a\xc9\x05\x18\xfc\xcc\x7f\x5c\xfa\xd7\xf4\x2e\x78\x4c\x90\x0d\x6d\x87\x21\x8a\xbd\xe0\x8d\x00\x17\x99\xab\x81\xbf\x80\x7e\x75\x1d\xe7\x03\x8e\x14\xb8\xd2\xb8\x7e\x1d\x4f\xed\x73\xd3\xb9\x08\xbd\xcc\x6b\x18\x60\xdd\xba\x80\x41\xe9\x38\x35\x07\x22\x01\x14\x72\xac\x65\x69\x64\xd5\xff\x4a\x33\xec\xd4\x41\x50\xd4\x28\xd8\xb8\x94\x71\x00\xa1\x12\xf4\xce\x1e\xa5\x2a\xaa\xc7\xe2\xd4\x4c\xe6\x83\x00\x8b\x9a\x0d\x88\x71\xbd\xaf\x5a\x59\xe7\xa3\x16\xfc\xb3\x46\x69\x10\x96\x62\x04\xb0\xd3\x75\xf5\x5e\x9e\x37\xd7\x43\xc6\x19\x41\x5d\xa1\x53\x51\xe8\x7a\xea\xd9\x42\x26\x01\x9b\x31\x1e\x96\xdb\xe5\xc3\xfa\xbe\xff\xd9\x10\xeb\x3a\x1f\x6e\xe7\xa2\xe7\x0c\x32\xd0\x02\xb1\x17\xff\x73\xca\x8f\xdd\xe2\x31\x26\x3d\xbd\xf4\x02\xfd\x7e\xd2\x12\xed\x2b\x10\xbe\x56\xe7\x4b\xac\x7e\xbb\xa2\x12\x71\x60\x57\x72\x3f\xfc\xa6\x92\xc8\x2d\x92\x7d\xe2\x31\x84\x71\x9f\xae\xd4\xa0\x0c\xc5\x94\xce\x66\xfb\xb4\x58\x4c\x6e\xd7\x08\x86\xd9\x89\x03\x74\x5e\x5c\xf3\x92\x1f\x2f\xd5\xb1\x00\x54\x82\x79\x42\xec\x7f\x5d\xb8\x42\xef\xc4\xf1\x03\x9b\xc5\x59\xf0\x76\xbb\x29\xfc\xe4\x16\x71\x24\x05\xf6\xff\x9e\x37\x97\x59\x12\x65\xf8\xdc\xbe\x5c\x2f\xdd\xc1\x82\x4f\x67\x09\xcd\x70\xed\x76\x59\x79\x64\x60\x5e\xcc\x8a\x24\x96\x64\xdc\x3f\x89\xff\x46\x03\x7d\x55\x55\x9d\xe7\x6a\xf5\xfc\x2c\x26\xf6\x22\xd7\xae\x0c\xb6\xc1\x66\x10\x4f\x6e\x32\x9e\xca\x96\x18\x83\x35\xe6\xdc\x56\x95\xb9\x86\x10\x3d\xd8\x58\xb9\x2c\x78\x7f\x9d\x71\xbf\x05\x14\xb6\x06\x1d\x5d\x60\xef\xb2\xc1\xcd\xb6\xba\xcb\x87\xa3\xc6\x56\x0b\xd7\x75\x78\x2c\xaa\x8f\xb5\x01\x39\x7b\xba\x36\xc9\x32\xc9\xa7\x20\xb3\x75\xf9\x56\x9d\xb1\x9d\x7b\x93\x6d\xd3\x24\x41\x8f\xb7\x75\x35\xd0\x9b\x40\x52\xcb\x6c\xca\x52\x90\x43\xa9\x15\x39\x4e\x7f\xbc\x40\x79\x55\xb5\x2f\x08\xf3\x0e\x5f\xbc\xa5\x51\x8a\x16\xd8\x54\xef\x65\x60\xc8\xf3\x9b\x18\x73\x2a\x4f\x35\xe2\xa9\x46\x00\x1e\x84\xf0\x22\xef\x7b\xe0\x77\xbf\xfc\x67\xf2\x75\x58\x06\x04\xfb\xe1\xd1\x0f\x9b\xe6\xdf\x67\xd5\x70\xcb\xb5\x6b\x27\xa8\x3d\x38\x63\x07\x3f\x41\xef\xf2\xfe\xa2\x33\x92\x78\xfe\xfa\xe5\xa9\xbf\xdc\x2c\xb3\x5a\xf5\xb4\x65\x01\xc6\x1b\x2e\xa5\x2f\x1d\x59\x99\x72\x74\xcd\x9a\x63\x31\x27\x63\xb1\x32\x73\xe8\x02\xd4\x60\x7a\x92\x97\x70\x08\xd3\x6f\xd7\x4a\x63\x47\xb0\x6f\xfc\xe0\x2f\xd3\x58\xcd\xf7\x0f\xac\xc7\xcc\xaa\x94\x61\xc7\xd6\xf2\xe1\xe1\x11\xd5\x9c\x76\x4f\xab\x1f\x8b\xa7\xc0\xaf\x67\x95\x90\x89\xcf\x60\x3f\xe6\x6f\x17\x64\x2f\xa6\x57\xa4\x4c\xe4\xb8\xd9\xa4\x2d\xaa\xd7\x33\xf9\xf5\x8b\x28\x1f\xab\x8c\xc6\x14\xe9\x19\xc9\xd3\xec\x23\x52\x36\xc5\x4f\xd5\x31\x3c\xfd\xbc\xec\x43\x5b\x9d\x50\xac\x7b\x5c\x9d\xca\xff\x54\x85\x1c\x5b\x1a\xab\x99\x91\x3e\xf1\xfd\x7c\x2c\xf2\xb2\x9f\xb3\x5a\xc5\x99\xc3\x21\x14\xd6\xd1\xe0\x84\x2d\x36\x4e\x10\x40\x7a\xc2\x86\x48\x4c\x20\xc1\xfb\xec\xcd\x59\xea\x08\xef\x77\x79\xb3\xd1\x2f\x70\x80\x90\x32\xf8\x44\x6d\x92\x59\x2b\x1c\x4f\xad\x0e\xed\xbf\x63\x5a\x73\x66\x6d\x46\x84\x87\x57\xdc\xc3\xcf\xf6\x5b\x8e\xfa\xb7\x58\x3b\x77\x43\x78\x14\x31\xc1\x7a\x4e\xbd\x2b\x84\xc9\x06\x95\x59\x11\x86\x68\x45\xa2\x50\x7b\xcb\x4b\x07\x56\xc1\x54\x4a\x38\x08\x49\x2d\x82\x3a\x4d\xd5\x6d\x72\x79\xde\xf3\x44\x0c\x8f\x08\x33\x30\xe6\x06\xde\xb5\xd5\xae\x76\xf8\x96\x5f\xfb\xb0\x3c\x22\x99\x4a\x78\x0f\xc5\x6f\xeb\xaa\x28\xa0\xfe\x55\x93\x39\x8f\x88\x74\x12\x79\x23\xa8\x9c\x6b\x92\xeb\x8c\xcc\x27\x67\x01\x47\x84\xb4\xad\x4f\x4d\x5b\x40\xd3\x8c\x24\xe0\x77\x73\x51\xe5\xd9\xbe\x71\x14\x05\x75\x05\x5f\xb6\x43\x26\x80\xf1\x60\xd2\x8f\x55\x14\x41\x73\xdd\x04\xde\x86\xec\x1e\xce\x66\xe2\x47\x24\x54\x61\xf1\x6e\xf3\x63\xfd\x7f\x57\x4f\x9b\xb6\xf3\x48\x6a\xf3\xf7\x62\x0b\x1e\xa5\xcc\xf5\xdc\x74\xce\x02\xda\xbd\x43\xf5\x36\x53\x35\xe3\x51\xaa\x32\x8c\xac\x17\x9b\x3f\xcf\x18\x64\x26\x47\xa3\x2c\x76\xa0\x99\xb2\x81\x01\x20\x39\xf3\x28\x79\x44\x3d\xf5\x60\xf7\x55\x34\x50\xaf\x2f\x4f\x5a\x1e\x31\x93\x61\x10\x8d\xf2\x05\x9b\x30\x87\xb8\x70\x29\x54\x34\xad\xb7\x13\x1c\x34\x36\x10\x4c\xff\xcf\xef\x94\x45\x04\xfd\x23\x9f\x76\xaa\x36\x3d\x53\x79\x98\xbc\x19\xc9\xa4\xc3\x2a\xb7\xf5\xa9\x74\x42\x81\x61\x93\xe1\x0e\x17\x0b\x6f\x48\x80\x87\xb1\x80\xab\x2e\xe7\xe5\x7e\xfc\x25\xf1\x48\xc6\x92\xb0\x90\xa8\x9d\x49\x04\xf3\x48\x8a\x34\x73\x62\xae\x45\x25\x91\xe6\xf9\x8f\xf9\xc3\x51\x8c\x50\xd7\x0c\x78\x42\x97\xb4\x6c\xbb\x61\xeb\xc7\x9b\x0d\xf2\x97\x84\x51\x3a\x76\xa9\x68\xf9\x0a\x28\x5f\x71\x46\xad\x42\x07\x8f\x48\xfc\xfb\x1f\xbf\xd7\xd5\xe5\x91\x96\x1c\xd1\x54\xd5\x71\x1c\x5f\xf2\xc8\xc4\x56\x38\x68\xcc\xa9\x69\xc1\x4c\xef\xd7\x24\x04\x09\xae\x97\x55\xd9\x2d\x99\xd2\x43\x0c\xa7\x0c\x7e\x3c\x82\xc8\x38\x16\x38\x63\xae\xb1\x0e\x73\x0e\x69\xe5\x11\x30\x1e\x7b\x58\xf3\x03\x02\xa2\xc6\x8c\x2d\xff\x4a\x86\x1b\x4a\xc2\xc3\x82\x2c\xe3\xde\x6e\xb5\xe5\xbc\x28\xc8\x23\xcb\x7a\x58\xfd\x63\x5d\x75\x1e\xd3\xa2\x56\xb9\xef\x7a\xbd\x81\xa1\xdf\x3e\x8c\xd7\xa0\x06\xcc\x76\x77\xf6\x5a\x7e\xc2\x35\xc8\x23\x0b\x02\xdb\xc9\x1c\x44\x79\xe7\x53\x28\xd3\x17\x4e\x22\x11\x85\x05\xe0\xee\xe3\xb6\x52\x03\xdf\x06\x27\x91\xd4\xe8\x8d\x9c\xca\x62\x5c\xb5\xf9\xcc\xa3\xe5\x24\x32\x40\x52\x27\x5f\xeb\x20\x26\xe1\x77\x30\x19\x1d\xd5\x89\xae\x86\xf4\x37\x27\x44\x25\x84\x0c\xec\xb8\xee\x0b\x1f\x88\xde\x2f\x65\xfb\x38\x89\x89\x70\xbc\x37\x75\x8e\xc5\x7a\x28\xc2\xe1\x62\x01\x98\x31\xea\x96\xa7\x2f\x75\xf5\x7e\x16\x0d\x72\x92\x50\x81\xe6\xf4\xea\xea\xea\x77\xec\x50\x9c\x24\x82\x60\x72\xc9\x55\xfb\xbf\x7d\xe8\xe9\x2b\x24\x89\xd5\x38\xbf\x74\x75\x38\xca\x36\x57\x05\xc4\x51\x38\x51\x6a\x14\xb2\x1b\x2c\x0c\x06\xdf\x1f\x48\xbd\x7b\xd1\x94\x90\x14\x22\x0c\xc8\xab\xf7\xb2\x09\x97\x3b\x95\xfc\x9d\xef\x60\x1d\x93\x68\xc0\x9e\xf6\x7d\x23\xc8\xd8\xd0\xdf\x2b\xe5\x44\x64\x83\x2c\x86\x33\x0a\x97\x93\x73\x9c\x50\x6f\xcc\xb1\xc5\x25\x10\xa3\xf8\xe0\x70\x76\x31\x17\x8a\xf0\x9c\x50\x4d\x03\x99\xbc\x63\xd3\x71\x83\x2f\x31\xc2\x72\xc2\x12\x8d\xd3\x33\x2f\xf3\x76\xd1\xfe\xfc\x5b\x44\x1b\x9c\x88\x84\x21\x69\xaf\x34\xc6\x7f\x31\x7f\xcc\x07\x68\x04\xcf\xe4\x65\xd3\xca\xb2\xcd\xe5\x84\x35\x7d\x7e\x34\xe5\x80\x25\x81\x76\x6b\x33\x97\xe6\xe8\x86\x64\x59\xef\x56\x60\xb4\x7b\x29\xca\x9d\x1d\x37\xa3\x59\x00\x3d\x7a\x15\x92\x29\x51\x31\x27\x59\x96\x24\x69\xbf\x12\x4d\xc4\xf8\x3e\xf3\x11\x67\xa7\x90\x4e\xe6\xc0\xf5\x89\xce\x32\x4d\x61\x8c\x31\x71\x3c\x7a\x1f\xdd\x0c\x18\x13\xf6\x70\x22\xa3\x94\x9a\x7e\xd9\xd9\xed\xe5\x01\x76\x4d\x9b\xeb\x3f\x26\xef\x55\x46\x0e\x19\x1f\x1e\xd3\xa2\x34\x9d\x07\xd6\x1f\x84\x58\xac\xa9\x40\xad\x09\xa3\x2e\x3a\x5c\x4a\xfd\x32\xcb\x07\xa4\x61\x78\xcc\xb0\xf1\x24\x24\xad\x66\x2f\x50\x5a\x82\xed\x60\xce\xea\x90\xc8\xa7\x45\xdd\x34\x5c\x97\x4e\x1b\xde\x8f\x55\x51\x8c\x0b\xbf\xf3\xf7\xbb\xa7\x38\x8b\x34\x4e\x43\x97\x1e\x27\x2a\x31\x34\x1e\x9a\x42\xf3\x36\xff\x0f\x94\xb3\xbe\xd0\xf1\x9f\x4f\xdb\xde\xfc\xf1\x74\x4a\x91\xf5\x55\x36\xaf\xff\xec\x42\xe9\x0b\x1c\xf4\xff\xb8\x28\xdb\xcd\x09\xa4\x12\xe1\xc2\xd2\x98\x55\xb9\xcf\x4b\xf8\xbc\xb3\x35\xec\xa1\x85\xf1\xdc\x66\xa8\xe0\xb8\xd1\x55\x0d\x67\xf1\xc4\x74\x1f\x0b\x11\xae\xf5\x77\x8b\x3f\x77\x67\x28\x3b\x1e\x47\xa9\x44\x42\x16\xf7\xa4\x83\x3c\x13\x8f\x23\xee\x62\xf8\xee\xcb\xbc\x92\xe5\xb4\xfb\x95\xc7\x51\x26\x30\xab\xf8\xcf\x51\x7d\x96\xc7\x84\xc8\xc0\xbc\x19\x00\xc9\x93\xc9\x18\x13\x25\xb2\x31\xc5\xdd\x7d\x85\x19\x84\x8b\xa5\x33\x1e\x13\x48\x43\x07\xd1\xd5\xe9\x63\x86\xc1\xe2\x71\x0c\x71\x2a\x43\x63\xf3\x7e\x7f\xb6\x3d\x89\xec\x48\xa0\x70\x99\x0f\x7c\xc0\x7e\x40\x1a\x39\x6d\x91\xb7\xea\xa4\x5f\x66\x0d\x9f\xa3\x51\xc4\xc5\x93\x4e\x5a\xf1\x61\xa4\x9c\xc1\xe3\x94\xb9\x72\xfa\x75\xde\xa8\x53\x7d\x01\xc2\xd9\x8f\xd3\x24\x20\xea\x9c\x2e\xdf\xb2\xf3\x1a\xfc\x04\xeb\x3d\xc0\x38\x65\x8e\x0a\xe7\xbf\xa5\x7e\x3d\x56\xed\xa6\xe7\x5c\xe5\x31\xe5\x12\x9b\x29\xbc\x30\x54\xaf\x7e\xd0\xf4\x03\x94\xc0\xca\xef\xae\x7b\x65\xae\x02\x18\x36\xb1\xc4\x75\x8c\xec\xf2\x26\xd8\x20\x24\xd2\x9e\x3d\x0f\xc6\x44\xe4\x9c\x85\x26\x2f\xab\x8b\x54\x8d\x3c\xe6\xc4\xc9\x42\x29\x2c\x42\x3d\x86\x53\x70\xae\x9c\x2c\x56\x5b\xd5\x03\x91\x19\x8f\xb9\xd1\x58\xad\xbe\xba\xea\x7f\x81\x98\x9a\x89\xae\x14\xc2\xce\xd6\x66\x18\x90\x78\x3a\xad\xce\x6d\x94\xba\xc8\xff\x03\xff\x3c\x85\x0f\xfa\x72\x97\xff\xe8\xfa\x00\x5c\xe0\x72\x04\x30\xbb\x62\x40\x65\xf0\x58\x10\x86\xa0\x5c\x79\x32\x79\x3b\x02\x03\x88\xd9\x21\x44\xac\xd0\x01\x56\x95\xba\x93\xaf\xd0\x20\xa9\x4b\x20\x2f\xfd\x4c\x35\x13\x7f\x8f\xa3\xfe\xef\x78\x22\x78\x45\x76\x1e\x67\xb1\x53\xd0\x40\x02\xf6\x27\xd9\xc2\x43\x39\x7e\x58\x8a\x24\xc8\x07\x26\x8d\x99\xa8\x33\xfd\x2a\xbd\xc0\x63\xc5\x65\x94\x0c\x8a\x15\x37\x00\x8f\xc5\xa9\xb9\xce\xbb\xf7\xec\xb8\x25\x26\x25\x25\x1e\x2b\xad\xbc\xea\xbb\xd3\xf1\xf8\x78\x94\xcd\x38\x49\x39\x9a\x90\x4a\x5b\x70\xb0\xb4\x22\x7f\x83\xda\xa5\xd1\x3e\x83\x6f\x4f\x1c\x81\x58\x13\x8a\xc9\xdc\x1e\xbb\x37\x7b\x7b\x43\x66\x98\xc7\x9a\xc5\x28\xe0\x79\xac\xaa\x62\xfc\x7d\x19\x1a\x67\x62\xd2\xcc\x3a\x59\x94\x62\x10\x34\x20\x55\xfd\x5c\x42\x51\xb5\xd9\x94\xb5\x09\xc7\xfe\x93\xb2\x42\x45\xad\xe3\x25\xb2\xd8\xb3\xc7\x9a\x10\x93\x22\xb2\xd5\x57\x28\xd6\xe5\x6c\x59\x99\x18\x9b\x84\x98\x4c\xbb\x62\x5b\x9d\xc3\x39\x3d\x38\x0e\xc0\x1a\x6a\x55\x82\xed\xd9\xc6\x78\x42\x6c\x82\x28\xe8\xca\x4f\xf4\xdd\xff\xfc\x62\xa6\x8f\xef\x3d\x89\xb9\x40\xc0\x5f\x10\xb9\x5f\x76\xce\x67\xe9\xb8\x47\xa7\xa7\x8e\xb3\x34\x0e\x11\x46\x55\x37\xfa\x05\xae\x2e\x90\x73\xf1\x24\x96\xae\x91\x4b\x49\xfd\x7a\x3a\xee\xba\x8f\xdf\x54\xef\x65\x28\x2b\x4e\x1f\x4f\x12\x0b\xf7\x31\x79\x5a\x86\x1e\xb1\xd1\x6d\xb2\x98\x95\xbd\x85\x9f\x83\xe6\x31\x4f\xd2\x14\x98\xed\x71\x9f\x66\x96\xea\xe3\x49\xca\x2d\x5e\xe6\xc0\x14\x7b\x7d\x66\x7e\x12\x46\x04\xa6\xfb\xe1\x4f\xe7\xae\xfc\xf3\x24\x8b\xbc\xfd\x58\x8e\xce\xc3\x74\x66\xd2\x11\x1b\x23\xae\x1d\xcd\xe8\x7b\x27\xe3\xa4\x2d\x4f\x04\x89\x63\xa7\x01\xd1\xae\x4b\xdc\x03\x19\x76\xda\x53\x5d\xae\x7e\xea\x0b\xd2\xd9\xfd\x7e\x00\xe9\x98\x9f\xfa\xd3\xac\xcf\xd4\x67\x48\x04\x73\x90\xb9\xe6\x20\x8b\xa2\xb7\x7b\x89\xb0\x92\x3a\x7d\xef\xa6\x8b\xa6\x37\x6d\x0d\xf2\x30\x7b\x95\x59\xc2\x50\x72\x0e\x7e\xbe\xc8\x53\xd3\xde\x9c\x9a\x79\xf1\xb2\x1b\xe3\x80\xac\x98\x8c\x6a\x6f\xea\xea\x3f\x50\xe2\x84\x9c\x3e\x6e\x1d\x29\x4c\x09\xba\x38\x72\xa2\x4b\xe5\x47\x98\x38\xc5\xa8\xec\x3b\xd4\xb2\x7b\xc0\x41\x8e\xf0\xb3\x3c\xea\x67\x77\x7f\xf9\xf1\x99\x44\xe2\x5a\xd7\x99\xf9\xed\xdc\x46\xfc\xfa\x01\x1a\x4a\x31\x31\xb9\x7b\x41\x70\xf6\xb2\xaa\x8a\xeb\x39\x45\x3c\x4f\x4c\x67\x1a\xff\xcf\xff\xef\xff\x3c\xae\x9e\xd6\x0f\xd7\xbb\xc5\xcd\x76\xf5\x84\x1e\xd0\xfd\xc3\x76\xb7\x7d\x5a\xdc\x6f\x6e\x56\x4f\x8b\xab\xdb\xd5\x6e\x7d\xbf\xdb\xac\x96\xe1\x3d\x18\x90\x68\xfe\x5b\x24\x5c\xf6\x3f\x5a\x96\x62\xa1\x66\x77\x74\x76\xe8\x3a\xdf\x43\xd3\xf6\x5b\xb9\xb4\x5e\xd1\xb8\xbd\xbf\xd9\x36\x5e\x7c\x7d\x54\x69\xfa\x8c\x69\x83\xa7\x51\xe4\xc4\xdd\xbc\x9c\xc3\x7f\x49\xfd\xfa\x58\x85\x23\xa7\x11\x75\xbd\x78\xda\x21\xa5\xa5\xe9\x37\x08\xa7\x5c\xb2\x87\x16\x59\x7b\xc7\xb7\x9e\x46\x32\x55\xdd\x14\x70\x90\x8e\x8f\x6b\x28\x60\xff\x69\x92\x20\x8d\x4c\x9a\x78\x8a\x8c\x6b\x38\xd6\xa0\x65\x7b\x89\xd9\x88\xa7\x84\x03\x4a\x93\x75\x01\x4b\xeb\x3c\xb7\xb0\xc5\x3a\x6a\xa4\xce\xc1\x80\x06\x8a\x62\x68\xff\xe2\x69\x42\x19\xda\xdf\xef\xcf\xb7\xcb\xc5\xfd\xee\xf1\xe9\xe1\x6e\xb5\xfd\xba\x7a\xde\xf4\x03\x34\x60\xa8\x74\xf5\xfe\x3e\xca\x4c\xf3\x34\x65\xae\x06\xe6\x3d\x38\x9f\x39\x78\xb0\x8b\xf6\xa5\x80\x16\x3e\x8b\x47\x2f\xce\xb7\x34\xe5\x19\x22\x10\xfc\x73\x1e\x3d\xe3\x34\x8b\x50\xa8\x70\xf5\xb4\xe4\x31\x99\x26\x0a\x52\x4a\x08\xe2\x2f\x70\xc9\xde\xd9\xaa\xde\x49\x63\x76\xcd\x68\x3d\x4d\xb9\x70\xb4\x7f\x37\x35\xc0\x0e\x11\x36\xbb\xc5\xee\x5a\x7e\xec\xb0\xca\xb3\x1b\xf7\xa8\xf1\x94\x2b\x37\x55\x9e\xaa\xc1\x77\x4b\x45\x9a\x22\x1f\xce\xd5\xed\xdd\x40\xe2\xc4\x53\x49\x01\x4b\xd6\xef\x90\x3f\x42\xbd\x68\x7b\x8f\x2e\x95\x22\x43\x50\xff\x97\x87\x87\x2f\xb7\xc1\xff\x4e\x15\x48\x74\xc2\xf0\x5a\x71\x25\x7c\x28\xe1\x1a\xa4\x19\xb2\xfa\x3c\xd5\x49\x82\x3e\xf8\x57\xa9\x5f\xa1\xde\x1c\xa5\x86\x2b\x59\x97\xf0\xd1\x4c\x9e\xbd\x16\x1c\x45\x1d\xa5\x19\x48\xe1\xb6\x55\x77\xd5\x23\x4f\x61\xbc\x20\xa5\x5a\x47\xd6\xe7\x3c\xef\x64\xf9\x31\x2e\x29\x4d\xd3\x45\x64\xfe\x6a\x0c\xa3\x01\xe9\xd0\xe7\x10\x2f\x2c\x79\x29\x64\x11\xb6\x93\xf7\x7d\xf1\xde\xb7\x79\xb0\xe3\xc6\x35\x9e\x82\x31\xb1\x98\xd0\x1a\x40\xdd\x7e\x60\x26\xf3\x92\xab\x92\xda\x4c\x0a\xdf\xa0\xbb\x68\xdb\x3a\x9a\x1a\x12\x1a\xb1\x34\x04\x1a\xc1\x7d\x7e\x94\xb5\x3c\xc0\xa8\x37\x7e\xec\xce\xd0\x48\x2a\xcc\x4c\x5d\x3d\xdc\x3f\x6f\x76\xdb\xf5\xdd\x6a\x33\x3f\xa4\x91\x18\xff\x7e\x91\x07\x18\x3f\x76\x4a\x44\x9c\x26\xe7\x35\xb9\x8b\xf9\x1f\x4a\x04\x85\xa1\x05\xfd\x0b\x8a\x5e\xf7\x9b\x32\x6c\x54\x0b\xb5\x55\x9f\x28\x09\x2a\x05\x8e\xae\xdb\x8f\x4d\xa2\x88\xf0\x40\xf5\x39\x4e\xf8\x5c\x50\x2c\xe7\x34\x61\x8e\x37\xf2\xcb\x09\x9a\x66\xfb\x32\x01\x1b\x2e\x5f\xba\x3d\xca\xfe\xd3\xa0\x89\x64\x2a\x0e\x34\x1f\xf5\x69\x68\xa6\x98\x78\x81\x33\x18\x0c\x89\xa7\x54\x98\x9e\x2d\xd6\xff\x19\x1e\x62\x2a\x2c\xa2\x74\x1c\x15\xd7\x79\x1b\xdd\x45\x6b\x47\x53\x19\xa5\x4e\x69\xb3\x85\xc3\x31\xd4\xf4\xbb\xdf\x65\x50\xa1\x5a\x95\x6d\xfd\x71\x75\xc1\x95\xa2\x34\x21\x68\x8e\xdd\xcc\xba\xf6\x6c\x8b\x9f\x7b\x69\x94\x75\x5e\xaa\x63\x08\x79\xdf\xb5\x2f\xb0\x2b\xe5\x01\x76\x95\xdd\xb9\xe4\xf1\x2e\x84\x45\x5d\x78\xe7\x18\xd6\x5c\x35\xda\xe9\xe9\x2f\x5f\x40\xbf\x36\x93\x98\x23\xc4\x12\x94\x1b\x1d\x84\x52\x82\x46\x0a\xa6\xd8\x6e\xea\xea\x30\x03\x36\x85\x4a\x0d\x15\xd4\xb1\x5f\x1e\xe5\x87\xeb\xe5\x0c\xf4\xed\x97\x57\x06\x9a\x25\x1a\xd7\x68\x37\x1d\xc2\x32\x72\x8e\x84\x9a\xce\x90\x8c\x42\xec\xdb\x70\x77\xc7\x1a\xde\xf2\xea\xd4\xec\xf6\xd8\x65\xbb\xc3\xd8\x6b\x67\x2a\x7d\x3a\x8c\x58\xc4\xc2\x8e\x3c\x89\x31\x4e\xb5\x79\x69\x8e\xd5\x27\x8e\x17\xcd\x32\x63\xad\xb3\xe4\x28\x08\xea\x4e\xfe\x60\x67\xdf\x98\x4c\x89\x08\xc5\xfb\x42\xe6\x07\xa4\x1a\x6b\xe5\x6b\x3f\x39\x25\xe7\x81\xc7\xfe\xf1\xe1\xe1\x76\xd7\xf9\xa4\xbb\x38\x9b\x84\x18\x54\x2a\x81\xfc\x00\x77\xb2\xed\x62\xf6\xc9\xc7\xaa\xd2\x08\x21\x29\x61\x49\xc1\x6e\x20\x8f\xbf\x72\x8d\xcd\x61\x20\x73\x02\xf5\xab\xc5\xd3\xed\x5f\xbb\xf5\xfd\xf7\xd5\x66\xfb\xf0\xb4\xf1\xb9\x98\xdd\xed\xfa\x6e\xbd\xed\xc7\x0a\x8d\x55\xd0\x57\xad\x5f\x63\xca\x9a\xb6\x9e\x5e\x90\x56\x11\x36\x93\x8c\xf0\xe3\x9c\x6a\x90\x4c\x0d\xd5\xaa\x50\x1b\x6c\x66\xdf\xae\x49\x19\xbe\x19\xd4\xbe\x24\xab\xd2\x8c\xb3\xf0\xd4\x58\x8d\x76\xee\xa2\x93\xf7\xff\xe8\xf4\x7d\xca\xcc\xc7\x29\x48\x9b\x39\x75\x33\x57\x9a\x9c\xb0\x55\x84\x31\x26\x41\x9f\xf6\x7b\x0e\xef\x5f\x7a\x78\x14\xa7\x96\x0b\x34\x01\x48\x58\x88\xa8\x96\x0b\x62\x3f\x6e\x2c\x8b\x88\x43\xc2\xad\x0a\x70\x3c\x4b\x7f\x8b\x2a\x9d\xb3\x88\x73\x70\xec\xd2\xb2\x98\x37\xa2\x9d\xfb\x73\x2c\xe2\x4e\x20\xfe\xf1\xf9\xea\x76\xbd\x74\x39\xb7\xd5\xbd\xc7\x0e\x70\x16\x5a\x9f\x90\xe0\x6f\xe9\xfa\xd8\x73\x55\x80\x77\x19\x07\xb9\xba\xdf\x3c\xf8\x70\xb8\xd4\xc5\x12\xe8\xeb\xdf\x0e\x4c\xc6\x08\x01\xbc\xf8\x51\x33\xc2\x1c\x44\xf1\xe8\x32\x51\x53\x7f\x87\xc5\x89\xc1\xc2\xc8\xa2\x6d\xa5\x7e\x71\x22\x70\xd3\xfd\x63\x29\x84\x87\x1c\x95\xe6\x06\xe0\x0a\x6c\x55\x03\x8d\xa2\xfe\x10\xd6\xd5\xfd\x90\xd6\x83\xec\x30\x40\x75\xdc\x6b\x57\x40\xc3\xa0\x84\x1a\xac\xd1\x84\xf0\xf5\x8f\x51\x4d\x70\x0e\xcc\x20\xf1\xbf\x67\x8d\xc7\xd3\x2b\x4a\x80\x60\x06\xe4\x88\x8c\x10\x93\x86\x26\xce\x52\x66\x30\xdf\xf4\xf0\xfa\x2a\x0f\xf9\xf8\xfb\x65\x34\xa2\x59\x3c\x6e\xea\xba\x92\xfa\xb5\x73\x13\x6e\xaa\xda\x37\xe6\x16\x52\x23\x69\xd4\x2c\x43\xcd\x28\x51\x9e\x35\x0a\x7b\x45\xcf\x84\x44\x39\xa3\xb1\xc5\xec\xa2\x6c\xba\xd8\x18\x21\xee\x28\xed\x34\x01\x7c\x86\xb1\x92\x67\xde\xd9\x3a\x47\x49\x84\x31\xda\x47\x8d\xd0\x1e\xa0\x69\xf2\x6b\x78\xbb\xc4\x77\xc3\x19\x35\x06\x1b\xc2\xee\xb6\xe7\x18\xe4\xbf\xf9\xd7\x1f\x89\x47\x49\x68\x94\x70\x08\x6d\x47\xe4\xd4\x3c\x76\x16\xa6\xfb\x57\x5f\xcb\x60\x3c\xca\x10\xce\x6c\xb1\xd3\x7d\xd4\x4a\x35\xe4\x05\x18\x57\x19\xf6\x5e\xd6\xd0\xd6\x39\xbc\xc1\xf7\xd9\x33\x15\xca\xd9\x9f\x9d\x17\x12\xaf\x0f\x1f\xbf\x16\xa2\x9b\x4d\x03\x61\x1d\x64\xc6\x57\x39\xc7\x35\x5c\x3f\x22\x4b\x00\x7d\xdf\xfb\x3e\x1d\xc9\x94\x50\xd8\xc8\xb4\x01\x30\x77\x88\xb5\x5b\xca\x12\x13\x0f\x61\x80\x26\xe8\xdd\xdf\x7f\x5b\x4e\x26\x8f\x4e\x0c\x84\x42\x57\xee\x43\xd7\xb0\xd0\x32\x4d\x09\x32\xbe\x6b\xa7\x33\xfb\x78\x52\x45\xae\xbf\xf5\xf1\x12\xd3\xa0\xd1\xd9\xc0\x8a\xd2\xa6\x3d\xa9\xe6\x2c\x8d\x3f\x7d\x15\xda\x1a\x84\x24\xbd\xe7\xa5\xa9\xde\xe3\x09\xc8\x97\x33\x13\x31\x5c\xd7\x31\x7b\x81\x4c\x1f\xcd\x40\x1f\xc7\x99\x21\x2e\xff\x1b\xba\x4c\x90\xbd\xf6\xa3\x0b\x0e\x7f\x73\x56\x93\x02\xce\x61\xff\x46\x6e\xf3\x72\x5f\x54\xe5\x7e\x29\x3f\x85\x3c\x7d\x62\xa6\x80\xb9\x06\xfc\x9d\x3a\x7d\xfc\xd9\x6d\x3a\x73\x21\x26\x9e\x00\x03\xa9\x99\x67\xb1\xbb\x71\xfc\x57\x5f\x2a\x59\xcc\xe6\x8b\x4d\x28\xf4\x52\xc3\xad\x7e\x39\x93\x4e\xe6\xcc\x72\x17\x41\x8d\x5a\x47\x30\x1d\x74\xe7\xa4\x1a\xce\x55\x4c\x38\xb3\x99\xc6\x09\x91\x37\xeb\xd2\xb5\x84\x56\xf5\xc7\x74\x0c\x8f\x22\xc7\x48\x5c\x95\xc5\x87\x4f\xe8\x37\x0f\x35\x7e\xe3\xb3\x91\x24\xb6\x88\xf4\x59\xca\xe3\xb1\x3b\xb7\xd7\x14\x98\x5e\x26\x27\x09\x41\x9c\xad\x92\xe5\x6b\x7d\x3a\xb6\xb3\x1e\x18\xce\x09\x8f\x10\xce\x18\xd6\x9f\x1f\x79\x89\x4c\x81\x17\xb9\x1e\x38\x27\xc6\x29\x1c\xd6\x20\xcd\x94\x29\xd6\x0f\x88\xb9\xc4\xa8\xf6\xff\xfe\xdf\x6e\x11\x1c\xcf\x6b\x1e\x4b\xe0\x51\xc8\x0e\xcb\x32\xf4\x29\x4f\x4f\x90\x58\x89\xf4\x29\x4e\x34\xfa\xbb\xac\x73\x9c\x6f\xff\xab\x0c\x10\x4f\x35\xa4\x26\xb4\x35\x22\x32\xfa\x97\x9e\x3b\xa7\x8a\xfa\x7e\x4b\xc7\x3a\x8a\x98\x92\x66\xa6\xab\xc3\x39\x4b\xa3\xcc\xe7\xff\x9e\xe6\x14\x85\x9c\x73\xe2\xd2\x4e\x66\x26\x57\xc4\xb9\x48\x79\x70\x5b\x1d\x5a\x65\x32\x25\xb9\x60\x09\x1e\xd6\x02\x32\x09\x86\xc7\x25\x04\xc7\xfa\x9a\xa9\xbe\x81\xd6\xb2\x73\xd9\xe6\xc7\xcd\x9c\xc3\xe6\xf5\xc2\x6f\x64\x51\x74\xeb\xcc\xb2\x0b\x95\x4c\x7f\x18\x05\xd8\x76\x3b\x70\x27\x70\x9e\x31\x20\x3e\x2f\x73\x26\x01\x32\x1c\x5e\x72\x8a\xa1\xe4\xf2\x69\xe1\x79\x34\x56\xf7\xd7\xbb\xeb\x45\x28\xf1\x71\x65\x12\x47\x0b\x58\x57\xfb\xd1\x4a\xcf\x35\x17\x48\x17\xbb\xc9\x5b\x5d\x1d\x26\x73\x40\x6b\x0b\x51\xa8\x79\xb9\x0c\xe2\x73\xd9\xe6\x85\x23\xde\x0c\xa3\x40\x53\xc4\x8d\xe8\xaa\x7a\xcd\x61\x20\xd0\xf1\x48\xf9\x9e\x09\x8c\x73\xb0\x4e\xfa\x67\x03\xed\x62\xf6\x74\x2c\x27\x98\x66\x7f\xfc\xfa\xb0\xba\x5f\xff\xb9\x5b\x3e\x3c\x6d\x16\x6b\xcf\x5d\xca\x45\xc4\x78\xe4\x31\x39\x47\xd9\xe6\x23\xf0\xca\xc5\xaa\x83\x20\x26\x03\xd7\xc4\x33\x2c\xa4\x4f\x18\xa6\x7d\xc2\x4e\xc3\x45\x1c\x09\x44\xf4\x3c\x3f\xee\x50\xa9\xe5\x47\x9f\x4a\x16\x71\x1a\x23\x3e\xa1\x0b\x9b\xab\x26\x6f\xa1\xfb\x5a\x06\x75\x92\xc9\x9d\x88\x84\x08\x94\x58\x3b\x22\x54\x72\x84\x5f\xe6\x22\xa1\x3c\x48\x3d\x6d\xa0\x3d\x1d\x43\x18\x1e\x5e\xbf\x48\x13\x26\x1d\x42\x29\x2f\xaf\xf3\xe6\x58\xc8\x0f\xaf\xc3\x14\x46\xd0\xc8\xea\x20\xd2\x5f\xb5\x50\xb6\xb9\x2c\x7c\x97\xf5\xf4\x76\x28\x25\x48\x2e\xb4\xaf\x2a\xef\xb5\x84\x29\x2c\xa8\x4a\xf0\xab\xfd\xbe\x7e\x5a\xdc\x22\x6b\x6c\x38\x3a\x23\x4e\x28\xe0\xfb\xf7\xeb\xab\x33\xd1\xe9\xd9\xf3\x62\xd2\xe9\xd5\x07\x1e\xb6\xd5\xa1\x0b\x58\x61\xe6\xb2\x0b\xa6\x95\xd1\x7d\xd3\xb2\x7e\xdd\x9c\xea\x63\x71\x6a\x86\x72\x97\x60\x36\x16\xda\x1f\xa8\x2a\x9b\x75\x33\x84\xf0\xd3\x27\xcb\xac\x49\xa3\x1e\x22\xd5\xcd\xb2\x66\xf2\x78\x39\x65\x81\x60\xcd\x35\xdd\x3c\x56\x45\xae\x3f\x3e\xb9\x7e\x9e\x65\xd8\x93\xf1\xcf\xa7\x6d\xd5\x3f\x5e\x11\xb9\xac\x80\x3a\x15\xaf\xee\x32\xf6\xb0\xda\xef\x87\xcd\x3a\x4a\x47\xf0\xed\xaa\x3e\xa7\x5d\x3a\x8f\x05\x84\xa0\x09\xba\xca\xcb\x17\x59\x96\x50\x2c\xba\xe0\xf7\xec\xee\x84\x8c\x30\xfb\x84\x12\xd1\xde\xa5\xbb\x93\xc7\xd9\xe3\xcc\x52\xd7\x29\xea\x73\xa1\x45\x55\xce\x1f\x78\x46\x75\x68\x5d\xf5\x46\xfb\x22\x89\x11\x17\x99\x74\x71\xef\x6d\xa5\x27\x1d\x1d\x5c\x64\x8a\xe8\x31\xa4\x15\x57\xb4\xb0\x80\x5c\x7e\x9a\x99\x92\xa8\x88\x9c\x37\xcf\xa5\x13\x07\xbb\xaa\xda\x97\xd9\x19\x25\x77\xb2\x2f\xa3\x56\xa6\x1b\x80\x73\xeb\x2c\xa4\x64\x38\x0f\xbd\xc3\xe1\x2e\xee\x72\x9a\x37\xec\x61\x1d\xb9\x9c\x87\x00\x84\xb4\x52\x9f\xb4\x16\xca\x33\xf1\x7e\x79\x7c\xfe\x39\xb9\x59\x15\x1b\x74\x47\xe1\x54\x57\x5b\x90\x87\x99\x8b\x2f\x54\xe2\xea\x31\x65\x55\x1f\x64\x91\x37\x18\x07\xac\x4b\x33\x46\xff\xf7\x6f\x5a\x29\x17\xce\x38\x45\xa1\x4f\x1e\xbc\xd2\x3a\x76\x3a\x77\xe6\xa4\xe1\x1a\xd4\xa7\x1c\x0f\xfd\x0e\x8e\x9a\x78\x44\xd1\x75\x76\x48\x8b\x95\x53\xd4\x46\xde\x56\x9e\xb6\xfd\xd2\x3a\x3c\xab\x72\x0b\x9d\xa4\xc8\x1e\x9d\xff\x90\x65\xbb\xad\xbe\xe5\x45\x71\xf7\xd1\x40\x11\x10\x7b\x42\x33\x86\x9f\x84\xcb\x62\x5e\x2d\xb6\xcb\xaf\xfd\x26\x9b\xa2\x36\x45\x17\xe1\x6d\xe1\x70\x24\x61\x83\xa1\x8e\x7d\xf8\x0b\xb4\xd7\xb9\x79\x94\x1f\x0f\xa7\x59\x92\x47\x18\x48\x11\x9c\xf5\xd0\xe3\x46\x84\x01\x81\x26\xcb\x5f\xf6\xb6\x5a\x34\x3a\xcf\xa7\x34\x01\xb3\x69\x07\xb1\xe5\x83\x98\x1c\xb2\x6f\xf6\x9e\xe4\xf0\xee\x21\x13\xc8\xda\xa1\x4e\x75\xb9\x6a\xf4\x48\x38\x28\x0c\x80\xbe\x15\xdc\x17\x90\x3b\xb7\xfa\x2a\x94\xe7\xc3\x05\xda\x8c\x61\xcf\x61\xf3\x52\x1d\xb7\xd5\x61\xf8\xdd\x32\xec\xf8\x2c\xe1\x7d\xf7\x22\x9b\x97\xe9\xad\x66\x11\x51\x1e\xc0\x52\xba\x2c\xa9\x6b\x62\xfb\xa5\x57\x94\x45\xb1\x44\x92\x03\x54\xba\xc8\xfb\x96\x16\x9e\x45\xdd\x73\xf7\xad\x79\x8b\xf2\x03\x7b\xef\xfa\x6d\xc6\xe9\xb2\x04\x0a\x5f\x27\x95\x3d\xcf\xd5\x8c\x9f\xd0\x64\xd9\xcc\x48\x1a\x61\x93\xf9\xd5\x7a\xbb\x59\x2d\xba\x55\x68\xd4\xc2\xfc\x79\x0a\x67\xb8\x6a\x92\x46\xb6\x57\x13\x5a\xf7\xa4\xa3\x61\x81\xcb\x08\x75\xd4\x2c\x56\x9e\xf4\x3c\xa3\x90\x11\x11\xd1\x78\xa4\x52\xbd\x76\x49\xeb\xbc\xdc\x3f\x75\xe1\xdb\x24\xb4\xca\x62\x45\x11\x98\x7d\x05\x6d\xb7\xba\x07\xa2\x45\x9e\xc5\x40\x30\x47\x84\x49\xd3\x65\x50\xfd\xec\x37\xc6\x6c\x58\xb4\x5c\x6e\x74\x67\x43\x7f\x0e\xcf\x92\x98\xa3\x32\xf5\xf6\x61\xbb\xb8\xdd\xad\xb6\x5f\x57\x4f\xbb\xaf\x8b\xa7\xeb\xdd\x72\xf1\xd8\x8f\xa1\xc4\x35\x4c\x3a\xd6\x4d\xec\x37\x0b\x9b\x84\xf2\x69\x18\x6c\xa8\x5a\x22\xdc\xd6\x09\xee\xdc\x39\x58\xc6\x28\x5c\xcb\x12\x65\xcd\xa0\x42\xbc\xb9\xfe\xb4\x57\x78\xf6\x90\xd3\x38\x45\xe7\xe6\xeb\xc3\x8f\xdb\xc9\xdd\xa5\xb1\x03\x5d\x5a\x00\x47\xc4\x37\x65\x75\xe1\x59\x4a\x01\x21\x1f\xb2\xfc\xc0\x94\xce\x57\xe9\x1b\x53\x9b\xd1\x08\x6c\xd7\xb8\xc9\x4b\x73\xf7\x71\x93\x37\x2f\xbb\x55\x17\x2e\x5e\xc9\x5a\x57\xc6\xe7\xc1\xb3\x30\x98\xb9\xb7\xd9\x4d\xc5\x40\x2a\xda\xfd\x2a\x91\x71\x74\xf3\xb8\xfa\x36\xb9\x3c\x1a\x31\x1c\x8e\x9a\x63\xed\xf0\x5d\x65\x94\x5a\xc4\xf9\xad\x7e\xca\xce\x21\x0a\x4a\xa4\xdb\x7a\x78\x31\x34\xcb\x10\xd7\xae\xa5\x97\xbd\x5e\x99\x7c\xdc\xb1\x3b\xce\xa3\x64\xdd\x4a\x43\xfb\xf4\xfc\xba\x7c\xcb\xbb\xff\xb7\xd5\xa5\xa4\x4b\xc6\xb5\x83\x02\x6e\xa0\x6d\xbd\x33\x37\x43\x0b\x66\x82\x1b\xa7\x6f\xbc\x59\x06\x57\x29\x13\x42\x22\x61\x88\x96\xb5\xd9\xed\xab\xc2\xec\x6c\x5e\x0f\x33\x41\x64\x0a\x7b\xb4\xd6\xcd\x32\x6f\xb1\x84\x80\x3c\xe8\x33\xcb\x20\x0c\xc5\xfc\x40\x8d\x1e\xf1\xc4\xb4\x65\x19\x8d\x31\x3f\x17\x16\xe1\x9b\xba\xf3\xce\x7f\xbd\x52\x64\x2a\x4b\xb1\x01\x0b\x3c\x61\x68\x70\xa5\x1e\xa7\x88\xef\xf9\x5e\xd2\x60\x68\xf2\x5c\xe6\x6f\x50\x37\xb2\x08\xa4\xbb\x01\x9a\xf6\xbf\x20\x26\xe6\x99\x36\x89\xf6\x54\x40\xdd\xd1\x1c\x7c\xfd\x8f\x7e\xa3\x25\xde\x7f\x45\xaf\xe2\x4c\x23\x97\x67\x26\xb5\x68\x4d\x9d\x83\x80\x54\x3b\x37\x00\x41\xff\x62\x7a\xe5\x86\x5a\xe5\x28\x34\xd5\x69\x8f\xb6\x37\x59\x9f\x0f\x92\x2e\x6a\x2e\x01\x8c\x83\xa4\x86\xab\x31\x8a\x33\x0f\x2d\x5c\x9f\x0c\xfc\x9c\x5d\x09\x44\x4a\x0c\x1c\xbc\x8b\xb2\xea\xe2\x02\x84\xcc\xc4\xb3\x91\x36\xe2\x88\xad\xbe\xba\xbf\xdf\xa1\xda\xd4\x62\xdb\x8b\xd1\xf2\xcc\xc6\x8e\x8a\xb6\x39\xa9\x43\xde\xf9\xae\x3f\x3f\x30\x92\x0b\x68\x00\xfa\xef\x71\xdd\x30\xb3\x8c\xe0\x70\x64\xc0\xbf\x86\x51\x8d\x3b\x0c\xd0\x31\x85\x31\xd9\x92\x2c\x0a\x35\x52\xe8\x9c\x66\x53\xc2\x4e\xe0\xa4\x3c\xde\x42\x0c\x29\x22\xf7\x1d\x44\xfd\x00\xc9\xbd\x77\x76\x5d\x15\xe7\x5e\x99\x8c\x98\x70\x1a\xce\x03\xec\xf0\x2e\x2f\x07\x4f\x5e\x12\xaa\x51\xe4\xc1\x19\xb4\x07\x6b\x9b\xe3\x64\xed\xbe\x9c\xbe\x0b\x3b\x4b\x2a\x3c\x1c\x0d\x65\x86\x9f\xa0\x01\x5c\x86\x67\x57\x11\x13\x81\x29\xd7\x1f\xe0\x9a\xcf\xa7\x9f\x94\x8c\xb9\xe4\x2c\xa4\xd4\xfa\x00\x6b\x26\x25\xc9\x65\x0c\x0c\x21\x9b\xdf\xab\x5c\xc3\x08\x36\x24\x13\x9e\x20\x98\xbe\x3b\xe9\xba\xbc\xbc\x52\x4f\xff\x73\xd6\x36\xcc\x25\x4d\x12\x70\x92\x5d\xfb\xc7\xba\x3a\x74\x2e\xa3\x57\xea\xff\x6c\x25\x9e\xee\xcf\x29\x43\x48\x8e\x63\x0f\x0b\x80\x14\x29\x12\xc7\x3d\xb6\xfd\xf6\x34\x36\xab\x52\x50\x97\xc8\x6f\x50\x78\x66\xf6\xb4\x84\x76\xcd\x04\x21\x4a\x7b\xfe\x95\x70\xce\xe5\xcb\xc9\x18\xc7\xef\xf9\x5d\xe6\x6d\x5e\xee\x6f\xaa\x1a\xeb\x68\x93\x5a\xbb\xcc\x98\x41\xce\x95\x63\x37\xb9\xb7\x7d\x7a\xaa\x7d\x71\x02\x04\x17\xe8\x69\xff\x31\x2b\x01\x4f\x3e\x28\x99\x89\x04\x61\x6d\xdb\xba\x2a\xa1\xce\xfb\xe5\x5d\x4a\x69\xc1\x11\xdf\xef\xf7\x05\x2c\x6a\x8c\x8e\xbf\xe7\x4d\xae\xf2\xe2\x0c\xdb\x2b\xa5\x8d\x84\x0a\x7a\xdb\xfb\xaa\xb9\xfa\xf0\x5c\x83\xd3\xef\x57\x2a\xc3\xb1\x3a\xb0\x7b\x87\x7c\x5b\xdd\xcd\xf4\xb1\xb8\xd4\x9a\x10\x8f\x40\xbc\x99\x6a\x65\xf8\x01\x86\x65\xb8\x84\xdd\xad\xef\x77\xcf\x8f\x48\x6e\x7f\x11\x47\x2c\x8d\x16\x09\x3a\xb9\xe5\x1e\x8a\x91\x37\x20\x41\x51\xd7\xf6\xe8\x94\xde\xb1\x47\x39\x5f\xde\x6c\x67\x57\x02\x20\xb0\xd1\x73\x07\xb5\x6c\xe0\xbe\x32\xf0\x35\x87\x5a\xd6\xfa\xe5\xe3\xbc\x89\x6d\x6a\x99\x25\x80\x72\x7e\x30\xe8\xea\x00\x9b\xff\x39\xe5\x75\x0d\xc5\x61\xa4\xac\xcb\xa5\x4d\x00\xb1\x94\x9b\xed\xe2\x09\x59\xea\xbe\xae\x1f\x37\xdb\xa0\x22\xc3\xa5\x55\x22\x8b\x06\xee\xe5\x19\xcb\x37\x57\x51\x44\x30\xb9\x70\x2a\x8f\xf2\xd4\xcc\x6c\xbb\x8a\xb8\x36\xbd\x1a\x04\xc6\xd0\x5f\x03\x02\xba\xbf\x45\x45\x98\x20\x24\x24\xf8\x1c\x88\xd2\x6f\x49\x52\x85\x9e\x0f\x32\xd3\x6e\x46\xe0\x1b\x95\x64\x29\x12\x10\xbb\x6f\xe6\x02\x7d\xf8\xc5\xb9\xad\x52\x9a\x08\xd6\x8b\x02\x20\x57\xe3\xd8\xd2\xaa\x94\x3b\xae\x8b\xea\x55\x1e\xf2\xbb\xbc\x47\x17\xec\xc2\x79\x69\xea\x06\xec\xa1\xc5\x85\x61\xa2\x82\xcc\x15\xcb\x00\xc5\x96\x76\xaf\x79\xdb\xce\xd5\xea\xb8\xe2\x11\xc5\x2e\xd4\xa3\xac\x9b\xa0\xc4\x30\xb2\xd9\x8a\xc7\x29\x0f\x4c\x91\x53\x14\xc6\xf4\x73\x51\x5c\x46\x18\x70\x3d\xca\x8f\xfe\x91\x08\xdf\xf4\x65\xe0\x4d\x57\x65\x3c\xb6\x19\x4a\x0a\x46\x03\x65\x9e\x2c\x5f\xa3\xb8\xdf\xa0\x20\x86\xe1\xf5\x82\xb9\xd2\xa1\x5a\xa1\x94\xcd\xb0\x2e\xdf\xd9\xd1\xc6\x8b\x73\x84\x6d\x5a\x6b\xe5\x1e\xe4\x5b\xf5\x8a\xe4\xe6\xb2\x84\xf2\x4c\xe9\x22\x8c\x06\x27\xbc\xdc\x40\x69\x06\x74\x5d\x17\xc4\x62\xea\xec\x6b\x75\x80\x71\x5c\xa3\x4c\x2c\x31\x1f\x20\x8b\xa2\x42\x58\x5a\xf2\x57\xaf\xce\xca\x55\xe7\x30\xa8\x50\x82\x39\x00\x99\x9d\xcc\x46\x0e\x05\xe7\xfc\x89\xee\x2d\x19\xf7\xaa\x5e\xf2\x63\x5b\xcd\x07\x33\x86\xa8\x51\x7f\x7b\x37\x55\xed\xa3\x90\x4f\xf2\xae\xca\x4a\x95\x25\xbd\xa2\xff\xe2\x4a\x4e\xea\xa8\x3a\xe2\x91\xe3\x95\xd3\x2f\x60\x4e\x05\x2c\x65\x71\x2e\xfb\xe1\x7a\x62\xe6\x9d\x1b\x97\xc2\x75\x4d\x32\x85\x4b\xec\xb1\x6a\xda\x1b\x6c\xa8\x3f\xaf\x6f\x69\x22\x79\xe4\xda\xf0\xe5\x1b\x14\xcf\x65\xde\x0e\x1e\x98\x26\x36\x83\x41\x25\xb9\xe7\x98\x9a\x9b\x44\x4d\x2c\xa0\xd9\xc7\x28\xf8\x13\xb5\xba\xb1\x23\xad\x93\x2c\x41\xb8\x53\x70\x58\x37\xa7\x23\xd4\xa7\xb3\x8a\xa8\x4e\x54\xc2\x59\xef\x9d\x77\x11\xf1\xe5\x3c\x89\x4e\x6c\x96\x85\x24\xae\xc3\x23\xcd\x06\xd0\xc8\xd1\xf8\xae\x9b\xed\x4b\xde\xac\x7e\xba\xb2\x56\xb8\x51\x16\x65\x8e\x3b\x59\x16\xda\x69\xa8\xcd\x76\x67\xdc\x91\x82\x3d\x55\x0a\xc5\xd9\x4c\x5e\xee\xd7\xba\xea\xf7\xd7\x2e\xf1\x81\x79\x6c\x5c\xd2\x7a\x2b\xa9\x05\xe5\xe8\x19\x2a\xd9\xea\x17\x24\x93\xb8\x80\x04\x08\x28\xa6\x90\x1d\xd2\x42\x39\x1e\x5b\xec\x58\x43\xf7\xe6\x13\x42\x5b\x3f\x5e\x66\xa9\x75\x72\x8b\xc6\x9c\x97\x96\xb5\x8a\x6d\x68\x19\x5d\x97\xad\x08\xd7\xa6\x52\x81\x42\xc1\x28\x71\xe8\xc2\x5f\xf4\xb2\xfb\xcd\x19\x8a\x85\x1f\xf2\x32\x10\x7f\xfc\xda\x48\x6a\x1d\xbb\x08\xc9\xc5\x6d\x55\x0d\xcd\xa3\xac\xa1\x6c\xe7\x30\x2f\xad\x69\x96\x86\x46\xc4\xbc\x00\x74\x13\xa0\x5e\x78\x7c\xc9\x80\x2d\x26\xfd\x91\x15\xc4\x22\xe0\x45\xd7\xcb\x07\xdf\xd0\xf2\x70\x84\x9e\x09\x83\x6b\xad\x45\x04\x8e\xfb\x66\x73\x90\x75\x4f\xc1\xe1\x7b\x70\x86\x3c\x8f\x36\x71\x82\x7d\xd1\x5b\x90\x87\xdb\x4a\xbf\xf6\x52\x43\x71\x7a\x57\x95\xed\x4b\xff\x55\x1a\x46\x23\xe7\xea\xca\x62\x04\xb2\xfe\x2c\xfc\x9e\x7f\x98\x93\x55\x55\x1b\x13\x39\x38\x6c\xb3\xd6\xd5\xba\x7c\x9c\xd6\x57\xb4\xb1\x1c\x43\xb2\x29\x7a\x75\x4c\x48\x31\x3d\x1c\x44\xae\x73\xa5\xf3\x24\x1e\x9f\x56\xbb\xf5\xf2\x61\xb7\xb9\x7d\xf8\x72\xbf\x5b\x3e\xdc\xde\xae\x96\xdb\x55\x00\x91\x68\x90\x54\x3b\x32\x33\x79\xf4\x42\xa7\x6b\xb3\xad\xae\xe5\x41\xee\xe1\xa6\xaa\x57\x25\x1a\xb1\x73\x40\xb5\xdf\xdf\x66\x12\x31\x2a\xcd\x4b\xf5\x8e\x26\x71\xb6\x3e\x69\x6b\x7a\xd2\x98\x9b\x53\x5d\xca\x19\xff\x27\xd7\x16\x00\x49\x12\x3e\x65\x66\x9e\xde\x9b\xb5\xa9\x33\x4c\xc7\xe1\x14\x36\x4d\x7c\x40\xf8\xed\x54\x36\x17\x5b\x12\x4c\x94\x38\x89\xa5\xfb\xaa\x7d\xc9\xcb\xfd\xb6\x72\x99\x95\xf9\x28\x91\x60\xe3\xf6\x0e\xba\xc8\xa9\x8b\x50\x5e\xf3\x62\xea\x01\x9c\x89\x6b\x4f\x9f\x88\x21\x49\x46\x7a\xa6\x17\x6c\xa4\xf8\x63\x36\x80\x6a\x87\xcf\x6b\x07\xd7\xcd\x10\x2e\xa2\x89\x58\xe8\x99\x8e\x36\x37\x44\x53\xb4\x46\x4e\x54\xf2\x92\xd0\xee\xf4\x66\x62\x2a\x23\x3b\x42\x49\x78\x35\xff\xe9\xa0\x34\x8a\x49\x60\xed\x76\xd4\x1c\x3f\x5e\xa0\x7c\xfc\xa8\xe5\x21\x0f\x8c\xad\xd8\x12\xdc\xe0\x42\xfc\x13\x73\x02\x81\x68\x89\x9b\x34\x4d\x31\xdb\x65\xa0\x95\xfa\x65\xa0\xa0\xe8\xb7\x33\xc2\x7b\xef\xd9\xaf\xbc\xe3\x6e\xde\x5f\x27\x23\x4c\x6a\x13\x44\x74\x9d\x4a\x47\xfd\x72\x89\x42\x96\x1b\x4a\x09\x56\x4e\x77\x8d\xb4\x5e\x76\xed\x13\xc8\x92\xa1\xd4\x29\x09\x1d\x4f\xaa\xc8\x9b\x97\x09\xf3\xcd\x24\x91\x69\x28\x8b\x99\x7f\x8f\x8e\xbf\x7d\x5c\x28\x32\x34\x73\xda\x91\xb7\xd5\x3e\x74\x96\xe1\xba\xfc\x49\x64\x32\xbb\x88\x2c\xc9\x5c\x66\xe7\xbb\xc7\x2c\x4d\xc8\xf8\xb8\x61\xc4\x22\x8e\x7e\x34\x15\x2e\xdf\x0e\x8b\x25\xf6\xd2\x06\x5f\x03\xe0\xae\x32\x48\x4d\x39\x7f\xcf\xcc\x52\xeb\x96\xb2\xf2\xb6\xda\xaf\x67\xe8\x02\xc3\x23\x1d\x44\xf0\xd6\xba\x7a\x3a\x15\x30\x4a\x4a\x1a\x4e\x12\x43\x27\xfc\xc6\xdd\x5a\x32\x79\x20\x9c\x53\x6c\x48\x83\x63\xa5\x5f\x26\x1e\xac\xe1\x82\x19\x87\xc6\xe9\x02\x6a\x57\x51\x5b\xa1\x5e\xab\x19\x73\x52\x98\x2c\x49\xb0\x7c\x0a\xe5\x10\x6c\x23\xf6\x3c\x19\xc8\xc7\xb9\xc9\xac\xc1\x15\xa2\xaa\x0d\xd4\xb7\xb2\x69\xc7\x1b\x25\xb1\xca\x89\xc7\x04\x19\xe2\x17\x79\x38\xe6\x95\x03\x4c\x85\x41\x19\xc1\x54\xfd\x75\x65\x02\xcf\x3c\x37\x4a\x44\x7e\x61\x3d\xe4\x65\x68\xd1\x9b\x3e\x23\x05\xd6\x84\x36\xdb\x9f\xba\x38\x99\x4f\xf8\x67\xb8\xd1\xb1\xcf\xf2\x43\xdb\x5d\xe1\x59\x1d\x34\x0c\xa3\x0c\x23\x6b\x97\x1c\x72\xc6\xf7\xbf\xbe\x7d\xf2\xaa\x35\x35\x99\x09\x17\x38\x7c\x60\x3a\x73\x4d\xe7\xd7\xb2\x9a\x2f\xa6\xc6\xc4\x16\x69\xe7\x16\x65\x67\x00\x7e\xfe\x96\x9e\xc0\x18\xe1\x60\x5a\xbe\x6b\xf4\xcb\x49\xd6\xb2\x6c\xa1\x5f\x48\x8d\xb1\x31\x09\xb2\x6f\xd5\x1b\xd4\x5f\xa0\xfd\xeb\xf9\x6e\x66\xa7\x20\x66\x32\x60\x46\xc2\x8e\x56\xa4\xa9\x1a\xd9\xb7\x33\xce\x36\x0e\x11\x27\x58\x9b\xc5\x52\xd0\x28\x63\xb9\xac\xea\x1a\x74\x5b\x7c\xa0\xcc\x4a\xc0\x0e\xe7\x55\xe9\xc1\xfa\xbd\x27\xde\x1f\x48\xc5\x58\x95\xc4\xc2\x03\x7a\x1b\xd3\xe7\x0e\x44\x08\x1f\xb2\xa1\x4f\xf8\x9b\x96\xab\xc9\xcd\x01\xb1\x12\xe2\xd1\x72\x75\x91\xe1\x73\xb6\x4f\x9c\xb8\x08\xef\x45\xd6\x46\xcb\xe3\xf3\x26\x2c\xbf\x10\x7b\xfa\xb7\xc7\x53\x51\xf8\x04\xeb\x52\x1e\x47\x88\x2b\x88\x85\x70\x7e\x86\xf7\xfe\x47\xcc\x3b\x97\x97\x64\x48\x33\x2d\x9d\x22\xb9\xed\xdb\xa1\xfe\xce\x55\xa6\x90\xd1\x40\xbc\x19\x38\x00\xc6\x57\x42\x13\x87\xbc\xf2\x18\x65\x8c\x9d\x57\xdb\xaf\x3d\x3f\xdd\xa0\xb0\xc6\x81\x2a\xc0\xe5\xcc\x8f\xdd\x1d\x4e\x45\xbf\x09\x40\xd2\x49\xa1\x6c\x24\x19\xc6\x81\x45\x3a\xe6\x7d\x6c\xb1\x08\xfa\x8d\x72\xae\x49\xc2\x81\x49\x86\xf9\xf1\x6e\x25\xf1\x2a\xc9\x85\x2c\xff\x18\xb6\xca\xee\xdb\xba\x5b\x6d\x37\xac\xff\x51\xc7\xd6\x09\x17\x0c\x94\x20\x61\x1b\x27\xda\xf0\x50\x3a\x82\xb5\xae\xbe\x3a\xc1\xdc\xe9\xe4\x06\x2e\x2d\x66\xa9\xa4\x31\xeb\xc7\x9b\xcd\x4d\x5e\xc0\x9c\x15\x6c\xd6\x90\x30\xdd\x5f\x70\x82\xf9\x07\x35\xe7\xd7\xe3\x20\x6c\x1a\x91\x01\x7a\x7d\x2b\x4b\xe3\xb8\xe0\xa7\xf7\x9d\x89\x14\xab\x77\x2e\x18\x45\xaf\xb4\xf8\xc0\x5c\xeb\xe5\x33\x4a\xca\x92\x5e\x6f\xbf\xb9\xfa\xb8\x6d\xf5\xf6\xe7\x64\xbd\x01\x29\x32\x0c\xbd\xfb\x4e\xed\xf0\xbb\x92\x58\x12\x37\x60\xe5\xa9\x68\x3d\x9f\xf6\x14\xe7\x0b\x12\x0c\xb6\x0f\xec\xf2\x66\xe6\xfc\x81\x4a\xd2\xc4\x11\xd2\xeb\xaa\xc6\x80\xa5\x33\xe9\x9f\x74\xcd\x86\x7d\x32\x2a\x7d\xb7\x6f\x5e\x6e\x8e\xa0\xf3\x01\xae\x37\xff\x26\xff\x15\xff\x3b\xec\xa5\x63\xfc\xa4\x3d\x29\xf5\xce\xe6\x3f\x3f\x97\x41\xea\xf7\xe1\xd2\x71\x54\xef\x6f\x65\xed\x05\x0c\x02\x59\xf2\xaf\xbf\x15\x88\x53\xe9\x5b\x26\xee\x4f\x87\x4f\x1e\xbc\xa5\x02\x2b\xf9\x5a\x96\xd7\x60\xeb\xaa\x69\x3d\x75\x4b\x78\x74\x36\x22\x04\x9f\xbb\xe9\x4c\x1e\xbe\x9e\x95\xac\x8b\x8f\x40\xd0\x36\x8c\x4b\x62\x9c\x34\xee\x95\x9f\x2b\x9c\x73\x1b\xa5\x26\x1e\x04\xa9\x6e\xc1\xec\xcf\x85\x57\xff\x75\x8e\x87\x3e\x03\x9a\x58\x92\x25\xd4\xf6\x94\xfd\x33\xd3\x38\x3d\x27\xc9\x18\xc6\x96\xa8\x0b\x98\x9b\x75\xb0\x6a\x96\x58\x86\x71\x7f\x2d\x6b\x27\xd5\x73\x2e\xbb\xc9\x6d\x9c\xc4\x08\x25\x55\xa7\x8f\x9b\x93\x7e\xed\xef\x35\xd6\x4c\xf1\x11\xb3\xc3\x83\xb5\xa8\x70\x3d\x42\xb8\x7f\x92\x4d\x0f\x07\x30\x1c\x7b\xbb\x6e\xab\x72\xbf\x85\x3a\xa4\x7d\x6d\x12\x53\x14\x46\x71\x0f\x11\x2f\xc9\x19\x39\x0c\x6d\xa7\x17\x97\x32\xad\x46\x39\xac\x39\x48\xc3\xa6\x5c\x61\x8a\xb2\x79\xd9\x99\x0a\xf5\x5a\xc3\x59\x52\x43\xc7\x52\x23\x7d\xf3\xfc\xe5\xd9\x6e\xa9\x54\x5e\x90\xa1\xf5\x75\xf2\x16\x15\xe4\x0e\xd5\x65\xeb\x6e\x59\xec\x42\xd9\x9b\x53\x69\x26\xca\x2f\xdc\x32\x0a\xb1\x6f\x7e\x9b\x72\xdc\xba\x6f\xbd\xbf\x78\xc6\x52\x30\x41\xed\x7b\x13\x8a\x4d\xab\xeb\xdd\xf6\x61\xf7\xf8\xf4\xf0\x70\x13\x0e\xc8\x23\x85\xd9\xba\x1f\x55\x5d\xfc\x5d\x8e\x35\xcb\x55\x16\x8d\xf8\x78\xd1\xb8\xcf\x91\x95\x56\x30\x85\x31\x50\xfb\x02\x4f\xf9\xdb\x70\x0b\x19\x49\x9d\xe3\x24\x75\xed\x03\x85\x7e\x53\xea\xa8\x78\x64\x5e\x5f\xd7\x5e\x61\x61\xdd\x34\xa7\x6e\x58\xaf\x44\xc8\xad\xe4\x11\xea\x51\xee\xdc\x6b\xc6\x3a\xd0\xa4\x25\x79\xf6\x3c\xa5\x24\xac\x27\xf3\xc5\x8b\xfd\x92\xbf\xc1\x19\xf5\x8a\x1f\xad\xa4\x8e\x3c\x9a\x18\xbd\x91\x5e\x20\x28\x24\x8e\x86\x54\x82\x55\x2a\x43\xbb\x18\x26\x72\x30\x8e\x17\x63\x18\xab\x93\x2c\x73\xa6\xb2\x0d\xd0\xde\xdf\x04\x47\x56\x0b\x89\x20\x20\x7d\x6a\xda\xea\x30\xa5\xc7\x09\x43\xb2\x0c\x43\xc0\x00\x84\x3f\x5d\x74\x1c\x7e\x0d\xb9\xb6\xc6\xc6\x6a\xec\xf2\xd4\x9d\x57\xf0\x2b\xc5\x40\x6e\x81\x4a\xb4\x22\x37\x4f\xab\x95\x63\xbc\x7c\x7c\x7c\x58\xdf\x87\xd6\x24\x6b\x0d\xd7\x03\x6e\xe1\x1e\xfa\x87\x73\x56\xdf\xba\x6c\x7a\xac\x11\x2c\xe9\x45\xcb\xbe\xe6\xc6\x40\x19\x04\x21\x27\xd5\x3c\x11\x45\x22\x46\x05\x95\x43\x5e\xb6\xa8\x0a\xe1\x9f\xed\x85\xd9\x20\x22\x12\x39\xed\x39\xe4\x46\xc9\xcb\xfd\xa6\x94\x79\x31\x96\xa0\x11\x51\x4c\xe8\xb4\xa8\x9e\xf7\x09\x43\x11\xc5\x31\x35\xd4\xa7\x9f\x9d\x2a\xce\xb9\x11\xee\x87\x1a\x8f\xac\xd6\x9d\x27\xed\x98\x97\x3e\xa5\xf4\x1c\xe2\xa4\x6e\x4f\x40\xd1\xb7\xc5\xab\x3a\x15\x27\xb7\x70\xac\x97\x0f\xfd\x35\x68\x96\x79\x93\xe2\x83\xb5\xe9\xfc\xef\xa7\xa8\x88\x62\x1b\x39\xd2\x60\xf9\x86\x6a\xf1\xe3\x84\xbc\x88\x52\xee\x58\x6d\xf6\xd0\x3a\xbd\x9d\x99\x08\x9a\x88\x28\x4b\xb2\x78\xc4\xff\x71\x61\x66\x8b\x88\x72\x27\x05\xa1\xab\xd2\xe6\xf5\x21\x7c\x32\x2e\x49\xd3\x8f\x31\x88\x5c\xec\x15\x94\x90\x31\x73\x5b\x39\xb6\x9e\xd3\xd0\xad\x28\x22\x2a\x12\x04\x50\xea\x02\x64\x8d\x3d\xce\xd3\x57\x48\x85\xc0\xea\xeb\x8b\x7c\x03\xb3\x70\xc6\x22\x9c\x86\xc5\x80\xf1\xcd\xf7\xf5\xd3\xf6\x7b\xc0\xac\x8a\x88\x29\x89\x3a\xd4\xeb\x52\x55\xed\x04\x29\x78\xd6\x64\x26\x22\x1e\x39\x7e\x0e\x53\xbd\x97\xdb\x17\xb8\xee\xdc\x94\xf5\xe1\x00\x26\xef\xe3\x50\x11\xf1\xd4\x60\xd1\xf0\x15\x3c\x5b\x59\xf8\x9d\x39\x5e\x96\x76\x10\x16\xdb\x56\x0f\xe5\xfb\xf0\x24\x38\x8f\x12\x33\xb0\x8a\x7e\x91\x8d\x5b\x3c\x87\xaf\x5a\x44\x5c\x30\xed\xbd\x0f\x64\xbc\xc1\x16\xf9\xe9\x53\xe0\x42\xd2\x21\xe6\x5e\xa0\x58\xcb\x7c\x72\x85\xa1\x19\x70\x35\x22\xe8\x7c\xb0\xde\x51\x9b\x1d\x52\xc4\xb1\x13\xad\xa8\xf2\xf2\xb6\x0a\xa4\x9b\xd3\x77\x2d\x80\x20\xf8\x5c\x41\xfb\x50\x7a\xef\x76\x76\x14\x00\x42\x03\x45\x00\x3a\x45\x33\xc7\x5e\x44\x19\x48\x4c\x77\xbe\xe4\xde\x71\xf0\xbf\x2b\xee\x3c\x06\xef\xe3\xfd\x3a\x6c\x0b\xfb\x98\x0c\xb5\x41\x06\xdc\x23\xb6\xd2\xff\x31\x7e\xa3\xca\xb8\x6c\x8b\x71\xbd\x2e\x57\x4e\x40\x6e\x57\x95\xc5\xc7\xae\xa7\x88\x16\x91\x8e\x2c\x62\x2a\x96\x0f\x77\xeb\x6f\xab\x11\x75\xb8\x88\x74\x2c\xb1\x5c\x5f\xe2\x1d\x3f\xd8\xe0\xe2\x06\x0f\x4e\x44\x9a\x46\x58\xc5\x5b\x37\x8f\x35\x1c\x64\x7b\xaa\xe7\x8f\x57\x5b\xc7\x84\x8b\x6e\xba\x27\x93\x95\xfd\xcc\x05\xce\xb1\xa8\x84\x86\x29\xa8\xae\xf5\x1b\x65\x8a\x6b\xc7\xa3\x6c\xeb\xaa\x73\x09\x82\xf2\xf5\xec\xc1\x82\x75\xe4\xd7\x58\x15\xfd\xd1\xb9\x0e\x60\x6e\xaa\x5f\xd2\xc5\x8a\xc8\xc6\x29\x06\x64\xb7\x00\x9b\x93\x6f\x75\x0c\x9b\x92\xcc\x63\x99\xb1\x06\x70\x81\xf8\x5d\x10\x92\x11\xd4\x27\xbc\xbe\x5f\x6c\xd7\x7f\x8e\x56\x74\x41\x62\xcb\xb1\x40\xbf\x88\x9f\x27\xbf\xa7\xa9\x75\x40\xad\xea\xed\x20\xa7\x82\xad\x82\xd0\x48\xe3\x97\xf5\x45\x1e\x86\xdb\x0c\xdb\x08\xc5\x64\xe4\x4b\xf5\x7e\x27\xcb\x0f\x24\x50\x58\x97\x3f\x20\xdf\x56\x57\x58\xaf\x1e\xdb\x1c\x42\xa9\x03\x8d\x37\xd0\x3a\x7c\x57\xbd\x1a\xd9\x6b\x3f\x88\xc5\x1c\xe1\x55\x08\xa9\x1e\x44\xbd\x66\x83\x7c\x73\xb3\x96\x85\x9e\x10\xf3\x8f\x6c\x2d\x61\x4a\x66\x8e\x1f\xcd\xb5\x41\xcc\x9e\x13\xf7\xf2\x96\x47\xf9\x71\x25\xcb\xd7\x41\x06\x4a\x10\x9e\xc4\x1e\xff\xde\xde\xc2\x1b\x99\x9d\x9c\xa7\x0c\x79\xb1\x9e\xba\xd5\x66\xf2\x1c\xb9\x20\x68\x78\x8f\xa7\xf2\x15\xad\xd0\x59\x4b\xa8\x1f\x28\x52\x6e\x58\xef\x19\x7b\x35\x30\xa8\x37\x37\xdb\x51\x65\xf0\x52\x8b\xa0\x20\x22\x8b\xb1\xc9\x73\xd9\xb9\x05\xa6\x9a\x9c\x3f\x33\x26\x14\xb6\x9d\x29\x68\x6e\xea\xea\x80\x1a\x0c\xde\x14\xf9\x81\x32\x91\xe0\x04\x65\xdb\xfc\x0d\x36\xcb\x07\x74\xa3\xa6\x5f\x32\x91\x82\x68\x0f\xcd\xbf\xcb\x4b\x27\x9f\x36\x1b\x21\x05\xf6\x52\x6d\x9e\xbe\x6f\xbe\x8d\x3e\x4f\xa2\x8c\x23\x43\xf3\xf5\x13\xaf\xf6\xbe\x28\x8d\x47\xd3\x7f\xc6\x3f\x75\x1e\x38\x4d\xfe\x35\x04\x51\x33\x74\xd2\xd0\x59\xda\x33\xdd\x76\x17\x6f\x53\x57\x8a\x74\x45\xd7\x8b\x9e\x93\x20\x3a\x16\x81\xe0\xed\x7b\x85\x2e\x88\x23\xeb\x0f\x9b\xa9\x04\xa7\xc6\xff\x36\xaf\xba\x89\x30\x84\x13\xa7\x5d\x64\x5d\xf5\xcc\xdc\x57\xef\xae\x6d\xb0\x3f\x88\x14\xa8\xa9\x21\xcd\x7f\x9f\x1a\x6c\x46\xef\x0f\x84\xa5\xb5\x68\xec\xd1\x0b\x62\x48\x84\x26\x1b\x73\xe6\x1a\x4b\xf7\x4e\x6e\xd8\x21\x6c\xfb\xea\x7b\x37\xd2\x44\x2e\x5f\xf0\xe6\x19\x16\x75\x95\xf4\x1b\x53\x82\x3e\xff\xa3\x9c\xf1\xc5\x09\x02\xcc\x11\x0d\x21\xde\xc3\x69\x87\x86\xbd\x2c\x21\x31\xed\xfd\xe2\xe7\xb2\xa9\x0a\xb3\x91\x16\x36\x07\x39\x7c\x21\x36\xd1\x28\x8d\xe5\xbd\x5c\xbf\x22\x5e\xb4\x67\xc4\xea\x58\x8e\xc8\xbf\x47\x5d\xce\x43\x94\x32\xdf\xc5\x32\x9c\xc8\xae\xdb\xf1\xd1\x95\x0e\xc0\xb8\xe2\x41\x33\xae\x47\x8a\x38\xd2\x19\xb6\x32\xa1\x42\x9a\x17\x3b\x10\x71\x64\x34\x86\x79\x52\xa9\x93\x7e\x99\xaf\xd6\x31\xd1\x02\xf3\x24\x0b\xad\xa1\x70\x74\xc4\xb8\x14\x87\xdd\x63\xe6\x10\x69\x79\xb3\x2e\x07\xc0\x8f\x88\xe3\xcc\xa0\xe1\xbf\x93\xe3\xee\x0b\x11\xa7\x91\x41\xf7\xbb\xc8\x9b\xf6\xb1\xfe\xd0\x6d\xd5\x5f\x49\x1a\x47\xf8\xee\x7b\xf6\xef\x3b\xd9\xea\x17\x7c\x95\xbb\xbe\x02\x4d\xd2\x61\x76\x87\x7f\x8b\x7f\xb1\x7f\x4f\x48\x4a\x3f\xf9\x7f\x7f\x1e\x4a\x84\x1c\x74\xe8\x74\xa0\x4d\xb8\xb0\x68\xf7\x8f\x8e\xc6\xdc\xfa\xac\xf9\x3d\xbc\x8f\x49\x56\xc2\x00\x21\x52\x2f\x67\x7f\x01\x42\x29\x62\x96\xb8\x24\xb3\x45\x03\x3b\xf5\x66\x63\x26\x88\x89\x03\xb5\x6e\x0d\xd7\x08\x8a\x3f\x40\x83\xa9\x85\x59\xf0\x31\x3d\x2d\x52\xed\x74\x13\xf7\x76\xb9\x9c\x3c\x66\x4e\x05\x62\x3f\x57\xdb\xaf\x4f\x4e\x25\xcf\xf4\x9b\x44\x82\x1d\xc8\xd7\xa0\xa1\x6c\x4f\x75\x5e\x5d\x68\xd7\x14\x31\x57\x31\x0d\x02\xe5\x5d\x24\xd3\xe3\xdd\x47\x60\x8c\x2e\x7e\x89\x30\x2a\xd9\x6c\x56\xe1\x27\x61\x25\x5a\x93\xed\x8b\x74\x4c\x47\xc1\xad\x6e\xce\xe9\x96\x44\x9c\xc5\x12\x9d\x4a\xf0\x1a\x24\xb3\xab\xc8\x52\x3a\x02\x3b\x23\xe2\x31\xef\x1c\xf9\x8b\x26\x3f\xce\x4c\x82\x88\x23\xc0\xaa\x42\xf3\xc7\xe4\x50\x32\x75\xe4\x23\xea\x54\x77\xbe\xeb\xa2\x34\x9d\xb5\xfb\xac\x50\x39\x32\xa6\xe3\xb9\x23\xa9\x16\x9d\xbd\xfe\xfa\xe3\xcb\xf4\x81\x4b\x15\x29\x9f\xe1\x38\x1d\x7f\x07\x85\xfc\xdf\xfe\xf5\xe7\x50\x69\x84\xad\x16\xfe\x61\x74\xee\xf3\xd7\xea\x54\x17\x1f\x7f\x8c\x1e\xa8\x62\xae\xec\x9d\x3b\x82\x35\x27\x61\x14\x20\xb4\xfd\x18\x8b\x01\x5e\x2f\x42\xf0\x5c\x6a\x8c\xa2\xc6\x5f\xb0\x32\x4e\x73\xa9\x29\xe5\xb1\x79\xa9\x5a\x5f\xdd\xa8\xea\xcb\x0d\xb9\x22\xd6\x92\x86\x82\xea\x4e\x36\x4d\xa5\x03\x27\x71\xd8\xae\x25\x66\x28\x3a\x1b\x39\xf2\xd5\x62\x43\x52\x3b\x30\x19\x7d\x3d\xaa\xfb\xca\xa0\x62\xe7\xac\x39\xe6\xbc\x2c\x24\x62\x13\x9b\x64\xc0\xfb\x74\x2f\xf4\xa9\x0a\x0c\x52\x22\x36\x2c\xc2\xbe\xcb\xce\xd8\x5c\x9b\xf3\xa2\xf4\xf4\xf1\x9a\xcc\xa9\x60\xbe\xe7\x45\xf1\x81\x0d\x43\xb2\x78\x9d\xbc\x64\x80\x18\x35\xc3\x7c\xf0\x8a\xc4\xe5\xd3\x67\x60\x69\x14\x4d\x14\x0c\x9c\xfc\xf0\xf9\xf7\x95\x44\x8c\xf3\xa0\x5f\x77\x70\x1d\xf4\xe8\x15\x6e\xa0\x28\xe6\x43\x8d\xc4\xa2\xac\xef\xee\xf9\x6c\x52\xa1\x67\x32\xb9\x9c\x24\xb2\x31\xba\x2f\xcd\x49\x8d\xe8\x54\x67\x87\x27\x9c\x09\xda\x53\xd0\x7e\x96\xe6\x08\x83\x7d\x29\x66\xd7\x7d\x46\xbf\xc6\x94\x8c\x3f\x9c\x24\xc9\x24\x96\xd0\x96\xf5\xc7\xb1\xad\x36\x5a\x16\xc7\xde\xdf\x4d\x52\x92\xc5\x71\xf0\xfe\x5d\xe9\xcd\xe9\xf2\x86\x01\x54\x6a\xc4\xa1\xc1\xcf\x8b\xd6\x70\xfa\x22\x13\xc6\x53\x66\x7a\xcd\x9b\x4d\x0b\x21\x56\x49\x38\xd1\xd8\xfb\x07\xa5\x41\x22\x92\x61\xba\x27\x5c\x29\xc4\x65\x62\xce\x71\x77\xf3\xf0\x7c\x7f\x1d\x70\xa1\x22\xe1\x10\xe1\x67\xdf\x4d\xb2\xdd\x4b\xde\x60\xbb\xfc\xf4\xa4\x59\x2c\xa5\xa7\xae\xd8\xe4\xaa\x98\x6b\x07\x8a\x44\x82\x4b\xa3\x5d\xe5\xed\xf2\x05\x35\x3b\xc6\x73\x2b\x51\x29\x47\x57\xc6\x37\x05\xe6\x6d\x7b\xc6\x90\x39\x7f\x33\xe3\x2f\x21\x51\x92\x53\x0f\x0a\xa8\xbd\x4e\xf0\x98\x1f\x25\x8c\x02\x92\x3a\x0e\xbb\xe0\x6b\x8e\xb8\x38\xa6\x37\xa4\x53\xa7\xa9\x1e\x22\xc6\xd0\xfa\x18\x2e\xd8\x10\x8e\x2b\xb9\x2e\x72\x28\x1d\xfb\xd0\x64\x6a\x86\xb4\x48\x62\x68\x8a\x0d\x7e\xc8\xfa\xe9\x56\xd9\x59\xd6\x55\x24\x46\x49\xcc\xba\x35\xae\xaa\xf2\x2d\x6f\xdb\x7c\x06\xf7\xee\x06\x39\x04\xa5\x33\x14\xf8\x65\xc1\xa5\x45\x25\x01\x13\x61\x4b\xea\xaa\x34\x3c\x5c\xae\x8d\x9c\x7b\x1a\x98\x51\xef\x7a\xcd\xa9\xcb\xae\x55\x62\x89\x40\x06\x26\x9c\x94\x3d\x12\x78\x0c\x0c\x17\x89\x05\x67\x23\x9f\xe0\xd4\x34\x79\x0b\x3f\x47\x76\x2d\x8d\x44\x8a\x70\xe0\x1d\xa6\x2f\xea\x91\xf2\xfb\xe4\xcd\xa5\x91\x8a\xac\x08\x4a\x3b\x3f\xa1\x38\x77\x2f\xd2\xc8\xa6\x98\xba\x97\xdd\xa7\x31\x6e\x5e\x98\xce\xfc\x94\x44\x2e\xe6\xa9\xca\xee\x4b\xfe\x8c\xc6\xf7\x93\x9c\xea\xa7\xbf\xff\xd2\x6c\xa6\x24\x21\xc8\x19\x50\x1c\x8c\x0c\xb7\x4e\x54\x86\x80\xe5\x57\xe4\x9f\x08\x68\x0d\x91\xc6\x22\x71\x44\xed\xb5\x2c\x7d\x1b\xf3\x35\x7e\xa4\xd3\xe9\x90\x26\x99\x42\xf2\x4b\xb4\x88\xd2\xda\x02\x6e\x1f\xb6\xae\xf6\x70\xf1\x65\xa5\x89\x72\xa8\xea\xdd\x90\x5a\x7c\x3e\xee\x6b\x69\x40\x3a\xe8\xfc\x39\xf0\x4a\xa4\x29\x91\x98\xd2\xf7\xa4\xc2\x57\xf9\x04\xeb\x22\x52\x4a\x9c\x8a\x22\xce\x00\xef\xb3\x85\x57\x9f\xd2\x84\xa2\x87\x95\xf7\x7d\x80\x9b\x23\x84\xb2\xe8\xf4\x09\xd1\xc4\x22\x8d\xac\x9f\xb7\x3e\x15\x79\xf9\x69\x52\x43\x30\xe3\x73\x2f\x0f\xd3\x98\x35\x65\xb1\x72\x44\x91\x55\x89\x76\xfa\x62\x90\x96\xb2\x04\xf0\x41\xdc\x00\x60\x47\x3a\x98\xe5\x10\x8d\xa4\x2c\xd3\x5e\x29\xd6\x89\xe8\x22\x55\x18\xca\x6c\x07\xe4\x02\xca\x18\xc9\xb1\xde\xc7\x19\x50\x70\x36\xad\xfe\xf5\xef\x8b\xf5\x64\x91\x72\x26\x79\x10\x6d\x0f\x64\xa1\x97\x2f\x5a\x44\x0e\x38\xe3\x49\x20\x9a\x47\xa8\x43\x93\xe7\xec\x51\x0a\x4a\x9d\x8c\xd6\x4b\x75\xdc\xbc\x54\xd0\xbf\x0e\xc1\x15\xc0\x90\xf0\xf1\xbd\x5d\x33\x0c\xf2\xec\x4e\x42\x00\x9c\x0a\xc9\xad\x1c\xe1\xdc\x1f\xab\x56\xb6\xd5\x7c\x71\x4f\x33\x22\xf1\x83\x5e\x2f\xef\xff\x79\x46\x90\xf0\xdb\xaf\x6a\x7e\x2c\xc0\x5c\xad\x76\x40\x3c\x87\xe4\x6c\x56\x85\x3c\x36\xbd\x89\x4d\x33\x6d\x39\x1f\xf5\xb7\x5c\xaf\xef\x5d\xd7\x49\x53\x15\x6f\x9f\x70\x3d\x88\x34\xb3\x0c\x73\x69\x18\xd9\xec\xf2\x80\xf9\x15\xa9\xb4\x8e\xe9\xc1\x67\x29\xf1\x56\x7b\x90\xee\x24\xf3\x9a\x1a\xeb\x92\x93\x38\x9d\x1f\x5d\x67\xcd\xea\x6a\x19\x8e\x04\x69\x86\xad\xa0\xb2\xbe\x8c\xee\x15\x29\x08\x86\xb1\x6c\x73\xda\xef\xa1\x69\x9f\xeb\xe2\x72\x8e\x37\x05\x13\x31\x8f\xf3\xbd\x92\x6d\x5b\x60\x07\xfa\xed\x88\x0f\xd2\x8d\xa3\x84\x30\x54\x0f\x87\xd2\x3c\x58\x0c\xc4\xff\x08\x5b\x18\xc3\x3a\x99\xdc\xc3\xf0\x7d\x52\xa2\x5c\xbb\xd6\xcd\x7f\x7d\xed\x7f\xb2\xc4\x03\x64\xe0\xa7\x81\xb7\x6e\x0e\x85\x4d\x31\xb5\xa6\x47\x22\x78\x38\xe0\x10\xe6\xd0\xd8\x52\xed\x2a\xc2\x79\x61\x70\x15\x78\x2e\xf3\xf6\x32\x77\x9f\xa0\x29\x71\xba\xf1\x1e\xab\x74\x2b\x9b\x76\x2c\x2d\x26\x68\x9a\xb8\x34\x22\x66\xc9\xab\xc3\xda\xfc\x74\x44\x8c\xab\xa2\x01\xac\xf7\x37\x13\x0e\x70\x41\x69\xcc\x33\x18\x0b\xa5\xf5\xd6\x68\x56\xbb\xa1\xd4\xf8\x78\xca\x79\x4a\x21\x4e\x3a\x67\x14\x13\x94\x19\x85\x34\x9c\x08\xed\x5d\x16\xd5\x30\xf1\x28\x17\x19\xfa\x49\x9e\x88\x1f\x26\x62\xcd\xbf\x5b\x26\xa6\xef\x8d\x2b\x11\x18\xb1\x7d\x8d\xef\xea\xc3\xff\xc3\x4b\x32\x06\x47\x81\x0a\xe0\x98\x1e\x52\xf9\xfe\x0a\x64\x3d\x5a\x4b\xa9\x00\x4b\x02\x02\x0b\x25\xa1\xee\x2b\x87\xae\x5a\xca\xb2\xbd\xaa\x41\x06\xad\x0c\x41\xb3\x84\x72\x97\xad\xee\xee\xbb\x77\x0a\xa8\x14\xee\xad\x9c\x51\x73\xcf\x2e\x58\x66\x89\xe3\x0c\xd0\xd5\x63\x5d\x69\x00\xd3\x37\x00\x09\x2a\x75\x82\x3d\xe4\xb9\xae\x56\xa8\x2c\xe6\x7f\x57\x91\xc5\xd2\xf2\x55\xde\xea\x2a\x2f\xef\xe4\xcf\x7e\x0b\x49\x13\x7f\xda\x40\x21\xe4\x12\x3b\xdd\xbf\x2e\x90\x9b\x08\xaa\x38\x0f\x9d\xe2\x01\xc0\xe9\xdd\x87\x4b\x1c\x9c\x13\x5f\x82\x2a\x1d\x63\x17\xe3\x3b\xe4\x4f\x32\x6f\xc0\x5c\x9f\xba\xad\xee\x7b\x19\xa5\xe2\xa8\xd2\xd4\x25\x1e\xab\x6a\x61\xcc\x25\x02\x24\x41\x95\x4d\x20\x0d\xeb\xdf\xed\xa9\xbf\x25\xcd\x2c\x62\xf0\x71\x75\xfe\x0a\xb2\x68\xfb\x87\xaf\xc1\x39\x20\xdf\xf3\x76\xbc\x78\x51\x13\x3b\x06\x9c\x12\xde\xaf\x1d\xcd\xfe\xff\x9f\xb3\x37\xdb\x6e\x1c\x47\xb6\x40\x7f\xa7\x1f\xfa\x81\x13\x48\xe0\x51\x96\xe5\x4c\x57\x79\x3a\x92\x32\xb3\xfa\x9e\x75\x96\x56\x00\x08\x58\x2c\x4b\xa4\x9a\xa4\x32\xad\xfa\xfa\xbb\x18\x00\x38\x89\x76\xd5\xbd\x2f\x9d\x5d\x26\x48\x71\x00\x02\x31\xec\xd8\x1b\xe4\x34\x10\x69\xa7\x2e\x73\xdb\xc0\x37\x12\xcb\x69\x40\xbd\x0d\x88\x76\xfe\xc6\x1f\x19\x78\x80\x0c\x43\x30\xa9\xc3\xb5\xed\x54\x57\xac\x60\x28\x05\x75\x46\xfe\x72\xcc\xeb\x8b\x6b\xda\x77\xce\x8c\x90\x99\xa3\x6a\x68\xb7\x23\xcb\x62\x3a\xc7\xaa\xcb\xd3\x30\x66\x94\xc8\xf6\x2d\xc9\x4f\x78\x3e\x42\xf5\x66\x41\x5f\xe3\xcb\xa6\xa1\x08\x28\x55\x46\xf3\x76\x4e\xe0\x8d\xa7\x51\xa0\x09\xbc\xe3\xcb\x07\xe3\x0a\x43\x1a\xc5\xb6\x69\xe3\x98\x17\x94\x84\xbb\xc5\x03\x5c\xba\x83\x46\x53\xa6\x0e\x9b\xfd\xa4\x21\x94\xa7\x71\x18\x32\xf4\xad\x58\xf7\xd3\x1b\x8b\xd3\x80\x88\xad\x07\x0c\x1c\x23\x37\x37\x4d\x14\x23\xdb\xeb\x8b\x48\x9b\x33\xb9\x6e\xe6\x7c\x78\x21\x82\x2e\x37\x8c\x29\xdb\x76\x4a\xb2\x61\x58\x5d\x75\x22\xf2\x34\x15\x9a\x22\x33\xeb\x09\x11\x6b\xc0\x74\x8b\x4f\x21\xd2\x41\x44\xd0\x50\xa8\x9b\xf2\x58\x76\x97\x87\x48\x13\x22\x71\xa7\xd1\x36\x2d\x7d\x56\xe8\xe7\x29\x24\x16\xbf\x72\x93\x37\xf5\xb9\x7a\xed\xde\x05\xb0\x88\x78\x9f\x7a\xfe\xd8\x21\xd8\x93\xa7\x90\x0a\xef\x0c\x3c\xc2\x7b\xeb\x18\x6e\xda\x79\x48\xe9\x96\x6e\x8c\x48\xc8\x96\x3c\x42\x5d\xe7\x3f\xf1\x70\x71\xb3\x14\x2e\x58\x3d\x17\x87\xbc\xc0\x09\xe9\x31\x4f\x41\x66\x44\x27\xf2\xf8\x9f\xcd\x7f\x1e\x6f\x9e\x1f\xba\xbf\xab\x88\x1a\x93\x49\x48\xec\xd9\xbc\xd8\x2b\xf6\xe0\x1c\x37\x4c\x86\x8a\xb4\xdf\x6e\x89\xbe\x69\x59\x56\xdd\xf3\x28\x65\x08\x95\xa6\x11\x9a\x7d\x1b\x3b\xec\x8c\xa7\x2b\xe0\xa9\x32\x19\x41\xc5\x1f\xf3\xa2\x41\xbd\x6a\xf6\x96\xa3\xed\x43\xfa\xa3\x7f\x96\x89\x4a\x95\xe1\x89\x2b\x95\x6e\x73\xac\x46\x4c\x7d\x3c\xd5\x3a\x24\xa8\xc1\x72\x69\xab\x6a\x04\x1f\xf2\x07\x31\x09\x29\x87\xe2\xa6\x00\xbc\xff\xc0\x7c\x32\x03\x90\x47\x3c\xee\x05\x39\xe8\xbe\xfd\xe9\x06\x94\xec\xc0\xd0\x1b\x74\x42\x5f\xf3\x6d\x10\xfe\x14\xc5\xa8\x73\xe2\x00\x75\xd3\x4b\xe3\xf2\x2c\xe0\x09\xcd\xa7\x1a\x1b\x47\x35\xb7\xdc\x0f\x3d\x73\x3f\x4c\x64\x44\xa1\x43\x4c\x9f\x77\xb9\x69\x2e\x9b\xfc\xdd\x37\xec\xbb\x31\x61\x94\x92\x79\xfb\x42\x9d\x15\x3e\x95\xe9\x0f\xf2\xd0\x39\xdd\xcd\x77\x38\x1f\x08\x8f\x30\x5e\x17\x59\x14\x71\x42\x3b\xe4\xaa\xf4\xb4\xb6\x14\xde\xde\x17\x53\x65\x13\x9e\x45\x06\x13\x97\xae\x71\x5e\xc0\x6c\x32\x34\x8b\x59\x4c\x9e\x40\x3b\x2b\xbf\x4c\x71\x64\x3c\x8b\x33\x4e\x50\x68\xfb\x1d\x48\x62\xc2\xe4\xa8\x3b\xe9\x9e\xd3\x78\x6f\xfa\xf7\xe4\x6c\x65\xa9\x41\x6b\x6c\x86\x38\xd3\xf9\x44\x85\x3b\x27\x09\x05\x4d\x0b\x6d\x21\xec\x64\xc1\x06\xd3\x26\x63\x41\xc6\x9d\x27\xf8\xad\xc8\xff\x7b\xc6\xdf\x71\x8e\x1b\xd3\x7b\x8e\x19\x53\x40\xc6\xb2\x94\x7f\xa2\x6a\x7e\x2f\x72\xd3\x5d\x2a\x8d\x43\xd2\x1b\x7f\x39\xc0\xe5\x0f\xd6\xfd\x55\x30\xcb\xfc\xd4\x4e\xca\x2f\xf9\x4f\x5c\xfc\xea\xcc\x67\x96\x0a\x31\xc2\x79\x74\x64\xa6\xe1\xe4\xbd\xa6\x3a\xa2\x68\xae\xfa\xf5\x05\xfc\xf2\xcc\x44\x1c\x50\xb6\x9c\x98\xcf\xfa\x3f\x82\xad\x8c\x13\x33\xc2\xd7\xdf\xbf\x4c\x83\x9a\xd1\x5e\x92\x09\x93\x91\xcb\x7c\xbc\xdc\x56\x65\x81\x43\x1f\x78\xf2\xf6\x41\x25\x99\xa7\x1d\xbb\xab\xca\xa3\x03\x6f\x4e\x9a\x68\x27\xe7\x18\x41\xca\xb2\x34\x45\x09\xee\x62\x9d\x82\x19\x18\x4f\x26\x83\x94\x90\x7c\x6d\x34\xed\xc2\xe8\x69\x17\xe3\xe4\xdb\xaa\x48\x76\xfc\x06\x03\xac\xea\x2d\x69\xf9\x9f\x87\xfc\xe6\xfe\x04\x8d\x21\x3a\x98\xd4\xeb\x95\xe2\x3f\xcf\x74\x6a\x11\x64\xf7\xcb\x67\xa0\xda\xab\x7f\xa9\x26\x42\x7a\xd3\xa7\x33\x29\x99\x9c\xe7\xdb\x36\xfb\xe7\x36\xc0\x2d\x0f\x4d\xeb\xe0\xda\xda\x6c\x77\x04\x45\xdc\xf3\x9d\x8d\x43\x46\x3b\x86\x07\x91\x05\x2e\xde\x40\xa1\xa0\x9a\xee\xab\x3c\x90\x99\x05\x9e\x2c\x16\x6a\x88\xcd\x75\x87\xc3\x20\xa0\x09\x70\x7b\xff\xb2\xdb\x7e\xf1\x15\x12\x1e\x0a\xee\x5b\x1b\x69\x95\xdf\x5c\x56\xdb\xaf\xe3\xe5\xc9\xa3\x30\xe2\x8e\xa5\x4c\xe3\x62\xf8\x06\x78\x94\x72\xe8\xe0\x18\x54\x24\xb2\x5d\xff\x7e\x32\xf2\x98\x33\xca\xc8\x40\x01\xaa\x9c\x00\xa3\xda\x28\x10\x9d\x93\x75\x83\xcd\x28\x5d\x31\x7e\x73\x3c\x31\x11\xa9\x38\xd8\x8d\xf2\xe0\xc8\x45\x3e\x7d\xdb\xad\x6f\x48\x7d\x1d\xbe\x97\xd9\xfa\x11\xdb\xf2\x11\x8a\xcb\x5c\x17\xa9\x3b\x2d\x4d\x6c\x75\xb6\x8d\x42\x9a\x7f\xc0\xc5\xc4\x79\x9a\xda\xc2\xa7\x97\x3f\xc8\x15\x3e\x42\x71\x86\xc3\x24\x2f\xcb\x53\xc5\x42\x37\x33\x0b\xcb\xec\x38\xe3\x37\x73\x1e\xa7\x5e\x61\xba\x13\x98\x1c\x6e\xdf\x9c\x73\x49\xf9\xeb\x5d\x97\xd9\xf7\xf9\x50\xe7\x2a\x7d\xb6\x71\x4e\x76\x24\x2e\x22\x93\x3a\x52\xd7\x6e\x4a\x59\x87\x6e\xca\x4b\xc2\x39\x08\x2b\xd8\xda\x6e\xf9\x37\xe7\xcb\x66\x0f\xd5\xfc\xae\x3d\xe9\xad\x1e\xe8\x0d\x8c\x27\xa5\x0c\x6d\x7c\xe4\xf9\x55\xfa\xcd\x95\x4b\xa6\xa8\x82\xe3\x12\x04\x9e\xc6\x6e\x7e\xcd\x73\x69\x22\x2e\xbd\x52\x5f\x71\x6e\x67\xe2\x73\x81\xf3\xec\x6c\xdd\x29\x22\x8a\xbb\x72\xcd\xea\x08\xf9\xe1\x8a\x22\x81\x73\x15\x59\xd1\x40\x0f\x6a\x71\x0d\xd2\x93\xc5\xa5\xa4\xc4\x9e\x49\x67\x63\xa1\x51\x23\x63\xc3\xaf\xff\xd7\x9f\x6b\xac\xc8\x3c\x1e\xf3\xc6\x02\x10\xa8\xb7\x85\x32\x85\x13\xcf\x7c\xa8\xe9\xc8\xb9\x8e\x33\x8a\x66\x6f\xca\x03\x56\xa3\xfc\x1c\xd7\x29\x50\x03\x92\xc9\x0b\xbd\xc1\x63\x6e\xd9\xd0\x5a\xcf\x62\x4c\x9c\xcc\xb9\x06\xad\x7c\x26\x0f\xeb\xc6\x37\x82\x4d\xde\x02\xa6\x92\xbc\xa0\xd7\xfc\x27\x6e\x09\x78\xdb\xee\x66\x93\x97\x80\x99\x15\xe7\x2b\xce\xc7\x67\xf3\x78\x69\xf6\xb9\xea\x20\x9f\x1c\x55\x48\x9d\x80\xc7\xbc\x18\x1a\xe5\xfb\xe2\x5b\xad\x97\x83\x5c\x09\x47\x8c\x84\xf4\x44\x43\xfe\x8f\x26\xca\x68\x8b\x5f\x1e\xca\xb3\x76\x11\xb3\x3f\x94\x21\xd1\x93\x1d\xac\x5a\x98\x25\x30\xf3\xc7\x38\x23\xe6\xc9\xfb\xaf\x2f\x8f\xdd\xdf\x84\xcd\xee\x5b\x5a\x93\xf1\x23\x88\x20\x52\x2a\x1d\x6c\x66\x5f\x4c\xf3\xd9\x46\x26\xc2\x28\x64\xaa\xeb\xdb\xec\xf7\x60\x11\x8a\x90\xd8\x08\x6e\x9f\x3b\x53\x2b\x42\x65\x59\xf7\xdc\x84\x7b\x57\x78\x9a\xba\x4b\xe3\x59\x2d\xa2\x44\xf2\x70\xa0\xa8\xf0\xaf\xb9\x6a\x8b\x88\xc3\x94\xe2\xcb\x03\xfe\xc4\xc3\x2e\xf2\xf2\x61\xdd\x51\x4b\xf2\x24\xcf\x17\x92\x37\x99\x91\xd9\xe0\x22\x8e\x0c\x6d\x64\xb2\x51\x0e\xe1\x7d\x7e\xdd\x37\xe3\x88\x4f\xc4\xb1\x96\xca\x87\xe0\xd6\xd2\xac\xf1\x98\x77\xc9\x2f\x11\xeb\x84\x6e\xb7\x2a\xf4\xf6\xb8\x6a\xf6\xbb\x79\x63\x2e\x58\x10\x52\x71\xf3\xe6\xac\xde\xea\x41\x66\x45\x30\x2e\x89\x60\x7a\xf7\x8a\xcd\xf6\xbd\x8d\x1f\x6e\x06\xfd\x3f\xa3\x45\xd0\xdd\x7a\x1a\x2b\xee\xdc\xff\x9b\xbc\xb5\x85\x15\x0c\xd2\x7b\x23\xc5\x6f\x2e\x52\x66\xdb\x78\x07\xf4\x83\xed\xc3\xdc\x9d\x0b\xdd\xa3\x10\x45\x9a\x25\xc2\x45\x5d\xd4\x0c\xbc\x1e\xd0\xe5\xfb\x21\x26\xce\x5c\x26\xc9\xe6\xa3\x9a\x2e\x36\x14\x59\x98\x12\xa8\x61\x71\x7b\xbb\xde\x3d\x2e\xfe\xb3\xd8\x3d\xaf\xbf\x74\x07\xe3\xcc\xc8\x2e\xbd\xeb\x3c\x5c\xcf\xf8\x39\x7e\x4d\x19\x84\x2a\xf5\xbe\xfa\xe1\x8c\xdb\xd2\x76\xbc\x74\x97\x02\x4b\x44\x4c\x65\x7e\x07\x89\x18\xb0\xbd\x71\x91\xa1\xcd\x99\xd4\xa7\x43\xde\x6c\xf7\x78\x33\xd1\x96\xe1\x82\x9b\x24\xe8\xd0\x1e\xe7\x42\xdf\x17\x54\xb0\x1b\xf7\xe7\xb2\xf9\xfd\x55\x88\x20\xa6\xaa\xb1\x6b\x21\x28\x0f\x65\x75\x73\x38\x77\xbf\x0e\x61\x96\xc4\xbd\x92\xd6\x44\x2e\x84\x0b\xc9\x39\x25\x1e\x7b\x34\x93\x4f\xe9\x0a\x95\x4a\x72\x99\x77\x16\xb8\x7e\x8b\x06\xdb\x0f\x34\xa4\x8c\x73\xd6\x53\xe8\x0c\xbc\x96\xd6\xf9\xf4\x3d\x07\xd7\xb1\xd6\x4c\xbd\xf5\xf1\x3f\xe3\x10\xed\x33\x41\x57\x2e\xb4\x82\xc4\x36\xbb\x1f\xf3\x66\xe5\xe3\xa9\x39\x1d\x9d\xfe\x1c\x64\x48\xc0\x87\xae\x45\xe9\x7f\x1a\xef\xdc\x0b\xcc\x2c\x4b\x4a\x6b\x4b\x37\x4d\xae\xde\x3e\xda\xa1\x84\x89\x03\xa2\x20\xbe\x5b\xbc\xb4\x33\xd4\xb5\xdb\xfa\x10\x42\x18\x6d\xf9\xb3\x7f\xe2\x3e\x57\x07\xb4\xfe\xad\x3d\x06\x81\x54\x5a\x7b\x72\x2e\x97\xf0\x1d\x6f\xd0\x6e\x60\x18\x45\x10\x75\x82\xe5\x8e\xa6\xe2\x9b\xa3\x14\xf2\x63\x44\x68\x45\xcd\x2d\x91\x2c\x10\x43\x3b\x45\x17\x77\x38\x99\xb4\x10\x2a\xa0\x6a\xdb\xa1\x4b\x34\x0f\xc2\x2a\x88\x04\x8f\xa0\xff\xb0\x84\x4e\x43\x6a\x8b\xea\x64\x9a\x39\xc4\x2c\xd5\x9e\xb3\xc6\x8a\x9e\x8d\xee\x38\xe6\x31\xc1\x57\xff\xac\x4b\xcb\x1a\xe6\xda\xa8\x67\x5c\x29\x88\x75\xe8\x05\xbb\xbf\x15\xca\xe2\xfc\x6c\x5f\xfd\x38\xa0\x1c\xad\x0a\x48\x44\x40\x9d\x03\x8a\x74\x28\xdc\x1f\x59\xa0\xd0\x79\x65\x94\x6b\x9c\x0d\x74\x81\xc5\x61\xec\x98\x93\x7b\x86\x9a\xf1\x1b\x62\x4e\x4f\xa6\xd7\xf2\x9f\x46\x9f\x90\xf2\x8c\x4a\xac\x26\xb7\xe2\x2c\x03\x14\x33\x64\x81\x45\xe1\x83\x6a\xf7\x0f\xab\x75\x96\x17\xaf\x93\x1f\xc9\x92\x98\x92\x00\x75\x5e\xbc\x9e\x0f\x50\xdd\x6e\xbf\xf7\x42\x67\x1c\x32\x11\x13\x7a\xe7\x0b\x36\x3f\xf2\x83\x5e\x42\x65\x99\x7a\x26\x57\xe1\x99\xa4\xba\xa2\xef\xcd\xd9\x3a\x7a\xf2\xe3\x7c\xab\x36\x07\x08\x8c\xa5\x49\x68\x5d\x80\x35\x74\x89\x21\x00\xa9\x8d\x55\xf5\x79\x7f\xcc\x0b\xac\xea\x3f\x06\x72\x3a\x1c\xc0\x24\x84\x71\x7e\x05\x92\xf2\xdb\x9f\x8d\xe9\x9f\x58\x06\x61\x60\x3b\x6e\x89\xfb\x3f\x57\xf9\x89\x52\x65\x63\x67\xd7\x0f\x86\x20\x30\x83\x94\xce\x4c\x2e\x19\x94\x89\xe9\x2e\x5b\xef\xe8\xb7\x52\x4e\xae\xa0\x93\x94\x54\x39\x1f\x56\x36\x63\x34\x69\xd7\xe4\x80\x69\x44\x99\xcf\xc5\xf3\xfd\xa6\xfb\x1b\x97\xd4\x6b\xf0\xb3\x6c\xf0\xbe\x78\x24\xa2\xaf\xdf\x71\xe2\x21\x81\xc9\x32\xab\x6b\x4e\xb8\x8a\xdd\x69\x9e\x2b\xf2\x23\x7b\xf4\xef\xd9\x0d\x50\x06\x22\xa2\x8e\x5c\xd0\x9a\xd2\xec\x5b\x38\x75\xb1\xfd\x5c\xb8\x22\x03\x88\xa0\x93\x57\xcb\xc9\x58\xbe\x40\x5d\xcf\x72\x03\x71\x19\xa2\xa1\x0d\x4b\xe6\xfa\xd9\xb8\x85\x3a\x6b\xae\x64\x68\x22\xa1\xba\x9e\xc8\x1b\xd2\x2b\x1e\xbf\x5b\x19\x31\x46\x7e\xb2\x41\xb5\xff\x5e\x36\xf8\x74\x3e\xb6\x31\x23\x14\x7a\xa4\x49\xe3\x46\x27\x31\xa3\x9f\x7e\xc4\x2a\x6f\xfa\xd6\x1d\x99\xc4\x19\xb1\x30\x10\x78\x74\x04\xac\x93\x09\xc4\x14\xce\xb6\xbe\x6c\xbb\x25\xc2\xc1\x27\x66\xfd\x00\x15\xc4\x6c\xd8\x52\xf5\xa5\x24\x69\xef\xc9\x8d\x32\x66\x45\x93\x5d\x7e\x68\xb9\x87\x3e\x6b\x2b\x19\x66\x19\xf3\x9c\x44\x9e\xaf\x63\xf5\x7e\xfa\x90\x9a\x68\x10\x5e\x4a\xae\x15\x55\x08\x4f\x55\x79\x2c\x29\x5a\xce\xcb\xc2\xaa\xe1\x0c\x98\x22\xb8\x14\x91\x26\x0c\xcd\xb7\x1a\xab\x41\x1b\xf6\xac\xc5\x92\x42\x2b\x1c\x92\x0f\x5a\x4c\xf4\x4b\x85\x27\xa8\xf0\x0e\xf2\xc3\xb9\x5b\x8a\x12\x74\x8c\xae\x91\x85\xda\x68\xbb\x35\x55\x34\xd7\xfa\x77\xbd\xef\x24\xc1\x68\x27\xb1\xe2\xdc\xf7\x8f\xe5\x27\x06\x60\x2b\x29\x33\x4d\xf2\x16\x56\xcb\xbf\xd9\x6f\x3a\x35\x29\x2e\x55\x9c\x30\x27\xc3\x63\x13\x08\x3f\x1e\x3e\xc7\xc5\x49\xa5\x25\x1b\x74\x9c\xda\x50\x60\x62\x84\x25\x3a\xe9\xfc\x5d\x85\x66\x73\xa9\x1b\x3c\x4e\x07\x08\x4e\xbb\xe3\x31\x7f\xad\xa0\x41\x72\x32\xff\xec\x31\x89\x12\x51\x11\xe4\xa3\x3e\x1f\x8f\x6e\x1e\xbb\x23\x26\x0b\x52\xd7\xfe\x7e\x63\x43\x6e\x8f\x9f\xbd\x7e\x63\x2a\x90\x9a\xb2\xfb\x06\xdb\x89\xb6\xdd\xf7\x4c\x0f\x5c\x85\x2a\x26\x42\xa6\x9d\xd7\x63\xba\xd7\x63\x9f\x5c\x45\x71\xe6\x7f\x6a\xf9\xc7\x83\x8f\x7f\xaf\xd8\x42\xb9\x8a\xd2\xc4\xeb\x5d\xe4\xaa\xdc\xed\x29\xe8\xad\xed\x0e\x67\x1d\x90\x36\x78\x1d\xd0\x07\x70\x15\x87\x29\x09\x38\x1d\x4a\x28\x7c\xc7\x70\x59\x3c\x95\x4d\x6e\x72\x05\xcd\x55\x00\xa8\x62\x19\x60\xdf\x38\x6d\xed\xa2\x17\x78\xe9\x2e\x2a\x39\x7d\xe9\x23\x1e\xcb\xee\x6f\x2a\x14\xae\xd6\x46\x92\x31\x93\x67\x64\xa9\xa1\x84\x48\x47\x7d\xed\xfe\x9e\x06\x9a\x3e\xf3\x6b\x05\x0a\x2d\x1e\xa1\xef\xf2\x51\x69\x24\x29\xe4\xdb\xf4\x9b\xdb\x8f\xb2\x7a\xab\xf7\xe5\xa9\xa3\x5f\xe3\x2a\x95\x76\xc3\x26\x5f\xbf\x6e\xca\x23\x75\xc9\x11\xcf\xdc\x80\x80\x76\x3c\xbf\x54\xea\x68\x2c\x1b\x78\x73\x4f\x79\xd3\xcf\x0b\x95\x45\x21\x15\xa7\x8e\xf0\x67\x59\xad\x7e\x52\xd8\x3a\x3e\x3f\x63\x61\x3c\x14\x3d\xad\xf0\x98\x9f\x8f\x83\xfd\x5b\x65\xcc\xc2\xa4\x3d\x2a\xd5\xa2\x4b\xf3\xd7\x8f\x94\x81\xe6\x17\xd7\x7c\xcf\xa3\xe2\x2a\x80\xac\x6b\x8b\x40\x1b\x38\xf5\x14\x35\xed\x00\xa0\x18\x7d\x47\x7d\x81\xed\xec\x28\xae\xf1\x83\x4a\x60\x42\xd9\xef\x76\xc7\x2d\xf3\xeb\xa7\x04\x96\x90\xfb\x40\x75\xa8\x9b\x61\xc0\x30\x5a\x67\x4a\x66\x31\xa5\x58\x1e\x21\x2f\x0a\x6c\x56\xdb\xe5\xe6\x5c\xfd\xf4\xaa\x4c\x5c\xa9\x30\x36\x4e\xb2\x0b\xab\x66\x58\x21\x57\x1a\x02\xa7\x5d\x45\x1e\xe9\x88\xc7\x69\xfe\xd3\x69\xad\x8d\x18\xb4\xfb\xdd\xe6\xc6\xe4\xea\x7c\x68\x2e\x56\x74\x6f\xe8\x44\x2a\x4c\x64\xc2\x47\x7a\x47\xbd\x13\x36\x6b\x79\x14\x82\xa5\x03\x7d\xa5\x0a\xcd\xf3\xb9\x51\xa5\x0f\xa3\x7d\x32\x45\x99\x4c\x91\x3e\xa1\xe7\x61\x1a\xf6\xe5\x29\x23\x58\x36\x94\x14\xf2\x82\x0c\xa3\x57\xa6\x83\x58\x04\xe3\x08\xf5\x7e\xf9\x6c\x05\xfb\x3b\x7a\x4e\xae\xc3\x00\xa8\x7d\xe2\xe6\x00\xea\xed\xb7\x7e\x86\xea\x30\xb5\xdd\x87\xa7\xb2\xd9\xb4\x51\xdf\xae\x3f\xc0\x65\x36\x40\x5b\xbd\x60\x75\x3c\x37\xb4\xd4\x7f\x77\x1e\x36\xff\xdf\xe4\xff\xfc\x68\x40\xdb\x5b\x46\x59\x87\xd9\x10\xea\x5a\x87\x95\xeb\x28\x8c\xe9\xb6\xee\x87\x0a\x47\x5c\x47\xcc\x32\x37\x3e\x94\xaf\x1b\x2c\xb4\x6d\x2d\xfc\xa4\x4a\xa6\x23\x90\x14\x72\x75\x8d\x82\xf9\x3b\x1e\xbc\xf1\xd2\x71\xa6\xd5\xb0\x86\x96\x17\xaf\xa3\xde\x63\x1d\xf3\x88\xaa\xcf\xb2\xa2\x34\xc6\xe6\x54\xe5\xcd\x14\xc0\xa9\x63\x19\x51\xb7\x80\x04\x79\xb9\x29\xab\x62\x55\x68\xbb\x6b\xce\x3a\x4d\x3a\x96\x29\x65\xd4\xac\x8d\xc4\x91\x46\x24\xd7\xb1\x42\x6e\x1b\xf5\xf3\x4a\x8f\x4c\xb5\x1b\x90\x04\x86\xf8\x45\xf1\x3d\xaf\x9b\xba\xdd\xd3\x6f\x2e\x94\x72\x1c\x1b\x44\x9d\x60\x40\xb0\x83\xff\x6c\x36\x9f\xa4\x9e\x27\x95\x01\x9d\xc6\x11\x65\x9b\xbe\x40\xa1\xf7\xf9\x6f\xbe\xd1\x48\xa7\x20\x08\xaa\xb3\xdc\x2e\xf7\x79\x01\x83\x54\x8b\xce\x58\x68\x61\xa9\xa3\xd6\x01\x9d\xf1\xc8\x06\xa7\xd8\x38\xf9\x7d\xaf\xb9\x3a\xcc\x1a\xea\x4c\x1a\x1e\xf4\xd4\x40\xc3\x27\xe5\x01\x50\xbf\xa0\x2e\x37\x24\xbe\x73\x95\x09\x9d\xc8\xca\x72\xcd\x53\x16\x39\x1d\x63\x62\x2a\x18\xbf\x5a\x6e\x32\x8f\xd9\x71\x9a\x81\x78\xed\x31\x8f\x5f\x87\x70\xf9\xa5\xe5\xf3\xc3\xf3\x7a\xb7\xf6\x34\x7e\x5c\x0b\xcc\x08\x64\x69\xa9\xbe\xed\x57\xb8\xbf\x1d\x59\x06\x2d\x8c\x05\x95\x7f\xbf\x5f\x6d\x9f\x16\x8f\xc4\xfe\xb0\x5d\x6d\xb6\xdd\x35\x8c\x55\xf2\xf2\x4c\x91\xf3\xb7\x00\xb1\xa2\x0a\xfb\x9f\x1a\x15\x69\x19\xfd\x4d\xb1\x42\x83\x90\x52\x0d\x72\x4e\x2f\x4e\x19\x71\x32\x6b\x65\x1c\xd1\x13\xf8\x1e\x83\xf2\xe8\xb0\xf4\x57\xae\x9b\x3b\x41\x05\x56\x82\x68\x9b\xbf\x62\x35\x11\x54\xe5\x5a\x45\x40\xdb\xdd\x7a\xb5\x59\x2d\xd6\xcb\xaf\xbb\xc5\xd3\xed\xee\x76\xf5\x7d\xf5\xf0\xfc\xf2\xb8\x7a\xda\xee\x7e\x2c\x1e\x1e\x56\xdd\xb3\xeb\x00\xa5\xf3\x5d\xe9\x91\x66\xbb\x21\xe6\x4b\x25\x9f\x17\xf1\xb5\x4e\x4d\xe4\xaa\x10\xa3\x3e\x9d\xc1\x96\xa0\x4d\x10\x53\x12\x5a\x9e\xab\xe2\x8e\x64\x0f\xfd\x7d\x19\x8e\xd4\x73\x4c\x85\xf8\x2f\xd8\x78\xda\x34\x7f\x58\x06\xf4\xd2\x1e\x9e\xbc\xa2\x0a\xc7\x20\xb6\x32\x07\xed\x2b\xeb\x28\x27\x2e\x8f\xa5\xde\xe2\x7b\xb3\x28\xf4\xb2\x69\x28\x4f\xfa\xe9\xc3\xf8\x6b\x81\xa0\x08\xec\x3f\x30\xb2\x7b\x18\xaa\x30\x6b\xa7\xca\x7a\x7b\xef\xff\x14\x09\x24\x33\x62\x91\xba\xa4\x95\x5d\x9a\xee\xa0\xd2\x04\xca\xf9\x45\x9e\xd2\xe8\x3b\x62\xcc\x6d\xa6\xf9\x66\xd1\x3a\x13\xf5\x70\x67\xc1\x18\x45\xe8\xfa\x09\xcf\x78\xf8\x89\x4f\xe5\x51\x56\xb8\x38\x9d\x26\xd7\x48\xd2\x28\x63\xc3\x86\x90\xed\x1e\x57\x85\xbe\xa6\x9d\xe1\xc8\x58\x4c\x3c\xc0\x47\x82\x34\xe4\xc5\xeb\x38\x8c\x42\x26\x54\xec\x3a\x46\x76\x58\x34\xd5\xe7\x22\x2b\x1c\x99\x66\x44\x67\xf5\x72\x2e\xde\x6c\x72\xf9\xef\xa0\x7b\xee\xc4\x34\xb4\xe9\xfd\x41\xd4\xd1\xc7\x56\xd7\xfd\xaf\x98\xa6\x8c\x50\xdd\xcb\xb2\x3c\x6c\xcb\x73\x35\xfa\x20\xa9\x50\xd4\xee\xbf\x87\x7a\x9f\x1f\xcb\xa6\x1c\x3b\x5d\x57\x9c\x95\x73\x81\xdc\xe4\xf7\xb2\x50\x52\x3a\xe6\xb9\x7a\x85\x62\xdc\x90\x86\x19\x4b\x89\xb7\xe8\x09\x7f\xfd\xcf\x1c\x05\x29\xc7\x2c\x03\xcf\x0c\xb1\xc1\x83\x79\xa9\xb0\x29\xab\x1c\xae\x9b\x59\xc6\x2f\x85\x33\x0c\xdc\x86\xea\x9c\x54\xfb\x4a\x67\x1d\x23\xe4\xa9\xa5\xa9\x75\x22\x95\xb6\xd9\x60\x32\x35\x78\x26\x4c\xec\xf8\x2d\xb7\x7b\x4f\x6d\xc5\x91\x8b\x28\x72\x02\xd6\xf7\xc7\x53\x59\x35\x5b\xf8\xc0\x75\x46\x11\x19\x47\x35\xed\xf8\x92\xef\xca\xea\x65\xd5\x93\x34\x4d\xbf\xf3\xe4\x6c\xc8\x82\x4e\x4d\xe0\x8a\x67\xaa\x1e\xe2\x54\x3e\xba\x82\x8c\xac\xd5\xf7\xec\x9a\x7e\xfd\x23\xf0\xc0\xb3\x07\x6d\xf7\x55\x59\x60\x17\x76\xcf\xcc\x7c\xc0\xc0\xda\xf7\x5f\x50\x59\xed\xca\xba\xbb\x8e\x51\xb1\xcb\xb4\x7c\xcf\xab\x73\x4d\x79\xe9\xab\x0b\x48\x8d\x49\xec\x3d\xad\x5c\xb9\x78\xcc\x5f\x43\xa5\xb1\x54\x9d\x74\x5a\xeb\xb5\x3c\xe6\x87\xf6\x0d\x15\x38\xd7\xa6\x8c\x0a\x6c\xf6\x79\xd3\xbc\xb6\x01\x24\xca\x36\x8c\x5b\xf5\x60\x2c\xd4\x59\x4a\x05\xca\x53\xfb\x2c\xab\xed\xd7\x8e\x36\x8f\xa3\x06\xab\x96\xd4\x2e\x52\x5b\x0a\x9d\x38\x41\xa8\xc1\x76\x73\xbd\x3a\xa8\x84\x25\x25\x9d\x8c\x91\x8a\x82\x81\xe3\x5b\x8f\xcc\xbf\x0a\x56\xc6\xa7\x18\x1e\xf9\xca\xc4\x63\x7e\xb8\x1b\x10\x73\xfa\x01\x10\xd0\xa6\x4e\xa7\x6f\x4b\x6a\x76\x67\x43\xf2\x0e\x34\x18\x2b\xdd\xe5\x9c\x1f\xf2\xe2\xcd\xe1\x86\x47\x17\x32\x81\x92\xaa\xa7\xfc\xda\xe6\xc7\x41\x2a\xf4\xff\x5f\x67\xa3\x09\x03\x46\x91\x39\xbe\xbe\x92\x92\xcc\xe4\x9d\x99\x30\x64\xc4\x8e\xe2\x2a\xc1\xe3\xfe\x59\x13\x26\x96\x4a\x08\xb4\x1e\x72\x10\x7e\xd2\x94\x36\xf9\xf9\x28\x31\xb1\x9e\xa8\xd1\x7c\xe9\xfd\x2b\x13\xc7\x28\x2c\x09\xf2\x16\xde\xa6\xeb\xd8\xc4\xcc\x62\x93\x5d\xe7\x16\x0b\xe3\x79\x07\xc5\xc4\x10\x92\xdd\xa2\xbc\xcb\x08\x52\x3d\x41\x71\x9b\x58\x03\xd1\x5b\xf9\xcd\x75\x4a\xd0\xe4\x86\x25\xd2\x82\x68\x2c\x47\x36\x16\xd7\x49\x04\x93\x98\x90\x48\x38\xbf\xc2\xa1\x8c\xfd\x2c\x35\x2c\xe6\x91\x63\x8d\x77\xbc\x9c\x43\xff\xcf\xa4\x2c\xb6\xc9\x1c\x5b\xca\x68\x23\x81\x6f\x85\xc6\xea\x01\xcd\x04\x2b\x6b\x52\x61\x45\xcb\xad\x8a\x66\x59\x6d\x5e\xfc\x6f\x64\x26\xa5\xae\xe6\x9b\xa7\x1b\xff\x27\x1e\xa6\xd2\xa6\xcc\x6c\x6b\x9e\x13\x3a\x1c\xfb\xe3\x86\xa3\xf5\xa0\xdb\x18\xeb\x72\x2a\xbb\xcf\x2c\x12\x2b\x36\xbd\x84\xea\x05\xaa\xb7\x81\x67\x6d\x20\xcd\xcc\xa8\xed\xb2\x8d\x51\x2c\xf9\xd6\x74\xe2\x8d\xee\x1e\x78\x48\xa6\x76\xbb\x5e\x3c\x6d\xee\x56\xeb\xcd\xee\x65\xb5\xde\xd1\x7f\x2d\x96\xbd\xc8\x0d\x37\x52\x18\xca\x31\xec\x3c\xd8\x61\xf2\x1a\x54\x10\xb2\xd0\x4b\x3f\xfc\xf7\x9c\x57\x33\x14\x7f\xd7\x3b\xa7\xd1\x29\xa0\x1a\xe4\x10\x27\x0d\x62\xa3\xc2\x8a\xd1\xa9\xf1\xa4\x15\x74\x0b\x03\x64\xf4\xe4\xaa\x82\x91\xdf\xd2\xc6\x9c\x23\xeb\x64\xb4\xe0\x42\xfa\x50\x43\xbd\xa1\xde\x34\xd5\x59\x35\x2f\xe7\x43\x8d\xed\x1f\x46\x7d\x3f\xb3\x26\xdf\x20\x4b\xa8\xbc\xf3\xa5\xbd\x8b\xfc\x80\xd5\x95\xf6\xd4\x60\x2c\xe7\xd4\x0a\x7e\x73\xbf\xf6\x75\x46\x83\x32\x21\x2a\x0c\x84\xea\x70\x59\x96\xc7\xe3\xb9\xc8\x9b\x09\xd0\xd9\x98\x2c\xa5\x4f\xbd\x7e\x5f\x2d\x1e\x86\x62\x83\xab\xf7\x06\x7b\xdc\xbd\x08\x82\x24\xcb\x5c\x5e\x9d\x5a\x47\x88\x38\x7b\xda\x7d\x2a\x82\x00\x02\xb2\xb9\xa0\xb5\xad\x3b\xff\x1d\xee\xd5\x9d\x17\x86\x49\x10\x90\xdd\x69\x77\xa6\xdb\xc5\xf3\xa7\x4e\x82\x08\x42\x86\x7a\x8c\xcd\xec\x49\x8f\xfd\x90\x54\x65\xa2\x37\xff\x1d\x88\x54\x04\x71\x14\xc5\x5e\x21\x8e\xbc\xd1\xf3\x15\x84\x88\x77\x43\x53\xf2\x3e\xef\xf2\x53\x3d\xee\xe0\x89\x82\x0f\x6e\x2d\x46\x43\x2c\xcb\x55\x59\x36\xbb\x30\xf8\xd7\xf8\x41\x63\x13\xd8\x22\x7d\xfe\x13\x57\xcd\xfe\x06\x8a\xb7\x75\x79\x38\x8c\x3e\x8b\x08\x12\x91\xd0\xa8\x76\xe9\xa1\xc3\x23\xf8\x63\x2c\xe2\x60\xd1\xb4\x87\xc3\x66\x24\xd6\x33\x4e\x37\x4c\xde\x30\xd5\x54\x07\x58\x9f\x6d\x39\xf6\x95\xa6\xc3\x65\x98\x85\x3d\x45\xc6\x82\xe8\x89\x51\xaf\x07\x5d\x5f\x83\xc1\x3a\xa6\xb7\x64\x85\x02\x87\x46\x46\x04\x0c\x43\x4a\x68\x40\xfd\x66\x3d\x92\xf1\xdb\xca\xe2\x50\xda\x44\xb0\x2a\x0b\x0d\xd5\x85\x26\xe1\xb9\xfb\x56\x99\x08\xcd\x50\x19\x65\x64\x98\x45\xc0\x13\x04\x0f\x2d\xf6\x41\x22\xea\x09\xac\xa5\x0b\xb3\x44\xc0\x05\xb7\xf4\x10\x65\x85\xf9\x6b\xf1\x29\x0f\xa9\x08\x44\xa4\x88\x8d\xfa\x8f\xa6\xc2\x63\x6f\x06\x45\x20\xd0\x4a\xd6\xc9\xf3\xc7\x4d\xa2\x22\x80\x50\x11\x00\xec\xa1\x7c\xbd\xc9\xf5\x1d\xe4\x87\xbf\xe1\x23\x15\x01\x24\x4c\x8c\x2a\x38\x56\xc0\x64\xb8\xc4\x24\x64\xb1\x47\xef\xe6\x45\xf3\xaf\xd1\xf9\x3a\x89\x43\xab\xb2\xf4\x13\xeb\xfb\x6e\xf5\x6a\x06\x94\x6e\x3f\x5a\x4b\x66\xb3\xbf\xdd\xc6\x88\x93\xcf\xa9\xc1\x1a\x4b\x1f\xaf\xde\x62\xfb\xed\xca\xf7\xcb\xe4\xdb\x69\x34\xf4\x7c\xf7\x85\x2e\x0b\xac\x73\x58\x9f\x4f\x39\xec\xfd\x8f\x62\x08\x18\x77\x25\xb3\xee\xaf\x06\x98\x18\x00\x58\x17\x43\xfd\xf6\xf1\xf5\xd1\xa0\x55\x9a\xaf\x57\xef\xa8\xfc\x05\x8c\x40\xe5\xf6\xe2\xcd\x7e\xa2\xc1\x29\x02\xa3\x14\xeb\x10\x56\xdf\xe1\xe0\x24\x69\x44\x18\x84\xa9\xcb\x41\xd8\x1c\x61\x5f\x92\x18\xff\x6a\x18\x88\x80\x1a\x1c\x57\x0f\xf7\x7f\xb8\x65\xb9\xc1\xa6\xbb\x0c\x84\x1e\x8b\xb7\xa2\xd0\x70\x34\xdb\xc3\x40\x61\x4c\xad\x13\xc7\xf6\xd3\xcc\x25\xb7\x3e\xdc\xa4\x44\x18\x06\x1c\x9c\x2b\x7f\xaf\x4a\xcb\xfe\x32\x19\x11\x6a\xca\x12\x80\xd6\x71\x34\x44\x8c\x74\x37\x10\x46\x98\x39\xdd\xe8\x65\xf9\xcb\xdf\x75\x98\x49\xc0\x41\x1f\xdc\xed\xf4\xba\x3c\x8a\xc2\xe1\x17\x1f\x24\x67\x26\x4d\x9c\xed\x60\x6b\xe0\x2c\x14\x2b\xe9\x7e\xc3\x48\xe1\x76\x88\x61\xea\x77\x76\x77\x13\x61\xc4\x62\xab\xca\x52\x68\x7c\x47\x7d\x5b\xaa\x7a\x72\x4f\x71\xc6\xac\x96\x77\x7e\x38\x94\xbf\x06\xab\x2f\x8c\x95\x45\xb9\x9d\x09\x18\x4a\x5b\x34\x31\xfc\xcd\xff\x52\x92\x48\x5f\x11\x6e\xb7\xa4\xd9\x4a\xb0\x08\x13\x16\x1a\x87\x5e\xfd\x5a\xd6\xb6\xc0\x58\x9a\x7c\x16\xf2\x4f\x0c\xa5\xb4\xcd\xad\x1f\x96\xfe\xa6\x58\x98\x11\x73\x33\x11\x04\xe5\x68\xf3\x67\xf3\x33\x8c\x31\x9b\xc7\x76\x75\x94\xbb\x89\xda\x75\x3b\x80\x93\x63\xd6\x7e\x86\x7a\x60\xc8\x66\x49\xa6\xdd\x39\x69\x88\x2c\x73\x20\xeb\x1a\xaf\x89\xf9\x44\x98\x66\x52\xe8\xc1\x47\xfe\x90\x6f\xd3\xe6\xcb\xff\xef\x5a\x00\xac\x9b\x02\x69\x66\x94\xea\x69\xaa\xdd\x16\xdc\x27\xf1\x45\x98\x0a\xed\x59\x52\x6d\x91\xd1\xc6\xf2\x73\xfa\x8b\x22\x4c\x55\x44\x41\xfc\x13\x9e\xab\xf2\x47\xee\xcb\xb9\x22\xcc\x84\xb6\xa9\x7a\xab\x6d\x0a\x87\x7f\x4c\x5f\x3a\x6b\x5e\x43\x9e\x29\x74\xf7\xbd\x02\x82\x96\x0c\x93\xeb\x22\xe4\x52\x65\x3e\xc0\xc1\xea\x58\xcf\xe0\x6e\x44\xc8\x4d\x10\x58\x00\xcb\xe1\x60\xb5\xfd\x3f\xf2\x71\xe6\x27\x24\x37\x31\x95\x67\xf6\x47\x35\xde\xf6\x43\x11\xbb\xd6\x88\xf6\x5d\xed\x6a\x38\xe0\x0e\x0b\xbd\x1b\xa0\x49\x44\x28\x12\x1d\x74\x40\x45\xf2\x20\x86\x1b\x62\x28\x32\xc3\x5c\x73\xda\xaa\x49\xfa\xdc\xb5\x08\x05\xe7\xd1\x30\x3b\x77\x5b\xaa\xf3\x11\x0b\xaa\xa5\xcd\x25\x70\xda\x33\x04\x05\xb2\x5b\xa8\x40\x0d\xd6\x9f\x10\x19\xef\xd5\xc3\x49\x71\xe3\x13\xee\x18\x11\x42\xa0\x89\xbc\xc1\x94\x16\x8a\x68\xb7\xe7\xce\x32\x43\x8a\x16\xd6\x50\xde\xf4\xfd\xaf\x68\x49\x83\xfc\x10\x2e\x88\x7e\xb6\xbd\x57\x3d\xda\xd7\x27\xef\x56\xb6\x8e\x0b\x25\xe8\x8f\x90\x17\x5f\x9b\xe3\x61\x62\xa0\x65\x62\x71\x87\xe4\xd3\xd7\xd8\xed\x4b\xa1\x44\x24\xb0\xff\xeb\x99\x84\xb9\xad\x76\xac\xcd\xc4\x76\x5e\x70\xa8\x58\x48\x54\x1c\x70\x3a\xb5\xa7\xce\x3d\xac\x66\x51\x9c\x7a\xf0\xa4\xf1\xaa\x85\xd7\x31\x91\x08\x35\x97\xda\x12\x3f\x15\x75\x03\x45\x73\x57\x4c\x96\x05\x82\xa6\x4b\x51\xb1\xeb\x23\x91\xa7\xc9\x0b\x30\x71\x0a\xe9\x00\xae\x8f\xf7\xcb\xe7\x47\xb0\xba\x0f\xae\xfd\x6e\x74\x42\x14\xc4\x19\xc5\x30\x4d\x97\x18\x13\x51\xc0\x25\x55\x7c\xce\x35\x56\x6b\xda\xbd\x5b\xaf\xb1\x3c\xf7\x6a\x10\x84\x12\xf3\xc3\xc3\x24\x4b\x99\x17\xe7\xa7\x98\x6d\x76\xe2\x47\x91\xe4\x8e\x0a\xbe\xbd\xa4\x2d\x78\x4c\xac\x7e\x14\x87\x21\x11\x53\x9b\x31\x41\xde\xb5\x2b\x17\xc5\x49\x68\xb9\x95\xf7\xd0\xd4\x8f\x97\xdf\xce\xd5\x65\xcc\x36\x3a\xb6\xba\x51\xac\x6c\xe8\x7a\x84\x77\xa2\xa4\x19\xf8\xd4\x51\x12\x69\x22\x73\x20\x65\xa8\xfb\x42\x9f\xdb\x4f\x3a\xf6\xbb\xa3\x84\x19\xca\x22\xb6\xf7\xbe\x28\xea\x5f\x58\x39\xf4\xc4\x68\x82\x45\x89\x50\x09\xf1\xb9\x9f\x4f\xfd\x1b\x4a\x8c\xd3\x22\xcc\xb1\x8a\xd6\x08\xaa\x9f\x53\x11\xcb\x22\x1f\x6d\x3e\x94\x50\xd8\xd0\x0a\xb5\x33\x4c\xe3\x8b\x33\x65\xd0\xd1\xf1\x2e\x97\x5f\x77\xa8\xf3\x66\x97\xf9\x0b\xa5\x29\x0b\x9d\x36\xc9\x0d\x16\x68\x72\x95\xc3\x84\xff\x53\x44\x29\x67\x3e\x70\xfa\x91\x17\xba\xfc\x65\xdd\x8c\x59\x07\x2c\x4a\x25\x63\x70\xc5\x26\x1e\xfa\x0d\x61\xbc\x47\xcc\x64\x95\xdb\xaf\xe5\xf7\x8c\x28\x55\x9c\x3a\x56\x1e\xf3\xa6\x2a\x0b\xcf\x87\xdb\xfe\xdd\x66\x1b\x6a\x6c\xbe\xc0\x71\xda\x34\x2b\xa2\x8c\xb9\x14\x5d\x5e\xf4\xc0\x44\x7f\x2c\x4d\x59\xec\xa5\xc2\xd4\x5b\xeb\x52\x0e\xe1\x2a\xc3\x85\x19\xb5\xb6\xdf\x39\x9e\x2f\xf2\x7c\xc8\x15\xb1\xca\xd3\x46\x9f\x7f\xc0\x12\x22\x22\x0e\xe8\x79\x37\x57\x85\x26\xbd\x8b\x68\x72\x7f\x5c\x6a\x32\x5f\x0f\xd0\xe4\x67\x12\x0c\xeb\xbf\x3b\x57\x99\x96\x3d\xab\xa6\xeb\x35\x1d\x87\x27\x7e\x28\xf2\xa0\x27\xcb\x7b\x2a\x89\x9a\xc8\x75\x6e\xa7\x4e\xd5\x2f\xf4\xf3\x40\x84\x18\x19\xdb\x6d\x8a\x56\x16\xad\x7b\x25\x22\x42\x9a\xa6\xaf\x50\x53\xcf\x91\x03\xd6\xae\xfb\x0e\x66\x11\x89\x34\x21\xf5\x4d\x47\x8f\xb4\x2c\x8f\xc7\xb2\xf8\x85\x57\xfd\x72\xce\x65\x1d\xbd\x46\x91\xa2\x27\x1f\x1b\xf6\x2a\x88\x48\x48\x4e\x09\xe4\x9d\x77\x00\xdd\xdf\x81\x19\x4a\x85\x90\xce\xd1\x68\x45\x81\xc8\x28\xa5\x85\x85\x2a\x35\x7e\xf3\x92\xcb\x7c\xf2\x0d\xc0\x84\x04\x4e\xf8\x02\x65\x31\x3a\x5f\x32\x4d\xf5\xa6\x3d\x1c\x9a\xbb\x3f\xba\xbf\x66\x41\x00\xbd\x30\xa0\x93\x68\xaf\x26\xaf\x5b\x66\x21\x41\x30\xf2\xda\x85\xb4\x79\xf1\xba\xaa\x15\x9c\x70\x5b\x7a\xc7\x7a\x30\x23\xba\x15\x28\x75\x16\x38\x1f\xbd\xbc\x62\xba\x11\x91\x0a\x4c\x60\x79\x81\x5c\x85\xf9\xce\xa1\x5c\xf5\xbf\x46\x97\x51\x2c\xa4\x2e\x63\x82\xd1\x6f\x7f\xff\xb2\x5b\x7e\x5d\xac\xef\xb7\xff\xf1\x0f\xa1\x13\x45\x25\xf5\xe5\xe2\x76\xf7\x7c\x2c\x72\x5d\x1e\x0e\xd0\x4d\x2b\xad\x02\xf0\x14\xf4\x17\x28\x9a\xdb\xaa\xcc\x9b\x95\x2a\x8b\xf2\x98\xff\xf7\x8c\xbb\x65\x79\x3c\x35\xb8\x9b\xce\x54\x4c\x0d\x1b\x32\xe9\xd4\xdd\x37\x42\x48\x89\xc3\xe3\xe1\xe1\xfb\xee\x67\x1c\xec\xc2\xa8\x3b\x82\x86\x81\x53\x8a\x24\x55\xb8\xd2\x51\xc1\x7e\xdc\xb4\xda\xce\x40\x0d\x56\xe2\x99\x48\xa4\xbb\xc8\xdc\xfa\x80\xb6\x15\xce\x0e\x8d\x83\x50\xd1\xce\xbe\x53\x70\x38\xac\x51\xe5\xa7\x1c\x7b\xb3\xf7\x11\xe5\xc5\x6c\xaa\xb9\xdf\x1b\xe2\x00\x22\x1b\x46\xd3\xba\xf3\xed\x77\xf3\x34\x22\x22\x0e\x23\xdb\x5f\x85\xb6\xbb\xfa\xb6\x5b\x28\x71\x98\x21\x01\xc8\xe5\xf9\x72\x7f\x3c\x1d\xb0\xf5\x97\xe0\x2a\xe7\xdd\x17\xfd\xe7\x31\xf7\xfe\x62\x5c\x46\x6a\xc0\xfe\xeb\x3c\xb7\x1b\x47\x0f\x3e\xbe\xa7\x88\x77\x42\x30\x76\xa3\x1c\x66\xff\xfc\x18\x15\x44\xca\xb7\x2e\xd6\x03\x80\xa5\x88\xe3\xc0\xb6\x89\xee\xa1\xde\x0f\x41\x0e\x1f\xb1\x50\xb9\x7c\x57\xcc\x58\x46\x2e\x87\x85\xff\xb9\x3b\x9c\x90\x88\x89\x98\x65\x81\xef\x8c\xbe\x3d\xe3\x95\xba\xb6\x88\x99\x91\x14\xc9\x82\xee\xe2\xad\xf2\x83\x4c\x53\x9c\x46\x8c\x62\xa9\x9b\xf3\xe1\x50\xdf\x41\x75\xec\xcc\x67\x9c\x46\x9c\xf0\xac\xbf\xbd\x0c\xc2\xbf\x38\x8d\x39\x35\xe5\x52\xce\xfc\xf9\x44\xe6\x6d\x20\x2a\x3a\x98\x06\x69\x1a\xd1\x7d\x4a\xd7\xe2\xbd\x87\x1a\x59\x77\x19\x97\x92\x76\x45\x98\xe1\x03\xdb\x06\xc7\xc3\x3c\xf5\x93\x88\x33\x8d\x94\xee\xda\x6c\x17\xdb\x6f\x9b\xdd\xed\x6a\xf1\xb0\x5b\xaf\x1e\x56\x0b\xcf\xcd\x29\xe2\x0c\x19\x25\x69\x5a\x47\x11\x0e\x9b\x37\xaf\x4c\xd5\x1e\xe1\x29\x0c\xa2\xb0\xfa\x7f\xce\x50\x34\x03\xcd\x69\xbf\x83\x26\x5e\xf1\x53\xc4\x3c\x4b\x78\xaf\x3d\x6b\x91\x3c\xeb\xf3\x01\x3f\x54\x87\x98\x77\x0e\x63\xce\x35\x25\x6c\x3c\xaf\x83\xd7\xd5\x7d\xa9\x90\xb4\x07\xf4\x57\xa8\xf7\x43\x26\xc8\x7f\x76\xd9\xd6\x85\xcf\x7c\xa6\xd9\x71\x26\x5d\x71\xa2\x0d\x52\x58\xb1\x00\xee\xc8\xf1\x1e\xe0\xd7\x65\x6a\x44\x63\xa1\x2d\xc1\x86\xed\x46\x80\xaa\x59\xe3\x4f\x2c\xce\x38\x43\xf6\x21\x62\x81\xe8\x08\xc8\xad\xa1\xa7\xd2\x27\x81\x2a\xfd\x1b\x07\x26\x89\x5f\xee\xf7\x6f\xf7\x9b\xe1\xfe\x11\x43\x1a\x89\x6c\xb8\xc6\x1e\xc0\x98\xc9\xe5\x01\x2c\x45\x42\x8d\xcd\x23\x36\xa0\x87\x89\x91\xe1\xbe\x18\x83\x09\x84\xe9\xe0\x7e\xab\xff\x46\x41\x97\x27\x76\xff\x76\x03\x13\x43\x0c\x6a\xe6\x3f\xe5\xf9\xca\x9b\x9f\x09\x29\x62\x30\x8c\xa6\x4c\xbb\xdb\xe6\x65\xb1\xbd\x9c\xa6\xeb\x4d\x26\x2c\xee\x74\xd3\x1f\xb1\x7a\xa5\xba\xcc\x34\x83\x33\xd1\x9f\x10\xb1\xcc\x84\xb1\x35\x25\xcb\xc8\x3d\xfe\x0c\x12\x43\x6a\x6b\xd8\x39\x1d\x2e\x1b\x79\xcf\x75\x1d\x88\x58\x09\x11\xab\x81\xc5\xc7\xbc\xab\x70\x77\x9e\x6e\xac\x14\xb0\xae\x0c\xbe\x7a\x3f\x1d\xca\xea\x03\xbf\x2b\xd6\x91\x95\x3c\xfb\x7d\xf4\xc1\x10\x62\xd2\x40\xfa\xbe\x5a\xdf\xde\x2f\xb7\xdd\x9f\x8d\x36\x6e\xbe\x38\x58\xe1\x0b\xd4\xf5\xa9\xac\x9a\x87\xf2\x35\x57\xff\x1a\xbd\x4c\x13\x03\x51\xac\x2c\x0e\x87\x47\xa8\xde\xf2\xe2\xb5\x7e\xb1\x3a\x3d\x1f\x27\x67\xc7\x37\x97\x04\xc6\x96\x7d\xc8\x29\x54\xd5\x85\x68\x6b\x6c\x77\x6b\xcf\xa4\xe0\xc6\x86\x2c\x24\x98\xf4\x6d\x07\x69\x11\x49\x28\x25\x0f\x26\x55\xd0\x9b\x21\x2c\xe6\x0a\x59\x2f\x92\x50\x73\xea\x70\x5f\x37\x72\x43\x25\x18\xd2\x89\xfb\x80\x2b\x60\x3e\xf1\x90\x84\xc6\x10\xdf\x51\x7e\x3c\x1d\x76\x97\x1c\x0f\x3a\xeb\xf7\xba\x24\x8a\x81\x72\x1f\x37\xe7\x0b\x49\x9e\x8c\xbf\x70\x12\x25\x92\x6c\x87\x6b\x59\x5e\x54\xcd\x14\x8f\x25\x92\x38\xb6\xd4\x2b\xb9\xc7\x45\x0c\x45\x20\x45\x92\x24\x91\x77\x1d\x9d\xd3\x35\xd0\xde\xec\x6f\x33\x91\x99\xf6\x19\x62\x1f\xe4\x84\xe3\xb7\xca\x12\x4e\x51\x4c\x81\xbf\x88\x59\xaf\x26\x25\x9e\x6e\xa6\x25\x2c\x13\x5e\x41\xc3\x49\x07\x3a\x89\xa0\x9b\x97\x67\xf3\x59\x5b\xaa\x48\x88\x54\x71\x9c\xfe\xed\xae\x2a\x2d\x36\x93\xd2\x33\xd1\x17\x3f\xff\x92\x34\xb2\xde\x06\xf9\x39\xad\x73\x3f\x9c\xb4\x49\x8a\x19\xa1\xcb\xb7\x39\x56\xbb\x35\xe4\xc5\x11\xde\xda\xff\x37\xb0\x57\x7e\x68\x16\xc7\xbe\x29\xd2\x43\x4b\xee\xe7\xbb\x22\x44\x92\x25\x36\x89\x68\xca\x0a\x15\xd4\x8d\x53\x42\x9c\xbc\xcb\x8c\x71\xe2\x42\xf5\xd9\x03\xaa\x3b\x7e\x86\x6f\x10\x49\xc6\x13\x8a\x55\x8f\xa5\xce\x8d\xaf\x1c\x0f\x04\x48\x26\xed\xef\x83\x13\x95\x15\xb5\xf5\xad\xba\xa7\x21\x75\x8b\x48\x32\x9d\x86\x7d\x66\x62\x51\xbf\x5d\x85\x5e\xa3\x4f\xcc\x59\x46\x31\x0a\x75\x26\xd2\xb8\xda\x12\x23\x5c\xf1\x50\xf8\x13\x4c\x16\x7b\x09\x75\xfb\xa6\x46\x0a\x58\x6e\x94\x00\x4e\x5a\x14\x45\xd9\xe4\xe6\xe2\x45\x3e\xc7\x57\x12\xc8\x88\x6f\xde\x58\xf0\xb4\xe5\x1f\xb8\xab\x2c\xda\xa1\xfd\x30\x55\xf7\x50\x00\x69\xea\x71\xf8\xe5\xb9\xaa\x2d\x99\xc8\xe8\x41\xc0\x28\x4b\x6f\xfa\x5a\x0d\x6c\xe2\x28\xef\x98\xc8\x90\x5b\xcd\x61\x6f\x12\xb6\xe5\x08\x14\x34\xfb\x86\xa4\x44\x8a\x21\x96\x65\x55\x1e\xf0\x7d\x90\xa1\x4b\x34\x72\xcf\x51\x7b\x8b\x70\x18\xf9\x86\x09\x6a\xe8\x89\x00\xd5\x5b\x9f\x03\x4b\x8c\x91\x89\x4b\x82\x7b\x76\x1c\xdf\x04\xe9\x1c\x44\x16\x28\xe9\x15\x33\x96\x50\xe7\x45\xd9\x29\xa7\x85\xb3\x9b\x17\x0b\x14\x5a\x0a\x6c\x42\x38\x54\x65\x1b\x02\x57\x9b\xf3\xa9\x35\xcf\x1f\xb4\xfc\x08\x16\xe8\x58\x58\xc6\xff\x36\x2c\x18\x71\x00\x09\x16\xc6\x21\x95\xa2\x75\x79\x77\xd5\x42\x28\x58\x98\x30\xe1\x4a\x24\x84\xd4\x22\xf6\x37\x7b\x71\x9c\xb2\xf8\x09\x16\x85\x01\x51\xc1\x94\x27\xaa\x87\x9d\xce\xcd\x08\xa1\x21\x58\xac\xb8\xcf\x63\x6f\xb0\xd0\xcb\x72\x5a\xfc\x64\x89\xe2\xca\xa2\x09\x5b\xa7\xd1\x97\x57\x87\x09\x32\x96\x20\x32\xf2\x06\x55\x73\x6e\xbd\x2d\xd2\x4c\x18\x10\x03\x08\xc6\x62\xcb\x03\x78\x2c\x35\xbe\x9f\x76\x05\xe4\xde\x85\x9a\x73\xa0\x58\x2a\x39\xe5\x3d\xea\xf2\xa0\xaf\x1e\xce\x8d\xc9\x50\x52\x74\xfc\x82\x0d\x0e\x91\x82\xed\x11\x4c\x5c\x65\xfc\xa5\x2a\xff\x44\xd5\x7c\xab\xc7\x4c\x64\x82\xf1\x90\x13\x2d\x0a\xe5\x49\x37\xf9\xab\xcd\x59\xb4\x4f\xd7\xba\xfb\xed\xe4\xb4\x3d\xfe\x6b\xe7\x1b\xf8\x1e\xae\x89\x71\xbd\x86\x16\x4e\xbe\x34\x4f\x43\x42\xd6\x18\xca\xb4\xf6\x7d\xa2\xed\x91\x28\xec\x26\x63\xeb\xf8\xcd\xa5\x4d\x18\xe7\x11\xb1\x20\x1c\xf3\xa2\x59\x78\xfe\x55\xc1\xb8\xc8\x2c\x50\x1b\x2e\x36\x7d\xde\x3d\x18\x84\x29\xd9\x77\x70\x5c\xe0\xff\x0f\x56\xe5\x07\x81\x21\x83\x38\x20\xc7\x62\x4d\x2c\xf0\xad\xef\x3d\xf1\x3e\x19\x24\x46\x45\x4e\xc1\xeb\xd8\xce\x1e\x57\x0a\x79\x80\xba\x59\xfc\xc4\x0a\x5e\x67\xf5\xaa\x05\x83\x54\xa0\x45\xf5\xea\x1d\x7c\xb6\x21\x31\xc8\x22\x6a\xd9\xfc\x1f\x09\x35\x5a\xb5\xbb\xee\x59\x50\x53\xe2\x75\xd7\x9a\x9f\x91\xbc\xeb\xa7\x15\x08\x26\x43\x88\xb1\x2f\xdf\x8c\xb7\x69\x26\x63\x46\x34\x5a\x4f\xdf\x1e\x6f\x56\xeb\xdd\xf3\xdd\x6e\xf9\xfc\xed\x69\xbb\xbe\x5f\x6d\xfc\x10\x15\x1b\xea\xf3\xa3\x76\xe9\xe3\x16\x0e\x6f\xdd\x11\x99\x41\x3c\x56\x58\x9c\x72\x1b\x4c\x6e\x46\x07\x56\x40\xcc\x9b\xbe\xaf\xe5\x81\xe8\x29\x3e\x2f\x20\x32\x9d\x85\x14\x62\xb6\x8e\x6e\x97\xa6\x9f\x0c\x01\x91\x68\x1b\x04\xef\x28\x59\x53\x4f\x07\x28\x49\xd6\xfb\xe6\xfe\x6e\x31\x5a\x21\x18\x22\x91\x22\x9d\x0e\xa0\x70\x7c\x24\xb5\x15\x00\x89\xcd\x4b\x59\x4e\x9c\x24\x86\x4a\x5a\x4e\x0e\xfa\x95\xc9\xaf\x21\x66\x44\x04\xf6\x08\x7f\xb6\xbb\xc4\x77\xe8\x66\xab\x09\x90\x3a\xc2\x88\xf9\x6c\x79\x26\x42\x3f\x1b\xdf\xf9\x01\x49\xa0\x7d\x51\xc1\x4b\xf3\xd4\x5d\x3b\x98\x48\x03\x99\x25\xb6\x6e\x45\xfc\x54\xed\x32\x1a\xd4\x8c\xd2\x28\x02\xca\x17\x1d\xe1\xdd\xee\x3b\x8e\x25\x98\x88\x9e\x07\x0e\x48\x1a\x31\x1e\xa2\x13\x19\xb1\xb2\x62\x05\x0e\x58\x17\x44\x1a\xa5\x9c\xe8\x6a\x17\xf9\x8c\xb7\x91\x46\x99\xf4\xc4\x62\x6b\xd4\xe7\x8f\xb2\xaa\x69\x04\x22\x09\x7d\x0d\xcb\x63\x30\xea\xee\x37\x40\x53\x30\xa3\xdf\x36\x37\x23\x63\x9c\x26\x99\xe0\x56\xbb\x97\x92\x89\xf3\xe1\x79\xca\x30\xa3\x8e\xfe\x4d\xeb\xe7\x62\xd7\xcd\x7d\x33\xc0\x79\xb8\x91\x69\xa6\x88\x74\xca\xb7\x80\xf7\xec\x9d\xfd\xd5\x32\x21\xad\x7c\x62\x3e\x4e\x00\xf9\xc3\x1a\x69\x1d\xfb\xd9\xfb\xf0\xec\xdd\xc2\x94\xab\x08\xdc\xdb\xa0\x32\xe1\x76\x4c\x79\xeb\x44\x7d\xc6\xbf\x26\x22\x46\x1f\x1a\xdf\x4f\x37\x97\x6d\x47\xdd\xc9\xfd\xe1\x58\x18\x97\x57\x19\x29\xc0\x4e\xde\x80\x60\x09\xd5\x8f\xad\x0b\x37\x2c\x06\xcc\x16\xa4\x53\xc1\x32\x96\x74\xba\x4a\xf9\xf1\x7c\x74\xac\x0a\x93\xcb\xaa\x00\x43\xd7\x18\xd3\x6c\xf2\xd7\xc2\x6a\x98\x8d\x1c\xac\x14\x82\x2c\x52\x1d\xa9\xea\x17\x97\x85\x1e\x65\x3f\x53\x88\x32\xca\xeb\xdc\xde\x2f\x57\xbb\xf5\xe2\xc9\xd3\xc8\x88\x14\xc0\xf2\x72\x0e\x43\xa3\xee\x0b\x6e\x4b\x2a\x36\xeb\xd2\x06\x5c\xa5\x57\x6e\x17\xa9\x14\x19\x65\x29\x8f\xf0\xee\x3a\xde\xba\x23\x1a\x28\x57\xb3\xab\xb1\x11\xfe\x8f\x2a\x88\xa8\xf7\xba\x8b\xd5\x23\x17\xab\x3b\x9f\x38\x9a\xa4\xee\x52\x15\x30\xdb\x74\xe5\xd9\x6f\x45\xaa\x12\xdb\x63\xd1\xae\xb5\x29\x2a\x5b\xa4\x8a\x0b\xea\x76\x20\x32\xb4\x0f\x56\x81\x4e\x8d\x65\x8a\x39\xe4\x7f\xfd\x35\x48\x6c\xcc\xb9\x51\x29\x42\x4c\x95\x04\x18\x4a\x8e\x0e\xb6\xcb\xd4\xc4\x49\x16\x7b\xe6\xfa\x6d\x79\x83\x8b\x35\xfe\xcc\xb1\x93\x15\x14\xa9\x01\x49\x91\x6f\x87\xdd\x6c\x77\xf1\x19\x5e\x56\x91\x05\x49\xe0\x4b\x32\xdf\xa1\x9a\x2b\x73\x66\x81\x4a\x02\x47\xdd\x7a\xe7\x22\x90\xd9\xf0\xc0\xcd\xdc\x2c\x4c\x91\xea\x7a\x36\xb1\xd8\xd7\xad\xa7\xb9\xc5\x2c\x4a\x2c\x21\xf6\x2b\x36\xbf\xf2\x22\x08\xc3\x80\x05\xf3\xd3\x3c\x8b\x32\xe4\x71\x9f\xfa\xb9\x5c\x95\x48\x3f\xdd\x78\xb2\x08\x83\x34\xea\x04\x44\x9f\x4a\x8d\x5f\xaa\x72\xa0\x29\x73\xee\x9b\xc2\x44\x16\x07\x21\x71\x7d\x93\x3f\xf4\xb3\xdb\x0f\xb2\x84\x2b\x42\x2c\x9f\x0e\x90\xf7\x7f\x44\xab\x45\xe5\x0a\xde\xb4\xf0\x6d\x14\x41\x29\xc8\xd8\x8f\x63\x29\x8b\x9c\x59\xff\xad\x94\x7d\x6c\x16\xfe\x33\x49\x00\x91\x31\x8e\xd2\x92\xb1\x9f\xe0\xf2\x50\xc2\x35\x16\x7b\xf4\xd1\x98\x42\x4a\x3c\x90\xb3\x64\xe3\xf8\x35\x0e\x01\x26\xe3\x4f\x91\x86\x46\x79\x42\xce\xce\xa1\x63\x7d\x6e\x82\xfd\x9f\x1f\x98\x64\xb4\xc8\x1e\x2f\xb7\x77\xa3\x14\x5b\x96\x8a\x80\x66\x25\x59\x7a\xfb\xc9\x27\xda\x0e\x22\x4b\xb5\xd6\x8e\x56\x64\xa3\xb0\x80\x2a\xa7\xa0\xa2\x5e\x14\x9a\xda\x90\x9d\xa1\x1c\xad\xc8\x2c\x0b\x92\xd8\x05\x5e\x33\x58\x97\x8c\x07\x11\x59\xf6\x3f\xcb\xbc\xf8\x02\x47\xea\x43\x76\x0a\x7f\xf7\xb7\x03\xbd\xc3\xa9\x9f\x34\xbe\x8a\x08\x2c\xa6\xc7\x86\xac\x77\x88\x1b\xa7\xc0\xff\x69\x43\x90\xc8\x44\x2c\x89\x8a\x5a\x23\xf5\xaf\xe5\x9d\x50\xe5\x78\x98\x8a\x98\xd3\xd9\x26\xe1\xa8\xff\x0f\x1e\x5c\xa6\x52\x61\x65\x3c\xa0\xbd\xf6\xb2\x3c\x78\xef\x78\x32\x0c\x90\xbb\x3c\xc8\x1d\xa2\x2d\xf8\xde\x9c\x2b\x57\xbd\xb1\x9a\xb0\x6e\xa8\x4e\x52\x7a\xd6\x4e\xaa\xa8\xaf\x5c\xf9\x11\x4c\x11\xa1\xec\x4d\xbe\x81\x7c\xf4\xd2\x27\x37\xa7\xd3\x34\x71\x1f\xb4\x0d\xc1\xee\x20\xf7\xfa\x8c\x22\xd3\x26\x23\x97\x4b\x9e\x2f\x04\x77\x77\xc5\xcb\xf3\x4c\xf5\x78\x50\x47\x1e\xc3\x8f\x32\x6d\x24\xed\x12\x4e\x4e\xb6\x5d\xba\x93\x07\xc7\xd0\x50\x40\xad\x06\x6c\xeb\x22\x43\x60\x1d\x6c\xa9\xb5\x4d\x5e\x8b\x30\x8e\xfe\x35\xaa\xdb\x0c\x0d\x17\x1a\x4d\x14\x5c\xdf\xe4\x01\xea\x26\x9f\x95\xc0\x1e\x2d\x32\x93\x29\xda\xdc\xba\x50\x1e\xd5\xde\xc5\xbb\x1f\xac\x33\x83\x86\x30\x7b\x86\xac\x85\x33\x8c\xae\xb9\x59\xf0\x20\xb2\x6a\xa9\x47\x78\xc3\x11\xba\xe2\x3a\x4b\xc8\x03\x16\x91\xf7\xfd\x2b\xa7\xed\xb1\xdf\x07\x79\x90\x65\x52\x78\x11\xcb\x97\x4e\x57\x4e\xf0\x40\x07\xd4\xdf\xb7\xa3\x0f\xdf\x7a\x85\x43\x96\x66\xc1\x03\xcc\x22\x37\x85\x36\x88\xba\xa7\xc9\xbd\x2b\xab\xb9\x7a\x3d\x0f\x83\x80\x96\xde\xf7\xfb\xe5\x8a\x1a\x4c\x77\xf7\xcb\xe7\xdd\xfd\x66\xb7\xd8\x6d\x96\x8b\x47\x7f\xdd\x30\x06\xa2\x3e\xb5\x1b\xda\x68\x36\xcd\xe1\xf9\xfd\x59\x26\x24\x28\x91\x2c\xcb\xb7\xbe\x71\xef\x03\xd5\x3e\xc1\xa3\x94\x73\xbb\xc2\xa8\x80\x40\x70\xe9\x2b\xc9\x03\xc1\x23\xae\x48\x6d\xf6\xee\xe1\xfe\xe5\xe5\xfe\x69\xb5\xd9\xac\x9f\xbf\x3d\xdd\xde\x3c\x3f\x7d\xf3\x21\x0f\x8f\xc0\xca\xf6\x52\x07\x58\x8e\x85\xae\xef\xf2\xe2\x15\xab\xba\x0d\x0e\x89\x1b\x74\xca\xf4\x3c\x7e\x2d\x11\xa4\x24\xba\x77\x9b\xe7\xa7\x41\x35\x8b\xc7\x81\x34\x49\x07\x12\x5e\x3a\x11\xb8\x2b\xa1\xde\xb1\x43\xc2\x63\xc0\xc4\xd7\xf7\xae\xd9\xe3\x26\x3f\x9d\x84\xc6\x4a\xd3\xe2\xaf\xf5\xf9\x9a\xdd\x6b\x38\x7b\x79\x22\xac\xf3\x7d\x84\x77\xc7\x76\xea\x33\x1a\xfe\x86\x13\x6d\xd9\x73\xe5\xf9\xf2\x15\x07\xd8\x11\x77\x98\x45\x29\x4f\xc7\xf2\xc6\xfe\x4c\x06\x8a\xec\x02\x18\x93\x1f\x72\xc2\x37\x37\xbf\xca\xca\x87\x29\x3c\x4d\xac\xf8\x9f\xcc\x3f\xc8\xf1\xf1\xd6\x53\x6d\x2f\xbe\xc5\xda\x6b\xe5\x7f\xa6\xd4\x2c\x78\xaa\xd0\xb7\xde\xea\x06\xe1\x48\xbc\xd0\xad\xf1\x0f\x27\xb7\x9d\x6a\x69\xd3\x54\xaa\xf5\x31\x87\xf9\x32\x9e\x61\x6c\x49\x5e\xa0\xf8\xad\xfd\x70\xe3\x5b\xca\x0c\xf7\x78\xe6\xfb\xe2\x74\x6e\xea\x59\x46\x01\x37\x98\x73\x41\xb5\x4e\xcf\x62\x7f\x0b\xb9\x8b\xc3\x14\xa2\x9e\xec\x0f\x5c\x04\x86\x1a\x7b\x8e\xa5\xde\x9d\x5c\x07\xcf\x74\xe3\xf9\xac\x3b\x79\xf4\xd3\x42\xd9\x42\x96\x13\x40\xb5\xaa\xa7\x96\x30\x7c\x38\x61\x43\xe1\xa7\x18\x40\x68\xba\x32\xeb\xaa\xd0\x65\x55\x53\xf8\xf3\xd1\x0e\xe5\x4f\x93\x16\xcb\x59\x93\x15\x59\x77\x94\x7e\xed\x11\xe5\xfb\xf1\xda\x35\xb8\x45\x38\x4e\x1e\x18\x14\x27\x64\xf1\x09\xab\x63\x7e\x98\xc8\x16\x08\x0e\x1a\x8d\x63\xd4\x71\x89\xdb\xb2\xea\x2e\x6e\x04\x95\x86\xc8\x9c\x8c\xc8\xea\xe7\x97\xa3\xcc\x32\x02\x4b\xdd\x3f\x7f\x1f\x53\x60\x09\xae\xe3\x44\x8e\xf5\xa2\x6f\xb6\xeb\x69\xe6\x90\xeb\xcc\x12\xd4\xd9\x44\x07\xa5\xfb\x68\x72\x4d\xe6\x95\x96\x61\xd7\x6b\xe2\x92\x9f\xf7\xf5\x5d\x59\xad\x87\xdc\x58\x03\x03\x87\x71\xc8\x1d\xa7\xcc\x47\x73\xfb\x43\xaf\x80\x63\x16\x11\x6e\x6f\x7b\xff\xc7\xfd\xd0\x0d\xe3\x28\x90\x6a\x10\x7e\x51\xe6\x1f\x80\xe4\xb8\x61\xae\x4f\x6b\x6e\x9b\x3b\x0f\xd0\x40\xc3\x7b\x36\xa9\x76\xcd\x55\xd4\x34\xe8\x13\x84\xee\xc7\x45\x80\x29\x65\xa9\xdc\x6a\xdf\x94\x2a\xc7\x91\x26\x9b\x10\x61\x64\x2b\x78\x03\xf6\xcd\x5b\xac\x9b\xaa\xbc\x74\x9b\xb7\x08\x99\xd1\xb1\xe7\x65\xb1\xa8\xc4\xfb\xba\xf5\x2d\xba\x01\x2a\x20\xe2\xa3\xed\x66\xbb\xda\x6c\xe3\xee\xcf\x06\x28\x66\xee\x9a\xac\xcb\xaa\xde\x51\x92\x4e\x97\xbf\x88\x38\x7b\xfc\xc9\x44\x14\x47\x59\x32\xe0\x49\xb5\x30\xbf\x4f\xa8\x52\x85\x88\xb2\x20\xb1\xcc\x5c\x70\x74\x03\xfd\x11\x13\x51\x17\xd7\xce\xae\xbb\xef\x65\x33\xa6\xd7\x10\x22\x0e\x23\xff\xf6\xd4\x19\x97\xd0\xb4\x71\x80\x15\x41\x18\xd9\x7c\x11\xa7\x11\xf9\xc9\x6d\x28\x7b\x03\xea\xed\x95\x28\xc2\xc8\x89\x0b\xd9\x78\xa9\x88\x58\x60\xe4\xe0\x23\xce\xd1\x1f\xe6\x11\x44\x92\xa6\x54\xf8\x05\x59\x56\x96\x19\x79\xd0\xa2\x21\x12\x6d\xd3\x2c\xdb\xf5\x37\x1f\x98\x0b\x16\x67\x49\xcf\xee\xf6\xdd\x02\xa6\x26\x2b\x47\xa4\x51\xc4\xad\xe4\x00\x51\x99\xaf\xb1\xce\xeb\xe6\x8a\xe9\x5f\x88\x94\x85\x26\x1e\xc8\xcd\xbb\xd2\xf2\x94\x70\x51\x88\x34\x4b\x29\x91\xb1\xa3\xc4\x97\x69\xd7\x97\x17\xbc\x18\x10\xea\x08\x91\x05\x40\xa1\xf4\x73\x81\xbf\xe3\xe5\x6f\x27\xaf\x3f\x2b\x41\x8a\x21\xfa\x85\x6e\x13\xcd\x13\x3b\x2c\x32\xd4\x44\x62\x7c\x8b\x3f\xfb\x9c\x9b\xe0\x5c\x53\x1f\x4a\x81\xbf\xfe\x87\x00\x64\xe5\x15\x1c\x4c\x70\x4c\x13\xf7\x19\x36\x4d\x05\x0d\xbe\xda\x9b\x9b\x60\x7e\x26\xb3\x49\x88\x30\x73\x86\xb2\xf5\xca\xea\x7a\xa7\xf6\x90\x17\xbb\xa2\xec\x81\xde\x42\x68\xab\x9e\xf3\x8b\xa6\x5b\x47\x20\x27\x84\x8c\xed\xa7\x97\xe7\x8b\xe5\x1d\x8b\xba\x23\x29\x0f\x2c\x2b\x0c\x79\x4d\xe4\x08\x8d\x7f\x59\xf1\x8c\xf2\xba\x1a\x55\xa9\xf1\x05\x2a\x38\xd6\x33\xc3\xb4\x4c\xa5\xd5\x31\xaf\xa9\xea\x3a\x7e\x68\xad\x52\xe9\x12\xf7\xf7\x0d\x1e\x37\x4d\x79\x3a\xa1\xf6\x51\x5c\xff\xd1\xd0\x40\x2a\x3b\x38\xf0\xbc\xe6\xa6\x1d\x0a\x41\xc4\xb8\xb0\xb2\x0d\xbb\x97\xf5\xfd\xd2\x4f\x4b\x08\xa2\x94\x39\xa1\x96\xbc\x78\xfd\x01\x9d\x8e\xef\xb8\x74\x0b\x81\x14\x54\x50\x5a\xe4\x15\x90\xad\x1e\xf3\xf4\xcc\x6c\x98\x10\x20\x23\x4b\xdc\xba\xfd\x14\xa5\xec\x7e\xfa\x04\x12\x84\xb1\x15\xb8\x5a\x56\x50\xbc\x5d\x6a\x87\xf5\xf3\x47\xa3\x38\xa2\x66\x46\xf0\x55\x91\x61\xb3\xf4\xac\xdd\x85\x48\x28\x82\xda\x17\xe5\xae\x34\xbb\x66\x18\x1f\x43\xa4\xac\xb0\x93\x63\x8b\x1a\xa7\xe6\xe6\x23\x57\x88\x91\x51\x16\xc5\xed\xf6\x43\x7e\xe5\x41\x49\x66\x7c\x4e\x92\xa6\x84\x60\xc9\x0b\x8b\x0e\xfa\xcd\xaa\x6a\x8d\xac\x15\xb0\x38\x95\xc1\x08\xe8\xe1\x6f\x93\x25\x99\x0c\x5c\x29\xa4\xd2\x03\x75\x8e\xf1\xa7\x64\xad\x9b\xe7\x72\x8d\xf0\xbe\xbc\x5e\x6e\x40\x60\xfc\x09\x69\x3b\xc9\x34\x7f\x1e\x75\x03\x33\x61\xe4\x75\x38\xb0\xf2\xb3\x1e\x52\x91\x44\x69\x67\x6c\x9a\xf3\x55\xa5\x0c\xb2\x94\x19\xe1\x0c\xfe\x7d\xf1\xb3\xbc\xe2\xae\x9f\x9d\x1f\x19\x57\x21\x8c\xe4\x60\x7e\x72\xff\x9b\x99\x8c\xc9\xbe\xee\x49\x35\x78\x80\x86\x85\xcc\x64\xae\x14\x48\xcd\xcb\x3f\xf2\x83\x56\x3e\xf7\xe7\x93\x4d\xc0\x03\xe3\x63\x8d\xe5\x79\x5a\xb5\x00\x1e\x07\x6e\x7f\x6a\x76\xa7\x9e\xdf\x70\x57\x9c\x8f\xed\xe4\x39\x55\xe5\xae\x6a\x6f\xc7\xce\xa2\x5d\xeb\x11\x35\xd7\xd8\x16\x7f\xb1\x4c\x3a\xc1\xb5\x6b\x96\x93\xf1\x5b\xe2\x32\xa5\xd8\xf2\xf9\xd4\xc0\x70\xf3\x06\x91\x84\x1d\x1a\xf5\x74\x9a\x7f\x73\xe3\x1f\x15\x90\x12\x07\x6d\x5e\x7f\x3f\x1f\x8a\x81\x44\x55\x9a\xfc\xbb\xdf\xa5\x40\x80\xa0\x74\x55\x5e\x2f\xcb\x5a\x8f\xe7\x21\xf0\x40\xfa\xfc\x8f\x4f\xfb\xcd\xfe\x16\x80\xa5\x61\x6c\xaa\xcb\xe2\x60\x75\xbe\xb0\xfe\x08\xc9\xf0\xef\x29\x62\x6a\x26\x23\x00\x00\x86\xa7\x3d\xb8\xf4\x50\xaa\x17\x1b\xe6\x8c\x7f\x58\x06\x31\x55\x8e\x6f\xce\x17\x8b\x4d\x9f\x7e\x47\x19\x68\xaa\xb3\xfd\xb6\x58\xfe\xfe\xf2\xbc\xdd\x51\xb0\x4c\x8d\xf1\xcb\xd5\x93\xaf\x22\x80\x62\x92\x1c\x48\xbb\x92\x5d\xbd\x36\xea\x8f\x2a\x22\xc8\xd8\xd5\xfb\xdc\x51\x06\xf8\xdb\x54\x59\x00\xd8\xf9\x54\xf9\x11\xd7\x24\x31\xe0\x8f\xca\x84\xd2\xf4\xf6\xb2\x7a\x61\x4d\x5c\x7f\x54\x49\x9f\x0c\x2a\x3e\xea\x3c\x71\x63\xb5\x8c\xb4\xe9\xd5\xf9\xf3\x99\xd2\x17\x68\x0d\x42\x76\x90\xcd\x5f\x05\x56\xb6\x1b\x76\x5b\x6e\x90\x78\xe9\x9e\x8b\x47\x24\x2a\x1e\x7f\x07\x18\xd9\xc4\xe1\x17\x38\xe2\x53\x1b\x1b\xb5\xef\xf0\x53\x9a\x15\x01\x18\x27\x81\xcd\x86\xd6\xe7\x23\x3a\xf6\xb4\xee\x82\x29\x12\x22\x93\x4a\x7a\xf7\x47\xcf\x48\x3e\x23\x5d\xf0\xd9\xa2\x47\x13\x8a\xd4\xf3\x7a\x2f\xcf\x4d\x69\xcc\x20\x09\x0f\x26\x4c\x08\x77\x24\xf1\x06\x8a\xbe\x0f\x40\x06\x42\x46\x3e\x87\x33\x8c\x2d\x65\x00\x96\x45\xa9\x2b\x1f\x95\xea\xed\x5b\xd1\x4c\xd1\x57\x32\xd0\xc2\xb5\xce\x1c\xcb\x9f\x96\xd3\xf3\x3a\x8f\x21\xc3\x30\xd2\xdc\xe7\x6a\xaa\x9f\xb9\x22\x69\xfb\xc5\xe9\x74\xf0\xc4\x97\xd3\xf1\x82\xba\x1b\x96\xe5\x71\x20\x14\xde\xfe\x5d\xa7\xaa\x93\x2e\xb1\x35\x8c\x7e\xe3\x96\x61\x26\x13\xdf\x75\x81\x87\x43\xdf\x94\x3d\xbe\x7a\xc4\x32\x2a\xa2\x9a\xfc\x70\xf8\x76\xda\x96\x83\x14\xf2\x20\x75\x95\x0e\xfe\xa3\xef\xe8\xfa\xb4\xfd\x50\x46\xda\x6a\xd6\xac\x49\xb1\x56\x7f\x3e\x2d\x64\xcc\x02\xaa\xf6\x34\xf9\x11\xbb\xdd\x75\x57\xff\x82\xd3\x8e\x64\x17\xfd\x53\xc7\x29\xc6\x4e\xbb\xad\x29\x90\x0a\xa4\xed\xf6\x36\x7e\xa8\x38\x8b\x7d\x3f\xba\x25\x50\x99\x2b\xe3\xc9\xc4\xc1\x21\xcf\x75\xd7\xb2\x32\xe3\xd1\xcb\x04\x91\xdc\x1a\xd0\xfa\xfb\xc9\xfc\xad\x51\x9a\xe7\xe9\xea\xde\x0a\x0b\x25\xd9\x13\x87\xd0\x5b\x62\x35\x60\x3c\xf5\x63\xd2\x58\xba\x02\xe2\xba\x94\xe5\x74\x02\xb1\xd4\x36\x67\x7f\xfd\xcf\xfd\xcb\x38\x27\xf7\xf7\x54\x61\x42\x32\xae\x89\xfd\xd3\x3b\x1d\x65\x81\xb3\x69\xe2\xb9\x95\x25\xd3\x28\x25\x1e\xb3\x85\xd6\x77\x79\xbd\xbf\xb9\x7c\x92\x61\x96\x29\x04\xca\xf5\x72\x2d\xe1\x04\x2a\xf7\x24\xb6\x42\xa6\x26\x26\xcf\x67\x54\x41\x9c\xe2\x24\xe7\xef\x3f\x13\x69\xe8\xb9\xd9\xbf\x15\x75\x79\xd0\xdb\xdb\x95\x17\xd6\x79\x39\x40\x63\xca\xea\xe8\x7f\x87\xeb\x8c\x32\x70\x8b\x25\xd4\xa0\xf3\xc5\x31\x57\xf9\x70\x5b\x94\x22\xb4\x35\x7b\xf2\x3b\xca\x0a\x5e\x71\xb6\x97\x58\x0a\x16\x52\x25\x2d\xaf\x3d\x6c\xcd\x62\x19\xef\x8b\x17\xeb\x63\x5d\x8d\xb7\x1d\x19\xf2\x7c\x19\x24\xcf\x3f\x92\x60\x11\x52\x40\x28\x22\x2f\xa9\xda\x87\x46\xa1\x88\xfe\x3d\xfa\x37\x0d\x46\x9d\x2e\x12\x42\x4d\x18\xcb\x9d\x39\x1f\xda\x25\xfc\x52\xa1\x9b\x59\xfa\xc5\x71\x7b\x7f\x94\xb0\x1d\xdf\x30\x44\x69\x34\x2c\x91\x7b\x41\x74\x97\x5f\x9c\x3c\x1e\x30\x41\xa9\x80\xd5\xf6\xeb\x40\x17\xc0\xbf\x54\xd0\x92\x82\x65\x5a\x4d\x2f\x7b\x8b\x41\x1a\x72\x36\x8d\x1f\x01\x4d\xe2\xa8\x9a\x9e\xf0\xd7\x80\x04\x6a\xfc\x93\x32\x95\x54\x87\xd9\x56\xd8\x8c\x58\xee\x84\x94\x19\xf7\x3c\xc5\xdb\x8e\xd2\x7e\xd5\xce\xa6\x42\xe1\x1d\x12\x53\xc5\x78\x12\xa9\x58\x93\x7f\xbb\x78\xad\xd0\xe6\xcb\xdc\x01\x64\x9d\x9c\x1c\x41\x51\x37\xe5\x61\x8c\xb9\x92\x98\xa1\x70\xb8\xac\x49\x9b\x8d\x1f\x20\x94\x0a\x2c\x17\x9e\x3d\xf3\xeb\x80\x7e\x4b\x48\xd4\x82\xda\x6e\x7c\xb8\x71\x0d\xaf\xfb\x90\x7f\x77\x00\x2e\x93\x68\xb4\xa3\x61\x24\xb9\xae\x76\x7f\xf3\xfe\x86\x34\x21\x78\x0a\x4d\xa2\x67\x6d\x37\x21\x67\x01\xc7\xef\xd4\x30\x1d\x7b\xc2\x5a\xa7\x2a\xe4\x8f\x64\x99\x1e\x14\x6f\xe8\x31\x97\xd7\xbd\x8e\xd2\xe8\xd8\x2b\x45\x9d\x4f\x16\xd1\x7f\x57\x56\x1b\xe2\x09\xd9\x34\x78\x9a\x0f\x9e\x55\x18\x27\x44\x1f\x77\xb7\x5a\xed\x1e\xef\x1d\xaf\x90\x50\x61\x12\xd0\x8d\xe7\x45\x8d\x55\xd3\x33\x0b\x7d\x40\x97\xa2\xc2\x44\xd1\x34\x3c\x12\xdb\xfd\xa4\x8b\x52\x45\xa1\xa1\x8d\x36\x2f\xa8\xc1\xae\x4b\x71\xab\x28\x13\x04\xba\xfb\x82\xc5\x72\x9f\x9f\x1e\x08\x0a\xbb\x7a\x6f\x2a\xf8\x3c\x78\x51\x11\x0f\x09\xce\x5b\x9e\xb0\xb8\xcb\xab\xba\x19\x61\x51\xc6\xd9\x7f\x15\x01\x50\x26\xe8\x5c\xe4\x4d\xdd\xfa\x50\x1d\xf0\x4d\x45\x60\x98\xa5\x54\x83\xd7\xa1\xfc\xa4\x3f\x2c\x19\x4f\xfa\x54\xdd\x6e\x90\xf6\x51\x11\x6a\x22\xbe\xe8\x4e\x1a\x92\xd4\x7d\x6e\x3a\x55\x1c\x1b\x22\xff\x27\xc0\xd7\x44\xc0\x6c\xfc\xea\x62\x11\x88\x21\xe6\xe6\xb6\x0f\x8e\x54\x6c\x62\x74\xeb\xf5\xa5\x2c\x0f\xf3\x54\x0d\x2a\x36\x99\xe9\x69\xc0\x6c\xba\x6d\xb2\x01\xab\x24\x32\xc4\x06\x79\x2e\xdc\x2c\xd6\x43\xb7\x4b\x25\x09\xa3\xd9\xf9\xa5\x6c\x50\x95\xf9\x68\xcd\xab\x04\x53\x62\x65\xcc\x55\xb9\x29\x4d\xd3\x89\xda\x0a\xc5\x58\x42\x7c\x30\x5e\x04\x60\x0a\x16\x52\x69\x9c\xc8\x60\x40\x39\x67\xd3\x8d\xa3\x45\xac\x52\x96\xd2\xfc\xa7\x4c\xb5\xcd\x63\x7a\x0b\xa0\xb2\xcc\xaa\xf7\x76\xf4\x2f\x5f\x4b\x7d\x98\xfc\x46\x06\x9c\x00\xae\x83\xd0\xaf\x76\xfa\x33\xdd\x04\xe1\x8e\x97\xde\x8b\xb4\x8f\xa7\x0f\xe7\x31\x99\xa8\xbc\x5e\x1d\xf3\x66\xe0\x24\x2b\x2e\x6c\xbe\xcd\x7f\x9c\x79\x6a\x37\xf2\xc9\x66\xaa\xb3\x93\x39\xc1\xa5\xa1\x7c\xff\x73\x75\xda\xe3\xb9\x7e\x84\x2a\x2f\xe0\x06\x8a\xd7\xb7\xf2\xad\xfb\x41\x6d\xb3\x01\x6d\xf8\x39\x5b\xe9\x52\xd2\x84\x91\x15\xc7\x6b\x56\xdb\xaf\xf3\xfe\x80\x52\x71\x9c\x38\x32\xc0\xfb\x06\x8f\x1f\x98\x06\xa2\x38\x6f\x23\xb2\xe7\xa7\x6f\x9b\xdd\xf6\x7e\xb5\x0e\xfd\x7d\x60\x00\x54\x28\x5c\x9f\x0f\xd8\xbc\xc1\x7d\xd9\x1f\x90\x14\x67\xee\x6a\xf8\xe9\x12\x62\xff\x9a\x38\x5e\x0a\x65\x9c\x7a\x59\x98\x9d\xc6\xe3\xb9\x6a\x77\xfb\x36\xa8\xdd\xc9\x11\x3b\x83\x32\x71\x48\x51\xcd\x1a\x2d\xf9\xf4\xf8\xfe\x8c\x08\x28\xa3\x70\xaa\xf0\x5e\x95\x2e\x0d\xde\x13\x22\x74\x17\x01\x43\x75\xf8\x57\x87\x6b\xa0\x0f\x35\xba\x92\x0e\x75\x42\xfe\x67\x83\xef\xcd\x84\xea\xcc\x8d\x88\x02\xc9\x6c\x56\xfc\xd8\xce\x01\xd4\xdf\x2d\x55\x7f\x39\x4d\x37\xe8\x28\xb4\xb9\x8c\x9e\xa4\xf4\xa5\x1a\x22\xae\x75\x94\x49\x82\xc0\x61\xa1\x57\xcd\xfe\x0b\x0e\x05\xa9\x85\x8e\xc0\xd0\x52\x6b\xb0\x6e\xee\xca\x72\xd3\xc3\xcd\x75\x1c\x5a\x4a\xbb\x47\x68\xd4\x9e\x80\x28\xb7\x08\xfa\x90\x17\x1f\x20\xa6\x74\x1c\x6b\x7a\x7d\x92\x32\xf2\x6e\x5f\x19\xed\xa1\x3a\x56\x68\xb7\x5f\xd5\x10\x75\x70\xf7\x77\xcd\xb2\x2e\x1a\xfe\x56\xb7\x91\x56\x57\x99\xd2\xb1\x4e\x29\xc6\xfe\x69\xb9\x5b\xaa\xa9\x2e\x7d\x3b\x02\xa8\x27\xe5\x98\xd7\xea\xa9\x74\x9c\x6e\xfe\x60\x92\x24\x04\x48\x7f\xf4\xd0\x16\x7f\x80\x45\x48\xd5\x94\x3f\x8e\x65\x81\x0d\x0c\x5f\x1a\x8b\x63\xe6\x92\x9f\x63\x78\xbb\x66\x2c\x14\x0e\x36\xf8\x32\x05\x74\x68\xa6\x03\xaa\x3a\x0d\x78\xd6\x3f\x2f\x74\x69\xa6\x15\xb5\x73\xbc\xec\xa1\xd2\xe7\x7a\x5c\x72\xd5\x69\x9a\x11\x8a\x56\x7e\x84\xa6\xd4\xa9\xb4\x37\x4a\x9a\x47\x3d\xa1\xaf\xd0\x99\x4e\x68\xd6\x6b\xaf\xdc\xf5\xa9\x17\xa8\xb9\x08\x33\xd6\xb1\xc1\x1e\xfa\xfc\xe0\xcd\x69\x3a\xe3\x44\xa0\x42\x17\x16\xd9\x17\x3d\x07\x52\xd3\x22\xb5\x7a\x8d\x0d\x56\xc7\xbc\x18\x6e\x38\xa3\x89\x2e\x04\xc7\x61\x84\xfd\x15\xea\x3d\x65\x20\xea\x7d\x7e\x9a\xdf\xa3\xb4\x90\x91\xe3\x93\xb7\x73\xb9\x1f\xef\x06\x80\xb2\x80\xa7\x3d\x71\x4e\x47\x2c\x1d\x32\x74\x69\xc9\x24\x28\xd2\x66\xaf\xf3\x66\xb8\xef\x68\x29\x50\x5a\x07\xce\xeb\x76\x7e\xf0\xd6\x55\xaa\x7d\x8b\xd9\x2d\xb5\x7e\x4f\x25\xb8\xad\xc7\xee\x47\x67\xb1\x57\xea\x5b\x1e\xf2\xc1\x5c\xd2\x31\x23\xaf\xe2\x7e\xf9\x3c\x20\x55\x16\x5a\x67\x56\x30\x97\x44\x5e\xb6\x83\x48\xe9\x0a\x84\x7e\x0d\x32\xd1\x9a\x1b\xca\xa4\x3c\xad\x6f\x76\xe3\xc5\x67\x34\x2a\xde\xe1\x7a\x0f\x70\x19\x3e\x3c\x06\x51\x6a\x2c\x01\x4d\x83\x55\x01\x87\x0f\xe1\x7a\xa3\x57\x81\x41\xa4\x09\xa0\x72\x42\x7c\xeb\x2e\xc5\x14\x79\xec\x1a\x0f\x70\xd9\x9d\xca\xf2\xb0\xd3\x15\xe4\x85\xa3\xca\x99\x5c\x80\x1b\x47\x23\xd6\x2e\xc0\xe7\x9f\x9d\xc3\x8c\x81\x30\x9e\x0e\x68\x38\xd1\x76\x1a\xde\x70\x3f\x75\x69\x31\x90\x82\xcc\xf3\xc3\xe3\xf3\x08\x22\x83\x81\xea\xf8\xbd\x29\xbf\x98\xff\x35\x89\xd9\x30\x4c\xb8\xf1\x3f\x44\xbd\x5a\x06\xab\x8e\x9d\x0d\xc3\x34\x25\x65\x72\xd2\xa8\xb4\x41\xca\xd2\xfa\x36\x79\xb3\xbf\x73\x4c\x75\x50\x61\xd1\x3c\x95\xcd\x7d\xf1\xad\xeb\xdb\xc7\x28\x30\xa9\x5b\x29\xbf\x95\x92\x00\x6e\x30\x57\x65\x18\x2d\x09\x8c\x62\xa5\x8c\x13\xc6\x3b\x3b\x85\x98\x59\x12\x8c\xc9\x97\x88\x74\x1c\x78\x98\xfa\x76\x5f\x95\xbf\x6e\x0e\xa5\x6c\x63\x5b\x7c\x2a\x9b\xb5\x63\xd6\xec\xcc\x22\xc6\x41\xe4\xd1\x8d\xdb\x0a\x34\xd2\x53\x6f\x48\xec\xae\xdd\xa4\x27\xab\x1e\xe3\x18\x09\x37\x45\x8c\x60\xba\x37\xdd\x18\x63\x48\xba\x4a\xed\xcf\xde\xe6\x3f\x17\xfa\x43\x25\xe2\xc9\xfd\x26\x21\xd3\xb1\x87\xb4\xad\xb6\x5f\x2d\x4f\xa9\x3f\xa8\x12\xd5\x27\x2b\x1e\xca\x9f\x58\x7d\x82\xdc\xc0\x04\xd1\xc2\x1a\x1a\xa8\xbc\x16\xfa\x79\x24\x06\xeb\x06\xb2\xc8\x22\xf3\xb0\x75\xfa\x77\xb2\x17\xa6\x11\xc8\x92\x40\x30\x1f\x13\x19\x5f\xbb\xed\x8f\x86\x60\x06\x46\xe7\xbe\x30\xe5\x23\xbc\xbf\x60\x45\x1f\xe8\xfe\x38\x2c\xdb\xf9\x73\x74\x42\x36\x70\x9f\xab\x7a\xb8\xf3\x60\xca\x2d\x47\x95\x93\x78\xba\xce\xa5\x4c\x48\x36\x30\xcb\x32\xc2\x56\x14\xf8\xeb\x2b\xe6\x1f\xe4\x7a\x91\xa7\x09\xc5\x64\xfb\x36\x2a\x82\x23\xe8\x3f\x41\x61\xa1\x2e\xbe\x01\x6c\x58\xc5\x40\x91\xf0\xd4\xa7\xca\x9a\xfd\xd6\x3a\x34\xcf\xe7\xe6\x74\x6e\xae\xb9\xa9\x05\x0a\x61\x3f\x88\x63\x61\x20\x3d\xae\xee\xd5\x09\xa1\x2d\x4d\x04\xf1\xea\xcd\xf6\x96\x4f\x51\xed\x28\x8c\xa4\x4e\x9f\xfb\x97\xbb\x4d\x6b\xa8\x47\x05\x04\x84\xc8\x7a\x9e\x17\x84\x6a\xfb\xab\x1c\x70\xbc\x76\x03\x78\x66\xb9\xa7\xbb\x4f\x04\xa9\xe6\x5d\x3e\xe1\x95\x80\x9d\xb6\xc7\xd0\xdd\xc7\xe8\x79\x24\xb7\x10\x54\xca\x15\xec\x47\x69\x5f\x94\x32\x8e\xac\x49\xb2\xed\xd4\x47\x92\xd3\x29\xdf\x2f\x13\xea\x91\xf1\x03\x49\x69\x57\x88\x95\x33\xb4\x4d\x2f\x2e\xcb\xed\x79\x39\xfd\x48\x94\xd4\x3c\xf9\x7c\xea\xa7\x84\x8a\x6c\xb3\x77\x7d\x56\x0a\xeb\xba\xaf\x18\xa3\x82\x98\xaa\x99\x47\x28\xf2\x13\x21\xc3\x37\xa8\xaa\x0e\xc3\x80\x5a\x1b\xcf\x38\xb9\x51\xfb\xb2\x3c\xcc\x6f\x9b\x88\x4a\x52\x1d\xcd\xc2\xea\xc3\x41\xca\x18\x11\x19\x51\x59\xef\x2d\xb7\xde\xe4\xd3\x1b\x65\x79\xe6\xf1\x1d\xd5\x80\x8e\x72\x98\x95\x30\x41\xa4\x12\xed\xbb\x29\xac\x91\x7d\x29\x0f\xb9\xba\x4c\xb4\xa5\x84\x09\xa3\x10\xb8\xaf\x1f\xda\x14\x53\x77\x84\x53\xb5\xe4\xbf\x67\xac\x2e\x8e\xbd\x66\xf4\x08\x26\xc9\x58\xe4\xe0\x37\xa4\xa0\xd1\x2e\xdf\x25\x54\xba\x35\x60\x54\xa5\xf2\xe3\xa4\x24\x68\x16\x19\xab\x17\xc8\xf5\xc2\x63\xda\xfc\x08\x96\x72\xe9\x70\x61\x0e\xb9\x60\xd9\xa9\x7e\x3b\x57\xe5\x48\xa6\x58\x18\x86\x01\x21\x09\x4e\x9e\x8d\x74\x38\x51\x4d\x1a\x2a\x2a\x11\x14\xf8\xde\x78\x35\x9b\xee\xd5\x99\x34\x52\x94\xc2\x97\xe7\xcb\x12\x0e\x6a\x51\xe8\x19\x41\xcc\xbf\x35\x95\x26\x15\x40\x6c\xfe\x58\x98\xb2\x52\x03\xc1\x8d\xfe\x1b\x9a\x2c\x15\xd4\xdd\x6d\x65\xe2\x3f\xc0\xef\x1b\x9e\x85\x49\x4f\xab\xd1\xc9\x7b\x0f\xa7\xbf\x11\x69\x46\x54\x41\xaa\xa4\x66\xda\xc7\xd6\xe2\x0d\x0a\x68\xdd\x3d\x8e\x6e\x51\xa4\x40\x44\xf7\xa7\xb2\x26\x0f\xf2\x73\xea\xbd\xf1\xe3\x89\x2c\x51\xe8\xeb\x4f\xae\x43\xe4\x4b\x09\x87\x31\x15\x97\x11\xc0\x28\x0a\xdc\xfd\x2c\xcf\x6a\x8f\x55\x7d\x5f\x10\x64\x54\xbf\xf8\x49\xdf\x7d\xb3\x76\x55\x90\x29\x38\x1f\x1a\x28\x9a\x81\xed\x35\x10\xa4\x5e\x74\xbc\x7b\x8f\xcf\xe7\x39\x3a\x5a\x03\x71\x42\xb9\x00\x93\x17\xda\x2b\x22\x0d\x05\xbc\xfc\x30\x63\x3b\x15\x64\xae\x47\x8d\xd8\xee\xb0\x8c\x13\x82\x63\x38\x8c\xd1\x3a\xd7\x63\x42\xbf\x6c\xde\xb3\x32\x2a\x92\xd4\xa0\x74\xbb\x7e\x7e\x5a\xfd\x41\xe5\x47\xff\x0c\xda\x25\xa5\x69\x17\x73\x9f\xfa\x09\x51\x4f\x7b\xec\x8c\x16\xcc\x8a\x35\x6d\x97\x43\xb1\x1d\x61\x34\x5a\xe2\x83\x21\xb8\x86\x40\xb8\x93\x0b\x60\x64\xab\x44\x8e\xb0\xae\x3c\x1c\x6e\xb1\x56\x55\x7e\x1a\xf9\x31\x7d\x2b\x2c\xf7\xe7\x65\x11\x81\xa6\x17\xb7\x8f\xf7\x4f\xf7\x9b\xed\x7a\xb1\x7d\x5e\xfb\x1f\x37\xcc\x46\xb7\xaf\xd8\x3c\xc2\x6b\xae\x1c\x31\x9c\x3f\x9a\xda\x56\x99\xd6\x00\xf8\x9b\xbb\xc3\x89\x88\x12\x04\x41\x94\xd0\xa3\x11\xa3\xe7\x65\xb9\x6f\x4d\xec\x4c\x2f\x0c\x04\x01\x17\xda\xb3\xb2\xed\xf3\x83\x9e\x62\x50\xfa\xdb\x86\x20\x8c\x6c\x57\xee\x01\x0a\x5d\xf7\x72\x81\x10\x84\x19\x87\x5e\xdb\xf3\x6a\x29\x0c\xbf\x38\x04\x21\x47\x02\xeb\xaf\x57\x9b\xd5\xfa\xfb\x6a\xb3\xdb\x6c\x17\xbf\xaf\xfc\xa5\x22\xad\x28\xae\x96\x67\xfd\x8a\xcd\x10\x8f\x06\x41\x84\x36\xb6\x72\x8e\x81\x85\x2c\x8e\x9f\x3b\x76\x94\xcb\x37\xe7\xcb\x5d\x59\x11\x5a\xe6\x33\xb6\xff\xcf\x0c\x0b\x04\x89\x42\x26\xbb\xd6\x32\x1f\xc5\x0c\x92\x55\x10\xb0\x50\xd1\x4e\xbc\xf3\xf6\xef\xa1\x2c\x4f\x77\xb9\x29\x67\xb3\x00\x10\xb0\x48\x53\x43\xbd\x6f\x21\x18\xe3\x57\xdd\xe8\x64\xfc\x89\x18\x03\x4a\xac\xad\xda\xd8\xe3\x54\x75\xd4\x57\x10\x30\x01\x16\xd8\x66\x95\x8c\x7e\xcb\x8b\xd7\x6b\x0c\xf7\xb8\xeb\x65\xc6\x41\x84\x80\x19\x43\x59\x49\x9f\x9b\xb0\x40\xb2\xe1\x3a\x86\x20\x4d\x52\xda\x68\xef\x8b\xdc\x31\x6a\x2f\xb7\x4b\x7f\x23\xa9\x09\x89\xdb\x6f\xfb\xb8\xba\xe2\x1d\x86\x20\x0b\x19\xcd\x1b\xd2\xd8\xea\xb9\x46\xc6\xd7\xcf\x42\x4e\x46\xe9\x7e\xf9\xec\x3a\x41\xc3\xee\x7c\x16\x83\x75\x08\x7f\xde\x21\x8e\x48\x43\x21\xc8\x44\x14\xb4\x17\xff\x7a\xd1\x55\xe9\xff\xc8\x63\xc3\x92\x69\x21\x8d\x8a\x98\x9f\xc5\x6b\x10\x08\x13\x99\xc4\x33\xe9\x9e\x6b\x9c\xa2\xfa\x20\x00\xb4\xec\x1d\x78\xcc\x9b\xcd\x5b\x7e\x38\xac\xa1\x75\x0a\xbe\x50\x5f\xd5\xdc\xc5\xaf\x92\xf4\x1f\x4c\x36\x99\x59\xcb\x4b\xcb\xfe\x7d\x8d\xf5\xa9\x2c\x6a\xdb\xc0\x3a\x5d\xdc\x0a\xd3\x2c\xf5\x1c\xf0\xc3\xac\xde\x07\x97\xd6\x22\x25\xf6\x54\x67\xa6\x08\x62\xf4\x08\xf5\xdb\xdf\x85\x22\x93\xcb\xa0\xb4\x79\x72\xaf\x30\x4f\x8d\x3f\xf3\xa9\x17\x08\x4c\xcc\x19\xb8\xee\x85\xaa\xc6\x4f\x71\x18\xed\x68\x8b\xae\xdf\x51\xd7\x99\x6d\x31\x1d\x84\xa9\x10\x06\x51\xa2\x7d\x06\xa6\xf5\x1d\x9b\x6a\xf2\x61\xc2\x40\x73\x6a\xce\xb9\xcd\x2f\xe6\xe0\x19\x1a\x21\x0c\x05\x5a\xc2\x67\xad\xef\x55\x39\x57\xc5\x84\x30\x8a\x03\x39\x88\x29\x97\x70\x38\x0c\xe6\xe7\xb8\xfe\x94\x5c\x89\xff\x5e\x47\x24\x10\x46\x22\x24\x9a\x8a\x9f\x16\x6b\x3a\xec\x62\xed\x46\xa0\x65\x61\xa7\x16\x9e\x6d\xb9\xa1\xf5\xe8\x49\x2a\xe3\xe8\xff\xfc\x38\xc9\xb8\x53\x52\x20\x56\xe6\xe1\xba\x0d\xe3\x38\x21\xac\xd5\x17\x42\x2f\x1d\x72\x05\x93\x4a\x14\x84\x49\xa0\x4d\xd0\x13\x21\x4d\x5e\x5a\x12\x71\x6a\x49\x79\xad\xa0\x68\x16\xe4\x5b\xfb\xa2\xe5\xf8\x15\x25\xc2\xf6\x7b\x7a\xe1\xeb\x27\x7c\x6f\xbe\x59\xa4\xac\x7f\x22\x96\xb2\xd4\xad\x52\xdb\xe4\xdd\xa7\xc9\xae\x96\x51\xc8\x54\x6c\x7b\xeb\xdc\xbc\xb8\xb9\x3c\x0f\x19\x09\xe7\x97\x67\x98\x71\x2b\xe4\xf0\xb0\xbc\x9d\xef\xba\xf9\x9b\x7f\xfd\x65\x00\x3c\xb2\xd5\xa9\x2b\x6c\xf3\xd3\x6c\x7b\x31\x84\x3c\x4c\x32\xee\xd7\x5a\xeb\x9c\x2e\xcf\xc7\x36\xcc\xc8\x7f\xa2\x27\xda\x9d\x3c\x1a\x8f\x24\x31\xf2\xb5\x7e\x1e\xb5\x35\xce\xae\xa6\x90\xa7\x2a\xf3\x94\xc6\xff\x74\x5f\x9a\x61\xa4\x18\xec\xcf\x21\x07\x24\x04\x0f\xb5\xd1\x8e\x67\x0a\x37\xc2\x58\xd4\x9a\xf3\x20\x9d\x43\x34\xff\x82\x20\x94\x54\x39\xfe\xcb\x2f\xdb\x1f\x79\x51\xd0\x3c\xf6\xac\x1f\x10\x02\xb7\x5c\x25\x32\xd7\x37\x43\x21\x8a\xff\xfd\xbf\xc9\xc5\x64\xa0\x48\x38\xd3\x35\x09\x39\x8a\xd8\xc9\x4b\x93\x89\xed\xbc\x7e\xc5\xe6\x78\x79\xc3\x4b\xae\x27\x13\x50\x8a\x94\xd8\x0c\xef\x72\x7d\x7e\x27\xc1\xc4\xbe\x3e\xf8\x0f\xcd\xd8\xf4\xbe\x34\x80\xc5\x0b\x9f\xeb\xd5\xf6\xab\x7f\x2e\xa5\x62\xe6\x59\x71\x6c\xa3\xc9\x1a\x8a\x2b\x36\x1b\x37\x18\x03\x20\xc2\x5c\x1b\xd5\x12\x1b\xf5\xf0\x83\x60\xaa\xe8\x27\xb0\xd0\xd7\xed\xf9\xed\x61\xa3\x9c\x1d\x5f\x1d\x4f\x87\xf2\x82\xf8\x4f\x7a\x3b\x21\x44\x11\x85\x96\x00\x94\x92\x53\x1f\x32\xd2\x4c\xef\x56\x58\x55\x11\x4a\x85\x3f\x9b\xdf\xb1\x28\x2e\x3d\x74\x0a\x42\x13\xab\xa8\x23\x04\xf2\xda\xc3\x93\x7b\x36\x5c\x44\x4e\x24\xc5\x41\x3c\x06\xc5\xc2\x29\x47\x0d\x44\x01\x4b\xa5\xdd\x06\xfe\x44\xd5\x38\xec\x85\x9f\x43\x51\x18\x59\xd0\x80\x9d\xaa\x50\x68\x5a\x83\x83\x7c\x34\x44\x91\xe6\xa1\x43\x8c\x2c\x57\xcf\xfe\xc4\x38\x8d\xb9\xab\xd0\xdf\xe5\x07\x7c\x28\xd5\xf8\x36\xa3\x38\x4b\x88\x3b\xaa\x0d\x3c\x7f\x74\xd5\xda\x0b\xf5\xed\xf8\x21\x22\xb6\x1c\x8a\xd5\xe5\xd4\xc0\xb9\x3a\x77\xb7\x95\xb0\x80\x48\x18\xa8\x83\xf7\xeb\x59\x8e\xa7\x62\x94\xa8\x94\x62\x49\xb5\x87\xaa\x21\xee\x4f\x7f\x62\x16\xd9\xfa\xfd\x06\x9b\x85\x3e\xe6\xc5\xe4\xc4\x8c\x71\x7a\xff\x4d\xf9\x75\x12\x26\x41\x94\x09\xcb\x1d\x4d\x49\xe0\x28\xd9\xfb\x4b\xf2\xd8\xf5\xaa\x93\x71\xb6\x0d\x04\xed\x4a\x24\xf7\x78\xf2\xd0\xd4\x33\xeb\xc5\x61\x17\xa7\x7c\xb2\xcf\x45\x02\x2d\xfd\x6d\xdd\xce\x47\x3c\x42\xd1\x77\x21\x6e\xcb\xe7\x2b\x46\x58\x88\x20\x0e\x62\xe1\x11\x24\xa7\xd6\x08\x60\xf5\x52\xe5\x7f\x61\xf7\xaa\x20\x49\x08\xc3\xbe\x23\x50\xd6\x61\xca\xa5\xee\x47\x31\xe6\x30\xb3\xed\xbc\x82\x06\x2b\x4b\x36\x94\x17\x8f\x50\xbd\xe6\xf3\x8c\xf8\x7e\x0b\x8b\x20\x63\x20\x06\x70\x59\x55\x6a\xac\xda\xa8\xf6\x11\xde\x37\xf9\x5f\x7e\x03\x8a\x64\x1c\x52\x9d\xeb\x26\x4a\x06\xd1\x1c\x44\x32\xe1\x96\x81\xd2\x73\x07\xd8\x04\x26\x75\xf2\xcf\x1b\xe7\x48\x2a\x15\x72\xdf\x6c\x3e\xa8\x80\x43\x24\x4d\xd4\xd1\x4a\xdb\x47\xb5\x89\xd0\xd9\xdd\x23\x52\x81\x55\x19\x69\xaf\x63\x13\xaf\x8f\xf0\x86\x95\xe7\xae\xfc\x7c\xbd\x46\x1a\x43\x62\x4a\x5e\xee\xf3\xd3\xb6\x42\xa8\xcf\x9d\xff\x10\x61\x1c\x92\x09\x50\x70\x72\x29\x9a\xee\x48\x02\x54\x34\xab\x20\xaf\x51\xfb\xc9\x0f\xdd\x24\x45\x0c\x28\x8a\xea\x16\x82\xc9\x42\xed\x9c\xde\xd5\x7f\xcf\xf9\xa9\x5d\xa2\xdb\x0a\xa8\x2b\xe1\x0e\xf1\x03\x05\x29\x88\x0c\xa6\x31\x38\xc2\x95\x47\xc8\x8b\xbe\x44\x08\x71\x20\x6d\x21\x70\xe7\x09\x82\x82\xdd\xce\x1f\x0b\x33\x45\x44\x33\x9b\xaf\x8b\x88\xa5\x5f\xa1\xde\xfb\xfc\x7b\x37\x02\x24\x3d\xb8\xb7\x30\xb6\x11\xba\xcb\x3d\x40\x1c\x31\x43\x97\xd8\xd5\x44\x7f\x49\xe0\x36\x2f\xdb\x4c\x91\x54\xc4\xfd\x48\x1d\x38\x71\xe7\x5c\xbd\x1d\xf0\xb6\xfc\x55\x50\x62\x0c\xeb\xb5\x03\x57\xf8\x1f\x8d\xa3\xc0\x6d\x91\xdd\xce\xd2\xa7\x20\x21\x8e\x39\x23\x48\x34\xe4\x95\xae\xca\xd3\xb6\x9c\x21\xe6\x1a\x7f\xbf\x38\x61\x56\xb3\x5c\x53\x1a\x65\xd6\xf7\x8c\x13\x85\x04\x7c\xd4\x56\x03\xd2\xed\xce\x1e\x18\x32\x6b\xfe\x63\x16\x5b\xed\xf6\xdf\x2b\x78\x43\xab\x95\x48\x28\xed\xee\xfd\xb1\xd8\x10\xb1\xc3\x36\x0a\x7a\x66\x35\x88\x59\x62\xe9\x46\x29\x5b\x4b\xde\xe4\xe4\xba\x28\xa9\x77\x27\xaf\x7f\xe4\xc5\xe6\x50\x5e\x75\x6c\xba\x71\xa9\x8a\xe9\xe3\xba\x94\xa7\x4d\x66\x7d\xb0\x63\xfd\xb3\xd8\x22\x4e\x31\xd0\x30\xa2\xf5\xf2\xe9\xcf\xc9\x38\x93\xf8\xee\xab\xc7\xbc\x68\xda\x57\xf6\x52\xb5\xce\x66\xcf\x41\x3b\xdb\x75\x0c\x71\x06\x48\xfb\xfa\x66\x5f\xfe\xda\x35\x7b\xdc\x15\x60\x21\xb5\xcf\x94\xad\xd9\x2d\xfc\x5b\xe2\x1c\x08\x21\xfc\xf8\xfd\xd1\xff\x49\x04\x60\x89\x93\x2a\xc4\xf6\xf3\xb8\x1a\x8a\x3b\x0a\x01\xa3\x14\x56\x7d\x96\x3d\x63\xf7\xf8\xc7\x21\x45\xea\x0e\xde\xfe\xf1\xe0\xcf\x92\x19\x26\x91\x2d\xca\x14\x1a\xaa\x6e\x1a\xaa\x20\x22\x97\x9c\x8c\xb8\x0d\xb5\xda\xe8\xd5\x12\xf0\xe4\xae\x04\x7e\x4d\x1b\x01\xb1\xe2\x96\xa3\x5e\x5f\x0a\x38\xe6\x6a\x89\x79\xdf\x43\x0f\xb1\xd6\x61\x6c\x7c\x1e\xbc\xac\x70\x50\x4f\x82\x18\x23\x16\x1a\x4b\x46\xfe\x33\x2f\x5e\x87\x14\xb4\x10\x9b\x28\xcd\x22\xcf\x1c\x59\x4f\x72\xa6\x10\x1b\xce\x2d\xa2\x89\x72\xa6\x5f\xac\x42\x91\xf7\x1b\x92\x60\x58\x56\x81\x24\xc8\xac\x52\x0d\x15\x85\x5c\x29\xd5\xeb\x34\x0e\x53\x8c\xe3\xd9\x91\x04\x52\x72\xd7\x53\xb2\x38\x1c\xb0\x7a\xcd\x71\xd0\x8d\x05\x49\x80\x96\x71\x9c\x30\x10\x1f\x2a\xde\x4e\x04\xd2\xff\x37\xfa\xbf\x7f\x4f\x45\xe0\x20\x09\xa3\x90\x2e\x45\x74\x06\xad\x55\x6b\xb0\x18\xa4\x1b\x92\x30\x31\xc6\x15\x06\x7b\xe2\x38\x5b\x63\xef\x86\xa4\x82\xb2\x82\xf5\x2f\x38\xdd\x5d\x53\x47\xff\xa3\x15\x32\xcf\xc3\x0d\x49\xa8\x59\xe0\xe5\xf1\x0f\xf9\xeb\x7e\xa6\x1a\x05\x49\x84\x9c\xa6\xeb\xe6\x7e\xf9\x87\xbf\xa9\x38\x8d\xb0\x23\x95\x68\xad\x60\x77\xc0\x80\x08\x06\xa5\xbb\x17\x92\x90\x86\xc3\x84\x79\xdb\x8d\x4e\x22\xab\x44\xe5\x84\xa6\x1f\x9e\x97\x3e\xab\xf8\x01\x4e\x7a\x72\x7a\x12\xc6\x56\x82\xb1\xb8\x39\x57\x05\xa5\x98\xfb\x9a\x20\x24\x49\x1a\x85\x2e\xcc\x7f\x82\x23\x2e\x0a\xbd\xb9\x1c\x65\x79\x98\x4b\x5d\x26\x2c\xe2\xc4\x5f\xa7\x07\x22\x99\xe3\xae\x4e\x48\x58\x6c\x1b\xbb\x7c\x20\x43\x3a\xbb\xe7\x43\x53\xe7\xaf\x53\x8b\xe5\x7d\xd6\x24\x95\x92\x1c\xc3\x36\x32\x1b\x48\x98\x8d\x9c\x92\x24\xd5\x16\x8c\xde\xce\xe4\xe9\x9a\x48\x52\x13\xa4\x56\x13\xfa\x69\xf9\xbc\xde\x2d\x9f\x9f\xbe\xaf\xd6\xdb\xd5\x7a\x77\xb7\x58\x6e\x9f\xd7\xff\xf1\x77\x97\x05\x60\xdc\xbc\x7e\x6a\xf6\x37\x97\x99\xdc\xe9\x20\x9c\x48\xb2\x40\x52\x33\xf2\x2b\x1c\x6d\x16\xc7\x37\x26\xfa\xe3\x29\x7a\x74\x35\xd9\x64\xe7\xdb\x8d\xe9\x67\x20\xe1\x21\xd0\x14\x5f\xac\x6f\xee\xb7\xeb\xc5\x97\xd5\x8c\x35\x49\x78\x96\x11\x5c\xb7\x71\x0d\xd1\x38\xd0\xe5\xc8\xb1\xbe\xcd\x6b\x79\xae\x88\x79\xd1\xff\x3a\x04\x09\xb4\x86\xeb\xf9\xc7\xd3\x6a\xbd\x5b\x3e\x2c\x7e\xdc\x2c\x96\xbf\xef\x6e\x17\x5b\x9f\xdc\x4d\xa4\x31\x92\x7b\x53\xe2\xb9\xd3\xc6\x6c\xfc\x6e\xa4\x0a\x32\xf0\xfd\x17\x37\x87\x36\x00\xf3\x07\x78\x14\x69\xef\x7f\x1d\xf3\x62\x22\xca\x34\x99\x6f\x4a\x59\x0c\xc9\xed\xb9\xd8\xe7\xde\xdc\x25\x9a\x23\x73\x0e\xe5\xcd\xe2\x5b\xe4\x18\x04\x67\x3d\xb8\x44\xa3\x66\x9d\xac\xd1\x8d\x2d\x54\x4d\xd6\x04\xa6\x82\x2c\xe0\xef\x17\x89\xd4\xc3\x99\x57\x14\x0d\xf5\x05\x94\x53\x93\x1f\x7b\x36\x1a\x48\x8c\x12\xca\x4e\x9e\xf2\xed\x7c\x1a\xaa\xe0\x01\x0b\x82\x80\x54\x6c\x7f\x6c\xfe\x18\x7a\xb1\x2c\x8c\x23\x02\x01\xc3\x51\xe6\xef\xdd\x1f\xb5\xd5\x91\xb1\x1e\xfd\x90\x61\xdc\xcf\x66\x16\x31\x1b\x09\xd5\x60\x90\xea\x33\xcf\x66\x0b\xf5\xdb\x84\xfa\x04\x58\x94\x81\x91\x3d\xd6\x6d\xd8\x79\x3d\x18\xa4\xc1\xd2\xdb\xe5\xba\x0d\x76\xef\xca\x8a\x28\x54\xe7\x9c\x7e\x16\xa1\xf2\x96\xd2\x12\xb4\x2f\xcb\xc2\xe4\xaf\xe7\x21\x6d\x30\xb0\x38\x0c\x42\xe6\x61\x2c\xd4\x89\xba\x68\xae\x35\x05\x80\xc5\xdc\xe6\x80\x15\x14\xab\xf7\xbc\xe9\x09\xd4\x80\xc5\xc6\x12\x1e\x92\x40\xe0\xe4\xbe\xbb\xd7\x90\xc4\x29\x75\xc4\x92\x70\xb4\xfb\x25\xdb\x98\x39\xfa\xde\x2c\x51\x9a\x22\xfa\x93\xa5\xb5\xa0\x0a\x02\xd1\xd0\x4e\xee\x27\xc1\x8c\xaa\x34\x7b\xa8\xf7\x8f\xa0\xf6\x79\xe1\xb7\x08\xc6\x54\x68\x9c\x45\xed\x32\x02\xfd\x89\x69\xcc\xa9\xe8\x79\xa2\x02\xb0\xed\xa8\xb6\xeb\xb4\xdd\xe6\x07\xd4\xab\xc0\x52\x88\x09\xf3\x79\x87\x48\xe9\x3d\xd4\x1f\x18\x5b\x37\x3e\x03\x61\x65\xdc\xee\x5f\x36\xa3\xb9\xc3\x83\x44\x7a\x7a\xe1\x1e\x1e\x38\x3e\x99\x0b\x43\x20\x11\x38\x37\xfb\xab\x4c\x23\xe3\xca\xb6\x91\x5b\xbe\xb1\x89\x95\x65\x22\x04\xea\x27\x39\x79\x4e\xc6\x5b\x68\x60\x4d\xbd\xb4\xf3\x89\x13\x26\xa2\x98\xd0\x08\x2e\x41\xfa\x72\x80\x62\xfa\x86\x45\xeb\x35\x79\x40\x96\x43\x42\x4b\x67\xd0\xfc\x90\x14\xa8\x08\x48\xa9\xfd\x29\xca\x6c\xfc\x5d\x65\x6c\x61\x71\x6d\xc4\xf0\x15\x2c\x7d\xd4\x44\xe0\x14\x98\xe2\x01\xe5\x90\x4b\x57\xa4\xdf\x11\x58\x82\x3c\xae\xc5\xb9\xf1\x96\x8e\xe9\x40\xa4\xd6\x4f\xb6\x41\xf3\x6c\x7e\x89\xe9\x38\x26\x22\xb5\xdf\x7f\x1f\x7d\x0b\xad\xed\xb2\x20\x30\xce\xa6\x29\x4f\xf7\xcb\xe7\x81\x2f\xc3\xd0\x51\x10\xd9\x66\x01\x9a\x0f\x03\xd1\x11\x3a\x4e\x25\x75\xa4\x4e\xf0\xb2\xb2\xb7\xe0\x0f\xf2\x94\x38\x30\x95\xa7\x92\xbf\xf4\x5d\x1c\xc0\x50\x22\xe5\xb9\x3b\xca\x48\x9c\xda\x5d\x86\x8a\x11\x18\xb9\xc0\xd7\x03\xaa\x66\x78\xf1\x34\x10\x92\xfa\x07\x3b\x86\xf4\xfb\x3e\x64\x4b\x43\xc7\xa9\x57\x63\xd3\x5e\xbe\xb9\xde\x52\xd2\x88\xc5\x14\xb6\xd0\xbb\x77\x13\xbf\x9e\x22\x1f\xaf\x89\x70\x20\x8d\xb8\xe5\xb4\xae\xf0\x27\x0e\x82\xe6\xd1\xae\x96\x46\x1c\xc3\xcc\x8b\x43\xd5\xfb\x7b\xfd\xbe\x98\x67\xbc\x80\x34\x56\x12\x02\x5f\x51\x6f\xa3\xd6\x9e\xe6\x71\x30\xc8\xa0\x05\x4f\xef\x1a\xa8\xa8\x63\xce\x7a\xb8\xad\x4f\x72\xc2\x42\x2f\xe1\x70\x90\x70\xcd\x73\xed\x4e\x4f\xb8\x24\x13\xef\xe3\xef\x8e\xdf\x17\xd2\x04\x34\x41\xa9\x8e\x16\xfe\xd2\xd1\x32\x40\x9a\xc8\x8c\xba\x73\x5d\x81\x73\xa7\x9d\xe8\x92\x9f\xf0\x29\x0b\x0c\xf5\xe1\x14\x67\xc7\xec\x61\x81\x20\xfd\xf1\x98\x19\x47\x93\x78\x18\xa6\xd1\x52\x96\xd9\x3c\xcd\xf2\xf9\xb6\x1b\xcb\x0d\x51\x18\xe8\xbc\x42\xd5\x94\x15\x31\x91\xf9\x63\xc6\x6a\xed\xe7\xf5\xe6\x52\x34\x7b\xac\xf3\xbf\x70\x44\x53\x0f\x69\x06\x11\xa9\x1c\x20\x05\xac\x03\x84\x26\xa4\x99\xb1\xd9\xb9\xd6\x77\xf8\x52\x16\x13\x0b\x98\xf2\x30\x41\xab\xda\x96\xd7\x79\x6d\x7a\xcb\x99\xf2\x34\xa5\x7c\xe0\xc9\x33\x55\x87\x11\x77\x6e\xd7\x78\x71\xa5\xc2\x20\xc1\xf9\x68\x1a\x8d\x98\x80\xdc\x00\xd0\x21\x01\x27\x8f\x96\xf3\xb0\x6e\x6e\xce\x97\x09\x88\x6c\xd6\xc3\x4e\xc1\xc4\xb1\xb4\xd1\x5c\x73\x85\x5c\x1d\x3f\x88\x8c\x6c\x72\xf3\x57\x9f\x63\xf9\x60\x60\x0c\x99\x03\x17\xe5\xaf\x85\x93\x5e\x9b\x1f\xaa\xd2\x84\x1c\xfc\x0e\x52\x90\xab\x2b\xe6\x53\xff\x4a\xce\x23\x0c\x5f\x5f\x6e\xef\x8c\x49\xaa\x32\x6e\xa3\x19\xba\x5a\x3b\x17\x1f\x5f\x7c\x12\x35\x55\x3a\x8a\x6d\x39\x9f\x40\x91\x83\x9d\xc8\x8f\xd0\x69\x4a\x50\x7c\x4b\x38\xff\x8f\x30\xaf\x90\x6a\xd0\xb1\xf2\x64\x63\x88\x74\xc1\x6a\xbe\x4e\xe9\xce\x40\x6e\x7b\xe5\xdb\xa9\x7c\xae\xb1\x81\x49\x12\x7c\xb8\x13\xa5\x26\x03\x24\x96\xd5\x5f\x08\x6f\xb6\x04\xd5\x87\xb9\x19\xe9\x63\xdb\x8a\xd8\xc7\x3d\x98\x90\x05\xa9\x15\xb2\x69\x97\xe0\x72\xdf\x17\x7f\xfc\x61\x83\x14\xf2\x7e\xf1\x5a\x06\x63\xce\x7b\xc8\x42\x69\x79\x4a\xb0\xd9\xaf\xce\xde\x06\x66\x71\x64\xbb\x0e\x97\x4b\x5b\x2a\x5a\x54\xd2\x1f\x4a\x20\xf3\x81\xcd\x0f\xcc\xef\xca\xea\x51\x4d\x52\x1b\x59\xa2\x91\x22\x34\xeb\xc6\x50\xba\xd7\x12\x94\x93\x11\xbe\x9d\xdf\xd7\x32\x16\x86\x54\x36\x3f\x0d\x68\x35\x86\xef\x2b\x63\xb1\x65\x3e\x24\x34\x45\x75\x28\x2b\x3d\x68\xcb\x58\x43\xa1\xcb\xe3\xe4\x46\x18\x40\x68\xfb\x14\x5b\x7b\x37\xd4\x88\xf6\x03\xa4\xad\x81\xbb\x5d\xe6\x6b\xa9\x0f\x3d\x24\x18\xb2\x34\x49\xbd\x04\x0e\x55\xc8\x3b\x96\xfd\x2b\x2c\x48\x96\xa6\x29\xb9\x6e\x6e\xbb\xf9\x72\x6e\x3f\xfb\xe8\xb7\x52\x8e\xb4\x21\xad\x96\xcf\x4f\xcf\x8f\xff\xd9\xdd\x3c\x3f\x6f\xb6\xbb\xed\x7a\x71\xbb\xea\x7e\x4f\xc4\xe4\x31\xd7\xa0\x27\x81\x58\x96\x62\xe6\xc9\xc2\x9f\x4a\xa7\x32\xf1\xc1\x2c\xcc\x32\xae\x08\x01\x48\xb8\xf2\x49\xfb\xea\x15\x92\x1c\x32\xce\x85\x4b\xa6\x37\x77\xe7\x82\x4a\x25\x9b\xfc\x7d\x26\x1c\xcf\x20\x51\xb4\x29\xef\xa8\x2e\xf7\x72\x4d\x84\xe6\xc7\x71\x4e\x0e\x43\x55\x1e\x28\x3b\xbe\xc1\x89\x20\x39\x64\xa0\x0d\xe9\x9c\x9c\x86\x5d\x2c\x90\xc9\x24\xa0\x62\x32\x75\x76\x7d\x4a\x2b\x08\x99\x64\x19\x15\xc4\x1f\x41\x97\xc6\x0c\xca\x3f\x99\x92\x31\x65\x59\x68\xef\xf6\x8b\x7d\xc4\x45\x03\x99\x86\x94\xc2\x5e\x79\xae\x0a\xdb\x2a\x47\xef\x74\xc4\x79\x3e\x7e\x2a\x2d\x99\x97\xb6\x58\xe3\xe4\xfb\xf0\x20\x4e\x29\x57\x4d\xac\x68\x70\x20\x87\xc6\xa2\xac\x47\xee\x27\x0f\x83\x90\xc3\xb0\x49\x60\x00\xc9\x03\x1e\x86\x19\x4d\x80\x0a\x89\x20\x61\x54\x7a\x19\x3f\x3d\x0f\x63\xa3\x99\x67\x2b\xb7\xfd\x94\x3b\x93\x5b\x8d\xd0\xaf\x79\xd1\xbc\x54\xf8\x73\xd1\xbc\xb4\xbb\x6f\xeb\x22\x0f\x9f\x84\x87\x22\xd1\x0e\x13\xfc\x1d\xab\x9a\xf4\x34\xda\x40\xe5\x33\xb6\x43\xe0\xa1\x64\x84\xa5\x54\xb6\xa2\xf6\x88\xaf\xe0\xc9\x69\x46\x2f\x8a\x47\x4c\x49\xa7\x30\xe3\xfd\xb6\xd9\x79\xc2\x59\x68\x8c\x1c\xd6\x33\x6e\x73\x85\xb6\x38\xf3\xa9\x3c\x0a\x70\x96\xb1\xd4\x7e\x3d\x27\x69\xec\x73\x70\xf3\xdf\x8e\x33\x1d\x19\xe8\x58\x69\xda\x28\xee\xdb\x69\xf2\x05\xd3\x90\xc7\x4e\x0b\xe0\xeb\x49\xb6\x3e\xc4\x54\x0d\xe8\x23\x2a\x04\xe0\x29\x4b\x88\x8d\x71\x55\xe8\xd4\x7f\xcb\x54\x89\xd0\xd3\xb0\x43\x83\xf7\xaa\x6c\x3f\x0d\xa5\xec\x6f\x2e\xb7\x57\xb6\x88\x67\x01\xb3\xc4\x07\xc4\x56\xeb\x48\x46\xfd\x31\x65\x83\x8c\x57\xaf\xc2\xf0\x90\xd7\xcd\x50\x2f\x00\x38\x8f\x03\x42\x35\x51\x43\x22\x1c\x76\xb6\x3b\x72\x77\xbc\xec\x70\x10\x89\x71\x2e\x2d\x73\xfe\x57\x38\x94\xf1\xed\x66\x5f\xe5\xc7\x93\x93\x7b\x1b\xbf\x0e\x21\x63\xcb\x9d\xed\x22\xa4\x5b\x54\xf9\x11\x0e\xf5\xa4\xad\xb4\xdf\xa2\x39\xa8\xc0\x25\x34\x5a\x7f\xdf\xff\xa0\x0c\x41\x98\x9e\x8d\x6c\x5b\x4e\x22\x3f\x3f\x8c\x31\x0b\xca\xaa\x7f\xe4\x07\xbd\x84\x4a\xdb\xe6\x0b\x7d\x57\x56\x4b\x68\xf0\xb5\xac\xc6\x40\x00\x2e\xa5\xb4\xc5\x4b\xdf\xa5\xe9\xe0\xd2\xe3\xdc\xe8\xf0\x06\xa5\xb4\x4a\xf6\x44\x30\xbd\x4b\xfc\x1d\x2a\xd0\x44\xb3\x72\xcc\x5f\x2b\x68\x5a\xef\x70\xf2\x2a\x94\x61\x59\xd8\x25\x86\x5d\x6f\xc8\x8c\x0e\x06\x70\xcd\x38\x39\x73\x04\xdf\x7d\xda\xdc\xfd\x98\x7c\x63\x9d\x2a\x1c\x36\x8e\x59\x7e\x83\xae\xcd\xd0\xdf\x91\xd6\x99\x30\x5e\x68\xa0\x26\x8a\x77\x24\x37\xfd\x23\xd8\x11\x47\xa1\x53\x57\x80\x6f\x26\xc0\xb9\x6e\xfd\xa2\xb1\xbc\x84\x5f\x6e\x5e\xc6\xb7\x25\x02\xb0\x4c\xf5\xf8\x8e\xc7\x53\xd3\x9a\x40\x02\x62\x8e\x9e\x4d\x84\x2c\xa5\x64\xc0\x43\xf9\xba\xd0\xfa\xba\xe8\x22\x42\x64\x28\x3a\x76\x94\x3b\x90\x55\xae\xe6\x8d\x97\x88\xa5\xc9\x2c\x62\xe1\xe0\x25\x6e\x3e\x1a\xa9\x14\x77\x5a\xe0\x1f\x8b\x1a\x83\x88\x4d\x68\x09\xfe\x7c\x58\x7f\x3c\x41\x31\x56\x1d\x02\x91\x24\xdc\x22\xec\x49\x75\x3a\x7f\xbd\xeb\x9b\x7e\x41\x24\xca\x2a\x7a\xbb\x66\x5d\xeb\x32\x6c\x1a\x78\xb3\x81\x8d\xc3\x8f\xda\x2a\x40\xff\xcf\x30\xb7\x39\xfa\xaf\x1e\x38\xfd\xef\xeb\x13\xfb\xfb\x66\xa8\xa9\xd2\xfb\xbc\xfd\xba\x5a\x2f\xd7\xdf\xee\x37\xab\xf5\xee\x6e\xfb\xb0\xdb\xbc\xac\x56\x3e\xc0\x11\x69\x10\x91\x68\x13\x36\xfb\x6f\xb5\xee\xfe\x2a\x2c\x8a\xcd\x99\xbe\xd6\xcc\xc3\xe1\xb1\xd4\x78\xb0\xb9\x5e\x37\x2c\x63\x61\xe4\x2a\xb7\x5f\xe0\xd8\xa1\xe7\x41\x64\x02\xa8\x5f\xed\xa1\x54\x6f\x3e\x0f\x32\x53\x3b\x17\x99\xe4\xe4\xb8\x58\x71\x98\xf6\xc3\xdf\x0e\xf2\xd4\xfe\x6a\x3c\x4e\xd8\x98\x3c\xf2\x31\x2f\x5a\x77\xb3\x78\x45\x1f\x30\x0a\x11\x59\x11\x59\x27\x79\x72\x83\x1f\xec\x0c\x42\x64\xa1\x40\x8f\x21\x1c\x14\x54\x85\xe0\x10\x08\xff\x33\xeb\xf2\x02\x07\x4f\x3a\x02\x42\x48\x1b\x5d\x9f\xc8\x67\xb5\x07\xf3\x2e\xc7\x22\x84\x0e\xc9\xa3\x3e\x17\x75\xeb\x44\x35\x90\x97\x93\x27\x85\x44\x50\x7f\x84\xab\xbe\x5c\xd9\xfb\xf1\x86\x28\x00\x18\x71\x7a\x38\xef\x71\x04\xf1\x15\x32\x90\x1e\xd8\xd1\x2b\xf2\x83\x90\x32\xe8\x8b\x62\xfe\xad\xbb\xd5\x3f\xbe\x19\xd5\xae\x4a\x47\xff\x03\x35\x8e\xfc\xb1\xff\x8d\x82\x79\x00\xd5\xf5\x9b\x54\x51\x16\xf5\x94\x91\x93\xe6\xaa\xc9\x2f\xc6\x56\x24\xea\xe8\x4a\xe0\x5d\x1f\xb0\x3f\xce\x6d\xc9\xf2\x08\xef\xf9\xf1\xec\x4b\x7a\x9e\x0d\xa2\x1b\x65\x40\xb9\xee\xa4\x97\xb2\xee\x22\x7a\xa1\xa3\x4c\xf7\x5c\x57\xae\x66\x6d\x8b\x81\x96\x78\xf2\x5f\xf3\xb4\x36\x93\xe7\xd1\x4c\x51\x50\xf6\xb2\x7c\x79\xf1\x97\xc6\x20\x56\xae\x7e\x4f\xca\x3c\x37\x68\xca\xea\x4a\x28\xcd\x0f\x4e\xa2\x01\xe1\xe1\x63\xf7\x74\x98\x31\xb0\xfd\x37\xef\x37\x65\x55\x95\xbf\xe6\xd2\xf9\x02\x85\xcd\x53\xff\x75\x28\x9b\xda\xbb\x3f\xee\x98\x89\x34\x05\x74\xb5\xe3\xa7\x5f\x76\xb9\x8b\xe4\xdf\x63\x15\xa9\xf1\x1d\x19\x91\x51\xe5\xdc\xcd\x23\x7a\xf5\xd0\xcd\x6a\x63\x2c\x93\xb9\xca\x2b\x72\x92\x5a\x7b\x04\x9e\xec\x0a\x20\x08\x14\x09\x5f\x93\x42\xdb\x6f\xa5\x9c\x87\xa5\x41\x10\xdb\xb7\xef\xd1\xdd\x7a\x18\x25\x4f\xcb\x3e\x10\xa2\x4c\xfa\x6f\xb5\xd0\x7f\x9e\x75\xae\xfa\x1e\x1e\x80\x28\x06\x16\x8d\xd2\xf5\x37\xf7\x0f\x0f\xf3\xc6\x19\x62\xc1\xa8\x5d\xfa\xcb\x6a\xfd\xcf\xe0\x6e\xe3\x9b\x89\x75\x64\xc9\x0e\xfd\xad\xdb\x0f\x73\x33\xc1\x5d\x43\x92\x64\x9e\xaf\x8f\x14\x27\x67\x89\x2b\x00\x12\x16\xd2\x36\x65\x33\x09\x5e\x7e\x7c\x8d\xa7\xf3\x8c\xa8\x30\xf7\x27\x29\x0e\xae\xc5\x73\x5b\x3e\xc2\x3c\xed\x09\x00\x93\x82\xbe\xe4\x43\xf9\xfa\x82\x55\x5d\x16\x4f\x78\xcd\xde\x30\x3e\x25\x0d\xd1\xab\x0d\xfa\xc4\x5c\xeb\x2e\x8e\xd4\xa0\x00\xd2\xd8\x9a\x9a\x76\x49\x3e\x42\x51\x6f\x7e\xe5\x03\xdf\x74\x3e\x7f\x01\x69\xeb\x92\x79\x3f\xbc\xa7\xa9\xe8\xae\x29\x6d\x76\xbf\x22\x91\xa0\xbb\x1c\x9c\x6e\xa7\xba\xac\x09\x70\x33\x99\x41\xa9\x32\x14\x9a\x9d\xc6\xcc\x97\xe3\x41\x59\x64\x01\x67\x87\xbc\x78\xdb\x42\xfd\x66\xc5\x62\xe6\xf7\x76\xc8\x32\x9b\x5f\x39\xd9\xcc\xdb\x78\x0f\x72\x63\x78\x1c\x46\x16\x58\xd7\xad\xe8\xbf\x99\x2e\x3c\x8d\xb9\x7b\xa1\x8f\x79\xf1\x84\xef\xcd\x0d\x8e\xe8\x33\x01\x38\x58\xda\x3d\x37\x05\x46\xa2\x54\xd3\x22\x2a\x70\x8c\x08\xb7\x6c\x2a\xc4\xbf\xbc\xb2\x18\x45\x9b\xf3\x6f\x5d\x24\x40\xa9\x77\x87\xc1\xb6\xe2\x9a\xdf\xcb\x06\x89\x80\xc6\x66\x61\x5a\x87\xa2\xe7\xa3\x04\x10\x19\x50\xaa\x0e\x5e\x2b\xc4\x27\x7c\x9d\x23\x51\x6c\x47\x21\xb9\x01\x37\x37\xcb\x97\x2a\x3f\xe2\xea\xbd\x3f\xdf\x32\x4b\xd3\x76\x59\x11\xcb\x61\xbf\x79\x8d\x5f\x0f\x44\x8c\xd2\xdb\xd6\x7a\x2f\xe1\x74\x1a\x10\xd4\xdc\x1f\x4f\x87\xbf\x5b\x95\x93\x9b\x02\x15\xd2\x94\x77\x32\x8d\xc4\x26\x7a\xfa\xb6\xf1\xbe\x0b\xc8\x90\x47\x0e\x1d\xd2\xe0\xaa\xd0\xb7\x83\xc7\x96\x11\xa3\x7e\xb7\xbc\x5e\xa3\xc6\xa2\xb4\x0c\x02\xba\x3b\x9c\xd8\x9d\xe4\x58\x36\xdd\xdf\x14\x07\x8a\xb4\xee\x97\xcf\xb6\xed\x7d\xd0\xbd\x0b\xa0\x83\x84\x12\x0f\xa0\xb5\x23\x47\x1e\x54\x89\xe6\xef\x5f\xb3\x80\xb2\x1f\xe7\x1a\x2b\x82\x92\xcc\x74\x24\x02\xe8\x4c\x59\xd1\x5c\x1f\xa9\xbe\x3c\x2e\xc8\x4f\xce\x61\x3e\x5b\x05\x98\x58\xb9\xe0\x53\xd9\x40\x53\x5a\xae\xa9\x61\x23\x00\x20\x4f\x28\xde\xd3\xe5\x4b\x85\xfd\x6d\x76\xcb\x13\x55\x24\x6d\x77\x6a\xeb\xd3\xbe\x92\xe1\x3f\xe4\x75\x33\x61\xfa\x05\x19\x84\x01\x39\x55\x7f\x96\x79\xe1\x49\x41\x66\x9f\x55\x06\x91\xc5\x10\x58\x3a\x25\x97\x10\x71\xac\x52\x20\x03\x4c\x32\xaf\x00\xb3\x2f\xab\x2e\x77\x30\x90\x1e\x03\x19\x26\x96\xf0\xb8\xbd\xeb\xf2\xfd\xe2\x96\xc3\x50\xad\x7a\xd6\x30\xc8\x10\x6c\x78\xfa\xdb\xb9\x78\x3d\xe0\x46\x55\x14\x5b\xfb\x83\x52\xb3\x2e\xb3\x62\x55\x84\xfc\xa1\xc8\x58\x8d\xbb\x0a\x41\xef\xce\x69\xb2\x03\x6a\xf5\x75\x47\xe3\xc0\x16\x20\x64\x29\x1f\xe1\x0d\xeb\x55\xb3\xf7\x19\x87\x69\xa6\xd9\xcb\x40\x9f\x89\xe0\xd4\x9f\x1f\x42\x4a\x55\xe0\x0a\x7e\xb9\xee\xb4\xb9\x8f\x29\x63\x16\x07\x91\xc7\x1b\x97\xe6\xeb\xf9\x08\x45\xc7\x76\x07\x32\x06\x9b\x44\x75\xa1\xbb\x55\xc9\x1a\x04\x74\x32\xd6\xa8\x7b\x3d\x3e\x4f\x2b\x36\x17\x42\xca\xd8\x48\xaa\x5e\xde\x7c\x71\xbc\x0e\xfe\x1a\x49\xc6\xac\x9c\x51\x5e\xd5\xcd\x2d\x5c\x96\x9e\x11\x09\x64\x62\x42\xdf\xe3\x4d\x75\xda\x59\x73\x2b\x59\x20\x48\x4f\x6a\x47\x7a\x9e\x76\x1a\x2f\x2c\x06\x70\x72\x0f\x8c\x6b\x6a\xfa\x20\x27\xdb\x62\x26\xbe\xc2\xcf\x9f\x58\xd4\xbb\x43\x7e\xcc\x1b\xd4\x9b\xb3\x07\x5d\x4a\x26\x18\xa5\x65\xa9\x0c\x78\xbf\x7c\x26\xce\xab\xb4\x3b\xaa\x03\xea\xdf\x5e\xae\x9f\x7f\xdc\x6e\x16\x0f\xab\xdd\xe3\xe2\x8f\xdd\x62\xe9\x55\x0c\x41\xa6\x3c\xa0\x14\xb5\x82\x6a\x0b\xef\xf9\x84\x2c\x0b\x64\x8a\x92\x5a\x25\xb6\x20\xa5\x77\xa3\x65\x96\x06\x84\xd8\x9c\x2d\x8a\xcc\x15\xf1\x65\x66\x6c\x3f\xb2\x2e\xc9\xc6\x8c\xb2\xe0\x92\x87\x51\xe2\xfa\xee\x47\xcc\x45\x33\x60\x1d\xc9\x23\xdb\xa3\x4f\x1e\x3c\xc8\x83\x03\xe1\x76\x97\x12\x51\x42\x0c\x8a\x8b\x21\xd5\xbd\x3f\x2a\xa2\x80\xac\xa1\xa9\xca\xbf\xf0\x43\x4e\xd7\x99\x02\x88\x14\x5c\x92\x88\xd0\x6d\x05\xaf\x65\xe1\xdc\xe7\xae\xb1\x77\xf2\x01\x85\x94\xd1\x80\x1c\xb7\xe7\x59\x73\xc7\x01\xc0\x4a\x2a\x15\xb9\x2a\x2b\x4b\xbc\x35\xce\x8f\x4a\x50\x8a\xe2\x17\x12\x86\xdb\x6c\x17\xeb\xed\x4e\xf8\x63\x32\xce\x74\xdf\x2c\xf0\x65\x00\x9c\x70\x03\x54\x1c\xc7\x7d\x6e\xe6\xf3\xbc\xa2\x54\x2c\x22\xd4\x6e\x3b\x3b\xa2\xdd\xba\x47\xd9\x48\xa5\x92\x70\xc0\x9f\x0d\xf5\x34\xb7\x31\x81\x67\xa5\xc9\x3f\xf8\xc7\x5d\x5b\x67\x59\xc4\x3b\xfc\x65\xeb\xab\xd8\x9d\x64\x6c\xb6\x50\x83\x8c\x3a\xbc\xc1\x76\x8f\xc3\x9c\x81\x34\x60\xc8\xa8\xed\x7b\x01\xd8\xb8\x3b\xa6\x18\x59\x65\x97\xc6\xba\x45\x79\xc5\x16\x6e\x47\xaa\x20\x91\x04\x98\xb7\x23\x1f\xbf\x6d\x96\xf3\xe6\x5b\x05\x8e\x44\x48\x97\xdb\xfc\x88\xe5\xb9\xb9\x2b\x2b\x92\xaa\x81\xbc\x80\x09\x33\x0f\xa8\x30\x11\x71\x97\x20\x0e\x5c\x57\xf2\xf3\x09\x8b\x9e\x81\x71\x47\xc7\x8e\xd8\xec\xcb\xee\xa1\x54\xa8\x80\x6a\xca\x24\x67\x6a\x23\x92\x99\x96\x0f\x15\x05\x99\x15\x54\xb6\x36\xa2\xae\x47\x2b\x4a\x45\x2c\x8a\x5d\x5d\x2a\x3f\x7a\x35\x89\xee\x60\x8a\x84\x33\xd5\xf8\xf3\x8c\x87\x9f\xb8\x2d\x35\xd4\xab\x42\x9d\xb1\x6e\xa0\x1b\x15\x87\xe8\x55\x9d\x09\x04\xd6\x86\x9a\x6d\xd8\x3e\xe1\x01\x04\x15\xa7\x96\x67\xad\x46\x92\x33\xf9\x58\x9a\x09\x54\xcc\x63\xa6\xbb\x08\xdf\xaf\xbf\x5e\x45\x71\xce\xa1\xfe\xa0\xbe\xaa\x92\x24\xe0\x2e\x40\xff\x0a\x95\x5e\xc2\xc9\xcb\x09\x8f\xdf\x54\xc2\x03\x82\xe1\xd6\x87\x61\x04\x7f\x15\xbf\xfb\xd1\x42\x52\x26\x6b\xf9\xbc\x5e\xed\xb6\xab\xc5\xa3\x63\xa4\xf6\x6f\x85\xa9\x84\xf8\x7b\x9e\xcf\xd3\x0f\xce\x50\x51\x4e\xfc\x5b\xdd\x9b\x85\x99\x45\x32\x92\x5f\x00\xc5\x0c\xb7\x14\xd4\x8e\x86\xa6\xb3\x15\xfd\x85\xb3\x28\x23\xe6\x89\xe6\xad\xfb\xbc\x59\x06\xda\x3a\x27\x76\x7b\x18\xe0\xcb\x55\x06\xb6\xff\xf5\xdb\xf6\xe6\xef\x74\xba\x40\x65\x52\x18\xdb\x05\x0e\x94\x87\xf6\x17\xe1\x81\xc5\xd7\x3a\xfc\xe4\x38\x93\xa7\x78\x22\xa8\x80\x71\xc8\x1d\x0d\x73\x3d\xec\x2d\x07\x62\xde\x4b\x7d\xb8\xd6\x63\x33\xe7\x97\x95\x48\x22\x70\x78\x8b\x7b\x8d\x45\x43\xe4\x63\x5e\x1b\xe2\x83\x53\x50\x04\xc6\x79\x25\x0f\xb9\xaf\x8d\x2a\x48\x43\xe6\x30\xdd\xc3\xca\x08\xff\xdf\xc4\xcf\x3f\x19\x30\x72\xf4\x9b\xf2\xf5\xd5\x26\x58\xfc\xb9\x32\xcd\x78\x36\x48\x8f\xbc\x0e\x1b\xef\x3f\x4d\x89\x28\x09\x91\x15\x8d\x83\xe2\xf9\x27\x56\x55\xae\xaf\x27\xf2\xfc\x73\x48\xcd\x29\x23\x4e\xbe\x9c\xe3\xc7\x9d\x2c\x2e\x85\x71\xea\x42\x8b\x55\xa1\xcb\x5f\xad\x73\x35\x2e\xae\x2b\x74\x19\x46\x4a\x41\xdc\x94\xed\x5a\xb0\x7d\x0e\xd7\xdb\x98\x42\x1e\x13\x8f\x94\x23\xb1\x75\xc5\x1e\x7f\x10\x63\x2f\xb0\x7b\x77\x6e\xd7\x23\x2d\xd0\x51\x24\xac\x4c\x90\x52\x1b\xd5\x4f\xcb\x94\x87\xf3\x51\xbe\x32\x8e\xd3\x81\x90\x31\x3b\x0d\x0d\x4c\xa6\x90\x89\x53\xca\x19\x99\x01\xe6\x61\xfe\xf5\x1a\x34\x88\x2e\xd7\xf1\x52\x95\xa6\x47\xa9\xe8\x90\x33\xa2\xd9\xa0\x3e\x6f\xac\x6a\x8b\x37\x1f\x59\x42\x1d\x45\x48\x90\x35\x05\x45\x59\xe4\x7f\xa1\x7e\x79\x58\xae\xfd\xc1\x98\xd9\x10\xbd\xa0\xe9\xeb\xeb\xba\x2e\x1a\xe8\x22\x21\xcd\x58\x20\x95\xb3\xe5\x0b\x59\x3f\xc2\x7b\x7f\x04\x80\x75\x22\x05\x94\x3e\x52\x7b\x3c\x1c\xf2\xe2\x75\xc6\x6a\x6b\xa6\x20\xeb\xb3\x81\x7f\x3c\x3e\xfc\x87\xfa\xee\xfe\x35\x84\xaa\x8f\x1f\x5f\xa7\x89\x26\xfc\x8f\xcd\xac\xbf\xe4\x13\x66\x2f\xd0\xa9\x84\x24\xf3\x7d\x86\xd5\xa0\x6c\xa5\xb3\x20\x54\x6e\xf7\xdc\x76\x9c\x3e\xa0\xb3\x24\xa3\x86\x81\x36\x86\x9b\x00\xf0\x74\xa6\x02\x4f\xa2\xf6\xad\xc6\xca\x31\xea\x74\x57\xe4\x51\x98\x0c\x12\xc8\xd3\xe6\x4a\xcd\xb3\xd0\x02\x17\x5a\x2f\xf2\x47\xde\xec\xbf\x4d\xc1\x17\xf3\x2b\x41\x73\x1e\x50\xc7\x29\xf5\x49\x59\x4c\xd4\x95\xa7\x71\x85\xb1\xd7\x82\x09\xba\x9d\x5f\x47\xd7\xfa\xe5\x61\x3e\x5d\xdb\x8e\x16\x0a\xc2\x60\xce\x15\xfb\xe0\x75\x43\x60\x98\xc3\x1c\x6c\xdf\xa6\x1c\x16\xb3\x8e\xbd\x86\x4c\x62\x8f\x8d\xf9\xee\xe8\x13\x27\x5f\x09\x34\xf0\x6c\x54\x94\xad\xbf\xe2\x61\xfa\xfe\x24\xe3\xa1\x6f\x47\xb2\x82\xa9\xeb\xfb\x9b\x09\x19\x0e\x68\x99\x6a\x92\xc1\x3d\x17\x36\x29\xf2\xc1\x7d\xa9\x20\x22\x26\x64\xc7\x31\xdc\xa1\x88\x17\x5a\xe7\x43\xba\xe8\x6e\xb8\xf2\xfb\xfd\x42\xdb\xfc\x24\x81\x6d\xb0\xe9\x5b\x12\xb4\x92\x56\xb0\x90\xcc\x51\x53\x5d\xc6\xb4\xc7\xa3\x82\x97\x56\x26\xc9\x2c\x38\x39\x7f\xcb\xdf\x74\xae\x3b\x6b\xab\xb5\x62\x49\xe0\x0b\x75\xc3\x30\x4b\x6b\x57\x70\xb2\xd5\x8e\x36\xc6\xbf\x3d\x37\x6a\xef\x73\xd4\x6e\x14\xc6\x86\x46\x3d\xa1\x6a\xa0\x5a\xee\xf3\x02\xba\x43\x99\xf2\x15\xfe\xc7\xcb\x72\x8f\x13\x7d\x00\xd0\x28\x54\x0c\x5d\x9d\xec\x05\xea\x7a\x1e\xb1\xad\x4d\x24\xa2\x9e\x8c\xe4\xf7\xbc\x69\x5a\xe7\x2d\x2f\xea\x35\x1e\x6d\x53\xdb\xb6\xbc\x6d\xa3\x37\x3f\x1e\x8c\xee\xc7\xdb\xb4\x6c\xaf\x14\xf9\x99\xda\x11\x60\x18\x6a\x72\x8c\xca\x11\x9f\xcf\x07\xa9\x9f\xe9\xb9\x99\x08\x32\x8f\x7c\xae\xeb\xe5\x75\xda\x1c\xa3\x58\x43\xe4\x98\xa7\x76\x14\x39\xed\x10\xaa\xf6\x11\xea\xab\x91\xc6\xab\x97\x77\x72\x19\x83\x02\x0a\x46\x59\x00\x94\x4c\x1e\x7e\x35\x8c\xb8\xc5\xfc\x5a\x3d\x9b\xc5\xeb\xc4\x8f\xc7\x24\x45\x42\x6c\x5a\xad\x82\x5b\x38\x9d\x6e\xca\xf2\x6d\x36\xcd\x86\x89\x0a\xa8\xde\xf5\x33\xc7\x5f\xa7\x01\x1a\x10\x99\xb0\x2a\x72\x7b\x1b\x0b\x7b\xde\x08\x72\x4b\x8f\xf9\x14\xf6\x8b\x4c\x46\x24\x07\x8f\x65\xfd\x92\xff\xf5\x17\x6c\x5a\xff\x6f\x03\xa6\xbf\x9e\xb6\x93\xc8\x5a\xd6\x35\x9a\xd1\x2a\xc3\x34\x8c\xbd\x06\xf3\x23\xbc\xdf\x9c\xeb\xbc\xa0\x2e\xbd\x17\xac\x96\x79\x73\x99\xfc\x5a\x1a\x0b\xf2\x46\x7f\x40\x05\x03\x2c\x0c\x66\x60\x95\x4b\x2a\xfc\x59\xbe\xe1\x15\x5b\x09\xf2\x30\xb1\x45\x2c\x8a\xe5\x4a\x63\x3a\x3b\x8d\x3c\xd2\x86\xba\xf0\xab\xbc\xc6\x1f\x50\x55\x79\x79\xdd\x1d\x37\xbe\x0b\x0e\x96\x6f\xc8\x4e\xc1\xd6\x44\x7b\xe0\x5f\xbb\xc1\x8c\xff\xc7\x9f\xa2\x01\xdd\x7a\xa1\x1d\xab\xf5\x9c\x5e\xa6\x98\x12\x14\x2a\xf1\xa2\x1a\x0f\x79\x81\xb7\xd0\x40\x34\x19\x02\x4c\x10\x90\xfd\xd0\x28\xff\x04\x20\x22\x52\x9d\x7b\xc8\x8b\xd7\xff\x8c\x48\xe5\xdb\x63\x22\x60\x24\xa4\xdb\x54\xe7\xba\xf9\x9c\x86\x61\xfc\x4b\x32\x61\x54\x4c\xd9\x12\xb4\x62\x74\x55\xa9\x43\x25\x5d\x4a\xd3\x9c\x0b\x4b\x57\x36\x7e\xe3\xd2\x44\x61\xdf\x21\x48\x62\x84\x33\x3d\xd6\x28\x8d\x0e\xfb\xad\xfa\x2e\x3f\xe0\x10\x07\x8b\x2a\xb4\xbd\xae\x0a\x8a\x6f\x45\xbd\xc7\xc3\x64\xf6\xa8\x28\xb2\x9c\xce\xbe\xc4\x33\x49\x0d\xfa\x61\x2c\xa3\xf7\xfa\x84\x63\xdd\xfd\x0f\x96\xba\x4a\x23\xdf\x70\xf2\xed\x7e\x4a\xd1\x81\x3a\xce\xa8\x00\x76\x84\xe2\x6c\xfb\xa2\x5b\xc7\x8a\x90\xdf\xde\xe6\xc3\xe1\xb9\xe8\x72\xa0\xa8\x13\x43\xb1\x66\x0d\x06\x9b\x8b\xe5\xb5\x19\xff\x20\x86\x92\x1c\x24\x97\xa8\xba\xc1\xd7\x57\xa8\xea\x65\x79\x3c\x9e\x07\x19\x38\x44\x91\x10\x52\xcf\xc6\xb2\x61\xf7\x67\x14\x84\x84\xcb\x0b\x75\x97\xbf\xee\x5b\xf3\x34\xb5\x0c\x26\x4a\x3a\xef\xe5\x8a\x0d\x1a\xd0\x24\x49\xa6\x7a\xa5\x2d\xda\xbf\x47\xc1\x2c\x9a\x4c\x23\xc5\x1a\x3f\xa1\x81\x6e\xed\x18\xcd\x45\xbb\x76\xee\xda\x0d\xb2\x87\x75\x9a\x20\xb5\x50\x0b\x2f\x9a\x8c\xbf\xe6\x42\x5a\x13\x68\x2b\x68\x4e\x4d\xf4\x84\x3d\xbc\x42\x3e\xf8\x98\xd6\x04\x18\x52\xb3\xfc\xe3\xe5\x47\x7e\x38\x8c\xab\x6b\x1f\x62\x6b\xfd\xb9\x26\x60\x71\xef\x8e\x3f\x96\x3f\xf1\x9a\x21\x0d\x4c\x18\xc5\xc4\x26\x44\x44\x9a\x83\xc2\x85\x09\x93\x34\x70\x28\xd5\x0d\x36\x1d\xa9\xe0\x50\xfb\x02\x4c\xa8\x0c\xb1\xf6\x38\x21\xf6\xda\xe6\x3d\xfd\x47\x32\x11\x4b\x09\x0c\xf2\xf5\xfc\xfa\x08\xcd\xbe\x3c\x77\x07\x0c\x8f\x3a\x76\x93\x73\xd1\x60\xe5\x5b\xfa\xfc\xcb\x37\x5e\x2d\xc6\x16\x73\xe7\xf7\x36\x13\x6b\x46\xdd\x02\xcb\x1f\x4b\xf3\x01\xd6\x7d\xe8\xd5\x99\x18\x85\xce\xfc\xd3\x3e\x3c\x6f\xfd\x8f\x25\x81\xcc\x32\xaf\xe1\xf1\x52\xa1\x4f\x76\x76\xc7\x95\x16\x83\x9e\xc0\x71\x42\xcd\x30\x93\x49\x98\x10\xd2\x11\x51\x4e\xff\x9a\xd3\x38\x8e\x1d\xbb\xe2\x97\xf2\xa0\xdb\x6d\x6f\x83\x55\x0e\x13\x40\x92\xc9\x62\xe3\x5b\x60\x1f\x6d\x7e\x65\x48\xe9\x75\x95\x61\x32\x59\x66\x28\x57\x33\x71\xb6\x0d\x8f\x80\x5e\x8c\x07\xce\x77\x7f\x4f\x03\x22\x0d\xf8\xfe\xb2\x1a\xe5\xa0\x0d\x77\xb2\x01\xad\xe9\x7a\x3c\x7b\x58\x87\x11\x2c\x20\x1f\xf7\x81\x00\x8f\x93\x1d\xdd\x08\x93\x72\x4f\xa9\xfa\xee\x7c\xcf\xc7\xe5\x8f\xb1\xed\x30\xc2\x08\xf2\xdc\xb7\x7b\xdc\xa8\xfd\x11\xd5\x5b\x97\x02\x36\xc0\x82\xd8\xd6\x89\x9c\x9c\xce\xb4\x06\x62\x80\x49\xaa\x24\x1d\x73\x5b\x10\xf2\x45\x0d\x23\x93\x80\xbc\xb1\x17\x2c\x5a\x0f\xbc\x7b\x74\xc9\x92\x40\x0d\x9a\x45\x47\xda\x17\xa3\x14\x85\x91\x46\x27\xee\xfe\x2d\xe5\xd7\x0d\x34\xcd\x01\x5f\xca\x37\x3c\x96\x45\xf7\x4b\x2a\x14\x81\x4b\xd0\xfe\x22\xca\xad\xee\x40\xc4\x02\x8f\xe6\x82\xe9\x8d\xab\xcc\x76\xf0\xe5\x75\x7d\xc6\xbb\xea\xba\x53\xfe\x43\x98\xc7\xf8\x3a\x3a\xb3\xcc\x58\x43\xb9\xbe\x5e\xc6\xda\x0f\x52\x01\xe5\x7a\x76\x82\x22\xe2\xcd\xb1\x7d\x9b\xfe\x20\x86\x36\x20\xfe\x42\xdb\x92\xc9\x27\xc2\xbf\x60\x90\x59\x7e\x32\x1f\x1a\xb4\xbb\xc9\x2c\x15\x80\x41\x19\x12\xc3\xc0\xe6\xbf\x55\xf7\xc2\x51\x01\x40\x97\x49\x5d\x54\xd4\x8b\x54\x7b\xb6\x24\x37\xc8\x24\x8c\x50\xc1\x0e\x77\xe0\x04\x49\xab\xf2\x68\x09\x5e\xaf\x2c\xe0\x07\x56\xcd\x30\x41\x24\x6e\xed\xf8\x25\x74\xfd\x99\x93\xbb\x34\x19\xb2\xa4\x93\x4c\x9b\x36\x48\x8c\x67\xa7\x51\x52\x06\x9d\x97\x44\x8e\x34\x92\x4c\xfb\xcd\x65\xee\x15\xc8\x20\xc8\x52\x32\x4c\x8e\xa1\x66\xdb\xba\x5f\xc5\x6f\x70\x44\x5f\x6f\x93\x41\xc0\xb9\x71\xb8\xeb\x97\x43\xd9\xb4\x2e\xcd\x07\x2d\x44\xd7\x89\x33\x19\x84\x92\x51\x5a\xa1\x41\x38\xae\x8e\xe0\x7b\x42\x65\x10\x62\xe4\x61\xca\x17\xac\x9b\x52\xc3\xe5\xd5\xc3\x92\x64\x10\xc9\x2c\x12\x1e\x24\xa1\xde\xbe\x39\x4d\x97\xd1\xa7\x96\x41\xa2\xa4\x1c\xe0\xe2\x77\x75\x5f\x02\x94\x41\x82\x8c\x94\x39\xb4\x65\xeb\x68\x2f\xf3\x41\x31\x5c\x06\x2c\x40\xcb\x0d\x55\xdf\x17\x5f\x3a\xd4\x8a\x0c\x58\xac\x02\x0b\x35\x7a\x77\x7e\x49\x38\x30\x34\x32\x60\x89\x71\x52\x75\x90\x17\xa4\x4e\xdb\x0b\xbc\xc9\x20\x0d\x58\xdc\x6b\x8f\x7c\xa2\xd0\xec\xc7\x27\x56\xee\xf1\xa1\x7c\x5d\xee\xf3\x0f\x0b\xa4\x32\x48\x33\xa5\x3c\xb7\xb6\x4d\xc7\x2f\xcb\xba\x79\xec\xd0\x74\x32\x48\x8d\x22\x54\xd6\xd7\xc5\xe6\xeb\xcb\x6a\xdd\xd1\x2d\xc9\x20\x8b\xb3\xd0\x45\xa6\x8b\xa6\x01\xf5\xb6\x86\xe2\xad\xdb\xf9\x65\x90\xf1\xd8\x13\x3e\x2c\xe1\xb4\x46\x75\x9d\x0a\x9e\xf0\x6e\xc8\x20\xd3\xb6\xd0\xb2\x7b\xb5\x6c\x04\xc4\x4a\xe0\x2f\x28\x80\x91\x95\xa6\x06\xcf\x41\x10\x49\xff\x3a\xef\x40\x06\x10\x73\xca\x3e\xe3\x11\xab\x57\x2c\xd4\x65\xca\xa3\x22\x03\x48\x15\x11\x4a\xac\xa0\xbe\x3c\xe6\x05\xde\xab\x72\x32\x9b\x41\x67\x3e\x79\x40\x1e\x50\xbb\xd7\xfb\x55\x2b\x03\x19\x58\xed\xe4\x5e\x83\xd3\x24\xdd\xb1\x4c\x51\x0d\xff\x04\x17\x0d\x97\xc9\x34\x53\xa1\x95\x65\xbe\xc5\xd3\xa1\xa4\x7d\xa1\x8f\xf4\x64\xa0\x8c\x22\xd7\xf4\xf7\xd6\xab\x19\xed\x5c\x32\xd0\x09\xd2\x8e\x76\xcc\xdb\xf7\xd2\x3d\x89\xee\x19\x47\xb7\x50\xbc\xad\x6c\x88\x39\x24\xba\x94\x81\xe6\x91\x0b\xbf\x4d\x7b\xea\x5d\xdf\x69\xf0\x08\xa7\xc9\x73\x6b\xd0\x44\xb8\x23\x95\x56\x8f\x0e\x35\xea\x7f\x0b\x43\x88\x4c\x2f\xd0\xf4\x78\x19\xba\x85\x32\x40\x66\x51\x4b\xe7\xa2\x75\xe1\x56\xef\x13\xb6\x7d\x3f\x2a\xb3\x54\x2d\x6b\x6c\xf2\x0a\xaf\x74\x66\x64\x80\x5c\x72\xcb\xfa\x77\xcc\x8b\xdd\xa1\x63\x18\x90\x01\x2a\xdb\x11\xf2\xf8\xb4\x1c\x2d\x1d\x34\x09\x24\x1d\xe1\x37\x56\x56\xf6\xb2\x3f\x2a\xc9\x61\x7b\xb4\x79\xae\x0f\x2b\x90\x43\xf3\x27\x03\xa3\x84\xf2\xdc\xfa\xbf\x86\xe8\xfc\xd1\xeb\x0a\x03\x16\x99\xce\x61\xcb\x8b\x9b\xcb\xe6\x50\x36\xae\x3f\xdb\x15\xde\x64\x18\xc8\x8c\x9a\x2f\x1d\x8f\x1f\x21\x50\xc6\x90\x53\x19\x06\x3a\xa0\x6c\x84\x2e\x8b\xb2\xb9\xfd\xfd\xf7\x36\x60\x1f\x3e\x64\x18\xc6\x09\x05\x47\xc7\xf3\x61\xec\xe7\x76\xc7\x39\x6d\xc6\xab\xf7\xf6\xb4\x1b\x7f\x5a\x14\x26\x9e\xa7\xec\x6f\x51\x68\xfe\x14\xc1\xa8\xd4\xf0\xf0\x74\x3b\xba\x83\xc8\x84\x72\x4a\x9f\xf1\xff\x72\x76\x65\xdd\x89\x23\x59\xfa\xef\xd4\xc3\x3c\x28\x42\xa1\xed\x11\x30\x76\xd2\xe9\x85\x36\x64\x65\x55\xf7\xe9\xc3\x89\xe5\x06\x56\x25\x48\xb4\x24\x6c\x53\xbf\x7e\x8e\x6e\x2c\x5a\x10\x59\x35\x33\x0f\x95\xd3\x56\x20\x90\x14\x8a\xb8\xcb\xb7\xb8\x59\xba\x52\xd3\xd4\x1c\x41\xc2\x28\xc5\x9d\x11\x1b\x6f\x82\xd7\xb9\x6c\x5f\xc7\xed\x47\x39\x43\xb5\xee\x99\x6e\xa0\x42\x51\x7f\xf7\x35\x4c\x1b\x27\xfa\xbc\x5e\xf3\x73\x3d\x8a\x7b\x04\x89\x88\xc6\x5f\xa7\x73\xdd\x5c\x76\xf8\x5f\xf7\xc9\x88\x19\x6d\x9b\x87\xd9\xf3\xcc\xff\x8d\x6b\x0b\xb8\x79\x39\xbf\xe7\xaa\xac\x72\xbe\xe0\x8a\xd7\x4d\xc5\x15\x1f\x9d\x3a\x06\x21\xcc\xd2\x8d\x14\xf5\xe1\xc1\x84\x69\x94\xc2\xc3\x19\xd6\x86\x41\x66\x22\x95\xd5\xf1\x66\x0a\x3d\x55\x23\x14\x24\x11\x04\x45\x3b\xca\xe2\x71\xf9\xdb\x89\x8f\xde\x73\x92\x06\x51\x2c\xfa\xb6\x37\xde\xa6\xcc\x0e\xc8\xa2\xc8\xd9\x1b\x3c\x5d\x16\x50\x74\xcb\x12\xc9\x22\x99\xc6\x3d\xb0\xfd\x70\x8e\xbb\xe9\x98\xc5\x8a\xdb\x65\xdb\xdf\x93\xe7\x72\xd4\xd1\x16\x24\xe3\x29\xae\xde\xa7\xaa\xac\xeb\xef\x79\xf1\x52\x3d\x96\xf5\xb0\xe2\x23\x08\x4f\x12\xdb\xb4\x2a\x1a\xe7\x58\x68\x38\x92\xbd\x28\x47\x10\xce\x33\x44\xf6\xc0\x79\x3f\x98\x52\x22\x52\x5e\xc0\xc4\xfd\xe6\x29\x0c\xab\x20\x22\x0b\x11\x09\xa6\xbd\x47\xd9\xa2\xac\x8f\x65\xbd\xe9\x9c\x34\x05\x91\x24\x36\x70\xe8\x0a\x4e\xbc\xb2\xf6\xd3\x83\xf7\x9a\xc8\x34\xc3\xb5\xf0\xdb\x7c\xe1\x3e\xa5\x02\xe5\xb6\x31\xfc\xd1\x86\xbf\x57\x56\x97\xeb\xb2\x9e\x20\x8a\xcb\xd8\x43\x86\x78\x05\x3d\xf2\x6c\x7b\x50\x21\x9a\x1a\xad\xc2\x77\xeb\xd7\x25\xc2\x3f\xbe\x2f\x97\x5f\x5d\x08\x44\x80\xa7\xb8\xf3\xd4\x28\xab\xd0\x6b\xc7\xfa\x01\x92\x87\x69\xcf\xae\xef\x0e\xde\xdd\x0a\x4b\x34\x04\xd2\x89\xc0\x3d\x38\xdf\xdd\x71\x64\xdc\x0e\xd3\xc4\x52\x20\xd7\xbf\xae\x31\xca\x1a\x0c\xa0\x41\x0c\xca\xa9\xa4\x58\xeb\x91\x5f\xdc\xa1\x54\x63\x1f\x71\x7d\xe0\x97\xdf\xa8\xff\x6b\x16\x1b\xa1\x7c\x59\x81\x2c\xdf\xa1\x22\x83\xc7\x34\xdd\x2f\x16\x94\xf0\x14\x77\x84\xe7\xd5\xe3\xf2\x37\x77\x2e\x22\x38\xfa\xf7\x74\xc0\x32\xec\x30\x0d\x27\x16\x25\x60\x9c\xd2\x14\xc8\x81\x31\xd3\xe0\x8b\xec\x58\x6a\xdf\x88\x13\x54\x56\xb4\xb4\x9e\x0c\x6a\xdb\x91\x8a\x3a\xc5\x0a\x64\xce\x3e\xf1\x22\xd7\x50\x37\xf3\xcb\x40\x0c\x63\xf4\xa9\x54\x1b\x60\xc3\xe3\x60\xdf\xa1\x34\x4b\xe3\xcc\xd9\xde\xb6\x79\xe0\xac\x3a\xf6\xad\x67\x70\x84\x74\xc6\xb8\xe7\xa3\xb9\xd5\x2f\xfa\x2e\xaf\x4f\x67\x44\x48\xf0\x43\xbd\xae\xca\x35\x6f\x3a\xf3\x1c\x41\xa9\xd5\xf8\x3f\xf2\x4f\x84\xa5\xf6\x9b\x6b\x82\x86\x34\x33\x55\xb0\x37\x90\x3f\xfa\x5a\xf2\xc3\xfb\x17\x0a\x8d\x59\x20\x96\xfb\xad\x34\xbf\x3d\xc4\xb4\x31\x98\xe0\x4a\x3d\xf1\xe2\xb2\x2d\x3b\x28\x5e\xbf\x67\x7c\x85\x25\x10\x34\x0a\x18\xa2\xae\xfe\x28\xf3\x62\x67\xa1\x5f\xbb\xaa\x2c\x47\x2f\x19\x8d\x48\x88\xed\xae\xaf\xb3\xa2\xe6\x55\xde\x15\x67\x05\x8d\x24\x41\xe2\xf2\x8f\x8b\xb4\x6d\x1b\xc3\x72\x99\x9f\x6a\x3f\x04\x14\xe2\x08\x8d\x68\x55\x4f\x40\x41\xd0\x94\x81\x44\x2c\x24\xb2\xff\x50\xdc\xf3\xa7\x7b\x19\x4d\x33\x92\x49\xf7\xba\xe6\xa7\xed\xe5\x04\xa3\x1b\x95\x72\x85\x53\x5b\x15\x3c\x1e\x1d\xca\x02\x49\x94\x5d\x8a\xf3\xe2\x0c\xaf\xa0\x00\x8e\x63\x1b\x09\x41\x33\x4d\x91\x45\x80\xc6\x7d\x4e\x59\x5d\x50\x1e\x00\x6e\xfb\x88\xd8\x42\xff\xb1\xd1\x86\x30\x0e\x7e\x29\x0f\x13\x27\x90\xb3\xfd\x6c\xdf\x5b\xec\xf4\xdb\x46\xff\xd4\xcc\xe7\x9c\x71\x4f\x1a\x69\xe4\x5b\x1b\x4c\xb6\xcf\x30\x20\xee\x47\x88\x80\x60\x8b\xc9\xb2\xe3\xcc\x1a\x3d\x4e\x0f\x47\x3f\x43\x50\x23\x00\xc8\x95\x32\xde\xdd\xc3\xd5\x43\x84\x0c\x1b\x96\xd6\x37\x7c\xb6\x58\xbc\x7c\x7b\xde\xee\x9e\x66\xfe\x15\x97\x8c\x61\x93\xdd\x52\xd7\x5d\xed\xe7\x8a\xb1\x78\x8d\x3b\x17\x54\x4a\x85\xa1\xf5\x5b\x5e\x41\x65\xa0\xfd\x56\x59\xf9\x2f\xd5\xb7\xdc\x19\x94\xe2\xa1\xcf\x72\x4d\xe9\x6d\x50\x99\x12\x54\x59\x30\x87\x5f\x83\x76\x75\xbb\x98\xd7\x3b\x5e\xa8\x9d\xf9\xdc\xdf\x56\xa6\x1d\x7e\x39\x10\x10\xd6\x46\x76\x5d\x16\x7f\xe6\xee\x1b\x81\x66\x38\x11\xbf\x5c\x4e\x50\xc9\xde\x0b\x01\x61\x06\x41\x17\x54\x2f\x65\x59\x5f\xea\x06\x8e\xff\x78\x1a\xdd\x76\xc8\x38\xa2\xb2\x0d\x1d\x71\x03\x87\xc3\x6c\x0f\x45\xb3\xc9\x11\x3b\x31\x1e\x2c\x43\x6c\x92\x9b\x7c\xd1\xcb\xb5\xd9\x96\xde\x0d\xa6\xe9\xd5\xbf\xfd\xf4\x9b\xea\x88\xa0\xa2\x3e\xaf\x9a\xbc\x36\x10\x15\x77\x24\x4d\x90\x1a\x81\x5d\x2e\x0c\x12\xcc\x81\x30\x08\x0d\x7c\x1b\x78\xf3\xcd\xe0\xee\x46\xf1\x43\x18\x44\x06\x9d\x64\x66\xca\x3d\x97\x4d\x59\x59\x31\x24\x37\x82\x1b\xbf\x1c\x5c\xef\xb8\x13\xdf\x1c\xf7\x64\x7c\x49\x51\x84\x24\x30\xa7\xf4\xcc\xd1\x41\x30\x1e\xd2\x08\x70\x72\xcf\x94\xea\xb9\x0b\xcc\xf6\x3c\x2f\x6a\x63\xad\x9d\x17\xfb\x65\xd1\xe4\xd7\x32\x0f\x63\x00\x5e\xff\xf6\x84\x34\x0b\x70\x63\xbf\xdb\x20\xd9\xf2\x7a\x15\x1d\x4e\x94\x30\xa4\x46\xab\x22\x2f\xda\x67\x54\x83\xf7\x7a\xeb\x15\xe7\x26\x03\xc8\x90\x89\x2c\x8e\xdd\x27\x8f\x8e\x50\xed\x83\xad\x90\x69\x86\x18\x3d\xeb\x25\xe3\x34\xfa\x6e\x40\x12\x6f\xfd\x6b\x4f\x16\x85\x12\x69\xc4\xeb\x27\x17\x2f\x85\x91\xce\xa4\x61\x3d\xa2\xd7\x40\x9f\x04\x26\xc2\x98\xe9\xd0\x94\x31\x7e\xc0\x08\x8b\x21\xc2\x38\x0e\xb2\x0e\xa4\xf9\xe5\xee\x37\x39\x05\x65\x11\x61\xac\x81\xf7\xe3\xd8\x6d\xb9\x5a\xcc\xd6\x6d\xde\x80\xdc\x49\x28\x24\x32\x8d\x1e\xb8\x9f\x69\x09\x8d\xb0\xe7\x77\xea\xbd\xe5\x61\x92\x1a\x2f\x60\x17\x62\x97\x95\x85\x26\xfe\x55\xc4\xee\x3e\x9f\x05\x68\xd1\x80\x54\xf9\x1c\xaa\xd0\x9f\x18\x48\x14\xdc\x00\x7b\xda\x21\x69\x42\x51\x24\x1d\xdd\x56\x47\x5a\x79\x22\x4c\x53\x23\xbf\x2a\x1a\xf9\xca\x1b\xf0\xe8\x16\x11\xa6\x59\x8c\x0f\xf7\xdb\xe6\x6e\x51\x5d\x4e\x4d\xd9\x8f\x38\xc2\x34\x53\xc8\x33\x3f\x95\x1f\x50\x7d\x3b\x8d\x72\x87\x30\xe5\x29\x36\x66\xcc\xdb\xd4\x26\x58\xbd\xea\xea\xe0\x49\x70\x96\x22\x8c\x1c\xb1\x8c\x4e\x27\xc3\xb3\xb5\xc1\xdf\x42\x1e\x6b\x6c\xde\xdc\x95\xc7\x73\x3d\xf8\x29\x82\x84\xb1\x6f\xfa\x0f\x0a\x01\xa1\xa0\x01\x2e\xff\x8b\xc7\xe7\xdd\x7a\xf9\xba\xeb\x4a\x46\xa1\x60\x0c\x79\xbe\x79\x21\xa1\x68\x72\xe7\xa2\xd9\xdf\xe4\x43\xc1\x05\x22\x76\x9e\x61\x81\x36\x87\xb6\xf0\xea\x0f\x03\xc3\x5e\x05\xe2\x56\xf2\xea\x0e\x05\x5d\x07\xda\x10\x43\x3e\x8b\x08\x85\x0e\x12\xdf\x7e\xcc\xff\x04\xb3\xa1\xfa\x9f\xab\xc2\x14\x33\x2e\x37\xdb\x66\xc5\x65\xc1\xa1\x72\xd7\x3b\xb9\x47\x86\x8a\x09\x5c\xda\x36\x8b\x6f\x77\x2f\xfe\x4c\x4a\x68\xea\x92\x14\xbb\xd8\x2e\xca\x42\x1e\xce\x0a\xfc\x82\xa6\x80\xb8\x98\x70\xce\x8b\x1f\xcb\x66\x60\x10\x26\x42\xe0\x19\xe2\xff\x2d\x1f\x17\x7d\x80\x96\x9f\x27\x28\xea\xbf\x48\xdc\x43\xcd\x14\x35\x1a\xb1\x70\xc8\xe1\xbd\x5c\x57\xe5\xa9\xca\xa1\xe1\x55\x3e\xed\x69\x22\x58\x10\x31\xac\xa8\xb5\xaf\xd3\xe6\x54\x79\x74\x9e\x60\x41\x92\xa2\x99\x8b\x02\x59\x2a\x93\xe6\xdc\xc3\x38\xcc\x64\x01\x37\xbe\xce\xf2\xec\x45\x44\x04\x0b\x54\xa4\x94\x2f\x04\xad\x0a\x54\x15\x80\xb1\xc0\xb8\x60\x24\xe3\x08\xdf\x6c\xc3\xc9\x49\x17\x5e\xc1\x28\x09\x32\xbb\x98\x3f\xf3\x4a\x96\x8f\x53\x02\x68\x82\x51\x16\x63\x50\x8c\xd2\x96\x55\x07\x5b\x11\x8c\x05\x51\x16\x3b\x69\x29\x53\x06\x34\xa8\xe7\xc1\xab\xce\xa2\x30\xed\x61\x96\x30\xc7\x77\x6f\xc2\xff\x2b\x0e\x60\x11\x4b\x43\x6a\xf3\x17\x5e\x81\xd5\x79\x9e\xd5\x86\x68\x39\xc2\x2a\x09\x16\x89\x2c\xcb\x3c\x36\x3b\x7f\x9a\xc0\xb8\x0b\x16\x07\x04\x79\x07\x5f\x73\xf9\x63\xfb\x06\x6d\x58\x6d\x76\x4c\x57\x01\x61\x71\xc2\x02\xd6\xeb\x1f\x8e\x6a\xf4\x2c\xa1\x09\x36\x1e\x0f\xe8\x0f\x9e\xee\x78\x3f\xb5\x60\x49\x04\x08\xd5\x47\xec\xfb\xea\xf9\x61\x37\x7b\xde\x7e\x59\x3d\x3e\xfa\xe3\x89\xc4\xd6\xe9\xf9\xa4\xca\x11\x5c\x41\xb0\x24\x8d\x1d\xa8\xa1\xbd\xc1\xe6\xe5\x59\xd5\xf5\x79\xd0\xa5\x1b\x7e\x26\x25\x71\xe4\x0c\x8c\x31\xd4\xdd\xbd\x93\xe4\x0b\xaf\xdf\x76\x76\x9c\xfb\xe6\x94\x82\xb4\x4a\xcb\xb2\x2c\x0a\x90\xcd\x53\xa9\xce\x7e\x4d\x60\x69\x14\x62\x71\x6c\xb5\xbc\x9f\xbf\x12\xe6\xff\x1c\xa7\xa8\x6d\x57\x9e\x9a\x95\x9f\x11\xa9\x34\xea\xdb\x15\xec\x5f\x41\xb7\x93\x7b\x98\xbd\xb0\x14\x62\x5c\xd9\xac\xf8\x41\x55\x4e\x20\xae\x6c\xb4\xca\x32\x10\x08\x40\x7a\xc8\x79\xd1\x7c\x07\x50\x5f\x73\xd4\x2c\xb0\x87\x79\xc4\x78\x36\xd2\xa5\x7e\xef\x0e\x0b\x22\x11\xda\x55\x56\x6d\xfe\xc7\xfb\xf3\x56\x24\x21\x77\x36\x6e\xbd\x36\x89\x3b\x0a\x46\xff\xde\x9a\xda\xda\x1f\xd8\x05\x41\x4c\x06\x86\xc1\x6e\x76\x02\xab\xee\x31\x4e\x6f\x47\xef\x9a\x0c\x23\xac\x9b\x97\x27\xc3\xca\x1a\x1d\x8d\xb3\xcc\x2a\x8d\xcf\x2a\x91\x37\x15\x6f\xca\x6a\x35\x9a\x5f\x52\x52\xec\x15\x14\xf0\x31\xd5\x73\x18\x3d\x7e\x29\x43\x6a\x2a\x61\x5d\xf0\xf3\xd3\xea\xac\xff\x9c\xcc\x6c\x02\x3b\x60\x79\x8e\xd7\x17\x45\x03\x45\xad\xc0\x41\x5e\x75\x79\x08\xa8\x61\x3a\xc0\x94\x26\xd8\x08\x7c\x7d\x79\x5c\xee\x16\x2f\xcf\xdb\xd7\x97\xc7\xc7\xe5\xab\x3b\x0c\x3a\xc1\xd2\x1f\x74\x9a\xf3\xf6\x88\x66\x89\xb3\x45\x56\x79\xb1\xc7\x62\x94\x5f\xe9\x99\x8e\x34\x72\x14\x8d\x74\xd8\x82\x57\x6a\x68\x94\xd2\x8f\x4b\xa3\x20\xc8\x70\xa1\x12\xed\x56\x70\x5e\x97\xd5\x28\x28\x8a\x82\x54\xf6\xec\xe7\x5f\x61\xdf\x26\x2e\x65\x65\xec\x1b\x87\x43\x09\x09\xb0\x5b\xc4\xad\x19\xb5\xa1\xab\xaf\xd1\xde\xfb\x17\x37\xc6\x42\xbb\x90\xad\x9f\x37\xed\x5b\x37\x7c\xe2\x11\xe1\xb1\x03\x20\x3d\xe5\x45\x73\x67\x38\x79\x3e\x36\x88\x08\x97\xb6\x23\xb1\x37\xba\xa0\x5b\x14\xdb\x73\x87\x69\x9b\x8a\xf9\xd7\x68\xd5\xc0\x71\x20\x26\xd5\xdf\xf3\x22\x9a\x72\x34\x21\xfb\xca\xf3\xaf\x67\x5e\xec\x8d\x9c\xc3\x4f\xc2\xed\x88\xa6\x86\x34\x80\x88\x85\xf5\x78\x3d\x8d\xa8\xc8\xb0\xc2\xf5\xfd\xf1\x69\xab\xf3\xa2\x80\x8b\xff\x59\x32\xc1\x1e\xe4\xc3\xeb\xcb\xf7\xed\x97\xdd\xe6\xdb\x7a\xfd\xf8\xbb\x3b\x18\x06\x04\x1f\x82\xd3\xcb\xfe\x91\x37\xcd\x65\xd0\x4c\x89\x42\x45\x33\xd2\x03\x40\xf7\xc4\xb8\x45\xc4\x6c\x47\xd9\xc1\x44\x51\xa5\xb4\xe1\xc7\x93\x1f\x90\x72\x81\x55\xfc\xfc\x13\x55\x29\x27\x5f\x8c\x88\xe9\x00\x7b\x88\xa7\xaa\x3c\xe6\x58\x8a\xfc\x56\x78\x0c\xb6\x88\x22\x12\x63\x2e\x79\xcc\x0b\x6b\xe0\x31\x28\x11\x45\x51\x2c\x70\xa6\xfc\x0b\xaa\x72\xf9\xf9\x85\x17\xea\x70\x83\x91\x2c\xa2\x58\x00\xea\xdc\x9f\x2a\x78\x5f\x1a\x07\x54\x77\x9a\x58\x99\xd6\xf4\x1e\x9a\x07\x7e\x04\x9c\xdc\xf3\x2b\x9f\x63\x11\xa5\xa9\x36\xd4\x2b\x5d\x4e\xda\xc2\x8b\x28\xe3\xd6\x91\xdf\xbd\xe6\x33\x75\xcb\xc0\x46\x44\x1c\x32\x24\x9e\xce\x51\x46\x60\x5b\xb6\xff\x62\x33\xbc\x3d\xb9\x41\xc6\xbb\x05\x1e\x01\x58\x28\x83\x80\x2c\x86\xe6\x82\xf9\xdb\x28\xc7\x6c\x77\x57\xd0\x1d\x57\xd1\xf1\xdf\xfb\xdc\x73\x77\x3e\x21\x44\xd8\xe9\xde\x58\x7c\x4f\x6d\x13\xc8\x3e\xa9\x2a\xed\xfd\x97\xb8\x2f\x92\x49\x82\xf8\x3a\x87\xaf\x37\x6e\x5d\xee\xdc\x52\xa7\xe8\x7e\xbc\xe6\x12\xaa\xfa\xbd\x5e\xf0\x77\x7e\xc8\xa1\xaa\x19\x0d\xdc\x18\x45\x14\x56\x1a\xb7\x4f\xaf\xfd\x60\x3b\x52\xd4\x40\x74\x2d\xde\x79\xe0\x5a\x31\x3d\x85\x94\x12\x19\xb3\x7c\x8d\x69\x12\xb9\x1d\x08\x2c\xc2\xc5\xcd\x30\x64\xbf\xc2\xe5\x5a\xc1\x57\x44\x90\xc4\x03\xec\xc8\x77\x0b\x3a\xb9\x1a\x26\x84\xa5\xb0\x98\xe4\xe3\xa5\x70\x96\x54\xa3\x81\x52\xa3\x8f\x85\x49\x71\x36\x7c\xcf\x67\x15\x14\x53\xb2\xb3\xbe\xc2\xdc\xdb\x75\x23\x9d\x0a\xbc\x4d\x18\xb1\x1b\x87\xb8\x9f\x0a\x03\x88\x48\x73\x23\xf7\x58\xb6\x33\x70\x0b\xfe\x85\x8c\x83\xf6\x48\xd7\x58\x07\x7e\x9c\x7e\x27\x63\x42\x33\x54\xd6\xe3\xf0\x63\xe3\x3e\x4c\x89\x59\xe2\x76\xff\x57\x4b\x03\x11\x53\x26\x62\x7b\xab\xf2\x42\x97\xb7\x2d\xa0\x45\x1c\x06\x0a\x01\x33\xcb\xfb\x2f\x7f\xc9\x6e\x12\x71\x18\x4a\xed\xd6\xf5\x06\x8e\xf5\x4a\xd5\xf3\xcb\xf6\x72\x82\x59\x61\xb7\x9f\x09\x25\x14\x11\x87\x69\xe8\x20\x9a\x08\xb0\x3a\x1f\x5d\x91\xf0\xd7\x7f\x6d\xfb\xe9\x59\xcc\x68\x82\x3a\xa5\x05\x7c\x5a\x6b\xd9\x17\xfd\x9d\xef\x71\x29\xb4\x1f\xb5\x64\x3d\xf7\x89\x48\x64\xdc\xc9\xed\xc1\x5f\x24\x31\x71\xa4\x78\xec\x00\x57\xed\xd7\x5b\x0a\xf9\x70\x50\x9c\x52\x6e\x28\xfd\x57\xcc\xd5\x89\x5b\x12\x4b\x99\xf6\x1d\x05\x1f\xcb\x6b\xee\xf6\xe0\x03\x69\xc0\xb1\xfe\x50\x9f\xa0\x40\xd5\xe5\x8f\x8e\xfc\x23\xe2\x94\x33\x0c\x3f\x3a\xe3\x28\x54\xec\x2a\x14\xb2\x73\xa6\xf3\xc5\x38\x85\x00\xe1\x1d\xfc\x74\xb2\x05\x99\xd1\x32\x15\xa7\x3a\xc4\x2f\x7d\x2c\xf7\xfb\xce\xf2\x57\xc4\x9c\x51\x91\x3a\xf3\xe7\x8f\xa7\xb2\x40\x71\xa0\xfe\xcd\xeb\x71\xbe\xa7\xe6\x0f\x8f\x98\x30\xb6\x4f\x7f\x9c\xeb\xa6\x57\xf4\x1a\x5b\xbb\x89\x98\x67\x60\xb7\xa7\x62\x51\xfa\x72\x45\xcc\x79\x88\xac\x96\xbc\x7e\xca\x0b\x67\x21\xd8\x73\xb0\x15\x31\x97\x52\x50\x8f\x83\x9d\xf7\xed\xfd\x07\x8c\xb8\x4e\x9c\xc1\x45\x69\xb1\x60\x21\x56\xd9\xa7\xf7\x8e\x58\x00\x08\xdb\x64\xf9\x32\x32\xd3\x16\xb1\x6c\xa3\x22\xe3\x4e\xd9\x78\x95\x5e\x11\x4b\x9e\x65\x16\x78\xf8\x25\x2f\x9a\xe1\x67\x80\x1a\xf8\xf7\x40\x6a\xec\x15\xd0\x85\xcb\x2d\xd6\x31\x24\x02\x6b\x68\xe7\x4e\x27\x71\x40\x01\x13\x31\x28\x63\x0f\x74\xb7\xda\x98\xfa\x37\x96\xc3\x77\xb3\x27\xf3\x3f\x5c\x01\x3e\x21\x94\xe8\x5e\x14\x35\x8e\x54\x12\xc2\x62\x6c\x81\xbe\xb7\xeb\xa9\x91\xf1\xb9\x07\xa8\xbf\x43\x05\xaf\x28\x53\xa2\xc6\x1f\x88\xb8\x2d\x18\x1b\x19\xb1\x75\x55\xee\x2b\x7e\x3c\xc2\xa0\x10\x97\x50\xc2\x0c\x3e\x70\xb7\xdc\x7e\xc1\xf4\xfd\xdb\xe9\xd4\x66\xb5\x9e\xb9\x2d\x12\x2a\x43\x6c\x78\x43\xc5\xdb\x35\xf4\xa9\xbd\xcc\xeb\x6c\x23\xa1\xd2\x78\x0e\x43\xdd\xe4\x47\xde\xdc\xb0\x60\x16\x49\x18\x50\x4c\x3a\xca\x76\x7f\x77\xb7\x32\x09\x45\x88\x81\x26\x7c\x36\x50\xa8\xed\x88\xa8\x20\x12\x16\x05\xda\x2a\x72\x9f\x8c\xc9\xc3\xe8\xb4\x11\x55\xae\xa0\xfb\x47\x5f\x7e\x48\x24\x11\x33\xfa\xf8\x7d\xab\xd0\xed\xe7\xdf\x82\xb4\x8b\x24\x52\x2a\x55\xae\x37\x27\x3a\xeb\xdf\xc9\xa8\x24\x89\xc3\xd0\xf8\x2e\xe7\xfb\x62\xa4\xac\x29\x92\x98\xa5\x48\x53\xde\xfd\xf1\x74\xbe\xad\x26\x32\xfc\xfa\x38\x36\x5c\xda\x36\x35\x04\x95\x7b\x2c\x6a\x7b\xc4\x04\xa1\x6f\xbc\xfe\x7e\x43\xc4\x43\x24\x71\x02\x4e\xf3\x05\xd3\xb1\x31\xa0\x24\xc9\x08\xc3\xe4\x2a\xaf\x31\x43\xe8\xc4\x39\xa7\xaf\x2f\xcb\x08\x76\xd6\xf0\x29\x61\x0b\xb5\xdf\xc8\x4c\x32\x41\x91\x58\xb4\x93\x56\x30\xc7\xda\xea\xff\x2c\x4f\x4b\x32\x25\xc0\x68\x7f\xd7\x50\xbd\xb7\xab\x24\xee\xaf\x7f\xab\x8b\x93\xf0\x28\xd0\x16\x7b\xf9\x72\x50\x13\xe5\x90\x84\x27\xa6\xb9\xda\x40\xdd\x90\x5d\xf9\x0e\xd5\x81\x9f\x4e\x79\xb1\x77\xe6\x8e\x1b\x7e\x84\x4e\x19\x5b\x24\x5c\xa4\x38\x5d\xe6\xb3\xad\xfb\x93\x48\x08\xca\xc1\x37\xfb\xca\x45\x7b\x4f\xfc\x13\x31\xce\x75\x37\x86\x62\xf1\xc1\x72\xf2\x0f\x65\x01\xd3\xd7\x3e\xb1\x03\xf5\x1a\x13\x89\xe0\x1a\x77\x36\x6c\x93\xbc\x0e\xe0\xdb\x76\x84\xa4\x8a\xab\x8e\xeb\xe7\xa5\x4c\x87\xd7\x2d\xc3\xd4\x8d\x7a\x7c\xfc\x75\xd7\x4e\x9e\x1d\x75\xad\xfa\x44\xf2\x4c\xc6\xce\xe4\x0f\xcd\xea\xcb\x11\xc2\x2a\x51\x2c\xc1\xda\x82\x80\xe6\xa5\x58\x94\x87\xb2\xfa\x65\x48\x51\x11\x89\xca\x0c\x83\x5b\xe2\xdc\x1c\xdb\xfc\x8c\x4e\xc7\x43\x44\x2c\xec\x3c\xf1\x62\x52\x31\x58\x24\x4a\x50\x66\xf3\x76\xa3\x8e\x8c\x53\xcc\xab\x5c\x4e\xdc\x32\x25\x8d\xa4\x8c\x59\x86\x1f\xcf\xf2\xc7\xc5\xf0\x03\x4e\x50\xa8\x31\x24\xeb\x36\xaa\x30\x01\x50\xd8\x3b\xdb\x92\x34\x4b\xfb\x91\x75\xa2\x19\xe9\x9a\x99\xbb\xbb\xe5\x62\xf5\x34\x7b\xdc\xf8\xa3\x92\xba\x14\xa8\x4d\x92\x73\x7e\xc8\xff\x5c\xf3\x0a\x8a\xe6\x5b\x91\xa3\x39\x6e\x4f\x8c\x47\x24\x5a\x65\x46\x61\xb7\xe2\xc5\xc8\x84\x59\xa4\x41\x1c\xa3\xfe\xbb\xe0\x6a\x0f\xfd\x97\x2b\x0d\x34\xcb\x2c\xd6\x70\xf6\xce\xf3\x43\xbb\x06\xae\x9c\x3c\x81\x48\x09\x33\x5d\x34\x3d\x20\x56\x88\x94\x32\x8a\x72\xe3\x26\x59\xe9\x85\x5e\x66\x17\x19\xca\x96\xba\xcf\xa8\x38\x33\x0e\x05\x86\xfb\x31\x11\x8f\xd9\x91\x21\x89\xc0\x3b\x06\x6f\x16\xb3\xbb\x99\x6d\x8a\xb9\xe3\xa1\x46\xd4\x4c\x1b\x06\xe2\x98\x3e\xe0\x27\x0d\x33\x85\xa5\x97\xbc\xc8\x2d\x7e\x12\x9b\x9a\xfe\xb0\x48\x10\x36\xe7\xec\x08\x6c\xde\x36\xbc\x61\x4c\x08\x04\x78\x3f\xfd\x8e\x0f\xe7\x79\xf6\xb4\x74\x9f\x8f\x02\x85\x7b\xf8\xba\x3c\x1c\x6e\xf4\x74\xdc\xc8\xcc\x60\xc2\xd6\xe7\xe2\xc7\x3c\x57\xe8\xc3\x0d\xd7\x9c\x9f\xf1\x87\xa2\x20\xc0\x15\xb8\x52\x92\x9f\x56\x45\xcf\xda\x43\xa4\x71\x28\xd0\xaa\xe7\x5f\x50\x94\xc7\xa1\xf8\xd0\xe4\x0b\x92\xc6\x19\xc1\x79\x2f\xa0\xd9\xbd\xf7\xe6\x4b\x1a\x67\x46\xef\xe1\x0e\xde\x73\x09\xbd\x4d\x33\x8d\xa5\xb5\x18\x3e\x5f\x96\xfb\x3d\x22\xe6\xae\x57\xc0\x34\xd6\x51\x96\xf5\x7a\x88\x3f\x93\xbc\x17\x69\x42\x02\x63\x23\xf5\x06\xf2\x87\x8b\xce\x5e\x4d\x6d\xcc\x58\x7b\xfe\xfc\x32\x12\x4e\x31\xb3\xb0\x44\x9e\xaa\xdf\xa6\x4d\xd3\x20\x41\x59\x4f\xbb\xb8\xe1\x82\x3f\xe8\x0a\xa5\x69\x68\xc3\x66\x74\xb8\xb4\x2a\x3c\xee\x58\xc6\x31\xc6\xe5\xc7\x7e\x21\x23\xcd\x58\xa8\xad\x14\xea\x4c\xeb\xfc\x90\xf3\x1b\x52\x3f\x22\xcd\x38\x43\xbc\x0b\x42\x4f\x4f\xa5\x7c\xab\x7b\xd8\xd6\xd1\x85\x70\x6e\xb6\xeb\x1a\x1a\x7b\xf9\x5d\x1d\xf1\xba\xb9\x90\x72\x15\x21\x42\x24\xaf\xbf\x35\xf9\x21\x6f\x2e\x5f\xca\x83\x1a\xef\xb7\xa9\x60\x3a\x23\x2e\x2c\x83\xca\x39\x2e\xfc\xb4\xc3\x98\x0a\x29\xb0\xa2\x6e\x44\xc9\x36\xfc\x30\x7e\x5f\x05\x84\x98\x78\xdb\x72\x7f\xaf\x0f\x96\xca\x58\x60\xc3\x19\xc1\x70\x73\xab\xc7\xe1\x0e\xaa\x80\xaa\x4e\xba\x6e\x18\xae\xa4\xc0\x52\xe3\x3c\xf4\x71\x39\xc1\xf8\xad\xd3\x3c\x35\x26\x3a\xfc\x72\xe7\x2d\x2c\xfa\x01\x74\xaa\x85\x01\x9d\x2c\x9b\xb7\xaf\xdd\x72\x94\x05\x6d\xe0\x6d\x6a\xbf\x8e\xb4\x74\xa5\x4c\x3c\xfa\x77\x5a\xfe\xd2\x9d\x0f\x4c\xf7\x16\x8e\x79\xb3\xac\x65\x55\x7e\x98\x15\x6d\x04\x08\xcd\x08\x37\x19\x3c\x32\xad\xfa\xa2\x18\x22\x23\x5a\x21\x58\xef\x04\x95\x2e\xab\xe3\xf6\x0d\x9e\xf8\x3e\x97\xdb\x2a\x97\x3f\xdc\x18\xca\x52\x4c\x25\x65\x59\x55\x20\x1b\x23\x5e\xf7\x4b\x57\x6c\xc8\x68\x1a\x82\x03\xf4\xa3\x04\xc3\x92\x57\x87\x8b\x87\xd0\x0c\x7f\x34\x95\x0a\x89\xe9\xc6\x8d\xdf\x4f\xda\x41\x68\x9e\x51\x88\x58\x27\x94\xb3\x98\x6f\xa7\xe7\x69\x16\x4a\x2a\xa4\xeb\x5d\x15\x5d\xd8\xd9\xeb\x24\x67\x2c\x08\x52\xe2\xe1\x23\xed\xce\x31\xa8\x05\x66\x2c\x92\x8e\x3d\xfe\xd8\x1e\x1d\x7c\x36\xd1\x48\x32\x5a\x35\x7c\xd0\xdb\xcd\x98\x32\x2b\xaf\xd3\xa7\xbb\xd6\xc8\x15\x59\xa4\xe3\x08\x3c\x77\xbd\x42\x9e\xee\xfc\x72\x57\xca\xae\x92\x6c\x47\xc6\x21\x95\xbc\xc7\x54\x72\xa9\x51\x16\x4b\x82\x77\x16\x2d\x7b\xc0\xa8\xde\x2e\xca\x93\xdb\x62\xb2\x34\x88\x69\xda\xc9\xaf\xf7\x84\x88\x44\x96\x5a\x2f\x3f\x28\xda\xab\xf2\xb9\xa3\x3d\x9a\x05\x81\x74\xc6\x09\x90\xeb\xb2\x9a\x76\x0f\xf8\x9f\x61\x16\xed\x3e\x2c\x8d\x87\xdc\x1f\x65\x6e\x18\x1c\xe3\xd1\x83\xa8\x26\xcb\xac\xae\x7f\xe3\xfd\xb6\x9b\xb7\x76\x5b\xbd\x15\xe6\xfe\x74\x91\xcd\xb8\x4d\x07\x65\x59\xbc\x43\xd5\x98\x92\xca\xeb\xef\x8b\xd1\x3c\xe3\x9a\x50\x61\x65\xff\xae\x0b\x71\x99\x08\x62\xd4\x0c\x3e\xf2\xcf\xa9\x0a\x71\x26\x18\x43\x1a\x1c\x2a\x98\xdd\x81\xce\x0b\x50\xfd\x4b\xb5\xc3\x40\xa4\x58\xb8\x31\x26\x78\x9b\xd5\xcb\xf3\xee\xf9\xdb\xd3\xea\x79\xb6\x7d\x71\xcd\x91\x4c\x27\x12\x6b\x7e\x56\x94\xbc\xd7\x4e\xbb\x7a\xdd\x87\x13\x48\x2b\x19\x3a\x24\xad\xd1\x31\x37\x07\x78\x10\x19\x17\x25\x0c\xba\xea\x73\xd5\x6e\x69\x37\x48\x47\x3c\x90\x0a\xb3\xf0\x79\xde\xc8\x32\x2f\xfe\xe5\xce\x41\x42\xc3\xf3\x33\xbf\x0a\x89\x0c\xb7\xe0\x01\x9c\x24\x02\x51\x77\xcf\xf0\xd1\x94\xc5\xb6\x72\x9e\x3e\x82\x13\x6e\x18\xc7\xef\x39\x7c\x7c\xe5\xd5\x91\xff\x5a\x36\xed\x2c\x1f\x1a\x1b\x0e\x7f\x11\x55\x8a\xba\x5d\xf2\x90\xe3\x82\xe2\x4e\x17\xd2\x00\x03\xb6\xfb\xbb\xbe\xad\x94\xe0\x61\x96\xa4\xd4\x75\x6d\x8f\xed\x56\xec\x4b\x44\x6e\x04\x18\x6e\x15\x5e\xc8\x26\xdf\xbf\x9e\x0f\xd7\xfd\x74\x1e\xa5\x86\x0e\x2e\xbc\xdb\xdf\x65\x14\x11\xb8\x81\x82\x08\x6a\xdb\x87\x25\x12\x3b\x37\x9d\x80\xdf\x60\x0a\xf0\x38\x09\xf1\x29\xb5\xc9\xe3\x5d\xee\xa1\xc8\x3c\x96\x01\xf1\xd4\xb8\x86\x1f\xda\x88\xbc\x59\x43\x75\xc7\xaf\x3c\x3c\xed\x27\xd2\x50\x06\x36\x6d\x79\x5a\xce\x7a\x8d\x06\x9e\x26\x9c\xa9\x61\x8f\xde\xaa\xf5\xfa\x11\x29\xc3\xb7\xe2\x54\xe5\xef\x88\x55\x3d\x1f\x57\x8b\x97\xee\xa8\xf1\x3e\x57\x20\xce\x7b\xea\xff\x2a\x63\xbc\xdb\xd8\x04\x83\x36\x52\xf4\x47\x40\x30\x77\xbf\x0f\xc0\xab\x9b\xd6\x63\x82\x67\x24\x30\xbc\xbe\x53\x59\x35\x75\x78\xe7\x4e\x91\x51\x85\x18\xda\xdd\x48\x0e\xa4\x57\xa5\xe6\x19\xb0\xd4\x45\xc8\x58\x80\xe9\x12\x23\x3b\x42\x10\x1e\x87\x0e\x85\xb3\x6c\xde\x3e\x5f\x41\xe6\xf0\xee\xcb\x6a\x5c\x88\x24\x72\x29\xee\x06\x9a\x6f\x27\x7f\x00\x02\x22\xfa\xfe\x99\xa0\x0c\xec\x7e\xd3\xf0\x1f\xdd\x8c\x93\x04\x30\xd2\x79\x05\x8c\xba\xe6\xb0\x3f\xfb\x7b\xaa\xac\xf5\xed\x1b\x46\x0e\x85\x84\x43\xcf\x0c\xd8\x91\x05\xb8\xca\x34\x4a\x45\x7d\xe0\x0e\xf6\x72\x6e\xfc\xfd\x55\x02\x58\x5f\x3e\xbe\xb7\xbe\x70\x25\x15\xde\x7b\x63\x30\x72\x3e\xe8\xfc\x70\x38\xf6\x1c\xcb\xfe\x4d\xbb\x5c\x2d\xf9\xcf\x10\x43\xde\x3b\xe6\xce\xa6\x49\x60\x75\x20\xe1\xa5\x30\xb8\x98\xa1\xbb\x8a\xe0\x40\x09\x96\x3b\x90\x66\xa2\xca\xb3\x38\xc0\xaf\x25\x2a\x47\xfb\xc2\x0a\x87\x50\x63\x11\xc3\xb9\x2b\x98\x2e\xd4\x54\x05\x98\x03\x83\x2c\xed\x71\x02\x5e\x51\x8c\xd4\x9f\x28\x22\x81\xea\xbc\xbe\xea\x41\x87\x90\x43\x2a\x2d\x77\xf7\x19\x3e\x4c\xb6\x38\x7a\xff\x20\x93\x28\xc8\x2c\x0e\x5c\xfe\xb0\x0a\xa7\xee\x90\x35\x49\x5e\x3d\x2f\x5e\x97\x4f\xcb\xe7\x6d\x4f\x1e\x50\x70\x1d\x84\x99\x0d\x88\xff\x1e\x86\x8d\x6b\x66\xd4\xe3\xf9\xb9\xde\x57\xe5\xf9\x66\x83\xdd\x0d\x07\x89\xf2\x11\x1e\x18\x7b\x7f\x28\xf1\xd2\x07\xbb\xcc\xff\x0d\x0b\x23\x02\xcd\x31\xa4\x7c\x5d\x6e\x96\xaf\xbf\x2e\x77\xcb\xdf\x16\x5f\x66\xcf\x0f\xcb\xdd\xe6\xcb\xec\xd5\x5d\x9b\x20\x69\x18\x53\xab\x23\xc1\xd5\x65\x5b\xce\x81\x8f\x8a\xa5\x82\x0a\x12\x98\x8e\xbe\x31\x1d\x7f\xe6\x47\x58\x94\xd5\x15\x0b\x7c\xbc\x55\xf7\x74\x38\x7a\x6f\xa8\x08\x09\x0b\xfb\x38\xc3\xaf\x45\xbe\x7f\x6b\x7c\x97\x72\xf8\xd4\x44\x08\x91\x36\x14\x94\xcf\xe7\xd2\x5b\xc8\x0d\xa6\xa1\x60\x84\x06\xa1\x9b\x86\x65\x01\x86\xe4\xe4\x2e\x91\xb1\x04\x15\x39\x9f\x5f\xb6\x4d\x6f\x79\x13\x2c\x49\xbd\x33\xb0\x05\xf4\x0c\xbf\x9a\x29\x8d\xba\xd1\x06\x49\x30\xd5\xef\xb2\x03\xa3\x2c\x25\x91\x4b\xb2\xbe\xf3\xaa\xe2\x45\x73\x19\xcb\xcc\xf7\x67\xba\x68\xc3\x64\x0c\x6f\xdb\xad\x16\x8c\x43\xcf\x64\xec\xe2\x90\x0a\x22\x12\xc2\x38\xdd\x35\x0f\xd0\xcc\xcf\xf9\x41\xe5\xc5\xbe\xcf\x32\x19\x3d\xfe\x44\x6a\x5c\x84\x06\x56\x6f\x3f\x2b\x9a\xd9\xcf\x71\x42\x70\x81\xc2\x16\xbf\xe1\xf4\xd5\x9d\xb8\x8f\xbb\x77\x3c\x0c\x0d\x47\xfb\xe4\xa9\x86\x3f\xeb\x07\x8e\x7e\x1b\x8f\x79\xe2\x3c\x91\xf9\x1e\x71\x15\xb8\x9a\xdd\x62\x07\x0e\x63\x3f\xc1\x13\xa3\x45\xb6\xb3\xee\x70\x28\xcc\xe7\xe1\xea\xee\xdf\xab\x06\x66\x7b\x4f\x70\x07\x5a\xac\x17\xcb\xfb\xae\x20\x2f\x94\x4c\x50\x79\x8c\x4b\x59\x9d\xb1\x1b\x39\xc8\xa1\x05\xc4\x31\x4f\x06\x80\x29\x4e\xa2\x09\xc0\x94\x80\x38\xc1\x0d\x73\xd9\x06\xce\x55\x59\x40\x55\xfa\x43\x29\x47\xb6\xf4\xf2\xe1\xf7\xf5\x76\xbb\xdc\x6c\xfd\x01\x30\xec\x5a\x53\x94\x69\x97\xeb\x0e\xb8\x29\x74\x26\x0d\x27\xa0\x12\x46\xff\x70\x34\x43\xb5\x0a\x3c\x2a\x13\xd4\xc3\xdc\x9f\x55\x43\x86\x7d\x88\xdd\xf1\x82\xc0\xe8\x2f\x70\x38\xf9\x0c\x4d\x06\x41\xca\x6d\x10\x68\x68\x57\x8f\xf0\x0e\x23\xea\x9d\x0c\xa8\xc2\x1a\xdd\x43\x59\x3e\xe0\x0b\x5f\x68\xcf\x97\x92\x41\x42\x88\xd5\x93\x9b\xb5\x39\xfc\x01\x6a\xd4\x2c\xa8\xbb\xee\x94\x0c\x04\x43\x34\xc8\xcb\xf3\x72\x33\xdb\xbe\x6c\xbe\xac\xfa\xd1\x85\xa4\x54\x11\x2b\xf8\x67\xe8\x64\x83\x39\x22\x43\x66\xac\x5b\x9c\x59\x41\x03\x6e\x1b\x96\x0c\x08\x6e\xe0\xaa\xe2\x79\xd1\xd3\xa8\xba\x89\x1b\x95\x51\x14\x20\x61\xee\x88\x23\xfb\x79\x92\x8c\xa4\xd1\xeb\x75\xb2\x40\x2e\xfd\x5e\x43\x35\x9f\x6f\xed\x7d\x1b\x9d\x4d\x6a\x9c\x47\xc7\x36\x26\xea\x5f\x52\x1c\x48\x6c\xaa\x7c\xe4\xa3\x6a\x86\x8c\x15\x23\x86\x68\x7a\x97\x63\xbe\xb8\x81\xc3\xe1\xff\xc4\xb4\xb0\x33\xda\x09\xbe\x09\x19\x03\xc1\x57\xf0\x01\x6c\xa2\x8e\x89\xad\xb1\x92\x75\xef\xa9\x4c\x28\xc3\x5c\x9c\x1f\x1a\xa8\xe6\xbc\x28\xbc\x03\xf6\x35\x86\x5f\x26\xd4\xb8\xa0\xd7\x18\xe7\x61\x39\x3e\xf4\x0a\xeb\x42\x26\x69\xa6\x32\x07\xd3\xf9\x95\xb7\x09\xbb\x3b\x02\x46\xad\xc7\x09\x82\x21\xa7\x62\x42\x17\xc6\xbd\xc9\xfd\x2f\x4d\xb9\x31\xcb\xaf\xa1\xb9\x83\x86\xcb\xb7\xf6\x15\xc0\x38\x75\x78\x07\x33\x22\x68\x97\x5b\xfc\x54\x43\x68\xf4\xf0\xb3\x44\x21\x28\xfc\x16\xff\xe6\xc6\xc7\x78\xa2\x43\xbb\x3d\xec\x4e\x15\xec\x7e\x5c\xe4\x2e\x97\x65\x91\xff\x77\x87\x6b\xe3\xae\x38\x1f\x01\xf1\x78\x37\x26\x1d\x17\x1a\x61\xa1\x82\xd7\xf0\xad\x72\x71\xb0\xe4\x5a\x62\xac\x61\x08\x78\xf3\xcb\x82\x5f\x81\x2f\xec\x48\x41\xb5\x61\x11\x9f\x45\x87\x04\x90\x42\x06\xa8\x35\x64\xe8\x8e\x77\xab\x5f\x57\x77\x1e\x34\x27\x25\x31\x22\xd7\xdc\x15\x07\xb6\xe5\xe2\x8d\x37\x4f\x50\xd7\x7c\x0f\xf5\x23\xe8\x51\x54\x24\x25\xf5\x58\x5f\x23\xcf\x8c\x29\xeb\x7d\x59\x99\xea\xeb\xf0\x92\x24\x35\x8a\x35\xf8\xb0\x10\x5b\xfb\xed\x75\x65\xde\xde\xfe\x26\x22\x25\x0b\x13\xe9\xc5\xc0\xd6\xbc\x76\x38\xb6\x4e\x78\x5e\x48\x99\x64\x46\x19\xb9\xcd\x82\x2e\x27\x3f\x67\x65\x4a\x32\xef\x79\xde\xa6\x66\x86\x5d\x68\x65\xd0\xfc\x22\xa6\x42\x85\xe0\x92\xd9\x62\x36\x94\x7f\x9d\xdc\xa3\xa5\x8e\xe3\x84\x75\x58\xdf\xe3\xf9\x68\x8b\x85\xdf\x21\x1f\x5e\xa5\x22\x22\xc5\xfd\xc0\x38\x30\x70\x8f\x59\x57\x44\x07\x31\x6a\xe2\xbe\x3c\xbb\x00\x4a\xd1\x38\x8c\xc9\x88\x8b\xbb\xe6\x55\xd3\x95\xe5\x15\x95\x12\xe3\xc7\xe7\x72\xa8\x29\x33\x9c\x2f\x8a\x85\x2c\x13\x3d\x0e\x6a\xbb\xea\xfa\xaf\x66\x49\xa4\x4d\xf0\x6b\x25\xc4\xea\x1e\x45\x55\xb1\x24\x43\xaf\xef\x4d\x29\xa5\xb1\x3b\xea\x3f\x0e\xc5\xd2\x0c\xa9\x01\x66\x35\x5b\x0f\xb0\xda\x2a\x62\x9a\x3b\xbd\x08\x0f\x0c\x6a\x27\xe5\xe6\x83\x9f\x26\x55\x4f\x85\x8a\x20\xcd\x8c\x12\x83\x29\x81\xcf\xaa\x2a\x7f\xe7\x87\xfe\x6b\x3b\xba\xb8\x38\x61\x88\x4e\xdf\xa3\xbb\xd8\x65\x03\xef\x7e\xd9\x54\x09\x33\x79\x66\x05\xfb\x01\xae\x72\xf8\x04\x55\x22\x32\xbc\x05\xaf\xc2\xbb\xdb\x0b\x95\x48\x53\x73\x71\x2a\x04\x77\xb9\x9c\xa4\xb6\xaa\x04\x8c\xbd\xb0\xef\xdb\x18\xfe\xc5\x68\x54\x46\x28\xea\x52\xba\xa0\xe6\xeb\xcb\xcf\xcb\xf3\x2a\xa3\x09\xde\x09\xf4\x51\x9c\x9f\x2f\xcf\xe5\x07\x42\xdd\x6e\xdc\x86\x8c\xa5\x48\x54\x3b\xd7\xb0\x5c\xad\x13\xe2\xf2\x3a\x95\x25\x0c\xcf\x93\x9b\x86\xd7\xaf\x46\x75\xb6\xec\xe6\x5e\xc6\x05\x22\x28\x17\x16\x32\x55\x37\x3d\x82\xa7\xca\x20\x0e\x6d\xe7\xe2\x71\xd1\xfd\x91\x53\x04\x3a\x9f\x9b\xe8\xae\xf4\x82\x1e\x8a\x13\x8e\x48\x45\xac\x43\x21\x44\xfa\xa7\x2b\xe9\x20\x88\x52\x3c\xd5\x9c\x39\x10\xb4\x2c\x2d\x78\x71\x78\x95\x9c\xc7\xf8\xb0\x71\xa2\xee\xfa\x64\x6d\xc5\x41\xa0\x40\xe3\x9a\x9f\x3b\xf9\xe8\xa7\xf2\x86\x2b\xb4\x50\x82\xa6\x28\x6a\x64\xb3\x98\xcd\x20\x7b\x51\x22\x53\x56\x7d\xd7\xb8\xa8\xc1\x09\xbf\xcc\x30\x5b\x6e\x16\x1e\xed\x87\x65\x28\x9d\x8a\xf2\xea\xe8\xe1\xb4\x8b\xa6\x1a\x45\x42\x4a\x4a\x62\x4c\x20\x2d\xc0\xa6\x9d\x18\xf3\xcb\x80\xd0\x70\x4d\xdb\x6d\x93\x71\xa4\x61\x1f\x72\x0d\x4d\x7e\xb4\x74\x60\xff\x3c\x75\x22\x98\x76\x0f\x7c\x60\xd9\x21\x94\xe6\x1c\x3b\x30\xb3\xcd\x6a\x36\x5f\x6d\x37\x03\xe5\x99\xeb\x98\x5d\x69\x9d\x3a\x39\x12\x2c\x6a\xb4\x6f\x2f\x96\x8d\x06\x17\x0c\x01\xcb\x12\x5f\x3c\xfe\x83\xb7\x21\xfd\x02\x0e\x87\xbe\x64\xbf\x00\xa2\x22\x94\xe0\x10\xe7\xcb\xfc\x70\x46\xfc\xe9\x72\x3f\xed\xba\xe1\x20\x98\x40\xb9\xc4\x78\x12\x57\x6c\xe7\xac\x31\x6c\x7f\x00\x53\x8c\xd9\x7d\x7e\x5b\x9d\xdb\xe4\x7b\xbc\xb6\xf4\xa2\x02\x88\x42\x8a\xe0\xb1\x87\x43\x29\xf8\x01\x29\x49\xee\x44\x11\x33\x8d\xa1\x9e\x35\x74\x75\xd9\x96\xaf\x46\x66\x65\xda\xb8\x4f\x40\xa4\x8c\x54\xd3\x6f\x8a\xcb\xc1\x76\xe1\x8e\x43\x08\xc6\x07\xbc\x36\xde\x16\x3f\x9d\x3b\x10\x07\x31\x63\x56\x13\x40\xaa\xab\x15\x7d\xb8\x72\x41\x4c\x59\xd0\x61\x19\xbe\xd5\xa6\x5c\x6d\x8c\x4d\x0a\xf5\x6a\xc8\xfd\xd7\xbe\x12\xf8\x58\xae\xa9\x8c\xd7\x73\x0d\x62\xae\x31\xf0\x5c\x1c\xda\x33\xf5\x4d\x83\xdc\x00\x45\x11\x14\x0f\x9f\x79\xb3\xf6\x50\x1e\x48\x52\x8a\x8c\xdc\xef\x2f\xaf\x8f\x77\x4f\x2f\xf3\xd5\xe3\x6a\xfb\xbb\x3f\xd8\xce\xfb\x3e\x43\x4b\x1d\xf3\xe2\x3a\x43\x87\x44\x2b\x48\x3b\x2e\x6d\x87\x08\x83\x34\x00\x34\x71\x39\xf2\xea\xc7\xa2\x3c\x1a\x60\xb5\x4f\x10\x20\xcd\x34\xee\x5a\x6a\xd6\x46\xa7\xeb\xf3\xc1\x40\x26\x32\x77\x93\xb3\xd4\xb8\x5c\x2d\x5e\x7f\x5f\x6f\x5f\xe6\xab\xed\x72\xf1\xb2\x7a\xfe\x19\x40\x1d\x78\x10\x09\xab\x0c\xf3\x6d\x73\x37\x77\x0a\x9d\xed\x01\x20\x72\x68\x01\x6b\xe2\xfc\x69\x35\x07\xe0\x34\x63\xe8\xb0\xf5\xfb\x7c\x1b\xfe\x3d\x8d\x7b\x01\x3c\x66\xa4\xe3\xb0\xec\x8c\x96\x8e\xf4\x11\xcc\x68\xca\x09\xa2\x10\x5e\x6c\x33\x9c\x95\x2c\x11\x7a\x69\xa3\x13\xf7\xc3\x45\x68\x8c\x69\x7a\x3c\x0a\x13\xc1\x8f\xfa\x72\xa3\x09\x2a\x80\x3a\xbb\x2f\x54\x4a\x0a\xa9\x3f\x21\x68\xe3\x8f\xf7\x06\xf2\xc7\x7d\x59\x21\x6e\xa7\xb7\x13\xf6\x5f\x43\x49\x18\x82\xa2\x4c\xf5\xef\x9f\xe7\x72\x8c\x52\x03\x99\x41\x6c\x0a\x19\xba\x5d\xc9\xdc\x3a\x0f\x52\x53\xe3\xec\x66\xda\xd6\xed\x09\x0a\x18\x41\x62\x00\x68\x86\x48\xb8\x0a\x9a\x2a\x87\x77\xb8\x46\xc1\xe1\x10\x8b\xd8\xdd\xf0\x03\xaf\xae\xea\xdc\xa3\xeb\xd6\xc4\xc0\x33\xf6\x60\xc9\x4a\xab\xbb\xf9\xe5\x9a\x66\x01\x3a\x33\x2e\x7c\x35\x34\xf7\x79\x2d\xf9\xe1\x57\xe3\xc5\xf8\xd3\xae\x13\x68\x21\x32\x67\x24\x7c\xc5\x4b\xd1\x01\xa3\x10\xb9\x25\x8e\xab\xb1\x68\xdd\x70\x86\xe9\x40\x0a\x82\x1b\x40\xed\x9d\xa3\x4d\x40\xca\xd5\xbb\xbd\x8b\x9a\x68\x8a\x30\x46\x27\xdb\x3e\x13\xf9\x21\x6f\x72\xa8\x51\xf1\x60\xf8\xed\x94\x33\xc8\xac\x6e\x02\xcf\x8b\x7a\x9a\xdb\xa7\xc3\xd0\x88\xc2\xdc\x95\x7b\xac\xe1\xb9\x3f\xf3\xd0\xb6\xdb\x6f\xac\xce\x76\x1c\x0b\x62\xa7\x5f\xbe\x6c\xde\xfa\x38\x1c\xcd\x12\x85\x5a\xd7\xa2\x68\x2e\x9d\xf7\x87\x3b\x1a\x49\x8a\x01\x8e\x35\x08\xf9\x02\x55\x39\xfd\xea\xe9\x48\x45\x66\xea\xb8\xcc\xbf\xab\x3b\xe9\x38\x48\x85\xa3\x71\x9e\x2f\xe3\xfc\x44\x27\x54\xb8\xf0\xca\x78\x8e\xa0\x20\xbf\x3d\x98\x46\xa6\x61\x61\xa2\xdc\x63\x91\x9f\x8f\x3d\x03\x53\xa1\xd3\x38\x44\x5a\x43\xa1\x47\xad\x7b\x9d\x45\x60\x9c\x35\x9a\x8a\x37\xb0\xcf\xe5\x48\x38\x5f\xe8\x2c\x89\x22\x3b\x4d\xbf\xd9\x9a\xd0\xe4\xfc\xd4\x82\x28\x6c\xee\x2d\x57\x6b\x1a\xfc\xcd\x75\x45\x8b\x54\x3b\x74\xb9\xdd\x5d\xfb\xac\x35\x2d\x04\x60\xcf\x7e\xe7\x56\xea\x5d\xfe\x33\xcd\x07\xf7\x8e\xf7\x51\x83\x5a\xc6\x04\xf5\x6f\xb1\x84\xb9\x3e\x8c\x89\x86\x5a\x11\x83\x15\x39\x9b\x72\xdb\x64\x5f\x50\xab\x14\xb0\xcc\x62\xd0\x62\x68\x11\xdc\x66\xf3\xf8\xfa\x9d\xaf\xbc\x71\x84\x56\xdc\xd8\x07\xfd\xf7\x0c\xd5\xa5\x6b\x42\x8d\xbf\x5a\xa4\xd8\x37\x93\x8e\xcc\x87\x09\x67\x5e\xec\x0d\x2d\xc6\x8d\x92\x49\x10\xf4\x8a\xd4\x83\xd2\x68\xff\x65\x1e\xcd\x36\x4d\x38\xd6\x7f\x96\x2f\x9b\x81\xce\x8c\xd6\x5c\x82\x0d\x74\xe7\xe7\xcb\xa2\x9c\x5a\xc4\x65\x10\x84\x1c\xb3\x71\x83\x64\xfb\xbe\xda\x7e\xb9\x7b\x9d\x7d\x9f\x3d\xee\x96\xcf\x77\xbb\x3b\xdf\x44\x90\x41\xc0\x84\x94\x36\x62\xf8\x4b\xea\x84\x0c\x82\xd8\x74\x4d\x2c\x69\xbf\x3c\x28\xdf\x8c\x9d\x34\x0c\x99\x5c\x0e\x65\x10\x70\x85\xf3\x72\xf3\x56\x7e\xd8\x2a\xee\xe0\x99\xc9\x80\x84\x21\x56\x75\x74\x7e\x38\xb8\xf9\x2c\x03\x12\x0b\xc4\xd5\x20\x73\xc3\x96\xac\xd6\xfc\x72\xdd\x60\x77\xe3\x33\x66\xa8\xf5\xe8\xd2\x06\xf5\x00\xb6\x2d\x03\x1a\x51\xe7\xb2\xf2\x52\x1c\xf2\x02\xba\x46\x64\x7b\x10\xb0\x7a\xcf\x9d\xbc\x19\x22\x92\x9b\xb2\x9a\xa3\x71\x8e\x7c\x83\x49\x19\x38\x19\xd0\x34\x96\x1d\x7d\xf8\xf1\x65\x3b\x7a\x36\x61\x10\x61\x4c\xb7\xf4\x0e\x31\xf6\x00\xa3\x0a\x93\x8a\x79\xfe\x4f\x4c\x7f\xb0\x18\xfc\xb3\x8e\x8e\x0c\x18\x33\xe5\xf7\xaa\x3c\x17\x6a\xfb\x56\xc1\xe0\x12\x18\x64\xb8\x4e\x23\x05\xfd\xb7\x57\xb3\x5d\xf6\xa6\xa7\x0c\x62\xaa\xe2\xde\xa2\x76\x97\x6b\x9d\xcb\xb3\x37\x15\x96\x41\xac\x52\x6f\xbd\xce\x1b\xc4\x56\x94\xe7\xa6\xe7\xce\x2e\x83\xc4\x4a\xa8\x9b\xde\xe1\xe9\xd1\xa9\xb7\xc9\x20\xc9\x62\x4c\x8d\xe1\x98\x23\x86\xf5\x6f\x2a\x2e\xfc\xed\x08\xb3\xfd\x86\xcc\x0a\x67\x18\xec\xa0\x8f\x1a\xdc\x71\x6e\x2a\xd5\x9e\xbe\x6b\x5e\xd5\xd7\x31\x18\x12\x29\xb2\x4e\x0d\x6a\x77\x7a\x2f\x76\x98\x34\x38\x14\xeb\x68\x72\xf2\x94\x24\xde\xc5\xf8\x65\xe1\x63\x36\x77\x38\x33\x5e\x65\x9d\x62\x45\xdf\xc8\x62\x32\x32\x92\x81\x88\x08\x26\xd2\xcd\xdb\xc0\xac\xc7\x1d\xe5\x04\xdb\xc7\xf3\xbc\x99\x97\x75\x27\x19\x23\x03\x29\x8d\x9e\xc1\x76\xf6\x5b\x6f\xdb\x90\x01\xc4\x04\xb5\x23\xe6\x79\xcf\xca\x63\x0a\x94\xfc\x7f\x69\xdf\xb5\xa7\x15\xd2\xca\x1b\x19\x8b\x8a\x2e\x8b\x96\x81\x4e\xa9\xb0\xb5\xdf\x95\x5d\x18\x46\xd7\xa1\x33\x1e\x82\xab\xae\x57\xbc\x50\x0f\x50\x40\x9d\xd7\x38\x29\xfd\x82\xdc\x7d\x9d\x96\x21\x6e\xba\xba\x02\x50\xe5\x51\xe2\x1e\xd9\xfc\x85\xad\x92\x0c\x34\x18\xe1\xca\x65\x1b\x9e\xf7\x5e\x31\x12\x04\x52\xda\xf8\xca\x30\x60\xef\xf2\xda\xc0\x99\x07\xdf\x4b\x02\x6a\xaa\x99\x5c\xa9\xf5\x1b\x42\x3b\x8b\x72\x2c\xb2\x7a\x2d\xb9\x9a\xfa\x4f\x1b\x0c\x87\x45\x45\x4e\x77\xb9\xfc\xd8\x14\x51\xcd\xdc\x28\x44\xd4\x4b\xc4\x30\x29\xff\x83\xb3\x54\x86\x6e\x97\xd9\x58\xca\xf8\x88\x49\xda\x8e\xe2\xbd\x4a\xf7\xa8\x94\x3e\x39\xdf\x48\x20\x28\xa4\x23\x69\xc1\x7a\x10\x60\x48\x12\x48\xb3\xbb\x5a\xcc\x15\xa8\x1d\xfe\x8c\xdd\x07\xe4\x7e\x08\xc8\xd4\xb0\x53\x11\x36\x72\x67\x10\x3a\xfe\xa8\x86\xc0\x6a\xb4\x96\xfa\x45\x7f\x2f\xab\x1f\xa3\x1b\x4d\x79\x80\x3f\xe3\xae\x2a\x0b\xd8\xbc\x95\xfe\x92\xa8\x54\xcc\x96\x1d\x2d\x75\x72\x30\x93\x08\xd5\x01\x86\x75\x57\xc2\xae\x1d\xf3\x5d\x92\x90\x18\x6b\x34\x71\xae\x0a\xaf\xab\x22\x49\x18\x45\xe8\x0d\xb7\x2f\xcb\x69\xfa\x8a\x24\x61\x96\xa0\xe2\x45\x9b\xcc\x9f\x4f\x83\x28\x5d\x92\x90\x33\xe3\xef\xd7\xe6\x2a\x0e\x0f\xef\x8e\xa9\x20\xf6\xce\x4b\xa6\x3b\x36\x98\x81\x21\x50\x84\x85\x43\xa1\x76\xab\xc5\x8b\xbf\xd7\x8c\x6a\x04\x71\x0d\x7c\x76\xaf\xb0\xbe\xa3\x87\xc8\x62\x81\xab\xf3\x0e\x3e\xf3\xba\x59\x60\x11\x73\x74\x21\x2c\x15\x46\x32\x89\x1f\xe4\xc2\x79\x36\xf6\x1b\x89\x92\x44\xcc\x28\x31\x23\xe4\xe8\xd0\x66\xa1\x5e\x53\x56\x92\x98\xc5\x08\xc0\x52\x20\xf3\x36\xd0\x78\xd1\xa3\x9b\x11\x27\x84\x5b\x86\xca\x86\x1f\x0d\x3b\xd7\x7a\x56\xdd\xaa\x42\x49\x12\x43\x88\x66\xf4\xbb\x1d\x7c\x82\x3c\x37\x80\x70\x93\x55\x71\x3a\x37\xab\x1a\xab\x8c\xbb\x9d\xff\x38\xeb\x3e\x9f\xfe\x67\x7a\x23\x24\x89\xce\x50\xa2\xdf\x2a\xf9\xff\x84\x8a\x22\x49\xc6\xb3\x48\x5a\xe3\x91\x7d\x0f\x45\x6c\x0f\x8b\xd0\x38\x18\xe3\x1a\xf1\xae\x26\x6c\x4a\xdb\x31\x92\x7b\xa9\xd7\x42\xe7\xfb\x36\xbc\xfe\x65\x22\x39\x93\x44\x64\xc6\xc7\x64\x0b\x75\x33\x7f\x9e\xff\x65\x5c\xdd\x7e\x82\x61\x81\xe1\x84\x72\xeb\x0f\xb6\x03\xe8\x1e\x88\x90\x31\xaa\xf5\x70\xa5\x36\x67\xd1\xee\x3d\xf5\x98\x16\x22\x89\xa2\x14\xf3\xa6\x63\xee\xca\xff\xc3\x46\xed\x68\x1e\xe9\x84\x70\xeb\x1d\x8e\xd9\xde\xfc\x5c\x15\x3d\x09\x09\x49\x83\x58\x22\xae\xf6\xbe\x8d\x30\xf0\x7c\xc6\x6a\xfe\xe7\x8b\x0c\x0d\x62\x8d\xe5\x0a\x9d\x17\x58\x3c\x76\x59\x99\xa4\x41\x12\x31\x03\x25\x2a\x9a\xda\x99\xbb\x5c\x81\x05\x07\x17\x45\x03\xae\x50\x7f\x08\x35\xf4\xf0\x6c\x03\x6e\xe1\xed\xe9\x46\x03\x49\xb0\xb8\xd0\x21\xa4\xd6\xe7\xd3\xe9\x82\x28\xea\x63\xcf\xeb\xaa\xfb\x00\x18\x5b\xf2\xe6\x03\x8a\xe6\xb2\x7d\xcb\xab\x66\xa0\x6b\x24\x29\x25\xc6\x09\xf8\x54\x81\xcc\xcb\x0f\xe0\xdd\x81\x14\xeb\x53\xed\x9a\x63\x5f\xe3\xa7\x12\x8a\x2b\x01\x31\x37\x9c\x0a\x47\xe0\x41\x9a\xb4\x3f\x0d\xe7\xdc\xc6\xa6\x0f\xfc\x08\x1e\xce\x70\xe0\xfb\xeb\xca\xa4\xa4\x21\x35\xc0\x64\x1f\xad\xaa\x6d\x39\xbe\x31\x6e\x68\x06\x88\x23\xb3\x72\x70\x0d\x1c\xdb\x95\xdb\x19\x67\x4f\x6e\xfb\x34\x14\x4a\x5b\xf6\x56\x79\x78\x1f\x8a\xa4\x48\xca\xa8\xc4\xed\x07\x13\x26\x32\xbd\x33\x8f\x4e\xc8\x42\xed\x9c\x33\xcc\x62\x51\xea\x0e\x8d\x2c\x69\x44\xa4\xe8\xa9\x4b\x23\x90\xed\x4a\xb1\xe4\x56\xc4\xd2\xbb\x2d\x51\xa8\x51\x8d\xae\xdc\x15\xe5\x7b\xb9\x3b\x55\xa5\x38\xc0\x71\x58\xcd\x91\x34\x82\x0c\x7f\xcc\x0e\x15\x16\xf3\xe2\x0f\xfe\xcb\x44\x41\x59\xd2\x98\x44\x51\x6c\x8b\xe3\xf7\xc6\xc2\x16\xfb\x04\x0e\x6a\x2f\x69\xcc\x03\xec\x7e\xaf\xec\x3e\xee\xfe\x9e\x50\x8d\xc9\xe2\xb7\x02\x93\xd0\x11\x62\x42\xd2\x44\x08\x84\x13\x99\x22\xc0\xa2\x3c\x9e\x78\xd5\x7d\x58\x2a\x8c\x01\xf0\x65\xee\x60\x20\xc3\x6b\x48\x65\x02\x41\x27\x6c\xd0\x3e\xd2\xfe\x0d\xcd\xc2\x00\xa7\x19\x4a\x1b\xbe\x21\x67\xa1\x1e\xfd\x06\x9e\x26\x88\x5f\x38\x79\x58\xcd\xb6\x7c\x05\x13\x59\x8f\x86\x8a\x80\xe2\xae\x3f\x7f\xf9\x6d\xd3\xdf\xdd\xa8\x20\x84\x64\xae\x59\x78\xea\xfe\x9a\x62\x0d\xc8\x9a\x92\x0f\xf2\x9a\xf1\xc3\x1b\x7d\x91\x32\x3d\xca\x07\x9e\xa3\x66\x0a\x9d\x6a\x49\x4b\x2a\x69\x10\x44\xce\x46\xa2\x1f\x92\x52\x99\x2a\x0c\x49\x9d\x0c\xc3\xb6\xfc\x59\xf9\x4b\x52\x29\x59\xac\xcc\x8a\xa5\x5e\xa1\x7e\xe6\xc7\x1b\x70\xe3\x76\x28\xc7\x4e\xef\x43\x7d\xd8\x34\xbc\x50\xbc\x52\x7f\xaf\x72\x22\xa9\x0a\x00\x7b\x3c\x5f\xbf\x3d\xcf\xea\xc1\x0d\x84\x84\x07\x41\xcf\x65\xa2\x5d\x89\xef\x01\x85\x04\xfe\x62\xad\x85\x84\x63\x8f\xf0\x9f\xe7\xf6\x2e\x97\xc5\xa6\x29\xab\xd1\xd6\x46\x21\x35\xba\x05\xcb\xc5\x6c\xed\xbf\x51\x10\x54\xc4\x78\x2b\x8b\xf6\x83\xf5\x7d\x59\x35\x82\xcb\x1f\x67\xff\xf8\x00\x32\x8c\xe2\xac\x82\x27\xb2\x0f\xc6\x80\x63\x19\x06\x01\x53\x4e\x58\xed\x74\x18\xc0\x20\x65\x18\x08\xc0\x80\x5c\xf2\xc3\xe1\x05\x11\xfe\xd3\xcb\x61\x48\x98\xc2\x26\xe0\xd3\xea\x79\xf9\xba\xdb\x6c\x67\x5f\x5d\xa9\x22\x24\xda\xe4\x7a\xe7\xe2\x64\x30\x3d\xee\x00\x0d\x22\xd2\x29\x09\x5a\x70\xfb\xf0\xb4\x94\xc5\x81\xf1\xa5\x9a\x7c\x96\x21\x4d\xc1\x59\xcf\x3c\x5d\x66\x52\xc2\xa9\xb9\x49\x9e\x92\x61\x24\x8c\xa4\x29\x58\xd5\x90\xf1\xab\x14\x46\x9a\x21\xbb\x73\x77\x2c\x95\xdd\x03\x5c\xe9\x61\x4a\xd1\x5a\x86\x31\x09\xb0\xb0\xb1\x06\xec\x93\x77\xf8\x52\x19\xc6\x59\x40\x0c\x25\x7a\x86\xe0\xe5\xe1\xda\x1b\xc6\x3c\x10\xa2\x8b\xd1\x7f\x31\x78\x96\xfe\xbd\x8f\x05\xc1\x1a\xc1\xa9\x7f\x52\x20\xe6\xa4\xce\xf1\xf5\x7a\x27\x1f\x7e\x4d\xc2\x09\x42\x27\x6a\x7e\xd9\x94\x47\x68\xde\x86\x80\x25\x19\x66\x6d\xf6\xe7\x9a\x6d\xcb\xff\x9e\xf3\x77\x7e\x80\xee\x39\x8c\xae\x37\x13\xc6\xf4\xa8\x06\x2b\x44\xd1\x01\x2a\xdc\x4f\xcc\x24\xe1\xa2\x9f\x7c\x78\x66\x49\x0f\x5d\x2c\xc3\x0c\x8c\x7b\x03\x57\xca\x48\x7c\xdf\x5a\x58\x7a\xf6\x95\x83\x97\x31\xe4\x4c\xe2\xb3\xc7\xbe\xf3\xab\x67\x03\xc9\x50\xa6\x36\xb7\x39\x37\x5f\xc0\x2f\xc7\xa1\x54\x29\x12\x62\xda\xa9\x6c\xe5\x63\xfa\x7d\xd2\x76\x00\xc8\xbe\x6a\xf7\x3d\xd8\x0d\xcc\x1e\x57\x81\x95\xf7\x87\x63\x39\x8e\x3e\x43\x15\xf3\x44\xf9\xce\x82\x33\x81\x99\x5e\xad\x42\x25\x35\x66\x29\xa6\x01\x63\xdd\x53\x6b\x14\xcb\xb9\x71\xe3\x21\x4c\x7b\x66\x99\x4f\x79\x61\xd8\xb3\xa3\x41\x8c\xc6\xd2\xb9\x2e\xbc\xba\x2e\x88\xb5\xed\x1f\xcf\x75\x9d\x25\xb1\x4d\x68\xee\x0c\x25\xba\xf6\x57\xaa\x35\xf7\x6b\x02\x26\x71\xed\x1a\xbe\x52\xb5\x63\x7f\x0f\xbe\x96\x05\x21\xcd\xc0\x27\xe7\x88\xbf\xb9\x85\xdc\x90\x2c\x48\x0d\xfa\xf9\x01\x0a\x78\x5f\x7e\xca\xb7\xbf\x62\xfa\x4f\x17\x34\x58\xa0\x63\xed\x80\x03\x23\xe5\x34\xc9\x48\x1c\x22\xe2\x1f\x3e\x4d\xf9\xc6\x24\x17\x0a\x4b\x9d\x7d\x5f\x5e\xc9\x48\x62\xa2\x72\x93\x69\x16\xa3\x08\x83\xd1\x84\x48\xef\x73\xe4\xea\x45\x46\x91\x76\x9e\x3b\xb5\x6b\xc9\xa8\x0a\x92\x6c\xe8\x8d\x37\x3a\x51\x18\x10\xac\xb9\x63\x0c\xbc\x34\xb9\xd3\x75\xe0\xeb\x06\x47\x21\xf6\xc9\xea\xb7\xf2\x63\xd7\xbc\xc1\xae\xe0\x47\xd8\x95\x7a\xf7\x82\xea\x06\xbb\x3b\xf7\xbd\xa1\x96\xd8\x86\x6e\x07\x36\x3d\x5a\xbe\x3d\xcc\x78\x8a\x30\x8e\x21\xa8\x71\xd3\x94\xd8\xa9\xeb\x78\x88\x92\x31\x19\x82\x4d\x4e\x66\xea\x7d\x54\x77\xb2\x63\xa2\x20\x41\x41\x0e\xe5\xc4\x3a\xc7\x4f\xee\x3a\x80\x67\x51\x9a\x20\x66\x64\xd7\xbe\xe6\x16\xb1\x7f\xeb\x4d\xb7\x1f\x89\xc3\x10\x11\x21\xbb\x0a\xde\x81\x1f\x2c\x19\x70\x78\x61\x71\x16\x61\x7d\xe0\x15\xf2\xbb\xb2\xcd\x06\xfa\x7b\x31\x4b\xc2\x04\x57\x71\x07\x55\xbf\xff\xf6\xec\xef\x58\xc2\x8c\x16\xaa\x2f\xfc\xfb\x92\x0d\x4b\xa2\x38\x89\xfd\x43\x34\xdc\xc7\xa9\xbe\x9d\x64\x09\x98\xe9\x85\xf2\x61\x65\x65\x9d\xf5\x5c\x41\xdc\x0f\xe2\xca\x3b\xd7\x7a\x81\xbb\x2b\x21\x7f\xc9\x52\xa2\x52\xd1\x67\x8b\x7d\x87\x7c\x7a\xbb\x61\x19\x25\x34\x73\x5c\x13\x04\x74\xe1\xeb\xe9\x2f\x21\x8b\xe3\x80\x77\xc1\xe4\xca\x16\xfb\x6a\x8f\xbf\x73\xe3\x92\x14\x6c\x75\xd8\xda\x2f\xff\x0e\xbc\x6a\x4f\xf8\xd4\xcd\x93\x05\x3f\x8d\x26\x71\xa6\x32\xc3\x0e\xb5\x40\x6e\x77\x3a\x1e\x1b\x86\x3d\xfe\x2c\xe3\x30\xd7\xa7\xaa\x49\x26\x98\x44\x33\x03\x57\x59\x5d\x57\xb0\x41\xef\x84\x2f\xbc\xc6\x1d\xe9\xef\x00\xbd\x25\x13\x5c\x41\x5f\x2a\xc4\x18\xc5\x94\xa3\xfb\x29\xb4\xb1\x2e\x16\xe7\x4e\x30\x5f\x32\x99\x69\xac\xef\x7c\xf7\x01\xe5\x98\x8a\x2d\x99\x0a\x3d\xfa\xcb\xc8\xe0\x8d\xb5\x65\x9e\xcb\xcd\x5b\xf9\x51\x63\xf2\x5e\xfa\xbb\x09\xc4\xd4\xc2\xda\x4d\x11\xa1\x42\x0e\xb8\x77\x6f\x9c\x03\x6f\xac\x84\x9a\x19\x8a\x5c\x53\x5d\xb0\x50\xb0\x1c\xaf\xe7\x4c\x0b\x62\x91\x83\x47\x2c\x16\x3c\xf4\xfc\x8b\x64\x14\xd0\x00\x2c\x7a\xd2\xe3\xbb\xcc\x7e\x35\x39\x79\xa2\x40\x86\x51\xdc\xdb\xde\xe6\x65\xe1\x15\x6d\xdb\xa3\x46\xcd\x38\x37\xb3\x79\xeb\x65\x96\x30\xeb\xb1\x83\x08\xe1\x28\x95\xf8\x52\x9d\xde\x78\xf1\x9d\x1f\x40\xf3\xaa\x6f\x44\x2c\x23\x1a\x30\xd5\x05\x75\x18\x23\x8c\x9f\x50\x44\x05\x43\x67\xfe\x79\xf9\x99\xf7\x6a\xe2\x11\x15\x02\x91\xf1\x18\x78\x0d\x54\x21\xdd\x00\x49\x5d\x3a\x0b\x0d\xb2\xd5\xb6\xa5\xe2\x17\x7f\x18\x22\x94\x33\xb0\xd6\x52\x7d\xc7\x04\x19\x85\x60\x92\x5d\x24\x8c\xf3\xba\xc4\x3c\xef\x2e\xd7\xfa\x76\xfd\x21\x62\x61\x80\xfd\xae\x55\x51\x9f\xb5\xce\x65\x0e\x85\x65\xb0\xfe\x74\xa2\x46\x11\x4d\x71\x3f\xc0\x07\x61\xd4\xef\xea\xb4\x1f\x76\x45\x11\xd5\xdc\xd6\xee\x9e\xa0\xe1\x8a\x37\xfc\x5b\x3d\x5e\xe7\xa2\x28\x4a\xdc\x23\xfe\xfa\xfd\xcb\x7d\x59\x3d\xf0\x51\xfe\x18\xc5\xc4\x98\x24\x1a\x5b\x22\xdb\xf3\x77\xfa\x50\xe5\xf8\x84\x31\x37\xe8\xcc\x53\x95\x3b\x3e\xed\xa6\x5b\xb3\xa2\xd4\x1a\x47\xd9\x1b\x78\x97\x4b\x98\xc3\x55\x2c\xf8\x3f\xc3\x45\x71\xb8\x38\x46\x59\x10\xa3\xf5\x4f\x1b\x6e\xbe\xda\xee\xa9\x3b\x7f\x96\x19\x2e\xa6\x69\xd2\x60\xdb\xd9\x1d\xe2\x29\x47\x23\xc5\xc7\x72\x3f\xcf\x6f\xd6\xa7\x6e\xdc\x6f\x91\x39\x4b\x62\xe4\x72\xd9\x44\xfb\xe7\xcf\x48\x82\x11\xe2\x7d\xfe\xcd\x8a\xb5\x77\xf3\x50\xc5\xd4\xd1\xa2\xd1\x08\xcf\xff\x5d\x66\xdc\xd4\xae\x05\xb7\x15\x71\x32\x80\xd3\x77\x67\x57\xda\xe8\xcf\xf6\xe4\x09\x96\x9f\xa7\x95\xd5\x78\x30\x04\xa1\x41\xaa\x15\x41\xc0\xa5\xfd\xc4\x43\x55\x7e\xe4\xc5\xfe\x89\x7f\x0e\xc9\x98\x6e\x24\x0d\x90\x8d\xd1\x6e\x90\x95\x93\xa8\xbe\x1a\x93\xa0\x6a\xee\xf1\x89\x7f\x62\x7f\x69\xe1\x35\x74\x64\x04\x11\xc3\xa8\xe6\x8d\xd7\xf3\xb2\x79\x9b\x35\xb6\xb8\x76\xe5\xb8\x32\x7a\xb4\x3a\x49\x8d\xde\x1d\xb3\x1c\x03\xff\x77\x19\x59\x6d\xb8\xd9\xe4\x96\x38\xf8\x6d\x71\xa0\x38\x52\x35\xf2\xe3\xc9\x74\xf4\x7b\xf0\x03\x19\x07\x9a\x62\x17\xdf\xd8\x4b\x5f\xbf\x14\x31\xa1\x04\x31\x42\x05\x7c\x18\x2a\x2d\x54\xef\xb9\x84\x71\x62\x1b\x93\x90\x63\x75\xc8\xd0\xf8\xad\x9c\x85\xba\xd1\x38\x88\x49\x42\x93\xac\xd7\xf0\x07\x35\x3b\xf9\x00\x2f\x26\x32\x8d\xc2\x61\x6c\x70\x2d\xb1\x28\x63\xa2\x2c\xd9\x1d\x17\xbf\x76\xa5\xc8\x8b\xbd\x11\xde\x9b\x9c\x84\x31\xd1\x99\xb0\x34\x69\x6c\xa5\x59\xe5\x82\xe1\x20\x4a\xcd\xe3\x32\x8d\x6c\x74\x23\x1e\xfd\x78\x4a\xbd\xbd\xbc\x0d\x86\xc7\x67\x90\x6e\x63\x5b\xb5\x2f\x3c\xfe\xac\x89\x7a\x56\x4c\xb3\xc4\x88\x32\xb6\x1b\x84\xa1\xf1\x8c\xd6\xc4\x38\x64\x14\x6b\xc3\x0b\x5e\xf0\xea\xf2\x6b\xec\x6e\x11\x13\x22\xa1\x83\x98\xa2\x17\x60\xc6\x51\x6a\x40\xaf\x7c\x5a\x52\xc3\x8d\xca\x04\x72\x7c\xac\xe0\xf6\x17\x43\x12\x1d\xbd\xc7\xfe\x97\xc4\x91\x4e\xed\x55\x0d\x17\xe5\x2e\x13\x88\x63\xa1\x5c\x9a\xf9\x1d\xf8\x69\x5c\x70\x8f\x13\x1e\x29\xe1\xfb\x0f\xfc\xf0\xda\x5b\x93\xe2\x84\x83\xf1\x51\x7a\x5d\xee\x16\x2f\x2b\x2f\x84\xbf\x7c\xdd\x79\xe6\xb2\x8c\x13\xe5\xad\xa7\xcc\x33\xec\xe9\x6a\x8f\x1e\x77\xa2\x13\x04\xf1\x0e\xb4\xce\xf6\x46\x45\x6a\xb2\x64\x11\xa7\x59\x80\xc1\xa1\x0b\x9e\x17\xbc\xe1\x87\xd2\xd5\x03\xe2\x2c\x8c\xa3\xc4\x1b\xc8\xaf\xaf\x44\xc9\x65\x9c\xa9\xc8\xec\xc7\xd6\x55\xd5\xf0\x83\x27\x23\x84\x98\x07\x14\x39\x9e\xed\xef\xa9\x31\x2b\xf7\x5b\x7f\xcc\x63\x40\x10\xb6\x38\x94\xff\x3d\x03\xaf\x76\xc6\xf6\xa1\xf1\x37\x8b\x43\x18\x45\xdd\x46\xe4\xeb\xd9\xe7\xeb\x37\x58\x70\x8d\x99\xbb\xa9\x64\x1b\xe0\xaa\x19\x70\x3f\xde\xb1\x62\x21\xb9\x62\xa3\x5b\xf6\x52\xe5\xfb\x1b\xde\x9d\x32\x16\x2a\x33\x2e\x9b\x0e\x9a\xd9\x99\x5f\x1b\x64\xf2\x68\xbc\x4c\x4d\x11\x79\x7e\xbe\x8c\xbe\x5a\x72\x85\x42\xb2\x75\x53\x56\x60\x2a\xbc\xcf\x48\xa2\xe8\xa7\x45\xb1\x84\x10\xed\x9e\x5f\xef\xb6\xee\x56\x40\x00\xc2\x2a\x4e\x6d\x24\x14\xbc\xca\xcb\x1a\x2d\x22\x47\x9a\x29\x83\xf3\x80\xa0\xa8\xb6\xc4\x9b\x83\x3f\x8f\x48\xb0\x97\xe0\x8a\xa0\x98\xb9\xd9\x83\x49\x90\x68\xe7\x6b\x8b\x9a\xcc\x13\xe7\x4c\x08\x83\xcc\x43\xf3\xa1\x5a\x73\xf9\xa3\x5f\x65\x4d\x08\x07\x0c\x95\x97\xcb\x7f\xbd\xf4\xa3\xb8\x84\xd8\x52\xc8\xbd\xe9\x6a\xa2\xcf\xbb\x3d\x44\x05\x41\x0e\x58\x6e\x84\x54\xda\x07\x68\x16\x14\x17\x59\x0f\x61\x99\x32\xa1\x0a\x70\xf1\x99\xbf\x3c\x7f\xdb\xb4\x2f\xce\xee\xf5\xe5\xdb\xf3\x5d\xe8\x4e\xc8\xe2\x00\x67\x68\x3b\x51\x1c\xda\xdb\x1d\x8b\xa8\x8e\xad\xc1\xca\x03\x14\x41\xbf\x82\x94\x44\x29\x13\x26\x37\x47\x31\x97\x95\x85\x92\xd4\xfe\xb8\xd2\x66\x22\xbc\x9d\x2b\xff\xeb\x63\xc9\x51\x27\xe2\xc4\x73\xf5\xe2\x83\xc3\x24\x09\x68\x6c\x32\xe5\x76\xee\xf7\xd8\x68\x32\x49\x48\x88\x13\x10\xbf\x7b\x51\x7e\x0c\x27\x49\x92\x44\x29\xed\x38\x03\x5b\xe0\xc7\x45\xd9\x93\x2f\x76\x8b\x55\x92\xea\x0c\xbc\x62\x25\x46\x29\x7e\x97\x74\xdf\x94\xc5\x09\xd2\xdf\x17\x0e\xc1\x0b\x77\x70\x70\x80\x43\x99\x70\x9a\x22\xe9\xef\xcb\x79\x5f\xcf\x2f\x7d\xcf\x71\x99\x70\x88\xb1\x10\x00\xcd\xdb\x5d\xfe\x5e\xbf\x7c\xf4\x92\x2a\x3b\x44\x04\x34\x35\xd5\xad\xa3\x31\x7a\x5d\x60\xbe\xd9\x2b\xdd\x25\x22\x8c\x74\xea\xc2\x6b\xa3\x07\xa6\xc7\x65\xf7\xe1\xb3\x15\x49\x66\xa9\xe6\xf5\x5b\x7b\x3b\x47\x47\x33\x89\x6a\xc9\xf3\xd9\x66\xb9\x5b\xbf\x6c\xdc\xf7\x48\x16\xa2\x1f\xcd\x91\x7f\xe6\xc7\xf3\x71\x7e\xbe\xcc\x79\x37\xb1\x25\x33\xd6\x34\x6e\x7a\x7d\x85\xcb\xb0\x76\x9a\xc8\x8c\x73\x36\xea\xe3\x6f\x9a\xab\x8e\x70\x22\x85\x40\x60\xd6\xce\xf8\x5f\x4c\x42\x58\x65\xa2\x62\x46\x2d\xce\x76\xfd\xeb\x7a\xd9\xae\x6a\x05\xfa\x64\x8c\xae\x46\x87\x0a\xeb\x1f\x6f\xbc\x91\x6f\x4f\x65\xd5\xe4\x23\xdd\x25\x99\xe8\x44\xc7\x36\x4c\x78\xa8\x78\xd1\x00\xf8\x87\xab\x21\xc0\xd0\x7a\xfd\xed\x75\xf1\xa5\xbd\x1f\x56\x64\xb4\xab\xe8\xa7\x41\x68\x04\x95\xf9\x81\x57\x47\x74\x8d\x1b\x25\x84\xed\x08\xe4\xba\xc3\xf1\x74\xfd\xed\x69\xc0\x62\xdc\x88\xf2\x7a\x55\x20\xcc\x95\xf8\x33\x0b\xc6\x52\xb7\x4d\x34\x79\xb1\xdf\x60\x06\xd4\x2b\x99\xa5\x24\xd0\xf8\x96\xaa\xff\x37\xa1\xd4\x9d\x88\x26\x61\xa7\x5a\x85\x11\xda\xe9\x90\xfb\x1c\x20\x25\x61\x2c\x69\x0f\xa5\xad\x06\x2f\x41\x4a\xe2\x18\x2b\x46\x0e\x73\xfa\x94\xdb\xf8\x31\x9d\xee\x9f\xa4\x44\xa4\x08\xf9\x79\x5a\xbd\x2e\x5e\x06\xab\x58\x1a\x51\x1a\x76\x16\x66\x9b\xfc\x4f\xb3\x17\x8c\x6e\x6a\x44\xe3\x44\x20\x87\x08\xbd\x7c\x1d\xb6\x7c\xfa\xdb\xa2\x2c\x61\xda\xb9\xbb\x0d\x22\x3b\x3b\x20\x61\x89\x74\x8a\xa4\xa5\x6e\x3e\x78\x05\xbf\x9a\xb7\xcc\x08\x63\x0f\x1b\x2c\x69\x02\x0c\xa7\xe8\x06\xeb\x0c\xe7\x0a\x16\xed\x9c\x86\xca\x09\x64\x0c\x9f\x70\xaa\x8c\xed\xa2\xe1\x23\xb8\xcb\xcc\x18\x73\x16\x86\xa6\x5a\x5b\x23\xd4\x51\xfe\x58\x0d\x05\x36\x64\x9a\x49\xa3\x79\x51\xa3\x6d\x4d\x01\x6a\x71\x91\x07\xb8\x5a\xac\x52\x4e\x02\x0c\x77\x8d\xdc\xeb\x60\xbf\x4b\x79\x9c\x61\x66\xd1\x86\x5c\x1e\x93\xe2\x7e\x0a\x4f\x0c\xe8\x59\x84\xb4\x29\x37\xf8\xb1\xd1\x4f\x10\x19\x33\x0d\xef\xd3\xe9\xd0\x61\x7f\x7e\x9a\xaa\xa5\x32\xa0\x22\xec\x6b\x68\xcd\x2f\xab\xf1\xab\x21\x45\x8a\xe8\xcd\xbb\xf9\x6a\x7d\xcd\xc8\x91\xa9\xd4\x49\xd4\x59\xa1\xf7\x04\x94\xdd\x4f\x57\xc4\x48\x90\xb5\x49\x4c\x53\x1e\x9f\xca\x0e\x90\xdf\x87\x19\xcb\x14\x92\x10\xa3\xc2\xba\x7d\xc5\x96\xce\x8c\x41\xa6\x1a\x18\x32\x7c\x45\x59\xfe\x70\xd3\x39\x0b\x52\xc0\xc2\xea\x1d\xff\x28\x7e\xf3\x7f\x14\x19\x4f\x7b\x2e\x10\x03\xb5\x82\x7f\x87\xff\x19\xcf\xf4\x7f\x93\x4e\x4e\xa5\x8f\x88\xc9\x48\xc6\x79\xe8\x36\x95\xe3\xb9\xaa\xf8\x1e\xda\x67\x32\xc4\xcb\x66\x44\x2a\x5c\x6f\x6d\xbc\x05\xc5\xfe\x9c\x17\x63\x41\x89\xc1\xed\xca\x88\xe6\xb8\x21\x22\xec\x3d\xdc\x71\x94\xc0\x78\xe0\xf5\xb7\x9a\xef\x81\x06\xc1\xbc\xe4\x95\xf2\x57\x49\xb9\x40\xc0\xe8\x03\x3f\x82\x73\x84\x1c\x3e\xf7\x2c\x0c\x28\xae\xea\x0e\xb1\xea\xab\x36\x19\x63\xc6\x4e\x1b\x6b\xcf\xc7\x7c\xe4\x5f\x69\x07\x25\x2c\x40\x59\x62\x55\x1e\x79\x3e\x40\x2f\x66\x49\xc4\x8d\x9f\x96\x71\x1a\x76\x7f\x4d\x59\xe6\xb1\x5e\x58\x1f\xcb\x9b\xcb\x8b\x1e\xdd\x99\x24\xd3\x0e\x95\xed\xa0\xf0\xd5\x24\x8f\x40\x66\x09\x68\xd5\xf9\x72\xad\x64\xd9\xf9\xbb\x0f\x6f\x5d\x62\x9b\x88\xdf\x9f\xb7\x83\xe5\x28\xcb\xa8\x11\x49\x7e\x6f\xc3\x0b\xec\xb7\xf8\x5f\xcb\x13\x9e\x3a\x28\x17\xaf\xae\x1c\x2e\x65\x26\x62\x8a\x89\x62\x1b\xc6\x57\xbc\xda\xf0\x83\x8b\x0b\x32\x19\xf1\x0e\xb9\xd6\x3e\x01\x93\x99\xba\xa3\x32\x25\xba\x4b\x92\xee\xa0\xe1\xf9\x61\xb4\x73\x64\x2a\xd0\xc2\x50\xa3\x5e\xbe\xdf\xa1\xdf\xed\xec\xf1\xf1\xe5\xfb\xec\x79\xe1\xba\xb8\x99\x62\x11\xa6\xb6\x47\xec\xe8\x9f\x56\xc5\x77\x0f\x26\xcc\x34\x8f\x11\xa4\x20\x72\x65\xfd\xa7\x06\x92\x2d\xbd\xf5\x8e\x13\x22\x43\x2b\x4e\xde\xa6\x87\xfd\x07\xc9\x49\x92\xa0\x33\xee\xe3\xea\xf9\xeb\xf0\xf2\x39\x11\xa6\x3a\x84\x16\x57\xf2\x0d\xd4\xf9\x30\x9e\x61\x9c\xc8\xc8\xc9\x50\x3c\x97\xaa\x6f\xb0\xe0\x07\x70\x29\xfb\x9c\xdd\xe5\x88\x73\x23\x39\x01\x93\xa6\xa2\x7c\x83\x23\xb6\x49\x4e\x03\x23\x59\xb3\xc3\x7b\xbc\xce\x3f\xe1\xf0\xad\x50\x50\xbd\xe6\xfb\xb7\xd1\x06\xc0\x29\x31\xf4\xe3\x79\xde\x3c\xe5\x87\x43\x07\x5e\xf6\x27\x8b\xb5\xee\x40\x9f\x0f\xe7\xf5\x5b\xc5\x7d\xeb\x8d\x87\x2c\x40\xb1\x48\xf4\x71\xeb\x34\xc0\x86\x0f\x8c\x87\xc2\x38\xfc\xd6\xc6\xb5\x76\x59\x55\x65\x35\x60\x90\x0e\x5f\x67\xce\x52\x85\x1a\xeb\xcd\x14\xa6\x6c\x78\x1b\x99\x62\x42\xf4\x02\x01\xd4\xd4\x36\x1d\xab\x72\x94\x5c\xf2\x48\x04\x11\x3e\x4d\x30\x95\xf8\x6e\xb2\xf3\x48\x84\xf8\xa0\x8d\xb6\xdf\x13\x2f\xf8\x7e\x9c\x07\xf2\x58\x73\x7c\xa9\x9f\x4b\x63\xe5\x7d\xf4\xe0\x74\x9e\x68\x8a\x78\x82\xc7\xfc\x1d\x4e\x00\x95\x5d\x55\xae\x94\xaf\xff\xfd\x9f\x41\xc6\xc3\x53\x42\x0c\xc4\x13\x97\xba\x97\xe2\xaa\x7a\xc6\xd3\x98\x31\xdb\x1d\xfe\x2b\xd6\xc3\xe8\x26\xa6\x42\x46\xd4\x7b\x92\xae\xfc\xec\x48\x81\xe2\xf4\x47\x86\x58\x7b\x21\xb0\x69\xca\xca\xd3\x8c\x24\xcf\x88\xc2\xfe\x88\xe6\x53\x20\x06\xce\x03\xe3\x96\xea\x18\x4a\x50\xe5\x3e\x6e\xe4\x9c\x47\x61\xdc\x31\xdf\xbc\x77\xe2\xcf\xb7\x4c\xce\x05\x48\x3d\x4a\x9b\x8d\xf7\x62\x0d\xd5\x7b\x5e\xec\x9f\x61\x5a\x21\xa8\x3b\x85\x0c\x08\xce\xb1\xa7\x7f\xb8\xc4\x96\xcb\x24\x43\x38\x94\x99\x40\x0b\x87\x6d\x1e\x5d\x8f\x4c\x8d\xf2\x24\x3f\xf2\x4e\xea\x58\x72\xa9\xb4\x69\x5e\x41\xdd\x2c\xde\x72\xf9\x03\x8a\x85\xcf\xe6\xb8\xa2\xcc\x99\xfc\x3e\xf2\xba\xdd\xe7\xfb\x32\xa0\x92\xab\x44\x7a\xb0\x6b\x8f\xb9\xd3\x74\x53\x46\x41\x88\x05\xa8\x13\xbf\xcc\x0e\x87\x2e\xb9\xe3\x90\x24\x71\xe2\x2b\x13\x96\x90\xe6\x44\x15\x86\x3f\x1d\x54\x40\xbd\x28\xc9\x1d\xc8\xfc\xe8\x11\xb5\x5c\x0b\x8e\xbf\xa0\x80\x8f\x27\xb8\x6e\x4a\x72\xad\x09\x76\x2f\x16\xed\x0b\x53\x1e\xf2\xca\xad\xd0\x22\x60\x09\x98\xaa\xda\xca\x79\x78\x5e\x51\xe1\xa5\x08\xd2\x34\x91\x0e\xd9\xcd\x65\x33\xd4\x53\x1e\xee\x46\x22\x90\x24\xd6\x9d\xf7\xe3\x22\xaf\xb0\xd8\xd1\xc5\x33\x82\x04\x01\xa2\x6b\x4a\xad\xe5\x1b\xb7\xb2\xb3\x93\x4f\x5a\x10\x96\x60\xf9\xd0\x92\xe9\x5e\xb9\x10\x79\xb3\x2a\x1e\xda\xa9\x3c\xa9\xca\xe5\x7e\x32\x49\xb9\x45\x5d\x9d\xea\x47\xd8\x73\x79\x71\x15\x7f\xa3\xd6\x88\x97\x4a\x83\xce\x30\xa2\x1f\xbd\x08\xca\x12\x6c\x48\x9d\x8b\xbc\x59\x36\x6f\xdd\x86\x22\xa8\x32\x85\x66\xbc\x3a\x2c\xaa\x2d\x7a\x70\xf7\xe1\x0b\x2d\xa8\xd6\x88\xcc\xf6\xd0\x88\x05\x3f\x2d\x9b\xb7\x97\x9e\x65\x9d\x1d\x19\x92\x14\xeb\x32\xe7\xc2\x55\x79\xfb\xe5\xe5\xd1\x1d\x0e\x25\x90\x81\x8a\xda\x13\x1c\xcb\xea\x62\xf2\xcc\xe1\x79\x59\x14\xa0\x85\xcc\x66\xf1\xf2\xba\xdc\x6d\x5f\x76\xdf\x57\xcf\xee\x52\x98\x36\x3a\xb1\x27\x33\xdf\xb0\x0c\x34\xfc\xa2\x48\x41\x6c\xac\x8e\x65\xcf\xeb\xf6\xea\x95\x16\x71\x10\x62\x05\x6e\xb7\x07\x6c\xd7\x0e\x0a\xd0\xd3\xcb\x80\x48\x28\xc5\x07\x74\xaa\xc0\xf0\x26\x30\x68\x99\xb9\x57\x43\x24\x21\x45\x3e\x6c\xcf\x58\xda\x1f\x52\x0a\x75\x53\xe6\x87\x33\x2c\xde\xf2\xd3\x83\x37\x0b\x96\x22\x8d\x24\xd6\xaa\x2c\x3d\xa7\x1c\x09\x5f\x48\x91\x2a\x15\x98\xda\xcc\x58\x43\x79\xb0\xd9\x88\x8c\x1a\xb3\xfd\x9d\xd9\x26\x4c\xf9\xc5\xbd\xd1\x22\x93\x80\xb2\xbe\xe5\x98\x20\x38\x7a\x54\x3c\x8e\x52\xdd\x61\x41\x26\x65\x14\xa6\x17\x39\xc1\x63\x89\x5f\x51\x94\x0d\xaf\xf2\x3f\xa1\xcf\x65\x19\x01\x61\x27\x8b\x77\x83\xdd\x47\x70\x9e\x30\x43\xe8\x2d\x4c\x8d\x65\xf4\xa8\xb9\x0a\x70\xaa\xd6\xe7\xa3\xd5\x7a\x76\xca\x48\x2e\x55\x17\x82\x50\x9c\x4b\x6e\xe1\x9e\xcb\xe6\x27\x4c\x02\x21\x28\x47\x8c\xe9\xc9\xaa\x11\x19\x72\x4f\x99\x77\x5e\xc2\x52\x88\xc4\x5c\x63\x1b\x02\x56\x39\x8c\x55\xed\xa5\x10\x4a\xf7\x63\xf3\xd9\xe9\x74\xc8\x8d\x45\xa7\x91\x8b\x1f\xd2\x4b\x84\x8c\x23\x61\x4b\x59\x27\x93\x6f\x9e\xab\xd3\xe1\xdc\x1d\x4f\x23\x15\xf8\x7d\xd2\x48\x5a\x8e\xe6\x87\x14\x61\x60\xad\x7e\x77\xb9\x2c\x77\xdc\xbb\xd7\xbb\x93\x28\x6d\xb8\x5a\x70\xe4\xf9\xc1\xe7\x14\xf6\x20\x44\xa6\xdf\x77\xb7\xfa\x75\x77\xb7\x72\xea\x67\x52\x00\x64\x08\xed\xb4\xf0\xe3\x1e\x8d\x63\x7c\xc9\x3a\x48\x31\x1d\x9c\x6f\xfd\x9b\xaa\xad\x97\xc8\xa9\x82\x5e\x2d\x78\x02\x9d\x2c\x49\x14\x04\x1d\x8b\xa0\x81\xce\x98\xd9\x0d\x48\x13\xe4\x77\x6c\x1a\x2e\xf2\x43\xfe\x27\x5e\x59\xa7\x11\x27\x25\xe1\xca\x22\x26\xb6\xf9\x01\x6c\x32\x3b\xd8\x0e\x24\x85\xd8\x3f\xb5\x9e\x15\x6d\xed\xc1\x3c\x77\xe7\x3e\x6f\x57\x4a\xaa\x8d\xd5\xdf\xce\xb5\xbf\xed\x94\x30\xa1\xfa\xe4\xf4\x91\x61\x4c\x31\x5f\xf7\xa1\x47\x3f\x25\x96\x61\x12\x4a\x47\x81\xf8\x87\xff\x63\x16\x63\x1f\xdd\x32\x87\xb0\xa2\x42\x07\x70\x0f\x19\xca\x2c\x22\xbd\x49\xb9\xfb\xc8\x9b\xb7\x9d\xe2\x57\xf2\xbd\x37\x03\xaf\x89\xed\x42\x86\x3a\x42\x40\xcd\x1d\x38\xb0\x3c\xbf\x0d\xb1\x93\x8c\x18\x1b\x0e\xa3\x80\xd3\xc0\x02\xaa\x26\xd7\xed\xb4\x06\x63\x94\xf1\xf7\x68\x74\xee\x6c\xd4\xe4\xa8\xf5\xf9\x58\xea\xfa\xbf\x67\x5e\xdd\x42\xea\xc9\x28\x20\x28\x5b\xdd\x86\x39\xf7\x3c\x3f\x6c\xda\x74\xa4\x71\x78\x8a\x76\x95\x7b\x2e\x9b\x9e\xcf\x82\x94\x11\xd5\x38\x6b\x91\x96\x68\x66\xeb\x7c\xf1\x4b\x7f\x2e\x44\x49\x84\x13\x6e\xd7\xa6\x7f\xe7\x06\xbe\x40\x3f\xf1\xb8\xf1\x9b\x23\x19\x61\x08\x68\xfd\x76\xae\x38\xa2\xb2\x8d\xd2\x51\x92\xb5\xac\x8e\xe7\x03\x1f\x1a\x51\x4b\x99\xf2\x18\x94\xed\x7e\x61\x4e\xc8\xbe\x2f\x97\x5f\x77\x58\xc6\xf7\x63\x24\xa0\x0e\xa1\x82\xf7\x5d\x8d\x0c\x6d\x35\xcc\xb0\x65\x16\x31\x6a\x17\x0b\x0b\x23\xb7\x82\x6e\xca\xce\x99\xe9\xc7\xc7\xc3\x2c\x88\x5c\x65\xe3\x1d\x0e\xe5\x09\x2a\x83\x4d\xc2\x26\x17\x42\x21\x8e\x30\xae\x02\xb5\xdb\x2d\x2e\x0c\xdf\x8e\xa2\x82\x43\x7b\x4d\xbe\x71\x21\x45\x64\xc4\xeb\xa0\x79\x73\x66\xd9\x77\xe7\x76\x0e\x74\xbd\xbc\x76\x0c\xd2\x24\xe7\x0f\x77\xfe\x4f\x4a\xa1\xd6\xc9\x4a\xc2\x81\x17\xea\xbd\x5e\x54\x25\x6f\x72\x17\xdc\x49\x19\x9a\x4d\x0a\xa9\xbc\x4f\x65\x01\x97\x6f\xa7\x6d\xf9\xfd\xad\x3c\xc0\xbd\x31\xad\x1c\xfe\x44\x45\x35\x8a\x3e\xec\x4c\x83\x7b\x76\x38\xac\x79\xbb\x4c\xbd\x82\x61\x04\x61\xb8\xe3\xdc\xad\x6d\x00\x65\x3f\x0a\x89\x71\x0e\x37\x81\xac\x71\x30\x70\x6b\xf3\x88\x7a\x33\xba\x9d\x00\x44\x19\x19\xe3\x8f\x0e\x2b\xe4\x49\x2b\x52\xb3\x0c\x1f\x75\x5e\x3f\x20\x69\xd2\xff\x3d\xd3\xa8\x54\x80\x2f\xb9\x0f\xbb\x9f\xba\x2e\x94\xd4\x40\xa2\xa4\x13\x06\xf1\x85\x39\x3b\x73\x55\x10\xc6\xd8\x1d\x3b\x41\x95\x97\xaa\x4f\x88\x52\x41\xc8\xc3\x0e\xb9\xb2\x52\xc8\x40\x5b\x35\x70\x05\x05\xf6\x39\xde\xf0\xa2\x14\x09\x13\xac\x89\x3c\x96\x7b\x07\x72\x9d\x44\x2e\x2a\x9a\x40\xea\xd6\x82\xf0\x17\x7f\xd2\xfe\x63\x51\x54\x33\x15\x4e\x10\xd1\x06\x0b\xbb\x0a\x49\x82\x70\xd1\x2f\xfc\x1d\x06\xa0\x43\x15\x12\x40\xd8\x8b\x49\x5e\x0e\x87\x2b\x39\xa2\x61\x4c\x92\xba\xca\x96\x0a\xad\x76\xab\x13\xe5\xb8\x83\xd3\xa1\xbc\x8c\xca\xe2\x2a\xd4\x21\x2e\x40\x0a\xb0\x02\xe4\x9f\xb8\x3d\xcc\xa8\x31\xb3\xff\xfa\x7b\x1a\x04\xc1\xe0\x87\xb1\x08\x62\xa7\x61\x73\xce\x55\xbd\xc9\xff\x04\x7f\x2c\x35\x91\x81\xe8\x40\x3e\x5d\xa4\x64\xc7\x44\x81\xc0\xc7\xf4\xdf\x33\x6f\xa0\xa2\xee\xa3\x71\x60\xd6\xd7\xbe\x8a\xf1\xe0\x86\xc6\x69\x06\xa6\x44\x71\x38\xec\x0e\x5c\xdc\x2a\xa9\xab\x58\x28\x07\x5e\x30\xe5\x6b\x87\xb3\x9d\x5f\x8c\x58\xc7\x8d\xcd\xc1\x7e\x3c\xa1\x21\x33\xe2\xe6\x0d\x7a\x86\x4c\x89\xd8\x8e\xbe\x31\xa1\x82\x44\x3d\xda\x1c\x28\x4c\x57\xae\x09\x33\x2a\x49\x09\x22\x5b\xda\xc5\x7c\x65\x3b\x12\x0b\xee\x24\x89\xa4\x4a\x64\x8a\xee\x0e\x26\x71\x6a\x9f\x7d\x57\xd8\x54\x89\x62\xa8\x6b\x9f\xd7\xbf\x43\xfd\x3d\x2f\x8a\x2e\x19\x56\x29\x35\x75\xe1\x99\x5f\x6f\x55\x1a\x11\x84\xad\x3f\xad\x9e\x0d\xc8\xc0\x1f\x48\xa4\x01\xdd\x9f\x4f\xa8\x60\xbe\x35\x46\xc5\x6b\x9e\xdf\xc8\x5d\x54\xaa\x4c\x45\x42\x9c\x2f\xb3\x42\x79\x3e\xd9\x78\x77\x1d\x7e\x28\xa3\x11\x76\x2e\x78\xdd\xc6\xd1\xbd\x59\x92\xc5\x86\xe4\x60\x62\xf4\x5d\x35\x08\xd2\x55\x96\x12\xec\x88\x3c\x5d\xc4\x60\xe5\x57\x3c\x24\x98\xaf\x3c\xf8\x10\x4b\x71\x26\x18\xf1\x8d\x3b\x0b\xb9\xb8\x71\x0d\x9c\x0b\x93\x38\x55\xf0\x9e\x97\xe7\x1a\x1f\xae\x3b\x91\x08\x12\x4c\x4e\x10\xb6\x8d\xc9\xf8\x04\x9e\x53\x09\x22\x9c\xbe\xa4\xc9\x2c\x26\xf1\x48\x4a\xa4\xa9\xf5\x56\xb4\x54\x84\x49\x02\xdc\x70\x49\x11\xca\x48\x5d\x2d\xca\xa2\x6e\xaa\x33\xc2\xb9\x06\x03\x64\x06\x08\xa1\x3f\xc1\x7e\x0f\x6a\xb9\xfd\xd2\x35\x6c\x94\xd4\xa1\x55\xbd\x39\xe4\x70\xae\xea\xdd\x09\xaa\x1d\x78\x50\xba\x52\x49\x84\x3b\xd5\x66\xbb\x1c\xbc\xca\x2a\x8b\xb0\xcb\xeb\x6c\x4a\xa7\x85\x2a\xbb\x40\x55\x29\x61\xf2\x11\xd1\xae\x1a\xb0\x79\xcb\x1b\x74\x3e\x3b\x94\x95\x5f\x85\x95\xca\xf0\xb7\x54\x56\xf0\xcc\x4b\x19\xf6\xfc\x42\xa5\x02\x12\x61\xaf\x7d\xd7\xcb\x0d\xae\xcc\x6b\x07\xd7\xaf\x43\x16\x75\x6a\x1a\x03\x6b\x9e\x69\x39\x3d\xf7\xb9\x24\xd6\xa9\xab\x6c\x22\xb0\xeb\xaa\x13\xab\xb4\x32\x8e\x91\x47\xac\x2a\x1e\xa1\x68\xee\xbb\x4e\xab\xd2\x90\x60\x4c\xa2\x79\xdd\xcc\xcf\x97\xbe\xe6\x05\x10\x95\x22\xe0\x61\x73\xe4\x55\xe3\xa6\x25\x50\x1a\x90\xbe\xea\xe3\xaa\x18\xc5\x42\x40\x35\xe0\xf2\xbb\x38\x40\x59\x8f\x0f\x86\x41\x8a\x85\x1f\xae\xd4\xf2\xda\x0a\xcd\x0d\xa2\x06\xde\xb7\x87\xc6\xf9\x26\x0d\xb6\x16\x08\xb3\x14\x43\x8f\xd7\x5c\x29\x5f\x2c\x86\x50\x19\xd3\xfc\x1a\x0e\x7a\xa7\xc0\xcc\x35\x77\x90\x65\x1a\xeb\x19\x1c\x23\xa9\x79\x87\xc8\x06\xa6\x53\x24\xce\xae\xcb\xef\x5f\xaa\x87\x03\xf7\xc9\x1b\x44\x89\x88\x2c\x51\x6d\x0d\x05\x3f\xe4\x7f\x7a\x0d\xdf\xdb\x13\x09\x22\xc1\x31\x68\x41\xa6\xa8\x95\xc3\xb7\x87\x62\xda\x6b\xc6\x23\x79\x4d\xdd\xe7\xe3\x9a\x20\x24\x11\xc1\xae\x21\xe2\xbf\x50\xdb\x59\x0e\xfd\x5e\xda\x21\x12\xeb\x5f\xeb\xd7\x25\x86\x9b\x9b\xe5\xe2\x05\x55\x6f\x7e\xdf\x6d\xb6\xb3\xd7\xad\x1f\x67\x19\x93\x58\xa3\xdb\xf4\xca\x81\xa3\x22\xf3\x70\x3d\x81\x34\x08\x50\x1e\xee\x5c\x43\xb5\x2b\xb5\x76\xae\x0f\xfe\x70\x64\x44\x5c\xce\xf9\x41\xb5\x61\xa3\xf5\x89\xea\xbf\x80\x90\x86\x1a\x79\x07\xa6\xd4\xb4\x2c\x54\x3d\x1b\x2d\x26\x90\xa6\x11\x40\xa7\xbc\xb9\x73\xd8\x1d\x3e\x82\xc5\x40\xc6\x42\x6c\xa8\x0c\x0d\xf7\x48\xe4\xe6\x43\x66\x83\x3d\xac\x81\x0d\xac\xb6\x24\x70\x1e\xe0\x83\x3f\x96\x2a\xd7\x17\x8b\x17\x71\xee\x51\xc3\xaf\x11\xa9\x90\xa9\xb3\x90\x3c\x96\x6b\x7e\xf6\xbd\x06\x10\xd2\x78\x8c\x1b\xf4\x58\x1b\x50\xaf\xa1\xba\x76\x07\x97\x20\xa9\xa9\xf3\xab\x06\xf8\x11\xd1\x31\x6d\xd8\xe9\x6a\x16\x20\x99\xc4\xd5\x01\xf7\x05\x13\xb7\xb4\x01\xd2\x1c\xa0\x40\xbb\x54\xe5\x07\x46\x0a\xe3\x4c\x7b\xcd\x0b\x8b\x6b\x1f\x83\x31\xa1\xdd\xa2\xed\x22\xe0\x62\xa9\x81\xb7\x59\x2f\xf4\x01\xa5\x35\x5a\x93\x36\xfc\x07\x78\xb6\xc3\x9c\xcb\x1f\x7d\x5e\xc1\xf0\x72\x20\x03\x6e\xe5\x4d\x9f\xe1\xe3\xe7\x69\x14\xe8\xc8\xe8\x24\xcc\xd5\xa9\x0d\x2d\x5c\x69\x1f\x7f\x82\x8d\x72\x75\x10\x18\x83\x3a\x54\xd4\xaa\xcb\x35\x06\xbb\xbf\xb8\x83\x11\xc3\x15\x6d\xd3\x1e\xfc\xb8\x16\x57\xd1\x41\x62\xac\xe0\x71\xd3\x47\x4d\x42\x7b\x80\x5a\x71\xd4\x63\x5e\xdc\xf1\xdc\xff\x35\x33\xa5\x7d\x5d\x56\xfd\x34\x52\x53\x01\x5a\xfa\x55\xcc\xb3\xee\x06\x7c\x27\x4d\x35\xc5\x68\x70\x6d\x94\x3d\xd0\x72\xa7\x28\xc0\xaf\x29\x3a\x24\x14\x45\x16\x9e\x67\x9b\xbb\xd9\x3f\xfd\x5f\x99\x90\xda\x1b\xe0\xde\x3b\x77\x1d\xa9\xc3\x28\x40\xcb\xb6\x8f\xb7\xbc\x41\xe2\x72\x27\xd5\x36\xac\x1a\xe9\x30\xd5\x86\xee\x50\xee\xf7\x07\x58\x1f\x4a\x83\x96\x04\xb5\xe5\xfb\x6b\xb1\x40\xa9\xc3\x36\xf0\x30\xe5\xfc\x29\x43\x22\x37\x4a\x85\x08\x59\x2c\x10\x98\x37\xbc\xaf\x2c\xce\x70\xc9\x6d\x8c\xe0\x0d\x96\x2b\xbc\xbd\x9a\xd4\x0c\x20\x23\x0e\xd3\x9b\xcb\x1b\x84\x35\x1d\x71\x45\xe1\xff\x6b\x57\xe1\xce\x01\xa1\x31\x7a\x3d\xf3\x4a\xe5\xbc\x70\x51\xb4\x8e\x03\x86\xfc\x56\xb4\x55\x18\x6e\xe7\xe7\xbe\xd8\x4f\x7f\x2b\xd1\x31\x35\xf7\x1c\x2d\xb7\xf2\x3f\x91\x6d\xb7\x2d\x0f\xd0\x97\x70\xd1\x31\x8d\xf0\xdd\x7e\xd1\x1a\xf1\xdf\x76\x71\x5c\x1d\x4f\x37\x02\x2e\x1d\xdb\x4e\x93\x89\x73\xa1\xf9\xde\xc5\xb9\x3a\xe6\x89\xab\x51\x43\xfe\x0e\x57\xa1\xdb\xed\xb2\x8d\x4e\x23\xe3\xcd\x66\x24\xcd\x96\x9b\xc5\xec\xd1\x35\x95\x75\x9a\x19\xff\xc9\x1a\xb3\xc7\x81\xd4\x7b\xf7\x00\x52\xc9\x0d\xe0\xb0\x5e\x5c\x1f\xe4\x61\x14\xf2\x9e\xc7\x33\xf2\xa2\xea\xeb\x8a\xb4\xe6\x10\x62\x91\xe5\xdb\xf3\x7a\xe1\xbe\x9e\x6b\x0a\xba\x83\x50\x6e\x67\x2f\xce\xad\x75\x92\x6d\xac\x05\x33\x5b\x1d\x92\x36\x50\x02\xbd\x53\xf4\x19\x7e\x9b\x90\xca\xb2\x7b\x8f\xc7\xbc\x69\x40\xf5\xe9\x57\x5a\x12\x8e\xf5\x31\xc9\x4f\x5c\x7a\x3b\x4e\xa9\x65\x14\x1a\x93\x5a\x6f\xdc\xe2\xba\xba\xc3\xb3\xcb\x98\xe1\x92\xb7\x94\x65\x8d\x96\x9c\x6d\x78\xe5\x4e\xa2\x2c\x2a\xfa\x54\x95\xea\x2c\x1b\xb6\xf3\x5e\xcb\x52\xab\x54\xe2\x3b\xf8\x0a\xed\xf6\x5f\x16\x7f\xfa\x45\x05\x68\x68\xe4\xa8\x16\x0f\x8b\xd1\x55\x03\x8f\xb1\xef\xe5\x21\xfd\x5d\xa3\x46\xeb\x34\x31\xce\xfb\xbc\xaa\xca\xa6\x5e\xf0\xf3\xfe\xcd\x7e\x9b\x0a\x82\x40\x06\x89\xab\x3b\x03\xdc\x9f\x5d\xd9\x40\x05\x01\x33\x52\xae\x9d\x5b\x96\x61\x07\xcf\x2f\xb3\x61\x49\x47\x05\x24\x26\x91\x76\xa1\xc7\xfd\xb9\x36\x96\x04\x7c\x3c\x4a\x98\x75\x6d\x67\x94\xb3\x7b\xa4\x95\xfe\xc5\xa8\x80\x92\x10\x1d\x89\x9b\xbe\xb1\x39\x2e\xa3\x9b\xb7\xfc\x34\xe5\x06\xa6\x02\x9a\x19\x80\x77\x5e\x28\xf8\x04\x35\xbf\xb4\x2b\xd6\x14\x82\x5a\x05\x54\x50\x3c\xfd\x1b\xaf\x2d\x15\x76\xd9\x91\xac\x54\x10\x12\x86\x77\xb9\xf4\xee\x34\xee\x00\x23\x38\x3b\x1d\x0c\x7d\x38\xf3\x54\x10\xc6\x32\x35\x18\x97\x8b\x99\x49\xb7\x38\x4b\x2a\x60\x24\x54\x83\x49\xd4\x2e\xb5\x3d\x9c\x85\x0a\x18\xd7\x46\x1c\xfc\xe9\xa9\x0d\x74\xc4\xf9\x32\x38\x1c\x33\x81\xd4\xa4\xa7\xb2\x02\xd4\x6f\x28\xf3\x9f\xa9\x76\xa9\x20\x4e\x83\xc8\x91\xc2\x31\x10\x1f\xfe\xf6\x98\x07\xb8\xa3\xb4\xab\xfd\xb9\x33\xce\xbf\xba\x82\xd1\xad\x4c\x32\x23\x4a\x76\x34\x02\xb6\x13\xfa\xea\x2a\x48\x83\x14\x59\xb5\x86\x47\xfd\xd4\x26\x19\xfc\x30\xd8\xf1\x54\x90\x52\x4f\xe6\x79\xc8\xd5\x8b\xb6\x05\x2a\x0b\xe7\x52\x41\x9a\x1a\x5b\x04\x93\xa8\xbc\xf2\x42\x95\xc7\xfb\x7c\xff\xd6\xd0\x3b\xe0\xcd\xdb\xa4\x70\x69\x9b\x7f\x10\xee\x78\xa4\xeb\x1e\xf0\x48\x05\x19\xc4\x0e\x4e\xfa\x74\xae\x9b\xcd\x8f\xfc\x34\xe5\x24\xe8\x77\x07\x15\xf0\x84\x21\x6b\xf3\x01\x06\xbd\xff\xf6\x80\xa1\x93\xb4\x77\xce\x4e\x27\x5b\x5d\xed\x86\xa8\x54\x05\xbd\x6a\xf3\xae\x86\x66\x87\xd3\x6b\x77\x2e\xf8\xb9\xbb\x0d\x22\x4e\x12\xe6\xb8\x75\x58\x40\x1d\x5d\x91\x80\xcc\x28\x67\x95\xda\x3b\xb8\xbd\xc2\x3b\x14\x67\xb8\x1e\x2c\xdb\xd7\xb2\xdd\x2b\x7e\x5b\xcc\x36\x5f\x7a\x31\xb2\x0a\xa4\x20\xc8\x92\x37\xeb\xbd\x89\xe4\xbf\xad\xd7\x8f\xbf\xbb\x01\x4a\x25\x48\x06\x15\xd0\xec\x78\xaf\x6f\xa0\x02\x88\x22\xbc\x11\x35\xd7\xd0\x5c\x9e\x4a\x05\x2f\xfe\xb4\xa0\x03\x9f\xf1\x7f\x2b\xea\xd2\x04\xe9\xfe\x3e\xb4\xbb\xb9\xdd\x24\xde\xf8\xf1\xd4\x2e\xe1\x43\xbf\x6b\x33\x8e\x04\xa9\x44\xa1\x5e\xc3\xf9\x9a\x00\x59\x2a\x12\x64\x1c\x2c\x3a\xd9\xd2\x71\xdc\x01\x1e\x07\x3d\xda\x42\xbb\xc7\x4c\x76\x08\xed\x70\x12\x0a\x24\x16\xac\xf9\xc5\x69\x6f\x4c\xae\x49\x84\x12\x9a\x3a\xd1\x3a\x13\xa5\x2c\x0d\x27\x7f\x38\xdb\x09\x0d\x03\xc2\x7a\xd2\x42\xfc\xb3\x57\x6a\x55\x84\x5a\x85\xd1\xd3\x81\x5f\x26\x2d\x2f\x47\x67\xd3\x12\x81\x46\x2f\xcf\xcb\xdd\x7c\xf5\xf8\xb8\x7a\x79\x76\x17\xca\x82\x24\x36\x6f\xec\x07\x54\x12\x75\x7c\x10\xc9\xd9\x7f\xeb\x09\x8b\x3c\xe9\x6b\x25\xcb\x76\x23\xc4\xde\xf2\xf2\xda\x48\xc5\x7d\x40\x67\xf8\x62\xb8\xe2\xfb\x4d\xf4\xcd\xe0\x6b\xa2\x20\xc0\xc5\xd7\x48\x35\xbc\x9c\xfe\xe2\xaa\x22\xc1\x90\x77\x07\xc7\xbc\x7d\xf5\x0e\x07\x4b\x9c\xc9\xa1\xde\xc0\x4d\xc0\x8f\xfd\x70\x4c\x42\xac\x0e\xb4\xfb\x8b\x69\x36\xfc\xe2\x8f\x48\x2c\x82\x9e\x6b\x30\xa2\xc9\x97\xd1\xb3\x89\x79\x8c\xa0\x2e\x13\xd2\xfa\xb7\x74\x2a\xff\x50\x24\x16\x29\xbe\x6a\x6d\xca\xb2\x13\x5c\xfe\xd8\x1d\xcb\x02\x2e\xee\xcb\xd2\x50\x60\xc0\x53\xe3\x25\x63\xcd\x9c\xfa\x63\xcc\xd8\xf4\xcc\x7a\x7c\xfa\xc1\xfd\xca\x28\xc1\x70\xf5\xc8\xab\x1f\xdf\x6a\xa8\x66\xb5\x63\x21\x0f\x27\x5d\x16\x07\x06\x62\x61\x37\x42\xd4\x05\x9b\xc6\x3e\x2a\x92\xf1\x2c\x33\xe2\xd2\x58\xbb\x79\x05\x2e\xbd\x33\x93\x22\x3c\x14\xce\xfa\xf2\xe5\xdc\xc8\xf2\x38\xd4\x3a\x51\x44\xb0\x48\xd8\xdd\xde\x34\x94\x7b\x3c\x0e\x45\x44\x14\x63\xe1\x63\x0b\x75\x33\x85\xc7\x98\x54\x36\x51\x44\xa8\x2c\xb6\xdf\x8a\x9d\x83\xeb\x40\x49\x11\x01\x0c\xab\xac\xaa\x5d\xc9\x51\xb8\x5c\x13\xe6\xbf\x17\x22\x43\x76\x05\x79\x2e\xf2\xb2\xbf\x88\x11\x19\x10\x5c\x4e\x6a\x64\xa9\x5b\xfd\x88\x59\xa1\x16\xfc\x70\x40\x84\xf6\x4d\x82\xea\x2d\x91\xab\x29\x69\x34\x45\x64\x48\xb0\xb4\x7b\xe8\x62\x23\x22\xb3\xd4\xbd\x58\xce\xa4\xe6\x5a\x14\x72\x74\x1a\x1e\x87\x36\x95\x59\xf9\xc7\x22\x21\x08\xb5\xc7\xfc\x19\x3e\x81\x69\x78\x75\x76\x47\x6e\xed\x00\xeb\x9e\x55\x9f\x0e\xf9\xd5\x5b\xe2\xc6\x28\xcd\x03\x57\xe8\xf1\x78\x1c\xac\x6d\x8e\xe6\x96\x4e\xcd\x5a\xfd\x5a\xd6\x6f\x9c\xf7\xa8\xb5\x8a\x06\x81\x36\x4e\x0c\x5e\x1e\x72\xf0\x25\x34\x20\x51\x16\x3b\x20\xac\x99\xdf\x7d\xc8\xcc\xf4\x8b\x4b\x03\x4a\x99\xd7\x45\x58\x38\xe1\x19\xef\x7c\xa6\x68\xc0\x52\x84\xc8\xd7\x87\xdc\x69\xf9\xfc\x4f\x87\xc3\x9a\x38\x61\x9a\x3a\x1b\x29\x0c\xf1\x9d\xba\xa7\x49\xca\xba\xbd\x9b\x92\x38\x8a\x3b\x24\xcc\x63\xd9\x99\xb2\xff\xd2\x1f\x95\x45\x4a\x3a\xea\xbd\x6b\x90\x0e\xbf\x91\x86\xc6\x7b\xad\x38\x1f\x35\x22\x74\xdd\xdf\x59\x82\xee\x74\x75\xbb\x58\xb8\x32\xd0\xf9\x0a\x0b\xae\x28\x4d\x41\x04\x43\x0d\x12\x03\xf6\xbd\xcf\xe1\xa0\xea\xf1\xd7\xf1\x10\xb1\x8c\x47\x5e\x9c\xf9\x61\x28\x8a\x30\x1a\x09\x14\x1b\xb8\xf3\xed\x62\x96\x57\xee\x67\x85\x19\x45\x34\xf4\x81\x37\xf2\x6d\x58\x10\x6d\x0f\x2a\xaf\x16\x7b\xb8\x95\x59\x2b\xca\x02\x2f\x01\xb4\xfc\x3c\xb5\x91\x4f\x71\x7b\x6c\xc8\x40\x8e\x99\x93\xbc\xd8\xe7\xa2\x4d\x19\x6b\x68\x54\x5e\x8b\x73\x55\x63\x35\xf8\x26\x9f\x52\x51\x4c\x01\x7a\x94\xba\xfb\xb2\x82\x7c\x6f\x5a\x79\xb5\x25\xab\x5c\x05\x6b\x23\x81\x16\x45\xe3\x24\x40\xf7\x11\x04\xda\x1c\xa0\xee\x6b\x81\x29\x1a\xa7\x31\x82\x08\x4d\xcf\xc1\xff\x35\x33\x3a\x5b\xf3\x03\x97\x3f\xd6\xc0\xab\x43\x6f\x7e\x26\x81\x54\x46\xce\xbb\x69\x6f\x45\x3b\x7b\x5f\xc7\x7c\x26\x45\x13\xca\xe2\xd4\x2e\xc3\xff\x3d\xe7\xfe\xd4\x49\x96\xe0\xa6\x77\x9f\x17\x9d\x5f\xfb\x95\xbe\xad\xa2\x89\xd0\x3a\xec\x95\x32\xda\xc7\xbe\x2c\x50\x9c\x37\x1f\xcb\xe4\xba\x8f\x40\x86\xd5\xaf\xcd\x72\x3d\x7b\xed\x2c\xa3\x15\x4d\x49\x88\x2f\xf2\x2e\x37\xba\x9f\x9e\xc0\x32\x2b\xd4\x13\x34\x6f\xe5\x0d\x65\x2a\xf7\xf1\x08\xa4\x51\x2a\x81\xd5\xe2\xa5\x3e\x81\xcc\x1d\xd2\x52\xd1\x8c\x06\x26\xab\x34\xe6\x44\xa8\x4c\x85\x9e\x74\x57\xcb\xc0\xf0\xfe\x64\x61\x84\x3e\xea\xb3\x76\xdf\xbc\x2f\xab\x0e\xf3\x71\x75\x79\x3f\x11\x39\x54\x34\x63\x31\xb2\xda\xf4\xb9\xb9\x83\x77\xac\xd8\xb9\x23\x91\x46\x28\xe9\x91\x7f\xde\x3d\xcc\x9e\x96\xfe\xef\x49\x68\x7a\x67\xed\x37\xff\xba\x5a\x0f\x1c\x10\xc7\x67\x17\xc6\xd8\xa0\x2a\x0f\x07\x94\xfe\x1e\x8c\x4b\xaf\x90\xa1\x8a\xf2\x48\x19\xa5\x2b\x28\x9a\xa1\xcf\xb3\x1b\x90\x04\xce\x75\x70\x26\x9b\x33\x4a\x57\xf9\x63\x99\xc0\xc9\xb1\xab\x30\xb5\xb9\x46\x0d\x4e\x7e\x23\x4f\x5c\x5b\x7f\x93\x2b\x4f\x79\x1d\x5d\x89\x48\x09\x51\x1d\x66\xf7\xb5\xd3\xca\xf7\xdf\x2e\xb8\x06\x33\xc4\xff\x49\x06\x1c\x93\xb6\xd5\x40\xa1\xb0\x33\x76\xbd\x19\xdc\x51\x19\x85\xbc\x2f\x0a\xb8\x33\x8d\xc8\xd1\x20\x09\x18\x8d\x3c\xc2\xb1\x2c\xea\xbb\xaa\x3c\x9d\x50\x54\xf3\x0d\xbe\x97\xd5\xc1\xbf\x33\x2a\x92\x61\x32\xe0\xfb\x0f\xe2\x28\xaa\x64\x84\x9c\x99\xfb\x0a\x41\x24\xb3\xb3\x6c\xc6\x8c\x99\xe1\xe4\x53\x56\x51\x79\xfd\xfa\xfc\x30\x7a\x6f\x35\xf0\xcc\xf4\xd8\x50\x47\x4a\xf5\xd8\x47\xa3\x5f\x1f\x06\x54\x60\xa3\xe9\xdb\x69\x8f\x9e\x1f\x7b\x28\x1a\xbb\xf9\x5c\x77\x38\x55\x18\xc4\x3a\xf4\x85\xe7\xf6\x6e\x0c\x41\x35\x6e\x54\x22\x0d\x6d\x2c\x7f\x87\x6d\xf9\x6b\xd9\xdc\xd0\xa4\x51\x6d\x34\x62\x4c\x19\x7b\xcb\xec\xba\xca\xdf\xf3\x03\xec\xff\x42\x35\x56\x85\x44\x86\xc2\xea\xf3\xb6\x41\xcb\x65\x36\x84\x52\xd8\x51\x34\x34\x96\xd5\xcf\xe7\xa6\xca\xcb\x5e\x6c\x10\xd2\x24\x35\x98\xff\xb2\x8d\x86\xef\x73\xed\x2a\x63\x2a\x0c\x13\x81\x00\xa8\x03\xaf\xf6\xd0\xf5\xa6\x55\xc8\xa2\x14\x93\xb5\xbb\xf2\xd0\x5f\x83\x43\x16\x0b\x15\x5b\xb5\x5d\x7e\x30\x3a\x34\xa3\x1f\xc2\x44\x82\x09\xd0\x23\x7f\xe7\x96\x92\x3b\x1a\x11\x31\x81\x9e\xe6\xba\x34\x4a\x0e\x9d\x46\xbf\x0a\xa3\x28\x0d\x0c\xbf\x41\xad\x9b\xf2\x34\x3a\xc1\x74\xcc\x1a\x46\x99\x16\x7d\x85\xf9\xc1\x9b\xef\x2a\x12\x61\xc4\x8d\x87\x82\x83\xa2\x4c\x3f\xaa\x38\x20\x88\xc1\xdd\xe5\xf5\x2b\xec\xcf\x07\x5e\x4d\x15\x2d\x55\x18\xf3\xc4\x48\x14\xf2\x6a\xd0\xcd\x52\x61\xac\x88\x95\x3b\x97\x97\x5b\xca\x8e\x2a\x4c\x64\x8a\xcb\xd5\xa1\x5d\xd2\x76\x6c\x98\xb2\x87\xa9\x43\x3f\xd9\xd7\xc8\xe0\x4f\x0d\x93\xf2\xc6\x09\xd3\x28\x70\xc1\xea\xe2\x5c\x37\xe5\x11\xaa\xed\xe7\x4b\x95\xef\x9f\xe4\xc7\x95\xb3\xf5\xf0\xfe\xa5\x59\x86\x7a\xc7\x58\xe4\xdb\x35\xe5\xee\x74\xee\xc1\x75\x87\x63\x33\x8b\xfa\x37\x6a\xcc\x73\xde\x34\x07\x38\x1d\x89\xfb\xe1\x3c\x48\x1d\x36\xe0\xb9\x54\x80\x5e\x49\xe3\x5b\xc7\x89\xce\x2c\x5d\x72\x0b\x9f\x03\x17\x44\x15\xf2\x08\x42\x03\x0d\xb1\xca\xae\x83\x7e\x87\x0a\x79\x62\xa4\xe8\x7f\xe7\x97\xcb\xf0\xbe\x73\x2e\x31\x5a\xb5\x16\xb7\x58\x6f\xd7\xbc\x2b\xea\x84\x5c\x0b\xec\x47\x2f\x9e\x7f\x9f\xbb\xbf\x09\xaa\x43\xbb\x22\x3f\xc3\x67\x63\xd1\x6f\xc3\xdf\x2b\x04\x41\x71\xb3\xdf\xec\xff\x05\x99\xfb\xb4\x24\x0a\xf5\xf8\x77\x7b\xa3\x47\x73\x55\x4a\x0b\x65\x22\xb1\xc3\x3b\x7b\x98\x6d\x46\x94\x25\x15\xca\x94\x60\x10\xaa\x01\x06\xa1\xe2\x08\xc2\x37\x3a\x23\x67\x58\x47\x3c\x94\x4d\x03\xd5\xc5\x4b\xd2\x4e\x6d\x25\xa1\x54\x09\x66\x98\xed\xeb\x64\xc5\xcb\x1c\x2a\x4f\x85\x2a\x48\x0d\x5f\x12\xb9\x9b\x4b\xab\xde\x39\xba\x00\x88\x19\xf6\x44\x9b\xe6\x60\x59\xb0\xee\xe3\x9a\x19\x92\x9f\xdb\x36\x9e\x06\x92\xd0\x2a\xd4\x4a\x91\x8e\x90\x35\xe9\x2c\xa0\x58\x40\x28\x36\xb0\x7f\x3f\x17\xff\xc8\xf9\x53\x7e\x33\x4b\xfd\xe9\x16\xc6\x82\x28\xc4\xa4\x6c\x56\xc0\xb1\xcc\xfb\xd3\x82\x05\x32\xc0\x92\xa2\x89\x7a\x8c\x93\x72\x59\x5d\x6c\x49\xb0\xdb\xa3\xc7\x45\x67\x46\xc2\xd8\x00\xe9\x9c\x93\xad\x9b\xe4\x8c\xc4\xde\x36\x61\x55\x5b\x51\xb7\x62\x8e\xf0\xe6\x2e\x3b\x61\x44\x29\xdc\x1e\x96\x9f\xfc\x78\x72\xa8\x12\x1f\xfa\xda\x41\x34\x22\xa1\x43\x42\xf9\xa6\xb6\xfb\x1e\x9a\x1a\xbf\x00\xae\x14\x5a\x55\x8d\x96\x5a\x46\xb3\x10\x53\x47\xa4\xce\xaf\xcb\xf2\x6d\xf4\xa6\xb1\x30\x33\x2e\xb6\x5e\xd9\xed\xfd\x96\x83\x79\x77\xd9\x21\x24\x98\xd3\x89\x81\x98\xf8\xe8\xb6\xfb\xdf\xcf\x98\xc6\x2e\xc6\x31\xc7\x9e\xb4\x03\x92\xba\x2b\x60\x91\x69\x0f\xed\xa1\x79\x38\x8f\xf5\x0e\x52\x37\x28\x53\x89\xc7\xca\x40\x75\x0f\x30\xd0\xfc\x53\x8c\x89\x28\x48\xfb\xb5\x77\x43\xe8\xd8\x96\x1e\xeb\x60\x1f\xe0\x64\x1a\xcf\xa2\xc0\x54\xde\x6b\x68\xfe\x51\x8a\x57\x64\xea\x4f\x04\x87\xdd\x2d\x88\x08\x47\x49\x02\xa3\x75\x9f\xba\x9f\x11\x51\x83\xbc\xb2\xc2\xbf\xd0\xc6\x0e\x4d\x4f\xcd\xf0\xdc\xf1\xf5\xdb\xc1\x14\xb7\xd6\xdc\x31\x99\x15\x8b\xa2\xcc\x61\x55\x76\xb2\xcc\x8b\x7a\xd7\xb3\x4a\x50\x2c\x12\x8c\x1b\x93\x36\xa3\x66\xf5\x54\x16\xcd\xdb\xe1\xd2\x8b\x6a\x7e\x2d\x0f\xe7\x23\x58\xa1\xa1\xd1\x8b\x14\x13\x65\x6d\xcd\xc6\xd1\xca\xe8\xe2\x62\x1a\x6b\x5b\x0a\x58\x15\xef\x65\x2e\x1d\xdf\x6b\xb0\xce\xb3\x38\x55\x61\xdf\x2f\xd0\xc0\xe4\x4d\xdb\x65\x78\xc2\x24\x89\x51\xfb\xc3\x00\xc6\x76\xb3\xba\x76\x52\x87\xf5\xb6\x5c\x57\xe5\x1f\x20\xa7\x85\x7b\x14\x4b\x34\xc3\x98\x75\xc1\x8b\x2f\xbc\x50\x07\xd4\xb7\x19\xcd\xe1\x94\x01\x02\x39\xdb\x5f\x99\xcb\x65\xf3\x36\x7b\xe7\xf9\xa1\x0d\xdd\xdc\x4a\xc3\xd2\x08\xb0\x36\xbe\x7b\x2b\x6b\x4f\x1d\x18\x6d\x75\xb7\xf9\x25\x8a\x65\x91\x29\x4d\x9f\x72\xf9\xc3\xd4\x94\xdd\x99\xb3\x24\x88\x2c\x3d\x6e\x79\x44\x00\xe9\xb4\x61\x4d\x3b\x92\xe0\xa6\xb6\xf9\x32\x0b\x77\x91\xb3\x8c\x55\x2c\x93\x24\x33\xce\x4d\x45\x5e\xbf\xd9\x34\xc3\x1f\xe5\xa9\xc6\xf6\xc1\x6c\xbb\x7d\x1d\xac\x5a\x9c\x6b\x22\x47\x39\x25\xd6\x1d\xf7\x15\xc0\x71\xe2\xfa\xec\xe7\x04\x68\x19\xb8\x42\xed\xa5\x40\xc0\x82\xa3\xf4\xb2\xd1\x7b\x21\x23\x69\x92\xc5\x9e\x24\xe0\x7d\x59\xd9\xdf\x38\x7a\x0c\x2a\x30\x2a\x18\x3f\xc0\x94\x04\x07\x5c\x4c\xc5\x94\xe2\x58\xd9\xb9\xcb\x2b\x90\x0d\x3a\x57\xb8\x43\x40\x00\x1b\x55\xf5\x59\xd4\xa6\x9e\x31\x3d\x19\x74\x40\xd0\xf2\xa3\xd9\xc3\xe2\xca\x54\x4e\x31\x1d\x1a\x5d\xc6\xf6\xed\xe1\x53\x21\x59\x14\xc4\x81\xf3\xaa\xaf\xcf\x47\xc5\x1b\x4e\x86\x93\x3a\x0a\x62\xe3\xb5\x7b\xcc\x8b\x75\xd9\x6c\x9c\x7f\xa3\x8a\x88\x88\x22\xb3\x92\x1e\x9a\xf1\x36\x1d\x51\x0d\xc8\x3c\x17\xe7\x8b\x67\x89\x8c\xbe\x9a\x85\x14\xdf\x01\xc9\x8b\x5b\x06\xe6\x6e\x64\x1a\xa2\xe8\xc2\xf7\x76\x79\x45\xd8\x1f\xa8\x6e\xc5\xeb\xae\x37\x62\xde\x79\xb0\x73\x8c\x73\x32\x5f\x6e\x08\xc4\xd8\xf2\xf9\x70\xae\x93\xde\xd5\x53\x45\x11\x95\xf8\x40\xe6\xbc\xce\x65\x7f\x6a\x45\x91\x85\x02\x56\x50\x94\xe7\x42\xc2\x82\x9f\x4e\x7e\xc6\x47\xb1\x6d\x16\x89\xf3\x65\xd1\x53\x4c\x9f\xec\x22\xb4\x83\x71\x45\x9c\xbf\xbc\x7c\x5d\x2d\xfd\x29\x12\x63\x34\x2f\x4a\xf1\xc4\x7f\x40\xbd\xac\x24\x0d\x5c\x24\x3f\x2e\xe4\x0e\xa6\x31\x0d\xfe\x67\x2a\x74\x8f\x62\x08\xb8\x71\x5d\xb9\xe6\x2c\xb8\x6f\x4d\x48\x18\xb5\x3f\xfc\xeb\x72\x3e\x9b\x2f\x5f\x77\xdb\x97\xdd\xd3\xec\xeb\x72\x47\xf0\x0f\x6e\x54\x4a\xd3\xc4\x90\xa8\x30\x5a\x33\xc9\xf2\x71\x42\x99\x7b\xf8\xae\x44\x69\x64\x58\xbb\x0f\xe5\x01\x8e\x7d\x7d\x6b\x15\xa5\xb1\xb0\xa6\xdf\xe6\x0a\x87\xcd\xee\xe9\x1b\x97\x05\x89\x51\xfc\xbc\xbf\x5f\x2d\x66\x8f\xbb\x5f\x5f\xb6\xab\xe7\x07\x04\xe5\xbd\xdc\xef\x9e\x5e\x9e\x7d\x0d\x2b\xca\x42\x86\xa5\xd0\xbc\x98\xc8\x83\xa6\x21\xb5\xc3\x19\xc7\x49\x8c\xfd\xad\xcd\xf6\x9f\x7e\x6a\x6f\xa1\x6e\x8c\xcf\x78\xaf\x61\xfc\xd3\x62\x78\xc4\x39\x45\xe6\x98\xc1\x07\xf2\x03\x8c\xca\x93\x91\x08\x23\x0c\x36\x94\xc5\x99\xd7\x66\x77\x74\x47\x53\x8a\x77\x09\xd1\x49\x7f\xf0\xeb\x52\xbf\x1b\x97\x99\x4a\x22\x47\xd5\x79\x0c\x7b\x06\x56\xdd\x7e\x18\x45\x69\x85\x36\x4d\x78\x29\x60\xf3\xc6\xab\xbe\xea\x81\x8a\x84\x64\xa8\x7a\x30\x87\xe6\xa5\x78\xed\xde\x19\x19\x06\x04\xfb\xf8\xcd\xa5\x97\x24\x47\x32\x36\x3e\x45\x77\xb3\x97\x75\x79\xa8\x7f\x70\x7c\x65\x56\x8b\x97\x0a\x93\xc0\x9e\x25\xbe\x6a\xd7\x22\x8c\x27\xb6\xb3\xc5\xb6\x7d\x7a\x8b\xd7\x6f\xab\xcd\xf2\x75\xb7\xfc\x6d\xfb\xda\xfe\xe9\xe5\x79\x37\x9f\x6d\xfc\xeb\x00\x94\x4a\x35\xc1\x19\x6f\xf7\xf1\x9f\xb4\x65\x86\xd7\x0b\x51\x90\x74\xb5\xbb\xdd\xa9\x77\xa9\x31\x51\x2a\xe2\x9e\xf1\xb1\xc9\x8b\xfd\xc1\xb9\x9a\xe2\x77\xb9\xd5\x61\xb8\x66\xc5\x34\x23\x78\xca\x6e\xd7\xab\x47\x8a\x40\x53\x3f\x69\xa2\xac\x15\x87\x22\xc1\x8a\xf3\x31\x2f\x8c\x59\x40\xbf\x49\xd0\x1e\x4d\xa4\x9f\x17\x1b\xae\xe1\x70\xe5\xe0\x6a\x87\x32\x16\xc4\x59\xf7\x76\xee\xda\xf4\x6d\x87\x6e\x59\x93\x10\x92\x98\x25\x66\x5d\xd8\x6c\x67\x0f\xcb\x1d\xd9\x6d\x57\xbe\x76\x18\x33\x6e\x7c\x8b\x54\xc5\xf7\x65\x81\xf5\xb9\x6d\x69\x0a\x16\xc3\x2f\x8d\x88\xc0\x17\x6c\x9b\x1f\xb1\xd3\xd0\x3e\x97\x5b\xd6\x7c\x93\x8b\x43\x1c\x31\x8a\xf9\xf3\x87\x23\x29\xb4\x7f\x0a\x71\x43\x58\x15\xaa\xac\x6a\x70\x7b\xaa\x3b\x2a\x43\xbc\xf5\xb3\xba\x86\xba\x9e\x4a\xea\x7f\x9e\xef\xc4\x71\xac\x42\xdb\xf9\x78\x3d\x57\xe7\x81\x76\x9e\x8a\xe3\xc4\x48\xa5\x9c\xf1\x8b\x65\x79\x3c\xe5\x87\xce\x2b\xb6\x1e\xac\xc1\xe9\xa4\x28\xa9\x8a\x63\x29\x75\x87\xc9\x5d\x43\xb5\x01\xeb\xfc\x4c\x26\xac\x65\x54\x1c\xab\x04\xb3\xa5\xbf\xc1\xf8\x9d\x2c\x2c\xc4\x09\x31\x91\x4b\xfd\x91\x37\xf2\x6d\x77\xea\x81\x3d\x55\x9c\xd0\xc0\x09\x7a\xde\x57\x00\x4f\x79\x81\xa6\x5c\xc3\xc7\x90\xa4\x61\x60\xc4\x6c\x1e\xcb\x3d\x62\x4d\xc0\x89\xc1\xde\xb8\x8d\x69\x44\x8c\x6b\x11\x7e\xd9\x6a\xfb\xb2\xab\x4b\xdd\x0c\x75\x58\xda\x51\x31\xe6\xa8\xff\x2a\x8b\x66\xd0\xcf\x8c\xb3\x88\x62\xb5\xc3\x3a\xdb\x3b\xf1\xf3\x6b\xac\xaf\x8a\xb3\xd4\x9c\x64\x9e\x37\xb5\xf4\x72\x7a\x2a\xce\x54\x1c\x18\xa3\x1a\xa8\x4b\x5f\x47\x8d\x33\x6d\x84\x08\xca\x76\xed\x9b\xd5\x1b\x2e\xab\x5c\xf7\xde\xf9\x4c\xc7\xa9\x9d\x00\x58\x78\x44\x6b\x16\x77\x90\x6b\x33\x1f\xf7\xd0\x38\x9c\xe2\x6b\x59\x0e\xfd\x72\x55\x2c\xa8\xb6\x8a\xb0\x75\x53\x95\x97\xd9\xe1\x30\xc8\xdf\x63\x91\x98\xc4\x19\x8b\xd5\xfb\x02\xd4\xb6\xb3\xf0\x69\x8f\x1a\xaa\xc8\x7c\xf1\x4f\xf7\x27\x19\x1a\xfc\xef\x31\x2f\x40\x61\x86\xb3\xab\xfb\x3b\x65\x2c\x53\xa3\x8b\xb8\x87\xe6\xae\x73\x7b\x26\xa1\x3b\x2c\x62\x74\xbe\x07\x87\xbf\x33\xba\xfa\xc3\x53\x28\x8d\x3f\x0a\xe1\x5a\x70\x3e\x7a\x9b\x74\x15\x4b\x00\x11\x79\x7e\x34\x52\x06\xb7\x25\xfa\x0f\xfb\x4b\x52\x34\x43\x6f\xce\xf2\xa3\xb8\xcf\x0f\x3d\x20\xc1\x44\x56\x90\x04\x91\x46\x69\xc1\xa7\xf9\x82\xd7\x6f\x83\x9f\x91\x10\xa2\x9c\x83\xf9\x4e\xf2\x42\xa1\xa2\x5e\xed\x8f\xa6\x29\xb1\x7d\x03\xc3\x26\x5c\x18\xff\xfb\x45\x0f\x70\xeb\x86\x4a\x8d\x40\xdb\xfa\x04\x46\xf7\x0b\x99\x53\x03\xb3\x95\xc1\x24\x4f\x68\x48\xf1\xbe\xaf\x0d\x2a\x6b\x5c\x13\x9c\xdc\x3d\x12\x9a\x46\xa9\xf1\x24\xad\xad\x82\x68\x73\x31\xcf\x74\x93\x2b\xd8\x96\x4f\xbc\xa7\xfb\xd9\xeb\x27\x25\x54\x84\x06\x9b\x63\xe8\x26\x58\x00\x7a\xee\x83\x60\x06\x77\x2c\x04\x8a\xb5\x22\xd4\xc5\x6c\x07\xff\x9d\x95\x26\x61\x81\xc2\xf5\xf7\xf7\xfb\x7f\xf4\x5f\xae\x24\x22\x0c\x59\x92\x2e\xdd\x16\xfc\x74\x7a\xca\x8b\xc9\x3e\x6f\x12\x07\x82\x45\x06\xbd\x2d\x7d\x31\xcd\xde\x9c\x51\x9e\x90\xb4\x8b\x27\x22\x66\x9e\x57\xdb\xd5\xec\x71\xf7\xf0\xf8\x32\x9f\x3d\xee\xee\x66\xab\xc7\xdf\x87\xa0\xaa\x24\xe6\x01\xea\xde\x58\x98\xd8\xeb\xd0\xdc\x40\x25\x09\xc9\x90\x14\x33\x7f\xf9\xf6\xbc\x1d\x7f\x38\x49\xd2\x2c\xec\x37\xe5\xeb\x3e\x38\x20\x49\xb8\x11\x03\xb5\xe0\xdf\x2a\xf4\x9f\xb3\xe0\x33\x54\xbe\xe5\xf2\xc7\xf5\xde\x9d\xa4\x71\xe4\xc8\x7d\x16\x90\x75\xe5\x80\xa0\x92\x2c\x96\x81\x73\xbd\x9b\x9d\x55\xde\x58\xdd\xc1\xe9\x89\x95\x81\xc2\xb7\xf7\x2e\xdf\xe7\x9f\xa2\x1c\x7f\x23\x8f\x05\xbe\xbb\x05\x7c\x36\x77\x80\xb5\x44\x6c\x7b\xb4\x6f\xa8\x57\x8e\xb2\x63\x45\x60\xe2\x01\xe9\x41\xeb\x28\x37\x38\x3d\x37\x65\xc8\xb1\xe0\xbe\x5a\xbc\xdc\xdc\x6e\x27\x57\xef\x44\x86\x22\x31\x5f\xe3\xb9\x62\xee\x48\x4a\x31\x19\xdf\x1d\x2d\x9e\xb8\x7c\x05\x59\xbe\xdf\x4a\xde\x13\xa9\x43\xf3\xaa\xc3\xa1\x51\xe5\xc7\xa8\x57\x9f\x40\x6c\x1c\x6c\xdb\x0b\x2d\xf6\x50\x74\xe2\xfa\x2a\x81\x84\x12\xab\x7f\x7f\x0f\x7d\x48\x9f\x29\x07\xd1\xf4\xdf\xf4\x3f\x6e\x68\x2a\x91\x1f\x09\xcd\xdb\xb6\x5c\x80\x17\xe0\x57\x09\x64\x19\x2a\x36\x99\xba\x16\xce\x31\x7b\x28\x0d\x08\x20\x8c\x67\x03\xcd\x91\x7f\x4e\x78\x9d\xa9\x34\x00\x8d\x0c\x85\x36\x80\x41\x5a\x56\x1b\x08\xf7\x2a\x44\xae\x58\x97\x06\x3a\xc6\x37\xea\xeb\xf9\x0f\x2f\xa3\xa3\x52\x92\x42\x6c\xe8\xcf\xb2\xac\xd4\x1d\xf4\x2a\x5a\xfd\x4b\xb1\x6f\xb1\x53\x1f\x1b\xfe\x04\x22\x28\x5a\x77\xac\xc3\xe7\x87\xc5\x76\xf7\x7e\xc3\xf5\xce\x8e\xa6\x84\xa1\x3a\xf4\x81\xd7\xcd\x3d\x97\x8d\x01\x0c\xf6\x0c\x11\x55\x4a\x69\x82\x34\x57\x23\xe9\x7e\x99\xb7\x09\xf5\xed\x0a\x4e\x4a\x95\xc2\x77\xc9\x90\x8f\x06\xa6\xb1\x2a\x0d\x03\x6a\xaa\x4c\xd5\xe5\xb4\x2d\x0f\x87\x79\x59\x3a\x1f\xd1\xd1\xaf\x3c\x8f\xbd\xc9\x54\x1a\x12\x63\x6d\x79\xff\x6d\x1b\xb9\x13\x26\x96\xd7\xfd\x51\x56\x3f\xb0\x46\x31\x7e\x22\x49\x2a\x98\xb6\x92\xa1\x5d\xf8\x3d\x19\x3c\xa6\x69\x98\x86\xd0\x13\xee\x5c\x76\x15\xb0\xd1\x4d\xce\x88\xc2\x74\x5f\x1b\xe4\x99\xa5\x04\x99\x22\xe5\x13\xef\x0c\x01\x54\x9a\x45\x0a\x49\x59\x27\x5e\x75\xf7\x6d\x74\x32\x19\x10\xee\x11\x41\x2b\x47\x3c\x55\x29\x4f\x12\x44\xb0\xf1\x29\xb3\x5e\x37\x06\x34\xb6\x15\x76\xbe\x22\xfb\xd8\x07\xe8\x4d\x55\x79\x53\x21\x29\x76\x1b\x8c\xe6\xe1\xf2\xbf\x84\xda\xed\xdf\xee\x07\x64\xb4\x2f\xa4\x32\x12\xd8\xf9\x2d\x2b\x05\xd5\xfa\xc0\x7b\xe7\x9d\x6a\x6a\xbb\x4f\x71\xca\x6d\x60\xe4\xe8\x14\x57\xf2\xd7\x2a\x55\x24\x72\x40\xf9\x6f\xb5\x95\x0f\x72\x87\x68\x16\x58\x38\xe8\x57\xb8\xac\xa1\xb2\x46\x5c\xf5\x50\x7d\xcf\xff\xc7\x7d\x8c\x31\x7c\xb9\x2b\xfe\xf1\xad\x06\xdc\x23\x87\x97\xa3\x54\x88\xe7\xb5\x4f\xcf\xba\x53\xb9\x5a\xa6\xfb\x76\x08\x24\x35\xf6\x66\x4f\x08\x21\xb2\xa4\xe4\xd9\xa0\xf0\xe3\xb5\x32\xef\x66\x2f\xf6\x96\x6f\x0a\x7e\xda\xbc\xf9\x60\x28\x85\x24\x41\xfd\xe4\xfd\x98\x56\x33\xfe\x77\xf8\x23\x35\x8d\x59\xe0\xb4\xb9\xaf\xfc\x47\x47\x63\x43\x81\x3f\xc2\xc9\x5f\xba\x02\xd6\x64\x23\x2c\x0b\x94\xe1\x93\x6d\x5f\x5f\x9e\x57\x56\xb2\x53\x65\x24\xce\x30\xcb\x98\x5a\xfc\x27\xb7\xa9\x8c\x00\xc5\xd4\xe9\xe9\xd7\x27\xca\x0c\x23\xac\x5e\xf0\x93\xa7\x01\xab\x8c\x42\x84\x1b\x4a\x7e\xba\x38\x98\x76\xc6\x62\x8e\xb0\x83\xa6\xe2\xf5\xdb\x18\x9a\x9c\x31\x08\xa3\xbe\x44\x98\xe9\xf9\x0f\xb7\xfa\x8c\x69\x62\xcc\x9b\x0f\xbc\xd1\x65\x75\x7c\x2c\xf7\xe5\xb5\xd6\x9d\x1d\x1c\xc5\x02\x5f\x6a\x13\x37\x3d\x20\xcc\x71\xaa\x66\x99\x45\x49\x88\x0c\x84\xf7\x2f\xbc\x6e\x03\x79\x35\xbd\x4a\x64\x11\x37\x82\xf5\x4f\xf9\x9f\xe7\x5e\xdd\x22\x8b\xad\x45\x87\x09\x92\x5c\xe3\x77\xb6\x58\xfc\x1c\xda\x98\xc5\x20\x63\xc7\xd5\x57\xc7\xbc\x40\x8d\xce\x9e\xb1\x89\xc7\x5e\xfb\x19\x9e\x25\x91\x71\x8f\x3e\x7e\x0e\x67\x76\x96\x24\x12\x55\x87\x3a\x4e\xe6\x7d\x79\x03\x09\x91\x25\x59\x8c\xb2\x1f\xdf\x97\x8f\xdb\x8e\x93\xa7\xb2\x34\xe3\x88\x1a\x78\xbe\x54\x65\x81\x19\xcb\x6e\x5c\x87\xcd\x52\x95\x21\x07\xd4\x4a\x09\xbb\x1c\x7d\xaa\x32\x90\xa5\x5a\xe1\x0a\x65\x03\xb7\xe9\x98\x27\xcb\x82\xc4\x71\xd5\xee\xa0\x28\x8f\xb9\x91\xbb\x98\x5f\xae\x5d\x28\x54\x96\x41\x80\xaf\xd4\xf1\xb2\xce\x0b\xfb\x02\x6f\xa1\x6e\x5c\x5b\x30\xe3\xca\xb8\xeb\xbb\xfb\x60\x05\xdc\x07\xb0\x14\x3b\x54\x32\x1d\x38\xf9\x50\x80\x57\x90\xf9\x29\x87\x31\xc0\x24\x53\x91\x71\x66\xae\xa1\x50\xdf\xf3\x62\x5f\x9b\xf8\xa0\x7e\xf1\x84\xb4\x76\x8c\xc0\x5e\x95\xbd\x1b\x8b\xd9\xf6\xc6\x94\x6c\x57\xa0\x0c\x31\x56\x3f\xe0\x7c\xda\xbc\xe5\xc5\x08\x6c\x9d\x81\xa4\xc4\xa1\x73\xfb\x4a\xbe\xc3\x51\x9a\xc7\x8e\x0f\xe9\x2a\x0a\x73\x5f\xe6\xcb\xb4\x4a\x11\x2e\xd9\x6e\x78\x6b\xa8\xea\xee\x9a\x79\x40\x78\x24\x9c\xe4\xe2\xfe\x3c\xb1\xbe\xdc\x5a\xa3\x06\x77\x85\x07\xa1\xc6\xfa\x35\xa6\x80\xfb\xb2\x91\x6f\xf9\x8b\x23\xfe\xfc\x4a\x7f\x19\x0d\x8e\x80\x5a\x2a\x5c\xfb\xda\x74\xd2\xd2\x6e\xf6\xf2\x20\x95\x08\x3a\x34\xcb\xd8\x06\x40\x79\x2f\x3e\xdf\x17\xfc\x77\xf6\x9f\xde\xff\xeb\x3e\xc8\x33\xdc\x9f\x5e\xcf\xee\x6d\xe4\x84\x2a\x6c\x23\xbc\xa8\xf3\x07\xef\x45\x89\x9c\x32\x8d\xea\xa5\xf2\x50\xd6\xc8\x6e\x73\x5b\x35\x0f\x59\x90\x19\x3b\x95\xe2\x6c\x45\xa8\xfc\x21\x15\xe2\x42\x76\xcc\x8b\x2f\xcb\xdf\x3c\xc5\x52\x71\x96\x24\xd4\x4e\xdb\x31\x28\xce\x8d\xe0\x04\x65\x57\x90\x8e\xee\x3b\x0b\x83\x07\xc9\x23\x26\xf1\x75\xba\xc3\x02\xd9\xf8\x6d\xe3\x11\xcf\x30\xc5\x45\xd6\xcb\x37\x27\x02\xf8\xc4\x3f\xad\x80\xe4\xe4\xfb\xcd\x23\x1d\x61\x6d\xf4\xce\x59\x4b\x7b\xdd\x2b\xc5\xe3\x98\xa6\xbc\xdf\x8d\xfe\xbc\xb1\x7c\xf2\x58\x58\x3c\x60\xf9\x0e\x3d\x3c\x73\xfa\x6f\x92\xc4\xff\xb9\x55\x86\xe4\xb1\x64\xc4\xab\x57\xe4\x45\x73\x5f\x95\x57\xa2\x37\x6e\x28\x04\x98\x02\xee\xca\x13\x14\xb3\x42\xfd\xa3\xcc\x8b\xc5\xdd\xfa\xfb\x72\xfb\xe5\x97\xf1\x48\xc3\xc7\x68\x52\xf8\xec\xa7\xa7\x3c\x8d\x38\xb1\x5a\xb1\x8b\xe5\xe7\xe8\xfe\xa7\x19\xc7\x62\xd6\x07\xe4\x66\x33\xf1\xfb\x08\xcf\xe2\x88\xf6\xcd\x4a\xda\xd9\x46\xa7\xad\x95\xdc\x27\x92\x94\x98\x00\x9d\xab\x6f\xe6\x88\x0f\x46\x5c\x6c\xcf\xb3\x4c\x47\xc6\xc9\x12\x11\x6e\x0b\x5e\xa9\x3b\x7e\xbc\x7e\xea\x3c\x70\x00\x3d\x0d\x55\x05\xd5\x63\x5e\xfc\x00\x04\x73\x8d\x3a\xc0\x9c\xa7\x09\xa2\x0b\x56\x86\x72\x9f\xff\xd9\x5d\x03\x17\x14\x39\xad\xd5\xb9\x58\xf9\xfe\x36\x17\x14\x70\x51\x3b\x80\x6e\x52\x3a\xfa\x5e\x49\x62\xec\x87\x6f\xd0\x9e\x68\x83\x42\x1b\xfd\x37\x44\xb2\x54\x74\x8e\x31\xf0\xff\xb2\xb2\x53\x5c\x46\xb1\xc5\x5e\xf5\xdd\x52\x6e\x0b\x9a\x29\x2e\x93\x80\x79\x9d\x85\x29\xae\xbf\xe2\x52\x07\x88\xc9\xdd\x7e\x99\x2d\x5e\x5c\xeb\x96\xb7\x4f\x12\x91\x6a\x3d\x60\xf1\xa8\x25\xc2\x95\x66\x18\x66\x36\xfc\x07\x38\x0e\xec\xe8\xe4\xc0\x00\x97\x8c\x76\x59\x5e\x35\xaf\xbd\xd7\x5f\x07\x29\xb6\x67\x8f\x60\x44\xab\x86\x9f\xd3\x49\x84\x5d\x9d\x0a\x14\xc0\xc8\x03\x7b\x1c\xdc\xf9\x49\xa2\x53\x8e\xbc\x88\x3b\x53\xf2\x9b\xc0\xa5\x8b\x20\xe1\x60\x5b\xa4\xed\xd6\xe4\xb7\x45\x9f\x5c\x8b\x20\x53\x8e\x76\xb2\x39\x1d\xf2\x66\x5d\x36\xb3\xfa\x3e\xff\x04\x85\xb8\xed\x2b\x0d\xb1\x5e\x0c\x21\x48\xa2\x70\x79\x58\xdc\x6d\xa7\xbe\x9c\x72\x8a\xe5\x14\xfe\x61\xc3\x62\xa7\x59\x34\x0a\x9b\x44\x18\x08\x57\x7f\x7b\x6a\xb3\xe2\x86\x1f\x06\x05\x3a\x11\xa6\x12\x99\xd5\xc5\x1d\x1c\x4b\x59\xfb\x3f\x67\x9c\x78\x05\xd4\xfb\x1e\x21\x40\x84\x99\xc2\x4e\xfc\x17\x7e\xe9\xc9\x9b\x29\x11\xea\x2c\xee\x83\xbb\xcd\xfc\xed\x8e\x6a\xee\xf2\x88\x39\x34\x93\x1c\x16\x3b\x94\xd1\xd4\x88\xf4\xe0\x3e\xe3\x66\x0a\xde\xaa\x06\x8e\x93\x49\x9a\x60\x71\x86\x7c\xc0\x53\x55\x7e\x5e\x3c\x40\x6b\xba\xb3\x38\x8c\xce\x05\x93\x0a\xf7\x08\xcf\x2d\x10\x11\x65\x5c\x79\x24\x42\x77\x67\xdd\xe1\x30\x20\x46\xc5\xb5\x3e\x0b\x59\xe5\x62\x84\x00\x10\x91\x22\x08\xf5\xa9\x9d\x40\xfb\xf6\x71\x4d\xfd\xa7\xb5\xa1\x40\xf3\x43\xd3\xa6\x53\xb8\x62\x60\x3f\x6e\x0d\x15\x36\xe7\x46\x4f\x3a\xa6\xca\x19\xf5\xd9\x0c\xe6\xbe\x34\xb2\xb1\xc3\xcb\x88\xe3\x14\xc3\xfd\x3b\x78\xdf\xe1\x8c\x71\x32\x77\xee\x8b\x63\x1e\x92\xbe\x22\xf3\xbc\x2a\x7f\x5c\xd7\x79\x46\xf7\x35\x01\xe3\x94\x94\x17\x4d\xf9\x0e\x95\x3e\x94\x1f\xbb\xe3\xf9\x30\xfa\x8d\x29\x50\x8c\x6b\xe1\x9d\x1f\xce\xc6\x51\x09\x2d\xca\x66\x13\x61\x91\x48\xed\x22\x81\x40\xc2\x7c\xff\x26\xca\x73\x65\x75\x67\xed\x08\x11\x00\xc6\x2d\xdb\xf3\xbf\x78\x3e\xc5\xfe\xbd\xae\x3e\x08\xa1\x8c\xee\xf6\x02\xda\xe9\xd2\x6b\x21\x09\xa1\x25\x4b\xfc\x1b\xf0\x58\x8e\x33\x0b\x21\x43\x63\xa9\xf1\x6d\xde\x9f\xce\x60\x35\x93\xdb\x54\x87\xe7\x23\xfd\x4e\x25\x49\xc0\xb1\x8c\xea\x11\x05\xc8\xdd\xb8\x2f\xab\x6d\x7e\xcd\x62\x1b\xe8\xc0\x8e\x6a\x4d\x92\x10\x9e\xda\xba\xd8\xf3\xf9\xb8\xcd\xe5\x8f\xd1\x0a\x26\x89\x30\x7e\x75\x18\x13\x3d\x1a\x34\xe3\xac\x50\xeb\x31\x08\x47\x12\x21\xa2\x6e\x51\x1f\xa9\xac\x8f\xce\x29\x13\x2c\xfc\x7d\x9d\x3d\xff\xee\x3a\x81\x92\x92\x28\x51\x83\xb9\x56\x5f\x19\xf0\xb8\xa1\x54\xa2\xca\x24\x47\x99\x59\x1b\x7a\x8c\x86\x64\x0c\x6b\x75\x15\x6f\xa0\xbe\x2f\x2b\x83\x55\x91\xb9\xdb\x3f\x99\xbf\x05\xa1\x0a\xb0\x07\x58\x49\x57\x39\x92\x2c\xd4\x58\x5c\x99\x29\xe5\x0b\xf1\xfe\x58\x26\xac\xa0\xc9\xe1\xb0\x7c\xde\x8c\x5a\x90\x6e\x90\x4a\x91\x38\x72\xb2\x73\xd1\x18\xaa\x8e\xee\x2c\x53\x12\xb9\xea\xc6\x4f\xd6\x01\x52\x6e\x33\x43\x27\x5f\x12\xb4\xe9\x6c\x7f\xcf\xd7\x5c\xfe\xd8\xa0\x42\x9a\x53\x02\x72\x03\x38\x68\x70\x0b\xc2\xaa\x68\xa3\xcc\xfc\x1d\x26\x22\x3f\x19\x0b\x03\x15\x55\xee\x18\x3c\xbe\x3e\x5f\x53\xd5\xdd\x68\x1d\x2a\xfd\x77\xa4\x41\xae\x0a\x32\xf6\x04\x49\x20\x91\x13\xb4\xab\xdf\xd0\x47\x75\x6d\xb5\xce\x06\x70\xf5\x1b\x57\x9d\x24\xcc\xc8\xa1\x56\xfc\x23\x2f\xf6\xeb\x2a\x2f\x9a\x6d\xe9\x66\xcb\x78\x2c\x60\x07\x8d\x17\x6a\xfb\x06\xc5\x64\x26\x2a\x53\x6a\xfc\xb4\xde\xcb\x06\x9e\xcb\x76\xf6\xde\x98\xbb\x69\x2c\xd2\xc8\xd9\x8c\x3f\x40\x63\x50\x7c\xf6\x9b\xef\xf2\x1b\x8a\x6e\x6d\xce\xc9\xb5\x37\xa0\x35\xa8\xbb\x0e\x77\x21\xb3\x58\x61\x98\xda\x06\xc5\xc3\xba\xa8\xe4\x51\x88\x49\x42\x95\xef\xdf\x9a\x30\x18\x5d\x9c\x63\xb6\x5b\xf5\xf2\xbe\x7b\xe8\xf8\x39\xfc\xad\xd8\x4c\x8a\xc4\x78\x75\x5f\xca\xfa\xad\xe7\x4f\xab\xa4\xb0\x12\x5d\x8b\xf5\x8b\xff\x13\x97\x49\x1f\xff\x6e\x3c\xdc\x27\x3a\x54\x52\x48\x43\x64\xe6\x4a\xb5\x2f\x8e\xb9\x03\xae\x04\x35\x51\x2a\x96\x42\x99\x40\xb3\x86\xa6\xcb\x06\xc9\xc0\x8c\x46\x49\x19\x2b\xe4\x5c\xd4\x27\xfe\x51\xcc\x3e\xf3\xab\xb9\x67\xc7\xa9\x2c\xc6\xa5\xa5\x50\xd2\xfd\x74\xa5\x94\x22\x16\xd1\xbb\xe1\x1a\x70\xf2\xdc\xe7\x9f\xee\x38\xb0\x10\x97\x3d\xae\x14\xd2\xc9\xa7\x27\x03\x64\x19\x73\xa6\xf9\xed\xce\x26\xcb\x2b\xf8\xaf\xd4\x44\x20\x22\x47\xe7\x07\x78\x82\xea\xc7\x01\xba\xac\xe0\xc6\x33\xd0\x2c\xc2\x2f\x6f\xb7\x84\xbb\x72\xdf\x4f\x68\xa4\x4e\x24\xb6\x94\xdb\x60\x23\xbf\x45\xb2\x56\x24\xe5\xd4\x61\x9f\x1b\x38\xd6\xcf\x65\xe3\x4c\xcf\x47\x5b\x80\x22\x19\xc3\xd0\xa9\x0d\x5a\x0e\x48\x97\xe6\x7d\x11\x18\x3b\x8a\xfe\x2f\x69\x6f\xd2\xdd\x38\xae\x65\x0b\xff\x97\x1a\xc5\xe0\x0e\x08\x36\x00\xf9\x66\xb2\x24\x3b\x5c\xe9\xae\x2c\x39\x22\xb3\xee\xaa\xa5\x85\xe6\xc0\xe2\x35\x45\xaa\x48\xca\x0e\xdd\x5f\xff\x2d\x1e\x34\x6c\x44\x3b\xe3\x7d\x2f\x07\xe9\x58\x02\xd8\xa3\x39\xcd\x3e\x7b\xa7\x91\x74\x30\x94\xcd\x81\x17\xc5\x68\xf1\x57\x61\x1a\x83\xd5\xe2\x59\x14\xc5\x4d\x55\x8c\xca\x7c\x86\x15\xcf\x2a\xca\x8c\x1c\xf6\xe6\xd1\xc5\x02\x55\x9c\x64\x18\x1d\x39\x35\x50\x37\x4b\x5e\x22\x9e\xc8\x37\xa6\x02\x23\xb2\x5e\x3b\xec\xe9\x79\x7d\x7f\xfb\x72\xbf\x7b\x5e\x6c\xd7\xbe\x13\xa7\xc8\x93\x52\x54\xd5\xdb\xe9\x38\x8f\xba\x54\x49\x9a\x2a\x13\xef\xef\x05\x1a\xb7\xd5\x76\x00\xf8\xf9\x3a\x1c\xa7\x28\x0b\xb1\x0e\xb3\xe8\x36\x95\xf6\xca\xd7\x20\x2a\x9a\x72\xa9\x5c\x9c\x0e\x8f\x80\x4f\xab\x96\x3f\x3b\x77\x6a\xd4\xcd\x9c\x40\xb5\x2d\x10\xb3\xad\x29\x23\xa8\x75\x24\x79\xe9\x35\xc1\xfa\xaf\x9d\x02\x41\x81\x98\x37\x78\xf3\x07\x80\x61\xba\xeb\xf6\x3f\x57\xf4\xad\x78\x1a\x21\xf1\xf6\x21\x2f\xc7\x2a\x49\x4a\x71\x08\xd3\x21\x06\xdd\x0b\x02\x4d\xfc\xcd\xce\xe1\xc1\x73\x6c\x5a\x5e\x0b\xc7\xb9\xfe\x37\xef\x4d\x84\x26\x8e\x9f\x0f\x74\x83\x90\x38\x08\xd3\x32\xfe\xf6\x84\xa4\x91\x1d\xb4\xd6\xc5\x9b\xf1\x3e\x94\xcc\x52\xd1\x93\x1e\xfd\xf1\xd7\xd2\xa4\x56\xc6\xb3\x4e\xa9\x94\x60\x84\x4b\xe7\x35\x86\xb8\xf2\x4a\xf5\xa1\x19\xa5\xd2\xd0\x49\xc2\x5d\x9d\xea\x12\xea\xf1\x9e\x33\x39\x15\x70\xda\x6b\x1f\x8d\x24\x10\xe6\x70\xe9\x0a\xc2\x80\xda\xea\x2b\x84\x98\x34\xe3\x1a\x9d\xa9\x0d\xa6\x74\x98\x65\xf6\x66\xf0\x36\x3c\x47\xf1\xac\xf1\x03\x01\x89\x33\xe6\x22\x3e\x2e\x87\x3e\xa0\xd0\x9a\x5d\x10\x20\x88\x99\x32\xa2\x66\x79\xd3\x3e\xd9\xe0\xf8\xf8\xd3\x42\x00\xd4\x18\x83\x08\x0c\xa8\xab\x43\x35\xb0\x0e\x20\x64\x81\xf4\x1b\xdf\x75\xfe\x6b\x79\xaa\x6d\x79\x96\x3f\x41\x98\x72\xa7\xac\x3f\x87\x56\x87\x90\x87\xb8\xae\x55\xa5\xd3\x82\xfe\x8c\x06\x75\x72\xf7\x91\xe0\x19\xf3\xcb\xcb\xad\xea\x6c\x18\x9d\xf7\x90\x11\x88\x03\x23\x77\x89\x8b\xd2\xc4\xbf\x87\x38\x32\x91\x99\x1d\x57\xea\x16\x01\x2b\x96\xc4\x71\x36\x63\x02\xb1\x34\xa1\xd3\x62\x68\x04\x0c\x73\x59\x97\x76\x34\xc4\x52\x8a\xa0\x8f\xeb\x60\xe5\xa2\xbb\x7c\x12\x6a\xe4\xf2\xd9\xf2\x37\xb8\x37\x0c\x46\x5b\xe0\x87\xf1\x02\x0b\x54\xc9\x24\x19\xda\x07\x8f\x7a\xa6\x6e\x0f\xa8\x0e\x30\xf5\x73\x2a\xbb\xdb\xbb\x3e\x95\xaa\xbe\xe2\xc5\xa0\xa0\x05\x18\x44\x49\x30\x3c\x51\xb7\xb0\xd9\x8b\xad\x91\x7b\x74\x76\x98\x43\x4a\x12\x57\x4d\xb9\x56\xf9\x60\xdd\x1e\x7f\x8a\x8c\x04\xc2\xe2\xc4\x37\xf0\xda\x0b\x58\xff\x16\x18\x00\xb2\xd0\xd4\x29\xad\x00\x8e\xdd\xee\x36\xdc\xda\x20\x63\x32\xb5\xab\x28\x96\x85\xbd\xf3\xa2\x5b\x29\x16\xea\x5f\x27\x9b\xa8\xb2\x31\x44\xe0\xc4\x28\x6f\x7a\xe8\xce\xfa\x97\xa1\x27\xbe\x55\x57\xe7\xaf\xe4\x32\x14\x70\x11\xe0\x1a\xfe\x5a\xf3\xb2\xbd\xab\x78\xe9\xa3\xd2\x5f\xb2\x88\x2b\x10\x22\x45\x61\x9f\xcd\xf2\x7a\x74\xd7\x42\x32\x07\xe3\xda\x21\xea\x76\x50\x28\x09\x92\xa4\xa8\x9f\x7a\xa8\x5a\x27\x16\xac\x40\x32\xc3\x89\xb8\x33\x3e\xfe\x76\x0f\xa6\x40\xef\xd3\xec\xdf\xf0\xd1\x25\x53\x58\x3f\x37\x0c\xfd\x4f\x23\xf4\xa3\xed\x6f\x9a\x17\xfc\xa4\x75\x36\x28\x65\xaf\xa9\x82\x10\xe3\xb0\xf9\x73\xee\xf7\x65\x50\x24\x75\x6a\x61\x8e\xac\xe2\xc9\xb0\xae\x7d\x2a\x3e\xff\xe9\xdf\xc1\xf0\x55\x2a\x93\xd2\xc9\xb0\x4e\xa8\x83\x6c\x17\x08\x63\xc4\x87\x2d\x6e\x9f\x77\xe1\x18\xcd\x03\xc0\x05\xba\xe2\xba\x06\x5b\x26\x8e\xdc\x2e\xca\xb7\x6b\xed\xe4\x3b\x36\x95\x6e\x25\x3f\x8e\xf9\x5c\x40\x27\x29\x71\xa2\xe4\x67\xe3\x25\xc9\xe9\x1c\xd0\x1c\x64\x9f\x53\xfd\x91\xd7\xed\x89\x17\x93\xf9\xac\xc1\xd4\xb1\xe2\x38\x33\xf5\x6c\x9f\x94\xc9\xba\x03\x74\xe6\xde\x27\xae\x11\xbe\xec\x41\x87\x69\x22\xad\x95\xd9\xcb\x39\x5f\x86\x11\x47\xf7\xa8\xc3\x4c\x38\xad\xce\xb6\x80\x2b\x68\x5f\x4a\xe9\x0c\x50\xa3\xeb\xef\xb0\xfc\xee\x6f\x77\x7c\x1c\xb8\xc3\x95\x36\x69\x34\x23\x32\x6f\xe5\x71\x96\x56\x47\xdb\xdd\x59\x14\x6b\x74\x16\xc4\xe9\x6c\xeb\xca\x26\x2e\xd8\xe4\xa6\x22\xa1\xd0\xcb\x5a\x5c\x3d\x2f\x90\x22\xcb\x9f\x48\xa5\x08\x2a\x14\xe0\x13\x75\x3a\x49\x0d\x4b\x87\x47\x2f\x6c\x64\x55\x43\x73\xab\x97\x50\x14\xb7\xcd\x55\x85\x74\x7b\x5f\x6e\x1c\x3a\xd1\x19\x02\x34\x73\x1f\x1d\xff\xed\xb1\x39\xfa\x3a\x9a\x06\x4c\xdb\x55\xf5\xfe\x6c\x88\x8e\x7d\x4b\x86\xf6\xbd\x31\x0f\xae\xeb\xea\xdf\x30\xcb\xa0\xa8\x34\x8d\x29\x32\x06\xdc\x3d\x6e\xb7\xeb\xe7\xbf\x76\xd7\x2f\x0f\xab\xdd\xe6\xfb\xe2\x79\xed\xcf\xc5\x29\x2e\xae\xa7\x52\x54\x9e\x3c\x43\xb3\xc0\x60\x1d\x5e\x1d\x94\xeb\xe2\x19\xfa\xf9\xa3\x59\x14\x65\x86\x36\x8d\xab\x7b\x68\x38\xaa\xc7\x9c\xa7\x4b\xc4\x84\x88\x5f\x69\x96\x08\xe5\x25\xb5\xec\xc4\xe9\xc3\xe8\x3a\x25\x61\xa8\x1d\x59\xee\xe7\x44\xc3\x4a\xa7\x54\x21\xfd\x07\xcc\x51\x49\x2b\x9d\x2a\x86\xf8\x5a\xbc\x8d\x25\xba\x11\xed\x1e\x19\x8c\xbe\x8d\x96\xa3\x7f\xc6\xee\xc6\x52\x4d\x06\x90\xfa\x1f\x55\x7b\xe1\xe4\xf9\x67\xc8\x22\x9d\x19\x31\xdc\xe5\x9d\xbb\x60\x96\x84\xb8\xad\x4e\xea\x09\xdd\xdf\xd1\x60\x11\x59\x8c\x3c\xaf\x25\xfc\x42\xb3\xf0\x1a\x30\x98\x38\x9e\xfc\x5a\x06\x99\xe3\xc1\xb4\x41\xa5\xf3\xe6\x7c\x10\x95\xf3\xe5\xb5\x0c\x19\xa2\xbe\x97\x45\x75\x52\xa2\xce\xe5\x64\x18\xc8\x10\x62\xa3\xba\xe4\x38\x8d\x95\x96\x51\x9c\x98\xb4\xef\x2f\x67\x1a\xb9\x26\x45\x84\x46\x8a\x79\x80\xd6\x96\xe1\x6f\x00\xe9\xee\x4e\x75\xdf\x29\x0a\x11\x64\xf7\xe3\x71\xbb\xde\x2d\x6e\x16\xb7\x0f\x4e\x17\x48\x69\xdc\xb3\x0d\xa1\xfa\xdd\xdd\xe2\xf9\xe6\xf1\xce\x39\x5e\x1a\x54\xe8\xbc\xec\x6e\x6a\xb7\xb0\x23\xf1\x08\xa4\xae\x01\x32\xab\xba\xe1\x35\xb2\x26\xcb\xb1\xd6\x9d\xed\xe2\x70\x19\x4e\x41\x7a\xf4\xcc\x10\x04\x49\x82\x65\x61\x48\xf9\xd1\xf9\x00\x83\x2d\x14\x82\x80\x31\xc3\x28\x53\x57\x47\x68\xf7\x67\xff\x3b\x37\x32\x48\x35\xbc\x57\x6f\x60\x15\x54\x26\xd8\x07\xd7\x55\x64\x3c\x33\x65\x99\x76\x8d\x9a\xd0\xdd\xff\x33\xfa\x1f\xdf\xd5\x70\xeb\xae\xaa\x07\xa4\xe1\xad\xd4\xd9\xc8\x4e\x6c\xf7\x79\x73\x03\xed\x76\x0f\x28\x6d\xf9\x58\x82\xbf\x11\x60\x6e\xd7\x78\xa8\x3c\xfb\x93\xc7\x87\x43\x40\x44\x08\xa6\xf0\x48\xe4\xfe\x37\x15\x65\x7e\x83\x3c\x2e\x7a\xb5\x54\x6b\x69\x42\x40\x40\x24\x16\xdd\x65\xcb\x4c\x7c\x83\x42\x5b\x8c\x37\x4d\x25\x73\xde\x82\xea\xdd\xca\xe1\xcb\x87\x20\x14\x29\xb2\x34\xfc\xa8\xf2\x63\x3b\x7c\xa7\x11\xa1\x88\xf5\x43\x65\x96\xd0\x05\x5c\x0e\xbc\x27\x76\x83\x20\x52\x81\x74\x7c\x53\xdd\xf4\x32\xec\xa2\xf0\xa8\xbf\xe7\x4d\x5b\xd5\xb9\xe4\xc5\x3d\xb4\x5c\xf1\x96\xcf\x65\x3e\xba\x13\x44\x99\x4d\x60\x5b\x80\xab\x59\xff\xac\xf5\x3f\x34\x9e\xed\x11\x31\x65\xe1\x20\x81\x88\xc5\x8f\xd0\xe4\xff\xfe\x22\x79\xe8\x8e\x64\x29\x86\x34\xba\x71\x38\xe1\xcc\xee\x1a\x33\x96\x58\x74\xe4\x3b\xd4\x98\x94\xb4\x49\x8a\xdf\x82\xa9\x42\x90\x08\x85\x62\x71\xad\xf3\x4d\x3b\xb3\xb9\x7b\x1b\x43\x91\xdb\xdf\x35\x68\xdc\x39\xc1\x7c\x1c\x71\x3a\x77\x7b\x96\x1f\x2d\x34\x55\x98\x8f\xc2\x84\xd1\x8f\xa1\x0c\x3d\x04\x34\x23\x86\xf2\xcf\xb0\x02\x6d\x6b\x9e\x97\x70\xc1\x2a\x38\xfd\xeb\xe0\xab\x10\xb0\x8c\x9b\x5c\x57\x8e\x20\xc5\xce\x43\x18\x59\x26\x10\x30\x19\x21\x9f\xf9\xbb\x99\x4f\xc3\x72\x02\x08\x98\x0e\x0d\xb4\x6c\x9f\xeb\xf6\x2a\x6f\x9b\x3b\xd0\x43\xd5\xc6\xfe\xe1\xd2\xd8\x54\x55\xfc\x58\xcf\x82\x34\x47\xb3\x33\xd5\x86\x4f\xa6\x5b\x67\x6e\x1e\x27\xdf\x8e\xd3\x00\x2d\xda\xbb\xc7\x9b\x5d\x09\x1f\x37\xbc\xb9\x94\x16\x87\x40\x10\x53\xae\x08\xa5\xda\x89\xc2\x8b\xf0\x74\x0d\x09\xfa\x86\xbb\x53\x79\xe4\xf2\xcd\x2c\xf4\x97\x7c\x78\x10\x88\x58\x0a\xea\xf9\x96\xf9\x2e\x9c\xb6\x27\x0a\x49\x20\x6c\x99\x08\x6a\x05\x96\x6a\x5d\xaa\xb9\x11\xe0\x8e\x01\x8a\x8c\x84\xc6\x1d\x9b\x14\x67\x74\xcd\xcc\x42\x83\x5a\x97\xc9\x7b\x42\x65\xf8\x4f\x4e\x27\x53\x99\x7a\xd4\xce\xa9\x6c\x4d\xc2\xff\x93\xbe\x99\x51\x2f\x7b\xee\x6c\xe4\x57\x5e\x8e\x56\x54\x65\xfd\xe1\xb7\xba\x79\x69\x94\xfb\x15\x42\x42\xd2\x41\x09\x9a\x25\xad\x72\x73\x7b\x74\x7a\x08\x33\x24\x41\x52\xa7\xc3\xd1\xcb\x89\x42\xa0\xb9\x44\xa4\x8e\x79\xe0\x0b\x2c\xa9\xeb\x05\x12\x69\x97\xde\xca\xea\xa3\x34\xaa\xab\xe0\xef\x42\x6b\xc3\x17\x6f\x37\x1d\x68\x2d\xe9\xf4\x21\x1f\x13\xfc\x00\x09\x08\x63\xa2\x97\x7f\x5d\x59\x6a\x9d\x6f\xbe\x19\x90\x7a\x17\x8c\xbb\xda\x93\xaf\x8f\x3f\x2c\x09\xe2\x04\xac\xc4\xc9\x4f\xc7\xd4\x3e\xa1\x78\x00\x42\x92\x38\xb6\x02\xa7\x43\x06\x7b\x20\x44\x49\x64\x29\xaf\x8e\x50\x5e\x66\x4d\x80\x84\x91\x61\x1e\x7d\xe5\x87\x71\xdd\x01\x90\x88\x68\x3e\x49\x89\xcd\xdb\x4d\x40\x22\x16\xea\xd8\xf3\x04\x7f\x99\xfd\x00\x92\x64\x52\x59\xed\x27\xf4\x5e\x9f\xf1\xfc\x97\x75\x70\xe3\x4b\x24\x8a\xe2\x2e\x8b\x26\xde\x83\x15\x5c\xf2\xa2\x01\x7d\xd6\x12\x08\xa5\xa6\x46\x14\x85\x42\x9e\x78\xfd\xb6\x38\x1e\x5d\x1b\x0b\x35\x46\x22\xb1\xc8\xd9\x45\x0b\xf9\x8c\xbd\x0b\x84\x25\x69\xc0\x7b\x1e\xc1\x64\x36\x34\x85\xdd\x70\x71\xe0\x4a\xf5\x38\xde\xd9\x10\x2e\x10\x26\x28\x8e\x9d\x63\x5d\x1d\xf2\x66\xac\x13\x05\x24\x23\x21\x6e\x47\x70\xc8\x5b\xd4\x68\x37\x8b\xc1\x4d\xfe\x3e\x63\x33\xf7\x4e\x35\x90\x2c\xa2\xf8\x42\x5b\x68\xda\xed\xbe\xae\x3e\xfe\x4e\xb7\x0e\x48\x96\x19\xed\xaf\xc6\x70\xc5\x23\xfb\x27\x99\xbc\x80\x2c\x4b\x33\x03\x05\xaf\x3f\x78\xad\x06\x5a\x2e\x93\x4f\x93\x89\x08\x6b\x40\xf2\x66\x21\xdb\x7c\x1c\x56\x03\x92\xa9\x08\x93\x43\xb2\x00\x5e\xdf\x2e\x1f\xc5\x34\xc4\xe1\xfb\x59\xd5\x9d\xba\x67\xfa\x07\xc2\x03\x82\x22\x99\x96\x59\xc5\xa3\xa8\x16\x45\xe1\x75\x15\x80\x70\x2a\x09\xeb\x6b\x3a\xa7\x4e\x37\x10\xa1\x22\x47\x6b\x68\x55\x42\x9a\xf6\x9b\xa9\x34\xb0\xf5\x06\x08\x0f\x77\xdd\x65\x6a\x88\xd8\x9b\xce\x67\xeb\xb7\xeb\xc9\x73\x4b\x48\x30\x6c\x76\xdc\x73\x2c\x82\x6c\x78\x01\xbb\x6d\xe5\x6e\x4a\x25\x31\xe2\x84\xb8\xa8\xfc\x0a\x44\x14\xe3\x10\xfb\x65\x1a\x71\x99\x62\x4a\x17\x0c\x44\xa5\xa6\xb2\xb3\xdb\x06\x91\x14\xf9\x93\xc1\xa7\x52\x69\x82\x73\xf0\xab\x75\x8c\xc8\xc3\xad\x8b\xa8\x8c\x0b\x43\xcb\x5c\x5a\xbe\x83\x41\xe2\x0e\x88\x92\xdc\xe0\xd0\xf7\xbc\x86\x3d\xc6\xa2\x88\x6b\x03\x12\x38\x8c\xba\xad\x71\x9a\xff\x6e\x90\xc4\x98\x9e\x3a\x95\x4d\xfe\x5a\x4e\x1e\x04\x12\x99\xa6\xc6\x33\xbe\x3a\xb7\x7e\x8a\x02\x17\x88\x3a\x6c\xaa\xa2\x9b\x35\xf6\xd6\x06\x12\x73\x40\x74\xa4\x11\xca\xbf\x7c\x5e\x2f\xb6\xeb\xdd\xf3\xfa\xe9\x71\xf7\xfc\xe8\xf4\x07\x80\xe8\x84\x62\x84\xc2\xbc\x48\x3b\x88\x2f\x42\x8e\x40\xb4\x4c\x30\x1b\x8e\x08\x00\x4b\x1f\x3e\xc5\x2e\x8d\xff\x9a\x03\x43\xc2\x08\x96\x8c\x71\x07\x9f\xdf\x6c\x97\xab\x67\x1b\xdd\xbc\x1e\x5f\x25\x24\x9a\xa6\x1e\x29\x51\xbf\x41\x7b\x6b\xbd\x14\x08\x43\x1e\x3a\xf5\x6b\x53\xef\xad\xae\xce\x58\x98\x38\xfc\x50\x61\x28\x18\x12\x07\x8b\xd3\x79\xb5\xfe\xe1\x8e\x8d\x62\x53\xd0\xb9\x7d\xdc\x2e\xee\x76\xcf\xeb\xff\x7a\x59\x6f\xb6\x3b\x4b\xcf\x3d\x88\x1c\x41\x18\x2b\x20\x1e\x49\x39\x54\xd6\x59\x76\xcf\xad\xfa\x10\x2b\x84\x49\x9c\x39\x56\x75\xc7\x36\x6a\x71\x4d\xa3\x6f\x17\x26\x3a\xa3\x36\xa0\xf9\x97\x94\xce\x17\x9e\x1d\x04\x21\x8d\x43\x99\xd9\x62\x14\x8c\x55\xe0\x19\xbd\xec\x2b\x84\x69\x00\xf8\x24\xef\x26\x3d\x00\xc3\x00\xa0\xef\xa2\x89\xd1\x2a\x53\xc7\x2a\x77\x11\x68\x08\x33\x19\x63\x6d\xf7\x07\x7e\x63\x0b\x59\xe8\xd5\x1b\xc6\x37\xc2\x99\xd1\x40\x31\x82\x67\xeb\x03\xd4\xaf\x9d\x8f\x7b\x35\xb0\xb9\x42\x29\x62\x4d\x8c\x3c\xf2\xd0\xec\x08\x15\x89\x30\x16\xca\x95\x7a\x7c\xb8\xd9\x2d\x5e\x56\xb7\xdb\x6f\xf3\xd4\x2e\x83\xd7\xa9\x88\xc6\xf2\x45\x87\xc8\x5e\xe8\x16\xea\x3e\x8a\x0a\xa1\x0a\x53\xf4\x93\x6e\x6e\x97\xdb\xb9\xd4\xfc\xfc\x36\x19\xaa\xc8\x14\xbf\xa2\xb4\x8c\x80\xda\x5b\x0e\xa1\xd2\x1a\x13\xd7\xe3\x1a\x1d\x83\x59\x19\xed\xfe\x21\x24\x09\x26\x16\x9f\x2b\x47\xf1\xf6\xa3\x6a\xe1\xb1\x9c\x72\xb5\xb9\xee\xdc\xf0\xfb\x5d\xdf\x3e\x6f\xb6\xbb\x27\xcc\x57\xde\x2f\xfe\xdc\x6d\x9e\x16\x0f\xfe\x94\x9c\x65\x03\xc1\xe1\x6b\x24\x1a\x1f\xb0\x22\x40\xa8\xad\x98\xbb\xa5\x96\x7c\xac\x15\x58\xc1\x6b\xd3\x21\x0a\x48\x84\xef\xff\xa9\xe0\xe7\x3f\xa3\xc0\xff\x1c\xfb\x40\xe1\xed\xe1\xc8\xa5\x59\xaa\x8c\x2d\x3c\x9c\x2b\x51\x20\x0c\x3e\xc5\x78\xf5\xf3\x8b\x73\x14\x48\x07\x6b\x83\x43\x7e\xba\xc8\x8d\xda\x5e\x24\x08\x90\xd5\x07\x17\xfa\xce\xbd\x6f\xba\x55\xf0\x89\xd7\xfc\x30\x19\xe2\x11\x09\x28\x96\x26\x18\x26\x33\x83\xcc\xaf\xd6\xed\x1e\x9f\x6f\xb4\xe5\x45\x84\x48\x74\x2e\x90\xf2\xb0\x69\x57\x55\xe9\x90\x8d\x10\x91\x14\x82\x21\x11\x26\xaa\x2e\x8c\xbe\x7c\x14\x52\x91\xd9\x4c\xa2\xad\xe9\x77\xf9\x28\x3f\xea\xa2\x88\x80\x61\xec\x68\xa1\xe6\x2d\xec\xa6\x00\x1d\x88\x22\x9d\xa1\xfb\xb6\x38\x56\x45\x51\x6d\xe0\xd8\xc2\x01\x69\x58\xd4\x04\x86\x0d\x51\x12\x25\x48\x3e\xf7\x31\x24\x88\xbb\x4c\x01\x8f\xcf\x9f\x24\x0a\x43\xdd\x4f\xff\x39\x64\x15\x82\x28\xa1\xa9\x30\x09\xc1\x66\xe0\x19\x46\x8c\x09\x34\x77\xff\xd3\x48\xda\xba\x9f\xd3\xc8\x40\x08\xdf\xbb\xcf\x3c\x7d\x11\x29\x17\x48\x7d\x77\xc5\xc5\xf9\x6f\xa4\x2c\x20\x4a\x25\x73\x08\x2c\x1b\xc9\x37\x71\x80\x33\x72\x9a\x8e\x0c\xb1\x28\x8b\x32\x16\x79\x96\x2c\x0c\x88\xec\x78\x2d\xf2\xb6\xd9\x1d\xb8\x1f\xa7\x22\x4e\xa8\x57\x88\x1c\xd9\x6a\x91\xe0\xa9\x57\x24\x6b\x6e\xa0\xf5\x75\x71\x10\x09\x11\xe3\x7b\x41\xf1\x8b\x6e\x21\xc4\xe8\xf9\xe4\x70\xc9\x51\x6b\x64\xa0\x2e\xd1\x2b\xa5\x5e\x40\xf4\x20\x92\x82\x09\xab\xf6\x85\x93\xe2\xa5\x71\xfc\x5b\xe3\x17\x86\x82\xe1\x9d\xdb\xc3\xcf\x63\x89\x36\x88\x24\x18\xec\xa9\xe4\x45\xb1\x19\x8a\x7e\x43\xa4\x22\x81\x98\xf9\xbc\x79\x7a\x5e\x7b\xee\x3e\x88\x94\x00\x35\xdc\xb9\x56\xd0\xc8\x3a\x3f\x9a\x22\x93\xc9\xa0\x70\x9e\x48\xa4\x74\x1a\xd9\x58\xeb\xb5\xa1\xde\x6c\x2f\xc3\x6e\x10\x41\x68\x36\xcc\x11\x5b\xa9\xc9\x6b\x7e\x86\x00\xba\xcc\xed\x40\x04\x11\x43\x20\xcc\x9f\x3a\x2f\xf3\x16\x16\x4d\x03\x7e\x68\x01\x0d\x70\x1a\x95\xf0\x61\xe5\x08\x7d\x4b\x46\x4c\xed\x30\xee\x25\x3f\xf3\x72\xbe\xee\x73\xfe\xcf\x78\x24\x69\x9e\xc6\x43\xe8\xae\x0f\x19\x0f\x7b\x9b\xbe\x71\x10\x72\x08\x87\xb1\xd7\xd6\xeb\xf2\x0c\x34\x86\xba\x7e\x42\x24\x2e\x93\xa8\x0d\x1b\xc4\x26\x2f\xde\xa1\xee\x3c\x82\x6a\xb4\x18\xc6\x41\xc4\x51\x11\x06\x8d\x50\x36\x5c\x88\xe3\x20\x56\x10\x79\x8d\xb8\xfc\x70\x3a\x2c\xeb\xce\xdb\x1c\x7f\x8a\x38\xcc\x0c\x7f\x5e\xbe\xe3\x87\xdd\x2b\x94\x50\x57\x7e\x6c\xc4\x11\x61\x81\x81\x58\xf2\x02\xd4\x55\xae\x9a\x79\xdf\x26\x8e\x08\xc7\x5c\x85\x31\x86\x91\xb8\xb3\x5b\xb9\x48\x6f\x10\xc7\x51\xa6\x69\x2f\xd7\xb2\x98\x94\x0d\x40\x1c\x69\x46\x32\xbf\x77\x9b\x73\xb8\x9d\xca\xdf\x50\x1c\x87\x26\x3e\x6d\xd8\x02\xcc\xfa\xb8\x42\x66\x84\xd9\x7d\x34\x8e\x15\x47\x77\xf0\x7d\x18\x7c\x1f\xf7\xb0\xcc\x4f\x46\x92\xef\x7b\x55\x37\x70\x1e\x61\x51\x07\xce\x56\x4c\x75\x8c\x37\x59\x80\x37\x6e\x62\x96\x08\xd1\x67\xd4\xfe\xd8\x8e\xbf\x50\x1a\x31\xc4\x07\x59\x7e\x83\xee\x0b\xcd\x2a\xd3\x40\x9c\xa6\x49\x1c\x38\x35\xf1\xe7\xf1\xee\x36\x7e\xdb\x69\xca\x84\x1a\x65\x86\x06\x16\x47\x9c\x4a\x53\x24\xa1\x3a\x77\xe8\x34\x59\xfc\xe2\x54\x27\x58\xce\xe7\xc4\x1a\x9f\xd6\xcf\xcb\xf5\x03\xb2\xdb\x84\xee\x0c\x99\x12\x2e\x94\xf3\xd2\x2d\x71\xd7\x27\x28\x1a\x5f\xc0\x6b\xd4\x2b\xbb\xf6\x9f\x8f\x1b\xf7\x13\x27\xca\x41\x80\x36\xfc\x3d\x2f\x5f\x9b\xd9\xe8\x4a\xcc\x53\x1e\xda\xb5\x6c\x71\x3c\x0e\xe9\x2a\xc6\x7b\x73\x2c\x12\x03\xcb\xde\x5d\xdd\x3d\x2e\xff\xd8\x3d\xaf\x7f\x2e\x9e\x9d\x55\x1d\x8b\x44\x33\xe5\xc2\x30\x85\x9a\xb5\x4a\x63\xc1\x09\x93\x3e\x82\x31\x0d\x9a\xc4\xc0\xa4\x90\xbe\x28\x7d\x7e\x09\xb8\x0c\x02\xc7\x9a\x46\x18\x90\x81\x5f\x2d\x94\xaa\x33\xbb\x6c\x89\xe8\x65\x31\x02\x24\x41\x96\x3a\x1a\xcf\x43\xf7\xf9\x6b\x8c\x3c\xcc\xbb\x73\x49\xa0\x03\x5b\x37\x33\xaa\x8b\xfe\x2d\x7b\x31\x21\x84\xdb\x28\xa5\xcb\x74\x5c\x71\xf9\xb6\xad\x2c\xc0\xc8\xf5\x8a\x63\xe8\xc3\x84\xbf\x55\xf1\x02\x49\x18\xc8\x30\xf3\x72\x14\x46\x46\x8c\x38\xbb\x2d\x09\xb3\x18\x9d\x50\xf0\x44\xcb\xc6\x30\x77\xcd\x3c\x08\x84\xe7\xb9\xc6\x7a\x20\xd7\x14\x41\x88\x3c\xbb\xeb\x3f\x17\x58\xa7\xf9\xc5\xf6\x9e\x24\x94\x63\xde\x49\xf3\x93\xec\xf6\xa3\x4f\x5e\x61\xc2\x88\xad\x4a\x3f\x5f\xe6\x19\x87\xd3\x20\xa1\x49\x00\xda\x21\x82\x50\x7b\x09\xb9\xe7\x77\xa8\x83\xba\xbb\x55\xbb\x19\xe9\x27\x7b\x28\x23\x71\xec\xf8\x74\x78\x01\x66\x73\xc7\x89\x3d\xe0\xf4\x81\x84\x65\x94\x5a\x9d\xed\x1a\x4d\x00\xab\xc5\x33\x3e\x59\x1a\x12\x1c\xc9\x7b\x03\x1a\xf3\xb5\x4e\x90\xa4\x51\x84\xfc\x8c\x9b\xc5\xcd\xc2\xff\x96\xa4\x18\x99\xc0\x25\x62\xc2\x77\xe7\xba\x68\x82\x45\x20\xe8\xd4\x4f\x96\xeb\xd1\xc2\x97\x64\x91\x44\x58\x95\xdd\xa8\x77\x1b\x68\xdb\xee\xaf\xe4\xcd\x1e\xb5\x6d\xd4\xa9\xe6\x03\x17\x2d\xe1\xcc\x30\x26\xbc\x42\xfb\x5f\x27\x68\x30\xf2\x59\x36\x1f\x9f\x54\xea\x75\xfd\x8d\xb0\x85\xad\x47\x19\x68\x00\x7e\x49\x45\x06\x09\x07\xa2\x8d\x6e\x9b\x73\x18\x17\x45\x61\x6b\x5d\xef\x73\xcf\x6a\x01\x89\x20\x46\x22\xdd\x14\x3d\xe2\xf8\xec\x0d\xdb\x44\x72\x03\x60\x41\x86\x9e\x0d\x60\x74\xd5\x36\xa9\x90\xa3\x71\xf3\xfd\xe5\xea\x65\x68\xbf\x26\x2a\x8e\x70\x7d\x32\x1a\xff\x17\xe5\x22\x90\x28\x16\xe1\xf6\x8c\x9e\x75\xb7\xfb\x5c\xf7\x61\x8b\x44\x65\x21\x95\xb6\xd4\x6a\xc5\xf3\xcf\x1e\xd7\xf5\x86\xd0\x21\xc3\x5e\x72\xb5\x68\x6e\xcb\x16\x3e\xcb\x4e\x43\xe7\xd4\xa0\xe3\x2e\x84\x15\x13\x19\x4f\x6d\x88\x25\x42\xdc\x30\x04\xb0\xad\x16\xf5\xe1\x3c\x19\x6a\x3a\xb4\x58\x72\x53\xe9\x3f\x93\x0f\xc5\x3e\xb8\x06\x35\x26\x18\xfc\x00\x1f\x98\xb5\x9e\xce\xa5\xb9\x84\x5a\xa2\x75\x18\x5b\xd8\x31\xee\x1a\xdb\xea\xa6\xae\x4e\x17\xd0\x24\xb7\x00\xd3\x80\x18\x85\x01\x27\x34\x3d\x17\x65\x1a\x5f\x82\x06\xb1\x11\x58\x1a\x46\xc3\x87\xb4\x63\xa3\x07\xa6\x41\x46\xa5\x13\x74\x33\x5a\x74\xc6\x98\x72\x34\x63\x83\xf3\xaa\x18\xa9\x68\xef\x72\xd9\x2d\xe6\xc3\x11\x41\x49\xc2\xa9\x5d\xc1\xac\x67\x68\x1b\xc2\x98\x62\x12\xc3\x19\x29\x98\xf9\x71\x6c\xff\x9f\x7c\xf9\x89\x48\x3f\xd0\x90\x6b\xf4\xd3\x5e\x6b\x5e\x2a\xe7\x1d\xcd\x4e\x27\x1a\xeb\x08\x2d\xda\x9d\xcb\x12\x6f\x79\xf3\x36\x79\x90\x24\x49\xc1\x00\x1d\xd5\xa2\xb5\xd5\x25\x38\x57\x27\xaf\x26\x51\x82\x69\x3f\xcc\xb7\xfb\x7c\x32\x10\x28\x55\x1a\xac\x78\xea\xa9\xe0\xb5\x23\x81\x72\xad\x20\x10\x95\x88\xe6\x9e\x91\x5e\xb7\x2d\x2c\x31\x0a\x42\x5c\xa9\x1e\x8f\xfd\x7b\x31\x0f\x9a\x72\xc3\x4c\xf1\x47\x5e\xbe\xaa\xea\x30\xa5\xb9\xfc\xcd\x0d\xf1\xb3\x93\x2b\x83\x52\x40\x22\xf5\x87\x9b\x99\x24\x1b\xcd\xba\x4d\xd4\xae\xc5\x53\x70\x15\xd0\x2c\xa2\xb8\xb7\x7c\xcf\xdb\xdf\x63\x76\x01\x9a\x65\x21\x9a\xe0\xb5\x2c\xbb\x55\xc2\x2d\xd8\xb6\x95\x33\xc6\xd8\x08\xc0\x10\x65\x23\xdb\x91\x72\x15\x1b\x92\x21\xec\x82\x92\x56\xb3\xc0\x5a\xa0\x22\x06\xfc\xee\x8e\xd9\xf9\x99\x5f\x62\x4d\x5c\x57\xc6\x13\x67\xdc\x95\x79\xdb\xac\x40\x43\x79\x49\x26\x3b\x79\x7d\x32\x51\xcc\xaa\x1c\x09\x94\xe1\xde\x29\xe0\x3e\x2b\x4c\xa5\xcd\x40\xe3\xdb\x45\xb9\x92\x4f\xae\xae\x04\xc1\x34\xc7\x55\xde\xee\xa1\xf4\xcb\x17\x85\xcc\xec\xdc\x43\x84\xf8\x3f\xe6\xd0\x12\x14\x44\x84\xd3\x6e\xc9\x0f\x47\x9e\xbf\x96\x36\xc4\x39\xbe\x5d\x4d\x03\xac\x32\xb3\x79\xe2\x31\x94\x07\xa8\xe6\x09\xd2\x31\xe7\xa5\x2c\x50\x98\x74\x5d\xfa\xda\x47\xd7\x45\x92\xd0\xc4\x34\x9f\x87\x06\xa2\x6f\x4d\x1d\x5b\xe0\x72\x9f\x17\xaa\x86\x72\x50\x28\x00\x2c\x88\x98\x0a\xfa\x6c\xe5\xb1\xce\x11\x5e\x75\x18\x56\x31\xb8\xae\x09\x71\xf8\xfb\xff\x3a\xe5\xf2\x0d\xc1\xcb\x0e\x43\x6a\x4a\x47\xc2\xd4\xf5\xe5\x06\xae\xe2\x3e\xf3\xdd\x80\x05\x70\xfc\xc1\x18\x49\x24\x26\x5e\x6e\x97\x8f\xbb\xe5\xe3\x03\xf2\x86\xba\xbb\x23\x0c\x4c\xd9\x18\x70\xc3\xc6\x34\x53\x56\x04\x8c\xa4\x21\x12\xc7\x97\xa7\x83\xab\x2c\x6e\xfc\x19\x24\x33\x6c\x27\xd0\x98\x92\xd4\xe7\xea\x6d\xe3\xc9\x05\x81\x45\x91\x40\x75\x89\xea\x08\xe5\xfa\xf5\x75\x18\x79\x77\x69\x16\x16\xc5\x3a\x31\x06\xf8\x3b\xf0\xe2\x2a\x57\x5f\x33\xf7\x7e\xce\xe2\xe0\xce\xa7\x54\xe4\xe9\x63\x97\xfc\x88\xca\x10\x3d\x10\x86\x25\x19\x81\x70\xe0\xac\x7f\x86\x99\x9d\x25\xa3\x01\x46\xa3\x08\x67\xc0\x3d\xfa\x89\xf7\xbc\x46\x9d\xf2\xaf\x6f\x89\x46\x59\x6c\xd3\xf6\x5b\xfe\x0b\xd7\x42\x1b\xa2\x9d\xf4\xe3\x04\x4b\xd7\xab\xb2\x38\x3f\xda\x18\xfe\x16\xf8\x61\xa6\x3c\x00\x58\x9a\x19\x2a\xb1\x66\x5f\x7d\x1c\x6b\x2f\xa9\xd2\x35\x64\xa8\x8b\x77\xc5\x4d\xdd\xd1\xa2\x71\x41\x6f\xc6\x79\x3a\xa0\xa0\x30\x24\xfd\x97\xb0\xba\xd9\x4d\x97\x89\x2c\xc5\xd2\x06\x03\x12\xc4\x52\xe2\x91\x6b\x3c\x2e\x24\xf8\x2d\xbc\xec\xc0\x47\x62\x02\xe2\xc0\xd5\x4e\x42\x09\x3a\x97\x39\xaf\xf3\xcb\x1a\x14\xdb\x5d\xa6\x89\xa1\xe5\x35\x8a\x71\x18\xbd\x9b\xbc\x20\xc9\x8d\xfa\xba\xa9\x05\x70\x0c\x7d\xf3\x5f\x48\x51\x8d\x13\x95\x1b\x9b\xea\x3b\x6f\xd6\xbf\x8e\x79\xfd\x49\xf9\x27\x30\x1d\x64\xb8\x47\xd9\x9a\xb5\x87\xeb\xad\x55\xad\xcb\x85\x9d\xd9\xe9\xa7\xa1\x2b\x17\x2c\x4b\xfe\xc7\x9d\x2c\x0c\xd1\x3d\x3c\x56\x4d\x7b\x75\x3a\x9b\x58\xf2\x6f\x39\x65\x4c\x47\x21\x62\x91\xc0\x2e\x5b\xeb\x76\xbf\xad\xd6\xa7\x09\x7c\x20\x0d\x42\xa7\x29\xdc\x48\xae\xa6\x21\xd6\x34\x88\x0c\x48\x41\x9c\xce\x1b\x24\x1f\x44\x0f\x4d\x8d\x49\x7a\x6d\x5f\x92\x18\xcb\xd8\x26\x84\x77\x47\xde\x34\x61\x5f\x91\xf5\x8f\xff\x9b\x7f\xb8\x53\x52\xe6\x05\xb5\x56\x43\xb9\xb9\xc9\x95\x45\x96\x18\xf5\xb4\x87\xaa\xdb\x48\x51\x3b\x6e\x38\x0e\x7d\x3f\x6e\xc0\x71\x86\x7b\x00\xd4\xd5\xf9\x93\x33\x86\x49\x42\x6d\x76\xd3\xd2\xbf\xcd\x8f\xb6\x34\x12\xa6\xc0\xec\x42\x9c\xfa\xd3\xd1\x3d\xb7\x76\xa4\xb1\x62\x61\xe4\x25\x6d\x86\x3c\x02\x90\x26\x41\x88\xea\xaa\xe8\xc3\x8c\x57\x87\xf9\x6f\x9f\x26\x01\x43\x0c\xbe\x82\xc6\xc6\x10\x17\xe5\x2b\x14\xfe\x84\x89\x46\x14\xf8\x6a\x46\xc0\xef\xff\xf6\xaf\x3b\xa5\x12\x81\x05\xfb\xdd\xe7\x25\xca\xb3\x4e\x87\x12\x23\x31\xd6\x71\xf5\x44\xb5\xa6\x90\x64\xfc\x3e\x19\xd1\x81\x1c\x30\x78\x0f\x41\x29\xab\xb1\xbb\x99\xa6\x89\x21\x58\x40\xc3\xdb\xee\x73\x66\x72\xf9\x0d\x31\xcd\x54\x16\x5a\x6e\x22\x2c\xac\xe9\x4c\x92\x0b\x19\x7f\x48\x39\x35\x14\x1c\x2e\x67\xd6\x59\x63\xdb\xfc\x00\x45\x25\xdf\xa2\x31\xc4\x2c\xe5\x2c\x03\xe2\x54\x3c\xb5\xff\x15\x94\x34\x6a\xb6\x82\xff\x6b\xe8\x1f\xa4\x5c\x33\x2c\x30\xb8\x18\x22\x43\x83\x21\x15\x40\xb2\xc0\x01\x2a\xa7\xb3\x54\xd2\x08\x81\xaa\xef\xb0\xcf\x65\x01\x3b\xde\x34\x70\xf0\xb2\x95\x7d\x3f\xc8\x12\x74\xff\x77\x8e\x10\xad\x7c\x3d\xe5\xe5\x54\xdd\x6c\x7c\x8c\xee\xc6\x17\x4e\x9e\xe6\x64\x5d\xe4\x9f\x79\xbb\x37\x53\x9d\xcf\x4b\xdd\x41\xaa\xa9\x01\xa6\xf5\xe5\xd4\xa6\xa6\xaf\x72\xf9\xc6\xf9\xe3\xb2\x20\x4d\xd0\xb2\x30\xc5\xe3\xa3\x3c\xef\x17\x81\xfc\x2c\xe0\x19\xe2\x84\x3b\xf3\xd1\xd6\xe9\x3f\x9c\x0e\xf3\x4b\x76\x46\xa8\xc0\x4d\xb5\xce\xcb\x37\x10\x67\x17\xb5\xcc\x88\xe0\x98\x4c\x42\x9e\x95\x0d\xc8\x7a\x20\x1b\x3c\x17\xbd\xcf\x88\x8c\x30\xf6\x62\x02\x5b\x9d\xf9\x72\x5b\x3a\x36\x2f\xdf\x25\x41\x1f\xb5\xf1\x88\xc6\x4b\xf9\xaf\xc1\x9d\xa9\x14\x63\x83\x66\xa7\xb4\x72\x1e\xf3\xf5\xb7\x90\xc5\x11\x8f\x82\xb1\xe4\x8c\xf9\x24\x58\x27\xf1\x6d\xd2\x39\x73\x12\xae\xdd\xec\x5a\xa1\x55\x3b\x72\xad\x6c\xbf\x84\x72\xac\x51\x32\x03\xe4\x1e\x9a\x3d\x32\xa6\x8c\x8c\xd7\x2c\xc9\xc2\x94\xf5\xb4\xcb\x43\x1c\x9d\xeb\xa1\x35\x7a\x71\xae\x2e\x00\xe0\xdf\x93\x40\x6e\x46\x53\x8e\xc8\x47\x07\x39\xb8\xe7\xbf\x9e\xea\x4a\x77\x56\x87\x45\x2f\x3f\xea\xef\xd5\xa9\x99\x98\xbb\x19\x4b\x0d\x11\xe9\xf6\xe1\x69\xe9\xde\x72\x1a\x91\xc4\x06\x96\xfe\xf3\xa4\x5e\xe1\x73\x9a\xba\xae\xaf\x0a\x52\x97\x1e\xcd\xbd\xf6\x16\x64\x29\x05\x89\x32\x7e\x15\xfc\x1b\xca\x1f\x55\x3b\xe0\x27\x9d\xbc\xfa\x94\x29\xb4\x68\x0a\xde\xb4\xbb\xa6\xf0\xf9\xc8\x2c\x85\x18\xcf\xc1\x45\xd3\x7a\x9e\x1c\xc8\x38\x49\xf1\x59\xcb\xd3\x61\x55\x95\x43\xaa\x7e\xc8\x78\x64\x38\x4b\xee\x6f\x1f\xae\xd6\xdb\xdd\x11\xea\xcd\x93\x23\x9d\x83\x8c\x27\x26\x5f\x81\x4a\xa7\xf6\x7e\xc7\xcf\xc3\x2d\x39\xd8\x2b\xb4\xe8\x52\xed\x9a\xf6\x02\x11\x94\x71\x2d\x91\x8c\x77\xfd\xbc\x0c\xc3\x68\xeb\xd6\xfd\x39\xc5\xd0\xd9\x1a\x10\xc8\x54\x68\xb4\x3e\x10\x52\xdd\xeb\xf0\x75\x0d\xc0\x86\x86\x44\x33\x0a\x2b\x65\x4a\x18\x8c\xd1\xae\xe5\xaf\x33\xc5\xee\x90\x41\x18\x86\xd6\xc4\x7d\xac\xb9\x2c\xf2\x7f\x83\xa9\x7c\xba\xe1\xcd\x00\x34\x66\x7b\xeb\x8c\x92\x68\x08\xab\xb1\x00\x4b\x7b\x39\x1e\x24\xa6\xc2\xcd\xe0\x48\x5a\xe8\x1c\x63\x5e\x7a\x65\x7d\xe0\x24\x08\x31\xa6\x78\xe5\xab\x0c\x80\x93\x94\x21\xfc\x04\xb1\x5d\x57\xe7\x16\x06\x45\x19\xae\x4b\x16\xf3\x1e\x48\xb6\x91\xbc\xe0\x9f\x48\x55\xcd\xa4\x88\x38\x11\x82\x98\xac\x7d\x89\x8e\x59\x39\x58\x37\x47\x4b\x0a\x27\xca\x28\x9f\xc8\xea\x60\xc1\x80\xcf\x5e\x53\x13\x38\xd1\x06\x5a\xfa\xb0\xb8\x5f\xef\x36\x8b\xed\xe3\xe6\xfb\xad\x6b\x0b\x19\xa0\x2d\xe4\xf2\x32\xeb\x87\xd5\x40\x6c\x00\x78\x64\x75\x11\x91\x2e\xc5\x14\x0e\xfe\xe0\xa7\x62\x9e\xdf\x0c\x78\x94\xd1\xd0\xc9\xfe\xec\x36\xeb\xf5\x6a\xbd\xf2\x67\xe2\xca\x92\xd8\xff\xf4\x74\x8a\xe3\xcf\xc4\xe3\x20\xc3\x8a\x6a\xae\x94\xd1\x5c\x9a\xad\xda\x19\x0d\x04\x1e\x4b\x8d\xb5\x9b\x8b\xfb\xa7\xed\x70\x83\xe4\x09\xcd\x10\xb9\x7b\x75\xbb\x18\xfd\x4e\xa3\x8c\x44\x5e\x26\x0a\x37\x97\xd9\x9c\x11\xa7\x31\x8b\x5d\x6e\xff\xc7\x93\xa9\x37\xb4\x02\xff\x5f\x9a\x2d\x9c\xb2\x0c\xd7\x15\x84\x3c\xb4\xd0\xf4\xd9\x6d\x9e\x92\x30\xf2\x88\xa9\x85\x52\xcf\xd5\x80\xc2\x71\xf4\x5c\x29\x31\x90\x0d\x50\xf9\x1c\x13\xf6\x3f\x2e\x53\xbd\x3c\x0d\xc1\xac\x09\xbc\xce\xf9\xe8\x99\x53\x69\x08\x76\x4d\x48\xd2\xe4\x6b\xc7\xf7\x9c\x4a\x8d\x6c\xfd\x4f\xbc\x56\xf9\xe0\x86\xb3\x58\xc8\x9e\x86\xf3\xa5\x81\x7a\x5b\x9f\x9a\xf6\x99\x97\x6f\xd7\x55\xed\x04\x90\x2d\x71\xe5\x24\xee\x4f\xc2\x0b\xdb\x9b\x67\x49\x88\x6c\xb2\x9b\x23\x97\xf0\xe7\xe8\x26\xb3\xd4\xf0\xc7\x99\x05\xe1\x01\x3e\xa6\xbc\x50\xae\x9f\xe4\xb8\x6b\x9b\xba\x89\xeb\x51\xbe\xd2\xdb\x5e\x9c\x53\xc9\x0d\xcb\x07\x42\x67\x0c\x40\x6e\xb2\xbf\x71\xce\x29\xe2\x8a\xba\xa1\xbf\x19\x83\xdb\x38\x57\xa6\x82\xf3\xd5\x60\xdf\xaf\xce\x2b\x78\xcf\xa5\xa3\xff\x1a\x12\xf4\x01\x17\x24\x01\x2b\xe3\x73\x82\xe2\x1d\x16\xc7\xe3\xb8\x90\x1b\xb8\x90\x14\x69\x94\xac\x3b\xdb\x34\xa7\xee\xbe\x46\x9f\x74\x7e\x34\x09\x30\x3c\x20\x9d\x7d\x60\x71\x1d\xfa\xe4\xac\x6e\x2e\x49\x8c\x56\xf7\xcb\xc3\xed\x7f\x7d\x95\xca\xe2\x92\x86\x51\xd6\xa7\x79\x91\x6e\x73\x42\x6c\x01\x5c\xa6\x09\x5a\xd3\xe2\x54\x97\x37\xbc\x59\x94\xaa\xdb\x84\xe7\xe8\x06\x67\x22\xcc\xc3\xa1\xa8\xa2\x28\xb0\xd1\xbe\xd5\xa9\x7c\x85\xaa\xbc\x2e\xaa\xca\x0a\x8c\x4f\xbf\x82\x4a\xd3\xb8\x67\x0b\xe8\x3e\xa8\x25\xb4\x99\xf5\x6a\xb8\x52\xa6\x80\x40\x81\x38\xbd\x76\x0b\x79\xbb\x39\x09\xcf\x65\x6c\x3b\x01\x31\xda\x2c\x79\xe3\x8c\x27\xc7\x34\x3c\xbf\x70\x81\xe6\x92\xd8\x1a\xda\xfa\x1d\x1c\xd1\xb8\x6f\x15\x38\x6d\x97\x8b\xe7\xd5\x6e\xbb\xf8\x63\x3d\xac\x41\x04\xae\x21\xc1\x41\x5d\xc2\xc7\xca\x09\x39\xcd\xce\x6a\x11\xa4\x2a\xe5\x3d\x8b\x82\x8f\x97\xda\x81\x24\x88\x43\x1e\x23\x66\xea\x9b\xfb\x95\x49\x65\x6b\xce\xae\xe0\x35\x2f\x87\xd5\x15\xae\x4b\xc6\x95\xb9\xff\xce\xb0\x33\x38\x9d\x6e\x9d\x1d\x22\xbd\x06\xd3\x43\x90\xcc\x00\x9f\xdd\x8e\xf7\x54\xf0\x12\x7c\x86\x4b\x10\x9d\x61\x5e\xfd\x3f\xaf\x86\x53\x54\x84\xa9\x29\x05\x7e\xae\x84\xb7\x5e\x44\x14\x85\xaa\x67\x97\x58\x60\x16\x79\x7c\x73\x51\x2a\xc0\xc2\x73\xfa\x1d\xea\x69\x5a\x74\x20\x22\x4d\x71\x88\x1a\x22\xed\x6d\x7d\x82\x6f\x26\x6a\xd3\x0f\x2c\x44\x47\x21\x3f\x5e\x67\x36\x77\xbe\x85\xad\x3a\x74\x37\x93\x10\xa3\x1f\xd3\x18\x7a\x19\xb9\x87\xfb\xbc\xdc\xfe\x9a\x5c\x29\x89\x84\x8f\x23\x76\x96\x4f\xa9\x30\x0f\x6a\x23\xbb\x55\x69\x68\xf7\xf3\xaa\xc4\x78\x7d\x83\x7c\x7a\xab\xce\x8f\x79\xa8\x30\x19\x03\xad\xe7\x9c\xe8\x3d\x47\x41\x83\x18\x53\xfb\x37\x55\xf9\xba\xdc\x9f\x78\xf9\x3a\x7a\x79\x94\x70\xac\xb7\x83\x5f\x20\x4f\xad\x65\x81\x5c\xf2\xe2\xc2\x19\x1a\xfb\x2a\xa3\xc7\xa7\x21\x61\xa9\xf7\x88\x67\xc4\x9b\xbb\x2e\x8a\x39\xbd\x44\x2b\x8d\x3a\x10\x00\x9f\x1d\xfd\x82\x72\x96\x3a\x52\x6d\x43\x61\xe0\x73\x96\x82\xc5\x04\x03\xdf\xa6\x78\x65\x7c\x1a\xdb\x25\x13\x02\x91\x65\x43\x06\xf0\x17\xac\x76\xc1\x60\x68\xec\x4e\xc5\xc3\x18\x41\x9a\xf7\xf9\xab\xf1\xb9\x9b\xc8\x37\xa9\x10\x69\xf3\x6e\xea\xea\xa3\xdd\x3f\x55\x55\xb1\x1b\xc5\x2b\x04\xd7\x44\x59\x92\xbe\xb7\xfe\xe6\x04\x0b\x30\x3a\x7a\x78\x5b\x55\xc8\x30\x3b\x8b\xea\x10\x92\x28\x84\x07\x1e\x6d\x40\x79\x83\xfb\x29\x99\x8f\xbe\x08\xc9\x52\xb4\x2d\x97\xbc\xe9\x19\xe6\x40\xc8\xce\xe2\xb3\x83\xa6\x1b\x11\x6e\x61\xf9\xb9\x87\x72\xd3\x56\xc3\x09\x2b\xb9\x66\x60\xbf\xc1\xd5\xe9\x6c\x42\x12\x23\x13\x6f\xce\xe0\x13\x52\xd2\xd0\x82\x91\x91\xa6\x82\xe7\x4d\xbf\x08\x09\xa9\x0d\xa1\x66\xcb\x7f\x5d\x38\x84\xf3\x9f\x55\x85\x24\xa3\xae\x02\xdb\x1a\x39\xab\x07\x17\x8f\x17\x2a\xe3\xce\xdc\xfa\x92\xc8\x01\x84\x52\x24\xf1\x58\x8c\x09\xb5\x3b\x08\x88\x19\xae\xdf\xcb\xe5\xd3\xdd\xcb\xe6\xab\x5d\x48\x00\x33\xe2\x7d\x35\x74\x9f\x76\xd4\xa4\x41\xb1\xd4\x89\x11\xbe\x0e\x78\x08\x2f\xa6\xc5\xf0\x30\x19\x10\x40\x2b\xcd\xa8\xd5\x7f\x73\xbf\x4a\x66\x01\xaf\x9d\x4f\xd0\x6d\x60\x37\x7c\xb2\xed\x48\x42\x42\x3e\x46\xbc\x3e\x1e\xa1\x1c\xc1\xd6\x25\x11\x31\x1a\x08\x8b\xf2\xdc\xee\xf3\xf2\x75\x71\x3c\x5a\xdc\xc5\x48\x4a\xf2\xff\x2d\x49\x28\x89\x96\x08\xef\x92\x55\xf9\x0e\x75\xfb\xa9\xa6\x08\xc8\x90\x10\x6e\x45\xe4\xba\x11\xfc\xa8\x1f\xc6\x53\x51\x86\x92\xa1\x27\xce\xcd\xfa\x05\x7e\xaa\xc8\x50\x19\xaa\x10\xab\xe6\x37\xa4\x70\x04\x19\x05\x02\x83\xfb\xbc\x69\xf2\xd7\xf2\x2e\xc7\xf4\xd5\xea\x6a\x72\xf2\x6e\x1d\x97\xa3\x8d\x7a\x2e\x53\x20\x23\x4d\xa8\x01\x5b\xc9\xaa\x54\xcd\x6d\xb9\x72\xf2\x61\x20\x63\x10\x58\xe1\x7b\x53\x15\xea\x42\xbf\x6d\xb0\x41\xc9\x44\x48\xcc\x2a\x1c\x4f\x8d\x41\x3b\x4f\xc8\x5d\x2e\x0b\xf9\xbb\x63\x00\x9d\x15\x59\x9d\x8e\x93\xf1\xe3\xd2\x05\xb3\x26\x05\xf2\xea\x85\x36\x10\xe4\xca\x13\xba\xb5\x73\x32\x62\x58\xc8\x33\x43\x69\xfb\x6b\x79\x3a\x38\x45\x38\x9b\x5f\x75\x7b\xa7\x4c\x09\xf1\x11\x16\x0c\xaa\x0c\x7c\x31\x99\xa6\x92\x65\x23\x7d\x9b\xbb\xfc\x7f\x4f\xb9\xca\xdb\x09\x6e\x42\x66\x91\x14\x63\xf2\xf9\xdd\x2b\xf7\x17\xc9\x62\x86\xc0\xf0\xe7\x7d\x5e\xc2\xaf\xee\x53\x0c\x96\x2a\xc9\x43\x0e\x8e\x84\xb4\x7b\x50\xf4\x4c\x0d\x1c\x7e\x92\x39\xb2\x07\x08\x42\xa5\xfa\x14\x8c\xed\xec\x43\x29\x68\x82\xb5\x64\x79\xb3\xac\xea\x09\x29\x30\x48\xc1\x94\x21\x80\x86\xa6\xbd\x81\x76\xc9\x1b\x18\x66\x27\xa5\x8c\x22\x4c\xb6\x76\xed\xb8\x33\x49\x3f\x2c\xa4\x2d\x46\xfe\xeb\xe5\x69\x5a\xb3\xfe\xf5\xd4\x51\x34\x44\x7a\x0c\x95\xbf\x2f\x7d\xc1\x93\xd4\x11\xc5\x0d\x09\x49\x0e\x67\xeb\xb0\xa5\x66\x04\x51\x1a\x0a\x4c\x4e\xd3\x48\x6e\x4e\xfa\x28\x89\x80\xc3\x3f\xca\xea\xa3\xfc\x04\x9f\x3e\xfe\x68\x5a\xa7\x08\x38\x3f\xee\x1a\x68\x57\xf0\x3e\x9b\x36\x57\x81\x8e\x74\x0f\x41\xf9\xd1\xb9\x6b\x62\x20\xda\x35\xa2\x1f\xfd\xff\xb9\xb2\x8c\x9f\x56\x11\x1a\xe2\x87\x2b\xb9\x1c\xb1\x98\x81\x22\x69\x8a\x51\x8c\xfb\x87\xed\x88\x28\xc3\x37\x2b\x9c\xaf\xcb\xaa\x28\x78\x7b\x67\x15\x9a\x6d\x63\x44\x32\x54\x19\x28\x78\xd3\xde\x55\xf2\xcd\x22\xf1\x5c\x73\x4c\x88\x55\x6e\x6e\x1f\xe0\x63\xee\xec\x71\x94\x22\x47\x86\xae\x4e\x75\xbb\x47\x6a\x33\x4b\x8a\xe2\xcf\x91\x81\x91\x99\x5f\xfd\xb8\xdd\xac\x9f\x37\xbb\xc5\xc3\x6a\x77\xfd\x7c\xbb\x7e\x58\x6d\x76\x3f\x17\x77\x77\xeb\xad\xef\xaa\x18\x2a\xa8\xed\x1c\x74\xdc\x9a\x47\xb6\x39\x09\x02\xa4\x60\x3e\x9c\x91\x68\xe3\xc8\xcf\x5f\xed\x54\x2a\xa1\x29\x96\x01\x7c\x5f\x7e\xff\xdb\x62\x6d\x95\xb0\xc0\xc8\x91\x57\xaf\xaf\x05\x2c\x79\x69\x0a\x86\x6e\x3a\x73\xca\x5f\x1f\x78\x98\x3a\x06\xda\x6e\x85\x9d\x4c\x1f\x45\x93\x10\x3b\x34\xc7\xaa\x6c\xaa\x1a\x1c\x2e\xe7\xde\xcf\x6b\x45\x29\x71\x55\x2e\x4b\xa8\xdb\x5c\xe7\xb2\x5b\x88\xab\x7a\xbc\x0e\xcf\x0f\x4e\x45\xa9\x61\x4d\x3b\x75\x56\x45\xcf\xe1\xe4\x5a\x79\x0a\x6c\x50\xeb\x4d\xa2\xd1\xfe\xac\x58\x24\xe4\x38\x36\xff\x99\x4f\x38\x47\x9f\xeb\x4e\x92\x44\x88\xc6\x5e\xad\x7f\xac\xef\x1e\x9f\xd6\xcf\xbb\xeb\xf5\x7a\x77\xfd\xbc\x58\xee\xb6\x8f\x4f\xee\x56\x98\x34\x82\x0a\x7b\x5e\xf8\xb7\x93\x12\x10\xe0\xc2\x36\xcd\x31\xaf\xa7\x16\xed\xec\x86\xa9\xd2\x98\x73\x6b\x02\x3d\x9c\x0f\x4b\xe8\x2c\xdb\xc5\xd3\xed\xcb\xf3\x9d\x3f\x71\xc2\x12\xac\x80\xad\x5f\x2b\x7e\xf8\xf2\x33\x67\x60\x00\xc8\x4d\x55\x8c\xcb\x68\x15\x27\x0c\x4d\xff\x5d\x7b\x2a\xe1\x8e\x1f\x44\x35\x1f\x03\x56\x3c\xb4\x45\x96\x76\x8c\x6e\x3a\x73\x76\x4e\x96\x03\x14\xb7\x02\x18\x79\x77\xcf\xd0\x8d\x17\xcc\xf8\x7a\x2b\x53\x71\x21\xb3\xcc\x15\x9f\x60\xfe\xc0\x55\xde\xdb\x0e\x22\xd4\x28\xc9\x6c\xcf\xbb\xad\xae\xcc\xe2\x3f\xb9\x90\x24\x1c\x6b\xa0\x54\xde\x98\x38\x13\xc8\xfc\xe0\xeb\x35\x95\xcc\x0c\x9b\x8a\x25\x6a\x7b\x29\xf3\xd6\xc6\x7d\x90\x4e\xee\xb7\xd6\x69\x25\x79\x88\xc8\x95\x53\xd9\xf8\x18\xc6\x20\x0e\x68\x7b\xa9\x38\x46\xb7\xb3\x84\x0f\xa3\x8d\x3b\x2e\x84\x73\xbd\x94\xa9\x23\xc6\x50\xc6\x85\x95\x38\x70\x97\x94\x8e\x62\x84\x62\x7e\x6a\x2f\xcf\x4f\x14\x1d\x13\x2c\xdc\x15\xa7\xfa\xc2\xa3\x98\xbf\x4e\x6a\xbc\xce\x0d\xb4\x0b\x35\x92\x62\xfd\xec\x0a\x9c\xe8\x91\xf0\x3f\xfa\xe9\xae\x51\xb1\xd4\x46\x73\x11\x70\xa7\x86\xeb\x08\x90\x40\x23\x3e\x26\xb7\x5e\xaa\xc7\xcf\x43\xc8\x03\x62\x12\xb4\xc7\xa2\x3a\xe3\x37\x1a\x3a\xa0\x10\x4a\x90\x3e\x27\x57\xaf\x8c\xee\xc5\xa9\xed\x4f\x1d\xc5\x26\x8c\xd5\x5d\xf8\xd4\x76\xa3\xa9\xfa\x98\x95\x90\xfe\xad\x4d\x07\x62\x88\xf0\x21\xbb\xad\x01\x45\xbc\xcd\x2b\xc8\x1b\x83\x9f\x1c\xef\x05\x90\xa4\xa0\xe5\x70\x7d\xe9\x3d\x6b\x48\xc0\x08\xe4\x78\x21\xd2\xcf\xe9\x3d\xec\x11\x94\x65\x3a\xf3\x48\xa8\xa7\xaa\xc8\xe5\x79\x18\xc7\x72\xdd\xa4\x8c\xac\xd3\x31\xcb\xca\x69\xbb\x31\x12\xe3\x66\xb0\x33\xa7\xdb\x56\xc7\x5c\x8e\x56\x47\x60\x49\x86\xf4\xe3\x50\xca\x4a\x81\x63\x39\x9a\xf4\xa1\x01\xf2\x8c\xec\x79\xb3\x9f\x08\x32\x4c\xee\x9e\x89\xc8\x16\xe3\x59\x58\xfd\x2e\x9f\x26\x00\x26\x07\x48\x85\x99\xfe\xbc\xb9\x5a\x5e\x5f\x9d\xce\x26\xdc\xe9\x5e\x1f\x03\x53\x54\x8b\xc4\x6a\xbf\xcd\xe6\xd5\x1b\xd6\x90\x26\xcc\x53\xff\xee\xf2\xb2\x81\xba\xdd\xe9\xbc\x54\xdd\x0c\xfe\x9e\x97\xdd\xf2\xf3\x6e\x94\x54\xb6\x3c\x2f\xbe\x8d\x6e\x4d\x64\x5a\x67\x8e\xec\xcf\x61\x56\xfb\xc2\x58\x10\x32\xc0\xd8\x5a\x09\x1f\xcf\xc0\xb1\xa8\xc2\x37\x81\xa9\xda\x38\x5a\xb3\x63\xfc\x51\x24\x8b\x71\x22\x1c\xf2\xd2\xf3\x0b\xe5\x55\x79\xcf\xf3\x72\xc0\xcc\x00\x32\x53\x48\x43\x66\x05\x70\x7b\xa8\x3c\x48\xc1\x95\x0d\xa6\x5c\x63\xe0\xe2\x6a\x62\x23\xcf\x19\x8e\x20\x15\x48\x43\x27\x79\x67\x88\x27\xec\xef\x8a\x68\xc2\x07\xe5\x72\xb7\x25\xa2\x0d\x4e\xbc\xf8\x09\xf9\x38\x52\x33\x39\xa3\x8a\x14\x12\x05\xab\xaa\xac\xea\xbb\x7c\xa2\x30\x06\xa0\xd2\x94\x0a\x57\xdc\x77\x3a\x3c\x41\x7d\x59\xc8\x0c\x4a\x48\x34\xf9\xe1\x90\x7b\x12\x86\x6b\x00\xf3\x55\x26\x01\x39\x80\x20\xa0\xdc\x7b\x68\x68\x77\xe1\xb4\x6a\x16\x7e\xcc\x00\x0b\x58\x6a\x87\xe0\x54\x3c\x06\xba\xff\x1c\x59\xf2\x3d\xff\xf5\xd3\x56\x49\xda\x28\xa6\x0e\x48\x84\xe8\xa6\xbe\xac\x40\x13\x06\x5a\x3b\xde\xa6\xd6\xf3\xcd\x34\x57\xe7\xdb\xc9\xcd\x69\x22\xb4\x15\x51\xc4\x00\x96\x84\xfe\x93\xe9\x90\x29\x7c\xc9\x7b\xde\x3c\xf3\x7f\x3b\x6e\xbd\xe9\x19\x42\x1e\x69\xc7\xfe\xb6\xf8\xe8\x3c\x9f\xa7\xba\x7a\x1d\xa0\x2d\x74\x28\x4d\x79\x14\x46\x46\x1e\x0e\x33\x10\x1b\xdb\x31\xd2\x06\xc9\xf4\x5e\xb5\x60\x15\x1a\xbe\xf9\x26\x83\xd8\xb8\x5a\x6f\x37\xbb\xe5\xdd\xe3\xe6\xf6\xe1\x66\x98\x3b\xd3\xb1\x32\x6a\xc5\xbd\x98\xe0\xd0\x2c\x1d\x5f\x27\x06\x15\xdb\x17\x6a\x32\x4d\xa6\xeb\x04\x96\x3e\x9a\x00\x3a\x09\x12\x1c\x89\xb8\x6f\xbf\x43\x6d\x0a\xce\x9b\x97\xb2\xcd\x0b\x17\xed\x1e\x5f\x25\x61\x21\x2a\x65\x34\x68\x69\xbf\x1e\xda\x0d\xca\x11\xbb\x1b\x4e\xa4\x42\x97\x53\x55\xd7\x3c\x2f\x40\x5d\xea\xd3\x83\xa6\x61\x88\x45\x5a\x38\x47\x0c\x7f\xfc\x30\xe5\xa9\x69\x62\x2e\x81\xc5\x85\xd7\xbc\x3e\xac\xe0\x7d\xe3\x81\xda\x9a\x26\x31\xee\x94\x7f\xad\xee\x41\x8d\xb3\x54\x9a\x72\x85\xfb\xfa\x84\xb4\x46\xb3\xd8\x00\xb1\xd6\x47\xee\xcf\xc3\xd2\x84\x5a\x84\xd9\x7e\x2e\x08\xa1\x59\x16\x23\x1f\xd8\x6a\xb1\x45\xfe\x6b\x97\xdd\xf4\x27\xe0\x32\x56\x0e\xad\xf7\x8c\x5a\x33\x33\x71\x72\xcd\x44\x14\x38\x34\xd0\xed\x0e\x54\xde\xee\x88\x8b\x67\xea\x34\x90\x18\x11\x34\xe9\xdd\x30\x70\x16\xfd\xb6\xf2\xf7\x9e\x86\xb1\xa9\x62\xca\x7f\x21\xc2\xd6\xff\xae\x38\x06\x2e\x17\x45\x5b\x9f\xf2\xc6\x3f\x57\xc6\x08\x22\x88\xaf\xaa\xb7\xb7\xf3\x53\x55\x5d\xf1\x7d\xb3\x38\xb5\x55\x59\x1d\xaa\x53\x63\xca\xf3\x78\xbb\xaf\xca\x6b\x2e\xf3\xc2\x8b\x2c\x80\xce\x94\x82\x9e\xa8\xc8\x90\x04\xc3\x88\x88\xdd\x76\xe4\x12\x30\x63\x54\x9e\x0e\x68\x7c\xd6\xcd\x75\x55\x3f\x55\x45\x31\x4e\x58\x69\x11\x2b\xeb\x20\xf3\x76\x8f\x1e\x01\x67\xee\x62\x22\x0d\xa9\xcd\xbe\xdf\x54\x85\xfa\x92\xa6\x41\x0b\xc1\xd0\xaf\x71\x8b\x7f\x55\x7c\x92\x84\xd1\x42\x6a\x2c\x0a\x3d\xe4\xe5\x4f\xc8\x51\xe3\xda\x5f\x51\x19\x55\x90\xc6\xd4\xf7\x5f\xe5\xea\x56\x4d\x6e\x58\x92\x84\x1a\xde\x81\x02\x9a\xf0\x2e\x17\x35\xaf\xcf\x0b\xc5\x8f\xed\x94\x73\x40\x2b\x62\xd4\x94\xdc\x2d\x79\x51\xa6\xdf\x2d\x7f\xfb\x84\x27\x76\xb8\x08\xaa\x48\x62\x45\x94\xf7\xf7\xd6\xa5\x1a\x32\x42\x68\x25\x08\x5a\x5b\x47\x83\x5b\xd9\x56\x5b\xfe\x06\x8b\x66\xd3\xd7\x78\x6a\x08\xb5\x34\x82\x11\x46\x1b\xc6\xd0\x2d\x8c\xfc\x5a\xad\x99\xe2\xbd\x63\x64\xf5\x82\xfd\x42\xa7\x53\x81\xb4\xdd\x4f\x35\x7f\xe3\xcd\xbe\x57\x27\x00\xad\x55\x38\xe2\x90\xb8\xbe\xa0\xcf\x1e\x7d\x1e\x1d\x10\x11\xa3\xb7\x6e\x2a\x79\x6c\xa9\xa8\x6d\x0b\x89\x91\x75\x9f\x4f\x2f\xfe\x63\x9c\x68\xd4\x41\x18\x43\x46\x86\x40\xee\x75\xbb\x1f\x05\x26\x74\x10\x31\x43\x58\x6c\xe8\xc8\xb1\x80\x75\x80\x94\xd7\x41\x94\x0a\x6a\xd0\xe4\x3a\x2f\x0a\xcc\x1a\xba\xa6\x44\x44\x60\x24\x8f\x8e\xc7\xf3\xef\x55\x4d\x74\x07\x65\x56\x9c\x03\x4d\xbc\x8b\xe0\xa4\xed\x46\x93\x08\x83\xdd\x73\xb5\x7e\xe3\xd7\x45\x93\x98\x28\x47\xcb\x3b\x20\x42\xea\x5a\x44\xcc\x1d\x64\x0c\x11\xa5\xc3\x91\xac\x03\x9a\x99\xea\x45\x13\x1f\x32\xfb\xc1\x14\xd4\xa2\x03\x16\x69\x84\x07\xbd\xf2\x6e\xa9\x1d\xa6\x56\x69\xec\x5f\x34\xe3\x91\xaf\xcc\x29\x8a\x07\xf8\x30\xd2\x29\xdf\x46\xe3\x78\xa8\xab\xf0\x85\xf6\x8d\x0e\x98\x50\xc4\xc9\x7e\xed\x34\x40\xb3\x83\x76\xbf\xab\x86\xcf\x96\x65\x09\xb2\x9d\x75\x1b\x26\x6e\x42\x23\x95\x48\xbf\xb2\xea\x40\x44\x0c\x3f\xd2\x0f\xa8\x73\x43\x02\xdd\xef\x05\x3a\x50\x49\x98\xd1\x3e\x1f\xdb\x8b\xc7\xbb\xf6\x2c\xc3\x10\x81\x72\xf9\xd6\x9d\xf9\x98\x3b\x27\x75\xba\x7b\x87\x3a\xd7\x39\xa8\x19\xf8\x90\x0e\x14\x0f\x13\x61\xad\x1b\x57\x1f\x33\xf5\xd8\x26\xaf\xc8\x1f\x99\x60\xbc\xcc\xac\xf9\x7f\x57\x2c\x74\x11\xd8\xd6\x01\x44\x69\xe2\x2b\xe6\xcc\x24\x1a\xd6\xfb\x7d\x09\xc0\xd6\x01\x28\x2d\x7a\x16\x81\x6f\x33\xcb\x10\xb1\x3d\x35\xd1\x46\xa2\xcd\xaf\x71\x46\x58\x67\xdd\x4f\x5a\xcd\x58\x8a\xc5\x1a\xc8\xf7\x3c\x72\x80\xe6\x86\xc1\x45\xee\xff\xf3\xc9\xa4\x65\x88\xbb\xd1\x33\xf0\xe2\xbe\x2a\xe1\x3c\xfc\xb8\x24\x88\x25\x32\xc4\x20\x57\x1f\x26\xc7\x06\x6a\xc4\xce\x78\xad\x2f\x57\x63\x7b\x38\x21\x01\xb2\x4a\x1c\x73\x59\x1d\x1b\x1b\x08\xf3\x23\x90\x90\x50\x52\xb3\x13\x96\xd5\xa9\x94\x18\x51\x9c\xec\x00\x9a\x90\x28\x20\x36\xa5\x6e\x79\x1a\x5e\x9e\x6f\x87\xee\x9a\x26\x61\x44\xc0\xd9\x88\x88\x46\x42\x31\xe5\xf1\x69\x62\xc2\xb1\xe8\xdd\xd2\xed\xfd\xac\xf3\x76\xbe\xb2\x5c\x93\x98\x6b\xac\x8c\xd9\x9c\x44\x33\x52\x21\xfb\xad\x52\x6b\x4d\x62\x30\x32\xbd\xd5\xd1\x4e\x95\xa1\xfc\xab\xed\x93\x64\x80\x99\x17\x23\x98\xde\x99\x0a\xf5\x79\x4c\xd1\x35\x39\x29\x65\x21\x73\xe1\xb1\xd3\x61\x5d\xc0\xa1\x57\x6f\xd7\x84\x11\x62\x98\xa0\xf2\x03\x8c\xaa\xc8\x34\x61\x34\xc5\x3c\xbc\x38\x9d\xa1\xb6\x9c\x27\xae\x2d\x8d\x13\xd4\xed\x71\x23\xcf\xc6\x93\xcc\xb6\x35\xab\x19\x32\xbe\xa9\x34\x36\xd8\x04\xbf\x31\x19\xac\xfc\x33\x34\xd5\xa9\x96\x5e\x86\xe3\xd4\x57\xf5\x68\x92\x26\x11\xda\x59\xcd\x49\x1c\x72\x43\xff\x33\x30\x4b\x35\x49\x19\x43\x66\xaf\xa3\x61\x69\x31\x10\xa8\xd1\xe7\x4e\xb9\x11\xea\x55\xe6\x6e\xc7\xf8\x1d\x4d\x32\x9a\x32\x5b\xc6\xea\x75\x1e\xc6\x19\x45\x4d\x32\xc9\xac\xfd\xbc\xf1\x6e\xce\xb4\x0f\xa7\x1a\xcb\x55\xaf\x16\x2e\x04\xa9\x89\x88\xc0\x55\x38\x2f\x9e\xec\x1e\xdc\x83\x25\x35\x11\x31\xe5\x26\xe4\xa3\xbd\x17\x31\xbf\x47\x13\xc9\x43\x8c\xa2\x38\x54\xef\xb3\xad\x3a\xfa\x74\x32\x29\x12\x23\x55\x19\x0c\xff\x73\x17\x56\xcc\x70\x03\xfc\xb1\x5e\x8d\x26\xb0\x4a\x03\x64\x4a\xc7\x0d\x6c\xfb\x6b\x40\x8e\xee\x56\xa1\xc1\xea\x31\x45\x31\x68\xa2\xb2\xc0\x99\x2c\x96\x93\xe4\xf1\x98\x97\xde\x99\xd5\x04\x88\x44\x93\x71\xe7\x23\x06\x9f\x4e\x96\xe1\x79\x21\x49\xd1\xa2\x59\x6f\x5f\x46\xb7\x0b\xa9\xc4\xc9\x7e\xbf\xf8\x73\x77\xff\xb8\x7a\xb9\x5b\x6f\x5c\x93\xa6\x12\xcb\x9b\x15\x14\xdd\xc8\xbc\x9b\x91\xb3\x77\xbb\x1f\xd1\x32\x61\x16\xa2\xbf\x3b\x1a\x50\xed\xd7\x53\x56\xeb\x24\xce\x5c\xc0\xcd\xad\xba\x61\x18\x2a\x4e\xbc\x24\xce\x7d\x75\x40\xd0\xf2\x2c\xee\x58\x87\x21\x33\x21\x67\xac\x3b\x32\x85\xb5\x96\x56\xde\x15\x1f\xbb\x8e\xd2\x18\x67\x48\x36\x78\xee\x76\x16\x09\xf9\x71\x62\xbd\x84\x51\x1a\x07\x0e\x82\xec\xf7\x54\x5b\xab\x34\x21\x51\xd0\x61\x4c\x4c\x0a\xd6\x25\xbf\x2f\xa5\x65\x74\x18\x6b\xaa\xad\x0c\xf1\x8b\x89\x0f\xcf\xd2\x62\xe8\x30\xb1\x29\x39\xef\x0b\xdf\xf3\x5f\xc3\xb0\xcd\xa4\x3b\x03\x43\xf0\x77\xe3\x14\x0d\x16\xed\xe4\xca\x4c\x53\xa7\x9f\x64\xde\xcb\x0d\x94\x50\xf3\xce\xf3\x1d\x12\x63\x75\x1d\x4d\x35\xdc\x9e\x97\xea\x02\x07\x33\x3b\x8b\xc2\x34\x24\x18\x5a\xda\x2c\xb7\xcb\x2f\x32\x02\x3a\x4c\x45\x84\x10\x8a\x43\x5e\x3e\x81\x91\x79\x74\x2d\x52\x30\x5b\xaa\x69\x57\xfc\xe3\x48\x78\x62\xfc\xb8\x19\x25\x18\x4b\x30\x74\x73\xd7\x06\x47\x43\xdc\xb9\x78\xa6\xd1\x95\xe8\xc6\xef\xcd\x62\xe3\x7f\x06\x0e\x03\x40\x11\xe6\x9c\xaa\x7a\xf2\x9a\xb8\x4e\x91\xb2\xf0\xae\x7a\xad\x7a\xeb\x5f\x87\xc2\x0a\xf9\x9a\x6a\xb5\x3d\x6f\x20\xf2\x4d\x82\x52\x5b\xd0\x27\xf7\xb3\xac\x6d\x3a\x14\xa0\x31\xef\xba\xe7\xcd\xb6\xdb\xbb\x4b\xde\xf6\x23\x5c\xe8\x18\xa3\x2b\x57\x79\xdb\x5d\xf2\x99\xb7\xd3\x38\xd4\xe4\x7d\x2b\xce\xc0\x8c\x72\xc5\xcf\x2b\x7e\xf6\xa3\x1a\x02\x89\x11\x40\xe4\xa4\xac\xca\xc6\x05\xa3\xe7\x13\xf9\x3a\x84\x50\xa0\xfb\xac\x3f\x81\x2d\xba\x6e\xb1\xc1\xf3\x75\x13\x70\x95\x37\xc7\x53\x0b\xea\xd6\xb0\x3e\x6c\xe0\x7f\x4f\x50\x4a\xf8\x59\x57\xe5\x2b\xee\xe7\xa3\x42\x1d\x1d\x02\x4d\xa9\x0f\x70\xc0\xe9\xb0\x83\xfc\x75\xdf\xee\x04\x7f\x7d\xed\xbf\x3e\xa4\x71\x66\xa1\x35\x87\xce\xfc\xf9\xec\x3e\x84\x44\x31\x88\x9b\xfb\x21\x9d\x99\x0e\x41\x93\xd0\x97\x88\xb8\x52\xb1\xf1\xa1\x3a\x35\x04\x4a\x9d\x75\x32\x11\xf8\xd4\xa1\x16\x41\x0a\xde\x97\xb1\xdb\xfa\xf8\x0b\x46\x41\x1c\x08\xbb\x60\xdc\xdf\x3e\x2f\xae\x16\x77\x8b\x87\xa5\x8d\x5d\x75\xad\x14\x2d\x7d\xe0\x75\x71\xee\x56\x0a\x39\x80\xba\xe9\x28\xc8\x08\xc6\x9b\x3b\x1b\x24\x9c\x7f\xb8\x28\x00\x15\x0e\xb7\xf1\x7e\xff\x1f\xbb\x64\xe3\xa3\x08\x70\x74\xcd\xf7\x2e\xc7\xe6\x2b\x80\xc6\xcf\x18\x85\x8c\x60\x00\xc7\x62\x8f\x37\x28\xda\x31\xef\xc0\x5b\xcf\x9c\x64\xfe\xaf\x3b\x47\x66\x08\xb9\x57\xf7\xcb\x6d\x8f\x9f\xd0\x51\x14\x50\x8a\xa8\x82\x6e\x9d\xaa\xde\x27\x9e\x57\x14\x71\x13\xa1\x3c\xd6\xd0\xf9\xc2\xb2\x3b\xb4\xf1\xc7\xca\x04\xa7\xb2\x65\xad\xfe\x0a\x58\xa5\xa3\x98\x50\xa4\x02\xcc\x1b\xe4\xcf\xbf\x42\xc8\xa2\x3b\x13\x25\xd4\xa1\x38\x1e\xe0\x57\xfb\x38\x80\xa8\x7f\x6d\x2b\x46\x94\x64\x4e\x45\xd8\x54\xc7\x60\x11\xf8\x80\x2f\x5f\x47\x2c\x92\x2e\x82\xfb\xfd\xac\xea\xea\xab\x18\x8e\x8e\x98\x88\x23\x57\x29\xb5\x3d\x1f\xe7\xb9\xbd\x75\x94\x66\x11\x68\x47\xbb\x33\xa2\x13\x9a\xdd\xdd\xa2\x2c\x53\xb8\xcf\x9b\x0f\x2d\xe1\xaa\xfa\x35\xb9\x70\xa6\x15\x92\xe6\x59\xf2\x7b\xb3\x8c\x5c\xb8\x6a\xbd\x7b\x15\x71\x6e\xf4\x19\x8c\x6f\xad\xcd\x6d\x80\x1a\xf3\xb1\x5f\xda\x24\x91\x90\x41\x2c\x7b\xde\x9c\xeb\x53\xa9\xcc\xc8\xeb\x09\x28\x74\x24\x89\xa9\xcb\xaa\xb9\xc2\xa9\x39\x84\x28\xea\x48\x86\x11\xa6\xa8\xf3\xc6\xf9\x5a\x0f\x55\xeb\xea\x7a\xe7\x70\x37\x3a\x92\x94\xa6\x96\x9d\xac\x28\xa0\x73\xf6\xab\x6a\x5e\x67\x59\x47\x32\x23\x18\x59\xe5\x52\xd6\x27\x18\x90\xb7\xe9\x48\x72\x42\x4d\x20\xb2\xfa\x40\xc9\xf3\x0b\x69\x73\x1d\x49\x10\x52\xb9\x22\x7e\x14\xa1\x42\xc1\xbc\xba\xf9\xec\x63\x2a\x1a\xa1\x91\xa7\xb1\x0e\x0b\xd3\x89\x5f\x79\x87\x97\xe1\x82\x48\x31\x8d\x96\xce\x81\xff\x5a\xb4\x6d\x37\xfc\xc0\x4f\x13\x88\x94\x08\x06\x9c\x02\x3f\x01\xde\x8a\xf3\x20\x58\xf0\xa3\x2a\x4e\x07\xd8\xd8\xd4\xcf\xf8\xd6\x34\x0b\x30\x8a\xfc\x9a\x6b\x8f\x54\xd5\x71\x10\x81\xb2\x9f\x70\xbb\xef\x3e\x8e\xf8\xda\x3e\x8b\x3b\x37\x75\x48\x8b\x79\x53\x15\x0a\xbd\x55\x77\x46\x12\xaa\x78\x10\x7f\x33\xfc\x9b\x6e\x43\xf4\x7d\xb4\xf6\x25\x1d\x46\x88\xf4\x89\x9f\x3f\xa1\x71\xd2\x31\x91\x12\x9c\x4a\xd0\x10\xe8\x77\xf9\xfa\xe2\x90\x30\x74\x39\x9a\x8f\xbc\x95\xfb\xc7\x07\xdc\xd4\xaa\xba\x33\x70\x5c\x8f\x4c\x60\x46\xf1\x39\x77\x35\xf7\x3a\x8e\x18\x38\xa1\x3e\xf4\x3f\x8c\xfa\x9e\x6b\x84\x38\x33\xb0\xf8\x15\x6f\xf9\x5f\x4e\xda\xd7\xb6\xc6\x41\x68\x42\xbe\x1e\xe2\x61\x19\x47\xbd\x94\xc6\xa2\xb4\xd1\xc7\x4f\x81\x50\x33\xcf\x91\x10\x8a\x45\x60\x47\x7e\xde\x56\xb7\xe5\x7b\xde\x4e\xb2\x0a\x3a\x4e\xc2\xd0\xc6\xca\xda\x3a\x87\x77\xb8\xed\x35\x49\x86\xbe\x85\xef\xad\xf0\x95\xdb\x45\xa1\xa7\x16\x1d\xbf\xea\x84\x4a\xbc\xae\x01\x35\xba\xb8\xe9\xb6\x5a\xcb\x6a\x88\x7e\xd4\x71\x22\x09\x33\x1a\x4b\x7f\x6d\x36\xd3\x07\x9b\x70\xe7\xe8\x98\x2a\x86\x38\x5c\x7e\x30\x10\x4c\x2f\x38\x6e\x56\x7c\x37\xc2\x63\x96\xc6\xf8\x71\x78\x51\x4c\xc4\x37\xba\x36\x8d\xd6\xe1\x7d\x5e\x74\x9b\x5b\xcf\x05\xd9\x47\x90\x75\xcc\x04\x37\x1a\x2f\x45\x37\x09\x9c\x18\x9a\x8e\xd3\x90\x18\xad\x79\xbb\x64\x3b\x03\xc1\x35\xb3\x18\x03\x6b\xa8\x43\x35\x35\xdf\xfa\xa7\x19\xcd\xdc\xa1\x51\x1b\xa7\xda\x48\x94\x74\xd3\x76\x10\x6a\xd6\x71\x16\x69\x2c\x8d\xb6\x38\xd5\x6d\x75\x9f\x97\xf9\xe4\x4b\x66\x49\x9c\x11\x17\x08\x6e\x9c\xd6\xb3\x6b\xa4\x31\x04\x2e\x6d\x58\xbf\x21\x03\x8d\xaf\x57\xcb\xab\xe9\xa9\x18\x47\x1a\x48\x24\x4b\x5b\xee\x79\xfd\x0a\xbb\x23\xf1\xe7\x52\x09\x92\xd1\xfe\xd7\x66\x6b\xb8\x2c\x5d\x03\x8f\x19\xd6\x50\xd8\x92\x25\xfc\xff\x6c\x39\x86\x8e\x05\x31\x61\xc0\x57\xf4\xe8\x60\xf7\x76\x96\x3b\x51\x95\xa7\x66\x57\x9e\x0e\x50\xa3\x39\xed\xba\x86\xa9\x63\x6f\xb5\xa1\x10\x50\x86\xcd\x67\xfc\x65\x85\x15\x11\xeb\xb6\x5e\x44\x1d\x2c\x2f\x30\xfa\x3a\x96\x8c\x68\x32\x50\x2e\x5d\x6f\xbf\xbb\xeb\x28\x15\x62\x52\xfa\x60\xd2\xea\xb9\x9c\x27\x9d\xd3\x31\x70\x41\x2d\x9a\xc0\x8a\x0f\x0e\xd2\x9c\x93\xae\x2a\x10\xa6\x38\x44\x98\xd8\xc9\xd5\x49\xbe\x41\xdb\xf8\xaa\x42\xdb\x4f\x47\xa6\xfc\x07\x69\x54\x8b\xe2\x81\x1f\xc6\x31\x92\x24\x88\x8d\x71\x86\x6b\xdd\x92\x97\x0a\x59\xd2\xbe\xb9\xd6\x34\x54\xaa\xcf\xd1\xcc\x7b\xb4\x09\x09\xc2\x54\xf9\x0d\xba\xb1\x49\x55\xc3\x76\xb3\xfe\x35\xcd\x7e\xeb\x84\x24\xa6\xd2\x13\xfb\xcf\x55\xea\xe9\x6e\x7d\x41\x73\xde\x56\x75\xbe\x94\x28\xa2\xf1\xcd\x0b\x50\x7e\x42\x94\xa2\x13\xa2\x12\x3c\xb7\x7d\x2d\xf7\xfc\xf8\x54\x35\xd3\x93\x2b\x81\x2e\xf3\x3d\x78\x10\x8e\x4e\x42\xc8\x10\xc1\xe9\x20\x4c\x4b\xde\xec\xaf\xab\xfa\x3b\xaf\xd5\x07\xaf\xe1\x19\xda\x53\x3d\x71\x95\x93\x28\xd5\x08\x46\xaa\x8e\x50\xfa\x0a\x08\xf4\xbc\xdc\x59\xa3\x4c\x51\x33\xe0\xd5\x2c\x59\xa7\x4e\x22\x08\x1c\x79\xd3\x13\x3f\x35\xa0\x7a\xaa\xd2\xde\x06\x4a\xe2\x20\xc6\xc4\x33\x46\xb9\x1c\x9e\x79\xfc\x25\xe3\x50\x22\x20\x14\x0e\x79\xbb\xa8\x81\xaf\xdf\x79\x71\x1a\xca\xb2\x8f\x0c\xe8\x74\xf2\xde\x62\x4e\xe4\x40\xfa\x60\x5d\x9a\x3a\x16\xdf\x0a\x58\xb7\x2a\x4e\xe7\x24\x18\x90\xc3\xea\x24\xd6\x3c\x4b\xdd\x02\x52\xe2\x98\x75\x6b\x43\x42\x23\x82\x73\xd1\x10\xb1\x22\x5b\x9a\x6b\x11\x36\xc6\xc0\x35\x7c\x52\x3b\xaa\x13\x0a\xc4\xe8\x3f\xbd\x43\xcd\x5f\x61\x51\xb7\x1f\x55\xfd\xd6\xd9\x42\xa3\x3b\x48\x49\x80\x41\xdd\x97\xab\xdb\x6d\x18\x90\x34\xa0\x99\x6f\xa2\x29\x5a\xf5\xc6\xde\xb1\x93\xdb\xb5\x65\x49\x66\xe0\x44\xcd\xa9\x68\x1b\xa4\x89\x6d\x3c\x4b\x97\x4e\x52\xeb\xeb\xa8\xbc\xe9\xee\xfe\xaa\x1a\x63\x3d\xac\xfc\xb6\x4e\x32\x4a\x53\x1b\x42\xda\xec\x8f\xae\xc0\xf1\x79\x5a\x7a\xad\x93\x2c\x4d\x50\x81\xec\x8f\x1f\xf7\x43\xcf\x30\xc9\xb2\x38\x90\x23\x7a\xc7\x23\x94\x46\xfd\x70\x32\x54\x78\x96\x22\x66\x4a\xd5\xfc\xb5\x2a\x6f\xf2\xba\xb0\x14\x07\xa3\xf7\x21\x04\xa1\xf6\x86\xbe\x0d\x55\x0d\xfb\x3b\x51\x29\xc5\x4a\xed\x65\x7d\x3e\xb6\xd5\x53\x55\x35\xa3\x1b\x52\x22\x51\xb6\xe0\xaa\x07\x32\x4f\xb2\x22\x6e\xf2\x0d\xd2\xeb\x53\x69\xcd\x7f\x86\xfd\x76\x14\xfe\xcf\x3f\xc6\x77\xa0\x19\x09\xfc\x82\xde\xc7\xfb\xc7\xcf\x0b\x51\xea\xb4\x8a\xae\x4e\xe7\xbe\xc6\xd5\x2a\xa0\x13\x57\x07\x30\xbb\x9a\x26\x3a\x8c\x1c\xd3\x41\x9d\xb7\x67\xb3\xa5\x7e\xf3\x8d\xdc\xb0\x76\x1e\xa0\x54\xcf\xd0\x9a\xa1\x7b\x51\x07\xaa\x13\x4d\x0d\xb7\x28\x12\xa7\xa1\xb4\xce\xc5\x6d\x6a\xce\xd2\x70\xac\x85\x87\x22\x15\xf3\x0b\x94\x96\x3c\xb3\xa0\xa2\x75\xa9\xab\x5a\xba\x68\xc4\x3d\x6f\xe5\x7e\x30\xe7\x69\xc0\x28\xba\xf3\x46\x37\xf3\x9b\xfb\x95\x27\xb8\xe6\x38\xa4\xcc\xcf\xbc\x50\x72\x50\xa0\x37\x5e\x9b\x69\x00\x3a\xb6\x14\x0d\xbb\x3d\xf0\xe3\x64\x23\xa1\x81\x8e\x31\xa7\xd4\xeb\x3a\x9f\xfc\xa5\x08\x0f\x31\x6a\xe4\xb1\x16\xdb\xef\xeb\xe7\xdd\xfd\xed\x83\xe1\x01\xbb\xbd\xf2\x1d\x85\xd1\x1c\x44\x0b\xe1\xc6\xfd\x1a\x46\x40\x12\x4b\xd1\xd2\xe4\xa2\x80\xdd\xa9\xf4\x45\x15\x9a\xc6\x89\xc9\x9e\x20\x3d\xf5\xf1\xd4\x5e\xe7\x03\xf1\xd7\x91\x75\x48\x63\xa6\x50\xfa\x00\xda\xbd\x49\xea\xdf\x43\xd3\x70\xa4\x6d\xd6\x4e\xad\x5e\xd3\x58\x24\xb8\xdc\xa0\x1f\xe7\xef\x2d\x49\x62\xf4\xc7\x9f\xb9\xd6\x05\xec\x9e\x7a\x9e\x2b\x4d\x13\x65\xaa\xb3\xba\xb9\xfb\x96\xf7\x64\x8e\xf3\xd8\x00\x7f\x3b\x89\x62\x41\xd4\x13\x6b\xcf\x3b\x82\x34\xd1\x1c\x2d\x02\xf4\x1d\xd5\x49\x8e\xf9\x55\x35\x65\x2c\x46\x61\x94\xdb\x87\xdb\xed\xed\xe2\x6e\xf7\x63\x71\xf7\xe2\x82\x35\x34\xa5\x29\x96\xef\x41\xa9\xae\xf3\xba\x31\x92\xa7\xbe\x31\x0d\x30\x89\xb3\xc9\xbb\x21\x70\xd7\xab\xea\x6a\x9a\x66\x86\x0a\xd3\xc4\x00\x7f\xac\x27\x5f\x9b\x93\x28\x20\x4e\x44\xe7\x69\x08\xfd\xd7\x94\xc7\x09\x06\x55\x9f\x1f\xef\xd6\xbb\xe7\xf5\x8f\xdb\xf5\xcf\xf5\xb3\x6f\x94\x1a\x03\x93\x3b\x33\x4e\x9e\xa7\xf2\xdf\xfd\x25\x54\xa0\xf0\x0e\xcc\xce\x8d\x3b\xe2\xb0\xa0\xdb\xf5\x52\x9e\xb1\xf4\xa9\xae\xfe\x05\xb2\xdb\x71\x2e\x18\xf6\x35\x85\x28\xc5\xea\x5a\xf4\x19\x1e\xf5\xb2\xa8\x4a\xf8\xc9\x6b\xff\x2a\x80\x47\x86\xf8\x09\xc5\x11\xed\x4c\x99\x75\xd3\x28\x48\xc0\xf5\xe0\x1d\x9a\xb6\xdf\x65\xbf\xce\xf8\x53\x50\x1a\x01\xaf\xbc\x69\x4e\x35\xac\x16\xc7\x63\x67\xdf\x70\xe5\x4c\x73\xaa\x53\x91\xd8\x42\xd8\xf5\x2f\x59\x9c\xd4\xc4\x92\x61\x41\x64\xd2\xf5\x7d\x66\xc4\xab\xbf\x7f\x73\x5d\x62\x8d\xe0\x64\xf3\x6e\xcd\x3a\x37\x3b\xa6\x58\xa0\x32\x2e\x9d\x08\xee\xc4\xac\x62\x84\xa4\x92\x39\xbe\xa1\x77\xe0\xc5\xe3\x71\x1a\xdc\x67\x24\x34\xde\xa2\xd9\xa5\x1e\xeb\x57\x5e\xe6\x0d\x7e\xa4\x0b\xd3\x90\x85\x61\x8a\x25\x82\xe6\xb6\xbe\xf3\x66\x6f\x36\xd0\xd9\x38\x2d\x0b\x23\xe1\x14\xb7\x6d\xa8\xe2\x19\x8e\x15\x96\xbe\x0d\xf7\x5d\x16\xf2\x04\x93\x9e\x47\x8c\xf0\x3f\x55\xc7\xce\xe3\x18\x10\xac\xf4\x0b\x20\x0b\x75\x9c\x04\xce\x4e\x9c\x3c\x48\xa4\xa8\x0c\xa6\x1a\x58\x63\xbc\x09\x8b\x69\x88\xf5\x21\x2a\x6f\x8e\x43\x66\x4a\xd7\xcc\x8d\x22\xda\x11\xe4\xa9\xcc\x47\x04\xd7\x9a\xc5\x42\x28\x07\x7a\x98\x37\xd7\x59\x2c\x09\x95\x6e\x0c\xe7\xff\x86\xa7\xca\x1f\x9d\x88\x04\xb7\x97\x0f\x07\x39\xf9\x0a\xf6\xa7\x59\x22\x85\x63\x86\x45\xdf\xc2\x0d\xce\xdb\xb2\xf9\x1c\xc3\xac\x19\x25\x46\x84\xb5\xe5\x6f\x97\x60\x12\x46\xa9\xd1\xb9\x6b\x78\x71\x6a\xf9\xa2\x54\x55\x99\xbb\x75\x82\x51\x30\xf1\x7c\x23\x37\xd6\xcc\xc8\x67\x7f\x46\x95\x38\x9b\xed\x60\x2c\x50\xb8\xcd\x7c\x3f\x1f\x61\xa0\xa2\xa6\x19\xe3\xd2\xf8\x87\x6d\x75\x34\xca\xe0\xbb\x76\x30\xf4\xd3\x80\x99\x47\xb0\x4f\xbc\xad\x30\xe3\x32\xff\xc2\xd3\x34\x89\x6c\x86\x3a\x19\x9a\x3c\x2c\x23\x12\xa9\x01\xfe\xfb\x79\x33\xb4\x64\x18\x67\x46\x01\xa1\x46\xe3\xfd\x19\x5e\x71\x85\x19\xdf\xb9\xa0\x29\x86\xf8\xb8\x52\x7f\xc0\x79\xda\xc8\x22\x27\x79\xea\x82\xd6\x56\xfb\xc0\x77\xa0\xb1\xe7\x9b\x3a\xc9\xb7\x33\xb2\x60\x34\xfb\xfc\x68\xa2\x4e\xb3\xab\x0a\x13\x82\x69\xe2\xb1\xb6\x26\x9e\x3b\x22\xe8\xd4\x4c\x66\x31\x9e\xb8\x73\x1a\x6d\x59\xe1\xec\xee\x44\xe8\xf4\x0b\xb9\x13\x08\x19\x65\xbd\x59\x69\x45\xee\x5e\x1a\x50\x8b\xc6\xc4\x4a\x42\xf7\x10\x52\x83\x49\x6a\x5a\xe7\x71\xc3\x8b\xc9\x66\xc5\x54\x9a\x61\xf9\x33\x4e\xc5\x1f\x50\x2a\x6f\x4a\x31\xa5\x55\xe4\x45\x93\x9f\x78\xae\xb6\x95\xc1\x5e\x4f\xf2\xed\x0c\x28\xc1\x12\x7d\x23\xa4\x3d\x79\xd3\xc0\x48\x64\x63\x5c\xab\x76\x3f\x6d\x04\xe2\xc0\x89\xa7\xe3\xe3\x54\x82\xf0\x33\x2c\xcb\xf4\x1c\x0a\xed\x80\x3b\xe0\xff\xaa\x60\x34\x4c\x74\x66\x14\xd6\x1a\xb4\x7e\xfe\xeb\xe4\x81\xaa\x3a\x0d\x82\x08\x43\x6f\xd6\x9d\x6c\x6e\x0f\xdd\x9a\xd6\x27\xf2\x52\x42\x4d\x70\xba\x1f\xc0\x83\x54\x6e\x5f\x91\x35\xba\x17\x44\x90\xa2\x8a\x3e\x14\x05\x02\x1b\x9e\x0a\x2e\x6d\x2a\x6d\x3a\xb5\xd2\x58\x05\xda\x57\x6a\x3f\x07\xee\xc2\x31\x44\xa8\x18\xb2\xa8\x5b\x38\xe4\x8e\x9c\x54\xa7\xb1\x8e\x82\xd0\x19\x27\xa6\xcc\xe8\xd2\x19\x49\x93\xd0\x4a\xc5\x62\x8d\x75\x0b\x8d\xb7\xcb\xd2\x24\x8a\x39\x4c\xa9\xe1\x27\x47\x53\x85\x96\xa9\x29\x64\xe8\x31\x61\x7d\x0c\x35\x4d\xb8\xf0\x7a\xc8\x3c\x2f\x9b\x71\xad\xbc\xed\x44\x93\x0c\x49\x6c\x66\xbc\xe3\x0b\x4f\x63\xaa\x98\xa5\x53\xc6\x48\x90\xfa\x92\x0a\x13\x4d\x9a\x44\x21\xd3\x54\x68\x3d\xa0\xd8\xb7\x0c\xf5\x37\x95\x8f\x90\xa4\x29\xa4\x91\x0f\x5e\x2c\x8c\xdb\xfb\x77\xc5\xf8\xc3\x34\x43\x9a\x02\xc7\x9d\xa2\x32\xa5\xe6\xee\x57\x6d\x0c\x31\x93\xfe\x25\xfe\xb3\x65\x41\x86\x8a\x1b\x22\x57\xdd\x9d\x0c\x75\xb6\x74\xca\xa3\x00\x21\x2f\x1b\xcb\x5f\xb1\x8b\x7d\x0b\x03\xee\xd5\x0f\x30\xbc\x32\x8a\xe3\xa5\xc8\x7b\x83\x25\x11\xa7\x5a\x8e\x46\x77\xca\x39\x98\x34\xbd\x7d\xc3\x08\x11\x1e\xf7\xd0\x41\x12\x3b\x58\x14\x1a\xd6\x77\x50\xbe\xb6\x23\x69\x39\x9d\x8a\x2c\xc2\x8a\xea\x4d\x5e\x22\x93\x77\xde\x9e\xb7\xd0\xb4\xc4\x25\x99\x53\xc1\x95\x23\x20\x5b\x56\x87\x43\x67\xec\x9f\xaf\x78\x51\x54\xed\x4f\xc8\x87\xeb\x75\x2a\x89\x46\x0e\x44\xd4\x18\xaf\xb9\xf4\x85\x2d\x3a\x95\x71\x86\xeb\xde\x6d\xd9\xde\xae\xcc\x54\x1c\x4f\x07\x29\x22\x84\x22\x89\xee\xf1\xcf\xbb\x23\xcf\xfd\xeb\x93\x9a\xca\xee\x39\x36\xf7\xb7\x77\x8f\x3b\xc3\x00\xb4\xb8\x7f\x7c\x71\xfc\x08\x5d\x0f\x86\xe1\xf0\x1e\x9c\x86\xcc\xf2\x7e\xec\xab\x8c\x2a\x70\x21\x41\xae\x8a\xc1\xbc\x82\x28\xc5\x24\xa0\x2d\xb6\x5f\x3f\x2f\xc3\x00\x49\xc5\x0c\x61\xeb\x6f\x65\xf1\x52\x10\x86\x16\xee\x5f\xcd\xe7\x99\x8c\xbf\x39\x85\x0e\x62\xc4\x27\x88\xd3\xf9\x8a\x97\x6f\x50\x2f\x5e\x6b\xc0\xec\xcf\x75\x5d\x1d\xdc\xfa\xd4\x35\xd9\x3b\xcf\x82\x2c\x46\xd8\xed\x0d\xaa\xde\xa9\xbc\x6d\x46\xd1\xd5\x8c\xc4\xc6\x58\x31\xc8\x45\x44\x99\xbc\x4f\xea\x0c\x74\x46\x52\x81\xe2\x9c\x16\x5a\xe7\x42\x50\x2b\x13\x1d\x99\xe8\xcb\xb8\x63\xb8\xc6\x2d\x68\xe7\x32\x42\x06\xd5\xb1\xea\xfc\xc1\xf9\x2d\x3e\x0b\x83\x8c\x3b\x86\x2e\xcb\xec\xe1\x8a\x25\xed\x54\x19\xed\x29\x59\xa8\x00\x52\x17\x50\xbe\x81\xf6\x67\x55\x17\x6a\x53\xf2\x63\xb3\x9f\xda\xc7\x59\x14\x2a\xd6\x23\x32\x36\x86\xb3\x70\xea\xcd\x67\x71\xc2\xa2\x68\x10\xc8\x35\xfb\xbe\x9f\xd8\x59\x0c\x91\x02\x07\x33\x94\x15\x02\xf2\x1e\x8f\x36\xb2\x3c\x39\x15\xa4\xa1\x0d\xa4\x5c\xd5\xb9\x7a\x05\x4b\x30\x53\xd5\x9d\x4b\xf8\xeb\x7c\xa9\x33\xa9\xb3\x84\x86\xb1\xa9\x6f\xcc\x45\xf7\xbe\x5a\x5d\xd5\x07\x77\xed\x24\x0b\x10\x3a\xb4\xcb\x1b\x3c\xd5\x8a\xb7\x1c\x35\x20\x2f\x85\x27\x75\x96\x70\x85\x1b\xc4\x77\xde\x3c\x54\x18\x4e\xea\xa6\xab\x3b\x15\x0d\x0c\x9c\xf3\x08\xf5\x80\x76\x5f\x67\x54\x65\xda\x80\x10\x0e\x9b\x23\xa0\x24\xc2\xfb\x50\x9b\x5b\x67\x2c\x54\xe8\x12\xed\xfe\xb5\xea\xe9\x14\xbe\x1e\xb4\x59\xc6\x22\xc4\x96\x60\x0d\x40\xbf\xf2\x64\x99\x24\x68\x5f\xed\x0a\x5e\x2a\x23\x1c\x3a\x91\x2e\xb0\x1d\x79\x28\x11\x9d\xd0\xf9\xc3\x58\x59\xfe\x13\xc0\x0f\x70\xce\xcd\x9a\xb1\x39\xe6\x12\x5d\xd3\xcf\x46\x17\x57\x3a\x8d\x7b\x39\xa2\x0d\xa0\xa9\xad\x00\xab\x62\x6e\x3f\xc1\xd3\x65\x82\x11\x5c\xad\x04\x7c\x12\x00\xcf\x04\x37\x49\xef\x6e\x8b\x19\x7a\xea\x99\x4c\x63\x31\x44\xec\xe6\x9d\x6d\x7c\x41\x0f\xe6\x3a\x8b\x04\xb1\x6e\xc6\xdf\xba\xe7\xcd\xdb\xa7\x68\xb4\x4f\x5e\xb3\xd2\x86\x8a\xe2\x90\x97\x57\xb6\xfc\x71\xb4\x4d\x64\x40\x82\xd4\x66\x6b\xda\x62\xc4\x31\x3b\x7f\x4b\x3a\xd2\x18\x13\xb8\xe7\x6f\xb0\x41\x1d\x98\x6e\x91\x99\x29\x77\xd2\x99\x8e\x19\x46\x6b\x45\x5e\xb7\x7b\xe5\xe8\x41\x34\x27\x91\x40\xe3\xb2\xd9\x7f\x40\xcb\xdd\xaf\x21\xd1\x44\xfb\xd0\xf0\x95\x49\x6c\xfa\x46\xc6\x71\xd3\xbe\xb9\xdd\x2e\xdd\x6f\x51\x1a\x3a\xe8\xee\x53\xfe\x0b\x0a\xe4\x13\x9b\x44\x15\x78\xa4\x0c\xdb\xa8\xf1\x6e\xff\xf8\x6b\xf9\x99\x04\xbf\xe6\x31\x89\x30\x59\x6d\x58\x47\xbb\x47\xbb\x2d\x2d\xdd\xa8\xbb\x64\x1c\xd3\x20\xf4\x34\xf0\x35\xa0\x9b\xbc\xea\xb3\x23\x3c\x4e\x52\x61\xa3\xe2\x4d\x55\xa8\x7c\xaa\x17\xac\x79\x42\x42\x0c\xee\x83\x13\x10\x5d\xff\x1a\x10\x04\x74\xed\x91\x32\x15\x11\xa5\x7a\x6a\x2f\xe4\x6f\xe6\x3f\x33\x4f\xd2\x10\xe1\xd0\x36\x59\xfa\x6c\x42\xf6\x98\x3d\x70\x27\xa6\x81\xc6\x02\xf0\xd5\xd2\x68\xd9\x8d\xdf\x13\x65\x12\xa9\x01\xad\x2f\x33\x3b\xec\x39\x63\x0a\x63\x0d\xbc\x28\x30\x2a\xf9\x4f\xfa\x3f\xae\x45\x24\x38\x8d\x5c\xe9\xec\x94\x05\x42\x73\xa6\xa4\xe3\x61\x75\xa2\xbc\xa8\x90\xd7\xee\x87\xd3\x83\x33\xa5\xa9\x85\x6c\xaf\xa0\x80\x57\x23\xcd\x7c\x57\xc9\xb7\xb1\xa6\xcc\xe4\xce\x52\x46\x30\x69\xf9\x9e\xc3\x47\x61\x88\x6d\xe6\x1d\x2d\x9e\xca\x94\x66\x23\x35\x89\x27\x5e\xb7\x9b\x93\x68\xa7\x88\x97\xd4\xe5\xb6\xb9\x20\x04\x93\xbc\x18\x42\xbb\x5d\x3e\x7e\x8d\x38\xe0\x32\xce\xb0\xac\xa1\xfb\x84\x26\x38\xe9\xe1\xe0\x56\xae\x74\x7c\xf3\x8a\xa4\xa6\x48\x22\x6f\x4e\xbc\xa8\x2b\xf9\x36\xc0\xf0\x71\x15\x09\xc2\x07\x82\x6c\xcd\x85\xc6\xdb\xe4\xf2\x8a\x52\x8c\x1d\xc1\xaf\x23\x32\x09\xf8\xd4\xf5\xe4\xb2\x10\x24\x88\x3c\xc8\x1b\x5f\x06\xf3\x09\xae\x93\x83\xc8\xe2\x78\x40\x1b\x11\x86\x23\x43\x90\x83\x04\xd5\x0b\xba\x77\x0b\x42\xb7\x98\x3a\x8e\xb1\xf1\xed\xe9\x30\x4d\x07\x74\xc3\x25\xff\xe4\x43\x69\x4a\xd1\x1f\xd1\x55\x0d\x92\x37\x26\xae\x3a\xea\x22\x82\x50\xf7\xe5\x7d\x63\xa6\x0d\x2d\x02\xc6\xa9\xb5\x3d\x57\xf5\xe9\xb5\xf1\xbf\x73\x89\x41\x10\x5c\x95\x56\x98\x37\x99\x9c\x96\x44\x01\xd7\x16\xa7\x30\xb1\x35\x05\x89\x12\x9d\x8d\xd0\x13\x0b\xad\x7f\x6f\x92\x0a\x92\x24\xb8\xf9\xdf\xf0\x92\x7f\x21\x7a\xaf\x05\x01\x9d\x7a\xd7\x7a\xc4\xdc\xef\x3a\x68\xa2\x1c\xcb\xf2\x1b\xb4\x72\x0f\xcd\x63\x69\x0a\x39\x6d\x8f\xc8\x7e\xb1\x63\x4f\x0e\xb7\x99\x10\x5a\x68\x11\x01\x41\x4a\xaa\xc5\x69\x50\x65\xac\x45\x1c\x4a\x8c\xf2\xbd\x56\x85\xba\xcb\xbd\x99\xe5\x5a\x23\xa6\xad\x37\x69\xf2\x74\xd5\xc7\xe7\xb1\x5f\x11\x6b\x86\x95\xa4\x3a\x2f\xf3\x66\xbf\xac\x4a\x9d\xbf\x8e\xb8\xd8\xb5\x48\x02\x53\x31\xbf\xde\x6e\xff\xbe\x82\x4b\xd0\x58\x2b\x9f\x29\x36\x25\x1b\x97\xee\xb4\xa0\x42\x22\xed\x97\xce\x5f\xf7\xa8\x9d\x59\xbb\x75\x50\x30\x26\xb2\x81\x34\x88\xf5\x35\xd0\x4c\x4a\x47\x62\xed\x5a\x30\x4e\xe3\x68\x90\xad\x1c\xd9\xb9\x73\xf6\xad\x48\x03\x8d\x50\xd6\x0f\xc8\x9f\xa0\x5e\x94\x3d\xc5\x86\x16\xa9\x92\xa9\x61\x6e\x6d\x5a\xa8\xcb\x4a\xc1\xdf\x56\xc1\x88\x54\x1b\xb2\xab\xa7\xff\x74\x71\x77\x91\x45\x42\x0c\xf5\x4d\xbb\x09\xb9\x2e\xdb\xfa\xbc\x2c\xa0\x7e\x9b\xbc\x07\x1e\x52\xc7\x8c\x72\x55\xd5\x75\xf5\x01\xea\xaa\xaa\xde\x0c\xfd\xdf\x64\xd8\x73\x1e\x21\xf1\xd5\x9e\x17\xed\x20\x5e\x27\xb8\x90\x71\x36\x4d\x89\xb8\x3a\xc8\x61\xea\xfd\x93\x3f\xf6\x34\x4a\x49\x6d\xd8\x0b\xee\xf2\xf7\xbc\x7c\xbd\xaf\x4a\x5e\x7b\x1c\xa4\x80\x58\x11\x8f\x86\xed\xf9\x01\xb4\xd0\x84\x71\x0f\x8e\x7f\xb9\x02\x53\x4a\xe8\x00\x4a\xae\x13\xcb\xf0\x7b\x7b\x59\xee\x4d\x5b\x1d\x31\xbd\xdc\x6f\xf0\x42\xab\x4c\x53\x07\xa0\x43\x05\x73\x93\xbe\x2b\xfa\x69\xa3\xb5\xd1\x3f\x39\xd6\xa0\xa1\x36\xac\xff\x3d\xb3\x17\xb6\x1b\xb2\xa8\x13\x2f\x5f\xff\x33\x2f\xef\x72\xee\xc6\xb1\x0c\x42\x85\xd8\x3b\x93\x5a\xb6\x11\xba\xeb\xaa\x1e\x33\x9a\xf5\xf7\x23\x49\x64\xc4\x34\xbb\x95\xfd\xf7\xd8\xec\xb5\x24\x3c\x16\xa6\xce\x16\x78\x73\xaa\xcf\x23\x70\xa2\x24\x5c\xe3\xbb\xb2\x3a\x1a\x50\x37\x3b\x39\x30\xf6\x64\x28\x62\xb4\x06\x4f\xc8\xdb\x38\xeb\xa1\xa6\xae\xab\x14\xe8\xa9\x39\xd2\x0c\x64\xf6\x7f\xaa\xab\x23\x4c\xc8\xad\x87\x07\x45\xc4\x50\x92\xed\x6a\xfe\x71\xe3\xb5\x7d\x71\x1b\x1f\x3e\xd8\x68\x8c\xca\x88\xa5\x58\x93\xd9\xf0\x8f\xc1\xbe\x27\x23\xe0\x58\x1f\xe9\x70\x7b\xe8\x5e\x7f\x0d\x35\x95\x71\x08\x18\x85\xfa\x63\xfb\xdf\xee\x34\x71\x1a\xa1\x7f\xff\xe8\xe4\x6f\x7c\x03\xa7\x3a\x1a\x19\x24\x68\x88\x0c\x8b\xe5\xb5\x4c\x54\x9c\x0a\x4b\x12\xf3\x52\x36\x58\x06\x9d\x4f\xa8\x31\xb5\x4c\x80\x21\xc4\x30\xb7\x8e\xe1\xe6\x74\x78\x2c\x3d\x2f\x82\x96\x54\x28\xc4\x4a\x58\x8a\x8b\x27\x5e\x37\x20\xdd\xd8\x95\x8c\x84\xc8\x04\x73\xf3\xb8\x7d\x5a\xfc\xe5\x7f\x4d\x04\x2e\xb3\x9d\x45\xb3\xb4\x92\x0c\x2d\x7a\xbf\x9e\x08\x55\xcb\x54\x1a\x21\x26\x13\xcd\x5e\x58\xac\xda\xfa\xee\xf6\x4f\xbb\x8f\x2f\x79\x69\x52\x8d\x93\x18\xb7\xcc\xa2\x00\x57\xc1\xa1\x4a\xf2\xa7\xb1\xad\xe9\xa1\x80\x9b\xcf\x95\x35\xeb\xaf\xaa\xf3\xb2\xc8\xe5\xdb\x77\xf0\x8b\xac\xcc\x94\xe3\x36\x71\xf1\xa3\xa9\xd0\xb8\x96\x19\x30\xac\xca\xd9\x9b\xc2\xb2\xa5\xb9\x79\x77\x06\x9e\x70\x77\x86\x81\x80\xb6\xd3\xd4\x3e\xcd\x4d\x14\x7b\xa4\x48\x68\x2a\x7b\x3c\xe7\x10\x74\x77\xb1\x42\xcd\x29\xb3\xba\xd3\xf0\x0c\x83\x9e\xab\x97\xe7\xdb\xc5\xc3\x9f\xee\xbe\x84\x4a\x84\xa5\x1f\x2c\xdb\x55\xf5\xe1\xc7\xab\x0c\x8d\xa6\x75\x4f\x09\x92\xb7\x66\xea\x3c\x57\xd5\xc4\xdc\x96\x92\x1a\x2f\xc0\x18\x41\xf7\x95\x3a\x15\x70\x75\x52\x4e\x6b\x3d\x9d\x03\xe4\x48\xc9\x80\x13\x1b\x23\xdb\xc8\x3d\x74\x07\xa9\x61\x6c\x5a\xca\x4c\x05\xba\x57\xfc\x7c\xaa\x61\x30\x0a\x25\x84\x38\xf9\x79\x69\x4a\x26\xb1\x1c\xa8\x33\x7a\x5d\xbb\x8e\x91\xbb\xbd\x46\x9e\x04\x9c\x0c\x77\x3e\x7f\x25\xa5\x56\x98\x96\x39\x56\x4d\x67\x02\x0f\x36\x08\xa9\x98\xc6\xca\xb6\xc7\x9f\x0f\xeb\xe7\xdd\xf6\xf1\x8f\xf5\x83\x2b\x5f\x91\x40\x43\xcc\x12\xec\x79\xb3\xa8\xe1\x13\x3f\x57\x42\x67\x62\x1b\x9c\x70\x75\xc8\xcb\xd7\xe1\x6a\x38\xe9\x09\x0c\x53\xb6\xcb\xf5\xe3\xb8\x64\x43\xea\x20\x4e\x92\x01\x93\xd6\x9a\xd7\x25\x28\x97\x28\x71\x9d\xb2\x10\x8c\x69\x67\x42\x5a\xbb\x76\x68\x10\xa9\x20\x0a\xa4\x75\x86\xef\x72\x09\x65\x03\x0f\xd7\xdb\xf1\xa7\x53\x41\x62\x20\x10\x3e\xee\x6a\xb0\x40\xe5\xa9\x19\x3b\xc1\xff\x98\x1c\xa6\x53\x8c\x6b\x34\x87\x81\xad\xba\x31\x74\x5e\x3e\x94\xa4\x88\x10\x18\xaf\xb4\x62\x3e\x93\xb4\xb0\x0a\x23\x86\xac\x93\x77\xd5\xeb\xe6\x83\x1f\xbf\xa8\x11\x54\x51\x64\x64\x14\xcd\x6e\xb4\xad\xf9\x20\xb1\xaf\xa2\x84\xe1\x36\xf6\x54\xd5\xad\xae\x8a\x1c\x0b\x03\xbe\xe0\x80\xb2\x87\xc5\x22\x48\xad\xc7\xfd\x30\xe5\x9c\xd0\x2a\xa1\x0a\x4f\xba\x28\x8a\xdb\xd2\x6b\xa3\x75\xbf\x43\x66\x38\xf1\xaa\xef\x5c\x6d\xf7\x70\x95\xbf\xbe\x62\x4d\xce\x34\x85\xab\x50\x1a\xdf\xd0\x04\x99\x4d\x66\xf2\x2e\x2f\xcb\x94\xed\x81\x34\xd1\x38\xf0\x9b\x0f\x7e\xdc\xb4\x55\xcd\x3d\x85\x80\x62\xa1\xc2\x35\xd2\x14\xc7\xdb\x02\xf3\x4f\x56\x3a\x77\x08\xcb\x22\x0b\xc8\xd9\x74\x1b\xed\x61\xa0\xbe\x3e\x7f\x44\x2a\x0d\x7a\xc9\x6d\x56\xe3\xb4\xb3\x4a\x95\x21\x98\x39\xf0\x5f\x3e\x69\xc8\x5d\x09\x9e\xca\x14\x25\x06\x86\x50\xe7\xfa\x7c\xc3\x0f\x4e\x81\x60\x14\xd8\x54\x99\xd2\xda\x6b\xac\xce\x3e\xc5\xc0\x50\x50\x19\x10\x14\x69\xe8\x5e\xc7\x71\x40\x49\xd1\xb5\x50\x44\xfe\x76\xbb\x4a\xbd\xab\x73\xcd\x3f\x19\xb2\x3c\x50\xd2\xc0\x55\x1e\x7b\x09\xc3\xf1\x73\xf3\xd4\x84\xde\x47\xa0\xf9\x55\xde\xf0\x31\x33\xcd\xe4\xc4\x82\x13\x17\x30\xbd\xb5\x6f\x2a\xf9\x9b\xa1\x27\x04\x0f\x0c\xf9\xbe\xc0\xad\xb0\xf3\x48\xfa\x7a\x4a\xdb\x49\x12\x9e\x19\xbe\x95\x62\x73\xac\xea\x76\xc0\xec\xac\x95\xcc\xc0\x48\x53\xd4\xd5\x71\x64\x35\x29\xa9\xa2\xc0\xbb\x14\xbb\x66\x08\x78\x52\x10\x80\x4a\x06\x79\xf8\xab\xb3\x15\xfb\x1d\x3f\x11\x30\x23\xa8\xfc\xa1\x2e\x03\xa0\xb6\x8b\x0e\x12\xdc\x36\xdb\x0f\xb7\x22\x2b\x9d\x44\xc8\x85\xd3\x54\x75\xbb\x82\x46\xf6\x9a\x62\x97\x00\x7b\xa5\x69\x80\xc2\x0f\x32\xaf\xb1\xb6\xb2\xf7\xa0\x20\x60\x01\xaa\x5d\x18\xc8\x4b\x9f\xc9\x18\xbb\x28\x6e\x20\x41\x00\x41\x4a\x7a\x71\xdc\x59\x59\x30\xdb\x95\xd0\x18\xf3\x40\xd7\x35\x7f\x1d\xd4\xc8\x40\x18\x1a\x5f\xe6\x82\x26\x3b\x6f\xf7\xd5\xa9\x35\xcc\x34\xde\xf5\x81\x90\xf1\x81\x5a\xf3\xf7\x3f\x6e\xc6\xaf\x0f\x42\x45\xd3\xcc\x25\xd5\xcd\xf2\x3d\xfe\xb4\x10\xd1\x0c\x55\xd5\xb6\xeb\xc5\xfd\x66\xb7\x7d\xdc\x2e\x5c\x61\x35\x44\x69\x82\xd8\x27\x5f\x74\x3a\x92\xbe\x18\x18\xdc\x10\x89\xc4\x54\xd0\x54\x87\xe3\xd8\xf0\x87\x38\x36\xd2\xd6\xb8\xaa\xbf\x76\xce\xfd\xb9\x73\xac\x06\x95\xd5\xae\xa3\x34\x2c\xa0\xef\x9e\x19\x7e\xb0\x40\x43\x92\x89\xcc\xa2\xa3\xef\xab\x76\x24\xec\xa9\x21\x11\x29\xaa\xb1\x2d\x4e\xed\xde\x61\xf5\xe6\x6d\x62\xa0\x5a\xa0\x67\xbe\xac\xca\x6e\x25\xe0\x9d\xd3\xc9\xc7\x67\x63\x11\x85\x9e\xa3\xc2\xad\x4f\x26\x9f\x32\xcb\x03\x00\x2c\x36\xca\xa4\xc6\xfa\x7f\xfc\x28\x87\x7c\x2a\xc0\x12\x66\x74\xeb\x8c\x1c\x95\xdd\x38\x27\xa6\x2e\x30\x16\x4a\x6a\x55\xfd\x5a\xfe\xf6\x89\x94\xa2\x06\x96\x0a\xa4\x74\xdd\x4d\xcc\x6b\x77\xb5\x34\x4c\xb4\xa5\x65\xfb\x5e\xa9\x62\x44\xa7\xe8\xba\x00\x93\xd2\x75\x29\x10\x3d\x60\x5b\xb2\x90\x20\x54\xa5\xcf\xb0\xdf\xf3\xbc\xfc\x91\xf3\x67\x28\xfe\x8e\xb1\x05\xb2\xd4\x20\x13\x91\x06\x9a\x9f\x1f\x4f\x7e\x50\x73\x62\xa8\x0c\x27\x95\x31\x7f\x73\x3e\x1e\x29\xc8\x9c\x0a\x86\x8d\x6c\xcc\xf7\x94\xb1\x00\x5f\x29\xfe\x69\x95\x15\xf1\x53\x1e\x64\xa2\xd0\x05\xca\x1b\x17\x0b\xfd\xe4\x6d\xab\x30\xc0\x7a\x0c\xae\xd4\x5d\xf5\x3e\xc0\x59\xcc\x59\xb6\xa0\xc2\xd0\x98\x72\xfc\xfc\xa8\xf5\xb2\xc8\xa1\x6c\x57\x20\xe6\xd9\xd1\xba\xee\x80\x88\xff\xe3\xa9\xd9\x0f\xd4\x8f\xa6\x70\x2f\x80\x80\x1b\x24\x5a\xfe\x6e\xe9\x6c\xcc\x17\x9f\xdd\x31\x01\x68\x64\x45\x30\xec\xac\x55\x5b\xb7\x2e\x02\xa4\x3c\x16\x7d\xda\x38\x6f\xb7\xfb\x1a\x9a\xbd\xd7\x80\xd5\xa0\xc3\x00\x91\xed\xff\x5b\x9f\x8d\xf1\x6c\x98\x71\xc6\x33\x44\xc7\x2a\xb2\x51\xcb\xb1\x0f\x7e\xe9\x8b\x6b\x12\x67\x58\x69\x6b\x2a\x49\x06\x44\x45\xbf\x15\xda\xd3\x24\xa1\x19\xf4\x4c\x35\x07\xc3\x76\x32\x48\x1d\x68\x92\x59\x8f\xa8\xad\xb7\xd5\x4b\xa9\xa0\x2e\x72\xa8\xd1\xfe\x1e\xbd\x46\x4d\x78\xe6\x6c\xd0\xa7\x62\xb1\x98\x09\xc7\xea\x48\x64\xa9\x13\xfc\xab\xaa\xa2\xd2\x7a\x14\xa2\xc3\xa2\x28\x61\x58\x93\x4e\xa5\xda\x56\x63\xb2\xd2\xf1\x9d\xc7\x34\x4d\x6c\x28\x11\x75\x3e\x71\xc8\xdf\xf3\x37\xa8\x31\xf0\x78\x3b\x0d\x1b\xeb\x38\x0b\x32\x1b\xa1\x5f\x08\x28\xa6\xad\x1c\x22\xeb\xb6\xdd\xf0\xe6\xba\xaa\x57\xcb\x87\x6f\x93\x2b\x6a\x43\xb2\xf1\x70\xbd\xb5\x2f\x79\x5a\x39\xa5\x69\xc4\x91\x69\x77\x8d\x74\x05\xcb\xbd\xd7\x4b\xd3\x9a\x26\x80\x75\x02\xf7\xfc\xd7\x53\xb5\xf9\x53\x0c\x2c\x1b\x4d\x45\xe4\xe0\x06\x26\x19\x6a\xe7\xe3\x43\xd5\xdb\x62\x9a\x4a\xe1\xfc\x7e\xeb\x9a\x36\xbe\x09\x32\x15\x78\x3f\x7e\xe4\x1a\x68\xc6\x04\x96\xd2\x1a\x36\x0c\xe0\x07\x2c\x98\xb3\x4c\x4c\xff\x18\xfd\x71\x47\x64\x32\x30\x4c\x77\xe5\x81\xd7\x6f\xef\xcd\x75\x3d\xb0\x09\x35\x03\x89\x5c\x0e\x7d\x58\xb6\xf3\xc1\x97\x75\x75\x3a\xe6\x7f\x07\x42\x45\x80\x92\x05\x76\x6e\xf2\xb2\x5b\xaf\x60\x07\x5a\x83\x6c\xf3\x89\x51\xa4\xd3\x44\xe2\x78\xd2\x80\xac\xbe\xee\xf2\xa9\x60\x48\xfd\x68\x18\x3e\xcb\xb2\x5f\x5e\x75\xc6\x52\x92\x3a\xe7\xbd\xe5\x8a\xb7\x3c\x18\xcd\x2c\xcd\x85\xc0\xfc\x67\x0b\xfc\x60\xeb\x71\xba\x2f\x75\x37\xf8\x16\x82\x24\x78\x7e\xbf\x6a\x5c\xaa\xa2\x6b\x2d\x04\x8f\x6c\xe9\x25\x6f\xf3\x77\x58\x61\xa8\xfa\xdd\xbf\x23\xc9\xa4\x64\x63\x7a\x23\x9d\x7f\xb2\x4e\x69\x29\x98\x9b\xee\xe6\x7d\xda\xf0\x1e\x26\x0e\x7c\x1f\x40\x07\xea\xbd\x42\x46\x6d\x5f\xdd\xf4\x23\xe7\x98\x7f\x9f\x37\x58\xb5\x04\x12\xfa\x52\xae\xa3\x11\x8e\x3b\x0f\x68\xef\xb5\x56\x89\x01\xf1\xdc\x40\xeb\x06\x75\x37\xe9\xae\xab\xda\x23\x87\xc6\x77\xab\x80\x21\xc8\x10\x39\x46\xcc\xaa\xe3\x85\xb9\x6d\x17\xcd\x0d\xc6\xbd\x81\xb6\x81\x42\x77\x86\xeb\xfb\xcc\x4b\xd4\x82\xc9\x3e\x96\x30\x4b\x29\x79\xf9\x50\x34\x08\x82\x20\x41\xe2\xe8\xcb\x00\x9d\xeb\x10\x19\x71\xb5\x45\x51\xfc\xac\xea\xb7\x41\x49\x48\xd7\x08\x22\xb3\x25\x70\xdd\x6c\x30\x6e\xcd\xdc\x97\xa1\x41\x40\x42\x86\x7d\x1d\x0d\xbf\x33\x0f\xaf\xce\x77\xf0\xca\xe5\x85\x40\xee\xf4\x70\x1a\xa0\xc0\x9e\x80\x76\x57\xb8\x8c\x66\xf7\xbb\x08\x23\xcf\x30\xd3\xb4\xd5\x01\xea\xed\xaf\x45\x3b\x4a\xb1\x4d\x4e\x15\x32\x89\x26\x98\xe0\xe5\x5b\x67\x00\x1a\xae\x3d\x24\xd3\x74\x67\x8d\x12\x19\x19\x57\x32\x3f\xc2\x77\x5f\x28\x4c\x83\x20\x8e\x03\x5c\x56\x2d\x47\xb6\x89\xe3\xfb\xc6\x34\xc4\xe8\xf9\x1f\xbc\xfc\x77\xf7\x21\xdc\xef\x34\x4a\xd3\x51\xb8\xbe\xdb\x68\xa7\xcf\x3b\x7f\xb3\x14\x8c\x0d\xb5\x82\x43\xcf\xf8\x71\xb9\xa3\x77\x3d\xb5\x51\x0c\xfa\x99\xb7\x9d\xf7\x79\x87\x24\x00\x76\xb2\xd8\x2e\x2c\x0c\x90\x17\x7a\x4a\x3c\x3f\x40\x03\x74\xbd\x64\xac\x8d\x1c\xb2\x21\x2e\xe7\x05\x3c\x96\xaf\x55\xde\x3f\x0f\x93\x69\xe4\x6b\x34\x5c\xa4\xeb\x9e\xff\x1a\xf0\x1c\xdb\x9e\x69\x1c\x04\xb1\x33\xa9\x65\xcb\xcb\xd7\x02\x30\x06\x34\x3f\x48\x52\x2d\x70\xb9\x44\x5c\xca\x4d\xde\x4e\x06\x63\x96\x18\xfe\xdc\xa6\xad\x8e\x08\xec\x1b\xdc\x53\x96\x06\xa9\xe1\xc4\xee\x4c\xea\x89\x06\x6e\xd7\x0e\xa0\xa2\x61\xe5\x3c\xc2\xe0\x6d\x23\xa7\x29\x05\x87\x91\xc7\xb7\x33\x27\xd6\x47\x83\x40\x10\xed\x12\x5f\x57\x05\x97\x6f\x13\x1e\x03\x1a\x04\x32\x0c\x50\x4a\x73\xf1\x70\xfb\x37\x72\x02\x5d\xe7\xc4\x48\xe0\xdf\x55\xaf\xb7\x43\x83\x70\xf2\x5a\xa4\x0e\x94\x35\x2f\x71\x43\x6e\x3e\x93\x48\x99\xfa\x3b\x34\x08\x54\x90\xa0\x45\xf6\xe7\x7f\x2f\x9e\x47\x93\x57\x05\x02\x8c\x61\x79\x5b\x9a\x2a\x98\x39\xc3\xb2\xeb\xc8\x82\x20\x1a\x94\x6c\x0f\xf2\x87\x5d\x2b\x0f\x23\x4f\x71\x68\xe8\xc8\xca\x93\x93\x68\x75\x21\x98\xae\x1f\x84\xd4\xc6\x8d\x56\xf9\xab\x21\xaa\x78\xc9\x7b\xb5\xa4\x39\xdb\x2a\xb5\xc7\x42\x00\xc0\x1c\x89\xef\x06\x40\xf9\xab\x43\x9a\x08\xaf\xc9\x7f\x33\xc7\x7a\x6d\x3b\xea\xd4\x28\x7c\x38\x71\xfe\xab\xf3\xdd\x80\xf2\xd1\x58\xdb\x34\x20\x41\x6c\x8a\xf6\xa5\x97\x75\x98\x1f\xa9\x84\xd0\x08\xc3\x0c\xd6\x51\xe4\xf5\xd4\xcf\x9e\xf4\x0f\x83\xd8\xb0\x25\x62\x7c\xc7\x12\x31\x7d\xa6\xee\x6f\x23\xbf\x33\x26\x36\x0d\x48\x44\x0d\x23\xcb\xc3\x76\xf8\x39\x49\xc4\x39\x26\x7b\x91\x68\xd3\x6c\x7a\x26\x65\xb0\xe1\x07\xe8\x8d\x1f\x8a\x94\xcd\x99\x07\xb0\x74\x33\x01\xc5\xfc\x5d\x6b\x0c\x11\xb3\x1e\xd7\xdd\xdd\x0f\x4b\x84\x9b\xb8\xd6\x24\x06\xac\x0b\x3b\xf2\x33\x56\x74\xbb\x00\x44\xd7\x94\x50\xac\x9b\xde\xae\x97\xbb\xce\x43\x1f\x8a\x76\x74\xcd\x2c\x70\x48\x1d\x37\xc5\x36\x38\x15\xe6\x8a\xbb\x68\x40\xa8\x12\xcc\xda\xb7\x88\x55\x99\x55\x41\xc3\x7e\xca\x50\x6c\x0e\x14\xba\xc7\x3d\x58\x04\x18\x69\xba\xae\x4a\x55\x3d\x00\x96\x8b\xba\xbb\x62\x89\xc0\x15\x65\x21\xdb\xfc\x3d\x6f\xcf\x98\x24\x9e\x9d\x06\x84\x09\x81\x05\x94\x2b\xe0\x16\x24\xd9\xfd\xa8\x12\x93\xb1\x84\xa6\xbd\xf5\x83\xd9\x36\x66\x01\xc5\xf0\xab\x15\x85\xe5\xc5\x67\x83\x29\x0b\x19\xba\xa3\x4d\x0b\x47\x37\xb4\x49\xd6\xad\x87\x56\x41\x8b\x4b\xb8\xeb\xbc\x8a\xaf\x02\x64\x34\x20\x3c\x00\xcc\x28\x1c\x1b\x38\xa9\xca\x20\x5b\xba\x39\x96\x7e\x1b\xcc\x26\xc2\x85\xd9\xd2\x97\xbc\xd9\x5f\x75\xde\x43\x5e\x8e\xd7\x4a\x22\xa2\xd8\xa6\xc7\x0f\xd5\x3b\xa0\x22\x8c\xa8\xea\x21\xe7\xd4\xe4\xdd\x08\xce\x5c\xb0\xd4\xb3\xb2\x8f\x4f\x29\x95\xd1\x8b\x75\x5b\x60\xb3\xa8\xc1\x6c\xbc\xee\x79\x55\x94\x11\x53\xb3\x25\xab\x52\xe6\xc5\xd0\x3b\x1e\x39\xc7\xa9\xa3\x9a\x43\x36\x53\xff\x2f\x77\x9a\x24\xc6\x65\xed\xbf\xb7\x17\x6c\x11\x5f\x6f\xb5\x04\x6c\x2e\x6a\xf3\x74\xfb\x30\x5b\x5f\xf3\xc9\x5b\xd7\x82\x23\x20\x8c\x77\x63\x88\xb7\x70\x75\x3a\x0b\xde\x87\xb5\xa7\xbd\x65\x1a\x59\xff\xe4\x51\xa0\xd5\x5c\x3b\x73\x65\xd4\x31\x0c\x44\x86\xb1\x4a\xaf\x08\xf0\xfb\xf0\xf3\xee\x68\x65\x18\x3e\x76\x25\x7c\x6c\xb8\x52\x97\x63\x6f\xb4\x59\x8c\xbf\x67\x48\x22\x91\xa6\xa3\xaa\xad\x89\x84\x47\xd7\x27\x96\x48\x04\x8c\x52\x01\x07\x68\xf7\x95\xf2\x4d\x2c\xc4\x18\x1b\x4a\xf8\xa9\x99\x52\xfe\xae\x4f\x26\x99\x70\x29\x7d\xeb\xfb\x54\x7d\x8d\x10\x0d\xc2\x10\xac\xd6\xb1\xc9\x7c\x5a\xa6\x9d\x8b\x3d\x6f\xaa\x8f\x4b\x83\x30\x4e\x0c\xa1\x67\xb3\xaf\x3e\x16\xa7\x76\x5f\xd5\xf9\xbf\xa1\x7e\x2c\x61\x64\xe8\x84\x31\x95\xee\x29\x9f\xaa\x81\x8f\x40\x83\x30\x09\x8c\xfc\xda\xe6\x66\xb5\x7b\x3c\x94\xb9\xea\xe6\x40\xed\x5b\x49\xe8\x24\xfc\x57\xb9\xd6\xb9\x3c\x15\xed\x79\xf2\xf9\x12\x65\x0a\xfc\x74\x5e\x22\x3d\x8f\x23\x73\xa1\x41\x48\x89\xc4\x5c\x99\xb2\x58\x72\x93\xa2\x73\xd9\x92\xae\x83\x10\xa9\x61\x2b\x68\xdb\x02\x3d\xb6\x5b\xf5\xec\x29\x91\xbb\x0e\x92\xa0\xfa\x54\xa5\x35\xd4\x37\xdc\xd0\x84\xba\xd7\x37\x3b\xee\x42\x16\x47\x19\xf5\x6f\x73\x75\x6a\xe5\xde\x42\x7e\x0c\xfd\xf6\x6f\xc4\x38\x68\x10\xa6\x16\x29\xfa\xfd\xea\xc7\x70\xf7\x09\x33\x96\x24\x56\x92\xa9\x84\xda\x44\xe7\x9b\xaa\xe4\xc5\xc3\x09\xe5\x9d\x2f\x63\x91\xdd\x41\x59\x1a\x47\x9e\x05\xfc\x75\xdf\xae\x00\x0b\x62\x5d\xb3\x20\x91\xa1\x5c\x45\x39\x9c\xaf\x87\xfd\x1c\x37\x37\x9e\x43\x1b\xaf\xc3\x87\xf3\x86\x3a\xa9\xae\x93\xa2\x54\x3b\xeb\xcf\x10\xec\xcf\xb1\x32\x74\x3d\x75\x12\xe9\x81\x21\xb6\xe5\x6f\xb6\xb6\x67\x3c\xb2\x78\xa4\xc1\xc9\x42\x9a\x42\x46\x6b\x88\x5f\x04\xfc\xdc\x01\x52\xe2\x78\xbb\x2d\xe5\x9e\xe7\xe5\xed\xf2\xf1\xd3\xae\x82\x05\x58\xac\x6b\x4b\x6e\x31\xbc\xb3\x38\x1e\x8b\x5c\x5a\xe1\xf8\x8b\xf7\xe3\x8d\xc1\x50\x48\x1a\xda\xa0\x9a\x91\xed\xf4\x71\x6b\x1a\x84\x52\x19\xfe\x8d\x15\x14\xfc\x0c\xca\xd9\x28\x5f\x00\x01\xba\x83\x74\x84\x38\xb1\xdb\xc7\x3f\x47\x03\x42\x31\x45\x5d\xf1\x14\x5c\xf3\xbc\x98\xbc\x73\x08\x13\xc4\xd3\xef\x34\xc0\xb4\x29\xce\xb0\x80\xb2\x7b\x30\x59\x9f\x50\x85\xfc\x6e\x72\xaf\x40\x69\x68\x87\x0e\x74\x73\xd7\xff\xce\x0d\xb0\x70\x51\x1c\xf7\x95\xd7\xb1\xf7\x29\x20\x1a\x84\x5a\x28\x93\x01\xd7\x2d\xd4\x4b\xe7\x0c\xd8\xd6\x28\xa0\x14\xc3\xa2\x28\x70\x8a\xef\x73\x28\x20\x4f\x83\x88\x84\x12\x03\xa1\x77\xfc\xdf\xe7\xe1\x03\x47\x84\xa6\x01\x19\xe8\x3d\xb9\xa8\xc9\xf8\xe1\x22\xc2\xcc\xd6\x6a\x8b\x7a\x79\xd3\x1c\xab\xfa\xf2\x25\xfb\x31\xed\xbf\x5d\x44\x32\x8d\x75\x0a\xeb\xc7\xf5\xe8\xc2\xa1\x8e\x11\xde\xa5\x4f\x85\xce\xfd\x22\x13\x45\x24\x75\x25\x13\x43\xf6\xcd\x0b\xf0\xec\xf8\x7b\x46\x91\x5d\x96\x91\xcb\xfc\xa5\x41\x0f\xf2\x50\x8d\x83\xb8\x93\x23\xb8\xc0\xec\xd8\x92\x6b\xe4\xc3\x52\xfe\x0e\xa4\xc2\x34\xc1\x7b\xd5\xc2\xb6\x7a\xb1\xf0\xf5\x3a\x6f\x79\x31\x20\x14\xa0\x41\x14\xc7\x59\xd4\xe3\xb3\x97\x55\xf9\x3a\x8d\x77\xd2\x20\x4a\x88\x71\xbc\x5f\x36\xab\xbf\x46\xcf\x9f\x10\x16\x9b\x55\xbc\x84\x3a\x97\x0b\x39\x64\xdf\x1c\x73\x3a\x75\xbd\x63\x8a\x25\x07\x2f\xe5\x67\xe2\x9b\x5d\xa7\x24\x52\xa6\xf4\x05\x14\xd4\x70\xb8\x04\x3b\x7d\xba\x42\x46\x68\x82\xfc\xc7\xff\xf9\x8f\x6e\xd8\xc8\xbc\xe5\xbb\x63\xd5\x42\x0d\xbb\xe3\x49\x88\x22\x97\x6e\x87\x89\x68\xca\xa3\xc8\xed\x7f\x57\x88\x0b\x3e\xf7\x6d\x1a\x23\x54\x7f\xde\x81\x7a\xf5\xe1\x85\x88\x05\x99\x23\x42\x25\x41\xe7\xff\x72\xd9\x3a\x70\x39\x71\xd7\xcf\x22\x9e\x24\xbe\x84\xf7\x93\xac\x5e\xd7\x4f\xd2\xc0\x80\x32\x4d\xdc\x6e\x36\x46\xdf\xf5\xd3\x02\x21\x2d\x5c\xa9\xcf\x95\x85\x69\xd0\x5d\x15\x1d\x1c\x28\x5f\x73\xaf\x46\x4a\x83\x48\x92\x08\xed\xf8\xaa\x7c\x80\x8f\xbb\x8a\x97\x5f\xd5\x16\x74\xfd\x13\x48\x42\xa3\xb0\x35\x2e\x4b\x9a\x74\x93\x1a\x37\x9c\xc5\xfd\xd5\x62\xb3\x59\xac\x1e\x9f\x77\x9b\xf5\x8f\xf5\x83\xbb\xac\x22\x02\x01\x07\xaf\x27\x5e\xab\x9c\x97\xa4\x6f\x50\x44\xba\x42\x9d\xc2\x14\xc3\x0f\x66\x99\x22\xa0\xfa\x8c\x9a\x7a\x9c\x98\xc6\x91\xe2\xda\xe9\xc9\x20\xfb\xae\x3b\x2d\x44\x1c\x19\x07\xc4\xa9\x78\x73\xdb\xa9\x37\x54\x9d\xe5\xea\xe9\xf7\x7b\x7b\x35\xd2\xb1\xc2\xe7\x6d\x8c\xe2\x55\xeb\x56\x9a\x38\x4c\x64\xec\x29\x13\xbb\x5b\xbd\xf0\xa9\xe3\x90\x66\xca\x24\xe7\xef\xb9\x5f\xe1\xe2\x90\x33\xe4\x06\xcf\x25\x3f\x7a\x9b\x71\xca\x4e\x39\xeb\xa5\xc6\xa1\x16\x60\x31\x0a\x28\x93\xb9\x73\xe7\x8c\x62\x25\xed\xc6\x77\x93\xb7\xdf\x4f\xc2\x35\xc4\x09\xc1\x70\xbb\xad\x7f\x5b\x96\x6d\xed\x9b\x32\x86\x78\xcc\xdd\x6f\xe1\xcb\x2c\x51\xa3\xff\x12\x71\x2c\x81\x9a\x94\x6e\x29\xa1\x58\xbc\x56\x9d\x81\x63\x93\x31\x26\xbe\x4e\x83\x38\xa1\x81\xaf\x79\x00\x99\xe3\x8a\xbd\x69\xe1\xe8\xee\x21\x61\x81\x8b\x07\xff\x40\x99\x00\x69\xbb\x18\x20\xda\xc5\x2a\x1b\x27\x96\xf0\x5a\x41\x71\xcf\x4b\xde\xcf\xbe\x98\xc6\x34\x64\x6e\xc2\xf6\xe6\x70\xe3\xdb\x65\xc4\xf4\xc0\x0d\xf0\x30\xd4\xa7\xba\x6a\x11\x84\x7f\x5f\x29\xff\xe9\xa8\x62\xe8\x84\x15\xd5\xeb\xeb\x80\x76\x62\xba\xfe\xcf\x2e\xb9\x31\xd5\x8c\x28\x4f\x93\x61\xc8\xfe\xdb\xbd\xa5\xba\x9b\xa9\xc4\xa7\x41\xcc\xb8\x09\x4b\x21\xe9\x99\x99\xc8\x83\x7d\x33\x66\x9a\xe9\x64\x50\xde\x76\x75\x90\x2b\x7e\x6e\x2e\x4b\x7a\x68\x10\xa7\x91\x09\xd8\x1b\x06\x76\x0c\xd5\x79\xe3\x7c\x6c\x94\xbb\x03\x20\xcd\x6c\x74\x0d\xd3\x4b\x57\x80\xb5\x65\x7e\xa7\x88\xb3\x08\x70\xd7\xcd\x65\x15\x3f\xf3\xdc\x47\x77\x63\x1e\x0b\xd9\xbb\x00\xdb\x9a\xcb\xb7\x6e\x10\x5d\x75\xee\xd5\xfc\x08\xe6\xb1\xce\x0c\xbf\x20\x56\xa3\x1a\x11\x8c\xbe\xca\xb4\xeb\x41\x35\xaa\xb3\x3f\xf7\x3a\xd2\xdd\xaf\x3c\xc4\xed\xa5\xf3\xdc\x9e\xa1\xc9\x8b\xfc\x74\xe8\xa1\xa2\x34\x88\x45\x18\x99\x94\xf1\x9e\x37\xd7\x05\x9f\x2d\x2d\xe9\xba\xe9\xd0\xa4\xf8\xb8\x86\xcd\x49\xb4\xf5\xc3\xf2\xe9\x93\xae\x32\x10\x38\x4f\xdd\xf4\x30\xeb\xc9\xec\xaa\x18\x4b\x06\x28\x74\x75\xb5\xbc\x6a\x4f\x03\x73\x26\x96\x3c\xa6\x36\xeb\xbb\x41\x6e\x40\x83\x5e\x77\x12\x11\xb3\x7c\x68\xdd\x61\x72\x50\xcd\x72\x93\xbf\x03\xff\xb0\x32\xa9\x17\x6f\x54\x42\x82\xe6\xd8\xfd\xe2\xcf\xdd\x62\xb9\xbd\xfd\xb1\xde\x2d\x17\x0f\x3f\x2c\x3b\x35\x0d\x62\x15\x65\x68\xc6\x1f\xab\xaa\x70\xd2\xbc\x34\x88\x21\x4a\xd0\xbb\xda\x1c\x78\xdd\xae\x86\xfe\x53\x0c\x31\x8b\x8c\x2a\xcf\xf9\x3a\x2f\x0d\x7d\xe9\x1d\x6f\xfc\x60\xf6\xfd\x12\xa3\x81\x61\xc4\x6e\x4e\x06\xc9\x38\xbe\x3b\x60\xdc\x48\x10\x74\xa3\x76\x55\x57\xc7\x91\x0a\x89\xed\xa4\x53\xa6\xd2\x09\xd0\x75\xc9\x8b\xe2\x86\xf7\x5d\xb2\x80\x5b\x5f\xf0\xa6\xe0\x2a\xe7\x6d\x55\x2f\xf7\xd0\xb4\x63\x11\xf4\xae\xa7\x8c\x63\xc7\xe1\xaf\xd4\x63\xf9\xd0\x19\x09\x6a\xb4\x09\x27\x41\xe7\x83\x0e\xa2\x8d\x03\x16\x95\xc1\x62\x93\x04\x94\x6b\xdd\x97\xf5\xb8\xaa\xfa\xd1\xcc\x4d\x02\x00\xc4\xc3\xed\xcc\x24\xb0\x72\x47\x63\xb1\x93\xbf\x13\x0f\xb6\xa7\x22\x92\x49\x43\x2c\xfb\xbf\xa7\x5e\x57\x75\x6a\xcf\x7c\x69\xf0\x27\x21\x21\x86\x9f\x69\x5f\x7d\x78\xaf\x79\x7c\x99\x30\x05\x66\x58\x93\xab\x5f\x67\xb7\x52\x4e\x9e\x2a\xe4\x69\x9c\xf9\x94\x73\xe7\x44\x0d\x9d\xd0\xc1\x3b\x8a\xac\x12\x6e\xcb\xdf\x60\x2c\x65\x4b\x83\x24\x0e\x13\x4c\x5c\xe3\x18\xf3\xf0\xb4\xf1\xab\x39\x4d\x51\xb4\xdd\x71\xd4\xd4\xf0\xe5\xcd\x42\x34\x83\x40\xac\x6b\x56\x06\x76\xde\x18\x3e\xe6\x65\x75\x38\x54\xe5\x76\x6b\x08\xda\x6e\x55\x3a\xda\x83\x12\x6a\x8b\x94\xee\xa0\x1a\xcc\xcc\x84\x66\x14\x33\x37\x0e\x6a\x3b\xb9\x06\x8b\x28\x31\x75\x4b\x55\x3d\xf1\x80\x12\xc6\x02\x9c\x51\x6d\x8e\x82\xdf\xee\x8c\x4c\x87\xd2\xb2\xb3\xac\x80\x17\xbd\x5b\x3d\xbb\x66\x24\x69\x14\xbb\xf0\xc6\x2e\xef\x63\x1b\x49\x9a\x44\x49\xda\x6b\x86\xfb\x9f\x33\x82\x12\x10\x56\x13\x7e\x89\xdb\x6e\x31\x4f\x68\x4c\x83\x24\x4b\x62\xb4\x5f\x3b\x17\xc6\x9d\x22\x4b\x23\x83\x08\xcb\xa1\xde\x7e\x54\x4f\xa7\x5a\x7a\xd6\x43\x1a\x24\x9c\xa4\x32\x1c\x24\x67\x07\xea\x85\xdd\xcc\xff\x3a\x03\x98\xf0\x38\x44\x43\xb4\x39\x1d\xa1\xbe\xac\xd9\xea\x7a\xa4\x80\x39\x42\x3f\x65\x11\x38\xd2\x0c\x82\xd4\x09\x07\x82\xd9\xfd\xab\xdb\xd5\xa5\x0a\x36\x0d\x12\x11\xc6\x46\x7c\xf8\x33\xee\x34\x1a\x24\x32\x08\x91\xad\xf4\xbf\xab\x5a\xeb\xa1\x2b\x92\xc8\xd0\x10\x60\x58\xcb\xc1\x09\xb2\xcc\x6e\xe2\x89\x8c\x23\x47\x2a\x70\xd5\x7d\x89\xb1\x3c\x62\xd7\x01\x80\x19\x6a\x81\xc2\x92\x10\x8d\xdb\x15\x24\x44\x0d\xf6\xec\x8d\xc9\xea\xe1\xfc\x18\xf7\x84\x04\xc0\x9d\xc9\x89\x94\x4d\x1e\xbc\x1b\x5a\xf1\x25\xee\xa9\xd9\x56\xde\x7b\xac\xea\x19\xf9\xe2\xee\x50\x1d\x1a\xe5\x70\x28\x40\xd4\x0e\xf0\x6e\xdf\x09\x0d\xd2\xd8\x31\xb8\x58\x0c\xd8\xa2\x54\xdd\xac\x72\xe5\xf8\x93\xf0\xe0\xfc\xd2\x45\x09\xe5\x58\x94\x73\x55\x14\x55\xb7\x4f\x7c\x9b\xc4\x7d\x29\x51\x14\x37\xde\x43\x55\xb6\xfb\x28\x30\xe1\x0d\x77\x13\x21\xc9\x52\xc3\xc2\x5b\xe6\xe5\x6b\x18\xcf\xef\xc8\x34\x0c\x4d\xe6\xb3\x81\x52\x59\x1a\x34\x57\x63\xf4\xc9\x22\x69\x0f\x8c\x23\x8a\x46\xfc\x81\xff\x5a\x97\xdd\x2e\xd3\xba\x39\x41\x63\x95\xd2\xc8\x97\x9a\x81\x5a\x42\x5e\xa0\x5a\x8c\x6d\x4f\x48\xec\xd6\x9a\x3f\xfe\x5a\x0e\x8d\xd4\xf9\x18\x14\x4d\xba\xed\xd3\x26\x68\x0c\xcf\xe3\x10\x68\xdc\x75\xc8\x78\x9f\xdf\x69\xa6\xfb\x17\x4d\xb4\xb0\x4c\x06\x25\x34\x79\x33\x44\xd0\xd3\x80\xd2\x50\xe3\x7b\x36\x08\x7e\x03\xb2\xdc\x6d\x5e\x9e\x9e\xee\xfe\xf2\x5d\x52\x70\xeb\x07\x16\x82\x26\xbe\x41\x04\xd4\x14\x93\x6e\x78\x01\x03\x65\xda\xae\x0d\x14\x21\x1e\xce\x25\x78\xdb\x2c\x07\x01\x33\xca\x04\xb0\x6c\xc8\xa8\x84\x05\x34\xdb\xea\xb9\xea\xd6\xbf\xf1\x57\x4a\x33\xb3\xe8\x3f\x0f\x3e\x70\x16\xb2\xd0\x66\xad\x16\x45\xb1\x2e\xdb\xbc\x3d\xdf\xfa\x34\x21\xcd\x62\xa3\xcf\xe2\xa0\xd9\x26\xb0\xe1\x28\xff\xba\x0e\x59\x80\xb1\xaf\xc3\xa9\xd8\x70\xfd\x49\x0c\x95\x66\x99\xc2\x37\x6b\x23\xd2\x36\xc4\x89\x71\xa9\xd9\x35\x8b\x72\xa2\x19\xf7\x12\x12\xdd\x26\x52\x73\xf5\x79\x3e\x62\xfc\xa1\x79\x1c\x24\xe0\x0d\x8d\xae\xe1\xa9\xe0\x67\x1b\x50\xfd\x32\x08\x41\x39\xd3\x18\x8c\xea\x8e\x8b\xdd\x33\xf2\xcc\xd4\x67\xef\x6c\x65\xd8\x53\x55\xfc\x0d\xea\x82\x72\x50\xd1\x10\xd2\xfe\xf8\xe1\xd4\xc3\xbe\xbe\xbe\xe0\x86\x1f\xef\x90\x97\x3e\x0b\x33\xd1\x96\xe8\x7a\xc9\x8c\x27\x03\x6c\xde\xf7\xea\x1d\xea\x2d\xfc\xba\x08\xb5\xfc\x33\x74\xb3\x5c\x42\x24\x6c\xa8\xf6\xf7\x22\xd6\x54\x05\x0a\x55\x30\xad\x76\xca\x48\xe9\x74\x98\x34\xa0\x2a\x49\x9c\x94\xc2\x5f\x33\x86\x08\x55\xdc\x40\x8c\xff\xbc\xba\x73\x33\x73\xc7\x5d\x8d\x62\xd7\x2e\x49\xe0\x58\x7f\x9f\xb9\x84\xd1\xf8\x56\x00\x52\xf5\x3c\xba\xdd\xbc\x71\x4d\x20\x8d\x32\x84\xdb\x0d\x9d\x80\xca\xec\x17\x61\x41\x18\x63\x19\xd9\x3d\x7f\x03\x53\x0d\x37\x7d\xfc\x19\x9c\x01\x0b\x62\xc3\x89\xe4\x92\xa9\x06\xe7\x84\x4f\x1f\xbb\x2e\x29\x87\xc8\x01\x53\x17\xa5\x32\xa0\xcb\xdf\x4b\x81\xb1\x40\x13\xdc\x36\x1f\x2a\x05\xf7\xcb\x97\xdd\xba\x54\xc7\x2a\xf7\x8f\xcf\x08\x09\xdc\x92\xd1\x4d\xbd\x89\xa1\x3b\x39\x19\x01\x91\x74\x73\x19\x64\xd5\x60\x21\xde\x38\x04\xcb\x42\x22\x98\xd1\xef\x12\x79\xeb\xa8\xde\x07\x22\x95\x5d\x17\xca\xd4\x48\x32\x08\xd7\x11\x57\x04\xff\xc9\x75\x43\xca\x8d\xa0\x44\x75\x3c\xfb\x13\xb1\x98\x58\x9d\xfa\xee\xc6\x47\x11\x8c\xb9\x17\x1d\x82\x44\x00\x35\x3f\xa9\x7c\xf8\x95\x59\x14\x25\xcc\xda\x3e\x2f\x65\x2e\xab\xba\x9c\x31\x3f\x58\x14\x1b\x6e\x45\x63\xc8\x76\xab\x28\xf6\x32\x09\xfa\xf9\x57\x1f\x51\x8a\x69\x42\x9d\x9b\x6d\x75\xc5\xcf\xe3\xe1\x1d\xba\x8e\x8c\xe3\x6b\xbb\xe6\x27\x69\x0d\xb0\x39\x4b\xd9\xf5\x56\x01\x7a\x30\xa7\xfe\x73\x81\xfa\x09\xf9\xbc\x31\xc3\x62\x12\xa2\x4e\xc3\xa2\xdd\x23\xa4\x75\x60\x01\xb0\x38\x4d\x10\xad\x89\xfa\x9e\x7f\x01\xaf\xef\xf3\xd2\x2e\x23\xae\x00\xa6\xeb\x25\x52\x2c\xc0\x30\x81\x71\xcc\xae\x88\x81\x44\x86\xed\x95\x44\x04\x2b\xef\x44\xde\x56\x1f\xe5\xe8\x32\x09\x08\x14\x92\xea\xe6\x1f\x7a\x6e\xe3\x6d\x83\x51\x1e\x39\xce\xf3\x35\xaf\x8b\xf3\x13\xaf\xf9\xa1\xe9\xb9\xc3\x2f\x5f\x2d\x23\xa1\xa1\x4c\x96\xbc\xe0\xf5\x15\x6f\x50\x1b\x63\x72\x5a\xc6\x12\x0c\xe8\x8b\x93\x10\x05\x6c\xaa\xba\xdb\x80\x90\xb4\x17\xdc\xf6\xc3\xd2\x90\xa6\x26\x86\xfa\x9e\x77\x16\xda\x08\x41\xc3\xd2\x44\x60\x14\x0f\x78\x73\x76\x51\xf2\xb6\xce\xb1\x30\x7a\xfc\xf4\xa9\x48\x0d\xdd\x9e\xe3\xd1\x32\x11\x5e\x4b\xcb\x65\x3b\x65\x89\x4a\x83\x7e\xa9\x19\x0b\x6a\xd2\x80\x71\x12\xc6\x76\x09\x5d\xb4\x6d\xfd\xa9\xbe\xc3\xd8\x71\x9a\xbc\x1a\xae\x43\x42\x1d\x9a\xe3\x58\x43\xe7\x44\x81\x5a\x6d\xbf\x4f\xee\x58\xc4\x34\xb2\xe1\xd2\x25\x6f\xa6\xcf\x23\x32\x42\x0d\x87\xdd\x30\xd4\xc2\x44\xa6\x11\x5b\xd3\x70\x0d\xed\x79\x40\xc0\x49\x03\x26\x85\x71\x99\xdf\x73\xf8\x70\xc5\xb0\xc8\xd3\x62\x68\x82\x26\x1f\x47\x45\x09\x96\xd2\x75\xbf\x26\xdb\x6a\xd3\x73\xa9\xfc\x33\xf9\x1f\xd7\x47\x50\x42\x7d\xd1\xb9\xd9\xa4\xfc\xcb\x52\x82\x63\x16\xd7\x12\xcd\xde\xaa\xa2\xb3\x9a\xfc\xa7\x53\x92\xa8\x3e\xa9\xfa\x00\x1f\xcb\xcd\xd2\xa9\x17\xce\x4c\xae\xfe\xc6\x80\x6b\xd6\xa3\x8c\x2b\x24\xe6\xaa\x2b\x9f\xbd\x61\x20\x55\xe6\xcb\x91\x16\x52\x8e\x4d\x3c\xa6\x79\x82\xd6\xba\xcb\x01\xa2\x3b\x3f\xb1\x93\xd2\xce\xee\xef\x4b\x3d\xa6\x70\xd0\x7e\x67\x4b\x83\xd4\x88\xff\x95\xa7\x83\x4f\xc4\x0f\xac\xfe\xe9\x69\xb9\x0e\xec\x3c\xfa\x51\xb5\x50\x9b\x12\x90\x79\x63\x35\x25\x3a\xc1\xb0\x9a\x47\xf8\x9b\x4c\xd2\xf8\x8c\x61\xa0\x1c\x94\x1d\xe9\x7b\x46\xd3\x23\x0d\x99\x40\x4a\xaa\xdb\x55\x8f\x01\xef\x7e\xce\x74\x6a\x9e\x0e\x51\x06\x5f\x1b\x32\x69\xc8\x83\xb0\x27\x65\x95\x70\xab\xde\xc7\xfe\x78\x1a\x72\x8a\xf9\xb2\xa7\x53\xc9\xcb\xdc\x5d\x05\x73\x53\xa8\x5d\x0b\xed\xa9\x9c\xf8\xe9\x69\x44\x39\x7e\x06\x4b\x63\x02\xef\xcb\x53\x3b\xed\x02\x09\xe6\x0b\x0e\xfc\xd7\x50\x58\xb3\x73\x8b\x42\x86\x28\x80\xc5\xb1\x2a\x8a\x6a\x03\xc7\x16\xcc\xeb\xf7\x6e\xf3\x6f\xed\xbd\x69\x9c\xa4\x08\x78\x41\x8b\x7d\x77\xfd\xf8\x8c\x14\x77\xfe\x2a\x2c\xc6\xa8\xf4\xa1\x6a\xda\x67\x90\x50\xb6\x57\x03\xc7\x28\x4d\x88\x46\x8a\xaa\x6e\x3a\x6d\xf7\x79\xad\xee\xaa\xf6\x51\x2f\x0b\x7e\x6a\xfc\xf2\x95\x26\x40\xb9\xf6\x80\x31\x28\x8a\xc1\xc6\x96\x52\x08\x11\xc2\xee\xbf\xb0\x05\x8c\x3c\x21\xa7\xdb\x25\x4f\x24\x0d\x52\x46\xcc\xab\x36\x44\xf3\xf7\xd5\x7b\x0e\x23\x5c\x71\xca\x62\x81\xa1\xf6\xcd\x91\x97\x6f\xb7\xcb\x47\xf7\x7b\xca\x4c\xd1\xda\xed\xfa\x11\xcb\x62\x7d\x04\x39\x4d\x79\x86\x66\x11\x37\x6a\x00\xae\x64\xcb\x37\x4b\xae\x23\x1b\x98\x88\x07\x79\xe4\x34\x4b\x03\x03\x82\xb4\xb0\xeb\x66\x71\x69\x57\x8e\xee\x3d\x83\x08\x57\x94\xab\x1c\x17\xb4\x11\x15\x1b\x0d\x52\x21\x03\xac\x3b\xe7\x79\xbd\x9a\x0b\x69\x5c\x24\xf5\x67\xd0\x37\xa9\x50\x4c\xdb\xa4\xc5\x5d\x55\xbe\x4e\xa6\x94\x80\x04\xbf\xe8\x0e\x63\xb7\xdd\x96\x6f\xcb\xb4\xc6\xbc\x91\x34\x48\x25\x57\x18\x3e\xbd\xa9\x0a\x75\x18\x66\x3b\x7f\xcb\xff\x48\xa5\x88\x4d\x70\xed\x6e\xb1\xfc\x63\xf7\xb4\x7e\xbe\x7d\x5c\xf9\x53\x4b\x53\x27\x6e\x16\xbe\xe7\x53\x71\x59\x04\xe6\x3c\xf3\x54\x05\x11\xf1\x08\x51\xe3\x81\x23\xdc\xce\x7f\x04\x95\x30\xc7\x73\x8c\xe2\x53\x96\xb9\xaa\x87\x56\x8e\x87\x8f\xa2\x0c\xaf\xfd\xa7\x76\x84\x98\xbf\xa5\xfc\x4d\x83\x14\x98\xe6\xbe\x0c\x38\xe7\xcd\x7c\xae\x24\x85\x8c\x60\x99\xc7\x6d\x29\x1c\x82\xc0\xdd\x2a\x70\x4e\x2d\xd0\xed\x3a\xef\xec\x02\x74\xd8\xcf\x5f\x02\x39\xfb\x3b\x07\xc1\x71\x55\xb7\xa1\xdc\xe5\x30\xc6\xf4\x65\x5a\x3e\xd5\x24\xc0\xec\xaa\x61\xb8\x95\x6d\x30\x2b\xa9\xf9\x77\x1f\xd6\x7f\x12\x4d\x34\x1a\x12\xab\x9b\xd5\x96\x17\x7e\x35\xd0\x32\x40\x77\xd5\xb2\xfe\xf3\x02\x1a\xbb\xfb\x8e\xee\x26\x0b\x02\x03\x9c\x92\x55\x5e\x1e\x07\xb9\x95\x2c\xc8\x64\x62\x88\xe4\xab\x06\x4c\xed\xe4\x04\x4d\x3d\xdc\x7e\x06\xfa\x10\xee\x78\x01\x4e\x64\xd4\x16\x58\x98\xeb\xcf\x30\x52\xd1\x20\x23\x91\x21\x45\x14\x55\xfb\x58\x7e\x0e\x7d\xca\xc2\xc0\x94\x0a\xde\x2f\xfe\xdc\x5d\xbf\x3c\xac\x6e\x1f\x6e\xdc\x0d\x87\x60\xc4\x01\xec\x07\x59\x3d\xdd\x81\x91\x15\x51\x2b\x9e\x8f\xc7\x5d\x16\xa5\x34\x18\x88\x51\x3d\x96\x85\x73\x13\xb2\x58\x73\x48\x3d\xc3\xd1\x5c\xb5\x07\x0d\xb2\x24\xa4\x32\x74\x40\x05\x64\xcb\x2f\x55\x75\x98\xf7\xe7\xdd\x21\x11\xc3\x27\x1c\x08\x3f\x4e\x7b\xa4\x24\x0b\xc7\xa9\xc0\xed\xf6\xce\xdd\x57\x22\x43\x6f\xf3\xfe\x72\xf0\x0a\x17\x13\x9d\x7f\xa9\x94\x64\x0e\x3f\x70\xcd\xdf\xe0\x47\xde\xe4\xa8\xc9\xd8\x37\x63\x36\x62\x03\xf2\x54\xe7\xed\xd9\xae\xf0\xae\x5e\xf6\xd9\x80\x55\x3f\x89\x79\x66\x34\x51\xa6\x0e\xa9\x73\x05\xd0\x27\xfb\x79\x8f\x2b\xb9\x3f\x3d\xcd\x70\x3d\xde\xb4\xd5\xf1\x56\x56\xf7\xbc\x3c\xf1\xa2\x7f\xcf\xd4\xd2\xaf\xef\x5e\xa1\xbd\xe1\x07\xb0\x08\xb6\x1b\xef\x46\x64\x2c\x4c\x9c\x30\xa1\x0d\x37\x3a\x8c\xcd\x5d\xf5\x9a\xcb\xbe\x1b\xb7\x5c\x75\x46\xb2\x77\x26\x6b\x94\xb1\x24\xc3\x51\xfe\x74\xfb\x70\xb3\x7b\x7c\x5e\x2c\xef\xd6\xbb\xdb\x87\xed\xfa\xf9\xc7\xc2\xbf\x60\xd6\xf5\xfa\x8f\xff\xf3\x1f\xc7\xdd\xb4\xc0\xd0\x75\x10\x12\xb3\x8d\xbc\x2d\x37\xe0\x1d\xe2\x2c\x8b\x05\x16\x43\xdb\x95\xe0\xb9\x92\x73\xcb\xd7\x45\xa0\x31\xcb\xb8\x8e\x03\xaf\x3b\xa2\xf3\xd7\xab\xaa\x2a\xbe\x4d\x73\xe7\x59\x06\x12\x89\x26\x2c\xd9\x8c\xc9\x0c\x7f\x82\xdc\xc8\x78\x12\x0b\x6b\x7e\xed\x78\x51\xec\x1a\x28\x30\x60\x68\x78\x31\xdc\x1d\x73\x91\x60\x1c\xb7\x84\x8f\x8d\xdc\x43\x51\x74\xe7\xed\xbe\xe0\x98\xa4\x61\x72\x6a\xc5\x91\x51\xb0\xa8\x5e\xd7\x65\x5b\x57\xc7\xf3\xf6\x97\xa9\xd2\x6c\x66\x21\x81\x99\x48\x18\xe2\xcb\x77\x07\x9e\xa3\xee\xf9\xa0\x4a\xbf\x6b\x4e\xa3\xcc\xee\x8c\xc8\xab\x35\x21\x57\xed\x7a\x70\xf3\xd1\xec\x24\x5d\xa8\x77\xa8\xdb\xbc\xc1\x60\x7c\xfd\xea\x6d\x9a\x4c\x28\x89\xc1\xf5\xfb\xbc\x6c\xbb\x87\xc5\x8d\xa7\xf2\xd6\xe7\x16\x9a\xf6\x3b\x14\xc7\x91\x9e\xda\xfc\x27\x11\x20\xa9\x21\xf6\xe9\xf6\xde\x68\x05\x65\x85\x2a\xb9\x55\xed\xaf\xa5\xa3\xd0\x18\x91\x28\x31\x81\xe8\xb0\x19\xea\x25\xdf\x9b\x62\x15\xea\x0d\xb4\x37\x27\x04\xf3\xf7\x71\xa4\x4c\x85\x02\x61\xbd\x55\xcd\x65\x91\xff\x1b\x76\x7e\x20\x7c\x1b\xae\xa3\x8a\xa7\x19\x73\xcc\xe8\xae\xcc\x5c\xf9\x93\xe8\x08\x4d\xb6\x22\x6f\xda\x87\x1e\x93\x90\x41\x62\x72\x00\x98\x50\x38\xd5\x25\x3f\x40\xd9\x2e\x0e\xfe\xe2\x20\x29\x5a\xfe\x6d\x75\xd5\x5d\x6b\x14\x3f\xca\x74\x6a\x02\xc7\xa6\xc0\x61\xa4\x72\x37\x5f\xc8\x90\xe9\x8c\xa7\x96\x40\xf5\xba\xae\x0e\xbe\xd8\xe2\xb2\xa3\x36\xac\x07\xb6\xb0\x16\xea\xe6\x19\x64\x7e\xcc\x07\xf3\x49\x6b\xf2\xff\x71\xf6\x27\xdd\x8d\xe3\x58\xfa\x38\xfc\x5d\x7e\xab\x5c\xd4\x82\x00\x48\x90\x7c\x77\xb2\x24\x3b\x54\xe5\xa9\x24\x39\x22\xb3\xfb\xf4\xd1\xc1\x70\x61\xb3\x2c\x91\x6a\x92\xb2\x43\xf9\xe9\xdf\xc3\x8b\x81\x83\xe4\xc8\xec\xff\xa6\x22\xcb\x84\x38\x80\xe0\xc5\x1d\x9e\xfb\x3c\xd8\x7a\xf7\x59\x94\x0e\x6d\x39\x2c\x24\x0b\x12\x19\x91\x0e\x29\x77\xbf\x21\xde\x74\x6c\xa0\x05\x21\x3c\xf5\xb5\xfb\xed\xa0\x54\xfc\xa3\x68\xdf\xd0\xe5\xfd\x1b\xc0\x6b\x41\x38\xb5\x02\xaa\x3e\x67\x3a\x89\x03\xfb\xaf\x54\x10\x63\x7b\x48\x76\xe0\x34\xb9\x2e\xd8\x71\x26\x75\x4b\x41\x69\x6e\x0b\xe7\x58\xef\x11\x7b\x9f\x8d\x0d\x87\x0d\xc4\x8e\x1c\xa8\x73\xb4\x0e\xa7\xc3\x4d\x15\xb2\x62\x82\x91\x1c\x3b\x18\xb5\x27\x83\xec\x7b\x6e\xc7\x6b\x5a\xc4\x22\x47\xc6\xf1\x99\x13\x54\xfc\x75\x71\x46\xc4\xda\xa6\x3e\x75\x0b\xe2\x80\x78\xcd\x6e\x6f\xa1\xbf\xf5\x87\x31\xcf\x3b\xd3\xba\x0b\x91\xbd\xd7\x33\x26\x62\xb2\x8f\x3a\xd6\x70\x1a\xff\xd3\x17\x7b\x44\xac\xad\x4a\x17\xee\x7a\xb0\x9a\x3f\x8d\x52\x20\x22\xc9\x2d\x66\xcd\xd2\xd8\xef\x4a\xbb\xc5\xba\x83\x3c\x32\x16\x0c\x00\x8d\xcd\x83\xce\xc5\x1e\xf1\x3c\xbd\x1e\x49\x37\x2a\xce\x7d\x95\x65\xa6\x3f\xc6\x46\x46\xa4\x11\x43\x7c\xb9\x27\xc5\xbe\x4a\xe8\xdf\x8d\xa3\x8a\xba\xdb\x9c\x1d\x8f\xc3\x25\xe4\x06\x88\x08\x10\x8c\xb6\x9a\x3f\x39\x15\x8c\x06\xed\x5d\x9f\x17\x13\x82\xcb\x1c\xfa\x18\xf3\x84\xfd\xb1\x93\x85\x2b\x93\x2c\xa1\x3e\x77\x3b\x8a\x9e\x85\x32\x19\xda\x43\xa7\xb1\xf1\x17\x2d\x04\xee\x47\x9a\xb2\x9c\x04\x3e\xe0\x03\x4c\x21\x40\x42\x27\x52\x47\x03\x46\x94\xfa\xbc\x39\x56\xed\x18\x89\x28\x74\x9e\x46\xda\x17\xaa\x04\x66\x15\xa6\x49\x88\xc9\x59\x73\x9d\x7a\xa2\xb5\x9b\xf3\xaf\xc7\x02\x01\xa4\x50\x96\xa7\x73\xf7\x1d\x74\x8b\x0a\xa5\x8f\xcf\xe1\xc9\xc1\x71\x7c\x96\x9d\x47\xf7\x2c\xce\x08\x1a\xf2\xc7\x0c\xf3\x92\x21\x76\xba\x46\x00\x57\x37\xc8\xe4\x26\xb7\x60\xb8\x2e\x94\x5c\x83\xaa\x4f\x45\x2f\x12\xcc\x23\x19\xc9\x08\x09\x89\x03\x1f\xd9\x85\x5e\xb1\x1b\x48\x20\xc2\x48\x6a\xf9\xfd\x61\x33\x5f\xaf\x9e\xb7\xbb\xf5\xf2\x6e\xb5\xd9\xae\xff\xd8\xcd\x9e\x9f\x77\x2b\x1f\x56\x49\x02\xc4\x6b\x4f\x5a\x39\xd4\x5f\x46\x05\x92\x8a\x84\x5b\x3a\x1b\xf1\x69\xfb\xb7\xc7\xef\x49\xb2\x24\xb5\x54\xeb\x28\x11\x3a\x56\xa1\xf5\x43\x32\x8b\x98\xde\xc2\x01\xe9\xca\x4f\x35\x3c\x20\xad\x20\xbe\xf7\xd9\xb0\x7d\x38\xfb\xc7\xf0\x3b\x1d\x46\x56\x32\x66\x44\xf8\xee\xb3\x3b\xa4\x50\xf7\x8f\x14\x8b\xcc\xf8\x55\x20\x9a\xf6\xa6\xd0\x2b\x6f\x90\x24\x17\xb6\x52\xe9\x08\x4a\x57\xaa\x5a\x96\x7a\x10\x9e\x4b\x6e\x0c\x96\x02\x8a\xea\xa4\x7a\x68\x85\x4c\x19\xa5\x2c\x70\x1b\x3c\x8c\x74\xd7\xc7\x33\x94\x3a\x59\x00\xeb\x0e\xde\x57\xae\xd3\xc6\x1d\xcd\x28\x50\x4f\xe3\x35\x70\xc6\xb1\x3c\xee\x87\x30\x82\x09\x40\x8b\x42\x44\xf1\xc3\xd1\xe6\x24\xf3\x44\xa3\x71\xfb\x43\xed\x17\x95\x25\x06\xfc\xcb\x40\x54\x76\x7e\x9c\x8b\x78\x57\xaa\x2a\x8b\xff\x7d\xf0\xa4\x50\x53\xfd\x76\x1e\x49\x21\x2c\x59\x41\x59\xfc\xf9\xbe\xc3\x1d\xdd\xdf\x9c\x14\x11\x73\x4c\x33\x5b\x10\x07\xcb\x84\x7a\x25\xc3\x27\x55\x92\x63\x9b\xe4\x6e\xe7\x0e\x62\x2e\xb4\xe8\x73\x0b\x93\x69\x53\x89\xc0\x64\xbc\x28\x6a\x5d\x57\xc7\xe0\x86\x5f\xfd\x16\xa5\x02\x8a\xf9\x8a\x53\xa3\x07\x12\x02\x3c\x92\x3a\x8e\x3c\xf0\x0f\xd3\xd0\x1b\xd8\xef\xef\x45\xa9\xc7\x86\x42\xea\x54\xe4\x3a\x08\xad\x04\x1f\x4d\x6a\xad\x42\xf3\x70\x17\x8f\xaa\x0b\xa4\x8c\x04\x96\xa0\x99\x2e\xe1\xd3\x15\xc3\xaf\x7b\xa2\x12\x12\x9b\x70\x75\x85\x9c\x71\xb7\xa6\x93\x42\xf4\x88\x1e\x09\xc2\x3a\x02\xae\xce\x5b\xd5\x8d\x7a\x03\x0b\x25\xfc\x62\x0a\x40\x5a\x7e\x33\x34\xb0\x7b\xd1\xc2\xb6\xd8\xc3\xb6\xfa\x51\x68\x87\x5c\x0e\x0f\x6b\x88\x46\xe7\xab\xfa\x2c\x9b\x6f\xc5\xc7\xa4\x2d\x4a\x9a\x98\x83\x4b\x30\xfc\xfb\x54\x21\x8f\x51\xd5\xc5\x59\x5f\x5c\xd7\xc4\x1a\x03\xbc\xe7\xbb\x27\x1b\x9b\x3c\xce\xee\x77\xeb\xe5\x66\xb9\x46\x98\xde\xb3\x9f\xca\xce\xd7\x72\x53\x29\x6d\xd9\xfe\xd7\x88\x06\x69\xc0\x8a\xc9\x35\x5e\xe0\x7d\xaa\x1a\xd6\x8d\x31\x31\x7e\x9d\xdd\xa2\xb2\xec\x3c\xe3\x87\x51\x24\xb6\x7a\xd0\x88\xa3\xfa\x5c\xcd\x9f\xf0\xdb\xfe\x8b\xba\xed\x5f\xfd\xeb\xcf\x9d\x5a\xae\x58\x53\x03\xe8\x1f\x15\xa2\x59\x6f\xab\xda\x8a\x2f\x6c\x06\x28\x69\x45\x52\x40\x41\x2f\xf8\xc0\x68\xb0\xf8\xd2\x9b\x99\x5c\x81\x46\xca\x93\xc6\xd9\xaa\xf1\xaf\x22\x33\x45\xb5\xc4\x82\x99\x95\x91\xd8\x7e\x16\x6d\x9f\x7f\x54\xd4\x70\x6e\xc1\xfe\x2f\xab\xc7\x2d\xa1\xd9\x78\x26\x15\x23\x04\x8d\xa4\xae\x6e\x4e\x75\x89\xf0\xc4\x5f\x70\xcd\xe1\x0f\x92\xd8\x56\xb5\xad\xb0\x87\xf7\x44\x7c\xd3\x8e\x1f\x46\xc3\x6a\x7a\xa8\xf4\x98\xa8\x85\x47\x2a\xe6\x19\x3a\x84\x9d\x15\x0d\x1a\xd3\x55\x3d\xaa\xa5\xaa\x44\x29\x2c\xe1\x08\xa5\xe0\xd8\x4e\x91\xbe\x6e\x10\x27\x29\x3a\x32\x21\x0b\x7c\x57\xed\xf5\xcd\xe9\x6c\xb5\x08\xa7\x83\xb9\xc2\x75\x73\x10\x3f\x1f\x4f\x87\x27\x63\xe5\xb4\xe7\x67\xb5\x0f\xdf\xbe\xe2\x92\xa1\x59\x45\xb9\x21\x17\xe0\x5e\x7b\x6d\xd9\x54\xe1\xbf\xfb\xad\xb2\xd1\xaf\x6d\x5f\x7d\xa8\xca\x6e\xff\x5e\xe9\x07\x71\x3c\x0e\x4d\xde\xf0\x93\x57\x1c\x6c\x37\x23\x52\x7a\x0d\x71\xf8\x2a\x25\x56\x00\xd1\x12\x40\xfb\xb8\x60\x29\x90\xbb\x27\x0c\xa2\x14\xe3\x56\x8b\x89\x5e\xe3\x85\xd1\x2b\xbc\xc2\xe9\xeb\x7f\x92\xeb\xc8\x85\xf2\x8f\xa7\x03\x8e\x53\x95\x9e\x88\x05\x74\xe3\xa4\xc4\x32\xce\x5b\xd5\xb4\xbb\xbd\x33\x72\xa3\x3d\x48\xa5\xda\x22\xb0\x94\x50\x6f\xe1\xbe\x33\xaa\xf1\x89\x84\xf6\x84\xee\xdb\xea\x02\xfd\x35\x59\xc4\x22\xe6\xca\x12\x30\x8f\xb1\xa1\xfe\x30\xcf\x90\xdf\x62\x67\x1f\xf3\x2f\xf9\x8a\xff\x71\xf5\xbd\xb9\x93\x49\xce\xd1\x87\x6c\x4e\x07\xd7\x36\xed\x7d\x12\x25\xb3\x0c\xad\x95\x53\xef\x2b\xbd\xdf\xa6\x64\xce\x11\x67\x30\xb7\x2d\x81\x85\xdc\x03\x6e\xe8\x91\x1f\xa0\x28\x64\x6e\x69\xdd\x55\x62\xbf\x86\x6e\x46\x26\x85\x31\xa5\x20\x13\x49\xa0\x08\x3a\xe1\x6b\xbd\xe8\xe1\x53\x3a\x96\x21\x1a\x2e\x0e\x70\x23\x1a\xd0\x57\xaa\x57\x0a\x22\x5b\x57\xee\x1b\x59\x91\xca\x21\x7c\x3f\x26\x25\xb6\xd1\x07\x9a\x76\x03\x6d\xcf\xcc\x17\xd6\xba\x51\xb6\x37\xba\x19\xb4\xdc\x53\xfe\xdb\xd0\x63\x50\x46\xdb\x3e\xbb\x83\x6f\xaf\xb6\x7f\xd7\x84\x1a\xe1\x3c\xf1\x25\x22\x5c\xfa\xbc\xba\x26\x2a\x42\xb9\x85\x53\x13\x0c\xc3\x28\x9d\xa2\x89\x02\xc6\xfb\x0e\xcb\x30\x9d\xdb\xca\xb2\xb3\x4c\x67\x4e\x53\x6e\x71\x45\x55\x58\xda\x06\xea\x21\x2a\x60\x32\x5c\x02\x38\xb1\xb9\x59\xdd\x16\x0d\x4a\xeb\xa0\x8b\x79\x0d\x81\xa3\x99\xb4\x89\x28\x53\x7f\xfa\xd9\xd3\x0c\x62\x4c\x78\x14\xcd\x50\xdc\x6d\x20\x80\xee\xc6\xc5\x2a\xcd\x7d\xec\xf0\x54\xc2\x4d\x5d\xdd\xed\x2b\x39\xb5\x53\x3a\x89\x08\x02\x9a\x6e\x8b\x12\x66\x75\xdb\xfc\x25\x45\x87\x4e\x32\xee\x49\xea\x30\x40\xf4\x8d\x44\xba\x7b\x3e\xf0\x24\xc0\xaa\x3a\x1c\x07\x07\xb0\xbc\xe5\x5f\x15\x2a\xb5\x7a\x1d\x53\x3f\x86\xc5\xc8\x41\x83\xc5\x53\x6c\xc4\xf8\x05\x68\x79\x32\xab\x69\x14\x6b\xe7\x3c\x0e\xbe\x0d\x9d\x29\x8a\xfa\x0b\x55\x69\x57\x73\xf7\x5a\xdc\xa1\x9c\x65\xa8\xba\x56\x34\xcf\x56\xf0\x6c\x54\x7f\xd1\x79\x9a\xa8\xee\x35\xdd\xdd\x85\xbf\xa8\xcc\x39\xd8\x48\x00\x80\xec\x70\xae\x91\xba\x3d\x8f\xed\x98\xce\x8d\x45\xce\x77\x76\xac\x6a\x45\x5d\x4c\x03\x29\x2d\xa4\xfd\x6a\x6d\x6b\xde\xec\x35\x20\xc0\xb4\x52\xda\x73\x3e\x3a\xf6\xd9\x89\xa8\xa1\x1b\xa7\x13\x93\x47\x43\xad\xfd\xd1\xc7\xa1\xb5\xce\x30\xfd\xde\x9c\x0e\xab\xf9\x13\x6e\xfe\xf4\x65\xe3\xa3\x2a\xad\xb5\x41\x64\xd7\x47\xd5\x16\xe5\xab\x6d\x35\x1e\xa4\x3e\x26\x97\x82\x18\xb3\xf4\xff\x7b\x82\x13\xdc\xd6\x55\x30\x08\x1a\xf2\x58\xfb\xdc\xeb\xfc\x9b\x63\xc6\x20\xa3\x3b\x81\x88\x71\xfc\x1c\x03\xe0\x6f\xa6\x3b\xaf\xe3\x54\x83\x9b\xf9\xff\xb3\xf7\x33\x9a\x4a\x88\x72\x4b\xbd\x68\xc3\x91\x91\x2c\xc4\x64\x24\x21\x80\xde\xcb\x7d\x51\xfb\x5a\x2d\x50\x46\x45\x0f\x2f\xc2\x44\xcd\xf8\x55\x01\x35\x1c\x46\x3d\xf7\x3f\xcf\x4e\xfc\x6e\x98\x5f\x04\x16\x59\xca\x83\xf9\x5b\x51\x8a\x3e\x70\xf1\x35\x86\xbf\x59\x8f\x03\x96\x33\x7c\x9a\xc5\xf2\xfb\xf2\xfe\xe9\x79\xb9\xf6\x29\x23\x60\xb9\xc1\x40\xf8\xb9\x6a\x85\xdb\x8c\xfc\xa1\x38\x31\x18\x15\xbc\xdc\x6c\x3a\x4b\x35\x3c\x92\xc6\x08\x61\xdb\x15\x5f\x73\xe9\x40\xac\x08\xf2\xe1\xdc\x57\xaf\x41\xd3\xec\xfa\xc8\x84\x58\x12\xbe\xee\xdb\x3e\x61\xeb\xea\x6b\x31\xde\x23\x20\xc9\x52\xe3\x55\x32\x5c\xfb\x95\x3f\x02\xc6\x03\x5f\x7a\x2a\xd2\x6c\x08\xb1\x02\x9e\x48\xd7\xdd\x22\xea\xd6\x93\x33\xf7\x41\x1b\xf0\x4c\xa0\x8d\xd0\xa2\xf1\x11\x15\x70\x65\x93\x57\x4e\x96\x74\xe4\x06\x00\x37\x92\x72\xa7\x5d\x7f\x00\x0f\x23\xf0\x26\x12\xd2\x28\x43\xae\x2f\xe9\x09\xf7\x5c\x0b\xf8\xa8\xab\xd3\x8f\xcd\x63\xcb\xce\xdb\x7d\x4b\x5d\xb8\xb0\xb9\x6c\x53\x80\x54\x30\x2c\xc7\x57\x3b\x71\xac\xa1\xd4\xc5\x9f\x93\x01\x59\x94\xa0\xf1\xbe\xaf\x5e\x1f\x8a\x57\xcb\xc3\x67\xfb\x0a\x2e\x2b\x44\x93\xe5\x9b\x25\x3c\x8d\x7d\xd1\xf8\xbe\x7a\x2d\x26\xee\x13\xe4\xb9\x4c\xd3\x71\xe1\xcb\xba\x6d\x57\x93\xcd\x90\xab\x34\xb3\x6c\x47\x8f\x00\x7a\x6e\xc9\x8a\xba\x80\x2e\x4c\x4f\x6e\x08\xd6\x44\xe7\xeb\xc5\x68\x55\x09\x42\x22\x4b\xa2\x5d\x1d\xfe\x06\xf6\x15\x84\x04\xa9\x1d\xb5\x72\x0b\xb3\xe7\xe7\x2f\x96\x97\xa4\x19\xbe\xad\x1b\xa1\x43\xac\x02\x52\xc6\x79\x10\xae\xb3\x53\x35\x60\xde\x18\x9e\x88\xf0\x68\xfc\x31\x69\x15\x23\x32\xa1\x2d\x0e\x30\x66\x45\xe6\x11\x00\xe7\xca\xeb\x77\x9c\xa4\xaa\xca\xb6\x28\xa1\x6c\x17\x45\x63\xf9\x0e\xbe\xa3\x69\xbc\x0e\xe2\x01\xc3\x2d\x3e\x08\x73\x6d\x5a\xef\x61\xf3\x56\x4d\x5a\x0c\x4c\x44\x62\x4c\x41\xda\xd2\xf1\xf2\x35\x00\xdc\x0d\x89\x13\x6c\x97\x78\xab\xf4\x3e\xfc\x2d\xcd\x91\x69\xd7\x42\xd4\x91\xb7\x29\x38\x4c\x86\x68\xe2\x1a\xba\xdb\x07\xf1\x13\x93\xd8\xd0\xce\x3e\x85\x77\x5b\x0c\x8d\x53\xcc\xfd\xa9\xaa\x34\x45\x7d\xb8\x42\x14\x3f\x5e\x4c\x86\xca\x5c\xb8\x38\x74\x51\xa9\x53\x67\xaa\x30\x04\xbe\xc6\xfc\x7f\xcd\x09\x30\x14\x88\xb2\xdd\xbd\x68\x0e\x6b\xf1\x01\xbf\x8d\x07\x18\x4b\x7e\xd4\x40\xab\xaa\xc9\x77\x62\x58\xa6\x31\x91\x08\xa5\x46\xe4\x21\x6e\x50\xde\x8f\x30\x89\x50\x99\x35\xe9\x87\xa3\x28\x5e\xcb\x01\x2f\x99\x49\x74\x84\x9f\xfb\x1a\xf6\x95\xe8\xbe\xf8\x2f\xa5\xdf\xdc\x0f\x38\x11\xb1\x45\x23\x9e\x5f\xca\xa2\xb5\xbc\x5e\x2e\x73\x31\x19\xc9\x53\x4b\x23\xd1\xc0\xbc\x3a\x1d\xab\x72\xfc\x40\x3c\xb7\x95\xda\xa3\xa8\xdb\xb2\x8b\x2f\x11\x82\xab\x37\x27\x0f\x75\x31\x1c\x6c\x13\xea\xbf\x4e\x50\x6a\x18\x7e\x32\xa6\x33\x44\x36\x67\x7d\x2a\xdf\x11\x36\x8a\xe5\xb5\x63\x70\x5b\x4d\x9a\x24\x2c\xf2\xce\xd3\x1a\x3a\x57\xa9\xe7\x72\x33\x69\x62\x90\x16\x0d\x61\x04\xb6\x8f\xc0\x6e\x75\xe3\x47\xc8\x84\xf5\x0a\x6c\x1a\xd0\xb6\x0a\xf8\x43\xd2\xd9\x56\x68\x9f\x4f\xc7\xe3\xd9\x52\x81\x5f\xdf\x2a\x4d\xa6\x05\x66\xc7\x4e\x0d\x8c\x63\x5f\x93\x75\x1b\x3a\xba\x72\x65\x2f\x5f\xe1\x8e\xe5\x5c\xa0\x16\xff\x51\xd4\x7d\xc4\x6d\x64\x2c\xd0\x01\x40\x02\x09\xa8\xe3\x11\x7a\xd1\xe8\x88\x63\xbb\xf2\x8f\xd9\xf7\x41\x3e\xd3\xe8\x08\x6c\xa6\xb9\x28\xdb\xfd\x88\x96\x2c\x20\xe0\xff\xc7\x0f\x25\x80\x3d\x16\xbb\xce\x31\x73\x3d\x2a\xdb\x6a\xe3\x94\xf2\x46\x91\xb1\xff\x45\xee\xa0\x6f\x65\xd5\x14\x23\x9c\x95\xd1\x9a\x04\xab\xd0\x39\xa2\xeb\xa1\xfd\x1c\xcf\xb5\x36\x19\xe2\x2e\xef\xc4\xc1\xa9\x15\xfc\x7a\x21\x02\x61\xd8\xbd\x7d\x53\xbd\x6a\x51\x56\xc6\x0c\x5a\xe3\x0c\xc4\xa9\x24\x63\x14\xbf\x3f\xa2\xc0\xf6\x92\xda\x5e\xf7\xdb\xaa\xde\x82\x08\x4b\xce\xa4\x96\x0d\x7a\x8f\xb4\x08\x6b\x50\x55\xad\x3d\x01\xeb\xb0\x6b\xfa\x8b\x52\xfa\xb5\x27\x23\x51\x44\x94\xf6\xf1\xd9\xaa\x19\xe1\xca\x48\x14\xc5\x8c\xc7\x7d\x7b\xbb\xad\x0d\x57\x7f\x0b\x99\x47\x22\xcc\xe7\x7b\x2e\x0d\x34\xb5\x41\xae\x88\x93\x88\x44\x4c\xf7\xce\xd8\xf6\xe7\x44\xaa\xbd\x1b\x41\x81\x20\xd9\x5a\xb7\x8d\x0f\x2b\x5c\x24\x22\x82\xa0\x7a\xef\xa9\x2c\xda\x4d\x0b\x62\x8f\x1d\x7b\x47\xa1\x8a\x09\x11\x11\x89\x88\x26\x1e\x5d\x65\xd3\xdb\x4f\xc6\x69\x36\xf6\xf5\x98\x6b\x66\xb3\xfb\xa5\x55\x88\x3d\x8a\xf3\xf6\x0d\x1e\x44\x39\x3d\xb3\xb1\xcc\x1b\x48\x21\xee\x11\x20\x76\xc1\xcf\xab\xb2\x04\x35\x28\xcf\x4f\x68\x6c\x48\x44\x93\x84\x59\x88\x42\x7d\x28\xda\x9b\x53\x5d\x8e\xdc\x1f\x12\xd1\xd4\x58\xf2\x58\x71\x0e\xa6\x81\x44\x34\x4b\x30\xca\x19\xd0\xdc\xad\x01\x37\xad\x7b\xd1\x22\x68\xec\x03\x59\xe9\x16\x15\x34\x65\xfb\x4d\x7c\xc0\x4c\x6b\x44\x09\x8b\xbd\x3f\x16\x5e\x01\x55\x91\x6f\x42\xbd\x11\xad\x7a\x73\x58\x9c\xf1\x2c\x50\x1d\x93\xbe\x53\xf5\xb6\xaa\x1f\x90\xc1\x6e\x8a\x04\x27\x11\x85\x18\xab\xaf\x8e\xe2\x6f\x58\xbf\xf9\x6f\xfa\x3f\xff\xb8\xfa\x9f\x5f\x1e\xf8\xfb\xff\x49\xc8\xff\xb8\x1b\x60\x49\x86\x6a\x35\x36\x6a\x7b\xae\x8b\x0f\xd8\xc3\x2b\xe8\x31\x86\x6b\xf2\x92\x59\x2e\x9d\x1a\x0a\x2a\xe5\x38\x4e\xb6\xc9\x18\x01\xd8\xe1\x3a\xbb\x5b\x3e\xce\xff\xd8\xcd\x16\x8b\xb5\x9f\x42\xa6\xd3\x91\x42\x93\xcb\x33\x34\xfd\xf1\x1c\xd7\xb0\xa7\x17\x1e\x4f\x19\xd3\x5a\xd8\xb6\xab\x2f\x5d\x37\x12\xc5\xb1\x15\xd3\x3f\xd6\xf0\x51\x54\xa7\xe6\xf9\x24\xf7\x45\xf3\x06\xfa\xfb\x40\x81\xb6\x1b\xc7\x75\xe6\x3a\xe9\xd6\xf7\xf3\x67\xa8\x97\xdb\x6f\x93\xeb\xc5\xa9\xc1\x4a\x85\x29\x64\x55\x0a\xa5\x8a\xe9\x71\x9d\x62\xae\x4d\x83\xb0\x25\xff\x9d\x71\x42\xd6\x9c\x44\x49\x64\x45\xd7\x76\x06\x5a\xf5\xf6\x2c\x0a\x6d\xc9\x38\x6f\xab\x1a\xc1\xae\x93\x49\x4b\x98\xb3\x2b\xb6\xc0\x78\x7e\x69\xf4\xf6\xe7\x70\x93\x25\x51\x22\x63\x2c\x63\xa3\x1a\xcc\xf1\x5c\x23\x26\xc1\x1f\x53\x99\xf5\x59\xda\x93\xbc\x3d\x95\x57\xb3\x6c\x6e\x28\x8f\x25\x7e\x87\x77\xbe\x79\xae\xff\xb0\xfb\x11\xf8\x5c\xc7\xba\x52\xd0\x34\xdd\x96\x8a\x3d\x88\x5f\x9c\x8f\x6b\x75\x21\x79\xd7\x93\x57\x90\x28\x4d\x52\x5c\xe9\xbb\xcf\xc1\xee\x46\xa2\x4c\x26\xb8\x47\x74\x16\xad\x84\xfd\xce\x19\xcd\x9d\x3c\xbd\x3a\x59\xee\x7d\xcf\x34\xd9\x0d\xd7\x48\x49\xd1\x54\x9f\xf3\xaa\x1e\x3f\x5c\xe6\xc6\xe4\x3c\xa3\x56\xea\x67\xfb\xcd\xff\x2e\x07\x8a\x08\x35\x8c\xb1\x37\x57\x98\x79\xfc\x38\x63\x30\xf1\x76\x53\xbc\x9d\xc4\x60\xdf\x23\x91\x24\x1c\x65\xd3\xab\xd0\x82\xbc\x69\xc5\x17\x5a\x68\xbf\xfa\x77\xbc\x4e\x25\x11\xe8\xf8\xef\x7f\x51\x88\x22\x91\x14\x46\x88\x21\xd3\xc6\xf3\x93\xb9\x86\xc4\x23\x91\x74\x81\xc4\x06\xca\xc6\x83\x89\x48\x24\x81\xa3\x1a\x07\xfa\x46\x23\xbd\x4b\x4e\x22\x45\x34\x77\xe1\xe1\x63\x6b\x2e\x50\xa9\xe3\xf3\x2b\x16\xa1\x63\x2e\xbb\x00\x04\x19\x0a\xfc\x01\x69\x19\xb7\xf7\xd5\x2b\xca\x48\x8f\x1f\x40\x47\x11\x77\x50\xfa\x0d\x36\x3a\xcc\xab\xb2\x69\x6b\xf1\x17\x5c\xae\x83\x13\x24\x1a\x73\x0c\x4e\x3d\xa3\x73\x27\xaa\xcf\xc3\x2f\x94\x87\xbe\x3a\x8f\xc8\x72\xdb\xd5\x2c\x4f\xaf\xe1\x2b\x85\x1c\x30\x4b\x73\xac\x9a\x6e\xcf\xed\x22\xf7\x65\xbf\x6f\x82\xb1\xce\xb6\x07\x88\x3f\x14\x25\x5c\x43\xa2\x11\x12\x11\x09\xbe\xbb\x7a\x22\xea\x34\x19\xc8\x53\xa4\x6e\xeb\x9c\xa7\xd4\x5d\x87\x10\x6e\xab\x53\x87\xa0\xf3\xb8\x80\x7a\x04\x4a\x27\x84\x48\x1b\x16\xa8\xb3\x84\x1a\xd5\x1b\xe9\x94\x44\xd6\x8f\x54\x82\xda\x00\x02\x7b\x44\xae\x2e\x77\x42\xb4\xc6\x9c\x8c\x12\x7b\x35\xaf\x9a\xb6\xd9\x58\x90\xde\xd8\x29\xbc\x02\x2b\x22\x84\xe6\xc2\x37\x60\x60\x80\xb2\x2a\x55\x75\x80\x01\xe8\xd4\x8f\x53\x54\xd8\x16\xfc\x03\x2a\xe6\x3a\xd4\x8b\x37\x33\x84\xaa\x14\xfd\xc9\x35\xe8\xa2\x06\xd5\x4e\x1b\xe0\x27\x67\x83\x0c\x33\x31\x87\x2b\x44\x5c\x43\x23\x40\x18\x27\xb6\x8c\xd8\xf9\xa8\xdf\xab\x16\xf4\xae\x7f\xa5\x24\x8e\xac\x67\xba\x77\xfb\x3f\x6e\x63\x2f\xf5\x3e\x1c\xd7\x2a\xb2\xc7\x9b\xf6\x76\x8f\x26\x76\xf4\x1d\x90\x24\x12\xb8\x6d\x42\xfb\x76\x6a\xbc\xe7\x47\x38\xb1\x7f\x95\x27\xcf\xcb\x45\x08\xa7\x24\xa3\x9e\xb3\x61\x51\xa9\x91\x35\x27\x1c\xac\x46\xa6\x8d\xa5\x6f\x11\x0a\x3c\x94\xc0\x0f\xae\x0d\x49\x13\x9a\xc8\x9e\xf7\x63\xbe\x17\xd0\x60\x89\xb1\x77\x74\x48\x2a\xb3\xc8\x7d\x66\xb7\xc5\x4f\xd0\xb3\x52\xa3\xdb\x86\xfc\x85\x7e\x8c\xca\x2d\xce\x09\x5a\x11\x7a\xea\x1a\x9b\xd7\x73\x43\x32\x0e\x94\x0d\x90\x3a\xba\xfa\xec\xc5\xaa\x39\x21\x82\x46\xf8\x98\xab\xaa\x55\x7f\x2f\x6d\x47\x88\x8c\xa3\x3c\x99\x8a\x06\xfb\x13\xaa\x98\x73\x3a\x48\x7c\xdd\x9c\x17\x62\x40\x1b\x40\xfc\xdb\x57\xa9\x49\xd0\xb2\x7b\x59\xd6\xee\x6f\x92\x26\xdd\xab\x32\xa2\xd8\x0f\x4a\xb8\xdd\x01\x8e\x46\x73\x94\xb2\xfc\xb5\x79\x20\x5a\x08\xcc\xe7\x04\x1e\x26\xd7\x43\xd5\x85\xb2\x13\xd7\x8d\x80\x8c\x11\x1d\x70\xb0\xf9\x86\xd5\xfc\x29\x20\xb0\x08\x01\x63\x53\x1b\x36\xe7\xba\x80\x7d\xf1\x01\xf5\x79\xfc\xee\xc1\x28\xb4\xa5\x23\xba\xd9\xf1\x35\x0c\x31\x98\x05\x2f\xda\xe6\xbe\x78\x87\xf9\x5b\xa1\xc4\x6b\xe5\x2f\x62\x78\x6c\xf2\x01\x37\x46\x9f\x34\x24\x34\x0b\x63\x72\x8b\x7e\xde\x21\xb3\xca\xee\x50\x5d\x2d\xbd\x5d\x96\x56\x08\x31\xda\xf6\xb7\x23\x23\xaa\xad\xed\x5c\xf6\x9f\x12\x1a\x31\xca\x2d\xbc\xf4\x55\x94\xc5\x9f\xc1\x56\xd1\x48\x68\x0f\xa0\x9c\x9d\xda\x31\xe1\x0b\xa1\x11\x10\xcc\x54\x6e\x5f\x1e\x56\x7f\xbc\x3c\x62\x27\xd2\x5f\xaf\x23\x1a\x19\x83\x0a\x1f\xc2\xc9\x0c\x3d\x8b\x73\xe7\x70\x7c\x83\xbd\x5f\x4d\x94\x90\x08\x99\xf3\x11\x30\xee\xd0\xde\xcd\xb7\xe2\xf5\x0d\x10\x4a\xa4\xfb\x3b\x24\x90\x50\x1b\x18\xec\xa1\x0b\xf6\x07\x9c\x4f\x84\xd2\x38\xb7\xba\x59\xbe\x71\x72\xd8\x3d\x31\xac\x89\x11\xca\x28\xc9\xe4\x80\xba\x27\x74\x63\x4d\x29\xb9\xc6\x53\xc0\x12\x8e\x48\xab\x99\xaa\xe1\x2a\x79\xb0\x1f\xa7\xb8\x53\xbb\xe8\x7c\xf4\xe5\x41\x8a\xa6\x39\x4f\xde\x02\xd3\x06\xfd\xaf\xc7\xca\x81\xba\x46\xb3\xc6\x4c\x8a\xf8\xe0\xaa\xdc\x9f\x1d\x6c\xb1\xd0\xa1\xb0\x36\x2b\xf5\x83\xe5\xe2\x1d\xbc\x7e\x1a\x13\x45\xb3\xc1\xea\x5a\x4f\x31\x84\x84\xc6\x29\xc5\xd6\x8b\xb6\xfa\xaf\xed\xf4\x90\x48\x30\xd5\xfa\xe9\xbf\xf6\x89\x66\x6e\x37\x04\x62\x64\x68\xf7\xd0\xd2\x89\x63\x42\x93\x38\x96\x2c\xb0\x7f\x63\x2a\xe9\x4a\xde\x99\xd0\xc4\x68\x3a\xd0\xe6\x70\xd9\x98\xde\x74\x52\xae\x24\xba\xcc\xfe\xf5\x8c\x74\xec\xc7\x40\xe3\x6c\x9a\x07\x18\xb3\xe5\x0c\x63\x28\xc7\xd3\x17\xbb\x34\x0b\xa1\x69\x4c\x7b\x25\xe2\x10\xd3\x8c\xef\x35\x15\x04\xeb\x7c\xbb\x2e\xe0\x10\x75\xd1\x9e\x5d\x81\x70\x3c\x7b\xa9\x32\x18\xe7\xdb\xb0\xb0\x87\x05\xfb\xc3\x86\x06\x3a\x29\xac\xca\x6d\x45\xf3\xee\x2d\x3c\xcd\x28\x67\x21\x51\xfa\x50\x94\xc8\x8b\x31\x5c\xae\x59\x9c\x20\xaf\x3d\xe2\x24\xfe\x7d\x02\x67\xc0\x33\x7f\x98\xa7\xca\x3b\x05\x7e\x32\x87\xae\x05\xcd\x44\x6c\x15\x99\x5d\xe0\xd0\xdc\x57\x4d\xa8\x19\x10\x9a\xf3\x24\xb6\x29\x36\xd4\x12\xd6\xbb\x1a\x4c\x0d\xbe\x1e\x41\x68\x6e\xac\xc5\x46\x98\x90\x81\xba\x16\x9e\xa6\x70\x32\x0b\x22\xb5\x7b\xb8\x05\x84\x20\x73\xc1\x78\xbb\x19\xcf\xad\x48\x13\xee\x75\x16\x30\x74\xf0\xe9\x85\xc9\x3b\x10\x92\x62\x57\x42\xa8\x69\x3c\x95\xb7\x55\x7d\x05\x8c\x44\xa8\x50\x80\xc9\x23\x53\x57\x7f\x22\x59\x32\x7c\xf4\xeb\x57\x1a\x4b\x2f\xa3\xa1\x51\x75\x71\xec\xcc\x42\xec\x8f\xa9\x2e\x0a\x19\xcb\xa8\xaf\xfb\x1d\x94\xaa\x84\x1b\x11\xa0\x1f\x9d\x7b\x72\xc9\x1e\x41\xa8\xca\xb5\xd3\x5d\xab\xed\xfa\xbf\xad\xa6\x37\xa8\x79\xc4\x89\x2f\xe5\x5b\xd9\xfe\x87\xa2\x5c\xa3\xac\xef\x2f\x01\xbb\xdd\x4f\xb9\x07\xda\x3d\x14\xe5\xa6\x15\xef\x81\xba\x66\xf2\x1e\x20\x4e\x90\x23\xa9\x84\xcf\xbf\xc5\xa8\xfd\x8f\x2b\xcf\x02\x29\xc3\x8f\x63\xfb\x06\x77\x35\x08\x4b\xe0\xb5\x16\x0a\xc6\x86\x0a\x64\x82\x36\xe1\x42\x91\xd0\x6e\x05\xe3\x87\x07\x65\xd9\x2e\x1f\x56\x8f\xab\x87\x97\x87\xf9\xd3\xe3\x76\x75\xe3\xa7\x18\xb4\xed\x0a\x71\xe8\x7e\xab\x35\x13\x70\x9c\x84\x02\xa4\x94\x3b\x91\xca\x6b\xa4\xd6\x7e\x98\x89\x53\xa7\x21\xb3\x76\x6c\x3c\x17\x23\xb8\x53\x67\x1b\xf0\x2a\x5f\x8c\x32\xd4\xb0\xb4\x67\xbb\x6f\xa1\xc4\xde\xec\xc1\x0c\x19\x43\xf0\x7d\xd8\x62\x35\xd6\xf7\x47\x8f\xcb\x22\x12\xa3\xbf\x70\x28\x4a\xa8\xc1\x27\xd5\x09\x8b\x14\x60\x7a\xeb\xa5\x2c\x86\xbc\xfc\x57\x8a\x12\x84\x45\x3a\xc1\xdb\x70\xb5\x5a\xeb\x8f\x3b\xed\xbf\xbf\x53\x4d\x26\x8c\xc4\x80\x05\x53\x9b\xde\xf6\x49\x83\x07\x71\x9c\xdc\x2d\x55\x82\xf4\xda\x0d\x3e\xf3\xc5\xe8\x3f\x7a\x4b\xc3\x98\xb0\x9d\xb4\xcf\xeb\x25\x36\x20\xef\x58\x14\xed\xfa\xa8\x9d\x25\x10\x21\xa6\xe7\x70\xf6\x34\x1c\x43\xa0\x3a\x61\x89\xb1\x94\x6c\xca\x8b\x18\x8a\xba\xdd\x7e\x4e\x3c\x0d\xc6\xa9\xe4\x56\x14\xc1\xb5\x19\x17\x7f\x5e\xd7\x6b\x20\x8c\xe7\x1c\x3c\x22\x64\x2e\xf4\x47\x73\x0f\xa6\x5d\x95\xf6\xc5\xf6\x8e\x36\x4b\x63\x82\xf9\xf1\x43\x55\x42\xfb\x26\xee\x44\x0b\xa1\xd6\x44\x58\xaa\x79\x1a\x85\xaf\x3b\xf8\xbb\x88\xf0\xea\x3f\x1d\xbf\x6f\xb0\x2c\xcb\x10\x86\xd2\xd3\x68\x5d\x0e\xc9\x21\x93\x03\xa2\xe8\xc6\xa2\x6b\x27\x53\x9e\x0b\xab\xfe\x10\x7a\xf2\x07\x22\x1d\x84\xe5\x46\x78\x49\xff\xd9\x7e\x6f\xe9\x7b\xdd\x21\xc1\x29\xa6\x7b\x37\x65\x71\xec\x73\xee\x84\x49\x65\x7b\xa7\x97\x3f\xad\x9a\x80\x03\x5a\x7c\x91\xae\x75\x3f\x52\x8c\x0b\xcf\x63\xbe\xad\x36\x6d\xa5\xc2\xd6\xc4\x74\x66\xd0\x9e\x62\x2b\xd2\x90\xed\x86\x30\x0d\xa9\xd5\xe9\x39\xc9\x1f\xc5\x9f\xa1\x2a\x8e\x5a\xf7\x32\x73\x19\xf1\xfa\x03\xeb\xc1\xc3\x02\x09\x61\x40\x35\xd0\x01\x6b\xb5\x50\x2d\x12\x0c\x8e\x36\x2d\x66\xe2\x04\xdb\xc0\x2c\x77\x32\x8c\xf4\x8b\x08\x33\x89\x55\xa5\x72\xd4\xdf\xf6\x2c\xd3\x6e\x82\xf1\x73\x9a\xc4\x60\x4a\xe2\x61\xf6\xfb\xee\x65\x13\x04\xac\x77\x37\xb3\xfb\xd9\xe3\x7c\x19\xce\x9c\x72\xee\x85\x60\xf7\x55\x03\x48\x1d\x3e\x7e\x00\x93\x69\x61\xe9\x85\xf7\xfb\xcd\x5b\xd1\x8d\x2b\xfb\x97\x63\x74\x86\x0d\xb6\xdd\x76\x7c\x53\xbc\x0e\xb8\xb5\xc7\xcb\xdc\xe8\x1c\xcb\xc0\x07\xa7\x9b\x6e\xe5\x38\xc3\x59\x4c\xcc\x4d\xd8\x94\x9f\xa1\xee\x9b\xb8\x48\x1c\x11\x9a\x79\x4d\xae\xd3\xd1\x8b\x22\x36\xe1\x30\x4d\xf2\x20\xdd\x84\x5f\x90\xf3\x27\x46\x37\x10\x47\xc2\xd8\x3a\x0c\x76\xd7\x38\x7c\x58\x08\xf2\xe2\x48\x25\x58\x66\x1c\xc0\x44\xc6\x2b\x27\x8e\x94\x48\x9d\xc7\xb9\x6a\x6c\xd3\xf7\x98\x6a\x99\xc4\x44\x26\xa8\xf0\x88\xe5\x03\x5f\xe5\xfe\xc2\x21\x88\x89\x4e\xb4\x0d\x17\x8d\x81\x6b\xb1\x4b\x4c\x49\x84\x46\xaa\x8b\xf3\x77\xb2\xe7\x66\x26\x31\x4d\x2c\xe5\x7b\x79\x3a\xb8\xd6\x72\x2f\x74\xd7\x1d\xe4\x1a\x53\xc2\x9b\xed\xdc\x31\x1f\x86\x23\x90\xe2\x4c\x3a\x1d\x63\xc7\x34\xe4\x12\x86\x9d\xff\xda\xd9\x75\xcc\xe1\x85\x5f\x18\x0b\x32\x77\x82\x2f\x6f\xc5\x71\xc4\xa0\x3f\x76\x43\xdd\x63\xfe\x2a\x86\x8d\x19\x05\xfc\x68\x51\x02\xf6\x00\x77\x62\xb2\x50\x62\x26\x32\xec\x85\x2f\x9a\xbe\x30\x37\xfa\x56\x62\x26\x24\x86\x0b\xf8\xad\xcc\x1d\xab\xb5\x41\xcd\xc9\xf1\xa9\x62\x91\x61\x1e\xeb\xbf\xfe\x79\xfb\x6c\x3d\x1d\xff\x58\x9c\xe4\xc9\x80\x42\x2b\xfc\x99\x65\xcc\xd7\xe9\xcf\xcf\x7b\xac\x9d\x34\xfd\x41\x89\x85\xb3\xdd\x9b\x68\xde\xb6\xd5\xac\x51\x45\x31\xb9\x33\x9e\x08\xac\x00\x0d\x6c\xe5\xdf\x4a\xfc\x75\x91\x8a\xee\xce\x3d\xdf\xdc\x3d\xdd\x04\x04\x07\x89\x53\xae\x31\x31\x7c\xe7\x52\xab\xf6\x8d\xdd\x56\xb5\xab\x3e\x17\xaa\xef\xca\x24\x71\x9a\x11\x63\x3b\x73\xdf\x6f\xaa\x66\x3a\xb1\xa9\x48\x10\xa3\xbc\xf9\x14\xc7\x67\x71\x6a\xa6\x4e\x40\x9c\x4a\x25\x7d\x0b\xda\xf7\xe7\x01\x62\x98\xc4\x99\xb1\x7a\xd1\xc7\x6a\xbf\x7f\x98\x48\xa2\x91\x38\x67\x39\xa2\x93\x85\xa3\x9a\x09\x94\x2b\x7d\xa5\xb3\x1b\x24\x7d\x03\xe7\xee\x60\x3b\xf9\x76\x47\x87\xed\x9e\x9c\x2e\x4e\xc9\x80\x1e\xf6\x11\x3e\x43\x23\xa5\x03\x37\x93\x38\xe7\x32\xb3\x09\x7d\xbd\x39\xee\x8b\x76\xf6\x5a\x03\xf4\x38\x71\x12\xe7\x59\xac\x89\xd7\x85\x40\x76\xaa\x3b\x28\x91\x1c\xf4\xfa\x1b\x10\x8c\x78\x1a\xb6\xd5\x6a\xb7\xa6\x93\x7b\x12\x26\xb7\xf7\x74\xf2\xa4\xff\xaf\x45\xd8\xe9\x63\xc9\x00\x09\x2c\x6e\xe6\x9b\x61\x56\x3e\x96\xc2\x36\xfb\xf8\x08\x69\x66\x4c\xb1\x2f\x90\xdf\xc6\xb6\x2f\xfb\x71\x52\x31\xd6\xfb\xe3\x57\x89\x10\xc6\xf7\x23\x21\x52\x41\x85\x0e\x61\x99\x6f\xa2\x76\x62\x30\x2b\xa7\xae\x33\xb1\x26\x4a\xe6\x88\x32\x2b\x9a\x5b\x2f\xe0\xf2\x3a\x98\x30\x1d\x65\x88\x0a\xed\xfc\xd4\xf5\x6c\xbe\xdd\x3d\xce\x1e\x96\xe1\x60\x62\xa2\xd4\xc9\x39\xdd\x56\xf5\x30\x13\x11\xeb\x2c\xc1\x9a\x30\xa2\x74\x4e\xe1\x7c\x86\x4a\x84\x8b\xed\x74\x61\xcc\x17\x93\x6e\x58\x8e\xbb\xde\xe6\x08\xa0\xcf\x23\x21\x2b\x92\x90\x24\xd1\x2e\x5d\xfd\x1d\x9a\x21\x18\xc0\x0d\xa0\xcc\xd0\xbe\x8f\xb0\xa7\x0b\x1f\x8f\x62\x69\x84\x22\x4c\xc3\xc4\xde\xb5\xfc\x92\xff\x88\x13\x26\x33\xa4\x6a\xb9\x11\xa5\xaa\xea\x6f\xa2\xd4\xfb\x69\xe4\x95\xc4\x34\x8d\x75\x90\xe6\x0b\x61\xc7\xd0\x99\x4d\x62\x66\xe5\x33\x94\x6b\xda\xc7\x66\xea\xa1\x93\x9f\xc4\x8a\xe0\xae\xf7\x50\x94\x70\x21\x15\xdd\x1d\xd7\x12\x11\x07\x2f\xf5\x10\x2f\x48\x92\x24\x63\x98\x96\xbd\x29\x5a\x2b\xd9\x3a\x38\xc6\x79\x8c\xc6\x71\xc8\x55\x49\x12\x0e\x59\x1e\x64\x5e\x9f\xca\x7d\x50\x83\x19\xb0\x54\x91\x24\x25\x1a\x67\x5c\x0f\x70\xc9\x36\xe9\xdb\xef\x21\x49\xaa\x12\x70\x59\xdc\xbb\x6a\xaf\x3b\x5f\x66\xf3\x7e\x9a\xcc\x4f\x46\x12\x93\xf4\x25\x58\xdb\xc2\x32\x24\x30\x25\x49\x16\xe7\x4e\x71\xb1\x8b\x5a\x6e\x0a\xdd\x8c\x8d\x69\x92\xa5\x19\x32\xa5\x6f\xde\xeb\xd3\x41\xee\x61\x2e\x4a\x7d\x1e\x3d\x6b\x4e\x2c\xff\xdb\x11\x69\x2b\x2d\xd1\xd8\xe2\xe9\x26\x2c\xb6\xd1\x64\xe6\x54\x66\xc9\x40\xe8\xc6\x7b\x11\xa3\x77\x2f\x62\xc0\xcc\xba\x4d\xf3\x77\xa1\x90\x47\xef\x8e\x9f\x4f\xf0\xc8\x33\x8e\xd9\x89\xbe\x58\x21\x42\x49\xf4\x33\x6f\x6b\x00\x4f\xca\x49\x12\x61\x12\xcc\xda\x09\x4f\x55\xbd\x01\xdc\xe0\xdc\x61\x45\x73\x6c\xe1\xef\xec\x5d\x0b\x4d\x78\x7d\x5a\x82\x94\x81\x23\x61\xdc\x45\xf3\x2b\xd0\x21\x49\xb4\xc9\xf0\x2b\xac\xd1\x48\x68\xf0\x89\x84\x70\x58\x24\x96\x78\xd0\x88\xd3\xbe\x75\x04\x72\xee\x20\x88\x2c\xef\xe1\x1c\xdf\x60\xbf\xaf\xc6\x2b\x1c\x8c\xcd\x10\xda\x7a\xb0\x63\xc0\x9f\xd9\x06\x3b\x7f\x12\x93\x1b\x62\xae\x48\xea\x3f\x56\xed\x12\x8b\xb1\xe1\xe1\x8d\x88\x49\xe0\x3d\x9f\xb5\x9e\xc8\x9e\x70\xc2\x2d\x01\xfd\x66\x3b\x1f\x79\x96\x63\x63\xc2\x09\x48\xec\x8e\xdd\xc9\x53\xfd\x85\xd9\xe4\x34\x51\x5e\xd5\xed\xbe\x52\xef\x37\x67\xe4\x7a\xbe\xac\x67\x70\x46\x35\x7e\xe0\x45\xd9\xb4\x45\x7b\x72\x0a\x0b\xaf\xe0\x61\x49\x7e\x18\x27\xc2\xf7\x54\xd7\xf5\x4b\x51\xb6\xb7\x05\xec\xb5\x2f\xdd\xf1\x98\x48\x84\xa9\x0b\x7d\x5d\xc5\x80\x60\x53\x36\xed\x15\xbb\xec\x72\x19\x92\x1e\x11\x9e\x50\x16\x3b\x7d\x8f\x61\xab\xc5\x95\xbb\xe6\x09\x60\x6e\x6b\x77\xb4\xc9\xd8\x1b\x27\x4f\x3c\xbe\x24\xcf\xb5\x71\x93\xe0\xdc\xf0\x2f\x15\xcd\x39\xe1\x69\xce\xa9\x95\x97\x29\x3e\xa0\x6e\xc4\xde\x5a\xd9\xe7\xba\x6a\x2b\x55\xed\x87\x1f\x24\xcf\x12\x8a\xc9\x06\x6c\x95\xaa\x4e\x03\x3e\x82\x0b\x95\x8e\x09\x85\xc0\xf5\xbf\xf6\x4f\x96\x65\x02\xbf\xde\xfb\xcf\x1e\x65\x46\x78\x26\x05\x73\xb6\xe8\x07\x14\xb3\xd7\xd7\x1a\xe5\xe4\x1f\xc4\xd9\x09\xf7\xfa\x71\x2a\x57\x16\xb8\xd0\x05\x31\x17\xe6\xff\xaf\xfe\xff\x78\x42\x72\x91\x62\x19\x75\x2e\x9a\xb7\xdb\x6e\x83\xa8\xf5\xa7\xa8\xc1\x65\xb5\xdc\x20\x11\xe5\xe8\xed\xfc\x35\xfd\xd9\x45\x4f\xc4\x17\x97\x15\x2c\xb6\x79\x64\x4c\xba\x6e\x3c\x3d\x86\x4f\x0d\x0f\x6b\x23\x5c\x70\x86\x76\x64\x53\xa0\x3a\xad\x35\x61\x23\x4a\x2b\x37\x50\xc6\x11\x04\xc9\x9e\xf1\x9c\xc9\x24\x37\x3c\x6c\x71\x03\x7a\x0c\x6f\x2c\xb9\xcc\x28\x36\xb9\x76\x0e\xe5\x71\x9a\xfd\xfe\xe2\x29\x54\x1e\x23\x3f\xa2\x77\x41\x7e\xcd\xc3\x40\xb8\x82\x50\xa5\xf9\xe7\xd3\x1f\x57\x55\xa0\xc7\x4f\xa4\x89\x11\x72\xc2\xfa\x3d\xdb\xa3\x43\xd4\xc2\x5f\xfc\x34\xb1\x94\xae\xa7\x06\x6a\x37\x67\x13\x1f\xba\x1b\x82\x0b\xe9\x6e\x3e\x5a\xf7\x5a\x99\x68\xd4\x2b\x68\xd9\xcb\xaf\x84\xa1\x1c\xa8\xc1\xa8\xef\xb6\xaa\xdb\x11\x84\x83\x83\x14\xb1\xf0\xe4\x02\xea\xbd\xa9\xab\xaa\x5d\xa1\x00\xa8\x29\xae\xa9\xfc\x8f\xde\x85\x49\xa5\xca\x47\xad\x71\xd0\x6c\x26\x2c\x57\x84\x1b\x69\x55\x67\xad\x45\xf7\x7c\x1a\xd3\xda\x21\x37\x4a\x58\x9e\x7f\x5d\x1d\x2f\x4e\x01\x39\xed\xee\x12\x0e\x45\x7b\x0b\xd8\xe8\x33\xa1\xf7\xf5\x03\x0d\x64\xb6\xe1\x46\xe8\xd1\xb6\x91\x46\x59\x1e\xd9\xec\x33\x1c\x45\x0d\x0e\xd2\x80\x45\x9f\xdf\xfc\x10\x61\x35\xb0\x3d\xbb\xc3\x16\x26\xcc\xa1\x24\x8d\x24\xc1\x7c\xfa\x7f\x3a\x7b\x30\x58\xfc\x69\x64\xc0\x3b\x28\x3f\x8a\xf2\x6b\xd9\x6c\x92\x12\x42\x10\xc9\xe5\x69\xd9\x7a\x1d\x9d\x69\x99\xbf\xb7\x44\x29\xc9\x88\x03\x7a\x87\x57\xbc\x6a\x86\xba\x9f\x24\x25\xb9\x4d\xee\xaa\xce\xdf\x39\x88\xf7\xb0\xdf\xa6\x44\xa7\xc6\xee\x07\xff\x39\x35\x36\xa4\xb3\x0d\xf6\x03\x27\x24\xa5\x49\x9a\x3b\x8a\xab\xd9\xff\x9e\xc4\x41\x4c\xf2\x02\x29\x55\x11\x8a\x79\xd9\x58\xe4\x0b\xea\xe1\xc9\xb3\x52\x13\xa5\xc4\x67\x2f\x66\xfb\xb0\x0f\xfb\x5b\x1f\x3c\x21\x13\x29\xae\xe6\x02\xe1\xd6\x28\x29\x33\xbe\x3e\x83\x38\x71\x19\x97\xd9\xc3\xfd\xc0\xb1\xbe\x39\xed\xdf\x07\xf0\xc8\xee\x9c\x3e\x49\x98\xc6\xd4\x22\x73\x95\xd8\x6f\xeb\xe2\xb8\x87\x75\x55\x1d\xbe\x0c\x8f\x47\xab\x3b\x4d\x88\x2d\xd7\x09\xad\xe7\xcb\x2d\x1f\x72\xad\xf0\xf8\xca\x3f\x63\x96\x95\x21\x42\x24\xf3\x67\x14\x1a\xe5\x0c\x0b\x55\x79\xca\xbd\x61\x50\x93\x26\x52\x21\x07\xee\xb1\x06\xc4\xcf\x0e\x28\x26\x49\x9a\x98\xdc\x96\x56\x50\xb2\xc1\x47\x08\xe3\xf9\x46\x71\x88\xff\xf7\xff\xfb\x7f\xff\x55\xec\xf7\x3d\xa2\x2f\xe5\xb1\x49\x9c\xeb\xbe\x98\x6d\x67\x43\x03\x90\x72\x25\x70\x63\xf9\x06\x75\xb5\xad\x11\xfe\x70\xb1\x7d\xfe\x15\x9e\x68\xc8\xfd\xeb\x4e\x9b\x46\x99\x8f\xa3\x96\x8d\x12\x47\x70\x19\xa3\x41\xc6\x7b\x30\x38\x4e\xa3\x1e\xf1\x79\x53\xe8\xeb\x08\xc6\x34\x75\xfa\x0b\x55\xb9\x3f\xdf\xa0\x18\x48\x6d\x5b\x84\x97\x3f\x5b\x28\x9b\x69\x6f\x30\x49\x53\x41\x70\x43\xbc\xab\xee\xaa\xe7\x90\x8c\x4e\x53\x23\x22\xd7\x28\x7a\xe7\x48\xe4\x3a\xfb\x35\xf9\x71\x26\x32\x8b\xae\xee\x42\xfd\xee\x7d\x60\x82\xed\xb7\x70\x54\xe5\x03\xe6\x31\x4b\xb3\x57\xf4\xdb\xd5\x85\xa4\x2e\x49\x33\xb0\x6a\x96\x35\x6e\xda\xa3\xb2\x9d\x1b\x91\x13\x2b\x9b\x31\x7b\xd9\x7e\xdb\xcd\xbf\xcd\x1e\xef\x96\x4f\x3f\x1e\x97\x8b\xee\x7f\x3c\x54\x34\xcd\x63\xab\x0a\x5b\xed\xb5\x6d\x55\x85\x05\x28\x71\x0e\xe0\xc6\x71\x20\xf2\xcb\xc4\x58\x9a\x67\x34\xf3\x14\xc1\xdb\xea\x11\x7e\xb6\x2b\xfd\x33\x5c\x08\x34\x7a\x89\x8e\xb4\x77\x03\xaa\x0e\xc1\x5d\x2a\xa2\x1c\x29\x0a\x0d\xc0\x43\xa5\x71\xb7\x08\x73\x23\xa8\x40\x13\x67\xd7\x79\xdd\x3e\xd3\x70\x44\xe5\x56\x0f\xf6\x69\xb3\xee\x7c\xaa\xd1\x52\x94\x34\x67\x30\x14\x2f\x70\x8d\x02\xe3\x5b\x96\x2c\x47\xa4\xac\x63\x26\x7b\xae\x61\x63\xb9\x95\xbe\x6e\x6e\xbf\x7c\x6e\x29\x33\x17\x2a\xfe\x07\x54\x3b\xa6\x51\x72\x43\x14\x75\xa2\x49\xb0\xdf\xef\x96\x3f\xd5\xdb\xeb\x6e\x0d\x17\x72\x55\xe3\xdd\x3c\xd5\x54\x61\x75\xe6\x79\xbd\x7a\x58\x86\x89\xd4\x4c\xc5\x56\xe4\x1c\xab\x1d\xf8\xcd\x6f\xa6\x1b\x60\xaa\xb9\x94\x63\xe9\x90\xa5\x40\x34\x77\x83\x3d\xd3\x4f\xa5\x87\x9d\xcf\x61\xbf\xff\xc2\x9d\x48\x21\x8b\x64\x3c\x64\x6c\xdf\xbc\x15\x47\xe4\x2c\xf0\xa2\x23\xd7\x77\x25\x00\x86\x2e\xcf\x43\x55\x95\xab\x52\xf9\x3b\x37\x24\x25\x36\x45\x5e\x1d\xa1\x5c\x3c\x85\xbf\xc7\xc0\x5c\xa1\x74\xf7\x5a\xb5\x3b\xdb\x3a\xd2\x6f\x46\x26\xe3\xd8\x5e\xe1\x03\xb0\x35\x58\x96\xd5\x6a\x14\xfb\xa7\x46\x8a\xc0\x4c\x82\x5d\x08\x93\x4f\xd0\xa8\xc4\x13\xdb\x28\xc0\x50\xc8\xaf\xb1\x2c\xe2\x16\xb5\x58\xe8\xa1\xd6\xc7\xaf\xeb\xbb\x59\x04\xb1\xf0\xf2\x16\x5e\xcf\xc3\xce\x6a\x73\x5b\xd5\x6b\x31\x6e\xbc\x23\x19\xd1\x89\x2f\x54\xd8\x52\xf2\x75\x04\xe3\xe4\x2a\xc4\x48\x4c\x26\x8f\x74\x05\xdc\x31\x9a\x33\xcc\x94\xb8\x94\x9e\xcd\x77\x5e\x3f\x0d\xcd\x39\xee\x3f\x08\x49\xd0\xc5\x47\x78\x74\xc6\x25\x02\x7e\xf7\xa2\x69\xad\x1b\xe4\xc4\xe3\xfa\xad\x24\x63\x29\xc4\x2e\x13\xb9\x6b\x5a\xd1\xf6\x3f\x56\x09\x52\x6d\xdb\xce\xda\xd3\x61\xb6\x1a\xcf\x79\x16\x47\x29\x24\x3e\xbe\x5e\xd4\x81\x2a\xba\x3b\xa2\xb8\x4b\xd5\x6e\xc4\x1e\x36\xd5\x7e\x92\xf6\xca\x12\x62\xa3\xe9\x43\x67\x11\xce\x8e\x38\xf2\x7b\xa1\xa1\xba\x13\x07\xe8\xb1\x58\x97\x0f\x9b\x74\x31\x9f\xb5\x35\x2d\xa8\xf6\x2d\xe4\x97\xb3\x44\x4a\x04\xb8\xcd\x9e\xe6\x3b\x31\x16\x61\x21\x19\x97\x0c\x43\x89\xe6\xad\xfa\x44\xfe\xa2\xab\x9c\xa1\x24\xe3\xc6\x6a\x00\x61\xb9\xe9\xb6\xaa\x41\x89\x3e\xb9\xe7\xb1\x74\x59\xaa\x00\x55\x0e\x5f\xc5\xc1\xb2\x8a\x96\xde\x70\x65\x19\x8f\x30\x15\xab\xaa\x83\x2c\x4a\x58\x5c\x6b\x45\x25\x59\x96\x49\x17\x0a\x5b\xf0\xc6\x06\x73\x55\x96\x5a\xcd\x9f\x29\x8f\x19\x7a\xf3\xc1\x83\x59\xb5\x70\xb8\xe6\xfa\x7d\xb1\xba\x72\x69\xbb\x59\x54\xb5\x3f\x1d\xca\x7a\x28\xec\x32\x19\x29\xa2\x04\xab\x64\x3b\x59\x68\x6c\x9e\xdf\x0c\x24\x8d\xae\xa7\x6e\x32\x41\xc0\x91\xab\x62\xa2\xcd\xb9\x79\x17\xd0\xea\xc9\xaf\x64\x96\x46\x9e\x0b\x1f\xbf\x10\x8a\x79\x99\xc9\x4b\x50\x49\x9a\xf6\x7c\x22\xfe\x4d\x75\xaf\x33\x44\x0f\xd3\x2a\x6f\xa6\x64\x86\x10\xcf\xbb\x02\x05\xf6\x7b\x2d\xfa\x2f\xec\xf0\xe4\xc6\x14\x70\xed\x22\xb9\x81\xc7\x18\x0a\xf4\x7d\x37\xac\x73\x1c\xdd\xcf\x34\xd0\xcc\x51\xd6\x04\xaa\x0f\x2c\x7e\x5c\xdc\x1f\x08\x62\xbb\x45\xa1\xf6\xfd\xe1\x24\x33\x22\x57\x5e\x92\xaa\x6a\x6f\x0a\xc4\x0f\x8f\x24\x9f\x26\x6f\xca\x48\x82\x75\xe8\x53\xd9\x54\xfb\x29\xe8\x2b\x8f\x98\x4d\xd0\x3d\x88\xff\x74\x37\x12\x14\xd0\x49\x1e\xa9\x1c\x61\x4d\xa7\x52\xd9\x3c\x98\x93\x7a\xed\xab\x80\xfd\x40\x2c\xa5\xa8\xb3\x0a\x1f\x4f\x1e\x41\x6e\x75\xd0\xbc\xb4\xbb\x8d\xa6\x5f\x1a\xb8\x54\x33\x70\x3f\x21\xb9\xf0\x02\x28\x3f\xaa\xfa\x7d\x12\x9c\xe7\xc4\x00\x06\xe7\xb7\xb7\x73\x7f\x11\x9a\x0a\xed\xb2\x88\x0b\xd8\x63\xa6\x44\x0f\xe5\x3f\xdc\x30\x16\x71\x6c\x64\xb4\xdc\xe8\x6d\x0f\x66\xcd\x19\x31\x98\xef\xfb\xf3\x0e\x67\xf3\xcd\xcf\x8e\x83\xa1\x36\x61\x1c\xd7\x68\x75\x7f\x8c\x3a\x32\x7e\x99\xa8\xcc\x59\x96\x60\x6b\x40\x09\x9f\x58\xca\xb8\xbe\x39\xe6\x31\xc9\x75\x80\xfd\x1d\x8b\x29\xc7\xac\x1f\x15\x87\x06\x31\xdb\xb4\xf4\x65\x23\x2c\xc9\x63\xa1\x50\x7f\x63\xe7\xc1\xfb\xa3\xbe\xcc\x8b\x4e\xbb\xbf\xe9\x88\xbb\x93\x27\x2a\x25\x9d\x85\x11\xaf\xa2\x28\x9b\x76\x77\x1c\xb1\x78\x92\x9c\x53\x8b\x4e\x7d\x5e\x2f\x11\x61\xf2\x30\xfb\x7d\xf5\xf0\xf2\x30\xe6\x74\x26\x39\x17\x0a\x3f\xbd\xf5\x49\x16\x63\xb4\x5c\x9e\xe6\x14\x77\xb1\x40\xd8\xe8\x5b\x8f\xaf\x4f\x73\x2a\x04\x06\x03\xff\x9c\x3d\x2e\x66\xe1\x1c\x52\x8a\x9e\x32\x7a\x2d\x6a\xcf\x42\x7c\x7d\x76\x33\x66\xf5\xbf\x2c\x78\xcf\xab\x9e\x1c\xbb\x25\xef\x4d\xc2\x17\x7b\xff\x5f\xcc\x56\x06\x0c\xd7\x97\x95\x77\x18\x9b\xac\x3c\x8f\x52\x47\x17\xf3\xd3\x05\xa5\x57\xfd\xbe\x3c\x57\x02\x91\x53\xb3\x83\xac\xab\xe6\xd4\xf4\xd4\x32\x24\x17\x69\x1e\x6b\x2f\x14\x52\x1d\x56\xcd\x1a\x84\x1e\xb7\xb5\x84\x0f\x48\x65\x0c\xa3\x31\xe5\xb8\x66\xaf\x6f\x67\xb9\xca\x72\xd3\x17\xa1\xba\xfd\xac\x78\x2d\x2d\x23\xeb\xe4\xbb\x52\x42\x18\x4b\xb1\x89\x55\xaa\xeb\xeb\x5b\x81\x42\x40\xd7\x62\xf3\x6d\xa6\xde\x07\x68\x97\x5c\x99\xc4\xd8\xde\x96\x56\xbd\x4d\x59\x2f\x2f\xda\x6a\x49\xae\x29\x47\x53\x65\x49\xae\xa6\x86\x4c\x77\x5f\xb9\x6b\xa1\x34\xed\xea\xcb\x40\x33\x0c\xe7\xd8\x52\xb7\x58\xcf\x7e\x84\x53\x24\x24\x8f\xfb\x5c\xfa\x20\x83\x90\x03\x07\x2c\xcc\x9c\x1a\xa8\x2d\x98\xc4\xf1\x1e\x39\x3b\x31\x9e\x18\x90\x0a\x8b\x29\x77\x96\x96\xc8\xb2\x99\x80\xbe\xb9\x14\xc4\x72\x3f\x30\x09\x04\x01\xcd\xe5\x4f\xd5\x77\x85\xe5\x46\x48\x64\x1d\x13\x5a\xfb\xfe\x6c\xec\xad\x53\xc8\xfc\xee\xb2\xdd\x43\xb6\xbc\x30\x5d\x46\x71\xf4\xd2\xa4\x50\xef\xa7\xe3\x0e\x1c\xef\xc7\xa6\x15\x9b\x56\x5e\xbf\x0f\x11\x45\x86\x6b\xac\x14\xee\xf7\x55\x3b\xd1\xef\x23\x82\x50\xc2\x3d\xc5\x8b\x93\xde\xd3\xda\x61\x85\x7b\xbd\x09\x22\x88\xce\x70\x61\x6c\xd4\xdb\x01\xd4\xfb\x7e\xd8\x79\x4e\x04\x25\x09\x76\xa6\x0d\x10\xca\x7f\xcb\xa2\x0a\x4a\x53\x34\x6c\x87\x56\x8f\xd0\x44\x82\x32\x83\x02\xd7\xfb\x4a\x68\x0b\x71\x05\xed\xbb\xec\x9a\x4b\x99\xf9\xf0\x3c\x34\xce\xb1\x78\xf2\x4f\x51\xaa\xea\x3d\x9c\x2d\x49\x90\xba\xe0\xa3\x6a\xbf\x10\x88\x19\x6c\xe7\x82\xba\x42\xb2\xeb\x28\x0b\x2d\x25\xfe\xb0\x8e\x52\x3e\xee\xc3\x78\x2a\xf7\xe7\xbe\xec\xb1\x09\x61\xaf\x60\x82\x66\xb6\x59\xea\xb8\xaf\xce\x0b\x5b\xc1\x72\x95\xe2\x5f\x72\xcd\x11\x91\xa8\x18\x37\x1b\xeb\xf9\x0f\x99\xb2\xc6\xe3\xb8\x53\x04\x3d\x56\xed\xae\x1d\xc0\x62\x04\x4f\x00\xb3\xa0\xda\xb5\x40\x77\xcb\x6b\x59\x86\xc7\x48\x09\x8b\x58\x0f\xa7\x44\xd5\xab\xfb\x3f\x8e\x57\xfa\x37\x45\xca\x73\xe4\x4c\xd3\xa0\x2a\x0d\xd3\x83\x92\x62\x6c\x3c\x54\xf9\x5d\xa9\xea\x8b\xa7\xca\x73\x85\xe8\x23\x68\xdf\x9c\xb3\xe8\xbf\x0b\x21\xba\x4f\xd8\xa6\x01\xec\x83\x62\xc5\x87\x84\xc3\x99\xce\x59\xdf\x4c\x79\x0b\xde\x62\x0a\x99\x59\xd0\x40\x1f\x23\xfd\x9a\xaf\x81\x08\x1d\x65\x32\xf1\xbc\x1c\x47\xa8\x51\x1f\xea\xfa\x6e\x24\x74\x9c\xa1\x9d\xf0\xdb\xdf\xf3\x72\x3d\x5f\x3e\x6e\x67\x77\xcb\x9d\x2f\xa1\x09\x0d\xe0\xa5\x43\x5e\x5e\x56\x8b\x78\x50\x89\xf0\xd1\x82\x00\x09\xb8\x37\x34\x6d\x75\xdc\x40\x70\xca\x84\x71\xfd\x8b\x45\xd9\x6d\x6d\x8d\x0d\x7b\x66\xa5\x5e\x14\xc6\x14\xea\xb4\x6f\xcf\x61\xa4\x4e\x84\x2d\x84\x96\xe7\x99\x52\x17\xad\x8b\x92\x50\x82\xaf\xe2\xa9\x84\xce\x2a\x3f\x95\x70\x03\x23\x55\x30\x22\x89\xd4\x38\x57\xdf\x4e\x07\x51\x5a\x0e\xf9\xaf\x2a\x4b\xe3\x73\xd3\x48\x23\xc5\x5b\x0d\x6d\x5d\xc0\x07\x0c\xb3\x5b\x92\x4a\xe9\xa1\xb9\xdf\xc4\xde\xdc\x17\x06\x86\x9c\x93\x6e\x14\x4b\x08\x42\x05\x1e\xce\x36\x9f\xec\xff\x2c\x33\x0c\xca\x90\xcc\xdf\x7f\xe3\xdd\xe9\x1d\xa4\x7d\x57\x9d\xbe\x30\xb2\x32\xe6\x9a\x3b\x42\xe1\x6f\xa7\xb2\x85\xfa\xbe\x50\x10\x04\x9b\x88\xe4\x89\x6d\xfe\xb1\x61\xef\x5a\x94\x5f\x36\x9b\xfa\x1f\xf0\x8c\xd9\x29\x6e\xda\xba\x3a\x83\xbe\xa9\xc2\x02\x95\x3c\xb7\x6f\xea\x0a\xfc\x6e\x58\xd9\x92\xdc\x64\x48\xaf\xf5\x86\x49\xd7\x27\x63\xd4\x9b\x28\xca\x6b\xd8\x8e\xe1\xaf\xd2\x24\xa6\xb8\x2d\xc8\xe6\x41\xfc\xfc\xed\x0a\x3c\x40\xa6\xb9\x13\x6c\x2f\xbb\x79\x29\x3e\x60\x48\xce\x36\x20\xe2\x20\x32\x75\x5a\x36\xb7\xc5\x07\xb8\x1d\x6d\xb4\x0c\xb2\xd4\x44\x7a\x80\x86\x75\x21\xce\x28\xe5\xe3\x87\x2a\xcb\xed\x57\x62\xb6\xcf\x9f\x20\x67\xae\x81\x6d\xfe\x64\x2c\x0f\x01\x92\x3a\x4d\x3a\xa0\x65\x1e\x4b\x65\xd5\x8d\x3f\xa0\x3e\x56\xd5\xfe\xa3\x59\x57\x07\x11\x0e\xa7\x2c\x77\x55\xde\x67\x71\xee\x19\x1e\xc2\xe1\x98\x25\x83\xb6\xd1\xf1\xbc\xc5\x4e\x6c\x3d\xf3\xa3\x33\x65\x89\x96\x4e\xe7\x0d\xb6\x47\x5e\xcb\x3b\xfb\xb1\x8a\x23\x1e\xff\xd4\xc0\x4d\xd5\xb6\x5f\x75\x8f\xc9\x5c\xe5\x38\x8f\xdd\x39\x41\xb4\xbf\xf0\xd1\xa5\xa0\x14\x01\xc6\xf7\xa7\xf7\x0d\x7c\xc0\x28\x57\x29\x05\x63\x98\x9c\xf9\xd1\x39\x46\xf7\xa2\x69\x7b\xba\x65\x22\x45\x96\x23\xb0\xee\x71\x33\x1f\xbe\xd0\x89\x3b\x24\x25\x8d\xb9\x2d\xb1\xab\xaa\x74\x9c\x88\xfe\x50\xae\xb0\x57\x4e\x8a\x06\x06\x7c\xea\x44\x2a\x22\x10\x85\xe3\x7a\xc2\x47\x7a\x66\x44\x2a\x4a\xad\x44\x50\x85\x1f\x4f\xf8\x33\x57\x89\x65\xb9\x70\xa1\x5e\x33\x2d\x4a\xfa\x81\x12\x10\x1b\xf4\x5a\x55\x7a\x7f\x9a\x7a\xc3\x52\x13\x0a\x58\x46\x9c\xad\xee\x97\x8b\xdd\x66\x3b\xdb\xbe\x6c\xfc\x45\xb4\xca\x11\xa9\x7a\x2a\x0d\xc2\x09\x46\x1a\x8f\xe3\xf3\x40\x66\x4b\x39\x01\xd6\xf6\xee\xb8\x74\xff\xa6\x07\xef\x4f\x23\x89\xee\x81\xfb\x3e\x7a\xf8\x9b\xbf\x55\xd4\x57\x93\x02\xb4\xd9\x92\xf9\x05\x45\x9d\x30\x32\x46\xef\xee\xdf\x08\x61\xbe\xf3\x79\x1c\x09\x5a\x69\x35\xe8\xa0\x5a\x1e\x3a\x8f\x00\xbe\x80\xd1\x4b\x43\x33\x9a\xff\xed\xb2\xdf\xdf\x8b\x5d\xa4\x89\x73\xac\x28\x1c\xf7\xd5\xb4\x6a\x2c\x4d\x6a\x85\x9c\x3d\x0c\xf0\xb6\x33\x27\x78\xd9\x91\xa5\x37\xb9\xa2\xbd\x56\xd1\x73\x55\xed\xa7\xcb\xd4\x68\x85\xc2\xaa\xcf\xa2\x85\x12\xb3\x30\x2e\xa1\xf5\xc5\x83\x02\x27\xd2\xa5\x7e\x67\x5a\x8f\x58\xa2\x27\x77\x68\xc0\x0a\x01\x69\x6d\x4b\xce\xed\x2f\xeb\x27\x2a\x8a\x6c\x8e\x1a\x41\xc9\x8f\xa7\xc3\x02\x44\x00\x64\xab\x88\x66\x90\x0e\x0c\xe0\xcb\x7a\x92\xd8\x54\x51\xc6\x10\x69\x6a\x9f\x74\x55\x9a\x3d\xce\xc6\xa0\x07\x49\x11\x43\x91\x41\xf4\xdf\xd9\x72\xfe\xb4\x7a\xf4\x7f\xa6\xca\x32\xd8\xbd\x42\xfb\xad\xfa\x7c\x38\xa9\xb7\x97\xb2\x2d\xf6\xdf\x44\xad\xfb\xfe\x56\x45\xc1\x02\xe4\xec\x72\xdc\x89\x5d\x09\x9f\xbb\x83\x45\xc4\xfd\x9f\x16\xb6\x62\x32\x35\xae\x6c\x3a\x7f\xc3\x8e\xb8\x1b\x28\xc1\x14\xaa\x10\xd3\xce\x2d\x95\x50\x8e\xfe\xfe\x66\x48\xc8\x3c\xd8\x86\x54\xc2\x29\x92\x9b\x7f\x17\xa5\xd0\x45\x68\x91\x51\x9c\xb0\x68\xd8\x29\xfb\xb5\xab\xef\x7f\x90\x10\x9c\xbf\xaa\x84\x7f\x9f\x44\xdd\x42\xbd\x2a\x2d\xc6\x2e\xbc\x04\x2e\x32\x0c\x1b\x30\x12\x6a\xc5\x2b\x94\xb7\xe2\xab\x94\xaf\xe2\x52\x65\x3d\x3b\xf8\x55\xe2\xce\xf1\x0d\xa4\x71\x86\x7b\xcf\x16\x73\x85\x43\xce\x42\xa2\x52\x4e\x59\xe0\x08\x1a\xcc\x56\xcf\x41\x4f\x54\x0a\x32\xb3\x5a\x35\x58\x1d\x15\x45\x48\x32\xa9\x9c\xd8\xd4\xf6\x27\xc8\xbb\xc2\xb4\xf7\x45\x09\x03\x83\xae\xf2\x24\xc9\xa5\x97\xf6\xa9\x65\xd1\x36\xbb\xa3\xe5\xa1\xdc\x55\xc7\xfe\x26\xf2\x5c\x5a\xed\xf4\xe6\xb5\x81\xb2\x47\xbc\x29\xa1\x08\x22\xf0\x1c\x0b\x58\x33\xe4\x38\x24\x4a\x26\x02\xbf\x03\x64\xb6\xb5\x74\xf2\xc3\x8d\x48\xa9\x24\xc5\x88\xcf\xcb\x9b\x3c\xe9\x7e\xc6\x75\xc2\x33\xcf\xba\xb4\x45\x3d\x99\x21\x2c\x41\xe9\x34\x41\x0f\xed\x58\xc3\x47\x68\xfd\xf3\xc7\xf2\x48\x46\x41\x51\xfd\x8f\x2f\xde\x92\x76\x46\xf6\x15\xda\x9b\xf3\x03\x34\x97\x84\xe7\x93\xf1\x9a\x5a\xb3\xd8\xc5\xd3\xb3\x52\xaf\xab\xc0\x46\x4d\x14\xa8\x94\xf4\x50\x10\x57\x1f\x98\x17\x35\xe2\x57\x2e\xb0\xb6\xca\x70\x4d\x54\x68\xaa\x84\xf6\x8d\x46\x24\x73\xe7\xd2\x11\x4d\xd1\x3b\x68\x6b\x94\x59\x38\x87\xbf\x0b\x8d\x3d\x63\x41\x79\xe6\xe4\x89\xf2\x2f\x6e\x56\x13\xc2\x88\xe5\x85\xd3\xcb\xd2\x8a\xe2\xf8\xd3\x10\x4e\x5c\xa3\x61\xd1\x36\xcf\x63\x02\x6a\x37\x84\x49\x81\xd2\x99\x3e\x4b\xdc\xf9\x82\x76\x5f\x9d\xd5\xb5\x38\x4f\xa3\x7d\xcd\x74\x2a\x6c\x9c\xf9\x72\x7c\xad\x85\x1e\x41\xa1\x35\xd3\x79\x44\x47\x5a\xcb\x36\x4a\xae\x57\x8b\xf1\xb4\xe8\xd8\xe5\x83\xad\x21\xbb\x13\xcd\xbc\x0a\x8b\x5c\xc7\x39\x88\x2c\xbc\xd5\xaf\x32\x8a\x6e\x70\x42\x34\xc2\xaf\x37\xff\xfa\x63\xf3\xc3\xb3\xdc\x13\x9d\x24\x39\x1b\x21\x8b\x9e\xab\xea\x0d\x43\x9c\xf1\x8d\x24\x59\xa2\x85\x13\x1c\x80\xdf\x26\xa7\x36\x14\x7b\xd9\x0f\x45\x79\x03\xed\x26\x68\xc4\x13\xcd\xa3\x88\x06\x09\xfb\x53\xdd\xc0\x6a\x71\xdd\xe2\x68\x4e\x6c\xfb\x0e\xf6\xba\x62\xeb\xf0\x72\x3d\x4f\x29\xf9\x63\x1e\xce\x95\xe5\x46\x0c\x36\xe1\x61\xd3\xae\xe6\x99\x4c\xe2\x5e\xc1\x77\x5e\x95\x0d\x5c\x51\x6f\x1c\x3f\x13\xd7\xcc\xf5\x48\x3a\x89\x7b\x4c\xc9\xfb\xeb\xa5\x2e\xb5\x8a\x69\xdb\x67\x71\x5e\xf4\xd8\x35\x9d\x11\x8b\xa4\x80\x9f\x45\x7b\x73\x3a\x0f\x01\x0f\xfd\xe9\xf3\x98\x62\x9f\xf0\xce\x16\x41\x30\xbc\x69\x60\x0b\xf5\xa1\xb9\x0e\x7a\xd0\x79\xaa\x30\x47\x74\x07\xd8\xcb\x77\xee\x3e\xa8\x2f\xe6\x4b\x90\x98\xe5\x1e\xfd\x34\x3e\x8b\x88\x39\xd6\x29\xfe\x53\x15\xe5\xa2\x16\x9f\x93\xdb\x92\x24\xc5\x64\x6c\xc8\x47\x07\xf4\xe0\x64\x9c\x54\xc8\x70\x72\x3f\x5b\xdf\x2d\x77\xcf\x2f\xeb\xf9\xb7\xd9\xc6\x03\xf6\xb5\x34\x8a\x99\xfe\xf3\xb6\x7a\x5a\x83\xda\xfa\x84\x90\x44\x2b\x1e\x63\x67\xd0\x7d\xf5\xea\xdb\xe9\xbe\x82\x6e\xfa\x5f\xe8\x74\x90\x34\x1e\x98\x68\xad\x33\x8d\x6f\x66\x01\x3f\x67\xfb\xe3\x9b\x08\x7f\x37\x39\x12\x77\xec\x42\x64\x74\x18\x42\xab\x27\x6f\xdf\xc4\x1c\xf1\x87\x0b\xd1\x0e\xd2\xa0\xda\x24\x2a\xf6\x68\x96\xd2\x39\xd7\xb6\x83\xf3\x0b\xce\x37\x6d\x84\x32\x7d\xad\xeb\xe6\x54\xec\x75\x51\xbe\xa2\xb4\x0e\xd4\x1f\x93\x54\x7f\xf6\xdf\x24\xfa\x9f\xe9\x7f\xf9\x13\x69\x01\xce\x51\xbd\x10\x3e\x22\x10\x11\x86\x6e\x6c\x2d\x4a\xfd\x58\xf5\x91\x00\x44\x9c\x62\x64\xb9\x83\x43\xd1\x76\x8e\x8a\x12\x47\x9f\xf7\x1a\xab\x01\x12\x88\x4c\x6a\x99\xa7\x3f\xcf\x47\x98\x57\x7a\x92\x43\x06\x12\xa5\xa9\xed\x3b\xb0\x09\x0d\x4b\x7c\x21\x90\x51\x75\x63\xf7\xb9\x5f\x7e\x53\x40\x0c\x78\x1d\xa4\xdb\x1a\x60\x51\x94\xd5\xa8\xf0\x0a\x94\xc4\x58\x60\x29\x1a\x04\xe4\x5d\x5f\x7c\x40\x13\x8d\xaf\xb2\x3c\x1d\x5c\x8b\xff\x80\xec\xdf\x8d\x61\x89\x25\x39\xf3\xba\x75\x63\x20\xfd\xc0\xaf\x07\xc6\x23\xa4\x21\xf3\x5c\x25\x25\x72\x2e\x9c\xc4\xbe\x77\xe9\x80\xa9\x3c\xf6\x69\xa0\xe2\x2b\xe6\x22\x60\x26\x12\x6e\xd4\x75\x86\xfb\x61\xa2\x7c\x9a\x32\x87\x98\x46\xf8\xd1\x3a\x8c\xc3\x80\xbb\x06\xe2\x9c\xc5\x2e\x58\x9d\x36\xb0\xfb\x11\x82\x62\x76\x14\x7e\x1e\x8b\x1a\x42\xc7\x52\x7f\x6f\xb1\xd1\x74\x80\x96\x59\x36\xaa\xae\x3e\xaf\x2f\x7e\x48\x58\x8e\xe6\xdc\x83\x36\x7e\xd4\x55\xf9\xea\x66\x30\x20\xf7\xfc\xbd\x25\x26\x31\x36\x42\xdd\xf7\x24\x42\xc0\xa3\x04\x8b\xf5\x83\xdd\xd2\x21\x2d\x27\x50\x01\xe0\xc0\xb1\x5a\xb6\x08\x89\x99\xbd\x50\xef\x76\xb3\xbe\x7e\x7b\x29\xb7\x34\xfc\x1a\xca\xf3\xcd\xd9\x17\x13\x7f\x73\x1c\x15\xf6\x9f\x30\x94\x53\xe9\xc9\x20\x6c\xae\xd4\x49\x38\xda\xf6\xdf\xf1\x24\x66\x99\xc9\xfd\x73\xef\x22\x6b\x02\xb1\xb2\xb5\x53\x48\xc9\x75\x1a\xee\xfa\x90\x01\x60\xc2\x6d\xfb\xf4\xfb\x76\xe8\x82\x42\x4e\x40\xb8\x7d\xad\xfb\x52\xa7\x1d\xb3\x6e\x94\xe0\x80\xfe\xd4\x30\xbb\xda\xad\x18\x7f\x5c\x52\xc0\x10\xfe\xe5\x71\xb5\xb5\x88\x97\x07\xdb\x55\xfe\xdb\x85\xc2\x31\x01\xc9\x32\xc6\x43\xc9\xf1\x3f\xa0\x3c\x64\x6a\x32\x2c\x25\xca\x7d\x7f\x1b\x27\x4a\x39\x28\x9c\x80\x14\x49\xe2\x3c\x8f\x07\x68\xc5\x50\xd5\xc6\x8d\x50\xca\xa6\x57\x8b\xe6\xbe\x7a\x9d\x24\x75\x40\xd3\x28\xb7\xdc\x9e\x87\x42\xf5\x11\x19\x68\x96\x32\x4f\x16\x33\x64\x25\xbb\xba\xcd\x81\xce\x22\x84\xea\x6d\x96\x4f\xa3\x59\xd5\xc2\xb2\x46\x58\xd6\xa0\x59\xd3\x40\xd3\x0c\x5a\xee\x40\x1b\xb0\x1e\xee\xae\xb1\x3c\xfe\x4f\x66\xd9\xbe\x3d\xd7\x95\x29\xda\x09\x85\xc6\x64\x3d\x19\xca\xb1\xbe\xd9\x1c\x85\x82\x99\x41\x93\xde\x7d\x62\xe1\x01\x0c\xe7\xb6\x09\x1d\xb7\x1a\xf0\x42\x7c\x04\x8c\x23\x22\x6e\xa0\x5d\xd6\x8a\x46\xeb\x41\xfc\x32\xb9\x86\x4a\x1d\xb3\x54\x53\xed\x3f\xc0\x2d\xda\x2b\x40\xa5\x30\x3e\x8b\x86\xab\x03\xeb\x6e\x5f\xd7\xdb\x4c\x14\x69\xd1\xbd\xba\xa7\x87\xd5\xf7\xd5\x08\xd8\x69\x08\x4d\xb1\xe8\xba\x43\xc3\xb2\x6b\xab\xf7\xfe\x10\x8b\xd1\x6b\x7a\xfa\xaf\x35\x88\x3d\xa0\xfb\xd6\x8c\x7f\x9c\x50\xe6\x00\x10\x63\x12\x90\xf1\xf3\x19\x92\x5a\xf6\xd1\xa1\xa8\xfb\x74\x48\x96\x21\xdb\x92\xdb\xb2\x6b\x98\x84\x7a\x7e\x98\x4a\xb0\xa4\xfc\x21\x4e\xfb\x76\xd4\x0b\x6e\x88\xb6\xe9\xd7\x6e\xfb\xd8\x8b\x0b\x08\x9e\x1b\x45\x55\x66\xa5\x60\x85\xb6\x0c\x5f\xdb\xea\x11\x3e\x47\x5a\xb2\xd7\x43\x16\x43\x35\xa0\xd1\x6a\x8e\x5f\xf6\x4d\x1b\x16\xc5\x08\x7c\xe8\xb6\xd3\xce\xc8\xcf\xf4\x15\xee\x5e\x3f\x36\xd5\x66\x2c\xe5\xae\xaa\x2f\xcb\x3d\x86\xa9\x28\x72\x1b\x3c\x66\x7c\x1f\xc4\xcf\x67\xa8\x31\x6d\xf2\xc5\xe9\x15\xa7\x10\xba\xab\x7e\x0b\x7f\xb5\xe2\x0c\x8e\x38\xfc\xa7\xed\xc1\x1e\x40\xda\xfe\x12\xc5\x3b\x7a\x1d\x31\xb3\x42\x3c\xaf\x27\x29\xa1\x1e\x7c\x70\x26\xa1\x96\x04\xbc\x28\x8b\x76\xd9\xbe\x8d\x7b\x82\xc7\x93\x96\xc4\x22\x75\x80\xb1\x47\xf8\xd9\x76\xae\x74\x8d\x6d\xd3\x17\x15\x6d\xc3\x49\xc6\x1d\xd8\xda\x75\x3b\x2d\xe0\x58\x83\x43\xf5\x4d\x6f\xf5\x97\x35\x48\xc3\xb9\x56\x7d\xf9\xa8\x9b\x49\x8b\x46\xba\xbe\x84\xb9\x8c\x31\x31\x77\x38\x07\x48\xe0\x30\x41\x66\xd2\x88\x60\x49\x02\x05\x99\x2d\x4c\xc3\xd5\x81\x2e\x6e\x63\x7c\xe2\x34\x72\x2c\x6c\xd0\xaa\x37\x97\xa8\xbd\x90\x63\x0c\x5f\x72\x4a\x09\x52\x27\x7c\xbb\xbb\x1d\xb5\x79\x98\x94\x6b\x9c\x19\x1f\x90\x20\x70\x6f\x5b\x0d\x71\x94\x26\xa3\xc4\xba\x81\x36\x69\x3f\x17\xcd\x9b\x14\x7d\xfa\x76\x32\x3f\x99\xd2\x08\x01\xf4\x46\x66\xb9\xfd\xb6\xad\x26\x59\x3f\x93\x41\x4e\x7c\xfc\xbb\x85\xa6\x45\x90\xef\x19\xe9\xad\xbf\x5a\x98\xb9\x12\xe8\x25\x5b\xf4\xdf\x5d\x5d\x9d\x8e\xd7\x89\x57\xa6\xa5\xda\xbf\xfa\xf7\x12\x5f\x6e\x72\x88\xbc\x47\x7e\x41\x79\xe0\x86\x08\x00\x4c\x04\x94\xd5\x76\x02\x5c\x70\x03\xa4\x60\xa9\x1e\x70\x36\xdd\x78\xf2\xa3\xe9\x38\x6d\x50\xc3\xed\x55\x1c\x60\xd5\xcc\xfd\x57\x3d\xf1\x68\x8c\x62\x29\x22\xc2\x1f\xaa\xb2\x7d\x3b\xe2\x06\x04\xa1\x80\x63\x14\x4f\x90\xd0\x1c\x9b\x61\x6f\x8a\xba\x7d\x9b\xfe\x3c\x8d\x30\xe8\x5e\x88\xf2\xfd\xb4\xd3\x70\xf0\x9c\x76\x46\xa7\xc4\x53\x51\xe0\xfa\x9b\xb9\x8e\x77\xbd\xad\xb0\xaa\x56\x55\x93\xc0\xdc\xe8\xcc\x10\x19\xf8\x46\xde\xa1\x6c\xba\x17\x8c\x42\xf0\xe1\xa4\x82\x23\x54\x11\x25\x88\x6c\x39\x6d\x82\xac\xfa\xe2\x2d\x6b\x63\xfb\x74\x2c\x8a\x7d\x01\xa1\x8e\x6e\x20\x21\xe8\x00\xd5\x55\x35\x50\xb9\xf1\x07\x15\x13\x96\x6f\x15\x44\xbd\x39\x56\x9d\x2d\xe8\xbe\xb5\x7f\x56\xd2\xc7\x13\x97\x6d\x5c\xd3\x8f\xc4\xa4\x04\x3f\x29\x5b\x7d\x1f\x7b\x14\x7e\x48\x46\x70\x6f\x0e\x59\xa5\xaa\x1c\xb5\x7c\xd2\x28\xca\x53\x5c\x17\xb3\xf2\x15\xf6\xbd\xe8\x0a\x76\x00\xb8\x21\x84\x50\x8c\x22\xc0\xe5\xf4\x17\x50\x9e\x97\x3f\xa1\x56\x45\x03\x4f\xc7\x81\xba\x39\x8d\x48\x42\xa2\x20\x50\xe2\x48\xad\x2e\xab\x92\x7e\x30\x8f\xb2\x5e\x0f\x68\x81\xb0\x01\xab\xe6\xf1\x26\x7c\x43\x51\xe6\xc7\xa6\x20\x2d\x49\xbb\x69\x63\xfe\xdb\xe4\x44\xda\xa6\xfd\xdc\xa6\x8a\x09\xef\xba\x18\xa6\x0d\x69\x44\x63\x8d\x28\x44\x53\xd5\x0a\x02\x4a\x6a\x48\xcc\x4f\x23\xca\x29\x1a\x3f\x1f\xf6\xdf\x8b\xb2\xcf\x22\x87\x90\x65\xe4\x74\xd0\x88\xa6\x8a\xf4\xe8\xa3\xf9\x3f\xb7\x20\x0e\x63\x6e\x6c\x37\x90\xc5\x5c\x71\xcf\x8b\x5f\x1d\x5d\x49\xb1\x77\x3d\x69\xc4\x4c\x84\x1c\x33\x0f\xb3\xdf\x77\xab\xc7\xef\xcb\xcd\xf6\x61\xf9\xb8\xdd\xec\x6e\x96\xb7\x4f\xeb\xe5\xee\xe1\xe5\x7e\xbb\xda\xac\xee\x5c\x2f\x84\xbf\xeb\x38\xd2\xe0\x02\x41\x04\xc4\xdf\x54\xa2\xd6\x0f\x00\x2d\x42\xff\xc2\x20\xbb\xab\xdf\x14\x6d\xa3\x6a\x80\x72\x44\xe3\x9b\x5d\xf9\xdf\xd1\xec\xc5\x4c\x62\x48\xba\x58\x7d\x5f\x2d\x7c\xf3\x05\x8d\x92\x3c\xb3\x4a\xb0\x41\xa7\xfe\x9a\x8d\xa5\x11\xe7\xe0\x89\xfa\x5c\xc7\xdb\x10\x0e\x43\x23\x9e\x65\x91\x1c\x6a\xde\x56\xb6\x29\x4a\x57\x1e\xb4\x49\xa3\x34\x56\x8c\x8c\xbc\xfb\x07\xb4\xbe\x43\xc7\x99\x46\x69\x22\xb0\xa2\xf9\xea\x19\x0f\x26\xdd\xbe\x34\x4a\x55\xe6\x33\x8b\x9b\x93\xec\xce\x83\xe5\x96\x9b\xf3\x4a\x4f\x96\x55\xaa\xa9\x8f\x45\x3f\x50\x16\xdb\xdf\x4a\x96\x53\xac\x94\x3f\xae\x6f\xbc\xf4\xa9\x3f\x24\x72\x85\x8d\x63\x37\xab\xed\xe6\xef\x31\x9f\xd2\x48\x46\xc6\xb3\xa9\x3e\x9c\x67\x65\xfb\x56\x78\xf8\x04\x8d\x24\x4d\xf1\xa9\x77\xc8\x0e\x54\x40\xd9\x3d\xfc\x47\xa1\xa1\x7e\xe9\x13\x85\x7e\x6c\xa2\x90\xe6\x6b\x5e\x9f\x8f\x6d\x15\xce\x90\x26\xd8\xa9\x76\xac\xea\xd6\x54\xfb\xa2\xf2\x11\x94\x3b\xae\x23\x8a\xfd\xe7\x88\x9d\x1e\xec\xf5\x34\xd2\x92\x63\x4d\xa4\x3e\xc9\x61\xd3\x3f\x8d\x40\x66\xe0\xfa\x1d\x16\x45\x23\x4f\x75\x83\xf9\x48\x2f\xb3\x3b\x9e\x45\xd0\x92\x0d\x99\x49\x1c\x0d\xcc\x88\x6c\xe7\xc2\x97\xa7\x91\x31\x80\x9d\xef\x18\x7e\x57\xd5\x8b\x9e\x92\x4b\x52\x42\xb4\xa4\x4e\x54\xab\x3e\x3b\xae\x3e\x87\xa7\xa1\x84\xa6\x96\x2d\xea\xcd\x96\xa5\x9a\xc9\x6f\x19\x13\x9e\x6f\xfa\x79\x2f\x4a\x68\x1f\xa7\xd9\x02\x4a\x58\x12\x5b\x2a\xe8\x41\x1f\xab\xdd\x3d\xac\x26\xee\xf5\x3c\x3a\x25\x49\x24\x31\xf1\xf7\x2f\x51\x3d\x9f\xc6\xb4\x9d\x93\x81\x12\xb0\x6c\x3e\xd4\x81\x98\xdc\x43\x62\x6c\xe3\xbd\xf5\xde\x6e\x3c\x80\x66\x7a\xe5\x8b\x9c\x0a\xf1\x27\x40\x16\xd1\x4b\x35\x62\x97\x71\xba\x52\x59\xa2\x84\x4b\x8d\x3d\x0f\xf6\x69\xd7\x8e\xa4\xf1\xcb\xaa\xdd\xaf\xc2\x09\x4a\x52\x4a\x73\xe9\x1a\x87\xfa\xe2\x22\x25\x29\xa3\x59\xff\x60\x0f\xdf\x1f\x2f\xd8\x43\x29\x49\xf3\x08\x27\xf2\xe6\xf1\xc6\x72\x67\xed\x9e\xd7\xab\xf9\x72\xf7\xf8\xf2\xe0\x4f\x93\x51\xee\x28\x2c\x3c\x73\xc2\x57\xb9\x25\x4a\x32\x48\x94\x83\x9e\xde\x9d\x44\xad\x0b\x51\x7e\x87\x2f\xfa\x05\x28\xc9\x8c\x25\xfe\x2f\x50\x3f\xba\x99\x79\x63\x45\xf2\x28\xf2\x08\xd6\xe7\xaa\x69\xdb\xd7\xab\xf0\x01\x8a\x40\xbb\xcc\xd7\x7e\xf8\x64\xcf\x22\x82\x5b\xc5\xb0\xcd\x76\xb6\x5d\xee\x1e\x9f\xb6\xbb\xdb\xd5\xe3\x6a\xf3\x6d\xb9\xf0\xd7\x11\x92\xa0\xcf\x29\xab\xf2\xd4\xf4\x01\x2b\x25\x92\x32\x4f\x67\xd6\x1b\x5d\x6f\x01\x89\xec\x3c\x2f\x4f\x9e\xf9\x01\x75\x63\x79\x25\x07\xdb\x58\x58\x1b\x52\x67\x3a\xa8\x5d\x59\x19\x84\x35\xd2\xdc\x16\xe5\xeb\x8f\xa2\xd4\xd5\xa7\xbf\xa4\x62\x14\xb5\x1a\x74\xd1\xc0\x41\x8a\xfa\x7d\xb8\x7e\xc8\x74\xea\x34\xcb\x32\xe5\x1c\x2e\xa8\x57\xcd\x4c\x1f\x8a\x70\xf7\x1a\x2c\xcc\x6b\xf6\xb2\xb9\x19\x5a\x15\xa2\xc1\x4e\xb8\x4d\xcc\x76\x0e\x1a\xb4\xa8\xb1\x61\x71\x5c\xa3\x87\xd4\xc6\xb6\x06\x5a\x05\xee\xba\x33\x3e\xa8\x35\x59\x95\x28\xf8\x3a\x68\x15\xa5\x04\x72\x81\x1a\xba\x37\xb3\x7f\x8f\xae\x67\x52\x88\x93\xc0\xe9\x50\x54\x4e\xeb\x67\xfc\x28\x46\xe6\x9e\x48\xb5\x57\xd1\x74\x84\xec\x94\x46\x89\xdd\x16\x1d\x69\x50\x83\xba\x8c\xbe\xab\xde\x8d\x21\x51\x8c\x4c\xad\x45\xd9\x82\x53\x2b\x0b\x87\xf2\x8c\xfb\x84\xd5\x2f\x92\x33\x94\x12\x95\x45\x56\x08\xf6\x78\xdc\x9f\xf1\x3e\x59\x38\x89\x56\x48\x4a\xf0\x4d\xa8\xf7\xce\xb3\x0b\xec\x88\x94\x12\x48\x51\xfa\xfe\xbe\xba\x54\x65\x98\x5c\x81\xb2\x04\xfc\xad\x88\x57\xb8\x34\xcc\x97\x30\x23\x4a\x69\xa6\xb0\x80\x39\xdf\xce\x16\xf0\x51\xec\x47\xb0\x59\x4a\x63\x6e\x6b\x35\x0d\xb4\x8f\x85\x7a\x47\x0b\x3b\xda\xad\x69\x42\x2c\xf5\x79\xe0\xaf\xb5\xea\xb6\x03\x0a\x47\x4a\x93\x9c\x62\xbc\xb1\x43\x46\xf7\xc9\xef\x45\x86\x64\xb9\x77\x57\xc5\x53\x28\x4d\xa4\x05\xac\x37\xd0\xde\x76\x7e\x9f\xeb\x10\x7d\x32\xb6\xab\x63\xf0\x28\x5c\x6a\xdd\xb7\x2b\xe8\x93\x6a\x37\x98\xea\xbc\x74\x0b\x28\xd7\xb1\xa5\xda\x1a\x48\xe0\xda\x15\x3e\xfa\xfe\x69\x0a\x9a\xf7\xa9\x9e\x67\x24\xc8\xf9\x02\x9d\x7b\xfd\x9d\xa4\x46\x63\x3a\x1b\x69\xaa\x57\x2d\x1c\x30\x05\xed\xe7\x45\x44\x02\x15\x64\x8e\x58\x1e\xbd\x39\xe9\x57\x9f\x23\xa2\x54\x90\x08\x51\x3a\xf3\xa7\xf5\xb2\xaf\xdc\x50\x2a\xa8\x66\x24\x6c\xdc\x6d\xb7\x61\xce\x4a\x3d\x60\x05\xe7\xa3\xcd\x83\x0a\x95\x39\x00\xfe\xa9\x6c\x7f\x14\xcd\x1b\x74\x76\x70\xfc\x98\x02\x52\x2f\x3d\xb1\xc0\x40\x04\xf4\xf8\x05\x0a\x93\x79\x68\xc5\x43\x51\x22\xc0\xe8\x92\x3a\xd1\x8d\x95\x91\x44\x0f\x1c\x23\xeb\xeb\xf8\xcd\xeb\x73\x25\xa9\xa5\x21\x41\xd7\x3d\x64\xc3\x27\x65\xb3\x7f\x4c\x2e\xc6\x39\xae\x0e\x5d\xdd\x14\xaf\x8b\xba\x57\x9f\xfb\x8b\x6b\xa9\x34\x75\xa4\xd6\x81\x7e\xc0\x76\xf0\xd3\x3f\xfc\x33\x6b\xae\x30\x7f\xeb\xd4\x73\xab\x72\x59\xd7\xd5\x88\x72\x9b\x52\x9d\x51\x74\xcc\x6e\x4e\x5a\xfb\x0a\x1d\xa5\x5a\x0b\xa4\x52\x54\x6f\x55\xd5\xc0\x68\xcb\xee\x47\x48\x37\xe1\x77\x50\xa2\xe2\x52\xe7\x9d\xde\x9c\x37\xb0\x9f\xd2\x64\x51\x0a\x89\xe5\x68\x5f\x95\xcd\xa9\xee\xd1\x71\x94\x42\x96\x29\x8f\x4c\xea\xa2\x82\xdf\xab\x7a\x73\x52\x3d\x92\x9f\x52\x93\xa7\xcc\xaa\x8e\xd5\x08\xd0\x18\xb7\x14\x4f\xdf\xcb\xd7\xaa\xcc\x94\x1a\x60\xb9\xf1\xbc\x1a\xa2\xbc\xc8\xa9\x53\x16\x81\xd4\x56\x23\xc7\xd4\x55\xd3\xde\x22\x9d\xf2\x68\x1d\x31\x92\xa6\x98\xa1\x3e\x14\x65\x71\x27\x0e\xe0\xd1\x9a\x94\x91\x3c\x91\x4e\x43\x75\x76\xb3\xba\x10\x28\xe9\x03\x62\xca\xe2\x88\x6b\xea\x77\x47\x55\xd5\xfa\x2b\x32\x27\x37\x3e\x01\x26\xdc\x5e\xeb\x56\x2c\xb2\x1d\x56\x35\x1a\x86\x91\x35\x62\x09\x80\x61\xa3\x4d\xe9\xfa\x6e\xca\x38\x55\xd8\x56\x38\x7f\x5a\x3d\xee\x36\x2f\xcf\xcf\xf7\x7f\xec\xb6\x4f\xdb\xd9\x7d\x18\x90\xe4\xb6\xf9\xf9\x22\x59\xf3\x6b\x6f\x8b\xf1\x34\x92\x74\x92\xea\x70\x1c\xbe\xfe\xdc\x29\x73\x04\xbf\xf6\x16\x77\xd8\x8a\xbc\xd3\xc5\xc7\xdb\x80\x96\x8a\xb2\x34\xe1\xb1\x55\xf7\x5d\x54\x47\x58\x8b\x2e\xe4\xb0\xf0\x4d\xd5\x36\xbd\xbc\x02\x65\xb9\x21\x88\xa8\x6a\xeb\xe2\xf5\x15\xea\x4d\x65\xda\x50\x33\xa4\x4c\x8a\xc4\x53\x4e\xec\x6f\x84\x7a\xbf\x13\xcd\x28\xf4\x63\x9a\x5a\x95\xf1\x87\xa2\x14\xfa\x42\x03\x2d\x0c\x92\x5e\xfe\x61\x0d\xff\x7b\x2a\x6a\x6c\x4d\xb9\x92\x40\xa6\x4c\x27\x3c\xb1\x4d\xd2\x18\x23\x62\xea\x77\x62\x65\x98\x4e\xc0\xd5\xce\x3e\xaa\xfd\x07\xd4\x37\x85\x2a\xc2\xfd\xe4\x1c\x4d\xde\xb1\x86\xc5\x69\xb4\x5d\x33\x0d\x4a\x88\xd0\x1b\xe5\xcd\xdc\x24\x41\x46\x19\xc4\xb6\x55\xfe\xe6\x66\x98\xba\xa4\x0c\x8c\x49\x42\x2b\x71\xe3\x5f\x6c\x1d\x3c\x85\x38\x8a\xc0\x92\x4c\xa1\x49\x99\x9e\x37\x8e\x68\x86\x94\xc2\xf7\xc5\xff\x9e\x3a\x1b\x77\xa8\x54\x2d\xd4\xb9\x47\xaa\xdd\x0a\xd5\x56\x13\x48\x1c\x8d\x23\x65\xed\xf3\xfc\x69\xf9\xf8\xfb\xf0\x86\x62\x22\x0d\xf2\x33\x5e\x89\x3b\xe2\x98\x51\x44\x59\xbd\x9d\x0e\xa2\x2c\xda\xf3\x6d\x9f\x26\x89\x63\x69\xd9\x97\x4e\x65\x68\x07\xf5\xb8\xf6\xc9\xb5\x93\xce\x88\xf4\x5a\x0c\xf6\xab\x9e\x8e\x11\xb6\x3e\xb0\x40\x71\x97\xfd\xd9\xf5\x4d\x7c\x21\xf0\x42\xe3\x04\x64\xe4\xc0\xf8\x5d\x28\xec\x68\xb2\xaf\x8f\xe5\x2c\x42\x5f\xb8\x2d\xa0\xa6\xcb\xfe\x09\x78\x9c\x60\x8f\x0b\x0a\xd1\xee\x68\x17\xc4\x87\x43\x89\xc1\x0c\x16\x9a\xd6\x22\x94\x1b\xff\xa2\xdf\x67\x7a\xdd\x9c\x25\xcc\xef\xdc\xee\x81\x90\x4f\xb9\x15\x5e\xd1\x9b\xc6\xa9\x62\x59\x4f\x21\x33\x7f\x43\x3e\xcb\xd7\xcb\x30\x28\xf6\x5c\xff\x58\xba\xba\xad\xea\x6b\x8a\x9d\x7e\xa8\xe1\x58\x87\x0e\xa2\x0a\x97\x9c\xb6\x34\xce\xb8\x8e\xe9\x90\x2b\x7a\xf4\x45\xc6\x99\x32\x88\xdc\xdc\xe9\xca\xa6\xe3\x86\xdd\x8e\x34\xce\x34\x97\x21\xff\x2a\xd4\x1e\x42\x95\x74\x72\x15\xa3\x91\xf4\x71\x73\x3f\xf7\x3f\xcd\x09\x63\xb6\xeb\x49\xbd\x07\x54\x83\x3f\x46\x6d\xb3\xec\xb1\x86\x95\xaa\x06\xf0\x6f\x1a\xe7\x3c\x56\x2c\x48\x93\xab\xaa\xbe\x5a\x4c\xa6\x71\x2e\x12\x44\x44\xbe\x94\x47\x71\x6a\x9c\xfb\xe0\x8e\x89\x4c\xe2\x39\x1e\xce\xc8\xf8\x63\xb3\xe4\xf0\x19\x0e\x4b\xab\x85\xb4\xb3\x8c\x45\xc8\x3b\x6d\x9b\xe0\x26\xef\x42\x68\x85\xdf\x68\xe8\xf5\xf4\xdf\xf1\xdc\xf5\x28\xea\xc9\x34\x08\x48\x10\x2d\x5b\xaf\x16\x3b\x7f\x35\x29\x2c\x44\xe2\x20\x7e\xae\x0e\x56\x43\xd4\x1f\x91\x09\xae\x09\x0b\x94\x2d\xca\xd7\xf1\xdc\x4b\x69\xc5\x96\x1b\x68\xe7\x37\x62\xec\x41\x5d\x2d\xff\xd0\x58\x6a\x0b\x75\x1a\xe5\x18\x86\xab\x76\x1a\xbd\xc5\x8a\x69\xdb\xb1\x73\x10\xaf\xf0\x72\xdc\x57\x42\xfb\x87\x9b\x4c\x86\x4a\xac\x3e\xed\xcb\x66\x51\xed\xf7\xa2\x0e\x8f\xa1\x54\x24\xd0\xd4\x81\x38\xd8\x5c\xc9\xac\x1d\x75\x7c\xbb\x71\x3a\xb6\xa8\xdb\x97\xcd\x4d\xcf\x29\x47\x63\xad\xb9\xc8\x87\xd4\x27\x88\x76\xbb\x39\xe3\x6b\x71\x1a\x68\x24\x9c\x03\xac\xe2\x25\x52\xae\x1a\xa1\x20\xa8\x96\xec\x2c\x3e\xce\xa6\xa8\x7d\xe3\x58\xf7\x03\xdb\x19\xb9\x73\xcc\x98\xbf\x84\xeb\xd0\x18\x98\x64\x81\x13\x11\x44\x5d\x42\xff\x9c\xa0\x34\xde\xe8\x66\x0f\x10\xbe\x6b\x13\x11\x14\x32\xd0\xd5\xa6\xf5\x24\x8c\x34\x89\x28\xe1\xb9\xdb\x99\xe7\xdd\x6c\xb5\x50\x5f\xaa\x24\x84\xc1\xc6\xc3\xb7\xbb\xa8\x69\x51\xbc\x42\xd3\x8e\xbc\xc7\x24\x92\x46\xf4\x39\xef\x41\x25\xae\xc7\x12\x8c\x57\x42\x42\x22\xa2\x93\x41\xda\x00\x19\x22\xfc\xed\x11\x6a\xb7\xbd\xe6\xad\x30\xed\x6e\x0f\xe6\x1a\x0d\x0c\x4d\x88\x00\x0c\x13\x0b\x55\x3d\x77\x5f\x2f\xeb\x8d\x6a\x42\xf3\xc4\x8c\xa8\x4b\x61\x6e\x19\xbe\x0b\xb9\x87\x66\xd2\xfd\x42\x13\xaa\x08\x72\xbc\x56\x3d\x8d\xc1\xf0\x64\x9a\x27\x24\x44\x6e\xf0\x8a\xd9\xc9\x79\xb5\xef\xdb\x23\x7d\x5a\x27\x61\x24\xf5\x08\x4a\x2b\xb8\x37\x9e\x4b\xc6\x38\xf2\x3e\x60\x96\x70\xfe\x26\xf6\x7b\x28\x5f\x27\x81\x68\x12\x0b\x8d\x5b\xe1\xf3\x7a\xf5\x7d\xb6\x75\x5a\x03\xcf\x4f\x4f\xde\x23\x4b\x62\x65\x32\xe7\x62\x76\xbe\xe7\xb7\xaa\xb9\x1e\xc1\x74\x5e\x93\xd7\x99\xf6\x9c\xb4\x7e\xb9\x24\x3c\xd3\x58\xa7\x38\x14\xe5\x4e\x9e\xce\x3b\x39\x48\x53\x24\x29\x51\x9e\x8d\x65\x5b\x69\x71\xc6\x77\xd4\x0b\xe8\xd1\x24\xcd\x12\x64\x20\x3d\xda\xf8\x14\x55\xcf\x6b\xbd\xd2\x6b\x51\xbe\x86\x41\x19\x91\xb8\xe3\xcd\x4f\x52\x88\x3f\x07\xb1\x5f\x92\xf1\x0c\x49\x6a\x34\x7c\x58\xe6\x74\x9b\xd8\xbb\x70\x30\xc7\xb3\x97\xe9\x04\x7b\x00\x1a\xf1\x61\x79\x55\xfc\xe9\xf2\xcc\x22\xf1\x9c\x8c\x8d\xd7\x16\x19\x55\x6d\x92\x3c\xcf\x91\xaf\xfb\xd4\x40\xb3\x7d\x83\x83\xff\xb1\xe0\x56\x5a\xc3\x14\x3f\xe7\x38\x07\x43\x97\xdd\x11\x4c\xd3\x44\x68\x61\xe8\x00\x93\x3f\x2d\x13\xd3\x44\x72\x8e\x59\xdc\xfb\xd3\xcf\x80\x79\xa6\x89\xcc\x00\x9b\x00\x76\x35\x68\x80\xc3\xcd\xb9\xf3\x80\x31\x93\x74\x21\xb7\x74\x3d\x88\x19\x04\x0c\x89\x54\x2c\x95\x3d\x8d\x6e\x20\xfb\x6d\x10\x23\x43\x28\xd6\x37\xc3\x1b\x96\xa0\xb0\x4c\xd5\xbc\x55\x9f\x5d\x4c\x68\x19\x6d\xc6\x2b\x44\x49\x49\xd9\x80\x85\xe3\x3e\x00\xa5\x1b\x98\xae\x26\xa5\x62\x24\x27\x90\xa2\x81\x85\xdb\x8e\xfd\xb5\x94\x51\x31\x1f\x64\x56\xff\x0b\xea\xea\xdf\x27\x51\xb6\x53\xb5\x5e\x9a\x18\xa5\xac\x90\x12\x88\x3d\xd4\x3b\xe5\x29\xa2\x69\x62\x20\x47\xa6\x3e\xe7\x84\x7c\x49\x28\xf2\xcb\x88\x98\x47\x26\xc1\xd0\x6c\xb9\xfd\xb6\x7b\xd9\xf8\x0c\x26\x27\x54\x71\xd7\x2b\x53\x57\xe5\xf6\xb3\x1a\xa8\xce\xfb\x21\xb1\x5d\x46\x37\x8f\xdb\xdd\xfc\xe9\xf1\xfb\x72\xbd\x0d\xe5\x25\x4e\x94\x55\x7d\xc3\x0c\x28\x72\x67\xf9\x23\x94\x33\x95\x0c\x41\x25\xcb\xf6\x6d\x5b\xa1\x0f\xa5\x06\x0a\x27\x6e\x34\x8b\x6d\x54\x84\xdf\x5b\xe4\xcf\x11\x27\x36\xfe\x46\xa0\x9b\xb1\x3c\x8a\x08\x95\xd9\x95\x15\x42\x24\x50\xa7\xb4\x15\xef\xfe\xe3\xe2\x1c\x08\xe6\xd2\xef\x0e\xe1\x46\xd2\x18\x72\xe6\x8d\x0f\x1c\x3d\xed\xd8\xa8\x7f\xeb\xfa\x9c\xa5\x5c\x63\x87\xd8\x7a\xf6\x78\xb7\x5c\x3e\x2e\x76\x59\x38\x67\xce\x71\xc9\x21\xdc\x69\x24\x6c\xe5\x6a\xdd\x03\xc4\xd4\x65\x9a\x9b\xa7\xca\xf6\x93\x05\xb9\x35\x9f\xae\xe4\x99\x88\x6c\x02\xbc\x7b\xa8\xcd\x62\xfe\xeb\x9d\x8f\x67\x90\xd3\x9e\xbe\xe0\xae\x37\x45\x3c\x8f\xa9\x15\x59\x05\x94\x10\x7c\xb6\xdd\x1f\x78\x8b\xab\xa6\x39\x75\x77\xdb\xf6\xef\x38\x8f\xad\xbc\xca\x5e\x34\xad\x65\x27\xc3\xfc\xec\x28\xab\xc1\xf3\x04\xb0\xe3\xd2\xe9\x22\x5c\x05\x29\x50\x9e\xa7\xc6\x93\x2e\x85\x74\x2c\x09\xcf\x97\x0b\x40\xdb\xdb\x5a\x41\xed\x79\x5f\x4d\x0c\x23\x4c\x6e\x3c\x73\xb6\x4d\x21\x5c\x26\xe4\x9c\x43\xe4\xcd\x10\x17\x11\x10\x47\x20\xbc\xe9\x76\xa1\xa5\x31\x9e\x25\x6d\x54\x81\xf1\xc3\x63\x82\x59\x3b\xa1\x5a\x4c\x0a\x5b\xa5\xa9\xeb\xfe\x3a\x97\x24\x42\x6d\x07\xd9\xf7\xe8\x78\x2e\xc9\xc9\x40\x48\x10\xf7\x82\x5e\xc8\x30\x8a\xe3\x2a\xb2\xe9\xed\xa6\xf5\x84\x1d\x7d\x5a\xfe\xfa\x7b\x55\x5c\x62\x21\x7a\xb9\x7d\xf2\x27\xd1\x11\x4b\x86\x52\x6e\x8b\x40\x46\x6d\x0d\x67\x33\x61\x56\xa0\x5c\xc7\x02\xdd\x22\xac\x6e\x24\xc9\xe4\x76\xb5\x33\xcc\xed\x1b\x2c\x84\x2f\x45\x72\x88\xb9\xab\x22\xd4\xa8\x0b\xd3\x59\xc8\x85\x38\x37\xe1\x78\x66\x34\xf3\xfa\x5c\xe5\xa9\x59\x88\x76\x22\x7c\x46\x39\x48\x70\x84\xd7\xaf\xaf\x7b\x70\x45\xf4\x80\xb9\xa5\xdc\xe4\x80\xe9\xf0\x60\x19\x1e\xc4\xcf\x65\xfb\x66\x97\x65\x18\xa4\x62\x7c\x5c\xe3\x92\xf5\xdb\x5a\xe8\x8b\x18\xf2\xd7\xa9\x16\x6e\xb4\x8d\xf1\x5e\x11\x46\x0a\x23\xb2\x16\x3b\x24\x8d\xe2\x44\xf6\x1d\x00\x16\xa5\xdd\xed\xe8\xe8\x0a\x6f\xab\xe9\x68\x99\xa2\x8b\xb1\x00\x59\xb8\x5a\xef\x78\xf5\xa7\x24\x16\xc4\xd3\xd9\xbd\x55\x25\x4c\x0f\x27\x09\x12\xeb\x29\xd1\x58\xc5\xb0\xc9\x3b\x4b\x29\x21\xd4\x7d\x3d\x08\x54\xdb\x14\xaf\x43\x6c\x21\x4d\x19\x89\xb8\xb0\xea\xe8\xd5\x09\xc9\xb0\xfb\x23\xc6\x58\xb2\xc9\x29\xd7\xe9\x2f\x67\x29\x65\x09\x27\xc3\x99\xd6\x73\x71\x2c\x7a\xdb\x90\xb2\xcc\x36\xb5\xa0\xab\x1f\xee\x23\x8e\x2d\x37\xe4\xb3\xd8\xef\xcf\x03\x27\x26\x8d\x05\xc3\x62\x75\x17\x58\x58\x3a\x88\x5d\x67\x4a\x76\xba\x5f\x45\x69\xac\x44\xec\x38\x96\x7e\x40\xf1\x0c\xf5\xcb\x66\x51\x94\xdb\xbb\xe5\x64\xbe\x13\x22\x10\x6a\xb8\xb9\xdd\xee\x9e\x97\xeb\x5d\xb7\x79\xdd\xae\xd6\x9b\xed\x6e\x39\x5b\xdf\xff\xb1\xbb\x59\xad\x17\xbb\xf5\x6c\xeb\x81\x16\x69\x12\xc7\x19\x78\xbb\xec\xf4\x2e\x47\x8b\x66\x30\xd5\x49\x9c\x20\xb9\xcb\x1c\xf6\x20\x1b\x6c\x55\xf1\xa7\xe1\x09\xc8\xb4\x87\xa7\x79\xbc\xcf\x97\xcb\x6f\xe8\xf6\xa7\x5c\x32\x2b\x55\xd5\x39\xfd\xc6\x27\x0d\x26\x0b\x21\x8d\x28\xe6\xc0\x4a\x00\xdd\xdc\x9e\x4a\x8c\x34\xc6\x0f\x9f\x32\x4b\x58\xb9\xad\x4f\x4d\xbb\x86\x26\x2c\xc6\xff\x66\xff\xf3\x55\x92\x23\x3c\x5c\x1a\xe7\xb8\x69\xa3\x5a\x74\xdf\x76\x42\xd3\x34\xb7\x6c\x6c\x47\x71\xee\x15\x65\x69\x9a\xa7\x80\xc4\x0d\x5a\x9c\x9f\xab\xf6\x5b\xf1\xfa\xd6\xa8\x3e\x83\x98\xe6\x39\xc5\xb8\xfd\xfb\xcb\xfd\x7c\xf6\xb8\x7b\x7e\x5a\xec\x1e\x66\xbf\xef\xe6\xb3\xb5\xef\x2f\xa6\xa9\x60\xd4\xd3\x49\xdd\xd8\x55\xbd\xd9\x17\xca\x2d\xf1\xc9\x9a\x13\x8c\x91\xee\xd9\xfe\xfd\x51\xed\x3d\xc1\xf3\x78\x82\x84\xb0\x59\x60\x79\x3a\xcf\xca\x4b\x17\x78\x54\x36\x18\xf4\x9f\xd0\x54\x68\x2b\x91\x65\xfb\xc9\x2c\x09\xda\x57\x25\x78\x27\x01\x89\x04\xbc\xff\x98\x7e\x8a\x92\x69\x44\xd9\xdf\x6c\xe7\xb3\x17\x9f\x20\x49\x15\x4d\x90\x31\xd0\xea\x5b\x35\x1f\xcd\x1c\xf6\x6d\xa1\x9a\xfe\xb8\x26\xae\xec\xb9\xfd\x3d\xfc\x91\xc5\x58\x04\xb3\x30\xaa\xcd\x49\x36\xaa\x2e\xe4\x74\xeb\x4c\x55\x46\x30\xcf\x06\xb5\xa2\x51\x00\xb7\x9d\xbf\x26\x62\xa3\xa9\xe6\xc6\xa7\xed\x77\x07\xc7\xe5\xf3\xc5\x50\xe0\xb1\x76\x39\xa5\x7f\x9f\xaa\x76\xfc\x5d\xf8\xad\x34\x05\x6e\x3d\x1b\xcf\xf7\xfb\x0b\x70\x44\x0a\x32\x71\x7c\x00\xed\x83\xf8\x39\xd4\x63\xc1\xc8\x73\xb2\x2f\xa4\x26\xb2\xfc\xf2\xb6\x85\xdd\x14\xaf\x3e\x79\x3b\x9e\x05\x43\xad\x20\xe9\x5d\x61\x10\xde\xaf\x2f\x4a\x11\xa9\x89\x53\x35\x04\x84\x76\x4e\x2b\xb2\x2b\x7d\x61\xe9\xc2\x3b\x35\x9a\x49\xe9\x28\x92\xe5\x94\x22\xd0\xa2\x64\xed\xc8\x2c\x62\x19\x15\x01\xc6\xff\xff\x61\xf7\xc9\x22\x4e\xf3\xe1\x4d\xee\x14\x72\x8e\x5c\x9d\xca\x2c\x92\x91\x1c\x38\x94\xaf\xa7\xbd\xa8\xc3\xa2\xff\xaa\xc3\x9c\x66\x2c\x4a\x88\xe3\x31\xc4\x4c\x5f\xf1\x27\xfc\xfb\x34\x11\x29\xa6\x19\x8b\x63\xc4\x6e\x7d\x16\xe5\x6b\xe3\x21\x23\x9d\xcf\xfa\x9b\x1f\x90\x69\x2f\x4d\x77\x2f\xfa\xb0\x79\x14\x80\x67\xcc\x41\xaa\xd0\xd5\x77\x2f\xd8\x1d\x8a\x33\xe3\x12\x30\x4e\x63\x96\x45\xe1\x90\xb0\xbc\x9e\xf0\x13\x99\xd0\xc3\x9f\x8d\xa6\x34\x68\x48\x9d\xe4\xbf\xe0\x3c\xb9\x5c\x12\x51\xc6\x26\xef\xd8\x2b\x08\x7e\x35\x8b\x89\xa0\x49\x3e\x66\x98\xef\x1e\xd6\xe1\x29\x9f\xca\x2f\x92\xd0\x59\xa2\x53\x64\x22\x7a\x5c\xae\xbd\x39\xcb\xb2\x88\x22\x45\x24\x94\x7a\xfb\x56\xd4\xfa\x07\xc0\x7b\x60\xc5\xa4\x59\x26\x38\x56\x33\x1f\xab\x56\x60\xd2\x62\x1a\xd2\x64\x99\xc8\x85\x15\x59\xfc\x89\x90\xee\xa1\x5c\x91\x1b\x92\x47\x96\x5f\x0c\x83\xcc\xe7\xba\xf8\x28\xf6\xf0\x3a\xaa\xd0\x67\x39\x91\x48\x66\x80\x1f\xb7\xe5\xdc\xb1\xfc\x0b\xae\xca\x72\xa1\x0c\x45\x33\x11\x11\xc4\x51\x36\x56\x0e\xf4\xa1\x28\xdb\x01\xac\x27\x93\xa9\x75\x79\x9a\xbd\x68\xde\x16\xd5\x67\x39\x69\xfc\xbc\x1e\x71\x87\xf7\xa2\xa8\x07\xa3\x55\x87\xc7\xcb\xf4\x6b\xa6\x68\x8a\x41\xd3\x62\x39\x2a\x65\x64\x2a\xe3\xdc\x21\xd2\x5c\xe9\xcd\x7a\x5b\xe8\xe4\x2f\x26\x27\xd1\x09\x78\x42\x81\x1f\x50\xbc\x34\xfa\x32\xe7\x9e\x69\xc1\x12\x67\x69\x77\x2d\xd4\x87\x6b\xb5\xa6\x4c\x6b\x91\x21\x99\xc0\xe2\x6e\x74\x37\x90\x44\xd8\x20\x24\xeb\xea\x1d\xea\xc1\xc2\x84\x54\xa0\xb8\xd9\xae\x08\x3a\x93\x5e\x57\xe9\x62\x5e\x02\x36\x21\x03\x21\xb2\x0c\x4b\x12\x95\x42\xdd\xb3\x21\xac\x70\xfa\xef\xc8\xdc\x65\x00\x59\x6c\xdb\x13\x76\xda\x76\x9e\xed\x8e\x83\xac\x7b\x1e\x89\x08\x13\xb0\xb2\xd0\xcd\xce\xf6\x23\xec\xd4\xa0\x18\x90\x33\xca\xb0\x1b\xbf\xc0\x3c\x75\x08\xd7\x72\x96\x08\xef\xb7\xf9\xbd\xa4\x8b\x79\x37\xff\x0a\x03\x44\x8e\x6d\x2a\xdb\xf5\xd3\xe3\xf7\x51\x16\x3b\x67\xd2\x27\xb2\x30\x6c\xb4\x0e\x3a\xd4\x7d\xd5\x30\x67\xc6\xee\x73\x47\x71\xbe\x11\xbd\xe5\x75\x47\x63\x93\xa1\xf7\xde\x27\x1a\x6f\x8b\x52\x94\xaa\x10\xfb\xd9\x90\xd7\xef\x32\x36\xce\x13\xc5\x11\x53\xe5\xbf\xfb\x55\x0b\x87\x5f\x47\xc1\x79\xaa\x08\x57\x41\x84\xe3\x4a\xad\x2c\x4f\xb5\x34\x56\xc9\xae\x68\xda\x66\xc8\x0a\xe0\x06\x64\xc4\xca\xe2\x58\xa0\xf6\x98\xaa\x6e\xda\x00\xe6\x36\xcc\xff\xa6\xce\x75\xa0\xfe\xd6\xb3\x24\x43\xac\xcc\xf7\xcd\x76\x76\x95\x1e\x62\x72\xcd\x44\x22\x97\xf9\x23\xc8\xd3\xbe\x18\x2e\xcf\x3c\xe3\x80\x99\xd7\xb9\x28\x07\x0c\x1a\x23\xe4\x47\x9e\xa5\x4c\xf6\x74\x14\xee\x23\x9e\x35\xcf\xe2\x0c\x18\xc8\x8c\x32\x10\xfd\x7f\x05\xb7\x67\x3a\xa7\xc3\x2d\x23\xcf\x94\x65\xb1\x3b\x35\x7a\xf0\xd2\x73\x61\x09\x0e\x6d\x2a\xea\xb7\xd1\xd3\xe4\x26\x53\xc6\xb1\x8b\x4d\x26\x57\xe4\x36\xb7\xd5\x79\x94\x5b\x10\x87\x17\x57\x9d\x0d\x80\xbd\x5c\x68\x82\x39\xcc\x2e\x0c\x53\xd0\x38\x55\x1c\x7f\x10\x0c\x66\x4b\xfe\xdd\x9d\xf5\x8a\xaf\x98\x4b\x6e\x49\x23\x9e\xeb\xf3\x9f\x23\xeb\x99\xcb\x5c\x61\x93\x51\x2b\xde\xc1\x41\x92\xbf\x56\xf1\xa1\xb9\x54\x13\x32\xf2\x67\x8c\xb2\x26\x8f\x23\x4d\x8e\xed\xc7\x0e\x17\x59\x94\x0f\xe2\xe7\x0d\xb4\x5f\xb3\x45\xd3\x5c\x11\x89\xb9\x01\x57\x7a\x5f\x83\x50\x81\xcf\x8f\xe6\x8a\x59\xb1\xee\x6f\x9b\xcd\x5b\x75\xdc\x88\x3d\xf4\x06\x29\x57\x8e\x84\xdf\x89\x61\x14\x87\x01\xed\xc4\xe4\x2a\x3a\x32\xd4\xb8\xd0\x2b\x9c\x5c\xe7\xcc\x75\xf4\x1d\x90\x7d\xbe\x3a\x8c\x55\x55\x69\x0e\x59\x2e\xa2\x80\xfe\x59\x88\x62\xf2\xbc\x86\xc4\x48\x2e\xfc\x47\x35\xa5\x84\xa2\xb9\x89\x23\xea\x8c\x4c\x17\xcf\x3e\x9e\x0e\x93\x77\x63\x62\xc9\x9c\x3f\xd9\x36\xc3\x9c\x53\x6e\x64\xc2\xf4\xa0\x4b\x44\x56\xd5\xfb\x3d\x94\xaf\x21\x51\x20\xa2\x3c\x4e\x7b\xf6\x8d\x41\x03\x11\x15\x91\x4c\xb8\x87\xc6\xbc\x94\x4d\x88\x8f\x05\x89\x28\x4a\x52\xfc\xf1\xf2\xbc\x5a\x86\xa0\xd1\x8b\x13\x87\x51\xb1\x45\xfc\x35\xc2\xc0\x43\xf5\x05\xbe\x54\x30\xa2\x50\x6b\x46\x9f\x4b\x71\x28\x94\xbb\xb9\x21\xf5\x97\x1f\xc8\x05\x12\x37\xa0\x6c\xb4\x1a\xa6\x80\x05\xcb\x8d\x71\xb5\x70\xcc\x5c\x5e\x91\x28\xa7\xa2\x0b\xa6\x2d\x5f\x5b\xb3\xfb\xa8\x82\xde\x2a\x15\x71\x2e\xb0\x71\x60\x58\x1a\x6c\x06\x0a\xe2\xd7\xf7\x14\x11\x4b\xca\xa2\x9e\x74\x14\xba\xed\xb3\x98\x24\x33\x44\x2c\x81\x39\xea\x3a\x7b\xde\x9b\xf3\xa5\xa0\x2b\x15\xb1\xd2\x98\xd1\x00\x0b\x3d\x9f\x92\x9e\x50\x91\x10\xc0\x05\xda\x2d\x2f\x4b\x67\x11\x59\x73\x17\xf9\x01\x14\xb4\x03\x00\xdb\xde\x4e\xd7\x8f\x46\x27\xd3\x9d\xe4\x02\x1b\x2f\xfb\x4d\xe3\xf9\x74\x3c\x62\x72\x61\x7e\x2f\xea\xd7\xa9\xa4\x32\x15\x89\x30\xb8\xb8\xcc\x40\x3e\x8e\x8a\x94\x2b\x70\x49\xd1\xfa\x04\x33\x8d\xdc\x8a\xcd\x44\x78\xe9\xaa\x01\x10\xa9\x4a\x30\x78\x2c\xe1\x67\x68\xd3\x5a\x88\x73\x4f\x45\xe5\xaf\x91\x45\x32\xb6\xf1\xfb\xa7\x35\x38\xce\xce\x8f\xe7\x2e\x4b\x63\x44\x8f\x5a\x04\xf1\xe2\xe9\x71\xb6\x5d\x3d\x3d\xee\xd6\x4f\x2f\x8f\x8b\x9d\xf7\x9e\x45\x9e\xc6\x48\x41\xda\xbd\xf9\x88\x3c\x56\x03\x49\x65\x2a\x44\x2e\x90\xf9\x12\x4a\x78\x6b\x07\xa6\x4d\x08\x29\xb1\x2b\x68\x83\x4a\x18\xc3\x03\x2a\xf3\xe0\xe7\x6f\x62\x8f\xa4\x9b\x03\x18\xa5\x10\x26\xca\x72\x2f\x11\x60\xbf\xac\x4b\xe7\x4a\x48\x42\x49\xcf\x78\xd6\x4d\x85\x45\x12\xf8\x8b\xc8\x4c\x61\x87\xf6\x5b\xf5\xf9\x10\x9a\xb4\xa8\x90\x32\xc1\xba\x8e\xdf\xbc\x91\xdb\x32\x14\xe2\x27\x2b\x4b\x6a\xc1\xf3\x20\xab\xd5\x34\xa7\xce\xf6\x2f\x40\x86\x67\x57\xdc\x2a\x0f\xd9\x9b\x70\x0e\xef\xbf\xfe\x98\x0f\x1f\x47\x89\x8c\xba\x0a\xd4\xe3\x95\x68\x52\x68\x62\x25\x50\xab\x23\xd4\xa2\xad\xea\x0d\x94\x5f\xe3\xe4\x2f\x6a\x4b\x42\xe7\x16\xf4\x66\x65\xf3\xb1\xab\xe3\xb7\xf1\x86\xf9\x8f\x09\x96\xcd\xff\x50\x83\x95\xa9\x39\x1d\x44\xe9\x13\x01\x02\x62\x8d\xe9\xbd\xa7\x9b\xd5\xc3\xd3\xfd\xd3\xdd\x6a\x16\x8e\x28\x2b\xb9\x61\xa5\xad\xab\xd2\x11\x58\xef\x6e\x5e\xee\xef\xc3\x18\x48\x90\x5e\x61\xb6\xf8\xbe\xda\x3c\xad\x77\x9b\x6f\xb3\x75\x30\x69\x46\xf3\xd8\x42\x9f\x8e\xa2\xf0\xcc\x95\x62\x5a\x46\x15\xc6\xc4\x96\x58\xbd\x3a\x1c\x0a\x87\xaa\xc6\xba\x0d\xe8\x1e\xfe\x32\xfa\x89\x8c\x32\x48\x9d\x35\xf9\x5e\x0d\x79\x63\xaf\x96\x57\x65\x24\x00\xdd\x9a\xa3\xf0\x55\x43\x77\x80\xc6\x04\x57\x9e\x47\xdb\x54\x37\xa2\x7c\x9f\x05\xdc\xd1\x61\x51\x18\x03\xb5\xeb\x6c\x83\x66\x24\x3a\x49\x25\xe5\x26\x4f\xfc\x04\xdd\x16\x8d\xdf\x25\x24\x93\x19\xeb\xcb\xec\xf3\xea\x74\x0c\x20\x5e\x37\x22\x8e\x62\xbc\xb0\x3c\x35\x45\x09\x4d\xf3\xbc\x17\x65\x09\xda\x3e\xbc\x6b\x89\x19\xe2\x7e\x64\x1c\xe5\xe8\x0d\x0a\xad\x2d\x28\x18\x49\x36\x9a\x4b\xaf\x35\x8c\xb7\x59\x18\x47\xda\x79\x1d\x22\x27\xe3\xc4\x92\x37\x79\xd6\x64\x74\xa9\x6f\xab\xfa\xb1\x3a\x14\x65\x33\x6b\x2f\x3f\x43\x19\x1b\x81\x0c\x72\x4b\x7d\xfa\x8f\x28\xab\xbf\xee\x54\x92\x09\x95\x08\x0d\xba\x9f\x2d\x46\xd8\x36\xc9\x85\xed\xe6\xc0\xf6\x3c\x3a\xb9\x0e\x17\x39\x06\xa2\x3b\xcc\x3f\xd0\x5d\xa1\x2a\x57\xed\xbf\x98\x1b\xae\x15\xa6\x58\xd7\xf0\xde\x8e\x2e\x90\x66\xd2\x29\x0b\x88\x83\xcb\x75\xb8\x23\x19\x53\xdc\x26\x37\xb0\x01\x68\xe6\x01\x9a\xfe\x78\xce\x05\x4e\x4c\x8b\xbe\x21\x52\x67\xf9\x1d\x50\x0a\xc2\x63\x4f\x5a\x7b\x6f\xe9\x90\x07\x9f\xbf\x14\xb1\x40\x8f\xf4\x88\x62\x86\x55\xd8\x5c\xa6\xdf\xa3\x14\x39\xcf\xec\xf7\xd5\x3f\xd1\xe9\x0b\xf5\xab\x61\x3e\x51\xca\x34\x61\x6c\x00\xc5\xda\x56\xcb\xce\x18\x6a\xa8\x7b\xaa\x36\x1c\x65\x91\x62\x0d\xd4\x1b\x50\x27\xec\x24\x1d\xbf\x7e\x95\x70\x8f\xdf\xf7\xad\xad\x93\x01\x9c\x79\xb5\xe2\x79\xf5\xe7\x79\xf6\x7a\x91\x53\x90\x4a\xd8\xe0\xfa\x33\x54\x69\x6f\x7f\x9f\x0c\xd1\x3c\xcb\xd5\xa0\x42\x33\x69\x5b\x70\xa3\x80\x11\x24\x07\x7f\xb0\x42\xf3\x5f\x82\xe7\x46\x6b\xab\x8b\x72\x91\x3c\xa1\xea\x89\xb9\xa9\x34\xdc\xe0\x1a\x3d\x80\x16\xfb\x05\xa8\xe2\xd0\xe3\x29\x54\x44\xa4\xe5\x94\x45\x63\xa6\xaa\xc3\x11\xca\xa6\xef\x91\xf7\x3e\x82\x8a\x78\x8a\x0e\x72\xf3\x09\x70\xfc\xf5\x26\xad\x22\x60\x98\x9d\xdf\x1c\xab\x13\xe2\xd5\x85\x1c\xb7\x35\xa8\xc8\x18\xe1\xbc\xd2\x05\xee\xa6\xa0\x6f\x44\x53\x28\x1b\xd7\xad\x16\xd7\xd7\x88\x22\xcc\x20\x3a\xb8\x0b\xfd\x37\x57\x4a\xec\x7e\x58\x1e\x71\x87\x66\xf9\x03\x44\xbd\x10\x93\x5a\xbe\x22\x42\x23\xd8\xf9\x5f\x45\xdb\x42\x39\x28\x8e\x28\x62\x98\x65\x86\xf8\x14\xc7\x29\xd2\xe1\xbf\x93\x3e\x18\xe6\x8e\x53\xe9\x2a\xf7\x08\x55\x34\x8e\x70\xb6\xb0\x5a\x3e\xe2\x8b\xf3\x03\x64\xaa\xdc\x04\x6c\xb7\x5b\x6f\x4f\x87\x2f\x53\x31\x96\xe0\x0e\x8e\xfd\xdd\x73\xb1\xdf\x4b\x71\x25\x81\x7a\xb1\x23\x2a\x96\x26\xf8\xba\xf7\x85\xac\x45\x7d\x26\x89\xf1\x3a\x5e\x7e\x80\xd6\x89\xe8\x85\x0b\x6f\xab\x7a\xd4\xc2\xab\x98\xd1\xd2\xa5\xfe\xf0\xd6\xad\x5f\x3f\x7e\xc0\x38\x8d\xb8\x63\x28\x9a\xd5\xb2\x68\x71\xeb\x26\xa2\xd4\xf4\xba\x6d\x55\x71\xe6\x6b\x8a\xc7\xdb\x42\xb4\xb3\x52\xf7\x4d\x36\x2a\xce\x2d\x77\x6a\x80\x5c\xde\x88\xe6\x1d\xda\xab\x60\x5c\x15\xab\x2c\x07\xdf\x08\xfb\x13\xcb\xab\xaa\x38\x8a\xb2\xbd\xf1\x79\xca\xf1\x54\x27\x2e\xab\xfd\xfb\x1f\xdb\x57\x11\xd6\x7d\xd2\x6d\xe8\xce\xcb\x6a\xdf\xb6\x95\xe7\x38\x46\xc3\xf1\xcd\x53\x33\x11\x6a\x6d\x0d\xa1\x99\xff\x9d\x8a\x98\xeb\x1c\x90\xe3\xae\xf6\x30\x80\x26\xf1\x40\x49\xe1\x54\x6a\xa8\x7d\xa9\xf0\xea\x86\xac\x38\xb3\x8e\xfe\x63\xd5\xf6\xad\x4f\xd7\x17\x16\x4f\xbc\x22\x75\xe7\xcd\x77\x11\x5d\x3d\x68\xd7\xf3\x83\x24\x80\x95\xe9\x39\x9d\xbf\x4a\x1a\xba\xa1\x69\x66\x51\x27\xaf\x3e\xe5\x7f\xa9\x90\x4a\x55\x0a\xb9\x4b\xdf\x88\xf6\xad\xb3\x2c\x3b\x43\xb8\x9f\xc8\xd4\x08\xc4\x01\xef\x2d\x54\xa7\x1e\xf0\x16\x53\x95\x27\xc2\x33\x18\x3d\x88\x9f\xdb\x42\xbd\x43\x00\x6a\xaa\x3c\x07\x94\x36\xdb\x5d\x94\xef\x26\x3d\x27\x7e\xbc\x16\x9c\xfa\xf2\xc4\xe1\xd8\xc2\x8e\x8c\xbf\x18\x61\x62\x3c\xe1\xdd\x62\x3e\x53\x2a\xf2\xed\x5d\x4a\x12\x81\xe1\xfb\x48\x1a\xe5\x9b\x68\xde\x2e\xb0\x4c\xbf\xfa\xa6\xb5\xce\xd0\x22\x07\xe5\x5a\x8b\x90\xb4\xd3\x9f\x0d\x73\xff\x97\xff\xe5\x4e\x01\x51\x8a\x30\x88\x23\x8a\x39\x78\xc9\x11\x7f\x9b\x90\x46\xb1\xed\xe5\xdf\x57\x42\x7b\xa9\xb6\x2f\x6c\x1c\x40\x2a\x1c\x0e\xc5\x98\x55\x69\x3c\x40\x40\x99\xc8\x2a\x14\x76\x01\xbf\x23\xf0\x09\x33\x6e\x92\x58\x65\x5e\x3a\xc7\x51\xeb\xdb\x5c\xd9\x3f\xae\xc0\x59\x7d\xc9\x49\x47\x34\xd2\x4e\x95\xf5\x3b\xd4\x43\x55\xc4\x2b\x34\xd7\x14\x79\x34\x51\x08\xe3\xf7\xef\xf3\x0d\xb6\x85\x8f\xd3\xad\x57\x57\xa2\x8e\x12\x95\xf6\xb4\x4c\x96\xd1\xc5\x1f\x12\x26\x75\x1c\xe0\xbb\x9b\xf9\xe2\x66\xa7\xc6\x49\x0e\x1d\x29\xdb\x86\x68\x1b\x5c\xd7\x5d\x2c\x17\x25\x9e\x86\x7f\x77\xf3\xf4\xe8\x49\xa5\xa9\x26\x29\xc7\x96\x9d\x10\x54\x5f\x15\xb4\xa6\x9a\x68\xbb\x66\x1a\x68\x5f\xca\xca\x20\xb0\x64\x3f\x48\x1f\x74\xef\xff\xe5\x78\x0b\x93\xcf\x5f\x13\x03\x98\x10\x10\x5a\xdf\xc3\x6b\xd1\x2e\xe0\xe3\xea\x47\xaf\x29\xe1\xd8\x43\x2f\xdf\xc5\x08\x82\xad\x69\xcc\x85\xf3\x32\x6e\xa0\x6d\x1e\xc4\xd8\xcf\xd6\x54\x31\x84\x4b\xdd\x41\xf9\x5e\xb8\x9c\x59\xf8\x2d\x28\x99\x87\x82\x1f\x52\x94\x4d\xee\x8f\xa5\xf6\x83\x37\xa7\xbd\xc5\xc0\x8c\xd0\x0b\x9a\xc9\x04\x41\x61\x07\xf1\x73\x76\x18\x42\xda\x75\x92\x48\x04\xa2\x7d\x7f\xda\xae\x1e\xef\x76\xdb\xd5\xc3\x72\xf3\x3c\x7b\x0c\x87\x53\x8e\xc5\xa7\x23\xfa\xec\xab\xed\xd3\xee\x20\x8a\x6e\x75\xaf\xca\x1e\xcd\xa6\x93\x3c\x42\x80\x26\xaa\xfb\x5c\xad\x5c\x8e\x97\x52\x22\x6c\x7a\xb0\x06\xd9\x7d\xb7\x25\xdc\x42\xf9\x67\xe1\x41\xe0\x9a\xcb\xd4\xb2\xe0\x86\x60\xea\xc9\xac\x45\xd1\x80\x93\x0a\xd9\xbe\x89\x76\x8d\xa4\x46\xcd\x6a\x9a\x19\xd3\x29\xb5\x49\xe9\x53\x39\xe2\xfa\x9c\x74\x3b\xe9\x94\x2a\xe4\x69\x5a\x57\x7f\x56\x9f\xef\x62\x3e\x80\xc6\x5d\x5d\xfd\x29\x03\xab\xf2\xd8\xd9\x42\xdf\x51\xeb\xaf\x99\x93\x0c\xfb\x57\x34\xec\xaf\xb4\x3b\xea\x9c\x25\xd4\xe5\xa2\x6e\x42\xdd\x63\xfc\xfe\x72\xce\x55\xaf\x66\x3f\xa5\x08\xf7\x83\x94\x15\xf4\x5c\xcd\x9f\x96\xbd\x88\x22\xd5\x52\x25\x58\x1a\x5a\xc0\x87\x5d\xfc\x13\x2a\xae\xab\x5b\xb7\x96\xda\xa0\x0b\xef\x9c\xe2\xa1\x23\xa7\xa5\xa1\xde\xd5\x0a\xb9\x2f\x8b\x71\x1d\xdf\xb6\x8a\x08\x3a\xe9\xdf\x56\x77\xdf\x96\x6b\xd7\x83\xbe\x5e\x6e\x96\xdb\x81\x5a\x86\x3f\xa9\xe2\x40\xc9\x50\x4f\xa3\x1b\x1d\x0e\xe6\x0a\xe3\xf6\x75\x75\xda\x43\x3b\x0d\xc8\xb4\x4e\x63\xec\x9b\x6e\xab\x97\xe3\x11\xc6\xed\x82\x5a\xe7\x2a\x0d\x2e\xd5\x8f\xa2\x7c\xac\x64\xe5\x84\x93\xc2\xe7\x05\x59\x4a\xc0\xbf\xbf\x1b\x81\xcc\xff\xa3\x93\x98\x44\x22\xc9\xcf\xcd\x22\x1a\x4e\x05\x44\x09\x49\x5d\x2f\xf4\x43\x85\x00\xc6\x9b\xf1\x6b\x01\xa2\x01\x53\x45\x88\x96\x3c\x56\x7b\x51\x23\xcf\xc8\xaa\xb4\x6d\xa4\xfe\x44\x94\x59\x9a\xa1\xc7\xd9\x83\xed\x6a\x9f\x7d\x9f\xad\xee\x67\x37\x21\x3b\x0a\x94\x5b\x7b\xb7\xaf\x44\xd9\x37\x4d\x5c\xdd\x28\x80\x66\x06\x6f\xb7\x5b\x30\x25\xec\x1f\x2a\x7d\x72\x8e\xb3\xb7\xef\x40\x85\x4d\x61\xc9\x53\x7d\x95\x6b\x63\x70\x32\x1d\x69\x5f\xd2\x33\x95\xdf\x73\x20\x16\x76\xcd\xab\x53\xd3\x56\x07\x9f\xb5\xfa\x75\x94\x00\x09\x8b\x7d\x1b\x21\x62\x19\xd1\x99\xaa\xaf\x94\x0f\x20\x91\x04\x41\xcc\xbb\xea\xf3\xaf\x12\x84\xc0\xf3\x0c\x73\xe1\x6b\x50\xc5\xb1\x80\xb2\x9d\xc8\x7a\x8f\xd7\x36\x2a\x3c\xa5\x36\xa5\x89\x30\x9e\x05\xa2\x7b\x27\xd7\x4f\x79\x44\x6c\xa1\xb8\x14\xaf\x57\x0a\xba\x90\xa6\x51\x0a\x43\xff\xf5\x8a\xfc\xe0\xa0\x1a\x09\xa9\x14\x96\xd6\xb6\x2a\x9b\xd3\x01\x7b\x2b\x9e\xab\xa2\x17\x58\xa0\x90\xb1\x0c\x4c\xe0\x44\xba\x09\x06\x1a\xb2\x8c\xe0\xee\x50\xc2\xcf\x76\x5b\x9d\xea\x52\x74\xf7\x33\x50\xf6\xe8\x86\x64\x58\x1b\xdc\x6c\xd7\xab\x7f\x8d\xbf\x1e\xc8\x64\x1e\x5b\xeb\x04\xc7\xa7\x12\xee\x2b\xf5\xee\x29\x47\xfc\x08\xc8\xd0\x44\xdb\x77\x68\x85\xff\xbf\x2e\x9c\x80\xc8\x28\x56\x2f\x64\xa1\x27\x3b\x1c\xc8\x28\xb2\x38\xab\x2f\x21\xe4\x57\xec\x2d\x48\x66\x05\x38\x55\x98\x0b\xd9\x79\xfc\xd8\x46\x69\x1b\x2d\x41\xef\x2c\xb8\xae\x09\x23\x92\xd4\xf3\xf9\x05\x48\x2b\x63\xa3\xcf\x16\x24\xd7\x96\x4b\xca\x19\x7b\x07\x07\x0e\xa7\x10\x09\x36\x25\xe9\x0a\x9a\x97\x06\x73\xa2\xa3\xc2\xe6\xf8\xa9\xa5\xd2\xca\xc1\x3a\xd6\xed\x61\xda\xff\xea\x06\xa9\x0c\x12\xeb\x0a\x1c\x8a\x2e\xb4\x70\x45\xcb\xeb\x7d\xeb\xee\x37\x3a\x36\xc8\x05\xba\x19\x13\x3b\x00\x44\x51\x46\xa7\xdc\xfa\x42\xb5\xcd\x55\xe7\x02\x80\xd9\x86\xc5\x55\x69\xf6\xa7\xf1\x89\x62\x69\x75\xe5\x5e\x9e\xd6\xb3\xc7\xe5\xef\xe1\xef\xdc\x26\x3e\xed\x6b\xef\x9c\xe3\xb6\xba\xaf\x3e\x9f\xea\x6f\xc5\xeb\xdb\x64\xb9\x43\x2a\xad\x2e\x14\xba\xfb\xe2\x1d\xc6\x57\xc8\x29\x52\xa5\x9e\x7e\xed\x36\xb9\xd1\x26\x02\x3e\x64\xc7\x76\x38\xe8\x69\x25\x01\x0c\x31\x48\xb5\xaf\xba\x28\xa5\x3e\xb8\x96\x89\x70\x96\x34\x65\x99\xcf\x3d\xee\x0e\x55\x09\xe7\x1d\x86\xcb\xf6\xb8\x89\x18\x45\x26\xb5\xa3\x38\xbb\x58\xf7\x6a\x82\xc1\x50\x9a\x63\xa1\x72\x37\x55\xa6\xbb\xc8\x44\x0f\xd7\x96\x61\xa0\x91\x61\xe6\xb9\xfa\x84\x1a\xfb\x07\x4e\x87\x41\x56\xc1\x30\x03\xe8\x11\x17\xb8\xb4\x6e\x6c\x71\xf5\xe6\x7c\x7d\xdd\x98\x38\xd6\xc8\x02\xbf\x10\xfa\x1c\x20\x99\x26\x06\x8d\x8f\x50\x34\xb3\xa0\xae\x39\x8e\xd3\x3a\xef\x9e\x64\x21\x38\x9c\x39\x14\x38\x22\xca\x4b\x47\x86\x3d\xbe\x52\x92\x1a\x24\xa7\xbe\x3b\xe9\x2d\x34\x9e\xaf\xad\xad\x6e\xfd\x45\x13\x41\xd1\x50\xf9\xe9\x70\x71\xf2\xf4\xed\x98\x44\x88\xd8\xcb\x20\x17\xb5\xae\xab\xe3\x2a\x70\x20\x99\x44\x51\x70\x38\x9b\x2b\x10\x34\x3f\x08\xac\x4e\x93\xd0\x7a\xd7\x56\x3b\x69\x11\xdf\xee\x20\x8f\x72\x8c\xa9\x77\x35\xcc\xb0\xca\x3a\x55\xbe\xa2\x86\x33\x85\x6f\x6e\x29\xea\xf6\xed\x01\xf4\x9f\xe1\x40\x1e\x0d\xd4\x18\xbf\x8b\xd3\xbe\x0d\x87\x94\x49\x8d\x6f\x89\xf6\x56\xc1\x6e\x90\xb3\x89\x89\x37\x39\x01\x84\xfe\xcd\xca\x73\xfb\x56\x94\xaf\xb3\xe3\x71\xb8\xea\x4d\x4e\x53\x1d\x7b\x0a\x07\x04\x7e\x87\xc6\xf5\x5b\x80\x45\x61\xf5\xc3\xfc\x60\x6e\x54\x10\x82\x77\xe4\x78\x33\xa5\xaa\x5a\x17\xe5\xeb\xb6\x5a\x0b\xcb\x3b\xe6\x96\xda\xe8\x1f\x77\x06\x19\xe5\x32\x74\x73\x9b\x05\x34\x6a\xe2\x71\x19\x19\x19\xa4\xce\x39\x74\x37\x01\xcd\x6e\xfb\xb4\xfb\x36\xdb\xce\xbf\xed\xc8\xba\x50\xef\xb3\x52\x3f\x54\x3d\xa0\xd6\x48\x6e\xc0\x07\xea\x55\x39\x74\x86\xfd\x80\x9c\xe7\x76\xa3\x34\xc6\x6b\x74\x5c\x35\x61\x46\x91\xd4\x62\xd5\x44\x83\x1b\x87\xc7\xbd\xf9\x4b\x29\xc1\x90\x2b\xf6\xe0\xc1\x02\x37\xa7\xfd\xfb\xd7\x78\x13\xa3\x85\x21\x3d\x36\xd3\xb2\x1b\xa3\x57\x36\xf4\x61\x8c\x86\x18\x3f\x9a\xfb\xea\xf5\x2f\xba\x9f\x0d\x30\xe9\xeb\x6f\xcb\x52\x3f\x19\x6f\x72\x26\xa3\x54\x42\x7a\xee\xa2\x90\x93\x46\x06\x65\xea\x9f\x05\x8c\x61\x96\x72\xc1\x6a\x3d\xd4\x83\xee\x12\x37\xc4\x48\x82\x65\x91\xf5\xf2\x76\xb9\x5e\xcf\xee\x77\xeb\xe5\x8f\xd9\x7a\x71\xe9\xf6\x1a\x23\x99\xb4\x1f\xdb\x09\x42\xcc\xc4\xa2\x88\x13\x33\xcc\x6f\x37\x41\x01\x0a\xfc\x37\xc6\xa2\x48\xa5\xb8\xd7\x22\xe7\x07\xfa\xdf\xd7\x9e\x9d\x45\x24\xb3\x64\xd0\x07\xa7\x94\xdf\x6c\xab\x5e\x59\x94\x45\x8c\x9b\x8c\x0f\x2b\x7e\xa0\x97\xa2\xde\x9f\x47\x63\x52\x19\x29\x6b\x4b\x01\xc6\x79\x4d\x16\xc5\x8c\x61\x78\x29\xa1\x6d\x50\x1a\xdb\x43\x48\x58\x14\x1b\x81\x73\xb5\x1d\x42\xd9\xbe\xaa\x93\xb0\x28\xa1\x3a\x1b\x32\x34\x5d\x51\x1e\x63\x51\x92\x68\x6c\xd5\x43\x46\xd4\x1e\x43\xc7\xa2\x44\x47\x24\x1a\xec\xf6\x5b\x10\x87\x49\x09\x38\x94\x07\xbd\x5f\xc6\x22\xce\x63\x36\x82\x97\xa0\xb9\x98\x3e\x23\xcf\x05\xb6\x30\x89\xa6\x29\x5e\x4b\xfa\xc5\x4c\xa7\x39\xc3\xda\xe8\x1e\x41\x09\x4f\x66\x5e\x1d\x0e\x55\xf9\x5c\x83\x29\x7e\xfe\x36\xcd\xda\xb2\x28\xe3\x12\xc1\x72\xc2\xb4\x81\x00\x62\x4c\x9e\xc0\xa2\x2c\xe5\x18\x18\xdc\x57\xaf\x96\xe0\x69\xa0\x99\xe4\x87\x08\xbb\x9d\x5a\x57\xb5\x6e\x06\xa5\x6a\x16\xe5\x34\xa6\xae\xf2\xd0\xed\x43\xdf\xc4\x64\xd2\x44\x6e\x90\x77\xfb\xa3\x80\xcf\x07\x38\x54\xf5\x79\xf2\xe4\x52\x48\xf4\x0d\x83\x38\xc9\x20\xfb\x3a\xb9\x11\x29\x2c\xf7\x9c\xf5\xd4\x7e\x14\xed\xdb\x34\x96\x65\x91\x54\x1a\xc7\x74\xfb\xbe\x65\x69\x41\x97\xeb\x4a\xe4\xc1\x22\x15\x91\xc8\x45\x1e\x4b\x27\xdd\x31\xc9\x7b\xb2\x48\x69\x82\x28\x8d\xba\xa7\xc8\x43\x59\x79\xac\xb2\xfa\x31\x20\xb0\x3a\xd6\x9c\xe4\xa1\x68\x43\x16\xef\xca\x1b\xd1\x91\x25\x31\xc7\x8e\x59\xdf\x6a\xff\x75\x69\x7a\x7c\xbb\x3a\x66\x98\x5e\x5e\x54\x75\xb5\x28\xc4\xa1\xf2\xee\x39\x8b\xb4\xb4\x12\x5b\x68\xba\x3b\x93\x66\xe5\xca\xe6\x62\x1f\xe8\x11\xbb\x41\x90\xe6\x03\x94\x37\x2a\xff\x8f\x80\x0c\xc3\x2f\xc7\xff\x48\x91\xdc\x12\x74\xe3\xa4\xff\x53\xa8\xf7\x63\x15\xde\xbe\xd6\x09\x82\x8f\x6c\x92\x6c\xbb\x5e\xce\x36\x2f\xeb\x3f\xfc\x51\x88\xac\x42\x54\x17\x93\xaf\xbf\x2f\x17\x96\x2c\x6e\xb3\xbb\x7d\x5a\xef\x02\xaa\xb6\x1b\x66\x7b\x0d\x87\x84\x4c\x77\x50\x46\x57\xee\x8a\xc7\xc3\x4f\x0b\x24\xa1\xae\x73\x7a\x76\xd2\x45\x3b\xc3\x8f\x67\xd8\xc4\x36\x9e\x40\x43\x00\xb3\x33\xde\x2f\x9c\x35\x0d\xb4\x57\x5a\x15\x58\x64\x62\xcb\xbe\x7a\x84\x1a\xdf\xf4\xe3\x4f\xe5\xef\xd6\x70\x83\x35\x7b\x69\x39\x7d\x67\xc6\x4c\x56\xa9\xd1\x36\x1f\xd5\xd3\x10\x15\xe1\x1d\x90\x48\xa5\x88\x5c\x50\x55\xf9\x01\xf5\x97\x2c\x4a\x7e\x74\xaf\xb6\xe3\x7c\x72\x0b\x92\x9b\x07\xd0\x2b\x19\xa3\x80\x18\x21\x94\xa0\x5c\xfa\x6a\x33\xac\x04\x33\x42\x09\xe7\x89\xa7\x8c\xb2\x45\xf0\x31\x06\x3e\x71\x03\x99\xd4\x08\x23\x5a\x2c\x9f\xfd\x6f\xe3\x28\x15\xc3\x40\xc1\x3d\x54\x7d\x2d\x4e\x60\x24\x49\x72\xf4\xd5\xab\x5a\x43\x6d\x09\x99\xbf\x42\xc5\x86\x5f\x58\xf9\x07\x55\x0b\xe3\x1f\xeb\xbf\x09\xf7\x8c\x89\x5f\xff\xa7\xff\x7d\x0a\xf8\xfb\xa2\xdb\x5c\x86\xfd\xf1\xd9\x25\x6c\x97\x11\x6e\xb8\x76\x6e\xc9\x63\x85\x7a\x3b\xad\x08\xf6\x8c\xa4\x49\x8e\x71\xb9\xff\x48\x2c\x92\x66\x12\x5b\xfe\x5f\xff\x1d\x4f\x50\xca\x85\xee\xc3\xa2\x05\x88\xfd\x62\x00\x02\x98\xcc\x4d\xaa\xac\xbe\x79\xeb\x12\xfb\xb7\x55\x8d\xc8\x74\x14\xcf\x1d\x18\x21\x92\x25\xb9\x8e\xc6\x72\x48\x2d\x94\x6d\x21\xf6\x57\xf0\x8c\x8c\xe4\x9a\xe1\x97\xbb\x78\xfa\xe7\xca\x9f\x42\xc4\x56\x9e\xcc\x83\x2a\x5c\x24\x71\x99\x91\x64\x44\xe4\x16\x10\xfe\x03\xe0\xfd\xdc\x73\x44\x30\x22\xa3\x84\x7a\x65\x67\x51\x74\x36\x15\x13\x01\x57\xf7\x33\x22\x19\xc7\xf2\x07\xb2\x08\x6c\xa0\x7d\x39\x86\xd3\xa4\x80\x08\x9e\xfb\xea\xd5\x31\xc8\xfd\x5d\x95\xf9\x8b\xf0\x9f\x11\xa9\x25\x02\x1d\x2c\x25\x9b\x03\xa2\xef\xcf\xbd\x7f\x3e\x59\xc1\x2a\x4a\x8d\x7b\x06\xac\xa6\xdf\x9c\x17\xfd\x8e\x46\x54\x4c\xb1\x23\x16\xda\x37\x9f\x95\x1a\xe6\xbb\x19\x51\x89\x05\xcc\x6a\x38\x7a\x58\x23\x23\x4a\x49\xa2\x7d\x43\x9d\xa9\xac\x7d\xc6\xad\x69\xa8\xd7\xcb\x88\x66\x16\xdd\xb6\x2f\x3e\x60\x51\x8b\xd7\x40\xe2\xcc\x88\x4e\xac\xf7\x78\x3b\x7b\x58\x8e\xbe\x6d\x9d\x4b\x6c\x08\xb9\x3f\xfd\x1c\xe5\xee\x19\xd1\x2a\xc3\x74\xc1\xf2\x7f\x4f\x45\x7b\xde\xbc\x89\xee\x15\x6e\xce\x4d\xeb\x7b\xfe\x19\xd1\x9a\xe0\xc7\xdd\x4b\x7d\x20\xac\xee\xfa\x0b\xd3\x10\x6b\xdb\x67\x85\x44\xf3\x57\x13\x60\x8c\x40\x64\x75\xea\x84\xd6\x1e\x6a\x70\x6d\x0d\x99\x48\x73\x0b\x37\xb3\x3a\x63\xc3\x92\x05\x23\x86\x33\x0c\xa4\x8e\x96\xaf\xfa\x41\xfc\xc4\xc4\xff\x0f\x28\xc2\x88\x3c\xc3\xcd\xb4\x68\x36\xd0\xd3\x00\x33\x1a\x51\x42\x2d\xf8\xd5\xd4\xd0\xbc\xad\xe1\x78\x6a\xc5\x35\x9a\x01\xbf\xc9\xd3\x28\xe6\xb1\xab\x61\x61\x55\xf5\x0a\x4f\x34\xa3\xc4\x50\x84\xd6\x3f\x40\x2d\x86\xd3\x4f\x29\x27\xaa\xe7\xcb\xfe\x0e\xa5\xae\x26\x3b\x0f\xa5\x99\x44\x6d\xd3\x7f\x89\xfa\x20\xfe\x1e\xff\x30\xa3\x54\x4a\xdb\x52\xdb\xcd\x0e\x3a\xe0\x0b\xd8\x5f\xe9\x5f\xff\xab\x2f\xe2\x97\x85\xc8\xeb\x26\x99\x32\x99\x50\x3e\x11\x80\xb1\xb6\x1f\xf6\x97\x35\xd5\xc9\x6f\xb5\xc2\xdf\xde\xcd\xd7\xf8\x13\xf4\x33\xfc\x64\xc5\x71\xaa\xf2\x01\xbc\x6f\xd8\x18\xe0\x87\xa4\x0c\xe1\x77\xf3\xc7\x79\xf8\x55\x96\x61\xa4\xfc\xfc\xf4\xf4\x2d\xfc\x4d\x18\x5c\xf5\xc2\x61\x3d\x47\x2a\xb3\x8c\xc6\x90\x62\xff\x53\x65\x30\xc7\x70\x7f\x85\x51\x76\x72\xdf\x49\x16\xfb\x5a\xf0\xb7\xea\x00\x56\xe2\x62\xfb\x73\xf2\x2a\x39\xb3\x5d\x0e\xd0\xbe\x89\xba\x9d\xd5\xed\x50\x26\x91\x51\xae\x24\xda\xeb\xdd\xd1\x79\x77\x1e\xf6\x33\x3e\x4b\x26\x0c\x36\x2d\xfd\x01\x3e\x67\x38\x3e\x9e\xe7\xd4\xce\x3f\x88\xc3\x53\x19\x38\xf5\x18\xcd\x95\x11\xae\x22\xd0\xee\x01\x9f\xca\x57\x86\xb3\xff\xb9\x4e\xf6\x37\xc4\x73\x5c\x60\x3b\x18\x15\x0c\x12\x5b\x83\x6e\x26\x7c\x1e\x93\xf9\x11\x19\x41\x24\xe2\xa1\xd0\xa2\x71\x20\x84\xf1\x47\x4b\x45\x2e\xec\xb9\xaa\x60\x2f\xa9\x72\x54\x73\x9d\x13\x13\x28\x95\x18\x55\x0a\x90\xf4\x60\xf5\x7e\xaa\xc5\xac\x69\x2a\x55\x0c\x03\x13\xaa\x20\xc2\x5c\xc3\xe7\x5b\x35\x62\xaa\x65\x14\x22\xdb\xa5\x57\x34\xdd\x26\x78\x8b\x5c\x5e\xe2\x1c\x8e\x12\x8d\x9d\x84\x4f\x3f\x1e\x97\xeb\xdd\x6c\xb1\x58\x87\x23\x54\x62\xd4\x2c\xb4\xfe\x51\xd4\x97\x9d\x7d\xe3\xa7\x85\x38\x46\x05\x91\x1e\x98\x8c\x7b\x81\x47\x4d\x23\x0e\x6c\x6a\x47\x40\x6a\xc4\xbc\xd9\x5d\x61\xd5\x3c\x1d\xa1\x44\x31\x98\xde\xfd\xa0\x26\x92\xc2\x92\xdc\x35\xaa\x2e\x30\x4f\xff\x4d\x34\x6f\x1e\x20\xe1\x47\x65\x0c\xac\x0d\x13\xfb\x1f\x55\xbd\xd7\x36\x76\x44\x95\xfb\xd0\x19\xea\x11\x24\x8c\x1a\xa9\x45\xdc\xdb\xe5\x4b\x95\x54\x3b\x8e\x45\x84\xa0\x0d\x9b\x01\x76\xf6\x84\x66\x5f\xc6\x22\x6a\xd3\xdd\xd6\x93\xbf\x7d\x7a\x79\x5c\x2c\xd7\x9b\x70\x34\xb6\x34\x5d\x87\xdd\x5e\x34\x16\xc1\x33\x24\x27\x63\x2c\x12\x2a\x72\x2f\xd9\xc1\xbd\x87\xa6\x8c\x11\xb0\x99\x2c\x09\xa6\xaa\x61\x29\x94\xdf\x17\x19\x01\x81\x6a\xcd\x8d\xf8\xb0\x29\x5f\x14\x92\xf6\xab\x84\xb1\x58\xe1\xd7\xd6\xab\x80\xcc\x27\x8f\x14\x47\x0c\xd3\xb4\xc6\xfa\x7d\xc3\xc2\x1b\x63\x31\x65\xd2\x35\x2c\x1d\x06\x18\x53\x77\x34\x89\x88\x97\x23\x77\xed\x5e\x6b\xf8\xa8\xde\x61\x31\xe4\x28\x1d\x5f\x8d\x27\x96\xff\x28\xb0\x5a\xad\xb4\xa3\xb3\x5a\x96\xa7\x03\xa0\x58\x84\x3f\x3d\x4f\x0d\xe6\x84\x5a\xf1\xba\x2f\xca\xfe\xcf\x42\x11\x2f\x69\xbb\xbd\xc3\x94\xee\xf8\x1a\x59\x22\xb4\x4b\x5b\x3e\xc2\xe7\x54\x1c\xee\xea\x6a\x65\x59\x22\x11\x3b\x75\x03\x75\x3d\xac\xa6\x32\x96\xe5\x44\x8d\xf2\x0f\x33\xc7\xc0\x3f\xf8\x71\x9e\xa6\xae\x4b\xcf\xf7\xde\xa2\xb2\xcf\xe8\x15\x66\x86\x23\x44\xc0\xe5\x62\x8f\x5f\x87\xad\xee\x07\x39\xe1\xb8\xa2\x7a\x69\xe7\xfa\xb6\x3a\xd5\x9b\xd6\x53\x72\x31\x96\xd3\x2c\x66\x03\xcd\xbe\x51\xee\x99\xb1\x9c\x93\xa8\xd7\x2a\xee\x42\xc2\xcb\x4a\x1e\x63\x79\x9a\x61\x14\x68\x3f\xba\x07\xe8\xcc\x6e\xd9\x4e\xa6\xcd\x8f\xcd\x28\x42\x11\x3e\x0a\xf8\xbc\x17\x2d\x34\x08\xd4\xea\x65\xe0\x7c\x57\xa4\x1f\x2e\x13\xcc\x65\x6f\x5e\x36\xab\xab\xbb\xf6\x68\x86\xf2\x40\x81\xd1\x05\x7e\xad\xa8\x2d\x9a\xdb\x82\x05\x7c\x0b\x45\xe6\x07\x1b\x89\x98\x11\x83\x49\x97\xa0\x89\x37\x41\x08\x31\x26\xb8\xb6\xfd\x11\x01\x27\x25\x72\x7f\x7b\x22\x4d\xd2\x18\xb3\x09\x9f\x63\xdc\xc3\xf5\x17\x22\x64\x02\x2e\x42\xd8\x63\xb5\x3a\xb8\x4c\x4c\x12\x9b\x0c\xf7\x74\x10\x0f\xc5\xeb\x95\x36\x6d\xc6\x64\xac\xb0\x94\x54\xed\x3e\x60\xff\x56\xed\x8e\x75\x25\xf7\x70\xb8\x90\xdb\xf5\xc3\x13\xeb\x98\x1e\x3d\x11\x4d\x2b\xf6\xbd\x03\xc7\x54\x6a\x05\xdb\x9c\xb6\x72\x48\xbd\x4c\xd2\xb5\x8c\x29\x20\xda\x92\x87\xc2\xa1\x38\x1d\x16\x55\x37\xa3\xff\xf2\xa7\xd1\x24\x05\x1b\x22\xcd\x1a\x55\x84\xb3\x6b\xe0\x42\xf4\x82\x87\x74\x3d\xcc\x11\x8e\xef\x53\x1b\x85\x60\x77\xdc\xb6\x2e\x14\xec\x18\x33\xa9\xc5\xc0\x22\x57\xd9\xf6\xec\xf5\x77\x59\x4c\x24\x33\x2e\xf3\x63\xc1\x15\x8f\x5e\xba\x9a\xc5\xe4\xff\xcf\xd9\xb7\x75\x39\x8a\x63\x59\xff\x9d\x7a\xe8\x07\x40\x12\x88\x47\xdf\x22\xd2\x5d\x11\x61\x77\xd8\x99\x59\x35\xb3\x66\x79\xe9\x72\xe4\x60\x12\x83\x1b\x70\x46\x46\xff\xfa\x6f\x71\x24\x71\xb3\x1d\x55\xf3\xcd\x3c\x64\x75\x48\x60\x10\xba\x9c\xcb\x3e\x7b\x2b\x11\x38\x09\x9a\x2a\x03\xb7\xbb\x5d\xa5\x9a\x5d\x67\x12\x13\x0c\xc8\x0a\xdc\x55\x37\xc6\xdf\x84\x92\x38\xf1\xe1\x27\xa7\xc7\x3b\x5e\xbc\x94\x0a\x9e\xf2\xae\x6a\x16\x91\x2a\x56\x3e\x70\xdc\x8d\x11\x01\x63\xd1\x84\xf1\xa7\xa5\x2c\x36\x9e\xdc\xcf\x46\xd0\x3d\xc3\xb6\x9b\xb1\x34\x8e\x89\xb7\x3c\x30\x06\xff\xda\xfa\x98\xad\x85\x13\x4d\x7e\x2a\x8e\x13\x5b\xa3\x98\x8b\xec\x74\x83\xc7\xc1\x75\x4b\xc2\x00\xfd\xa8\xf9\x9f\x7b\x6f\xe7\xd1\x24\x32\x42\x77\x55\x07\x30\x85\x84\x4d\x2d\xda\xfe\x58\xa5\x09\xe3\x4e\x1c\x41\x8b\x17\x68\xde\xcb\xea\x47\x77\x53\x41\xb0\xa2\xac\x80\x5f\xcd\x6c\x28\x93\x48\x68\x22\x6d\x45\xcf\xee\x71\xd6\xe7\xd6\x08\xe5\x91\x42\x07\x10\x84\x7a\xb3\x75\x8b\x18\x71\xa9\xbb\x76\x9e\xa0\xdf\xfa\x5d\x14\x50\xd5\xd9\x53\x56\xfc\xf8\xcb\xed\x81\x72\x45\x31\xbf\x6b\xf9\xfd\xc6\x63\xc1\xc1\x86\xc0\x0a\xf8\x09\xd5\x56\x5c\x6a\xb0\x40\x70\xd7\x9c\xc6\x4e\xc2\x18\x0a\x3d\x42\xc2\xdc\x44\xd7\x10\x9a\xa6\x44\x59\x37\xcd\x64\x79\x3e\xde\x55\x69\xaa\x04\xe6\x4a\xec\x7e\x79\x45\x32\xde\x7f\x47\x49\x34\xb2\xc4\x9e\x32\x9b\xad\x47\xe7\xeb\xa1\xac\xb6\x9d\xd5\x40\x25\x15\xdc\x53\x11\x60\xad\xcd\xd5\x57\x96\xcc\x02\x10\x95\xe5\x1c\xfc\x9e\x15\x45\xaf\x7f\x43\xa8\xe4\x1a\x0d\x8b\x59\xde\x74\x6f\x2b\x9d\x1c\xa1\xdb\x16\x6e\x21\x27\x5b\xb3\x40\xe1\x41\x2c\xba\xc4\xe5\xc1\x33\x1d\x37\xad\x39\xa5\x6d\xd4\xa3\x9b\x7b\xe3\x57\x53\x31\xc7\xcc\x8e\xbc\x54\x85\xcb\x69\xfa\x5f\xd7\x51\xe2\x59\x4d\x7d\xf1\xcf\xba\x46\x3c\x73\x31\x5d\x53\x3a\x06\xf4\xea\xbc\x34\xd7\xc3\x25\xcf\x11\x36\x39\x1e\x02\x6d\x38\x86\x87\x57\x2f\xfb\x99\xff\x15\x88\x63\xa1\x7c\x1e\xff\x90\xd5\x1d\x03\xdb\x48\xf5\x92\x50\x10\x96\xdf\x67\xb5\x5f\xbd\xbe\xcc\x9e\x0e\xb3\xed\xf6\x75\xf3\x6d\xf6\x74\xf8\x36\x7b\xfa\xba\xea\xee\xa6\x52\x63\x6b\x5d\x3e\x7e\x2f\xca\xf7\x1c\x74\x17\x17\xa2\x60\x08\x12\x03\x3c\xff\xbb\x9d\x38\x70\x39\x7d\x3a\x49\xc1\x70\x9c\x69\x07\x54\xe1\x44\x89\xbb\x9b\xb1\x73\x6a\x12\x66\xa3\x7c\x68\xc1\x3e\x59\x5c\xb8\xff\x4d\xa3\x24\x77\x06\xc5\xe5\xdc\x93\xd7\xdd\x58\xb6\x06\x22\xb4\x86\xcb\xf6\xe1\xea\xd6\x74\xf4\x49\x3d\xc2\x02\x26\xc0\xe1\xd9\xe7\x99\x1e\xa5\x1d\x58\x10\xab\x70\xe8\x9f\x9a\xaa\x3c\xdd\x54\x51\xf4\xfd\x65\x84\xd0\xcb\x53\x56\x4c\x73\x2f\x2c\x00\x15\xf7\x74\x50\x7f\x5e\x4e\x53\x8e\x90\xd1\xe7\x64\x21\xa3\xb1\xee\x3c\xb0\x81\xf1\x30\xff\x78\x06\x9d\x89\x76\x22\xc0\x9d\x70\x1e\x0b\x93\x54\xb9\x43\xe9\x4b\xa6\x35\x14\x0b\xc8\x72\x5c\x10\x63\x96\x0f\xc2\xa2\x28\x44\xcc\x18\x4a\x9f\x6d\x26\x26\x1b\x8b\x18\xc7\xf8\xdb\xea\x65\xf1\x37\xc3\x09\x2c\x52\x0c\x0d\x65\x7b\x0e\xf5\x7a\x74\xb7\x07\x8c\x50\xad\xb9\xa3\x92\x1b\xa3\x1c\x09\x23\x8c\xc7\xf6\x64\xbb\xf6\xde\x19\x8d\xac\xf7\xef\xb4\x7c\x6f\x73\xc9\x0c\x1d\x50\x46\x49\x2a\x06\x5c\x87\x36\x3c\xd7\x5a\x44\x96\x47\xf3\xce\x48\x32\x16\xe0\xcc\xc1\x72\x08\xf5\x26\xb2\xc2\x47\xe3\x5a\x27\xe9\x9e\xb9\x3c\xde\x45\x18\xe3\xc6\xf2\x56\x79\xf7\x02\x95\x87\xaf\xca\x16\x09\x63\xd2\x56\x59\xdb\xe9\x5e\xef\xba\x68\x1f\x8b\x89\xe5\x84\x3f\x5c\x8a\xb3\x50\x3f\xac\x8d\x7d\xc5\xa4\x4f\x58\x4c\x29\xf2\x7c\x3a\xf4\x13\x06\xb5\xfe\x8a\x45\xde\x5f\x9a\x10\xcc\xc1\xec\x3e\xd1\x5d\xe8\xba\x5a\xea\x5f\xbb\x77\xce\xe1\x2f\xf9\xc0\xfe\x31\x9d\x77\x71\xaa\x9c\x34\x7f\xfb\x71\x5d\x3c\xd1\x01\x02\xa7\x54\x6a\x84\xc5\x4a\xe3\xb7\x1b\x29\x49\xbb\xb6\x44\xa9\x30\xf2\x90\x1e\x0b\x4f\x1f\x64\xd9\xaf\x9f\x3d\xd1\xda\x2b\x56\xd8\xcc\xdd\x95\x6a\x15\x61\x3c\xb4\x06\x68\xdd\x55\x72\xd8\x24\xce\xf0\x8e\x61\xd7\x39\xd6\x48\x9b\x86\x86\xc8\xbc\x2c\xf4\x28\x54\xc3\x78\xc2\x06\x71\x78\x27\x80\xb6\x28\x4f\xa7\xac\xae\x6f\xe8\x79\xfa\xab\x84\x50\x16\x33\x83\x3e\x20\xd4\x4e\xcd\xd8\x63\x02\x5d\xb7\x34\x20\x6e\x8d\x68\x80\xd3\x52\x94\x8e\x6f\xf0\x16\x32\x9c\xb0\x34\xd4\xe8\xe9\x9c\xcb\x32\x7f\x16\xbf\x46\xbe\x35\x4b\x53\x8a\x04\xbe\xee\x3c\x9c\x14\x32\x4c\x0b\x1b\x6e\x16\x3a\x10\x96\x8a\x18\xcb\x61\x56\x8e\x85\xfb\xb7\x1b\xc5\x5e\x6d\xaf\x34\xb1\xb2\xd1\xfb\xd9\x93\x4f\xd7\xed\x37\x87\xe5\x7a\xb7\x7f\x5d\xcf\xbf\x7a\xd2\x35\xc2\xd2\xd6\xb6\x1f\x66\xf5\xb1\x44\xd4\xf3\x27\x1f\xf2\xd6\x04\x05\xbd\xeb\xcc\x61\x26\x98\x4e\x1c\xfd\xdb\x17\x10\x55\x23\x41\xa0\x5d\x7e\x95\x9a\x60\x32\x0d\xa8\x15\xe9\x38\x8b\x42\x0f\xec\x32\x26\x05\x47\xbc\xdd\xec\x0c\xbf\xf6\x22\xf7\x16\x1e\x53\x22\xf6\x01\x67\x44\xbf\x6e\x0a\xf4\x5f\x6f\xef\xdf\xca\x58\x35\xe2\x75\xa1\x2c\x93\x8e\x47\x48\x12\xa6\x83\xc8\x79\x70\x5f\x3b\x51\x9b\xab\xea\x40\xc2\xb4\x88\xd0\xa6\x11\x97\xa6\x35\x3d\xc4\xc4\xe6\x61\x10\x09\x04\x5d\x1c\x64\xa3\x6e\x78\xac\x0c\x40\x81\xe8\xe5\x89\x90\x10\x7d\x58\x54\x41\x98\x89\xad\x26\xed\x09\x9a\xb7\x52\x8f\x50\x87\x24\x0e\x40\x2b\x97\xc0\x9a\xe5\x79\x6b\x90\x61\x89\xd2\x1c\x9a\xf7\xa9\x80\xe0\xd5\xf4\x8d\x03\xa3\x10\x7d\x25\x31\x91\x78\x68\x86\x3f\x1b\x87\x2c\xa4\x43\x97\xfd\xb6\xed\x15\xa3\x48\x98\xfd\x94\x2e\x1f\xdc\x03\x86\x7d\x17\x4d\xd0\xd7\xbc\xd8\xd9\x86\xac\x3f\x9e\xff\xd6\xaf\xcf\x38\xd4\x29\x78\x2d\xb9\x85\x17\x31\x2f\xab\xaf\xb5\x15\xd6\x45\xcd\x9a\xc9\xd9\x13\x47\x61\x10\x69\x87\xde\xc7\x78\xef\xfd\xc0\x78\x77\x85\x55\x7f\x46\x8a\xe8\x1a\x11\xdc\xf3\x2b\x45\x29\x12\x47\xc6\x92\x5c\x56\x20\x2f\x1f\xad\x15\x57\x9d\x86\x99\x2b\xd7\x8b\x24\x0a\x2b\x4a\xed\x5a\x7c\x81\x77\xbb\xdf\x8f\x3f\x10\xa3\x56\x05\xcb\x6e\x2c\xdf\xa0\x02\x9d\xa9\x66\xc2\x92\x41\x62\xc6\x00\x31\xb5\xcb\x4c\x54\x1f\x4f\xe5\xf1\x46\xa9\x00\x89\x59\x62\xd1\xfd\x87\x1e\xaa\xb4\x04\xd9\x61\xcb\x3c\x31\xc5\xf8\x5d\x98\xb6\xca\x04\xad\x37\x58\x0d\xa3\x41\x71\xcc\x4c\x04\x4e\x24\xc9\x06\x72\xee\x8c\x5a\x9c\x52\x24\x67\x59\x35\x6f\xf3\xac\xdb\x33\xe3\x58\xa6\x48\xfa\x65\x2a\x80\xaf\xe7\x09\x57\x26\x89\x93\x00\xd0\x9f\xb2\x9b\xe1\x0e\xf2\x7c\x76\x84\xa2\xd9\x65\x0d\xbc\xc2\xf1\xf6\x82\x8c\x93\x38\xc0\x05\xb9\xf8\x28\x54\x55\xbe\x15\x59\x37\x1f\x79\x14\xa1\xab\xf2\x00\xa2\xda\x98\xe7\x76\x5f\x2e\x8e\x9b\x4b\x37\x19\x78\x2a\xb1\xfc\xbd\x1d\x99\xb1\x7b\xed\x3a\x08\x12\x23\x4c\x70\xff\xd6\xda\x58\xb2\x2c\x7f\x58\xd2\x2e\xdf\x0c\x21\xf2\x6c\xcd\x5f\x37\x7f\xce\x9e\x16\x9b\xf5\x8b\x6f\x91\x91\x50\xfd\x39\xea\xd0\x77\x8f\x50\x04\x4f\x59\x71\xcc\xcb\xe2\xb8\x10\xf7\xb9\xb3\xc6\x63\x22\x13\xab\x6a\xe2\xb4\xfd\x3d\x9f\x86\x6f\x95\x0c\xbd\xe0\x4e\xb0\x17\x93\xba\x18\x04\xed\xba\xe8\x54\x23\x7a\xba\x2c\x9d\x65\x4a\x7c\x93\x8a\x2d\x0d\x38\x52\x2e\x9c\x3b\x70\x2a\x89\x95\x88\xd1\xde\x5d\xcd\x66\xbb\xee\x6f\x40\x51\x56\x6e\xbe\x7f\x3a\xec\xb6\xb3\xd7\xfd\xac\x7b\x5d\x4d\x12\xdc\xcd\xcf\x15\x28\x6f\xae\x9f\xab\x4c\xdd\x60\xc0\xf2\x57\xa4\xdc\x55\xd1\xa0\x58\x4a\xe5\x2b\x8e\x5d\xb3\x09\x2d\x9f\x9f\x8c\x6a\x34\xed\xef\xec\x24\x26\x0e\x59\xea\xb3\xdb\x1d\xc6\xdf\x37\x0a\xeb\xc5\x5a\xe9\x89\xd1\x34\x36\x86\xa2\xf8\xd8\x7c\x36\x64\xf8\x22\x49\xd0\xd3\x3e\x2f\x4b\x35\xf4\x18\x92\x20\xb5\xdc\xc8\xc7\x4a\x5c\x5b\x51\xbe\x0f\x98\xb0\x4f\x4e\xd9\x30\xd3\xb6\xba\x57\x5f\x4e\x92\x28\xd2\x80\xdc\x0c\xad\x0b\xb9\x2b\x4f\x50\x16\xb0\x2f\xbf\x65\xf0\xfe\xfc\x81\x6a\x20\xb7\x0e\xd9\x24\x22\xc4\xda\x68\x6f\xa0\x7e\xf4\x68\xa1\xcf\xd3\x74\xa3\x71\x4b\xa2\x84\x52\xcf\x18\x6b\x8e\x4b\x68\x44\x96\x8f\x4a\x7d\x49\x12\x49\x81\xa8\x3c\x14\x5a\x2f\x74\x8f\xb7\x49\x88\x8b\x6e\xbc\x2e\x5e\xba\x3f\x31\x96\x76\xec\xf8\x99\x82\x8d\x59\x88\xd3\x59\x64\xc7\x62\x1c\x3c\x48\x48\xc2\xd1\xa4\xda\xb5\xcf\x5c\x4c\x80\xd5\xb7\xcd\xd7\x84\x92\x10\xa7\x38\x6e\xf3\x16\xe3\xd3\xfe\x46\x0e\x3f\x21\xc7\xbd\xfe\x05\xde\x27\xdb\x7c\x42\xe3\x30\xb4\xbb\x71\x0d\x0d\x7a\x90\xad\xbd\x7c\x13\x70\x92\xd0\xd8\x42\xc7\xc7\xb0\x85\xd7\x4c\x77\x69\x67\x7c\x87\xc4\x77\x4f\x23\x8f\x1a\xda\x7e\xdb\xae\xda\xde\x85\x82\x2b\x24\x59\xc2\x02\x6d\xfa\x64\xce\x53\xeb\x53\x4f\x0e\xfa\x84\x31\xeb\x85\xfa\xf3\x72\xc4\x9f\x39\x7d\xcc\x38\x8e\x15\x8c\x31\xa7\xb9\x50\x3f\x30\x91\x74\x83\x48\x86\x24\xb1\x4a\xad\x52\x4b\xbb\x23\xec\xdf\x2a\x00\xcb\x69\xe8\xc7\x28\x89\x8c\x25\x29\xa8\xca\xf7\xc6\xd2\xcf\xd5\xe3\x65\x98\x24\xc2\xf2\xa2\xd6\xd0\xcc\x5a\x0f\xfa\x3e\x85\x07\x49\x12\x90\x4a\x78\xf6\xd8\x43\xd3\x95\x6f\x90\x24\x31\x06\x31\x1d\xd6\xd6\x2b\x90\x41\xbb\x6b\xe4\x24\xc1\x50\xca\xcb\x2f\xf1\x36\xb0\xd5\x12\x4e\xad\xc4\xb5\x41\x71\xa1\x87\xd2\xc2\x25\x5d\x63\x1a\x02\x51\x83\x58\xe2\x0e\x9a\xab\xd0\x51\x92\xf2\xd8\x6a\xda\x8b\x8f\x2d\xa2\x0d\xc6\xdf\x27\x15\x36\xfd\x8f\x24\x89\x9b\x4f\x98\x5e\xc6\xbc\xaf\xd3\xfc\x67\x92\x82\x4e\xc7\xfa\x18\x0f\x5f\x97\xd7\xd8\xe1\xc9\xa4\x16\x86\x85\xbd\xd3\x6a\xcf\xbb\xe9\x0b\xc8\x88\x21\x0d\xe6\xc1\x6b\xec\x7e\x96\x5e\x4d\x64\x6b\x0f\x4c\x99\x42\xf6\xa3\x7d\x2f\x91\x29\x81\x0e\x45\xe2\x84\xe3\x7c\xde\x7b\xf2\xdb\x4a\x47\xc2\x71\x53\xac\xeb\x0e\x5c\x39\xc5\xba\x24\x8a\xa4\xd6\xcf\x47\x50\xc8\x55\x8d\xd1\x64\x4a\x2a\xc5\x70\x4b\xfe\x03\x41\x76\xa3\x47\x6b\x0d\xbe\x00\xf9\xd8\xd0\x63\xc4\x60\xcc\xc1\x4e\x58\x0f\x4a\x19\xbd\xae\xd6\xb6\x5e\x09\xd5\x83\xf0\x0d\xa6\xa4\xb7\xe3\x9f\x86\x30\x32\xae\x06\x19\x7f\xbc\x5e\x42\xad\x6e\xfb\x68\x09\xf0\xd8\x65\x04\x9a\xf9\x66\xef\xcd\x89\x04\x04\x01\x17\xc1\xce\xcb\x63\x7b\xfb\xc9\x60\x80\xb2\x4c\x0d\x9e\x23\x5e\xe3\x32\x38\xf8\xeb\x8d\xb2\x6c\x34\x88\x0b\x42\x31\xef\xd3\x94\xcf\x97\xf0\x80\x27\xb8\xbb\x5b\x76\xfe\x11\x01\xe8\x68\x2b\xe5\x41\x9a\x32\xcb\x8c\x8b\xc8\xf7\x2d\x54\x7d\x16\x9b\x87\x4a\x44\x2e\x82\x7b\x71\x11\xf4\x69\x90\x69\xbc\x1c\x78\x14\x30\x54\x12\xc7\x81\x47\x97\x62\x3c\xd1\xb8\xef\x17\x19\xed\x68\xf3\x5b\x9b\xbb\x75\x3d\xe0\x74\x6e\x2d\x8f\x69\x15\xd1\x18\x7e\x39\x3c\x5c\x78\x94\x70\x5c\x33\x4e\xac\xee\xa9\x7c\x47\x13\xbe\x3f\x6e\x39\x49\x93\x24\xf1\x88\xd4\xf6\xac\xb8\x33\xa5\x38\xa5\x02\x83\xa8\xa7\x4b\xde\x65\x6f\xff\x31\x4c\xe2\x72\x16\x07\xca\x0c\x70\xd7\xf3\xb2\xcc\x6f\xc4\x12\x39\x53\x12\xcd\xee\x53\xeb\xc9\x8b\xfc\xb1\xf4\xb4\x73\x84\x33\x13\xe1\x5e\xbe\x9c\xfd\x97\xff\x53\x1c\x84\xe8\xeb\x15\xf0\xab\xdd\x83\xfe\x03\x3d\xad\x3a\xe1\x71\x64\x90\x30\x29\xab\x77\xa8\x95\xbb\xa9\xb2\x63\x56\x88\x7c\x40\x47\x47\x78\xac\x42\xe5\x5e\xb1\x75\x37\xaf\x23\xbf\x3c\x61\x91\xdb\xc1\x72\xa1\xb1\x5e\x6b\x90\x7e\xe6\xdc\xd8\x40\x7c\x91\x29\x38\x5e\x3e\x42\xff\xf7\x34\x0c\xc2\x4e\x62\x5b\x64\xb9\x65\x40\x28\x4b\x44\xcd\x77\x9d\x22\x5b\x08\xe7\x82\x02\xe3\x6f\x35\x18\x94\x34\x66\xb4\xf7\x45\x96\x22\xcb\x3f\x7a\xb5\x8f\x1b\x89\x22\x9e\x26\x2a\xe9\x2f\x70\x31\xe0\xfa\x2f\x04\x52\xa7\x06\xc0\xa7\x06\x01\x4f\xc1\xbe\xe0\xb1\x12\xea\x3a\x06\x36\xee\x2b\x52\x05\x69\x27\x2b\xd7\x13\xd5\x8d\x0d\x22\x2e\x43\x19\xd2\xbe\x68\xe2\x3a\xd9\xcf\x25\xa5\xb1\x4d\x44\x58\x57\x15\x2b\x09\x74\xd7\x9a\x86\x36\x29\x5f\xe6\x7a\x21\x2a\xdd\x5f\xa6\x94\x2d\x34\x6a\x4f\x19\x34\x59\x26\xe3\xa5\x98\xd6\x5d\x04\xac\x3d\xcc\x3f\x2b\x0e\x25\x5c\xd3\x04\x49\x63\xd1\xbd\xbe\x0a\x2d\x70\xad\x59\xec\x62\x60\x16\xc2\xbc\x31\xab\x3c\x3b\x66\x32\x07\x2f\x6e\xee\x7a\x42\x08\xe8\xbb\x9c\xc5\xc7\x3e\x3b\x77\x7f\x25\x09\x3a\x04\xc8\x00\x78\x97\x31\xf0\x3a\xc5\xca\x01\x2c\x67\xee\xf6\x69\xb6\x7f\xd8\xbc\x3e\x1f\x9e\x37\x2f\xfb\x2f\x4f\x1e\xcb\xcd\x4d\xcc\xb0\x12\xb9\xdd\x10\x1d\x75\x58\xd7\xc4\x2d\xf8\x44\x89\xba\x41\xa0\xde\x53\x3b\x4c\x8f\xa2\x7b\x28\x23\xb4\x17\xc6\xf6\xe9\xf9\x2d\x86\x03\x7f\xf7\x42\x57\x24\x0d\x58\x84\x5e\xba\xa7\x8b\xea\x51\x66\xfe\x11\xd3\x20\x09\x79\xe0\xcb\xa1\x64\x95\xd5\x2f\x97\xd3\x78\x4f\x4d\x03\xc3\xc2\xb4\x1b\xbe\xd6\xe2\xa8\x47\x84\x4f\xae\x5b\xa8\x6c\x1d\x05\x02\x59\xba\x48\xf8\xcc\x69\x73\xb6\xaf\x77\xa5\x18\x47\xd2\x50\x13\x5f\x1e\x85\x3b\x9d\xdd\x19\x9e\x44\x31\x29\x52\x25\x69\x14\x8a\xc4\x0e\x48\xe1\x84\x30\xda\x79\xd1\xfa\x52\x57\x45\xaa\x83\x5c\xf3\x6d\x43\x23\x8d\x52\x4d\xc0\x8b\x51\xa3\xeb\xf8\xfb\xcb\xe2\x55\x34\x30\xd0\x97\x22\x69\x24\x2c\x27\xb8\x1b\xbe\xa9\xfa\x25\x49\x49\x62\x81\x2b\xc8\xf5\xe5\xd7\xdc\x32\xeb\xd1\xeb\xd7\x73\x22\x25\x92\x3a\x8b\xe4\x0c\xea\x3a\xf2\x3c\x30\xa5\xba\x0f\x40\x19\x89\xad\x32\x71\xdd\x3a\x0f\xb7\x5f\x89\x26\x0c\x2d\xcd\xfd\xeb\x7a\xf6\xf2\xe8\x4b\xd0\x49\xca\xb8\x64\xc6\x29\x27\xed\xce\xa0\x32\x27\xa9\x52\xdb\x18\x57\x9e\xa9\xdd\xd0\xdb\x18\xdf\x94\x87\xd2\x32\xc2\xe1\xbe\xe5\xb8\x33\x27\x1b\x72\xdb\x09\x75\xa0\x10\x89\x80\x54\x16\xfd\x8a\x4a\xd3\xd0\x4a\xa7\x58\x01\xdf\xf2\x04\x8b\xb7\x2c\xd7\x95\x4b\xae\x4c\x4e\xa5\x34\x25\x09\x7a\xd3\x27\xf1\x6b\x77\xce\x8a\x62\x70\x23\x91\x0a\xcb\x6b\x25\x72\xd8\x9c\xa1\xe8\x96\x4a\x2a\x24\x47\x4c\xc0\x9f\xfb\xbd\xaf\xc5\x4a\xa5\x94\x28\xfc\x8a\xb2\x8e\x7d\x57\xa9\x03\x69\xb1\x13\xe5\xb9\xac\x9d\x5c\xcd\xe7\x9b\x65\x2a\xc1\x78\x65\xef\x57\x50\xe5\xe9\x84\x2f\x78\x7b\x27\x4a\x95\x14\x31\xf8\xe5\x84\x0e\xa4\x8d\xce\x4f\xc2\xf8\xa9\xd2\x2c\xed\xea\x19\x1e\x00\xea\xd9\x4f\x91\xe5\x36\x51\x89\xc1\x27\xd7\x4f\x13\xc0\x20\x6c\x6b\x66\xee\x2e\x72\x28\x2b\x7e\x0f\x6c\x3a\x79\x7c\xcd\x12\xac\xc9\x6f\x0f\xbe\x47\x68\xe6\x59\x33\x52\x3e\x26\xed\xb9\xa1\x35\x96\x7b\x75\xae\x44\x0a\xca\x96\xfc\xa3\x37\xbd\x2f\x7f\x2c\xc1\x31\xdc\x13\x11\x30\x96\x48\x07\xa2\xec\x1f\x7a\x34\x0a\x22\x88\x83\xc4\x71\xb7\xbc\x96\x13\x91\x3a\x22\xc2\x20\xc0\x78\x96\x4b\x66\x2d\xca\xd3\xb9\x2c\xa0\x47\x02\x88\x90\x85\x91\xcb\x74\x6e\xb6\xcf\x93\x7b\x87\xb1\x7d\x1f\x97\xfb\x2e\xab\xef\x90\x75\xdc\x3c\x44\x44\x34\xc4\x6d\xe2\xf1\x57\xeb\x37\xe1\x94\x9c\xec\x24\xc2\xf3\xb2\x20\x65\xed\x25\x1f\x10\x3c\xde\x1c\x41\x11\x69\x88\x3c\x62\xaa\xfa\xe7\x05\x8e\x65\xf7\xa4\x91\xd1\x56\xf4\x26\x17\xd9\xe9\xbf\xa0\x2a\x8b\xcc\xe5\x82\x63\xfa\x8f\xbf\xfe\xc7\xdd\xa5\x75\x8b\x89\xa7\x9b\x70\x29\xa2\xbf\xd0\xe7\x22\x82\x28\xca\xdc\xce\xf9\xb5\x68\x4f\xd8\xbe\x41\xe1\x8e\xee\xcc\xc8\x7d\x27\xa2\x84\x54\x3d\x7d\x94\x4c\x10\x4d\xb0\x1c\x00\xb4\xf5\x87\xbc\x49\x2e\x68\x18\x62\x36\x46\x68\xbd\xac\xb2\x9f\x53\x6b\x5c\x50\x19\xfb\xac\xc3\xac\xaa\xc4\xc7\x74\x07\xf6\x7b\x9d\x60\x69\x8a\x87\x18\x9c\xa0\x3a\x42\xa1\x3e\x7a\x91\x48\x22\x98\xb4\x1c\x1f\x90\xb5\x3e\x19\x82\x51\x37\x95\xe3\x98\x5d\x88\x62\x59\xee\xdf\xba\xa0\xa5\x88\x59\xcc\x4d\xaf\x34\x08\x55\xf3\xf1\x24\xbc\x59\x50\xcd\xdb\x75\x09\x76\x37\x1b\x45\xc3\x45\x1c\x6b\x8c\x85\xd9\x32\x65\x2f\xe7\xe3\x1b\x95\x4a\x9c\xe3\x37\xbf\x7c\x78\x82\xae\xf1\xb1\x26\x38\x8d\x0d\xf7\xa0\x82\xc9\x40\x70\x99\xd2\x9e\xe4\xcb\xf2\xe3\x8d\xb7\x11\xbf\xb3\x09\xee\x68\x8a\x26\x16\xe0\x9d\xb5\x3b\x29\xb4\xb9\xfe\xab\x7f\xba\x34\x4d\xb1\x7c\xed\xd2\xfa\x5d\xfe\x6f\x8a\xe0\x26\x6a\xf9\xaf\x26\x8f\x2c\xc2\xc0\x92\x1a\x5e\x4e\x27\x07\x37\xee\x22\x9f\x42\x44\x3c\x95\x3e\x3d\xbe\xaf\x00\xea\xf5\x1d\x85\x08\x22\x64\x22\x2c\x42\x30\x07\x51\x7d\x17\x59\xb3\x15\x59\x35\x87\x7e\x15\x4b\x11\x07\x16\x85\x72\x7e\x13\x37\x2a\xe2\x7c\x37\x45\x90\x2f\x40\xe4\x15\x08\xfd\xd1\x15\x2a\x5e\xd9\x0a\x42\x1a\x89\xa9\x4c\xa7\x29\x5d\x5e\xd3\xf5\xb5\x7d\x34\xd6\xc5\x2e\x16\x18\x93\x1e\x3a\xd3\x42\x05\xc6\x56\x31\xda\x59\x70\x9f\xbe\x9c\x08\x1d\x58\xaf\xa7\x71\x5e\x5c\xaf\x6e\x79\xa7\x3f\x0f\xd0\xef\x5e\xe9\xac\xd9\x67\x37\x24\x05\x6f\xb9\x7d\x93\x7b\x40\x18\x18\x77\x74\x58\x41\x2c\x8f\x94\xf9\xba\x5e\x4e\x46\x02\x22\x89\xc1\x3f\x17\x27\xa9\xa1\x5a\x40\xd5\x64\xc6\x33\x66\xdf\xfc\xb5\x91\xea\x9b\xbf\x51\x62\x0b\xdb\x84\x31\x59\x9e\xd9\x17\x3d\x56\xe2\x64\x6b\x35\xc6\xc6\xbe\x00\xae\xbd\x48\xcd\xfc\xf2\x31\xe2\x1a\xf1\x3d\x84\x4d\x50\xd9\xfc\x0d\xfa\x6e\x93\x0e\x8a\x29\xf7\x8e\x56\xb3\xa2\x7d\xf6\x27\x54\x2d\x77\x3d\x0c\x67\x49\x30\xf8\xc8\x8f\x50\x20\x04\x6a\x7c\x23\x19\xb4\x4e\x58\x7b\x23\xa5\xc7\xd5\xf7\xbe\x9d\x51\x66\x26\x50\x96\xcf\x23\xaa\x32\x10\x0c\xb3\x13\x6b\x0d\x28\x2b\x69\xb3\x41\x1d\xfe\x46\x06\x10\xa3\x17\xf1\x06\xf9\xb9\xf3\x57\x65\x18\x32\x0c\x09\x39\xc9\xcc\x01\x6d\x01\x91\x21\x0f\x10\x03\xf3\x02\xef\xaf\x18\xd1\x17\xf9\xdf\x03\x27\xc8\x28\x08\xc3\xb1\x02\x5e\xbd\xeb\xb7\x78\x19\xa9\x48\xf4\x54\x09\xed\xc1\x3d\x9f\xef\x27\x68\x15\xd7\x95\xa8\x20\xb0\x3a\x69\xc5\x12\x4c\x55\x76\x38\x5c\x49\x0c\x05\xab\xbf\xd4\xda\x59\x5b\xf1\x01\xda\xf2\xfe\x39\xcd\x80\x9b\x06\x8e\xa4\xcc\x3a\xfd\xeb\xc5\x06\xf9\xdb\xe8\x6f\x5d\x83\xb4\x44\xf0\xa5\x2a\x2b\x58\xb4\x86\x43\xd7\x64\x12\x5c\x94\x42\x96\x97\x3b\x59\x02\xc9\x62\x4a\x2c\x95\xd4\x62\x1f\x06\x01\x72\xcd\x6f\x7c\xb1\xa4\x64\x09\x10\x0b\xc5\x77\x64\x65\xbe\x21\x8e\x68\xa0\x9d\x03\x7a\xc1\x98\x7c\xf9\x3e\xe4\xfd\xf9\xab\x2a\x42\x7f\x1b\x1e\xd0\xc0\xa9\x36\x62\x20\xec\xf0\x33\xa4\x5f\x44\xfd\x76\x70\xfd\xba\xdf\x93\x24\x1c\xce\xab\x9b\x71\x42\x99\x04\x81\x31\x5e\x28\xb3\xac\x3e\x56\xbf\xce\x59\xf5\x81\x99\x4f\x47\xd8\xee\x3b\x32\xc9\x9c\x23\x8e\x90\x0b\x9b\xa2\x1a\x1a\x07\x32\x31\x41\x20\x46\x25\x88\xd6\x5e\x19\x92\xd7\xbb\xae\x3c\x20\x98\xe0\x9e\x61\x94\x6c\x99\xd5\x2a\x3b\xe7\x60\x19\xfa\xc6\xef\xcb\x23\x9b\xe2\x82\xe6\xcd\x39\x53\x9d\xae\xe5\x7b\xe9\xdf\x95\xb3\x50\xa6\x43\x75\x86\xec\x74\x39\xad\xce\xa5\x7a\x43\x90\xc6\xcf\x89\xce\x1a\x91\x3c\x91\xc8\x2e\x55\x9e\xa1\xb8\xc5\xfa\x7a\x67\xf0\xb9\xd4\x94\x8e\x82\x96\xa5\x59\x35\x6f\x98\xe4\xec\x9e\xc5\x24\x18\xa8\xfc\x4e\xf7\xfe\x4f\x22\x8a\x31\xd2\xf3\xaf\x77\x51\x6b\x18\x65\x64\xa5\x88\x54\x12\x77\x98\x83\xfd\x5b\x55\xbe\x77\x4d\x0c\xf0\xd7\x4c\x7b\xf6\x9d\xba\xbf\x26\x04\x7d\xdc\xf9\xd7\xf5\xd3\x72\xfd\xf2\x38\x24\x63\x22\x52\x18\x89\xbb\xcd\x53\x79\x0c\xaf\xa0\x22\xb7\xb7\xf8\x91\x3f\x17\xde\x79\x73\xc9\x42\x91\x7a\x82\xf9\xfa\xed\x2f\x51\x28\x77\xee\x02\x21\x22\xbe\xfd\x9c\xf4\xb4\x33\xc2\x8a\x59\xba\x5e\x0a\x28\x4a\x87\xd4\x96\xb2\xe0\x6b\xdd\xed\x26\x3a\xd4\xb4\x17\x42\xf4\x7f\x05\x6e\x14\x1f\x26\xe5\x27\x93\x0d\x40\x48\x2b\x47\x05\x0a\xe5\xaf\x47\x25\xbf\xd2\x84\x0c\xed\x9d\x83\xbc\x64\xb9\xde\x67\x27\x09\xd5\x42\x9c\xae\x32\xe3\xc3\xac\x81\x34\x3c\x4c\x6d\x31\x54\x01\x43\x6d\x86\x4f\xb3\x78\xfd\xb5\x18\xd0\x74\xc9\x65\x37\xf9\xff\xce\x34\x9c\x0c\xa7\xe1\x16\xe0\x64\x8d\xba\x1e\x08\xc8\x7d\x3b\x10\x0c\xee\xef\x7e\x64\x79\x3e\x07\xd1\xd4\x4f\x97\x7e\xaf\x33\x60\xcf\x03\xa1\xb5\x3b\x3e\xf7\xe5\xa2\x12\x05\xdc\xaa\x6d\x52\x01\x8b\x59\x30\xea\x7d\x7b\x7b\x54\x41\x6c\x75\x2d\x4e\x59\xd1\x3c\x94\x55\xeb\x22\x4c\x69\x10\x87\x25\x98\xa3\xc3\x50\x85\x29\x45\xbc\xeb\xcb\xbe\x97\x5f\x68\x7f\xce\x1b\xfc\x2a\x94\x89\x97\xf7\x74\x8f\x71\x2d\x60\x4f\x54\xc4\x43\x04\x0a\xbd\x65\x4d\x7f\x9f\x71\x81\xa0\x22\x71\x80\xbe\xf8\xe1\x60\xd7\xc1\xde\x82\x7e\x86\x47\x92\x22\x31\xc3\x3c\xeb\xbf\x2e\x70\x81\x75\xbd\x3a\x9d\x3d\xbd\x0d\x51\x24\x49\x91\x19\xb6\x79\xcb\x2a\x3d\x54\x55\x70\xd5\xf5\xbe\x1b\x58\xa6\x22\x34\x3e\xfd\x99\xda\x6f\x9e\xfd\x33\x53\x42\x43\x5f\x9b\x12\xfb\x7a\x49\x45\x49\xea\x32\x78\xaa\x2c\x74\x97\x09\x1d\x14\x24\x2b\xca\x28\x5a\x46\x99\x19\xd7\xee\xfa\x66\x13\xe0\x71\x85\x1a\x3d\xa3\x89\xa8\xe2\x80\x23\xaa\x51\x5e\x30\x28\xbc\x40\xaa\x3d\xa8\xd6\x1a\xff\x57\x7b\x2e\xd6\xce\x47\x0c\x23\x3e\x94\xca\x23\x2a\x66\x01\xa2\x1a\xf6\xae\x38\x75\xf7\x36\x51\x00\x22\x2a\x4e\x4d\xc0\xfb\xf8\x38\x32\xe4\x4e\x1c\x5c\x15\x1b\x40\x3c\x9f\xd0\x7a\x91\x35\x19\x0c\x70\xb0\x83\xa4\xdd\xc4\x59\x53\x09\xb7\x6a\x03\x3e\xef\x6a\x49\xf5\xab\xf2\xb4\xbf\x2e\x90\x50\x89\xa6\x98\x90\x79\x2c\x73\x47\xe1\xf9\x0c\x79\x1f\x68\x51\x29\xe7\xc6\x52\xc1\xcd\xf2\xcc\xab\x99\xfc\x77\x98\x78\x3a\x6e\xd7\x4d\x24\x02\xeb\x01\x1f\x00\xee\x44\x78\x6f\x2f\x52\x25\x23\x61\xa4\x4b\x65\x57\x3f\x21\x1c\x9b\xaa\x4a\x12\x0b\x65\xa8\xa1\x79\x51\xcd\xaa\x2f\x2a\xbf\x52\x06\x20\x4a\x0a\x89\x44\x94\xbb\xd5\xd3\xd3\xea\xf5\xb0\xdb\xaf\xb6\x87\xf0\xb0\xd9\xae\x7c\x22\x5f\xa9\x88\xa0\xb9\xfd\x04\x75\x5d\x16\x07\x7a\x67\x8d\x2a\x2a\x46\x45\xdf\x5d\x8d\xd2\x08\x86\xa6\x14\xd8\x5a\xca\x67\x28\x6a\x51\x65\xd9\x20\xbf\xab\x74\x68\x01\xf8\x07\xbb\x8b\x79\x9a\xfe\xae\x55\x23\x61\xb8\xae\xcf\x6a\x78\x11\xa5\x58\x0b\xfa\x08\x0d\x96\xd1\x8c\xa7\xa3\x4e\x53\xac\x89\x3a\x79\x16\x48\xa2\xb4\x52\x36\x3b\x84\xec\x97\x0b\x4b\xd4\x36\x95\xa3\x21\x0a\x04\xc5\xcd\x09\x73\xd7\x1e\x95\xe0\xdb\x64\x8c\x76\x57\x7d\x2e\x8b\xba\xbc\x2a\x9d\x70\xbd\x4c\x48\x31\xd2\xf3\xcf\xd9\xe2\x77\x84\x3b\xfa\xcb\x4d\x04\x58\x99\x83\x88\xc6\x76\x58\xf7\x6f\xe2\x4e\x60\x53\x99\xd8\x18\xe1\x02\x98\xa8\x56\x71\x19\xc9\x3e\xdb\x33\xe1\xe6\x17\xd1\x41\xac\xb1\x42\x72\x0c\x62\xd8\x96\xef\x9f\x71\xfb\x11\x1d\x70\x61\xcb\x5e\xb2\x13\x48\x51\xfc\x50\x9f\xa1\xfb\x75\x18\x58\xae\x56\x17\x53\xc4\xaa\xb3\x4f\x6c\x01\x7f\x55\x92\xa0\xf5\xed\xb0\x7c\x3d\x92\x44\x87\x09\x47\xa9\x5e\xab\xb3\xe2\xc0\x4d\x5d\x23\x24\x08\xb8\xd9\x7e\xf9\xa3\x2a\x73\x9f\x5a\xd3\x11\xf3\x30\x88\x9f\x65\x5f\x81\xa6\xa3\xd4\x6a\xb8\xef\xa0\xc1\xe4\xe5\x10\x41\x7d\xf3\x5d\xa2\x34\xc2\xd0\xc1\x6e\xff\xaf\xab\x0a\x83\x1b\x42\x67\xa3\xaf\xad\x23\x09\x98\xbf\xb4\x4f\xed\xd0\xf5\xde\xd5\xd4\x24\x56\x78\x32\x74\x76\x2c\x32\xa8\xf7\x5e\x24\xff\x24\xe6\x71\xfd\x89\x68\x4a\x11\xed\x29\x31\xf2\x83\xf4\xea\xfe\xa5\xa9\xa6\x22\xf5\xea\x9a\xed\x7a\x5f\x17\xce\x64\xf6\xfb\xbf\x66\x11\xf5\xdc\xf0\x4b\xf1\x51\x6f\x45\x5d\x83\xde\x65\x85\x82\x27\x51\x37\xad\x3f\x85\xb1\x05\xc7\x03\xe9\x2f\x62\x41\x34\xa8\xbb\xeb\x9d\x10\xcd\x12\x8e\x05\x90\xb3\x73\x99\xe7\xe5\x0e\xce\x0d\xb8\xba\x7e\x1b\x6f\xf7\x9c\x44\x9f\x3b\x7d\x3a\x0e\x12\x3a\xb4\xe3\x16\x15\xe8\xac\xa9\x3d\x25\x60\xfe\x71\x6b\xd6\x8e\xeb\x11\x74\x4c\x2d\xf6\xeb\x24\x7e\x5d\x27\xc2\x74\xcc\x42\x14\xe2\x5d\x6c\x17\x2b\xc7\xbb\xe4\xdf\x21\x4e\x22\x4f\xdd\x8d\x99\x28\xc4\xc7\x90\xf1\x8e\xa0\x13\x6a\x0b\xe8\x85\xd6\x23\xe2\x3f\xa2\x13\xd0\xe8\x2b\x7c\x7b\x5d\x6c\xd6\x2f\x87\xe5\x6a\xb1\x7e\x9e\x3d\x79\x94\x9c\xe6\x8a\xa1\xd0\x84\xe5\x74\x44\x27\x19\x4f\xc3\x1e\x17\x7e\x7b\x4a\xa5\x21\xc7\xfd\x70\xfb\x75\xfe\xb4\x5e\x1c\x16\xaf\x9b\xef\x4b\x64\x1a\x5e\xcc\xbc\x6f\xa8\x53\x49\x65\xe8\xea\xb8\x1e\x33\x73\xc7\xc1\xd4\xa9\x4c\x30\xb0\x00\xbf\xce\x79\xd9\xc5\x00\x75\xaa\x0d\x67\x83\xaf\x3a\x86\x4c\x69\xc1\x18\x09\x7d\x38\x62\x0b\xd5\xd7\x5a\xbf\x60\x49\x72\x27\xba\x42\xb4\x48\x15\x46\x08\xeb\xec\x58\xcc\x1a\x5f\x08\x78\x7b\xde\x4a\x12\x60\xf9\xcd\x29\x2b\xd6\x4e\x9f\x65\x84\x4b\xd7\x92\x00\x66\x54\xd7\xdb\x6e\xb7\xd4\x8a\x51\x44\x81\x60\xa5\xa4\x2b\xe5\xf0\x0f\x6a\x83\x60\xbe\xa3\x21\xe8\xf6\x94\xc6\x60\xf8\xeb\x6a\xe2\xdd\x7e\x28\x65\x04\x12\x33\x89\xe6\x2d\x87\x06\x66\x36\x12\x87\x61\xe7\x7e\x2f\xd1\x52\x62\xf4\xec\xfb\x90\xef\x94\xe8\xf6\xe1\x50\x55\xf5\xf4\x94\x49\xff\x47\x60\x24\x22\x4e\xab\x24\x53\xe2\xaa\x3a\x48\x43\x2c\x90\xf2\xa4\xe3\x73\x10\x95\x1e\xb9\xbd\x1a\x38\xc7\x52\xa8\xf7\x7c\xd7\x94\x67\xf4\xc9\xbb\xbb\x4b\x5b\x6f\xec\x6b\x93\x5b\xd7\xe2\x26\xfa\x4a\x83\x61\xa9\x05\x4c\x37\xd5\xa5\xbe\xa5\x33\x4f\xb4\x49\x93\x38\xf5\xe9\x1d\x2b\x26\xd8\x67\xfa\x21\x50\x91\x23\x4c\xf0\x84\xc1\xb7\x4a\xa0\x21\x30\x5c\x79\x82\xa3\x1c\x3e\x5e\x32\xf5\x03\xbc\x74\x8b\x6d\x4d\x3c\xac\x13\x35\xa9\x2e\x5d\x5b\x18\xa9\x0e\x39\xb2\x40\x80\xfd\xe8\xf8\x86\x30\x36\x18\x4a\x28\xe0\x57\xf3\xd8\x0d\x3b\x84\x9a\x25\xaa\xd3\x6b\xd8\xf5\x05\x5e\x10\x25\x02\x27\x50\x1f\x1b\xba\x05\x9c\x83\x48\x11\x9a\x8e\x08\x43\x7f\x40\x31\x2b\xf4\x2d\xf1\x67\x77\x09\x89\x42\x03\x5e\x94\x00\xb1\xbb\x8e\x63\xe1\x6a\xa3\x01\x42\x20\x8d\x47\x74\x5d\x1f\x5f\x8b\xac\x8b\xf2\x01\xe1\x4e\x1f\x46\x1f\x4c\x59\x1d\x8a\x8f\xd3\x6f\x93\xdf\x32\x12\x59\xea\xdb\x8f\xff\xaf\x4b\xf6\x1f\x7f\x21\x4d\x8d\xd2\xbe\xfc\x65\xdb\x94\xe7\x7b\x0a\xfd\x9f\xba\xcc\x40\xa5\x41\x15\xd3\x63\xd6\x7a\x78\x93\xa1\xa1\xc0\x30\xa6\x6e\x77\xb8\x41\x7a\xc8\xb5\xb3\x38\x44\x95\x39\x4c\x8e\x6d\x3a\x47\xac\x2f\xf7\x81\x38\xd0\x28\xfe\xf1\x58\xe6\x70\x72\x85\xb3\x9f\x16\x93\x4f\x1e\xcf\x53\x12\x0e\x98\x5e\x3e\x8d\x32\xb8\xcb\xb8\xd6\xa9\xd7\x45\xb2\xbb\x84\x25\x64\xf4\x0f\x9e\x52\xe5\x09\xed\x70\x7b\x0f\x56\x9d\x61\x01\x29\x13\x08\x1e\xcc\xea\x17\x38\xe6\xd9\x11\xb3\x7a\xb7\x9f\x4e\x04\x21\x25\x9e\xb9\xac\x11\xb9\xff\x04\x13\x1b\x70\x8a\x8f\xf0\x57\xc7\x36\xfe\xf2\x02\xef\xbf\xdf\x45\x42\x83\x10\x21\xd5\x4e\x62\xe3\xbe\x1a\xf9\x3f\xc6\xd7\xa8\xc8\x33\xbb\x3e\x7f\x3c\x88\x5c\x75\x25\xc9\x20\xd3\x98\x38\xdc\x6e\xf7\x27\x49\x94\xa5\xfa\xfd\x26\xf2\x4c\xef\x90\x66\x70\x98\xbe\x19\xaf\x43\xa9\xa9\x0f\xe9\x3d\x38\x99\x9e\x01\xbd\xef\xf4\xb3\x8e\x05\xed\xfc\x2d\x0c\x47\x79\xe1\xc5\x1b\xe4\x23\x99\x25\x02\x8a\x00\x86\x70\xbe\x7f\x59\xbd\xdc\x22\x0f\xfc\xd4\xf0\x02\x95\xc6\x78\xba\x3e\x95\xc7\x6f\x99\x55\xe2\x19\x99\x08\xae\x9b\x8e\x35\x82\x5b\x9e\xca\x63\x07\x5d\xb4\xc4\x86\x93\x05\xa0\x45\x84\x86\xdc\xb9\x82\x9f\x3b\xa8\x32\xa8\x77\x90\xe7\xe5\xa5\xf9\x52\x5e\xfa\xd9\x04\x89\x42\x70\x0b\xae\x71\x57\xe3\xd7\xb5\x71\x89\x80\x9c\x4c\x95\xd1\x20\x70\x0d\x20\x93\x54\x74\x02\xa9\xab\xba\x01\xb8\xa5\x36\x4d\x00\x74\x88\x86\xe8\x2c\xcf\xa6\xd1\x55\x30\x5c\xa7\xe0\x61\xcc\xad\x8b\xe4\x1d\x1b\x13\x84\x29\x52\x4b\x28\x51\xcc\x2f\x55\x31\x95\x0f\x1b\xcf\x31\x13\x24\x02\xb3\x93\x8e\x0c\xcb\x6d\x93\x37\xe7\xbc\x09\x04\x44\x56\x18\xb7\x34\x59\xb3\x84\xd6\xa9\xad\xee\x10\xd7\x12\x13\x28\x81\xc2\x4d\xf3\xcd\xd7\x97\xfd\x9f\xae\xe4\xcb\x3f\x64\x18\x52\x13\xf5\xda\x06\xd6\xd9\xc6\xd8\xc5\x43\x39\x3d\xc7\x26\xf7\x0d\xe3\x00\x6c\xdc\xa2\x68\x5e\xe1\x27\xf4\x11\xd8\xf1\x8c\x30\xa1\xb0\xd2\x94\x87\x53\x76\x3f\x16\xde\xf5\xb5\x95\x10\x4f\xe5\x71\xed\x6a\xae\x2d\x53\xc5\xf5\xeb\xdd\xbb\x83\x86\xd0\xa9\x58\xbc\xec\x36\xaf\xde\x6e\x31\x51\x64\x05\xae\x84\xd6\x4f\x9b\x45\x53\x3e\x7d\xd9\xdf\xb6\xf3\x4c\x14\x29\xa7\x5a\x0c\xea\xc7\x12\x72\x38\xde\x20\xca\x30\x11\x4d\x89\xe9\x8a\x84\x57\xfb\x2f\x73\xd1\xa8\xb7\xdf\xa6\x51\xaf\x7b\xf0\x62\x43\x22\x83\x47\xe3\x8d\xd4\x95\x21\x5a\xa2\xcf\xf7\x6d\xb5\x43\xd9\x94\xc5\xd3\xfa\xe1\xc1\xbf\x08\x63\x46\x05\x9e\xc4\x2a\xd7\x50\x3d\x56\xe5\xe5\x4e\x91\x8f\x61\xb1\xa5\xb9\x74\xe0\x40\x4b\x37\x87\xa2\xbd\x37\x69\xc4\x89\x89\xc3\x00\x7d\x69\x79\xf9\xd8\x95\xa7\xbf\x19\x35\x37\x71\x94\x58\x7e\xba\xd5\xe3\xd3\x70\x2f\x31\x09\x23\x7e\x7b\x7e\x88\x3e\x2f\xbb\x36\x3c\xd0\x18\x47\x43\x92\xc7\x21\x6b\xce\x9d\x1f\xe5\x22\x0a\x43\xe7\x8b\x6f\x0a\x40\xda\x99\xe9\x63\x8e\x7f\x21\x55\x12\x1d\xd6\x2f\x4f\xdf\x07\xa5\x40\x46\x90\x08\x43\x92\x05\xbc\xdb\xfc\xd3\xbd\xdb\x4c\x1e\x40\xa4\x1c\x37\x96\x6d\x05\x5a\x34\xf0\x6b\x79\x11\xfe\x96\x92\xd9\xda\x8c\xf3\xa5\x99\x5f\x3e\xec\xb9\xfc\xf7\xe6\xaf\x54\x09\x02\x98\x2c\x24\xcb\x33\xd6\xe3\xe6\xcd\xc7\x7b\xb8\x51\x29\xc7\x01\xfb\xdf\x8b\x3e\xba\xca\x81\x87\xb2\xfa\x1c\x41\x64\x94\xb0\xb4\x34\xf3\x2c\x17\x85\xca\x4a\x4c\xa5\x94\xde\x92\x9c\xf4\x35\x4c\xbb\x5a\xb2\xa6\xec\x80\xce\x65\x7d\x25\xd7\x76\xe7\x5d\x34\x8d\x3c\xe9\xb3\xd5\xf4\xbb\x8a\xeb\x18\x9d\x58\xbe\xdc\xf2\x1d\x85\xc3\xa7\x8d\x80\x8a\x7b\xea\xad\xb5\x61\x8b\x29\xe4\xcd\xe8\x34\xc4\xdd\xa2\xb6\xfa\x00\x65\xd5\x6b\x5b\x4c\x69\x7e\x8d\x4e\x81\x8c\x9c\x1d\xff\xa9\xb4\x12\x88\xce\xfa\x92\x35\x0b\xe1\xf5\x47\x89\x01\xb0\xd1\xc0\xfa\x24\xaa\xce\xc1\x41\x6f\x74\x10\x99\x35\x26\x4c\x99\x33\x01\x7f\xc0\xa6\x98\xc3\x9b\xc8\xcd\xed\xb4\xc2\x5f\x81\xa3\x8c\x89\x2d\xd9\xad\x85\x89\xed\xcb\x07\xb0\x88\xe5\x61\x2f\x1a\x04\x14\x04\xeb\x63\xae\x68\xf4\xa0\xfc\xf7\x08\x42\xe0\x3b\x27\xcc\x9a\xb6\xf5\xb6\xb5\x8a\xb2\xb2\x70\xa0\xd8\xe1\x44\xa2\x41\x90\x86\x2e\xd0\x5d\x01\x7c\x29\xed\xd1\xda\xd9\x63\x34\x08\x13\xc0\xbd\xd3\xd2\x1f\xaf\x7e\x39\xfb\x6a\x22\x00\x76\x6f\xa1\xd0\x20\x4c\x43\x88\x06\x6a\x32\x96\x66\xba\x2f\x45\x70\xdd\xa2\x80\x53\x4b\xf7\xb8\xcc\x6a\xf1\xb3\xe7\xec\xa0\x41\x44\x43\xcc\xe6\x59\xcc\xfd\xa6\x78\x77\xd2\xc3\xbe\x39\x31\x58\x68\x79\xca\x0a\xe9\x0b\xf7\x69\x10\x09\xe5\x09\x6f\x66\x79\xde\xba\x75\xdd\x4f\xba\x1a\xa8\x11\xa1\x84\xbf\x0a\x6c\x99\x68\x93\x41\x15\xf5\x44\xd7\x34\x20\x01\xa5\x8e\xb5\x0b\x01\xc4\x98\x25\xbb\x5c\xe7\xb9\x69\x40\x44\xea\x8b\x38\xbe\x95\x8d\xc5\xe2\x3c\x94\xd5\xe6\xdc\x2b\x64\xba\x9e\x94\xc7\x48\xe0\xbd\x29\x60\xf3\x26\x0a\xe1\x7f\x2b\x8e\x03\x24\x19\xec\xd8\xba\x5c\x40\x7a\x3a\xce\xa3\x9f\x4d\x02\x8e\x8e\xec\xf6\x75\xbd\x79\x5d\xef\xff\x44\x6d\xf4\xc3\x6e\x3f\xf3\xa7\x60\xdb\x45\x22\x0a\xe0\x7c\xa8\xa1\x79\x81\x5f\x56\x03\x66\x07\xa0\x27\x82\xa2\x93\x2f\x98\x00\x25\xd1\x90\x7e\xbf\xfe\x94\xa0\x86\x06\x9c\x11\xfc\x22\x96\xee\xa8\x35\xbb\xb6\x58\x42\xd8\xe5\x4d\x68\x90\xb2\x54\x3a\xb7\xf1\x5f\x17\xab\x49\xe8\x5b\x04\xc5\x8d\xcd\x7a\x44\xb7\x2a\x6a\xc6\x2f\x2e\x68\x40\x5d\x08\xed\x28\x4e\xa0\x44\xa5\xcf\x65\x3d\x59\x38\x82\x6a\xdc\x8c\x0e\xfa\x8a\xe9\xff\xf6\xac\x95\x5a\x7b\x81\xe4\x65\xf6\x33\xd3\x50\xe8\x69\x0d\x19\x0d\x14\xd1\xe8\x1b\x66\xf5\xe2\x2d\x3b\x6f\x45\x5d\xbf\x97\x95\xbe\x3d\x2d\x34\x09\xd0\x34\xd9\xa1\xc1\xb9\xbb\x9c\x26\xf7\xd2\x9c\x4a\x17\x21\x9d\xf9\x60\x45\xe7\xcd\x39\x94\x9e\xfb\x8f\xf1\x5f\x06\x9f\xac\xfd\xdf\xee\x76\xa0\x28\x46\xd1\x44\x5d\x43\xd5\xec\xab\x8b\x63\xbe\x1a\xaf\x7d\x30\x32\x70\x64\x27\xfb\x4a\xfc\x84\xfc\xda\x20\xa1\x81\x89\x28\x75\x5c\x66\x7a\x77\xc9\x50\x9a\xb5\x0b\x00\xd0\xc0\x80\xa5\x50\x17\x1e\x82\xf9\x50\x56\xde\x98\x1c\xaf\xae\x30\x08\x02\xdc\x86\x35\xe4\xe0\xd0\x42\xb9\xc8\x4e\xd3\x5e\x29\xa7\xdc\x45\xba\x4e\x65\xe1\xc9\x45\xdb\x06\x4b\x26\xf8\x3c\x5b\xbf\xec\x87\x79\x71\x1a\x06\x8a\x86\xbe\xe6\x3e\x43\x82\x1c\xbf\xdc\x5b\xf3\xdb\xc2\x12\x17\xbd\x7e\x31\x0d\xc3\x28\xb1\x32\x25\xe2\xfc\x20\xa4\xff\x6b\x24\xc0\x45\xf0\x1a\x87\xc8\x1d\x4d\x77\xd7\x8b\x25\x3e\x69\x67\xf9\x64\x91\x2d\x7b\xd2\x27\x8e\x6c\xd5\xb3\x0d\xf8\x63\xb7\xdb\xab\x2b\x8c\x41\x21\x23\xf7\x23\x74\x9b\x57\x98\xa4\x0a\xb9\x80\x67\xbe\x52\xa9\x33\xd8\xc6\xd7\x26\x2a\x40\xe1\x8c\xec\x74\x76\x0c\xf7\x96\xad\x50\x77\x37\xd2\xa0\x9c\x09\xf6\x65\xb7\x7b\x2b\xcf\xad\x7f\x71\x35\x91\x43\x4e\x28\x83\x29\xc0\xc2\x9e\x94\x57\xda\x55\x34\xe4\x32\xb5\x28\xd1\x2e\xbd\xe4\x81\xa2\xfe\x67\xb9\x89\xd1\xf2\xc3\xcf\x3b\xcf\x01\x2b\xbb\xbb\xb1\x17\xcc\xc4\x2e\x3a\xb0\x83\x21\x05\x04\x0d\x05\x57\x92\xe0\x27\x7e\xf9\x32\xdb\xef\x67\x2f\xdb\xd7\xcd\x1f\x7f\xce\x5f\x97\xdf\xff\xec\xba\x68\x2e\x3c\x99\x46\x6b\xcc\xfa\x2d\x3a\x94\x8c\xab\xce\x9d\x99\x43\x73\x8b\x71\xee\xfa\xbf\x26\x5f\x43\x4a\x9b\x13\x43\x1c\xed\xd8\x79\xbd\xc9\xad\xeb\xf6\xf2\x50\x39\xd9\x9b\x6e\x15\x74\x79\x14\x1a\x6a\x66\x99\xf9\xe4\xe5\x63\x91\x67\xbf\x06\x36\x32\x0d\x75\x1c\x24\xcc\x27\x00\xb0\x7a\x67\x80\x35\xa7\x21\x10\x83\xf1\x97\xa2\x6c\x32\x63\x67\xa3\xd5\xd8\xf8\xd4\x95\xa2\x21\xc4\x32\xd5\x4e\x39\x23\x2b\x8e\xd6\x3e\xec\x66\x05\x70\x85\x29\x65\xfb\xb9\x1f\xc5\x09\x61\x85\x55\x06\x8d\xa8\x3e\x6e\xa4\x66\xfc\x65\xa9\x95\x72\x43\x06\x50\xe6\x6f\x66\x88\xa4\x31\x6e\x82\xfb\xeb\x32\x6f\x1a\x1a\x4e\x30\x57\xaf\x44\xae\x56\xc5\xcf\xa1\x86\xaa\xed\x11\x05\x60\x25\x4e\x5b\x47\xef\xa1\xac\x86\x22\x3f\x34\x0a\x13\xa9\x6d\x75\x18\x52\x37\x7a\x52\x96\xdb\x6b\x29\x0a\x8d\xe5\x8f\xc1\xfa\x18\xfd\x3c\x7b\x99\x8d\xa7\x6e\x14\x91\x10\x97\x6e\x0e\x47\x28\x74\x8d\xa9\xa5\x5e\xc8\x98\x46\x11\x0f\x63\x27\x46\x32\x7f\x82\xe2\xf8\xd6\xf4\x2d\x9c\x75\x15\x6f\x3f\xb3\x1a\xf3\x95\x97\xa2\x99\xbc\x4c\xc4\x53\xf4\xa9\x2d\x03\xb8\x1f\xf7\xcf\xa2\x26\x34\x22\x71\x1a\xb4\xef\xb8\x6b\xad\xcd\x65\xe6\x31\x0c\x34\x22\xa9\xc2\x64\x9a\x0f\x4e\x7f\x3d\xcf\x0a\x3d\x92\xe8\x9c\x5a\x99\xfe\x42\xc9\xb0\x06\xfc\x94\x15\xd9\xf3\x30\xc0\x43\x23\xa2\x25\x02\xd8\x5e\xa1\xee\xf6\x9b\xf6\x8f\xc2\xd9\x2c\x8f\x15\x40\x97\xc3\xa2\x11\x65\x0c\x35\x0a\x76\x7b\x87\x42\x14\x7d\x93\xd4\x98\xae\x76\x91\x1b\xff\x57\x1d\x73\xb7\xb8\x57\xc5\x31\x2b\xa0\xa3\x64\xff\x96\x55\x53\x1b\x35\x62\x44\x63\x2a\xab\x9d\x16\x45\xa9\x61\xdf\xd9\xe6\x34\x62\x71\x1c\x86\x3d\xbe\x1e\xf4\x20\xc3\x40\x23\x66\xa4\x37\xb3\xfe\x59\x4a\x4b\xd2\xe3\xc9\xd6\xef\x15\xa8\x4d\x66\x4b\xcc\x24\x1e\x1a\x35\xc2\xdb\xfd\x6e\x06\x7a\x08\x12\xa1\x11\x27\x16\x6d\x79\x16\x1f\xfb\xf2\xb1\xac\x8e\x65\x67\xa9\x45\x3c\x8d\x98\x8d\x3c\xb5\x86\xd6\x64\xae\x71\x11\x33\xc7\x4c\xb2\x2d\xab\xa2\x6e\x44\x75\xaf\x46\x7b\x32\x21\xb8\x01\x8c\x1f\x3a\x4e\x09\xc7\xc2\x82\xe7\x6a\x51\xf4\xdf\x26\x0d\xe3\xb0\x67\xd2\xdb\x89\xec\xc9\xd2\xf2\xac\x74\x36\xe4\x72\x9a\xdc\x5c\xb8\x2c\x15\x22\x0c\xb3\x81\x90\x1f\x8d\x64\x98\xb0\xb4\xab\xe4\xfa\x91\xc3\x13\x88\x9f\x93\xb3\x22\x92\x54\xd8\x3c\x8b\xc8\x8a\x17\x68\x9e\xc4\xa5\x50\x6f\xeb\xa2\xb5\x1f\xb3\x9f\xf0\x6a\x61\x10\x43\xca\x7c\x1a\x49\xad\x71\x17\xeb\x32\xae\x2f\xf0\x6e\x2d\x0d\xd7\x41\x31\x82\x3e\xc2\x23\xd8\xcc\xb0\xdf\x61\x6f\x44\x2f\x69\xa4\x12\x8b\x6e\xa8\x0b\xd1\xa8\xb7\x2f\x50\x95\x93\x27\xd4\x84\x62\x1e\x5c\x7e\x3c\x8b\x5f\xed\x49\x76\x93\xdf\x81\x46\x3a\x26\x82\xd8\x7d\xd9\xe3\x1b\x06\x5b\x7a\xa4\x0d\x20\x37\xcb\x3c\x6b\x4e\xbd\x41\x79\x97\x82\x8d\x46\xc0\x23\xac\x23\x78\xc9\x8e\x50\x65\xe2\x67\x3d\xab\x8e\xed\xa8\xf4\xf3\xc5\x84\xb6\x9a\xb0\x28\x4f\x70\x50\xa2\xd0\x99\x16\x4d\x79\xd0\xe2\x90\x15\xfa\xca\xf2\x8a\x4c\x04\xa2\xc3\x78\xda\x02\xe1\x7a\xb2\xdf\x98\x24\x42\x81\x1e\x3b\x07\x5e\x41\x95\x55\xb7\x99\x19\x1e\x61\xf0\xaf\x42\xba\xad\x2d\x34\xb3\x4b\x25\xe6\x65\x59\x37\xc3\xc2\x10\xff\xba\x46\x07\xc6\x2d\xdc\x6d\xf6\x0b\xf2\x45\x99\x97\x97\x89\x59\x43\x02\x2e\x70\x31\x1c\x50\x00\xa2\x6a\x10\x7a\x86\x72\x37\x63\xa1\x95\xf1\x48\x93\x30\xb2\xe4\x98\xeb\x97\xff\x5a\x39\x3d\x0a\x4a\xc2\xd4\xb2\x62\xf6\xd8\xf1\xd5\x49\x64\xf9\x2d\x56\x0d\x4a\xa2\x48\x61\xb5\x40\x6b\x55\x66\xc5\x71\xad\xf7\xe5\xc2\xee\x0b\x99\x9c\x16\x35\x51\x12\x31\x6d\x39\x26\x5d\x8a\xb2\x3d\xcc\x87\x13\x8e\x44\x71\x92\x9a\xde\x91\xee\xb4\x07\x46\x4b\x85\x44\xb1\x2d\x0c\x39\xba\xfc\xc2\xa3\x17\x83\xa7\x24\x4a\x6d\x26\x14\x01\x93\x95\xee\x8b\x05\xda\x73\x41\x9c\xa7\xcf\xa3\x95\x43\x01\xe5\xf9\xe1\x7c\x56\xdd\x5d\x80\x60\x12\x69\x21\xda\x69\x3f\x4e\xf9\xb6\xad\x29\x8c\x35\x3f\xc4\x47\x55\xe6\xf9\xeb\xa5\x78\xf7\xb5\xe4\x94\x10\x30\xb6\x88\x09\x65\xee\xbc\xe5\xdd\xc1\x8b\xba\xc2\xb6\xff\xf3\x3f\xee\xfe\x34\x54\x81\xf3\xd4\xd6\xdb\x87\xdd\xa2\xd4\x63\x60\x0f\x25\xcc\x49\x47\x1e\xa1\x99\x3f\xac\xfe\x98\x0c\x62\x1c\x31\xee\x1c\x1f\x1b\x29\xb6\x29\xd4\xe1\x92\xec\xee\xd4\xfe\x1c\x8c\xe0\x7f\xcb\x42\xac\x27\x15\x98\x94\xc4\xd2\xe2\x81\x5b\x03\xf2\x2c\xde\x8b\xac\x38\x3e\x94\xd5\xe2\x2a\x1d\x4a\x49\x12\x24\xac\xaf\x8b\xe9\x64\xd0\xb2\xb2\xd8\x95\x97\x4a\x0d\xd5\x56\xfd\x15\x61\x9a\x38\x41\xe5\x9b\x56\x10\x49\xd2\x90\xb9\x2f\x6f\x6b\x78\x71\x76\x5d\xb3\xfc\x53\x92\x08\x69\x81\x26\xad\x41\x8a\x08\x03\x2f\xcd\x33\x1e\x3f\xce\xb8\x27\xdc\xb2\xd3\x20\xcf\xc5\x61\x36\x3f\x04\xe1\x8d\x3a\x15\x4a\xb8\xa2\xbe\x64\xd4\x9d\xac\x3b\xf5\x06\x79\x9e\x15\xc7\x81\xa8\x2b\x25\xdc\x58\x16\x99\xa2\xfc\x99\x29\x58\x5e\x8a\x23\x94\xc5\xba\x6b\x4e\x23\x81\xd5\x59\xae\xa6\xd4\xc5\x43\xd6\x85\x2d\x1c\xb8\x79\x30\x91\x94\x12\x5b\x3d\x9e\x97\x05\xac\xbb\x89\x2a\x92\x18\x99\x13\x6c\x9d\xcf\x3d\x85\x2f\x4a\x84\x0a\xd0\x5f\x3e\xf4\x02\xda\xb3\xa6\x11\xfd\x6c\xf0\xfd\x8c\x41\x83\xc8\x33\xaf\x8e\x4e\x13\x22\x43\x2e\xbd\x78\x82\x6d\x39\x78\x73\x91\xa8\x58\x63\x2c\x7a\x7b\xa9\x60\x5a\x77\x43\x89\x02\x86\x41\xb6\xf6\x4a\x5b\x1c\xef\x1a\x74\x28\x3d\x75\x04\x2a\xef\x58\x09\xb0\x6a\xe2\xf8\x10\x1d\x6b\x15\xf4\x2a\x2f\xdd\x66\xa0\x13\x2b\xb2\xf2\xfb\x66\x22\xe0\x4c\x09\x84\x42\x38\xb7\xde\x16\xfa\x67\x27\xd8\x3f\x6d\xa3\xc9\x9d\x21\x21\xa8\xdf\x94\x15\x59\x93\x89\x7c\x77\x05\x00\x69\xbb\x24\x9a\x8f\x76\x03\xcc\x00\x0d\x72\xde\xd7\xfb\xae\x49\x14\x56\x54\x2e\x67\x9b\xb3\xc8\xf4\xe6\x32\xfd\x22\x26\x95\x48\x75\xbc\x7b\x83\xaa\xcc\x61\xe4\x9b\x10\xa3\x74\xe4\xb2\x26\x19\x54\x70\x1b\x16\x47\x69\x14\x01\xba\x05\x4e\xe0\xab\x2c\xf3\x7a\x6d\x5e\x00\x3a\x15\xf1\xb6\x8b\xc1\x9c\x2e\x96\xd9\x23\x9b\x9b\x43\xeb\xd6\xf7\x31\x5d\x7e\x45\xd2\x88\x05\x6e\x0d\x37\x97\xaa\x00\xdd\xae\x91\x25\xa8\x72\x78\x7f\x1e\xa0\xfd\xd0\xf8\x7a\xe2\xf9\x00\x13\x44\x69\x24\x0c\x26\x08\x0f\x98\x21\xec\x19\xdb\x5d\x33\xa5\x96\x76\xc5\x72\x66\x58\x7a\xa1\x72\xa0\x0b\x35\x5c\x7d\x94\x32\x9b\xf3\xc3\x2a\xbc\xd6\xd2\xb2\xd8\xac\x41\x78\xaf\xdf\x47\xc7\x17\x8a\x88\xf3\x2e\xe3\x88\x03\xfd\x50\x56\xbb\xed\x78\x26\xd0\x38\x8c\x53\xe9\xab\xa4\x1b\x71\x95\x8e\xe8\xba\x09\x1c\x94\xdd\x47\x01\xd5\x71\x5c\x5b\x47\x69\x2c\x08\x49\x27\xd8\x6f\x5b\x94\x88\xe5\x85\x43\x04\x78\x77\x85\xf1\x32\xdd\xcf\xe2\x7c\x6e\x7d\xc6\xfc\x5a\xb7\x9a\xd2\x18\xa4\xee\x43\x38\xaf\x50\x8f\xb7\xd1\x01\xf0\xdb\x56\x0f\x77\x5f\x91\x53\x4b\x81\xfe\x54\x1e\x5f\x4a\xcf\xfb\x4c\xaf\x50\x12\xf7\x75\x9e\x29\xe5\x42\x23\x3d\x4d\x93\x41\x85\x24\x04\xfe\x03\x72\x49\x6d\x60\xf3\x52\xbf\x5d\x1d\xbe\x94\xcb\x18\x93\x1e\x88\x1e\xc5\xdd\x6d\x36\x28\x3b\xa6\x34\x4d\x39\x82\x6a\xdb\x59\xd1\x88\xac\xf8\xed\x33\xcf\x9a\x0a\xa2\xf1\xb8\x9d\xbd\xfc\xfe\xea\xef\x20\x78\x40\x90\x68\xce\xd2\xe6\x1c\xe1\x96\x9c\xe6\xbd\xfb\xa5\x5a\x7a\xcc\xd6\x3d\xe0\x82\xeb\x2a\x43\x8d\xfe\xca\xa2\x3c\x9d\xc1\xea\x62\x23\x33\x63\x76\x55\xf8\x43\xa9\x4c\x04\x25\x63\xbe\xf7\x2b\x20\x7d\xdb\xcb\x8e\xe8\x21\xab\x3d\xc5\xd2\x8d\x6a\x07\xd7\x59\x19\x82\x05\x5c\x2e\x4b\x8d\x29\x87\x68\xc4\x48\x45\xa9\xe6\x61\xdc\x69\xda\xd6\xaa\xff\xb3\x75\x64\xe5\xa5\x2a\x9e\x45\x7d\x8b\x94\x60\xf2\xae\xd0\xfe\xbf\x43\x12\x94\xcd\x08\xda\x33\xe8\xc4\x65\x44\x07\xbc\x66\x77\xab\x58\xaf\x6e\x6f\x84\x4c\x68\xaf\x1e\x70\x17\x6b\x44\x59\x10\x13\x74\x80\xcb\x1f\xe2\x94\xb9\xf3\xd6\xa3\xd9\x5c\xd9\x02\x65\x21\xa5\x89\x4b\x9c\x96\x97\xe6\x01\x60\x8a\xd5\xa1\x2c\x14\x92\x71\x4f\x3e\x04\x97\xba\x73\xe3\x58\x24\x42\x3c\xed\xba\xda\x64\x09\x05\xa0\x0c\xb6\x07\x5c\x53\x16\x19\x82\x58\x95\x5a\x7c\x3c\x96\xa5\x96\x1f\xdd\x7d\x09\x63\x48\xc6\x6d\x6c\x09\x2d\x7e\xec\x8e\xf3\x02\x63\x29\xc4\x77\x65\x81\xed\x6a\x51\x37\x3f\x40\xa3\xac\xe2\xc4\xb8\x62\x2c\xe1\x9d\xbd\x77\x72\x7a\xc4\xed\x91\xde\x3d\x0b\x53\x12\x75\x7d\x57\xdb\x81\xb7\xce\xe2\x90\x60\xc0\xbc\x74\xda\xbd\x07\xc4\x08\x4e\xbd\x26\x5c\xce\xff\xcd\x26\x9f\x83\xc5\x3a\x48\x5c\x76\x65\x2b\x9a\x0c\x41\x05\xe7\xfc\x63\xe2\x0a\xfc\xe3\x06\x8f\x1a\x65\x49\x18\xd1\xa1\x1c\xf8\x6c\xff\x32\x79\xa3\x24\x22\x58\x25\x9e\xb5\x2b\xa0\xe7\xda\x9e\x4e\x0a\xc6\xa9\x65\x99\x71\x85\x44\xe3\x8a\x06\x27\xc7\x7f\x27\x98\x78\x75\x8a\x0d\xfe\x8b\xff\xcf\xa0\x6b\xfc\x3f\x57\x77\xe0\x7e\xb3\xc4\xb8\xfe\x55\x81\x44\xf7\x70\x1a\xc9\xe8\x16\xa2\xd2\x0f\x65\xd9\xc8\xd6\xf2\xe9\x02\x85\x8c\x6b\x40\x3e\x71\x28\x6a\xb4\xe3\xb6\xbf\x7c\x4b\x4a\xe2\x50\x7b\xb0\x5c\xd3\x3a\x58\xc3\x63\x89\xa5\x82\xa3\x4b\xba\x85\xaa\x86\x6c\x78\xfe\x33\xe1\x2b\x60\x41\x9c\x66\x85\x76\x15\xf1\xf5\x54\xb0\x98\x32\xa1\x6c\xad\x8d\x0f\xa1\xec\xb2\x63\xe1\x72\x74\xe3\x2f\x21\xb9\xc4\x88\x45\x6d\xc3\x35\x93\x46\xa5\x89\xe8\xe2\xb7\xa2\xfe\x01\xcd\xea\x17\x56\xe4\x4e\xfa\x69\x8a\x44\x1e\x58\x72\xe3\x20\x1a\x30\x2b\xb4\x95\x72\x18\x96\x38\x50\xa6\x68\xec\xd9\x00\x0f\xa8\x58\x79\x27\xf0\xf2\xf9\x26\xcd\x54\x6c\x04\x0c\x38\xaa\x3a\xdb\xec\x16\xdf\x33\x65\x2a\x4d\x11\xab\xbb\xfb\xb2\x1d\x0d\xa8\x4a\x85\xe2\x9d\x25\xf3\x9c\xfd\xea\xc5\x46\x28\x53\x3a\xc0\x38\xaa\xbc\x14\x3a\x87\x1b\xfe\x04\xd3\x29\xd3\x36\xba\x79\x9c\x67\xda\xd6\x56\xde\x48\x0b\xde\x4b\x3c\x8f\x6c\x6c\xa6\xa5\xc1\x9b\x39\xa5\x36\x0c\x11\xf8\x47\xd1\x0a\xd0\x2a\xf4\x2a\x6e\x58\x50\x7c\xdb\x9b\xc4\x9b\x46\x41\xcf\x49\x45\x99\x36\x42\x27\xce\x82\x99\xed\x27\x51\x31\x06\x61\x62\x8b\x14\xd0\x1c\x79\x44\x95\x4e\x5f\x68\xea\xee\xe6\x7b\xc6\x36\x58\x22\xcb\xf2\x47\x56\x1c\xe7\xde\x4f\x99\x4c\x07\x13\xe8\xd0\x02\xa3\x8f\xc7\x1c\x1c\x6d\x38\xca\xea\xfb\xd7\x31\x09\xc3\x0c\xe1\xe6\xbf\xf6\xc3\xcf\x11\x07\x8a\x60\xb1\xd9\xb6\xfc\xfe\x9c\xcd\xfd\x5f\xc3\x40\x61\x41\xd1\x6c\x39\xfb\xa4\x42\x81\xc6\x21\xb3\x02\x34\xaa\x7d\xaa\x7c\x00\x3e\xf0\xed\xa0\x31\x42\x30\x22\xdb\xde\x7d\xdd\x6e\x3d\xeb\x12\x8d\x43\x03\x24\x9d\xc8\xf0\xb5\x7b\x37\xd6\x68\x43\x71\xad\xc0\x78\x33\x03\x1a\x93\x50\x5a\x30\x96\x27\x1b\xed\xf7\xb8\xf1\x3c\x8e\x89\x8e\x65\x0f\xd6\x9d\x67\x5a\x4f\x13\x57\xad\x93\x27\x88\x97\x25\xdc\x35\x55\xc7\xc5\x42\x63\xca\x19\x62\xb9\xcc\x65\x40\x38\x4a\x63\x2a\x43\xb4\x0b\xf6\xaf\xeb\xaf\xcf\x9f\x0e\x19\xd3\x36\x20\x35\xcb\x33\x28\xfa\xc2\x21\x1a\x23\x1a\x73\xb8\x87\x17\x7a\x44\xf5\x38\x7e\xc4\x38\xb6\x0e\xa0\x7b\x8b\xce\x33\x8c\xe3\x54\xe3\xf6\x32\x17\x7a\x9e\x35\x6a\x40\x58\x49\xe3\x58\x19\x9b\x87\x70\xb4\x17\x79\x7e\x95\x06\x8b\x93\x94\x60\xd5\xdb\x40\x60\xad\x6b\xb1\xa5\x30\xb9\xa8\x9b\x43\x61\xd5\x87\x5d\x13\x27\x11\x9e\xaa\xee\xd4\xb8\x87\xc0\x19\x5a\xb2\x31\x57\x41\xea\xed\x73\x64\xb3\xc3\x8d\xe0\x32\x10\x7d\xa3\x71\xaa\x08\xa6\x41\x3b\xb3\xb4\xfb\xbb\xa5\xc6\x38\x42\xf3\x92\x29\x40\xa2\x8b\xf1\x6b\xa4\xc0\x13\x0b\x28\xfd\x3d\x53\x3f\x4a\x63\xc6\xe9\x9f\x58\x69\xeb\x62\x9c\xcb\xba\x39\x97\x05\x2c\x2f\x70\x57\xa2\x96\xc6\xca\x44\x18\xef\xb5\xda\xe5\xb8\x80\x6e\xc2\xc7\x68\xac\xa9\xb1\xeb\x29\x17\x1f\x7f\x84\x81\xcf\xdb\xc6\x9a\xd9\xcf\xfe\x02\xcd\xa2\x67\xd7\xa1\xb1\x4e\x9d\xec\x3f\x34\xbf\x5f\x74\x59\x77\x9a\x44\xfd\x8f\x43\x1a\x40\xd2\x05\x84\xe6\x9e\xf2\xaf\x75\x43\x04\xe5\x3d\xdb\x81\xdb\xf5\xfb\x5d\x28\x36\x91\xc5\xe6\xb7\x06\x30\x92\x09\xd4\x4f\x60\xba\x99\x62\xa2\x14\xad\xf8\x45\xf5\x71\x6e\xca\x7f\x0a\x0d\x5d\x4b\xc2\x31\x3f\xd2\xc9\x02\x65\xc5\x11\x6b\x0f\xfb\x38\x79\x6c\x80\x21\x7c\xd9\x82\x9a\xdf\xb2\xb3\xff\xe8\xae\x82\xed\x0e\x3d\x5c\x7b\xa1\x42\x63\xd2\xb3\x78\xcc\xb4\xfe\x64\x03\x1f\xae\x9d\x24\xd0\x32\x32\x5d\x24\xcb\xab\xda\x8c\x6e\x9f\x84\xcc\xd6\x5f\xb7\x3b\xef\xd7\x22\x53\x65\x75\xc7\x67\x4f\x48\xc0\xf1\x0d\x6c\xc4\xc6\xdb\x8b\x1d\x5b\x71\x7d\xa5\xc7\x7b\x73\x36\x0f\xe7\x74\x42\xb8\xc2\x52\x8b\x93\xf8\x01\x63\xcc\xdb\xdf\xca\xc6\x24\x44\x12\xdc\xa5\x91\xc2\xcc\xd9\x18\x70\x97\xbe\x8c\x26\x54\x6b\x8a\x68\xd1\x8b\xfa\xf1\x81\x22\x8a\x8b\xcb\x79\xb8\xbf\x27\x0c\x08\x82\x79\x9e\xd7\x2f\x87\xf9\x6a\x7f\x98\x3d\x6f\xbe\xbe\xec\xfb\x56\x6b\xb3\x2f\x1f\xf7\x07\x35\x8e\xb5\x24\x09\xa1\xd2\xa5\x6e\x10\x93\xdd\x15\x2a\x4f\x2b\x3b\x68\x92\xa4\xf6\xb4\xc3\xe2\x39\x8d\x33\x62\x20\x67\x49\x13\x4e\x63\x0c\x00\x19\x18\xe5\xe1\x92\x94\xd2\x80\x78\xee\x5e\xbc\xe1\xc6\x38\xc9\x76\x75\x03\x9f\xef\xae\x12\xc2\x06\x63\x2b\x4f\x98\xeb\xcf\xf3\x44\x32\x85\x41\x8c\xf3\x45\x8e\x8a\xc2\x68\x22\xe3\x00\x63\x4b\x18\x1c\x59\xeb\x7d\x69\x1f\xb2\xaa\xc4\x2d\x9f\x30\xd1\x41\x64\x19\xb7\x5a\x77\xf9\xa1\xb5\x17\x7d\x03\x33\x96\x84\xd1\xe1\x61\xb2\xc2\x94\x5d\x9b\x0e\x30\x17\xa8\x44\x9e\xef\x6e\xd2\x92\xfd\x8d\x19\x04\x71\x68\x1c\xfa\xe2\x49\x54\x47\xf0\x20\xe0\x19\xd2\x73\x89\xfc\xf6\x71\x90\x98\x24\x40\xcf\xca\x46\x58\x07\x47\x30\x0f\x42\x2d\x2c\x8b\x79\x9e\x81\x79\x6d\xbf\x62\xd7\x14\xa5\x21\xb7\x2f\x33\x2e\xe3\xf4\xed\x3a\x08\x1d\x24\x3b\x53\x65\x3d\xa4\x44\xa4\x3c\x8c\x12\x2c\x06\xb3\x7a\x7a\x35\x0c\x61\x08\x3c\x34\x01\xf7\xc8\xd4\x6f\xe5\x45\xbd\x79\x3a\xa7\xee\x89\x79\x14\x5a\x51\xcb\x37\x51\xb7\xce\x6d\x77\xdf\xc8\xf1\xd9\x5b\xa0\xdb\x3c\xd3\x0f\x65\xb5\xfb\x01\x8d\x7a\xbb\xbd\x8c\x79\x14\xcb\x44\x74\xc6\xd4\x6e\xf4\xdd\x79\xa4\x18\xd6\x5c\x56\xa2\x81\x8d\xd9\x8a\xea\xc7\xa0\xca\xc1\xf5\x21\x91\xc2\x45\xf4\x06\xa2\xf9\x7a\x1b\x47\x4c\x39\xa1\x4c\xf9\xc8\x95\x13\x7c\xbe\xb5\x45\x71\xe2\x68\x3a\x9e\x45\x25\x21\xcf\x05\x1e\xbf\x7f\x99\x36\xe3\x24\x8e\x30\xcc\x68\x31\x0e\xdf\xdb\xe5\xdf\x9d\xae\x9c\x08\x42\xbc\xe0\x38\xc6\xce\xd7\xc5\x32\xab\xcf\x97\x49\xf1\x34\xe5\x04\x14\x5a\xfa\xe2\x7c\x1e\xa8\xe6\xba\x46\x2a\x00\x63\xdd\x07\xa1\xf5\xe2\x4d\xb4\x4b\x7d\xe0\xda\x0d\xd3\x60\x9c\x71\x22\x7b\xbb\x78\xe1\x72\x74\xd7\xba\x2c\xa3\x57\x60\x4a\x61\xaa\xf7\x71\xbe\x3d\x6c\x4e\x45\xa6\xcb\x3c\xef\x12\xe5\x9c\xe9\x38\x71\xe3\x67\xb9\x86\x7a\xe2\xbc\xee\xbc\xe2\x0c\x22\x18\x28\x41\xdc\xd1\x78\xa5\x3c\x0e\x09\x72\xc0\x2d\x33\x71\x2a\x0b\xaf\xe0\x33\xdc\x5a\x78\x1c\x5a\x1c\x7d\x0d\xd5\xcf\x4c\x81\x97\x84\xf1\xad\x51\x08\x6d\xeb\x2f\x3b\xde\x23\x6f\x90\xc7\x54\xa1\x21\x66\xc5\x59\xa6\x3f\xcd\x0d\x3a\xfe\xa8\xe7\x8e\xbf\x88\x47\xea\xf8\x3b\xc4\x42\xe0\xda\xc8\xea\xfe\x30\x1c\x7f\x0c\x9e\x10\xe2\x62\x2f\xa8\x9e\xac\x06\x39\xdf\x90\x7a\x17\x38\xa4\xd7\x18\x1d\xbf\xf7\x73\xae\x2c\xdb\xbf\x3f\x77\x5b\xf3\x66\x61\x99\x21\x07\x36\x00\x4f\x89\x51\xd2\x17\x86\x7c\xbb\xaa\x71\xa4\x5c\x04\x0a\x59\xcc\xed\xc7\xee\xa0\x2b\xe3\xd7\x16\xcc\xc2\x9d\xb2\x7a\xf7\x56\x56\x8d\x07\xd3\x22\x95\x4e\xbf\x76\x85\x20\x32\xf4\xfc\xa1\x8e\x47\x70\xfe\xf1\xd2\xd7\x60\xfb\x7e\x3a\x4d\x4c\x9f\x6a\xf8\x3f\x51\x82\x50\x2e\x09\xc3\x6d\x09\xd9\x1b\xce\xa5\x07\x64\xde\x2e\xf3\xf6\xd7\x24\x0a\x2b\x3d\x3b\x45\x1c\xff\xc8\xd2\x24\x89\xe5\x32\x52\xe5\xcf\x3b\x44\x92\x94\x2b\x16\x22\x4d\x68\x56\x3f\x7f\x6c\x73\x51\xc0\xf4\x8b\xab\x34\x42\xf0\x98\x14\xad\xf7\x3d\xcb\xf3\xd1\xc1\xc4\x75\x4c\x90\x2e\x73\x59\xaa\x4b\xfb\xeb\xa2\xfa\x98\xa4\x36\xb8\x4e\x22\xaf\x99\xbb\x59\x3c\x4e\x86\x5f\xa7\x80\xa5\xbe\xb6\xd0\x0e\x37\xba\xb5\x2a\x27\x9d\x80\xa6\xe8\x02\xe9\xdd\x6a\x7f\xf8\x63\xfe\x84\xca\xd0\xab\xdd\x6e\xda\x2d\xb6\x96\xa8\xb2\x53\x73\x40\xbc\xfd\x79\xe8\x95\x9b\x40\x62\x78\xbc\x35\x6d\xc7\xdf\xd3\x50\x9b\xab\x6a\x2c\xb7\x6c\x59\x8d\x95\xee\x29\x37\xd2\x72\x6f\x9d\xb2\xc2\xc3\x05\x6f\x98\x35\xbe\xb3\x63\xb3\x58\xcd\x5f\x9d\x00\x2a\x4d\x03\x95\x08\xee\x15\xb6\x61\x2c\x3c\x46\xd3\x90\x50\x9f\xaf\xc4\xbb\xd7\xd9\xf1\x86\xbe\x3d\x4d\xc3\xd8\x60\x0a\x7e\xc0\x15\xef\x68\x02\xa7\xf0\xe2\xc9\xfd\x4d\x20\xdd\xfd\x9f\x9e\xbe\x1d\x40\x67\xcd\x21\x1e\x0d\x41\x1a\x85\xdc\xd3\x26\xb5\x56\xb2\x2d\x62\xf7\x4f\x1f\x71\x8d\x31\xda\x77\x51\xb7\xe7\xd3\xaa\xe8\xd3\x36\x29\x49\x42\xe8\x62\x86\x5e\x1a\x6e\xdd\x4d\xd0\x94\x24\x56\x18\x53\x68\xbd\x12\x55\x01\x13\xef\x20\x25\x3a\x31\xed\x56\xb6\xc8\x2a\x75\xc9\x9a\x79\x05\xe2\xc7\x7d\x46\xb3\xc9\x8b\x11\x88\xa9\xa5\xf8\x47\xdd\xd5\x7d\x39\x7e\x29\x2a\x19\x82\xb0\x15\x94\x33\xad\x17\xe5\x64\xc6\xa5\x54\x69\x54\x5c\x85\x81\x02\xaa\x6f\xd2\xee\x93\x08\x5b\x98\xea\xff\xce\x62\x2a\x5d\x4c\x7e\x63\x05\xba\x1d\x0d\xc4\x75\xc2\xf4\x66\x0d\x0b\x4d\xe3\x24\x71\x3f\xda\xcb\x5a\xf8\x26\x6e\x98\x3b\x64\x0e\xae\x84\xfc\x90\xa9\xb2\xc8\xfe\x7d\x10\x95\xcc\x9a\xfa\x70\x86\xea\x00\x43\x79\x51\x77\x65\x12\x46\xa9\x0b\x0a\x60\xfe\xd8\x66\xb5\xa7\x9d\x62\x49\x5d\x14\xf1\xe5\xdc\x2e\x82\xf1\x83\x25\x5c\xe1\xae\xf6\xbf\x70\x92\xe0\x43\x8f\x69\x22\x2d\x48\xe2\x70\x84\xe6\x41\xd4\x6f\x59\x59\x6c\x45\x25\x4e\xd3\x7b\x4b\x1b\xf8\x2b\x1c\x2a\x08\xfd\xb5\x6a\xfc\x39\x12\x4d\x3c\x13\xeb\x62\xf1\xc5\x4e\xc3\x90\x8f\xfb\xf0\x90\xc5\xe0\x14\x65\x16\x9b\xf9\xc5\x47\xac\xd3\xb4\x7d\x40\x57\x88\x64\xc3\xe4\x5d\x4b\x6c\xd3\x24\x07\x47\xdb\xb6\xf8\x50\x39\xec\x7e\x74\xc5\x05\x69\x0a\x11\x92\xc9\xad\x5e\x17\x49\x92\x2c\xe1\x54\xfe\xe5\x86\x9b\x0a\x48\x31\xab\xd2\xba\x90\x7d\xbd\x08\x4d\x55\x90\x38\xda\xf9\xde\xe1\x18\x0f\xa3\x0a\x64\xe4\xe2\xe0\xd6\x23\x78\xde\x3d\xf8\xab\x35\x8b\xb5\xf4\x07\x8c\x9b\x38\x55\x79\xf6\xfb\x4c\x0a\x44\x61\xfc\xd0\xd1\x4e\x95\xea\x33\xf2\x45\x7f\x0d\x08\xfc\x6c\x1d\xf8\x6d\x21\x6e\x04\x2e\xba\x03\x35\x05\xa3\x63\xe8\xc9\x9f\x56\x3f\xa1\xfa\x90\xa5\xee\x06\xda\x04\x21\x46\x00\x4c\x26\x9a\x11\x1f\x13\x15\x01\xd5\x81\x25\x5e\x50\x65\xd1\x7a\x20\xba\x6b\xe1\x51\x1c\xf8\x8c\xaa\x05\x13\x62\xfa\xf5\xd3\x1d\x59\x44\x01\x44\xba\x4b\x53\xb4\x46\x44\x59\x94\xd5\x2d\x35\x53\x2a\x22\x92\x60\x91\xf5\xb7\xd5\xe3\xec\x65\x68\x2a\x09\x12\x4a\x4f\x3a\xfe\x0a\xff\xbe\xb4\x07\xfa\x2b\x9c\xcb\xaa\xa9\xb7\x50\xd9\xff\x82\xea\xa1\xac\x9c\xe0\x9d\xff\x8b\x45\x77\xfa\xa1\x17\x34\x24\x18\xce\x51\xbe\x4a\x0a\xd6\x85\xe3\xcc\x18\xfd\x1a\xe5\x34\x4d\x3d\x7e\xa0\x81\xa3\x67\x8a\xf2\xcd\x82\xa1\x2b\xd9\x40\xdd\xcc\xb3\xa6\x5e\xfd\xfb\x22\xf2\x11\x47\x32\x15\x4c\xc4\x24\xea\xcd\x0c\x51\x7c\x38\x23\x63\x64\x63\x09\xc4\xf6\x23\x6d\x7d\x5d\x0f\x02\x6d\x22\x8e\x63\xe3\x2e\xef\x8b\x86\xd7\x45\x0d\x55\x83\x2c\x77\xdd\xef\xc4\x3c\xb5\xda\xed\xd6\xd9\x6b\x76\xc3\xf2\x90\xdb\x5f\x24\x51\x0a\xeb\x04\x3c\x5a\x75\x1c\xcf\x12\x89\x4e\x90\x7b\x40\x66\xda\xcb\x34\x8f\xaf\xe7\x81\xf5\x6d\x91\xb4\xcf\x06\x1e\x6f\xff\x10\x27\x1a\xe3\x46\x87\x01\x31\x9a\xa3\x87\x2a\xd4\xdb\xb5\xa9\x3e\xbe\x5a\x48\x48\x2d\x39\xd2\xc7\xea\x17\xa8\x71\xef\x49\x5f\x19\x11\x24\x34\xf2\xc2\xe9\xd6\xc6\xdc\x35\xa2\x75\xa5\x1e\xa0\xab\x5e\x12\x92\x24\x54\x7a\x0e\xe4\x0a\x84\x76\x8e\x52\x8d\x6e\x76\xbb\x5e\xaf\x52\xe9\x42\xd2\x04\x83\x41\x3f\xcb\x06\xbe\x43\x76\x7c\x6b\xbe\x16\xd9\x55\x27\x11\xc5\x2e\x4c\xe0\xe9\x57\x86\x4a\x14\x7f\xcf\x6c\x14\x2a\x8c\xd0\x38\x3d\x39\x0b\xe1\x9e\xfd\x21\x54\xa4\x30\x08\xf3\x5d\xfc\x84\x7a\xc4\xb4\x44\x85\xd2\x12\x8f\x35\x9d\xd5\x28\xfb\x62\x3f\x73\x8f\xa3\x10\x0a\x0c\x46\x54\x0a\x78\x9f\x6f\x7f\xfb\x8c\xfc\xfe\xd6\x66\x24\x74\x1c\xa0\x1f\x68\x8d\x71\x0c\x21\xd9\xa3\x88\x4c\xc6\x44\x2b\x1b\x3a\x71\xe0\x3d\x57\x7e\x80\x65\x86\x77\x10\xb5\x02\x28\x65\xa1\x4b\x3c\xc1\xba\x1e\xe2\x3c\x05\x08\x86\x6d\x95\x28\x74\xe1\x15\x2d\xa9\x30\xc2\x42\x63\xaa\x51\x61\xfa\x38\x8b\x22\x8c\xb2\x82\x7b\xa7\xac\xd8\x59\xa1\x17\xa7\xd3\x88\x86\x6a\xfd\xd6\x8f\x8e\x0c\x52\x1a\x44\xde\x8b\xb6\x85\x5d\x9e\x57\x77\x7c\x0a\xc8\x90\x44\x98\x77\xf3\xd9\xa6\x25\x74\x98\xe4\xd1\x88\xc9\x08\x64\xd4\xe7\x52\x3c\xab\xf6\x88\x61\xcc\xf5\x24\xc4\xea\x2a\x3a\xa6\xf1\x3b\xf8\x79\x49\x64\x67\xc9\xb5\xc6\xda\x15\x6f\x2e\x95\xad\x75\x93\x76\x91\xb1\xf5\x74\x52\x4b\x0a\x56\x9b\xe7\x2c\x3e\x5e\xe1\xaa\x18\xd2\x75\x62\x0c\x70\x01\xef\xbe\x3e\xed\x67\x5d\x44\x4e\x26\xcc\x16\x12\xf7\x52\x4d\xbe\xf4\xea\x76\x19\x3a\x95\x89\x09\x31\xc2\xf7\x7a\xc9\xbb\xb5\x28\x39\x49\x84\x74\x8c\x78\x88\xc8\xf8\xdf\x4e\x39\x8f\xca\x54\x09\x64\xad\x2b\xca\x99\xfe\x09\x95\x37\x35\xa5\x8a\xad\xa8\xc3\x2c\xcf\x5b\x73\xac\x80\x0a\x55\x80\xc7\x3f\xa7\x78\x84\xd5\x34\xda\x27\x1d\xed\x43\x4d\xe1\xa7\x52\x93\x00\x0b\x5c\xb4\x8b\x54\x74\x73\xa7\x3b\x49\xa5\x4e\x02\x54\x40\x7b\x17\x1d\x0a\x4d\x6a\x9e\x60\x09\x5f\xad\xde\x40\x5f\x72\x58\x88\x3c\x9f\x6c\x4f\x9f\x80\x6c\x25\x70\x8a\x87\xef\x0b\xbc\xb7\xcb\xc2\xc6\x96\x6f\x2e\x07\x09\xd2\x12\x3c\xb5\xa3\xd3\x05\xb1\x27\x2f\x01\x12\xb0\x26\xe0\xf0\x50\x01\x2c\xbb\xe4\xa0\x34\x2a\xc5\x80\x26\x0e\x2f\xc2\xac\x9e\xb3\xce\x64\x57\x61\x62\xbf\x7f\x0d\x0d\x96\x33\x5c\x0b\xa4\x52\x15\x31\xc6\x1c\x5a\x62\x29\x3e\x86\xe1\xb7\x69\x48\x49\x45\x89\x41\x12\xcb\xcc\x66\xb5\x37\xd5\xe6\x7c\x67\x89\xab\x48\x26\x28\x99\x73\x2e\xdf\xa1\x02\x7d\xb8\x78\x1b\x4e\x11\xa2\x08\x19\xc8\x91\x8d\x03\x7e\x2e\x24\x75\x73\x82\x29\x42\x09\xe2\x59\xde\x4a\x9d\x7f\x5e\x72\xa3\x48\x62\xa5\xf0\xe5\xe5\xe3\x55\x54\xb0\x6e\xe0\xae\x4c\xb5\xbb\x82\x06\xc4\xd3\x84\xac\xf6\x5f\x7e\x4d\x30\x81\x8a\x06\x56\xcd\x62\x39\x48\x63\x29\x1a\x45\x3a\xc0\xf5\xd5\xf9\x0c\xfb\xf2\xeb\x7c\x23\x47\x54\xc9\xbe\x33\x4f\xc0\x26\x82\x76\x4d\x89\xa0\xae\xb5\x2a\x37\xc5\x17\x51\xe9\x45\x17\x27\x54\x31\xe1\x7a\x08\xa0\xc0\x4f\xb6\x2f\x2d\x47\x91\xaf\x0d\x9f\xe2\xb3\x6e\x0f\x57\x1c\x13\x2f\xa1\xf5\x75\x5d\x34\xd7\x3c\x98\x54\x25\xb1\x25\x94\x86\x42\x0f\xe1\xb8\xfe\x61\x12\x49\x50\xc7\xe0\x9f\x98\x4f\xcd\xa7\x17\xcb\x84\x3b\x8e\xa2\x4d\x75\xfc\x94\x5d\xfc\xc6\x7e\xa9\x78\x92\x60\x80\xd9\x15\x81\x3e\x65\xff\xbe\x60\x70\x6f\xff\x76\xa3\xd8\x5a\x71\xae\xe3\xc8\x01\x2e\x97\x70\xba\x54\xd5\x20\xf2\xe9\xfb\x28\x5b\x03\x63\x39\x8e\x9e\xb3\x02\x74\x87\x6c\x9c\xf4\x04\x8e\xf1\xc9\x6d\x59\x0e\xbf\x67\x1a\x93\xc8\x9d\x0a\x3d\xae\x62\x73\x9e\xe6\xfe\x55\x1a\x33\x3c\x8d\x6c\xd8\xed\x79\xbf\xf8\xeb\xc0\xaa\x12\x31\x4d\x7a\xe2\xdc\xf5\x69\xf0\xf8\xd7\xb1\xb5\x01\xf0\xe4\x93\x11\x14\x32\x00\xb7\x94\x3c\x16\xaa\x13\xd7\x1a\xc8\x85\x50\x25\x4c\x14\xba\x20\x9f\xd3\x4c\x87\x06\x54\x33\xa6\xab\x18\xc5\x5f\x47\x48\x70\x25\x99\x0d\x91\x3f\xb4\xee\x9a\xbe\xc1\xcc\x42\x95\x94\x1a\xe3\x88\x36\xdc\xe1\xc3\x7f\xb7\x37\x07\x29\xb5\x72\x50\xd6\xee\x4c\xb9\x41\x72\x32\xb9\xc8\x68\xcb\x0d\x76\xb0\x26\xc9\xe1\x8c\xe1\x2f\x9b\x33\xfc\xda\x64\x79\x7d\x33\x25\xa4\x54\x42\x22\xcb\xb2\xd5\x54\x19\xfc\x1c\x07\x00\x95\x4a\x12\x2f\x62\xd4\x6e\xd3\x4b\xd1\x88\x4d\xb1\xba\xf6\xcb\x95\xd2\x89\x08\x3a\x5b\xbd\x3c\x89\x81\x03\xe2\x62\xe0\xf3\xd2\x05\x62\xfd\x74\xd2\xa1\x41\x0e\xb1\xae\x5c\x6e\x5a\xc2\x79\xc3\xab\x53\x9a\x5a\xbe\x0a\x8c\xeb\x52\x9b\x4a\x7d\x85\x93\x18\x60\x64\x15\x84\x56\x90\xac\x9d\xe6\x18\xf9\x1c\x02\x80\x14\x80\x46\xc7\xc6\x81\xd0\xea\x7d\x76\x82\x9e\x28\x8d\x2a\x30\x0a\xe9\xcf\x4c\x9e\xfd\x7b\xf4\xbc\x26\xd6\x89\x05\x6f\xcc\x31\xe8\xfb\xdb\x8d\x63\xce\x77\x4d\x43\x8c\x23\xbe\x5c\x4e\x59\x7d\xf2\x25\x35\x3a\x20\x81\xdf\x72\x90\xe4\xd0\x64\x6a\x18\xd6\xfb\x74\x07\xd6\x01\x09\xd1\xde\xd9\xe6\x42\x8c\xc5\x61\xa8\x0e\x98\x15\x9b\x72\x04\xa8\xa2\x6e\xbe\x67\xf9\xb4\x3a\xe5\xd6\x22\xd1\xed\xbe\x4d\x11\x6f\xd6\x5e\x5b\x83\x53\x0e\xe8\x2a\x06\x87\xcf\xc2\xfd\x35\xda\x46\xa3\x9c\x58\x76\x53\x95\xb9\x15\x53\xfd\x9e\x35\x6f\x5b\xd1\xae\xb4\x97\xb2\x59\x17\x5f\xbb\x40\xbe\x0e\x80\x93\xf6\xa8\xfd\x5f\x5b\x1e\xf6\x3d\x2b\x06\x12\x7d\x54\x87\x11\xa8\x78\x5c\xb0\xb8\x3e\x9b\xba\x2f\xc0\x8c\x82\xc9\x68\x60\x39\xb1\x3b\xbb\x6d\xea\xc0\x72\xb1\xdd\x9a\xe4\x9a\xd0\x80\xb2\x49\x40\x26\x0a\x46\x53\x5d\x13\x48\xd0\x7d\x72\x45\x61\xf7\xa4\x37\xa8\xa6\x01\x61\xd4\xb3\xb0\x8e\x17\xfb\xe4\x19\x5b\x9f\xc9\x15\xee\xbc\xc0\xaf\xe6\x77\xb8\x21\xff\x40\x35\x55\x1c\xbf\xdd\xfe\xcf\xed\xea\xf0\x65\xb6\xfb\xe2\x07\x85\x11\xae\x1d\x3d\x5e\xd5\xac\x55\xd9\xfd\x3d\x26\xf6\x64\x28\x2f\x32\x07\xac\xe8\xd8\xc1\xb1\x5d\x38\xbb\x7c\xc8\xf4\xf0\xa9\x09\xa0\x59\x22\xd0\x31\x79\x14\x59\xb1\x87\xd3\x79\xd7\x5c\xcc\xd8\x06\x9e\x7a\xa3\x9a\xf1\x08\x4b\x0a\x32\x5f\x40\x37\x3c\x14\x3b\x76\x7b\xdf\x39\x8d\x2c\xf1\x67\x56\x1c\x07\x44\x84\x54\x33\x1d\x60\x90\xd5\x51\x88\xcd\xcb\x11\xe7\xe6\x28\xb3\xa9\x63\x91\xa2\x20\x85\x75\x12\xb0\xf8\x57\x54\xe2\x04\xcd\x20\x4f\x39\x79\xc8\x84\x71\x4c\x93\xfc\xe1\xfe\x2f\x98\x78\x64\x3a\x49\xad\x84\x6c\xe6\x5c\x54\xaf\x5f\xbe\x80\x0a\x2b\x92\xd6\xcb\xb1\x01\xf1\x39\x36\x4d\x73\x66\xa1\x2f\x16\x64\x6e\x65\x03\x6e\x6e\xd1\x3a\x0d\x98\x15\x08\x6a\xed\x68\x07\x54\x75\x66\x91\xf7\x07\x74\xca\x25\x7e\x73\xa7\x25\x63\x03\x5d\xae\xa6\x72\xcc\x85\x37\x7e\xa9\x94\x1b\x0c\x76\x65\xf5\xae\xcc\x7f\x76\xf1\x2a\x9d\x0a\xab\x6b\x3f\xcb\xaa\x65\x55\x9e\xef\xc5\x03\xf9\xed\xf8\x83\x16\x5c\x68\xd2\x71\x47\xed\x60\x98\xe3\x9b\x76\x95\x01\x1a\xae\xb9\x28\xf4\x49\x54\x3f\xac\x98\x6e\x03\xe7\x25\x14\xe5\x29\x2b\x7a\xee\xcf\xb6\x6f\xc4\x9d\x53\xfc\xfd\xcb\xe3\xb2\x2c\x46\x98\x05\xdf\x49\x93\xc8\xf4\xb5\xda\xc8\xf2\x38\x1e\x50\xc9\x04\x26\x1b\x66\xaf\xcb\xf9\x50\x4b\xce\xdf\x41\xc5\x1c\xe1\xea\xeb\xa7\xf2\x27\x04\xbf\xe6\xfb\xc5\x78\xc9\x2b\x1e\x60\x46\x5a\x22\xed\x42\xef\xc9\xe9\x5b\x4c\x0a\x5a\xf3\x14\x4f\x1e\x61\xab\x80\x26\x8d\x2a\x0e\xbc\x93\x72\x39\x3b\x43\xf4\x26\x76\xdc\x5f\x00\x34\xf0\x6f\x37\x41\xe3\xb5\xbe\x90\xb2\x84\xe6\x99\x28\x8e\xf9\x74\xc3\xd0\x46\x44\x9e\x2d\x46\x9f\x3a\x2d\xcf\xce\xa9\xd4\x40\x95\x47\xd1\xee\xc5\xe7\xe5\xbb\xda\x04\x34\xb5\x71\xe8\xb2\x29\x55\x99\x3f\x00\xbc\x82\xca\xce\xd9\xe0\x79\x4c\x98\xea\x9e\xdb\xdf\x52\xb3\x77\x48\xf4\xd1\x88\x1a\xe0\x98\x5e\x5b\x22\x47\x9d\xbb\x1e\x02\x1e\x5b\x40\x78\x23\x7e\xc0\x80\xdf\xfb\x5b\xd9\xc0\x61\xd5\xbc\x75\xfd\xa4\x74\x14\xa5\xa0\x7e\x3c\x7f\xec\x87\x95\xa4\xae\x4b\x98\x4a\x2c\x12\xc2\xf5\x31\xcb\x2a\x5d\x95\x77\x90\x00\x10\x1a\x82\x8e\xfb\x5b\xf9\xfe\x2c\x0a\x14\x41\x5f\x88\x62\x7e\xf9\x18\x0f\x27\x44\xa1\xc2\x11\x58\x66\x15\x58\x66\xd8\x76\x6d\x56\xa5\x82\x41\x6a\x08\x22\x6a\x30\x68\x66\x13\x50\xd6\xdf\xb0\x27\xce\x0d\x6a\x53\x0a\x11\x0f\x71\x57\x40\xdc\xef\xe7\x07\x3b\x44\x3c\xf6\x62\x7f\x4f\xa2\xc1\x3c\xc9\xe4\x66\xa0\x2c\xa5\xb8\x2d\x22\xdd\x58\x35\xe6\x2b\x7a\x52\x0a\x91\xd1\x48\xfa\xbd\x2f\x2f\xe8\x16\xf5\xc6\x0b\x90\x50\x63\xcc\xe0\x55\x18\x93\x7b\x09\xf1\x5b\x01\x68\x20\xb1\x46\x5e\x82\x37\xeb\x79\xad\x9d\xbd\xe7\x5b\x53\xc9\x5d\x8a\xcd\x4a\x56\xde\xc8\xdf\x01\x0d\x00\xc1\x15\x23\x2f\xed\x1a\xc7\x7c\x73\x46\x02\x65\x29\x6e\x65\x07\xab\x8a\x6e\xe3\x91\xad\xa1\xb6\xb8\x4c\xac\x6a\xa0\xdc\xf2\x9a\xb6\x86\x08\x72\x04\xf4\xf8\xca\xb6\x0d\xb3\xa0\x26\x2b\xf4\xb6\xac\xeb\x4c\xe6\xe0\x00\xd8\x65\x55\x6f\xcc\xab\x78\x1f\xc7\xa1\x81\x0a\x8e\xec\xf8\xbf\xc4\xa5\x6a\xdd\x9e\xfe\xe3\xb3\xc0\x48\x17\x48\xea\xcf\x61\x60\x29\xf1\xfc\x76\x5d\xb9\x5c\xdb\x3c\x7e\x46\xa6\xb8\x84\x41\xc6\x0a\x7d\x10\x14\xa9\xf3\xf7\x89\x23\x61\x94\x37\x65\xf0\x1c\xb7\x6c\x4f\x83\xaf\x33\x2d\xd3\x1a\x59\x24\x90\xd0\xd4\xb3\x6c\xfa\x84\xff\x48\x31\x87\x42\x92\xa4\x18\x53\xbd\x14\x43\x6a\x43\xdf\x08\x14\x19\x1d\x7d\x5e\xe5\xa5\x1c\x88\x62\x7d\x3e\x75\x79\x6c\xd1\x9b\xdd\x87\x16\xb9\x98\x0e\x00\xd7\x31\x8f\x6c\xa6\xeb\x80\x79\x71\xdd\xc7\xfa\x40\x08\xca\x2c\xd7\xbc\xe3\x4d\xb7\x06\xd5\x00\xfe\x08\xc2\x18\xe6\xe3\x7c\xff\xbe\x64\x55\x05\xf9\x49\xb4\x07\xf6\x2b\xfc\xdb\xf7\x91\xce\x8b\x39\xb8\x84\x13\x4c\xb9\x2e\x40\xea\x04\xd9\x83\x9a\x37\x20\x31\x13\xa3\xa3\x06\x14\x97\xba\x23\x27\x18\x30\x02\xb9\x66\x4d\x2c\x85\xaf\xb8\x34\x6f\xb6\xc0\x67\x3c\x63\xb5\xb0\x01\xf5\x76\x7a\xd4\x0f\x28\x32\x3f\x40\x76\x80\x06\x1d\xf9\xcc\xa2\xdd\x32\xf0\x1d\xdb\x5f\xb1\x54\x68\xe3\xf1\xd2\x46\x22\x1f\x46\x97\x9a\x70\x7f\x07\x9a\x5a\x22\xe1\x5b\x11\xb7\x91\x6d\x42\x6f\x9a\x7e\xce\x7a\x07\x13\x59\x9d\xc8\x73\x55\xfe\xea\x54\x3c\x6f\x23\xb9\x27\x16\xcf\x78\xd6\x19\x16\x63\x9d\x64\x85\x85\xd2\x87\xca\x51\x6e\xdc\x04\x28\x8c\xc6\xcb\x04\x21\xc7\xba\x3c\xe4\x4f\xbc\x43\x98\x35\xfa\x2d\x13\x30\xa3\x93\x61\x3d\x69\x27\x1c\x2d\xfd\x94\xf9\xcd\x77\x8d\x25\xf1\x2a\xcd\x8b\xf1\xd0\x9a\x30\x08\x4d\xa7\xcd\x30\x88\x04\x9a\x90\x51\x44\x6e\x21\xcf\xba\xa5\xa1\xb9\x7d\xaa\x98\x90\x27\xc4\x29\x79\xe1\x64\x6e\x7a\xa8\xad\x21\xa9\xa4\x49\x57\x32\x71\x30\x03\x0a\x10\x43\x03\xcb\x14\xfc\xba\xda\xad\x5e\xbf\xad\x96\x1e\x64\xff\xf0\x75\xff\xf5\x75\x75\xd8\x6c\x57\xaf\xb3\xfd\x7a\xe3\x09\x4f\xa9\xa1\x91\xf0\xb0\xeb\xa1\xe9\x33\xb6\x3e\x0d\x86\xea\xdd\xd9\x81\xca\xe7\xf3\x4c\x0f\x13\x06\x86\x51\x11\x26\xfd\xe1\x52\x37\xeb\x06\x4e\xf6\x10\x58\xf7\x98\x48\x13\x33\xe5\xf7\xb2\x87\xac\xc8\xea\xb7\x6e\xf3\x33\x71\x62\xd0\xb0\x5b\xae\x47\x05\x22\x26\x36\x89\xdf\x14\xaf\x59\x3d\x27\xa3\xc6\x85\x2d\x75\x3e\x42\x73\xd0\x96\x05\xfb\x20\x1c\x52\xf2\xa0\x2f\x23\x07\xdd\xa4\x2c\x74\x3a\xdb\x48\x72\x8f\xce\x43\xcf\xd5\x4d\x8d\x20\x41\xe2\x62\x0d\x96\x40\xf7\xea\xc4\x34\xc2\x58\xa6\x89\x1c\x4c\x13\xf2\xc9\x2c\x90\x89\xb6\x7a\xe5\x65\x56\x3c\xa3\x17\x70\xdb\x95\x30\x2a\xd2\xa9\x2d\xc5\xad\x3e\xac\x83\x8b\x47\xe1\x73\x59\xd4\xf7\x2f\x02\xa6\xf0\xdc\x79\x9e\xfd\x71\xf8\xba\x7e\xd9\x53\xee\x9f\xdb\x48\x9a\xc8\x01\x43\xc3\x73\xa6\xaa\xb2\x35\x4b\x6c\x07\x16\x84\x61\x82\xc9\xe5\xe5\x66\x31\x18\x69\x16\x44\x49\x88\x28\xd7\x93\xf8\x01\xcf\xa5\xd7\x85\x71\x8d\x24\x10\xb8\x77\x4d\x27\x56\x57\xf4\xd0\x76\x81\x84\xf9\x03\x46\x55\x7d\x4e\xfe\xe6\x1c\x67\x01\x09\x13\xde\xf3\x0d\x7f\x83\x2a\x1b\xb8\xb9\x6e\xea\xb1\x80\x10\x8e\x4e\xf5\x1f\x99\x28\xeb\xb7\x6c\xf4\xc4\x24\xb6\x84\x86\xff\x81\xe6\xad\x9a\x5f\x3e\xd6\x7d\x8b\x48\x90\xce\x79\x8d\xc5\xe3\x48\x13\x31\x94\xb7\xbb\x5e\xfc\x2c\x20\xc0\xf0\x78\x3b\x3d\x7c\x7d\x41\x95\xb1\xf9\xe6\xe5\xeb\xce\xdf\x90\x32\x81\x94\xf7\xb2\x6c\x9a\xf2\x84\xe9\x65\xdf\x12\x47\x42\x76\x85\xd6\xcf\x78\x66\xbc\x94\x1a\xba\xf1\x66\x41\xa0\x42\xa4\xa9\x17\xcd\xba\xde\xbf\xc1\x33\x60\x1c\x69\x63\x9e\x32\x03\x7d\x2f\xc0\xb3\xc5\x32\x23\x88\x42\x8f\xf1\x24\x2c\x60\xd4\x72\xaf\x28\xeb\x89\xb7\x3e\x92\x65\xff\xf9\x0b\x54\xb1\xbf\x9c\x1b\xaa\xfa\x30\xd8\x76\xa0\x27\xc6\x82\x38\x4c\x91\xc9\x69\xf5\xbc\xdd\xff\x79\x78\x5d\xed\x36\x5f\x5f\x17\xab\xc3\x6e\xb5\x3f\xac\x97\x5d\xa7\x98\x87\x01\xf2\x60\xaf\xf7\xab\xa7\xf5\x6e\x6f\xf9\x14\x9f\xd6\xcf\xeb\x7d\xdf\x27\xd5\x83\x5c\x7c\x03\x9e\x87\x80\x05\xb1\x0c\x74\xdc\x53\x3a\xfc\x1f\x23\xd5\xed\xf5\x31\x82\xe9\xab\xb2\x11\x0d\xcc\x33\x57\xbd\x70\x1d\x17\x63\x01\xa7\x12\xa5\x16\x36\x67\x28\xbc\x52\xa4\xcd\x87\x8d\x87\x94\xbb\x6a\x0b\x1b\xcb\xb4\x1b\x97\x23\x3a\x68\xba\x0f\xc3\x53\x8d\xc7\x88\x41\xa9\x29\xe4\x0a\xde\x5d\x4e\x96\x6d\x7b\xfc\xb3\x29\x89\x63\xc7\x9b\xbb\x28\x4f\xa7\x4b\x31\xa0\xb7\xf6\x5d\x28\x45\x30\xe9\xa0\x9e\x75\xd7\x0c\xd4\xe5\x7c\x37\x66\xcb\xda\xbe\x88\xfa\x6d\x34\xe3\x53\x2e\x11\x2f\xd5\x9d\x50\x8b\xaa\xac\xeb\x45\x59\x14\x28\xb7\xfc\x8a\x47\xc2\x68\xcb\x98\xd0\xac\x4e\x7c\x6f\x16\xa4\x2a\x4c\xdd\xaa\x75\x59\xbe\x61\xdc\x7f\xda\x19\x92\xc4\x2a\xb8\xfa\x07\x92\xa1\x2d\x19\x38\x8b\x4c\xef\x4b\x9f\x27\xf4\xad\x2a\x92\x11\xef\xd6\xc6\x16\xaa\xe5\x00\x05\xcc\x02\xe5\x24\x4b\x6c\xdc\x05\xc1\x03\x7f\x27\xaa\xc4\x02\x05\xa1\x9b\xcc\x36\xa8\xe2\x52\xcb\xd7\xe7\xd7\x7f\xb3\xff\x71\x97\xe8\x40\x60\x11\xd7\xc2\xff\xd6\x6f\x83\x10\x10\x0b\x74\x14\x81\xdd\xad\x2f\x45\x63\xe5\x20\x9f\xba\x68\x12\x0b\x34\xd3\xb1\xdb\x54\x0f\xae\x52\x73\xfc\x44\x3a\x4d\x89\x87\x22\x39\x51\xb1\xee\x5a\x4d\xd1\xe0\x3f\x78\xa5\x23\xfc\x85\x5b\x5e\x11\x0b\x20\x64\xe8\xe0\x7b\x89\xa9\xfb\xf4\xfa\xfe\x02\xce\x84\xc3\xce\x62\xe2\xbf\x1c\xcc\xf2\x69\x57\x08\xb1\xc0\xe5\x05\xde\x47\xca\x7b\x37\x7b\x87\x41\x10\x7b\x62\x0f\x7b\x28\x59\x80\x4f\x17\x66\xc9\x4a\xeb\xf9\x0d\xe0\x3a\xed\x45\x09\x02\x3b\x7b\xa2\xd2\x4d\x71\x5b\xbe\x9e\x85\x01\xb1\xb1\xa4\x37\x51\xf7\xb0\x11\x16\x06\x94\x22\x71\xc8\x3c\x6b\xda\x93\xf3\x8c\x8e\xdf\x70\x0d\x84\x81\x52\x96\xd1\xfc\x65\xbd\x5f\xcf\x9e\x0e\xa7\x4b\x6e\x4b\x1c\xbb\x0e\x60\x10\x98\xf7\x79\xdd\xb5\xfd\xa7\x9b\x20\x61\x48\x58\xe4\x30\xa5\x48\x08\x05\x55\x57\x81\xd6\x3f\x74\x48\xa9\xa7\x03\x6b\x37\x97\xad\x50\x3f\xc4\x11\x3c\x83\x0c\x0b\x43\x91\x72\xd9\xb9\x8a\x6e\x72\x56\xa5\xbe\x78\x64\x2f\x0b\x43\xb0\x27\xe9\x09\xc7\xd3\x06\x01\x4c\x36\xd6\xf3\x65\x61\x14\x46\xc1\x88\x1f\x6c\x09\x3f\xa7\x9e\x69\xdb\xcb\xc4\x56\xff\x5a\x87\x7f\xde\x19\xe7\x48\xa5\x58\x01\x65\x93\xda\xee\x61\x7a\x71\x1f\x9f\x24\x1a\x5f\x44\x42\xcb\xc6\x8e\xb4\x67\x27\x09\xad\x2b\xbb\x9f\x52\x7a\xb2\x90\x44\x36\x70\xb7\x2d\xf3\x4c\xc1\x81\xf8\xa7\x27\x29\x47\xec\xb1\x70\x35\x4b\x9e\xda\xc3\xd5\x4b\xdf\x79\x52\x62\x84\x71\xda\x01\x59\xdd\x20\x2a\xf7\x8a\x96\x83\x85\x34\x54\x51\xe0\x35\x61\x4e\xd9\xaf\xeb\x04\x42\x7f\x47\x9a\x24\x48\xe4\xbc\x15\xb5\x14\x45\xf7\x95\x68\x2a\x92\x78\x6c\xe7\x17\x05\xd2\x71\xde\x2a\x5e\x66\x21\x15\x02\xc9\x21\x4f\x96\x05\x74\xa0\x8c\xe4\x3a\x30\x62\x21\x68\x96\x5a\x76\xf5\xef\xd0\x65\x6d\xc2\xf0\x1f\xa3\x7f\xbd\x55\x13\x32\x2e\x71\xbb\xe8\xe0\x71\xe5\x74\x68\x99\x0a\x31\xc8\xa2\xc1\x64\x05\x3c\x83\x82\x42\x4c\xce\xaf\x90\xa9\xd8\xf2\x7e\x62\xa1\x55\xd4\x3d\x8d\x8e\xb8\xf2\xd6\xba\xfa\x91\x15\xc7\x76\x26\x0f\x32\x21\x2c\x8c\x49\x8a\xa8\x6f\x2c\xe9\xf3\xfb\xd5\xf8\xe6\x31\x0f\xec\xce\xd2\x88\x23\xb0\x25\x08\x9d\x67\x45\xb7\xd2\x13\xc2\x05\xe9\x8c\xb7\x9d\x12\x39\xa0\xd8\x33\xf7\xed\x60\xcd\xf9\xa3\xa7\x84\xda\x18\x47\x1e\x30\x7e\x4d\x1e\xda\x19\xf4\xb8\xda\x1f\x9e\x57\xfb\xd9\x72\xb6\x9f\xf9\xdf\xe0\x24\xc6\x02\xfe\xdd\x62\xaa\x9f\x7c\x9d\xda\x65\x21\xe7\x04\xcd\x2c\x2c\x96\x43\x0e\x2c\x54\xed\x45\x29\x2b\xeb\x70\x7f\xc6\xb1\x71\x9b\xba\xc0\xdf\x5a\x68\xcc\x48\x9f\x73\xa1\x50\xda\x60\xe4\xfd\xb0\x30\x65\x12\x53\xa9\xcb\xed\xcb\x36\xbf\xd4\xa3\xdd\x2a\x35\x56\x5b\xfe\x52\x43\x85\xb5\xfb\x93\x12\x45\x16\x4a\x19\x3b\x3d\xe9\x1f\x50\xe4\x50\x1c\x7d\xa8\x92\x85\x52\x45\x43\x25\xc5\x97\xf5\xf3\xc3\x6c\xb2\x51\x48\xa3\x11\xc6\x94\x35\xe0\xf8\xdc\x3e\x3d\x30\x42\x15\x19\x14\x7f\x3c\x57\xb0\x3f\x76\x9f\x53\x31\x85\x0b\xc5\x72\x65\xe0\x9e\x6b\xc5\x14\xfa\x0e\xda\x63\x4b\x1f\xb3\x9f\x83\xbf\xa7\x80\xfe\xe3\xe3\xe6\xf1\xf5\xa5\xfb\xa3\x0e\x90\x5c\xe8\xa7\x2d\x14\x74\xc4\x51\xb7\xbc\x74\x16\x6a\x6d\x19\x54\x7f\xb6\xe7\x48\x3d\x0a\x28\xb1\x10\x74\xea\x43\xba\x55\xb3\x45\x0c\xf3\xae\x67\x10\x61\xa1\x09\x1c\x11\x25\xe6\xd3\x47\xf0\x5a\x16\x05\x49\x88\x73\xdc\x7a\x80\x36\x83\x75\x8b\xc0\xa8\xed\x19\xe3\xf3\x9e\x4a\x3d\xad\x4e\x61\x51\xc0\xa9\xf5\x59\x9b\xb2\x82\xdf\xe1\xa3\xbb\xbd\x12\x18\xea\xc9\xe1\x27\xe4\x5f\xcf\x37\xd8\xfc\x59\x14\x18\x8d\x15\x4c\xc2\xa2\x3b\xb7\xb8\x4e\xfd\x0d\xc2\x20\xd6\x9d\x71\xb4\xaf\x32\x39\x39\x6c\xa2\x90\x70\x14\xbe\x3e\x57\xd9\x7f\xe0\xb9\x2c\xfa\xdf\x0e\x49\x0a\x1e\x22\x51\x1c\x21\xb7\xce\xf4\x72\xaa\x9f\xc9\xa2\x30\x16\x96\xa3\xdd\x26\x66\xee\x66\x0a\x58\x14\xaa\x80\xa8\xb1\x1c\xa3\xc7\xa1\xdc\xdc\xad\xa3\x88\xc5\xb1\xcb\x32\x5b\x38\x83\x9f\x98\x93\x6e\x89\x42\x03\xf1\x15\x7a\x69\x70\x16\x45\x3c\xf5\x05\x4f\x96\x65\x27\x2b\x8b\x7a\x21\x72\xe4\x13\xfc\x0b\x1b\xf0\xff\xf7\x5f\xff\xd3\xd2\x98\xbe\xc0\xe9\xb6\x55\x30\x9e\x1e\x94\x18\x0c\x46\x9b\xac\xd0\x2f\xf0\xab\xf9\x0e\xf0\x43\x8b\xde\xa0\x18\x50\x34\xb0\x88\x1a\x5b\xfa\x3f\xcf\x4b\x89\xb5\x2f\xfe\x95\x99\x88\x70\x47\xdc\xbc\xce\x16\x4f\xeb\xff\x5a\x1d\x16\x9b\xe7\xe7\xf5\x6e\xb7\xde\xbc\x74\x5d\x94\xd5\xf6\xa9\xe0\x7f\x41\x35\x16\x8d\x97\xd5\x50\x2d\xde\x44\x75\xec\x4c\xa4\x28\xd6\xb6\xc4\xd1\xc1\x30\x6f\xbf\x66\x0c\x56\x4f\xea\x77\xf4\x34\xf7\x6f\xb0\x6a\xde\x32\x2f\x4a\xc9\xa2\x84\x06\x28\x61\x80\x91\xb9\xb3\xa8\xa0\x50\x1f\xaf\x80\xdf\x71\xbc\x3d\x45\x1c\x0c\x82\xe8\xe7\xf3\x3f\x3f\x61\x32\x60\x51\xeb\x5f\x3a\x0b\x78\x99\xfd\xbc\xd2\x72\x65\x51\x1a\x72\xa9\xba\x81\x1f\x50\xb5\x0d\xba\x08\x29\xbd\xd0\x21\xe4\xf9\xa2\xf4\xe7\xec\xa4\x9b\x0e\x55\xea\x59\x97\xeb\x8d\xb9\x55\xaa\x7f\xbd\xb1\xbb\x8b\xa5\x2b\xde\xb2\x72\x87\x9e\x07\x60\xd2\x87\x87\x81\x1a\x43\x8c\x1d\xc2\xf9\x56\xe6\x9f\x45\x4a\x70\x44\xd3\xab\xd2\xc3\x3d\xac\xae\xda\xb2\x4f\xf6\xf9\x81\xd7\x84\x1b\x35\x08\xcf\xac\x8b\xc9\xbd\xb4\xb0\x71\x08\xd9\x07\x77\xdb\x3f\x6a\x0c\xea\xe0\xe1\xb6\x04\x0b\xa2\x98\x16\x01\xdf\x58\xd5\x5a\xa6\x18\x9c\x38\xf4\x69\xc7\x3b\xcb\x59\x03\x13\xda\x3b\x40\x5b\xa8\x8c\x53\xa5\xe8\x66\x1d\x48\x69\xe1\x18\xa8\xb6\xd8\x8e\xfc\xba\x58\xed\xbf\x74\xcd\x5a\xe3\x4e\xe3\xe3\xc9\xed\x37\xa9\x27\xb4\xbb\xae\xab\x09\x4d\xe8\x94\x2a\xbb\xf2\xfa\xf1\x9e\x6b\x62\x9a\xda\x5c\x01\x88\xfa\x52\x7d\x6c\x0c\x3a\xcb\xf9\x74\x73\x31\x09\x47\x35\x38\x6f\x67\x76\x6e\xf7\x28\x89\x7d\x3d\x2e\x24\x90\x09\x9e\x82\xce\x27\x5b\x56\x59\xe1\x73\x8c\xb7\xfd\x21\x12\x40\x80\x48\x90\xdd\x7e\xf6\xb8\x8a\x0e\xfb\xf5\xf3\xea\xb0\x7a\xf1\xc1\x11\x12\x06\x34\xec\x43\x09\xcf\xeb\x97\xc3\x62\xf3\xb2\x7f\x5d\xcf\xbf\xee\xdb\x05\x3e\xbe\x57\x28\x12\xaf\x13\x6d\x4f\x59\x37\x4e\x93\x69\x45\x42\x2d\x8d\xf1\xc5\x9a\x16\xf6\x35\xc8\x92\x31\x12\x31\x6e\xa1\x42\x83\x9a\x4f\xe7\x76\x99\xc9\xad\x22\x19\xe3\x2a\xde\x3d\xac\xfd\xd5\xd4\x95\x82\xee\xab\x4b\xdd\x74\xf9\x51\x46\xa8\xa4\x78\xb8\xac\x6b\x1b\x24\x7a\x05\xa1\x3f\x0e\x87\x75\x61\x4a\xaf\xae\x36\xca\x7a\x30\x42\xc1\xc6\x5b\x2a\x50\x1f\x2a\xbf\x3a\x06\x49\x12\x58\x7e\xe5\x83\x75\xf4\x07\x67\xec\x64\x90\x93\x28\x74\xa1\xed\xfa\x92\x7b\x63\x95\x24\xcc\x20\xf0\xcd\xd5\x1f\x3b\x73\xf5\xf7\x3f\x17\xf7\x42\x5f\xfe\x3a\xa0\x81\x2b\x9e\x5f\xaf\xd7\x87\xdd\xe4\xa9\x38\xb3\x89\xb5\xd9\xf3\x50\xa3\x89\x91\x94\x10\xb4\x1b\x9a\x72\x9f\x9d\xcb\x55\xd1\x8c\x22\xa1\x24\x65\x11\xb5\x74\xe6\xcd\x5b\x56\xef\xa1\x6e\xc6\x57\x27\x9a\x59\x27\xa6\xdd\x5e\x36\xeb\x25\x12\x0a\x1c\x7c\xb3\xe0\x96\x31\xc0\xda\xc5\xfb\x2c\x87\xfa\xa1\x2a\x4f\xf3\xd2\x8b\x6c\xfa\x88\x04\x11\xd2\x90\xc4\x93\x54\x29\x04\x2b\xdd\xa3\xa0\x70\x57\x28\x12\x26\x74\xc0\x11\x5a\xbf\x0c\x58\x59\x18\x51\x29\x93\x7c\x50\x2d\xf5\xe9\xf1\x4e\x54\x1a\x63\x74\x76\x0e\xcd\x5b\x79\xce\xc4\x6d\xf3\x8d\xa8\x14\xc0\xa2\x91\xe7\xbb\xc9\x94\x53\xc6\x12\x99\xb7\xbe\xf0\x1e\x4e\x67\xea\x1f\x44\x87\x4a\x78\x8e\xba\xb5\x83\x49\xf9\x30\x21\x81\x08\xbc\xfe\xc6\x93\xa8\xbb\x4c\xa3\xdf\x86\x88\x89\x88\xe1\x83\xd0\xcf\x3f\x2f\xd5\x87\x75\x51\x7f\xbb\xc1\x85\xc6\x88\x71\x85\xb4\x33\xad\xbf\x41\x95\x99\x0c\x34\x66\x24\xc6\x33\xd8\x48\x85\xb4\x08\x67\xf1\xd1\x2e\x22\x5c\x65\xaf\xa0\x20\xeb\x40\x2e\x8c\x18\x65\x23\xa8\x67\x78\xd7\x19\x9c\x33\x7f\xb2\xd3\x20\xe4\xdc\x59\x63\x13\xb2\x53\x46\x83\x84\xe2\x20\x38\xc2\x8d\xee\x12\xad\xd0\x4a\x38\x68\xa8\x9b\xaa\xfc\x58\x9f\xce\x79\xd7\x66\x14\x7a\x0c\xa8\xe6\x71\xd8\xbe\xae\x30\xcc\xfa\x7d\xb5\xfa\xdd\x0f\x12\x0d\x69\xa4\x92\x2e\x56\x91\x3f\x64\x90\x77\xee\x1f\x0d\x53\x16\xda\x18\x63\xd3\x64\xc5\xd1\x1a\xdf\xae\x2d\x62\x29\x02\x1b\x3a\x4d\x06\x17\x72\x1f\x3f\x74\xc4\x63\xdd\x13\x03\xd9\x54\xa3\x33\xae\x7d\x2d\x33\xf7\x5d\x0d\x60\xca\x0c\x5a\xfb\xbd\x35\xf5\xdf\x44\x05\x6f\xb8\xa9\xdd\xc6\x82\x30\x4a\x08\x60\x36\x77\x56\x60\x6e\xff\xb5\x94\xe5\x68\x09\x51\x9a\x04\xa3\x23\x72\x67\x99\x7c\x11\x3e\xee\xbb\xa4\x96\xf0\xcc\x02\x4f\x17\x65\x51\x43\x96\xef\x2e\x59\x5d\x77\x5f\x85\x05\x02\x01\x96\xb3\xc5\x6a\x00\x0c\x63\x94\x49\x40\x8f\x73\x39\xc0\xc8\xfd\xff\x99\x92\x34\x89\x12\xd2\xf1\xc6\xb7\xbf\x71\x10\xcc\xff\x4c\xa2\x02\x2c\xa3\x7b\x85\xe2\xf4\x37\x38\x1f\x18\xe5\xc4\xe2\x54\xdb\x6f\xfa\xb2\xf7\xbe\xcc\x78\xe8\x38\x67\x78\xc8\x7e\x11\x55\x76\xca\x26\x56\x0b\xe5\x92\xe2\xd2\x71\x58\xee\x55\xa5\xa2\xe0\xf6\xea\xa6\x1c\xac\xd6\x10\x06\x51\x6e\x58\x7d\x34\x4d\x14\x7a\xff\x08\x3f\x5c\x22\x97\x7e\xde\x0d\xad\x08\x39\xa6\x22\x16\x1e\x9d\xf2\x37\x5e\x4f\xa4\xcc\x44\xc3\x98\xcb\xea\x78\x6c\x3f\xec\x34\x0c\xd9\x75\xb7\xa3\xb1\x10\xe7\x33\xe8\x5e\xef\xfc\xaf\x3e\xd0\xe4\x2e\x86\xa6\x2e\xd0\x93\x7b\x90\xf3\xe4\x45\x25\x09\x31\xab\xd1\x9a\x10\xef\xeb\xba\xf6\x9a\x75\x8c\xca\x38\xc4\x10\xdc\x12\xea\x26\x7b\x01\xd0\xa3\x49\xaa\xa2\x10\x39\xd6\x16\xa2\x7e\x23\x61\xb7\x32\x55\xac\x45\x77\x64\xef\x41\x9c\xea\xae\x25\x21\x48\x82\x92\x67\x36\x3b\x7a\xf5\x2a\xb7\x52\xaf\x8c\x2a\x9e\x50\x87\x40\x9d\x67\xcd\x6e\xbf\xbc\xb3\xaa\x94\xe1\x18\xf4\x41\x37\x75\xbc\xbb\x51\x1d\xd2\xd8\xd6\xf8\xd7\xcd\xac\xd0\xf3\xcb\xc7\x27\x7a\x9a\x8c\x42\x64\x8d\xa3\x76\xd4\xe6\x4d\xf9\x3d\x6b\xde\x76\x4d\x79\x0d\x97\xfe\x5c\xc5\xed\xaa\xdf\xb5\x46\x0c\xa3\xc0\x42\x48\xfc\x3c\x7c\x17\x95\xbe\xf7\x4c\x26\xe4\x68\x42\x58\xc9\x46\x34\x3f\x7d\x91\x7e\xd7\x43\x79\xff\xe3\x51\x9c\xa0\x7e\x1a\x46\x52\xa8\xa1\xcc\x8b\xca\xec\xcb\xf3\xc4\x20\xa3\xa6\xfd\xd8\xb6\x10\xb3\xaf\x4e\x67\xd4\x24\x1a\x1d\xf0\xd5\xfe\xcb\xea\xf5\x75\xb5\xec\xfe\x9e\x26\x3e\xf8\x65\x71\xb1\x4e\x6a\xa3\xb3\xd7\x59\x10\x46\x18\x99\xab\x2f\x43\x92\x7d\xc6\x02\x1a\x59\x9a\xac\xdd\xa2\x1c\x31\x71\x33\x16\xb0\xb4\x47\x87\xc0\xb4\xba\xc4\x5b\xae\x2c\xe4\x09\xf2\x30\xcd\x70\x20\xfc\xc5\xa1\x91\x38\x1b\x5b\x33\x38\xaf\xad\xdf\x79\x73\x9e\xb0\x76\xda\x5a\x32\x92\x99\xcc\xe1\x06\xdf\x0b\x63\x91\x60\xb1\xe3\x3a\x7c\x2e\xf5\x25\x1f\x1b\xe7\x2c\xd2\x5c\xd2\xce\xfd\x74\xa7\xe4\x64\xff\x60\x84\x04\xe8\x11\xbd\x3c\x95\x13\x6b\x90\x91\x58\x60\x0e\x6b\xfe\xb0\xfa\x63\x34\x02\x84\x5b\x0c\xd3\xbb\xc8\x7f\xec\x4b\x9c\x0d\xc3\x9d\x9b\x11\x6e\x69\x08\x4d\x56\xc1\xea\x27\x14\xcd\x53\x79\x0c\xfa\x46\x2d\x82\x9e\x8a\x77\x73\x86\x0e\x59\xc5\x18\x49\xad\xc3\x68\x2d\xc8\xb9\x67\x47\xfb\xfa\xba\x1e\xbf\x1a\x91\x2e\x08\x92\x97\x45\xc7\x36\x7e\x2f\x5e\xcd\x68\x90\x52\x5f\x78\x54\x40\xe5\x09\xba\x5e\xdb\x23\x3d\x53\x1e\xe0\xb9\x2f\xaf\x2a\x85\x26\xb7\xd1\x61\x92\x7a\xc4\xe7\x1b\xe8\xdd\x47\xdd\xc0\xc9\xd1\xe2\xb8\x3e\x2c\x00\x0f\x46\x78\x81\x5f\xcd\xcc\x1f\xdf\xa8\xcd\xee\xfb\x90\x94\xca\x81\x7f\x3d\x8c\x05\x5e\x51\xa8\x4e\xdd\x62\xc6\x38\xc5\xf4\xac\xcd\x07\x2c\x7b\xad\x04\xd7\x1e\x9b\x24\xf6\x26\xc7\xc7\x00\x9c\x34\xde\xae\x58\x22\x28\x6a\x9f\xef\x33\xa8\x0e\xdf\xb3\x5c\x2b\xaf\xea\xcc\x58\x22\x63\xac\x96\xcd\x4b\x07\xd5\xdb\x97\xed\x09\xf0\x58\x7a\x38\x37\x63\x89\x36\xc8\xab\x34\x2b\xb2\x13\x8c\x26\x07\x0f\x93\x14\x61\xea\x51\xf7\x17\xca\x2d\x7e\xc0\x21\x95\x76\xd6\x18\xba\x5f\xac\xcf\x58\x2a\x40\x46\x43\x61\x75\x57\x94\x71\x47\x2c\x98\xb1\x54\xd9\x48\x26\x66\xe5\xb7\x55\x29\x73\x38\x8d\xb0\xcf\x8c\x09\x0a\xd2\xb2\xd0\xfd\x2c\x7f\xc0\xac\x99\xba\xd9\x93\x71\x1a\xd0\x7b\x31\x26\x03\x0e\x6e\xcf\x72\x74\xa3\x37\x77\x3f\x26\x49\x8c\x83\x8f\xa0\x0b\xc7\x98\x79\x98\xad\x5f\x97\xaf\x9b\xed\x28\x01\xcf\x64\x9a\xe0\x2e\x52\xfa\x12\xc6\xa7\xb2\xfc\x71\x47\x0e\x97\x31\x29\x03\xcc\x7a\x76\x2c\xb5\x17\xe9\x69\x18\xea\xbe\x08\x72\xbc\xb2\xa5\x64\x31\x1b\x80\xe5\xeb\xeb\x6a\x03\xc6\x54\x42\xbc\x04\xbe\xb7\xe0\x37\xef\xfe\x04\x1d\xcf\x18\xa5\x08\x56\x86\x3e\x95\xc7\x76\x26\x78\x9d\xff\xdb\x0f\xac\x03\x1e\xf7\x1a\x72\x48\xaa\xeb\xeb\xca\x37\xc8\x98\x32\x12\xd1\xb8\xd2\x27\xf3\x77\x89\x22\xc4\xfb\x9f\x3e\x7a\x0a\x43\xc6\x74\xcc\x54\x57\x71\x31\x34\x4d\x7c\xbb\xa2\x2a\xf2\x18\xa7\xf7\x0f\xa8\x86\x19\x15\x06\x81\x46\x27\xd5\x0e\xcb\xbc\x2a\x7f\x5c\xed\x89\x40\x23\x2c\x49\x10\x5a\xaf\x8a\xa6\xfa\x58\xfb\x02\x69\x4b\xe3\x75\x2d\xea\x88\xf5\xe2\xb7\x67\x04\xb0\xd0\x8a\x6a\xad\x5f\x0e\x8f\x9b\xd9\xd3\x61\x35\x5f\x74\x8f\xa2\x08\x0c\x91\x96\xbb\xf2\x92\xdf\x39\x0d\x0c\x8f\x30\xd0\xb2\xad\xe0\x67\x56\x5e\xea\xe1\x78\x18\x45\x71\x2a\xfd\x44\x1c\x95\x63\x95\xf4\x7a\xf2\x5d\x1f\x61\x1c\x95\x9f\x3f\x08\x86\xca\x14\x2c\x0e\xa8\xc0\xe3\xc6\x4b\x37\x7f\x9f\x3d\x3d\x75\x6e\x50\x1c\x08\xcb\x9f\x5e\x5f\x8e\x47\xe4\xa2\xea\xe4\x64\x58\x1c\x06\x14\x6f\x7d\xa8\xa1\xd9\x54\x47\x51\x64\x53\x68\x3e\x8b\x43\x88\x31\x5e\x68\x00\xc6\x68\xca\xb6\x29\x45\xde\x10\x09\xaa\x3c\xc1\x2b\x14\xe5\xfb\x64\xe6\xc5\xa1\xb1\x78\xdb\xa7\xcd\x7e\xbf\x5a\x7c\x99\x79\x05\x64\x16\x47\x81\xad\x1c\xe8\xf6\x89\x11\xb2\xf8\x3a\x9e\x14\x47\x91\x32\x7a\x48\x5b\x5b\x4e\x1f\x95\x04\x14\xf7\x2f\x24\x34\x44\x77\xef\xef\xe0\x94\x59\x4c\xe2\x48\x5a\xa9\x87\xa3\x23\xf2\xf5\x0f\x49\x64\x64\xba\x80\x1c\x82\x61\xd6\x96\xdd\x7c\x90\x87\x8b\xa9\x48\xd0\x1e\x5d\xc2\x39\x2f\x3f\x3a\xa5\xf3\xb6\x41\x63\xba\x7b\xfd\xf0\x32\xae\xf8\xb8\x03\x94\xbc\x36\xe9\x63\x16\xca\xd8\xc9\x21\xa3\xe8\x11\xc6\x75\xa6\xdb\xdd\xf8\x6d\x92\x40\x68\xe5\xf8\xb3\x6d\x88\x34\xe4\xcf\x65\xd1\xbc\x75\x9f\x3d\x61\x41\x42\x3b\x91\x5a\x1f\xcd\xba\x2a\xcb\x60\x71\x12\x5b\x40\xbd\x14\x35\x5c\xd7\xf7\xb3\x38\x49\x19\xba\x88\xa7\xf6\xf6\x11\xb5\x54\xd8\xbe\x91\x27\x36\x9a\x67\x2e\x85\xae\x44\x56\xf7\xd9\x0b\xdf\x81\x87\x3c\x72\x44\x60\x48\x83\xf3\x24\xea\x66\xf6\x13\x2a\x71\x84\x9b\xbe\x59\xcc\xb9\x42\x1b\xa3\x80\xf7\xc7\x4b\x7f\x2c\xc7\x5c\x44\xc9\x10\xa5\x3e\xcb\x07\x01\x5b\xd7\x47\x18\x0d\x43\x32\xed\xdf\x6e\xa8\x7c\xb1\x58\x46\x96\x27\x1a\x90\x89\xee\x4f\xff\x03\x32\x4d\x99\x45\x3e\x97\xfa\xd2\x99\x9a\xb1\x12\x21\x96\x67\x2c\x36\x2f\x0f\xeb\xc7\xc3\xc3\x6a\xb5\x3b\x3c\x7f\x7d\xf2\xcd\xda\xe9\xad\xdb\x30\xaf\xbe\x55\x5f\xc0\x62\x4d\x02\xac\x72\x52\x1e\x96\xd8\x9a\x56\x13\xaa\x92\xf1\xc6\x14\xeb\x38\x49\x60\xc8\x42\xdb\x74\xa7\x7b\x0c\x5c\xc7\x0e\x9f\xb9\xbf\x34\x65\x95\x89\x7c\x2e\xe4\xc7\xa3\x73\x20\x7d\xe8\x2b\x06\x11\xa2\xee\x56\x5d\x64\x3f\xa0\x6a\xba\x8f\x62\x68\x18\x6b\xb4\x70\xca\x62\x3f\x20\x88\xfe\x7b\x10\xb8\xd8\xc4\x76\x47\x71\x1a\x72\x8f\xcb\xad\x3b\x33\xba\x76\x6e\x69\xae\x55\x73\x41\x6e\x13\x3c\xd9\xe6\x60\xca\x6a\xac\x7d\xf3\x79\x58\x20\x09\x28\x43\x66\x64\x27\xb5\xf5\x38\x58\x16\xae\x47\x18\x71\x04\xb9\x88\xdc\xfa\xcf\x7d\xb8\xf6\x1f\x93\x8e\x2c\x01\x0b\x03\x69\x5f\x58\xdf\x31\xea\x93\x28\x88\xc1\x0d\xac\x3d\x13\x27\xc5\x3a\x2c\x89\x84\x44\xee\x2e\x14\xf6\x43\x4a\x27\x4b\x74\xda\x35\x43\x48\xa6\x88\x88\x3b\xe0\x53\x96\x10\xb0\xcc\xfa\xba\x7c\x10\x59\x9e\x15\x47\x9b\x89\xf0\x03\x99\x50\xa9\x11\x05\x58\xc0\xfb\x72\x44\x5a\x73\x23\x6f\x94\xb0\x04\x40\x0e\xf5\xa8\x5c\x51\xd3\x64\x8b\x4d\xe2\x58\xc6\xd4\xe3\x11\xe6\x70\xf4\x05\xe3\x2c\x49\x84\x65\x61\x39\xa0\x95\xb6\x03\x71\x7f\x6f\x1d\xbf\x07\x0f\x53\x3c\xfd\x76\xab\xdd\x6c\x3b\x1b\xa1\x61\x13\x4e\x54\x1c\x7b\xcb\xcf\xd2\x25\x8f\x0c\xe2\x84\xeb\xd4\xe2\xed\x95\x28\x76\x50\xe8\xf6\x33\x3f\x66\xbe\xa0\x80\x25\x69\x08\x34\xee\xf5\x34\xfc\x7c\x45\x9a\x62\xdc\x3e\xc6\xcf\x92\x52\xed\xca\xc8\x5b\x93\x00\xb3\xdc\xcb\x11\x62\x99\x25\x22\x32\x08\x09\xf1\xc0\xa2\xdf\xae\xf7\xe4\x44\x90\x44\x0c\x62\x40\xc8\x1a\x9e\x5f\x8f\xc7\xf8\xb7\x85\x0e\xb0\x2a\xbe\xfd\x00\xb6\x28\xc4\x0f\x3e\xe9\x8f\x3a\xea\xa5\x19\xc2\x24\xfe\x9f\xcf\x9c\xfa\x44\x68\x9a\x38\x88\x41\x2d\x72\xd8\x42\xd5\x67\x17\x12\x29\x58\x62\x27\x62\xf9\x7e\xd8\xbf\xc1\xa1\x10\x27\x38\x94\xe6\x50\xa2\x5c\xd0\xc1\x5b\x31\x89\x62\x1a\x05\x06\xdc\xdc\xda\x67\x4d\x3e\x1d\x33\x4d\x6c\xe5\x1d\x20\xf9\xfa\xd9\xc3\x8f\x12\x2d\x09\xb7\x05\x3b\xc5\xe1\x7d\x68\x8e\x24\xa0\x55\x18\x76\x93\xed\xa9\x2c\x1b\x59\xfe\x9a\x2c\x4e\x43\x84\x0c\x06\x12\x2a\xdb\x72\x5a\xcc\xc2\x12\x43\x13\x5f\x5a\xf8\x0a\x22\x7f\x2c\x73\x3d\xb7\x74\x13\xb6\x03\x0f\x48\x80\x4e\xae\x65\x18\x2e\xea\x66\x80\x4c\xe0\x51\x1c\xe3\xdc\x72\xfc\xe8\xdb\x4b\x9e\x6f\xc5\x07\xd6\xe6\x8d\x57\x4a\xd7\x9f\x23\xb4\x65\x87\x42\xd3\x96\x65\x40\x7d\xdc\x8c\xbc\xdd\x4a\xab\x70\x12\x86\x62\x50\x16\x3d\x10\x0a\x62\x9c\xf0\x54\x59\x2e\xcb\x76\x27\xf5\xe0\xc4\x4f\xe7\x0b\x27\x10\x61\xf1\xc3\x6e\x3f\xdb\x7f\xdd\x1d\x96\xab\xd9\xd3\x61\xb6\xdd\xbe\x6e\xbe\xad\xfc\x6d\xa9\x60\x92\x0d\x06\xba\x07\x32\xfa\x05\xcd\xa9\x02\x1c\x67\xdc\x5a\x5f\xe0\x7d\x75\x2e\xd5\x5b\x77\xbd\xb1\xf2\x38\xb3\xfd\xc2\x95\x4a\xa3\x80\xad\x4f\x66\x70\x16\x11\x24\xdd\xd9\x35\x95\x68\xe0\x98\xa9\xe1\xe2\xe5\x8c\x05\x18\xd4\xab\xc6\x81\x4b\xce\x92\x04\x31\xff\xf2\xf2\xf1\x47\xa6\xfb\xbf\x0a\x4c\xd9\x9c\x2d\x1f\xf0\xe6\x4e\x4a\x84\xb3\xd4\x3a\x1f\x42\x6b\x47\x20\xf8\x17\xe3\xc4\x54\xe4\xbd\x20\x2b\x38\x59\x77\x3f\xa9\x55\x18\xe1\xcc\x6d\xbf\xa8\x4d\x45\x0f\xd5\xe0\x19\x8f\xc3\x08\x1f\xf5\x88\xf0\xc8\xee\xaf\x91\xe5\xfe\xdd\x43\x8d\x73\x61\xd7\x88\x42\x63\x05\xdd\xe9\x2c\xb2\x63\x31\x49\xab\x5d\xc5\x16\x47\x33\x9d\xb7\x26\x24\x1d\x04\xda\x17\x5e\x56\x76\x5b\x95\xa7\xd2\x56\x0d\xf9\xae\x52\x22\x57\xc7\xf3\xec\x8f\xf5\xf3\xd7\xe7\xc3\x76\xf6\xba\x5f\x2f\xd6\x5b\xac\x26\x19\xd1\x88\xb7\x7d\x35\x73\xbc\xaf\x2f\xa5\x16\xb9\xc4\xd2\x0a\x4b\x81\x3d\x9a\xd7\x49\x6a\x45\x35\xfe\xd9\x85\xd6\x78\x22\x24\xd1\x9d\x74\xc5\x4e\x18\x68\x3e\x9e\x4b\xdd\x0d\x00\xe7\x09\x7e\xab\xdd\xdb\xa5\x69\x9c\x61\xde\xb5\xa9\x10\x55\x93\x6d\xfd\xd7\xee\xbd\x83\x9b\x70\xc1\x62\x24\x38\xb3\x6a\x67\xab\xe6\xad\x7b\x53\xdf\x43\xa6\x5e\x42\xbb\xe7\x24\xcd\xfa\xe9\x26\x55\x80\xeb\x3d\x2b\xb2\x66\xc4\xd1\xf2\xf9\x04\x90\xc6\xe6\x33\xeb\x31\x4f\xe9\xd8\xae\xe3\x8a\x31\xb0\x4c\x54\x39\x60\x45\x28\xe8\xfa\x21\x13\x93\x3d\x87\x2b\x45\x12\x57\xc0\xb9\x80\xa2\xbe\xb4\x03\xd9\x83\x1f\xbd\xf1\xc4\x35\xa1\x11\xe9\xe3\xa0\xcf\x99\x2b\x04\x9b\x7f\xcc\x61\x7a\x4b\xad\x2c\x5e\x17\x39\xa0\x2f\xc5\x0f\xba\x2f\x7b\xd8\xa5\xef\x63\x88\x49\x06\x30\xaa\xf2\x74\xce\xa1\x01\xfd\x9c\xe5\x50\x37\x65\x31\xd9\x94\x39\x30\x5b\xac\x77\x84\x4e\x79\xd3\xd1\x1e\x5f\xf3\x3d\xf8\x4b\xc0\x60\xbe\xc9\xd2\x2f\xdb\xd5\x30\xde\xdd\xc6\xf3\xd6\x44\xc2\xc6\xaa\xaa\xf2\x5d\xb7\xeb\xfb\xf0\x0a\xf5\xa5\xf3\x5c\xb9\x91\x06\xb3\x1b\xde\x1b\xdb\x14\xab\xaa\xba\x17\xc6\x4b\x83\xd0\x0a\x2a\x9c\x0e\xf5\x19\x13\x1a\xda\x2b\x89\xb2\x34\x48\x2d\x73\xf9\xbc\x2a\x9b\x37\xc8\xc7\x27\x45\x1a\x98\x00\x3f\xdc\xf2\xeb\xef\x3d\x81\x0d\x4b\xa3\xd0\x20\xad\xd9\x59\xe4\x42\x67\xc5\xea\xdf\x97\xac\xe9\xee\x18\xc5\x02\xcd\x06\x27\xba\x21\x72\xd8\x4c\xf0\x11\x29\x89\x29\x46\x21\x2d\xee\x7a\xfd\xb2\xbc\xf3\xe0\x24\x11\xe8\xbf\x66\xb5\x0d\x85\xf7\xf4\x85\xf7\x2e\xe0\x16\x4e\x78\xc6\xbc\x7e\x0f\xde\x48\x29\xb5\xda\xaf\x4f\xfb\x3f\xb7\xdd\xdf\x74\x9a\xda\x83\x61\x29\x1a\xf1\xe2\xa2\x98\xbe\x11\x44\xdc\x3e\xe2\xea\xf1\x71\x77\xd8\x6f\x0e\x5f\x66\xfb\xc5\x97\x43\xb8\xfb\xd7\xd7\xf5\xeb\xeb\xca\x3b\x19\x29\x4b\xa4\xf1\x4c\x24\xad\xe1\x79\x2d\xe1\xc3\x52\xa6\x52\x94\x35\xeb\x4c\xcf\x7d\x06\xd5\x70\xef\x49\xe3\x28\x44\x93\xe1\xcb\xec\xcf\xd9\x7e\x73\x78\xd8\x3f\x1d\x76\xdb\x55\xb7\x67\xb4\xed\xf6\xac\x09\xba\xbf\xf0\x04\x8b\x69\xb2\xa2\x28\xd5\x24\xd0\x9e\xc6\xca\x18\x1f\xbd\xf7\x79\xa5\x9b\xf2\x1d\x2c\x4d\x58\x9c\x86\x1d\xa6\xc9\xf1\xae\xdd\xb4\x89\xd3\x44\x04\x7e\x75\xe2\xc3\x77\xa6\x77\xca\x85\x0d\x33\x7c\x80\xa8\xf2\x8f\x79\xa7\xa2\xe1\xdb\x53\x96\x78\xa8\xec\x4e\xe4\xa2\xfa\x18\xe0\xea\x3f\x8d\x0d\xa4\x29\x53\xca\x02\x23\xf2\x52\xe8\x0e\x2f\x36\x22\xb7\xf9\x0c\xd4\x92\x0a\x1a\x83\xaf\x51\x6b\xcf\xd7\xd7\xf6\xb0\xbe\x66\x64\xf6\xbd\x13\x8a\x3a\xe6\x19\xfa\x22\x59\x71\x1c\x44\x8b\x52\x91\x2a\x5c\x73\xed\xad\xea\x2b\xd6\x46\x96\x0a\x88\x50\xf0\xba\x1d\xed\xa5\x68\xc0\x42\x16\xfd\xd5\x92\xf1\xd8\x7a\x8d\x42\xff\xeb\x22\x8a\x26\x6b\x3e\x86\xd8\xef\xdb\x9e\x56\x2a\x53\x85\x07\xc8\xd7\x1a\x26\x68\x87\x54\x6a\x0b\x86\xf0\x76\x77\x05\xba\x8f\xf6\xde\xa9\x14\x1f\xdf\x5c\x87\x21\x47\xf0\x66\x71\x84\x7c\x52\x10\x92\xea\x28\xf0\x91\x5b\xc7\x9f\x5b\x63\xd6\x69\x32\x81\x74\x2c\x75\xe8\xde\x6b\x20\xc0\xc4\x52\x9d\x08\x61\x91\x6e\x85\xc5\xf4\x3c\x8b\xe2\x22\xf2\x81\xc0\xdb\xe4\x61\x20\x46\xc0\x78\x8f\xe3\xfa\x0b\x88\x53\x0a\x41\xe2\xf9\x1b\x1e\xb2\xaa\xf6\x1c\x32\x37\x23\xa2\x29\x44\x89\x74\xa0\xfa\x8e\x0d\xfb\x1a\xed\x36\x99\x7e\x10\xa7\xae\x82\xb2\xe9\x34\xc7\x50\xe7\x63\x3a\xae\x3e\x9a\xd1\x05\xe2\x53\x00\x21\xfb\xd8\x55\x7b\x4e\x0c\xcb\x6b\xdb\x76\x40\x90\xa6\xe7\x0b\x72\xe6\x71\x3d\x09\xbd\x4c\x06\xc9\xa4\x80\x1b\x67\x2e\xea\x06\xad\x49\x5c\x6c\x5f\x90\x48\xd4\xdf\xd9\xc8\x34\x76\x28\x18\xeb\xfd\x6f\x2e\x8d\x2a\x4f\xbd\xbe\xcb\x35\xfe\x5b\x04\x69\x8c\x51\x2b\xbb\x67\x0f\x8b\x82\xad\xba\xf0\xe8\x29\x44\x18\x52\x13\x3a\xd0\x76\x33\x58\x22\x22\x4c\xb8\x2f\xa9\xd9\x5b\x9c\x77\xe0\xf3\xc6\x22\x0a\x00\x73\xae\x6f\xa2\xfe\x4b\xa6\x5f\x26\x48\xc8\xb0\x28\x52\x97\x3e\x1e\x7b\xa7\x9f\xe6\xc6\x7d\x56\x9c\x64\x0b\xcb\x4e\x36\x75\x3e\x05\x55\xb6\xfe\xcf\xe2\xae\xea\x25\xe4\xdd\x11\x28\xa8\x36\xe8\xc9\xfc\x9d\x6a\x9a\x9b\xee\x87\x60\x49\xa4\xed\x61\xf1\xba\x2a\x8e\x95\xf8\x39\x4e\xa5\x0b\x06\x16\x0e\xf7\xd5\xd2\x8e\x4f\xc7\x93\x99\x50\xe9\x1e\x8d\xd2\x8e\xf8\x88\x34\xc0\x75\x8b\x43\x81\x69\xc9\xd7\xef\x3b\xef\x43\x8a\xd6\x6a\x4d\xbb\x60\xa2\xfd\xde\x7e\x5f\x16\x49\x90\x60\xe2\x66\x59\x5d\x8e\x4b\x10\x9d\xb4\x15\x13\x89\x56\xe0\x38\xf5\x6c\x1c\xa4\xbb\x86\x0b\xca\xfd\xd9\x51\xe6\xda\xc6\xba\xa3\xc9\x93\xa4\xa1\x46\xc6\x58\x1b\x35\xb3\x13\x1b\xc9\x78\x4f\xa0\x07\x0c\x6b\x37\x6d\x1b\x21\xd2\x18\x05\xa1\xcf\x65\xdd\xfc\xb3\x94\x96\xe9\xe7\xce\x6c\xb8\xbd\x2b\x0a\xa1\x21\x74\xe2\xe3\xab\xd3\x39\x2f\x3f\x00\xd6\x13\xd8\x83\x90\x42\x42\x4f\xe5\xe5\x54\x76\x06\xac\x3d\xc3\xd0\xc2\xe4\xf6\x2a\xb0\x5c\xc3\x7e\x1d\xdc\x16\xa1\x61\x42\x45\x04\x2d\x1d\x4c\x45\x0d\x2a\x66\x85\xa2\x84\x0e\x35\xe4\x47\x4b\x5f\x28\xae\x22\xf7\xf4\x3b\x68\x3f\x5a\xbb\xb7\xf6\x45\xe4\x4c\xe8\xd4\x78\xec\xb8\xa7\x6d\xbc\x3d\x0e\x10\xd1\x04\x3c\x01\xc0\xd3\x60\xe3\xb7\x10\xc2\xd1\x55\x31\xf5\x17\x49\xf0\xca\x98\xb7\xb7\x3d\x01\x2a\x46\x5a\x79\x5f\xcf\x97\x35\xd9\x7f\xba\x08\xe6\x3f\x2e\x43\x06\xcd\x69\x94\x64\xb4\xe9\x0a\x13\x09\x84\xc6\x5b\xbc\x1e\xe8\xe5\x72\x3f\xf9\x4a\x46\x30\x0c\x50\x59\x80\xdb\xe1\x11\x9a\xe7\x8f\xa1\x9a\x23\x93\x01\x0d\xbc\x10\x0d\x2e\xec\xdb\x74\x0f\x4c\x06\x2c\xc4\x50\xc9\xf3\xea\xfb\x6e\xb8\xf8\x64\x10\x87\x36\x4c\x2e\x7e\x80\x27\x0c\xf6\x4d\x52\xf1\xbe\x18\xb1\xfd\x82\xb3\x42\xdb\x68\xc8\xcd\xe8\xbe\x0c\x74\x12\xf6\xd0\x7a\x0f\x4f\xde\x98\xe9\x51\xd5\x1f\x04\x32\x00\x26\xdd\x82\x82\xe6\xad\xba\x42\x8d\xcb\x50\xa5\x3c\xf1\xbb\xe9\xfc\x52\x39\xc4\x51\xf7\x90\xa1\xd1\x08\x34\xf0\x59\xe0\x75\xfb\xb1\xb7\x9b\x75\xd7\x21\x4a\x6c\x25\x5d\x03\x75\xf3\x20\xb2\xfc\x39\x2b\x9a\xef\x6f\x28\x4c\x71\x3e\x77\x0e\xa0\x8c\x04\xc7\x78\xb8\x4d\xe3\x8e\xfc\x54\x49\x12\x8d\xd9\xf7\x2f\x65\xf3\x2c\x0a\x14\x51\xff\x6b\xc4\x93\x24\x22\x51\x16\x1a\xd9\x5a\x06\x5e\x1b\x65\xfc\x76\x31\x8f\xf1\xdc\x95\x97\xaa\xb0\x94\x45\x2e\x1e\x6c\x79\x8b\xfd\xc3\xc5\x4a\xc7\x71\x5f\xe5\x39\xa2\x2c\x1a\xfd\x66\xac\x6d\x61\x88\x98\x3c\x9f\x6b\x4e\x02\xc0\x73\x03\xcb\x55\xe0\xe9\xdb\xd3\xe4\x71\x12\xc1\xb1\x00\x61\x09\xcb\x2b\x93\xf8\xaf\x34\xcb\x3e\x8f\xb5\xca\x44\x12\xe6\xf0\x03\xdf\xca\x06\xaa\x7a\x56\xd4\xbd\x3d\x24\x79\x1a\x21\x00\xd3\x67\x49\x1e\xca\x6a\x53\x20\xb1\x97\xef\x91\xf2\x00\x83\x58\x67\xa8\x4c\x39\x16\x2a\xb9\x09\x45\x90\x29\x10\x5c\x5e\x6f\x48\x85\xed\x48\xd0\xd0\x05\xed\x02\x03\x52\x84\x11\x2e\x8b\xb3\x15\x27\xfe\x0e\x99\x63\x41\xeb\x3a\x10\x82\xb8\xee\xb5\x2a\x31\x26\xeb\x82\x34\xe3\x77\x13\x24\x56\xa1\xe7\x7a\x33\x42\x01\x82\x88\x46\x23\x2f\x0c\xc3\x64\x6a\x93\x41\x15\x0d\x21\x99\x52\x86\x29\xe9\xb5\xe2\xd7\xad\x63\x8f\x26\xce\x2d\x34\xab\x94\x32\x42\x24\xd7\x53\x56\x88\xd3\x47\x37\x79\x15\x61\x18\x19\xde\x35\x15\x0c\x90\x65\x37\x18\xd8\xfc\x05\xc2\xe0\x11\xf5\x55\x66\xe5\xe5\xb3\xb2\x0e\xa9\x8c\x84\xa4\xf3\x19\x27\xf6\xad\xd4\x42\x63\xa6\xa6\xc8\x8a\xe6\x6d\x60\xeb\x48\x13\x1a\x4c\x4e\x8a\xce\x27\xb5\xe4\x45\xd6\x71\xe8\x7a\x69\x19\x38\xda\x7a\x4c\x1e\x2f\xde\xb2\xfc\xca\x79\xbd\x3d\xa1\x54\x40\x0d\x66\x36\xab\x1e\x38\x31\x85\xd6\xa8\x20\xe5\x64\xe0\x6c\x23\x4c\x0b\xd3\x31\x83\xb1\x50\x01\x00\xca\xc0\xb8\x8a\xe3\xa7\xec\x3f\x1e\x02\xa8\x42\x62\x2c\x26\x6b\x84\x75\x78\xca\x4e\x53\xf7\x46\x85\xa9\x30\x81\x17\x92\x6e\x87\xcf\xc1\xcf\x86\x63\xa9\x22\x9a\x78\xb1\x83\x3f\xc5\xc7\xcb\xe5\x34\xb9\x49\xa4\xe2\xc0\xf8\x9c\xc3\x95\x84\x01\x53\x91\x26\x88\x71\xaa\xca\xd3\xb9\x5b\x3a\x2a\x02\x8e\x4b\x47\x96\x75\x3d\xd0\xd9\x63\x2a\x32\x02\xd1\x2e\x2f\x80\xc0\xc6\xbf\xa8\x0c\x54\x24\xb0\x51\xe2\xd6\xd9\xad\xae\x21\x5d\x8a\x06\x12\x93\xf5\xd2\xba\xb7\x58\xe0\x31\x79\x01\x2a\x38\xe2\xe8\x54\x59\xe9\x3f\xa7\x6d\x92\xe2\x06\x7b\x68\xc4\xd1\x32\xe1\x8f\xc6\x86\xf1\x08\x43\x51\xab\x17\x6f\xbd\x29\x06\x31\x1a\x5b\xa7\x6c\x52\x44\x7e\x07\xd7\xa1\x62\x4e\xf0\x4b\x9e\x1c\x99\xbc\x3f\x79\xc6\x0f\x92\x44\x14\xed\x49\x2f\xda\x57\x4f\x83\x81\x2a\x89\x6c\xe1\x5d\x3b\x12\xe2\x63\x7a\xb9\xb4\x87\xdc\xb3\x57\x56\xf6\x57\xa5\xa1\x9d\xcc\xfe\xa0\xd9\x77\xd1\xa7\xfc\x03\x6b\x2c\x40\x2f\x44\xaf\xa0\xca\x54\xda\x1a\xa8\x6e\x57\x9f\x2a\xaf\x32\x95\x02\x0b\xc1\x7b\x57\x68\xe4\x8f\xf7\x9e\xc9\xd7\x13\x4a\x78\x50\xbd\x15\xf4\x1f\xe5\xb3\x95\x92\x31\x1e\xa3\xdb\xaf\x4f\xa3\xf3\x5f\xe9\x80\x72\xf7\x10\x3e\xc4\xe1\x9f\xc5\x2f\x10\x1d\x4a\xc4\xf8\x6f\xc5\xc7\xa7\x50\x01\xdf\x9d\xc4\x3c\xf6\x3c\x55\x3b\x9b\x6b\x7d\x1a\x83\xac\x7a\x03\x40\x01\x4d\x2c\x3b\xc2\xe9\x63\x09\x2a\x3b\x75\xd9\x62\x05\x2c\xb2\x3c\xd0\x43\x0e\xdb\x7b\x19\xdf\xf1\x23\x40\x42\x3c\xa9\xc5\x73\x56\x7c\x2b\xa7\x56\x85\x32\xc4\x6a\xa5\xe2\x5c\x1e\x22\x34\x75\x20\x38\xc2\xc6\x97\x22\x1b\x53\x8c\x31\x1d\x00\x15\x8e\x31\x79\x5e\xde\xa9\x67\xd5\x61\x1a\x61\x8e\x5a\x57\xe5\x79\xfc\x0d\x74\xa8\x0d\x86\xdb\xeb\xa8\xfb\x53\x94\x44\x94\xf7\x05\x6f\xff\x37\x2e\x76\xa6\x49\x10\xe0\x97\xb1\x91\xc2\xd9\x1d\x51\x00\xa6\x29\xe1\x96\x27\xc0\x6a\xa4\x5a\x47\xc8\x22\xfd\x9c\x2c\xbf\x7f\x20\xca\x35\x4e\x62\xcb\x76\xe2\x89\xbb\xa7\xe5\x44\x9a\x4a\x6d\x49\x6f\x44\x75\x84\x41\xf1\x90\x66\xa1\x46\xe6\xf4\xc3\xf9\x4d\xd4\x10\x59\x8c\x47\xd7\x28\x29\xe6\xe5\xb6\xaf\x2b\x2c\x7e\xdc\x3f\xaf\x5e\xf6\x07\x0f\x0d\xda\xad\x16\x9b\x97\xa5\x07\xa8\xe8\x38\xb4\x41\xde\xed\xbb\xfe\x22\xea\x39\x40\xb1\x83\x31\xdd\x1a\xd3\x71\xc2\x52\xe7\x2b\x3c\x42\x51\x9e\x26\x9f\x59\xc7\x9c\x04\xb6\x58\x04\x8f\x17\xcb\x14\x5e\x96\x7f\x99\xc8\xbf\xf9\xef\x9d\x5d\x47\xc7\x5a\xa2\xc7\x76\x29\xb6\x55\x79\xca\x6a\xd0\xdb\xf2\xdc\xbd\x05\xc4\xb8\x2c\x5d\xea\xed\xff\xd1\xf6\x6e\xcd\x8d\xe3\x4a\xd6\xe8\xdf\xe9\x87\xfd\x40\x12\x24\x00\x3e\xca\xb2\x5c\xd6\xb4\x6d\x79\x4b\xaa\xaa\xee\x3d\x31\xa1\xc0\x25\x61\x71\x4c\x91\x6a\x92\x2a\x97\xfb\xd7\x9f\x60\x02\xe0\x4d\xb4\xbb\xe6\x9c\x38\x5f\xc4\x37\xd5\xdb\x84\x78\x05\x12\x79\x59\xb9\xd6\xa3\xf8\x39\xd8\x25\x35\x23\x1c\x2b\x25\x5d\xee\x13\x69\xfb\xae\x78\x1e\x34\xd3\x04\x29\xee\x1f\xe0\x45\xa8\xf7\x2d\x9c\x2f\x4d\xcf\xc0\xe1\x4f\xc6\x83\xd0\x73\x70\x6d\xa1\x2e\x2f\x95\x1a\xbb\xb1\x9a\x8b\x28\x10\x9d\x7b\x3e\x70\xa0\xee\xc0\x4f\x03\xcf\x87\xce\xfd\x4f\xa0\xd3\x98\xc2\x86\xcd\xfc\xda\xb5\xd1\x29\xb5\xb9\xa3\xd5\xfe\xfe\x70\xbf\xd8\xde\x1e\x96\x0b\x9f\x44\xd6\xa9\xe6\xe8\x8f\xfa\x96\x84\xe6\x88\xd8\xa8\x6b\x38\x8f\x4e\xb5\x49\x95\x07\xce\xe7\xef\x07\xed\x9a\x1c\x0f\xcd\x11\x0e\xb5\x9d\x46\xe3\x97\x92\x1a\x12\x42\xaf\x0c\xe5\xd3\x70\xa4\xbb\xb6\x49\x92\xbe\x4d\xb6\x17\xad\x7d\xae\x1c\x70\xf0\x0a\xab\xf4\x0b\x41\x9b\x16\xa1\x42\xc7\x06\x77\x5a\x44\x7f\x7f\xc0\xb0\x9e\x68\x91\x50\xe4\x3e\xf6\xc0\x9c\xf1\xed\x4b\x6a\xbf\xe9\x6b\xd6\x34\x50\xd4\xb7\x15\x86\x23\xfb\x72\x7f\x04\x94\xee\xfd\xad\x1b\xa7\x10\xd8\xbf\x79\xde\xaf\x37\x4f\x8b\x87\xc3\xf3\x66\xf3\xd0\x1d\x14\x91\x24\xdd\x33\xee\x41\x9c\x5c\x2f\xd4\xac\x4b\xac\x55\x68\x85\xb9\xcf\x87\x1a\x1a\xc7\x6b\xea\x0d\xc0\xec\xb6\xa2\x55\x0c\xc4\xe9\xcd\xb5\xdb\xa4\x68\xa0\x12\xb9\xa5\x82\x99\x7c\x40\x6d\x08\x66\x28\xed\xd3\x36\xf5\xee\x98\x0d\xe2\x2b\x0d\x21\x78\xa5\xb7\x6f\x50\xe8\x29\xdf\x85\x36\x49\x88\xc1\xfa\x72\x7f\x3f\x9a\xd5\x86\xa5\x84\xf8\x79\x71\x0b\x3f\x20\x2f\xcf\x7d\x42\x46\x1b\x15\x05\x8e\xff\xc6\x26\x63\x90\x4b\x66\xd6\x0a\x42\x10\x48\xe8\x11\xf6\x77\xad\x29\xac\x3e\x00\x33\xcd\xbb\x48\x10\x28\x86\x12\xb9\x8e\x6b\xbe\x5d\x66\x08\x05\x1e\xbd\x65\x08\xa0\x5b\x88\x3b\xc7\x29\x2a\x72\x35\x43\xa5\xda\x0e\x4d\x85\x63\xad\xb4\x11\x46\x87\x5f\x83\x30\xb6\xcd\x45\x07\x3b\x41\x2c\x2e\xc3\x1f\xa3\xf6\xa5\xc8\xcb\xfb\xf3\x76\xb5\xbf\x5d\xed\xbb\x3c\xaa\x2b\xec\x7c\xea\xea\x41\x48\x45\x30\x54\xd9\x17\xb3\x69\xdb\xc9\x6f\x98\xc2\xd8\xd0\x00\x78\xb0\x98\x3f\xa2\x6c\x9e\xc0\xf7\x3e\x8f\xb7\x14\x88\x42\x85\xf6\xa1\x23\xfe\x84\xb7\x9b\x4b\x51\x8c\x33\xdd\x1f\xf4\x91\x74\x8c\xa4\xfe\x5c\x44\x01\xe9\x99\x58\x86\xdd\xb0\x10\xc5\x01\xc6\x46\x8d\x78\x85\x55\x73\xbc\x2b\xab\x4e\xbd\x74\xfc\x24\x51\x1c\x78\xb9\x78\xcb\x5c\xb0\x2a\xa0\x7a\x79\xbf\x79\x9f\x6d\xee\x86\x98\xc4\x68\x99\x9e\xe0\x6d\xd7\x0c\x95\x7e\xc7\x67\x8d\x63\x8d\xa8\xaf\x9b\xf5\x7e\x33\x9c\xc1\x10\xb3\x08\x37\xa1\x5c\x8d\x09\x2a\x20\x16\x3a\xb5\xf9\xa9\x99\xca\xdd\xf8\x1e\x68\x00\x26\x72\x75\x84\xf9\x14\x3e\xd0\x08\x80\x7a\x25\x35\xdb\x00\xfa\xfb\xbb\xb2\xb1\xca\x0c\x4a\x07\x58\x90\xa2\xa3\x22\xf2\xfc\x51\xd4\xaf\x5f\x2e\xbe\x47\x15\x18\x00\x12\x01\x6f\x97\x4b\x9f\x04\xd8\x43\x57\x10\x06\x1e\x30\xd1\x11\x0c\xe2\x86\x5a\xd7\xd7\xb2\x26\x09\x70\x22\xc0\xcb\xbf\xfa\x3a\xdb\x28\x77\x03\xdc\x08\x8c\x1e\x1d\x47\xfb\x48\x7a\x7b\xf2\x76\x53\x22\x89\xe9\x25\x22\x2c\x3f\xaa\x3f\xa6\x94\xad\x20\x0e\xba\x5a\x9f\xad\xdf\xe9\x87\x88\x30\x15\x5e\x0a\xb2\x28\x1b\x51\x4d\x88\xd9\x40\x44\x16\x43\x06\xcd\xb1\x3d\xa0\xba\x1f\xd2\x08\x5b\xb0\xb3\x22\x6b\x3a\xe2\xef\xcf\x17\x97\x0c\x34\xf4\xd5\x02\x27\x4b\xbf\x17\xaf\x50\xdd\x00\x8a\xe8\x3d\xba\xff\xfe\xe0\x51\x75\x48\x31\xb0\x3d\xb4\x7e\x66\x95\xe9\x17\x78\x12\x4d\xf6\x03\x06\x21\xc2\xf4\x17\x14\x7c\xc9\xbf\x57\x4c\xe9\x5e\x8f\xe6\x02\x63\xfd\x33\x2a\xec\xb7\x5b\x4c\x0f\xc9\x04\x50\x09\xc7\x46\xf8\x93\xa8\x5e\x3b\x0c\xf5\xbc\x05\x30\xa1\x20\xce\xd6\xde\x97\xce\xdc\x7e\x5a\x21\x02\x43\x43\x4c\xc1\xe0\x66\x69\x7f\xe0\xbb\xb6\x26\x03\x99\xec\x24\x2b\x06\x82\xb1\x37\xef\xeb\x49\xae\x05\x8c\x26\xd8\x7b\xd5\x6e\x48\x50\x35\xe3\x82\xd3\x68\x45\x98\x40\x04\xe8\xcb\x6e\x9e\x56\xfb\xf5\xad\x0f\x2b\x4d\xc8\x52\xc4\x3a\x9e\xca\x42\x54\xea\x58\xdf\xbc\xcf\xc8\x7b\x26\x26\x62\x36\xea\x41\x52\xc0\x8b\x74\x6b\xb7\x0d\xec\xea\x1b\xc8\xcb\xb7\xff\x40\xe5\x53\xd2\x26\x92\x0a\xdd\xa4\x4b\x91\x35\xf5\xa6\x68\xcd\x8f\x23\x01\x77\x03\x88\x22\x98\x92\x7f\x9e\xba\x76\x26\x0e\x23\x0c\x27\x91\x2b\x07\x9f\xfd\xb6\x5f\x6b\x26\x8e\x00\xa9\x3e\x16\xcf\xfb\x6f\xdd\xdf\x74\x8a\xab\xc6\x88\x2c\xb7\x2b\xdd\x19\x5c\xff\xc5\x4d\x12\x59\x72\x8f\x76\xe7\x78\x47\xb2\x45\x7f\x20\xa6\x98\x6b\x5a\x3e\xac\x9f\xbb\xbf\xa5\x36\xaa\xb1\x04\xbb\xcb\x4b\x75\x4d\x29\x32\x6e\x48\x18\xbf\x64\x4a\x14\x26\xc8\xb0\x2a\x34\x13\x6e\x1b\x2a\x82\x38\x75\xe2\xef\x5f\xaa\xec\xb4\x05\xd1\x6e\xe0\x8b\x17\x91\x15\x75\x73\xad\xf2\x92\x18\xaa\x42\xc4\xf8\x94\x98\xfa\xdf\x98\xf9\x59\x6f\xa8\xa6\xb8\x77\xde\x6d\xbe\x3e\xdd\xae\xb6\x3b\x47\x49\xea\x9f\x8b\x31\xe5\x29\xcc\xec\x44\xf1\x33\xea\x76\x16\x5d\x6d\x98\x10\xb8\xd2\xa1\xd0\x58\xd5\xeb\x9a\xee\xdd\x71\x1e\x2b\xec\x4e\x73\x69\x7f\x2b\x4f\x08\xba\xc7\x0a\x3d\x94\xff\x50\xae\x36\x9c\xab\x40\x77\xcd\xff\x58\xb4\xf6\x67\x4f\x23\xea\xc9\xb5\xd7\x1a\x15\x12\xd7\x0d\x9c\xea\xe5\x10\x94\xfd\xaf\x39\x70\xa0\x49\x09\xb3\xe8\xa1\xcb\x69\x63\xba\xc6\xb0\xb5\x42\x4d\xa5\xfe\xfc\x2c\xb0\x3d\xea\x4e\xe5\x23\xfa\xff\x97\x65\xc7\x88\x48\xa6\x23\x2a\xe5\xc3\x5b\xd6\x1c\x0f\x06\xa6\x39\x23\x23\x22\xe3\xf1\x42\xd8\xf0\x7f\x5d\x9e\x34\x42\x19\x4c\xae\x1d\xb2\xda\xb9\xb7\xfe\x00\x50\x24\xed\x7e\x7c\x57\x47\xd1\xf4\xaa\x9e\x89\x91\x69\x6a\x3b\x43\xb2\x42\x7f\x2d\x96\x65\xe1\x49\xa7\x47\xef\x4e\x0a\x8a\x1f\xa4\xe7\x05\xef\xd0\xb9\x7e\x84\x4a\xd3\xb1\x00\x9f\x76\x0c\xa1\xaf\xdd\x06\x64\x54\x42\x10\x5c\xed\x93\xd7\x37\xc8\xee\xf9\x41\x51\xd6\x28\xc6\x89\xea\x66\xc1\xc6\xd8\x74\x78\x77\x2e\x69\x95\x12\x4e\xe2\xa7\xdf\x7c\xc7\x6e\x83\x51\xc6\xc1\x5d\x2c\xc2\x1e\x8b\xfb\xa3\xee\x06\xa3\xb5\xe2\xb6\x02\xdd\xc6\x1d\xdd\xdb\x32\x81\xc1\x80\x08\x91\xe4\x0f\xd9\x98\x7f\xfa\x9f\xb2\xfb\x63\x13\xd0\xe5\x6f\x8c\xe1\x91\xa5\xe3\x13\xa7\xf3\x00\x47\xe3\x8f\x42\x8c\x70\xbe\x5c\xd4\xd8\xec\x6f\xff\x4e\x83\x80\x58\x04\xac\x44\xb5\xbc\x09\x1c\x63\xa6\x74\x41\x83\x20\x01\xcb\x13\xa6\x42\xbb\x91\xc4\xcf\xfe\x32\x34\x08\xb8\x45\xfe\x59\xc5\x71\xd1\x46\xa9\x79\x97\xcf\xa3\x41\xa0\x23\xd7\xcc\x81\x6f\xcc\x51\x66\x55\x75\x63\x05\xf0\xfd\xb0\x90\xc4\x49\xbf\x71\xef\x33\x27\x47\x5d\x0e\xe5\x48\xba\xa1\x56\x20\x62\x24\x3d\xf0\x61\x0b\xcd\x3f\x54\x4c\xfc\x39\x95\x66\x2e\x6c\xf0\x8e\xeb\x2d\x34\xed\x7e\xe3\x6f\x30\x4a\x02\x84\x13\x66\xf5\x52\x34\xf0\x52\x0e\xca\xf0\xbd\x67\x47\x03\x92\x30\xd3\xcb\x74\x76\x80\x3e\xd0\xfe\xeb\xd4\x93\xa7\x21\x8e\x96\x5b\x68\x5c\x7d\xf7\x22\x37\xb7\x1e\x00\x40\x83\x38\x88\xad\x8c\xb6\xed\x2c\xb0\x30\xc0\x45\xa1\x47\xcc\xf0\xd3\x47\xfc\xa8\x39\x7c\xae\x70\x48\x03\xbf\xcd\x81\xd5\x9c\x68\xa3\xa6\xe1\x6c\x89\x95\x4d\x94\xee\xf6\x9b\xc3\xef\xab\x3f\xfd\x9f\x13\x6a\x35\x33\x91\x43\xe3\xa2\x9a\x1e\xe9\x4b\x83\x44\x1a\xed\x98\xa4\xf6\x8e\x44\x68\xce\xbb\xa7\x41\x62\x0c\xce\x44\x8c\x2f\xdb\x33\x74\x6f\x9b\x72\x8a\x33\x4e\x5d\x9a\x9b\xc5\xd7\xc8\x25\xf4\x3f\x53\xfb\x6b\x7f\x63\x79\xdb\x51\xd1\x74\x9c\xde\xa7\x01\x95\x0c\x59\x7d\x35\x9c\x4a\xd5\x81\x7a\x69\x40\x8d\x6d\xa7\x58\x2e\x6e\x7a\xa2\x03\x77\x8c\x87\x80\xa5\xa5\xff\x5a\x2c\x7f\x7f\xde\xec\x47\xfd\x73\x34\x48\x23\x40\xb7\x36\x7b\x29\xb2\xc1\x44\x4e\xb9\x8e\x51\x14\x29\xbf\xcc\xc3\xd5\x68\x90\xa6\x2c\xf0\x60\xd2\xa3\x28\x0a\xc8\x97\xd5\x07\xb8\x41\x1a\x08\x42\xd0\x6d\x10\x75\x0d\x56\x35\xc2\x2a\x69\x7e\x46\x47\x43\x03\x21\x24\x77\x0a\x00\x26\xcb\x61\xd0\xe3\x32\xdc\x78\x69\x20\xa3\x18\x81\x1b\x70\x82\xea\xa5\x03\xb6\xdf\x56\x83\x2a\xab\x1f\xc9\x84\xb6\x96\xaf\x68\x6e\x2f\x30\x47\xe6\x47\x03\x29\x18\x46\x03\x87\x8e\xe3\xe4\xc6\x12\xa1\x8c\xd7\xca\xe4\x11\x15\x89\xd0\xe7\x80\x1f\xcf\xe2\x7d\x73\xf9\x50\x75\x7e\xfa\x33\xca\x6d\xdf\x8c\xff\x6e\xbb\xa6\x3c\xf7\x02\xe7\x34\xd0\x81\xc6\xce\x5d\x2d\x1a\x31\xa0\x83\xa3\x81\x4e\xb8\xab\x6b\xdb\x66\x0e\xd0\x03\x7f\x80\x06\x1a\x80\x3b\xac\xf9\x5e\xd4\xaf\x57\x2d\xe4\xff\x1f\xff\x75\x57\x01\xc3\x91\xd5\x51\xe8\x1f\x59\x7b\xf5\x3e\x7a\xf0\xf7\x61\x18\x43\x9c\xda\xf2\xdb\xed\x20\xa8\xa5\x61\x20\x08\x36\x5f\x23\x74\x63\x99\x35\x42\xc3\x7c\x8f\x29\x0d\x03\xc3\x70\x92\x9e\x5d\x8f\xe9\xcd\xa5\x2a\x06\xec\x30\x6e\x54\x48\xad\x09\x7f\x5c\x3f\x1d\xd6\x4f\xdf\x56\xbb\xfd\xea\x71\xe5\x31\xe5\x34\x0c\x8d\xa5\x0f\xf9\xcf\x7e\x7b\x58\xed\xef\x0f\xf0\xb3\xa9\xc4\xe1\xdc\x67\xee\x69\x18\x45\x9c\x58\x47\x48\xea\xcc\xaa\xbb\x79\x76\x37\x3f\x22\xb1\x20\xf6\x76\xfb\xba\xbb\x14\xea\xb7\xf1\x66\x46\x43\x12\xa4\x42\xf5\x79\x72\x1f\xf0\x4d\xef\x95\x44\x11\xea\x0c\xc8\x4b\x55\x3c\x88\x09\x00\x8c\x86\x24\x66\x88\xda\x80\x9f\xe7\xbc\xac\x86\xc4\xab\x34\x24\x00\x98\x4c\x38\x64\xf5\x24\x09\xf9\x4b\xc9\x48\x77\x16\x64\x82\xf1\xb1\xbe\x2a\x4f\x59\xf1\x82\x11\xf8\xa2\xee\x52\xf1\x34\x4c\x78\x84\x48\x96\x87\xf2\xc5\x0a\x18\xac\x9a\xe3\x16\xfe\x9a\xdc\x6c\xa2\xb5\x47\x34\xed\x00\xf4\x0e\xf3\xc6\x37\x93\x07\x4e\xc0\x16\xef\x6b\x68\x9e\xcb\xaa\x31\x65\x9e\x5d\xb1\x1a\x5c\x41\x10\x69\x48\x43\xd0\xb1\x97\xae\x29\xcf\x9d\x73\x30\x78\xe3\x94\x59\xf2\x53\x09\xcd\xe1\x87\xa8\xda\xf9\xf1\x5b\x7f\xc8\xea\x7c\x5f\xa4\x2e\x11\x1a\x81\xc5\x86\x59\xe2\x78\xff\x13\x2e\x91\x8d\xc8\xa5\x9b\xe7\xfd\x0a\x3f\x56\x71\x6e\xb9\x61\x8a\x1d\x34\x37\xa2\xe8\xba\x4b\x68\xc8\x20\xc4\x70\xed\x29\x53\xf0\xe5\xf2\xbe\x17\x3f\xfd\x11\x1e\x58\xaa\x57\x24\xb5\xf2\xdd\xc1\x6f\xa5\xbd\xd2\xa2\xd0\x96\x81\xfd\xae\xd7\xe4\xa0\x21\xe7\xb6\xf0\xa9\x3f\xa0\xed\x9b\xdc\x17\xe7\x02\x49\xd1\x4d\x59\xbd\x89\x4a\x8b\x01\x4b\x87\x1f\x21\x6d\xf3\xaa\x6a\xbd\xc2\xbc\x03\x49\x4d\x46\xa5\xb1\x46\x6c\xac\x3a\x66\xb9\xfe\x58\xd4\x8d\x86\x69\x42\x8d\xec\x5f\xda\x40\x20\xd3\x0f\x48\x03\x04\x6b\x22\x7e\xd9\xe7\x96\x86\x6d\xde\x34\x14\x52\x78\xd6\xae\xc7\xa2\x39\x3f\x66\x2f\xd5\x30\xca\xff\xd7\xb4\xde\x4b\x43\xa1\xe3\xc8\x4d\xa9\x8d\x43\x16\x7e\xad\xf2\xdf\x46\x63\x24\xb5\x2d\x60\xd0\x1c\xa3\xbf\xb2\x4b\xdf\xdd\x4b\x43\x99\x06\x9e\x7d\x74\x0b\x39\x9a\xac\xef\x59\x73\x9c\xbc\x03\x09\x21\xce\x5b\x61\x13\x96\x07\x31\x2c\xc8\xd1\x50\x71\x4a\x07\x9a\x08\x4f\xf0\xe6\x88\xbf\x44\xde\x47\x89\xe3\x7f\x06\x53\x57\x93\x18\x51\x41\x0f\x5f\xff\xd8\xae\xbe\x3e\xfa\x93\x02\xb1\x1a\x6d\xcb\xb2\xb0\x6e\x49\x59\x75\x13\x7f\xfc\xe2\x21\x01\x4f\x28\x60\xf3\x90\xdf\x2c\x07\x2e\xae\xfc\xff\xf6\xed\x76\xdd\xbf\xfe\x57\xda\xb8\x5e\xe1\x76\x7a\x4c\x1b\xcd\x69\x14\x88\x94\x24\x0e\x59\xbc\x2f\x07\x69\x63\x1a\x05\x4a\x61\xe4\xf1\x45\x14\x4f\x77\xfb\xee\xaf\xc6\xe8\x9e\xaa\x79\x51\x64\x27\x91\xd7\x7f\x74\xe4\xe7\xce\xab\x8c\xc2\x20\x21\x8e\xe5\xcc\x69\xd7\x58\xad\x8b\x59\xb7\x2a\x0a\x25\x93\x56\x17\x4b\x58\xcd\xe3\x69\x4f\x0d\x8d\x48\x6c\x85\xf5\xb7\xd6\x2b\x77\x7c\x93\xbb\x49\x61\x81\x46\xc4\x28\x6c\xa4\xbc\x14\xb6\x28\x39\x7e\x8b\x51\x9c\x30\x94\xb1\x2b\xe0\x67\xf3\x8c\x29\x2e\xfc\x7a\xee\x68\x12\x46\xe8\x90\x2d\x37\xeb\xa7\x9b\xf5\x97\xc1\x9f\x11\xa3\x8b\xcb\xf8\x58\x95\x6f\xed\x5a\x36\x50\xfd\x07\xaa\x72\x98\xa3\xa4\x51\x22\x09\xa6\x2f\x9c\xf0\xc9\x61\xf1\xf0\xb0\xf9\xbe\x78\x5a\xae\xfc\x00\x2a\x6d\xc1\xb7\x34\xc6\xff\x89\x45\x84\x39\xbb\xe7\x53\x6a\x57\x7c\xa8\x38\x4a\x22\xa7\xe7\x25\x7f\xed\x52\x8b\x36\xdb\x3d\xc4\x20\x4f\xad\x6a\xc4\x88\x51\x93\xd8\x69\x58\x66\xa5\x11\x13\x0a\xdc\xda\xb8\x5d\x96\xa7\xd3\x4d\xbb\x9d\x35\xb5\xdf\x0c\x47\x5b\x49\x94\x26\x29\x52\x68\xd6\xe5\xa5\x39\x0a\xc7\xcf\xee\x8e\x09\x22\x79\xe8\x79\x2a\x2f\xb5\xcf\xca\xed\xdf\xca\x6e\x04\x0d\x89\x35\xb8\x58\x98\x39\x79\x42\xb0\x7a\x64\x1e\x22\xc1\xc2\xd4\x72\xae\xb6\x73\xf6\x5e\xe4\x3f\x5c\xf7\xc0\xb0\xe7\x8d\x46\x42\x27\x38\xec\x9c\xfd\x84\x2e\xea\x89\xa4\x12\x98\x4a\xd8\xb5\x9b\xdd\xcc\x7b\x54\x34\x42\x90\xcf\x43\xf9\xb2\x45\xfc\xf2\x53\x39\xdf\xbd\x3c\xa0\x5e\xa1\x91\x8e\x40\xf5\xb2\x1e\x53\xd3\x38\x5d\x75\x91\x4e\x04\xf6\x87\xad\xf4\xe5\x11\x9a\x2a\xf3\x1b\x42\xa4\x85\x55\x04\x40\xd1\x8f\xba\xb9\xce\x80\xd1\x48\x4b\x48\x69\xd7\x0f\x07\x0e\x8f\x3e\xba\x19\x20\x2c\x1d\x38\x83\x7e\x4d\xcd\x46\x4b\x11\x44\x96\xd9\x40\x95\x95\xfe\xcf\xe4\x5a\xe0\x8c\x12\xd6\x9e\x94\x55\x4c\xd5\xf0\xf3\xae\x2a\x4f\x5b\xf1\x36\x1f\x0c\x44\x10\x6b\xac\xd0\xa8\xc3\x19\x39\xb6\x11\x40\x3a\xaa\xe2\xb4\x63\x00\x49\x45\x6c\x60\x8a\x98\xde\xc9\x3a\x35\x01\xb3\xfb\x35\xb8\xee\x2d\xfb\xb5\xe7\x77\x9d\xc8\xa4\x96\x56\xdb\xb5\x95\xdd\xe4\x42\xbd\xe6\x18\xa5\xba\x87\xdf\x9d\x6d\xc7\xe0\xe4\x22\xc2\xb6\x30\x3d\x57\x65\x69\x36\x66\x2b\x2a\x78\x86\xb3\xdf\x16\x22\x23\x14\x76\xa6\x9e\xb2\x5e\xa9\x99\x46\x06\x1c\x18\x4d\xdb\x0c\xeb\x68\x97\x21\x01\x27\xc6\x11\x45\xc0\xfb\x20\x39\x4e\x49\x98\x44\xd8\xbd\x81\x58\x86\x4d\x01\xab\x2e\x24\x25\xa1\x31\xc8\xae\xf0\x52\x89\x62\x5e\x32\xf5\xd3\x04\x19\x25\x91\x48\x02\xef\x48\xec\xa0\xb9\x9c\x9f\x2b\xec\xfc\xce\x06\xde\x37\x21\x22\x42\x13\x71\x28\xe0\xed\xb9\x3d\x39\x54\x53\xa0\x10\x25\x71\xa8\x6c\xaa\x0d\xbf\x4c\x7e\x0e\xe3\xf1\x3b\x23\xb1\xb2\xb2\xc7\xa8\x51\x68\xab\xb3\x8b\xc2\x56\x5b\xae\x12\xec\x94\xc4\x3a\x45\x8f\x0c\x33\x85\xab\x76\xcb\xc7\xaa\x57\xe4\xef\x29\x61\x26\xb1\x4b\xbe\x56\x55\x86\x4d\xdb\x36\xa7\x3f\x7e\xab\x89\x16\xe8\x6b\x7f\x2b\x31\xf6\xea\xf7\x4d\x92\x80\x05\xad\x60\x73\x46\x2e\xa4\x6d\x77\x0a\xbb\xf3\x43\x82\x09\xf1\x2e\x7c\xbb\x2b\xab\x2b\x9f\x84\xd0\xc4\xe6\x33\x35\x88\x7c\x0b\x3f\xa0\x9a\x6c\xae\x84\x1a\x25\x2c\xf4\xa3\x11\xd9\x75\xbc\x41\x18\x89\x70\xf7\xb1\xc4\x28\xb3\x1f\x6f\x02\x27\xa4\x84\xc9\x9e\xe8\x53\x94\x93\x13\xf2\x34\x40\x86\xba\xbb\xac\x10\x79\xf6\x37\x76\x6a\xfb\xa8\x10\xf9\x5e\x3e\x9a\x17\xd3\xd3\x18\x8c\x2d\x70\xe3\x7e\xae\x4a\x65\x21\x06\xb7\x20\xae\x43\x85\xf1\xdd\x71\x15\x60\x44\xe9\x60\xe9\x79\x59\xc0\x3f\x42\xfa\x07\xfe\x0c\xe1\x9a\x23\x55\xa9\xb5\x88\xfb\x72\x7e\xe1\x92\x34\x08\xa9\xec\x93\x69\x5d\x17\x21\x25\x29\x0d\x10\x58\xf7\x04\x6f\xce\x00\x8f\x40\x7b\x7e\x94\x56\x98\x16\x00\xc7\xed\x6d\x2b\x94\xee\xa0\x08\x40\xf6\x62\x5a\xc3\xc6\x00\x4a\x04\x21\x58\x80\x5e\xd7\xbb\xd6\xe9\xc3\x9e\x2e\xbf\x55\x11\x19\x24\xd8\x14\xa0\xb3\xba\x7d\xf3\xcf\x96\xc7\xb5\x3b\x4a\x0c\x76\x6e\x4b\x87\x67\x5a\x9f\xac\x66\x3c\xed\x06\x70\x85\xa9\xd1\x76\xa1\xed\x2f\x05\x6c\xce\x1d\x2a\xa0\x17\xc5\xbc\x4a\x81\x5a\x88\x56\xc4\x87\x1d\x04\x94\x48\x95\x22\x82\xac\x5d\xd9\x87\x6e\x5a\xab\x20\x14\xa6\xab\xd1\xb9\x65\xb8\xee\xa2\x04\xa2\x22\xb0\x50\xd5\xf6\x7b\x23\x0c\xc8\x5a\x7f\x7f\x56\x95\x5a\xf0\x4e\x05\x1a\x25\x78\x06\xba\x3b\x94\x28\x90\x68\xe0\xbe\x41\x26\x5e\xfe\xcf\x64\x99\x9f\x32\x10\x51\xa2\x43\xe0\x71\x37\xaf\xbe\x95\x8d\x50\x43\x2e\xe2\x0f\xc3\x3f\xa2\xdb\x90\xdb\x4a\x98\x88\x4b\xee\x88\xfe\xcb\xaa\x6e\x9d\x1d\x75\x1c\x83\x5b\x29\x81\xc0\x70\x3e\x52\xad\x07\x3d\x42\x04\x52\x02\x69\xa0\x5d\xc3\xd9\xcd\xe5\xfd\xa9\x7c\xf3\x49\xec\x2b\xed\xec\x7e\x56\x9b\x88\xe2\x86\xe8\x30\x0b\x0f\x59\xf1\xfa\x41\x95\x9d\x12\xc3\x02\x35\x62\x41\xb9\x41\x17\x6b\x62\x59\x0c\x4f\x62\xb7\xc7\x34\x8e\x9b\xe0\x1a\xb3\x3c\xf9\x49\x6a\x0b\x3f\x79\xf9\x92\x15\x16\xe5\x31\xb9\xb2\x62\xd0\xde\xe5\x31\x7b\x39\x6e\xcb\x1e\x24\x4a\x89\x31\x89\x48\xaf\x69\x21\x47\x3f\x8f\x03\x25\xf0\x13\x2d\x5e\x2a\xc0\xf6\xcf\x67\x18\xb7\x47\xd1\x38\x0c\x19\xd6\x15\x44\xd5\x64\x75\x53\xcf\x32\x8e\xd3\x38\x64\x21\x76\x69\x9e\x3d\x69\x9b\xf9\xaf\xec\x4a\x1b\x9a\xc6\xa1\x52\x18\xbc\x41\x9e\x9d\xb2\x42\x54\xd3\x49\xd1\x0f\x43\xca\x96\xd7\x77\xe5\xd2\xc6\x7a\x7a\x3d\x10\x18\xca\x6e\x37\x5f\x9f\x6e\x0f\xb7\x5f\xad\x3a\xa5\x7b\xf6\x38\x52\x2e\xf0\xb4\x3c\x19\xab\x9f\xe7\xbc\xcc\xe6\x81\x97\x34\x26\x89\x90\xbe\xef\x7c\xe0\x61\x75\x37\x43\x94\x90\x16\x2b\x58\x40\x55\x5e\x6a\xaf\x07\xee\x2f\x96\x84\x14\x6b\xd5\x7f\x96\x97\xaa\x6b\x2c\xef\x0f\xa6\x88\xf1\x7b\x7b\x13\xa7\xf5\x72\xe3\x49\xf2\x46\x00\x4f\x1a\x27\x2a\xd0\xc3\xbe\xf3\x91\x8a\xeb\x78\x4a\xc4\x8c\x1a\xf4\xbb\x4d\x9e\x9d\x87\xde\x92\x3f\x9c\x2a\x7c\x31\x67\xf1\xee\xc3\xe3\xc9\x37\xe0\x4a\x26\x6e\x33\x7a\x76\x9c\xfb\x33\xcd\x09\x34\x4e\x63\x21\x51\xe6\xfb\x7e\xf1\xfd\xb0\xfc\x73\xf9\xb0\x3a\xdc\x61\xc1\xd4\x5f\x2a\xd5\x06\xb3\xaa\xe7\xaa\xdf\xb0\x36\xdd\x6b\x11\x0e\x86\x69\x2e\x85\x1e\x39\xf5\xb1\x90\x0a\xa1\x57\x67\x61\x3b\xab\x56\x05\x76\xd8\x4e\x2e\x2f\x09\xb1\xaa\xd2\x38\x7f\x3f\x84\x50\x0c\xbc\xe1\x58\x72\x2b\xef\xbd\xd0\xfa\xc9\xfa\x3d\x4d\x76\x0d\xbb\x99\xbc\x4f\xc5\xa4\x71\x00\x8e\xd5\xa5\xba\xab\x5c\x6b\x88\x3b\xaa\x39\x8d\x46\x24\x5c\x16\xf6\x75\xfb\x9a\x8f\x8a\x6b\x34\xd6\x4a\xa6\x5e\xf8\xea\x7e\x6f\xe9\xa7\x87\xc1\x55\xac\x75\x14\x0f\x80\x28\x03\x14\x25\x3a\x54\x30\x5d\x51\x90\x32\xd4\xb9\xde\x2e\xf6\x3e\x64\x8c\x41\x5a\x6d\x5c\x47\x68\x5f\x9e\xce\xa2\x78\x1f\x15\x3e\x27\x0f\x67\xe2\x34\xb0\x01\xa5\xc8\x9d\x96\xe8\x68\x72\x27\x41\xa2\xd1\x1d\x75\x3d\x0c\x59\x7d\x7b\x39\x49\x77\xb9\x24\xe2\x56\x94\x51\xe8\xff\xbd\xb8\x02\xeb\xa2\xd0\xe8\x60\x6c\x8c\xcd\x3c\xdc\x22\x9b\xc4\xb3\x25\xec\xf9\xb4\xf9\x94\x26\x84\x04\x48\x61\x5f\x5f\xce\xed\x2e\xea\xe8\x17\x7f\x9b\x0c\x92\x5d\x0f\xe2\x17\x71\x42\x9e\xd2\xa9\xa7\x99\x24\x41\x84\x40\x99\x0e\x64\x34\x72\xa3\x3f\xee\x28\x6d\x7f\x49\x11\x49\xbd\xc4\x36\x71\x03\x13\xd5\x25\x9a\x24\x11\xa0\x1d\x13\xda\x0b\xed\xde\x95\xd5\x4d\x27\xba\x98\xc1\xc7\x64\x7e\x34\x49\x34\xd3\x56\xb2\x46\x03\x9c\x66\x54\xfa\x69\x92\x18\x83\xb9\xe6\xef\x20\xeb\xac\x81\xfb\x12\xaf\x31\xba\x05\x4a\x53\x2c\xd6\x89\xba\x2e\x55\xe6\xc4\x84\xf7\x20\x4e\x93\x4f\x47\xa9\x40\xd3\x72\xba\xe4\x0e\x2e\xf8\xc9\xad\x31\x9a\xe0\xbb\x6f\xf7\x9e\xdb\xed\xae\x67\x9d\xa0\x09\xe3\x1c\x89\xf1\x4d\x56\xd5\x4d\x67\xc0\x06\xb5\x88\x84\xc9\x08\x43\xae\x0a\xf2\x52\x68\xcb\x69\xf5\x41\x7d\x28\xe1\x61\x8c\xe2\x44\x07\x47\xe2\xd4\x49\x8f\xd7\x8d\x38\x9d\xfd\x19\x79\x44\x10\x9b\xfa\x0c\xea\x92\x67\x97\x53\xf7\xf7\x24\x44\x37\xee\x4d\x14\x2f\x3f\xb3\xa3\x28\x67\xeb\xa3\x6e\x70\x1a\x24\xca\x76\x20\xda\x0e\x78\x94\x58\xff\xd2\xf5\x8b\xd2\x24\x25\x2e\x45\xd1\x86\x49\x4e\x39\xff\x3a\x0f\x90\xa4\xdc\x36\xaf\x59\xac\xf2\xa9\x9c\xd1\x8c\xa7\x49\x9a\x8a\x78\xd8\x11\xed\x84\x4c\x9e\x51\x33\x1d\x5a\xdf\x70\xc8\xf2\x85\xdd\xdc\xd8\xc4\x97\x67\x7f\x5d\x32\x9d\x35\xef\xa8\x8e\xe9\x0e\xca\x40\x63\xdd\xff\xd0\x88\xfa\xd5\x52\x8c\x0c\x63\xa0\x44\x86\x12\x5f\xf8\x01\xe5\xd0\x67\x67\xb2\x4c\x42\xe5\x74\xdb\x2f\x35\xe8\xc5\xf3\xba\x3b\xb9\x52\x98\x6f\x43\x46\x98\xda\xb1\x0b\xf4\xe9\x89\xde\xc5\x49\x24\x08\x6c\xd1\x5a\xe1\x36\x89\x15\x2f\x51\xc3\x30\xc1\x90\xa8\xc0\xd5\xe2\xdc\x4e\xe1\x44\xfd\xa6\xec\xae\x34\x51\x22\x46\x9e\xec\x6f\x5f\x47\x93\x59\x73\x91\x20\x5b\xe0\x62\xfd\x64\x65\x5f\x57\x4f\xb7\x28\x82\xd2\x8d\x00\x9b\xe2\x39\x5d\x9a\xac\x9d\xc6\xed\xd4\x6c\x67\xfc\x6d\x66\x10\x7a\xd1\xcc\x12\x5a\xcc\x4c\x71\x6d\x62\x94\x27\xae\xff\xaa\x9a\xdf\x46\xef\x0a\x02\x8a\xd5\x99\xcd\x62\xff\x49\x3e\x3b\x01\x29\xd0\xd6\x5b\x51\xb0\xbb\xb2\x52\x80\x0d\x98\xd3\x3a\x4d\x62\x82\xd4\x74\xd8\x66\x4f\x93\x33\x41\xa5\xfa\xa1\x49\x88\x3e\xdf\x7f\x6d\xfe\xe3\x1f\xd8\x48\xab\x3d\xf6\xe7\xcd\xaf\x51\xe0\x63\x51\x5a\x58\xe2\xec\x62\xa2\x32\xd6\x1e\x53\x68\x2d\xbe\xb4\xae\x6d\x96\xb7\x53\x1c\x81\x5b\xa3\x3b\xa6\x81\x8c\x90\xd7\xea\xf5\x11\xdd\xc8\x57\xbf\x44\x68\xa0\x05\x73\xad\x29\x9e\x41\x6f\x87\xc9\xe7\x2b\xd7\xd8\xbf\xee\xe8\x1f\x44\xf0\xfc\x89\x41\x60\x0a\x64\xbb\x78\xfa\xb2\x6a\xbf\xb9\xa7\xba\x6f\x7d\x7b\x5b\x39\x7f\x5c\xfc\x71\xb8\x5d\xac\x1f\xfe\x3c\x2c\x37\xbb\xf5\x97\xa7\xc3\xae\xd3\xc5\xa1\x34\x4c\x23\x24\x3f\x39\x1c\x0e\x17\xdb\xde\xbf\x2f\xa7\xd8\x81\xc1\x44\xa5\x51\x62\x9b\x29\x6c\x1b\xee\x18\x4e\x82\x59\x28\x69\x11\xb3\x4e\xb1\x71\x4a\x69\x44\x29\x89\x45\xe8\x92\x6d\x36\x95\x3d\x2c\xbf\x51\xc2\x12\x70\x8d\x41\x07\x2c\xf2\x1d\x86\xa0\xd1\x01\x85\x7b\x1b\xc7\x49\xdc\x9d\x10\x85\xf6\x28\x1a\x75\xbc\xf2\x40\xfe\x21\xac\x1a\x54\xf0\xdc\xff\x1d\xdd\x69\xcc\xb5\x76\x95\xb7\xd6\x9a\xad\x55\x39\x79\x94\x04\x02\x4f\x2a\xab\xc1\xf1\x81\x8f\x56\x6b\x1b\x63\x21\x71\xdf\x1f\xcf\x0b\x14\x3b\xbc\x22\x15\x98\x0f\xe9\x5a\xa7\x2f\x50\xc3\xca\xc3\xee\x2c\x14\xb4\xe6\xe0\x46\x34\x4d\x0e\x0f\x65\x5d\xc3\x35\xfa\xb2\xfd\x7f\x36\x0d\x6a\x8b\x0f\x03\x5b\x48\xa9\xb6\x5a\xe8\x4d\x76\x82\x1b\x68\xde\x00\x0a\x84\xd1\x79\xe7\x98\xb2\x50\x61\x80\x7b\x77\xf3\xe0\x5a\x35\x06\x10\x8f\xf6\x28\x4a\x19\xb5\x96\x6b\xe7\x5a\xb9\xab\xf9\x0d\x83\xb2\x44\x61\x06\xca\xba\x4f\x2e\x46\x9c\xec\xd0\x94\xa5\x42\xb1\x61\x4f\xee\x95\xeb\x39\x6b\x3d\x28\xd7\x16\x8e\x56\x5f\x24\x1a\x85\x0e\x10\xf6\x0f\x3f\x33\x36\x29\x9f\xd5\x8b\x8b\xce\x86\x9c\xf1\xe3\x7b\x4f\x23\x82\xc9\xaf\x5e\x32\xe4\x47\x98\xdc\x8b\xfa\x78\x70\xe7\xf3\x2f\x24\x65\x31\x02\xcf\xee\xc5\xe9\x6f\x31\xd8\xe7\xa9\x20\xb6\x70\x66\xd1\x3d\xf3\x2c\xdd\x94\x0a\x63\x89\x76\xcf\x15\x9c\x45\x05\xcf\xd5\x58\xd2\xef\x53\x5f\x9a\x4a\xa6\x71\xeb\x71\xc9\x94\x4e\xe3\x9d\x52\x99\x86\x76\x53\x6a\xc3\xc8\x76\x6d\xf5\xf7\x25\x81\x7a\x39\xf7\xb5\x2a\x87\x65\x89\xf1\xc9\x15\x03\xec\x7b\xf9\xbe\xfe\x8f\xdf\x3c\xa8\xd2\x31\xae\xfa\x36\xf0\x76\x73\x2e\x8c\xf8\x3f\xe5\x27\x46\x77\x4f\xe3\x91\x1d\x51\x5a\x88\xa0\x37\x03\x13\x5f\x81\x6a\x41\xd1\x8b\xb7\x62\xea\x47\xd1\xe1\x32\xa8\x06\xae\x47\x2a\xf6\x98\x0c\x77\x02\xc3\xe3\x93\x40\x28\x31\xd9\x3c\x93\x0c\xa7\x90\x70\x8c\x26\xdb\xb0\xa9\x7d\x7f\x97\x6b\x9c\x16\x05\x23\x30\xa5\xf3\xd6\x37\xae\xb8\x23\x26\x20\x89\x6b\xe6\x44\x76\xe4\x2d\xb4\x9b\x68\x3b\xc9\xc7\x57\x31\xb1\x12\xda\x83\x97\xbe\x43\xf6\x5d\xbc\x40\xd5\xe1\x1d\xa8\xa1\x3c\x26\xbd\x7c\xa8\x1e\x87\xab\xd4\xa8\x58\xc7\x5d\x33\x45\x81\xfe\x10\x5c\x4e\xfb\xd2\xa6\x5b\xdd\x30\x16\x48\x2b\x80\xfe\x02\xcd\xad\x2d\x27\x8e\x1c\x58\x46\x42\x40\xec\xf6\x43\xf9\xf2\x04\x6f\x1d\x7d\xd0\xb0\xc7\x6b\x7e\x9e\x31\x42\xac\x02\x66\x97\xea\x45\x90\x68\x79\x69\x0e\xb2\xe7\xff\xa2\x8c\xc4\x96\x28\xf2\x51\x64\xc5\x35\x22\x6f\xbc\xc0\x18\x49\x8c\x85\xff\x9c\x33\xf5\xea\xd2\x90\xfe\x50\x1a\x28\x5b\x48\x2a\xb4\x4d\xf6\x0f\xab\x6e\x83\xdb\x52\x10\xd9\x6a\x15\xb2\xe1\x1c\x4a\x83\x4d\x68\xed\x92\x3d\x54\x65\x6f\xb4\x18\xd1\xd6\x73\xb5\xd8\xb1\xd2\x95\xd9\x87\x1b\x0e\x8b\xa5\xed\x52\x57\x79\x59\xfb\xac\xa2\xf7\x7d\x06\xe4\xaa\xc4\xed\xb7\x8c\x72\x16\xea\xc1\x27\x3b\x98\x81\x0d\x65\x54\x08\x84\x3c\x3f\x9e\xf3\x4b\xdd\x05\xeb\x37\x1f\xbc\x0a\x16\xc5\x96\x92\xde\x32\x58\x6f\xa1\x3e\x97\x45\x3d\x12\x3e\xa7\x8c\x29\xcb\xb4\x34\xec\xd2\x70\xa5\x58\x7f\x55\x66\x40\x3a\x1f\xb5\xdd\x34\x0f\x42\x29\x38\xf7\x70\x33\xc6\xc3\x44\x78\xd1\x7f\x51\xec\x20\x9f\x04\xd5\x8c\x73\x4b\x09\x58\x01\x2a\xe8\xd6\x9b\x5c\x4f\x76\x76\x96\x46\x52\x84\xae\x78\x34\xf2\x8c\x98\x88\x0c\xc2\x0f\x9d\x52\x9f\xe3\xb5\x1d\xcd\x64\x26\x49\x8a\x5e\x46\xeb\x57\xcd\x35\x7d\x53\xa6\x24\x43\xa4\x53\x5d\xe6\x7a\xad\x41\x7c\x87\xec\x19\x7b\xae\xfc\x29\x74\x62\x35\x7e\xdf\x86\x4f\x0e\x2a\xa6\xca\xab\xba\x23\x99\xf3\x3e\x83\x6a\xd7\x88\xa6\xbb\xb4\x09\x69\x42\x7b\xdd\x91\x9b\xd2\xe7\x04\xbb\x01\x69\x12\x3a\x4b\x74\x83\xb1\xcb\x51\x74\x87\x14\xc5\xdb\x5e\xab\x63\xf6\x52\x0e\x1d\x6e\x1e\x84\x04\x33\x7a\x28\x37\x78\x88\xba\x3f\x47\x1c\xf3\xd4\x7d\xc3\x90\x6d\xfd\xdd\x97\xcf\x55\xf6\x43\x7c\xa0\xee\xd8\xfe\x4e\x20\x01\x26\xe6\xd5\xbf\x40\xe1\x24\x57\x07\x0d\x67\x94\x07\x84\x43\x97\x81\xee\xe9\xee\xfc\xd1\xc4\x4a\xd9\xe2\x44\x1e\x6c\xfc\xbc\x0d\xc5\xc1\x12\x95\x62\x30\xf5\x28\x7e\x66\xa7\x2e\x14\xe4\x21\x85\xc8\x6d\x0b\xb8\xb7\x37\x95\xc5\x51\x8e\xef\x2f\x94\xa9\xf1\xe6\xb2\xde\x8a\xac\x93\xc9\xa5\x3c\x4a\x65\x48\x7b\x54\xee\xd0\xf1\xf7\x23\x40\x18\xa7\xf3\x57\x83\xba\x54\x13\x63\xcf\x09\xe1\x61\xd7\xe2\x6e\x9d\xe3\x4f\x2b\x76\xfe\x67\x54\x20\x9b\x80\x13\x8d\x41\x80\xf5\x6c\x45\xf9\x9f\x60\x76\x9c\x00\x60\xf4\x80\xe7\x78\xce\x45\xd1\x25\xd1\x38\x31\xa9\xb0\x1e\xed\x0e\x9a\x26\x1f\x24\xb3\xdd\x80\xd8\x18\x2c\xaa\x48\x44\xcd\xed\xfa\x5f\x26\x89\x56\xaa\xf3\x03\xd6\x78\x3f\x03\x12\x33\x37\x8a\x82\xa5\xc1\xb3\x05\x15\x07\xb5\xd0\xa3\xc2\x0a\x67\xb1\x52\x08\x8b\x43\xd1\x8a\xc9\x1e\xc3\x59\x92\x24\xb1\xe3\x06\x73\x9a\x2c\x83\xcc\x28\x67\x89\xc0\x36\x45\xd7\x85\x71\xd8\x7f\xdf\x74\x87\x28\x93\x23\x51\x84\xaa\x3c\x0d\xbb\xf2\x3e\xda\xce\x87\xcb\x9f\x73\x20\x08\xa7\x59\xad\x9f\xa3\xe0\x9f\x83\x2c\x9e\xc6\xda\x69\x51\x5a\xfe\xf9\x63\x05\x70\x5f\x36\xf7\xe5\xa5\x9a\xe9\xc0\xa4\x3c\x85\x88\x8f\x88\xf5\xbc\x7b\xc4\xe7\x62\xd4\x69\x7c\xc4\x45\x60\xb9\x3e\x73\x81\x92\xff\x83\xdd\x81\x8b\x28\x08\x7a\xae\xe9\x8e\x81\x66\x42\xb2\xdf\x8e\x33\xd4\xf2\x6a\xf4\xbc\x06\xfe\x90\xe0\x98\xe7\x42\xee\x35\x18\xf0\x14\x50\x2e\xa4\xc1\x7c\x67\xbb\x2b\xe1\x65\x2d\x3e\xd9\x96\x62\x31\x5b\x33\xd0\x4e\xa2\x5c\xe8\x18\x25\x4f\x1e\xe7\x69\xa3\x47\xb5\xc1\xd1\xfb\x94\xa1\xc4\xbe\xdc\xc5\x66\x89\x7d\x03\xde\x36\x72\xa9\x6d\x9d\xf6\x26\x6b\x8e\x90\xe7\x63\xf3\xa5\x42\x11\xd3\x4e\x05\xf3\xe6\xe9\x66\x39\x10\xba\xf7\x63\x78\x82\x74\xfb\xb7\x8b\xfd\xfa\xe9\x4b\xf7\x57\xc5\xf4\x50\xdf\xb1\xfd\x61\xef\x8c\x70\x65\x52\x4c\xbc\x3d\x6c\x76\xab\xed\xe1\x61\xb3\xfc\x7d\x98\x85\xe0\x3a\x31\xc8\xa7\x60\x5b\xe7\x06\x0b\xf6\x3a\x9b\xd8\xe1\x86\xaf\x2b\x58\xee\x64\x10\x18\x2a\x06\x7a\x2d\xf3\x88\xb0\x19\x9e\x1e\xca\x21\x4c\x70\xc7\xf3\xfc\xcc\xff\xbe\x64\xea\x75\x59\x16\x3f\xa0\x6a\xfa\x57\x08\x60\x12\xcf\x18\x72\x88\x0e\x27\x68\x8e\x1d\x18\x86\x1b\x21\x90\x9b\xd3\xb1\x93\x64\xd2\x51\xf6\x93\x6e\x80\xb6\x64\x4e\x42\xff\xd8\x0d\x74\xed\xe6\x52\xea\x69\x10\x2a\xbc\x92\xca\x41\xa0\xea\xd1\xa3\xe7\x40\x6a\x8f\x81\x71\xfd\x9c\xe8\xde\xad\x0b\x53\xde\xbc\x8f\x9a\x31\xfd\xc8\x44\xa2\x53\x5d\xfe\x80\xea\xad\xca\xba\x92\xff\x68\xc6\xa4\x01\xd3\xa1\x8b\x6b\x9f\xe0\x67\x83\xd8\x44\xe7\xd4\xf3\xc0\x8f\xe1\x34\x76\xbc\x02\x7b\x10\xa7\x59\x0c\x59\x1a\x18\x12\x38\xbb\x7d\x98\xea\xb2\xd3\x34\x8c\xa9\x57\x52\x75\x9c\x4d\x98\xad\x1f\xd6\x45\x71\xcc\x80\xf1\xa0\x9d\xa1\xf3\x97\x22\x92\x22\x64\xd7\x63\xcc\x46\x39\xff\x34\x4e\x52\xc1\x06\x8a\x67\xed\xcc\xac\xde\x5b\x73\xe6\x5e\x58\xfb\xaa\xc6\x27\x8c\x53\x89\x6e\x01\x14\x7a\x9c\x3b\x18\xfd\xe3\x07\x03\xc7\x2f\x59\x5c\x4e\xb6\x0a\x04\x7a\xf1\x33\x1b\x6a\x6c\x75\x69\x89\x34\x89\x52\x6d\xba\x7b\x69\xef\xa1\xf3\xb8\x3f\x20\x6e\xa5\x69\x12\x87\xda\x31\xb2\x7c\x11\xf5\xb2\xac\x1b\x1f\x62\xf9\x01\x8c\x60\xfa\x48\x8a\xe6\x24\xfc\x22\x4e\x13\x9e\x60\xbe\xea\x60\xb2\x97\xe6\x68\xb3\x8b\x53\xb8\x61\x9a\xc8\x24\xb5\x8d\x65\x70\x72\xc9\xd4\xef\x90\x75\xa7\x30\xa9\xad\x6a\xfb\x8a\x2a\x0a\x12\x34\xd7\xd9\xdb\x94\x2a\x81\x54\x18\xa6\xac\x14\xdc\x5c\xaa\x62\x44\xf3\x32\x1e\xcb\x42\xe5\x43\x4d\xe7\x96\xf9\xac\xf0\x15\x1d\x27\x4d\x19\x09\x31\x1d\xf8\x7c\xbf\x7a\x1e\xda\xa8\x94\x09\x5b\x34\x45\x08\xe9\x5f\x97\xac\x02\xfd\x98\x15\x9d\x7d\x4a\xb9\xb4\x14\xad\xd6\x05\xdb\x7f\xdf\x4c\x44\x9f\x69\xca\x4d\x18\x87\x83\xbd\x06\x84\xab\x16\x2c\x4c\x03\xd5\x58\xd9\x86\xa6\xa9\x4e\x71\x27\xdf\xb5\x3e\x4a\xd6\x64\x50\x77\x7e\x5d\x9a\x42\x6c\xb3\x15\x35\xaa\x2d\xdf\x95\xd5\xb2\xf5\xb3\x26\x8f\x22\x92\x04\x53\x52\x59\x91\xb5\xd1\x37\xa2\x04\x6e\xca\x1f\xfe\x24\x82\xdb\xad\x0c\x85\x0b\xca\x97\x4a\x9c\xea\xd1\x6a\x90\x0c\x3a\x85\xd1\x76\x6f\x70\x4b\xe1\x9a\x91\x9b\xa6\x4a\xd8\xd0\xd6\x42\x8c\x6f\xa0\xb9\x79\x1f\x09\x43\xb8\x61\x9a\x6b\xec\x5a\x5c\x68\x5d\x56\x8f\xa5\xce\xcc\xfb\x36\x7b\xf9\x25\x32\x05\x9a\x6a\x61\xac\xf8\x58\xd9\x4e\x98\xf1\x31\x88\xb9\x70\xe5\xa3\xf9\x02\x45\x0a\xad\x6f\x64\xa9\xc3\x1c\xaa\x63\x5f\xc1\x04\x53\x90\x82\x64\x74\xb8\x99\x74\x35\xdf\x61\x72\x37\x05\xe0\x98\x51\xf1\xba\x1a\xb7\xf0\xa3\xdf\x68\x53\x30\x9c\xea\x81\x1c\xc4\xcd\xfb\xad\x98\xb5\x8e\x86\x6a\x54\x7c\xb5\xb8\x4c\xbb\x90\xc7\x20\x3a\x11\x90\x20\x1d\xf0\xd1\xe8\xe1\x1c\xf7\x43\x24\xb7\xb4\x4f\xc2\x00\x12\xdf\x5b\x14\x88\xb5\xe6\xe1\x78\x9b\x11\x61\x48\xc3\xa4\xcb\x96\x3e\x66\x85\x85\xe5\xda\xe8\x6d\x32\x34\x8d\x30\x56\x75\x0b\x66\x80\xa5\x6e\xfd\x14\xac\x8c\xdb\xbe\x1b\x38\x95\x9f\x7a\x07\xbf\x04\x1a\x11\x11\x51\xe8\xfc\xac\xb0\x29\x37\xea\x2e\x45\xe3\xb0\x9f\x57\x1f\x36\xd9\xfc\x43\xf3\xcd\xe8\xdf\x0f\x7a\x24\x04\x49\x6d\xe1\xf9\x6e\xb1\x7e\x38\xdc\x3d\x2c\xbc\x87\x21\x88\xb6\x11\xc9\xa1\x7d\xc5\xbf\x42\x2a\x35\xdc\x49\x45\x2c\x29\xd6\x74\x2e\xb5\xee\x32\x8f\xee\x50\x12\xda\x22\xec\x57\xb5\x2c\xb3\xe2\xd1\x52\x54\x38\xf1\x62\x4b\xb6\x34\x4f\xde\x45\x05\x4d\x52\x47\xe3\x22\xb4\x2a\xf3\xb2\xfa\xa3\x01\xe1\x43\x28\x41\x13\xe5\x69\xe3\x2c\x01\xd0\x30\xc3\x20\xa8\x32\xb8\xc7\x9d\x5c\x89\x71\x71\x99\xd1\x6a\x1d\xbc\x28\xf7\x33\xc6\x25\x16\xc2\xbc\x50\xcc\xcb\x0c\x07\xcc\x67\x35\x58\xc1\x38\x60\x6c\x7c\x12\x3f\x47\xd0\x05\xc1\x13\x86\x8c\x9c\xcb\x3e\x60\xdb\xbd\x9f\x64\x99\x4f\x66\x24\x57\x31\xfa\x24\xad\xb3\x7a\xca\x34\x36\xe4\xb8\x43\x69\xc0\xc5\x90\x51\xc4\x5a\x55\xdb\xe4\xda\xf3\x27\x51\x91\x46\x24\x76\xc0\x4e\xab\x7c\xf6\xa9\xc5\x11\x69\xa4\xb4\xe8\xed\xf5\xa6\x4f\x51\x88\x54\x5a\x84\x4e\xe3\x6d\xb8\x2b\x1b\xfb\xe3\x22\xb0\x75\xc0\x33\x54\xa7\xac\x69\x86\x0a\x4b\xe3\xa7\x12\x09\xc5\x60\xca\xda\xe8\x7e\x91\x09\x6a\xb0\xad\xe3\x2c\xde\xef\x60\x54\x9c\x13\x22\xb5\x9d\xe7\xc8\xc2\x32\x12\xd8\xa3\x42\xc6\x80\x7e\xfb\x97\x2a\xbb\x9a\x3c\x93\xa7\x93\x49\x94\x0e\x79\x56\x76\x2f\x62\x5f\xee\x5e\x8a\x7b\x54\xe3\x9e\xdf\x4a\x85\x62\x4e\xae\xab\x6c\x44\x03\x87\x0a\x81\x33\x97\x2b\xe6\x15\x2a\x14\x0f\xb0\x30\x68\x79\x20\x71\xeb\xa9\xa7\x8e\x86\xd0\xc4\x02\x6d\xa5\x2b\x61\x8d\x2d\xa4\xd0\x31\xc7\xcf\x55\xc0\x1b\x56\xa9\x0f\xe7\x6b\xe9\x69\x2a\x34\x48\xa4\x1c\xda\x9d\x44\x35\x14\x06\xc7\x23\x7c\x88\xaf\x19\xa7\x99\x84\x36\x9c\x78\xc5\xc0\x81\xe4\xe5\xd5\x6a\xee\x9c\x29\xa1\x8d\xad\x36\xd5\x2f\x6a\x72\xab\x90\x46\xb1\x05\x22\x7e\xc5\x6c\x19\x36\x09\xfc\xd6\x1d\x24\xf8\x51\xdc\xc6\xb3\xfa\xeb\x72\xdd\xcd\x33\xf2\x89\x05\x28\x23\xac\x83\x55\xbc\xee\xcb\xe5\x51\x54\xa7\xd9\x7a\xb0\x00\xb0\xda\xe7\x9d\x86\x3f\xd2\x6e\x75\xd3\x01\x4c\x9a\xc8\x01\x2f\x7a\xbb\x18\xd6\xe6\x26\xd3\x56\xa5\xac\x07\x28\x0b\x43\x52\xef\x1e\x63\xdc\xb6\xae\x37\xe7\xfe\x4d\x1a\x66\xb9\x69\x31\x73\xf9\x28\xaa\x57\x6f\xc4\x64\x10\x24\xd8\x5e\xf2\xef\x0b\x54\xef\x83\x15\x37\xfa\x46\x32\x10\x16\x82\xfe\x58\x9e\x86\xc5\x09\x19\x06\x06\xd1\x76\x6d\x98\x51\x3c\x96\xd7\x54\x12\x6e\x1c\x81\x18\x33\x5f\x28\xe6\x65\xe9\xa4\xfa\xc5\x26\x89\xa1\xd2\x0c\x88\x91\x27\x17\x27\x06\xe8\x40\x59\x6b\xa7\xc4\x14\xa0\x26\xe3\x48\x2b\x39\x14\xd4\x9b\xa0\x4a\xe6\x3e\x92\x8c\x89\x46\xab\xe3\xf2\xa5\xbb\xa3\x20\x5d\xc1\x9d\xff\x8f\x1f\x44\x6d\x25\xd8\xd8\x9f\xfe\x36\x3e\x03\x8d\xb1\x65\xf8\x05\xf5\xa0\x7e\x0e\x03\x76\x19\x0b\x8d\x99\x98\xdf\x2f\x5a\x14\x59\x3e\x9c\xd8\x32\x89\x2c\xea\x48\x68\xfd\x08\x37\xef\xdb\x65\x77\x80\x32\x2d\xba\xde\x9c\xc7\xf7\xfb\x36\x96\xc8\x8a\x97\xaf\x45\xd6\xa5\x20\x65\x02\x91\x4f\xd0\xe3\xce\xe0\x8a\xfb\xfe\x30\x8d\x12\x4c\xf3\xa3\x5f\x92\x81\x6d\xf2\x1c\x27\x50\x25\x8d\xa4\xee\xd2\x50\xad\x1f\x3b\x82\x7a\xc9\x36\xb2\x6e\x0f\x6f\xef\xbe\x8e\xda\x40\x25\xe5\x09\x26\xe7\x1c\xe8\xf9\xa3\x0e\x62\xc9\x22\x5b\x55\x71\xec\xbf\x36\x11\xde\x57\x17\xc7\xdf\x81\x09\x23\x3d\xe7\xce\x21\xef\xc5\xaa\xa8\x64\x2e\xe1\xee\xfd\xa7\xef\x22\xeb\x1e\x81\xc7\x56\x2a\x4f\xd4\x35\x54\x8d\x17\x91\x98\xcc\x0b\xe1\xd0\xa0\xd8\x75\x96\xbd\xb4\x77\x8d\x1f\xe9\x0b\x14\x81\x3f\x91\x60\x01\xc6\xee\xcb\xb2\xa8\x2f\x79\x23\x5c\xbc\x57\x8e\x3f\xb5\x90\x81\xdf\x94\x9d\x4b\x65\x63\x46\x24\x9b\xf4\x63\xb4\x41\x23\x72\xb3\xde\x2f\x37\xeb\xa7\x2f\x0b\xdf\x24\x26\x65\x64\xa5\xae\x0f\xde\x94\x4d\x63\xb7\x8f\x01\x12\x52\x72\x82\x80\x3e\xd9\xce\x05\x14\xab\xed\xde\x81\x0a\x34\x1d\xd2\x12\x60\x1f\xe2\xa2\x70\xdc\xbb\xc3\x0f\xa7\x14\x47\x94\x85\xf7\x7f\x76\x59\xd3\x06\xb6\x1f\x7c\x3e\x4d\x0d\xb6\x48\xdc\x42\xeb\xcd\x56\xf6\x53\xfb\x3c\xde\x7d\xd9\x3c\xb7\xbb\x87\x4f\xa5\x4b\xcd\xb8\x71\x1e\xb3\xb3\xd0\x93\x6c\xbf\x84\x28\x46\x8f\x13\x95\xa1\xbe\x16\x4d\xd6\x7d\x61\x10\x3c\xf2\x75\x00\xfb\x42\x3f\x6b\xe2\x54\x41\xc4\x50\x37\x64\x59\xbd\x9f\x9b\xb2\x80\xb7\x7a\x5d\xe8\xb2\x80\x3a\x13\xf3\x96\x47\x05\x90\x40\xd0\xd1\xdd\xa0\xd7\xf0\x98\x79\x21\xde\xef\x22\x6b\xee\xca\x6a\x8b\xc7\xfc\x5b\x55\x61\x0c\x58\xa7\xd3\x55\x79\x1e\xba\x5e\x2a\x22\x49\x32\xec\x1f\x14\x27\x47\xaa\x39\x97\x17\x51\x91\x10\x01\x78\x8e\x23\xa1\x5e\x8f\xb8\x2f\x0f\x00\x84\xf6\xdc\x93\x9e\x64\x15\x09\xf0\x5c\xa6\xf7\x2f\xe8\xb7\x5f\x61\xb6\x7e\xad\xe5\x44\x45\x9a\x46\x41\xc7\xbb\xff\xdb\xd5\x41\xcc\xed\xb8\x66\xf9\xe1\x64\x51\x24\x24\xb8\xec\x50\x07\xff\xb0\xbf\xdf\xae\x76\xf7\x9b\x87\xdb\xfe\xb0\xb1\x62\x66\xa7\x0c\xab\x7e\x37\x59\x31\x50\x71\xf8\xd7\x75\x12\x43\x11\x46\x5d\xb5\xa7\xb1\x45\x36\xef\x72\xa0\x9b\xda\x97\x48\x55\x1c\x25\x21\xeb\xf2\x88\x03\xf9\xe8\x79\x46\x54\xaa\x12\x15\xe3\x63\xf8\x44\xce\x22\xf7\x53\x4b\x25\x4a\x1b\x3e\x48\x06\x35\x22\x9f\xbc\x03\x1a\x72\xdb\xaf\x2c\x4e\x3d\x6d\xc6\x7c\x71\x4d\x51\x62\xb1\xc9\xc7\xb2\x28\x2f\x55\x97\x83\xe9\x77\x60\xc5\xc2\xd4\x03\x74\x7d\xd9\xe1\x33\xae\x45\xaa\x18\xb5\xa9\x94\x43\x25\x8c\xc9\xe1\xb6\x53\x33\xa6\x8a\xe9\x10\x49\x7e\xb6\xe5\xdf\x60\xab\xee\xb3\x2e\xba\x1f\x6d\xa4\x63\x12\xc1\x42\x0f\xdc\x02\xe8\x11\xe9\x91\x1b\xc7\x23\xed\x52\x8c\x5d\x72\xf6\x79\x4e\x41\x7d\x16\xf6\xe2\xcf\x91\x8a\xd0\x73\x8f\xd5\x35\x34\xab\xd3\x29\x6b\xa6\x89\x02\x95\x86\x01\xe2\xc7\x74\x79\x91\xf9\xc7\x50\x8c\x4f\x0b\x32\x2a\x4d\x43\xd2\xb1\x16\x4e\x2f\x20\x15\xd6\x3a\x91\x41\xc4\x5b\xa6\x87\xec\x15\x06\xde\x89\x4a\x35\xc5\x4e\x29\x87\x27\xff\x06\x95\xce\x46\xed\xe8\x4a\x44\x16\xb1\x87\xe6\x27\x7b\x29\x44\x3e\xce\x28\x28\x21\x43\x14\x8f\xca\xea\xdd\xb9\x2c\xea\x12\xb1\x17\x56\xb1\xec\xa3\xcd\x4f\x29\x1a\x50\xe7\x8a\x59\x85\x85\xcf\x1d\x79\xa5\x03\xd7\xf8\x3e\x28\xc9\x5a\xb9\xa4\xae\x2a\xa6\x20\x0c\x24\xd2\xb2\x5f\x64\x9e\xa9\xdf\xe1\xfd\x1b\x54\x99\x79\xff\x87\x33\x03\x91\x3a\xea\x10\x07\xce\x38\x4f\xc8\x7d\xa9\x82\x44\xe1\xc4\x3d\x65\xc5\x77\xc8\xf6\xa5\x87\x97\xfb\x6b\x9b\x20\xc1\xf4\x1b\x14\x7a\xad\xca\x9d\x70\x32\x38\x3e\xc8\xd7\x41\x40\x84\x35\x8b\x2a\x3b\x67\x7d\xfa\x43\x87\x01\xf5\x2d\x1e\x56\x2d\xd3\x62\x50\x87\x36\x55\x87\xa1\xc2\x70\x76\x39\x0b\xb1\xd7\x61\x64\x84\xee\x8c\xe8\x2b\xac\x0b\xa7\xdf\x33\xfe\x4e\x3a\xa4\x4a\x11\x4f\x3e\xd2\x9f\x5c\x09\xd4\x68\xb6\x26\xe0\xd9\x27\x42\x3f\x58\x47\x3a\x4a\x49\x64\x09\x5b\x4c\x55\x0e\xc3\x41\x1d\x69\x11\x46\xbd\x20\xc3\x07\x0c\x5d\x93\x02\xc3\x47\xe6\xf9\xbf\xff\x67\xf6\xea\x84\x47\x01\xf1\xb0\xd7\xf1\x27\xd2\x24\x0d\x48\xe2\x5d\xbe\x01\xae\x67\x36\x15\xa2\xe3\xc8\x92\x27\xce\x11\xa1\x74\x93\x43\xc7\xa9\x44\x5e\xc7\x81\x7d\x9c\x03\xf0\xe8\x24\xb5\xa2\x42\xab\x90\xfb\xd7\x91\x28\x8e\xe6\xa9\x28\x35\x1c\x72\x30\xcd\x01\x59\x07\xa6\x3f\x04\x89\x10\xd1\xf2\x0c\xc5\x7f\xca\x02\x76\xc7\xf2\x6c\xef\xd8\xdf\x28\x6b\x3d\x23\xa7\xdb\xb9\xda\xdf\x1f\xb6\x9b\xdf\xfd\x25\x98\x31\xe8\x82\xb6\x67\x8f\xe2\xc9\x99\xb9\x8a\xbd\x78\x07\xf4\x4b\x76\xfc\x3a\xb9\x0e\x6c\xc2\xc3\x57\xb6\xb7\x6d\xac\x5b\xdf\x65\x3f\x6d\xcd\xec\xf0\x39\xc2\x4b\x0b\xa5\x6c\x69\xc9\x34\x50\x21\x7b\x94\x5d\xf6\x38\xf7\xd1\xd1\xda\x7a\x89\xfc\xa2\x3c\x65\x85\xe8\x4b\x5d\x5a\x86\x21\x22\x74\xdb\xf7\xb3\xfa\x99\xd5\x4d\xfd\xc1\x97\x92\x91\xc0\x6e\xe2\x36\x04\x81\x26\x6b\x0d\xf2\xe2\xcf\xc9\xc3\xb6\x9e\x9b\x8b\x09\x6e\x2a\x80\x36\xce\xf6\x4d\xa1\x71\xf0\x2f\xfb\x8f\x1b\xaa\x89\x35\x67\x0d\x54\x78\x47\x63\xe6\x56\xaa\x21\x11\x16\x06\x65\x29\xed\xca\xea\x15\xec\x0e\xf0\x81\x8c\xe8\xf8\x46\x80\x1a\xac\x0f\x60\xd2\x5a\x1d\x41\x0f\x5b\xf9\x34\xf0\x18\x93\xd5\x1d\x29\xda\x00\xd2\xa3\x0d\x37\x40\xc7\x6a\xc7\xd7\xbd\x16\x10\x12\x8d\x51\x66\xdd\xae\xf4\xbb\xb2\xfa\x9e\x35\xc7\x87\x52\xbd\x7e\x16\xdc\xf7\xdb\x1b\x84\x71\x8c\x9a\x5a\x77\x97\xe6\x52\x41\xdd\xd3\xc3\x51\x08\x93\x14\x75\x3f\x2c\x7a\x42\x3f\xad\x1f\xef\x16\xf3\xd6\x1b\x42\x6a\xb3\x33\x27\x2d\x87\x4e\x11\x84\x42\x60\x00\x20\xea\x3a\x7b\x29\x96\x50\x35\x99\xc9\xd4\x10\x82\xf1\x49\xb9\xd0\x9f\x43\x81\x1c\x58\xb3\xac\x78\xf9\x22\xb2\xe9\xde\x06\x51\x20\x2d\x4b\x38\x6e\x06\x48\xd0\xd2\x45\x77\x10\x05\x80\x7b\x3d\x52\xe1\x3c\x5d\x4e\xb6\xc7\xae\x3b\x4a\x22\xac\x86\x2f\x6e\xbf\xad\x77\xab\xed\xee\xb0\xfb\xfa\xfc\xfc\xf0\x67\x77\x98\x5a\x3c\xed\x39\xea\x59\x16\xdd\x21\x12\x24\xe8\xc4\x67\xf5\x2a\xcf\x5e\xb2\x2b\x16\x12\x20\xb1\x76\xb1\x98\x0d\xb1\x5b\x3b\x58\x4c\x35\x2b\x28\x10\x15\xf9\x0a\x50\xfe\x90\xc9\x1d\x34\xd1\xf4\x4a\x4a\x52\xeb\x97\x59\xf9\xaf\xeb\xa4\x38\x10\x48\x6c\xf3\xf9\xb0\x53\x64\x4e\x86\x9f\x42\x1c\x2a\xe9\xfb\xaa\xfd\x8e\xd4\xfe\x51\x3b\x74\x75\xd7\xa2\xc4\xfd\x31\xc3\x15\xef\xf9\x07\x77\xe7\xac\xdd\x52\xce\x97\x49\x99\x1e\x12\x25\x31\x9f\x5c\x37\xe5\x79\x1e\x38\x06\x34\xb4\x58\x08\x4c\x90\x95\xff\x0b\xaa\x69\x5d\xe1\xa1\xc5\x9d\xf5\x25\x81\x26\x80\xad\xc3\xa8\xfb\x31\x91\x4a\x98\x5c\x41\x71\x84\x93\x39\x59\x95\x7a\xfa\xf4\x2c\x0c\x30\x9d\xb7\x5b\x2e\xb6\x8b\x9b\xd1\x7c\x65\x51\x64\xe5\x96\x6d\xf9\xe9\x7d\xd4\x1b\x3c\xb3\xde\xaf\x3c\xec\x0f\x8e\xce\x3f\x12\x8b\x24\x16\x70\x7c\x7c\xeb\x97\xee\xa7\x5d\xf2\xdd\xa4\x61\x20\x02\x9b\x01\x50\x9f\x29\xfe\x51\xe0\x31\x4d\x22\xaf\x0e\x35\xda\x09\xfd\x00\x11\x6b\x3f\x1d\xbe\x38\x30\x67\x77\x4c\x69\xa4\xb7\x10\x1d\x60\xed\x8a\xc7\xd6\x07\xdd\x90\x72\x45\xc2\xbe\xb9\xba\x35\x25\x1f\xd8\xc8\x4f\x60\x01\x90\xa6\x02\x31\x13\xf9\xcf\x63\x6b\x8d\x62\x7f\x27\xa9\x24\x84\x0e\x0a\xcc\xcd\xa5\x42\xb2\x8e\x19\xb4\x13\xc8\x98\x12\xd3\xe1\xa1\xb6\x65\x39\xe6\xc0\xf5\xa3\x92\x40\x76\x7c\x9f\x0f\x20\x34\x54\xb2\x14\x95\xdd\x92\x69\xfc\xaf\xd1\x3f\xfe\x37\x22\x44\x4e\x9d\xe7\x5c\x28\xb8\xb9\x7c\xa8\x02\x3e\xbf\x1d\x80\xa2\x16\x5e\x89\x82\x93\x05\xa0\xca\xf8\xc6\x74\x66\x61\x64\xf8\x94\xb2\x3a\x55\x95\x2d\xbc\x1e\x30\x8d\x01\xfa\x30\xc3\xd7\xdd\x0e\xb6\xf9\x20\xc4\x30\x1d\x30\xed\xf1\x51\x04\x71\x9d\x2e\x01\xa5\x3b\x12\x2a\xcb\x14\xf4\x03\x66\x31\x00\x00\xca\x12\xdc\x38\xe1\x39\xa8\xee\x2e\x79\x8e\xc2\x73\xa3\x71\x26\x10\x96\x2f\xc2\xf3\x5f\x5b\xdd\x2e\xf7\x29\x4d\x08\x16\x74\xf9\x82\xd2\x23\x59\xbb\x9b\xae\x74\xd6\x1c\x98\x1f\x10\x69\x9e\xa4\xbd\xe4\xc7\x56\x34\x13\xa1\x11\x6a\x08\x95\xd8\xcc\x7e\x93\x55\x3d\x52\x6e\x5a\x7f\x1b\x99\x59\x43\xb8\x6d\xde\xb7\xe8\xeb\xd9\x62\x88\x1f\x29\xac\xe4\x15\xa6\x7e\x9f\xab\xf6\x43\xf7\xdb\x89\x89\x21\xc4\x8f\xf8\xb8\xf8\xe3\xf0\x65\xbb\x78\xda\xaf\x56\x8e\x57\xd7\x32\xdf\x78\xd5\x5d\x6a\x92\x90\x1a\x18\xb0\x65\xa2\x3a\xdc\xa3\x98\x27\xf0\xa6\x26\x31\x04\xdf\xee\x43\xf9\x12\x1e\x4c\xa1\xa6\x64\x80\x9f\xd7\x9c\x7c\xf9\x73\x7c\x4e\xa6\x19\xee\x2d\x9d\x22\x67\x3e\x26\x7c\x33\x4c\xa7\x98\x3e\x15\x4a\x5d\x4e\x88\x3f\xd0\xf7\xe5\xa5\x7f\x5a\x4e\xc0\xeb\xfb\x6e\xad\x8c\xd4\xf8\x53\xf3\x58\x13\x97\x2e\x7c\x16\xd5\xb5\xac\xae\x1f\x26\x25\xe6\x94\x6e\x6d\x26\xfb\xff\x05\x1d\x88\xe1\xc0\x51\xfe\xe8\xf1\xe1\xdf\xdd\x1b\x4e\x23\x8e\x0d\x22\xd6\x21\x47\x94\xfa\xf6\x92\xc3\x97\xaa\xbc\x5c\x49\x1e\xfe\xc3\xe9\x53\x66\x71\xa3\x88\xf1\xde\x1d\x2f\xc6\x5c\xc3\x44\x8c\xb7\x4e\x35\x34\x9b\xb3\x53\x20\xfe\x22\xea\x6b\xb9\x2b\x6a\x52\x95\xa6\x0e\xbf\xe3\x54\x3b\x67\xd7\x94\x11\x91\x95\x99\x6c\x5c\xb3\xa1\x2b\x66\x8f\x4f\x26\xa8\x05\x20\x5d\x8a\x1f\x36\x88\x9d\xdd\x52\x8c\x24\x1c\x4d\xf0\xb7\xc5\xc3\xd7\xd5\xcd\x62\xe9\x43\x03\x23\x55\x88\x08\x45\x10\xd5\x80\x5f\xca\xa8\x40\xa3\xe9\xb7\xc1\xae\x85\x19\x21\xbd\x51\xf7\xf9\x15\x4d\x89\xc7\xd0\x2d\x8f\xa2\x7a\x99\x6c\xa7\x46\x99\x08\x79\xf6\x7a\xf6\x5f\xcc\xd3\x7e\xdc\xa0\x69\x34\x51\xda\x61\xae\x3b\xe2\x7d\x7f\x28\x49\x12\x9b\x57\x76\xcc\x17\x1f\x2d\x01\x3f\x5e\x24\x81\xec\x1b\x3d\x9c\x78\xe9\xc4\x93\xe8\x2e\x0c\x21\xc5\x37\x0d\xa7\xac\x41\xb5\xaf\x0f\x5c\x08\x03\x51\x82\x19\xb2\xb5\x2a\x57\x85\x1e\xf4\x87\x1a\xe0\x11\x4e\x92\x2f\xd5\xe5\xdc\xc0\xc0\x5d\x36\x86\x47\x58\xcd\xff\x02\xcd\xf2\x98\x9d\x9f\x2e\xa7\xd9\x36\x39\x63\x40\xa2\x6d\xf1\x89\xe1\x5c\x43\x35\x51\x96\xf1\x37\xc2\x82\x90\x30\xc4\x02\x00\xae\x59\x07\xec\xef\x93\x31\x2c\x08\xa9\x0a\x63\xaf\xdf\x69\xd3\xc0\xfb\x12\xcd\xd5\xe4\x4c\x51\x1c\x52\xa7\x04\x73\x5b\xaa\xa6\xac\x06\xe4\x25\x1f\xea\xd3\xf2\x5f\xf8\xbf\xe3\x22\x28\x0b\xa2\x44\x23\x24\xd8\x7b\x35\x8b\xfc\x2a\x59\xe6\x3e\x08\x0b\x48\x4a\x31\xe6\x5b\x8a\xfa\x38\x70\xc4\x58\x40\x54\x8c\x80\xa4\xd5\x7e\x69\x77\xfa\xd9\x0f\xc5\x82\x98\x58\xfc\x68\x56\x23\xf6\x75\x74\x8e\x98\x28\x01\x03\xe7\x7b\x63\x0c\xca\x52\x76\x00\x97\x8f\xac\xcf\x0c\xf5\x39\x0b\x68\x28\x92\xc4\x15\xbf\xd1\xcc\x8c\x60\x2b\x2c\xa0\x69\x12\x77\x1f\x02\xb3\x7c\xfb\x72\x4a\x51\xf5\xb1\xf9\xe6\x96\x2b\x65\xb8\xb2\xda\x53\xa6\x58\x38\xea\xfa\x97\xfc\x8e\xbe\x44\x64\x88\x37\xe1\x2c\x60\x84\x48\x97\xfe\xbe\xc9\x9a\xb7\xb2\xd2\x75\x27\x3c\x3b\x67\x73\x58\xc0\xe2\x18\x3f\x92\xd7\x67\x2d\x25\xdc\x55\x19\x14\x1f\xd6\xcf\xa7\x30\x13\x7f\x1e\x69\x31\x48\x37\xe0\x68\xea\x87\xc1\x29\x0b\x78\x60\x70\xd2\x75\x14\x72\xf5\x0e\x9a\x55\x81\xf8\xb5\x2d\x58\xfe\xd1\xfa\xa9\x6c\x06\x0c\x7c\x2c\xe0\xb1\x55\xc1\x39\x96\x97\x1a\x46\xe5\x6b\x16\xf0\x84\x7a\x1d\xf8\xc7\xf7\x2f\x50\xf8\x76\xa0\xf6\x88\x55\xdb\x92\xc5\xb2\x8d\x10\xba\x3f\x2b\xcb\x70\x2f\x41\x95\x27\xf8\xbd\x4b\x4f\xb1\x80\x9b\x14\x91\x28\x5b\x9f\xb9\xfb\x2c\xb1\xca\x82\xd6\xfd\x64\x1e\x00\xf4\x41\x48\xd0\x93\xde\x7c\x1c\x32\x44\x13\x9e\x70\x77\x7a\x11\x02\x75\x94\x09\x3e\x96\x9c\xe9\xb5\xed\x6f\x47\x42\x1c\xf7\x10\x8a\x7c\xf5\xfc\xc7\xf8\xcd\xab\x20\xd0\x81\xef\x8e\x72\x84\xf1\xe3\x09\xad\xc2\x24\x08\xd0\xd4\x66\xc5\xb2\xeb\x55\x60\x81\x22\x21\xc2\x4e\x5b\x6f\x65\x28\x40\xdf\x1e\x11\x2a\xf2\x61\xb4\x4d\x08\xa1\x5c\x7c\x56\x74\xdf\x47\x71\xee\x31\xab\x83\x04\xc4\xaf\xcd\x25\x25\x28\x92\x71\x3e\xed\xbf\x8d\xd6\xb1\x0e\x63\x74\xd3\x5f\xe1\x7d\x3a\x8d\xb5\xa0\x86\x0f\x60\xb9\xcf\x3e\x51\x3a\x1e\x06\x11\x60\xb5\xf2\x56\x34\x97\x13\xce\x9a\xac\x1e\x5d\x02\x68\xec\x15\x82\x47\xd2\xee\x08\xf8\x99\x7a\xf8\x83\xaf\x06\xa0\xb1\x46\x57\x37\xd5\xb2\x2c\x94\x98\x27\x5e\xfd\xc7\x24\x07\x0b\x4c\x2c\x75\xdc\xa3\x6e\x6e\xb3\x1f\x43\x86\x45\x16\x18\xce\xd0\xfa\x1c\x82\x9f\xff\xc9\x64\xd6\x8c\xee\xde\x40\x80\xd9\x97\x7d\x59\x36\xd5\xa4\xf9\x80\x85\x01\x70\x34\x91\x6e\xa9\x6f\x85\x94\xd9\xaf\x8b\xbb\x0d\x3f\x21\x77\x67\x8c\x20\xc0\x8c\xc8\xa4\x51\xe6\xd1\xef\x85\x2c\x24\x01\x70\xd5\xf1\xcc\x6c\xde\x26\xf0\x04\x16\x92\x88\x92\x91\xa8\xc0\xe8\x71\x43\x42\x63\x44\x1a\xb9\x4e\xa2\xaa\x81\xca\x37\xdb\xcc\xda\xb3\x90\x80\xcd\xa0\x64\xb5\x53\x91\x9c\xf5\x8f\x58\x18\x87\x34\x75\xcb\xc2\xb9\xc1\xf6\xc2\x6d\x08\x53\x9d\x06\x5c\x37\xed\x50\x86\xce\xb8\xb7\x90\x36\xab\xb2\xcc\x9a\xf7\x61\x98\xc6\xc2\x58\x19\x0c\xd3\xbe\x40\xf3\x70\x51\xaf\xef\x5f\xc4\x49\xe6\x6d\xb4\x30\x5a\xb0\x61\x12\xd9\xba\x59\x56\x2f\x45\xaf\xf9\xc5\x42\x2a\x68\xea\x2b\x60\xdf\xd6\xcf\x93\xe7\xe2\x31\x1f\x24\x1f\xaf\x52\x24\x33\x53\x29\x4c\x63\x89\xe0\x14\x27\x5d\x86\xf2\x6b\xfe\x62\x29\x8f\x90\x50\x6f\xb5\xd8\x62\x2b\xfa\xd3\x7e\xbb\xbe\xf9\xba\x5f\x6f\x9e\x26\xbc\x42\x2c\x94\x42\xa0\x8a\xd4\x0e\xce\xe7\x7f\x6c\x29\x61\xa1\xd4\x56\x85\x1b\xb7\xa0\x97\x6b\x81\x8a\x76\x84\xc2\x4f\xfe\x5c\x65\x27\x90\xa2\x78\x1d\x95\xe8\xc6\x8f\xad\x98\xc6\x74\x57\xbb\x6f\x04\x91\xbf\x25\x4d\x48\xe8\xa8\xa9\x5f\x11\x3d\x5c\x94\x65\xf1\x2d\xab\x27\x9e\x37\x0b\x35\xb5\xde\x43\x4f\x6c\x3f\x01\x50\xb1\x50\x0b\x85\xbd\xbf\x4b\x0f\xba\xde\xfd\x55\x5d\x9d\x06\x6c\x57\xcf\x29\x2b\x9a\x67\x24\x7d\xfc\x3f\x45\xfb\x2c\x84\x38\xc6\xbe\x9c\xac\xf6\xd8\x0f\xff\x28\xa0\x2c\xab\x6e\xfb\xd5\x91\xb7\x79\xd4\x34\x3a\x79\x1b\x46\x04\xd6\x1b\x2d\x3a\x36\xc1\xd1\x14\x8c\x02\x65\x73\x63\x35\x14\xfa\x59\xbc\xf7\x1c\x80\x2c\x0a\x41\x5a\xb1\x6b\x3b\x1b\xda\x4d\xf8\xf2\x72\x3c\x5f\xba\x01\x51\x60\x34\xf3\xc0\x3a\x9c\x2c\x6e\xe2\x5c\x23\xe5\xc7\x4f\x17\x45\xa1\x36\x76\xcd\x39\x21\xa9\xc5\xf8\x1d\x47\x24\x8a\xb1\xc6\xa5\x44\x7d\x74\xac\xa4\xfe\x48\x12\xf8\x9c\xee\x5d\x05\xb0\xfa\xd9\x40\x51\x4f\xb9\xb1\x58\x44\x54\xe4\x00\x87\x75\xb3\xaf\xb2\x6e\x1e\xfa\x56\x50\x16\x11\x10\xe8\xf9\x60\xc2\xc3\x26\xaa\x57\xfb\xfb\xa5\xa8\x34\xba\x60\x36\x89\x39\xdf\x9c\x34\xf8\xaf\x71\x9c\xc0\xa2\x98\xc4\x7c\xf0\xd2\x3e\x0c\x65\x58\x14\xa7\x51\x37\x45\x7e\x29\x7d\xd7\xbf\xbe\x84\x5a\x30\x81\x8b\x0d\x7b\x2a\x3e\x16\x25\x12\xb0\x17\x61\xb9\xbc\x3f\x6c\xbb\xce\x46\x16\x51\x2e\x65\xdf\xce\x36\x9b\x60\x65\x11\x8b\x52\xcc\xb9\x63\x8b\x62\xc7\x3c\xc8\x22\xc6\x6d\x79\x1c\x77\xef\xa1\x55\x88\x98\x52\x91\xbe\xd6\xc2\x98\x58\xda\xee\x99\x39\x15\xdc\xf9\x60\x5f\xca\x5c\x5b\xc5\x68\xec\xe8\x57\xd7\x7b\x6f\xc4\x9d\x14\xf0\x16\x44\xee\xdc\xe2\x7e\xeb\x8a\x84\x02\x9c\x43\xe7\xbe\xf3\x6b\x29\xce\xad\xd9\xef\x1e\x5a\x71\x8d\x30\x3c\xec\x20\xdf\x8b\x57\x04\x67\x3d\x95\x8d\xd3\x95\x1c\xd0\x88\xb3\x48\x41\x88\xa9\xce\xfb\x52\xe7\x37\xe5\xcf\xc9\x9b\xd1\x51\x8a\xb8\x99\xbf\x45\xfd\xb3\xfd\xff\x7f\x89\xbf\xfc\x0f\x21\xa0\xe8\x2e\x8d\xa5\xd5\xff\x04\x51\x75\x23\xa2\x00\x53\x39\xc2\xd2\xff\x83\xcd\x68\x79\x14\xc8\x64\x3f\x8a\x4c\x1c\x46\x6e\x7d\x23\x3b\xc2\x6d\x56\xcb\x4b\x55\x83\x5b\x9d\xdf\x8f\x50\x3c\x8b\x4b\x0d\x7a\x10\xcb\x45\x46\x69\xde\xef\x38\x43\xf1\xb3\x7e\x10\x09\x42\x8d\x35\xbe\xf5\xf7\xef\x2b\xd7\xd2\xc5\x48\x48\x6d\xf1\x52\x68\xfd\x4f\x9f\x8f\x10\xa6\x43\x4b\x29\x6d\xf9\x1d\xa7\x0e\x03\x89\xe3\x10\x05\xbd\x6d\x2b\x50\xde\x31\xa7\xfd\xaa\xf1\x9b\xdb\x95\x48\x1c\x73\x6d\x4b\x25\xb3\x2c\x77\x8c\xc4\x8c\xab\x21\x46\x62\xad\x07\x7d\x43\xa3\xef\x48\x12\x11\x2a\x35\x10\x4b\xb0\x8a\x83\xee\x20\x8b\x0d\xf1\xa2\x26\xc8\x85\x3f\x43\x71\xc4\x08\x4b\x6c\x57\xfd\x6e\x73\xb7\x3f\x2c\x17\xcf\x87\xd5\xd7\x6d\x77\x06\xc5\x99\x63\x5d\x5f\x34\x2e\xa5\x51\x0f\xb2\x14\x8c\xf0\x38\x42\xeb\x6d\xa3\xf2\xba\x97\x40\xf0\xc7\x99\xa6\x72\x18\xf6\x58\xcb\xd4\x1a\x88\xa7\xb2\x50\xb6\xbc\x99\x15\x2f\xf8\x3f\xba\x1f\xa5\x29\x06\x90\x3f\xca\x06\x6e\x26\x4f\xcc\x53\x8d\x10\x1f\xf4\xf1\xb3\xd6\x69\x99\x0f\x0b\x48\x2a\x0c\x2e\x96\x02\xda\x30\xd0\x47\x41\x24\x35\xc4\x0b\x5f\x7b\x56\xb7\x4b\x25\x86\x2c\x17\xdd\x40\x0b\x6b\x68\xef\x7c\xe3\xe1\xea\x8c\x88\x48\x84\x2e\x3a\x79\x2e\xcb\xbc\x7b\x50\x11\x27\x5e\x9d\xfb\xe9\x72\xb2\xf4\x2b\xf8\x36\x54\xa9\xaf\x5c\x20\x22\x12\xe7\x52\x88\x6b\x0c\xdf\x74\xf2\x5c\xe6\x88\x58\xff\x2f\xf9\x3c\x46\x04\x83\xa8\xc7\x32\x0d\x70\xa6\x8c\xc8\x84\x61\x22\x48\x43\xa7\xbd\xff\x5c\x95\xad\x83\x39\xf1\x13\x88\x0a\x20\xf1\x5d\x07\x8b\x3c\xbf\xab\xfe\x5e\x28\xe5\x4f\xa3\x74\xca\xc1\xa7\x89\x0f\x62\xd0\x30\xcc\x88\x36\x81\x65\xab\x2c\xab\x1a\x2c\x0b\xbc\x3f\x64\x08\x0f\x98\x53\x7b\x9b\x21\xbd\x60\xc4\x08\x8e\x10\x8c\x85\x33\x17\xd7\xcd\xfa\x2c\x0e\x03\x3b\x83\xb1\x1e\x76\x5b\x89\x97\xe9\xb7\x8c\xc3\x28\x88\x93\x1e\x81\x3d\xd0\x96\x19\x5c\x2b\x0e\x69\x84\x62\x1b\x6f\xa2\x5e\x79\x71\x19\x9b\x5f\xe8\x13\x0c\x71\x98\x26\xc4\xc1\xf2\x9e\x37\x9b\x87\x03\xe8\xac\x39\x84\x49\x7f\x98\xf9\x30\xec\xe6\xf2\xbe\xb5\x48\xbf\x01\x62\x85\xc5\x11\xb5\xb4\x4e\x4a\xe4\xf9\xcb\x6d\xaf\x13\xe6\x8f\xc7\xa1\xc1\x79\xf7\xb0\xd9\x3c\xae\x17\x61\xf7\x67\x10\x08\x24\xfe\x02\x8d\x95\xe7\x18\x76\x4a\xb8\x31\x09\x0b\x90\x94\xa0\x3a\x5d\xae\xf8\x83\xdd\x10\x1a\x28\xe4\x59\x76\x25\xfc\xec\x35\x7b\x16\x53\x00\xe2\x5c\x03\x47\xfb\x4b\x9d\x70\xdf\x15\xd8\x8c\xcb\x05\x61\x37\x28\xd1\xc2\x36\xb2\x96\x95\x78\x81\xd5\x4f\x94\xf9\xf2\xf7\xc7\x38\x09\xf4\xb0\xbd\xcf\x37\xd2\xdd\x65\xd8\xf5\xe2\xc2\xfc\xf1\x75\x99\x20\xd6\xa0\x2b\x55\x5d\x44\xee\x1a\x1e\xea\xee\x9c\x26\xc0\xd4\x72\xeb\x59\x6d\x2e\xcd\x9d\xc8\x73\x29\xd4\xeb\xb0\x65\x9d\xc5\x5c\x04\x8a\x0e\x35\xd0\x2c\xe7\x32\xae\xfe\xde\x17\x8b\xb9\x08\x51\xe5\xe8\x5c\xbe\x0d\xb0\x09\x2c\x4e\xe3\x08\x95\x80\xbf\x6d\x50\x79\xfc\x79\xbb\x7a\x5e\x6c\x57\xd8\xdf\xb7\x7b\x5e\x3c\x75\xc3\xc0\x42\x3e\x30\xef\xf5\x90\x29\x28\x6a\x78\xba\xdb\x8f\x3d\xb9\x58\x84\x09\x02\xbb\x1d\x53\xf3\x5a\x83\x98\x6c\x99\xb1\xa0\x11\x6e\xc1\xaa\xcc\x0a\x9b\x9c\x7d\x7c\xed\x6e\x46\x08\x81\xc6\xd1\x27\x15\xf7\xe5\xa2\x28\x9b\xa3\x65\x81\xff\x1c\xe8\xd0\xdd\x83\x24\x12\xf1\xd5\xa5\x03\x35\x2f\x2a\x6b\x23\x67\x9d\xee\x58\x45\x81\xf0\xea\x07\xc1\x01\x5b\x31\xd6\x45\x03\xd5\x0f\xd1\xcd\x3c\x95\x80\x30\xbe\x6a\x86\x60\xeb\x8a\x4c\x1e\x4a\xf1\x04\x7b\x1a\x4e\x3a\xfb\xd1\x51\xf6\x5c\x06\x7d\xa5\x2c\x56\x2a\x34\x0e\xa6\x64\x4b\x23\xf7\xa2\x3e\xc2\x94\xa5\x80\xc5\x3a\xa6\x58\x87\x39\xd8\xa0\x1a\x2b\x0f\x8e\xc7\xa3\x9e\x71\x14\x62\x88\x01\xa1\xb4\xd0\x3a\xd7\xda\x76\x29\xdc\x4e\x7b\x4a\x59\x0c\x82\x28\xe9\x39\x2b\x3a\x6e\x5c\x7b\x75\x6b\x28\xfe\x3b\xfa\x9f\xae\xfd\x7b\xf4\x9f\xfe\x0c\x52\x12\xe8\xfa\xd5\x7e\xcf\x4e\x13\xbd\x68\x3f\x4c\x07\xd8\x91\x70\xca\x8a\x7f\x5f\xca\xea\x82\xf4\x19\x9d\x90\x02\x8b\xc1\x50\x74\x00\x5c\x46\x2b\xfb\x1b\xd5\xe5\xe6\x03\xc4\xd8\x44\x56\xd2\xda\xbb\x00\xc3\x04\x62\x12\x52\x46\x8d\x43\xc0\x17\x8d\xab\xdd\x8d\x6e\x26\x09\x85\xc6\x60\xf4\x90\x15\x35\x54\xed\x3e\x2f\xd4\xeb\x43\x39\xdf\x96\x19\x8e\xa8\xce\xbb\xac\x77\xff\xae\x93\x28\xd6\xd4\x05\xf1\xbe\xcf\xfa\x58\x41\x7d\x2c\x27\xf8\x2e\x96\x90\xc8\x32\x7b\x63\xa8\x36\xc2\x0c\xb2\x84\x24\x22\x8e\x3a\xde\xc5\xd6\xbd\xfc\x4c\x39\x96\x25\x44\x10\xe5\x6a\x51\x8f\xe2\x7f\xcb\x6a\xf5\x03\x8a\x4f\xa4\x7f\x58\x42\x8c\xc2\xb2\xaa\xbf\xb0\x2d\x8a\xbb\x83\x71\x08\xc8\xf4\xb7\xc8\xcd\xa0\x5d\x85\x25\x31\x4d\x91\x7a\x61\xd5\x1c\x6f\x1a\x65\xcd\x70\x77\xcc\x18\xaf\x7c\xae\xaa\xb2\x68\xa6\x4d\x30\x2c\x49\x02\x81\x20\xbc\x1f\xe5\x4f\xff\xa3\x24\xe4\x48\x4d\x86\x7d\xf6\x8b\x3c\x77\xfb\xc5\xe0\x30\xd6\x47\xda\x90\x6a\x51\x38\xee\x16\xcb\x43\x73\x93\x35\x7d\x13\xf9\xe4\x65\x24\xdc\x76\x44\x2d\xfe\xce\xc5\x50\xf3\x9f\x25\x34\xd4\xb6\x71\xc4\x6f\xf5\x1d\xd2\x7e\x7c\x06\x1a\xa5\xd6\xc3\x3f\x9f\xa1\xd0\x9b\xa2\x4b\xa6\x26\x54\x86\x58\x49\xf8\x22\x4e\xb0\x1f\x04\x6a\x09\x0b\x0d\xe6\x29\x8e\xa2\xd0\x48\xa8\x5e\x5e\x9a\xfa\xf0\x61\x72\xed\x33\x38\x08\x4b\x18\x37\x08\x2d\xb8\xa0\xc6\x99\xc5\xfc\x05\xc3\xbd\x3a\x61\xa9\xc0\x1c\x92\xb2\xcd\x14\x6f\x20\x72\x2f\x65\xc5\x12\xce\x52\x34\x6f\x5f\x2a\x51\x34\xa0\x37\xd5\x8b\x28\x9c\xb9\x1f\x04\x19\x49\x6a\x04\xc2\xdd\x96\xa2\xa9\xaf\xa1\x13\x2c\x11\xb1\xcd\xb0\xeb\x42\x3c\x66\x3f\xfb\x45\x25\x12\xdb\x8d\xf4\xd2\x1a\x28\xd4\x26\x99\x60\x62\x59\x22\xa8\x65\xcc\xab\xa1\xb9\xc9\x41\xa8\xe3\xad\xc8\xf2\xf7\xeb\xd2\x28\x4b\x84\x54\xa9\x53\xe7\x38\x97\x95\x68\x46\x5c\x02\x2c\x11\x8a\x5a\xa9\x43\x9c\x6c\x43\x47\x22\x91\x81\x6d\x10\x7f\xca\x4a\xd9\x91\xa9\xb2\x44\x91\x20\x76\x1e\xc8\xfe\x67\x47\xc1\xea\xdc\xa7\xc7\xe5\xf7\xf1\x76\x94\x28\x30\x58\x35\x43\x24\xb4\x6b\x42\xf5\xa7\xd2\x31\x51\xc6\xe9\xc6\x67\x3f\x21\xff\x6d\x60\x02\xdc\x3f\x51\xec\xc7\xa6\x0a\x67\xf7\x1f\xdb\x7d\xf7\x73\x13\xd2\x9e\x11\x67\x77\x91\xae\x90\xf9\xc5\x51\xff\xcc\xbd\x0e\x50\x21\x5e\x12\x49\xc6\x44\xfe\x75\x77\xeb\xcf\x66\x68\x42\x5c\x2c\xd2\xa0\x48\xdf\xe4\x41\x0c\xd5\x21\x38\xbf\xea\x46\xa8\xd7\x6f\xa2\xca\x86\xca\xd6\x2c\x31\x3c\x44\x83\xa3\xb3\xda\xc9\x88\x78\x75\xaa\xc9\xd7\x33\xa9\x40\xe2\xf8\xd6\xfe\x62\x44\xe5\x4f\x41\x83\x30\xc4\x9a\x27\x5a\xd2\x9e\x90\x90\xd1\x20\xb2\xf6\x44\x5e\xaa\x62\xd7\xae\xe2\x3e\x9c\xa1\x01\xd7\x88\xf1\x58\x2f\x37\x16\x1c\x71\xf0\xb1\x56\x37\x22\x4d\x64\xd4\xc1\x8f\x23\x78\x79\xe9\xae\x48\x02\x13\x3b\xed\xfe\x27\x71\x7e\xed\x34\x7a\x19\x25\x61\x12\xb8\x02\xc3\xef\xef\x72\x5e\x59\x89\x51\x42\x9d\xbb\x51\x16\xf5\xe5\xd4\xb9\x99\x94\x68\x81\x8c\x13\x3a\xab\x8f\xbf\xcd\xa0\x8f\x18\x8d\x23\xab\x4b\x77\x78\xfb\x40\xe7\x7b\x60\xf6\x69\x9c\x44\xd8\xc5\xdb\x10\x4c\x85\x7b\x48\xfd\x20\xd3\x45\x63\x46\x13\x4f\x4d\xf4\xf8\x3e\xc3\x93\xcc\x68\x42\x0c\xe9\x18\x4e\x9a\x63\x05\xed\x17\x12\x79\xa6\x57\x7f\x7d\xcd\xba\x99\x4f\x13\x19\x77\x8a\xfc\x97\x22\xab\x8f\x7f\x3c\x4f\x12\x6e\x94\xa6\x80\x79\xcf\xaa\x54\xaf\xd0\xac\xeb\x07\x71\x29\xd4\x11\x26\x7b\x10\xa5\x3a\x74\x2c\xef\x88\xf4\xc3\xde\x22\xcc\xb2\xfb\x4b\x51\x23\x0c\xf4\xdc\x86\x3e\xbe\xed\x4a\x23\x7e\x1c\x4b\xa9\x1c\x7a\x98\xb6\x13\x79\xa0\xa9\xcc\x28\x03\x82\x16\x12\xdd\x95\x21\x39\x0e\xa3\x3c\x8a\x91\x19\xe2\x6b\x0d\x95\x53\x47\x99\x35\x8c\x94\xf3\x14\x25\xb9\x16\xe7\xf3\xfd\x45\xfa\x9f\xa7\x3a\x44\xe4\x6a\xed\x39\xe5\xba\x03\x20\x91\x57\xc7\x7a\xfb\x8f\xa2\x7e\xed\xaf\x29\x08\xd7\x0e\x7f\x75\x70\x56\x74\x28\x90\xc8\xa8\x68\xcd\x4f\x57\x9d\xff\xaf\xf2\x28\x8a\xa7\xf7\x97\x0a\x8a\x7a\x7e\xa6\x09\x11\xa3\x25\x5b\xcb\xe2\xef\x55\xa3\xa2\x60\x0f\xf5\x28\xc5\x45\x65\x60\x69\x5c\x44\x9e\xdf\x95\xd5\x73\x79\xc6\x20\x60\xf2\x49\x64\xc2\x3c\x64\xff\x49\xbc\x4f\x67\x88\x0a\xac\xea\xed\x80\xa2\x65\x26\xc3\x4e\x55\x1a\x20\xbe\xa9\x9d\xb6\x56\xae\xbd\xfb\x0c\x4a\xda\x7a\x8b\x45\x5c\x21\xd7\xf7\xa8\x59\x82\x51\xa5\x15\xe6\x1c\x6f\x2e\x55\x61\x69\x4c\x66\xda\x93\x26\xd7\x33\x56\x33\xa7\x9d\x6e\xd3\x5b\xd6\xa1\xc6\xb0\xf2\xfb\x6a\x7d\xd8\x6f\x0e\xcb\xcd\x97\x9d\xbf\x92\x8e\x2c\x95\x82\x85\x52\xff\x1a\x31\x70\xfb\x2b\x22\x6c\x2e\xdd\xb6\x8f\x59\x63\x6a\x71\xa0\xdd\x10\xa0\xb6\x27\xe3\xc5\x55\xa4\x86\x61\x37\xd5\x8c\x21\xb5\x07\xae\x33\x75\x41\x0c\xf0\x6d\x09\xf5\x53\xd9\x7c\x03\xdf\x99\xc7\x28\x44\x36\x99\x7e\x10\x5a\xdf\xc2\xa9\x54\x1f\x49\xb8\x0e\x2d\x81\x51\x04\xe9\x10\x4f\x96\xd8\xcd\xae\xf3\xbb\xb2\xda\x1f\xb3\x2e\x8b\xc2\x82\x30\xe4\xfd\x67\xbc\x43\x6d\xf4\xb1\x00\xd7\x3f\x60\x2c\x1c\x18\x31\xa4\x33\xff\xcb\x47\xa3\x2c\x88\x28\x5a\xc8\x21\xd2\xf3\x51\xe8\x79\x74\x28\x43\xf0\x00\xeb\xba\x03\x95\xa8\x86\x93\x17\x2b\xac\xd8\x6e\x55\x37\x20\xf2\xa5\xa8\xf4\xf7\xac\x39\xee\x4a\x95\x89\x7c\xad\x61\xd4\x3e\x3a\x39\x71\x48\x05\x26\xab\xb1\xcd\xb9\x53\xf2\x65\x2c\x64\x01\xe0\xfb\xad\xcf\x62\x9e\xee\x9c\x31\x12\x47\xc8\xf8\x5d\x5f\x15\x65\x18\x91\x2c\xb1\x9e\x7f\x79\x86\xaa\xb1\x2c\x23\xfb\xb2\xcb\x2a\x8e\x47\xc7\x86\x43\xd8\x91\x84\x8a\x4a\x1d\xdf\x07\xec\x98\x6e\x50\x42\x8d\xcb\x06\x61\x94\xed\x2b\x28\xe3\x5b\xa2\x5a\xdb\xf0\xd4\x5a\x8d\xfb\x52\x0f\xce\x40\x21\x41\x16\x2c\x34\xdb\xe8\xae\x96\xe7\xb2\x06\xfd\x7b\x56\xbc\xe8\xf2\x34\x25\x66\x62\x8c\xe9\x10\x57\x74\xa6\x4a\x44\x9f\x76\x93\x98\x31\x88\x31\xec\xd6\x65\x9e\x8b\x6a\xaa\x08\xc8\x18\xe7\x09\x02\xde\x6e\xd6\xfb\xf5\xdd\xea\x0f\xff\xe7\x34\x24\xe0\x4a\x5e\x2e\x0b\x30\xc0\xe4\xb0\x94\x71\x47\x8a\xe3\x5a\xe2\x91\x83\x53\x9c\x27\x6f\x2b\xd5\x22\x76\xdd\x34\x8b\x37\x51\xb9\xda\xe8\xc0\x7b\x64\x82\xc5\x18\x87\x7b\x31\x93\x3e\x4e\xed\x06\x30\xf4\x88\x10\x22\x33\xe9\xe0\xe0\xf3\x89\x3a\x26\x38\xc7\x86\xe3\x69\x4f\x35\x63\x42\x86\xa9\x05\xee\x23\xbf\xfb\x35\x78\xb9\x1d\x42\x31\x3c\x59\x3f\xad\xf7\xeb\xc5\xc3\x61\xb7\x5f\x6c\xf7\x3d\xdd\x19\x63\x32\x34\x98\x7f\x39\xc8\x8b\xdb\x7f\xef\xaa\xf2\xb4\x7b\xaf\x9b\x89\xf8\x34\x63\x52\x10\x7c\xb7\xa5\x0d\x20\x7e\x89\x0d\x99\x31\xa9\x24\x77\xc2\x74\x97\xf6\x93\x65\xc5\x33\x22\xba\xea\xfe\x26\x55\x18\x44\xda\x8b\x04\xd6\x96\xee\xeb\x83\xa8\x8e\x29\x00\x2c\x29\xed\x84\x69\x23\x15\xab\x41\x23\xf2\xfb\xbb\xee\x76\xdc\x40\x88\xb4\x8a\xbd\xd2\x56\x96\xbf\xcf\x6c\x09\x0c\x22\x30\x91\xe7\x6f\x3a\xe7\xef\x53\x65\x34\xc6\x7c\x83\x8a\x84\x66\x53\x2c\xcb\xfc\x72\x2a\xa6\x23\xa4\xc1\x5a\x46\x2f\x30\x66\x6b\x6b\x1f\x44\x33\xbf\x88\x7d\x19\x3f\xb4\x61\x94\xdb\xf2\xc0\xa6\x7d\xed\x57\xbc\x18\x8c\x19\x23\xf1\x33\xc2\x4f\xa8\x54\x56\xc3\x43\xd9\x0b\xf3\x0f\x89\xda\xf9\xff\x78\x40\xd5\x24\x4f\xc1\x03\x41\xb0\x12\xd5\x71\x7f\x34\xa5\xe3\x77\x63\x3c\x90\x04\xd5\x46\x4e\xe5\x8f\xae\xff\x67\x34\xb1\x79\x18\x87\x41\xea\x75\x0a\x10\xf6\x32\xdb\x83\x30\x9e\x1b\x3c\x54\x0a\x45\x49\x84\xd6\xcf\x65\x9e\xa9\xf7\xdf\x2e\x43\x61\xed\x89\x84\x22\xe3\x51\x18\xa1\x13\xee\xb4\xbd\x6c\x22\xa5\x33\x0e\x3c\x0a\x29\x77\xac\x0e\xab\xfd\xfd\xd7\xdd\xed\x15\x49\x18\xe3\x11\x11\xb1\x55\x63\x38\x65\xcd\xad\x68\xac\x60\xcd\x77\x80\x57\x5f\x52\xe3\x84\x31\x6c\x71\x54\x65\x75\x0d\x7b\x1a\x7d\x18\x1e\x27\x96\x2f\x64\x5d\x89\x73\xd6\xdd\x47\xec\x32\x9e\x98\xce\xb3\x8b\x6a\xb5\x5d\x32\xc6\x7e\xb5\x5b\xf5\x5f\x83\xfc\xd2\x2c\x37\x11\xe3\x31\xb7\x1e\xc4\xb3\x78\x47\x64\xd9\x3f\xbc\xe9\x58\x5a\xee\x15\x5b\xc4\xfc\xd6\x1a\xe2\xf9\x38\x9f\xc7\xca\x76\xbf\xdc\x82\x82\x2e\xec\xe3\x49\x4c\x63\x5f\xd5\xec\x21\x2d\xc8\x12\xf1\x70\xcd\xc6\xca\x78\xc2\xe2\x58\x7b\xdd\xc3\x70\x58\x5d\xe0\x89\xe0\x1e\xfc\xbe\x14\x85\xc6\x1d\x01\xb7\xa9\x45\x55\x89\xf7\x6e\x94\xb4\xf8\xab\x5e\x5d\xbe\xee\xf9\x72\xdc\x18\x4a\x14\x56\x0a\x50\x55\x58\xf6\xae\x04\xa7\xa0\x7d\x18\x84\x97\x9e\x99\x07\x2c\x0e\x91\xe7\xe0\x69\xfb\xe8\x7f\xc5\x49\x88\x71\xf5\xd7\x22\x6b\xde\x47\x55\x98\x4e\xa9\xed\xff\x50\x66\xe9\x26\x2d\xe7\x14\xc5\xe9\x07\xee\x69\x1d\x3d\x43\xb5\xba\x7a\x69\x3c\x75\xea\x2a\xa2\xd0\x87\xa2\x7f\xf9\x69\x1a\xc5\xbc\xb7\xf3\xbf\x67\x1d\x80\x8f\x8b\x30\xc0\xde\xe9\x53\x59\xb4\xce\x5c\xa7\xc9\xcb\xb8\xa0\x12\x27\xa1\xd5\xc5\x22\x87\xe7\xed\x0a\x55\x37\x6e\x36\x4f\x5f\x77\xdd\x20\x66\xab\xc7\x35\x34\xb8\x25\x79\x03\xc8\xfd\x71\xb0\x5d\xf6\xbe\xdb\xb5\xcc\xaf\xe0\x9a\x6e\xa4\x94\x26\x72\x35\xb4\x95\xa8\x8a\xac\x78\x71\xda\x7b\x37\xef\x5f\xca\x52\xd7\x33\x95\x4a\xae\xa3\xc8\x6a\x12\x1d\xcb\x4b\xae\xef\x84\xe7\x70\x60\x5c\x53\x30\x3d\xb0\xe7\xee\x02\xf9\xf4\xa7\x29\xf3\x95\x87\x7d\x36\xd0\x1b\xfa\xa4\x5a\xc1\xb5\x4e\x69\xd8\x91\xdb\x61\x39\x0b\x29\xf2\x26\x5e\x11\x07\x60\xa9\x95\x5f\x3e\x9d\x2f\x8d\x65\x39\x86\xea\xc7\x60\x0a\x9b\x38\xc6\x5d\xd5\x57\xbb\xf1\xa3\xb6\xfe\x2c\x88\x79\xc2\x41\xc6\x0d\x0b\x88\x73\x1e\x0e\x67\x8b\x8d\x3d\x54\xa0\xe7\x72\xc1\x69\x10\xa6\x18\x02\x58\xfe\x81\x5b\xc8\xb3\x1f\x8e\xde\xc3\x92\x81\xe6\x65\x31\x83\x3b\x99\xfb\xaf\x7f\x4d\x4e\xcc\xe2\xc0\xe2\xe8\x54\x75\xc9\x9a\x27\x51\xa9\x2b\xa6\xb6\xa1\x23\x96\x06\x3a\x92\x5e\x23\xbb\x2c\x4f\xd8\xca\x32\x39\xa5\x21\xc6\xd5\xbe\x16\x7d\x8b\xc4\xed\x80\x0a\x77\x80\xde\x76\xbf\x89\x48\x84\x7d\xb4\x47\xd1\xa8\x63\x7d\x91\xb5\xaa\x32\x39\xa5\x0d\x66\x29\x51\xd6\x3b\x75\x3e\xe5\x63\x96\x43\xdd\xb4\x8f\x3e\xbe\x03\xa2\x09\x27\x1d\x90\xb9\x7a\x9f\x6d\xfb\x66\x69\x4c\xc1\x17\x79\xd7\xd8\x64\xe2\xfe\x9e\x24\xc6\x58\xf2\xb3\x9f\x5f\xd6\xdb\x87\xee\xcf\x8c\x09\xf7\xe4\xab\xd3\x39\x2f\xdf\x51\x37\x55\x4b\xa1\x5e\x37\x1f\xc0\xad\xd3\x44\x4b\xe5\xfc\x98\x29\xb6\x79\xf4\x56\x59\x12\xe1\xa2\x5d\x68\xbd\xfb\xbe\x28\xb4\x85\x9b\xcc\x37\x7c\x4f\xff\xfd\xe0\xf0\x0c\x96\x9e\xa5\x4c\xda\xda\x55\xfb\x9b\x57\x1b\x12\x3e\xab\xe6\x8f\x30\xf0\x0f\x99\x2a\x5b\x85\xfd\x71\x86\x76\x52\x1e\x7e\x87\xb2\x7b\x5f\xa9\x66\x84\x0d\xb3\x17\xd5\x4a\x95\xb5\xf5\x0b\xdd\x10\xc1\x2c\x45\xef\xf7\x63\x99\x8d\x6a\x0c\xa9\x00\xe3\x35\x89\x06\xe9\x9e\x54\xc6\x09\xb5\x0e\x2b\x64\xaa\xc4\xa4\xca\xed\xf0\x70\x1a\x23\xfb\x64\xfd\x96\x35\xea\xb8\x3b\xe7\x99\xed\xb6\x1b\xeb\xfe\xf4\xfe\x76\x2a\x53\x2f\x54\xde\x3c\x80\x78\xb9\xc0\xb6\xf4\x84\xbf\xc3\x19\x30\xeb\x49\xa6\x2a\xd0\x38\x0b\xb3\xe2\x87\xa8\x32\x51\x34\x37\xd5\x20\xb6\x4b\x75\x00\xca\x25\x94\x1e\xa1\x69\x1f\xbf\x39\x0e\x98\x46\xfa\xaf\xae\x1d\xe9\x79\x0d\xb9\xd1\x60\x05\xdb\xbb\x93\x18\x23\xe3\xce\xe4\x74\x34\x02\x2c\x85\xd0\x72\x40\x2d\x54\x59\x89\x4c\x8b\xc7\xb2\xc8\x94\xf8\x2e\x8a\xa6\xde\x97\xbf\x17\xe5\xdb\xfe\x08\x4f\xf0\xb6\x28\xea\x37\xa8\xee\x45\x7d\x1c\xfb\x5b\x29\x24\x29\x46\x48\x58\xd4\xd8\xe2\xa6\x3e\xea\xe1\x9b\x3c\x2b\x48\xcb\xf0\xd7\x15\x08\xb1\x99\x66\xbe\x7a\x94\x9a\x58\x23\x28\x7c\xb9\x5a\xdd\x2e\x37\x6b\x5f\xcb\x4c\x0d\xb5\x1d\x3b\xab\xcd\x6e\xb5\x5d\x5e\x53\x69\x8f\xe6\xb8\x01\x9b\x30\xa9\xc0\x64\x79\x6e\xb7\xf6\x0f\x81\x62\x22\x48\x55\x44\x2c\x35\xdc\x30\xb8\x1c\xaf\x2f\x11\x88\x04\xfb\x67\x0f\xb6\x96\x86\x71\x42\x1b\x70\x3f\x42\xa5\x8e\xa2\x2f\xee\x8c\x1e\x47\x84\xa9\x8c\x86\xe0\xa5\x55\x73\x7c\x14\xaf\x1f\xd5\xce\x44\x28\xad\x74\x9b\xd0\x7a\xf2\x96\x66\x6d\xaa\x08\xa5\x46\xec\xb1\x3f\xfd\xae\xb9\x74\xdb\xb3\x08\x35\x45\x7c\xc4\x9f\x9b\xcd\xe1\xeb\xd3\x7a\xdf\xfd\xdd\x24\x48\xe5\xe7\xf2\x2c\xdf\x91\x09\x79\x52\x97\xed\x5e\x4e\x14\x30\x8f\x96\x42\x57\x6f\xcc\xc6\xe7\x07\x25\x24\xf6\x69\xd2\xee\x45\x27\xdd\x29\xa8\xc2\x6c\xc3\xed\xe5\xaf\x0b\xdc\x54\xf0\x96\x15\x2f\x4e\x34\xd0\xdf\x52\xc4\xb8\x25\xe3\x6e\x57\x9c\xab\x92\x7c\xf0\x1d\x08\x48\x2c\xc5\x20\xb0\xe3\x5e\x54\x7a\xe9\xa9\xa0\x99\x88\x63\xdb\x16\xef\x7a\xa1\x91\xda\x00\x65\xa8\xfc\x71\x60\xca\x02\x7d\x2d\x13\xd4\xcd\x18\xf2\x26\x92\xc8\x20\xbc\xca\xcb\x8c\x7d\x29\x73\xdd\x1d\x4b\x35\xd6\x78\x6b\xa7\xee\x73\x2d\x01\x35\x70\x9c\xaf\xda\x8d\xfd\x49\x94\x46\xa3\xa8\xab\x89\xe2\x0d\x13\x54\xd8\x0c\x99\x4d\xc8\x6f\x17\xfb\xd5\x21\x4a\x0e\xcf\xab\xed\x72\xf5\xb4\x1f\x39\x4e\x82\x91\x34\xf0\x6a\x03\x3e\xf2\xec\x64\x53\x98\x60\x3c\x88\x2d\xc9\x9e\xc9\x31\xef\x7f\xf3\x3e\x83\x52\x11\x9c\xc7\x48\x38\x66\xa9\xdf\x6f\x32\xdd\xe7\x7f\x05\xe7\x86\xf5\xa2\x15\x4e\x95\xd1\x59\xb4\xe7\x76\x55\xfd\xdc\x8b\xfa\xf5\xb7\xf1\x03\x4f\x9e\x7b\x76\x82\xa7\x2a\x45\x9d\xa4\xe6\xa5\xda\x59\x36\x8f\x91\x4a\x32\x13\x22\x22\x10\xf9\x04\x38\x36\xdd\x79\xea\xde\xf1\x89\x44\x12\x88\x5e\x83\x12\xad\x67\x85\x1c\x32\x59\x6f\x82\xa7\x3f\xe1\xb6\xf3\xb8\x86\xe6\x8f\xa6\xf4\x11\x97\x90\x11\xc5\xea\x64\x73\xcc\xea\x75\xbd\x3f\x22\x0b\xe1\xf8\x97\x32\x26\xd8\x69\xfd\xb5\x58\x96\x85\x99\x5f\xe9\x32\x89\x31\xfe\xfb\xb2\xda\x1f\x1e\x17\x7f\x1c\xbe\xae\x9f\xf6\x9d\x1e\x12\x13\x52\x44\x51\xe2\x80\x45\x7d\x6b\xb4\x3b\xa8\x34\x47\x30\x72\x5e\xbe\x61\xcd\x0b\x75\x70\x26\x9f\x0b\x52\xe0\xed\xdd\x1f\xdf\x65\x95\x69\x57\x3d\x44\x82\xa7\xf1\x38\x13\x2a\xee\x7b\x42\xdb\xf9\x6f\x7d\xdf\xfe\x20\xba\xb6\xd0\x6e\x27\x6a\x3e\x3b\x28\x4c\x44\xb1\x9f\xd1\xdb\xeb\x4d\xbb\xee\x67\x09\x66\xe7\x57\xa8\x31\x31\x8f\x7b\x72\x99\x6d\x99\x8f\x23\x59\x3e\xd8\x45\x85\x31\x29\x76\xd1\x89\x4b\x53\xba\xdd\x7e\x82\xe5\x90\x01\xd3\x18\x81\xb4\x7e\x5c\xf1\x92\x83\xe5\xc6\x53\xcb\xbc\xbc\xe8\xf5\x66\x7f\xa5\x33\xc7\x64\x00\x01\x66\xad\xee\x84\x82\x3d\x28\x5f\x87\x95\x61\x2c\xa2\xde\x09\x3f\x97\xb5\x98\x94\x10\xfd\x38\x1a\x63\x6c\x27\x2f\xef\xcb\xcb\xb9\xfb\x35\xb5\xbb\x0a\x26\x6c\x44\xbe\xc5\x76\xe1\x2b\xc9\x58\x26\x43\x16\x29\x27\x97\xf1\xf3\xe7\xb5\x92\xd6\xaf\x01\xd4\x65\x68\x12\xed\x66\xeb\x54\x71\xc2\x8d\x88\xc2\x04\x8d\x49\x1f\xe9\x3b\xe9\x96\x5b\xf8\x01\x79\x97\x40\x91\x51\x14\xa0\x37\x79\x29\x90\xaf\x6e\x7a\x16\xaa\x84\xec\x6d\xe6\xa3\xf8\xd9\x27\x93\xbc\x3f\x26\x49\xc4\xd0\x4f\x3d\xdb\xe4\x69\xe7\x0d\x8f\xb0\x97\x32\x0e\x28\x12\x5c\xdd\x76\xfd\xe4\x4c\x26\x81\xc0\x52\xd0\x8b\x18\x2f\x74\x99\xc4\x29\xe6\x65\xdb\x20\x68\x66\xbe\xcb\x24\x91\xc6\x13\x14\xe6\x99\x7a\x7d\x84\x46\xe8\xeb\x4f\x4d\x13\xab\x5f\x53\x23\x05\x49\xd3\x0b\x7d\xce\x87\x8a\x92\x71\x8d\xa1\xbd\xa9\xca\xd3\x3d\xfc\x5c\x1e\x85\x83\xf6\x87\x7e\x80\x88\x3d\x6d\xfa\x76\x7f\x78\xde\xae\x97\xab\xc3\xfa\xe9\xd0\x5a\x61\x6f\x80\x25\x53\x01\x36\xb8\x77\x59\x44\xc9\x74\x12\x25\x03\x6e\xf2\xe7\xd2\xca\xdc\xba\xc3\x9c\x04\x58\x43\x6a\xdd\x11\xf4\x1c\x26\x4f\xc1\x39\x45\x26\xb3\x1c\x4c\x93\xb2\xc9\x41\x19\x33\x6c\x34\x41\xc1\xbf\x9b\x4b\xa1\xf3\xbe\x55\x4e\x4a\x6a\xfd\xa5\x93\xf8\xf9\xdd\x33\xbe\xb9\x43\x2a\xe6\x98\x88\x78\xfc\x73\xb7\x5f\x6d\xff\x5c\x3e\x2c\x76\xbb\xf5\x72\xe0\x54\x49\x1d\x26\x88\xfa\xf4\xbc\x24\x6b\x8f\xef\x41\xe3\xd2\x33\x15\x33\xa9\x69\x2a\x68\x3f\x4b\x6e\x2f\x90\x7b\x03\x2a\x21\xe0\x98\x15\x3d\x8b\xaa\x79\x47\x77\xf1\xa3\x19\x3f\x9e\x79\x90\x80\xed\x41\x68\xe7\xef\x03\x98\x66\xd4\x68\x24\x21\xb5\x41\xd0\xcd\x9f\x43\x5b\x29\x41\xc4\x08\x19\x79\xf3\x15\x4f\xd0\x36\x35\x30\x39\xb9\x50\xe8\x41\x8f\xb6\xeb\xe1\x64\x35\xca\x76\xe9\x59\x95\xe6\xe5\x51\xe4\x39\x14\x1f\xcb\x34\xcf\x36\x08\x8e\xbc\x4e\x15\x85\xc6\x8b\x33\xde\x65\xb5\x12\xf9\x84\xd3\x6c\xe4\x44\xab\x28\x11\x88\x73\x68\xc3\x76\x47\xe3\x33\xbd\xb6\x77\xc2\x54\xc4\x43\x94\x2d\xf4\x35\x0c\x14\x15\x29\x9a\xd1\xbb\xfe\xe0\x2a\x82\x20\x4f\x66\x07\xb0\x19\xd2\x7d\xb9\x31\x84\x28\xee\xb2\x5d\xeb\xa2\xe1\xad\xa5\xbf\x79\xf7\x5a\xed\xe1\xb8\xdb\x9d\x29\x92\x10\x6c\x01\x7d\xf8\x7d\x79\x45\x79\xc4\x14\xa1\x0c\x01\x44\xeb\x6a\x8c\xf4\x51\x44\x50\xcc\x9e\xfe\x7e\x14\x8d\x38\x75\xd0\x32\x45\x84\x46\x0c\x04\xe2\x14\x50\x12\x74\xd6\x33\x56\x04\xa2\x04\x3a\xaa\xf8\x85\x52\x50\xd7\xb7\xd0\xc6\xc6\xf3\x51\x87\x8a\x13\x8e\x2d\x8b\xff\xf9\xdb\x8b\x98\xfc\x62\x39\x53\x25\xa1\xc4\xce\xe7\x1f\x19\x58\x50\x6b\xbd\xeb\xfd\x40\x95\x68\x8a\x35\xc8\xd3\x25\x6f\xb2\xe3\x20\x38\x1a\x9f\x84\x46\x16\xaa\xe2\x59\x36\x5a\xf3\x75\xbd\x53\x29\x0a\x04\x33\xa9\xca\x6a\xab\xcc\xfb\xbc\x8a\x19\x22\x5c\xc2\xe9\xe6\xcd\xe6\x4f\xc5\x50\x43\xce\x0d\xe3\xb1\xdd\x4b\x11\xef\x79\xf3\x8e\x92\x3d\x23\x5a\xb5\xd9\xb9\xe2\x7e\x9c\xca\x20\x74\xe5\xf7\x55\x73\x1c\x26\x4d\x55\xaa\x23\x84\x07\xda\x94\x90\xe5\x3b\xbd\x0e\x88\x95\x08\x0d\xee\x58\x27\x84\x4a\x1e\x54\x79\x3a\x5d\x30\x9b\x69\xb1\xb7\xdf\x44\x1b\xbe\xfa\xb1\x51\x94\xf2\x71\x5e\x12\x2b\x71\xe3\xaf\xe3\x07\xcb\x28\xd5\x3d\x09\xce\x42\x66\xdf\xa0\xaa\xfb\x42\x93\x92\x61\x80\x2e\x5c\xfb\xc4\x05\x54\x5f\xab\xbc\x3b\x42\x43\xe9\xf3\xbd\xc7\x72\xf0\x4c\x32\x25\x5e\x67\xf5\x70\x44\x7e\x99\xc9\x97\x51\x31\xc7\x8e\x0f\xbc\x37\x17\xf5\xb8\x43\x9a\x18\x24\x44\xfc\xfa\xf4\xb0\x59\xfe\x8e\x1b\x45\x77\x28\x21\x18\x4b\x3e\x7f\xbd\x79\x58\x2f\x51\x6a\x78\x77\xd8\x3d\xaf\x96\xeb\xc5\xc3\xe1\x2b\x52\x58\xf5\x4a\xea\x4c\x69\x1a\x63\xab\xdb\xc3\xea\xe9\xf6\x8f\x81\x65\x56\x5a\x5a\x6f\xaf\x80\xb7\xdd\xd1\x75\x57\x85\x1f\xb8\x0a\x4a\xab\xd0\x36\xff\x76\xc9\xae\x7d\xd9\x9a\x95\x55\x73\x1c\x33\xd7\x32\x05\x84\xa3\x6f\xf7\x0d\xaa\x06\x7e\x1e\xc6\x4b\x62\x3c\x9b\x20\xb5\x8d\x9e\x2f\xd0\x6c\x7e\x40\xd5\xbe\x24\x7f\x16\x13\x32\xbc\xa0\xf7\x10\x9f\xab\xec\x54\x56\x3a\x13\x96\x16\xfa\x33\x31\x02\x7f\x06\x66\x2b\x08\x4e\x56\xbf\x53\x1e\xe9\xae\x90\x86\xe8\x43\xe5\xa2\x6e\x7e\xcf\xd4\x6b\x69\xcc\x20\x59\xa3\x8c\x36\xca\x4b\x81\xa0\xeb\xbf\x2e\x54\x79\xca\xfa\xb2\x93\x1d\xa7\x03\x4a\xb1\x91\x5c\x97\xd8\xd2\xe3\x7e\xae\x43\x62\x9c\x06\x29\x42\x83\xdb\xfb\xfd\x06\x85\x1e\xf8\x6a\x23\x2b\xaa\xc3\x84\x61\x01\xe3\xb9\x2a\x4f\x43\xab\xa6\xa3\xc8\x02\x30\x6b\x68\x0e\x99\x2a\x8b\xec\xaf\xc3\xb9\x82\xc3\xeb\xbb\xb2\x12\x90\x87\xa2\x63\x34\x1b\x3d\xbf\x26\x11\x05\x83\x0e\x81\x6d\x3e\xbc\xbb\x7c\xd0\x3e\xab\x89\x0e\xb0\x3e\x6c\x5d\xc0\x55\x73\xfc\x8c\x51\x8a\x69\x02\xc6\xc4\xbd\x32\xd1\xb8\xc3\x66\xfc\x85\x75\x1c\x46\x09\xe9\x58\xec\xb0\x37\xff\x5c\xf6\xb0\x26\x1d\x47\x82\xcb\x3e\x0b\x37\xce\x02\xe9\x38\x4d\x83\xb4\xfb\xb5\x95\xaa\x9c\x28\xac\x33\x1d\x43\x8a\xdd\xc6\x36\x4b\x64\x95\x4a\x3f\x2d\x16\xe9\xd8\x24\x08\x3d\x7a\xcb\x0a\x5d\xbe\x85\xd7\x7b\x8c\x4e\x8c\x80\xce\x8b\x87\x53\x76\x39\x0d\x61\x88\x9a\x4a\x85\x74\x4b\x3d\xe9\x09\x66\x15\xe6\x7a\xc1\x34\xd5\x61\xec\xa2\xcd\xe7\xb5\x6b\x9d\x48\xfd\x89\x52\xaa\xa2\xd8\x93\x19\x16\xb5\x85\xba\xee\x44\xde\xa1\xf4\xae\x1a\xb8\xb4\x88\x2c\xc7\x8b\x25\x72\xbc\x6f\x63\xea\xe2\xb9\xac\xb3\x81\x68\xcb\xbf\x06\x62\xaf\x3e\xe0\xd0\x22\x4a\xad\xfa\xb8\xaa\x16\x27\x74\x93\xef\xca\xea\x8b\xf0\xcb\x41\x8b\xd6\x2f\x6d\xed\x84\x90\xc3\xd6\x5c\x77\x54\x0a\x93\xf6\x44\x3b\x98\xb0\x5c\x14\xfa\xe6\x52\x5d\x09\xe5\xfa\x1f\x98\x04\xd1\x2e\x37\x55\xa6\x67\x5c\x9e\xf9\xd9\xa2\x40\x61\xb8\xf1\x1d\xa1\xad\x18\xa4\x15\x13\xf9\x6a\xa6\x75\x68\x29\x8d\x34\xd4\xed\xc7\x51\xd9\x90\x28\xc6\x8f\x61\x31\xd6\x7d\xe4\xe5\x7d\x9c\xe4\xea\x8e\x4b\xe9\x1a\x0a\x74\x56\xbc\x8c\x80\x44\x1a\x68\xca\x6d\x86\xec\x7f\x2f\x75\xd3\xe7\x7e\x34\xf0\x00\x73\x37\x0e\x5a\xe6\x3b\x64\x3f\xa9\x4f\x0c\xbb\x4b\xc7\xb5\x5e\x0d\x3c\x44\x7f\xdc\x5c\x0a\xbd\xbb\x28\x05\xa0\x07\xb7\xa0\xc0\x96\x68\xdb\x05\xb3\x9e\x7a\x14\x6e\x90\x71\x80\x22\x79\x79\x1f\x16\x19\xfc\xd1\x24\x44\x5c\x82\xa8\xd4\x31\xfb\x01\x1d\x4d\xee\xe4\x4d\x18\x88\xb4\xe3\xd5\x5f\x35\xc7\xbb\xb2\xda\x81\xe7\x83\x66\x10\xc4\x02\x9b\x6b\xb2\x22\x6b\xd6\xc5\x8f\xac\x81\x51\xc3\xc5\xe8\x4c\x10\x50\x8e\x25\xab\x85\xd6\xdd\xef\xa5\xd0\xb2\xe3\xe6\xef\xfe\xaa\x19\x37\x0e\x04\xdf\x1a\xa5\xfb\xf2\x04\x8b\xd3\xe4\x13\x41\x48\x00\x9c\xcb\xe8\x82\xcd\xa9\x33\x02\xa1\x00\x8f\x7a\x41\xc8\xaa\x6f\x1c\x82\x50\x59\xab\x83\x3c\x21\xf6\xc6\x97\xa5\xf6\xb6\x19\xa2\x88\x23\xc9\xae\xcc\x5e\x1e\xcb\x02\xde\xbb\xbf\x0b\x8a\x0a\xf3\xf6\xfb\x0e\x31\x30\x7e\x80\x8e\x84\x25\x8f\xaf\xa0\x0f\x61\x3f\xb7\x36\x40\x88\xc6\x0e\x8f\xdd\x9b\x69\xe6\x78\xa9\xaf\xdd\x43\x88\x83\x58\xf9\x36\x81\xce\x27\x80\x98\x30\x4c\x2e\x2d\x17\xdb\xf5\x70\x8b\x80\x38\x4e\xd0\xf1\xbd\xdb\x3c\x6e\xba\xbf\x31\xea\xa1\x8e\xcf\x48\x80\x6c\xad\xca\x84\xaa\x8d\x41\x2c\x54\xa4\x06\x8d\x97\xdd\xb3\xc6\x3a\x0e\x6d\xc3\x7e\xa9\x17\xa3\xcb\x25\x11\x91\x98\xfc\x7b\x86\xba\xec\xfe\x48\xc2\xd4\x8b\xca\x5f\x9a\xe3\xcd\x3b\xbe\xf0\xd1\x53\x25\x31\xa1\x4e\x42\xad\xc9\x61\xbe\x8c\x05\x89\x09\xf9\xb5\x9e\xec\xb6\xb5\x8c\xd3\x3a\x1b\x50\x4e\xd1\x69\xf3\x6c\x37\x87\xb8\x3b\x22\x15\x02\x3a\xd0\x79\xfe\x05\xa6\xd6\xf6\x17\x06\x4d\x4f\x63\xad\x4a\xbb\x52\x2c\x79\xad\x3f\x25\x0b\x20\x4d\xbd\x84\x6a\x6e\xb0\x35\x3c\x1f\x90\x9f\xfb\x85\x0d\x8c\xc6\xb4\x97\x9f\xbb\x85\x1c\x5e\x06\xe0\x56\x37\x88\x87\x56\x01\xe8\x8f\xcd\x37\x7f\x01\x1e\x71\xdc\x54\x2c\x7d\x69\xf7\x57\x16\x3b\x7e\xda\xba\x69\x1d\xfc\xc9\x2a\xe1\x4a\x63\x27\x8c\xcc\xf4\xc6\xcc\xe7\x23\x80\x6b\x82\xc6\x04\xdd\x85\xa8\x3b\xb1\xa1\x16\x88\x77\x72\x76\xec\x97\x09\x03\x19\xa4\x41\x84\x14\x78\xa8\x85\x93\x46\x93\x7b\x4a\x03\x8b\x62\x79\xb0\x6d\xae\x96\xc7\xfa\x9f\xba\x22\xfc\x6f\x89\x65\x0e\x44\xc3\xb7\xbc\xd4\x4d\x79\xfa\x40\xc7\x9a\x41\x1a\x0b\xb4\x10\x8e\xae\xe5\x0e\x86\xc2\x7a\x0c\x52\xce\x81\x75\x62\x63\x0b\x2b\xa0\x9d\xe5\x59\xf3\x3e\xc8\x3a\x40\x2a\xad\xca\x83\x8d\x8f\x77\x6f\xe2\x9a\x37\xee\x9a\x9b\x09\x44\x64\xb0\x7b\xbf\x11\xf5\x6b\xbd\xeb\x99\x1d\x40\xc4\x44\xda\x36\xfb\x52\x5f\x14\xe8\x9b\xaa\x2c\xfe\x86\xa5\x38\x77\x13\x5c\x80\xe5\xb9\x69\xd7\x76\x6b\x0e\xe6\x44\xfc\x26\x57\x93\x89\xe9\xa4\x30\xb2\x0f\x95\xe9\x27\x5f\x5d\x3a\xae\x6a\x6b\xcc\xb0\xa5\xae\xcf\x5a\x7f\xd6\xfb\x38\x39\x8f\x0a\x02\x35\x50\xc1\xc2\xdb\x9d\xf0\x2c\x4e\x7e\x40\x39\x56\x40\xde\xb2\xa2\xc8\x8a\x17\x07\x45\xbe\x9b\xfa\xa7\xa0\x24\x8f\x86\xda\xb7\x8b\x42\xff\x0a\x7f\xc2\xf4\x6a\x4a\x21\xcd\xb8\xd3\xc1\x42\x43\xe5\xed\x41\x81\x24\x8f\xdd\x8c\xd7\x09\xf7\x6d\xf2\x6e\x85\xcf\x55\x9a\x40\x0b\x1d\x88\x5e\xae\xda\xea\x5e\x60\x61\xaa\x77\x05\x00\x12\x13\xa4\x9d\x50\x84\xc8\x27\x62\xd0\x0c\x40\x0a\xec\x86\xd1\x7d\x13\x8c\x3b\x62\x12\x81\x85\x67\x0d\xf2\xf2\xb2\x6b\x2e\xc6\xf4\x47\x94\x4c\x07\xb0\x1e\xef\xce\x0d\x8b\xde\x60\xa4\x70\x4c\xb8\xad\xb3\xbe\x40\x6a\x65\xd0\xe3\xe2\xe8\x9c\xbb\x60\x82\xd0\x82\xd1\x56\xfb\xfb\xf1\x97\x30\x41\x6c\x49\xe7\x1f\xd6\x8f\xeb\xfd\x61\xbf\x5d\x3c\xed\xee\xda\x30\xf2\x79\xb5\x5d\x6f\x7c\x33\x8a\x09\xa8\x2d\xd8\x1c\x70\x6d\x62\x73\xcc\x42\x96\x3f\x60\x9b\x0d\x96\xb7\x1b\x1b\x46\x80\xa9\x09\x9f\x4d\xfa\xe8\xa3\xfe\x77\x18\x84\xff\xe3\xcd\x8a\x09\x99\x25\x4c\x39\xf5\xed\x6c\x23\x1c\xc0\xf8\xd3\x9b\x38\x8a\x30\x69\x09\xed\x48\x1b\x7c\xf5\xa9\x02\x43\xd3\x00\xa1\x1d\x47\x51\xbb\x16\x33\xd0\x77\x65\xf5\xe8\xd1\xe1\xfe\xb1\xa8\x88\xd0\x6d\xb1\xc4\x8a\x4b\xa8\x9a\x29\xf1\xf8\x78\x35\x1a\x16\x72\x91\x0e\xd2\x2e\xeb\xee\xa3\x1b\x46\x39\x66\x4a\x57\x45\x56\x1f\x33\xdc\xec\x27\xbb\x83\xe1\x41\x8a\x3e\xcb\xed\x7b\x21\x4e\x99\x7a\x7e\xaf\xc4\xa9\x43\xd6\x19\x4e\x62\x6e\x09\xed\x5c\x37\x05\xe6\xd2\xfc\x41\x61\x5b\xe3\xc0\x37\x6a\xbb\x0d\x6a\x76\x19\x1a\xae\x6c\x3b\xe1\xa5\xce\x8a\x97\xa5\x28\x7e\x88\xfa\xa6\x3d\xa7\xa8\xb2\x0e\x61\x66\xb8\x36\x58\x47\xb1\x2a\x63\xeb\x09\x52\xc8\x08\x1d\xa1\x27\xbc\x5d\x3e\x60\xcd\xf0\xb3\x8a\xb8\x91\x92\xc9\x8e\xa9\x63\xa1\xf5\x4e\x14\xbb\xbc\x6c\x6e\x50\xdb\xf5\xc3\xbd\xc4\x48\x1d\xf1\xd4\xb9\xf3\x55\x39\xdb\x23\x63\x54\xa8\x66\x01\xd6\x0e\xd4\x7d\x05\xb0\x36\x3a\xd5\x82\xf8\x0c\x9a\x12\x75\x33\xdd\xdc\x3e\x51\xac\x66\x46\xab\xc8\x58\xc9\x1c\x8c\x1d\x86\xce\x8f\xd1\x3a\x71\x21\x69\xb3\xd6\x5b\x31\x93\xce\xf5\x03\x8d\x55\xb3\xdb\xae\xfe\xfd\x75\xbd\x5d\x75\xcb\x08\x12\x6b\x18\x84\x52\x70\xee\x91\xdf\x06\xa8\xb4\xce\xa7\x4f\x94\xd7\xcb\xf2\x74\xce\xa1\x01\x3d\x7e\x36\xa0\x26\x00\xbf\x45\x6e\x7e\xa0\x96\x07\x4c\x08\x35\x78\x10\xa6\x1a\xf3\x09\xcb\xcd\xd2\x51\x81\xd7\x9f\xa1\xc8\xb8\xff\x99\x96\x98\x34\xd3\xf0\xa3\x6c\x60\x5f\x2e\x45\x35\xbc\x3a\x0f\x22\xc5\x11\x31\x77\x57\xc1\x40\x38\x84\x07\x91\x31\x8e\x36\x03\x9c\x2a\xd1\xc1\x1f\x22\x34\x0e\xbb\x24\xfc\x22\xcf\xbb\xf6\x88\xd9\x56\x34\x1e\xc4\x8c\xa3\x85\x2b\x4d\xbb\x2b\xd4\x3b\xa1\xaa\xcc\x64\x13\x1a\x73\x1e\xc4\x29\xa1\xa1\xa3\x64\xb4\x39\x08\xef\xff\xf1\x20\x91\x3c\xf6\xdd\x52\x96\x68\xc5\x1d\xa0\x34\xb0\x4a\x5f\x97\xfc\x75\xa1\xb5\xc7\x08\x7c\x34\x3d\x79\x40\x8d\x46\x57\xdc\x72\xd8\x3b\xf6\xb8\x2b\x65\xc3\x6e\x38\x93\x3c\xd6\x8e\x3e\x4f\x0e\xa5\x76\x67\x93\xe7\x3c\x60\x86\x21\xf3\x81\x86\xf6\x4b\xf7\xf4\x09\x36\xf6\x9d\xc8\xef\xf0\x80\x87\x29\x38\xc6\x0d\xc4\x1d\xcd\x39\x7c\x3c\x10\x49\x60\x0b\x13\xc7\xb2\x6a\xa0\xb8\x05\xa1\x91\xa5\x6f\x32\xaa\x8d\x82\xdd\x3e\x57\xe6\xda\x42\xf6\xaf\xc8\x19\x78\x20\x03\x95\x58\x49\x41\xdb\xd2\x5c\x4f\xce\x23\x89\xb4\x39\x59\xb4\xac\x30\x20\xfc\xec\xde\x8a\x4c\x40\x3a\x18\xe6\x7d\x79\xa9\x3d\x13\xee\xfe\xad\x9c\x7c\x53\x99\xea\x38\x1d\x68\x97\xe8\x09\x26\x96\x07\x52\xdb\xa6\xbb\x6d\x56\xe3\xfc\x1b\x2c\x4e\x1e\xa8\x88\x22\x0c\x64\xb1\x7f\x9e\xf5\x19\x79\xa0\x84\x0d\xac\x67\xeb\xf7\x3c\xd0\x60\x70\x4e\xd9\xfc\x72\x14\x84\xa9\xed\x95\x70\xc5\x13\x37\x0a\x48\x12\x7b\x54\xa9\xc8\xe1\x3b\xa6\x91\x66\xcd\x00\x0f\x80\xaa\x54\xf6\x79\xc0\x61\x3c\xc9\x03\x90\x02\x93\x84\x5f\x56\x4f\xc1\x61\xb9\x5d\x21\x05\xdb\x01\xb7\x61\x3f\xc4\x04\xcc\x23\xac\xfa\xd6\xf8\x3b\x70\x17\x5d\xeb\x81\x7c\x71\x3b\x38\xc5\xae\xcb\xb3\x78\x3f\x78\x11\x8f\xf1\xf2\x35\x01\x68\x77\xeb\x87\xa3\xa8\xda\xf5\xe7\x99\x4b\xc6\xf7\x6d\x24\x45\x5e\xdf\xcd\x19\x0a\x2b\xb4\xdc\xed\xad\x3c\x0c\xc0\xca\x0c\xd5\xc7\xf2\xbc\x13\x1e\x0e\xc4\xc3\x30\x54\x1e\x16\xf7\x8c\x0e\x70\x33\xba\x7a\x18\xc6\x71\x2c\xfa\x12\xdf\xb2\x3c\x5d\xb5\xda\xf0\x30\xa4\xa1\x93\x66\x6a\xe4\x8c\x7e\x01\x0f\x43\x9e\xa0\x67\x7b\x80\x9f\xf8\x0d\xb7\xe2\x6d\x0b\x2e\x6a\xfa\xb8\xfc\xd0\xfe\xce\xca\x84\x15\xe8\x91\x6e\x0c\x56\x51\xeb\x7d\xb9\x2a\xac\x2c\x87\x70\x68\xce\xcc\x2b\xcc\xf3\x30\x54\x96\x92\xbb\x4f\xf4\x0d\xf2\xc8\x73\xfb\x2e\x0f\x23\x62\x73\x04\xaa\x44\xcf\xac\xf2\xa7\x8a\x12\x11\x4a\xbb\xb5\x5b\xaa\xd5\xf1\x43\x91\x30\x32\xae\xb2\x87\x98\x8a\x19\xd4\x39\x0f\x49\x1a\x23\x93\xa5\x1a\x74\xc2\xf4\xb2\x14\xe3\xa9\x1e\xc6\x8c\xe3\x6b\xb2\x82\xb8\x5b\x38\xcf\x93\x6e\x8f\x7f\x94\x24\xa0\xc2\x11\xd3\xc6\xe8\x51\x3f\xcb\xb8\xf3\x30\x51\x21\x66\xdc\x6f\xab\xf2\xac\x07\x9b\x43\x98\xa8\x14\x59\x0e\x5f\x2a\x81\x0a\x5f\xae\x29\xfa\x6a\x91\x4e\x69\x9e\xbd\x01\x69\xa7\x04\x06\x9c\x2e\x43\x5d\x2b\x71\x86\x99\xfa\x14\x0f\x29\xb1\x65\x73\x0d\x46\x5c\x72\xac\xd2\x97\x97\xc6\xbd\x4c\x3f\x26\x89\x2c\x58\x10\xc4\x69\x61\x11\xce\x9d\x3f\xc8\x43\xaa\x53\x2b\x01\x77\x11\x08\x12\x03\x6d\x29\x24\x06\x3e\x3c\x0f\xa9\xb1\x38\x0d\xf8\xf1\xf8\x72\x6a\x86\x46\xf3\xc3\x8e\x87\x7e\xf5\xb0\x80\x84\xce\x88\xdb\x82\xd5\xf8\x11\x58\x68\x05\x23\x45\x5d\x23\x34\xf3\x58\xea\x35\x2a\x52\x0e\x78\x34\xed\x8b\x8a\xfd\x2f\x18\x43\xec\xf5\x63\xf6\x73\x6c\x10\xdb\xb7\x66\x15\x88\x91\xc3\xb0\xab\x4d\xf1\x90\x13\x82\x31\xba\xcc\x6c\x51\x60\x7c\x62\x3f\x48\x5b\xda\x95\x36\x1e\xc9\x45\x63\xca\xea\x34\xa7\x9c\xcd\xc3\x94\xd9\x12\xb0\xd3\xae\xbc\xa2\xe0\x76\xc3\x64\x44\x10\x7a\x68\xd3\x5a\x1d\x39\x1d\x0f\x25\x21\x5e\x89\xb5\x2b\x6e\xb8\x5a\xc7\xb4\xc6\xe1\x7f\x91\xd0\x24\xec\x30\x83\xfb\x72\xae\x19\x86\x87\x92\xc5\x51\x2f\x04\x71\x77\xb9\x5a\x75\x2a\x12\x9e\x27\x77\xff\x5a\x6c\x8c\x2d\x34\xa9\xe9\x79\x14\x89\xf0\x6a\x42\x6b\x5f\x2c\x98\x68\x3e\xf1\x50\x31\x1e\xb8\x02\xea\x63\x56\x74\x98\x1d\x27\x34\xd4\x1e\x07\xec\x11\xfd\xb6\x58\x8c\x3e\x91\x92\x31\x6e\x79\xdf\xd6\x6a\xb0\x62\x14\xa4\xdc\xab\x9a\xc2\xcf\xf1\xb7\xd3\x49\xa4\x3b\x02\xd6\xf5\xc9\xf2\xb8\x75\x07\x39\x89\x1d\x4a\x64\xb1\x7f\xbc\x2a\x6d\xf0\x10\x22\xc2\xb4\x45\xff\x9f\xca\xf1\x6c\x01\x42\x10\xe8\xd2\x8b\x07\x17\xaf\x1d\xfb\xf4\xe4\xcd\x99\x20\xc4\xd6\xb2\x75\xbd\x5e\x6e\x5a\x2f\xd4\x9f\xc4\x10\xf0\x62\xf0\x9d\xb0\x85\x3f\x44\x2d\x7e\x6d\x97\xb5\x8e\xed\x4d\xf6\x79\xfb\x14\x0f\x4d\xbb\x19\xe0\x6e\xfc\x6a\x9b\xc7\x91\x7c\x63\xe0\xae\x86\x46\x87\xd8\xf2\x2e\xb4\xb6\xce\xe4\xfc\xbe\x1e\x1a\x60\xe8\x74\x67\xf5\xea\x74\x6e\xfc\xbb\x88\x02\x12\x63\x41\xba\x39\x66\x95\x1e\xf0\xc8\xf1\x28\x30\x5c\x3b\x32\x96\x4d\xd1\x53\x86\x8c\xee\x2f\x0a\x49\x94\xd8\x56\x73\xff\xf4\x51\x48\x95\xb0\x7c\x9a\xfa\x09\xde\x6e\x2a\x51\xa8\xe3\xba\x58\x9d\xb3\xba\xd4\xf3\x91\x02\x8f\xc2\x34\xc2\x1a\xd8\x42\xeb\x85\xc5\x50\x34\xef\xe3\xfb\x8f\x22\x21\x05\xf4\x92\x19\xa7\xcb\xa9\xb5\x7e\xcb\xb2\x9e\xde\x12\x89\xad\x47\x61\x35\x8d\xbd\x6c\xe6\x2d\xf4\xd4\xa1\xe3\xf1\x71\x10\x63\xfa\xa4\xa3\xa7\xfa\x0e\xd9\x5d\x59\xd9\x77\x31\x1a\x99\x04\x29\xb5\x72\x71\xb0\x5e\x6e\x3a\x9f\xd2\x1f\x4d\x63\x2d\x3d\x64\xd6\x19\xab\x3b\xac\xe5\xf7\x23\x38\x42\x40\x6c\xff\xf6\xc6\x6c\x2f\xf9\x8c\x4c\xe7\xf8\xb1\x13\xc5\xb1\x2b\xeb\xe0\xfe\x3c\xb9\x79\xca\x18\x96\x50\xf6\x97\xe2\xb6\x7a\x14\x47\xd1\x7e\xc7\xc7\xf2\x28\x4e\x27\x5f\x48\xe6\x11\x05\x89\xec\x64\xd5\x00\x9a\xc3\x23\x26\x53\x5f\x99\x78\xb4\xad\x45\x5f\x06\xb9\x76\x1e\x61\x1a\xd7\xc6\x41\x5d\xf3\x32\x8f\x78\x60\x49\x3b\xd7\xcb\xcd\xb8\xea\xcd\xa3\xd6\xac\x73\x2b\xb3\xd3\x54\xd9\x74\x02\x46\x9c\x18\x8c\x0b\x30\x06\xba\xe9\xd2\xec\x3c\xe2\x3a\x89\x6d\xfb\xe8\xff\x82\x9a\x55\xaa\x73\x03\x53\x1a\x30\xd7\x60\xb3\x2b\xca\x37\x93\x8b\xd7\xa9\xa2\xc4\xe4\xed\x89\x04\x5c\x67\x6a\x73\xa9\xe6\x29\xff\x78\x24\xd2\x00\x27\xfa\xae\x29\x2b\xeb\xe3\xfd\x6b\x3a\xc0\xda\xa7\x1a\x1a\x9f\x8f\xf5\xdd\x42\x57\xbb\x77\xb7\xc7\x45\x42\x32\x5c\x1a\x0f\xe5\xcb\xba\x81\xd3\xd6\x91\xf0\x7f\xb6\x41\xce\x37\x84\xb8\xf3\x49\xca\x30\x3d\x7f\x38\x1c\x7e\xcf\x7c\x81\x8a\x47\x92\x85\x41\xd0\x85\x4f\xdb\xb2\x3c\x4d\x1e\x4f\x0a\x81\xb0\x8d\xfb\xc5\x7e\x79\x7f\x58\x6e\x36\x0f\xb7\x9b\xef\x4f\xdd\xcf\x95\x95\x76\xb7\x05\xa4\xd6\x8c\x3e\x63\xff\x0b\x36\xc7\x0d\x9e\x46\x82\x48\x1c\x42\xbd\x5d\x77\xfb\xce\x0e\x5d\x2f\x66\x1d\x86\xe8\x82\x1b\x91\xe5\x8e\x48\xc1\x5f\x4d\x13\x89\xf2\x52\x67\x6d\x06\x5a\x68\xcf\x55\x59\x9a\xd1\xdc\x84\xd0\x8e\xcb\xea\xdd\x7e\xe3\x53\x1d\xfe\x24\x40\x03\xcc\x3e\x9d\x47\x61\x51\x04\x3a\x05\xf4\xeb\x45\xf1\x28\x7e\x0e\x61\x90\x3c\x32\x4e\x23\x0e\x51\x81\x8f\xc3\x74\xcc\x04\x40\x3d\x85\x57\x8f\x9e\x8c\x04\x91\x6d\x0a\x3b\x8b\x77\x2b\xfe\xf3\xdb\xe4\x38\x05\x5c\xac\x9d\x7a\xe0\x78\x09\x90\x40\xd9\x86\xe5\x17\x68\xfe\xab\x94\xd7\x44\xed\x9c\x84\x2a\xb4\x14\x0d\xa8\xbb\x23\xde\x41\x6f\x3c\x53\x31\x27\x21\x44\xcc\x49\x6e\x36\xf3\x0e\xf8\xe4\x7e\x89\xab\xa7\xb4\x71\xe4\xb3\xab\x00\x3b\x21\x27\x4e\x08\xb3\x3c\x3d\xf8\xf6\x77\xc7\x2a\x3b\x9d\xef\x44\x75\x9a\x7a\x36\x84\xe8\x24\xf6\x1e\x37\xea\xce\x0d\xe3\x19\x42\x0c\xb5\x0c\xc5\x55\xf6\xf2\xd2\x4e\x9e\x0e\x00\xc2\x49\x1c\x49\x74\xca\x4a\xcb\x63\x6a\xca\x89\x7e\x1c\x27\x71\xfb\x4c\xc8\xb1\x9d\x9b\xd6\x42\x63\x67\x4d\xef\x89\x92\x98\x59\xb0\xd3\x7a\xb9\x39\x3c\xae\x9f\x0e\xb7\xab\xe7\xcd\xae\x8b\x0c\x49\xcc\x35\x66\xa9\x0e\x05\xbc\x7d\x99\xaa\xca\x71\x92\x68\x83\xbc\x6c\xbb\xbb\xfd\xe1\x79\xb5\x3d\xac\xf6\xf7\x87\x9b\xc5\x6e\x35\x00\x07\x71\x92\x18\x82\xd5\x3f\x79\xc9\x72\x3d\x9c\x84\x84\x26\x80\x6d\xb2\x4f\xf0\xe6\x84\xda\x26\x6f\x86\x32\x8b\x2b\xd2\x59\xad\xca\xa2\x00\x65\xfb\xda\x67\xb5\x3e\x67\xad\x3b\x61\x69\xea\x14\x0e\x9b\x47\x4b\x9c\xe1\x99\xc9\xee\x2a\x71\xdd\x37\xc8\x09\x33\x06\xe9\x8e\x0a\x78\x9b\xdf\xe7\x09\x0f\x39\x32\xff\xa0\xb7\xf0\x51\xa8\xf3\x11\x08\x61\x6c\x72\x08\x0f\xa5\xaf\x68\xde\x67\x2f\x47\xa8\x9b\xaf\x45\x66\x3d\xb1\xb5\xfe\x89\x2c\x02\x5d\xa9\x9c\x13\xce\x25\x6e\x6f\x52\x14\xae\x83\xfc\x2a\x39\x44\x38\x30\x65\x31\x3e\x59\xf1\xf7\x10\x9e\xcf\x49\x4a\x44\xac\xbc\xee\x6b\x71\xa9\x6f\xde\xaf\x50\xdf\x9c\x08\x57\x61\xdf\x82\x2a\x7f\x40\xd5\x53\x91\x71\x22\x34\xf3\xfb\x3e\x4a\x19\x8f\x7f\x28\xe3\x10\xd3\xbc\x59\x61\x72\xdc\x04\x0e\xca\xe5\x16\xfd\xef\x95\x86\x38\xed\x15\x06\xe7\x75\x6f\x39\x51\xa0\x10\x95\xe5\xfe\x7a\x77\xe9\x55\xaa\xdc\x08\x1d\x0b\xcc\xbc\x9d\xb2\xa2\xd7\x9c\x5a\x96\x65\x9e\x15\x2f\xa3\xd8\x9a\x68\x9a\x5a\xc5\xc2\x23\xa8\x57\xab\x7a\x81\xd5\xb9\x8f\x08\x57\xfc\xcf\x20\x40\x1a\x78\xdb\x44\x67\xe9\xb3\xf1\x4d\xf4\xf6\x9a\x40\x60\x1b\x15\xc1\xa1\x0c\xd7\xc5\xd7\xba\xbb\x2e\x44\x69\xe4\x72\x4c\xcf\xbb\xbc\xf4\xc1\xe1\xf8\x2a\x40\x62\xf4\xf8\x97\x59\xd9\x06\xb2\xd8\x0f\x36\x0b\xee\x9c\xe9\xc4\xe5\x04\x58\x20\x7b\x0e\xa2\xef\xc7\x5e\xe1\x60\x36\x70\x26\x86\x79\xb0\xd8\xa9\xfc\x01\xcf\x3d\x1b\xf6\xf8\x3b\xc6\xad\x09\x0e\x3e\x6d\x10\x8a\xe7\x7b\x83\xfe\x35\x39\x4f\xac\x74\xea\x23\xd0\xfc\x02\xbb\xf2\xf4\xc1\x7e\x16\x07\x2c\x0a\x6d\xcc\x26\x2a\x75\xb4\xac\xd1\x23\x23\x18\x07\x8a\x62\x40\xd1\xba\xdf\x0e\x1d\xb9\xfa\xeb\x92\x35\xef\xae\x55\xe0\x37\x3f\xce\x70\xe0\x9d\x3b\xb2\x6a\xae\x70\xc5\x6e\x5c\x18\x05\x09\xef\x14\xc7\x5e\x03\xfa\x5b\x7f\x80\x92\x71\x32\xe6\xe3\x7d\xa0\x17\xf0\x1b\xab\xc5\xf3\x38\x34\x16\x1c\xe2\xda\x6e\x6d\xb6\x65\x00\x00\x6a\x47\x68\xff\x39\x90\xe3\x7b\xf2\x15\x22\x6e\x33\x39\xb5\xc8\xc1\x92\x1e\xfb\x1f\x12\x26\xf1\xd6\x65\x1b\xc7\x3a\x5b\x36\x09\x39\x63\x22\xc0\xa4\x03\x32\x96\xf6\xd2\x5b\x78\xf3\xc2\x83\xfd\x65\xe2\x44\x61\x81\xde\x72\x54\x3e\x95\x1a\x6e\xc0\xb4\x4e\xda\xa7\x3e\x73\x1c\x33\xab\x54\x64\xa0\x51\xc7\x01\x3d\x7a\x7b\x44\xa5\xb6\x91\x18\x9b\xb9\xaa\xee\xef\x42\xe2\xc6\xdd\xf8\xf8\xa9\xcc\x5d\x35\x5c\x9c\xa0\xf5\xde\xd6\xdd\x9b\x49\xb8\xc1\xba\x9e\xcd\x86\x3b\x2c\xff\x4c\x36\x7c\x72\x4f\x49\x9a\x04\x0e\xa9\xbc\xc3\x40\x64\x81\xe6\xbd\x5e\xf6\x4c\x1b\x6e\x24\x0d\x39\x66\xb8\x8c\xa8\x4e\xed\xa5\xeb\x8f\x53\xf3\x31\x8d\x43\x69\xf9\x10\xb1\x2b\x3b\xb3\xdc\x76\xd5\xb5\xac\xdf\x64\x82\xd1\xd8\x36\x1a\x28\xc7\x2d\x59\xfe\xf4\x01\x61\x4c\x0d\xa0\xdb\x7f\xa8\x21\xcf\xd1\xd5\x2b\x6d\xf2\xf3\x1f\x8a\xd1\x93\xe7\xe5\x4e\xbc\xdf\xa5\xc4\x9f\xb1\xba\x86\x13\xad\x1e\x02\xb4\x7f\xa9\xc4\xcd\xe3\x54\xc9\x74\x58\x28\xb7\xb5\xfc\xc9\xb4\x92\x84\x62\xf3\x2a\xfc\x80\x2a\xab\x2f\x43\x0c\x29\x8f\x65\x9c\x1a\xb7\xf1\x38\x39\xf2\xe8\x43\x3f\x7c\xd6\xea\xc6\x52\xa7\x7d\x63\xd2\x49\x64\xc5\x8c\xff\x16\x6b\x4a\xa4\xf1\xdc\x9d\x17\x9d\x35\x96\x96\xc9\xb7\x59\xf1\x58\xa7\x02\x4b\xd0\x7f\x5d\xd0\xd9\xb6\xa5\x75\x7f\x10\x22\x9b\xb9\x58\x64\xf5\x71\x40\x41\xca\x63\x50\x3a\x71\x06\xbb\x7d\x7b\x87\xb4\x3b\xa0\x01\x31\xeb\xe7\xb2\xf8\x3b\x73\x86\xbe\x03\x80\xf0\x18\x8c\xc2\x06\xe8\x7d\x25\x7e\x40\xfe\x84\x1b\xdf\x2f\x01\xb0\x78\x6c\xc2\x14\xc1\xbf\xdf\xcb\x2a\xd7\xcb\xcb\xf9\x4e\xa8\xa6\xac\x26\x29\x9f\xd8\x88\x18\x4b\x76\x8b\xf3\x79\xa1\x87\xe2\xf6\xf3\xf8\x88\xa1\x11\x32\xd2\xb6\x81\xd6\x59\xf1\x60\x85\x3d\x5d\xb4\x8d\x3e\xb8\x03\x6d\xf2\x24\x20\x4a\xbb\x85\xe3\x00\x2c\xb9\xdf\x9b\x6f\xde\x3f\x8d\xfe\x92\x20\x0e\x13\x2b\x62\xf9\xf2\xd2\x83\x7b\x06\x74\x4e\x3c\x09\x98\xed\xa4\x30\xe2\xa2\xa0\xb9\xb9\x71\x7d\xf3\x3c\x09\x8c\xc0\x1c\x4e\x59\x94\x1e\x9d\xc0\x13\x42\x28\x2e\x4d\xdf\x08\xdc\xa1\xf2\xea\x65\xe7\xa5\x27\x84\x88\x50\x7b\x3e\xe1\xaf\x6d\x44\xad\xca\x3c\x17\x0d\x54\xd9\xdf\xa0\x3b\x9c\xaa\x1f\x4d\x09\x02\x71\x2b\x0b\xef\xda\x14\x60\xb9\x5e\xfc\xe1\x34\x0a\xa0\xd7\x7c\x1d\x36\xf9\x8d\x5c\xb5\x84\x80\x25\xb8\x47\x7d\x89\xdf\x8b\xf2\x6d\x8c\x07\xe5\x49\xcc\x13\xc4\xa4\x43\x73\x3c\xd4\x9d\x3e\x0a\x4f\x62\x6d\xd0\x58\xd6\x4a\x14\x05\xe8\xdb\x4c\x9c\xca\x42\xf7\x70\x1d\x9e\xc4\x86\x22\x83\xa1\xbc\xbc\x23\xcd\xfa\xa6\xb8\x81\xa3\xc8\x27\x8e\x51\x92\x68\x40\x18\xe5\xf7\xfb\xf5\x7e\xf5\xb0\xde\xed\x0f\xab\xa7\xdb\xc3\x6d\xef\x6a\x27\x2c\x48\x7c\x0a\xc7\xf3\x37\x77\x87\x48\x18\x30\x2f\x63\xf2\x98\x15\xcd\xc7\x46\x2f\x61\x42\xc6\xb6\x1b\xff\xaf\xee\xe7\x4a\x06\x36\x4d\x56\x5c\x44\x7e\x05\xe3\x1a\xcd\xd9\x84\x87\x9d\x9e\xf6\x7f\x95\xb2\x7b\x4c\xee\x64\xd0\xef\x96\xe1\xd0\x72\x24\x9c\x42\xe2\xd0\xe7\x3e\x86\xe2\x53\xaa\xa7\xde\xc3\x18\xf3\xa4\x76\xb3\x38\x8d\x18\xfa\x84\xe8\xe9\x59\x52\x1d\xcc\x28\x0e\xb3\xfd\x1e\xaf\xec\x7f\xa2\x03\x6e\x7c\xc6\xd5\x6e\xb2\x56\xd4\x73\xfc\xda\x53\xad\xc2\xa0\xcb\x9e\x78\x2a\xe1\xf9\x27\x17\x8c\x20\x5c\x0c\x53\x30\xf7\xa5\xce\xed\xae\x8b\xc8\xa4\x89\xa7\x9e\x08\x6d\xb0\x15\x68\xf1\x70\xbb\xfa\xb5\x9e\x1e\x9e\x08\x88\x30\x32\xcf\x9a\x72\x55\xe8\x1e\x63\xc6\x13\x19\x69\x3e\xd4\x44\xec\x2b\x20\x93\x18\x39\x91\xb1\xad\x73\x78\xd1\x02\x44\x29\x8d\xc8\x1c\x79\xa2\x22\x12\x0b\xff\x36\x5d\xc2\xf0\xef\xb1\xa4\xe1\xf8\xa4\x8a\x06\x36\x5f\xec\x2e\xdf\x3a\xb3\xe4\xb3\x4a\x59\xa2\x44\x98\xc6\x83\xa5\xde\xa5\xf4\x26\xb7\xab\xc3\x90\x58\xd6\x25\xf5\xae\x5a\x0f\xdf\xee\x0d\xa3\x19\x04\x91\x4d\xfa\x76\xb4\x8c\x93\x73\x00\xb3\xed\x22\x76\x33\x40\x2b\xee\x19\xc4\x3f\xaa\x3a\x7d\x14\x5e\x8e\xbf\xb7\x31\x7a\xc0\x9b\x02\xd5\x93\x38\xc1\x1f\x03\x9d\xe5\x3e\xd3\xd4\x59\x44\x1a\x68\x85\x4a\x17\x59\xbd\x05\xd3\x59\xdc\xdf\xfc\x51\x63\xe5\x00\xee\x00\x26\xa9\x48\x1a\x32\x2b\xe5\xff\xef\x7f\xff\xbb\x87\x5b\xf8\x63\x9a\x20\x6e\x07\x59\xe4\x31\xb3\x8a\xc9\xa6\x7a\xe1\xcd\x10\x8d\x42\xab\x92\xe3\x4b\x3e\xa2\x3b\x10\x4b\x44\xf1\x5a\xb6\x31\x47\xfa\x3e\x7e\x81\x94\xa4\xc2\xcb\x5d\xe1\x42\x99\x79\xc9\x94\x68\xa2\x58\x2f\xe6\xbf\xde\x2e\xe7\x17\x09\x8d\x53\xc5\xbd\x7e\x4a\x06\x55\xdd\x31\xe2\x4c\x49\xcb\xe6\xfe\x8b\xff\x37\xf9\x9f\xff\x8e\xdd\x1a\xa2\x49\x0c\x98\x78\xc5\x0a\xce\x07\x01\x25\xa5\x81\x1c\xf4\x15\xa0\x36\xa7\xf5\xea\xa7\x9b\xdb\xf8\x36\x69\x1c\x5b\xd5\x61\x2c\x6d\xdc\x2e\xd6\xcb\x8d\x7f\x65\x34\xb1\xf5\x0d\xa4\xdf\xaa\xf4\x4c\x39\x87\xd2\x84\x22\x9c\x08\x8f\xe9\xe9\x41\x2d\xd0\xdb\x38\xb4\xef\x7c\x53\x59\xe6\xfc\xa1\x4a\xc3\x7c\x88\xf5\xd1\xbf\xae\x52\x41\x59\x1a\x60\xe7\xa6\x6d\x70\xdb\x65\x2f\x85\x68\x2e\x15\x60\x47\x4c\xb7\xe3\x51\x06\x1a\x64\x27\xa5\x81\x09\x15\xbc\x49\xbf\xf8\x69\x1a\x58\x1e\xca\x27\x00\xbd\x05\x53\x41\x3d\xa9\x11\xd3\x34\x8d\xb0\xa5\xa4\x34\x26\xcf\x0a\x58\x60\x13\xc3\x7c\x70\x47\x53\x69\x37\xd8\x5a\x38\x64\xc2\xf4\x5c\x46\xe2\x6b\x3e\x89\x9f\xdf\x21\x6b\x27\x84\x77\x11\xa8\x8c\x78\x18\x0d\x34\x87\xf2\xac\xc6\x7a\xcf\x55\xd6\x83\x4a\xce\xd5\x48\x01\xc3\xf6\xf1\x20\x9b\xfa\xfb\x19\xc2\x0f\xee\x4d\x09\x83\xbe\x62\x2e\x6a\xdb\xef\x7c\x10\xa1\xbf\xb8\x8e\x74\x32\x06\x89\x63\xd2\xe4\x79\x5a\xa1\xa1\x3a\x01\xcc\x0f\x5f\x0a\x9f\x81\x5e\x8a\xd3\x59\x64\x2f\xd3\x27\xd5\xc2\x16\xcb\x2d\x13\xf1\x16\x54\x59\x7d\xc8\x7f\x3b\x34\x18\x10\x45\xdc\xe9\xfa\x95\xf5\xa9\xac\x7b\x25\x25\x4e\x81\x0b\x6c\xf3\xfe\x82\x35\x06\xdf\x66\xc0\xa9\x89\x1c\x01\xb3\xc8\x8a\xdf\x45\x75\x12\xa3\x42\x0b\x35\x91\x4a\xad\x12\x46\x9e\x83\x6a\x16\x79\x8e\xf6\xc6\x1f\x8d\x13\x6a\x29\xae\x34\xc0\x09\x74\x3b\xc7\xfb\x83\x82\x18\x97\x05\x6a\x5f\xef\xfa\xca\x23\x1d\xec\x5e\x1d\x8d\xac\xfd\x2d\x0b\x02\x8e\xe4\x23\xdb\x87\xe7\x2d\x36\x2b\xee\x3b\x56\x7e\xce\x02\x45\x91\x17\xd9\x45\x7c\x5b\xd1\xc0\xf2\x38\x07\x7e\x1b\x7f\x44\x16\x80\xe1\x74\x8c\xe6\xc7\xee\xbd\xae\xa4\xc2\xc2\x44\x20\x4e\xed\xcb\x72\x79\x3f\xdc\x37\x58\xc8\x43\x4f\x78\xdd\xce\xab\x65\xfb\x36\x5e\x60\xa5\x2f\xb6\x5c\x7f\x0b\x8d\xc8\xf2\x71\x3e\x96\x85\x3a\x42\x41\x22\xa1\xf5\x23\x34\x50\x61\x8b\xfc\x6f\xb3\x49\x6e\xf7\x8b\x08\x88\x95\x41\xdd\x3c\x3f\xaf\xb6\x87\xc5\xe3\xe6\xeb\xd3\xfe\xb0\xfb\xfd\xc1\xdf\x46\x1c\x69\x0c\x16\x3b\x69\xb0\xcb\x55\x66\x9b\x25\x81\x15\x66\xab\xa1\xd0\x2e\xe9\x31\xc2\xf9\xb0\x44\x52\x90\x5d\x1d\x7a\xeb\x4a\x44\x3d\x4f\x7b\x3b\x82\x21\xd5\xd4\xff\x43\xd9\x97\x6c\x37\x8e\x23\x6b\xbf\x4e\x2d\x7a\xc1\x99\xc0\x52\x92\xe5\x4c\xff\x69\xd9\x6a\x4b\xce\xac\xea\x7b\xee\xd1\x09\x00\x01\x9b\x6d\x89\x54\x93\x94\x6d\xf5\xd3\xff\x87\x01\x80\x93\x28\x67\xdd\x4d\x65\xb7\x09\x52\x1c\x30\x04\x22\xbe\xe1\x64\xfb\x9f\x61\xc3\x0d\x5f\x66\x2c\x43\xe3\x06\x5d\x49\x68\xc6\xd1\x4d\x56\x1d\x29\x09\xb2\x42\x95\x5d\x10\x00\x59\x9a\xfa\x3e\xad\x49\x55\x10\xf7\xf5\x07\x58\x9a\x2a\x53\xa4\xa4\x9b\xf4\x77\x7f\x4b\xe8\x94\x91\xd0\x9f\x81\x06\xca\x42\xa1\x1a\xd4\x18\x52\x06\x92\x66\x5d\x38\x1e\xf7\x99\x6c\x16\xcd\x4e\x17\x8b\xa5\x3c\x12\x2c\xed\x29\x28\x0c\xbf\x1a\x67\x3e\xd8\xd1\xfc\xd3\x00\x3c\x8b\x9e\xf1\x57\x12\x0d\xc3\x99\x14\xa2\x44\x46\x5d\xaa\xf2\x9f\x27\xd8\x9b\x52\x4a\x56\xe4\x73\x2b\x16\x39\xbc\x73\x88\x0c\x66\x91\x66\xd5\x32\xa7\x41\xb3\xe8\xdf\xbd\xd0\x21\x11\x71\x77\xa7\x0a\x09\x4c\x3a\xb9\xcd\x48\x65\xe8\xa7\xd2\x6d\x33\x9a\xef\xfb\x5c\x11\xa6\xf8\x09\xb3\x8e\x0c\x34\xfc\x69\x29\x03\xad\x3a\x30\xb9\x39\x6d\x1c\x58\xa4\x52\xa1\x41\xa4\x90\xbf\x51\xcf\x7b\x89\xa5\x2a\x32\xea\xe7\xcb\x77\x2c\x1f\x3f\x72\xe7\x58\x3a\xea\x81\x2a\x06\xb0\x31\xc0\xfc\x74\x76\xc1\x5a\x37\x4f\xa5\x4a\x30\x9a\x36\x9a\x5d\x09\x69\xf2\xdf\xad\x96\x9b\xed\x6c\xb5\x76\xbf\x83\x89\x20\x61\xe5\x15\xbc\x63\xde\xdb\x7d\xa7\x98\xe8\x28\x1a\xca\x4b\x75\xc1\x68\xaa\x59\x14\x18\x30\xfb\xfb\x62\xb6\xbd\xc1\xaa\xce\xf2\x3e\x9c\x86\x79\x41\xea\x07\x2d\x09\x5a\xb5\x15\x76\xe6\xc5\xa9\x96\xbd\xf0\xcc\x40\x38\x6f\x8b\xf2\x16\x89\xc4\x39\x66\xda\x32\xe6\x31\xa3\xe0\x2d\xa0\x59\x32\xaf\x84\x06\xcc\xd3\x3a\x16\x2d\x67\xd4\x0e\xc7\xbe\xae\x30\x63\x7e\xc8\xa8\xc9\x11\xce\xca\x29\x72\x32\xe6\xeb\x44\x9b\xa4\x8d\xd3\xa0\xed\x84\x3e\x6c\x93\x20\x88\x29\x0b\x52\xe4\x78\x28\xf2\x16\x51\xc4\x82\x38\xa5\xad\xc5\xe6\x00\x65\x0b\x41\xf8\x55\x94\x6f\xd5\x6b\x71\x1c\x74\x76\x16\x24\xa1\x89\xe8\xa0\x7c\xc1\xaa\x5e\x63\x3e\x90\x96\x63\x2c\x50\x06\x02\x4e\xba\xf4\xcd\x1d\x38\x50\x2b\x0b\x03\x45\x28\x99\xdd\x6e\x77\x2c\x8b\xcf\xb3\x31\xb8\x6b\x8f\x46\xa9\xc1\x86\x41\x3e\x47\x57\x48\x51\xf3\xf3\x72\xf5\xf8\xb0\xfd\xa3\xbf\x1f\x63\xb1\xef\x13\x81\xab\x36\xe8\x28\x5a\x5d\xdd\x65\xe2\xc0\x26\xd5\x8a\x2c\xaf\x8c\x11\x13\x81\x48\xda\xe3\x32\xa6\x32\x9c\x51\x0a\x39\xb7\xf4\x26\x2b\xf1\x6c\xfe\x71\x6d\x51\xd1\xca\xaf\xb0\xca\x4a\x9c\x0a\xc5\x58\xac\x13\x72\x3f\x20\xdf\xde\xfe\xfc\xcf\x12\xa1\x09\x35\x7c\x28\xaa\x7a\xd3\x6d\xd9\x59\x22\x91\x64\x50\x6e\x8b\xf2\x8d\xfa\x62\xab\xe2\xca\x58\x1a\x86\x06\xf4\x3c\x7f\xfa\x22\x59\xdf\x36\x36\x34\xcf\x66\x6d\x2a\x72\x32\xeb\x43\xb0\x3c\xdf\x53\xc7\xb8\x60\x2c\xe5\x48\x43\xc3\x96\x5d\xce\x9b\x57\xb8\xdc\x3e\x5d\x4b\xa7\x0d\xd3\xf0\x93\xc5\x6d\xc6\x02\x13\x66\x89\xd3\x79\x51\x82\x18\xbd\x22\xc6\xcc\x12\x65\x96\x86\x59\xfe\x82\xa4\xc4\xbe\x41\x02\xf2\xf7\x62\x4c\xc6\xb8\x12\x16\x82\x44\xd8\x8b\xae\xe4\xd2\xaf\xd0\x8f\xc6\x0b\x8f\xc0\x4f\xda\xb5\x69\x05\x9f\x03\x0c\xc2\xa8\x6d\xcc\x53\x9b\x89\x7b\x36\x07\xdc\x9b\xe7\xd2\x2c\xf4\x99\x2c\x1e\xdf\xb1\x8c\xdb\xbf\xab\x24\xea\x43\x8a\x28\x10\xda\x16\x83\x1e\x0f\xb1\xa9\x24\xce\xb6\x9f\x46\x5a\xda\xfd\x3d\xf5\x68\xe6\x31\xda\xf4\x4f\xc5\x69\x8f\x75\xbb\xa6\x30\x10\x82\x62\x9d\xc3\xb9\xe3\xde\x74\x13\x1e\x03\x1d\xd2\x70\xf8\xe7\xd3\xfd\x6e\xd0\xaf\x44\xe4\x7b\x8e\x7d\x4a\x07\x46\xe6\x13\xc3\x27\x16\xb1\x0c\x0c\x6a\x73\x45\xa5\x80\x5f\x50\x8e\x90\x1f\x4c\x40\x42\xe5\xf5\x0f\x9a\x63\x48\x22\xd5\x1d\xd1\x1e\x6d\x8f\xdb\xc8\xf7\x79\x73\x23\x4d\xe6\x67\xf8\x2b\x52\x09\x4a\x64\x52\xad\xb8\xb7\x70\x32\xa9\x8d\xa0\x69\xb3\xb7\x3b\x43\x5e\xdf\x94\x45\x56\x2f\x65\x91\x17\x87\xec\x3f\x27\xdc\x2d\x8a\xc3\xb1\xc6\x5d\x34\xba\x9e\x0a\xb9\xe1\xed\x56\x56\xbd\xee\x09\x41\xb6\x6e\x0f\x8c\xa9\x38\x12\x36\x4e\xbc\xbf\xff\x69\x48\xe9\x61\x3b\xcf\x28\x69\x3c\x81\x89\x86\x54\x14\xba\x89\xd2\x07\x01\x04\x53\xa8\x29\x61\xb5\x5a\x3d\x0e\xde\x2d\x26\x5c\xb5\xcf\xb1\x2e\x3e\xb0\x7c\x3e\x8e\x5f\x97\x8e\x0d\x02\xfb\xa5\x04\x89\xa6\x7b\x92\x9b\x33\xa5\xc7\xfd\xe1\x9c\xa6\x41\x91\x7d\x8a\xe9\xfa\xce\x71\xc0\xf8\x0f\x3c\x3f\xdd\x4f\x2f\xd3\xdc\xb3\x68\x44\x32\x66\xa3\x14\x8f\xbb\x87\x81\x9a\xcd\xf0\x24\x3f\x96\x7e\x64\xf9\x0b\x1d\xf9\xde\x1d\x4c\xe2\xc4\x28\xc8\x9c\x7f\x65\xf5\xab\xc3\xc1\xdc\x5d\x47\xb3\x9c\x7a\x66\x6f\xc3\x2d\x03\x0f\x52\xa9\xcc\xc7\xa1\x68\x67\xfe\x30\xbf\x14\xb6\x67\x3c\x8c\x8c\x0e\xbc\x75\xed\x69\xe2\x96\x49\x2a\x29\xe3\xa1\x94\xf4\xb1\xeb\x82\xfc\x62\x86\x8f\x15\xa2\xc1\xb1\xed\x2a\xac\x29\xd1\x7c\x01\xb9\x72\x0d\xb5\x51\xae\x73\xac\xa6\xca\x2a\x38\xdb\xc3\x11\x37\x26\xd4\x3d\x49\xa4\x31\x34\x9f\xc7\xb1\x26\xde\x46\x26\x8b\x75\x67\x6c\xc6\x78\x0c\x8a\x96\x9b\x5d\x13\x96\x17\xea\x34\x4e\xe3\x4e\xef\x1d\x78\x12\x2a\x72\x32\xbf\x5b\x3c\xae\x9a\x25\xd9\xb0\x0f\x5c\x4f\x1e\xb5\x65\x66\x57\xb4\x81\x77\xfc\xab\x38\xcd\x72\xb5\x1a\xd4\xd7\x79\x02\x21\xb1\xa1\x66\x37\x3f\xef\x36\x8f\x4f\xbb\xcd\x76\xf6\x63\xb9\x7b\x7c\x58\xb6\x0d\x84\xf1\x4d\x6e\xa6\xbf\x77\x2c\xeb\x75\x99\x15\x65\x56\x67\xff\xed\x92\x5e\x97\xb2\xc3\x17\xa0\xa5\xff\xc3\xac\xcf\x13\xd4\x26\x2b\xda\xab\x43\xf6\x94\xf4\x18\x4f\x34\x08\xdd\x4a\x0f\x93\xd6\xb4\xc5\xc3\xdb\x06\xa9\x07\x22\xea\xb2\x3a\x57\x61\x17\x03\x79\xef\xfe\x1a\xc8\x53\x66\x8c\x8f\xc9\x14\xa5\xc8\x8d\x70\xfa\xf2\x3f\x73\x73\xa3\x2b\xac\xaa\x0e\x13\xc9\x53\xf0\x81\x30\x91\x4d\x58\x44\x02\x9b\xcd\x92\xbd\x2e\x5b\xf6\x36\xe3\xa9\x34\x5a\x38\xeb\x12\x8f\x50\xe2\xd6\x68\xe0\xfe\x86\x81\x3d\x5d\x72\xe2\x29\xf2\x34\x1a\xfa\x52\xef\xc9\xd8\xb8\xc7\x74\xb4\x4d\x59\x90\x12\x62\xea\x50\x28\x57\x02\xec\x55\x53\xda\x5e\xc2\xd2\x90\xa6\x7e\xcc\x8e\x81\xf7\xf7\x76\x3d\x9c\x69\x3f\x32\x25\x5d\x5d\x98\x18\xfe\x8f\xf6\x08\xa3\xa5\xe1\xb8\x87\x51\x61\x88\x73\xae\x52\x82\x87\x7f\x1e\x8b\xb2\xde\x42\x3e\x64\xb5\xb6\x5d\x80\x2b\x46\x70\x8a\xd2\x44\x16\xb3\x16\x4e\xc2\xb9\x02\x82\x8a\x68\xf2\xe9\xf9\x59\x34\xef\x9b\x96\x96\xe1\x0f\x41\x94\x10\xea\xb0\xd9\xab\x07\x2e\x37\xc3\x21\x36\x35\x7b\xb3\xa4\xbb\xc9\xcf\xec\xbc\x7a\x13\x91\x08\x14\x65\x8a\x66\xc4\x44\xab\x96\xfb\xf3\xe7\xa8\xaa\xc8\x45\x88\xc4\xd1\x5d\x15\x45\x5e\x92\xa8\xec\xf4\xb7\x12\xa9\xc1\x11\x35\xbb\xe3\xc1\x02\xf7\x75\x69\x93\x2b\xf0\x8c\x3d\x59\x8b\xd7\xe4\x4a\x0a\x2f\x30\x76\x63\x13\x8c\xd6\xe1\xe9\xc8\x52\x62\x2b\x7c\xbb\x7b\xba\x9f\x3f\xdf\xde\x2e\x9f\x36\x77\xff\x6a\x87\x34\x6a\x4d\x4c\x8c\x79\x51\xbc\x35\xaf\x2f\x3b\xe0\x73\x9d\x8d\x64\xdc\x18\xd7\x41\x44\x50\x45\x32\x21\x87\xfd\xae\xec\xd1\xfe\x19\xd7\xa1\xa6\x79\xe1\x94\x5b\xf3\xd2\xf5\xbe\x18\xc0\xb1\xb9\xd6\xc6\xb7\xdb\x5e\xb5\xe9\x22\xd5\x00\x72\x0d\x3e\x7a\x14\x8b\x58\xcf\x29\x79\xde\x16\x66\x72\xea\x69\xba\xda\xa6\x01\x4b\x95\x73\xb2\x43\x38\x4c\xf0\x03\x20\xe0\x40\x02\x30\x96\x1c\x63\x94\xb4\xde\x2f\xd6\x05\x88\x83\xd8\x51\x94\xef\xc1\xba\x8e\xb4\x95\x7c\x88\x03\xe6\x00\xf4\x66\xbe\x9f\x46\x54\x41\xcc\x13\xca\x1c\x1b\xff\xf5\xa2\x65\xbc\x4e\x8e\x16\x88\xb9\x51\x19\x6d\x42\x07\xb2\x43\xec\x0b\xa5\x5f\xc8\x3c\x33\x48\x52\x8f\x22\x5f\xa7\x51\xd4\xbc\x3c\x97\xe5\x83\x44\x04\xce\x5e\xfa\x17\x66\x4f\x90\x55\xcd\xd2\x6c\x8b\x22\xc3\x81\x00\x09\x9a\x12\x93\x41\x27\xbb\x2b\xa4\x81\xa6\x4c\x9b\x2c\x8b\x0f\x35\x08\x2d\x20\x55\x29\xda\x44\xf7\xec\xa5\xcc\x16\xaf\x90\xe5\x54\x9b\x1f\x3e\x7e\x8a\x7e\xeb\xb2\x42\xcb\xaf\x2a\x6e\x70\x59\xc9\x13\xee\x61\xf4\x2c\x29\x6a\x6d\xd3\x18\x8f\xa5\x99\x92\x6d\xce\xab\xa5\x6b\xb5\x3f\xae\x13\xda\x47\x1a\xda\xed\x2d\x54\xf5\xed\x3e\x1b\x8b\x24\xb8\xed\x1a\xb0\x24\xa6\xfa\xff\x06\xad\xb2\x63\x35\x32\x73\xee\x5e\x03\x93\x31\x25\x9a\x7e\x9d\xdf\xb1\xcc\x6f\x66\x8f\x7d\x74\x03\xf0\x98\x51\x9e\xea\x08\xe7\xb2\xd8\xef\x37\x3d\xb1\x73\x06\x3c\x49\x23\x35\xe2\xf9\x7f\x39\x35\x02\x57\x48\x32\xef\x96\x94\x93\xab\xfa\x02\xb2\x06\x5c\x87\xbe\x6c\x77\xe3\xfd\xb0\x1f\x40\xb7\x20\xa4\xe7\x66\x99\x31\xd8\xa2\x2c\x7f\x99\x12\xa9\x62\x20\x42\x25\x3a\x7b\xfc\x1b\xc3\xef\xf9\x86\xb9\x47\x9b\xc0\x9b\x9e\x79\xeb\x97\x73\x06\x88\x38\x91\x96\x59\xb1\x33\xd2\x10\x3b\x79\xc9\x7f\x03\xa1\x03\x9a\xdd\xe7\xb3\xc5\xe8\x88\x14\x29\x05\xcf\xdb\xc7\xed\xec\x7e\xb7\x78\x5c\xad\x9e\x1f\xee\xb6\x7f\xed\x66\xf7\xf7\x8f\x0b\x62\xf0\xb9\x27\x94\x5a\x8a\x2e\xed\x77\x9f\xe5\x1d\xa1\x71\x7a\x1e\x05\xe5\x1b\x38\xbe\x4b\x8a\x0c\xd0\x94\x63\x5c\xdc\x64\x58\x01\x2a\x49\x7d\x2b\xe4\x78\xb2\x49\x5a\xf5\xc7\xc4\xfe\x17\x10\x39\xe1\xb1\x3e\xda\x7d\x01\x68\x3f\x24\x8a\xbf\xe9\x97\xdf\x4e\xcd\x8d\x76\xfb\x4b\xd0\x91\x51\x56\x76\x77\x77\xdf\xfc\x37\x6f\x95\x42\x19\x68\x69\xc4\xaf\x29\x9c\x28\x29\xf6\x5e\x17\xc5\x9e\xa8\xa5\xbb\xac\xea\xbc\xe1\xed\x09\xc2\xf3\x53\x93\xa2\x84\x12\x5e\xeb\x5e\xc0\x26\xbc\x14\x4d\xd0\x48\xc6\xc8\x9f\xb6\x24\x68\x8a\x84\x55\xdb\x48\x31\x92\x79\xe9\x29\x54\x7f\x7b\xd8\x7c\xdd\x6d\x85\x0f\x26\xe6\xf9\x86\xf5\x1c\xab\xda\xa4\x86\xdc\x67\xe9\x6d\xa7\x45\x20\x8d\x02\x91\x09\x40\x8c\x3a\xce\xa5\x4e\x34\x13\x61\x1c\x5a\xa0\xe8\x61\x4d\xda\xca\xdd\xf3\x45\xa1\x36\x84\x4c\x33\x43\xdf\x17\xf2\xad\x97\x4f\x12\x51\xaa\x28\x2f\xba\xd9\x3c\x6e\xbf\x2f\x67\xf7\xdb\xef\xbb\xdb\xe7\x87\x9b\xcd\x6e\x76\x73\xf3\xb4\xdc\x6c\xda\x76\x5c\x18\xad\x6c\xfa\x9c\x3f\x70\x5a\x90\x92\x89\xd8\x07\x4b\x93\x43\xf9\x46\xb1\x5c\x5b\x68\x9a\x22\x78\x89\x58\x86\xb4\x08\xd4\xc6\xef\xea\x84\xad\xf7\x28\x13\x49\xea\x91\xbf\xca\xc7\xe1\xb4\xd7\xfb\xc2\x66\x97\xc7\x06\xd6\x4c\x24\x2a\xa6\x3d\xda\xb1\xa8\x3b\x21\x14\x26\x58\x0c\x60\xb4\x1c\x3e\x2d\x09\xaf\x3d\x22\x63\xca\xc6\x3a\x1a\xa6\x2b\x61\xa3\xb2\xd6\x6b\xed\xe7\xe5\x7e\xe0\xf9\x9d\x84\x89\xdd\x95\x19\x73\xae\xec\x80\x5f\xaa\x85\x0c\x5f\x0c\xf8\x8e\xff\xd3\x31\x11\x7a\xbd\x71\xd4\x38\x8d\x62\xd9\x69\xd2\xd1\x3a\x4c\xf2\x11\xee\xbe\x00\x79\x18\x39\xad\x23\xea\x97\x77\x63\x37\x31\x26\x04\x44\xd4\xcd\xbe\xcf\x9e\x6e\x76\x8b\xd9\x7a\xe7\x80\xdb\x42\x25\xc6\x6a\xd9\x26\x9e\xfa\x8b\xee\xe8\xb6\x31\x65\x2c\x75\x4b\xca\x0b\xe4\x59\x65\xb3\xdc\x93\x53\xa4\x40\xe6\xd1\xb6\x7c\xe7\xaa\x08\x2f\x59\x91\x0f\x7a\xec\xff\xf8\xc9\xff\x5e\x79\x45\xc8\x23\xa6\xdc\xae\xd9\xbc\x23\x8a\xf1\x27\xad\x26\xdc\x39\x98\x52\xf5\xf6\x1e\xdf\x71\xff\xab\xdb\x1a\xde\x35\x6b\xf0\xdf\xad\x92\x4e\x8e\x52\xe9\x47\x40\x4c\xec\x59\x46\x4a\x4b\x0b\x6c\xee\xc3\x85\xc7\xd2\xe7\xc6\xc4\x20\xab\x8c\x8d\x64\x33\xcb\x5c\x72\x4c\x6c\xe3\xd0\x4f\x08\xdb\x4c\xa3\xc2\x81\x92\x6d\xf9\xe2\xcb\xb5\x42\x46\x5c\x12\x0c\xcc\x96\xe2\x48\xa5\x7c\x9a\x11\xeb\x4e\x90\x40\x9e\x98\x75\x6f\x0b\x8d\xa5\x8b\x68\x64\x84\xc2\x18\xd3\xd2\x38\x6e\xd3\x0c\x93\x2f\x57\xc6\xbe\xa6\xd8\x78\xff\xfa\xf6\xef\xed\xc3\xdc\x5d\x23\x89\x12\x12\x1e\x7f\x82\x63\xa6\xac\xe9\xc6\xf0\xc4\x24\x4a\x34\x7d\x95\x4c\xa3\x01\xae\xed\xb2\xf6\x6c\xe1\x53\xa5\xa1\x3a\x89\x61\xc7\x1b\x3e\x78\xa2\x23\xc2\xbf\x90\xcc\xab\x9a\x9f\x37\xb5\x95\x4e\x9a\x17\xe0\x6c\xa8\x98\x64\x51\x60\x94\x7f\x95\xb2\x1e\x32\x17\x9c\xa0\x6e\xcf\x6c\xcf\xe1\x81\xa0\x29\x47\x15\x03\xf0\xf2\x60\x43\x1d\x8d\x2c\x22\x98\x14\x12\x43\x1b\xad\x9a\xea\xf1\x74\x16\x43\x2a\xd0\x98\x74\x13\xda\x57\x48\x28\xa9\x74\xea\x60\x85\x4f\xa8\xf5\x4c\x0d\xa9\xf2\x12\xd3\xd4\x70\x43\x4b\xb8\xde\x51\xfe\xf6\xbf\xdd\xbe\x4b\x22\xf7\xa8\xde\xd5\xda\x86\x5f\xb5\x04\x61\x52\xc7\x52\xdb\x94\xee\x4c\x19\xc3\xfc\xe1\xc7\xd6\xda\xa8\xd1\xe4\x45\xdd\xa7\x36\x2a\x2f\x49\x69\x73\xf7\x81\x59\xb5\x29\x74\x27\x63\xc8\x94\x1f\x18\x95\x80\x26\xa6\x2d\x72\xa8\x8b\xb2\x87\x3f\xbe\x30\xa7\x73\x27\xc5\x31\x74\x8b\xe1\xee\xd8\xc3\xa8\xdb\x16\xa1\x9f\x52\xfd\x84\xb8\x24\xdf\xfa\x55\xb4\xdf\x5b\x02\x0e\x3c\x4f\xdd\xf5\x82\x08\x3b\xce\x37\xe9\x17\xf6\x4d\xcb\xda\x56\x80\x36\x8b\x6f\xbd\x19\x54\xb3\xcf\xb8\xbb\x99\xce\xf3\xa9\x50\x8b\x54\x58\x49\x43\x37\x63\xb8\x27\x88\xc1\xf3\xa3\x56\x5a\x73\xd0\xc5\xd8\xff\xc4\xff\x3b\xba\x52\x2c\x05\x0d\x25\x07\xf4\x9e\x37\xcf\xdd\x43\x8b\x4f\xcf\x29\x2a\x89\x62\xc7\x75\x26\xc5\x52\x10\x7b\xbc\x53\x64\x20\x33\x00\x3c\xff\x63\xb2\x76\x31\x08\xe1\x54\x02\x29\x41\x05\x9a\xc0\xfb\x51\x97\x54\xeb\xb2\xfe\xdf\xc3\xb7\x94\xa6\x21\xc9\x2b\x2f\x8a\x2c\xa7\x5d\x63\xfb\xcc\x29\x46\x24\x93\x44\x76\xb7\xbd\x87\x9e\xfe\x66\x23\xe4\xd4\xe0\x66\x52\xcd\x68\x53\x93\xb7\x7c\xe5\xe9\x17\xc0\x42\xcf\x01\x21\x77\x27\x42\xd7\xec\xea\x2e\x26\x52\x2c\x56\xc4\x5b\x22\xef\x05\xfc\xec\x7d\xfd\xfe\xb6\x6f\x38\xef\x2a\xc6\xa4\xb5\xbe\x20\x66\xe2\x13\xaa\xac\xc4\xcb\x65\x75\x7c\x27\x3c\xe5\x81\xa3\xf5\xd5\xb3\xda\xb2\x0a\xa6\x13\x18\x83\x67\xe5\x89\x59\x7f\xcc\xdd\xdd\x14\x27\xb1\x1f\x0d\x4c\x05\x11\xf3\x44\x8b\x9d\x79\x79\x35\x10\x15\xf7\x94\x10\x23\xc1\x81\x5e\x4e\x3d\x5a\xab\x9b\xee\x14\x60\x42\xc1\x2f\xe5\x04\x2f\x01\xe8\x6c\x9c\x7f\xb4\xa7\x09\x9e\x18\xac\x82\x5b\x89\xe9\x27\x7b\xf5\x04\x25\x64\x42\x09\x13\x5d\x94\xf5\x29\xc7\x9d\xc8\x46\x99\x54\x25\x43\x4e\xb2\x45\xa7\x5c\xda\xbd\xc3\xf0\xb1\x24\x8f\x03\x4a\x50\x74\x62\x26\xd3\x2f\x57\x45\x46\xc9\xef\x00\x9f\x0f\xa7\x03\xe9\xd9\x60\xd5\xc6\x76\x4a\x7b\x8a\x58\x18\x3b\x33\xa1\xb4\xa2\xce\x14\xae\x2c\x2d\xdf\xbf\x0f\x02\x1c\x5e\x5d\x47\x8a\x74\x4c\x46\xc9\x41\x5b\x1e\xef\x2b\x1a\xb8\x13\x62\x09\x6e\x6b\xb2\xca\xf2\x27\x22\xa1\x78\x4d\x34\x50\x9c\x6a\xf3\xff\xec\xad\xa1\x17\x1a\x5b\x08\xa3\x2d\xb0\x3c\x95\x97\xca\x02\xe8\xfb\x86\xef\xbc\xbe\xfd\x76\x65\xc8\x74\x13\x3e\xfa\x81\xa6\xf2\x8e\xbd\xa3\x66\xe1\x6b\x7e\x78\x60\x1a\xd5\x2e\x98\xe1\xff\xba\xb3\xe2\x84\x83\xc9\x4b\xbd\x75\x7b\x2c\xf4\x9b\xc8\xd2\x42\x99\xe9\x15\xb5\x07\xac\xe7\xd2\x2f\x24\x3c\x08\x65\x34\xfa\x39\x70\x0c\xbc\x94\x60\x6f\xad\x8b\x3a\xc3\x90\x03\x2d\x45\x54\x4f\x6e\x42\xa9\xde\x0f\x45\x71\x48\x33\x2b\xb1\x31\x9b\x99\x57\xb5\x47\x52\x4d\x2b\xa7\x91\xb0\x1a\x14\x17\x5d\x0b\xa1\xb8\x33\xdb\xde\x60\x3d\xcf\x6a\x92\xb8\x6d\x13\xc5\x18\x83\x97\xda\x49\x60\xf9\x29\xf7\x27\x75\xc9\x05\x77\x2d\x31\x20\x0d\x07\x71\x3a\xcf\x72\xd8\x9f\xab\x6c\x34\xb9\x61\x92\x46\x94\x31\x7c\x2a\x8a\x83\xa1\x5a\x34\x11\xd5\x08\xab\x7c\xba\xc4\xe4\x61\x1a\xa7\xb4\xa6\x99\xfd\xc5\xee\x48\x3a\xa9\xbb\x66\x9a\xd9\xd5\x53\x5a\x29\xee\xb4\x24\xf2\xc2\x9e\xf6\xdf\x2d\x62\xb5\x30\x11\x22\xaa\x3e\xae\x04\x53\xa1\x28\xff\x64\x9d\xf4\x67\xc7\x6c\x74\xeb\x29\x86\xc6\x56\xb6\x82\x77\x34\xeb\x97\x9c\x84\xf2\x0e\xf2\xc6\x28\x62\x4e\xf9\x6e\xca\xc4\x7f\xdb\x83\x81\xff\x50\x69\xca\xf1\x1b\xdc\x8a\x3a\xfc\x3d\xa1\x22\x72\x18\x13\x59\x71\xdf\x15\xfd\x51\xb2\x88\xaa\xb4\x4f\x98\x37\x57\x2c\xba\x14\x1a\x4a\x6e\x1e\x01\x9b\xe0\x62\x8d\x79\xb3\xc2\x3d\x57\x66\xef\xdf\xb6\x81\x84\x12\x41\xf9\xe9\x40\x5b\xfd\x57\x92\x55\xac\xba\xc3\xc2\x90\x86\xf2\x37\xf9\xa1\xaa\x81\x31\x11\x43\xf4\x43\xea\x09\x04\x13\x5d\x98\x1c\xeb\x00\x3d\x85\x3a\xe5\x74\x77\xff\x85\xff\x0e\xf2\xaa\xa8\x59\x92\xf8\x5d\x25\xad\xcf\x9b\x1b\x4c\x8c\xa8\xc1\xa4\x19\x6f\xa0\xf0\xb9\xe7\xb7\xe7\x0b\x23\x48\x8b\x9f\xce\x62\x73\xe8\xbd\xde\x17\x59\xd1\x5e\x24\x68\x4e\x2e\x8e\x98\xcf\xb2\xf2\xa6\x74\xee\x37\x4c\x7b\x89\x08\x78\x8b\xc9\x33\x64\xc4\xfe\xef\x6b\x4f\x48\x42\x02\x42\x5d\x1c\x32\xd9\xec\x92\x27\x00\xfe\xbd\xff\xd5\xdb\xa3\x6b\x3f\x36\x43\xf4\x66\xd5\x1b\xd1\x13\x02\x6e\xc3\x4e\xaa\xfd\x24\xa0\xad\x99\x2b\xbc\x2f\x8a\x62\xaf\x8a\x0f\xf7\xda\xb5\x9f\x70\xf4\xad\x59\x54\xc7\xdf\xd0\x41\xc2\xa9\xa4\x44\xe6\x60\xcb\xed\xf7\xdd\xf6\xcf\x1f\xed\x31\x10\xb4\x21\x59\xd8\x2c\xf6\x54\x56\x49\x07\x92\x25\xd0\xae\x8c\x4d\x4f\x59\x63\xd9\x8b\x6a\x5a\x36\x5e\x6f\xba\xd0\x81\x4a\x88\x09\x4d\x3a\x58\xab\xbb\x87\xbb\xd5\xec\xde\xf8\xe2\xb8\xdf\x0e\x7d\x4e\xb5\xc5\xe3\x1e\x24\xce\x5b\x26\xc2\xa4\x71\x6d\xbf\x18\x77\xa5\xf8\xa6\x43\xce\x49\x46\x6c\x8e\xcd\xfc\x64\x6c\x08\x87\x53\xbc\x8e\x01\x2c\x50\xa0\xee\xf5\xea\x9b\xf9\x70\x08\xeb\x58\x1a\x8a\x8e\x51\x8a\x58\x83\x13\x73\x64\x3a\x56\x7e\x6a\xa5\xb5\xa9\x68\x65\x62\xcd\xe1\xd9\x49\xac\x69\xee\x32\x89\xba\xcd\x6b\xf1\x91\xdf\x60\x5e\x1c\x1c\x8a\x6a\xf8\xba\xfa\xef\x2c\x49\xc3\x41\xea\x5c\x51\x8c\xa4\x4f\x34\x42\xdd\x2d\x24\x68\xed\xf2\x8d\x76\xb2\xeb\xf9\x3a\x45\x4d\x14\xc6\xf9\xfd\x8f\x81\x2a\x94\x3d\xcc\x18\x04\x16\xb6\x49\x7a\x01\x9b\xd3\xe1\x00\x65\xf6\x5f\xbc\x30\x48\x65\x9a\xf1\x38\x85\xdf\x43\x14\xfc\xf1\x69\xda\x30\x37\x9c\x2d\xfb\xf4\x5c\xab\xb9\xcf\x28\x5a\x3e\x40\x96\x93\xe0\x7a\x95\xbd\xf4\x39\x42\x9a\x2b\xa0\xb4\x70\x67\x93\x32\xa1\x15\xca\x34\x30\x3f\xec\x8a\x89\xee\x73\x18\x49\xa1\xe1\xb3\x03\x40\xa2\x7b\xb3\xfb\xa6\x19\x20\xbd\x49\x5d\x83\x8a\xbd\xc8\xda\xc9\x2c\x3f\xeb\x12\x06\xb3\x95\x06\x94\x14\x19\xd8\x3c\x3a\xaa\xd5\x5f\xe3\x2e\x23\x98\x4f\x19\xe4\x6c\x51\x8c\xcd\x5f\x98\x16\x02\x84\x0b\xb0\x9c\xc4\x3c\x6d\x0c\xb6\x85\xfb\xbf\x4f\x28\xb3\x63\x86\x03\x8a\xf9\x3f\x46\x31\xa4\x16\xca\xa3\xa0\x63\xbb\xde\x6e\x2c\x5d\xb8\xbd\x47\x29\x12\x2a\xad\xbb\xad\xcb\xa2\xc7\x3e\x1d\xbd\x38\xe5\x45\xc4\x90\x72\xb2\x94\x45\xb9\x20\x73\x4a\x0b\x08\xb9\x24\xd1\x5f\xb9\x4c\x60\x64\xe6\x77\x44\xe8\xb9\x1f\xe8\x66\x0f\xd7\x28\x8d\x91\x51\x81\x35\x54\x78\xd5\xf7\x45\x61\x5a\x33\x49\x3c\xf9\xd1\x12\xa4\xb5\x36\x45\x3c\xb1\x07\xf9\xb6\x82\xca\x2e\x6d\xdc\xf3\x98\xa6\x8a\x34\x39\x01\xec\x5b\x6a\xc9\x30\x8c\xee\xdf\x00\xf7\x3c\x08\xc1\xe8\x2b\x6d\x68\x66\x1b\xf4\x5c\xee\xf9\x96\x11\xd6\x6a\xdb\xda\xbf\x07\x71\x20\x6d\x94\xb7\xa9\x5e\x7f\xe0\xb9\x9f\x4e\x68\x0e\x1b\x80\xa5\x79\x03\x6f\x98\x5b\x14\xd4\xef\x62\x5d\xee\x05\x10\x11\x42\x6b\xf6\xbc\xfa\xb3\xb7\x74\x72\x2f\xf4\x42\x6e\xc5\x86\x88\xc0\x3c\x5d\x9d\xe5\x5e\x18\x68\xdf\xe0\x90\xf2\x66\xb6\x7b\x72\xfc\xdf\x61\xab\x28\x64\x24\x8f\x87\x9f\x97\x49\x6e\xee\x45\xd2\xf7\x22\x47\xab\x30\x10\x7a\x5a\x74\x7b\x84\xfd\xb6\x25\x37\x52\x37\x7d\xff\x4d\xee\x45\xa8\xa9\xa2\x3d\x47\xb0\xba\xb9\x16\x26\x12\x1a\xe9\x15\xd5\x36\xd4\x31\xf1\x76\x50\x16\xf9\x4f\x02\x94\xbe\xf4\xa4\x99\xb8\x17\xb3\x34\x05\x17\x97\x3e\x7e\x10\x02\xb7\x89\xac\x86\x2f\x2d\xf1\x43\xd3\x6f\x9b\x88\xa2\x13\xb1\xba\xbe\x26\x70\x2f\x49\x52\x87\x38\xff\x9e\x55\x7d\xbe\xe7\xe8\x83\x24\xe0\x87\x6d\x9a\x7d\xf1\x0a\xe5\xd8\x5a\x8e\x7b\xa9\x97\x12\x4c\x72\x75\x76\x42\xa9\xd5\x6f\x29\x64\xdc\x4b\xfd\xc8\x37\x84\xd6\x62\xbf\xe8\x02\x34\xee\xa5\xc2\xe0\x7b\x5b\xf6\xc2\x78\xd4\x0d\x3f\x16\xf3\x7d\x0a\xbf\x7f\x5d\x05\xad\x73\x8f\x25\x92\x8c\x0a\xe1\x8f\x89\xe5\x85\x7b\x4c\x71\xd2\xf2\x5b\x7e\x5e\xcf\x13\x72\x8f\x21\x78\x5e\xab\x09\x3d\xd4\x7e\x9b\x7e\xc9\x5c\xc7\x16\xd4\x42\x2e\xfb\xd8\x0a\x76\xb7\xdb\xef\x6a\x52\x9d\xdc\x9e\x0e\x3c\x4a\x44\xab\x30\xf9\x6f\x94\xf5\x92\xfc\x57\x71\xf4\xfe\x85\xcf\x68\x68\xcc\x4a\x78\xb1\x2a\x67\x1b\xb8\x14\xed\xf9\x5b\x86\x89\x6c\xf4\x08\xd2\xf7\x95\x9d\xa0\x64\x71\x2a\x2b\xac\xee\x31\x7f\x79\xad\xdd\xc7\x92\xb1\xa2\xc2\xda\xb1\xe9\xdd\x51\x9b\x78\xe3\x9e\xd4\x9e\xf2\x7b\xca\xe2\xc3\x7e\xaf\x3c\x41\xa8\x8d\xcd\x76\xf6\xd4\xe5\x3b\xdc\xc1\x20\x14\x76\xbf\xd4\x2c\x06\x26\x7b\x7d\x45\xfa\x91\x7b\x2a\x4c\x29\xcc\xdf\x17\xf2\xcd\x62\x86\xaa\xf6\x4a\x2c\x1c\xda\x05\x6f\xbf\x8f\x7a\x06\xfa\x8a\x00\x65\xd5\x6b\xf1\xd1\x74\xc2\x87\xd3\x45\x25\xd8\xb5\x4c\x25\x6d\x5f\x9a\x98\x78\xf4\x01\x50\x84\x9a\xf5\x4d\x56\x37\xa7\xc3\xb6\x78\xea\x4b\xe2\xda\x96\x3a\x30\x79\xee\x76\x62\x9c\x4a\x87\x73\x4f\x47\x3e\x85\x2c\x3f\xb3\xf7\x4c\x99\x75\x73\xeb\xe0\xeb\xcd\xd1\x98\xb6\xa4\x96\xd3\x8f\x65\x55\xe4\xb0\xbf\x31\x6b\xb0\xbd\xe0\x6d\x31\x9e\xd4\x34\xc4\x8e\x5e\x6d\x39\xfa\xa8\xe7\xe7\x91\x0c\x36\xf7\xbd\xc0\x37\x8c\x1c\x1a\xef\x17\xc4\x77\xee\xfb\x3e\x23\xc3\xe0\xfb\xbb\x87\x9b\x3e\x22\x92\xfb\x7e\x9c\xd2\x62\xf1\x0a\xd5\x5d\x3d\x47\xcc\x2d\xb5\x63\xfc\x13\x01\x17\xa4\x33\xf4\xa5\x91\x5c\x7f\x24\xf8\x81\x64\xc2\x7a\xca\x96\xcd\xce\x8c\x02\xbc\x66\x20\xf5\xf2\x4c\xdc\x0f\x03\x45\xda\x0e\xa7\xea\x8a\xa6\x4b\xd3\x44\xd3\x54\xb5\x99\xdd\x2f\x83\xdd\xf2\xe1\xa6\x3d\x17\x12\xa2\x1e\x80\x52\xdf\x4e\x4d\x84\x30\x3a\x4f\x19\xfd\x7e\x68\x82\xa9\x8d\x35\xa5\x9c\x9e\x31\xfd\x48\x09\xaa\x14\xd4\xce\xa7\xee\xc2\x66\x93\xfb\x91\x8e\x9c\x48\x84\x33\x4a\x0a\x52\x77\x2f\x89\x2f\x48\xde\x80\x62\x69\xba\x8b\x6d\x41\x26\xce\xc6\xa6\x6f\x7a\x7a\xf2\x53\xad\xa8\x8c\x41\xd6\xc6\xc4\x7b\x30\x92\xf6\x1d\xf0\x8f\xfb\x5c\x79\x94\x66\xf9\xeb\xca\xad\x73\xad\x8d\x46\x20\x56\xf5\xce\x68\x71\xec\x74\x96\xab\x87\xe2\x7b\x96\xd7\xb3\xba\xe5\xb4\x0f\xce\x82\xd0\xf0\xc9\x08\x8d\xdf\x4b\x4f\x0d\xd7\x4a\x1f\xac\xcd\x9b\x38\x9d\xfb\x80\x0b\x77\x34\x66\x51\xe0\x56\x3a\x8a\x7a\x0d\x08\xc6\xdd\x3a\x60\x2a\x9d\x34\x1b\xe4\xea\x4c\x88\xdb\xcb\x78\x9e\xfb\x22\x95\x54\xc9\x6e\x37\x83\xab\xc7\x71\x0b\x48\x49\x27\xad\x04\x07\x6c\xe2\xbe\xd0\x1e\x19\xcd\x51\xd5\x7a\x5a\x69\x65\xd0\x23\x85\x96\xa4\x37\xf7\x52\x14\x56\x24\xda\x1f\xbf\x4c\x99\xc4\x24\xbf\x7d\xc8\x72\x9a\xc7\x46\x77\x21\x53\x9f\xc8\xe9\x68\xf8\xd3\x81\xbb\x13\xa9\x4c\xd1\xa8\x59\x47\x8b\xa2\xec\x66\xc7\x2b\xcb\xe0\x97\x3a\xb5\xdc\x57\xb1\x71\x06\xd9\xc1\xf1\xb8\x77\x2a\xfa\xa3\x26\x3c\x0c\xa1\xd3\x53\xea\x2a\xae\x13\x7a\x3f\xdc\x57\x18\x51\x4e\x0e\xda\x1a\xd2\x70\xc9\xf0\x91\x73\xca\x54\x7c\xe0\x8e\xfa\x51\xdd\x9f\x23\x50\x19\xf6\xd1\xf6\xfb\xdd\xd3\xcd\x6e\x7b\xb7\x7c\x22\x53\xbf\x9d\xb1\x87\xdd\xde\xad\x96\x5d\x4b\x4d\x59\x4f\x85\xef\x16\x11\xea\x8e\xe8\x20\xa0\x18\xb1\x89\x8b\x77\x7e\xfb\xd7\x30\xa2\xb2\x59\x3e\x96\x07\xe3\xbe\x16\x8c\xf0\x4f\xff\x3e\x1d\x8e\x77\xee\x56\x02\x2f\x36\x80\xc4\x16\x85\xda\xfc\x49\x11\xac\x69\xfb\xfc\xb0\xfc\x97\xfb\xa3\x1f\xa4\x0c\xac\x70\x43\x4b\xe6\xe3\x81\x1f\x23\x19\x77\x62\xfd\xba\xca\xf2\xb6\xa3\x06\x3e\x0f\xa5\x24\x72\x51\xf9\x86\x35\xed\xe1\xcd\xb8\x1d\xcf\xc8\x81\x0f\x9a\x5b\x91\xb9\xc7\x53\x3d\x27\x7c\xce\xf4\xe2\x13\x34\x53\x66\xd8\x09\x4a\x36\x21\xde\x24\x86\x8d\x07\x01\x1a\x81\x84\x0a\xf7\xfb\x35\x34\x9d\xb9\x0f\xf7\xe8\x44\x0b\x86\x67\x85\x51\x4c\x9b\x24\xdc\xc3\xb1\x42\x65\xa0\xea\x6e\x62\x0d\x42\x9e\xb6\xf9\x64\xa2\xc9\xf4\x77\x81\x3c\x88\x22\x19\xdb\x18\xe1\x4e\x16\x13\xfa\x3e\x3c\x88\x62\x8f\x16\x4f\xd9\xc5\xb6\x41\x0c\x8a\xb4\xaf\x9d\x27\xcf\xe7\xae\x36\xa8\xb5\xe1\xad\xc5\xc2\x68\x60\xf5\x75\xa0\xe7\xe7\x71\x23\x14\xe4\x26\xa2\xf7\xa7\xcf\xdb\x9e\x26\x58\x2f\xca\x0b\x12\xc6\xbd\xce\x24\xa6\x09\x4a\x42\x77\x2b\x09\x0f\x09\xec\x93\xe3\xc7\xec\x80\xb9\xa2\x22\xe5\x17\x4e\x31\x3c\x48\xa4\xa4\xd2\xda\x4e\x42\x3e\xb1\xcd\x18\xbd\xde\x34\x32\x1a\x59\x3b\x28\x91\xb4\xde\x67\xb9\x6a\x8b\xf3\x96\xc0\xe6\x9a\x0a\x49\x05\xcb\x9d\x4d\xf4\x7d\x05\x6a\xe1\x41\x2a\x0d\x74\xb6\x2e\x4f\xcd\x8c\xbb\xe9\xe9\x7a\xf2\x20\xc5\x88\x88\xac\xc6\x02\x7f\xf3\x7d\xf6\xb4\xdc\x3d\xde\xee\x2c\x2c\x7c\xd3\x36\xd3\x8c\xe2\xda\x2d\xe4\x2f\x45\x5f\x11\x83\x07\x8c\xc5\x56\x80\xa3\xbe\x59\xfe\x1c\xbd\x73\xae\x94\x79\x9f\x45\xae\xb3\xf2\x40\x68\x3d\x6b\xe3\x40\x9f\xe8\xa6\x68\x76\xd0\xed\xde\xb9\xf7\x25\x00\x78\x6a\x2a\xee\x8f\x47\xec\x0d\x1d\x50\x21\x45\xfe\xe5\xa4\x99\xc0\xf4\x87\x10\xa1\xe1\xdc\xdd\xac\xee\x1e\xb6\xee\x42\x42\x33\xda\x5b\x64\x15\xd5\x62\x0e\xa8\x32\x28\xc7\x7d\x46\xaa\x84\xb2\x32\x39\x7e\x5a\xee\x44\x13\x17\x3d\x14\xee\x22\x8a\x9b\xb2\x15\xcd\x4f\xf4\x0e\xdb\x57\xa6\x34\x52\x18\x77\x80\x4f\xfa\x9c\xdf\xfb\x49\x60\x1e\xe8\xd4\x78\x5e\xbf\x60\xfd\x8e\xaf\x25\xfe\x47\x59\x02\xef\x64\x04\x1b\x7a\x89\xa6\xf2\xb5\x03\x09\x2d\x8a\xc3\x21\xab\xeb\x96\x08\xcd\x43\x2f\x35\x96\xc2\x65\x51\x43\x8d\xf3\xac\xb6\x46\xe1\x7d\xc8\x37\x0f\x3d\xf0\x28\xda\x15\xe5\x69\xac\x58\xd9\x1c\x4c\x91\xbb\x08\x66\x55\xa8\x1e\x3a\x9a\x87\x4d\x18\x0f\x5d\x1e\x67\x03\xef\x59\xfe\x52\x4d\xe1\xb8\x79\xe8\x69\x15\x40\xcf\xe1\x62\xf4\x3b\xbe\x17\x82\xc5\x49\xcc\xb4\xce\xf6\x19\xd4\x78\x3d\x75\xc3\x43\x9f\x01\xd1\xac\x0e\xf0\x86\x4e\x23\xbf\xbf\xd2\x86\xbe\x88\xe3\x56\xca\xa4\x4f\xc8\xe4\xa1\x8f\x3e\xd7\xad\x01\x55\x6d\xd5\x03\x06\x73\x7f\x18\x30\x45\xa8\x3b\xb7\x05\xb8\x46\x66\x73\xcd\x41\x13\xc1\xe9\x58\x16\x9f\xd9\xe5\xc5\x24\x97\x76\xa6\x6b\xe6\x0f\x37\x05\x0f\x43\xef\x3f\x46\x57\x94\x9a\x59\x42\xee\xd8\xbb\x85\x87\x61\x6c\xe0\x09\xef\x84\xb9\xea\x2c\x59\x79\x18\x32\xa3\xb0\x42\x1b\x05\x0a\xaa\x28\x05\x34\x65\xd3\xc3\xc3\x90\xfb\x24\x8f\x69\xa6\xb6\x07\xfc\x98\x54\xa6\x1c\xfc\x72\x94\x72\x8a\xf3\x09\xeb\xec\xe6\xa2\xbd\xfb\xf5\x98\x61\x80\x0e\xb6\x45\xa9\x8d\x2e\x01\xc5\xc3\x18\x3c\xe5\xb5\xc2\xcf\x64\x5e\xb4\x2d\xe6\xa7\x2a\xcb\x7b\x05\xde\xb1\x72\xce\x6f\x78\x11\xc3\x5e\x14\x43\x40\x77\xf7\x58\x66\x2f\x59\x5e\x6d\x9b\x50\xad\x57\x12\x18\x3e\x7d\xe2\x2b\xb2\x5d\xbf\x0b\x06\xb3\x57\x98\xf8\x9a\x32\xed\xb7\x88\x0b\xc7\x4a\xfb\xed\xb4\x32\xba\x91\x24\xe2\x34\x94\x9b\x20\xce\x4c\x12\x8b\xe2\xba\xe7\xea\xef\x2e\x26\x7d\x2a\x0e\xfd\x59\xec\x0b\x7a\x1a\x77\xa7\x8c\x4b\x90\xad\xf8\xfc\x19\xcb\xdb\xa2\x3c\xfc\x71\x59\xc6\xe3\x21\x53\xa6\x1a\x06\x46\xcb\xdf\xc9\xe6\xfc\x0d\x91\x58\x1e\x72\x96\x10\x6e\x7c\x5f\xd4\x35\x96\x67\xc3\x91\xb0\xc7\x40\x46\xba\xcb\x35\x0c\x44\x7a\x79\x28\x02\x41\x7c\xa9\xda\x58\x04\xd9\xc0\x1a\xcb\x6a\x08\x2c\x73\xad\x55\x40\xbd\x43\xd2\xcb\xea\x13\xe2\x78\x28\x35\x33\x0e\x33\x74\xe2\xb6\xd8\x20\xaa\x87\x66\xfe\xbd\xdc\x2b\x87\xca\xf3\x8d\x60\x16\xd6\x59\x89\xbf\xb2\xbd\x5a\x42\x75\x76\x3c\xf9\xdf\xff\xd3\x5e\x46\x91\x78\x3b\xcd\x1f\x13\xc9\xa1\x50\x29\x74\x02\x1b\xb3\xe3\xd1\xb1\x06\x78\x88\x41\x40\x33\x93\x38\x95\x79\x6d\x2d\xaa\xba\x63\x89\xc1\x44\xd0\x80\xfb\x99\x95\xf5\x09\xf6\x4b\x62\xec\xb5\x4d\x24\x8b\xed\x10\x1a\x8c\xf9\xc8\xf3\x0c\x33\xc7\x16\x4a\x8d\x7c\xab\x3b\xe6\x7b\x44\x31\x37\xd5\xe6\x45\xb3\xcb\x3c\x40\xab\x99\xc2\x23\x8f\x47\x44\xb1\x5f\xc5\xfd\x9e\x1e\xf9\x11\x52\x34\xb2\x81\x77\x34\x0c\xd2\x07\xac\x3f\x8a\xf2\xad\x6d\x00\x1e\xc5\xe4\x77\xea\xb3\xe3\xbb\xf3\x28\x08\x38\xad\x3c\xaf\x50\xfd\x2c\x6a\x54\x8f\xf9\x4d\x21\x4f\xcd\x1c\xbc\x2e\xec\xcc\x3e\x4a\x08\x45\x41\x18\x39\x45\xd1\x55\xcb\x46\xed\xeb\x23\xf0\x28\x88\x22\x4a\x87\xac\x7b\xa9\x9f\xf6\x58\xca\x94\x01\x12\x89\x7d\x26\x7f\xe0\xf9\xaf\xdb\xa2\xfc\x73\xf8\xe5\xa3\x80\x29\x0a\x8c\x1f\x3f\xf2\xe6\x0d\x19\x09\xfd\xf6\x0a\x4a\x7a\xc6\x77\xec\x3d\x2b\x07\xa2\xfe\x3c\x0a\xd0\x60\x82\xdb\xaa\x5d\xfb\x77\xad\x0d\x58\x34\x37\xd6\x67\x93\x53\x75\x14\xfa\x40\x61\x5a\xe7\x83\xd3\xa3\x05\x5f\xa4\xd1\xae\x19\x4b\xf1\x28\x0c\xd1\xb7\x58\x9b\xa5\x05\xf5\x8c\x9e\x30\xe4\x21\x75\x8e\x9b\xf5\xa3\x0b\x2a\xa2\x28\x14\x54\xa6\x5b\x6c\xaf\x68\x42\xb9\x76\x49\x08\xdd\x4e\xb9\x19\x5f\x2d\x8c\x98\x47\x71\x24\x98\x21\xf8\x64\xe5\x34\x70\x93\x47\xb1\x8c\x1d\x1d\xc4\x59\x5d\x8c\x5e\x44\x82\x21\x31\xd5\xbf\xfd\xf9\x73\xf1\x50\x5c\x77\x35\xe7\x51\xea\x05\xb4\xbc\xf6\x1c\x16\xfe\xd6\x66\x75\x72\x86\x8a\x52\xdf\x70\x6a\x57\x77\x0f\xbb\xa7\xe5\xed\xf3\xc3\x0d\x29\x38\xef\x6e\x96\xe4\x13\xb4\x7c\x72\x8f\xc9\x58\x40\x01\xfb\x6c\x38\x0d\x4e\xa7\x46\x22\x0e\x46\x65\xb5\x42\x4b\xcb\xe8\x55\xd5\x78\xc4\xd1\xa7\x7d\xfa\x2c\x7f\x19\x94\xeb\x9b\x23\x8a\x6a\xe6\xc5\x01\xe5\x57\xf9\xa9\x08\x98\x4f\x13\xa4\xc0\xda\x57\xb8\xaf\x61\xa4\x7f\xcd\x23\xe1\x1b\xcd\x62\x50\x6a\x83\xe5\x3b\x96\x7f\x4c\xd5\xb3\x47\xf7\x2d\x3d\x93\x43\x2d\xd1\x48\xe9\x9f\x6d\x7c\x3f\x7e\x99\xc3\x11\x2a\x7d\x9f\x78\x31\xe2\x74\x1e\xac\x55\xc3\x0f\xa7\x42\xa3\x87\x98\x55\xb3\x53\xfd\x7a\x63\xe6\xa2\xd1\x14\x1c\x29\x89\xd2\x40\x66\x3a\x54\xda\x48\x28\x82\x47\x4a\xc7\xe4\x21\x69\xd4\x9e\xc6\x9c\x8f\x2e\xca\x8c\xd0\x53\x24\x45\x61\x2a\x4d\x6b\xa8\x2a\x1b\xa5\x3a\xa3\x68\x1e\x61\x14\xa4\x76\x4b\xdc\x17\x18\xb9\xae\x4a\xc4\x23\x64\x9e\xec\x98\x39\xdb\x57\xcb\x9d\x1d\x3d\x09\x0a\xa4\x42\x9b\x99\xb0\x97\x95\x2c\x8b\xab\xa1\xe0\xe8\x2b\xe8\x18\x3c\xe3\x05\xb9\x47\x28\xa9\x4e\xfa\x50\x94\x07\x6b\xce\x5f\x4d\x03\xd4\x79\xa4\x93\x20\x4d\x6c\xe2\xa5\x2c\xde\xa9\x74\x33\xf8\x45\xeb\x96\xc2\x63\x5f\x70\x2a\x46\x11\xf8\xd6\x86\x5b\xa6\x8a\x32\x79\x43\x71\x18\x32\xda\xec\x2e\x5e\xb3\xfd\xde\xc8\x56\xfc\xe1\x0e\x81\x24\x9d\x69\x2a\x94\xd3\xfd\xb9\x09\xa8\x43\xc6\xf1\x38\x14\x40\x69\xc0\x66\xe7\xd3\x7c\x4e\x62\xe2\x6e\x0b\xe3\xaf\xe9\x1a\x45\xbe\xa0\xcc\xbe\x65\x1f\x3d\x21\x71\x4d\x9f\xb0\x2a\xf6\xad\x03\x0a\x8f\x23\x10\x94\x38\xa0\x30\x72\x47\x12\x65\x19\xaa\x1d\x3a\x36\x35\x8f\xe3\x34\x49\xf8\x05\x41\xf3\xba\xcd\xd2\x64\x77\x8d\x63\xc9\x1c\xe1\x6c\x7e\x3a\x1b\xe5\xbc\x5c\xad\x4b\x7c\xcf\x8a\x53\x65\x35\xac\x06\xe3\x20\x4e\x38\x38\xd6\xdf\x6d\x59\xe4\xf5\xd8\x87\x8a\xc7\x89\x0e\xa9\xb8\xb1\xa3\xa9\x74\x90\xd4\x88\xd3\x30\x89\x58\x5b\x44\xbf\x60\x2f\xf2\x38\x8d\x7c\x5a\xe5\x3e\x20\xa3\xe1\x60\x1c\xb6\xdc\xe9\xcc\xd3\x89\x75\xb0\xf8\x89\xb9\x2a\xca\xab\x52\x3b\x3c\x66\x51\x40\x1b\x69\x28\xc5\x5f\x97\x7e\x42\x63\x3c\xea\xb0\x2f\xf0\x48\x12\xbf\xa2\xee\x0c\x50\xee\x8b\x51\x15\x37\xe6\x0c\x35\x76\x5e\x03\x65\x9d\xf5\xf4\x98\x78\xcc\xb9\x4f\x79\xfb\x22\x5f\x3a\xb7\x4d\xc7\xa5\xea\xc6\x59\xcc\x55\x2c\x2d\x3f\x63\x61\xfd\xc3\xec\x6b\x9f\xbc\x31\x88\x24\x11\x52\x0d\xa9\xd7\xc5\x8c\x84\x1a\x31\x43\xdb\xb5\x4b\x91\x08\x7f\x24\x0e\x37\x3b\x88\x0c\xf3\xfa\x3e\x7b\x79\x6d\x56\x4e\x3c\xf6\xbd\x41\x06\xdb\xd0\x18\x94\xa2\x7c\x70\x4e\x9a\xfd\xc7\xa2\x82\xfd\x85\x98\xfa\xa0\x3a\x67\xcf\x13\x51\xea\xf5\xd3\xc3\x26\x3d\xb9\xd3\xbf\xa3\x00\xf2\x58\xc6\x2d\x50\xc4\x72\x1d\xa9\xa4\x4b\x90\xd5\xde\x7c\x18\x4b\x60\x54\x1b\x7f\x7a\x2d\x54\xe6\xf4\x5a\x78\xac\xbc\x80\x62\xb4\xa5\xd1\x47\xfb\x62\x39\x89\x55\x1a\xf0\xb4\x27\x90\xd5\x6c\x3b\x6e\x8b\xf2\xa6\x84\x8f\x8b\x12\x7d\xac\xd2\x94\x1a\x37\x71\xa2\x95\xfe\x19\x35\x90\x9a\xb2\x77\x66\xea\x6b\x23\xf2\xfe\x5b\xf5\x93\x49\x56\x7f\x12\xfd\x63\x4a\xb6\xb4\xfb\xbf\xfd\x40\x3b\x46\xdf\x08\xdc\x3e\x3f\x7c\x73\x89\x98\x18\x03\x20\xe0\xce\x6a\xb9\x9d\xfd\xd9\xc1\xda\xdd\xd1\x38\x92\x76\x90\x50\xa5\xc9\xd0\x1d\xd6\x7b\x18\x49\xe7\xf0\x18\xa5\x21\xdf\x38\xa1\x23\x23\x19\x66\x0f\x6a\xae\x28\x13\x6b\x1e\xf0\xa9\x20\xfb\x77\x93\x7e\x9d\x06\x5a\xf2\xc4\x4b\x64\x62\x92\xec\x87\x23\xec\xb7\x24\x06\x9e\xe5\xfe\x04\xd6\x6c\xe2\x5c\x1e\x91\xfc\x57\x55\x17\xf2\xad\xa3\x81\xf1\xc4\x03\xcf\xc1\xf3\x67\x25\x49\x22\x99\x61\x74\x8b\xa3\xc7\x49\xfc\x58\x12\x45\xcb\x0d\x8b\x0d\x59\x80\x7c\xdd\xff\x92\x20\x04\xb4\xdc\xeb\xf5\xfe\xf4\x92\x5d\x89\x0f\x93\x40\x78\x94\xd7\x32\xeb\xf1\x32\x57\xad\xf8\x26\x4f\xc2\x40\xc7\x06\xf1\x9c\xd5\xb3\xba\x86\xae\x88\xe5\x1a\xf0\xd4\x99\x52\x1a\xf1\xda\xbe\x12\xb1\x6d\x13\xfb\x9c\xa2\x9d\xdd\xb1\x2c\x24\x56\x55\xcf\x7c\xe9\x16\xaf\xc4\x60\x49\x1c\x18\x35\xf5\x12\x7b\x8b\x4c\x12\x33\xa9\xc3\x56\x2d\xf7\x3c\x98\x82\x93\x24\x61\xa4\x14\xda\x89\x03\x1a\xec\xf2\x7c\xc2\x29\x91\x27\xa9\x9f\x04\x41\x97\xc3\xba\x04\x5a\x5d\x89\xb2\x12\x16\x7a\xcc\x73\xb3\xa3\xd3\xab\x43\x65\x56\xc3\x1e\x47\x8f\x27\x4c\xa2\xc5\x3e\xea\x53\xae\x1e\x8a\xfc\xc7\x5f\x8b\xd6\xd7\xd5\xb6\xe1\xca\x14\x27\xea\xe2\x48\x4c\xb1\x9b\xe2\x00\x99\x25\xa6\xf5\x07\x79\xc2\x55\x4c\xb1\x2e\x1c\x8f\x45\x96\xd7\xd7\x61\x5a\x3c\x81\xd4\xa8\xf8\xd3\x38\xc9\x2b\x72\x46\xef\x39\x37\x0f\xd1\x0c\x89\xf0\x0d\x00\x14\x69\xf3\xd4\xb3\xf2\xe3\x89\x88\xb5\xd3\xc2\x21\x8a\xe7\xdd\x4d\x7b\x44\x01\xed\x1b\xaa\x93\x38\x64\x75\x3b\xa3\x4e\xcc\xa0\x89\x8c\x99\x6c\x49\x1d\x7a\xec\x33\xc7\x13\xc9\xa5\x07\xed\x70\x9c\x66\x3d\xd9\xa6\x2a\x30\x52\xd5\x12\xf6\xf2\x27\x56\x35\xed\x87\x2f\x33\x3c\x89\x4a\xd1\x24\x2f\x0d\x41\x6e\x5d\xf6\x60\xa5\xae\x09\xf3\x09\x8b\x89\xb9\xea\xac\x4a\x78\xa2\xb4\x11\x5d\xb8\x7d\xbe\xbf\x37\x49\xdc\xdd\xaf\xd9\xfd\xfd\xd2\xcd\x50\x09\x26\x40\xe7\x3d\xca\xba\xd9\x4e\xb6\x7f\x4e\x81\x2c\x41\xf7\x59\x55\xaf\xcb\xb3\xac\x8b\xb0\x3d\x24\x4d\xb9\xa3\xa6\x8d\x7b\xbf\x4f\xf9\x2d\x91\x68\x1a\x10\x92\xe8\xd8\xb8\x03\x1b\x8e\xe3\xb0\x3f\x68\x06\x14\x05\xd2\x2c\xd9\xcc\x46\x77\x8b\xc7\xaf\xa1\x2f\x89\x96\x92\x34\xfa\x40\x14\x83\x90\x3c\xd1\x2a\xa0\x92\xd5\x66\xbe\xe9\x6f\x68\x12\xad\x12\x26\x3b\x93\x39\x9a\x7b\x3a\x6d\x3e\x9e\x7a\x41\x2c\xfa\x0a\x56\xcb\xa6\x0b\x65\xf9\x4b\x2f\x31\x99\x7a\x91\x47\xf2\x17\x50\x62\xeb\x6f\x7c\x49\x47\x1c\x21\xdd\x78\xea\x25\x8a\xd6\xf9\x53\x4f\x63\x76\x28\x2c\xcc\x53\x4f\x1b\xc0\xcb\x3c\xab\x6f\x3f\x54\xff\xce\x53\x3f\xd0\xba\xe3\x40\xd0\xa1\x1e\x66\x28\xf5\xb9\xb1\xcc\xfa\x7e\x82\xfc\x45\x41\xf5\x9a\xfd\x1e\x81\x94\xfa\x2a\x21\x7c\x9d\x3e\xe5\x72\xe7\xcd\xe6\xdc\x5d\x2d\x0c\x14\x25\xca\x2c\xea\xe6\xcf\xf6\xef\x60\x12\x1b\x02\xe4\xdb\x97\x84\x3b\x9e\x86\x52\xd3\x96\xd3\xee\x37\xea\xd7\x4d\xd6\xfc\x72\x1f\x92\x77\x31\x13\xa5\x21\x26\x04\xa7\x24\xaf\xd7\x1b\xa8\x61\x5b\x3c\x88\xff\x77\x2a\x8b\xb2\xea\xe7\xe3\xd2\x48\x26\x61\xd0\x01\x64\x28\x1a\x26\x28\xc7\x54\x24\x96\xc6\x00\xdc\x3a\x15\x7c\x2b\x9a\x19\xae\x27\x8f\xc5\xd3\x24\xf1\x6c\x96\xeb\xdc\xe6\x85\xd2\xd4\x63\xc4\x4b\x32\x01\xc8\xa6\x99\x94\xf0\xa5\xdd\xe7\x98\x8a\x4e\x3c\xfa\xc0\x69\x24\x03\x43\xa1\x38\x9e\x8e\xed\x85\x12\x41\x40\x96\x9a\xcc\x01\xad\x04\xd6\x5d\x7e\x03\xe7\xaa\x6d\x02\x90\x38\xaf\xab\xe7\xdc\xf2\x90\xd5\xa2\xe3\xe8\x8d\x7e\x46\x71\x85\x03\x1e\xa6\xd9\x92\xdd\xe5\xef\x05\x29\x1c\x7f\xb9\x88\xa6\x3c\x8c\x89\x51\xba\x33\x2e\x6a\x8f\x47\x07\x47\xbc\x10\xc8\xe6\x29\x8f\x03\x62\x85\x9b\xb7\x60\xb1\x99\xa7\x69\xc4\xd7\xf4\x80\x4f\x21\xe0\x04\x79\xfe\x7e\xf3\x7a\xca\xd5\xa9\x7d\xc1\x10\x7a\x84\xfb\xb3\x46\xf0\xba\x28\x2b\x94\xa7\x32\xab\x33\x1c\x0f\x0a\x48\x3c\xd1\xa9\x46\xb7\xe1\xdb\xd0\x76\xc1\xb5\x45\x93\xf1\x96\xad\xe5\x5a\x31\x98\x64\x52\xe1\x87\x1c\xdb\xcd\xd8\xb7\x4c\x8f\x82\xc5\x54\x86\xc6\xb6\x49\x2a\x7f\x38\xc1\xa6\x12\x98\x53\x68\x6a\x35\xbc\x0a\x32\xfb\xfa\x63\xaa\xc0\x90\x4a\x09\x44\xc3\xab\x40\xe3\x30\x60\x4b\x95\x8f\x60\x2f\x45\x42\xf7\x5b\x84\x83\x59\x47\xaf\x0c\x0c\x15\xa0\xef\x5c\x31\xac\x10\xac\xe1\xd9\x9b\x1c\xf6\xb0\x31\xa2\x4f\x05\x97\x1b\x3c\x60\x8d\x1d\x80\xe2\x2e\xaf\xea\x4e\x51\x8a\xa7\x1a\x42\xe2\xcf\xea\xa2\x5c\x14\x87\x03\xe4\xaa\x3b\x12\x85\x86\x71\x4d\x86\xfe\x0b\x12\xe1\x30\xc1\x77\xdb\x6d\xb5\x08\x02\xaf\xc3\xa3\xda\xb1\xd1\x5a\x99\x4f\xf7\x3e\x2d\x93\xb4\xd5\xf5\x28\xca\x85\x4b\x49\xb7\x93\xc9\xa8\xb9\x32\x5f\xab\x84\x5c\x15\x07\x23\x8d\x7f\x97\xcb\xa2\x9d\xe8\x99\xa7\x4d\xda\xfe\x15\xcb\x62\x7b\x3e\xe2\xdd\x15\x30\x0a\xf3\x3d\x65\x22\x4e\x12\xf2\xd8\x7c\xbf\x73\x68\x32\xe6\xc7\x11\x09\xf7\x65\xd5\x4c\x34\x3b\xdd\x71\xba\xb3\xff\x51\x99\x9f\x46\x14\x5b\x1a\x0d\xd8\xef\x70\x34\xf5\xdb\xc9\xa7\x65\x7e\xaa\x28\xb1\xb6\x2e\x8b\xea\x88\xb2\x2e\xca\xea\x06\xdf\x7b\x2e\xc4\x83\x0e\xc6\x7c\x11\x6b\x1b\x57\x58\x9b\xaa\xe1\x4f\x4b\x96\xf2\x4e\x3d\x7d\xac\x01\xc4\x59\xe0\x81\x71\x25\xcb\xca\xfa\xd5\xa8\x68\xbb\x67\x0c\xc2\x80\x36\xc0\x56\x46\xa8\x1a\x02\xf4\x39\x0b\x64\x42\x3f\x6d\x0a\x1c\x95\xef\x79\xc7\x4e\xf5\x88\xb3\x40\x9b\x42\xfa\xec\x54\x17\x87\x42\x64\x7b\x5c\x9c\x05\x96\x72\xc4\x3a\xe3\x2c\x0c\x0d\x5c\xda\x55\x67\x96\xb9\xea\x09\x8e\x72\x16\xa6\xa9\xc1\xa1\x4a\x79\x5b\x94\x16\xf1\xe1\x8e\x69\xee\x99\x9a\xb5\x45\x04\x6c\x8b\xf9\xe9\x7c\x25\xbb\xc4\xa2\x90\x47\x5e\xab\x23\x7c\x1a\x21\x5e\x58\xa4\x22\xb0\x88\xc4\x79\xf6\xb2\x2e\x8b\x43\x61\x51\x73\xee\xe7\x62\xf0\x28\x5c\xee\xf9\xf8\x35\x7f\xf4\x85\x09\x1d\x55\x3b\x5a\x26\x43\x0f\x92\x46\xed\x2a\x8e\x4f\x50\xe2\xe4\xe2\xc3\x62\x8c\x92\xb6\x90\x98\xeb\x7d\x26\xeb\x51\x0a\x89\x25\x20\x58\xe0\xec\x7f\x91\x46\x13\x95\x69\x6e\xcb\xe2\x60\x25\x3d\x27\x67\x05\x96\x28\x03\x9e\xb7\xa0\x95\xde\xa2\xc2\x18\x72\x4a\x5c\x1a\x6e\x7c\xcf\x18\x78\xf8\x14\x9c\xa9\xa4\x63\x4a\x5c\x4e\x87\x0c\xb8\xe9\x38\x8b\x87\x1f\xdb\xdf\xc2\x14\x19\x68\xc5\x59\x5f\x3f\xbb\x2c\x0e\x7f\x4c\xfb\xe3\xd8\x33\x84\x52\x44\xc0\xf8\x99\xe1\x47\xbd\x3a\x77\x66\xa9\x9c\x49\x5f\x11\x16\xaf\x09\x05\xe7\x7f\x8e\x6e\x5c\x25\x29\x40\x4f\x9d\x66\x0e\xa5\xa4\x9a\x7e\xd3\x0b\xb8\x5d\x84\xc6\x24\x4d\x5a\xb6\xb9\xbb\x02\x03\xf2\x17\x74\xe6\x78\xeb\xb2\x78\xcf\xaa\x31\x30\xff\x52\xe6\xcf\x9e\x8e\x4a\xa6\x89\x13\xdc\xfa\x38\x8f\x21\xf4\x4c\xfb\x09\x18\x42\xe7\xa9\xc2\x81\xda\x0a\x67\x3a\x40\x66\x75\xa6\x5c\xe5\xcc\x55\x49\x46\x17\x11\xe8\x38\xcb\x7d\x58\xe1\x60\x53\x67\x9a\x72\x2f\xd0\xda\x26\xbd\xd7\x58\x3e\xe7\xd9\x15\x14\x37\xf7\x58\x64\xaa\x2c\x0f\xf3\xbf\xe5\x8f\xc4\xb9\xcf\x8d\xf3\x51\x25\xf7\xfd\xc1\xce\x7d\x61\xfc\xb4\x0d\x6c\x63\x57\xe8\x01\xd2\x8d\xfb\x52\x10\x51\x70\x59\xbf\xd2\xa4\xb3\x39\x16\x79\x55\x94\x7d\x75\x66\xce\x03\x5f\x06\x49\xeb\x6f\x62\x61\x6e\x83\x97\xc0\x43\xdf\x30\x59\x2b\xac\x57\xb5\xea\x9b\x33\xb4\xcf\x14\x46\x48\x18\x3f\x81\xcd\xda\xf0\x94\xc9\xd7\x56\xce\x9e\xf3\x50\xc4\x9e\x73\x4b\x2c\x4e\x62\x8f\x7d\x67\x42\xce\x23\x4f\xa5\xad\x32\xc4\x47\x8b\xc6\x75\x47\xa3\x90\x86\xef\xe6\x15\x75\xd1\xfe\x31\xf6\x28\x33\x5c\xd5\x27\xd5\xcd\x28\x3c\x62\xa9\x0c\xdc\x95\x64\x51\xaa\x07\x38\x60\x4f\xfb\xcd\x4d\x4e\x3c\xe2\x32\x4d\x5d\x43\xb7\xdd\x6e\xaf\x02\x49\x20\xdc\x41\x85\x07\x4a\x01\x36\xcb\xfc\xa9\x1a\x5f\x06\x0c\xa3\xb5\x05\x34\x0f\xdf\xcd\x34\xc0\x83\xc7\x9e\x20\xe6\xbe\xc1\x2e\x98\xdc\xec\xe8\x8d\xc7\x61\xec\xd9\xc4\xf1\xa5\x86\x1e\xe7\x31\x03\x61\xb0\x6c\xb9\xc4\x3d\x89\x3f\x0c\x3f\x47\x1a\x20\xbd\xf1\x53\xfe\x5e\x9c\xe4\xeb\x1f\xa3\xd4\x9a\x6b\x15\x47\xc4\x91\xd9\x60\xdd\x23\x73\xda\x27\x1d\xfe\x62\x2a\x24\xb4\x86\xd3\x9b\x23\xf6\x68\x6f\xbc\x89\xa6\x28\xce\x7a\xde\x2c\x9f\x76\x3f\x1f\xb7\xcb\xe9\xd9\x92\xa7\xda\x14\x6e\x57\x20\xcb\x82\xa4\xd2\x46\xc5\x79\xce\xac\xeb\xf2\x01\x32\x22\x10\x58\x1a\xb3\x3e\xb5\xdb\x69\xce\x80\x59\xc1\x71\xda\x6f\x6e\x8b\x79\x51\x8e\xd0\xf0\x9c\xc7\x3e\xb1\xe6\xad\x86\xf3\x00\xbb\xc9\x79\x9c\x72\xeb\x31\x5b\x15\x7b\x9b\x45\x36\xba\xb5\x4d\x30\x34\x5c\xa4\x38\x4f\x13\xde\x39\x05\xdc\x17\xef\xb8\xa9\x8b\x92\x74\x69\x49\xbf\xae\xc5\x96\x8d\x82\xf0\xc1\xf8\xe5\x29\x27\x61\xa1\xce\x4a\xf1\xee\x9f\xdb\x41\x2f\xe7\x2a\x64\xba\xfd\xa2\x73\xac\xe7\xe7\xf9\xe8\xa1\xc0\xe7\xb1\xb2\xdb\x8e\xd9\x24\x69\xc3\xcd\x97\x5f\xa1\x6e\x38\x84\x40\xea\x88\x58\xbf\x62\xb9\xc9\x72\x89\xbe\xe7\xb9\xdb\x00\x21\x42\x27\xb9\x0f\x9f\xf6\x55\xc0\xb8\x76\xcc\x41\x46\x89\x73\x9e\x6b\x03\xc7\x71\xfa\x76\x12\x27\xc4\x45\x18\x58\x28\x6b\x13\x50\x76\xa9\x4b\x2e\xd0\xa8\xa4\x77\x06\x24\xef\xfc\x3b\x54\xaf\x3b\x7b\x3d\xd7\x4e\xfa\x89\x13\x69\x5a\x1b\xd0\xd5\xfc\x74\x1e\xc7\xad\x5c\xfa\xcc\xac\x2d\x3d\x1b\x8c\x35\x96\xcb\xed\xf7\xf6\x3a\x41\x42\xbc\xa6\xff\x97\x65\xee\x4f\x4a\x32\xad\x1d\x3d\x7f\x75\xdd\xf8\x78\x38\x09\x28\x85\x89\xb1\xd9\xcf\x33\x9a\xcf\x27\x52\xb7\xa3\xf9\x1c\x75\x44\xa1\xb0\xf3\x9d\x2a\x74\xb6\xc7\x99\x28\x4e\xf5\x6a\x88\xce\xe2\xda\x93\xa9\x9d\xd1\x1e\xb5\xb6\xf6\x34\xcb\xfa\x75\xf4\xb8\xda\xd7\x04\xd5\xaa\x5f\xb3\xea\xae\xba\xed\x60\x17\x5c\x07\x9e\xa7\x3b\x31\x84\x31\x9e\x8c\xe4\x34\x6d\x98\xb6\x53\x50\x83\x80\x0a\x77\x8e\x54\xcb\xc1\xf3\x99\x33\x28\x6a\x3e\xc6\xb6\xb8\x85\x7d\x35\x0a\xf5\xc0\x8b\x12\xc2\xb7\x7c\x80\xd5\x01\x18\xcb\x96\x71\xf0\x44\x2c\xad\xc9\x76\x13\x79\xd9\x8d\xf5\xff\xf0\xff\xfd\x9f\xc4\x16\x5e\xc1\x07\x93\x7d\x12\xa7\xfd\x9b\x11\xd4\x7f\xc1\xfb\x6e\x4b\xd4\xc4\x85\xd8\xa2\x68\xe6\x7e\xf7\x67\x09\x5d\x46\xb4\x97\xdb\x87\x20\xd1\x44\xed\x9c\x9f\xce\x76\x4e\x1b\xbc\x34\x08\x3d\x4f\x27\xad\xf3\xe9\x0b\xde\xdd\x8c\x1b\x80\xb1\x61\xf9\x3e\xff\x73\x22\x25\x08\x51\xca\xe9\x86\xee\xd6\xcb\xc1\x60\x86\x48\x46\x14\x47\x53\x42\xb5\xcf\xa1\xe7\x10\xa1\x82\x81\x46\xb9\xe3\x33\x58\x69\xa9\xe1\x0d\xc4\x89\xd2\x0e\xf5\xfc\x80\x1f\x54\xa1\xc0\x92\xa2\x6d\x12\xf1\x9e\xdd\x59\x57\x53\x77\xf9\x18\xcd\x66\x9f\x00\xcd\x06\xf3\x7d\x5d\xf7\xc9\x9e\x93\xb0\x90\x84\x84\x8e\xc5\x7e\x6f\xc1\xb3\xed\x5a\x08\x09\xd3\xb1\x65\x65\x53\xa9\xc9\xb7\x93\xa9\x19\x19\x2b\xf8\x1c\xdd\x31\x25\xd4\x7b\x95\x9e\x12\xad\x4b\xdc\xc5\xb6\xb4\xcb\xd2\x39\x38\xe6\x60\x8c\x40\x1a\x1b\xff\x13\xb2\xf1\xfa\x0b\x81\x1c\x8c\x8c\x2a\xbc\x01\xc7\xb4\x44\x2f\x60\xd2\x18\x61\xda\x9a\x98\xf5\xe2\xb1\x07\x39\x26\xa2\x33\x66\x5c\x8f\xaa\xfa\x83\x9f\x84\x40\x72\x6d\xe1\x56\xab\xd3\xbe\x7e\x28\x5c\xe9\x0c\x00\x42\xd6\x49\x02\x12\x33\xb8\x85\x45\xdb\x78\x6a\xd8\x39\x40\xa4\x84\x08\x74\x81\xf8\xc3\x48\xd8\x92\x03\xa8\xd0\x11\x6f\x9b\x28\xdd\x95\x14\x86\x8d\x84\xe7\x39\x85\xd7\x0b\x5c\xc1\x74\x5c\x0c\x22\x34\x22\xf6\xee\x97\xd7\x46\x68\x77\xe8\x1f\x39\x3a\x25\x35\x5c\xd4\x66\x12\xb0\xb8\x87\x9d\x38\xef\xb2\x2b\xdb\x1e\x10\xcc\x84\xde\x0e\xc7\xbd\x5b\x3d\x3e\x6c\xbf\xdf\xff\xf5\x47\x7b\x1c\x63\x1a\x19\xd5\xdd\xe2\xf1\xa1\xa8\x87\xd4\x3b\x10\x9c\x11\x74\xed\xc3\xda\x7d\x3e\x61\x75\xda\x53\x08\x12\xb5\x4d\xd0\x78\xf8\xb9\xfa\xa3\xc6\xb2\x84\xbd\xe1\x5a\x0d\xef\x45\xc6\x66\x43\x6b\xb2\xba\xbd\x34\x31\xa8\x38\x51\xd6\xb1\xfd\xb3\xbe\xcd\x74\xd1\xac\xdc\x60\x04\x1d\x87\xd7\x50\xca\xf7\x43\x97\x4f\x9f\x43\x2e\xfb\x1e\x85\x17\x88\xca\xe1\x87\x56\x4a\x50\x7c\xda\xb1\x12\xfe\x96\x32\x2a\x07\xb4\x76\xa0\x6e\x03\x35\xcb\xeb\xec\x3f\xe3\x6d\x34\x68\x2f\x21\x26\xbd\x09\x0c\x66\xfb\xbd\x33\x2a\xfb\x0d\xd4\x52\x78\x91\x59\x4f\xab\x0f\x28\x29\xc3\xe3\x76\xf1\xee\x38\x08\xb4\xe9\x6c\xa0\x51\xe5\x4c\x4c\x06\x48\x3a\xe1\x47\x11\x41\x79\xc8\xb0\xe3\xb5\x2c\x3e\xaa\x85\x43\xf8\x3e\xa1\xd9\xae\x3d\x14\x75\x4f\x69\x96\x8b\x80\x1b\xfa\x50\x05\xb6\xf6\x63\xf3\xbd\xb7\x45\x69\x47\x68\x9f\x60\x2c\x42\x3f\x26\x98\xc3\x6d\x51\x36\x51\x18\x96\x37\x8e\xca\xff\xd5\xb4\x25\x22\xdf\xa7\x34\xea\xcd\xf2\x7e\xe6\x3a\x9e\x88\x78\x40\x5a\x42\x1f\x48\x0e\x12\x77\x9d\x4f\x90\x6b\x00\x3e\x36\xfd\xea\xe1\x79\xb5\xdb\x6c\x67\xdf\x96\x0e\xfb\x26\x62\x8e\x69\xdc\x95\xfa\x7a\x65\x44\xd7\x40\x8b\xd8\x69\xc3\x91\x86\xe6\x05\x96\x5a\x24\x51\x68\x4b\x3d\x0f\x37\x9b\x61\x95\x47\xa4\x3e\x7a\xa6\xee\x29\xf6\x2e\xbf\x30\xec\x86\x22\x0d\x7c\x8a\xf0\x54\x81\x15\x41\x60\x97\x9f\x3d\xc0\xb5\x6b\x24\x4d\x59\x88\x98\xe1\xc7\x1a\x9a\xa7\x1c\xa9\x44\x70\xc1\x74\x48\xea\x92\x96\x83\xb7\x58\x3e\x34\xcf\xba\x73\x0c\x2f\xc1\x23\xa9\x29\x07\xed\xca\x2c\xc3\x78\x76\x22\x86\x9c\xfc\x14\xee\xbf\x6d\xc2\x5a\x70\x91\x9a\x48\xd7\x7c\xc3\x60\x3a\x77\x23\x38\x72\xa7\x35\x3d\x3f\x19\xe1\x6a\x03\xe3\xbc\x16\x72\x0a\xf0\x34\xda\x4d\xa2\x01\x6f\xd1\x2a\x38\x8a\x66\x04\x84\x92\x5e\xb2\x31\x28\x5d\x96\x9f\x56\x78\xde\x94\x86\x9d\x61\xa9\x6b\xcc\x9c\xdf\x6d\x5d\x66\xe8\x5c\x8b\x6e\x8b\xf2\x27\xe4\x59\x3d\xd4\x13\x10\x00\x11\xf1\x3f\x7b\xda\xb7\xd7\x85\x34\xb8\x10\x91\x32\xce\xfd\xce\x7b\x6a\x50\x57\x16\x02\xd2\xc0\x79\x0d\x98\x82\x62\x13\xa1\x8c\x36\x5d\x42\xfa\xc6\x5b\xbc\x19\x7b\xb7\x90\xed\x77\x8a\x76\xcf\x46\x9e\xde\x5d\x4a\xc6\x7e\x68\x23\xb4\x6f\xdf\x96\x93\xa9\x3a\x21\x95\x68\x4d\x1a\x89\xd9\x71\x61\x9d\xc5\x85\xf2\x7c\x57\x53\x7d\xef\xdc\x72\xb9\x50\x61\x44\x74\x04\x85\x02\xea\xd6\xe2\xe6\x2e\x5f\x65\x39\xb1\xc7\x5d\xb3\x08\x29\x6b\x6f\x0b\xf2\x1b\xdc\xef\xdd\xeb\xbe\x62\xcf\x3c\xfa\x79\x15\x2b\xeb\x68\xb6\x69\x93\x13\x42\x69\x15\x1a\xf1\x81\x96\xe8\x90\xe1\x55\xdd\x11\x2e\x30\x36\x93\x9e\xe1\xca\xec\x96\xb3\xa7\xfb\xbf\x76\xf3\xd9\xe2\xc7\xb2\x25\x1b\x09\xc4\xd6\x9e\xac\x53\x33\xad\x26\x78\xc6\x02\x75\xec\xa7\x5d\xce\xf6\x51\x3f\xe6\xb7\x45\x69\xaa\x30\x5f\xd8\xd8\x70\xe9\x73\x15\xb9\x22\xeb\xa9\x96\x85\x4d\x42\xf4\xd5\xd9\x87\x3f\x25\x7d\x30\x1c\xa2\x66\xf7\xf3\x1d\xa1\xac\x05\x82\x7b\x0b\xd2\x57\x40\x45\xd6\x6f\x58\xaf\x20\xcf\x34\x56\x75\x31\x3f\x2f\xa0\xc6\x97\xa2\x1c\xf6\x53\x19\xf8\x81\x0b\x6a\x9f\x2b\x2c\xaf\x24\x6f\x65\x10\x47\xc2\x0d\xa7\xcd\xda\x14\x4f\x4b\x17\xa5\xca\x20\xf1\x51\x75\xce\x46\x46\xc2\xd0\xfe\x5e\x86\x97\xc0\xb9\x93\x0b\xe1\xec\xf9\x61\x68\x36\x52\x9b\xe2\x80\xa3\x2d\xbe\x8c\x7c\x3f\xb4\xd7\x7e\xc0\x8f\xf9\x49\xbd\xe0\x65\xc2\x64\xb2\x8f\xc8\x28\x61\xb4\xd4\x53\xaa\x6a\x5a\x56\x43\xc6\x32\x08\xf8\xd0\x5d\xdf\x7c\xaa\x7b\x68\xfe\xd4\x5b\xb3\xe8\xcf\xbd\xd2\xb3\x8c\x75\xe8\x12\xc5\x66\xb4\x36\x0b\xd6\x35\x77\x26\x2e\x93\x30\xa2\x95\xf9\x09\xb4\xde\xa3\x89\x6f\xb1\x9e\x17\xc5\xdb\x64\x1e\x5a\x26\x10\x2b\x83\x0e\x29\xb3\x77\xdc\x55\xaf\xd0\xec\x6a\xa7\x9b\x6a\x9f\xa6\xef\x76\x7a\xee\x93\x77\xa7\xf3\xb8\x32\x8d\xbc\xb0\x1f\x70\x6e\xf2\xe2\x43\xef\xe1\xcd\x11\xd1\x7f\x9b\x09\x96\xa9\xf4\xa9\x7a\x71\xd8\x15\x86\x48\xd7\x85\x01\x32\xc5\x90\x99\x59\xc0\x6c\x38\xee\x16\x8f\x1d\x0a\x77\x78\x19\x96\x32\x1a\x35\x87\x2c\xcf\x0e\xa7\x83\x23\xf6\xb8\x2b\x31\x9e\x4e\xf9\x8c\xa0\x1a\x97\xb3\xdb\xde\xc4\x44\x48\xc6\x54\x45\xeb\xc7\x37\xfa\xe6\x4c\xa6\xb4\xa8\x93\xca\xae\x8b\x15\x6d\x14\x71\x65\x84\xf2\x40\xc6\xd0\x13\x28\xa2\x36\x26\x0c\x97\x6f\x17\x30\x4d\x09\x5e\x40\xb3\xd3\xd7\x25\x77\x09\x7e\x42\x10\x01\x7c\xc7\xbc\xbe\x2f\x5e\xbe\x77\xdb\x57\x29\x22\x9f\x76\xd2\x4f\xc6\xf6\xac\xad\x74\x4b\x21\xbc\xc8\x6e\xf1\x97\xb9\x5c\x9f\xc4\x1b\xb6\x03\x51\x28\x8f\x92\xff\xab\x2c\xaf\x8d\x19\x7d\x85\x17\x74\x6c\xdb\x56\x82\x54\x91\xf3\x0e\xa7\x55\x34\xba\x72\x9b\x2a\x56\xda\x3a\x07\xd9\x65\xe9\xeb\x71\xa7\x12\x9f\xd4\x30\xc8\xa2\xb7\x17\xe9\x49\x65\x51\xbc\x16\x5f\xdc\xa3\x06\x8f\xfa\x04\xea\x28\x31\x09\x8f\x7d\x01\xaa\x0b\x34\xec\x61\x9d\x02\xa1\xf0\x0e\xdd\xf6\xce\xfe\x84\xf2\xfc\x80\xb6\x81\xb2\xc8\x25\xd4\xcf\x77\xe3\x75\x4b\x79\x01\xb7\xba\x08\xea\x0a\x04\xff\x1f\xa3\x13\xc2\xd4\xe9\xf1\x3e\xdc\x6e\x27\xa7\x47\xe5\x89\x98\xb6\xf6\xe2\x74\xbe\xcb\x0d\x8e\x6f\x7a\x2b\xa4\x3c\x0c\x43\xd9\x4f\x01\xd3\x7f\x89\x4f\x5f\x8d\xef\x14\x35\x33\xa1\xfc\x7e\x3f\xcb\x55\xb3\xa2\x53\xd8\x95\x99\x29\x69\x7e\xfe\x17\x96\x2e\xc3\xad\x7c\x9e\x90\x60\x9c\x84\xdc\x18\xc6\x8c\x76\xae\x6d\x33\x49\x65\xe9\xf9\xcd\x66\xd5\x9e\xaa\x7c\xb2\x5c\x38\x16\x55\xfd\x8d\xc4\x01\x86\xe9\xc1\xa9\x29\x47\x05\x5e\x4a\x18\x88\x15\x54\x55\xf6\x8e\xfb\xb3\xe5\x44\x37\x8f\x54\xe4\xfb\x2c\xc7\x9f\x99\xc2\xa2\xd9\x5b\xbb\x35\x5f\x05\x91\x41\x18\xef\x33\x8d\x9d\xa6\x2c\x57\x41\xac\x29\x1f\x64\xf1\x02\x64\xdf\xd5\x43\x20\xfe\x3d\xbc\xb5\x0a\x38\x0b\x5b\xff\x23\xda\xf9\xf5\x7e\xd9\xc2\xe0\x28\x17\x31\xb8\xa7\x90\x19\xbf\xb3\xdb\xbb\x87\xd9\xfd\x6e\xb6\xba\xdf\xdd\xcc\xb6\xcb\xf6\xa8\x08\x68\x63\x9a\xe3\xc7\xcf\xe2\xb3\xfd\x2b\x9a\x40\xf0\x90\xd9\xf7\xdb\xe6\xad\x54\x84\x01\x51\x3f\x77\x15\x68\xdc\x38\x15\xef\xe9\xae\x10\xe9\x80\xa2\xff\x42\xeb\x4c\x66\xb0\xef\x64\xc6\xb8\x8a\xfd\x84\x20\x14\x86\x55\xb5\xfc\x44\x79\xaa\x8b\xb2\x13\x4a\x72\xcd\x92\x98\x92\x59\x72\x5f\x54\x68\xd5\x52\x6d\xd6\xe7\x08\x65\xa7\xfd\x34\xbd\x17\x55\x31\x53\x91\xdf\x4d\xbd\xfd\xc5\x8b\xb2\x37\x71\xfb\x3b\x3a\x74\x69\x3d\x83\xb1\x6c\x6e\xe2\xd2\x30\x92\xab\x24\x30\x8c\xa0\x12\xdf\xb1\xac\xc7\x20\x81\xff\x1b\xf9\x50\x25\x82\x99\x05\x26\xcb\x6b\xb3\xcb\x74\x59\x3c\x95\xfa\x06\x87\x4b\xc5\xbc\xb2\x13\x6b\x9f\xd1\xcc\xd2\xa5\x8d\x5c\xf3\x34\xa5\xda\xf3\x1e\x75\xcd\x83\xd1\x3d\xa7\xcd\xd6\x9f\xec\xa9\x72\x3c\x6f\x4e\x87\x59\xbd\xc1\xba\xde\xe3\x94\xee\x77\xfb\xef\x97\x37\xce\x52\x10\xb6\x1c\xb3\xdc\x7e\x7f\xde\xdc\x4c\xbd\x2a\xc6\xe3\x34\xee\x7c\x0c\xcc\x06\xcf\x1e\x03\xdf\x88\x27\x3c\x14\xb9\xc4\x6d\x36\xc6\xbc\x2a\x48\x12\xbb\x19\x37\x8b\xd7\xba\x2c\x0e\xd9\xbe\x0d\x4d\x14\x20\x13\x5e\x37\x75\x98\x7a\xc5\x2e\x9c\x06\x0b\xdb\x73\x84\x17\x53\x10\x7a\x22\x3b\xe7\xc3\xc4\xe4\x21\x30\xa4\x39\x66\x53\xe3\xf1\xf6\x94\x4f\xe2\xc2\x46\x17\x95\x28\x92\xd6\x4c\x21\xcb\x67\x2f\x97\x3c\xab\xe1\x09\x2a\xf4\x03\x57\x2a\xe8\xc7\x53\x05\x85\xdd\xa3\x1b\x52\x51\x1c\x44\xce\x40\x88\x48\xa5\x5f\xae\xb7\x4a\x01\x58\x76\x52\x85\xf5\x3f\x4f\x45\x9b\xfb\x51\x0a\x15\x0d\x69\xa7\x1a\xb7\xf9\x7d\x90\xf9\x7f\xec\xcc\x18\x1a\x03\x1f\x53\x87\x20\xac\xea\x73\x76\xf1\x8a\x31\x32\x85\xe6\x87\xac\xbf\xe6\x2b\x54\x46\x2e\xd4\x68\x88\xa3\x81\x61\xb4\x3a\x83\xae\x95\x0e\x13\xa2\x98\xe9\x32\xc3\x5c\x55\xcd\x7c\x30\x1a\x07\x1a\x90\x42\x56\x4b\x3f\xb7\xab\x79\x7f\x43\xa0\xb4\x4c\xa8\xc9\xd6\x82\x5b\x9d\xe4\x11\x65\xca\xbf\x32\xd2\xfb\x3b\xff\x0e\xee\x06\x3d\x3f\x75\xb6\x01\x37\x84\xb1\x86\x1a\x95\xf1\x19\xb2\x98\xa9\x9b\x13\xc1\xa6\xaa\x1a\x0e\xc7\xe1\x9b\x42\xcf\x47\x8a\x79\x95\xb3\x17\x7d\xfc\xe8\x76\xb9\xe8\x61\x48\xa2\xb4\x59\xde\x11\xd1\x87\x3f\xee\xfb\xc6\xe6\x3d\x27\xab\xfe\x3e\xd8\x0b\xfd\xd8\x64\x44\x35\x0e\x93\x5b\xe8\x8b\x98\xb8\xc0\x0f\xf8\xd1\x4f\x49\x61\x10\x08\x87\xac\x72\x9b\xd8\x61\x2d\xed\x1f\x53\xd8\x37\x0c\x22\x11\xd9\x5a\xca\xa2\x04\x61\xb6\xf4\xc3\xa7\x0c\xe2\x58\xf2\x36\xee\xfc\x5e\x94\x15\x3e\xfe\x7a\x18\x37\x92\x9c\x98\x7a\x12\xf2\x27\x94\xef\xcb\x26\x46\x20\x7d\x75\x7b\x3c\x11\x46\x03\xb5\x3a\x40\x59\x3f\xe7\x54\x2d\x9b\x8c\x63\x30\xc1\x84\x7e\x0e\xac\x80\xd9\xba\x38\xb6\x79\xe0\xcd\x6b\x71\xda\xab\x55\x96\x8f\x26\x32\x4c\x59\xc4\xbb\x7b\xec\xd9\xdf\xb8\xe3\x3c\xa6\x70\xb0\x46\x38\x58\x33\xb3\x36\x17\x8f\x29\x20\xa5\xa7\xb2\xa3\xae\x5a\x8d\xb9\xfb\xa2\x78\x6b\x11\x99\xc8\x82\x98\xf8\x2f\x9b\xe2\x94\x2b\x91\xf5\x7d\x88\x39\x32\xc5\x8c\x69\xa0\xea\x1b\x5b\x73\xe4\x3e\xe7\x2d\xe4\xbb\x3e\x95\xf9\xa5\xb1\x2b\x47\x1e\x26\xda\x54\x99\xac\x76\xe7\xb9\x3d\x5d\x02\x2d\x78\x5d\xdd\x85\xfc\xd2\x6e\x8b\x72\xfa\xc5\x81\x9f\xd2\xd0\xb3\xf9\xe7\x0b\x88\x1f\x02\xf3\x68\x91\xf9\xbe\xbc\xfb\xf6\xdd\x25\xf9\x10\x24\xa3\x7c\xc5\x0e\x0f\x59\xfd\x58\x82\xdc\x37\x7b\x0b\xa7\x43\x15\x8d\xfa\x0b\x28\xe3\x5b\xd8\xc6\x78\xe6\x6d\x3a\xcc\x18\x8a\x44\x51\x04\x34\xcb\xf3\xec\x35\xdb\xc3\x54\x4a\x74\x78\x57\x42\xa4\x2e\x4b\xb6\xe8\xf9\x5c\x0e\x83\x1a\x94\x32\x24\x22\x44\x96\xb7\xa2\x9a\x83\x34\x1a\x2a\x5f\x10\x36\xb4\x59\x6e\x9a\x3d\xbc\x5b\x1c\x7e\x66\x70\x97\xe7\x58\xba\x3c\x22\x2a\x66\x9c\x20\x49\x93\xfb\xaa\xc0\x41\xdb\x18\x68\xa3\x73\xff\xf4\x63\x98\x27\x1f\x35\x53\x91\x51\x92\x80\xfd\x7e\xb9\x47\x79\xb9\xf5\x46\x8d\x01\x15\x7c\xaa\x66\xd0\x1a\x87\xca\xf6\x48\x44\xdf\xcd\x6d\x9c\xad\x09\xeb\xe0\xbd\x6b\x8f\x45\xc4\x30\x39\xec\x7a\x9a\x7f\xda\x83\xd8\xfc\x35\xcb\x8d\xf5\xcc\xf4\xa2\xa3\x7d\x4f\xa2\xef\xcc\x5a\x9e\xee\x9e\xaf\x35\x0b\x62\xaa\x91\x9b\x4a\x98\x4d\x28\x94\xc5\xa1\x4f\xfc\xd5\x7e\x1a\x92\x17\xf3\x07\xbc\xe3\x02\x8e\x51\xfb\x77\xc6\x93\x74\x20\xe8\xde\xec\x16\x88\x24\xf9\xf8\x38\xef\x5a\x09\xc2\xd2\x3f\x75\x7f\x0a\xbd\x88\x80\x23\x22\xbb\xe8\x2a\x97\xca\x27\x3a\x0c\x43\xd2\x40\xcc\xf1\x73\x90\xc2\xd7\x61\xcc\x58\x87\xf8\x9d\xef\x8b\xe2\x70\x9b\xed\x6b\x57\xe5\x1f\xd3\x7e\xbb\x0b\xda\xc5\x66\x55\xbc\x67\xad\x51\x38\xd7\x91\x87\xe4\x84\xa7\x4d\x8a\xbf\xb5\x96\xea\x52\xb3\x53\xd2\x42\x3a\x4a\x8c\xdf\xe4\x29\xcf\x64\x51\xe6\xa3\xb9\x54\x47\x80\x44\xc8\xbc\x9f\x6d\xd7\xfd\x4b\x7d\xb9\x6e\xeb\x24\xe1\x14\xd1\x1b\x7d\x69\xb3\xf2\x0e\x92\xb3\x3a\x11\x69\x62\x53\x68\x9b\xd3\xe1\x2e\x9f\x9f\xef\x8d\x5c\xc5\x1f\xa7\x1e\xfd\x4f\x33\x4f\x44\x30\xd0\xc8\xbb\x16\x0a\x0d\x87\xbd\x66\x9e\x4c\xed\x89\xb6\xf4\xdb\x01\x3d\x35\x8b\x3c\x9a\xa8\x56\xd9\x4b\x09\x3d\x36\x8a\x3b\x8c\x9a\x90\x03\x7a\x7f\xaa\x5e\x3b\x34\x83\xe6\x51\x40\xea\x56\x0f\xf8\x71\x53\xc2\xc7\x13\x82\x3a\x6f\x8b\x75\xcf\x2b\xf5\x9a\x69\xae\xbb\x40\x6c\x7a\xdc\xfb\x21\xcb\xa9\x8b\xae\xb1\x74\x15\xa1\xf6\x47\xb8\x47\x9d\xeb\x15\x2a\x2a\x16\x18\x60\x69\x3f\xda\xd0\x1c\x14\x85\x7b\xf2\x15\xca\xbe\x89\x35\xd7\x10\x48\xe8\xe0\x9a\x2e\xa1\x31\xa9\x12\x3a\xbc\x33\x01\x8a\xd4\x1e\x77\xb6\xa6\xf0\xb8\x57\x57\x70\x19\xc3\xd7\x2c\x00\x29\xe7\xb0\x33\xd6\xe3\x17\x76\xae\x5c\x0b\x2d\x29\xe5\x7d\x3a\xbe\x94\xa0\x70\x53\x97\x27\x49\x3a\x57\xc3\x66\x32\x8c\x08\xcd\xad\x9b\x88\xde\x48\x02\xde\x3a\x15\x70\xf7\x6a\x64\x1c\xfb\x5f\x30\x8e\x06\xef\x48\x0a\x9d\x7a\xce\xf0\x9b\xde\x80\xe3\xa2\xd8\x06\x2a\x8d\x69\xbb\xf1\xed\x79\xfd\x45\x8d\x41\xa3\x67\xdc\x62\x2b\xac\x2f\xf8\x7d\x5a\x07\x8a\x98\x6b\xdb\x47\xb7\x38\x69\x0d\xa6\x6b\x11\x80\xe2\x0b\x5f\xad\xa6\xa5\x61\xb6\x6e\x6f\xfe\xfb\x5b\x74\x22\x78\x9e\x02\x96\x5a\xbd\x37\xc2\xe2\x0c\x93\x4a\xb6\x95\xef\x03\x69\x59\x1d\xb2\xfc\x89\xb0\x3f\xeb\x32\x7b\xcf\xf6\xf8\x62\x0d\x60\x5c\x33\x16\x3a\x04\x43\x40\x84\xef\x7a\x7c\x1d\x91\x10\x66\xbe\x37\xaf\xfe\xad\xc8\x7e\x5a\x7e\x1a\x3c\x5f\x7b\xa4\xbc\x5b\x7d\xc0\xb1\xc7\x54\x03\x2f\x08\xcc\x01\xe3\x88\xd8\x03\xc8\x55\x6d\x0b\x96\xf0\x56\x06\x63\xe6\x2a\x3d\x4b\x33\xaa\x47\xb7\x1d\x06\x21\x09\xa7\xaf\x4e\x55\x66\xd4\xda\x7b\xe3\xba\x39\x1c\xd1\x42\xba\x23\x19\xee\x62\x3f\xc9\xd3\x6e\x9a\x41\x68\xfc\xf1\x9b\x30\xba\x19\x7e\x97\x74\x93\xae\x69\x1a\x8e\x95\x7f\xab\x15\xe4\x27\xd8\xef\xcf\x93\x5a\x1a\xe0\x85\x08\x54\x3f\x75\x2a\xf7\x1d\xa3\x0b\xbc\x88\x29\x25\x2e\x48\xbc\x8b\x66\xa0\x4f\xec\x3f\xc1\x8b\xb8\xa0\x8c\xd2\x4e\x9c\xce\x14\x8e\x5d\x79\xa6\x38\x32\x29\x16\xb3\xd6\x7c\x39\x19\x80\x97\x24\x31\x44\xfd\x38\xee\x5b\xb1\x37\x6c\xbb\x51\x3b\xa1\xe9\xd3\x60\xfe\xef\x2c\x6f\x86\x7e\x0f\xf3\x6f\x9b\xa4\x1e\x23\xb4\xc7\x82\x88\xf9\xdd\x57\x65\xc2\xf8\x8d\x34\xc3\xca\x05\xc7\xbe\xbb\x2e\x0f\x90\xb0\xaa\x2e\xbe\xf8\x62\x18\x81\x07\xd6\x52\x8e\x06\x1c\xc9\xa7\x8e\xee\x12\xa4\xef\x1b\x8a\x9f\x38\x16\x1f\xc1\xe4\x38\x07\x4f\xc4\x1e\x29\x2a\x1c\x33\xf9\x76\x5b\xf4\xb0\xe8\xd7\x77\xff\xe0\x09\x9e\x10\xcf\xf2\xee\xed\x54\x42\x8f\xfb\x7e\x55\xf4\x60\x78\xba\x0c\x19\xad\x27\xfb\xec\x0d\x67\x65\x3d\xde\x6e\x81\x27\x63\x2f\xb1\x7b\x9d\xde\xd0\xc0\x6a\xf6\x47\xdb\x20\x0d\x6c\x46\xe7\xbb\xd5\xf6\xb9\xd2\xe9\x24\x4b\x43\x8b\xa2\xed\x2d\xe3\xbd\x55\x11\x3c\xa9\xe2\x00\x9d\x74\xdc\x4e\x16\x87\x43\x56\x55\x59\x91\xef\x9a\xb6\xef\xd0\x62\x4b\xc0\x53\x9e\x4f\xb5\xb2\x2c\x7f\xcf\x2c\x70\xe4\xf2\xa1\x5d\xdb\xd0\xd8\xb3\x54\x0e\x21\x58\x6d\x0b\xab\xb2\xd4\xf6\x06\x95\x32\xca\xef\x76\x59\xf7\xbf\xa7\x22\x76\x6d\xab\x3c\xba\x05\x4c\x3c\xc2\x57\x59\xe2\xf1\x57\xb3\xed\xf8\xcc\x54\x06\x91\xdd\x85\x59\xdd\xf6\xab\x1a\x77\xe0\xe9\x54\xa4\x72\x80\x9a\x6c\x07\xf0\x7e\x60\x6d\xe0\xda\xab\xc8\x29\x52\xad\xb0\x1e\x12\x87\xc1\xf7\x3c\x4d\x8a\xec\x94\x9a\xb5\x84\xc2\x56\x97\x14\x7c\x0f\x0c\xa7\x81\xc0\xe8\x34\xf0\xb6\xc5\x48\x62\x1b\x7c\x4f\xa6\x3d\xab\xe2\xea\x1e\xf5\xa8\x8b\xf9\x9e\x8a\xd4\x78\xa6\x9f\xec\xad\xbe\xef\x87\x14\x08\xab\xc2\x2c\x2d\x56\xa1\xcb\x1e\x75\x13\x39\x59\x6d\xd2\x6e\xde\xcc\xf3\xc3\x6b\x04\x82\x51\xb8\x20\x8b\xbc\xce\xf2\x13\x7e\x33\xf3\x66\x37\x61\xf8\x61\x1c\x3a\xfd\xdf\x26\x7c\x31\x3b\xc8\x69\xb5\x17\xf0\x43\x30\x32\xcf\x2f\xd9\x3b\x3e\x65\xd5\xdb\x57\xb7\x1f\x79\x82\xf6\xfb\xbb\x6e\x56\xb9\xe6\x54\x3a\x01\x85\x01\x3f\x0a\x8c\x3e\x29\x10\x5f\xbc\xb9\xf1\x2a\x23\xdc\x1f\x4e\xee\x6e\xc1\x8f\x12\x8f\xfa\xce\xaf\xd9\x8d\x7b\xb8\x48\xf9\xa1\xdf\xf1\xc2\x2c\xca\xa7\xef\xaf\x04\x7e\x0c\x86\xa6\xde\xc1\x98\x77\x0f\x4f\xdb\xd1\x83\x27\x80\x94\x9a\xfd\x90\x75\xe0\x4e\x4c\x83\x98\x30\x04\x84\xe5\xb3\x31\xcf\x0d\xd4\xce\x7b\xbc\x69\xc0\x2d\x57\x83\x8a\x1c\xad\x6c\xe3\xe8\xbe\xb9\x48\x22\x27\x61\x74\x3a\xda\x5a\xcb\xa5\x63\xf3\xa9\x65\x65\x80\x0f\x9a\x09\x5b\xed\xf9\x8e\x65\x71\xd3\x13\xc2\x36\x10\xd5\xc1\x3f\xad\xc4\x47\xff\x9f\xa1\xca\x04\xf8\x22\x0e\x68\x03\x88\x9f\xc7\xcc\xf4\x10\x52\x0e\x71\xcf\x22\x30\x25\x53\x52\x57\x14\x2b\xf6\xcd\x3a\x55\x5e\x61\xe4\x81\x2f\xb4\x09\xdd\x2b\xac\x17\x8b\xef\x46\x89\x9b\x0d\xc7\x9b\x0c\xc1\xe1\x09\xee\xa1\xaa\x67\xeb\x3e\x81\x02\x7c\x99\x68\x02\xd7\xca\xa2\xaa\x27\x25\x93\xc1\x97\x8a\x11\x65\xba\xcd\xac\xf6\xa5\xad\xc1\x57\x2c\xf5\xed\x9a\xb7\x82\x4f\x57\x42\x1d\x85\x70\xbe\x12\xbe\xd0\x2d\x08\x72\x1c\x73\x36\xc7\x75\xe7\xd4\xf5\x86\x79\x33\x4a\xba\xdf\x40\xc1\x48\xb3\x61\x85\x37\x50\xfc\x5d\xed\x9d\xd1\x63\xa0\x14\x74\x07\x07\xf8\xfc\x5e\x1c\x51\x9f\xf6\x95\xe1\x24\xba\x1f\xd1\xdc\xd0\x34\x45\x89\xf0\x76\xe7\x7a\x6e\xe0\x25\xd6\x42\x82\x50\x74\x84\x9f\x9b\xfe\x1a\x81\x1f\x70\x65\x0a\xdd\x7b\x7c\x21\xe8\xa1\x2c\x4a\x45\x40\x2c\xb7\x26\x04\x3e\x8b\x53\x73\x17\x4d\x30\xb5\xe9\x95\x8b\x4d\x17\x8c\x6d\xbb\xc0\x4f\x08\x34\xda\xfa\x21\xfc\xf3\x84\xa7\xff\xb3\x30\xd9\xe8\x06\x83\xc4\x23\xea\x8a\xc8\xd4\x63\x3e\x2f\x11\xd5\x6f\x48\xdd\xcd\x29\x10\x59\x21\xcf\x15\x56\x15\xbc\x0c\x60\x6b\x10\x04\xc2\x68\xb2\xef\x9b\xbe\x45\x73\x48\xfb\xd5\x82\x50\x70\x93\x6b\x3c\x1d\x4c\xcd\xff\xc5\xe9\x84\x43\x10\x62\xe8\xd9\x18\xe0\x2e\x97\x27\xd1\x4c\x1c\xdf\xa1\x7a\xed\x2d\x45\xc3\xd0\xbb\x3d\x2f\x95\xba\xdd\xb8\xf4\x51\x31\xb3\x5c\x19\xa8\xf6\x70\x5a\xb5\x0e\x61\xff\x13\xff\xef\xe8\x4a\x91\x8a\x09\xb8\xba\x2a\x54\xa6\xcf\x3f\xb3\x17\xcc\x65\x36\x54\xba\x87\x20\xf6\x3c\xaf\x65\xe2\xed\x8e\x58\xee\x3e\x30\x73\xcf\x10\x47\x3e\x11\xe6\x16\xdd\xa6\x88\xd4\x44\xff\xae\xbe\xa6\xbb\x8c\xf5\x24\xab\xa8\xd2\x34\x9c\xb6\x82\xa4\x59\x3a\xc8\xb7\xb9\xaa\x8a\x7c\x17\x5f\xe9\x7a\x49\x68\xcc\xa9\x76\xd5\x7f\xc6\xbb\x9e\x20\x11\x29\x25\xc5\x9a\x49\xa2\xb9\xd3\x69\x99\x0a\x08\xd2\x20\x4a\x02\xbb\x17\xfb\x32\x57\x08\x41\x2a\x23\x4a\xfe\x18\xfb\xd5\x26\x40\xbb\x98\x48\xaf\xa9\x19\x0d\x2f\xc4\xbc\xd0\x77\x3a\x6e\xd4\x0d\x57\x90\xc3\xcb\x08\x99\x03\x01\x4b\x63\xca\xe6\x64\xb9\x2c\xa9\x16\x77\x73\x77\x73\x5b\x16\x83\x2a\xe5\xb4\xde\x18\x04\x4c\x19\x26\xdb\x0b\xd6\xff\x2c\x2d\x35\xd7\x1d\xd2\x1e\x65\x93\x4f\xb9\x51\x9b\xe9\xfe\xce\x02\xe6\xd2\x74\x94\x39\x73\x47\xb8\x1f\x7b\xad\x16\x15\x95\xe9\x1c\x46\x25\x6f\x9b\x84\xca\xb3\x58\x8a\xd9\x3e\x83\x6a\x38\x5e\x78\x64\x68\xbe\x07\xf8\x9c\xb9\xf8\xb3\x19\xde\x15\xd1\x3c\xfb\x4b\x66\xc0\x6d\x7c\x37\x7f\xfc\xfe\x6c\xb2\x0c\xd7\xbe\x1c\x44\x06\xba\xf8\x82\xf5\xce\x49\x10\xec\xc4\x79\x77\xb0\x2f\xd3\x35\x4b\x12\x42\x0d\xbb\xcc\xed\x64\x5c\x71\xe5\x43\x01\x48\x22\xb6\xe9\x7d\xf1\x81\x65\xeb\x54\x32\xba\x0f\x61\x4c\x6e\xd7\x4f\x77\x3f\x67\xdb\xa5\x41\xc9\xee\x56\xb3\x3f\x77\x8b\xd9\xda\xdd\x85\xf0\x53\xdf\x02\x3f\xf6\xe7\x9b\xac\x92\x53\xee\xde\xae\x6d\x9c\xc4\x49\xa7\x8e\x37\x50\xea\xe9\x4a\x5e\xc3\x9b\x10\xdc\x48\x72\x2d\x9f\x16\x01\xb9\x86\xb6\x26\x16\x83\x0f\x21\x7d\x90\xe8\x40\xa1\x50\xe3\xf7\xce\x95\x6c\x78\x0f\xca\x97\xc2\xa9\x3a\xde\x3d\xfc\x5c\x6e\xb6\xbb\xe5\xf6\xbb\x13\x73\x84\x40\xc5\x5e\xc0\x1c\x15\xa4\x59\x18\xad\xe3\xcb\x84\xd8\x2f\x04\xca\xe6\x3b\x36\x58\xd7\x34\xf7\xd6\x04\x8b\xd8\xcd\xcd\xff\x7f\x82\xfc\xed\xa9\x2f\xb8\x79\xe5\x6b\x28\xa5\xe9\xe6\x15\x79\xe6\x54\x54\x2d\x1a\x82\xe5\x20\x40\xc6\x1c\x15\x91\x92\x6d\xfd\x04\x45\xa0\x53\x06\x9d\x60\x0e\xa9\x80\x9b\xa4\xe6\x64\x5e\xd5\x61\x74\x21\xd0\xdc\x44\x63\xed\x1e\xfa\xb6\xfc\x1b\x99\x53\x08\x3d\x14\x46\xaa\xb5\x78\xa9\x0e\x44\x06\xea\x12\x18\xa1\xef\x09\xd2\x0f\x16\xd9\x7f\x8f\xee\x6f\x41\xda\xc2\x4e\x37\xa7\xe3\xb1\x28\xeb\xd5\xa0\x33\x87\x61\x14\x91\x4e\xcf\x6a\xf6\xf0\x7d\xb6\xdd\xce\x1e\xd6\x4f\x8f\x7f\xfe\xe5\x07\xdb\xef\xb3\x9f\xcb\xb6\x51\xec\x91\x98\x99\xad\x56\x38\x33\xc8\xc1\x37\x09\x43\xe6\x51\x62\xe4\x90\xe5\xa4\x8b\x3d\x95\x82\x0a\xa3\x50\x91\xd4\x13\xec\xf7\xc5\x47\x7f\x7f\x19\x46\xd6\x3d\xb8\xe9\xe6\xa6\x7f\xb4\xea\xf4\x10\xc6\x69\x44\x09\xc8\x23\x9c\xbf\x17\xa7\x4b\xe0\xbd\x6d\x96\xb0\x88\x20\x72\xcb\xfa\xb5\x24\x48\xa0\x3b\x3f\xe1\x26\xf8\x20\xca\xce\xa6\x57\xd5\xa6\xa9\xa0\xcb\xb0\x84\x2c\x8a\x69\x92\x87\xd2\xc4\x4f\xfd\xf7\xcb\x62\x8f\x10\x04\x36\xaa\xb4\x96\x66\xd3\x3b\xea\x90\xc5\xe0\xca\x40\xe3\x51\xfe\x8f\x21\xba\x0e\x42\x26\x3d\xc2\xac\xdd\x50\x37\xec\x14\x6d\x20\x84\xc0\xa7\x58\x2a\xcb\x09\x4c\xdd\xd5\x2d\x20\x14\x31\x38\xfd\xd6\x45\x74\xeb\x7a\x2d\x11\xb8\x15\x96\x74\x91\xcb\x8e\x17\x0a\x30\x67\xe5\xf8\x71\x5b\x94\x2f\x5d\xf9\x79\x8a\x2a\x08\xa1\x10\x4c\x4a\x97\x88\xa9\xe4\x58\x0b\xca\x25\x90\x42\xe9\x9b\x25\x7c\x77\x34\x62\x39\xc6\x31\xef\x01\x3f\xfe\x68\x1b\x24\xa9\x45\x9b\xdf\xe5\x59\x9d\x51\x6a\xeb\x8f\xde\x8d\xc9\x24\x00\xc3\x5e\x7e\xc9\xf2\x27\x23\x75\xda\x9e\x9c\xf2\x28\x26\xb3\x56\xda\x3a\x1a\x30\xe9\x68\xb7\x17\xaa\x00\x68\x07\x66\x4d\xe3\xab\x7e\x99\x19\x42\x15\x05\x84\x4f\x9c\x3d\x6c\x47\xdd\x56\xc5\x40\x3c\x5d\xbb\x70\x9a\x3b\xdf\x5f\x66\x4a\x46\x5d\x4d\x87\x82\x04\xf7\x0c\x14\x79\x0e\xd5\x28\x12\x0f\x75\xec\x53\xb9\x1c\xcc\x75\x97\xcd\x4e\xa5\x8d\xe9\x42\x9d\x1a\x37\x4e\x8b\x5c\x35\xf2\x9d\x5f\x8f\x7d\xcd\xcc\x29\x95\x15\xe7\xbe\x3b\x1c\x87\x98\x1c\x88\xbc\xd8\x8f\x8d\xfc\xd5\x6b\xcf\xf2\x1c\x22\x4f\x19\xba\x33\x99\xd0\x38\xa9\xb2\xc9\xe7\x8a\x7c\x3f\x94\x69\x07\xa1\x21\x1d\x06\x9b\x8f\x71\x41\x67\xe4\x83\x91\x5a\xff\x20\xb4\xfe\xa2\x28\x91\x32\xfb\xf6\x68\x13\xe9\x47\x1d\x72\x79\x71\x41\x55\x6f\x9a\x08\x21\x1d\xa5\x71\x5f\xb7\x45\x8e\xae\x3f\x44\x81\x60\xa4\xb2\xa4\x70\x0f\x67\x77\xe9\x30\xe2\xe0\x74\xe9\x32\x59\x16\xab\x82\x4c\x1e\xef\x1c\xca\x07\xa2\x10\x00\xd3\xb6\x70\x3e\xa6\x87\x40\x14\x2a\xc9\x5b\x2b\x3d\xc3\x0b\x9c\x9f\xef\xf1\x05\x64\xfb\x23\xb1\xc7\xa9\x82\x6d\x37\xc2\x2b\xf8\x6c\x8f\x38\x01\x32\x2b\xec\xa1\x7a\xc6\x53\x10\xa5\x1e\x77\x34\xce\xb7\x65\xfd\xba\x7e\xcd\x3a\xb5\x55\x88\xd2\xc8\xa3\xc8\xd2\x61\x83\x1d\xdb\xa2\x3d\x0e\x40\xb1\xc7\x2b\xec\xdf\xb3\xfc\x85\xb0\xcc\xef\xb0\x77\x87\x99\xf4\x08\xea\xf2\x0d\xf3\xe5\x67\x6d\xec\xd5\x09\x81\xf1\x65\x9f\x89\x78\x92\x3a\x9e\xbb\xf5\x0f\xd8\xf7\xf2\x88\x13\xc9\x79\xe6\x4e\x64\x29\x55\x45\x57\xb3\xa7\x1f\xcb\xed\xdd\xc3\xb7\xdd\xfa\xf1\xf1\x7e\x37\xbb\xb9\x71\x0b\x76\x04\x21\xa7\xb7\x71\x34\x90\xcf\xbe\xc4\x20\x44\x90\x18\x4a\xd6\xee\xe0\xd0\xef\xdf\x71\x7f\xec\x7a\x24\x28\x1e\xb1\x56\xcc\xee\x1d\x4b\x97\xbf\x1a\xde\x3f\xa0\xa6\x20\x44\x97\xc5\xe1\x09\x61\xff\xc7\xe0\xa8\xf0\x85\xdf\x55\x71\xaa\xe6\x7d\xd6\x78\x83\x2b\xac\x80\x9c\xa5\x87\x3e\x8d\x10\x89\x20\x50\x9d\x53\xef\x2d\xec\xf7\x02\xa6\x05\x17\x9a\xb6\xa9\x6e\xc1\x0e\xf9\xd8\xc6\x16\x22\x11\xa2\x04\x07\x84\x9f\x43\xee\x5c\xe7\xdc\x03\x8a\x04\x88\x65\x7a\xca\xad\x2b\xcb\xe2\x35\xdb\xab\x21\x12\x1b\x22\xc1\x80\x90\xf8\xf3\xe2\xf3\xb3\xbf\x96\x47\x82\x27\x84\x6d\x58\xef\x51\xbd\xe0\x1a\xce\xe3\xf9\x2e\x92\x89\x99\xd1\x9a\x95\x9d\xf2\x77\xcf\x79\x56\xe4\xcd\x50\x18\x3e\xb4\x8a\x84\x68\x77\x88\x66\xe8\xb7\x06\x5e\xc3\x2b\xea\x38\xe2\x8e\xeb\xb2\xf3\x76\x98\x57\xa7\x12\x37\x58\xbe\x67\x12\x1d\x3d\xc1\xc1\x10\xda\x5e\xaf\xa5\x29\x49\x3c\xe1\xe1\xec\xbe\x7e\xec\x05\x71\xca\xda\x51\x56\xec\xd5\x63\xee\x80\xc1\xae\x05\x86\xb4\xa7\x5d\xc3\xd9\xe8\x7d\x5e\x95\x02\xb6\x27\xf8\x91\xa2\x64\xfa\xd3\xb2\x6f\x37\x07\xb1\x2f\x38\x99\xbc\xc8\x4b\xd5\x2c\x88\x83\x50\x92\xc0\xba\x2d\x5b\xde\x16\x65\xdf\x12\xc3\x36\x0a\x53\x9f\x5e\x50\x8e\x9f\xf5\x36\x6b\xbb\x68\x1c\xa6\xe8\xc4\x75\xac\xd7\x79\x26\xf6\x38\x80\x1d\x0e\x47\x5b\x1c\xf2\x40\xa5\xbd\x7a\x8f\xfa\xd6\xee\x85\xe2\x10\x04\x25\x64\x9b\xa9\x94\xd4\xbe\x3a\xda\x03\xc4\xa1\xe6\x54\x16\xb4\xa2\x0e\xdb\xcf\xf1\x83\x44\x3c\x0c\x64\x47\xed\x99\x8a\x2e\x87\x27\x24\xbe\xa4\xda\x23\x29\x32\x3f\x61\x75\x3a\x20\x69\x54\x74\x87\x0d\x23\x97\xc0\x0d\x9d\xa7\x01\xc4\x09\x37\x8c\xec\xbb\xc5\xe3\xee\xdb\xe3\xec\xbe\xfd\x3b\x44\x4c\xd8\xea\x98\xc9\xf0\xae\xb2\xe6\x29\xf7\x8e\xe6\x0b\x71\xea\x09\x0a\x02\xee\xf2\x6f\x4f\xa8\x32\x97\xd1\x77\x87\x59\xac\x21\x74\x39\x80\x6a\x8d\xe5\x2f\xcc\x02\xcf\x1d\xe5\x49\xe4\xec\xa3\xe6\x50\xef\x8b\x52\x3d\xe1\x7f\xda\x83\xca\x33\xd6\x53\x36\x6a\x9b\xe5\x46\x20\xa8\x20\x4c\xec\x95\x57\xc0\x95\xa4\x8c\xf4\xee\x94\x1f\x9b\x61\xfe\x92\xed\xb3\xfa\x7c\x89\x59\x82\x18\xc2\x24\x88\x7b\x06\xc8\x4f\xf8\x9f\xd9\xa1\x9d\x5a\x2f\x53\xf9\x64\x46\x65\x51\x76\xdf\xa0\xba\x2d\xca\x1f\xbf\xbe\x8f\xae\x29\xa2\x98\x32\xde\x25\x4a\xcc\xde\x51\xfd\xc2\x6c\x95\xb5\xef\x42\x08\x49\x1b\x7f\xb7\x1a\x58\x67\xdc\xd1\x35\x64\x20\x75\xd0\xbb\x2f\xb7\x66\x5c\x51\x1b\x87\x58\x46\x11\xad\x8f\x9b\xed\x96\xca\x34\x2e\xb9\x1b\x4b\x6d\xdc\x38\x7e\x65\x3a\xa3\x45\xab\x43\x42\x42\xac\xd2\x80\x96\x1e\x55\x6c\x40\x63\xd3\x1d\x7e\x51\x8e\x76\x90\x8a\x18\xbd\x5c\x05\x09\x95\x92\x75\xd1\x04\xf2\xad\x49\xeb\xb0\x11\x06\x89\x29\x2b\xe6\xb6\x4c\x6a\xff\xae\x55\x68\x32\x24\xaf\x59\xdd\x6c\xfe\xed\xdf\x13\x1f\x63\xed\xa4\x2f\x48\x2d\xe2\x02\xe2\x0b\x49\x10\x0b\xd9\xe6\x14\xb6\xc5\x0a\xf2\xf3\xf5\x9a\x4b\x12\xa4\xc6\x4f\x90\x60\xe5\x83\x77\x95\x04\x3c\x24\xfe\xe3\xfa\xfe\x79\xfb\xbc\x21\xb6\x9a\xbb\x8f\xd0\x33\xd6\x9a\xb5\x13\x98\x6c\x6f\x3d\x09\x3d\x23\xb2\xb3\x1b\xd0\x36\x4d\x8d\xab\xaf\x93\x35\x2a\x22\x0d\x7f\x3a\x4c\xbc\xc4\x3e\xa7\x51\x0b\xaa\x8c\xf6\xf8\xe8\x51\x43\x65\x98\xb4\x36\xe5\x4c\xd4\x29\x0a\x80\x9b\x77\xe6\x44\x5b\x21\x89\x42\x89\x89\x25\x72\xce\x87\xf1\xbc\x6b\x91\x72\x9b\x7d\xfb\xf5\x5a\xec\x91\xbc\xdd\x49\x1c\x69\xf8\x7b\x49\x22\x59\xd2\xe9\x54\x6c\x8b\xf5\x29\x7f\xeb\xa7\x6d\x92\x04\x12\xc2\xcc\x0a\xcc\x91\x00\xf6\xe5\x48\x3e\x06\x92\x14\xa4\x33\x47\xb2\x11\x35\xf5\x25\x77\x14\x65\x12\x76\xe8\xf8\x9d\x38\x9d\x77\x3d\xaa\x23\x24\x4c\x05\xb4\xee\x35\x93\x71\x33\x61\xad\x8b\x7a\x73\xdc\xb7\x1b\x6e\xf2\x15\x11\x66\xdd\x68\x82\xb3\x66\xeb\xe6\xa6\xae\x04\xd0\xd8\x41\x90\xa5\x40\xdd\x93\x34\x83\x44\x30\x93\xb1\x25\xc2\xd4\xdd\xe2\xb1\xfd\x7b\xd3\xfb\xbb\x47\xbe\xab\xae\x1a\x2d\xda\x13\x64\x1c\x50\x5c\x63\xc0\x82\xd5\xfd\x5f\x0f\x77\xb3\x51\xc7\x52\xa1\xef\xf4\x3b\x49\x6e\x61\x49\xd1\x83\x3d\x88\x29\x27\x76\xe4\xaf\x56\x19\x80\x9e\xe3\xb6\x28\xb7\x78\x19\x98\xb9\x93\x98\x31\x3e\x35\xb2\xf7\x48\x72\x8b\xb3\xf1\xd7\xd3\xd6\x72\xab\x24\x68\x66\x5d\x9e\x30\xd3\x56\x7a\xc5\x50\x48\x3e\xb2\xbc\x32\x9e\x6a\xe6\x8c\xd4\x8b\x14\xed\xc9\x08\x1e\xb9\x2d\x7a\xd5\xb6\xc9\xdb\x48\xfd\x88\xeb\x2e\x8b\x34\x23\x89\xf8\xe1\xb3\xa7\x64\xe0\xe9\x04\x15\x10\x49\xc3\xae\x17\x15\xa5\xbe\xd2\x66\x0b\x6d\xc1\xb0\x26\x47\xb0\x2e\x8a\xfd\xdc\x35\x09\xa2\x18\xbb\x0a\xc7\xfc\x54\xe6\xf3\xe6\xa6\xab\x4e\xa4\xd3\x35\x8c\x23\x5a\x4f\xaa\x23\xca\xe7\xbe\xa0\x16\xa4\x01\x0b\x4d\x26\xc4\x5a\xed\xdf\x96\xc5\xe1\x5b\x5f\x7a\x7f\xf2\xe3\xa6\xa1\xe7\xbb\x42\xd5\x8d\x59\xa4\xc7\xc1\x42\x1a\x26\x9e\xea\x64\x8d\x1e\xe0\x7d\xf8\x15\xd2\x90\x19\x3f\x4f\xeb\x0a\x51\x9c\x5e\x5e\xff\x76\x1e\x7b\xf4\xba\x43\x0e\xce\x9c\xdb\x5c\xed\xd9\x4e\xa3\x3d\x82\x76\xdb\x54\x12\x3d\xcf\xb2\x32\x5f\x8c\x82\x74\x27\x99\x35\x7a\x06\x85\x14\x4c\xfc\xeb\x5f\xff\xfa\x6d\xc5\xdb\x9e\x12\xc5\x92\x62\xfd\xf5\xd3\x92\x8c\xf0\x96\xdb\xef\xbb\xa7\xd9\xdd\xc6\x65\x88\xd2\x88\xa1\x34\x62\x11\xfd\xfc\x58\x1a\x71\x4e\x53\x0a\xcd\xd6\x6b\xa2\x56\xa0\x9a\x26\xbc\xd9\x33\x62\x3f\xf5\xfb\xca\xfc\x64\x8c\x54\x8e\xc4\xbe\x47\xdf\x2d\xd6\x1e\x45\xd1\x47\x28\xeb\x26\x94\x1c\xc8\x2c\x34\x87\x81\x6a\x73\xc7\xd3\x7e\x3f\x87\x2e\x2f\x62\x0f\x27\x41\x2c\xc1\xd5\xa6\x5f\x9a\x6d\x48\x51\xfe\x16\x13\x07\x69\x33\x15\xb4\xc8\x23\x37\x0b\xae\xb2\x3c\xeb\xc5\x59\x69\xca\x19\x19\x63\x2c\x73\xe5\xea\x43\xee\x08\xfa\x84\x40\xcc\x4c\x36\x64\x83\xa8\x6e\xa1\x3c\x64\xf9\xcb\x6c\x70\xf3\x2c\xf6\xb9\xdf\xa3\xa5\x4c\xe3\xee\x5c\x63\x16\x50\xc0\x50\xe2\x7f\x4e\x59\x89\xea\x5b\xb1\x57\x4e\x9f\xe6\x16\x64\x2b\x50\x0e\x29\x30\x46\xd5\xde\xab\xfe\x92\x97\x60\x50\x48\x45\xc0\xc0\xd9\x64\xef\xea\x57\xdc\xb9\x69\x7c\x57\x1a\x36\xcc\xb1\x5f\x13\x4d\x05\x67\x14\x80\xbd\x17\x35\xae\x8b\xe3\x69\x0f\xe5\xd8\x3b\x1f\x52\xa1\x8d\xb0\x9d\x41\x18\xec\x5e\x7a\xbe\xad\x13\x75\x60\xd6\xaf\x14\xb3\xeb\x86\x30\x90\x4a\x8f\xdb\xe9\x90\x3c\x1d\x4b\x2a\x11\xfc\xd1\x1e\x14\x04\x84\x7c\xfc\xf5\xb0\x13\xa7\x72\xec\xbf\x3d\x7a\xab\xd2\x43\x66\xa3\x3d\x52\x82\xed\xa0\x0b\xed\x53\xc8\xc8\xd0\x01\xbe\x07\xdf\x82\xf6\x47\x62\x1e\x91\x6a\xe4\xf6\xe7\xdf\x1d\x66\xca\x87\x14\xfb\x4c\xc6\xaa\x59\xa6\x8d\x9b\xf8\x78\x14\xab\x50\x12\x78\xe3\x36\xab\x5e\x05\xe4\x6f\x8b\x57\xac\x2e\x1b\x25\x22\xee\x68\x80\x8f\x7b\x63\x7c\x34\x21\x74\x04\xa9\x02\x63\x9e\x7a\xb3\xfc\xb9\xb8\x9f\x6d\x36\xb6\xde\xf0\xf4\xcd\x2d\x96\x29\x82\x26\x41\x98\x77\x03\x75\x79\x3a\xed\xb1\xed\xa6\x3a\x0a\x08\x20\x45\xac\x39\xd2\x4e\x33\x89\xb4\xb1\x53\x05\xa4\x5a\x32\x91\xda\x49\x16\xb2\xfd\xd9\xad\x84\xdd\x5b\x75\x28\x79\x60\x7e\xe4\x93\x4e\xc0\x1a\xca\xb2\xa8\x7b\x31\x2b\xf3\x13\xa3\x58\xd2\xaf\x26\xbb\x43\x60\xec\xab\x4d\x6a\x41\x67\x2f\x8b\x3d\x58\x43\xc2\x41\x2f\xea\xff\xd7\x7d\x48\x16\x04\x29\xd9\x76\x0b\xac\xdd\x8a\xc4\x82\x84\x8b\xc8\x24\x21\xfe\x8b\xf9\x05\xef\x05\x58\xc0\x13\x8a\x22\x76\x94\x88\xc8\xfe\x8b\xcd\x82\x36\x19\xa1\xb3\x30\x84\xc4\x3a\x8c\xdf\xd8\xf2\xf6\xc6\x14\x7b\x87\xd5\xda\x69\x2d\xbb\xe9\x5c\x24\x0b\x93\xc4\xf9\x34\xfe\xb5\xdc\xfc\x2c\x6a\xac\xe6\x67\xeb\x43\x37\x6a\x29\x8c\xd5\x9b\xa8\xcf\x92\xb6\x86\x85\x76\x4f\x19\xa1\x1f\xf5\xc4\xa8\x9f\xf3\xaa\x68\x51\xbe\xb6\x49\x0c\x92\x32\x5c\x90\x57\x1f\xc6\xe5\x15\x3a\xa4\xee\x30\x23\xcc\x62\xe5\x07\x9d\xc6\xf4\xe3\x69\xdc\x35\x59\x8c\x86\x07\xba\x34\xac\xc0\x9e\xa8\xc7\x55\x2c\xe9\xdf\x2a\xb1\xb1\x84\x85\x14\x63\x5a\xf8\xcc\xcf\xe7\xf5\xf4\xb8\x66\x09\x78\x94\xe8\xbb\x59\x2c\x66\xea\xbd\xe9\x48\xbf\x35\xa1\x07\x96\xfa\x68\x2c\xbc\x4c\x0d\xe4\x3b\x65\xe2\xdc\x0b\x4a\x75\x92\x28\x1b\x92\x64\xb0\xb7\xa5\x96\x47\xad\x47\xcf\xce\x78\x22\x6c\xa1\x71\x5d\xb4\xa0\x06\xc6\x43\xa0\x09\xb3\xaa\x8b\xe3\xaf\xa2\x7c\x6b\x05\xbb\xdc\xf1\x94\x13\x2b\x48\x95\x90\x35\x4b\xbb\x7c\x1b\xa7\xef\x5d\x43\x88\x49\x7a\xcf\xea\x9b\xef\xdc\x05\x00\x42\xfa\xc6\x87\xdd\x01\x3e\xfb\x82\xb8\xee\x38\xfa\x61\xd2\x53\xf7\x06\x59\x7f\xb9\xf2\x32\xc1\x35\x85\x90\x73\xd2\x1c\xdd\x1c\x33\x85\xe5\x3f\x4f\xd8\x6e\xfa\x99\x00\x53\xda\x30\xd3\xbb\x95\x20\xbe\xee\xe8\xf5\xf5\x97\x15\xe8\xf9\x9d\xe6\xa6\xb5\xef\xfa\x4d\x27\xb1\xa7\xca\x20\xa2\x02\x90\xb3\xf7\x90\xa7\x76\xee\x62\x92\x4b\xaa\x02\xce\xef\xb6\xab\xe7\x7f\x2d\xdb\x3f\x2b\x33\x77\x36\xd3\x7e\x91\x8f\x09\x06\xb6\x91\xf2\x0c\x39\xf7\xc9\x6c\xf3\x4b\x67\x99\x34\xbe\x9b\xd1\x59\xa1\xe1\xa9\x3e\xe7\xcd\x39\x95\x5d\xd5\xbf\x0e\x38\x98\x4a\x8d\xd5\x78\x56\xdd\x6f\x1e\x6e\xb7\xee\x36\x15\x33\x76\x01\x25\x7c\x5c\x50\x35\xa7\xdf\x05\xb2\x94\x72\x43\x07\xf8\xdc\x89\x36\x68\x66\xa8\x03\x15\x3a\x4f\xc7\xcd\x6b\x56\x2f\xf6\x45\xee\x96\x4c\xa6\xb9\xaf\x3b\x2e\x8d\xcb\x99\x5e\x43\x29\x0c\x1e\x97\x7b\x29\x50\x3a\xf0\xb9\x22\x34\x9c\x59\xcf\xcc\xb9\xb1\xdb\xaa\x73\x0f\xcc\xd6\xd0\x24\x0b\xdc\xaa\x70\x81\x80\xe2\x7e\xe0\x59\xd9\x88\xbc\x26\x6d\xc2\xfe\xe2\xff\x8f\x51\xdb\x28\xa4\x71\x60\x1c\x4a\x40\xec\x7b\xca\x0d\x93\x2f\x99\xfb\x11\xf7\xfd\xfe\x0a\x3c\x3f\xcf\x0b\xe8\x5c\xc5\xfa\x49\x72\x1e\x80\x01\xb6\xd9\xe7\x6a\x9e\xf8\xbe\x80\x96\x6b\x36\x94\x20\x05\x1e\x68\xa9\x93\xae\xb0\x40\xb6\x1a\xee\xfd\xf2\xd0\x07\x60\x2e\xe7\x60\x04\x69\x83\xf6\x58\xe8\x27\x72\x98\xc2\x9d\x0a\xec\x79\xc8\xe2\x24\xed\x82\xba\x61\xa4\xc5\x23\x3f\x10\xaa\x55\x69\x6c\xb1\xf2\xa3\x6b\xc4\x4a\x53\x87\x7e\x78\x1c\xb8\x86\x00\x4f\x64\x12\x3a\x0d\x6f\xea\x03\xcf\x86\x12\x74\x7b\xda\xef\xfb\x85\x5c\xce\x3c\x16\xb7\x25\x96\x99\xb5\x78\xfd\xf5\xda\x25\x7f\x39\xf3\xdb\xc4\xc6\xba\xd8\x67\xf2\x3c\x3f\x6f\xe1\x73\x51\xa8\x49\xf9\x70\xe0\x3c\xf4\x09\x9d\x6c\x9d\x40\xdd\xc0\xe5\x22\x52\xe4\x20\xb0\xac\xcb\xa2\xfb\x63\x6c\x14\xbc\xe8\xe6\x5d\x51\xcf\x2c\x05\x5f\x97\xf4\x48\xba\xca\xfa\x79\x2f\xe0\xf8\x50\xd4\x03\x93\x0c\xe0\x92\x9b\x62\x8a\x95\xb9\x1c\xba\x30\x0e\x2f\x25\x55\x64\x01\xf5\x04\x38\xf9\x81\x65\x8e\xa3\x62\x1d\x57\x5e\x80\x6d\x96\xe9\x96\x62\x0b\xd2\x82\x7d\x28\xea\xde\xdb\x54\x01\x90\xd7\x6b\xb3\x87\xdf\x16\xbf\xb2\x7c\xdb\x33\x48\x70\x6d\x12\x0e\xa9\x1d\x12\xcd\x5c\xd2\xfc\xa7\xab\x69\x73\x95\x26\xce\xac\xf5\xf1\x88\x39\xad\x2a\x24\x07\x39\xab\xeb\x62\xd9\xc2\x78\xb8\x12\x31\x6d\x49\x8e\x3d\x1d\xe5\x47\x3d\xbf\x08\x3d\xb9\x92\x9c\xfa\x2a\xe6\x65\xb1\xdf\x5f\xa6\xd4\x39\xb2\x88\xd0\x39\xc4\xd1\x71\xcc\xad\x71\x13\x1d\xa4\xce\x3f\xeb\x1a\xc7\x7c\xf4\x56\x51\x2a\x12\x1f\x9a\x67\xa4\xdc\x81\x6a\x1a\x26\xd6\x1f\x74\xe0\xb1\xc8\xe6\xe4\x6b\x1a\xc8\x13\x32\xa4\x00\x9e\x36\x2c\xcf\x23\x96\xba\x28\x0f\x4f\x68\xe5\xa6\xa8\x20\x39\xb9\xcb\xb8\x1a\x9b\xf4\xf6\x4b\xe0\xa7\x5c\x71\x13\x17\x92\x61\x59\x71\xca\xd5\x7d\x51\x61\x59\xdd\xf6\xa2\x06\x08\xfd\xc8\xd7\x6d\xcd\x92\xb4\x3a\xd4\x79\xba\x63\x41\xe8\x0b\xdf\xd2\x2e\xcb\xce\xe1\x08\x20\x14\x9a\xd2\xf3\xc6\x68\x6f\x6e\xf4\x2c\x87\xaf\x1c\x42\x4c\xa8\x86\x88\x87\x63\x7d\xde\x16\xa3\xa3\x91\x08\xa9\xd4\xdf\x42\x52\xee\xd4\x34\x5b\x04\xe2\x20\xa0\x30\xf0\x36\xab\xca\x7a\xa8\xa8\x3f\xba\xdb\x58\x84\x16\xa5\xf9\x39\x3f\x9d\xfb\x99\x01\x88\xa5\xd2\x76\xd7\x6d\x64\xa1\xfa\x9c\x1d\x3b\xc1\x42\x12\x86\xc2\xa4\x0f\xcc\x64\xe9\x86\x22\x24\x89\x11\xda\xa9\xa1\x34\x6e\x20\xb4\x1c\x51\x6e\xdf\xf7\xda\x46\xcc\x20\x02\x8e\xaf\x50\x61\x30\x74\x61\x00\x48\xc3\x14\x3b\x83\xac\xe6\x5d\xf6\xa7\x3b\x60\x68\x9c\x3d\x7e\x21\x1c\x8b\x7c\xa8\xce\x05\xd0\x04\xfc\x92\xf2\x89\x45\x79\x96\x9d\x89\x37\x00\x97\x31\x65\x6d\x76\xa0\xd4\x2a\xcb\xa9\x54\x76\xb1\xf5\x70\x38\x66\xe0\xd2\x80\x8b\x5c\x1d\xc0\xca\x65\xb9\x8b\x01\x60\xd2\x2e\x0a\xd5\x6d\x51\xba\x52\xfc\x2c\x57\xbd\x92\x3b\x80\x48\x7a\x6a\x2f\xdb\x66\xbf\x7f\x2a\xaf\x7d\x14\x90\xc6\xc7\xdb\x4c\x8a\x56\xc0\xf0\x3a\x86\x6d\x72\x1f\x3e\xfc\xa7\xbb\xb6\x08\x02\xca\xc4\x88\x22\x3f\x55\xab\x66\xb3\x6c\x20\xfa\x77\xf9\x40\xd3\x1b\x40\x80\x47\x62\x6b\xcb\xb2\x2c\x4a\x9b\x79\x6c\xb3\x13\x20\x54\x48\x6e\xa1\xc6\xa6\xb9\x2f\xae\xde\xdb\xe2\x83\xf2\x81\x32\xf8\x54\xea\xd8\x50\x29\x66\x82\x55\x00\x2a\xf5\x5c\xb0\xdd\x04\x1f\x04\x04\x76\xe9\x0e\xb7\x6a\x00\x62\xa8\x0d\xa4\xd7\x6e\x05\xfa\x1f\x2d\x89\xfe\x27\xf8\xdf\xde\xff\x1a\xfd\xc9\x5e\x42\x7b\xe0\x29\x63\x9b\xe1\x9c\xb0\x7a\xb3\x30\x68\xc1\x9c\x68\xf6\x03\x7e\xac\xe0\x73\xb8\x0b\x1f\xbd\x48\xad\x7c\xe2\xda\xdf\x16\xd5\x2b\xfc\x5d\xd9\x0c\x73\xae\xf0\xac\xbc\xf8\xe3\xb7\x75\xbf\x4b\x0b\x8f\x03\x55\x43\xf7\x59\x45\xc2\x74\x55\x67\x34\x01\xc2\x8f\x8d\xc6\xa0\xb1\x3c\xe9\xde\xb2\x08\x2c\x71\x60\xb3\x5a\xfe\x2d\xa6\x9f\x3b\x8d\x99\x3a\x8d\x49\x59\x0e\xc0\x38\x22\x4c\x0c\xb6\x63\x7e\x2a\xf3\xdf\x78\x35\x81\x08\x99\xb1\x03\x33\x7d\x7b\x99\xab\x0b\xbd\x33\x10\xa1\x8c\x29\xb4\xf9\x71\xf7\xf0\x6d\xf7\xeb\xee\x61\xb7\x7a\xbe\xdf\xde\xad\xef\x97\xbb\x75\x0b\x30\x14\x11\x0f\x69\x73\x66\xf1\x0a\xcd\x0a\xe2\x0e\xc5\x42\x52\x79\xcc\x0d\x43\x1c\x6e\x7c\x45\xea\x07\xce\xe7\xc2\xe8\x05\x4d\x0f\x2d\x91\x26\x31\x25\x2f\xc5\x69\xdf\xae\x69\x34\x11\x9b\xce\xd4\xd9\xa1\xfd\xe3\x6a\xc9\x4a\xb0\x34\xd0\x5e\xcb\x03\x98\xf7\x44\x87\xd7\x72\xd4\xb5\x05\x13\x8a\xa6\x8f\xf5\xe3\xe3\xf7\xdd\xf6\x71\xb7\x98\xdd\xdf\xef\xfc\xf5\xfd\xf3\x6a\xde\x3d\x37\x0f\x04\x45\x07\xeb\xe5\xfa\xbe\xfd\x1b\x00\xad\xa4\xab\xd9\x9f\xbb\xa7\xe5\xcf\xe5\xc3\xf3\xb2\x3d\x84\x22\x8a\x3b\x5b\xb1\x36\x85\x3f\x2c\x7c\x4f\x06\xfa\x02\x02\x33\x04\x54\x91\x37\xc3\xf9\x52\x2b\x18\x04\x30\x4e\xf3\xa3\x0d\xa2\x86\x36\xd2\x20\x1c\x1d\xaf\x19\xac\xb2\xce\xde\xd1\x78\x3b\xb5\x47\x8d\x89\x29\x09\xe7\xaf\xa0\x19\x62\x83\xc4\xbf\x10\x11\xc4\x5e\x47\x89\x6b\xe9\xf4\x20\x44\xec\x13\x1e\x63\xe7\xac\x4e\xb6\x50\xbd\x4d\x0f\x3e\x21\x43\x4d\xc9\x2c\x45\x92\x1f\xab\x2c\xaf\x67\x2f\xdd\xdc\x25\x54\x28\x1c\xd0\xe7\x57\xf6\x1b\xe5\x36\x10\x3a\x34\x46\xdc\xb2\xc8\x75\x56\x1e\xbe\x28\xdd\x8f\x4f\x14\x9a\xd4\x0b\x08\x2a\x69\xf4\xb6\x47\x8c\x24\xd3\x50\x7a\xcc\xa8\x35\x50\x16\xec\x36\x23\xf0\xda\x64\xff\x94\x9e\xd0\x54\x94\xae\x7b\xe8\xc7\xcd\x39\xaf\x5f\xb1\xce\x3e\xc7\x57\xd5\x48\x45\xf1\xf9\xf3\x5f\xcb\xa7\xdd\x66\xbb\x5c\xef\xe2\xdd\x62\xf6\xb0\x58\xde\x0f\x37\x16\x32\x48\x14\x4d\xfa\x48\x92\x5a\x38\x53\xca\x08\x5a\x8d\xfd\x23\x5d\x73\xee\xa1\x9d\x08\x6f\xb3\xb2\xaa\x5b\x15\xc9\xf6\xb8\xa0\x40\xe4\x76\xee\xba\xb0\x0c\xc1\x27\x80\xf9\xf7\xfb\x85\x2b\xd2\xca\x28\x55\x82\x9c\x12\xf7\xc5\x49\x89\x32\x23\xbf\xd7\xe9\x34\x85\x8c\x54\xcc\x82\x56\xe7\xd9\x58\xe5\x0f\x6f\x2a\x52\x3c\x95\xed\xf6\xd6\x42\x14\x17\x50\xaa\xc1\xea\xdd\x32\x95\xdc\x59\xe8\x51\xd4\xa5\xce\xf9\xac\x2c\x81\xd0\x31\x7f\x0c\xc7\xb3\x8c\x34\xa3\xce\xb4\x69\x02\xdd\x51\x69\x42\xc6\x9e\x97\x38\xd4\x43\x66\xea\xfa\xa7\xfc\xda\xa2\x20\x63\x4f\x13\xb3\xbf\xca\xfe\x8b\x8f\xba\xb7\xeb\xc4\xee\x82\x91\x32\xa5\xf5\xba\x38\xae\x4b\xbc\x93\xc5\x2c\x57\xcd\x3c\xdb\x35\x40\x62\x39\x1f\x8b\xaa\xe9\xd8\xed\x9f\xb9\x52\x56\xe4\xfc\x4e\x16\x6b\x28\x81\x6c\xd3\xaa\x4d\xb3\x51\x6f\x17\x03\x19\x2b\x41\x19\x98\x43\x0b\x8a\x93\x89\xe7\x53\x37\x3d\xe2\xf1\x16\xca\x4b\x89\xcc\x2f\x67\x77\x99\x04\x5e\xec\xf2\xa1\x50\xc3\xba\x68\xee\x69\x34\x9e\x28\xde\xee\x07\xf5\x32\x61\x3a\xb5\xd8\xa7\x39\x56\xcd\xab\x53\x63\xf0\x84\x4c\xd3\x94\xd2\x19\xcb\xe5\xed\x49\xbe\x55\xfd\x95\x50\xb2\x94\x11\x0a\x99\x04\xf6\xdc\x44\x7d\x83\x32\x3b\x40\x67\xf4\x72\x39\x37\x4b\x9e\x28\xcd\xc6\x92\x95\x48\x9a\x22\x7d\x87\xdc\xa1\x8e\x3e\x48\xce\x18\x21\x89\x36\xdf\x16\x0b\x77\x0b\x24\x14\x47\x40\xe3\x12\xce\x46\x55\x44\xf7\xce\x9f\xee\xc7\x8a\x99\x0a\x6c\xb3\x07\xc4\xb2\x1d\x31\x8a\x61\x04\x6d\x84\x83\x83\x15\x72\xf4\xbe\x95\x8e\x02\xe1\x7e\xf6\x51\x3f\x14\xf9\xb6\xcc\xde\x33\xd8\xdb\x8c\xce\x78\x5c\x60\xa2\xa4\x53\xdc\xb6\x0e\xf6\xc6\xeb\xe3\xa2\x4e\xd4\x75\x12\x4c\x95\x8b\x74\xee\xa1\xaa\x17\x90\x2b\xe2\x49\xb4\x9d\x54\xc7\xd2\x66\xb2\x9a\x3e\xfc\xe3\xaf\x05\xa1\xf5\x32\x54\xa3\x29\x48\x0b\x46\x19\xb8\x7f\x65\x2f\x2f\x03\x11\x0e\x50\x9e\x67\xa6\xf3\x03\xd6\xb0\xff\x28\xca\xb7\x6a\x31\x01\x00\x53\x5e\xa8\x69\xf2\xfd\x36\xdf\x0e\x47\x9e\xf2\x54\x42\x9b\xfd\x1d\x11\x68\x1f\xf0\xc3\xa8\xf4\x0c\x6e\x40\xf9\x81\xf1\x2d\x93\x86\x9f\x7e\x8d\x77\xfc\xe5\x3c\xde\x44\xa9\x06\xca\x67\x4c\xb0\x40\xf5\xd2\x3e\xca\xd7\x48\xb0\xd0\x1e\x36\x4e\x05\x49\xe2\xfb\x6d\x2f\x1b\xab\xa0\x83\x0a\xc0\x78\x41\x8a\x53\xb6\x57\xd3\x6b\x82\x0a\x23\xa0\xbd\xfc\x7c\x76\x77\xbf\x19\xc4\x6d\x6d\x03\x05\xb6\xba\x6c\xd4\x1d\x9b\x40\x6d\x40\xe4\x53\x61\xac\x88\x61\xb2\x58\x3d\xb6\x7f\x62\x98\xb4\xda\x3e\x87\xec\x2a\x37\xd6\x35\xd7\x2d\x01\xdd\x52\xfc\x47\x5f\x21\x0a\x21\xb6\x58\xe1\xa7\x66\xde\x5d\x3c\x8e\x6e\x33\x8a\xfc\xd4\x02\x0a\x7e\x16\xfb\xd3\x01\x05\x54\x16\x77\x7b\xa1\x08\x05\x2a\xe2\x01\xc5\x2e\xb7\x27\xc2\xd1\xd9\xfc\xbb\xad\x84\xd8\x36\xb1\x87\x34\xf0\xb2\x56\x98\x7e\x99\xd7\xe5\xf9\x2e\xd7\x6d\x0e\x49\xc5\x22\x24\x94\xbc\x01\x38\x8f\xee\x39\xf1\xd0\x60\x36\x4f\x82\x78\x44\xf9\x14\x97\x48\x25\x2a\x72\x1e\x49\xf7\xb4\x17\x18\x1d\x4f\xad\x09\xf0\x8f\xe2\xad\xfb\xdd\x14\x90\xd6\xb4\x79\x56\x57\xa7\xc3\x02\x2a\x97\x9b\x51\xcc\x0b\xc9\x22\xec\xc3\x0a\xa4\xd3\x36\x30\x74\x47\x79\x1c\x5a\x95\xec\x5a\xbe\x9a\x14\xe1\x17\xd3\x98\xe2\x31\xa3\x32\x40\x26\x8b\xe7\x3c\xab\xfb\xd9\x3b\x05\x3c\x42\xcf\x95\xe7\x6a\xb8\xeb\x7a\x7d\x7f\x4a\x53\x20\x8d\xce\x1a\x6d\x17\x36\x35\x3a\xdd\x24\x50\x32\x49\xa9\xec\xf9\x0b\xf6\x75\x36\x00\xb5\x2a\x89\x9a\x42\xf9\x23\x9c\x5b\x28\xdb\xe8\x0b\x2a\x91\x24\x2d\x48\x90\x54\xf5\xdd\x01\x99\x44\xc6\x56\x00\xdf\x9c\x12\x69\x2f\x55\xa0\x30\x91\xf4\xc9\x2c\xe4\x85\x64\xa9\x4c\x22\xcb\xa5\x51\x15\x32\xa0\xf2\x35\xe5\x3f\x26\x1c\x43\x40\x21\x17\x24\x66\xd8\xee\xb7\xeb\xa2\x94\xed\x37\xd0\x61\x40\xc2\x13\x7b\xc4\xb7\x4d\x8d\xb0\x7f\xcc\x5d\x65\x05\x3d\x4f\x46\x24\xb7\xfd\x0a\x25\x3e\x15\xc5\xe1\x66\xb6\x6d\x81\x41\x83\x57\x87\x5e\x12\x51\xc5\x9b\x22\xd1\x53\x8d\x4f\xc5\x7e\x7f\x81\x7c\x46\x3f\x0d\x48\xfe\x89\x08\xbc\xa5\x51\x30\x1b\xdc\x2c\x06\x81\x11\xe0\x34\x15\xee\xd4\xdd\x49\xc8\x62\x82\x3a\x81\x94\x4d\x00\xd0\x62\x9d\x30\xf2\x43\xe8\x36\x52\xbf\x50\xc0\xf1\x78\x45\x35\xc9\x9d\x11\x73\xda\x56\x35\xdb\x99\x55\x0f\x41\x77\xd9\xa5\x30\xd2\x68\xe4\xca\x9d\x3e\xeb\x97\x13\x03\x26\xbe\x29\x50\x19\x2d\x56\xb2\x55\xba\xb0\x3d\x18\x9d\xc1\x03\x4a\x7c\xed\x40\xa9\x35\x9c\xaf\x38\xcc\x03\x26\x22\x8a\x2d\x0b\xf4\xbe\x90\x6f\xa7\xe3\xe8\xbd\xa6\x49\x9a\xf6\x10\x5f\x7d\xf7\x4d\x40\xe6\x03\x5a\x55\x66\x12\x6b\x0d\x9b\x95\x94\x7a\x5b\x9b\xc0\xe8\x50\x37\xc8\x62\x63\xf2\x4e\x0b\x27\x39\xa9\x8f\x7a\x33\xb2\x18\x3d\x63\x21\x6b\x5f\xf4\x43\x51\x1b\x19\x8e\xe9\x17\xce\x74\x44\xec\x84\x5f\x28\x7a\xc5\x6e\x64\x1a\x29\x57\xf6\x80\x35\x94\x78\x3a\xf4\x07\x15\x72\x44\x4a\xc6\x56\x21\xef\xab\x3d\x01\x42\xac\xc9\x75\xd9\x8e\x88\x5d\xd5\x2f\xf5\x21\x24\xa6\xe8\x45\x2c\x6d\xe7\x39\x94\x63\x75\xb9\x9d\x19\xde\x22\xa0\x26\xde\x4b\x96\xbf\x62\x99\xd5\xa8\x7e\x66\x2d\xcb\x07\x85\x2f\x29\xb4\x3f\x38\x0b\x9b\xc5\x2b\xe4\x39\x8e\x6b\x38\x28\x84\xa0\xc4\x68\x75\x12\xcf\x77\xf9\xd0\xbb\x74\xf4\x3d\x85\x4c\x88\xd0\xfe\x33\xdb\xef\xff\xdd\xfe\x8e\xd6\x94\xe3\xdf\x4b\xf9\x49\xca\x32\x83\x19\x1a\x65\x94\x8a\x68\xc8\xbd\x32\x1b\xb8\xe1\xa5\x25\x0b\x84\x65\xdc\x13\x75\x74\x9d\x1d\x47\x4b\x2d\x4a\x1e\x4b\x39\x70\xd8\x34\x42\xee\x45\x79\x01\xf9\xb4\x67\x28\x19\x30\x23\xe2\x5c\x96\x19\xbc\xe0\x6f\x55\x24\x06\x73\x83\xc2\x58\x12\x5d\x6f\x5f\x08\x93\xc4\xff\x09\xa7\xbd\x8b\xd2\x51\x69\x9f\xe6\x27\x4b\xe5\x9b\x9a\x15\x10\x25\x85\xc6\xbb\x8a\x08\x99\x6f\x59\xfe\xb2\x3c\x16\xf2\xf5\xe6\x64\xd1\x73\xc3\x77\xa0\xd1\x80\x25\x6a\xac\x6a\xcf\xef\xb9\x24\xb7\x99\x5a\xed\x45\x40\x74\xd7\x1c\x3f\xdc\xc3\x0c\xdf\xb7\xf6\xb5\xd2\x69\x8f\xb0\x3f\x81\x51\xe2\xf6\x07\x75\xa0\x80\xf6\x30\xcd\x0f\xfe\xc0\x33\xaa\xef\xdd\x2a\xa7\x23\x3f\x0e\x9d\x6f\xd2\xab\x83\x1f\xb4\x07\x83\x80\xd0\xc1\x4f\x9b\xf5\xfd\x76\xf7\xdd\xfd\x39\x0e\xcd\xa6\x68\x05\x26\xdb\x15\xb4\x07\x98\x62\xae\x9e\x99\x8d\x9e\x5b\x27\xa1\x47\x6f\xf2\x66\xf6\xf4\xe3\xe1\xf1\x66\xb9\xbb\x5d\x2e\x37\xbb\x9b\xe5\xc3\xe3\xea\xee\x61\xb6\x7d\x74\x5b\x4f\x9d\x08\x2f\xd1\xce\x2b\xe1\xb3\xb6\xc5\x8c\xed\x76\x45\x3f\x76\xa7\xf8\x40\xe8\x44\x27\x98\x50\x28\x6e\x2a\x78\x6d\xda\x78\xf0\x8d\x74\xca\xac\x96\x71\x13\x78\xfd\x42\x7c\xbb\x2d\x4e\x2e\xea\xd2\x29\xf7\x29\x33\x4a\x2b\xeb\x5d\xfe\x0b\xb3\xd1\xad\xa7\x4a\x08\xc3\x43\xcf\x15\x2d\xdd\x16\x15\xbc\x2d\x8c\xda\x65\xeb\x87\x38\x3c\x8d\xf9\xc6\x64\x76\x77\xc8\xf2\x7a\xca\xb8\x02\x34\xf7\x53\xce\x5d\xe5\xae\x55\x4c\x70\x49\x77\x0d\x5e\xc8\xac\xb4\x75\xe7\xea\xd3\x4f\xea\x6b\x48\x05\xd5\x7d\xea\xa2\xd5\xc5\x03\x2d\xa2\x30\xd2\x4e\xf7\xa6\xd9\x91\xf6\x2c\x81\x86\xef\x45\xf0\x80\xe0\x3e\x2b\xc4\x63\x6f\xfe\xd3\x42\x79\x74\x05\xa7\x58\xe7\xfe\x2e\xc3\x88\x82\x43\x12\xd3\x20\x90\x68\xeb\x5b\x02\x1a\xd3\x48\x3a\x17\x8a\x5d\x91\x23\x95\x44\x97\xcd\xd2\x3f\xea\xbd\x08\x8a\x70\xa4\xb6\x74\x42\x0b\x42\x4b\x64\xd2\xda\x07\xe2\x6d\x6c\xef\x96\x4f\xc1\x6e\xfd\x74\xb7\x58\xb6\x87\x94\x0c\xb9\xfd\xf9\x65\xae\x3a\xdf\x2b\xd0\x1a\x3d\xc2\x45\x2c\xb2\x52\x12\x29\xfd\x0d\x73\x5a\xe5\xc6\xba\x0c\xff\x57\x85\x5f\xe1\x79\x01\x13\xbc\x07\x1c\xa4\x59\xfd\x2e\xbf\x2d\x41\xfe\xe1\x9a\xa4\x48\xef\x6b\x5f\xbc\x18\xe1\xfc\x56\x2b\x8f\x14\x69\x94\x6b\xe7\xc7\x8c\xf7\x6c\x22\x8c\xa4\x75\x57\x79\xef\x7d\x5a\xe1\xf9\xcd\xb6\xcd\x2d\x76\x58\x6e\x8b\x09\x7a\xaf\xf0\x82\x30\x26\xd4\x5d\xbd\x07\x77\x62\xc8\x52\x82\xe0\xcf\x4a\xf9\x8a\xf5\xf9\xe8\xe0\x2c\xc2\x0b\x51\x11\x31\x5f\xee\x11\x8c\x0b\xba\x3b\x12\xf9\x8a\x22\xb5\xcd\xf2\xe7\xf2\x61\xfb\xe0\x1c\x9c\x84\x17\x69\xdf\x77\xf2\xe5\x3b\x7d\x85\xc4\x28\xbc\xc4\x57\x69\x47\xf4\x7a\xc2\x66\xa0\xb5\x9b\x62\x9b\xb7\x12\x5e\x12\x47\x04\xb7\x59\x42\xd9\xbc\x41\x53\x58\x37\xdf\xaa\xb2\x3e\xff\x5f\xe1\x85\x85\x97\x30\x24\x31\x46\xeb\x57\xf5\xab\xd9\x86\x4e\x22\x72\x84\x97\x70\x03\x6b\xad\xe4\x2b\xaa\xd3\x1e\x07\x96\x80\x03\x82\xc5\x90\x94\xe7\x4e\x6f\xfa\xb3\x35\xa8\x90\xc5\xe6\x5c\xd5\x78\xe8\x67\x3e\x85\x97\xc8\x90\xb6\x35\x4e\x0d\xe1\x0a\x3a\xe6\xeb\xbe\x95\x20\x50\x66\xd3\x61\xb2\x7e\x83\x86\x12\x5e\x1a\x19\xf2\x6c\x56\x39\xe2\xf1\x1f\xc3\x2b\x32\x60\x64\x89\xb2\xbc\x79\xde\x3e\x3f\x3d\xb8\xbb\x65\xda\x90\xd7\xa4\xe1\xfe\xdd\x16\xe5\xba\xcc\x8a\x32\xab\x9b\x4e\x1a\x5c\xc6\x99\x5f\x6e\xb5\x2f\xd0\x72\xf6\x47\xb8\x9f\x38\x4b\x3d\xd3\xb5\x27\xa3\x2e\xe1\xf1\xd4\x64\xff\x7f\xfc\x78\xfc\xd6\x5b\x71\x84\x27\xb4\xa4\xe9\xac\x89\x6d\x67\xb9\x6a\x05\x8d\xc7\x37\x35\x78\x25\x32\x0e\x53\xd1\x23\x81\x39\xf3\xc5\x76\xd4\x49\x1e\x92\x66\xe4\x1e\xaa\xfa\xc6\x71\x5b\x9b\x3f\x2b\xda\x16\x74\xca\x4e\xb3\xf6\x90\x00\x27\x83\xf8\x9c\x67\xff\xe9\x56\x4c\xe1\x49\x19\x93\x2a\xc7\xee\x26\xd3\x3a\x93\xa7\x7d\x7d\x5e\xc0\x9e\xea\xb7\x7f\x5c\x66\x2c\x85\xa7\xbc\xd0\x61\x01\x0c\x0c\xa7\xef\x5c\x36\x1a\x45\x4a\x71\x4f\xbb\xbd\xf7\x15\xa3\x25\xe1\x29\x2d\x3a\x0f\xf0\x5c\xdd\xa0\x36\xc0\x88\xd3\x18\x5c\x29\x3c\x04\xf3\x88\xd9\x49\xe1\xe7\x9d\xda\x16\xc6\x46\xec\x8f\xe1\x67\xd3\x5e\x80\xad\x52\x95\xf3\x04\xef\xa8\xb4\xc2\xd3\x3e\xeb\x41\x0b\x17\x85\x36\xbb\xe1\xd9\xa8\xeb\xe9\xc4\x70\x3b\xb2\x5c\x6d\x10\x95\x33\xa3\x31\x47\x7d\x8f\x1b\xa8\xf4\xec\xe6\xe7\x6e\xbe\xfd\x6b\xb7\x79\x5e\xaf\x9d\x7b\xa2\xf0\x7d\xc9\x68\x02\x79\x42\xd8\x2f\xab\x1a\x6a\x5c\x94\xe7\x63\x5d\xdc\x9e\x72\x65\xb7\x0c\x83\x1f\xf3\x7d\x05\xb4\x55\x5a\x6d\xff\xea\x77\x21\x3f\x60\x22\xd0\x1d\x10\xa4\x99\x88\xc7\x31\xa3\xf0\x03\x48\x85\x31\xbd\x3c\x37\x3f\x78\xf8\xb2\xa2\x20\xfc\x50\x03\x35\xdf\x40\x13\xb5\x0f\x7e\x2e\xf2\x58\x1c\xb9\x15\xfc\x57\x96\xf7\x74\x3d\x85\x1f\x05\x09\x44\x6d\xdd\x82\xca\x58\xc3\x0b\x47\x1c\xc0\x08\xed\x9d\x8f\x35\x54\x55\x56\xb5\xaf\x2b\x52\xda\xf8\x14\xac\x97\xcb\x9b\xdd\x66\x3b\xdb\xee\x56\xb3\x3f\xdb\xa3\x08\x54\x23\x9c\x6d\x7e\x34\xc7\x7e\x2c\x77\x4f\xb3\xed\xdd\xa3\x3b\x1c\x87\x21\x41\xe5\x9d\x52\x60\x4b\x17\x9b\x40\xfb\x08\x3f\x96\x51\xda\x6a\x05\xb5\x8a\xd6\xd3\x7d\xd4\x4f\x99\x4f\xc5\xdd\xe5\x01\x4b\x43\x48\x69\x0f\x24\x91\x91\x96\x3c\x1c\x4e\x79\x56\x9f\xd7\x7d\x49\xcf\xe1\xfb\x4f\x59\x42\xa4\x1c\x49\xfe\x2a\x8b\xa2\x7b\xec\x94\x09\x52\x62\x79\x98\xcf\xba\x80\xa4\xf9\xb3\x26\x11\xb4\x63\x51\xec\x89\xbb\xef\x0e\x70\x0f\xd1\x44\x30\x07\x7c\xc0\xfa\xa3\x28\xbf\x50\x9d\x13\x3e\x8f\x80\xa2\xc5\xd9\xfd\xfd\xe3\xa2\x79\x63\x0f\xbb\xfb\xc7\xc5\x8f\xdd\xf2\xe1\x66\xb7\xbd\x5b\x2d\x37\xdb\xd9\x6a\xdd\x5e\x3b\xf5\x68\xff\xbe\x7d\xc5\xfe\xbd\x70\x1e\xf5\x64\xd2\x57\x50\xbd\x7d\x5d\x91\x12\x3e\x47\xa3\x99\x4a\x45\x32\xda\xa6\xf5\x51\xa0\xc2\x07\xc9\x3d\x47\xab\xfe\xf3\x7e\x5d\x16\x47\x2c\xeb\xf3\x64\xa2\x51\xf8\xa0\xd3\xd8\x45\xa3\xd3\xb3\xec\xe8\xd7\x45\xc8\x29\xe8\x58\xbc\x96\x45\x5e\x18\xc9\x8b\x75\x41\x78\xe2\xee\xa1\x44\xc2\xa0\x19\x4e\xcf\x4f\xab\xf9\x17\xab\xd0\xe8\x3b\x0a\xad\x42\x27\x1b\x7a\xca\xd5\x14\xb1\x5b\xf8\x92\x25\xda\xdd\xf0\xbc\xd9\xfc\x9e\x8e\xe3\x16\xc2\xa8\x90\x93\x05\x17\x81\x18\xae\x2e\xa3\x5f\xaf\xaa\x57\xb0\xdc\x83\xd7\xa1\x2c\xaf\x19\xeb\x57\x1b\x53\x6d\x3e\xe0\xf8\x78\xaa\x8f\xa7\xe9\x32\x90\xf0\x15\x84\xc9\x60\x1c\x5f\xb8\x4f\x0a\x1f\xbd\x88\xe0\x2b\x64\x74\xb9\x76\xb4\xe2\x71\xa3\xd8\x6c\x56\xe4\x6b\x13\x4a\xe4\x2f\xd8\x5c\x2e\xcb\x5f\xac\x61\xde\x60\x47\xee\x56\x10\x5f\xc7\xbe\x91\x79\x81\x37\x24\x00\xbf\x89\x9c\x46\x97\xd6\x29\xa3\xba\xc1\xbf\x8b\x2c\xdf\xfc\xa7\x1c\x1f\x15\x5a\x09\xfb\x0d\x9a\x78\xf3\x92\x7e\x32\x7e\xa3\xc3\x10\xa9\x03\x59\x09\x5f\x23\xa2\x4d\x64\xef\x0e\xe7\x5d\x95\x59\xc3\x0a\x11\xf8\x01\x27\x2c\x7f\xa1\xaf\xd9\x97\x88\xc0\x8f\x18\x99\x44\xde\xe0\xfe\xf4\x59\xb4\x67\x42\x42\xf3\x19\x6d\xd0\x6e\xb2\x4a\x9c\xca\x0a\x3b\x0f\x53\x11\x04\x29\x10\x15\x82\x4a\xae\xae\x30\xb2\x86\xb2\xde\x7e\x14\xc3\x08\x70\x08\x0c\xfb\xbb\x80\xe7\x41\xed\xcb\xfe\x66\x18\xa4\xca\x6c\x0c\xf1\x3d\xb3\x6e\x19\x0e\x0e\xe1\x9a\xc4\x3e\xb1\x7a\x1c\x82\x96\xe4\x6e\xbe\x2c\x33\x37\xe7\x08\x52\x7a\x30\xc8\xe5\x79\xc7\xec\x1c\x8e\x8a\x20\x4c\x8c\x44\x6c\x55\xec\xc9\x66\xcc\xf4\x98\xe1\xda\x1d\x44\x8a\x11\xaa\xcf\xc4\xa6\x36\x88\xb6\xc7\xe2\x40\x58\xe5\x48\x23\xd0\x32\x88\x5f\x83\x38\xd1\x94\x65\xb8\x99\x3d\x6e\x50\x9e\x88\x29\x74\x51\x63\xba\x1a\x27\x3b\xca\x88\x08\x62\x9e\x70\x1b\xb3\x11\xaf\xd0\x5d\x3f\x09\x4d\x0e\x8d\x4a\x7e\x16\x48\xba\x30\x42\x9b\xae\x49\xea\x79\xa4\x92\xb5\x28\xca\x63\xd1\xe7\x1a\x8a\x20\xe5\x1e\x77\x32\x4a\x75\x71\xbc\x2f\xe4\x5b\xff\xbd\xa7\x02\xb9\xc1\xb9\x9d\x8b\x52\x76\xf3\x58\xd0\xac\x4e\xed\x7a\x6c\x93\x47\xcf\xc7\xf6\xa8\x4a\x69\x9b\x43\x83\xb4\xc5\x40\xba\x83\x9a\x85\x76\x94\xaf\xf1\xe5\xc5\x42\x52\x06\x1e\x99\xc3\xe9\x2f\xe0\x4c\x69\xab\x0d\xda\x76\xd8\x6a\xf4\x15\x21\x48\x88\x4e\xf6\x91\xe5\xf3\x32\x93\x6f\xc6\xc8\xc3\xfd\x26\xa4\x29\x65\x71\x97\xb9\x8a\xdb\xbf\xb1\x44\x18\x8d\xac\xe2\x38\x58\xcb\x6c\xee\x57\x04\x20\x25\x98\x05\xfb\xe6\x69\x3d\x1c\xe9\x01\x60\x40\x8b\xd6\x43\x51\x67\xfa\xbc\xb3\x01\xdf\xc4\x56\x22\x10\xcd\xee\xbf\xdd\x86\x6f\x8b\x53\x99\x43\x7f\xc8\x49\x4f\xc7\x71\x5b\x15\xa3\x62\xda\x68\xb3\x11\x48\xdf\xe0\xa4\x67\x07\xa8\xf1\x54\xae\xf7\x50\x67\xf9\x20\x5d\x2a\x02\xa9\xd2\xd8\x2e\x7e\xdf\x8e\x2f\x3f\x9c\xcf\x9f\x08\x24\x46\x94\x10\xad\x6a\x78\xc3\xdb\xa2\x6c\x13\x66\x5f\x4e\x49\xed\xc9\xa9\xf6\x3b\x87\x73\xab\x75\xd1\x1b\xbc\x8a\xc7\xca\x7e\x4d\x43\x28\x1f\xe6\xc8\x6c\x2b\xfc\xff\xa4\xfd\x59\x73\xa3\x48\xf6\x3e\x8e\xbf\x9d\xbe\x98\x0b\x48\x20\x49\x2e\x65\x59\xb6\x35\x6d\x5b\x1e\x49\xd5\xd5\xfd\xfb\xc4\x84\x22\x97\x93\x16\x63\x04\x1a\x40\xb6\x35\xaf\xfe\x1f\x9c\x5c\x58\x24\xbb\xfa\x1b\xff\xe8\x88\xae\x2a\x91\x6c\x49\x2e\x67\x79\xce\xf3\x44\xd4\x6a\x4c\x95\x86\xe4\xc8\xc1\xa7\xb7\xfc\x0d\x66\xcd\x9a\xbf\xf9\x21\x07\xd2\x18\xe7\xbb\x6e\xf1\x05\x75\x5b\x7d\xfc\x3d\x64\x96\x20\xa0\x42\x19\x58\x7e\xc2\x3b\x99\x7f\xb1\x30\xea\x98\x46\xbe\xbc\x11\x89\xa7\xe0\x74\x18\x71\x9c\x08\xa2\x69\x22\x8c\xd6\xcb\x15\x7e\xea\xee\x30\xd3\x89\xaf\xc7\x5e\xfc\x97\x10\xb3\x5a\x10\xbb\x34\x12\xb7\x6a\xe8\x34\x92\x76\x65\x5b\xce\x57\x8f\xa0\x5e\xfb\x69\xa0\x39\xc5\x08\x6c\xe7\x2d\x61\x8e\x72\xf7\x9e\x76\x0e\xd0\xce\x3e\x6e\xdf\x4e\x3b\x6a\x20\xf4\x8f\x26\x6f\xa3\x0c\xe6\x44\xf2\x16\xb9\x79\xc7\x87\xa3\x20\x22\xd2\xc9\x4d\xe4\xe5\x6b\x01\xf7\x27\x68\x9a\xcb\x6d\x35\x0a\x98\x29\xff\x6f\x4e\xa2\x1b\xa1\x77\x35\xc0\xff\xf2\xf2\x75\x90\x41\x13\x51\xa0\x09\x66\xd7\xfe\x98\xcf\xf7\x1e\x59\x69\x8f\x85\x8c\xa4\x56\xd5\xe8\x2e\x2f\x26\xab\x67\x14\x66\x1a\xb7\x1d\xb4\x7c\x7f\x58\x32\xc5\xc1\x3a\x13\x85\x60\x02\x0e\xff\xe1\xf2\xed\x58\xb9\xa9\x11\x11\x21\x48\x62\xd3\xd4\x3c\x2f\x1b\x63\xf5\x5f\x0f\x34\x1b\x9b\xc4\xcd\xdd\x88\xc8\x04\xd7\x03\x54\x28\x2b\x78\x7e\x98\x1d\xfc\x65\xa3\x18\xe2\xcc\xee\xd2\x50\x1b\x82\xdd\xab\x2b\x4f\x14\x25\x46\x05\x45\x9c\xce\x7f\x96\x43\xb4\xe6\x70\x86\x47\x11\x07\x2c\x97\xf8\x6b\xf3\xe0\x6f\x01\x71\x62\xf5\x13\x7e\x7a\x2a\x8c\xf1\x30\x8a\xe2\x90\x62\x52\xb4\xfd\xff\x47\xf9\x4e\x44\x31\x31\x77\x77\x45\xab\x37\x27\x37\xf5\xa3\x24\xc9\x20\x74\xa2\x78\x9d\xb7\xd8\x8e\xf8\x2f\xc6\xd7\x49\x52\x86\x8e\xe3\xa8\x8a\x43\xf9\x4b\x09\xa3\x7d\xc8\x95\xb2\xaa\xd2\x23\xd5\x82\xc9\xd2\x19\x25\xda\xc8\xab\x98\x3a\x2d\x7f\x15\x1a\x18\x19\x43\x2c\x49\xb6\x79\x86\xed\xf9\x08\xd7\xea\x4a\x44\x44\x43\x13\xa6\xe8\x39\x33\xae\x31\xa4\x89\x88\xf2\xd4\x28\xc3\x2c\x5f\x06\xb6\x76\xc4\x28\x53\xc2\xf1\x8c\x1f\x04\xd4\x37\xe7\xa5\x9a\x98\x8a\x51\x16\x24\x4e\x9a\xfa\x19\x3e\x5b\xcb\x76\x8e\x63\x73\xfc\xb5\x32\x42\x59\xe0\x89\x65\x2d\xee\x73\x7c\x2d\xce\x8c\x21\xf3\xb3\x33\xad\xad\xc9\xf9\xd2\x8f\x66\xce\x20\x33\x41\x64\xb7\x05\xfc\x73\x3c\xdc\xb9\x8c\xd1\x12\xf1\x44\xca\x8f\xf9\xbb\x9f\x22\x5c\xc5\xda\x13\x4b\x15\x55\x8d\xa4\x57\xee\xa0\x08\x95\xc9\x76\x3c\xf0\xe6\x06\xa0\x7c\x01\xa7\x21\x72\x35\x1e\x16\x09\x42\x43\x8b\x4e\xda\x1c\xb9\x84\x66\x9f\x1f\x9f\xaa\x12\xce\x93\x37\x12\x32\x46\x2f\xb4\x7a\x97\x2f\x50\x0f\x68\xfa\x44\x24\xb3\x34\x19\x58\x3d\x86\xaa\x69\x62\x3f\x44\x12\x62\x57\xea\xbf\xae\x2a\xbf\xcc\x5e\x1f\xc8\x12\x94\x27\x73\xeb\x45\x92\x5d\x5f\x5c\x1f\x6e\x93\x7c\xad\x88\x54\x96\xe1\x8c\x9d\x1d\x8f\xa7\x76\xb8\x42\x01\x31\xf9\x3d\xe3\x4e\xde\xe6\xfc\x50\x95\x6a\x22\x72\x78\xf5\x8f\xef\x82\x62\x11\x30\xc9\x7b\xa6\x2e\xbb\x3f\x5e\x8b\x20\x47\x20\x03\x34\x26\x6c\x91\xb1\x65\x7d\x1e\x7f\x16\x9d\x18\x15\xd7\x95\x21\x37\x32\x5c\x81\xd7\x67\xab\xce\x62\xb4\x3f\xee\x2b\xd4\x59\x6b\x47\xab\xb1\x16\x14\xf3\x07\x65\x35\x08\xa9\x45\x5a\x19\x5d\xe2\xaa\xe6\xb2\x1b\x1c\x3b\x4c\xfd\xa0\x2f\x3f\x40\x1c\x74\xed\x34\xa6\x7f\x17\x7f\x6e\x77\xf3\xd5\xd3\xcb\xec\xf9\xaf\xdd\xf6\x61\xbd\x58\xf8\x0b\x69\x91\x85\x3e\x4e\xf5\x3e\x54\xb4\x1f\x8f\xb3\x38\x88\x33\xb4\x6d\x2c\x4f\xd5\x2d\x14\x8e\x32\x45\xc4\x41\xca\x22\x27\xed\xd2\xbd\x2d\x46\x13\x4d\x71\xb5\xcf\xf4\x7c\x95\x5b\x1c\x3a\x6e\x71\x90\xa5\x28\x7f\xb2\xab\x4f\xa5\x05\xb9\xcf\xb1\x20\xe2\xff\x71\x3d\xbd\xbe\xbe\xc6\x81\x10\x3c\x1c\x70\x0f\x18\x7e\x74\x33\xde\x1b\xf7\x32\x24\x56\xe8\x03\xec\xc9\x2b\xf1\xbf\x25\x01\x92\xca\x34\x55\xdd\x6e\xab\xe3\x4b\xe5\x69\xbe\x45\x1c\x45\x12\x69\x25\x0c\x3f\xce\x23\x2f\x95\xa5\x57\xe5\x93\x05\x2a\x8e\x03\xc8\xb8\x93\x4d\x99\x2a\x8d\x88\x38\x0e\x39\x32\x0e\xfe\xb1\x5c\x6f\x7f\xcc\x1e\xb7\xb3\xc7\xdf\xdd\xa1\x24\xd2\x38\xe2\xf6\xbc\x56\x3f\x21\xf7\x42\x7a\x22\x4e\x62\xa3\x21\x5f\xc2\x67\xbb\xcb\x5b\x38\xec\xf2\x9e\x0d\x47\xc4\x09\x37\x5c\xa6\x12\x8a\xa2\x59\x8d\x6b\x7c\x45\x9c\xc8\xcc\x91\x37\xbd\xe4\x30\xe1\x31\x12\x31\xf2\x0f\x0d\x76\xb5\x11\x2f\xf9\xe5\x84\x8d\x29\x0d\x34\xf3\x1e\x88\x7c\x1b\x32\x30\x8b\x98\x4a\x86\xda\xad\x47\xac\xb6\x18\xa2\xed\x45\x9c\x26\x26\x3b\x6b\x19\x1d\xa9\xcb\xb2\xc4\x8c\x32\xa4\x4e\xdb\xf3\x66\x8f\x48\x5c\x7f\x20\x33\x54\xbc\x8e\x0a\xc0\xfd\xce\xa9\x42\xf7\xc0\x4a\xfb\xbf\x2c\xd6\x43\x0a\x5f\x11\x73\x26\x52\x5f\xae\xb2\xe3\x9e\xfc\xe5\xaa\xd1\x10\x8b\x50\xa3\x50\x9f\x99\x11\xdb\xca\xa5\xe5\xae\xce\x10\x41\x23\x74\xdf\x6e\x78\xf9\xb6\xeb\x4c\x85\x9d\x2b\x63\x73\x37\x17\x1a\x8c\xb8\x55\x67\xa7\xa0\x29\x83\x94\x9b\x6e\x93\x8f\x65\x90\x32\xd4\xd5\x41\xab\xca\x47\xb3\x7a\x1b\x3d\x96\x09\x43\xff\xef\xe7\x79\xa2\x98\x2f\x62\xc9\x09\x67\x4e\x88\xa8\x95\xfb\x9e\xd3\x48\xc4\x4a\x85\x89\x93\x61\x31\xc5\x13\xbd\x63\x10\x2b\xad\x11\xb6\xe2\xb8\xa2\xef\x79\x73\xc9\x6a\x25\x62\x20\x31\x62\xca\x24\x2f\x0a\x43\x74\x53\x7d\x99\x7c\x9a\xc4\x44\xec\xff\xfb\xd7\x00\x26\xd0\x2a\xef\x2c\xe6\x65\xa9\x0b\x9c\x07\xc6\x22\x70\x8f\x0c\x8a\x20\x34\xc4\x4c\xa6\x66\x3e\x1c\x2e\x3a\x31\x22\xe9\xc6\x18\xc7\xf5\xd2\xc6\xf5\x5c\x03\xca\x68\xe2\x0b\x75\xef\xaa\xfa\x67\xb7\x32\x7e\x1b\xf4\x4b\x02\x61\xb4\x97\x77\xe8\x7e\x6f\xf2\xd7\x91\xf3\x9f\x84\x24\x32\xea\x1b\xc6\x0e\x5a\xbe\xdc\x6d\x7a\x1e\x69\x67\x1e\x27\x24\x12\x58\x0d\x65\x58\x46\x26\x6a\x26\x22\x21\x3c\xc0\x40\x28\x12\xd4\xdc\xfd\x78\xbe\xdd\x0c\xe8\x2a\xbb\xc3\x0c\xf3\xdf\xb7\x36\x1d\xfb\x25\x5c\x5c\x24\x51\x46\x31\x24\x82\x70\x3a\xbb\x59\x7d\xa3\xef\xf2\x77\xff\x66\xaf\x1e\x93\x18\xfb\xe2\x61\x36\x7f\x58\xfe\xee\x82\xe4\x49\xcc\x0c\xc0\xa9\x81\xf6\x74\x9c\x9d\xda\x3d\x94\x6d\x2e\xf9\x75\x06\x69\x91\x24\x81\x52\x36\xd6\x39\x7b\xad\x73\x74\x35\x6e\x2b\x79\xba\xe2\xf4\x27\x09\x31\x85\x7f\x9e\xe1\xe6\xd9\xd9\xe8\xe1\x78\x9f\x4e\x12\xa5\x94\xad\x9f\xf8\x67\x25\x16\x87\x63\x51\x9d\xa1\x7e\xe6\x93\x8a\x1b\x91\x24\x90\x65\x43\x91\xc7\xc5\x50\xad\xd1\xb6\xa1\x71\x4a\x45\xef\xb1\x57\xcd\x17\x81\x8b\x84\xc6\xc6\x51\x34\xa5\x78\xaa\xc7\xa5\x8b\x84\x26\x11\x22\x3a\xe7\xb3\xe7\xd9\x70\xef\x4e\x52\x46\x9c\x3a\x8e\x95\xd9\xfc\xd1\x40\x8d\xb5\xaf\xc8\x32\x30\xa0\x66\x15\x49\x2a\x05\xc6\x52\x4c\x31\x12\x46\xce\x9a\xe7\xd3\x61\xf2\xbc\x2c\x36\x74\xa2\x2d\x34\xc8\x5e\x85\x26\x9f\xbb\x04\x63\xa9\x91\x96\xe6\x2d\xac\xf4\xe6\x08\x32\xd7\xb9\x44\xbe\xc8\x71\xcf\x30\x41\xc4\xb8\x8e\xd2\xb2\x38\x18\x73\x67\x6c\x11\x5f\xdf\x4b\x93\x2c\x20\x4e\xc5\xf6\x36\x7f\xf5\x49\xab\x24\x0b\x18\x7e\xc8\xee\x09\x43\xff\xa3\xb6\xb4\x9d\xdd\xf5\x7b\x41\x3c\x91\x70\x1a\xe2\xc6\x66\x59\xdf\x81\x1f\x9e\x97\x4f\x77\xb3\x6b\x44\x06\x22\xe1\x60\xf0\xa8\xb6\x88\x23\xb8\x70\x1f\x07\xab\x5a\xc2\x41\xe1\x96\x6d\x1b\xfb\xd0\xd5\xb7\x16\xa1\x3d\x57\x50\x82\xea\xb4\x2f\x37\xbf\x0f\x0d\xcf\x44\x08\x9d\x68\x67\xb8\xdb\x9c\x0d\x66\x5c\x9b\xfc\x75\xf2\xac\x32\x16\x68\x79\xa1\x2e\xac\xd9\xd5\x42\x67\x4e\x24\x32\xd1\x88\xca\x90\x75\x75\x3a\x7a\x3a\x4f\x91\x48\xa6\x91\x44\xcd\xd6\xe1\xa0\x9d\x0c\x7e\x84\x48\x4e\x90\x27\xdd\xa9\xae\x5d\x65\x34\xec\x9a\x81\x8c\x1d\x27\x44\x3b\x7d\x2c\xc5\xdc\xe4\x31\x55\xa3\xb7\xfc\xc0\x5f\xe1\xae\xae\x0e\x16\x2c\x74\xdd\xa2\x4f\x54\xc8\xf4\x48\xc7\x1a\xd4\xf2\xa8\x9b\xc9\xf2\xa7\x22\xe2\x35\xfe\xbc\xdd\xff\xa3\x51\xbf\x5d\xe7\x86\x99\xde\x03\x02\x5b\x95\x6f\xcf\xbc\x88\xb0\x25\x10\x72\xb4\x07\x8e\x13\x55\x25\x77\x38\x92\xdc\x14\xb2\x70\xad\xc7\xeb\x37\xa4\xc2\x09\x27\xbc\x40\x89\xc9\x06\x4f\x7a\x6e\x9a\xd0\x20\x62\x58\x7d\x97\x5f\x29\x6f\xf9\xdb\x32\x2c\x17\x63\xd2\xaf\x87\x34\xc8\x4c\x0c\x09\x43\x32\x70\x55\x58\x41\xd0\x50\x1a\x72\x6b\x03\x3b\xbd\x81\x4b\x02\x0b\xff\x67\x7f\x65\xc2\x58\x68\x5f\xee\xaf\xd3\x01\xea\x7c\xba\x70\x50\x92\x11\x03\x67\xb4\x81\xeb\xad\x63\x38\xed\x2b\x5e\x05\x25\x52\x84\xbd\x76\xdf\xf3\x90\xe7\x6a\x72\x35\x69\xc4\x36\x05\x2f\xdf\xa0\x9e\x15\xc5\x38\x73\x4d\xa3\x38\x8e\x83\xe1\x97\xb4\x95\x6e\xbe\xab\x23\x15\xe2\x9a\xb9\xfa\xf9\xbc\x58\xef\x7a\x63\x6d\xbe\x78\x76\x40\x1a\x1a\x47\x86\xd8\xdd\x7c\xeb\xf9\xa9\x6e\xaa\x7a\xb7\x54\x3b\x7f\x5c\xa6\x58\x81\x3b\x94\x17\x73\xc7\x92\x04\x5c\x85\xe0\x3f\x4f\xf5\xd9\x04\x0d\x26\x7e\x1c\x4d\xa8\xd1\x81\xbe\xcd\x25\xac\xb4\x2e\x72\x47\x25\x22\x68\xc2\x4d\x64\xbb\x5b\x4a\x5f\x0a\x5e\x2e\x1b\xf4\xf2\xae\x4f\x0e\x9a\x08\xc0\x2c\xce\xa9\x01\xe5\x88\x8b\xfd\xab\x52\x46\x31\x20\x76\x34\x82\x56\x86\x4a\xba\xc9\xab\x72\x80\x17\xa0\x29\xcd\xa8\x0f\xab\x3d\x03\xa8\x3b\x5b\x9a\xf8\x08\xef\x50\xb8\x75\x94\xb2\x88\x65\xf6\x3b\x2f\x0f\x47\x83\x80\x31\xdb\xef\x70\x8b\xa4\x2c\x25\x38\x86\x56\xb0\xed\x1c\xb1\x3e\x90\x42\x99\x32\xc2\xfc\x77\xf9\xb1\x41\x03\xd1\x44\x39\x83\x2b\xdc\x00\x5d\x63\x85\x44\x96\xe6\x2b\xae\x34\xfa\xb2\x9d\x61\x8b\xda\x9c\xaf\x5f\x66\xc2\xec\xe9\x59\x14\x18\x7d\x72\x2f\x6d\x95\xff\x8f\x7f\x2d\xdf\x22\x68\xc6\x22\xc4\x3d\xdf\x56\xaf\x20\xab\xbc\x1c\x31\xa2\x09\x9a\x71\x99\xb0\x1e\xa7\xf0\x00\xbc\x68\x2f\xd2\x9e\xb6\x2d\x0f\x98\x92\xd6\x6f\x58\xa3\x72\xcd\xf0\xcb\x18\xc4\x87\xad\x91\xfe\xb7\x3b\x25\x31\xe6\x7b\xb7\x71\x6d\xf7\x75\xf5\xd1\x18\x50\x56\xfb\x5c\x0d\x55\x8f\x05\x15\x16\xd4\xbe\x86\x96\xe7\xc5\x63\x75\xe6\x45\x7b\x36\x78\xa7\x21\xc7\xfe\x95\xd8\x83\x75\xcb\xa9\x4c\x3c\x87\xda\x4d\xcd\xe5\x9b\x0d\xe6\xb9\xa3\x92\xe0\xee\x90\x37\x4f\x3c\x2f\x5b\x40\x38\xc6\x53\xa5\x7c\x47\x28\x62\x58\xdb\x3e\xaa\xba\x50\xf3\xd3\x71\x0d\xcd\xa9\xc0\x62\xd2\xc8\x37\x49\x24\x33\xc2\x96\xb2\x3e\x1f\x5b\x50\x37\x9d\xab\xd3\x4e\x67\x00\xa4\xa1\xc8\x6c\xa2\xf4\xef\x56\x7d\x0a\x0a\x12\xb0\xd0\x43\xf0\x72\x7a\x3d\x60\xa9\xdf\xe7\x37\x5d\xaf\xd7\xd3\x16\x3a\x40\xff\xcc\x19\x65\x17\x9b\xb8\x6d\xa7\x63\x46\xe8\x14\xc8\xe9\x2b\x05\xba\xe3\x1c\xb3\x5d\xca\xa9\xca\x98\xdf\xd3\x20\x30\x3c\x67\x9d\x19\xf5\xc4\xcb\x2f\x22\xa4\x69\x90\x19\x34\x08\x66\x21\xab\xfa\xed\x12\x47\x67\x1b\x86\x84\x81\x74\x65\x7c\xed\xa5\x50\x80\x48\x43\x95\x61\xb2\xd9\x15\x88\xbd\xd4\xd5\xe7\x24\xf8\x96\x92\x34\x42\xc0\x2c\xf0\xe6\xdc\x59\x0e\x57\xf6\x97\xc9\x09\xcc\x00\x83\x5c\x37\xbd\x90\x97\xeb\xf1\xbf\x34\x8e\x03\xac\x80\xba\xb1\x3c\xa2\xcd\x2d\x56\x04\x8f\xde\x3b\xb5\xc4\x0e\x96\x4e\x8e\xb9\x53\x65\xa4\xac\x09\xb7\xfd\xfc\xc5\x47\x4f\x93\xc4\x54\xa6\xd4\xd0\xbd\x00\x94\x16\xaf\x36\xc8\x5f\xa6\xd4\xe6\x63\x7e\xaf\x3a\x5f\xb9\xb7\x9b\x52\x1a\x33\x1c\xb0\xcd\x07\x3f\x7e\xd1\xcf\x54\x28\x24\x13\xb0\xbc\x3d\xcd\x58\x4b\x52\xa4\x8c\x73\x14\x11\x33\x60\xd1\x87\x93\x98\xf4\x70\x16\x08\x70\x80\x03\xe4\x3b\x7b\xca\xcb\x53\x73\x07\x7e\x77\x4f\x33\x22\x71\x35\x03\x07\xc3\x71\xd1\xfc\xc5\xf6\x61\x7a\xb1\x94\x4a\x36\xb4\x8f\x57\xa2\xe5\x79\x09\x6a\xf9\x3c\x9b\x34\xe5\x24\x4e\x6d\x18\xbc\x78\x2f\x36\x3d\x62\xc8\x1d\x07\xb3\x10\x21\x00\x0c\x57\xbf\x91\x59\xd2\x1d\x47\x24\x59\x01\xba\x4d\xe3\xc9\xc5\x45\x10\xa7\xa4\xaf\x52\xec\xfd\xcd\x30\xb0\x2d\x64\x10\x61\xbd\xcf\xc3\xea\xe5\x65\xd4\xe5\x52\xc6\x88\x2d\x52\xb8\x48\xb9\x5f\x55\x42\x82\x04\x77\x3c\x13\x33\xf5\x3f\x2b\x6d\x9d\xaf\x2d\x2f\x5f\x73\x51\x00\xd6\x8a\x0c\x61\x05\x57\x4d\xf2\x54\x65\x01\x52\x6e\x9d\x4a\xa3\x66\xf0\xfb\x59\x5e\xb4\xe0\x89\x9c\xb0\xab\x9d\x8e\xc7\x0b\x69\x61\x1b\x08\xbc\xfa\x87\xbb\x94\x60\x96\x7b\xbb\x54\x5e\x9b\xe2\xfa\xfc\x86\x38\xc4\x85\x68\x71\xdc\xd7\x55\xb9\x2c\x55\xce\xbb\x6d\xb0\x5b\x40\xbe\xc5\xcb\xa6\x20\x78\x6a\x6c\xc0\xa6\xe5\x3d\xe5\x9f\xeb\x29\x1d\x71\x1c\xe2\xff\xac\xfe\x53\xfd\x92\x2c\x53\xa4\x9a\x2b\x34\xa8\x10\x39\xe3\xeb\xc9\xba\xfd\xdd\x0f\x4b\xad\x45\x66\xe6\xd5\x7b\xe5\xf7\x3a\x16\x90\x10\x87\x3b\x46\x8a\xc6\xf4\xa7\xb3\x52\x3d\x41\xbb\xaf\x26\xd4\x37\xf6\xc4\x90\xc5\xd0\x5d\x6e\x79\x38\x02\x97\x7b\xfc\x72\x68\x49\x4e\xaa\x30\x04\x23\x34\x02\xc3\xb5\xd5\x9c\x0e\xe0\x91\xdf\xee\x28\x4b\xb9\xb5\x34\x90\xc9\x00\xa1\xfe\x79\xf9\x63\x73\x7b\xbd\xc7\x59\x94\x45\xca\xc1\x0f\x3a\x8b\xfc\x7a\xab\x38\x55\xd2\x97\xee\xf9\x19\xf8\xdb\xa4\x11\x4b\x31\x9d\x7f\x9f\xdb\x65\xa4\xb7\x74\x59\xac\xb4\x74\x43\xd5\x7e\x9b\x75\x3e\x20\x30\xee\xeb\x92\xdd\xc6\xce\x68\x64\x94\x1e\xca\xea\x8f\xaa\x85\xcd\xc9\x05\x17\x59\x4a\x22\x94\xd4\xfc\xbc\x58\xfa\xae\x3a\x96\x53\xf0\x2e\x4b\x55\x86\x51\xcb\x9b\x1f\x37\x37\x8f\x8b\xe1\xf4\x63\x2c\x4c\x91\xc4\x92\x77\xd3\x68\x34\xe3\x19\xa3\x8c\x19\x76\xf8\x2d\x1c\x8e\x55\xcd\x6b\xcb\x37\xcb\x5c\x83\x34\xc4\x30\xf1\xcb\xc3\x6a\xf1\xbc\xfc\x73\x37\x5f\xad\x37\xb3\xe5\x7a\x77\xb7\x7d\xdc\x21\xb6\xd1\x5f\xc9\x92\x02\x4a\x5e\x14\xbb\xb6\x8f\x33\x32\xa6\x63\x8c\x33\xd6\x80\x5a\x46\x0a\x26\x91\x68\x96\x09\x70\x12\x9c\x96\xc2\x62\xcf\x6b\x2b\x0b\xd6\x20\x4d\xc0\x28\x76\xcb\x32\xa1\x65\xda\x2b\xa8\x9d\x2e\x42\xc9\x8c\x8b\x2c\x55\xee\x96\x93\x63\x22\x22\x18\x14\xc3\xaa\x8e\x7a\x80\x02\xb0\xc7\x25\xa1\x58\x69\x77\xac\xf3\xff\xc1\xcd\xf9\xb9\xfa\x70\xf7\x95\xb1\x74\x12\x2c\xb7\xfc\x73\x59\xde\xb4\x72\xc3\xdb\xaa\xd9\xe7\xd3\x4b\xa4\xa1\x4b\xe9\x9d\x8e\x26\xac\x8f\x80\x6d\xb8\xc6\x92\xec\xce\x91\x0c\x4d\x08\xa3\xe4\xf5\xb4\x78\xde\xee\x7e\x6c\x16\x6b\xe2\x6f\x0e\x11\x0a\x00\x5a\xca\xe6\x65\xa9\xab\x9d\xae\xea\x9d\x31\x06\x47\x93\xcf\x33\x27\x5d\x1f\x28\x8a\x67\xb8\x77\xb6\xaf\xf5\x20\x0f\xc8\x74\x98\xa0\xbf\x5b\x62\x49\xb3\x97\xbe\xf1\xd1\x11\xa6\x33\x19\xdb\x00\x9a\xe1\x28\xba\x52\x11\x2a\x98\x56\x14\xb1\x90\x38\x45\x57\xda\x02\xe3\xbd\xa9\xe7\xe7\x81\x06\xc3\x25\xfa\x0c\x1f\x13\x45\xdc\x71\xbf\x68\x9d\xb8\x7a\xe6\xcb\xa8\x5a\x16\x48\x30\xa9\x90\xfc\x80\x5b\xa3\xda\x35\xde\xfa\xca\xc2\x44\x19\xf2\x4e\x28\xaa\x11\xaa\x20\x0b\xa9\xd9\xe7\xb0\x90\x62\x56\xbe\x42\x81\x94\x04\x86\xb8\x70\xb8\xca\x67\x61\x16\xb3\x9e\xc0\xe0\x52\x73\x42\x64\x51\x90\xa1\x63\x71\xac\x61\xfb\x6a\x52\x74\x23\x74\x68\x16\x85\x92\x9b\xc1\x78\x2c\xb8\x84\x99\x3a\xe4\xa5\xe1\x1b\xbf\x0c\x59\xdb\x53\xe2\xd8\xc8\x4f\xdd\x57\x03\x06\x2e\x91\xc5\xd4\xa4\x8a\x8f\xbc\x86\xb2\xfd\x3d\x57\xcd\x63\x5e\xbe\x7d\x57\x6f\x90\xc5\xd4\x80\x84\xf2\xc6\x86\x65\x47\x64\x04\xb6\x51\x92\x52\xa3\x79\x97\xeb\xd6\xa7\x6d\x5d\xb8\x73\xdc\x94\x12\x49\xbc\x29\x68\xec\xf3\x5d\xee\x58\x57\xdd\x37\x26\x7d\x0c\x77\xf4\xd7\x2f\x0f\xfc\xfd\xbf\xc6\xff\x76\x0f\x12\x69\xc4\x6b\x5a\xba\xdc\x3f\x96\x9b\x35\x34\x50\xbf\x4f\x29\x69\x47\xdf\x8a\x52\xca\x74\x5f\x3d\x7f\x1d\xa1\x9b\xa5\x02\x30\xb0\xec\xcd\x5d\x6e\xb4\x67\xc6\xdf\x3d\x95\x96\xc3\xd8\x35\x33\x44\x47\xfb\xfc\xb8\xd2\xcb\x16\x0e\xcd\xa6\xad\x6a\xfe\x0a\xd3\x8b\x43\x82\xe8\xcb\x1f\x65\x2e\xeb\xc9\xb0\x64\x01\xc3\x8c\xa0\x38\x9d\x7f\xf6\xee\x7f\xc6\x62\xb3\x04\xef\xac\x8e\xde\xdd\x57\x65\x3c\x19\xcb\x28\x86\xec\x66\xca\x61\x79\x0d\x26\xe7\x8b\xd6\x92\xa1\x31\x24\x8a\xd6\x50\x03\x6d\xab\x4d\x9f\x1e\xc8\x98\x4a\x99\x74\x84\x73\xa5\xda\x14\xd5\x2b\x9f\xc2\x8a\x6d\xd3\x8c\x87\x48\x75\x09\x2a\x6f\x2d\x25\xc2\xf8\x56\x3c\x54\xe8\xda\x7d\xf0\xf2\x87\xaf\x94\x14\x99\x08\x03\x0c\x83\x0d\xbc\x3d\xa3\x5d\xec\x6d\x9c\x4c\x10\x9a\x66\x2e\x14\x8f\x1f\x78\xc0\xea\x66\x92\x70\xe3\x0e\x96\xa1\x42\xec\xbc\xd1\x20\x45\xad\x08\x80\xd1\xa6\x97\x49\x1a\x62\x80\xea\xe5\xc7\xe3\x66\x9a\x15\xc9\x24\x57\x46\xf2\xd5\x70\x82\x3e\x35\xaf\x97\x0a\x38\x22\x93\xda\x14\x5e\x0e\xc0\x31\xa3\x24\x62\xa6\xb8\xd1\x3c\xed\xcc\xc3\x67\xf8\x40\xca\x84\x91\x31\x9e\x29\x11\x03\xed\x11\x6e\x93\xd7\xd0\x19\xc5\xf2\x7c\x5d\x9c\x7c\xa6\x9d\x07\x22\xc6\x14\x69\xde\xfc\x5e\x56\x1f\xe5\x06\x0a\x40\x8e\x7a\x5c\xe0\x63\xdf\x88\x09\xe7\x24\x56\xe5\xc9\x87\xd5\xae\xee\x3b\x3c\xd0\x21\x8a\xcf\x61\x3e\x62\xde\x13\xf3\x09\x1e\x26\x0c\x4b\x95\xe0\xbd\xb4\x04\xa6\x5f\x96\xe6\x7e\x15\x86\x1c\xbe\x2f\x27\x81\x51\x7c\x3f\xf0\x4f\xc3\x33\xe0\xac\x4e\x4e\x62\x46\x8c\x56\x1b\xe6\x24\x9e\x73\xf9\xf6\xcc\xa7\x40\x19\x4e\x38\xe8\x21\x17\xd3\x34\xd6\x7d\x3d\x93\xc6\x63\xc2\x2d\x71\xff\xef\x00\xc7\xe9\xda\xc7\xe3\x58\x45\xb6\xb7\x76\x7c\x94\x50\x75\x0d\x52\x82\x35\x9e\xe2\xe4\x45\x63\xb7\xdb\x9f\x37\xe7\x81\xa3\xf6\x8f\xc9\x25\x25\x41\x3c\xce\x01\x05\x9e\x4d\x5d\xd9\x55\x15\xac\xe9\x93\x6a\x43\x28\xbe\x6b\xa0\x9d\x9d\x6a\x8e\xe3\x8e\x44\xbf\x4d\x5b\x71\x44\x1f\x99\x85\x0f\xab\xee\xb7\x95\x21\x2e\x70\xc6\x02\x4f\x12\x89\xb1\x63\xd9\x79\x19\x28\x95\x78\xe7\x3d\x3e\xdf\x06\x74\x60\x6d\x57\x57\xed\x9b\xb9\x7b\xd0\x8c\xc5\x4e\x6e\xf0\x66\x3b\x79\x00\x0a\x04\x09\x2f\xb6\xf7\xf3\x4b\x1e\x0f\xc1\xd3\x84\x1a\x67\x01\xc1\x71\x0d\x5a\x0b\x3d\x66\xc2\x35\x52\x84\x79\x31\x38\x9b\x29\xec\xec\x6f\xc3\xea\x3a\xbd\x22\x44\x98\x69\xc1\x3e\xdc\xc0\x88\x55\xc6\xea\xdc\x33\xd7\x54\x6b\x95\x58\x4c\x05\x34\xed\xdc\xcf\x47\xce\x54\x4c\x86\xf9\xb7\x07\x2e\xdf\x2a\x0b\x36\xf4\x2b\xf7\xe4\xc6\x59\x12\x4a\x3f\x37\x50\xae\x3b\x87\x7a\x9b\xbf\xd6\x0e\xf7\xce\x33\x1e\x07\x8e\x8e\xf2\xb6\xe6\x1f\x13\x20\x92\x6b\xa5\x55\xd4\x75\x49\x75\x34\xfa\xf2\xbd\x67\xc3\x79\xa0\x11\xb8\x66\x1c\x52\x13\xb7\x9b\x08\xa3\xbb\x96\x44\xeb\xb4\x8f\xdc\x5e\x5f\xd3\x79\xe7\xc1\x27\x46\x57\x74\x40\xf5\x6c\x0f\x4a\x2b\x9b\xba\xe7\xcd\xc6\x94\xe0\x7a\xeb\x8e\x4b\x25\x31\x59\xe2\x50\x02\x77\x35\xc0\xa3\x29\x83\xf8\xb2\x12\x7f\x72\x75\x0d\xb1\xe3\xae\x99\x3f\xec\xba\xbd\x60\x17\x3a\xb8\x29\x57\x69\x0a\x96\x27\xfa\xf9\x74\x78\xa9\x2b\x75\x92\x1e\xb6\xc2\x15\x03\x0c\xfe\x68\x87\x0f\x9d\x70\x47\x08\x0e\x41\x82\xc0\x96\x63\x0d\x8e\x2c\x72\xf2\xb5\x20\x34\xbc\x5a\x6e\xdd\x33\xd5\x87\x79\x67\x2b\xdb\xcb\x4d\x02\x8e\x22\xe0\x10\x5a\x5b\x75\x1a\x48\x13\x61\x92\x79\x31\x3b\x93\x2e\xed\xba\x6c\x10\x25\x17\x21\x0d\x12\xc3\x20\x5b\xc0\xbe\x87\x43\x89\x90\x9a\x3a\xea\xbc\x99\xf3\xb2\xad\x4a\x9b\x14\x9e\x2c\x67\x82\x04\x3a\x33\x25\x1d\xbc\x96\xfb\x4b\xa9\xc9\x49\xeb\xd4\xe8\x04\x49\x7e\xc4\xc2\x6d\x17\x84\x17\x44\x86\xa4\xa7\x19\xb7\x68\x27\xef\x7f\xc6\xff\x9e\x7e\xb4\xff\x0b\x7b\x6b\x6a\xe8\xab\x8b\x28\x34\x0e\xc6\x10\x0c\xff\xd3\x69\xce\x0b\x11\x25\x86\x92\x0b\x2b\x8f\xee\xf3\xd7\xd7\xc6\x1f\x91\x86\x92\x0d\xa5\x92\xe2\x4d\x9f\x00\x13\xb1\xd4\x58\xe9\x68\x9e\xcd\x2c\x16\x57\xe2\xd0\xd7\xb8\x1d\xa7\x20\x00\x11\xab\x24\xc5\x0c\xea\xfb\x93\x9d\xb5\x8d\x63\x9b\xfe\x76\x58\x8a\x24\xd0\xb8\x96\xed\xba\xd9\x87\x0a\x59\x05\x3f\x3f\x4f\x70\xca\x22\x89\xa4\xc1\x50\x1a\xaa\xf5\x2f\x16\xea\xaf\x6e\x41\x81\x89\x21\xbe\xd2\x73\x44\x0b\x41\x83\x18\x63\x3f\xbb\xbc\x6c\xa0\x6e\x37\x55\xdd\x3e\xc1\xa1\xaa\xcf\x8e\xe2\x32\x0c\xdd\x2b\xd2\xd0\x48\x65\xc1\x27\x4c\xe2\x56\x82\x02\xb7\x08\x4e\x70\x09\x72\x09\xc7\xbe\x14\x43\xa4\x44\x22\x0a\xd1\xa1\xf7\x9b\x65\xe9\x68\xa4\x5d\x0b\x91\x72\x93\x44\xaa\xfd\x10\x4e\x75\x84\x81\x67\x83\x5d\xbc\x54\xb0\xe8\x5a\x64\xcc\x26\x07\x1e\xf2\xd7\x3d\x34\xed\x53\x5e\x40\x83\x2b\xe6\x6c\x3a\x67\x58\xc0\x31\x47\xb6\x93\xd6\x5c\x78\xd7\xa0\xe1\xca\x27\x0f\xaf\x33\x8a\x77\x57\x50\xa8\x13\xa8\x6c\x74\xea\x62\x1d\x10\x8c\x00\x23\xbf\x16\x68\xed\x83\x34\x22\x13\x19\xf7\xb2\x50\x6a\xc0\xa4\x74\x5d\x14\x50\x08\x6e\x09\x32\xde\xf8\xf1\xe8\xf2\x20\x82\x27\x12\xad\x17\xbb\xed\x7a\xbe\xbf\xd1\x50\x61\xbf\x18\x28\x5c\x69\x8c\xf1\x70\xa5\x5e\xaa\x37\x38\x54\xe5\x2d\x46\x44\x9b\x2f\x88\xd2\xdc\x69\xc0\x90\x15\xec\x71\xf9\xb4\xdc\xee\x36\xdb\xd9\x3a\x76\x8f\x25\x64\xe8\xba\x63\xca\x09\xe7\xa7\x8e\x00\x89\x00\x02\xf3\x95\xbb\x29\xf0\x04\x2d\xff\xce\x6d\x14\x32\x49\x31\xd4\x71\x07\x30\x11\x68\xb0\x0d\x20\x88\x43\xeb\xbe\x0f\x53\x35\xe3\x9d\xf9\xcb\x7d\x5a\x00\x89\xb1\xba\x43\xf1\x96\x6f\xaa\x53\x2d\xe1\x1e\xda\x7f\x9d\x78\xdd\x1a\xf1\xcd\x62\x3a\xb4\x80\x1a\x02\x43\x71\x3a\xcf\xab\xbc\xec\xbc\xd9\xf7\x1c\x3e\xa6\xad\x78\xca\xec\x26\x63\x6b\xcc\xd0\x86\x1a\x38\x4c\xae\xa1\xc8\x14\x18\xc2\x87\xbc\xbc\xe0\x63\xef\x8e\x73\x66\xc9\xb6\xad\x9e\xeb\x6f\xa3\x72\x34\xdb\x4c\x27\x31\xce\xa9\x97\xf9\xdd\x6f\xfe\xa7\x0c\x6d\x59\x6c\x3e\xe7\x45\x81\x65\x65\x75\xcd\xbd\x8e\x93\xf7\x61\x65\x40\x4c\x85\x98\xf5\xeb\x6e\x6a\x00\x75\x85\xef\xc2\xb5\x16\x11\x3a\x77\xb6\x96\x61\x44\xca\x21\x64\xa0\x53\x2d\x1c\xb1\xc0\xe7\xf9\x11\x5e\x2f\xc9\xe6\x6c\xd3\x50\x87\x98\x9d\x30\xe3\x01\xad\xaa\x59\xa9\x96\xe5\x3b\x94\x6d\x55\x0f\x38\x01\xff\x16\xa0\xd5\x85\x4a\x24\x09\x19\x1a\x7e\x8e\x2a\xc5\x99\x31\xe3\x9b\x13\x16\x24\xca\x4b\x92\xcc\x8a\xa1\xda\x9f\x90\x51\x18\x21\x93\xdf\xe2\xee\x0e\x13\xc5\xe3\x73\x23\x22\x53\x57\xb9\xd8\xd6\x3c\x2f\x77\xdd\xf8\xd9\x15\xc3\xe8\xa0\x8c\x18\x43\xd4\xae\xe4\xa5\x81\x36\x4c\x2f\x22\x8c\xb0\x49\x09\x1f\xee\xd3\x5e\x99\x01\x32\xb2\xf1\x29\xc3\xa8\x6d\x50\xb9\x0f\xbc\xd0\xbf\xf5\x91\x88\x7f\x5c\xfd\xab\x3f\x3f\xe6\xde\x0c\xb6\x44\x08\x5f\x18\x6d\x32\xa6\x5a\xf8\xd2\xa1\x07\xde\xca\x3d\xd4\xe7\xcd\xbe\xce\x0f\x0e\x59\x2b\x93\x80\xa2\x9b\xf2\x07\x16\x2f\xb9\xfd\x0f\x91\x3c\x5f\x44\xb7\x65\x12\xa4\xc2\x4e\x86\x9b\x82\xcb\x37\x5d\xf0\xd7\xeb\x1e\x8b\x4c\x44\xe6\x0a\x64\x0d\x38\xe1\xe7\x3e\x6f\x2e\x7c\x25\x99\xc8\x40\xaa\x1e\x18\x3b\x44\x8c\x49\x1a\x9a\xd4\x93\x01\x39\x3e\xf1\x1c\xf1\x82\xc3\xf0\x86\xa4\x31\x04\xba\xb7\x60\x17\x3e\xe5\x23\x69\x92\xa6\x36\xf7\x37\x2b\x0a\x6b\x1c\x3e\xf6\xd5\xf4\x32\x65\x99\xb4\xf1\xfc\xd5\xf3\xfd\x6e\xf6\xe3\x76\xb9\x1d\xa3\x7d\x24\x4b\x42\xcb\xac\x61\x5e\x61\x59\xde\x42\x23\xa1\x54\x7c\x50\xff\x37\x39\x85\x13\x6a\x6d\xbc\x6e\x0d\xf8\x99\x97\xcb\x72\x80\xf2\x19\x77\x67\x96\x31\x0c\xa2\xff\x51\x15\x23\x50\xbc\xcc\x44\xe0\x04\x13\x5e\xea\xea\x90\x37\xb0\x54\x5f\x92\x82\x0d\x36\x26\xc9\x59\x88\x8b\x60\x8d\x90\x80\x9b\x5e\x7f\xe4\xc2\xd0\x9e\x1a\xe0\x13\xe6\xaf\xc9\x87\xe7\x1c\x10\x5d\xf3\x02\xed\x81\x97\xb2\x1a\x97\x54\x49\x2e\x52\x27\xa6\x7a\x3b\x3b\x4e\x7c\x1e\x29\x83\x28\xe1\xc3\xe0\xfa\xac\x54\xae\xbc\xd9\x35\x21\x0c\x2b\xc7\xde\xf2\xb6\xc5\x61\x78\xe0\x79\x89\x88\xe4\xdb\xba\xf2\x23\x56\x46\x61\x28\x87\xa8\x9b\xd1\x70\x91\x29\x89\xc3\x01\x06\x78\xca\xda\x24\x24\x90\xc8\xb2\x36\xb5\x27\x53\x47\x79\xc1\x5f\x29\x24\xd0\x04\x51\x37\xb5\x8d\xfd\x59\x7b\x01\x51\x8d\xee\x56\xc0\x38\xc2\x54\x3e\xfa\x90\xb6\x5d\x3b\x87\x30\x5e\x09\xc0\x95\x55\x41\xdb\xfc\xf7\xc4\x6b\xf8\x25\x55\xb5\x50\x41\x40\xf0\x1d\x91\xbd\x1f\x5d\x71\x7b\x35\x15\x85\x3c\xa1\x16\x23\x3f\xe7\xc7\xc7\xea\xe3\x47\xa3\xfc\xc1\x94\x60\x4c\xfb\x25\xff\xcc\x4f\xbb\x1b\xf0\x68\x0b\x15\xf1\x10\x61\xe9\xa8\xce\xce\x0f\x83\xfe\x54\x91\x8a\x03\xea\x16\x89\x91\x38\xb8\x50\x31\x15\x8a\x0c\x74\x80\x6f\x4e\x75\x79\x07\xe0\x34\x96\x7e\x15\xaf\x71\x57\x61\x31\xba\xbb\x58\xc7\x81\x84\x3b\x82\xcb\x37\x2f\x12\xe0\x5a\x29\x2d\xed\x77\x41\x32\x72\x2c\x83\x9b\xb0\xe0\xb9\x19\xa6\x92\x80\xc5\x7d\x52\x61\x57\xe9\x1d\xae\x87\x6e\x18\xa8\x24\x90\x4e\x93\xdd\x48\xcf\x9d\x46\x65\xc4\x2a\x61\x86\xb3\x1a\x3f\xe8\xee\x85\xb7\xf9\xc5\xc4\x54\x09\x10\xea\x6a\xb8\xfb\x5a\xb8\xd1\x6a\xae\x68\xc8\x11\xd1\x54\x56\xa5\x35\x63\x0d\x05\xb2\xd1\x39\x72\x77\xa3\x69\x8a\x88\x4a\xd7\xbb\x7f\x37\xcc\x35\x7e\x1e\xca\x4c\xa9\xbb\x13\xa0\x1c\xc5\x05\x55\x1a\x70\x0c\x2e\x3f\x2d\x9f\x77\x4b\x97\xea\xf1\x07\x21\xc5\xb4\xe5\x9c\xb7\x56\x09\xf5\xab\x65\x64\xfc\xe5\x52\x5b\xd2\x7f\xe0\x9f\xf9\xc1\x79\x00\x77\x55\x3d\x2c\x52\x50\x2c\x35\x6a\xc5\xdb\xfa\x4c\x08\x21\xfe\x67\xad\x10\x0d\x62\x59\x0f\x9f\xf2\xb2\x5b\x89\xec\xc1\x8c\x68\xa4\x16\x71\x44\x24\x9e\xdc\xde\x84\x69\xaf\x1b\x18\x0a\x75\x86\x7c\x68\x69\xb1\x7d\x98\xb0\xc9\x09\xc5\xa3\x18\x83\xb4\xbf\x24\x4c\x52\x9c\x27\x18\xe7\xd7\x55\x2d\x73\x51\x9c\xad\x87\xbb\x93\x76\x78\xba\x27\x15\xd2\xc8\xda\xdf\xf0\x66\x08\x1e\x72\x5b\xfc\xf5\x07\x15\xda\xe6\x81\xaa\x52\x72\xdf\x51\x32\xa0\x86\xb9\x0b\x4d\x94\xa1\x3a\xec\x78\xad\x54\x32\x54\x98\x5c\xb9\xaf\x0a\xb5\xf6\x65\x2e\x4a\x52\x82\xc1\x6e\x59\x1d\x8e\x55\x03\xff\xc4\x02\xd9\x89\x85\xff\x7f\xc9\xbf\x5d\xeb\x2c\x89\xe9\x08\xc6\x6b\x30\xec\x3f\xea\x7c\xbc\xc3\x29\xa9\x04\x51\x4e\x29\xba\xad\x0e\xbc\x05\xb5\x86\x63\x55\xb7\xb7\x27\xac\x7a\x6d\x5a\xee\x2d\x06\x25\x15\x70\xf7\x11\xf8\x6b\x2e\x37\x6d\x75\xa9\x56\x6a\xdb\x02\x01\xcf\x81\x78\x53\xa9\x33\x16\x02\xa2\xe9\x3c\x89\x3e\x2a\xe0\x29\x58\x09\xe4\x4b\xb1\x02\xa1\x40\x48\x8c\x7d\x28\xa4\x06\x73\xbe\xa7\x02\x20\x41\x2f\x1d\x83\x3c\x4a\xf5\xe0\x58\xd4\xf5\xf6\xff\x07\x75\x05\x96\xbc\xc8\x1d\xd3\xca\xd3\x21\x63\x0c\xfd\xb5\xe0\xa5\xba\xd0\x57\x12\x10\x04\x04\x49\x9a\xe0\x33\x9f\xd8\xc5\x10\x44\x66\x69\x44\x14\x33\xd6\x5f\x2e\x4b\xe9\x0f\x26\x01\x1e\xbc\xcb\x05\x56\x10\x37\xd6\xcf\xb9\x10\x4a\x75\xed\x25\x4d\x4d\xd2\x29\x3f\x6e\xf2\xff\xb9\xe7\x84\x30\x92\x99\xb9\x49\xa1\x46\xa9\x06\x20\x01\xc1\xb0\x15\x57\x6a\x53\x1d\xe0\x76\xb1\x6d\xb6\x5f\xe4\x63\x80\xc4\x1c\x6b\xbd\x8c\xf7\xfc\xcb\xd5\xe7\xab\x3f\xaf\x15\x1b\xba\x3b\x68\x53\x26\x3b\x50\x1a\x5b\xe9\x9f\x90\xcf\x0d\x1f\x9b\x8f\x06\x42\x44\x20\x8d\x06\x94\x42\x66\xaa\x5d\x05\x22\xb8\x33\x62\xa3\x86\xd4\x58\xb2\xe5\x99\x9c\xc4\x30\x20\xca\x84\xb2\x96\xc5\x16\xea\xc3\x04\xad\x0d\x71\x60\x05\x05\xcc\x3a\x64\xa3\x17\x9e\x05\x0c\x62\x42\xd0\x48\x56\x9d\xdb\x7d\xc8\x4b\xaf\x82\x30\xbe\x4b\x9c\xc6\xb8\x0e\x14\x9d\x19\x7d\x27\xf3\xce\xb0\xb3\x22\x41\x03\xfc\xdf\x3f\xa6\x27\x51\x3c\xc9\x54\xd3\xf8\x34\xc7\xc9\x54\x7e\x3b\x73\x6b\xf8\x37\x77\xa2\x34\xd5\x4a\x4e\x37\xbb\xb9\x70\x35\x21\x56\x99\x08\x86\xd4\x7a\x55\xf1\x8e\x28\x65\xb3\x90\x7e\x53\x73\x0a\x49\x90\x68\xa3\x31\x80\x6c\x79\x48\x5d\x33\xe9\xb5\x24\x63\xc8\xdc\xba\x59\xde\x6f\x87\x56\x1e\x24\x3a\xe6\xd4\x47\xd8\x73\xd9\x4d\xc7\x9b\xf3\x46\x56\xf5\xc4\x86\x02\x1a\x18\x25\x2c\x4c\xa9\x7d\xd4\xf9\xd4\xc8\x02\x9a\x2a\xac\xbf\x91\xb6\x5f\x9e\xf9\xc1\x16\x4c\xbb\x45\xad\x37\x6a\x81\x6a\x1e\x5a\x57\x62\x28\xe8\x82\x8b\xc9\x90\x5c\x0b\x58\xa0\x20\xf5\xb4\xe2\x55\xbd\xbc\x9d\xce\x6a\x46\x42\x44\x6a\x3c\xc3\x79\x6a\xc4\x02\xa3\x1a\xc3\xf9\x68\x79\x75\x9b\xf5\xae\x3b\xdc\x0c\xa2\x8f\x90\x59\xb2\x9e\xce\x8f\xc8\xcb\x57\xbb\xa1\x1a\x11\xc5\xaf\x80\xf2\xee\xd4\x2c\xcd\x26\x2f\xb1\xad\x46\x4f\x9f\x71\x86\xfa\xc5\xf7\xd0\xde\x77\xfb\x11\x56\x23\x0e\xd9\xe0\x05\x64\x3a\xc5\x12\x5e\x38\xe4\xad\x45\xa4\x5f\x09\x56\x8e\x6f\xcc\x03\x91\x66\x0e\x0a\x83\xb9\xa6\x51\x61\xfd\x68\x32\x73\x46\x4c\x44\x0a\x97\x8b\x5e\x12\xea\x74\x09\x04\xfb\xd2\x82\x05\x9e\x19\xd8\xc9\xec\xc7\xf6\x61\x77\xb7\x5e\x2c\xfe\xbf\xc5\x6c\x3e\x5f\xfd\xf0\x36\x09\xf0\x4c\x61\x4c\xe5\xe6\x71\x35\xff\xfd\x65\xf9\xe7\x6e\x80\xe0\x06\x2e\x01\x6d\x1d\x5b\x3f\x0a\x36\x31\xfb\x8d\xe6\xb6\x00\xae\x0c\x7c\xc7\x46\x3d\x78\xa9\xe4\x90\xdb\x71\xdc\x58\x24\x86\x47\xc6\xc4\x2a\xe6\xbc\xb4\x16\xdb\x60\xc4\xc9\x88\xe0\xba\xe2\xcb\xbb\xbf\x4f\x08\x82\x8c\x13\x1c\x17\xe2\x74\x9e\x4f\x05\x7f\x05\xc8\x24\x94\x72\xc0\x46\xf8\xab\x8b\x41\x62\x69\xdd\xd1\xa7\xc5\x3d\x31\x1c\x54\xaa\x83\x0a\x32\x74\x63\xfc\x0a\x61\x66\xce\x40\xa5\x47\x80\xa2\x0a\x12\x9b\x2b\x5e\x89\xff\xe0\x5c\x6f\xf7\x26\x82\xd5\xc3\x2a\x26\x43\x45\x09\x86\x45\x05\x4f\xb6\x40\xd0\x5d\x0c\x88\x44\x17\xc2\x31\x30\xbb\x30\xf0\xf8\xb9\x21\x09\xa3\xee\xab\xde\xfd\xfc\x35\x70\x10\x20\x8d\x30\xe5\xd8\x42\xd3\xfa\x85\xcb\xdf\x2f\x35\x89\x6a\x27\x05\x75\x53\x5d\xe2\x20\x27\x9d\x06\x99\xc4\x3c\x54\xa5\xb5\x61\x3d\x18\xa4\x55\x40\x13\x8e\x73\x0f\x78\x5d\x9c\x5f\x4e\xb5\x34\x19\xce\x37\x28\x47\x86\x34\xe8\xcc\xd4\xf7\xfe\xf1\xe3\xc5\x15\xd6\xee\x6e\x66\x1b\x64\xd2\x5b\xf8\x46\x9c\x60\x58\xfc\xe7\x7c\x1b\x8e\x57\x17\x1d\x04\x0e\x56\x7b\x74\x89\x84\xd1\x53\xea\x80\x6a\x8c\x11\x7a\x61\xfd\xea\xb9\x27\x74\x1e\xbd\xe1\x25\x63\x59\x3f\x3c\x75\xc0\x52\xac\xda\x15\x79\x3d\x29\x10\xe8\xe1\xfe\x3a\xe0\x11\x32\x14\x3e\x2e\xff\xf5\x63\x79\xbb\x1b\xd0\xdb\xbd\xbc\x3c\xfd\xe6\x1a\xc9\xd4\x55\x3d\x59\xa0\xfe\xf4\x95\x74\x6c\x2a\xca\xab\xa2\x18\x56\xde\xeb\x30\xca\x90\xe3\x1d\x4a\x35\x6b\x0d\x2f\xc9\xf8\x5d\x49\xc0\xb1\xd8\xe1\x54\x1a\xcd\xee\xd9\x76\xc2\x05\x37\x1e\x7c\x9a\xd0\x00\x7d\xae\x97\xd9\x76\xfe\xb0\xfb\x63\xb1\xde\x2c\x57\x8e\xab\x54\x47\x01\xc1\xbb\xe1\xd6\xb3\x2c\x3b\x87\x3c\x7f\xcf\x9b\xbe\xc6\xc9\x37\x24\x49\x10\xa3\xdb\x52\xbf\xcd\x1a\xa3\x50\x39\x4a\xbe\xeb\x28\x0e\x71\x93\xd8\x75\x93\xbe\x1a\xd4\x3d\xe8\x98\x90\xc8\x33\x40\x9c\x4a\xb5\x98\x66\x3b\x75\x4c\x28\x1a\xd6\x9e\x17\xdb\x33\xd6\x0e\xfd\x7e\x1d\x13\xe0\x89\x73\x45\x1a\xbb\x4b\x7c\x31\x7e\xff\x5e\x3e\x48\xc7\x51\xc6\x30\xb5\xce\xcb\xfc\x63\x68\x0e\xea\xc4\x56\x8c\x35\x2d\x20\x27\x96\xf9\x16\xee\x20\xd1\x38\x2d\xfe\xe8\xa1\xb7\x3a\x49\x32\x0c\x97\x22\x4c\xe5\x1a\x7c\xf0\xfa\x46\xa2\xa9\x32\xe4\xd5\xbc\x69\x2a\x99\x77\xd3\x6b\x32\x44\x2f\xa1\xa9\x9a\x05\x29\x02\x2c\x4c\x08\x0f\x1d\x8a\xc9\x00\x63\x44\xa5\x56\x4e\xec\xee\x54\xaa\xa7\x1e\x2d\xa2\x99\x30\x71\x6f\x63\xe6\x6c\xc0\x4e\x27\x67\xa8\x68\x26\x34\x66\x61\x6e\x4f\xad\xdc\x4f\x42\xc3\x5f\x74\x23\xd3\x46\x17\xb7\x73\xfd\xe0\x0e\x59\xae\xdc\xdd\xb2\xd0\x68\x1f\x1b\xab\x7e\x65\xa2\xb2\x96\x53\x5c\xe8\x2c\x13\x38\x9b\x96\xf3\xd5\x1a\xf1\xc4\x5f\x2b\xa4\x5f\xbf\x73\x26\x22\x18\x6c\x51\x1e\x19\xfc\xed\x5e\xa0\x33\x91\xe2\x9a\x8a\x21\x8e\xbb\xaf\xeb\xd1\x5d\x73\xa0\x48\xbe\xf8\x61\x28\x09\x1b\xc7\x5e\xab\x79\x94\x66\x06\x30\xcb\xd5\xf9\x1a\xed\x95\xe6\x09\x20\x8e\xbf\xc2\xca\xf7\xbc\x7c\x5d\x69\x9d\x4b\xaf\x6e\xe5\x2f\xc4\x33\x04\xd6\xe6\x65\x67\x23\x34\xe0\x71\x0e\x97\xcc\x68\xee\x0c\xc8\x88\xab\x35\xb0\x70\xab\xef\x43\x60\x5a\x04\x0a\x0b\xca\xf2\x16\x0e\xa3\x79\x25\x84\x42\xe3\x75\xf8\xc1\xb7\xd5\xbc\xe6\xfa\x4b\xfc\x90\x3b\x53\x1a\x24\xf3\x83\xaf\xdc\xf8\xe5\x16\xa5\x85\x4e\x6c\xe5\xc2\x3b\x14\x26\x65\xe5\x97\x0a\xc9\x84\x70\x52\x5d\x93\x42\xf9\xf1\x45\x64\x96\xa0\x58\x4f\x03\x45\xb1\x69\x7b\xee\x30\xad\xb2\x14\x01\x63\x18\xd2\xc6\xa5\xb7\x1e\x58\x20\x5a\x89\xd4\x31\x2a\x5e\xa1\x03\x9c\xbc\x9d\x52\x06\x9a\xbe\x6b\x38\x82\x41\x2e\x4a\x0f\xae\x38\x6e\x1a\xa8\x70\x48\xf5\x45\xbb\x7f\xa9\x73\x99\x8f\xe4\x5c\x84\x06\x60\x46\xc4\x3f\x3f\xee\xad\x01\xf6\x5d\x5c\x45\xeb\x30\xb3\x54\xdc\x35\x56\x3a\x0f\x31\xab\x32\x08\x42\x1a\x8e\xb9\x95\xbb\x39\x80\xa9\xdf\xb6\x2a\xaf\xd7\xda\x31\x77\xae\x10\x31\x12\x6b\x9b\x6f\xbe\x39\x49\x09\x4d\xa3\x4f\x17\x26\xde\xd5\xa5\x4b\x06\x21\xc9\xd0\xe9\xd7\x00\x77\x55\xbd\x39\x16\x79\x67\xc0\x20\x02\xcd\x47\x06\x65\x40\xc2\x0c\x9d\x03\x63\x0f\x6e\x7f\x45\x75\x35\xbe\x05\xa1\x1a\x77\xa8\x3c\xf7\x97\xe3\x59\xe4\x85\x6c\x10\x7c\x66\x0f\x44\x34\xc0\x6f\x2b\x78\x03\x3f\xd6\x4b\xff\xb3\x54\x71\xe6\x15\xc6\xf3\x76\x60\xc2\xc8\x20\x0e\x28\x2e\xbe\x08\xde\xed\x96\xf9\x0d\x8c\x83\x96\x32\x88\x09\x65\x76\x47\xc6\xea\xfa\xd0\x9f\x1b\xa5\x69\xe4\xc4\x0a\x46\x9b\xfc\xc0\xdd\x96\x41\x9c\x4a\xcc\xdc\xc3\x3b\x2f\x4e\xa6\x94\x05\xa5\x03\x9f\xa0\xad\x73\x89\x81\xd9\xe9\x1d\x33\xc1\x32\xcf\xb8\x37\xaf\xab\xa6\x73\x56\xdf\x3c\x16\x49\x06\xb1\x0c\x31\x78\xf3\x78\x92\x6f\x67\xc7\x60\xe7\xf4\x1b\x7a\xe7\x4b\x06\x49\x60\x98\x43\x8a\xaa\x7a\xf3\xbf\x11\xe9\xca\xb7\xee\xeb\xea\x74\x74\x45\xae\x43\x77\x55\x06\x49\x1c\x86\x0e\x43\xde\xd9\x75\xdf\xed\x68\xfe\x14\xae\x7a\xe8\x83\xb3\xbf\xae\xac\xae\x23\xe9\xe9\x71\x10\xc4\xcf\x55\x19\x24\x89\xc4\x92\x94\x0f\xcf\x9e\xe6\x74\x2f\xaf\x2d\xea\x32\xa0\x81\xd1\x05\xdb\x19\x6e\x8b\xea\x78\x2a\x78\x9d\xb7\xe7\x0d\xb4\x88\xe3\x3a\x8d\x10\x2b\x8e\x27\x4e\x06\x94\x30\x0c\xd7\x73\xa5\x10\xf1\xfd\x9d\x70\x50\xd7\x5a\xa2\x4f\x74\x57\xd5\xaf\x7e\x18\xd1\x58\x51\x87\x07\x9c\x63\x2c\x11\x2b\x46\xaf\x42\x09\xed\x29\x2c\x25\xb8\x75\xf4\x5e\xeb\x66\xb6\xad\x16\x5f\xbc\x1b\xd3\x5c\xdb\xcc\xd5\x9c\x37\x30\x58\xbe\x65\x90\xd1\x10\x43\x5a\x1a\x5a\xb9\xb7\x72\xf0\x48\xde\x6a\x0a\xa8\xa7\x20\x72\x19\xf0\x30\x44\xaa\x30\x55\xcd\x5d\x6a\xf7\x37\x7f\x88\x62\xa1\xd7\xa2\xdd\x6f\x4f\x75\xf9\x73\x7e\x3f\x19\x9b\x22\x04\x84\x1a\xff\xb1\xd8\x6c\x97\xcf\xf7\x08\x71\xd8\x22\xa1\xb3\xbb\x84\xa0\x14\x63\xaa\x2f\xf7\xab\xdd\x8f\xe7\xce\x15\x5d\xdc\xee\x8c\xb5\xbc\xdc\xfe\xb5\x9b\xcf\x5e\x5c\x4b\x49\x0c\xd0\xac\x2f\x59\x1f\xdf\x4b\x11\xc9\xec\x62\xfd\x00\x75\x85\x78\xa6\x2f\x7a\x53\x71\x70\x63\x7a\xdd\x47\x3b\xdc\x41\x41\x11\x2f\x35\xe7\x2d\x7c\x8e\xa6\x07\x88\x04\xa7\xff\xe3\xea\x7e\xb7\x98\xd6\xf7\x21\xdb\x06\x32\x16\xf4\xcd\x25\xe6\xe3\xac\x96\xfa\xee\xc3\xb7\x9c\xf4\xb0\x4e\x0d\x97\x22\x52\xc2\xcc\x94\xba\x35\xc8\x89\xdf\x7a\x8b\x6e\x1c\x40\x92\x61\xa0\xa4\x32\x09\x0d\xd4\x1a\x28\x25\xcc\x79\x93\x97\xd5\xf0\x71\xc3\x90\x69\xb4\x93\x3b\x83\xef\x67\xde\x99\xd9\x13\x36\xbc\x71\xaf\x84\xa1\x90\x96\x48\xc5\xd1\x2a\x8c\x7b\x38\x24\x71\x8a\xee\xac\xe2\x2d\x17\x38\xae\x86\xdc\x40\x32\x8c\x42\x85\x2e\x31\xbe\xc7\xd3\xa5\x7e\xa5\x7f\xfc\x28\x8a\x0d\x6f\x3b\xb4\xb7\xd0\xc8\x3a\x3f\x5e\xd3\x56\x93\x61\x24\x12\xed\xf3\xe7\x36\xe9\xe5\x6e\x16\xa7\x09\x37\x25\xbe\x67\x27\x54\xed\x8e\x08\x81\x3a\x1b\xe2\x74\x9e\x9d\xda\x6a\xfa\x16\xb1\x26\x28\x78\x73\xe8\x3c\x4b\x9c\x73\x8f\xbc\x69\x4d\xd7\x38\x98\x9d\x6d\x9a\x04\x1a\xaf\x94\x97\x79\xfb\x08\xba\x75\x34\x40\x8d\x6f\x60\xeb\x2a\xef\x51\xa5\x68\x5e\x95\x0d\xc2\x17\x5a\x97\x5b\xa8\x7f\x1b\xdd\x9a\x66\x86\x67\x2a\x6f\x0c\x82\xe1\x1a\x2f\xb7\x0c\xa9\x34\x95\xdf\xb8\xd8\x67\xee\x56\x29\x09\x8c\x86\x03\x3f\xc0\x1c\x7a\x6c\x85\x0c\xd3\x94\x20\xe0\xf0\x9f\xd5\xf9\xb5\x5a\xac\x36\xdf\x93\x8f\xfc\x2d\x4b\x59\x86\x8c\x00\xa2\xa3\x0b\xde\x98\xe0\xcb\xb2\xd9\x0e\xb4\x72\x6f\x07\x11\x14\x77\x06\x4b\xb2\xc8\x27\x87\x6e\xa0\xbd\x42\x79\x28\x43\x96\x49\x1c\x94\x16\x6a\x30\x3b\xe4\xcd\x68\xd0\x32\x29\xb1\x4a\x0b\x35\x0f\x36\x50\x14\x0f\x9b\xcd\xbe\x3a\x7e\xbf\x97\x84\x59\x2c\x12\xff\xb4\xa3\x9a\x03\x77\xdd\x2c\xd5\x2e\xe4\x7a\x3d\x24\x25\xc3\x0c\x52\xe6\x54\xb0\xf2\xd7\x72\xba\x10\x86\xdc\x72\x7b\x22\x8f\xc4\x6e\x3b\x5b\xdf\x3b\x39\x16\x19\x4a\xaa\xdc\xcb\xff\x91\x7f\x2b\x26\x27\x91\x77\x1d\x65\xa8\x0b\x5e\x2e\xfe\x74\x57\x50\x41\x88\x75\x05\xbd\x65\x66\xf8\x15\xbf\x73\x4d\x64\xa8\x62\xad\xb2\x01\x95\xb4\x19\x9e\xdb\x7d\x5e\x2b\x8b\x22\xe9\x63\x56\x32\x84\x20\xc2\x82\x13\x03\xd3\x5f\xfb\x68\xc2\x18\xae\x69\x1b\xeb\x20\xc1\x1c\x0a\xea\xa2\x2d\xd5\x80\x25\xe0\x37\xc3\x33\x3d\x6d\x4f\x52\xa4\x93\xcf\xa5\xa1\x1c\x4a\x7e\xf3\x07\xb4\xb0\x22\x8b\x51\x1f\xc7\x95\xa1\xd6\x21\x5a\xaa\xe8\x02\xdb\x1f\x49\x10\x6b\xcc\xd6\x4b\xa8\xdb\x5c\x9f\x9f\x78\xd9\xe3\xab\xfe\xed\xda\x50\x8a\xcb\xc7\xd3\xec\x4f\x47\xea\x31\xbb\xfd\x63\xb9\x59\xad\x37\xbb\x97\xd9\x7a\xfb\xbc\x58\x6f\xfc\xf5\x24\x60\x1c\x1d\x99\x04\xa7\x34\xb4\x92\x04\x2a\x4d\x06\x1a\xdf\x6b\xae\x75\x01\x2f\xb6\x8a\x61\xd4\xd5\x24\xd0\x12\xed\xfb\x27\xa8\xdf\x3a\x6f\x01\x60\x5d\x55\x56\x79\x6c\x10\x2c\xb2\xad\x43\x96\xe2\x9a\x7e\xcf\x0f\x16\x8f\x3d\x75\x07\xae\x8d\x68\x36\x34\xb8\x09\x89\x63\x84\x6e\xdf\x2e\x1e\xdc\x40\x23\x84\x02\x26\xd6\x77\xc7\xba\xea\xcc\x6f\x7b\x7d\x77\x38\x0a\x03\x1a\xd8\x18\x28\xaf\x27\x6f\x10\xa5\xd2\x92\x78\x1e\xf2\x72\x67\xb8\xe9\xc4\xa9\x2e\xa7\xcd\x64\xea\xb8\x97\x1d\x03\x9b\x9b\xfa\x37\x67\x64\x0b\x42\x7b\x7d\x8a\x69\xb9\x9a\x44\x1a\xf5\x49\x1c\x12\x34\x2f\xef\xa1\x9d\xef\xf3\xa3\x67\x15\x76\x56\x24\x89\x43\xe1\x90\x4d\xf3\xbc\x3d\x63\x88\x7c\xfc\x6c\x31\x4f\x1d\x16\x7c\xf6\xce\xf3\xa2\x5b\x8b\x5c\xf0\x69\x34\x1c\x49\x2c\x59\x6a\xc4\x65\x5a\xe8\x56\x92\x52\x41\xbd\xd2\xd3\xcb\x01\x51\x26\xbf\xde\xf4\xbc\xaa\x92\xd0\x38\x43\x50\xd6\xd3\x79\x0b\x76\xf9\x0b\xfd\xb1\x44\x61\x18\xb6\xf3\xa4\xef\x00\x16\xcc\x86\x28\xae\x7b\x24\x84\xf6\xc8\xd0\xbb\xaa\x6a\x05\x2f\x8a\x91\x90\x82\x6d\x96\x0a\x62\x95\x6e\x7f\x29\xaf\x37\x5e\x01\x08\xd3\x1c\x70\xd3\xcd\x5f\xbf\xa0\xe9\xee\x8d\x64\x92\x25\x86\x6b\xd1\x16\xd7\x1d\xbb\xf6\x36\x10\x1d\x07\xff\x18\xc4\x5a\xba\xa6\x80\x85\x50\x33\xa5\x76\xb7\x95\x1c\x26\x20\xae\xba\x9f\xa3\x9d\x9b\x64\x2a\x0d\x3d\xdd\xbb\x61\x53\xc0\x22\x49\xb7\x73\x12\xae\x63\xb4\x25\x9e\xf2\x76\x5f\xe7\xc5\xec\xd3\x2d\x52\x44\x48\x6d\xe6\xd9\xec\xcf\xcd\xec\x71\xb1\xe9\x4d\x40\x22\x13\x1e\xda\xce\x9c\xf3\x1a\x17\xe9\x2f\x18\x59\x4f\x43\x4a\xb7\x0b\x78\xd5\xa8\x9a\xd6\x5e\x5b\x25\x0a\xa9\x40\x9a\xf3\x41\x54\xc5\x55\x60\x99\x24\x20\x33\x03\x6b\x39\x41\xd3\xec\xda\xcf\xb1\x17\x44\x34\x35\xfa\xf3\xa6\xa8\x74\xaa\x11\x78\x75\x37\x88\x82\x08\xb0\x78\xff\x26\x6f\xa1\x91\xb9\x45\x0c\xc9\x28\x48\x8c\xd3\xd6\x40\xfb\xb3\x2a\x3b\x4f\x7e\x3c\x64\xa2\x40\xf0\xc4\x6e\x39\xdb\xbc\x3d\x15\x3c\xaf\x61\xd7\xb9\x13\x2d\xec\xe2\x69\x5b\x15\xa6\x46\x21\xb5\xac\x4e\xa5\x84\x65\xd3\x9c\x06\x26\x53\x14\xe8\x14\xa1\xfe\xad\xe5\xf6\x1b\x9f\x4d\x28\xc7\x3d\x1b\x2b\xa7\xef\x4e\xa5\x7a\xf8\x39\x77\x67\x12\x19\x98\x0a\x7e\x47\x16\x2a\x23\x02\x41\xe8\x08\x14\x1c\x61\xf1\xd5\xb1\x1b\x45\x60\xe2\x2b\x9d\xc9\x50\xc9\x37\xd7\x51\xa6\xea\x6d\xd2\x4f\x71\xc8\xac\x9b\xfb\xa3\xb3\x2c\x87\x94\x8f\xe3\x8b\xc6\x11\xc7\x68\xa7\x72\x53\x77\x1c\x64\xeb\x1a\x68\xfc\x4a\xce\x1e\xd7\x27\xcf\xcb\x2a\xa3\x38\x83\xc4\xa9\xa2\x9e\xca\xc3\x68\x0b\xfe\xd6\x06\x89\x62\x99\xa5\x16\x97\x71\xb7\x5c\x6f\xb6\xbb\xcd\x76\xf1\xb2\x43\x68\xf7\xa4\x3f\x53\x2a\xa5\x29\x98\xeb\xb7\x54\x77\x28\x25\x98\x0a\xc0\x79\x73\xe4\xb9\xaa\x4e\x6e\x55\x8a\x18\x89\x41\xfb\xd1\x35\x7e\x35\xb7\x37\x46\x4c\xc5\x88\x01\x3e\xf2\x53\x03\x4f\xd3\xf2\x17\x19\x65\x61\xa6\xa5\x07\x35\xa2\x50\x99\x2d\x83\xb9\x40\xe1\xc9\x28\x13\x29\xae\x2d\x9d\xcd\xd9\xe0\xae\xe8\x36\x9a\x88\x93\x00\x43\xe1\x7f\xe4\x4d\xcb\x87\x5b\x6a\xc4\x39\x47\x1d\x97\xa6\xe4\x79\xe1\xd9\xac\xbb\xdf\xa5\x76\x82\x5b\x5d\xfb\x6d\xb5\x68\xf7\xe8\x79\x8e\x36\x81\x48\x50\x43\xc4\x5e\xe7\xaf\xfb\x96\x45\x93\x47\x92\xc4\x10\x76\x1a\x65\x1b\x13\x7c\xfc\xa8\x2e\x99\x44\x65\x04\x94\x63\x81\x06\x46\x99\x6f\x90\x7b\x77\x3c\x0e\x80\x42\x20\x8d\x5d\x52\x56\x87\xfc\xa2\xc2\x5b\x46\xc0\x00\xd7\x1b\x2b\x2d\x60\x0d\xda\xc9\x55\x78\x8a\x09\xeb\x03\xc6\x45\x1e\x78\x33\x22\x8a\x18\xad\x8a\x71\x10\x66\x3a\x1e\x85\x3c\x3a\x67\xe3\x0a\x6b\x9d\x5d\x9b\xec\xae\x62\xff\xe8\x4c\xae\xe1\x9f\xb6\x91\x67\x05\x30\xff\x70\x23\x21\x0e\xe2\x00\x47\x99\xb1\xa4\x79\x01\x9b\x23\x6e\x82\xdb\x4f\x57\x9b\x30\xea\xaf\x38\xcc\x8c\xb0\xf6\x66\x3b\xff\x7b\x23\x3e\x8e\x38\x91\x7c\x10\x86\x9e\x7d\xc5\x73\x3b\x39\x2f\x4e\x03\x2d\x2c\xe5\x81\x67\xe8\xb6\xc7\x12\xaa\x9c\xd4\xda\x62\x3d\xbf\x2a\xb3\x2a\xe3\x24\x4d\x4c\x34\xdb\xd3\xf8\x20\xd7\xfe\xa8\xaf\x69\x44\xa3\xc4\x31\x47\x36\x46\x59\xb7\x99\x34\x89\x65\x64\x60\xcf\x32\x87\x77\x58\x83\xe7\x4a\xbe\xfe\xdc\x94\x13\xec\x51\xae\x94\x89\xb8\x4f\x67\x5f\x8c\x62\xd4\xdd\x9b\xed\x79\x03\x2f\x27\x51\xe4\xb2\xeb\xf9\x68\xb7\xad\xdc\xb3\x33\x12\x18\x89\xad\xce\x12\x30\xa5\x87\xea\x2a\x43\x89\x8c\x19\x0f\x30\xc9\xc9\x71\xdc\xed\x7a\x9d\x76\xdf\x11\x59\x6c\xf4\xcb\x4d\xe4\x00\xe3\xb1\x26\x46\x8e\xcf\x77\xfb\x6d\x3c\x5e\xc6\x22\x0a\x33\xc7\xb7\x01\xf2\x54\x43\x4f\x64\x24\x63\x01\x29\x4e\xc3\x3d\x6f\x2c\x7f\xff\x6f\x93\xb3\x75\x88\xa4\xa6\xb9\xac\x06\xc4\x65\x32\x96\x61\x8a\x9c\x40\x7b\x3e\xa9\x7d\x96\xb1\x04\xae\xb5\x63\x6f\x39\xd5\x12\x86\x02\x15\x5f\x0c\x32\x15\x44\xa8\x71\xb7\x59\xdd\x6d\xe7\xb3\x97\x61\xf0\x28\x56\x81\x44\xf8\xd9\x07\x6f\xee\x2b\x5e\xb8\x74\xaf\x3b\x1a\x1b\x28\x49\x83\xaa\x7d\x28\x4e\x51\x7d\x9e\x27\x8f\xa4\x52\x99\x64\x9e\x79\xeb\xa5\xae\x8e\x93\xd0\x66\xac\x44\x2a\xdd\x76\xe6\xea\xd3\x27\x26\xe7\x65\x84\x26\x56\xda\x6c\x32\x37\xcb\xdf\x37\xbf\x4c\x73\xc8\x18\x12\x83\xe1\x54\x60\xa6\xd2\x63\x25\xdf\x26\x37\x99\xf4\x0b\xb0\x88\x19\x65\xfe\xb2\x7d\x86\x8f\x71\xc0\xc6\x3f\x06\x30\xca\x91\xa0\x89\xe7\xc5\xf9\xbe\xae\x3e\xda\xfd\xee\x78\x3c\xb8\x2e\x02\xc9\x0d\xeb\x03\x2e\xc8\x23\x16\x22\x19\x83\x26\x21\x58\x0d\x96\x12\xc5\x60\xd0\xf8\xe7\x5f\xc7\xfb\x0d\xc1\xcc\xdf\x8b\x30\xc4\x3a\x01\x2c\x09\xb3\x36\x87\x9b\xea\x0d\x19\x4f\x52\xcd\x24\x9a\x26\xb7\xf0\x9e\x77\x86\x8b\x93\xf5\x54\x93\x0f\xa9\x05\x37\x65\x70\xb6\x42\xb8\x72\xd5\x70\x32\xd6\x40\xd0\xc9\x3b\xee\x10\x33\xf9\x39\x90\xdd\x1d\x3d\x52\x12\xa4\xa6\xb2\xa2\xdb\x37\x51\x57\x67\x80\x47\x91\x49\x90\x85\x10\xf9\xa5\x29\x25\x61\xb7\x2a\xbd\xf0\x81\xdc\xcc\xe8\x89\x92\x40\x48\x62\x4b\xec\x0c\x88\xa7\x18\xd2\xdd\xc8\x24\x0c\x0c\x11\xa1\xe7\x99\x38\xb5\xb3\xc2\x28\xcc\x34\xbe\x0d\xd7\xd4\x82\xd7\x5f\x56\xab\x47\x5b\x7c\x9b\x8e\xba\x28\x21\x89\xc0\xe0\xfb\xa9\x74\xee\xc3\x06\x8a\x31\x75\x4e\xd7\x48\x61\x4e\x1e\x4a\xf5\xe4\x5d\x05\x77\x8c\x26\x98\x4f\x34\x1b\xdc\x9a\xe7\x7d\x14\x33\x21\x94\x06\xca\x27\xfd\xf5\x33\x3f\x18\x01\xe1\xf1\x23\x44\x01\x60\xdf\x7c\x40\x6e\x74\x1f\xdc\xe9\x9d\xb1\xe3\x2a\xe3\x78\xd3\x7c\x54\xf5\x75\x8b\xdd\x36\x8f\x23\x89\xb5\x46\x3b\x38\xe4\xed\xe6\x2d\x2f\x0a\x5b\x75\x94\x03\x4a\x1a\x7f\x97\x58\x96\x49\xac\x42\xa4\x78\xf8\x7d\xfd\xd7\xcb\x66\xbb\x5e\x3d\xdf\xff\xe6\x8f\x68\x27\x76\x64\xcd\x1d\x63\x32\x5c\x9d\x5b\x49\x12\x87\xa2\xaf\x09\xb4\xfb\xe6\xa4\x3f\x13\xca\x0c\x18\xc2\xa0\xb4\xfa\xfd\xe7\x7b\x19\x88\x6f\x9c\xa6\x24\x81\x08\xeb\xf9\x90\x7a\x82\x17\xb6\xca\xc9\x1e\xa4\x71\xa6\xd8\x84\x15\xd8\xd0\x2d\xce\xbb\x1d\xe1\x8a\x05\x94\x50\x1e\x69\xaf\xae\x6d\xc3\x41\xfe\x72\x42\x23\xb3\x87\xc9\x00\xcc\xd6\xf3\xeb\x8c\x5b\xd8\x10\x33\x94\x4b\x54\x59\xb6\x6f\x6a\x8f\xa5\x24\xc4\x31\x85\x28\xfe\x0d\x2f\x5b\xa4\x3f\x6b\xee\xf3\x77\x28\x6f\xce\xcf\x55\xdd\xee\x5f\xaa\xa2\x6f\x2e\x83\xd0\xc6\x6d\x96\x4f\x3f\x9e\x76\xf3\xd5\xf3\x76\xbd\xbc\xf9\xb1\xf5\x18\x13\x99\xa4\x4a\x20\xba\x79\x77\xe8\x85\x0d\x06\xf6\x4d\xff\x5c\xa9\x4e\xb8\xa9\xc6\xbe\xcd\x9b\x81\xf2\x8c\x4c\x58\x1a\xe3\xce\x75\x2c\xf8\xf9\x7e\x40\x37\x31\xb9\x40\x96\xc4\xb8\xfe\x70\xa5\x66\xc7\xe3\x17\xdc\xc1\xae\x6d\x0a\xae\xaa\x65\x5e\x77\x73\xf0\x66\x82\x47\x96\x49\xa6\x05\x42\x95\xb9\x45\xcc\x0d\x6d\xe2\x84\xa7\x2a\xb4\xb5\x15\xfe\x69\x07\x2b\x0b\xe7\x0a\x0b\x84\x31\x27\x83\x26\xf1\xcd\x79\x89\x56\xc1\x13\xd4\xdd\x20\x6c\x6f\xce\x98\x6c\xba\x26\x09\xd0\x9d\xae\x13\x5b\xee\x74\x6b\x85\xe7\x9d\x89\x37\x69\xa8\xd3\xd0\x49\x43\x55\x85\x5a\xf0\xba\xcc\xcb\xd7\x69\x2b\x41\x19\x56\x4b\xe4\x12\x53\x68\xee\x1d\x84\x02\x04\xc5\xcf\xab\x65\xd9\x9c\x6a\xb8\x31\x75\x19\x83\xb7\x94\x34\xc5\xef\x6b\xf0\xf5\xcb\xb2\x2d\xfc\x11\x1e\x22\x02\x06\x06\x22\xb6\x88\xee\x59\x95\x7e\x74\x48\xa9\x81\x8d\x02\xa0\x9d\xab\xd9\x2c\x4b\x2b\xe0\xfc\x55\x9c\x69\xfc\xf0\x8a\xa4\x96\x1b\xba\xdd\x9e\x0f\x63\xfe\xe1\xf1\x37\x55\x34\xc4\x4a\x1e\x8c\x80\x4d\x0c\xb9\x44\xc9\x94\x59\x37\xa3\x37\xe3\x0c\x54\xe5\xf6\xc2\x4f\x4a\x14\x40\x68\x0d\xa9\xbb\xbc\x80\xd9\xf4\x56\x90\x71\x5c\x97\xe4\xe1\xb8\xf8\xef\x85\xbd\x33\x18\x08\x90\x01\x26\x08\x76\x68\x40\x86\x23\x6f\x24\xd1\x69\x28\x53\x5f\x73\xb3\xd2\x2f\xdd\xb7\xb3\x59\x11\x3f\xf8\x35\x8b\x32\x13\xef\x2c\x61\x24\xf8\x26\x69\x90\x65\x8e\x9b\x7a\xeb\x75\xed\x9b\xd9\x2b\xcf\xcb\xe6\x2a\xf1\xa2\xa4\x61\x10\xa2\x3b\xea\x36\xe7\x27\xcf\xbd\x33\xc6\x09\x5f\x4b\xd9\xfa\x4b\xe8\xc4\xee\x9a\x4f\x39\x92\x04\xf5\x4b\x15\x73\x6d\xd2\x20\x36\x64\x5c\xc6\xc6\x9d\x82\xad\x25\x25\x8c\xa1\x5b\xbb\xdd\x83\xdc\xf3\xc3\xb1\x97\x16\x94\x94\x64\x89\xb0\x2b\x23\xee\x4c\xdd\xe0\x72\x9a\x75\xcb\x12\x87\xe9\xc4\xd7\xa1\x31\xa7\x58\x97\x78\x72\xd2\x62\xc3\x7e\x4a\x18\x27\x9d\xc1\x67\x5e\x71\x39\x5f\x99\x02\xb0\x6f\xb7\x1e\x9a\xc8\x18\x6d\x8c\xe6\x83\x1f\x17\xdb\x87\xa7\xdf\xd7\xd7\xb3\x6c\x34\xd1\x56\xfa\xd9\xe6\x80\xa6\x6f\x9a\x26\x1c\x3c\x47\x73\xb3\x13\x4e\x9c\x4b\xd2\x34\x55\x58\x12\xde\xed\x47\x93\xc8\xc6\xf5\x65\x8b\x32\x69\x14\x73\x4c\xad\xab\xb5\x27\x5f\xea\xaa\xd2\xbf\x5d\xf1\x36\xc3\x8c\x0c\xc3\xb5\x34\x63\x8c\x11\x4f\xdf\x77\xe2\xc5\xf3\x69\x12\x83\xa2\x59\x96\x05\x89\xaf\x74\xb4\x40\x76\x77\x8c\x0b\xac\xab\x44\xdf\xc4\xbc\xcd\x30\x11\x4d\x05\x89\x30\xbf\x60\x10\xc0\x53\x9e\xf2\xf1\xb4\x46\x4d\x47\xee\x46\x51\x67\xbd\xc0\xb2\xc4\x2c\xc3\x52\x2f\xcb\xbb\xaa\x7e\x33\x09\xce\x01\x94\x5b\x52\x91\x31\x0c\x7a\x9d\x8e\x6a\x96\xd7\xb7\x4e\xb5\xd1\xe9\x94\x0d\xc6\xa8\x24\x21\x5a\xc9\x73\x7e\x3c\xc2\x40\x4f\xe3\x5b\x03\x96\xca\x28\x43\x37\xf6\xbd\x6a\xa1\x6e\x46\xb6\x1d\x95\x29\x60\xc7\x18\xd7\xcd\x08\x1d\xfa\x63\x40\x42\x1b\x28\x5a\x96\xef\x55\x2e\xc7\xfa\xb2\x6e\x49\xf8\xb5\xc1\x40\x15\xa1\x38\xb7\xfc\x13\xbb\x9a\xfe\xeb\x9d\x08\x89\xa1\xfb\xdc\xb4\x55\x9d\xff\x97\xcf\x3d\xb7\x89\xa4\x20\x32\x4c\x8a\x8a\x01\xb5\xb4\x3d\xa4\x43\x93\xda\x32\xa5\x7c\xb8\x0c\x38\xcc\xce\xa8\xbb\x75\x14\x62\xb2\x16\xd5\x6e\xae\xef\xb9\x54\x47\x26\xb7\x7e\x6a\xa0\xf6\x6c\x2f\xee\x98\x50\xf8\xb9\x16\x25\xd4\xaf\xf9\x70\x46\xa6\x41\xc8\xb0\xd8\xa6\xc1\x8a\xab\x9d\xf4\x1a\x2c\x32\x0d\xa8\xd1\x4c\x2a\xaa\xd7\x1f\x65\xfe\x0e\x75\x03\x16\xd4\x30\xe7\x45\x6f\x14\xa4\x01\x37\x45\x2a\x27\xfb\x7e\xec\x1f\x17\xff\xff\xbf\x30\xa5\xff\xf6\xcd\x15\x5a\xbd\x66\xf1\x7f\xca\x4b\x2c\x9b\x1c\x0d\xe0\x34\x0c\x23\x47\x06\x6c\x40\x93\xdd\xda\x58\xfb\xa3\xc4\xa8\x51\xb7\xe8\x8c\x60\x9d\xca\x1a\xb0\xf7\x1e\x31\x23\xb1\x86\xf7\xbc\xc9\xab\x72\x51\x62\x80\xca\xfd\xb3\xf1\xe7\x8b\xd0\x95\x79\xdd\xf3\x66\x0d\xff\x1d\x7f\x96\x34\x54\x41\xa8\x0c\x77\x3c\xee\xe1\x23\xa7\x35\x25\x41\x8c\x21\xdb\xbc\x71\xae\x2f\x1c\x3d\x3f\x88\x4c\x49\x4a\x24\x0c\xd2\x0d\x7f\x40\xa9\xbe\x20\x2d\x94\x69\xa4\x08\xb2\x19\x14\xd5\xab\xa5\x70\x18\x0e\xc2\x34\x0e\xb3\xc4\x42\xd8\xb6\xdb\xc7\xc9\x53\xc6\x99\x24\x46\x1a\x6c\xe6\xee\x1d\x43\x14\x87\x83\x82\xa2\xbc\x7c\x1d\x46\xb7\x2f\xf0\xab\x32\x4d\x42\x8a\x51\x95\x27\x2e\xff\x75\x02\x18\x65\xf0\xd2\x84\x84\x52\xf8\x65\x64\x0d\xc7\x93\xe1\xaa\xc7\x8a\x98\x65\x79\x73\x2a\xde\xbe\x76\xd3\x53\x9a\x1a\xb6\x41\x93\x11\x5d\x95\x60\x68\xdc\xa7\xa0\x5a\xd7\x9a\x99\x72\xb7\xce\x64\xb8\x39\x8f\x18\x3a\x5d\x0b\xc1\x30\xc2\xb7\x73\x55\x41\x1f\x8e\x79\xb2\xef\x93\x34\x53\x18\x62\x46\x48\x23\xc2\xe0\x9a\x69\x0b\x9d\x61\xac\xfb\x3f\x55\x3e\x66\x7b\x91\x29\x0b\x18\xb5\xd0\x95\x9b\x53\x5d\x3e\x7a\x3a\x41\x99\xb2\x38\xcb\x92\x0b\xb4\xa2\x49\xbe\xf8\x36\x54\x18\x49\x85\x6e\xed\xb4\xf0\x83\xd1\xa0\x66\xa9\xa9\xb8\xe3\x2e\xbb\xe6\xe9\xf8\x31\x40\xe5\x5a\x31\x8e\xd3\x43\x54\xd5\x5b\x5e\xbe\xde\x41\xff\x10\x59\x80\xf0\xa2\x35\x34\x23\x10\xcb\x45\xee\x65\xdc\x6f\x4c\x0a\x2c\x46\x59\x6c\xaf\x70\x8f\xc9\x94\x29\x4e\x9c\x84\x58\x0d\x3a\xff\x34\x36\xc4\x68\x1c\x66\x10\x39\x42\xc1\xfb\x6e\xea\xd7\xe7\x0d\xbc\x43\x79\xc5\x31\x4a\xb9\xe6\xc8\xb8\x51\xc3\xeb\xe6\xe8\xf8\xea\x7b\x3a\xe8\xf1\x47\x17\x32\x0b\x2c\xad\xaa\x73\x1d\x79\xdd\x3a\xcc\xb9\x7b\xef\xee\xbf\x6e\x1d\x12\xf0\x72\xaa\xbf\x40\x71\xa5\x32\x0b\x50\x1d\xf9\xae\x86\x66\xff\x93\xb7\x50\xdf\x15\x95\xef\x54\xc9\x33\x3c\x6a\x41\x28\x37\xbc\x7c\xab\xab\xa2\xb0\xca\xf4\xdf\xdb\x1f\xa9\x94\xd4\xba\x87\xc5\x45\x61\xc9\xc0\x1c\x4b\x55\x2c\x63\x83\x05\xf7\x65\xf3\xdf\xe6\xa7\x52\xa5\x00\xab\x91\x50\xb7\xeb\x85\x9f\x6f\x4e\x5a\xbb\x27\x56\x60\xaa\x7d\x6d\x64\xb2\xaa\xa1\x1d\xc2\x63\x52\x08\x48\x64\x56\xa1\xe7\xaa\xe5\xf5\xf9\x0f\xe8\x9c\x27\x69\xcc\xb4\x2f\xeb\x20\x71\xf3\x33\xff\xeb\xad\x91\x14\xd2\x00\xad\x91\xea\x1d\x6a\x5d\x54\x1f\xc3\xa2\x11\x99\xea\x30\x31\x98\x1f\x63\x46\xac\xf4\x64\x3d\xd4\x91\x36\x7a\x97\x28\x3f\x7d\x3a\xbb\x47\x64\x61\xb7\x4e\x77\xfd\xb6\xaf\x2c\x5f\xed\x86\x6b\xb8\x60\x10\x1a\xf7\x36\x0b\xe3\x24\xb0\x63\x6d\x76\x55\x5d\x5f\xb2\x50\x2b\xa4\xea\x9b\x29\xf5\x54\xa9\xb1\x90\x99\x6d\x42\xa2\x28\x35\xd4\xbf\x67\x9b\x27\x8b\xdd\x63\x91\x24\xc0\xe8\xb5\xcb\x51\x3d\xae\x5d\xc6\x8d\x45\x81\x8e\x85\xdb\x8f\x0f\x47\x94\x4b\xdd\xf2\xe6\xcd\xbf\x52\x14\xc7\xa8\x8d\x74\xf7\xb8\xfa\xd7\xd2\xff\xc8\x42\x6d\x00\xe0\xa5\xca\x7b\x05\x34\xc9\x62\x92\xa1\x89\xff\x9f\xa3\x41\xed\xf8\xdf\x23\x83\xed\xbb\xa9\xab\x8f\x32\x87\xbe\x38\x4c\xb2\x98\x1b\xf8\x96\x29\x22\xed\xf6\xb6\xce\x5d\xcb\xab\xd2\x2b\x06\x76\x6d\x20\xb0\xfa\x40\x58\xac\xfe\x17\xf0\xbe\x36\x72\xc0\xfe\x34\x70\x03\x58\xd2\x6d\x4c\x3e\xc1\xe5\xc6\xff\x24\x7a\xea\xdb\x9a\xc0\x98\xe4\x7d\xdc\xf2\xea\x00\x46\x22\x6c\x57\xe4\xb4\xad\xb9\xba\xb4\xe4\x7f\x55\x14\x32\x3c\x7e\x59\x12\x74\xd5\x0f\x65\x94\x4b\x47\xb7\x61\x6c\x88\x4b\x30\x03\x4b\x43\x33\x67\x91\xfa\xfc\xb1\xfa\x18\xd0\x31\x48\x96\x52\x30\x82\xc0\x56\x2b\x3a\xb4\xbf\xb3\xc8\xa4\x75\x76\x07\xfe\x89\xa3\x79\xe4\x24\x32\x9e\x18\xb1\x45\xfb\x34\xd0\xd0\xc9\x4d\x39\x44\x88\x62\x72\x2b\x17\x13\x41\x42\x2c\x95\x03\x62\xe3\x7d\xf0\x91\x89\xc8\xa4\x67\x9f\xb6\xeb\xf1\xaa\xfc\xbd\xe0\xa9\x3b\x3b\x36\x72\x35\xd2\x45\xab\x1e\x3d\xe3\xb1\x64\x2a\x10\xa1\x8d\x8d\x6e\x4e\xa2\x91\x75\x2e\xa0\x36\xbc\x24\x83\x26\x52\xf7\x24\x2e\xb7\xb3\x55\xb3\xbc\x4e\x89\x23\x99\xa2\x09\xd6\x4d\x1c\xf7\x70\x1c\xe1\xc9\x98\x02\x8e\xe5\x44\x58\xbb\xb1\x5b\x3c\x6f\x76\x65\x1f\xc0\x62\x10\xc7\x96\x96\x03\x99\x69\xf2\x0a\x1d\xd4\xf1\xbb\x5e\xb7\x16\x7f\x19\xdf\x66\x90\x44\x48\xa7\xe9\xe8\xc1\xed\xcf\x3a\xc8\x30\xe9\xf4\xc2\xcf\x77\x55\x6d\x69\x0c\xe6\x0f\x8f\x8b\xf7\x2b\x8b\xbc\x3b\x27\x4e\x8c\xba\xc1\x1e\xe4\x9b\x05\x60\xef\xf3\xe3\xa5\xdb\x30\x1c\x9a\xe6\xdc\x2c\x90\x91\x72\x6a\x62\xbc\x44\x39\xc8\xdf\xfc\x0a\xeb\xda\x68\xc0\xe5\x6c\xde\xb9\xd5\x0a\x85\xd6\x1c\xcd\x8a\xcc\x42\x12\x20\x39\xf5\x21\x2f\x6d\xc5\xed\x48\xca\x54\x66\x84\x04\xc8\x82\x39\x7f\x9a\x0d\xd5\x21\x64\x46\xa2\xc0\xe9\x29\xdb\x9d\x73\x42\x66\x20\xb3\x58\x05\x68\x43\x2f\x9f\x6f\x16\xdb\xd1\xc9\x49\x64\x62\x55\xf3\xf9\x6c\xf3\xf0\x4d\xc5\x83\xcc\x12\xa6\xd3\x78\x20\x20\xa4\xbb\x5d\x66\xe5\x36\xa9\x8c\x46\xa6\x2c\xf5\xa5\xfa\x39\x53\xef\xf3\x71\xc1\xb1\xcc\x68\xc2\x99\x2f\xee\x99\xc2\x3e\x86\x38\xf3\x8b\x5e\x1e\xfd\xdb\x5e\x2d\x8d\xbc\x5e\xdd\x1f\x55\x0b\xf3\x5f\x4a\xdc\xc9\x2c\x65\x31\x26\x1d\x76\x2e\x31\x6e\xe3\xef\xd3\x56\xa6\xda\xdc\xc9\xb2\x0d\xdc\xd7\x2c\xe5\x0c\x99\x3e\x7e\x6c\x17\x83\xf8\x9a\x7b\xc1\xd4\x56\x2f\x75\x7d\xbf\x28\x95\x73\x11\xc7\x73\xd7\xb5\x95\x04\x03\x06\x1e\x7d\xb9\xe1\x4a\x15\xf0\x6b\x04\x66\xc6\x42\xc3\xa7\x6e\xc5\xc0\x0d\x39\xbe\x1f\x22\x19\x15\xc2\xea\xe8\x1c\x4f\x2d\xac\x8e\x50\x4e\x13\x38\x59\x26\x02\x47\x2e\x72\xf7\xf3\xb6\x3b\xb6\xd8\x3e\x4c\xda\xf0\xd0\xc4\x20\xc7\xe9\x90\x71\xc6\x28\xe3\x89\xa4\x06\x4b\x85\x25\xf9\x28\x7e\x0a\x86\x5d\x62\xfc\xcc\x32\x54\x71\xe8\xa6\x95\x9d\x89\x77\x13\x3e\x4f\x99\x49\xa2\xb9\x4b\x5a\x0e\x97\xda\x4c\x26\x19\xd6\xc3\xe8\x11\x1b\xd9\xf7\xab\x42\x26\xb3\x54\x99\x50\x97\x3e\x95\xea\xe6\x3c\x2a\xe8\x71\x6d\x04\x43\x9e\xc2\xee\xc2\x03\x27\x3d\x53\x59\xa6\x8c\x76\x14\xb7\x91\xcd\x21\x27\x85\xcc\x80\xa4\xc8\x2e\x8f\x55\xa6\xbb\x9f\xcb\xe7\xfb\x8d\x3f\xc4\x32\x41\x1d\x9d\xe0\xdf\xd0\xef\x74\xa7\x71\x6d\x54\xfe\xdb\xbc\x40\x2d\xe1\x0f\xef\x51\x67\x9a\x26\xd2\xb9\x1b\xb9\xba\x00\xf3\x65\x9a\x27\x58\xb2\xd0\xec\x79\x3d\x0a\xb0\x65\x5a\x72\x74\x6f\x8c\xcb\x36\x3b\x1e\x97\x28\x83\xd2\x3b\x0b\xa6\x1d\x0f\xc2\x20\x34\xd4\x63\x15\x0e\x98\x9d\x70\x04\x36\x92\x07\x34\x70\xa2\x35\xb3\xd6\xc6\x8b\x7d\x3d\xc6\x75\xf4\x16\x0f\x74\xe4\x13\xc2\xbc\x38\x41\x38\xee\x77\x1e\x06\x06\x97\x80\xa3\xff\x27\x00\xb2\x9d\x2d\xe7\x2b\x0c\x34\x2d\x9a\x36\x3f\xf4\xd3\x8a\x87\x91\xd2\xe1\x20\x63\xfb\x4d\x0d\xde\xd8\x34\xe0\xa1\xce\x22\x07\xdc\x82\x66\x12\x2b\xe6\x11\x21\x46\x0b\xc0\xdb\x48\x37\xa7\xf3\x0d\x97\x6f\x77\x9e\xd0\x48\xf2\x28\x06\x3e\x30\x77\x9b\xdd\x78\xcc\xf2\x28\xe1\xb8\xac\x72\xa5\x06\xd8\xbd\x7e\x3d\xbb\x46\xd6\xfa\xdd\xff\x43\x3a\xc6\xa3\xb8\xdb\x88\x44\x5b\x8a\x9b\xce\x1c\x79\xe5\xcd\xf1\xd2\xdb\xe2\x91\xe2\x68\x92\xec\xde\xab\x93\xdc\x43\xdd\xdc\xfa\x08\xff\x48\x94\x41\xf2\x48\x4b\xdc\xac\xfb\x14\xc0\x4b\x9d\xff\x0f\x26\xf3\x96\x27\x94\xe0\x38\x6f\x3e\xf2\x56\xee\x3b\x23\x98\xb7\xb9\x28\x80\x90\x08\x3e\x07\x0b\x23\x4f\x32\xaa\xbd\x48\xc2\x72\xbe\x9a\x17\x83\xfa\x0c\x9e\x88\x04\x97\xd4\x3a\xec\x7f\x51\xa6\xde\x00\x9a\x76\x59\xb6\xb7\xe7\xd2\x10\x3c\x8e\x67\x05\xa7\x24\x14\x96\x61\x7b\x71\x10\xbc\x69\x26\xa0\x02\x9e\x32\x6e\x80\xb6\xa5\xa3\x35\xf2\x60\xd5\xdf\x06\x4d\xc0\xe9\x67\xd6\x75\xf5\x01\xf5\x1a\xda\x53\x5d\x2e\xda\xfd\x0b\xd4\x77\x39\xbf\x02\xc8\xe2\xa9\xc8\x9c\x3c\xbe\x11\xe0\x1a\xd0\x49\xff\x63\xd2\x54\x12\x23\xd6\xc8\xdd\x2a\xcc\x39\x31\x31\xb0\xd5\xe7\xa8\xec\x8b\xf3\x34\x42\x24\x47\xb7\x22\x8d\x24\x16\x25\xe7\x42\x52\x4b\x73\x83\xfd\x5c\x4e\x75\xdb\x27\x77\x95\x9c\x62\x51\x3c\x12\xb8\x6e\xf3\x57\x57\xb1\x68\x0f\xab\x48\x8b\xc0\xcf\xfc\x3b\x98\x7a\x02\xfd\x85\x94\x0a\xb0\x08\x02\xd3\xe1\x23\xd9\xc5\xee\x98\x08\x0c\x9f\x99\x1a\x12\xb5\x8e\xbf\x01\x30\x9f\x39\xef\x36\x32\xe4\x27\xba\x8c\x2c\x70\x50\x51\xd0\xa7\x7a\x47\xd4\x47\x93\x57\xd3\x24\x91\xe0\x04\x50\xfc\x90\xd1\x11\x4d\x6d\x74\xd4\xba\x8f\x4e\x67\xe3\x86\xb7\x6d\x01\x68\x52\xdf\x9c\x97\x93\xfd\x5c\x04\x71\x86\x71\x4b\x0c\xfe\x3d\xc3\xa9\xae\x10\x9c\x3e\x75\x3b\x87\x1b\x9b\x08\x20\x43\xea\xca\xed\x9f\x57\xde\x44\x84\x91\xd1\x88\xc8\x0d\x44\x02\x46\x53\x4b\x84\x34\x42\x5c\x95\x71\x28\xab\x8f\x51\x1d\x8b\x20\x71\x88\xd5\x1e\xce\xdd\xbc\xb0\x2c\xbf\x4d\xba\x89\x28\xd0\x88\x13\x2c\x4d\xed\x9c\x87\x72\x5c\x27\xe2\x95\x22\x0a\x43\x8c\x8d\xee\x2c\x27\xd0\x03\x2f\x74\xe7\x20\xba\xc7\x89\xb2\x38\xf6\x22\xe3\xf5\x1b\xb4\x50\xff\x0e\x67\x7f\x54\x1a\x61\xc2\xbb\x1c\x99\x7f\xdc\xaf\x2a\x0a\x70\x73\xac\xf3\xd7\x6e\xd8\xd5\xe7\xd9\xc9\xc7\xe3\x45\x04\xcc\xf1\xd1\x59\x02\x59\xef\xe6\x88\x38\xa1\x98\x32\x7b\xac\x5e\x87\x52\x64\xd7\x6d\x71\x91\x90\x40\x52\x4c\xd1\x15\xfc\x7c\xd5\x8a\x12\x09\xc9\x70\x6e\x2f\xe7\xab\xdd\xcb\x7a\x39\x5f\xb8\xd1\x22\x92\x34\x34\x9c\xd5\x0d\xe0\xe6\x5f\xf3\x52\xee\x2f\xe4\x4f\xff\x3e\xa4\x5e\x24\x2a\x48\x1d\x9b\x79\x95\x97\xcd\x26\x2f\x4d\x3d\x13\xb2\x8d\x4e\xba\x9d\x66\x92\x38\x82\x48\x78\x1f\x59\x10\xd3\x86\xa6\xee\xa9\x33\x79\x90\xb9\x1e\x77\x77\x77\x10\x38\x06\x62\xe6\x37\x4b\xb3\xd5\xfd\x2a\x5d\xf2\x95\x3f\x6d\xaf\x97\x12\x82\x60\xfb\x03\xff\x74\xac\x20\xab\x1e\x11\x2b\x52\x1a\x07\xc6\x60\xea\x56\x47\xbf\x7a\x8b\x94\x65\x58\xad\x73\xb4\xe7\x3c\x2d\xb7\x93\xb7\xc8\x02\x93\xc7\x3b\xd6\xb0\xcb\xa5\x7f\xfe\x2c\x26\x48\x58\x70\xcf\x0f\xb0\x6c\xe1\xf0\x0c\x2e\x02\x27\x78\xec\x33\x89\xb7\xfc\x3c\x20\xd9\x93\x82\x2b\x13\xce\x5f\xf3\xe3\xd1\x5f\x8a\x43\x12\x7a\x83\xc1\xfa\x79\xb7\xbc\x05\xd2\x37\x90\xb8\x53\x94\x55\x7d\xe0\xc5\xba\xaa\x0e\x4f\x3e\x8c\x22\x44\xc8\x35\x1f\x92\x3b\xf2\xd7\xc9\x1b\x88\x4c\x85\x59\x5f\x2c\x65\x13\xe1\x13\x31\x55\xdb\x56\x12\x85\x42\x6b\x50\xaa\x01\x44\x43\xc8\x4c\x22\x59\xd1\xec\xf6\x76\xbd\x43\x1d\x5c\x7f\x04\x00\x35\x27\xdb\x3d\x8c\xa1\x0c\x42\x89\x14\x2b\x73\x6d\x34\x60\x3c\xb8\x41\x1a\x74\xf7\xa6\x05\x70\x3e\xa2\x00\x9d\x70\x5c\x6c\x4f\x87\x9e\xe4\x42\x0a\x1d\x49\x8c\x35\xe0\x44\x58\xad\x1e\xfd\xef\x99\x4c\xc0\x86\x06\x72\x74\x94\x7e\xfb\xca\xb9\x1a\xdd\x5c\x06\x51\x14\x5a\x9b\xd3\x86\x45\x1f\xab\x57\x87\x1d\x91\x41\x16\x78\x96\x68\x4c\x58\x9a\xd8\xaf\x3d\x4a\x22\xc3\x0f\xdc\x40\xbb\x6c\xba\x25\x8a\xe7\x25\xd4\x77\x55\x7d\x07\xb6\x3c\x72\x60\x3a\x48\x92\x28\x44\x31\x5b\xde\x78\xf7\xab\xa4\xd4\xe4\xe7\x0d\x93\xe4\xa2\x54\x53\x97\x56\x46\x81\x81\x89\x1d\xa1\x3e\xe4\xed\x05\x50\x4d\x46\x71\xa8\x43\x57\x61\xae\xe0\x13\xf1\x1e\x13\x53\x54\xc6\xcc\x90\x33\x21\x0e\xea\x01\x78\xdd\xde\x00\xef\x45\x9a\x6d\xe7\x8c\x4e\x49\x6c\xbe\x55\x75\xee\xfb\xbe\x6a\xf7\xc3\x9d\x57\x26\x3a\xe2\x96\x63\xa6\x1b\x1e\x17\x48\x41\x99\x68\xe5\xf2\x4d\x37\xe6\x2e\xbf\x5d\x2c\x37\x92\x86\x8a\x51\x57\x22\x57\xbe\x16\x9e\x41\xe3\x69\xc2\x04\x29\x25\x4d\x39\x4f\x9c\x54\xdb\xe2\xf3\x58\xe4\x32\x6f\x0d\x3b\xd2\x69\x28\x8c\x4b\xfe\xfd\x8f\xc1\xa7\xa6\xf1\x3f\xfa\x80\xa0\xa4\x59\xea\xc0\xde\xcf\xf0\x81\xf5\x90\x97\xe8\x0b\x49\xa5\x32\x85\xc1\xb5\xc8\xad\xfa\x96\x3d\x92\x52\xa2\x98\x2d\x0b\xfc\x09\x39\x0e\x87\x17\xa8\xe7\xbe\x7c\x41\xa6\x8a\x21\x92\xd8\x44\xb0\x6d\x12\xfa\xde\x83\xd6\x65\x16\x66\x92\xf5\x34\x55\xc8\x4a\x32\xf9\x9e\x59\xa2\x11\x09\x3f\x7b\x9c\xb9\x62\x3e\xc9\x13\x23\x9d\xf0\xaf\x3a\x3f\x1e\x8b\x71\x19\xb1\xe4\x34\xc0\x8d\xfa\xb5\xce\x8f\x23\x07\x4e\xf2\x34\x40\x86\x84\xdb\xea\x24\x0a\xd8\x0c\x85\x27\xaf\x6e\x46\x92\x67\x31\x6e\x7a\xeb\x53\xf3\xca\x9b\x89\xe4\x91\x94\x5c\x84\x1a\x51\x79\x1f\xbc\x19\x04\x70\x71\xdb\x70\xeb\x7b\x2f\xc9\x37\xe9\x56\x21\x02\x2e\x86\xfc\x4f\x23\x1d\x73\xd9\x2d\x13\xda\x83\x89\x54\x71\xad\xda\x53\xca\x48\x60\x2d\x8f\xcf\x35\x0c\x85\x8b\x3c\xf9\xbf\x94\x12\x52\xce\x5c\xc1\xfa\x11\xa9\x0b\xdd\x21\x95\x50\x8c\x97\xfd\xf7\x04\x27\x98\x9d\x54\xde\xba\x22\xdd\xeb\x4b\x84\x4a\xa4\xb0\x91\x45\xe4\xaf\xbd\x70\x4c\xa5\xca\x32\xc7\x30\x74\x0b\x4d\x5b\x57\x67\xec\x84\xe6\xee\xf3\x38\x65\xb3\x93\x52\x01\x75\x72\x21\xf7\x55\xa5\x5e\x8c\xf2\xe0\xc8\xaf\x94\x10\x26\x38\xcc\x96\xf3\xd5\x1d\xa2\xae\xec\xef\x3a\x8b\xb0\xa0\xfa\x01\xce\x27\xb8\x0c\x2a\xfa\x67\x56\x01\x31\x6c\x56\xb6\xa6\xcf\xaa\x84\xbb\xdd\xf0\xab\x93\x12\x83\x49\xeb\x56\xe9\x59\x51\x6c\xf7\xe3\x82\x51\xd7\x4a\x87\x81\x65\x10\x7e\xa8\x4e\x0d\x2c\xd4\xd4\xd4\x56\x21\xa3\x8e\xf8\xf7\x47\x29\x0b\xd8\x70\x0d\xcf\xf5\xb4\x91\x20\x8e\x5c\x1a\x29\xf1\x26\x87\x09\x01\x0c\x92\x58\x97\xfe\xd4\xee\xab\x3a\x6f\xfb\xd2\x99\x7e\x65\x55\x84\x2b\xc4\x5d\xf5\x4e\x5e\x4f\x9c\xe9\x9a\x88\x18\x35\xb8\x1b\x4c\x8e\x1a\xd2\xe7\xab\x5f\x5b\x11\x6d\x82\x5b\x58\x04\x75\xe8\x26\xb7\x89\x3c\xf9\xe5\xcd\xd2\xb1\x4a\x15\x31\xe0\x46\xd8\x40\x9c\x0a\xde\x7c\xf7\x39\x22\x65\x2a\x21\x1c\x50\x6a\xbe\xcf\x8b\x2f\x30\x15\x2a\x0e\x32\x57\xf8\xfb\x0c\x79\x5d\x95\xf9\xe7\x4b\x5d\xe9\xfc\x3a\xa0\x4a\xc5\xb1\x32\x50\xe4\x53\x63\x80\x7e\x2b\x3d\xc9\xbd\x9f\x2e\x50\x61\x2a\xce\x32\x92\x0c\x19\x34\xe5\x10\xbd\xab\x92\x90\x45\x91\xad\x52\xcf\x79\x0b\xa3\x6a\x82\x30\xa5\x23\x9f\x5d\x25\x84\x68\x32\x80\x73\xd8\xd4\xcd\xfa\x79\x7b\x33\x79\xd6\x84\x52\x1c\x60\x8b\xbf\xea\x5c\xbe\x0d\xd6\x0f\x95\x50\x96\x32\x6f\x48\x42\x51\x1d\xa1\xbe\x66\x48\xaa\x44\x46\xe8\xaf\x2a\x38\x16\xd5\x79\xc2\x17\xa0\x68\x10\xa3\xb3\xd8\xed\x71\xb3\x52\x19\x22\x5b\x77\x2c\x4c\x23\xbb\xba\x88\xd3\xf9\x38\xd8\xc8\x55\xaa\x18\xb5\xe3\x15\xc3\xd9\x6b\xe3\xb2\x56\xf5\x74\xec\xb3\x20\x4c\xac\x9f\x3e\x90\xa2\xba\x05\xcd\x4f\x45\xbb\x91\x7b\x50\xa7\x2f\xa8\xfb\xa5\x62\x3a\x8e\x4c\x99\x67\xb9\xf8\x3c\x56\x1e\x06\xa9\x98\x4e\x31\xf0\xa4\xf3\xd7\xbd\x2f\xc4\x50\x4c\x73\x84\xee\x8a\x53\x5d\x6e\xeb\x53\x73\x85\x11\xd2\xb6\xcc\x02\x82\xc6\xd5\x9c\x37\xae\xd6\x4f\x65\x29\xa3\xdc\xc5\xe8\x8f\x53\xa5\x68\xa9\x32\xa6\x23\xbb\x08\xad\xa1\x39\x56\x65\x03\xff\x3a\x41\x7d\xde\x9e\x8f\xd3\x89\x98\x29\x03\x43\x6d\x4e\x62\x77\xe0\x6d\x9d\xcb\xaa\xe0\x57\xdd\x14\xc5\xa5\x46\x5a\x70\x84\x07\x6f\x86\x3e\xf8\x75\xeb\x4b\x71\x88\x11\xf2\xfc\xd7\x89\x97\x37\xbc\x1a\x8e\x08\x11\x45\xcc\x7e\xae\x45\x37\xa8\xc0\x40\x65\xee\xaa\x7a\x5e\x1d\x8e\x60\x4b\x86\xc7\x97\x13\x69\x88\x6e\x92\xa3\xb8\xe9\x4b\xa9\xbf\x4b\xca\x7d\x9b\x06\x57\x92\x9a\xdc\xe7\xfc\x69\xeb\xf6\x78\x25\x45\x88\x65\x4a\xb7\x8b\x3f\x16\x8f\xab\x97\xc5\x7a\xd7\x0c\xe3\xb8\x0a\x22\x69\x0a\xc5\x0c\x43\x9e\xc9\xe6\x7a\x11\xf8\x6e\x07\x88\x9c\xea\xeb\xa8\x5e\x65\xb4\x09\x28\x48\x43\xf4\x81\x91\x9a\x01\xd4\xb6\x67\xe2\xf5\xd7\xc9\x12\x80\x11\x07\xe8\x45\xc1\x94\x6d\xa9\x63\x23\x5a\x84\xc4\x78\x1b\xc7\xa7\x30\xe9\x3e\x9d\x1a\x0e\x90\xbb\xb5\x7f\x52\x2d\x25\x85\x41\x89\xdd\xe3\x54\x41\xe7\x22\x77\xe5\x4e\xd4\x02\x7d\x30\x04\x20\xff\xf3\xf4\xca\x95\x8f\x1a\x41\x40\x4d\x09\xc9\x7d\xfe\x3e\x09\xd0\x42\x90\x66\x1a\xbc\xf6\x97\xb1\x2b\xfd\x21\xd0\x56\xb1\x72\xc4\x05\xf4\x65\x00\xd2\x3f\x0c\x04\x9c\x62\x25\x07\x26\xe2\xab\xcf\xc1\x30\x83\x90\xa4\x68\xc3\xaf\x6c\xe1\xbf\xff\x3d\x0e\x31\x93\x3e\x88\x91\x42\x98\xf0\x24\x76\x84\x9f\xb9\x9c\x8d\x99\xe9\x26\x9c\x02\x40\x52\x23\x41\x72\xbb\x98\x2f\x9f\x66\x8f\xbb\xe5\xf3\xad\xe7\x66\x80\x28\x8d\x10\x54\xfc\x7b\x5e\xaa\x99\x1a\x25\x18\x21\xd2\x32\xa0\x8e\xd7\xa9\xf6\xdc\xd1\x12\xe2\x90\x23\xf3\xc0\x3d\xaf\x4f\x8a\xfb\x5f\xe3\x2c\x33\x35\xf8\xff\x39\x35\xc6\x67\xf7\xcf\x34\x0c\xd1\xba\xe6\x3c\x43\xc3\x68\x3d\x7b\x1a\xbd\x70\x22\x22\xa9\x7b\xcf\xf0\x01\x0a\x65\xae\x65\x8f\x53\x62\x72\x20\x26\xac\xf5\x37\x48\x89\x25\x50\x16\xa1\xa1\xd5\x42\xd3\xee\xcc\x3e\xfe\x3b\x9c\x77\xae\xb8\xef\xb9\x7a\xc8\xfd\x58\x86\x94\x32\x65\x95\x1d\x31\x48\x3e\x46\xc3\x40\x4a\x39\xfa\x40\xd5\x11\xca\x55\xa1\xe6\x35\x6f\xfb\xa1\x91\x82\x5f\xda\xd1\x1c\x1c\xc6\x39\x27\x43\x21\x0b\x8d\xaf\xfe\x58\x95\xaf\xf0\x9e\xb7\xa3\xb8\x25\xf0\x24\x40\x5a\x4c\xe9\x38\x14\x8d\x6e\x81\x1f\x01\x5c\x52\x74\x0c\xb6\xbc\x7c\x1b\xc7\x35\x41\xf0\xc4\x78\xa0\xd8\x3f\x3b\x0d\x93\x75\x14\x04\x57\x19\x33\x6a\x32\x28\x23\xe4\x7e\x56\x0c\xd7\xf9\x0f\x5e\x63\xad\xc3\x05\xf6\x60\x7c\x15\x19\x48\x57\xe0\x7c\x0b\x65\x75\xc8\xcb\x21\x93\xaf\x6b\x94\xea\xcc\x0a\xdb\x18\x0c\xe1\xc0\x41\xba\x08\x97\x80\x94\x12\xc3\x2f\xe6\xc9\x97\xf3\xd5\x55\x43\x03\xa4\xe2\x48\x0c\x62\x40\xcc\x3e\x45\x72\x09\x0d\xba\x06\x74\x03\x25\x0d\xf7\x6b\xb7\xe0\x6d\x4e\xc2\xfa\xb1\x57\xe3\x37\x00\x81\x32\x22\x69\xa6\x40\x68\x56\x14\xcb\x7f\x6d\x87\x21\x7e\xd7\x8e\x28\xe4\xb5\xdd\x6c\xb7\xeb\xef\x2a\xe2\xae\x17\x2b\x02\xc8\x34\x18\xb9\x12\x33\xe5\x2f\xad\x13\x8d\xa8\xbb\x3b\x03\x27\x44\x71\xca\x71\x4c\x43\x87\x24\x96\x06\x56\xfd\x4f\x2e\xdf\x5e\xaa\x56\xd7\xd5\x61\xf1\xde\x6d\xa2\x43\x0f\x5f\x87\x3c\x4e\x4c\xf7\xbe\x8e\x92\xa9\xa3\x4f\xa6\x43\x69\x77\x59\x2c\xed\x0a\x36\x50\x14\x3d\x49\xe3\xe8\xb9\x35\x49\x8d\xf2\x51\xcd\x4b\x55\x1d\x0c\x93\xf4\xb4\x4d\x44\x94\xb2\xeb\xe8\xd3\xf9\xbe\x2a\x7c\xe2\x54\x47\x51\xa6\x8d\xf6\x52\xad\xf2\x31\x9e\x5f\x47\x49\x8a\x23\xe1\xb0\x1b\x56\xb0\xeb\x48\x64\xe0\x59\x5a\x27\xba\x95\x6e\xb2\xeb\x48\x12\x1c\xff\xcd\x81\x7b\x3a\x2f\x1d\xa9\x00\xa3\xc0\xaa\xae\x8e\x3d\xa7\x48\x67\x08\xc5\xa9\x8f\xc0\x6d\xda\x5e\xc0\x5f\xea\x38\x33\xb1\xd3\xf6\x03\xf8\xdb\x2d\xcf\x8b\x5e\x85\x6d\xd2\x65\xb1\x64\xac\xaf\x5e\x77\x41\xd8\x49\x47\xd0\x8c\x85\x56\xcc\xf3\x1b\x9c\xce\xd7\xa6\xb2\xa6\x8a\xe2\x5e\x7e\x2a\x45\x85\x63\xc1\xba\x03\xf6\x70\x1a\x18\xd1\x61\xf3\x10\x58\xee\x3a\x7e\xca\x94\x98\xf7\x59\xcd\x46\x5d\x9d\x26\x86\x3f\xc1\x54\xb6\x60\xc0\xea\x5b\x3b\x44\xa7\xd4\x48\x00\x99\xaa\x07\x8c\x1b\xd4\x07\xb4\xda\x6d\x50\x7c\xf2\xe2\xa9\xd4\x98\x49\xcb\x65\xb5\xd8\x3e\x0c\x0d\xf3\x21\x28\x48\xa7\xca\x73\x3e\x3c\xe5\x25\xd4\x57\xc0\x8d\x9a\xc5\x11\x97\x8e\xed\x6f\xf4\x16\x99\x10\xda\x9a\xed\x16\x6f\x76\xc7\xe5\xc5\x7a\xa4\x33\x29\x13\x36\x00\x07\x8f\xa1\x9c\x93\x60\xf4\x70\xb7\xd2\x19\x70\x1c\x40\xeb\x7d\x5e\x3a\xd9\x0c\xa9\xb9\x30\x7c\x56\x9d\xdf\x8e\x99\xf8\xaa\x54\xeb\x53\x01\xd3\x59\x20\x02\x1e\x73\xb7\x01\x55\xa5\x29\x33\x5c\xfc\x17\xa3\x51\xee\x5a\x82\x48\xdc\x3e\x8f\x28\x54\xbf\xad\x26\x73\xce\x8f\x6f\x91\x1a\x6e\x21\x8c\x9f\x3d\x55\x65\xbb\xc7\x7e\x74\xe0\x87\x6f\xa3\x8c\x5a\xa4\x26\xff\xbe\x85\xa6\x9d\x20\x5f\xb5\x8c\x13\xc4\x5a\x70\x74\x71\x37\xf9\x6b\xf9\x63\x52\x18\xad\x65\xcc\x5d\x62\x7c\xcc\xce\xa3\x25\x23\xa0\x6c\xc5\xa7\xdc\x43\xaf\x34\x21\xb5\x92\xc4\x50\x8d\xa1\x82\x6b\x33\x06\x93\x6b\x48\xb2\x38\x1d\x21\x69\x5c\x59\xca\x40\x7c\x49\x6a\x50\x5c\x81\x07\x17\x6c\x3d\x4c\xc0\x1d\xd7\x54\x23\xe9\xba\xe9\xbd\x55\x2f\xc7\x2d\xb5\x66\x04\xc1\x0c\xd2\x4b\x2a\x20\xbf\x27\x78\x25\x59\xa9\x35\x37\x2a\x61\x46\x18\xbd\x9d\x06\x8c\xb4\x56\x0c\x31\x96\x06\x1d\x7d\x2d\x1e\xa4\xb5\xa6\xb6\x5e\xc4\x70\x53\xed\x6b\x80\x87\xaa\x7d\xa8\x4e\xf5\xf0\x49\x55\x10\x86\x1c\xbb\xd9\x20\xc3\x9a\xdd\x3e\x6f\xaa\x09\xd7\xb9\x0a\xc2\xc8\xa8\x3b\x1c\xf2\xaf\xe1\xb1\x57\x10\x43\x2a\x08\x55\x48\xba\x2d\xeb\xcf\x21\x2e\x41\x05\x84\x04\xa6\x0c\x16\xf1\x13\x9b\xd9\xe3\x62\xf7\xb2\x5e\xfe\xe1\x69\xc7\x55\x40\x32\x8d\x8e\x1a\x02\xef\xfe\xfa\xf1\xb2\x5c\x6c\x1c\x43\xbe\xf2\x6d\x78\x82\x30\xec\x9d\x99\xa4\xed\x1d\xc0\x4c\x34\x93\x47\x8f\x54\x84\xc1\xf7\x07\x8c\xbc\x19\xcf\xe7\xef\x00\x48\x54\x10\x69\xce\x52\xe7\x0b\x6a\x98\x0a\x65\xa8\x20\xd6\x09\x6e\x94\x87\x16\xa3\x11\xee\xb1\x92\x20\xc4\x15\xe6\x00\x2a\xef\x63\xa4\x2a\x48\x88\x88\xfc\xf5\x0c\xf0\xf8\x8c\x71\xe9\xc9\x13\x27\x44\x63\xd8\xa6\x45\x8d\xa5\xb6\xd9\x40\x6b\x19\x60\xfd\x95\x24\x89\x95\x65\x46\xfa\x99\xab\x76\xdf\x4d\x9b\x2b\x16\x7e\xd7\x12\x74\xec\xb5\xc8\x5e\xc1\xe0\x6a\x06\x2b\x9d\x0a\x12\xc5\x53\xe8\xa7\xca\xb0\xf2\x42\x05\x34\x14\xd4\xa8\xd1\xf0\x76\x7f\xcb\x5b\xbe\xe3\x91\x3f\x16\x33\xdc\x01\x5c\x55\xf5\x42\x9d\xf0\xf3\x7c\x23\x08\xdd\x9d\x94\x51\x1b\x14\xc1\x26\x37\xe7\xcd\x3e\x3f\x4e\x92\xb6\x2a\xa0\x99\x44\x71\x4c\x6b\x1e\xaf\xb9\x04\x5b\xf3\x74\xfd\x5b\x51\x61\xa4\xb8\x25\x14\x20\x26\xe4\x53\x2a\xa0\x0a\x90\x59\x7b\xcf\xdf\x7b\x03\xad\xb9\x80\xa0\x5d\xc3\xb2\xa8\x20\xa5\x19\x0a\x5f\x39\x66\xcd\x70\x37\x7b\xea\xd5\x1d\x54\x90\x66\x86\xf3\x7b\x97\x37\x4f\x58\x21\xf2\xe2\xd3\x11\xd7\x9f\x35\x85\x48\x99\xa8\xca\xe7\x68\x52\xa4\x9a\x64\xb6\x28\x79\xc1\xdb\x1e\xc2\xa0\x02\x16\x2a\xcc\xc0\xfd\x0f\xea\xaa\xb3\xa0\xcd\xba\xc0\xc7\x7e\xd6\x35\xbb\x58\x05\x8c\x08\x24\xc1\x30\xa1\x87\x63\x0d\xbc\xdb\xab\xb1\x54\xcf\x5f\x3d\x0a\x31\xd9\x7d\xf3\xfc\x3c\x7a\x1e\x26\xb8\xea\x65\xad\xe4\x79\x5b\xa1\x53\x3e\x9a\xdf\x0c\x18\x86\xa6\x5d\x44\x6c\xbe\xe7\x45\x01\xe5\x2b\x86\xc6\x5e\x78\xd3\xce\x4f\x4d\x5b\xa9\x4b\x66\x9f\x2b\x8c\x9b\x13\x4f\x51\x05\x19\x10\x9c\xba\x26\x79\x35\xb7\x8f\xf1\xad\x3d\xa0\x02\x9e\x31\x24\x91\x10\xdd\x2b\x5a\xad\x98\x5b\x03\x86\xfb\x6d\x84\xac\x19\xa4\x5b\x54\x20\x12\x40\x4e\xdb\x6e\x25\xc7\x62\xd8\xf1\x22\x29\x79\x48\xb8\x07\x3e\xde\xf0\xbe\xf3\xa4\x64\xae\x14\xe4\x0f\xa8\x07\x75\x45\x2a\x50\xa0\x31\x90\xbb\xc9\x0f\xc7\x02\x9c\xb5\x36\xea\x62\x48\x24\xae\x83\x98\xd6\x1a\x33\x4e\x5f\x7f\x3b\x90\x02\xc1\x7f\x9b\x6a\xcf\x73\xd1\x3b\xec\x2a\xd0\x61\x84\xb5\x6e\xb7\x35\xff\x30\x08\xd7\xe1\x15\xfe\xdf\x61\xb5\xdd\x15\x93\xd4\x06\xf5\x66\x85\xab\x91\xff\xa2\x29\xe1\x46\x5b\x1b\x77\xfd\x5b\xd0\x50\xaa\xbb\x89\xa7\xa7\x02\xcd\x0c\xa1\xaf\xd9\x34\x67\xea\x1d\xea\xbc\x99\x6c\x6e\x2a\x0c\x88\x4e\x7b\xf6\x59\xb3\x75\x1a\x5c\xb6\x6f\x41\x8d\x6b\x78\x2a\x73\x04\x2c\x5b\xd3\x7b\xb8\xaa\x85\x61\x12\x28\x13\x24\x52\xae\x96\xa4\xdb\xc4\x97\xe5\xe4\x6e\x61\x67\x89\x62\x35\x49\x5d\x9f\xfb\x5a\x57\x15\x86\xda\xa8\x24\xef\xba\xa1\x3d\xfb\xe0\xb5\xea\x53\xf3\x2a\x24\xa1\xc8\x42\x87\x9b\xf8\x9c\xf3\x63\x18\xfc\xe9\x8f\x45\x26\x6f\x6b\x88\x4e\x4c\x8e\xe3\x92\x07\x4d\x85\x44\x8b\x44\x8c\x71\x33\xce\x1f\xf5\x76\xb6\x0a\xe3\x94\xa1\x93\xb1\x43\xb9\xe6\x5b\x10\xed\x54\xbc\x7d\xfc\x2d\xc2\x58\x10\x0c\x64\x58\xc3\x73\x18\x19\x53\x61\x42\x39\x46\x13\x1c\xb8\xf5\x65\xbd\xd8\xde\x2e\xfc\x51\x4e\x31\xec\xe8\x7d\xca\x6f\xd6\x97\xc9\x5d\x93\xce\x11\x1e\x04\xc4\x86\xd4\x16\x2a\x4c\x94\xc1\xe8\xdf\x60\x36\xd9\x33\x6d\xa9\x30\xd1\xc4\x62\x0e\xfe\x03\xb2\xbd\xa6\xe1\xfc\x85\xd0\xb5\x0a\x69\xa0\x8d\x56\x80\x31\xf9\x2d\xd7\xbe\xfa\x46\x38\x47\x85\x34\x14\xd2\x26\x31\x54\x35\x0e\xa1\xab\x90\xd2\xcc\x64\x37\x8d\xc7\x34\x2b\xb1\xb0\xf1\xcb\xf7\x1f\x2c\x1f\x21\xd5\x29\x1a\xcb\xbb\x9d\xdb\x0c\xbb\xf5\xef\x4b\x42\xc1\x91\x8d\x14\x52\xcd\xe3\x70\xb0\x8f\xda\x1a\xc6\xc9\xd3\xa5\xa1\x0e\x60\x20\x82\x65\x15\x43\x2d\x50\x76\xfc\x9a\x29\xd7\xe8\x5b\x0d\xbd\x9b\xce\x40\xfa\x85\xd2\xbb\x0a\x59\xc8\xd1\x36\xbe\xdb\xfe\xf1\x65\xd1\xd0\xb5\xa0\x81\x0a\x19\x31\x45\x94\xab\x1a\xca\xc1\xb2\x14\x32\x16\x83\x0d\xa8\x8f\x56\x25\x77\x38\x33\x75\x4d\x08\x3e\xbb\x2b\xf2\xa3\xe1\x05\x1d\x2e\x92\x21\x93\x46\xda\xf6\x65\xb3\x1c\xff\xae\x8c\x82\xc5\x6c\xbb\x5d\xef\xb6\xeb\xd9\xed\xec\xe6\xd1\x0f\xe5\x2c\x30\xec\x6b\xae\x53\x97\xb7\x9e\xe2\xea\x0b\xd3\x24\xcc\xc2\x54\x24\x63\x78\xcc\x73\x55\x22\xbe\xee\x11\x35\x4f\xfd\xb5\xa5\xa9\xb8\x41\x8e\xed\xce\x24\xb8\xad\xf9\x6b\xe5\x9f\x8b\x07\x0a\xf9\x1c\x37\xfb\xea\xa3\xe7\x84\x55\x21\xd7\x41\xe8\x24\x7a\x2f\xe8\x5f\x54\x28\x08\x41\x97\x01\x13\x1b\x97\xa4\xd0\x2a\x54\x69\x88\xde\xce\xf3\xd0\x29\x1e\x8d\x24\xc5\x33\x74\x5a\x0d\x53\x4a\x37\x04\x9f\xab\x72\x5a\x19\x68\xdb\x42\x68\x92\xe9\xc6\xc0\xfa\x25\x8b\xbc\x0a\x81\x84\x38\xa8\x90\x2a\xf2\xaa\xbe\x8e\x0a\x81\x19\xea\x64\xd7\xeb\x9d\x57\xf6\x55\x77\x03\x8b\x32\xe9\x07\xb4\x59\x45\x27\x6f\x0c\x3c\xc2\xd0\xb6\x9d\x91\xea\x0a\xc9\x60\xd7\x48\xa4\xca\x99\xd5\x48\x06\x7d\xb6\x3b\xb1\x7b\x2a\x1d\x18\xe6\xc4\xed\xbe\xae\x4a\x78\xe2\x6f\x17\x7b\x8e\x8e\x0d\xbc\xe8\x60\x95\xa0\x4c\x8a\x6d\x14\xd8\x52\x24\x08\xcd\xcb\x21\xd0\x6c\xf7\xb2\x5e\xa0\xdf\x82\x83\xc0\x35\x09\x63\x89\xb6\xe2\xd3\xcd\x26\x47\x9a\x6a\x3f\x11\x48\xa8\x29\xd6\x6e\x6c\x0e\xbc\x6e\x11\xa9\xbd\x69\x79\xa9\x78\xad\xfe\x9e\x40\x87\x22\x24\x16\x18\x38\x37\xcc\x3f\xb3\x9b\xe5\xca\x5d\x3b\xa2\x69\xd0\x7f\xf7\x27\x38\x54\xf5\xd9\xe0\x69\x47\xaf\x49\x22\x16\x22\x3f\xb0\xed\xc0\x59\xa9\x46\x72\x42\x8a\x44\x42\x07\xc8\x34\x56\xbe\xd6\xd0\xf0\xfa\xae\x2a\x55\xe5\x3b\x20\x92\x09\x02\x5d\x1b\x36\x2c\x94\xea\x7e\x57\x3c\x32\x99\xb0\x71\x7d\xa7\x3d\x1e\x27\x06\x0d\xdb\x59\x64\x3f\x50\x19\xe7\x9e\x1f\x44\xd1\x99\xca\xbc\x6e\xcf\x77\x55\x7d\x33\x96\x02\x18\xec\x7f\x24\x49\x03\x43\xef\x05\x7a\x20\xbc\x37\xb6\xd1\x49\x92\x19\x87\xa8\x81\xf6\x17\x16\x14\x49\x04\x0f\x95\xc3\x84\xcb\xbd\x91\x1b\xbb\x56\xf9\xa6\x08\xb5\x8c\xf9\xdd\x13\x2f\xcb\x47\xde\xb4\x9b\xfc\xb3\x05\xac\x74\xfd\x9f\xef\xb3\x34\x01\x44\xdf\xf7\x59\xf6\x45\xf7\x70\x83\xf8\xff\xdf\x72\x37\x49\x9a\x12\x2f\x5c\x67\x50\xb8\x8d\xad\xaf\x1f\x0f\x78\x92\x32\x1f\x12\xed\x9c\xda\x27\x3e\x71\x20\x49\xca\x4d\x56\xbd\x3d\xd5\xe5\xaa\xbc\x3b\xd5\x25\x97\x0e\xa4\xfa\x7f\x89\xb1\xb8\x43\x62\xcd\x10\xc2\x80\x05\x8e\x98\xb9\x6c\x4e\xf5\xb0\x3c\x60\xf2\x88\x99\x5d\xd9\x8c\x45\xf8\x05\x85\xdf\x2f\x5e\x33\x4b\x00\xc1\x53\x92\x17\x85\x4d\x10\xcf\x06\x98\x63\x45\x32\x16\xa0\xfb\xbc\x5d\xcc\x9e\x76\x8f\xab\xf9\xef\xbb\xdb\x1f\x6b\xbb\xd2\xcc\xd6\xdb\xd0\xb5\xe3\xa9\x51\x21\x30\x83\xde\x01\x97\x7f\xf1\x10\xa3\x6f\x61\x33\xf5\x8a\x70\x91\xa1\xad\x67\xb1\x66\x77\x70\xe0\x9d\xc1\xde\xc8\x81\xe9\x44\x84\x36\xf9\x24\xab\xf9\x6f\x90\x35\x37\x03\x16\x87\x2f\x5e\x58\x26\x21\x22\xf6\xf0\x62\xf5\xf9\xda\x86\x4d\xa4\x30\x6a\x89\x3c\xaf\xf9\x57\x45\x96\x93\xcb\xaa\x18\x30\x7c\xde\x0d\x4e\xbc\x66\x0e\xf5\xac\x54\x8f\x95\x7c\x7b\xb1\x32\x17\xe1\x55\x24\x85\x22\x2a\x21\x98\xad\xbf\xbb\xfb\xb1\x78\xf4\x65\x5a\xbf\xd6\xc7\xfa\xaa\x2f\x7f\xf5\xe7\xe4\xc1\x55\xc8\x33\x87\xac\xb7\x11\xec\xbb\xaa\x5e\x95\x30\x06\x94\xfc\x62\x1c\x69\x6d\x20\x3f\xf7\x50\xe6\x55\x5f\xf0\xf9\xf5\xfa\x19\x05\xa1\xc6\x15\xf8\x69\x79\xeb\x56\xce\x28\x88\x28\x7e\x9c\xa7\xd9\xfd\xf3\x72\xfb\xc3\x9b\xc2\x51\xc0\x64\xdc\x6b\x8e\xee\x73\xa5\x6c\x4c\x63\x3c\x19\xa3\x20\x33\xfa\xe5\x08\x28\x02\x75\x3d\x26\xaf\xa2\xa0\x73\xef\x7d\x94\x3a\x7f\xa9\xaa\x62\xa1\xf2\x76\x47\xdd\xfd\x42\x42\x99\x95\xec\x59\x96\xf3\xbc\x96\xa7\x62\x00\x3d\x51\x11\x09\x04\x86\xfc\x90\xb1\xec\x74\x58\x74\x43\x69\xbb\xaf\xa1\xd9\x7b\x9e\x77\x15\x11\x6e\x14\x4b\x35\xd2\x27\x21\xed\xd3\xad\x3f\xa6\x64\xec\x03\x01\x8b\x62\x5c\xd1\x60\xdb\x44\x4c\x28\x9b\x7f\x9f\xcf\x1f\x4c\xcd\x17\x19\xd5\x7c\xa9\x28\xca\x34\xc2\x9c\x76\x55\xa1\x2c\x4a\xcf\x1d\x11\x31\x11\xbe\xcb\x8c\x37\x36\xb9\xbe\x4e\xf0\xf9\xcc\x14\x7a\xae\x2c\x33\xab\xb5\x0a\xc7\x2e\x79\x14\xf3\x34\x75\xb4\xa2\xbc\x75\x59\x72\x15\x25\x22\x54\xd6\xbd\x5a\x7c\xb6\x35\xbf\xe5\x67\x7f\x8c\x86\xd4\xa9\x8e\x3e\x55\x0a\x8a\xc9\xfd\x29\x98\xb0\x3c\x57\xca\x94\x10\x5c\x2d\x5f\x52\x51\xca\x33\xbc\xc5\xe3\xdc\xed\xec\x11\x0b\x13\xea\x65\xd6\x51\xf4\x77\x59\xb6\xf0\x0a\xf5\xf6\x7c\x74\x3a\x52\x2e\x70\x11\x65\x19\x88\xd4\xd2\xe6\xcf\x96\xeb\xdb\xf5\xea\x65\xf7\xc7\xea\xf1\xc7\x93\x1f\x5e\x22\xd1\xce\x16\x44\x0f\xf6\xbc\xbc\x9d\x3c\xab\x4c\x41\x26\x2e\xa1\x89\xcb\xe4\x65\x0a\x42\x45\x2a\x30\x4a\xe9\x2a\x6f\xf8\x6b\xed\xc8\x21\x54\xa4\x20\xc5\xb4\xa2\x00\x1b\xdf\xee\x97\x76\xdb\x02\xc2\xd8\xc8\x3f\x58\x6e\xdf\x4b\xb2\x49\xdf\x90\x5b\xa9\xfd\x1b\x18\x11\x10\xab\x08\xe2\x04\xc7\xc2\x2d\x6f\xb7\xd5\x6d\x5b\xcb\x61\xea\xd5\xb6\xd1\x41\x80\x7c\x42\x77\xd6\xe3\x54\xdb\xfc\xab\x28\x5e\xa4\x43\x82\x3c\x8d\xba\xe0\xaf\xb3\x52\xb9\x53\xc6\xef\x1c\x07\x71\x82\x0e\xee\xe2\xcf\xd5\xc6\x4d\xe4\x38\x00\x83\xd1\xc3\xc2\xa3\xdb\xaa\x1c\x4e\x9e\x38\xd0\x11\x16\xc3\xbc\x3c\xcc\x36\x8b\xdd\xea\xc5\x65\xf7\x55\x1c\xa6\x01\x45\xae\xc6\xcf\x63\x6e\x78\xac\x86\xa1\xb1\x38\xe4\x51\x5f\xa7\xe6\x76\xe5\xc5\x67\x0b\xa5\x02\x35\xdf\x9f\xca\xb7\xdb\x91\xdc\xbe\x8a\x49\x42\x50\xd5\xea\x90\x97\x50\x3f\x9f\x0e\xee\xf7\x28\x89\xc9\xd0\xc9\xbb\xb0\x8a\xc7\x6b\x74\x1c\x89\x18\x61\x3e\xba\x06\xf8\x1b\x0c\x54\x2a\x8e\xc3\x0c\x69\xde\x8b\xbc\x69\xb7\xd5\x31\x97\x6e\x52\xc4\x31\xcf\x10\xc1\xf0\xfb\x49\x55\x8d\x15\xe6\x37\xa0\x95\x4a\xbe\x9d\xbe\x7a\x80\x24\xa6\xbc\xcf\x7e\x6f\x1b\xfe\x98\x97\x6f\xa3\xa5\x20\xa6\x51\x86\x3b\x70\x09\x1f\xf3\x3d\x2f\x4b\x28\xbe\xac\xaf\xb8\x96\xd0\x1a\x4c\xf6\x98\xa6\x3a\x88\x07\xf4\x67\xbf\xda\x04\xc7\x27\x4b\xa3\x36\x5f\x5b\x3d\xeb\xd0\xd1\xd0\xd9\xe3\x69\x68\xf4\x32\xca\xea\x0e\xa0\x41\xa8\x8e\x3b\xc2\x45\x4a\x2c\x97\xc7\x34\x59\xac\xe2\x54\x8b\x34\x1c\x02\x00\x2e\x8e\x4b\xac\xbb\x37\xb9\xae\x63\xed\xa2\x43\x31\xcb\x22\xc3\xc9\x8f\x32\xdb\xbc\xc5\x3a\x91\x5e\xfa\xed\x1a\x31\x8b\x8a\x19\x07\xc4\x1e\x0a\x68\xda\x5d\x73\x12\x87\xbc\xe9\x9c\x98\x1d\x97\xf2\x54\x73\x79\x76\x17\xcf\x88\x4e\x62\xc7\x92\x7b\x2e\x2e\x29\xa0\x47\xdf\x28\x8b\x0c\x76\x78\xb3\x7a\x9c\xad\xe7\x0f\xb3\xa5\x8d\xf1\x7e\x55\x97\xd8\x0f\xa8\x8c\x19\xbe\x27\x67\x14\xb9\xf9\xeb\x9f\x83\x85\xe8\x8e\x98\x68\xde\x84\x3b\xc5\xb6\xe1\x51\x0a\x3d\x4f\xe1\xb0\xaa\x22\xfc\x32\xc9\x6c\x4f\x15\x11\xe3\x86\xf1\x44\xd7\x1c\xd3\x24\x5b\xcb\x7e\x3c\x69\xc7\x01\x3f\xe1\xce\x25\x51\xc9\xf5\x45\x3d\x16\x90\x62\x5d\x16\x58\x59\xb6\xcd\xc3\x2c\xf2\x15\x1e\x78\x4d\x13\x19\xf6\x27\x48\x16\x00\xf7\x29\xec\x67\x7e\x80\xe6\xc8\x25\x18\x56\x80\x6b\xfc\x90\x2a\x96\x40\x23\xbb\x37\xb9\x6e\x52\x59\x90\xda\xa2\x9b\x67\x53\xb3\xd1\x74\xde\x9b\x1c\xda\x96\x31\x00\x65\x46\xa6\xa9\x54\x37\x95\x18\x40\xc8\x55\xac\x55\x80\xf5\x04\x79\xf3\x7c\xea\xc3\x51\x6e\xaf\x89\x75\xb7\x6d\x77\x6b\xdb\x90\x11\x40\xc5\x1a\x62\xa4\x35\xc1\xdb\x40\xbd\xf3\xd7\x4b\x82\x44\xe0\x0a\x55\xf3\x52\xbd\x42\xf9\x0c\x1f\x0f\xdc\x25\x4e\x55\x12\x70\x82\x41\x10\xa3\xe3\x3e\x2b\x8a\x1b\x2e\xdf\x5e\xeb\xce\x94\x58\x1e\xf8\xab\xcb\x0f\xab\x24\x00\x6d\x42\xe2\xf9\x01\x0a\x64\x5d\x33\xcb\x94\x2b\xec\xf2\x57\x0c\x03\x8e\x4b\x6c\x75\xaa\x3b\x93\xbe\xff\xd9\x44\xc7\xad\x39\x6d\x14\xe4\x26\x33\x30\x21\x61\x80\xd8\x9a\x66\x5f\x7d\xa0\x26\xc2\xf4\x38\x11\x58\xb6\x73\xc1\xca\x6d\x33\xe0\xdd\x90\xbc\xbd\x8a\xa6\x51\x09\xd1\x99\x32\xe1\x9e\x23\xea\x12\xaf\xbb\xf3\xae\x6f\x4c\x49\x14\x79\x20\xbb\x61\x67\xed\x66\x02\x7a\x67\x55\x3d\x00\xb1\xab\x24\x62\x84\xc6\x0e\x36\x80\xec\x79\xd7\xb0\x2a\x2a\x89\x83\x28\x34\x71\xcf\xf7\xea\x0d\x56\x35\x97\x5f\xe0\x63\x55\x12\x47\x11\xd2\x14\x4e\x69\x5a\x87\x2d\x4c\x6d\x02\x6e\x5d\xa2\xff\xd2\x71\x0c\x0e\xbe\xbb\x69\xb9\x7c\xdb\x5c\xec\xa5\x49\x0c\x32\x1b\xaa\xa1\xcc\x4a\xe5\x68\x9f\x0d\x0d\xf4\x57\xac\x52\xf6\x7c\xca\x64\x6c\xd9\x88\xb7\x15\xd2\xe3\x4e\x6e\x40\x95\x21\xe2\x6f\xbc\x57\xfb\xbd\xbb\x94\xa4\x2c\x65\xfd\xa2\x8b\x49\xcb\x9b\x42\x56\x6f\x93\xeb\xa6\x82\x08\xaf\x36\x69\xbf\x89\xa3\x62\x75\x4d\x14\x80\x5b\x28\x8d\xfa\xf5\xf7\xf2\xb3\x2a\x49\x81\x38\xd7\x64\xf6\x5a\x95\x4b\x65\x82\x28\xe3\x4f\xc7\x82\x08\x89\xcc\xee\xc9\x8f\xbb\x69\x19\x6f\x77\x54\x20\x49\xda\xdd\xea\xc7\xf3\xed\x62\xbd\xe9\x75\xf5\x54\xc2\x62\x42\xe9\x38\xeb\x7d\xbf\x78\x5e\xac\x67\x8f\xbb\xc8\xb7\xa1\x81\x8a\x2d\xcf\x63\x3d\xe2\x7f\x53\x09\xb3\xc0\x1e\x97\x65\xc1\x1b\x5f\x1f\x5f\x59\x16\x22\x1f\xd4\x11\xea\xa6\xb3\xed\xbc\x24\xde\xa4\x1b\x33\x19\x39\x6d\xf5\x1f\x77\xdb\xc9\x45\x44\xa0\xd1\xe6\xf5\x81\x69\xcc\xe5\xe5\xfc\x22\x27\xe0\xda\x67\x31\xb2\x0a\x55\x65\x81\x62\x7d\x08\x2b\xd9\xe4\xaf\x25\x6f\x4f\xb5\x1d\x49\xb6\xa9\x0c\x29\x9a\x43\x8f\xd5\xeb\xb2\x6c\xba\x37\xbd\xfe\x45\x24\x37\x5e\xee\xbf\xf2\xaa\x7c\xbd\xf9\xb5\x93\x97\x28\x62\xbc\x4b\x1c\xf3\x27\x81\x30\xd5\xeb\x4f\xab\x52\x8a\xc0\x87\xce\x48\xff\xb9\xdc\x3e\xdc\xae\x67\x3f\x77\x2f\xf3\xed\xee\x76\xb6\x7c\xfc\xcb\x7d\x0f\xc5\x03\x14\xf2\x32\x52\xd3\xbc\x9f\x5c\x10\x46\xc8\x3a\xb5\xeb\x0b\x5d\x27\x49\xec\x04\xa2\x04\x01\x04\x25\x80\x6a\x30\xc2\x3d\xfe\x9e\x90\x44\x18\xe9\x30\x11\x8c\x25\x9e\x3a\x29\x3c\x73\x2d\x53\x93\x66\x55\x0e\x80\x3f\xcc\x75\x25\x3a\x32\xc4\x61\x0d\xb4\x6d\x01\x37\x93\xda\x00\x95\x68\x4a\x11\x06\x5a\xa1\x30\xbe\x03\x81\x8f\x10\xc6\x8a\x06\x2c\xb6\xe5\x2b\xa5\xba\x79\x59\x6c\x56\x5f\xd7\x6d\x28\x1a\x08\xed\x80\xa5\x2f\x35\x74\xce\x28\x6a\x28\xd5\x95\xb3\x77\x69\x00\x14\x31\xb9\x6d\x7d\x6a\x26\x81\x54\x1a\x66\xb6\x00\xae\xad\x6a\x50\xc3\xf5\x93\x92\x18\xb0\xec\x6d\x93\x2b\xf8\x67\x35\x4c\x70\x52\xc2\x8d\xe4\xcf\x37\x3c\x54\xd7\xa7\x35\x8d\x34\x8f\x1c\xa7\x5d\xfe\x09\x85\x81\x06\x5a\x3b\xe4\x1f\xc3\x50\x26\x8d\x03\x8a\x18\x0d\xc4\x5e\x40\xbb\x74\xbb\x18\x8d\xa3\x08\x13\x55\xb9\xac\x6e\x81\xab\x9e\x0d\x50\xd1\x98\x66\xb1\x37\x2c\x14\x14\x2d\xf7\x47\x78\x8c\xb6\x09\x32\xde\x20\xda\x68\xf6\xda\xdb\xa5\x34\xe6\x02\xd9\x15\x5a\xfe\x06\x66\x78\x8c\xbe\x1b\x4d\x02\x81\xb0\x05\xa4\x2f\xdc\xa5\xbb\xe3\xc8\xac\xa5\x94\x50\xbc\x6f\x73\x04\x99\xeb\xf3\xdc\xe3\x89\x26\x97\x49\x43\x53\x9b\xb7\xe7\x0d\x42\x13\xd0\xac\xbc\xe8\xba\xf1\x68\x48\x13\xe3\xa9\xbf\xbe\x1f\xa1\xbb\xef\x0e\x7c\x18\x98\x66\x01\xc3\x52\xdb\x43\xee\xc8\x71\x6f\x86\x3a\x5b\x13\x52\x49\x45\x33\x2d\xb9\x65\x36\xd8\x9c\x8e\xc7\xaa\x76\x18\x91\xc9\x73\x72\x8b\x9b\x69\x90\xf4\x68\x77\x34\x26\xc1\x8e\x8f\x07\x0f\x27\x86\x0d\x9e\x37\x0d\xb4\xcb\x5b\xff\x73\x6c\x44\x8b\x4a\xf8\x6c\x2f\xf4\xf8\x14\xe5\x94\x63\x80\x58\x81\x44\xc2\x77\x83\xc6\x73\x07\x53\xea\x18\x22\xe6\xd5\xe9\x58\x95\xd7\x9e\x4e\xc8\x04\x9d\x8c\x5c\x41\xd9\xe6\x3a\x87\x7a\x5b\xcd\xab\xaa\x56\x68\xe0\x8f\x67\x3e\x95\x01\x60\xc1\x47\xd7\x45\x23\x2d\x8c\xc9\xc8\x94\x24\x48\xbd\x78\x97\xe9\xcb\xbb\xaa\xc6\xe2\xe6\x53\xb7\x50\x2c\xe7\x2b\xb7\x33\x50\xc9\x41\x60\x90\xb2\xaa\x8a\x39\x3f\xfe\xd8\xf8\x77\x57\xd4\x52\xce\x18\xda\x98\x6d\xb5\x01\x07\x35\x55\x54\xa5\xc6\x84\x92\x55\x59\x82\x6c\x9f\x2a\x2c\xc5\x71\x07\xa5\x40\xd6\x19\x63\xed\xb9\x8a\x97\xc9\xcb\x00\x49\x11\x8b\x23\x0b\xe0\xb5\xaf\x7c\x5c\x1d\xa1\xec\x7a\xd8\xf7\x22\xb0\x28\xb4\x7c\x68\x4e\xef\xc8\x30\xa9\x8f\xfb\x11\xb8\x4a\x93\x3e\xe3\x7b\x2d\x2e\xfb\x55\x05\xbb\xa2\x20\x04\x82\x0d\xdb\x3d\xff\xd8\x54\x87\xa9\x67\x3c\x7e\x6e\x1d\x31\xe4\xf2\x32\x40\x3f\x43\x29\xee\xcd\x52\xaa\x39\x45\x03\xe2\xee\xf9\xf7\xd5\x66\x68\x3a\x53\x2d\x28\x96\x94\xce\x7f\x6c\xb6\xab\xa7\xdd\x62\x3d\x27\xc1\xee\x69\xf9\xbc\xdd\x6d\x16\xeb\x3f\x96\xf3\xc5\xee\x79\xe6\x23\x39\x69\x10\x6a\x34\xbe\x16\x7e\x82\xa4\x41\x1c\xe2\x10\xfd\x50\x36\x69\xe1\x7e\x4f\x40\x88\x81\xb1\x75\xfd\xb9\xd3\x40\xa7\x28\xde\x97\x37\x4e\x14\x70\xdc\x85\x69\x98\x2a\x9c\x50\xb3\x42\xf0\xda\x6f\x03\x69\x28\x00\x29\x0f\x5c\x1d\xc1\x17\xea\xf3\xb6\x35\x21\x21\x9a\xbf\x0a\x2b\x60\xb1\xbc\x6b\x03\xaf\x9d\xc1\xbc\x29\x78\xb3\x1f\xc1\x06\x52\xa2\x78\x6c\xb5\xba\x7c\xe8\xf0\xfa\xc3\x47\x41\x8c\x29\x48\x2b\x8f\x69\x17\xea\x6e\x50\x8e\xa2\xa7\xd3\xb3\xa8\xe6\xa6\x2a\xc6\x29\xb5\x12\x77\x6b\x1a\x71\x57\x69\xf3\x08\x5c\x41\x2d\x2a\x4f\x4a\xac\xd2\x34\xd4\xa9\x31\x39\x60\x77\xa8\x4a\x47\x43\xa1\xd2\x34\x92\x18\xca\xb4\xbc\x3d\xbb\x1e\x73\x90\xa6\x92\x2b\x3a\xea\x5f\xd4\x63\xfe\x85\xda\xa2\x3b\x19\xc2\x38\xee\x99\x13\x0b\x2e\xdf\x8a\xbc\x41\x49\xcb\xc9\x57\x62\xd4\x80\x71\x45\x5e\x14\x13\x78\xb4\x4a\x19\x33\xcc\x44\x3b\x75\x05\x6a\x71\x51\x32\xa2\x52\xc6\x63\xcc\xbc\x60\xd0\xb1\xe6\x6d\xfe\x0e\x26\x47\xf9\x2d\x68\x68\xf2\xec\x0c\x62\x0c\xc5\x79\x66\xca\x6d\x5e\x14\x7f\xbe\xcc\x10\xc5\xef\x47\x6f\x46\x8c\xc3\x8a\xf6\xa9\x4b\xbd\xf8\x83\x94\x98\x0c\x33\x46\x7e\x31\xc2\xec\xf9\x42\x54\xca\x03\x8d\x8b\xf0\xe2\x70\x6c\xf3\xee\x9b\x5f\x29\x55\x54\x29\x27\xd4\x51\x7a\x5a\xc1\x8f\xab\x36\x6c\xca\xa3\x14\x97\xb5\xd5\xdc\x06\xad\xbe\xb7\xde\x53\x2e\x42\x34\xb7\x66\x08\x1c\x6a\xee\x9f\x56\xab\xe7\xc9\x25\x45\x94\xda\x12\xa2\x56\x0f\x20\xe9\xdf\xa7\x1a\x52\x21\x8d\x3a\xe8\x7a\xd1\x2d\x00\x8b\x5b\x27\x85\x7a\xb7\x5a\xef\xbc\x9d\x3f\x7b\xbe\x35\xff\x18\xf5\x97\x50\x11\xc2\x10\x6e\x66\xcf\x73\x6c\xbd\x7e\xfa\xf1\x38\x73\x47\xa5\x08\x50\x17\xad\x33\x73\x9e\x78\xfd\x76\x9d\x61\x47\xa5\x2a\x60\x91\x11\x7a\x2a\x55\x61\xc4\x1a\xdc\x25\x14\x0f\x8c\x90\xce\xa4\xe6\x53\xa5\x9a\x87\x48\xde\x32\xff\xd7\xfc\xd7\x76\x73\xaa\x55\x28\x6c\x7c\x7b\x79\xd4\x13\x2f\x2e\xd5\x8a\x61\x86\x17\xb5\xee\xd6\x18\xf0\xb1\xb7\x61\x01\x31\x75\x80\x56\x21\xac\xcc\xdb\xd5\xa1\xcc\x1d\x90\x69\xf4\x1e\x2c\x48\x8c\x41\xe3\x9c\x91\x27\x5e\x8e\x99\x3a\x15\x0b\x23\x40\x50\x07\x16\xe4\xed\xde\x73\xf8\x58\x95\x77\x05\x0a\xbd\xb9\x16\x69\x9a\x09\xcb\xcd\xe6\x69\x50\x15\x8b\xa8\x44\xc0\xd7\xe9\xa8\xcc\x26\x6e\xb8\xc4\xa6\x14\xf4\x8a\x45\x69\x00\x86\x13\xed\xb5\xe6\x0a\xb6\xa7\x46\xe1\x16\xbd\x3c\x1c\x8b\x49\x7d\xb4\x62\x31\xe1\xb8\x4a\x3e\xc3\xc7\xcd\xea\xe5\x57\x58\xa8\x6b\x10\x68\x16\x47\x12\x31\xee\x5e\x83\xad\x05\xb5\x2c\xaf\x29\x7d\x29\x16\x2b\x81\x81\xea\x1b\xc8\xff\x83\xf4\x3e\xde\xfc\x65\x49\xc4\x85\x59\xb5\x36\x27\x81\x85\x52\xe3\x53\x69\x64\xe4\x7c\xb9\x21\xe0\x37\xa4\x11\x63\x1d\xbd\x7e\x5d\x71\xe7\x70\x23\xc9\x75\xfb\xe3\xe9\x65\x33\x9b\xff\xee\xee\x95\x26\x0c\x89\x1c\x41\xe5\xed\xfc\xd4\xfb\xf4\xff\x67\x59\xdb\x15\x4b\x53\x8d\x71\x83\x9b\x4a\xf8\x93\x04\x4d\x6c\xdd\x7a\xe7\x62\x40\xdd\x9e\xbb\x7d\xb7\xcf\x5a\x84\x93\x79\xc5\x18\x63\xa6\x34\x46\xee\xab\xaa\x40\xa4\x9f\x2f\x78\x51\x2c\x23\x1a\x71\xc9\x0a\x4c\x05\xc0\x20\xfa\x33\x19\x56\x59\xc4\x11\x5d\x36\x00\x29\x33\x7f\x95\xd8\x90\x96\x63\xf9\xcd\x90\x13\xc1\x35\xe0\x11\x45\x52\x75\x05\x0a\x3e\x7f\xe5\x50\x5c\x5f\x20\x18\x4f\x34\x3a\xe6\xf3\xd9\xcb\xce\x97\xb3\x2a\xc6\xd3\x58\xda\xa8\xd1\xba\xaa\x0e\x93\x91\xce\x33\x53\x8c\xd6\x2d\x83\xfc\x1d\xd4\xa2\xdd\x7f\xa7\x43\xa6\x18\x17\x21\x71\x85\x03\x3c\x2f\x1b\x97\xe6\x1d\x3b\x72\x4c\x24\x04\x3d\x56\x03\xaf\xf6\x42\x44\x8a\xc9\x28\x43\x03\x6d\x96\xcb\xa1\xbd\xc3\x54\x68\xc0\x2f\x0a\x4c\xbc\x7a\xcc\xcd\xe5\x1b\x19\x2c\xc4\x18\xb4\xf2\xcb\x28\x32\xd3\x41\x88\x72\x07\xf3\xc5\xaa\x8f\x04\xb8\x63\x31\x31\x82\x8e\xbc\xb3\x86\xca\x4a\xf5\x47\x98\x29\xba\xdc\xb9\xca\xc5\x2b\x35\x0e\x2a\x0b\x42\x1a\x5b\x95\xe3\x01\xff\x8c\xca\x42\x2e\x91\xf6\xe3\x68\x3d\xdd\x2d\x7c\x4e\x4f\x25\x21\x03\x87\xa5\xba\xce\xc7\xad\x32\x92\x2a\x9c\x8c\x13\x5a\x8e\x27\xfe\xb9\x69\xe1\x38\xe9\xa0\x2c\x8e\x09\x0e\xff\xdd\x81\x7f\x9a\xbd\x1e\x1d\xbe\xa1\xa3\x9e\xc5\x4a\x42\xd8\x43\x16\x4a\x75\x53\x55\x6f\x73\x5e\xbe\xf3\xc9\xde\x97\x25\x24\x34\xe9\x5e\xfe\x79\x73\x3a\x8f\xde\x8e\x46\xb1\x48\x07\x95\x1d\xd7\xd4\x49\xbb\x56\x86\x6c\x55\x9c\xce\xc7\x68\x12\x98\xc8\x28\x27\x9c\x5b\xb3\xff\x75\x10\xa3\x74\x87\x45\x82\x4e\xf0\x4e\x56\x87\xe3\xa9\x85\x65\xd9\x4d\x98\xfc\x7d\x42\xb2\x3f\xfe\xd2\x59\x1a\x1b\x08\xb5\xd9\x7e\xd7\xc0\x8b\x03\x32\xc4\x4e\xee\x9d\x26\x11\x8a\xb7\x6e\xa1\x69\xd7\xa7\x66\x3f\x58\xe3\xb2\x34\x75\x7c\x03\x97\xd2\xf1\xa3\x45\x35\x4b\xa5\xb1\xd1\x31\xfc\x87\x23\x04\x29\x7e\x3b\xc7\xd1\x5d\x8c\x85\x31\x76\xf6\xcd\x70\xb0\x67\x2c\x49\x43\xee\x6a\x95\x9d\xcf\xe5\x0f\xd2\x00\x8d\xc6\x03\x7f\xb3\xf9\x8e\xf6\x7c\xe1\xa1\x4c\x1c\xe6\x6f\x79\x94\x54\xc6\x64\x82\x1e\xd6\xec\x78\x74\xb0\xc6\xab\x9b\xc5\x00\xf2\x94\x31\xb0\xd8\xc5\xce\x2b\xf4\x04\x2d\xdd\xef\x10\xc3\x28\x0a\x6d\x58\x7e\xec\xe1\x2c\x94\xc8\x2e\x52\x1d\xa1\xbc\xaf\xab\xd3\xd1\xc6\x39\xdc\x61\xce\xad\xc2\x50\xd1\x99\xf0\xa0\x76\x26\xe6\xe0\x0e\x6b\x8a\x91\x36\xa4\x5d\x31\x28\x4c\x77\x88\xf3\xc0\xc1\x7e\x9e\xf9\xc1\xaa\x6d\xfe\x0e\x57\x29\xe7\x54\xc6\x35\x33\x1a\x79\x18\xd8\x1f\xd1\x54\x4e\xfa\x46\x04\x14\x58\xbf\x63\x74\x53\xd5\x45\x53\xc7\x0d\xa5\xa5\x53\x9c\xdd\xfe\xb1\xeb\x61\x41\xbd\x3e\xa5\xca\x24\x33\x71\xa3\xbe\x6c\xcb\xf0\xe9\x5e\xc9\x99\x67\x52\x44\x06\x30\x58\xbd\xb7\xe3\x3c\x4c\x26\x95\xc0\xda\xd5\x9f\xb3\xc7\xc7\xc5\xd6\xff\x0a\x42\x10\xaf\x29\x26\xfd\x4a\x64\x11\x54\x99\x8a\x32\xbb\x35\x2f\xdb\xce\x2d\x76\xe7\xa9\x38\x43\x79\xaf\x43\x5e\x3e\xbd\x4d\x75\x84\xc6\xcf\xa4\xa4\xc2\xe5\xb5\x7d\xad\x9f\xe1\x13\x75\x0f\x3c\x78\xd7\x07\x2a\x32\x1d\x03\x16\x39\x77\x96\x04\x52\xac\xcb\xb7\xf9\x05\x21\xbe\xca\x34\x28\x66\x51\x10\xb6\x04\x77\x00\x5d\xe7\x41\x22\xa5\x61\xe7\x42\x3f\xae\xe7\xcb\x1c\x3d\x11\x0f\x12\x8d\xe9\xb2\x9d\x95\x79\x5c\x63\x55\xed\xa4\x51\x18\x19\x0c\xe7\xce\x06\x26\xaf\xbf\x1d\x0f\x59\xe4\xd2\x62\xcb\xb2\x69\xf3\x16\xdd\x9d\x9b\xf3\xf3\x44\x4b\x56\xf1\x50\x99\xd5\xa1\x39\x1d\xfa\x81\xcf\x49\x4c\xd1\x3d\xb4\x38\x50\x9b\x2c\xba\x84\xa0\xb9\xe6\x2c\x36\x6b\x9f\x93\x28\x18\x27\xba\x6d\xab\x88\x1a\x3a\x01\x69\xed\xe6\x1d\x8a\xf5\xbb\x5b\x46\x52\xe1\x3a\x81\x82\x4e\x39\xa8\xce\xe2\x6a\x56\x65\x71\x7e\xea\xb7\x29\x1e\xc7\x0a\x6b\xff\x37\xc7\xaa\x6e\xff\xf4\xbf\x66\x02\xa1\x3c\xdd\x86\x36\x2c\xa6\xe2\x31\x28\x27\xca\x8a\xe3\x72\x73\x04\x50\x63\x73\x84\xc7\x5a\xe1\x36\xb2\xdd\xc3\x0d\xf8\x7d\xd6\x1f\x04\x04\xf6\x99\x20\xd7\x47\xef\x07\xf3\x24\x48\xd1\x0f\xbe\xab\x41\xa9\xfc\x0a\xff\xa6\xe2\x34\x34\xca\x78\xb6\x24\x51\x4f\x0f\xd3\xc8\xf0\xe5\x74\x26\xfe\xf8\xa3\xa4\x81\x0d\x7d\x35\x68\x53\xac\xf4\x3f\x2b\x31\x4e\xb2\xba\x86\x04\x52\x93\x31\xc5\x88\xe7\xcd\xd9\x6a\xa6\xd5\x5f\x15\xc3\xbb\xf3\x58\x86\xf8\xd5\xcd\x07\x3f\x4e\x30\x8f\x93\x91\x94\x66\x1c\x93\xd2\x22\xff\x1a\x27\x36\x7e\x2f\x16\x83\x0c\x6c\xad\x9c\xa1\xb8\xbc\x83\x2f\xf0\x8d\x3c\xe3\x19\x35\xca\xe7\x37\xeb\xbb\x9f\x8b\xe5\x64\xb4\x73\x12\xa2\x25\xcf\x8f\xc7\xe2\xfc\xc2\xcf\x62\xa0\xbb\xfb\x8f\x69\x53\x65\xc2\x04\x3c\x6f\x7c\xf9\x91\x3b\x96\x99\xfa\x3e\x64\x6b\xdb\xf3\x53\x83\xd2\xda\xf9\x61\x3a\x03\xb9\xa6\x98\x60\x5f\x2f\xee\x16\xeb\xf5\xec\x71\xf7\xb2\x5e\xdd\xaf\x67\x4f\x1b\x77\x21\x21\xa5\x13\xae\x3f\x34\xaf\x93\xef\x29\x54\x80\xef\x02\xd3\x80\xef\x08\x41\x71\xd1\x05\x92\x09\x4c\x7a\xbf\xac\x17\x4f\xcb\x1f\x4f\xbb\xf9\x6c\xbb\xb8\x5f\xad\x5d\x3e\x84\x4b\x65\xe8\x77\xba\x15\xf8\x65\xb1\x5e\xae\x5c\x14\x92\x2b\xc2\x5d\x49\xcc\xcf\xbc\x2c\xf3\xf2\x75\x14\x43\xe2\x10\x18\x46\x4e\x2c\x3a\x16\xbc\xc9\xe5\xae\xe1\x65\xb7\xc3\xfa\x06\x04\xbb\xd7\x68\xa8\x6d\x5d\x3d\x25\xd7\x01\xc3\xb4\xd9\xc3\xa9\x7c\xed\x8e\xf8\xdf\x25\x15\xa9\x95\x9f\xaf\x4f\xb2\x5d\x95\x63\xd6\x14\x25\x42\x12\x32\x0b\x0d\x9f\xbd\x78\x1a\x22\x77\x30\x36\xd4\xc1\x2f\xfc\x54\xe0\x04\x1e\x66\xdd\x45\x98\x1a\x78\xfc\xef\x75\x7e\x6c\xab\x67\x18\x54\xf3\x7d\xe9\x44\x8b\x30\x03\xc3\x6a\x79\x04\x99\xf3\xe2\xfe\xec\xd2\x21\x22\x0a\x25\x31\xb3\xeb\x2b\x5a\xdf\xa9\x0e\x8b\x12\x11\x4f\x59\xaf\xbd\xfd\x00\x75\x75\xad\x3e\xe6\x4b\xaf\x44\xc4\x82\x27\xa1\xd5\xe9\xcd\x6b\x78\xae\xda\xc5\xe1\xd8\x5e\xdf\xb5\x45\x2c\x04\x16\x01\xaa\xaa\xac\xda\xbf\xfe\xfa\xeb\x96\x1f\x8f\xc3\xb5\x47\x24\x92\xa1\xf9\x70\xe0\x9f\x13\xcc\x93\x48\x54\x84\x1f\xe2\x50\x29\xcc\x43\x1c\xdc\x90\xbb\xfe\x5c\x94\x12\x6a\x72\xdf\xb6\x86\xc5\x6b\x47\x8e\x62\x64\x22\x8d\x28\xd2\xee\xfc\xac\xf3\xf6\x02\x1a\x20\xd2\x24\xcd\xec\xe0\xdf\xf1\xc3\x35\xf6\x7f\xd7\x90\x82\x56\x03\xfa\xf0\x3b\x24\x1f\xba\x50\xc1\x9b\x9c\xa4\x53\x0c\x82\xd9\xcd\x6f\xc1\xeb\xe2\xbc\xc1\xf4\xda\xa1\x5f\xac\x45\x16\x64\xa8\x52\x65\xf8\x1a\x66\x05\xf2\x8e\x36\x63\x4c\xbd\xc8\x40\xe2\x52\xb0\xfc\xb9\x1d\xc4\x4d\x44\x06\x80\x71\x93\xa7\xfc\x73\x54\x31\x23\xb8\xdf\xec\xea\xa7\xbc\x6c\x67\x48\x5f\x33\xbc\xab\x48\x85\x2b\xb5\x5a\x7c\x82\xec\x0c\x04\x57\xf8\xe0\x9a\x28\x4a\x0d\x49\xd4\xe9\xb8\xe9\xf1\xa1\x02\x02\xa3\x30\xbc\xe7\xcd\x7e\xdb\x0b\xe2\xbb\xa3\x24\x74\x9c\xac\x37\x5d\x7f\xfa\xab\x01\x01\x21\xed\x12\x8a\x02\x21\xf9\xbb\xa5\x8a\x1b\x7f\x12\x88\x42\x70\xfa\x2f\x9b\x93\x98\xf4\x03\xc4\x02\x49\x99\x9e\x2a\x97\x60\xf9\x26\x6a\xf2\xff\xe3\xec\xcf\x9a\x1b\xc7\xb1\xf4\x71\xf8\xbb\xfc\xae\xea\x62\x2e\x40\x70\x01\xf9\xde\xc9\x92\x9c\xa9\x2e\xdb\x52\x4b\x72\x66\xd5\x4c\x4c\x28\xb0\x1c\x48\x1c\x53\xa4\x9a\xa4\xec\x54\x7f\xfa\x37\x78\x00\x70\x13\xed\xaa\xfe\x4f\xc4\x74\x76\x9b\x20\xc5\x05\x38\x38\xcb\x73\x9e\x47\xe8\xd8\x28\xe8\xb5\xc1\x97\xb9\xa3\xc1\x0f\x4a\x12\xf8\x98\xf3\x68\x06\x1c\xf2\xbe\xb7\x2b\x09\x4f\x0c\xd1\xdf\xb5\x3a\x7d\x8e\x55\xb7\x83\x3d\xaa\xd1\x14\x2c\xdf\x3b\xc1\xe6\x4f\x22\x7f\x77\x06\x27\xcc\x96\x5c\x9f\xf9\xaf\xc6\xe9\x9b\xd5\x35\x1f\xcb\x5f\x2a\xe9\x69\x1f\x21\x62\xb6\x23\xc5\xb5\x76\xd9\xa3\xd4\x0b\x30\x91\x2f\xd2\x7a\x5e\xde\xaa\x9a\x3b\x88\x94\x3d\xee\x07\x01\x36\x4b\x37\x9b\xc3\xf4\x7e\x17\xbb\x91\x4c\x41\xbf\x3b\xec\x3d\x85\x0f\xc3\xfc\x30\xbc\x1f\x1f\x12\x4c\xaa\x70\x65\xb8\x6b\x3f\xc3\xeb\x8d\xcf\x52\x18\x8e\x03\x4e\x37\x30\xb3\xae\xef\x33\x8e\xc6\x07\x61\x88\xbc\x52\xa6\x65\xdb\x10\x3b\xc0\x9d\x52\xe1\xf8\x24\xcd\x71\xe7\x71\x5f\x3c\x47\xad\x3a\x7b\x30\xf4\xb4\x67\xee\xfb\x1d\xf9\x09\x1e\x0a\x5e\xaa\x3b\x2d\x40\x25\xc3\xd0\x24\x8d\xb6\xb3\x97\x6f\xcb\xe5\xcb\xe2\xc0\xda\x23\x91\x9f\x18\x19\xa3\x12\xa0\x3c\x5c\x78\x5b\x2b\x90\x21\x53\xdc\xb1\x10\x3a\x8e\xd9\xb5\x5e\xf0\x1b\xb2\x1c\x8d\xde\x60\x18\x87\xc2\xd0\xdb\x6c\x57\xf3\xef\xa3\x83\x8c\x47\xd4\x6a\x25\x19\xfd\x17\xf7\x77\xe5\x45\x56\x25\xa0\xcb\x82\x7c\xe9\xb7\xc8\x38\x06\xcf\x56\x4d\x67\xf9\x11\xb2\x95\x7a\xe6\x97\x4b\x4f\x4e\x62\xd0\xc2\x20\x63\x25\x94\x6d\xab\x40\xe8\x38\x3c\x73\xd3\x5d\x5e\xad\xaa\xea\xda\x96\xbd\x64\x42\x03\x1a\xd9\x10\x77\x07\x99\xc9\xba\xfd\xc5\x97\x49\x82\x00\x0b\xb3\xee\xcb\xe0\xda\x5f\xc0\xfb\x92\x77\x34\xd1\x4a\x26\x5c\x38\x62\xba\x03\xf2\xc5\x7f\xa2\x76\xf6\xf7\x76\x2f\xc9\xfd\x10\x63\xbe\x1c\x3e\xe6\xfc\x7c\xe1\xe9\xf1\x4e\xfd\x7d\x74\x86\x20\x12\xd1\xdd\xf5\xed\x02\x63\xf7\x56\x8a\x88\x21\x38\x7d\xf9\xc0\xf3\xb7\x6e\xbe\x08\x4e\x30\x03\x7a\x2c\xf6\x45\x13\x78\xed\x6a\x70\x19\x65\xa9\xbc\x48\x99\xc6\x0d\xcc\x82\x3c\xa4\x63\x54\xbf\x54\x11\x88\x3e\x99\xfb\x06\x0c\x2b\x12\x6e\x47\x2e\xab\x20\xc1\x0b\xd0\x5e\x3f\x99\x4c\xc4\x5f\xb7\xda\x49\xe0\x46\x17\xba\x72\xac\xec\xc3\x87\x51\xc4\xf3\xbc\xc8\xb9\x5a\xd5\xa9\x0f\xa2\x6f\x2f\xa2\x88\xf4\x9d\x8c\xf9\xf2\xe5\xdb\x02\xde\x27\x37\x7e\x45\x64\x88\x2b\xab\x2d\x6e\xec\xf6\xb3\xc7\xc7\xc3\xb7\xed\xfa\xd5\x01\x97\x14\x51\xc4\xa2\xc4\x6a\x9e\xa5\x5d\xca\x41\x79\x3e\xc7\x56\xa4\xd5\x7c\xed\x18\xc1\xfe\xd6\xd7\x45\x26\xd4\x66\xba\xfe\x09\x7f\xa6\xf9\x71\x9d\x66\xed\x15\x35\x43\x53\xbc\xc5\x77\xf5\xcc\xd3\xcf\xf2\x25\xc6\xfd\x1a\x3e\x0b\xa5\xd2\xed\x8c\xcf\xe9\xaf\x8d\x4b\xb8\xe7\xf5\x97\x34\x34\x4a\x51\xdf\x74\x62\xcb\x22\x37\xae\xe4\xbd\x42\xe7\xf8\x97\x62\x1a\x18\x4d\x92\x4b\x09\xc8\x7a\x81\x7c\xf0\xee\x29\xa8\xd0\x92\xb7\xb4\x9d\x63\xce\x33\xa5\xfc\xd0\x70\xe0\xd5\xc5\xe5\xcb\x9c\xaf\xf2\x79\x8c\x3c\xc5\x2f\x70\xa9\xaf\xce\x45\x50\x01\xf1\xd0\x83\xba\x18\x22\xf4\x67\xd3\x13\xd2\x05\xcc\x2a\x20\x89\xeb\xe9\xfa\x67\xe3\xbf\xa4\x45\x8e\xc8\xd3\x59\x96\x99\x88\xb4\xbf\xd7\xaa\xc0\x57\xc6\xd4\x34\x5b\xd8\xc9\xaa\x84\x5d\xb0\x69\xb8\xe8\x13\x77\xba\xe1\x09\xb5\xc0\xdf\x97\x3b\x2d\x7e\x37\x44\x7a\x18\xf0\x23\x22\xa1\x6a\x4c\xde\xd5\x2d\x2b\x15\x8a\x28\x51\x2d\x2d\xaa\x4e\x8f\x43\xa7\x5d\x85\x42\x20\x33\x55\x51\x72\x99\xa5\xff\x86\xc3\xbf\xae\x50\xde\x86\x77\x1c\x81\xd1\x82\x10\xd7\xdb\x8e\xe7\xbb\xac\xf8\x24\xf3\xa0\x22\x88\x59\x4b\x99\xb6\xbe\xd6\xbf\x0d\x8e\xb2\x20\x11\x56\x3a\x0e\xc5\x24\xee\xd4\x23\x94\x62\x4c\x62\xaf\x14\x82\x7b\xf6\xc5\xeb\x6e\xb1\xed\xcd\x7f\xa6\x62\xdc\xb3\xde\x7b\x2d\xb9\xf6\x50\xac\x7c\x2c\xa8\x89\xeb\xed\x00\x39\x94\xc7\x21\x06\xc4\xce\x45\xfb\x4f\x14\x0c\xff\x97\xbd\x46\xa2\x15\x96\xaa\x1c\x00\xcf\x16\xd5\x8b\x97\x22\x5f\xd6\xa7\x87\xeb\xed\xb3\x82\xba\xe2\x1e\xc5\x15\x7b\x2a\xea\x4d\x51\xf3\xba\xe8\xb7\x2c\x2a\x9e\x18\x02\x73\xf1\xce\x3f\xa3\xfe\xb2\x23\x25\x03\xcc\xb3\x1e\x4b\x2e\x6d\x7f\xd6\x4c\xd7\x50\x62\xe5\x97\xec\x79\xd9\x21\x9d\x95\x22\x4c\xc7\x8e\x99\xf4\x98\xe6\x53\xaf\x53\x31\xd3\x07\xb5\x5f\xf4\x35\xc8\x94\x02\xdf\x87\x51\x09\xc7\xf3\xdb\x83\xb1\xb0\x60\xd9\x73\xf1\x0e\x3f\x1d\x2d\x1d\xa8\x2f\xf5\x08\x95\xd2\x24\x41\x23\xb3\x9a\x0f\x7e\x4b\x7b\x14\xf1\x15\x20\x0d\xf6\xa1\xad\x6e\xf9\x36\x79\x0e\x84\x24\xb8\x8d\x7f\x33\xdd\x39\x5b\x9e\x1b\xf8\xe9\xc8\xde\x00\x49\x00\x39\xcd\xb9\xd6\x29\xda\xc5\x0a\x5d\xcd\x61\x3a\x1d\x88\xf0\xd1\x57\x2c\x2e\x70\x47\x2e\xaa\xc0\xa3\x66\xa9\x9a\x74\xe9\x33\xd4\x7c\x6a\x45\x81\x1f\xf8\x68\xda\x76\x2f\xfb\x4d\xc6\x25\x18\x3a\xa3\xbf\x6a\xd2\x77\x27\x73\x8d\x89\x82\xa5\xba\xf6\x22\x0d\x08\x7d\x42\x3c\x07\xec\x31\x18\xc6\xcf\xba\x80\x20\x8c\x13\x0c\x88\x96\xf3\xf5\x33\xea\xc4\xd9\xbf\x47\x84\x13\x66\x1b\x37\xd2\xfc\x0a\xbb\x6b\x85\x35\x7d\xb5\x3c\x5f\xb2\xe2\x06\x30\x3d\xeb\xdd\xd9\x94\x62\xbf\xb1\xc9\x2b\xb5\xd7\x0c\x09\xba\x6a\xf8\xd7\x2d\x7e\x74\x35\x0d\xea\x87\x28\x36\xba\x48\xd8\x85\x8d\x19\x61\xc4\xd5\xba\x2b\xb1\x40\x08\x8b\xec\x2a\x79\x0d\x4e\x20\x70\xf8\x68\x2c\x8c\x91\xdc\x72\xf3\xf3\xdb\xd3\x10\xf4\x38\x7c\x8b\x2c\x51\x58\x93\xd9\xaf\x66\x2f\x7f\x2e\xfb\x2f\x92\x71\xdf\x73\x11\xd9\x7b\x61\x32\xbd\xa3\x49\x10\x07\x1c\xc1\x7a\x82\xe7\x6f\xcf\xd7\xac\x4e\xab\xb6\x71\x0e\x92\xc4\x60\x25\xef\x95\x6d\x2c\x64\x1a\xb3\x85\xf7\xab\x09\x12\x10\xc2\xd2\x59\x3c\xa0\x66\xb4\x8d\x02\x87\xf7\x9d\x68\x9f\x8a\x96\xbc\xc6\xf2\x40\xd8\x63\x9c\x12\xcc\x31\x3c\xcf\xfe\x38\x3c\xbe\xbe\x2c\x76\x87\xed\x6c\xb5\x5b\x2e\x0e\x8b\xd7\xed\xea\xe5\x9b\xeb\x72\x6f\x87\xeb\x88\xfa\x7d\x2f\x73\x59\x9f\xf6\xc5\x8f\x54\x7c\x12\x09\x80\x08\x0d\x31\xb4\x4a\x2b\x9b\xbc\x75\x04\xa6\xd5\x58\x31\xda\x9e\x21\xa3\x08\x8b\xc2\xe7\xa2\x79\xf2\x9f\x3c\xed\x37\x86\xbb\x31\x8c\x3b\x2a\x70\xcc\x6c\x7f\x2a\xdc\xae\x40\xc5\x14\x8d\x52\x5a\x6d\x78\x3a\xea\xa4\x06\xa0\xc4\x01\x43\x9b\x10\x0e\x7d\xe1\x6a\xec\x3a\x02\x50\x86\xe5\x65\x79\xd8\xed\xff\x79\x01\x14\xcb\x73\x87\x84\x61\x5f\xad\xae\xa2\x8f\xbd\x00\xd0\xd2\xa4\xb1\x1d\xaf\x8b\xfd\xbb\xf6\x40\xcb\x16\x37\xfb\x9e\x16\xd7\xaa\xd3\xc4\x70\x63\x84\x8e\x4d\x52\x81\xab\x5b\xfb\x47\x15\x3a\x9a\xa1\x79\xf1\xae\x41\x8f\x27\xb1\x06\x82\xae\x68\x5a\x35\x21\xcc\xfa\xbd\x75\x71\x41\x43\x8c\x9f\x78\x8e\x99\xac\x33\xa8\x54\xa6\xb9\x83\xa8\x6a\x42\x22\x14\x2e\x30\x94\xcc\x7d\x3b\xa9\x89\xef\x45\x61\xc7\xf8\xbe\xbe\xd6\xb3\x6b\x7d\x82\xbc\x4e\x6d\x30\x3d\xb8\x03\x4d\xe2\x58\x18\xdd\xa3\x26\xe8\x5b\x80\x4c\xbf\x20\x99\x76\xe7\x70\x06\xcc\x21\x2f\x2d\x7c\x65\xe2\x2b\x6a\x22\xc2\x90\x7d\xb5\x42\xee\x17\x87\xf6\x42\x23\x6b\xb9\xdb\xff\x74\xd9\x4b\xed\x45\x11\x5a\xb1\xea\x13\xc7\x45\xd3\xc8\xa7\x16\xe8\x96\x9a\xae\xc8\xa5\x4b\x66\xb5\x23\x94\xd7\x72\x79\x9b\xbc\x50\xcd\x8f\x4e\xa6\x4a\x69\x1f\x94\xd3\x3f\xc2\xb2\x7e\x8f\x54\x51\xe9\x30\x24\xd4\x0a\x20\x3d\x5c\x6f\xd3\x15\xa1\xe1\x0d\x85\x00\xb4\xaf\x0d\xe1\xa0\x50\xf6\x70\x24\x39\xe3\x6d\x33\x75\x35\x76\x26\x07\x13\x59\x33\xed\xc7\xda\xce\xca\xc7\xa2\x7c\x48\x6b\x24\x3c\x9a\xfe\x34\xb1\x4f\x0c\x2f\x60\xf3\x9c\x4f\x85\x7c\x7b\xbd\xec\x40\xfe\xd6\x1e\x0d\x51\x41\xfb\x67\x51\xbe\xe1\xb2\xe9\xbb\xff\x2d\xb7\x80\x8e\xa3\x18\x03\x15\xd3\xe1\x3f\x3b\x16\xf9\x26\xe3\xa3\x68\x46\x27\x89\x51\x60\x99\xcf\xbf\x1f\xf6\xcb\xa7\xc3\xec\xc7\xea\xc7\x81\xb4\x2f\x94\xc7\x2a\x49\x5c\x35\x74\x10\x72\x6a\xae\x38\x56\xfd\x5a\x24\xf2\xd7\xde\x8c\x96\x9e\xc9\x4b\x98\x2c\x49\x76\x89\x46\x77\x22\xa9\xe6\xc6\x58\xac\xf2\x4d\x59\x1c\x7b\x06\x5c\x43\xe8\x51\xb0\x4c\x67\x9b\x6f\x6b\x64\xba\xcc\x6e\xab\xbc\x86\x32\xe7\xd9\x0f\x7e\xcd\x26\x70\x36\xce\xaa\x69\x88\x23\x04\x2d\x6d\x4a\xe0\x7f\x91\x8d\xd2\x10\x73\x57\x6e\xdd\xbd\xa5\x59\x86\x5e\xf6\x27\xd9\x7b\x7b\x8a\x8e\x8d\x04\x9d\x14\x76\xdb\x71\x53\x0e\x08\x89\x85\x69\x04\x73\x26\x7b\x0b\x55\x73\xaf\xf6\xb0\x1f\x68\x4c\x43\x9a\xcd\x81\x67\xd0\xcd\x4b\x37\x22\x96\xb8\x73\x61\x0f\xec\x7e\xac\x83\x0c\x24\xf4\x14\x3a\xd1\x16\x6e\x6a\x4e\x36\xee\xc9\x73\xd1\x2b\x90\x4c\xcd\x49\x20\x61\x48\x10\x88\x51\xd5\x70\x59\xe7\x4e\xe6\xa7\xbd\x76\x44\x50\x35\x58\x15\x2f\x45\x63\x7d\x0a\x8b\x3d\x1b\x5d\x43\xf9\x18\x6d\xfd\xb7\xd7\x6c\xca\xdf\x20\x87\x2a\xad\x46\x63\xa2\xc0\xf0\x49\x7e\x07\x75\xc4\x25\xfb\xe6\x12\xcf\xee\xb7\x22\x9e\xc8\x2e\x85\x86\x16\x2f\x87\x1d\x0c\x32\xd9\xed\x50\x89\x21\xcc\xeb\xcb\x6e\x33\x7b\x9e\x40\xc1\xf4\x03\xdf\xb6\xb0\x0f\x84\x79\xd4\xed\xd7\x2b\x59\x6c\x78\xc9\xcf\x7f\x89\x41\xec\x89\xb4\xdf\xc7\x0d\xdd\x2d\xb1\x10\x7c\xb3\x6b\x18\x81\x9d\x09\xc0\x0c\x10\x16\xf9\x68\xec\xb7\x9b\x97\xce\x7d\x01\xc2\x12\x96\xb4\x73\xa0\x71\x24\xda\x6f\x1f\x13\xa3\x42\xd4\x22\x96\xef\x31\x0b\x63\x2e\xe9\x29\x3f\x00\x48\xec\x0b\x2c\x3a\xcb\x12\x54\xb1\xac\x4f\xf7\xf2\xb9\x40\x92\x40\xa0\x8e\xe0\x7e\xb3\x6b\xff\xc4\x03\x6e\x64\x2a\x75\xcb\xe9\x78\xb7\xba\x80\x08\x22\x71\xcb\x7c\x5e\x0d\xbe\xa8\x68\xc2\x74\x57\x20\x2a\x6e\x83\x38\x13\x88\x64\x71\xc4\xda\xf2\x4a\x13\x73\xac\xb1\x3f\xe6\x2e\x27\xfa\x15\x3d\x24\x10\xa9\x02\xcf\x14\x47\x1d\x1e\x6b\xce\xb3\xac\x63\xbe\xb5\xc3\x54\x12\x6b\x68\xb1\x0e\x82\x8b\x34\x4b\xeb\xd4\xe6\x67\x5b\xce\x43\x20\x8a\xfb\x98\xc8\xfd\x59\x14\xd3\xc4\x40\xbd\xdd\xa1\x19\x9d\xb0\xb6\x0b\xae\xda\x15\x99\x5a\x39\xf9\x35\x20\x4a\x25\x71\xd0\x6a\x5d\xbc\x56\x6a\x34\x1b\x80\x41\xdc\x57\xbe\x47\xa0\x7b\xa7\xf1\xf9\x59\xce\xe4\xee\xed\xeb\x58\x61\x36\xa2\x6a\xf6\xc1\x83\x77\xe8\x49\x88\x00\xd1\xc2\x90\x56\x59\x9c\x2c\x3d\xec\xf6\xb3\xdf\xad\x3f\x09\x1e\xf1\x12\x27\x1d\x79\x48\x65\x91\xa7\xff\x3a\x5c\x4a\x38\xbc\xdd\xe4\x41\x14\xf9\xb5\x3a\xa8\x4f\xb8\xdc\xc1\x23\x51\x44\xe3\x41\xb9\x71\x0b\x97\xa2\xac\x2d\xab\x90\x4b\xfc\xd8\xd1\x5e\x10\x7a\x7d\x0d\xd9\xbe\x1d\x1b\x5e\xd7\x8b\x89\xa3\x6e\x6e\xbc\xa8\x2a\x3d\x9e\xc6\x3d\x76\xbd\x25\xed\x51\x62\x84\xa4\xda\xc4\xb1\x2b\x33\x7e\x9d\x41\x02\x8f\x86\x84\x24\x3d\xf8\x81\xb1\x9b\x23\xf5\x52\xf0\x68\x1c\x39\x8f\x71\x88\xbe\x72\xaf\xdf\xa3\x22\x88\xa0\x2b\xf3\xa9\x4d\x91\xb6\xc9\x47\xf0\x7c\xa9\x4c\xd7\x54\xc6\xd3\xf3\x77\xea\xfe\x1c\x10\xc0\xee\xdb\xbd\xcd\x6b\x7c\x8e\x4b\xea\xaa\x0c\xe0\x05\x2c\xc1\x5a\x7a\x0d\x55\x6d\x4b\x19\xa6\x5c\xff\x02\x1f\x5b\x78\x4f\x1b\x53\xf9\x52\x18\x82\xb5\xf6\x97\x84\x51\x16\xdb\x40\xbf\xc0\x0a\x5e\x48\x23\x34\xc8\x3a\xd5\xf5\xed\x50\x7f\x14\x87\x0f\x80\xb7\xf6\xbe\xa3\x00\x4c\xa4\xd1\xdc\xf7\x90\x0e\x6d\xf4\x22\x23\x9d\x20\xd5\x73\xfa\x90\x3a\x3c\x04\x78\xcc\xe7\x98\x67\xc0\x16\x33\xec\x8b\xfd\x8e\xcd\x03\x77\x4a\x6b\xe0\x31\x60\x92\x5a\x50\xc5\x63\x0a\x99\x32\x9c\xbc\xf6\x68\x9c\xc4\x56\xec\xd2\xa4\x1a\x1e\x6e\x4f\x70\xe4\x3d\x16\xd2\xa9\x3d\x1c\xbc\x18\x04\x6a\xb2\x41\x7d\x7a\xdd\x2d\x7a\xf8\x3d\xf0\x62\xad\x5d\x6e\x6e\x0b\x1a\xe3\x97\xe9\x19\x92\x10\x26\x5d\xc1\x9c\x7a\xa3\x69\xca\x3d\xdf\x77\xfa\x70\x86\x27\x7e\xc2\x3e\x78\x22\x12\xb2\x93\xb3\xbf\x8d\x5b\x03\xc1\x13\xca\xc7\xd7\xdc\xc4\x7f\x3d\xd9\x0b\xf0\xa4\x36\x52\xf3\x46\x70\xe4\xa5\x89\x3f\xc7\xb2\xde\xe0\x29\x5f\x62\x3d\xb1\xba\xaa\xe2\xed\xea\x4e\x55\x4c\x61\x04\x87\xf0\xb2\x95\x68\x1f\x1c\x48\x84\x28\x76\xfc\xa4\xcd\x1c\x9f\xda\xcc\x3d\xf0\x03\xdc\x29\x6c\x67\x59\x71\x45\xf1\x9f\xe1\xef\x82\x34\x54\x09\xe8\x12\x3e\x02\x54\xbd\x1e\x42\xf0\x34\x63\xac\x43\xa4\xe3\x75\xf6\x45\x57\x4c\x02\xea\x79\x4c\x33\xa3\x08\xfb\x68\xd9\x4f\xda\x43\x4c\xf9\x96\x01\xe7\xe1\x7a\x9b\x17\xd7\x72\xd4\x0e\x05\xd4\x4b\x22\xb4\x59\x17\xbf\x3d\x49\x4b\xec\x0f\x38\xf0\x09\x50\x37\x50\xea\x9b\xfe\x29\x84\x01\xcb\xb7\x56\x26\xad\xbb\x24\x0d\x0c\xc0\x0e\x9f\x07\x3b\xac\x7a\x2b\x85\x52\x6e\xf4\xb4\x66\xab\x9f\x5f\x6d\x06\x94\x2a\xdf\xb7\xf0\x40\x0c\x3a\xcc\x4b\x19\x0e\x01\x93\x0a\xa8\xa0\x7e\x2e\x72\xa8\x4f\xfc\xb3\x22\x4d\x67\xe2\xa8\xef\x27\x98\x7e\x13\xd7\xdb\xde\x65\xc2\xdc\xbe\x46\x03\x4f\x1a\xd8\xab\x79\xdb\xcb\x5f\xc5\x25\xe3\x39\xd4\x9f\xa1\x1c\xae\x03\x75\xec\x9e\x2b\x13\x0f\x1f\x26\x60\x1a\x2b\x0b\x2e\xc5\x77\x28\xf4\x81\x3b\xb1\xb3\x43\x56\x1c\x53\x39\x7a\xcd\x51\x68\xbc\xc0\x59\x5a\xee\x3e\xf8\xe5\x3b\xf6\x4a\xfc\x85\x15\xa6\x2c\x14\xc8\x71\xec\x96\x37\xb6\xb0\xfe\x45\x52\x6d\xb8\xd4\x29\x53\xa6\xf3\xb0\x31\x32\x13\xbc\x8d\x40\xe3\x90\x69\x0b\x1f\xb4\xe5\xdd\xe9\x7b\x89\x99\x67\x89\x3d\x50\x78\x2c\xdb\xc2\x3b\xe4\x57\x87\x0f\x1b\x5e\x33\xf1\x0d\x03\xfc\xdf\xa3\x1b\x75\x3b\xf9\xe0\x0d\x73\xaa\x88\x01\x6b\x35\xf1\x80\xc3\x50\xb8\x83\x0a\xd0\x0d\xd9\x7d\x80\xeb\x31\x1a\x6e\x0b\xc3\x5b\x17\xda\x77\x32\xc2\x0e\x21\x39\xc9\x4b\x0f\x54\x7a\x46\x49\xe6\x9a\xa7\x35\xa8\x17\x23\xd4\xe0\x7e\x55\x32\x1f\xfb\x43\xb8\x52\xbf\x5d\xef\x54\xd0\x81\x4a\x65\x3c\x16\x0c\x84\x8b\xa9\x54\x01\x50\x15\xfa\x86\xec\xb1\xd9\xe7\xaf\x25\xf4\x57\x92\x8a\x88\xd1\x3d\x38\x95\xad\xd8\x3f\x50\xc5\x03\xe1\xb7\x70\x71\x18\xca\x17\xb9\x31\x22\x56\x36\x2f\xd0\x12\x82\x4e\x86\x6f\x40\x81\x1a\x60\x47\x75\x2a\x3e\x9e\xa1\xaa\xf8\xf1\xde\x95\x1a\xdc\x31\x24\x46\x8b\x5d\x3a\xc0\x27\xa8\xc6\x59\x6b\x8f\x02\xd8\x98\xe1\xf7\x3f\xe7\x4e\xd9\x61\x5f\x58\x68\x9d\x69\x06\xea\xad\x56\x50\x40\x7c\x97\x29\xca\x9a\x80\xaf\xe4\x99\xa9\x22\x56\x4f\x90\x1f\xeb\xf6\xb9\x41\x19\xad\xb3\xe5\x7e\xbe\xbb\x96\xef\x23\x41\x43\xa0\x9a\x08\x61\x85\x79\x0c\x98\xb6\xbc\xcd\xef\x5e\x8c\xf6\x08\x36\x03\x5b\x16\x4f\x28\x9b\xff\x52\x3f\x40\x0e\x3a\x95\x29\x2f\x5b\xb8\xd1\xe4\xe6\x4d\x75\xa8\x3d\xda\x72\x34\x3c\xf2\xab\x84\xf1\x8c\xd1\x2a\x40\x45\x10\xe4\xcc\x54\xcb\x5f\x17\xc8\xab\x56\x79\xcf\x7d\x5a\x9f\x04\x5e\x2c\x9c\x09\x35\x39\xa2\x01\xfe\x04\x7c\xa2\x02\x74\x01\x9b\xef\xb2\x80\xf7\xd1\x51\x8f\x29\xc3\xd2\x67\x01\x14\x0a\xe0\x3c\xea\xb1\x01\x9f\x7a\x1e\x6e\xdd\x59\x51\xc1\x00\xb7\x09\x3e\xa5\x89\x49\x5b\x5a\xa1\xcb\x2f\xd0\xbe\xe0\xd3\x84\x3b\x9e\x09\x53\x9d\x69\xaf\x22\x75\x6c\x60\x0e\xe7\x34\x6f\xb9\x84\x0f\x35\x9c\x2f\x4f\x85\x7c\x1b\x1b\xeb\xc9\x58\xcb\xf7\x85\x44\x00\xf6\x7c\xbd\x7a\xd9\x1d\xf6\xeb\xc3\xf7\xd9\x7e\xfe\xfd\xe0\xed\xf6\xdb\xd5\x66\xb3\xdc\xba\xe8\xca\x0f\x12\xcf\x25\x7f\x77\xeb\xa7\xc5\x61\xf7\xba\xd9\x38\xe6\x03\xf0\x43\x9f\x6a\x57\x1c\xeb\x95\x04\x1f\x01\xba\x11\x86\x63\x26\xcd\x2f\xd7\x9a\x7f\xc2\xee\xd1\x9f\xea\x7e\xe8\x1b\xf2\xcd\xe6\xdd\x1e\x21\x97\x37\xf7\x1d\x47\x58\x22\xf0\xc3\xc4\x48\x36\xdb\x68\xbc\xbc\xc2\xeb\x6e\x61\xfa\x35\xbb\xed\xda\x8f\xe2\x04\x75\x0d\x57\xf3\xb5\xc9\x2b\x4f\xc9\x89\x4f\x00\x66\xc0\x67\x24\x42\xb9\xd9\xcd\x76\xdc\xe4\x08\x3e\x63\x94\x18\x85\x10\x4c\x78\x4e\x13\x48\x80\x1f\xd3\xd0\xf0\xe3\x1b\xe7\xca\xaa\x1b\xf5\x77\x47\x3f\x89\x13\xac\x66\x5b\x3d\x49\xc7\x0e\xd8\x07\x46\x82\x9f\x80\x88\x5b\xfd\x5e\x83\xd9\x5f\xeb\xb9\xeb\xd1\x74\xc6\xd1\xe7\xcd\xeb\x6b\xdf\xc8\xba\x4c\x8f\x0b\x78\x1f\xbd\x35\xae\x75\x62\x5d\x0d\x9b\x95\xeb\x3a\xaa\xc0\x17\x02\x70\xad\xfe\xf7\x3f\x9e\xfa\xd5\x37\xf0\x65\xc8\x10\x05\x81\x9e\x99\x6b\xbc\xdf\x94\xb0\x9a\xaf\x27\x28\x77\xc1\x57\x21\x4f\x5a\xb2\xef\x0b\x86\x8c\xf9\x0d\xbd\xec\x6a\x95\x3f\x40\xfd\x01\xdd\xb5\x15\x30\x6c\x3a\x7d\x7d\x79\x5c\x3f\xaf\xff\x76\xae\xc4\x07\xcf\x30\xe4\xd4\xfc\x0d\x1c\x95\x7c\xfb\x5e\x21\xa6\xc8\x87\xe1\x3a\x54\xe6\xd7\x69\xf4\x1f\xf8\xda\xd7\x5e\xbf\x17\xe8\xcb\x0c\x21\xf8\x9a\x09\xf4\xb5\xf0\xb1\x0d\x52\x70\x8a\x1b\x16\x7c\x1d\x87\xd8\x36\xf6\x81\x1d\xae\xae\xd5\xda\x1c\x0c\x88\x2f\x15\x73\x5c\x1a\x25\xf0\x69\x34\x33\x04\x24\x61\x58\x1d\x71\xef\xd9\x9d\xef\x85\x0a\x1b\x70\x34\x2f\xe1\x03\xb2\x71\x5b\x22\x04\x1e\x93\x06\xdc\x6b\x00\x59\x23\x9d\x5e\x37\x88\x33\x4c\xf7\x2e\xb6\xf3\xf6\xc2\xc2\x43\x2e\xa9\x9c\x9f\x61\xcf\x7b\x41\x9f\x3b\x0e\x1a\x3b\x1d\xf6\x27\xfe\xe1\x3c\xaf\xa9\xb0\x37\xa0\x51\x20\xa1\xa7\xfb\x30\x60\xc1\x81\xc0\xa7\x01\xf6\x8b\xce\xcb\xdb\xa5\x2e\x2e\x4e\x37\x07\x02\x3f\x21\xc8\xe5\x7d\xe6\x6f\xf0\x54\x1c\xe7\xc8\x0b\xf6\x77\x1d\xae\x69\x7b\x17\x04\x1e\xc3\xce\x95\xda\xa9\xf0\x50\xe2\x25\xee\x07\x03\x2d\xb1\xb0\x9c\x62\x4a\x72\x90\xd9\x0c\xc2\x44\xa2\x3e\x78\xc7\x7c\x3a\xfd\x99\x22\x42\xd1\x56\x20\xdd\x01\x5c\xcf\x7f\xb8\x0b\x44\x01\x41\x90\x70\x8a\xea\xe2\xda\x70\xfa\x4d\x5b\x8b\x20\x0a\x18\x76\x9d\xbf\x1b\x8c\x90\x89\x9b\x6d\x2f\x4e\xda\x87\xd2\x8d\x4e\x8b\x39\x2e\x9f\x39\x64\x75\x2a\xfb\x11\x74\x10\x47\x86\xd0\xec\xdf\x50\x16\x3b\x4b\xbd\x7c\xff\x76\x62\x4e\x4c\xfe\xb7\xd9\xb4\xfa\x02\xf0\xf6\x78\x22\x3c\xf4\x2f\x66\xf9\xad\x3e\xa5\xf9\x71\x66\x71\xbf\xae\x56\xfa\x1f\x7e\x93\xbf\xfb\xaf\xfd\x75\xce\x04\xc2\xd1\xd2\x8e\x55\xab\x13\x57\x84\x80\x27\x26\x3b\xfd\x72\xbc\x76\xab\x83\x4b\x8a\xe8\x28\xbc\xcd\x05\xaf\xf9\x27\x6f\x5c\x10\x4a\xad\xdf\xcd\x65\x9d\xbe\x03\xf2\xa8\x8c\x1e\x5f\x68\x23\xca\xf3\x0d\x72\x5e\x16\x9f\x03\xb4\xbe\xca\xbf\x43\x20\x03\xca\x49\x27\x44\xb5\x4b\x55\x6b\xb7\x03\x99\xc4\x18\xc9\x18\x07\x7b\x5c\x5e\x84\x40\x72\xe6\x45\x6d\x7d\xa3\x71\xe3\x65\x0a\xef\xae\xc8\x01\x81\x52\x09\xea\x1c\x7c\x43\x67\xa1\xeb\xe4\x81\x40\xe9\x04\x33\x3f\x97\xb2\x50\x57\x14\xc8\x69\x2d\x10\x84\x12\x37\xda\x12\xde\x81\x67\xa0\xe6\x8d\x83\xd7\xde\x12\xc4\x0c\x88\xb5\x4f\xff\xbc\xa6\xf2\x6d\x53\x16\xe7\xa2\x27\x70\x05\x01\x88\xc4\xf5\xae\xee\x00\x54\x85\xf0\xa6\x27\x5e\x59\x16\xff\xe1\x23\x80\x62\x49\xe4\x34\x57\xaa\x8d\x85\x87\xb8\x4b\x69\xdf\xb0\x6f\x5a\x05\x48\x05\xd9\x88\x98\x1c\x02\x1d\xc5\xc8\x3a\xb7\x59\xbf\xac\xdb\xd3\x58\x80\xbc\xda\x1a\x85\x47\x9e\xa1\x3e\x15\x6a\xc2\x14\x85\x84\xf8\xd8\xc7\xf3\xe0\x68\x1d\x21\x24\x51\x80\x7d\xf5\x3f\xd3\x3c\x7d\xeb\x5b\xd6\x90\x44\x86\x13\xec\x8c\xb0\xd1\xc6\x5b\x30\xc5\xfa\xae\x26\xe3\x06\x4a\xd3\xd9\x54\x41\x69\xe6\x65\x27\xa8\xdf\x7c\x7e\x9b\x83\xa3\x5d\x2e\xba\x53\xd7\x1f\xe7\x8b\x27\x67\x7e\x48\x40\xf8\x16\xe3\xb7\xcc\x55\x35\x1b\x59\xef\xd0\x13\x80\x22\xa1\xaf\xe7\x33\x3f\x2d\xd2\x9c\xbb\x8c\x5a\x48\x95\x44\x4b\x82\x9d\x3a\x96\x78\xd3\x7d\xb7\xd0\xa7\x44\x75\xf4\x69\x7b\xc3\x8e\xa6\x0b\x2b\x89\x37\x15\x31\x85\x7e\x62\x28\xae\x4c\xdc\xf9\x36\x20\x6d\xe9\xbf\x68\x3f\x21\xe8\xef\x7c\x14\x85\x1a\xa0\x1b\x20\x0c\x48\x84\x75\xf0\x03\xf9\xf5\x94\xd6\x20\x1d\xa7\x74\x7b\xdc\x8b\x11\x64\x58\xa6\xc7\x53\xcd\xc2\xd1\xa3\x06\x21\xc5\x1c\xe5\xfa\x75\x3f\x5f\x3f\x2f\x0f\x08\xde\x75\xa7\x86\xbe\x8e\xc2\x8e\xfa\x6a\xda\x4c\x86\x61\xc8\x8d\xb7\x00\x55\xed\x4c\xab\xad\x27\xf7\x63\x2f\xef\xae\xed\xc5\xc1\xaf\xfa\x7f\xbe\xff\x9f\xfd\x28\x34\x0c\x23\x46\xc3\xce\x66\x2d\x51\x8d\xb6\x8d\x24\xc2\x48\x49\x30\xcc\x8b\x68\xdb\x31\x0b\xd6\x29\x06\x41\x18\x41\x88\x28\x79\x14\xcc\x43\xf2\xdf\x66\xfb\xb8\xaf\x94\xf7\xde\x7c\x04\x46\x64\x08\x5b\x67\x94\x65\x03\x6e\xa9\x9c\xda\xaf\xc0\x42\xd3\xb7\xfb\x3c\xfb\xe3\xb0\xfe\xf9\xb2\xdc\x1e\x1a\x6f\xff\xb0\x5b\xed\xdb\xb7\xc9\xc0\xac\xfc\x0b\xbf\xad\xaf\x43\x4f\xd9\xa3\xf1\x7f\x0d\x3e\x4b\xec\xb5\x20\xbb\x0d\x97\x6f\x8d\xab\x8e\x25\x82\x5e\x92\x23\x1e\x7d\x86\xc4\xa7\x2e\xd5\x85\x34\x82\x1d\xc4\x78\x94\x14\x09\x93\x88\x63\x99\xfc\x5c\xbc\xc3\x1c\xd2\x6c\x0c\xf2\x80\x30\x81\x90\x91\x36\x34\x5c\xe3\x6b\x6c\xec\x8b\x3c\xf1\x34\xa7\x5f\xa5\x23\xc2\x44\x9b\x3a\x97\xc9\x49\x39\x6e\xda\xe1\x18\x2e\x63\x2c\x0e\x95\xc5\x48\x08\x06\x42\x0e\x66\xd7\xb1\x7d\xb6\x77\xad\x59\x10\x0a\x12\x61\x2f\x13\xb6\x31\xe1\xd7\xdf\x40\xb9\x6c\x43\xeb\x50\x81\xc4\x42\xf3\x9f\xbc\x58\x5c\xdb\x55\x00\xd2\xf4\xff\x19\xa8\xd7\x02\x10\x28\x95\xcb\xb4\x35\xcc\xa1\xf6\x59\x68\xab\x44\xb8\x8f\x98\xa2\xba\x0b\x1b\x6c\xc8\xd9\x93\x0f\x77\xa7\x29\x3f\x56\xbd\x32\x1d\x02\x8c\x2e\x59\x5f\x83\xa0\x9b\x4d\x11\x49\x38\xe6\xa3\x1e\xaf\x99\x4e\xb3\xac\x31\x82\x46\xbb\x76\xba\xb3\x1b\x22\x22\x35\xb6\x39\x36\x96\x58\xfd\x4c\xf3\x4d\x51\x64\x83\x8c\x6a\x44\x23\xa2\x6d\x62\xc5\x30\x92\xbf\xc0\x87\xf1\x22\x78\x5a\xb6\x83\x62\x8a\x38\x9a\xdd\x7c\x61\x00\x79\x5e\x7b\x44\x2a\x2e\x5c\x5f\x63\xb3\x75\x58\xad\x37\x77\x58\x01\x22\x39\xf4\x35\x57\x8f\x3c\xcd\xda\xbd\x31\xf2\x89\x17\xda\xea\xc8\x1c\x4a\x43\xcb\xd5\x17\xb0\x6b\x46\x44\x41\xd2\xa7\x93\x1c\x29\x20\xc7\x6e\x5c\x68\x26\xbb\x61\xc2\xda\x5c\xb3\xcc\x31\xda\x9a\x79\x3e\xee\xf6\xfe\x42\x41\x17\x22\x3f\x56\x26\xa3\xd3\xc4\x53\xab\xc7\x9d\xad\xdc\x0c\x07\x05\x44\x07\xb2\xc7\xc6\xe3\xee\x38\x8c\x35\x62\xd6\xce\x37\xcc\xed\x2c\x7f\x5d\xd2\x72\xac\x5b\x05\x51\x14\x46\x0e\xdd\x3d\xe7\x59\x36\xcd\xef\x09\x51\x64\x55\xda\xdb\xc7\x7f\x4b\xf3\xe3\x23\x40\x35\x0e\xa5\xa3\x88\x49\x4b\x18\x8b\x60\xf2\xd7\xed\x6a\x7c\x29\x29\xb1\x22\xb0\x2f\xb9\x84\x7d\x31\x8d\xb7\x98\xb4\xce\x51\xa4\x23\x83\x63\x45\x65\xa8\x5e\xe3\x2a\x44\x2c\x32\x02\x83\xe6\x06\x7f\x14\x75\x9a\x1f\x07\x8d\x2b\xd3\xdb\x67\xc4\x44\x4c\x6c\x23\xa8\x3f\xbe\x8b\xfb\x0a\x71\x14\x13\x40\xa0\xd1\x7c\xbb\x9c\xed\xd7\xdb\xdd\xc1\x74\x78\x1f\x66\x8b\xc5\x76\xb9\x73\x19\x91\x28\x66\xa1\x27\x5b\x5a\xd6\x1f\x50\x39\xaa\xba\xea\x71\xc4\xc2\x05\x51\x0c\x86\x3c\xa5\xf1\x90\x8a\x34\xfb\x7e\x3d\xab\xfa\xb6\xfc\x25\xe1\x72\x47\xca\x01\x51\x02\x4c\x59\x3e\x87\xf4\x7c\x3d\xbb\x28\xff\xa9\x28\x2e\x77\x4f\x6a\x4f\xe1\x9e\x92\x96\x5a\xf5\x78\xaa\x41\xfd\x40\xba\x7c\xeb\x42\x7e\x72\x4a\x60\x04\xf3\x4a\xa8\x4b\x9e\xd6\x8e\xab\xe3\xd0\x2e\x34\x11\x08\x70\x0d\x91\x43\x76\x51\x88\x44\x4c\x90\x82\xdb\xf2\xe2\x7c\x83\x73\xb5\x33\x7d\x8c\xed\xd9\x20\x10\xeb\x69\x43\x83\x87\xeb\xad\x3d\xa2\x25\xef\x54\x7b\xff\x51\x88\x87\x9b\xe3\x80\x1b\xbd\x08\x19\x18\xc9\x5b\x8c\xb9\xf6\xe7\x22\x87\x9b\x2b\x4a\x46\x92\x07\xd8\x00\x6a\xea\x42\xcb\xb2\x2c\xa6\xe1\xcd\xcd\x48\xc3\xf8\x7d\x84\xba\xf1\x49\x5d\xa8\x5a\xc2\x78\x91\xa9\xd8\x57\xb4\xbd\xb1\xa7\x82\xe7\x36\x56\x9e\xd5\x58\xe6\x7b\xb8\x3d\x21\x03\xd5\x68\xae\xab\x84\x9b\xf2\x68\x7f\x92\x4f\x4c\x2b\x88\x39\xa1\xbd\xb4\x70\xd6\x4f\x0b\x0f\x91\x8d\x10\x81\xf2\x11\xc8\x84\xf5\x71\xc3\x8d\x8a\x84\x15\xce\xfa\x47\x9a\x6a\xf4\x1c\x16\x8d\x91\x1f\xfb\x50\x91\x06\x1f\xdd\x3e\x6c\x2c\x7a\xde\xbf\xf6\x92\xbe\x91\xd6\x31\x77\x35\x88\x4e\x0f\x01\x18\x21\x26\x42\x68\x4b\xfc\xbc\xcc\xd3\xfc\x38\xda\x8c\x19\x91\xe6\xc3\x36\xd3\xa2\xb2\xb2\x32\xcd\x96\xed\x0e\x2b\x23\x85\x87\xf9\x48\x84\x38\xf4\x78\x27\x80\x51\x12\x21\x1a\x73\x8b\x8b\x66\x10\x1f\xfc\xd7\x10\xfc\xeb\x4e\xa0\xda\xc5\x16\xab\x0a\xa3\x0e\x7c\xa6\x4f\x74\xcf\x81\xd1\xd0\x27\x16\xa6\xb9\x6d\x6c\xd6\xd7\xa6\x81\xf9\x84\x3b\x50\x81\x79\xc1\x08\xd0\x9b\x72\xb2\x99\xef\xeb\xd0\xfa\x2b\x73\x7e\x19\xac\x07\x16\xf8\x1a\xdf\xe9\xe5\x9a\xbf\xdd\xf5\xfe\x00\x0b\x18\xc3\x5a\xc2\xf3\x77\xb3\x99\x61\x9b\xd5\x70\xf6\xb1\x90\x86\x58\x16\x71\x6a\x7b\xb8\x9f\xf7\xf0\x4d\x2c\x0c\x00\xf5\x05\x14\xbf\x55\xfd\xfe\x45\x60\x91\xc7\x59\x5b\xff\x5e\xc0\xfb\xd4\x16\xc2\x22\x1e\x23\x0a\xef\xbd\x99\x4c\x06\xda\x05\xbd\x38\x8f\x45\x5a\xe0\x16\x63\x28\xcb\x47\x48\x6a\x3b\x86\x25\x86\x2c\x61\xb6\xf8\xb1\xda\xad\xfb\x84\xc5\xc0\x98\x0a\x90\xb0\xd0\xa4\x71\x9e\x1b\xe3\xc3\xd3\xbc\xea\x4f\x4b\x16\x33\x8e\xcf\x28\x8b\xb2\x04\x59\xaf\xcb\xf4\xd8\x3c\xed\x00\x23\xc6\x62\x30\x4c\x18\xe6\x42\x86\xc7\xaf\xbd\xcb\x84\x03\xf6\xc3\x9b\xad\x17\x7b\x29\xe5\x7d\xb0\x32\xf9\x8f\xbd\x02\x8f\x69\xe0\x64\xa4\x31\x43\xf2\x45\x99\x94\x89\x28\x31\x92\x19\x65\x63\x7b\xef\xd6\xb6\x1b\x25\x7d\x5c\x8b\x5c\xa9\x81\x6e\xdc\xe8\xed\x49\x8f\x11\x3b\x81\xfe\x51\x08\x44\xea\x0d\xaf\x23\x3d\x49\x85\x83\xa9\x98\x45\xb8\x48\x8f\x50\xdd\xc3\x8c\x86\x01\x89\x3b\x9d\x19\x0e\x3c\x8c\x6b\x7a\x50\x08\x7b\x58\x25\xca\x68\xed\x3b\x86\xe6\xc6\xe1\xbd\x96\x9f\x68\xae\x01\x03\x5f\xd0\x41\xa9\xa9\xe8\x3e\x83\xa6\x91\xc5\x5a\x39\x1d\xab\x21\x2c\x64\x64\xce\x62\xc2\xe3\x28\x71\x8a\x34\x3c\xeb\xf2\xef\xab\xbc\xed\x44\x82\x98\xfa\x22\x60\x7d\xb5\x6b\xf5\x70\x2d\xa7\x91\x8f\x10\x53\x88\x23\x5b\x72\x40\xa9\xd9\x91\xb9\x8d\x03\xdf\x48\x91\xcc\x8e\x25\x60\xf0\xfe\x5a\x66\x5b\x87\x3b\x88\x83\x98\x40\x9b\xbb\x7d\x86\x9a\x2b\xde\x35\x53\xf4\x4b\xcc\x83\xf9\x10\x87\x89\x61\xb7\x98\x9f\xa0\xad\xb0\xfc\xb0\xac\x1f\xc3\xd7\x17\x47\x9e\x24\x23\x4a\xb2\x36\xcc\x1c\x8e\x8c\x89\x29\x02\x6e\x4a\x38\xa7\x39\x28\x34\xab\xee\x46\x63\x2f\x70\x8a\xcb\x0a\x0c\x6a\xa9\x3d\x44\x19\xaa\xf4\x7c\x43\xed\xd0\x61\x8d\x2a\x8e\x43\xc3\x6d\xdd\x04\x9e\xcd\x06\x4c\xbb\x03\x02\xbd\x8b\x8f\xa2\x7c\x83\xb2\x71\xcf\xbf\x5f\x45\x7b\x30\x8e\x42\x6e\xd3\xa3\xf6\xf1\x8c\x96\x6b\xcf\x10\xc5\x31\x67\x42\xf5\x24\x34\xba\x2a\x4f\x1c\x8b\x00\x23\xb5\xba\x65\x63\x2f\xe4\xdb\x13\xe8\xee\x9e\x55\x88\xce\xff\xff\x5d\xd5\x11\x1e\xf9\x9b\x99\x37\xb3\xbc\x6b\xcf\x99\x34\xeb\x71\x92\x98\x14\x7a\x07\x61\x99\xaa\x53\xc7\x89\x0a\xb1\xd4\x6d\x53\xcc\x13\x1a\x96\x3d\x34\x4f\xcc\xfd\xc0\x79\xa9\xf8\xdb\xcd\x4e\x75\xad\x5a\x35\xfa\x76\xcb\x8c\xb9\xaf\xf0\x4d\xef\xa0\xbc\x34\x93\xb6\xda\x5e\x11\x45\xe6\x9e\x8a\x47\x0a\x2b\x93\x56\x9f\xa0\xd9\xb3\xa7\x1a\x28\x21\xe6\x22\xc2\x56\xc0\x59\x29\xd2\xba\xe4\x47\x10\x6d\x1e\x3c\xe6\x92\x60\xe6\x58\xc1\x3b\x64\xc5\x05\xca\xea\x2e\xd3\x14\x73\xa5\x2c\xf1\x76\xfd\xdc\x58\x57\x3e\x6a\xb8\x83\x58\x30\x89\x20\x9d\xfc\x7a\x96\x3c\x6b\x73\x3d\xb1\xa4\x86\x58\xf9\xc8\xcf\x30\xba\x7b\x19\x32\xb0\xc8\x68\x3b\x89\xf6\x45\xf3\xd3\x1f\x6e\xbe\xa2\xa5\xe8\xdd\x85\xf2\x89\xe9\xe3\xe1\x97\xb4\xe6\xd9\x1e\xe4\xa9\xa5\xfa\xfd\x1a\x43\x11\xab\x98\xe2\x6d\x54\x1f\xfc\x72\x4f\x3c\x03\xb1\xe2\x8a\x05\xd6\x2b\x4d\xe1\xdd\x31\xbc\xba\xc9\x7d\x87\xc8\x8a\x95\x68\x99\x44\x1c\xb3\x3f\x77\xa4\xda\x10\x2b\xe9\x61\xa0\x62\x62\xc4\x1d\x18\x32\xab\x2f\x8b\x7e\x9d\x85\x51\xca\x34\x66\x3c\x5d\x7f\xb5\xdf\xab\xbf\x9d\xc5\x0a\x4c\xa3\x05\x92\x20\xf0\x52\x59\xb5\x8f\xaf\xaf\x0a\x7e\x82\x49\xb7\x7f\x6e\xbf\x7d\xb5\xf5\xc4\x9a\x79\x28\xaf\x7a\xe9\xa5\x5e\x26\xc7\xc5\x2a\x4a\xdc\x0b\xb0\xed\x32\xf3\x7b\x30\x45\x42\x08\xc5\x9d\x93\x2b\x85\x6f\xe8\x13\xad\x86\x49\xb1\xed\x2f\xff\x9b\xbb\x7e\xc4\x74\x4b\x60\x98\x0d\xb1\x44\x09\xe1\x21\xd6\x1a\xe1\xd7\x05\xbf\xc0\x3d\x34\x3c\xf1\x02\x95\xb0\x8e\x45\x03\x33\x8b\x06\x8f\xf5\x57\xf2\x3e\x83\x5f\xa2\x49\x6c\x24\x4e\x66\x7f\x4c\xf6\x67\x4d\xa4\xcc\x12\x9a\xa8\x40\xda\xec\xd1\xea\x61\x3f\xb7\x30\x30\xcc\x8c\x34\xeb\xf8\x73\xa7\x3e\xf1\x29\x65\x86\x11\xf2\x63\xec\xd3\xbb\x11\x89\x42\x1c\x40\xe3\x4f\x3d\x96\xc5\xd9\xb8\xc3\x3d\xe6\xfe\xf8\x7f\x3c\x1a\xff\xef\x7d\x79\xb3\x9b\xe4\x89\xaf\x04\x6a\x8c\xbd\x15\x1d\x61\xca\x80\x8d\x0c\x92\x80\x98\xee\x6a\x13\x1b\x7f\x2f\xee\xee\x23\xa0\x3e\x7e\x82\x53\xf1\xf1\xcc\xf3\xdb\x74\x54\x98\x04\x54\xa3\xfb\x2e\xae\x69\x86\xa5\xa7\xa2\xaa\xbb\x1d\x3a\x09\x18\x4d\x5c\xdb\xe6\xfe\xfb\x70\xcb\x49\x02\x45\x59\x6c\x45\x69\xb7\x70\xb9\xd6\x83\xce\x9f\x69\x83\x90\x84\x9c\x20\x61\xcf\xaa\xb8\x6e\x8b\xa2\x1e\x68\x4e\x4d\x51\x46\xda\xd3\xa2\xc0\xc7\x8c\x38\x8a\xb9\xa0\x32\xe8\xfe\x0b\x54\xd6\xc4\x87\x8b\x02\x03\x30\xc4\x90\x02\x2a\x97\xd4\x9a\x98\x1d\x51\xc8\x11\xb3\xd5\x36\x45\xfc\x04\x78\xcb\x2c\x68\x63\x38\x87\xa3\x58\x48\x07\x83\x48\x15\x54\xf7\xba\xaa\x90\x44\x42\x80\x91\xa2\xb4\x16\xd3\xe9\x07\x57\x4f\x05\x57\x6d\xba\x2a\x89\x94\xe1\x68\x3d\x54\x50\x5b\xae\x80\x09\xa7\x32\x61\xc4\x48\xb3\xed\xe6\x9b\x9d\xd7\xb7\x4e\x09\x23\x4a\x9b\x6d\xba\x4e\x4b\x78\xe6\x7d\x16\x71\x37\x24\xd0\x18\x26\xda\x76\x3b\xc3\xc0\xfc\x08\x08\x70\x1f\xdd\x36\x63\xb1\x49\xad\x73\xf5\xc8\x45\xfb\x1b\xb1\x32\xcd\xfe\xe9\xf1\x54\x27\x64\x74\x4e\xcc\x13\xf4\x20\x75\xcb\xbd\xd1\xf8\x61\xc3\x72\x40\x92\x84\x42\x25\xed\xde\x69\xf3\xaf\xf7\xb9\xb7\xcf\xfe\xbd\xcb\xb6\xb9\xcb\xda\x6e\x90\x26\x4c\xed\xb8\xda\x20\x49\x58\x82\x32\x0b\xe7\x42\xed\x6e\x67\x51\x64\x43\x43\x95\xa8\x10\xd3\x0a\xf3\xf5\xfa\x69\xb1\xfe\xf9\x72\xe8\xf3\x56\x41\xc2\x03\x0f\xaf\xba\x28\xb9\xae\xbb\x3d\xef\x4b\x8b\x9f\x70\xed\x23\x84\xf4\x98\xbe\xc3\x63\x51\xca\xd1\x96\x9d\x08\xcf\x47\xaa\xc6\xb6\xc6\xbd\x80\x2c\x7d\x87\xae\x37\x73\x68\xe1\x44\xe0\x59\xd5\x17\xe4\xf4\x7c\x2c\xca\x6f\x45\x91\xf1\x5e\x8a\x35\x91\xbe\x11\x88\xc4\x3d\x01\x33\x17\x8e\x33\x71\x35\xea\x35\x48\x64\x60\x28\x6d\x2f\x25\x5c\x78\xaa\x5e\xf3\xb4\xc5\x83\x27\x32\xb0\xa8\x3f\x5e\xc3\x1e\x72\x7e\xb7\xa7\xc8\xc4\xc7\x14\x58\x55\xf3\xb7\xbb\xa2\xf4\xe8\x2d\x48\x2d\x50\xb2\x36\xad\xe1\xbc\x45\x0e\x24\xf7\x33\xca\x17\x88\x10\x99\xd5\xc5\x3a\x87\xa9\x98\xec\x7a\x87\xf9\x4c\x20\x88\x8d\xa7\x89\xf1\xb4\x9a\xd2\xfb\x82\x44\x6b\xd3\x10\x67\xe6\x96\xb3\x10\x5b\x68\xae\x84\x61\xa3\xf5\xdd\x47\xeb\x82\x13\xc2\x10\xe5\xa7\x78\x9a\xdd\x90\x95\xb5\xe7\xc3\x72\x12\x46\x46\x36\xe6\x03\xe0\x32\x1d\x9d\x70\xc2\xb8\x6f\x9a\x61\x64\xf1\x0e\xe5\x2e\x3d\x5f\x46\x5d\x12\xf1\xf4\x6c\xe1\x9e\xa7\x2d\x5b\xe9\xf1\x98\x59\xfe\xcc\x67\x5e\xcb\x53\x1b\xaa\x73\xcf\xf2\x14\xcf\x94\x42\xf3\xb5\x2f\x10\x62\xf8\x15\x6f\x05\x70\x2f\x24\xd0\x69\xf4\xb9\xf8\xb2\xf1\xeb\x3f\x17\xb3\x02\xee\x45\xda\x37\x90\xf6\x5b\x9f\xca\x1b\x0f\xc4\x86\x34\xe0\x5a\x35\x6f\x36\xad\x3f\xc9\x4d\x72\x3f\x90\xe0\x3a\x96\x79\x59\xdf\x75\x5f\x02\xf7\x63\x2f\x49\x9c\x12\x67\xe9\xe4\x79\x9d\x42\xd3\x68\xac\x88\xd0\x7d\x5a\xcd\xd7\x87\xa1\x4c\x03\x70\x5f\x9b\xf7\xf2\x0d\xea\x26\x6a\x11\xa9\xdb\x9a\x78\x40\x42\x14\x80\xdd\xf3\x5f\xed\x9f\x6c\x7f\x95\xeb\x2e\xfa\x04\x77\xc3\x03\x1a\x5a\xae\x43\xf9\x36\xba\x97\x20\xf4\xc0\x35\xdf\xf1\xac\xa7\x62\x6a\x77\x29\x1e\x7a\x31\xc2\x08\x53\x59\x60\x3a\x67\x13\xb8\x5f\x0f\xa9\x87\x56\xef\xf0\x5e\xd4\x30\xfb\x14\xa5\x37\xe9\xe3\xf0\x28\x36\x44\x51\x39\x7c\x18\xb3\x3e\x2f\x2e\x6e\x0f\xe2\x51\x62\x54\xba\x10\xc3\xe1\xda\x8c\xd6\xf9\x03\x9c\x78\xa6\xd7\x7a\x0b\x12\x71\xea\x9f\xba\x45\x13\x4c\x7f\xc0\x23\xdb\x98\x61\x7a\x87\xfa\x5a\xf4\xc0\x23\xc5\x22\x65\x23\xcd\x6f\xbd\x5e\xd9\xb6\x0d\xad\x77\x19\x25\x7c\xe9\x2e\xf3\xd5\x22\x9f\xb6\x21\x3c\xd2\xc6\xa8\x77\x08\x90\x7d\x71\x79\xbd\xdc\xcb\xc7\x02\x67\x24\x0a\x44\xaf\x65\xa6\x28\x5b\x2d\xa3\xcf\x60\x1a\xee\xbe\xbf\x2e\xc9\x8f\x6e\x89\x25\x21\x9a\xda\x26\x62\x3e\x18\x80\x97\x7b\x31\x31\x68\xe0\x1d\xd0\xa3\x15\xf8\x04\x9e\xd0\x58\xb9\x72\x00\x6e\x42\xdf\x3b\x88\x31\x4f\x22\x43\xd9\x66\x6b\xb7\xc8\xdc\xf1\xc4\xab\x7a\xc3\x53\x35\x6b\x2f\xce\x89\x46\x24\xc8\x7c\xde\x6f\xc5\xe0\x42\x50\xdd\xb2\xfd\xe4\x50\xde\xba\xda\xcd\x97\x6f\x56\x48\x13\x45\x1c\x0e\x5c\x14\x65\xfd\x78\xad\xda\xb5\x23\xe3\x48\x05\xad\x62\x14\x1a\x51\x2e\xef\xcb\x16\x5c\x4a\x53\xa3\xba\x94\xe9\x7b\x9a\xc1\xf1\x73\xca\x8d\xd1\x6f\x4b\x65\xa4\x26\x90\xc6\x7f\xc3\xaf\x15\x18\xba\xb1\xd6\x05\xe3\x4a\x9a\xa6\x09\x9c\x37\x3b\xa8\xef\x85\x48\xbf\x24\xb5\x00\xae\x14\x57\xb4\xe5\xd8\x99\x84\xc9\x73\x05\x06\xce\x57\x42\x55\x64\xef\x70\x40\x80\xca\xe1\xd4\xcb\x2d\xd9\x81\x40\xe2\xc0\xee\xae\xb8\xe9\x5e\x3b\xbe\x7a\xb7\xf0\x41\xf7\x6e\xb8\xdf\xbf\xd8\x71\xac\x03\xd7\x02\x4c\xb3\xbd\x81\x5f\x00\x3f\x4f\x13\x75\x98\xe1\x82\x44\x46\x62\x12\xe5\x02\xf3\x87\xeb\xcd\xec\x0d\xbf\xb9\xc3\x89\x44\xfb\x0e\xf5\x49\x0c\x3b\xbb\xed\x00\x2f\x0c\x8c\x08\x99\x95\x23\x49\x47\x66\x58\x78\x60\xb0\x1d\x1a\xe4\xe9\x47\x51\xc3\x33\x4f\x11\x0f\xf2\x60\xba\xd6\x47\xa3\xa9\x97\x18\x65\xf9\x42\xd7\x92\x5f\xb6\xc0\x65\x67\x8a\x05\xa5\x4c\xc2\x80\x63\xb9\xf1\x9a\xdb\xa3\x21\x60\x41\xb2\x2f\x68\xb2\xce\xc7\x37\x4c\x23\x86\x49\xc6\xf9\xaf\x97\xfa\x3e\x55\x20\x28\x67\x81\x61\x31\x78\xe6\xa8\x1e\xd0\x5e\x5d\x13\x6c\x64\xba\xf0\xdb\xee\xc4\x4b\x38\xd9\x0a\xc5\xf0\xfe\x7d\x12\x72\x3e\x22\x72\x5b\xe5\xc3\x2a\x8b\x08\x18\x20\xd2\x3b\x4b\xf3\xb7\x3d\x42\x06\xfb\x6a\x0a\x43\x97\x53\x84\x5e\xc2\x6c\xc1\xec\x11\x35\x80\x7b\x7e\xa7\x08\x63\x6a\xa5\xec\xab\x7a\x51\xc8\x6b\xe3\x09\xb7\x08\xbb\x9e\x13\xdb\x4e\x7a\x11\x72\x85\x89\xea\x66\x1a\x62\x4a\xc9\xcc\x93\xf6\x82\x02\x90\x84\xd3\xde\x8b\x53\xcb\x6a\x73\xb4\x22\x04\x81\xd4\x35\x8f\xa9\x3a\x2e\xf7\xdf\x77\x97\x7e\x9d\x5c\x44\x5a\xe3\x93\x59\x53\xfa\xcf\x6b\x51\x5e\xcf\x43\x9c\xba\x60\x51\x62\x1a\x5e\x4c\x3c\xdc\x84\xec\x2d\x41\x24\x08\x26\x02\xec\x85\xbb\xe6\x0a\x4a\x55\x1c\xef\x7b\x95\x04\x93\x86\x95\xf6\xd0\xc4\x8b\xf5\xa9\x0f\x7d\x11\x71\x68\xe8\xef\x76\x35\xcf\xd2\x5c\x76\x58\x45\x11\x47\x06\x9a\xd2\xb8\xee\x59\xb6\xe1\xf2\x8d\x77\x8f\x9d\x78\xc6\xb5\x55\x45\xce\xeb\xc6\xf9\x75\x49\xaa\xef\xc0\xb3\x16\x54\x21\x38\x15\x9e\xdf\x03\x37\x8f\xe6\x0e\x8f\x8c\x46\xde\x6a\xbe\x36\xf2\x5e\x37\x4b\xba\xe8\xce\x17\x91\xc2\x2e\x61\xa4\xb9\x1a\x12\xf7\xc6\x6e\x08\xc4\x51\xc7\x5d\x8e\x8b\xd1\xd0\xab\xdd\xa7\x78\x85\xd0\x0a\xf3\xaa\x5c\xa9\x55\x0d\xe7\x0e\xa3\xfb\xff\x0d\x0a\x29\x24\xe1\xda\x29\x44\xcb\x53\xfb\x72\x64\x44\xb1\xc2\x30\x7f\xdd\x6e\x97\x2f\xbb\xe5\xf2\xeb\x6c\x9c\x90\xb1\x6c\x99\xd0\xdd\x8d\x8f\x7e\x48\x47\x98\xea\x3b\x88\x11\x07\xaa\x3d\xae\x12\xc5\x2c\x32\x6d\x76\x49\x1d\xa9\x8c\xbb\xd8\x64\x12\x54\x28\x2e\x3d\xda\x52\x34\x6d\x10\x90\x58\x37\x61\xfb\x7c\xcc\xa0\x08\x02\x68\x92\x18\x66\xc3\x77\xc8\xeb\x6b\x89\xa1\xe9\x50\xbd\x06\x84\xf6\x88\xe9\x97\xae\x8b\x12\x06\xbd\x9b\xc3\x1f\xd6\x21\xc5\xdc\xe8\xa6\x2c\x0a\xbd\xd6\xbb\x13\xc0\xc5\x6a\xcc\x82\x24\x1e\x35\xf4\x22\x3c\x83\x7e\x57\xa7\x24\xbe\x66\x9d\xb4\xef\xbc\xbc\xa9\xf2\x47\x0a\x1f\x83\xb8\x51\x92\x50\xe3\x7c\x5b\xbe\x6e\x7f\x2e\x57\xed\xa9\x51\x62\x58\x06\x81\x9f\xd7\x39\x2c\xd2\xf7\xea\x35\x97\xb6\x7e\xe9\xc6\x48\x23\xbc\x7a\x48\xab\x4f\x54\xf9\x40\x52\x9f\xa2\xfb\x7a\xe4\x55\xbf\x61\x5a\x52\x3f\xc2\x12\x7d\x9b\x9a\xd8\xf3\xea\x6d\x8a\x16\xbf\x19\x0a\xd8\x11\xb0\xde\xec\x07\x8d\xef\x92\x86\x9c\x44\x6e\x91\x7f\x42\xa8\x3d\x70\x3f\x25\x85\x04\x23\x39\x51\xd4\xa7\xef\xfc\x1d\x66\xb5\xad\x01\xdd\x37\x06\xf6\xed\xa3\xf4\xa9\x4e\xda\xf6\xe4\x0b\x9f\xec\xf9\x92\x7e\x1c\xe1\xa3\xce\xae\x75\x81\x1a\x9a\x78\xb3\x73\x9e\x3b\x7e\x1b\x90\x3e\xd7\xd4\x66\x32\xf7\xe5\xb5\xaa\x41\x61\x3d\x75\x64\x96\xed\xe0\x80\x68\x44\x86\x7e\x9b\x3d\x2f\x0f\x9b\xf5\xfa\xe9\xb0\x7a\x59\xed\xdd\xa5\x02\x99\x84\x9e\xab\x9c\xba\x98\x68\x3a\x10\x90\x01\x84\xd8\xe2\x24\x79\x96\x2d\xb7\x73\x2f\x0a\xad\xcd\xad\x90\xd8\x43\xf3\x5e\x33\x1d\xde\x81\xad\xcb\xc9\x90\xfa\x89\x5b\x23\xef\xbc\xe6\xe5\x70\xea\x44\xd4\x74\x2f\xf2\xaa\x82\xb2\x5e\xfe\x8b\xc6\x56\x69\xda\xee\x0a\x96\x20\x05\x64\xa4\x02\x1e\xb5\x0e\xc0\x84\xd3\x2b\x19\x0b\x7c\xd5\xb6\xe1\xfc\x1f\xc8\xda\x6a\xb5\xd5\xcb\xbc\x2e\x6f\xb3\xaf\xdb\x5d\xba\xeb\xc4\x01\xb3\xb4\x7a\x47\x9e\xa7\xff\x86\x32\x72\x2f\x2c\x49\x94\x72\x5d\xdd\xdf\x90\x49\x4a\xec\xea\x56\xb6\x0e\x64\x22\x3c\xc4\x3b\x22\x92\x71\x77\x39\x41\x77\x88\x13\x8f\xc1\x20\x6f\xf1\x67\x51\x88\x7e\xde\x42\xf2\x80\x63\x32\xe2\xf5\x77\xd3\x73\xd2\x5b\x10\x93\x59\x1e\xc9\x23\x9e\x40\x6b\x83\xb7\x20\x8b\x52\xf5\x0b\xab\xc3\x89\x2b\x12\x26\xd5\x58\x99\xf9\xe5\x7a\x5e\x5f\x6b\x59\x9c\x87\x9d\xc1\x52\x88\x10\xf3\xe5\xaf\xb3\xcd\x5f\x26\x7a\xa6\xcd\xab\x94\x09\x57\x49\x27\x65\xc0\x0d\x7e\x6e\xe4\x88\x48\xe5\x79\xd4\xa9\x51\xb6\x2d\xfd\x4f\x08\x3f\x77\x23\x98\xc0\x24\xb3\xc9\x0e\xdd\xb1\x92\x81\x84\x30\xc1\x1d\x13\x72\xc3\xd4\x3b\x8a\x68\x86\x77\x05\x4c\xa1\xdb\xa9\x8a\x3e\xc2\x7f\x34\x03\x40\x11\xea\x42\xf2\xea\xf8\x8d\x57\xc8\xe4\xe7\x6e\x48\x27\x1a\xf7\xf5\xd3\xed\xe2\xde\x97\x22\x22\x51\x6c\xa8\xc5\xfc\xdb\x17\x79\x0e\x45\x63\xc0\x99\x84\x46\x7b\xfa\x2e\x14\x55\x31\x96\xac\x8f\x29\xcf\xeb\xc7\x3f\x8b\xeb\xf4\xd2\x54\x54\x9b\xc6\x62\xcb\x40\x76\xe8\x4c\xb0\xf2\x7d\x1f\x9d\x75\x55\x5d\xba\x3f\x09\x4c\x62\x7f\xaa\x31\xfa\xf7\x42\x3f\xe5\x07\x7e\xd2\x76\x62\x3f\x19\x2f\x2d\x97\xe9\xa5\x05\x41\x29\x5f\x07\x86\xed\x02\x72\x55\x0d\x15\x8d\x40\x35\x96\xc9\x68\xb5\x23\xbe\xe7\xeb\x6e\x27\x77\x8e\x0f\x82\x0c\x8b\x3d\x98\xfa\x19\x8d\x52\x04\xdb\xe2\x55\xb3\x57\x42\x63\x9c\xbe\x61\xdb\xd1\x35\xab\x87\x31\x9b\x0a\x3d\x85\x8f\x60\xef\xe1\xe1\x7a\x1b\x72\xfc\x0e\x66\x8e\x0a\x43\x10\xb6\xde\x65\xa8\x0e\xeb\x31\xc5\x70\xec\x46\x32\x86\x6b\xfd\xe1\x7a\xfb\xbe\xde\xee\x96\x75\x1f\x89\xa0\x42\x1d\xc7\x7d\xb1\xa4\x6f\xfb\xd9\xe8\x09\xa2\x50\x71\xb0\x2f\xae\x0f\xd1\x54\x91\x32\x0b\xfe\x68\x6e\xe1\x3e\x99\xa4\x22\xf0\x70\xbb\xb6\xf9\xe4\x6b\xd9\xac\x08\x64\xb4\x6c\x1c\xd4\xc6\xc6\x2f\x7a\xd2\xd6\xd3\x21\xa9\x62\x2c\xc2\xde\xa6\x1e\x2d\xc0\x27\xef\x84\x49\x82\x1b\x7f\xe3\x1b\x1c\xce\x45\x5e\xf5\x5c\x70\x15\x07\x14\xdb\x31\xf6\xeb\xd7\xed\xcb\xec\x79\xf9\xb2\x3f\x3c\xcc\xf6\x7b\xc7\x91\x07\x2a\x4e\x34\xb2\xa5\x9b\xf6\x4d\x2c\xee\x4f\x7f\xf8\x24\x32\xb4\xf9\x68\x57\xe1\x7a\xde\x97\xfc\x1d\xb2\x7b\xc3\x34\x7d\x93\x89\xf4\x70\x07\xea\x11\x3e\x57\x6f\x9f\x65\xbc\x54\xa2\x15\x16\x3c\xf8\x7b\xb3\xf0\x87\xae\x88\x12\x14\x62\xc7\x56\xe7\xa4\xdb\x66\xb9\x32\xb1\xc9\x27\x50\x12\x25\x02\xa9\x1d\x32\x65\x7f\x2a\x8b\x8f\x2d\xa0\x03\xf7\xc4\x9b\xbf\x38\x36\x90\x45\x01\x55\x5e\xa3\x47\xd1\x32\xaa\xb9\x63\xed\x2b\x15\x09\x17\x46\xab\xb3\x96\x27\xeb\xea\xec\xef\x58\x31\xee\x0b\x3e\x4a\x08\x8e\x9c\x5c\xf9\xf5\xfc\x58\xb6\x88\x05\x25\x94\x87\x74\x0a\x27\x5e\xf5\x92\x30\x4a\x80\xc0\xcc\xb6\x91\x74\x31\x45\x78\x8b\x74\x6b\xa3\xc5\x67\x3e\x7e\x4e\xc9\x04\x67\x8e\x6d\xdf\x18\x42\x47\x1a\xd1\x52\x79\x8f\x5f\x28\x50\x0f\xfd\x2f\xc3\x80\xf1\x09\xda\x45\x41\x94\x44\xc8\x8c\x62\x80\xc6\x9b\xb2\x90\x50\x55\x63\x9c\xa9\xd2\x9e\x94\xc1\x10\x41\xc4\xb3\xc7\xe2\xaf\xe8\xb5\xcd\xd9\x40\x02\x42\x6c\x8b\x61\x5f\xfd\xce\xfb\xe8\x42\x77\xf0\xe2\x00\x8b\x15\xbf\xe7\xc5\x47\x6e\x00\x5c\x8b\xf4\x98\xd6\x3c\x33\xb0\x95\xc1\xfd\x80\x17\x87\x88\x4c\xeb\x63\x1e\x27\x85\x6a\x01\x68\x64\x98\x82\xcf\xfc\xd7\xe3\x35\x57\x3d\x2d\x34\x00\x0a\x3e\x72\xdb\xcf\x33\xe0\xb9\xcd\x27\x6c\x8b\xe2\x3c\xcb\x95\xe9\x1e\x1a\x5d\x0a\x54\xa8\x9c\x61\xb6\x71\xaf\x9b\x40\xe0\x7b\xa6\xfb\xc3\x49\x3a\xde\x67\x16\xc0\x57\x46\x97\xd6\x68\x54\x34\xf6\xa3\x09\xda\x36\x9f\xaa\x53\x01\x04\x22\x40\xda\x56\xeb\x56\x20\xec\xa5\x6f\xb7\x20\x54\x11\x8b\x9c\x67\x76\xb6\x5c\x21\xf6\x58\xe4\x05\x71\xd7\xac\xfb\x70\xbd\xa5\x23\x00\x37\x44\xbe\x46\xd2\xe5\xe7\x34\x87\xc6\x3b\xe8\x3b\xf0\x10\x05\x7e\x10\x9a\xcd\xff\x99\xa7\x79\x2f\x13\x02\x11\x8b\xd1\x8c\x1e\x44\x1f\x47\x35\xfd\xf1\x59\x60\x72\xb3\x7b\xa8\xea\xd0\x5d\x80\xc5\x34\x72\xda\x7a\xf8\xa6\x41\xdd\xab\x64\x35\xc3\xb8\x6d\x9c\x6c\xbb\x09\x46\x03\x38\x89\xfc\x9e\x7a\x7d\x55\x0f\xa8\x07\x3f\x63\xd1\xea\x39\xf2\x10\x93\x08\x23\xcd\xb6\xce\x6e\xd9\xfc\xb1\x40\xef\xc6\x04\x02\xad\xe4\x6e\xb1\x38\x2c\x4b\x49\xa9\x3f\x78\x53\x71\xec\x13\xaf\xd3\x58\x9c\xa8\x18\x01\x0f\x62\xda\x98\x97\x7f\x3e\xb8\x18\x01\x44\x18\x62\xa5\xf8\x52\x64\xd9\xc3\xb5\xcc\xe7\xc5\xf9\x92\x41\xcb\x8b\x0a\x20\x6c\xad\xa7\x02\x83\x94\xe9\x21\x91\xbb\x74\x0e\x08\x1e\xa2\x2f\x53\x9d\x8a\xb2\xc6\xbe\xe9\x5b\x7b\x01\xae\x70\x53\xfb\x47\x5a\x43\x4f\x1b\xfd\xd3\xe2\x17\x08\xc1\xf0\x96\xb0\x55\x91\xd7\xf0\xdf\x45\x0e\xbf\x59\x6e\xb0\xff\x72\xff\xe2\x79\xdd\xbf\xf6\x54\x49\x3d\xd3\x5a\xca\xaf\x59\xfd\xa5\x14\x57\x33\x56\x61\xfe\xc7\x6a\xa4\x8f\x4a\x87\x20\x7d\xd5\x4a\x89\x4b\x54\x06\x44\xbd\x85\x01\xea\x10\xa4\x30\x8c\x49\x47\xa8\x17\xc5\xb9\x89\xe7\x6e\x17\x38\x75\x96\x16\xa4\x8e\xb1\xe9\x7a\x07\xf5\xa6\x94\x79\xbd\x1d\x2b\xa4\x03\x28\x69\x32\x97\xe8\x45\x98\x22\xb5\xcd\x85\x0d\xd7\x2d\x50\xc5\x9d\xd8\xbc\xc1\xc0\x7e\xc5\xac\x00\x4d\x48\xe2\xf7\x11\xb7\x3d\x98\x1c\x68\xe2\x63\x90\x79\xc9\x38\xd2\x19\xad\xd5\xc8\xd1\x00\x4d\x25\x4e\x36\x6d\x2d\xfc\xfe\xa3\x68\x4f\x66\x1c\x31\x1f\xf8\xbe\xf6\xc5\x10\xb1\xe6\xc6\x24\xc4\x10\x6c\xd6\xbc\xac\x2d\x41\x87\xa5\x05\x30\x23\x34\xe1\x21\x2a\x69\x54\x28\xcf\xba\xef\xf3\x7a\x4f\x3f\x91\x26\x32\x46\xe9\x88\x1d\xd4\x0b\x5e\x8f\xf9\x7a\xdc\x20\xed\xbb\x94\xcd\xf7\xe2\x3c\x7a\x87\xda\x8b\x3d\x6e\x7b\x45\xb6\xbc\x4c\xeb\x9b\x5d\xd1\xa9\x5d\x2a\xb1\x1b\xc7\x3d\xa4\x36\x75\x68\xd2\x6a\xeb\x14\x7a\xdc\xed\x7b\xda\x90\xab\x64\x57\xf9\x76\x5b\xe7\xa3\x8f\xaa\x29\x23\x88\x6f\x6a\x1c\xd4\x92\xf7\xd7\xa9\xf6\x7d\x11\x3b\x7d\xe1\x5c\x17\xfe\xb4\xeb\xa5\x7d\xcb\x00\xa3\xd3\x5f\xae\xeb\xe9\x4e\xa9\xa7\x5b\x80\xda\x07\x23\xf7\x61\xc1\x0e\x83\x66\xe0\xeb\x3d\xe8\x46\x07\x10\x2b\xe1\xf0\xde\x99\x1c\xdc\x61\xe4\x11\xd4\x63\x6d\xf5\x47\x46\x6f\x91\x51\x8e\xc9\xe5\x07\x5e\xd7\x99\x63\xd1\xfc\xc4\xfe\x0e\x50\x55\x6d\xd1\xcc\x1b\x46\x1d\x43\x32\x6c\xd0\x2c\xf1\x10\x6d\xfd\xf3\x96\xed\xd2\xaa\x1e\x65\xc4\x74\x2c\x23\xec\xc2\xe2\x4a\x35\x6f\xf0\xc9\xa9\x8e\xe3\xe5\xff\x0e\x8e\x4a\xc7\x2a\x8a\x0c\x7a\x24\x2f\xae\xb9\x04\xac\xcb\x38\x43\xab\x93\x30\x46\xb9\x25\x1b\xec\x15\xd7\x52\xc2\x74\x00\xe3\x4e\x88\x05\xca\xb7\xba\x17\x36\x61\x7b\x75\x22\x24\xc6\x9c\x97\x13\xaf\xc0\x5f\x1a\x79\x8c\xf6\x91\x12\xf0\x70\x9b\xfb\x80\x74\xfc\x95\xed\x08\x4e\x22\xfc\x8d\xdd\x66\xb3\x83\x32\x85\xea\xe1\xaf\x4d\xa9\xe6\x11\x4d\x54\x2f\x2b\x01\x6d\x99\x5d\xf3\xc8\xf4\x06\x6c\x66\x7f\xae\x5f\xf7\x87\xcd\x7c\xdf\x1e\x11\x31\x76\xc5\x15\xef\x50\x66\x88\xda\x19\xb6\x1c\xbb\x61\xda\xc3\xce\x10\x95\x56\xcd\xae\x3d\xbb\xd6\xc5\x0e\x30\x9b\x61\x07\x08\x11\x11\x9b\x16\x5e\xbf\x7c\x1b\x41\x5a\x87\xf7\x29\x54\x84\xdd\x92\xb2\x30\x65\xb2\x5e\x1a\x50\x2b\x8f\xe3\xd7\xd8\xce\xf6\xcb\xc3\xf2\x8f\xcd\xfa\x65\xf9\xd2\xde\xab\x0a\x13\x44\x54\x36\xf1\x27\x28\xc3\xdc\x0e\xe8\xea\x7e\x56\x3a\xfb\x32\xea\xd5\xe0\x27\xdc\x77\xcc\xfd\xb2\xbc\x5d\x6a\x50\xbf\xc3\xed\xb1\x2c\xce\x23\x6a\x89\xf1\x89\x9a\x18\xae\x23\xa8\x31\xbb\xb1\xcc\xd5\x62\x02\xe5\x63\x47\xeb\x24\xc2\x57\x5c\xa2\xba\xe8\xa5\x68\xe7\x81\x16\xd4\xeb\x80\x6e\xf3\x12\x54\x5a\x37\x0e\xe3\xcb\xea\xf9\x71\x36\x6d\xf1\xb4\x08\x31\x61\x59\xd5\xc5\xe5\x80\x7a\xb1\xa3\xdf\x52\x86\xcf\x67\xdf\x38\x84\x9f\x91\x7e\x7c\x9d\xeb\xd1\x1a\x3c\xa3\x94\xd9\x98\x73\xdc\x49\x36\xa7\xae\xd6\xa7\x35\x48\xcc\x6c\xe9\xa2\x6c\xf6\xa5\x39\x9f\x10\xad\xed\x8c\x8f\x26\x84\x1b\x51\xe3\xc5\xf5\x7c\x59\xa4\xef\x76\x4e\x36\x7f\x57\x18\x7e\x65\xbc\xaa\xb1\x21\xaa\x3d\xa0\x0d\x7c\xb2\x4f\x64\xd7\x2b\xd5\xfe\xdd\x72\xc3\xd4\xbe\xa2\x89\x17\x1a\xda\xb2\x99\xf5\x37\xbe\xca\x0f\x6b\xe2\x45\x46\xaf\xe5\x1b\x14\xdf\xe0\x3c\xfc\x18\x9a\x78\x2a\xf1\x6c\xb3\xc4\x77\x50\xc7\xfb\x6b\x0d\x5e\x87\xef\xfe\xb9\x0e\x7b\xad\xfb\x7b\xa9\x26\x94\x30\xd6\x72\xfc\xcd\x8b\x34\x7f\x2a\x5c\x0f\xb5\x26\x94\x72\x19\xb4\x6d\x5d\x77\xa2\x5d\x6e\x54\x60\x64\xf3\x31\x0c\xfb\xc6\xdd\x36\x86\x07\x10\x9c\xb2\xb0\xca\x81\x69\x4b\xb8\xa9\x09\x0d\x39\xf6\xd0\x3d\x17\xd9\x80\x3b\xa0\x39\x22\x91\x4f\xf5\x39\xad\x4f\x65\x9a\x2d\xe0\x5c\xb8\x43\x3e\xf8\x84\x39\xaa\x74\x28\xab\xb6\x6e\x16\xff\x5d\xc4\xed\xc0\xa5\x6b\x2e\x18\x68\x9b\xab\x9b\x67\x29\xb4\x68\xe9\xf1\x9b\x0f\x18\xc1\x4d\x49\x8e\xe8\x82\x34\x09\xb4\xf6\x0d\xae\xc2\x30\x9e\xa2\x1a\xf5\x57\x62\x33\x9a\x84\xc4\xe7\xca\x55\xd4\xcb\xf4\x1d\x36\x28\x15\xba\xe8\x55\x74\xd1\xc8\x0c\x3f\x54\x98\x24\x81\x95\x14\xb3\x97\x7f\xfc\xa4\x6f\x4f\x93\x28\xf2\xb1\xc0\xb9\xe5\x2a\x2d\x3a\x2e\x13\x4d\xa2\x44\x62\xb9\xa7\x71\x96\xf3\xb4\xfd\xce\x91\x56\x08\xda\x3a\xf1\xaa\xed\xf9\xf8\x6d\x78\x49\x96\xb4\x94\x47\x8d\x01\x4d\xf3\xa3\xed\xf4\xb2\xc7\xe3\xc8\x43\x16\x90\x4b\x09\x3b\x34\x97\xcd\x23\xb4\xae\x5b\xfc\x1f\xf1\x9a\xc4\xee\x9a\xa0\xb1\xe3\xe1\xcc\xf3\x2b\xcf\x7a\xbc\x19\x9a\x24\x34\x40\x52\x96\xf2\x9a\xef\x90\x32\xab\x8f\x6f\x1f\xf5\xd0\x68\x92\x44\x86\x1a\x23\xad\x0c\xce\x1c\x83\xcc\x51\xdb\x49\x33\x4a\x33\x43\x38\x60\xd2\x83\xae\x33\x79\xfa\x1d\x73\x2f\x34\x77\x00\xc6\x0d\xc5\x60\xba\x25\x91\x76\x83\x58\xa0\x9a\x4b\x1e\xe2\xc3\xa5\xc8\xae\xf2\xc4\x1b\x0b\x5e\x9d\xb8\x7b\x0e\x2e\x4d\x22\xb4\x99\x80\x9b\xd1\xfd\x88\xd0\xc3\x5c\x9f\xb8\xde\xc6\x6d\xb1\x9a\x48\x65\x5c\xc4\xf3\xc1\x90\xae\xb8\x0b\x4a\xcd\x31\xb2\x58\xbc\xec\xb6\x06\x8d\x51\xba\x43\x8a\x70\xdf\xf6\x84\xca\xea\x91\x97\xe7\xee\x90\x0e\x0c\xc7\xd6\x7a\xb3\x34\x1c\x5d\xbb\x61\xcb\xae\x26\x5a\x4a\x2e\x1c\x17\xd5\x1b\xe4\x7d\xb6\x74\x37\x44\x49\xd4\x99\xde\xf3\xea\x6d\x78\xc8\x23\xc4\x47\x43\x72\x4e\xf3\x65\x55\x03\x9c\xfb\xd4\x5c\xda\x23\x49\x6c\x00\x8e\xe7\x4b\xd6\xd2\xb1\x3d\xef\x9e\xbf\x8c\xbb\xb5\x47\x94\xc7\x6d\x1d\xdf\x35\xc2\x7f\xa6\xb4\xe7\xce\xd0\x4a\xa8\x3e\x7d\x9d\xbb\x03\x8f\x79\x09\x19\xd4\x37\xf6\x50\x96\x7d\x59\xac\xe1\x4f\x7b\x3c\x0e\x4d\xa2\xcf\x56\x1d\x66\x13\x9c\xa4\xda\xa3\x7e\x84\xac\x3f\xcb\xfd\x77\x43\x5f\xe0\xba\x75\xfb\x56\xdf\xf3\x45\x62\xc4\x8f\x54\x5a\xb7\x6d\xd0\xdf\x8b\xeb\xd0\xcb\xd3\x9e\x0f\x04\xa1\x64\xcb\xfa\xf4\xc3\x94\x74\x37\xd9\xf5\xd8\xae\x6e\xcf\x07\x81\x5c\xc7\x26\x87\x72\xe2\x69\xfe\xdf\x77\x7e\xdc\xe0\x87\x03\xca\x30\x57\x9b\xca\x62\xcc\xc4\xaf\xbd\x80\x69\xac\x0c\xf4\xb9\x18\xbb\x35\xf3\x45\x43\x83\xf6\x02\x25\x23\xea\x0a\x14\x08\x73\x1c\x1a\x33\x2f\xa4\x11\x33\x0a\xf0\xbf\x0e\xfa\x8a\xee\xea\xb7\xc2\x25\xff\xb5\x17\xc6\x01\xd3\x16\x02\x5a\xa2\x1b\xfe\x15\xb5\xa3\xf6\xc2\xc4\x72\xe7\x63\x9e\xa5\x3c\xd4\xbd\xfd\xc4\x8b\xb8\x69\x35\xd9\x6c\x57\xf3\xe5\xe1\x79\xf5\xe2\x0e\x30\x1e\x22\x0e\x2c\xcb\x0f\x3a\xfd\x05\xca\x3f\x64\xf9\x5d\x0b\x8a\x1d\x1b\x7b\xbe\x91\x4e\x46\x63\xd3\xf8\x20\x1d\x7b\xb4\xf6\x62\xdf\x48\x9d\xaf\xbe\x3f\x4e\x5b\x0b\x2f\x56\x3e\x76\xbf\x61\x2f\x9a\x32\x37\x78\x48\xab\x43\x05\xd0\x02\xd7\xb5\xc7\x43\xc1\xba\x66\x28\x9c\x0a\x43\x5c\x93\x1b\xc7\x62\x84\xe9\x98\x56\xce\x9f\x20\xaa\x74\x24\x8c\xa5\x3d\xce\x3d\x1d\x76\x4d\x21\xf7\xcd\xb3\xd3\xaf\x92\x43\xa8\x4c\x4d\x1d\xc1\xc6\xe7\xe2\x1d\x2c\xab\xe5\x68\x32\xca\xd8\xc8\xde\x1e\x5c\x17\xe1\x54\xe5\x5a\x7b\x92\x13\x69\xf7\x85\x54\x16\x7d\xcc\xbf\xf6\x24\x48\xc4\x32\x5d\xf3\x12\xb8\xb2\x24\x9e\xd3\x29\x07\xed\x29\x41\x44\xe7\xa5\xbd\xc0\xc7\x43\x57\xf8\x19\x8e\x84\x30\x90\xbe\xcd\xb3\x3f\xdb\x66\x83\x5e\xc1\x3c\x1e\x0f\x8f\x02\xf4\x8a\x9f\x67\x2f\xdf\x67\xfb\xfd\xec\x65\xb3\x5d\xff\xf1\xe7\x9f\xeb\xed\xef\xb3\x1f\x4b\x77\xab\xc0\xfc\x58\xb6\x5f\x66\xb5\x5b\xbd\x0c\x97\xb0\x16\x2c\x32\x89\x2c\x9e\x81\xc2\x3e\x66\x73\x84\x12\x22\x91\xb3\xa7\x65\xb6\xce\xa6\xd4\x1a\x06\xb7\x44\x49\xa0\xa9\xeb\x97\x36\xa8\xfe\x29\xfe\xea\xfe\x5e\x49\x3d\x9f\x60\xf1\xdf\xd0\x5f\xad\xf5\x7c\x3b\xf2\x61\x28\xa5\xbe\xec\x08\xb1\xa1\x84\xc9\x46\x3b\x4d\x29\x8b\xf1\xc3\xbe\xee\x16\xbd\xaa\xae\xa6\x34\xf1\x71\x07\xf8\x92\xc3\xb7\xf5\x40\xdb\x3d\x90\xd2\x24\xc1\xec\x68\x33\x95\x46\x49\xa5\xe9\xa7\xa7\x2a\xe2\x96\xfe\xb3\x15\xd8\xd0\x34\xd0\x46\x79\x21\x2f\xea\x54\xdf\x36\x59\xe3\x00\xbf\x14\xf5\x86\xdf\x60\x98\x5e\xd2\x34\xf4\x7d\xfc\xa2\x36\xdd\xfd\xad\xc8\xfa\xd4\x41\x9a\x86\x09\x41\x15\xf7\xdd\x7e\xf6\x6d\x79\x58\xbf\x2c\x8d\xa2\xd5\xf2\x65\xd1\x8d\x08\x70\x67\x39\xa3\x30\x1f\xe6\x71\xee\x3b\x48\x34\x8d\x02\x86\xa9\x69\x71\xbd\x79\xa4\xc6\x0c\x54\x7b\xbf\x51\x20\x68\x9f\x2f\xfe\x5e\xad\x4a\xd3\x48\x85\x38\x6b\x0c\x58\xbe\xa8\x6b\x70\xda\xc2\x9a\xc6\x3c\xc6\x4c\xba\xc1\x36\xbc\x14\xf5\xee\xd2\xf3\xca\xc6\x24\x58\x83\x45\x47\x63\x00\x92\xb4\xa8\x9e\x66\x71\x4e\x58\x7f\x9a\x90\xd8\x12\x0a\xf4\xf9\xc1\xef\x3c\xb2\xc1\xab\x4d\x64\x8c\x41\x14\x38\xe8\x77\x0b\xcd\xd5\x54\x78\x14\xf3\x7e\xb6\x3c\xf0\xc0\xf3\x91\x1b\x40\x35\x49\x90\x3d\x76\x9e\xd6\xa3\x1d\x81\x6a\xc6\x9d\xf4\xd0\xcf\x34\x7f\xe9\x35\xe9\x6b\xaa\x25\xc1\x0a\xce\xa5\x2c\x7e\xdd\xac\x57\x36\x9e\xb5\x1a\x84\xc9\x07\x98\x28\x7d\x96\xab\x5d\x2f\x5a\x1d\xce\x30\x9f\x30\xc3\xf9\x81\xbb\x45\x76\x6b\x33\x6f\xda\x27\xe0\x21\x21\xf3\xc6\xb0\x11\x74\xfc\xb7\x9f\x44\x7b\xf6\x34\x2f\x32\x20\xf9\x57\xf3\xe8\xdb\xf4\x38\x65\x6a\x7c\x4a\x12\xdc\xf6\xde\xa1\xcc\xf9\xb9\xe3\x43\x74\x87\xa9\xc6\xc6\x8c\x59\x5d\xf2\xf6\x6f\x11\xc7\xdc\x37\xb2\x9f\xee\xea\xa2\xe4\x47\x40\x10\xd6\x6f\x5d\xb7\xe1\xf0\x5e\x28\x37\x88\x86\x73\x9a\xd3\x30\xfa\xb2\xc1\x46\xfb\x54\x50\x2e\x6d\xce\x72\xb7\xd9\xc9\x14\xf2\xe9\x06\xdc\x66\x68\x20\x4d\x95\x29\xcd\x57\xf3\xb5\x81\x7b\xfe\x04\x78\x1b\x88\xc9\x68\xdf\x0f\x43\xec\x53\x4d\xab\x87\x12\x90\x08\x67\xce\x2f\x9f\x7c\x08\x3f\x8c\x2d\xf9\x94\xec\x31\x54\x6b\xdf\x4f\x42\x74\x4c\x0e\xb8\x5f\x62\x60\xb9\x80\x6c\x22\xeb\xf8\x57\xe1\xc4\xc0\x54\xde\x35\x6c\x8e\x6e\x86\x03\x42\x0e\xbe\x37\x0e\xcb\x23\x80\x69\x6c\x1b\xda\x16\x3f\xf0\x62\xa4\x6f\x31\x5e\x77\x0d\xab\xf9\x7a\x3c\x82\x33\xa4\x9f\xaa\x78\x2e\xeb\x2b\x6f\x57\xb4\x1f\x4a\x83\xba\xdd\x2d\xe7\xeb\x97\xc5\xee\xb0\x7e\x3c\x2c\x66\x7f\xba\xa3\x11\x35\x0c\x06\x19\x16\x76\x77\x17\xc3\x97\xe2\x0e\x06\x44\x33\x67\xbb\x79\xf6\x5a\x0d\xb8\x6d\xb5\x1f\x49\x30\x0e\x74\xde\x18\x8b\x83\x02\x7e\xcf\xf6\x79\xed\x38\xd6\x3c\x1a\xf7\x73\xa2\xda\x67\x44\xe0\x86\x33\xbb\x36\x16\x82\x23\xf7\x97\xbb\x36\xf3\x4d\xb2\x7e\x73\xcd\x32\x9b\xa6\x1a\xf3\x88\x0c\x5f\x00\x0b\xb8\x25\x9b\xae\x1f\x0a\xa7\xc2\xad\x7d\xa6\x03\x5c\xfc\x56\xe0\x68\x5c\x3b\xd4\x7e\x0c\x81\x67\x9d\x42\xcc\x72\xb5\xb3\x21\xa1\x66\x51\xc2\xaf\x1a\x35\x0f\xdd\xdf\x39\x0b\x31\x55\x6b\x5a\x84\x6c\xef\xcb\xe8\xa2\x5c\xf9\x81\x6b\x7a\x59\xbf\xb8\xfd\xdc\x17\x34\xf6\x8c\xac\x7d\x33\x8b\xd1\x57\xfe\xfe\xf2\x41\xdb\xc3\x81\x61\xea\x6d\xf6\xea\x7b\x96\x2f\x37\x28\x22\x58\x0f\x32\x5f\x0c\xd1\x1f\xab\xf6\xde\x44\xa4\x10\x4f\xda\xea\xfd\xee\x97\xb3\xe7\xc3\x6e\xb5\xe8\x6e\x21\x36\xa8\x73\x24\x09\x2a\x79\xcb\xe0\x3d\xb0\x8b\xbe\x48\x18\x52\x9c\x2d\xc0\x55\xac\xd4\x24\xde\x54\xfb\x42\x24\xe8\x34\x5f\xf3\x0a\xea\x1f\xe9\xe5\x93\xc2\xb5\x1b\x0d\x1e\xea\x3e\x67\xa9\xae\x0f\x82\xb7\x5f\x5b\x40\x64\xd0\x12\x4f\xcb\x3f\xf6\xdb\xf5\x7c\xdd\xfa\xcb\xbe\xd0\x11\x96\x2a\xbf\x3d\xcf\xdd\x9f\x64\x6c\x36\xb0\x12\x89\xbc\x7f\xf2\xb2\x4c\x5b\xaa\x0b\xed\xab\x98\x20\x80\xe8\xbd\x71\x23\x8c\x9e\x29\xa8\xab\x34\xd4\x58\xa3\xbb\xd7\x91\xb1\x04\x73\x28\x0d\xfa\x7b\x6c\x7e\x34\x04\x96\x37\x49\x61\x33\x80\xcd\xd3\x98\xa3\x81\x17\x68\x4c\xea\x57\x3c\x03\xcf\x89\xa4\xd9\x63\xd4\x0b\x9d\x1c\xd4\xb2\x3e\xdd\x15\xc9\x74\x40\x63\x86\x18\x8f\x0f\x9e\xd7\xd5\xbe\x78\x4c\x8f\xa7\xe9\x4c\xac\x0e\x68\xe2\x3b\xce\xba\xc6\xe6\xb9\x06\xd4\xf6\xa7\x64\x82\x65\xd2\x1e\x09\xc4\x38\x97\x14\xf8\xd4\xf7\x2d\x7a\x7e\x96\xbb\xaf\x8e\xeb\xe1\x2b\x59\x39\x1d\x04\x32\x50\xa6\xcb\x5b\xa6\x97\x14\xf2\xfa\xc7\x6a\xe3\x7e\x37\xf2\x62\x15\xbb\xb5\x65\xe9\x69\xc6\x14\x08\x3a\x88\x62\x8a\xb9\xc8\xf9\xfa\x65\xbf\x5d\x3d\xd8\x06\xcd\x81\x56\x90\x0e\x58\x08\xac\x4f\x76\xf3\xa5\xf8\xab\x0e\x58\x24\x11\x86\x53\x5c\xfa\x8a\x97\x3a\x60\x89\x0e\x7b\x98\x36\xc8\xb2\x34\x3f\xde\xe3\x00\x9c\x86\x9d\x0e\x98\x30\x52\xff\x48\xbe\x58\x41\xdd\xc4\x15\x87\x4d\x91\xa5\xf2\xd6\x5e\x13\x28\xe2\x0f\x90\xa2\x7e\xd0\x4a\xa5\x83\xd8\xa3\x40\xed\xe9\x8f\x3c\xcd\x3a\xfc\xe3\x2a\xaf\xae\x5a\xa7\xcd\xd6\x86\xd9\xee\xaa\x7d\x22\x77\x6a\x10\x86\xd0\x12\x8c\xa7\xf9\x33\xff\xd5\x63\x39\x1f\x7e\xff\x38\x36\xd5\xf8\x23\xd4\x88\x88\x6d\x42\x76\x27\x7e\xaf\x83\x24\x20\x68\xe1\x1d\x41\xa0\x69\x33\xf9\x1d\xa6\x5b\xc6\x75\x90\x70\x1f\x85\x7e\x8a\x0b\xe4\xf3\x13\x38\x66\x55\x1d\x70\x2a\x11\xe1\xd7\x91\xc4\x98\xa2\x6c\x3b\xdf\x85\xef\x61\x04\xf8\xc0\xab\xba\xc8\xa1\x3d\x51\x28\x8e\x2c\x1e\xb9\x65\x3e\x33\x14\xfd\xdd\x69\x40\x11\xb2\xb3\x7c\xfe\xc7\xcc\x2d\xe2\x40\x46\x41\x60\x52\x98\xef\xe9\x3d\x12\xd9\x0d\xe2\x3e\x62\xad\xf7\xd8\x11\xd6\x9e\x0a\x21\x32\xc9\x58\x66\xe6\xa1\xed\x0a\x54\x60\xd4\xf8\xb8\xb2\xfc\x0e\xd5\xd8\x86\x06\x2a\xd2\x98\xfa\xd8\x9d\xd2\xa9\x3d\x21\x50\xb1\xd1\xad\x3b\x1f\xaa\x8e\x0b\x4b\x07\x4a\x44\x58\x76\x38\xf1\x6a\x0b\x17\xe0\x36\xb2\xfb\x9f\xa0\xbd\xae\x8a\x12\x27\xea\xb3\x6b\x19\x5e\xcc\x8e\x3e\xe8\x3c\xd7\x81\xd2\x80\x11\xef\x37\xa8\x0d\x09\x60\xcf\x99\x09\x40\xc4\x86\x43\xa6\x99\x95\x06\xc6\x6e\xca\x35\x56\x02\xb6\x1d\x66\x60\xa6\x2d\x4a\xec\x50\x0e\x54\xa4\xa6\x23\x9d\x00\xb4\x42\x1f\x7f\xb3\xde\xff\xc3\x5d\x4a\x53\x40\xdf\xd4\x70\x80\xc2\xf9\xd2\x5c\x6e\xaa\x9d\x7f\xda\x15\x0d\x09\x51\x3a\x74\xb8\xec\x79\x81\x29\x11\x97\x56\xfa\x6d\x34\xd4\x67\x58\x59\x79\x2a\x8e\x48\x73\x5a\x7f\xc6\x6c\xd1\x8e\x07\xac\xea\x35\x6b\x23\xcd\x8f\x1d\xc5\xf2\xf0\xb1\x42\x8f\x42\x64\x0d\xee\xee\xa8\xf6\xc5\xa4\xd5\x0d\x3d\x45\x3c\xdd\xc3\x23\x36\x7b\xad\xf5\xfb\x87\x3f\x4b\xbd\x08\xb3\x2b\x17\x7e\x5b\x5c\x7b\x34\xe6\xa3\xae\xbc\x7e\x6c\x13\xfa\xdc\x34\xc6\x3d\xa4\xf5\xa5\x93\xe4\xd6\xa1\xaf\x38\xd6\xc7\x05\x2a\x67\x18\x7b\xd0\x1d\xd3\x58\x73\x44\x77\x13\x6b\x67\x4f\xeb\x3d\x52\x36\xbb\x11\x01\xd1\x96\xd0\xb9\x9e\xf3\xf3\x85\xa7\xc7\xd1\x7c\x0d\x03\x08\x4c\x75\x97\xe7\xea\x76\x69\x6d\x4c\x18\x40\xec\xc0\x97\xcf\x86\x9b\x70\xf0\xd3\xcc\x8f\xa4\xc5\x38\x3d\x96\x00\x8f\x3c\x93\xad\xd9\x0e\x63\xdf\xf4\xe6\x62\x9e\xd9\x72\x27\x4c\xb0\xa8\x7f\x59\x7c\xd4\x61\x1c\x08\xdc\x22\x7e\xa4\xf0\x71\x40\xf0\x7f\xd6\xec\x3b\x5d\xa1\xeb\x70\xd7\x85\xa4\xc3\x38\x0a\x93\x56\xee\xc3\x98\x20\xcc\x21\xa9\x1e\xab\xad\x1d\x9a\xf0\x50\x5a\x0d\x86\x87\xab\x10\x19\x0c\x62\xb8\x50\xd0\xb8\x03\xa2\xbc\xe6\x55\xdb\x0d\xa5\x43\x29\x39\x82\xb8\x5c\x81\x1b\x3b\x93\x50\xeb\xc0\x8d\x50\x91\x87\x01\x20\xfc\x02\xd9\x27\xe4\x1d\xde\x81\x8a\x02\x2c\x17\x3c\xee\x5e\x66\xbb\x61\xa4\x1d\x2a\x66\x64\x45\xf7\xeb\xfd\xec\xc9\x48\x70\x75\x0c\x6c\x3a\x54\x3c\xf6\x93\x96\x88\x70\x32\x65\xda\xcf\xb6\x84\x8a\x27\x91\xd7\xcb\x85\x2c\xf3\x3a\xad\x6f\x98\x22\x68\xdc\xe4\xd1\x8d\x01\xf3\x11\x35\xad\x78\x9f\xd3\x4d\x87\x20\x02\x04\x05\x5f\x70\x9b\x68\xe3\x55\xcf\xbd\x7d\x4d\x09\x76\x02\xae\x5e\x56\xfb\xd5\xec\xc9\x9d\xa6\x99\xe0\x08\xff\x30\x1d\x27\x7f\xbe\x6e\x56\xcb\x4f\x56\xa2\x8e\x35\x56\xb0\x0d\x21\x5c\x56\xf0\x36\xc4\x0a\x75\x12\xe0\x4d\x75\x70\x7e\x4b\x34\x31\x4a\x72\x44\x84\x30\x74\xad\xd0\xab\x32\x24\x4d\x3d\x6d\x5c\x1d\x91\x84\x21\x9c\xe5\xb1\xe4\x67\xf8\x28\xca\x41\x35\x2f\xa2\x61\x88\x36\xa3\x2c\xb2\x26\xae\x9c\xe2\x65\xd0\x11\x95\x02\x0b\xe3\x28\xcd\x81\xf8\x68\xd0\x0f\x13\x9d\x98\x3a\xa2\xc0\xb0\xa5\xdc\xb8\x15\xdf\x78\x0d\x1f\xc6\x73\xfe\xcd\x42\x3d\x26\xaf\xef\x2b\x43\xd8\x99\x81\xae\xa3\x68\x38\xc7\xa3\x80\x1a\x0e\x89\x0a\x72\x65\x16\xe5\xe4\xbb\x8c\x82\x98\x06\x56\xd4\x6b\x59\xca\x88\xb1\xfb\xce\x4a\x1d\x05\x52\x1a\xeb\xdb\xf8\x12\x3f\x8c\x9d\x6c\x51\xaf\xa3\xb1\x21\x05\x84\x6f\x99\x8c\xe6\x10\x3d\xfe\xe5\x5a\x8e\xc2\xc0\x43\x3b\xb4\x83\xfa\xa9\x18\xb9\x28\x51\x14\x10\x69\x94\x06\xea\x53\x9a\x65\x83\x42\x4f\x14\x29\xea\x0b\xa7\x7c\xf3\x0d\xea\x9f\x45\x99\xa9\x8e\xf6\x49\x47\x2c\xf6\x94\x73\x70\x6c\x07\x7c\x0f\xbc\xa4\xa3\x58\x45\xbe\x89\x7f\x25\x5c\x6a\xd3\x44\xd4\x03\x2f\xbb\x51\x5a\x6b\xd5\xb2\xae\x37\xd6\xea\x8e\xdd\x59\x47\x89\x17\x3a\x52\xbf\xe7\x9b\x49\x27\x0c\xa2\xda\x28\x89\xb5\x03\xcd\x3f\xa7\x79\x63\x34\x4d\xaf\xe5\xe8\x3a\x9c\x2b\xa4\x4f\xda\xe5\xc5\xfb\x68\x6e\x0a\x9f\x62\xa9\x75\xf3\xe3\x8f\xc1\xac\x14\x51\x82\x6e\x9c\xfd\x42\xe3\xde\xad\xff\xa4\x58\x79\xff\x75\x84\x12\x46\xad\xdc\xd0\xba\x36\xf3\xd9\xad\xba\x48\x12\x1a\x98\x7a\x5f\x0e\x25\xaf\x61\x77\x2a\xca\xfa\x29\xcd\xdf\xba\x01\x26\xf2\x2c\xf2\xec\xb6\xe1\xb7\xc7\xa2\x7c\xbc\xba\x76\x16\x1d\x49\x46\x9d\x66\xf1\xec\x52\x28\x28\xb9\x2a\x90\x88\xe3\xf6\xf5\xd6\x1d\x49\x95\x68\x23\x9f\xba\xcc\x4c\xae\x65\x03\x65\x5a\xa8\x71\x67\xbf\x1d\xae\xfc\x28\x09\xda\xc6\x3d\x53\xdb\x9c\x7e\x58\xe0\x12\x63\x73\x2c\x84\x0d\xf1\xb5\x3a\xd2\x31\x8d\xa1\xbd\xcc\x2c\xcb\xf6\xc5\xb5\xcc\x79\xe3\x57\xcf\x91\xff\x58\xf5\x5e\x8d\x4e\x84\x53\xf4\x7e\xe2\xb9\xba\xdf\x8d\x22\xad\x7d\x61\x93\x55\xf6\xc3\x0d\x57\x14\x23\x3e\x41\xb0\x7c\xeb\x86\xcd\xaf\xe3\xba\x05\x23\x01\x1f\x08\x97\x7d\xde\xa1\xa0\x19\xe1\x14\x29\x6d\x14\x70\x95\xa5\x39\xec\x4f\x2d\xfc\x5d\x33\xd2\x49\x37\x58\x65\xd4\xf9\x29\xcd\xd4\x6b\x9e\xbe\x43\x0b\x51\xd6\xcc\x0b\x03\x19\x3b\x16\xd6\x5d\x5d\x5c\x1e\x4d\xbd\xab\x3d\xae\x03\xc4\x34\x18\xfd\x85\x89\x96\x10\xcd\xa8\x56\x74\xe0\x5d\x9a\x52\xf8\xe4\x07\x61\x81\xc7\x02\xd5\x83\x66\xae\x46\x1b\x35\x0b\x3c\xa9\xb5\x23\x15\xb9\x56\x60\xda\x60\xdc\x41\x9a\x60\x92\xdf\xe0\xb7\x17\xd0\xea\x51\x3d\x63\x0d\xfe\xce\x9f\xed\x9b\x59\x16\x24\x21\xbe\x91\x6b\x6e\xa5\x32\xd4\x9c\x5f\xaa\xf6\xd2\x8a\x6b\xeb\x02\x7d\x1b\x29\x1b\x68\x16\x52\x8d\x19\x6b\xc1\xe5\x1b\x36\xae\xf4\x41\x79\x9a\x85\x82\x10\xd9\x4e\x24\xe4\x75\x18\x3d\x55\x28\x8d\x5e\xfc\x82\x5b\x61\x15\x77\x6a\x14\x99\x5a\x4a\x89\x59\xee\xfd\x76\xe6\x0e\x30\x12\x62\x65\x4a\x80\x2c\xce\xb0\x4d\x25\x06\x60\x83\x07\x62\x09\x8d\x44\xe7\xa2\x8e\x7e\x32\x0e\x64\xd8\x3a\x47\xc6\x72\xad\xf3\xd5\x7c\xed\x7e\x20\x06\xc0\x9e\x80\x92\x5f\x86\x1e\x2d\x4b\x28\xd1\x6a\xd0\x38\x8a\x7a\xc6\xce\x7c\xb2\xc4\x27\x9e\xcd\x32\xb8\xa3\x68\x3f\x47\x57\x89\x8c\x6a\xf4\x3f\x66\xf3\xdf\xbf\x0a\x10\xdc\xf0\x44\x1a\x31\x27\x53\x22\x1a\x84\xcf\x4c\x84\x3c\xb4\x0e\xe8\x62\xa9\xd2\xba\x28\x2d\x6f\x5f\x79\xbb\xa7\xbc\xb3\xe7\xa8\x84\x4b\x8b\x86\xbd\x5e\xac\x1b\x31\x08\xad\x98\x0e\x22\x7c\x0e\x23\x03\x52\x7a\xed\xdf\x65\x82\x89\x88\x1a\xf8\x79\xb2\x26\x69\xc6\xc5\x24\x22\x98\x13\x7d\x81\x8f\x75\x99\x01\xcf\x7b\xc2\x3c\x3a\x26\xca\xf0\x35\x16\x42\x5f\x2b\xd9\x18\xf0\xef\xbc\x3a\x35\xb7\x6b\x6a\x6c\x13\x35\x8f\xd8\x63\x4c\x23\xb8\x08\xf2\x9a\x67\x27\x6c\x7c\xef\x4f\x97\xd8\xe3\x0a\x4d\xc8\x16\xaa\x34\x4b\xdb\xe2\x46\xec\x09\xa5\x5a\x70\x6f\x0f\x7a\xd7\x15\xba\x62\x1a\x71\x8c\x53\x9a\x58\x71\x55\x2d\xcf\x97\xda\x5a\x65\x77\x1c\x08\xe6\x97\xd3\xfe\xab\xda\x40\x89\x66\x63\xb8\x1e\x62\x3f\xe6\x68\x39\xf7\xcb\xdd\x7e\xbe\x5e\xbd\xb8\x57\x17\x07\x71\xc2\x75\xeb\xfc\x7d\x7b\xde\x7f\xf2\xea\x02\x10\x91\xb5\x95\x1b\x5e\x97\x45\x3e\x94\x35\xb6\xa3\x42\x3f\x89\x02\x27\x97\x9d\x4a\x98\x17\xd0\x29\x80\xbb\x31\x81\x41\x9a\xcc\x8b\xb6\xcb\xd7\x1d\x91\x0c\x49\x7c\x7e\xce\x56\xfb\xd5\xcb\xb7\x01\xe1\x97\x8e\x43\x88\xa8\xb4\x7a\xa6\x26\xfa\x1c\x7c\x89\xc8\x97\x08\x39\x35\x59\x87\x55\x0d\xe5\xc1\x9d\xc9\x28\x71\x8a\x42\x3b\xb3\x59\x3d\x16\x25\x3a\x11\xc5\x58\xe6\x70\x32\x06\x8e\x59\xc0\x85\x75\xd5\x8e\xbc\x7a\xad\xc6\x15\xc2\x98\x29\xa5\xec\x02\x33\x19\x12\x6c\xba\xfc\x1d\x6e\xed\x07\x88\x29\xc1\xc5\xf5\xfb\xcb\x7c\xc0\xd5\xa7\xe3\xc4\x37\xcb\xfa\x09\xa0\x2c\x6e\xc8\x3c\x7b\x3d\x0f\xe6\x90\x08\x02\x41\x1c\xd5\xe8\xaf\x09\xf9\x6b\x1d\x0b\x16\xa2\x63\x6e\x31\x87\x13\x70\xc3\xe9\x2a\xfd\xb4\xcb\x11\x4b\xdf\x7c\x23\xb4\xad\x99\xb2\xcd\x5d\x6b\x3d\x59\xc9\x89\xa5\x6f\xf8\x75\x9d\x8e\xfb\xc4\x4f\xc4\xc3\x65\x23\x7d\x40\x82\x9a\x1d\x2f\xf9\x2c\x57\xcf\xfc\x6a\x45\x9c\xdc\x23\xcb\x24\xc4\xec\xdd\x0d\x78\xf9\x38\x12\x11\xd7\xb1\xb2\xbd\x97\x2e\xc2\xdb\xcc\xfe\xd8\x6f\xc7\x63\x92\x24\xb6\x88\xdf\x4f\x92\xaf\xb1\x92\x3c\x36\x22\x52\xf5\xbc\xb8\x1f\x35\x1a\x0d\x84\x13\xbb\xf1\x96\x3d\x2d\x04\x1d\x83\xa7\x5b\xb2\xe7\xf5\x3b\x94\x3a\x2b\x3e\x9a\xe5\x5e\xd5\x3c\xaf\x1f\x4b\xde\x53\x2a\xd6\x31\x80\x91\x16\x44\x51\xab\x43\x34\xd0\x6f\xd5\xb1\xf6\x94\x49\x4f\x15\xf2\xed\x80\xd1\x8b\xe9\xcb\xdb\xf0\x9b\xe2\x77\xe2\xd5\xee\x24\x41\x31\xc3\x33\xdf\xae\x7f\x2e\x5c\xd3\xed\xe1\xdb\xba\x8d\xf0\x62\x2d\x8d\xb0\xdd\x43\x6a\x1a\xf9\x7b\x56\x2f\x21\x09\x51\x76\x6e\x7f\xa4\x79\x9f\x8f\xc7\x6d\x0c\x09\x11\x40\x6c\x03\x06\x82\x8b\x87\x13\x38\xf1\x88\x34\xfc\x4e\x4d\x8c\xe2\x10\x49\xe8\xc2\x0f\xa7\x6a\xcf\xb6\x25\x1e\x0d\xb1\x26\x7f\xb9\x65\x45\x8e\x48\x6c\xd5\x5e\x8e\x19\xa7\x2b\xad\x26\x60\x42\x6e\x4c\x62\x4c\xdf\x53\x71\x7c\xcd\xd1\xeb\x18\xee\x65\x89\x27\x01\x33\xa1\xf6\x76\x7e\x16\xe5\xdb\x64\x3b\xed\x60\x59\xb4\xc9\xe3\x84\x12\xd3\xe3\x87\x82\x2e\xd5\xa3\x41\x0a\x8f\xee\x81\xfa\x9c\x49\xbc\x07\xf9\xb6\x9b\xed\x0b\x97\xf1\x4e\x68\x18\xfa\x61\xab\x46\x31\x93\x72\xac\xfd\xd9\xfe\x8a\xf6\xd0\x26\x9c\x4d\x45\xe8\x36\xfa\x01\x3f\xf2\xd1\x66\xa7\xd5\xae\xc8\xde\xfb\xc5\xfa\xc1\xc4\x4c\x02\x8f\x26\x26\x7a\xcb\xf4\xa2\x2c\x2e\x5f\x74\xda\xe8\x24\x60\x0c\x5f\xcc\x03\x6f\x69\x4b\x5b\xa0\x4d\xf7\x79\x02\xa6\x0c\x41\x11\x9c\xd3\xda\x64\x9d\xe7\xfc\xc2\x45\x9a\xa5\x75\x13\x1e\xf7\xe9\x39\x3b\x7e\x05\x9d\x04\x40\x23\x0b\x31\x6c\x3c\x2f\xdc\x03\xd6\xa3\x0d\x20\x09\x20\x74\xba\x00\x3f\x8a\xfa\x9e\xa5\xd7\x0e\x0b\x03\x2f\xea\x24\xb1\x36\x25\xfc\x83\xcb\xb7\x4b\x51\x3f\xa4\xea\x9e\x70\x41\x27\xa1\x52\x44\x38\xe4\xfd\x62\xf6\xe7\x81\xba\x3d\x2e\x89\x08\xb3\xd2\x4e\xd7\xbc\xfe\x13\x78\x1b\x23\x24\x51\x10\x61\x74\x64\x9b\xaf\x9e\xd3\xcf\x65\x48\xdd\x19\x89\xa4\xd6\xd2\xbf\x14\xf9\xe3\x35\x3f\xa6\x22\x43\x2e\xa9\xfd\xed\x32\x8a\x48\x93\x48\x53\xa4\xf2\x7a\x86\x53\xc9\x7b\xc4\x3a\x3a\x61\x2c\xf0\x2c\xff\x09\xf6\xed\x4e\x39\x17\x49\x62\x79\xd3\xcb\x22\xcb\x1e\x8b\xeb\x30\x9a\x8f\xef\xff\xd3\x9e\xc6\x09\x35\xd4\x6e\x27\x68\x26\xd6\x99\xd7\x70\xb9\x95\xfc\x9c\xb6\x4b\x8c\x87\xc0\x45\xb7\x5b\xfc\xfa\x3a\xad\x9c\x08\x22\x1c\x9b\x92\x83\xc0\x18\x95\xa3\x31\xea\x22\x11\x81\xd1\xaf\xb3\x0a\x4e\xbc\xaa\x33\x98\xd4\xe5\xfb\xd2\xd4\x26\x82\x27\x48\x5f\xeb\xb2\xde\xc3\x75\x21\x7d\x89\x39\xd7\xc6\xff\x1e\x28\x78\xea\x44\x46\x1e\xc6\x99\x1b\xda\xae\x46\xa9\x0c\x26\xf1\x9c\x96\xb5\xc3\xad\x75\xc7\xa4\x54\x6e\x63\x2d\xdf\x9a\xff\x7c\xfb\xac\x32\x95\x28\x1a\xe2\x5b\x98\xaf\x5f\x1e\x9f\x56\xf3\xfd\x61\xf9\xb2\x38\x3c\xae\xda\x1a\x70\xa2\x98\x8f\x96\xf4\xe1\x7a\xdb\x16\xf2\x0d\x6a\xeb\x65\xfc\xa5\xb4\x86\x4e\x74\x68\x5a\x16\x0c\x74\xa6\x5a\x98\x2e\x95\xf6\x7b\x69\x91\xc4\x7c\x48\x0e\x34\xb2\xc1\x5a\x28\x26\x7b\x79\x80\x79\xc9\xc5\x77\xe0\x8e\xa1\x5e\x27\x5a\xa9\xc8\x48\x0e\x5c\xab\xee\x8f\xda\xe8\x3f\x7d\x83\x7a\x71\xcb\xf9\xb9\x59\xe5\x25\x42\x70\xae\x5d\xa3\x53\xfb\x59\x38\x21\x1a\x43\x4b\xee\x30\xdd\x06\x99\x3d\xab\x07\x18\x34\x37\xd8\x93\xb1\x93\x1a\x1d\x36\x3b\xf5\x11\x03\xcd\xbf\x23\x40\xc1\xe4\x1c\xe4\x84\x29\xf4\x92\x8a\x92\xcb\x26\x0c\x3d\xfc\xeb\x0a\xe5\x6d\xec\x6a\xe0\x6c\xfc\x9f\xf0\x7f\xdd\x49\x42\xfb\x89\x53\x20\xc9\xdf\xec\x33\x0e\x17\x29\xf7\x42\x1f\x53\xb9\xaf\xfd\x42\xf0\x7d\x47\x48\xef\x09\xda\x13\x8d\xc7\x89\xce\x2e\xac\x64\x31\x6a\xa3\xb1\xc3\xa8\x0f\x08\x89\xd9\x9d\x8a\xeb\x4f\x9e\x1f\xff\x48\xf3\xe3\x6c\xf5\x6d\xfd\xd7\x6e\x12\xa7\xbe\x66\xbe\x75\x5c\x71\x2b\xed\x0c\x9f\x6d\x4a\xf3\xda\x5f\x09\x15\x32\xc6\x3d\x15\x47\x7a\xd0\xb9\xbc\x6b\xe8\x9d\x4e\x42\x8f\xbc\x40\x1c\xec\x8d\x5e\x3d\x8d\x69\xd0\x36\x35\xf0\xf4\x5c\xad\xd4\xc3\xed\xde\xda\xf1\x80\x18\x2d\xed\x66\xcf\xf8\xce\xdf\xdf\x21\x1f\x51\x39\xbb\x71\x94\x61\xbb\x21\x37\x11\x61\x5d\x94\x07\x44\x81\xa4\x45\x7e\xd0\x30\xae\x6f\xf3\x40\x32\x8b\x09\x78\x87\xb2\x1e\x66\x54\xa7\xe7\x4a\xa0\x43\x6d\xdb\x3a\xb6\xa0\xa7\x28\x06\x35\x0f\x63\x1f\x37\xe9\xfa\x08\x8b\x6b\x5f\x52\x4b\xf3\x28\x30\x42\x8d\x67\xec\xa1\x5c\xe5\xcd\xd9\x69\x8b\x35\x74\x83\x42\x03\x11\x7e\x5e\xcd\xb7\xeb\xc5\xfa\xe9\x69\xb6\xdd\x35\x01\xcb\xc1\xfc\xf7\x76\x58\x14\x6b\xab\x06\xf5\xd8\x75\x00\xb8\x83\x5c\x51\xdb\x04\xbd\x80\x4b\x09\x18\x73\x0e\x2d\x2a\x8f\xa4\x21\x18\x1d\x94\xcf\x31\x89\x32\x00\xc9\x5e\x87\xf8\x3d\x7b\x72\xec\x71\xa3\xb3\x2d\x8b\x96\x5d\x76\x3e\x4d\xb1\x3a\x7a\x85\x31\xd3\xf8\xd2\x9f\x8b\x22\x3f\xf2\x4e\xe4\xef\xb3\xe1\x31\xc7\x84\xfb\x43\xc9\xff\x9d\x66\xef\x55\xe3\x4e\xf3\x6d\x2a\x5d\x1a\x98\xc7\x0a\x12\xd2\xd3\x9b\xe7\xf5\x86\x97\xfc\x0c\x75\x8f\x0d\x70\x74\xcd\x44\x70\xb4\x36\xbb\x53\xf1\xf1\x5c\x1d\xfb\xa1\x2f\x4f\x80\x62\xda\xfe\x29\xd5\xf5\xeb\xe5\x07\xd4\xd5\x5f\x27\x2c\x38\xa7\xd4\xf8\x9c\x85\xa5\x0c\x77\x37\xc7\x43\x2a\x1c\x43\x5d\xe3\xb6\x7e\x4f\xab\xba\x40\x8e\xa6\x49\x60\x17\xe7\x20\xb1\x60\xa2\x91\xf4\xf6\x81\x67\x59\x51\x8f\x3e\x9b\x08\x15\xd6\xed\x1e\x79\xe6\x15\xd7\xf6\x8b\x8b\x24\xc0\x5c\xfa\x43\x5a\x5f\xb2\xeb\xa0\x7a\xc3\x65\x10\xa1\x97\xe2\x4a\xed\x5b\xfe\xef\x7f\xb7\x80\x14\xae\x08\xc7\x34\xdc\xef\x9b\xf5\xe6\x30\x5f\x3e\x2d\x1f\x0e\x08\xbb\x98\xcd\x47\x6a\x68\x9a\x83\xaf\x10\x45\xca\x07\x9e\xa7\x3b\xa8\x4c\x01\xbc\x82\xfa\x70\x46\xc6\xda\x83\xc3\x5e\x1e\xca\x7b\xe3\xa5\x03\xa3\xd7\xf6\x90\xd6\x8d\xfb\xb2\x48\xf9\xb9\xc8\xd5\xbe\x83\x16\x70\x9d\xf8\x98\x35\x31\xcb\xc3\x01\x58\xee\x73\xdf\x93\x1f\x59\x78\x20\x30\x11\x27\x5b\x32\xfd\x56\xc2\xa4\x39\xa8\xec\xf6\x9c\x65\xb3\x2c\x73\xdc\x50\xc3\x5b\x14\x54\x11\xa4\x5d\x1f\x66\x33\x6d\xc7\xc3\x78\xb0\xcf\x24\x42\x3e\xf6\x1d\xa1\x99\xfb\x35\x5f\x18\x3e\x9b\x0a\xab\x18\x6f\xd8\x6b\xd4\x7a\xc4\x22\xf0\x63\x25\x5d\xbf\x4a\xdd\x65\x2e\x1d\xf2\x40\x04\x31\xd3\x76\x00\x86\x2c\x77\xe8\x5e\x11\x70\xa3\x23\xd9\xb2\x91\x28\xd3\x40\x3f\x1a\x16\x05\x54\xd9\xfb\x30\x82\x4a\x63\x22\xc3\x9e\xa3\x2e\xa2\x50\x22\xba\xe6\x58\xf2\xdc\x01\x75\x06\x4f\x15\x45\x46\x09\xa0\x34\x85\xb6\x2e\x9d\x28\x22\xad\x50\x6b\x64\x76\xad\x4f\xf7\xe2\xb1\xa3\xef\xc4\x3c\x0f\xbb\x93\x1e\xae\xf2\xed\xb6\xe3\x59\x07\x43\x14\x4c\x84\xd4\x36\x92\xa1\x16\xcf\xdf\xc0\x70\x0b\x06\x21\x12\x5f\x41\x2e\x0b\x4b\xfc\xb1\x52\xbf\xd9\x71\xc3\x1f\xd6\x5e\x60\x91\x8a\x96\x7a\x7f\xf9\xeb\x92\x15\xe5\xa8\x90\x27\x98\x96\x88\x06\x54\x90\xd5\xfc\xae\xf7\x7c\xf4\x6f\xfb\xd1\x62\xce\x4c\x4a\x15\xaa\x4b\x91\x57\x56\xa8\x6f\x34\x67\x62\x11\xa3\xd0\x7f\x07\xbd\x5b\xff\xbe\x7c\xd9\x1d\x1e\xd7\xdb\xc3\x76\xbd\x3a\xac\xb1\xf4\xbb\xda\xb7\xf1\xb6\x48\x7c\xc0\xc6\xca\x87\xeb\x6d\xb6\xfd\xa3\xcf\xb8\xa4\x45\x92\x98\xea\x12\x7a\x85\xae\x21\x62\x50\x27\x1d\xba\x19\x22\xe1\x54\x04\x86\x62\xba\x23\x19\xb2\xc7\x78\xc0\x91\xff\xfc\xdb\xeb\xba\x17\x5d\x08\xce\xc2\x20\x68\x0b\x5d\x58\x68\x1d\xa3\xa5\xdc\x48\xce\xcd\xe2\x31\x7e\x7d\x8f\x61\xc0\x0e\x10\x94\x52\x4b\x75\xbb\xb4\x70\x49\x93\xe1\x6a\xa9\x06\x9b\xa5\x66\xfe\x34\x30\xe4\x6d\x53\xa4\x10\x81\x8f\x0b\x8b\x57\x55\x7a\xcc\x07\x59\x3b\x21\xbd\x10\x92\x3e\x05\xcc\xd0\x6f\x71\xa3\xe2\x20\xb4\xb4\x1e\xaf\xab\xc5\xe0\x67\x9c\xc5\x15\x52\x99\xb4\xc1\x2c\x4f\xeb\xf4\x4b\x95\xcb\xf6\x04\x4f\x3b\x46\xd4\x59\x56\xf3\xd2\x70\xd6\x8d\x5e\x90\x8a\x34\x66\x02\x4c\x7d\xb2\x59\x8a\x5c\xd6\xae\xbb\x7a\xf8\xa1\x14\x07\x37\x55\x11\x80\xb9\xca\x75\xf1\x58\x94\x36\x79\xd6\xe3\xa0\xd1\x42\x41\x40\x54\x47\x57\x6e\xa1\xa6\x93\xd9\x35\x01\x2c\x4a\x0c\xb3\x64\xa9\xaa\x83\xc8\xb8\x7c\x3b\x60\x89\xc0\x5d\x4c\x07\x11\xa6\x66\xaf\x79\x25\x79\x9e\x0f\xaa\x24\xd2\x0b\x2c\x2e\x93\xbb\x2c\xd2\x7e\xd7\x1d\x8b\x7d\xd6\xe5\x15\xfb\xca\x01\x6e\x84\x14\xd8\xdf\xb6\x85\x5f\x7d\xab\x22\xa9\x17\x18\xc6\x61\xa8\x8f\xfc\x0c\xcd\xad\xa5\x79\x5d\x16\x53\x64\x7f\x5a\xfa\xa1\x87\x95\x91\x65\x56\xc1\x7b\xfa\x59\xc0\x2f\xfd\xc4\xc3\xd4\x98\xad\x75\x77\x6c\x4f\x46\x0c\x6a\xf8\x5a\xa4\x9f\x98\xee\x43\x63\x4d\x67\x47\xc8\xe5\xcd\x72\x77\x94\xe3\xa1\x82\x88\xa8\x03\x59\x06\xe3\xc3\x32\xf6\xac\xd6\x99\x4e\x7b\xc5\x6d\x19\x68\x8a\xf7\x9d\x56\xeb\x7c\xd3\x92\xe1\x8f\x5e\x51\x18\x26\xa2\xe5\x63\xff\xd6\x98\xe1\x91\xfd\x90\x51\xe8\xe9\x76\x87\x9c\x7d\x9b\x7f\xd5\x42\x27\xa3\x30\xa1\xb6\x81\x73\x91\x56\x97\x6b\x0d\x43\x38\xbc\x8c\x94\x46\x8a\x1b\xdd\xe7\xe0\x9b\xba\x52\x0c\x09\x16\xaa\x52\x69\x24\xe2\x03\x17\x9e\xd8\xe3\x09\xe1\x58\x8c\xac\xae\xe2\x9c\xd6\xbb\x22\xbb\x0e\x34\x62\xfa\x11\x95\x3b\x23\x06\xec\x3e\x3c\xa7\x79\xfd\x77\x3a\x6f\x64\x92\x84\x31\xb7\x31\xe0\xc3\x35\x57\x19\x4c\xb5\x31\xc8\x44\x85\x98\xf7\xb7\x3c\x02\xc5\xf9\xc2\xcb\xc6\x14\x0c\x47\x71\x4a\xa8\xf5\xd2\x90\x4b\x5a\xd9\xfc\x55\xf5\x04\xf9\xd1\xd1\x0d\x6b\xc9\xa5\xd1\xb7\x7b\x58\xbf\xbc\xee\x0e\xc1\x61\x31\xfb\xb3\x9d\xf0\x1c\x38\xb1\x45\x8c\x43\x2a\x8b\x3c\xfd\xd7\xe1\x62\x0a\xfc\x87\xe2\x02\x79\x6f\xbf\x97\x82\x78\x08\xa5\x4b\xab\xea\xca\xad\x86\xfe\xec\x1d\x4a\x7e\x1c\x87\x88\xee\x04\x8b\x3e\xb0\x5c\xf1\xbb\x0f\x80\x0e\xaf\x25\x45\x10\x20\x40\xa0\xb1\x80\xaf\x97\x75\xbb\x90\x84\x08\x83\xc8\x40\xd1\x51\xab\xb0\x1c\xa8\x35\x69\x29\x43\x43\x85\x7b\xbc\xfe\x1f\x2f\x9d\xd8\xb0\x96\x4a\x0a\xdf\xfa\x08\xe8\xb1\x62\xc5\x7f\xf4\x0d\xfe\x87\x5a\x03\x2c\x81\x2a\xd4\xb1\x30\x50\x67\x97\xf6\xeb\x2f\xc2\x91\xc0\xba\x37\x0a\x24\x24\x70\x40\x8f\x57\x16\x79\x13\x84\xed\x8b\xe7\x34\x4f\xbf\x75\x53\xd9\x0d\x13\x1a\x49\x76\xe7\x38\xac\xf1\xe6\x76\x28\xd5\xbf\x3b\xf1\x0b\xec\x4e\xa9\xbe\xd3\x81\xff\x64\xe2\x20\x17\x51\x2f\xc1\xdf\xd3\x09\x19\xbd\x76\x2d\x00\x37\xe7\xc7\xd9\xe3\x6c\x78\x48\x11\x16\x6a\xdb\x70\x6a\xf7\xa7\xc9\x1f\x53\x24\x61\x46\x42\x19\x93\x56\xa6\x6d\xbe\x2e\xc6\x77\x6a\x07\x7b\x42\x39\xea\x77\x4b\x97\x3c\x7c\x07\x8a\x42\x84\x50\xdb\xfd\xe3\xa3\x43\xc4\x2a\x9f\x11\xcc\x43\xfc\x04\xb1\xe1\x69\xc5\xdb\xbf\x27\x91\x45\xfc\x57\x2d\x4b\x52\x7b\x8c\x53\x04\x27\xf4\x58\x24\x2a\x53\x34\xef\x12\xc5\xa3\x07\x09\xa8\xf0\xb1\xce\xc5\x35\x74\x9c\x73\xa3\xb7\x12\x04\xa6\x10\xc5\xd5\x7b\x5a\xb5\x29\x7a\x77\x30\xf2\x91\xc5\xd8\x9e\xb2\xd6\xf8\xbb\xaf\x15\xa8\x59\x65\x6e\xd0\x25\x55\x55\x48\x7c\x4c\x11\x5f\x2b\x28\x6d\x53\xa1\x15\x3b\x1b\xfe\x5e\x48\x18\xb2\x87\xec\xaf\x02\xda\x73\x59\x42\xda\x84\x62\x31\x12\x38\xd2\x2a\x4c\x04\xa2\xde\x11\x6b\x8a\x3b\x40\xe3\x2c\xa3\x6f\x52\xa5\xc7\xf6\x22\x5c\x84\xb1\xe3\xfe\xff\x55\x3f\x34\x13\x36\x89\xba\xa3\xc6\x05\xcb\x3a\xf6\x56\xad\x22\x9f\x51\x84\xb5\x03\xf4\xe1\x92\x8a\x49\x82\x33\xc0\xfa\x64\x0a\x00\xb5\xc1\x52\xf9\xdb\x54\xce\xea\x6e\xe7\x52\x4c\xfa\x56\xb5\xac\x76\x9a\xad\x16\xcf\x3b\x7c\x17\x31\x8d\xd1\xe4\x22\x73\x74\x63\x51\x5e\x2d\x59\xae\x71\x27\xdc\xa8\x48\xa1\xf7\x06\xe7\xb4\xb6\x8b\xf5\x35\xd7\x65\xf1\xef\x31\x3a\x4c\x25\x84\x82\x37\x48\xcc\xf6\x51\xaf\x6e\x90\x67\x70\xb1\xb3\xf9\x6c\x52\x19\xd4\x0d\xa3\x14\x91\xc9\x38\x06\xc9\xe5\x3f\x43\x2b\x75\x56\x52\x25\xb1\x80\x8e\xf4\x17\x81\x69\xd3\x9b\xbb\xe2\x61\xe8\x9b\x5c\xb6\x7c\x5b\x7f\xe4\x69\x7e\xb4\x51\xf6\xe8\x91\xb8\xe2\x28\x66\x73\x31\xc4\xe0\xdb\x54\x4e\x36\x1b\x2a\x11\xe8\x80\xb6\x45\x16\x83\x89\x1a\x79\xf7\x4a\x48\x23\x75\x37\xb7\x0b\x7b\x20\x30\xa5\x95\xa4\x04\xbf\x06\xb2\xf8\x38\x10\xff\x1d\x65\xa6\x56\x32\x08\x4d\x72\x83\xe7\x47\x95\x4e\xa0\xca\x95\xe4\xa1\xc3\xf1\xae\x87\xfb\x88\x92\xd2\x4a\x3c\xa7\xcd\x12\x6f\x1c\xcc\x76\xd6\x29\xca\x45\x57\xb3\xfd\x82\xa6\xf7\x93\x59\xa7\x42\x8d\x0b\x60\x77\x2a\x2e\xbf\x9b\xdd\x66\x78\x5b\xe0\x2b\x69\x01\x71\xdb\x6b\xee\x48\x95\x87\x17\x81\x98\x12\xda\x39\xe0\xb6\xc4\x63\x9a\x53\xdd\x90\x84\x38\x98\xd4\x7c\xfe\xdd\xb4\x28\xd0\xe1\xab\xd4\x09\xf7\xb5\xc5\x3c\xee\x8b\x6d\x55\xdf\x13\x5d\xb6\x23\x35\xb5\xb8\x87\x87\x85\xd1\x0a\x1f\xe4\xae\xcc\x30\x20\xc4\x47\x8f\xdf\x71\x67\xac\x16\xee\xb5\x01\xa1\x80\x40\xd3\x3a\x85\xd2\xdf\x76\x0e\x0d\x10\xf0\x93\x70\x20\x49\xf3\x37\x88\x7c\x35\x78\x5e\x64\x4e\xab\x9e\xf9\xff\x15\x65\x5a\x8f\x6a\xeb\xe0\x51\x93\xf6\xc6\x46\xd0\xf2\x8d\x3b\x1b\x03\x9e\x12\xe0\xc4\x0a\x2d\x7d\xf1\x72\xff\x7d\xda\x38\x83\xa7\x23\xfc\xda\x0f\xb3\xc5\x01\xb1\xf8\xee\x2a\xbe\xcf\xd0\x4f\xfb\x73\xdd\x93\x8f\xd1\xe0\x87\xa6\x3b\xca\xb4\x0c\xaf\xaa\xe5\xaf\x74\x04\x27\x02\x9f\x1b\x2c\x2c\xba\x9e\x86\x4d\xa7\xad\x19\x80\x0f\x9a\xc9\x4e\x43\xc5\x20\x8a\x27\xbf\x09\x04\x09\x43\x7a\x97\xc6\x76\x0c\x7d\xed\xde\x5a\x87\x40\x7a\x49\x68\x47\xfd\x1d\x12\x53\x0d\x21\x49\x4c\x70\x59\x64\x19\xc8\xda\xd0\xd2\x8c\x5e\x6e\x28\x42\x3f\xea\xf5\xd9\x20\x41\xba\x2e\x4a\x09\x2d\xdf\xec\x4b\x51\xf7\xe7\x23\x44\x81\x69\x3b\xda\xc2\xe5\xda\x8f\x4a\x20\x8a\x4c\x30\xb9\xcb\x8a\xfa\x99\xcb\x53\x9a\xb7\x73\x23\x4a\x3c\x97\xbe\x69\x6c\x45\x0f\x20\x51\x75\x43\x14\xda\xb2\x2d\xf0\xac\xbe\xcd\x79\x35\x00\xf2\x00\x0b\xad\x80\x46\x75\x15\x6d\x96\x6b\xd0\xb3\x3e\x7c\x30\xa6\x43\x23\xc8\xc6\x33\xf8\xc9\xab\x5d\xdb\x53\x03\xb1\x4f\xfd\xa8\x15\xd5\x98\xf3\x52\xb5\xad\x5d\x73\xd3\x6c\x3f\xd1\x1b\x0e\xb1\xa4\x86\x99\x72\xf9\x67\x7b\x21\x9d\x60\x07\xbe\x2e\x61\x98\x9d\x86\x04\x98\xea\x40\x80\xcd\x13\x7f\x99\x37\x1f\xdd\x7a\xa2\x23\xdf\x72\x2c\xac\xe6\xeb\x12\xe9\x89\x86\x23\x84\x56\xae\x84\xbb\x4b\xbb\x66\xa2\xe1\x20\x08\xc3\xd8\xbe\xf3\xef\x45\xf1\xe6\xc8\x66\xc7\x8a\x14\x6e\x74\x1c\x84\x4e\xb2\x72\xf9\x4b\xf6\x8f\x68\x2a\x74\xcb\x1a\xb5\x7f\xcb\xd7\xba\xeb\xb6\x02\x1d\x18\xbd\xf7\x0a\xdf\x66\xf1\x01\x6a\x8f\xd4\x6e\x3d\x23\xac\x09\x8d\xd0\x8b\xbe\xb8\xef\x76\xa8\xda\x58\x5c\x13\x5f\x63\x94\x67\xdb\x71\x26\xd4\x19\xb5\x26\xb1\x52\x0e\x08\x8a\xa8\x04\x14\x0f\x1a\x3c\xae\xf6\x88\x52\x86\xba\x2c\x2d\x0c\x18\x36\x95\xe3\x66\x37\x37\x54\x26\x68\x51\xe1\x0c\x25\x06\xae\x63\xbd\x03\x37\x0e\x14\xc3\xcd\x30\x95\x6f\xaf\x97\xf1\xef\x69\x8a\x22\x08\xa8\xfd\x0c\xe5\x40\x30\x46\x6b\x1a\x01\x86\xa5\x59\x91\x1f\x1f\xae\xb7\xf6\xcf\xb1\x87\x56\xc1\x72\x36\xd7\x5c\x9e\x90\x2c\xb8\x1a\xe7\x33\x35\x8d\x23\x6c\xb8\xfb\x47\x51\xc1\xe5\xd4\x67\x40\xd1\x54\x7a\xb4\x93\x3f\x4a\x37\x45\x91\x2d\x9b\x4d\x21\x1a\x98\x27\xed\x47\x7e\x80\x4a\xb3\xe8\x17\xcc\x7b\x3d\xc0\x3a\x88\x0c\x3b\xb3\x02\x5e\x23\xc2\xee\xc0\x3d\x67\x10\x75\xc8\x0d\x99\xcb\xa6\x28\x6b\x9e\xf5\x17\xa1\x8e\x64\x20\xe2\x01\xbf\xeb\x23\xc0\x64\x81\x47\x33\x9f\x12\x5b\x9d\x9b\x17\x45\xa6\x8a\x8f\xfc\x1e\x33\xae\x59\x62\x7a\x84\x5d\xd2\xbd\x09\x3e\x8b\xfc\x9e\x0f\x40\xc7\x89\x17\x26\xad\xbf\xd1\x35\x8d\x4c\x36\x20\xe8\x98\x1b\x67\xaa\xc3\xaa\x0d\x1c\xc9\x91\xef\xa5\x63\xf0\x71\xc1\x71\x33\x81\x67\x69\xd9\xc3\x71\xd8\x31\x89\x1f\xb0\x56\x1c\xc4\xe9\x51\x83\x7a\x2c\xca\xc7\x4f\x7a\x72\x75\x12\xc5\x86\xb8\xe4\x2a\x2d\x45\xb5\x3b\xc0\x34\x96\xe9\x79\x96\x8d\x7e\x44\x09\x84\xa0\x9e\xab\x63\x47\x19\x66\x8f\x71\x8f\xe2\x84\x00\xd4\x93\x28\x74\xdd\x01\x4c\x35\xf7\x24\xf2\x99\xa9\xe2\x2a\x32\xf8\x6d\xf0\x8a\xb9\xa7\x02\x8b\xd5\x31\x8e\xd8\x6a\xbe\xfe\x7a\xe3\xd0\xdc\x03\xde\xb6\xa7\x1f\xaf\x19\x37\x9a\x71\xbf\x46\x3b\xb3\x16\x7e\x30\x4c\xfd\xff\x0e\x82\x8b\x66\xba\x4f\x1a\x36\x2d\xb4\x91\x3d\x49\xcf\xcd\x5e\xfd\xbc\xdc\x3b\x36\xb1\x21\xa9\xd8\xff\xfc\xef\x7f\xf5\xd8\xbf\x3e\x15\x60\xee\xbf\x1c\x49\xe2\xa4\xa5\x55\x58\xe9\x9d\x79\xe3\xc3\xa2\x90\x96\x9e\x61\x3c\xd9\xac\x9f\x37\xb3\xe7\x5e\x2b\xb4\x96\xd4\xac\x65\x07\xb2\xb6\x99\x7c\x35\xb9\x5f\x6b\x29\x19\x36\x9b\x0b\xf8\x04\x12\xa4\x21\x32\x41\x17\xbf\xd6\x85\x63\xcb\x73\xbf\x05\x56\x33\xfe\x52\x0e\x2a\x05\x5a\x93\x28\xec\x54\x29\x4d\xc4\xdc\x8a\xaa\xdd\xff\x84\xf6\x42\xdc\x2e\x2f\x50\xca\x4d\x91\xe6\x9f\x88\x4e\x6a\xf3\x7f\xff\xef\xff\xf7\xff\xbe\x2f\x7e\x3f\x0c\x13\xd8\x8c\x10\xcf\x33\x6d\xda\xb2\x04\x05\xbf\x7e\xfd\xa7\x1d\x13\xee\x2a\x9c\x62\x7a\x02\xb2\x36\x0b\xde\xfc\x55\x4b\x34\xec\x28\xbf\xb8\xc2\x4f\x5e\xb9\x63\xd4\x0b\x95\xc5\x4c\x65\x4e\xbb\x72\x76\xad\x8b\xde\x00\x86\xbc\xc1\x1f\x8d\xa1\xfc\x91\x2a\x28\xe6\xfd\xaf\xd0\x8c\xe0\x81\x73\xfa\x37\xbc\x34\xea\xae\xe3\x57\x60\xac\x29\x23\xc4\x0f\x4c\x93\x76\x65\x08\x17\xd2\xfa\x36\xa8\x95\xb8\x51\x8c\xb3\x0e\x51\x80\x9e\xc3\x58\xca\xba\xf5\xc8\x9a\xe1\xdc\xc3\xc0\x64\x59\x54\x06\x81\xe1\xfe\x2e\x01\xa9\xc2\x5f\x7b\xa2\x2d\xf6\x50\x90\x48\xf4\x4a\x2c\xf9\xe5\xf2\x04\xa5\xd3\x6b\x75\x23\x78\x82\xc0\xf7\x16\xaf\xfd\x54\xc8\xb7\xbf\xee\x24\x1a\x7d\x91\x48\x85\x98\x9d\x75\xa4\xfd\x73\x28\x6b\x93\xcf\x2d\x7e\x1b\x8a\x3b\xda\x13\x18\x57\x32\x71\x2b\x60\x1c\xc5\x32\x42\x62\x1e\x70\xdf\x75\xa4\xff\xe4\xef\xd0\x31\xf0\x30\x42\x12\xe2\x21\xee\x78\xb3\x5d\xfd\x98\xed\x97\x83\x8a\x68\x73\x98\x19\x62\x7f\xae\x94\xe9\x13\xa9\x3f\x67\xc8\x65\x84\x70\xa6\x5c\x83\xff\xbc\x4c\xeb\x66\x2f\x37\x7b\xc7\x84\xb5\x62\x84\x08\x46\x3a\xa1\x1d\xb8\x9e\xbf\x17\xf5\xbc\x37\x0d\x65\x12\x20\x8a\x8b\x2b\x35\x11\xa6\x32\x42\x94\x4f\x7d\xc3\x26\xb8\x49\x77\xbd\xb5\xa1\x54\x88\xf2\xd4\xb3\x6b\x7d\xc2\xb8\xe4\xa5\x68\xde\x21\xa8\xfb\x80\xb8\x19\xad\x3d\xdd\x4a\x12\x59\x62\xcd\x5d\xcd\x85\x29\xdc\x3a\x43\x32\x38\x05\x3c\xe6\xfa\xa1\xfa\x32\xd3\x93\x9f\x36\x6e\x6f\x17\xe2\x08\x11\x09\xcf\xbc\x2c\xd3\x26\x66\xbd\x97\xb6\x69\x46\x69\x53\x38\xde\x71\x0d\x0f\xc5\x2f\xf7\x4c\xda\xe7\x9e\x4d\x30\x0d\x74\xc5\xc7\x21\x60\x33\x34\x80\xc0\xe9\x1b\x1d\xd2\x1c\x01\x10\xb8\x09\xb4\xdd\x61\x83\xc6\xfb\xe6\x8c\xd0\xb0\xbc\x34\x17\xbf\x37\x25\xd3\x13\x55\x27\x0a\xef\x33\x2b\x8e\x4b\x24\xad\xb6\x17\xf3\x88\x47\x11\x50\x53\xf7\x85\xef\x7f\xac\x36\xd3\x93\xc0\x23\x1e\xb3\xa0\x4f\x24\x2f\x76\x06\xbc\xb7\xbd\x36\x83\x7c\xb3\xaf\xa1\xc9\xb8\x40\xe9\x68\x2b\x2c\xf0\xb4\x19\xc1\x24\xf6\xce\x1f\xfe\xed\xfa\x08\x06\xaf\xd5\xf3\x12\x45\x4c\x5c\x2c\x1f\x06\xbb\x21\x23\x9e\xef\x03\x42\x52\xfe\x80\xd2\x35\x1a\x30\xe2\x05\x81\x8e\xfb\x04\xf5\x87\xb7\x34\xcb\x0e\xd5\x47\x5a\xcb\x93\x1b\x13\x12\x8a\x52\xf3\x8f\xcf\xd8\xbf\xf7\x99\x15\x76\xa3\x3d\xc3\x32\xc0\x95\x7a\x28\x0a\x2c\x94\xdf\x65\xf5\x9b\x61\x54\x49\xdd\x32\x7c\xbe\x73\x79\x6b\x56\x45\xfb\x2e\xc2\xc4\x43\x94\x22\xe4\x03\xc8\x0b\x23\x5e\x14\x06\xb8\x27\xa0\x22\x60\x9a\x4d\xf3\xc2\x30\xe2\xc5\xbe\x81\x44\x54\x35\xb2\x02\x61\xb3\x3d\x1f\xab\xa1\x36\xe3\x42\xc1\xba\x24\x15\x4e\x48\x9b\xc1\x1f\x5d\x2f\x8a\xc2\x3e\x21\xd9\xf3\xee\x93\x6f\x1d\x2b\x29\x1c\x20\x0a\x21\x8e\x2f\xdd\xeb\x8e\x21\xc1\x1e\x78\xae\x75\x9a\xa5\x4d\xe8\x34\xe2\xcd\x60\xc4\x4b\xa2\x04\x31\x18\x1b\xc8\x6d\x4f\x32\x23\x1e\x57\xe0\xb6\x93\xad\xa1\xf8\x6a\x6d\x7f\xe7\x07\x8c\x51\x68\x8c\x78\x22\x30\x0c\x12\x56\x15\x70\xad\x47\x70\xbc\xd1\xbd\x8b\x20\x42\x1d\x9c\x13\xaf\x36\xfc\xd6\x6c\x0e\xa3\x19\x26\xe2\x18\x59\xb7\xec\x0e\x71\x2f\xe8\x72\x5f\xd7\xef\x16\xad\xa7\x12\x09\xb6\xb0\xe9\xd6\xcc\x7a\xbe\x1c\xf2\x98\x36\xc3\xb4\x40\xd2\xf6\xef\xfb\x27\xf7\xfc\xe0\x29\xcc\xd6\x67\xbc\x6a\x05\x95\xaa\x4d\x59\x68\xab\x3d\xd2\x0c\x09\x19\x35\xf2\xff\xb9\x19\xf1\x55\x85\x17\xc7\x03\x6e\xa7\x07\x17\xf7\xcd\x79\x39\xfa\xe6\x5a\x11\x54\x6f\x2c\xe1\x1d\x78\x36\x9c\x38\x94\x84\x11\x22\x31\xb6\xcb\xdf\xf7\x5d\x00\xd4\x1c\x88\x04\x3a\x07\x5b\xb8\x14\xdf\x79\xae\x46\x32\x81\xcd\x88\x24\x40\xfa\xb0\x17\xf8\xf8\x5e\x5c\x9c\x49\xa7\x1e\xf5\x51\x05\xe4\x9a\xa7\xb8\x47\xd8\x12\xc2\xa8\xaa\x88\x03\x99\xa1\x3c\xe0\x19\x3c\x5a\xa7\xb0\xbd\x88\xe6\x18\x68\xa2\x07\x51\x5c\xeb\xa7\xf4\xbc\xe0\x93\x35\x01\x46\x28\x25\xa6\x6a\x76\xe1\x65\x9d\xca\xf4\xc2\xf3\xba\x7a\x2c\x4a\xbf\x54\xfd\x9e\x7f\x37\x38\x0e\x88\xd9\x89\x16\xa8\xe9\xa9\x96\xf5\xc9\x7d\xc6\xd2\xa6\x96\x9a\x61\x22\x8c\xa1\x2b\x98\xba\x3f\xfb\x54\x1b\xc9\xcb\x8c\xa7\xe7\xe5\x6e\xfe\xc9\x1d\xf9\x09\xa5\x8e\x59\x65\xf7\x7d\x46\xc3\xa8\xbd\x40\xa2\x89\x41\xdd\x97\xef\x50\x2e\x8d\x82\xda\xbc\xc8\x75\x96\xca\x7a\x75\xbe\x64\x7d\x58\xea\x7d\x96\x74\x08\x81\xfb\xf4\xdf\x89\xf4\x37\x23\x34\xf0\x29\x46\x29\x1b\x38\x1e\x33\xe8\xed\xdf\x34\x08\x85\x32\x65\xa4\xe2\x52\xcf\x79\xdd\xfe\x5d\x02\x26\x84\x4c\xa1\x71\x35\x5f\x1f\xb6\xeb\xd7\x97\x85\xe7\x8e\x87\x1e\x11\x60\x68\x26\x8a\x6b\xbd\x83\x4c\xb7\x47\x84\x8f\x88\xd0\xed\xfa\x69\x79\xf8\xfd\xcf\xf9\xe1\xc7\x72\xbb\x7a\x5c\x2d\x17\x87\xd5\xcb\x8f\xe5\x6e\xbf\xde\xba\x91\x11\xf1\x23\x07\x00\xed\x54\x8b\xee\x9a\xe7\x9a\x91\x1e\xc3\x14\x87\x49\x2d\x7e\xc2\x34\xd0\x8c\x63\x31\xe6\x0c\x0f\x8d\xf5\x2e\x53\x75\x34\x41\x40\x8f\x40\x69\xf4\xb9\xa2\x84\xb1\xae\x38\x8b\x7b\xef\x5a\x3f\x17\x39\xd4\x27\x8e\xfe\x8c\xd1\x35\x34\x4c\x72\xa3\xf9\x14\x71\x4e\x9c\xde\xfc\x1d\xd7\xfd\x88\x62\xbf\x0f\x3a\x9a\x22\x54\x63\x84\xb2\x24\x0c\x03\x8c\xaa\x95\xc9\x9d\x0d\xed\x2a\x8d\x2d\xd0\x44\xa0\x62\x12\x42\x72\xbb\x43\x0a\x43\x26\xc4\x49\x8d\xee\x32\x8e\x99\xe5\xeb\x31\x72\x79\x65\xfa\x06\x77\x58\x99\x66\x9c\xf0\xd1\xec\x63\xbb\x50\x5e\x41\x5e\x1b\x05\x54\x87\xeb\x60\x84\x26\x5e\x80\x85\x20\x04\x3d\x4f\x78\x69\x34\xa1\x86\x45\xf5\x5c\xe4\xf5\xa9\x3d\x2b\x62\x06\x1c\x99\xc1\x7b\xeb\xcd\x50\xee\x83\xd6\xae\x50\x57\x34\xef\x39\xd5\xed\x14\xe2\xa1\x0e\x6c\xaf\xe4\xd3\xd3\x0f\x93\x93\xf7\xbd\x81\x7b\x47\x45\x68\x96\x53\x13\x1d\x7f\x77\xda\xd9\x83\xd5\xe3\xfd\xe5\xe2\x99\x5e\x2c\x82\x09\x2b\xfe\x5e\x41\x59\x63\x59\xa1\x6b\x21\x9e\x2c\x92\x31\x42\x25\x35\x01\x63\x0e\xbf\x5c\xfb\xfd\xa6\x50\xbb\x9e\x61\x93\xcc\xb4\x77\x5b\x1c\x40\x56\x5c\x55\xb5\x81\x72\x59\x9f\x46\x5f\x42\xb2\xd8\x42\xf5\x32\x90\xf5\x41\x5c\xf9\xe1\xd2\x27\x17\xe8\x8d\x14\x46\x79\x39\x35\x58\xcb\x56\xd4\x71\x34\x4c\x85\x86\xef\xea\x1f\xe9\x3f\x52\xf8\xce\x8b\x21\x92\xe9\x1e\x5e\xc1\x08\x05\xad\xb4\x49\xae\x54\x97\x8e\x45\x8e\x11\xaa\xa9\xe9\x9d\x73\x6e\xc4\x2c\x57\x8f\x98\x86\xc5\x02\xe6\x6f\xa3\x1c\x43\x9f\x70\xf1\x4b\x39\x92\x51\x44\x49\x75\x42\x70\x46\x23\xba\xeb\xf0\xaf\x6b\x7a\xf8\xd7\xbf\x27\xa7\x9c\x96\x0c\x11\x40\x5b\x78\x4f\xe1\xe3\xb9\x50\xe0\x7c\x5c\xdf\x8b\xb4\x63\x4c\x68\x96\x32\x72\x9f\xae\x3a\x55\xaf\x91\x9c\x17\x23\x3e\x25\x1e\x3a\x07\x39\x7c\xfc\x4c\xeb\x7c\x94\x9a\xc0\x01\x86\x50\xa0\x99\x73\x38\x25\xac\x03\x3c\x78\xdd\x3e\x0d\x04\x33\xaa\x88\xe5\x5b\x5e\x28\xf8\x0c\xaf\xe7\x86\xc7\x8c\x99\xfa\xc4\x71\xd2\x73\xf3\xa9\x62\xa6\x12\x06\xef\x69\x96\xf1\xf7\xea\x81\xdf\xa0\x74\x76\xa1\xf1\x8b\x8d\x5a\xab\x15\x89\x75\x95\x47\x77\x58\x7b\x68\x8e\xf7\x2f\xfb\x9e\xdd\xf7\x03\x99\xf8\x89\x8b\x3f\xe8\x41\x41\x55\x97\xc5\x6d\xe0\xd0\xfb\x8d\x55\x31\xb1\x90\x51\xfb\x72\x99\x56\x46\xfc\x30\x20\x08\x20\x79\x9d\x37\x17\x6d\x0e\xae\xaa\xf5\xb0\x19\xb6\x19\xc5\x0c\xd1\xa2\xbe\xe6\xf2\x40\xe2\x85\xdf\x9e\x9e\x08\x2c\x12\x9c\xf9\x1b\xec\xae\x17\x28\x7f\xa4\x23\x8d\x39\x46\xfc\x48\x27\xa8\x6a\x8a\xf5\x12\x14\xb2\x4a\x79\x76\x28\x07\xfc\xab\x76\x28\x8b\x88\xcb\xd9\xda\x9a\xf2\xa4\xea\xce\xf0\xee\x18\x48\x4c\x24\x5c\xf8\x0d\x55\x6b\x1d\x36\x97\x11\x3f\x0e\xb5\xe9\x5a\x2d\x8e\x86\x54\x6d\x86\x00\xb9\x7b\x67\xfd\xef\xfe\xeb\xae\xcb\x24\xe6\x59\x4f\xbc\x3a\xf5\x31\x60\x43\xd7\xcc\x4f\xfc\xa8\x95\xcb\x5e\xaf\x9d\x36\xc0\xa4\xc3\xe1\x27\x21\x41\x43\xda\x4c\xff\xdf\x79\x79\xe6\x3f\x8a\x51\x45\xa3\x19\xa4\xa4\xb2\x45\xce\x87\xe5\x9f\xa3\x97\xc7\x23\x01\xae\x6f\x3f\x4f\xeb\xc6\x28\x99\x0c\xbf\x7b\x1b\x5c\x72\xe3\x99\x16\xe7\x0b\xd4\x69\x5d\x94\x58\xae\x6b\xe7\x09\x57\x0a\xbd\x6e\x9e\xa7\x67\x5e\x77\xb5\x51\x7b\x58\x78\x81\xe7\x75\xdc\xda\x3b\xc8\x32\x5d\x94\x8f\x7f\x8c\xee\x51\xe8\xc4\x33\x64\x53\xf5\x0e\x85\xa8\x46\xc7\x65\xcc\x51\x1f\x03\xc1\x4c\x2d\x35\x3c\x6e\xac\xd3\x85\xd0\x01\x58\xfe\x3e\xb6\xf0\x95\x50\xb1\xcb\x47\xad\xcc\x26\x13\x0f\xf6\x18\x5f\x69\x96\x74\xca\xeb\xdf\x51\x4f\xe5\x32\xba\x2d\x48\x48\x28\x1c\x17\xbe\x82\x5f\x0f\xb7\x1e\x85\xb0\x1b\x23\x18\xb5\x49\x12\x04\x77\x8d\x3e\x00\x80\x69\x6f\x6e\x96\x12\x2e\xf1\x1e\x6c\x85\x11\x5f\x87\x46\x09\x73\xce\xfb\x5a\x5b\xee\x20\x8f\x31\xe5\xb5\x58\xef\xf6\xfb\x9e\x17\x1f\x10\x21\x31\xe5\x64\xea\xef\x13\x10\xd6\x4f\xdb\x65\x26\xff\x99\x9c\x7c\x01\xd1\x3e\xc6\x7a\x58\x9b\x6a\x3b\xb6\x18\x09\xbc\xc8\x68\x60\x75\xd8\x8d\x65\x7d\xea\x16\x58\xe0\xa9\x04\xb3\x4a\xc5\xb5\xae\x9a\x3d\xd2\xf4\x59\xf6\x7d\xbe\x80\x06\x31\xd6\x9f\x4d\x49\xa0\xcb\x1c\x05\xbe\x34\xdd\xfe\xae\xa1\xe1\x25\x95\x6f\x63\x81\x05\x46\x82\xc6\x83\xb5\xf9\x9f\xfd\xef\xa3\xf4\x66\x10\x26\xc2\x10\x20\xda\x6d\xec\x09\x74\x5d\x74\xee\x49\x10\x8a\x20\x32\x14\x57\x75\xd6\xb8\x4b\x67\x3e\xc4\x72\x30\x12\x44\x89\x87\xf0\x94\xa7\xab\x7c\x1b\xbc\x79\xc6\x00\x79\x18\xb6\xc5\xbf\xbb\x4c\x45\x10\x13\xca\xac\x1c\xcd\x00\x8f\x6e\x0f\x27\x3c\xc0\x17\x62\x3a\xf5\x44\xc1\x4b\xf5\x94\x22\x6b\xcb\xc2\x98\xe6\x76\x0b\x0e\x12\xa9\x10\x22\xf0\xd4\xac\x92\x22\x3f\xce\x79\x3d\x77\xca\xd8\x8c\x04\x3c\x32\x41\x9f\xe6\x69\x66\xd9\xa1\x7a\x84\x34\x76\x90\xf0\xa2\xa0\x8b\x64\x55\x63\xbd\xfb\xd0\x8e\x66\x44\x24\x89\xa5\x15\x98\xba\x5f\x15\x10\xe4\x3d\xbf\xa0\xa5\x40\x1d\x97\x4e\x49\x13\x8f\x73\x61\xc1\x3b\x4f\x45\x55\x37\x6e\x42\xb3\xe3\xda\xfa\x63\x3b\x48\x61\xa7\xfb\xa5\x28\xb2\x7d\x0b\xfa\x6d\x0e\x48\x40\xc6\x81\xa7\xdd\x27\x78\xd2\xbe\xd7\x1f\x28\x45\x7a\x4a\x4d\x8f\x00\xf3\x6b\x9f\xbc\xde\x0d\x03\x5f\xa1\xab\x60\x30\x40\x3c\x33\x52\x63\xaa\xff\xd0\xc0\x02\xc4\x0c\x8b\x66\x0b\xb9\x6d\x5c\x87\x21\x23\x81\xf6\x84\xe5\xf8\x31\x64\x95\xc8\x70\xd2\x5f\xe4\x81\xa6\x3e\x02\x95\x4d\x55\x7a\xdc\x7e\x7c\x9f\xe0\x0e\x09\x95\x21\xb7\x5b\xf0\x02\xb5\x09\x50\x3a\xcd\x1d\x0d\x23\xc3\x68\x6e\xfb\xc8\x7a\x08\x6a\x37\x22\x49\x44\xd2\x71\xb5\x18\x49\xbf\xc9\x75\x1a\x12\xee\x21\xdc\x62\x9f\x9e\xa1\x06\x79\xea\xcf\xd7\xd0\xe3\xb1\x6f\xed\xe0\xaa\x42\x0c\x78\x9a\x43\xf9\x58\x94\x5b\x68\x1c\x8a\x34\x3f\x6e\xba\xf0\xba\xf7\xb6\x42\xcf\x92\x90\x76\x8a\x81\x03\xae\x99\xcf\x04\xad\xec\xd9\xd4\xf3\x90\x5c\xc4\x71\x90\xdf\xf5\xf3\x34\x63\x94\x11\x36\xef\x90\x92\x56\xfb\x6f\xca\xf1\x0a\x7d\x0d\x71\x9f\xcc\xe7\x20\xfb\xc4\x38\x8c\x84\x41\x20\x58\xd0\xaf\x4c\x2f\xfa\xa2\x25\xed\x20\xc0\xd7\x7a\x4a\xff\xcf\x35\x79\xbb\xf3\x43\xe2\xa1\xa4\x08\x54\xb2\x2c\x3e\x46\x10\xaf\xaf\x53\xb1\x61\x48\x22\xec\x31\x11\xd7\x0c\x99\xc9\xe1\x3b\x70\xe5\xd8\x1b\xdd\x98\xc0\xc3\x98\xa6\x84\xba\xe4\x69\x7d\x08\xdb\x1f\x66\xd4\xa0\x82\xa0\x6a\x33\x4f\x88\xce\x70\xc7\x95\x8f\x8c\x01\xef\x13\x42\xeb\xce\xa7\x0e\x23\x61\x34\x78\x44\x56\xc8\xb7\xaa\x4e\xb3\xcc\xbd\x9f\x13\x97\x6f\xad\x42\x47\x33\x52\x99\x4f\x23\xae\x65\xfe\x54\xd4\x2b\x55\x3d\x4c\x81\x6b\x18\x09\x59\x2c\x70\x4d\xed\x36\xcf\xfb\x4f\x05\x23\x9b\x71\x89\x67\x70\x92\xc8\x25\xb8\xdb\xcf\xb6\xfb\xe5\xc2\xfd\x1c\x93\x14\xbd\xad\xf9\xe3\x62\x74\xf9\x38\xa6\xda\x1a\xa1\x8e\x40\x96\xd2\xc1\xc2\x0b\xe3\xc4\xb4\x48\x9d\x6b\xb9\x40\x69\x80\x9e\x1d\x0a\x13\x62\xba\xd9\x10\x12\xd0\xc1\x00\xfe\x6b\x54\xa6\x08\x13\xcf\x08\x46\x19\x91\x90\xe1\x76\xe9\x86\x30\x69\x0a\x27\x4d\x4c\x62\x39\x17\x11\x8b\xe1\x8e\x5b\x16\x9a\xea\x2a\x26\x09\x8a\x87\x57\xe3\x7e\x84\x38\x48\xfc\x1a\xce\x31\x0e\xb9\xcd\xac\x59\x25\xbf\x87\x02\x9b\x82\xe6\x57\xd7\x05\xce\x48\xd8\x98\x6e\x93\xf2\xc6\x3c\x6a\x13\x7d\x2d\x8f\xc7\xf6\xa8\x6f\x28\x7b\x5c\x27\xd7\xa3\xd7\x1e\x09\x25\x65\xbd\x2d\xcf\x92\x82\x3d\x37\xb1\x7a\x76\xb3\x5c\x72\xc3\xd7\x2f\x18\x68\x5b\x4c\x6d\xec\x25\x16\xdc\xac\xe6\x56\x6b\x85\x44\x1c\xa3\x5c\x22\xaf\xde\xfe\x69\xfb\x5c\xa7\x02\xb5\x50\x08\xd3\x6a\x62\x7c\xa9\x4d\x09\xf9\xf5\xf2\xdb\x78\x04\xb6\x6c\x01\xaf\x6a\xae\x2a\x89\x8a\x7b\xdd\xef\x28\x1f\x5d\xfc\xc6\xd6\x2d\xe0\x1d\xb2\xe2\x72\xee\x4a\x5d\x76\x90\xe4\xa1\xb4\xd0\x5b\x8c\x47\x2d\xf6\x74\xa5\xbe\xa5\xef\x90\xb7\xff\x6b\xf4\x61\x55\x48\xd1\x6e\x1c\xb8\x52\xcf\xa8\x75\x37\xfd\xc9\x14\x07\x74\x64\x0d\x54\x67\x5e\x72\x5d\x8f\xba\x26\x46\x26\x0e\x58\xe2\x3c\x95\x27\x5e\x99\x98\x13\x99\xda\xdc\x71\x10\x26\xc0\xb2\xa4\xe9\xf3\x22\x37\xd5\xec\xa2\xc4\x26\xc4\x9e\xad\xd5\x41\xe4\x9b\x16\x53\x3d\x87\xbc\x76\x99\x03\x77\x34\xf1\xb0\xf0\xf4\xc8\xcb\x0e\xbc\x33\x68\xa2\x6e\x06\x09\xed\x2b\xbb\xaa\xad\xce\x4b\xae\x46\x72\x16\xc3\xfb\xd7\xc0\xa4\x83\xaf\x2d\xff\x75\xc5\xca\x2e\x22\x91\xed\xef\x46\x84\x84\xe8\x46\xa8\x5b\xce\xab\xfa\xd6\xfe\x39\x92\x68\x15\x6c\x48\x6a\x12\x04\x96\x8d\xd0\x0d\x11\x1a\x8c\x89\xa9\x6e\x3f\x8b\xf2\x93\x84\x7e\xe4\x25\x01\x1a\x63\xc8\x20\x97\x03\xf9\xd6\xe6\x20\x30\x66\xb4\xea\x79\x5d\x1d\x1a\xab\x9f\xcb\x14\xca\xea\xe0\x11\xcf\x6b\xfe\xdf\x0d\xa4\xc4\x43\xf3\x68\x7c\xe1\x87\xb2\x78\x6b\x7d\x90\x88\x06\x8c\x7b\x86\x1d\xf2\x47\x61\xfd\x2d\x59\xa6\x97\x6e\x1e\xbb\x81\x91\x59\x9a\x39\x7c\x2c\xa6\x14\x03\xfe\x66\x51\xff\x3f\x8b\x18\x23\xdf\xa7\x0a\x83\xa7\xf4\x78\xaa\x83\xe8\xb7\xd1\xd1\x20\xa2\x36\x50\x7c\xd8\xcf\x91\xd9\xd3\xe5\xb6\x46\x29\xaf\xc1\x69\x41\x64\xf0\x1c\x8b\xf5\xcf\x97\x03\x22\x5e\x7e\xb6\x99\x81\x28\x88\x14\xd8\x3a\xc4\x0e\xac\xe3\x38\x50\x85\x6d\xc6\x70\x8e\x17\x98\x6d\x36\xdb\xf5\x8f\x65\xdb\xac\xdb\x5e\x43\x84\x9c\x4f\xf5\x35\xa2\x87\x33\x98\x64\x51\xa0\x42\x24\xb3\x43\x3f\xbf\x93\xad\x6b\x8e\x40\x48\xda\x08\xc0\x30\xe9\xba\x54\x44\x97\xfc\x8c\x02\x4d\x0c\xc7\xd7\xfa\x79\x33\x7b\xf9\xf3\x30\x7b\x7a\x5a\xcf\x51\x96\xcd\x8d\x08\xff\xff\xac\xfd\xd9\x72\xe3\xb8\x96\x3d\x0e\xbf\x4e\x5d\xf4\x05\x01\x0e\x00\x2f\x65\x59\x76\xba\xd3\xb6\xdc\x92\x9c\x59\xd5\x27\x3a\x14\x18\x36\x64\x1e\x53\xa4\x9a\xa4\xec\x74\x3d\xfd\x17\xdc\x00\x38\x89\x76\x56\x7f\xbf\xff\xc5\xa9\x3c\x61\x80\x14\x09\x62\xd8\xc3\xda\x6b\x49\xf0\xf0\xc8\x2d\x34\xed\x37\xc6\xa0\x5e\x7d\xf5\xb1\x5b\xac\x87\x9e\xc3\x68\xc7\x4a\x62\x25\x31\x68\x2e\xb4\xbe\x80\x2c\xb2\x20\x49\x82\x58\x0e\x6d\x93\xbd\xf0\x98\x82\xfd\x05\xd7\x29\x76\xb7\x88\xd5\xba\x11\xaf\x80\xfe\x73\xbb\xb1\xbb\x7c\xfd\x34\x20\x39\x8a\x14\x4f\x52\x8f\x09\x0b\x04\x42\x6a\x57\xcd\xcb\x20\xe2\xfc\xaf\xf0\x7f\x7c\x3b\x70\xf4\x6b\x91\x2b\xe6\x66\xb1\xec\x23\xee\x09\x33\x56\x13\xb3\xdb\x68\x2e\x4b\xe5\x5d\xcf\x94\xd8\xb0\x82\x1c\xc0\x8d\xbe\x34\x70\x92\x14\x18\x16\xfb\xf8\x84\xe5\xa9\x54\x2f\x18\xbe\x1b\xa2\x37\x12\x11\x26\x81\x2b\xde\x7c\x11\x95\x56\x53\x7f\x3a\x11\x69\x8a\x85\x8b\xaa\xd4\xb0\xfa\x85\xa8\xe3\xa2\xa7\x0b\x69\x3b\x48\x11\x61\xc4\xef\xf1\xda\x67\xd2\x7c\x93\x8c\x2d\x1d\xe8\xc6\x19\xe9\x56\x08\x7c\xee\x38\x4a\xb4\xe1\xda\x53\xf8\x95\x05\x9a\xd7\x53\x0e\x4d\xec\x05\x71\xe4\xe9\x28\xeb\xb3\x63\x85\x99\xc4\xf1\x5d\x5f\x20\x04\x61\x8f\x5b\xab\xb3\x2d\xbb\x60\x59\x02\xb1\x4c\xbc\xc3\xba\x5b\xe2\xb1\x3c\xf2\xf0\x13\x90\x16\x3a\x05\xcd\xcb\xf3\xf6\x7a\x5d\x09\xd5\xd9\x62\x09\x68\x86\x36\xe7\x55\x79\xf4\x38\x83\xc4\x24\x11\x2e\xbf\x43\x99\xeb\x0e\x23\x8e\x7f\xb7\x62\x36\xc2\xca\xeb\x8d\xc1\x79\x97\x51\xd6\xc4\x70\x8e\x38\xf4\x7f\x67\xb7\xe5\x19\x9f\x6b\x48\xbc\xd2\x76\x30\x09\x71\xea\x38\x97\x04\x62\xb3\x13\x87\x05\x5c\x84\x8e\x38\x6a\x08\x6f\x64\x01\x23\xd4\x86\x1c\x1d\xbf\xa9\xc5\x7d\xfc\x3d\x0b\x03\x6b\x7b\x87\x14\xb7\x85\xdd\x7f\x0e\xc2\x96\x8c\x24\xdc\x73\xc5\xfc\xb0\x9c\x11\x65\x35\xcc\x51\x30\xc2\xb9\xea\x79\x95\x86\x98\xc8\xc9\x73\xd2\xc0\x1e\x40\xfb\xa3\xf8\xd5\x55\x85\xf8\x02\xf2\xb6\x5d\xa4\x78\xb8\x1c\x90\x21\x6b\xed\x88\x59\xfa\x56\x4b\x09\x51\xc0\xfb\xf6\x2c\xb5\x9d\x67\x9f\xe5\xe4\x66\x0f\x57\x46\x55\x22\x89\x93\xc4\xac\x32\xd5\x74\x33\x9c\x85\x94\x70\x3e\x80\x73\x8b\xfa\x75\xe1\x10\x58\xf3\x63\x1e\xaa\x80\xd1\x0e\x51\x88\x53\x1f\x74\xcf\xa4\xcb\x02\x16\x05\x02\x67\xd8\xe9\x5c\x9d\xca\x1a\x06\x7f\xb6\x41\xa2\x5c\x64\xc7\xa7\x6a\xf0\x82\x11\x8d\x8c\xcb\x82\x5a\x9b\xaf\xac\x6a\xfb\x08\xbe\x43\xc8\x3a\x97\xc3\x16\xd7\xce\xa6\xb5\x58\xe4\xaa\xb5\x5d\x0d\xf6\x52\x9c\xee\xbb\xa2\xa5\xb6\x59\x05\x29\xe9\x4d\x4c\xdc\xff\xc9\x10\xed\xcb\x02\x16\x4b\x82\xf9\x0b\x2b\x1d\xf3\x50\x16\xa2\x52\x2f\x77\x45\x03\x55\xd1\x85\x0c\x58\xc2\x42\x2c\x91\x47\x52\xaf\xd6\xa2\x70\xde\xfd\xfc\xd7\x4f\x98\x65\xaf\x37\x59\x9e\x5f\x65\xfa\x13\xf7\x86\x25\x40\xad\xb4\x62\x56\xbf\x2a\xc4\x77\x8c\x6f\xc3\x62\x81\x1b\xce\x1e\x99\x89\x32\xe5\x74\x55\x67\xad\x41\xc6\xb8\x05\xb4\x63\x1d\x4d\x3d\xff\x83\x4c\x11\x0c\x82\x6e\xcf\x72\x8d\x6a\x86\x23\x7a\xb9\xc9\x0d\x79\x20\x98\xf0\x0a\x1f\x2f\x28\x7d\x48\xfd\x70\x70\x6e\xe1\xc9\x0f\xa2\x52\x90\x97\xdd\x9f\x4d\xe4\x0b\x70\xbf\xb5\x6b\x7a\x76\x70\x52\x62\x05\x71\x17\x5a\xdb\x5a\x6c\x27\xb6\xd6\x0b\xdc\xb1\x80\x89\x08\xd2\xc4\x7b\x43\xbf\x0b\x8b\xfb\x6b\x98\x40\x2a\x12\x5b\x6e\xbe\x1e\x56\x26\x75\xb7\x4d\x2d\x56\xf4\xa6\x2c\x75\xbb\xf0\xff\x11\xe7\x62\x7b\x9d\x91\x96\x9b\x2b\x2f\xeb\x19\x69\xf0\xc9\xc8\xc9\x38\x0a\x7b\x26\x2f\x87\xc5\x1b\x3f\xab\x14\x36\xdd\xfa\x23\xcb\xff\x1e\x6d\x63\x52\x53\x9c\x68\x50\x78\x28\x73\xdf\x62\xbf\xc7\xad\x37\xf7\xcb\x63\x6b\x61\x5f\x66\x9a\x98\xd4\xb6\xb8\xe9\xc1\xed\x3d\xdd\x3a\x55\x91\x09\x62\x57\x74\xb3\xc8\xf3\xbe\x8e\xaf\x6d\x4b\x24\x1a\xdb\xd6\x7f\xbf\x2b\x2c\x09\xf8\x52\x9c\x46\xd1\x7a\xa6\x58\x8c\x7c\x95\x75\xf6\xab\x79\xe9\x6a\xab\x59\xc0\x74\x14\x46\x83\x88\x70\x55\x1e\xcb\x65\xd6\x7c\x4c\xcb\xac\xc7\xc3\xa0\x63\x83\x51\x4e\x9b\xe7\xc7\xe5\xd9\x99\xff\x4c\x6b\x8e\x93\x6c\xb7\xb8\x5d\x2e\xb6\xdf\xfc\x9f\x81\x13\xac\x82\x12\x39\xa6\x6b\xa0\xaa\x44\x5e\xef\x31\x1e\xb6\x97\x1f\x7b\x31\x3b\xf3\x4d\x04\xca\x7e\x92\xf2\xdd\x01\xcb\x76\xf7\x4f\xdd\x7c\x36\x10\xe1\x49\xfc\xb0\xbe\xfe\xb3\xc3\x16\xb3\x80\x07\x29\x43\xdc\xb6\xb6\xe5\xe4\x17\xdf\x7d\x74\x46\x73\x42\x62\xb4\xe1\x33\x55\x16\xc3\x8f\xca\x89\x8e\xb5\x37\x58\xcb\x32\x5f\xbc\x1d\xbe\x89\x46\xbd\x0c\xa3\x3f\x9c\x86\xdc\xca\x1c\x3a\x1b\xf4\x26\xab\xea\x66\x68\xb0\x72\x9a\x04\x58\x05\xd5\x80\xb0\x1c\xa7\x34\x20\xbc\x6b\x94\x11\xb5\x23\x59\xd5\x80\x36\x91\x8b\x00\xf9\x76\x4d\x2d\x56\x0f\x3e\x97\x17\x74\x5d\xc3\xd8\x46\x80\xdb\x05\x32\x00\x0a\xf8\x8b\x2c\xd3\x18\xfe\xb7\xbb\xc0\xf1\x3c\xb8\x58\x9b\xc3\x27\x0e\x71\x91\xae\x67\x14\x19\xbb\xa7\x40\xa1\xaf\xc4\x8c\x6c\xba\xef\xc7\x23\xa4\x83\x93\x79\xf6\x0a\xfa\xb9\x68\xb2\x09\xd4\x8a\xc7\x11\xc3\x14\x72\xbb\x67\xdb\x4a\xd0\x7b\xf1\xfe\xd1\xbf\x6f\xcc\x13\x4c\x0e\xfe\x75\xfd\xcd\x46\x85\x1e\xbe\x82\xad\xf2\x38\xd5\x82\xfb\xe8\xed\x06\x9a\x73\xf5\x29\xfb\xab\xbf\xc2\xa9\xf1\x4b\x5a\x8f\xf3\x6b\x3c\xa1\x31\x2a\xee\xf6\x82\x41\xbf\x2f\xf8\x6f\x2f\x8b\x6d\x06\xff\x1a\x8e\xa5\xaa\x84\xfa\xf8\x51\x76\xb6\x17\x67\x89\xc2\x6f\xe2\xd1\x58\xf3\x07\x0f\x67\x92\xe2\x51\xbd\x2c\x0b\xe8\x27\x0e\x03\x4d\xd5\x80\x84\x6c\x0b\x30\xd9\x32\x38\x67\x36\x2c\x89\x1b\x72\x6b\xab\xd8\x47\xfe\x99\x35\x2f\xa3\x39\xc8\x85\xc4\xcd\xbb\xa3\x17\xed\x51\xe9\xe3\x27\x49\x21\x32\x4e\xcf\xe6\xea\xfc\xe1\x8d\xec\x3e\xe4\xc0\x45\x94\x7a\xc6\x8f\xf5\xc9\x33\x55\xc0\xc0\xdf\xe8\xec\x49\xef\x7a\x70\x49\x83\x14\xab\x84\xbe\x2f\xbf\x20\x82\x68\x3b\x86\xd6\xbc\xb0\xf4\x0c\x4e\xcc\xf6\x8f\x71\x97\x54\x63\x89\x4b\xbb\x52\x76\x2f\x15\xd4\x2f\x5e\x05\xa5\x6d\x34\x0c\xf1\xab\x36\x9a\x64\xcb\x92\x7f\x17\x88\x9d\x9f\x57\x8a\xa6\x68\x03\xff\x55\x9e\x6f\xb3\xb7\xcb\x0d\x64\x3e\x0d\x36\xfe\x36\xca\x48\xea\x53\x4d\x7e\xe9\xd7\x97\x5a\xc4\x2c\xe0\x3a\x50\xb8\x5d\x9d\x5d\x69\xf4\x40\x73\xbc\x6d\x4d\x8d\x95\x93\xa8\xca\xf3\x69\xff\x0a\x1f\x7b\xcf\xda\xd1\xbd\xb8\x16\x29\x26\xa6\x10\x7a\x3e\xb5\x5a\xc6\x63\xac\xb5\x41\x08\x97\x1d\xe3\xde\xbe\xe4\x10\x84\x18\x55\xd7\x03\x0d\x7d\x57\x0c\xdf\x4d\x23\x00\x5b\x81\xec\xa3\x85\x1d\x2c\xb9\x9d\x70\xdf\xca\xf7\x07\x51\x7c\x0c\x3c\x8b\xf9\x05\x63\x68\xea\x89\x96\xd1\xbb\xe8\xd4\x48\x7d\x3b\x4f\x23\x87\xd0\x58\xfd\xb9\x5a\x3e\xb7\x4e\xfb\xfe\x76\xb1\xdd\xaf\x7f\xac\x36\xdf\x56\x0b\x1f\x21\x4e\x83\x58\x2b\x18\x06\xee\x6d\x4a\xca\xb5\x12\x08\xbc\x61\xf5\x08\xef\x23\x5f\x7d\xfc\x40\x29\x4d\x42\xc4\x5a\xac\x6e\x6f\xb7\xfb\xdd\x7a\xff\x6d\xb1\x5b\x7e\xdb\x93\xab\xc5\xe3\xf7\x95\x77\x92\xd3\x30\xe1\x7c\xc0\x75\xf1\x53\x64\xcd\xe0\x18\x4d\xc3\x44\xa0\x37\x67\xf3\x3c\x6b\xd3\xfd\x5d\x48\x62\x2d\x59\x44\x22\x6f\x21\xcf\xe9\x7d\xa9\x46\x82\x9f\x2c\x48\x23\x6e\xe7\x9b\xc5\x15\x3c\x89\xfc\x11\x9a\x5e\x07\x66\xd6\x5c\x49\x23\x4d\x89\xe3\xca\xb5\xa5\x37\xeb\x7e\xd2\xa4\x09\xb1\x10\xb6\x03\x58\x4f\xdb\xc9\x73\xac\xbb\xe1\x49\x64\xa2\x6c\x56\xc1\xf2\xc7\xcc\x95\x28\xb2\x20\x65\x81\x15\x81\x42\x5f\xe0\x1a\xf0\x2d\xc6\xc4\x80\x2c\x48\x79\x08\x69\x17\x03\xbf\x2a\x45\x75\xa1\x89\x31\x79\x74\x1e\x01\xee\x08\x32\x3b\x5c\xe5\x59\xa1\xbb\x1b\xc5\x20\x13\x5f\x85\xe0\x36\xa8\x0b\x2a\xb0\xc9\xad\x84\x1e\xb1\xca\x0e\xfc\xc2\x94\x83\xad\xaa\x3b\x40\x73\x93\x15\x3e\xaf\x31\xd4\x42\x77\x1d\xd3\x48\x86\x9e\x54\xc0\x16\xee\x66\x32\x87\x6b\x68\x44\x96\x4f\xac\xfb\x54\x84\x09\xb8\xe9\xfb\x80\x59\xa7\x07\x98\x9e\x97\xa9\x88\xc3\x38\xed\x16\xb4\xe3\x5b\x99\xea\x77\xb1\x20\x95\xca\xc6\x53\x16\x45\x93\x35\x9d\xc2\xf1\xef\x0d\xdb\x54\x02\x0d\x92\x41\xe2\xd1\x55\x06\xd6\xad\x99\x32\xe3\xdb\x8f\x02\x7d\xa9\x52\x04\xe7\xea\x23\xbc\x2f\xcf\xa7\x4f\x16\x85\x32\x1c\x11\xef\xb5\x70\x82\x24\xf5\x8f\x76\xde\xfb\xa1\xd5\x5c\x61\x66\xe4\x7a\xfb\x74\xbf\xdb\x2f\xfc\x9f\x21\x01\x1d\xf5\xa5\xf5\x77\x1a\xf9\x17\xbb\x56\x21\x10\x39\x71\xcc\x0a\xf7\xc8\xa0\x87\x7e\x7a\x0a\x4a\x86\xae\x22\x46\x23\x05\x73\xfd\x32\xdd\x2c\x53\x30\xd4\x25\x26\xbb\x4a\xbe\x2f\xfd\x8b\xd4\xc4\x4a\x39\x98\xcb\x75\x86\xb8\xc2\xc9\x57\x30\x89\xa1\x83\x9a\x90\x3d\x49\x47\x67\x4e\x6a\x78\x84\xfa\xa1\x68\xf7\x6d\x9b\x4a\x34\x70\xf0\x51\x1a\x11\x04\x04\x07\xe2\x54\x95\xff\x06\xd5\x38\x65\x92\x1b\x91\xe5\x5d\x0f\x22\x43\x57\xff\xd1\x85\xa6\x2e\x13\xbf\x22\xa0\x51\x62\x8b\x2f\x9e\xca\x62\x52\xe7\x20\x82\xc4\x06\xb5\xdb\x3d\x53\x14\xaf\x2e\xc1\x60\x0b\xdc\xff\x18\x06\x61\x45\x6b\x91\x92\x21\x36\x7e\x3c\x7c\x22\x50\x91\xa7\x10\xb9\xca\x0a\x4f\x28\x34\x57\x2b\x23\x02\x43\xf0\x38\x2e\xce\xc7\xe5\x8b\x38\x42\xf3\xb7\x63\xf7\xf5\x6f\x46\x22\xcb\x06\x8b\xc6\xc2\xf1\x74\x11\xea\xf8\x2a\x08\x3e\x64\xc3\x3d\x0f\xac\x52\x41\x25\x8f\xec\x38\x1c\x0e\x39\x38\xf4\x22\x32\x34\xf8\x9f\x8d\x8c\xc2\x3d\xd5\xf6\x68\x3f\xd9\x8f\x0c\xde\x7f\x66\x85\x2e\xdf\x27\xe3\x96\xa8\x48\x0e\x77\xb9\x91\xfc\x02\x0b\x04\x93\x21\x20\xeb\x32\x96\xda\xac\x6a\x4b\x1d\xfd\xf5\x84\x12\x0c\xa8\x57\x3e\xb8\x3a\x17\xc5\xe4\x03\xf0\x24\x48\x3b\xb9\xc3\xba\x3c\xc2\xba\x79\x81\xaa\xa3\x8f\x6c\x7b\xa4\x29\x1f\x94\x66\xf9\xc3\xf6\x6b\xf3\x5e\xa4\x31\x51\x56\x3d\x32\x3b\x2d\x45\xed\xb3\x3c\x42\xa8\x20\xee\xc2\x3c\x98\xca\x02\xed\x30\xf6\xf5\xd5\x04\x9e\x22\x24\xb5\x1b\xd3\xc3\xe2\xcf\x7d\xcf\x9d\xef\x55\xdc\xb0\x03\x47\xa4\xba\x95\x4c\x5f\xfd\x2f\x25\xf6\xab\x52\xf2\x1f\xa3\x7f\xbb\xd7\x95\x5c\x0a\x97\x45\xd1\x99\x33\xe9\xfd\xcd\xda\xc1\x4f\x7d\x9a\x22\xa4\x93\x6f\xa3\x12\xab\x28\x76\x70\x75\x13\x39\xfa\x2b\xf7\xa2\x38\x9c\xc5\x01\x3a\x45\x9d\xb6\x67\xca\x30\x03\x6e\x61\x89\xd1\xde\x3e\xdc\xad\xa8\x9f\x5b\x03\x91\x05\x01\x9e\x39\x75\xd7\x5d\x24\x68\x06\xb6\xe7\xde\xf3\x69\xd5\x1d\x2f\x42\x49\x40\x27\xb8\x5d\xc1\x7b\x1b\x0b\x9c\x3e\x13\x08\x9c\x0f\xe7\xd3\x04\x88\x26\x74\xa0\x30\xeb\xa5\x21\xef\xb4\xd2\x06\xad\x3c\x46\xf7\x3f\x2b\x4c\x27\xf1\x41\x7c\xfe\x56\x00\xb7\x1c\x38\x96\x3c\xf5\x11\x7e\x21\x99\x78\xd7\x9a\x52\x4d\x51\x95\x7f\xc2\xb0\x85\x6d\x29\xe6\x37\x4f\x67\xf9\x1d\x3e\x7a\xed\x8e\x01\x3e\x40\x80\x32\x09\x19\x33\x65\xcf\x91\xc2\xb1\x40\x06\x3a\x42\xd4\xe7\x6d\x07\x88\xbc\xab\x1f\xcb\xe6\x06\x79\x76\x10\xda\xd1\x3a\x50\xc3\x1d\x59\x12\x9d\xea\xa8\x87\xe9\x2d\x45\x51\x16\x99\x12\xf9\x4d\x59\x1d\x45\x33\x7c\x0e\x49\x63\x2b\xb3\x7c\x3a\xd7\x2f\xcb\x3c\x1b\x12\x80\x8f\xa6\x8c\xa4\x22\x44\xc8\x81\x2d\x33\x2b\x2f\xb0\xce\x92\x82\x41\x6b\x68\x55\x34\x55\x79\xfa\xd8\x8d\x38\xcc\xdb\x76\x63\x6b\x51\xa4\xcd\xdb\xf4\x5f\x58\x86\x32\xe8\x69\xef\xab\x0c\x6a\x47\x37\xea\x9b\x15\xc3\xea\x16\xd4\xf2\x83\xbc\xb4\x34\xff\x23\x25\xc8\x2f\xeb\xc0\x64\xa8\x13\xe4\x77\xa8\xb3\x43\xd1\xe1\xcb\xfb\x07\x0f\xb5\x4c\x8c\xff\x14\x59\xb1\xf8\xcc\x51\x96\x51\xac\x30\x6a\x80\xfc\xb3\x37\x55\x89\xd5\x2c\xe3\x2e\x31\x8b\x30\x2b\x63\x75\xa0\x1a\xba\x3f\x95\xdd\x7b\xc4\x9c\x88\x21\xa6\x65\xb4\x6f\xcb\x24\x60\x49\xe0\xf9\xfa\xdb\x43\x78\x48\x17\xc7\x02\xc9\xe2\x34\x19\xab\x6e\xd5\x5d\x93\x49\x4d\xd8\x23\xc0\xb2\xe2\xe0\x08\x26\x66\x4e\x2c\xc9\x03\x8d\x87\xd2\xcf\xe5\xc3\xca\xdf\x80\xd3\x20\x71\x8b\x1a\x43\x5c\x1b\x30\x77\x85\x2a\x8f\x97\x03\x3c\x7e\x5b\xae\x6d\xe9\x61\x2d\xde\xe0\xa1\x3e\x5c\x39\x5b\x7e\xc6\x4b\x94\x82\x10\xb4\xf8\x4e\xa3\x78\xb0\x14\x61\x18\xa6\x3d\x65\xc6\x40\x0e\x66\x3c\xfb\x84\x0c\x51\x2e\xb7\xfe\xa8\x1b\xe4\xbc\xea\x89\x42\x1f\x3a\xd3\x51\x0a\x6d\x45\x6b\x2d\xf7\x81\x15\x00\xec\x0b\x7a\x27\xcb\x54\xca\x88\x61\xc1\xe1\x51\xbc\x02\x22\xe7\x7e\xeb\x75\xce\xee\xf1\x52\xc5\x14\xd3\x5c\xa7\xaa\x6c\xa0\xb7\xc5\x67\xc6\x5e\x6b\x82\x6c\xd0\xc8\x0d\x0f\x7b\x64\xd7\xda\x6b\x50\xd9\x51\xe4\xf5\xde\x08\xd5\x27\xc0\x24\x44\xc6\x78\x48\x19\xd2\x0f\x3d\x17\xa2\xcb\xb3\x6c\xa1\x79\x12\xea\x55\x74\x56\x9a\x84\x38\x41\x6d\x93\x5d\xd5\x9e\xe9\xfe\x8f\x09\xc1\x8c\xf3\xe2\x74\xca\x1d\x3c\xf9\xae\x70\xc6\xce\xba\x1a\x42\x2f\xfc\x05\x3c\xc5\x94\x0b\x22\x1b\xf1\xf1\xa1\xde\x95\x17\xb5\xdd\xbd\x8d\xda\x5d\x27\xf0\x70\x2c\xdf\x0b\xc0\x58\xef\x27\x2b\xc8\x30\x89\x91\xe6\xbd\x63\xda\xd9\x1b\xf8\xcd\x1c\x53\x81\x4c\xba\xd0\xc5\xfb\x34\x94\xa2\x02\x15\x13\xdc\xe0\xb3\x0a\x14\xca\x62\x0c\x21\x43\x2a\x30\x09\x77\x05\x90\x83\x31\xd8\x36\xfd\x71\xa7\x48\x10\x23\xef\x70\x23\x5e\x61\x54\xc5\xa7\x08\x27\xa9\x27\xe5\x77\xb4\xbb\xe3\xd5\xae\x08\x8f\xd1\x8c\xbc\xb9\x5f\x2f\xbf\xfb\xcb\x42\x22\x4c\x9f\xea\x3e\x9e\xaa\x6c\x4c\xf9\xd1\x76\x09\xad\xe7\xe2\xc5\x3c\x6b\x57\x48\xa9\xa7\xfd\xe2\x34\x26\x9e\x39\xa5\x12\xb9\x4b\xa6\xb4\x0e\x7e\x8f\xb0\x54\x51\xc0\xd1\xbf\xdf\xb7\xeb\xbf\xfd\xd1\x2f\xdc\x66\x15\x45\x1c\x01\x32\x68\x3a\x3d\x66\x9d\x5a\x98\x6f\x4e\x23\x7c\xf8\xc5\x6e\xd9\xdd\x5e\x01\x75\xb4\xbe\x0e\xc6\xfa\xc7\x2c\x3a\xdb\x77\x37\x96\xea\xed\xe1\xee\x71\xbf\xfd\xb6\xd8\xac\xf6\xeb\x9b\xfd\xd3\xfa\x67\xe7\x94\xab\x38\x06\xaf\x7f\xec\xb6\xab\x27\x91\x55\xcb\x73\x53\x1a\xf3\x29\x13\xb2\xbf\xd6\x30\x9c\x68\xbb\xd5\xe2\x61\xbf\x5c\x3c\xee\x97\xf7\x8b\xbb\x87\xfd\xe2\x66\x37\xb8\xbf\x51\x96\x87\x36\x07\x51\x59\x2c\xa5\xdf\x2a\x55\x92\x06\x56\x06\xed\x9c\x37\xd9\xfa\x1d\x23\x65\x9f\xcd\x6a\x95\x08\x69\x62\xaf\xce\xba\xc8\xf3\x4e\x2e\xb4\x6d\x93\x14\x01\x0d\x05\xbc\x0f\x0c\xfa\x8b\xcd\x41\x31\xa0\x61\xcf\x27\x8f\x62\xde\xe7\xb1\xc5\xae\x78\x90\xb8\xb2\x7a\xfb\xe1\x1c\x4a\x63\x92\x9a\x1d\x8f\x03\xa7\x31\xe6\x48\x7a\x72\xe3\xed\x67\x88\x51\xc5\xc3\x10\x89\x12\xc4\x80\xad\xe5\xb3\xae\x91\x45\xc0\xdf\x66\xa6\xb9\x75\x0a\x1d\xff\x5c\x1d\x74\xfc\x56\x49\xec\xd3\xbb\x8f\xf0\x3e\xd2\x0d\x6f\x5b\x0d\x17\x7d\xd6\x06\xc3\xef\x36\xb9\xe2\xda\x53\xd0\x12\x85\xa0\x76\xcb\x0d\xe4\xe2\x63\x37\x74\x91\x5d\x1f\x11\x29\x8f\x98\xb9\xcf\x8a\xd7\x8b\xec\xf3\x64\xc8\x44\x12\x45\x96\x77\xb9\x6c\x6d\xfb\x07\x68\x5e\xca\x4f\x8b\x40\xdc\x35\x12\x34\x6e\x0e\x76\xc3\x5e\x8a\x3c\x97\x42\xbd\xde\x8a\x7a\x98\x4d\x50\x2a\x06\xc4\xcd\xbd\x1e\x1a\x1b\x29\x5c\xb6\xce\x66\x5f\xb8\xa3\x94\x4e\x31\x8b\xf2\x22\xea\x17\x18\x9f\xeb\x4a\xf3\x14\x4b\x36\x96\x9b\xfb\x13\x54\x0f\x99\xaa\x4a\xe4\x67\xe8\xda\x53\x89\xc0\xbd\xdb\xa7\xcd\xf5\xf6\xbf\x86\x16\x95\xd2\x22\x0e\xfb\x9a\x06\x2b\x61\x37\xfc\x36\x63\x5f\xad\x7f\x2b\xad\x8d\x27\x7a\x58\x60\x16\x61\x06\x02\x35\x3f\x1e\x10\xb0\x24\x1e\xe7\x9d\xfc\x9e\xf0\xf5\x40\x42\x1a\x68\x87\x56\x31\x59\x75\xf4\x44\xe2\xbe\xd5\x31\x44\x1d\xa0\xf9\x91\xd5\xc2\x0e\xee\xd7\x4f\x62\x58\x8c\x22\x67\x59\x8d\xe0\x01\x97\xbe\xbb\x29\xab\xbb\x42\x67\x6f\x99\x3e\xf7\xfb\xa3\x11\x82\x5b\x5e\xea\x3c\x07\xed\x9c\x9d\xf9\x39\x62\x84\xc4\x32\x56\xf5\x22\x2a\x84\x9f\x2f\x0a\x8d\x81\xbf\xe6\xe5\x4b\x08\xa8\x0e\x08\x4f\x88\x97\x17\xde\x42\x33\xcc\xc6\xf9\x2e\x34\x49\x9d\xc5\x8f\x4c\x56\xd3\x5a\x32\xdf\x8d\x59\x41\x39\x61\x8b\xda\x07\x11\x3b\x1d\xf0\x08\xa3\x3b\xdb\xac\x38\x9c\x73\x51\x5d\xef\x7e\x60\xc0\xcd\x0c\x84\x55\xdb\x6e\x2a\xc6\x1c\xfb\x6a\xfd\xfc\xb8\x5c\xf5\x7f\x55\xbe\x10\x69\x95\xa3\x28\x4e\xeb\x7f\x8f\x0f\x1c\x4d\xa8\x0a\x89\xdf\xf1\x9e\x00\xaa\x91\x25\xae\x49\xc8\x07\xb9\xd6\x95\xc6\x42\xc6\xcb\x48\x9a\x26\x4c\x60\x46\x29\xab\xaf\x2b\xf1\x7e\x11\x0a\x9d\x8c\x1d\x49\x05\x52\x49\x64\x0d\x1c\x97\x68\x07\xda\xca\x89\xfa\xe7\x0b\x14\xe3\xd4\xbf\xbf\x42\x69\x04\x7c\x54\xa2\xd0\xe5\x71\xe8\xfa\x68\x02\x96\xbd\xf0\x98\x15\xad\x55\xf5\x13\xb2\x41\xea\x51\x53\x6a\x88\x9b\xf9\xc3\x12\x5f\xdf\x1a\x8b\xd4\x74\x2e\xa8\x85\xd1\x6e\x9b\x6a\x1a\x8d\xd1\x94\x11\xd1\x09\x83\x77\x7a\xf8\xbe\x31\x0d\x90\xab\xc4\xa2\x91\xa0\x33\xa3\x7c\x7b\xc8\x38\x09\x9c\xd5\x59\xd5\xa3\x67\x6f\x47\xb7\x67\xd2\x7d\x10\xc5\xc7\x53\x55\xfe\xca\x06\x54\xa5\xb3\xb3\x56\x47\x9a\xd8\x9a\xe1\xcc\x34\xad\x5f\x36\x5d\x39\xc3\x7d\x59\x47\x9a\xe1\x00\x9d\xda\xc5\x7b\x0b\x45\xe0\x7f\x3d\x0e\x25\x7a\x61\xa6\x0f\xed\xea\x38\xa2\x28\x3c\xf8\x43\x14\x8d\x38\xc0\x70\xf7\xd1\xb1\x00\xeb\xcf\x9d\xab\x49\x39\x83\x4e\x02\xa1\x4d\x07\x0e\xb8\xca\xf4\xd0\x62\xf0\x31\x23\x9d\x24\x09\x06\x16\x75\x35\x52\xb8\x68\x5b\x52\xab\x8b\x63\x15\x9e\x57\x9a\xc6\x31\x49\x5b\x83\xd7\xab\xce\xb8\x7e\x2c\x80\x54\x7a\xcf\x0d\x49\x78\x7b\x9c\x8c\x66\x54\x27\x61\xc7\x5e\xf8\x94\xfd\x82\xbc\x6f\x4b\x2c\x61\xba\x14\x75\xa6\xae\xc5\xc7\x18\xa5\xa2\x99\x08\xb0\x46\xbd\x33\xb8\xbf\x7f\xa8\x29\x1b\x8e\xe6\x24\x41\xe5\x99\xfb\xf2\xb0\x1d\x1d\xe8\x9a\xa7\x24\x16\x17\x56\xe7\x64\x8c\xd2\x08\x74\xe0\x49\x07\x73\x3d\x06\x6d\x4f\x56\x48\x6a\x98\xad\xec\x6f\xf7\x84\xbb\x06\x8e\x1b\x61\x0c\x16\x33\xfd\xfd\xd9\x86\x24\x93\xd4\x6a\x03\x89\x5f\x7d\xad\xa7\x96\x92\xf1\x76\x4c\x16\x0f\x57\x8b\xed\x76\x71\xbd\xde\xec\x77\x3f\x3d\x4e\x4a\xab\xc8\x8a\x3a\x7a\x18\xe4\xf7\xcd\xdd\x64\xe1\xb5\x76\x47\x97\xb9\xbc\xee\x52\xae\x3a\xeb\x6e\xc1\x13\x4c\xfd\xaf\x16\x9b\xfb\xbf\xf6\x37\xeb\xe7\xc7\xeb\xd5\x66\x3b\x88\x55\x69\x4d\xad\x46\xa3\xe5\xe4\x5b\x38\xb2\x97\x71\x0c\xdd\x77\x05\x19\x58\xbd\xc8\x87\x51\x41\x9c\x06\x02\xa1\x1b\xbb\x76\x34\xf0\x7f\xd3\x3d\x02\xb8\xc2\x78\xb9\x05\xb5\x8c\xe6\xdf\xe0\x70\xf4\x0e\xa6\x06\x61\xb3\x90\x4d\x76\x04\xaf\x83\xc3\x02\x6d\x22\x6b\xcd\x5a\xf3\xed\xea\x5c\x15\x57\x25\x02\x39\x66\x4f\x25\x08\x84\x74\x40\xb0\xe6\x5c\x39\xee\x8f\x23\x52\x35\xab\x73\x55\x0f\x72\x92\xbe\xbf\xd4\x09\xf1\x9e\xfb\xb9\x6e\x40\xb7\x2e\x0c\x60\xd9\xe5\x78\xd3\x01\xc2\x13\x64\x22\xb1\x9e\x32\xba\xe7\xa7\x1c\x9c\x7c\xbe\x9f\x55\x10\x52\x81\x33\xd7\x74\x80\x06\xf4\x87\xc6\xf3\x1b\x42\xa5\x70\x7d\x65\x45\xd6\x3c\x64\xa2\x6c\xff\x37\x0b\x62\x82\x28\x52\x18\xdf\x1e\xb0\x74\xfb\x16\xc9\x11\xd4\xd7\x7a\x1d\x57\xe7\x8f\x0b\x78\x9e\x1f\x59\x88\xa5\x41\xac\x0b\xea\xa0\xfd\x28\xa7\xe9\x14\x48\x24\xc5\x78\x63\xbb\x21\x3e\x89\x8f\xd6\x22\x77\xd6\xe2\x4c\x3d\x2d\x24\x3a\xc4\x1d\x09\xde\xca\xfc\x0d\x30\x24\x54\x2e\xde\x44\x23\x2e\x2b\x22\xbf\xb4\x48\x80\x11\x40\xd8\x1f\x62\xa6\xf1\x1c\xd9\x02\xe8\xf6\x3d\x6f\x45\x7d\xa1\xdb\xd8\x5e\xc0\x42\x2f\xa8\xb8\x3d\x81\xca\x4c\xa6\x50\x0f\xb4\xfa\x07\x22\xb6\xee\x16\x9c\x09\xc4\x37\x1f\x4b\x37\x13\xb8\x6f\x50\x44\x7a\x80\xc5\xde\x7e\xd9\x5f\x8f\xf0\xee\x13\x72\x8b\x42\x5b\x40\xbb\x1f\x7c\xae\x6d\x70\x00\x57\xc5\xb7\x19\x0e\x6c\xd7\x2f\x15\x09\xa1\xc8\x08\x5d\x65\x83\x1c\x1b\xa4\xc6\x24\x41\x37\x99\xae\xce\x1f\x63\xcd\xd1\xf1\x4d\x84\x20\x78\x62\xf4\x24\xc8\xdd\xd7\x10\x90\xa0\x45\xd2\x54\xe2\x0d\x6c\xdd\xdf\x4a\x54\xc5\xe0\x49\x65\x62\x51\x6a\x35\x34\xdb\x63\xdd\x07\x63\xb2\xb2\xe8\x9c\xde\x3e\x42\x02\xd2\x70\x7f\x40\x3f\x17\x8d\x5d\x12\x28\x17\x0a\x39\x1c\x46\xf3\x61\x0a\xcd\x74\x2a\x02\x2c\x00\x1d\x08\x0f\x00\x1a\xd8\x6d\xbe\x91\x24\x48\xc0\x56\x56\x07\x51\x64\x7f\x43\xe5\xe3\xbd\x00\x71\x1c\xab\x6e\xed\x7a\xbf\x71\x3c\x14\x90\xda\x62\x46\x1b\x82\xb4\x99\xc4\x4d\xaf\xb1\xcb\x02\x30\x24\xc2\x60\x65\x6b\x8d\x4e\xae\x36\xad\x43\x4f\x2c\xae\xa4\x0b\xdc\x98\x40\x1b\x64\x9b\xf0\xac\xf1\xd6\xe2\xfa\x6f\x38\x9d\x20\xef\xe3\x28\x83\xac\xe0\xf8\x9e\x84\x53\x24\x3b\xc6\x99\xf0\xb4\xea\xdd\x60\x43\xb8\xc4\xad\xf8\xb9\x40\xd8\xc5\x60\xff\x34\x24\x4d\x31\x78\x9d\x15\x7a\x7c\x2a\x99\x90\x69\xac\x2c\x6a\x4d\xca\xa7\xb2\xf4\xab\xdd\x44\x8a\x60\x08\xd5\x3a\x42\xff\xd5\x2e\x65\x14\xd6\x73\xcd\xb1\x64\xa4\xb7\x5c\x06\x6c\x7e\xb3\x06\x8b\x89\x75\x88\x83\xf4\xd3\x6e\x2a\xbb\xd2\x65\x42\x27\xe3\x95\x44\x96\x3d\xe3\xe7\xb7\xf5\xdd\x76\xbc\x31\x99\x24\xb6\x98\xde\xfd\xd1\xd2\x49\x8f\xbd\xda\x49\x5f\xa1\x48\xdc\x61\xc9\xed\xb6\xe2\xc4\x6e\x3e\x71\x16\x4d\xa2\x52\x3c\xa5\x1c\x47\xc1\xcf\xd5\xdd\xf2\x5c\x37\xe5\x71\x5e\x13\x86\x05\x86\x05\xb1\xc4\xca\x6e\xf4\x1c\xc6\x86\x9d\x61\x11\xa5\x1d\xe0\x69\xb1\xbb\xc0\xd3\x5c\xe6\x8a\x0d\x4b\x25\x6f\xe7\xe9\x76\xe5\x8f\x67\xc3\x03\x4e\x2d\x8f\xae\x27\x84\x1e\x3f\x02\x8f\x99\x2f\xfe\x7c\x7a\x11\x35\xac\x6c\xc1\x99\x25\x06\xfc\x9a\x34\x6f\x70\x13\x6d\x83\x33\x5d\x68\x6a\x40\xb8\xe3\xba\xa4\x2a\xa0\xc4\x93\x39\x3c\x89\x4f\x22\x1f\x46\x24\x89\xb6\x42\x57\x9d\x19\xb5\x14\x75\x56\x5c\xf2\x74\xd9\xd7\x9f\xac\x67\x77\x17\x69\xac\xd8\x5c\x79\x82\xe2\x56\x1c\xb1\x9c\xef\xb1\x9c\xb0\x00\xb3\xc0\xe8\x90\x29\xe3\x2d\x93\xfe\xe0\xed\x26\xb6\x86\x10\x61\x59\xc7\xb3\x85\x37\xa4\xf6\x71\x53\xff\xb4\x40\x52\x3c\x0e\x10\x91\xd9\x9c\x25\x46\x8f\xfb\x7d\xcc\x98\x24\xa4\x43\xdb\x68\x77\x2e\x7a\x36\x10\xdf\x07\x62\x74\x8f\x8e\xa5\x87\x70\x92\x20\x60\xb6\x24\xc6\x55\xf6\x0e\xfc\x39\x12\x04\x22\x02\x97\x52\x5c\x38\xe2\xdb\x0b\xa1\xd0\xb9\xb1\x25\x01\x4d\x04\x66\xc7\x57\x7f\x3e\xad\x96\xbb\xd5\xb5\x2d\xc3\xf4\xf7\xa5\xd2\xaa\x47\xbc\xc1\x54\x91\xba\x6d\x54\x04\x09\x2f\xb7\x8d\x28\xb4\xa8\xf4\xfe\xd2\xf2\x22\x01\x35\x2c\xb2\x72\x63\x4a\xe4\xca\xee\x2d\x7d\xc4\x83\x04\x21\x93\x88\x62\x31\xb9\x38\x3c\x6f\xa7\x09\x72\xdf\x29\xa5\x98\x10\xba\x7a\x5e\x0e\x76\x1f\x12\x44\x82\x44\x2e\xf7\xf9\xe8\xd8\x8c\x2d\x81\x46\x67\xc7\x90\x20\x4e\x04\x06\x5e\xac\x08\x24\x06\x44\x30\xea\xe2\xa8\x22\xc6\x3f\x94\x90\x30\xe5\x3e\x7d\x91\x43\x77\x93\x24\x24\x54\x8d\xa1\x46\xba\xea\x1a\xa5\x8e\x9c\x78\x66\xaf\x55\xfb\x31\x22\x47\xf5\x3d\x95\x46\x7c\x0b\xf2\xfc\x78\x0d\xc2\x0b\x28\xde\xc5\xba\x1a\x3f\x23\xa3\x1c\x85\x07\xec\x0e\xb9\x6f\x5a\x33\x67\xa4\xc5\xd8\xf6\xd1\x4c\xb8\x47\xea\x6c\x76\x12\xa4\x01\x47\x60\x3f\x0a\x84\xec\x5e\x2a\x80\x01\x48\x90\x04\x29\x17\xc8\xe7\x88\x76\xee\xb6\xf1\x10\xe6\xb6\xc1\x0a\x8b\x58\x94\xe1\x60\xd3\x19\xbf\x9d\xd0\x16\xe1\xdb\xfa\x21\xa2\x51\x2f\x59\x71\x58\x1d\x0e\x43\xce\x15\xd7\x51\x52\xed\x59\xd2\xdd\xa1\xb1\x69\x77\xd2\x69\x2f\x13\x52\x4b\xc9\xde\x9a\x2e\xd0\x61\xcd\x26\xdd\x54\x62\x59\x6b\x5d\xe8\x4a\x9c\x6e\x72\x37\xee\xdd\x68\x28\x29\x6c\x76\xb6\x76\xd9\xac\xf5\x1b\x54\x55\xa6\x61\xce\x52\x25\x81\x4e\x04\x9a\xd2\x67\x1b\x32\xe8\x64\x32\xfc\x70\x68\x63\x51\x70\x59\x8d\x76\xac\x3e\x4e\xae\x87\x58\x53\xd3\x69\x8c\x4d\x77\x3d\x12\x80\x96\xd6\x6f\x77\xe7\x74\x31\x0c\x8d\x90\x00\x20\xb1\x80\xd2\xf5\xed\x6a\x34\xdb\x4d\x98\xda\xe2\x7f\xad\xf7\x60\x23\xc5\x83\x8d\x9e\x04\x06\x12\xc3\x7d\x5e\xcf\xee\x2d\x23\x93\x85\x04\xc6\x28\xd6\xf3\x1d\xef\xaa\x4c\xc2\x80\x08\x97\x90\x80\x70\x0c\x2c\x5d\xbf\x88\xea\xd8\x5b\x79\x84\x04\xdc\xd1\x8c\x56\xbf\x07\x54\x8e\x5e\x96\x04\x0a\x2c\x85\xc5\xc7\x06\xcc\xd0\xc0\x21\xed\x9b\x22\xa9\x9f\x9d\xc8\x3e\xae\x7b\x57\xd4\xcd\x28\x3c\x36\x1a\x5c\x42\x84\xc4\xe2\xef\x2d\x20\x17\x39\x12\x54\xcc\xff\x32\x01\x6d\x61\xa7\xe5\xe9\x49\x7c\x0c\xdf\x26\x8c\x0d\x77\x52\xf7\xed\x34\x3f\x41\xf7\x48\xa1\xb6\xc9\xc1\x53\xa6\x5e\x6f\xca\x41\x50\xf7\xb7\xaa\x1a\xed\xc5\x10\x83\xd3\x48\xd5\xdf\x2f\xeb\x85\x3f\xb9\x2a\x0a\x52\x9c\x4d\x0f\x77\x8f\xfb\xd5\xee\xdb\xfe\xe6\xf9\xf1\xda\x3f\x4e\x14\x47\xdc\xc2\xbc\xe4\x39\xcb\xb5\x8b\x75\xf6\xd0\x08\x42\x22\xa6\x91\x46\x7d\xbb\xdb\x2c\x91\x02\xb8\x6b\x10\x29\x3a\xad\x1e\xaa\xb9\x71\x89\x9f\xf1\x5c\x25\x91\x22\xa1\x47\x76\xef\x2e\x64\x00\x18\x21\x71\xa2\x50\x8f\x79\xf7\x82\xfa\x41\xfe\xf6\xb1\xe2\xc8\xa8\xfd\x4b\x8b\xa9\x02\xde\xd0\xfa\x68\x3b\xa6\x58\xb6\x74\x85\xa5\xf6\xe3\x7b\x27\x24\xf5\xb2\x9f\x4f\x67\xb9\x9a\xf0\x91\x10\xc2\x22\x8e\x27\xa9\x53\x29\x40\x55\x90\x45\x33\xb3\xb1\x12\x16\x5b\xbd\xe6\xbb\xc7\xd5\x9f\xc3\x35\x43\xb8\xe1\x58\x21\x90\xa9\xd2\x13\x94\xbb\x96\x34\x0e\xc1\xad\xd2\xd6\x1a\x98\xdd\x0a\x48\x2a\xa2\xd4\x31\x94\x5e\x35\x0a\x0f\xae\xf9\x93\x83\xa4\x8a\xe3\x38\xf9\xf1\xde\x6e\x9f\x9c\xb8\xe2\xfc\x3c\x96\x11\x67\x64\x88\xa3\xf6\xae\xd3\x7c\x40\x80\x10\x69\x52\xe9\xa9\x57\xba\xec\xed\x65\x6a\xb8\xed\x28\x30\x53\x89\x7c\x7b\x84\x2a\xcb\x49\x60\x6d\x77\xff\xf2\x8a\x5a\xe2\x12\xc4\x26\xd7\x4e\x09\xbe\xf7\x87\xfa\x9b\x29\x61\xa2\x60\xf8\x5a\x0d\x9c\xc2\xc9\xab\x2b\x69\xb3\x27\x4f\xa2\x6a\x3e\xc6\xe9\x19\x42\x74\xfb\x40\xe8\x65\xff\xf1\x05\x69\x10\x21\x3a\x8a\x82\x1e\x03\xed\x4b\x4a\xa6\x7b\xcd\xe0\xc9\x74\x12\x75\x11\x3b\xd1\x3c\x8a\x63\x77\x5a\x13\x93\x84\xd2\x5a\x70\x57\xf6\x8d\xfe\x18\x70\xdb\x8f\x7f\x97\x06\x3a\xe4\xee\x3b\xd8\x78\xbe\xb5\xac\x0f\x5f\x27\x93\x09\x0d\x8c\x55\x32\xd2\x59\x8d\x60\x13\x87\x1b\x75\x8f\x40\x49\x2c\x90\x9a\xfa\x7a\xf1\xd7\x76\x4f\x79\xf7\x67\x16\x3a\x00\x8a\x3b\xf3\x31\xf0\x3b\x89\x4a\x13\x4a\x09\xa0\x65\xb5\x11\x15\xf2\x72\xce\xc8\x30\xb6\xbd\x80\xc7\xac\x67\x63\x77\x5c\x2c\xf3\xf4\xe9\x93\xa7\x0f\x13\x2b\x53\x63\x57\xd6\x76\xb5\x59\x3c\x7d\xbb\x7b\x18\x7f\x57\x1a\x26\x96\xb1\xf6\xf3\x24\x30\xa1\x61\x1a\x49\xcb\x8e\xf7\xeb\x7c\x1c\xae\x3c\x1a\xc5\x06\x37\xa0\xab\xdd\x72\x50\x22\x46\x68\x24\xa4\x09\x7b\xfa\x03\xab\x90\x53\x77\xad\x2a\xe1\x0e\x80\x62\x3f\x07\x56\xf4\xbd\xf5\x48\x62\xdf\x4f\x27\x24\xec\x99\xfb\x2d\x84\x7c\x76\x0d\xd3\x38\xd2\xa9\xdb\xed\x6f\x00\xea\xeb\x01\xbe\xdd\x05\xb3\xc4\xe1\x52\xc3\x6b\xf2\x9e\x89\xe0\x71\xec\xf9\x5f\x0f\xe7\xea\x73\x63\xed\x93\xeb\x65\x82\x48\xdf\x3d\xb2\x71\x5e\x72\x27\x11\xca\x02\x19\x25\x2e\x92\xb6\x9c\x4a\xcb\x30\x42\xb9\xd0\xb8\xc1\xb8\x77\x75\x10\x2f\xbf\x21\x53\xae\xc1\xc8\xfe\x8b\x9e\x4f\x50\xbd\x5d\xd0\xe7\x11\x9a\xf2\xc0\x31\x9f\x14\x48\x56\xe4\xfe\x2c\x5a\x73\x0b\xcb\xe5\xef\x1e\xf7\xdb\xe7\xa7\xa7\xfb\xbf\x90\xde\xf5\xe9\xdb\x62\xbb\xda\xd3\xae\x5b\x1c\xe0\xb6\xd1\x81\x4b\x77\x2f\x3d\x3e\xdb\xf7\x11\x04\x6d\x08\x97\x4e\xf3\xce\xee\xee\x97\x7b\xf0\x9b\xb2\xfa\xfe\xf3\x82\x12\xd5\x5f\xac\x12\x44\xe8\x95\x05\xca\x04\x8b\x7c\x64\xe1\x50\x49\x6c\xa4\xbb\xa9\xb2\xc3\x01\xaa\xbb\xe2\x74\xee\x7e\x57\x4a\xe2\x33\x7f\x96\xa3\x34\xcf\xc5\x7e\xb1\xd8\x07\x64\x7c\x0f\x15\x58\x82\x25\xef\x7e\x5d\x23\xde\xe3\x1a\x64\x36\x04\xa5\xf4\x1b\x0d\x55\xa1\x2d\x7e\x72\x8d\xed\x52\x73\x96\x68\xbd\x28\xf4\xca\x59\xf1\xdd\x0c\x56\x22\xf0\x56\x98\x0d\x85\x8d\x7e\x5d\x6b\x9b\x93\xab\x44\x56\x63\x35\x00\xf6\xb1\xb9\xaa\xfc\x73\x89\xfa\x4f\xff\x45\x2a\x8f\xc0\xdd\xdc\x50\x2a\x5c\x30\xfb\x47\x99\x9f\x8f\x03\x86\xd2\x7e\x1e\x99\x48\x23\x28\xde\x56\xa7\x8a\x06\xb6\x2f\x65\x85\x69\x6f\xff\x06\x26\x06\x66\x4d\x2c\x9b\x49\x9f\x6a\xc8\xb4\x5d\x98\xa5\x6f\x3d\x61\xf4\xea\xb6\xb5\xa3\x10\x8d\x60\x9b\xc3\x80\x13\x1d\x74\x8a\x91\xc7\xf2\xc2\xac\x08\x03\xcd\x94\xab\x7e\x47\x38\x67\xb3\x87\x37\x28\x9a\xbd\x76\x98\xfb\xb9\xb2\x61\x12\x52\x1d\x62\x29\xbb\xca\x1a\xa1\x1d\xc8\xcb\x7c\xb6\x37\x85\x14\x6c\xd8\xca\x12\xbf\x4f\x79\xbd\x48\x18\xaa\x40\x05\x8e\xb8\xd3\x25\x4d\x66\x17\x6f\x18\xa5\x91\x66\x9e\xa7\xdc\x9a\x51\x17\x56\x7d\x98\xa4\x9c\xca\x3e\x0b\x03\xc3\x0a\x74\x12\x26\x8e\xcf\xe2\x94\x8b\x8f\xe5\x6a\x75\xbf\x9e\xbe\xe1\xbf\x92\xff\x71\x5d\x59\x10\xb9\x62\xbb\xe6\x1a\x44\x6e\xe7\xc6\x45\xf1\x00\x09\x99\x0c\x30\x1e\x7a\x25\x8a\x3c\x13\x3e\xbe\x40\x42\x06\x5d\xdd\xf7\x22\xcf\x77\x70\x3c\xe5\x36\xc3\x8e\x01\xe0\xc9\xee\x18\x32\xd0\x11\xeb\x3e\xd5\xaf\x8f\x69\xb9\x85\xeb\xc6\x43\x0b\x0a\x13\xba\xfd\x4c\xe7\x6a\xc0\x4a\x46\x42\x2e\x55\x3a\x2c\x0b\xfa\x12\x79\x43\x42\x0e\x81\xb2\x95\x46\x6f\x37\x65\xd5\x2e\x82\x2b\xd1\x99\x26\x21\x07\x83\x78\x66\x04\x0d\xa7\x93\x77\x4e\x43\x85\xd1\xe6\xba\x29\x2b\xb8\x07\x7d\x80\xaa\xbe\x2b\xee\x4e\xa6\x9b\x7a\x69\x44\x0d\xeb\xcb\xe4\x5d\x38\x60\x12\xba\x08\xd3\x38\x46\x9c\x6f\xa6\x4a\x0a\xc3\x52\x9c\xb6\x89\xa3\x5c\x7e\xfb\x82\xb5\x33\x8c\x7c\x13\x4f\x2c\x11\x5c\x6b\xcb\xee\xca\xc5\xe9\x94\x7f\x3c\x64\x39\xd4\x4d\x59\x78\x1d\xc3\x71\x6e\x8f\x84\xa9\x24\x4a\x0c\xb7\xcc\x4d\x79\xb6\x24\x1f\x1a\xc6\x4e\x7b\x98\xca\x38\x1d\x06\x86\xae\x9b\x97\xed\x4b\x79\x1a\x0b\xd5\x8f\xdf\x43\x30\x40\x23\xf6\xcf\xac\x38\xfc\x6f\x76\x96\xfe\x49\x65\x9c\x60\x8c\x40\x8b\x46\x48\x51\x77\x2f\x27\x21\x08\x02\xaf\xd9\x53\x9e\xdb\x83\xa6\xe9\xdb\x2c\xd1\xad\xdd\xcf\x36\x58\xad\xd4\x5c\xae\x5c\x1d\x06\x08\x84\x76\xd2\x02\x08\x80\x9b\xc1\xf3\xcf\x47\xe1\x48\x08\x52\xc4\x9d\x51\xd1\x6e\xa2\x1d\x68\xfd\xd2\xd8\x1b\x5f\xa8\xd2\xc0\x42\xa8\x5a\xab\x7a\x14\x6c\x26\xa1\x89\xc1\x31\x17\x16\x48\xe0\x5e\x4e\x4e\xa5\xd0\x68\x8a\xbe\x33\xa6\x63\xf6\x6e\xb5\xfb\x36\xa3\x42\xe9\x2b\xc5\x2c\x36\xdb\x31\xc2\x7c\x6a\x15\xfc\x7f\xfd\xaf\x7d\x92\x28\x48\x22\xb4\x8d\xae\x2a\x10\xaf\x9e\xea\xeb\x6b\x43\x34\x0a\xa4\xf6\xf6\xd4\x5e\xe4\xf9\x5e\x42\xdd\xec\x4b\x33\x08\x58\x44\x84\xc7\x89\xee\xc2\x64\x4f\x98\x4f\xf0\x4d\xc2\x86\x46\x50\x27\xbc\x39\xe7\x22\xab\x60\xbf\x2c\x8f\xa7\x06\xf6\xa1\xef\x44\x03\x8e\x2c\x35\xa8\xd5\xe5\x37\xdd\xdb\xbc\x94\x3e\x87\x47\x22\xca\x04\xc2\x3d\xd1\xf0\xb8\xcf\x1a\xe8\x55\x89\x48\x44\x25\x61\xda\xcd\xc6\x9b\xb2\xba\xe4\xcd\xc1\x2e\x68\x35\x78\xd2\xab\xd6\x36\x5e\x58\xc2\x92\x4f\xa9\x4a\x48\x14\x06\x71\xea\xf5\x36\x06\x6c\x84\xe3\x5b\x87\x3c\x44\x80\xd8\xb7\xbf\x9e\x46\xf1\x94\x28\x0a\x95\x9d\x34\x65\xae\xaf\x2b\x71\xe8\xf8\xcb\x48\x14\xa5\x01\xe2\x32\x7c\x1c\x65\x57\x5e\x89\xe2\x15\xa5\x23\x7c\x0f\xe0\xc4\x5a\xf2\xd0\xa1\x44\x49\x14\x07\x36\x9d\xdc\x64\xad\x75\x82\xc4\xaf\x3f\x21\x1b\x1f\x2e\xbe\x6b\x62\x79\xd3\x3b\x21\xaf\x2b\xa7\x52\xcf\x48\x94\x10\x09\xe9\x88\x28\xb5\xdb\x66\x9e\xaa\xb2\xf5\x62\x3b\xc3\x2f\x4a\xa4\x46\xf8\xd2\xc3\xe2\xcf\xfd\xd3\xf3\x66\xd9\x5a\x6c\xbe\x8d\x25\xc6\xca\x3c\xe7\x20\x2e\x77\xe5\xd1\xe3\x30\x6e\x90\x35\x7c\x7f\x70\xd0\xcf\x3b\x54\x7a\xb4\xc4\x5e\x3d\x52\x82\x44\x3c\x65\x88\xc8\x68\x7f\xef\xc7\xe2\xfe\xee\x7a\xb1\x5b\x6f\xba\x27\xe7\x29\x0f\xad\xb2\xe8\xa6\x7f\x44\x2e\x45\x68\xb1\xba\x36\xa9\x23\x2a\xfd\xc7\x4c\xd9\x2d\x89\x52\x9a\xf0\xd8\x97\x86\xfa\xab\x05\x35\x68\xea\xfb\x92\x94\x3f\x7a\xd3\x67\x02\x49\x21\x91\x6c\xbf\x2a\xb2\xe2\x8e\xb2\x91\xd3\x82\xa4\xd9\xc0\x6a\x24\xa3\x28\xb1\x6c\xab\xaf\x3d\x05\x45\x85\x8a\x10\x9f\xd9\x18\x91\x8a\x35\x22\x44\xaf\x1e\x76\xf3\xa9\x98\xf3\xdc\x63\x2a\x61\x01\x84\xa8\xaf\x30\x46\x69\xfa\x1e\xca\x95\xe9\x42\x63\xeb\xee\x66\xf7\xff\x48\x47\x29\xda\x0a\x47\xf1\xeb\x09\x2a\x6f\x8b\x5e\x3d\xf9\xb1\xd3\x31\xa7\x18\x61\xd1\x6a\xb2\x2a\x74\x6c\xbf\xb7\xcd\xdb\xa2\xb5\x6d\x63\x81\x6e\x3f\xa6\xdd\x2d\xd2\xd8\xda\x5c\xd8\x11\xe5\xa2\xed\x78\x12\xff\xac\xda\x31\x35\xa2\xa8\xb0\x0d\xb3\x7f\xad\xa7\x43\x22\xa0\x80\x26\xc0\x9b\x28\xb2\x7c\x10\x9a\x8b\x20\xa2\xc2\xb9\xe3\xdb\xb9\x9a\x49\x12\x07\x84\x0b\x1b\x13\x2b\xca\x73\x7b\xa2\x76\x71\x61\xdf\x21\xb1\xf9\xbc\xd5\x9f\xcb\x6f\x8b\xc7\xdb\xd5\x1e\x29\xaf\xae\x57\xcb\xbb\x87\xc5\xfd\xb6\xeb\xc5\x18\x66\x58\x34\xaa\x7e\x0c\x28\x35\x48\x1c\x68\x2e\x9c\x92\x61\xe7\x21\xc5\x24\x84\xd4\xe6\x31\xb6\x9d\x41\x10\x93\xd8\x4e\xec\xed\x9f\xdb\xbf\x06\x6f\x11\x53\xc3\x2d\xc9\xbc\x38\xc2\x06\xea\xae\x6e\x92\xc4\xa1\xe3\x10\x6f\xa0\x18\xf2\x70\x90\x38\x0a\x15\xc2\xa5\xcf\x45\xe7\xc0\xcf\x49\x67\xb5\x1d\x0d\xd6\x39\xac\xa0\x39\x28\xdc\x65\xbf\x08\xbf\xc5\x51\x92\x6a\xc7\x23\x5f\xfe\xd9\xfd\x96\x00\x0c\x70\xa3\x9a\x8a\x4d\x9c\x38\x1d\x83\x7f\xc5\xdd\xcf\x48\x96\x3a\x9e\x33\xc7\xd2\xf6\x15\x79\xfa\x3f\x3b\xdf\xe2\x48\x72\xaf\xbe\x35\xa3\x60\xc9\x48\x1c\x13\xc2\x3c\xa5\xe9\xb5\x25\xef\xd0\x77\x56\x07\x6b\xdb\xce\xcb\x42\xc1\xcf\xaa\x2c\x0e\x1b\x10\x13\x13\x20\x4e\x02\x83\x05\xda\x70\xc4\xdd\xd4\xeb\xd5\xfe\x23\x38\x2a\x89\x79\x4c\xbc\xeb\x84\xa3\x92\x15\x87\x09\x4c\xd3\x77\x4c\x42\x0c\x50\x60\x2e\xc4\x26\xe1\x26\xae\x78\xcc\x99\x0d\x79\xda\xca\xf3\xd9\xa0\x44\xcc\x53\x8d\x35\x38\x05\xbc\x9f\xca\xe2\xef\xac\xbb\x16\x42\xdc\x19\x1e\x05\x56\x10\xfd\x1f\x73\x43\x71\x4a\x19\x82\xb9\xad\x5f\xd6\x5e\x88\xc9\x9c\xe1\x44\x4b\xd3\x94\x5b\xc4\x4e\xbb\x1b\xd7\xe0\xa8\xf8\x7e\x4b\x4e\x4a\xe2\x54\x24\x68\x19\x97\xa8\x6a\xdb\xdf\x50\x4b\x8c\xa0\xe5\xa2\x6e\x76\x59\xbf\x62\x24\x0d\xbc\x69\xb1\xc8\xf3\xc9\xd7\x92\x69\x8a\x5e\xf2\x3e\xab\xb7\xd9\xa1\x00\xfd\x54\x81\xc9\x7e\x7d\x6e\x05\x7e\x65\x54\xc6\x3a\x12\x49\xe4\x6a\x82\xeb\xb3\xac\x55\x95\xc9\xde\xfe\x89\x75\xcc\xb0\xb8\x62\x29\x2a\x59\x16\x30\x0e\x54\xc5\x5a\x5a\xd5\xe9\xdd\x0b\xb4\xe6\xbe\xff\x33\x04\x10\xd9\x10\xd9\x69\x3a\x95\xc6\xc3\x02\x9a\x46\x7e\xab\xbe\x7b\xea\x49\x29\xa6\xbd\x2c\xcf\x74\xfb\x3d\x5a\x8b\x7c\x75\x5a\x1c\xa1\xd0\x7d\xc9\x4c\xdb\x05\x30\xba\x22\xce\x97\x75\x4b\x24\x06\x63\xd9\x89\x0a\x78\xbf\x98\xdb\xe7\x09\xad\x35\xf6\xc6\x78\x53\x05\xad\x49\x6c\x35\xc5\x5c\x00\x66\xf2\x60\x86\xa7\x18\x91\xf8\xcf\xf5\xdd\xe3\x6e\xff\xb4\xda\xec\x57\x3b\x47\xda\x43\x92\x80\x84\xdc\xee\x4a\x79\xa9\x5e\x41\xef\x40\x78\xdd\x9b\x41\x39\x38\x49\x02\xae\x03\x77\x70\xbb\x39\xf4\x50\xea\x1e\x9e\x53\xce\x29\x31\xbb\x4b\x09\x4d\xe8\x30\xc2\x7c\xb3\xdd\xcd\x0f\x74\x42\x12\x0b\x64\xe8\x2c\x26\xfc\x8c\xed\x12\x99\x5b\x21\xfe\x22\x15\x6b\x17\xe6\xbf\xaa\x84\x7a\x45\x65\x36\xf5\x79\xef\x04\x2d\xe5\xcd\xb9\xf0\xc0\xf2\x3e\x60\x90\x50\x12\x68\xb7\x27\x7e\x2b\x87\x0a\x58\x43\x34\x2a\x49\xa8\x21\x9c\x7a\xe8\xf3\xa6\x3b\x98\x92\x30\xb2\xdc\x2a\x27\x94\xe9\x19\x31\x40\x90\x24\x0a\xad\x30\x61\xbb\xf3\x59\x28\x3d\x8c\x59\xb0\x48\x12\xc5\x29\xb3\x75\xcf\x83\x0c\x50\x12\xf3\xd8\xd7\xff\x3e\x67\x9f\xd4\x5c\xb6\xbd\x2c\xb9\x27\x5a\x56\xa7\x4c\x8d\x27\x41\xc2\x22\x40\x6c\xc4\x51\xfc\xca\x8e\xe7\xe3\x9d\x2a\x7b\x06\x41\x92\x70\x88\x91\x81\x04\x0f\xf8\xed\x1c\xf5\x3b\x49\x52\x06\xc6\x41\xa5\xb6\xe7\x63\x0f\xf2\xf3\x8b\x30\x49\x45\x12\xb6\xeb\xe9\x4e\x95\x7d\xb8\xab\x6b\x33\x9e\x12\x64\x9d\x6b\x5b\x8f\x3a\xe1\x4a\xf7\x3d\xb5\xc6\x04\x5d\x56\xa0\xee\x47\x3d\x60\x4c\x24\x89\xd0\x2a\xf4\x80\xd0\x0f\x4b\x98\x48\x27\xd7\x0b\x93\xe0\xe9\x79\xcc\x0a\x78\x2a\xe7\x95\x0d\x49\xa2\x02\x61\xab\xaa\xca\xe3\xc9\x7a\xeb\x88\xc5\x99\x0c\x9a\x0e\x55\x62\x55\xb2\xfe\x7d\xae\x1b\x97\xdb\x1c\x77\x81\xd8\x11\x5b\xb6\xbb\x70\x0f\xb7\xfd\x64\xf6\x19\x17\x85\xcd\xea\xce\x06\xf0\x84\x1d\xa4\x7d\x77\x0c\xb2\xec\x5e\x44\xf1\xfa\x57\x79\x9e\x01\x5b\x30\x9a\x18\xe4\x81\xf9\xb6\xfe\xb9\x5a\x0f\x37\x39\x46\x85\xa5\xda\x6e\xa7\x97\x8d\x9b\x20\x50\xaa\x53\x92\x22\x8c\xea\x14\x67\xe7\xba\x29\x8f\xa2\xc9\xfe\x1e\x5d\x1e\x05\x1a\x8b\xe3\x8a\xf3\xf1\xda\x09\xd8\xd4\x4f\x15\xbc\x65\xe5\xb9\x46\x4e\xcf\xae\x23\xb1\x71\xa2\x3f\x9f\x76\xe3\x1b\x70\xeb\x67\xfe\xdc\x6e\xc6\x5f\x84\x45\x42\x39\x61\xa3\x66\x85\x0c\xea\xa0\x77\xa2\x7e\xed\x10\x31\xb3\x43\xc5\x62\x6a\x45\x21\xbd\xdc\xc3\xd5\x47\x3b\xba\xbb\x8f\x13\x2c\x0a\x7d\x37\xef\x5e\xb0\x58\x33\x0c\xc2\x6d\x9f\x16\x9b\xe5\xf8\x40\x62\x49\x0c\x58\xc9\xf2\x03\x0a\x8d\x4e\xe8\xd6\x03\xe8\x3e\x29\xea\x22\x2c\x49\x04\x84\x3d\x2d\xf7\x83\x28\xce\x22\xcf\x3f\xae\x3a\x26\xe5\xc1\xde\xc1\x98\x93\x5c\x6f\x4f\xc9\x26\x3b\x42\x05\xfa\xdc\x25\xe6\x19\x13\x4c\xdb\xc2\x92\xa2\xe7\xcd\x1f\x00\x7c\x18\x27\x02\x69\xab\x3c\x8d\xf8\xfc\xc4\x65\x3c\x0a\xc9\x98\xc3\xea\x87\xa8\xb2\xa1\xfa\xd3\x7f\x7c\xea\x4d\xb3\x34\x24\x18\x7f\xda\xef\xb3\xfa\x06\x50\x78\xcd\x13\x40\x8d\x7f\x25\xd5\x01\x4b\x1d\xe7\x59\x6b\x39\x8f\x51\x06\x2c\x05\x4d\xbd\x12\xf3\x10\xeb\xc3\x04\x49\x63\x17\xd9\x5c\x9f\x1b\xac\x0a\x1e\xdd\x57\xa4\x11\xb6\x3f\x6f\xaf\xf7\xeb\x63\x91\xe9\x32\xcf\x85\xdf\xfe\x98\x0c\x19\x1d\x8a\x4c\xa1\x7b\x2a\x8a\x79\x92\x68\xc2\x94\xe4\x48\x74\xf1\xdf\xcf\xde\x1d\x66\x0a\x00\xe3\x10\x8e\x6d\x1c\x09\xf2\xae\xcf\x0e\x1c\x3c\xbe\x5a\xc7\x31\x75\x61\xc4\x11\xf9\xb7\x6f\x86\x18\xfd\x2a\xcb\x7a\xb0\x2c\x8f\xc7\x3e\x78\xc0\x80\x44\x68\x27\xfd\x00\x99\x95\xc5\x9f\xdd\x9f\x53\x16\xf5\x84\x44\x3d\xb2\x71\xd6\x40\x64\x86\x46\x18\x66\xfb\x54\x2f\x7f\x74\xe6\x30\x93\x18\xe4\xa4\x7c\xf8\x6b\xb9\x9c\xdb\x19\x0c\x28\x34\x72\xde\x2c\xbf\x3b\xf5\x77\xeb\x16\xa8\x01\x6d\x3a\xae\x9c\xaa\x6e\x10\x4e\x0f\xd7\x67\xc8\x49\xd7\xc5\x58\x9a\x9f\x4e\xe1\x1d\x8b\x8f\xbe\x0e\x4f\xf1\x40\x6b\x2c\xde\xdb\x1f\x3c\x6d\xd0\xfc\x8a\xe6\x24\x61\x2a\xb2\xfc\x92\x96\x88\xf9\x93\x7e\x94\x72\x5b\xcd\x8c\x06\x38\x88\xe3\xb2\x27\x23\xbd\xd3\xbd\x4a\xfc\x1f\xbe\x3f\xb3\x00\x34\x0f\xb7\x1a\x36\xe0\xeb\x14\xf0\xab\x19\xde\xa3\xd0\xf0\x6b\x57\x5e\x01\xb2\xc3\x8f\x56\x21\x0f\xe3\x40\xa4\x16\xcb\x89\x88\x04\x91\x67\xaa\xdd\x02\x3b\xd6\xd9\xc5\x79\x33\x01\x3b\xf1\x30\x21\x78\x4a\x14\x65\x23\xaa\x49\xad\x3e\xe1\x71\x18\xe3\x7e\xe9\xf2\x98\xc8\xdf\xbe\x2b\xaf\xf2\x52\xcd\xf0\x4f\xb6\xdd\x53\xe4\xd1\xb5\x33\x78\x71\x3a\xad\x7e\xc1\xc4\xb3\xe7\x71\x12\x62\xe8\x00\x65\x0f\xae\xb3\xb7\x7a\x2b\xde\xfa\x1a\x7f\xc2\x63\x66\x63\xc0\x35\x34\xf7\xe5\x21\xbb\xb8\x5c\x28\xcc\xa3\xa1\x72\xda\xc7\xb2\x3c\x9e\xca\xe2\xc2\x6a\xe4\xb1\x21\x56\xa5\xb1\x29\x4f\xae\xf4\xd6\xdf\x3f\x09\x83\xd0\x26\x00\x2d\xb6\xf9\x4e\x95\x76\x32\x75\x1d\x78\x10\x3a\xcd\xe2\xb5\x31\xcb\x17\xd1\x69\x35\xc3\x85\xbb\xcb\x59\x68\x8d\x9e\xa7\xcd\x7a\x7d\xb3\xb7\x9c\x80\x3f\x17\xf7\xf7\x2b\x8f\x51\xe4\x9c\x0a\xd4\x8b\xe9\xf7\x3c\x24\xd0\xee\x2c\x24\xce\x15\x17\x96\xc3\xe2\x66\x58\xde\x46\x78\x4a\x21\x74\xe1\xc3\x87\x8f\xef\x45\xf9\x9e\xb7\x27\xa3\x6f\x15\x22\x41\x81\xab\xc7\x95\x5f\xc2\x5c\x06\x02\x9f\xdc\x47\xe8\xaf\xce\x1f\xd7\x70\x14\x53\xe0\x0a\x97\x3a\xd1\xba\x17\xb6\x85\xba\xb1\x5c\x88\x03\x0b\x9d\xab\x80\xe2\x66\x07\xcd\xcb\x53\x05\xa3\x88\x34\x57\x49\x6c\x85\x86\xb2\x23\x58\x42\xcf\x59\x62\xa8\xd1\x4c\x52\x8a\x25\xbe\xf8\xe1\x0a\xa6\xdf\x4b\xb3\x04\x71\x3e\x27\xd4\xb0\x58\x96\xfd\xe8\x68\x61\x2d\x22\xa1\xf5\x23\xbc\x6f\x41\x55\xd0\x60\x45\xdb\xc8\x80\xe4\x5a\x30\x00\xff\x4a\x33\xec\x22\x84\x6b\x93\x6a\xb7\x65\x5a\xa5\x8c\xed\x49\x28\xa8\x5f\xb2\xd3\xb3\x65\x83\xaa\xaf\x3e\xee\xa6\x23\xa5\x8d\x15\x2a\x7e\x11\xa8\x5e\xb9\x5c\x2f\xf3\xb2\x0f\x6e\x72\x48\x42\xd4\x1b\x6a\x1f\x7b\xbc\x70\x20\x51\xc8\x20\x9c\xd5\xd6\x50\x1f\x96\x5f\xfb\x2e\x42\xc4\x7e\xa2\xb7\xcf\xf3\x24\x2a\x98\x1a\x94\x1c\x94\x3d\xcb\x10\xac\x57\xbd\x42\xe3\xed\x22\x1c\xa3\xf1\xc3\x1a\x4e\x94\x33\xb5\x97\xcb\x6f\x56\x77\xc4\xeb\x09\x90\x34\x48\x02\x3e\xe2\xd9\x5e\x5c\xcc\xe9\xf1\x56\x96\x92\x80\x0e\x00\x70\x98\x51\xfb\x2a\x8e\xe2\xbf\x45\x4a\x22\x86\x9b\xc6\xc9\xba\xee\xcf\x37\x7e\x2d\xa4\x34\x8d\x31\x9b\xb7\x56\x20\x8a\xad\x12\x27\x0b\x1f\xd1\x6f\x5f\x4d\x9d\x34\x14\x12\x53\xc2\x2e\x47\xf5\xec\x9c\xbd\x79\x87\x2d\x0d\x25\xb1\x25\x93\x88\x43\x5e\x1a\xfb\x49\xbd\x9e\x37\x49\x43\x43\xf1\x24\x71\x3a\x0f\x30\xd6\xba\x26\x69\x9c\x12\xc5\x06\x94\x32\x68\x63\x8b\x4b\x89\x90\xf9\x48\x4d\x1a\xeb\x14\x3f\xbc\x16\x8d\x58\x9b\xa7\x2f\x78\x86\xfd\x05\x00\x58\xa2\xb0\x6a\x44\x5e\x16\x36\x6d\x31\xb4\x4d\x53\x16\x29\x54\xad\x6d\x4d\xb3\xab\x4c\x0f\x98\xe9\x49\xca\x54\xa2\xa9\xaf\x82\xda\xed\xc4\x2f\xdf\xc0\x59\x84\xfe\xfc\x09\x89\x1e\x5a\x5b\x64\x59\x75\xac\x4c\x24\xe5\x3c\x20\x2e\xe5\xf2\xb3\xac\x5e\x3f\xa5\x1c\x27\x29\x87\x80\xf7\x05\x0f\xf7\xe5\x9b\xa5\x81\xfd\x63\xa0\x11\xeb\x7a\xa6\x24\xc4\x6c\xc7\xee\x05\x16\xf2\xa3\xae\xaf\x17\x77\xcb\xf5\xef\x88\x6b\xfe\x5f\xff\xf5\xbf\x6d\x12\xe4\x01\xaa\x85\x01\x57\xbd\x35\x7e\x0d\x11\x18\xae\x3a\xfc\xc9\xda\x98\x4c\x4d\x77\x88\x54\x52\x08\x98\x67\x62\xc3\xe0\x1e\x46\x06\xbc\x09\xe6\xc9\x8b\x27\x88\x85\x54\x31\x2e\x1c\x81\xdb\xb2\xd4\xa0\x2f\x62\xc2\xa9\xe2\x09\x84\x8e\x62\x77\xdf\x8e\x9e\xe5\x15\xf6\x1f\x43\x41\x18\xdb\xb4\x5a\xfb\xd9\xdf\x7b\x4c\x7d\xaa\x80\x85\x96\xbd\x2d\xfb\x1b\xfa\x2a\x15\x92\x1a\x6a\x90\x35\x60\xaf\xac\x91\xd1\xb1\x23\xfc\x31\x88\xb5\x8c\xaa\xff\xfe\x45\xc8\xff\xf8\x8b\xc3\xc0\x73\x85\xdc\x97\xea\x75\x62\xda\xa5\x86\x6b\xdc\x8b\x31\x09\x7b\x67\x3a\x4e\xd6\x69\x96\x5a\x04\x41\x8a\x99\xab\xab\xcd\x3d\x1e\x7c\x7f\xf8\xbf\x87\x01\x46\x49\x77\x0f\xcb\xdf\x9e\x0b\x22\x88\x02\x74\x7a\x0a\x78\x47\xb5\x02\x6f\x4f\x0b\xc2\x25\x22\x86\x26\xba\x57\xe3\x47\xa0\x10\x61\x40\x64\xfd\xf3\x71\x7f\xc1\xfa\x39\xed\x6b\xd2\xc4\xd1\x7b\x7c\x05\xc8\x12\x91\x56\xb1\x17\xc0\x39\xab\xd7\x0f\x2c\x94\x58\x89\x6a\x12\xf1\x12\x71\x98\x30\x17\xba\x41\xdc\xb6\x27\x0a\x1d\x14\x73\xf7\xab\x43\x24\x09\xd8\x24\xa5\xd6\xeb\xca\x62\xc7\x66\xc8\x56\x89\x48\x98\x10\xee\xe3\xdc\x9c\x0b\x8c\xb4\x79\x3c\x25\xce\xc2\x91\x60\xb3\xff\xd7\x2f\xc6\xd1\xf3\xb1\x28\x41\x27\xc0\x6d\x9b\xfb\xf9\xfd\x52\x30\x15\x85\x23\x62\x55\xa0\xa4\x8f\x71\x4d\x0f\x05\xc1\x03\x29\x1c\x02\xae\xf5\x24\x6f\x00\xa6\xe7\xed\xe4\xfe\x9c\x32\xa4\xaf\x96\xe7\x8f\xb5\xcc\xfe\x56\x9e\x1f\x7d\x3a\xec\x5c\x0a\x1a\x77\xc5\x6c\x50\x5d\x95\xbf\x60\xda\x47\x24\x81\xd1\x17\x21\xb6\xc9\x82\x14\x42\x5b\x02\xbc\x13\x9e\xd8\x02\x4d\x97\xbe\x42\x74\xda\x5b\x06\x10\x2a\x17\x9c\xbd\x16\xd9\x3f\xaa\x1e\x22\x42\xc5\x16\xe9\xf1\x73\x52\x8f\xf5\x0f\x8e\x08\xa1\x43\x40\xa8\x5c\x6b\x1b\xbc\xb6\x46\xb5\x63\xba\xfd\x24\x76\xfe\x75\x6a\x40\x68\x11\x9a\x0e\x68\xda\x53\x7e\x4d\xbe\x02\x70\x83\x96\x8a\x63\x50\x70\x6a\xcf\x3b\x51\xa1\x04\xe8\x4f\xf0\x11\x7e\x01\xa9\xdd\x72\xec\x7e\x7f\x0b\x45\xe0\xd1\x9d\x73\xab\x17\x04\xe0\x69\xf7\x22\xea\x2b\x91\xe7\x65\xb3\x42\xdd\xe5\xa1\x39\x20\x4c\xac\x03\x67\x9a\xd9\x40\xef\x50\x44\x76\x9b\x8b\xfa\x65\x2e\x01\x2d\x8c\x62\x98\x57\x3d\xa2\xd9\xe3\x53\x00\x23\x43\x54\x12\x4d\x31\xf2\xb7\x59\x3c\xde\xae\x56\x8f\xd7\xfb\xa7\xcd\x6a\xbb\xb8\xf7\x1e\xb5\xa4\xd4\x66\x92\x6c\x9c\xc0\xc9\x46\xf9\xb6\xd0\xca\x40\x3d\xdc\x3d\x2e\xfd\xdf\xc2\x24\xc6\x60\x8f\xd3\x7d\xb8\x28\x07\x92\x61\x6a\x8b\xaf\xfa\xcc\xb7\xd5\xc7\xaa\x6f\x90\x3b\xaf\xb3\x0c\x65\x14\x27\x18\xd0\xdc\x36\x6a\x78\x98\xcb\x88\xc5\x98\xf0\xda\xee\xfe\xcb\x1a\x94\xe1\xfc\xb2\x91\x91\x89\x3c\xfe\xfb\x7a\xf5\xe7\x94\xfe\x76\xdc\x37\x0e\x62\xa1\xbd\x25\x59\x1d\x60\x29\x4e\x5d\x84\x6e\x06\x78\x30\x9e\x40\x32\x06\x40\x17\xc6\xc2\x27\x90\xf4\x6e\x1c\xd9\x95\x49\x62\x63\xa3\xad\x99\x4b\x3e\xb9\x4b\x22\x42\xe6\x82\x9b\xbe\xd6\xc9\x9a\xd9\x93\xf5\x26\x13\x1d\xe2\x96\x9d\xd5\x8f\x65\x23\xa6\x65\x35\x32\xd1\x36\xdd\x71\x80\xa6\x3b\xd4\x5a\xf3\xa4\x6e\xc4\xf1\x34\x1f\x3d\x96\x4c\xc7\xca\x32\x3d\x64\x0a\xec\xde\xfa\x53\x64\x38\x67\xfa\x10\xb6\xe4\x41\x04\x6e\x5f\xbf\xb2\xf8\x99\xd1\xa7\xe5\x81\x44\x92\x34\xc7\x0d\xbb\x14\x95\x46\x0e\x97\xc3\xe4\x01\x53\x99\x58\xc9\x20\x91\xc3\x48\xe5\x87\x48\x11\xda\x22\xe4\xa7\x5c\xd4\x47\xd1\xfd\x55\x47\x18\x96\xff\xb7\x50\xaf\xa7\xd2\x0b\xad\x8f\x27\xb2\xa4\x89\xe5\x1b\x71\xdf\xb9\xfd\x6a\x58\x01\x35\x19\x3c\x19\x2a\xc5\x91\xb6\xe8\x0d\x9a\x97\x8e\x91\xe3\x37\xd9\xb7\xc9\xd4\x92\x60\xd0\xc2\x3d\x89\x8f\xa7\x5c\x34\xa6\xac\x8e\xeb\x73\x73\x28\xdb\xf1\xea\x2b\xbc\x97\xe5\xf1\x98\x61\x11\x8b\x7f\x48\x95\x6a\x64\xa0\xef\xa0\x99\x96\x81\x78\xf2\x88\x9a\x18\xb4\xf1\x1f\xb2\x62\x29\x4e\x1b\x10\xea\x65\x1a\xa1\x93\x5a\xa6\x58\xfc\x5c\x97\x06\xc5\x55\x7a\x26\xb3\xb6\x4d\x21\x3f\x81\xe3\x96\xf9\x7f\x4f\xeb\x4a\x0d\x3c\xb6\xb4\x61\x8d\xa8\x10\x43\xb5\x74\xa2\xd0\x83\x6d\xed\x3c\x50\xe2\xbf\xb4\x9f\x9c\x2c\x9d\x63\x54\x98\xa8\xf1\x87\xd4\x87\x03\x24\x04\x56\xaf\xd0\x29\xc3\xc4\xfe\xa5\x80\x70\x2c\x88\xde\xbe\x94\xa7\x6b\x38\xe5\x28\x8d\xfb\xd5\x5b\x75\x73\x1b\x38\x43\xf2\x8d\x59\x2a\xd6\xf9\xa5\x08\xc2\xd2\x57\x7b\xf5\x9a\x32\x2b\x6a\x47\x67\xdc\x23\xca\xfd\x93\x99\x30\x96\xae\x14\xef\x21\x2b\xce\x0d\xd4\x36\xf0\x58\x77\x1d\x22\xab\x29\xb2\x5c\x3c\xfe\x58\x6c\xf7\x3f\xef\xae\xbb\xfc\x9b\x34\xb1\x48\x5d\xcc\x70\xf5\xb8\x9d\x2c\x14\x23\x02\x1f\xbe\xd8\x80\x86\xa3\x2d\x23\x69\x8d\x29\x17\x3b\xea\xfa\x49\x84\x20\x56\x88\x44\x58\x9b\xc9\x5c\x31\x3a\xe2\xd2\x2d\x8d\x5e\x3b\xf1\x3f\x66\x6d\xca\xf1\x40\xa8\x80\x4a\x0c\x35\x5d\x6d\x17\x37\xfe\x4c\x50\x41\xa8\x99\x0b\xcd\xef\x2b\x98\x3a\xd1\x8a\x04\x0c\x8d\xd7\x77\xc8\x76\xe5\x93\xa5\xc6\xae\xea\xd6\x81\xea\x74\x96\x88\x22\x11\x33\xb2\xab\x67\xc5\x85\xfc\x7f\x78\x2c\x12\x33\x4d\x3c\xe3\x72\x7d\xae\x5a\xeb\xcc\x51\xe2\x4e\x4c\x65\x7f\x81\x26\xa9\x4b\x6f\x0c\x22\x81\xf5\xf4\xc9\xb5\x25\x35\x69\x5f\xcc\x71\x7a\x5b\x79\xb7\x7a\x7f\x82\xca\x4a\xe6\xf9\x17\xa0\x3c\x44\x1b\xd7\xe5\xca\xbb\xbf\x87\x69\x82\xe5\xb6\xb6\xd6\x7c\xca\xe5\x42\x54\x44\x99\x0f\x91\xff\x84\xec\xf0\x72\xa1\x02\xe7\xfb\xa5\x3c\x90\x9e\xdf\x5d\x14\xa2\xdb\x66\x55\xcc\x18\xc2\x7f\xe1\xac\xae\xb3\xba\xa1\xd7\xff\xcc\xe0\x52\x31\xb7\x72\x05\x99\x93\x50\xea\xce\xa8\xdf\x5c\x96\x5a\x71\x87\x07\x91\x15\x05\x34\xdb\x73\xf5\x06\x17\xa5\xc7\x9e\x58\xc1\xad\x62\x95\x24\x11\x92\xbf\xdc\x97\x87\x69\x39\xc3\xec\x8a\x53\x89\x8e\x90\xb6\xe6\x04\xa2\xca\x27\xd8\x4e\x95\x68\x85\x71\x9e\xa7\xaa\x2c\xcd\xda\x2c\x2b\x91\x1d\x6e\x2b\x51\xf4\x1d\x20\x88\x5c\x88\x6b\x84\xa9\x99\xfc\x08\xe3\x0a\x19\x4f\x30\xb2\xec\x68\xc0\xfa\xda\x40\xc5\xd2\x98\xdb\xa2\xf9\x1c\x44\x0d\x28\x11\x38\x3a\x26\x15\x83\x94\x62\x42\xe8\xda\x66\x84\x56\x95\xa2\x01\x7a\x4b\xa8\xdf\x31\xe9\xcd\x03\x95\x30\xac\xb9\x58\x3f\xad\x3e\x41\x8f\x8d\x66\x29\xa7\x8a\xb8\xa2\x2d\xaf\x3c\xd6\xf1\xc7\x8d\xdf\x84\x47\x0c\x6b\xc5\x1c\x9a\x7e\x6d\x1c\xc1\xd6\xb4\x5b\xac\xb1\x18\xe4\xbe\x3c\x3c\x4e\x4f\xfe\xe9\x42\x1b\x6b\x58\x59\x00\xd8\x27\x53\x82\x43\x18\x86\x3e\x15\x5c\xe8\xf2\xbd\xb8\xad\x84\x02\x6b\x0b\x0f\xa3\x2b\x2a\x0d\xdd\x41\x69\x41\x8d\xd7\x99\x82\x4d\x99\xe7\x63\x5c\x83\xef\x1b\x07\x58\x89\xb6\xba\xb9\x19\xef\x83\x2a\x8d\x19\x22\xef\x8f\xe2\xd7\x55\xa6\xef\x0a\x2f\x85\x3a\x59\x5a\xa9\x60\x58\x0a\xd8\x94\xa7\x6c\x68\x32\xaa\x14\x08\x02\xc6\xb6\xa7\xb3\xde\x95\xd7\xd9\xdb\x74\xe1\x0b\x4a\x50\xf0\x2e\xab\x17\x67\x9d\x35\x65\xd5\xeb\xa9\x4d\x1e\x45\x84\x21\x66\x98\x70\x6d\xfb\xfb\x0b\x69\x7c\x65\xca\x5f\xe7\x23\x54\xd9\xf9\x38\xef\x44\x28\xa1\x6c\x2e\x54\x68\xed\xd4\xb5\x2c\x31\xd3\xcc\xdc\xb8\x1c\x76\x99\xda\x00\x70\xbb\xeb\x69\x57\x1f\x3c\x0b\x97\x51\x52\x52\xab\x9a\x9b\xfd\x02\xbd\x7f\x1b\x54\x67\x29\x09\x86\x77\xf5\xa0\x36\xc9\x63\x50\x5f\xe0\x13\x1c\x92\xbb\x4c\x45\x16\x68\xba\xc8\x41\x21\x91\x8e\xbf\x9f\xe2\x41\x2c\xba\x60\xe1\xa4\x04\xd0\xf7\x01\xcb\x2a\xf9\xbd\xcc\x45\x37\x35\x20\xa6\xe0\x11\xdd\x50\xdd\xd5\x0b\xfd\x56\xaa\xcf\xe8\xf6\x88\x82\xd4\xea\x3f\x9a\xb2\x7a\x6f\x0d\x4b\x91\xe7\xb7\xa2\xfb\xf4\xa0\x13\x04\xef\x1d\xb3\xa2\x79\x84\xf7\xeb\xc7\xe5\x27\x5b\x80\x89\x39\x12\x38\x2f\x45\x71\xb7\x3d\x5b\x1c\xd1\xae\xca\xa6\xd1\x2e\x65\xe2\xd4\x65\x40\x5b\xdf\x69\xbf\xe8\xd8\xc9\xe6\x87\xc7\xf0\x04\x6b\xe1\xf6\x15\x68\x80\xe3\x9d\xaf\x43\x1f\xdf\x55\x07\x49\xc2\xdc\x01\x83\x65\x6f\x53\xf7\x5c\x07\xca\x04\x8e\x97\xc3\xd7\x55\x6d\xb3\x43\x81\xa9\xda\x0b\x6b\x67\x00\xda\xd5\x01\x68\xcf\x98\x5d\x7f\x87\x8f\xc9\x04\xd7\x24\x22\x06\x43\x14\x65\x27\x69\xd8\x47\x56\x34\x49\x53\x3c\xcb\x6c\x8e\x6a\x75\x44\xeb\x0a\xc8\xe4\xd9\xc2\x40\x10\x7b\x10\x0c\x0a\x7d\x2f\x50\x5c\x9f\x68\x9a\xfa\x7b\x10\x81\x2e\x69\x47\x8d\x81\x33\x30\x9e\x3c\x6d\xa8\x81\x74\xe5\xdb\xa2\xf9\xbc\x76\x6f\x7a\x77\x0d\xb8\x4f\xfc\x67\x56\xa8\xb2\x1a\x6e\x01\x3a\x4a\x53\x2c\xc9\x47\x9d\xc0\x45\x05\x62\xdb\x67\x50\xc6\x8b\x47\x47\x42\x84\x76\xa6\x1d\xcb\xf0\x3a\x82\x37\xd1\xdd\x04\xb4\x70\x1e\x65\x6b\x9b\xde\x97\x4d\xb4\xed\xd0\x77\xe3\x47\x89\x03\xeb\x66\x9c\xc4\xc7\x15\x34\x63\x25\x2a\xa2\x63\x61\xd0\x24\x7d\x3e\x99\xac\xf0\xe2\x8a\xf8\x67\x84\x08\xc1\xaf\x06\x0a\x3d\xaf\xe0\x44\x74\x2c\xe3\x4e\x9d\xa0\x2c\xce\x28\x09\x32\x20\xf9\x25\x3a\xd6\x36\x8b\xe1\x35\xb7\xb3\xa2\xf5\x5e\xf3\x8b\x41\x1c\xcc\x80\xd8\x18\x8c\x90\xe3\xc9\xb8\xda\x7d\xfb\x29\x0e\xb8\xf9\xb9\xe6\x44\x4b\xb0\x19\x3f\xa7\x53\x75\x40\x52\x48\x5f\x7a\xf3\xf5\x57\x49\x80\x62\x9a\x0d\x49\xbd\x36\xa5\x57\x97\x20\x9a\x25\x01\x1a\x65\x77\xcb\xb5\xe3\x78\xee\x7f\x91\xa9\x04\x89\x63\x6c\x10\xe5\xba\x7c\xf7\x32\xde\xf3\xeb\x5a\x33\x88\x30\xe8\xd7\x8c\xc1\x15\xff\x47\x77\x67\x72\x53\xce\x52\x94\x02\xbe\x69\xb7\x51\xab\xdd\x6a\x27\xd5\xe7\x31\x2a\xee\x2f\xd5\x56\xf6\x6d\xef\xaa\x24\xef\x33\x05\x53\x52\xe8\xb6\x17\x13\x3d\x91\xc4\x66\x46\x99\xc2\x75\x4c\x43\x85\x29\x50\xb4\xdd\xce\xf5\x34\xe6\xa9\x53\x63\x14\x78\xff\xdd\x22\xb4\xfd\x48\x8a\x00\x30\x91\xbb\xf7\xe2\xa9\x1b\x64\x30\xbb\x85\xa2\x2b\x69\xd4\x42\x09\x0b\x67\x6e\x8d\xaa\x2b\xa1\x5e\x61\xbc\x7a\x14\x4b\xb0\x16\x02\xd0\x5b\x5f\x6d\x96\x8c\xfa\xac\x98\xd6\x51\x22\x2c\xe7\x88\x69\xc8\xa4\x9c\x4b\x6b\xce\xd1\xe1\xc5\x9c\xbb\x17\x4d\x22\x5a\xa7\x29\x0a\x8f\x5c\x65\x87\x4d\x56\xbf\x76\x7f\xd6\xb6\x90\x03\x79\x33\x8c\x8b\xdd\x0e\xea\x4c\x34\x50\x83\x18\x6a\x14\x2b\x72\xc1\xa8\xf1\xca\x82\x24\xc4\x1f\x54\x3d\x95\x3b\xc2\x4f\xab\xe9\x4e\x6b\xb8\xc6\xa8\xb9\xcc\x0e\x77\xd3\xc8\x99\x36\x8a\x20\x1a\xca\x72\xc6\xe5\x65\xd3\x94\x24\x70\xce\xdd\xef\xf2\x31\xf6\x16\x10\x84\x01\x06\xd6\x9c\xa6\xa1\x9b\x96\xa0\x77\xe5\xa7\x1c\x6c\x04\x02\xc6\x89\x8d\x6b\xd6\x67\xb8\x86\xb7\x7a\x84\x4e\x00\x42\xc2\x38\x1a\xc8\x88\x0d\x98\xef\x66\x42\x8b\x40\x28\xeb\x64\xc2\x5b\xa3\xac\xdd\x4b\xfb\x7b\x19\xeb\x78\x1e\xa0\xf9\xd6\xe4\x6a\x67\xb9\x0c\xad\xf1\x36\x6b\x54\x00\xe5\xae\x7c\x4c\x14\x37\x5e\x96\xc0\x37\x89\x04\x0b\xd5\x85\x76\xa4\x84\x17\x69\x7e\xa0\x3a\x45\xe2\xd1\xbc\x4b\xc1\x40\x18\x30\xfc\xd3\x7f\xaf\x96\xdd\x9f\x92\x18\x51\xda\x8b\xbb\xe5\x7f\x75\x7f\x53\x0c\xcf\x56\xfc\xe8\xd6\xec\x1f\x3f\x58\xa8\x38\xde\xe7\x7a\x3b\x5c\x9d\xbe\xd1\x68\x8c\x6c\x21\x9c\x23\x73\x11\xc9\xaf\x25\xff\x08\x44\xca\x60\xde\x76\xb3\xbe\xf1\x4f\x11\xcb\x14\xc5\x4c\x6a\x25\x2e\xc1\x0c\xbe\x0f\x40\x6c\x1c\x89\xca\xf8\x86\x49\x60\xc0\x4b\xea\xdf\x88\xac\xf3\xbd\x6c\xf8\xeb\xb1\x6c\xfc\x1f\x30\xcb\xed\x2f\xe2\xca\x12\x5f\xb7\x2f\xde\xfa\x35\xc5\x85\x47\x02\x2c\x20\xa1\x9d\x66\x1d\x5a\xdd\x5f\xce\x18\x13\x2e\x5a\xf7\x00\xc7\x2b\xa8\x9b\xb1\x70\x36\x81\x94\x72\x61\xfc\x74\x9b\xbc\x4b\x6a\x02\xbb\x04\xfa\x40\x0f\x02\x39\x3a\xdf\xec\x8b\x94\x14\x08\x9a\x22\x26\x57\xda\x3c\xf3\xc4\x9f\x03\x11\x0a\x7c\x31\x47\xa9\xb0\xda\x2c\x69\xf0\xc9\x8a\x10\x8e\x9d\xe4\xc7\xdd\xd5\x98\xf8\x03\x04\x67\x3e\x18\x69\xe3\x2d\x9b\x0b\xb9\x17\x02\x22\xe5\x81\x4d\x5a\xb6\x46\x63\x7b\x52\x8e\xa8\x78\x40\xa6\x8c\x38\x50\x14\x16\x88\x5f\x67\x87\xf6\x8c\x99\x33\x62\x3c\x12\x0b\x54\xa4\xb0\x12\x4e\x5b\x5a\x38\xcb\x6f\x30\xbf\x6f\x83\x4a\xb9\xd6\x7e\x84\xed\xe7\xb9\xa9\xca\x23\x2a\x06\xd9\xf0\xb7\xba\xa0\x91\x71\x97\xea\xc8\xb2\x0f\x7a\x36\xb0\xc9\xf7\xd1\x06\xd0\x20\x7f\x11\xf5\x0b\x96\xe9\x5f\x97\xea\x3c\x00\x9b\x03\x50\x05\x64\x2c\x49\x30\xb1\x0a\x01\x42\x8a\xf9\xe6\x73\x0d\x4b\x71\x6a\x44\x56\x2c\x9c\x10\xd3\xa4\x1f\x67\xc8\x77\x34\x88\x6d\x6e\xa1\x69\x72\xd0\x57\x1f\x0f\xa0\xb3\x21\x1f\xdf\x3f\x3b\x5a\x01\x80\x20\xb9\x7e\xaf\xaf\x7e\x5f\x0a\xdd\x43\x09\xc6\xf3\xc9\x04\x1a\x05\x65\x4e\x2f\xbf\x06\x55\x38\x60\x98\x3d\x5d\x6a\x2c\x2d\x1f\x56\xdb\x80\x91\x0c\xab\x84\xb7\xd9\xf1\x94\xc3\x56\x98\x19\x68\x1a\x9f\x9d\xbb\x46\x5b\xcd\xab\x73\x0d\x7a\x8e\xd9\x91\x80\x01\x63\xc8\xc0\xd6\x58\x96\xc7\xe3\xb9\xc8\x9a\x0f\x04\x2b\xce\x3a\x7e\x26\xa0\xcc\xf4\xca\x95\x18\x32\x58\x9b\x9f\x20\x4e\xe5\xbc\xfa\x1f\x31\x41\xca\xd1\x82\xbc\x07\x85\xd4\x3a\x93\x94\x82\x09\x84\xc6\xf9\xb1\x83\x19\xb1\xcf\x4f\xe3\xd8\xb3\x5f\xc3\x10\x62\x21\xe6\xd6\x01\xb8\x7e\x7c\x6c\xcf\xa8\xac\x38\x78\xa2\xc9\xf1\xdc\x33\x84\x46\xca\xf3\x56\x57\xe5\xa9\x9e\xb0\x5e\x13\x43\x12\x86\x19\xd1\xfd\x80\xe4\x71\xa8\xf0\x37\x5c\x4f\x86\xa6\x0c\x23\x66\x7f\x8a\x73\xe5\x2b\x37\xc6\xb7\x8b\x54\x8a\x3b\xd9\xad\x38\x82\x83\x0f\x8d\x9f\x3f\x32\x09\x3a\x30\x1f\x20\xaa\xfc\xc3\x2a\x4c\xb7\xf7\x99\x52\xd1\x12\x13\x53\x4b\x4e\xa2\xca\xa2\x00\xd5\x38\x2f\x61\x58\xc9\x6f\xe2\x98\x47\x68\x94\xb5\x6b\xa6\xac\x40\xdf\xa3\x60\xaf\x2c\x45\xa5\x2d\xf1\xc4\x68\x37\x33\x49\x24\x50\x12\x1d\x7e\x81\x42\x4d\xd9\x53\xa6\xba\x36\x23\x31\xa4\xe4\xa7\x4a\xfb\x40\x1b\xa8\xa1\x7a\xcb\x8a\xc3\xe3\x27\x32\x0c\xc4\x30\x21\x30\xa0\xab\xb1\x68\xd5\x01\x16\x5d\xd1\xc0\xf4\xdd\x19\x48\x5c\x49\x7b\x5d\xfe\x23\x65\x1a\x77\x19\x0f\x62\x84\xa2\x17\xe7\xe3\xcd\xe9\x2a\xeb\x0c\x03\xc3\x23\x82\xf3\x6a\x6f\x23\x04\x9f\x3c\x21\x67\x51\x62\x06\xfa\x84\x3d\x09\x9d\x49\x03\x82\x96\xd5\x4b\xa6\xe1\xba\x2c\x84\xe5\x9f\x1c\x7f\xd1\xd4\x9d\x87\x59\x91\x35\x19\x9a\x12\x8b\xab\xbb\x6f\xa2\x7e\xb9\x29\xab\x87\x01\x2b\xd7\xc0\xc5\x35\x69\x42\x51\x15\x0e\xd9\x24\x2e\xa6\x5c\x2a\xad\xee\x70\x6b\x82\xb8\x12\xe3\x81\x2c\x8d\x05\x2a\x5e\x9d\x3f\x1c\xb9\xd6\xc4\x3a\x31\xa9\x31\x08\xe8\xb0\x09\x6f\x25\x7c\x49\x87\x11\x49\x88\x5b\x5f\x01\xef\x3f\xca\x06\xaa\x81\xee\xb2\xef\xc1\x4c\xd8\x63\xbc\x2c\x13\xef\xbf\x41\x7d\xad\x45\x4e\x8c\x52\x09\xa3\x5e\x09\xf3\xe3\xd4\x88\x73\x65\x0b\x0c\xa6\x43\xa5\x75\x82\x86\xe4\x5e\x89\xe2\xaa\x72\xbc\xc3\x3f\x32\x31\xa1\x0c\x9a\x7c\x1f\x10\xc2\x2e\xd1\xf6\xa9\xf0\x3f\xad\x1d\x8d\x27\xed\xf0\x14\x35\x26\x20\xd2\x52\xcc\xff\xb2\x0e\x8e\x4f\x37\xf9\x76\x25\x49\xcf\x19\x70\x03\x30\x57\xb5\x41\x83\x20\x12\x89\xdb\x11\x9e\x2a\x38\x66\xe7\xa3\xe3\x0b\x19\x5a\x2b\x34\x20\x14\x8c\x37\x83\xf6\x65\x01\xae\xf2\x6f\xf5\xbf\x5b\xdc\x81\x5d\x49\x2a\x0d\x48\x62\x7c\x9c\xe4\xb1\xd4\x30\x54\xc1\xa0\x01\x4d\x53\x44\x14\xde\x97\x07\x1b\x96\x99\x2c\x09\xda\x9a\xde\x41\xd8\x13\xba\x40\x4d\x27\x1d\x62\xca\xd0\xaa\xd0\x90\x43\xd3\xfa\x4b\x79\x0e\xad\xf1\x30\x7e\xda\x38\xd2\xb8\xb2\x90\x60\x0b\x05\x43\x29\x0d\xbd\xb7\x4e\x83\x84\xe9\x28\xf5\x7e\xf8\xb9\x68\xb7\xff\x01\x4a\x9e\x06\x2c\xb1\xa2\xbf\xcb\x32\x2f\xab\x2b\xf1\x31\x18\x77\x1a\x30\x0e\x48\x49\xb0\x5c\x6f\x1e\x57\x9b\xed\x6e\xfd\xb8\x5a\x3c\xac\x9f\x1f\x77\x5d\x07\x45\xf0\x6c\x7e\xf8\xb8\x44\x7b\xd3\x80\x69\x86\x6b\xc1\x4e\x99\x6f\x22\xef\xaa\x13\x69\xc0\x4c\xaa\x3a\x62\x38\x7b\x5a\xdf\x00\x3c\x88\xee\xc1\xd3\x20\x44\xa2\x6e\x83\xf2\x5d\xed\x66\xb4\xb4\x14\x62\xbe\x83\x8c\xac\x68\x22\x9a\xf2\x36\xdc\xb7\xb7\xd5\xc1\xcb\xb2\x78\x83\xaa\x9e\x46\x9a\x69\x20\x19\x40\xe4\x31\x14\x55\x5f\xa0\xe1\x9b\x21\xc1\x38\xf0\xb2\x12\x56\x54\x86\x2c\xfc\x8f\x29\x12\x51\x0f\xa5\x7d\xbc\xbd\xd0\x4d\x19\xff\x8c\x8a\x6c\xd1\xea\x7b\x59\xbd\xd6\x2f\x9e\xc0\x92\x06\x2a\x66\x88\xdb\xdd\xc1\xaf\x4e\x56\xda\x35\x69\x88\x63\xd2\x7d\x6b\x5c\xc4\x37\x65\xb5\x14\x85\xce\x2e\x80\x66\x34\x00\x2a\xb0\xec\xe4\x56\xe8\x0c\xf2\xd1\x27\x03\x9d\x78\x2e\x52\xcb\x54\x77\x81\x76\x6d\xfb\x58\xb1\xda\xe6\x05\x44\x51\xbf\xfb\xd3\x9a\x06\x00\x21\x82\x97\x34\xa8\x0a\x15\x35\xbe\xaa\xc4\xa4\x24\x88\xa8\xe3\xc2\x68\xbf\xef\x43\xf6\x09\xf4\x80\x92\x80\x33\xd2\xbb\x84\x43\x58\xef\x34\x12\xe7\x2e\x20\x14\xa4\xc3\xda\xed\x6d\xd4\x68\xd2\xce\x38\x9a\x3f\xb7\x8e\x25\x60\x0e\x2f\x41\x09\x25\x1a\x11\x7b\x37\x65\x39\x1c\x23\x42\x65\xc2\x5c\x7c\x7b\x7f\x2a\xbb\xfd\x89\xf8\xbb\x53\x10\x68\x0f\x3b\x7e\xa7\xfd\x41\x1c\x61\x0f\x13\x78\x35\x25\xa1\xb2\x16\xd6\x8b\xa8\xef\xd1\x83\x78\x3e\x4d\x1e\x20\x84\x10\xcd\xdf\xc3\xb9\x79\x11\x12\x8a\x45\xf1\x37\x64\x87\x89\xe5\x40\x49\x44\x6d\x0a\xe6\x61\xbb\x5a\x7a\x16\xdb\x7f\x26\xc1\x4b\x49\xa4\x13\x65\x9d\xf1\xe7\xbb\xa2\xb1\x27\x88\x7f\xcf\x38\x62\x20\x5d\x81\x4c\x6b\x37\xaf\x7e\xd9\x9c\x9a\xb7\x0d\x7e\x5b\x6c\x4b\x49\x1c\x13\x4c\xee\x0a\xa7\xca\x6f\x33\x48\x5f\x59\xcd\x94\xc4\xa9\x7d\xeb\xb7\xb2\x81\x3b\x3c\x3a\x3f\xd7\x32\xfd\xd2\x00\xa7\x24\x96\x29\x82\x48\xb0\x18\x1a\xa3\xd5\x17\xb5\xd0\x94\x24\x42\x86\x5e\x4b\xf6\xc3\xea\x18\x22\x5f\x04\x89\x1c\x43\x40\x34\x49\x18\xf9\xeb\x64\x8a\xfc\xe8\x08\x80\xf4\xa1\xaf\xdf\xd7\xf9\x52\x92\x40\xe0\x89\xf3\x6d\x79\xdf\xd5\x07\xa6\xe1\x46\x1f\x26\x01\xc0\x68\x95\x2d\x10\xa9\x44\xd6\x11\x9c\x52\xc2\x62\x1a\x3a\x90\xe0\xb5\xf8\x98\x2f\x31\xa1\x84\x27\x1c\x8b\x93\x31\x24\xb9\xcb\x0a\x57\x4b\x38\xa0\xc1\xa0\x24\xe5\xe0\x21\x41\xd7\xdb\x9d\xaf\x18\x9b\x0c\x50\xaa\xad\x9b\xb1\xae\xb2\x83\x38\xda\xac\xd3\x6c\xf1\xee\xef\x3f\x48\xaa\x35\x82\x21\x85\xab\x6f\xc1\x7b\xad\x76\xdf\xec\x96\xfb\xd9\xfa\x4f\x8d\xc0\x83\x60\x75\xf7\x44\x83\x2f\x7c\x72\x4a\x04\x31\x78\x1c\x41\xa1\xcb\xaa\x86\x25\x16\x36\x7d\xf6\x8c\xfe\x9a\x90\x69\xda\x89\x24\x4e\x42\x27\xe3\xae\x32\x61\x48\xa8\xb2\x7c\xfc\xcb\x8e\x42\xee\xd9\xc2\x28\x91\x52\xc4\xa9\xaf\x4d\xc5\x85\x81\x52\x2a\x13\xda\x60\x4a\x54\x1c\xa3\x19\x8f\x9f\xc5\xd6\x0a\xce\x66\x83\x28\xd1\x4c\x73\x18\x02\x34\x86\x26\x39\x25\x5a\xf3\x38\xe8\x8b\x07\xb5\x55\x7d\xe8\x9e\x07\x08\x61\x2e\xb7\xee\x3f\x96\x13\x18\xb0\x3c\xe0\x7d\x20\x97\x12\x48\xad\xf2\xbe\xb5\x6c\xea\x21\x59\x3b\x25\xa0\x6d\x50\x08\xf5\xfb\xea\x0e\xde\x40\xd1\x6e\x74\xf4\x69\xf5\x64\x6f\x33\x60\x2c\xd8\xd9\x42\x69\xde\xaf\x2b\xf1\x3e\xed\x62\x2c\xef\x36\xde\xb6\xdd\xfc\x97\xde\x20\xa5\x34\x88\x28\x1a\xde\x6f\xa8\x77\x33\x08\x73\x3b\x64\x8d\x73\xab\x28\x25\x82\x26\xc2\x33\x69\x59\x82\xc6\xd1\xaf\x50\xa2\x42\x64\x47\xf3\xb9\x98\xff\xb4\xe8\x2a\xbf\x6b\x8d\x3b\xd3\x54\x48\x5f\x65\x8d\x34\x8b\xd3\x76\x03\x18\x21\x7e\x78\xfc\xcb\x3f\x69\xc8\x2c\x3d\x6f\x0d\x8d\xcd\x0c\x5f\x3b\x26\x4d\x7c\x18\x12\x4c\xee\x10\xa6\x21\x09\x47\x88\x10\x1b\x4a\x1c\xcf\x11\x1a\x2a\x4d\x5c\x39\x47\x37\x37\xe6\xe6\x2e\x8d\x68\xe2\xe1\xc2\x8e\xc0\xff\x77\x0b\xd2\x5d\x18\x73\x83\x69\x89\xd6\x28\xac\x0e\xa3\xaa\x14\x4a\xe3\x94\x5b\xc9\x2d\xad\x97\xe5\xb9\xaa\x61\x0a\x5b\x99\xfe\x3b\xb3\x14\x69\x42\x13\x54\x8b\x74\xb9\xcc\x75\x71\x05\x2f\x22\x37\xf3\x09\xbe\x71\x7a\x61\x7e\xdf\xa4\x89\x0e\xe2\x5e\x6c\xed\x33\x74\xf3\xff\x9f\xd9\x90\xc9\xf8\x30\x12\x1a\x36\x12\x20\xf7\x0d\xd2\x18\xda\x69\xcb\xce\x23\xc9\xc7\xeb\x98\x32\x65\x73\x59\xad\x29\x8a\xdc\x0c\x93\x9f\x52\x96\x44\xf0\x45\x58\x55\x65\xff\x4b\x3c\x88\x71\xaf\xcc\xa4\xba\x39\x23\x5e\xd6\x37\xc8\x14\x85\x04\x10\xaa\x33\x58\x35\x5c\x82\x42\x08\x94\x0f\x94\x74\x55\xa1\xae\x43\xca\x25\x77\xcf\xbe\x1a\x10\x22\x76\x03\x2c\x65\x24\xb8\x87\x3c\x9c\xa0\x72\xe4\x01\x53\x54\xa9\xef\xad\x39\x26\xc5\x65\x59\x9c\xeb\x9b\xb2\xba\xbe\x30\x34\xa9\xe2\xb6\x0b\x14\x7a\x0b\xa0\xb7\x3d\xa2\x8c\x52\x4d\x28\x5a\x2d\xa8\x9a\xf0\x73\x94\x2a\xdd\x95\x8b\x79\x93\x8c\x6a\x62\x4d\x4f\xcb\xf3\xa7\xcf\x0a\x31\x7a\x39\xa0\x82\x45\x57\xeb\x4f\xa9\x06\x8d\xac\x82\xf0\x0b\x3c\xe3\xca\xf4\x94\x74\x6e\x31\xa5\x40\x92\x4e\x95\xbe\x3d\x6c\xad\x11\xf4\x1d\x3e\xdc\x36\x38\x7e\x02\x48\x15\x9a\x14\xf7\x67\x0f\x00\xa1\xd4\x04\xbc\xa7\x9c\x7f\xaa\x50\xc0\xc9\xc2\x76\xbb\x1e\xc0\xa9\xd7\xde\x42\x67\xe5\x5b\xd6\x6e\x59\x1f\xc3\x6a\x29\xdb\x35\x0c\x52\xe6\xf1\x31\xed\x5e\x0c\x79\x8e\xec\xe0\x5d\x1e\x93\x86\x81\x54\xe0\x08\x1c\xe6\x80\x60\x34\x0c\x40\xa2\x11\xdf\x55\x91\x76\xa1\xb3\x87\xec\xd7\xa4\x38\xa2\xed\x6d\x8b\x6e\xd1\xd2\xe8\x05\xd0\x68\x48\x18\xe0\x09\x82\x0d\x3f\x21\xdb\x88\xac\x06\x7d\x7d\x6e\x7f\xe9\x6e\xb9\x26\x5d\x3f\x61\xb9\x7c\xfc\x00\xde\x8a\x23\xd4\x9e\x12\xd8\xf5\xa1\xb1\x8a\xa5\x8b\x85\x6c\xb3\x2a\x3b\xd7\x3d\x0f\x37\x0d\x43\x16\xe2\x6e\x74\x2e\x5e\xca\x5c\x0f\x68\x8c\x68\x18\x6a\x8e\x08\xfa\xab\x0c\x9d\xfb\x4d\xe6\xab\xf4\x69\x18\x49\x81\x71\xef\x87\xbb\xc7\x81\x0c\xfc\xee\xce\xeb\x38\xd3\x30\x56\x36\x32\xfd\x04\x50\x6d\xe0\x2d\x83\xf7\x31\x40\xc8\x77\xd3\x14\x55\xaa\xd0\xd0\x85\xc2\x11\x7f\xc0\x70\xcc\x13\x63\x91\x99\xbe\xfe\xd6\x4b\x3b\xcf\xc5\x3d\x68\xc8\x78\x1c\x47\x43\xfc\xc9\x67\xfd\xc0\x16\x99\xf6\x1a\xe2\x7e\x4f\xb1\xa4\xb0\xbf\x09\x74\xba\xbb\x70\x9e\x60\x7c\xff\x24\x3e\x5a\xaf\x72\xe1\xe9\xdd\xda\x16\xc3\x94\x43\x8c\x78\x8d\xa6\xe5\x30\xfc\x32\xc0\xae\x0e\x96\x44\xc8\x95\xd2\xb2\x2f\xfd\xb9\x2b\x4c\x39\x99\x34\x29\xb3\x42\x78\x76\x2f\x5e\x9b\x45\xf3\x82\x51\x86\x01\x29\xda\x68\x4a\x4a\x2a\x63\xde\xe5\x69\xa4\x8d\x50\x0d\xcd\x8c\x50\x85\x01\x02\xab\xc5\x4b\xdd\xff\xc9\x1a\x9e\xe3\xf4\xe2\x20\x7d\x44\x43\x08\x63\x26\x9c\x5c\xbb\x15\x4c\xfd\xdd\x3e\x3f\xf8\xa8\x10\x85\xb1\x3b\xef\xf1\x27\x36\xc8\xd4\x7c\xfb\x0e\xd9\x64\x4d\x82\xa4\x18\xbd\x7d\x39\x57\xc7\x4f\xdd\xd4\xd0\xd0\x94\xe8\x8e\x63\xac\x5d\xb5\x57\x99\x9e\x44\x87\x42\xa3\x0d\xc2\x2f\x9f\x44\x39\x51\x84\xa7\x51\x40\x03\x04\x28\xdc\x6e\x97\xbb\xee\x6f\xb1\xad\x0b\x16\x36\x30\x3a\xbb\xe0\xa3\x20\x65\x58\x9d\xdd\x60\x81\xea\xfc\x31\x14\x05\xa0\xb0\x28\xc1\xdd\xe9\x7e\xa8\x0c\x3b\x7a\x91\x28\x30\x09\x93\x5e\x7f\xde\x56\x3d\xa3\xb8\xd1\xb8\x17\x21\x1c\x43\x43\x36\x13\xbf\x13\xc5\xeb\x16\xf2\xfc\xe1\x92\x7e\x9f\x46\x84\x12\x4b\xd3\x66\xc1\xb9\xab\x5f\x59\x3d\x49\x38\xd0\x88\x84\x02\x83\x45\x3f\xd6\xf7\xcf\x0f\xab\xfd\xd5\xfa\xf1\x79\xeb\x07\x81\x44\x31\x22\x86\xb6\x0f\x77\xf7\xeb\x5e\x45\x6f\x14\x4c\xc2\x4e\x36\xfa\x90\x8f\xea\x8c\x66\x47\x8c\x80\xc4\x42\xbf\xbd\x3c\x35\xe5\x6f\xe7\xcc\xf8\x6d\x28\xb5\x94\xb5\x79\xa9\x5e\x91\x56\x61\x5d\x60\x81\xf9\xb9\xd0\x1d\x1d\xc9\xfc\xc0\x86\x34\xc5\x08\xe2\x42\x23\xab\x75\x3d\x3e\x51\xa3\x50\x19\x29\x3b\x6c\x66\x3b\xcd\x27\x2a\x88\xe3\xe7\x88\x02\x2b\x4e\xea\xf5\xf3\x47\x5c\x3c\x34\x8a\xc3\x88\xd2\x4e\x0a\xbc\xfd\x36\xdb\x01\xcf\x8c\x65\x36\x67\xf6\xd4\x3a\xc0\x54\xb6\x80\x46\x49\xc0\xd1\x27\xc0\x30\x66\xf3\x52\x01\xdc\x88\xbc\x86\x05\xf2\x17\xfa\x7b\x24\x3c\x4c\x1c\x49\x18\x66\xd5\x9d\x0d\x0c\xb9\xf8\x98\xde\x2e\x0d\xd1\xca\xc1\x09\xbf\x9d\xcb\xe2\xcc\x0f\x59\xa2\x01\x4b\x1e\x6a\x51\x64\xcd\x07\x3a\xf2\xfe\xc7\x59\x20\xf0\xa4\xdc\xbe\x94\x27\xcf\x73\x34\x1e\x21\x16\xa6\x88\x2f\x7e\x2b\x1b\xd8\x4b\x28\xc0\x64\x2a\x13\xd5\xd8\xdc\x8d\x58\x4a\x10\x93\x69\xc1\xef\x36\x1d\x36\x47\x4a\x35\xc0\xbe\xb4\x17\xc5\xa9\x18\x48\x91\x4f\x7f\x59\xc4\xc8\x90\xf7\x96\x55\xcd\xd9\x0b\x30\x7d\x32\x2b\x98\x10\x58\xae\xb6\x6c\xbd\xe2\xce\xa1\x8c\xd2\x40\xe1\x07\xb8\xdd\xac\x56\x8f\xab\xce\x96\x88\x52\x16\xa2\xf7\x2f\xcf\x75\x56\x40\x5d\x4f\xc1\xfa\x34\x4a\x8d\x94\x49\x0f\x57\x1c\x6d\x40\x91\x48\x28\x16\xa6\x28\x0b\x72\x12\x75\x59\x8c\x75\x33\x07\x2f\x29\x78\xc4\xbd\x69\xd4\xe3\x5e\xbb\x27\x14\x90\x7a\xc9\xce\x87\x6c\xa0\xee\xe8\xdb\xa5\xb2\x3a\x01\xad\xd5\x63\xcb\xc9\xc7\xf3\xd9\x77\xd3\x12\x33\xf4\xe0\xe2\x4b\xbb\x5f\xce\x3b\x1d\xdb\xff\x91\xe2\x61\xda\xb3\xe5\xb7\x36\xcd\xc4\x94\x89\xb4\x34\x48\x9d\x94\xd5\x8f\xf0\x7e\x25\x9a\x26\x1f\x47\x55\x22\x6d\x08\x56\x19\x8a\xbc\x02\xa1\x3f\x26\xfc\x21\x34\x02\x6d\x2c\xab\x04\x22\xde\xda\xa9\x3a\x24\xda\xf7\xbd\x8c\xd2\x91\xfd\x02\x1f\x8b\xd6\xb2\x6d\xae\xb3\xb7\xc1\x57\x18\x4f\x9d\xe1\xef\xc7\x81\xe3\x76\xea\x8e\x41\x0c\xfc\xcc\x6e\x33\x71\x00\x94\x3a\xe9\xbf\xee\x21\x26\x4c\xf8\x34\x26\xc4\x58\x2d\xc2\xb7\xbe\x50\xd5\x41\xa3\xbe\x42\x7f\xd0\x98\xa4\x31\x6e\x1e\x57\xe2\xf0\x82\x05\xa6\xbd\x16\x14\x8d\x69\x6c\xd5\xed\x6a\x7b\xfe\x43\xa1\x27\xc9\x85\x98\x4a\x2b\x60\x03\x9d\xa0\xe0\x24\x59\x45\xe3\x90\x26\x5a\x0d\x0a\x5f\x41\xdf\x94\xd5\x05\xd9\xf9\xf8\x9a\x88\xa7\x0e\x68\x2b\xb4\x35\x54\x7c\x03\x10\x94\x93\x13\xa6\x81\xca\x29\xb1\x97\xd5\xb7\xb2\xf4\xbb\x41\x1c\x73\xe9\xd2\x1d\x75\x53\x95\x1f\x36\x18\x30\xff\xee\xb1\x66\x08\xd6\x73\xc5\x8b\xa2\xdb\x33\xe3\xd8\x30\xa1\x7b\x59\x87\xbb\xa3\x38\xc0\x9d\x37\x53\xe3\x84\xd0\xd0\x65\x6c\x6c\x64\x49\x66\x13\xa7\x28\x4e\x62\x4b\xc6\x51\x3a\x4a\x90\xcf\xa3\xda\x31\xd3\x96\x6c\xd8\x69\x1d\x94\x47\x78\x5e\xed\x10\x39\xf1\xc9\x05\x5c\xa6\x81\x35\x53\xdb\x23\x76\xe9\x45\x03\x68\x9c\x86\x1c\xbf\xa5\x0d\x72\xf4\xf1\xa4\xae\x59\x46\x56\xab\x50\x43\x55\x2f\x45\x81\xe0\xd6\xae\xd0\xf7\x5f\x24\xea\x59\x94\x08\xb7\xff\x9f\xff\x8b\xff\xcf\x7f\x0c\xf5\x46\x3e\xf9\xaf\xff\x09\x61\xeb\x5c\x37\xad\x4f\x5a\x74\xcf\x25\x15\x16\xb4\xbb\x32\xa7\x69\x9d\x24\x8d\x05\x0b\x89\xf6\x4c\x9a\x58\x71\xfa\xfd\x71\xd9\x5a\x61\x23\x98\xcb\x64\x18\x04\x03\x2c\xfd\x7b\x58\xdd\x2e\xf6\xdf\x56\x9b\xf5\xfe\xe1\xf9\x7e\x77\xf7\x74\x7f\xe7\xb5\x1e\x69\x2c\x74\xc4\x3a\x30\x87\x81\x6a\xb5\x59\x5a\x60\x8d\x0b\x28\x67\x65\x61\x39\x60\xa7\x87\xcf\x44\xdd\x65\xfe\x43\x28\x2e\xd1\xad\xb8\x7f\xb8\x1b\x54\xb4\xd3\x58\x81\xc6\x2c\x66\x57\x77\x3c\x54\x8a\xa2\xb1\xe6\x31\x8d\x86\x62\x39\xe8\x60\x8c\x7e\x63\xc8\x3f\x3e\x83\x23\xa0\xb1\x16\x56\xad\xda\xc7\xb3\x50\x1f\x1f\xc1\xfe\xae\x03\xb0\x40\x38\x4f\xb3\x38\x1f\x3b\x55\x47\xdb\x9a\x04\x04\x18\x1b\x14\x5f\xc0\x20\xc8\x35\x7e\xc9\x24\x20\x46\x08\x84\x87\x3d\x3f\x5e\xef\xaf\x17\xbb\xc5\x7e\x39\x30\xb7\x12\x92\xa6\x88\xe3\xf5\x8c\x40\xdf\x86\x55\xc5\x63\xec\xe8\x4c\xdd\x39\x4d\x08\x44\x78\xbc\xc9\x73\x35\x36\x97\x3c\x07\x07\x4d\x88\x31\x36\x3a\x7d\x82\x42\xb7\xcb\xd4\xe6\x49\x3e\xa7\x0e\xa3\x49\xbb\x48\x2d\xd5\x63\xc7\xa0\x39\x5e\x0d\x09\x05\x89\xb0\xe4\xa7\xcd\xca\x8a\x83\xac\xd7\xf7\xfe\x9d\xc2\x20\x70\xa4\x1e\x58\x1c\xe3\xa2\xb3\xf3\xe3\x13\x06\x02\x03\x01\x5e\xe0\xc5\xab\xec\x0f\x4a\xaf\x96\xe2\xf4\xc9\x63\x46\x8c\x62\x85\xc5\x76\x37\x94\x02\xa4\x49\xac\x6d\x79\x08\x9e\x3f\x8b\x61\x99\x09\x4d\x92\x88\x45\x91\x57\x54\xc8\xe1\x20\x74\x79\x0d\xf6\x64\x68\x4a\xab\x0c\x3e\x5b\x66\x45\x93\x84\x71\xb4\xf4\x50\x31\x8f\x5e\xca\x69\xd0\x24\x31\x11\x92\x0b\xfd\x19\xfa\x5f\x63\x81\xd5\x50\x3f\x89\x0f\xbc\x80\xcc\x06\x64\x12\x16\xc7\x88\x4e\x82\x5f\x4d\x25\xac\x9f\x36\x04\x9f\xd1\x84\x09\x1a\xfb\x24\xd2\x16\x23\x10\x58\xd7\xda\x95\x92\xd3\x84\x19\x8a\x45\x0f\x79\xa5\xc6\x1c\xb4\x34\xe1\x01\x15\xee\x08\x74\x3f\xbf\x2b\x27\xb9\xf9\xcb\x2d\xa9\x9b\x61\x3c\x62\xf8\xd3\x77\xbb\xed\xc3\x68\x94\x53\x11\x52\xe6\x6a\x8b\x8b\x9b\x73\x71\xc8\x64\x0e\x57\xa2\x9e\xf1\x72\x92\x54\x0b\x11\x0f\x78\x5e\xf0\x6c\xdd\x36\xe2\x75\x6a\x6c\x26\x22\x14\xba\xdf\xcf\x6d\xce\x19\xf4\x0c\x89\x01\x4d\x44\x14\x12\x24\x6b\x5d\x6c\x6e\x57\xbb\xfd\xf3\xb6\xdb\xb9\x12\x21\x6d\x41\xb7\x25\x83\x87\x62\xc0\x62\xe4\x7b\x80\x44\xaa\x51\x55\xb6\xee\xe3\x72\x7a\x86\x25\x92\x5a\xdd\x28\x6b\x26\x3d\x64\xc5\xa3\x50\x93\x97\x92\xb1\xc4\x85\x05\x85\xf6\xf4\xf4\xbe\x45\x27\x78\x71\xe9\x2a\x28\x86\xdb\x75\xa2\x08\x55\x16\x2a\x9e\x23\x8f\xf2\x5d\x67\xea\x25\x2a\x09\x31\xb4\x68\x35\x91\xdd\x1f\x75\x20\xbc\x94\xe2\x57\xc0\x76\x9a\xe8\x38\x80\x0e\x99\xef\xcb\x95\xeb\xab\x8f\xc9\xb0\x69\x6e\x95\x61\xb6\xdd\x96\x9b\x68\x93\xa2\x67\x8e\xa0\xee\x2d\x54\x6f\xd9\x27\x9a\x7b\x34\x01\x11\x60\x08\xa7\xdb\x9d\x97\x25\xea\x4a\x5a\xf4\xdc\x64\x84\x00\xa2\x74\x58\xc3\x81\x5f\x7c\x86\x46\x82\x26\x60\x42\xaf\xae\xec\x6a\xfd\x7f\x66\x45\x01\xd5\x43\xf9\x06\xc3\x00\x47\x62\x92\xd0\x24\x83\x68\xc3\xda\x18\x68\xf7\xc5\xf9\x31\x61\x01\x4f\x0d\xf1\x2b\x4b\x35\x5d\xf6\x72\x84\x13\x41\xc5\x20\x8b\xbd\x2a\x4f\x2f\x1f\x63\x63\x84\xd1\xd4\xc6\xaa\x2d\xb7\x85\x0d\xdf\x0d\x58\x1c\x28\xa3\xc2\xa2\x3b\x30\x61\x2f\x6a\xb0\xe8\x2b\x91\x7f\x51\x85\x43\x59\x64\xc2\xd8\x33\x49\x94\x99\x05\x6e\x4d\xb9\xe9\x5d\xd7\xd6\xde\x45\xda\xb3\xc5\xe3\xdd\xf2\x69\xb5\xb9\x5b\x5f\xfb\x9f\x8e\x15\x57\xd2\xcf\x0d\x54\x98\x9b\x01\x45\x52\x96\x10\xc0\xc8\xa0\xc3\x9d\x75\xec\x2d\xf3\x9b\x32\x4b\x9c\xd6\x5e\x7d\x96\xc7\x0c\x39\x8b\x3e\x45\x8a\x8d\x7f\x26\x0e\x52\x65\x95\xa8\x31\x53\x76\x75\xce\xf2\x9e\x63\x8d\x32\x46\xb4\xdd\x97\xa1\xd0\x43\x6c\x95\x6f\xa6\x21\xf2\x60\x67\xaa\x1c\x78\x41\xf3\xdf\x95\xeb\x00\x19\xbe\xaf\x76\xcb\x95\xa8\xfa\x2f\xc9\x75\x82\x21\x62\x37\x89\x56\x58\xfa\x66\x85\x49\x5c\x0f\x11\x04\xb8\x15\xdd\x43\x53\x0f\x63\xa4\x4c\x24\x49\xd2\x91\x09\xde\xb7\x9b\xfc\x40\xab\x8c\x32\xc1\xd3\xd4\x55\xe3\xb6\x9b\x09\x78\xef\x6a\xf6\x90\x1e\x0d\x8b\x24\x4a\x3b\x5d\xb4\x66\x8f\xb4\x8d\x9f\x54\x3e\x7d\x9d\x4d\x61\x32\xb2\x8a\x5b\x43\xfd\xbd\x3f\xba\x36\xea\x19\x21\xae\xb2\xe6\xb6\x1d\xf8\x4b\x78\x24\x65\x8a\x1a\x4b\x3b\xec\xbe\x10\x0a\xd3\xff\x3d\x59\xb6\x4c\x69\xc3\x99\x2f\x2d\x6b\x26\x8d\x3a\x0e\xb0\x2a\x30\xab\xd7\x27\x28\x6e\xca\x6a\x04\x77\x60\x5a\x58\x67\x77\xb7\xbb\x75\x99\x72\xd7\x00\xd4\x06\x52\xb6\xcd\x59\x67\x23\x28\x08\x33\x41\x80\x49\x8c\x76\x80\xbe\x75\xc4\x59\x94\x19\x95\x62\x0d\xc7\x76\xb9\x78\x70\x7f\xe3\x01\x91\xb1\x85\x5a\xdc\x15\xbb\xec\xf8\x95\x8d\xcb\x83\x24\x42\xd1\xa7\x5b\x17\x52\xef\xee\xc1\xe3\x00\xbc\x38\x6d\xa1\x37\x1e\x8b\xeb\xcf\x3c\x4e\xb8\xa5\x2b\xb9\x45\x3d\x41\x38\x94\xd5\x47\x9f\x16\x75\x76\x15\xa7\x2a\xc6\x78\xb7\x77\x7f\x6f\x00\x26\x09\xd1\x79\xc3\x97\x47\x01\x84\x36\x55\x5e\x38\x3c\xba\x7f\xb0\x88\x00\x06\xdf\xb2\xfa\x41\xfc\x1a\x10\x3a\xf8\xe6\xd0\x96\x3c\x6c\xe0\x0d\xaa\xda\xc9\x38\xc1\x6c\x25\x25\xe5\x11\x44\x08\xc7\xd3\xd0\x1a\x70\xa7\x81\xe7\xdd\xbe\xbd\x0d\xf7\xb6\xc7\xd2\x23\x80\xae\xad\xf9\xd5\xb5\x93\xc4\x73\xdb\x39\x84\x22\x12\x86\x97\xe7\xe6\x8f\xa1\x7e\xe0\xe4\xb5\x62\x6a\x63\xb2\xa2\x69\x84\x7a\xdd\x65\xf9\xd8\x71\x24\x73\xc1\x63\x1e\xc7\x76\x1d\x6b\x38\x9e\xab\xf6\x2d\x6e\x00\xae\xa1\x38\x1f\xfd\xb3\xb0\xd4\x86\xe5\x6b\x28\xd4\x37\xac\xe6\xf4\x73\x9e\x73\x1e\xe0\x63\x9e\xc4\xc7\xfa\xdc\x20\x5c\xeb\xea\x63\xd6\xc0\xe2\x5c\x5a\xb2\xce\xc2\xb3\xa5\x64\xc5\xa1\x5e\x34\x0d\x1c\x4f\x7d\x7a\x85\x73\x69\x63\x9f\x50\x1c\x2a\xf1\x86\x55\xdd\xf5\x49\x28\xf8\xe3\x0b\x0b\x9c\xa7\xd4\x44\x0e\xf6\xf9\x94\x5f\xca\x96\xff\x4e\x1a\xf7\x93\xc1\x4c\x0d\xe5\xe0\x59\x66\xea\x66\x14\x94\xef\xba\xa4\x42\x74\x0c\x6a\x68\xce\xa1\x40\xc2\x48\x34\x7b\x38\xd6\xa2\xb5\x33\x6d\xc0\xe5\xaa\x2c\x5f\xef\xcb\xc6\xd7\xe6\x52\x2e\xb4\x96\x1d\x3c\x61\x2f\xe7\x83\x11\x5c\x18\x06\x6a\x54\x94\x3a\x5f\xcd\x40\xb9\x64\x09\x86\xd7\x6c\x7d\xe2\x4e\x4f\xb6\x18\xae\xa4\xa5\x6c\x3c\xd7\x50\x7d\x83\x5c\xef\xb2\x7c\x12\xfc\xe3\x4a\xb3\x08\xc3\xd5\x85\x38\xd5\x2f\x65\xb3\x28\xfa\x08\x0e\x3c\x95\xde\x22\xe0\xca\xc4\x28\x7a\x23\xcb\xf2\x35\x2b\x0e\x0f\xd0\x08\x27\x2e\xf4\x1d\x7c\x98\x96\xeb\xc0\xd6\x7b\x0a\xa5\xaa\x33\x5c\xb7\x5e\x06\x14\x5a\x14\x7a\x59\x9e\x4f\xe5\x65\xf9\x9f\xbf\x2c\xd4\x88\x6a\x29\xe0\x7d\x23\x14\xfa\x09\xcb\x72\xb2\xa9\x72\x1d\x83\x53\x42\xac\x9d\x71\x63\xb9\x5b\x3b\xa8\x11\xd7\x90\xa2\x3f\xe5\x5c\xf8\xaf\x83\x4a\x1c\x94\xb5\x59\xfe\x2a\xcf\x95\x2d\xed\x1d\xee\x96\xdc\x84\x04\xd8\x38\x77\x8e\xb5\x41\x59\x71\xb8\x4c\x1e\x73\x13\x0a\x6a\xeb\x31\x3d\x28\x7c\xcc\x64\x6d\xbb\xa5\x41\x0a\x68\x64\x76\x66\xdd\x9d\x06\xb1\x85\x7c\x82\xf9\x4b\x03\x45\x31\xd6\xe0\x74\x09\x7a\xf6\xf6\xd9\xe8\x5b\x1a\x98\x04\x79\x75\x5f\xca\xaa\x86\xed\x4b\x09\x4f\xd5\xe4\x86\x24\x90\xe0\x88\x39\x77\xd9\x34\xd2\x98\x12\xa1\xb0\x3a\xa8\x1d\xb5\x9f\x59\xa1\xcb\x77\xbb\x53\xcd\x17\x57\xd3\x94\x86\x21\x12\x8a\x6c\x4a\xf5\xfa\x24\x4e\x50\x6d\x55\x56\xd7\x65\xf5\x75\x15\x17\x4d\xa9\x53\x9e\xb7\xc8\xcf\x55\xd1\x54\x1f\x0e\x4e\x36\x5a\xec\x29\x4d\x65\xec\x22\x8f\xdf\xcf\xba\x6c\x3f\xb4\xc7\x70\x8f\x5f\x3c\x62\xdc\x2b\xd2\xfe\x7c\x11\xb9\x4d\xe9\xb9\xb6\x24\xb4\x41\x6f\x53\x1e\xba\x3f\xf1\x00\x01\x84\x70\x9a\x64\x33\xd2\x44\x0b\x84\xbf\xff\xbb\x6e\x47\xbb\x99\x6c\x45\xe3\x1f\x65\x12\x58\xef\xb3\x60\x29\x6a\x4f\x2c\x74\x01\xc4\x49\x39\x8b\x10\xe6\x85\xa5\x57\x98\xf4\xf2\x3f\xca\x25\x45\x2a\xaf\x7d\x3b\x1d\x56\x48\x73\xd0\xae\xa5\x81\xfd\x9a\xa6\x41\x8c\xe1\xb0\x0a\x4b\x44\xbf\x06\x23\xa6\x29\xb7\x18\x2c\x47\x64\x60\x83\x10\x03\xba\xe1\xc9\x7b\xa4\x1c\xc0\x71\xb6\x3c\xd9\x15\xe3\xb1\x57\x5f\xe1\xca\x52\xa1\x2d\x79\x8e\x98\x6a\x85\xf9\x76\x00\x61\xe3\xda\x5b\x68\xce\xa7\xcd\xb9\x28\x7a\xe3\x34\x95\x21\xe7\xa4\xa3\xe4\x9e\xd9\x70\x53\x15\x44\x98\x61\xd8\x7f\x80\xa8\x76\xef\x25\xc2\x30\xbb\xd3\x23\x55\x8a\x87\x30\xe4\xbc\xfd\x0e\x1f\x43\xd7\x25\x85\x10\x10\x4a\xf8\xd7\xfa\xe9\xf7\x14\x1f\x34\x85\xc4\x78\x11\x49\xac\x66\x79\x19\x20\xc6\x53\x00\xeb\x95\x5b\x30\xef\xf3\xf6\xfa\xcf\xdb\xd5\xe4\x71\xc1\xc4\x08\x2c\x13\xda\x12\x7e\x88\x7c\xa0\xf0\x4f\x53\x13\x80\xc5\xc5\x1d\x3b\x30\x5c\x6a\x68\xe4\xf9\x7f\xbf\x8f\xef\x26\x02\x6a\x70\xe1\xfb\x34\xd9\x5d\xe1\x59\xa4\xa8\x08\x12\x19\x59\x3d\xa4\xe6\x5c\x15\x77\x45\xc3\xff\xe8\xed\x24\x11\x28\x62\xd5\xc7\xcf\x79\x76\xfa\xa4\x36\x85\x0a\x22\xac\xd0\xd2\x52\x14\xdb\xec\x50\xdc\xf9\xed\x4e\x10\xc9\x30\x16\x6c\xc3\xcc\xb3\x39\xaf\x2f\x13\x8d\x82\x00\xc5\xa4\xb9\x1b\xaa\x41\x45\xf4\x6f\xc0\x4e\xee\x7a\x1a\x28\xdc\x53\x4e\xe5\x7b\xa7\x23\x43\x05\xa5\x01\xa6\xcd\x90\x0c\xd6\x15\x58\xd4\xdf\xb2\xc3\x0b\x20\x71\x6c\xdf\x4d\xa3\xbb\x6c\x45\x53\xd0\x88\x9c\x9e\xaa\x82\xea\x14\xcd\x8e\xff\x3d\x67\xea\xb5\xa3\x76\x77\x8d\x51\x3b\xf2\xed\xd8\x9e\x8b\xa7\x0a\xcb\x52\xbb\x16\x9d\x46\x7d\x9e\x73\x88\xb3\x10\x71\x10\x4a\xf8\x42\x84\xf3\x82\xf0\x9f\x8a\x98\x5a\x68\x06\xe2\x70\x91\x3d\xe7\x8f\x8e\xa9\x67\x1e\x49\x26\xe2\x44\x53\x65\x8b\xf2\x51\x57\xcb\x43\x59\x44\x92\xc4\xc8\xed\xba\xc7\x0c\x52\xaf\x2d\x4c\x45\x22\x22\x34\xf7\xf6\x6f\xb6\xbc\xbc\x69\x17\xe0\xc0\xa8\x16\x2c\x20\xe8\x42\xd6\x22\x07\x67\xee\x0d\x4f\x52\xc1\x22\x1d\x4b\xaf\xbd\x5c\x1d\xd1\xfb\x9f\xcc\x24\x96\x58\x68\x68\xe3\x89\xec\x86\x83\xc6\x24\xc7\x0c\x08\xd6\x8d\x5f\x7f\xe2\xb0\xcf\x0c\x0f\x53\x96\x99\x00\x95\x48\x23\x32\xfd\x49\xcd\x95\x2d\x6c\x2f\x0e\xcd\xcb\xea\x7f\xcf\x22\x1f\x8c\xde\x9c\xaf\x2c\x98\xb1\x3e\x56\x56\x7f\xff\x6b\xe9\x20\xa5\x7a\x57\x6e\x3b\xae\x15\xff\xc4\xdc\xc9\x86\x1c\xb3\x62\x2f\x06\x3c\x76\x54\xf0\x24\xc1\xe8\x8a\x38\x4a\x51\xd7\x42\x97\x55\x3d\x24\xfb\xa2\x82\xf3\x04\x93\x39\x45\xf3\xb2\x29\xcb\x66\x20\x96\xe7\x87\x3b\xe5\x11\x92\x03\xe1\x11\xf0\x90\x15\xa0\x17\xdd\xed\x53\xa0\xa1\x97\xae\xa9\xde\x86\xb2\x68\x54\x08\xc2\xb1\xea\xd9\xb2\xaf\xef\x57\xcb\xf5\xf6\xaf\xed\x6e\xf5\xd0\xb5\x87\x51\x28\xba\x28\x9e\x9d\x4e\xa3\x50\x63\x37\x89\x44\x1a\x46\x96\x3d\xe5\xd7\x5c\x09\x25\x15\x42\x32\x2f\xb8\x7b\xfb\xb4\x1d\x22\xee\x48\x72\x99\x57\xbe\xcc\x31\x0b\x09\x80\x85\x75\x4f\x28\xb5\xf3\xcf\x12\xe6\x42\x09\x1d\x27\x7e\x39\xec\xab\x61\x06\x42\x68\x4a\x3c\x53\x51\x03\x7d\x65\x55\xf7\x4a\x3a\x54\x58\x8f\xb3\xde\x2d\x31\x7b\xd5\x5d\x17\x4b\x5c\x95\xfb\xac\x5e\x55\x6a\x57\x3e\x8a\x26\x7b\x83\xab\x2a\xd3\x87\x49\x78\x5d\x68\x65\x15\xf0\xdb\xbd\xff\x2c\x2a\x9d\x89\xe2\xc7\x45\xed\x83\xd0\xca\x96\x48\xec\xd6\xbb\xc5\xfd\x7e\xb9\x7e\xdc\x6d\xee\xae\x9e\x77\xeb\xcd\x28\xc7\x20\x80\x45\x9e\x05\x64\x59\x66\xc5\x06\x8e\x22\xeb\xe7\x17\xa4\x80\x28\x2b\x9c\x02\xf5\xb2\x2c\x2b\x9d\x15\x73\x4c\x2a\xae\xbf\x61\x12\x65\x15\xb7\xaf\x1f\x60\x49\x0f\x1c\x56\xef\x2b\x48\xb9\x30\x3c\x88\xc1\x85\x7e\xec\x87\xf8\xea\x28\x97\x81\xdb\x12\x7b\xf2\x97\xf1\x00\x49\xca\xb5\xd7\xe4\x40\xb4\xe7\x3f\xc2\xeb\x4a\xda\x1e\x9b\x88\x9f\xb3\x5e\x52\xbb\x5e\xdc\x38\xc8\x30\xd0\xa1\x43\x0b\xdf\xdf\xff\xb0\x84\xee\x61\x30\x32\x47\x65\xc8\x85\x4c\x3b\x48\xc0\xf3\x94\x5c\x83\xca\x30\xb5\x7c\x9b\xab\x9f\x57\x43\x9b\x5d\x86\x26\x46\x56\x75\x28\x74\x57\xfe\x48\x65\x14\x49\xaa\x06\x02\x87\x78\x7c\x7e\x32\x22\x11\xa4\x08\xec\x5a\x80\xca\xfa\x87\x8e\x0c\x41\x4c\xff\x72\xbd\x7e\x1a\xfd\x60\x1c\x70\x14\x18\x81\x3c\x3b\xe2\xe7\xdc\x5e\x2f\x97\x5f\x1b\xc1\x32\x8e\x6d\xe5\x15\x38\x8b\x71\x63\x0f\x96\x01\x1a\x46\xc6\xa9\x42\xa4\x8a\xab\x60\x2c\x9b\x6e\x25\xe2\xaa\x76\x27\x04\xa1\xc3\x50\xa7\x8c\x21\x40\x88\xfd\xfd\x7a\xf9\x7d\x75\xbd\x5f\xdc\xdf\xaf\x97\x8b\xdd\xdd\xfa\x71\xff\xf4\xe4\x77\x0c\x99\x04\x09\x86\xbe\x91\xff\xb9\xd0\x03\x18\xaa\x4c\x48\x64\xb9\x07\x1a\x38\xa2\xc5\xdd\x83\x34\x24\x0b\xd2\x48\x74\xb0\x7a\xeb\x77\x39\x22\xc1\xae\x4b\x1c\x7b\x21\xd1\x75\x95\x1d\x5a\xfb\x65\x99\x67\x3d\xc0\x42\x32\xc3\x71\x1f\x3d\x42\x23\xee\x8a\x7f\x12\xc3\xfd\x64\x7a\x71\x22\x89\xa5\x10\xa8\xcb\xfc\x0d\x9c\xb5\x7b\xf5\xf1\xcd\xab\x42\x74\x1c\x96\xfe\x02\x11\x23\x98\x0c\xc1\xbf\x4f\x50\xd5\x83\xa7\xe2\x1a\x88\x15\x35\xe8\x8a\x0e\x6d\xb0\x68\xfd\xd6\xed\xf0\x32\x0d\xa8\x70\x9b\xe3\x1b\xaa\xbc\xcb\xf2\x3c\xc8\x4b\x7d\xf2\x9c\x29\xb1\x4c\xbd\x35\x4c\x03\x84\x52\x70\x1a\x7b\xbc\x52\x7b\x6e\xf6\x06\xb2\x14\x82\x20\xc5\xb5\x5f\x93\xff\xb5\x99\x5e\x2b\x98\x97\x4f\xb8\x6b\xca\xd5\x8c\x58\x3c\x95\x2a\x4e\x90\xce\xe5\xae\xc6\x32\x99\x9b\x0a\xe0\xef\x0b\x7f\x78\xa8\xb9\x4f\xa5\xe2\xc6\xaa\xdf\xb4\x76\x00\x6d\x66\xb2\x07\x6d\x17\x0c\xd1\x67\xf5\xfa\xe1\x0e\xd7\xc1\x7d\xa9\x5e\x27\xa5\x1e\x52\xa5\x14\xc3\xcf\x78\xa3\x27\xa8\xb6\x83\x49\x02\x61\x84\xd8\xbf\xff\xde\xa1\xe6\xdd\xde\x55\x1b\xef\x4f\x83\xcc\x8d\x04\xa5\x01\x3a\x4e\xd6\x4c\xd9\x33\x7e\x6c\x6e\x4a\xd0\x0a\x7a\xb6\xc7\xac\x2c\x86\xd1\x67\x69\x02\xe6\x58\xdd\xfe\x7d\xae\x9b\x99\xba\x45\x69\x8c\xe5\x17\x36\x38\x34\xee\x1b\xdc\x94\x13\x2b\x47\x05\xa1\x8d\x7a\xa8\x41\xa2\x14\xcb\xc2\x7c\x3b\x30\xe1\xf2\x9c\xbd\x0c\xe1\x67\x71\xe7\xd1\x1b\x28\x12\xdb\x68\x85\x67\x20\xd9\x4b\x51\x67\x6a\x6f\xb1\x63\xfe\xfe\x84\x45\x08\x6e\x3d\x76\x44\x29\x37\x65\xe5\x11\x79\x5d\x27\x6d\x22\x35\xb0\x43\xaf\x11\x44\x57\x56\x57\xe3\x99\xa3\x28\x93\x8e\x9d\xa1\xb9\x01\xb8\x3a\x4d\xbe\xaf\x0a\x03\x12\x7b\x04\xee\x1f\xb3\x58\x03\xd7\x31\x4a\xac\x0b\xb8\x3d\x1f\x8f\x1b\xf0\x46\xb4\x8a\x04\x60\x66\xe1\x1d\x43\x1f\x37\x65\xcf\xc3\xe0\x7b\xc4\x21\x43\x37\x1b\xf5\x8e\xec\xb1\x36\xa2\x68\x98\x39\xd3\x54\xac\xac\xe9\xf2\x98\x15\xff\x16\xcb\xb2\x82\xee\x66\x4a\x26\x1e\xa7\x8e\x16\xdb\x40\x40\xd8\xf7\x49\x02\x89\xfe\x54\x33\xa8\x9c\xdc\x95\xa8\xa2\x74\x59\xee\xa4\x92\x94\x48\x37\x40\x3f\x45\xd5\x55\x5b\x4e\x7a\xb1\x80\xc5\x1e\x47\x88\x65\xc6\xad\xcd\x36\x0e\xf7\xcc\x6f\xfd\x8a\x29\x5b\x62\x70\xcc\x8a\xb2\x1a\x0c\x0b\x83\x88\xeb\x51\xea\x18\xea\x5d\xd9\xf1\x5d\x0f\x0c\xe6\xd1\xc8\xf0\xf6\x49\xdc\x0c\xc2\xec\xfb\x37\xe4\x45\xb8\x81\xa6\xc3\x9d\xab\x94\x28\xb4\x4a\x5a\xc3\xaf\x7d\x9f\x9b\xb2\x72\xce\x7e\xd7\x43\xc4\x08\x7c\x71\x50\xdb\xcf\xc4\x20\xa9\x4a\x21\xc5\x18\xd2\x29\x17\x0a\x3c\xf3\x9e\x07\x7b\x28\xc1\x2c\xe1\xd5\xae\x3a\xc3\x0f\x38\x88\xa2\xe7\x05\xa1\x4a\x72\x81\xd5\xfc\x23\x0e\x88\x8b\x4d\x7f\x3c\xcc\x8a\x18\x1c\xac\xd7\xa2\x75\x06\xc6\xf1\x1a\xa5\x74\x80\x96\xaf\x86\xfc\x67\x59\x8d\x6b\x9b\x95\x8e\x63\x4f\x87\x7b\x77\x3c\x09\xd5\xdc\x67\xc5\x2b\x4c\x3b\xb1\x20\xe8\x0a\x06\x2c\xd8\x74\xf5\xeb\x24\x8a\xf6\x48\x1e\xb9\x06\x4a\x33\xc9\x6d\x71\xd0\xb9\xd0\xb8\xd7\x58\x7c\x61\xd7\x0e\x61\xe4\x4e\x87\x87\xac\xc8\x9e\xca\x32\x5f\xb5\x66\x4d\x3c\xfe\x41\x00\xee\x59\xc0\x37\x0e\x87\xf9\x84\x4a\x26\xf3\xe1\x19\x05\x26\x8c\xba\xa4\xe3\x5b\xd6\x3e\xd7\xdd\xc9\xd4\xa3\x8a\xe2\xf1\x07\x32\xa1\xc4\x9d\xb7\x02\x65\xc5\x13\xa7\x1b\xd1\xf8\x07\x0c\x88\xc4\x51\x2c\xb4\x07\xf9\x32\x2f\xeb\x11\xbd\x38\xd5\x41\x00\x68\x62\x0b\x84\x55\xfb\x8d\x7e\xb2\x6d\xe8\x80\xb1\x48\xf4\xf7\xb1\xb4\xf1\xa3\xdb\xa4\x0c\x23\x71\x0b\xad\x31\x36\xb2\x43\x35\xcd\x9b\xaa\x3c\x2e\xaa\x4a\x7c\x5c\xfa\x70\x97\x9e\xa1\x26\x49\x88\x8b\x6e\xdd\xee\xf6\x9d\x65\xa6\x69\x90\x9a\xb8\xa7\x33\xf5\x99\xfb\x89\x4f\x1d\x8f\xdf\x5c\xd3\xd4\x38\xf1\xda\xa6\xd3\x11\xc3\x30\xe4\xdc\x6e\xa7\xa9\xe1\xb2\xb7\xc6\x26\x32\xa4\x4e\x97\x7b\x04\x7c\xd2\x21\x8d\x39\x32\xe5\xef\xd6\x9b\xd5\xf5\xdd\xed\x1f\xdd\xdf\x53\xb4\xeb\x3a\x31\xab\x4b\x74\x8b\x0e\x59\x82\x78\xd8\x53\xeb\xcd\x39\x3e\xd0\xb1\xc0\x1a\xd5\x21\xe7\x98\x59\x6b\x3d\x8c\xbe\x70\x47\x87\xa9\x2d\xf9\x5f\x56\xa0\xcb\x7f\xc4\x3a\x42\x75\xc4\x62\x5f\x3d\x81\xc9\xbb\x6f\x20\xaa\xa6\xbe\xfa\xb8\x16\xa7\xd3\xb4\x98\x5e\x47\xd2\x6a\xa1\xfd\xc8\x9a\x07\x51\x0c\x2d\x61\x1d\x27\x21\x06\x45\x17\xbf\x32\x18\x6c\xd2\x3a\x36\x60\x69\x03\xad\xda\x9a\xcd\xa5\x4d\x76\x54\xcd\xa2\x08\x77\x16\x03\x58\xd1\x8c\x0f\x32\x14\x83\x9a\x3c\x33\x57\xd6\x33\xbc\x29\x2b\x54\x33\xea\xf6\x19\xcd\x21\xc2\x62\xa2\x17\x51\x5f\x01\x14\x1b\x78\x03\x91\x7f\x42\x71\x4c\x75\xca\xc2\xd0\xd7\xc6\x2f\x9e\x77\xeb\xfd\xc3\xe2\xf1\xd9\xdf\x2a\x4d\x3b\x66\x50\xc7\x8a\x95\xc9\x29\xf2\x42\xa7\xd2\x92\x97\x9e\x8b\x93\x38\xd7\xd0\xb3\xfe\xf8\x76\x43\x42\xdd\xd1\x09\xae\x44\x55\x64\xc5\xc1\x52\x36\xd6\x4e\xa2\x77\x7c\x43\xa1\x53\xa4\x05\xc5\x92\xb6\xf6\xcd\x7e\x64\xf0\x3e\x1a\x68\x49\x43\x2b\x46\xbe\x59\x26\x8c\x7d\x06\x51\x9d\x03\x43\x68\x4d\x2d\xcd\xc4\x05\xa8\xc3\xb7\xc7\x34\xed\xb6\xc4\xa1\xce\x2b\x36\x81\x65\xe9\x19\x10\x8e\xb9\x36\x80\xd0\x47\x50\x57\x16\xfa\xe6\xa8\x46\x5c\xbb\xe9\xad\x67\xe4\x7b\xf3\x76\xd2\x6f\xec\x67\x6d\x8c\x15\x84\x44\xcf\x14\xaa\x26\x13\xd5\xc7\x95\xc5\xab\x4c\x86\x0d\x82\xd8\xaa\xb7\x21\x45\xce\x50\x13\x83\x42\x90\x6a\xa4\x8c\x3c\x22\xa2\x72\x7c\x08\x40\x00\x29\x77\x2a\x0b\x53\x1b\x1a\x08\x57\x84\xfa\xe3\x6e\x0b\x79\xbe\xae\xf4\xe7\xdc\xdc\xe3\x67\x07\x1a\x70\xa4\x23\x68\xf0\xa4\x18\xc0\x95\x81\x2a\x81\xb8\x24\xac\x19\xd9\xff\xbc\x7b\xbc\x5e\xff\xdc\x47\xfb\xd5\xe3\xf5\xb0\x1a\x0c\xa8\xe1\xb8\xb1\x61\x64\x64\x6c\xbf\xbb\x1e\x21\x0f\x90\x53\xa5\xa9\x00\x8c\x1f\x6c\x08\x55\x8c\xd9\xda\xa6\x3c\x1c\xf2\x8e\x39\x76\x7b\xae\x4f\x80\x47\xdb\x68\x29\x78\x0f\x09\x42\x63\xa1\x7c\x55\xa6\x5e\xc0\xe5\x41\x3b\x28\x31\x44\x41\x88\xf5\x01\x7b\x6b\x2c\x5f\xcc\xb9\xf1\xab\x47\x69\x62\x42\x2f\x5b\xd7\x8e\xb6\x6a\xb0\x9a\xb2\x19\xc6\x4e\x21\x32\x14\x6d\x51\x51\x14\xa5\x95\x22\x1b\x61\x85\x20\x32\x31\x62\xa5\x96\xae\x66\xcb\x40\xb5\xf7\x3c\xe9\x1e\x70\xdf\xdf\x2d\x26\x3c\x51\x3d\x03\xdc\xae\xfc\x1a\x1b\x00\xb1\xb2\x8c\x52\xfb\xae\x00\xfe\x72\x27\x86\x84\x59\xc1\xdb\x1e\xf0\x3b\x5b\xb8\x01\x89\x50\xc2\x62\x25\x5a\xcb\x06\x77\xe4\xf6\xf4\x1b\x28\x40\x50\x48\x80\x22\x88\xce\x97\xe4\x09\x99\xc3\xc8\xca\x00\x9e\x10\x70\x84\xa1\x6f\xa2\x81\x7d\x3b\x7c\x98\xf4\x59\x3c\xdd\x7d\x87\x71\x15\x08\x70\xa6\x2c\xb8\x3b\x7b\x73\x34\xfb\xf3\xc5\x56\xc0\x21\x41\xff\xc4\xa2\x47\x30\xf4\xf8\xc9\x67\x4b\x89\xc1\xdf\x77\x2e\xd9\x93\xa8\x9a\x02\x2a\x0f\x60\x1c\x44\xfa\x20\xe5\x56\x18\xd7\xbb\x1b\x57\xff\xfd\x6b\x5e\x9f\x8a\x82\x20\x20\x83\x9e\xf7\x07\xa9\x2a\x3e\x07\x8d\x83\xa0\x90\xb8\xec\x47\x56\xbf\x58\xf8\x73\xbe\xb2\x43\x96\x15\x07\x87\xe2\x98\x5c\x13\x49\xdc\x62\xfb\x02\xb5\xdf\xe6\x7c\xda\x6b\xb8\x8b\x08\x3d\x9e\x8f\x3e\x99\xdf\x7d\x0a\x91\x10\xac\x59\xd5\x59\xdd\xec\x35\xbc\x41\xde\x7a\x99\x9f\x3d\x33\xa3\x91\xf5\x42\xac\x80\xc8\xbd\xe8\xf7\x1e\xc1\x25\xba\xe1\x0e\x10\x76\x35\xe3\x20\x0c\x91\x1e\xfe\x2a\x49\x30\x50\xb2\x5c\x3f\x3c\xdd\xdf\x2d\x1e\x97\xdd\xa6\x20\x74\x1a\x11\x4f\x8e\x98\xc3\x61\x58\x59\x3e\xfc\x42\x02\xac\x8e\x26\x86\xdf\xdb\x3d\xd7\xfa\x29\x9f\x07\xde\x41\x02\x15\xa2\x23\x31\xf8\xab\x3c\x57\x13\xae\x14\xd7\x4f\x91\x14\x9f\xcd\xf2\xce\xba\x9a\x9d\x59\xfb\x15\x14\x70\xf4\x6f\x1d\xe5\xdc\x3e\xab\x73\xd1\x17\xf8\xfc\x53\xc0\x86\xbb\x99\xa6\xca\x0b\x93\xfd\xd7\x59\xe4\xc8\x72\xfc\x05\x08\x03\xb4\x08\x62\xd3\x05\xac\x3a\x03\x6a\x57\xe2\x11\x3d\x28\xe7\x05\x48\x2d\x37\x33\xa6\x3a\x0e\xdb\xec\x50\xac\xab\x83\x28\xb2\xbf\xfb\x2c\x14\x80\x0a\x05\x1b\x30\x3f\xb6\xb3\x6c\x8c\x00\x9c\xe5\x9c\xa5\x00\x46\x72\x6f\xf3\x8b\x0a\xf5\x26\x6b\x5c\x2b\x93\x49\x6c\x48\x84\x0e\xf5\xbb\x17\xa6\x1b\x52\xc9\x8e\x4b\xe5\xc0\xc4\x51\xcc\xa7\xc4\xca\xeb\xa7\xad\xd7\xbd\x19\x6f\x2b\x26\x11\x18\xc0\xa8\x0e\xd2\x6e\x48\x93\x1f\x4e\x03\xf0\x65\x69\xd3\x7c\xdd\x4c\xda\xae\x3b\x30\x8c\xb0\xc8\xdf\xed\x4b\xf9\xde\xf3\x01\x53\x13\x44\x34\xf2\x88\xe0\x2a\x53\x30\x34\x5d\x0c\xa1\x9c\x38\x22\xbb\xe6\xee\xfa\x7e\x92\x49\x35\x24\x0c\x88\xd5\xa2\x5e\x2e\xc7\xd7\xc5\x29\x2a\x03\x5a\x05\x0f\xb0\x69\xdf\xd6\x7d\xa7\x9f\x6d\xf3\x5f\xcf\x26\x13\xca\x10\x29\x68\x51\x5d\x7f\x21\xdb\x6d\xb6\x58\xbf\x41\x55\x65\x53\x04\x8d\x89\x88\xb1\x1c\x77\x2e\x9f\xba\x41\x99\x81\x49\x9f\xc8\xe6\x01\x2d\xde\xda\xb3\xeb\x5c\xce\x4a\x13\x81\x42\x4a\x96\x4e\x69\xdd\xff\xdd\xc4\x68\xf5\x59\xad\xdd\xcd\xea\x66\xb5\xd9\x2c\x3c\xd0\xdf\xc4\x54\xf8\x8c\xf7\xa2\x69\x5c\x44\xdf\x46\x3c\x9e\xa0\xfa\x09\xd9\xdd\xf0\x5c\xec\x1f\x2b\x66\x86\x98\x81\xb7\xf1\x5c\xd4\x65\x3e\x8b\xf1\x36\xb1\x00\x5f\x5c\xbc\xec\x78\x9a\xb3\xb2\xf0\x07\x9e\xef\x26\x25\xe6\xba\x9f\xbf\x8f\xbe\x4f\x6c\x94\xd2\x7d\x8a\x74\x57\x3e\x1c\x8e\xcd\x0e\xc4\x27\xdb\xbc\x49\x62\x8d\x9e\xf0\x55\xd6\x60\xed\x40\xf6\x3b\x49\x45\x6a\x92\x54\x30\x87\x95\xbb\x3a\x57\x9e\x7a\xbc\x1e\xd9\x0c\x26\x51\x21\x56\x79\xb4\x13\xf2\xa2\xd0\xd0\xb0\x80\x5a\xbb\xa4\x11\xaf\x5e\x7a\xad\x6b\x23\xdc\x61\x8b\xd4\xeb\x6e\xb7\xb4\x4b\xd4\xb7\x45\xc2\x70\xcf\x54\xd1\xae\xff\x71\x28\xc2\x30\x07\x56\x91\x8d\x5a\x35\x2f\x9b\x3e\x0a\x69\x78\x68\x55\x27\x4f\x65\x99\x6f\xcf\x72\xf2\x79\x04\x48\xed\x04\x77\xbc\xb2\x00\xba\xc4\x7d\x02\xc1\x77\x34\xbc\x0f\xbe\x6f\x77\xcb\xeb\x8d\x29\xab\x2b\x84\x00\x38\x49\x73\x1b\x7c\xf2\xc6\x86\x91\x71\x64\xcb\xb6\xbf\x2d\xb6\xab\x3d\xdd\x3f\x6d\xee\xba\x33\xc4\x48\xc7\xe4\xf7\x70\xf7\xb8\xbf\x7b\xfc\xb1\xda\xee\xf6\xdb\xe7\xa7\xa7\xf5\x66\xd7\xf5\x48\x59\xe0\x4a\x17\x1d\x0b\xdf\xf8\x79\x54\x94\xe2\x89\xab\x41\x21\x8c\xd0\x52\xb9\x8c\x5f\x4e\xb1\x58\x5b\x31\x4f\x5b\x70\x5d\x89\x42\xbd\xc0\x9d\x79\x04\xe8\xc9\x41\x8c\x26\x82\xa9\xce\x39\xdc\x4c\x80\x07\xbe\x13\xb7\xea\x3a\x4d\x09\x2e\xfe\x89\x64\xbd\xdd\xf8\x6b\x69\x9c\x8a\x8e\xcd\x29\x78\xd4\x99\xd7\xae\xfc\x64\x12\x82\x32\x3c\xea\xb5\xd1\x9e\x8b\xac\x99\xfa\xbb\xc6\x10\xcb\x4a\x88\x89\x83\xfd\xe9\x62\x4a\x19\xca\x31\xdd\xb6\xef\xf0\x5c\x1e\xbf\x39\x17\x9f\x31\x26\xd4\x16\xf0\x9b\x1d\x0a\xd0\x57\x1f\xdb\x8f\xba\x81\xe3\x98\x1e\x0e\xbb\x86\x41\x48\x23\x5b\xf8\x0a\x45\x5d\x56\x8b\x42\x2f\xcb\xdf\x94\x89\x87\x41\xd8\x2e\x92\xee\xcc\x73\x47\xbe\x6f\x13\xb1\x27\x7c\x42\x8b\xba\xac\x3c\x80\xef\x8f\xf1\x3d\x40\x13\x7b\xb8\x9c\xeb\x06\xf4\x73\x91\x21\x06\xf6\xea\x3c\x4f\x8a\x1c\x06\x11\x03\x34\x08\x10\x06\x90\x9f\xd5\x6b\xf7\x93\x71\x18\x21\xa4\xb4\x80\xf7\x1f\x03\x86\x42\x92\xfc\x2b\xfc\x9f\xb1\x48\x45\x77\x81\x61\x81\x7f\xfe\x09\x43\x90\xef\xa2\x12\xe4\x48\xdf\x63\x79\xe0\x7c\x6e\x73\x36\xda\x15\x06\xb1\xb6\xec\xcb\xd6\x1a\x79\xaa\xca\x63\x39\xf0\xeb\xd1\x74\x7f\xc8\x0a\x0f\x94\xb0\x41\xa8\x19\x7b\xe9\xeb\xff\xe7\x7e\x2b\x49\x0d\x6e\x27\x7b\xac\x5b\x9e\xd9\x71\xc3\x80\xd1\xc0\xd6\x42\x60\x04\x03\x57\x71\x0e\x15\x46\xa3\xbc\x7f\x55\xfb\x91\x64\x61\x82\xb8\x87\x6b\xc8\xb7\xa5\xca\x44\xee\xad\xf2\x29\xb1\xe0\x30\xe7\x1f\x06\x2c\x0a\x70\xe3\xda\x57\x50\x9f\x8f\x80\x05\x06\xe3\x8f\xc7\x24\x47\x52\x43\x9d\xd5\xc7\xac\xb6\xdc\xf6\xeb\x93\x2d\x57\x9d\x3c\x2f\x4f\x00\xad\x8e\xac\xb6\xce\xa8\xa3\xa7\xf7\x8f\x28\x1c\x68\x6b\x51\x15\x65\xae\xfb\x90\x4c\xdb\xa2\x11\x8b\x62\xe9\x52\x26\x77\x15\x44\x20\x7a\x7a\x7f\x04\x2d\xf2\xe7\xc2\x39\xba\xe3\xa7\x14\x21\xc1\x38\xc0\x66\xb5\x5c\x6f\xae\xe7\x04\x98\xff\xc9\xa9\x1f\x06\x22\x35\x68\x90\x3e\x17\x2a\x1f\x1a\x26\x61\x20\x74\x84\xc9\xf9\xb7\xb2\x81\x0b\x03\xb5\x3b\xbf\xc3\x40\x92\x14\x59\x99\x91\x66\x20\x2b\x6a\xa8\x9a\xbd\xe3\x79\x04\xa1\xfd\xdd\xa4\x56\xa9\x0b\x3f\x7f\x83\xaa\xb4\x8a\x82\xf5\xe4\xa5\x94\xab\x58\xbc\x2f\x0f\xcf\x36\x78\xe4\x2f\x57\x49\x88\x71\xef\x3d\xba\xfe\xbb\x32\xcb\xa1\xb9\xc9\xcf\xf5\xcb\x1f\x17\xbe\x42\x18\x68\x4a\x31\xbc\xb6\xfc\xb9\xfd\xe2\xfc\x0c\x03\x2d\x89\xe1\x9d\x94\x65\xd7\x75\x74\x2f\x48\x03\xe9\x34\x03\x76\xd9\xe9\x9f\x80\xec\xc3\x00\x0c\xf5\x64\x6c\x5e\x22\x13\x8d\x5c\xff\x32\x86\x0a\x1c\x8b\xfd\x67\x18\x29\xdb\x8f\x04\x4c\x21\x01\xd7\xdd\xf2\xba\x17\x70\xf1\x6d\x8a\x62\x74\xf0\x5a\x64\x35\x74\x7f\xa5\x91\x02\x3d\x30\x83\xef\xbb\xea\xc3\xb6\x0d\x20\xf5\x02\x83\x42\x35\xd7\xd0\x60\x42\xac\x6b\x17\x02\x51\x70\x75\x56\x1c\xf2\x8e\xcf\xa9\x23\x64\x0d\x09\x55\x01\x72\x5f\x74\x3a\xc0\xee\xef\x21\x93\x48\x22\x20\xcf\x59\xae\xbd\xd9\xb5\x15\xb9\x3d\xfe\x86\x85\xb0\x73\x53\xd3\xc5\x87\x43\x12\x72\x40\x2b\xd9\x49\xbb\xe2\x01\x7c\xff\x57\xf7\x23\xa9\x0a\xf4\x80\x9c\xaf\x3d\xf2\x2c\x1b\xd5\xec\xbc\x26\xa1\x0c\xb1\x42\xe2\xba\x12\xef\x5d\x34\x2f\x24\x21\x40\x6c\x5d\xba\xba\xe9\x9d\x67\xd7\x18\x51\x4a\xa0\x77\xce\xae\x3b\x27\xf7\x0b\xbd\xab\x90\xc4\xc2\x6a\xe8\x1c\xb0\x4a\x7e\xfb\x22\x2a\xb0\xf5\xf8\xf5\xda\x2c\xaa\xe6\xfd\x62\x87\x21\xb1\x30\x18\x20\x6d\xbd\xe2\xa3\xa8\x5e\x07\x3b\x03\x89\x8d\x3d\xe3\xda\x55\xa7\xbf\x67\xea\xb5\x34\xc6\xb7\x25\x51\x1c\x82\x27\x96\xca\x14\x90\xc9\x7d\x99\xe0\x7c\xf8\xf5\xb7\xf8\x25\xbf\x4c\xbf\x85\x84\xa9\x08\x2d\xc0\x0a\x30\xa6\xb7\x28\xb2\x63\x17\x4c\xf2\xf8\x8a\x6e\xb1\x13\x1e\xa7\x88\xd5\x97\xa2\x51\x2f\xed\xec\xb2\xc9\x8a\xcf\x7c\xe8\x90\x70\x19\xc5\x2e\xf0\xf5\xa3\x6c\xa0\x79\x2e\x1a\xa7\x24\xca\x5d\x8f\x54\x46\x9d\xe8\x2c\x54\x35\x16\x67\x8d\x1f\x31\x85\x18\xb7\x85\xce\xa0\xb0\x81\xa9\xf1\x62\x11\x41\x60\x63\x83\xbe\xd3\x0f\xa8\x9b\xae\x7a\x73\x7c\x43\x11\xca\xc0\xb2\x55\xb5\x76\x2f\x7c\x1a\x7c\x09\x89\x50\x0c\x17\x94\x7a\x29\xcb\x1a\x9e\xc0\x7d\x4b\xff\xec\x92\x58\x5b\xe7\xbe\x3c\x6c\x91\xed\x6b\xb8\x11\x0f\xf7\x1a\x22\x43\x8a\x96\x55\x3b\x66\x3d\xfd\x51\x48\x24\x68\x54\xbd\xec\x39\xe0\x3d\xef\xd6\xfc\x03\x29\x6a\x10\x2a\x6c\x00\x36\x20\x3b\xbb\x3a\x24\x8a\x29\x9f\xc7\x76\x55\x94\xce\x5d\xfe\x40\x48\xf9\x2c\x48\x3e\x24\x40\x54\x1a\xf5\xb5\x1e\x23\x50\xc0\xe4\x97\x81\x80\x72\x6a\xdb\x0f\x5e\xaa\x19\x67\x7b\xdd\x97\x46\x74\x4b\xc9\x04\xa1\x51\x7d\xfa\xef\x78\x3e\xb6\xd6\xd2\xf8\x86\x26\xb2\x1e\x6c\x2e\xea\xe6\x4e\xf7\xbc\x65\x21\x31\x69\x88\xb4\xe0\xf6\x18\x19\x39\x5f\x5f\x17\xa8\x9f\x7b\x16\xdf\x90\x18\x19\x22\x68\xe4\x69\xb3\xda\xe3\x8e\x72\xfb\xb0\xd9\x5b\x6f\x72\xb9\x78\x72\xbf\x45\x03\x92\x24\x9d\x81\xf8\x8c\x50\xd9\xcf\x72\xb0\xe3\x01\xa1\x41\x12\x62\x10\xbd\x6a\xb7\xe0\xeb\x32\xcf\x45\xf5\xff\xe3\xec\xcb\xba\x1b\xc5\xb5\xfd\xbf\x4e\x3f\xf4\x03\x68\x00\xf1\x68\x3b\xce\x70\x2b\xd3\xb1\x9d\xaa\xea\xff\x59\xbd\xbc\x84\xb4\x95\x70\x0a\x83\x1b\x70\xaa\x7c\x3e\xfd\x7f\xb1\x25\x31\x99\xa4\xfb\xde\x97\xae\x5e\x41\xc6\x18\x84\xb4\x87\xdf\x50\xdb\xc7\x08\x3f\x27\xf4\xa3\xe0\x77\xfb\x8f\xff\x64\xcc\x51\x29\xc9\xe5\xcf\x2b\xab\xf2\xff\x77\x86\xaf\x94\x84\xb2\x53\x04\xc5\x76\x90\x6b\x1c\x62\x64\x3b\xcb\x3e\xa2\x24\x34\x06\x81\xe7\xbd\xeb\xbb\x05\x53\x7e\xf4\x13\x67\x77\x22\x42\x42\x89\xf4\x9d\x53\x91\x8e\x6e\xd0\x28\xb6\x22\x24\x62\xa9\x57\xd7\x2e\x0f\x87\x0c\x49\x94\x53\xdb\x05\x4a\x88\x88\xc5\x90\x46\x7b\xe1\x53\xf3\xef\xe8\x4f\x3f\x54\xdb\x24\xba\x9d\x22\xd8\xcc\xdf\xcb\x30\xf2\x4f\x8e\x1a\xc0\x0a\x83\x94\xe3\x89\x45\x78\x18\x21\xa1\x44\x97\x8b\x31\x1c\xbf\x3b\x9e\x68\xd7\xc5\xda\x42\x9e\x4b\xdf\xc2\xea\x7e\x08\x27\x14\xf9\x82\xb6\xd6\x8c\x10\x52\xeb\x68\xfe\x11\x8a\xc5\x7f\x2e\x92\xb8\x00\xdb\xd7\x02\x01\x98\x56\x34\xd9\xd7\xd7\x86\x64\xe1\xff\xdd\x13\xe0\x69\x80\xeb\xc7\x8d\x3e\x56\xab\x8e\xa7\x48\x49\x14\x44\x46\xf9\x7b\x5e\xe6\xba\xfc\x69\xf9\xbc\x03\xf4\x3f\x25\x51\x18\xa3\x2c\x55\xfd\x33\x6b\xd4\x9b\xd5\xbd\x1b\x9f\x3e\x72\xca\x24\x96\x76\x77\x84\xaa\x39\x8f\xcf\xe0\x1a\x34\xd0\xbc\xdd\x15\x7b\xff\xd7\x98\x44\x48\x98\xf7\x59\xa6\x55\x77\x98\x48\x5e\x8d\x6f\x51\x2c\xa8\x54\xc3\x7c\xec\xf5\xad\xfb\x12\xa1\x22\x6b\x5e\x84\xdc\xdf\x47\xf8\xd9\x35\xd5\xc6\xf5\xc4\x0e\xf2\x31\x99\x7f\xc2\x58\x45\x1c\x78\x97\xf9\xa9\xcd\x9b\x7f\x64\x53\x13\xcf\xcf\xa3\x61\xe2\x35\xe7\x3b\xa1\xa4\x7b\x30\xcd\x5d\xe1\x18\xbd\xed\x76\xec\xaf\x55\xd2\x18\xd3\x8f\x6d\x51\xfe\xd4\x50\x2c\x8c\xe9\x9a\x7f\x94\xa4\x51\x82\x20\x1c\x38\x64\xcd\xda\x57\x55\x29\x49\x75\x6a\x79\xfd\x39\xc8\xca\xa3\xfc\x16\x85\x9e\xf6\x8e\xfe\x1d\x46\x7f\x7e\x2a\x60\x42\x89\x22\xc4\xd2\x6d\x06\x6e\xd1\x2b\x39\x01\x2f\x51\xa2\x89\xc6\x4e\x47\x1b\x9b\xdf\xca\x7a\x95\x15\x7a\xe4\x99\x46\x89\xe6\x11\x82\xda\x9f\x1e\xd7\xfb\x3f\xd6\x8b\xcd\xfe\xcb\x7a\xfd\x7c\xf7\x78\xe3\x8f\x43\x64\x17\x51\x59\xd7\x70\x48\xf3\xf3\x0e\xea\xee\x67\x42\x1c\x63\xe0\xb7\xbe\xb9\xd9\xee\x77\x4f\xfb\xdb\xc5\x6e\x75\xbb\x0f\xb7\xb7\x9b\xbb\x87\x6e\x7d\x05\x13\x22\xd0\xd4\x00\xec\xab\xa1\x17\x98\x3b\x6e\xb8\x46\xb8\xed\x42\xbf\xa3\x3f\xb2\x3c\x1f\x3b\x4d\x66\x4a\x0c\x10\x63\x2c\x6f\x10\x95\x52\xef\xcb\x9f\x03\x4c\x3e\xa5\x01\x37\x58\x3d\xfd\xd7\x09\x01\xdc\x6f\xdd\xdf\x65\x2a\xc9\x50\xa1\xbb\x5f\x64\xba\x11\x0a\x6f\xcd\x3e\xeb\x74\x09\xbd\x1b\xe6\xec\x1b\x48\x03\x2d\xa5\x25\xc8\x3e\x15\x17\x0c\x72\x4a\xc3\x30\xa2\x8e\x38\xb4\xac\xe4\xa0\x01\x30\x0c\x03\x68\x48\x6c\x4b\xc1\x54\xe5\xe1\x01\x0e\xa5\xdb\x98\x85\x8f\x97\xda\x05\x1b\xeb\x4c\x37\x5e\x5b\xdb\x5f\x2f\x89\xc2\xd4\xe2\x35\x4f\x45\x73\x5e\x0c\xaa\x6d\x94\x92\x94\x93\xc0\xa3\x62\xd0\x9d\x63\xd5\x35\xa8\xba\xc9\x40\xdb\x6f\x6f\xdf\xe1\xf2\xd4\xd0\xab\xb2\xf0\x91\x03\xa5\x3c\xc5\x90\xf3\x26\x2f\x53\x53\x16\xe3\xaf\xa5\x89\xf4\x7a\xad\x8f\x80\xc1\xac\xed\x5a\x4e\x4e\x6d\x34\xaa\x6e\xb5\xef\x0c\xf3\xb5\xa6\xc9\x18\x46\x42\xc4\x79\x2c\xaf\x3f\x72\x27\x14\xbf\x4f\x3e\xc1\x09\x06\x9b\x57\x8e\x46\xec\xaf\x89\x09\x9b\x93\xf5\xc5\xfe\xbb\x76\x43\x9f\xab\x2f\x51\xca\x64\x84\x1c\x9e\x9f\x6f\xb2\xf9\x56\x9e\x72\xed\xf9\x5c\x57\x17\x78\x7c\xff\x89\x94\x68\x4b\x8f\x58\x9e\xaa\x62\x86\xb2\x48\x29\xd3\x1c\x50\x34\x45\x67\x56\x96\x73\xc6\xb7\x72\x18\x8b\x50\x1e\x07\x58\x42\xda\x2c\x76\x6b\xe2\x7f\x47\x4c\x05\xf6\x0c\x37\xa0\xca\x77\xa8\xce\xff\x3a\x95\xd5\xe9\x70\x89\x48\xf5\xc3\x59\x84\xfc\x91\x6d\xd1\xce\xf5\xae\x12\x42\xe3\x44\x61\xa2\xbe\x05\x55\x41\xf3\x58\x36\xe0\x89\x8a\x93\x6d\x7a\x10\xc8\xb7\xab\x17\x96\xa8\xb2\xa9\x3e\xbf\x05\x53\x07\x17\xeb\xcf\x65\x9e\x4d\x05\x15\xc8\xd2\x48\x65\x55\x65\x50\x0d\x94\x46\x28\x15\xcc\x68\xfe\xa1\xd1\xcd\x4b\xa1\xe4\xf1\x08\xfa\x72\xeb\xf7\x3f\x56\x28\x82\xb0\xcb\x37\x59\x2f\x1a\x17\xb9\xcc\x87\x1d\x54\x68\x8d\x5d\x71\xa9\x0e\xdd\xb7\x1b\x99\x76\x82\x09\x03\x26\xcf\xf8\xfa\x93\xc8\x18\xe6\x45\x52\x65\xb1\x2b\x5d\x7d\x6d\xd3\xbb\x26\xb7\xf3\xdf\x9a\x39\xbe\xa4\xd9\x5f\x3b\x99\xfb\x0d\x80\x4a\x1d\x21\xf8\x63\x79\xfb\xb0\xbc\x7f\xf1\x7f\x4d\x23\x8b\xb1\xf5\x49\xec\xfd\xfa\xeb\xfa\x7e\xdf\x3d\xf1\x54\x83\x71\x2f\xaa\x55\xa0\xb9\x10\x66\xa5\x34\x35\xc4\xeb\x53\xf7\xf5\xfa\xa9\x16\x02\xa5\x4a\x75\x3f\x71\x63\x31\xdf\xd5\x1c\x19\x9f\x52\x2d\x02\xee\xbc\xa4\x1a\x99\x15\xf5\xa5\x36\x03\xa5\x5a\xc9\x98\x0f\x7c\x92\x30\x23\xc5\xbb\xcc\x7e\xff\x98\xf5\x49\x29\x84\x16\xfb\x64\x29\x53\xf5\xba\x17\xb9\xa6\x14\x4c\x82\x4a\x79\xba\x92\x59\x31\x60\xf0\xb4\x47\x20\x74\x36\xf7\xdb\x1f\x59\xf1\x64\x5c\xe9\x6e\x12\xbb\x32\x12\x30\x6c\x14\x36\x53\x99\xee\x27\x33\xf5\xea\xf2\x9f\x50\x0c\xa3\x24\x47\xc3\x1c\x24\x26\xc3\x06\x91\xbb\x0e\xc6\x82\x18\x89\x0a\x79\x56\x37\x43\x1d\xe7\x8b\x90\x6c\x4e\x1b\x85\x32\xce\x8c\x6d\x13\x36\x27\xf5\xe3\xa9\xd8\x36\xa7\x63\xa6\x87\x8b\x27\xe3\x92\x4a\xa7\x12\xb0\xfe\xa5\xfa\x05\x9b\x71\x2d\xa9\xb5\x99\x7c\x7d\x6e\xb3\x5e\x5c\x53\x51\x72\x64\xb8\x5b\xb0\x88\x5a\xb5\xd1\xa2\x6c\x32\x73\x7e\xfe\x14\x73\xd3\x7d\x44\x21\x89\xcd\x0b\x31\xad\x77\xb7\xf3\x11\x90\x1f\x0f\xd6\xfe\xa7\x71\xba\xdd\xdf\x26\xd2\xb9\x94\xc5\x9c\xc6\x16\x52\x73\x1e\x92\xb2\x27\xe7\x89\x13\x2b\x21\x6d\xdd\x2e\xc4\xfa\xfb\xb6\xcc\xf5\x7e\xe0\x1b\xe4\x7f\x7a\x2c\x09\xd7\xbd\x1c\xf4\xae\xe7\xfe\x52\x26\xa4\xc2\xe6\x1c\xa8\xd2\x82\x4f\x47\x5d\x25\xca\x12\x6a\x82\xa1\x43\x43\x3d\xc4\xc3\xb9\x31\x92\x28\xec\x8c\x38\x6e\xf4\x44\xa2\x97\x32\xc9\x23\x2b\x43\x62\x01\xbf\xb8\x2e\x3c\x4b\xcf\x9a\xa4\x2c\x65\x22\x72\xfb\xf8\xd3\x11\x0a\x2b\xf6\x3d\x79\xb3\x46\x7b\x3a\x4b\x13\x89\x1d\x8c\x43\xe9\xd1\xbf\xa3\xc2\x16\x4b\x53\xeb\x04\x85\xa5\x4b\x85\x72\xfc\x75\x73\xd2\x50\x4c\x67\xaf\x82\xc8\x3e\x6e\x74\xe7\x3a\x96\xf5\x47\x1c\x90\x69\x55\x9b\x69\x61\xc5\x9c\x4f\x85\xb2\xc4\xe0\x6b\xe8\x22\x1d\x06\x34\x08\xdd\x69\x1f\xe0\x55\xa6\xe5\xaf\x8f\xba\x03\xee\x03\x86\x08\x6a\x55\xa2\x8a\xac\x7e\x1b\x58\x6b\x8e\xb2\x24\x66\x84\x44\xea\xed\x8f\xb3\xc2\x12\xbd\xfb\x3e\x1e\xf0\x08\xa1\x3f\xdb\x63\x59\xe6\xa3\x37\x8e\x93\x40\x92\x0e\xbe\x3b\x90\xd7\xba\xc2\x72\x9c\x45\x3c\x65\x75\x3f\x1c\x58\xea\x0a\xb4\x0b\x63\xb2\x3c\xfb\xc8\x78\x9d\x72\x1a\xc4\x26\xed\x3a\x19\x08\x35\xba\xa0\x61\x50\x4e\xb9\xc4\x6e\xd0\x73\xf6\x0b\x72\x27\x3c\x72\xea\xc9\x31\xc2\x0f\x93\x56\x69\xe0\xaf\x13\x9c\xba\x7c\xc6\x1f\x33\x11\xfe\x84\x36\xa4\xbe\x81\xc6\x87\xf1\x57\xa9\x1f\xc0\xb8\x46\x79\x89\xdc\x55\xf7\xba\x55\xeb\x52\x8c\x9e\x72\x96\x58\x86\xe5\x2b\x34\xe8\x56\x8b\x25\xde\xd1\xb3\xe5\x0c\x52\x1c\x52\x95\x6a\x55\x56\x30\x7e\x25\x38\xa7\x01\x56\xcf\x2c\x5b\xe4\xc9\xcc\xbf\x9e\x3c\xa2\xa1\xd4\xbd\x45\x4a\xef\xb9\xf5\xdb\x64\x9c\x14\xd2\xbf\x61\xd9\xc8\x6a\x86\x72\x11\x58\xb4\x71\xe7\x14\xf6\x11\xb8\x68\xf8\x76\x70\x41\x84\x60\x7d\x1f\xdc\x3a\xe3\xce\x05\x17\x6e\x7c\xc2\x05\x6e\x7f\xdf\x9f\x17\xc8\x48\xf8\xc4\xca\xda\x7f\x22\x52\xb8\x43\xbb\x15\x45\x59\xcb\x18\x7f\x30\xb1\x16\x55\xcf\x55\xa9\xaf\x86\x0b\x01\x4f\x8c\x25\x40\x5d\x4f\xbb\xd7\x94\xcb\x36\xdc\x76\x81\x01\x98\xc6\x93\x43\xfd\x51\x11\x60\x69\x19\x1b\x1e\xef\x65\x03\xdb\xa3\x3c\x1c\xb2\xe2\x75\xf1\xda\xee\xaf\xdd\x57\x4b\x43\x10\xee\xb8\x91\x0d\x84\xbe\xb6\xc5\x53\x42\x89\x33\xfc\xe8\xb8\x0c\x70\x91\x02\x76\x83\x23\xc4\x7e\x65\xaa\xc4\x62\x77\x78\x05\x52\xe7\x59\x17\xbb\xf3\x94\x0a\x2f\x16\xb9\xc2\x40\xa7\x70\x0c\xb4\x61\xf6\xce\x53\x11\x22\xc4\x42\x65\x15\xd6\x46\xb3\xb2\x58\x4c\xd6\x4d\x9e\x4a\x10\xac\xc7\x93\x20\xda\x11\xd9\x20\xd3\x4d\x71\x4e\x86\xe7\x7f\xfb\xaf\xff\xce\x34\x46\x64\x72\xfd\x26\x09\x8f\xae\x4a\x55\x4f\xe6\xbe\x32\x96\x5c\xd5\x26\xf4\xb0\xeb\x49\x09\xfe\x87\x69\x0a\x58\x0d\xb5\x85\x42\x3d\x07\xcf\xa2\x5c\x33\x8e\x4d\xce\xcd\xe2\xea\xee\xe5\xa1\xfb\xa8\x10\x9e\x0f\xe1\x05\xbb\x7e\x1d\x33\x9b\x9b\x0e\x1a\x2d\x5c\x2b\x85\x05\x5a\x0d\xef\x06\xa0\x29\x35\xbc\xfb\x43\x90\x28\x2c\xab\xe8\x0c\xa5\xbe\xad\xdd\xda\x6f\x83\xb9\x6c\xc2\x30\xed\x6d\xcf\x16\x85\xee\x58\x1e\xe3\x5e\xd3\xbf\x49\x5f\x38\x27\x7f\xfe\x3e\x59\xea\xff\xa6\xa1\xf7\x6f\xfa\xa7\xff\xba\x54\x58\xc4\xf8\xa9\xd0\x03\xb4\x06\x8d\x02\x99\xa2\x0c\xc2\x9c\xf4\xfd\xff\xd1\x75\xc5\x9d\x39\x0c\x15\x13\x8e\x5b\x4b\x1f\xb2\xfc\x1b\x64\xbb\xf2\xb9\xec\x1a\x2e\x51\x28\x68\xdc\xde\xfc\x87\x32\x07\x75\xca\x3f\x63\xea\xd2\x88\xd0\x18\xeb\x9b\x1e\x9c\x33\x4c\xf5\x23\x12\x0b\xff\x52\x5e\x90\xfb\x68\x44\x74\xa2\xc4\xe4\xb5\x9a\x29\x74\x45\x54\x0b\xac\x77\xec\x1e\xd6\xdf\xc7\x6f\x7d\xc4\x22\x95\xf4\x93\xe9\x21\xab\xaa\x32\xfb\xa0\x35\x17\x71\x96\xe2\x8b\x79\xaa\xa1\x53\x44\x1e\xb5\x11\x66\xcb\x36\x11\x17\x31\xf2\x6b\x52\x98\xbc\x7e\x11\x4f\x25\x16\x33\x1f\xee\x1e\x5d\x8d\xda\xe2\x50\xfc\xc5\x71\x08\x8d\x1e\xf4\x7e\x56\xa7\xa6\x34\x66\x7a\x12\xb0\x99\x2b\x06\x61\x6e\x21\xb0\x81\x52\x1b\x8d\xf9\x53\x45\x51\x20\x2d\x2e\xb8\x81\xea\x80\xed\x7d\x0b\x20\xef\x06\xc4\x09\x83\x51\xcd\x78\xae\x8b\x12\x45\xc2\x76\x51\xbe\xaf\x56\x3d\xc6\x7f\x7c\x9b\x22\x15\x09\x3d\x56\x6c\xf4\x9a\x30\xa3\x58\x22\x8a\x80\x62\x9d\xa7\x72\x12\x87\x23\x1e\x2d\x8d\xe2\x90\x60\xed\xe0\x1d\xb7\x9c\x49\xa5\xfb\xf7\xd3\x40\x73\x96\x46\x31\x03\x9b\x0e\xb6\x4f\x7f\xaf\x67\x90\x38\x34\x8a\xb5\x41\x1a\xd1\xf6\x5c\x68\x74\xdf\x9f\x1e\x07\x1a\x90\x41\xaf\xd4\xbb\x02\x0c\x37\xce\x59\x36\xee\xec\xcb\x7a\x51\x75\xf4\xdf\x62\x42\xab\xe8\x23\x0f\xb0\x85\xa6\xc9\x8a\xd7\x79\xe6\x3b\x8d\x44\x28\xb0\x7e\xb0\xee\x1c\xe7\x69\x24\x44\x12\x76\x80\xbd\xb0\xfb\xab\x14\x48\x39\x73\x1e\x4b\xa3\xf5\x34\x12\x29\x45\xcd\xc6\xab\x76\x9f\x82\xcc\xd2\xd1\x3e\x7a\xd3\xe7\xde\x50\x19\x84\x78\x63\x10\xfc\xd3\xe6\x16\xfe\xef\x61\xea\xd8\x4c\xff\x39\xd5\x8d\xe5\x38\xbb\xac\xce\x2f\xca\x1f\xe0\x32\xa6\xeb\xcf\xdc\x16\x1f\xa5\x21\x95\xe0\x93\x5d\x93\xe5\xf9\x75\xf9\x79\x57\x36\x52\x84\xa5\xd6\xa8\xa1\xc6\x62\xfc\x58\x72\xf8\xf3\xb7\x54\x51\x40\x3e\x78\x59\x38\xb8\xd4\x27\x6a\x9a\x34\x52\x89\xa0\xd2\x2b\x16\xe2\x46\xe2\x99\x69\x93\x97\x41\x53\xe2\x07\x3e\xcb\x13\x6e\x19\x83\xcd\x22\xd2\xb1\xe2\x96\x48\xbc\xb0\xda\xf6\x1d\x9a\xb9\x1b\x60\x1b\xf8\x36\x86\x5b\x28\x35\x7c\x07\xe6\xba\x7b\x11\x48\xab\x92\x52\xa2\x04\x5f\xbd\x72\x6f\x61\xd7\xf3\x8f\x40\x05\xbc\x6b\xd3\xe1\xbe\x3f\x51\x3b\xa0\x11\x80\xc2\xa8\xaf\x2b\x92\x62\x83\x78\x57\x2e\x8a\xb2\x5d\x9d\x51\x88\x60\xb6\xb7\x18\x19\x69\x74\x67\xf5\x84\xfa\x17\xfe\x00\x70\xcc\x73\xfc\x32\xff\x59\xc3\x20\x0e\x78\x90\x20\x00\x0a\xe4\xe1\xa9\x80\xe7\x0a\x4c\xe6\x21\x09\x71\x20\xa9\xd0\x1d\xd2\xe2\x59\xaa\x1f\xf2\xb5\x4b\x7c\x62\x12\x84\xcc\x6e\x7b\x1a\xe9\x92\xfd\xdf\xb5\xbb\x91\x98\x23\x3f\x94\x45\xf3\x96\x9f\x1f\x3d\xd8\x8f\xc6\x24\x4c\x90\x39\x61\xb1\x82\x6c\x88\x15\xa4\x31\x51\x04\x67\xd6\xf1\x34\x68\x2e\xcc\x5f\x3b\x75\x3e\x23\x59\xed\x2a\x4b\x30\xc1\xfa\xc4\x34\x8e\x0d\x0c\x32\xda\xaf\x96\x49\x2f\x6b\xb0\xac\xc0\x36\x76\xbc\x2e\xab\xe7\x37\x59\xc3\x58\xc1\x9f\xc6\x54\x5a\xb0\x9e\x17\x16\x7c\x94\x95\x2a\xeb\xe5\xd9\x56\x3d\xd4\x90\x9f\x40\x63\x6a\x58\xe8\xee\x14\xee\xaa\x70\x3a\x8c\x8c\x80\x69\xcc\xc2\x30\xee\xb1\x60\x5f\x57\xdf\xbf\xca\x53\x7e\xa1\xaf\xee\x07\x53\x93\x5a\x62\x46\x59\x1f\x11\x46\x52\xef\xdb\x27\xd4\x9d\x2c\x0d\xb0\x6c\x9c\x9e\xce\xbb\xab\xb5\x93\x95\xce\x9a\xb7\xf2\xd4\x4c\x2b\x12\x17\xef\x6e\xcc\xc3\xd8\xf2\x17\xcb\x9f\x50\xbd\xcc\x2b\x70\xd3\x98\x13\xed\xbb\x8d\x5f\xfe\x58\x3d\xcb\x73\x5e\x4a\x3d\x4c\x58\x62\xae\xac\xb2\xd9\x73\x59\x68\xa8\x6e\x3c\xce\xd7\x5f\x23\x87\x00\xef\x7d\x1b\xc7\x5b\x09\xe1\xa7\x14\xe5\xd4\xba\xe3\x1a\x97\x81\xfb\xf2\xf5\xbe\xbc\xb4\xda\x99\x5c\x4e\x14\xc5\x18\x27\x7a\x91\xaa\x11\xa1\x98\xc6\x91\x51\x38\x53\x51\xc4\x27\x8a\x27\x8f\x32\x0e\x14\xb6\xdf\x6c\x4a\xea\x5f\xcf\x38\xa6\x04\xa9\xd7\x57\xeb\xaf\xeb\xfb\xa7\xe7\xf5\x66\x3b\x74\xd5\xa1\x71\x2c\x03\x2c\xb1\xad\xf2\xf2\xa4\x3d\x8b\x66\xa6\xbe\x17\xcb\x38\x4a\x86\xf0\xf8\x45\x8d\x70\xcb\x6a\x3a\x4c\x5a\x91\xcf\x0a\x65\x5a\x3c\x1e\x78\xa4\x07\x4e\x63\x45\xb4\xe8\x5c\x53\x17\xef\x32\xcb\x07\xbc\x9d\xd9\x68\x29\x56\x02\x64\xe8\x98\x45\x7e\x71\xc4\xfe\x9a\xd3\x0c\x9a\xad\xdc\xc7\x9a\xdb\x92\x92\x5d\xe9\x6c\x30\xe7\x0f\x09\x25\x7a\x70\xb9\x25\x50\xe3\x45\x4e\x43\x83\xf1\x75\x00\xb1\x36\x6f\xfb\x43\x56\xdc\x96\xa7\x1a\xd6\xfa\x15\x56\xb9\xac\x6b\x2f\x22\x4b\x63\x88\xb5\x07\xeb\x2f\xcf\x0e\xa3\x39\xc1\xc0\xd2\xd8\x84\x02\xc3\x95\xfd\xcf\x36\xde\xfd\x5a\x9e\xd4\xdb\x94\x7f\x47\x45\x60\x52\x87\xac\x39\x94\xef\x60\xdd\x42\x10\x2e\x33\xbf\x17\x8d\x3f\x1c\x72\x89\x3d\x8e\xc2\xa8\x7d\x8d\x93\xf3\xed\xaf\xdf\xfc\xb1\x44\xe0\xcc\x57\x72\x5a\xfd\x12\x84\x08\x6c\x98\xb7\x73\xfa\xe5\x90\xcb\x0e\x8c\x28\x48\x24\xb1\xe0\x6f\xa3\x5b\x57\x75\xb1\x20\xbc\xe1\x0e\x2f\x48\x12\x84\x76\xab\xad\xde\xa1\xda\x02\xe8\x5e\x16\x97\x0a\xca\x0d\xed\x18\x78\x77\x66\x9d\x67\xaf\xb8\x8f\x8d\xee\xb3\xa0\x3a\x0e\xac\x33\xc0\xc8\x1f\xef\xf7\xe9\x28\x01\x6e\xed\x5b\x4b\xf5\xb6\xcc\xba\x3c\xdc\x43\x39\xdd\x40\xc6\x95\x91\x03\x33\x93\x0f\xb0\x31\x82\x89\x28\xc5\xd2\x22\xb8\x0a\xf6\xf8\x70\x1b\x42\x53\x2f\xa2\xbf\xe7\x23\x45\x2b\x2a\x22\x45\x70\x45\x5b\xff\xca\xf2\x8e\x4b\x4d\x45\x64\x02\xc7\x72\x19\xaa\xc1\x0f\xea\x55\xd3\xa7\x1e\x33\xdb\x01\xa8\x00\x4b\x71\x7b\x59\x35\xfb\x66\xb0\xec\x08\x91\x58\xb7\x42\x0c\xdb\xee\xb3\xf7\x6e\xbf\x12\x22\x31\xcc\x75\x9f\x6f\x2d\x82\x6c\x98\xc5\x0b\x61\x52\xac\x3c\x2d\xf2\x19\x63\x9b\xf1\xad\x4d\x44\x8c\x08\xc3\x5d\x06\xd5\xde\x4d\xf0\xfd\xe6\xb2\xfb\x2a\x24\x89\x62\xab\x1e\x66\x1a\xc1\x27\x3f\x45\x12\x85\xf8\xc8\x02\x7e\x35\x2e\x12\x1a\x64\xc6\x22\x25\xce\x22\x16\x9a\x2d\x82\xb7\x2d\x9f\x6e\x5d\xa8\x09\x35\x8f\x8a\x94\x86\xb8\x67\x1e\x9c\x77\x40\x07\x76\xf2\xe7\x52\x24\xa1\x61\xe7\x24\xbe\xfb\xe9\x63\x05\xa1\x85\x5d\x84\xed\x26\xf7\x2d\xfb\x91\x3d\x0f\xb6\x78\xa1\xb5\x4d\x9b\x10\xfe\x80\xd6\x64\x88\x7e\x00\x6f\xce\xba\xaa\x2e\xf5\x41\x27\xd3\x10\x22\x8d\x1a\x7b\x38\xa5\x37\x23\xf2\x96\x1b\x61\xa4\xd5\x33\x69\x93\x3d\x14\x6c\xf6\x7f\xd7\x3a\xb4\x4a\x63\x3e\xdd\x4d\x02\x69\x65\xcf\x1e\xce\xb8\xcb\xee\x20\xcf\xa1\xb2\x4a\xe0\x57\xcb\x6e\x90\xb2\x00\x98\x57\xcf\x66\xdc\x40\xdd\x6e\xb5\xee\x70\x18\x12\xd4\xa3\xaf\xa5\x81\xed\x29\x6d\xaa\xd5\xf3\x6a\x3d\x9f\x17\x24\x21\xe5\xd8\xc2\x68\xaf\xfa\xab\xc5\x34\xfe\x36\x19\x11\x25\xa1\x83\x27\x66\x85\x29\x7f\x66\x56\x79\x72\xf6\x0d\x4a\x42\x91\x20\x2e\x19\x39\x72\x9d\xc2\x6b\xf3\xf6\x31\xc0\x2f\x21\x3c\xb2\xca\xe0\xf2\xc7\x05\x2e\xb6\x1f\x94\x30\xed\x7a\x5a\x6e\xeb\xd1\x77\x57\x1f\x22\x61\x86\x53\x27\x21\x0a\xf0\x92\xdc\x8a\x85\xd4\x5d\x9f\xca\x26\x34\x50\xe0\xea\x43\xd9\xb8\x4e\x9b\xd0\xd0\x82\x2d\x9c\x84\xe5\x38\x11\x4a\x28\x49\x31\x9d\x6e\x43\xd0\xab\xe1\x4c\x4c\xa8\xb6\x1c\xdc\xd7\xf6\x0d\x2c\x6c\xe9\xef\xa5\x86\xf9\x7e\x7e\x42\x21\xb0\x3b\xb4\x3c\x63\x27\xc3\x6f\xdd\x09\x53\xa9\xf7\x4d\xbf\x2f\x2d\x74\xcd\xa9\xe4\xff\x83\x34\x2b\x89\x48\x4a\xac\x5c\xa8\x13\xc2\x9a\x6c\x40\x49\x44\x53\xe3\xa4\x6b\xef\xf4\x08\x83\x39\x35\xc2\x19\x67\x49\xdd\x13\x89\x58\x2c\x62\x0f\xe4\x5c\x68\xdd\xa9\xe9\x3e\x55\xd7\x59\x3e\x80\x3a\x75\x9f\x68\xf7\xe3\xb0\xf3\x0a\x6b\xae\xcb\x6a\x03\xc7\xb2\x42\x18\xad\xac\x9a\x4c\x65\x47\x59\x38\xd1\x19\xab\x58\x3e\xba\x62\x11\x68\x04\x45\x6b\x04\xca\x59\x2b\x03\x7f\xb3\x04\x89\x14\xef\x28\x2f\x08\xc3\xe8\x0a\xa2\x7e\x08\x15\xf8\xa2\x5f\x65\xaf\x59\x23\xf3\x75\xd1\xbc\x9d\xea\x4c\xd6\x5d\x59\x36\x11\x2c\x44\xad\x3d\x0d\xb9\x2d\x7e\x8d\x5e\xe2\x44\x24\x01\xde\x31\x9d\xd5\x7f\x21\x59\xf2\x3c\x24\x63\xf9\x41\x32\xf5\x2f\xcb\x73\x1b\xaf\xf7\x2b\x65\x92\x44\xcc\x4a\xf4\xbf\xc1\xe6\xd4\xff\x55\x38\xd9\x9b\xc3\x71\x18\x5b\x26\x32\xa5\xd8\x45\x2a\x00\xb4\x53\x1d\xad\x77\xe5\xca\x2a\x47\xfa\x41\x29\x8b\x95\x5d\x3f\xda\x89\xf1\x6d\x5a\xab\x4a\x52\x6e\x75\x3e\xb7\x45\xfb\x90\x3e\x5f\xc6\x92\x34\x22\x38\x58\x97\xcf\x95\x0d\x37\xca\xea\xfc\xad\xca\xa6\xad\xfd\x3e\xf3\xee\x9e\x6c\x1a\x0b\x04\xb9\x22\x8a\x35\xbf\xec\x39\x8d\xa7\x5e\x2a\x7c\xc9\xaf\x9d\x03\xed\x72\x0d\xfa\xe9\xd4\xa8\xb2\xdb\x19\x92\x54\x2b\x0c\x8f\xb0\x27\xf1\x3c\xc0\xf1\x27\x29\x68\xfc\x2a\xf4\x33\xed\xf5\x26\x47\x5f\xa0\x52\x1e\xeb\xce\xe4\xb8\xb9\x10\x96\xa6\x89\xa6\x14\x25\x0a\xb7\xd0\x7c\x7b\x9b\x24\xac\x89\x4e\xac\x0e\x88\x9c\xa9\x12\xf5\xa7\x00\x66\x31\x24\xed\x6c\x3e\x3f\x9f\x0a\xf5\x36\x70\x2b\xa3\x09\xc4\x06\x7f\x64\x3b\x47\x56\x6f\xe5\xd0\x93\x64\x7c\x1e\x43\xac\xc7\xdb\x16\x9c\xcf\xe6\x20\xa5\x4f\x4c\x1c\x79\x92\xe2\x7d\x66\x17\x67\x2b\xbd\xe2\x8f\x0b\xe1\x5d\xda\x1e\xe1\xe7\xba\x6e\xb2\x43\xfb\x63\x47\xb5\x61\x3f\x34\x21\x58\x78\xd1\xf0\xbe\xc7\x8a\x86\xbb\x52\x19\xc4\x41\xaa\xfa\x9f\xbb\xe9\x15\x33\xfb\x11\x4e\x8e\xeb\x94\x86\xd1\x6f\x16\xd2\x3d\xc0\xa6\xc8\x30\xb6\x04\xf3\x1a\x61\x9b\xc7\x06\xf6\x34\x1c\x6d\xdf\x32\x4c\xac\x14\xf9\x45\x16\x3b\x3f\x45\x64\x08\x36\x81\x93\x79\xde\xf5\xa1\x3b\x6c\x96\x0c\x0d\x45\xff\x26\x94\x0e\x72\x70\xb4\x61\xa0\x23\x09\x01\x5c\x82\x0d\x34\xea\xed\x59\x66\x1a\x1b\xde\xf5\x75\x59\x3d\x40\xd5\xae\x11\x8d\x37\xef\x1d\x3d\x79\x49\x22\x89\xe2\x14\x56\x43\xeb\x2a\x93\x87\xb2\x18\xd2\x6e\x24\x49\x52\xee\x9e\xc7\xde\x09\xf3\xec\x65\x95\x66\x4d\xbd\xaf\xfb\x02\xa9\x24\x3a\xc4\xe9\xfb\x00\xbf\x32\x55\xbe\xd7\xdb\x9f\xa0\xbb\x57\x5b\x52\x9d\x80\x8d\xbe\x0b\x9b\xae\x39\x94\xc6\xae\xdc\xc9\x1f\xb0\xa8\xdb\x90\xd9\x8f\x65\x01\x60\x57\x72\xaf\xca\xc3\xf1\xd4\xc0\x46\xa2\xc2\xd5\xff\xa9\xd6\x2e\x99\xb2\xb3\x7e\xf5\xf4\xf0\xf0\xf2\x78\xb7\xfb\x63\x4c\x91\x90\x9c\x53\xe1\x34\xf0\x36\xb2\x82\x4f\xb0\xdc\x92\xc7\x21\xb6\xa4\x97\x32\xab\xca\x62\xd4\x53\x91\xdc\x69\xda\xbf\x42\xb3\x38\xa1\xfe\xb6\x07\x92\xfb\x11\x51\x92\x60\x33\x31\xab\x6f\xa0\x80\xda\xa2\xc1\xfd\xc1\x98\xd8\x25\x14\x97\x87\x13\x42\x4e\xae\x3b\x8d\xa8\x99\x85\x59\xc6\xdc\x36\xfd\xa5\xd6\x5f\xb3\x02\xce\x03\x03\xe2\xd3\xc0\xbb\xc1\x36\xd5\x5d\x92\xd8\xcd\xdd\x38\x15\x56\x9c\xac\x29\x2b\xc0\x16\x59\xfd\xdb\x64\xab\x93\xb1\x36\x18\x4f\xfd\xec\xde\x19\x11\x50\x6a\xe5\x84\xb2\xff\xc2\xb7\x6e\x8d\x97\x22\x48\x63\xe6\xf2\xc3\x66\xfb\xd7\x45\x61\xeb\x83\x07\x93\x84\xdc\xfa\x7a\xbd\x95\x3f\x6d\x19\xcd\x4a\xef\xa5\xb6\x21\x39\x0b\xcc\x96\x09\xd7\xda\x76\x64\x35\x1c\xb0\x3e\x87\x0b\x65\x37\x75\x92\xd8\x6e\xd0\xf5\xab\x1a\xee\x2c\x32\x89\x0d\xf6\xcc\x1e\xa0\x91\x9b\x53\x7e\x69\x16\xdc\xfd\x6e\xa9\x99\xa5\x07\x9f\x64\x25\x8b\x06\x40\x2f\x4f\x67\xa8\x3c\xe8\x76\x7c\x39\x69\xcc\x11\x77\x78\x9d\x67\xaf\x6f\xcd\x73\x2e\xa7\x2f\x57\x0a\xb6\xd9\xf5\x23\xcb\x73\x5f\x6c\x96\x8a\xc5\xde\x38\xfc\xa9\x68\xf7\x8e\x76\x11\xbd\xeb\x96\x51\xa9\x52\x65\x1f\x0f\x02\x8f\x97\x39\x48\xf5\xe6\x51\x96\xfd\x3a\x29\x35\x91\x88\x50\x70\x87\x36\xa0\xb2\x63\x06\x85\xf3\xea\xd2\x97\xac\x71\x2a\x35\x8b\x10\x1b\x74\x90\xbf\xc6\x75\x2c\xa9\x23\x45\x3a\x79\xa1\x76\x66\x22\xaf\x65\xf2\x6b\x80\xc4\x1e\x49\xef\x16\x35\xf7\x94\x9c\x0d\x9b\x1f\x66\x08\x02\x79\xaf\xaf\xb6\xa3\x87\x00\x86\xa4\x96\x40\x72\x5d\x95\xff\x05\x4f\x39\x9e\xdf\x23\xa4\x89\x38\x51\x7e\x81\xed\xd8\x95\xeb\x5f\xc7\xb2\x3e\x55\x93\x2b\x4b\xc3\x50\x30\x57\xea\x3e\x1d\xbf\x96\xd3\xbd\x2f\x0d\x59\x90\x88\x01\x07\xc0\xb1\x94\xda\xe4\xac\x5d\xf4\xd7\xb2\x2a\xba\x49\x94\x86\xa0\xb1\x19\xb0\x1f\xa2\xf6\xdd\x31\xc2\x14\x16\x7b\xb2\x42\xdf\x15\x26\x1f\xa6\x85\x29\x51\x54\xb0\xc1\xba\xb5\x2c\x87\x90\x23\x3f\x08\xec\x46\xfb\x26\x6b\x2f\x47\x3f\xfe\x06\xca\x08\x56\x14\xd7\xbb\x5b\x46\x82\xb2\x60\x89\x3f\x3f\x15\x61\x60\xfd\x2e\x8f\x17\x82\x6c\x7e\x88\x56\xda\xca\x79\xfd\xba\xb2\x86\xa0\xbd\x96\xa4\x1b\xc2\x02\x89\xd5\x6b\x63\xc3\x90\xdd\xc7\xf2\x5e\x83\xaa\x60\xca\x98\x95\xb9\xf1\x58\xb7\xc5\x6f\xb3\x54\x92\xf1\x4f\x61\x71\x82\x8b\xa2\x63\x36\xe2\x76\x35\xa8\xf8\x8c\xe1\x38\x29\xd3\x06\x41\x07\x0e\x8c\x32\x44\x30\xcc\xce\x90\x94\x87\x1a\x11\x37\xc8\xfc\x47\x4e\xea\x70\xff\x4d\x79\x68\xb0\x6d\xb8\x77\x2c\x60\xb4\xc7\xbe\x8c\xf8\x67\x57\xa7\x94\x73\x90\xc3\xdf\x3b\x94\x78\xfc\xa0\xd5\xec\x3f\x29\x53\x04\x2b\xbb\x66\x9c\x77\x7a\x19\xa0\x12\x27\xef\xe7\xa0\xe0\x9c\x46\x11\x8f\xec\xd7\xe6\xf2\x3c\x99\x18\x91\x48\x51\x4b\xe6\x58\x41\xa6\xca\x29\x34\x3b\x8d\xa4\xc5\xfd\xdd\x58\x3d\x4a\xaf\x5f\x37\x02\x20\xcc\xb5\x89\xd2\x38\xa1\xd2\xca\x6d\x67\xff\x1d\x86\x40\xa9\x90\x02\x6d\xcc\x1e\xa0\x5d\xa8\xa0\x93\xe0\x1c\xb8\x12\xd0\x34\x09\xa9\xf1\x79\xb7\x4f\x3f\x1e\x64\x71\xfe\xac\xaf\xeb\x17\xdb\x34\x89\x2d\x56\x39\xed\x29\x39\x77\x75\x7d\xea\x5f\xc5\x44\x4a\xec\x2e\xcb\xb1\xfb\xa1\x3b\x2a\xa5\xb5\x45\xfa\x92\x15\xaf\x5f\xca\xe2\x75\x10\xb5\xa4\xa9\x96\xd6\x1d\xa2\x91\x85\xc6\x79\x8e\x93\xc0\x54\xa5\x0d\x29\x27\xeb\x7e\xaa\xc2\x14\x65\xfb\x95\x13\x50\x78\x2e\x4b\x9f\xdd\xa6\x4a\xd8\x63\x3f\xde\xd5\x40\x7c\x61\x72\x1b\x95\x48\xb1\x42\xb5\x7d\xbe\xbb\x5a\x6f\xf6\xcb\xa7\xa7\xae\x0f\x9d\x6a\x69\x23\x87\xaa\x53\xb1\x1a\x4a\xab\xd0\x14\x02\x99\xb8\x1d\xa1\x7d\x76\xfb\xb8\x3b\x10\xd9\xfd\x4e\xb6\x6b\xbc\xf3\xe5\x74\x87\x4c\xca\x31\x20\xf4\xfd\xa0\xf6\x86\x4f\xac\x4d\xc6\x57\xa8\xc2\x20\x4e\xa9\xaf\xd9\x7c\xcb\x2e\x3d\x74\xa6\xe3\xa5\x89\xa3\xce\x63\xc5\x12\xaa\x2f\x31\xfc\x8a\x30\x85\xc8\x9e\x01\x57\xed\x6f\xe9\xd4\x5e\xeb\x70\xb4\x02\x28\x12\x85\x1e\x5a\xdc\x46\x4f\xa5\x0b\x15\xf5\xa2\xf1\xf0\x73\x3d\x45\xe0\x28\x22\xa2\x84\x38\x38\x49\x7b\x93\x3c\x61\xc8\x1f\x06\x85\x5d\xb3\x1a\x0a\x9d\x5e\x22\x03\xdd\x28\x4a\x64\x1c\x76\x21\xae\x65\xf2\x38\x11\xdd\xac\x30\xe5\xe4\x2b\x59\x4c\x22\xa7\xa4\x8b\xf5\xf0\xed\xb0\x8a\xe3\xc7\x24\x8c\xc8\x5e\x46\x6c\xdb\x94\xc7\x41\x15\x50\x45\x92\x81\x45\x5f\xff\x28\xca\x9f\x39\xe8\x57\x58\x95\xc7\x0c\xd6\x28\xef\x54\x66\xd5\xa4\xf4\xa2\x22\x29\x31\xbd\x73\x12\x56\xb0\x36\xbe\x9d\xa7\x62\x16\x06\xd4\x25\xc4\xef\x5e\xca\x60\xb0\xac\x8f\x2f\x4c\x28\x86\x15\x9e\x7b\x78\x87\x6a\x50\x14\x54\x42\x0b\x49\x3a\x81\x41\x57\xb9\xbc\x2b\x66\x20\xe0\x4a\x68\xab\x40\x9f\xb5\xef\xea\xf2\xec\x24\x39\x3e\xd4\x63\x1a\xec\x23\x2a\x09\xac\x18\xbd\x92\xb9\x5a\x66\xda\xc9\x29\x39\xb7\x9b\xf1\x4f\x96\x61\x8a\xcc\x8b\x6f\xb7\x7f\x3c\xdf\xfa\x78\x5d\xa5\x41\x84\xac\x0d\x93\x9f\x8c\x39\xaf\xe4\x58\xce\x95\xaa\x54\xd8\x16\x80\x95\x95\x72\x37\x63\x5c\x16\x51\xa9\xb6\xdd\xfe\x57\x68\x6c\xf5\x75\x14\xcb\x2b\x45\x01\x45\x21\x33\x85\xcb\xa1\xd7\x8f\xf0\x47\x93\x10\x91\xe1\x0f\x50\xbf\x3d\x97\x59\xd1\x8c\x94\x6d\xa8\x52\x10\x61\xc5\xc7\xa5\x4a\x5e\x30\x6a\xf4\xc2\x2b\x1d\x48\xb4\x99\x95\xde\xde\x72\x39\x14\x92\x1f\xbf\x5f\x3a\x64\xd8\xb6\xf9\x2a\xab\xac\xfd\x4d\xab\xb2\xa8\x9b\xea\x84\x2c\xf4\xe1\x86\xa7\xb4\x92\x8a\x75\x75\x98\x06\xe5\xd1\xf0\xf7\xd5\x6f\x1f\x5b\xa8\x5c\x32\x14\x14\x50\x0b\x06\x7e\x39\x6e\x1b\xd9\x7c\xb8\x4a\x4c\x3f\x95\x24\xf8\x60\x8e\xb2\xaa\xc1\x82\xad\x87\x0f\xde\x04\x21\xb5\x44\xa0\x65\x2e\xd5\x8f\xa1\x18\xf1\xe4\xf7\x1a\x61\x92\xb8\xdb\x7a\xab\xb3\xdb\xc9\xb6\x3f\x4e\xee\xee\xe9\x20\xb0\xe5\x83\xfa\xa7\x3c\x8e\xee\xab\x0e\x42\x90\x8e\x6e\x7b\x94\x15\xb4\xc9\xaf\x4f\x2d\xba\x21\x22\x55\x56\xe7\x15\x31\x11\x1f\x17\x69\x75\xa0\xad\x5d\xc7\x16\xc6\x2b\x6a\xaf\x2f\xcb\xfa\xb1\x06\xb0\xf4\x61\xbd\x28\xb1\xdf\x72\x2b\xdf\xdf\x07\x97\x46\x44\x82\x82\x23\x59\xfd\x90\xe9\x1b\x04\x70\x8f\x6e\xa0\xa6\x21\x71\x9a\xbb\x87\xf2\xdd\x5a\xdb\x4e\x07\xc4\xc8\x2a\x7b\xf8\xfe\xc7\x5e\xf5\x3e\x15\x54\x53\xc1\x10\xc6\xf5\x26\xeb\xce\xf9\x7a\x74\x4f\x35\xe3\xa9\xec\x50\x2f\x7b\xac\xb9\xb4\x39\xf8\xd3\x76\x90\x50\x68\x26\x43\xab\x84\xdc\xc6\x3a\xfe\x6f\x2a\xc0\xac\xfe\xb0\x97\x43\x70\x9c\x66\x9a\x23\x77\xc9\xf7\x46\x9f\xe5\x79\xd8\xd2\x9a\x8f\xd8\x34\x73\x9a\xa4\xb8\x03\x3d\x2c\x56\x53\x78\x4b\xef\x5c\xe3\x3e\xc0\x39\xc5\x4e\xcb\x12\x0a\x30\x99\xca\x64\x97\x4f\xeb\x88\x2b\xbc\x82\x9b\xf5\x63\xb0\x7f\x7c\xea\xfe\x9c\xc4\xd6\x26\x18\x37\xb9\x1e\xd4\x66\xf3\x94\x0f\xdd\xf1\x69\x9b\x00\xe1\x92\x9c\x15\x59\xb3\xcf\xd4\xa4\x40\xa6\x93\x20\x44\x4f\x50\x14\x30\xce\x9a\xf3\x2a\x2f\xfb\xbc\x53\x27\x61\x8c\x42\x0b\x37\x5f\x96\x7f\x0b\xee\xd5\x32\xb1\xf8\xae\xf4\x74\xde\xc2\x08\x4f\x3c\x5b\xcc\xd7\x12\x62\x1d\xf9\xe5\xb6\xd3\x71\x70\x26\x1e\x9d\x74\xdd\xf8\xd7\xa4\x81\xc0\xec\x7a\xbd\xbb\x7d\xd9\x5e\xf9\xcb\x4c\x09\xe5\xd6\x43\xf9\x80\x2c\xe3\xa1\xe8\x15\xd5\x2a\x8e\xb0\x4d\x59\x1e\xa1\x58\xa0\x27\x64\x3d\x83\xbe\xd6\x3a\x09\x62\x8b\x50\x51\x65\xa1\xb7\xbd\x8a\x11\xd5\x40\xad\x6b\x46\xbb\xba\xcb\x53\xde\x00\xc6\x94\x1f\xc0\xb3\x34\x50\xc0\x75\x66\x3f\x10\xc3\xeb\x5e\x17\x48\x62\x4c\x53\xa4\x85\xf5\x3c\x64\x45\x03\xfa\xa9\xcf\x58\x75\x9b\x4d\xc6\xb6\x40\x87\xa1\x49\x56\xbc\x0e\xb9\x54\xda\x44\x29\x2e\xb1\xef\x59\x9d\x35\xee\x87\x0e\x42\x6d\x08\x63\xeb\x78\x83\x02\x1c\x57\xdb\x65\xbb\xdb\x2f\x4e\xcd\xdb\x40\x4e\x9d\x42\x28\x78\x98\xf6\xf8\xde\x87\xf3\xe8\x22\x21\x54\x5c\x25\xbe\x1e\xda\x5e\x05\x46\xa0\xa3\xdb\x05\x84\x58\x17\x06\xbb\x6f\xbb\x5d\x21\xbd\x10\x09\xa5\x40\x74\xcc\x7b\x33\xb8\x55\x5e\x4e\x04\x89\x06\x32\xa5\x14\x88\x91\xd2\xd6\xed\xed\x5e\x90\x95\x9d\x98\xee\x78\x43\x04\x1a\x80\xf3\xeb\xf9\x4f\x59\xa1\xfb\xff\xf5\xa9\x50\xe3\x1c\x6c\xb8\x45\x03\x75\xbd\xa3\x01\x37\x17\xa8\x06\x7c\xb0\x2b\x59\xe9\xed\xcf\x4b\x7f\xf7\xf1\x93\x6d\x1f\xac\x74\x75\xe2\x85\x3e\xe5\xcd\x07\x3c\x7b\x60\x01\x68\x86\x7a\x3c\xdf\x16\x9b\xab\x71\x65\x0e\x98\x16\x28\x3d\x69\xf3\x41\x2f\xfb\xf1\x21\xdd\x68\x7c\x05\x9c\x08\xce\x9d\xd4\x5a\xd1\xa9\x01\xf9\x83\x54\x20\xf6\x5d\x8e\x71\x18\x4f\x9e\xb2\x3c\x9c\xd3\xc0\xb9\x44\xae\xcf\xd5\xe2\xa9\x6e\xdf\x89\xe7\x89\x25\xe4\xfc\x1d\xe0\xc2\x72\xc3\x9c\x31\xe7\xae\x47\xf9\x40\x14\x2a\x84\x67\x7b\x2d\x52\xf4\x82\xec\x96\x12\x88\x62\x89\x59\x6d\xbb\x01\x4c\xd1\x37\x10\x19\x85\xf3\x11\x37\xd9\x97\xac\xa3\x3e\x4d\xbe\x3d\x56\x36\xc0\xa9\xa1\x41\x67\xf2\x4d\xa7\x64\x3e\x19\x28\x42\x2d\x2c\x4e\xed\x54\xbb\xc2\xcf\xed\x29\x1d\x7d\xa5\x88\x35\x96\xf7\x9e\x76\x0f\xdd\x9f\x84\xc0\x3e\x60\xc7\xa3\x9e\x94\x63\x40\xa4\x14\x9f\x2b\xfc\xca\x7a\x09\x75\x77\x2c\x31\x14\x8d\x1b\x2e\xd0\xaf\x1f\x26\x0b\xb3\x61\x02\xc8\x34\xb6\x68\xd4\xf2\x94\x7f\xa4\x5d\xed\x87\x6a\x8d\x5d\xac\xa7\x87\x9b\x71\xd9\x0b\x54\x94\x5a\xc0\xe3\xc3\xd3\xcb\xe3\x6e\xff\xbc\xde\xec\x11\xbe\xd6\x1d\x8f\xed\x27\xff\x83\x62\xd5\xde\x82\x62\x7c\x76\x25\x15\xea\x52\xd4\xd0\xdc\x64\xc6\xa9\x33\x1c\x2e\xa9\xc4\xa0\x20\x51\x4e\x36\xc4\xab\x29\x4f\xe2\x8a\xff\xe5\x3f\x7e\x29\xd3\x92\x22\x78\xb7\x43\x51\xd9\xa0\xb6\x07\x52\x01\x28\xab\x0d\x72\x44\x51\x39\xcf\x35\xfe\xa0\xcd\x03\x60\x62\xee\x25\xba\xb7\x50\xe8\xad\x3c\xc0\x68\xeb\xec\x83\x25\xf7\x09\x13\x51\x6e\x85\xb9\x73\x50\x8d\x15\xa5\xf1\xdf\x6d\x54\x44\x9c\x18\xd4\x62\x00\x02\xfe\x18\xcc\xfa\x8f\xb8\x12\xa3\x49\x65\x82\xc0\xa4\x74\xe0\x84\x94\x5b\xc4\x8b\x3f\x1a\x86\x96\x0c\x04\xef\x90\xbd\x8f\xb1\x5e\xe3\x1f\x62\x02\x92\x28\x57\x07\x7d\xaa\x6c\xfa\xe9\x3a\xd0\x9f\xd8\x86\xff\x3e\x59\xa6\xe7\xd8\x66\x26\xa0\xda\xde\xd4\x76\xde\x6f\xad\xbb\x01\x3e\xad\xee\x32\x43\x88\x74\x3c\xe3\x46\x84\x5c\xfc\xec\xbf\x23\xd2\x55\x77\x5a\x22\x18\xda\x00\x5a\x2a\x62\xaf\x19\x49\x0d\x0d\x03\xb4\x62\x45\x58\x82\x85\x83\x6d\x30\xb4\x9c\xe9\x27\x18\x4a\xc3\xae\xfe\x0b\x45\x53\x56\xf5\x08\xc5\x36\x19\x9c\x6a\xcb\x38\x94\x55\x7e\x9e\x68\x1e\x53\xc3\x08\xc7\x2e\x6e\x7a\x1a\x14\x55\x0d\x63\x16\x37\x78\xac\xe0\x1d\x69\x32\xbb\x9f\x00\xcd\x5d\x77\x9c\x0b\x89\x37\xde\x55\xff\x40\x5a\xb1\x3b\xcf\x49\xfb\x70\x91\x18\x5f\x19\x57\x26\xb5\xe6\xb9\x08\xfe\xb4\x0c\xbb\xf1\x13\xe6\xae\xba\xfb\x72\xb4\xea\xaf\x0e\x46\x32\x5f\x69\x9c\x5f\xdd\x0d\x37\x16\x84\xe5\x34\x81\xfd\x36\xb2\xf0\x58\xe6\x5d\xd6\x4d\x7f\x13\x31\x82\xfd\x35\xab\x82\xef\x68\xdd\xc3\xe3\x89\xcd\x47\x76\x56\x27\xf1\xaa\x54\xa7\x43\xe7\x2a\x45\x8d\x00\xad\x68\x27\x2a\x7c\xf2\x32\x42\x17\xcc\xdb\xb1\x9d\xde\x30\x7e\x34\xc2\x68\x6f\xff\xf1\x52\xbb\x02\xc1\x84\xf4\x33\xb9\x8d\x09\x95\xcc\x77\xb3\x1c\x24\xc8\xe2\x84\x76\xd9\x07\xc0\x52\x93\x30\xe2\xa1\xb2\x2f\x56\x07\x13\x5b\xc3\x77\x83\xf2\xc9\xf4\x13\xda\xe2\x26\xa1\x74\xba\x85\x7d\xbc\x61\x12\x63\x08\x45\x16\x98\x31\x39\x3c\xc8\x1f\xd8\x81\x29\x7f\xcc\x6e\x77\x46\x26\x0a\xfc\xe5\x1e\xe6\x7e\x9e\x1f\xa7\x2c\x8b\xd5\x79\x51\xfa\x2e\xab\xff\xd2\x34\x16\xb1\x15\xeb\xb6\xcb\xe3\x75\x59\x85\xc1\x8f\x2b\x99\x75\xa5\x01\x93\xca\x00\xbf\xc9\x51\xa5\x5d\xdf\xd8\x1f\x55\xc2\xd6\x42\x6d\xb9\x1b\xbd\x93\xd4\x50\x9f\xa8\x8f\xdf\x8c\x12\x8c\x58\x1b\x75\x8b\xcd\x79\x2a\xba\x93\x24\x51\x57\x21\x41\xf6\xc7\xf5\xfd\xea\x83\x7b\xae\x8c\x45\x88\xfa\x12\xe0\xf3\xfd\xc2\x97\x1c\x8d\xd6\x1a\xe9\xe2\x36\xb6\x1e\x09\x3f\x53\x03\xa1\x05\x5c\xa9\x63\xf9\x73\x02\x90\x36\x10\x33\x54\x52\xf5\x7b\xaa\x13\xf9\xfc\x60\xaf\x30\x00\x16\x69\x5e\x43\x63\x26\x86\xc5\xd4\x80\xb1\x02\x84\x35\x32\xf7\xad\x16\xdf\x9d\x63\xe5\x4d\xbf\xd7\x30\xed\xe7\x9c\x7d\x31\xaf\xcb\x0a\x4d\x98\x27\xc3\x44\xa8\x9c\x74\x8f\xe5\x88\x0e\x9b\xe0\xc6\x68\x3e\x12\xb9\x98\xa9\x5e\x19\xa3\x93\x28\xf1\x85\xae\xe3\xe7\x35\x50\x63\x40\xe9\x60\x78\x55\xb7\x59\xbb\xd8\x65\x30\x7f\x3f\x58\x10\x80\xa6\xce\xb7\x1c\x8e\xcd\x44\x7b\x74\x36\x58\x65\x41\x98\x58\x6b\xd1\xe5\x62\xb7\x95\x66\x3c\x6b\x59\x10\x4a\xe9\xd9\x8a\x6e\xc5\x6a\x97\x4f\xd7\x8f\x9c\xbb\x6a\x16\x84\x26\x51\xb6\x48\x26\x5f\x67\x71\xa4\x2c\x20\x24\xd6\x61\x0f\xe7\x9f\xd5\xb7\xf2\x43\xa5\xf5\xad\xcf\x6a\x34\xdb\xc2\xa7\x37\xd9\xbc\x58\x40\x03\x2b\x23\x94\xc2\x88\x8e\xcf\x02\xcc\x45\xed\xe5\x63\x9b\x30\x73\xd8\xd8\xf1\x9e\xf9\x77\x31\xe0\x07\xdb\xff\x68\x8f\x65\x01\x05\x8b\xc4\x6b\x73\xf8\xe7\x9b\x27\xc7\x51\x70\x9d\x18\x8b\xcc\xff\xa8\xdc\xc3\x02\x16\x30\x5b\x55\x6a\x67\xaa\x33\x2d\xb8\x10\x11\x6e\x87\x29\x8f\xca\x5b\x66\xfa\x1a\x3c\x92\xa1\x9e\x8e\x0b\xed\x26\x99\x67\x7f\x9d\x32\xfd\x9c\x83\x7e\xed\xea\xd2\x2c\x60\x54\x62\x42\x75\xbd\x79\xee\xf2\x73\x16\x70\x22\x30\x6f\x42\xbe\xef\x06\x19\x2b\xf3\xb0\x5d\x16\x70\x4a\x48\xc7\x8f\x9f\xae\xe6\xa3\x07\xc0\xa3\x34\xee\x02\x8f\xf6\x46\x3c\x64\xc5\xf0\x3b\x95\x53\xb8\xbc\x59\xfd\x5d\xe9\x82\x05\x11\x55\xaa\x8b\x36\x9e\x0c\x2e\xcc\xcb\x33\xa2\x47\x3f\xb8\xce\x48\x58\x03\x61\xcb\x67\x41\x57\x27\x99\xe5\xfe\xcb\x23\x1d\xe2\x0f\x3e\xb9\x48\xcb\x61\x6d\x51\xa5\xb2\x39\xd5\x7d\x75\xaa\x1d\x9a\xe0\xba\xb8\xbc\xbb\xd9\x79\x03\x53\x77\x28\x0e\x62\x24\x25\x2b\x84\xe3\xb5\xcf\xec\xc9\x38\x1f\xbe\x51\x32\xcc\x02\x11\x5b\x77\x12\xf4\x39\xcb\x9a\xfa\xb1\x6c\xd0\xfc\x77\x7b\x52\x6a\x30\x2c\x09\x62\x90\xae\x42\x33\xe5\xe7\xb1\x20\x09\x23\xc1\x3b\x11\x91\x76\x03\xa8\xaf\xcb\x6a\x3d\x64\x12\xd4\x6e\x52\x4c\xe6\x44\x02\x96\xdc\xdc\x15\x2e\x77\xe5\x6c\x30\xfa\xc1\x3a\x21\x89\x4c\x82\x41\x53\xd2\x65\x11\xd5\x24\x36\xfd\xc8\x34\xb0\x9b\xf0\xb3\x41\xac\xff\x8e\x54\x60\x0f\xe6\x28\x2b\x2b\x5f\x30\x95\xa2\x63\x41\x1a\x51\xe3\x16\xd0\xfd\x1b\xe8\x57\x98\x4b\xee\x59\x90\x26\x21\xb6\xfb\xdf\xca\xaa\xb6\x31\xa7\x9d\x27\xe3\xdf\xa4\x03\x19\x19\xbf\x77\xa7\x19\x14\xcd\xed\xe9\x90\xe9\xac\x41\xf1\x8f\xe3\x30\x5f\xf0\x9f\x68\x23\x50\x27\x2e\x6b\x9d\xed\xee\x47\xce\x76\x6e\x18\x10\x49\xdc\x55\xb6\x8b\xdb\xc6\xae\xc4\x65\x75\x9e\x5c\x26\x68\xeb\x18\x25\xb5\x7e\x84\x9f\xd8\xcb\xb9\xca\xd4\x65\xfd\x95\x85\x61\x6a\x89\x25\xbb\x0a\x0a\xed\x74\x9d\x06\xa9\x32\x0b\x49\x4c\xb1\x50\xd7\xce\xae\xdd\x5b\x55\xfe\xdc\x74\xca\x30\xae\x34\xf3\xda\x55\x6d\x59\x48\x14\x21\x74\xc4\xa5\xee\xc3\x46\x16\x52\x1e\x62\x8f\xc5\x9c\x0a\x15\x76\x7f\xd4\x0a\x83\xc1\x2b\x2c\x6a\xee\xb2\x66\xba\x3a\x85\x2c\x24\xd8\x15\x44\x80\x16\x54\x17\xba\xa0\x2c\x64\x34\xc0\x12\xf9\xd7\xbb\xc7\xd5\xe8\xea\x19\x68\x4c\x4f\xd7\x9b\x15\x09\xfe\x56\x6d\x6a\x7e\x8a\x86\x3c\x94\xc4\xa2\x33\x9b\x2a\x83\x77\x18\x39\x05\xf8\x31\x42\xe9\xde\xdf\x1d\x31\x69\xfe\xb5\xff\x02\x17\x0d\x7a\xff\x21\x63\x35\xee\xf7\x0e\x9a\xdc\x06\x96\xed\x22\x4d\x26\x3f\x2f\xa2\x12\x33\x80\x43\x56\xd4\xd9\x6b\x71\x3a\x76\xfa\x66\x2c\x8c\xe2\x58\x22\xa0\x5e\xa2\x9a\x83\xfe\xb0\x5c\x3d\x7a\x25\xda\xb7\x1d\x45\xf0\x31\x98\xb8\x3e\x35\x27\x8f\x23\x64\x61\xbb\x9c\xc0\x80\x4d\x36\xc0\xf4\x76\x3f\x37\xe6\xb6\x92\xb9\x77\x62\x0e\xce\xbb\xeb\x43\x6a\x27\xa6\xbf\x97\xe0\x00\x16\x0a\x12\x20\x41\xc4\x1a\x19\x7d\x2b\xf3\x8b\xac\xc8\x0d\x4c\x08\x19\x29\xbe\xac\x8b\xb7\x76\x65\xd4\x23\x30\x80\x1f\x0b\x71\x2c\x3f\x04\xfe\x8c\x46\x9a\xd0\x46\x7a\xed\x2b\x32\x91\x56\x66\xa1\xa4\xdc\x37\x9f\x76\x1f\xec\x05\xa1\xd4\xb1\xa4\x23\x77\x51\x5f\x87\x70\x03\xd2\xc0\xa2\xe8\xb2\x7a\x7b\xcc\xb3\xa6\x97\x7c\x65\x61\x4a\x08\x82\xa6\x4e\x85\xb5\x8e\xda\x1f\x51\x85\x78\xdf\x0c\xae\x21\xa5\x0a\xc7\xb8\xa6\xeb\xb2\xf4\x58\x06\x16\xa6\x4a\x61\x2f\xc7\x64\x79\xfe\x54\x7d\xc9\xbc\x1e\x90\x5f\x35\x78\x1f\x0f\x44\x7f\xfe\x3e\x4e\xac\x66\x63\x8d\x30\x75\xdc\xf9\xf5\xee\xd6\x46\x79\xdd\xab\x9b\x82\x95\xab\x6f\x43\xd4\x23\x14\x8e\x60\x79\xa7\x9f\xcc\x53\x01\x8b\x57\x28\xd4\x64\x0d\x0a\x53\x30\xa1\xf4\xd0\xdf\xeb\x0e\x0a\xc9\x42\x45\x78\xa8\xbb\x9a\x70\x3b\xef\x0f\xb2\x5d\x50\x26\x9f\x57\x69\xe2\xeb\x7d\xab\x53\x9b\x90\x74\x8f\xcf\x5d\xba\xfb\x3d\xe3\x88\x27\x54\xda\x60\x65\xe6\x3e\x4b\xab\xae\xb3\xc2\x42\x20\x94\x0d\x75\xad\x1e\x64\x71\xa1\xd9\xff\xfb\x5c\x3c\x36\x10\x40\xeb\x0b\xca\x2c\x04\xda\x99\x68\x22\x74\x64\xc6\x11\x98\x85\xa0\x19\x16\x4c\x17\xc5\x8f\xac\xf9\x9a\x29\xe7\x4e\xe2\xaf\xc9\x04\x8c\x32\x1f\xee\xfc\xe6\xbf\xcd\x15\x44\x6c\x2b\x8e\xfd\xd9\xff\x8f\x6b\xd3\xb1\x3f\x27\xb0\x6d\x16\x9a\x38\xa0\x6c\x58\x7e\xfc\x44\x2a\x65\x5a\x76\x67\x24\x64\x0a\xd1\x06\x5b\x87\x2a\x69\xd7\x4a\x42\x47\x71\x93\x1b\x49\x02\x43\xb5\xab\x82\x5c\x78\x53\xcf\xbe\x1e\x84\x24\x34\xb0\xc5\x0b\x3c\xe1\x20\xba\x26\x44\x5a\xe1\xfa\xac\xde\x23\x6b\x63\x0f\xef\x5d\x8d\x80\x11\x2a\x53\xac\xbe\x39\xf8\xc7\xde\x96\x79\xc6\xd1\xdc\xf8\xab\xa8\x4e\x50\xdb\xa2\xf9\x55\xec\xbc\x56\x39\x23\x14\x08\xe1\x3d\x0c\x05\xbb\xdb\xd7\x65\xb5\x3d\x59\x86\xe7\x07\xa1\xf8\xe8\xc4\x2c\xb5\xcb\xaf\xb2\x3b\x9a\x93\x92\x1d\x92\x4c\xda\x31\xd0\xa3\x7e\x96\xb2\x06\xfc\x22\xbf\x08\x90\x28\x8c\x89\xb3\xb0\xf5\xb0\x8f\xeb\xaa\x3c\xa0\x55\xc7\xb6\x3c\x55\x17\x71\xee\x6c\xea\xc6\x48\xe4\x3c\xa6\x2d\x7c\x05\x7d\xdf\x26\xcf\x48\x84\x06\x5b\xb2\xd7\x8f\x8b\xe1\x64\x23\x22\x16\xd8\x98\xb2\xae\xf3\x5e\xcb\xe8\xc9\x74\xc7\x45\x8c\x4d\x51\x7b\xe6\xd9\xe8\x87\x08\xc5\x31\x8e\xba\x91\x87\x7e\x15\x23\x02\x00\xd9\xdd\x77\x85\xce\xf0\x75\xfe\xc7\xfb\xac\x3b\x41\xd2\x46\xbb\xbd\xda\x3a\x96\x81\x3e\x28\x5d\x4d\xe1\x18\x93\x13\xc5\x42\x3b\xda\x1c\x2a\x06\x4d\xaf\x3f\x51\x81\xb0\xf5\x83\x23\xc8\xee\xd1\x25\xda\xf2\x75\xb7\x2f\xab\xd5\x34\x51\xb8\xa8\x3c\x31\x92\x98\x10\xe3\xdd\x41\x09\x72\xdb\x06\xcd\x0e\xa9\x7a\x41\x66\xea\x3e\xa6\x51\x5d\xba\x4d\xe3\x2c\xa7\x0f\x39\x20\x3e\x79\x22\x32\x94\x28\x01\xb1\x5a\xed\xd6\xdd\xdf\x12\xe3\x58\xb8\xea\x54\xd5\x6d\x46\x9b\x97\xe5\x87\x1e\x8b\xfe\x43\x92\x63\xc5\xc7\x3d\x42\x27\x29\xf9\x81\x98\x29\x23\xa9\x48\x13\x74\x2f\x5c\x21\x46\xbf\x7d\x29\x06\xea\xc6\x16\xd3\xc4\xfd\x58\x29\x10\x89\xa9\x41\xe5\x88\x2b\xc7\x57\xf3\xb1\xc4\x60\xb4\x7f\xb1\x53\x63\x10\xb5\xbf\x2d\x4d\x73\x75\xd2\xdd\x44\x51\x22\x44\xbc\xbc\x13\xbb\xee\x5d\xf1\xfc\x71\x1d\x73\x4f\x09\x79\x5e\x5d\xcd\x6f\xb8\x44\x73\xca\xbd\xbc\xbb\xb5\xe4\x68\xcf\x63\xd5\x4e\x27\xef\x82\x4e\x2c\x5a\xb2\x17\x8d\x7e\x8f\x7f\xeb\x8f\xe1\xbe\x7d\xaa\xdb\x18\xc7\x40\xbb\x22\x1c\xb2\x66\x9d\x5b\xf5\xbd\x7f\x9a\xb3\x8f\xbf\xb0\x4d\x85\x74\x0f\x5f\xde\x4e\xaa\xcc\x8c\x00\x67\x18\x6e\xef\x5d\xb1\x6d\x08\xd2\x61\xc4\xc4\x56\x8e\xfa\x58\x41\x5f\xf4\x66\x34\x30\x12\x5f\x3b\x03\xea\x6d\x5b\xc8\x63\xfd\x56\xda\x9f\xe3\xb3\xd4\xd1\x45\x50\xc2\x19\xae\x35\x7b\x4b\xde\x76\x77\xc6\x1d\xa4\x61\x0a\xce\x6d\x74\x92\x02\x52\x46\x02\x5c\x3f\xdf\xad\xe7\x2f\x60\x29\xf1\x38\xed\xc6\x5d\x86\x76\x7d\xb3\x75\x1c\x4d\x50\x46\x85\x65\x07\xe8\xbd\x29\xab\xbd\x9c\x5b\x53\x28\xd3\xa1\xe8\x11\x22\xdb\x83\xac\xba\xc2\xe9\x7c\x87\x95\x51\x06\x11\x02\x13\x6e\xe5\xa1\xdd\xca\x87\xcb\x1c\xe5\x01\x4d\xf4\xd8\x21\xe0\x54\x34\x67\x27\x86\xeb\x7d\x28\xfc\x60\x12\xaa\xa8\xe3\x9a\xda\x91\xc3\xc0\xe0\xb2\xa0\x42\xe3\x48\x84\x0e\x8c\xbc\xf3\x7b\x0c\x15\xc2\x5a\x5c\xdb\xba\x05\x34\x57\xe5\x7f\xdd\x2e\x25\x2e\x94\x23\xc7\xb7\x48\x24\x09\x62\x41\xd3\x0a\xe4\x0f\x8f\xc7\x62\x54\xa4\xb6\xcd\xf1\xed\xee\x71\xbf\x7a\xd9\x3d\x5d\x5f\xfb\x23\x49\x04\x58\xe2\x6a\xc3\xfd\x01\x79\xf6\x9f\x00\x80\x19\x4d\x84\x66\x2e\xc9\xbf\xc9\xcb\x54\xe6\x36\x5f\x1f\x5a\x84\xf4\x71\x01\x4d\x24\xc5\xc9\x6c\x4d\x0f\xad\xaf\xff\xa9\x97\x33\x64\x34\x01\x4b\x4c\x70\x35\x78\xec\xa6\x4d\x9f\x95\xa4\x04\xb5\x4c\x7a\xef\xf6\x45\x8d\xfd\x82\x51\xc3\x66\xb4\xc2\xb6\x3b\x3f\x76\x8b\xfd\x44\x7c\x94\x07\xd8\x66\xaf\x85\xc4\x2c\x65\x32\x1d\x67\xb6\xcd\x0f\xa2\x5b\x9a\x86\x96\x90\xfd\x9a\xbd\xc3\x0c\xbd\x97\xd1\x54\x00\x86\xac\x9b\xa7\xdb\xdb\xcf\x4a\x46\x34\xd5\x11\x02\x71\x9f\xbe\x3d\xae\x37\xdb\xfd\xe2\x65\xb5\xbb\x7b\xc2\x47\xf5\x5b\x37\x42\xa1\x03\xe0\xc3\xe2\xfb\xfe\xdb\xdd\xee\xf6\x6a\xb3\xf8\xb6\x7f\x5e\xed\xf6\xbb\xef\x7e\x88\x0a\x02\x84\x5c\x66\xdf\x64\xd1\x7c\xff\x02\xe7\x79\x4c\x09\xa3\x2a\x8a\x63\xde\x6d\xdd\x65\xd5\x86\x17\x17\x72\xb1\x8c\xaa\xd8\x44\x69\x57\x95\xda\xca\x1c\x2e\x08\x73\x8c\x42\xa0\xd0\xc4\xd8\x95\x48\x67\xe4\x9c\x18\x85\x84\x78\x3a\xfe\x63\xd9\x2d\xdf\xd4\xc4\x02\xb5\xe3\x6c\xfb\xec\x62\x6d\xa3\x26\x89\x85\xa7\xef\x58\x95\xb6\x55\xf9\x6e\xc0\x4c\x2e\x81\x05\x81\xc0\xda\x9d\xb3\xfd\xfc\x47\xd4\x1a\xc6\x82\xd0\x9a\x12\xde\x14\x1d\xbd\x90\xb1\x50\xd0\xc8\x37\x49\xf4\x3b\x54\x4d\x56\xe3\xf2\xbd\x6d\xca\x4a\xbe\x8e\x15\x12\x19\x0b\x53\x81\xc4\x15\x5c\x3a\x67\x9a\x29\x8c\x11\xc3\x88\xc3\xdf\x74\x5d\xa5\xfb\x52\xc9\x7c\x5a\x8c\x1c\x5f\x1b\x4d\x14\x56\xfc\xd4\x50\x40\x82\x31\x96\x58\x61\xf1\x9e\x92\x3e\xa8\xeb\x33\xc6\xd2\x00\x55\xb3\x7c\xe6\xb8\x2a\x8f\x23\x84\x79\x37\x8c\x10\xcf\x4f\xcc\xb4\xef\x42\xd5\xd7\x65\x85\xe0\xc9\x69\x3d\x8e\xf1\x28\x09\x52\xaf\x65\x8c\xdd\x56\xa4\xfd\x3b\x75\xf1\xf8\xcf\xc9\xb5\xf3\xc4\xea\x44\x60\x6f\x31\x74\x9d\x31\x3b\x2d\x1e\xe4\x2f\xaf\x1f\x3d\xf9\x8c\xb4\xa2\x59\x47\x79\xde\xa7\xe7\x7d\x5a\x16\x7a\xaf\x26\x3a\xbc\xd3\xaf\xd1\x11\x3a\xac\x99\xb2\x82\xec\xb5\x58\x56\x99\x7e\xed\x1e\x63\x14\x4b\x5c\x54\xaf\x9f\x36\xe8\xcf\xd1\xfd\x5d\x41\xe8\x18\x8d\xff\x53\xa6\xb3\xf4\x10\xc6\x62\x91\xa6\xd6\x5f\x18\x97\xa8\x41\x7e\xcd\xe2\x44\xa3\xbf\xae\xc1\x8b\xf3\x7f\x15\x9a\x7a\xd2\x3d\x96\xfd\x3b\x6d\x43\x31\x39\x73\x42\x62\xe3\xda\x7f\x56\x16\xad\x5d\x70\x91\xf6\x3f\xa8\x60\x30\x29\x4c\xec\x16\x7f\x33\x00\x6b\x31\x96\x32\x4b\xfc\xb6\x51\xed\x63\x59\x1d\xda\x79\xe4\x45\x03\x18\x4b\x53\x81\x45\xf7\xae\x86\xed\x04\xaa\xbb\xe3\x06\xa2\x61\x27\xec\x7a\x68\x88\x3e\x8e\xe2\x98\x8a\xad\x01\xec\xd1\x3a\xc8\xbb\x42\xf1\xe4\xb1\x29\xa1\x02\x8b\x54\x94\xd5\x6b\x9b\x92\xfb\x6f\xd2\x81\xc4\x0c\xf0\xe1\xee\xf1\x6e\x7f\xb3\x78\x58\x0f\xc5\x65\x18\xd3\x22\x75\x3c\x19\xcf\x4e\x9e\x7f\x45\x0d\x4b\x12\x37\xdf\x97\x55\xa6\x7e\xdc\xe9\x7a\x79\xbe\x6c\xcc\x33\x66\xb8\x2d\x0d\x1c\x4a\x9d\x99\xf3\x4e\xfe\xda\x5c\x2c\x54\xcc\xc4\x0a\xc1\xe1\x4d\xf9\x62\xff\x8e\x5d\xa4\xf1\x10\x49\xb0\x5a\x61\x5d\x22\x5c\xed\x79\xdd\xbc\xf5\xaa\xc8\x21\x71\xd6\x45\x7e\xcb\xe7\x61\x6a\xe2\xb0\xd3\x84\xfb\xc8\x76\x6b\xfc\xc3\x38\xa5\xc4\x6b\x33\x6d\xa0\x6e\x64\x35\x28\x12\x71\x1a\xb1\xc0\x95\x3c\x17\xef\xb2\xea\xfe\x9c\x18\xcf\xce\x42\x80\x9a\x97\xe6\xae\xbb\x01\x92\x85\xe8\x01\xe9\x03\x23\xb6\xdf\x77\xc7\x94\xc1\x26\xa8\xd7\x24\xee\x16\x0d\x4e\x35\xa0\x9e\x87\x8b\xa1\x67\xf4\x5b\x7f\x9f\x49\x61\xfa\x9f\xc2\x82\x40\x59\xc5\x2b\x04\x20\x4f\x65\x28\xfd\x28\x06\x1e\x39\x71\x53\xc9\x42\x5f\x4b\x75\x59\x65\xe6\x0c\x62\xe6\xd8\x6c\xc8\x0f\x9d\xcf\x30\x38\x27\x11\x02\x34\x73\x30\x4d\xc2\x27\xdf\x14\xa5\x10\x5b\xf2\xe3\x74\x21\xe3\x91\x21\xa9\x27\x90\x0c\x04\x4e\x86\xf7\x3e\xa6\x06\x83\xc7\x36\xc0\x7f\xce\xe5\xb9\x3d\x56\x37\xf2\x70\xec\x06\x30\x0b\x54\xdc\xdd\xde\x6d\xae\xf6\xcf\x8b\xcd\xee\x8f\xfd\xfd\xd3\xea\xcb\xcb\xf3\x7e\x71\x75\xb5\xe9\x86\xc9\x04\x85\x41\x57\xe5\xe9\x38\x51\xc2\x65\x5c\x04\x40\x06\x18\x46\xdb\x3a\x9e\xdc\x0a\x41\x04\x6e\xf7\xe8\x10\xf3\x64\xee\xcb\xe2\xf5\xb6\xd4\xf9\x57\xe2\xbf\x41\x50\x6b\xd3\x89\xf3\x6e\xc0\x77\x9f\x9f\x70\x49\x60\x22\x87\xaa\x5a\x1c\x4b\x0d\x95\xd4\xe5\xb8\x63\xc0\x93\x30\xf4\xd6\x35\xb7\x65\x1b\x27\x9d\x5d\x36\xb0\x9f\x5c\x7e\xc2\x98\x76\x41\xdf\x4a\x1e\x8e\x32\x7b\x2d\x10\x42\xb2\x3c\xdf\x0d\xf2\xbc\x2e\xec\xe3\x89\xb4\x22\xa9\x5f\xaa\xec\xd8\x94\xcf\xb2\xf2\x0b\x16\x4f\x0c\x91\x74\xc8\x97\xb3\xf5\xf8\x7f\x9a\x2b\xb9\xb3\x48\x91\xa2\x52\x87\xc9\xb3\x23\x25\x03\x3c\x3d\xe3\x32\x8d\xb1\xbe\xb4\xac\x64\x56\xdc\xd5\xc3\xc0\x9e\x2b\xa0\xb8\x79\x67\xf2\xce\x55\x30\x96\xd3\xf9\xa8\x40\x23\x2a\x74\xf5\xb4\x59\xef\x77\xeb\xc5\xc3\xfe\xf9\x69\xd3\x06\x66\xdd\x39\x8c\xb5\x03\x5c\x54\xff\x39\x15\xb2\x67\x56\x31\xae\x43\x8d\x37\x1c\x9a\x37\x47\xcc\x2c\xbb\x37\x59\x2b\x8d\xea\xd6\x75\x53\x1e\x47\x6d\x60\x0e\x71\x8c\x4d\x23\x57\xb8\x58\x14\xd9\x01\x94\xfc\x1b\x5c\xd5\xec\x02\xce\x21\xd1\xc8\x54\xb9\x91\x87\x36\xaf\x7e\xc5\xb8\xe5\xf3\x1b\x09\x32\x50\xe1\xe0\x71\xb4\x61\xf2\xf7\x42\x1e\xb0\xb2\x74\x25\x8f\xc7\x8b\x8a\xe9\xcc\xd3\x36\x44\x44\x58\x7b\x49\x4f\xe7\x4f\x0c\x43\xdd\xf2\x19\x05\xa1\xa2\x13\x94\xe9\x43\xbf\x3a\x45\x01\x21\xca\xea\x25\xc2\x0d\x34\x0f\x65\x01\xe7\xa5\xf4\x56\x39\x2c\x0a\x62\x8d\xd9\xce\x51\x36\xd9\xc5\xfb\x1e\x05\x89\xf5\x7f\x71\x9e\x7b\x8b\xe3\x71\xb4\xe3\x8f\x53\x4d\xff\x1e\x44\xa1\x93\xac\x00\x24\x92\x5d\xca\x94\xb1\x28\xd4\xa9\x71\xee\xcd\xb8\x19\x2d\xb2\xea\xaa\x2a\x8f\x9b\x5e\xf2\xdb\x0d\x24\x24\xc2\xc8\xe9\xcb\xfa\xc1\x7f\x96\xa4\x80\x00\xfa\x0a\x0a\xf8\xb9\x3d\xa5\xd6\x7e\x24\x2b\x8b\xe5\xf9\x4a\x5e\x06\xec\xe3\x27\x14\x11\x60\x38\x3f\x70\x19\x2f\x8f\x65\x97\xe9\x47\x94\xab\xce\x15\x0d\xe5\xc0\xa6\xbe\x17\x2c\x62\x91\x2d\x56\x6d\x9b\x0a\xe4\x21\x6b\xce\x3b\x59\x65\x66\xd2\xb7\x8c\x98\xe6\xd8\x77\xb2\x29\xec\x70\x9d\xc4\x6e\x86\xff\x3e\x1e\x72\xab\xcd\xf3\xda\xe9\x8b\x5a\xca\xe6\x94\x52\xf9\x7f\xaa\x7b\x44\x5c\x58\xbf\x2f\x6b\xf2\xd6\x9e\x7e\x0a\xdc\x1e\x5f\x35\xd7\x06\x55\x6d\x90\x59\x62\x6b\x68\x16\x7f\x32\x3e\x6d\xc4\x52\xac\x6b\x67\x45\x03\x15\xd4\xcd\x23\xfc\x6a\xee\xbc\x77\xb5\xff\x69\x51\x4a\xf4\x90\xb5\x71\x57\x3f\x97\x75\x9d\xf5\x61\x60\x14\x41\x14\xfb\xba\xd2\xae\xc4\x9a\x6b\xfb\xee\x23\x07\xfe\x62\xb6\x0f\x5f\xf0\x28\x02\xe8\x30\x63\xc7\xa3\xff\x2d\xa3\x49\x13\x33\xc2\x6d\x7f\xf4\x50\x95\xe7\xe1\x92\x15\xc5\x89\x85\x66\xed\x31\x23\x2b\x4d\xd6\x6c\xdf\x64\x65\x55\x72\xe4\x01\x3a\xda\xf0\x45\x94\x12\xc5\xd2\xa0\xc0\xc3\x3a\x97\x7a\x7c\xca\x54\x79\x66\x60\x7a\xaa\x6c\xb2\x73\x2b\x0b\x9d\x77\x4d\xd6\x76\x88\x4e\xec\xaf\x75\x84\xb7\x6f\x90\xf9\x83\x22\x49\x6c\xbf\x4b\xbd\x81\x3e\xe5\xce\x90\xd9\x83\x31\x57\x72\xe0\xea\x30\x1b\x6d\x47\x32\x91\x58\x80\x3e\x56\x59\x31\x30\x43\x87\xf9\x25\xef\x64\x65\x1b\x46\xf7\x54\xa6\x0a\xe9\x2f\xbd\xa6\xf0\x50\x8e\xec\xd2\xd0\x91\x45\x52\x45\xc8\x34\x7d\x5e\x3d\xf6\x00\x6b\x77\x4c\x25\x56\xab\xf2\xb0\x6f\x23\x9a\xac\xea\xaa\x90\x91\xa6\x56\x72\xf3\x38\xf2\xa3\x61\x91\x36\x11\x75\xf1\xda\x0e\xe4\x61\xd9\xae\x15\xd5\xf4\x2b\xc1\x18\xd4\x63\xd9\x5b\xf8\xc5\xa6\xcc\xe1\x19\x2a\x07\xc4\x9d\x17\x15\x64\x91\x89\x13\xbc\xf3\xbb\xbb\xf5\x86\xec\x9f\xd7\x9b\xd5\xfa\xd1\x17\x04\x50\xf5\x31\xf0\xb2\x8f\x6c\x2c\xfb\xc8\xe2\x80\x86\xd8\x37\x3f\x56\xa5\x02\xd0\x5f\xfe\x18\xbb\x9c\xb3\x38\x88\x21\xd0\x5d\x79\x7e\x8c\x60\xfd\x7d\x32\x54\xd8\xb8\xe9\xba\xde\x7d\xe9\xc8\x1f\x13\x82\xb6\x1f\x2a\xad\x0c\xe2\x53\x3e\x6f\x32\x7f\x59\xfe\x8e\x03\x13\xe3\x86\x31\xc1\xb4\x2e\xcf\x53\x4b\x79\x16\x87\x21\x11\xdc\x31\x84\x65\xd5\xf4\xd8\x6d\x16\x87\x9c\xa1\x61\x50\x05\x45\x79\x2a\x14\x2c\x2c\xdd\x63\x44\x3b\x64\x71\x08\x96\xef\x7c\xf7\x2c\xcf\xdf\xbb\x3f\x9a\xc8\x44\x16\xc7\xb2\x4f\xe1\x03\xfb\x13\x16\x93\x84\x1a\xef\x1f\x8f\x8f\x78\xf2\xd3\x99\x60\xf8\x3b\x1c\x99\xe1\xc9\x2c\x1a\xef\x58\x3b\x1f\x94\xc5\x4c\x1b\x7c\x82\xfb\x36\xbf\x01\xa7\x6f\x35\x8e\xca\x62\xce\x08\x8a\xd4\x1d\x64\x71\x32\x52\x35\xa7\xaa\xff\x35\x5c\x44\xde\xc3\xe2\xae\x68\x46\xa9\x4c\xcc\x13\x83\x40\x20\xdf\x73\xb7\x31\x8e\x35\x68\xf7\x43\x52\x89\xfe\x8d\x6e\xfb\x7a\x96\xe7\x65\xd6\x78\x1f\xf3\xc9\xe6\x11\x47\x22\x42\xde\xcd\xae\x7c\x7d\xcd\xe1\xa1\xcd\x20\xa0\xe8\x49\x02\x2c\x8e\x89\x35\xbb\xb4\x41\xed\x43\x66\x99\x36\x59\x3a\x99\x97\x31\x57\xda\xd1\xba\x16\x63\x4f\x50\x37\x40\x04\x61\x18\x3a\x57\xb8\xaa\x59\xff\x15\x46\xbf\x8d\x78\xd0\x61\x37\x90\x53\x6c\x90\x59\xaf\x04\x0c\x40\x4b\x59\xa1\x17\xe2\x98\xca\xca\xe2\x24\x52\x8a\x0c\xc1\x81\xf5\x5d\x71\x09\x5d\x89\x13\x29\xbd\x63\x86\x97\x5b\x2e\x4f\x48\xde\x1a\x75\xf1\xe3\x24\x4d\xa4\x9a\xa8\x0c\xf9\x63\x52\x87\xca\xbb\x1d\x62\xef\xfd\x4e\x4f\xca\xe9\xed\x72\x8a\x91\xfb\x16\xc3\xca\x97\xc7\xbb\xdd\x62\xf3\xc7\x7e\x7b\xbf\xd8\xde\xfa\xb3\xa8\x50\xfb\x42\x68\x87\x1c\x1f\xb5\x07\x63\x95\x06\xb4\x9d\x3b\x68\x05\x45\xbf\xad\xd7\x5f\x46\x29\x76\xac\x23\xdd\xcd\xad\x55\x25\xd3\x67\x59\xd9\xbe\xf2\x74\x4f\x8c\xb5\xb1\xaa\x2f\x93\x5f\x8d\xf5\x40\x37\x04\x82\x08\xfb\x69\x2f\x35\x7c\xcb\xea\xb7\x51\xcc\x1a\x1b\x4a\x31\x65\x3a\xbe\x95\x05\x38\xd5\x55\x7f\x48\x05\xda\x4e\xde\x5f\x1b\x30\x50\x55\x32\xf7\xb3\x4f\x04\x32\x8a\xa3\x4e\x51\xa9\x6e\x97\xda\x0a\x3c\xe4\x4d\x84\x91\xc6\x02\xce\x4f\x48\x6f\x32\xd3\xbc\x14\x9f\x92\x57\x98\x08\x63\x8d\x55\x48\x0b\x4b\xec\x99\x1d\xa3\x9f\x2a\x42\xc1\xf1\xa6\xad\x2a\x00\x0d\xbf\xba\x2f\x93\x02\xa1\x9b\x5d\x43\x19\x71\x15\xcd\x05\x64\x0c\x4f\xc6\xdc\x96\x2a\x08\x70\x5c\xf6\x31\x19\xbf\x3f\xa9\x1f\x67\xfb\xe3\x37\xf0\x0e\x32\xff\x1b\x21\x2b\x26\xa8\x10\x54\x7b\x1b\xc1\x85\xd6\x0f\x08\x59\x98\x61\x12\x30\xc1\xb8\xdd\x78\xda\x58\x31\x85\x7a\xff\x96\xd5\x65\x75\xde\xe7\x03\x5e\x62\xbb\xf8\xc4\xb8\x48\x2b\x99\xe7\xcb\x46\xb5\x79\xf8\xb6\xb9\x40\x95\xff\x1d\xec\xed\xc3\xa6\xcc\x20\x66\x17\x91\x14\x40\xbd\x10\x40\x47\x9d\x1e\xad\x5b\x42\xd0\x38\x75\xb3\xea\xae\xc6\x89\x67\x0d\x70\xd7\xbf\xe0\x70\x9c\x97\x7e\x66\xc2\xcb\xce\xa3\xb7\x5a\xa3\xde\xae\x4e\x76\x0f\xc7\xfa\xfe\xf2\x7c\x03\x05\x54\x72\xe0\x16\xe4\x57\x27\x21\xa4\xa4\x0e\xef\xdc\x86\x74\xf8\x7d\xb6\x93\xd5\x0d\xd0\x88\xd7\x3e\x64\x85\x43\x1b\xdf\x15\xab\xc1\x62\x28\x92\x10\xc2\xd4\x97\x56\xb3\x62\xf1\x0a\x17\x8b\xf7\xec\x22\x2e\x12\x1a\x60\x91\x3a\x3f\xee\x64\x75\x21\xee\xc7\x44\xc2\x62\xc4\x7a\xd5\x0d\x1c\xf7\x47\x79\xee\xff\x9e\x80\x5b\xbc\x6f\x70\x3b\x39\x5f\x97\xa7\x6a\x66\x45\x14\x09\x28\x42\x3b\xe0\xe6\x80\x34\xde\xdd\xec\x34\xe2\xd8\xa3\x42\x5f\x7b\x97\x6e\x0e\x57\x25\x91\x26\x3c\xb5\x22\x15\x2a\x3b\xf4\xef\xa0\x02\x92\x38\x43\x2a\xdb\xcf\x32\x65\xe5\xbd\x51\xdb\x40\xaa\xfc\x3c\x9a\x15\x3a\x88\x43\x5b\xd5\x69\x63\x6d\x8b\xb8\xd2\x93\x6b\xd3\x61\x10\xf7\x38\xb6\xab\xd3\x0f\xb0\xe0\x70\x2f\xe3\x3a\xd2\x5c\xf9\xfc\x95\xd1\x9a\x60\x8e\x83\x05\xc5\xdd\x1f\xcf\xeb\xfd\x55\x27\x9e\xce\x84\xee\x71\x19\x96\xc8\xb8\x98\x91\x43\x69\x87\x71\x04\x17\xbc\x38\x5c\x1d\x1e\x7b\x96\xe7\xeb\xb2\x72\xe6\xd6\x93\x0f\x00\x33\x2c\x70\xe2\x18\x5e\x36\xe2\x42\xdf\x91\x09\xd0\x89\xf4\xe2\x49\x38\x11\xee\x0a\x55\x56\x15\xa8\xe6\x0a\x6a\xec\x35\x81\xb6\xaa\x96\x16\x41\x56\x5f\x65\xef\xed\x7b\xec\x2f\x1f\x8c\x44\x92\xdd\x5e\x95\xc7\xf3\xae\x5c\xb6\x37\x71\xc2\x3f\x1d\xdf\x0d\x13\x08\x04\x50\x79\x3f\xaf\x9d\xcc\xf3\x0c\x2e\x45\x40\x2f\xde\xec\x2e\x57\x17\x26\x26\xa1\xbb\x65\xf6\xed\x1c\xe0\xc4\x84\x91\x1c\xe5\x56\xea\xf2\x00\x2f\x45\x2d\x0d\x2c\xd4\x85\x1e\x30\x13\xc6\x48\x74\x3d\x51\xbd\xbb\xdb\xf8\x42\x93\x20\x50\x5d\x31\xf8\xe1\xe5\x61\xbf\xde\xdd\xae\x37\xfb\xed\xf3\xfa\xd1\xc3\xab\x93\x90\x30\x14\xc3\x42\xd0\xd3\xda\xdb\x78\xf8\x83\x2c\xf6\x48\xb1\x55\x75\xde\x96\xb9\xd5\x52\x9f\x2f\x05\x27\x21\x98\xc8\xde\x16\x50\x9d\x53\xf4\x42\xeb\x8f\x30\xe2\x09\xa1\x02\xa5\x91\x53\xa9\x7e\xec\xb2\x5f\x03\x02\x3f\x4b\x28\xe5\x71\x3a\x90\x68\x1e\x1f\xe4\x14\xf7\x9c\x2f\x4f\x8b\xfb\xc5\xf3\xe6\xe9\x7f\xd6\xab\x5d\x7f\xcc\x60\x14\xf3\x7c\xef\x77\xe4\x84\x11\x11\x59\x4f\xef\x06\xc4\x1e\x0a\xbd\xef\x10\x23\x09\x23\x2a\x30\x1d\x55\x6a\x5f\x8d\x38\x37\x2c\x61\x52\x63\xd8\xfa\x9f\x93\x7e\xbd\x68\x6f\xb9\x31\x3c\x0c\x90\x4d\xba\x7c\x7a\x79\xdc\xfd\xb1\xbf\x7e\xe9\xef\x2e\xe7\xdc\x2a\x77\x63\xec\x76\x57\xdf\x67\x9e\x8d\xc3\x12\x2e\x2d\x84\x22\x3d\x9d\x07\xc6\x17\xe3\x53\xc7\x32\x88\x42\x2f\xdb\xd7\x86\xff\x57\x95\xfc\x39\x74\x14\x71\xe3\x04\xa3\xe0\x5d\x28\x72\xd9\x64\xc5\xe9\xf0\x99\x68\x3a\x4b\x92\x90\x7b\x92\x89\x53\x18\x9e\x35\x5f\x64\x49\x22\x0c\xb5\x88\x20\x93\x15\xde\xa3\x81\x25\x92\xc5\x48\x64\x69\x33\xd3\x0a\xde\x33\xf8\x89\x8b\xf6\xbb\x97\xdc\x65\x89\x94\x04\x33\x28\x28\x34\x46\x35\xfe\xef\x69\x2c\xac\x00\x82\x6c\xb3\xf6\xbf\x25\xd7\xe2\xfb\x27\xfc\x67\x21\x40\xde\xc8\x8d\x93\x49\x7b\x2e\xbb\xe7\xa8\xc2\xae\x55\x76\x2b\xeb\xb7\x91\x74\x00\x4b\x94\xb4\x2a\xe1\xb5\x05\xe7\x3e\x15\x53\x9b\x9d\x76\x48\xca\xdd\x0e\x68\x5d\xa2\x3f\x78\xa7\x74\x4a\x30\x67\x99\xda\x58\xcf\x3e\x3f\xad\x23\x84\xc1\xec\x1d\xde\x0c\x19\x1f\xa4\xd0\x57\xc3\xfa\xf6\xfc\xf7\x80\x48\x91\xfa\xbc\x7c\xf9\x63\xe0\x54\xc1\x12\x48\xac\x09\x7f\x9b\x91\xc8\x1c\x77\xad\xf1\x7a\x96\x80\xe4\xd8\xae\xc8\x41\xea\x8b\x74\x38\x31\x61\x8a\x18\x6d\xf9\x0a\x85\x96\x53\xf0\x7c\x62\x12\x21\x92\xb1\x6a\xef\x40\xbb\xaf\x9e\x01\xde\x26\x06\xe2\x4e\xd7\x05\x63\xfc\x75\x01\xd5\xeb\x79\x54\x5b\x91\x01\xb3\x06\x1b\xd8\xd8\xc3\x22\x5a\x8d\xe1\xdb\xdf\x4e\x80\xd1\x5d\x91\x81\xb2\x3e\x05\xd6\x8d\x3e\xcd\x0a\xd0\xdf\x64\x55\x65\x1d\xbf\x93\x49\x12\x70\x9c\x78\xff\xef\xee\x61\xf9\xb4\x7a\xba\x7b\xec\x0e\x70\x8d\x89\x19\x46\xaa\x2e\x4b\xfd\x74\xcd\xf6\xe8\x08\x49\x89\x46\xe6\x2b\x4e\xba\x85\xe7\xd6\x61\xb5\xad\xfb\x5a\x1a\x83\x2f\x03\x6e\x65\x2e\xab\x0b\x41\x50\x3f\x4e\x71\x5f\xec\x77\x6f\x9e\x4d\x2f\x96\xe7\xc7\xf2\xe7\xf8\x61\x48\x16\x05\xd8\x6e\x29\x8d\x99\x29\x6f\x8d\xcf\x1b\x47\x11\x56\xcc\x8f\xf2\xbc\x7b\x03\xe7\xfd\x34\x19\xa2\x23\x0c\x54\xb3\x02\x8d\xd8\xed\xc3\xfa\x6d\x06\x12\x2b\x63\x1d\xc7\xf6\xc7\xe4\x16\x58\x52\xb7\x17\x37\x3e\x9b\x08\x99\xef\xa4\xd9\xf0\x30\x1f\x3f\x71\xc1\xb9\x6b\xcf\xe9\x49\x3c\x30\xb3\x21\x4a\x61\xbc\x4a\xd4\x7b\xf9\x63\x12\x08\xc8\x84\x42\xe4\xee\x2d\x5e\x8d\x05\xdd\xcd\x2f\x6d\x32\x61\x0c\xb1\x4f\x7b\x0b\x43\x5a\xe4\xb9\xd5\xf0\xdd\xc9\xfa\x07\xda\x95\xdc\x96\xf9\x07\x9a\x1f\x4c\x26\x0a\x74\x2f\xea\xf0\x5c\xe6\xf9\x28\xe5\x92\x09\x30\xd6\x97\x4c\x3a\x43\xcf\xd9\x8d\x41\xca\x04\x50\x22\xd2\xfb\x06\x6f\xd6\xdb\xf5\xe6\xeb\x7a\xb3\xbe\xda\x5b\x42\xbf\x9f\x3b\x52\x05\xa8\xcc\xf8\x9f\xb2\x0d\x92\x73\x2f\x6f\xc3\x64\x4a\x01\xbb\xf3\x4e\xa0\x50\x56\x6d\x4a\xdc\x64\x75\x93\xa9\xc9\x7b\x2d\x15\x4f\xb1\x6e\x0b\x95\x22\xc1\x97\x9b\xed\xb0\xb1\x2d\x55\x14\x22\xc9\xf7\xf6\xe9\xd9\x2f\x24\x52\xa5\xdc\xc9\xb6\xb8\x19\x3d\x3d\xa1\xb1\x8e\x88\xca\xeb\x0a\x0c\x44\x29\x47\x55\x79\xa9\x63\x06\x49\x27\x22\x6e\xd5\x85\xc6\xf6\x3f\x6e\x20\x90\xc8\xc4\xbd\x2a\x3f\xd2\x0d\x66\x07\x9a\x30\x50\xc6\x6b\x28\x83\xde\x95\x37\x36\xb4\x9c\x4c\x41\x43\x01\x42\x4f\x24\x38\x55\x85\xb4\x80\x91\x1e\x6f\x97\x06\x81\xc4\x99\xa3\xca\xe2\x1d\xaa\xe6\xf1\x74\x98\x4a\xc9\xb2\x34\x60\x46\x3a\x1c\xdd\xa2\x6a\x6f\xae\x9f\xae\xbe\xfa\x31\xba\xb6\x34\x0c\x24\xf0\x5e\xc1\xe7\x22\xd7\x4d\x49\x64\x3b\xbe\xda\x59\x3d\xf9\x04\xdc\xbe\x48\xcb\x53\xcf\x8b\x70\xa0\x34\x21\xba\x6b\x21\x71\x8a\x91\x4d\x86\x86\x07\xbf\x1a\x98\x02\x9b\x52\x2a\x2c\x91\xb1\x6e\xca\xe3\xb2\x7b\x06\x29\x4d\x42\x3e\x04\x5a\x59\x81\x9c\xf9\x57\x24\x6d\x6f\x9b\x8b\x98\xaf\x73\xf9\x3a\x9a\xe2\x29\xa3\x16\x2b\x66\x0d\xeb\xac\xe6\xc9\xfe\xe1\x8b\x9f\xac\x29\x4b\xac\x90\xb2\x83\x3d\x7a\x6e\x50\xbb\x34\xfa\x21\x9c\xc4\x69\xd0\xab\xca\x83\x5e\x59\x27\x68\x7f\x98\x33\x6e\xc5\xe7\xf2\x15\x54\x63\x47\xbf\x71\x4b\x28\xe5\x6d\xd2\x8b\x8c\xa2\xf4\xf4\x3a\x66\x61\xb3\x94\x0b\xe6\xb5\x91\xbf\x41\xd6\x17\xbe\x4e\x17\x1e\xa8\xed\x58\xe9\xc1\x92\xab\xd5\xed\x1e\x74\xd6\xec\xc3\x60\xfc\xcb\xb9\xb1\xde\x77\x7b\x2b\x43\xe1\xbf\x26\x8a\x53\x44\xed\xb4\x91\xc3\xa0\xd1\x98\xc6\xc2\xea\xf9\x1f\xe5\x19\x9a\xb7\x70\x3e\xc8\x4d\xe3\x24\x41\xa5\x4e\xe7\x27\xb9\xd6\xd9\xcc\xd5\x89\x98\x61\x41\xd0\x92\x31\x3b\xbb\xca\x61\xff\x3b\x4d\xb4\x42\x4c\x98\x2f\xcf\x25\x76\x7e\x26\xbf\x0f\xff\xe9\x6e\x5c\x62\x08\x71\x6e\x2d\x8e\xf1\x37\xb4\x2e\x62\x69\x4a\x95\x37\x5a\xc2\xbc\x76\x81\xe1\x04\x3e\x45\x8b\xa7\xbb\x85\xfc\xf8\x51\x45\x36\xd5\x11\xc1\xb8\x74\xa1\xeb\xaf\x50\x0c\x18\x47\xa9\x4e\x63\xe8\x9d\xea\x3c\xb3\xc0\x6e\xf5\x23\xe6\xd0\xfc\xdd\xd2\x40\x31\x7a\xf7\x4d\x8d\x47\xf8\x79\x05\xc8\xa6\xfc\x54\x18\x83\xa5\x40\x2d\x6a\x66\xb7\x79\x7a\xfc\xea\x2f\xc6\xa4\xd6\x6a\xdb\x72\xe7\x9e\xab\xf2\xd7\xa4\xcf\x9c\x1a\x43\x78\xdc\x59\xad\xa2\x6c\xc1\x10\x8e\x37\xfe\x12\x15\x44\x06\xc3\x39\xe7\x8c\x6e\xad\x94\xbb\x64\x41\x85\x94\xa0\xc4\x29\x3e\x89\x5d\xf9\x72\xe7\xd7\x90\xee\xb8\xd5\xac\xd6\x60\xe4\x29\x1f\xd5\x09\x54\xc8\x28\x06\x36\x57\x00\xc7\x9b\x4e\x0e\x97\xa9\x30\x8a\x70\x6d\x3d\x22\xa6\xeb\x41\xfe\xc2\x4f\xb5\x29\x73\xff\x30\x55\x18\xa5\x84\x0e\x24\xe9\x06\xb6\x4a\x4c\x85\x69\xe8\x60\x22\x68\x21\x7a\x1c\x7c\xa7\x8e\x31\x21\xdf\xa7\xf0\x81\xda\x1d\x53\x24\x0c\x78\x67\x01\xee\xdb\xf5\xe3\xd9\xab\x48\x6c\xa5\xae\x96\xf0\x9a\x4d\xc8\x02\x6e\x04\x0b\x0c\xb1\x68\xf3\x5f\x68\x30\xfc\x99\xb9\xe6\xfc\xad\x67\x04\xb8\x83\xb1\x9c\x6a\xa8\xd0\xee\x67\xfc\x2c\x15\xa3\xb6\x13\xe9\x18\x95\xb2\xca\x24\x96\xa3\x86\x5e\xc0\xe3\x4f\xf0\xd8\xae\xd4\xf7\xe5\x6b\xd7\xfd\xa8\x9d\x12\xef\x47\x59\xab\x8a\x38\xc1\x55\x62\x79\x3a\xef\x47\xac\x8d\xf9\xc0\x4c\x45\xa9\x15\x28\x3a\x5a\x52\x70\xfb\xdc\xda\x2d\x72\x24\x79\xc0\x54\x1c\xa7\x08\xae\xdd\x42\x73\x3a\xfe\x1d\xe7\xe7\x13\xf5\xa1\xc9\x97\x8b\x80\xd9\xde\x80\x05\xae\xc1\xcf\x75\x6e\x25\xdd\xfc\x62\xac\x04\xe7\x58\x89\x32\xbd\x94\xe4\x18\x6b\xa9\x92\x40\x07\xda\x05\x83\x8b\x3c\x5f\x95\xe5\x8f\x0c\xfa\xa3\x3c\xc0\xe6\x8c\xdd\x2e\x76\x4f\xbb\xc5\xfd\x50\x27\x8b\xa9\x24\x56\x89\x15\xf8\x2a\xe4\x68\xca\x4b\x6d\xdd\x1a\xae\xcb\xaa\x9d\x14\x5d\x7a\xaf\x52\xce\xf1\x94\xed\x25\xd5\x5d\x1f\xbc\x4b\x70\x94\x4a\x92\xd0\x25\x01\x4b\x70\xb6\x24\xa3\x6a\xe9\xb0\x66\xaa\x94\x8e\x51\x91\xe1\x27\xc6\x2c\xb3\x62\x2d\xb8\x30\xf5\xc1\xa8\x52\x26\x88\x1c\xfc\xf5\x59\x56\x35\x5c\xf8\xe3\x4f\x64\xd9\x99\xd2\x5c\xe2\xae\x7c\xfb\x7d\xd7\x0c\x7f\xa3\xe6\xca\xa7\xa5\x4f\x45\x87\xf2\xde\x80\x9a\xbc\x42\xc0\x09\x32\xe4\xbe\x64\xb9\x2e\x0b\xf0\x56\x55\x4c\x41\x12\x58\xae\x49\x8d\x2e\xab\x0d\x62\x3b\xfb\x83\xd6\x68\xf0\x0c\xb2\xa2\xed\x2f\x9b\x3c\x39\x13\x19\xcc\x09\x3c\xec\xf0\xb1\xbc\xcf\x0e\xd9\x07\xb8\x4e\x65\x24\xc5\x46\x93\x3c\xa4\xb2\xae\xa5\x2e\x2b\x77\xba\x69\x92\xa8\x03\x66\x84\xa3\x38\x37\xe5\x73\x3f\xaf\xff\x19\x76\x5d\x07\x6e\xca\x28\x59\x69\x5b\xb9\xaf\x9f\x26\xe9\xb8\x0e\xb9\x55\x6c\x7a\xcf\xaa\x76\x63\xf2\x40\x5c\x1d\x46\x8a\xc6\x43\x5e\x90\x7d\xfc\xfe\x28\x58\x9c\xe6\xc3\xe2\xf1\x1f\xbc\x43\xee\x43\x24\x94\xc8\xb0\x3e\x15\x79\x36\x11\xca\x65\x9a\x3a\x5d\xc5\x3a\xfb\x2f\x0c\x84\xa5\x99\xa6\x34\x46\x00\xfe\x66\xbd\x78\x5e\x6f\xf6\x77\x8f\xbb\xcd\xfa\xf9\xee\x6a\x7f\xbd\xbb\xdf\x6f\x9f\xd7\xeb\xab\x6e\x20\xb3\xfc\xda\xe7\xf2\x27\x54\xa5\x59\x9e\xd2\x1e\xcf\xa0\x69\x42\xbd\xe5\x0f\xfe\x10\x32\xfd\xfa\x34\xc6\x02\xd2\xfd\x6e\x43\x87\x2f\x8f\x66\x24\x41\xfd\x94\xbb\xbb\xc7\xf5\xf8\x80\xb4\xd1\x8a\xc9\x8e\xb5\xe7\x77\xfb\x63\x3c\x50\xf8\xe2\xec\x9e\x9e\x97\xdd\xdf\xa8\xed\xd0\xd5\x50\x68\x1f\xa9\xce\x4f\x10\xcd\xb9\xb2\xde\xe7\x6f\x70\x90\xbf\x54\x1f\x0a\x69\x0e\xa1\xaf\x3f\x35\x83\x02\xed\xf4\xf3\x86\x60\xb7\x67\x59\xfe\xb2\xf4\x66\xf7\xf7\x28\x14\xca\xa1\xdd\x3b\x43\xd2\x89\xed\x0a\xd3\x51\x92\x60\x21\x1d\xe7\xd9\x67\xf8\x2b\x1d\x49\x19\x1a\x1f\xda\xd8\xd2\xf8\x35\xb4\x19\xb1\x2e\x7f\x5e\x97\xd5\x75\x59\x4d\x16\x5f\x1d\x47\x29\x56\x30\xa6\xe4\x6d\xfa\xc1\x0f\x11\x42\x61\x5e\x6e\xd1\xaa\xeb\xe6\xcd\xe9\x24\x7c\x82\x56\xd5\x22\x51\x48\x2c\x41\x13\xbf\xa3\xe7\x42\x5c\xa5\xfe\x1a\xda\x60\xd2\xc5\xe4\x37\xa7\x62\x79\xbe\x6b\x97\x9e\x26\x9c\xcc\x87\x44\x11\xe8\xca\x95\xbb\x72\x00\x9f\xd0\x92\x47\x23\x09\xfc\x07\x78\x2a\x9c\x0d\x4b\xf5\xcf\x98\xe4\x5a\x2a\x85\x64\xeb\xc3\x5e\xb6\xe9\xc3\x5b\x56\xbc\xee\x61\x28\xff\xc7\xb4\x34\x5c\xa9\x6e\xc2\x66\xda\x16\xa0\x5c\xb7\xe8\xae\x18\x97\xce\xdc\x67\x52\xe0\x28\xa9\x77\x03\xcd\xf6\x78\x9a\x24\x34\x5a\x85\x80\xbd\xdf\xde\x84\xaf\x42\x37\xb0\xf9\x5b\xaf\x8c\xc6\xf7\xff\xb1\x6c\xe4\x0f\x38\x3b\xc9\x96\xf6\xa1\xde\xad\x9e\x9e\xe7\x83\x18\xad\xe3\x14\x92\x91\x19\x0e\x23\xa3\xd0\x5f\x03\x03\x9c\x01\x5d\x3f\x66\xf2\x13\x40\x28\x8c\xe2\x51\x7c\xe0\x02\x6a\x3c\x2a\x56\xfa\x4f\x24\x80\x20\xc7\x36\x01\xb2\xe1\xef\xfc\x6c\x35\x4a\xa6\xaa\x2b\xb8\xd9\xfe\xc9\x10\x0a\x3c\xba\x4c\x63\x12\x2d\x5c\xf2\xb7\x3a\xab\xee\xe1\x43\x10\xc4\xd8\x5f\xbd\xba\xdb\xee\x36\x77\xcb\x17\xcb\x61\xf1\x9e\x32\xdd\x28\x26\x3c\x7e\xb4\xc9\x61\x09\xcd\x4b\xa1\x72\x78\x80\xea\x47\x0e\x08\x77\x1d\xed\x73\x2c\xf0\x1f\x4b\xa2\x20\xea\x3d\x01\x91\xbb\xd3\xbe\x3e\x6d\x8e\x34\xba\x4d\x10\x06\x4c\x5b\x11\x94\xdd\xb7\xa7\xcd\x97\x41\xf5\x0d\x48\x02\xd0\xab\xb5\xfb\x86\xcf\xf8\xe3\x8c\xd9\x1d\xc8\xb1\x90\x86\x20\xad\xa9\xa6\x1e\x03\x66\x28\xb6\xc0\xfe\xdf\xff\xdc\x0f\x17\x40\xe0\x9c\x06\xde\x2d\xf3\x56\xd6\x9b\xb2\xbf\x4b\x3c\xa6\x28\xdd\xbc\xac\x64\xa1\x3d\x1f\x62\xfa\x66\x0c\x9a\x63\xfe\x63\x09\x41\xa0\xf6\xc3\x1f\xeb\xee\x4c\x69\x48\x48\x4f\x7c\xb7\xed\xd1\x29\x94\xb8\x1d\x85\xd9\x2b\x5a\xcf\xcc\x56\xf8\x21\x0a\xac\x94\xd9\xb0\xc5\x38\x9d\x56\x7f\x57\x22\x1d\x1e\xff\x80\x30\x05\x31\x4b\x50\xf7\xc9\x5e\xf0\x25\x48\x1f\x62\x66\xb0\xd5\x5d\x9d\x72\xa8\x2f\x0a\x5b\xff\xc7\x7f\xdd\xb9\x05\xb1\x96\x58\x5b\x99\x21\x7b\xa6\x6e\xf6\x37\x32\xf3\x55\x2e\x48\xb8\x40\x25\xf5\x7d\x8f\x23\xb3\xf5\xcb\x45\xa1\xef\x65\xa1\xdf\xb0\xdc\xf7\x3f\x52\xfd\x38\x96\x1f\x48\x4a\x41\xe2\x34\xaa\x16\x77\xdf\xd6\xcb\xd1\x7c\x48\xc0\xba\x9b\xdf\x40\xb3\x83\xc3\x71\xdb\x9c\x8c\xb9\xb0\x09\x60\x20\x13\x46\x87\xd2\x5c\x77\xab\xa7\x4f\xf2\x4d\x90\x8a\xe0\x74\x5e\x42\x75\xfa\x6b\x18\xf2\x81\xd4\xb6\x35\x72\x2a\x50\x89\xe2\xb9\xca\x0e\x65\xa5\x33\x57\xff\x19\xa5\x3c\xf3\x3f\x25\x8d\x15\x02\xfb\x7c\xd4\xd6\xee\x78\x0e\x4d\xe5\xb8\x4b\x3e\x08\x81\x34\xa1\x58\x13\x80\xe6\xed\x5f\x27\x89\x8e\x94\xfd\xa1\x34\xb2\x5a\x15\xae\x9c\x35\x76\x59\xf5\xa3\x80\x5a\x55\xe9\xfa\x82\x04\x06\x4a\x44\x08\x80\xb2\x81\xf3\x75\x59\x75\xd6\xf0\xed\xb1\x04\xb7\xec\x5b\x32\x12\x69\x01\x65\xac\x43\xbb\xe3\xd9\x64\xc5\xab\xc3\xa5\x8c\x7f\x22\x48\x8d\x32\x30\xdb\x6b\x2b\x6a\xba\xde\xdd\xee\xb7\xeb\xd5\xd3\xe3\xd5\x7e\xbd\xd8\xdc\xff\xb1\x5f\xde\x6d\xae\xf6\x9b\x45\xc7\x9f\x06\xd0\x9a\x45\x2e\x27\x40\x51\xda\xe1\x06\x0e\x26\x0c\xb0\x6c\xb6\x7a\xcb\x0a\x79\x9f\x19\x18\x79\xe0\x7f\x88\x80\x33\x01\x0d\x71\xcf\xb4\xdf\xbd\xc5\x6b\xb9\x5a\xf8\xf5\xd2\x04\xdc\x7a\x62\x61\xff\xdc\x7a\x73\x74\x87\xe2\x08\x6b\x58\xd6\xf3\xee\xaf\x29\x6a\xcb\x04\x71\x82\x08\xb1\xe6\x97\xb3\x95\xf1\x1f\x0c\x49\x82\x0d\x35\x0d\xef\xcf\x32\xd3\xdd\x9f\x75\x84\x09\xc0\x0f\x50\x4a\x5e\xd4\xed\xc6\x33\xc4\x10\x61\xdd\x5f\xf6\x35\x34\xa1\x57\xdf\x31\x2c\x96\xb8\x7b\x17\xf0\xab\xb9\xaa\xe4\xcf\xc1\x0d\x32\x3c\x4c\xb4\x0b\xb1\xee\x65\xdd\xfc\x4d\xf3\xc9\xf0\x28\xc1\x6a\xd9\xba\xca\x06\x15\x2f\x13\x85\x11\x23\x1d\x42\xb9\xde\x80\x06\x38\x74\xb1\x81\x89\xa3\x00\x3b\x9a\x3e\xcd\x71\x33\x60\x12\x0e\x98\x58\xb0\xd0\x62\x93\xaa\x1f\xd0\xec\xaf\x2c\x03\x7d\x39\x51\xc2\xc4\x71\xf8\x46\x5e\x5f\xfd\x83\x27\x19\x27\xd6\x3c\xfa\x6a\x7d\xbd\x79\xda\xee\xf6\x77\x8f\x77\xbb\xbb\xc5\xfd\x04\xba\x69\x84\x13\x96\xf8\xcc\xb3\xda\x09\x77\xf4\x17\x22\x4c\x2c\xad\xf4\x7a\x9b\x46\xd7\x60\x77\x8e\x07\x68\xa4\x96\x8d\xf4\xcf\x77\xfc\x99\x24\x4c\xb9\xdb\x33\xbf\xef\xbe\x3a\x35\xa6\x4f\x91\xd4\x46\x06\xb6\x50\xf3\x90\xe5\x43\x77\x30\x66\x24\x13\x71\xe7\x3b\x52\x9f\xf2\xc6\xa9\x8f\x8d\xbf\x51\x26\xc2\x70\x8f\x49\x7c\xcf\x1a\x58\x95\x1a\xe3\x89\x51\x08\x61\x52\x2a\x90\xb0\x95\x15\x23\x2b\x96\xf1\xa5\xa4\xa9\xb2\xea\x0a\x83\x7d\x62\x36\x64\x34\x8a\xc4\x88\xba\xfb\x65\xac\x2f\x9a\xbf\x66\xa5\x93\x30\xf1\x81\xea\x43\xed\xb5\x11\x8c\x0e\x2c\x47\xf1\xe7\x9b\x6c\xb6\xb2\x29\xeb\xb7\x6c\x2b\xcf\x75\x77\x38\x0a\xe3\xa8\xa3\x90\x8f\x6b\xe5\x6e\x08\x44\x1a\x73\x8d\x42\x1e\x60\x25\x5d\x85\x8d\x8f\xb7\x3b\x03\x09\xc1\x68\x7b\xd1\xc6\x73\xef\xce\xc3\xc3\x01\x2c\x27\x23\x8d\x24\x4e\x9c\x58\xaf\x0b\x7d\x2c\xb3\x62\xc0\x56\x9f\x0b\xd9\x8c\x21\xd4\x6e\x95\xb6\x05\xf8\x60\xfd\x8f\xfd\x4f\x30\x49\x90\x4a\x34\x35\xed\x71\xdd\x9f\xaf\xf8\xc6\x68\xab\xe2\xf8\x6d\x7d\xe7\x97\x43\x7b\x36\x1e\x84\x44\x51\xf7\x54\x97\x9d\x0b\xd1\x5d\x81\x8c\x85\xcf\x4e\xca\x83\x90\xd9\x1d\xaa\xb1\x35\xdd\x5e\x39\x80\x07\xa1\x89\x99\x65\x9e\xff\xea\x29\x1f\x3c\x20\x84\x6b\x27\xbf\x7f\xc4\x20\x6d\xda\xdb\xe0\x01\x61\xc1\xc0\x85\xc5\x11\xe1\xf4\xe2\x15\xed\xd4\xdd\x18\x1a\x24\x89\x27\x65\xda\x30\xaf\xcd\x74\x46\x93\x9d\x07\x54\x1a\x8c\x29\x77\x50\x37\xc9\xff\x74\x1f\x55\xda\x0b\xb3\xdf\x97\xaf\x96\xe2\xa1\x75\x35\x3c\x8c\x93\xea\x2d\x2b\x7e\x0c\x3b\xfc\x3c\xa0\x10\x5a\x65\xcd\xae\x0f\x54\x4f\x2e\x9d\xb1\x08\x29\x4f\x6f\xe5\xcf\x07\x59\xb8\xaa\xf8\xa2\x02\xa7\x91\xa7\xaf\xcb\xf9\x8e\x22\x0f\x98\x20\xf8\x44\xd1\x9d\xa2\x1e\x49\x74\xb7\x07\xad\x4e\x04\x1a\x83\x5b\x39\xb1\xc9\x4f\x65\x52\xe2\x6a\xed\x4c\xda\x11\xa2\x04\x1a\x19\x35\x93\x4b\xe4\x44\x58\xc8\x31\x92\x29\x9f\xab\x52\x9f\x94\x83\xea\xce\x41\xf8\x79\xc0\x23\x11\x0e\xfc\xa7\x9c\x63\x9b\x7b\xd8\xe3\xab\x88\x62\x82\x2f\xe4\xc3\xe2\xfb\xfe\x65\xd5\x46\xe6\x23\x3d\x7b\x1e\xc4\xa1\x62\x03\x6c\x6d\xef\xb4\xc5\x83\x98\x5a\xef\x89\x81\x9b\xe3\xf2\xbc\x81\xd7\x53\x2e\x7b\x97\x97\xdf\xff\xa1\xbf\x23\x0f\xe2\x94\x60\x07\xed\xe9\xeb\xd3\x60\x9d\x6b\xff\x2e\xa9\xad\x54\x1f\xb2\x6e\x52\x0a\x4e\x90\x13\x8c\x51\x63\x56\x60\x7f\x0b\xc5\xeb\xda\x5d\x66\x81\xbd\x90\xba\x1b\x6b\x42\xe6\x9a\x3c\x4f\x47\x07\x58\x6c\xe7\x3e\x3e\xe0\xb9\x45\x97\x07\x49\x00\x69\xcf\x08\xbc\x2a\x0f\xf2\x92\x13\x3b\x5b\x67\xe0\x81\x8c\x04\x36\xc9\x6f\x70\x2f\x01\x99\xe3\x4e\x32\x5a\x5e\x78\x20\x93\x48\xaa\x9e\x57\xd6\x33\x0f\x2e\xb6\xf8\x39\xbb\x36\x1e\x28\x16\x63\x89\xda\x96\x57\xdd\xe2\xb0\xde\xf8\x5f\xac\xe2\x18\xe3\x30\x17\xe3\x61\xb7\xad\xb2\xfa\x4a\xf3\x2a\x31\x3c\x50\x12\xd0\xf3\xd8\x26\xf6\x4b\x4b\x21\xda\x97\x45\x7e\xde\x5f\xc1\x7b\x77\x62\x15\x61\x79\x6b\xdf\x81\xef\x3e\x8d\x49\x78\xa0\x35\xef\xe4\x02\xdd\x36\x87\xb5\x97\xac\x2c\x76\xbf\x9e\xaa\xec\x35\xeb\x9e\x33\x84\xc6\xf6\x14\x3e\xcd\xa3\x43\xb7\xe2\xf3\xa0\xcd\x0b\xdb\x2b\x7e\x2f\x1b\x40\x89\xc2\x89\x68\x20\x0f\x20\xb6\xa0\x8a\x3e\x81\x98\x64\x0b\x7e\x1c\x10\x44\x9c\xd9\xa7\x7d\xa7\xca\x75\xa1\xed\x53\x1b\x8f\x33\x81\xb4\x35\xe3\x21\xa7\xd6\xc1\x41\x78\x60\x88\x05\x85\xad\x86\x29\x7b\x76\x98\xf7\x65\xe5\x81\x89\x35\xbe\xff\x6f\xb2\x7e\x5b\x66\xe5\x01\x9a\x2a\x53\x6d\x2a\x92\xcb\x06\x6a\xff\xf6\x8c\x23\x9c\xc1\x1e\xcb\x03\xa3\x43\x1d\x7a\xe0\x4a\xfb\x45\x4e\xf1\xc2\x1e\x0e\x03\x99\x60\x76\xe5\x5d\x0c\x51\x8a\xe8\xd4\x4b\x8f\xf9\x0b\x09\x03\xe5\x14\xad\x0b\x55\xb6\x41\xf4\x5e\x43\x47\x82\xf3\x27\x0b\x59\xaa\xdc\xab\xfe\xfc\x56\xc9\x7a\x14\x3d\xf0\x30\x14\x04\xc3\xac\x7b\xf9\xeb\xbf\xdd\x47\xc0\x38\x0f\xb3\x8e\x83\x8c\x8b\xf6\x68\xda\x85\x24\x88\x11\xe6\xab\x4b\x67\x9d\x3d\x3d\x1e\x2a\xdc\x87\xaf\xdb\xa5\x29\x64\x4c\x7c\xa2\xf6\x3a\xbe\xc1\x21\x0d\xad\x26\x68\x8a\xfb\xbb\x45\x1c\xfa\x43\x20\x71\x43\xb9\x2d\xf3\x73\x1f\xc9\xf2\x90\x51\x40\xee\x53\x1b\xbe\x8f\xdb\x78\x3c\xe4\xa1\x15\xdf\x90\xda\xf6\xad\xab\x73\x1b\x49\x8d\x67\x48\xc8\xb9\x05\x11\x37\x7d\xa9\xc6\x78\x16\x3e\x0f\x79\xca\x85\xd5\xc5\x70\x4c\xe3\x41\x3a\xd2\x0d\xb1\xe0\x47\xa7\xba\xb8\x29\x9b\xf2\x82\xe4\x39\xfe\x44\x14\x48\xe7\x60\x75\xde\x57\xe5\x59\xe6\x4d\xd7\x86\xe1\x61\x44\x19\x02\x57\x1c\x15\xf0\x34\x03\x71\x99\x8f\x13\xc2\x48\x58\x50\xc6\xbe\x5d\xfa\x9a\xbd\xc7\xbf\xd9\x4e\xc1\x78\x68\x4c\xa4\x18\x80\x32\xbb\x2f\x8f\x53\x8e\xac\x2e\xff\xba\xec\xe4\x2f\xaf\x22\xe9\x47\x80\xb4\xb2\x3a\x5e\x26\x7e\x18\x5b\x7c\x58\xe8\xf8\xa8\x35\x38\x9e\x39\x82\xd0\xde\xb0\x04\x9c\x32\x72\x7b\xc7\x07\x34\xa6\xf1\xef\x10\xc4\x06\xf4\xce\x54\xf9\x33\xa8\x24\x0f\x85\xb4\x32\x03\x5f\x6f\xbe\x8d\xd6\x41\x7f\xb8\x0d\xbc\x3b\x00\xe9\x18\xa2\xd0\x66\x5d\x1a\xdf\x97\xf6\xd5\x9d\x36\x39\x78\x28\x03\x0b\x9c\x96\x5a\x7b\xb1\xaa\x39\x18\x04\x0f\x25\xd1\x36\x5a\x6a\xbf\x64\xcf\xfc\xd9\x65\x12\xa2\x1e\xa5\x23\x3e\xd5\xa5\x99\x5c\x9c\x62\x3a\x0e\x46\x4e\x28\x57\x0e\x94\x32\x5f\x5f\xe5\xa1\x02\x61\xd2\xae\x1d\x80\x5a\x4a\xed\x6c\x58\x5d\x3d\x7e\xf0\x01\x9d\x00\xbe\xfd\xdf\x16\xf7\xf7\xeb\xdd\xfe\xfa\xe9\xe5\xf1\xaa\xdb\x9f\x42\x08\x03\x64\x08\xb6\x21\x65\x7b\xa7\x0b\x3d\x79\xfb\x3f\x98\x94\xa0\x00\x97\xaa\xeb\x97\xdd\xcb\x66\xbd\xbf\x5a\x7f\x5d\xdf\x3f\x3d\x3f\xac\x1f\x77\xfb\xe7\xa7\xa7\xfb\xee\xf4\xce\x09\xc4\xe2\x6b\x27\x77\xd7\x74\xeb\x52\x9e\xbf\x14\xd9\x7c\xe5\x88\x93\x80\x92\x60\x58\x37\x5f\x39\x87\xcd\xf1\xad\x24\x41\x1c\xc5\x66\xd8\x49\x1d\x2d\x8c\x24\x48\x2d\xf8\xf9\x55\xd6\x7b\x94\xc9\xdc\x1f\xbc\x70\x21\x27\xa1\x90\x9c\xf5\x75\xcd\x0d\x48\xe7\x88\xd4\xd1\x8a\x38\x09\x13\x40\x8b\xe0\xbf\xd3\xb1\xe8\x0b\x93\x9c\x90\x04\xb0\x70\xd6\x3e\x21\xab\x3c\x39\xfe\x69\x44\x1a\x63\x59\x7b\x6d\xae\xd7\xcd\xcd\xd1\xdc\x22\x94\x24\x8e\x17\xdd\xc8\xac\x00\x3d\x7e\x73\x09\x95\x16\x4e\x77\xbb\xd8\xdc\xed\xd6\x7d\x45\x97\x13\x16\x2b\x65\x7d\xd0\xbd\x40\xd7\x4c\xe9\x9c\x13\x1e\x00\x52\x07\xf3\x76\x41\xb9\x6a\x77\xa8\xaa\xfc\xa9\xbf\x01\xfc\x08\xfd\x99\x38\xb7\x99\xef\x7e\xfd\x78\xb5\xbf\xea\xaa\x3e\x9c\xf0\x38\x08\xa9\x95\xc8\xc0\x30\x64\x48\x8a\xc6\x1a\xde\x27\xec\x05\xe1\xce\x11\x99\xc4\x43\x46\x1f\xdc\x2a\x1c\x7a\xf0\x17\x27\x31\x0d\xa9\x23\x14\xc3\x5c\x28\x40\x44\x44\x30\xc4\xf6\xe6\x35\x76\x81\xf5\x17\x28\x84\x46\x89\xc6\x76\x2f\x37\x65\x75\x18\x8a\xc0\x71\x22\x64\x84\x32\x4b\x99\x2a\xb1\x6f\xcb\x06\x44\x6e\x4e\x12\x11\x53\x37\x2b\xb6\xbd\xf9\x3f\x27\x49\x1a\xe2\x52\x7e\xb2\x3e\x15\xb7\xb2\x5e\xc2\xeb\xc9\x6f\x5d\x44\x52\x6d\x86\x5a\x43\x77\xe6\x56\x56\x6d\xf6\x32\xad\xee\x71\x92\x06\x61\xa4\xad\x1e\x33\x34\xf0\xec\xa8\xfa\xfe\xa0\x54\xde\x65\x72\xfd\x0b\xd4\x80\x58\xcb\x49\x0a\xd6\xb1\xe2\x21\x1b\xf8\x80\x4d\xde\x9b\xd4\x44\x46\x38\x30\xcc\x1e\xf9\x2f\xfe\xd3\x8a\x47\x44\x38\x42\xd4\x76\x80\x60\x9b\x9c\x40\x89\x38\xee\x70\x77\x50\x48\xb4\xb4\x1d\xff\x00\x4d\x52\xcf\xfc\xf4\x62\xbc\x93\xc7\xa3\x29\x4b\x94\xd5\xd4\x6d\xde\x56\xf8\x0e\xb8\xab\x1d\x0f\x93\x82\xdb\xa0\x57\x8f\x40\x62\xfe\xb0\x0e\xb4\x1a\xa8\xf7\x7a\xbe\x5e\x77\xd8\x3a\xcf\xad\x77\xb7\xcb\x53\xd3\xf4\x9f\x03\x23\x11\xf4\xbb\xbb\x5b\x6f\xf8\xa0\x5e\xc9\x89\xa1\x4a\xd8\xb7\x2a\xcf\x8a\xbf\x4e\x59\xfd\xd6\x69\x24\x8e\x9a\xf4\x9c\x18\x29\xd1\x21\xa7\x06\x57\xa2\xbd\xa9\xca\xd3\xd1\xa9\x18\x0d\x5e\x76\xa3\x62\xeb\xcc\x6d\xf3\x57\x8b\xa1\xde\x95\x76\x3e\x6e\xcf\x87\xb4\xcc\x31\xcf\xb6\xc3\x69\x90\x72\x94\xba\xf0\xe0\xd3\xfb\x76\x09\xdd\xd3\xee\xb0\x4e\x12\xa7\x62\x7a\x5d\x56\xaf\xd9\x3b\xe8\xd5\x9b\x1c\x39\x76\x72\x1a\x18\xf0\xa6\x29\x7e\xf1\x78\x80\xba\x1e\x1a\xf2\xbb\x91\x61\x68\x25\x47\xeb\x06\x64\xbe\x7b\x83\x7b\x80\x1f\xfe\xab\x42\x08\x1c\x41\x18\xab\x05\x5e\x88\x7e\x7c\x1b\x28\x09\x6d\xa1\xa3\xeb\x00\xbf\x42\x31\x54\x26\x1b\xdc\x8a\x76\x2c\x93\xbd\x82\xf1\xe4\x5a\x08\x01\xd6\xf3\x61\xa7\x07\x53\x86\x5b\xff\x71\x46\x00\x9f\x53\x02\xd2\x06\x06\xd9\x6b\x01\xfa\x23\xe6\xe3\xe7\x64\x85\x71\xf8\x40\x09\x18\x2b\x7c\xa5\xd4\x06\x54\xc7\xff\xe0\x94\xf2\xd8\xf6\x25\xb6\x57\xc3\x2c\x98\x52\xc1\xd0\xa5\xc5\x66\x7c\x48\x2d\x1d\xce\x2c\xca\x64\x1c\x76\x52\xc3\xeb\x5f\x47\x18\xf8\x35\x8f\x71\xa5\x56\x4c\x7f\xfc\x0b\x39\x07\xbb\xe8\x64\xfd\x93\xd8\x20\x1d\xeb\xa2\x1f\xc7\x29\x8f\xe2\x44\xa2\xd5\xde\x49\x7d\xc0\x51\xe7\x94\x27\x04\xcb\xce\xd9\xe1\x58\x56\x8e\x4a\x7d\x5d\x5e\x34\xef\x26\x1f\x52\x09\xf6\x2b\x8f\x55\x66\x39\xed\x5e\x2b\x8b\xd3\x28\xb6\x74\x2c\xab\x9f\x8f\x7d\xa0\x79\x6d\x1d\x4e\x05\x25\xb8\xc3\xef\xbc\x2e\x0c\xa7\x22\xb2\x0c\x49\x0c\x5a\xc6\xc1\x18\x15\x49\x02\xd6\xd5\x76\xf0\x18\x92\x50\x24\x6a\xe0\x6d\xdd\xbd\x21\x09\x97\x88\xa8\xf5\x0b\xbf\xdd\x1c\xdc\x41\x69\x08\x3e\xbc\xed\x11\xaa\xc3\xe8\xf1\xa5\x81\xc6\x82\xa8\x8d\x13\xae\x65\xfd\x36\x4c\xf6\xdd\xee\x93\xfc\xe9\x47\x0b\x85\xe7\xc1\xb7\xb9\x90\xa7\xa6\xb6\x1c\xb5\xc9\x83\x50\x51\x88\x17\x09\x87\xac\x83\x48\x60\x53\xf9\x22\x68\xbd\xd0\xb9\xe4\x54\x49\x82\xe9\xf6\x73\xf6\x7d\xeb\xaf\x52\xa5\x0c\xa1\x1c\x06\x1a\xf5\xf6\xb5\x6c\xe0\xf1\x74\x40\x43\x9b\x42\x23\x7c\x78\xbc\x0e\x53\x95\xca\xc4\x0a\xb3\x79\x7a\xd1\xfd\x10\x80\x37\x4a\x57\xa9\x8e\x23\xa6\x1c\x9e\xa6\x6e\xb6\xa7\x14\x97\xa5\xb9\xb6\x24\xa7\x3a\xa1\xc0\xfa\xd8\xdd\xed\xa2\x93\x6f\xd7\xa0\x91\x2c\x67\x64\x96\x4f\xc1\x48\x9c\x82\x10\x58\x4d\x72\xdb\xe5\x5c\x83\xcd\x8f\x94\x61\x8a\xcc\x80\x5e\xa6\x2f\xbb\x54\x80\x98\xaf\x6f\x50\xd0\xa1\xad\xf3\x41\x96\xf7\xe1\x11\x35\x34\xa4\x0e\xa9\xde\x06\xa6\x16\x58\x4c\xa2\xf1\x3a\x6a\x58\x18\x49\x17\x54\x87\xe3\xcb\x67\x41\x08\xb6\x40\x94\xd5\x6d\x4e\x34\x99\xb3\x2c\x48\x83\xc4\x6a\x0d\x9b\x1c\xb3\xfb\x3e\x64\x64\x24\x04\x7c\x2a\xe9\xe9\x7c\xa7\xca\xa1\x89\x01\x67\x84\x11\x8c\x8c\xad\x0f\xcf\xc7\x9d\x4c\xce\x48\x04\xaa\x4b\x60\xae\x4f\xb9\xc9\xf2\xbc\x4d\x45\x26\xde\x40\xff\x26\x7f\x4e\xd7\xbb\x7f\x8b\x3f\xc7\x3d\xe7\x7f\x93\x3f\xfd\x49\x45\xe4\xf9\x8d\x2b\x99\xe7\xa8\xcb\x37\x7a\xf2\x8c\x88\x04\xdb\xf4\xed\x0d\xbb\x6b\x46\xa0\x99\x88\x0d\x0c\x77\x3f\xf4\x02\xe1\x8c\x12\xf0\x86\x85\x4e\x25\xf2\x1a\x3e\xd4\xa0\xf4\x9f\x11\xd6\x6e\xb4\xfd\x95\x37\xb2\xbb\x5d\x54\x1a\x7c\xc1\x24\x2e\x5f\xb4\xfb\x33\x74\xf0\xac\x0b\x6c\xd4\xf8\x31\x32\xa9\x10\x74\xb4\xda\x2e\xfe\xce\xa6\x86\x33\x1e\xa5\xdd\x45\x20\x59\x1a\xf4\x32\xd3\x17\x1a\xb9\x93\x4b\xe7\xb1\x2d\x2a\x6c\xa0\x99\x71\xe3\x9e\x0e\x56\x8c\x25\xbd\x97\x18\x02\x0b\x56\xb6\xae\x8f\x92\x47\x3e\x18\xec\x14\x1e\xba\xdd\x95\x71\x93\xc8\xd0\x0b\x98\xd4\xf5\x2e\x53\x3f\xa0\x59\x9e\xce\xed\xac\xff\x04\x78\xc5\x59\xe4\x54\x50\xbb\xfa\x9f\xcc\xe7\xa1\x64\x9c\x45\xc4\x4a\xa8\x58\xd8\xc3\xae\x3c\xbe\x1c\x67\x0a\x0e\x2c\x4e\x14\xee\x56\x45\xc7\x56\xf2\x07\x94\xb5\x6a\xc0\x16\xfb\x8c\xf2\x29\x67\x22\x08\x99\xee\x6d\xe7\x9f\x8a\xfc\xfc\x54\xac\xde\x64\x56\x58\xf1\x45\x3f\xcc\x44\x48\xa2\x6d\x33\x8f\x21\x29\x87\x33\x49\x19\xee\x6b\x7e\xb1\xf8\x9a\x95\x39\x26\xce\xa3\x47\x29\xe3\x18\x53\x2c\xa3\x54\xf7\x41\x9d\x60\x79\xf0\xa1\x7c\x87\xeb\xac\x7e\x9b\x8f\x9f\x99\x0a\x63\xee\xe2\xef\x9d\x17\xce\xe6\x4c\xd1\xc0\x12\xbb\x4f\x87\x27\xe3\x8d\x83\x27\x4b\x86\xa2\x09\x62\x23\x53\x28\x40\x65\xa6\x77\x9d\xe6\x4c\x45\xb1\xd4\x3d\x53\x4a\x97\x33\x25\x0b\xa6\xe3\x10\xe2\x91\xee\xc4\xf2\x74\xee\xa1\xcc\xdd\x2b\xaa\x53\x81\x5d\xf5\x57\x79\x80\xf5\xaf\xac\x6e\xea\xc9\x3b\xac\x41\x3a\x82\x76\xb3\x94\xea\x07\x14\xfa\x92\x17\xcc\x19\x84\x31\x0a\xb2\x5d\x65\x0a\x36\x65\x9e\xff\xd6\xfd\x1d\xb0\x36\xe2\x8a\xfa\xb2\x81\xb5\xac\xf2\xb3\x17\xd5\x9f\x3c\x4f\x30\xca\xd6\x59\xde\xaa\xf2\xe7\x53\x71\x23\x6b\x5b\x05\xed\xed\x9a\x38\x33\x3c\xc6\xa0\x16\x1b\x35\x5b\x8b\xe5\xc3\xcd\x67\xf4\xc8\x4c\x92\x62\x5f\xd9\x5a\x2a\xa3\x62\x15\xce\xd8\xb2\x3f\x8f\xa6\x5e\xe9\x18\x7f\x50\xbb\xa7\x38\xf1\xf5\x0b\xff\x97\xf1\x3b\xc0\x03\x96\xfa\x06\xf3\xa2\x4d\x86\x57\xe5\xb4\x58\xcd\x09\x33\xc6\x6b\x58\x2d\x3b\x34\x2f\xe7\x24\x02\x8f\xce\x72\x7d\xb3\x29\x6f\xee\x32\x14\xe6\x34\x60\xcc\x35\xf6\x5f\x6a\x40\x22\x3d\x54\x33\x5d\x86\xe1\x1d\xe0\x8c\x06\x71\x47\xfe\x78\x95\x45\x56\xcb\x0b\x52\x0a\xe7\x8c\x27\x6e\x09\x39\x15\xcd\x43\xbb\xf7\xfe\xd6\x1d\x51\x29\xe9\x57\x88\x87\xb3\x63\x32\xda\xb2\xa3\x1f\x94\x30\x84\xb1\x64\x35\x3e\xd6\x65\x36\x6d\x49\x71\x66\xec\x8d\xa8\xad\xbb\x55\xa7\x62\xca\x39\x8f\x00\x53\x06\xec\x5d\x3e\xc8\x5f\xb8\xfa\x74\x07\x53\x83\x6c\x4c\x5f\x5c\x5d\x14\xda\xd7\x9d\x2f\x9d\x2e\x38\x8f\x94\x8d\xfa\xb6\x59\x0e\x45\xf3\x58\x36\xb2\x1a\x6a\x7b\xb5\xdf\x15\xc4\xae\x3e\xdf\x4b\xb5\x73\x1e\x07\xe0\x94\x80\xcb\x1a\x96\x30\xed\x27\xf2\x38\x25\x12\xb0\xc5\x3c\x50\x2b\xf6\x1f\x16\xda\x6a\x8b\x7b\x29\xdd\x4e\x07\xb0\x3b\x9e\x20\xe1\xc7\x62\x6b\xf6\x0f\x59\x91\xed\xc7\x09\x11\x4f\xa8\xed\x86\x99\xec\xd7\x30\x37\xe7\x32\x0c\xb5\xed\x4d\x60\x68\xdc\x71\xa0\x39\x97\x24\x31\x6e\x3f\xdc\x1f\xb2\x62\xf5\x6d\x55\x3f\x5b\x8f\xb8\x87\xb2\x82\xdd\x9b\x9c\xde\x1a\x29\x34\x75\xfc\xb9\xa5\x6c\x9a\x1c\x35\xa0\xb6\xd9\x7f\xbb\xef\x4a\x79\x1a\xbb\x29\xf9\x78\x3a\xbc\x14\x59\xf3\x41\x35\x80\xa7\x89\x46\x1d\x81\x7d\xfb\xce\x5c\xa0\xd8\x7c\xeb\x84\xa7\xda\x1a\xb4\xf9\x16\xf3\xc8\xe6\xc8\x8d\x51\x01\x09\x86\xd5\xe4\x85\xc5\xf7\x4d\x5b\x77\x5c\xd1\x00\x35\x99\xc7\x36\xaf\x03\x90\x36\xe7\x4a\x31\x2b\xf1\x9e\x15\x16\xf3\xe2\x0f\x68\x46\xf5\xc8\xc5\xd2\xe6\x2d\x9d\xe5\xe6\xf8\xc7\xe9\x38\xb2\xfc\x53\x12\xbb\x0d\xd3\x1f\x10\x81\xf4\x20\xcf\x2b\x59\x65\x6e\xb9\x9d\x44\x20\xb3\x37\x4c\x27\xc2\xdb\x26\x22\xeb\xca\xd7\x37\xb0\x0a\xe2\xc7\xa4\x71\xe4\xd6\x21\xcf\x15\xfe\x2c\x42\xe0\x5a\x05\xc8\xeb\xbb\x5e\x3c\x2e\x17\xdb\xf5\x68\x96\x03\xb5\xb5\x42\xe7\x09\x9b\xe7\xa5\xc2\xdd\xcc\x1d\x36\x01\x43\xbd\x85\xa3\x35\x82\xb8\xba\xe8\x0c\x71\x13\x12\x84\x10\xe1\x3b\x69\x9f\xc8\xb6\xcc\xf5\x5d\xb1\x7b\xb3\xa1\x6b\x37\x30\x49\x10\x51\xbe\xb0\x8e\x65\x07\x99\xe7\xb3\xe2\x02\x9c\x1b\x29\x7c\x94\xb8\xf0\x91\x50\x3d\x6f\x15\xc0\xb9\xd1\x84\x3b\x21\x99\xc6\xb1\xe8\xd0\xc2\xf5\xb7\x31\xfc\x71\x50\xfa\x8b\x02\x41\x22\xb7\xce\xed\xdf\xa4\xdb\x89\xc5\x38\x05\x89\x02\x29\xb0\xdc\xb6\xd7\xf0\x3e\x8a\xa1\xa3\x40\xd9\x4c\xd4\x39\xbc\x67\xf8\x04\x3c\xde\x64\xf6\x35\x88\xc2\xc4\x7e\xa4\x1e\x08\xdd\x4e\x60\xa1\x3c\x22\xa9\x65\xb7\xba\xe5\x73\xfe\x61\x46\x34\x0c\x69\xea\x2d\x34\xaa\xf2\x50\x62\x8e\xb8\xac\xca\xdf\x86\xcd\xf4\x88\x2a\x81\x81\xe7\xb7\xb2\xca\xf5\x12\x86\xac\x32\x1e\xb1\x00\xcc\x68\x9a\xe3\x54\x7b\xc8\x0a\x78\x96\xf3\x04\x75\x1e\x31\x0a\xa1\xf1\x31\x6f\x57\xcf\xf5\x40\x76\x1e\xf1\xc4\x9a\x60\xbd\xc9\xfa\x59\x9e\xab\x32\xff\x20\x24\x8e\xb8\x24\xe9\xb0\x50\x39\xd1\x24\xfd\x9b\x62\x8a\x3f\x89\xb6\x96\x84\xaa\xcc\x0a\x23\xd3\x2a\x1b\x73\x5c\x78\xc4\xc1\x44\x91\x7f\x8f\xb4\x3c\x3b\xa1\xf4\xa1\x1c\x16\x8f\xa2\xd0\x60\x4a\xda\xde\x07\x1b\x48\xde\xad\x9e\xb0\x24\xfb\xa1\x56\x3f\x8f\xda\xe7\x04\xb6\xa5\x96\x15\xdb\xec\xb5\xbb\xab\x51\x42\x70\xfb\xfc\xfe\xfd\xfb\xe8\x6e\xc7\x82\x21\x95\x6a\xf1\xb0\x5d\x8e\x0e\x08\xca\xa9\x45\x59\x7e\xc9\xf2\x7c\xa2\x14\xe3\xef\xab\x90\x96\x28\x8a\x40\x92\x36\x6a\x69\xe4\xeb\x38\x6f\x1b\xcf\x5b\xa1\x39\x2e\x0e\x48\x83\xf9\xbb\x66\xa9\x98\x3c\x9b\x44\x70\x84\x30\x59\x28\xdb\xcb\xf6\x6a\xbd\xbb\xc5\x5d\x66\x61\xa6\x58\x36\x1e\x25\x29\x8d\x92\xae\xc1\xfc\x52\x28\x0b\x33\xe9\x2a\xb2\xfd\x30\x1d\x0f\x9b\x4d\xe5\xc8\xfd\x96\x47\x92\x08\x01\x03\xb5\xf6\x7e\x11\xf9\x6d\x78\x23\x24\x0f\x11\x05\xee\x10\x1f\x35\x54\xcd\xde\x64\x85\x7e\x2c\x6f\xb3\xc2\x71\x27\x76\x7d\xd4\x17\xc9\x34\xb5\x91\x61\x76\x80\x6d\x9e\x29\x98\x7c\xab\x61\x78\x3a\xbf\x9d\xcc\xd9\x05\xb4\xa3\x94\x5d\xc9\x65\x95\xf9\x4f\xa6\x61\x88\xe1\xed\x06\xa4\x46\x1c\xa3\xff\x3b\x4d\x30\x33\xb8\x91\x59\x71\x80\xaa\x46\x9d\xfb\xf9\x39\x94\x4a\xe0\x0e\x5d\xd6\x66\x02\xb3\x45\x90\x28\x35\x96\xe3\xf9\x5c\x1e\x55\x59\xc1\xdf\xa2\x1d\x79\xa4\xb9\x95\x90\x5c\xbf\x63\xb1\x78\xa2\x08\x39\xb3\x12\x6a\x45\xb1\x62\xfa\x7c\xbb\xd8\xae\xf7\x8f\x2f\x0f\xcb\xae\x47\x17\x41\x68\xfd\x03\xf1\x7e\xd7\x47\x79\x70\x2d\xba\x45\xa1\x2d\xb6\xa1\x1b\x28\xac\x3b\x14\x06\x1e\x37\xa7\x5e\x3f\x75\x88\xf9\x99\x22\x58\x22\x13\x05\xbd\x94\xf3\xe3\xe2\x61\xbd\x7d\x5e\x78\x39\x13\x1e\x99\xd8\x76\x1a\x8c\x63\x6c\xa2\xc1\x65\x7d\x5d\xa1\xed\x8a\x1f\x93\x0a\x95\xf8\x72\x2f\xae\xfb\x6f\x9d\x4f\x25\x8f\x0c\x00\xc6\x43\x5f\xb2\xe2\xf5\x3b\x1e\x19\xbe\x7b\x71\x10\x58\x14\xe9\x5f\x27\xa8\xce\xe1\xbe\x9d\x05\x37\xb2\x1e\x25\x9b\x9f\x81\x0b\xe2\x20\x88\xad\xde\xcb\xd3\xe3\xf5\xdd\xcd\xfe\xe1\xee\x71\xff\x75\x71\xff\xb2\xee\xce\x2f\x38\x16\x1c\xb1\x92\xb6\xc8\xf3\xaf\x65\x03\x16\xa5\x79\x5d\x56\x2e\xbd\xea\xc6\x4a\xa5\xad\x08\xae\xdf\xcf\xfd\x91\x50\x58\xa9\x88\xbd\xc7\x98\x76\x31\xc1\x07\xab\x53\x1c\x2a\x49\xfd\xba\xd7\x86\xfb\xc5\x60\x37\x8f\x09\xb3\xda\xb0\x52\x6b\x6c\x2d\xbd\x8d\x05\x33\xc6\x67\x22\x20\x31\x17\x7f\x93\xb9\x39\x83\xac\x90\xc1\xe5\x8f\x19\x8a\x48\xc1\xfa\x94\xe2\x06\xfe\x0d\x3e\x40\xb9\xc4\x54\xc4\x78\x96\x02\x85\x7d\xdb\xcd\x72\x57\xba\x4a\x85\x1b\xc1\x12\x83\x59\xd5\xfd\xd3\xea\xcb\xfa\x6a\xbf\x7c\x5a\x6c\xae\x5c\x7d\x1b\x6b\xdd\xbe\x38\x19\xf3\x20\x54\x3d\x9a\x47\x35\x35\x32\x98\xfc\x41\x9e\x60\xc2\x93\x9e\xce\xdb\xb7\xec\x38\xda\x0c\x63\x9e\x50\x04\xb9\xfd\x74\xb0\x9d\xf9\x1f\xcc\x75\x1a\xc8\x51\xe2\xb9\x92\xea\x0d\xc6\xc9\x6d\xcc\x41\xe1\x83\xef\x14\x15\x0a\x7d\x5f\xfe\x84\x71\x8b\x24\x8e\x38\xc1\xd9\x5d\xcb\x77\x70\x5b\xcf\xf0\xa5\xb8\xbc\x4f\x51\x44\xac\x7c\x33\xc8\x83\xd5\xa9\x1c\xca\x4b\xf2\x38\x8e\xb8\x11\x1d\xc2\x72\x79\x3a\xcf\xd4\x45\xe2\x38\x32\x18\xfa\x76\x32\x24\x87\xf2\xb9\x2c\xce\xf3\xc5\xf6\x38\x8e\x29\xe9\x39\xf9\x2e\xd7\xcd\x2f\xfb\x1a\xd3\x66\x41\x2c\x02\x6b\xeb\xd7\xae\x0c\x6b\x6b\xf1\xb2\x05\x67\x4d\xb9\x7d\x2b\x4f\x6d\xf4\x67\xa7\x2b\x0a\x30\x8f\xa2\xa7\x58\x70\xdb\x1b\x73\x1a\xe0\x96\xf3\x7e\x03\x45\xb0\x2a\x53\xb8\xae\xb2\x41\x2f\xef\x53\xbe\x28\x8f\x45\x64\x6d\xda\x10\xff\xb4\x3f\xe6\xf2\xbc\x97\x85\xde\xa3\x59\xed\x4c\x79\x2d\x4e\x82\xce\xcc\xe8\x1a\xbc\x2a\x1f\xe8\xe5\x19\xb7\xca\xf1\xc2\x1f\x27\xc4\xe0\x52\xba\xef\xc3\x94\xbb\xd5\xe2\x19\xfd\x41\xc0\x40\x05\xc5\x25\xfa\x72\x4e\xec\x89\xc7\x09\xb3\x52\x88\xed\x1b\x60\x61\xba\xdd\xfb\x98\x44\x26\x8e\xc6\x10\x29\x99\xcf\x28\x4e\xf2\x38\x31\x04\xd7\xba\x45\xfb\x88\xe4\x68\x25\x4b\x8c\x42\x24\x24\x06\x84\x52\xfd\xc0\x72\xb1\x8f\xcf\x26\x1b\x7c\x2c\x19\x43\x83\x24\x67\x2e\xd1\x7e\xeb\xac\x0d\xf6\xe4\x56\x4b\xce\x3b\x5e\x53\x01\xf9\xb3\x03\x9c\x79\xa6\x97\xcf\xe3\x62\x19\x85\xa9\x93\x97\xc0\x9b\xfa\x2c\x2f\x69\xd5\x6e\x68\xaa\x69\x48\x3a\x11\xb9\xba\x91\xf9\xb7\x4a\x1e\x8f\x1f\x2e\x47\x29\xc4\x18\x25\x38\xbd\x58\x57\xd9\xf5\x37\x41\x29\xeb\x5f\xaf\x64\x61\xa9\x9d\xfe\x80\x4e\xd2\xc4\x3d\x74\x4c\x2a\x37\x83\x2e\xc6\xe4\xde\x68\xe0\x31\x1d\xa8\xc8\xaf\x4e\xd3\xf7\x4b\x1b\xad\x2c\x61\xc9\x38\x81\xe6\x01\x78\x2c\x06\x0e\xf8\xf9\xfd\x6b\xf6\x0e\xb8\xbe\x7e\x10\xc3\xc7\x26\xb6\x4c\xe7\xed\xe2\xe1\xf9\x7e\x94\x8f\xc5\x26\xa6\xd8\xf9\xb1\x41\x15\x8a\xd6\xd8\x6d\x1c\x1b\x9f\x33\x5d\x4f\x11\x44\x10\x39\x17\xd5\xbb\xba\x3e\x41\xe5\xb1\x3c\xe3\x29\x24\xc2\x50\x61\x56\x85\x55\xb0\xd5\xa8\x09\xfa\xfb\x64\x24\x09\x42\xb7\xb1\x2e\x4f\x88\xfa\x98\x43\x70\x88\x50\x0a\x44\x92\x3b\xc4\xe8\x69\x88\x0f\x11\xa1\x94\xdc\xa5\x0b\x48\xda\xcd\x9a\xb3\x55\xe0\x19\x5c\x79\xa8\x23\x62\x79\x7d\x05\xd4\x59\xfd\x5c\x95\x4d\xa9\xba\x34\x57\x90\x50\xa3\x97\xc3\xc0\xa0\x7c\xee\xdd\x10\x24\xd1\x96\xfc\xea\x5b\xc4\x43\xe1\x18\x37\x86\x06\x56\xcf\xd0\xfb\xb7\xdd\x97\x3f\xdf\xb2\xd7\xb7\xf1\x3b\x32\xcb\x91\xe3\x82\xf2\x18\x39\x3b\xa6\x6e\x86\x15\x17\x41\x93\xc0\x5d\x7e\x9b\x88\xb5\x41\x6f\x75\xe1\xd9\xc5\x05\x95\x16\x00\x7b\x40\xf0\x5b\x67\xeb\xbf\xbe\x7a\x19\x81\x42\x04\x8b\x24\xd6\x7d\xff\x5f\x79\x82\xe1\x8c\x10\xed\x9e\x4d\xac\xaf\x52\xfb\x10\x3a\x73\x51\x80\x7a\x57\xfa\x41\x9c\x19\x6c\x43\xa5\xbf\x8d\x45\x0b\xb8\x88\x88\x36\x1d\x8f\xb6\x7d\xdf\xd7\xdb\x66\x22\xea\xc4\x45\xc4\x18\xd2\xc6\x1f\xa0\xca\x9a\x99\x6a\x99\x88\x94\xf5\x95\x43\x3d\xd5\x1f\x70\x28\x0b\x17\xc3\x5c\xea\xa3\x72\x11\x19\x85\x1b\xf5\xe2\xd4\x94\xf8\x82\x7c\x66\x14\x3a\xfe\x68\x4c\xa4\x05\x64\xbc\x97\xf9\x3b\x3c\x94\x45\x3d\xb5\x1f\x09\xbb\xa1\xcc\x50\xa4\xf6\x64\xef\x19\x4a\x23\xfc\x6d\x7c\x2c\x04\xb1\xdc\x07\x9c\x05\x68\xaf\x95\xa3\x67\xfb\x6f\xe3\x51\xdc\x60\x5b\x4e\x76\xf1\xee\x5c\xc7\xe2\xf7\x61\xc5\x47\x88\xc8\x1a\x01\xec\x9e\xb6\xa3\x87\x27\x8c\x20\x69\x6f\x2c\xfb\x75\x60\xcc\xea\x87\x24\x44\x99\xb0\xd7\xa2\xfa\x47\x62\x09\x5c\x24\x0c\x3c\x7c\x69\x6d\x09\x7e\xe3\x27\x9a\xc4\x21\x06\xd0\xf8\xb6\xef\x90\x70\x58\x9a\xac\x19\xbe\x7e\x89\xb2\x65\xfa\xe5\xea\xab\xbf\x96\x94\x86\xda\x96\x20\xe0\x90\x9d\x0e\x0f\xa5\xee\x8e\xf0\x30\x26\x9d\x94\x64\xbb\x02\x3f\x43\x65\x15\x1c\xc7\x17\x96\x82\xc1\xfa\x27\x16\x94\xdc\x64\xef\xdb\xf8\x02\x02\xdb\xe1\x71\xb2\xf5\xff\x95\x17\x0a\xa6\x5c\x80\x16\xa8\xd8\x22\xb5\xbe\x5a\x1c\x8f\xf3\x55\x22\x61\xa8\xa5\xd2\x59\xf3\x42\x67\xcb\x83\x79\xc2\x2c\x60\x36\x62\xe3\x27\x87\x5d\xc4\x0b\x38\xc4\xe4\x2e\x1b\x99\x22\x2d\xe9\x61\xf1\x7d\xbf\x7a\x7a\xec\x39\xd4\xdb\xfb\xa7\x9d\x0f\x4c\x93\x20\x64\xc6\xeb\xa1\xbe\xb5\x2b\x54\x8f\x04\x4b\x42\x6d\x0d\x5e\xf5\x21\x1f\x4e\x8c\x84\x50\x86\xf0\xba\xe7\x27\x6f\x86\xc6\x13\xc2\x08\x16\xbe\xb1\x66\xe3\xe8\x09\xf6\x35\x53\xe7\x7e\x4c\x9a\xf0\x6e\x51\xfc\x86\xe2\x56\x1e\xd8\x2d\xbc\x70\x98\xef\xf1\x27\x84\x73\xd4\x19\xf1\x4b\xe3\x6d\x79\x80\xaf\x99\xdc\x40\x2e\x3f\xd4\xd8\x74\x1f\xa5\x8c\x6a\xd6\xa9\xec\x8e\x6f\xe9\xc5\xd0\x98\x3a\xdc\xec\x3e\xad\xe4\x74\xf1\x4d\xa8\x92\xb1\x83\x32\x79\x6c\x49\x27\x0b\x3a\x3e\x13\x4b\x54\x48\xdd\x97\xde\xca\x7c\xd2\xd3\x4f\xa2\x98\xe2\x8a\xfb\x50\x56\xff\x85\x6b\x7f\x4b\x62\x00\xf4\xac\xcd\x6a\x67\x93\x34\x39\x69\x6c\xb4\x65\xc3\xd6\x4a\x1e\x61\x0c\x81\xff\x7d\xd8\xd9\x4a\x92\x28\x48\xf4\xc0\xd1\xeb\xba\xac\x6e\xcb\x53\x0d\xcf\xb9\x54\xb0\x9c\xc2\x2f\x92\xc4\xd8\x12\xa1\x93\xf0\xd9\x23\x6e\xb8\xd0\xe5\x61\xf1\x7c\xf7\xb2\xb9\x1f\xad\x2a\x89\x24\x16\x93\x8a\x33\xd4\xc7\xc7\xfa\x33\xa4\x62\xff\x45\x29\x91\x8a\x75\xf4\x37\xa4\xae\x7f\xda\xce\x4e\x52\x25\x91\xa8\xb7\x5b\x3f\x0c\x35\xf9\x78\xa2\x02\xdb\x25\xd8\x96\xc5\x15\x1c\x77\x95\xcc\xba\x23\x51\x1c\xe9\xee\x3b\x5c\x35\x6d\x57\x7e\x7b\xcb\x1a\xc8\xa7\xbc\x68\x9e\xa8\xd8\xc2\x60\xda\xfd\xdd\xb5\xf7\x66\x83\x89\x04\x22\x8e\x03\xed\x73\xcf\x8f\xc9\xe4\x44\x26\xb0\x12\xe3\x36\x1f\xb0\x4a\xc2\xe3\x3b\x67\x44\x8c\x91\x62\x51\x16\x18\x4a\xe0\x92\xb1\x7d\x2b\xab\xe6\xd2\x1e\x75\x00\x47\xf8\x18\x86\x20\x03\x19\x3b\xdb\x46\x24\xe8\x3b\x91\x7c\x0b\x2a\xfa\xd7\x09\xba\xbe\xa9\x0c\x8c\x41\x28\xc5\x72\xf7\x65\xf8\xf6\x4a\x92\xb2\x20\x1e\x27\x5a\xd7\xd9\xeb\xdb\x74\xaf\x12\x33\xff\x1d\xfd\x7a\x49\x79\x88\xb5\xc1\x5d\x25\xdf\x21\x87\xaa\xe7\x4a\x72\x49\x63\x06\x43\xe8\xef\x43\x56\x7c\x84\xcf\x96\x14\x24\x4a\xe0\x3a\xf4\x57\x56\x37\x75\xfb\x50\xf4\xa2\xbd\xe7\xa3\x18\x5d\x32\x91\xf8\xd6\xe0\x06\xa5\x60\xef\xf4\x7c\x01\x4a\x32\xa0\xd2\x29\xe0\x74\x0c\x26\x7f\x16\x4e\x38\x42\xcf\x75\x56\xb7\x99\xd7\x38\x49\x96\x9c\x4a\xd1\xd3\xa7\x76\xd5\xa9\x6e\x00\x06\x5a\xcd\x5c\x72\x46\x70\xa3\xbf\xda\x41\xfd\xd6\xfd\x91\x4b\x86\x2e\xf7\x9b\xb8\xfb\x53\x1a\xca\x74\x00\xc3\xf6\x9a\x22\xfd\x71\x89\x66\x07\x5e\x55\xf1\xea\x47\xbe\xcd\xda\xc9\xf3\x91\x92\xeb\xcc\x02\x26\xa3\x28\xc6\xca\x2d\x72\x9f\xaf\x4a\x75\x3a\x40\xef\xfb\x31\x1d\x2b\xa9\xed\x41\x42\xdd\x20\xe1\x6c\x03\xb8\x3b\x3d\x96\x8d\xfb\xbf\xde\x9f\x92\xcb\x48\xa7\x4e\xdb\x2d\xc7\xb0\xf4\xa5\x9e\x28\xef\x72\x19\x53\x5b\x3e\xb3\x73\xc9\x01\x29\x27\xf7\x33\x66\x31\xbe\xb6\x56\x31\x62\x36\x12\xe9\xc7\xf2\x14\xd9\x90\xbb\xcd\xe2\x71\x7b\x8d\xe6\xb5\xf7\xf7\x4f\xdf\xbc\xf2\x10\x97\x22\x88\xac\xfa\x74\xe7\x0a\xfc\x11\x1e\x4f\x0a\x91\xaa\x2e\xc4\x05\xe4\x11\xb6\x79\xdf\x16\x39\xe2\xe3\xa1\xed\x2e\xc8\x1c\x1b\xab\x72\xb0\x80\xe9\x08\x08\x2c\xe0\x53\xea\xac\x2e\xe4\x01\xfc\x43\x9d\xa0\x27\x64\xc2\x12\x6c\x82\xf9\x2b\x5c\xe6\xa5\xda\x95\x2f\x75\xe7\xad\xd8\x0e\x91\x08\xb0\xf8\x1f\xa9\xc7\xcd\x0d\x29\x69\x92\xea\xde\xfd\x67\x3b\xac\x9d\xfa\x21\x22\x0e\x38\x22\x25\x5e\xb3\x62\x72\xab\xd3\x24\x16\xa4\x6b\x88\xed\xca\x11\x52\xf9\x43\xf0\x7d\x6f\x5b\xe6\x4e\xa3\x68\x8a\xed\x90\xa3\x0b\xf7\x3d\xa1\xcc\x1f\x06\x46\xdd\xf2\xb9\xd1\x9d\x1f\xdd\x6c\x87\x4b\x6a\x1a\x22\xdc\xf2\x20\x7f\xc0\x3d\x2a\x41\x5e\x0e\xc0\xf7\xf4\xdd\x16\x0f\x43\xbf\x2c\x76\xb7\x44\x33\x5b\xf9\xd8\xbb\xd6\xd2\xd8\x1a\x79\x32\xc1\x75\x12\xa3\x42\xcd\x3e\x2b\xb2\x66\x7b\x94\x0a\x7a\x07\x77\x2e\xb5\xb4\x1d\xd2\x57\x68\xee\x33\x05\x45\x0d\x1b\xc8\x0e\x3d\xa3\xd9\x0d\x03\x62\x0d\xb9\xd0\x92\xb0\xf7\x0a\xe9\xa3\x4f\x09\x3c\x54\xae\x07\x7b\x5d\x56\x0a\x9e\x8c\xa9\x3b\xcb\x1d\x3f\x46\x69\xa1\x3d\x72\xc8\x61\xb3\x2d\x8f\xeb\xd3\xed\x4f\x1a\x1a\x23\x77\xe3\xa2\xec\x2b\x4d\xc4\x91\x33\xa7\xb3\x5a\x0d\xc4\x47\x79\x1a\xd0\x84\x59\xab\xbd\xa6\xca\xe0\x1d\x6e\x64\x56\xf4\x07\x75\xe2\xf4\xda\x1b\x99\xdb\xb4\x6d\x4a\xda\x49\x43\x10\x58\xc0\xf3\x1a\x29\xf7\xe5\xeb\x64\x04\xa1\x02\x2b\x5f\x8b\xab\x87\xbb\xc7\xfd\xa6\x0f\xfc\x52\x2a\x05\xa6\x32\xdb\xdd\x62\xb3\xdb\xdf\xad\x9e\xf6\xbb\xbb\x87\xf5\x76\xb7\x78\x78\xee\x86\x80\xc4\xf2\x47\xd7\xb2\x5b\xff\x42\x14\xd6\x08\xe3\xf4\x79\xd3\x2c\xa5\x26\xc1\x77\xc6\x25\x23\x1b\xd9\x80\xc5\x6b\xba\xe3\x8c\x49\x70\xf8\xe9\x75\xf3\x36\x00\x3d\xa4\x2c\x8a\x2c\xd5\x10\x0a\xdb\xc6\xef\xa0\xc5\x7e\x80\x8e\x31\x1d\x49\x07\x6d\xf6\x94\x13\x46\x3d\x96\x6f\x29\x6b\x98\xc9\x15\x53\x9e\x24\x6e\xe3\x42\xd2\xa4\xc5\xc5\x2e\x9a\x66\x9a\xf4\xfd\x9b\xfd\x79\xf1\x7f\xfe\x14\xa0\xf0\x55\xbb\x52\xb2\x71\x8a\x0a\xfe\x0a\x22\x2e\xd3\xae\x79\xf6\xdb\xa0\x1d\x31\xfd\xc7\x8d\x8f\x63\x85\x7b\x23\x4a\xab\xef\x1f\x16\xdf\xfd\x89\x84\x48\x71\x55\x58\x02\xa4\xd9\x84\x2a\x93\x0a\x23\x51\x17\xd0\xa3\x3a\x9c\x2b\xe2\x90\x0f\x9e\x26\x21\xc5\x25\xc7\xc9\x4f\x3b\x14\xe5\x07\x05\xa2\x34\x61\x21\xaa\x81\xb8\x22\x73\x59\x8d\x88\xfa\x69\xd2\x5e\x2a\x6a\xbe\xfe\x40\x87\xce\x91\xc8\xd0\x78\x3b\x48\x93\xc4\xa0\x5e\xf3\x6d\x59\xb4\xcb\x43\x5d\xd8\x3b\x74\xb7\x7a\x4a\x47\xaa\x31\x3c\x4d\x52\xab\xad\xe7\x8c\x41\xbc\x67\xf2\x07\x68\xc5\x34\x51\x54\xf4\xbd\xc2\x67\x6f\xa4\xc2\xd3\xc4\x68\x04\xda\x2f\x4f\xe7\x85\x2a\xab\x7e\x92\x48\x15\x79\xb7\xe5\x7b\x59\x37\x57\x00\xba\x53\x1c\xe9\xdb\xfb\xa3\x2f\x91\x10\x73\x2c\x25\xc8\x2a\x43\x89\xd0\xc1\xcb\x9c\xa6\x32\xf4\x42\xbf\x0f\x68\xa1\x7a\xd1\x53\x4f\x53\x15\xa2\x3e\x68\x56\x3f\x02\xe8\xab\x4a\xfe\xbc\xb0\x99\x6a\x07\x91\xc0\xa9\x7c\x39\x7e\xf0\xcd\x49\x56\xb2\x68\x60\x0a\xf9\x48\x15\x8d\x70\x2d\xde\x37\x55\xf6\xfa\x0a\xd5\xaa\x2c\x73\x6c\x2b\x5e\x95\x3f\x8b\xe9\x58\x13\x24\x6e\xf3\xbc\xce\xd2\x72\x72\x54\x53\x82\x0d\xa8\xdc\xe2\x07\xe6\x80\x74\x29\x70\x81\xea\x36\x36\x00\xbb\x2e\x2b\x78\xef\x22\xa8\x14\xb4\xc1\xb0\xf8\x5d\xe6\x27\x78\x32\xf3\xfd\x97\xd4\x30\xcb\xa6\x71\x99\xf8\xe7\x49\x5f\x6a\x52\xdb\xda\x6c\x40\x1e\xee\x8a\xba\x91\x45\xb3\xed\x57\x75\x15\x48\x08\xdd\xe2\x6f\xc5\xec\xf1\x71\x7c\xc0\x93\x1c\x9f\x5a\x85\xcc\xc4\xce\x67\xac\x3c\x35\x8b\x42\x6f\x3d\x78\x76\x10\x34\x63\xf1\x6a\xba\x88\x8d\x9e\xa8\x22\x91\x40\xec\x42\x65\xf5\xfb\xea\x2b\x28\x4a\x6c\x73\x79\x21\xd0\x76\x88\xb2\xb6\xdc\x79\x59\x5b\x5a\xd9\x80\x17\xad\x68\x40\x13\x35\x64\x6e\xc9\xe3\x06\xa4\xea\x99\xbe\x8a\x32\x8d\x4b\xf9\xd2\x6a\x97\xac\x73\x28\xa4\x3f\xd6\x46\xcf\x8e\xb5\x82\x4d\x28\xd0\x5f\xe5\x29\xef\xee\x10\x93\xcc\xa9\xa7\xf7\x56\xe5\x7d\xbf\x55\x31\x69\x1d\xde\xa4\xd6\x2f\x85\x86\xea\x6a\xba\x49\x28\x06\x96\x76\x87\xe1\xc7\xbe\x1a\xbe\xf6\x8a\x8b\x44\xf6\xfa\xd9\xd9\xe1\x74\x58\x21\x88\xa6\xee\xbe\x9e\x83\x41\x21\xb8\xf6\xf9\x21\x9e\x75\x8c\x8a\x50\x51\x64\x8d\x8e\xad\x4f\xe6\xec\xd6\x31\xbe\xdb\x51\x02\x88\x36\xdb\x3e\xdd\xbf\x6c\x57\x9b\x51\x71\x4b\xc5\x9a\x41\xe8\x98\x94\x0f\x4e\x39\xe3\x4a\x6a\xed\x57\x02\x25\x42\xdb\x42\x44\x3b\x10\x2c\x3f\xf9\x03\x32\xc2\x9a\xf5\xc3\xe2\xf1\x76\xb1\xdb\x2d\x1e\x9f\x37\x4f\xdf\xff\x88\x77\xb7\xdb\x5d\x37\xc4\x04\xcc\x71\xbc\x76\x50\xc8\x89\x16\x3c\x57\x49\x7b\xaf\xdb\x2b\xfb\xd7\xcb\xdd\x66\xb3\xbe\xdf\x2f\x17\xdb\xf5\x7e\xb3\xfe\x97\x3f\x41\xf2\xff\x59\x7b\xb3\xe5\xc6\x71\x2d\x6b\xf8\x75\xea\xe2\x5c\x90\x20\x09\x80\x97\xb2\x2c\x3b\xd5\xe5\xa9\x2d\x65\x66\xd5\xe9\xe8\x50\x60\xd8\x90\xd8\xa6\x48\x1d\x92\x4a\xa7\xea\xe9\xff\xe0\x06\xc0\x49\x54\x56\x7d\x11\xff\x8d\x1d\x21\x82\x13\x88\x61\x0f\x6b\xaf\x05\x60\xc5\xf7\xdb\xbe\xc0\xc4\xf1\x68\xcb\x52\xa9\x89\x12\xc7\x76\x82\x07\x5e\x3c\x57\x4b\xa2\x44\x68\x3c\x5c\x16\x25\x6b\x10\x33\xf9\xe6\xc6\xa9\xff\x96\x22\x92\xc4\xc1\x16\x7e\xcf\x9a\xe6\x82\xb1\xdf\xf1\xc7\x94\xa1\x74\xdb\xa6\xa3\xc6\xbf\x59\x55\xe0\x4f\x20\x14\xa3\x6c\x5d\x3d\xf4\xe4\xa5\x25\x10\x4b\x85\x31\x64\x63\x9b\x20\x10\x95\x22\xb6\x24\xe1\xa9\xdc\x5b\xf8\x5b\x8d\x65\x84\xf3\xd3\x52\xc5\x29\x2e\x52\x4f\xa5\x45\x95\x74\x30\xdb\x5f\x2e\x14\x4a\xa5\x01\x26\x9d\xd0\x96\xd9\xec\x96\x03\x84\xb4\xd2\x61\x80\x6b\xe4\xdd\xb9\x2a\x50\xb8\x6d\xf2\x7c\x3a\x09\x51\xcf\xd7\xb1\x93\xcc\xf9\x0a\xa8\x83\x85\x6a\x99\x67\x5b\x21\xa7\x7f\x51\xaa\xa0\x80\x45\x68\x1b\x49\x51\xc3\xae\x19\x8e\x50\x93\x50\xd6\x17\x4d\xbd\x2f\xb6\xab\x5d\x98\x78\xf2\xa7\xa1\x3e\x5f\xa2\x0c\x63\xc6\x25\x90\xdf\xca\xf2\xe0\x87\x89\x0e\x62\x5b\xb5\x68\x77\xc5\x67\xd1\xa8\x43\xaf\x3f\x38\x0a\x65\x77\x27\xa4\x68\x3f\x2f\x5a\x33\xd1\x81\x61\x9a\x1a\x15\xd3\x4e\x79\xa6\x06\x0b\x95\x0e\x94\xad\x2f\xf4\x86\xc3\xa0\x50\x4f\x87\x71\x8c\x32\x5d\xcb\x43\xb6\xeb\xb4\x98\xbb\x83\x54\x20\x80\xf1\xbf\xc4\xcf\xbb\xf2\x67\xf7\x2b\x23\x44\xf7\x92\xa6\x68\xa8\xb5\xbe\xc0\x1b\x42\xe4\xe7\x92\x93\x9a\x18\xcd\x5c\x9a\x06\x39\x2c\xb1\x20\xbb\xc9\x64\x96\x67\xcd\x65\x60\xae\xb7\xbb\x15\xa2\xd7\x1f\xc5\x8f\xeb\xe0\xd3\x2f\xc7\x8a\x8e\xa4\xc6\x45\xcf\x11\xd7\xf8\xa7\x8d\x03\x4a\x9d\x35\xf0\x3b\xb2\x9b\x91\x84\xce\xe5\x6d\x75\x1c\x86\x98\x19\x29\x31\xbf\x8c\xdc\xaa\xcd\x44\x71\x2d\xd1\x31\x61\xa8\x39\xbe\x47\x2f\xba\xfa\x22\x6e\xc1\x6a\x74\x12\x09\x16\xf5\xe1\xfd\xe7\xc9\x1c\xd3\x09\x33\xe8\xc8\xde\xd9\xbc\x96\x7f\xdc\x44\x30\x65\x79\x93\x2a\x75\xf0\x21\xe9\xb1\x91\xa7\x69\x20\xb1\x44\xe2\x4d\x5c\xb6\xe5\xa4\x64\x47\xb3\xc0\x92\xf2\xed\xa1\x79\x3d\xff\xc8\x74\x59\x65\x62\x55\x34\xb0\xcd\x4e\x93\x9c\x91\x66\x51\xcc\xbd\xc7\x87\x7b\xa4\xc8\x2d\x7e\x75\xdc\xb1\x2c\x36\x91\xcb\xd3\xed\xba\xf1\xca\xd2\x08\x79\xb5\x9f\xca\xfd\x4b\xd9\x64\xe6\xf2\x6a\xbc\x8d\x98\x95\x85\x17\x83\x9e\x65\x95\xd1\x0c\x62\x5c\x39\x0e\x17\x5d\x95\xa3\xbd\xbd\x6b\xc0\xd1\x43\x50\xbd\x4f\xb7\x36\x63\x06\xc1\xc9\xc7\x4f\x03\x5b\x61\x2b\xcf\x97\xa5\xa8\x34\xaa\x97\x4f\xcc\x4a\xdf\x32\xd4\xb2\xa7\xbc\x74\xe1\x9b\xbb\x8b\x95\x61\x9c\xbc\x79\x9a\x24\x48\x4e\x51\x81\xc8\x31\x5a\x6e\x73\x12\x9e\x7b\xed\xa1\xac\xec\x0f\x3e\xdf\x3e\x8c\xf2\xea\x94\x32\x84\xc3\xbe\xaf\x9e\x56\x8b\x8d\x77\xc2\x74\x2a\x44\x68\xa9\xfb\xf6\x68\x5b\x54\xe5\xf1\x09\xf6\x42\x5d\xde\xe1\x74\x6e\x2c\x63\xcd\x60\x6d\xd1\xc2\x09\x62\x34\xe5\xc7\x09\x2a\xe8\x38\xa7\xb4\x54\x21\xf2\x19\x5b\x5f\xfd\x4b\xd9\xcf\x69\x45\x63\x16\x76\xf6\x13\xd4\xcb\x76\x92\x8d\xdf\x4c\x31\xab\x64\xd4\xfa\x79\x0f\x13\x65\x93\x44\x2b\xc9\x02\x8f\xcc\x46\xda\xaf\xac\x35\x41\x7b\x8f\x19\x1b\x88\x6e\xb5\x72\x78\x58\x7c\xec\xaf\xef\xeb\xf9\x7e\xd7\x11\xc3\x01\xf3\x02\xcd\x77\xf8\x39\x48\x68\x6b\xcd\x89\x97\xb3\x7d\xab\xe0\x39\x2b\xe6\xc9\x92\xb4\x96\x2a\x06\x5f\xef\xe1\xb4\x76\xdf\x00\x09\x19\x7f\xb1\x6c\x6b\x6d\x44\xe8\xf9\x72\x0a\xc8\x6d\x49\xda\x34\x20\x3e\xbe\x13\x08\x6d\x5c\xbd\xf6\x10\xb7\xad\x4d\x68\xc0\x33\x1e\x38\x01\x99\x7b\xd1\x40\x78\x01\xd1\x2d\xb6\x26\x35\x08\x54\x96\x42\x7d\x7c\x5b\x6f\xb6\x8b\xd6\xb6\x1b\xc6\x24\x21\x08\x19\xc6\x12\x11\x50\xe2\x33\x15\xdd\x41\x16\x23\x99\x49\xe5\x6c\x56\xec\x7f\x4f\x55\x00\xc4\xc4\xe8\xde\x9d\xec\x1a\x17\xee\xf2\xb3\xfa\xb8\xc8\xf3\x65\x5b\x09\xf5\xd1\xdf\x82\x98\x8e\x14\xe7\x19\xc7\x59\xeb\xed\x0e\x33\xfb\xae\x5d\x44\x29\x2e\xf0\xe7\x42\xe6\x42\x7d\x5c\x07\xe0\x21\x62\x04\xe9\x4d\x30\xac\x84\x9d\x5e\xb5\x2e\x9b\xd3\x40\xf2\x8d\x52\x82\x55\xc6\xab\xed\x97\xdd\xb7\xed\xa2\xff\xd9\x4a\x22\xec\xa1\xf9\x02\x55\x79\x6d\xb9\x40\x04\x31\x66\x7f\x7a\x9e\xa7\xbf\xb1\xef\x21\x26\x0c\x97\xcd\x4e\x6d\xf9\x2a\x0b\x37\x7e\xfe\x38\xa1\xaa\x73\x71\x7b\x31\x64\xff\x88\x49\x62\xe9\x19\x16\x4b\xcc\xb7\xfd\xbe\xf2\x84\x64\x40\x0d\x65\x96\xbd\x42\xc3\x11\x71\x7f\x3d\xa1\xcb\xab\x19\x52\x41\xf8\x33\x38\xa3\x5e\x50\x17\x33\x96\xbd\xb4\xf3\xec\x86\x05\x9c\x43\xe4\xe2\x20\x83\xd0\xd4\x5d\x59\x7e\x4c\x46\x3e\x70\x19\x8a\x68\x90\x8d\x73\x71\xb7\x21\xeb\x93\x6f\x69\x08\xfa\xaa\xda\x3a\xfe\xd6\x1c\x1c\xaf\xae\xc0\x0d\x43\x07\x1c\x77\xe2\xb7\x0a\xd6\xcb\xd7\xc9\xfd\x52\x9a\x06\xdc\xc3\xca\x32\x03\x96\x41\xfa\x76\x2d\x24\xa4\x2a\x45\xd4\xb6\xae\xca\xd3\x0b\xa8\x46\x54\x73\xc5\xe0\xbe\x31\x44\xb8\x87\x3e\xe9\xee\x33\x88\xd0\xd2\xc5\xfa\xc2\x0c\xa7\x82\x81\x1b\xe3\xe4\xbb\x4e\xbe\xaf\xe2\x29\x5a\x81\x42\xeb\xbb\x52\x5f\xde\x44\xe5\x8a\x44\xba\xec\x24\xe8\x84\x06\x71\x37\xa5\x44\xfe\x94\x15\x1f\xef\x56\xe3\x7d\x38\x14\x34\x37\xd8\x75\xcd\xeb\x66\xd2\x1d\x90\x58\x96\x87\x1a\x10\xac\x3c\x3d\xca\x22\x04\xbc\xac\x55\xf9\x26\xce\x75\xe7\xdf\x01\xf0\x44\x3a\xbd\x96\x5a\x90\x60\xc7\x6f\x8c\x03\x10\x1a\x87\xe8\x41\xd4\xdf\xa7\x65\x50\x26\x10\x96\x7d\xd3\xd2\x95\x66\xc5\x7e\x94\x68\x33\x21\x91\xc4\xeb\x31\x9d\xba\x5b\x1b\x12\x70\xe9\x41\xcc\x0f\x22\xcb\x2d\x58\xc9\x1a\x69\x95\xad\x43\x5a\x17\x5f\xbb\xe2\xaf\x76\xd0\x48\xd5\x15\x0e\xa0\xbd\x3c\x63\x09\x18\x02\x31\x86\x39\xd4\x41\x54\x59\x73\x69\x0d\xbe\xee\x96\x51\x04\xe8\x92\x62\x9d\x80\xad\x64\xb9\x41\xe5\x9f\x98\x38\xb0\xd2\xaa\x48\xf5\xa7\xcb\xfd\x1b\x2a\x1e\x0d\x38\xff\x4c\x1c\x9a\x58\x38\xb1\x38\xbf\x44\x7e\xad\xa7\x1b\xb4\x89\x13\x8e\xd6\xab\x17\xec\x41\x04\xc5\x20\x4a\x3e\xbd\x2f\x4d\xa8\x83\x5e\x7d\x7b\xda\xa2\xad\xbc\xc9\x26\xf5\x8d\x86\xd2\x18\xc7\xf2\x63\x99\x6b\xac\x2b\xd4\x33\x55\x8c\x86\x29\x4b\x02\x61\x41\x94\x68\xaa\xff\x03\x0d\xd6\xd9\x01\x60\x98\xe6\x94\x7a\x67\xdc\x13\x42\x12\x5f\x01\xed\x1b\x81\x85\x7e\xd4\xa2\x80\x75\xf7\x2b\x27\x29\x66\x61\xda\xb5\x46\x29\x38\x4d\x1f\x82\xff\xda\x68\x36\x3c\xb5\x25\x44\x75\xcf\xb1\x31\x79\xd1\x34\xb4\x05\xda\x7b\x97\xff\x18\x85\xce\x4d\x4a\x01\x5d\xd8\x1e\x8f\xdd\x5f\x3b\x15\xc0\x1d\xec\x70\x09\x55\x93\x99\xd6\x2b\x81\x4d\xb6\x2f\x86\xba\x7f\x9d\xed\x6f\x52\xa0\xda\x7f\xf3\x4c\xe4\x88\x32\x7b\xce\x8a\x76\xd0\xdf\xf7\x41\x62\x23\x42\x69\x75\x83\x1c\x0f\xd8\x64\xdb\x18\x3f\x83\xe2\x60\x05\xa2\xcb\x52\xcb\x4b\x77\x0d\xa5\x28\x82\x61\x5e\xbf\xbf\xec\xe4\xb9\x2a\x7e\x61\x3f\x18\x1d\x5b\x19\x66\x04\xa8\x4b\x51\x67\xea\x6b\x91\x35\x5b\xe8\xc2\x21\x46\x33\x86\x48\x9e\xcd\xb6\x75\xfd\x1e\xd7\xcb\xdd\xdb\xe2\x7d\xfb\xb2\x7a\xdf\x20\x5d\x14\x26\xc6\x96\x8b\x76\x83\xe9\xce\x10\x29\xeb\x74\x6f\xbb\xbd\x04\xd6\xc5\xa4\xaa\xc1\x40\x40\x75\xc7\xef\xf9\xc7\x51\xd4\x8f\x99\x99\x7e\x21\x20\xca\xdb\x4f\xf7\x85\x40\x3f\xd7\xa5\x62\x87\xbd\x0b\x04\x22\x17\x54\x73\x78\xa7\x57\xf9\x7f\xeb\x1b\xf6\xb4\x31\x01\xc5\xda\xa5\x76\x8f\x20\x56\xfb\xe3\x79\x46\xbb\x06\x5b\xd3\x20\x48\x14\xb1\xf4\xd8\x58\xbf\x3f\x8a\xe9\x0e\xbd\x22\x1a\x84\xb1\x20\xda\x45\xf8\x01\x29\xbd\x87\xef\x42\x83\x90\x46\xc2\xf4\xb1\xdb\x47\xd1\x59\x5f\x34\x08\x99\xf4\x19\x37\x1b\xa7\xfe\x0e\xd9\xe4\xf4\x48\xd8\xc0\xba\xcf\xf8\x3d\x64\x39\x2c\xf3\xb2\x9e\x29\x1e\xbf\xde\xc6\x68\x10\xc9\x00\x9f\xee\x50\xa2\x9e\xf6\x71\x24\x48\x4c\x83\x38\x8c\x98\x15\x11\xf8\xb1\x05\x71\x1c\x6d\xab\x34\x88\x1d\xa3\x8a\x9d\x87\xb5\xff\x92\x0f\x42\x65\x22\x9f\x3c\x67\x2c\xa9\xf6\xd0\xe6\x47\xa4\xbc\x93\x9b\xa6\xac\xd0\x1b\x78\x38\xe7\x79\xfb\x83\xc7\xef\xd2\x20\x21\xda\x83\xb2\x5d\xdc\xc4\x6e\x8c\xfe\xe3\xd2\x80\x32\x82\x80\xaa\x4f\xc8\x9c\x18\x48\xbd\x68\x6e\x92\x42\xd2\x80\x1a\xc6\x9d\x81\xff\x8c\x84\x90\xdd\x5b\xb0\x98\xa0\x6c\xf9\x72\xb3\xdc\x4c\x1e\x3a\xe5\x11\x8a\x64\x9a\x73\xf3\xb3\xb5\xd2\x2b\x7f\x4e\xaa\x12\x31\x64\xd4\x6c\xdf\xc2\xe2\x98\x27\x05\xc0\x93\xa7\x10\xc4\x9a\x8d\x4f\xaf\xcb\xdf\x77\xef\xab\xa7\xc5\x66\x85\x19\x29\x7f\x5d\x11\x27\x98\x16\x6e\x4d\xcf\x4d\xeb\x59\xc2\xfe\x32\x79\x26\xc1\x43\xac\x5c\x70\x35\x28\x2f\x90\xed\x0f\xb2\x3c\x57\x33\x48\xd2\xb6\xb1\x22\x62\x00\x16\x85\xee\x46\x8a\x20\x3b\xa4\xdf\x2e\xef\x44\xcf\xbe\xe3\x9a\x48\x6e\xb0\xde\x09\x33\x4f\x0b\x5f\x46\x4e\x03\x29\x83\xc0\x46\x62\x71\x7b\x1a\x8f\x76\x15\x1a\x61\xe9\x60\x84\xfe\x63\x84\x9d\x1a\x6e\x06\xa3\x67\x54\x9a\x63\xb0\xb3\x19\x12\x11\xf9\x9b\x29\x23\xd0\x72\x73\x8a\x0f\xa0\xd1\x84\x1b\x47\x00\x68\xa0\x8d\x95\x46\xdd\x65\xf5\x52\x54\xe5\xb9\x9e\xe0\x9f\x68\x00\x44\x19\x47\xdd\xf1\xd5\xf2\x96\x2c\x07\x94\xbd\xb3\x5b\x05\x0d\x40\x48\x74\x5c\xff\x5d\xea\x4c\xa8\xbe\x28\x82\x06\x00\x9d\x7d\xe4\xe0\x9a\x13\x0c\x2e\x0d\x0c\x8b\x30\xb1\x55\x1f\xb2\xd3\x2f\x16\x6c\x1a\x06\x44\x46\xaa\x4b\x8d\x79\xfa\xa8\xef\xab\xd5\xef\x8e\x16\x83\x86\x41\x62\x90\x40\xa0\x11\x55\x66\x26\x84\x2c\x34\x0c\x4d\x82\x88\xfa\x93\xdf\x98\xbd\x6f\x45\x43\x12\x86\xc9\x80\x9e\xa0\x70\x64\x8d\x93\x0b\x90\x58\x23\x25\xca\x8f\xb2\xb9\x86\xde\x5f\x35\xc5\x04\x99\xcd\x4d\xed\x10\x80\x92\x43\x5d\x0f\x15\x54\xc6\xaf\x17\xa5\x01\x22\xd7\xef\x96\x7f\xf8\xa7\x8a\x99\xc0\x42\xbf\xa2\x74\x5b\xe4\x94\xb1\xa7\x3f\x3b\x06\x86\x15\x11\x52\xd4\xe8\x27\x5f\x6d\xc8\x34\x44\xda\x3d\x8b\xf4\xd1\x70\x97\xf9\xcc\x33\x0d\x69\x1c\x70\xeb\x12\xc2\x84\xa4\xac\xdf\x25\x68\x48\x13\x81\x0b\x89\x3c\x5f\x53\x0d\xfc\xca\x88\xa1\x21\x65\x82\x7b\x19\x56\x0b\x2e\xd9\xe0\x1a\xef\xef\xcf\x0c\x47\x00\x56\x7d\x3e\x5a\x9f\x23\xea\x8f\xd8\x75\xfd\xad\x82\x71\xed\xf6\xdf\xfd\x9f\x7e\x9c\x7f\x62\x6d\xd1\x30\x0d\x0c\x82\x86\xb2\xda\x22\x78\x96\xed\xf2\xe2\x61\x3c\xbe\x0d\x21\x41\xd0\x15\xce\x39\x23\x64\x32\x4e\xd2\x28\x74\x1a\xf1\xde\x41\x1c\x9a\xe6\x34\x4c\xa9\xe2\xdd\xb6\x5c\x57\xd5\x38\x4e\xe8\x1b\x31\xa7\x7f\xe7\xb2\x44\xba\x75\xc6\xfc\x31\x4d\x30\xf2\xff\xb4\x7a\x5c\x3c\xed\x56\x7f\xbc\xad\x5e\x36\xab\xcd\x8e\x8c\xea\x95\x68\x28\xb8\x45\x2b\x62\x58\xa4\x76\x2c\x88\xf3\x75\x5b\x34\x14\x60\xd0\x60\xbe\x3b\x5f\x2c\xb3\x8a\xbf\x8a\x4c\x52\x61\xeb\x65\x84\x6c\xe7\x45\xbb\x87\xb7\xeb\x78\xbb\xd4\x4c\xc6\xb0\x14\x16\x82\x60\xd1\x3a\x08\xe0\x75\x51\xe7\xfe\x6b\x4b\x17\x20\x6a\x2a\x91\x15\xd1\x8d\x87\x51\xa1\x32\xa9\x57\x1d\x7c\xfc\xbe\xfd\xff\x41\x73\x90\x86\x2a\xa2\xd8\xed\x15\xb4\x2e\x13\xf1\x0f\xa4\x62\x5b\x72\xba\xf9\xb2\x78\x5f\xed\xb6\xab\xc5\x73\x77\x84\x29\x03\x3d\x41\x5c\x0f\xad\x1d\x5f\x57\xa7\xe0\x15\xb2\xda\x95\xfe\xad\xcc\x33\x35\xd9\x8d\x42\xad\x3c\xbe\x7d\x2f\x9a\x7e\x34\x41\xa0\xd1\xac\xb8\x5f\x3d\x2c\xbe\x3e\x6d\x77\xcf\xeb\x97\xf5\xcb\xe3\xee\x6e\xbd\xed\x5a\xd0\xd8\x73\x09\xbd\xad\x2d\x8b\x53\x14\x0e\x53\xd4\x34\x34\x40\x0d\x78\x70\x88\x9d\xf3\xf5\x9d\x2b\x65\x1d\xeb\x74\x51\x12\x30\x91\xc8\x81\xbc\x2a\x46\x5e\xe6\x92\x9e\xbe\xbd\xb0\x34\x34\x6f\x67\x99\x67\xf5\xa1\xfb\x8c\x24\x30\x31\x26\x19\x4c\x76\xaa\x2d\x77\x85\x8d\x55\x52\x2e\x63\xdf\x86\x30\x13\xd9\x8c\x46\x55\x20\xf8\x6c\x1c\xf4\x70\xad\xa2\xc4\x92\x0e\xb5\xdd\xf7\x75\x7d\xbf\x19\xef\x94\x24\x66\x8c\xb9\x50\xd1\x7d\x56\x21\x4a\xe9\xe2\x6f\x90\x04\x14\x2b\xb9\xf3\xaa\x9e\x5c\x34\x89\x52\xdc\x92\x7a\xe2\xed\xf9\x91\x46\x92\x38\x05\x97\x21\xdc\x1e\x2a\xa8\x0f\x65\xae\x2d\x9f\x84\x6b\x40\xa9\xc2\x22\xd8\xbc\xdc\xbf\x43\x5d\x9e\xab\x0e\xb0\x40\x09\x0b\xa3\xd8\x09\xf3\x56\x9e\xb4\x8f\xfb\x63\x1c\x70\x11\xe8\xe8\x45\x7d\x02\xdc\x1f\x57\x56\xc3\x65\x5f\x89\xa2\xe3\x4e\x7b\xcf\xf6\x87\xb1\x11\x4f\x09\x03\x0b\x0c\xf2\xf5\x7e\xf8\xdd\x76\x5d\x14\x85\xf5\x61\x14\xf6\xbf\x33\x70\xcf\xa1\xcf\xdb\x7b\xbe\xf3\x72\x4c\x94\xf0\x44\x26\x16\x7b\x55\x47\x34\x68\x0e\xf7\xa2\xeb\x6c\x9e\x1a\x0f\xa2\xb6\x21\x71\x67\xe5\x92\xc9\xf3\x72\x60\x98\xaf\x7a\x7b\x5f\x39\x24\xd1\xd3\x93\xbf\x46\xaa\x14\x26\x90\xbd\x61\x72\x6f\xc5\x87\xbd\x3d\x4b\x44\x6c\xa2\xa4\xa7\x0c\xb7\xf6\xf9\x55\x30\x8b\x12\x41\xa9\x70\x01\x35\xbf\x3e\xcf\xce\x79\x22\x54\x88\x80\x6a\x8c\xa8\xfa\xda\xfa\xd7\xa2\xfb\x0a\x2a\xe2\x88\x08\x11\xf5\xc7\x7f\x9f\xa1\x1e\x01\x36\x67\x90\xd1\x6e\x4b\x99\x60\x32\x29\x51\x4c\x48\x5f\x9c\x60\x63\x81\x0f\x65\xf5\x05\xf2\xd3\x15\xc1\x36\x25\x0a\x34\x62\xe1\x4e\x95\xb2\x10\x28\xff\x2c\x9a\x45\x18\xb0\xfa\x91\xed\xa1\x50\x5e\x86\x8a\x12\x88\x38\xae\x1d\xdb\xd7\xaf\xef\x2f\x0b\xe4\x1a\xb6\xa4\xc6\x5d\x03\x0d\x18\xab\x5d\x6d\xbf\x2c\x5f\x5f\x3a\x56\x9b\x41\xb2\x80\x12\xa3\x55\xe0\xca\x35\xda\x7b\xbe\xe5\xe2\x0a\x99\xea\x5b\x1a\x85\xc1\xca\x6f\xa2\xc8\x9a\x8b\x0f\x3a\xcc\x11\xf6\xd0\x28\x48\xec\xd6\xde\xbe\x26\xe2\x1c\x06\x11\xc3\xf9\x15\x25\x0a\x9c\x4c\x77\xeb\xcb\x63\xf0\xa9\x1c\x87\x6e\xda\x16\x80\xe4\xd0\xcb\xad\x7f\xc3\x28\x10\xda\x53\xd2\xb6\x2b\xd6\xfd\xe4\x8c\x30\x0d\xb1\xac\xd8\x42\x9b\x36\xe7\xd3\xa9\xac\x9a\xb9\xe8\x0c\x8d\x48\x64\xf9\xe7\x2c\xd8\x15\xa3\xb1\x93\xb5\x23\x22\x71\x82\x15\x7b\xba\x2a\x4f\x03\x62\x5c\x1a\x91\x24\x40\x0b\xfc\x31\xfb\xcb\x65\x76\xba\x23\x34\xd1\xd0\x15\xc7\x2e\xc5\x69\x7a\x49\x19\x22\x41\xf9\xf7\xf5\x12\xbb\xe9\x57\x48\x98\x5b\xbb\x99\xbb\x54\xc4\x03\xe2\x0a\xd3\x2d\x59\xb3\xc8\xf3\x31\x6c\x87\x46\x71\x14\xa0\xdf\x7f\x7c\xf8\xfa\x72\xdf\x6e\x28\x68\x2a\x4f\x20\x7d\x34\x8a\xb5\x0d\xda\x35\x59\x6b\x9b\x6e\xa6\x0a\x21\x34\x8a\x41\x29\x8b\x6d\x96\x59\xb3\xfa\xcf\x59\xe4\xf9\xe5\x3a\x7c\xdb\x35\xd6\x91\xaf\x38\x7e\x81\xcf\x45\xa1\x0e\xe5\xc4\xed\x89\x92\xd8\xca\xc9\xde\x9d\x1d\x77\xdb\x2d\x33\x7a\x72\xed\xa4\x35\x1c\xec\xf7\x3f\xd7\x30\xa2\x6f\xa0\x51\x02\x21\x76\xfe\xa0\x4c\xcf\xc9\x92\x4d\x5e\x27\x81\x38\x48\xbb\x6f\xff\xef\xf2\x28\x33\x18\x53\xaf\x78\x4c\xde\x50\x11\xdc\x9d\xcc\xa2\x40\x5a\x81\x20\x57\x8f\xe0\x96\x3f\x98\x61\x37\x1d\xd8\xcd\x11\x4b\x14\x32\x2d\xd4\xa7\x1c\xd3\xc6\xd3\x60\xda\xe4\x4d\x19\x0b\x34\x19\x04\xd5\xea\x67\x51\x9c\x6f\xb0\xfb\xd1\x88\x89\x10\x0d\xc1\xc7\x32\x6f\xf7\xd7\x3e\xa5\x73\xab\xbd\x16\xe8\xa8\x3f\xaf\x5f\x56\xef\x3b\x44\x7b\xb6\xc3\x03\x5d\x2a\xdf\x9d\x3c\x31\xa4\x8f\x5f\xbe\x9a\x29\xd9\xd7\xf8\x79\x79\x4a\x90\x5f\x7c\xd5\x1c\x30\xed\xb2\x01\x51\xa9\xc3\x43\x05\x60\x53\x42\xf5\xe4\x1b\x78\x94\x36\x52\xf7\x56\x15\x16\x40\xb7\x3e\xe1\x74\x12\xa6\xa9\x54\xd4\xa7\x40\xce\x85\x76\xc8\xdb\xaa\xdb\x7c\x23\xd1\x5e\xac\x53\xd9\xdf\x1f\x9a\xa7\xb2\x6e\x5a\x03\xb5\x2f\x4c\xe7\x5d\x53\x8a\x61\x38\x4f\xb5\x61\x13\xa3\x59\x73\x79\x2b\xcb\xfc\x57\x4e\x67\x24\x98\x95\x3f\x17\x39\x92\x18\xf7\x37\x57\x09\xef\x87\xd2\xb8\xe8\xeb\xd6\xbc\x1e\x58\xf7\x91\xd0\x1a\x5d\x8d\xdf\xdf\xa6\xc1\x94\x48\x86\x31\x26\x33\x57\xc7\x53\x56\x41\xbf\x5c\xdc\x5a\x1e\x7e\xe9\xd3\x44\x4a\x6a\xb4\x6f\x76\xa8\x19\x5d\xd7\xed\xca\xf8\x54\xee\x33\x35\x07\xc7\xa0\x91\x32\x29\xa6\x8e\x0d\x80\x0e\x83\x60\xf2\x51\x34\x49\x82\x60\xc0\x0d\xf5\x22\x2d\x79\xf4\xa4\x19\x10\x6b\xda\x2c\x0f\x50\x65\xf5\x61\xb4\x52\x9a\x28\x62\x6e\xa5\x5c\xe4\x79\xf9\xd9\xd1\x57\x0e\xa6\x8c\x89\x03\xcc\xcb\xe2\x88\xf6\xd9\x8d\x1b\x1f\xc8\x68\x22\xac\xcc\xf7\x76\xf1\xd4\x45\x05\x46\x7e\x50\x64\x8c\x02\x17\x85\x38\x9f\xfe\xb1\xfc\x15\x8d\x83\x28\x40\xaa\xc6\x5d\x2e\xea\x66\x53\x88\x53\x7d\x28\x9b\xf5\x64\x91\x8c\x83\xc4\x4a\x6e\xca\xf3\x65\x7d\x3c\x59\xb9\x84\xf1\x1c\x9c\xf3\x46\x6f\x18\x60\x71\xc8\x79\x30\x2c\xe9\xea\xd9\x61\x8a\x0f\x4b\x10\x39\xbe\x7b\x28\x38\xce\x93\x0d\x34\x0f\xad\xa7\x78\x4d\x15\x4f\xe3\x10\xa8\x0b\xea\x54\x53\xeb\xc6\xb5\x20\x21\x47\x9b\xe4\xf5\x7b\xbb\x2e\x60\xd4\xed\xae\xfd\xeb\xbb\x30\x26\xc4\x06\x72\xda\x4f\x22\xb4\xee\x7e\x4e\x39\xce\x66\x9b\x30\xe9\x14\x79\xfc\x51\xad\x10\x05\xaf\x44\xae\x3c\xaf\xc8\xf8\xe9\xa3\x20\xc0\x6c\x14\xc6\xc1\x77\xcf\x8b\xf7\xdf\x57\xed\x82\xe4\x2f\x10\x25\xb6\xc0\x3b\x2f\xf7\x9b\x4f\x80\xd3\x2f\x33\xc0\x34\x8e\x49\x84\x88\x3c\x79\xbe\x74\xd6\x69\x17\xad\xbb\xe5\x23\x8e\x1f\x28\x4e\x53\xe4\x9c\x79\x14\x47\x40\x04\xc7\x7c\x69\x12\x8d\x63\x1d\xd1\xd0\x89\xe7\xf8\x92\x99\xb9\x34\xa8\xdf\x51\x46\xdd\x1d\x83\xc2\xd7\xbe\x13\x79\x5e\x36\xaf\x37\x33\xa2\x34\x4e\xa8\xfd\x30\x68\xbf\x6e\x40\x95\x85\x1e\x28\xad\xd3\x98\x52\x1d\x93\xc1\x74\x02\x7d\xb5\xbf\x8c\x5f\x90\xab\x94\x58\x2d\xab\xe6\x5c\x15\xef\x70\x14\x59\x91\x15\x7b\xcc\xcd\xf9\x8b\x72\x93\x22\xbf\xa6\xc7\xf7\x79\xc8\xd3\x75\x16\xeb\xd6\x1a\xf4\x0f\x8a\x0a\x69\x9c\x86\x5e\x33\xda\x13\xb7\x0d\xb7\xf5\x38\x4d\x94\x0d\xe6\xe1\xfa\xfc\x50\x56\xe1\xaa\x39\xbc\xc5\xdd\x61\x6a\x09\xc3\x91\x65\x6f\x59\x1e\x8f\xe7\xd6\x5c\x1d\x96\xb4\xd3\x58\xc8\x10\xcd\x06\x1b\x7e\xf9\x46\x6e\xf4\x89\x0c\x38\xa6\x59\x37\xdb\xc5\x76\xb3\xdb\xac\xff\xed\xf7\xc2\x58\xc5\xb6\x27\x3c\x3e\x6e\xd7\x4c\x28\x6d\x68\xac\xa8\xc6\xa4\xd3\x8f\xb2\x81\x6d\xe9\x88\x89\xc6\xd7\x57\x9c\xca\xae\x7a\xe3\x3e\xab\x9b\x76\x67\x7c\x3f\x77\xf3\x44\x71\x40\x19\x0e\x97\x9a\xbf\x2b\x9b\xc3\x64\x06\xab\xd4\x62\x2d\x1a\x2c\x64\xb3\x15\x10\x7f\xc7\x02\xdf\x9d\xca\x55\xe8\x4d\xe7\x66\x51\x55\xe2\x72\x7f\x29\xc4\x31\x53\xdd\xed\x53\x8d\x05\x65\x75\x0e\x70\x9a\x84\x8c\x63\xed\x54\xb0\xdb\x7d\xb8\xdb\xd4\xdf\x44\x25\x8e\x75\xd7\x24\x4d\x91\x86\xeb\x8f\xb3\xcc\x46\xf3\x1f\x92\x00\x2c\x77\x5f\xa6\xc0\xcb\x1a\xcf\x0f\x95\xee\x0c\xa5\x5d\x2c\x60\xf3\x91\xb5\x86\xed\xfc\x4b\x41\xca\x30\x13\xdb\x2e\x45\xb3\xe9\xa4\x18\x44\x84\x41\x11\x4b\x64\xb9\x3a\xb4\x96\x57\xb7\x95\xba\x36\x26\x12\x62\x98\xc0\xec\x54\x6c\xc7\x9f\xcf\x00\x43\x10\x6d\xe3\x39\xea\x7c\x11\x18\x4d\x48\xc0\x5c\xb9\x30\x6a\x24\xfc\x36\xd5\x68\xa6\x09\x51\x10\x49\x0f\xfd\x28\xfb\xf4\x5b\x6f\x0b\x24\x11\x8b\x03\xf7\x32\x4b\x39\xc5\xb2\xdb\x22\xff\x71\x7b\xce\xc5\x80\x36\xa7\x12\xf2\x6f\xb3\xcb\x83\x07\x8a\x74\x14\x5a\xe1\xb7\x1c\x44\xf5\xdf\x67\x38\xfb\xfe\x48\x22\xc3\xb0\xb4\x7b\x29\xaa\xad\xf8\x99\xad\x55\x39\x3f\x61\x92\x04\x38\xea\x03\x9d\x8b\x5a\x18\xf8\x5e\x65\x0d\x7c\x6d\xf7\xb4\x19\xfe\x38\x9a\xb0\x90\x6b\x36\xc8\xbc\xfd\x36\x63\x0f\x25\x8c\x01\xbe\x53\x1f\xaf\x71\x72\x2f\x5d\x57\x73\x2a\x95\xd5\xe9\xba\x2e\xba\x1d\x8f\x8e\x84\x33\x8e\xf5\x1f\xf2\x7c\xb9\x87\x53\x39\xb5\x2d\x13\xce\x52\x12\x4e\xb2\x52\xed\x45\x5f\x44\xd5\x5a\xcf\x3f\xfe\x91\x2a\x3d\x4d\xb8\x4a\x98\x0b\xcd\x79\x91\xe3\x07\xa1\xae\xfc\xd9\x84\xeb\xa4\x5f\xe7\xfa\x28\x6e\x92\x52\x8b\xf7\x3b\x88\x7a\x0b\xe2\xf8\x0c\xc8\x0c\x38\xee\xe9\x54\x03\xa6\x98\x6b\x67\x7d\xe0\xf6\xfe\x05\xcd\xdd\xee\x32\x46\x63\x5c\xc6\x15\x0b\x8c\x49\x4c\x28\x96\x23\x7a\xa5\xa7\x06\xf7\xe9\xee\x88\xb1\x50\x90\x3d\x92\xa8\x2e\x2a\x2c\xcb\xa9\xff\xd8\x5e\x4e\xdd\x88\x90\x49\xea\xbd\x91\xb1\xb6\xeb\xfc\xf6\x99\x48\xae\x47\x15\xc3\x9b\x06\x4e\x93\xf8\x50\x22\x8d\x50\x2e\xf9\xbf\xaa\xd5\x19\x72\x31\xe9\x2f\x95\x2a\x84\x04\xcb\xac\x2c\xba\x55\x2a\xd1\x9a\x89\xc0\xc3\xf1\xfb\x14\xeb\xf8\xda\x10\x84\x89\x5b\x3f\x5e\xe0\xe7\x24\x92\x96\x98\x20\x35\x4e\x71\xdb\xb3\x1a\xac\x0b\x53\x56\xc7\x6b\x96\x61\x4a\x83\x98\x21\x06\x6b\xa5\xca\xa2\x3c\x5e\xb6\xe2\x67\x5f\x2c\xff\x8b\x7f\xee\xec\x30\x24\xd8\xeb\x36\x90\xe5\x69\x32\x07\x89\xe3\xf1\xcd\x42\x16\xa2\x2a\x2f\x46\x4a\x31\x48\xea\x76\xf3\xf1\x1b\x50\xc2\x6d\x0a\x2b\x9b\x91\x8d\x9a\xdf\x65\x29\x51\xa9\xb0\x99\xc1\x66\x51\x7f\x6c\xa0\xca\xa6\x0b\x1c\x86\x2f\x94\x93\x6d\x6e\x0d\x9f\x8d\xd5\x5e\xf4\x53\x8f\x46\xd4\xf2\x0a\xbd\xbd\xaf\xd6\xcb\xd7\x21\x6a\x9d\xb6\x2e\x25\x56\x26\x7e\x3f\x94\xeb\x7a\x7b\xe8\x74\x02\x1c\x6a\xd6\xb7\x32\xa1\xc7\x9d\x2e\x45\xa5\x91\xf1\xe9\xd5\x8c\x48\xb9\xff\x35\x79\x26\x43\x2c\x2d\x2c\xd4\xc8\x01\xb4\x3d\x64\xfd\xf3\x18\x8e\x16\x37\x8c\x80\xfb\x93\x0b\xc4\x01\x45\x01\xfb\x93\xb8\x98\xb2\x1a\x2a\x13\x52\x9a\x18\x2a\x9c\xc2\x8f\xdf\x45\x3b\x15\x9c\x81\x23\x42\x29\x00\xf7\x2b\xb3\x53\xdf\xda\x96\xef\xb8\x8e\x55\x93\x08\x3f\x65\x21\x47\x64\x9c\xab\x6d\x5c\x9d\x4a\x75\xf8\xad\x3b\x96\x22\x42\xa7\x3c\x35\xeb\xe2\x0f\x03\x55\xc7\xf0\x4f\x69\x9a\xc4\x32\x76\x86\xe4\x06\x87\xd0\x28\xba\x4f\x53\x15\xd8\x04\xc0\xa1\xfc\x44\xd3\x6f\x68\x24\x51\x11\x19\x0c\x00\x6c\x40\x9d\xab\xac\xb9\xec\x96\x65\x51\x80\x6a\x5a\x77\xc1\x39\xee\xdb\xf2\x05\x3e\x3b\xc9\xda\x01\x39\xe2\xe8\x36\x32\xe0\xb8\xd0\x08\xad\x91\x71\x01\xf1\x4d\x55\x7d\x77\x19\x4a\xd2\x7b\xb3\x94\xca\x90\x23\x82\xf9\xed\xcf\xa1\xcc\x3a\xa5\x52\x5b\xf9\x94\xfb\xb3\x28\x3e\xcf\xfe\x57\x1d\x05\xc2\x65\xd7\x1d\xdd\xda\x3b\xa8\xf2\x78\xbc\x52\x63\xa4\x54\x27\x04\x03\xc0\x59\xfd\x7a\x82\x9e\xce\x89\x52\xcd\x23\x9a\x38\x89\x3f\x0b\xa2\x1c\x17\x41\xf4\x03\x1e\xa2\xc8\xc4\xbd\x80\xe1\x30\x82\x47\x21\x36\xc4\x12\x9e\xd6\x8e\xe4\xa8\xb6\x65\xdd\xf3\x3b\x09\x05\xee\x08\x96\x31\xae\xd7\x71\xbb\x4f\xef\xc8\x25\xe9\x2d\x55\x91\xbb\x2b\xbf\x41\x85\x66\xf5\x4b\xf9\xe9\xee\xcf\x82\x08\x10\x5d\xb4\xf8\xb6\xfe\xea\x7f\x0b\x79\x80\x35\x4a\xd9\xf1\x94\xef\x4e\xd3\xea\x97\x31\x9b\x12\x65\x51\x6a\x65\x67\xe1\x3f\x67\xe7\x34\xdb\x26\xc3\x8f\xc9\x22\x23\x70\xbc\x59\xe3\xc7\x9b\xcc\x2c\x0e\x6c\x2c\x00\xd5\x52\x3a\xd1\x02\xca\xe2\x90\x4b\x5c\x5a\xf3\xa6\x93\xf2\x1f\xbf\x22\x8b\x13\x8d\xe9\x9e\x11\x0d\xa4\x0d\x7b\x4c\x1a\x72\x1b\x3d\xd2\xf6\x43\x5b\xcd\xb9\xee\x46\x0a\x90\x93\xf2\x24\x2e\xad\x97\xfc\xec\x91\xde\x14\xf5\x69\xda\x8f\x96\x83\xde\x43\xd5\x7e\x91\x3b\x87\x3b\xf3\x50\xda\xd1\x38\x61\x2c\x51\xa1\xdb\x0d\xba\x1a\xbe\xd9\x4f\xc8\x58\xca\xad\xc3\x83\xc4\x28\x4b\x7f\x43\x1e\x04\x18\x34\x14\x9d\x8c\x33\x65\xdc\xd5\x56\x6a\x71\x19\x96\xa7\xfb\xa3\x31\xc3\x62\xe2\xbb\xed\xf2\xfe\xf5\x71\x35\x79\x6f\x6e\xb8\x74\x76\xde\x5d\xa6\x7f\x1b\x1d\x4b\x23\x83\xf6\xc8\xc7\xe7\xa1\x47\x32\x52\x96\x0a\x1b\xd7\x3f\x88\x42\xe7\x30\x3c\x22\xc2\x50\x09\xcf\x2c\x94\x81\x5e\x34\xce\x28\x9a\xac\xdc\x4c\xa4\x29\xee\xb7\x39\xec\x45\x3e\x31\xdd\x99\xa4\x36\x2a\xae\xca\xa2\x6e\xaa\xf3\xb5\x65\xc2\x24\x4b\x41\x0f\x4d\xb3\x21\x73\x95\x6f\xa3\x42\xe4\xf3\x54\xa2\xd2\xf5\xae\xc9\x1a\x51\x64\xe7\xe3\x0e\x8d\x99\xee\x4e\xaa\x63\x97\xb6\xfc\x33\xd9\x5f\x53\x4b\x86\x29\x47\xf6\x08\x45\x3b\xc8\x32\xfd\x50\x56\x8e\x76\x20\x93\x33\xd1\xad\xd1\x73\xaa\x54\x87\xdc\xd7\x1d\x62\x71\xc4\xba\x58\x34\x8d\xc3\x33\x7d\x13\x79\x67\xc3\x32\x4d\x13\xd4\xc4\x5e\x6c\x56\x03\x36\x56\xca\x40\xd2\x24\xf4\x10\x31\xe7\xf4\xba\x74\xe4\xec\xfe\xc1\x40\x72\x61\x0b\x77\x91\xa4\xab\xd7\x0a\x0a\xfd\x53\x99\x80\x20\xbc\xf7\x79\xb1\x7e\xb1\x11\x76\x4b\x1a\xea\xaa\xbb\x16\x8f\xab\x1d\xd2\xda\x7a\x38\x03\x33\x34\xb4\x1a\x5f\xe7\x66\x9b\x35\x03\x00\xb3\x77\x1b\xc6\x91\x86\x99\x89\x6d\x98\xc4\xf2\x0b\x5c\xb2\xe6\x02\x78\xcc\x08\xe6\xe5\x8e\x5d\xc2\x11\x53\xbc\xfe\xa8\x0c\x71\x33\x71\xa2\x11\x42\xe6\xbf\xa0\xdd\x9c\x37\x28\x78\x90\x5a\x84\xe2\x1d\x14\x60\x32\x95\x89\xea\x32\xe5\xf9\x1d\x3d\x12\x0f\x52\x85\xb3\x5e\x83\xca\x8e\xdd\xa0\xe1\x61\x4c\x53\xac\x1f\x70\xe2\xf1\xfe\x77\x12\xd1\xa8\x0b\x79\xbc\xc0\xe7\xb6\xa3\x6a\xa5\x9c\x24\x09\x4e\x8c\x6d\xf9\x91\x35\xf3\x1b\x31\x27\x40\x8d\xf1\x84\x8b\xe7\xba\x71\xd6\xcc\xa4\x55\x94\x50\x74\x8b\xb7\x5f\xd7\xbb\xc5\xfd\xfd\xfb\x6a\xe3\x4d\x1a\x1e\x47\x91\xb2\x04\x1c\xa7\x07\x21\xbb\x5f\x53\x0b\xf1\x13\x5a\xbf\x94\xfa\x0a\x7c\xee\x5a\x25\xb1\x8d\x9f\xfe\x7e\x2a\x4f\xeb\x06\x8e\xfe\xec\x24\xb1\x5a\x23\xb6\xa4\x6b\x73\xd6\xe5\xc0\xce\xe0\x09\x37\x08\xcd\xf9\x96\x55\x22\x1f\x75\x46\x02\x96\x0f\xed\xe5\x6d\x3b\x93\xcd\xe2\x34\x8c\xa8\x18\x48\x2c\x9f\xab\x7a\x4c\x30\x39\xfe\x74\x34\x01\xac\x9e\x3a\x17\x5f\x84\x2f\x19\xa6\x9c\x2a\x40\x90\x1e\x34\x9e\x25\x8d\x72\x1e\x87\x98\x26\x5b\x64\x57\x71\x86\x41\x9a\x63\xfc\x30\x9c\x0b\x24\x91\xd8\x1e\xec\x06\xf8\xe0\x2f\x96\x06\x2a\xe1\x03\xaf\xe0\xf5\x7c\x23\x9b\xc0\xd3\x58\xa2\xff\xef\xb9\x4f\x70\xff\x1c\x52\xeb\x4d\x9a\x33\x99\x76\x32\x48\x2e\x4f\x79\x9e\x70\x4c\x53\x2e\xa2\x08\x31\xa8\xc7\xcb\xcf\x1e\x9b\xdb\xfe\x2c\xb0\x1e\xfc\x11\x9a\x11\x1e\x89\x0b\x17\x2e\x96\xe7\xcb\x88\x85\x7d\xc6\xce\xe7\x32\x56\xb8\xa5\xda\x0f\x80\x95\x60\x23\xbe\x97\xc9\x03\x4b\x9d\xa0\xb5\xbc\xfd\xf2\xf5\xe9\xcf\x85\xbf\xa1\x8a\x08\x16\x22\xfa\x0c\x3f\x9a\x79\xf7\x28\xc2\x3d\x7f\x19\x95\x0a\x34\x71\x2c\x21\xf6\x75\x76\x68\xb4\x82\xb8\x73\x80\x11\x54\x69\x46\x3e\x3e\x5b\x31\x37\x2a\x1e\xa4\xdc\xa4\x51\xa0\x3d\x85\x93\x05\x63\x0f\x44\x0f\xfe\x06\x52\x65\xaf\x91\x06\x4c\x2a\xe6\x51\xe3\x59\x31\xe1\x34\x9f\x36\x96\x80\x22\x6b\xad\xab\xf6\x08\xc5\x97\x8b\x67\x79\xa1\x69\x00\x56\x20\x78\x67\x93\x7a\xed\xf3\x22\xd2\x7b\x7c\x81\x30\x66\xa1\x72\x50\x83\x3e\xee\xbf\x5b\x2e\x7c\x8a\x33\x0d\x99\x2d\x1f\x71\xc5\xb3\xcb\xe9\x05\xb8\xf1\xb8\xbf\x85\x46\x76\x10\x07\x58\x9a\xde\x89\x10\x8b\x8e\x12\x67\xd5\x9c\xeb\x37\xab\x13\x3d\x86\xf9\xa6\x44\xa8\xb4\x27\x12\xc3\xa1\x3b\xc7\x1f\x79\xdd\x69\x44\x0a\xb4\x3b\x10\xca\xdd\x3b\x22\xbf\xc4\x3c\xf9\x53\x55\xac\xbd\x9b\xb4\x14\x85\xcd\x01\x64\x7f\xc1\x4b\xd9\xac\x0a\x0d\xba\xd7\xbf\xa0\x69\x14\x73\x2e\x07\x88\x32\x9c\xa4\xa3\x06\x4c\x20\x6d\x81\xc8\xaa\xfb\xaa\x3c\x59\x97\xe7\x76\x70\x3a\x8d\xb5\x41\x03\xa6\x56\x22\x07\x6d\xb7\xd5\x7e\x1e\xa5\x49\x2a\xa9\x8b\x6f\x6c\xee\x97\xbf\x0e\x53\xa6\x89\xb4\x92\x9e\xf7\x22\x87\xd7\xf7\xee\x12\x9a\x61\xfc\xb5\x30\xcd\x55\x80\x38\xa5\x71\x24\xad\x94\x29\x76\x1c\x36\xe8\x7b\xcf\x37\x4a\x38\x65\x5d\x04\xe3\x6a\xd0\xa7\x54\x05\x2e\x80\xae\xca\x42\xb7\x36\xfb\x73\x59\xf8\x52\xca\xf6\xb0\xe5\x06\x47\x70\xef\x43\x56\xd5\xcd\x77\x80\x0f\x9b\x1a\xed\xda\x98\x00\xeb\xfa\x0c\xd6\xf8\x2f\x21\xb7\x84\x1c\xe3\xa5\x3a\x65\x69\x8c\x78\xfd\x6d\x96\x6b\xe8\x8b\x1c\xdb\x03\xd4\xa3\xcc\x2c\xfa\x78\x1a\x1d\x48\x53\xa2\x99\xb2\x39\x1e\xf4\xcb\xfd\x76\x3b\x37\xaa\xe6\x18\xdf\xfa\x55\x20\x4d\x39\x47\xf7\xe1\xb4\xb3\x33\x62\x77\xb4\x69\x46\x5c\xb4\x06\x60\xbd\xc9\x03\xa4\x3c\xa5\x8e\xca\xfe\xd5\x6c\x0f\x76\x70\x6f\x0f\x55\xd9\x21\x69\x52\x61\x42\xac\x5d\x5c\x3d\x3e\x6e\x76\xdb\xd7\xdd\x97\xc5\x76\xf9\x65\x17\xde\x2d\x3c\x88\x23\x95\x86\x61\x57\x9f\x0b\x6f\x6f\xb6\x66\x48\xa5\xc7\x18\x81\x54\xa5\x84\xd0\x3e\xa6\xba\xc8\x87\xb9\xc1\x54\x4b\x1a\x3a\x7d\xd8\x17\xf8\x5c\x5e\x41\xb9\x53\xad\x2c\xdd\xed\x23\x34\x4b\xd1\xc0\xbe\xec\x34\x37\x06\xf4\x71\x34\x05\x6e\x39\xc8\x5a\x93\xf2\xe2\x3c\xe5\xc9\xd0\x00\x6d\x69\x58\xed\x7c\xfe\x22\x06\x8a\x69\xe3\x4f\x6b\xc2\x34\x6e\xe7\x8d\xd3\x18\xf7\xb4\xf1\xbb\x6f\xab\xcd\x76\x75\xbf\xf3\x48\xc3\xd4\x18\xe9\x39\xa9\x2c\x94\xed\x39\x2b\x9a\xeb\xe2\x4b\x2a\x02\xc7\x2d\xb6\x2c\x8f\xa7\xd6\xa3\x6c\x60\x79\xc8\x4e\xe3\x60\x78\x44\xfc\x3c\x14\x61\x14\xa1\x55\xf4\xbb\x90\x59\xd5\x91\xd4\xf8\xdb\x0a\x12\x1b\x8c\xd6\x96\x55\xb6\x6f\xa7\xfe\x80\x43\x98\x0a\xe2\xe0\x09\x37\xb4\xb2\xff\x35\x13\xd1\x15\x51\x18\x08\xa7\x84\x3a\x24\xb9\xbb\xb1\x39\x70\xf7\xb8\xfe\x64\xc2\x90\x84\xea\x90\x35\xcf\xa5\x9c\x5b\x1d\x7d\x43\x93\x22\xe3\x78\xa7\xb7\xda\x0e\x7d\xcc\x5f\xcc\x7f\x06\x11\x47\x42\xda\xc8\xb6\x25\x45\x1c\x12\xcf\xdf\xfa\x3f\xec\x51\x6f\xd8\x8b\x58\xc4\x98\xf7\x5d\xd4\x75\xb6\x2f\x1e\x1f\x57\x6f\x65\x99\x5f\x2b\xc8\x51\x91\xc4\x8a\x06\xae\x66\x65\xd5\x1c\xa6\x47\x65\x1c\x85\x1d\x2a\x69\x9b\x9d\x66\x09\x92\xda\x76\x89\x74\x05\xf3\x7f\xab\xec\x3b\x88\x99\x0b\x1a\xfb\x2c\x62\x9d\x29\x6b\x1d\xfe\x83\x2d\x43\x50\x6a\x6b\x92\x2c\x57\xb7\xbf\x63\x75\xcd\x69\xe6\xdb\x33\xab\x03\x6d\xa5\xb4\x27\xc7\x78\x8c\x5e\xb4\x86\xe2\x82\x11\xcb\x76\xfe\xbc\x55\xe5\xcf\x8b\xd5\xaf\x9b\x36\x97\x76\x35\xcd\x6a\xc7\xda\x3f\x99\xbc\x82\x51\x8a\x65\xf5\xf7\xa2\x3e\xec\xcb\xdc\x2f\xb1\x82\x27\x3a\x89\xc7\x04\xae\x76\x14\x8f\xce\xe6\xd2\x06\x05\xb0\xd5\x29\xab\xae\x18\x66\x5d\x3b\x41\x0c\x8b\x07\xc1\x0c\xc7\xb9\xe4\x6f\x26\x34\x75\x2f\x8c\x51\x8a\x51\x4a\x51\xc8\x04\x04\xed\xc0\x46\xf7\x99\x31\x99\x3a\xe7\xcd\x65\x51\xe8\x11\xbb\xd8\xe4\x96\xd2\x89\x23\x57\x18\x3f\x7a\x16\xd7\x43\xd3\x37\x54\x81\xcf\x17\x21\x83\xfb\xa8\x9c\x78\xdc\x54\x91\x08\x57\xba\xef\x59\x81\x9c\xfb\x37\x07\xfb\xf8\x23\x28\x99\xc0\x18\xe8\x3d\xb9\xac\x4c\xd1\x64\xda\xae\x36\x5b\x5c\xc8\x42\xff\xee\x3a\xb2\x64\x66\xfd\x02\x8e\xb5\x04\xd5\x04\x21\xe4\x5a\x43\x3b\x38\x9c\x6c\x60\xbb\xa9\x17\xfb\x12\x65\xaa\xba\xb5\x5c\x80\x26\x10\x0e\xf2\x6f\x98\x79\x18\x3f\x0c\x98\x04\xed\x6b\x5d\x9e\x5b\xbf\x69\x46\x9b\xc1\x35\x34\x8c\xa3\xd7\x88\x5c\x92\xc3\xcf\xce\x27\x1d\x6c\x52\x9b\x75\x71\x65\xe2\xce\x94\xf3\x31\x32\x19\xb0\x90\xdb\xaa\x9d\x37\x31\x1d\xbf\x32\xe0\x1c\x3d\x25\xb4\x90\x77\xf9\xb0\xec\x6d\xdc\x30\x4c\xc2\xd8\xf9\xa0\xcf\xe2\xe7\x43\x05\xa8\x60\xe7\x2d\x45\x19\x26\x3c\xea\x07\x91\xcd\xac\x5c\x11\x88\x0d\xb6\x6d\x19\x72\x1a\xf6\x1c\xb6\x88\x4f\x7e\x2d\xda\x5d\x78\x29\x8a\xbb\xf3\x98\xc2\x81\xca\xd0\x38\x8a\xc4\x4a\x14\x8d\x9d\x88\xdb\x72\x36\x61\x22\xa3\x30\x0a\xfb\x5c\xe2\x8f\x2c\xcf\xfb\xaa\x18\x19\x45\x11\x65\xdd\xa0\xad\x71\xc1\xd0\xdd\xc1\x58\x93\x9e\x61\xb5\xcf\xad\x0e\x9e\x3a\x4a\x2d\x8a\x5f\x58\xd2\x5c\x58\x17\xed\xe6\xd4\xbe\x68\x77\x11\xc5\x7d\x06\xd6\x89\x94\x5c\x51\x01\x50\x99\xc4\x96\xfe\x7e\xd1\x1c\xc4\x9f\xaf\x8f\x8b\x71\x49\xe6\xf8\x7d\x12\x9d\x12\xea\x86\x28\x3a\x84\x93\x6b\x21\x94\xd0\xe1\x58\x10\x57\x36\x56\x07\xa1\x92\xa6\x1a\xe9\xca\xc4\x29\xf3\xf1\x05\x1f\x57\x1b\x9b\xfb\x92\x05\x4c\x32\x1f\x51\xc2\x50\xb3\x3f\x92\x26\x8c\x3a\xa4\xb4\x83\xbd\x60\x10\xba\x75\x60\xae\xe3\xd5\x52\x90\x98\x74\xcc\x85\xe3\x87\x11\x34\x40\x30\x90\x63\x8a\x99\x70\xa7\xf8\x46\x12\x70\xcd\x7c\x3b\xff\xf5\x57\x3e\x08\xc2\xcc\xe2\x56\xa4\x22\xa1\xb6\xea\x8d\x95\x2d\xde\x7f\x2a\xf7\x64\x51\x94\xc5\xc5\xc7\x2a\xa4\x4a\x08\x71\x50\xe1\x7f\x5b\x6d\x8e\xe1\xee\x28\x35\xb1\x69\xc3\xd7\xf7\x97\xd5\x76\xf9\xba\x7e\xf1\xe7\xe9\xd8\x7a\x98\x1e\xc6\x20\x8a\x8f\xfe\x90\xad\x73\xa8\x11\x49\xf2\x56\x95\x32\x87\xe3\xa4\x1f\x74\x62\xb0\xbe\xcb\x0e\xa8\xd6\x34\x02\xbd\x14\xa7\x13\xe8\xb5\xfe\x39\x19\xb6\x10\x48\x84\xdf\x7d\x59\xbf\xbf\xe2\x1a\xe5\x6f\x04\xa1\x0d\xd8\x37\xe5\xa2\x56\x59\xe6\x12\x2a\xfe\x20\x55\x58\xe9\xd1\x7e\xfc\xa7\x6f\xab\x5f\xa3\xbf\x24\x18\x2a\xbd\x18\x69\x01\x77\x97\xd7\x02\xde\xcb\xb2\x19\xda\x81\xae\xa5\x21\x51\x4a\x46\xba\xb5\xf7\x48\x4a\xac\x06\x2c\x02\x54\x1a\x1e\x20\x56\xea\x84\x31\xee\xc9\x47\x34\xa9\xc1\xfa\xbd\xcf\x2c\xd7\x0a\xe5\x59\xcf\x83\x33\x45\x62\x1c\x7f\xd1\x8f\x4c\xe3\x7a\x75\x63\xf8\x1b\x29\x12\xda\x7f\x82\x87\xb2\xea\xca\x86\x47\x8f\xac\xc2\x84\x2b\xc7\xc3\xd6\x7e\x27\x97\xa9\x70\x37\x54\x44\xd9\x84\x4d\x59\x41\xfd\x04\xa6\xe9\x7f\x27\xe8\x07\x6c\xfe\xdc\x6c\x57\xcf\xbb\xe5\xfb\x0a\x6b\x97\x77\x4f\xeb\xe7\xae\x62\x45\x11\x93\x22\x6e\xe7\x8b\x17\x72\xf8\x95\xf8\xc2\x0d\x34\xd6\xf8\xb5\x54\x14\xb0\xd4\x7f\xb8\x60\x7e\x53\x57\x51\x1a\x18\xab\xc6\x60\xf9\xa0\xfd\xcf\x32\x46\xdd\x88\xb1\xd2\xa0\x2d\xf2\x73\x60\xdc\xd9\xdd\x55\xc5\xb1\xe5\x75\x2e\x4f\x50\xac\x57\xaf\xbe\x8e\xdf\x1f\xa5\x82\x05\xa3\x05\x19\x73\x16\x76\x4f\xb9\x56\x46\xa2\x8a\x2a\x8a\x45\x76\xa2\xae\xa1\x6a\xd6\xcd\x7d\x09\x75\x61\xf9\x9b\x47\xf9\x3e\x45\xb5\x42\x2f\x3d\xab\xdf\xca\xfa\x2e\x6b\xc7\xde\xbc\xa9\xa0\xa8\x51\x36\x6c\xd0\xee\x46\x68\x9e\x6e\x86\x3c\x6b\xae\x15\x0b\xac\x15\xba\x7c\x1f\xa5\xea\x14\x4b\x52\xcb\x9f\xde\xbe\xd8\x6d\x94\xe9\xec\x6e\xab\x98\x88\x30\xcc\xf3\xbc\x7e\xd9\x3d\xac\x56\xdd\x35\x65\x1c\x59\x20\xd3\x0f\xc8\xcb\x13\x54\xf5\xf2\xdc\x0d\x1e\x66\x54\x92\x74\xe6\xf0\x5d\x59\x55\xa8\x5a\x35\xbe\x30\x27\x80\x53\xe9\x98\x15\x9e\xb5\xc0\x46\xe9\xc7\xd5\x33\x8a\xb3\x24\xb6\xf4\x0e\x65\x05\x77\x48\x71\x33\xb1\x3f\x94\x08\x08\xba\x3d\x59\x91\x35\xdb\xcf\xf2\xff\x95\x81\xe1\xd7\x81\x2e\x25\x02\x85\xfb\xc4\x88\x5f\x62\xb4\xf4\x8e\x6d\xf6\xe9\xe9\x29\xe0\xf3\x67\xed\xfa\xfa\x26\x32\x3d\x90\x87\xa5\x4a\x52\x2b\x0d\xfc\x7b\xbb\xba\x4e\xc2\x8f\xe7\xa9\xaa\x48\xdb\xdc\xa4\xb2\xeb\xd9\x57\x63\x30\xf3\x71\x83\x15\xd3\x9f\x23\x62\x62\xa9\x86\xd4\x6b\x85\x6e\xe1\x95\x1d\xa1\x54\x68\x7d\xc3\x5c\xa0\xc9\x2a\xf6\xc3\xf5\x4c\x29\x19\x1a\xaf\x9a\x78\xca\x8a\xd7\x73\x73\xea\xf5\x8a\xe6\xa3\x3c\x4a\x41\xe0\x45\x3c\xee\xc6\x91\xc1\x1b\xed\x4d\x40\x9d\x4e\xe8\x26\x3b\x9e\xf2\x76\x05\xbe\x0a\x06\x8f\x3b\xda\x2f\xa9\x4a\x07\x01\xc6\xf6\x74\x56\x37\x59\x9e\x3f\x96\x7a\xc0\xb5\x44\x95\x8e\x99\x2f\x88\x71\x8b\xb6\x33\x63\xb3\x62\x6f\xe3\x3b\x5d\x99\xbd\xd2\x4c\x59\x12\x94\x6c\xef\xd8\xba\xfd\x81\x34\xc6\x0a\x5d\x97\xf4\xbf\x13\x4d\x97\xf4\x57\x5a\x5a\x4b\x5e\xf6\xfb\xa0\x32\x2a\xa2\x83\xf5\xf9\xd5\x18\x75\x18\xc8\x55\xfc\x0a\x32\xae\x03\x2a\xb4\x1e\xe7\xae\xbf\x67\xcd\xc1\x46\xe9\xec\xf0\xf9\x47\x90\x70\x1d\xa4\x29\xa2\x1a\x5e\x75\x56\x4c\xc0\x39\x3a\x64\x91\x70\x4e\x77\xfb\xeb\xa2\xd0\x73\xb2\x94\x54\x87\x3a\x42\x4a\xbc\x02\x43\x2b\x0e\x05\xee\x8e\x11\x1a\x48\xc7\x1c\xb2\xb6\x84\x1d\xdf\x44\x95\xc9\x1c\x6e\x8c\x45\x4d\x34\x0b\x1d\x44\x05\x4d\xe5\xa1\x0d\xa4\xa3\x28\x45\x6f\x4c\x66\x53\xad\x0a\xdf\x80\x07\x08\x0c\x5b\x57\x99\x35\x9f\xde\x10\x3a\x3d\x08\x6c\xea\x38\xb2\x09\xee\xd6\x4f\x9f\x8f\x6f\xf8\x86\x4c\x9a\xa4\xe3\xbb\xfd\xe5\x0c\xd2\x09\x13\x98\x20\x14\xb8\x3e\xad\x8b\xa7\x9b\x2c\x18\x6d\x53\xcf\x59\xfe\x9c\xfd\xf4\x55\x97\x33\xec\xfe\x54\xd3\x40\x58\x3d\x06\x5b\xfc\x81\x56\xd0\xec\x77\xe5\xfe\x04\x6a\x43\xd8\xbb\x9b\xb1\x83\xd1\xb4\xd0\x34\xb5\x5f\xe7\xae\x7d\x6a\x8b\xee\xf0\x47\xdc\xee\xde\xa7\x0e\xc3\xee\x90\x16\xe8\x09\xd8\xe2\x1a\x5b\xf4\xbc\x2a\x6c\xe9\xde\xb5\xbb\xa2\x59\x64\x75\x49\xee\x17\xff\x1e\xee\x39\xba\xdd\x73\x88\xe7\xf0\x90\x90\x0f\xa0\x66\xba\xb5\x9b\x75\x47\x67\xf4\xee\x1c\xcc\x9e\x5b\x96\x6a\x1e\x59\x9d\xb9\x5e\x59\x32\x1f\x9a\x49\x9a\xd3\x44\xbb\xd0\x20\x56\x9b\xba\x51\xe9\x9f\x6f\x26\x7d\xa3\xb9\x09\x22\x18\xd0\xd9\x8d\xae\x97\x92\x98\xb8\x32\xed\x47\xd1\xc0\x07\xc0\x09\x66\x19\xf2\xa9\x16\x09\xc5\xfe\x11\xed\x7d\x77\x1f\x59\xc7\x02\xa1\x85\x26\x16\xc0\x77\x28\x3f\x87\xda\xbf\x54\x4b\x02\x3c\xf6\x4c\x6c\x48\xa6\x8b\x36\xd8\x5c\x8d\xac\x96\x54\x71\x3b\xf7\xdf\x41\x03\x58\x5a\xdf\xf1\x23\x48\x66\x89\x6b\x10\xd6\xf9\x02\x3f\x9b\xb7\x2a\xfb\xcb\xfa\x1b\x5d\x0b\xa3\x27\x41\x94\x87\x5c\x0c\x3d\x72\x2d\x53\x89\x61\x8a\xe5\x1f\xdb\xe5\x04\x4e\xa0\xa5\x0e\x2d\xc0\xc9\x5b\x52\xa8\x78\x34\x32\x5e\xb4\x8a\x95\x55\xb0\xac\x1f\xce\xed\x54\x43\x7f\x65\x34\x04\x14\xa5\x31\xf2\xdb\x1c\x2a\x80\x2f\x65\xf3\xa5\x3c\x57\xf5\x52\x9c\xd6\xc5\x77\xc8\xba\x46\x2c\x56\xd2\xab\xf0\x94\xb9\x5e\x96\xc7\xac\xce\xca\x7e\x51\x50\x8c\x02\xeb\x4b\xae\x6d\xc7\xd6\xaf\xbf\x60\xeb\xa1\x5a\xa5\xcc\xea\x69\xd7\xe2\x47\xa7\x72\x71\x2b\x1e\x38\x7a\x2b\x1d\x1a\x4e\x07\x00\x60\x57\x61\xe4\x8f\x1a\x85\x75\x6f\xad\x2d\xf4\x65\xf1\x7e\x3f\x48\x3f\x69\x08\x22\xc4\xf6\x20\xfb\x4a\x23\x72\x0b\x1f\xea\xcc\x48\x0d\x21\xe5\x43\x1d\x18\x04\x76\xdf\x5d\x9e\xa1\x6a\xbf\x4f\xe3\xb9\x53\xff\x0e\x90\x3a\x3b\xb6\x8d\x11\x58\x47\xf4\xdc\xba\x51\x85\xff\x00\x10\x04\x80\x70\xdc\x9d\xa9\xca\xe3\x8b\x28\xca\x97\xf5\xd3\x78\xb4\x41\x60\x52\x4c\x76\x15\xe2\x87\x95\xb2\x73\xbf\x93\x00\x12\xbf\x8c\x5d\xee\x60\x8a\xab\x05\xc2\x98\xb2\x7c\x8a\x99\xfa\x80\xe2\x41\x54\xc7\xee\xd4\x34\xc4\x81\x55\x98\xfa\xcd\x33\x96\x77\xc7\xa4\xcd\x19\xba\x78\x1b\x2a\x33\x15\x22\x9f\x2e\x90\x3e\xdc\x0d\x71\x10\xd9\xfc\xac\x83\x6b\xdb\x64\x66\xf8\xe7\x78\x42\x40\x1c\x28\x2c\x59\xc9\x6d\x70\xb6\x9b\x78\x10\xc7\xa0\x3d\x57\x63\xcf\xd7\x02\x31\xa5\xde\x20\xd8\x9c\x8f\x76\x1a\x22\x9d\xdf\xe9\x8c\x35\x6a\x70\xaa\xdf\xaa\xf2\x4d\x34\x59\x6f\x04\x41\xac\x04\xe6\x4c\x7f\x94\x0d\xfc\xf7\xb9\xac\x06\xa9\xea\x7e\x5a\x41\x6c\x2c\xe0\xf8\x24\x2a\xa1\x0e\xe7\xae\xe4\x17\x92\x10\x70\xc9\x75\x34\x4a\xad\x21\xe9\x4b\x17\x7d\x8b\x88\xf8\x53\x9b\x4c\x65\x27\x61\x6b\x3e\x4f\x93\x15\x08\x92\x24\x42\x3d\x8f\x63\xdb\x69\xdd\xe3\x25\x4c\x23\xeb\xd1\x67\x07\x99\x76\xeb\xd7\x43\xf6\xb3\x1b\x85\x90\xa8\x00\xf3\x07\xdf\xb3\x02\xaa\xcb\xeb\x09\x6c\x0d\xa1\x9f\x6d\x40\x03\xae\x1c\x9e\x1a\x39\xa4\x2c\xca\x79\x62\x2d\x02\xd5\x04\xfd\xe5\xf3\x68\x27\xec\x0e\xda\x6f\xdc\x58\x9c\xbd\x43\x29\xb8\x83\x2c\x20\xd0\x29\xb6\x39\x82\xbf\xcb\xfd\xb9\x3f\x1e\x6a\xfc\x60\x5e\x62\x67\xdb\xab\x60\x74\x4d\xe2\x08\x0d\x31\xcc\x6d\xe6\x13\x48\x08\xb0\x04\x02\x2f\x1e\xe8\x00\x76\x2e\xf5\x34\x69\x27\x43\xb4\x35\x1e\x5f\x1f\xae\x0b\xb7\x81\x47\x16\x81\x9e\x67\x18\xc4\x3a\x0f\xbc\xa5\x29\x72\x67\x08\xe8\x71\x19\x27\x48\x49\x92\xa4\xdd\x2a\x82\x60\xef\xae\x87\xd3\x48\x23\x80\xca\x1e\x43\x79\xdd\xee\x90\x8e\x91\x16\xfa\xcb\x45\x56\x99\xfe\x7b\x6f\x00\x44\xa8\xa8\x65\xbf\xbe\xbc\x16\xb6\x64\x48\x54\x17\x5b\x47\x37\xe4\xa1\xa5\x20\xe2\x28\xb0\xec\x64\x8b\xc7\x55\x88\xf5\xc1\xbb\xd5\xcb\xbd\xbf\xb3\x48\xad\x18\x59\x56\x0c\xd3\xc8\x20\xc0\x20\x5d\xeb\x52\xb4\xf6\x2b\x54\xb7\xcb\x82\xdc\x09\x32\xb1\x18\x89\xd5\xcb\xfd\xce\x41\x88\xa7\xa5\xc8\xa0\x62\x86\xa9\x31\xcb\xbd\xfb\x78\xcd\xd1\x3b\x5e\xcc\x41\xcb\x10\x3b\xcc\x45\xde\x6c\x71\xc9\x4d\xc7\x60\xd4\x3f\x5a\x11\x7c\xad\x6d\x3b\x9a\x2a\x71\x7c\x3d\x41\x31\x52\xed\xa0\x00\x44\x53\xbb\x42\x7c\x80\x7e\x9e\x53\x3c\x1a\x3f\x0d\x44\x02\xab\xb4\x8e\x22\x2b\xd6\xcb\xd7\x1e\x99\xea\x8e\x9b\x44\xe3\xea\xa7\xb3\x1f\x7f\x8c\x07\x95\x09\x03\xcb\x50\xdf\xae\x3a\x0e\xe3\x3f\x6d\x11\x2b\x94\x91\x6f\xdd\xe9\xd2\x66\xee\x37\xff\x39\x8b\x6a\x32\xfa\xe6\xf6\x00\x13\x72\x86\xd5\x91\x0e\x4f\xd3\xe7\x7a\xb6\xe5\x97\x3e\xbd\x62\x42\x2d\xd1\x32\x58\x9c\x9b\x03\x14\x0d\xb2\xf1\x8d\xa7\x86\x21\x5c\xc4\xc6\x23\x61\xdb\xa1\x14\x4e\x1b\x88\x24\xb5\x1c\x7d\xa8\xda\x30\xd7\x6b\xae\x65\x14\x28\x61\xeb\x69\x5a\x13\xa3\x5d\xf1\xef\xaf\xfa\x77\x38\x81\xfc\x69\x61\x12\x3a\x18\x59\x05\x35\x5c\x61\x5f\x26\x37\x21\x34\x96\x63\x6d\x54\xb7\x62\xcc\x7e\x42\x13\x51\x0d\x8e\xa8\x76\xf9\xf7\x93\xcc\x44\xa9\x44\xdb\x70\x83\x01\x7e\x07\xd6\xbf\x6b\x1d\x9e\xb1\xaa\x81\x6b\x1e\x6b\x0b\x26\x04\x9f\xbc\xea\xc9\xa1\x87\x5b\xa1\xa1\x24\x44\xde\xed\x53\x55\x1e\xcb\x61\x48\xc0\x50\x1a\x60\x0c\x50\xb6\x2e\xe6\x76\x50\xb8\x32\x35\x0d\xa6\x75\xf9\x86\x6a\xc0\xf2\xac\xf7\xed\x72\xf9\xba\x7e\x41\x62\xb0\x5f\x61\x9a\x0c\x0b\x52\xac\xf2\x2d\x2b\xa1\x72\x18\xd9\xc4\x86\x25\x80\xb5\x19\x48\x85\xfe\xe4\xf9\x04\xfb\x9b\x31\x65\x75\x9a\x0f\xa2\x7e\x2d\xa0\xdd\x34\x7d\xb5\x8e\xbf\x02\xa7\x80\xa9\x0c\xbc\xc2\x6e\xc8\x26\x35\xbe\x12\xe7\x96\x88\xee\x54\x7e\x92\x65\x69\x07\x95\xbf\x46\x1a\x31\xee\x92\xf7\xdf\xcb\x6a\x4a\xe0\x60\xd2\xc4\xa2\xd3\xeb\xa6\x3c\xb5\x16\xee\x6b\xd1\x9d\x28\xb9\xaf\x2f\xb3\xcc\xdc\x85\x29\x37\xd9\xbe\x10\xcd\xb9\xaf\x2c\x37\x29\x04\x16\x6e\x5a\x01\xe8\x75\xfd\x58\x96\xf3\x64\x88\xd4\xa4\x46\x47\xd6\x26\xae\x9b\x6f\x65\x03\xbf\x8d\x8a\x3e\x5d\x23\xc9\x14\x1b\xd7\x68\x62\xce\xbf\x7e\x28\xab\xd7\xd6\x2e\xd9\x20\xa9\xcc\x8c\x1f\x65\x54\x12\x21\xff\x02\xfc\x6c\x7a\x2a\xc8\xbb\xb2\xd0\x03\xb0\xb0\xd1\xcc\x3a\xc8\xcf\x42\x95\x5b\xa8\x07\x8a\xd0\xed\x31\x19\xda\x14\x34\x5a\xe2\xdf\x21\xb3\x49\xca\xd1\xf7\x86\x30\x45\xc8\xb6\x29\x2b\x05\xef\x60\x39\x4c\x7a\x7c\x8b\x81\x08\x90\xf3\x3a\x6b\xe0\xf8\x22\x8e\x30\x2c\x23\xe8\xbb\x02\x62\x06\xb2\x2b\x2c\xbd\x2b\xcb\x1c\x44\xb1\x46\x45\x59\xd0\x03\x1f\xc3\x00\xb7\x95\x1d\x7b\x68\xbe\x94\x55\x0d\x1b\x97\x60\x18\x5c\x4a\x03\x73\xf4\xc7\x58\x70\xb9\x73\xe1\x92\x1d\x14\x7a\xa7\xaf\xd7\x26\x00\xab\x9e\x87\x55\x3f\x9f\x6f\xb6\xc6\x64\x48\x00\x60\x00\x38\x6e\x41\xcf\x59\x01\x58\x42\x85\xba\x24\xfe\x05\x4d\xa8\x31\x2f\xf0\x2c\xb2\xfc\x80\x44\x6d\xd3\x52\x41\x63\x38\x43\xe1\xed\x6f\x7f\xbe\x2f\x9e\x76\xef\xab\xef\x8b\xf7\xfb\x4d\x77\x50\xda\x22\x5d\x23\xb2\xfc\xec\xc9\xef\x58\x10\x10\xe3\xb5\xeb\xee\xc4\x34\xe4\xcf\x82\x20\xb5\xd1\xb5\xd5\x9f\xcb\xea\x72\x6a\xca\x6d\x25\x74\x56\xec\x1f\x5f\x9f\xee\xfd\x15\x42\x95\x60\xda\xc4\x9b\x6f\xcf\xa2\xda\x67\xc5\x5b\x65\xa9\x52\xf5\x17\x51\x1f\x86\x95\xf1\x7f\x13\xfe\x19\x8d\x5d\x16\x84\xc6\x56\x30\x23\x7b\x69\x01\x9f\xbe\xda\x77\x51\x68\x44\x8f\x95\xe7\xfd\xa1\x1d\xd3\xb5\x7f\x1a\x22\x39\xc2\xf5\x50\x1b\xa4\x3a\xb6\xf3\x1b\xbc\xf9\xcc\x82\x28\xb6\x46\x9c\x23\x53\x5f\xe6\x65\x7d\x83\x93\x9f\x05\x71\x12\x21\x94\x5e\xf4\xba\x00\x43\x86\x34\x16\xc4\x69\x8c\xe9\x90\x23\xe8\x4c\x14\xfe\xd7\x24\xb0\x98\xdd\xae\x3b\x4a\x99\xe5\x80\x02\xbd\x13\xc9\x57\x16\x24\x92\x22\x44\x12\xa1\x61\x77\xe5\x20\xe4\xf3\x3f\x3c\xfc\x5f\xd7\x88\x46\x29\xaa\xd3\x1e\x44\xa1\xcb\x1f\x37\x14\x44\x59\xc0\xa2\x18\x73\xcb\x22\xcf\x54\x39\xd2\x73\x63\x01\x62\x7b\xd1\xe3\x5d\x17\xad\x25\xf1\x2c\x3e\xc6\x5c\x75\xbe\x5d\x6a\xb0\xdd\x9f\xe5\xa1\x1c\x5f\x40\xd9\xa2\x83\x1a\x9a\x5d\x3b\xe2\x76\xe5\x5c\x55\x54\xbf\x2a\xb0\x80\x01\x41\xb2\x21\xdf\x0d\xed\x4e\x6e\x35\x80\xc6\xbd\xcc\x93\x00\xf9\x79\x9d\xcc\x89\x2b\xba\x9a\x3c\x17\xa7\xb1\x70\x41\x93\xd9\xc7\x9f\x0d\xcc\xb6\xa7\x59\x85\x22\xa1\xb5\x55\xe8\xeb\x7a\x77\xa8\x69\xdc\x6f\xdf\x2c\xe0\x32\x46\x1a\x2b\x63\xb3\xae\x5d\x11\xa7\xcc\x2d\xde\x95\xf8\x0e\xe1\x10\x11\x97\x3d\x15\xbf\x08\xc0\xb5\x0d\x63\x0f\x95\x78\x39\x1f\xaf\xfc\xd1\xb6\x81\x40\xac\xd8\xfb\xeb\xd3\x6a\xb7\x5c\xbd\xfa\x3b\xa4\x4c\xe2\x82\xd6\x8e\x7c\xa8\xde\x01\x8a\xa6\xea\x76\x97\xf6\xb0\xc1\x7e\x43\xa9\xcb\x19\x13\x92\x05\xa9\x54\x8c\x0f\xca\xc2\x67\x14\x64\x58\x90\xaa\x40\x47\x5d\xed\x50\x27\x63\x3b\x7d\x48\x01\x96\x96\xd1\x86\x81\x86\x96\xc4\x6a\x52\x06\xce\x02\x49\x42\x1b\x6e\xc6\xac\xff\x20\x0a\xc1\x02\x99\xc4\x61\x3c\xce\x41\x8a\x46\x74\x47\x79\x80\x44\x69\x6e\x71\x6e\x1d\xe7\x1a\xb6\xe5\x56\x54\xfb\x7e\xd2\x49\x2e\xd0\x58\x74\xc5\x01\x97\xe7\x52\x83\xd3\xbb\xf5\xbe\x22\x0b\xa4\x4c\xb1\x50\xd7\x81\xac\xee\x2b\xf1\x89\xa5\x82\x53\x0f\x68\x26\x90\xc2\x02\x95\x58\xc5\x6c\x5f\xe5\xf4\x26\xaa\xaa\x9c\x0e\x5b\x45\xa5\x86\x2e\x9b\xb1\x6e\xe0\xf8\x64\xa5\x1c\x86\x95\x68\xff\x9a\x9e\xa3\x30\xa8\xd9\x8e\xaa\xf6\x91\xde\x2a\x78\x28\xab\x8f\xe5\x21\xcb\xf5\xfd\xa2\xfb\xf0\x4a\x03\xf2\x01\x2c\xbb\xef\x26\x8e\xa7\x7c\xb4\x1d\xb2\x40\xd3\x18\xeb\x53\x9f\xca\xfd\xd3\x0c\x94\x7e\x72\x67\x4d\x2d\x4d\xe3\xae\xdd\xdd\xab\x23\x4a\xba\x9f\x81\x4f\xde\x49\x73\x60\x29\xaa\x15\xdd\xbf\xef\xb6\xbf\x3f\x0e\x68\x06\x59\x00\x51\x18\xb8\xb8\xab\x4b\x41\x0c\x6d\x2e\x16\x40\x0a\x98\x3a\x6c\xc4\x07\x20\xb6\xbe\x52\x87\xc9\x58\x03\x01\xd2\x96\x01\x16\x7a\x87\x1f\x7e\x06\xd8\xc6\x02\x90\x89\x8f\xcc\xef\x72\x21\xc1\xc5\x58\xc2\x31\x48\x80\x05\xc6\xc9\xfb\x99\xac\x82\x25\x7a\x64\x7e\x73\xb0\x7c\xff\xf3\x1f\xc1\xa4\x06\x2d\x00\x95\x5f\xd4\x47\x03\x55\xe6\xf5\xac\x58\x60\x20\x4c\x62\x2f\x49\x84\x86\x92\x3d\x10\x06\xa9\x44\xcf\xdc\xed\xf0\x36\x4e\xe3\x2d\x59\x32\x43\x6d\x37\x91\x52\x66\x61\x60\x48\x6a\x3c\xb9\x8b\x35\x5c\x1e\xca\x6a\xbd\x7c\x9d\x35\xf4\x59\x18\x26\xca\x32\xc2\x01\x68\xac\x23\x5c\x59\x29\x0f\xff\x44\x84\x13\x34\xb4\x5d\x4a\x67\x18\x66\x60\x21\x49\x19\x16\x1c\x5c\x93\x78\xfd\x93\xd4\x0b\x0b\x89\x50\xbe\x9e\x7a\x71\x57\x4c\x85\x00\x59\x48\x14\xc7\xb4\x72\x9d\x8b\xe3\x11\xaa\xe1\x73\x45\x0e\x4d\xb8\xb7\x75\x71\x42\x35\xf5\x13\x14\x7b\x0f\x55\x6e\x1b\x88\x60\xc2\x14\x19\x8e\x98\x22\x59\x18\x53\x82\x9b\xd0\xae\x80\x9f\xcd\x50\x9a\xa6\x7f\x82\x24\xe6\x28\xc1\x80\x1a\xdc\x0e\xd7\x35\x87\x24\x61\x21\x0d\x88\x61\x13\x0e\x86\xf1\xb5\x68\x6a\x2c\x2d\xb7\xc8\x8a\xfa\xd5\x8c\xf6\xa8\xf1\x5a\x1e\xb2\xd8\x26\xcb\x2c\x11\xcc\xf2\xfd\xf5\xfb\xfd\x66\xe1\xf5\x49\x59\xc8\x49\xe4\x0b\x71\x1f\x60\xbe\x9c\x80\x85\x5c\x01\x6a\x65\x9f\xd0\xb9\x4a\xfc\xb9\xa9\x49\x98\x9d\x1b\xa0\xe1\x67\x7c\xed\xfc\x5c\xb9\x77\x2c\x14\xc4\x16\x58\xb4\x9d\x9d\x35\x4e\xb8\x48\xb5\xae\x86\xeb\xf3\x71\xeb\xc8\xee\x33\x8d\xf8\xd9\x87\xb5\x58\x28\x94\xc1\x2f\x66\xf2\xb3\x31\x97\xa5\x68\xba\x64\x38\x0b\x85\x0e\x3c\xdb\xea\x23\x14\x50\x67\x37\x36\xb9\x50\x68\x1a\x25\xfd\x67\x87\xa2\x59\x56\xb7\xec\xaa\x50\x05\x31\x2e\xce\x0b\x9f\xeb\xff\xe5\xda\x15\x2a\x62\x0b\x02\xda\xd1\xb0\xab\x9b\xb2\x80\x5d\xe6\x17\xfa\x50\x45\xe0\x2b\x39\xbe\xd9\xf5\x77\xd1\x34\xa8\x52\x68\x29\x9c\x6f\x5c\x92\x09\xe4\xca\x38\x94\xcd\xe7\xb5\xc2\x08\x0b\x95\x04\xb4\xfc\x50\x47\xba\x37\xd3\x27\x2f\xad\x20\x49\xbc\x50\x33\x9a\x43\x56\xb5\x69\xd4\xe9\x9a\xc9\x98\x75\x44\xbc\xa0\x7b\xea\x33\xdf\x20\xd5\xb8\xb4\x80\x2a\xeb\x4b\xdd\xc0\xb1\xdd\x5b\xd5\x60\x2f\x0b\x21\xb6\x85\x41\xb8\x83\xad\xb6\x5f\x3c\x41\xae\x3f\x0c\x80\xe5\x0d\x06\x39\x5d\x6c\x87\xf6\x66\x58\x68\x40\xb2\x9e\xec\x56\x65\xe5\x44\x14\x83\x85\xc6\x04\x98\x37\x10\xee\xc6\x45\x59\x2c\x37\xbf\xa0\x1b\x63\x24\x20\x69\x22\xbc\x0e\xef\xfa\xe5\x71\xb7\x7c\x5a\xac\x9f\x2d\x3f\xdb\xee\xfb\x6a\xfd\x9b\x6f\x07\x2c\xee\xb1\x52\x1b\xab\xef\x3c\xff\x49\x48\x98\x28\xef\x2c\xbf\x4a\xc4\xc4\x0d\x15\x9b\x18\x09\xd3\x54\xb8\x85\xe5\xbf\x4a\x79\xe3\xc1\x08\xb5\x62\xa1\x59\x8d\x98\xf4\x06\x65\x9d\xe6\x38\x0a\x18\x21\x9c\x62\x9c\xf3\x3f\x67\xa8\x2e\x64\x3e\xd2\x30\x9a\x6d\x84\xe8\x00\xd9\x5c\x6c\x3c\x04\x5f\x69\x9e\x16\x80\x91\x28\x04\xda\xa9\x53\xd6\xbb\xba\x0b\x62\x31\x12\x45\xe0\x8b\xc1\xb6\xe5\xe4\x99\x22\x20\xc8\x80\xb5\xa8\x86\xd9\x28\x46\xe2\x50\x24\xc6\xe9\x9c\x55\xf7\x62\x22\x99\xc6\x48\xcc\xed\x70\x45\x2f\xc2\x97\x98\x0d\xf3\xd3\x8c\xc4\x52\x4b\xb7\xff\x58\x20\x67\x97\xbf\x18\xa1\x50\x5d\xeb\x24\xa0\xb8\x03\xff\x9f\x85\x1c\x3f\x54\x62\xc0\x2e\xcd\x48\x12\xa5\x98\x0f\xba\x7f\xb3\x8f\x79\x3b\x4c\xc3\x48\x42\x39\x8a\xfe\x36\x07\xf1\xf9\x98\x97\x52\xe4\x3e\x2c\xd4\x3d\x1b\x75\x31\xb9\xef\xeb\x97\x97\xd5\xbb\x15\x49\x7c\xff\x73\xb7\x7c\xbd\x5f\x75\x4d\x24\x78\x2b\xd5\x26\x74\x07\x43\xbc\xe3\xa8\xed\x20\x79\xb6\xe2\x7b\x2e\x73\xcd\x08\x27\x12\xf7\xae\x53\x99\x5f\x8e\xa2\x39\x74\xe5\x99\xfe\x78\xc2\x6c\x80\xb0\x5e\xab\xd2\xd7\x29\x75\x5f\x8f\xb3\xc4\x82\x07\xcb\x42\xf4\x71\x94\x49\xee\x76\x7c\xbf\x54\x26\xee\x7b\x3f\x83\xce\x5c\xe6\xc5\x77\x34\x57\x0c\x67\xd2\x53\x29\x8a\x77\x38\x89\xec\x5a\x43\x7d\xce\xb4\x27\xdc\xc4\xb8\x26\x6a\xa8\x9b\xaa\xbc\xbc\x97\x72\x6a\xa0\x12\x11\xf1\xc8\xaa\x58\x5b\x4a\x88\x2e\x99\x9a\x89\x6b\xfc\xcb\xe8\xe2\x92\x59\xe5\xbf\x3d\x34\xdb\x9f\xaf\x55\xb6\x7f\x56\x9f\xbd\x34\xf9\x70\x77\x25\x52\x29\xb4\x18\xef\xe1\xe7\x62\x0f\x7d\xdd\x22\x23\x2a\xe4\x88\x89\xf1\xe8\xf5\x4d\x03\x79\x2e\x66\xeb\xf6\x19\x51\x34\xe1\xce\x47\xfa\xb6\x7e\xbb\x2b\xcf\xc5\xb9\x7e\x9f\x46\x50\x18\x51\x92\x50\x0b\x3a\xb3\x88\xc9\xd5\x7f\x66\x84\x10\x19\x01\x6a\x02\xc7\x75\x95\x15\x7b\x6f\x13\xfe\x36\x29\x5f\x1e\x3f\x81\xd1\x0a\xe5\x9f\xdb\x95\xc3\x81\xed\xca\x6a\x5d\x3c\x5d\x7b\x4c\x51\x10\x44\x5e\x93\xde\xaa\x30\x58\x89\xb5\x19\xcf\xd2\x9f\x10\x5b\x09\x77\x44\x9a\xfc\x80\x7a\x2a\xbf\xcc\xa2\x90\x28\xed\x09\x1c\xce\x79\x93\x0d\x74\x45\x66\xae\x17\xf2\x08\x9c\xfa\xc1\xea\x78\x6a\x2e\x4f\xa5\xba\xa6\x86\x61\x51\xa8\x34\x06\xcc\x16\x4a\x4d\x6e\x47\x24\x11\x71\xcf\x3f\xb3\xac\x2e\x35\x66\x7d\x3f\xc5\x24\xd7\xd4\x36\x8d\x30\x52\xfa\x96\x15\xcf\x65\x6b\x4f\xfa\x45\x20\x8a\x92\xc4\xae\x28\xaa\xca\x4e\xcd\x00\x6f\xc4\xa2\x88\x69\x5c\x86\x9b\xba\x67\xb5\x60\x51\x64\x08\xc6\xe6\x2b\xcb\x32\xdd\x6e\x07\x03\x75\x03\x16\xc5\x51\x1c\xb8\x7e\xfd\xfa\xfe\x34\xda\x46\xa3\x58\x0b\x44\xdd\xbe\xc0\xe7\x9b\xa8\x6b\xbf\x00\x96\x7f\xcb\xb5\xef\xcf\x87\x28\x75\xd7\xc6\xf2\xb8\x6b\x71\x28\x16\x25\x51\x68\x3a\x4d\x1b\x44\x65\xdc\x9d\xab\x0e\x8a\xc5\x22\x1a\x13\xf4\xa1\x1a\x51\x7f\x5c\xe1\xbf\x59\xc4\x48\x88\xb8\x8f\x0a\xa5\xa3\x40\x2f\xbf\x2f\xad\x1f\x3b\xbf\x57\x45\x8c\x10\x4f\xca\xd5\x57\xed\x8f\xf9\x4e\x58\xc4\xc3\x00\x65\x27\xbe\x65\x55\x53\x16\xe5\x31\xf3\x0f\x93\x06\x06\x67\xcc\x0e\x0a\x0b\x62\xac\xe7\x60\x47\xac\x5d\xa8\x9d\xfe\x4e\x59\x77\xb2\x4b\x2c\x4a\x85\x2d\x5c\x3d\x8a\xea\x63\x51\x6f\x94\x38\x4e\xbe\xbb\x08\xad\x2b\xe4\x53\xfe\x96\x30\x61\x08\x0d\x61\x91\xe0\x96\x81\xf8\x8b\x70\xec\x99\x8b\x11\x66\x69\x66\x6a\x46\x42\x2b\xe6\xf2\x48\x6e\x5b\xde\x34\x70\x1a\x2a\x40\xb0\x48\x26\x12\x41\x5b\x47\xf1\xd3\x26\xcc\xea\xee\x08\x27\xc2\xb1\xbf\xbc\x61\x9a\xe9\xca\x9f\x1f\x77\xb1\x4c\x6d\xc9\xe3\x2e\xb7\xa8\xfd\xd6\x92\x7b\x29\x37\x53\x9c\x31\x8b\x54\x64\x70\x91\xbe\x7f\x7b\x1b\x6e\xbc\x91\x4a\x02\x24\x7d\x47\x62\xfd\x42\x5d\xba\xdf\x79\x8c\x51\x44\xf8\x09\xea\x06\x9c\x72\x7c\x03\x1d\x45\x88\xd8\xea\x54\x51\x0a\xbd\x14\x79\x2e\xc5\x35\x18\x6b\x18\x8e\x8a\xb4\x48\x30\xe1\x78\xff\xf8\xef\x1e\x4b\x87\x79\x8a\xf9\x41\xa5\x95\x4c\x3b\xb8\xec\x74\xa3\x8d\xb4\x91\x68\xe9\xed\xe0\x67\x03\x85\xf5\x2b\xfd\x31\x08\x62\xe1\x08\xe4\xc9\x12\xb2\x3c\x2b\xf6\xbf\x8d\x2e\x0d\xa1\x05\x02\x19\x64\xf5\x3a\xf7\x95\x74\x61\xd7\x82\x58\xe5\x56\x1b\x73\x79\x2a\xd5\x87\x2c\x7f\x4e\xf7\xc8\xf9\xa4\xe7\xe4\x5f\xbf\xf6\x8d\x46\x0f\x70\x19\x78\x55\xb8\x3e\x5e\x12\x01\x24\x38\x2c\xc0\x56\x6b\xed\x9a\x91\xf4\x4d\x7b\xdc\x60\x1d\x4b\xdd\x94\xa7\x21\xc3\x12\x8b\xc0\x84\x18\xfb\xae\xb1\xf2\xa7\xff\xd5\xea\x24\x5b\x7b\x16\xd5\x90\x37\xab\xe5\xab\x4f\x39\xb3\xc8\xc4\x1c\x37\xc8\x95\x2a\x4f\xa2\x1b\x14\x26\x01\x5c\xc4\xf7\x43\x29\xb1\xf1\x0b\x18\x46\xa9\x93\xbf\x54\x50\xd7\xed\x5e\x87\xf4\x14\x37\x62\x15\x91\x31\x09\x4a\x32\x3d\x95\xfb\xe7\xa1\x49\x73\x43\x52\x70\x5c\x27\x48\xf8\xe8\x3f\xb5\x19\x7e\x16\x07\xc6\xa2\xc0\x8e\xcd\x24\x03\xcc\xe2\x30\x50\x41\xe4\x01\x62\xed\x07\xd4\xfd\x82\x1f\x87\x24\xc0\x78\xe4\x11\xaa\xfd\x64\x67\x8e\xc3\x88\xf8\xfa\xe5\x4e\x91\x76\xd6\x73\x8f\xc3\x34\xc0\x05\xa9\x3e\x94\x9f\x56\x87\xa2\xcc\xaf\x38\xaa\x7d\x5b\xa1\x11\x1b\xd4\xba\xca\xbb\xbd\x8f\x43\x70\x7f\x54\xc6\x98\x0b\x1d\x2e\x4d\x0f\x55\x79\x6c\x3d\xe8\xe9\x4d\x8d\x4a\x6c\x3f\x36\x4d\x39\x74\x2b\x62\x02\x1a\xb3\x05\xeb\xe7\xc5\xfb\xef\xfe\xc7\x28\x05\x6b\x5d\x95\x7f\x96\xe7\x6a\x3b\x97\xbd\x70\x2d\x63\xca\xf0\xbd\x35\x16\xd0\xe0\x2e\xfc\x6a\xe6\x3d\x9c\x38\x89\x34\x46\x22\x56\x3f\xfd\x7d\x12\x1d\xc9\xb0\xc7\x87\xa1\xf7\x38\x7f\x1f\x1a\x52\x4c\x68\xfa\xa1\x8d\xd9\x21\x8c\xe1\x6d\xcb\x3b\xd1\x34\x39\x58\x7a\x19\x3b\x1f\x27\x37\xa6\x91\x35\x41\xf7\xd0\xac\xf6\xfb\x7a\x5b\x7e\x11\x8d\x3a\xdc\x57\x62\xdf\x99\xf4\x31\x65\x61\xda\x93\x43\x7d\x83\xba\x77\x40\x63\xca\x13\xf4\xb1\x97\x6f\xaf\x3b\x94\x1f\xe9\x0e\xa4\x84\x39\xaf\xbf\x93\x00\x1e\xae\x9f\x31\x23\x92\xba\xfa\x0d\x8c\x99\x2d\x3d\x75\x07\x8b\x99\x4a\x31\x0c\xa2\x7a\x47\x6d\xf2\xd1\x38\x91\x9e\x4e\xe7\xde\x23\xf5\x1f\xa0\x1b\xab\x5c\x06\x18\x30\x41\xa6\xf5\x97\xed\xfd\x64\xec\xa4\x9a\xfa\x11\xb9\xf6\x6c\x50\xd3\xaa\x26\x16\xa7\x40\x53\xb7\x09\xfb\x32\xec\x2b\x78\xc6\xc8\xe2\x8d\x05\x8d\xb0\xaa\x78\x79\xbf\x19\xbd\xaa\x48\x99\x4f\xa3\xb9\xc8\xf6\x56\x8c\x37\xb6\x58\xb2\x50\x77\x30\x2a\xcc\x70\x76\xd4\xb5\x70\x93\x27\xcf\x9f\x2b\x8c\x36\x1d\xe4\xf7\xb9\xeb\x05\x2d\x05\xd6\x47\xb4\x53\xa4\x97\x50\x66\x31\x70\x8e\x8b\xd1\x41\xd4\x5f\xf1\x14\xd4\xf6\x10\x75\xdd\x7f\x56\x70\xa6\x1d\x9a\x06\x73\xd6\xf1\x3c\xf9\x33\x8b\x0d\xe3\x98\xf8\xdc\x1c\xb2\x66\x48\x8a\xc3\x92\x80\xc5\x58\xcc\x80\xd4\xc6\x0f\x16\x43\x78\x45\x52\xcf\x92\x40\x12\x1c\xf7\xbb\x1d\x72\xad\x09\x9d\x67\x13\x91\x1e\x96\x84\xb1\xd5\xbd\xad\x26\x4a\xdc\x93\x56\x8c\xd1\x64\x40\xf5\x6d\x0d\xf2\x6b\xc6\x2f\x96\x90\x90\x13\x0c\xdd\x69\xfd\xee\x75\x17\x3d\x9e\xe6\x3a\x7b\x95\x90\x58\x60\x51\xe0\x27\x34\x87\x2b\xc8\xf2\xe4\xca\x2c\x16\x83\xec\xb5\xdb\x61\x46\x5d\x96\x44\xc4\x60\x05\x21\x3e\xa4\x4d\x3a\x3a\x79\x4c\xbf\x39\x27\x11\x28\xb4\x35\xb2\x62\x67\xeb\x56\x6d\x9c\x68\x77\xea\x89\x94\x59\x12\x93\x30\x8d\x07\x0a\x60\xdb\x8e\xc1\x12\x69\x2f\x07\x2f\x10\x47\x41\xe2\x70\x82\x5f\xdf\xd7\xdd\xf9\xa0\x90\x66\xec\x7b\x56\xf4\x09\x78\x96\x24\x22\x30\x16\xa7\x54\x97\x39\x96\x19\xfd\x73\x52\xe5\x19\x33\x2f\xa1\xca\xea\xef\xfa\xe5\xea\x17\xd2\xe7\x2c\x61\x46\x25\x7a\x84\xfe\x7b\x3d\xf5\x43\x8a\x4b\x8b\x6a\x3d\x8a\x9f\x77\x55\xa6\xf7\xf0\x3d\xd3\x5d\x34\x39\xe1\x2a\x46\x65\xc1\xff\x9c\x33\xf5\x31\x2d\x0d\x61\x09\xd7\x71\xc0\x5c\xe8\x70\x59\x1e\x8f\x65\xb1\xdd\x7e\x77\xfb\x92\xcf\xe4\x25\x69\x98\x58\xf7\xac\x81\xd3\xf6\xb3\x1c\x07\xda\x93\x94\x53\x8c\xbe\x6d\xff\x3d\xec\xb0\x34\x0d\x08\x1d\xa2\x8c\xdb\x8d\x02\x97\x60\x32\x79\x04\x41\x12\x88\x06\x23\xd4\x5f\x41\x70\x93\x58\x34\xe1\xdd\x65\x40\xa1\xe3\x8f\xea\x84\x30\x17\x93\xfb\x9c\xdf\x13\x12\x61\x52\x5c\x12\x9e\x91\x25\xec\x3d\xdb\x3f\x88\xea\xd8\x59\x3d\x89\x4c\x95\xf7\x2f\x30\xab\x37\xc3\x90\xc8\x12\x15\x05\x88\x26\xd5\x70\xca\x4b\x6f\xc9\x24\x2a\xb6\xac\x13\x68\x45\xb6\xd3\xb8\xdd\x00\x67\xd7\xa5\x44\xbb\x51\xfb\x01\x4a\x89\x0f\x7f\x01\x88\x38\x6e\x75\x2f\xaf\xbb\xe7\xd7\x97\xcd\x76\xf5\xde\x1d\x91\x16\xb5\x53\x23\x34\x60\x32\x4b\x00\x22\xa4\xa0\xfd\x91\xc1\x67\x42\xfd\x29\x26\x01\xd5\x6b\x99\xbd\x67\xcd\x79\x22\x47\xc9\x12\xc3\x2c\x5b\xb0\xd0\x7a\x53\x1e\xe1\xeb\x6a\x5b\xf7\xc1\xb5\xc9\x13\x1b\x15\x62\xd7\x96\x1e\x40\xea\xee\x43\x83\x54\x60\xea\x57\x79\x01\xad\xa5\x28\xee\xe0\xdd\xaa\x6a\x4d\x1e\x95\x06\x5a\xe0\x86\x3c\x64\x75\x99\x7c\x44\x1a\x06\x52\x38\x44\xcd\x7d\x99\xe7\xa2\x9a\x1e\x67\x96\xda\xe9\xee\x7c\xd9\x96\x97\xe7\xb2\x00\xff\x05\x68\xc8\x63\xd9\xa1\x1e\xca\x02\x90\xdc\x6d\xf5\x9f\x61\xa1\x28\xca\x64\xe1\x64\x36\x65\x35\xf4\xdc\xe7\xd9\x18\xfe\x75\xad\xde\x86\xb2\x55\x48\xb4\xe6\xa7\xde\xaa\x39\xb4\x16\xd4\x88\x61\x84\x51\xc2\x6c\xe2\xe0\xb1\x3c\x37\x3d\x0a\xe6\x76\x5e\x82\x12\x6d\x70\xe7\xfe\xf6\xed\xfe\x6e\xfc\xa5\xda\x43\xb8\x43\x9c\xca\x06\x8a\x26\x13\xf9\xa0\xda\x89\x51\x62\x82\x98\x8e\xd5\x7c\xed\xa4\x9f\xab\x67\x60\x34\x0e\x4c\xa7\xdb\xd8\x7e\x85\xf9\xa2\x62\xdf\x58\x5b\xa9\x65\xac\x43\xac\xed\x7a\xe9\x0f\x19\xe6\x79\x5f\xef\x84\xfa\xb8\x7b\xb9\xf3\x47\x92\x88\x60\x96\xf7\xe5\x7c\x14\xdd\x6f\x2a\xf1\x85\xc7\xce\xd6\x1d\x93\x0e\xbb\x66\x94\x51\xdc\xed\x0b\xf8\x7c\x5f\xce\xcf\x1e\x4a\x53\xe9\xd4\x64\xdb\xe5\xe9\xd4\xc0\x2e\x8a\x46\x81\x0f\xca\x40\x29\x1b\x46\xdb\x68\xf5\x50\x56\x16\xe9\xfe\x37\xe9\x3c\x77\x2e\xd7\x76\xe2\xb8\x82\xa3\x1e\x1d\x8b\x94\x45\x91\x43\x98\xdd\xcb\xc9\x83\xa7\xa9\x08\x68\x3f\xb4\x91\xa3\x02\xf4\xe6\x53\x9c\xe6\x53\x6c\x34\xd5\x11\xb7\xac\x11\x3f\xca\x0f\x58\x14\xda\xc9\xb0\xdd\xaa\xf1\x1e\xaf\x63\x34\x05\x11\x38\x05\xf4\xd6\x19\x98\x3c\x8d\x08\x9c\x33\xe6\x92\xf1\x43\x7b\x83\x0a\x49\x23\x0b\xe6\x46\xda\x8f\x51\x34\xda\x35\x91\x11\xc3\x4c\x21\xe8\x6c\xa8\xe2\x3c\x1b\x2d\xa1\x92\x5a\x8a\x54\x24\x6f\xad\x95\x98\x1f\x76\xd2\x11\x90\x9f\x32\x50\xe0\x77\xe0\x6b\x62\x92\xc9\xb5\x55\x64\x03\xcf\x35\xc2\xbf\xda\x8f\x51\xcf\xe9\xff\x30\xaa\x43\x11\x38\x64\x89\x43\x3e\x4c\x8e\x53\x97\xfa\x2d\xeb\xce\x7a\xa0\x9a\xa7\xd2\x12\x9a\xe6\x56\x79\x61\xdc\x0b\x5a\xda\xca\xa8\x6f\x59\x69\xc3\x7c\x88\xaf\x1c\xf5\xa5\x36\x01\x61\x03\x0d\xd9\xfb\xac\x2e\x3f\x8b\x97\xb2\x19\xcd\x50\x60\x46\x85\x7e\x16\xbd\x83\x96\xe7\x3c\x47\x49\xb2\xc9\x43\x9a\x48\x22\xfc\x5a\x9e\xab\xe2\xee\xe2\xd4\xc6\x7c\x29\xcb\x90\xf8\x8e\x51\x93\x52\x8c\x14\xbf\x01\xd2\xa9\xfa\x3b\x19\xcd\x7c\xd4\x74\x55\xab\xaa\xfc\xbc\x65\x86\xf5\xeb\x5c\x67\xfd\xb0\x20\xd2\xc4\x8d\xef\xbb\xf3\xc5\x42\x85\xf0\x9e\x81\x6f\x20\x35\xb2\x62\xb6\x17\x1e\xe0\xc6\x31\x61\x81\x4b\xe2\x63\x05\xd0\x51\x43\xb7\x3f\x4b\xee\x90\xb4\x0f\x0f\x1d\xf3\xf4\x3f\x9a\x87\x18\x8a\x0f\x1c\xf8\xca\x29\xdf\xde\x92\x82\x63\x8c\x48\x11\x30\xcf\x42\x9c\x8b\xcb\x3c\xb9\x1e\x63\x11\xb7\xba\x13\xad\xb1\x79\x43\xfb\x68\x72\x46\xac\x22\xb4\x1d\xb3\xfa\x05\x54\x55\x1e\x51\x23\xe1\xb7\x49\x1b\x4d\x31\x63\x87\x44\x6d\x18\xc6\xb1\x7d\xe7\x0f\x43\x8a\x9e\xa4\x8d\xf0\x7c\x2d\x26\xf5\xe3\xb8\x85\xab\xd4\xe7\x81\x71\x41\x23\xa9\x3f\x99\xc6\x96\xf4\xe0\x64\x63\xbf\xc3\xc1\xc7\x28\x4d\xe4\xd0\x60\x44\xb6\x84\xa6\xf4\x98\xe8\xdb\x3d\x3d\xdf\x89\x2c\xd2\x98\x64\x13\xae\x3c\x66\xcc\x74\xec\x6f\xca\x18\x47\x4c\x06\x66\x79\x6f\x75\x9e\x37\x95\x18\xd3\x01\xb7\x68\x7b\x8c\x25\x76\x97\x54\x5d\x9d\x0d\x63\x3c\x09\xd0\x6b\x38\x89\xcb\xc2\x34\xb7\x3c\x06\x96\x06\x01\x82\x86\x1d\xdd\x9f\xa8\x32\x4b\x53\xdc\x6e\x22\xc3\xd5\x9f\xa5\x49\x22\xfb\x86\x5e\x84\xe8\xf1\x3c\xe9\xf5\x54\x06\x18\xc4\xd8\xc9\xf3\x65\x6c\x89\xfc\x6b\x94\xb7\x1e\xaf\x48\x4c\x24\x5a\x61\xea\xf9\xe7\x29\x2f\x35\xbc\x1d\x4a\x28\xb2\x9f\x93\x6b\x0b\x69\xd9\x55\x8e\x1f\xbb\x4e\x5e\x64\x0a\x78\x9b\x9c\xa1\xa2\xb8\xab\x20\xf9\x9e\x75\x39\x48\x26\x1c\xea\xda\x81\xb2\xb6\x15\x4c\xc5\x68\x26\x17\x32\x06\xed\x23\xfb\xf6\x5f\xb2\x1a\xcb\x79\xe6\x6f\x2a\xe3\x04\xf3\xec\x43\x65\xbf\xf9\xb7\x56\xa1\x44\x5c\x22\x94\xf5\xd3\x7a\xbb\xba\x31\xbd\x14\x4d\xb8\x19\x98\xed\xf7\x65\x31\xac\x36\x62\x4c\x1b\x13\x8b\xc1\x88\x5d\x6e\x5f\xc7\x4b\x20\x83\x98\xa5\x5e\xee\xbd\x3c\x17\x1a\x63\x36\x2e\x82\x3e\xbe\x19\x50\x19\x3a\x8b\x62\x55\xa0\xcc\x9d\xb6\x22\x4a\xfe\x38\x27\x58\xf9\x74\x57\x96\x1f\xb8\x70\xaf\x9a\xc3\xb7\xf0\x14\x76\xc7\xd3\x18\xad\x78\xf8\xa9\xa0\xf6\xe4\xdf\xf3\xfd\x04\xca\xc2\x01\x9e\xca\xfd\x5b\xbb\x65\xea\xee\x1a\x0a\xec\x0c\xf4\x3a\x36\x96\xb9\xa7\x9f\x2d\x26\x8d\xc9\x4c\x96\x75\xba\xc7\x8f\x6f\x67\xc0\x18\x8f\x0b\xe9\x36\xdf\xac\x2c\xee\xe5\xa2\xe9\x49\x5b\xba\xf6\x3c\x10\x16\x44\xa6\xa1\xce\x8e\xb9\xef\x00\x1e\x06\x76\x05\xdd\xfb\x92\x5b\xbb\x84\x0e\x97\x10\x1e\x72\xcb\x6c\xbf\xca\x41\x35\x03\x54\x17\x0f\x41\x60\xdc\x52\x95\x45\xdd\x2e\x26\x6f\x50\xd5\x30\x35\xd7\x38\xa1\x32\xe8\x39\xd4\xdf\x6d\x12\xc7\x76\xc0\xb8\x61\x14\x32\x2f\x75\xfb\x3d\x2b\x9e\xca\xba\x1e\xd7\xc2\xfe\x6b\xd2\x9c\x2b\xdc\xdd\x7a\xc9\x10\xbd\x2d\xed\x96\x3a\x69\xa8\x02\x6a\x61\x2e\x9f\x8b\xaa\x99\x4b\x6c\xf2\x84\x27\xb8\x60\x89\xbc\x59\x8a\x53\xbb\x68\x64\x7f\x0d\x5d\x18\x9e\xa4\x49\x6c\xa5\x6c\x4a\x7d\x56\x2e\x69\x33\xb9\x0f\x8d\x52\xac\x0f\xc3\x1d\x1c\xfd\x8a\x87\x6c\x7f\x68\x6e\x61\x19\x38\x8d\x24\x02\xb0\x97\x55\x59\xd7\xe8\x49\x1e\x44\xd3\xa5\x21\xce\x73\x38\x29\x4e\x25\xc1\xb1\xb2\x7a\x7a\xff\xfa\xe2\x1f\x8e\x05\xd2\xaa\x2a\x82\x68\x5e\xab\xbd\x8d\x82\x95\x75\x33\x24\x8a\xf1\x4d\xb5\x65\x1a\x46\xf7\x27\x15\x5d\x44\x7f\x73\x28\xcf\xb9\xbe\x83\x07\x91\x77\x31\x11\xce\x69\xe0\x0b\xa0\xed\xe2\x37\x65\x42\x9a\x7f\x2f\xae\x43\x74\xe1\xdf\x57\x0f\xab\xf7\xf7\xc5\x93\xa3\xc5\x7e\x5a\x7d\x5b\x3d\x45\xfe\xda\x69\x02\x88\xb0\xca\xb3\xba\x01\xfd\x5c\x16\x0f\x65\xb5\xcc\x85\x8b\xef\xfb\x90\x3a\x4f\x8d\x15\x18\x93\x42\x7d\xf4\x04\x9f\xdd\x45\x8c\x4a\xfb\x5d\xb3\x35\x71\x6e\xa4\xad\xfe\xd5\x1b\x47\x2e\x88\x3b\xfe\xc7\x67\x4a\xeb\x19\x17\x09\x55\x36\x92\xb0\xdf\xe7\x70\xd7\xf1\x50\xb7\x47\x6c\x85\x2c\x66\x24\x06\x2b\x8f\xcf\xd8\x70\x99\x08\x70\x85\xe5\x16\xd9\x3e\x82\x74\x72\x45\x14\x12\x31\x97\x45\x7e\x79\x2a\xd5\x87\xed\x85\xa5\x28\xee\x4b\xdf\x44\x07\x01\x72\xf8\x9f\xce\xf5\xc1\x32\x1a\x80\xcd\x71\x1f\xe1\x7a\x4a\x4c\xbe\x80\x8e\x53\x64\xf5\xfa\x9c\x84\xeb\x39\x44\x1c\x6d\xfe\x93\xa8\x6a\x58\x17\xcd\x6e\x7c\x3c\x0d\x44\x82\xf8\x44\xec\xea\x9d\x87\xd0\xa5\x61\x64\xa4\x5b\x46\x6d\xe1\xe3\x5a\x8f\xb6\xd3\x34\xd4\x0a\x11\x3c\x8b\x73\x73\x58\x75\x59\xa0\x94\x84\xb6\xde\x5f\xf5\x99\x7f\xec\x86\xee\x0b\xa6\x84\x58\xce\x28\xb7\xfe\x60\x78\x4c\x9f\x55\xf3\xb7\x5c\x16\xbf\xb0\x51\x53\x42\x20\x61\xbe\x56\xca\xe2\x57\xe7\x92\xfe\xe3\xf5\x24\x8d\x38\x45\xa9\xc7\xf7\x72\x54\xb2\xce\xd2\x38\x89\x91\x50\x5c\x96\xa2\xd2\x63\x3c\x5b\x9a\x90\x10\xe7\xb0\xce\x7c\xd8\x71\x59\xe6\xb9\x68\xa0\x1a\x14\x30\xcf\x6e\x18\x69\xc2\x49\x47\x40\x52\x1e\x8f\x99\xfd\xb0\x23\x07\x30\xa5\x46\xa6\x8e\x58\x7f\x93\x15\xe3\xa2\x5a\x96\x72\x48\xd0\xe5\x47\x1b\xf5\xeb\x1d\x34\x4b\xf4\xc0\xfd\xb3\xa5\x8c\x68\xd1\x13\xa9\xba\xa2\x9e\xf1\x43\xa4\x29\x53\x16\xf1\x70\x3c\x4d\xee\x2d\x22\x6a\x55\x18\xc5\x07\x4e\xad\x5f\x86\xd1\x53\x91\xd8\xb0\xcd\x7e\x20\xdb\x50\x56\x3d\x7d\xf4\xf8\xc9\x85\x8e\x88\xd7\xf3\x5d\xbd\xae\xbb\x01\x23\x09\x84\x61\x17\xeb\x7f\x82\x1f\x90\xff\x0e\x97\x97\x6e\xcb\x49\x25\xd7\xe8\x79\xe7\xa5\x18\x07\xc0\xff\x11\x93\x14\x4b\x25\x58\x01\x6a\x5b\x33\xf0\x6a\xd0\x5b\x6c\xd7\xdc\x8d\x38\xb6\xa3\x7a\x10\xd7\x48\x25\x80\x36\x03\x75\x04\x57\xa2\x32\xbe\xa0\x8a\x05\xa1\x7d\xa6\x69\x73\x2a\x8b\xba\x44\x06\xe2\xe9\x3b\xab\x54\x86\xc8\x3f\x00\xc7\xac\xcb\x89\xcc\xe5\x27\xc6\x9f\x41\x41\x88\x73\xe8\xfb\xfa\xc5\x2b\x0b\xb4\xff\x77\xf7\xeb\xcd\x76\xf1\xe2\x65\x5b\x59\xaa\x09\x10\xe7\x05\x3f\x89\x4f\xa7\x81\xfc\x56\x95\x26\x9b\x2e\xd7\xfe\x04\x48\x30\x3a\xec\xca\xee\xeb\xbb\x0b\xa6\x4c\x2d\xf8\xa3\x6b\xa3\x50\x0e\x5c\xfe\xfb\xfd\xa7\xab\x56\x1c\x01\xe4\x52\x08\x99\x15\x24\xaa\x37\xc3\x4c\x6f\x0a\x89\xc0\x92\xed\xfd\x8f\xd7\x53\x67\x50\x90\xc0\x1d\x16\x01\x70\xe6\xac\x11\xb7\xb5\x6c\xba\x52\x06\x11\x82\xc2\xbd\xf6\x50\x6a\x4b\x14\x30\xc8\x95\x0a\xc2\x2d\xab\x93\xaf\x05\x7f\xa8\xca\x63\xa7\x21\x8a\x8b\x37\xef\x5a\xc6\x38\x35\x11\x40\xba\x81\xe6\x7c\xba\x13\xc5\x47\x55\xe6\x39\x22\xf4\x8c\x98\x90\xda\xb4\x67\x18\xcc\x7b\xde\x83\xc8\xed\xb2\xf1\x3e\xe5\x1c\x67\x22\x12\x81\x20\x5d\x79\x82\xad\x85\xc5\x3a\x4c\x77\x3c\x8e\x42\x74\x90\x4f\x67\x99\x67\x6a\x03\x79\xde\x4e\xbe\x71\xec\x5b\x24\xb1\x8c\xba\x90\xd9\x43\x59\xbd\xc0\xa7\x83\x71\xcd\x5b\x97\x22\x89\xad\x11\x29\x73\x61\x77\x8b\x19\xf5\x61\xd7\x94\x0a\x65\x64\x5f\x4d\x7f\x2c\x6f\x40\x30\xc7\xef\x4e\x95\x44\x81\x02\xfc\x1a\x36\x2c\xe0\x1f\x96\x85\x16\x55\xbc\x7a\x5f\x32\x12\x0e\x97\x46\xc1\xa2\x24\x76\xd5\x43\xab\x9f\x27\xa8\x32\x28\xc6\xd5\x85\x4c\xb0\x58\x10\x5b\xc3\x78\x6a\x6f\x97\x15\xfb\x6d\x25\xb2\x69\x19\x8c\x60\xda\xb2\x8e\x5a\xd4\xf0\x54\x89\xef\x5f\xd3\x97\x6c\x2d\x7b\xf0\xfb\x86\xb1\xf1\xff\xf1\x05\xb9\x54\xdc\x32\x41\x3a\xd1\x44\x47\x39\xfb\x7e\xce\x07\x41\x77\xd7\x38\x0d\x22\x14\xeb\xb7\x0e\xd1\x93\xab\xe6\xd4\xaf\x05\x2a\x1d\x62\xb8\x62\x36\xc4\x26\x52\x37\x3b\x2b\xa4\x65\x19\x83\x36\xcf\x7d\xad\x3d\x13\x42\x18\xdc\x59\x33\x3f\xf6\x1e\x90\x2d\xfc\x1f\x89\x38\x32\x21\xb4\xc5\x45\x9c\x30\x79\x04\x4f\x42\x96\xd5\x97\xf2\x5c\x5d\x6b\x42\xb4\x4e\xa2\x16\x89\x2f\xdf\xcd\xfe\x82\x1d\x02\x71\xe7\x07\xc1\xff\x84\x93\x5d\x50\x28\x29\xd1\x95\x3c\xda\x08\x9a\xcf\xe5\x08\x4d\x43\xef\x73\xed\x14\x6e\x57\xbb\xc2\xdb\x2a\x02\xa8\x8a\x59\x9f\xa8\x43\x1a\xac\x75\x51\x8b\x46\xe4\xb8\xb4\x3c\x95\x62\xe2\x39\x7b\xec\x44\xb7\xee\xc5\xf8\x2f\x76\x51\x24\x61\x34\x43\xe5\xd7\xfa\x90\x0d\x34\xf2\x99\x0c\x88\x88\x5c\xd2\xe7\x51\x1c\xe1\x8a\x69\x82\xc9\x80\x6b\x63\x4b\x3d\x1d\x1e\xbc\x8e\xbb\x93\x15\xf3\x1a\x30\x48\x90\x23\x2e\xf7\x1d\xc8\x44\x86\xa1\x06\x97\xd5\xb1\xd5\xd9\x5f\x44\xed\x08\xa9\x7e\x51\x8c\x27\x43\xe6\x2c\xaa\xd6\x6a\xa8\x84\xbe\x81\x8e\x95\x61\xaa\xb4\xf7\xd7\x44\x9e\xdf\x89\x1a\x1e\x45\x6d\xab\x71\x47\x0b\xbe\x0c\x25\xc1\x32\x9a\xe7\xc5\x1f\xbb\xe5\xe2\xe5\xdb\x62\x63\x81\xbb\xdd\x83\x4a\x89\x0c\xc4\x16\x28\xed\x34\x74\xa6\xc0\x47\x19\x6a\x61\x51\x00\x3e\x0c\xe7\x0a\x32\xdd\x61\xa2\x13\xb4\x9c\x77\x35\x34\xde\x26\x97\x11\x07\xc4\x35\x5a\xed\xb6\xa2\xd4\x70\x0f\x7e\xf3\xbb\x95\x64\x94\x71\x1c\x20\x57\xdd\xf7\xc5\xd3\xd3\x6a\xbb\x43\x0e\x74\x64\x85\xf4\x57\x8d\x45\xea\x05\x48\x9f\xc5\x47\x2f\x30\x35\x7e\xde\x84\x05\x38\xc2\x6b\xbb\x81\x0e\x73\x6a\xae\x05\xe5\xda\x4a\x44\xc2\x8f\xfb\xec\xc7\x70\x50\xb0\xd0\x7e\xf2\x1a\xfd\xe6\xd1\xd3\x31\x27\x32\x53\x43\xf3\xfb\x9f\xcb\xb1\xf1\x26\x19\x05\x34\x7e\x70\x15\x9e\x4a\x55\x8c\x6f\xde\x2e\xec\xad\x2d\xf0\x96\x8b\xa6\x1c\x71\x11\x32\xc9\x64\x62\xa2\xae\xb8\x0e\x83\x7b\x13\xa5\x25\x26\x53\xa2\x30\xf8\x68\x59\x0b\x26\x7b\x8a\x14\x3a\xc0\x98\xe9\x23\x34\xcf\x97\xd5\xde\xe7\xa1\xa4\x0c\x52\x1c\x0a\x42\x6b\xd4\x3f\xbe\xe5\x4a\x4a\x99\x58\x31\xdc\xe5\x21\xcb\xf3\x41\x3a\x55\x4a\x95\x26\x6c\x20\xf7\x8b\x89\x87\x1b\x54\xdf\x4c\x4a\x43\x78\xcf\x78\x3f\xa5\x0e\xfd\x75\x68\x50\x2a\x62\x69\x63\x77\x50\x89\x1a\x36\x59\xb1\xcf\x61\xa8\x94\xe3\x9b\x25\x0c\xc3\xab\x8b\x3d\x14\x2a\xeb\x20\x88\x52\x87\x12\xe9\x04\xd7\xdb\xed\x24\xc6\x36\xe3\xb0\x4b\x1d\x25\xc8\x22\x8f\xef\xf3\x56\xc1\x31\x3b\x1f\x6f\x0c\x50\xcd\x58\xa2\xba\x02\x4b\x9f\xed\x58\x1c\x27\x11\x56\xa9\x85\xb5\xcf\x5e\x9b\xb2\x18\xea\xd8\x32\xa9\xa5\x52\x6a\x60\x08\x0e\xb3\x1d\xe3\x0e\xd4\x10\x7a\x39\x66\x9b\x61\xb8\x2b\x31\xc7\x7b\x6d\x47\x48\x6d\x94\x0d\x9e\xa0\xae\xd6\x11\x1a\x91\xef\x70\x20\x4e\x2e\x69\xb8\x44\x70\xec\x12\x72\x90\x9b\x32\x9f\xa7\xe6\x27\xd7\xa2\xcb\xd3\xcb\x80\x05\x0c\x5d\x2c\x49\xa8\xff\x39\xa5\x3a\xee\xfb\xb1\xb5\x16\x57\xff\x39\x67\x3f\x44\xde\x07\x5f\xa5\x49\x19\xf3\x30\x3f\xc7\xb4\xe2\x8f\x38\x0a\xd2\xa1\xaa\xd6\xa6\x11\x13\xd5\x7f\xa6\x02\xa6\xb0\x6f\xeb\xa6\xac\xc4\x7e\xa0\x39\x35\x9e\x91\x2a\xe0\x69\xe8\x8a\x29\xbe\x59\x8c\xb9\x55\x1a\xfe\xa7\x4e\xe0\x2f\x7d\x14\x15\x46\x96\x30\x5d\xe5\x65\x6b\x87\xec\xdc\x76\x55\x8f\x47\xa8\x22\x86\xa1\x52\xd9\x13\x46\x6f\x46\xb1\x30\x45\x8c\x4c\x7b\x43\xe1\xb9\x3d\xf4\x72\x4d\x56\xe3\x1a\x47\x31\x0c\x14\xac\xbb\x0e\x5a\x2b\xbf\x71\xaa\x98\x58\x0e\xe9\x2d\x1c\x31\x69\x7e\xae\xe0\x19\x44\x7d\xae\x90\x69\xb3\x4b\xf1\xfe\x0b\xe7\x41\x1f\x99\x50\xb1\xd1\xb8\x9c\x88\x1f\x22\xcb\x85\xcc\x61\x25\xaa\xfc\x62\xf7\x2d\xfc\xbe\x5d\x8f\x52\x42\x3d\x4a\x02\x31\xe1\x0b\x7f\xc6\x5c\x62\x5d\x51\x2e\x50\x18\x73\xfd\xb8\x7d\xfe\xd3\x43\x0b\x14\x0b\xa3\xd4\xd1\x95\x57\x59\x73\x19\x08\x7f\x75\x2d\x68\x8c\x91\xe9\xc5\xb7\xc5\xfa\x69\x71\xf7\xb4\xda\xad\x5f\x76\xcf\x0b\xcf\x0d\xcd\x14\xe3\xda\xa4\x23\x10\x17\x3a\x77\xfe\x30\x27\x31\x8e\xb0\x1f\x19\xf2\x37\xcc\x80\xd6\x14\x8f\xa9\xe8\xf9\xc6\x3b\x54\xdf\xa8\xc3\xb9\x4e\x44\xe0\xa0\x6f\x67\x4b\xb6\x3d\x20\x51\x61\x2a\x0d\x34\x8e\xf6\x6f\xe2\x54\x56\x83\x65\x52\xa5\x11\xa5\xa4\xdf\x7d\xba\x9f\xb5\xa5\xcf\xca\x86\x51\x27\x25\x62\x8d\x4e\x6a\xeb\x83\x22\x41\xc2\x43\x59\xbd\x79\x7a\xae\xeb\x72\xc9\x61\x48\x49\x09\x41\xc3\x5e\xb0\xcb\x57\x8e\xbc\x0f\xb0\xd8\x4a\x08\x6b\xfa\x40\xa1\xd7\xcb\xd7\x13\xe9\x7e\x37\x2c\x1c\xaa\x16\xf7\xb8\xc4\xbe\x93\x24\x95\xe8\x85\x2f\xa4\x52\xcb\x09\x55\x81\x92\x1c\x10\x20\xba\xab\xb0\xa8\xc5\xfd\xaa\xe2\x08\xc5\x65\xb2\xa2\x6e\xb2\xe6\x7c\xc5\xc5\xa0\xb4\x26\x28\x89\x9f\xa9\xf2\xae\x51\xfe\x57\x88\x8d\x0e\xbb\xcf\x61\x39\x35\xb6\xa5\x4d\x69\x4f\x1e\x0a\x12\x62\x78\xa7\x7f\xdc\xa9\xd1\x31\x05\xa9\xb4\x10\x7a\xab\xd7\xe1\xf8\x8d\x5c\x1c\x65\xa2\x3b\xe5\x4f\x91\x1a\x89\xbf\xb3\xda\xa1\xdc\xb7\xe5\xdd\xf9\x32\x6d\xa4\x2d\xc1\xdb\x31\x2b\x9a\xc7\x0a\x2e\xbf\xfd\x6a\xdf\x52\x26\x88\x68\x97\x55\x79\xab\x60\xbd\x7c\xc5\x69\x95\xc9\x1c\xbe\x67\xcd\x61\x34\x82\x0c\x84\x2a\xec\x55\x01\x6f\x60\xb0\x7d\x63\x63\x83\xb5\xa8\xd6\xfb\x8f\x32\x9a\x3a\x34\x29\x3a\xe5\x8b\x62\xc0\xe3\xc2\x34\x21\x91\x24\x3e\x94\xf3\x09\xb5\x43\x65\xcc\x5f\x83\x18\x82\x58\xe3\x02\x26\x6e\x8e\x8e\x42\xa6\x83\xbe\xb8\x69\x76\xd5\xd2\x11\x01\xcc\x66\x82\xaa\x1c\x11\xc0\x6f\x33\xa8\x0f\x1d\x25\x49\x60\xa5\xf1\xbd\xa6\xf1\x38\x65\xa7\xe3\x98\x21\x4c\xa3\x2f\x29\x71\x59\xf9\xcd\x34\x88\xa2\x63\x65\x8b\xae\x44\x55\x4d\x8f\x40\x62\x99\x77\x91\xc7\xac\x9d\xd0\x4f\x99\xd7\x1c\x62\x3a\x49\x6c\x9d\x7a\x3b\x7f\x36\xd0\xb4\x5b\xf3\x2f\x94\x08\xdb\xf6\x2c\x49\x3c\x0f\x2b\x62\xbb\x6c\x65\xce\x68\xf8\xe8\x84\x0a\x2f\x79\xef\x00\x8d\x9d\x3b\xea\x5b\x70\x43\x6c\xd1\xbf\x30\x9d\xe2\xf1\xcd\x82\x99\x51\x5c\xc7\x5d\x81\x46\x01\x1a\xb3\x4e\x1a\x21\x2b\x8b\x1e\x80\xab\xa9\xe0\x98\x94\x41\xf0\x7c\xf5\xd2\xcd\x55\x4d\x95\xad\xb0\xaf\xa1\x79\x2c\x45\xfe\x0e\x58\x8f\xeb\x8f\xb2\x40\xe2\xe6\xe9\x6a\x0b\xbb\xa7\x65\xa9\x0e\x83\xde\x67\x1a\x42\xbd\x35\x27\x21\x46\x33\x1a\xa8\x9b\xd7\x22\xbf\x60\x91\x54\x9d\xed\x97\xa2\xb8\x47\xe4\xda\xa2\x73\x3c\x34\x8f\x24\x26\x57\x1d\xff\x8b\x73\x8e\x66\x30\x0a\x9a\xa7\x71\x40\x1d\xf5\x31\x42\x8b\xef\x45\x23\xc6\x8c\x7b\x37\xc6\x3f\x37\x46\x05\x03\x82\xa6\x1a\x51\x53\xe7\xcb\xe4\x06\x69\x0a\x26\xe9\x03\xff\x88\xd3\x96\xe5\x94\xd7\xd7\xbf\x64\xaa\x43\x8c\x88\x1c\xc5\xcf\x2f\xab\x3f\x7a\xa8\xb4\x16\x81\xa5\x54\xae\x01\x16\x75\x3d\x51\x42\x61\x5a\xa8\x94\x23\x68\x5f\x8a\x42\x97\x2e\x2a\xb2\x81\xea\x47\x36\xad\xb3\xd3\x02\x24\x77\x7a\xb4\xf7\x30\x23\xc8\xf7\x4f\xa3\xd9\xf3\xca\x3d\x03\x87\x53\xcb\x84\x04\xb4\x53\xe9\xb3\xa9\xed\xd9\xe5\x47\x4b\xa9\x71\x53\x6d\xe6\xd8\xc2\xe6\xbb\x5f\x05\xb1\x85\x36\x1e\x45\x9e\xef\x4e\xe2\x52\x9e\xa7\x9d\xa2\x68\xc2\x94\xbf\xff\x9b\xa8\xeb\xcf\x4e\xc2\xab\x6b\x21\x7a\xae\xc7\x7a\x03\x79\xde\x43\xeb\xb4\x92\x31\x1a\x02\xda\x7b\x51\x8e\x4d\xf8\xc6\x3b\x28\x29\x50\x1a\xf1\xb3\xca\x9a\x76\xa6\xfd\x80\x0a\xe5\xd3\x7f\x5d\xfb\xe2\x4e\xd6\xce\xde\xab\xa1\x69\xea\x24\x98\x77\x7a\xb4\xe6\x80\x36\x0f\x34\x87\x87\xe2\xa3\x5d\x4a\x7c\xfa\x57\x9b\x28\x08\xa3\x11\xe5\xad\xf7\x1e\x0a\x4b\xd8\x0e\xb7\xfa\xde\x80\x8a\xd4\x80\xf0\xed\xdd\x69\x7f\xd4\x8d\x38\xfa\xe1\x07\x61\x64\xf5\x8a\x2c\x61\xc1\xf3\x8d\x38\xfb\x3f\x00\x8e\x43\xc8\x82\x28\xf5\xb8\xd2\x76\x25\xcc\x07\x54\xed\xed\xe1\xd0\xfa\x10\xaf\xeb\x97\xdd\xe6\xeb\xdb\xdb\xd3\x9f\xbb\xe7\xc5\xfb\xef\x2b\xac\x31\xdf\xbe\x6e\x17\x4f\x5d\xd3\x94\x63\x64\xbe\x38\x1f\x11\xa1\x5c\x0f\x78\x77\x19\x10\xca\xa8\xe3\xaf\x58\x55\xf2\xdc\x94\xc5\xfe\x8b\x98\xd4\xeb\x01\x49\x69\xd2\xdb\xc8\xb6\x7e\x6d\x7f\xc3\xb1\x06\x22\x28\x4a\x10\x97\x27\x28\x1e\xb3\x1f\xb0\xf8\xec\x42\x32\x40\xc0\xe2\x87\xd7\xcb\xd7\x5d\x0d\x4d\x17\x8b\xfb\xe7\xc9\xa1\xd9\x8f\x03\x51\x10\x61\x2c\x6e\xe7\x4c\x8d\x5b\xda\x96\xae\x79\x9c\x52\x1a\x78\x5e\x69\xbc\xde\x22\xcf\x44\xfd\xb5\x68\x57\xff\x1b\xaf\x15\x1b\xab\x67\xed\x31\x5f\x3d\xa3\x56\x2f\x56\xcc\x20\x91\xc6\xd1\xff\x36\xdb\x9f\x8f\xa2\x1e\x88\x65\x33\x48\x34\x47\xb3\x49\xe8\x1f\x59\x0d\x55\xfd\x15\xb3\x7f\xdd\x72\x0f\x89\xa1\xda\x05\xfc\x1f\xb3\xbf\xa0\x5a\x37\x70\xac\xa7\x9b\x91\x6b\x4b\x03\x13\xdb\xa8\x5e\xb5\xcf\x8a\x87\x76\x2b\xfe\xbf\xb2\xb5\xe5\xfd\xc5\xa8\x94\x61\x32\xb2\xcf\x71\x7c\x8f\xb7\x74\x60\x21\x80\x6b\xf5\x50\x56\x93\xa0\x36\xb0\x44\xa2\x53\xd2\x9a\x5d\x8b\x42\x7b\xba\x85\x7f\x0f\x80\x23\xe3\x8e\x65\x34\x4e\x2c\x1d\x4f\x86\x18\x4a\x5b\x63\xd0\x5d\xce\x18\x44\x0d\x7f\x64\xea\x63\x7b\x18\x48\x26\x32\xe0\x22\xb1\xaa\xf7\xab\xc5\xfb\xf2\x8b\xff\x35\x0d\x8d\x4f\xc5\x2c\x2e\xa2\x68\xee\xab\x32\x6b\x56\x0a\xab\x3b\xff\x73\x86\x9d\xc3\x4d\x85\x3e\x0b\x01\x82\x5b\x62\xbe\xf7\xc7\xa7\x51\xc9\x09\x08\x27\x8e\xb0\x43\x32\xed\xc5\xb9\x39\x94\x95\x07\x04\xcc\x7f\x6f\x21\x6d\xe5\x70\x87\xe1\xc8\x8e\x9e\x43\x78\x32\x3b\x64\xac\x10\xe9\x75\x10\xb5\x4b\x16\xfd\x36\x0c\x14\x83\x74\x45\x0f\xed\xd2\x7a\x2a\xab\xa6\x4b\x56\xac\x7d\x95\x1c\xa8\xc0\x9a\x01\xda\x05\x68\xde\x1c\x95\xa4\x3f\x0e\x51\x18\xaa\x31\xd3\x6c\x77\xc8\x08\x2c\x8b\x3f\x9d\xf3\xfc\x4e\x5c\xeb\x57\x4d\xbe\x90\x21\x0a\x17\x8e\xcf\x43\xd6\xc0\x9b\x38\x61\x54\xd4\xd7\x08\x00\x12\x2d\x62\x71\xc3\x8c\x10\x33\x33\x41\x12\x62\x78\xcd\x0a\x79\x58\xa8\x6c\x34\xa9\x26\x32\x21\x21\x52\x7b\x45\x08\x5f\x7a\x35\x5b\xcb\x6e\x42\x46\x90\xc4\x6a\xf7\x89\xd8\xce\xc9\x41\x1e\x58\x66\x9e\xac\xc9\xfe\xea\xba\xc2\x84\xdc\xd2\x1b\x64\xf5\xfa\x78\x2c\xab\xbe\x4c\xc0\x90\x24\xa1\x0e\x11\xfd\x3a\xad\x91\x31\x84\x11\x2f\x01\x27\x85\xfa\xb8\x87\xbc\xe3\xd2\x32\x44\x07\x28\x26\x70\x12\x55\x53\x58\x2e\xff\x9d\x29\xab\xdd\xb5\x40\x20\x33\x11\x49\x30\x85\x68\x75\x8f\x16\x45\xfd\x39\xc8\x24\xcc\x06\x8a\x4d\x44\xd2\x48\x58\xf7\xcf\x3a\x23\xfe\xbe\x11\x53\xe8\x71\xe5\x67\xf5\x71\x99\x29\xb3\x36\x11\x0f\x70\xe9\xb6\xcc\xfe\x6f\x7d\x81\xb8\x89\x54\x80\x65\x07\xeb\xe2\x47\xf9\x01\xb7\xe0\x9e\xd3\x8c\xb8\x89\x20\xc2\x3b\xda\x0b\xee\x46\x54\x48\x26\x32\x0c\x0b\xa8\x07\xba\x37\x93\xa8\x8f\x89\xc3\x10\x73\x4a\x75\x23\xf6\xb0\xfd\x2c\x47\x21\x68\x13\xd3\x28\xb6\x71\x6c\x50\x1f\x6b\xb3\xae\x67\xe9\x44\x4c\xcc\x8d\x2d\xcc\x39\x65\xc5\xd8\x50\x37\x49\x60\xb0\xb4\x0e\x83\x57\x03\xa6\x72\x66\x92\x90\xc4\xd4\x9b\x20\x6b\xc7\x10\xde\x1d\x8c\x05\x77\xce\xd4\x7a\xf9\x3a\x13\x61\x72\xdf\x64\x46\xcf\xb2\xb7\xc3\x0c\x35\x0c\x65\xf4\xfe\x2c\xf3\x11\xa1\x9f\x61\xb1\xa4\x8e\x72\xa1\xdf\xf1\xaf\xb0\x26\x33\x7f\xdd\xf9\x3c\xb2\x68\x9e\xb7\xea\x0c\x52\x0c\x96\x3d\xc3\x85\xc1\x09\xf5\x90\xfd\x1c\xea\xfd\xb9\xa3\x29\x49\xd1\xca\xed\x4a\xfa\x86\xa7\xa6\x9c\x86\x74\x80\xba\x73\x30\x8b\xee\xb0\xb4\x25\x2d\x7b\x4b\xf6\x53\x56\x8b\xd3\x29\x77\x88\x32\x6b\x63\x6e\xab\x76\xb5\x98\x43\x13\x9a\x54\x85\x81\x2f\xa9\xb0\x4e\xc3\x0b\x7c\x62\x97\xb4\xee\xf3\xf6\x00\x96\x95\xd4\x41\x87\xea\x61\x2c\xc5\xa4\x8a\xa3\x41\x81\x22\xdc\x79\x8e\x98\xd8\x7b\x68\x44\x96\x4f\x07\x53\xaa\x65\xe4\xe0\x5e\x5d\xf8\x6a\x5a\x87\x6d\x44\xa4\x23\xf2\xff\xa8\x4c\xea\xfb\x5d\xc4\x8a\x84\xde\xed\x6b\xdd\xc2\xb7\xce\xf1\x32\x42\x0a\xbf\x58\xb8\x63\x1d\xee\xfa\xf7\xc9\x67\x10\xc6\x60\x0c\xaa\x80\x9f\x4d\x35\xa8\x03\x37\x92\x12\x8c\x33\x1c\x31\x31\x05\x57\x2c\x6d\x13\xaf\xc5\x48\xb0\xf8\x0b\x53\x56\x5b\x10\xc7\xd5\xd6\x6f\x74\x46\x45\x09\x6e\xc3\x3b\x79\xae\x8a\x51\x04\xcc\x28\x99\x62\x45\xc9\xb4\x72\x65\x30\x70\x95\xb4\x5c\x71\xd8\x83\xc8\x21\xe8\xfd\xc8\x59\xf3\xc7\x28\x15\x63\x26\xc9\x6a\x6b\x3f\xaf\x5f\x1c\x1d\xd1\xf6\xcb\xfb\x6a\xf3\xa5\x67\x2b\x35\x4a\x01\xe5\x1e\xac\xe2\x38\x75\xbf\x59\x49\x73\x1c\x50\x63\xba\xe6\xc1\x13\xe9\x28\xc6\xb2\xc7\xa3\xf8\x80\xb7\x0a\x74\xa6\x2c\x20\xd4\xce\x99\xd1\xfb\x01\xb1\x7c\xfb\xe7\x02\xd5\x96\xdf\xa0\xea\x53\x78\x06\x22\x8e\xec\x1b\x1d\xd6\xb9\x5c\x2f\x17\x6f\xed\x20\x44\x84\x00\xe6\xa6\xa7\xa6\xde\xf8\xea\x3a\x54\x8e\xd2\xec\xf5\x47\xeb\xe7\xc1\xe7\xaf\x48\x17\x8c\x21\xb1\xf1\x56\x9e\xb7\x2a\x8c\xd1\x04\x5c\x37\x58\x53\x4a\x5d\x86\x71\xbe\xd9\x58\xb6\xfd\xe6\x3c\x08\x82\x58\x60\xb8\x03\x09\xab\x1e\x90\x78\x6a\xf6\xb3\xf0\x20\x88\xc2\x68\x52\x16\x8b\xfe\xd6\xdd\xa5\x93\xd1\x74\x0b\x25\x0f\x02\x91\x1a\xaf\xec\x12\xdd\xf7\x21\x38\x1e\x84\x11\xc1\xfc\x58\x89\x28\x8d\x51\x34\x9e\x07\x21\xb7\xfb\xfb\x22\xcf\x2f\x75\xc7\xc3\xca\x83\xd0\xa8\x08\xbc\x7d\xe1\x00\x9d\xa8\x7f\xeb\x8e\x93\x30\x74\x10\x09\x73\x2e\xf4\x3c\x9d\xe8\x14\xdd\x3a\x67\x56\xb5\x57\x02\x74\x36\x11\xc3\x51\x3b\xb8\xf9\x6f\xe3\x8e\x20\x71\x8a\x9b\xdb\xfd\xb2\xbb\x3f\x4f\x70\x3c\x59\xdc\xe1\x76\xbd\x7a\xdf\xf1\xa1\x46\x1d\x0f\x88\x92\xc2\x78\x6d\x61\x8f\x2a\x1c\x2b\x03\xf9\x96\x26\x46\x04\x78\x21\xb4\x98\x1c\x8a\x02\x89\xe1\x81\x76\xd8\x7e\xcf\x72\xbd\x14\x95\x9e\x7b\xc0\x38\x4e\xa9\x03\x71\x2d\x96\x4f\xef\x65\x0e\x3c\x65\x24\xe2\x21\x49\x79\x1a\x06\x41\x10\x92\x28\xf8\x6d\xfc\xe2\x71\x2c\x45\x32\x1a\xca\x77\xe7\xcb\x4c\x85\xc6\xe4\x2c\x91\x68\x2b\xe6\x6c\xd3\x90\x30\xb9\x6a\xc2\x29\x6a\x76\x7e\xb5\x55\x3d\xbe\x37\x12\x61\xc5\xd4\x1c\x7c\xbc\x75\x24\xfe\x36\xe3\x32\xb9\xb0\xd6\x68\x71\xee\x70\x48\xb4\x26\x41\x8d\x7c\xac\xee\x30\x03\x3e\x2e\xea\xfc\x0e\xd9\x0b\x80\xbe\x91\x54\xe6\x01\x0f\x2c\x49\x63\xbb\x50\x62\xda\x22\xf4\x97\xe2\x5a\xe1\x2a\x6a\x1f\x75\x56\xf6\xf6\x57\x08\xb0\xd6\x4a\x0c\x6c\x1f\xd9\x0e\x1a\xdf\x37\x25\xb6\xdc\xb1\x67\xdb\x5e\x64\x95\xae\xca\xd3\x8d\xe7\x4c\xb5\x46\x0b\x67\xe7\xb8\x69\x86\x24\x18\x3c\x10\xb1\x46\x48\xf8\x3b\xa8\xec\x94\x41\xd1\xd8\xe4\xd9\x75\x3d\xe1\xf8\x09\x85\x08\x22\xd6\xf3\xdd\xe0\x90\x7a\xa8\xca\x63\xe7\xdb\x8d\x9f\x41\x40\x6a\x0b\x6e\xca\xe3\x29\x87\x06\x7a\x22\xbc\xf9\x67\x16\x00\xcc\x86\x87\x3f\x1f\xfb\x0c\xca\x28\xa0\xc0\x03\x29\x81\xf6\xc8\xda\xe5\xa1\xb5\x61\xc6\x4f\x29\x21\xc1\x6d\x64\xb1\xdf\x67\xe7\x62\x9f\xbd\xc0\xbe\xfc\x2b\x13\xc5\xd5\xa0\x93\x06\x74\xd0\x71\xcb\xb8\x88\x82\x13\x63\xbf\xcd\x0a\xc7\x03\x15\x5b\xb2\x2c\xa1\xb5\x07\x8d\x0e\x5f\xa8\x7b\x54\x95\x44\x68\xda\x9c\xc4\xe5\x39\x2b\xdc\xb6\x3f\x00\xd8\xb7\x2d\x28\x26\x0d\x30\x88\x54\xcf\x22\x79\x78\xa0\xa4\xc1\x59\x6a\xe1\x32\x1d\x87\xcc\x75\xf0\x96\x07\x9a\x44\x88\x8b\xae\x30\xa2\xf9\x2d\xab\x07\xe1\xfd\xd1\x2b\x40\x2c\xd3\xbe\xea\xb2\x2e\x73\xc7\x24\x89\x34\x83\x18\xc2\xf7\x0e\xf6\xf8\x13\x99\x38\x45\x42\x71\xbb\x0d\x78\xad\xa2\xd1\xa5\x8d\xe1\x68\x9b\xb7\x7b\xd4\x93\x68\x37\xa0\x55\xa5\x48\x80\x16\x91\xe5\x94\xf3\x6a\xb1\xf6\x84\x30\xe0\x11\xee\xce\xa2\x19\x90\x54\xf2\x90\x84\x12\x3f\xf4\xef\x70\x01\xed\xc0\x24\x1d\xee\x9d\x87\xc4\xed\x70\xb5\x37\x0c\x67\x40\x90\x6d\x2b\x83\x3e\x8b\x11\x59\x3e\x7a\xcc\x90\x30\x9b\x02\x7d\x7c\x7d\xba\xbf\x5b\xbc\x0f\x0c\x65\x1e\x46\x84\xe9\x5e\x7b\x78\xd3\xb4\x93\x7d\x7f\xf9\xed\x6f\x78\x6b\x7a\x67\x65\x34\x62\xc3\x84\x48\xe9\xaa\xda\x5c\x64\x11\x49\x58\xc6\x3d\x1b\x26\x89\xc4\xf7\x79\xb3\xa0\xc7\xa5\x9b\x33\xbf\x0e\x4b\xf3\x90\x06\xda\x96\x10\x9c\x8f\xa8\xc4\xbf\x74\x30\x0a\x7f\x98\x06\x29\xeb\xb3\x42\x4b\x47\x0c\x37\xe9\x25\x16\x51\x04\xcb\x21\x48\x63\x2b\xf2\x0f\x7f\x3a\x13\x14\xd9\x77\x04\x3a\xca\xce\x61\x9f\x1b\x50\x21\x13\xd2\xc3\xca\xed\x96\x25\x9a\xac\xd8\x6f\xcf\xa7\xbc\xfb\xa0\x0c\x6c\x96\xaf\x12\x9f\xd8\xe4\xd5\xfc\x36\xee\x28\x4e\x0d\xfa\xb6\xd0\x4e\x11\x04\x20\xad\x0b\x5b\x45\xfd\x7a\xee\x46\x4b\xaa\xa3\xa0\xaf\x10\x7a\x11\x47\x5f\xae\x5d\xcd\xd5\x77\xf2\x50\x10\x85\x85\x34\x6f\xe2\x32\xe9\x71\x11\x0b\x4f\x93\x69\x0d\x94\xb5\x2a\x37\x1d\x6d\x23\x0f\x55\xa0\x65\xdc\x15\xa1\xb7\x26\xcf\x23\x74\x8f\xa1\x62\x8d\x04\x84\x4d\x06\xd5\x4b\xd9\xfd\xaa\xac\xbe\xb5\x15\x8b\x59\xd8\x01\x3b\x7e\x49\xa5\x53\xdc\x40\x90\x48\x73\x2a\x37\xc3\x43\x2d\x2d\x85\xdf\xa0\xae\x6b\x76\xb1\x0c\x21\xb6\x9c\xf7\xcf\x7f\x2e\x45\x35\x88\x41\xf1\x10\x52\x8e\x96\x93\x3a\x1f\xdb\x2d\xad\x5d\xfc\xdb\xd9\xed\xf7\xbc\xd0\x24\x82\x47\x03\xd0\xc8\x5a\x43\xd1\x64\xcd\x65\x36\x80\xc4\x49\x10\x31\x6d\x31\x26\x96\x42\x03\xc4\xb1\xdb\x36\x7e\xf3\x6d\x12\x43\x7d\x21\x29\x2a\xc7\x7a\xff\xc7\x32\x37\xbe\x94\x1d\x31\x15\x12\x39\xfa\xb3\x94\xa5\x6a\x37\x39\xfc\xcc\x64\x0e\x76\xf9\xb1\xe9\xf7\xd1\xcb\x92\x50\x24\xa1\x23\x75\x77\x89\xaf\x7a\xd2\x82\xc8\x34\x20\xbd\xa6\xbb\x0d\x70\x2d\xc5\x69\xda\x0c\x34\xc2\x01\xa4\x28\x3e\xc6\x36\x25\x89\x42\x5b\x39\x81\x86\x02\x32\xd5\x0d\xa2\x0a\x9c\x44\xcc\x2e\x6b\xcf\xeb\xbf\x57\x61\xe1\x24\xe2\xca\xb8\x10\xe8\xf2\xa8\x6d\x19\x5d\x39\x7d\xab\x38\x0e\x2c\xc3\x0f\x96\x6a\x8f\xee\x16\x73\x9b\x68\x43\x49\x19\xe4\x23\x77\x50\xe8\x79\x2c\xd8\x78\x6c\x90\x24\x4a\xa9\xf4\x2b\x4e\xe6\x39\xf0\x43\x5f\xd8\xc8\x49\xc2\x15\x46\x30\xff\xfd\xc7\x70\xdd\x23\x34\xb4\xf5\xf2\xed\x1a\xd5\x2f\x40\xfe\x60\x64\x41\xe7\x2e\x90\xd8\x3a\x51\xed\xa0\x19\xdf\x99\x4a\x89\x81\x00\x53\x37\xae\x34\xa4\xed\xc9\xb7\xb2\xc2\x0a\x30\x28\xca\x63\x56\x88\x0e\xc6\xdd\xb6\xb7\x24\x29\x38\xe5\xe1\x7c\x74\x5a\xeb\xdd\x61\x43\xb0\x24\x6f\xe3\xad\x2c\xc2\x24\x21\x96\xfa\xb6\xfc\x0b\xba\xf2\x44\x7f\x94\xc7\xa1\x1a\x15\xac\x39\x89\xf3\x6e\x57\x21\x29\xe5\x48\x72\x57\x56\xd9\xfe\xf9\xa3\x19\x04\xbd\x39\x11\x41\x88\xe5\xda\xc3\xf5\xe7\xeb\xe6\xbe\x3b\x4c\x18\x5a\x3f\x3f\xac\x72\xfa\xb3\x98\x18\x1e\x44\x68\x2d\xb5\x2b\xfa\xfd\x71\xce\x0b\x3b\xda\xef\x2e\x8b\x0a\x26\x16\x3a\x91\x24\x8a\x83\x0e\xfc\x52\x35\x6b\x55\x4e\x92\x30\x9c\xc8\x88\xe2\x90\x6e\xc4\x47\x67\x31\x10\x99\x6a\xcf\x2d\xea\x02\x8a\xbf\x2a\x79\xe2\x44\x51\x30\xbc\xf3\x78\x36\x50\xe8\xdb\xd5\xd4\xfe\x94\xd4\x1a\x25\x4e\xef\x6c\x5b\xda\x3d\xa5\xaa\x6f\xf2\x53\x72\xa2\x80\x21\x2d\x43\xeb\xf7\xdb\x60\x9a\x63\x25\x1e\xae\x7d\x44\x8b\x10\xc4\x24\xef\x77\x45\x4a\x7b\x3b\x39\xcd\x09\x0c\x49\x76\x87\x1a\x01\x9c\x40\x14\x63\x19\xb2\x05\xd5\x0b\x03\x9d\x8e\x43\xde\x35\x51\x01\x66\xdd\xfc\xed\x31\xa5\xec\x65\xe7\x7e\x29\x58\xd4\xbd\xa7\x09\xb8\x70\x7b\xf9\xd7\x2a\x9b\x83\x29\x70\x62\x64\xa2\xdd\xbe\xf2\xad\x6c\x00\x4d\xc4\x31\x5a\x84\x47\x61\x68\x6d\xfd\x01\x55\xaa\xff\xee\x51\x48\x62\xdc\x02\xec\x0e\xb7\xae\xeb\xf3\x74\xc3\x8e\x48\x08\x18\x51\x3b\x9d\xeb\xc3\xca\x65\xd4\x46\x1f\x31\x22\xa9\xc6\x1a\x03\x47\x3b\xe7\xd3\x83\xff\x08\xec\xc1\x23\x22\xa5\xb1\xeb\xf9\xf1\x54\x56\xa2\xba\xac\x6a\x25\x4e\x80\x24\x62\xbf\x20\x2f\xe4\x51\x14\xd8\x88\xdb\x6a\x93\x97\x4d\xbd\x5e\xbe\x6e\x2d\xd6\xff\x94\x97\x97\x49\x00\x95\x47\x11\x0b\xa4\x73\x3f\x57\x1a\x91\x55\x18\xf4\x99\x56\x32\x4f\x03\x62\x3c\x8a\x45\x82\x39\x2c\x79\xbe\x5c\x09\xac\xf0\x28\x09\x2d\x83\xde\x41\xd4\x6f\xa2\x46\x28\xc0\x5f\x7d\x36\x88\x47\x09\xb3\x62\x91\x23\x3d\x43\x1e\x51\x06\xb1\x45\x37\x35\x50\x6d\x8e\xc2\x0b\xc8\xb4\xd6\x69\x80\x79\xd8\x4c\x95\xe4\xb9\xdb\x67\x23\x96\x98\x30\x76\xd8\xf2\xac\x82\xac\x36\x53\x4a\x2b\x6c\x83\x9f\xe1\x0e\x9a\x2d\xd4\x4d\x18\x86\xdd\xd9\x3c\xe6\x36\x0f\x8b\xc0\xa4\x2e\xe8\xc4\x23\x4c\x9a\x3a\x15\xc8\xe9\x7a\x3f\xbe\x3a\x8f\x43\x4c\x53\x3d\x03\xa6\x0a\x86\x6b\x79\xc4\x59\x60\x55\x8f\xce\xf2\x5c\xdf\xe5\x42\x4d\xf6\xbb\x88\x73\x90\x03\x0e\xf0\xac\x2c\xea\xd7\x1f\x8e\xd9\x7f\x7c\x9b\x34\xb2\x14\xdb\xcf\x8b\xed\xee\x6d\xf1\xbe\x7d\x59\xbd\x6f\x7c\xb2\x76\x18\xbc\x88\xbc\xad\x25\x2c\x96\x78\x30\x03\x67\xc7\xcc\x8d\x4c\x03\x8f\x84\x8a\xd0\x98\x2c\x8d\xd9\x1e\x2a\xa8\x0f\xbd\x55\x16\xc9\x38\x41\x37\xbb\x12\x9f\x5e\x8a\x77\x32\xb7\x24\x93\x21\x38\x8d\xd6\xff\xb2\x88\x93\xc9\x08\x51\xc4\xd7\xf5\x97\x1f\xe7\xd3\x3b\xec\x5f\x06\x34\x7c\xbe\x0d\xd7\x98\x4c\x39\xda\x8c\x99\xa3\x44\x1a\xb2\xbb\xf1\x48\xa9\x14\x67\xf1\xf2\xe5\x65\xd4\xf7\x0a\x62\x64\x68\x83\x9f\xa7\x63\x79\x13\x16\xeb\x1a\xeb\xc4\xea\xbb\xed\xf2\x76\xf0\xb7\xe6\xd5\x55\xa5\xed\xdf\xfc\xf7\x17\xd2\x02\xc3\xf3\x98\xe5\x74\xa9\xd9\x5f\x99\x90\x11\x30\xcf\xfa\x72\x2c\x7f\xc0\x37\xa8\x2c\x74\xb8\x9c\x95\x12\xe6\x91\x21\x1c\xe1\x7f\xc8\x14\xf9\xf5\xa4\x9f\xb3\x62\x93\xed\x8b\xf9\x28\x60\x64\xa8\x40\x20\xcc\x09\xca\xde\x07\x88\x0c\x93\x9e\x94\x17\x1d\xe1\xff\x3e\x97\xcd\x64\x6f\x8c\x83\x84\x20\x64\x3c\x73\xb2\x40\x38\xf3\xff\xa7\x93\xd9\xe8\x26\x4a\x1c\x28\x2b\xc4\xb6\xf3\x65\xc0\xa3\x1a\xeb\xf1\x46\x18\x87\x49\x9a\xe0\xd3\x9b\x06\xaa\x1d\x56\x19\x93\xdd\x11\x9a\x83\x97\x13\xe3\x71\x28\x92\xc8\xed\xad\xbb\x21\x8d\xfb\xf8\xf1\x42\xc9\x1c\xb5\x87\x33\xca\x2c\xaa\x61\xda\x8c\x04\x1a\xc9\x02\x7e\xd8\x38\xb3\x2d\x08\xf1\xc7\x58\xaa\x7d\x3c\xda\x96\xc3\x75\xdc\xed\x57\x41\x68\x1e\x13\x11\x61\xf0\xf8\x24\x2e\x2e\x10\xd8\x1d\xd0\xe0\x2a\x5f\x9c\xdd\x34\x20\x94\xe2\x31\xd1\x0a\x6d\x2b\x91\xe7\x83\xe5\x2f\x8e\x42\x1e\xcb\x01\xf1\x34\x26\xec\xc6\x77\xbf\x59\x8b\xca\xe3\x98\x4a\x84\x19\x36\x99\xad\x71\x19\x0a\xb2\xf1\x38\x56\xc0\x43\x57\x20\xd7\x41\x6b\x78\x9c\x84\x36\x18\xb5\x39\xe5\x59\xe3\x7a\xed\xb6\x31\x11\x27\x44\x63\xc0\x63\xb9\xd8\x5e\x41\xd8\x86\x3b\x6d\x9c\xc4\x4c\x78\xee\x7f\x44\x7e\x5d\x7d\x85\x44\x72\x0a\x8e\x32\xc5\xa1\xdd\xfb\x38\xbe\x15\xd6\x6e\x8d\x9b\xef\x59\xa1\x7d\x59\x19\x8f\x13\x25\x91\x93\xec\xf1\xf5\xe9\x7e\xdb\xfd\xa8\x13\xd1\x7e\xcf\xaf\xa7\x7d\x25\x34\xa0\x50\xde\x14\x2f\xd8\xb6\x62\x68\x79\x37\xe7\xe2\xb6\xe8\xe7\xf8\x11\x69\xc8\x51\x05\x61\xb7\x87\x66\x59\x09\x69\x35\x64\x1b\x31\x29\x44\xe3\x31\x55\x91\x57\x7f\x6a\x57\xa4\xae\x98\x15\x6b\x93\x31\xae\x30\x94\xab\xe2\x31\x0b\x89\x21\x38\x03\xf1\xdd\xdf\x10\x33\x35\x99\xd4\x31\x8b\x62\xee\x80\x13\x1b\xc8\xf3\x7b\x38\x8a\x62\xda\x89\x2c\x4a\x88\x2b\xd7\xbd\xb3\x34\x38\xcb\xb2\xd0\x23\x28\xf4\xe4\x9d\x78\x10\x61\x1c\xbe\x67\x40\x58\x7e\x59\xbd\xdc\xaf\x26\x25\x81\x3c\xe6\x61\x04\x41\xb7\x12\xcf\x80\x8c\x7c\xbb\x88\x46\xa4\x43\x5b\x22\xfc\xb0\x23\x0c\xe4\x31\x4f\x41\x53\x17\x68\x14\x15\xac\x0b\x67\xd7\xfb\xdd\x65\xb8\xe9\x84\xee\x9c\x94\x73\x4f\x35\xea\xd2\x13\xe5\x79\x7f\xf0\x4b\x7b\x2c\x22\x40\x03\x5d\xb6\xeb\x7d\x06\x35\x9a\x61\xdd\x38\x17\x82\x69\x5f\x4d\x91\x35\xe7\x5c\x64\x55\x87\xe2\x48\x26\xbd\x27\x1d\xd1\xe2\x05\x44\xd5\x80\x38\xee\x9a\x76\xfc\xec\xfa\x62\x05\x1e\xeb\x90\x21\xf4\xec\x5e\x54\x1f\x15\x14\xb9\x28\xf4\x70\x3f\x89\x4d\xcc\x8c\xad\xf7\xd5\x67\x05\xcb\x76\x00\x37\xf5\x6f\x33\x88\x3c\x3e\x59\xf4\x0c\xa5\xe8\xed\x38\x30\x27\x3c\x8f\x63\x75\xb1\x51\x12\x3d\xf0\xe7\xc5\xfb\x1f\xe3\x3b\x6a\x8b\x58\x41\x67\x78\xf5\xd3\x9a\xe8\x58\x92\xec\x5a\x24\x81\xa0\x08\xfc\xf5\xc6\xf4\x7d\x69\x1a\xb4\xa8\x86\x93\xdb\xb7\x95\x0c\xa3\xfb\x4f\x9b\xfb\x89\x7e\x21\x4f\x02\x45\x30\xb1\xd4\xee\xf1\x50\xd5\x9d\x14\xca\x68\xa7\x4d\x02\x13\x08\x2f\x21\x54\x95\xc7\xb2\x01\x3d\x92\xe2\xc5\x82\xeb\xe1\xab\x25\x61\x90\x60\x66\xa9\x16\x3f\x40\x8f\xd8\xed\x78\x12\x4a\x65\xa1\x1d\xc2\xc0\x1b\x54\x6a\x7e\xd0\x25\x24\x96\x08\xe6\x39\x88\xfc\x47\xeb\x4c\x3a\x19\x6d\x7f\x34\x09\xb0\x88\xfd\xe3\x22\xa1\x72\xb4\xa2\x6f\x55\xf9\xf3\x32\xae\x44\xe6\x49\x14\x59\x86\xbb\x3d\x34\xcf\xd0\x88\x2b\x1e\xf9\xb6\xc5\x40\x20\xe4\x03\x8a\xe7\x6c\x18\x54\xf6\x8d\x98\x25\x3b\x39\x17\x83\x08\xfa\xff\xfc\xef\xa4\x00\x95\x27\x91\x4a\x63\x24\x64\xcd\x1a\x55\x66\xc5\xef\xdd\x86\x90\xc4\x24\xc4\xc5\x49\x9c\x9b\xd2\x65\x0f\xc6\xbd\x1c\x33\x8d\xa2\x23\xb7\x9c\x86\xf1\x53\xc7\x92\xa5\x16\x06\xa6\xc5\x20\xa5\xfd\x4f\xaa\x5f\x66\xa2\xea\x09\xa5\x1c\x9f\xdb\x6b\xd2\x6c\x33\xf5\x01\xbf\x94\xad\xe0\x09\x23\x3c\xa4\x2e\xab\x6e\x4c\x96\x67\x43\x59\xb4\x91\x55\x98\xb0\x54\x33\xc7\x17\xb9\x2a\x9a\x6b\x52\x21\x3b\x84\xe6\x07\x02\x33\x56\xd4\x1f\x93\xec\x3f\xa0\x72\x22\xe1\xfd\x37\xe8\x09\x36\xda\xc6\x0a\xc7\x85\xa8\x6b\xa8\x9a\xd5\x7f\x22\xb7\x0c\xb9\xe7\x71\xad\x78\x28\xfc\xa0\xc0\xa2\xd4\xe5\x48\xb4\x6e\x6c\xaa\x27\x9c\x50\xc1\x9c\x45\x6b\x4b\xca\x27\x28\x23\x9e\xf0\xc8\xf2\x32\xbb\xf2\x1f\x0b\x5b\x9b\xb6\xa1\x49\x08\x1d\x13\x42\xe1\xe2\xe9\x37\xf2\x9e\xfe\x1c\x90\xcc\x59\x0b\x1b\x55\x56\xe3\xf5\x23\xe1\xc6\x42\x82\xdc\xb9\xad\x91\xdc\x1a\xb0\xfe\xb9\xd3\x10\x6c\xce\x3f\x43\xd0\xdd\x32\xcf\x5a\xd3\xf6\xcd\xee\x47\x5b\x51\x7f\x74\x0d\x4d\x8a\xa6\xa5\x97\xdf\x5b\x8a\x6a\xa1\x7f\xfc\x22\xc3\xcd\x13\x19\x82\x74\xf1\xf2\xd5\xfa\xc1\x5f\x48\xf2\x60\x44\xd1\x84\x46\xe6\xba\xc8\x9a\xec\x17\x89\xa7\x44\x2a\x96\x38\x7b\xec\x0e\x9d\x71\xac\x05\xf3\x99\xa0\x39\x27\x3f\x51\x2a\x4d\xd9\xbc\x14\xe3\xd0\x21\x4e\x14\x30\x74\x89\x5c\xf5\x78\xeb\xd3\x4d\x94\x2e\x79\xa2\x05\x0f\x99\x2d\x08\x87\x0a\x03\x64\xe0\x19\x58\x5d\x0b\x48\x01\x4b\xc6\xa1\x52\x9e\xaa\x80\x27\x46\x50\x64\xef\x3b\x55\xd9\x5f\x30\x9e\xc8\x46\xc6\x1d\x15\xdf\x83\x95\xb5\xac\x67\x58\xc2\xba\x1e\xa0\x01\x53\x88\x61\x69\xef\xeb\xdd\x8f\xa9\x31\x45\x03\xd0\x09\xed\x36\xe1\x75\x03\xc7\xef\x55\xd9\x3d\x24\x25\xa9\xc2\x64\x41\xfb\x8e\x6e\x00\x5f\x57\x81\x73\x4a\x84\x71\xe5\x85\x2e\xe5\xda\x17\x43\x8d\x6f\x17\x39\x25\x86\x67\x51\xfd\x35\x88\x6f\xd3\xd6\xb4\x76\x70\x98\x55\xdd\x5c\xa5\x4a\x69\x1c\xd9\x4a\x98\xe7\xc5\x1f\xbb\xd7\xb7\x4d\x77\x5a\x2c\x70\x68\x9c\x6b\xa8\x50\x1e\xde\xa2\xff\x26\xe1\x93\xf9\x15\x80\x26\x26\x46\x4a\xa7\xe3\xf1\x6c\xa3\xb8\x03\xaa\xfd\xae\x89\x45\xc5\x3c\x95\xfb\xbb\xde\x2e\x9c\x5d\x56\x06\xd6\x3d\xa5\xa0\xa9\x9b\x94\x77\x79\x59\x5e\xf3\x62\x73\xca\x02\x82\x01\xb9\xf6\x85\x56\x2f\xf7\xbb\xbb\xa7\xd7\xe5\xef\xbb\x97\xaf\xcf\x77\x9e\x64\xb7\x6d\x43\x31\x2d\xe2\x5c\xef\xd6\x16\x29\x8b\xf6\xbd\x86\xa3\x96\xf2\xc8\xda\x03\x0a\xf1\xea\xcd\xb3\xc8\x0a\x75\x10\x59\xf1\xf8\xf6\xc7\x0c\xfb\x14\xa7\x5c\xf1\x8e\xcf\x4c\x34\x70\x77\xd9\x74\x84\x8e\xfd\xe3\xa5\x1c\x70\xe1\xde\xd9\xb5\x67\x10\x71\x9e\xf6\x67\x48\xaf\xfd\x0a\xbf\x6f\x51\x21\x63\xe9\xd7\x72\x4b\x6e\x88\x35\x4e\x03\xc0\xa5\x5f\x62\xa9\xe4\x71\x2c\x3d\x8d\x39\xda\x01\xfe\x80\xb1\x85\x05\x9b\xec\x78\xca\x01\xc5\xb9\xab\xb3\x6a\xca\xca\xb1\xe8\xce\xbd\xa3\x4a\x02\xf4\x36\xf0\x62\x5d\x7a\xbd\xcf\x34\x52\x25\x0c\x86\x50\x6d\x85\x72\xf5\x6a\x36\xa5\xca\x44\xde\xa5\x4d\xe6\x47\x8c\x32\x36\x86\x71\x7f\xae\xb2\x72\xbb\xda\x78\x47\x82\xea\x80\x78\x5d\xfd\x2f\x65\xde\xce\xf2\x21\x03\x13\xa7\x9a\x0b\xe4\x11\x41\x17\xd5\x88\xbc\x86\xd5\x7f\x5e\xca\xa7\xb2\x9b\x67\x10\x50\x13\xb9\xdd\x60\xb5\xfd\xd2\x94\x23\x11\x61\xdf\x28\x66\xb8\x02\x58\xdf\x1e\xfd\x9e\x5c\xdc\x30\xd7\x29\x28\x83\xdb\xa8\x2e\xdf\x61\xa0\xdf\xc3\x29\x68\x81\xe6\xb9\x4f\x15\xad\x0a\x7d\x2a\xb3\x6e\x54\xfd\x6b\x7c\x15\xc3\x90\xd4\x15\x44\x55\x20\xea\xe6\x3b\x64\xfe\x42\x46\x46\xe1\x80\x87\xe1\xf5\xdc\x9c\xce\x0e\xdd\x6e\x09\xb5\x38\x0b\x78\x8a\x46\xd9\x9b\x28\x74\x59\x89\xbf\x93\x19\xe3\x2c\x48\x43\xac\xef\x5f\x2d\xee\x6c\xe3\xd9\x46\x86\xdb\xb9\x73\xe9\x19\xb1\xdd\xa1\x30\xb0\x92\x45\x35\xfc\xe8\x0c\x5f\x16\x06\x06\x91\xd7\x56\xc8\x76\x28\xa8\xc6\x59\x18\x12\x9f\xc8\x45\x41\x64\xf4\x01\xc7\xab\x1b\x0b\x53\x40\x8c\xd5\xfd\xe2\x74\x7a\x29\x35\xbc\x09\xf5\x21\xf6\x70\x9f\x55\xc8\x85\x70\x23\xc9\xc6\x42\x91\xa2\x85\x8f\x82\xdb\x03\x81\x52\xce\x48\x10\xe0\xca\xb3\xca\xb3\xfd\xf1\xff\xe3\xec\xdd\x96\x1b\xc7\x91\xad\xe1\xd7\x99\x8b\x7d\x41\xf0\x08\x5c\xca\xb6\x5c\xe5\x5d\x96\xad\xdf\x52\x55\x77\xcf\xc4\x84\x22\x01\x24\x6c\x8e\x29\x52\x43\x52\xae\x72\x3f\xfd\x1f\x4c\x00\x3c\x89\x76\xf7\xfe\x6e\xba\x3a\x0c\x90\x22\x41\x1c\xf2\xb0\x72\x2d\xb0\x59\xa2\x8f\x0a\xbb\xfc\x25\x18\x91\x05\xa2\xf3\x46\x9e\xeb\x86\xf6\xb7\x9b\xf3\x98\xf9\x9a\x67\x51\x60\x7d\xec\x12\x7f\xf9\xe0\xc1\x7e\xbf\x71\x3c\xe9\xa2\xef\x15\xc7\x99\x43\x8c\x5a\x56\x10\xb7\x32\xc7\xc3\x18\xf1\xc8\x42\xde\xf3\xf2\xf9\x5c\x40\x7d\xb3\xff\x71\x0f\xe7\x72\x14\x28\xfe\xbf\x96\x1a\x4d\x26\x67\x16\x89\xd8\xb8\x2a\x79\x17\xcd\x23\x71\x87\xcb\x98\x77\x16\x49\x95\xba\x32\xb0\x6e\xf1\xc0\x45\x87\x38\xce\x12\x2f\x9e\x59\x40\xd3\xf4\x05\xd2\xde\xdc\xc9\x62\x99\x52\x31\xba\x27\xee\x19\x54\x86\xa7\x43\x1c\xeb\x88\x28\x05\xce\xa5\xec\x8e\x3b\x8b\xf9\x1c\x82\x2c\x59\x12\x59\xef\x72\xb3\xba\x7b\x38\xec\x56\xf7\xeb\xc3\x8f\xd5\xfd\xf7\xf5\xe1\x7a\xb5\xed\xbb\x48\x49\x2c\xc5\x9e\xcc\x60\x3b\x56\x82\xfb\x7c\x48\x12\x1d\x93\x5a\x70\xbb\x50\x98\xe3\x8e\xa3\x2c\x65\x96\x47\xa3\xb3\xbd\x6c\xa6\xe4\x1a\x8b\x62\x79\x03\xc8\x32\x93\x85\xda\xef\x49\xe7\x7a\x76\x12\x67\x3c\xb4\x3c\xc1\x14\x1a\x5f\x4c\xb3\x67\x5c\x04\x91\x13\x9f\x70\x42\x5f\x6b\x92\x82\xf0\xcd\x32\x4d\xc1\x05\xcd\xce\x0d\xee\xe0\xad\x1f\x2a\x81\x4c\x90\x3c\xbb\x85\x78\xac\x8a\xe2\x16\x7b\x37\x33\x83\x80\x83\x75\xed\xab\x62\x60\x5b\xe2\x19\x68\xed\x10\xc7\x1a\x8b\xfc\x7c\xfc\xeb\xed\x42\x26\x56\x95\xb0\x57\xe5\xdb\xd6\x95\x04\x99\x17\x7e\x0f\xf7\x23\x27\xd3\x8c\x36\x60\xbb\x75\x7a\x3c\xf2\xf4\x75\xa5\x4e\xc9\x63\x6f\xb0\x9d\x1c\x19\xfe\x50\x4b\xdc\xa9\x96\x29\x96\x69\x61\x8d\x34\xca\x86\x62\x51\x8c\x89\x8a\x78\xa6\x42\x1b\x01\xf9\xe9\x65\xb8\x97\x70\x2c\x99\x52\x96\x91\xb1\xc6\x53\x81\x65\xde\xbc\x5c\xd0\x66\xf3\x4c\x07\x21\xa1\x38\x3a\x93\xf4\xfe\xcf\xa9\xcc\xea\xf4\x6e\x3a\xb5\xd0\xc1\xe3\xe1\x78\x2e\x5a\xaa\x21\xd7\x4f\x36\x8b\xd1\x7f\x31\x2d\xc1\x10\xc8\x17\x51\xef\x7f\xe2\x42\xf9\xd7\x64\x74\xb5\x4a\x29\x53\xeb\x2a\xa6\x3b\x1f\x7d\xd5\xbe\x14\x38\xf2\xc7\xfe\x42\x15\x6a\xf6\x32\x4a\x18\x67\xe4\xdd\xa2\x33\xc5\xf9\xac\x0f\x0a\x46\x1b\xb8\xb2\x33\x67\xaa\x7f\xc9\x33\xd4\xcc\xd8\x6c\xf6\x3b\x05\x86\xbf\x62\x51\x54\x13\x7b\x28\x43\x9d\x10\x79\xca\x09\xde\xfd\x32\x6c\x36\x50\x9e\xa1\xe8\x53\xf1\x19\x6a\x20\x33\xd4\xfb\x73\x61\x60\x9f\x26\x0c\xfe\x67\xf2\x6f\xbf\x87\x18\x91\x51\xf1\x5c\x09\x47\x6c\x4e\xa0\x70\x0f\x17\xa9\xd0\xcc\x08\x4b\xf2\x6e\x7f\x8d\x6c\x26\x5b\x21\xfc\xc1\x0a\x35\x9a\x11\xc2\xa2\xb3\x76\xfe\xb7\xca\xcb\x05\xac\xde\xd2\x80\xce\x86\x8c\x07\x61\x64\x86\x24\x3e\x11\x32\x10\x22\xe3\x22\x18\xeb\xfb\x0b\xab\xa2\x54\xdb\x32\xf8\x75\xfb\x42\x31\x46\x9f\xc5\xe2\x2c\x08\x5d\x64\xca\x2a\x90\x12\x87\xed\x16\xea\xd7\x51\xe1\xa4\xeb\x1a\x86\x21\xa0\xcf\xdd\xae\x8f\x90\xfb\xfc\x1a\x8f\x58\x48\x35\x82\x1a\xbb\xf9\xb2\xaf\x4e\xb9\x72\xf2\xdf\x49\xdf\x43\x46\xa9\x5f\x6e\xee\x3b\x2d\xad\x13\x1e\x09\x9e\x38\x5e\x9a\xda\xd2\x6a\xf5\x58\x03\x1e\x47\x40\x94\x85\x79\xb3\xcf\xb1\x66\xb3\x2b\x63\xcc\xb8\x13\x0f\xba\x29\xbd\xdd\xc2\xd3\x10\x53\xfb\x68\xd0\xbe\xdc\x40\x0b\x07\x23\xfa\xb6\x58\x50\x36\xfb\x5c\x5a\x1d\xde\x19\x25\xb7\xef\x25\x93\x30\x1d\xd8\xd3\x49\xaa\xf9\x1f\x33\xdb\x97\x67\xc2\xe2\x31\x25\xb6\xd6\x91\x23\x2a\xe9\x27\x78\xc5\xaf\xd0\x5c\xa1\xad\x57\xe8\x7c\xb2\x72\x55\xea\xad\x8d\xce\xcc\xdd\x33\xce\x03\x4b\x4f\x7c\xaa\x4e\xe7\x62\x7c\xd8\x73\x8e\x96\x6b\xc7\x91\x9c\xec\xab\xef\x9d\x0d\xb7\xb0\x8c\x39\x70\x45\xf5\xee\xab\xa7\xab\x3b\x7f\x35\xa8\x98\xf2\x08\x5b\x6c\xeb\x4a\x0d\x8e\x18\x07\xa5\x49\x8e\x29\x6f\x9a\x33\xda\x52\x9c\x8b\x03\x6c\x16\xa4\x9c\x78\x45\xd3\x81\x92\xa1\x95\xce\xd8\xb5\xd5\x50\xcf\x31\xbb\x7c\xa1\xca\x83\x73\x29\x39\x01\x53\xd6\xdf\x9f\x0e\x8f\xc7\x32\xd7\x56\x78\xc3\xb7\xaa\x8c\x2b\x8f\x13\x1c\x97\xe8\xf6\xed\x9c\xea\xba\x6d\xc2\x67\x5f\x7d\x6f\x96\x4a\xb5\x39\x57\x61\x4a\xf1\x06\xbb\xc1\x3d\xe0\xcf\x1f\x16\x06\xf2\x97\x15\x9f\xb3\x57\x18\x5c\x3f\xae\x62\x8b\x47\xc8\xdd\x5c\xb6\xc5\x40\x07\x87\x5b\x9f\xcd\x23\x95\x08\x21\xdc\xee\xbe\xa9\xb4\x3f\x3e\xb9\xc2\x94\xa2\xfc\xb9\xaa\xa6\x51\x23\xae\x59\x44\x6b\xe1\x4b\x75\x5b\xd5\xce\x24\xeb\x9b\x0c\xa4\x5e\x9e\xb4\xe5\xff\x98\xb2\xb8\x70\xae\x23\x4e\x48\xbc\xb7\xaa\x1d\x07\xda\xb9\x4e\x38\xe5\x77\x8a\x5c\x61\xd9\xe0\x1e\xeb\x63\xf3\x15\x9a\x4d\x5e\x5e\x57\xcd\xb2\x1c\x3b\xe7\x18\x64\x04\xe4\x6c\x5e\x4e\x93\x72\x03\xdf\x1c\xba\xe0\x9a\xad\x39\xf4\x95\xaf\x7d\xab\x2d\x57\xf6\x8c\xda\x3d\x57\x4d\xdf\x21\x62\xd2\x01\xe6\xaf\xaa\xaa\x70\x3c\xfd\x3d\x76\x78\x89\x88\x73\xf2\xfd\x31\x0b\x09\xcf\xee\x43\x4f\xfe\xbc\x5f\xcc\x4c\x73\xcc\x44\x20\x3c\xd0\x6d\x84\x62\xb9\xa9\xb0\x79\xa8\xac\xc0\xa5\xff\xfb\xa3\xd9\x54\x35\xee\x5f\xa0\x5c\xff\xca\x69\xae\xf8\x3a\x88\x1b\x47\x11\xd9\xbf\x83\x91\xc2\xc5\x00\x0e\x84\xf6\x39\x18\xec\x1b\x0d\x24\x94\x89\xb8\x5e\x3d\x3c\x3e\xdc\x5d\xaf\xee\x6d\x95\xcb\xed\x7a\xed\x91\x49\x82\x85\x9a\x7c\xcd\xdb\xbb\x87\xfd\xd3\xf7\xdf\x0f\x4f\xeb\xdd\xfa\xe9\xc7\xfa\x70\xbb\xff\x7d\xe8\x82\xe0\x93\xe2\x23\x28\xee\x87\xb3\x77\x3e\x6b\x87\x90\x96\x60\x69\x4a\xd2\xd3\x5f\x6f\x26\x39\x03\xc1\x38\xf2\x61\x1b\x27\x6b\x73\x32\x85\x45\xa8\x40\x5a\x69\xb8\x5f\x24\x2d\xdf\x6f\x83\xe1\x10\x0d\x18\xfe\x77\xd9\x30\x10\xa1\x0e\x69\xac\x14\x14\x8a\x68\xed\x3a\xf3\xe0\x83\xae\xc6\x2a\x42\x3c\x3d\x7e\x7f\xb8\x21\xa8\xa5\x7f\xd4\x48\x0b\x3a\x4f\xa0\x69\x3a\x5f\xbe\xbd\x90\x59\xf4\xfd\x4c\xac\xc8\x46\xbf\x9a\xbc\x69\x0c\x8e\x5e\xdc\xb3\x91\x91\x5e\xfc\x32\x43\x82\xbf\x44\x33\x1d\xb8\x92\x8c\xeb\xaa\x54\x78\x5a\xcc\x80\x4e\x07\x7c\xba\x43\x0a\xca\x13\xb8\x94\x15\xc2\xd1\x52\xf4\x4d\x7f\x26\x89\x65\x64\xd9\xc0\xf1\x2d\xaf\xce\xcd\x2c\x17\x21\x12\xad\xa9\x94\x6c\xa4\x60\x64\xf5\x13\xdf\xb0\xf3\x76\x6c\x18\xbf\x59\x11\x37\xc2\x90\x81\x18\x67\x19\x46\xcf\x3a\x7b\x3a\xc3\x13\xbb\x9b\x75\x46\xc0\xb8\xb0\x91\x8b\x34\xd0\x94\x8c\x39\x55\x45\xae\xde\xaf\xa1\xd4\xef\xd3\x94\x8c\x48\x45\x40\xba\x8f\x37\x00\x13\x67\xfe\x3c\x26\x5a\x9b\xbe\x6b\xaa\xb4\x48\x46\x4c\x06\x16\x6b\x4a\x1b\x91\xeb\x91\x65\x01\x61\xaa\xb1\x7d\xd9\x57\x93\x2f\xc8\xc3\x8c\xcc\x55\x24\x65\xcb\x52\xbd\xdb\x8a\xa6\x55\x51\xb8\x53\x7c\x24\xac\xc6\x05\x8f\x33\x2f\x19\x48\x08\xa5\x8f\xcc\x25\xc1\x41\x51\xe6\xf8\xec\x48\xa0\xe6\xa1\x5e\xc1\xa5\x60\xce\xca\xf8\x86\xef\x8b\x59\x6d\x21\x82\x94\xc7\x3e\x20\xb5\x2a\x26\x69\x37\x01\x2c\x34\x7d\x44\xce\x98\x02\x2d\xb5\xd6\xcc\x63\x13\x32\xb4\x40\xb9\xd3\x88\x49\x92\x0b\x19\xa7\xe4\x13\xea\xfc\x2d\x1f\x6d\xc1\x42\xa5\xcc\x31\x2d\xb5\x93\xd8\x77\xbf\x0e\x54\x9a\xd1\x1e\x44\x68\xfe\xe3\xa9\x7d\xbf\x1e\x82\x44\x42\x99\x84\x1c\x59\x97\x04\xda\x9d\x8f\xdb\x02\xfa\x56\x6d\x6c\xa1\xf6\x0e\x0c\x3e\xb8\xfc\xd6\xec\x61\x31\xb6\x80\x2c\x57\xd2\xe1\xa6\xec\x08\xf2\x3f\x19\x1e\x04\x8b\x47\x96\xa8\xaa\x23\x5e\x41\x5b\x54\x3d\x24\x42\x18\xad\x28\x88\x78\x53\x6d\xce\x4d\xae\xb6\x97\x3c\x21\x1c\x58\x67\x27\x12\xc4\x1a\x5a\xf5\x12\x1f\x72\x55\x35\xd6\x5f\x9d\x43\x30\x81\xc9\x8c\xd6\xff\x49\x7d\x90\x98\x86\x90\xd9\x8a\x2e\x8a\xcc\xaf\xaf\xf7\x63\x4f\x12\x42\xa1\xa8\x38\xb3\x3b\x46\x9b\x9e\xdf\x6c\x3a\x25\x20\x44\x0b\x99\xa3\x2a\xc6\xdd\xe1\xf6\xf1\xe9\xb0\x7d\x5a\xef\x56\xf7\x7e\xb7\x82\x28\xcc\x62\x27\xc8\xfd\xfc\x51\x61\x12\x24\x92\x11\x5e\x89\xe2\x11\x5f\x11\x48\x42\x65\xf2\x15\x21\x31\x81\xcd\x45\x38\x63\xf2\xa0\xa1\x3a\x8c\x85\x23\x5c\xbf\x34\x44\x61\x71\xac\xab\xd3\xe9\xba\xb3\x35\xc6\x31\x12\x48\x55\x4a\xc9\x6f\x47\x71\x53\x23\x12\x32\x6a\x94\x02\x8c\x83\xff\x39\x2f\xc8\xd1\x3a\x0e\x55\x0e\x59\xa0\xa9\x4c\xb4\x01\x83\x9b\xce\xb0\xce\xdf\x3e\x18\xde\x8c\x69\x8b\x48\xc6\x52\x6f\x3a\x97\xe1\x62\xe5\x5d\x10\xea\x2f\x1e\xdc\x90\x85\x48\xf1\x71\x2c\x55\xa5\x87\x42\xf3\xae\x93\x98\x41\x85\x20\xcb\xe4\xb0\x00\xed\x2a\xf3\x9f\x22\x93\x3c\x70\x79\xe8\x6f\x79\xdb\xbe\x5f\x57\xf5\xa2\x50\x19\x87\x0c\x19\x29\x99\xb8\x50\x3b\x0b\x36\x7b\x6f\x51\x03\x8f\x42\x42\x33\xbc\xe5\x55\x01\xe3\x7d\x09\xb8\x48\xbc\x84\xa9\x63\xb5\x1e\x22\xc3\xc0\xa5\x65\x0b\xfa\xe7\xfe\x5b\xe7\x06\xfa\xe2\x62\x0e\x22\x80\xc4\x06\x19\x5c\x79\x49\x75\x3a\xb0\xe8\x70\x83\x6a\x44\xb1\xc0\x41\x20\x27\x12\x4d\xe2\xd8\xbf\xb2\xe9\xe1\xeb\xea\x78\x8b\x38\x21\xcd\xef\x3a\x22\x01\x8b\x88\xce\xb9\xc7\x41\x02\x04\xdc\xfe\xd9\xc6\x0b\x7b\x5e\x28\x0e\x10\xc5\xb2\x17\x6f\x48\x0f\xd6\x55\xfe\x02\xcd\xf7\x06\x9e\x31\x0c\x82\x80\x42\xd4\xfd\xf3\x4a\xb0\x5a\x0f\x84\x78\x9b\x64\xae\x40\x1a\x8b\xcf\x3e\xc8\xb3\x26\x6d\x14\xbd\x2a\xf5\xa3\x31\xb9\x82\xc2\x12\x2f\x5e\x02\x14\x41\x1a\x49\x58\x47\x93\x97\x33\x7d\x0c\x0e\x8a\x09\x8a\xd4\x7c\xc1\x5f\x5b\x78\xdf\x63\xd3\x86\x93\x11\xd7\x59\x4a\xa9\xc7\x1b\xbc\xca\xa7\x0d\x26\x49\x6c\xb5\x3b\xda\x62\xfc\xfe\x19\x91\x85\x04\xdf\xda\x3e\xad\x6d\x6c\x8f\x05\x41\x70\xe8\xcb\xa0\x39\x20\xb7\xb5\x02\x25\xfe\x24\xce\xa5\xff\x53\xc0\x13\x4c\x12\x58\x7d\xd7\x6e\x63\x1a\x15\xa4\x80\x49\x23\x82\x4a\xc8\x56\x3d\x41\xde\x13\x16\x70\x30\xda\x0a\x48\x99\xbc\x1e\xd5\xb3\x4f\xbc\x01\x19\xc4\x96\x8a\xb6\x3b\x2f\xfe\x2e\x4b\x8d\xbf\x54\xc9\xd0\xd5\xbb\x7d\x39\x3d\x77\xe7\xd6\x78\xb6\x48\x16\x1b\x2f\xe6\x76\x6d\x79\x18\xa7\x4b\x41\xb2\x24\x90\xda\x8b\x2d\x80\x6a\x2d\x84\x6a\x54\x09\x22\x59\x26\x69\xc0\x9a\xf3\x09\x6b\x45\x45\x4a\x2f\xd0\xbc\x8c\xc8\x9b\xba\x3e\x8a\xd4\x76\xaf\x57\x0f\xd7\xeb\xfb\x7b\x62\xf2\x3d\xdc\xae\xfd\x2e\x29\xc3\xd0\xaa\x78\xb9\x0c\x38\xcd\xfc\x4f\xb1\xf1\x32\xcc\x42\x32\x86\x3a\x97\xea\xf6\x5c\x3e\xe7\x72\x54\xb3\xf9\x21\x3c\x4d\x86\xc2\xc2\x96\x1f\xb7\xeb\x27\xfb\x14\x5f\x1f\xef\x6f\xfa\x54\x9c\x0c\x05\x0b\x12\x5b\xe9\xae\x70\xc4\x10\x36\xfb\xf5\x04\x12\xca\x55\xd9\xe7\xbd\xc1\x5f\x2d\xd6\xf3\x74\x92\x3b\x48\x64\x8a\x56\x91\xe1\x4c\x03\xf8\xba\xaf\x89\x8a\xf3\x7d\xe1\x30\x95\x19\x0b\x32\x61\x03\xb1\x96\xd7\xe7\x4b\x0d\xa5\x5f\x64\x8b\x47\x87\xe4\x51\x44\x0e\x1a\x85\x31\xf2\xf2\xd9\x99\x66\x77\xa5\xa9\x06\x03\x66\x7e\x0d\xa4\x74\x32\x92\xef\xef\xca\xa7\xe6\x48\xfe\xd9\x15\x2a\xe1\x6a\xb4\xb5\x75\xb7\x7f\xa0\xc0\x6d\xd9\x9b\x37\x52\x08\x45\x4c\x21\xa7\x3a\x57\x54\xba\xe1\x4a\xef\x5c\x33\x84\xb1\x09\x7d\xe5\xa5\x13\x8b\x9c\x32\xb2\xcc\x7e\x54\x26\x96\xe8\xa3\x8f\xae\xde\x63\xf9\xdc\xd7\x83\x4b\x29\x90\x76\x9b\x32\x57\xf8\x7c\x7e\x8f\xfb\xbf\x3b\x24\xa8\xaa\x8e\xc7\x73\x99\xb7\xef\x5f\x09\x9d\xe4\x9b\x55\x98\xc4\x7d\x7d\x0d\xde\xa9\x6a\x44\x00\xf5\xf7\x96\x94\x4a\xe3\x34\x18\x48\xb7\x17\x09\xb7\xb9\x54\x10\x91\x6b\xfc\x80\xe7\x1a\x0a\x2f\x5d\xec\x1b\x75\x44\x0c\xb7\xe0\x52\x32\x95\x7a\x25\xc2\x92\xd9\x3d\x74\x26\xa2\x64\x22\x5d\x39\x9b\x30\x18\xc4\x54\x0a\xba\xd9\xdf\x7e\x30\x88\xa8\x81\xb4\x32\x47\xb1\xdd\x4d\x5e\x7e\x26\x24\x32\xbf\x01\xda\xd8\xc9\x50\x33\xbe\x2a\xab\xf6\xc5\xae\xcf\x8f\xb0\xe1\xee\x5a\x13\xca\x24\x1a\x61\xa3\x96\x67\x97\x0a\x98\xa0\x00\xf9\xfa\x98\x5b\x41\xad\xf7\x3b\x3d\x57\x20\xe0\x2a\x8c\x51\x48\x0f\x61\xde\x51\x68\xf9\x26\x87\x62\x41\xa1\x8b\xab\x50\xf1\xd8\x63\x28\xbe\x97\xb9\xaa\xea\x3e\xb4\xac\xa2\x0c\x2c\x56\xe9\x88\xa5\x1e\x9f\xd1\x2a\xe2\x90\xb9\xc4\x00\x85\xd5\xa9\xf6\x67\xf9\x91\x23\x69\x65\xc5\xcd\xb9\x3d\xd7\x48\xd1\x8d\x31\xbf\x29\x57\x91\x36\x99\x23\x7d\xb0\x04\xc8\x5b\xc7\xa1\xbb\x0c\x71\x56\x11\x86\x38\x14\x90\x13\xbe\x66\x16\x7b\x5f\xf2\xa3\x54\x84\x19\xd8\xac\x18\xe9\x14\x62\xe7\xcc\x92\x57\x48\xd0\xd8\xdb\xaa\x7e\x3c\x39\x2c\xc1\xe2\x46\xa6\x22\x13\x12\x0e\xec\xf4\xd6\x4e\x02\xf0\x2a\x89\x12\x4f\x89\xbf\xad\xaa\xb1\xec\x2b\x57\x09\xda\x6c\x8c\xf2\x78\x40\x57\x35\x34\xe4\xd0\x54\x1a\x2a\x7a\x2e\xeb\xdd\xdd\x0c\x72\xfb\x8b\x06\x97\x4a\x79\x92\xb9\x5f\xbb\xcf\x4b\xfc\x7e\xb2\xfe\xe0\xe1\x98\xcf\xd9\x8f\xb8\x4a\x75\x4c\x99\x03\xe3\xb0\x31\x24\x6f\xe7\x7f\x37\x0b\x80\x5c\x51\x12\x62\xee\x81\x2c\xbb\xce\x02\x25\x78\xf5\xf2\x28\x64\x89\xcd\xbe\x38\x1e\x40\xab\x74\xf6\x99\x0a\x2a\x57\x3c\x32\x99\x4d\xea\x48\xbb\x89\x1d\xf2\xb2\x33\x9c\x66\x13\x91\x2b\x0d\x59\x9f\x8f\xfa\xcd\xef\x64\xb3\x57\x12\xac\x97\xbf\xbc\xb6\xb5\x8f\xdd\x38\xf9\x77\x12\x46\xd0\xe1\xe9\xf8\x87\xd7\x50\x97\x84\x33\x5b\x94\x31\xfb\x7c\xef\x52\x20\x42\x8a\xff\x94\x08\x35\x36\xed\xb7\xb2\xfa\x59\x12\xb0\xc9\xff\x18\x40\x16\x3a\x68\xed\xfd\xfd\x8f\x03\xea\xbc\x3d\xb0\xb0\x6f\x55\x8c\x0f\x05\xbc\x84\x86\xfc\xb4\x9a\x51\xc9\xd0\x10\xec\xe8\x66\xfd\xd0\x8e\x0c\x34\xa5\x18\x27\x9e\x57\x79\xea\x3c\x64\x02\xe8\x7e\xb0\xd2\x90\xc5\x54\x79\x4c\xd9\xf5\xaa\x85\xe2\x75\xac\x61\xcf\x15\x46\x31\xb3\xcc\x56\xdd\x8c\xd9\xc2\xfb\xc8\x36\x51\x86\x09\x14\xa3\xfa\xd7\x4f\x2a\x2a\x94\x51\x8a\x4c\x83\xa7\xf5\xcd\xcd\xf5\xf5\xa3\x67\x99\xe6\xca\x18\x15\xb8\x6d\xe1\xe0\xcb\x6d\xa6\x9f\x59\x07\x2c\xa4\x98\x2c\x51\xf3\xdc\xf9\x67\xd3\x01\xc4\x9e\xff\xee\xa6\x7d\xd9\x4f\xe2\x32\xae\x0b\xe3\x4c\xf0\x41\x3d\x62\x57\xc2\xa9\x79\xa9\xda\x25\x39\x83\xae\xb3\x05\xb7\x0f\xd2\xeb\x8d\xc3\xc7\xf5\xf6\xa4\x66\x02\xc9\xe1\xdc\xe4\x65\xdb\x53\x1a\xfd\x75\xd5\xab\x0e\x43\x90\xc1\x88\xd2\x7b\x93\x97\xbf\x61\xbe\x40\x36\xc7\x75\x14\x0b\x3e\x58\x3f\x9d\x2f\x35\x26\x22\xbf\xad\xea\x41\xa0\x95\xeb\x28\x8d\x28\xaa\x95\x17\x45\xfe\xdf\x73\xae\x97\xdf\x2c\xe2\x9a\xbe\xe2\x0e\x4b\x7c\x86\xe2\xad\xb9\xae\x8a\xea\x28\x73\xf0\xb7\x89\x13\x5b\xf1\x44\xa9\x98\x95\x52\x63\xcb\x70\x8c\x0d\xd7\x71\xaa\x22\xe3\xfc\x9f\xdd\xa9\xce\x5b\xf4\x0f\xb4\xb8\x22\x74\x8c\x16\x9a\x6b\xb0\x97\xf5\x2a\xd0\xd2\xcb\x58\x0a\xee\x77\x24\xc1\xa9\xe3\xbc\x56\x4d\x27\x09\x58\xac\xda\xd3\xf5\xf5\x5f\xa6\xb0\x75\x82\x8c\x0c\xf1\x73\x49\x82\x12\x76\x2a\xf6\xf9\xca\xe9\x9d\xd3\xc8\xea\xf1\xeb\x6a\x6c\x82\x5e\x66\x21\x74\x1a\x29\x72\x1e\x57\x9b\xdb\x49\x94\x53\xa7\x49\x98\xf4\x4e\x1d\x95\xb1\x50\xe8\x67\xfd\x5f\xfa\xa7\xef\x65\x74\x98\x78\x72\x2a\x35\x0a\x2d\xfb\x63\x40\x67\xb1\x21\x5b\xe7\xfe\xfd\xfa\x6e\x7e\x20\x9d\x3f\xd0\x51\xe0\x3a\x53\x56\x88\xee\xda\xed\x58\xcf\xcf\xcd\x2e\x2f\x15\x49\xe0\x4c\xea\x10\x5d\x7f\x9e\xb2\xc4\xe5\x01\xd6\x6f\xf8\x01\x28\x73\xb4\x15\x2f\x91\x8b\x68\x8e\x2c\x93\x1e\xf6\x4e\x31\xea\xbc\x99\x9c\x69\x9a\x1b\xf4\xa5\x3b\xdf\x4b\xda\xf4\x46\x43\x29\x62\x8b\x73\x27\x21\x5f\x83\xa5\xbe\xaa\xaa\xc6\x56\xd9\x9c\x8a\x7c\x6e\x61\x68\x21\x03\x62\xb7\x69\x11\x8e\xdd\x01\x79\x57\x5a\xd0\x8a\x6f\x56\x11\x65\x24\x4b\xfc\x79\x6d\x11\x2d\x9f\x51\x86\xcd\xfe\xdc\xbf\x12\x44\xb6\x0a\xa4\x7b\xe0\xce\xcf\x61\xb7\xe1\x6d\xf4\x39\xda\x51\x43\x26\x81\x0d\xf1\x84\x85\xc8\x98\x96\x0a\x69\xb8\xbf\xd0\x52\x7f\xcd\xcb\xe7\x87\xbe\x80\x46\x4b\xa3\xc5\x60\x30\xf6\x6a\xcc\x7f\x2b\xf3\xaf\x55\x2a\x29\xab\xe8\x8d\xc5\x7a\x9c\x64\x5b\xdc\x76\xb5\xca\x02\x1f\x55\xfd\x03\xbb\x53\xfb\x7a\x14\x6d\xe8\x5a\x29\xc3\x67\x10\x6d\xb5\x12\x55\x5c\x8f\x2c\x0d\xad\x81\x89\xc8\x5b\xe3\xf5\xb8\x5e\x5c\x9b\xc0\xa0\xc3\x21\x58\x1b\x6c\x66\x76\x68\xa3\x23\x10\xbd\x6e\xdb\x88\x6d\x7f\x16\x92\xc5\x20\x8a\xc8\x3e\xa9\x4e\x4e\x0d\x1a\x8a\xa9\x8b\x8e\x61\x0c\x74\x7a\xec\x56\xf7\x6b\x76\x78\x5a\xed\xd7\x7d\x8b\x36\x01\x65\x6f\x2a\xd3\x1e\x94\xa7\x89\xe6\x18\x2b\x20\x0b\xd1\xc1\xb9\x63\x6c\x2f\x51\x57\xd3\xa7\x88\x75\x46\xf5\xe3\x5b\x2c\xb7\x50\x8c\xd7\x3b\x26\x9a\x13\x29\xc0\x57\x28\x46\xbb\xfe\xe4\x6d\x31\x65\x82\x72\xad\x37\x8f\x8f\x9b\xd1\xf9\x86\x69\xa2\x09\x04\x26\x49\xba\xbf\xe7\x56\x6b\xee\x8e\x27\x8b\xaf\x1d\xc7\x64\x30\x0b\x12\x92\x26\x22\x02\xd9\xca\x43\x93\x27\x3e\x16\x66\x59\x9c\x59\xab\xa7\x40\x68\x50\xaf\x26\x7d\xfb\x5e\x98\xd0\x2e\x71\xbf\x7a\xb8\x39\xac\x6e\x6e\x9e\xd6\x3b\x0f\xf8\x45\x1e\x48\x82\x15\x7c\x6f\xb0\xfe\x42\x4c\x08\x7f\x62\xdf\x16\x25\xa9\xea\x6d\xaa\x2b\x6c\x97\x08\x04\x39\xf2\xd8\xd6\x66\x3d\xc3\x11\xbf\xe4\xa6\xdd\x61\x39\x8d\x57\x21\xcf\x2c\x81\xa5\xb3\xe0\x9a\x43\x2f\x7c\x41\xd4\x9b\x6a\x56\xee\x82\x9c\xf7\xf9\xcc\x0d\x45\xd0\xa6\xe3\xcb\x45\x40\xe5\x58\x37\x79\xd3\xed\x7a\xb3\x29\xc4\x25\x27\x28\x9c\x86\x16\x76\xd5\xb9\x56\xe8\xd9\x80\xbe\xd4\xd5\xf9\xb4\x54\x37\xed\xaf\x54\x76\x6a\x3d\xab\xd3\x71\x76\x53\x11\x30\x4a\x0a\x1c\xbb\x81\xbd\xb2\xdb\xe1\xbc\x4b\x92\x92\xbb\x53\x56\xc4\xb8\x94\x0f\x94\xf0\x1c\x45\x26\x68\xff\x6f\x66\x8b\x0a\x85\x61\x24\x4f\xef\xca\xd5\xae\x70\x36\x72\xc2\x70\x22\x85\x87\xa6\xc9\x9f\xcb\xa7\xca\x6a\x1a\x90\x4e\xc3\x14\xab\xff\x99\x58\x25\x47\xc8\xb8\x87\x28\xde\xa0\x81\x73\x61\x93\xb0\x30\x93\x7b\xe3\x28\xb9\x08\x7a\x11\xdc\x75\x5d\x57\x7d\xfc\x14\x25\xd8\x71\xcd\x55\x45\x2e\xf4\xb9\x5f\x60\x2a\x00\x4b\x93\xaa\xa0\x2c\x51\xef\xf2\xe2\x0d\xeb\x6b\x38\xf5\x97\x2a\x57\x86\xa0\x2c\x57\xe8\xba\xc8\x9f\xc7\x31\xfe\xa9\xc5\x8f\x2a\xe2\x54\x2f\xb1\x79\xba\xee\x6f\x90\x5a\xd2\x88\x2b\xec\xc3\x12\xa8\x38\x83\xc0\x23\x7c\x9d\xa9\x3e\x9b\x28\x4a\xa4\xd4\xe5\xcb\xd3\x7a\xdd\xaf\x42\x05\x61\x98\x4d\x25\xf0\x97\xec\xeb\xbe\xb7\xc4\xb4\xf7\xaf\xfa\xf4\xc4\xee\x84\xf3\x0a\x40\xd4\x21\xa3\x30\x7c\x91\x97\xaf\xb7\x79\xb7\x35\x4c\xbc\xcb\xc9\x21\x8a\x3a\x8e\xc8\xa6\x21\x27\xbb\x17\x6e\xf6\xf1\x1a\x8b\x23\xf5\x4f\xac\xbb\x0d\x74\x54\xf4\xf3\xbd\x6c\xaa\x62\x8a\xe3\x42\x2d\x18\xd9\xff\x9a\x74\x5d\xce\x83\x08\x2f\x47\x4c\x03\x0a\x6e\x58\xbe\x9d\x6d\x81\xfa\xd9\x53\xa5\xcc\xde\x00\x8d\x20\x52\x86\x6e\xb9\x1f\xac\x68\x36\x2d\x50\x79\x9e\x54\x19\x4d\x2f\x32\xc0\xb4\x9c\xb1\x93\xdf\x5d\x3f\x5a\xe2\x3e\x27\x4e\xc6\x4d\xc0\xac\x72\x4a\x83\xa4\xe9\xf1\xa5\x46\x2c\x87\xdc\x2c\xf7\xbd\x78\x98\xf2\x41\x8e\xd3\x61\xbe\x27\x5f\xc4\x04\xdc\x84\x38\xb8\xb0\xdd\x41\x34\x7d\x0d\xc3\xa2\x94\x38\x07\x56\xfb\xfd\xd3\xe1\x7e\xbd\xda\xad\xae\xfa\x3c\x91\x61\x60\x59\xc9\x41\x53\x15\xce\xaa\xf4\x9b\xe6\xbb\x8d\x86\x5e\xc4\x43\x4c\xc8\x2c\x90\xfe\x50\xd5\xf9\x73\x5e\x42\x71\x75\x7e\xdf\x0e\x54\xdf\xdc\x84\xa1\xf2\xaa\x07\xab\xb3\xce\x7b\x29\xee\x99\x29\x63\xa2\x20\x51\xe9\x88\xcf\xe4\x66\x38\x42\x4d\x92\xa4\xa1\x85\x54\x17\x8e\x0f\xf2\x47\x5e\x9f\x67\x13\xda\x24\x89\x26\x4c\x62\xf3\xeb\xe4\xc2\x31\xbe\x41\x58\x59\xf6\x06\x5b\xca\x6d\x35\x5b\xac\x37\x55\xd9\xbe\xcc\x1e\x21\xc1\x80\xa2\x1f\xd7\x70\x3c\x51\x89\x6a\x0f\x54\x32\x09\x5a\x11\x6d\xe2\x93\xf7\x1f\x92\x00\xb9\xbe\x47\x16\x1b\x89\x03\x2d\x6f\x73\x46\xed\xa5\x8d\xbd\x26\x12\x37\x59\x9a\x65\xc2\xab\xf7\xd2\xea\xb2\xba\x7a\xf4\x99\xff\x15\xfe\x7b\x60\xfe\xfa\x57\xfc\xef\x51\xe0\x98\xff\x7b\x94\x40\x4f\xff\xdd\x8f\x7e\x26\x18\x19\x78\x37\x90\x17\xef\xab\x52\x7b\xc7\x0d\xe4\xbc\x74\xcb\x64\x80\xd8\x3f\x5f\x5f\x23\xd9\x3f\x98\x16\xca\x11\xcd\x5d\xe5\x0e\xe4\x3b\x43\xfe\x19\xd0\x99\xb4\xea\x08\x70\x3c\x8d\xcf\x7d\x03\xc6\x50\x00\x30\x6f\x46\xf5\xcc\xd3\xbd\xc2\x48\x65\xb1\x6e\x3f\x31\xdf\x57\x2e\x33\xeb\xaf\x57\x91\x92\x8e\xf4\x6a\x4e\xe0\xec\x7b\x24\xa1\x8c\x86\xba\xc2\x9b\x5c\xe1\x53\x55\x7c\x10\x28\x36\x0a\x22\x4a\x88\x6e\xb0\x3c\x07\xd1\x6c\x20\xb4\xb0\xa9\x15\x07\xb9\xfb\x24\xac\x6d\xb4\xd6\x84\xdd\xdb\xa0\x5e\xdd\xd1\xb1\xf5\xd7\x2e\xac\xc1\x50\x58\x0e\x32\x0a\x05\x2c\x49\x6a\x70\x63\x92\x18\x07\x19\x81\x27\xec\x6e\xa0\x5a\xd4\x3f\xba\xd3\x67\xf2\xea\x22\x08\xe2\x88\x00\x75\xbe\x82\xe2\x06\xdf\x46\x71\xde\x45\xd1\x04\x11\x04\xdc\x0a\x65\x82\xd6\x56\xcf\x7d\x9f\x17\xbe\x04\x66\x74\xac\x8b\x80\x05\x89\x19\x3b\xf3\xeb\xbb\x6d\x18\x5c\xda\x6d\x22\x60\x3c\x09\x7b\x11\xd5\xc5\xf0\xa1\x08\xa2\xd0\x80\x47\x09\xe2\xd7\xaa\x6e\xf0\xd2\x6f\x9c\x9f\xc9\x73\x4b\x43\x04\x51\x66\xd3\xf3\xdd\x1e\x06\x8d\xdd\x35\xee\xf4\xec\x71\x22\xcd\xa9\x94\x5d\x41\xb9\x43\x4f\x4b\x29\x82\x58\xd8\xf3\xab\x5b\xe6\xe7\xd3\xce\xd6\x7a\xf7\x8d\x3a\xe2\x8e\x2a\xea\x09\xd5\xe4\x93\x88\x20\x36\x29\x35\x0e\x05\xe7\x64\xee\x35\xe3\xba\x21\x11\x24\x51\x66\x81\xa6\x70\xf4\x65\x4c\xfc\x5f\x2c\x4b\xff\xbd\xf0\x1e\x09\xcf\x68\xa2\xb9\x30\xd5\xc9\x34\x5f\xa0\xc5\x9f\x30\x49\x7e\x89\x20\x65\x48\x8b\xa7\xcf\xa9\xe3\xc0\xef\x28\x82\x34\x0a\x9c\xe0\x04\x91\x06\xec\xf3\x1e\x3e\xef\x3b\x70\x4b\x18\x47\x49\x91\x53\xae\xae\xde\x1f\x8d\x99\xeb\xbd\x88\x80\x33\xcb\xab\x6f\x1d\x14\x7d\xdf\x59\xc4\x2e\x93\x31\x7e\x66\x6e\x42\x12\x14\x6c\x5f\xf2\x5a\x8f\x99\x44\x3c\x07\x92\x08\x84\x40\x0a\x27\x6d\x56\xbf\x1f\xbe\xef\x6e\x0e\xb7\xdf\x1f\x6e\xfa\x36\x0d\xe9\x80\xe1\xf6\x58\xbd\x4f\x7d\x45\x11\x08\x63\xf9\x58\x9e\xa1\xb9\xad\xea\xdb\xfb\x6f\xfd\xed\x20\xb0\x5a\xef\x14\x3f\xa8\x1d\x71\x75\x55\x50\x04\xfb\x50\x3a\x4a\x38\x55\xe9\x61\xb8\x24\x4b\xe9\xa4\xdf\xbf\xd4\x88\x54\xba\x49\x22\xa7\xbe\x15\x85\x75\x8f\xd6\xfb\x0b\x0a\xb6\xc9\xa0\xaa\x28\x92\xdc\x87\x24\x4e\x55\xdd\x43\xef\x1e\xeb\x7f\x62\x5d\x5d\xbd\x5b\x58\xc8\x18\xb8\xff\xb5\xcf\x36\xf6\x8b\x50\x81\x55\x9c\x29\x08\x39\x39\x58\xb6\x22\x50\xd2\x12\x69\xdb\x71\xda\x60\xf3\xb2\xad\x96\x01\xb5\x22\xd0\x71\xaf\x1b\x7e\x5f\x75\xe7\xfe\x63\x89\x4b\xd4\x9a\x22\xd0\xda\xf2\x04\x18\xf7\xe7\x69\x33\x0b\x02\x9e\xd8\x5a\xda\x53\x73\xd7\x3c\x0d\xe2\xa7\x0e\x84\xee\xbb\x45\x8a\x4c\x88\x27\xfc\x0f\x41\xe2\x47\x74\xe9\x1f\x60\x73\xfd\x85\x3c\x0a\x9c\x15\x73\xed\x95\x59\x9d\x88\x4f\x1f\xe1\xe8\x7a\xa5\x64\x6d\x13\x34\xa4\xae\xde\x66\x20\x64\xc1\x98\xe6\x74\x1b\xc7\x48\xc1\x86\xfc\xb5\x60\xa1\x0c\x08\xd3\xff\xf5\x71\xbb\x1e\x9d\x40\x82\x45\xa1\xf5\x7a\x56\xdb\xdd\xd6\xff\x2d\x66\x86\x3b\xcb\xe3\x0a\xdb\x8b\xa2\x79\xc1\xe2\x24\xd1\x4e\xe1\x79\x9b\xa3\xc2\x55\xa9\xe9\x2b\x7e\xc6\xd2\xe9\x2f\xcd\x2c\x3b\xdf\xa1\xc6\xa6\xdb\xb2\xfb\x3f\x5b\xed\x42\x6b\x84\xae\x8a\x79\xa0\x76\xd1\x03\x11\x2c\xd6\x2c\x70\x06\xca\x31\x2f\xc7\xb4\x1c\xb3\x27\x4e\x32\x9e\xe0\x90\xb1\x6b\xf6\x95\x3f\xc9\xfd\x13\x24\x9c\x29\x57\x03\x39\x86\x39\xcc\x7e\x30\x51\x81\xa5\x40\xf2\xfc\x47\x9f\xe8\x6b\x76\xbd\x05\x15\x98\xbc\x61\x9d\x9b\xf7\xbf\x92\x75\xfe\x9f\xd1\xc7\x4e\x43\xa0\x5d\x87\x28\x99\xd7\x0e\x29\xd7\x3f\x6b\x1a\x67\x8e\xad\xf7\x17\x69\xae\x50\x0a\x60\x6c\xba\x09\x26\xc2\x28\xb2\x28\xbb\xbc\xfd\xad\xaa\x5f\x17\xc3\x40\xbe\x6f\x26\x42\x92\x0e\xa9\x88\x40\xf2\xb1\xbc\xc9\xdf\xae\xde\xbb\xf5\xea\xef\x06\xc6\xaa\x6c\xe8\xd7\xab\xab\xe9\x5a\x65\x60\x2c\x19\xa6\xa7\xab\x70\xe5\x83\xfe\xec\x60\x92\x31\x8a\x7a\x94\x55\x9b\x9b\xf7\x83\x13\x96\x3f\xd4\xb4\x48\x66\x5f\x49\x26\x8c\x66\xe9\x75\x55\x76\x93\x63\x21\xfa\xe4\x3b\x4a\x24\xe7\x63\xff\x82\x37\x08\x7a\xf7\x92\x8f\x94\xf1\x04\x53\x52\x51\x6d\x49\xd3\x56\x27\xab\x0f\xd5\x4e\x1f\x4a\xeb\x98\xf5\x14\xe2\x8f\x6f\x58\xd7\xb9\xc6\xd9\xc3\x98\x20\xa2\x14\x1a\xfe\xf7\x0c\x85\x2d\x62\x6d\x16\xea\x1c\x45\x18\x44\x99\x15\x89\x7e\x39\xb7\x1f\x79\xce\x7d\x57\xad\xfa\xc1\x1a\xcd\x72\xdf\xac\xb9\x17\x99\xfb\xd6\xe3\xac\x45\x18\x98\xcc\x8a\xe8\xb6\xf0\xbc\xb4\xd3\x85\x2c\xb6\xe4\x91\xdd\xac\xac\x2c\xe4\x79\x1a\x02\x13\x21\x4b\x53\xda\x98\xdd\x01\x63\xb5\xdc\xe7\xc7\xcb\xe2\x60\x87\x2c\x05\xb2\xee\x2d\x69\x9b\x5e\xac\x6e\x72\x86\x75\xd7\xd9\xf8\x58\xf0\xe1\x58\x95\xb4\x46\x46\xd6\x53\xff\x8f\xef\x9e\x09\x92\xdd\x38\x51\x2e\x7f\x93\x97\x77\x24\x68\xe4\xdf\x9c\x09\x08\x63\xbf\x85\xfb\x1a\x8e\x51\xd2\x57\x84\xc4\x3b\x39\x5a\x90\x24\xd9\x66\x31\x78\xff\x58\x3a\xa7\x3e\x26\x97\x16\x61\x94\x59\x4e\xb7\xa7\xed\x9a\x5c\x4d\xd2\x36\xb8\x24\x5b\x13\x61\x12\x68\xe5\x68\xf6\xdd\x5e\xbc\xad\x71\x97\x3f\x97\x68\xf7\xc1\xbf\x59\x75\xe9\xef\x16\xc7\xe0\xee\x76\xb8\xb9\x3a\xe4\x17\xfb\x6d\x98\xc4\x92\x3e\x5e\x9d\x3f\xbf\xb4\xa1\x98\xb5\xa6\x89\x85\x1f\xc2\xe9\x74\x70\x65\x26\xfe\x41\xb3\x38\xe6\xe0\x65\x47\x3a\x6f\x9b\xb6\xb6\xc9\x02\x0e\x33\xa9\x08\xe0\x52\xe4\x8d\xe3\xde\x3a\xc8\x7c\x66\x35\x86\xc0\x92\x50\x7b\x16\xd8\x67\xbf\xbf\xb2\xc5\x8a\x34\x11\x82\x8e\xa8\xc2\xb5\x80\xc6\xf2\x2e\x1c\x0c\x4b\xba\x91\x39\xf8\x03\xd6\x75\x94\x61\xa8\xd2\x41\x25\xbb\x3a\x9f\x46\xfc\x2a\xd1\x94\xcd\x59\x84\x32\xce\xbc\x88\xca\xb6\x6a\x72\x1b\xda\x38\x97\x2d\x5b\xde\x25\x42\x15\x84\xe4\x39\x91\xd4\x4c\x33\x86\x9f\x88\x50\x09\xa6\x42\xcf\x2b\xd2\xcd\xaa\xbb\xa1\xf6\x64\xfa\xab\x4a\x26\x71\xec\xa8\xce\x46\x22\xcf\xf4\xb9\xeb\x4b\xd2\x30\x11\x22\x33\x14\xd2\x02\x27\x11\xe5\xac\xdd\x8b\x34\xc8\xf4\x61\x31\x13\xca\x06\xf3\x10\x8a\xce\xd2\x24\x9d\x94\x9f\x79\x4b\x34\xc1\xd3\x4f\x1e\x05\xb1\xad\x4c\xd6\xb6\x62\xa3\xb1\x73\x6f\xfa\x61\xa3\x00\x62\xda\xc0\xbc\x7d\x6c\x05\x8b\x66\x37\x02\xa5\x5d\xf0\xe0\xfa\xfa\xab\xcd\x17\x87\x99\x1b\xa4\x88\x71\x6d\xc5\x1d\x09\x8d\x49\x34\xa6\x4d\xdf\x06\x19\x7d\x63\xc7\xce\xe4\xf2\x20\x93\x77\x8a\xc2\x34\xa3\xc3\xfe\x0d\xf2\xc2\x67\x0e\x6f\x2b\xab\x4b\x45\xac\x2b\x23\xd3\xa8\xbf\x44\x05\x56\x4b\xb5\xb3\x82\x46\xb8\x05\x11\x85\xc6\x72\xf6\x92\x6d\xd9\xcd\x41\x9a\x5a\x8e\x3e\x7f\x35\x3b\x4b\xa2\x88\x71\xab\x98\xbf\xd9\x6c\x47\x67\x43\x14\x85\x8c\x72\x6e\x57\x97\x0e\xf7\xe7\xeb\x34\x8a\x99\x02\x36\xaa\x87\x59\x1d\xdb\x6d\x35\xff\xd9\x58\x26\x64\x91\x1c\xfa\xda\xe4\x79\x07\x13\x13\x92\xd3\x13\xfd\x4c\x43\x66\xa3\x6a\x0f\x11\x25\x51\x98\xba\x8a\x02\x4f\xe7\xd9\xcc\x02\x10\x22\x4a\x43\xe6\x61\xab\x57\x79\x51\x58\xc1\xcb\xe9\x98\x66\xa1\x21\xb8\x12\x81\x4a\xc6\x3c\x76\x22\xca\x4c\x9c\x7a\xa5\xad\xab\xc7\xd9\x75\x9c\x29\xb2\x03\x4f\x58\x9b\xaa\x3e\x3a\x1d\x83\x4b\xff\xf3\x72\xa8\xb8\x52\x94\xc5\xf6\xb1\xc5\x6d\x5d\x55\x66\x41\x5c\x5a\x44\x02\x58\x20\x07\x12\xb4\x4b\xfd\x62\x11\x41\x68\x35\xae\x5c\x01\xb3\xee\xe5\xaf\x44\x04\x5c\x51\x1d\x02\x9d\xe3\x9e\x04\xe3\x12\x78\x2e\x22\x15\x18\x8a\x41\xf6\x6b\x92\x42\xad\x8b\xeb\x37\x52\x10\x19\x17\x0a\xbc\x25\x54\xe7\xbb\x2a\x70\x84\xb2\x10\x91\xd2\x19\xb3\x85\x30\xcd\x4b\xcf\x8f\x2e\x22\x65\x62\x82\xae\x59\xdd\x94\x28\x28\x7b\x7a\x0c\x11\xe9\x38\x8c\x3d\xd7\xc8\xfd\x24\xf9\x24\x22\x9d\x31\x5a\x4a\x66\xf7\xdf\x7a\xfe\xe0\x1a\x90\x85\x3d\x0d\xfc\x5c\xc5\x51\x44\x28\x24\x8d\xdf\xe3\x96\xe0\x90\xdb\xc7\xc7\xfb\xc3\xea\xfe\xfe\xf1\xba\xef\xa0\x2c\x5a\xb0\xdb\x60\x1f\x8d\xb9\x86\xd2\xae\x98\x2b\x50\xaf\x96\x7b\x6f\xa5\xff\x73\x6e\xda\xee\xa6\x44\x56\xee\x2e\x8c\x03\x61\xa5\xef\xd7\xed\x8b\x2d\xcd\x73\x7f\x67\xa1\x86\x74\x82\x62\x98\xe1\x32\x16\x8d\xcc\x98\x41\xe0\x55\x22\xad\x30\xf4\xac\x9c\x4c\xc4\x4c\x67\x72\x60\x90\x1e\x58\x25\x7d\xfa\x7e\x31\x74\x12\x87\x81\x91\xcc\xb1\xc1\x13\x7f\x9f\xbf\x5d\xc8\x93\x2c\x18\x4a\x76\xe6\x7b\x68\x1c\x19\x0b\xd9\xf2\xef\x61\xa5\xb1\x27\x3c\x96\xae\x67\x1c\x03\x45\x0a\x5e\xa0\xd4\x45\xbf\x81\x5d\xdc\x30\xe6\x19\x99\x0f\xbb\xb6\x3a\x0d\x10\x0a\x11\xc7\x32\x96\xb6\x7c\x90\xf0\xe1\xe5\x14\x2a\x93\xc6\xe3\xd8\x47\x9c\xa4\xb6\x8a\x82\x3c\x77\x36\x61\xc9\x14\x71\x22\x80\x2a\x97\xe5\xf9\x9d\x05\x7f\x51\x21\x64\xab\x98\xfe\x9f\xfe\xeb\x7e\x2d\x4b\x42\x2b\x7c\xd4\xbc\xde\x56\xf5\x73\xfe\x86\x65\x37\x69\xc7\x27\x7d\xcc\x03\x88\x5d\xc8\x89\x3c\x0c\x5a\xbf\x84\x60\x23\x29\xab\xf1\xed\x78\x60\xd0\x3b\x2d\x9b\xbc\x6c\x6f\x11\x57\x72\xb6\x1d\xc4\x3c\xd1\x94\x08\xbd\xc1\x61\xa5\xda\x40\xe0\xb6\xae\xde\xf2\x05\xd1\x20\x7f\x21\xd8\xe3\xd3\xce\xc5\x9e\xc6\x75\x79\x2e\x72\x93\x78\x0d\xd8\xd5\x51\xe6\x73\xa8\xf2\xe4\x18\x8d\x05\x8b\x68\x1e\xd1\x21\x48\xdf\x75\xfa\xcb\x22\x34\xb4\xea\x07\x32\xdf\xdb\x6a\x3e\x83\x04\x4f\xa8\x72\xee\xbb\x53\x3f\xc5\x57\xcb\xb7\x7c\x77\x29\x83\x39\x7b\x54\x90\xc1\xc0\xd2\x3e\x11\x66\xf0\x38\x25\x11\xcb\x40\xd1\xd2\xba\x59\x0d\x5b\x63\x2c\x03\x4c\x5d\x39\xf6\xfa\xd7\x09\xeb\x1c\x17\xc8\x8c\x2d\x7f\x5a\x14\x7a\xf3\x3d\x56\x81\xb2\x72\x5d\x16\x58\xb0\x3e\x55\xbe\x72\x55\xc4\x0a\x21\xb6\x26\x13\xd4\x97\x14\x23\xfd\x2d\x74\xa0\x29\x71\xeb\xbf\xc1\x42\x68\x36\xd6\x26\xa5\xa2\x26\xbb\x63\x7f\x6f\xf4\xba\x7d\x79\x9a\xd3\x49\x89\x18\x45\x4c\x74\xb4\xd0\x1d\x59\xbf\x21\xbe\x16\xef\x9e\xa5\x7e\xf9\xc3\x22\x86\xc1\x20\x01\xbd\x81\xba\xce\x47\x15\x55\x1f\xd6\xab\x8c\xa6\x69\x12\x30\x2b\xd1\x90\x37\x57\x79\x75\xc4\xb6\xce\x95\x2b\xa8\x9b\xbc\x42\x12\x84\x2a\x49\xbc\xf0\xb5\xdf\xc3\x92\x40\x25\x44\x7c\x60\x3d\xfe\xbc\x7c\xee\x39\x00\x45\xc2\xa2\x84\xd0\x15\xbb\x73\x43\x87\x8f\xee\x1b\x9c\xea\xa4\x82\x42\x39\xbd\xc3\xdf\x30\x6f\xf6\x95\x73\x86\x26\xef\x98\x84\x10\x90\x01\xb1\xc1\x16\xb6\x75\xf5\x9f\x3e\x1d\x20\x92\x28\x08\x28\xab\x71\x95\x8f\x74\xfe\x44\x12\x71\x8c\x1d\x98\xf5\xc7\xc9\x7c\x24\x6c\x7b\xf1\xaf\x9f\x22\xfe\x2e\x80\x84\x0a\xd8\x80\x65\xb8\xeb\x1c\xef\xa2\xd7\x5d\x17\x49\x84\x01\x48\x9b\x21\xc7\xb5\xaa\x9e\x2c\x78\x20\xf2\xcd\x23\x02\x18\xcb\x38\xf6\xe9\xbc\x4f\x92\x0c\xc9\x85\x27\xc6\x4e\xed\xfd\x92\x71\xe1\xa2\x48\x12\x48\x9d\xaf\x79\xcc\xcb\xf9\x92\xef\xdc\x07\x3f\xcb\xa3\x9e\xc1\x78\x29\xe6\x9f\x24\x5a\x53\x8e\xdd\x4a\x2e\x1f\xfc\x81\xe0\xc9\xf2\x2e\x70\x55\x22\x49\x59\x48\x66\xb3\x3c\xbf\x93\x30\x96\xff\x73\x1c\x10\x83\x91\x76\x94\x43\xdd\xc4\xf9\x5e\xb6\x9e\x6e\x41\x24\xa9\x89\x89\x8b\xc5\xeb\x23\x6d\xeb\xca\x60\xd3\x54\xf5\x6c\x53\x49\x32\x96\x79\xb3\xc8\x79\x98\x4e\x29\x7d\x3a\x4a\x59\xcc\x28\x98\xdf\x27\x21\xc8\xaf\x1f\x48\x5c\x44\xc2\x23\xa4\x0c\xa0\xfc\x0b\x24\x90\xef\x9e\x44\x94\x25\x3f\xe2\xe0\x2a\xcc\x46\x0b\x58\x8a\x51\xef\x39\x39\x31\x92\xf1\xa1\x90\xc8\x00\x89\xd3\xca\x07\xbc\xbc\x86\xa7\x6f\x4e\xac\x44\xda\xa0\xd6\x65\x45\xd2\x6c\x39\xe5\x40\xd0\xb0\x1c\x8e\x48\xa4\xb0\xa1\xf2\x46\xbd\xa0\x3e\x17\x84\xc3\x98\x6e\xdd\xf1\x42\xed\xb4\x48\xa4\xd1\x0e\x60\xf6\xfc\x5c\x74\x0e\xfb\x1b\x96\xed\x4d\x75\x96\x45\xaf\xe0\xdd\x8f\x9a\x62\x19\x05\xa0\x6f\xad\x51\x30\xc4\x4b\x13\x95\x5a\xf8\x72\xde\xfc\x56\xd5\xaf\xa6\xa8\x7e\x8e\x30\x4b\x22\xd1\x60\x8b\x5b\x55\x95\x97\x8e\xb8\xf6\xda\x23\xb7\x44\xa2\x25\x92\xb8\x51\xae\x7f\xf9\x3f\x61\x20\xd0\x38\x92\x9a\xbc\xc0\x67\xf4\x0c\x6c\x63\x66\x32\x91\x60\x9c\xd0\x12\xb6\xb6\xd1\xf5\xac\x9a\xc7\x12\xe9\x0c\x26\x6c\x82\x52\x7a\xd5\x45\x7b\x20\xde\xa0\xca\x8f\x50\xcc\x8e\xdb\xc4\x28\xcb\x80\xd7\x2d\xd6\xb2\x2d\xb0\x69\xae\xab\xb2\x51\x74\x56\xb0\xc9\x7b\x1b\xc3\x89\x83\xb9\x01\x83\xbd\x8c\xa7\xcb\x6f\x4c\xee\x99\x06\x9a\x09\xcb\x8c\xaf\x09\xd9\x3a\x5e\x3f\x87\xfb\xea\x79\xd6\x3d\x8c\xad\xdc\xfe\x66\xf5\xfb\xe1\x66\x75\x77\xff\xc7\x61\xf7\x78\xff\x78\xd8\x6d\xd7\x7d\x76\x24\x0d\x13\x9b\x5c\xf1\x9e\x97\x0d\x75\x3e\x1a\x92\x93\x9b\xde\x2e\x0a\x24\x81\x04\x6b\x68\xd1\x8b\x3a\x8b\x34\x92\x31\x05\xc8\x7a\x22\x19\xee\x62\xf7\x6e\x4b\x08\xf9\x74\x92\xa7\x71\x6c\x2b\x84\x4a\xfc\xb9\xad\xab\x53\xd5\x8c\x4a\xc9\x3e\x8b\xe5\xa7\x31\x02\xef\xe5\x67\x2f\xb6\xda\xd1\x7c\x4c\x93\x44\xea\x31\x62\xd7\x4f\xbe\x34\x91\x92\xf0\xb9\xbb\xfd\xff\x67\x0b\xe0\xc2\x8f\xce\xda\x34\x0d\xa5\x4e\x46\xeb\xff\x23\x09\xfc\xc9\x23\xa6\x59\x4a\x09\xf7\x73\x3d\x9f\x0f\x69\xca\x53\x42\xd4\xc9\xaa\x7a\x1d\x2d\xc4\x59\x27\x15\x47\xb6\x62\x4c\x4e\xb9\xfd\x16\xb7\x94\x34\x8b\x52\x0a\x02\xd0\x4e\x3e\x17\x05\xfe\xd0\xf5\xfe\xac\x32\x45\xa4\x19\x24\x94\xea\x38\xf5\x7c\x57\x03\xea\x41\xa4\x9c\x09\x42\x98\x01\xa5\xa8\x6d\xbd\xde\x5d\xf9\xbd\xd1\xd7\x58\xb6\xcd\xd0\x4b\x09\xa7\x64\x41\x93\xaa\x33\x58\xa7\x9b\xec\xec\x45\x78\x84\x14\x74\xc9\xcb\xb7\xbc\xc5\xbb\x32\x5f\xce\xd8\x8b\x94\x67\x8c\xce\xf3\xee\xf2\x7d\x45\xb8\xae\xdb\x81\xd9\x7f\x7a\x53\x11\x9b\xc0\x4a\x1f\x9d\xbe\x9f\x7a\x72\x8a\xa5\xd1\x71\xd3\x88\x09\x3f\x08\x90\x22\xc9\xae\x58\x52\xea\xbf\x90\x2b\x13\x29\xf0\x60\x54\xf4\xe6\x0a\x92\x70\x06\x18\x10\xa9\xe4\x42\x8a\x91\x9f\x36\x83\x9f\x8a\x54\x05\x2a\xe3\x23\xdf\x7e\x4e\x9f\x3f\xfd\x55\x95\x20\x39\x45\x0d\xbc\xe1\x90\xe9\xe3\xd3\x19\xa9\xb8\x55\x90\x7a\xc6\xd6\x9a\x3c\x9e\x39\x48\xa4\x3a\xcd\x88\x50\xaf\x74\x4b\xde\xaf\xc6\x69\x81\xb5\x48\x35\x17\x94\x66\xd8\xb5\x75\x75\x7c\xad\xca\xb6\x22\x42\xe8\xfe\x36\x4a\x38\x3d\xc0\x73\x83\x4f\xd8\x9c\x8f\xfd\x26\x4a\xfb\xe6\x6c\x7e\x99\x34\xa4\xc0\x57\xeb\x64\x16\xfb\x8d\x38\x0b\x32\x9b\x0b\xfc\x39\x37\x37\x16\xd8\x19\xfc\x32\xcd\x58\x60\x28\xbb\xa5\x6b\xc8\xcb\xf5\xd3\x75\x38\x55\xf6\x14\x19\x4b\x31\x8e\xbc\x31\x59\x1f\xc7\x2c\x21\x93\x07\xcb\x42\x1d\xf8\x1a\xa7\x8d\x79\xb6\xde\xd6\x72\xda\xed\xe3\x38\x77\x16\xb9\x7c\xe3\x33\xb6\x1b\x38\x2d\x84\x5c\xb2\x48\x5a\x9f\x67\x5b\x57\x67\xfd\x68\xfe\xa8\xce\x63\x83\x32\x8b\x54\x42\x91\x38\x83\xea\xe5\x47\xd5\xe2\xc3\xf9\x78\x5b\xd5\xd7\x50\x6a\xd2\x5b\xb8\x7a\xef\xeb\x20\x28\x6a\xb2\x38\x33\xb2\x18\x3c\xf1\xb0\x2c\xf2\xe6\xe5\xf1\xf4\x19\x8d\xb5\xbf\xc6\x70\x0a\xcd\xb8\x10\xc1\xbc\x1c\xb9\xeb\xa0\x9d\x72\xbc\xaa\x4a\x4d\xfb\xea\x58\x7e\x53\x64\x49\x84\x94\x70\xc8\xcb\xbc\xf5\x32\x9e\xbe\xa9\x73\x78\xbb\x29\xa4\x40\x4a\x78\x1e\x6b\xba\x88\x2c\xe1\x3a\xb6\x91\x6a\xe8\x8c\xc2\x83\x82\x5a\x1f\x1c\x46\x8c\xfb\x3e\x2a\xa1\xd3\xb4\xaa\x41\x15\xf9\x9f\x68\x55\x23\x3f\xcb\x97\x67\x89\x4a\xa9\x38\xc5\x57\x12\xe2\x1b\x16\x4d\xff\x9b\x0a\xa9\x98\x67\xd0\xa3\x5b\x1e\x95\x14\x01\xc2\x91\x69\xbd\x14\x68\xcb\xb2\xc0\x12\x8c\x1f\xf3\xf2\x2a\xd7\x37\xb9\x71\xe2\xc7\x77\xe5\xee\x4f\x90\x3e\xea\x93\x65\x26\x0b\x1c\xb3\xf8\x53\xd5\x19\x57\xa7\x09\x4f\xdf\x14\x85\x12\xbb\x8b\x78\xc6\x08\x89\xf1\x9a\x17\x85\xd5\x50\x18\x29\xaa\x89\x8c\xab\x8c\x3c\x16\xfc\x55\xb5\xd5\xcf\x89\x3d\x95\x71\xc3\x88\xcb\xde\xd1\x1a\x5d\x57\x4d\xfb\x70\x3e\x62\x3d\x28\x95\x89\x4c\x70\xa5\x64\x8f\x73\x25\xc5\xb6\x21\xbc\x92\x09\x61\x11\xe4\x96\x46\x44\x5f\x77\x9b\x8c\x6b\x82\x58\xd8\xaa\x13\x5b\x3d\x59\x15\xc5\x84\xdb\xc4\xf7\x32\x96\xcc\xd9\x2d\xbe\xd9\x8a\x93\x09\x27\xb7\xe7\xe1\xfa\xfb\xa7\x5f\x52\x1a\x20\x6a\xd8\x5c\x55\x0c\xcb\x51\x35\x9d\xc8\x54\x6a\x1c\x55\xf7\x1b\xd6\x6d\xde\xe4\xe5\xf3\xf7\xe6\x83\x0c\x73\xa6\x53\xab\xfb\x48\x78\x13\xb7\xa0\xac\xbd\x33\x30\x7f\x8a\x4c\x73\xc9\x93\x31\x93\xb3\xe7\x66\xeb\x3b\x08\x6b\xa7\x16\x55\xe7\x3f\x4d\xd7\x80\x36\x21\x4d\x3a\xeb\xba\x9e\x6b\xf4\x7c\x5a\xcb\x4f\x84\xa1\xcd\xff\xb9\x22\x73\x50\x7d\xb1\xad\x1f\x41\x93\x4a\x8a\xc1\xd5\xdd\x51\x4b\xc0\xbc\xfa\x7b\x59\x0f\x38\x89\xe9\x66\x67\x32\x4b\x84\x07\x45\xb7\x98\xde\x27\xb2\x99\x22\x33\x3c\x23\xec\xb2\x7a\xc1\xa6\x3f\xac\x79\xc0\x93\x24\xec\xd1\xa6\x87\x62\xac\x55\x27\x78\x00\x8c\x5c\x4f\x2f\xe9\xf5\x7f\x91\xec\x13\x9c\x61\xe6\xf8\x0e\x6d\x11\xa6\xa7\x8a\xba\x1f\x55\xfa\x5d\xd4\xa2\x0b\xce\x8c\x4e\xed\x08\xe7\xaf\xf9\xab\x7f\x7e\x1e\x82\x34\xc1\x8c\xa6\xea\x0b\xf4\x2f\x12\xa1\x24\xe3\x69\x40\x4b\xad\xdf\xb0\x2c\xa6\x62\x7e\x82\xc7\x41\x42\x39\xa4\xaf\x55\xf1\x97\x6c\x83\xfe\x92\x28\xb3\x92\xbf\x1e\x42\xb2\x01\xef\x65\xf0\x98\x6b\x00\xef\xb3\x91\x5f\xee\x15\xb8\x26\x9f\x86\xc7\xc2\x12\xca\x3a\xe4\xff\xc3\x42\x8e\xf8\x3c\x92\x04\xfa\x84\x73\x6d\xbc\x36\x78\x12\x29\x8a\x7c\x9c\xe0\x9d\x8a\x5b\xe1\x78\x82\xfc\xb9\xbc\x28\x61\x9e\x3e\x4c\x22\xc0\x11\x90\xb4\x1b\xf8\xb5\x7a\x76\xd9\xbe\xd9\x48\x25\x92\x53\x89\xd3\x4a\x56\xe7\xb6\x87\x60\x8e\xda\x11\xc9\x23\xb3\xd4\x58\x4e\x66\xd7\x8f\x4b\xaa\x32\xca\x2f\x5f\x3d\x7e\x7f\xd8\xff\x71\x70\x3c\x30\xe3\x5c\x2f\x4f\x95\x34\xce\xf7\x20\xa4\xbf\x7c\xb7\xf5\xa5\xd3\x5f\xc9\xd2\x98\xd6\xc8\xee\xa5\xfa\x39\xf7\x19\x79\xc6\x33\xe2\x00\x3c\x81\xa3\x65\x6f\xf6\xd5\xfe\x05\x07\xba\x7e\xc1\x39\x93\x09\x5c\x0a\xd5\x36\xf3\xb4\x16\xe7\x89\xa4\xfa\x9e\xfb\xbb\x2b\x7f\xad\x60\x51\xe2\x2c\xb6\xc7\x92\x48\x89\x46\x67\x35\x17\xa1\xf0\x8c\xc4\x5e\x0f\xa6\xf3\x4d\xff\x56\x45\x90\xe0\x22\xb3\xe5\x9b\xae\xc4\xa6\x37\xbe\x5c\x33\x08\x1b\xa6\xa0\x92\x2c\x8b\xc1\x70\x24\x6e\x54\x87\x6b\x57\xe3\x5f\x1b\xfb\x83\xe7\xca\x25\xe3\x84\x4a\x57\x16\xae\xfc\x04\x2d\x6e\xfc\xaf\xc9\x08\xd5\x48\x23\xe3\xda\xf3\xd2\x4e\x53\xd1\xbe\x73\xe6\x2a\xe7\xa1\x28\x1e\x87\xa0\x11\xef\x5c\x70\x36\x14\xc0\x4c\x4e\x2a\xae\x98\x21\xb9\x1d\x5d\x1d\xe4\x1c\x09\xc8\x55\x8a\xb4\x33\xab\x02\xa9\x52\x69\x70\xd9\xb8\xc2\x9e\xcc\xb4\x3a\xb7\x54\x89\x34\xf7\x8b\xb9\x0e\x12\x03\xa3\x2a\xe1\xee\xf3\xf7\x37\x40\x95\xd2\x76\x3d\x11\x4f\xb0\x95\xcf\xf3\x74\x04\x37\x11\xd2\xde\xbf\xed\x0c\x27\x45\x13\xca\x2d\x6a\x3d\xef\x29\x32\x11\xf8\x8c\x69\x53\xdd\x60\x0b\xf9\xf0\xf1\x8c\xb6\x95\x05\x96\x61\xda\x4f\x45\x11\x84\xa1\xa3\x2f\x1f\x64\x02\xba\x33\x7d\x14\x55\x12\x41\x92\x25\x56\xc7\x96\xfc\xdc\xdb\x73\xa9\x5d\xa9\x1d\xce\x80\xee\x42\x30\x95\xda\xc2\x0b\x6c\xc1\xf2\xac\x5e\x64\xda\xa7\xd6\xb7\x08\x31\xb2\x98\xf1\x1c\xeb\x71\xe1\x8a\x10\x11\x26\x96\x14\x0e\xdf\x54\x55\x5a\x36\x99\xdb\xaa\xde\xbb\xf3\xcb\xf5\x8a\x4d\x92\xb8\x59\xe9\x59\xd3\x89\x25\xa2\x59\x54\x25\x8a\x42\x1b\x05\xef\x87\x4d\x24\x51\x4a\x89\x73\xca\x2a\x36\x6e\x42\xaf\xf4\x82\x32\xfd\x74\xc7\x12\x49\x22\x29\x1b\x52\xe7\xea\x05\x6a\xbd\xea\x2b\xdb\x85\x48\xa4\xc5\x96\x94\xd5\xcf\xbb\x72\x0a\xaf\x15\x89\x04\xfa\x4c\x7d\x14\x8f\x6a\x24\x3e\x66\x11\x16\x22\x41\x4d\x84\x1e\xee\xec\xfc\x0d\xf3\xe9\x97\x17\x29\x97\x99\x25\x58\x2f\x8a\x7b\x6b\x5a\xf9\x5f\xcb\x62\x45\x34\xe9\x1b\x4a\xbe\xad\xda\x16\x8f\xa7\xd6\xd6\x6d\xfe\xc5\x9e\x30\x5d\x61\x22\xe3\xa9\xd7\x6c\x6b\x0b\xa2\xd0\x2d\xf1\x52\x6e\x70\xfe\xa9\xff\xa2\xdd\xdf\x5b\x5a\x8d\x0f\x5d\x6d\xb0\x58\xae\x11\x11\x82\x33\x5b\xa5\xd9\x60\x3b\x30\xcc\x5f\x64\xc5\x68\x77\xe9\x67\x23\x8f\x39\x0f\xfb\xa2\xc2\x5f\xef\xeb\x5f\xa8\xee\x6e\xa6\xc7\xa0\xe0\x99\x15\xb9\x5c\x5f\x3f\x7c\x66\xf3\x09\x0e\x8c\xe0\x5c\x39\xe9\x11\x98\xbc\xc7\x2a\x74\x36\xa9\x18\x68\xbb\x27\xd3\x9c\x4f\x10\x50\x42\x24\x56\xcf\x6a\xbf\xbf\xee\x2f\x56\x56\xb8\xe4\xf8\xfe\xdd\x91\xd9\xf9\x16\x48\xec\x56\x3f\xb0\x79\x0c\xc7\x8c\x00\x0c\x29\xab\x65\x8a\xfc\x34\x3a\x01\x84\x8c\x78\xea\x45\x51\x2d\x43\xc2\x04\x0a\x23\x64\x66\xd1\x45\xdb\xa7\x35\x95\xd8\xac\x6e\x6e\x9e\x7c\x9b\x0a\xe2\x74\x1c\x60\xde\x40\xfd\x8a\xdd\x5a\x5b\x95\xfa\xda\x33\xb4\x3c\x9e\xdb\x1a\xa1\x4f\x14\x09\x95\x49\x02\x49\x1e\x6a\x6c\xb0\xfd\x32\x7a\x7e\xc5\xd1\xb8\x7a\x94\x62\xe7\xe2\xb7\xfd\x98\x29\x6d\x01\x77\xcd\xc8\x34\x70\x4d\x5a\x30\x8f\xfc\x79\x94\xff\x41\x65\x45\xc6\xae\xde\x07\x42\xa4\xe9\x87\xd1\xca\x90\xc1\xd1\xb4\xd0\xe6\x6a\x55\xd7\x96\x7e\xaa\x5f\x71\x68\xd0\x6b\x44\xdb\xe4\x8e\x65\xff\x58\xae\x69\x18\x1d\x4f\xc2\x04\x2a\xd1\x0e\x26\x8f\x9a\x18\xdc\x6c\x31\x53\x8d\x6f\x08\x05\xea\x43\x73\xca\xfb\x3c\x81\x30\xb1\x75\xd7\xcf\xe5\x4b\x55\xe8\xdd\x59\x36\xaa\xce\xc9\xd1\x25\x19\x94\xd9\xa2\x35\x59\x10\xbb\x5d\xb5\xaa\xf5\x15\xba\xd0\xc4\xa4\x13\x04\x98\xc8\xc1\x05\xde\x60\xd3\x78\x3c\x3d\x9b\xc6\xf9\x80\x71\x19\x59\xe2\x77\x8a\x6f\x11\xb2\x9b\x24\xa1\xad\x6e\xe0\xf4\xb6\x4c\x31\x4b\x13\xe9\x8e\x78\x8f\x3f\x1e\x7f\x06\x60\xa8\x29\x8a\x32\xc4\x7e\xff\xbf\x73\x7e\xe9\xe0\xcf\x9e\x38\x94\xd2\xaa\x6c\x5a\x09\x71\x2a\x9e\x1c\xeb\x1d\x5a\x57\xd2\xaf\x50\x08\xa5\xa1\x0a\x8c\x9e\xe2\x6b\x73\xf7\x70\xb8\xfa\xfe\x87\x1b\x53\x88\xe2\x94\x70\x09\x7d\xd5\xe3\x06\xfa\xb9\x0e\x51\xc2\x88\x6b\xae\x7d\xc9\x9b\x1f\x55\x8b\xb5\x03\x43\xfa\xe6\xcc\xc6\x5c\x5b\x1c\x0b\x33\x0a\x88\x99\x95\x99\x95\x9d\xfb\x8c\xcd\x8c\x3b\xb2\x6b\x67\xe4\xb2\xec\x14\xd4\x48\x01\x9c\xf1\xca\x83\x58\xc6\x2e\xea\x50\x14\xf3\xf2\x33\x01\x31\x22\x39\xa8\x9d\x47\x70\x83\xde\x2d\xba\x26\xaa\xad\x7e\xf6\x43\xca\x33\x8a\xa9\xe4\xc4\x08\x51\xe4\x7f\xe2\x05\x19\xe7\xe5\xd0\x66\xca\xa0\x93\xc5\xf0\xe1\xc5\x4f\x51\x66\x90\x69\x9b\x56\x93\xe7\xbc\xd0\x77\x97\xe7\xd9\x30\xd5\x81\xc7\x2c\x45\x5f\x5e\xe9\x61\x4a\x7d\x9b\x2d\x65\x76\x74\x37\xce\xa6\x5d\x0e\xf4\x00\x4f\x2c\x21\xa6\xdd\x72\xbb\xb3\xf4\x12\x52\x0e\x3c\xb3\x68\x93\x63\xfe\x6c\x8b\x16\x47\xa4\x33\xfd\xaf\xf2\x94\x12\x47\xf4\xe5\x7b\x35\x3b\x62\x45\x8f\x46\xf1\x5f\xe0\x22\xa6\x74\x41\xde\xdc\xe0\x1b\x16\xd5\x69\x18\x65\x2e\xa4\xd3\x5d\x25\x83\x89\x4a\x5e\x51\x3b\x38\xec\xe2\x59\x0b\x5c\x42\x3c\xbc\xeb\x93\x55\x51\xf9\x5b\xc9\x00\xe0\x26\x34\x30\x18\xac\x4f\xd5\xb9\xc0\xb6\xbd\xc8\xc2\x2f\xf2\x26\x0a\x10\x09\x27\x63\x47\x55\x1a\x2d\x70\x60\x9c\x6a\x02\xd1\xf9\x26\x8e\x7d\x19\xf4\x33\x2e\x95\x51\x0b\x10\x68\xab\xc7\xee\x5e\xcf\x35\x4c\x26\xad\x30\x2c\x76\xa6\xfd\x95\x22\xe4\xe5\x3c\x38\xdf\x77\x0c\x23\x33\x3a\x74\x5c\x3a\x6f\xa5\xf5\x45\x47\x60\x56\x89\xfc\x5d\x82\x7a\x9d\x7d\x61\x61\x34\x11\xff\xee\xbe\xaf\xb6\xdb\xc9\x93\x40\x60\xb1\x51\xdd\x2c\x76\xda\x78\x63\xbe\x8e\xf1\xa4\x84\x34\xe5\x0e\xaf\x46\x26\x4b\x33\xd7\x63\x71\xfd\x64\x28\x28\xda\x65\xeb\xf9\x7b\xe9\x0f\x01\x52\x86\xc6\xe7\x7a\x0f\x27\x18\x4d\x0d\x05\x31\x81\xf5\x1d\xd2\xea\xe8\x63\x4d\x84\x08\x6a\x5e\x72\x1f\x27\x04\x0c\x14\x85\x4f\x47\x9a\x4b\x93\x44\x8f\xfb\xc7\x01\x7b\xfa\xcd\x13\x99\xf2\x44\xfa\xbb\xb6\x3a\xdd\xa0\xa9\x7b\xbe\x5c\x01\x98\x65\xe4\xdb\x3c\xae\x37\x87\x31\x15\x95\x00\x14\x8a\x4a\x17\xc8\xed\xb8\xf7\x46\x02\x98\x24\xc1\x78\x14\xf3\xb8\x77\xb1\xfa\xd9\xa8\x9b\x34\xf1\xb9\xff\xae\x07\x89\x9d\x9f\x2f\x6a\x14\x05\x18\x1e\x11\xd6\x0f\xb4\xee\x57\xd6\xf2\xd8\xca\x20\x13\x44\x59\xbb\x3a\xde\xd9\x94\xad\x93\x24\x10\x32\x4c\xed\x94\x72\xce\xdb\x26\x2f\xdb\x87\x6a\xf0\xbd\x64\x94\x81\x65\x9e\x69\xf4\xc0\x81\x2b\x64\x9c\x48\xc6\x7b\x46\x80\xf5\x91\x14\xcb\xb1\xe9\x6b\xd2\x51\xef\xf2\xe7\x12\xda\x73\x8d\xcd\xaa\xd4\x4f\x04\x16\xbe\x05\x8d\x55\x8f\xbd\x93\x71\x9a\x12\x08\xda\xd6\x99\xee\xd7\xab\xcd\xae\x6f\x02\x8b\x63\x5a\xd2\x9e\xff\x38\xbe\x23\x13\xc9\x08\x76\xb8\x7e\x03\x5b\x3b\xab\x16\x6d\x0d\x99\xc9\x88\x7c\x60\xcb\xee\x4d\xd2\x71\x36\xa3\xd0\xcf\x5a\xc9\x83\x98\xb0\x22\x15\x09\xd5\x0c\x72\xc4\x42\x0a\x08\x28\x7a\x61\x4f\xf3\x25\xe8\xa2\x84\x24\x20\x53\xd2\xce\xcb\xf9\x6c\xec\x9a\x29\xf6\x76\xbf\xf2\x1c\xdb\x42\x02\x70\x4a\xe3\x5d\x41\x93\xab\xbb\x52\x55\x47\x3c\x5c\x57\xb7\x43\x08\x50\x02\x72\xc2\xb2\x3a\xa5\xab\xbc\xb3\x5c\x7c\x69\x46\xfb\x52\x57\x3f\xf3\xf2\xf9\x30\xa2\x7c\x12\x52\x85\x81\xdd\x06\xa1\x94\xe7\xf7\xd2\xab\x24\x09\xa9\xe2\x94\x2a\x4c\x77\xeb\xfb\xfb\xc3\xd7\xd5\xd3\xcd\x24\x7e\x22\x15\x48\x22\x82\x5e\x59\x3c\x97\x67\xaf\xe9\x1a\x30\x1c\x98\xbc\x6f\xcf\x58\x2c\xd5\x88\x7e\xe8\x7e\x48\x1d\x58\x42\xc2\x83\xcc\xf5\x3d\xb4\x58\xef\xba\x51\xf9\x28\x8f\x38\x9d\xc2\x3a\x0e\x69\xb5\xad\x1f\x6e\x0e\x37\xdf\x1d\x95\xe4\xd5\x7a\xbf\xbf\x7b\xf8\x62\x35\xde\xfc\x53\x62\x10\x82\x55\x25\x82\xd9\x76\x27\x51\x3b\x0e\x99\x19\xb2\xd2\x5a\x91\xfb\x6a\x0f\xaf\xb8\x6a\x9e\xe0\xb5\x9f\xe8\x86\x6b\x8a\x11\x1f\x37\x95\xb6\x21\xee\x6f\xf8\x3e\x0b\xd4\x4b\x03\xb6\xf4\xe7\x2d\x6f\xc0\x19\xea\x8b\xe7\xaa\x0a\x44\xe0\xa9\xeb\x6d\xa9\x6a\xe7\xc5\x53\xc6\x85\x12\x6d\x8b\xa3\xa6\x02\x29\x8c\xcd\xc7\x75\x96\xbb\x65\x2d\x9c\x8f\x59\x2f\x49\x30\xe8\x12\x08\x15\xe8\x64\xd0\x10\x69\x6c\x9a\xae\x8f\xda\xaa\xc0\x44\x81\xa3\x15\xe9\x8e\x10\x3d\xd3\x8e\x17\x8a\x85\x9a\x2a\x08\x69\xd7\x9e\xe9\x8b\x4e\x9f\x30\x0c\x24\x41\x00\x1d\x37\x42\xdd\x92\x54\xd4\xc2\xca\x53\x51\x80\x44\x13\x58\x9d\xb0\xbc\xd6\x97\xdf\xfe\x83\xb9\xe0\xaf\x66\x01\xe1\x58\xfb\xa0\xb1\x65\xf3\xfe\x5f\xd0\x38\xc4\xb0\x3e\x18\xfa\x88\x09\xa1\xfb\xb2\x95\x59\xd9\xbd\x50\x51\x1a\x53\x80\xfd\x26\x37\x7f\x8f\xbf\x4b\xa8\x48\x6b\xe2\x25\xa6\xfa\x51\x4a\x03\x8d\xc8\x00\xa8\x59\x79\x0c\x34\xa9\x9a\x59\x9c\xea\x67\xd5\x67\x2a\x32\x29\x25\xb8\x0f\x9d\xe1\xf5\x63\x7b\x8b\x78\xf5\x4e\x77\x9e\x4e\x38\x15\x87\x69\xec\xc4\xe3\x8a\xf7\xab\xbc\xd6\x9b\xbc\xdc\x62\xbd\xc5\xba\xe9\x6d\x2f\xea\x24\x89\x44\xbf\x55\x2f\x63\x68\x8a\x4a\x84\x55\x48\xc6\x21\xa2\xa1\x12\x09\x83\xfb\x7b\x95\xeb\xdb\xaa\xfe\x02\xe5\x02\x1c\x5e\x25\x2a\xa5\x14\xcd\xe6\xfd\xb7\xdc\xd3\x1d\x77\x7f\x95\x6c\xa0\x53\x24\x88\xd5\xdf\xd9\x13\x54\x1a\x29\xda\xa4\xf4\x2f\x33\x68\x67\x08\x95\x26\x41\xea\xe4\xbb\x3f\x61\xb2\x14\x2a\x4d\xb9\x08\x89\xc9\xb2\xa6\x43\x90\x92\x26\x7f\x23\xc0\xad\x52\xc1\x08\x87\xde\xa0\x8b\x34\x8d\xb3\x60\xb3\xdf\x00\x26\xf9\xb8\x60\x69\x62\xea\x4c\xef\x2a\xd3\x34\x1b\x75\xdd\x56\xab\x7f\xcc\x28\xb5\xac\xa1\xe1\x4e\x2f\xfa\x9f\x79\xac\x75\x7a\x47\xc5\x88\x2f\xa3\x85\x57\x5b\xe4\x3b\x7b\xb8\x8c\x71\x72\x9f\xd6\xb5\x0a\x83\xdd\xf9\x78\x84\xfa\xfd\xbe\x7a\xce\xd5\x74\xeb\x53\x59\x14\x53\x48\xa1\x3c\x1f\x57\xba\xee\x3f\x7b\x16\x0b\xa5\xc7\x74\x96\x55\xd9\x62\xd9\xde\xdd\x4c\xf0\x61\x2a\x8b\x21\xea\x86\xe0\xb6\x3a\x56\x49\xbf\x43\x64\x8a\x07\xce\x03\xad\x8c\x73\xdb\xa6\x97\x99\x88\x82\x5e\x87\x45\xcd\x9f\xd1\x79\xab\x78\xcc\x82\xc0\x47\x36\xbb\xbe\x5f\xab\x73\xfd\x5c\xc0\xa5\x7b\xe4\x2f\xe0\x26\x0c\x1c\xbb\xcf\x20\xb3\x23\x14\x37\xe8\x43\x5c\x1b\xf8\x95\x1f\xcf\xc7\x9e\x2e\x76\x3a\x70\x02\x23\xd1\xc3\xb6\xab\x12\xef\x4a\xcb\xda\xf6\x5f\x42\x7f\x84\xfe\x7e\x10\x64\x34\xc1\x24\x96\x68\x72\x95\x43\xfd\x4e\xd6\xc8\x2e\x7f\xee\xf1\x8b\xd3\x1b\x83\x00\x1d\x8f\x34\x72\xd6\x33\xf2\x0d\xa1\xc0\xa4\x94\xab\xc7\xf6\x05\xa1\x20\x9b\xad\x2a\x86\xb0\x8a\x92\x09\x78\x66\x34\xfa\xe4\x96\x54\x7d\xfa\x3d\x65\x6a\xab\x56\xba\xc7\x5f\x15\xb9\xc2\xdb\xaa\xfa\x36\x5a\x8f\x32\xb5\x54\xfb\x8d\x15\x23\xdd\xb5\x1f\x84\x11\x94\x4a\x6d\xc4\x99\xd4\x6f\xeb\xea\xf8\xc1\x42\x53\x22\xa0\xc0\x59\x8d\xa7\xaa\x69\x86\x52\x08\xa5\x34\x23\xbb\xe4\x8a\xf0\xce\x57\x50\xbe\xf6\x2d\xc8\x54\x4f\x76\x47\xce\x5b\x77\xca\x5d\xaa\x9d\xba\xee\x3a\x0e\x49\xff\x78\xfd\x74\xbd\xc7\xa6\x1d\xfb\x1b\x0a\x83\x84\x0d\x2a\x73\xd7\xdb\x65\xc7\x4f\x61\x94\x51\xa6\x40\x3b\xa0\xeb\xe1\x58\xe9\xdc\x2c\x8b\x8e\x0a\x85\xc2\x10\x43\xb8\xb7\x32\xe7\xc9\x2d\xdf\xcd\xa4\x04\x05\x39\x78\xd1\x1b\x97\xac\x5f\x06\x6e\xb9\x8b\x4c\x04\x34\xfc\x7f\x62\x5d\x0d\xf5\x26\x3a\x08\x32\x93\x79\xb6\x6b\x4b\x5e\x40\x05\xb8\xb7\x38\x52\xf9\xe9\xba\xd9\x98\xd5\x1a\x9a\xf7\x99\x06\xbc\xd0\x2c\x00\x2b\xdb\x8a\x7a\x5b\x8d\xa9\x39\x85\x66\x2c\x45\x3d\x0b\xaf\xe6\xe5\xf3\x25\x97\xa2\xd0\x4c\xc7\xe4\xe8\x5a\xd8\xf3\x3f\x3e\xa8\x2b\xf0\xcb\x4d\x87\x61\xe0\x14\x71\x06\x37\xbe\xdb\xaf\x3b\xeb\xb8\xbe\x40\xcf\xeb\x10\x63\x47\x5b\x4a\x54\x0e\xb7\x96\x6a\xbe\x7f\x85\x28\x88\xe8\x6e\xda\x1e\xc4\xfd\x9f\xb5\xf5\x7c\x9e\x6b\x98\xed\xfa\xae\x43\x1c\x4a\x02\x93\x5c\xdf\x3f\x38\x4e\xf7\x4f\xf3\xc4\x3a\x36\x18\x04\xbe\x78\xd7\xf1\x6e\x5f\x3f\x7a\x80\xb3\x4e\x03\x45\x7c\x55\xf7\x55\xf9\x6c\x29\x4f\x7c\x43\x64\x1f\x9f\xe2\x9a\xe3\x1d\x4d\xa7\xdc\x50\x78\x90\x48\x8e\xb6\xeb\xa7\xc3\x7a\xff\x75\xfd\x74\xb8\x7a\x5c\x3d\x79\xec\xa3\xe6\x5c\x73\xf7\x91\x65\xae\x3f\x67\x2f\xd1\x5c\x29\x2f\x19\x7e\x5b\xe4\xcf\x2f\xad\x67\xe1\x70\x27\x04\x4b\x97\x14\x6f\xbc\xcb\xa3\x45\xa2\x7c\x16\x72\x03\xbf\xae\xe1\xc4\x82\xdf\xff\xb1\x14\xd9\xd0\x02\x45\x26\x06\x86\xb1\x1b\x84\x62\x92\xa9\xd1\x10\xa4\x84\x49\x21\x7b\x74\xf7\x13\x4e\xbf\xd5\x70\x3a\x61\xfd\xa5\x2a\xf0\xe8\xe8\xb4\x27\xb3\x0d\x44\x46\x9f\xab\xf9\x99\x93\x26\xfb\x6c\x9e\xca\x30\xa4\x4a\x56\xcf\xbe\x30\x8b\xf5\x0f\x9b\xbf\x96\x89\x49\x07\xce\xde\xa7\xaa\x58\xa6\xa6\x15\x5a\xa6\x19\xb3\xd3\x0a\xb4\x17\x3f\xc9\xe5\xb9\xad\x3c\x43\xd4\xac\x7b\x96\x41\xd4\xdf\x77\xd7\x82\x31\x17\x84\xc0\xfd\x48\x4a\x2d\x09\x45\x77\xfd\xed\x8f\xcf\xd5\xd4\x85\x56\x41\x4c\x3c\x4f\x57\xd7\xfb\x1f\x7f\xc5\x43\x2a\xb4\x72\x56\x6b\x77\x82\xf7\xbe\xe0\x2d\x7a\x62\x0b\xbf\x91\x6a\x1d\x84\x84\x99\xd9\x62\x6d\x50\x51\x66\xd6\x1d\x0d\x7d\x0f\x1e\x86\xee\x63\xf7\xee\xf5\x13\x7a\x29\xb1\xd9\x58\xa1\xb6\xe1\x01\x3a\x00\xa4\xcc\xdb\x4d\xd5\x9b\x0f\x7d\xd8\xc3\xf5\x35\xa1\xad\x09\x72\x72\xf9\xda\x43\xfa\x56\x5a\xe7\x4b\xb2\xf7\xfe\xb2\xd8\xd0\x8c\xa1\xe8\xde\x44\x8a\x4c\x68\xc3\x05\x95\x29\xee\x14\x94\x3a\x2f\xe1\x2d\x87\x72\xfd\xad\xae\x4a\x47\x30\x2b\x30\x48\x20\x72\x85\xac\xc4\xb5\x99\x63\xa1\xc3\xbe\x51\xd8\x3a\x54\xd0\xfa\x47\xd5\xe2\x16\xf2\x0f\xca\x88\x30\x40\x43\xf2\xae\x3e\xdf\xe1\x42\x62\x0b\x3c\xba\x02\x03\x93\x08\x37\x80\xeb\xce\x74\xde\x42\xed\xf9\x27\x17\x26\x86\x4b\x43\x7d\xbc\xfa\x90\x85\x49\xa0\x3d\x68\xdb\x6f\x31\xb3\xdf\x64\xa1\x4d\x6c\x10\xd4\x0b\x6a\x7d\xf5\x7e\x49\x9f\x82\x4c\x09\xad\x06\x0f\x8a\x9e\x7d\xeb\x72\xca\xf3\xfb\x19\x20\xc0\x87\xf2\x2c\x09\xeb\xf3\xbc\x4b\x18\xc5\x3c\x1a\x22\x48\x16\x2e\xb8\xb8\xa2\x30\x94\x12\xc1\x93\xa8\x19\xfc\xd1\x17\xe3\x61\x94\x68\x0a\x92\x9c\xaa\xaa\x20\x03\xeb\x93\x39\x8e\x71\xca\x71\x20\xc3\xb9\x87\x99\x4a\x8e\xc0\x24\x46\x0a\x4d\xaf\x0a\xfc\x36\x58\x6b\x98\x70\x91\x45\x0e\x7c\xef\x3e\xdc\xa3\x19\x1a\x15\x01\x0b\xfc\xf9\x7c\xa7\x2a\x0a\xa3\x4c\xef\x9c\x09\xab\x0b\xf8\xed\x0c\xf9\x94\x82\x79\xf9\x8d\xb9\xb4\x55\xc6\x05\x34\xed\xee\x2c\x87\xca\xe6\xaa\x7e\x34\xb3\x81\x04\x30\x29\xeb\xcf\x8f\xbc\x17\x91\x11\x08\x2a\x53\x23\xf8\xe7\xa3\x52\xe7\x13\x94\xca\x87\x4a\x50\xb2\x94\x8c\xc0\x3e\x21\x4f\x44\x3e\xeb\xfd\xd7\x0f\x9e\x4a\x86\xa9\xa2\x15\xb8\x7a\xf8\xb2\x3e\xec\xae\x7b\x41\x23\x81\x12\x02\xf2\xb7\x9a\x97\xea\xa7\xa3\x59\xfb\x01\xc3\x93\xa8\x21\x57\xe8\x64\x3c\xda\x25\xca\x77\x81\x2a\x36\x4c\xf8\x68\x26\xd4\xed\xaa\xd4\x8e\xab\x76\xd9\x3e\x42\xcd\x22\x4a\xb1\xf4\x24\x9d\x16\xf0\xd9\xff\xb2\x8e\x2c\x65\x58\x63\x99\xb4\xaf\xab\xe3\xb1\x2a\x07\x5d\x6c\xcb\x8b\xe9\xd8\x07\x05\x6a\x03\x99\xf6\x8a\xc2\x6d\xb7\x7f\xc3\xf7\xba\x58\x8a\x12\x20\x26\xb1\xc9\xbc\xe1\x68\xd1\x3f\xd3\x57\x41\x8c\xc8\x28\xbf\x59\xff\x58\xdf\x3f\x6e\xd7\x4f\x3e\x72\x88\x26\xe5\x89\x03\x43\x76\x3e\xe8\xbe\xda\x60\x79\x5e\x94\x27\x14\x68\x32\xab\xa2\x46\xcb\xe4\xc2\x63\x42\x23\x13\xb2\xfb\xaa\x82\x80\xe6\xee\x17\x4c\x10\x64\x41\xd4\x1b\xe7\xdd\x38\xd6\xee\x29\xa7\x93\xc7\x04\x2c\x91\x61\x4f\x43\xe5\x02\x14\x73\x11\x6d\x61\x02\x19\x3b\x1a\xaf\xe7\x83\xc6\xe3\xb9\xae\xe1\x19\x0f\x06\x3f\x06\xe1\xf8\x0b\x95\x65\x29\xdb\x42\xdd\xa0\xe5\xcf\x98\x57\x70\x9a\x40\x69\xaa\x33\xac\x71\x60\x54\xb9\x7a\xff\xf6\xc7\xf5\xf2\x66\x6a\x02\x93\x51\x64\x90\xb4\xa6\xce\x45\xe7\xe1\x6c\x6b\x6c\xf0\x92\xf6\xde\x5d\xc0\x98\xf5\x1f\xb7\xbf\xfb\x78\xbd\x61\x71\x44\xa4\xad\xa7\xaa\x69\x0f\x9d\x5b\xf9\xfc\xde\x97\x81\x4d\xaf\x4d\x2d\x71\xf2\xee\x05\xca\x9b\x1c\xca\xfb\x1c\xca\xfe\x26\x82\x67\xda\x07\x57\xd6\xbf\x5a\xaa\xbe\x23\xa8\x2c\x09\xbc\xad\x87\xc8\x85\x61\x90\xd2\xde\x73\x28\xab\x0d\xb4\xea\x25\x2f\x9f\xbb\xe3\xa2\x6f\x8f\x64\x4c\xc8\xf0\xd3\xb9\xdd\xd7\x88\x8f\xe5\x87\xdc\xe4\xc2\x24\x19\x7a\xde\xc9\x55\x33\xcb\xcf\xf9\x2e\xc2\x50\xa4\x88\x86\xdd\x62\x79\x2c\x3e\xdc\xb5\xa7\xb1\x25\xd9\x7d\x5a\x3d\xdc\x3c\x6e\xee\xfe\xb9\x7e\x3a\x3c\xad\xf7\x4f\x7f\x1c\xae\x1f\xbf\x3f\xec\x87\x5e\x59\x18\xf4\xe8\x48\x0a\x91\xe7\x13\x4e\xfe\xe9\x77\x49\xb9\xe1\x4e\x25\xa7\x9b\x69\x24\x1c\x3c\xaa\x1e\x32\x59\x6c\xa8\xaa\x64\xf0\x25\x77\x33\xb5\x5f\x61\x32\xe0\x99\x2d\x93\x5c\xb5\xf7\x08\xcd\xa7\x1a\xd5\xc2\x64\x98\x06\xce\x7e\x70\xf5\x6c\x43\xa1\x35\x1f\x59\x6f\x46\x04\x3a\xed\x99\x79\xa8\xde\x7f\xaa\xa3\x28\x8c\x48\xac\xaa\x2c\x81\xab\xdd\x36\xdf\x6d\xd5\xbd\xc7\x6b\x44\x9a\x7a\xf7\xdf\xb1\x5e\xde\x22\xda\x5a\xf7\xbe\x8b\xb4\xb4\x03\x03\x6d\xcc\xfa\x97\xa3\x2b\x1b\x02\xd5\xd3\x37\x16\x4a\x65\x8e\x31\xe4\x0b\x34\x54\xbe\xfb\x81\xf3\x69\x24\xe3\x13\x5f\x70\x29\x99\x34\xbd\xb9\x8a\x52\xee\xd4\x75\xba\xbf\x2e\x67\xe2\x8c\x8a\x53\x6e\x4d\x5b\x92\xa9\xed\xf5\x98\xfd\x5b\x69\x6e\xf7\x7d\xc8\xeb\x9b\xba\x3a\x1d\x2e\xd6\xfc\x45\xb6\xa3\xbf\xd0\x6a\xff\x50\x68\xc3\x46\xb1\xfb\x7b\x9a\x84\xa2\xdc\x67\x57\xba\x4c\xf2\x41\xd6\xa0\x9b\xc3\x6b\xa7\xf7\xc4\xc8\xa6\x5a\x1b\x6c\x9d\x71\xea\xf3\xc4\xe3\x25\xe3\x3b\xeb\x4c\xf5\x0c\xc1\x9b\x19\x95\x97\xeb\x63\x52\x61\xf5\xdc\x6d\x9e\xc2\x72\x21\x4c\xee\x03\x41\x90\x0a\x42\x7b\x1e\x74\xd5\xd7\x6d\xf9\x26\x11\x52\x04\x7a\x45\xba\x23\xc3\x5f\x55\x18\x8e\xa2\xc0\x43\xc8\x01\x82\x40\x99\xd8\xb2\x73\x92\x42\xca\xa0\x4c\x01\x41\x80\x21\x0e\xce\x80\xb3\x74\xa7\x68\x5a\x08\x58\x64\xd5\xa8\x72\x55\x1d\x9a\xc1\x35\x85\x20\x04\x6b\xa8\x10\x3e\xc6\x71\xb8\xf7\x6d\x5a\x05\xa9\xaf\x85\x31\xd5\x64\xbf\x80\x20\x44\x49\x3e\xcb\x06\xb0\x81\x9f\xe0\x2f\x8a\x84\x55\x61\xfb\xf2\xfb\xef\xfe\x4f\x31\x43\xb2\x14\x09\xa2\x72\x5b\x57\xc7\xad\xad\x95\xea\xdb\xe3\xc8\x2a\x8b\x29\x75\x3e\x92\x51\xa1\xfb\xa6\x84\x33\xd5\xf3\xbf\x51\xdd\x7b\xdf\xc4\x13\xf2\x10\xd7\xa7\xe2\xdc\xcc\x80\xae\x10\xc4\x46\x78\xfb\x8f\xb2\xf2\x94\xbd\x7b\xf7\xad\x69\x60\xe5\x84\xbe\x3c\xde\xdf\x1c\x56\x9b\x6e\x03\x3b\xec\xb7\x7b\xdf\x9c\x39\x86\x8c\x53\x5d\x1d\xab\xee\xbb\x8f\xd8\x28\x20\xe0\x51\x24\xdc\x81\x7f\x0b\xaf\x97\xa5\x1f\x10\x08\x66\x28\x06\x4b\x14\xb1\xdb\x73\xa9\x5e\xee\xca\x59\x7a\x2f\xf5\x28\x13\x08\x44\xc2\x89\x1c\x54\x41\xf3\x52\x9d\xdb\xf5\xe3\xee\xca\x7e\x0a\x17\x90\x39\xac\xee\xef\xfd\x6f\x8b\xd4\x24\x9e\x29\xf2\x03\x0e\x37\xdf\x53\xa3\x41\x6f\xe2\x6d\x1c\xfd\x95\x6b\x83\xd0\x86\x0f\x9c\x56\xe7\xda\x72\xe6\x7d\x04\xbb\x87\x40\x06\x40\x69\xf7\xcd\xea\xf7\xc3\x6e\xbf\xfa\xb2\x3e\xb0\x71\x66\x0d\x02\x19\x8a\xd8\xa5\xdb\x1d\x66\x78\x4c\x72\x06\x81\x8a\xac\xd3\xf4\x9c\xbf\xe1\x06\x1f\xee\xee\x87\x16\x60\x56\x36\xb4\x6d\x61\xa6\xe6\x00\x81\xe6\xcc\xa9\xfc\x36\x79\x59\x4d\x1c\x31\x08\x30\x88\xd0\x4d\x8d\xef\x77\x65\xcb\xad\x37\x30\x9d\xa3\x18\x08\xe8\x81\xae\x65\x33\xa7\x5b\x84\x00\x43\xab\x16\xe2\xab\xff\xe7\x08\xb9\xc5\xe0\x06\x04\xa8\x0c\xe1\x21\xee\xab\x67\x47\xfa\x63\xd5\x53\x8a\xa1\x44\x6d\xfa\x3b\x06\x91\x40\xb5\xa4\x98\x65\x53\x64\x0b\x72\x53\xc0\x02\x63\xa5\x27\xb6\x77\x0f\x56\xe0\xd9\xbd\x2d\x63\xa1\x2d\x5d\x7c\xa9\xce\x0d\x2e\x06\x68\x81\x31\x6e\xc8\xd9\xda\x7d\x7d\xf8\x67\x7f\x9d\x36\xd2\x86\x37\x35\xe2\xd1\xc9\xb3\x2f\x65\x2e\x96\x2b\xd2\x81\x79\xb9\xe6\x31\xaf\xcd\x13\x8e\xe5\x03\xfb\x23\xb3\xeb\xac\x2d\xb5\xdb\xbb\x1c\xaf\x46\x16\x89\xc4\x83\xfe\x27\xe5\xbf\xdc\xb7\x6b\x46\xf3\x47\x5b\xc2\xfb\xd5\xb9\xad\x8e\xdd\xa8\x5a\xe2\x4e\x7f\x97\x38\x12\xda\x82\xd7\xdf\x1f\x8d\xb9\x5e\x2a\x6b\xf5\x3d\x4d\x9c\xba\x02\x84\x06\xf2\x7a\x57\x15\x63\xaa\x36\x60\x49\xa8\x88\x8f\xf3\x5c\x52\x15\xde\xf2\xb4\x67\x49\x64\x41\x70\x3a\x6f\xe4\xb9\x6e\x88\xec\x66\xb9\xb8\x10\x58\x22\x22\x2a\xc3\xb7\x09\x81\x59\x12\xe5\xd3\x54\x11\xb0\x04\x25\xf7\x8a\x9a\x95\x85\xf4\xbb\x96\x54\xa5\xda\x6d\x35\x0d\xb6\xa7\xcb\x30\x77\xd7\x45\xfa\x1a\xf8\xce\x4a\x3e\xc4\xb3\xf6\x8c\x67\x31\x9b\xb8\x51\x5a\xcf\x67\x5d\x66\xd0\xb8\xb8\xbc\xdf\x55\xac\xc2\xf1\xb4\x1b\x4f\x91\xa6\xc2\x6f\x5f\xef\xf6\xeb\xfb\xbb\xdd\x7e\x7d\x73\xd8\x3e\xad\x37\x77\xdf\x37\x23\x5d\x6d\x60\x22\x88\x2c\xb4\xb2\x3b\x41\x2d\xc3\xc2\xf4\x46\xdd\x06\x6c\x13\xf1\xaa\x75\x35\x62\x1f\xda\xae\xc0\x20\x43\x0b\x47\x6b\xf1\x68\x65\x75\x2c\xf4\xf3\xe2\xae\x32\x0e\x2c\x72\xae\x9b\xe4\xd6\xbc\x99\x6c\x43\x0c\x94\x65\xb7\xf0\xa6\xd6\x98\x42\x65\xba\x7d\x32\x40\x19\xa9\x0b\x09\xd6\xd1\x54\x97\x61\x4a\x6c\x28\xa3\x02\xc9\x15\xc1\x22\x70\xfe\x85\x64\x1a\x49\xb7\x39\x5e\x6f\xf6\xab\x67\xc8\xcb\xc6\xe6\x3f\xfc\x73\x49\x09\x04\x8f\xdc\x63\xd3\xde\x56\xd5\xf0\x67\x19\x07\x5e\xd1\xe9\x19\xda\xfc\x0d\x09\x3f\xda\xb7\x2b\x20\x4d\x2a\x4b\x16\xd1\x2d\xac\xa6\xb7\x51\x80\x49\x93\x11\x8c\xd2\x6a\x13\x5a\x61\xb5\x5e\x25\xc8\xf5\x51\x81\x25\x6f\xc3\x63\xde\xae\x7f\xa1\x3a\x0f\x47\x2f\x53\x91\x50\x2e\x80\x7b\x77\x77\x77\x78\x0a\x67\xaf\xa5\xe2\x98\xf8\x45\x6e\xe0\x74\x2a\xd0\xa1\xa5\xfa\xa1\x56\xc6\xa6\xd0\xfa\xc2\x2e\x1a\xc5\xbe\x34\x6c\xbc\x77\x4c\x0b\xf9\xdc\xf5\x3a\xb5\x33\x5f\x63\x8b\xf5\x31\x2f\xd1\xd3\xec\x7d\xf0\xbd\xf4\x40\xb1\xb4\xc3\x52\xf7\xf1\x1e\x60\xc8\x52\x1a\xfe\x26\x7f\x2e\xa7\x64\x93\xb6\x43\x18\x70\x41\x89\xa2\x55\xad\xce\xfe\xf9\xc3\xc0\x18\x2f\xb8\xf5\x1b\xe6\x0e\x67\xd6\xd9\x2e\x4b\x31\x08\x08\xc3\x28\x23\xf7\x5c\x5b\xc1\x3f\xff\x65\xc3\x30\x12\x91\x1c\xb1\x1f\xec\x2e\x95\xbb\x20\x8c\x22\x23\xa3\x7e\x8f\x1e\x25\xdb\x21\x4c\x45\x68\xb9\x47\xf2\x23\xee\xab\xdb\xbc\xcc\x9b\x17\x3b\xa7\x47\x06\x54\x98\x25\xa9\x71\x1e\xf9\x6f\x54\x4a\x35\x7d\xc1\x2c\x95\x32\xf5\xe2\x18\x1e\x85\x38\xed\xc2\x23\x61\x25\x11\x3d\x87\xe4\x94\xe1\xc8\xf7\x42\x5b\x10\xb8\xfe\x7d\xff\xb4\xba\x59\x93\xf4\xcb\xc7\x0c\xbb\x10\x72\xc3\x69\xe8\x5d\x49\xe9\x10\x6d\x80\x50\x04\x86\xc4\x9f\xe5\xb9\x2e\x2d\xfd\xd6\xf8\xc0\x08\x45\x14\x11\xc9\xa3\x3c\xbf\xaf\x8a\xe2\xf1\xdc\xaa\xea\xf8\x41\x82\x0d\x42\x11\x07\x84\x69\xfa\x51\x75\x47\x13\xf9\x23\xfa\xb3\x2c\x16\x84\x9d\x61\x49\x0e\xc1\x4f\x38\xb9\xfa\x96\x8f\x43\x6b\x10\x42\x24\xa8\x52\xee\x19\x8a\x02\xa1\x19\x6d\x93\x93\xc4\xe2\x07\x17\x27\x51\xe0\xc0\x8d\xab\xa2\xb0\xcc\xef\xfd\x34\x93\x41\xc2\x2d\x87\xc7\x93\x15\x96\x9b\x8d\xb8\x0c\x35\x1d\x79\x1b\x6c\xc1\x2b\xdc\x7f\xe4\x4a\x7d\x7e\xca\x84\x32\xe3\x34\xe2\x26\x2f\xf5\xa4\x6e\x6c\xde\x4f\x30\xd6\xeb\xa3\x91\x86\xcf\xfe\x75\xf6\x54\x8a\x49\x2a\x68\x22\xcc\x8e\x15\x44\x9a\xf7\xe0\x89\x77\x1d\x3a\xa3\xca\xc5\x91\x2e\x2d\x86\x50\xa9\x94\x48\x32\x0e\xae\x30\xb6\x5b\xec\x4d\x33\xaa\x36\xff\x9f\x0f\xd0\xd9\x10\x22\x53\xa9\x3b\xd9\xfa\x03\xfe\xd1\x38\x50\xca\x6c\x7e\x63\x6c\x11\x74\x5e\xe4\xce\x6a\x00\x8e\xf5\xb3\x21\x44\x65\xb4\x5b\xab\x9b\xaa\x21\x95\x9f\xe9\x5d\xa2\x40\x04\xe4\x45\x69\x7c\xdb\xad\x1f\x76\x17\xb8\x60\x88\x02\x94\x94\xa8\x7c\xa9\x8a\xf7\x5b\x27\x2b\x79\x7b\x2e\xf5\xd4\x76\x8d\x58\x14\xd0\xa1\x6d\x21\xc6\xf8\x61\x7a\x1a\x22\x16\x2b\xb2\x8f\x6f\xbf\x3f\xdc\x1c\xbe\xac\xf6\x5f\xd7\x4f\x77\x0f\x5f\xc6\xc7\x6d\xc4\x44\x22\x06\xe0\x1e\xd5\x46\x7d\x3a\x13\x22\x86\x48\x8a\xc7\x1b\x9b\x31\xeb\x9e\x2f\x2f\x9f\xbf\x54\x50\xcc\x8a\xa2\x5c\xff\x50\x71\xcf\xac\x76\x53\x95\xd0\x7a\x32\x76\x88\x62\x26\x95\x2b\x7b\x71\x6f\x3b\x9d\x07\x51\xac\x90\xc6\xd4\xa7\x98\x3b\xcb\xf5\x6a\x7f\xfd\x29\x4c\x1f\xa2\x24\x60\x64\xb3\x38\xaf\xde\x3f\xd5\xa7\xeb\x2c\x4a\x03\xa4\xc8\xb5\x0b\x25\xfd\x86\xb9\x7f\xca\x34\xb4\x49\x88\xee\xc3\xda\x57\x76\x8e\xee\x13\xfe\xf7\x9c\xd7\x78\x21\x14\xd3\x5d\x62\x05\xbf\xee\xae\x1f\x3b\x8f\xe7\x69\xcf\xfa\x9b\xa5\x9a\xb4\x57\x9a\xca\xb4\xd7\x30\xb3\xf3\x23\x1e\x30\x4a\x62\x58\x7e\x3e\xca\xc5\x74\x1b\xf5\xd5\xf9\x7d\x22\xbc\x32\x4b\xb8\x40\xc4\x63\x6b\xf7\xeb\xce\xb2\x7e\x3c\x61\xb9\x24\x71\x0e\x11\x4f\x91\xbb\x3a\xd4\xf3\x69\x75\x94\x79\x38\x1b\x6f\x9e\x49\x15\xf6\x2c\xb6\x0f\x55\x7b\x71\x07\x23\xd0\x52\xb7\x13\xa9\xf6\xb4\x51\xa4\xa1\xd5\x49\xce\x4b\x9b\xaa\x09\xfd\x5b\x0b\x29\xa9\xfe\x9f\x58\x28\x2d\xdc\xe2\x1a\x4e\xce\xf7\x59\xde\x48\x22\x08\x90\x04\xf4\xcd\x30\xbf\xfc\xed\x00\xb8\x93\xf5\xfb\xfd\xd7\xa6\xfa\xfd\x57\xff\x77\xa9\xc8\xa2\x19\x88\x10\x8f\x57\xbe\x4d\x06\x92\xb0\x03\xb4\x90\xf2\x37\x3c\x74\x86\x41\x73\xa8\xcc\xc1\xeb\x73\xb8\x8e\x2a\x56\xa4\x03\xe7\xa0\xbf\x97\x18\x19\x88\x94\x94\x84\x58\xee\x96\xd1\xd3\x61\xb7\x5f\x6f\xfd\xc5\x3a\xc4\x44\x8d\x21\x7f\x43\x2c\xdf\xf7\x88\x25\x1b\xc0\xa2\xbb\x9f\xc3\x1c\x98\x9e\x7e\x91\x06\x1b\x73\x75\x5b\xdb\xb7\xfd\xec\x3e\x52\xb1\x3e\xba\x42\xce\xe3\xb6\x67\xe8\x1d\x9e\x14\x83\x80\x79\x7e\xc0\x5a\xe6\x2d\x41\x35\x83\xd9\x57\xc7\x90\x53\x4d\x92\x7b\x63\xa7\xcc\x42\xa5\x36\xfe\xbd\x10\x65\xe2\x56\xaa\x6e\x11\x8e\x44\x85\xd7\xd9\x32\xf3\x19\x64\x92\x8c\xa2\xca\x0d\x5a\x09\x2d\xcf\xb5\x7b\x51\xff\x03\x71\x90\x70\xad\x87\x5c\xd1\x0d\x61\x7e\x8e\xa7\x02\xbb\x1d\xf1\xea\x7d\x0b\x2d\x11\x72\x59\x51\xcd\x51\x41\x07\xc4\x41\x6a\xd5\x5f\x3b\xbb\xd3\x07\x55\x9f\x28\x7e\x75\xb1\xca\xfd\x15\x3c\x4e\x62\x67\x2f\x2c\x3b\x7d\x71\x20\xac\xe0\xc3\x6e\xbd\xff\xbe\x3d\xdc\x3c\x3e\xf8\x1d\x32\x0e\x33\x4d\xd2\xa8\x84\x4e\xb1\x98\xed\xbe\x09\x6c\x9c\x9f\x4e\x3b\x6b\xba\x4d\xfc\xdf\x38\x52\x92\x32\x0d\x27\x67\x7f\xfe\x86\xf9\xf3\x4b\x3b\x64\xd4\x66\x0f\xd1\xdd\x50\xba\x40\x1d\xe4\x47\x0a\xd4\x8d\x3f\x7b\x1c\x3b\x62\xb6\x89\x31\xe6\xdb\x74\x46\x18\xaf\xed\x97\xcd\x61\x28\x9b\x83\x38\xc9\x78\x92\xf4\xa5\xcf\x58\x57\x1b\x2c\x1b\xf8\x4f\x6f\x46\xc4\x29\x67\x1e\x78\x75\xed\x75\x01\x21\x4e\x45\x40\x00\x5b\xc7\x1e\x4e\xf5\x07\x0f\x8f\x4f\x9b\x95\x0f\x27\xc5\x59\x6a\x79\x14\x29\x80\xbd\xb5\xec\x27\xd8\x8b\xaa\xef\xf1\x78\x2a\xe6\x54\x88\x10\x67\x82\xa5\x7d\x29\x2f\x95\xa0\xac\xea\xe7\x99\x33\x16\xf3\x30\xd4\x0e\xec\x3f\xa6\x90\x59\xae\x51\x19\x5b\xfe\x31\x8f\x23\xe5\x2a\x55\xf4\x59\xb5\xd1\xa1\x38\xab\xd7\x77\x79\x7e\xdf\xd7\xa0\x5e\x87\xc1\xe2\x32\x26\x7a\x90\xcd\xf5\xdd\xa6\xff\x9b\x49\xec\x79\xd4\x42\xdd\x1e\x4e\xcf\x87\xff\x9e\xf3\x3f\x17\x52\x71\x10\x03\x88\xd0\x15\x70\x77\x96\xee\x1e\xe1\x68\x95\x07\xc7\x66\x68\x2c\xb3\x20\x4b\x3c\x3d\xcd\xeb\x7c\x20\x64\x96\x92\x58\x41\xf3\x5e\xa2\x7a\xa9\xab\x72\x7a\xad\x41\x29\x69\xcb\xfc\x85\xba\xb3\x34\x6c\xeb\x9c\x87\x6b\x3a\xcd\x55\x88\x5e\xce\x1d\x9b\xe6\xf0\x92\x6b\x8d\xe5\xc1\xb2\xd1\x5d\x66\xeb\x67\x73\x4f\x89\x14\x48\x7c\xba\xdb\xf6\x3f\xd6\xfa\x86\x58\x81\x1a\xa1\xce\x3a\x03\x8d\xb8\xea\x97\x4d\x90\x18\xa3\x90\x58\xd9\x37\x77\x0f\x77\x9b\xd5\xfd\xc1\x17\x67\xde\x3d\xfc\x58\xef\xf6\x9b\xb5\x4f\xfe\x74\x3d\xd3\xc4\x3a\x6d\x4d\x5b\x57\xef\x16\xf0\x68\x73\x3a\xd3\xd7\x34\xa1\x21\xf6\x39\x8d\x36\xd4\x4d\xb9\xaf\xbf\x43\x91\x01\xb1\xc9\xa4\x08\x27\xdb\x66\xfe\x27\xea\x59\x56\x05\x62\x23\x53\xaa\x28\x7f\xf4\x3a\x9b\xff\x98\x04\xb9\xfe\xc5\xdd\xc9\x9b\x04\xb1\x42\x57\x33\x31\x20\x7d\x26\x3f\x99\x04\x80\x14\xae\x1f\xa8\xa3\x3f\xa4\x11\x58\x98\x6a\x09\xe3\x9a\x6a\xc8\xf1\x54\xa9\x97\x83\x2b\xf7\x3a\xa8\x51\x3c\x2a\x61\x90\x7a\x7d\x18\x9b\x8b\xbe\xd3\xb7\x55\x4d\x2c\x31\x8b\xdb\x4c\x12\x82\x26\xac\x9c\x35\x8d\x7a\x1e\x4c\x68\x3f\x72\x92\x92\x28\x30\x41\x34\x95\xef\xbf\xed\x9c\xda\x7a\xf9\xf4\x4a\x22\x16\x48\x31\x6c\xee\x21\x31\xd7\xfb\xe7\x8d\xa4\x22\x26\x0a\x0a\x70\xef\x46\x0e\xfd\xa5\x69\x93\xc4\x41\x88\xc2\x53\xe5\x17\xb9\x7a\x27\x37\x70\xfa\x70\x71\x04\x84\x0f\xcf\x9b\x3b\xe5\xbc\xdc\x3e\x10\x91\xc4\x89\xa4\xf9\xe7\x10\xee\x3d\x92\x1f\x92\x44\x21\x49\xdd\x6d\x8b\x73\xb3\xed\xe3\x22\x49\xa2\x6d\x0d\xe4\x90\x74\xbb\xaa\xe1\x79\x90\xb1\x80\x24\x65\x89\x0a\xa6\xfc\xce\xcd\x16\xeb\xef\xbb\x9b\xd9\x83\xf1\xce\x41\x73\x5c\x4b\x87\x23\xfc\x3a\xe8\xe7\x5f\x23\x71\x4f\x0d\x79\x1f\x4c\x49\xb8\x42\xb2\xc3\xad\x6f\x71\x9f\x97\xaf\x0f\xd8\x7f\x61\x91\x65\x54\x2b\xbb\x59\xfd\xee\xb9\x3d\x56\x37\x3f\xee\x76\x8f\x3e\xc5\x0f\x89\xe0\xb1\xea\x8f\xb8\x51\x2a\x1d\x12\x88\x12\x70\x61\xc0\xef\xbb\x9b\x39\xee\x16\x12\x48\x84\xa5\xc5\x29\x9f\xf1\x42\xcb\x03\x12\x19\x1b\xcf\xca\xe1\x11\x0a\x7d\x13\x6a\x1b\xe2\x24\x4a\x12\xc2\x72\x78\xd6\xc7\x4f\xf1\x7d\x90\x28\x1e\x53\x95\x80\x4b\x81\xfd\xf7\x8c\xe7\x7e\x7a\x28\x11\xf4\xd2\xef\x54\x36\x72\x5d\x40\xd3\xb8\xaa\x86\x0f\xe6\xa7\x42\x4d\xde\x1c\x4d\x29\x65\x2d\x98\x16\x7e\x7d\xec\xcc\xfc\xbf\xfe\xeb\x7e\x4f\x27\x11\x31\xad\x36\xf9\x73\x39\x64\x97\xaf\x27\x1e\xb6\xef\x2a\x23\x63\xe3\x33\x65\x75\x26\x9e\xaa\x31\x31\x5c\xd7\xae\xc8\x9f\xca\x4f\xd5\x4f\xaf\xf4\xd1\xfd\xc3\xfa\xdf\x32\x61\x28\x7b\x7e\xc5\x57\x2a\x58\xbc\x0c\x22\x25\xc8\x63\x82\xc1\x95\xf9\x9f\xaf\x07\x8b\x5f\x25\x04\xfa\xdf\x67\x55\x9b\x6e\x3c\x26\x09\xc2\x5e\x33\x81\x08\x2a\x3f\x62\x1f\x9e\x0e\x8d\xc9\x18\xd9\xc0\x3b\x6c\xaf\xf3\xf6\x9d\xa0\x1d\xd3\x8f\x6f\x44\x46\x61\xad\xbb\x87\xbb\xfd\x1d\x89\x29\x5e\xed\xee\x6e\x5c\x5d\x34\xa4\xa1\xcc\xb2\x9e\x82\xe6\x05\x6a\xc7\x8f\xb6\xb8\xa1\xa7\x11\x0b\x49\x66\x81\x32\x90\xb6\x92\xd2\xdf\x27\x4a\xc3\x21\x03\x4f\x31\x8b\x7d\x45\x98\x84\x0f\x8e\x0a\x7f\x99\x0a\xad\x96\x6d\x5e\x76\x2e\xda\x5d\x39\x89\x02\xa7\x49\x90\x1a\xab\x24\xea\x72\xd6\x5b\x78\x47\x3d\x8e\xbb\xa7\x49\x1c\x61\x38\xe8\x3b\x38\xee\xa8\xbe\x51\xd0\xe9\x79\x95\xb7\xaa\xca\xcb\xfd\xd3\xe3\xc3\xdd\xef\x7d\x63\xa6\x28\x41\x67\xa3\x27\x55\xeb\x64\xec\xb1\xec\x1c\x52\xca\x7d\x8e\xcb\x97\x21\x4d\x59\x42\x78\xaa\x07\xfc\xb9\x5d\xdd\x51\xf4\xea\x34\x0b\xa6\xa4\x29\x26\xca\x51\xba\xec\xaa\x82\x12\xd1\x53\x60\xce\x6c\x44\xb3\x80\x31\xe3\x03\x19\x25\xbe\x13\x35\xf2\x68\x5e\xf6\x1d\x79\xc4\xb1\x1f\xdf\x51\xba\x39\x15\x81\xd5\x3f\x3c\x60\xa9\xaf\xb0\x75\x70\xeb\xe9\xae\x93\x0a\x11\x7b\x8d\xbf\xdd\x09\x14\x5e\x2d\xd0\x11\x41\x0a\x41\x40\x66\x90\x43\xca\xac\xdb\x97\x59\x49\x3b\xa4\xc0\x38\xbd\x5f\x7f\xfe\x12\x27\xfb\xf4\x14\x48\x41\x8b\x70\x84\xaa\x5c\xac\x9e\xe8\x7a\x81\x0f\x75\xae\xf4\x44\x67\x05\x52\xc9\x54\xe6\xc5\x50\x9c\xee\xbf\x6f\x09\x81\xe8\xf6\x8a\xaa\x7a\xed\xfc\xea\x6e\xfb\xeb\xac\x22\x1b\xed\xd0\xfb\xaa\xa7\x89\x5a\x9e\xc2\x32\x4e\xac\x64\x5e\x77\xe1\xee\x25\x3f\x35\x63\x22\x20\x36\x4b\xb0\xf9\x8b\x78\x44\x1b\xde\x9f\x24\x46\xd7\xe2\xf0\x34\x20\xb8\x1b\xd7\xaf\xd0\xbc\x7c\xbb\x14\x60\x74\x1d\x55\x96\x11\x1c\xf2\xa0\xaa\xb2\x39\x7f\xb8\xc0\x94\x64\x3e\x09\xea\xa2\xa3\xb5\x67\x59\x5b\x5e\x3f\x0a\x43\xaf\x76\xbe\x69\x9e\x1d\xf1\x8f\x6b\xd3\xa9\x89\xdc\xd9\xda\x56\xf5\xb1\x37\xb8\x52\xcd\x03\xf2\x5d\xa8\x64\x71\x33\xa4\xac\x53\x64\x11\x85\x01\x4e\x35\x15\x73\xd4\x57\xe7\x77\x12\x66\x6d\xda\xb3\x67\x3d\x80\x14\x43\x19\x3b\x40\x85\xf7\xe6\x3f\x60\xe4\x9a\xbd\x1c\x26\x22\x76\x67\x5b\xcf\x59\xd3\xbe\x60\xdd\x56\xf6\x33\xda\xac\xb0\xef\x2c\xb4\xc7\xdf\x0d\x89\xda\x91\xef\x91\xa2\x40\x0a\x3c\xf9\x5b\xed\xb0\x28\x6e\xf0\x08\x33\x29\x64\x48\x11\x23\xca\x60\xdd\xad\x36\xd6\x41\xc6\xce\x60\xfb\x0d\xf3\xe5\x6f\x90\x05\x29\xf8\x40\xd9\xd5\xf9\xdd\xc2\x09\x66\x3d\x40\xea\x21\x13\xbd\x7a\x83\x76\x90\xd7\x9d\xdd\x8c\x05\x49\xe2\xcc\x81\xd5\xdb\xf3\x26\x2f\x51\x6f\xb1\xbe\x81\xf7\xd9\x2d\x59\x64\x11\xa4\xc6\x55\x29\xec\xb0\xed\xbe\xfa\x0d\x9e\x6a\x9c\x6a\xda\xf9\x0b\x34\x52\xdd\x79\x55\xe2\xb6\x6a\x87\x08\x5a\x16\xc6\xcc\x12\x5d\xa3\x3a\xd7\x79\xfb\x7e\x70\x6f\xd9\xb7\x2b\x1b\xe3\x76\x98\x99\xa2\x3b\x1e\xad\x72\x71\x7f\x58\xfe\xa8\x5a\xd4\x0f\x95\xdd\x12\xd7\xdd\x80\x3d\x54\xa3\xcb\xc9\x19\xdb\x42\x0d\xb2\x2a\xaa\xdc\xaf\xfa\x2c\x0e\x80\x62\x28\xca\x13\xbc\xd8\x30\xf9\xd8\xbc\xc9\x62\x99\x92\x47\x4d\x55\xe9\x9e\x65\x69\xc6\xaf\xe4\xba\xa6\x69\xc8\xba\x17\xfc\xfd\x8f\x7f\xae\xfe\xd1\xff\x2d\x4e\x83\xd1\xe1\x3c\xdd\x9c\xb2\x2c\x0a\x45\xe4\x0b\x11\x1c\xe3\xcc\x53\x6f\x67\x3b\xb5\xd0\xff\x19\x25\xb3\x33\x1e\x69\xcb\x8b\x86\x58\x57\xef\xb3\xdb\x71\xa5\x08\x17\x75\xb3\xda\xdc\x5d\x56\x82\x40\xc6\x11\xed\x56\xd4\xeb\x55\x01\x0b\x2f\xf5\xaa\x20\x13\xcc\xa2\x24\x1d\x48\x75\xc0\xdd\xf7\x9a\xa6\xbe\x63\x68\x75\x2a\x9f\xd1\xeb\x6f\xce\xbe\xba\x10\xb1\x4f\x50\x4c\x0c\xc0\xed\xcf\xe5\x4d\x36\x53\xda\x50\x4d\xb7\xa3\xdc\xf8\x3f\x98\x27\xcb\xf3\x59\xc7\x22\xca\x7a\xa6\xd4\xce\x10\x1f\x49\xdc\x40\x86\xd2\xb2\xa5\x2b\x4b\xeb\x34\xc5\x2d\x12\x95\x30\xd5\xfb\xce\xb9\x50\x80\x33\x23\xb2\x70\x60\xd8\xb8\xc6\x02\x65\x9d\xb7\xb3\x65\xc2\xc3\xd8\x02\x99\x54\x55\x59\x67\xf1\x0d\xa7\x80\xae\x0f\x13\x2d\x1f\xfd\x7d\x2e\x60\x02\x3c\xcc\x52\x92\x8f\x38\x8c\x23\x5e\x53\x1e\xaf\xc9\x3c\xe0\x21\xb7\x01\x57\x9b\xfd\xbc\x08\xc2\xf0\x28\x0b\xfb\xb8\xa0\x23\xc1\x98\x16\x21\xfa\x7e\xc8\x09\x42\xe3\x4e\xf2\xf1\xc0\xf2\x38\x00\x62\xb2\xdc\x7e\xbb\x1a\x45\x9b\x78\xac\x59\x84\x7d\xb4\x89\xa8\x8e\x7b\xfa\x4f\xbf\xe2\x79\x12\x5a\x1e\xc5\x09\xfd\x53\xf3\xe1\x06\xc8\x93\x34\xa5\xca\xa8\x3a\x57\x2f\x93\x8f\x94\xa8\x80\x8c\x5e\x5b\x55\xf8\x68\xd6\xae\x32\x63\x76\x39\x06\x94\x81\xf3\x5b\xd9\x5d\xd9\x62\x5d\xf6\x01\x65\x9e\x6a\x0b\xbf\x00\xad\x3d\x38\xe6\xb3\xb0\xd3\xf8\xd3\x64\xa1\x2d\xce\xd2\x68\xe0\x5c\xb4\x77\xe5\xc9\x97\xb5\x01\xcf\x12\xa0\x38\x85\xc9\x9b\x17\x72\x99\xbf\x62\x71\x1a\x45\xf2\x7d\x37\x93\x50\x48\x18\x9d\x3a\xe6\xfb\x01\xdb\x97\x5e\xbc\xc1\xdf\x8c\x73\x05\x3d\x5b\x90\x83\x9c\x77\x07\xcc\xe0\x97\x72\x0e\x20\xbd\xd6\x82\xfd\x85\x47\x1b\x70\xf8\xde\xa0\x5e\x35\x63\xc1\x2c\xe0\x42\x28\xb2\xbf\x0e\x16\xd6\xe8\xf3\x66\xf3\x49\xb9\xb8\x86\x39\x24\x8a\x7c\x1a\x0b\x0f\xb3\x69\x28\x7d\xd7\x7f\x95\x6e\x58\x02\x7a\xf1\xba\x21\x3e\xc5\x9d\xa7\x38\xf2\x3d\x64\xc0\x98\xdb\x7f\x56\x87\xd5\x6e\x33\xfb\x60\x32\xe0\xc2\x26\x34\x5c\x8c\xf3\x32\x0b\xc6\xa5\x0e\x13\x67\x98\x1c\x24\xb6\x87\x39\x15\x4f\xd7\x43\xd0\x54\x34\x45\x7e\xb2\x2f\x3f\x2e\xed\x02\xae\x0d\xf3\x0c\xe1\x2b\x63\xf2\x22\xa7\x03\xc7\x54\xb3\xef\x83\x91\xd5\x81\x19\x59\x08\xa1\x63\x36\x99\xfe\x1e\x72\x7b\x10\x6d\x3c\x9a\xd7\xff\x90\xc9\x24\x31\x44\x7f\x5d\xfd\xb1\xda\x3f\x1e\x28\x01\x7e\x6d\xa9\x1a\x56\xbb\x75\xdf\x0b\xd2\xd4\xcd\xc2\x6d\xf5\x13\xeb\x73\x33\x4f\x88\x71\x83\x91\x64\x13\x06\x22\x9b\x1b\xea\x66\xed\xf7\xd2\x05\x5b\x50\xbb\xc0\xea\x2c\xaa\x2a\x82\x28\xa5\x68\xb5\x07\xb0\x50\x6c\xf1\x6f\xc4\x15\x45\x90\x4a\x1c\x98\x83\x1c\xe3\xfa\xc4\xbc\x60\x21\xf7\x7d\xc1\x56\x97\x19\xc4\xab\x73\x5d\x62\xed\xea\xe5\xa6\xe8\x67\x10\x8c\x05\x84\xcd\x7e\x2d\xf2\xd7\xfe\x6f\x3a\x31\xa4\xad\x9d\x17\xe7\x16\xb7\x93\xf8\xd2\xf4\x55\x18\x26\x64\x48\xe6\xcd\x43\xd5\xee\xb0\x30\xcb\x1b\xa1\x08\x53\xab\x48\x76\x24\x96\x58\xaa\xf8\x6c\x16\x12\xc9\x22\xcc\xe2\x50\x78\xd5\xa5\x09\x91\xf8\x62\x0c\x54\x44\x49\x4a\x5a\x8a\x77\xd1\xe4\xd0\x10\x91\x14\x94\x3d\xba\xcf\xeb\xf3\xaf\xe5\x28\xea\xc4\xcb\x16\x49\xac\xc9\x1a\xcb\x1d\x0f\xc5\x5d\x69\xa5\x12\xfc\x0d\x13\x8c\x28\x69\x8c\x84\x3d\x21\x3b\xd1\x46\x5b\x27\x0b\x52\x24\x86\x65\xdd\xf3\x5c\x7f\xf1\xe1\x54\x91\x06\x2c\x71\xa5\xed\x8f\xc6\x0b\x83\x38\x8e\xfb\xc7\xf2\xba\xb9\x9a\x19\x17\x82\x47\x82\xb2\x7f\xe6\x3c\xdb\x3f\x85\x90\x01\x1b\x93\xe7\x5d\x17\xf9\xe0\x84\x0a\x21\x21\x36\xfd\x2b\x8c\x8a\x79\xfa\x76\x49\x34\x43\x07\x8f\x86\x5a\x28\x42\x03\x01\x41\xe4\x85\x39\x7b\xc0\xf3\x07\xf8\xb7\x85\x68\x85\x90\x31\x4f\xf5\x20\x24\xb9\x14\xb5\x17\x4a\xa4\x84\x95\xbf\x81\xf7\x1b\x78\x5f\xb0\x9f\x84\x8e\x52\x92\xb5\xd1\x28\xcf\xcf\x87\x6e\x7e\x8c\x40\x5b\x42\x4b\x5b\xba\x49\x5b\x26\xf9\x23\xa0\xda\x59\x91\x2f\x08\x6d\xb8\x0a\x1c\x87\xda\xf5\x4b\xae\x5e\xb1\xdc\x42\xfd\x7a\x3d\x2a\x16\x73\x3d\x91\x09\x3a\x1f\x4a\xfc\xd5\xda\xaa\xe7\x71\x18\x41\x60\x82\xb1\x43\x14\x2c\x43\xf9\x41\x20\x86\x16\xb3\x59\x3d\x63\x9b\x8f\x8e\x61\x08\xd2\x18\xed\x47\x69\xb1\x6e\xce\x72\xbc\x99\x4c\xe7\x32\x04\x28\x89\xe3\xe2\xbe\x22\x6f\x6d\x59\x05\x61\x32\x92\xc0\x58\x68\x89\x0f\x8a\x11\xb1\xf2\xc2\x90\x03\x4b\x39\x77\x05\xd2\xdf\xc7\x4f\x30\x5d\x19\x3d\xcd\xd0\x68\x49\x02\x83\x8c\x6a\x5d\x6a\xf8\xf9\x5b\x7e\xc2\x55\xeb\x58\x7f\x2f\xe2\x50\x3e\x56\x0c\x61\x20\x52\xcf\x3d\x7c\x67\x25\x40\x59\x32\xc9\x9f\x41\x28\xad\x4c\x28\xf1\xe3\x5d\x57\xd6\x2f\x1f\x18\x36\x00\x22\x57\xee\xdb\xad\x9a\x9f\x25\xd6\x13\x85\x43\x80\x28\x14\xc4\x7e\xda\xd6\xe7\xa6\xfd\xc8\xfc\x82\x28\x49\x89\x6b\xe7\x44\x75\xf1\x3f\xab\xa1\x88\xbd\x6b\x13\x04\x7c\xb3\xc1\xe3\x23\x1e\xff\x31\x31\x2b\xfc\x8a\x86\x88\x07\x04\x21\xec\x9c\x8a\x27\x9c\x5b\x66\x10\x89\x8c\x7c\xaa\x9b\x1a\x9e\xab\xd2\xaa\xf1\xf9\x26\x19\xd1\xe1\x79\x20\xcd\xad\xe5\x6f\x1e\x99\xd4\xc3\xf3\xbe\xbd\x4b\xac\x89\x42\x74\x31\xae\x08\x91\xb1\x65\xc8\xab\xa2\xc5\xda\x6a\xe1\x54\xb5\x73\x06\xa7\xd3\xa4\x3f\x04\x20\x66\xa8\x87\x94\x23\x49\xab\xf7\x43\x98\x04\x8a\xd0\x53\x4e\x8c\xd3\x13\xf8\x5f\x68\x90\x5c\x26\x03\x20\x01\x06\x0e\xc0\x40\x36\x12\x34\x87\x06\xb1\x17\x20\x03\x48\x23\xcb\xcb\xf5\xec\x2a\x4f\xd7\x85\x83\xdd\xba\x76\x9e\x62\x68\xf5\x1e\x5a\xf5\xe2\xa0\x47\xae\x49\x70\x0b\xa3\x6b\x3d\xb1\xd5\xa7\x20\x13\x10\x90\x19\x31\x36\x73\x89\x95\xd2\xdf\x0c\xa2\xd8\xe3\x09\xc9\xd6\x1c\x7d\x08\xdf\x03\x6d\xf1\x8f\x13\x7e\x21\x9c\x2b\x9b\x98\x27\xa0\x34\xa3\x05\xb0\x79\x9f\x10\x28\x4e\xe6\xb3\x32\x76\x96\x80\x67\xaa\x1e\xf6\x0f\xd0\x90\x46\x96\xe9\xe6\x97\x85\x92\x8c\x72\x30\x80\x71\x48\x9a\x2b\x58\xea\x3b\x55\x4d\xce\x1c\x40\x19\xd9\x00\x6c\x7e\x3c\x15\xb8\xff\xb2\x9e\x9d\xdd\x60\xa2\x88\xe8\xd1\x2a\x63\x6c\x96\xee\xe0\xa0\xe1\xd3\x77\x34\x09\xa7\x2c\x2e\x99\x0d\xdd\xf2\xf7\xa7\xd0\x07\xcb\xc6\x70\xcb\x20\xfb\x8c\x2d\x14\x45\x8d\xcd\xb9\xf5\x26\xba\x0c\x02\xeb\x89\xfc\x91\xdf\xe7\x50\x51\x4d\xdc\x27\xfb\x8e\x0c\x22\x15\x26\x2e\x2c\x5c\xbf\xf9\x1c\x8d\x15\x99\x5b\x95\xda\x83\xab\xfa\xbb\x4b\x41\x29\xfe\x26\x7f\x2e\x9f\x50\x55\x6f\x58\xbf\x2f\x05\xf3\x25\x8b\xe2\x94\x8d\x52\x8f\x0b\xf0\x10\xc9\x22\x49\x96\x7a\xde\xfd\xe0\xf3\x68\xf7\x90\x2c\x06\x72\x63\xac\x1d\x75\x05\xe4\x26\xce\xe6\xd9\xbf\xfe\xbd\xc8\xa2\x08\x32\x64\x29\x8b\x7c\xa4\xa1\x3a\xb9\x60\x9c\xbf\x75\x08\x26\x94\x0e\x0a\xd8\x59\x77\x36\x6d\x39\xda\xd9\x64\xc4\x2d\xfa\x87\x0a\xea\xfc\x80\x50\xb5\xc5\xf2\x1e\x21\xe3\x50\xda\x44\x58\x0d\x65\xfb\xfb\xf6\x13\x75\x1c\x90\x31\x0a\x8a\xb4\x54\x25\xae\x6f\xbe\xf8\x9f\x4c\x42\xae\x2c\x03\xf7\x5b\xf5\x8a\x17\xa2\x40\x4b\xa8\x4f\x99\x20\x43\x36\x7c\x39\x77\x1c\xdd\x9e\x4b\x9a\xe0\x50\xf4\xc4\x6b\x20\x53\x16\x91\x87\x4e\x5e\xc8\xd3\xb9\xec\xe5\xcf\xfc\x7e\x20\x33\x10\x44\xe7\x01\xe7\x1a\xec\x76\xdf\xe6\xd2\xb9\xe6\x13\xbd\xd2\xae\xab\x24\xec\x95\x85\x61\x37\x5f\xa1\xa8\xa2\x9b\xd9\xd7\xcf\xb4\xe5\xe3\xee\xcb\x97\x97\xf8\xc9\x06\x37\x71\x2e\xc7\x03\x32\xc3\x98\xd2\xcf\x54\xcf\x4c\xc8\xb0\x43\xd8\x3f\xab\x01\x4a\xf4\x7e\xbf\x5a\xfb\x7c\x80\x14\xcc\x32\xdf\xbe\xf8\xdf\x49\xe3\x3e\xf7\x2c\x45\x6a\x28\xe6\xd7\x62\xd3\x7a\xac\x1b\x94\xb2\xaf\xef\xe8\xbf\x3c\x84\x21\x45\x39\xbb\x69\x73\x02\x59\xe0\x66\x70\xe3\x25\xc4\x3a\x74\x39\xbc\xb1\x25\x2b\x21\x35\x2e\xac\xd2\xde\x8f\xbb\xf3\x94\xd6\x28\x1d\xa0\xbd\x30\x03\x48\x30\x56\xd7\xa2\xc4\x5f\xb9\xa7\xd4\x03\x29\x03\x0b\x5e\x2f\xab\x36\x57\xf8\x5b\x5e\xf6\xa5\x92\xbe\x03\x0a\x32\x96\x6e\xd6\xb7\xab\xef\xf7\xfb\xc3\x97\xd5\x66\x7d\xb8\x7e\xdc\x79\x2b\x56\xaa\x20\x85\xc1\xc1\xdf\x62\x4d\xd2\x57\x87\xe7\x16\x93\xe0\xb5\x17\xf3\x05\xa9\x14\x28\x31\x42\xdc\x6f\xb0\x05\x4a\x15\x4f\xbf\xa0\x36\x7d\xc0\xd7\x6a\xce\x2d\xae\x60\x0c\x63\x4a\xab\xdc\xe6\x35\x2a\x62\x40\xf9\x6c\xaf\x41\x99\x42\x30\xd6\xea\x7c\xfd\x48\x91\x3b\xf6\x57\xa8\x88\x8e\x40\xef\xd1\xce\x8f\x9a\xc9\xc3\x98\x2c\xa1\x7a\xff\xeb\xdb\x87\x9b\x19\x9b\x08\xa8\x20\x8c\x28\xb2\x81\xed\x0b\xf1\x2f\x35\xf9\xf3\x98\x74\x13\x54\x90\x69\x65\x29\x64\xaf\xe1\x12\x3c\xae\x98\x92\x9e\x17\x4a\xe6\x45\xbe\xec\x6d\xa9\x30\xb5\x4c\x7e\xdd\xe0\xc2\x5c\x25\xcd\xf5\x89\x32\x4d\xb9\x6e\xca\x06\xed\xc7\xec\xff\xcb\x5b\x86\x8a\x54\x10\x3a\x7d\x18\x27\x41\xef\x1a\xe2\x40\x52\x98\xb5\x7d\xc1\xa1\x7e\x13\x54\x2c\x83\x04\x7b\x70\xe2\xe6\x9d\x92\x53\xd3\x0f\xa7\x62\xd4\xbe\xea\xff\x33\x2d\x5c\x50\x89\xb0\x99\x6b\xa7\xd6\x8d\x75\xcf\x1c\x32\xb1\x17\x55\x22\xa5\x17\xfb\xb4\x3c\x34\xd3\xd4\x8c\xef\xa5\x2d\x4d\xe5\x48\xd3\xcf\x3f\x75\x8a\xb6\xd0\xa3\x22\xb6\xef\xaf\x58\x1c\x87\x6f\x93\xa1\x2d\x5f\xde\x34\x3e\x84\xa3\x38\xd3\xc4\x19\x7d\xee\x8e\x96\xea\xd4\x7b\xf0\x73\xda\x1b\xd6\x1b\x45\x8a\x6b\x45\xa9\xad\xe6\x2c\x6f\xcf\xa5\xde\xd6\xa8\x06\xe7\x4c\x09\xa6\xac\x6a\x36\x36\xed\x2d\xe4\x45\x67\xd4\xea\xce\x9d\xe8\x3b\xc4\x96\xe2\xaf\xc9\x7f\xb5\x2f\x9f\x95\x94\x83\x12\xc6\xa2\x09\x2d\xf0\xe7\x07\x14\xf3\xc1\x9d\x6e\xe5\x0a\x78\x4c\x95\xec\x76\x61\x58\xcc\xa0\xcd\x9c\x4d\xbf\x1a\x88\x8c\x10\x32\xd6\x24\xee\xe5\x58\xa7\x9d\x64\x84\x64\x86\xae\xdb\x17\x2b\xcc\x73\xb3\x7a\xfc\xe8\xf7\x17\x79\x04\x41\xc9\x58\x52\x01\x42\xde\x90\x00\xca\x5d\x69\x11\x25\xcb\x71\x6a\x25\x33\x2b\x76\xd2\xb4\x23\xec\xd6\xfc\x8e\x46\xa6\x8e\x2e\x6f\xa2\xb7\x3d\x9b\xea\x2a\x90\x14\x0f\x73\xa0\xb4\xf9\xfb\xab\xd4\x90\xf3\x0e\x5a\xef\xf2\xf2\xb9\x40\x37\x77\xf7\xd5\x05\xfd\x8a\xbf\x82\x5b\x7c\x52\xcf\x64\xac\x8f\x79\x49\x14\xe6\xc5\xcc\x08\x53\x3a\x88\x99\xdd\x98\x7f\x3a\x15\xde\x4f\x0d\x5b\x85\x51\xcc\xe4\x04\xfe\x72\xa9\x24\x0e\x0a\x63\x46\x35\x23\x9d\xcb\xf9\xd6\xd3\x92\xcd\xfa\x24\x5c\x0f\x9e\xce\x55\x0d\xa5\x9a\x1e\x96\xdc\x77\x44\x6e\x6b\x06\x0a\xc8\x8f\x77\xd6\xa9\x0e\x3f\xf8\x2a\x86\xa5\xca\x65\xa5\xf4\x7d\xf5\xb3\x3b\xfa\xb0\x44\x63\x1d\x71\xdf\x27\xb6\xec\x87\x14\x1c\xb2\x52\xfb\xae\x49\x07\x41\xc2\xe7\x21\x3f\x9b\xa2\xdc\x56\xcd\x75\xa5\x67\xb3\x4e\x07\xa9\x74\xe5\xd1\xea\x5d\x15\xb8\x3a\x9d\x10\x6a\x0a\xed\x39\x87\xe7\x5f\xc9\x0c\x47\xa7\x03\x69\xc8\x07\xf1\x05\x17\x4f\xf8\xdc\xd9\x0a\x55\x3d\xd9\x98\x35\x8b\x43\x8a\x2a\x1e\x0f\x96\x25\x7f\xb2\xef\x68\x96\x64\x14\x9a\x94\xe7\xf7\x8b\x3c\xc2\xe0\x23\xeb\x30\x4c\xc9\xff\xaf\x71\xc2\xf0\x38\x99\x01\x3a\xe4\x36\xbf\x9c\x97\xa6\xba\x94\x0d\xeb\xda\x55\xc2\x26\x5a\x74\x74\xe0\x4f\xdf\x2a\x84\x40\x59\x6e\xb2\x95\xad\xc9\x1f\x61\xb6\x3e\x9d\x50\x3a\x52\x8c\x08\x56\xbc\x13\x41\x11\x56\xdf\xa6\xad\x8c\xc2\xa8\x26\x7f\x3a\x7d\x75\x2c\x03\xf0\x81\x62\x1f\x01\xb8\x58\xf6\x97\x44\x4f\xa0\x93\x08\x2d\x35\x1b\x94\x3e\x11\xa9\x13\x81\xb4\x0e\xb1\xd4\x87\x1b\x54\x87\x90\x1d\xc2\x80\x65\x7d\x33\x04\x04\xea\x39\x3c\xe1\x09\x6a\x38\x62\x8b\x75\xfe\x27\x19\xd2\x7d\x48\x6a\x66\xbb\x2e\xfa\xee\x3a\xcb\x0c\x15\xf8\x53\xfc\xfb\x37\x44\x6f\x3d\x69\xce\x03\xda\x81\x76\x96\xb4\x46\x4d\x4f\x1b\x2d\xd2\x98\x8e\x44\x27\x89\x90\x97\xf9\xf9\x78\x35\x0f\x33\x6b\x91\x09\x88\x3c\x8c\x9f\xb8\x90\x3f\x10\x4b\xfd\x28\xd1\x74\xe9\x68\x4f\x5d\xee\x0f\x8a\x79\x35\x40\x44\xa1\x8b\xba\x3b\x08\x23\x31\x7b\x2c\x50\x01\x05\xb9\x9b\xb6\x3a\xf9\xf3\xdf\x1f\x1d\x5a\x66\xca\x2a\xe7\xbd\xbe\x56\x36\x8b\xb4\x10\x5e\x9d\x30\xc9\x82\x96\xc6\x92\x0b\x74\x9b\x6b\x0d\x6a\xc6\xf5\x08\x5a\x85\xa1\xb6\xaa\x82\xff\x81\xf2\xf5\x75\x08\x7e\x69\x1d\xb0\x20\x75\x12\x04\x57\x75\x55\x7a\x8a\x3d\xd0\x5a\x65\x14\x63\x5f\xdd\xdc\x3c\x1d\x36\xab\x3f\x56\x87\xcd\xea\xe9\xdb\x7a\x7f\xf7\xe0\x9d\x16\x8d\x5c\x53\x14\x69\x5f\xb5\x6d\xfe\x41\x08\x77\xfa\xe6\xa8\x18\xd9\x9e\xce\x9c\xf3\x85\x9c\x8b\x52\x34\xfe\x12\x0c\x7c\xdd\xed\xff\x56\x79\x79\x83\xc5\x1c\xd5\xa8\x0d\x2a\x2a\x93\x82\xa2\xd8\x43\xf3\x3a\x96\x51\x06\x6d\x8c\x65\x45\x83\xb3\x83\xf3\x7d\xf0\xcd\x30\x88\x53\x8a\xc4\xfc\xa7\xca\xcb\x2f\x70\xbc\xcc\x4a\x8e\x87\x1c\x03\x65\xc1\x49\xc4\xf3\x71\x55\x95\x7a\x5c\x28\x88\x8c\xc5\xde\x68\x72\x47\x83\xab\x84\x71\x0c\x9a\xbe\x5b\x9c\xd0\xb3\x59\x32\xff\xbf\xfc\xce\xc8\x12\x60\x43\x42\xf8\x5b\x5e\x3e\xeb\xea\xaf\x68\x72\xa7\xc3\x89\x4c\x19\x05\x9e\x4d\xac\x2a\xa6\xc1\x71\x0c\xd3\x24\x4e\x27\x9c\x2d\x7a\x94\x44\x9d\x5a\x89\xfd\xde\x8a\x61\x9a\x39\x6e\x8b\xce\x79\xa5\x34\xe9\xc7\xa8\x31\x0c\xc1\x1a\xe2\xcf\x55\xa1\xb1\xb4\xbc\xd0\x14\x65\xf8\xc7\xbc\x1f\x50\x2a\x97\xaa\x28\x2c\x8e\x66\x1c\x97\xc1\x50\x5a\x0c\xfa\x31\xbf\x90\x10\x75\x3d\x22\x96\x7a\xb9\x65\x2f\x67\xe5\x2f\x8e\x38\x10\x73\x44\xde\xdc\x60\xd3\xd6\x36\x26\x44\xb9\xb7\xfe\x04\xc4\x98\x73\x3a\x40\x09\x50\xf3\x68\xa6\x5a\xe5\xbe\x8f\x34\xa3\x18\xe5\xae\xbd\xa8\x88\xc3\x24\x48\x89\x18\xc6\xd1\x26\x7a\xc7\x7b\x8c\x97\xc1\x44\xdb\x22\xcd\xfd\xfe\xfa\x6f\xcc\x82\x94\x83\xee\x71\x46\x06\xeb\x1a\x0a\x3a\x8f\x7d\xb3\xcc\xa8\xd6\xd8\x69\x15\x40\xdd\x96\x58\xb3\xc3\xcf\xbc\x98\x16\xd8\x60\x16\x84\x54\x6e\x76\xa8\x11\x0a\x4f\x9e\x56\x2e\x1c\x2d\x98\xc5\x16\x83\xba\x7d\xc9\x27\xae\x2f\x66\x99\x95\x67\xab\xca\xe2\xfd\x8a\x30\x9b\x35\x51\xa1\x8d\x94\x76\x87\x0c\x30\x66\xc2\x42\x41\xff\x89\x75\x35\xa2\xcb\xec\x1a\x90\xa7\x5e\xc7\xb0\x3b\x9f\x3b\x5b\x7a\xe5\x97\x30\x72\xc6\x09\xb9\x78\x6e\xb0\x76\xbe\xa8\x0b\x57\x7e\x5e\x80\x87\x5c\x46\xe1\x18\x66\xf4\xe5\x61\x3f\xfb\x3a\x5c\x71\xef\xb5\x6c\x3a\xa7\x86\x44\xd5\x27\x4b\x42\xa8\x38\x72\x93\x68\x93\x97\x16\x64\xdf\x37\xf1\xc4\xc5\x50\xa1\x69\xf2\x67\x87\x7f\x3c\x61\xbd\x7f\x3f\x4d\xc0\x21\x08\x60\x49\xd6\x9a\xb6\xaa\x71\xfb\x52\xb5\xd5\xf4\x5b\x80\x94\x91\x70\x70\x14\x87\x5c\x1c\xd8\xc5\x01\x65\x60\xbf\xe9\x0b\xc8\x5c\xbd\x94\xbd\x6d\x84\x52\x24\x9e\xf7\x68\x75\x6e\x2b\x6b\xb7\x3a\x21\x9f\xe9\x37\x54\x41\x42\x88\xbd\x3d\x1e\xeb\xea\x7d\xf2\x15\x55\x18\x92\x72\x18\xcd\xc9\xeb\x77\x39\x2d\xce\x40\x85\x3c\xe3\x03\x05\x91\x55\x63\x5a\xb6\xa0\xd0\x30\x9b\x2b\x77\x74\x44\xa3\xca\xcd\xf9\xf3\x18\xa6\x63\xdd\x17\x0b\x5e\x12\x15\x02\x9a\x30\x24\x77\x6d\x73\xf7\x6d\xbd\x5f\x3d\x7c\x79\xbc\x7a\x5a\xfd\x78\x64\xfc\xa2\x7c\xe0\xc3\x63\xfc\xf3\xd9\x61\x44\x62\xb5\x4b\xf2\xa9\x49\x89\x06\x15\xb3\x15\x8e\xdd\x56\x66\x7d\xa8\x6d\x8d\xe4\x7b\xf7\x0c\x2e\x1f\xa5\xff\x3f\x78\x06\x7b\x6b\x13\x24\xc9\x60\xc0\xdb\x4c\xfb\x3e\x2f\x0a\x5b\x42\x76\x1e\xe8\xee\xc0\x04\xa8\x09\xf8\xf1\x80\x3f\x77\x24\x69\xe5\x3e\x87\x61\x51\x44\x30\x1d\xbb\xbe\xaf\xeb\xf7\xa6\x1d\xac\x2d\xd7\x27\x0c\x80\x12\x89\xf7\x77\xfb\xf5\xf5\xe3\x93\x4f\x9c\x9b\x10\x42\x3e\x84\x55\xfd\x22\xf5\x8b\x69\x29\x5a\x61\xa2\x20\x8e\xbd\x5b\xbc\xaf\x9e\x9f\x0b\xbc\xca\xc9\x3f\xa6\x08\xfa\xe3\xa3\xaf\x1b\x34\x51\x98\x51\x70\xc7\xe5\x15\xab\xfe\xef\x69\x46\x65\x05\x0f\xf8\x73\x3c\xad\x4c\x12\x5a\xcc\x87\xc3\xa0\xaf\xcb\xb6\x7e\x1f\x76\x68\x93\xf0\xcc\xe6\xc3\xc0\xe0\xb8\xf2\x61\x3a\xe1\x4c\xa2\x95\x0d\xbe\x75\xdd\xce\x72\x09\x7e\x6b\x78\x12\x53\xd5\xc7\x4d\xde\x80\x2c\x5c\x61\xda\x78\x25\x1b\x2e\x2d\x5b\x1c\x81\xc1\x73\x8b\xd9\x1b\xa5\xa2\x0c\x57\xb1\x63\xda\xe8\xeb\x18\xba\xe3\x7e\x31\x0d\x64\x04\x0b\x22\xaf\x37\x57\x55\xc5\x4d\x55\xe2\xd8\x22\x31\x82\x25\x60\xbc\x32\xab\xd3\xc6\xba\x82\xf2\x75\x1e\x72\x32\x10\x28\x32\xc1\xac\xf2\x98\xe3\x16\xea\x26\xc3\xc4\xc2\x31\xc0\x10\x47\x14\xec\xbd\x77\x67\x80\x47\x7c\xec\xfb\xde\xd6\xd5\xf1\xb7\xbc\x7d\xa1\x53\x03\x29\x08\x5a\x14\xbd\x50\x2d\x18\x89\x31\xa9\xe2\xae\xf4\x07\x88\x67\xa3\x78\x4c\x84\xc7\x0f\xdf\xbe\x3e\xde\x4d\xbe\xa6\x92\x16\x26\x67\x5c\xbe\x60\x8a\xeb\x30\x3a\xce\xa8\xba\xcf\x65\x5f\xc8\xa2\xb7\xd4\x27\xbe\x03\x8a\xd4\x46\xe5\x29\xaf\x3f\x32\xa6\x0c\x42\x4c\x59\xf3\xd7\x77\xe5\x25\x6c\x5d\x8b\x49\x02\xca\x31\x9c\xd0\xa2\x95\x1e\x86\x63\xd0\x18\x13\xbb\xbc\x06\xad\xb5\x95\x97\xae\xb7\xed\x32\x60\x2c\xcc\x1c\xfa\x77\xc2\x68\x34\xb1\x0a\x65\xc0\x42\x43\x20\xf6\x3b\x55\xf5\x15\x7f\x32\x60\x89\x31\x99\x3f\xb0\x2c\xd1\xd7\x61\x88\xc0\xc9\x20\x8c\x62\x9a\x4f\x83\x02\xeb\x13\x2e\x57\x32\xca\x20\x94\x36\xbf\xd4\x60\xa9\x37\xcd\xf3\x3f\x16\xcc\xcd\xae\x53\x4a\x8b\xc5\x49\x85\x59\xb0\x7f\xb7\x5a\xa6\xf7\x8a\x78\x24\xc3\x89\xa2\xd8\x8d\x65\xfa\x99\xf7\x13\x49\x96\x7a\x36\x6e\xd4\xb9\x3f\x32\x7a\xa3\xae\xeb\x22\x47\x42\xda\x3f\xa0\xce\x61\x49\xad\xdd\xf7\xc6\x84\x68\x93\x0e\x1e\x36\xbe\x14\x4c\x94\x41\x9c\x85\x56\x84\x6f\x12\x29\x9a\xde\x2a\x86\x50\x5b\x70\xac\x35\x41\xa1\xe8\xb9\x26\x3e\x86\x97\xc9\x20\x96\x8c\x2c\xb1\x53\x8d\x5b\xc8\x75\xbf\x93\xc8\x20\x89\xac\x52\x43\xb7\x83\xdd\xb5\xe8\x35\x41\x7d\xab\xce\x78\xd2\x93\x82\x4c\xa8\xd9\x5d\x8f\x54\xd8\xda\x7a\x3b\x12\x0f\xf8\xf3\xcb\x48\x9d\xe4\x3c\x16\x56\xba\x48\xc4\xca\x20\x45\x41\x64\x39\x9d\x15\xeb\xa1\x66\x65\xff\x68\x59\x66\x93\xfe\x36\x4e\xb8\xad\x09\x98\x79\x89\xcb\x93\x01\x4f\x7b\xa8\xf8\x3d\x74\x2f\xe2\xd2\xca\x77\xfa\xa2\x63\x44\x13\x45\xe2\x73\x5e\x5e\x17\x55\x33\x73\x3a\x64\xc0\x79\x12\x7b\x22\xa3\xaa\x28\xa0\xbe\xad\xea\xc7\xd2\x6a\x43\x3c\xcd\x01\x90\x32\x10\x51\x4c\x42\xdb\xdf\x9e\xf6\x4f\xfe\x16\x10\x46\x44\x98\x43\x09\xb2\xab\xaa\x7a\x1d\xd9\x3a\x32\x80\x08\x6c\xbc\x06\x7e\x3d\x51\xc0\xa6\xe9\xaf\x8b\x33\xb4\xaf\xdb\x1d\x7c\x4f\xa3\x05\x03\x99\xa4\xaf\xa7\xed\x16\xdd\x9d\x4c\xa0\x48\x4d\x6a\xb2\x27\xca\x40\x26\x92\x60\xc2\x1b\x28\x4b\x20\x18\xc7\xd2\xb9\x20\x03\xd5\x2d\xd1\x6e\x2f\x3b\x75\x87\xf8\xae\x73\x33\x8f\x13\xfb\x5e\x06\x1a\x03\x96\xb8\x4f\x63\xbf\xfb\x04\xc2\x20\x03\x93\x1a\x02\xf3\xa0\x65\xec\x71\x75\xe1\xcf\x97\x62\x6e\x93\xc9\xee\x2f\x16\x31\xea\x41\x74\xf8\x7d\xdd\xbe\x8c\xc3\x5a\x92\x05\x91\x70\xa2\xbb\x94\x85\x7c\xef\xff\x0e\x8c\x42\x22\xf6\xac\xb9\x2b\xdf\x72\xaf\x61\x3d\xfd\x32\x2c\x90\x16\x31\x5d\x5b\x0c\x9b\x65\x9d\x1a\x74\xa2\x24\x0b\x30\x63\x23\xee\x48\x7d\xf8\xe9\x91\xe6\x92\x85\x19\xc7\x81\xcc\xf7\x19\x5d\x09\xc7\xf4\x17\x42\xa1\x62\xcb\xbd\x74\xc6\xfd\xd7\xab\xfe\x5a\x6d\xc8\x58\xed\xec\x71\x0b\x0d\x68\xfa\x26\x0c\xb2\xd8\xa7\x2a\xba\x05\xd2\x9d\x37\xf3\x49\xca\xe2\x18\x78\xec\x43\xed\x04\xea\x9f\x77\x48\x8d\x2b\xf4\xe8\x09\xda\xbb\xa3\x74\x50\xd7\x95\x2c\x09\x18\xe5\xf3\xff\x77\x3b\x4e\xc9\x4b\x96\x30\x8b\xc0\x3b\x52\x76\xe9\xe0\x53\x7c\xbf\x0d\xaf\x9e\x2a\x5b\x35\xf7\xf5\x7c\x84\x32\xff\x6f\x77\xed\x67\xd1\x70\xc9\x52\x63\x2d\x9b\x91\x1a\xde\x47\x90\x65\x77\x45\x16\x64\x4e\xa4\xb1\xd4\x24\xae\x71\x35\x67\xd0\x66\xe9\xd2\x2e\xc6\xb2\x34\x20\xdf\x4e\x55\xc7\x6e\xdb\xbe\xc6\x9a\x6a\x53\x96\xb7\x53\x96\xa1\x5d\xca\x04\x59\x3a\x5f\xf0\xb2\x4b\xc6\xa3\x4c\x7b\x46\xc8\xc5\xf8\x8a\x64\x42\xca\xbe\x0b\x1d\x84\xcd\xec\x5b\x40\x2c\x82\xb1\x00\xed\x47\x1c\xd4\x92\x41\x12\x67\x6a\xc2\xb0\xfa\x51\x10\x70\x21\x9f\x2d\x19\x40\x9c\xf4\x0c\x78\x13\x08\xab\x64\x80\x29\xc9\x61\x3c\xd6\xcf\x50\xe6\xea\x7c\x7c\xac\x07\x54\x82\x64\x32\x50\xdc\xea\x9e\xfe\x86\xf8\xaa\xe1\xfd\xae\x6c\x72\x8d\x7d\xf1\xc9\xe7\x4c\x2d\x92\x49\xa6\x31\xf5\xae\xfe\x76\xe2\xff\x48\x26\x55\x44\x88\x47\xcb\x77\x36\xb1\x45\x67\x77\xd1\x8c\x8c\x9c\x07\x4a\x8f\xed\xd0\x43\x46\x5d\xb3\x4a\x22\xca\xfc\x13\xa4\xe6\x47\xd5\x52\x39\xf1\x5d\x69\xaa\x5b\x5b\xb5\x31\x35\xff\x24\x53\xa9\xe2\x6e\xab\x7b\xfe\x72\xae\x16\xa0\x2d\xd3\xd3\xc7\x5f\xc6\xb9\x1c\x23\xc6\xad\x18\xdc\x07\x8f\xac\xa4\xf4\x50\x09\xa7\xe6\x3c\x32\x86\x7c\x1f\xad\xc9\xfe\xf2\x5e\xb4\xdd\xc6\x22\xff\x5a\xe8\xf8\x41\x1b\x6c\x2d\xb6\x65\xbc\x2b\xf7\x7d\x38\x45\xe8\x0e\xfe\xa1\xae\xf2\xa2\xc6\x0b\xf9\xcd\xd9\xc3\x19\x66\x68\x00\x76\xcf\x7a\x5f\xfd\x86\x39\xe9\xd0\xcc\x82\xbc\x92\x99\x28\x22\x5b\x0b\x89\xfd\x64\x04\xbc\x97\x61\x64\x6c\x13\xcd\xa8\x09\x1b\xa4\xeb\x10\x47\x71\x64\x9d\x8c\xe2\x0d\x9e\xf1\xd1\x52\x54\x11\x8c\xa2\xae\x8e\x73\x31\xc4\xe5\xc7\x0c\xe3\x24\xa6\xc4\xa1\x75\xbe\x3b\x4f\x6a\x55\x42\xf1\xde\xe6\xaa\xe9\x7f\x47\x73\x4a\xc9\x39\x09\x91\x23\xb1\x2d\x7e\x96\x0c\x90\x61\x12\x19\x74\xc1\x85\x5e\x7b\x57\x16\x8e\xda\x7f\xb5\x9b\x0e\x70\x98\x70\xa6\x7a\x80\x47\x0f\x1e\xf2\x8d\x80\x0a\x7c\x23\x59\xdd\xdf\x77\x37\x7d\xa3\xc6\xd8\x46\xc2\xa6\x0e\x9a\x0c\x13\x54\x09\xf7\x55\x5c\x7e\x5c\xc6\x27\x7d\x98\xc6\x96\x80\xd0\x1d\x30\x0f\x3f\xf6\xcb\x36\x5d\x98\xa6\x92\x02\x31\xfa\x6c\xd1\x36\x2f\xfe\x37\x52\x6d\x91\x9b\x25\xfe\x74\xf1\xb5\x0f\xce\x56\xdf\xdf\x18\x72\x69\xfe\xf7\x5c\xbf\xf7\x34\x8b\x17\x2c\x64\xae\x73\x16\x03\x55\xcf\x37\x6d\x75\xba\x53\x95\xff\xcd\x2c\x8b\x44\xf7\xe7\xfb\xdd\xf5\xb7\x41\xf9\x49\x86\x3c\xb2\x6c\x5b\x4f\xab\xfd\xfa\xb0\xbf\x5b\x3f\xb1\xbe\x05\xac\xbc\x45\xd5\x6d\x3a\x96\x1a\xf1\x43\x1b\x60\x79\x00\x44\x68\x37\xd1\xe6\xbf\x67\xa8\x67\x26\x56\x28\xe2\x98\x0c\xd4\x02\x9a\x76\xa5\xda\xfc\x0d\xf7\xfd\xcc\x01\x29\x29\x0a\x4a\xe4\xc6\x6f\xb8\xc1\x63\x55\xbf\x93\x32\xe1\x2c\xa1\x32\xc3\x78\xca\x50\x86\x31\x5a\x70\x95\xcf\x4e\xd6\x5b\x68\x26\xe0\x52\xdf\xd3\x18\xe1\x0a\x93\x9e\x2a\x59\xb5\xcd\x6d\x55\x2f\x74\x53\x09\x23\x6b\x40\x81\x97\x63\xda\x57\x03\x26\xc4\x9f\x39\xa1\xe2\x82\x70\xd8\xb7\x24\x31\xb9\xaf\x2c\x7f\xe8\xf2\xd2\x51\x20\xa8\xf0\x78\x5b\x57\xda\x43\xac\x5c\x93\x66\xd2\xc7\xdd\x2c\x72\x93\x7e\xea\xa1\xff\x8a\x3a\x92\x61\xd6\x97\x93\x3d\x77\x8e\x8e\xea\xc1\xd2\x7e\x82\x62\x10\xc4\x83\x13\x33\xd7\x4b\x9e\xbe\x1e\x26\x01\x05\x21\xfd\x36\xe7\x90\x6f\xa3\x38\x81\x0c\x0d\x02\x61\x6c\x24\x49\xdc\x0c\xfc\xce\x32\x0a\x82\x2c\xd6\x03\xdc\xd5\x4e\x12\x3a\xa4\x3e\xe2\x0f\x9e\x0e\x45\x14\x44\x22\x4d\xfa\xf7\x99\x65\xbe\x65\x14\xc4\x2c\x13\x23\xe8\x4c\x5e\x3e\x60\x5f\xe0\xb4\xbc\xea\xa2\x20\x61\xda\x25\xa8\x0f\x2e\xfc\xdc\x6d\xc0\xde\x47\x96\x51\xa0\x31\x74\x49\xf9\x6b\xe2\x8f\x5c\x40\x4e\xca\x88\xa5\x9a\x9c\xca\x91\xb2\x9f\x63\x3e\xea\x11\x62\x97\xbf\xcd\x32\x21\x1d\x17\xd8\x5a\x55\x65\x75\x7c\xdf\xfa\x44\x61\xe3\x33\xc2\xff\xf3\x7f\xfc\xb7\xbf\x35\x5a\xdd\x72\x92\x4e\xdd\xda\x7d\xdf\xef\x91\xc5\x6c\xdc\x98\x96\x64\x03\xe7\x65\xdb\x63\xb0\x64\x14\x66\x2c\x70\x38\x82\xab\x5c\xef\xab\x5d\x0b\xea\x75\xe4\xfd\x46\xa1\x06\x1b\xd7\xf7\x14\x3d\xf9\x71\x90\x9e\x95\x51\x14\xd8\xea\x12\xf2\xfc\xd5\x14\x6a\x24\xa3\x08\x03\x2a\x53\xf2\x04\xe3\xde\x8f\x5d\xf6\x5f\xa7\x83\x1d\x19\xa0\x4f\xe2\x2a\x54\xc6\x24\x4a\x32\x8a\xc3\xc0\x17\x05\xfb\x8a\x31\xe7\xdf\xeb\x5d\x8b\xa7\x66\x5b\x57\x9e\x0c\xca\x5d\x91\x84\x22\xb5\x09\xfe\x69\x9d\xb7\x8c\x12\xce\x84\x8b\x42\xb9\x95\xb7\x2e\xf5\x8d\xf7\xff\xfc\x6a\x8e\xd2\x90\x91\x89\x99\x97\x40\x3b\x53\x5f\x6d\x35\x50\xa3\x77\x9d\x32\x5b\xa4\x96\x63\x1d\x52\xaa\xa5\x6f\xc9\x22\xba\xfc\x6e\xfb\x96\x8d\x0f\x97\x28\x0b\x20\x60\x3e\x82\xd2\xfd\xfa\x4d\x1f\x2a\xd1\xdf\xcb\xc1\xa3\x88\x32\x99\x52\x0e\xf7\x69\xf5\xfb\xe4\x06\xdc\x44\x54\xfd\x79\x62\x87\x9f\x2f\x79\x8b\x07\x7f\xb6\xf8\x0e\x22\x66\x84\xa9\x7d\x22\xc7\x7e\xfa\x56\x22\x89\x89\x0e\xf2\xad\x6a\xb1\xdb\xec\x8a\x36\x3f\x42\x8b\x8e\xff\x72\x52\xe3\xc3\xfc\x4c\x02\x88\xad\x48\xa9\xf7\x49\x08\x3e\xb8\x14\x02\x94\x11\x20\xa3\x48\x1a\x68\x6d\xb7\xbf\xc9\x37\x96\x46\x45\x6e\xd9\x0d\x81\xdf\xbf\xc3\xac\x31\x9a\xa0\x2a\x8c\xff\x7f\xce\xbe\xac\xb9\x71\x1c\xcb\xfa\xef\xd4\xc3\x3c\x70\x01\x40\xf2\x51\x96\x64\x5b\x9d\x5e\xd4\x92\x9c\x59\xd5\x5f\x4c\x28\xb0\x5c\xc8\x6c\x53\xa4\x86\xa4\x6c\xab\x7f\xfd\x17\xbc\x00\xb8\x89\x76\xd6\xcc\x4b\x65\x94\x01\x52\x24\x88\xe5\x2e\xe7\x9e\x83\x69\xa5\xc6\x51\x80\xbc\xea\xf9\xed\xc3\x6d\x2d\x94\xdc\x97\x7d\x2e\xde\x27\x7e\x84\x3f\xf3\x5e\x04\xa3\x7f\x53\x4d\x7c\x27\x6f\xf4\x79\xca\x8a\x2a\x7d\xff\xa6\xb6\x48\x84\x2a\x34\xd4\xfb\x68\x21\xc8\x37\xa8\x0d\xb5\x53\x2f\x3a\x29\x42\x95\x84\x58\x00\x61\xfd\xb1\xb4\xda\x17\xa7\xee\x2b\x42\x20\xd1\x5b\xbb\x39\x5f\xcc\x1d\x5e\x2a\x03\x7f\x6a\xac\xe7\xd1\x52\x06\x0a\x18\xf8\xe6\x68\x02\x59\xfd\x36\xd7\xa6\x62\xaf\x5f\x77\x93\xf5\xd8\x61\x45\xa8\x3d\x2d\xa2\x36\x64\xbe\x41\x2d\x93\xed\xb9\x3a\x21\x82\xcb\x11\x45\xf4\xc6\x41\x2b\xa9\x3a\x75\xea\x9f\x18\x14\xfe\x82\x00\x5e\x90\xc6\x0d\x47\xb3\x01\x0c\xbd\x5a\x71\xae\xd3\xfc\xf0\xb4\xfd\x92\x04\xa4\x67\x5b\x13\x3f\x60\x9a\x58\xce\x62\xa3\x9c\x79\x55\x60\x36\xb8\x2c\x9e\x74\x9d\x88\x1f\x26\x18\xc4\xaa\xdb\xa2\xac\xd5\x44\x4a\x45\x90\x20\xf0\xd1\xf1\x3e\xa4\xef\x70\x93\x96\xf5\xb4\x64\xb0\x20\x01\x91\xb6\xce\xdc\xe0\x72\xf0\xb4\xf7\x83\xe3\x70\x9a\x93\x40\x33\x1d\xb9\xd2\x99\x77\x9e\xcd\xae\x13\x72\x93\xb7\x0f\x6d\x29\xf8\x8f\xb3\x70\x79\x8d\xe6\x8f\x1a\xf1\x2b\x07\x5e\xf2\xbc\x86\xed\xa5\xaa\xe1\x68\xdd\xc0\x55\xfe\x9c\x43\x27\x66\x2d\x48\xc8\x63\x60\xb6\x5e\x3d\xad\x47\xcb\x8f\x84\x5c\xe9\x56\x5a\xc2\x01\x7e\x07\xc8\x7c\x41\x48\x12\x18\xe2\x64\x7c\xc5\x79\xd6\x47\x2b\xfd\xbd\x35\x48\x08\x08\x84\x03\xbd\xac\x9f\x7f\x9b\xb6\x15\x84\x11\x48\x4c\x3a\x19\x2a\x59\xa6\x56\x0a\x69\xe0\xd0\x13\x26\x62\xac\xbb\x3a\xe7\x23\x7e\xf3\xe1\xf8\x45\xa1\x21\xa4\x58\xca\xc2\xe4\xec\x3a\x2b\x96\x44\x84\x22\x8b\xf7\xa3\x13\xbe\x9d\x06\xa2\x0b\x12\x49\x81\xee\x68\x96\x6a\x5b\x9e\xb5\x4f\xd3\xf6\x2e\x20\x71\x27\x10\xe7\x72\x42\xc3\x57\x90\x58\x70\xc4\x07\x61\x56\xe8\xb5\x2c\x3e\x16\x69\x55\x7c\xe4\x4f\x45\x9f\x96\x59\x90\x58\x01\x13\x2d\x12\xb5\x57\x29\x8c\xc6\xdc\xc8\xc6\x21\x49\x68\x12\xee\x48\xe9\x84\x3e\xb4\xd9\x7c\x5c\x33\x18\xd5\xbc\x05\x64\xa7\xd7\x61\x51\xda\x75\xe0\x95\x08\x0a\xa8\x2d\x61\xbe\xef\x5f\x2f\x8f\x63\x00\xc3\x70\xca\x68\xa9\x30\x93\x7d\x07\x0e\x79\x39\x6a\x57\x09\x6b\xb5\xb0\xf7\xa7\x8e\x3b\x5a\x50\xcf\xa3\xd0\x0c\xe4\xbf\x36\x83\x13\x8a\x7a\x9c\x22\x2c\x42\x5b\x44\xfe\x73\xfe\xdb\xd9\x65\xaf\xf4\x3d\x0d\x4e\x45\xc8\x54\x9b\x5f\x15\xdb\x0a\xea\x4b\x62\x73\xc2\xd5\x02\x44\x99\x56\x83\x9d\xc3\x1a\x4b\x34\x08\xcd\x59\x63\x83\x84\xd3\x69\xcb\x21\x2c\x6c\xf4\x30\x61\xe8\x71\x6b\x68\x2f\xf3\x3a\xad\x6d\xb2\xd0\xb6\x12\x4f\x21\xca\xdd\xd4\x80\x34\xfb\xff\x97\x9c\x6d\xfd\xc7\x22\x3c\x41\x22\xb2\x8a\x6b\x98\x48\x37\x7d\xf1\x28\xd4\x0b\x42\x83\xc0\xe7\xf5\x2b\xb2\xf0\xbf\xfb\xb1\x7b\x12\x2a\x63\xc4\xc6\x56\xf2\x15\xd4\x39\xc3\xe4\xd6\x30\x6e\x46\x7a\xef\xd9\xc5\xec\xc9\x7f\xbb\x1b\x68\x86\x9f\xf8\x88\xe4\xed\x73\x4b\xe6\x34\x01\x63\x16\x94\x85\x60\xaa\x0d\x8a\x73\xb9\x2e\xea\x07\x14\xcf\x72\x0f\xc2\x88\x88\x9c\xb2\xee\x3e\xcd\x2b\x28\x6b\xab\xe7\xb0\xe3\x69\xd6\xf6\x8a\x3d\xe4\xff\x34\x06\xf9\xd5\x3c\x1e\xbd\x79\x44\x05\xbe\xb9\x61\x4e\x18\xc4\x67\x68\xec\x07\x9e\xee\x0a\xa4\xb6\x98\x44\x18\x09\x94\x0b\x1a\x07\xd4\x15\x9a\xed\xcd\x09\xba\xef\x41\x26\x5d\x27\x45\x58\xb7\x68\x7e\xa5\x6f\xe9\x6a\xb1\x7f\xea\x83\xa1\xfa\x5b\x1a\x8d\x95\x09\x73\xfe\xa3\x2d\xa1\x10\x34\x49\x04\x56\x7e\xcc\x9f\x9f\x1f\x6e\x76\xf3\xe5\x9f\xf3\xfb\xd9\xd3\xdd\xb2\x6d\xe6\xda\x1f\x9b\x23\x93\xde\x3b\xe5\x5e\x8c\xea\xbf\x98\x7f\x47\xed\xcf\xe1\xb3\x0a\x19\x80\xe1\xb2\x43\xca\x13\xf7\x03\x42\xb5\x3a\x0c\x2b\x05\xcd\x84\xbd\xd8\xb8\xfb\xf0\xf6\x02\x00\xd9\x28\xf6\x4d\xc7\xba\x2b\x2e\xb4\xcd\x32\x12\x68\x6c\x9c\xca\xf4\x3d\xcd\xe0\x00\xea\xca\x8f\x1b\x5d\x20\x23\x2c\x4f\x6e\x9c\x78\x47\xbf\xdf\xd5\xf1\x0b\xaa\xa8\x51\x40\x79\xe5\xd9\xbb\x81\x32\x95\xf5\x00\xdf\x67\xfb\x01\xf1\x3c\x53\x7a\x2e\xd3\x53\x63\xca\x57\x8f\xfc\x34\x3c\x26\x28\x34\x93\xac\x63\x91\x6f\xec\xd0\x7e\x05\xc7\x94\xa5\x41\x41\x8a\xd0\xe5\xf1\xf7\xf5\x47\xf1\xd3\x88\x55\xbf\xa4\x2d\xfb\xb0\xa0\x9a\x68\x57\x1a\xb2\xe7\x59\xb6\xe7\x75\xdd\x23\x25\x12\x54\x47\x01\x8b\x7a\xa5\x23\x46\x3b\x6a\xbb\xf8\xb5\x5c\xd9\x2e\xcc\x17\x86\x65\xec\xd0\x18\x83\xe7\x0a\xe6\x2e\x6f\x11\xbb\x0e\x32\x34\x27\x07\x26\xd1\x2f\x47\xe1\xe4\x49\x05\x0b\xa2\x38\xb2\xf8\x57\x9b\xa0\x76\x2d\x61\x20\xf1\xa3\xb6\x01\xdd\xad\x5d\xe4\x5f\x18\x65\x8c\xf8\x5a\xc8\xbe\x1a\xc7\xe8\xa4\x65\x24\x62\x58\x85\xf3\x90\xd6\x75\x66\x92\x5f\x70\x3e\x2e\x8a\xb3\x68\x75\xb4\x9b\x4e\x0a\xcb\xa6\x6e\x56\xbb\xd5\xdc\xfd\x91\x2a\x0f\xc9\xbc\x6c\x8e\xf5\xe6\x7c\xe9\xde\xf1\x6b\x96\x38\xc1\x58\xa8\x30\xa0\x31\xb7\x06\x07\x4f\x8f\x13\xe5\xdd\x82\x31\x69\xe0\x03\xf7\xbc\x7a\xbd\x39\x7f\x76\xa9\x0d\xc6\xc0\x8f\x74\x8f\x1f\x7c\x54\x50\x2d\x58\xec\x29\xac\x3e\xd9\x9e\x50\xd3\x0b\x79\x8e\xd7\x45\x71\xed\x78\x4e\x20\x3d\x04\x8b\x69\x88\xea\x43\xc0\xcb\xec\x22\xd2\x52\xed\x4f\x1d\xd3\x8d\xeb\xc3\x63\x6d\xa3\x32\xeb\xf4\x13\xb2\x79\x91\x5d\x3d\x45\x12\x33\x0f\xc3\xe0\xcb\x3f\x1f\x97\xdb\x7b\x77\x69\xa2\x04\x95\xce\x2b\xc6\x23\xe4\x1a\xab\xd1\xf8\x7a\x80\x61\x9d\xe2\x5c\x07\x8b\xb6\x54\x57\x30\xce\x34\x69\x96\x4f\xd9\x38\x4c\x2f\xa7\xd1\x4f\xf2\xc4\x47\x36\x1f\x94\x10\x9f\x17\x55\xdd\x5e\x06\x14\x3d\x94\xd9\xe3\xaa\x67\x24\x31\x11\x1a\x99\xaf\x53\x89\xd8\x61\x47\x0c\x22\x98\xf4\x4c\xd9\x19\x77\x20\xc6\xed\x59\xac\xae\x13\xcf\xc3\x5f\x97\xc4\x84\xa2\x6e\x52\xd5\xf8\x16\x3c\x03\x75\xc5\xaa\x35\x71\x08\x32\x49\x14\x22\x18\x67\x87\x32\x45\x3c\x9c\x65\xaa\x48\x8b\x7c\x64\xad\x32\x19\x71\x64\x01\x69\x53\x50\x58\xe6\xde\x57\x95\x1b\xa6\x86\x98\x94\xa6\x62\xe6\xa1\x38\x18\xe2\xac\xaf\x9e\xc8\xf6\x57\x51\x82\x1e\xab\xd1\x13\xbc\x69\xd3\x94\x4c\x45\x1c\x07\xbe\xd9\x64\x57\xe8\xa1\xa4\x45\xde\x8b\xc2\x8f\xaa\xd1\x05\x83\x88\x21\x01\x6a\x06\xef\x90\xa1\x5d\xdd\xdb\x06\x19\xc4\x11\xe9\x18\x41\xe7\xb3\x5d\x0f\x22\x36\xe9\x4b\x33\x4d\xb9\x63\xc5\xb7\x81\x4c\x74\x9a\x2d\xc3\x7c\xff\xde\x5a\xb3\xd8\xe6\x34\x57\xc7\x23\xd6\x5f\x77\x68\xd4\x49\xd6\x26\x11\x79\x81\x97\x98\x4a\x97\x9b\x4e\xa0\xff\x0f\xd7\x48\x89\x44\x66\xf1\xbd\xdd\x69\xbf\x8f\x4e\x47\x5e\x04\x89\x1c\x31\xfa\x60\xbc\x4e\xf5\x99\x11\x45\xe4\x49\x85\xf4\x22\x8a\x5f\x7a\xd2\xe7\xc3\x2f\x12\x79\xa0\xa8\x23\x08\xcf\x0f\x90\x2d\xae\x72\xf3\x91\xcf\x01\x9f\x0f\xea\xd7\x75\x59\x9c\xf8\xa1\x3b\xef\xa3\x30\xf4\xa4\x6c\x4d\xef\x3d\xb8\x3a\x26\x11\x85\x1c\xb4\xad\x0d\x47\xe2\xfa\x49\xe0\x4b\x14\xca\x00\x69\x11\x2c\x5d\x4f\x5b\x6b\x64\x9b\x09\x23\x18\xef\xfc\xf5\xa3\x6f\xf3\x46\x04\x28\x9a\xf0\xe2\x7c\xb9\x69\xab\xe4\xa7\xdf\x8f\xd2\x10\xcd\x63\xee\xc4\x8a\xfb\x9f\x67\xa2\x3b\x0f\x71\x57\x79\xe4\xf5\x68\x71\x44\x14\x78\x24\x5a\x58\xc1\x9a\x5f\xb8\xc8\x60\xc1\x2f\xed\x78\x33\x8f\x86\x9d\xff\x6f\x00\x14\x1b\x78\x4f\x3b\xfd\x8b\xc0\x1b\xbd\x3e\x8b\x3c\x0c\x32\x1e\x78\x75\x5b\x94\x7f\xf2\x33\x6a\xa3\x1a\x22\xfe\x59\x9f\xde\x49\x44\x8c\x4b\x0c\x00\x28\xde\x4e\x9c\x88\x1a\x8d\x84\x0f\xb4\x3c\xe2\xa4\xfd\x7b\x44\xfd\x68\x02\xd3\x5c\x75\x1d\x40\xba\x73\x8b\x7f\x1a\x59\xae\x6a\x6d\x65\xa2\x9c\x4e\x17\x94\xb6\x74\xd2\x5d\x24\x04\x4e\x03\x75\xc9\xf7\xf2\xca\xea\xb5\x9d\xe2\x44\x60\xec\x90\x1f\x4a\x30\xdb\xef\x95\x58\xbf\xed\xc9\x49\x08\x4e\x9f\x63\xf5\xa4\xd3\x7c\x5c\x3d\x28\x22\x1e\x05\x88\x2f\x94\xaf\x65\x5a\x55\x17\x39\x54\x05\x14\x91\x88\x7d\xb4\xdd\xb2\x22\x7d\x4b\xdf\x94\x73\x2b\x23\x19\x92\x50\x39\xe8\x1b\x6a\x42\xa8\xb9\x09\x74\x5a\x8c\xe8\xf0\x67\xa4\x34\x00\xb8\xc6\x0b\xdd\x8e\xc4\xee\x44\xa4\x08\xa3\xb4\xa3\x1d\xb3\xf2\x51\x65\x0e\x65\xd5\x91\x3c\x88\x48\x31\xc9\xe2\x36\xc8\x6d\xf9\x67\xa7\xcd\x86\xe6\xb8\xc7\xe8\xeb\x57\xeb\xdd\x75\x8b\x63\xcc\x42\x9d\xa0\x3c\xf2\x1c\xf2\x3a\xbb\x3c\x7f\xe4\x8f\x17\xac\x9b\xce\x87\x08\x62\x11\x41\x12\xe1\xd6\x9a\x56\xab\x5c\x66\x67\xf5\x85\x90\x83\x88\xbd\x88\x53\x53\x32\xff\xde\xd6\x16\xb9\xa6\xd8\xd0\x3c\x19\x28\xe0\x00\x5c\x27\x62\x8f\x7b\x98\xdf\x83\x5c\x75\xf4\x05\xce\xa8\x8b\x7d\x2f\x96\xcc\xfe\xfc\x35\x73\x84\xeb\x14\x7a\xb8\x75\x36\x13\x93\xf4\x3f\x65\xec\xb3\xc8\x4f\x5a\xfc\xe7\x2a\xef\x43\xba\x9b\xcf\x1c\x1a\x5a\x7f\x2c\x48\x93\xc5\x40\xc4\x73\x30\xb6\x71\xe0\xc5\x22\xea\x48\xcb\x5f\x2a\xc8\xa0\xaa\x46\x6b\x39\x0e\x7c\xe2\x77\x25\xc2\xeb\xac\xa8\x7f\xa6\x39\x5c\x7a\xaa\x36\xae\xa3\x4a\xc0\x68\x16\xe6\xc6\x6a\x1b\xb5\x87\x9e\x41\x76\x9f\xf3\x66\xcc\xf0\x95\x46\xb5\x36\x22\x0e\x7d\x19\x1a\x1c\x13\x1e\x29\xcb\x6b\x24\x4a\x1c\x12\x81\x0b\xd2\x84\x2f\x7b\xa7\x4d\x4c\x7c\x23\xe6\xd6\x6c\xaf\xcf\x5a\xcf\x79\x6e\x76\x87\x56\xf9\x74\xc7\xdf\x60\x56\x61\x20\xd3\x5d\xa2\x4c\x4c\xa2\x31\xfe\x6f\xd3\xea\xb5\x67\x92\xc4\xd4\xd7\x98\xff\x79\xe5\xd5\x4a\x16\xe6\x51\x6c\x13\xf3\xcd\x6a\x73\xd8\x4a\x27\x61\xe4\x9a\x2d\x0a\x72\x3e\x5b\x5f\x83\xf7\x45\x1c\x85\xbe\x21\x7e\x43\x69\xab\xe7\x53\x63\xb6\xa3\x22\x73\x3b\x0c\x11\xe5\x08\xf1\x6a\xae\xeb\x80\x97\x22\x4e\x7c\x89\xe1\xbd\xbf\x6e\xe6\x0f\xa9\xa5\x86\x68\xdb\x62\x53\x73\xb3\xc7\x18\xdb\x43\xc1\xf3\xd1\xa4\x4c\x38\x8d\xcd\x7e\x9d\xf3\x43\x3f\x64\x10\x27\x00\x4e\x45\xeb\xf1\x32\x7b\x87\x12\xb3\x77\xc6\x63\xea\x61\xc2\x62\xee\xc7\x49\xec\x20\x4a\xc5\xb0\xde\x58\xc4\x5c\x32\x66\x95\x5c\xd2\xf7\xaf\x22\xd4\xb1\x88\x42\x66\x9c\x44\x7b\x18\xd9\x60\xee\x34\x9c\x58\xc4\x22\x0e\xb0\x08\xd9\xa5\xd9\xf2\xcb\xba\x2c\x3e\xd3\x1e\x3b\xf6\xc4\xde\x1a\x0b\x4d\xb4\xdd\xd6\xf6\x1a\xbe\x8c\xf2\xd8\xde\xd2\x03\xf4\xd7\x0b\xad\x9b\x13\x75\x39\x96\x9b\x1a\xf5\xd6\x02\x91\x7f\xaf\xc5\x47\xf3\x38\xe8\xa9\xac\xf2\x5f\x90\xee\x8a\x1f\x69\x96\x8d\xd7\x8f\xa2\xcc\x95\x4b\x0d\xc9\xb9\x86\x77\x55\x51\xe4\x23\x5d\xa1\x70\x81\xf7\xe9\xf4\x41\xac\x92\x04\x97\xc8\xec\x33\x85\x05\x60\xc4\xbc\x55\xa9\x17\xb1\x02\x53\x61\x63\x11\x72\x38\x43\x6e\x79\x96\x09\x3e\x41\x0b\xd3\x1f\x31\x08\x29\xda\xb3\xdc\x70\x2a\xa2\x33\xda\x38\x34\x5f\x84\xe7\x62\x88\x12\xfc\x8e\xff\x58\xdf\x0d\xa6\x21\xc4\x02\xa5\x51\x8e\x85\x4a\xf5\x05\x63\x36\x57\x72\x3e\x22\x06\x10\x09\xb3\xeb\x6e\x70\x74\xc6\xda\x8f\x31\xe0\x61\x2c\x83\x95\xfa\x6c\x1b\x02\xf0\xac\xae\x06\x9a\x70\x67\x9b\xb5\x6f\x49\x86\x7b\x46\x64\xac\xb9\x81\x77\xf4\x48\x22\xd5\x78\xbf\xd2\x5c\x22\x8a\x66\x76\x55\xe2\xd3\x9f\xd6\x89\x17\x79\x26\x30\x56\x64\xa9\x4a\x6b\x3c\x52\xd2\x0c\x7e\x42\xd9\x69\x0e\x8a\x24\x60\x12\xd7\xf4\xea\x76\x3b\xa9\x1b\x2d\x92\x20\x91\x41\xd4\xf1\x02\xf6\xd6\x5f\x12\xf0\x00\x11\x5f\x7d\x8a\xd7\xe1\xc5\x61\x40\x11\x5b\xf7\x6e\x3e\x0b\x0c\x53\xf8\x83\xd3\x2d\x09\x69\xcc\xbd\x5e\xaa\xa0\xa3\x54\x31\x98\x62\xe8\xcb\x31\x75\x6e\x42\x12\xb2\x04\x81\x0d\xbc\xac\xd3\xaa\x46\x35\xad\xb6\x85\x4b\xa7\x7b\x7f\xeb\x9c\xdf\x84\xf8\x91\xb4\xc2\xfc\xbf\x29\xfa\x16\x09\xd1\x1a\x43\x81\xc8\xc7\x32\x24\xdc\x71\xe0\xbb\xc1\xa0\x53\x8f\x60\x6c\x6c\x9f\x56\x26\x7c\xdd\xef\x4c\x3c\xdb\x8b\x51\x83\x14\x5e\xfe\x5c\x3a\x24\x6c\xc2\x12\x63\xc9\x9b\x6d\x10\x5d\xe2\x99\x28\xde\xe1\x01\xf4\xc8\xaf\x4f\x22\xcf\x43\x58\xac\x93\xe8\xea\xe1\x69\x7a\x9d\x12\x81\x81\x8e\x0c\xf8\x5b\x4f\xba\x52\x24\x91\x64\x88\xa0\x71\x67\x58\x39\xe1\x63\x0e\x07\x21\xf1\x4d\x08\x5f\xa7\xb9\x5a\x1e\x4f\xf5\x65\x9b\x15\xf5\x20\x0d\x9a\x24\xc4\x13\xae\xfa\x93\x1f\x05\xaf\x2a\xae\x8a\xb2\xda\xbb\x1f\xe5\xa1\x46\xd7\xcb\x54\xcf\xf5\x80\x10\x09\x4f\x0c\x4b\xf8\x66\xb9\xed\xaf\xc7\x44\x24\x12\xed\x08\x7e\x3e\x1c\x5d\x02\xc2\xb5\xc9\x90\x60\xae\xcf\x86\xa2\x37\x4f\xa3\x77\x97\x24\xc2\x72\xaa\x2d\xcf\xe5\x6b\x3a\xba\x96\x46\x89\x43\x8c\xee\xff\xe2\x97\x55\xf5\xfc\x0e\xe5\x36\xfd\xac\x2f\xf6\xbc\x6d\x7b\x46\x04\x6d\xfd\x87\x97\xf9\x44\xe2\x22\x51\x5c\xe0\x06\xef\x84\xb4\x45\xa2\x84\x11\x91\xbe\x3d\x67\x3a\xcd\x32\xc4\x6f\x8d\x04\x46\xa7\x7d\xe6\x44\x49\x0f\xcd\xd3\x7a\x60\x5c\xdc\x96\xc5\x7f\xba\x07\x07\x2a\x9c\x7a\xf2\xac\x32\xf4\xe3\x93\x3b\x72\x02\x89\x17\x59\xcf\x09\x8d\xfd\xed\xf9\x74\xca\x2e\x8f\xad\x81\x90\xe8\x38\x52\xa1\x51\x0b\x38\x9f\xa6\xb7\xc9\x44\x73\x8a\xef\xb2\x6f\xd6\x8e\xcb\xac\x7f\xc5\x24\x28\xb8\x67\x0b\x24\x53\x59\x38\xf8\xcc\x43\xb3\x5f\x38\xdb\x91\x7b\x24\x46\xd8\x12\xaf\x2a\x28\xeb\x5b\x9e\x55\x60\x04\xaa\xfa\xcb\x87\x7b\x10\x80\xad\xc4\x1c\x58\x87\xdc\x0f\x7c\x34\x91\xb0\xbe\x17\x99\x32\xec\xc7\x1a\xe9\xdf\x0d\x87\x82\xfb\x60\x04\x66\x71\x5c\x6f\x7a\x47\xc9\x75\x9a\x87\x07\x9e\xf1\x34\x4c\x5d\xbf\x21\x85\xb8\xc6\x2e\xf1\x20\x00\xbf\x17\xd8\x2e\xca\x37\xf8\x56\xcb\x5e\xf0\x90\xc5\xb1\x67\x28\x0c\x65\x91\x2b\x1c\x97\x65\xeb\x44\xf3\x30\x4e\xfc\x2e\x7d\x88\xac\x12\xb7\x65\x71\xbc\x29\xae\x2c\x55\x1e\xca\xd8\xa8\xf0\xa6\xcb\x41\x82\x88\x87\xda\xec\x08\xb8\x4d\x75\xcc\xb2\xbb\x51\xa6\x87\x13\xe6\xe1\x0d\x5a\xf6\xa6\x11\x6f\x91\xe0\x24\x11\x98\x4c\xc8\x78\x85\xa0\x79\x50\x1d\xef\xfa\xe8\x5e\x9c\x22\x52\x96\xbb\x3d\xb4\xf7\x3c\x54\xfb\x08\x05\x3c\x16\x2a\xa0\xec\x8b\x8f\xc3\x08\x10\xaf\xcd\x8d\xf7\x83\x26\xd3\xe3\x18\x79\xc2\x59\x7b\xf5\xb5\x75\xca\xa3\x24\x26\xa6\x6c\xa3\x90\x50\x55\xae\xa0\xf5\xfb\x88\x1b\x8f\xb8\xc4\x40\x75\xb3\x71\x75\xb2\xc6\xdf\x25\x9e\x7e\x9b\x5c\xe2\x91\x92\xc0\x9d\x6f\xda\x4c\xa6\x1e\xc2\x85\xc7\xd2\x43\xfb\x03\x53\x0d\xa6\x5c\xfd\xca\x20\xec\x09\xb7\x0d\xd7\x47\x2c\x7d\x47\xd8\xd9\x9e\x58\x2f\x5f\xb1\x4c\x8a\x66\x6b\x45\xd8\xa2\x29\xdb\x48\xa5\x61\x5a\x1d\x29\x09\xfc\x9d\x34\xf5\x70\x73\xe0\x9c\x98\x12\x2d\x68\x0e\x03\xa3\x05\x9b\xe6\x87\x6a\x57\x18\x09\x67\xf7\xaa\x3c\x0a\xd1\x5f\xdc\xbb\x02\x43\x50\x69\x0d\x6a\x5d\xa4\xf9\x38\xd1\xce\x05\x4d\x10\xbe\xa0\x61\x22\x3f\x32\xfd\x76\x42\x1b\xb1\x94\xcd\x03\xca\xda\x4e\xda\x42\x3d\x3b\x81\x0b\xad\x71\x34\x5c\xe4\xd3\x72\xa3\x5d\x19\x2d\x5c\x2a\x1a\xf4\xf1\x7b\x7b\xae\x8e\x23\x22\x51\xc1\xa5\x36\x1a\x47\x1d\xe4\xa9\x59\x28\x53\x72\x9c\x82\x2b\x19\x61\x9d\xde\x81\xbf\x43\xf3\xdd\x47\xbf\x07\x1e\x45\x73\xc0\x86\x0a\x1a\xe3\xfc\x9b\x7d\x0a\x42\x8d\xf6\x98\xad\x20\x74\x15\x79\x00\x03\x83\xc3\x75\xa6\x1e\x38\x61\x95\x3b\xc8\xbd\xed\x09\xf9\xc0\xda\x4f\xa4\xa9\x88\x89\x83\x9f\xbd\xe4\xbd\x60\x14\xd7\x91\x8f\x6c\x8b\xe8\x90\x7f\x99\x00\x30\x9d\x85\x47\x3d\x4c\x7a\x5b\x79\x54\x83\xc0\x5d\xbf\x96\xbc\x82\xaa\xaf\x1e\x35\xbd\x62\x84\xc7\xe2\xb8\x75\xfe\x41\x35\x53\xda\x3d\xa2\xf0\x38\x68\x23\xd0\x59\xb5\x94\xac\xa6\x80\xf6\x11\x35\x88\xb7\xa9\xfa\x7a\xc1\x0e\x2c\x4c\xe1\x09\x33\x21\xd1\xc4\x4a\xf5\x9c\x9f\xee\x79\xb5\x01\x2e\x3b\x34\x9b\xf0\x79\x88\xdc\x3d\x1d\x4d\xfa\x0e\xf8\x17\xa8\x53\xe1\x83\x46\xb6\x25\x93\xe8\xed\xd4\xcd\x76\x25\xf0\xea\x3c\x86\xe7\x8a\xc0\x53\xda\x04\x50\x96\x9f\x46\xa0\xc5\xf2\x11\xf6\x17\xb9\x08\xa8\x42\x4c\x8b\x9b\x7e\xab\x7c\xc8\x69\x28\x44\xc0\x38\xf2\x05\x41\xfd\x8a\xd8\xd2\x61\x89\x83\x08\x3d\x0a\xda\x39\x91\x4d\x7b\x33\xc7\x51\x00\x62\x38\x3b\x10\xd3\xe8\xb8\xf5\x6e\xb0\x86\xf4\x9c\xd5\x63\x38\xb0\xeb\x1b\x1a\xbe\xf6\xa5\x29\x30\xed\xd5\xba\xb8\x0e\x84\x23\xa9\x9d\x78\xbf\x4e\x1f\x4e\x7a\x84\x22\xa4\x04\x1d\xef\xd7\x43\xfb\x66\xa1\x34\x64\xa2\x5c\x29\xb7\x81\xdf\xf3\xea\xb5\xec\x53\x18\x0e\xc7\x94\x84\xc0\x3a\x8a\xb2\x97\xbc\x2a\x32\xb5\xe5\x1a\xfe\x7c\xe0\x65\x9b\x6d\x12\x84\x24\xe8\x87\xdc\xde\xac\xda\x3f\x45\x4c\xdb\x34\xf6\xcc\xc9\x83\xf5\xc9\x40\x85\x20\x92\x60\x09\x4d\x3e\x3b\xab\xb4\x71\x29\x67\x19\x2f\x8f\xae\x95\xd2\x00\x91\x7f\xa6\x60\x7f\xc3\xb5\xce\x1c\xdb\xde\xf0\x35\x29\x18\x25\xe3\x79\xf1\x21\x0a\xe7\xf0\x0a\xc6\x09\xce\xc5\x73\x5e\x8c\x66\x09\xd3\x12\x87\xe5\xa1\x70\x91\x92\xdf\x42\x82\x44\xc4\x15\xda\xdf\xaf\xe7\x03\xf4\x23\x67\x37\x9d\xa2\xa8\x10\x31\x63\xd2\x37\xc8\x94\x9b\xa2\xa8\xea\x21\xbe\x4e\xc4\x92\x80\xc3\xf0\x9e\x1d\x5a\xc1\xb6\x25\x8c\x4b\x0b\x00\xc6\x88\xf5\x3d\x6a\x6a\xba\x2b\x93\xd8\x68\x7e\x08\xe7\x41\xba\xbf\xcb\x08\x8b\x43\x6b\x13\x17\xe8\xf6\xe2\xc6\xe2\x75\x62\x08\x28\x62\x29\x9b\x63\x77\x2a\xbb\x2e\xb8\x67\x28\x38\x79\x5d\x73\xf9\x86\x0f\x5c\x5e\xfa\x89\x17\x21\x42\x8e\xeb\xc5\x02\x4b\xd3\xfa\x32\xc4\xd8\x0a\xc1\x13\x04\x95\x9a\x0c\xca\xb2\xaa\xf9\x78\x0b\x16\x42\x45\x88\x35\x68\xcc\xdd\xa7\xe2\xc3\x6b\x2f\x85\x44\xb7\x1b\xd3\x1d\x3f\xc2\x48\x17\x7b\x7a\x3b\x93\xbe\x87\xeb\xb3\x2d\xda\x75\x94\x20\xee\xb6\x32\x0c\x31\xf9\xf9\xde\x63\x2d\xec\x8d\x8e\xa4\xd2\x40\x5a\x79\x26\x6d\xce\x6d\xf8\xb8\x32\xf6\x71\xd2\xbf\xec\xe6\x93\x33\x64\x2a\x2b\x2b\x54\xa8\xfd\xa4\xb5\xb7\x1e\x78\x55\x6f\x78\x1b\x65\x13\x3a\x08\x91\xff\xc1\xd4\x38\x1b\xac\x90\x39\xce\x5f\xd3\xd3\xdf\xa0\xe4\x11\x42\x13\x8e\x59\x5f\x89\xa4\x87\xa3\x03\x5e\x68\xe1\x21\xb3\x29\x9e\x34\x5d\xce\xbf\xab\xa6\x13\x5a\x70\x70\x82\x7b\xdb\x97\xf5\xfa\xe1\xaf\xfd\xcb\x76\xfd\x64\x9b\xa5\x47\x18\xee\x6a\x73\x43\x78\x30\x29\x3d\x3b\x49\xe3\x2a\xa4\x07\x46\x05\xbc\x82\x7a\x91\x96\x20\xeb\x05\x88\xb4\x3f\x1f\xa5\xa7\x75\xe0\x39\x7e\xa7\xe5\xe7\xa9\x28\xeb\x5b\xf8\x62\xcb\x91\x7e\xe0\x49\x03\x85\xfe\x99\xc2\x87\x7b\x3e\x9f\x70\x0c\xdd\xd8\x53\x60\x6f\xdc\x2e\xd7\x1a\xf8\x02\x17\xb5\x10\x33\x53\xc6\x39\x28\xe1\x94\x01\x35\xb4\xaa\xcd\xc9\x37\xef\x61\x0d\x87\x83\x28\x03\xaa\xd0\xe7\x9c\x65\xfc\xbd\x5d\x66\x32\x64\xa1\x36\xd9\x4a\xd4\x61\x72\x26\x41\xf7\xf5\x86\x37\x09\x19\x78\xc4\xe1\xb5\xd3\x77\x5e\x23\xd8\xe7\x9a\x93\x53\x48\x92\x18\x6e\x9b\x53\xd6\x29\x15\x8d\xc6\x82\x08\xb0\x05\xbc\x77\x59\x21\x78\xd6\x4b\x35\x48\xa2\x18\x67\xae\x5c\xda\x8c\x8a\x5f\x68\x57\xee\x25\x69\x1c\xe3\x57\xb1\xbb\xc6\xad\x49\x0f\xb9\x46\xae\x7d\x47\x47\xd2\xac\xb8\xbe\xc5\x3a\x38\x98\x24\x0b\x14\x66\xc8\x66\x0f\xae\x12\x49\xb2\x44\x38\xcc\x06\xfa\x8a\x37\x97\x01\xc6\x57\x32\xee\x21\xef\x6c\xda\x58\x14\x45\x99\x2a\xae\x96\x19\xc8\xba\x28\x5b\xbc\xb9\x64\x9c\xa3\xeb\x58\x1c\xf3\x74\xd7\x95\x5c\xbb\xe6\x88\x98\xfc\x8e\x63\x04\x32\x42\x44\xae\x91\x59\xba\x04\xa8\xea\x7d\x73\x0a\x17\x3d\x28\xa3\x8c\x22\x8a\xc5\x14\x77\x9f\x48\x0c\x39\xfa\x3a\x71\x48\xf1\xd0\x31\x29\x80\xb9\x93\x97\xf8\xde\x16\x96\x31\x23\x98\x7c\x7e\x82\x8f\xdd\x8f\x87\xa7\x89\xe8\xbd\x8c\x13\x0e\xd1\x18\xbe\xfd\x34\x7b\x5c\x4e\x82\xa6\x64\xe2\x33\xdc\x11\x0b\xad\x91\x8e\xd5\x81\x9b\x47\xbd\x48\x8c\xf3\xd6\xd4\x04\x98\xf2\x7a\xd4\x0a\xeb\x8e\xa0\x76\xc8\x12\x45\x04\x92\x7c\xa5\x90\x55\xb0\x84\x5c\x95\x5c\xbe\xd6\xf3\xe2\x28\x30\x6d\xdf\x0e\x5f\x02\xc2\xf0\x74\x37\x63\xb7\x2d\x74\xbd\x57\x36\x67\xdc\x41\xf3\x87\xaf\xcf\x43\x53\xa9\xf8\x0a\xbc\xac\x05\xf0\x51\x95\x85\xe4\xda\x58\xd8\x68\xf8\x8d\x69\x47\xff\xcb\x44\xb2\xc6\x8e\xc3\x04\xe6\xda\x9e\x38\x52\xfa\x86\xca\xa1\xc5\x76\xb4\xe2\x36\x93\xc1\x14\x29\x13\x69\xc5\xb8\x72\x75\xc3\x6d\x0e\xa9\x1d\x17\x15\x69\xae\x5a\xb5\xb7\xa2\x54\xb3\xfa\x5a\x96\x4f\x48\x25\x0d\xe3\xc1\xde\xca\xe5\xcf\xfe\x0e\x90\x40\x2a\x6d\x4a\x2e\x2b\xa8\x97\xa7\x42\xbe\xb6\xc6\xb8\xa5\x62\xb6\xff\x74\x3f\x03\x21\x63\xc6\x92\xcf\xf1\xa4\x1f\x95\x00\x4a\x88\x13\x4c\x63\x59\xe5\x72\x13\x04\xef\x25\x5b\x94\x1f\x6a\xcf\x92\xfc\x14\xef\x2d\x99\x3f\x86\x34\xcc\x42\x47\x51\xde\xab\xa2\xb3\xf1\xff\xf7\xa2\x3f\xca\xe7\x51\xe8\xb7\x9a\xa7\x0e\x8c\x37\x55\x62\xa4\x02\x9f\x49\x36\x64\x49\xe8\xb1\xc4\x0b\x15\xd0\x04\xf3\xc6\x7f\xea\xc6\xe3\x87\x97\x3a\xed\xd8\xad\x85\x0a\x58\xc2\x12\x8b\xac\xca\x21\x7b\x9a\x28\x2c\x9d\x5c\x7f\x2a\x10\x60\xa1\xad\xce\x3e\x54\x21\x0d\x84\x59\x6f\xcd\xee\xe9\x24\xd5\xbf\x8b\x2c\xf8\x6c\x50\xa7\x74\x45\x2f\xd7\xcb\x17\xb4\x35\x4c\x2a\x8c\x12\xe4\xd0\xb7\xeb\x73\x6d\xa2\x1f\x13\x14\x17\xc3\x07\x0e\xb9\x44\xd3\x1f\xa5\xd7\x66\x65\xc9\x2f\x9d\x40\xba\xed\x42\x43\x86\xa4\x05\x3b\x9e\x5e\xce\x3c\xef\xa5\x18\x15\x0b\x0d\x0f\x8e\x85\x74\x0c\x03\xa7\x8a\x49\x0f\x88\x23\x64\x3a\x98\x05\x7b\x5f\x8c\x63\xeb\x2a\xf2\x42\x87\x4d\xb6\x33\x03\x4b\x0d\xc6\xbd\xa4\x87\xe5\x29\xbc\x3c\x5e\x16\x65\x91\x83\xa5\xac\x19\x3e\x6b\x24\x63\x44\x4e\x08\x90\xc5\x11\x6e\x79\x26\x8b\xfc\xc8\x9b\x6d\xce\x3d\x54\x4c\x25\x8e\xd3\xc3\xbf\x1e\x70\xf9\x0d\x7d\x26\x95\x50\x6e\xc9\x3b\x10\xf9\x31\x11\xa2\x50\x49\x24\xf1\x1b\x83\x4a\xeb\x47\x38\xc2\x58\x6c\x7d\x38\x11\x13\x88\x0d\x85\xf4\xee\x79\xbf\xbd\x9f\x39\xe6\x24\xa1\x12\x4d\xb0\x00\xfd\xa6\x39\x1c\x1a\x67\x0a\x0b\xa1\xf6\xad\x66\x81\xed\x26\x22\x9e\x58\x8b\x64\xae\xae\xd9\x34\x94\xe0\x26\xfe\x80\xa1\xb0\xc7\x34\xc7\x13\xd6\x5d\x2c\x3d\x1f\x83\x94\xeb\x92\x5f\xc8\xba\x6c\x8f\x55\x25\x83\x04\x0b\xeb\x1d\x2a\x00\xd4\xd0\xe8\xfe\x62\x7a\x4b\xe6\xa9\x3e\xd3\xf7\xcd\x65\xcc\xc4\xa0\x80\xb2\xc0\x66\x55\x9e\xce\xff\xe6\xa3\xb1\x83\x48\x9b\xf8\x00\xff\x9c\x9d\x20\xdf\x42\xe6\x0e\x5a\x05\x71\x60\x4b\x7f\xdb\xea\xaa\xab\x6d\x4c\x81\x36\x34\x98\x07\x7e\xb4\x38\x3b\x03\xd2\x68\x89\x74\x94\x4e\x14\xc6\xfc\x1f\x67\x4f\xf7\xb3\xdd\x6e\xf6\xb4\xde\x3c\xff\xf9\x17\xdd\xdd\x3b\x5e\x73\xd1\x18\x81\x68\x53\x64\xbc\xb1\x47\xde\xc7\x02\x11\x02\xfc\x20\xc0\x0a\xb1\xb4\xda\xca\xd7\xa2\xc8\x6c\x0a\x6e\xf8\xa6\xe0\x43\x44\x22\x1b\x32\x1c\x5a\x05\x10\x30\xa6\x78\x4f\x11\x00\x4a\xab\x2e\xf4\x9e\x16\xe7\x0a\x37\xe0\xd1\x4f\x06\x09\xc3\x02\x21\x9d\x66\x47\xde\xf7\x3e\x21\x50\x14\x55\x51\x1a\xa3\xb5\x2c\x4e\xb6\xdc\xbc\x77\x0c\x41\x18\x8a\xd0\x16\x76\x6f\x1b\x3f\x4f\x16\xe9\x98\x79\x04\x42\xe2\x7b\x46\xde\x49\xeb\xc7\x22\xaf\x5f\xbf\xc8\x1a\x00\x91\xa6\x7e\xda\x56\x36\xe5\x87\x49\x0c\x1d\x10\x50\x08\x95\xd1\xe9\xe7\x9a\x5f\x66\xc7\xf6\x71\xa9\xa0\x1c\x5a\xbd\x4c\x63\x66\x3f\x16\xca\x46\xf9\x87\x37\x61\x31\x41\x44\x45\x61\x4a\x57\x6c\xaa\xef\x32\x7a\x74\xa6\x4c\x76\xb1\x8b\xc4\x5c\x95\xd1\x0f\x0e\x8d\x9e\x07\x05\xb1\x67\x58\xf0\x74\x51\xca\x36\xc8\xed\x6e\x1c\x87\x34\x80\x01\xf4\xb4\x37\xec\x31\x0b\x31\xa7\xde\x4c\x92\xfb\xa2\x5e\x17\x35\xaf\x0b\x53\x8d\xd6\x76\xd1\xb1\x01\x0c\x14\xf9\xc8\x40\x87\x84\x09\x4c\x95\xcd\x66\xb3\x69\xe7\x01\x78\xe4\x63\x7c\x69\xf7\x0a\xcf\xf9\x00\x09\x01\xc2\xa6\x16\x8e\x69\xde\x7c\xed\x35\x94\xdb\xb3\xa8\x64\xfb\xbb\x52\xaa\xc8\x6b\xd9\x31\x9d\x99\xef\x98\xac\x86\x0f\x22\x15\x25\xdc\x62\x64\x96\xa5\x0c\x9c\x47\x0b\x10\x1a\x52\x61\x83\x4b\xd8\x56\xa7\x59\xae\xe6\x4e\xa7\xf1\x0b\x74\x6f\x17\x8c\x9c\x08\x4b\x8e\x58\x4d\x7b\x95\x11\x5d\x09\x39\x40\xcc\x30\x7a\x84\x4b\xef\xc8\x0f\xb0\x52\xed\x03\x89\xc4\xd2\x06\x6c\x8a\x31\xf6\x06\x74\x90\x68\x03\x88\xad\x6b\x18\xe8\x10\x0a\xed\xc5\x26\x91\x79\xe2\x97\x2e\xd1\x31\x1c\x6d\xed\xf1\x58\x77\xd5\x0e\xcd\x64\x1b\xd8\x5e\xda\x93\xca\x29\x69\xee\x78\xe9\xa2\x1b\x7f\x8c\x6e\x02\x9e\xa3\x76\x7c\x28\xea\x1a\xca\xcb\x02\x6a\x9e\x66\xd5\xcd\x1f\x83\x7e\x3e\x23\x31\xef\xe1\xc3\xf8\x35\xb9\xe1\x70\x21\x68\x9f\x33\x8c\xe5\x42\x3d\x7c\x35\x5f\x72\xd4\x83\xde\xf5\xb5\x1a\x7f\x57\xda\xa1\x03\x3f\xd0\xf6\x40\x9d\x4f\xb3\x3f\xe9\xc0\xe7\xa6\x34\xce\x30\xbc\x81\x8d\x5e\x23\xc0\xbe\x1d\x94\xc0\xe7\x22\xb6\x6a\x5a\xeb\x9b\xdd\x6e\x76\xe0\x69\x5e\xd5\x13\x65\x80\x3a\x60\x3e\x62\x73\x5a\x75\x8e\x9f\xa8\xa8\x66\x07\x79\x90\xc8\xf8\x5f\xe5\x50\x74\x20\x8c\x20\x01\x2f\x45\x5a\x5f\x45\x13\x74\xa8\x13\xc3\x56\xd9\x9c\x07\x66\x01\xac\xcb\xf4\xd8\x21\x6e\x35\x09\x23\xac\xeb\x73\xbb\x47\x63\xbe\x34\xde\xf5\xae\x18\x24\x4c\xa6\xa7\x0d\x89\xa4\x21\xcf\x41\x0c\x73\x73\x5a\x61\x01\xfe\xdf\xcd\x99\xd8\xbb\xd0\x48\xa2\xb7\xbe\x47\x55\xfc\xc5\x79\x34\xb9\x35\x15\x1e\x11\x5d\xc6\xca\x21\x97\xda\xef\x40\x05\x55\x6c\xc0\xfd\x66\x0e\xeb\xe1\x14\x66\x3a\x60\xe0\xe4\x6e\xd3\xbc\x86\xbc\x79\xe8\x76\xeb\xb5\xbd\xa2\xc4\xb0\x96\x23\xcb\xf0\x6c\x84\xdc\x1c\x61\xf8\x74\x12\xb0\xa4\x43\x62\x34\xd6\x61\x7e\xc0\x14\xc3\xe8\xeb\x27\x49\x80\xb6\xd9\x5d\x51\xa8\x1f\xbc\x3c\xf2\xdf\x47\x2a\x75\xa2\x3c\x2c\x97\x40\x9e\xee\x0d\xcf\xdf\x6e\x8b\xf2\xb6\x33\xd0\x35\x67\x80\x3b\x68\xf3\x65\xb7\xaf\xc5\x39\x53\x1b\xa8\x7a\xb1\x33\xcd\xb9\x4a\x6c\x88\x18\x59\xfa\x06\xaf\x60\xfb\x20\xd9\x98\x81\x9d\x9c\x87\x4a\xf8\x42\x0b\xf0\x92\x56\x21\xa1\x28\x37\xf0\x6f\x90\xb5\x55\x6f\xbc\x3d\xe7\x5d\xf6\x69\xf8\xae\x42\x83\x61\x58\x3e\x97\x7d\x53\x58\x43\x42\xd1\x0e\x6b\xb5\x43\x7f\x93\x3b\x6c\x2f\x8b\x70\x1b\x5e\xdd\x3c\xae\xb6\xcf\xb7\xce\x46\xd1\xba\xad\x66\x6f\xb6\x67\xc3\x34\xf3\xaf\xc6\x43\x1e\x26\x09\xb4\x4e\x22\x14\x90\x93\x3c\xdf\x01\x3f\xfe\x00\x38\xf5\xb8\x0b\x06\xcf\x2e\x3d\xcf\x0f\x50\x5b\xe5\x5f\x69\x7a\xea\xed\x33\xd2\xf3\x62\x1f\x63\xe0\x27\xa8\xe7\xbc\x54\x5b\x28\xd3\xc6\xbe\x36\x94\x0c\x76\xf3\x88\x6d\x5f\x3f\x62\xc8\xd8\xd8\x7c\x8c\xae\x6c\xe2\xdb\x25\x20\xbd\xc0\x8b\xa4\x21\x63\xb4\x74\x24\xcd\xe0\xca\x62\x62\x2d\xb9\x0b\x88\x76\x3a\xfe\x4f\xc5\x47\x97\x7b\x76\xcd\x11\xa8\xc4\x49\xe1\x78\x7e\x2f\xa8\x2a\xbd\xe6\xf4\xec\x25\xa4\x4d\x2a\xae\x87\xaf\x96\x5e\xa8\x18\x06\xca\x1c\x8d\xc2\x6d\x86\x55\xa1\xdf\xed\x05\xd2\xa3\xbe\x22\x06\x92\x05\x6a\xcb\x33\x18\xd2\x1f\x48\x8f\x06\x24\x72\xe0\x42\x04\x59\x87\x8b\xb1\x9d\xe2\x7a\x0a\x8e\x96\x3f\x97\x12\x53\xa1\x4e\x68\x7b\x32\x6a\x20\x3d\x2a\xb9\x11\x7c\x85\xaa\x76\x5c\xc8\x55\xdd\xe9\x88\x48\x8f\x51\xc3\x08\xfd\x50\x1c\x70\x73\x9e\x00\x28\x8d\xfc\x12\xe9\x31\x25\x3c\x43\x03\xf3\x88\x49\xab\x5d\xbf\x6a\xf0\x8b\x21\x60\x20\xd0\x6b\x58\xdd\xed\x36\x8f\x37\xee\xd7\x23\x3f\x70\x16\xdf\x4c\x5d\x61\x88\x5c\xa7\x30\xc0\xc0\x94\x4d\xcf\x54\xd7\x60\x09\xb7\xf9\x04\x9d\x4d\x11\x8f\x38\xf1\xff\x5f\xf0\xdf\xee\x76\x71\x84\x49\x26\x4c\xb9\x3a\xb1\x07\x5e\x03\x71\x0f\x15\x73\x53\x34\x78\xb3\xda\x0d\x66\x7a\x12\x0b\x19\xf6\x42\x82\xce\x65\x1d\xbe\x28\x8f\x4d\x74\x00\x59\x59\xa6\xe4\x99\xa5\xc7\x45\x24\x9c\x9d\x9b\x2a\x8c\x4b\x9e\x11\xdb\x35\x1a\x33\x11\x10\xcc\xac\x42\xce\x45\x66\xc9\xf7\x9e\xf5\xf6\xe5\x8f\xc1\xd7\x10\x34\x46\xf5\x81\x5f\xcf\x9b\x87\x85\xdf\xed\x2b\xd2\x13\xb1\xc2\x85\xf0\xe4\xf6\x06\xe9\x49\xdf\xb8\xfa\xff\x29\x65\x71\xad\x8f\x74\xb5\xd7\x4a\x4f\x4a\xcf\x3d\x2b\x2e\x3f\xde\x9b\x6c\xb6\x8b\xf2\x02\xbf\xcb\x8d\xac\xaa\xea\x1a\xe8\x39\x19\x59\x92\x1e\x04\x1c\xd9\xba\xb6\x46\xac\xea\xaa\xa8\x44\x7a\xa0\x45\x2c\x5a\x7b\xd5\x1d\xd3\xd7\xba\xc7\x83\x67\xd6\x4c\x84\x2e\x2d\x97\x65\xae\xe4\xce\x35\xc6\x31\x9e\x98\xdb\x2c\x55\x20\xd2\xba\xda\xb5\x3a\x28\xd7\xc1\x20\xe9\x69\x21\x31\x6e\x54\x61\xba\xd8\x6d\xec\x18\x5f\xff\xdb\x10\x8f\xeb\xe3\x45\x7a\x5a\x7b\xb8\xe7\xb7\xc2\xd5\x78\x20\xef\x8a\xc6\x9b\x2f\x8b\x6c\xc8\x1c\x23\x7d\xcf\x8b\x5d\xc1\xec\x03\xaf\xea\x5d\x7a\x42\x64\xe9\x54\x38\x5b\xfa\x5e\xac\x71\xde\xbc\xdc\xf4\xe7\xaf\xef\x81\xe7\x41\x4b\x72\x7d\x03\xf5\x6d\x51\xa2\x42\x43\xfa\x9f\xd1\xb0\xfb\x3e\x03\xab\x00\x57\x9d\xec\xd1\x96\x96\x8d\x4d\xb6\x01\x59\x9e\x5d\x90\x40\xfa\x3e\xe8\x38\xb2\xb6\xdb\xcb\x76\xf9\x6d\x8a\x5e\xfa\x41\x6c\x8a\xa2\x1b\x63\x64\x76\x68\xa3\x3d\xd2\x0f\x12\x89\xe4\xd7\xef\x45\x0d\x7f\xae\xd4\xa0\x9a\xcb\x75\x11\x0c\x5d\xfc\xfd\x2b\xcf\x15\x66\x49\x27\x9d\x50\xe9\x07\xda\xe7\x96\x4d\xa7\x39\xff\x25\x6f\x35\x5a\xbe\x48\x3d\xfd\xed\x7f\x27\xb7\x58\x3f\x0c\x34\x56\xfb\xc9\xb2\xa8\xaa\xdb\xa2\x7c\xc3\xe3\xa2\xcf\xec\x26\xfd\x90\x70\xa4\x1d\x31\x36\x3f\x28\x54\xad\x6f\x1b\x85\x91\x20\x78\xbe\x20\xa3\xf2\x6b\x1b\xd7\x90\x7e\x08\xca\x55\x8b\xac\xd6\x77\xfd\xb2\xfb\xd1\x43\xd0\x90\x1a\x79\x02\xc4\x3c\x97\xc5\xd1\xdd\x81\x46\x0a\x5d\xc5\x7d\x75\xc9\xeb\x57\xa8\xd2\xff\xa0\x2b\xfb\xc5\xd8\xd1\x84\xea\xa0\x13\x8f\x3b\x9f\xa6\x4f\x21\x9f\xf9\x46\x7c\xea\x06\x6a\xf8\x1c\x66\x0f\x87\x37\x64\xa1\x46\x37\xe0\x78\x79\x28\xde\xcd\x41\xea\x16\xa2\x1f\x79\x01\x62\x23\x31\x6d\x52\x16\x39\x9c\x8f\x77\x45\xa6\xda\x66\xdf\x8a\xb1\x3a\xc9\xdf\xaf\x38\xcd\xbb\x28\xaf\xf4\xa3\x90\x22\xc7\x1e\x82\xd3\x1c\x4a\xc9\xb5\x29\x89\x35\x5b\x33\xa5\x6e\xd3\xca\x1d\x80\x7e\x1c\x0a\x22\xda\xda\xc4\x2f\xc6\x37\xe6\x46\x22\x5c\x81\x2d\x89\x1c\x78\x53\xa3\x97\x4e\x48\x80\x29\xaf\xc6\xcc\x6b\x36\x6e\x23\x6c\x37\xa1\x4d\xea\xfa\x37\x67\x0b\x52\x33\x64\x99\xc9\xf8\x19\x14\x4d\x6b\x1f\xf8\x09\xf8\xda\x78\xed\xa7\x8c\x4b\x58\x35\x9f\x38\x77\x06\xe7\x17\x77\xe5\x21\x35\x8c\x43\xcb\xf9\x5f\xf3\x87\xe5\x7e\xb7\x7a\x5c\xba\xfb\x71\x02\x18\x36\xdd\xae\x76\xee\x04\xbc\x36\x61\x86\x23\x20\x18\xd7\x36\xe0\x71\x57\xf2\xbc\xee\x05\x3c\xa4\x2f\x62\x1f\x33\x04\xc5\x09\x72\x44\x7a\x36\x46\x70\x33\xf4\x53\xde\x9b\xbd\x46\x7a\x14\xc1\xf2\x07\x7e\x5a\xe5\xd6\xf1\x6a\x51\xa2\xb3\x5c\x19\xe6\x80\xfe\x1f\xdd\xaf\xc9\x28\xc6\x64\xfd\xee\x71\xb9\x68\xfe\x5e\x0d\x76\x39\xa0\x46\xb2\xa6\x0d\xf9\x40\x07\x3b\x1c\x3d\x82\x4e\x14\x6d\x69\x34\x6e\x01\x5a\x7c\xab\x0c\x3c\x62\x10\xeb\x8f\x69\x0e\xe5\x9f\xee\xaf\x3e\x07\x5c\x4d\x86\x7d\x6a\xfb\xca\x4b\x78\xc5\xb0\x4e\x85\xe1\x6f\x4b\x5b\xeb\x3a\xcb\xc8\x99\xa1\x86\xaa\xfe\x5a\x90\x4b\x06\x41\x10\x22\x76\xfe\x84\x68\xa7\x6a\x22\x68\x2c\x83\x90\x49\x14\x84\xb5\x2c\x5c\x48\x0f\x66\x7e\xb6\xc7\x61\x32\xba\x6f\xa8\x7c\x29\xba\x44\x3d\xbc\xc3\xe8\x44\x09\x08\x23\x68\x1a\xa2\x63\xb4\x9a\x3f\x77\xd5\x44\x32\x20\xc2\xcc\xe0\x66\x3f\x56\x7f\x39\xaf\x5e\x06\x44\x69\xe1\x21\x3a\x39\xbf\x46\xd8\x4d\x00\x06\x64\x40\x55\x92\xd8\x22\xfd\x0d\x2f\xd3\xfa\x32\xa8\x03\x71\x9d\x74\x80\x1f\xf4\xae\x78\x87\x32\xef\xaa\x03\x64\xc0\xfc\x04\xd9\x4e\xff\xe7\x0c\xe5\x65\x60\xf6\x04\x2c\x08\x98\x61\x14\xfc\x55\x94\x6f\xb7\x3c\xcd\xb6\x75\x9b\x42\x92\x01\xa3\x01\x7a\xf7\x4f\xfc\x08\x03\x01\x9d\xc9\xd9\x18\xb0\x48\x60\xaa\x76\x5e\x5e\x4e\xc8\x9a\xe7\xee\x13\x7b\x9a\xf4\xa3\x1d\xfb\x12\xfd\xa9\xa9\x80\xbd\x0c\x62\xa5\x10\x1d\xa3\x53\x5e\xaf\xc1\x28\xbe\xbf\xb4\x31\x75\x19\x24\x81\x51\x15\x3c\x40\x7d\xbf\x7b\x98\x7f\x2f\x43\x6a\xb7\xbb\xc1\x63\x26\xd2\x54\xaa\xcc\x0e\x65\x01\x86\xc9\xae\x3f\xf9\x83\x04\xe2\x84\x5b\xac\x9e\xd9\x44\x9a\xcf\x7a\xc3\xeb\x2e\x68\x3c\x88\xbb\x0d\x07\x41\x78\x1e\xa2\x1b\xb7\x77\xf3\x87\x3f\xda\xbf\x45\x58\xc2\x83\xce\x41\xbb\x10\x84\xef\x63\xa5\x01\x6f\xa6\xfd\xf6\xdc\x0e\x87\x75\xff\x65\x20\x98\xc7\x78\xbf\xd4\x69\x2a\xc4\x28\x03\x11\x2b\x2c\x26\xc3\x89\x76\x3b\x60\x19\xb2\x3d\xa4\x36\xac\xc2\x9b\xe7\x87\xf9\xe0\x55\x55\x10\x22\xc2\x72\x5d\x54\xf5\xaa\x7d\x5c\x15\x1b\x12\xa8\x73\x05\xeb\xec\x7c\x48\xf3\xae\x2a\xc3\xf5\xe0\x11\xe7\xfd\x9a\xa4\xc9\x79\xab\x84\x61\xec\x36\xb4\x7e\x7f\x4e\x6f\x20\x01\x78\xb1\x0d\xf6\xdb\x02\xf0\xbb\x82\x67\x03\x30\xa0\x0c\x40\xf8\x32\x1e\x44\x60\x06\x41\xb0\xf1\x1d\xb5\xc4\x04\xf7\xbb\xbb\x5c\x6b\x21\xc2\xd6\xf9\xe9\x92\xa4\x32\xf4\x98\x11\x48\xb0\x60\xf3\x0e\x3c\x20\x43\x3f\x14\x86\x19\xf2\x7c\x41\x4c\xc6\x54\x36\x58\x86\x7e\x12\x21\xc5\xf1\xb6\xc8\xe6\xd9\x59\xb8\x8b\x03\x2f\xa6\x61\x47\x29\xd1\xd5\xe0\xc9\x30\xf4\x05\x06\x5e\x8c\xa6\xe6\x02\x32\xee\x02\xee\x1b\xa8\x8a\xec\xbd\xb5\x78\xc2\x30\x32\xfc\x95\xb8\x9e\x8a\x05\x1c\xda\xf0\x4c\xd3\x66\xd8\x29\xe7\xd9\x59\xbe\xf5\xfc\x95\x30\x8c\x5b\x6f\x70\x25\x0d\xc5\x70\xdf\x41\x1b\x3d\x7e\x08\x42\x0f\x36\xfa\xe2\x5b\xd4\xab\x0c\x09\x33\x65\xab\xb3\x39\xa2\x11\xfa\xb3\x29\x24\x11\x0d\x4c\x64\xa2\xc4\xc4\xd0\xb6\xa5\x9f\x74\x1d\xc0\x8c\x0a\x06\x46\x8f\x22\x6d\x9c\x81\xc6\xc8\xb8\x5f\xb7\x5f\x72\xf0\x74\x34\x8c\xf1\x48\xe4\x4a\xa1\x7b\x6c\xd2\xf2\xbf\x25\xf4\x9a\x3c\x7c\x43\x9a\x18\x7c\x8a\xc1\x88\x0e\xca\x47\xa7\x67\x66\x48\x05\x03\xd5\x02\x74\x24\xdc\x80\x2e\x4a\xe8\x4f\xcf\x71\x7f\x88\xcc\x7a\x45\xed\xe9\x81\x3f\x11\x32\x4f\x99\x7a\x05\x17\xa1\x1d\x14\x9f\xb9\x4e\x01\xc5\x8d\x62\xcb\xeb\xa2\xad\x22\x74\x6d\x4c\xa2\xe1\xff\x30\x5b\x0c\x46\x3d\xb2\x5a\x3f\x9b\xbe\xdc\xb7\x4d\x94\x7c\x6b\x8e\x84\x11\xa5\x49\xe7\x73\xde\x3d\x7c\xb1\x42\xc3\x88\x79\x54\xba\x53\x6e\x0b\x59\x96\xe6\x87\x3b\xc8\xaf\x0b\x5f\xc6\xf7\x8f\x94\xa3\x8e\x6f\x6c\xfa\x0d\x9c\xce\x35\x06\xff\x9b\x21\x74\x8f\x1f\x4b\xc0\xec\xb6\x11\x39\x46\xc7\x57\x3d\xf4\x0d\xb7\x30\x06\xc0\x59\xc3\x95\xb2\x2a\x02\x9b\xbe\x6a\xe4\x08\x2f\x32\x3a\x49\xed\x3f\x43\x17\x7d\x34\x4f\x06\x7f\xb5\x3f\x9a\x30\x81\x84\x6c\x9a\xb9\xc7\x48\x22\x8a\x33\xff\xad\x92\x8d\x51\xfa\xeb\xb5\xb1\x47\x9b\xf1\x7e\xe4\x69\x9e\xc3\x75\x32\x6c\x30\xf5\x93\xc4\x47\xd1\x9d\xd5\x6e\x3b\xf8\x7a\xdc\xf3\x70\x01\xa6\x36\xed\xdc\xdf\x9c\xb8\xaf\x42\xeb\x49\x38\x0f\x77\x6e\x82\xa5\xc3\xfd\x3d\xe4\xa0\x3d\x33\xb7\x4a\xb5\xe8\xb8\xe8\xfa\x61\xc3\x50\xf8\xe0\x59\x81\x10\x69\x8b\xda\x27\x29\xdc\x5d\x77\x6e\x34\xe7\x91\x3a\x66\x8f\xdc\x31\x48\x38\xdb\x7d\x38\x01\x54\x5b\x52\x81\x9f\x50\xe6\xfc\xf8\x5c\xa6\x87\x34\xb7\x4b\x6b\xf4\x84\x42\x13\x53\x30\x71\x3a\x65\x56\x8d\x67\x64\xa1\x85\xd2\xd3\x58\x68\x06\xbc\xaa\xb9\xaa\x4c\x95\x82\xb3\x9a\xc2\xc6\x8c\xb1\x9c\x8c\x3c\x1d\xa3\xb5\x64\x28\x89\x61\x56\x9f\x6d\x6e\x56\xbb\xcd\xec\x6e\xd9\x19\xbc\xd3\x73\x5f\x85\x66\xdc\xf7\x22\x9d\x2e\x5a\x92\x21\x50\x0f\x8f\x2f\x8b\x8b\xb3\x93\x72\xfa\x76\x00\x1a\x2b\xb6\x67\xe2\xe2\x4a\x70\xc6\x71\xb5\xff\x1e\x5d\xa2\x21\xc0\x78\x25\x34\xe7\x4e\xe1\xde\x53\x6b\x85\xe0\x4b\xfe\xc1\x4b\x35\x3f\x9f\xfa\xdf\x90\x78\x34\x44\xb0\x5b\xaf\x02\x7e\x58\x6e\xd8\x74\x89\x78\xa7\x3f\xf2\x88\xd0\x8b\xa7\x42\xc1\x34\x67\xa0\x24\xbe\x02\x74\x7a\xf7\x88\xee\x03\xf5\x98\x56\x15\x28\x74\x32\x31\x3e\xf7\x3b\x44\xff\xb4\x29\x48\x82\x50\xbb\x54\xdd\x2c\x83\xb2\xee\x62\x47\x24\x0c\x63\x6e\x39\x8f\x90\xdb\xc0\xb0\xd9\x4f\xe1\x2c\x25\x09\x89\x46\x74\xcc\x6c\xf7\xfb\x28\x1b\x09\x29\x20\x62\xca\x64\xce\x97\xe7\xb2\x5a\xa3\x0a\xf7\x68\x84\x42\xc6\x59\x4b\x21\xbf\xcc\x8d\x7e\x94\xee\x4a\x21\x25\x09\xa3\xc4\xb7\x10\x0a\x2b\x5c\x74\x73\x9e\x20\x32\xb7\xbd\x89\xc7\x90\xf1\xba\x3a\x1f\x8f\x73\x5e\xbd\x7e\x14\x99\x76\x77\x22\xd4\xb0\xaf\x6d\xd3\x2c\x95\x45\xfe\x93\x67\x19\x0c\x8c\x4d\x42\xb4\x6f\xfc\xb0\x14\xca\xbd\x91\x33\x29\xf7\xfd\x9a\x5b\xd7\x91\x82\x36\x3f\x73\x75\xb8\x0e\x47\x81\x71\x8a\xf0\xc2\x97\xfc\x95\x67\x2d\x8b\x9a\x24\x51\x48\xb4\xfd\x22\x6b\x5e\xd6\xa9\x4c\x4f\x3c\xaf\xab\x81\x16\xc5\x70\xf0\x23\x6a\xe4\xbc\x56\xcf\x3f\xdb\x9b\x24\xa1\xe5\x0e\x46\x55\x3a\x27\x76\xdf\x34\x30\x0a\x96\x92\xc2\x72\xfa\xdc\x19\x63\xbf\xf7\x0a\x11\x97\xc4\x3d\x42\x59\xfc\x1b\x64\xfd\xb3\xa7\xce\x35\xfa\x4c\x91\xd2\x81\x6e\x27\xf2\x32\x4b\x0f\xa9\x68\x3e\x44\x39\x06\xf6\x4b\x12\x0b\xa1\xf8\xe8\x08\x71\xbf\x19\xeb\x18\x87\x03\x05\xa5\xea\xcb\x6d\x69\x3d\x3d\xdb\xcc\x3d\x23\xdd\x6f\xc8\x39\x07\xb1\x15\xc2\xa3\x38\xb4\xf4\xc0\x48\xf2\xb1\x05\x5e\x15\xf9\x1f\x7d\xaa\xc1\xd1\x54\xe0\x9c\x60\x75\x6d\xb3\xef\xe0\xb7\x34\x48\x13\xdb\x2a\x88\x8f\x26\x9b\x95\x53\xeb\x67\x0f\x65\xe3\x29\xa3\x85\x9b\x56\xbb\xd7\xb4\x5a\x9f\xcb\xb4\xe6\x79\x2a\x79\x36\xa8\x13\x97\x44\x72\x23\xaf\x6b\xcf\xe2\x2b\xf7\x7e\xf8\x40\xca\x8f\x85\x93\xe4\xc3\x15\xed\xf4\x41\x49\x2f\x2c\x48\x54\x12\x05\xa2\xc7\x5e\xbc\xbc\x26\x30\x76\x3d\x45\x84\xa1\xa1\xaa\xab\x12\x70\x2d\x60\xd2\x72\x88\xec\x6c\x7c\xc5\xe6\xa8\x4e\xf3\x73\xeb\xf7\x12\x88\xcc\x5a\xfe\xe7\x8f\x87\xf6\x4f\x12\x78\x8b\x45\x77\x6c\xf1\xd3\xbf\x0c\x4a\xe1\x77\x6c\xb9\xdc\xcb\xe2\xf8\x95\x79\xe3\x8c\x55\xa2\xe3\x04\xf5\x0e\xb6\xeb\xe5\x7c\x35\x7b\x58\x6d\x77\xfb\xed\x6e\xf6\x63\xb9\x7f\x7e\x72\x61\x1c\xea\x87\x1c\xd1\x0b\xbc\x2c\x57\xea\x33\xc8\x8a\x11\x2d\xa1\xa4\x7e\xa2\xdd\x41\xd7\x58\xa1\x5d\x34\x8c\x36\x3e\xbe\xb5\xb5\xf7\x15\x64\x59\x97\xe8\x95\x34\x10\x26\xf5\xe9\xa0\x5a\x26\x71\x3d\xbc\x73\x48\x35\xc2\x0b\x30\x8b\x36\xac\xe7\x1d\xae\x45\x4a\x38\xf7\x0d\x8c\xe4\x94\x15\x97\x79\x71\x3c\x9e\xf3\xb4\xbe\xdc\xf0\x2c\x2b\xea\x49\x5e\x62\x87\x4c\x94\x94\x26\x8a\xb6\xbf\xb2\xe6\x75\x0d\xe5\x68\xb1\x51\x16\x09\x6d\x96\x6f\xbf\xec\xd2\x35\x8a\x28\x69\xb7\x43\x5c\xb6\xe3\x0e\x8a\x78\x36\xfa\x87\xda\x3f\x65\x57\x80\x75\x8d\x97\x9e\xf2\x14\x69\xc4\x15\x62\x4f\x72\xf8\x40\x7f\x7f\xda\x34\x19\x6c\x74\x34\x52\x09\x89\xfa\xc0\xbb\xab\xe1\x8d\xfd\x08\x89\x36\x52\xd4\x35\xd4\xeb\xb2\x78\x4f\xd5\x78\xf7\xa0\x71\x10\x62\x22\xce\x12\x46\xb4\x92\x1f\x86\xf5\x7c\x72\xcf\xa7\x31\x37\x52\x50\x92\xe7\xeb\x8c\xd7\xba\x28\x8f\x36\x5a\x37\x9d\xf9\xa5\x89\x14\x8e\x26\x69\xbe\x45\x88\xa1\xe6\xe3\xd3\x8e\x26\x3a\x0e\x62\x27\x10\xf2\x9f\xff\xb4\x92\xa3\x8d\xff\xe5\x32\x6f\x54\x10\x1e\x1a\x1a\x8b\x63\x9a\x7f\xf1\x6b\x82\x0a\xcf\xa1\x7c\x5a\x20\x2a\x92\x70\x3b\xb8\x8f\xa4\x42\x03\x16\x18\xaf\x9e\x56\xbb\xd5\xec\x61\xef\x68\x3d\x67\x37\x0f\xcb\xfd\xee\xf9\xc7\xf2\x69\xbb\xff\xf9\xfc\xf0\xd2\x06\x3c\xa9\x0c\x24\x16\x7e\xe4\xeb\x22\xcb\xaa\xf6\xaf\x9c\x62\x71\xc1\x6a\xfe\x7c\xfb\x97\xfb\xa3\x22\x09\x49\xac\xb3\x63\x46\xb4\x57\x37\xe0\xfa\x44\x09\x96\x63\x73\xa5\x36\xf3\x71\x9b\x0e\x12\xd1\x89\x0b\x2e\xe0\x2d\xe3\xcb\x6b\x95\x9e\xa1\x31\x62\xaf\x05\x9f\xa1\x65\xf7\x38\xfb\x73\x3f\x7b\x78\x78\xfe\xb5\x5c\xec\x6f\xfe\x6a\x16\xfe\xdd\x72\x1f\xb8\x27\x84\x20\xc2\xe8\x9c\x7b\xfd\xf5\x66\x35\x6f\xdf\x14\x98\x79\xfc\x0a\xea\xec\x3d\x33\x15\x00\x03\x4f\x96\x42\x1c\x22\xfa\xfa\xe6\x9c\x65\x60\x29\x46\x24\xf3\x92\xd8\x14\x90\x66\x59\xf1\x61\x4a\xd2\xab\x5d\xc7\xa0\x74\x9d\x6b\x1d\xd9\x84\xcc\xd3\xa6\x84\xea\x98\xe6\x1b\xf8\x1f\x77\x5b\x3f\x30\x99\x82\x66\xf2\x64\x69\x5f\x58\x7b\xda\xd9\xe9\x3f\x29\xf3\x05\x31\xc8\xa0\x22\xcd\x67\x07\xeb\x42\xdf\x16\xe5\x17\xe4\xc9\xc3\x89\xce\x7c\x45\xb1\x98\xc6\xc5\x07\x1a\xcb\xe4\x5a\x32\x70\xf4\x16\x41\xc0\x91\xf8\x68\xb7\xbc\x71\x39\x53\x16\x84\x12\x03\xb9\xa2\x38\x1f\x5e\xd1\x9d\x19\x07\x95\x58\x60\x6d\x08\xf8\x6c\x26\x6c\x2b\x4b\xd0\x36\x43\x60\x21\x53\xf5\xa2\x38\x0c\x67\x3c\x0b\x7d\x82\x3c\x4c\xb8\xd5\xbe\x54\xe0\xd8\x3b\x7b\xd6\x33\x23\x54\x06\x96\xc8\xd4\xd4\xc5\x0e\x42\xcd\x8c\x70\x89\xb6\x8d\x9d\xad\xcb\xce\x20\x64\x34\x00\x0c\x93\xcd\x97\x4f\xbb\xfd\x62\x39\x5f\x3d\xce\x1e\xb6\x6d\x23\x09\x3d\x13\xbf\xb2\xc2\x67\xed\xdf\x29\xe6\xb4\x72\xf8\xe8\x49\x43\x4b\x46\x35\xf5\x5c\x68\x08\xd7\xa4\x6b\x60\x1c\x82\xe0\x8b\x2a\x9f\xd1\x08\x47\x84\xe1\xec\x45\xd4\xbf\x9a\x55\x5b\xc9\xaf\x4f\xc3\xe1\x08\x45\x5a\x20\x00\xe0\x71\xf5\xd4\xac\x85\xcd\x6e\xf5\x74\x37\x98\xf5\x2c\xd2\x0a\x41\x28\x22\xc3\x82\x33\x35\x93\xb2\x6b\xd2\x78\xfa\xa2\xcd\xbc\x85\xba\x4d\xb0\x0e\x1f\x2b\x66\xd2\xa7\x4e\x38\xaa\x39\x6c\x3a\x52\x6d\xc9\x62\xf0\xd0\xdf\xd9\x5b\x26\x26\x23\x7e\xfa\xdb\x60\xce\x37\xf9\x5f\x16\x83\x34\x7a\xd7\xe8\xd1\x96\xb0\xc5\x89\x5f\x4d\xd9\xc5\x2c\xa1\x21\xe6\x73\x85\x25\x46\x8a\x47\xe3\x93\x24\xc4\xd1\xdc\xce\xb2\xcc\x71\x09\xae\x4e\x1a\x4d\x64\x18\xb2\xcd\x4a\x96\x08\x8a\xc5\xa4\x4f\xf0\xe1\x10\xec\xa3\xfb\x81\xb6\x9a\x89\xe5\x1b\xd4\x81\x17\x78\x06\x29\x6d\xd8\x23\xdd\xa0\x70\xae\x95\xef\x6a\x4e\x0e\xe7\x8c\x97\x73\x5e\x56\xb7\x45\x89\xf2\x9c\x63\x5c\x04\xe3\x32\xe0\x7d\xe1\x2e\x9e\xed\x1f\x46\x44\xc7\x92\x89\xc0\x88\xf8\x37\x8e\xf9\x7e\xe3\x8f\x5b\xa9\x05\xf4\xa1\xb9\x71\x9b\x96\xdd\x02\x14\xca\x14\x02\x9c\x4a\xc0\xf4\xd4\xf4\xe1\xc7\x84\x4a\xd0\x81\x82\xcf\x1a\x2c\x2d\xf5\xe8\x37\x94\x48\x04\x6d\x71\x6b\x36\xac\xfb\x0b\xd2\x51\x37\xf0\x13\x8c\xe4\x9b\x0d\xd6\x54\x03\xf0\x34\xbb\xb8\xc8\x97\xb5\x88\xbe\x9f\xd7\x40\x62\xa3\xf9\xcc\x73\x59\x94\x73\x9b\x87\x73\x8d\xd4\xb0\x9d\xcc\x96\xff\xaa\x7b\x5e\x17\x03\xe6\xa1\x1d\xbb\x3d\xa7\x32\x55\x23\x25\x01\xc9\x20\x21\x18\x86\x3b\xba\xaa\x89\x81\xce\xa4\x64\x20\x22\x21\x7a\xf9\x8c\x27\xf8\x30\x08\x31\xd7\x41\x73\x8a\x95\x89\xa6\x58\x16\x8b\xf6\x37\xcd\x8d\x46\xeb\x45\x0b\x2f\xb0\xba\xef\xf3\xf2\xa2\xca\x9f\x29\x4a\x43\x37\x26\xbd\x42\x1a\xed\xb6\x1f\x45\x39\xa7\x3e\x7f\xc3\x17\x5c\x27\xa3\xd1\xd1\x0a\x64\xab\x41\xd4\x3c\xea\xe1\xd2\xd5\x7c\x4e\x9b\xda\x4c\x43\xc4\x6d\x91\x81\x3d\x24\x56\x0a\x53\x73\x5f\xc1\x92\xfb\xeb\x2c\xf2\x12\x8d\x58\x97\xe3\x67\xf9\xef\x7f\xf7\x5d\xdd\xc8\x13\x01\xd6\x19\x7e\xa4\xb9\x2a\x3e\x06\x9b\x6f\xe4\x49\x82\xae\xe1\xe2\xf9\xcf\xe1\x35\x10\x25\x7e\xeb\x05\xae\x72\x44\x52\x8c\xe3\x5f\x4d\x2f\x34\x5f\x6d\x2d\x94\xa9\x0d\xb6\x1a\x17\x1d\x0d\xe9\xc6\x50\xf9\xfd\x05\xdc\xcd\x8f\xc8\x97\x1e\xd8\x72\xea\x55\x65\x8d\x5b\x13\xf6\xb0\x1d\x02\x15\x5b\xf0\x40\xae\x5a\x5c\x28\xe6\x1e\xba\x2e\x10\x18\xd6\x53\x63\xab\xdc\xa6\x46\xb9\x78\xb8\x5f\x44\xa1\x8e\x09\x6b\x45\xe7\x9b\xf5\xb0\x6c\x46\xe1\xb7\x92\xf7\x32\x22\x8a\x20\x68\xf0\x1f\xf3\x5e\x98\x3f\xa2\x89\x01\x4c\x67\x13\x29\xf1\xef\xb1\x80\x11\x95\xbe\x20\x43\x38\x6b\x5a\xbf\xae\x8b\x2c\x95\xd7\x9f\xb8\x77\x80\x46\x11\xf1\x31\x06\xf7\x7c\xeb\x9e\x22\x12\x91\x24\xd3\xf2\x45\x0b\xe0\x59\x33\xa4\x8b\x42\xb6\x02\xd6\x32\x8a\x34\x47\x28\xed\x4c\xa9\x47\x4c\xa8\x7d\x5d\x28\x2d\xa3\x58\x1a\x29\x43\x05\x96\x5f\xfa\x9f\x67\x6e\x2a\xce\x86\xfd\x12\x9a\x20\xb9\x86\xc9\x93\x3c\x9d\x8f\x69\x75\xe4\x6e\x31\x47\x09\xe3\xb1\x2d\x71\xbf\xe3\xd5\x4b\xd5\x23\xa4\x75\x3d\x12\x30\x25\x3e\x75\x19\xe0\x57\x1b\xd8\x7a\x51\x22\x7d\xc3\x05\xd7\x4c\xa2\x7b\x5e\x2a\xc9\x07\x61\xb9\x28\x01\x21\x8d\xe1\x72\x4a\x4b\x18\xa8\xbe\xcb\x88\xd3\x40\x68\x63\x06\xcc\x5f\x1b\x97\x39\x3f\x4c\x0b\xfb\xc8\x48\x78\xda\x85\x68\x36\xa9\x1a\x3f\xa5\xf0\x43\xcc\x1b\x37\xb6\xcb\x9f\xd4\x21\x5f\x22\x19\x19\x53\xa0\xa7\x2c\xb1\x18\x2d\x0f\x19\x49\x24\x5d\xd8\xbe\xac\x97\x9b\xfd\x6c\xf1\xb8\x7a\x6a\xaf\x86\x48\xd9\x2a\xc3\x7a\x57\x20\xb1\xc8\xb9\x57\xfa\xd6\x56\xc4\x39\x67\x32\x52\x3e\x91\xda\x85\x91\x3e\xf2\x51\xf9\x91\x8c\x54\xec\xa1\xe5\x6e\xb9\x58\x5e\xf2\xf4\xb3\x97\x14\x8f\x94\xf4\xd0\x97\x34\x61\xe5\xea\x7c\x32\xec\xb7\xd5\xbe\x5f\xa2\xff\xc7\x95\x79\x3c\xbd\xf7\x47\x4a\x19\xc5\x28\x13\x4a\xf9\xf5\x1b\xe4\xaf\xbd\x08\xb8\x61\x61\xfe\x55\x49\x4c\x61\x7d\x43\xde\x27\x23\x50\x06\x3c\xb4\xde\xdc\x0f\x37\x26\x00\x8e\x8c\x23\xaf\x69\x09\x25\xd6\xf0\x43\x55\x94\x75\x9f\x99\xfb\x37\x55\x86\xed\x13\xc5\x9e\x10\xc4\x8e\x69\xb3\xeb\x77\x34\xcb\x83\xcf\x18\x7b\xda\xd0\x93\xba\x88\xc2\x2a\x57\xa9\x4c\xe1\xca\x84\x77\xe1\x8f\xd8\x0f\x8c\x1c\xf2\x3d\xa8\x03\x2a\xca\xcc\xf9\x29\xad\x5d\x80\xde\x75\xd2\x1a\xeb\xb5\x76\x77\x4b\x5b\xed\xef\x5a\x02\x6a\xea\xa3\x9b\xbd\xef\x2e\xd5\x75\x8f\xf6\xcf\xf5\xe0\x3e\x6e\x4d\xa5\x49\x3d\xfd\xe8\x2e\x05\xa3\xa6\x7e\x80\xfa\x5f\x50\x0e\x89\x35\x64\x1c\xfa\x02\x63\x58\x25\x42\x69\x41\xeb\xe6\x35\x5a\xbc\x42\x1c\x8a\x80\xda\xaa\xf1\x3a\x3d\x42\x96\xe6\xc0\x73\x75\xe8\x72\x46\x71\xa8\x95\x15\x6b\x6f\x8c\xa9\xdb\x94\xb7\x10\x5e\x07\xe7\x19\xfe\x20\x09\x80\x76\x9c\x90\x78\xf6\xdd\x96\xc5\x71\x03\x3c\x7b\xc9\x53\x59\x94\x79\xdf\x52\x8d\x89\x20\x9e\x61\x88\x7d\x03\x5b\x99\xdf\x36\x35\x96\x5f\x4b\x9f\xb6\xfc\x9f\x49\xaa\x6d\x19\xd3\x50\x22\x86\xe1\x57\x2f\x5a\xf5\x23\x95\x6f\xbb\xd7\x9e\xb2\x8f\x8c\x69\x44\x91\x6e\x0e\x09\x74\xcf\xb2\x46\x8c\xc5\xf0\xa3\xd3\x18\x10\x70\x55\x1d\x9b\xbd\xa3\xea\x23\x21\x62\xca\x23\xda\x91\x60\xdf\x15\x85\x95\xfc\x1b\xdd\x81\x0b\x54\x36\x11\x05\x2f\x95\xc1\x71\x5a\xc1\x4b\xd7\x41\xe9\xc0\x96\x89\xfe\xba\xe7\x93\x53\x2f\xf2\x55\xe8\xb7\x49\xe5\x05\xff\x8a\xf4\x4e\xc6\x31\x84\xf8\x6d\x9b\x0d\xe5\x4b\xc8\x84\xed\xcb\x75\xe4\xd9\xe9\x53\x64\xef\xb0\xe9\x38\x52\x64\x2c\x7c\x8d\x55\x77\xdb\xd7\xa7\xed\xeb\x60\xc2\xca\x20\xc0\xc0\xda\xe9\x5c\xbd\x3e\xa6\xcd\x98\x14\x79\x9b\x4c\xbd\x3e\x4e\x58\x3f\xd4\x19\x4b\xc6\x8c\xbe\x72\xfe\x9a\x76\xca\x5c\xb6\x51\x51\x86\x40\xbb\xfc\x7c\x84\x92\xa7\xdf\x67\x87\x63\x25\x22\x3c\xf7\xe7\x5b\xe7\x41\xc5\x4a\xd2\xc8\x14\xaf\x36\x86\xc4\xbc\xc8\xab\xde\xb4\x56\x40\x11\x56\xb2\x98\x3f\xfe\x3e\x99\x11\x83\x47\x3c\xdd\xe1\x95\x66\xf5\xdb\x4d\x51\x55\xff\x3c\x8f\x8b\x25\x65\x0c\x7e\x04\x4e\xf4\x1c\x2b\xd9\x6a\x9e\x19\xff\xd6\x99\x28\x31\x10\xa3\x0a\x29\x4b\x50\x85\x23\x1b\x76\xb0\x6a\xd7\x27\x06\x84\x02\x35\x2e\xe5\x03\x34\xae\xd9\x63\x5a\x36\xa6\xa8\xeb\xa0\x23\xc6\x7d\x27\x11\x3f\xd4\xa1\x9a\xf8\xb6\x3a\x0e\x1c\x1a\x1f\x9f\xc8\x70\xba\x19\x2a\x8e\xe1\x38\x6a\x1d\xf3\xb6\x80\x76\x50\x93\x6e\x3a\x24\x1e\x95\x89\x55\xc3\x59\xcd\x9f\x7b\x42\x4d\x32\xf1\x49\x88\x10\xdb\xfd\x6b\x1f\x05\x34\xf8\xaa\x89\x0f\x04\x6d\xbc\xc5\x6a\xbb\xdb\xac\x6e\x5e\x76\xab\x67\x77\xfc\x25\x01\x0f\x90\xbd\x5d\xee\x1f\xd3\xbc\x47\x87\x29\x93\xd0\xe3\xe8\x26\x2d\x77\xf7\xcb\xcd\x72\x3e\xdb\xde\x63\x4c\xec\xbb\xc3\x22\x09\xa9\x1f\xbb\x42\x81\xbd\xea\xd7\x35\xcb\x24\x8c\x22\xaf\xab\x19\x9c\x65\xd9\xcf\x73\xd6\x38\x0f\x2d\x23\x9d\x4c\x48\x14\x6a\x66\xcb\xbd\x9e\x8a\x05\xc8\xf4\xc8\xaf\x6b\x01\x5d\xe7\x38\xc4\x98\xeb\x1b\x4f\xcb\xa2\xea\x49\x74\xc9\x84\x92\x00\x83\xfe\x0f\xc5\xc1\xc4\xe8\x8d\x7f\x35\x4a\x99\x26\x94\x52\x7c\xda\x93\x95\xdb\x74\xe1\x98\x7e\x46\xc8\x7d\xce\x84\x82\x0e\xb5\x15\xcf\x31\xbc\x62\x12\x2d\xb2\x3e\xb9\x8a\x4c\x58\x64\x30\xf9\x3c\xcb\x0a\xd9\xb8\x74\x4e\x87\xbf\xed\x10\x6b\x6a\xcb\xfc\xf6\x46\x77\x4b\xf1\x9a\xef\xc5\x19\x09\xfe\x47\xdf\x9d\x69\x86\x01\xc2\xc7\xcb\x4c\xbd\x37\x3b\x96\xba\xa6\xff\x94\x49\x44\xa2\x44\xd8\xdc\xf7\xf0\x69\x22\xa6\x84\x72\x13\x0b\xfd\xee\xb4\x68\x8e\xc0\xe7\x77\x28\x79\x8b\x0f\x4e\x22\x6d\x2a\x5d\x16\x70\x1e\x80\x20\x93\x38\x12\x2e\xe0\x64\xb6\xcd\x35\xbf\x5c\x8d\x62\x9c\x08\xd2\x0f\x79\xfc\xed\x78\xc6\xf0\x2d\x12\xa6\x30\xdd\xde\x9c\xe9\x7c\x5b\x17\xf2\xad\xea\x1d\x14\x49\x92\x04\x98\x3e\xb7\x7c\xe1\x66\xf5\x99\x12\x3f\xd7\x45\x78\x31\xea\x9c\x64\xf9\xcb\xe9\x64\x4a\x50\xbe\xc8\xe2\x24\x22\x8c\x51\x5d\xe1\xc8\x3f\x1b\x47\x64\x6e\x89\xe5\x7a\x24\x40\x32\x91\xa1\x8a\xdd\x3e\xde\x3c\x49\x75\x5b\x94\xcf\x99\xea\xc9\xc4\x5e\x57\xa9\x0e\x47\x46\x0a\x85\x78\x6d\xcb\x8f\xe7\xa6\xc2\xe8\x68\x49\xa4\x32\x16\xa8\xe9\xb6\x30\xe4\xc6\x50\xee\x8b\x3c\xbb\xec\x17\xf0\x3e\xea\xae\x28\x43\x5b\x69\x7f\x6a\x3c\xee\xd1\x5c\x50\xb1\x70\xf2\xb8\x37\x50\x57\x37\x97\x79\xe3\xf1\x16\xe5\x90\xbf\x5f\x26\x9a\x24\xc8\xc9\xbb\x3d\x65\x69\x3d\x90\x7f\x1f\xfe\x98\x86\x80\xdb\xe8\x67\x9a\x07\xc3\x1f\xe3\x9e\x47\x45\x38\x28\xe1\x6c\xb6\xae\x11\x0a\xa5\x3f\x44\xb1\xbb\xd0\x0f\x9d\x0e\xf8\x06\xe3\x1e\xeb\xcf\x6c\x94\xfc\x19\xfd\x92\x2f\x5c\x98\x60\x07\x55\x7d\x5b\x9c\xdd\x5a\xe7\x3e\x37\xc9\xe7\x12\xaa\xf3\x11\x1e\x8a\xba\x45\x12\x70\x5f\x0a\xe4\xe1\xb4\x6c\x86\x26\x2b\x2b\x8d\xfb\x3f\x0e\xfe\x76\x27\x24\x0f\x7c\x11\x46\x6d\x81\xc3\x1a\xca\xaa\xc8\x79\x36\xe7\xa7\xd1\xeb\x07\x44\x25\x5d\x8c\xc7\xd2\x2e\x0e\x5c\x1f\x1e\x44\x09\x26\x9e\xec\xf2\xfd\xe7\x19\xda\x28\x28\x0f\xfd\x28\x68\xc1\xf6\xab\xd1\xaa\xe2\x94\x04\xf8\xec\x19\xaf\xea\x2d\xcf\x60\x95\xdf\xdf\xb9\x50\x32\xa7\x14\x70\x2b\x45\x69\x20\x0c\xbb\x60\x1a\xf9\x72\x95\x06\xfb\x16\xa2\xc0\xa9\x8a\x35\xea\x0f\x01\x57\xfb\x73\xec\xee\xce\x3c\x03\xb6\x35\x04\x14\xf3\xe2\x78\xc5\xb6\x23\x39\x0b\x0d\x3f\xff\x43\x2a\x4a\x6e\xc2\x31\x4f\x50\x7f\x14\xe5\xdb\xef\x4f\x76\xce\x08\x8b\xad\xca\xdf\x6d\xfa\x0e\xdb\x1a\x4e\xc3\xc2\x78\xc9\xe3\x20\x54\x2d\x25\x1e\xb2\xe9\xa3\x98\xd0\xaf\xe6\x07\xda\x2e\x31\x12\xfd\xee\x25\xcf\x6f\x4a\x00\xf5\x75\x45\x02\x4f\x48\x90\xd8\xf9\xf3\xac\xb5\x63\x9b\x9b\x9c\xf2\x9c\x43\x88\x9c\x3f\x92\x67\xd9\xb9\x82\x92\x4f\xa7\x09\x6c\x6f\x41\x21\x96\x6d\x78\x66\xac\x8a\x6c\x3b\x49\x22\x31\xd8\xf6\x8f\x67\xe7\x1f\x70\x99\x44\xa1\x15\xfb\x3c\x9d\x6b\xb0\x84\x87\xb6\x51\x25\x09\x8a\x62\x39\x5a\xed\x9b\xcb\xf2\xf1\xf9\x69\xb7\x3a\x9e\xb2\x3e\x66\xce\xbd\x27\x23\xa3\x87\x02\x0b\x94\x53\x50\x43\x79\x4c\x73\x58\x4e\x94\x60\x4b\x0e\x31\x35\x8c\x0c\x48\x66\xb3\x17\xa6\x5a\xe0\x3b\x4d\x49\xc9\x75\xe8\xa3\x47\xf5\x58\xbc\xa7\xf0\xab\x28\xdb\x4a\x0b\xae\x69\x82\x76\x2f\x57\x6a\x7d\xce\x32\xe7\x87\x7c\x9b\x99\x15\x1e\x11\x58\xf9\x53\x9e\xf3\x3c\xcd\x0f\xfb\xd4\xdd\x4e\x78\x91\x87\x42\x52\xcf\x6b\x97\x2c\x17\x3e\x21\x98\x4f\xd0\xfe\xf4\x67\x16\xbe\x10\x9e\xcd\x53\xbb\x8a\xa4\x3b\x5e\x2d\x3f\xeb\x92\xcf\xca\x6e\x76\xba\x5d\x50\x04\x54\xe0\x6f\x28\x1b\xd7\xea\x57\x23\x88\x40\x44\x89\x74\xf6\xdb\x1b\xe4\x93\xd0\x63\x11\x48\x9f\xda\x0d\x77\xf7\x67\x73\x94\x8b\xcb\xbc\xad\x05\x6e\x7f\x28\x24\x2a\x50\x3d\xc6\xab\x2f\x17\x6a\x7f\x9d\x08\xc2\x42\x44\x93\x3f\xc1\xc7\x48\x48\xd7\x75\x80\xc0\x50\xe6\x2f\x57\x6b\x9f\xd1\x3f\xda\x3f\x1b\x30\xdc\x01\xd0\x94\x69\xb6\xd8\x67\x3d\x6d\x45\x09\xea\x47\xcc\x77\x35\xdb\x9f\x96\xba\x67\x04\xa9\x12\x94\xb1\xc4\x10\x29\x55\xf2\x0c\x0f\x45\x55\xdf\xa6\x87\xd7\x7e\xee\x62\x38\x28\x54\x79\x98\x27\x9d\xa5\xe5\x64\x80\xe1\x7a\x4f\x10\x8c\x33\x11\xf4\xce\x92\x6f\x65\xe0\xa5\x60\x22\xa4\x86\x7e\xf8\xdf\xe7\xaa\x46\x72\xf1\x1b\xa8\x3f\x00\x72\x04\xbf\xcc\x72\xf5\x54\x94\x47\x9e\x4d\xd4\x80\x09\x26\x75\x08\xc6\xb0\xdd\x6f\x57\x77\x4f\xfb\xf5\x66\x79\xbb\x72\xa0\x74\x11\x73\xa3\x60\x56\x25\x36\x88\x61\xff\x9e\xf8\xca\x10\xd4\x66\x45\x5d\xed\x33\xd0\xed\x4c\x49\x22\xe1\xd0\x23\x96\x5f\x6d\x38\x1c\x89\x34\x50\x30\xb3\x47\x6c\xa1\x2f\xd6\xe3\xba\x28\x1e\xbb\x12\x2d\x83\xb5\xf9\xc2\xbd\x44\x86\x6d\x82\x84\x3a\x68\xae\xc0\x5b\x8f\x54\x4a\x22\x15\x4f\xc7\x9d\xf2\x71\x4d\x63\x29\x05\x07\x2f\xf2\x07\x22\xe9\x53\x20\x31\x21\x98\x43\x6f\x98\x0f\x62\xc2\xfb\x4f\x2d\xe0\x49\x08\x1e\xba\xf2\xc8\x7d\x51\x2a\x28\xf7\xa2\x28\xde\xf6\x99\x89\x6a\x0f\x3e\xae\xd0\x3e\xc2\x93\x4e\x8d\x81\xb0\xbb\x9c\x60\xff\xc4\xeb\xf4\xbd\x7d\x6a\x19\x18\xd9\xac\x11\xf1\xce\xf0\x81\x24\x01\x24\x16\xbd\xc6\xa7\x08\xc9\x12\x4c\x28\x62\xbd\xd6\x4d\x3a\x5c\xc7\x52\x06\x38\xfa\xfb\x7d\x09\xcd\x17\xda\xbb\x06\x15\x52\xa4\x07\xdb\x9f\xf3\x13\x97\x6f\xcb\xcf\xd3\x44\x55\x89\x50\xd4\xc4\xe5\xd3\x6a\x5d\xa6\xef\xed\xb5\x09\xc4\x26\x03\x94\x56\xf5\x9c\x4f\x7c\x51\xf0\x34\x42\x57\xb9\x52\xcf\x27\xc8\x67\x06\x74\x35\x09\xd8\x9d\xf0\xa4\x04\x24\x80\x06\xda\x62\xf6\xf4\xa3\x99\xa4\x5d\xba\x55\xe8\x40\x20\x81\xc2\x9c\x9f\x6e\x33\xf8\xb4\xe1\xd6\x76\x53\xd0\x22\xe6\x74\xcc\xd8\xf1\x85\x13\x25\xbd\x28\x41\x80\xf2\xfd\xed\xee\x0a\x2f\xea\xba\xc4\x0a\xc1\xc7\x27\x44\x28\x59\x00\x89\x6b\x93\x21\x9a\x87\xb2\x15\xa1\xaa\xda\x26\x60\x48\x11\x63\x70\x65\xd6\xd5\xbe\x2d\xca\x2b\xe6\x9c\x6e\x65\x4a\x3f\xf4\x30\x50\x63\xf4\x63\x71\x97\xf8\x7f\xc1\x7f\xb7\xb5\xd7\xa4\x73\xb2\xa3\x8e\x00\x86\xfd\xb7\xbb\x5a\x32\xe2\x88\x1a\x65\x7d\xe6\x19\x2e\x91\x67\x3d\xe7\xa5\x7a\xce\x6f\xce\x97\xd9\x79\xa2\xc6\x49\xfa\x10\xc4\xaa\xad\xe4\x30\x92\x2d\x1b\xcb\xbd\xe5\xc0\x62\x23\x1e\x4f\x29\x7d\x1d\x3b\xd5\x50\xf7\x42\x58\x57\x69\x9b\x03\x0d\x0e\x3e\xb1\x81\xaa\x38\x97\x12\x2a\x5b\x9c\x36\x79\x8c\xc8\x90\xaa\x24\xc1\x60\x6a\x55\x17\xe5\x65\xe5\x66\xaf\x0c\xb9\xb1\x2f\x20\x57\xb3\xee\x8f\x82\xc4\xd0\x4b\x82\xfe\x28\x8b\x8f\x2f\x3f\x71\x28\x40\x98\x6a\x33\x09\xa7\x7a\x66\x58\x4c\xdc\x9d\x48\x1c\x63\xbc\x66\xdb\x6c\x6a\xed\x1f\x13\x12\x18\x3c\x3d\x56\x7d\x7d\x59\x72\x28\x09\x50\x34\x6f\xb3\xe2\x03\xaa\x7a\x56\xbd\xf5\x83\x88\x92\x80\xf6\x49\xcf\x8a\x79\xe0\xd7\xfe\xd8\xe8\x86\x34\x4e\x90\x16\x01\x61\x88\x98\xdd\x2b\x97\xc7\x53\x56\xe0\xa9\xd4\xce\x9c\x09\x96\x48\x29\x99\x25\xbc\x7a\x2c\xca\xe6\x0b\xa6\xe7\x63\x27\x8d\x35\x3a\xa5\xfa\xec\x41\xf6\xea\x04\x88\x2d\x8d\x34\x07\x74\x0f\x20\x3a\xfa\x52\x9c\x27\x9a\x5b\x60\xcf\x23\x94\x6f\x59\x7b\xd6\x7f\xc1\x86\x23\xa5\xa4\x1c\xe9\x20\x16\xdb\xf5\x9a\x97\xfc\xd8\x58\x65\x95\xe3\x67\x1f\xde\x5d\x46\x80\x9a\x20\x69\xfe\xbe\x97\xc3\x9c\xac\x94\x10\x53\x13\x7e\xba\xc9\xb8\x7c\xcb\x9a\x07\x55\x57\xba\x10\x52\x2a\x2f\xc1\x5c\x29\x06\x61\xc2\x60\x6f\x22\xb5\x2e\xf3\xe3\x7b\x1e\x0a\x3a\xb4\x5f\x5b\x85\x3a\xb2\x73\x75\x36\x1b\xad\x0d\x90\x3e\xc6\x80\x1a\xa7\x0b\x8d\xbd\x6d\xce\x4f\xd5\x6b\x51\x8f\xfb\x69\x89\x20\xd2\xa3\x49\xec\x3d\xf2\x37\x28\xd7\x65\x51\x17\xb2\xc8\x6e\xdb\xd3\x49\x6a\x4f\xe1\x5e\xba\x6f\x7e\xcb\x2c\xc6\x67\xf1\xef\xef\x13\xb8\x52\x2b\x42\x79\x77\x7a\x9e\xc5\xf5\x2b\x2b\x2f\x30\xb4\x22\x07\xc8\x3d\x7b\xa8\xa1\x4d\xf0\x87\x6b\x8f\x80\x44\x6d\x3a\xbb\x4d\xc6\xa9\xc0\x8b\x05\xeb\xc9\xb7\x60\xee\xa2\x83\x37\xaa\xd0\xd3\x98\x06\x37\xdc\x92\x69\x7e\x58\x74\xd2\x43\x03\x8e\x30\xa9\xc2\xc0\xb8\x18\x18\x64\x6e\xff\x98\xb0\xc4\x46\x7b\x0c\x1f\xb8\xe1\x25\x9d\x50\x61\x19\xbe\x0f\x21\x41\x14\xb4\xdb\xcb\xbb\x01\xc0\x6e\xf8\x35\x7e\x6a\x7a\xcc\x14\xa1\x14\x6d\xd7\xbd\xf1\xe1\x2c\x41\xe7\x88\xbb\x48\x2a\x92\x68\xc4\x37\xef\x71\x73\x6e\x77\x05\x45\x3d\x1a\x45\x1d\xde\x13\x23\x53\xdd\x36\xad\x18\x91\x38\x63\x5c\x50\xca\xd4\xa1\x7f\x13\x17\x54\x8c\x47\x4e\x4c\x6c\x0b\x75\x8d\x10\x95\xe1\x13\x47\xa1\x09\x48\xb8\x2d\xed\xa6\x03\xbc\xbb\x1e\x32\x70\x48\xde\x19\x96\x61\x3c\x42\x3d\xa6\xf9\xb1\x5d\xe3\x08\x20\x31\xde\x29\x94\x35\x77\xe8\x34\x95\x08\x0f\x69\xa9\x1a\xb7\xee\x9e\x57\xf7\xf8\xd2\x0f\xa9\x84\x2b\xdc\xbd\xe2\x91\xcf\x59\x27\x40\x6e\x98\x75\xfb\xc1\x35\x25\x38\xb0\xd0\x11\xc4\x1b\xda\xb8\x55\x5e\x17\x3b\x7e\xa8\x4c\x99\xdc\xf0\x86\xd2\xd6\x5c\x96\x70\xca\x2e\x8d\xcd\xc6\xd5\xb7\x43\x26\x95\x46\x7e\x91\x0d\xb4\xf1\xae\x2b\x8c\xf3\xdf\xad\xff\x1a\xcd\x2e\xe5\xd1\xd0\xd2\xd3\x20\xef\xf6\xb9\x03\x8a\xf5\xc3\x34\x4a\xc5\xc4\xb7\x30\x08\x4c\xf8\xe3\xee\xae\x8b\x72\xc1\x4f\x8e\x06\x47\x29\xe9\x2b\x70\xa8\x67\x8c\xff\xe1\xa3\xde\x17\x59\xb3\x8e\x8c\xdc\x87\xd1\xe5\x18\xef\x75\x0a\x02\x1e\x81\x23\x29\xfb\x32\xf6\xa3\x00\x18\x82\x8f\xc5\xf9\xb2\x3d\x71\x09\xc8\x23\x7d\xee\x28\xe1\xa5\x02\x1d\x63\x76\x57\x81\xa8\x97\xf9\xa1\x55\x74\x95\x4a\x33\x85\x0e\x21\x1e\x05\x19\xaf\xa1\xc5\x72\x2a\x1d\x73\x4c\x59\x23\x8a\x74\x5e\x1c\x8f\xee\x74\x8a\xa7\xb3\xa6\xe0\xf9\x0a\x91\x47\x8d\x9d\xb3\xbd\x54\xf5\x17\x0c\x91\x12\x7c\xe1\xe3\x1e\xfe\x58\x28\x28\x4d\x7d\xe0\x3a\x6b\x01\x15\xe0\x2b\x81\xf6\xd4\xf6\xb5\xf8\x78\x82\xcf\x7a\x9e\xa5\xfa\x0b\xef\x0c\x7c\x08\x40\x74\x72\xa0\xca\xd0\xea\x0c\x70\xf3\x10\x90\x10\xbd\x8f\x4c\x94\x83\xe8\x2d\x04\xcc\x4f\x7a\x62\x1e\xd7\xa9\x35\x08\x54\x8c\x53\x78\xdf\x1c\x66\x48\x46\x52\x9c\xeb\x2b\xad\x39\x09\x61\x48\x0d\xf3\x29\xc6\xe8\x3e\x5a\x2c\x3e\x84\xc4\xd4\x42\x56\x50\xdf\x02\x4c\x32\xd9\x00\xf5\x08\xae\x6c\xe3\x92\x34\x77\xff\x12\xf2\xe6\xae\x08\x8c\xa5\xdf\xc1\x33\x10\x3f\xd4\xbe\x31\x65\x06\x6f\x68\xa0\xe0\x96\x9f\xe1\xca\xae\xfc\x1d\x24\xa4\xdb\xd0\x80\x8a\x98\xf6\xf9\x1d\x6f\xce\xd3\xca\x3f\x12\xa8\x4e\xd0\xca\x58\xac\xfe\x1a\x8c\x35\x23\x06\x03\x8c\x55\x34\xb3\x12\x5a\x1d\x87\xb6\x03\x8d\x02\x83\x08\x9d\xb7\x7f\x8a\x94\x55\x0b\x48\xeb\x87\x82\x77\xf7\x02\x22\x6d\xb0\x6a\xc1\x6b\xbe\xf7\x5d\x43\x24\x13\x44\x69\xb8\xc7\x0c\xbe\x78\xc8\x48\x31\xbc\xf1\x7c\x76\xeb\x8f\xbe\x78\x4c\x22\x74\x62\x4d\xde\xb8\xbe\xe6\xab\xf9\xbe\x84\x14\x62\x9a\x50\x7b\x32\x2c\xeb\x57\x1b\x0b\x1f\xa3\x91\x20\x06\x3f\x71\x74\xeb\x7b\xa4\xf1\x77\xaf\x90\x78\x3e\xc2\x28\x1b\x83\x62\x9a\x15\x04\xb8\xf4\x30\x07\x79\xad\x81\x34\x3d\x5b\xb8\x0a\x90\x4d\x41\xa5\x15\x26\x51\x15\xee\xbe\xbb\xc2\x1e\x7a\xa3\x08\x39\xc8\x90\x87\x76\x74\x6f\x5e\xb6\xd3\xe6\x3d\xa8\x50\x91\x56\x2c\x70\x56\x8a\x60\xf4\x8c\x8a\x1a\x74\xdb\xe9\xfd\xb4\xe6\xe7\x96\xcf\x5d\x02\xc4\x80\x5e\x4f\x75\x16\xe6\xc8\x38\x15\x79\x55\x94\xbf\x61\x4d\x97\x00\x89\x9f\x0c\x05\xc1\x31\x09\xd5\xb6\x1a\xa2\x0d\xa4\xed\xb8\x81\x2f\xf1\x52\x43\xcc\xd2\x38\xb8\x64\x6f\xa6\x99\x47\x22\x87\xb5\x78\xbf\x37\x0e\xc7\x68\x90\x34\x4b\x98\x65\xb6\x7b\xe0\x67\xac\xb8\x9c\x76\x5d\x47\xb7\x96\xc6\x0c\x14\xe7\x32\x87\x81\x17\x0e\x5a\x25\x78\xf4\x36\x93\xfd\xcb\xca\xc4\xbf\x9b\x32\xfa\xea\xbc\x33\xbf\xa5\x3d\xad\x31\x08\x82\x94\xab\x8b\xf4\xbd\xf1\x4d\xda\x6c\x97\xf6\x03\x81\xab\xe8\x9c\x5b\xa6\x80\xf6\xef\x5a\xc7\xad\x0b\x50\x5e\x6c\x00\x73\x0b\x65\xca\xb3\x01\x11\x8f\xf6\x89\xaf\x55\x6b\x92\x1a\xb9\x01\x94\x4b\x9b\x0e\x9a\xea\x40\x24\xd0\x15\x58\xfc\x2c\xfa\xfb\xd5\x24\xd2\x45\x07\xda\x78\xcf\xeb\x34\xe7\x6f\x7d\x86\xaa\x2f\x00\x88\xfd\x88\x5a\x6f\x67\xd3\x61\x44\x92\xd0\x08\x26\x22\x26\xef\xe9\xf9\x87\x7b\x09\x22\x0d\x25\x82\xd9\x0a\x26\x38\x40\x46\x2f\x41\x03\x1d\x4a\x57\xbb\x06\xef\x88\x55\xb0\x2a\x33\x83\xc9\xa3\xa9\x32\xbc\xed\x79\x51\xa7\xda\x1e\x56\xad\xdd\x3b\x39\xfd\x35\x55\x5c\x98\xad\xd0\xe2\xdc\x46\xb7\x64\x41\x8c\x99\xb4\xe5\x6a\x1d\x78\x37\x97\x1a\x30\xc6\xea\x1a\x05\x47\x7c\xd9\x0d\xaf\x52\xb9\x3d\x95\x2d\xdb\x7e\xd3\x04\x96\x55\xa9\x79\xc7\x9b\xf4\x4b\x7d\xc9\xdf\xcd\x40\x7b\xbf\x48\x18\x6d\xb0\x36\xb0\xbe\xe8\x90\x31\x3a\x02\x0f\xd3\xa8\x3f\x1f\xfa\x38\x45\x1d\x13\x66\x49\xb0\x8c\x6b\xf9\xc8\xf3\x6b\xfa\xe0\xde\x27\x4b\x3c\x8d\x85\x15\x5c\xa9\x55\x63\x64\x0c\xbf\x42\x92\xc8\x30\x74\x78\x4d\xcb\x69\x9e\x1f\x6e\xcb\xe2\xf8\x00\x07\xee\x54\x6c\xa5\xe6\xbe\x8f\xfd\x6e\xf8\xe7\xa1\xa3\x43\xd2\xc2\x07\x5c\xd8\x3b\xe0\xc7\xae\x78\x51\x0b\x66\xa8\x30\x4d\x4c\xf0\x98\x9e\x8f\x7f\x0c\xde\x5b\xc8\x88\xd3\x36\x4a\x7c\x03\xf5\x84\xf4\xa2\xd4\xe0\xc7\xd2\x73\x95\xdc\x98\x32\xb3\x85\xfe\x06\x2e\xfa\x2b\xad\x5f\x07\x19\xe2\xf6\xb2\x04\x0d\xab\xd9\xbe\x59\x90\x7b\xec\xbc\x9f\xed\x17\xbc\x7d\x19\x88\x38\x1e\x9e\x37\x3c\x7f\x7b\xe5\xaa\x3f\xba\x3a\x0c\x65\xd4\x71\x8e\xa2\x7e\x48\xeb\x63\x7f\x6b\x67\x28\xcf\x8b\xb8\x6c\x23\xa1\xc5\xa9\xa8\x78\xb6\x98\x52\x75\x50\x9e\x17\xfb\x18\x85\xe1\xad\x12\x6e\xf3\x49\xa0\xea\xc2\xea\x6d\x47\x43\xbc\x7b\x80\x7a\x9b\xe6\xcd\x3e\x62\xa7\x87\xf2\xfc\xc4\x90\x9c\xa5\x95\x2d\xa9\x45\x65\x5f\xe5\x9a\x03\x61\xc8\xcb\x0e\x50\x3f\x67\xaa\xa5\x5f\x57\x5e\xa0\x04\xfa\x82\x06\xdb\xb9\x79\xb9\x71\x0d\x21\x13\x08\x80\xd5\x48\x03\x89\xc9\xd7\x35\xea\x23\x0c\x9f\x3d\x8c\x7d\x8c\xd1\x99\xe5\x38\x0d\x6f\xbd\xfa\xef\xa4\xa1\xd4\xdc\xcb\x9c\x7b\x56\xc9\xbc\x2c\x8e\x45\x33\x5a\x3c\xdb\x40\x0e\x1f\xbd\x70\xfb\xe8\x11\x64\x88\x16\xf1\x43\x71\xa8\x82\xff\x13\x3e\x40\x79\x21\x30\x34\xfa\xee\x00\x75\x06\x31\xa9\xd3\x98\x47\xc1\xe8\x0b\x84\x9a\x22\x21\x51\x0e\x1f\x77\x2d\x80\x5c\x79\x24\x61\x18\xe8\xd2\x20\x5f\x67\x59\x36\xe7\xb9\x42\x19\xe0\xea\xc6\x48\xcb\x8f\x06\x8d\xa8\x20\x4c\xfa\xc9\x9f\x34\xaf\xad\x41\xb1\x81\x6a\x82\xa5\x7e\x6a\xe3\x57\x1e\xf5\xa5\x0e\x7b\x80\xc5\x6a\x26\x0d\x05\xde\xe8\xa1\x69\xc0\xb1\x8c\xb2\x55\x8c\x6c\x55\x8c\xa7\xc4\xe7\x47\x23\xc3\x3c\x8a\xc4\x4e\x27\x28\xeb\x73\x29\x06\x39\x22\xe5\x31\x2a\x93\xd0\xc1\x55\x2f\xed\xde\xa8\xbc\x88\x02\xfa\x55\x5f\xd2\xc5\xb6\x7b\x53\x5b\x5a\xa6\xbc\x38\x8a\x7c\x1b\xf4\x6f\x2b\x30\x3a\xb5\xb2\xe1\x4b\xc5\x91\x36\x86\x06\x3f\x8a\x0c\x4a\x78\x87\x2f\x0a\x2a\x94\x97\xf8\xc6\x15\x3c\x5d\x27\x7c\xc6\x3d\x09\xc5\x7d\x8d\xe7\x79\x71\xce\x25\xfc\x4c\x25\xda\x2f\x3d\xdf\x59\x79\x49\xec\x23\x29\xd8\x23\x2a\x68\x3f\xa6\x39\x0c\x36\xda\x29\xac\xb5\xf2\x12\x4d\xd1\x6a\x5e\xfe\xcf\x39\x2d\xbe\x42\x31\x7c\x97\x50\x57\x1e\xa7\x80\x5f\x42\xa7\x87\xd7\xfa\xd7\xaa\x7e\x7d\x2c\xc4\x17\x4b\x42\x10\x19\xf7\x47\xbf\xf9\xd5\x0e\xd6\xdd\x5f\x73\x82\x28\x5b\x11\x67\x4b\x31\x7a\x3a\xfa\xca\x13\x32\x31\x2a\x23\x29\x94\xfb\xde\xf9\x7d\xbd\x8c\x27\xff\xea\xee\xa2\x22\x0c\x5e\x9d\x5a\x05\x34\x33\x5d\x9d\xe4\x4a\xfb\x73\x52\x1b\xee\xc5\x2d\x40\xd6\xae\x2d\x60\x1c\xcb\x25\x6e\xd2\xba\x2c\x8a\xba\xdb\x9e\x9b\x26\x61\xf5\x66\xea\xc6\xd7\x75\x8a\xbc\xbb\xdd\xa3\x01\xf0\x2a\xbf\x0f\x98\x50\x1e\x44\xd4\xb1\xa0\x3f\x5e\x3a\xd8\xb4\xf2\x40\x24\x22\x69\x63\xd2\x4e\xf1\x1e\x63\xee\xc3\xf9\xae\xbd\x00\xeb\x4c\xf7\x26\xab\x6d\xe4\x89\x47\x5d\x22\xea\xaa\x4c\xf1\xe0\x4c\xab\x7a\x3f\x51\x11\xa5\x7c\xdf\x8b\x5b\x61\xbe\xaa\x32\xee\xd8\x1f\xa3\x2e\x81\x42\x11\x55\x7e\xae\x5f\x21\xaf\x53\x69\x0c\x3c\x28\x07\x33\xd2\xf7\xa9\x29\x6e\x2f\xf9\xc7\x16\x72\x65\xb8\x9b\x06\x4f\xe5\xfb\x91\x41\xb7\x2f\xee\x66\x8f\xcb\x9e\x73\xa9\x7c\x5f\x7b\x28\x09\x56\x94\x5c\x66\xd0\x95\xc5\x28\x3f\x20\xdc\x0b\x5c\x9e\x01\x23\x7d\xee\x64\xfa\x96\xf8\x46\xf9\x41\xcc\x10\x69\xd7\x16\xe2\xae\xd4\x7e\xb9\x99\x47\x81\x8f\x7a\x90\x55\xfb\x03\xb1\x0a\xda\xf0\x0e\x92\x6d\x6e\xd3\xc3\xb5\x35\x3a\x7c\x93\x40\x30\x44\x4e\x19\xfd\xf0\xa2\xc8\xaa\x45\x91\xb7\xcf\x1c\x32\x63\x99\x6c\xd3\xe3\x29\x83\xd9\xee\xb1\x6d\xe0\x01\xe2\xb0\x5f\xd3\xc3\xab\xad\x25\xbe\x22\xc2\x52\x3e\xa1\x1e\x72\x7d\x6d\xcf\x6f\xe9\x85\xbf\xa5\xed\xdf\x65\xac\xec\x4c\xdb\xd6\xcd\x04\x1e\x87\x31\x94\x4f\x3d\x8a\x34\x70\x38\x05\x55\xf1\x91\xa3\xf6\x48\x9b\xc8\x55\x3e\x25\x3e\x56\xe3\x67\x69\x55\x63\x90\xeb\xcb\x04\x9d\xf2\x23\xdf\x4a\xcb\xf0\xcc\x51\x77\x8c\xad\x01\x3f\x26\x81\x13\xca\x5e\xf3\x0b\xb4\x14\x1f\xd7\x4a\x4e\xca\x8f\xb9\x9f\x18\xd1\x36\x55\xcc\x2a\x68\x9f\x29\xa1\x86\x33\x81\x2b\x65\xe0\x99\x57\xc7\xf3\x84\x07\xab\xfc\x44\x46\x18\xc2\x5d\x8e\x29\x6e\xff\x57\xa7\xae\x9f\x40\x90\x0c\x35\x48\x0d\xbf\xac\x33\x60\xaf\xc9\x08\x9b\x6b\x68\x62\xd1\x5d\xcb\x4a\x96\xc5\xc7\x55\xbb\x6c\x83\xe2\x15\x94\x0e\x85\x3b\x9c\x43\x9c\x81\x91\xf0\x33\x75\x8d\xbb\x62\xa2\xa4\x51\xf9\x22\x60\x68\xce\xea\x54\xf4\x4a\x0b\x7b\x8e\xa7\xf2\x85\x0a\x9d\x04\xb2\x29\x1d\xb6\x51\xdc\xef\x82\x0a\xca\x97\x3c\x71\x01\xeb\x9e\x1c\xf4\xc8\xd6\xf0\x95\x47\x31\x94\x27\x31\x46\x5f\xef\x8a\xc7\x34\x4f\x5f\x56\xa3\xf7\x55\x91\xb6\x22\x06\x75\x9d\xa1\x77\xd3\xa6\x44\x94\x0f\x49\xc4\x7d\x0b\xde\x1c\x00\xd3\x5c\x3b\x67\x98\xd9\x38\xee\xeb\xfe\x96\xa0\x3d\x86\x3c\xd8\xcb\xfa\xb5\x31\x8a\x37\x8e\xea\xd7\x77\x3f\xaa\x29\xf3\x1d\x26\xe1\x54\xc2\xfe\xed\x22\xf7\xa9\x2c\xf2\xf4\x7f\xf6\xc8\x82\xb0\x57\x90\x17\xc7\x34\xc7\x6c\xc8\xe0\x79\x03\x2f\x60\xc8\xca\xd7\xaf\x8e\x42\x74\x8e\x7b\xa8\xc0\x23\x04\x5d\x94\xd9\x59\xd6\xe7\x6a\x5b\xc3\xe9\x6f\x4a\x39\xdb\xeb\x7d\x5f\x46\x96\xec\xfd\xd5\xdd\xd3\x97\x80\xf3\x7c\xdf\x98\x5a\xd3\x66\x42\x10\xf8\xbe\x62\xed\x1a\xaf\xcf\x83\x32\x25\x15\x04\x90\x18\x20\x65\x06\xbc\x9c\x59\x04\xae\x9a\xe5\x6a\xcb\x33\x5e\x5e\x46\x89\xf0\xc1\xa7\x0c\x02\x4d\x5a\x61\xaf\x83\x29\x93\x93\xbf\xab\x4c\x53\x41\xe8\x29\x9c\x26\x1f\xa0\xba\xb4\x91\x0a\x42\x96\xb8\x03\x06\x59\xc2\x4c\xfa\x68\xf8\x65\x03\xe2\x05\xf8\x32\x69\xee\x78\x3f\xda\x06\xe1\x80\x47\x0f\x8e\xe4\xa8\x4b\xbf\xa8\x80\x04\xa6\x68\x34\x2b\xf2\xc3\xfe\xc4\x4b\x27\x1a\xd6\xb4\x70\xa7\x9b\x7a\xc3\xab\xa1\x90\x62\xdf\x8c\x0b\x08\x8f\xb9\xdf\xd2\x01\x7e\xcd\x42\xab\x02\x22\x15\x32\x01\x15\xf9\xf2\x13\xe4\xb9\x86\x47\xa8\xb0\x80\x6c\xba\x3b\x55\x91\x6c\x11\xc7\xd5\xae\x68\x2b\x08\xfe\xae\xdf\x6d\xf5\x73\x7a\xcf\xca\xc2\x00\xf1\xc5\xf3\xe7\xe7\x87\xc5\xf3\xaf\xa7\x1e\x05\xad\x0a\x18\x11\xdc\xec\x8e\xf0\x79\xa5\x8d\xa8\x02\x16\x1b\x0f\xcf\xa2\xbf\xe6\x45\xeb\x8e\x05\x11\x48\x4c\x35\x9f\x1a\xfb\xc6\x37\xc1\xc6\xd6\x51\x56\x41\x1c\x31\xdc\x8e\x6b\xa8\xea\x5d\x79\xb9\xc3\x04\x5e\xbb\x2b\x07\x49\x0c\x98\x18\x14\x48\x88\x67\x87\xe6\x8b\x31\x49\x84\xa9\x5a\xc2\xe8\xdd\xcf\xe2\xd3\x72\xa8\x5e\x3b\x5d\xb1\xbb\x40\x9b\x92\x4b\x93\x22\x7e\xd9\x2e\xea\xc2\x5f\xee\xee\x47\xcb\x94\x7b\xda\x72\xed\x21\x70\xfd\x01\xd3\xc1\x88\x60\x41\x18\xc3\x17\x0f\xc3\x49\x84\x76\x94\x4e\x73\xd5\x63\x9e\x1d\x6e\x6c\x01\x07\x11\xf3\x2e\xef\x30\x90\x52\x19\xde\x4f\x24\x52\x7a\xce\x02\x31\xbe\x4d\xab\x6a\x38\xee\x2b\x93\x10\xb9\x84\xdf\x0d\xcc\x02\x76\x97\x13\xa0\xb6\x32\xe6\xdf\xae\x4d\xdf\x40\x31\xe6\x9b\x7a\xaf\xdc\xa4\x73\x87\xf7\x53\x56\xf4\xc3\xd9\xd0\xbb\x57\x30\x59\xd6\x7e\x82\x44\x05\x4a\xcb\x10\xe9\x66\x8b\x73\xf9\x7f\x4e\xa1\xd9\x7b\x69\x12\x20\x85\xa2\xd5\xa6\xe2\x83\x4d\xaf\x7b\xf2\xd0\x4b\x0c\x1b\xf7\x4d\x5a\x4b\x38\xbb\x6d\x3b\xf4\x69\x24\x7a\x35\x2d\xbd\xa3\x65\xf8\x6a\x61\xe0\x81\x8e\x1d\x62\x6a\x5b\x17\x25\x3f\xc0\x7e\xb5\xbe\xdd\xba\x3b\x05\x8c\x39\xf4\xd5\x83\x29\x5f\x78\x16\xff\x5e\x7d\xf1\xd5\xc3\x00\x22\xd1\x27\xb9\xfc\x63\xd2\x70\x0b\x89\x0c\x20\x74\xc1\x14\x9b\xf1\x9e\xe5\x6a\xf3\xb4\x19\xce\x8f\x90\x68\x93\x10\x52\x3c\xcd\x2e\x18\xe8\x1e\x7d\xeb\x90\x86\x21\x26\x4a\x1c\x5f\x02\x0a\x98\x19\x81\xe5\x16\xeb\xdb\x1b\x2f\xaa\x19\x65\xce\x34\xdb\xcb\x73\x55\x17\x47\x28\x5d\x09\x89\xfb\x94\x21\x0b\x23\xdc\x8d\x9a\x61\x2d\xd2\xfc\xcf\xf9\x88\x81\x13\x7b\x04\xde\x20\x90\x8e\x21\xa7\x5b\xde\xd5\xe0\xaa\x90\xc5\x1a\xd1\x76\x5c\xd7\x50\xf6\xdd\xa9\x90\x81\x91\xd0\xc0\x8a\x80\x2f\x0a\xcc\x6d\xd7\xc8\x72\xac\xe2\x60\xe5\xfc\x00\x7d\x8c\x8a\xdb\x87\xae\x24\xc7\x54\x18\x7b\x01\x72\x83\x20\x30\x0c\x5d\xfc\xaf\x20\x92\x53\x56\x9e\x7b\x16\xf3\x67\x8b\x5f\x51\x61\xcc\x23\x0c\x12\x99\x79\xd9\xd6\x10\x18\x81\xba\x35\x6a\x8b\x0c\x9f\x3e\x21\x3a\xb1\xdc\x33\x86\x22\x2f\x2f\x14\x8c\xbe\x72\x12\x1b\x09\xf4\x2d\x02\x98\x1c\x60\xe5\xeb\x7a\x65\x15\x8a\x40\x21\xa5\xce\x9a\x5f\xfe\xdc\x15\xcd\x96\x74\x5d\x20\xe5\xba\x6a\xa3\xb1\xec\x16\xef\xf6\x5c\x9e\xca\xb4\x82\x75\x81\x56\xe1\xe4\xfa\x9c\x4e\x69\xa8\x50\x92\x40\x05\x8e\x5d\xf8\xa6\x2c\x2a\x04\xa0\xb8\x6f\x2a\x69\x82\x10\xd7\x63\xaa\x94\xf1\x0b\x7a\x42\x2e\x2a\x94\x4c\x61\x6c\xd3\x18\x8f\x0f\x67\x75\x3e\x7e\x03\x99\x53\xa1\x0a\x02\x74\x51\xe7\x69\x9d\xfe\x07\xf2\xe7\xfc\xaa\x98\x79\x7c\x01\xa3\xc8\x6a\x72\xb8\x72\x66\x42\x25\x8d\x16\x48\x05\xf5\x6e\xf3\xe8\xe3\x54\x35\xf2\x34\xfd\xc5\x01\xd0\xb2\xdf\xac\x79\x8d\x85\xa2\x5f\x24\xeb\x7e\x2f\x8e\xad\x42\xcd\x83\x04\x3a\x71\x9a\x5d\x71\x57\x64\xad\x6e\xff\x70\x02\x68\xc9\x5d\xbd\x2d\xd6\xaa\x6f\xe0\x54\x8c\xa8\x2e\x14\xf1\x7c\x43\x16\x5d\xa7\x47\x98\x21\x1c\xb7\xcb\x76\x2b\xe2\xd1\xd8\xd1\x3e\x6d\x8a\x0c\xe6\xfc\xc4\x85\x11\x3a\x3d\x0f\x72\xed\x63\x4e\x36\x45\xbc\x58\x90\x41\xf1\x11\x7e\x15\x83\x25\x18\x3e\x27\xf1\xc0\x94\xbf\x3b\xa4\x99\x32\xf1\xa8\xb1\x3f\x46\x3c\x10\x26\x09\xbb\xda\xcd\x9e\xe6\xcf\x4e\x09\x53\x11\x3f\xf0\x30\x82\x91\xe6\xd5\xd5\x96\x42\x7c\x29\x4d\x00\x06\xa3\x49\xb3\x73\xfd\x5a\x94\xe9\x7f\x40\x0d\x61\x9f\xc3\x55\x4e\x02\x16\x23\x61\xce\xea\x69\xb7\x59\xae\x57\x8b\xfd\xcf\xe7\x97\xf9\xfd\x72\xd3\x27\x9c\x51\x24\xe0\x1a\xad\x8c\x9e\xfa\xb5\xab\x23\xb1\x3d\x42\xa6\x22\xb3\x31\xe6\xd5\xf9\x08\x63\xe0\xb8\xdb\x00\x08\x09\x81\xda\xac\xde\x2a\x4f\x7b\x60\x44\x45\x08\x65\x08\x80\xcd\x78\x55\x3f\xf0\xf2\x00\x55\x7d\xff\xbc\x78\x58\x6e\xdc\xfe\x66\xfb\x51\x8f\xe0\x28\x22\x8a\x76\xb9\xbb\x2f\x7b\x4a\xd5\x8a\x50\x9f\x63\x18\xf9\x3f\x07\xa8\x7b\xc5\x76\x8a\xd0\x88\xe3\x1c\x9e\x17\xc7\x13\xe4\x95\x61\x0b\x81\xbc\x5e\x7e\x1d\xef\x23\x34\x91\x88\x41\x7e\x3c\x67\x75\x0a\x9f\x55\x63\x88\xb4\x53\x86\x45\x1e\x02\x1a\x52\x59\xd8\x04\x73\xf7\x14\x51\xa0\x31\x4a\xfe\x89\xd1\xec\x96\x47\x75\x78\xf7\x88\x4a\x84\xde\x3e\x14\x87\x99\x94\x50\x55\x86\xd9\x61\x84\xb8\x9b\x3e\xe1\x49\x14\x13\xcf\x46\x2d\x61\x99\xcb\xf2\x72\x6a\x4c\x1f\xf8\xac\xdb\x47\x10\x04\x6c\xc6\x61\xb6\xda\x2c\x36\xcf\xeb\x6b\xc1\x72\x45\x62\x42\xd0\x74\xd9\xa7\xd5\x64\x9e\x5b\x91\x38\xa2\x8e\xdb\xd6\xcc\xef\x2b\x1b\xb9\xb7\x18\x62\x25\xd1\x74\x2a\xf2\x56\x05\xf9\x7f\x93\xb9\x52\x24\x09\x3d\x4f\xd9\xfc\x6b\x1f\x09\xf2\xbb\xcb\x80\xfa\xd6\x57\x6f\xc1\x37\x2f\xa7\x43\xc9\x95\xf1\x2e\x6e\x2e\x8f\x85\x82\x41\x55\x8a\xb5\x62\x09\x8f\x13\xdc\x67\xb6\x5c\xc3\x16\x41\x4c\x6e\x04\xb9\xf6\x69\xd2\x12\x03\xe1\x5e\xdd\x79\xc4\x44\xfa\xc4\xb3\x01\xeb\x2f\x58\xbe\x5c\xc7\x80\xc6\x56\xf6\x67\x18\x3c\x20\x92\x70\x8f\xf4\x59\x28\x0d\x4d\xe4\x82\x5f\x96\x79\x3b\x95\xa4\x48\x30\x72\xf7\x38\xfb\x73\xbf\x7c\xda\x6d\x56\xcb\x6d\xdb\x04\x31\xa2\xa2\x8f\xfc\x73\x95\xbf\x2f\x5b\x27\x95\x48\xcd\x3c\x93\xe0\x4e\x33\xb5\xd8\xda\x05\xb4\x70\x29\x19\xa2\x42\x1f\x1d\x3f\xa4\x73\x1c\x4a\x26\xba\x1e\x24\x40\x3a\x9a\x3d\x57\xea\xae\xe4\x5a\xa7\x75\xfa\x0d\x0e\x4c\x11\xc5\x23\x5c\xbd\xf3\x22\x4d\xf3\x6b\x62\x61\x45\x14\x28\x6e\xb3\x58\xb3\xb4\x44\x3b\xb9\x83\x53\xb5\x43\x02\x7e\x88\xa1\x0a\x28\x65\xe0\xed\x36\xb7\xbb\x3f\xfa\xdf\x0a\x7c\x10\x86\xff\xa3\x38\xed\x0f\x5d\x80\x91\x68\x8f\x20\x8f\xde\x7a\xfd\xd7\xb7\x4f\xa9\xfd\x00\xc3\xd9\x26\x31\xd4\xba\xad\x0e\x5d\xf0\x6d\xb0\x85\x68\x3f\xc6\x7a\x30\x99\x15\x15\xa0\x34\x6c\x76\xb1\xaa\xb8\xa6\x07\xf5\x04\x60\x1e\x85\x0f\x85\xb0\xa6\x0f\x5c\x1a\x04\x44\x85\x7d\x7d\x79\xf8\xb8\xc2\x8c\x2a\x1a\x06\x41\xe8\x48\xa2\x4c\xf4\xc2\xf2\xe5\xa8\xbf\xc1\xba\xa4\x68\x48\xbc\xa4\x35\xff\x3e\x45\xd1\x0b\xcd\xb5\x3d\x38\xf7\x4c\x1c\x85\x8b\xac\xb1\x9f\xca\x56\xe0\x5b\x51\x92\x00\x22\xbe\xeb\xb6\x36\xbc\x42\x0a\x47\xd5\x76\xe0\x21\xda\x97\xf3\xcd\xf3\xaf\xc5\xfe\xd7\xec\xe7\xd2\xdf\xaf\x97\x9b\xd5\xf3\xc2\xf5\xa0\x5e\x42\x8c\xb3\x7d\x38\x64\xd0\x5c\xdd\xc5\x20\x28\x8d\x68\x8c\x5c\xc0\xcd\xca\xfb\x3a\xa6\x42\x69\x62\xe2\xe5\x32\x4b\x9d\x3c\x9d\xa2\x54\x33\x62\x52\x8b\x9f\xa0\x6e\x01\x56\x79\x5b\x18\xab\x28\x23\x1e\x65\x5d\xfc\x6e\x5d\x36\x96\x66\xf7\x62\x8c\x68\xdf\xce\xc7\x0a\x61\x72\xa7\xeb\xed\x91\x46\x84\xb9\xe2\xf8\xd5\xfc\x79\x55\x0d\xa5\xec\x14\x8d\x78\x8c\x0c\x18\xa7\x12\x56\xb2\x30\xad\x6d\x1b\x28\x9c\x0c\xf7\xcf\xeb\xe5\x77\x93\x92\xc6\x5e\x82\x49\xbc\xfd\xfd\xf3\xc3\x02\xca\x6a\xcd\x2f\x18\x28\x73\xcd\x20\xf0\x68\x7d\xe5\x9d\xee\xc0\x04\xb4\x5c\xd1\x84\x27\x88\x3e\x38\x36\x53\x93\x59\xee\x70\xa3\x8b\xe1\xee\xc5\x13\x41\x7c\xbb\xbd\x5e\x99\xae\xbf\x0b\xbd\x4e\x7f\x18\x21\x13\xa4\x74\xb2\xf1\xd1\xbd\x25\xe1\xae\x46\xd3\x58\xfa\x89\x6f\xcd\x24\x53\xeb\xde\xd7\x77\xb2\x7d\x94\xa0\x78\xb2\x2f\xf8\x01\x32\xee\x0e\x5a\xaa\x24\x0d\x63\x97\x9d\xfc\x07\x97\x6f\xa7\x62\x1a\x84\xa9\xa8\x02\x89\x95\x66\xc7\xe6\xc0\x3e\x65\xf0\xb9\x37\xd8\x97\xd1\x0f\x69\x66\xe4\xb5\x90\xfb\xa2\x79\xea\xb4\x3d\xd6\xa9\x16\x92\xdb\x88\xe4\xe3\xa5\xaa\x87\x09\x12\xaa\x41\x52\xbb\x9c\xba\x98\xb2\x0b\x8e\x0c\x7e\x84\x79\xcc\xc7\xea\xd7\x1b\xa8\x9f\xdf\xa1\xcc\x9c\xf2\xb6\x62\x9e\x60\xb2\x45\x94\x1e\x6d\xe4\xfb\xd7\x75\x11\x94\x62\x1e\x04\xc8\x9b\x73\xbb\xba\xdd\xfd\xb5\xdf\xdd\x3f\xbf\x6c\x67\x4f\x8b\xed\xfe\x61\xf5\xb8\xda\xb5\xb7\x03\xc3\xf5\x7c\x80\xfa\x36\xcd\x30\xc2\xb2\x4d\x1d\x60\x48\x31\x3f\x51\x08\x7e\x7c\x2d\x32\x03\x49\x98\x34\x28\x98\x2f\xcc\x77\x44\x54\xc4\x3b\xcf\xac\x6a\xfc\xe0\xc4\x62\xbe\x02\xac\x39\xb6\xe5\xed\x95\xc9\xe6\xf4\x0c\x41\x16\x78\x7e\xe8\x1c\x5b\x2c\xcb\xed\x62\xdc\x2c\xa4\xd4\x1e\x4b\x97\xe5\xe1\xd0\xfe\x95\x99\xe7\x2b\x41\x6b\x28\x47\x45\xa9\x8a\x85\x3c\xc1\xfd\x6f\xb3\xfc\xb1\x9b\x84\xfc\x28\x46\x84\x44\x9e\x2c\x83\x30\x18\x6e\x30\x8c\x06\xa6\xfe\xcb\x32\xd5\x55\xcd\x7a\x37\xda\x39\x9d\xdd\xc2\x28\xe3\xe8\x97\x3e\xc1\xc7\xba\xe8\x55\x83\x0e\x66\x17\xa3\x22\x40\x36\x9b\x57\x5e\x35\x56\x64\x06\xdd\x36\xc8\x28\x84\x1a\xdc\x3e\xe9\xa4\xe9\xe7\x17\x99\xb5\x33\x8b\x31\x1f\x0c\x32\x29\xb5\xe2\x0f\x5f\xd0\xb4\xb9\xee\xd4\xc7\x10\x18\x02\x13\x97\xf5\xeb\x4a\xdf\xa2\x9c\x9a\xbb\x5d\x1c\x8a\xc4\x70\xcc\x57\x45\xa6\x9c\x88\xd6\xac\x1d\xed\x98\x70\xcc\x5f\x6c\x96\x4f\xcb\xe5\x8f\xcd\xf3\xe3\x97\x99\xf3\x6f\x6d\x2b\x16\xd3\xd8\xac\x29\x94\xe3\xe8\x48\xff\x9c\xbd\xb8\x2e\x61\x71\xf7\xaf\xba\x58\xdc\xfd\x6b\x7a\xef\x66\xb1\x00\x34\x45\x1f\x8a\xc3\xba\xc8\xb2\x05\x98\x91\x1b\x4e\xad\x24\xd0\x06\xb7\x0c\x5c\x3d\xf2\x34\xbb\xb9\x18\xa8\xda\x20\xb2\xe0\xf2\x06\x2c\x89\x12\xb0\x6a\xae\x37\xad\xcb\x3f\xfc\xd5\x24\x8e\x11\x54\xcd\x95\x72\x1e\xc4\xf7\x2f\x9a\xe8\xfe\x4c\x99\x17\x59\x51\x6e\xba\xe1\xe6\x34\x01\xe5\x3c\x97\xf7\x22\x95\x30\x98\xdb\x9c\xea\x48\xd8\x12\x8d\xb4\x84\xa7\xa2\xee\x23\x2e\x15\xe3\x8a\x98\x88\x73\x99\x1e\x0e\x50\xce\xce\x75\x61\xa3\x96\xae\x87\x20\x86\x88\xa5\x38\xd7\xb2\x38\x82\x99\xa3\xdf\x5a\x24\x4c\x48\x23\x25\x75\xe4\x9f\xbb\xb4\x2d\x6a\x53\x4c\xfa\x1a\xc5\x72\x30\x6a\xf2\xf6\xbb\xbb\xc8\x38\xc4\x30\xd3\xea\xe9\xe7\x72\x7e\xff\xdd\x51\xc5\x64\xcc\x88\x8b\x86\x2c\x2c\xa8\xa2\xfd\x51\x1d\x28\xeb\x85\xef\x0d\xe4\x79\xaf\x5b\x73\x99\xa9\x20\x06\xdd\xee\x79\x86\xb2\x33\x1f\x04\x40\x99\x92\x51\x68\x7d\xc3\x9b\x4b\xc6\x3f\x1a\x43\xa3\xd9\x5a\x56\xf9\xee\x15\x6e\xcf\xf5\xb9\x84\xdb\xa2\x7c\x04\x8c\xf7\x39\x9a\x10\x77\x31\x78\xcc\xe1\x92\xcc\x31\x6c\xb8\x8f\x5c\x6b\x18\x61\x4d\x52\x63\xce\xfe\x2c\xce\xf2\xb5\x57\x64\x32\x1a\x0d\x10\xa6\xb4\xa9\x82\x7a\x51\x9c\x1b\x83\xa8\x59\x7f\x5b\x38\x20\x8b\x4a\xc6\xab\xd7\x09\x50\x99\x62\xda\x33\xdc\xdd\x66\xf2\x60\x0a\x74\x72\x47\xd7\x7e\x44\xcc\x36\xeb\xc2\xcb\x6d\x1c\xfa\x8f\x6f\x62\x47\x4c\x87\x11\x86\xac\xce\x15\x94\x1d\x3d\x9d\x6b\x14\x5e\x6c\x23\x2f\x37\x77\x7f\x5a\xce\xb1\x29\xea\x6a\x15\xf9\x1e\xc3\x4c\xc4\xde\x84\xe0\x9a\x59\x36\x5d\xc2\xab\x22\x9f\xfb\x0e\x35\xef\x08\xeb\xbe\xd2\x64\x54\x51\xe0\x05\x46\x64\x3a\x2d\x07\x5e\x54\x14\x04\x3c\x74\x2a\x6a\x69\x7e\xd8\xdb\xc2\x9a\xbd\xe4\xd5\xab\xe0\xf2\x6d\x6f\x72\x13\x7b\xf4\x45\xf6\x1f\x3c\xad\xf7\xea\xdc\x97\x23\x50\x51\xc0\xb9\x0b\x45\xf6\x15\xef\x07\x53\x33\x0a\x99\xe1\x59\xfc\x00\x78\x5b\x17\xf5\xf2\xf3\x94\x0e\xef\x42\x68\xc0\x4d\x79\xdb\xcf\x1e\xf4\x23\x8a\x7c\xa2\x85\xa3\x5d\xce\xb2\xe2\x63\x4a\x6b\xd7\xf5\x8d\x19\xb7\xe0\xae\xbb\x33\x54\x75\x0f\xe3\x10\x45\x32\xc6\x44\x0d\x62\xef\x9c\x4f\x65\x8b\xbd\x1b\xfb\xd3\xcd\xc5\x28\xf6\x00\xf7\x53\xcb\x63\xb0\x37\xd5\x0a\x23\x7b\x29\x8a\x85\x31\x9a\x71\xf7\x7f\x4a\x5f\xd3\xcc\xc1\x20\x55\x14\x83\x26\xcd\x1d\x6e\x7e\xfc\xe8\x3b\x6d\x51\xe2\xb1\xd0\x1b\xca\xe9\xdf\x96\xc5\x7f\x06\x69\xb9\x28\x09\x18\x32\x01\x6c\x96\x8b\xe5\xf2\x71\xff\xb8\xdc\xdd\xb7\xa6\x7a\x94\x48\x1f\xf3\xe8\xfc\x83\x5f\x76\xc0\xdb\x5f\xe4\x3e\x47\x86\x9f\x97\xf9\x50\xff\x72\x62\x8f\x88\x78\xe8\x63\x59\xc4\x91\x7f\x5a\xd0\xcc\x7f\xf5\xb1\x33\x11\x0f\x0d\x43\xbe\x48\xeb\xba\xe4\xef\x90\x7d\x0e\x5e\x82\x27\x12\xc9\x7c\x1e\xb9\x7c\x4d\x73\x18\xb4\x09\xcf\x43\x67\x64\xb6\x5e\xb5\x7f\x0a\x3c\xea\xf7\x90\xc3\xcb\xcf\xf4\x6a\x2c\x05\x24\x48\xd1\x85\x2c\x32\x75\xe7\x61\xb9\xa8\x54\x24\x03\xee\x1b\x76\x0c\x31\x88\x35\x45\x32\x0a\x68\xec\xaa\x6f\x9a\x79\xfd\x58\xe4\x70\x19\x29\xe2\x0f\x57\x8d\xe4\x46\xea\xf6\x1f\xdb\xe7\xa7\x13\xaf\x5f\xf7\x8d\x4f\x33\x35\x5c\xa3\xeb\x14\xe1\xac\xf5\xc9\xf7\x15\x94\xef\xe9\xd5\xe2\x05\x0a\x2e\x4a\x79\x9b\xf1\xc3\x9a\xa7\xe5\x20\x1f\xd5\x0b\xc5\x44\x00\x40\x3a\xac\x2c\x02\x4e\xaf\x1d\x9c\x48\x7b\x1e\xf5\x4c\xe5\x91\x02\xa3\xb1\xa2\xfa\xb3\x45\xfb\x0c\x47\x5c\x97\x80\x88\xfe\xe1\xf3\x68\x1e\x38\x98\x5d\xf3\x03\x88\x3b\x72\x4d\xa0\x23\x23\x6f\x63\x10\xd5\x18\xf3\xee\x6b\x41\x98\x7e\x98\x65\x30\x1c\x20\x19\xc6\x04\x40\x99\x6d\x73\x0a\x6f\xae\x62\x4f\x19\x07\xbb\x82\x7a\xf9\xb4\x30\x30\x52\xdb\xe4\x2b\x66\x44\x4b\x8b\xbb\xb2\x38\x9f\x4c\x8d\xa4\x81\x12\x56\xdb\x33\xc6\xd7\xc6\xdf\x3d\x0e\x3c\x82\x4e\xc9\x1d\x58\x4e\x7d\x77\xb3\x40\xe8\xa8\x2f\x7e\xdd\xcb\x29\xda\x58\x44\x1c\xb2\x20\xf6\x5b\x0a\xa3\xc1\x69\xed\x7a\x00\xc5\xfa\xe4\x35\xe4\x15\x42\x24\xdb\x4d\x27\xa6\x3e\x47\xc2\x54\xd4\x59\x2e\x57\x55\xcb\xe9\xd5\x99\x45\xfd\xe4\x72\x4c\x7d\x19\x79\x7d\x80\xe6\x0d\x6f\x9d\xba\x98\x12\x82\x24\x13\x4b\x75\x36\x81\xc6\xfe\x9a\x89\xa9\xe6\xb2\x9f\x53\x2b\x5b\x9b\x24\x66\xb6\xb2\xcd\x32\x3a\x9d\x6b\xf9\xba\x52\x9f\xcd\xc8\x8f\xde\x24\x12\x02\x8d\x9b\xfb\xd9\x6e\x7e\xbf\x7a\xba\xdb\xcf\x9f\xb7\xce\xfd\x88\x23\x48\x22\x65\x49\x18\x4d\x84\xf0\x59\xe3\x27\x98\x5e\x20\x71\x1c\x78\x26\x65\xdd\x58\xca\x8b\x61\xe6\x2c\x8e\x03\xb0\xce\x00\x6a\x69\xe5\x5d\x00\x37\x8e\x59\x12\xb9\x6a\x9d\xc6\xc6\xbf\x3b\x63\x90\xfb\x8f\xc1\xcd\x13\xc6\x80\xb4\xb1\x86\x4e\xcd\x4f\xc5\x49\x14\x2b\x6b\x0e\xce\x79\x95\xe6\xc5\x98\xa2\x66\x62\x2f\x8b\x93\x48\xe2\xe0\xfd\x58\xcf\xb7\x68\x8e\x1a\xb5\x9f\x36\x45\x17\x27\xb6\xba\x72\xbf\xd7\x69\xae\x36\xa0\xff\x18\x5e\xaf\x3d\xac\xf5\x9f\x29\x35\x65\x35\xc4\x02\x18\x4e\x11\x6e\xc4\xc6\xe1\x21\xcd\x01\xd1\xf4\xb6\x5d\x7a\x32\x92\xdd\xfe\x53\x6f\x6c\xa8\x68\x3e\x26\x97\x50\xb1\x94\x8a\x1a\x96\x1c\x71\x3e\xec\x9b\xb6\x71\x07\xad\x70\xdf\xd5\x19\x3f\x18\x1a\x3e\xdb\xa0\x48\x8c\x86\xa7\x95\x63\xda\xdd\x2f\x5f\x36\xa3\x6b\x35\x21\x01\xb8\xa2\x0a\xb7\x8b\x10\xcf\xb5\x26\x04\x23\x48\x55\xc6\xe5\x1b\x9e\x75\xf3\xd6\xd9\x8d\xb5\xd4\xe8\x9c\xb9\xf9\xb7\x3d\x9f\xa0\xc4\xb1\x44\x07\x1a\xcb\x24\x87\xb3\x4d\x83\x87\x39\xbf\xcd\xf2\x76\xb9\xd9\xcc\x1e\xf6\x37\xcf\x4f\x2f\xdb\xfd\xc3\xf2\xe7\xf2\xc1\x92\xc7\xa8\xc4\x0b\x42\x0c\xdf\x1c\xf8\x11\xee\x52\x5d\x37\x23\xd7\xf3\x43\x13\x3f\x32\xc5\x35\x6e\xc4\x60\x5a\x6f\x5f\x25\x7e\xc2\x89\x21\xe5\xc0\x31\xf9\x0a\x00\xf2\x37\xf2\x7b\x89\xaf\x38\x42\xe7\xc5\xf9\xb2\x4e\x3f\xc1\x84\xcb\x6e\x1d\x70\x89\x0c\xcd\x6f\x32\x7a\x8e\xc0\xf3\x11\xac\x54\x56\xa7\xfe\xfa\x4d\x02\x9f\xeb\x5e\x78\xae\x79\xc7\x5e\x44\x27\x09\x28\xc3\xc8\xf7\x13\x7c\x4c\x6a\x5f\x0d\x17\x5f\x73\xf8\x13\xcb\xd3\x80\x95\x31\x33\xcb\x0b\xff\x04\x9f\x75\x8f\xd6\x53\x25\x81\x10\xcc\x7e\x71\x34\x80\x7f\xc0\xa5\x6a\xdb\x34\x43\xf6\xc0\x03\x56\x8a\x9b\x32\x24\xd7\x16\x46\x14\x51\x64\xdc\xe5\x9f\xae\x6a\x48\xfa\x0b\x24\x09\xe3\x10\xb3\x32\x68\x0c\x1b\xc1\x81\xc6\x12\x1e\x0e\x4d\x28\x25\x7a\x16\xf7\x3c\x2b\xc2\x05\x5a\xe5\xd3\x94\x3e\x2a\x21\x5e\xe2\x5b\x3a\x93\x59\x09\xfc\x8f\xe1\x67\xc3\xff\xf6\xf8\x0f\x46\x09\xc8\x56\xbf\xb9\xfd\xa2\x24\x4a\x02\x13\xee\x69\x77\xcd\x84\x28\xc2\x4d\x3c\xbf\x3c\x0c\xcc\x93\x84\xda\xec\x47\xaf\xec\xc0\xf1\x39\x5d\x9f\xfc\x57\x13\x91\xf9\x01\x82\x06\x36\xcb\xbb\xdd\xe3\xba\x2c\xa4\xbb\x2d\xd3\xcc\x41\xe3\xed\x76\x69\xf7\x12\xdb\x1e\x51\xb3\x01\x2f\x96\xb7\xb3\x97\x87\xdd\x7e\xf6\x32\xdf\xad\x9e\x9f\xf6\x0f\xcb\xa7\xbb\xdd\x7d\xdb\x4b\xf8\x08\xa5\xb5\x41\xe4\xad\x7c\x85\x6e\xb5\xc4\x20\x10\x28\x01\x4e\xca\xf2\x37\x75\x03\xff\x35\x81\xd6\x4a\x38\x31\x55\x4c\x15\xd7\xb0\x2b\x1e\x4d\x08\xee\x4a\x20\xc3\x75\x4e\x3c\xc2\x3a\x4a\x59\x4b\x46\x6e\xa6\xf0\x60\x86\xf0\xc4\x43\xc7\x22\x75\xf1\xd5\x5e\x8c\x23\x91\x2c\x76\xf4\xc5\xcd\xbe\x73\xc3\xeb\x3a\x03\x43\x8f\x33\x1c\x5c\x45\x84\x55\x08\x95\x05\x4e\x79\x64\xc2\x73\xb7\x51\x49\x84\xbc\x57\x87\x33\x2f\x55\xca\xf3\xf0\x67\x51\xb7\x63\x03\x34\xc0\x0d\xe2\xa6\xd3\x7e\x72\x3c\x9d\xc3\x57\xd2\x41\x12\x43\x07\x88\x03\x35\x0e\x33\x25\x9a\x29\x84\xa5\x5b\x06\x7a\xf7\x0b\x3a\x96\x46\x88\xbe\x59\x89\x28\xf4\x60\x6a\x3d\x5c\xb3\x88\xd0\x92\xd3\xc5\xb9\xac\x5f\x71\x95\x3a\xd8\x9f\xeb\x21\x43\xec\xb1\x46\xe2\xd5\x05\x6f\x97\x2a\xf7\x82\x18\xd1\x7b\x58\xc8\xd3\xc6\xac\xbe\xdd\x23\xb8\x17\xc6\x89\x29\x1b\x6c\xcc\x05\x9e\xad\xcb\xe2\x50\x76\xb2\x25\x5f\x4a\x2a\x37\x57\x26\x98\x6c\xc0\x92\x21\x47\x63\x33\xd8\x23\xb9\x07\x1e\x92\x32\xec\x6d\x16\xe5\xba\x8a\x89\xfb\x2c\x62\x01\x4e\x46\x84\xab\xad\x79\x09\x79\xbd\xe0\x05\x9a\xef\xee\xc5\x02\x2f\xe6\xbc\x25\x85\x43\xd5\x83\x16\xcc\x32\x15\xbc\xe3\x81\x6f\xdc\x8e\x5f\x3c\xab\x87\x26\x12\x0f\xa8\xc1\x41\xba\x62\x0d\x0c\x68\x6e\x7b\xe0\x0b\x1e\x12\x0f\x63\x49\x2d\xd9\x89\x85\x9f\x0f\xdf\x2d\x4c\x7c\x4c\x6e\x9f\x8a\x5f\xb5\x1e\x4a\x55\x28\x1e\xca\x90\x1b\xcb\xe6\x1d\xca\xee\xaf\x10\x20\x77\x41\x63\xd4\x58\x31\x2e\x7c\xb4\x61\xce\x9b\x87\x9a\xa1\xbd\xd8\xec\xfc\x43\xec\x20\x27\x9e\x40\xe7\x38\xad\x9c\xc0\xd5\x73\x73\xc6\x9e\x8a\xb2\x9e\xe2\xf0\x51\x9c\xa8\x80\x88\xce\xe6\x48\x8b\x1c\x45\x70\x6d\x2b\x05\x6d\x04\x9c\xcb\xe2\x34\xde\x05\xae\xd8\x83\x15\x67\xa1\xa4\x49\x6b\x42\xe2\xca\x5b\xbb\x54\xe2\x70\xfc\x23\x4e\x30\xba\x33\xcf\xd2\x3c\x95\x9d\x2d\xcc\x23\x45\x71\x60\x72\xf8\xc4\x94\xef\x86\xbf\xc1\x70\x7e\xf3\xd8\x0f\x59\xa7\x47\x88\x15\x70\xb3\x6b\x8e\x24\xc5\xb9\xef\x49\x70\x65\x19\x3d\x6c\x01\xe7\x89\x46\x3b\x4e\x9c\x2f\x77\x70\x6c\xc7\x4e\x30\xe3\xaa\x56\x50\x23\x57\x4d\x6f\xad\x72\x11\x13\x15\x5b\xfe\x83\x1d\x54\xf5\xcb\x94\x74\xb6\xe2\x42\x10\x65\x4b\x90\x7f\x5c\x64\x57\xf0\x61\x58\xce\x47\x43\x2f\x3d\x8a\xa5\x46\x3f\x57\x9b\xbb\xe7\xc1\x14\x94\x89\x47\x62\x77\x6e\x1d\xce\x46\xd6\xcc\x96\xf6\xbe\xf4\x6c\xb9\x69\x18\x3d\x07\x06\x18\x0b\xce\x8b\x67\x6d\xe0\xd9\x16\x55\xbc\x86\x72\x35\x7f\xee\x3b\x4a\x1c\x40\x23\xba\xa4\x10\xff\x06\x59\xef\x8a\xf6\x14\xe0\xda\x33\x82\x5c\x0e\xeb\xb4\x1e\x0b\xc6\x28\xe1\x45\x09\x52\x3c\x2f\x73\x75\x2e\x9b\x19\xda\x7f\x0b\xe1\x07\x5c\x48\xc7\xb3\x85\x50\xb6\x21\x61\xa6\x12\xbe\x0c\x5d\xa1\xcd\x2d\x80\x6a\xdc\x98\x5b\x98\x54\x25\x57\x22\x90\xa6\xd2\xb9\xc8\xd4\x9e\x0f\x26\xbd\x08\x43\x9d\xd8\x80\xd7\x03\xf0\x0a\xe6\xbc\x54\xd3\xf5\x44\xf6\x02\xe2\x13\x13\x0c\xb7\xe6\x60\xa7\x2a\x6d\x8b\x91\xc6\x5b\xe2\xe0\xc3\x09\x12\x08\x66\x90\xe4\x75\x71\x73\xae\xd2\x1c\xaa\xea\x36\xcd\x7b\x4b\x54\x10\x9a\x58\x4a\x71\xcb\x9d\xf8\x15\x34\x6e\xa2\x24\x5d\x09\x12\x13\xbf\x99\x46\x7b\x2b\x3b\x72\x85\x16\x11\x8c\x27\x68\xe8\x61\xb5\xca\x02\xe4\xdb\x1f\xce\x9a\x99\x34\x46\x05\x93\x02\xe5\xed\x9b\xa1\x5b\x80\xe6\xe7\xac\x7e\x3e\x41\x79\x25\x4a\xac\x44\x14\x10\x5c\x05\x8f\xb3\xd5\xd3\xfe\x9f\x2f\xcb\x6d\x47\xbc\xad\x44\x24\x4d\x85\x61\x63\xbe\xcb\x57\xa8\x90\x5a\xf9\xb9\x2d\xcf\x13\x71\x64\xb2\x03\xf6\x61\x67\xa3\x99\x3a\xfa\x0c\x89\x4f\x13\xda\xa5\xcf\x54\x4f\xc2\x45\x89\x24\x22\x61\x67\xb2\xb7\x26\xa5\x10\x71\xc0\x6d\x12\x16\x49\x70\x2a\xd8\x41\x79\xac\xda\x6e\xc3\xb7\x11\xd2\xc3\xa5\xbe\xcc\xd2\x1a\xb6\xaf\xe9\xe9\x34\x84\x36\x08\xa1\x03\x64\xf5\xdd\x80\xe4\x99\x4d\x69\xdf\x96\xc5\x71\xb4\x61\x0b\xe9\x2b\x9c\xaa\x06\x4f\x65\xa1\x4f\x23\xac\x60\xb7\x5f\x08\x19\x07\xe8\x23\x5b\x55\xb2\x2b\x8d\x8b\xe9\x79\x29\x13\x8d\xd9\x73\x7e\x84\x5c\xa1\xa1\xfd\x3d\xe8\x5a\x28\xcf\x37\x15\x9f\x85\xae\xe7\xfc\xf4\xec\x1c\x01\xa1\xb8\x40\xf3\xd1\x16\x97\xcc\xf2\x83\xc5\xbb\xb8\xc0\x9b\x50\x32\x70\x1a\x3a\xff\x3c\x43\x79\xe9\xb1\xa0\x29\xa1\xb4\x8f\xe1\x27\x83\x4d\x84\x7a\xf5\x3c\x1d\x03\x15\x20\x25\x02\x3d\x96\x8b\x79\x91\xa5\x15\xb4\x61\x49\x01\xd2\xe4\xb7\xce\x95\x72\x1c\xc6\xb7\x7d\x9e\x2a\x25\x40\x71\x45\x5b\x03\xd9\x24\x0f\xa7\xed\x43\xa1\x7d\x8d\x5f\x69\x57\x7c\xf4\x2a\xa4\x5d\x23\x8b\xb8\xc5\x36\x2d\x40\x8c\xf7\x28\xad\x09\x62\x6b\x55\x91\xe3\xf1\x66\x52\x63\x3b\x37\xcf\xa4\xe7\xf9\x18\x2f\x91\xb8\xc9\x76\x33\x43\x7a\x09\x10\xee\x34\xbe\x70\xeb\x05\xb5\x2e\x0b\x75\x96\x75\x77\xb1\xf2\x55\x57\xe4\xd6\xfd\x95\x60\x14\x72\x7e\xbf\x7a\x5a\x6e\x97\xad\x46\xa3\x93\x31\x54\xd2\xf7\x8c\x66\x9b\xcb\x5f\xff\xad\xdc\x9b\x0c\x02\x86\x05\xdd\xc7\x41\x4e\x53\x06\xb1\xe1\xca\x7b\x78\x9e\xff\x98\x3d\x3e\xbf\x3c\xed\x88\x6b\x0a\x23\xc3\xfb\x76\x80\x7a\x97\xca\x37\x18\x0d\x8e\x24\x14\x02\x3b\x74\xa6\x52\x1b\x11\x93\x03\x46\xc9\x81\x87\x26\x89\x06\x11\xb5\x41\xe5\x0a\x19\xb6\xeb\xdf\xb9\xc9\xf6\x5a\x2a\x25\x6b\xa5\x55\x6b\x9e\x2d\xd2\xf7\x74\xf4\x2d\x25\x95\x46\x3b\x7d\x7f\x32\x82\xa7\xbb\xc2\x92\x58\xf4\x5c\x0b\xc9\xa2\xd0\x1c\x2c\x8d\xd1\x78\x2d\xba\xac\x24\x93\x46\xcd\x42\x81\x0b\xa5\xcc\xd4\x36\x2b\xdc\x62\x96\x51\xc8\x42\xab\x7c\xfa\x04\x1f\x3b\x38\x9e\x32\xe3\xa2\xa1\x31\xf1\xbb\xcc\xa8\xbb\x09\x21\x51\xd8\x09\x20\xe0\xcf\x3c\x3a\xda\x2e\x25\xa3\xc6\xf9\x35\x26\xe9\xb3\x99\x1d\x83\x95\x23\x23\x49\x39\x75\x11\x1a\xbf\xbd\x4a\x1b\x65\xa6\x75\x5a\xcb\xd7\x6e\x35\xc9\x58\x46\xa1\x91\x8a\x37\xc6\xaa\x4b\xf0\x8e\x86\x2f\x06\x0f\xd5\x20\xaa\xd7\xa2\xac\x21\xdf\x43\xae\x0c\x43\xf2\xb8\x9f\xf6\x62\x8b\x86\x79\x36\x09\xc6\x7e\xfa\x52\x72\xdd\xe2\xd1\x37\xc0\x55\x6b\x13\x48\x41\x02\xa7\x9c\x6b\xeb\x7f\x30\x5e\x80\x84\x12\x7d\x57\x59\x0a\x26\x4c\x09\x5e\xb3\x6c\x0e\x97\xf6\x7a\x65\xc4\x04\xeb\xd7\xb4\x54\x6b\xde\xfe\x5d\x86\x1a\xc3\xe4\x0f\xe7\x37\x3e\x08\x78\x48\xa9\x88\xab\x9e\x5a\xe5\x48\x79\x7c\xe6\xd9\x1c\x4a\x0b\xa4\x6c\x8d\x85\x2f\xb8\x89\xed\x5d\x94\x1f\x19\xf9\xe5\xf3\xf1\x9e\x97\x6a\xce\x4f\xab\xf9\x73\x3b\xe8\x2a\x88\x70\xb3\x36\xc5\x9d\x3b\xd4\xe9\xee\x3d\x42\x63\x94\x6a\x0b\x93\x49\xcd\x3c\x41\x3e\xd1\xf9\xb9\x7c\xef\xb0\xad\x76\xb5\xb4\xbe\xd0\xf0\x6b\x2b\x2e\xad\x5a\xc1\x00\xb2\x7c\x8d\x98\xef\x2a\xbd\xed\x95\x40\xdc\x21\x99\xab\xdf\xe3\x04\x24\x30\xc3\xa5\xaf\x4b\x80\x79\xc9\x3f\x16\xc0\x55\xd6\x92\x8b\x29\x09\x31\x41\x5c\xf9\xdd\x76\xe9\xb8\xcf\xdb\x16\xa5\x4c\xf8\x3b\x87\xca\x28\x0a\x57\x83\x59\xa1\x45\x8c\x52\x8b\xef\x50\x5e\x66\xf9\xa1\x3d\x92\xa5\x56\x86\xf7\x1c\x67\x5a\x47\x60\x69\x5a\x95\xe7\x85\x98\x7e\x36\xbc\x4a\xaf\x3c\xcd\x83\x3d\x69\x1b\x03\x19\xf7\x49\xac\x96\xbb\xfb\xc1\xe9\x3b\xb9\xf4\x94\x17\xd9\xa0\xf1\x01\x1c\x33\xdf\xda\x10\xbd\xa2\xcc\xb1\xeb\xa5\x4c\x12\x18\x6d\x24\x13\xe3\x1c\x55\x90\x0c\x67\x89\xf2\x3d\x20\x56\xf3\xab\x9f\xa3\x53\x3e\x55\x8e\xa3\xd5\x70\x5b\x85\x6d\x8b\xf6\x11\x30\x5d\x60\x4d\xc4\x0e\x01\xfc\xc3\x7b\x06\x94\x21\x1a\x7d\x3d\xdb\x4d\xe0\x20\x55\xc0\x0c\xeb\x15\xe2\xc5\x0f\x5c\x14\x9f\x86\x86\xcf\x35\xc7\xc6\xc0\xb6\x31\x79\xc3\xf8\x3d\xcd\x41\xa5\x54\x00\x49\x12\xb6\x04\x3f\x3b\xc8\xc7\x42\x94\x4a\x85\x96\xd4\x79\x6e\x41\x0d\x55\x7d\xd3\x72\xbb\x0e\x7b\x12\x9a\xa0\x4d\xdd\x7c\xd2\x45\x71\xe4\xbd\x00\xed\xd5\x17\xa6\x2c\x94\xe1\x04\x9d\xc9\x6f\x55\x35\xda\xeb\x09\x46\x6f\xb1\xec\xe6\x59\x8f\x46\x30\xf1\x23\xe4\x74\x96\xc5\x11\xd7\x0e\x6c\xe0\x74\xae\x79\x8f\x99\xd8\x75\x54\x01\x12\xd0\xc3\x67\x5a\xc3\x32\xaf\x53\xc5\x47\x94\x15\x2a\xb1\x72\x7e\xe2\x7c\x41\x27\x61\x7a\x7a\x25\x5a\x62\x1c\xa9\x39\x14\xaa\xba\xa7\x5c\xa3\x14\x27\x86\xa7\xf8\xd7\x2b\x47\xce\xb9\x55\xf5\x54\x7c\xb4\x8d\x9c\xb2\x56\xd0\xbe\xcf\x81\xf1\xd8\xfa\xb7\x4a\x84\xd2\x6b\xf1\xea\xfb\x13\xbf\x18\xaa\xb1\x36\xa0\xa8\x04\x05\xf4\xe0\xdf\x0b\x83\xee\xfc\x68\x99\x39\x95\x12\xda\xb3\x71\x2b\x1b\x53\x9a\x52\x85\x68\xfb\x1a\x06\x95\x13\xaf\x50\xe1\xb6\xda\x15\xbb\x57\xe8\xa5\x71\x95\xf4\x0c\xff\x68\x6a\x75\x68\x26\x2d\x3c\x25\x85\x51\xae\xdf\x81\xd9\x15\x8d\xd4\xf8\x37\x69\x12\xa5\x3c\x09\x5d\x2e\x0c\x4f\xf9\x71\xb9\xae\x52\x7e\x88\x49\xd8\xf5\xe6\xa6\x97\x09\x53\x2a\xf0\x44\xcf\xe6\xc2\xc2\xbc\x9a\xd7\x60\x8c\x80\x6a\x7c\x13\x61\x38\x9b\xa4\x01\xdc\x3f\x7f\xe4\x1b\x68\x3f\x06\x78\xbe\xc5\x3f\x36\x06\xbb\xa9\x9f\x9e\xa8\xc7\x53\x5a\x6b\xe1\xa4\xf4\xfe\xb7\xf5\xe6\xc3\x79\x03\x1e\x93\xe8\x64\x19\x20\x75\x1b\xb2\x03\x2f\x21\x11\x73\x78\x74\x90\xcd\xc9\x85\xa1\xcd\x29\x8f\x73\x72\x46\x82\x27\x25\x4e\x8a\x53\x09\x8f\xf2\x36\xbb\xf4\x45\xfc\x15\xf8\xc4\x47\x8a\x00\xcb\x99\x38\x1d\x6e\x00\x9f\x33\xac\xee\xb3\x65\x7c\xcb\xdd\xfd\x70\xa1\x41\x90\x50\x2c\x48\xea\x54\x6a\xab\xf9\x6e\xe3\x7e\x24\x50\x34\xb0\x8b\x5c\x4c\x29\xe6\xb8\x6e\x90\x20\x06\xd6\x6d\x12\xf3\xe2\xca\xe9\x71\x3d\xb5\xa9\x9d\xce\xd2\xfc\x6d\x57\x98\x7a\x2e\x07\x06\x35\x54\x4c\xd3\x33\x12\xc2\x40\xa0\xfa\xd3\xfc\x5c\x36\xbe\x4d\xb7\x1d\x5d\x07\xa8\x46\x29\x5e\x08\x99\x99\x14\xc6\x7e\x59\xcd\x9f\x47\x63\x44\x22\x81\x05\xfc\xba\x63\x72\x78\xd9\x3a\x3c\x04\x90\xd8\xf3\xfa\x32\xbe\x96\x28\x60\x38\x8a\x24\xf6\xa4\x81\xbe\x9c\x4b\x07\x8e\x7b\xee\xbb\x07\x40\xa4\xb1\xd7\x17\x8d\xe5\x67\x6c\xed\xa9\x88\x07\x50\x4f\x62\x2d\xd1\x6e\xf5\xb8\xdc\x37\xc6\xfd\x7e\xf9\xd4\x3e\x0b\x25\xb1\x8a\xbb\x62\xd7\x6d\xcd\xdf\xae\x4b\xba\x86\x2f\x47\x23\x53\x22\xff\x5e\xd4\x30\x4a\x77\xba\x1e\x5c\x39\xe4\xd0\x3f\xec\x31\x53\x5c\xb1\xc4\x2b\x60\x32\x41\x45\xd8\x07\xa8\x57\xa8\xc9\x3d\xb4\x4b\xfe\x8f\xff\xda\x9b\x47\x56\x71\xcb\x8e\xea\xae\x18\x90\xa1\x74\x25\x44\xc3\xb3\x1b\x22\xee\x3b\x42\x74\xac\x10\x1e\x3d\x72\x04\x3c\x6a\xf9\x19\xef\x9f\xe6\xdf\x6d\x60\x10\x81\x82\xee\xd4\x35\x33\x73\x5e\x9c\x46\xb1\x05\x88\x85\x60\xb6\x86\xe8\x58\xb4\xc0\x35\x48\x22\xa6\x3a\xde\xd1\x66\xeb\xbd\x37\xd5\xca\xae\x5d\x1b\xea\x47\x59\x64\x45\xa9\xd3\xac\x1e\x9f\xbd\xc0\x13\xdf\x77\x38\xf3\xe6\xbc\x4f\xeb\x0b\x62\x8b\x86\x6f\x2c\x98\x87\x91\x3b\x71\xbe\x4c\xa7\xbf\x40\x88\x84\x3a\x39\x7f\xa4\x34\xb3\xf4\x02\xbd\xfd\xc6\xf6\x94\x41\x90\x24\x4e\x6f\x98\x1f\xa0\xea\x85\x4b\x41\x86\x0a\x91\x90\xb7\xcf\x2f\x4f\x8b\xe5\x66\xbb\xff\x35\x7b\x78\x58\xee\xda\x66\x22\x91\xe7\x71\x8b\x4c\x11\x37\xc5\x48\xde\x49\x81\x0a\x02\xdf\xeb\x16\x9d\x2c\xc6\xaa\x44\x0a\x20\x90\x88\x43\x33\x0a\x87\x8f\xb6\x90\xe2\xd8\x05\x7d\x41\x07\xba\xa7\x37\x85\xd3\x7d\x40\x2d\x3d\x19\x09\x05\x1d\x85\xd4\xb7\x22\x7b\x36\xb6\xf3\xff\x49\x7b\x93\xe6\xc6\x71\x6c\x5f\xfc\xbb\xbc\x55\x2d\xde\x02\xe0\x08\xfe\x77\x92\x2c\xa7\xd5\xe9\xa9\x25\x39\xb3\xea\x76\xdc\x50\x60\x38\x90\xd8\x96\x48\x35\x49\xd9\xe9\xfe\xf4\xff\xe0\xc1\xc0\x41\xb4\xb3\xef\x7d\x9b\xca\x0a\x13\xa2\x28\x12\x04\xce\xf0\x1b\xb0\xa1\x82\x33\xc4\x8c\xd1\x24\x90\xce\x78\xe4\x3e\x2f\xf6\xc7\xb2\xd8\x2f\xf8\x68\x97\xd0\x24\x0a\xd0\xd7\x10\xb7\x6d\x6b\xf9\x6d\xb7\xc3\x8e\x7f\xaf\x69\x66\x66\xd9\x1c\xad\xea\xe5\x27\xbd\x15\xe6\x46\x6b\x03\xe9\x15\x65\x55\x21\xd9\xd5\xfe\x3d\x08\x05\x86\x11\x96\xd9\x31\xcc\x1e\xdd\x52\xa6\x03\x08\xc1\xf6\x01\xd7\x52\xb9\x95\x66\x74\xd9\x21\x93\x08\xef\x7a\xe7\xfe\x1a\x43\x1e\xe0\x66\xf1\x9c\xd7\x7d\xe5\x5d\xa5\xa3\x30\x90\xd6\x3a\x6c\x03\x47\x3d\xbf\x0c\x4a\x42\x3a\x4a\x43\x9b\xfa\xc1\x7f\x95\x27\x91\x63\xe6\x37\xfa\xba\x28\x35\x34\xb4\x4d\xbe\x37\xb6\x5a\xee\xef\x32\xc0\x19\xf4\x5a\x22\xc8\xd1\xfd\x39\x0e\x04\x96\xf2\x50\xde\xbf\xea\x72\x48\xd7\x11\xed\xea\x69\x3a\x8e\x62\x54\xcc\x7b\x30\xde\x67\x1b\x38\xa2\x50\xad\x79\x04\x93\x88\x5f\x1d\x47\x32\x0d\xbd\x23\x56\xfe\x5c\x96\xc7\xa5\xca\x9b\x5d\x34\x88\x1a\x75\xac\x23\x0e\x06\x02\x79\x76\xd1\x3b\xb5\xc7\x92\x98\x3b\x22\xd9\x43\xde\x46\xbf\x57\x1e\xaf\xc3\x37\x4e\x27\x8c\x33\x0b\x2b\x31\x2a\xd2\xa3\x6b\x4a\x43\x53\x6f\xc9\xeb\x0d\x62\x7d\x86\xaf\xa1\x4e\x41\xe2\x8b\x8f\xa9\x92\xc5\x84\x2e\x4f\xe7\xe6\x63\xf9\xaf\x1f\xce\x46\x55\x69\x16\x48\x7c\x50\x6f\xf0\xef\xc6\xe4\x29\xc3\x2f\x61\xa1\x54\x64\xd0\x21\x76\xe5\xc7\x7e\xbd\x72\xdc\xbc\xd1\x2c\xa2\xd2\xae\xa0\xc6\x87\xf2\x47\x5e\x5d\xea\x1b\x98\x96\x79\x56\x9a\xc5\xb1\xb6\x72\xef\xb3\x8b\xca\xc7\x18\xad\xd1\x9d\x61\x2c\x44\xe0\xbe\x29\xf6\x19\x9a\xe5\x04\xe3\xd7\xad\x6e\x3a\x13\x02\xa3\x95\x03\x54\xa0\xb8\x7f\x37\x38\x31\x1b\xb4\xe4\xed\x24\x3d\x0e\x2e\x6d\x50\x1a\xd5\x3c\x55\xa9\x07\xcc\x4f\x28\x2c\x68\x2e\x63\x6e\x2d\x26\x90\xc3\x54\x3d\xf9\x2c\x59\x0b\x22\x78\xec\xe2\x50\x59\x56\x0a\x0d\xb8\x46\x21\xb6\x16\x49\x82\xd9\x9f\x8b\x07\x4c\xb0\x3e\xea\x03\x6a\x21\x8d\x4a\xee\x1d\x3f\x36\x3d\x4c\x8a\x16\x4a\x27\xca\xcb\x99\x60\x88\x7e\x3b\x0e\xda\xb4\x4c\xbc\xac\x32\xd6\xcc\xe6\x17\xb5\xf7\x81\x9f\x96\x10\xa3\x64\xbc\x0f\x48\x7e\x75\x42\x7c\x1e\xee\xac\x25\x24\x08\x44\x78\x98\xfd\xb9\x5b\x3d\x6e\x97\xeb\xe5\x66\xbb\x33\x85\x42\x37\x44\xf1\x08\x81\x20\xb3\xba\xce\xf7\x3e\xa1\x18\x3e\x6f\xa0\x09\xf2\x0b\x17\xdb\xf9\x57\xbb\xa7\x86\x28\x44\x5e\xc7\xb9\xa3\x07\x0f\x45\x38\x46\xf3\x08\xd2\x14\x59\x48\xab\xe2\x2d\x6f\x60\x86\x86\x1f\xd7\x84\x57\x37\x58\x68\x6d\xf5\xeb\x97\x9f\x18\xa7\x01\x21\xa9\xa4\xd0\x19\x3b\xfc\x5c\x5a\x7c\x28\x10\xa2\x12\xac\x26\x01\x62\x1b\x3d\x2b\xd5\x1f\x4d\x51\x9c\xa4\x4d\x05\x96\xbf\x1a\x28\x14\x0c\xe6\x0c\x10\x2a\x09\x63\x3e\xc5\xee\xe1\xf4\xae\x60\x72\x40\x82\x4c\x28\xf0\xaa\xd3\x2f\xf5\x70\x2d\x00\x12\x08\x81\xd1\xa4\xe1\xa9\x7c\x49\xf0\x05\x12\x72\x03\xd7\x2a\x2e\xa7\xd5\xe9\x5c\x56\x8d\xbf\xa4\x38\x15\x58\x41\x59\xfd\xf5\x30\xfb\x6b\xe6\xfe\x9a\x80\x11\x50\x7c\xb8\x79\xda\x4c\x46\x67\x76\x5c\x4a\x14\xe2\x40\xaa\xb2\x34\x14\xa6\x27\xbd\x1b\x5d\x67\xca\xcc\x5d\x39\xf0\xda\x52\x4e\xa6\xd6\x03\x20\x8c\x64\x98\xc5\x6f\xd7\x2f\xcb\xeb\x52\x07\x10\xc6\x4d\xee\x6d\xb3\x63\xcb\x91\x7e\xd2\x93\xc1\x0b\x90\x4c\x19\x47\xf2\xe6\x00\xb7\xc7\x92\x37\x16\x41\x92\x8f\xa2\x25\x20\x99\x26\xdc\xf8\x34\x81\xca\xa5\xd5\x00\x71\xf7\x81\xd3\x44\x50\xa3\xaa\x8c\x4a\x73\xc7\xe3\x1a\x09\xe2\x3d\xd3\x58\x20\x02\x52\x30\xfa\x28\xc8\x11\x46\x47\xe6\x11\xa2\x0e\x88\xa4\x29\x56\x34\x4d\xa9\x7f\xd8\x82\x04\x22\x83\x08\xf1\xe6\xf7\x39\x2f\xfe\x96\xf7\xfb\xa0\x40\xa4\x96\xa1\xc1\x5c\x5e\x0a\xe9\x76\x39\x07\x3c\x62\x76\x90\xa2\x51\x66\xa3\x90\x6f\xfc\x04\x9d\x24\xde\xf0\x2a\x14\x13\xb8\x81\x1c\x01\x5e\x37\x0d\xf0\xe3\xb6\x54\xfc\x63\xe7\xbe\x0a\x6c\xfe\x7c\x97\xef\x0f\xdf\x78\xdd\x47\x06\x01\x81\x28\xa5\xe6\x1a\x25\x14\x75\x7e\x39\x4d\xc9\x77\x0c\x1c\xce\x80\xe8\xd4\x80\xd8\xd0\x0b\xc4\x78\xc2\xf7\xa0\x10\x40\x49\xc0\x30\x97\xd9\xa9\x12\x41\xc3\xed\x4e\xd3\xbe\x98\x9f\x34\x50\x87\x53\x86\x92\x38\x16\x16\xcd\x33\x50\x10\x00\x4a\xa9\x8e\x33\x6b\xaa\xbb\x6b\xca\xb1\xb1\x9a\x1b\xa5\x23\xe4\x07\x2f\xb7\x77\xbb\xb5\x17\x35\x06\x1a\x50\x46\xec\xab\x87\x48\xe4\x29\x7d\x5c\xa0\x61\x18\x63\x3f\x02\x3b\x43\x70\x53\xf0\x2f\xa2\x35\xa0\xa1\x20\xa2\x83\xc7\xe2\x03\xf6\x5e\xbf\xc3\xf3\xc6\x44\x25\x16\xf2\xbe\xfd\xd5\x71\xef\x80\x26\x41\x86\xd8\x06\x63\xa1\x7b\x25\x6b\x33\x89\xa6\x1a\x3c\x0e\x9a\xa4\x14\x3d\xed\x76\xe7\x0a\xac\xef\x13\x5c\x71\xeb\x2f\x57\xa2\x90\x40\x13\x66\x0a\xfe\xe7\x0a\x9c\xcb\xef\xef\xf2\x35\xf7\x49\x69\xec\x56\xec\xc4\x44\x93\x23\xdb\x93\x19\x7d\x05\x48\x4e\x86\xee\x52\x5e\xb6\x64\xb8\x27\x02\x4d\x03\x8a\x3a\x2a\xf7\x0f\xb3\xa7\x9e\x44\x1c\xd0\x34\x63\x34\x71\xca\x4c\xda\xc4\xe9\xc3\xaf\x61\x4a\x05\x28\x8c\x52\x36\xa5\x2a\x2f\xfb\xbe\xcb\x38\xd0\x2c\x8c\x90\x77\x51\xbf\x9f\x6f\x3d\x7e\x11\x68\x96\x09\xa3\x70\xdf\xf0\xca\x28\xb9\x7f\xc9\xfe\x02\xca\x93\x14\x67\xd6\x8d\xb5\x78\x77\x27\xe2\x82\x61\xf2\x76\x69\xaa\xc1\xf7\x8a\x38\xc0\x75\x54\x95\xda\x03\x6d\xec\x21\x49\x12\x9c\xe4\x05\xbc\x5f\x0b\x0f\xb6\x87\x25\x19\x51\xaa\xfd\x27\xa3\x00\xf3\xec\x7f\x5d\xa0\xfa\x08\xa6\x37\xdd\x29\xfa\x00\x50\xc9\x01\x2b\xd6\x66\xb2\x1a\xf4\xfb\xe0\x7a\xa5\x88\x8d\x9a\x01\x98\xc2\xda\x14\x1a\x16\xa8\x54\xc6\x4d\xd2\x88\xbf\xff\x31\x94\xef\x00\xaa\x44\x94\xc5\x2e\xda\x35\x6e\xd4\x36\x10\x39\x5e\x95\x22\x86\x84\x04\xf4\x13\xa1\x89\x6d\xaa\x84\xa6\x47\xb5\x3b\x40\xbe\x3f\xf8\x5b\xdd\x6e\x62\xed\x5a\x86\xb1\xa2\x2b\xf2\xfc\x44\xda\x33\x74\x83\xa8\xc6\xfb\xfe\x2d\x2f\xab\x7d\xee\xff\x1a\x45\xa9\xa7\x5f\xee\xde\xf3\xa2\xde\xf5\x4c\xd3\x81\xea\x40\x20\x2c\xd5\xaa\xc8\x5f\x4b\x84\x01\xd5\x2c\x43\xe4\xd3\xf3\x7a\xb9\xdb\xcc\xee\x97\xbb\xcd\x76\xb6\xb6\xf1\x12\x04\x04\x52\xe9\x1b\x64\x06\x78\x70\xc3\x1b\x6e\xe2\x48\x37\x28\x08\x22\xd4\xaf\x92\xe5\xe9\xdc\x41\xd1\xec\xc1\x50\x5b\xcd\x39\xe0\xa7\xef\x00\xe7\xbc\xd8\xdf\x97\xf2\x75\x59\xa8\x79\x07\xe8\x85\x20\xa2\xbe\x67\xba\x31\x24\x90\xc7\xf6\x25\xbc\x42\xb7\x4d\xbe\xbb\x41\x44\x95\x30\x74\xfa\xf6\x9c\x98\xc2\xf8\x13\xc7\x1a\x31\x9e\xcf\x77\x7f\x6e\xbf\x3f\xfa\xbf\x4a\xc1\xb4\x05\xdc\x57\x6f\x66\x9b\xec\xb4\x46\x21\x88\xb9\xc9\x27\x55\xfb\x5a\x94\x1f\x2e\xe0\x75\x47\x45\x6a\xc4\x01\x4f\x67\x23\x19\x59\x0f\xd3\xf3\xc8\x8e\x4b\x92\x90\xc5\xbe\x20\xa0\xf3\x5f\x3d\x2a\x05\x1e\xc5\x9e\xc7\xc8\x0f\x0b\x82\x94\x86\x18\xfb\x37\x15\x6f\xe7\xda\x43\x59\xb4\xf7\x7c\x08\xd4\x80\x20\x8d\x0c\xd5\x64\x0d\xa0\xa0\x82\x53\x3f\xdb\x83\x80\x31\x86\xb2\x46\xe7\xe1\x7c\x75\xc9\x15\x04\x19\x0b\x9c\x09\x1e\xa6\xbf\x46\x44\x60\x72\x91\x08\x32\x15\x20\x01\xcc\xf8\x1c\x95\x79\x11\xf9\xb3\x28\x8e\x29\x58\x9b\xc8\xcd\x2f\x1f\x6d\x5c\x0e\xea\x8e\x57\x6a\xf0\x83\x32\x1d\x20\x50\xd3\x75\x77\x8c\xcc\xf0\x7f\xd4\x34\x81\x80\x13\x1a\xd1\xae\xdb\xd3\x0f\xb8\xfe\x41\x93\xff\x9e\xde\x71\x03\x9e\x28\x9c\xf9\x4d\x75\xe9\x5c\xc8\x21\xe0\x32\xc2\xbe\x90\xca\x6b\xbe\xaf\xe0\x4a\xb1\x67\xa4\xdc\x03\x81\x90\x0c\x57\xe1\x0d\x6f\x93\x17\xa7\x05\xf9\x15\x4c\xfe\xfa\x17\x08\xd0\xa1\x2d\x4f\x1d\xd5\x58\xa4\x18\x02\xa1\x43\x2c\xa4\x1a\x2f\x46\x63\xd7\xbc\x91\x65\x75\x4d\x60\x1d\x3c\x61\x49\x22\x5c\xd9\xba\xfd\xf5\x13\x5f\x69\x37\x9e\x85\xa6\x68\x0f\x55\x0e\xbd\x04\xdf\x1d\x86\x90\x11\xe7\x36\x84\x45\x34\x5c\xc4\x17\x97\x51\x2c\x12\x40\x98\xc5\xb6\x68\x37\x61\xd1\x32\xbc\x46\x48\x63\x84\xd3\xa3\x4e\x63\xf9\x82\x79\xaf\xfb\x42\x4d\x28\x36\x21\xd1\xa1\xcb\x08\x3c\xd4\x37\x56\xdf\x53\x8d\xa4\x1e\xae\xc0\xb7\x57\x5c\x84\xd1\x8f\xd5\x89\xd1\xfa\xc6\x75\x0b\x5f\xf1\xbe\x3d\x18\x04\x5a\x06\xb8\x57\xed\xae\xdd\x4e\xc6\xcf\x72\xb8\xd2\x68\x25\x88\xd1\xd6\x6b\xf8\x6d\xd9\xf7\x22\x72\x03\x74\xac\xb3\x01\x01\xcd\x7e\x67\x48\x88\xc6\xe7\x2c\xab\xf2\x1d\x11\x05\x5d\x71\x0e\x42\x2a\x8d\xeb\xd7\x5d\xa9\x8e\xee\x65\xbd\xf2\xfa\x18\xfe\xc8\x30\x88\x62\x4c\xac\x37\xdb\xf5\x62\xb7\x79\x79\x7e\xbe\xff\xcb\x9d\x2e\x48\x0d\xae\xc9\xc5\x40\x76\xe2\x8e\xa4\xd3\x46\x75\x89\xfe\xa3\x0b\x03\x1e\x63\x1a\x50\xc1\x99\xe7\xd5\xf6\x00\x0b\x5e\x37\xdd\x8f\x09\x84\x71\x4d\xdc\xae\x57\xcf\xfd\x0d\x37\x0c\xb4\x8c\xd2\x1e\x20\x10\xa5\x07\xfe\x98\x40\xff\x41\x18\x52\xee\xe0\x8c\x2f\x35\x54\x4e\xbb\x74\x70\x19\x21\x84\xce\x01\x79\x5d\xbe\xff\xfd\x82\xf6\x98\xdd\xf6\x1a\x46\x44\x10\xdb\x83\xbb\xc7\x2e\xe6\x33\xff\x50\xfc\x63\x3a\x0b\x0c\xa3\x20\xf6\xf2\x51\xd6\x88\xa8\x7d\x82\xee\x68\x1a\x5b\xe9\x56\xf9\xfa\xf7\xe6\x63\x5b\xce\x2c\xa9\xb5\x03\x73\xb5\x83\x04\x0b\x90\xaf\x30\xbb\xf7\x93\xe7\xa1\xdb\xc9\xc2\x48\x09\x94\xf3\xb0\xea\x88\xff\x03\xa9\x3c\x08\x93\x50\x6b\xab\xb3\x71\x39\x63\x6e\xe6\x0e\x80\x42\x88\xef\x7a\xb6\x5d\xee\x6e\x66\x7f\xed\x02\xe6\x0e\xa5\xa1\xc0\x2d\x5a\x5c\x90\x40\xd8\xcf\x84\x42\x66\x99\xa3\x5c\xa9\xa7\x6a\x7f\x8d\x26\x71\xc3\x44\x14\x44\x0e\xa4\x5d\xc3\x6d\xce\x1b\x1f\x6c\x0f\xa7\x1c\x53\x04\xfb\x73\xb3\x9b\x1f\xab\xcd\xd3\x7a\xb3\x9b\x3d\xde\xec\x16\x4f\x8f\xdb\xf5\x6a\xfe\xb2\x6d\xff\xb0\x7d\xfa\xbe\x7c\xdc\xb8\x0b\xc8\x08\x43\x7a\x22\x60\x07\x09\xd4\xc3\x5f\xf3\xe1\xfb\x12\x0a\x6d\x4a\x8f\x66\x79\x5f\x83\x2c\x11\x76\x31\xd1\xea\x85\x50\xd1\x18\x4b\x98\x05\xfc\x6a\xee\xae\x95\x51\x21\x54\x51\x8c\x0d\x8d\xf6\xf9\x1a\x75\xc5\x0e\x93\x4d\xdd\x6f\x50\x8c\xd1\xd0\xdd\xe4\x2f\x3b\xa1\xcc\x7d\x82\x13\xc3\x57\x33\x7d\xc7\x59\xa1\x16\xa8\x81\xb9\xe0\xa3\xca\xdc\x48\x23\x37\x72\x9f\x17\x3a\xb3\x68\x69\xbb\x4a\xf7\x18\x24\x10\x2a\x9d\x62\x79\x6d\xf9\x5f\x08\x43\x34\x89\x3d\xea\xd1\xba\xdb\x08\x11\x71\x52\xe5\xb6\x5d\x5c\x7f\xf7\x81\xaa\x1b\x93\x0a\xdb\x38\x00\xf9\x6a\xdb\xe9\x5f\xa1\x30\x21\x04\x1b\x9a\x21\x6e\x7c\x24\xa7\xe9\x87\x64\x61\xec\xd2\x14\xac\xd2\x3f\xf4\xfb\x6f\xbd\x17\x51\x07\x22\xb0\x27\xbb\x29\x25\x42\xb9\x37\xf9\xbe\xa8\x17\x57\xfc\x3f\x08\x75\x6c\xb2\x94\xbf\xdd\xce\x07\x6b\x87\xe6\x80\x82\xc0\xdf\xca\xa3\xda\xfe\xba\x05\x40\x8f\xdf\xf1\x66\xdb\xfb\xd1\x11\x09\xac\x34\x16\x58\x15\xb1\x81\xd1\x93\x1d\x44\x89\x71\xcc\xe5\xde\xb4\x06\x22\x4a\x63\x61\x20\x0c\x6e\xaa\xf5\xdf\x88\x28\x88\x28\xd2\xf7\x10\xa9\xb1\x9d\x68\x39\xba\x71\x99\x26\xce\x53\xeb\xe1\x72\x6c\x6e\xfc\x8f\x89\x02\x01\x58\xc9\xfa\xd7\x85\x57\xbc\x68\xf2\x02\x26\x27\x75\x14\x68\x26\x22\x9f\x09\xb6\xb9\x5c\x77\x57\xa3\x40\x1b\x3e\xfc\xa1\xac\x6a\x78\x1e\xa5\x54\x51\x48\x99\x91\xe5\x39\x94\xef\xde\xed\xad\xee\x4a\x2a\x6e\x58\xcc\x8c\x2c\x6e\x0d\x6a\x97\x17\x9e\xcd\xb1\xd3\xd0\x1b\xc4\x02\x2c\xaf\x89\xce\xc4\xf0\x2a\x68\x8c\xda\x5b\xc9\xac\x14\x0c\x6f\x60\xff\x3b\xf5\x30\x88\xa2\xd8\x98\xca\xd6\xd0\x2c\x0b\xb5\x5a\x3c\x8d\x7e\x42\xdc\x26\xec\x86\x30\x6d\xea\xd7\xed\x45\x1a\x34\x6e\x9f\x0b\x02\x51\x9c\x0a\x13\x4b\xb7\x99\xed\x92\x57\x47\xe3\x0c\x13\xfa\xe3\x2c\xca\x2c\x05\x6e\x55\xd4\xe7\x6b\xe3\x3b\x88\x62\x45\xb1\x65\xbf\xdb\xed\x50\xf6\x60\x10\x00\x45\x49\x22\x8c\x9c\x4e\x59\x6d\x81\x9f\x16\x4f\x2e\x09\x8a\x52\xc2\x58\xe0\x84\xcd\xab\x5b\x3a\x9c\x2a\x2c\x08\x53\x9f\xd7\x2e\x9b\x03\x06\xd2\xb7\x65\x65\xe6\xe3\x4a\x96\xee\x34\x59\x90\x21\xe4\x11\x71\x36\xf3\xf2\x57\xe0\x0f\x84\x04\x97\x35\x83\xe0\x18\x37\x0d\x21\xca\x62\xc5\xbb\x8a\x8c\xc9\xbd\xbe\xb6\x90\x80\x28\x63\x31\x2a\xd9\xdd\x97\xe5\xeb\xcb\xd9\x1b\x1e\xde\xe4\x6f\x28\x32\x39\xba\x33\x19\xe7\x98\x80\x37\x68\xa9\x76\xd4\xca\x56\x03\x56\xf5\x1a\x79\x3b\xa0\xda\xb9\xf0\x90\x17\x6b\xac\xe1\xfb\x0b\x57\x31\x2a\x2f\x68\x90\x87\x1f\x65\x03\x0f\x3c\x2f\x56\x85\x2e\xe7\x1f\xce\x89\x78\x7e\x85\xc9\x84\x88\xd3\x34\xec\xe4\xcd\xfb\x08\x0f\x88\x38\x0b\x5c\x19\x13\xf2\x7d\x31\xbf\x7c\x6c\xa1\x9e\x96\xbd\x82\x48\xc4\x20\x6c\xf3\xe2\xf9\x60\x9b\xf8\x98\x77\x8c\xaa\x30\x91\x0c\x45\x00\x3d\x23\xe1\x1e\x9c\xb2\x67\xca\xf6\xc9\x0c\x56\x81\xb9\x93\xe6\xe5\xe4\xe2\xf8\xb1\xcb\xf5\x6e\xcf\x6b\x7c\x8e\xbb\x53\x59\x41\x4c\xf6\xef\x90\xef\x36\x50\xa8\x5d\x7b\x1f\xea\xdd\x6d\x55\x9e\x76\x7f\x95\x97\x6a\xf7\x95\x4c\x31\x44\x2a\x32\x95\x05\x63\xe2\xba\xe0\xe7\x67\xa8\x46\xf3\x52\x45\x89\xd1\x06\x94\x87\xb2\x7f\x33\xdc\xe1\x18\x50\x60\x10\xd3\xf6\x9b\xd9\x76\xe9\x3e\x07\x59\x8c\xdd\x10\x9e\x57\x37\x55\x79\xb6\xdc\xa2\x9d\x3f\x2c\x42\xcc\x70\x8f\xa0\x9b\x28\x1c\x9d\x54\x53\x8e\xa9\xe9\xec\xfb\xc3\xdf\x16\x77\xb3\x95\xcb\x9b\x23\x9d\x18\xf5\xa5\x87\x0f\x67\x2f\xfc\x3b\x65\x0c\x88\x74\x16\x22\x88\x71\x8f\x42\xd3\x03\xf5\x5c\x88\xb4\x32\x1e\xb0\x1b\x68\xdf\x79\x04\xd9\xfa\x6c\x2d\x8e\xe2\x10\xa7\xa5\xce\xab\xba\x99\xdc\xa0\xe2\x28\x31\xeb\xb8\xdd\x9a\xa7\xe3\xbe\x38\xca\x18\x75\xab\x90\x8d\x44\x2c\x86\x12\x9d\x3f\xae\x3c\xc8\xdd\xc7\x04\x43\x30\xeb\x4c\x29\x6f\x49\x35\x78\xf9\xe3\x98\x0a\x04\x3f\x1f\x78\x7d\xe8\x2a\xfc\xee\x20\x37\x00\x88\xbf\x5d\xea\x66\x7b\x80\x6d\x7e\xfe\xbd\xc0\xf9\xf0\x02\x62\x6e\xe9\xde\xe0\x03\x32\xb3\xac\xb8\xd9\x11\xc7\xc2\xb8\xeb\x56\xc0\x15\x16\x4a\x3d\x44\x99\xb9\x11\x20\x83\xd8\x3b\x94\x3d\x97\xaf\x70\x72\x00\x72\x88\x93\xcc\x3a\xce\xdd\x2c\x3d\x8e\xaf\xac\x7a\x68\x58\x88\x13\x15\xa0\xc4\xcf\x1a\xce\xc7\x8f\x41\xa1\x72\xf0\xf2\x0c\x6e\x4b\xa2\x15\x5a\x1d\xf8\x5c\x72\xb9\xdf\xcf\x2f\x1f\x06\x77\x3c\xba\x4b\x29\x35\x18\xf6\xda\xda\x31\xe4\x6e\x03\x43\x76\xe3\x08\x0e\x00\x71\x1a\x11\xac\x0c\x3b\x74\x57\x73\xe8\xa1\xcb\x2c\x7f\xc1\x5d\x7a\x1a\xc7\x18\xd7\x9e\xcb\xf2\x88\x1e\x61\xfd\xe0\x38\x4e\xd3\x00\xfb\x7c\x65\x61\x39\x9b\xcb\x62\xa8\xce\x05\x31\x23\x0a\x17\xb8\xff\xfa\x8f\x1f\xdc\xf4\x22\x12\x33\xcd\x50\x32\xe4\xcc\x2f\x35\x18\x0a\xba\xbb\x8c\x8c\x64\x4e\x64\xe0\x87\xb1\x12\x9f\x7f\xac\x46\x3d\xb4\x38\xa3\x81\x32\x59\x95\x83\x84\xde\xf1\xfa\xb0\xb9\x08\x2b\xa3\x37\x0a\x2a\xe2\x4c\xc5\xd4\x98\xf0\xf2\xe6\x80\x58\x5e\x4d\xdd\x17\xf2\x48\xb9\x42\xf7\x03\xaf\xaa\x7c\xec\xaf\x06\x31\x4f\x12\x65\xca\x69\xf9\xbf\x2e\xb0\x39\xa3\x20\x85\x81\xc5\x8e\x47\x66\x80\x0f\xcf\x88\x28\xdc\x9d\xc5\x63\xa9\x60\xce\x1b\x79\xe8\xd3\x85\xc6\x50\xa6\xfe\xff\xb9\x13\xe9\x00\xa9\x66\xf3\xcb\xbe\xa7\xc9\x6b\x0f\x0a\x2a\xd1\x31\x6c\xc0\x1e\x84\x58\x86\x11\x12\x57\xac\xe4\xed\x97\xd0\x42\x88\x25\x4b\xb0\x0d\xde\xa6\x19\xb7\x58\x26\x9e\xa8\x52\xc7\x52\xc5\x18\x82\x5a\xdd\x81\x81\xaa\x1e\xc4\x40\x33\x62\xe3\xf0\x39\xaf\xd1\x22\x61\x20\x25\x65\x87\x69\x99\xa0\x11\xa5\x9f\xfe\x2b\x59\xce\xa7\xb0\x84\xc3\x4b\x4c\x08\x91\xd8\x84\x52\x65\xbb\x95\xfc\x56\xb8\xae\x97\x49\xf4\x22\xf1\x84\x04\x86\x7b\xc0\xeb\x1a\xaa\x66\x65\xd0\x15\xd7\x4a\x2d\x90\x10\x1e\x09\xed\x53\xaf\xfb\x52\xbe\x9a\x6e\xe1\xe8\x95\x4b\xa8\x4c\xb1\x98\x90\xd7\xc6\xa3\x67\x7a\x91\x4d\x28\x24\x98\x7c\x7d\xe3\xf5\x4f\x07\x64\x80\x24\xa0\x49\x92\x5a\x58\x7f\xbb\x2b\x3e\xbd\x4f\x9b\x99\x40\x12\x24\x10\x33\xd7\x82\xf3\xde\x66\x43\x26\x12\x24\x01\x70\x2c\xec\x79\x63\xbc\xc1\x39\x42\x96\x99\xde\xbd\xbb\xf3\xb7\x79\xc1\x8f\x37\x79\xdd\x0c\xac\x9d\xbe\x22\x51\x40\x12\x2a\xc5\x12\x2b\x7f\xb0\xe3\x4a\xe5\xc6\x45\xd1\x7a\xfc\x0c\x2f\x3a\x26\xa1\xb0\x85\x26\x23\x0d\xff\x54\x29\x30\x0b\xa8\xbf\xe4\x38\x56\xaa\xb3\x5d\xd9\x94\x47\xb5\x2a\xb6\x87\xbc\xee\x29\x4f\x40\x92\x24\x29\x82\x5d\x56\xc5\x5b\xf9\xda\xeb\x3d\xf7\x23\x13\x37\x94\x31\x9c\xc9\x47\x5e\x37\x96\x58\xd5\x37\x0f\x6c\x07\x48\x04\xb8\xea\xcd\xbf\x46\xf3\x3b\x49\x34\x8d\x8d\xfd\xeb\xfb\xa0\x22\x96\xa4\x6d\x2e\x83\x0d\xa5\xbc\x91\x87\x6d\xd9\xad\x78\xfd\x95\x3d\x61\xa9\x01\xfe\x38\x9c\x86\x15\x05\xb4\x69\xde\x34\xe4\x06\x92\x2c\x49\x31\x17\xea\x4c\x8b\x6e\xfb\xbb\xee\xf0\x12\x33\xc1\xb1\x74\x0d\xcd\xe1\xb6\xac\xa6\x9a\x16\x49\x06\x04\x6b\x99\xcb\xed\x5d\x14\x90\xb2\x88\x02\xe2\x7e\x07\x27\x86\xd2\x63\x26\x75\xc7\x2d\xec\x98\x2b\x13\x31\x4a\x22\x58\x92\x1a\xea\x4b\xfb\xce\xd8\x39\xb7\x2a\x9a\x72\x31\x26\x03\x23\xef\xc4\xc5\x6c\xbd\xad\xa7\x5d\x8f\xaf\x7f\xd2\xb8\x1d\x94\x08\xe0\xe0\x80\x7a\x01\xa1\x6c\xdb\x73\xc6\x72\x3f\x41\x66\x11\xe6\x29\xb7\xf9\x11\xda\xd3\xae\xfc\x9e\x95\x28\xa2\xb1\xf7\x98\xd7\x2e\x39\x9b\x19\xd3\x53\x3f\xc0\x9a\x1b\x6d\x4e\xbc\x6a\x1c\x67\xb7\xbf\x6a\x26\x8a\x19\xa2\xc6\xfc\xe9\xe5\x71\xbb\x5a\x6e\x76\x9b\xbb\x99\xd3\xda\x87\x44\x49\xc0\x4e\x58\x73\xa8\xca\xf7\x95\xff\x10\x24\xb1\x93\x78\x86\x73\x9b\x22\x1c\x11\x28\xd4\xe7\x42\x41\x02\x00\xc6\x09\xef\xf8\x71\x3a\x5f\xea\x6d\xb7\x13\x27\x3a\xc9\xa2\xb4\xe7\xd8\x39\xbf\x54\xc5\x2d\xc0\x4c\x5c\xe7\x31\x83\x9b\x9d\xd2\x28\x4b\x04\xd6\x19\x7f\xab\xc1\x06\x29\x8d\xd3\xc0\xe8\x15\x1c\x40\xbe\xf6\x12\xa9\xf1\x49\xa5\x44\x4c\xf1\xdd\xe6\x50\xc2\xae\xdf\xaa\x48\xa9\x16\x24\xeb\xf1\x74\x3c\x19\x64\x75\x3a\x81\xca\x79\x03\xc7\x51\xc5\x37\x0d\xb4\xb0\xbe\xda\x1f\x13\x70\x90\x34\x24\x29\xe6\x0f\x3e\xbe\x32\xf1\x6f\xbf\xc0\x94\x86\x69\x1c\x53\x2f\x57\xed\xe1\x36\xf7\x50\xec\x3b\xf0\x8f\x1b\xcb\x18\xa6\x48\x8f\xf0\xbe\xce\xeb\xd7\xd9\x18\x8f\x93\x46\x41\x14\xda\x4c\xf8\x11\xde\x6f\x00\xfb\x1c\x53\x05\xd8\x34\x0a\x4d\x68\x87\x39\xdd\xe8\x24\x9c\x22\x03\xc3\x56\x31\x7b\xa0\x83\x34\x8e\x68\x94\x0c\x4c\x5c\x56\xa7\x33\x70\x79\x38\x41\xd1\xbc\x54\xc7\x1b\x68\x78\x7e\x74\xab\x5f\x9a\xd0\x20\x22\x4e\x59\xb8\x0f\xef\x1d\x5d\x4c\x92\x00\x6a\xf2\xaf\xca\x22\xff\xf5\xeb\xf7\x0f\x3b\x11\x2c\x4c\x2c\x88\x09\x2a\x17\xdd\xa4\x29\x0d\x9c\xaa\x48\xa1\x78\xa5\x6c\xd9\x6a\x10\xfa\xa5\x69\xa8\x32\xe5\xfa\x12\x43\xcb\x11\x48\xd3\x98\x20\x42\xc5\x2e\xd0\x79\xb1\x5f\x56\x55\x59\xdd\x1e\xcb\x72\xda\xf8\xa4\x7b\x36\x69\x96\x31\xa3\x4a\xd1\x5b\x19\xac\x0c\x9b\xbe\x1c\x07\xaf\x4b\x9a\xca\x18\xa5\xf4\x0d\xdd\xee\x98\xff\x7b\x9c\x94\x8e\x43\xcb\xe1\x13\x62\xc4\xc8\x6e\x3c\x2f\xd7\x8b\xe5\xe3\x76\x47\x89\x5b\x03\x53\x96\x45\x28\x07\x66\x9b\xd5\xcb\xed\x9d\x7f\x1a\x19\x8f\x51\x65\x64\x5b\xe5\xe7\x67\xfe\xf1\xe5\x1d\xce\x80\x39\x92\xca\xf2\xc4\x73\x57\x05\x4a\x79\xa0\x9d\x4f\x92\x9d\xd1\xbb\xa6\xdc\x1e\xa0\x73\xf4\x85\x94\xeb\x30\xb2\x8a\x07\xcf\x65\xdd\xac\x16\x4f\xd8\x0a\xe9\x56\xc2\x54\x00\xc5\xed\xfe\x6d\x04\xef\x98\x15\xea\xa6\xdb\x26\x3a\x53\xc5\xc8\x35\x81\xa2\x2b\x41\x0e\x48\x25\x4d\x2c\x06\x4d\xd6\xcf\x50\xf5\x5b\xcb\xa9\x8c\x02\x27\x14\xbd\x3d\x5c\xc9\xf9\x41\x2a\x99\x4c\x0c\xe5\xb4\xcf\x8b\x86\x54\xc5\xc6\x28\xd3\x6a\xdb\x6e\xfb\x31\xa6\x1b\x92\x1a\x59\xd1\xcd\xf3\xd3\x7a\xfb\x7b\x94\x51\xaa\x44\x60\x50\x4d\xbc\x76\xe2\xa2\x8f\x8e\xfb\x0a\xa9\x52\x31\x6a\xeb\x95\x47\x75\x33\x1f\x56\x01\x52\x88\x44\x94\x0e\x88\xac\xfe\x48\xcc\xd3\x4e\xbf\xb7\xc3\xd1\x57\xb2\x5c\x03\x16\xc2\xdc\x48\x4d\x85\x56\x1e\x2d\x50\x61\x3d\xc3\xef\x1c\xa9\x66\x80\x60\xc2\x99\x75\x36\x1f\xcc\x6c\x46\xb2\x0c\x41\xc6\x7d\x76\xa1\x3d\x44\x63\x23\x75\xb6\x91\x65\x89\x04\x02\x47\x73\x02\x46\x53\x82\xfb\x7e\x9d\x37\x0e\xb8\x5d\xf9\x63\x22\x41\x38\xdb\xf7\xbc\xd8\xab\xf2\x64\x3c\xa0\x5c\x38\xc2\x82\x50\xa8\xf6\x5e\x3c\x3d\x7c\xeb\x3f\x14\x16\x28\x82\x04\x79\x25\x5e\x87\x22\x1b\xc0\x42\x62\x68\x71\xb5\xc1\x2a\x94\xc5\x6d\x59\x19\x50\xe6\x08\xe7\xf9\x75\xd2\xcd\x42\x92\x70\x6b\xf7\xac\x2d\x5c\xdb\x1d\xa1\x0c\x6b\x26\x26\xdb\x59\x9d\xf8\x1e\xa6\xaa\xc7\x2c\x8c\x81\xd9\xa5\x09\x90\x08\x2a\xcb\x76\x91\xea\x15\xb2\x3e\x9d\x22\x2c\x4c\x25\x0a\xa2\x29\x23\x0d\xb5\xb3\x79\xae\x7f\x4e\x2c\xe2\x4a\xd9\x1e\x51\xfb\xc2\x59\xb5\xa5\x8e\x9c\xcb\xfe\x41\x03\xf6\xdf\xa3\xdf\x14\x47\x29\xde\x9b\xd3\xc7\xaa\xcd\xe5\xdc\x6a\xc9\x12\x20\xb8\x5a\xce\xbf\xdf\x0e\x6e\x73\xa2\x19\xc4\x9d\x5a\xeb\x0d\x70\x75\xdf\x33\x6a\xb6\xa3\xd2\x50\xa2\xf4\x55\x9b\x27\xfe\x31\x7a\x25\x59\x2a\x75\x48\x5c\xd4\xdb\x69\xed\x00\x63\x2c\x4d\xec\x54\x7e\xbc\x9c\x10\xd8\xbd\x2d\x6d\x00\x3b\xd8\x12\x18\xd3\xc6\x55\xdc\x54\x0a\x1d\xa5\xd8\x1e\xcc\x42\xda\xd3\xe0\x59\xd5\xf5\x65\xdc\x0e\x62\x3c\x53\x48\x3c\x98\xf3\xfa\xd5\xdb\x9d\x7e\x19\x6f\x30\x2e\x32\x44\x1b\xec\xce\x47\x3e\x2d\xe2\x05\x4c\x48\x8e\x74\xbc\x2d\x14\x0d\x14\xb9\x9f\xb3\x42\x1b\x60\xb9\x4f\xfb\xec\xf6\x68\x1a\x3a\xa8\x8d\xd7\x63\x1a\x00\x93\x21\xc7\x26\x74\x17\x15\x3f\xf3\xaa\x29\x9c\x8f\xab\x1f\xc6\x63\x84\xfe\x18\x70\xcb\x4c\x21\xcd\x70\x38\x44\x51\x1e\x66\x1e\x62\xdb\xde\x8b\x2e\x69\x65\x2a\x90\x34\xeb\xb0\x2e\xb7\x65\xe5\xd4\x18\xec\x00\xa0\x21\x6e\x17\xf7\x50\xd7\x65\xb1\x4b\xa7\xf3\x33\x06\x61\x1c\x5a\xe7\x4b\x0b\xc9\x2b\xab\xdb\xb2\x7a\xbc\xf9\xcf\x80\x1c\x0c\x12\x15\xd9\x5e\xd2\x46\xa2\x30\xd7\xd0\x8d\x6d\xf8\xec\x40\x6a\xdc\x40\x84\x73\xef\x9d\x64\xfb\x01\xd3\x9a\x60\x18\x50\x5f\x44\x1b\xc6\x8d\xea\x0a\x19\x89\x78\xc4\xfc\x64\x6b\xbf\x12\xe1\x3a\x83\x2b\xcb\x48\x64\x54\xcc\xeb\x86\xbf\xc2\x73\x95\x9f\xca\x4a\x39\x49\xaa\xbe\x78\xeb\xf4\x0f\xcb\x08\xa3\xa8\xff\x75\x29\x4a\x8d\x86\x81\xc7\xd9\xf9\x7c\xb4\xf6\x47\x9b\x7c\x5f\xbc\x9c\x07\xeb\x43\x16\x24\x09\x26\x8d\x5e\xd1\xba\xff\xee\x65\x41\x22\x22\x23\x99\x65\x74\xb9\x3a\xc1\xc8\x6e\xf7\xcc\x02\x9e\x02\x73\x95\x41\x71\xcc\xa5\x11\x81\xb3\xe5\x3d\xf7\x7e\xb7\xef\x88\x51\xf0\x72\xf1\xec\x1d\x1c\xcf\xe3\xa2\x47\x16\x52\x23\x13\xd1\xb4\xdf\x31\x15\x9c\x65\x61\xa0\x9c\x1d\xd2\x58\x5b\x19\xb2\x90\x51\xfc\x92\xf6\x95\x01\x3a\xcf\x95\xff\x76\x88\x90\xa3\xff\xfd\xc0\x45\x2e\xde\xea\x07\xf9\xad\x82\xbd\x93\x11\x85\x2c\x8a\x52\xe7\x55\x62\x98\x18\xb5\xed\x62\x8d\x89\x5b\x90\x45\xb1\x69\x44\x96\x56\x1b\x79\x55\x2c\xa0\x4b\xb1\xb3\x28\x0d\x71\x7b\x34\x8b\xc1\x4f\xc8\x17\x65\xdd\x58\x51\xa8\xd1\x8f\x8d\xa4\x76\x35\x1c\x9c\xc6\x79\xf3\x31\x2f\x0b\x35\x6b\x9a\xd2\x1b\xde\x42\x16\x53\x81\x60\x0d\xb3\xd4\xef\x64\x09\x5a\xfb\x63\xa1\xb1\x3f\xa9\xa1\x19\xe9\x9a\xb8\x01\x52\x05\xc6\x2f\xa2\x12\xb9\x1a\x1f\x54\x0e\x41\x39\x59\xe4\x19\x16\x77\x06\x3d\xcf\x5e\x1e\x99\x25\x8c\x62\x12\x2a\x78\x9b\xad\x77\xa2\x02\xe3\xe2\x4d\x96\x64\x49\x66\xdd\xf7\xda\x20\x7e\x71\xcd\x9e\x82\x2c\x95\x3c\xc8\x7a\x98\x0d\x50\xab\xe2\x86\x8f\xf2\x9c\x8c\x09\x89\x98\xb9\x99\x94\x97\x13\xae\x6f\xd3\x0b\x45\x96\x11\xae\x4c\xbd\x68\x0d\x05\xba\x4f\xba\x03\x99\x54\xe6\x7b\xde\xca\x57\xac\xad\x39\xc0\x8f\x3f\xd3\xe0\x44\x9c\x25\x2c\x76\xee\x29\x63\x49\x37\xc8\xb8\x10\x31\x71\x05\x23\xee\x5a\x5c\x28\x4e\x60\xf8\xe2\xa7\x2b\x2f\x0f\xc8\xb8\x32\x0a\x8c\x86\x05\x35\x78\x2d\x39\x68\xd3\x69\xb1\xa0\xbe\x59\x05\x1b\xdf\x9a\xca\x44\xc6\x78\x5f\xc1\xa1\x5d\x18\xbc\xb7\xeb\xe8\xca\x04\x0f\x1d\x2a\xa5\x8d\xc1\xca\xa2\x86\x61\x3c\x97\x49\x15\x12\x53\xb7\xaf\xe5\x05\xee\xcb\xba\xb9\x83\xaa\x9c\xee\x43\x64\x2a\x30\x46\xb9\xe2\x52\x15\xb3\xe3\x71\xf4\x65\x2a\xd5\x58\x9e\x2b\xf8\x29\xc7\xaa\x4d\x1b\xf4\x20\x4f\xc3\x0d\x00\x82\x32\x32\x6d\x82\x9a\x1f\x61\xa4\x18\x36\x3c\x19\xd0\x38\xa1\x9e\x20\xf9\x6a\x7e\xa6\x7b\x4a\xdf\x61\x3c\x27\x80\x26\xce\xbc\x60\xd3\xa0\xaf\x54\xc3\xc7\xd7\x07\x54\xe2\x36\x67\x7c\x78\xc7\xda\x88\x90\x41\x28\x8c\x00\xd6\x72\xb3\x5c\xff\x58\xde\x58\x08\xc9\x0e\x0b\x14\x0e\xd1\x94\x41\xa8\x30\x45\xc6\x27\xbb\x5c\x2f\x02\x32\x91\x2d\xb1\xe9\x5d\x3d\x83\x48\xc4\xca\x35\x92\xb0\x6f\x3c\xe6\x34\x42\x06\x31\x45\x20\x4a\xde\x46\x12\xb3\x42\xcd\xac\xa2\x0e\x3a\xe5\x5c\xb7\xb9\x3f\xc9\xd1\xfa\x96\xa2\xe3\x8b\xc8\x22\xc2\x9d\x7b\xe9\x4d\x5e\x8b\x4b\x55\xe3\x44\x9b\x7e\x8d\x38\xa1\x12\xa9\x16\xd2\x44\x11\xf7\xe5\x7b\x57\x50\xe1\x24\x8d\x84\xd5\xe4\xb7\x6b\x90\x9b\x5a\x9c\x52\x86\x48\x3e\xe3\x0b\xfc\xcc\x3f\x4e\x5f\x58\x65\x7f\x1d\x0b\x73\x1a\x1b\xfb\x32\xec\x75\x1a\xfd\xcf\x99\xbf\x06\x9a\x1a\xe8\xce\xd3\x7a\xb6\xb8\x5f\xfd\xd7\xf2\xef\x2f\xcb\xf5\x5f\x0f\xb3\x3f\x3b\x0b\x68\xe0\x94\x33\xf4\x12\x74\x22\x93\x5f\x27\xd0\x9c\x8a\x14\x53\x4e\xa3\x93\xd9\x43\xcf\x71\x0a\x01\xae\x1d\xd0\x1c\xb0\x89\xe2\xfe\x1e\x84\x9a\x77\xd1\x11\x3a\xae\x7f\xd1\x70\xe5\x81\x30\x92\xaf\xce\x27\xf1\x1b\x14\x05\xfc\x3b\xaf\x47\xa1\x2d\x0f\x04\x60\x29\xe9\x58\xee\xc3\x60\x90\xb7\xf3\x40\x29\x14\x14\xab\x78\xa1\xca\x93\xa5\x08\x7c\x19\x21\xf0\x00\x42\x54\x68\x59\x1e\xf3\xfd\x89\xdb\xa6\xc2\xa8\xcb\xc1\x03\x2d\x99\x81\x89\x16\x12\x8e\x73\x68\xe6\x1f\x66\x57\x1c\xae\xd6\x3c\x24\x0a\x27\xf3\xfc\xf2\x61\xc0\xa2\xf5\xfc\x63\x39\x2e\x13\xf1\x90\x12\x15\x0d\xaa\x34\x57\x12\xd6\xed\xa0\x30\x0e\x3a\xfd\xa3\x76\xf9\x34\xfd\x0c\x7f\x5c\x81\x79\x27\xe6\x97\x8f\x39\x97\xaf\x9e\x3a\x08\x3c\x4a\x9c\x0a\x0b\x2e\xe6\xd6\x7a\xea\x19\xaa\x71\x4b\x6a\xdc\xeb\xe1\x71\x48\xd1\xc5\x66\xb7\x87\x02\xda\xfc\xea\x11\xde\xef\xca\xaa\x86\xcd\xa1\xbc\x9e\x20\xc3\xe7\x12\xab\x98\x80\xcb\x2a\x7e\xe6\xc5\xba\x0d\xb2\xdc\x25\xc5\x90\x5a\x6b\x39\x8c\x74\x6f\xd0\x8e\x65\xf0\x86\x8d\x61\xe4\x97\xdf\x83\xf2\x78\x42\x00\x3b\x0e\x55\x79\x84\xa5\xca\x9b\x72\xd4\xa1\xe7\x09\x05\x6c\xce\xb9\x96\xc4\x58\xd6\xc1\x0d\x93\x09\xce\xed\x07\x38\x95\xf7\xbc\x50\xbd\x44\x99\x33\x62\xa4\x12\x76\xd6\x38\x60\x7e\xf9\x68\x87\xdc\x96\xd5\x82\x17\xea\x6a\xf5\x71\x9f\x0a\x59\x62\x8c\x51\x65\x05\x68\x29\x8f\xaf\x8c\x2d\xec\x8f\xc6\x46\xa9\x93\xda\x34\xb3\x0a\x1b\x15\xff\x4f\x42\x20\xd0\xee\xcf\x58\xcd\x3e\xf1\x57\xab\xc6\x31\xd4\x41\x8c\xdd\x38\x1d\xc4\xa6\x6c\xbd\xbe\x14\x68\x7a\x8c\xfc\xf8\xd1\x25\x66\x91\xa9\x9e\xb5\xf9\x53\xaf\x9c\xee\x79\xd2\x6e\x58\x9c\x86\xb8\x4d\xdb\x89\x66\x2b\x7c\xdb\x43\x05\xf5\xa1\x5b\xd0\x79\x26\x02\xdc\xf6\xd6\x4b\x54\x77\xdc\xbd\xac\xef\xdd\x21\x4e\x24\x06\x3c\xf7\xe5\xbe\x57\xa8\xb3\xac\xbf\x49\x8a\x08\xe7\x51\xc8\xba\x14\xeb\x5a\xae\xd0\x0e\x13\x11\xe0\x6d\x2e\xcf\x50\x7c\xcb\x75\x1b\x2d\x9f\x36\xbc\x68\xf8\x68\x32\xc8\x34\x64\xf6\xcd\x5b\xcc\x9e\xcc\x84\x72\x57\x07\xd4\xd0\x6d\xb1\xcb\xe8\xeb\x58\x1c\x92\xd4\x00\xbe\x6b\x18\x83\x21\x3e\x79\x3c\x60\x01\xad\x16\x56\x58\xec\xfd\x9b\x02\x3a\xc6\xf0\xa3\x7c\xf3\x05\x19\xae\xa3\x18\x85\x47\x37\xfc\x0d\x6c\x71\x6a\x7e\xf9\x40\x75\x10\xf5\xef\x4f\x66\xa0\x96\x0a\x8b\xd1\x26\x4c\x46\xff\x83\xc7\xbe\x7f\xe9\xe8\xbd\x33\x9f\x12\x34\x54\xe8\x0d\xba\xdb\x40\xe3\xed\x1b\xfe\x7e\xe1\x47\x6f\x1a\x3b\xc6\x52\x08\x1a\x65\x19\x71\x2b\xd1\x27\x2e\x24\x20\xa8\xd0\xc6\x3f\x1f\xc0\x55\x87\x96\xcd\x61\xe6\x5c\x05\x41\x84\xc4\x50\xc6\xb1\x41\xb0\xad\x00\x36\x88\x73\xea\x89\xaf\x0f\x1f\xbb\x08\xa9\x01\x24\x6d\x5e\x16\x8b\xe5\x66\x63\x44\xf9\xdd\xd9\x22\x2a\xb1\x4a\x62\x81\x5b\x23\x67\x3f\x10\x91\x08\x51\x0f\xc7\x36\xa8\xd1\xa3\xb5\x8d\xd1\x2f\xd7\xc4\x35\x11\x07\x14\xb3\xe3\x3e\xe3\xed\xd6\xb8\xbb\xf4\x24\xff\x40\xc4\xca\x90\x09\xe0\x5f\x17\x7e\xec\x8a\x2e\x3d\x7c\x7c\x3f\xa6\x15\x09\x89\xd1\x4a\xef\xf1\xc7\x6a\xb3\x7a\x7a\x5c\xcc\x36\x77\x18\x5e\xb9\xd3\x25\x49\x88\x84\xe8\xf3\xc1\xac\x1f\x35\x3f\x02\xa2\x97\xfc\x80\x4c\x60\x04\x70\xe8\x19\xba\x4c\x69\xba\x06\x76\x4f\x11\x2c\x48\x5c\xec\x7b\x97\xef\x0f\x50\x37\x9f\x52\xe9\x44\x96\x70\x6e\xa1\xb8\x76\x93\xfa\x89\x3e\x46\xe5\x71\x3c\x50\x13\x6c\xf5\x9b\x79\xf6\x3b\xc2\x8a\xe0\xa9\xe0\x4e\x88\xe8\x58\x8e\x1a\x78\x82\x73\x8e\x5a\x64\xc6\xb6\x63\x5e\x5e\xf6\x87\x66\x5a\x71\xee\x3f\x5a\x05\x05\x57\xa6\x9d\x64\x9a\x63\x36\xe0\xaa\x7b\x19\xb2\x50\x24\xc0\x57\xab\xf9\x38\x83\x03\x7e\x08\xc5\x32\xe4\x06\xe2\x57\x6f\xf8\x48\x38\x11\x84\xe2\x22\x8e\x3c\x4e\xf9\x7f\xb8\x40\xff\xee\xdf\x29\x39\xf3\xe9\xff\x73\x57\x23\x23\xe7\x09\xda\x18\x3f\x86\xae\xe1\x2c\x94\x8e\xb8\xf4\xfd\x2b\xdb\x92\x9c\x43\xb3\x2a\xae\x02\x13\xa1\x74\x8c\xba\xfd\xb9\x2c\xdb\xb3\x20\x2e\x02\x95\x9a\xa9\x97\xa6\x07\x01\xa9\x59\x02\x6f\x91\x13\x63\x82\x75\xb7\xce\x77\xec\x59\x01\x4a\xa2\x64\xda\x81\xd7\xcb\x42\x41\x0f\x6d\x29\x74\x12\x6b\xe5\x2b\x02\xdf\x78\x8d\x6d\xbe\x27\xed\x0c\x8f\x07\x31\x9d\x24\x32\xc4\xb6\xe7\xbb\x6b\xbd\x3d\x57\x79\x21\xdb\x80\xe6\xbe\x94\xaf\x16\x3b\xe7\xc5\xe9\x41\x12\x1d\x62\x6c\xde\x2e\xcf\xfd\xf7\x4d\xd2\x30\xcb\xdc\xda\x6d\xde\x92\xbe\xf0\x91\x1b\x24\x29\x96\xbe\xed\x84\x99\xad\xd6\xed\xae\x7f\x6e\xba\x4a\x8f\x1d\x18\x10\x1a\xf4\xac\x15\xca\xf2\xb8\xd2\x8f\x00\x5d\xd5\x5e\x06\x11\x41\x80\xbd\x21\x0f\x0d\x5a\xfa\x32\x48\x09\x2a\x0c\xcd\x72\xa3\xfb\xdc\x2b\x32\xc9\x80\x43\x64\xf9\xa7\x9b\x33\xaf\x5e\xad\xe4\x9e\x1a\x95\xe1\x64\x00\x01\xf2\xf2\x7c\xac\xb6\x28\xd5\x27\xb1\xb5\x0c\xb4\xc2\x52\x9c\xe4\xe7\xde\xb3\xea\xf7\xd6\xda\x21\x58\xb6\xb8\xa9\xf8\xfb\xc2\x2f\x32\x32\x4c\x22\x74\x9f\x2b\xeb\x53\x2f\x2a\x92\x21\x24\xa1\x45\x2a\xd5\x17\x51\xcb\x2a\x17\x50\xd5\x9b\xbc\x90\x70\xcf\xeb\xe6\xae\x8f\x33\xb2\x1f\x89\x78\xcc\x93\x1e\xd4\x13\xae\x7b\x9b\x32\x02\x85\x0c\xe7\x52\xeb\xfa\xda\xc6\xda\x0e\x8a\x89\x41\xeb\xc2\x2f\x13\xcc\xed\xe4\x14\xd8\x7f\x10\xed\xb8\x4f\x46\x02\x75\x91\xa0\xac\x11\x2e\x77\x53\x95\xfe\xf7\x27\x81\x51\xdc\x7b\x68\x77\x64\xb8\x9c\x06\xcf\x24\x89\x09\x96\xcb\x76\xbb\xd3\xe5\x78\xcd\x13\x90\x49\x26\xe3\x8e\xec\xea\xbb\xc4\x79\xb1\x6f\x83\x76\xa7\x28\x0d\x32\x0d\x94\x2b\xd4\x6e\xde\xf9\xb4\x21\x11\x48\x46\x24\xce\x2d\x4c\xed\x36\x0d\x9c\x13\xf7\x79\xa6\x4d\xe9\x55\x56\x65\xcd\xf3\xca\x3a\x07\x6e\xd0\x48\xb5\x6b\xa2\xca\x8c\x30\xc4\xa6\xaf\xd7\xfd\x67\x96\x05\x19\x11\x4e\x38\xf7\x72\x54\xa6\x6d\x36\xfc\xea\x4c\x86\x18\x51\x9f\x7d\xf0\x21\xb9\x30\xcc\x1c\x57\x82\x1a\x33\xed\xa6\x70\x15\xee\xa3\xd2\xe0\x31\x96\xbf\xf8\xe9\x7c\x84\xd4\x9f\x52\x27\x59\xe2\x5f\x1e\x97\xa0\x4c\x6e\x99\xdd\xff\x8d\xca\x67\x52\x24\x11\x76\xd7\xf8\x7e\x9f\x5f\x8a\x7d\x7e\x5b\xf1\x7a\xf4\x36\xcb\x40\x60\x15\xd3\x57\xa0\x86\x6f\xa1\x94\x26\xed\x97\x65\xd1\xf0\xbc\xf8\x04\x6b\x2a\x95\x30\xca\x54\x1b\x44\x02\x7f\x99\xc4\x4a\x25\x34\x16\x69\x36\xcf\xcf\x1b\x64\xf3\xcd\x7e\xdf\x58\x92\x90\xc6\x88\x42\x3a\x9a\x05\x2d\x2f\x8d\x05\x8e\xbb\x4c\x50\x5c\x5a\x23\x3f\xeb\xc8\x60\x56\x23\xa3\x94\xd2\x2d\x38\xa0\x63\xec\xa6\xee\xf6\xd0\x60\x99\x1b\xd4\x73\x79\xcc\xe5\x87\xd1\xf3\xec\x5f\xb0\x8d\x89\xa5\xce\x28\xd2\x3f\x2d\x96\x60\x48\xe1\x0c\xba\xbb\x9f\x8e\xb8\x7d\xff\x08\xdc\x53\xd0\x9c\x61\x20\x9b\xcb\x2b\x23\xc6\xcf\x0a\x18\xd7\x5b\x98\xd4\xdc\x28\x4e\xe6\x08\xb1\x1a\x6b\xd0\x80\xd4\x22\x49\x0d\xc5\x40\x0d\xc9\x07\x8a\x04\xdc\xb8\x1c\xe2\x82\xfd\x08\xfb\xb2\xc9\x8d\xe7\x98\x11\x1f\xf5\xc3\x24\x2e\x2c\x3a\xaf\xe0\xbe\x6c\x1a\xa8\x3e\xfa\x50\x5c\x45\x22\xd3\x6d\x3b\x57\xa5\x1a\x10\x27\x69\xd0\x0d\x91\x4e\x6c\x08\xef\x53\x1b\x4d\x5f\x79\x76\xba\x5f\xa4\x48\x1c\x22\xac\xb4\x80\xf7\x6f\x17\x21\xa0\xea\x94\xc4\x40\x91\x44\x22\x66\xa7\xe0\x4d\xfe\x06\xa8\x53\xb5\x7b\x83\x2a\xd7\x1f\x03\x34\x48\x7f\x89\x51\x44\x86\x98\x87\xbe\x57\xb9\xeb\x2a\xba\x23\x9a\x4a\x83\xda\x57\x00\xa7\x91\x08\x15\x28\xca\xb8\xd5\x0b\xb5\xab\x92\x33\x8b\x99\x98\x10\x8a\x66\xe6\x76\xa2\x5f\xf5\x4c\x1a\x2d\x9f\xf6\x99\x0c\x2b\x83\x8a\x4a\x8e\x02\x61\x73\x68\x4c\xf1\xb0\xfb\xda\xe9\x1a\x9b\x0a\xd2\x10\x85\x82\x76\xa7\xdc\xa9\x9c\x8f\xde\x8c\xc1\x23\x57\x61\x60\x64\x61\xc4\xe5\x63\xdd\x48\x77\xe7\xc2\x54\x38\x8d\xbd\xe7\xb2\xe1\x4d\x39\x78\xe1\x55\x44\x12\x24\xfd\xac\xea\xd5\xe2\xa9\x1e\x40\xd6\x55\x04\x21\xf2\x85\x17\xfc\x75\xd0\xd5\x51\x31\xf5\x0d\xfc\x35\xd4\x97\xe3\x7f\x5c\x91\x73\x9f\x4f\x0d\xf2\xeb\x5c\xc1\xbe\x9d\x73\x58\x30\xa9\xfd\xd9\x79\x82\xd5\x9e\xed\x5f\xcf\xcb\xdd\xf2\xcf\xe7\xfb\xa7\xf5\x72\xbd\xbb\x5d\x2f\x57\xdf\xee\xb6\xcb\xb5\x1f\xa6\x12\x73\x75\x57\xac\xd7\xdf\xbd\x55\xc3\x8b\x49\x62\x03\x54\xc5\x2a\x9d\x93\x89\x76\x5f\x92\x52\x42\x8d\x33\x5e\x5e\xac\x64\x89\xab\x4c\x1f\x90\xa1\xd2\x54\x66\x72\x68\xd8\x39\x9d\x74\xab\x94\x31\x14\x27\x38\x5f\xea\x6b\xa9\x95\xe1\x25\xb1\x50\xe1\xe6\xb8\x7a\x5c\x3c\xb9\x2f\x62\x3c\xa5\x96\xfe\x88\x90\x86\x09\x90\x8b\x62\x22\x08\x3a\x71\xfe\x07\xa8\xf9\x0f\xf3\x8e\x8c\xaa\x56\x2a\x93\x46\x9e\x57\x5c\xaa\x62\x0d\xed\x8f\x1b\xd0\x0b\xbb\x2b\xc9\x54\x88\x49\xcd\x0e\xaa\xaa\x87\x18\x1a\x4e\x6d\x4e\x32\xf0\x0a\x68\x27\x70\x99\xd5\xe0\x1f\x37\x94\x0b\xc5\x2c\x82\x76\x66\x68\x0e\x56\xad\x69\x5b\x8e\x9b\xa2\xe3\xf2\xf4\xe0\xa7\x72\xc9\xb1\x84\x71\x33\x9b\x7c\x33\xae\xf7\x0c\x25\x78\x82\xf7\xbf\x76\x62\xba\xa0\x54\x46\x30\x79\xda\x15\xe5\x29\x2f\xbc\xe3\x1d\x28\x05\x3c\xb0\x44\x94\xef\xcb\xbb\xa7\x7b\x54\x50\x7c\x7e\x7a\x72\x45\x17\x05\x24\x44\xba\xb2\x55\xab\x1a\xec\x92\x0a\x38\xc1\xb4\xd6\x8a\x69\xed\x8c\xb0\xdc\x29\x6f\x1a\x50\xeb\xf2\x38\xca\x07\x15\x08\xae\x4d\x47\xe4\xe3\xcf\x82\x9f\x86\x3b\xb2\x02\x48\x48\xdc\xb9\x70\x7e\x56\x02\xef\x2d\x6f\x40\xa4\x42\xff\x55\x87\x46\x9a\x52\x2a\x05\x20\x2a\xc3\x3a\x6e\x5e\x7f\xff\x90\x4e\xb8\x77\xb8\x8b\x40\x40\x03\x61\xbb\xa1\x05\x6a\xb9\xc3\xaf\x6d\xe9\x9e\xdb\xf0\x67\x40\x90\x18\x62\x52\x1b\x5b\x7e\x2f\xf3\x57\x98\x16\x18\x1d\x7f\xc8\x9a\x2f\xf2\x63\x05\x5c\x7d\xac\x8a\xeb\x0e\x14\x04\xc0\xb1\xf4\x90\xd7\x6d\xc2\x73\xc7\xdf\x86\xf1\x3f\x44\x01\xe0\xc3\xd8\xf5\xa4\x41\x06\xdb\x42\xfc\xc9\xb7\xc7\x91\xe1\x3f\x6f\xff\x7a\xf9\xfd\x04\x82\x38\x02\x24\xae\x96\x85\xb1\x65\x18\xd0\x8a\x47\x75\x58\xea\xf7\x35\x88\x63\x99\x19\xf9\xc0\x95\x7f\x9b\xa1\xfd\x1b\xf7\x68\x90\xb5\xb5\xe9\x1a\xfd\xee\x18\x40\x07\x3d\xf5\x22\xd3\x1c\xef\x35\x12\x20\x09\x22\xc4\x23\x1e\xf2\xfd\xc1\x10\x0d\xdb\x0c\xb4\x0f\x02\x85\x24\x4e\x42\x47\x9e\x9b\x39\x6d\xc1\x7a\x5b\x3e\x1f\x3d\x81\x14\x12\x11\x60\x25\xc9\x2a\xe8\x3e\xe0\xbb\x60\x6a\x12\x76\x44\xaa\x23\xf4\x88\x79\x58\x3d\xee\xd6\xcb\xfb\xe5\x6c\xb3\xdc\xf5\x08\x5a\xc0\x88\xa2\x56\x23\x51\x1e\x40\x5d\xbc\xc9\x3d\x00\xa3\x19\xee\x30\x37\xbc\x29\x6f\x96\x7f\xfe\xef\x56\x69\x60\x29\x09\xb9\xf7\x8f\xda\xb7\x9f\x78\xd2\x8e\x5c\x53\xa8\xd5\x74\xf3\xd9\x2d\x51\x90\x25\x46\xb7\x6f\x8f\xd4\xcd\xd1\xcc\x15\x71\x46\xba\xe0\x1a\xf3\x82\xea\x63\x1a\xbf\x68\x3f\x21\x03\x82\x31\x9c\x69\x6f\x6c\x79\x3d\xe2\x05\x82\x0a\x0c\x49\xcb\x35\x58\x67\x37\xee\x76\x00\x35\x40\x99\x3b\x7e\xe0\xbd\x5c\x03\x20\x60\xb8\x4f\x9b\xde\xcf\x74\xb0\x0c\x10\x27\x18\x6c\x60\x5f\x6f\x25\xcb\xf6\x04\xd3\x2e\xe8\x00\x90\x28\xaa\x3b\x63\xbd\xbf\x5f\x72\xf9\x8a\x86\x86\x86\xbd\x31\x99\x29\xb6\xbf\x4c\x22\xef\x21\xdf\xf3\x9f\xbc\x19\x80\x08\x41\x83\x51\xe8\x01\x95\x37\x98\x3a\x0f\xdf\x19\x33\x4a\x13\x6a\xea\x96\x88\xcc\x33\x8a\xe7\x3d\x8f\x20\xd0\x24\x34\x82\xeb\xc7\xbc\x69\xb8\xce\xdb\xb4\x7a\xc1\xcf\xf5\xe5\xd8\x21\xbf\x26\xc5\x92\xa6\x1e\x84\x26\x61\xa6\xed\x83\x50\x1f\x1b\x18\xd1\xa2\xb4\x13\xf1\xf6\xb2\x22\x17\xe3\x66\x3d\xf8\xd1\x9a\x66\x41\x6c\x79\x00\x98\xe4\xae\xfb\xb0\x82\x7e\xb0\xa7\x29\x0f\x31\x0d\xfb\xeb\xe9\x25\x5b\x3c\xad\x1e\x07\x4b\xcd\x60\xe5\x18\x5e\x26\xe5\x02\xc1\x65\x67\x44\x86\x99\xf3\xdb\x43\x41\x10\x01\x0c\x15\xb8\x9e\xaa\xc7\xb2\x3a\x8d\x97\x03\x1d\x24\x0a\x53\x0f\x6b\x86\xb1\xb4\x69\xb7\x3f\x91\x50\xd8\xff\x92\x97\xaa\x7a\xbc\x9c\x9e\xb4\xad\xd4\xfa\x1b\x1f\x5a\xe9\x63\x33\xcd\xbf\xe7\x4d\x93\xf7\x0e\x82\x11\x74\x74\xcc\x5f\xa8\xd6\xd6\xf6\xd9\x8d\x88\x24\x17\xce\xe4\xcd\xec\x77\x33\xdd\x0c\xe1\xa9\x3a\x26\x41\xc6\x7c\xe6\x5b\x7d\x0c\x63\x60\x1d\x33\x63\x90\xea\x2b\x53\xc8\x70\xf7\xd7\x10\x33\xb0\xe6\x2c\x0d\x3f\x7e\x2b\x4b\x4b\x5d\xe8\x0a\xc6\x3a\xce\x14\xb1\xd8\x72\xcc\xc5\xab\x01\xb5\xc4\x0d\x12\x46\x83\xaa\x02\x9d\x3b\x77\xa8\xe1\xeb\xa9\x63\x30\xfc\xa9\x0a\x6a\xd9\x2e\xa7\xfd\xb4\x45\x27\x14\x90\x76\xa0\xf8\x07\x52\xa0\x71\x39\x75\x5c\x53\x9d\x06\x86\xa8\x3b\x3b\x9e\x0f\xdc\xa0\xe1\xf0\x35\x1e\x3e\xab\x54\x82\x55\x1c\x71\xe8\x90\xd1\x15\x30\xca\x31\x02\xdb\x42\xdd\x20\xd2\xe3\xbd\xc4\x5e\xbe\x41\x16\x8f\x74\x68\xfe\xa7\xff\xfe\x47\x4b\xaa\xce\x08\x45\xac\x30\x56\x13\x1c\xec\x66\xe0\xbc\x39\x72\x87\x04\x9d\x05\x0c\xe1\x8e\xb7\xfc\x22\xc7\xd8\x63\x9d\xc5\x32\x31\x56\x0e\x06\x0a\x67\xda\x2e\xde\x90\xdf\x68\xb2\x5a\x1a\xc0\xf0\x93\x92\x18\x2d\x8c\xed\xcb\x7c\xd9\xbe\x56\xee\x5e\xcb\xc0\xa4\x84\xa7\xbc\xb0\x71\xcf\x6d\x59\xcd\x8a\xda\xeb\x2e\x83\x96\x42\x84\xa1\x27\xb0\x28\xfb\x2d\xa3\x9b\x2d\x21\x42\x9a\xc8\x80\x5d\x69\x11\xc3\xd3\xf7\x46\x82\x69\x35\xe0\xec\x59\xdf\x3c\x8e\x4e\xa8\xc2\x08\xdf\x96\x9b\x8f\x82\x9f\x72\xb9\xf9\xfe\x2b\x18\x8f\xc8\x28\x35\x75\x02\x59\x2a\x0b\xf3\x1a\x5f\x16\x10\xc0\xd5\xe9\xf9\x50\x42\x91\xff\xba\xbd\x14\x6a\x88\x0b\xd5\x10\x64\x91\xf4\x04\xa0\xdb\xaa\x3c\x99\x22\xb2\xba\x8e\x92\x34\x24\x11\xb6\x64\x57\x85\xce\x8b\xbc\xf9\xb8\x2b\x2f\xd5\xfe\xc8\x7d\x6b\x57\x6b\x1a\x25\x16\xb3\x38\x7e\x36\x5f\x47\x69\x5a\x07\x69\xdc\x91\xf6\x9f\xab\xf2\xd7\xc7\x40\x9b\x62\xb4\x9e\x6a\x61\x34\x2a\xb6\xdb\x6d\x7f\xff\xd0\x5a\x33\x66\x6c\xc3\xcf\x2f\xe7\x41\x55\x42\x13\x12\x68\x0d\xbd\x37\xbb\x7d\x27\xba\xae\x83\x26\x24\xe2\xa8\x26\x73\xe6\x55\x93\xcb\xfc\xcc\x0b\x63\x76\xbc\x98\x36\xbb\xed\x5f\xbf\x26\x24\x31\xe6\x16\x6d\x88\x99\x17\xfb\x9d\xe4\x95\xda\x5d\xce\x55\xbe\x3f\x34\x3b\x2b\x1b\xce\xdc\x58\xc6\x4d\x89\x0b\xb7\x76\xd4\x2b\xb6\x47\xa8\x10\x21\x73\xe4\xd6\xda\x18\x7d\xbc\x95\x12\xaf\x74\xea\x46\x68\x12\x87\x46\x10\xa2\xd3\x5a\x71\x8e\xaa\xff\x49\x9e\xac\x49\x1c\x1b\x21\xe1\xd3\xc0\xe5\x4c\x93\x38\x31\x48\xa5\x36\xe1\xb2\xc5\x04\xa4\x31\x55\x3e\x73\xd5\x24\x96\x21\x37\x58\x52\x34\x12\xb5\x4f\x7c\x58\x12\xd7\x24\x49\x35\xd6\x70\xe7\x79\x23\xdb\x58\xe2\x72\xf2\xa1\xa3\x26\x49\x96\xe1\x86\xe3\x76\xcf\x6d\x39\x87\x02\x10\x15\xea\xc0\xed\x9a\xa4\x84\xa3\xe4\xeb\x7b\xde\x1c\x72\xfb\x5a\x59\x19\x6d\x3b\x82\x65\x99\xb6\xcc\x73\xeb\x67\x66\x82\x72\x1b\x21\x6b\xc2\xb8\xe9\xa8\xa3\xe4\x51\xd9\x5b\x2b\xff\x11\xfa\x21\xe0\xa9\x7a\x73\x68\xfa\x4d\xb5\xd1\x2d\x6b\x07\xea\x1e\xa7\xcf\x2c\xff\xcf\x50\x19\x06\xf6\xb0\xe8\xa4\x49\x46\x53\x6a\xb5\xbf\x67\x9f\x4a\xcc\x7c\x91\x88\x6a\x92\xc5\x42\x0b\x57\xff\xd9\x40\xa1\xe6\x9f\x5c\x59\xc6\x95\x51\x2e\xad\x78\x5e\x3c\x0c\xcb\xc8\x9a\x64\x42\x51\xe5\x85\x87\x9f\x2b\x98\x30\x9b\x6f\x47\x81\x99\x10\xa8\x1e\xf7\x93\xbf\x41\x3d\x95\xdc\x69\xc2\xa9\x31\x4b\x16\xb9\x52\x50\xa1\xae\xbd\xc7\xb2\x6a\x22\x12\x6a\x2a\xf7\x46\xf4\x72\x89\xc2\xca\xca\xe8\x7b\x0f\xe7\x87\x50\x0c\x69\x1c\xef\xbc\x68\x67\x91\x3b\x81\xcc\x22\x57\xf5\xf8\xdb\xa5\xca\x6b\x65\x5b\xdd\x7f\x0c\x6e\x8d\x54\x21\xd6\xee\x67\x7e\xfa\x5f\xc9\xa7\x0e\xaf\x5a\x85\x31\x78\xc1\xfe\x2e\xdb\xf1\x79\x88\x26\x8a\x67\x11\xae\x44\x65\x79\x2c\xb5\x5e\x15\xb2\x82\xae\x4e\xa8\x09\x28\x12\x5a\x6e\xde\xf7\x5c\xbe\x3e\x69\x3d\xd1\xa0\xd6\x44\x93\x08\xe3\xf7\x4b\xe1\xbd\x3e\xbf\x42\xd3\x5c\x3f\xcc\xf6\x71\x6a\x87\x46\x50\xd0\x05\xf2\x9a\x92\x40\xa2\x48\xa6\x85\xba\x39\x5e\x83\x0b\x80\x35\x25\x3c\x94\xb6\xfa\x55\xf3\xa3\x69\x1a\x0e\x50\x38\x9a\xd2\xc4\x30\xb7\x51\x41\xb2\x90\xc3\xb5\x92\x46\x56\x58\xa4\x6a\x17\xc0\xb0\x17\x5c\x6b\x1a\xf3\x00\x93\x7a\xd3\xc5\xff\x7a\x59\xa4\x31\x4f\x7c\xc7\x7a\x71\xb7\x6b\xc3\xfa\x5d\x38\x50\x84\xd1\x34\xe1\x06\x97\x5a\x01\x8a\x38\xcd\x8c\x27\x7c\xfd\x89\xd6\xb7\xa6\x69\x68\xfc\x78\x2f\x45\xed\x65\x36\xf9\xb4\xd5\xbb\xa6\xa9\x20\x88\xfe\xc2\xea\xfc\xe8\x16\xa4\x22\xcd\x54\x47\x0d\xb9\x12\x77\xd6\xb4\x8d\xb1\xda\x37\xef\x66\xf5\x6d\xf5\x7c\x3f\x5b\x2c\x6f\xdc\x67\x19\x51\x68\x78\xf8\x7a\x51\x65\x3d\xfa\x14\x4b\x15\x6a\x3b\xd5\xa8\x4a\x38\xcc\x38\xdc\x10\x11\x27\x56\xc5\xe1\x7b\x21\x9f\xa1\xc2\x26\x46\x0d\x1d\x71\x50\x53\xa6\x29\x91\x9d\xd2\xc3\x27\xf8\xff\xd1\xef\xcd\x68\x10\xa3\x72\xc2\xa5\x90\x87\xa7\xcb\x10\x2c\x69\x4d\x3e\xdb\x6c\x24\x41\xdb\x84\x6f\x7c\xcf\xab\xbc\x5f\xea\xd0\x94\x07\x3c\x0d\x1d\x8d\xed\x7c\x2c\x3f\xa0\x9a\xbd\xed\xd7\x1c\x89\xfd\xd3\x5f\xca\x23\x49\xfb\x06\x38\x3d\x6d\x8c\x7a\xa4\xa1\x37\xbc\x53\x9c\xa5\xa8\xaa\x79\xb6\x75\x8e\x07\xfe\x0a\x33\xf5\xf6\x05\xcd\x4e\x53\x41\x21\xa6\x5e\x24\xb1\xbc\x85\xf7\x3e\xb9\x43\x53\xc1\xa4\x0c\xbb\xa4\xb4\x9e\x7f\x8c\xe6\xb6\x10\xc6\xa0\x51\xf1\x0f\xb4\x74\x1d\x3d\x3d\xa1\x35\xbe\x18\xbb\xbe\x82\xe6\x70\x88\x0c\x62\x2c\x66\xdc\x95\x47\xfe\x70\x29\x54\xe9\x4e\x2d\x21\xb2\x35\x8a\xd5\xf6\xc9\x19\xd1\xbb\x83\x20\x64\x64\xa4\xdb\xa0\x7d\x92\x45\xf3\xed\xe2\x3d\xbc\x34\x05\xa9\x81\x0c\x00\x88\xdd\x6a\x4a\x35\x31\xed\xbe\x33\x2e\x58\xbd\x49\x12\x90\x98\x23\x83\x1f\xb5\x68\x9f\xd7\xab\xc5\xb2\x3b\x22\x99\x83\x6e\x56\x5c\x1e\xf3\x7f\xc3\x82\x1f\x8f\x02\x1d\xac\x7b\x39\x53\x3b\xd2\xa8\x72\x99\xd8\x6b\x5e\x96\x47\xe0\x6e\x3a\x04\x54\x45\x19\xf3\x5e\x17\xed\x35\x0d\xee\x45\x10\x6a\xe3\xe8\x68\x66\x69\x05\x03\x6e\x97\x0e\xa2\x90\x49\x61\x05\xbb\x6f\xaf\x0b\xaf\x76\x54\x2c\x29\x52\x6a\x50\xd5\xc6\x28\xb1\xcf\x3f\x0c\x55\x6b\x38\x30\x21\x19\x58\x87\x4e\x8b\xf6\x01\xb4\x26\x9d\x48\xa5\x75\x90\x68\x99\x76\x5a\x79\xc8\x1a\x77\x64\x0a\x1d\xa4\x99\x99\xe6\x0b\x5e\x1f\xfa\x33\x7b\xf8\x7d\x2c\x4e\x71\xad\x79\xcb\xe1\xfd\xf6\x52\x48\xf7\x69\x26\x23\xec\xf9\xe6\xf5\x4a\x96\x3d\xc6\xaa\x3d\x9c\x11\xb3\x02\x2c\x7f\x9d\xf3\xf6\x66\x58\xf1\xf9\xfe\x3b\x18\x64\x21\xe0\x5d\x77\x9e\x7b\x79\xd1\xb5\x19\xdc\x90\x48\x78\x87\x9c\x95\x59\x3c\x83\x64\x78\x7f\x33\xa6\xb3\xd0\xaa\x64\xe2\x67\x87\x4a\xc1\x3a\xe0\x51\xca\xda\x5b\xfb\xfd\xaf\xc5\xee\xc7\x72\xbd\xba\x5d\x2d\x66\xdb\xd5\xd3\xe3\x6e\xf9\x78\xb3\xeb\xa0\xc7\x3a\xe0\x00\xdc\xd9\xb0\x7e\x9c\x61\x34\x47\x04\x49\xcc\x6e\xef\xab\x7f\xa1\xfb\xa0\x60\x0c\x9c\x17\x05\xfa\x77\x1e\xd0\x6b\xfb\xec\x8e\x4b\x9a\x60\xfe\x74\xae\x50\xaf\xe6\x7b\xf9\xf6\x69\xaf\x56\x07\x32\x92\x9c\x39\x81\xca\xba\x19\xfc\x14\x20\x14\xe3\xa0\x36\x33\x71\x98\x2f\xd5\x1d\x04\x69\xd2\xe1\x13\x6f\x83\xc4\x9e\x02\xb1\x0e\x20\x63\x48\x3c\x7d\x2e\xf3\xba\x36\xfa\xc0\xee\x90\x8e\x09\x32\xe6\x17\xf7\xb3\xd5\x83\xf1\xc1\xf8\x31\xbb\xdf\xdd\xcc\xfe\xb2\xb8\x35\x1d\x12\x12\x63\x12\x65\xfc\xdb\x0e\x55\xf9\xee\xe9\x62\x3a\x24\x54\x30\x67\x27\x03\x0d\x57\xbc\xe1\x77\xbc\x3e\x0c\x9e\x52\x48\x45\xc4\xc8\xc8\x39\xea\xcb\x75\x3c\xa4\x52\x60\x32\x82\x84\x15\x2c\x19\xd9\x68\x6d\xa2\x5f\xfb\x75\x20\x11\x06\xda\x90\x7d\xf3\x7a\x63\xec\xa0\x17\xe5\xe9\x7c\x84\xee\xde\x85\x61\x98\xc6\x5e\xfe\xb5\xb9\x54\x05\xa8\xde\x2d\x0a\xc3\xc8\x90\x4b\x3d\xa8\x65\x8d\x50\xee\x95\x1a\xfe\xc8\x50\x52\x4c\x81\x96\xcd\xe1\x52\xc1\xc9\x7d\x3a\x0a\x8d\xce\x89\x11\xd5\xe4\x45\x5e\x0f\x9c\xa6\x26\x4b\x70\xee\xa3\x59\x88\xb8\x53\x1b\xe7\x60\x36\xd6\xef\x83\xe8\x30\x61\x54\x5b\x5c\xce\xf7\xc7\x45\x6f\x61\x0c\xd3\x28\xc6\x47\x0e\x26\x79\xf1\x8c\xae\x1d\x1f\x75\x47\x70\xa8\x12\x3e\xc1\x97\xaf\xf5\xfc\x63\x56\x35\x13\x9e\x38\xa3\x1b\x9b\x0a\xe3\x77\x56\x7b\x4b\x54\x9f\x1b\x85\xa9\x36\x35\xd8\x36\xea\xc7\x7c\x6c\x5b\xae\xcb\xe3\x98\xb2\x3e\xf8\xb5\x8c\x18\x93\x86\x76\x26\xb5\x91\x3e\x72\x87\xa7\xb0\x83\x6e\x7c\x62\xec\xe6\x6d\x83\xa8\xc7\x95\xd4\x21\xe3\x11\xba\x3c\x1a\x00\xe0\xcb\xe6\xc6\xe1\x28\xbb\xab\x67\x22\x63\xa4\xa7\x31\xe1\x59\xe4\x79\x59\xf4\x85\x24\xdd\x70\x88\x11\x62\x66\x15\xb2\x3d\x6c\x6f\x38\x2a\x23\xc6\x08\xe5\xef\x7f\x2d\x16\xee\x5a\x78\x10\xa5\x41\x07\x33\x47\xea\xe9\xf4\xdb\x1f\xf2\x8c\x61\x54\x85\xfa\x90\xa3\x7d\x3b\xe4\x2a\xc1\x8d\xff\x3b\xff\x28\xbf\x6c\xfc\x4c\x35\x58\xba\xea\x9d\x0e\x85\x32\x32\xcb\xca\x92\x4a\x3e\xb9\x18\x19\x18\x8f\x90\x0a\xfe\x09\xb2\xb9\x2b\x2f\xce\xd9\xb4\x3d\x24\x03\xd6\x83\xdf\xf8\xbe\xec\x44\xd7\x5c\x87\x52\x44\xc8\x97\xb4\x0f\xca\xbc\xc8\x5d\xc6\x11\x4a\x65\xb4\x24\x1b\x87\x6c\xac\xe7\x1f\x43\xeb\xcd\xe1\x85\xa9\x58\x62\xc9\x66\xb5\x78\x7a\xe6\x97\xba\x7b\x8f\x15\x28\xdc\x0c\xde\xca\x5f\xb7\x5c\xf8\xbf\xea\x48\xd8\x04\xb4\x53\x55\x42\x55\x29\xb3\x1f\xb9\x4c\x35\x04\xca\xb0\xe4\x04\x85\x32\xb2\x69\x26\xc9\x1e\xa1\xd2\x74\x08\x91\xa2\x16\xb3\x34\x6b\x5e\x1f\xcb\xf7\xdb\xb2\xb2\xd4\x8b\xe1\x0f\xd7\x61\x98\xb1\x7e\x8b\xa2\x50\x6d\x08\xb2\xfc\x75\xe6\x58\x18\x1b\x3f\xb7\x21\x89\x6f\x74\x2e\x46\x31\xa5\xb1\x04\x6f\x6f\xca\xfd\x49\x52\x65\x3e\x15\x91\x48\x20\x91\xdb\x52\xd0\xf1\xd0\xc8\x9a\xd9\x8d\x54\x19\xb6\x8d\x15\x1c\xf9\xc7\x4d\x59\x3c\xf7\xe5\x7c\x47\x67\x0d\x69\xe2\xf4\x65\x6f\x40\x43\x61\x29\x02\x58\x31\x73\x43\x98\x49\xff\xd6\xb9\x3c\x3c\xe6\xfb\x3d\x77\x73\x27\x8a\x88\x8a\x53\xdf\x66\x6a\xa7\xd6\x1a\x30\xf1\x1d\x7e\x47\x14\x4b\x14\x63\xab\x2f\xa2\xcb\x71\xfa\xeb\x45\x14\x69\x89\x5b\xc4\xae\x3d\x53\x99\x8f\x79\xba\x3a\x8a\xc3\xcc\xf8\xcd\xcf\x1f\x6e\xfa\x21\x7e\x14\x0b\x16\x3a\x25\xc8\x2a\x3f\xf1\xea\xc3\xd6\x34\x07\xe7\x8f\x41\x62\x81\x12\x4e\x79\xd3\xbe\xb4\xbc\xc7\x47\xb2\x43\x12\x92\xe0\x84\x43\xdd\xd7\xe7\x4b\xbb\xb9\xe4\x8d\xd3\x3f\xd5\x51\x12\xc7\x68\x65\xd4\x06\x36\x47\xf8\x18\x5c\x43\x9a\x44\xa9\x53\xaa\x5e\x7c\xc5\x6d\xd6\x11\x23\x1a\xf3\xb4\x73\x55\xb6\x71\xd6\x34\xf6\x52\x47\x2c\x91\x3c\xf1\x65\xb5\xc5\x21\x17\xf9\x6d\x59\xdd\x5e\xea\xb1\xc5\x8b\x8e\xb2\x50\x42\xd2\xc9\x96\x19\xbc\xa7\x9d\xa4\x5c\xe4\xc7\xbc\x71\x3b\x4c\x94\xa5\x31\x66\xa7\xb5\x6d\x3a\x6e\x3f\xa9\x2f\x8c\xa6\x48\xc6\xb4\x95\x8f\xbf\xea\x06\xea\x88\x53\x19\xdb\x98\xd9\x58\x00\x8c\x8f\x67\x09\xde\xf9\x3e\x02\x6c\x5b\xfe\xe0\x97\xe3\x6f\xb6\xa4\x88\x0b\x8a\xa8\xb5\x93\x11\x07\xbf\x2d\x2b\x77\xbd\x6b\x68\x1f\x6e\x57\x1a\x64\xee\x13\x90\x30\x13\x24\x9b\xe3\xc6\xb3\xaa\xcb\x92\x23\xae\xcd\x2c\x3a\x77\x84\xfc\xe9\xef\x16\x3a\x55\xc6\xb0\x0b\x2a\xf8\x35\x8c\x1f\x23\x99\x12\x2c\x4d\x2d\x37\x8b\xf5\xd3\x4f\xc7\x59\xb4\x62\x2c\xee\xab\x54\x4c\xf1\x5e\x2f\x0e\x20\x5f\x57\x0d\x9c\x96\xbf\xf2\xfa\x6a\x5a\xab\x84\x63\xa0\x7a\x5f\xee\xd7\x50\x5f\xbc\xd6\x83\x8e\x14\xa7\x48\xbb\xde\x97\x47\x75\x0b\xe0\xff\x2c\x52\x8c\x1b\xb1\xf8\x67\x00\x13\xa3\x53\x42\x94\x60\x3a\x5e\xb5\xa9\x87\xc5\xf3\x4d\xd0\x82\xda\x81\x2c\xca\x86\xad\x34\x93\xa6\xb8\xe3\x32\xe6\x69\x5f\x27\x19\xc3\x45\x7f\x54\x05\x98\x76\x73\xa5\xb6\xa5\x87\x7e\xe1\x66\x3f\x22\x22\xb7\x63\x63\x83\x11\xef\x5b\xd3\x63\xff\x26\xe8\x4e\xa7\x52\xe7\xb4\x77\x3c\xce\xd4\x4a\xd5\xf3\x8f\x36\xe7\x1d\xbd\x18\xa0\x33\xc7\x6d\xdb\xc2\xaf\xf1\x42\xa3\x55\x8a\xbb\xcf\x7c\xbb\xf0\xee\x5b\xf6\x1b\x62\x22\x53\xe4\xd6\xdf\xae\xfe\xf4\xa5\x8f\x98\x0a\x41\xbb\x35\x75\x5b\x01\xaf\x2f\xd5\x90\xe9\xaa\xe3\x40\x4b\xee\xf7\x34\xb3\xe3\x3d\x43\x85\x17\x67\x47\x84\x11\x35\xc2\x1c\x18\x55\xe7\x27\xec\x4b\x85\xfe\x68\x92\x21\x62\xe5\x66\x79\x3b\x7b\xb9\xdf\xee\xd6\xcb\x1f\x4f\x8b\xd9\xfc\x7e\xe9\x07\xa4\xbe\x7e\xd5\x26\x0a\x3f\x7d\x75\x2c\x0e\x05\xc5\x92\xcf\xce\xa9\xe8\x4c\x6e\x0d\x71\x1c\x0b\x54\xcb\x80\x4a\x06\x04\x1b\x0e\xee\x04\xb1\x30\xdc\x49\xd9\xe6\xc1\xc3\x20\x24\x8e\x05\x4b\xf5\x27\x8d\x7c\x3b\x24\x89\xba\x78\xc7\x36\x8b\x71\xdf\x75\x9d\x50\x1d\x27\x31\x55\xb6\x84\xf8\xc8\x4f\x70\xe8\xf2\x85\x01\xec\x49\xc7\x89\x24\x78\xaa\xcd\x6a\xb9\x38\xf0\xee\x27\x26\x92\x38\x11\xec\x2d\xf0\xd3\xed\xa5\x50\x56\x18\xf8\xcb\x72\x5c\x9c\x48\x93\xf4\xfe\x28\x8f\xaf\x75\xfb\x3a\xb8\xb9\x14\xa7\x21\xc7\x84\xf6\xe5\x71\xf3\x74\x7f\xb3\xc3\xff\xac\xdb\x44\xd1\x0d\x60\x81\x01\xe4\x1d\xca\xf7\x87\x8b\x3c\x38\xbe\x50\x37\x57\x98\x30\xfc\x0c\x7e\x3c\xfe\xfd\x02\xd5\xc7\xca\xa7\x5f\x71\x16\x08\x4c\xef\xb7\xeb\xd9\xe3\xe2\x6e\x19\xec\x66\x8b\x45\x67\x33\xd8\x1e\x97\xae\x33\x73\x7f\xff\xc3\x24\xba\x34\x18\xde\x55\x1e\xc4\x28\xb8\x87\x53\xb1\xbd\x34\x3f\x13\x78\x60\x64\xbd\x8b\xb2\x59\x15\xfe\xad\xc2\xc6\x93\x1f\x12\x45\x58\x0b\x71\x6a\x7d\x3f\x0f\xe8\x42\xa0\xfa\xfd\x9f\x98\x43\x18\x1a\xe4\x03\x76\x9e\x4c\xcd\x76\x38\xab\x45\x64\x24\xe0\xe1\x0d\x8a\xc6\xd4\x9c\xaf\xed\xa8\x47\xf7\x5c\xc4\x04\x4b\xd4\x4d\x39\x0f\x03\x0b\x53\x9f\xac\x55\xc6\x82\x87\xd2\x30\xf0\xbe\xbd\xdc\xcf\xd6\xbb\xed\x5f\xcf\x4b\xff\x80\x04\x4f\x33\xdd\x0b\x39\x1f\xe1\xdd\x36\xaf\xa7\xab\x65\x83\xdc\x22\x16\x1a\x50\x5d\xc6\x86\xed\xff\x11\x3c\x54\xc7\x8a\x19\x8a\x9b\xb1\xab\xa9\x8a\x6f\x97\x8f\xf6\xb9\x6f\xab\x8b\x0f\x74\x62\xa5\x15\xd6\xa2\x6d\x03\xca\xbc\x48\x5f\x01\x6f\xa6\x79\xa3\x3a\x46\xe1\x6e\xdc\xf4\x74\xbb\xd1\x59\x65\x6a\x7b\x50\x13\x95\x98\x86\x7b\xbb\xe0\x7b\xde\x8a\x8e\x35\x4d\x05\x75\x0b\xf2\xe9\xdc\xc0\x8e\xf9\x43\x19\x0d\x8c\xa9\x07\xe2\xbe\xd6\xce\xbb\xc8\x08\x96\xdb\x51\x09\xa1\xdc\xa9\x22\xdc\x95\x97\x1a\x16\xbc\x52\xb5\x65\x5f\xb9\x21\x41\x80\x0a\xdc\x7d\xbd\x8f\xc9\x1b\x96\x10\x11\x10\xee\x88\x54\x13\x3b\xe5\xe0\xa1\x24\x44\x88\x54\x9a\x5b\x77\xfc\x30\x35\xfa\xd3\x94\x2e\xe4\xf0\x46\x25\x34\x26\xd2\x65\xeb\xd8\x9f\xbc\x54\xdf\xe1\xe3\x71\x48\x0f\xd5\x49\x90\x68\xca\x9d\x0c\x7b\x39\xf2\x4b\xd3\x49\x48\x82\xd8\x59\x3b\x5f\xce\x6d\x7c\xa0\xa1\xaa\xa0\x5a\x8f\x85\x4f\xdb\xa1\x11\x72\x14\xda\x1b\x2c\xcb\xbc\x58\xb4\xeb\x95\x3f\x26\x30\x17\xa9\x51\xe9\x78\xf0\xf3\x42\xae\x1d\x8e\xfd\x58\x7e\x2c\xca\xa2\x2e\xab\x26\xbf\x9c\x46\x67\x8f\xd2\x20\xf5\xd9\x37\x40\xfd\x54\x74\xf0\x33\x9d\x44\x59\xca\xc2\xab\x2d\x73\xbc\x5b\x26\x91\x0c\xb1\x69\xa3\x80\xab\x63\x5e\x40\x98\xc4\xfe\x0c\x2a\x40\x96\xf3\xe3\x62\x36\x5b\x1c\xf8\xe9\x9c\x97\x45\x47\x1a\xd2\x49\x1c\x09\x6a\x23\xb5\xaf\x2c\x51\x46\x4f\x3a\x4e\x19\x9e\x75\xbd\xbc\x7d\x79\xbc\x69\x03\x99\xd5\xd3\x8d\x3f\x65\x96\x62\x2d\x77\xd6\xbe\x64\x0e\x44\xb3\x38\x96\x17\x65\x5c\x36\x2e\x85\x07\x9c\xe8\x24\xb1\x96\x2c\xb7\xcb\xe5\x6e\xf1\x74\x7f\xbf\x5c\x6c\x9f\xd6\xfe\x20\xd7\xc4\x90\xdc\x2b\xb5\x6b\xf2\x86\x17\xf9\xe5\xb4\x43\x5d\x06\x3f\x44\x1a\x14\xbd\xfb\x9e\x1f\x50\xed\xfd\xed\x4b\x14\xc5\x37\xf8\xf4\x54\xcc\xa6\x25\xbf\x47\xbf\x2b\xa5\x12\x73\x3b\xa3\xec\xd9\x47\xad\xe8\x84\x25\x66\xca\x9c\xf2\x7d\xc5\x1b\xb0\x3b\x23\xd6\xd0\xef\x61\xcf\xe5\xc7\x1a\xce\x57\x4f\x26\x8b\x75\x60\xd4\x4d\x6e\x8f\x1f\x5d\xdd\x2c\xe1\xa9\xe1\xf8\xa3\xcb\x62\x5e\xda\x18\xa1\x87\x08\xd4\x09\x07\x62\x52\x3e\x5e\x18\x78\xfc\x0d\xbc\xc1\xb1\x3c\x43\x65\x6e\xe3\x73\xe7\x8e\xad\x13\xc5\xb2\xd8\xe8\xce\x9b\xf5\xf1\xa9\xb8\x42\x4d\x0e\xe7\x1d\x48\x86\x41\xb6\x6b\x5a\x3c\x96\xc5\xb6\x3c\xbb\xd5\x61\xf2\xee\xa4\x24\x4a\x30\x77\xf3\xda\x1b\xb7\x4f\xeb\xdd\x76\x39\x7b\xb0\x57\x91\x52\x4d\x11\x3d\x27\xbd\x47\xfe\x7f\xb6\x4b\xa4\x41\xcc\x50\x68\x70\xd7\xc6\x04\xf0\xbe\xac\x9b\xfc\xd4\x8b\x53\x2d\xe2\xd3\x0e\x0e\xd3\x04\xd1\xd0\x47\x7e\x29\xe4\xa1\xf7\xba\xa4\x11\x97\x08\x67\xc1\x84\x6c\xa8\x98\xa0\xd3\x38\x8d\x91\xb3\x72\x9b\xff\x02\x5b\x47\xbb\x16\xea\xfe\xfa\x32\x13\x12\x62\xe6\xe8\x80\xa9\x23\x07\xdf\xc1\x1d\x4e\x13\x6a\x02\x21\xc9\x8b\x35\xd2\x20\x5e\xb6\x7f\x3e\xdd\xf5\xab\x5a\x43\xd0\xb8\x4e\x93\x20\xc2\xc6\xca\xc3\x3f\xcb\x63\x91\x8f\xfa\x75\x69\x12\x1a\xf8\xc9\x3b\x0a\x6c\x2f\x86\x4a\x6f\x3a\x4d\x84\x42\xfc\xe6\xd1\xd5\x8d\x77\x6f\x94\xf9\x83\x2a\x75\x68\xea\x36\x94\xf6\x1b\x48\xca\x22\xc5\x53\x2f\xff\x39\xec\x5e\xa4\x2c\x09\x0d\xa3\x62\xb6\x59\x76\x84\x78\x9d\x66\x44\xb8\x35\xcb\x88\xd1\xbe\x14\x39\x7a\x01\x3d\x73\x94\x8e\x40\x0c\x5e\xbf\xa0\xd6\xfe\x6a\x83\x7b\x72\x67\xa0\x29\x12\xb4\x2b\x07\xd6\xa6\xae\x90\xeb\x9f\x72\x46\x59\x68\xb0\x6a\x5d\x05\xc6\x0c\xe8\x01\x00\xfb\x74\x7a\x9d\x66\x41\xe6\x1a\x06\x4e\x40\x70\x84\x72\x49\xb3\xd4\x64\x69\x79\xdd\x46\x8d\x98\xf0\x8c\xa2\x9c\x34\x63\xb1\xd4\x9d\x43\xf1\xe6\x66\x7c\x5c\x0a\x0c\xd7\x1e\x66\x8f\x77\xb3\xed\x76\xf6\xf8\xbc\x7e\xfa\xf3\xaf\xfb\xe5\x9f\xab\xc7\x6f\xdb\xa7\xc7\xd9\x0f\x17\x9a\xa5\x82\x86\x99\xed\xc5\xdd\x97\xf2\xda\x6c\xb5\x1d\x91\x22\x4f\x63\x03\xcd\xe5\xec\x1c\xc0\x7a\x97\x2b\x69\x94\x75\x76\x76\xd3\xc5\xf2\x54\x85\x26\xeb\xad\x2f\xc2\xab\x8f\xf4\xc1\xb9\x3a\x55\x29\xa5\xe0\xc4\x0e\x11\x87\x6e\x2c\x89\xa0\x5a\xa9\xfe\xd7\x29\x69\x9c\x11\x3b\x51\x75\x53\x88\x73\x87\x81\x32\xe3\x5f\x50\xa8\x23\x74\xe0\xc1\x1b\x30\x8a\x12\x9f\x2c\x1b\x5a\x01\x03\xdb\x04\x43\x83\xaf\x7a\xaa\x8c\x6f\x06\x33\xaa\x89\xc8\x3c\x4c\x09\x73\xf7\xfb\xb1\x2b\x88\x66\x21\x8f\x5c\xb1\xc3\xda\xe0\xb8\x03\x6d\x1a\xde\xd9\xdb\x9f\x2e\xa7\x11\x9e\xdf\x8e\x8b\x08\xc5\x44\x66\xb3\xbc\xbf\xdf\x6d\x9e\x6e\xb7\xbb\xfb\xd5\xc3\xca\x85\xe4\x2c\x62\x12\x83\x8c\xdd\x99\xcb\xd7\x07\xfe\x0a\xd8\x10\xf8\xb2\xf8\xc0\x62\x92\x24\xc6\x62\x51\x1f\xe1\x97\x3b\x53\x1c\x02\x42\x7a\x1f\xee\x17\xfd\x02\x10\x8b\x65\xdc\x99\x6d\xa9\xdf\xc3\x23\xec\xc7\xda\x15\x88\xb8\xc6\x88\xe9\x56\x2c\x9b\xc3\x4a\x5b\x35\x8a\xd1\xe0\x50\xa2\xb3\xee\x3c\xbf\x2e\x36\x4e\x3e\x2a\x96\x24\x14\xf9\xfb\xf0\x2b\x1f\xdf\xb1\x24\x53\x58\xcd\xac\x1b\x38\xdf\x96\x97\xea\x8f\xe1\x51\xa9\xd0\x85\xf2\xcc\xab\x1a\xee\x4b\x5e\xa0\xe2\x73\x1b\x4d\xf9\xe5\xf1\x1f\x94\xfc\xb7\x9d\x96\xff\x88\xdc\xe3\x4e\x94\x51\xf1\x50\xd5\xa5\x78\x2d\xba\xd5\x8e\x25\x3a\x45\x55\xfc\x77\x4c\xec\x9e\x8f\xbc\xd1\x65\xe5\xc2\x56\x96\xa6\x29\x35\xa0\x09\x74\x00\x7b\x29\xf8\x3b\xaf\x14\xa8\x87\xd5\xbd\x3f\x43\x9a\x05\x41\xd6\xd9\x1d\xd7\xd7\xa5\x01\xc6\x12\x8a\x80\xca\xb2\x38\x1a\xbc\xdd\xac\x50\x8f\x6d\x1e\xe5\x21\x5a\x2c\x93\x46\xa2\x23\x2f\xf2\x66\x9b\xf7\x3c\x0d\x26\xe6\xae\x60\x1a\xc7\xde\x83\x1a\xeb\x8f\x69\x26\x32\x43\x89\xdf\x43\xb3\x3a\x21\x13\x72\x5d\x96\x4d\x9f\xb8\x3b\x0e\x78\xfd\x79\x65\x90\xe0\xcd\x55\x15\xdf\x97\xc5\x94\xb5\x89\x66\x2a\x0a\xac\x0e\xb1\xeb\x0c\x0f\xed\x29\x34\x53\xb1\x71\x8e\x3c\x5f\xa6\x35\xa4\x34\x53\x5c\x83\x71\x72\xa8\xcb\xa3\x9a\x19\x37\xc0\xbc\x2c\x7a\x44\x5e\xcd\xb4\x92\x58\x4e\xaa\x2f\xf5\x19\x46\x78\x4a\x9d\xd1\x28\x92\xbe\xf0\xb1\x33\x3e\xba\xbb\xb2\x9d\xe0\xbb\x73\x79\xfe\x8a\x42\xa0\x33\xaa\x85\xe1\xfa\xd7\x1b\x24\x91\xce\x47\x55\x95\x2c\x88\x0c\xf0\x60\x27\x8f\xc0\xad\x6a\x9b\x8b\x2f\x06\xbf\x24\x0b\x22\x19\x39\x2b\xc9\xd1\x15\x06\xb1\xf1\x80\x77\x81\xcf\x06\xda\x38\xe5\x7f\xc2\x30\xd5\x59\x18\xc6\x91\x87\xa4\xfd\x28\x1b\x78\x2c\xef\x7b\x9c\x82\xeb\xa9\x91\x85\x51\x88\xfd\xb8\xf3\x91\x7f\x98\xf4\x6a\x73\xe9\x5e\xb1\x6e\x98\x02\x64\x27\xdb\xd2\x27\x25\xc4\xaa\x09\xb8\xab\x8f\xac\x55\x63\xbb\x27\xba\xf5\x71\x20\xea\xae\xb3\x28\x0b\x59\x27\x46\xe8\x7c\x12\xa7\x52\xb0\x2c\xca\x38\x86\x98\xd0\x1c\x78\x7d\x18\x05\x4c\x59\xc4\x99\xb6\xe9\xdc\xcf\x2a\x6f\xe0\xda\xb7\xda\x5f\x77\xac\x12\x6c\x44\x72\xab\x04\x63\x63\xe3\xd1\x53\x89\x55\x86\x0c\x3b\x0c\x0d\x46\xf8\x90\x2c\x49\x39\x16\x29\x56\xb5\xdb\xbb\xd5\xa8\x49\x6a\x07\xa6\x2c\x46\x17\xb7\x1d\x56\x98\x7a\x5d\x87\x2c\x05\x23\xf2\xad\x72\xb5\x28\x11\x67\x39\x39\xcf\x33\x16\x19\xf8\x82\xd1\xe4\xf2\x42\x12\x3a\xcb\x80\x62\xd2\x98\xd7\x26\xc4\xee\x84\x68\x75\x96\xe9\x10\x29\xfe\x0f\xfc\x43\xc0\x33\x54\xed\x72\xd4\x3f\xce\x25\xe9\x4b\x90\xd6\x9b\x86\x37\xb9\xec\x60\x6b\x99\x88\x98\xf0\x44\x46\xcc\xd5\xb3\x41\xb8\x95\x09\x9d\x61\x9d\x08\x4b\x82\xce\x4b\x64\x30\x42\x06\x21\x66\x56\x3b\x05\x0d\x54\xa7\xbc\x80\xbb\x7c\xb2\xf9\x91\x49\x6b\x6d\xb1\x87\x06\xb7\x5c\x5f\xdb\x7c\xaa\xda\xcc\xc5\x5c\xe2\x00\xb1\xe9\x3e\x28\x0c\xfe\x07\x35\x6f\x7c\x9b\xd3\x1e\x54\x34\x44\xed\x52\x9c\x9c\x79\x59\x6c\x64\x3f\x61\x77\x83\x02\x82\x26\x6e\x2f\x45\x3e\x2f\xdf\xfb\x9b\x5e\xa6\x42\x8a\xaf\x25\xbf\x34\xe5\x3c\xaf\x46\x6a\x1f\x3a\x53\x9a\x20\xa6\xbb\x7d\xa5\xd6\xf0\x06\xfc\x38\xd1\x26\x9b\xdc\x18\x33\x1d\x1b\x6f\xac\x63\x9b\x24\x0d\x20\x51\x9c\x48\x8a\x7d\x98\x1b\x38\x42\x03\xed\x36\x60\xfc\x6c\x87\xd7\xcd\x89\xcc\x10\x4b\x5c\xc0\xfb\xe2\xd0\x49\xff\xda\xa3\x41\x40\x30\x4f\x35\x3e\x29\xcb\x7f\x91\xc1\xca\xdd\x6b\x4c\xf3\x20\x62\x28\x96\xb1\x81\x66\x33\xdb\x96\x4b\xff\x5a\x8d\x4e\xc8\x14\xf2\xc7\x5d\x77\x70\x9d\xef\x0f\xcd\x4a\x7b\xee\x9f\xe7\x5d\xf4\x17\x71\x1e\x46\x86\xf6\x70\x46\x49\xac\x4e\xb7\x51\xf3\x30\x33\x4e\xbb\xed\x9e\x3b\x53\x6a\xf4\x6d\xa1\x0e\x71\xe9\xe4\x4a\x5d\x87\x53\x3c\x22\x04\x67\x5e\xcf\x6d\xdd\x9b\xc0\x59\x5d\xec\x3f\xfc\x50\x8e\x65\x8d\xfa\x72\x72\x15\x79\xe6\x8f\x45\x59\x90\xf8\xe0\xeb\x81\xff\x32\x84\x53\x13\xf9\x4f\x3e\x36\x1e\x49\x6e\x01\x52\xcd\x0d\x42\xbe\x4d\x36\x3c\xd5\x08\xe3\x31\xe7\x99\x1a\xaa\x3e\x98\x8d\xe2\x6e\x04\x62\xfa\x5f\xb2\x3b\xec\xd7\x24\x32\x44\x14\x3f\x8a\x1c\x85\x0f\xdc\xb8\x0b\x8c\x6e\x43\x22\x53\x23\xc0\x64\x12\xd6\x8d\xab\xe2\xbb\xe3\x69\x92\xe2\xcb\x6e\x0a\xe5\xf3\xf2\x97\x3f\xc0\x53\x24\xc9\x8a\xcb\xc7\x0a\x3d\x13\x67\xc7\xe3\xb0\xc8\xce\x53\x2e\x75\xe7\xc3\xde\xf9\xb0\x4e\xc0\xda\xed\x27\x58\x9a\x61\x5f\xe6\x52\xa0\x04\xb7\x85\xa2\x0f\xfc\x79\xc6\x9f\x90\x46\x4f\x1f\xd7\x1a\x4f\x9b\xd4\x3c\xe3\x86\x09\x8a\x19\xf4\xce\x6c\x21\x73\x5e\xc3\x2d\x8c\x2a\x68\x5c\xc4\x11\x56\x30\xe0\x17\xc8\x61\x46\xeb\x06\x24\x01\x6e\x92\x0e\xdd\x88\x7e\x5d\xd7\xb4\x5a\x9f\x7d\x70\x21\x14\xa6\x95\x97\x22\x3f\xf2\x06\x2a\x7e\x74\x16\x97\x83\x57\x40\x00\x45\xf1\x00\x7e\x3c\x5a\xcb\x82\x35\x68\xff\xb2\xab\xd8\xb8\x19\x74\x32\xd9\x68\x34\x70\xb9\xc6\x28\x73\x95\x09\x54\x70\xc5\xf4\xb6\x57\xc6\xe0\xca\x86\x38\x16\x78\xd3\xcf\x64\xfb\xec\x37\xcd\xb5\x66\x69\xb7\xd5\x62\x80\x39\xb8\x56\x41\x88\xd9\xae\xd1\x4e\x0d\x5e\xff\xeb\x0f\xf7\x77\x1e\x19\x75\xeb\x8f\xba\x81\x93\x93\x60\xed\xc2\x5f\x41\x34\x20\xbd\xf1\xad\x6c\xc0\xbb\xc9\x6d\xdf\x5d\xde\x2e\x68\xcc\x8c\x4f\xc8\x81\x17\x05\x1c\x37\xa8\xb3\xf4\x19\x45\xd3\x24\xd6\x99\xbb\x28\xca\x8c\x38\x43\xfd\xce\xcf\xbd\x39\x2b\x68\x66\x6e\x2c\xce\x77\x4b\xc0\x18\x2f\x5e\x43\xe9\xd2\xee\x3f\x83\x37\x55\x50\x1e\x23\x5c\x6e\x96\x57\xaa\x2a\xcf\x0b\x5f\x0e\x72\x5f\x15\x86\x14\x3d\x5d\x3d\x34\x62\x40\x76\x19\x3c\x26\x11\x2a\x63\x5d\xfe\x0d\x9a\xc5\x21\x3f\xd7\xab\x62\x24\x9d\xa6\x45\x44\x33\x84\x1b\x99\x2e\xd0\xbc\xec\xee\x63\xac\x18\xf6\x6d\x14\x1c\x5d\xb8\x34\x2d\xc3\xab\x45\xac\x35\xea\x07\x3d\x3c\x6e\x9f\xdd\xc7\x53\x61\x7e\x08\x20\x80\x7f\x0b\xfc\x34\xf4\x11\xd0\x22\x83\x88\x38\x7f\x9f\xbc\xb9\x1c\x79\x5e\xc1\xce\xee\xef\x94\xb8\x51\x22\x8c\x62\xcb\x41\x74\x24\xfc\x31\x34\x78\x78\x31\x92\x48\x4c\x25\x50\x9a\xe2\xaa\x3a\x35\xd1\xe3\x10\x32\x93\xf1\xc0\x45\xcf\x6a\xd8\xe4\x50\x21\x8d\x70\x51\x16\x6f\xc6\x31\xee\x4b\x55\x55\x2d\x24\x68\x5c\xff\xe6\x7d\x7d\xe8\xff\x11\xf3\x4d\x0b\x95\xa6\x8c\xf7\x48\x22\x1b\x99\x43\xd1\x60\x37\xdb\x8e\x00\x92\x20\xfe\xea\x61\xf5\xb8\x7b\x7e\x59\x2f\xee\xda\x97\xf0\x69\x7b\xb7\x5c\x6f\x66\xf7\xcb\x8d\x1f\xc6\x4d\x5d\x73\x0f\xcd\x82\x17\x6f\xbc\xee\x03\x63\x6d\xdd\x47\xe8\x80\x21\xdb\x62\xe7\x62\xfa\x9b\xfc\x2d\x1f\xed\x1e\x32\xc8\xb4\x91\xac\xf1\x00\x7b\xe3\x8d\x6a\xbf\x49\x86\x41\x86\xb5\x43\x6c\x59\x0b\x2e\x5f\xb7\x87\x4b\x55\x2b\x3e\xc0\x6d\xc8\x90\x01\x41\xc0\xf1\x19\x0b\xfa\xf5\x21\x3f\x7b\x1a\xe7\x6f\xd9\xb4\x5a\x86\x42\xe0\x0e\x09\x85\xb2\x46\x27\xfe\xc4\x3a\xca\xc0\x81\x10\x73\x9c\x23\x1e\x9b\x31\xec\x8b\xd8\x0f\x44\x51\xd2\xe3\xae\x9b\x7a\xce\x0d\xe8\xaa\x34\xc4\xa9\xb1\xe0\x36\x73\x1f\x53\x09\xe2\xc3\x73\x23\xa3\x86\x10\x83\xd1\x99\xe3\x50\x8b\xd8\x53\xe7\xcd\x7c\xc5\x30\x70\x5b\x4e\x8a\x95\x6a\x19\x47\x21\x22\x82\x76\xae\x9c\x3d\x0a\x47\x65\x1c\x03\x76\x6c\x3d\x34\x3e\x2f\x8b\xe9\x96\xad\xfb\x40\xc2\x50\x26\x69\xf5\xf4\x67\x7f\xf9\x1d\x7f\x2f\xd7\xce\x5c\xeb\x27\x56\x45\x7b\xd9\x80\x8c\x35\x41\xe1\x75\x73\x83\xda\x90\xb2\xaa\xaf\xaa\x2c\xfd\x57\x48\x26\x94\x6a\xe2\xd2\x3a\xb4\xeb\xb6\x07\xd2\x20\x43\x74\xed\x4e\x5c\xae\xb5\x9d\x7b\x7b\x9e\x4c\x21\x41\xbd\xa3\x0d\x34\x2f\x9f\xab\xf0\x0d\x7f\x04\x63\xda\x70\x72\xf2\x13\xb4\xbb\xf7\x18\x0d\xe4\x86\x89\x04\x63\x63\x9c\xb4\x5c\xa9\x4b\xfd\x19\x42\x4e\x32\xad\x70\x2e\x99\xb6\xc1\xee\xc1\x58\x51\xa9\x1e\x39\x73\xf4\x78\x32\x42\x51\xa6\xe1\x4a\x4b\xb1\x3d\xc4\xf1\x2e\x62\xc1\xc9\xc8\x3b\x0d\x17\xae\x2f\x74\x00\xb5\xcc\x92\x84\xda\x36\x9b\x75\xab\x18\x9d\x9e\x47\x21\x6a\x5a\xdc\xde\xdd\x5a\x73\xb3\x91\xd6\x8c\x1b\x27\x09\x6e\xc9\x2f\x9b\x9b\x79\x8f\x0b\x24\x39\x44\xa6\xb3\x6b\x22\x81\x9e\x95\xc2\x27\x22\x27\xee\x73\x3a\x49\x12\xef\xd2\x3c\x4e\xb4\xa4\x20\x41\x64\xba\x87\xb2\x2c\x30\x62\xee\x6d\x94\x52\x04\x26\xc3\x7e\x28\xab\x6a\x98\xe1\x48\x29\x4c\x91\xde\x6f\x6c\xe7\xb3\x29\xa1\xe2\x2c\x61\xa3\x47\xaf\x42\x89\x8f\xfe\xc4\x7f\xcd\xa1\xe9\x43\x58\xa5\x52\x66\x2e\x1a\xd9\x1b\x9d\x57\x23\xa2\x86\xd4\x21\x47\x2d\x3f\xf4\x5e\xbb\x2d\xcb\x39\xf7\x4b\x99\x8e\x22\xd7\x87\xc5\x2f\x9f\xac\x18\x49\x1d\x87\x48\x99\xef\x19\x77\x4f\x4f\x27\x9d\x44\x28\xf3\x64\xa2\x9c\x25\xaf\x4c\x6d\x66\x72\xe5\x97\x5a\x44\x41\xd0\x53\x19\x76\x05\x9a\xf6\x5b\x26\x8b\xa8\xfd\xd7\x47\xcb\x08\xcb\xe1\xb3\x73\xde\xb7\xa1\xd3\x8a\x90\x08\x4b\x11\xc6\xb7\xa3\x43\x39\x58\xbb\xc5\x71\xdb\x4d\xd1\x30\x46\x28\x94\xe7\xc1\x3f\xf0\xe2\x63\x62\x37\xeb\xff\xeb\x82\x36\x45\x93\x4c\x75\x6a\x15\x28\x53\x3b\xe2\x00\xfe\x6f\xff\x75\x5f\x60\x5d\x16\x6a\xec\x0b\xbc\x8e\xa1\xf0\x5d\x48\xac\x82\xd0\x14\x15\x76\x27\xfe\x2b\x3f\x5d\x4e\xf3\x8b\x83\xe9\xa8\x20\x34\x7e\x5b\x0a\x35\x2a\xf8\x7e\x82\x53\xfe\x3b\x6c\xbc\x0a\x12\xa5\xa8\xab\xd6\x21\x5d\xe8\x8f\xd1\x00\xad\xb1\x3d\xe4\x82\x16\x1f\x3b\x8d\xef\xbc\x1d\x1f\x12\x65\x56\xd0\xbc\x68\xe6\x97\xe3\x17\x15\x31\x15\x66\x81\x33\xf9\x1b\x58\xab\x0e\x5f\x11\x15\x05\x09\x72\x8a\x6a\xae\x61\x14\x7b\xa9\x58\x88\xd0\xe8\xcd\x97\xe7\xb2\xd7\x7e\x18\x2d\xf2\x57\x06\xb2\x5a\xc5\x4a\xe1\x36\x3e\x7b\x7e\x5e\x3f\xfd\x58\xee\x9e\x7e\x3e\x3a\xdd\x2b\xad\x12\x6d\x9c\xdf\x35\xc0\xb0\xfa\xa6\xd2\x98\x22\xac\x15\x99\x46\xbb\xd5\xe2\xc9\xe1\x53\x14\x8b\x12\x92\xf5\x7e\xcd\xf6\x50\xc1\xe8\x85\x53\x2c\x21\x14\x06\x36\xbb\x6f\xb1\xff\xbc\x32\xe8\x1b\xb3\x59\xe5\xb2\x9c\x73\xf9\xda\x73\xfc\xf0\xc3\x62\x43\x62\x6d\xf8\x2b\x7c\xbb\xff\xf3\xb6\xac\xfa\x6c\x33\x7f\x36\x80\xc4\xd8\x1e\x9f\xce\x97\x06\x1e\xf9\x09\xad\x21\x97\xbf\x9a\x9e\x4a\x9b\x56\x9c\x19\x41\x8b\xdc\xee\xea\x86\xa6\x6a\x92\x2e\x7f\x2e\x2e\x13\x4d\x07\xcc\x2c\xab\x23\xdf\x95\xe9\xdc\x48\x6d\x18\xe4\xa6\x8a\x50\x01\xf4\x3b\xd4\x4a\xc4\xc4\xc0\x48\x3c\xd0\xf4\x08\x5f\xb1\xe3\x94\x88\x01\x97\xfc\x6f\x37\x8b\x99\x94\x84\xfa\x13\x25\xc6\xb3\xb3\xb1\xd0\xaf\xe1\x3e\xa9\x84\x32\xb2\x79\xcb\xf5\x22\x0d\xe8\xcd\xa5\xdd\xb6\x2e\x72\x6a\x47\xb0\x1f\x90\xb1\xc0\xd7\xfd\x7e\xf6\x38\x73\x27\x91\x2c\xb0\x02\xd2\x2f\x85\x82\xaa\x47\x65\xa4\x76\x84\x8a\x62\x04\x8e\x9a\x45\xa2\x9d\x99\xa6\xf9\x59\x7f\x66\x1b\xeb\xe7\x9e\x8a\x23\x44\xde\x61\x11\x7b\xba\x7e\xad\x54\x92\x39\x62\x47\x27\x91\x6b\x20\x3c\x79\xb1\xef\x29\xcc\x8e\x3e\x26\x89\x33\x6b\x9e\xe7\xaa\xdd\x10\x31\x59\xb2\x6d\xd3\xe1\x54\x02\x2a\x31\x44\xe7\x4a\x21\x35\x63\xfa\xe6\x40\x10\x75\x98\x4d\x8b\x1e\xbd\xc2\xa1\xb8\xb1\xdc\xa8\xbc\x14\xf0\xfe\xa3\xc4\xe2\x65\x2f\xf0\x54\x3a\xc9\xa8\x2f\x2c\x1a\x53\xeb\x42\xdd\xb4\x6f\xf3\xf0\x2c\x5a\x00\x15\x3d\x4d\xdc\x4f\x96\x5e\x33\x1a\x48\xa0\x51\x0b\x56\xe7\x15\xdc\xe6\xfb\x83\x95\xcb\xab\x91\x6a\x6d\x56\x33\xe6\xbb\x4d\x40\x62\x6a\x7e\x73\xfd\x51\xc8\x81\xa1\xce\xe8\xac\x19\xc1\x47\xf4\x08\xef\x86\x82\x35\x3a\x2c\x43\xe4\xca\xff\xed\x69\xf1\x7d\xf9\xd7\xa0\x73\x08\x44\x6b\x7c\xa7\x36\x4d\x59\xf1\x3d\xd6\x4d\xa6\xbf\x83\x52\xa3\x51\xee\xf3\x91\x76\x8b\x1a\x8b\x08\xb8\x49\x03\x94\x72\x25\x1d\xaa\x72\xe3\x1f\x3d\x73\x87\x99\x51\x8a\xdd\x61\x82\x89\xc7\x8d\xc2\xa6\x3b\xce\x99\x93\x75\x31\x0e\x25\x0b\x7e\x3a\xf3\x7c\x3f\x5a\xbf\x81\x2a\x99\x42\x4f\x50\xb2\xbf\x5c\x00\xd5\x80\x85\xf7\xbc\xc8\x1d\x37\x16\xdc\x5b\x09\x41\xa8\x11\xc1\xf1\x9e\x1b\xfa\x8c\xfb\x73\x1a\x23\xf8\x56\x5e\x8e\xe8\x02\x94\xbf\xc1\x4e\xc1\xe9\x52\xb5\x37\x67\x27\x47\x88\x5b\x08\x03\x82\x1d\xcb\xd3\xdb\xd9\x82\x9f\xdd\x01\xa6\x31\x6d\x41\x8a\xe4\xbb\x87\x36\x42\xa8\xa4\xf3\x43\xff\xc6\x6b\xe4\x30\xdb\x23\x71\x4c\x8d\xa4\x73\xfb\x9a\xa1\x89\x40\x2e\x47\xb4\x3e\x88\x99\x35\xbc\x32\x3a\x95\xf3\x8f\x1b\x83\xbe\x6b\x63\xd5\xbc\x19\xd8\x52\x4c\x93\x35\xfa\xb7\x27\x21\x09\x4a\x85\xd9\xa2\x59\x53\x1b\xa5\x85\x01\x82\xe5\xff\x4e\xe0\x59\x20\x89\x09\x82\xf8\xb4\x6d\xdc\xad\x16\x4f\xfd\xb6\x3b\x5a\xe5\xf6\xc4\xc3\x7a\xe2\x63\x1a\x58\x64\x6c\x22\xf2\x7a\x73\x11\xff\x04\x89\x55\xd4\xea\x32\x11\xe4\x03\x4b\x22\xd4\xd1\x7d\x98\xfd\x69\x00\xe8\xbb\xc5\xec\xd9\x9f\x87\x31\x66\xd4\x4c\xcb\x0a\xfa\x20\x15\x77\x5c\x72\x1b\x2f\x17\x6a\x55\x9c\x2f\xcd\x50\x83\xd0\x8e\xca\x52\x21\x6d\x3e\xb6\xf9\x57\xf5\xd7\xe8\x02\x32\xc6\xa1\xbb\x41\xcb\xe6\xb0\x5a\x3c\x79\x1f\x86\xcf\xfd\x16\x47\x27\x51\x46\x7b\xdb\xec\x3d\x02\xf6\x98\xf7\x9d\xab\xb2\x81\xa9\x1f\xcd\x49\x82\x1d\x9d\xab\x7e\x59\x1b\x10\x2f\xec\xfe\x35\x95\xaa\x03\x27\x0a\xcb\x97\x02\x74\x59\x81\x77\x05\xd0\x20\x22\xe3\x33\xb5\x38\x40\xa1\xc0\xff\x55\xa5\x01\xed\x34\x07\x4c\xca\xee\x95\x1f\xdd\x28\x49\x05\xaa\xd2\xfd\x9c\xfb\x05\x43\xc6\x0a\x71\x2e\xcb\x76\xf5\x7a\xf5\x7f\x65\x2a\x34\xdc\xa1\x7c\xbf\xef\xa6\x82\x54\x71\x68\xe0\x64\x3f\x79\xde\xf4\x4e\xac\x78\x9c\x71\x2f\x87\x34\x6b\x9c\x79\xf0\xa8\x62\xd4\x9f\xaf\x10\x01\x96\xde\xbf\xcd\x90\x89\xb0\xbb\x59\x3e\x6f\xef\xdc\xf9\x40\x66\x08\xab\xab\xf9\xa9\xfe\x8a\x8f\x0e\xa0\x62\x2c\xbd\xa1\x30\xf4\x0e\x7e\x9d\xcb\x02\x8a\xc6\x2f\x0b\x9a\x84\x09\x78\xd5\xab\x36\x52\xf1\x38\x70\x40\x76\xb5\x5d\xe9\xad\x77\xee\xbc\xfc\x35\x7a\x80\x3a\x30\x37\xc2\x76\x33\xdb\x2c\xd4\xef\x69\x23\xb2\x5b\x12\xd9\x7f\xdc\x47\x15\x60\x7d\xf7\x67\x7e\x3c\xae\x9d\x5e\x96\x39\xa6\x49\x40\x31\xde\x32\xa7\x5d\x54\x1f\x63\x27\x2a\xad\x49\x18\x25\xa2\x23\x3b\xf4\xf7\x76\xb7\x2c\xeb\x20\x4d\x84\xea\x89\x7a\xb5\xf1\xc8\x98\x46\xa0\x03\x2e\x85\xa5\x3c\x61\xd4\x17\xf8\x03\x32\xc5\x3c\x2d\x3f\x97\xbb\x73\x2f\xf9\xd3\x81\xd4\x0e\x38\x24\x4d\xf9\x1f\x94\xe2\x0d\x97\xbd\xe2\xb3\x0e\xa9\x0a\x5c\xeb\x04\x4f\xcb\x06\x39\xac\x0e\xc3\xc4\x1a\x4f\xf2\xd3\x30\x46\xd2\x51\x14\x63\x8b\xee\x9b\x8f\xe9\x36\xfc\x08\x03\x76\x8b\x1f\xc9\x33\xea\x49\x16\xdf\xe1\xc3\x3b\xd0\x6a\x1d\x89\x04\x73\x6f\x5b\x52\x18\xdf\x9b\x04\x38\x36\x08\x7e\x96\xc7\x57\xe7\x59\x3e\xb9\x15\xea\x44\x33\x84\xae\xed\xba\xa2\xfd\x96\xff\x9a\x4e\x08\x74\x4a\x0c\xda\x09\xb9\xaa\xd6\xbb\xed\x0f\x7f\xcc\x68\x96\xda\xc4\xd7\x08\x9f\x5e\x97\x7a\x75\x1a\x64\x48\x4f\xd2\xf9\xf1\xf8\x72\xb6\x3c\xb4\xe9\x84\x56\xb3\x84\x18\xd1\xdf\x76\xea\x99\xdf\x81\x1d\xd5\x0d\xff\xad\x3c\xf8\x28\xe5\xd1\x2c\xe1\x08\x1f\xbc\xe3\xe7\xf3\x07\xf6\x3f\xfb\x48\xdb\xe1\xd7\x66\x34\x30\xd6\xec\x6d\xa4\xdf\x4b\xa3\x3e\xdb\x8f\x86\x3f\x30\x0b\x54\x62\x01\x5f\x3b\x7b\x64\xb7\x9b\x55\x79\xc1\xa7\xeb\x6d\x3a\x0b\x29\x4e\xe4\xa3\x21\x93\xb4\x6b\xd6\x00\x05\xae\x33\x66\x1a\x0e\x35\x34\xdf\x1b\x39\xd9\xa0\xd3\x99\x88\x51\xbc\x0f\xd3\xc9\x7e\x35\x43\x73\x0e\x58\x5b\xb7\xcd\xf1\x65\x27\x50\x36\xba\x0e\xc1\xe2\x34\xf5\x0a\x75\xdc\x6b\xd7\x69\x2d\x49\x4a\x2d\xdd\xe7\x3e\xd7\x46\x2a\x64\x78\xcb\x24\x23\x08\xdc\xfb\xd7\x05\xaa\x0f\x43\xd2\xde\x56\x1f\xed\xca\xbf\xf3\x27\x11\x24\xb3\x78\x6a\x2c\x08\x8e\x53\x46\xff\xa8\x24\xc4\xac\x1f\x08\xdd\x96\x95\xc9\x81\x3f\x2b\xba\x69\xa5\xe3\xd0\x08\xe7\xb8\x3a\x7b\x8f\x8f\xad\x81\x09\xb0\x01\xd8\xf7\x8f\x4f\x6e\x9f\xce\x0c\x64\xdd\x50\x23\x91\xdf\xd9\x5e\xe4\xa2\x2f\x53\x34\xfa\x52\x2d\x52\x7c\x6c\x77\x70\x3c\x96\x3f\xcb\xca\xfa\x19\x31\x42\x48\x0a\xcc\xd4\x79\x51\xa1\x38\x87\xee\x08\x4b\x31\x64\x46\x71\x1b\xba\xe5\xd5\xde\xda\x16\xb6\xc7\x32\xf3\x4a\x63\xd5\xa9\x1a\x24\xb0\x8c\x10\x1a\xc7\xf8\x9e\x62\x74\xb2\x86\x53\x1f\xd8\xeb\x86\xa4\xd2\xf4\x3d\x91\x85\x88\x2e\xc0\xd7\xf5\x37\x46\x48\x18\x46\xd8\x6c\x5f\xcc\x1e\x7d\x5b\xb5\xfd\x73\x1c\x44\x56\xe2\x56\xde\x94\x77\xd3\xcc\xa0\x76\x5c\x12\x20\xbf\xea\x58\xbe\x41\x1b\x69\xe7\x96\x81\xee\xce\x13\x47\x12\xd9\x14\xb7\x15\x40\x3b\x0d\xfc\x22\xd1\x1e\x4b\x04\xa6\x29\x26\x82\xc0\xce\x53\x9b\xd8\xe4\x47\xe8\xc9\x9c\xb9\x1a\x4c\x3b\x3e\x15\x19\x77\xfb\xc0\xb1\x1c\x54\x30\xdb\xc3\x59\x8c\x53\xaa\xc0\xd7\xc5\x07\xf0\xfe\x68\xe6\x4c\x29\x9e\xab\x52\xe7\x47\x13\x5c\x4d\x4c\x7e\x46\x48\x12\x24\x88\x6a\x9c\xad\xd6\x3b\xba\xdb\xbc\x3c\x3f\xdf\xff\xe5\x4e\x94\x24\x19\x96\xfb\xea\x36\xb6\x0f\x6f\x2c\xd0\xdf\x1f\x4d\x23\x27\x61\x60\xbd\x91\x47\x67\xe6\x31\xe2\xf5\x95\xf5\x66\xb4\x13\x10\xfc\x75\x26\x9a\xa1\xc4\xca\xe2\x69\x3e\xb3\xf2\x80\x8c\x90\x34\x21\x18\x03\x61\x42\x41\xc7\x5f\x9a\x32\x8e\xb8\x8a\xdb\xb2\xba\x2d\x4b\x3f\xbf\x52\x2e\x85\x15\x08\x43\x57\x44\x40\xfd\x86\x36\xc6\x83\xca\x42\x4e\xec\x48\x96\x9a\x26\x3a\x0a\x83\x5b\x47\xb0\xce\x09\xac\x1d\xa0\x62\x9c\x4d\x79\xd1\x9f\x24\x59\xc4\x22\xfb\x63\x1f\xb0\x70\xda\x53\xf2\x62\x6e\x4c\x1a\xb1\xbe\x3c\xec\x1f\xd7\x88\x33\x1c\xc5\xf1\x2d\xe7\xea\x9f\x17\xb4\x3f\x2c\x9b\x7e\x2f\x9e\x11\xc2\x43\x43\x69\xc1\x19\xf4\x8d\x9f\x3e\x25\xc0\xba\xf1\xc2\xe8\x8d\x18\xe9\xfc\x07\xa8\x5e\x8f\x46\x4c\x7f\xea\x05\x66\x84\x08\xe1\x35\x64\x71\x02\x7f\x5e\x11\x61\x84\xc8\x98\x60\xdd\x79\x9f\xbf\x01\x9a\x5a\xfa\x48\x76\x5b\x7e\xff\xe8\x19\x0b\x9a\x65\xac\xfd\x44\x0a\x4e\x51\xcf\xf9\xfa\xf1\x3d\x0c\x5e\x15\x45\x34\x82\xbc\x1d\x3e\x75\x22\xb0\x62\xc3\x77\x57\x45\x14\x55\xad\x0a\x78\x5f\xfe\xca\x9b\x61\x1f\xc7\x8d\x69\x23\xd2\xff\xf3\xff\xfd\x9f\x8f\xf2\xa3\xdc\xf6\xb5\x61\x27\xe3\x48\x46\x08\xa8\x18\xe7\xc2\xc3\xcf\xcd\xe0\x6d\x05\x25\xb2\xce\x99\x67\xc1\xcf\xa3\xd7\x4f\x33\xc0\x7c\x1b\xc5\xb3\xe6\xd0\xfc\xcc\x9b\xc3\xaa\x78\xcb\x9b\xe9\x8a\x22\x23\x94\xc4\x01\x36\x8d\x4e\xfc\xd7\x4b\x0d\x55\x57\xa4\x62\x84\xd2\x30\x85\xd4\xc1\x51\x10\xe5\x64\x6b\x2d\xf5\xf0\x6b\x29\x0d\x19\x16\x98\x9f\xd6\x37\xcb\xf5\xee\xe1\xe9\x66\x75\xfb\xd7\x97\xbc\xaf\xab\x47\x4f\x69\x14\xe3\xda\x5d\xe7\xfb\x5d\x53\xb6\xdb\xb4\xad\x30\xf9\x01\x09\x15\xc4\x15\x81\x86\x02\xa8\xed\xd1\x94\x18\xd3\xa3\xf5\x6c\xb1\x9b\x3f\x6d\xdd\x4f\x08\x32\x83\xda\xb3\x52\x92\x56\xd5\xf3\xc8\xf7\x23\x48\x2a\x23\x34\x24\x21\xee\x11\xf7\xdf\x16\x6e\x9d\xa1\x61\x98\x60\x56\xb0\xd9\xce\xd6\xdb\xd5\xe3\xb7\xdd\x3a\x97\xaf\xb3\x42\x3d\x94\x55\xf3\xe1\x07\xe9\x00\x55\x4a\xdb\x65\xfa\xa5\x78\xe0\xf5\x2b\xa8\x6f\x97\x25\xaf\xda\xb8\x61\x7c\xab\x42\x1d\x72\xd3\x82\x7f\x0b\xdc\x09\x22\x1d\xe0\xbc\x44\xa1\x63\x6e\xe5\x44\xd9\xa7\x14\x3e\x46\x68\x4c\x03\xd4\x83\xdb\xbc\xe5\x05\x92\x41\xfb\xb3\x84\xc6\x3c\x43\x7e\xc3\x6d\x59\xed\x38\x62\x09\xdc\x01\x48\xb4\x8d\xa4\x6f\x2e\xc5\x1e\xca\xc2\x3c\xef\xe1\x25\x26\xc2\xc8\xfb\xec\xa1\xf9\x0e\x1f\x03\x85\xd6\xe1\x55\xa4\x21\xb7\xfd\xac\x02\xac\xb6\x9f\xfb\xa6\x34\x0d\x51\xf4\xe8\xfe\xc6\x3f\x0a\x4e\x0d\x15\xd7\x2d\x42\xcd\xa2\x3c\xe7\x60\xd8\x87\x65\x5e\x0d\xaa\x11\x38\x3c\xc2\xbb\x5a\xbf\xf3\xf3\xc8\x6f\xa4\x3d\x2a\x38\x76\x44\xb1\x02\xf2\x5c\x95\x12\x40\xb9\xe5\x9b\x8a\x88\x1a\x37\xd0\x23\xcf\x4f\xc6\x47\xd9\x1d\x92\x61\x68\x31\x77\x18\xa6\xaf\x6c\x5f\x66\x9e\xab\xd1\xd7\x2b\x91\x21\xff\xf2\x61\xd5\x55\x06\x18\xa1\x10\x98\xfd\xed\xe4\xeb\x90\xd7\xed\x68\x46\xa8\x8e\x13\x5c\x4a\x37\xe7\x36\x2b\xae\xac\x8c\xdd\xbf\x87\xad\xb8\x6e\x57\x0d\x08\x01\x6a\x70\x64\xa2\xdd\xa4\x71\xd1\xad\x10\x2b\xb0\x2a\xde\xca\x5c\x7e\x02\x66\xf1\xcf\x2c\x20\x01\xc3\x7e\xbe\x29\xc0\xde\x00\xd6\x26\xf3\x37\x43\x9f\xf8\xbf\x03\xbc\xcf\xb0\x68\x43\x3f\x79\x21\x03\x12\x65\xce\x97\xcc\x2a\x3b\x1b\x87\x68\x0c\x90\x06\xbf\x36\x20\x3a\x36\x37\x55\x29\x4c\x06\xb6\xe5\x23\x34\xef\x65\xf5\x7a\x35\x4e\xa4\xa9\x5f\x7f\x9f\xf9\xc7\x16\x09\x29\xfe\xa8\x11\x8e\xcb\xeb\x1b\xe8\xdc\xb4\x47\xa7\xa0\xd4\x48\x69\x58\x41\xb6\x41\xad\xb6\x3f\x37\x03\xca\x00\xc5\xc1\x30\xfa\xae\x51\x67\x46\x6d\xf3\xe3\xf1\xd1\x56\xcb\x18\x09\x82\x2c\x94\x41\xdf\x56\x04\xe1\x62\xe3\x72\x4f\x3b\x50\x9b\x3a\x85\x77\x70\xc7\x9e\x6b\xef\xf1\x85\x69\x92\xd9\x7d\xeb\x79\xd1\xcf\x2e\xdb\x63\x5a\x0b\xfb\x36\x3d\xbd\x41\xc5\x8f\xc7\x4d\xfe\x6f\xff\xa3\xa3\x2c\x4a\x58\x27\x50\x77\xb7\x59\x80\x33\x75\xbc\x81\x86\xe7\xc7\x3e\x09\xa9\x1d\x2f\x23\xf4\x25\x3b\xe6\x27\x5c\x8d\x6f\x86\x90\x55\x46\x82\x18\x42\xac\xd6\xfe\x58\xae\x37\xab\xa7\xc7\xdd\xe3\xcb\xc3\xdc\x76\x73\x18\x09\x12\xc2\xb8\x57\x9b\x38\xe7\x95\xf9\xa6\x11\xcd\xb3\x1d\x17\x45\xa8\xab\x60\xab\x6c\xcb\x42\xbd\x14\xf9\xaf\xa1\xfa\x4b\x3b\x0c\x34\xe7\xee\x2e\x53\xf6\xbd\x6e\xe0\xdc\xbd\x2d\x41\xa2\x01\x75\x4b\x6e\x2f\x85\xfa\x9d\x56\x46\xff\x75\x48\x89\x51\x59\x5e\x6c\x16\x6b\xa8\xcb\x4b\x25\xc7\x62\x49\xc3\xdf\x9c\x2a\x40\x9c\xbd\xa9\x5f\x60\x84\xf5\x59\xaf\x8d\x91\x80\x09\x85\xd8\xe5\xca\xca\x5b\x2d\x7e\x2e\xa6\x43\x8c\x80\x49\xc0\xa2\x87\x5d\x48\xb0\x13\xd4\x5b\x8b\xfc\x19\xb3\x44\x21\xe2\x03\x17\xdb\x1d\xd6\xf4\x47\xf7\x93\x87\x46\xfd\x84\x2b\xe5\xc8\x46\x1b\xa8\xde\x72\x39\xbe\xf1\x82\x1a\xd9\x9e\x52\xa3\xf0\xad\x8f\x4c\x02\x11\x19\xb1\xd2\xd5\xa6\x6b\xf9\xb7\x7f\x66\x51\x6c\x25\xc7\x9e\xa1\x7a\x83\x62\x08\x30\x75\xa3\x04\x17\x56\x5f\x2e\x2f\x36\x0d\xaf\xe6\x7d\x41\x9b\x09\x41\x79\xfb\x39\xc9\xa4\x32\x9e\xd2\x98\xc1\x2c\x6b\x59\x75\x58\xe0\xd1\xcd\x92\x8a\xc6\xda\x6f\xb5\x1e\xa7\x32\x5e\xba\x03\x45\x59\x64\xdd\x10\xb1\x78\x3b\x84\xc8\x7c\xb2\x1a\x29\xce\xb1\xa0\x7e\xe4\x4d\x5e\x94\xcd\x7f\x16\x9b\x05\x0a\x98\x13\x5e\x79\xae\xe0\x94\x5f\x4e\xb7\x5c\x62\x6b\xf0\x13\x50\xac\xff\x9c\xc0\xb6\xbd\xd3\x82\xf9\xca\xed\xb7\x37\x6d\x81\x9b\x5e\x9c\xc3\x79\x75\xfd\x82\xf6\xa0\x60\x58\xaa\xdd\xed\xa1\xf9\x09\xf9\xfe\xd0\x8c\x9e\x91\x0e\xb4\x91\xf0\xe1\xca\x3b\x8f\x7f\x15\x3b\xb9\x67\xa4\x63\x81\xd9\xdf\xec\xe6\x66\xb5\x5d\x3d\x3d\xce\xee\x77\xcf\x4f\xeb\xf6\xff\xec\x1c\x09\x29\x15\x48\x44\x15\x97\x8f\x45\x8f\xfc\xfd\x75\x44\x16\xd2\xc0\xc8\xe9\xe6\x85\x3e\x5a\xe2\xcb\xe9\x3c\x7f\xde\xf8\xb3\x32\x01\x7d\x41\xa7\x76\x75\xab\x72\xf5\x25\xa9\xb8\xfd\x18\x30\x03\x44\x72\xc8\x3c\xfb\x64\x7e\x77\x55\x5f\x84\x43\x61\x10\x48\x61\xb8\x32\x8f\xe5\xbb\xc7\x8c\xbb\x83\xb1\xc0\x50\x04\x0b\x21\x8f\xe3\x59\x33\xe0\x1a\xb9\x4f\xa4\x31\x36\xdd\xae\x20\x5f\x7f\x8c\xc6\xb1\x14\x1b\x8c\x3b\x8d\xbb\x42\x0f\x67\xcf\x48\x18\x92\x8c\x05\xb6\x47\x80\x74\xec\xe9\x34\x37\x0c\x23\x81\x0a\xd2\xdb\xf2\x34\xcf\xaf\xf4\x1b\xae\x27\x75\x18\x4a\x83\xaa\x5a\x3f\x6d\x16\xb3\x37\xda\xa7\x81\xd2\x80\x8d\x4b\x60\x03\x22\x29\x7e\x5a\x22\xd6\x74\xd3\x00\x3f\x36\x87\x7e\xdc\x18\x86\x1a\x10\x38\x5d\x19\x07\x4a\x47\x05\x61\x24\x8c\x68\x8a\x25\x52\x34\xe2\x93\x4d\xdd\x65\xcc\xc3\x3b\x12\x85\xb1\x11\x33\x69\x78\xd5\xdc\x80\xce\x0b\x50\x6d\x9e\xf8\xc0\x8b\x0b\x3f\x1e\x47\x7b\x55\x18\xc7\x69\x66\x0a\xf8\x33\xa3\xcb\xf0\x52\x0f\x69\x7b\xed\x18\x96\xe2\xf4\xce\x0b\xe7\x2f\xd4\x61\xc0\x47\x31\x63\x98\x08\x23\xde\x67\xde\xf7\x3a\x57\x50\xb4\xc1\xd0\x03\xd4\xfc\x53\x93\x83\xd1\x19\x54\xea\x04\xb9\xd6\xbc\xb1\xb6\xfd\xf3\xbe\x45\x8a\x1d\x98\x86\x51\xe8\x20\x53\x08\x8b\xe2\xd5\x87\xfd\xa5\xfc\x2a\xb7\x08\x53\x26\x9c\x03\xec\xe6\x50\x9e\xad\x93\xf7\x44\x24\x18\xa6\xc2\x48\xbf\x5e\x2c\x4d\x1a\xd4\xc3\xf6\xc5\x3d\x86\x2c\x89\x71\xe7\xe2\x18\x73\x22\x75\xdb\x1d\xe2\x49\x80\xc2\x9b\x8e\xf2\xfe\x19\x87\xdb\x0e\x17\x91\xc4\xfe\x33\x16\xaf\xcc\xaf\x1c\x5d\xb2\x4c\x22\xec\x31\x7e\x03\xcc\x49\xc6\x75\x63\x1c\xa1\xb9\xad\x2f\xff\x04\xe3\x93\x5a\x3f\xbd\x8f\x43\xb6\x50\x32\x93\x57\x99\x74\xe2\x0b\xd2\x5b\x3b\x56\x12\x24\x66\xbc\xd6\xf2\xd3\x78\x61\xf0\x32\xa8\x24\x46\xab\x85\x5d\xfb\x9a\x35\xbf\x73\x80\x62\x24\x04\x1e\xa0\x32\xcd\x43\x59\xc0\x87\xfb\x8e\xe9\x5a\x3c\x23\xa1\x16\x80\x95\xa4\xb3\x59\x8f\xd7\xb0\xbf\x1c\x2d\xd7\xee\x6a\xc7\x72\x1f\x91\x0a\x5f\xcf\x41\x14\x70\x55\xa8\x9e\xfc\xba\x88\x04\x31\x0a\x63\xb5\x47\xf1\x86\x8f\x0e\x4b\x8e\x8f\xbf\x81\x1a\x63\x49\x7d\xf4\xc1\x6c\x44\x03\x62\x05\x36\xac\x44\x79\x57\xf2\xaf\xaf\x4d\x30\xda\x0f\x68\x89\x27\x9b\xfd\x78\xe8\x2f\x02\x51\x20\x02\x6a\x48\x77\x56\x5f\xe1\x59\x36\x7f\x52\xf2\xdd\x1f\xd7\x82\x5b\xdf\xc4\x51\x38\xf0\x65\x73\x38\x0c\x7a\xb3\x3c\x0a\x69\x8c\xf2\xc7\xe7\xb2\x27\xac\x39\x21\x05\xd3\x0e\x0d\x52\x54\x2c\x14\x97\x0f\xe3\x7c\x7f\xed\xb0\xd2\x8e\x92\x99\xe1\xee\xb5\x11\x10\xda\xa8\xfb\x03\x3a\x50\x0e\x83\xe5\xfe\x18\xc9\x24\x85\xbe\x25\xf6\xbf\x7b\xc4\x5c\x1b\xd4\x45\x31\x35\xc6\x99\x45\x2e\xdd\xe7\x52\xc1\x53\xd2\xab\x83\x5b\x8d\x16\x44\xc5\x5c\x15\x63\xa2\x54\x8a\xac\x33\xc0\x41\xe2\xc5\x78\x11\x1a\x3e\x92\x54\x6a\xd4\x5c\xcc\x8b\xaf\x37\x82\xd1\xc7\xb2\x44\x23\x64\x67\xc1\xbd\x50\x2b\x23\x11\xb7\xb0\xd7\xb7\x7c\x3f\xcc\x48\x22\xae\xb5\xf6\xa9\x91\x35\x59\xbb\xea\x76\x31\x12\x89\x38\x56\xb1\xef\xc4\xd7\x30\xab\x47\x53\x48\x70\xe3\x2a\xd6\x54\x1f\xdf\xa0\xe9\x47\x3b\x91\x4c\x98\xb1\x69\x36\xb4\x59\xd8\x2e\xee\xd7\x79\xb1\x05\x7e\x1a\xec\x92\x91\xb4\xd6\x8c\x3b\xab\x23\xb2\xfc\x55\x1a\xf3\xb7\xa9\xdf\xdf\x61\x13\xfb\x7f\xb5\xb7\xf3\x93\x9b\xa3\xe2\x24\x1a\x78\x00\x51\xd2\x6d\x5e\x6e\x8f\xa4\xc4\x3d\x74\x95\x1a\x42\x92\x55\x30\xba\x2f\x79\xb1\x6a\x77\x91\x5c\xe7\x43\x3a\x0b\x23\x11\x50\x8a\x28\x14\x14\x1f\x3f\x54\xe5\x7b\x7d\x93\xd7\xe5\x7b\xf1\x58\x36\xdb\x1e\xac\xeb\x0f\x3f\x5c\x62\xa4\xbe\x73\xb3\xae\xd4\xbd\xc7\xdc\x7b\x39\x80\x91\xc4\x86\xf4\x33\xad\xf3\x63\xde\xde\x17\xb5\x1f\x3f\x1e\x80\x00\x81\xe9\x6d\xb8\x38\x12\x7f\x9a\x5a\x2a\x23\xcd\x8c\xf6\x4d\x7d\x28\xdf\x51\x4e\x39\x57\x9d\x0a\x45\x7b\x1c\x52\x4c\xf8\x8d\x51\x6b\x9f\x25\xff\x9f\x32\xc8\xfa\xe3\xae\x94\x9d\xfa\x31\x6b\x4c\xa8\x49\xbd\xed\x46\xcd\x8f\x80\xf8\xfb\x97\x55\x31\x5a\xf3\x62\x12\x05\x28\x0d\xe9\x12\x51\x0b\xb3\xf3\xdd\x24\x46\x62\x9a\x71\x69\xf7\x6c\xb4\xaa\x9c\x08\xe9\x62\xaa\x48\x60\xb3\xf0\xbe\xa5\xbe\xb5\xdf\x1f\x5c\x5b\x40\x09\x36\xa8\x67\xa7\x95\x91\xf2\x74\x75\xba\x38\xa0\x99\x81\x2c\xe6\xe7\xe1\x9b\x10\x07\x51\x8a\xeb\x59\x6f\xe5\x89\x03\xc6\x90\x39\x62\x2d\xa7\x1d\xc1\x7a\xc8\xd7\x68\xc7\x65\x34\xb5\xf7\xe2\xa5\x56\x46\xfe\x7f\xdc\xcf\x63\x24\x8e\x44\x80\x48\xbe\xc7\xef\x2e\xae\x8f\xe3\x38\xc4\x08\xbc\xe2\x85\x7a\x28\x47\x81\x53\x1c\x67\x61\x9c\xf6\x34\x7d\x3d\x87\xb1\x57\xb9\x68\x07\x99\x88\xa9\x29\x2b\xa7\x61\x81\xea\x4f\x50\x8c\x53\xd3\x38\x56\x21\x36\xbc\xc0\x3e\x83\xcd\x1e\x79\x80\xfb\x2b\x14\xb3\x1f\x2f\x70\x82\x7e\xeb\x04\x48\x3a\xbb\x15\xf7\xeb\x63\x9d\x61\xc4\xf8\x50\x2a\x94\x93\x76\x01\x4d\x9c\x10\x63\x8c\x53\x43\xb3\xaa\x6d\x53\xda\x48\xd6\xf6\x2e\x3f\x49\xb2\xc4\x74\xbe\xb8\xea\xf1\xaa\x26\x63\x9e\x38\x25\x0a\x85\x1d\xff\x56\xd6\x87\x0b\xef\x25\xd1\x71\x4a\x01\x57\xea\x97\x8a\x17\x73\x5e\xbc\xfa\xbf\x27\x46\x83\x72\x5e\x5e\xf6\x87\xe6\x47\xce\xff\x56\x1e\xf8\x24\x72\x92\x61\x63\x0c\xab\xae\xe2\x62\x48\x32\x75\x7b\x73\xe0\xa8\xfd\xc9\x80\x60\x01\xfb\x2b\x10\xe6\x74\x2a\x16\x67\x21\x0b\xb8\x33\xa7\xa8\x57\xc5\xd4\x16\x18\x67\x99\xa1\xc0\xd8\xa6\xdb\x08\x64\xe0\x07\x41\x24\x3a\x09\x95\xfe\x02\x11\x67\xc0\x88\x13\xde\xe7\x47\x24\x4c\xd5\xf9\xde\x36\x34\xec\x18\x2e\x00\xfb\x23\x0a\xea\xa6\x74\x15\xf0\x58\xb0\x08\x79\x49\xe2\x72\x3a\x23\x98\x71\x74\x69\x22\x23\x2a\xf1\x66\x83\xfd\xad\x73\x74\x79\x42\x12\xec\x99\xaf\xcb\xe3\x91\x12\xe2\xce\x2f\x03\xa3\x6e\x2d\xaa\x92\x2b\xc9\xeb\xe6\xe9\x9c\x17\x43\xff\x17\x86\x0e\x44\xae\xd2\xf6\x5c\xc1\x5b\x5e\x5e\xea\x3b\x5e\x1f\x5e\x72\x5f\x44\x89\x65\xa8\xb0\x32\xbc\xc9\x4f\xe7\x23\xdc\x6f\xb6\x53\x74\x9a\xdf\x75\x2c\x46\xd3\x4a\xa6\x61\x28\x70\x0e\x36\x4d\x39\x6c\x98\xc5\x2a\x48\x52\xcc\xa8\x0a\xf5\xa9\xd4\x35\x23\x31\x64\x19\x10\x2b\x57\x51\xd5\x46\xc9\xcd\x9d\x42\x47\x12\x6b\x18\xdb\xb2\x6e\xb7\xcf\xfb\x1e\x27\xc6\x0e\x49\x48\x68\xaa\x70\x79\xbd\xe5\xaf\xe0\xbd\x5f\xaf\xb6\x83\xdf\xfc\x3e\x7b\x36\x1a\x9b\x3a\x84\x75\x80\xbd\xd2\xac\xea\x6d\xf3\x09\x65\xa6\xa1\x80\xf2\xab\xef\xbc\x72\x32\x19\x9f\x13\xd5\xdd\x07\x39\x45\x1a\x23\xce\x05\x2b\x45\xbf\x06\x2e\x0f\xe3\xfc\x2f\xa1\xca\x10\x90\x6f\x57\x8f\xb3\xc7\xc5\x72\xb7\x98\x3d\x23\x40\x6b\xfd\xf4\xf2\x78\xe3\xee\x40\xa0\x42\xd4\xf0\x35\x4a\x65\xb3\x42\xa1\x6a\xec\x4d\x39\xdc\xb1\x93\x90\xfb\x34\xcc\x4c\xeb\xfa\xc6\xb6\x80\x87\xf3\x30\x89\x92\xcc\xa1\x9d\x9c\x5f\x86\x89\x90\xfa\x13\x2e\x89\x53\x6a\xd4\x70\x79\x53\x95\xd6\x66\xa0\xe3\x19\xba\x6b\x8b\x81\x63\x1f\xdb\x7a\x4e\xb8\x8d\xc0\x61\xe8\x18\x49\x12\x1a\x1b\xb2\x62\x79\x3a\xb5\x4b\x79\x6e\x45\x42\x47\x17\x95\x44\x02\x63\x25\xec\xa0\xb6\x73\xe1\x47\xe9\x37\xc1\x24\x49\x63\x84\xdc\x3f\xfc\xf5\x6d\xbd\x9c\x6d\x11\xd2\xd8\x1d\xe3\x18\xc9\x2e\xe6\x8f\xe3\x53\xea\x10\xc3\x1d\x04\x98\x6c\xb6\xb3\xde\xa2\x98\xa4\x3a\x15\xdc\xba\x98\xed\x72\x9a\xb8\xbf\x67\x04\x10\x3d\xbb\xaa\x2d\xa1\xd5\x1f\xa0\x0c\x59\xd4\xdf\x4a\x7e\x74\xcf\xf2\x2a\x17\xf0\x6b\x77\x92\x29\x89\x5b\xf2\xf6\x70\x69\xe3\xe7\xb7\xfa\x6f\xfc\xdf\xff\x76\xe7\xe2\x01\xb7\xc5\x27\xcb\x0f\xdd\x15\x00\x0a\xd4\xee\x52\x34\xf9\x71\xf7\x4f\x2e\x5f\xcf\xa5\x7f\x01\xb8\xa2\x89\xcb\x44\x3b\xfe\x8e\x3f\x18\xa7\xb6\x3b\xf1\xb3\xac\x5e\xc7\xb9\x79\x22\x48\xd8\xdb\xa7\x0d\x20\x78\xaa\x8b\x9b\x88\x30\x43\x38\x6e\x9b\xf4\x14\x86\xc8\xd9\xf9\x0f\xb4\xc7\x13\x23\x04\xdf\xe1\xc8\xb6\x1f\x67\x98\xc4\x92\xb5\xa3\x33\x86\x64\x96\xe3\xc0\xd9\xa2\x3d\xc0\x13\x5c\x2c\x75\x89\xf7\x25\xf0\x7f\x57\x01\x62\x0b\xe5\xa1\xbd\x38\xb4\x09\x29\x8f\xaa\xbd\x94\xdc\x07\x1d\x89\x4c\x28\x6a\xee\x9b\x1e\xbe\x13\x7d\x3a\x82\xda\x4f\x38\x7c\xb5\xe3\x95\x24\x0e\x5f\xde\x4e\x39\xb7\x7e\x4d\xbf\xb5\x40\x18\x12\x77\x5d\xc9\x6f\x8e\x76\x2b\x57\x95\x76\x37\x1a\x82\xd4\xf0\x2e\x10\x02\x98\x97\xc5\xad\xa7\x52\x30\x92\xe8\x80\x20\xfc\xdc\x16\x76\xc6\x26\x02\xd7\x85\xfb\x44\x87\x21\xf5\xde\xf7\x67\x4b\x98\xf0\x2b\xf8\x55\xe1\xf1\xfa\x0c\x29\x25\x1a\x81\x8e\xef\xdd\x4b\xb8\x2d\x3b\x78\x71\x3b\x82\x9b\x59\xff\xbc\xd8\x0e\x7c\x05\xfc\x61\x8e\x04\x67\xbc\x84\x1a\x0a\x15\x7e\xcd\xfc\xfb\xe2\x5a\x02\x16\x2a\x8d\x32\xac\xed\xea\xc1\xf7\x30\x32\x0c\x18\x6e\x33\x69\xc8\x8c\x63\xd0\xcb\x66\xfb\x60\xe9\x1f\x8c\xa4\x51\xc4\xb1\xaa\x7c\x5f\x7e\xc0\x91\x6f\xa1\x6e\x7a\xaf\x70\x1a\x41\x88\x04\x99\x1f\xb9\x6c\xca\xea\xe3\xf7\xc5\xc5\x34\xd2\x21\x76\xf2\x55\x55\x16\x60\x73\xc3\x01\x21\xc9\x8f\x03\xec\xd0\x9c\xf2\x02\x2a\xc7\x84\x71\x13\xd3\x7d\x7d\x9c\x69\x07\xe7\x58\x97\x65\x73\xe7\xa4\x42\xdb\x43\x5c\x2a\xa3\xe0\x7f\x39\x97\x05\x4e\x3d\x6b\x0b\xe7\x46\x24\x89\xc0\xce\x98\xb5\x0a\xf4\xbf\x38\xc9\x42\x7c\x0d\xf6\x15\x47\x19\xe9\x53\x5e\xd7\x68\xa9\x31\xb2\x66\xbc\x5e\x71\xd2\x44\xa8\xc8\xc2\xce\x76\x6d\xce\xb1\x43\xa8\x4d\xf7\x8d\x9a\x90\xd8\xa3\xb5\x8e\xa0\x9e\xaa\x49\xf5\x28\x46\xd2\x54\x1a\x86\x01\xb6\x9f\x87\x28\x15\x3b\x82\x11\xc3\x31\xc0\x16\x07\x28\x94\xb4\x1b\xdd\x43\x96\xea\xc0\xe4\x8f\xd5\x29\x2f\x78\x03\x3d\x58\x4f\xca\x98\xc4\x79\xb8\x30\xbe\x90\x17\x51\xcb\x2a\x3f\x4f\x85\x29\xee\x03\x59\x82\xd9\xfa\x5b\x89\xb9\xa5\x31\x44\x18\x7d\xa1\x94\x98\x11\xec\xcc\x52\x77\x9f\x4b\x28\x6a\xd8\x42\x75\x9a\xe0\xe9\xb8\xbe\xb1\xbb\x87\xc3\x97\x3b\xe5\x71\x96\x59\xc3\x91\xc6\x88\x17\xb9\x2b\xe7\x2c\x45\xf8\xc0\x5f\xe5\x65\x56\xc1\x1d\x54\xa3\x95\x2f\x15\x84\x61\xbe\x56\x5d\x8a\x0d\xfe\xa8\x7e\xe5\x20\x55\x81\x32\x2e\x71\x0d\xaf\x9a\x9d\xe3\x84\xb7\x07\x52\x66\x0c\xdf\x2b\xe9\xf7\x50\x29\x7b\xe0\x9d\x54\x65\xc6\xe8\xe4\xc4\x7f\xa1\x47\x81\x38\xc2\xe6\xa3\x68\x0e\xf5\x30\x76\x89\xec\x70\x88\x25\x96\x02\x3d\x83\xe7\xa5\xa8\xc7\x8b\x7e\x0a\xc2\xa8\x3c\xf7\x14\x5e\xfc\x54\x44\xfb\x47\xb7\x7b\x5a\x84\x0c\x98\x62\x7f\xdd\x8d\xe1\x06\x29\x7a\xf4\x84\x8b\xd1\x9d\xd4\xa1\x90\xe0\x9a\x87\xdf\x8c\x82\xb9\x51\x72\xc1\x85\x7d\x78\x39\x5a\xb0\x30\x72\xcc\x97\x35\xff\xf7\xf0\xd6\xb6\x21\x0e\xb6\xc9\x30\xd8\x34\x50\x4d\x6e\x5e\x7d\x3b\x80\x86\x91\x64\x8e\xfa\xd2\x86\x2b\xa8\x49\x36\xbd\xdc\x33\xca\x29\xe2\x7f\x40\x9e\x2e\x57\x06\x98\xa3\xb1\x01\xcf\x50\x5f\xce\x20\xdb\x66\xcd\x1f\xc3\xa3\x00\xc4\x78\x60\xc9\xe1\x5b\xda\x5f\x7c\x58\x18\xaa\xd4\xd8\x24\x7a\x1a\xd0\xf0\xe7\xb3\x30\x31\x1a\x7e\x46\x81\xc2\xd4\xad\xdd\xad\x66\x11\x40\xcc\x3c\x4d\xcc\x10\x43\xbe\x66\xaa\xda\x0f\xc6\x0a\x90\xc1\xf4\xf0\x34\xef\x97\x42\x59\x42\xad\xec\x7e\x1f\x75\x3c\x7c\xed\x58\x22\x0c\xf1\xd4\x6a\x7d\x3d\xe9\xd1\x15\xa7\x44\x48\x4b\xf4\x93\xaf\xf3\x09\xc2\xfc\xf0\x52\xd2\xd8\x14\x61\xf6\xd0\xdc\x56\x00\x73\xee\x26\x37\x4b\x15\xc7\xec\xdb\xc8\xc7\x15\x1d\x1c\x99\x11\xc6\x80\xe0\x9a\xd8\x5c\xaa\xe2\x49\xeb\x85\xd3\xc8\x7d\x84\x5f\xe8\x66\xf8\x5c\x36\x9b\xf3\x31\xf7\xe7\xca\x02\xc1\x78\xbf\x07\x67\x96\x30\xaf\xdd\x30\x7d\x6d\x99\x32\xa2\x4f\x7b\xc0\xa5\xfc\x49\x5f\xb1\xc1\x18\x61\x3c\xc9\xac\xa7\xe6\x2b\x14\xbe\xd2\xb6\xf1\x19\x24\xe3\x82\x62\x78\xb3\x87\x66\x20\xe6\x73\x23\xfa\x40\x3c\xc6\x65\x16\x29\xd7\x5c\xe0\xe7\xb2\x58\xf9\xc8\x81\x71\x30\x2e\xec\x0f\xe5\x1b\xdc\x03\x32\xb0\x3f\xb9\x64\x49\xa3\xcc\x12\x51\x57\xb2\xc4\x1a\x53\xf0\xd9\x50\x6d\x30\xce\xb9\x71\x7c\xd8\x55\x18\xce\xbb\xaf\x04\xc2\xc1\x02\xeb\x50\x7a\xf1\xbe\xdc\xfb\x6d\x96\xe9\x90\x60\x16\x34\xcf\x9b\xe5\x07\x0c\xa6\x90\x0e\x13\xe3\x92\xce\x8f\x72\x64\x05\xd6\x1e\x8d\x54\x60\x0a\xbe\x12\x8a\x26\x7f\xcb\xeb\xbc\xd8\x2f\xb5\x2e\xab\xa6\x1e\x16\x6d\x99\x66\x01\xb2\xa4\x1f\xa0\xb8\x90\xd0\xff\x55\xa6\xb8\x85\xbc\xf3\xba\xdd\x3c\x50\x78\xc9\x6f\x68\x19\xa1\x14\x43\xcc\xb3\x41\xed\xf5\x6a\x66\x19\x89\x29\xd6\x7d\xf2\xb3\xae\x77\x87\x6e\x63\xce\x48\x22\x68\x38\x10\x2d\x5e\x1c\x79\x3e\xa9\x81\xdc\x8e\x66\x02\xdb\x48\x33\xf5\xd6\x3e\xcb\x1a\x06\x5d\xeb\xc9\x37\x26\x23\x82\x22\xf5\x55\x43\x23\x0f\x8f\xfd\x79\x9c\x11\xc5\x30\xea\xb7\xe1\x3d\x6e\x63\x95\x37\x64\x6f\x07\x40\xa4\x4c\xa6\xf4\xfb\x36\xf6\xf8\x52\x75\x86\xdb\x47\x85\x4a\x6a\x6d\xea\x34\x29\x5e\x39\x0e\xd3\x32\x2a\x8c\x52\xca\x66\xbb\x7c\x70\x97\x41\x55\xca\xe3\x3e\x9a\xe3\x36\x87\x63\x37\x07\x27\x1b\x19\x19\xd5\xa1\xd0\x5e\xa8\xb9\x7b\x4a\x54\x1b\x30\xfc\x1e\x0a\x62\x8b\xa1\xfd\x37\x21\xa3\x5a\xa2\xac\x52\x5e\xa3\xcf\xdd\x6a\xf1\xd4\x75\xa4\x3f\x79\x2c\x01\x25\xd8\xa7\x98\xbd\x95\x92\xab\xb2\x3f\x23\xb3\x20\x30\x31\x7c\x0d\xcd\xd3\xcd\xf2\x61\xf8\x74\x07\x57\x3e\xba\xfe\x80\x05\x88\x21\x59\x9a\x98\xa7\xc3\x89\x66\x41\x66\xba\x64\xed\xa6\x72\xa9\x8a\x51\x8d\x31\x8b\xc2\x00\xdf\x81\xe2\x72\x6a\x17\xa3\xba\xdd\xd6\xd4\xd3\xc5\xff\xc0\x28\x55\x48\x6a\x37\xd0\x7c\xab\x57\xe1\x8e\x31\x85\xfc\x96\xe1\x4a\xb5\x2d\x97\xcd\x61\xfa\x3d\xce\x22\x10\xd0\x4e\xe0\x7f\x96\x39\x42\x94\xaf\x16\xdc\xe9\x59\x19\x27\x04\x5f\xc5\x45\x59\x48\x38\x7f\x6d\xad\x37\xb0\xa6\xf2\x9f\x37\x7b\x88\x51\x7b\x6b\x6e\x01\x83\xb0\xe1\xe2\x98\xc5\x99\xa5\xc5\x95\x75\xd3\xdd\xbe\x38\x93\xc2\xad\x88\x6d\x40\x6a\x12\xb5\xdf\x20\x62\xb2\x98\x0b\x63\x44\x58\x16\x7b\x14\xa4\xac\xda\xa0\xc1\x9f\x53\xca\xb0\x53\x6d\xb8\x2d\x2b\x90\xbc\xbe\x6e\x10\x5c\x7a\xda\xd1\x23\xa4\xa0\x2d\xd0\x66\x89\xe0\xd2\x36\xba\x1f\xe1\xfd\x81\xff\x72\x81\xce\xe8\xb7\xa5\x01\x47\xbd\xd2\x72\xb4\x23\x64\x2c\x4c\x71\x07\x5c\x6d\x97\xd3\xa0\xea\xfe\x92\x98\xb1\x88\x72\x3e\xf0\x70\x08\x62\xf7\xa3\x18\x78\xdd\xa8\x35\x3f\xa9\x6e\x96\x30\x9d\xa4\xc6\xf9\x19\x7e\x19\xa8\x9f\x3b\x92\x45\x80\xdd\xcc\xcd\xf6\xe5\xc6\xcc\x1a\x77\x20\x13\x69\xa7\x25\x3d\xe7\xf5\x35\x91\xdb\x2f\x01\x59\x26\xb1\xb9\x68\x9c\x3b\x11\x5b\xbd\x2a\xda\x5d\x80\x8f\x45\x1f\xda\xc1\xda\x94\xdd\x4f\xf9\xf1\x68\x9b\xe2\xcf\x3c\xf7\x17\xc4\x13\x8a\xae\x2b\x0d\xa6\x6a\xa7\x33\xaf\xfc\x9a\xcc\x19\xc5\xc5\x3c\x3f\x9d\x8e\x7c\xf0\xce\xf2\x0c\x9c\xee\xd3\xf2\xd7\x19\xe9\x74\x03\x49\xa3\xe9\x55\x80\x43\xe6\x74\xae\xe7\xbc\x69\xec\xf6\xd0\x7f\x33\x45\x60\x4a\xd6\xb2\x2c\xea\xcb\x09\x9e\xce\x60\x00\x81\xe3\x3e\xa5\x1d\x2e\x63\x61\x5a\x8a\xc8\x67\xbf\x81\x2e\x25\xb1\x03\x54\x9a\x91\xc0\xbb\xe4\x4d\x08\x2d\xbb\x71\x2c\x63\xcc\xd9\x3c\xe4\x62\x58\x56\xcb\x54\xc6\xb3\x3e\x5b\xe1\xa1\x2c\x06\x4c\xa3\xfe\x39\x93\xc8\x7d\x88\x8b\xc4\xce\x1b\xdf\xe8\x18\x16\x63\x33\x08\xa2\x10\x31\xc9\xbc\xf8\xc5\x8b\xfd\xa2\xb7\xeb\x41\xc4\x03\xe5\x80\x7e\x2f\x45\x9b\xcd\x76\x73\x08\xe2\xa0\xaf\xf8\xf2\xeb\x0c\x55\x0e\xe3\x22\x89\x5f\x26\x41\x1b\x6a\x8a\x37\x61\x1d\x6d\xca\x9a\x49\xdc\x4f\x7e\x40\x55\x5f\x4e\xbf\x7f\x21\xb4\x8c\x4c\xb0\xf3\x7d\xfd\xb2\xb9\xf1\x67\xd1\x22\x20\x1d\xa0\xc4\x76\x4f\xc6\x58\x3b\x4e\x68\x8c\x60\xab\xf5\x7c\xb6\x78\x18\x68\xf2\xba\x01\x32\x4a\x68\x47\x28\xb5\xf5\xa2\x52\x21\x46\x75\xf0\xd0\x38\x8d\xb9\xb2\xb1\xd4\xba\x94\xaf\x60\x80\x86\x13\x9b\xe8\x64\x1d\x64\xb4\xad\x72\xca\x99\x81\x56\xa2\x1b\xd4\x10\xee\xe6\x86\x08\xee\x1e\x69\xbb\x65\xdc\x83\x46\x64\xf1\x2f\x27\xdf\x3a\x3d\xb9\x38\x05\x43\x82\x6f\x03\x39\x14\x21\x1c\x1e\x0e\x42\x85\x65\x17\x04\x04\x70\xb5\x87\x3f\x46\xfb\xc2\x68\xb8\x52\x28\x55\x6c\xab\x71\x91\x7d\x00\x3c\x4c\x21\x08\xad\xe6\x76\xa5\xee\xf2\xfd\x61\x33\x08\x4a\x86\x3f\x25\xe4\xc6\xb9\xc4\xf2\xa1\x71\x4a\xdc\x74\xe1\x18\x0f\x35\x13\x96\xfc\xfb\xb3\xac\x5e\xf5\xb1\x7c\x7f\x74\x42\x8d\xdd\xb5\x84\x3a\x13\xa1\xf3\xdd\x5d\xf0\x73\x37\x1f\x78\x14\x18\xc3\xa5\x1f\x79\xc3\x4f\x43\x3a\x00\x8f\x49\x2a\x4d\x00\xb1\xab\xcd\x5c\xdc\x89\x9e\x07\x55\x3b\x82\x4a\x5c\x58\x51\xe7\xf2\x06\xe4\x91\x57\x56\xf8\xc4\x2c\x19\x6e\x58\x64\x12\x80\x33\x6a\x7b\x0c\xbf\x43\x4a\xcc\xda\x6d\xdf\xfc\x47\xce\xbf\x34\xff\xb1\x9f\x4a\x00\x52\x35\x50\x5a\x9d\xdb\x69\xe5\xce\x9b\x86\x4c\xf4\xdd\xc4\xdb\x1b\x8d\xfa\x23\xcf\xff\x3f\x6b\x6f\xd6\xdc\x38\xae\x65\x8d\xfe\x9d\x7a\xb8\x0f\xc4\xc0\xe9\x51\x96\x65\xa7\xba\x6c\xcb\xc7\x52\x56\x9d\xea\x13\x1d\x0a\x0c\x1b\x36\x3f\x53\xa4\x9a\x83\x33\x55\xbf\xfe\x06\x37\x00\x4e\xa2\x9d\x75\x6f\x7c\xd1\x71\x22\xab\x4d\x90\xe2\x00\x6c\xec\x61\xed\xb5\xca\xf9\x74\x49\xa9\xc4\x86\x81\xb3\xb8\xd8\x54\xfc\x15\x04\x6a\xfa\xe3\x69\x6c\x6b\x06\x35\x14\xfa\x00\xe2\x34\xe3\x85\xba\x1a\x9d\xa2\x97\xd6\x2f\xeb\x2b\x7c\xd2\xf2\x79\x22\xec\x01\x65\xe8\x38\xdd\x95\x2e\x5f\xb4\xcb\x67\x95\x0e\x21\x64\x80\xc1\x4a\x01\x3f\x9b\xbe\x97\xc9\xca\x6e\x8e\x8c\xb6\x90\x91\x95\x2f\xb0\x69\xaa\x17\x50\x6d\x55\x0d\x22\xac\xd3\x44\x95\x90\x32\x09\x6d\xbd\x0f\x61\x4e\xb3\x2c\x95\x50\x21\x47\x2c\x6e\x69\x2d\x7f\x31\x83\x8a\x08\x15\x11\xe4\x5a\xbf\x19\xda\x7d\x91\x3d\xfe\xf3\x45\xef\xac\xf2\x6c\xfe\xab\xc4\xd6\x3e\xd1\x4d\x19\x4f\x29\x25\x04\x62\x51\xce\x88\x86\x98\x54\xe3\xdc\x08\x4d\x62\x49\xfb\x8d\x7a\x9f\x35\xb0\x87\xc5\x06\xd0\x6e\x2c\x55\xc6\x21\x27\xd6\xe2\xfc\xc9\x97\xd4\xa0\xb1\xd8\xe6\xf8\x4c\x1f\x4a\x31\xe6\x31\x4d\x02\x01\x1c\xb0\xcf\xee\xe8\x42\xc1\x01\xae\x2f\x40\x07\x88\x71\x7e\x28\xcb\x02\x2e\xb7\x59\xbf\xb9\x08\x13\x05\xb8\xf5\x39\x5d\xd7\xed\x7a\xe7\x55\xaf\xf1\xa0\x8e\x9d\xbc\xc1\xc6\xe5\x2b\x9f\xab\xf2\x23\x5b\xc0\x15\xfb\x33\x74\xc2\x79\xaf\xca\xf9\xd1\xf9\x70\x3d\xb9\x4f\x7f\x55\x0d\xc2\x61\x55\xb6\x7e\x7b\x91\x01\xa5\x88\x09\x70\xd5\x8c\xb6\x2a\xe6\x05\x0f\x49\x03\x8a\xdd\xa6\xcd\x1b\xae\x22\xff\xd7\xd4\xc4\xaa\xe7\x4c\x98\xd7\xc5\xe6\x2c\x52\xee\x24\x16\x28\xc2\xfa\x2e\x8b\x43\xb9\x2f\xfb\x9e\x5b\xc9\x12\x5b\xdf\x79\xb6\x4a\x9d\x87\x9f\x5e\x85\xb1\x3b\xa6\x98\x4e\xc6\xb5\x72\x6c\x54\x53\xcb\xac\x44\x49\x20\x39\xb7\x4a\x44\xf0\xb3\xa9\xc4\xbe\x11\x4d\x7d\x57\x56\xf7\x53\x2d\xfe\x24\x90\x21\x25\x2c\xf2\xe0\x3e\x54\x51\x1f\x92\xe1\x32\xa4\x21\xe6\xd9\x7c\x88\x82\x3f\xfc\x67\x25\xce\xe7\xab\x37\x14\xc6\x09\x75\xb4\xb9\xaa\x2f\x9a\xcc\xdd\x21\x19\x39\x31\x8b\x1f\xe2\x1d\xbe\xcf\x5c\x7d\x19\x39\x72\x1d\xeb\x80\x6f\x4e\xe7\xe6\x82\x3d\xfa\xfe\x6e\xa2\x94\xa4\x23\xac\x2d\x66\xc0\x97\xdb\x1d\xff\x9f\xc9\x27\x20\xee\xfc\x58\x09\x24\xcc\x41\xb9\x8c\x6b\x70\xa6\x4c\xc2\x10\xd3\x2c\xff\x9d\xbd\xbe\x5e\xc6\xa6\x5a\x26\x10\x69\x32\xe0\x52\xbc\xd7\xdb\xbd\xd5\xf6\x9a\xe1\x65\x30\x3c\x52\x70\x19\x87\x43\x2b\x6b\x59\x4c\xba\x8c\xa5\x64\x2c\x0a\x46\xf0\x90\x43\xb9\x55\xe5\xec\xae\x14\x09\x31\x0f\x68\xab\x6c\xb3\x57\xa6\xd2\x54\x49\x47\x65\xf5\xd0\x79\x18\x3e\x42\x92\x3a\x48\xed\x77\x6d\xf3\x26\xc3\xc6\x58\x7f\x80\xc6\xd4\x32\x4c\xaa\xb6\xca\x9a\xcb\x55\x2f\x9c\x04\x66\x61\x8e\xdd\x57\xb7\xef\xf7\x09\x7e\xcc\x7e\xd8\x04\x29\xfa\xb5\x65\x75\x7e\x13\x45\x73\x5d\xf6\x91\x26\xe4\xd8\xf5\x7c\x12\x3f\xb7\xeb\x9d\x05\xfc\x4e\x8a\x7f\xd2\xa4\x89\x15\xd7\x12\xef\xb0\xff\x21\xce\x3d\x37\xa8\x3f\x2e\x2d\x09\x59\x0d\xcd\x55\xa0\xb1\xbc\x75\x48\xe3\x44\x51\x6a\xc8\xf3\x3f\xca\x56\x8d\xd2\xca\xd2\x40\x92\x58\xdd\x86\x39\x0e\x44\x05\xa1\xc4\xed\xde\xf2\xf9\x1f\x95\xc8\x73\xd9\x4d\xbc\xc9\xc6\xa0\x02\x41\x11\xda\x82\x59\x18\xcb\x30\x5f\xb7\x79\x73\x57\x56\x3d\xc1\xf2\xf4\x1d\x28\x92\x68\xee\x92\x1e\x5e\xcf\xb4\xbc\xb3\x5e\x51\x3d\x1f\x9a\x5a\xee\x01\xdb\x59\x85\x4a\x7b\x0e\x89\x6a\xd5\xfa\xb7\xc5\x88\xb4\x6b\x7a\x2a\x75\xb2\x17\xce\x3a\x3b\x45\x51\x6f\x38\x14\x0b\x0c\xd3\xbe\x95\x61\x46\xc6\x3c\x7d\x0d\x8c\x72\x65\xdb\xc9\x6e\x44\x9e\x97\xcd\xb6\x33\xb9\xaf\xb8\xb9\x8d\xfd\x75\xc5\xe2\x04\x3b\x73\xbc\xa6\xef\xfc\x59\x58\x9a\x1a\x9b\x71\xef\xfc\xa1\x9e\xaf\xb8\xbf\x21\x63\x43\x28\xa1\xf5\x9d\xa8\x4e\x73\x53\xa2\x38\x65\x28\xad\xd3\x54\x97\x43\xf9\x67\x6f\x8d\x14\x87\x50\x0d\x55\x67\x2c\x53\x40\x9d\xfd\x0d\x5e\xbe\x62\x58\x77\x2a\x94\x80\x53\xeb\xfb\xfd\x78\x66\xab\xc8\x18\x8c\x24\xdf\x01\xce\x22\xcf\x3e\x60\x5c\x45\x56\x71\x18\xc4\xce\x79\x7e\x44\x68\xe5\x8c\x0d\x28\x09\x54\x12\x44\x98\xbc\xf3\xd5\x94\xa3\x4f\x2b\xaa\x84\x04\x98\x66\x7b\x6c\xd5\xe4\x27\x13\xa2\x88\xcb\x54\x20\x8e\x0d\xb9\x67\xfc\xb1\x48\x21\x59\xc2\xba\x3c\x9d\xca\x62\x53\x55\x65\x35\xae\xeb\xa8\x44\x50\x4b\x72\xdd\x5d\xd0\xcf\x0a\x3e\x96\x23\xe9\x06\x19\x8d\x15\x87\xb3\xab\xaa\x4d\x36\x66\x95\x86\x04\x9d\x41\x37\x37\x30\x75\x85\xa5\xf5\x6d\x71\x97\x15\x05\x5c\xfa\x81\x51\x48\xe3\x5e\xef\xa1\x54\x96\xf0\x75\xb5\xdb\x43\x83\x34\x41\xd3\xa5\x90\xa6\x5a\xbb\x3e\x40\xeb\x6d\x65\x4a\xe4\x37\xad\x1e\x98\x20\x94\x88\x05\x36\x78\x99\xb2\x52\xdd\x4a\x81\x3e\x9e\x53\x42\x28\xe2\x34\x96\x0e\x59\x93\xc3\xf6\x34\x94\x72\xfd\x10\x08\x90\x4e\x00\x35\x64\x77\x0a\xc4\xa7\xa4\xd3\xff\x7f\xff\x75\x3f\xa4\x83\x00\xb3\x1d\x0e\x4c\xdb\x45\x3f\xc5\x12\xec\x78\x31\x48\x51\x9a\x72\x44\x9f\x97\xc6\x5c\x97\x84\xe6\xbf\x14\x0a\xe5\xba\xde\x57\xe7\xf3\xb6\xa8\x1b\xf4\x9d\x17\xbd\x04\xa5\x05\x45\x2f\x73\x73\x7f\xbf\x3f\x1e\x76\xc7\x6f\xab\xc3\xfa\xdb\x91\x1c\x76\x2b\x1f\xbf\x28\xad\x52\x8c\x8a\x5f\x36\xfb\xc3\xcb\x76\x7d\xd8\x78\x19\xc5\xe3\xed\x77\x94\x9e\xf5\x60\x16\x05\x51\xa0\xbd\x56\x38\x9a\xac\x31\x9c\x50\x81\x02\xec\x49\xf0\xb9\x83\x43\xf9\x0b\x33\x61\x68\xe4\xeb\x0c\x88\xbd\xc2\x1a\xc1\xe0\xba\xe9\x20\x56\xe8\x4f\xdd\x67\xa6\xf1\x73\x5d\x93\x20\xc5\x2a\x9c\xa9\x00\xfe\xfd\xf0\x78\xdf\xff\x5d\x6a\x64\xf1\x74\xf9\xeb\x6f\xfd\xc4\xd6\x44\x49\xaf\xb2\x7e\x8b\x12\x98\x9d\xaf\x3e\x5e\xb0\x9a\x72\xc0\xd6\xfe\xfd\x76\xff\xfb\x01\xd4\x5b\x51\xe6\xe5\xeb\x05\xf9\x56\xc7\x6b\x50\x53\x45\x2c\x9c\x48\x74\xcf\xaf\xda\xb9\x38\x86\x63\x8b\xd0\x8c\x6a\xc4\xcd\xaf\xdf\x44\xb9\xf9\x39\xb9\x04\xa3\x06\x39\xbb\xb2\x7a\x86\xbc\x72\xc7\x43\x0a\x36\xd2\x77\x0a\xb9\x5d\xcc\x3d\xc6\xa4\xe9\x30\x62\x08\xda\x7c\x28\x5f\x6d\x7d\xda\xbf\xe4\xbe\xf0\xfc\xe5\xce\xa6\x23\x62\x95\x4d\x50\xb0\x0c\x6b\x4e\x57\x54\xd4\x8b\x4d\x04\x63\xec\x99\x8e\xa5\xad\x90\x67\x85\x2a\x4f\x59\xf1\x6a\x77\x98\x11\xad\xb3\xb7\xd1\x3a\xd6\x89\xa5\x92\xc9\x3e\xe0\x11\x6e\x84\x7a\x7f\xbc\xa0\x8b\xd8\x0f\x30\xb6\xea\x76\x10\x3f\xb3\x89\xc5\xd3\xb1\x49\xa9\x6f\xca\xab\xc6\xb4\xb4\xd3\x07\x4a\x42\x4b\xe7\x38\x8a\x18\xbe\x5c\x3f\x3a\x91\x2c\x71\xf9\x9b\x7f\x35\x97\x7d\x03\xe7\xbb\xb6\x98\x42\x42\xfb\x08\xeb\xf3\xff\xf0\x17\x53\x36\x17\x71\x6e\x65\x9e\xd5\x6f\x13\xa2\xc8\xf1\x1b\x4b\x43\xe9\xd4\x4a\x3a\xcf\x65\x3f\x18\x31\x9d\x3a\x8c\x5a\x05\x66\xec\xd3\x69\x21\x88\x4f\xfe\xde\x3a\x5f\xf8\xae\xac\x2c\x2c\xfa\xeb\x4a\xa6\x96\x71\x8a\x93\x68\x8f\x04\x7c\xab\x42\xdf\x95\xde\x9f\xd3\x52\xc6\x68\x71\x5f\x84\xca\x8a\xd7\x75\xde\x4a\x57\xf8\xe8\x07\x68\x40\x08\xfc\xf3\xf6\xb8\xb9\xdd\x1e\x8e\x3e\xed\xa2\x95\x30\xde\xb2\xbf\x80\x99\x54\x8f\xb4\x92\xc6\x73\xb3\x5a\xf9\xb2\x11\xbb\x8a\x56\x10\xf8\x0c\xcb\xea\x87\xa8\xf4\x08\x34\xa5\x15\x80\x72\x0a\xda\xdf\x5a\x14\x1a\x5a\x00\x6c\x69\xad\x14\xd6\xd6\x2d\x13\xcd\xf1\xdb\xea\xe5\x76\xc4\x0c\xa0\x41\x87\x49\xd4\xc7\xa9\x77\x95\xe3\xd9\xf9\x66\x99\x5e\xa6\x5e\x81\x06\x48\xd1\x88\x9d\x90\x0f\xcf\xb1\x63\xfa\x2b\x19\x6a\x71\x09\x07\xd0\xfa\x32\x48\x7d\x77\x47\x38\xc1\x0f\xfd\xd4\xaa\x1c\xda\xfa\x8f\x0c\x91\x2f\xd9\x09\x9c\x3e\x85\x5d\x02\xc8\xe4\xff\x4b\xa5\xa0\xd9\xe7\x32\x82\x59\x8e\x6f\xf1\x01\x16\xd6\x35\xde\xc2\xb4\x91\x24\xe0\x9e\x0a\x09\x01\x41\x64\xf6\x48\x06\x00\x53\x8d\x4f\xf0\x63\x84\x63\x81\x80\xa5\xd8\x7b\x5a\x61\xca\xf0\x1e\x8d\x36\x36\x74\x4f\xb3\x87\x7e\xb4\x0a\xb0\x47\xe2\x51\xd4\x35\x72\xba\xec\x91\x3f\xc1\x5f\x8c\x30\x49\x9c\x8f\x71\x16\x85\x0d\x6b\x5c\xbe\xff\x1f\x61\x5b\x81\x84\x32\x8c\xfa\xdc\x89\xa5\xee\x9d\x3e\x07\x90\xd0\xc4\x91\x2f\x66\x65\xb9\x5e\x98\x0a\x40\x12\x86\xd9\xae\xf5\xc3\x6a\xbf\x3f\x3e\x3f\xac\x9e\x0e\xfd\x2d\xca\x54\x59\x0a\xd6\xa2\x5b\x8a\x98\x77\xff\xba\x17\x0f\x68\x48\x62\xe5\xb1\xb0\xb5\x6d\x00\x18\x9e\x99\x46\x96\x49\xab\x5b\x82\x65\xfb\xba\x40\x96\xd5\x0d\xd2\x21\x62\x90\xbb\x5d\xdf\x71\x21\x0e\xdd\x9b\xc0\x98\x25\x78\x73\x7c\x63\x3f\x4a\xd3\x1f\x89\x25\xe6\x33\x46\x88\x99\xa7\xce\x98\xce\xaf\xcf\x0c\x11\x36\x51\xf7\xfa\x9a\x8f\x2a\x25\x83\x97\x0a\x3c\x06\x2c\xa8\x38\x6e\x6e\xfc\xbc\x9d\x67\x59\xb6\x0d\x02\x56\x77\x66\x9a\x5b\x82\x90\x1a\xac\x03\xe3\xd3\xae\x45\xfd\x46\xfa\x23\x3a\xc6\x6c\x51\x17\x96\x5c\xa3\x98\xfb\x1d\x61\xa6\xb4\xd2\x9d\x08\x01\xe2\x40\xb7\x87\x9d\x25\xf5\xf4\xcd\xca\x10\x71\x5b\x9e\x93\xed\xe5\xa6\xc4\x6f\xe2\x0f\x48\xdb\x0c\xb5\xf6\x05\xc6\x1b\x51\xbc\xbb\x89\xe1\x86\xc4\x5c\x06\xbc\x2f\xd9\x60\x59\xdc\xc2\x2b\xac\x44\xf4\x0b\x7c\xe0\x3a\xdc\x14\xce\x3b\xb4\xff\x6f\xff\x9c\x89\x24\x76\x0b\x71\xdc\x1c\x96\x78\xe5\xff\xb3\x07\x38\x7d\xd2\x34\x88\x5d\x8b\x32\x96\x2c\xfc\x6f\xa5\x82\x60\xbf\xfe\xfe\xb0\x3a\x7c\xdf\x1f\x1f\x36\xc3\xc4\x4c\x21\x05\xcf\x5c\xdd\x9d\xb2\xd5\xf5\xcd\xe5\x50\x9e\x33\x35\x9b\xdc\xa9\x49\x13\xe5\xab\x6c\xca\x79\x82\xf3\xe4\x07\x88\x84\xc6\x4e\xdb\xc1\x62\x95\xa7\x87\x25\xb1\xcc\x67\x27\x5b\xbb\xd9\xea\x43\xb9\xfd\xe3\x93\x96\x49\x90\x91\x8c\x8d\x47\x91\x5b\xb3\xf9\x2c\xb2\xea\xd3\x38\xd9\x9f\x26\x83\x64\xe8\xe2\x73\xce\xa0\x3f\x06\x1a\xeb\x23\x5e\x71\xaa\xfc\xbc\x15\xd3\xdf\xd3\xe0\x45\x82\x62\xb6\xab\x14\x75\x34\x6f\x2e\x2f\x85\x9e\x2a\xaa\x77\x43\xb8\x48\x2d\xaa\xdb\xe5\x83\x7b\x05\xbf\xe9\x38\x0d\x8c\x3a\x68\xf2\x6d\xa9\xda\xce\xed\xf3\xc4\x1e\xf3\x81\x26\xe9\x73\xf0\xbd\xbb\xe1\x0e\x42\x1a\x23\xfa\xe3\x08\xcd\xdb\x34\x64\x02\xc3\x42\x66\x69\x75\x2e\x58\x3d\x9e\x06\x37\x60\x04\x47\xa6\x20\xf8\xd9\xdc\xf8\x64\xdb\xd7\x3b\xb7\x09\x18\x1f\x64\xf4\xad\x5f\xd7\xb9\x14\xaa\xd4\xd3\xb8\xc6\x04\xcc\x88\x68\xc4\x77\xf0\x0c\x3d\xd5\x9b\x21\x09\x53\xb6\xfd\xb0\xce\x9a\x9e\x89\x38\x09\x0c\x0d\x18\x6e\xed\x7d\x27\xc8\xf4\x3d\x18\x9a\x26\x29\xef\xbb\x8a\xef\xca\x6a\x0d\x73\xd4\xb2\xa1\x46\x04\xae\xa5\x78\x0f\x79\x6e\x4d\xf4\x64\x72\x18\xc6\x15\xf1\x1a\x2b\x65\xd5\x80\x1e\xa5\x02\x0d\x4b\x2d\xec\xdd\x19\xa6\xad\xce\xfa\x3c\xa8\x61\x26\x48\xdd\x4e\x77\x7f\xbf\x5e\x34\xb7\x86\x13\x88\x23\x87\x4a\x70\xd5\xfe\xd9\x1d\x72\xce\xa8\x73\x4e\x61\x5c\x22\x35\x3c\x64\x88\x89\x45\xe8\x69\xb7\x75\x57\x9b\x5c\x9c\x07\x14\xaa\xe1\xc2\x9a\xe4\x1a\xe0\xd1\x89\x63\xf6\x2f\x95\x4b\x25\x13\x1f\x43\x23\x93\x69\xdf\x6e\xe1\x46\x84\x61\x64\xf1\xc9\x58\xaa\xee\xff\x2a\x18\xee\x30\x57\x7a\x22\xff\xac\x25\xc4\x84\x10\xa0\x10\x6e\xfd\x56\xb6\xb9\xbe\x29\xcb\x7a\x56\x67\x30\x91\xb2\x4d\xde\x35\x34\xa8\xfe\xbf\x28\x03\xde\x8d\xd3\xb1\x65\x45\xf8\x21\xce\xd3\xfd\xc0\xc4\xda\xb2\x5d\x63\x2b\xda\x0b\x08\xed\x39\xd3\x87\xfb\x88\xc1\x12\x65\xad\x9e\xb6\x8f\x9b\x71\x8b\x83\x49\xa2\x00\xdb\x1f\xb6\xf3\x94\xbd\x49\x52\x81\xdb\x8c\xc4\x2c\xd0\x93\x38\xc1\x34\x01\x64\x92\xd4\xe2\x2f\x07\xba\xd5\xdb\x97\xc7\xdf\xaf\x01\x20\xb3\x77\x92\xe8\x08\x6b\xd8\x15\xe8\x39\xa7\x6c\x77\x14\x04\x26\x43\x9f\xdb\xe6\x78\xf3\x72\xf8\x76\xbc\xbf\x3b\xcc\x26\x91\xa0\x31\x35\x7e\xdb\xef\x76\xca\x6e\x26\x2d\xd0\xdc\x24\xb3\x1f\x16\x3c\x44\xb8\x8c\x2a\x4f\xe7\x1c\x1a\xd0\x07\x51\xbf\x4f\x52\xb1\x46\xb8\x3a\xfc\x2b\x6a\x05\x5f\xa0\xaa\x7b\x00\x40\x33\x9f\xcb\x22\x4e\x79\x0f\xd8\xab\xef\xca\xca\xe5\x66\xfa\x6b\x25\x51\x60\x9c\xb2\x5d\xdb\xc0\xc6\x41\xf9\x1f\x45\xa1\xaf\x9a\x14\x8d\x22\x91\x87\x97\xf6\xad\xab\xd7\x8b\x03\xb8\x15\x67\x74\xc6\xd9\x36\x6d\x3c\x8b\x8b\x05\x0e\x2d\x09\x06\x90\x68\xde\x84\xea\x2f\x25\x35\xf6\x7c\x79\x79\xd7\xb1\x81\x22\x41\x40\x0c\xe2\xc9\x5c\x07\xc2\x88\x7e\xde\xc5\x4e\x24\x20\x11\x37\xf1\xc8\x86\xdd\x3c\x0f\x8e\xca\xd2\xb6\xd3\x9d\x61\x3b\x6d\x5e\xa1\xb9\x69\xd4\x0b\xfc\x6f\x0b\x75\x33\xb0\x46\x2d\x30\x8a\x90\x80\xb2\x24\xb6\x69\xcb\xaa\x78\x01\xfd\x92\x49\x59\xda\xe2\xc4\x74\x1c\x0b\x00\xd3\x04\xab\x07\x1f\x58\x90\x80\x07\x36\x93\x5f\xb4\xa7\x9d\xf1\x5a\xfb\x75\x7f\x94\x12\x5c\x78\x9b\x9f\xe7\xce\x67\xf1\x41\x40\x7f\x38\x04\xa1\xbd\xd4\x9a\xa7\xc0\x4f\x48\x10\x0a\x61\x11\x25\x95\x28\x9a\x95\xfe\xc8\xea\x72\x09\xc7\x4e\x82\x88\x83\x6f\x9c\xb5\x5e\x51\x59\x79\x7c\x92\x1f\xa1\x43\x9f\x69\x5c\x67\xcd\xc5\x69\x0f\xa1\xef\x3c\xe6\xbf\x9b\xbd\x91\x58\x52\x74\xd5\x9e\xca\x0f\xd1\x2d\x78\x7f\xb5\x84\x10\xa4\x8c\x94\x6d\x55\x8b\xea\x59\x5c\x76\x6d\xf3\x34\xda\x88\xae\xc5\x7b\xba\x93\xc2\x94\x7a\x4e\x99\xdf\x0b\x65\x59\x82\xa7\xbf\x97\x44\x31\x6e\x3b\x88\xde\x79\x82\x1f\x37\x99\xbe\x1a\x91\x92\xc4\xb2\x82\xae\xb0\x05\xda\x25\xad\xe7\xbf\x05\x21\x36\x94\x5b\x0b\x3b\xc8\x42\xfb\x07\x10\x24\x45\x22\x6a\x9f\x81\x5a\x97\xb9\xd3\x6f\x9c\xfd\x9e\xa0\x56\x74\xfd\xfc\x87\xe5\x35\xc9\xca\xc2\x36\x07\xfb\xe3\xcc\xea\x03\xbf\x89\x4a\x1f\xf3\x9e\xe6\xbe\x3b\x92\x24\xd4\x8c\xd4\x90\x5e\x6d\xc4\xbf\x04\x3b\x24\x81\x50\x76\x23\xc6\x38\x09\x75\xc8\x67\x0f\x24\x45\x80\xab\xf1\xb9\x95\x79\xa6\x8e\x5d\xf0\x36\x61\x5b\x25\x81\x94\xa0\x98\x47\xc7\x7c\x83\xfc\xec\xa3\x13\x12\x48\xb0\x5a\x59\xae\xa9\x1d\xad\x10\xb2\x9a\xff\xdf\x48\x68\x92\x40\x05\xc2\x24\x83\x02\xb4\x85\x08\x5c\xa6\xfa\x88\x4b\x19\x19\x12\x28\x29\xb5\x93\x86\x3f\x9e\x30\x9e\xf5\x25\x6b\x96\xfa\xb5\xaf\x8c\x65\x77\x7c\x7c\x11\x7f\x8b\x55\x91\xd5\xd3\xfe\x19\x12\xe8\xd0\x2a\x30\x75\xbe\x8a\x9b\x79\xb6\xcb\xa4\x9f\xfc\xc0\x0d\x4a\xfc\x28\x51\xbf\xed\xda\xaf\x2b\x3a\x24\x80\x38\xc1\x2d\x4e\x5b\x88\xc5\x56\x95\x13\xdd\xe7\x6e\x44\x6a\x29\xa4\xee\xf3\x52\x8a\x7c\x74\x2f\x24\xe0\x56\xa3\x4b\xd8\xc5\x7a\x99\xc8\xff\x24\x84\x10\x08\xc4\xc8\x12\x8a\x9f\x87\x9f\xf7\xa2\xbe\x8e\x5e\xbb\x91\x0a\x85\xcd\x7d\x73\x8b\x15\xd0\xf0\x07\x8d\xe5\x1c\xce\xea\xbb\x0a\xe0\xef\x59\x03\x31\x21\x34\xd0\x98\xfa\x3b\x5d\x1e\x44\x17\xfb\x18\x7f\x22\x4d\x28\x3a\x36\x9b\xe6\xed\x0f\x28\x9a\xb6\x2f\x54\x13\xc2\x80\x62\xbe\xd1\x83\x38\x9c\x87\x6f\xf1\x0a\x6e\x4c\x28\xa8\x07\xbe\xef\x8a\x6e\x27\xb4\x4c\x83\x23\x30\x08\x21\xa1\x09\xd1\x16\x6d\x3e\x84\x6a\xaf\x9a\x9b\x09\x89\x94\x25\x4e\xc0\x79\x8a\x49\x8a\xba\x67\xe1\x74\x43\x62\xce\xb0\xc0\x60\xb2\xd7\xb7\x2e\x2e\xf9\xac\xc3\x89\x90\x84\x45\x8c\x79\x4d\xb4\x6e\xb3\xab\xa6\x4d\x40\x84\x20\x28\xbc\xfb\x9a\x8d\x5b\xc1\x80\x9c\xd3\xfb\x42\x9c\xeb\xb7\xb2\x99\x5d\x2f\x65\x82\x05\x3d\xa9\x94\xdb\x36\x6c\xf6\x74\x3e\x32\x4c\x2d\x2d\xb7\x73\xee\x36\xaa\x44\x02\xbd\xb1\x31\xba\x42\x54\x11\x92\xaa\x00\xfb\x18\x3b\xd7\xca\x3f\x6e\x6a\xb8\xf0\x88\xc9\x52\xcd\x7e\x47\x04\xc2\xaa\x5c\x20\xe2\xd8\x3a\x13\xfe\x44\x01\xca\x0c\x69\x0c\x4c\x8a\xfb\x43\x92\x50\xac\x64\x16\xa5\xeb\x58\xfa\xca\x77\x24\x44\x0a\x89\x1d\x65\x28\x78\x9b\xd5\x6b\x91\xe7\x50\x4d\xbc\x25\x42\x54\x44\xa3\x81\xd6\x76\xab\x4a\xcc\x36\x6f\x8a\x2b\x17\xb0\x1b\x1a\xe1\x3c\x29\xc4\x09\xf6\xad\x52\x50\xd7\x33\xd4\x1b\x21\x1a\x68\x60\x01\x4f\x4e\x2c\x0e\xf4\xcd\xc5\xce\x87\xd9\xd5\x80\xf0\xb1\x34\x94\xef\x27\x9a\x0d\xe2\x06\x33\x1b\xb7\x59\xdd\xed\x4a\x30\x9f\x53\x10\x3a\x11\x0e\xaf\x22\xe3\xff\x2e\x22\x0d\x93\x5a\xc4\x17\xf4\x44\x43\xa1\xbd\x5b\x82\x31\x86\x74\x6f\xa2\x46\xe5\xac\xbf\x40\x54\xf3\xe5\x6e\x80\xa3\x39\x40\xcd\x8f\x81\xd5\x3d\x21\x34\x88\xad\x47\xa0\xb1\xce\x70\xff\xf0\x6f\x7f\x80\xc8\x40\x0f\x6c\xcc\xfb\x6e\xd7\xd5\xc8\x18\x33\x99\xd6\x94\x68\xdb\xb1\xf2\x78\x79\xce\xfe\xfe\x5b\x3c\x67\x16\x29\xf1\x5c\xc1\x98\xe4\xff\x33\x38\xf5\x2f\x9b\xe7\xbf\x34\xf8\x94\x68\x6b\x5e\x5e\x56\x87\xcd\xf1\x76\xf5\xd7\x31\xf6\x77\xcf\x22\xf0\x0a\x69\xdf\x6b\xa8\xfe\x9a\xf1\x30\xf4\xb7\xcf\x03\x66\x15\x0a\xca\xa2\xb5\xaa\x9e\xf8\x0e\xa7\x74\xdd\xdd\x30\x89\x1f\xad\x6e\xa5\x7f\xb5\x23\x66\xc7\xa9\xcb\x47\xb9\x94\xe8\x03\xab\xb2\x68\xb2\xa2\x75\xa4\xb5\xc3\xa6\x4f\x43\x1a\xf2\x64\x1a\x32\xef\x3b\x27\xba\xba\xc9\x85\x7a\xef\x75\xe2\x0e\x97\xf3\xd4\x43\xa5\x21\xb5\xc2\xaf\x9d\x33\x29\x6a\xf8\x57\x9b\xcd\x2a\xf5\x84\x86\x8a\xa0\x33\x6f\x31\x13\xfb\x39\xc6\xab\x1b\x10\xa1\xb6\xcf\xf1\x15\x9a\xdb\xec\x23\xd3\x50\xe8\x7a\xd1\x51\xa2\xa1\x02\x04\x53\xd5\x6f\xe5\x8f\x47\xa8\xeb\xc1\xf0\xd3\xd0\x28\x44\x1c\x35\x6f\x59\xa5\xdd\xc7\xde\x14\x7a\x40\x29\x12\x1a\x31\xe3\x89\x81\xf7\xdd\xa4\xd6\xa3\xa0\x83\xd0\x28\x4d\xb1\xf4\xf6\xaf\x36\xab\x32\x55\xd6\xc3\xdf\x05\xfa\x55\x1f\x65\x03\xcb\x77\x15\xa5\x96\xcc\x17\x29\xb3\x3a\xdb\xbf\x2f\xf3\x76\x22\xf0\xbd\xc4\x25\x33\x4c\x9a\x2e\xf8\x74\x64\x43\xcf\x6d\xf1\x5e\x5b\x61\xce\x7e\x53\xa5\x91\x92\x04\x7a\x58\xb2\x05\x07\xce\x75\x5c\xfc\x50\xe0\xd8\x3d\x70\x7e\xcb\x72\x51\x34\x6f\x55\x79\xce\xea\xd9\x37\x4b\x88\x25\x3e\xb4\x24\xdb\xd7\x20\xe7\x4f\xa6\x76\x1a\x88\xc4\x36\x65\x64\x2a\xcb\x46\x5b\x3b\x4d\x29\xf1\xb2\x4d\xb6\x7a\xde\x45\xb1\x9e\xa6\xa6\x1f\x14\x92\x54\x7b\x99\xc4\xeb\xe0\x98\xd0\x54\x08\x84\xe7\x78\x60\xe2\x1d\x20\x4b\x8e\x2f\xc9\xad\xb4\x86\xaf\x21\x91\x84\xa6\x46\x11\x35\x2d\x63\xb9\x23\x82\x1b\x5c\x7d\x37\x20\xac\x17\xd6\xb7\x53\x4d\xe0\xcd\x84\x0a\x93\x80\xf2\x20\x21\xb4\xa6\x03\x29\x15\xa1\x52\x84\x81\xb2\x38\xd8\x4d\xa1\x47\xf5\x4f\x42\x15\xa3\x48\xa6\xf0\x09\xa9\xd8\xf4\x46\x55\x12\x8d\xc4\x93\xac\x56\xea\xbc\xce\x3b\xf9\x66\x4a\x1a\x96\x38\x2c\xcd\x9d\xca\x66\xaf\x4e\x69\x6d\x5c\xbc\xbc\x17\x1f\xa0\x9d\x08\xaa\x3f\x6a\x62\x94\xb2\xc2\x7a\xd2\x73\xf7\x1b\x3d\xee\x8f\x50\x1d\x06\x5c\x4f\x8c\xbc\x75\x26\xa6\x33\x5c\x47\x0a\x2f\xe1\x58\x70\x9c\x8e\xe2\xf4\x26\x80\x68\x04\x12\xac\x9e\x0f\xb3\xb3\x21\x8a\xb1\x6f\xf9\xb1\x7b\x9d\x22\xbb\x82\xe7\x7f\x99\x2b\x26\x14\x74\xa8\x2c\xb2\xef\x5c\x56\x0b\xda\xe5\x7d\x85\x90\x50\x13\x86\xca\x25\xd6\x48\xb0\xd2\xb3\xed\x92\x1a\x6d\xe9\x1d\xcf\xe2\x72\x28\x7b\x04\xe3\xe2\xaf\xb2\x20\x24\x23\xcd\xff\xfb\xdd\xf3\xec\xc3\x4c\xbf\x28\x0b\x54\x6a\x41\xf6\x45\x53\xa1\xfa\x00\x7e\xd4\xa7\xf6\xe4\x70\xed\xd3\xd1\x34\x4c\x70\xa2\x5a\x22\xc4\x17\x91\xd5\xa0\xb7\x45\xdf\xde\x41\x18\x05\x8a\x95\x32\x2f\xe6\xb8\x17\xa6\x47\xec\xde\x55\xe5\xe9\xf3\x6d\x78\x78\x1b\x8c\x31\x8d\xd8\xdd\x87\xdf\x6f\xbe\x80\xe8\x13\xc6\x83\x88\xfb\xde\x9f\x12\xab\x19\x23\xd0\xa0\x1b\x13\x06\x52\xf3\x01\xef\x87\x0a\x5c\x98\x36\x42\x6f\xbe\x76\x7a\xc0\xde\x68\xb2\x48\x11\x69\xe1\x81\x96\xce\xb1\xdb\xf2\x76\x0e\xd9\x36\xf9\xed\xc8\x58\x62\xab\x1a\xbc\x44\xf2\xce\x60\xe5\x6c\x97\xeb\x45\x87\xa3\x3f\x4f\xd3\xa1\x41\xe8\xbf\x4a\xf9\x59\xab\xec\xf4\xb4\x34\x4c\xa2\xa8\xd7\xf7\xd8\x19\x0c\xc5\xfa\xbb\x4e\xa5\xc2\xc0\x14\x14\xbe\x06\xe8\xad\x17\x13\x61\x8c\xdd\xab\xc8\xcb\xe2\x93\x18\xeb\x31\x03\xd0\x64\x17\x67\x32\xa0\xdc\x4c\xc8\xcd\xb6\xc5\xf7\xfa\xba\x18\x34\xd9\x09\x99\x8c\x42\x21\xfa\x5e\xa5\xb5\xf8\x3f\x6d\x03\x53\x4d\x16\xc2\x34\x61\xca\x33\x5e\xdc\x4c\x77\x52\xa6\xc3\xd4\xf3\x78\x3b\x97\xbe\xec\x5d\xd5\xc9\xfc\xd3\x91\x42\x3c\xa0\x75\x32\x06\x2c\x9b\x3f\x9c\xd8\x5a\x8b\xa8\x9a\xcd\xcf\x73\xde\x57\x70\x09\xd3\x86\x63\xd6\xf0\x5c\xc1\x63\x56\x80\xbe\xeb\x51\x15\x84\x41\x6c\xd5\xf9\x7f\xf4\x14\x26\x4f\x65\x75\xf2\x10\x42\xc2\x20\x15\x4a\x78\x7a\xc0\xd9\xbc\xfd\x5c\xdc\x76\xd4\xcc\x45\x98\xe1\x1a\xab\xe0\x59\xbd\x6f\xc4\xbb\x15\xcf\xcc\xca\xfe\x0e\x4c\x18\x31\xcb\xee\xf4\x51\xdb\xc2\xf5\x70\x24\xc6\xa4\xe3\x43\x56\xbc\xbf\xc0\x07\x14\x7d\x54\xc6\x8c\x06\x35\xf2\x7d\xc0\x43\x49\xef\xca\xea\xd6\x67\x08\xfd\x1b\xe6\x81\xb2\x85\xfd\xf7\x8f\x66\x44\xbb\x41\x78\xa0\x03\xad\xfa\x94\x46\xd3\xd9\xf1\xf1\x34\xe7\xc4\x68\x86\x4a\x48\x99\x7a\xef\x62\xa7\xac\x02\xfd\x50\x7a\x13\xcd\x29\x0f\x99\xa5\x01\x15\x1f\xe0\x62\xab\xc5\x25\xde\xdf\x08\x15\x34\x14\xae\xa8\xb7\xca\x33\x05\x77\x65\x89\x1a\x98\xfe\xb8\x4c\xd0\xd4\x81\xce\x9a\x7b\x51\x69\x28\x7e\x81\x89\x22\x9c\x01\xd3\xce\x0d\x99\xd0\xf7\x5c\x0d\xb3\x7c\xc4\xaf\x02\x3b\xae\x06\x3f\x85\x33\x63\x19\x27\x9d\xdc\x53\x3d\xc2\xcf\x11\xce\xa3\x30\x10\xf3\x68\xe2\x50\x7e\xf2\x23\x3c\x89\x95\x63\x12\xdd\xb7\x67\xa8\x90\xd3\xad\x9a\x81\x36\x12\x3f\x18\x80\xda\xc5\xf6\x61\x23\x77\x87\x93\x9b\xf2\x4c\x11\x1e\x19\x66\x8d\x6a\x7d\xe7\x28\x21\xfb\x5b\x8f\xa5\x25\xc4\xd0\xd0\x45\x91\xcf\xae\x4b\x7a\xba\xbc\x78\xa2\xa9\x71\x7e\xce\x53\xa9\x61\xab\x97\x53\x56\x3c\x8d\xc2\x58\xfa\x1a\xc9\xa6\x79\x9b\x0b\xb1\x77\x43\x62\xa2\x6d\x9a\xa2\x6e\x61\xd6\xee\x31\xfb\x77\xc6\x4b\x43\x78\x0a\x22\x95\x3d\x40\x76\xff\x9e\x79\x26\x26\xc2\x45\x9c\x60\xd8\xfb\xfb\xe3\x57\x06\x9f\x0b\x99\x22\xd2\xa4\x8b\x9c\xeb\x31\x0e\x98\x70\x01\x01\xa2\x92\x5e\x95\xcf\x8c\x70\xc9\x2c\xa5\xaf\xf6\xbe\xf9\xec\x59\x64\xc8\xb0\xdc\xdd\xdd\xc8\xc8\x2d\xe4\xaa\xf3\xc9\x47\x04\x7e\xe3\x9e\xc3\xe5\x17\xa7\xa8\x10\x03\xb4\x1b\xf3\xd9\x3d\xe3\xc2\xf4\x37\x81\xda\x0a\xd8\xc0\xc2\x6d\x85\x92\xc6\xef\x8e\xf4\x83\x99\x44\xe6\x48\x27\xae\xfc\xab\x9e\x35\xc2\x21\x54\xa9\xec\x69\xa5\x7a\x01\x48\xff\x60\x10\x69\x0c\x35\x8e\x6d\x71\x16\xea\x7d\xab\xaf\x29\xeb\x09\x07\x29\x10\x94\x5d\x67\xa7\xe7\xb6\xf3\x47\x3f\x00\x31\xd5\x50\xdb\x46\xf6\xf1\xda\x30\x31\xc3\xf4\xfa\xb9\x0f\xf7\x36\xc3\x4a\x36\x29\x75\x5d\x4b\x97\x6e\x17\xdd\x7a\xb8\xd8\x00\x14\xeb\x9c\x6e\xdb\x95\x31\xdd\x2b\xb8\x91\x1a\xb9\xb9\x6d\x2f\xd4\xcd\x61\xbd\x20\x8e\x99\x90\x10\x99\x22\xdc\x96\x02\x05\x20\x71\x7f\x75\xb9\xb5\x04\xba\xee\x36\x42\x12\x29\x9c\xd4\xce\xb7\x3e\x6c\x9f\xeb\xf1\xc4\x09\xa9\xb2\xb4\x29\x48\x03\xb2\x87\xc6\x4a\xb6\x59\x75\xd1\xf1\xcb\x0d\x19\x51\x08\xd3\xec\x9c\xd4\x77\x6f\x85\x43\x1e\x1b\x8a\x3a\x9c\xbb\xa7\x6d\xff\x37\x19\xc6\xaa\xd7\xed\xaf\x57\xa6\x6f\x3a\x26\x21\xd7\x5c\x83\x27\xcb\xc0\x5a\xe1\xe2\x94\x0a\xc3\x80\x26\x31\x8a\x7c\x6f\xf6\xab\x87\xcd\x71\xfd\xb0\xdb\x6f\x9f\xee\x8f\x87\xed\xe3\xc6\x5f\x2b\x64\x71\x30\xe5\x0d\xef\xdc\x9b\x9d\xd9\x8f\xf1\xdd\xb3\x77\x16\xb1\x14\x7a\x76\xb1\x36\xe2\xfe\x5a\x91\x30\xd8\x9e\xb7\xca\xa1\x79\x83\xec\x4a\xa1\x6f\xea\x8f\x84\xb1\xe6\xc8\x31\x29\xb3\x42\xcf\x23\x00\x37\x24\x09\xe2\xc8\x95\xb3\xbf\x17\xd9\xff\xb6\xf0\x90\x15\xe3\x0e\x7b\x12\x26\x3c\xc6\xdf\x3c\x0a\xad\xd1\x72\xef\xcc\xa2\xbd\x1c\xee\x3e\xe1\x06\x1b\x8d\xd6\x6d\x93\xc1\x4d\x36\xee\x85\x23\x61\x12\x73\xc7\xdf\x8a\xaa\x17\x1a\x50\x7e\x79\xd4\x32\x35\xab\x41\x85\x29\x15\xc2\x4e\x8d\xba\x11\x45\xe3\xe8\xb8\xfd\xc1\x58\x07\x9e\x68\x67\xab\x66\x35\x89\xd9\x6d\x09\x9e\x78\xec\xd2\xc6\x39\x60\x0b\x4c\x66\x24\x94\x2a\xc6\xbc\x76\x17\x92\x3b\xa2\x8b\xe3\xb9\x2c\xf3\xa3\x18\xaf\xd3\x50\x31\x9b\x96\xb3\x1e\x18\x54\x7d\x7f\xb0\x77\xf8\x42\x4d\x0c\x84\xb8\x40\xba\x6b\xac\xdf\x44\x51\xc0\x35\xf8\x73\xfa\xe3\x5a\x69\x6c\xe6\xd0\x22\xcb\xbd\xc4\xf3\x10\x6d\x85\x1a\xac\xee\x9f\x13\xa4\x1b\xea\x2b\x53\x5c\xa4\x1b\x0d\xd2\x36\x97\xd7\xa2\x29\x61\xb6\x5f\x85\xa0\x22\xc4\xb4\xfd\xed\x40\xa6\x23\xfa\x31\x12\x9a\x98\x59\x71\xfe\xe3\x0f\x7c\x45\xd3\x94\x64\x14\xb0\x48\xc0\xd0\x76\x76\x12\x55\xb3\x3c\xbf\xa2\x40\x52\xde\x3d\xcf\xcd\xee\xe9\xfb\xfe\x78\xd8\x6e\x5e\x58\x7f\x11\x13\xc8\x70\x68\x0a\xfb\x57\x5b\x56\xbd\x4b\x1c\x11\x66\x25\x2d\x1e\xca\xd7\x67\xd1\xce\x80\x1b\x24\x22\x11\x93\xbd\x42\xf8\xbd\x38\x79\x80\xcb\x90\x27\x8c\x48\x6c\xd0\x3c\x55\xf0\x50\x0a\xfd\xef\xee\xb6\x96\x83\xb1\x88\xa4\x69\xd8\xd9\x8c\xdb\xd5\xce\x13\x02\x7d\xf9\x91\x22\xa2\x42\xb0\x38\x82\xac\x38\xca\x71\x1f\x35\x89\x88\xb6\xb0\x8f\xcd\x49\x64\xf9\x7e\x49\xa6\x62\x61\x4f\x88\x88\x09\xd0\x27\x86\x9f\xa0\xb6\xb7\xfe\x5a\x34\xb6\xd9\x3a\x9f\x80\xc5\xf9\x77\x0d\x28\x22\x11\xd5\x90\x2a\x5f\x87\xbc\x9c\x9b\x72\xf5\x21\x1a\x51\xcd\x47\x99\x08\x8b\xfd\x0f\xe5\xeb\x1d\x76\xa6\x0c\x78\x80\x6b\x88\xe0\xe7\x52\xea\x09\x89\x58\x94\x10\x18\x58\x37\xf6\xd9\x6b\x21\x3a\xd7\xe8\xaa\x21\xae\x5d\x22\x3b\x76\x17\xe1\x84\x99\xb1\x44\xc6\x73\x05\x96\xd9\xe9\x9b\xa8\xdf\xc6\x02\x00\xff\x34\x79\x3a\xda\xf4\x22\x4e\x8c\xb1\xb2\x63\x75\x56\x94\x48\x5b\x3b\xfd\x86\x3c\xb2\x79\xaa\xda\xf1\x4a\x20\xe4\x75\xf9\x69\x43\x66\x15\x9c\x6a\xc7\x77\x09\xbd\x42\xf0\xf4\x92\x61\x4a\x30\x33\xed\x43\x94\x4d\xf3\x36\x6f\x9b\x1d\xdf\x62\x4c\x2c\x29\x7d\x77\x59\x44\xc1\x3c\x64\xb2\x12\x57\x57\x8d\x23\x40\x8e\xad\xbb\xfb\xb2\x1a\x5b\xd2\x28\xd6\x29\x82\xac\x34\x78\x05\xad\x59\xea\x30\x4a\x24\xc7\xcf\x64\xbd\xe1\x3f\x1f\xbe\x72\x4b\x22\x91\xc4\xcc\xf4\x31\xef\x63\x59\x79\x41\x38\x67\xb8\xea\xbe\x69\x6b\xfa\x76\x64\x14\xc6\xdc\xc1\xdd\x47\x70\x2f\xcf\x0c\x37\x2c\x48\x69\x38\x36\xe5\x4d\x7c\xf4\x2b\x28\xcc\xb5\x6e\x6d\x7f\xba\x41\xe8\xcf\x7a\x7b\x37\xf2\x03\x23\xc5\x85\xb6\x08\x96\xba\x73\x81\xd6\x22\x57\xfd\xa1\x28\x52\x83\x70\xf3\x4b\x37\x07\x3e\x49\x95\x2e\xa7\x4e\x23\x15\x47\x98\xef\xbc\x2f\xcb\xbf\xe1\x9f\x49\x1e\x76\x27\x69\x14\x87\x72\xcd\xde\xab\x3c\x5f\x15\x7a\x2d\xf2\x25\x8e\x58\x12\x29\x11\x5b\xf0\x51\x5f\x08\xdf\xc3\x64\x3d\x4e\xef\x48\x13\x4b\x2c\xb7\xdf\xde\x3f\xae\x8e\x77\x87\x87\xe3\xfe\x79\xb3\xe9\x0d\x86\x66\x1a\xb3\xcc\x67\x97\x43\x58\x0d\xfa\x76\x78\x50\xb9\xad\xfe\x98\x15\xa6\x9c\x4d\x16\x2d\x05\x70\x0b\x4a\x84\xe6\x4d\xfc\x21\x7a\xc0\x20\x89\x80\x10\xe7\x2b\x35\x8f\xe2\xe7\x15\xfd\x01\x89\x80\x72\xaf\x3f\xd8\x9e\x1d\x06\xaf\xdf\x2d\x40\x33\xdc\xd3\xe0\x94\x35\x77\x30\xe9\x50\x9e\xde\x82\x61\x9c\xd9\x36\xc1\x9f\xd8\x3b\x67\x85\x75\x46\xad\xfc\xdd\x10\x83\x19\xc5\x93\xd0\xbf\x0f\xfb\x62\x64\x14\x20\x2d\x39\xf6\x40\x8e\x9c\xd7\xb9\x0d\xb9\xae\x0c\x46\xc6\x48\xf4\x2f\xbe\xdb\xbf\xdb\x15\xfe\xdb\x92\x21\x88\x03\xaa\xd8\xd0\xed\x76\xf4\x18\x79\x12\x07\x31\xc3\x95\xff\x78\xb9\xc9\x9a\xe1\xd6\xfd\x61\x12\xa8\xd8\x25\x01\x1e\x2f\xcf\x65\x9e\xa9\xac\xaf\xff\xc6\x84\x45\x08\x86\xb3\xbc\x21\x37\x97\x7f\x67\x23\xae\xa4\x7e\xf5\xc4\x24\xd4\x08\x3c\x3d\x6f\xf5\xb6\x81\xea\xd8\x9f\x9e\xa4\xda\xc1\x1d\x36\xa2\xca\x2f\xc8\xec\xf6\x35\x3d\x0e\x89\x29\x8f\x94\x3b\x09\xa3\x34\xed\xeb\x3f\xb3\x61\x49\xac\x2d\xf3\xf2\xee\x47\x71\x95\xb7\x8d\x59\x62\x61\x7c\x0f\xe5\xeb\xf7\xa2\x46\x1c\xe1\x6e\xdc\x1d\xe5\x87\xc9\x84\xb8\x5a\xf1\x53\x7b\x5a\x67\xcd\x02\x02\xc2\x0f\x05\x0b\x7f\x44\x54\x87\x12\xe7\xe3\x0f\xc8\xfc\x83\xf2\x98\x22\xcf\x0c\x22\xdb\x8e\xdb\xa7\xed\x61\x19\x0d\xe5\xf7\x97\x98\xcb\x08\x93\x14\x88\x19\x5d\xb7\xcd\x55\x26\x2a\x0e\x09\xf3\x3a\xd1\xab\x3c\x5f\x8b\x4a\xd7\x8f\xa5\x46\x35\x83\xe7\x2a\x3b\x89\xea\xf2\x47\x9f\x60\x8a\xc3\xc4\x60\x76\x48\x96\x6f\x3f\x7c\xca\x3e\x8e\x38\xc1\x9c\xd8\x7e\xbd\x5e\x7f\x65\x5d\xe3\x28\x16\xbe\x3a\x34\x48\x26\xcc\xe0\x44\x71\x4c\x6d\x86\x4e\x67\xb5\x90\xb9\x47\x53\xe0\x9c\x6e\xae\xc0\xa0\x24\x8e\x23\x89\x96\x46\x0a\xf5\xde\x9e\x8f\x76\x56\x7e\xf2\x66\xe3\xd8\x92\x3b\x1f\xc4\xfb\x24\x3a\x8c\x63\x63\xd0\x95\xeb\xc9\xb5\x96\xdc\xb8\x38\x49\x00\x71\x3b\x42\x6b\xaf\xec\xb8\x80\xfd\x24\x71\x22\x52\xee\x44\xb3\x8f\xb5\x42\xf6\x9a\xf9\x00\x89\x6d\xbb\xc7\x66\x94\x6f\xb6\x7d\x0c\xcf\xe2\x52\xdf\x01\x1c\xe5\x65\x99\x1d\x63\xd1\x22\xc6\xa9\xa2\x48\xfb\x31\x6a\x77\xfb\xb4\x84\x13\x0b\x1d\x61\xf5\xf7\xdf\xdf\x76\xfe\x0b\x0a\x63\xd0\x0b\x71\x18\x1d\x5f\xee\xb4\x58\x9d\xcb\xaf\x90\x3a\xee\x22\x92\x04\x5e\x43\xdd\x7e\x34\xfb\x8d\x9b\xcb\x93\xa8\x54\xf9\x02\xf5\x79\x24\x1a\xdf\x9f\xa3\x34\xed\xd3\x00\x8d\x78\xef\xf3\x45\xb1\x4c\x03\x9f\x0a\x5a\x8b\x06\x5e\xcb\xea\xb2\xed\x0f\x2a\x62\x55\x6c\x91\xad\x64\xbb\xde\x7d\x79\x8b\x89\x3f\x29\xe6\x1e\x81\xda\xe4\xf0\x00\xe2\xb5\x4f\x51\xc6\x2a\x49\x23\x07\x54\x7e\xe8\xa2\xf2\xd9\x17\xd3\x11\xc5\x59\x66\xe1\xad\xf7\xd0\x7c\xcb\x5e\xdf\xee\xb2\x8f\xfe\x7c\x48\x2c\x2b\xee\xfe\xb0\xfa\x7d\x73\xb4\x8e\x3e\x76\x25\xf6\x03\x52\xcd\x5c\x53\xa2\xf5\xaf\x67\x6f\x02\x94\x08\xec\x1e\x58\xd4\xd8\x0f\x75\x73\xf9\x8c\xc1\x8c\xc4\xa0\xa5\x76\x5e\xd3\x18\x7b\xef\x1f\xd4\x04\x81\x67\x9e\xc9\xe0\x03\x96\xb8\x73\x48\x6c\xa2\x04\x43\x83\x9b\x87\xd5\x6a\xbb\xde\x79\x11\x6b\x92\x04\xb1\x08\xe2\x71\xe2\x07\x9d\xed\x05\x6e\x68\x92\x04\x69\xac\x5c\x5a\x03\xe9\xf2\x3e\xed\x0d\x27\x08\xc9\x56\x83\x47\x70\x15\x10\x4c\xcc\x56\x42\x58\x3a\xe0\x74\x36\xb7\x9b\x7f\xcf\xae\x46\x64\x80\x98\x79\x65\xd1\x1b\xdb\xd3\x39\x77\xe4\xbe\xd3\xeb\x50\x42\x4c\x32\x95\x88\xaf\x9f\xda\x65\xae\xc2\x6e\x74\x8c\x60\x50\x84\x44\xd5\x36\xc8\xfe\x9a\xa6\x9e\x24\x94\x6b\xaf\xae\x78\x2b\x1a\x71\x24\xb3\x57\x44\x55\x84\x8c\xb3\x03\xdf\xea\x6f\x0b\xa6\x31\x61\x41\xe8\x84\xf6\x4f\x19\x92\x62\xfa\xaf\xc1\x59\xa2\x84\x27\x2e\xff\xfb\xef\x67\x51\x68\xf1\xaf\xb6\x6c\xc4\xce\xcc\x7e\x29\xe4\x01\x75\x0d\x2c\x9d\xbf\x75\xba\x2a\x9d\x7c\x6a\x12\x92\x50\x26\x30\xe8\x74\x3d\x83\x45\xd4\xbb\x83\x11\xb5\x79\xa3\x02\x7e\x1c\xde\x2a\x10\x7a\x5d\x9e\xc6\x3c\x32\xfd\xce\x33\x79\xa0\x84\xc7\xb6\x62\xef\xe4\x1b\xc7\xe9\x94\x24\x31\x31\x16\xe7\x9c\xc8\xb9\xff\x73\x1a\xca\x98\xf5\x25\xad\xea\xf2\x59\xcb\xa7\x1b\x2e\x48\x8a\xb1\xf3\x1d\xa0\x3e\x3b\xf1\x97\x11\x5c\x72\x57\x41\xd9\x8b\x1c\x1e\xb3\x49\x93\x38\x49\x84\x66\xa8\x90\x8a\x04\xf9\xb6\x2d\xee\x17\x1f\x59\x72\xab\xba\x65\xf5\xea\x10\xa3\x31\x2d\x19\x4c\x9f\x5d\x51\x4b\x73\xff\xed\xf9\x97\x74\x76\x24\x51\x51\x10\x19\xdb\x15\xf7\x0f\x25\x3f\xf0\xdf\x88\xcf\xee\x51\x73\x89\xe2\xc9\xe5\x8f\x4f\xf4\xd0\x49\x02\x89\x32\xc2\x03\x04\x5e\xcb\xef\x2f\x0f\x93\xbc\x61\x62\x62\x1d\xf4\x09\x85\xbe\x16\xea\xba\x4e\x1d\xc9\xcc\x7e\xa9\x37\x60\xfa\x33\x26\xa5\xc8\xde\x6c\x83\x28\x5f\xca\x43\x1a\x92\x4f\x1f\x6d\xba\x6c\x8d\x8e\x31\x4b\x2d\xc1\x94\x15\xdc\xb4\x3e\x05\x9a\x06\x3c\xc2\xf4\x55\x2e\xea\x81\x0a\xa8\x57\x58\xf6\x83\x94\x09\x1c\x0e\xe8\x45\x34\x70\xdc\x1c\xbe\x75\xce\xf3\xe4\x26\x53\x12\x0a\xe4\x82\xc2\xcc\xdb\x1e\xae\x52\x37\x4b\x5a\x51\x24\x25\x31\xc7\xf8\xeb\x8a\xd9\x8e\xa4\x44\x48\x24\xbf\xb0\x22\x3d\xeb\xb2\xf8\x80\xaa\xce\xca\xe2\x4a\xa8\x87\xa4\x44\xa6\x28\xb1\x7b\x3c\x5a\x0e\xdc\x42\xdb\x1c\x9c\x0b\x94\xeb\x47\xd1\xa8\xb7\xe3\xf1\xeb\x04\x4c\x4a\x34\x0b\x1c\x8d\x5c\xdd\x59\xde\xf7\x21\x14\x48\x29\xa3\x88\x26\x38\x75\xfe\xec\xf4\x34\xca\x19\x33\x83\x78\x87\x65\xc8\x77\x0d\x43\x5f\x7e\xd7\x94\x31\x1a\x4b\x57\x10\x23\x37\xa5\xf4\x3f\xc6\x12\x8e\xc5\xed\x3c\x2b\xde\xd1\xcc\x55\x4f\x23\x4a\x81\x61\x10\x3e\xf3\x19\xab\x08\x87\xb2\x4f\x9f\xba\xe3\x5c\xd8\x7c\x29\x3e\xfb\xb9\x2c\xbd\xcb\x99\x86\x81\x6d\x87\xb9\xc9\x9a\xba\x87\x89\xa4\x21\xa1\x6a\x22\xa5\xf3\x99\xa5\x73\xe3\x23\x92\x62\x0a\xee\x69\x73\x78\xf1\xd7\x88\x38\x41\x65\x83\xfb\xb6\x6e\xc4\x47\x89\x6c\x40\x7d\xfb\xcb\x3f\x02\x4e\xa4\x91\x4c\xbc\xb0\x14\x56\x28\x76\xd5\x7f\x43\x55\xce\x1e\x3d\x09\x14\x76\x24\xef\x77\x0f\xbb\x5e\x78\x9e\xa4\x09\xb1\x74\x4a\x18\x10\xdd\x55\xa2\x78\xcf\xfb\x38\x35\x4d\x40\x4b\x57\x67\x76\x28\x9d\xd9\x67\x4c\x09\xf5\x32\xcd\x63\x0e\x53\x7f\x94\x5a\x5d\x7e\xef\x60\x7e\xaf\x7d\xaa\x61\x54\x0f\x5c\xfe\xca\x42\x82\xc5\x9b\x65\x1f\x70\x57\x01\x7c\x9f\xd7\x92\x49\x3f\x52\x5b\x19\x8a\x4d\xdd\x64\xa7\x6e\xab\xdc\xae\x77\x63\x5f\xc1\x0d\xeb\xb6\xea\xee\xcb\x5a\x0d\x87\x6e\x9e\x65\x0b\xcd\x8d\xcb\x37\x23\x69\xe8\x14\x46\x6c\xc7\xc9\xec\x68\x1a\xe3\x7e\xe1\x1c\x9c\x41\xbe\x6a\xf9\x62\x2a\xb4\xc3\x7f\x0c\x68\xbe\x47\x51\x5c\xe6\x0d\x1f\xa9\x32\x1a\x6b\x77\x7f\xdd\x1d\x7e\x69\xbe\x53\x60\x69\xe0\xf4\x6d\x30\x93\xff\x99\xf3\x3d\x9b\x38\x00\x01\xd6\xd1\x31\x9f\x64\x84\x82\xad\x3e\x6e\x5e\xd6\x31\xf5\xbb\x58\x6a\x28\xc7\x2e\x33\x6b\x45\x87\x98\x72\x6e\xf8\x53\x43\xc3\xd0\x6a\xfb\x1c\xcf\xa2\xae\x55\xa9\xe1\xa8\xca\xaa\x1a\x79\xdb\x53\xf3\x9a\x9a\xd0\x8a\x6e\xcb\xb6\xea\x8c\xcf\x98\x9c\x9f\xa4\x26\x49\x69\xec\x69\x6a\x73\xa8\x9b\xb2\x80\x7a\x2c\x35\xf9\x05\x69\x23\x11\x41\xc0\xb0\x94\xf2\xd7\xee\xe9\x56\x0d\x19\x2a\x11\x30\x82\x58\x69\xe1\xb3\x74\xde\x29\x9d\x3c\x8b\x08\x12\x8e\x40\xc5\x0a\x4e\x02\x1b\xdf\xef\x45\x6d\x4b\x6b\xcf\x83\x49\x10\x41\x2a\x6d\x62\x1e\xaa\x57\x78\x04\x2d\xae\xa8\xe7\xdd\x40\xc2\x12\xb4\x4c\xc8\x15\xa5\xff\x28\x87\x0e\x78\x7f\x29\x62\x04\x42\x27\xb3\x06\x4e\xb6\x43\xaa\x3f\x44\xa9\x44\x4c\x95\x97\x1d\x71\x2c\x65\xbf\xf2\x08\xbb\xf3\x00\x86\x39\xfb\xdc\x73\xd9\x11\x41\x59\x82\x1e\x0b\x22\x28\xff\x14\x1f\x4e\xf6\xc5\x1f\x0d\xa3\xc4\x01\x75\xfe\xbd\xd0\x57\x22\x68\x62\x11\x2f\x4e\x09\xfe\x06\x86\xeb\x26\x56\x57\x26\xab\x91\xe6\xaa\x0f\xa2\x04\x63\x02\x9d\x0b\xfc\xfe\x87\x12\xd5\xf3\x26\x73\x41\x30\x69\x7b\x4c\x1c\x29\x81\x18\x6e\x87\x47\x11\x56\x1f\xaa\x32\xcf\xcb\x0f\xa8\x3c\x26\xcd\x1f\x16\x06\x4b\x9a\xb6\x38\xb4\x6c\x84\xdd\xd0\xb0\xb3\x14\xdd\xa4\x10\x27\xd1\x0c\x76\x76\x20\x01\x20\x22\x84\x04\xbb\xaf\xb7\xeb\x9d\x07\x9a\xcf\xba\x6f\x44\x14\xa8\x40\x8f\xc5\xf8\x67\x05\x00\x11\x33\xa1\xc3\x91\xf6\xe6\xfe\x72\x92\xe5\x2c\x92\x13\x71\x48\x61\x78\xde\xbd\x16\xb3\x92\x90\x88\x45\x88\x0b\x7a\xa5\x9a\xec\xa3\xc7\x46\x0e\x30\x4b\x11\x0b\x85\x95\x92\xc7\xd5\xbf\x8f\xcf\x9b\x97\xf5\xe6\xe9\x70\xdc\xdd\x1d\xf7\xab\x07\x5f\xee\x14\x09\xc4\x89\x73\xda\xef\x45\x2e\x7e\x0e\x99\x2e\x91\x86\x21\x26\x09\x41\x67\x0d\x92\x23\x2d\x24\xee\x85\x08\x03\x74\x4e\x84\xd6\x76\xea\x7a\xd8\xf9\xd7\x33\x4f\x74\xae\xaf\x75\x7c\x8f\xcf\x2f\xdb\x75\x7f\x3f\x52\x26\xe8\xf1\xe6\x28\xf3\xba\x33\xbf\xc3\xe5\x93\xec\x93\x50\xa9\x95\x24\x75\xbe\xe8\xda\x2b\x9d\x7c\xbd\xbf\x0a\xa5\x74\x20\x7b\x6b\x65\xe7\x18\x59\xce\x49\x09\xad\x43\x54\xf6\x3a\x4f\x11\x6d\x42\x03\x43\xbf\x0d\x65\xb8\x97\xa2\x24\x01\x34\x90\x6e\xd3\xeb\x69\xb6\x90\x8a\xe2\x3a\x1b\x2b\x40\x44\x08\xdc\x17\xcd\x93\xd7\xc0\x25\x02\x80\x1b\xee\xf1\x25\x0d\xdc\x42\x8d\x55\x1b\xd0\x2f\x16\xf9\xe8\x86\x99\x20\x46\xea\xb3\x7d\x76\x1a\xfe\x96\xa4\xdc\xc5\x48\xcf\x33\xa1\x86\xe5\x59\x6f\x52\x07\xce\x68\x44\xd5\x78\xd7\xfe\x17\xa9\x94\xd9\x5b\x35\xca\x92\xe1\x69\xc7\xb5\x88\x54\xf2\x3a\x13\x9f\x40\xf6\x84\x31\x91\x87\xd6\x1e\x1d\x91\xec\x51\x54\x32\x6b\xea\x63\x5d\xe6\xb3\x66\x18\x19\xc4\x1c\x93\xbe\x6d\x0d\xd5\xb1\x2c\x8e\x06\xdb\x79\xdc\xf3\x4a\xa2\x22\x29\x7d\xe0\x59\x3c\xf4\xac\xe3\x37\x97\x1b\x8b\xfd\xd9\xea\x6d\x71\x2f\x4e\x32\x47\x6a\xd1\xaa\xb9\xca\x13\xb9\x0b\x51\x66\x4b\x3c\xdd\x6e\xe3\x89\x9a\xdb\x81\x98\x99\x48\xaa\x03\xf4\x2b\xeb\xb7\xf2\xc7\x84\x90\xb9\x3b\xd4\x33\x0a\xdf\x5c\x60\x3f\x21\x95\x19\xf2\xc2\x92\x11\x1b\x4f\xc2\xcf\x66\x2c\x2d\xd6\x1f\x55\xa0\x3c\xe6\xef\xa7\x03\x50\x1f\x0e\x7f\x5a\xc8\x8c\xa6\xd3\xbb\x61\x20\x08\xeb\xcd\xcc\xb9\x2c\x6a\xb0\x54\x65\xd3\xa7\x0a\x39\x4f\x6d\xe9\x0c\x2c\x05\xee\x40\x17\x43\x64\x94\xda\xbd\xdb\x00\x1c\xb1\x1e\xee\x0f\xc4\x54\x23\xb8\x0f\xe7\x84\x43\xa1\x0d\xfc\x7b\x7e\x10\x8b\x30\x1a\xb7\x6b\x69\xfd\x96\xe5\x57\xa8\x6c\x3f\x52\x45\x60\xc5\xd4\xcb\xf3\xb1\xef\xfe\x93\xb1\x21\x56\xc5\xc7\xa6\xf3\xf6\x67\x28\xf4\xe0\x1c\xb9\x41\x49\x1a\x78\xec\xd0\x98\x48\xd8\x77\xd3\xba\x51\x29\xb3\xe4\xb4\xab\xdb\xcd\x1f\x2b\x7f\xaa\x30\xcc\xf6\x61\x43\x31\x33\xfc\x4b\xc2\x56\xfd\x49\x21\x32\x08\x9f\xed\x36\x7a\xd3\x5e\x3c\x0a\x6f\x26\x6a\xb5\x3c\x8b\x84\x49\xb0\xed\x0d\x11\xe1\x7b\xc7\xc4\x37\x4b\xc6\x4b\x49\x68\x6c\xe5\x8b\x7a\xd0\x52\x99\x15\x4d\xbd\x2a\xb4\xc7\xf4\xfb\x91\xd4\xb2\x63\x9f\xc5\xe5\x0e\xae\xe8\xcf\xfc\xa0\x30\xb5\x4e\x78\x59\xea\xfa\xa9\x6c\x76\xbf\xcf\x26\x81\x8c\x19\x52\x27\x74\x56\x64\x55\xa9\xb7\x31\x4d\xd5\xd8\x70\x49\x99\x72\xa4\xb6\xbb\x7d\x5a\x6f\xfe\xf5\x7d\x7b\xf0\x8d\x93\x52\xb1\xc8\x71\xc1\x23\x1f\xdb\x3e\x2b\x5e\x73\x78\xfe\xbf\xa8\x6f\x4c\xa4\x0a\x03\x70\x6e\xc3\xcd\xf7\xd5\x27\x8f\xaa\x92\x18\x17\xe9\xcd\xaf\x33\x16\x52\x53\xae\x89\xd3\xc9\xa8\x9a\x43\x4f\xb6\x49\xa4\x8e\x22\x63\xf9\x36\x5e\x3b\x5f\xf8\x11\x26\x7d\x98\x7e\x90\x8a\x13\x3d\xcd\xc9\x8d\x92\x8b\x64\x8a\x2c\x93\x86\x28\x24\xda\x38\xbc\x75\xf3\xb7\xd0\x7f\xd4\x8f\x17\x51\x9c\x84\x0f\x1c\x55\xa0\x35\x02\xd2\x3f\xb2\x3c\x17\xaf\x90\x8d\xf6\x54\x37\x82\x30\x1e\x39\xbf\x0a\xf1\x1d\xb6\x4b\xf9\x56\x94\x8b\xe9\x7b\x45\x35\x47\xb1\x85\xce\x1c\x8e\x6b\xcd\x8a\xea\xc4\xb3\x9b\xae\x3b\xb3\x50\xd4\x6d\xfd\x82\x7c\x90\x6e\x00\x4b\x42\x69\xdb\xe5\x4c\x9f\x43\x1f\x31\xf5\x10\xc5\x83\xd0\x12\x6f\x3a\xcc\xb6\x95\x06\x59\x60\x88\x5e\xfc\x48\x8a\x27\x21\xb8\x68\xf3\x36\xab\x55\x76\xce\x27\x0d\x57\x7e\x14\x10\x04\xee\x21\xb3\xf9\x97\x29\x04\x15\x46\x1a\xa9\x6d\x34\x8d\x75\x2c\x85\xb7\x98\x2a\x4c\x55\x32\x6a\xe3\x69\xc0\x11\xc4\xae\xaf\x73\xc0\x2a\x94\xb6\x95\x4e\x68\xfd\x08\x87\xf2\x7e\x4e\x4a\x4e\x54\xc4\x13\x54\xc6\x91\xd0\xfc\x55\xb6\xfd\x7e\xaf\x22\x0e\x18\xc2\xee\xb3\x9f\x96\x83\xe0\xa5\x6c\x73\x68\x7a\x60\x93\x8a\x83\x04\x57\xcd\x3a\xcf\xc0\x83\x9e\xae\x40\x1a\x7e\x6c\x6a\xd0\xf9\xeb\x25\x01\xa0\x52\x6f\xa2\x68\xbe\x24\x19\x9f\x96\x09\x96\xdd\x15\x15\x0b\x40\xe6\x24\xcb\xc4\xb5\xf9\x80\xea\x72\xeb\x59\xc3\x88\x4a\x08\xc7\xa6\x9b\x06\xf1\x6c\x0f\xa2\xb6\x5c\x46\xfd\x61\x19\xda\x44\x76\xd9\xed\xa1\xea\xfd\xc5\xaa\xea\x4e\xef\x3d\xa5\x1c\x89\xc1\x5c\x84\xf1\x52\x96\xa7\xfe\x25\xa5\x71\x82\xc2\xb6\x98\x18\xce\xea\x06\x7b\x1d\xbc\x5e\xbf\x1b\x23\xba\x3d\xcb\x76\x03\x6e\xb2\x6e\xbe\xad\x9a\xb9\xe0\xe1\xf2\xa3\xc9\x38\x55\x8b\x14\xc4\xd3\x0f\x28\x41\x98\x60\x02\x7a\xff\x9c\x4e\xcb\x9d\xa2\x78\xaa\x75\x0f\x2c\x7c\x28\xfb\x66\x2f\xa5\x64\x84\x45\x38\x6c\xbc\xac\xd5\x98\x41\x7a\x7a\x09\x4d\x1d\xef\x52\x9f\x4a\xbb\x03\x27\xe8\x35\x2e\x7a\xf4\x0f\xa3\x59\x80\xd8\xe8\xaa\x6c\x0b\x7d\x54\x47\xec\x7b\x3c\x8e\x80\x72\x4a\xf3\x10\xe7\x13\x32\xfb\x35\xe3\xa5\xad\x43\x40\x17\xc1\xa2\xf5\x3d\xd5\x0b\x51\x3a\x21\x13\xa1\x89\x71\xbc\xa6\x74\x12\x53\x8b\x85\x17\x79\x3d\x0d\xab\x94\x16\x0c\xd1\xf0\x8f\xdb\xa7\xc3\xf6\xe9\x1e\xb9\xe0\x7a\x2a\x38\xa2\x34\x10\xc4\x28\xdc\xef\x76\xb7\x47\x6c\xc6\xf0\x47\x20\xb6\xec\x06\x9d\x59\x3d\xc0\xcf\xfe\x4e\x40\x1a\xa4\x92\xfe\xb0\x09\xeb\x41\x30\x84\x28\xd0\x02\x77\xf2\xa7\x52\x8b\x5c\x8e\x3a\xa6\x94\x89\x8d\x0b\x76\xac\xbd\x41\x90\xda\xf6\x76\x46\x21\xe2\x79\x00\xcb\x32\x1f\x39\x55\x3a\x20\x80\x98\xde\xb3\xd3\x17\x25\x9a\x50\x15\x5a\x42\x13\xdc\xb8\x67\xf1\x97\x26\xcc\x36\xcb\x3b\xcf\xf3\x8a\xf8\x40\x93\xc8\x6a\xbc\x1d\xb3\xfa\x36\x13\xa7\xb2\xd0\x56\xd0\x07\xf4\x24\x0f\xad\xa9\x4a\xb0\x9d\x76\x8f\x4a\x39\x73\x76\x10\xa2\xa9\xd1\xa9\xf2\xb5\xb4\x56\x41\xb3\x54\x9c\xd2\x2c\x32\x88\x58\xfa\x7d\xf3\xc7\xf6\x69\x44\x05\x43\x34\x4b\x04\xc2\xf0\xed\x62\x3c\x9e\xac\xc2\xdd\xa2\x5d\xd1\x2c\x31\x88\xc5\xdf\xbf\x01\x34\x8f\x6d\x9d\xa9\xdf\x66\x03\x14\x67\xe1\xa4\xbd\x66\x46\x10\x4c\x34\x67\x1c\xa6\x94\xa3\xdb\x6e\x2e\x2c\x21\x85\x35\xe7\x96\xdf\xae\xb2\xf4\x36\xc7\x7c\xbc\xd2\x35\x0f\x05\x52\xe8\x65\xf5\x73\x05\xdb\xf5\xce\x32\x32\xac\x47\x22\x95\x44\x87\x10\x87\x16\x79\x8a\x6a\xe9\xdd\x46\xf4\xa7\xef\x47\xfe\x14\x5f\x74\x8d\x39\xd5\x51\xca\x24\xf8\x1a\x5c\x67\xf1\xc6\xfb\xb2\x8e\x94\x6d\xf3\x79\x13\x55\x37\x25\x51\x98\x33\xfb\xf0\xab\x5c\xc7\x71\x82\xc9\x83\x02\x7e\x3c\x96\x75\x17\xad\x65\x23\xc0\x86\x4e\x29\x68\x5b\x4f\x3d\xf7\x7f\x8a\xac\xb6\x66\x9d\xbd\xde\xe2\x1c\xc7\xa9\xd3\x6b\x28\xf4\xa3\x08\x02\x74\x20\xcf\x5e\x33\x79\x9d\xa7\xf5\xc3\xe2\x20\x74\xd5\x56\x6c\x22\xd9\xcd\xd3\xe0\x3a\x55\x21\x5e\xe8\x4d\x14\x3a\x07\x0f\xf9\x5e\x2c\x95\x6a\x61\x20\x80\x71\x45\xf4\xb6\x5d\xa0\x4b\x26\xda\xcb\xfb\x56\xa0\x01\x4e\x8e\x90\xfb\x33\x6a\xbf\x79\xd3\x81\x56\x51\x84\xb1\xa9\xad\xbe\x88\xe2\x7d\x16\x33\xfa\x61\x22\x08\xdd\xe4\xf7\x90\x37\xb1\xa8\x4d\x3e\x5a\xca\x3a\x0e\x50\xcb\xed\x3d\x53\xef\xa5\x31\x16\x65\x3a\xcd\xe7\x68\x20\x01\xd0\x51\x93\x4e\xd1\xac\xe6\x2b\x0a\x74\x88\xe4\x52\xc8\x33\xe3\x1a\xe7\xf1\xb7\x9f\x50\x79\xd9\x5f\xc9\xf0\x08\xf3\x54\x58\xd4\x77\x9d\x77\xaa\xec\x8f\x26\x29\x16\x59\x7d\x16\xf6\xd1\x3d\xa1\x0f\xc0\xa0\xdb\x22\x84\xd3\x54\xb4\xfd\x47\x53\xc4\x0a\x50\x30\xcc\x2e\x5f\x2b\x46\xb8\x39\x7c\xfb\x3a\x31\x02\x21\x4d\x95\x1e\x4d\x87\xbb\x0a\xc0\xcf\xe8\xd1\xa8\x30\x15\x76\xc2\x77\xee\xc6\xe7\x39\x12\x88\x52\x40\x9f\xd4\xb1\xa9\x3e\x42\x23\xae\xbb\xe4\x21\x52\x91\xa3\xfb\x6c\xba\xc8\x57\xfc\xec\x42\xd3\xd9\x4f\x46\x10\x24\x2e\xd8\x7c\xc8\x0c\x34\x43\x0c\x09\x71\xa8\x11\x77\xd4\x40\xdd\xd8\x65\x3e\xd4\xc1\x20\x8e\x6c\x1d\xca\x64\x85\xbe\xcb\x5e\xdb\xea\x33\x34\x11\xc4\x71\xe2\x61\x57\xeb\xb7\xb2\x1c\x78\x81\x20\x16\x29\xee\x28\xef\x59\x9e\x8f\xe3\x72\x32\x41\x4d\x40\x0c\x14\x27\x7f\x5b\xcf\xc3\x2d\x88\x1d\x73\x5d\x77\x8b\xc7\xe8\x28\x90\x6b\xe1\x05\x3a\xbb\x86\x33\xf7\x68\x93\x6c\x56\x41\xf4\x68\xb1\x13\x87\xb7\xaa\x4f\xc7\x40\xc2\xd2\x14\x1d\x97\xf2\xc7\x63\xab\xde\xb6\x85\x6b\xed\xf5\x87\x53\x5b\x70\x1a\xfc\x8e\x99\xa4\x00\x81\x44\x10\x84\xb8\x16\xf0\xc3\xb6\x43\xdc\x5c\xa6\x9d\x1f\x90\x0a\x89\x7b\xa0\x0b\x86\x37\x28\x06\x79\xf3\x49\xb2\x02\x04\xe7\x41\xdf\xaa\xa6\x01\x49\x9b\xa6\x0f\x2d\x22\xab\xaf\xfa\x0a\xcd\xe6\x23\xcb\x1f\xcb\xaa\xb9\x4c\x91\xe1\x20\x14\xc5\x0c\x30\xae\x64\xeb\xbc\x5a\x60\xf9\xec\x4a\x26\xc5\x1e\x18\x8c\x68\xc7\x9d\x1e\x20\x99\x15\x50\xaf\x5d\x59\x69\xdf\xc0\x79\x06\x2c\x00\xa9\x13\xdf\x9e\xe1\xfa\x48\x50\x38\xe5\x4b\x85\x86\xee\x2c\x00\xdf\xd4\x86\x9f\xc2\x4a\xb6\x74\x9b\xc4\x53\x59\x28\x78\x01\x4c\x86\xf6\x8b\x19\x74\x62\xe9\x07\xce\x59\xf1\x7a\xc8\x4e\x9d\xa9\x3f\x9d\xfb\x83\xc2\xc2\x25\x6b\xa8\x3e\x32\x05\x23\xf6\xac\xd9\x6b\xd5\x8a\xe1\x6b\xed\xd5\xf7\x57\x0e\x06\x32\x33\x8e\xd7\x15\x05\x30\x44\x92\x3e\x65\xd2\xbd\xc6\x4a\xa0\x08\xa6\xbf\x07\x93\x32\x5c\xb5\xb9\xa8\x9b\xbb\x16\x72\xdb\x31\x99\x15\xaf\x3d\x84\x1c\x8c\x0a\xc8\x18\x93\xfc\xad\x6c\x6b\x58\xa0\x80\x32\x81\xe2\x58\x36\x7d\xcc\xde\x11\x78\x36\xc2\xd8\x1a\x22\x38\xf2\x69\xae\x5f\x76\x7f\xde\x4e\xe9\x8f\x0c\x11\x42\xc7\x5e\x55\xa6\x50\x90\xbb\xc7\xbb\x72\x5d\x0c\xd1\x31\x5a\x6f\x3b\x19\xbb\x10\x0d\x31\xf2\x73\x3f\xdd\x8f\x76\xdc\xd2\xfe\xc6\xf7\xa5\x69\x7e\x88\x0a\x5c\xc3\xab\xfb\xee\x23\x92\x1c\x43\x8c\xc0\xf4\xed\xcb\xef\xeb\x95\xb2\x4d\x90\x5f\xdb\x46\x43\x05\xc3\x6a\xd7\x3d\x34\xb7\x28\x15\xaf\xde\x17\x28\x81\x0c\xd5\x9c\xab\x9e\xd8\xbf\xda\xea\x55\x33\xa9\xe5\x79\x8d\xc0\xb1\x93\xd0\x9d\x04\x03\xff\xa6\xeb\x60\xa6\xc7\x1f\x59\x9e\x4f\x3c\x3e\xc3\x20\x49\x63\x4f\xd7\x88\xd9\x45\x34\xa8\xd3\x5b\xe0\xc6\xa6\x63\x9a\x4c\xbd\x43\x33\xe9\x3e\x35\x61\x6a\xec\x86\xff\x26\x2a\xd8\xdb\xe9\xb8\xc8\x35\x4f\x4c\x68\xec\x27\x78\x85\xc6\x7d\x26\xdd\x05\x89\x43\x8e\xde\x44\xa1\x95\xce\x58\x97\xa7\x33\x34\x99\xe5\xdd\x1a\x18\xc8\x4c\x24\x4d\xac\xfb\x56\xc6\x41\xa3\x76\xca\x02\x61\x22\x15\x63\x87\xc4\xd1\x75\x3d\xcd\x1e\x27\x4e\xad\x0e\xae\x95\x1b\x3d\x42\xa1\x8f\x23\xfb\x6f\x92\x88\x62\xf9\x69\xf3\xf3\x3e\xab\x72\x53\x65\x50\xe8\xf1\x7c\x4c\xa2\x10\x6b\x0c\xb7\xab\xc3\xe6\xb8\x7b\xde\x3c\x1d\x77\x4f\xc7\xbb\x87\xdd\xee\xa5\x1f\x21\x22\x0b\xff\x47\x87\x02\x2b\x22\xed\xf9\x8c\x10\xd5\xa9\x25\x32\x89\x8c\xa9\x6b\x34\x41\x4f\x68\xa9\xa9\x66\x7a\xf3\x29\x51\x7c\xdc\x6b\x3a\x9f\xc0\xff\x49\xdc\xfa\x35\x42\x86\x91\x93\xdc\xee\x05\xfc\xdd\x21\x49\x2c\x9a\xf4\x2c\xaa\x26\x53\xd9\x59\x2c\x68\x5a\xfa\xa1\x34\x74\x84\xf4\x3b\x83\xdd\x73\xf9\xc4\x1d\x35\x92\x25\x58\xb5\x81\xac\xf8\x5b\xbc\xe5\x7d\x64\x67\xa4\x0a\x30\x9e\x3a\xb5\x39\x8d\x3f\xbb\xb8\x09\x50\xac\xb5\x29\x9b\x89\x1d\x36\xd2\x18\xcf\x88\x8b\xec\xfe\x53\x3b\x6f\x14\xd7\x08\xe6\xcf\x8a\x2e\x80\xae\xa1\x0b\xf0\x5d\x28\xb2\x98\xc0\x31\x2a\x36\x16\x41\x6a\xcb\x39\x77\x55\xf9\x37\x14\x53\xa3\xed\x47\x82\xe5\x25\x94\x56\xdb\x7e\x56\xa4\x32\xca\x48\x24\x6c\xf0\x04\x50\x96\xf9\x65\x52\xda\x34\x3a\x62\xaa\xfb\xa8\xef\xa2\x10\x42\x4a\x65\x9b\x98\x46\x45\x59\xa3\xa5\xf5\x63\x0e\x3d\x11\x5d\x56\xd4\x5f\x71\x1f\xb8\xf3\x20\x8c\xd1\xb3\x39\x89\x9f\x1e\x23\x3e\x3d\xae\x15\x16\xda\xd7\xd8\x77\xf2\xa3\xfc\x75\xc3\x80\x01\xd0\x58\x75\x46\x3e\xdd\x3e\x1f\xed\x7c\x10\x63\x02\xbb\xcb\xbf\x6c\x9e\x77\xcf\xeb\xd1\x4a\x34\xdc\x96\x9d\x0e\x9b\xd5\xe3\x84\xcf\x99\x18\xa3\x8d\x90\xa3\x6a\xa0\xfd\x30\x88\x50\x74\x24\x4c\x63\x5b\x4b\x83\xc0\x05\x5e\x88\x94\xde\x43\xf3\xdf\x79\x39\x48\x2c\x8f\x3f\x0e\x0d\x02\x11\x62\xcd\xd4\x36\xa0\x4d\xd8\x3c\x26\x7b\xee\xa8\xa6\x47\x03\x62\x0c\xe1\x3d\xf3\xc0\x01\xaa\x4a\x64\xd7\xf5\xa0\xe9\x3d\xd1\xc0\xb2\x88\xff\xdd\x38\x5a\x46\x1a\x50\x16\x63\x91\xcc\xa5\xf6\x31\xbd\xf2\xbd\xc8\xac\xfa\xf5\x52\x96\x87\x06\x94\x0b\xfc\xe5\xe7\xaa\x3c\x65\x75\x5d\x56\x97\xcf\x3b\x04\x69\x40\xa3\x18\x27\x85\xce\x4e\x96\xd9\x6b\xde\x5a\x4d\x03\x1a\x4b\x4c\xa8\x66\x75\xaf\x45\xb3\x60\x69\x69\xc0\x20\x46\x4c\xcf\xff\x69\xeb\x66\x0f\x85\xbe\x2d\x8b\x71\x73\x20\x0d\x98\x09\x8d\x17\x62\x9c\x4e\x71\x1a\x70\xc6\x11\x45\xed\x2d\xcc\xf1\xb3\x40\x6a\x76\xff\x9c\xc7\x98\x0d\x39\x54\xd9\xe9\x5c\x7e\x91\xcd\xfe\x8c\x97\xca\x5f\x07\x94\xd6\x3d\x02\xe7\xb7\xf1\xa7\x8c\x62\xab\xf6\x7a\x16\x6d\x0d\x48\x44\x76\xe3\xef\x3a\x92\x22\x49\x5d\x71\x78\x7f\x58\xdd\x6f\x8e\xf4\xf8\xb0\x7d\xdc\x1e\xfc\x80\x38\x4a\x51\xe8\xed\x00\x62\x4c\xff\xff\x65\xa2\x96\x06\x71\x6c\x89\xc2\x6e\xb3\x8f\x1a\xb1\x53\x6d\xa1\xcf\x65\xff\xae\x62\x19\xe0\x86\xd4\xf9\x40\x1e\x6f\x37\x4a\x55\xd1\x20\x49\x29\xf1\x5a\xe9\x68\x06\xee\x66\x94\x68\x34\x48\xb4\x41\xd0\x70\xdd\x88\x41\x05\x74\xd1\x67\xa0\x41\xca\x42\x7c\x37\xdf\x6e\xb7\x0f\xa3\x14\x39\x0d\x52\x6e\x04\x9f\x24\x43\xae\x2b\x00\x34\x48\xa5\x65\x63\xea\xc2\xb0\xce\x1e\xd5\x94\xf7\x17\xd0\x04\xf5\x8f\xc5\xf1\x23\x83\x1f\x7b\xc8\x73\x44\xbe\xd4\xab\xc6\xb7\xa9\x3f\x0a\x55\x95\xa2\xa8\x2f\xd7\x85\x40\x1a\x88\xd0\x58\xcd\xaa\xb6\xd0\x53\x58\x20\x0d\x64\x6a\xb0\x11\xec\xbd\x50\xcf\x50\x6d\x0e\xdf\x06\xb5\x73\x1a\x48\x50\xa9\x1e\x50\x71\x18\x53\xba\x43\x2a\x08\x31\x78\xbe\x7b\xde\x3e\x21\x4e\xfa\xf3\xda\x08\x0d\x14\xb1\x51\xdb\xb9\xcc\xf3\x9b\xb6\x2a\xfe\xd5\x5c\x1e\x45\xbf\x78\x55\x98\x62\x4d\xf5\x1e\x9a\x6d\xfd\x2c\xda\x3e\x68\xa6\x81\x8a\x2d\xcf\x5c\x56\xff\x01\x85\x2e\xab\x9d\x59\x4c\x48\xd1\x40\x25\x04\xeb\x68\x33\xa9\x9c\xdb\xed\xd3\xae\xbf\x96\x11\x98\x92\x7f\x28\x5f\x3b\x0f\xd3\xa6\xb9\xf4\xec\x23\x68\x15\xf2\x19\x73\xe5\xb6\x40\x02\x82\x76\xa4\xce\x32\xfd\xee\x10\x68\x62\x7c\x30\xd9\xcd\xa3\xe2\x15\xaa\x99\x1d\x85\x10\xd0\x24\x7b\x9e\xb1\x17\x50\x17\xb5\x04\x20\xf8\xe4\x5f\x7f\x99\x38\xc5\x5e\x11\x55\x7b\x58\xe4\xc3\x40\x70\x4a\x03\x48\x99\x09\xb1\x9d\xaa\xf3\x9e\xfd\x1f\x95\xc6\x72\x5c\x56\xb6\x47\xdf\xfd\x35\x7f\x6c\x13\x52\x24\x1d\xb2\x68\x34\xe4\x36\xe9\xcd\x91\x49\x65\x32\x28\x6e\xdd\x60\x87\xfd\x8c\x17\x81\x92\x20\x90\x10\xf5\x75\xf1\xc2\x26\x8d\xca\x76\xa2\x4c\xf9\xad\x17\x0e\xee\xc6\x03\xe2\x2d\xf5\x92\xa8\x0f\x25\x01\x8f\x7d\xee\xdf\x64\x0d\x09\x82\xa0\x3f\x62\x08\xd6\x1d\xac\xb2\x26\x86\x15\x33\x65\x4d\x37\x90\xb2\x20\xf6\x65\xa7\xcd\xcf\xfe\x1d\x11\xca\x6c\x73\xc5\xb9\xca\xfe\x06\xc4\x5b\x7a\x79\x45\x4a\x98\xcb\x19\x63\xaf\xda\x2a\xab\x6e\xab\xf2\xfc\x5b\xaf\xef\x7d\xf5\x39\x08\xef\xf6\x1d\x9b\xdb\xdd\xae\x77\xd3\x77\x4a\x78\x2c\xbd\x72\xca\x7d\x2b\x2a\x9d\x89\xa2\xc7\xcb\x50\xc2\x0d\x04\x0e\x21\xff\x08\x8d\xd0\xa2\x11\xbe\x9b\x72\x01\xe4\x41\x49\xc8\xed\xe3\xbc\x40\xd1\x0c\x05\x6b\x4a\x42\xc5\x10\xe0\x2c\xb3\x42\x41\xd1\x64\x1f\xb0\xa9\x2a\xe1\x59\x1c\x28\x89\xb8\x65\xe6\xb0\x69\x88\xa9\x59\xf5\x43\x40\x47\x6a\x2a\x1d\x4e\xfd\xe9\x31\xd3\x28\xd0\xf3\x3b\x14\xcd\xef\xe5\x44\x23\x90\x92\x24\x0d\x31\xbc\x90\xed\x65\x01\xb0\x43\x49\x02\x76\x31\xd9\xf8\x16\x3f\xff\x38\x95\x72\xed\xf1\x50\x92\x92\xd4\xf8\x32\x28\x86\x8d\xcf\x15\xd4\x90\xe7\xa3\xf4\x06\x25\x32\x8e\x71\xc1\x35\x48\x75\x7a\x53\x62\x60\x3b\xb2\x5b\x44\xa6\x89\x61\x3d\x59\xfc\x1b\x94\x15\x34\x99\x12\xb9\x4d\x09\xcf\x01\xe5\x8b\xab\x9a\x48\x00\x74\xd7\x5c\x69\xa1\x9e\x4d\x78\x95\x0a\x2c\x51\x63\x96\xa7\x71\xb9\x5e\x4f\x78\xea\x9d\x29\xbb\x25\xf9\xbb\xd2\x31\x0b\x23\xdf\x2a\x99\x15\x05\x34\x16\xc6\x34\x74\xc2\x52\x02\x94\xa7\x96\x44\xd2\xe1\x49\xfc\xc9\xc0\x79\x1a\x39\x4b\x68\xab\x03\xeb\x52\x5f\x55\xb2\xfc\xe0\x94\x44\x3e\x05\x75\x27\xb2\xdc\xa9\x6f\xe4\x50\xad\xdf\xba\x77\xf6\x58\x56\x70\x78\x13\x85\x8f\xf4\xfc\x8f\x98\xc4\x82\xa7\x85\xd6\xcf\xa3\xfd\xce\x1e\xa5\x01\x15\x88\x6d\x43\xe9\xc3\xb5\xd5\x92\xf3\xa4\xad\xb8\x7a\x47\x4c\xd9\xb4\x33\x46\x88\xfc\x76\x7d\xf3\xb6\x11\x45\x5b\x4a\x87\xe9\x75\x89\x50\x08\xc7\x73\x42\x1f\x76\x8e\x6e\x67\x26\x8a\x76\xe3\xa2\x81\xe9\xa8\x73\x8a\x3e\xe7\xe9\xea\x86\x47\x31\xef\xad\x56\x4f\x9a\x37\xf9\x88\x94\xa6\x91\xb6\xb4\x4e\x08\xe5\xf4\x7f\x15\x56\xf0\x34\x2b\xea\xb6\xea\x2c\xcc\x71\x3c\xeb\x29\x15\xc2\xcb\xc3\x37\x33\x54\xad\x43\xa1\x46\x7c\xbc\x0c\x28\x95\xb1\xef\x23\xb9\x59\xe2\xbd\xa2\x94\x91\x04\x3b\x38\x5f\xca\x1a\x38\xeb\xff\xca\x64\x2c\xfa\x54\xe9\xb7\xb2\x6e\xd6\x6d\x33\x7b\x02\x2e\x63\x94\x03\x47\xb0\xcd\xee\x77\x7f\x2a\x57\x02\x43\x2a\x24\xa3\xbc\xfd\x3e\x8e\xdf\x28\x0d\x89\x6d\xb4\xbb\x7d\xd9\x3d\x6d\x86\x1e\x27\x4a\xe3\xc4\x66\xff\x8f\x9e\x39\x67\x0c\xe8\x9f\x6f\x54\xe3\x65\x4b\x91\x67\xd9\xc6\x7c\xd9\x2c\xa4\xa7\x34\x89\x62\xe4\x4c\x7f\xbc\xd8\xf5\x80\x0d\x8c\x73\x48\xb9\x1f\x9b\x40\xe2\xa0\x4d\x0e\xdd\xb7\xad\x9f\x4a\x17\x13\x2e\xf8\x36\x34\xa5\x51\xe2\x5e\xc0\xab\x63\x2c\xb5\x2d\x92\xfe\xa1\x52\x4e\xb1\x73\x12\x59\x27\x6f\x41\xe4\xbf\x79\x66\xfc\x2f\xd7\x3f\x15\xdc\x12\x59\xa0\x3e\x21\xea\x25\xfa\x46\x8f\xc5\xf0\x87\xca\x20\x41\x1f\x07\x99\xe1\x1f\x45\x21\x5e\x11\x1c\x3a\x23\xc8\x99\xbe\x36\x19\x48\xec\x22\x6f\x3a\xb7\x37\x3b\x61\xa8\x4c\xfc\x8d\x4b\x12\x23\xad\xd9\xf1\x15\x9a\xcd\x39\x53\xcf\x79\x5b\xbf\x88\x2a\x73\x90\x32\xbf\xd8\xa9\xd4\x01\xba\x9d\x37\xbb\xc3\x71\xf3\xb0\x79\xdc\x3c\x1d\x8e\xfd\x1c\x52\x71\x84\x45\xc3\x91\x06\x4f\x0e\xd5\xde\xea\x51\x60\xbf\xb5\x1f\x28\x45\xe4\x5e\xfc\x77\x9c\xc2\xe3\xf2\x03\xa5\x9a\x5b\x22\xfe\x6e\x0e\x77\xdb\x8b\xf7\x0e\xa8\x4e\x25\xd6\x13\xcb\x22\xb7\x54\xc1\xf7\xdd\x2c\xef\xe2\x6e\xc7\xa0\xe2\xc7\x09\x83\xc2\x0e\x4d\x76\x02\xd7\xea\xe7\x8e\x00\x09\xd1\x2f\xb3\xe2\xea\x2f\x5d\x2c\x44\xfb\x63\x61\x8c\x69\x38\xc7\x63\xee\x38\xd4\xa7\x1f\x0a\x80\x46\x96\x46\xb8\x78\x2c\x3f\xa0\x19\xaf\x55\xc3\x08\x66\x93\x56\x39\xfc\x1c\xd2\x44\x94\x9a\x18\xa4\xf3\xc8\xef\x00\x5e\x40\xc1\x0c\x4b\x6a\xc7\x31\x42\x18\x76\x32\x34\x6f\x15\xd4\x6f\x65\xae\xeb\x9b\x8b\x25\x9b\x9f\xdc\x03\x23\x34\x42\x9c\x85\x33\x61\x5f\x44\x92\x8c\x00\x20\x44\xae\x8b\x4a\xba\x6f\x7e\x0f\x85\x77\x6e\x18\x25\x6c\x04\xc3\xdd\xfc\x54\x79\x5b\x67\x1f\xd7\x8d\x0e\x94\xd1\x24\x96\x36\x8b\xd5\xd9\xf3\x7f\xb5\xa2\x6a\xa0\xca\x2f\x03\xc3\xd3\x3c\xec\x64\x14\x02\xe4\x85\xba\xc5\xf4\xdc\x12\x0c\xc6\x0d\x64\x41\x18\x84\xde\xd0\x7a\x82\x27\x8b\x18\xeb\x77\xf9\xc9\x13\xb1\xd8\x72\xbf\x5a\x53\x7b\x0b\x1a\xb3\x7e\x7a\x82\x31\xf1\x43\x8d\x54\x72\xac\x7c\x83\xfe\xdd\x6c\x10\x4f\xa4\xf0\xb4\x90\x59\xb1\xcf\xb3\xf3\x59\xbc\xc2\x42\x7f\x28\x65\x61\x10\x09\xe7\x7a\x63\x9f\x21\x4d\xfd\xab\x0c\x89\xe4\x7d\x0d\xa9\x00\x51\xbd\xb8\x74\xa3\x3f\x1e\x13\x7c\x4a\xe9\xfd\x64\x16\x31\x8e\x62\x08\x6f\xa2\x7e\x3b\x94\xf8\xc0\x53\x27\x9e\x45\xb1\x65\xa0\x73\x89\xdb\x71\x3e\x78\xf6\x91\x63\x21\x11\x2a\xb4\xad\xf7\x00\xfa\x71\x52\x4a\xf7\x43\xa4\x83\xeb\x67\xc5\xd1\x4a\xbf\x1c\x9b\xf2\xd8\xf9\x3a\xfe\x86\x12\xa2\x70\xcb\xff\x53\x0c\xfb\x2d\x76\x7c\x9f\xf3\xcc\xe7\x78\x29\x4b\x42\x1a\x18\x8f\xc0\xed\x86\x74\xeb\x53\xbd\xf5\x87\x65\x8a\x11\xd4\x0d\x88\x66\x57\x59\x9c\x7f\xe7\x7d\x8c\x3b\xd6\xfc\x50\xa5\x12\xdf\x5d\xb3\x7d\xd9\x1f\x8e\xfb\xc3\xe6\xf9\xf8\xf8\xfd\xe1\xb0\x7d\x7e\xd8\x6e\x5e\xfc\x25\x53\xc2\x11\x7e\x7a\xea\xee\xa5\xce\x5e\x87\xa8\x90\xa5\x91\xd5\x50\xce\x0b\x8c\x4b\x40\xff\xd6\xf9\x7b\x34\x99\x4e\x98\x34\xb2\xb6\xc0\x27\xa1\xea\x6d\x61\x85\xb1\xfb\xcb\xc4\x96\xf5\xf2\x09\x9e\x3d\xa6\x88\xb2\x54\x12\xe8\xb3\xe1\xff\xdb\x42\x17\x9a\xe9\xd9\x7c\x48\x25\xc5\x80\xf5\x8c\x21\xcc\xf6\xb0\x3b\xbe\xa1\x3b\x76\xde\x16\x3d\x53\x04\x65\x42\x72\xab\xfa\x86\x1b\x2b\xe8\x43\x39\x7b\x13\x42\x31\xe7\xfb\x55\x99\xb9\x4c\x13\x48\xb3\xd5\x22\x63\x8e\x7e\xf9\x77\x0b\xee\x5b\xbd\xda\xc6\xb9\x4f\xd6\x96\x14\x81\x4c\x1c\xea\xf7\xae\xac\x4e\x6d\x2e\x7e\xeb\x0f\xb1\x84\x60\xef\x4b\xe7\x71\x5a\x49\xaa\x2f\x83\x41\x26\x15\xe0\x14\xff\x5b\xd4\x3f\xbb\xff\xf9\x2b\xa9\x84\x22\x7e\xe9\xee\x65\xb3\xf9\xef\x8d\xd3\x83\xf5\x07\x81\x24\xd8\x92\x6d\xfd\x31\x5b\x86\xf3\x9d\xe4\x9f\x58\x2c\x08\x23\xb4\x1c\xca\xee\x1f\x13\xbb\xce\x20\x02\xcc\xdc\x7c\x38\x08\xd4\x12\x53\x35\x65\xa0\xf5\xc0\xf3\x7d\x3a\x97\x05\x14\xcd\x76\x99\x90\x80\x32\x13\xc6\x6a\x5c\xdf\xb9\xab\xca\xd3\xca\x43\xce\x29\x0f\x88\xc1\xfd\xa2\x19\xb8\x3c\xf6\x28\xb8\x3a\xf2\xa3\x79\x40\x63\x7c\x37\xae\xdb\xb2\x2a\x4f\x25\x36\xdc\xff\xb6\x98\xec\xf2\x27\x09\xc0\x4e\x01\xe5\xa3\xf8\x17\x38\x8b\x4a\x9c\xa0\x81\x1e\x4f\x30\xb1\x08\x9c\x52\x82\x39\x3f\x27\x5c\xbb\x33\x58\x44\xdb\xe8\xde\xb5\xe3\x34\xd4\xb1\xb3\x2a\x4f\xe5\x4d\xd6\x6f\x9c\x9c\x26\x96\x14\xd2\x19\x93\x5e\x40\x39\x9f\x16\xe0\x29\x67\x81\xc2\xdc\xe6\xb1\x86\x42\x5b\x36\xfe\xb7\xec\xfc\x75\xf4\xc2\x19\x4b\x50\xdf\xc7\x58\xa1\xf1\x39\xea\x88\x72\x26\x02\x64\x5e\x71\xb0\xa4\x3b\x38\x09\x27\xed\x5f\x8f\x53\x0a\x9c\x19\x8d\xad\x4b\x42\xeb\xbe\xf1\xe9\x97\x78\xfd\xb1\x93\xc3\x39\x0d\xd0\xb9\xbd\xab\xa0\x56\xe5\xd8\x95\xe6\x5c\x26\x08\xca\x34\x19\xaa\x16\x9c\x3b\x9b\x7b\x73\x99\x32\xc7\x2e\xe7\xfe\x38\x07\x40\xd4\xd5\xaa\x33\xad\x90\xf7\xeb\x88\x87\x91\x65\xc6\x3a\x65\xc5\x98\x8b\x73\x52\xa4\xa0\x3c\x8c\x6d\x83\xba\x35\x14\x07\x21\xe7\x9e\x28\x8f\xb9\x24\x5e\x55\x1f\x53\xef\xee\xef\x09\x09\x53\x18\xa1\xc7\x7c\xcd\xf6\xd7\xbc\x56\x94\x27\x5c\xe0\x4b\xff\x18\xc9\x8e\x4e\x57\x0a\x4f\xb8\xc2\x44\xd1\x0d\x34\x75\x53\x81\x78\xdf\xae\x77\xfd\x4f\xa7\xb6\x6f\xdf\xa5\xfc\x2c\x39\xda\x5a\x9c\x67\x77\x9e\xa4\x0c\x63\xf6\xa3\x6c\x2f\x4f\xf8\xd1\x27\xfc\x4c\xc9\x6c\xaa\x24\x60\xcb\x5c\x5e\x89\xa6\x30\xd9\xeb\xf2\xca\xe4\x29\x89\x10\x04\x7c\xb6\xe2\x58\x13\x41\x23\xca\xd3\x30\xa2\xd1\xc0\x7b\x30\x13\x85\x58\x36\x62\x3c\x4d\x52\x35\x38\x0f\x3d\xdc\x63\x3a\x48\x84\x04\x61\x55\x2e\x43\x82\xc6\xd1\xe1\xe4\x3f\xe1\x43\xa2\x5c\x82\x75\xdd\x0e\x6f\xf0\x92\xa9\x37\xa8\x9b\x3f\x7b\xc6\x65\xca\x35\x91\xbe\x29\x68\xbb\xde\x61\xf4\x34\x30\xf6\x53\xae\xc3\xc8\x0b\xe5\xd9\xa0\xb6\xbd\x02\x61\x53\xae\x13\x8e\x4e\x9f\xb5\x31\xae\x67\xde\xcf\xb7\x3f\xb3\xe6\xed\x2e\x2f\x45\x33\x80\x75\x3e\xcd\xf5\xcd\xfe\xee\x53\x58\x5c\x4b\xcb\x96\xec\xbe\x37\x7a\x11\x93\xb5\xdf\x27\x5d\xca\x32\x9f\x2e\x3a\x08\x41\x9a\x89\x38\xdb\xe6\xf0\x6d\xb7\xbf\xee\x48\xf0\xe3\xb5\xd6\xe9\xd0\x00\xe6\x2b\xa2\x5f\x44\xd8\x1c\x40\xe1\x2e\x8a\xf2\x59\x65\xb1\x33\xae\x73\x64\xf6\xed\x4c\x60\x21\x9a\x4d\xd6\x34\x97\x4f\x56\xa3\xa1\xc6\x66\x50\x9d\x7a\x4f\x51\x37\x95\xe8\x1c\xce\xf5\xb5\x4f\x1e\x06\xb1\xc2\xce\xce\x17\xa1\x33\xbf\xe7\x85\x01\x88\xb8\x6f\x83\x33\x50\x55\x22\x1f\x7a\x23\x69\xd8\xdd\x83\x2d\x94\xda\xed\xf5\x04\x45\x83\xc1\x59\xf3\x2b\x2e\x0b\x1a\x92\x44\x21\xdc\x00\x7e\x42\xd5\x45\xb7\xcf\xed\x2f\xe6\x74\x48\x03\x40\x8b\xed\xd2\xe6\xe3\xda\xa1\x1f\x91\xc4\xa9\x83\xb2\xd8\xed\xf4\x1a\x9e\xf2\x65\xe9\x23\xa4\xc2\x82\x3d\x11\x4d\xe6\x13\x5a\xfe\x98\xa4\x48\xe1\x24\x50\x8d\x0b\xa1\x2c\x6d\x05\xc3\xce\xe1\x87\x01\xc3\x7b\xf0\xa5\xa4\xde\x48\x7c\x06\x0b\x77\x32\x6d\xf3\xb9\x16\xb2\x98\x23\x34\x4d\xb6\x97\xd5\x61\x3d\x36\xf0\x21\x13\xb6\x69\xb8\x57\xac\xfb\x6d\x22\x4b\xb7\xf0\xef\xf2\x1b\xe5\x5c\xe1\x04\xb9\x2f\xed\xeb\x9a\xfc\x48\x14\x25\xb1\x05\x83\x6b\x54\x68\x75\xbf\xe1\x25\xf0\xa8\x1f\x96\x08\xec\xef\x3d\x3b\xcc\xd3\xf1\x8c\x0d\x25\x96\x15\xb1\x0b\x0e\x17\xe3\xfa\x30\x8e\x34\xf6\x73\x3f\x88\xb6\xd0\x55\x79\x12\x57\x5f\xdf\x0f\x34\x11\xb1\x92\x56\x85\xaf\x36\x4d\x97\x42\x98\x28\x29\xf5\x54\xed\x64\xf0\x9d\xc3\x94\x24\x08\x0b\xd1\x90\xbf\x96\x5a\x4c\x6f\x66\xf6\xf9\x53\x6e\x90\x39\x36\x7b\x14\x79\xb6\xb0\x8d\x84\x69\x6a\x9b\x91\x70\x7e\xac\xcb\xf6\x5c\x16\xf5\xe0\x01\x87\xa9\x8a\x71\x4f\x76\x71\xf5\xf3\xd9\xe7\xa5\x43\x41\x69\xea\xd2\x1e\x1b\x54\xad\x9b\x5d\x58\x26\xd2\xf5\xad\x79\xe8\xab\x37\x57\xa1\xd4\x32\x76\x41\xb5\xad\xc0\x8a\xea\xe2\x12\x21\xb3\x8b\x28\x06\xb8\x0f\x62\x7e\xf6\x7e\x44\x8b\x30\xc2\xd8\x75\x8e\x53\x80\x98\xb2\x97\xec\xdc\x94\x37\xed\xcf\xc9\x47\x87\x80\x23\x0e\x5b\x9b\xba\xff\x93\x36\x9a\xf5\x4a\xbd\x75\xfd\x08\xea\xed\x9a\x21\x99\x86\x26\x74\x68\xa0\xce\x37\xba\xdd\x97\xb9\xcf\x7f\x86\x26\x0a\x91\x40\x69\xff\xc7\xc6\x97\x26\xa3\x20\xd5\x98\xe4\x36\x22\xcb\xe1\xaa\x58\x1b\x11\xa2\x0d\x8c\xa9\x1a\x97\x00\xcc\x34\x22\x32\x92\x73\x7e\x89\x87\x72\x10\xbb\xfa\x4f\xfa\x3f\xff\xa0\xed\x82\x46\x44\x71\xe5\x10\xf4\x9b\x97\xfd\xf1\xdb\xee\xe1\xb6\x0f\xcc\x22\xa2\x0c\x38\x5c\xfe\x07\xe4\x87\x72\x79\xa2\x46\x04\xac\x67\x63\xaa\xc9\x3a\x8a\x68\xca\x12\xde\xa3\x85\x50\xe6\xe8\x8b\x06\xe6\x6e\x7c\xc4\xa4\xef\x3b\x35\xe5\xf2\x83\x53\xa3\x62\x4b\xcf\xac\xab\xc5\xd8\x20\x62\x22\x65\x33\x36\xa2\x71\x23\x07\x8d\x18\xa4\xe8\xab\x1d\x11\x73\xbd\x2f\x55\x26\xf2\x27\x68\x7e\x94\xd5\xbb\x27\xd3\xfa\x92\x38\xe1\xb3\x77\xc9\x79\x84\xc4\x2f\x67\x51\xd5\x40\x7f\xc0\x54\xdd\x84\x46\x3c\x8c\x91\xe2\xc7\x36\x9e\x89\xd7\x6a\x16\x26\x46\x3c\xa1\xd4\x62\x95\x9a\x2a\x83\x0f\xf8\x73\x7d\xf0\x99\xab\x88\x1b\x9b\xe6\x91\xed\xe5\xb9\x2d\x66\x89\xe7\x28\xd4\x84\xf5\x20\x24\xc7\x19\xda\x2b\x19\xb6\xf5\x72\x0a\x27\x0a\x75\x88\x8d\x7c\x07\xe8\x5c\xc3\xce\x09\x5b\x15\xf5\x3c\x1f\x16\x85\x4e\x87\x0a\xd3\x69\xab\x42\x5f\xa3\x60\x68\x14\x1a\x89\xed\x9c\x25\x4e\xd9\x6e\xa7\x74\xde\xc5\xa4\x38\x1c\x45\x44\x5b\x81\xff\x73\x9e\x35\xb7\xab\xdd\x62\xc3\x25\x8d\xa2\x38\x15\x0e\x10\x74\xd7\x16\x7a\xff\x3c\xe9\x57\xa5\x51\x4c\x19\x66\x87\xef\xa1\x80\x0a\xc9\x6f\x64\x9e\xa9\xdf\x61\xa9\x9d\xb9\x1b\xcd\x51\x1a\xd1\x39\xc9\x2f\xce\xcf\xee\xab\x14\x51\x1c\xdb\xef\x86\xd3\xa1\x47\x0c\x7c\x36\x4b\x63\x91\x7a\xb3\x0a\x0d\x6c\x0b\x27\x8d\x37\x9d\x0a\x49\x62\x61\x28\xb2\x20\x34\x39\x9e\x6c\x92\xa5\x9f\x55\xff\x61\xff\xe3\xc7\x81\x41\xc8\xf4\x4b\x8b\x35\x4e\xb7\xf1\xd6\x93\xaa\xc6\xd7\x25\xdc\x28\xa5\x11\x06\xcc\xba\xdc\x97\x27\x68\xde\x86\x1a\x4f\x94\xa6\x0c\x41\x61\xeb\x4c\x09\x2d\x26\x6b\x33\x55\x96\xdc\xb2\x86\x72\xf6\xb9\x53\xcd\x10\x76\xd1\x73\xbe\x1c\xf8\x61\x36\x4f\x53\x6d\x52\x97\x75\x7b\x10\xf5\x10\xee\xfb\xc3\x00\x4c\x7b\x32\xae\x5f\x78\x43\x91\xe0\x89\x55\x8c\x80\x53\x86\x25\xbd\x71\xb2\x63\x79\x9d\x09\x9e\xaa\xc1\xb7\xec\xcc\x7d\x67\x2e\x30\xaa\xaf\xaa\x19\xde\x9c\x46\x8a\x04\xe8\x89\xc2\xcf\x37\xd1\xd6\x8d\x15\xe0\x9d\x8f\xa1\x1c\x53\xe3\xcf\xf7\xb7\x93\xb7\xa4\xa2\x14\xd3\x2b\x23\xe8\xdc\xb2\xcd\x51\x91\x89\x1d\x19\xa1\xd5\x1b\x5b\x36\x5e\x4a\x85\xae\x02\x63\x5d\xca\xa9\xbc\x38\x8d\x34\x63\xf8\x2d\x9b\xcc\x37\x41\x4d\xcf\xd7\xd2\xca\xfa\xee\x1f\xee\xfe\x1a\xa5\x9f\x23\x48\x35\xe6\x79\xb3\x22\x6b\x1c\xbb\x22\x3e\x87\x65\x56\xfd\x0c\xf5\x4b\x23\x30\x16\x62\x74\x16\x97\x89\x52\x46\x3f\xc0\x84\x96\x22\x0a\x0a\x3d\xad\x1f\x46\x26\x11\xc1\x20\xec\x6e\x69\xa7\x16\x1b\x9e\x96\xfe\xb1\xd7\x88\x03\x16\xa3\x2b\x74\x2a\xf5\x7a\xb3\x5b\x74\x97\x70\x0c\x72\xb2\xab\x12\xa3\xaa\xdf\xfc\xdf\x15\xf7\x55\x33\x7c\x53\xd7\x12\xe6\x34\x26\x54\x80\x1c\x71\xd4\xfe\x59\xe6\xef\x9e\x46\x67\xd9\xf4\xc4\x84\xc7\x0a\xfa\x54\x9e\xd3\x9f\x9a\xdc\x34\x91\xa0\xd5\x84\x1f\xc4\xf7\x09\x4e\x7f\x9c\x6a\xdb\x74\x90\xd5\x57\x78\xd0\x51\xbd\x29\x66\x84\xe2\xd4\xcb\xea\x9b\xd9\x93\x33\xc1\x31\xec\x16\x79\xee\x29\xab\x06\xb8\x8a\x1b\xc3\x39\xc3\x6c\xac\x23\x36\xc7\x36\xd8\x89\xc9\x8d\xc3\xd8\x60\x71\xae\xd7\xfc\x04\x71\xea\x5b\xef\x68\x1c\x05\x0a\x5b\xe5\xef\x4b\xab\x74\x5a\xf7\x07\x22\xbb\xa9\xd7\x7d\xdf\xd7\xa7\xd3\x28\x8e\x92\x18\x71\xe7\x3f\x20\x73\x49\x04\x6c\xc2\xf0\x47\xa5\x46\xfd\xdc\xe7\x97\xdd\xf3\x6e\xbf\xb9\x3d\xee\x0f\xab\xc3\xf7\x7d\x7f\x58\x29\xe3\xd8\x26\xbe\x41\x55\x4e\xba\xe4\x27\x2f\x3e\x26\x2a\xb1\x4c\xe0\x7b\xe1\xf5\x03\xbb\xbf\x1a\xc4\x23\x40\xa1\x9f\x73\xa1\xdc\x4c\x9c\x7e\x8a\x38\x0a\x11\xee\x54\x37\xd5\xba\x2c\x94\x68\x16\x21\x11\x71\xc2\x18\xae\xce\x1f\x55\xd6\x40\xdf\xdc\x79\x57\xce\xb0\x37\x71\x62\x14\xa2\xfb\x57\x59\xa5\xab\xf2\xec\x54\x4f\xdc\xc1\x34\x50\xf8\xb4\xfb\x4c\xc3\x4d\x95\xe9\xd7\x2f\xd0\xf7\xfe\x94\x58\xe2\xf5\x9e\x2b\x80\x1e\xd1\x12\xa7\xca\x4e\xfc\xba\x8b\x40\xd1\xc9\xab\x96\x57\x48\x0a\x22\x1c\x2a\xd3\x47\x89\xdb\xf3\xf1\xb4\xe4\x28\xc7\x02\x24\xc1\xda\x98\x53\x26\xe9\x62\xe8\x2f\xea\x0e\xb1\x54\xbd\xa2\xd6\x03\x98\xa6\xfc\xf0\x04\x57\x37\xed\x15\xfd\x2e\x8d\xa5\x91\x9e\x20\xf8\xc1\xa7\x07\x27\x6f\x58\x05\x1c\x83\x01\xf0\x55\x4c\xff\x77\x02\xdc\x6d\xf8\x78\x4b\x37\x97\x3f\xcf\xdb\x4f\x12\x31\xb1\x52\x1c\x9d\xea\x6e\x46\xdf\xda\xd6\x26\x98\x19\xfd\x58\x07\x09\x17\x5e\xfd\xae\xc9\x3e\xe0\xa6\xad\xb3\x02\xbb\x06\x9f\xa1\x5a\x8f\x3c\x3c\x7f\x42\x2c\xb1\x55\xf4\xae\xac\xdf\xc4\xec\xa5\x01\x57\x18\x74\x9e\x44\xd1\x8a\x3c\xbf\xec\x91\x5d\xd8\x51\x1d\xf4\x8c\x0f\x77\x65\x85\x24\x12\x9f\x88\x96\xcf\x1e\x02\x0c\x43\x5f\xf0\x88\xce\xe2\x63\xfd\x3a\xb4\x36\xf5\x23\xac\x67\x7e\x3a\x9a\xb6\xd0\xf5\x34\xc3\x11\x1b\xc2\x59\x6f\xfe\xa0\x86\xa2\x59\x7a\x0d\x86\x59\x22\xe3\x57\xe7\x28\x7d\xe5\xd8\xc4\x46\x59\x95\x92\xf5\x5b\xa6\xde\xa1\xb8\x13\xd5\xa9\xaf\x0a\xc5\xc6\xcd\xf9\xb7\xb2\x12\xfe\x26\x92\x80\x10\xee\xa8\x7a\xab\x41\xf0\x6c\xbc\x83\x26\x01\xb3\x5a\x4c\x9d\x2b\x97\x8b\xd7\xaf\x50\x7d\x49\xc0\x14\xa5\x4e\x1b\xd0\x72\xf6\xcd\x40\x32\x49\x20\x3d\x1d\xc8\x52\x05\x7f\xfa\x3c\x49\x67\xfd\xb1\x8e\xdd\xda\x29\x3e\x22\x03\xf7\x23\xb4\x60\x49\x4f\xb2\x7d\x73\xed\x78\xf8\x71\x06\xb0\xe4\xff\xaf\xb6\x73\x21\xcb\x62\xbb\x68\x3f\xba\xff\x43\x5c\x86\xaf\x3b\xc3\xfc\xf6\x29\xd8\xb6\xca\xfd\xe6\x79\xe5\x5f\x10\x8b\x98\x1c\xf7\x3e\xa3\x10\xdd\xb0\x6e\xaf\xad\x6d\xc2\xe2\x10\x46\x5a\xb9\xf6\x9b\xfe\x99\x35\x6f\xd7\x72\x0d\x34\x61\x89\xb2\x4a\x24\xad\xc4\x02\xa9\x43\x6e\x4c\x07\x71\x43\x91\x3d\xf5\x8c\xe1\x12\x5c\x31\xdd\xd1\x24\x8c\x05\xe6\x2f\x3d\xd3\xbc\xa5\x99\xef\x7e\xd4\x12\x2a\x5f\x67\x10\xbb\x17\x38\x81\xad\x24\xa1\xa6\x31\x0a\x10\xef\x56\x0f\xc7\x97\xcd\x6a\xfd\x6d\x73\x7b\x5c\xbf\x6c\x0f\x9b\x97\xed\xce\x63\x46\x92\x88\x52\x4f\xff\x70\xbb\x44\x15\x4e\x93\xd8\x41\x9a\xb0\x0d\xe8\xfc\x4b\x85\x73\x7f\x96\x52\xf8\x9e\xcb\x9e\x86\x71\x76\x5c\x47\xb8\xf1\xbb\x8a\xfb\x9c\xab\x71\x9c\x19\x75\x67\x24\x41\x64\xdb\x1d\x5b\x79\xca\x9a\x11\x13\x3c\xbe\x16\xaf\x53\x71\x4d\x99\x88\x21\xe4\x7f\xfe\xa7\xef\xe1\x18\xfd\x97\xbf\x32\x49\xd1\x2d\x3b\x7c\x5b\x3d\xfd\xbe\x3f\x6c\xf6\x07\x0f\xe2\x48\x12\xb0\xc8\xd7\x62\x68\xda\xad\x3a\xeb\xe3\x3d\x84\xe5\xfc\x4e\x92\x06\xa9\xcf\x14\xf5\x11\x8b\x3f\x44\x6d\xa6\x16\x5b\xda\x97\x2a\xcb\x89\x60\x0c\x35\x10\xb1\x9f\x33\x53\x30\xf2\x3c\x13\x01\xf6\x56\x95\x56\xfe\x4f\xca\xbd\x17\xf8\x79\x1e\x15\x6d\xe7\x55\xfe\x44\x89\x80\x39\x3f\xea\x20\xea\xf7\x87\xac\x6e\xf6\xbd\xd0\x29\x4d\x74\x64\xc9\x86\xf4\xa5\x38\xd6\xd9\x6b\xff\x67\x23\xb1\x96\x87\x6c\x4a\x42\xfd\xef\xcc\x83\x4e\x40\xc8\xc0\x46\x67\xa6\xf3\x7d\x5f\xa0\x2e\xf3\x8f\xde\x8c\x25\x86\xf4\xd9\xa6\x9d\xfc\x3f\x30\x23\x1f\xa7\x89\xe1\x01\xa2\xf0\xac\xac\x62\x69\xba\xa5\xf0\x9c\xf7\x35\xe3\xc4\x84\x06\x53\x93\x22\xab\xe8\xd7\x49\xdb\xc4\xc4\x56\xc8\xc0\x78\xde\x8d\xed\xed\xf2\x26\x9b\x98\x24\xc4\x4a\x2d\x9a\xbc\x39\x21\xec\x40\xe1\xfe\x28\xce\x53\x47\x24\x0d\x34\x41\x41\x33\x0f\x13\xf4\x2c\xa3\x79\x79\xc1\x02\xd4\xd4\xf5\xfe\x24\xa5\xe1\xaf\x65\x00\x37\x24\xe3\xf4\x34\x36\x3f\x3d\xb7\xbf\xaf\x4f\xa4\x84\x5a\x92\x0c\xe5\x72\x8d\x9e\x28\x9c\xa6\x84\x43\xe8\xa6\x97\x7d\xad\xe3\x46\x5d\x67\xc2\x12\x3f\xbd\x53\x12\xd9\xca\x34\xa0\x7a\xf3\xa7\xba\xe5\x63\xe3\x91\x92\x98\xd1\x79\x13\x10\xe8\xb9\xe6\xc9\xe2\xc6\x96\xb2\x38\x4e\x6d\x3b\xff\xee\xfc\xc9\x02\x49\x59\x2a\x69\xec\x93\x46\x88\xca\x1a\xe4\x72\x69\xca\x04\xc1\x70\xbe\x2d\xa4\x58\x4e\xeb\xa6\x5c\xc4\x16\x5c\x01\xb9\x11\x15\x7c\x13\x85\x2e\xdb\x5f\xc6\xf0\xb3\x3b\x0d\x19\xb7\xa2\xfe\xc7\x33\xd8\xee\xca\x11\x02\x32\x0d\x45\x2a\x85\x4f\xf2\xdc\xb6\x53\x09\x6b\x9a\x46\x9c\x0b\xcf\xa8\x83\xaf\xe5\x05\x32\x2c\x4e\xcc\xee\x34\xe2\x11\xde\xe9\x7f\xef\x6d\x0c\xf9\xc5\x96\x9c\xc6\x32\x45\xbe\x74\xaf\x3a\xf6\xb0\x79\xba\xef\x33\xcc\x69\xac\x2d\xe5\xcf\xcd\xe1\xe1\xb8\x3a\x7c\xdb\x3c\x6d\x57\xde\x8e\xa7\x89\x62\xc8\xd2\x93\x35\x70\xfa\xa3\x6c\xe0\xf6\x13\xfc\x52\x9a\xa8\x10\xe3\xa9\x5c\xd4\xcd\xf1\x47\x56\xf4\x62\x94\x34\x4d\x29\x93\xc6\xb3\xb2\x1c\xb1\xdb\x61\xd4\xe6\x30\xb2\xc5\x69\x1a\x59\x69\x5d\x38\x97\xea\x6d\x8c\xed\x4d\xd3\x48\xa7\x36\x51\x3a\xfa\x5b\x42\x90\xf3\x04\xb5\x63\x7e\xc5\xc4\x44\x53\xc1\xb8\x8a\x86\x88\x0f\x73\x93\x38\x37\x69\xe0\x47\xa4\xd4\x70\x27\x26\xa1\xc4\xd9\x61\x53\xe7\x10\xf2\x54\x6a\x2b\xa9\xe2\x74\x9c\x76\xe6\xe6\xf2\x00\xaf\x42\xcd\x50\x4d\xa9\x62\x9c\xf6\xcd\xb8\x53\x6e\x86\xee\x60\x82\xdd\x72\x2e\x79\x99\x0f\xed\xbd\x0b\xda\xa3\xa3\x57\xa4\x98\xb6\xed\xd2\x6e\x7f\x93\x3d\x1a\xe9\x3f\x89\xdb\x82\x66\x5f\x06\x52\x50\xd6\x96\x8a\xe6\x0d\xe1\x50\x1f\x24\xf2\xb7\x01\x52\x2b\x3d\x90\x50\x8d\x35\xdb\x67\x57\xd1\x0c\xdb\xfe\xb0\xe3\xeb\x30\x36\x71\xbf\x58\xb6\x60\x34\x42\x0d\x0f\x65\xf1\x26\xca\xd1\xa6\x93\x9a\x20\xc2\xbc\x96\x85\xd3\x1c\xeb\xf7\xe3\x7b\x51\xfe\xc8\x61\x14\x6c\xfd\x87\x0e\x8e\x13\x75\xef\x5f\x04\x89\xa5\xbf\xec\xe5\x10\xff\xf4\x9a\x1f\x54\x04\xa9\x42\x92\x7d\xcb\xc0\x84\xef\xe8\x5a\xa5\x7b\x3c\x2d\x04\xa1\x0c\x5d\x62\x54\x95\xcf\xb3\xba\xa7\x4e\x9a\xcd\xa5\xc9\x53\x09\xc2\x63\xe5\xf2\xd7\x7f\x95\xed\xba\xcc\x73\x50\xd7\xb4\xd8\xc3\x77\x13\x24\x61\x28\x69\xf0\xb8\xdb\x61\x63\xcc\x7a\xf7\x74\x78\x59\xad\x7d\x3d\x41\x10\x05\x3e\x50\xdf\x97\x6d\xa5\x60\xa1\x7c\x23\x58\x48\xd1\xf3\x34\x59\x85\xb2\xb0\xaf\x16\x6d\xe6\x6b\xac\xc5\xe8\x45\xb0\x30\xb6\x70\x18\x6c\x65\x2d\x73\x6d\x39\x50\xfa\xc3\x10\x62\x8c\xd7\x05\xf1\x9b\xe3\xfa\x61\xb5\x7d\x3c\x6e\x9e\x56\x37\x0f\x5e\x1a\x88\x0a\x66\x52\x04\xab\xfd\xb1\x43\x52\x1e\x8b\x17\x3a\xde\x7e\x47\xa5\x06\x6f\x20\x44\xd8\x79\x84\x8e\x98\x39\x2b\x6e\xfa\x34\x83\x3b\x1c\x05\x02\xe9\x2b\xdd\x1b\xca\x64\x0e\x68\x0c\x69\x3f\x80\xda\x94\x77\xe7\x73\x7d\x88\x66\x19\x70\x29\xa2\x48\x63\x6d\x06\x44\x95\x5f\xf6\xe7\xb2\xa8\x7b\xa0\xa8\x88\x95\x6d\x55\xc2\x99\xe9\x88\xfe\xfd\x66\x27\x92\x48\xf9\xc0\xe5\x45\x54\xf0\xfc\xb0\x3a\x6c\xe7\xa4\x67\x54\xa4\x41\x88\xa0\x74\xd3\x16\x6b\xeb\x8e\x63\x11\xe8\x70\x05\x39\x10\x32\x49\x51\x36\xb6\x1d\xa8\x95\xc6\x07\x45\xd2\x0b\x6d\x0c\x98\xe2\x59\x67\x2b\x15\x8a\xe8\x34\x1d\x84\x5b\x17\x32\xcf\x42\x09\xc1\x52\xdf\x3c\x94\xe5\xba\x82\x62\xf5\x2a\xb2\xa2\x6e\x56\x45\x76\x12\xf9\xbc\x9e\x2e\x74\x08\x58\xdd\xbd\x80\x2f\xcf\xfb\x03\x91\x61\x61\x1f\x1d\x7d\xbd\x58\x85\x06\x8e\xf0\x47\x53\x56\x0a\x2c\x05\x86\x65\x8a\xf8\x73\x6c\xd1\xbb\x61\x51\xdf\xd6\x63\x13\x52\x8b\x17\x1e\x72\xbe\xf3\x6c\x89\x00\x4a\xe9\xc0\x7b\xff\xdd\xd7\x2b\xdc\xbb\xf2\x00\x63\x61\x58\x48\x1d\x61\xda\x7d\x66\x16\xb9\xb5\xa9\x30\x9a\x62\xc5\x29\xab\x6d\x96\x60\xfa\x6a\x64\x10\x70\x8c\x7a\xd0\x27\xba\x6b\x0b\x7d\x45\x7b\x49\x65\x40\x29\x38\x39\xaa\x63\x7d\x06\x95\xcd\xa3\x3e\x19\x70\x8e\x88\xe6\x75\xd6\x5c\x1e\xc5\xa5\x9f\x7f\x32\x88\x28\x7a\x88\x36\x17\xe3\xf8\x14\xae\xa7\x8e\x0c\x92\xc8\xc9\x02\xeb\x9b\xf3\x32\x66\x56\x12\xa1\xb1\x25\xaf\xb1\x28\xd8\xc1\x91\x96\x44\x72\xec\x5d\xf1\xef\xfb\x50\xda\x5d\x74\xfa\x1b\x44\x46\xc8\xa4\xf5\x87\xef\x07\xac\xae\xfa\x7a\x24\x31\x32\x70\xfc\x2e\x36\x59\xf8\xe8\x00\x9b\x0b\xda\x96\x54\x52\x61\xf9\x67\xc7\xcd\x3c\x73\x7b\x3a\x3b\x03\x68\x18\x8f\x60\x9c\xd3\xaa\x8f\xa4\x26\xb5\xaa\x00\x9b\x3f\x36\x0f\xbb\xe7\xcd\x8b\x0f\x8a\x24\x4f\x29\xa2\x01\xb1\x25\x63\xd7\xe7\x06\x65\x18\x4b\xf4\x74\x1e\x77\x4f\xdf\x11\xc6\xfe\xfd\xe9\x78\xb7\xd9\xf4\x87\x93\x10\x57\xd3\x9f\x90\x5d\x31\x90\x50\x19\x25\xc6\x2a\x9f\xa3\x1b\xde\xb9\x30\x7a\xd4\x12\x24\x63\x2e\xb1\xb1\xa0\xfb\x49\xbf\xa1\xd5\xfd\x41\x19\x62\x72\xdc\x64\xc5\x84\x74\x8b\x4a\x11\x11\xee\x52\x64\x68\x29\x96\x43\x02\x29\x19\x8d\xec\xc4\xbc\x2f\x73\xfd\x68\x69\x2b\x67\x1d\x2c\x52\x2a\x85\x00\x63\x5b\x07\xd9\x6a\xac\x7e\x6c\x1b\xb8\x12\x5e\xf9\xcf\xff\x2c\xee\x45\x52\x6a\xe2\x6b\xcd\x9d\xf7\x75\x1e\x4f\x1b\xa9\x25\x72\xb5\x15\xe2\x04\x03\xab\xe9\xe4\x59\x24\xa4\x4a\x79\xfe\xe5\xd3\x15\x0d\x07\x95\x2a\x88\xc1\xeb\x48\xd8\xa7\xf5\x07\xb4\x55\x66\xbd\x5d\xfd\xfe\x7d\x6c\x73\xa4\x02\x83\x05\x10\xef\xe6\x63\xe7\x73\x37\x09\xbe\x24\x18\x74\x27\x43\xa0\x70\x6b\x1d\x30\x4a\x9e\x8c\xdf\xf7\x25\x75\xd6\xa2\xff\x48\xc0\x09\x6e\x40\x98\x36\xe9\x8c\x6e\x6f\xa6\xa4\x89\x78\xe4\x64\x3a\x2d\xf1\xb6\xdf\x5c\xfc\xf1\x54\xc4\x0e\xd2\xfe\x3c\xc0\xa7\xfc\x41\x91\x1a\x3a\x78\x46\xfb\xa6\xac\x46\xf2\xbb\x7e\x90\x8a\x59\x3a\x93\x0c\xfd\xb2\x50\x26\x0d\x18\xac\xfd\x8c\x38\xd6\xa8\x0a\x02\x11\x06\x1e\x01\xd2\x56\x35\x4c\x2a\xdd\x2a\xa0\x49\x3c\xd4\x2a\xb1\x3a\x70\x53\xfe\x9c\xde\x8a\x0a\xc2\xc4\xb2\xff\xbe\x95\x3f\x0e\x95\x4f\x62\x3c\x94\xaf\xd3\xaf\xa9\x82\x28\x44\xdc\x92\x12\xb9\xba\x82\x8d\x2b\x12\x73\xed\x5a\x17\xad\xb4\xe6\x72\xcd\x59\x91\x34\xc1\x52\x95\xf9\x79\xbe\xcd\x3e\xa6\x99\x81\x89\x49\x53\x34\x30\x08\x1f\x70\x02\x33\xf8\x99\xd8\x84\x4e\x8b\x2a\x1a\xa9\x48\x60\x4e\x69\x82\x13\x52\x2c\xa0\x18\x2e\x6e\x44\xd5\xbc\xa9\xea\x72\xee\xcf\xe0\x24\xc6\xaf\x7e\xb6\xfd\x37\xa3\x25\xad\x78\x62\x30\x3b\x7d\x94\xa2\x51\x6f\x9f\x79\xa9\xd7\x19\x39\x15\x12\x86\x49\xb6\x87\xcd\xd3\xcb\x52\x48\xd5\x5e\xf5\x25\x22\xf7\x27\x19\xd6\x0e\x5a\xae\xd9\xc6\xa1\x22\x49\x11\x1d\x89\x5c\x1c\x22\xff\x36\x00\x4b\x54\xcc\x38\xa6\x39\xee\xa1\xe9\x49\x3d\x8b\x99\x7d\x50\xb1\x14\xca\x49\x4c\xe5\xbb\x62\x2e\x40\xee\x53\x74\xfe\xb1\xc2\xe1\xb9\x92\xff\xf9\x07\xaa\xaa\xdd\xf5\x0d\xee\x4b\xff\x9d\xbd\xbe\x0e\x13\x21\x36\x5c\xfb\xae\x44\xa8\x6b\xf1\x0a\xa6\x2a\x4f\xba\xfc\xc8\xa6\xe6\x43\x25\xc2\x0a\x76\xdc\x8a\x06\xbb\xb7\x5c\xdc\x3d\x7b\x88\x44\xc5\x96\x5b\xbf\x7b\x43\x4d\x2b\xe7\xc5\xa1\xa5\x97\x9b\x06\x01\x66\xff\xbd\x98\x6d\xd5\x64\x75\x73\x0f\x05\xd4\x59\xbd\x47\x70\xf2\x32\x17\x31\x55\x69\x6c\xfb\x2c\x94\xf5\x3a\x5d\x69\x67\x7a\x47\x82\x58\x8c\xb6\xeb\x5f\x16\xc5\xfb\x62\x46\x40\x09\x15\xa1\xa7\x8c\xd6\x6f\x34\xcd\x64\x90\x60\x36\xf9\xb1\xfc\x80\x43\x79\x73\x05\xeb\x52\x32\xd5\x26\x75\x69\xf5\x2e\x44\x1d\xf6\x40\x25\xa5\xf5\xe3\x6f\xc5\x6b\x17\xe3\x0f\x7f\xd7\x2a\x18\x14\x55\x97\x0b\xb1\xd3\xbb\xeb\x2c\x6d\xf7\x99\xba\xd9\xb7\x29\xf4\xe7\x54\xa3\x33\x18\x51\x3b\x00\xaa\x54\xf7\xa3\xbe\x44\xd5\x16\x9d\xe7\x82\xd2\xe6\xfb\xd2\x34\x6b\x71\xf6\x8e\xd2\xf4\xe1\xb4\x4a\x99\x13\x9c\x73\x69\xb1\xa2\xf6\x2d\xde\x5f\x67\xd4\x14\x44\x21\x22\xdc\xb7\x7f\x8a\xfa\x0e\x03\x99\x37\x51\xc1\x64\xdd\x03\xa4\x98\x35\xf4\x7d\x91\x59\xa9\xef\xe6\x4d\x3e\xca\x10\xc2\x95\xaf\x9d\x94\x26\x6b\x96\xbf\x9f\xa1\x84\x44\xe3\xcc\x7c\xa1\xe7\xfc\xf2\x5f\xbd\x2a\xef\x89\x2a\xe3\xb2\x74\x4d\x5b\x15\x47\x93\x8b\xd7\xe3\xee\xee\xce\xdf\xb0\x01\x40\x1c\xc6\x8d\x65\xa0\xd9\x8b\xf3\xf9\x2d\xf3\xcc\x2b\x54\x13\x1e\x58\x17\x51\xe4\xea\x80\x84\x4c\x1b\x4f\x32\xb9\xf8\x8e\x34\x49\xa2\xd0\x75\x01\x0d\xad\x2e\x9a\x48\x85\xce\xca\xad\xa8\xde\x3f\xc9\x80\x69\x4a\x19\x82\x81\xb2\xc2\x54\x02\x43\xad\x61\xdf\x9c\xbe\x40\x4d\x93\x44\xd1\xbe\xa1\x0a\x51\xca\x2d\x32\xe6\xfe\x36\xbb\x64\x4a\x52\x6c\xd9\xb5\xae\x2d\xc6\x9d\x43\xcb\xba\xa6\x5a\xe1\xf4\xf9\x3e\x80\x16\x35\x63\x0c\x31\x7f\x36\x4c\x7a\x10\xf5\x38\xb1\x7e\xed\x1b\x6b\x1e\x04\xbe\x72\xb8\x92\x59\x8e\x8a\x9f\x77\x65\x35\x8e\x1a\xe7\x77\xcf\x49\x6a\x6c\xcc\x96\xe7\xdf\x8b\xce\xac\xac\x8a\x57\xc8\x6b\xb7\xc7\x5f\x81\x20\x34\x8f\x92\x9e\x0b\xb2\xef\x7b\xf8\x65\xdd\x61\x79\x12\xeb\x30\x4c\xb5\x65\xb9\x6c\xd4\x9b\x27\x04\x5c\x9a\x47\x53\x72\x73\xaa\x43\x90\x58\xfb\xb2\x58\xf9\xad\x3e\x94\x9b\x9f\x0d\x20\x01\x87\x2f\x55\x7f\x36\x29\xe2\x20\x41\xd8\x95\x1e\xc8\x22\xa0\x68\x6e\xda\x0b\x54\xd7\xcd\xc3\x3a\xe6\x96\x22\xf4\xaf\xef\xcf\xdd\x0b\x1f\xb7\x39\x7f\x86\x30\x77\x67\x26\x34\x45\xc8\xc3\x4b\x5b\x89\x1c\x85\xb0\xdb\x79\xe9\xdb\x8f\xd4\xc6\xb8\x38\xf0\x51\xfc\x1c\x93\xa8\xe8\x34\xd4\xc6\xf9\x56\x03\x8c\x7e\xfa\x3b\xa9\x50\xe8\x3c\x9d\xed\xbd\xdf\x95\x95\xc5\xa4\xf5\x97\x90\x96\x00\xa4\x5b\x71\x3b\x63\xd6\xa2\xb0\xa9\x99\x27\xf8\x89\xbb\xed\x63\x56\xac\x0a\xfd\x28\x7e\xe2\xb6\xfb\xbd\x68\xb2\xdc\x99\x41\x7f\x05\x99\x4a\xcd\x7d\x8d\x29\xab\x6b\x9f\x09\xd6\x8a\x58\x0e\x98\xfd\x66\xbd\x7b\xba\x45\x95\x79\xd4\x24\x39\xee\x0f\xab\x97\xc3\xf1\xb0\x7d\xdc\x0c\x43\x01\xdf\x3a\x36\xbf\x5f\xf1\x3a\x52\xad\x42\x4b\x86\x82\xbc\x42\xeb\x37\xd1\xe7\xb7\xb4\x8a\x13\x84\xb3\x96\x67\x28\xee\x87\x9d\x43\xab\x24\x46\x87\xc0\x69\xf5\xa0\x79\x1b\x83\x62\xb4\x02\x1d\x31\xd7\x9d\xfb\xad\x87\x02\xad\xc5\xd9\xfd\x97\x1f\xa7\xa3\x00\xd5\x68\x8f\xc2\xc6\x0e\x37\x97\xa1\x2b\x61\x78\xcd\x3a\x89\xb5\xea\xbd\xc7\xef\x23\x64\xe0\xec\xbb\x43\xa4\x4d\x3c\x72\x66\xe0\x75\x78\x16\x90\xb6\x1a\x74\x3a\x22\x8f\xa7\xca\x2f\x23\x45\xb9\x09\x88\x50\x83\x92\xa8\xfd\x71\x3c\x89\xac\x68\x8e\xdd\xbb\x47\xe6\xf6\x3d\x5c\x59\x20\xa3\x42\xfc\xc5\x3f\x37\x87\x6f\xc7\xd5\xed\xad\x87\xac\x6a\x03\x36\xb5\xeb\xf0\x0d\x15\xc0\xc2\xea\x58\x48\xf2\x02\x35\x31\xe6\x14\x7d\xfd\x43\x77\x93\xc5\x35\xe1\xb9\x8b\x03\x0b\x18\x16\x40\x26\xf5\x96\x85\x2a\x4b\xb2\x5c\x63\x01\x16\x4b\xaa\xc6\x7b\xdf\xd3\x9c\xc6\x9d\x02\x4b\xac\x8e\x80\xb0\x5b\xcd\xb6\x30\xa5\xa3\x7f\x9d\x0d\xe4\x84\x62\xc3\x52\x5b\xf8\xce\xa1\xe7\x0a\x4c\xf6\x73\xe2\x64\x01\x67\x02\x33\x1c\x87\x37\x70\x3c\x68\x65\x9e\xe9\xfd\x5b\xd6\x8c\x12\xaa\xc0\x23\x19\xf7\x2d\xba\x73\x22\x21\x08\x75\x10\xf7\x5a\x1d\xbd\x0c\xd1\x38\xcb\x0e\x11\xb1\x2a\x2c\x32\xd3\xbd\x62\x7d\x7f\x48\x63\x48\xe7\xf9\x5b\xac\x09\xfa\xc4\x54\x41\x24\xad\xe6\x6a\x59\xe4\x97\x6e\x51\x2b\xa8\x36\xb6\x4c\x74\xeb\xd4\x59\xd4\x58\xdf\x7c\xa1\x54\x04\x91\x66\xe8\x80\x9a\x5e\x1c\x7b\x42\x57\x00\x71\x4c\xa2\xd0\xb1\x12\xac\xf2\xfc\x53\x06\x5a\x0a\x29\x63\x16\x15\x7f\x3a\x97\x95\x77\x20\x9f\x45\x56\x2d\x50\x3c\x7b\xd3\x06\x29\x17\x98\x48\x06\x2c\x2f\xfa\x3f\x46\x29\x89\x86\x17\xec\xa3\x98\xd9\xcf\xc5\xb1\xa3\x37\xc9\x9a\x95\x31\x59\x9e\x0d\x6b\x1f\x04\x4b\x2d\x6b\x4e\x0e\xa2\xea\xe6\xe6\xaa\x82\x42\x0c\x72\x28\x14\x44\x1a\xa3\x3c\xb1\x45\x4e\xdc\x95\x55\x4f\x07\x4c\x41\x0a\x70\x3b\x40\x1f\x1a\x6f\xf6\x87\xf9\x4e\x07\x12\x6c\x85\xe9\xfc\x56\x36\xe5\xa8\x00\x06\x2a\xd4\x68\x0a\x6e\xb2\x72\xb1\x85\xe7\xeb\xee\x12\x50\x11\xc5\x5a\xef\xb1\x28\x91\x0e\x75\x7b\x3a\xe7\x60\x49\x0a\x27\x88\x0b\xe7\x32\x81\x16\xc6\x12\xc2\xdb\x89\xb6\xd4\xe3\x03\x40\x63\xa5\x86\x57\x3a\x2f\x05\xb6\x23\x4a\x03\x00\x9a\x20\x7d\x05\x2a\x82\xa1\x6f\x88\x1c\x3f\x9b\x81\x77\x00\x40\x47\x58\xe9\x42\xb6\xb1\x81\x4d\x62\xfa\x1c\x86\x85\x44\x8c\xda\xcd\xfd\xfe\xed\x0f\x47\x56\xfa\xf8\x45\x48\xd9\x2d\xb0\x0a\x96\x70\x22\x60\x12\x83\x14\xfa\x58\xd6\xb2\x1d\x26\xf6\x88\x09\x48\x88\xee\xeb\x23\x34\x62\xc4\x6e\x64\x82\x88\x52\xe1\x7a\x07\x27\x70\x33\x13\x48\x46\xd4\x40\x6d\x3c\x4d\x06\x9b\xc0\x69\x69\x9c\xc4\x3b\x8c\xaf\x47\x68\x82\xe6\xf3\xf1\xbf\x76\x7f\x8d\xfd\x67\x43\xa2\x04\x31\x1a\x95\x30\x26\x87\xa3\x9c\x64\xe0\x0c\x49\x81\x59\x2a\xfe\xbc\x11\x87\xbb\xb6\x50\xff\xd4\x09\xf2\x17\x00\xe5\x99\xad\x30\xe1\x9a\x35\x17\xcf\xca\x51\x98\x19\x1a\xde\xd0\x80\x7b\x06\xd1\x4d\xd1\xa0\x67\x37\xb6\x39\x86\x0a\x12\xb9\xfd\x75\xbd\x39\x44\xe3\x2c\xf0\x54\xb4\x80\x9a\xce\xe1\xc0\xba\x6a\xf9\x01\x8f\xa2\x7a\xb7\xdd\xfd\xb3\xba\x59\xc4\xe7\xff\x41\x68\x72\xbd\xc0\x0d\x4b\x01\xc3\xde\xd3\xbb\x4d\x53\xae\x85\x6f\x81\x32\x9c\x31\x4c\x18\xa3\x38\xc2\xc0\x48\x66\xb8\x64\xf8\xc5\xa5\xd0\xaf\xb0\x35\x77\x56\x02\x6a\xfa\xb8\x1c\x8c\xb7\xb2\xd6\x51\x1e\x7a\x44\x4d\x18\x85\xc8\xf4\xd3\x6a\xdb\x14\xde\x34\xe2\xda\x29\xf3\x63\x05\xc3\xfa\x60\x0f\xf8\xec\x26\xaa\x5b\x1d\xd8\x6d\x82\x55\xaf\xe9\x6f\x87\xc0\xb0\x86\xa4\x50\x04\xa2\xb9\xab\xca\x53\x37\x68\x31\x46\x36\x51\x64\x90\x68\xc0\xcf\xf2\xaf\x4b\xc8\x26\x4a\x2c\xe6\xbf\x12\xc5\xfb\x4c\x4d\x99\x9a\x98\x51\xa4\x59\x5b\xbf\xfc\xf5\x7c\xd8\xfd\xb1\xe9\xd9\xd5\x4c\x1c\x25\xba\x37\x01\x12\x0a\x40\x3e\xd2\x7e\x5b\x31\x71\x42\xb1\xe7\x5f\xa8\xf6\xdc\x16\xaa\x69\x2b\x24\xb9\xfb\xf2\x56\x12\x12\xe2\xfe\xeb\x88\x41\x7d\x29\xc9\x24\x61\x02\xc9\x80\x63\x83\x9a\xcf\x6e\x33\x89\x62\x24\xdc\xbb\x39\xd7\x93\xe5\x92\xc4\x91\xf5\x06\xdb\x33\x54\xcf\xab\xf5\xf0\x77\xa3\xa5\xaf\xd4\x0f\xd1\x4f\x03\x77\xd8\xf4\xd3\x0f\x93\x56\x82\x0a\xa7\x0b\xb6\xcb\x7d\xf4\xb0\x59\x23\x18\x47\xd0\xea\xb9\xad\xdf\xa6\x39\x9b\x7e\x5a\x8b\xd8\x60\x3d\xf3\x07\xaa\x49\xff\xf9\x56\xe6\x93\x68\xd8\x88\xd4\x6a\xf9\x65\x9d\x97\x5f\x97\x85\xc8\xd1\xf6\x79\x0a\x5e\x6a\x84\x62\x21\xf5\xa8\x87\x0c\x01\xc6\x0f\x02\x49\xab\xbb\x69\xf6\x02\xaa\xac\xf4\x2c\x2b\x65\x24\x93\x18\x92\x7e\x94\x0d\x3c\x95\x0f\xa5\x7a\xbf\xb9\xd8\x8a\x82\x1f\x10\x31\xaf\xd6\xba\x3d\x89\x57\x70\x4c\x13\x9d\x5f\x50\x5e\xb5\x73\x1a\x29\x01\xf1\xcf\x18\xdd\x5e\xa5\xc3\x67\x53\x4f\x6a\x95\xaa\x51\xaf\xf4\x18\x30\x69\x14\xb7\x60\x7d\xdc\x10\xea\xec\xb5\xf8\x04\x30\x6b\x74\x28\x85\xea\x21\x66\x33\xda\x4d\x03\x04\x50\xc3\xf6\xbf\x44\x31\x7d\x9b\x60\xb8\xef\x3c\x3a\x94\x0f\x59\x3d\xde\xbc\x26\xa2\x1e\xd4\x74\x51\x7d\x38\xc0\xe5\x2c\x35\x20\x36\x4c\xba\x2e\xe3\x7e\xea\x19\xa3\xc1\x25\x70\x8f\xd8\x64\x50\xe6\x0e\x5c\xe0\xba\x0d\x2d\xc4\x80\x05\x01\x09\x0c\xf3\x70\x60\x2b\xea\xeb\xc5\xb6\xa6\xe9\x48\x16\x04\x2c\xc5\xc0\x42\xfc\xef\x8f\xba\xfb\xdf\x6f\xee\xef\x44\x19\x2b\xbf\x22\xd4\xfb\x1f\x50\xb4\x75\xb7\x76\x2d\xaf\xaa\x1f\x61\x24\xb5\xc1\x69\xfd\xb6\x6b\x9b\x83\x0f\xe1\xdc\x8c\xc3\x01\xd8\xbd\xdf\x85\x33\xdf\x44\x8d\x4a\x27\xfb\x33\xcc\x4a\x13\x2c\xa0\x3c\x44\x0a\x97\xba\x3d\xd9\x76\xe8\x57\x88\xfd\x8f\x30\x4a\x50\xf1\xe2\xf9\xfe\xfb\xba\xff\x5b\x2c\x93\x5e\x13\x1b\x57\xc2\x1c\xb7\xc2\x02\x1e\x50\x45\x7c\x91\xb4\x8b\x33\xee\x45\xff\x68\x21\x97\x36\x0f\xec\x45\xa3\x9a\xdb\xac\x02\xac\xe9\x8d\xf6\x0c\x16\x84\x9a\x60\x77\xf8\xfd\xfd\xfd\xe8\xdb\xb2\x20\x62\xa9\xb0\x10\xa1\xbe\x9a\xff\x49\x23\x38\x0b\xe2\x48\xc4\x03\xd1\xc2\x7a\xb6\x6f\xb1\x20\xe1\x92\xb9\x12\xcf\x53\xd9\x6c\x8b\xfe\x8a\x58\xcc\xf8\x6d\x7a\xb1\x44\x39\x92\xdf\xac\xc0\x60\xf4\xde\x6f\x26\x2c\x48\xb4\xa5\xf9\xaa\xe1\x6b\x45\x4a\x16\xa4\xa1\x6d\xce\x44\x48\xc8\xb8\x8c\xce\x02\xa1\x4d\x18\x0d\x5a\x85\x1f\x59\xd9\xd6\x47\x04\xcf\x55\xa0\x44\xdd\x1c\x4d\x55\x9e\x8e\x59\x03\xa7\x45\x5a\x5b\x16\x48\xd6\xb3\x93\x6d\xeb\xbb\xec\xa7\xb7\x5e\x2c\x90\x51\x12\x25\x23\xe3\xb1\xae\x00\xb1\x6a\x22\xdf\x36\x70\xda\xea\xdf\x66\x17\x8a\x64\x82\x3e\xc7\x65\x37\x86\x8e\x7f\x9a\xc6\x65\x81\x92\xb6\xbd\xd5\x0a\x7d\x7c\xce\x81\xc4\x02\x05\x1a\xed\x18\x86\xe3\xe4\xd8\x4b\x00\xb1\x40\x07\x91\xc5\x75\x75\x33\x41\x9f\x0f\xe5\xb4\x90\x34\xbd\x45\x1d\xc7\xb8\xe7\x6c\x0e\xdf\x36\x2f\xbb\xa7\xcd\xf7\x47\x7f\x19\x48\x00\x7d\x8d\x2e\xf8\x58\x9d\xa0\xd0\x57\xaa\xba\x2c\x00\x63\xa9\xeb\x7d\xbe\xd0\x0a\x0e\x7d\x52\xf2\x9c\x3d\x80\xa1\x29\xd6\xda\x33\x55\x22\xe3\x8b\xff\x5d\xc3\xb4\xa5\x1f\xcf\xce\x79\x79\x72\xee\x38\x23\x41\x10\xa2\x5c\x00\xbe\xf7\x3f\x01\xde\x0f\x3f\xca\xfe\x98\x8e\x7a\x8f\x50\xd4\x56\xb6\xda\x1d\x22\x84\x21\xff\xbb\xcc\x85\x7a\xc7\x19\x39\x2a\x3b\x79\xf3\x41\x08\x25\xbe\xc1\xc5\xa2\xec\x70\xe7\x9a\x78\xdf\x8c\x50\x66\x58\xe0\xeb\x98\xf9\xa7\x0a\x58\xd3\xc7\xec\xce\x42\x88\x1a\xd2\xd1\xda\xf6\xb0\x3e\x48\x61\x84\x8a\x24\xe9\x91\x27\x88\x6d\x18\xaf\x5d\xc2\x25\x47\x1e\x70\x84\x72\x60\x50\x90\xc9\xb1\x62\xb2\x1f\xa6\x2d\xd0\xb7\x2d\xbc\x70\x0b\xcc\xe1\x35\x6e\x64\x18\xd8\xbe\xdd\xf2\xbc\x54\x70\x66\x24\x0a\x2c\x00\xc9\xb7\x18\x0d\x61\x62\x6f\xea\x19\x89\x58\x8a\xd5\x7d\x81\x8b\x7b\x2a\x4b\x78\x2d\x0d\xc1\x48\x12\x49\x8b\x17\xe8\xac\xd8\x76\xbd\x3b\xfe\x20\xfe\xf7\x92\x58\x59\x69\x9a\xea\x72\x6e\x44\x5b\x75\xfb\xef\x07\x78\x97\x87\x91\x04\x78\x30\x9e\x60\x37\xca\xf6\x61\x2f\x2f\x0a\x92\xc6\x80\x7e\x9a\x86\xba\xa9\xca\xfe\x2a\xa9\x16\x5e\xb7\x1f\x6d\xbf\xe7\x00\x24\xfe\x3c\x41\x62\xec\x27\xb1\x44\xdf\xa8\xa9\x35\x5a\x51\x44\x10\x81\xb1\xdc\x66\xed\x38\xbc\xfc\xdf\x85\xf4\x6a\x1a\x88\x15\x23\xe1\x38\x13\xc1\x88\x90\x82\xb3\x51\xef\xdb\xbc\x99\x89\x11\x49\x52\x4c\x2b\xff\xbe\x1b\xdb\x66\x22\x99\xc1\xcc\x8c\x73\x4e\x6f\xdb\xba\x39\x94\x56\xf0\x6f\xfa\xc0\x52\x72\xdf\x49\xb4\x42\xaa\x02\xd0\x16\x5e\xb7\x6a\x5f\x4f\x59\x31\xa3\x77\xbc\xfe\x94\x8a\xca\x84\xf6\xbc\xbb\x45\x01\xf9\xd4\x84\x11\xcd\x00\xf3\x01\xa5\xb1\x2e\x7c\xdf\x0e\xc7\x88\x56\x14\x5d\xcb\xf5\xea\xf0\x8f\xd5\xed\x17\x83\x65\x46\x20\xe0\x18\xe9\x37\x3f\xb2\xa6\x81\x6a\xab\x77\x06\x83\xc4\x65\x77\x86\x11\x20\x1a\x86\x94\xd7\xbc\xcc\xe7\x07\x45\x14\x99\x65\x5d\x01\xcc\x27\xb9\xfc\xed\x43\x12\xe0\xab\x5b\xac\x1f\xb5\x57\x24\x2f\x8c\x80\x66\x08\xb9\xc0\x74\xc4\x7f\x95\x59\x01\xba\x7f\xee\x7e\x4a\x98\x50\x68\xda\xeb\x8c\xbb\xd5\xd5\xff\xa6\x89\xc3\xa0\x57\xbe\x9a\xf1\x19\x4e\x36\x02\x1a\x10\x5b\x31\xbb\xc9\x9a\x3d\xe4\xa0\x9a\xe7\xaa\x6c\xe0\x35\xd3\xde\x74\xd0\x80\xdb\x68\x61\xe8\x83\xff\x87\x09\x8a\xe9\xbb\xa7\x41\x04\xa8\xe3\x73\x12\x55\x95\x81\x5e\x79\xe3\x43\x09\x85\x51\x5d\xc2\x95\x2a\x91\x37\xe6\xaa\x28\xc1\x28\x49\x05\x5a\x6d\xd0\x59\x4f\xc6\xbb\xd4\xd3\xc6\x68\xe7\x00\x52\xbb\xe3\xf8\x5f\x62\x5c\xa0\x8d\xbc\xcb\x72\xec\x6b\xf5\x8c\x07\xfe\x70\x18\x5a\x2e\xfe\x9e\x7d\x81\x51\x26\x01\xf3\xdd\x07\x0f\xd9\xfb\x47\xad\xc3\x8c\x72\x91\xe0\xb6\xe9\x24\xa2\xbf\x84\x57\x30\x1a\x52\x9a\x8a\xbe\x00\x31\x87\x6f\xf9\x41\x4c\xd9\x5e\x6a\x64\x52\x7e\x14\xd5\x6b\x56\xac\xb1\xfe\x7c\x03\x6f\x22\x37\x23\xc2\xed\xc9\xda\xa2\x61\xa8\x23\x57\x17\xdc\xfd\x28\x9c\xf4\x8a\x9f\x49\x34\x16\x8c\xf8\xc4\xf6\x31\x2b\xb2\xce\xcb\xe8\xc1\x2a\x8c\x26\x49\xe0\xa9\xdc\x30\x4d\xed\xff\x9c\x3a\x51\x0c\x00\x27\x76\x32\x9c\x21\x2d\xb9\x86\xad\x32\xbc\x63\x5f\x38\x0a\xb9\x5c\x6f\xec\x34\xd1\xd2\xa6\xb0\x11\x86\x93\x95\xc5\x78\x8b\xa6\x09\x04\x8c\xf6\x57\xc2\xbc\xf0\xb3\x58\x52\x77\x61\x34\x15\x0a\xdf\x77\x17\x3a\xa1\x44\x42\xa1\x91\xe3\x6c\x21\x4b\xc4\x68\xaa\x0d\x02\x06\x71\x63\xf1\x1c\x34\xfd\x0b\x11\x51\x84\xaa\x9e\xbe\xb5\x75\x2d\x2a\xdd\x2d\x6a\x7f\x5c\x06\x56\xaf\xb5\x57\x20\xda\xf5\xb0\xdb\x43\xf9\xd4\xe6\xf9\x74\x3f\xa7\x92\x2a\x0c\xa7\x11\xc2\x26\x72\x37\xe9\xdc\xa0\x27\xec\x86\x78\x14\xe7\xd9\xc7\x96\x29\xa0\x50\xf8\xe3\xea\xe9\xdb\xea\x70\x58\x3d\x3d\xbf\xec\xfe\xfd\x57\x74\xf8\xb6\xfa\x63\xd3\x5f\x58\xd1\x5e\x87\xb6\x2c\xf3\x6f\x59\x8d\xec\xbd\xa3\x8d\x9d\x4a\x63\x95\xc6\x6a\x24\xcc\x7f\xdf\x2c\xe0\x27\x19\xd5\x26\x4d\x3c\x91\xfa\x66\xd2\x3e\xc8\x28\x04\xd4\x6b\xef\xba\x8c\xbd\x45\x46\xfe\xb3\x55\x60\x22\x4e\xbc\xd9\x87\xa2\x69\xab\x79\xae\xbd\x1b\x92\x52\xcb\x64\xd1\xe6\x99\xe8\xad\x3e\x23\xa1\xc4\x49\xeb\x31\xb9\xc7\xbb\xcd\xea\xf0\xfd\x65\xb3\xef\x07\x24\x21\x9a\x8d\x93\xf8\xe9\x6c\xc6\x7e\x28\xb5\x31\x46\x39\x20\x6d\x4a\xd1\x9e\xee\xab\xb2\x3d\xd7\xfd\x81\x38\xd0\x89\xa3\x93\x52\x65\x5f\x98\x62\x8c\x75\xb6\xda\xe3\xfc\xfe\x4b\x68\x2f\x52\x34\xbc\x0d\xc6\xa9\x55\xfe\xad\xa0\x86\xea\x63\x06\x47\x64\x8c\x33\x9d\x04\x03\x7f\xc1\xc8\xf3\xf7\x03\x62\x8a\x49\xe0\xc3\x7a\x37\x90\xf9\x76\x7f\x8e\xa8\xd3\x1a\x3c\x80\x38\x2d\xcd\x59\xc6\x53\x42\xed\x36\xe2\xb6\x82\x6d\xbd\x3b\xc3\x70\x67\xda\xd6\x83\x3f\x32\xf8\x71\xdd\xaf\xcd\x18\x07\x82\x9b\xd4\x1e\x72\x84\x9b\x7d\x9d\x6a\x5e\xfc\x9a\x2c\x8a\x04\x2a\xff\x0b\xad\x6f\xba\xc7\x9a\x86\x35\x6e\x50\x1c\xc4\xf1\x40\xd8\x38\x29\xe3\x2c\xda\x3e\x16\x07\x0a\xbb\x63\xee\xee\xee\xc6\xbe\x09\x8b\x79\x6c\x12\xef\x2b\x7f\x40\x55\xcf\xde\x65\x1c\x25\x81\x4b\x18\x3f\x5e\x90\xfd\x14\xa9\xa2\xc6\xd3\x9f\x25\x49\x82\x7e\xda\xc3\xea\xce\xff\x29\x65\x09\x7a\x22\xbe\xd3\x06\x7a\xa1\xe3\xd9\x1b\x4b\x81\x20\x95\xc9\x7e\x73\x40\x6f\xcc\x21\xec\xfd\x75\x84\xb4\x2b\xab\xe7\x96\xab\x2d\xe6\xe1\xa7\xe3\xa0\xe4\xcb\xdb\x20\x93\x3c\x44\xe0\x64\x67\x3d\x1c\x06\x60\x0f\x4d\xdd\xa3\xf1\xfc\xf5\x25\x84\x3a\x1c\xe5\xc3\x1f\x4a\x51\xf4\x73\x58\xd1\x00\x93\x09\xdf\x9f\xb6\x07\x6f\x7b\x30\x16\x1e\xb8\xb1\x19\x53\x1a\x2c\x43\x8e\x98\xe4\xae\x18\x53\x26\x72\x02\x23\xa2\xa8\xd7\xe5\xe9\xdc\xcd\x56\x3d\x2f\xce\x33\xa6\xc3\x08\xb3\x4d\xba\xdc\xff\x10\xd5\x15\xf4\xd1\x8d\x02\xc1\x10\xd4\x5e\x97\xb9\xbe\x2b\xab\xc3\x5b\x56\xf5\x4b\x0a\x84\xc0\x2c\x9a\xe3\x9a\xfe\xe4\x02\xca\xb6\x07\x20\x34\xec\x38\xd7\x63\xba\xc2\x84\x31\x66\xb8\xd5\x05\xaa\xc0\x64\x43\xc1\xca\x1f\x34\x32\x62\x3d\x72\x73\xf7\x01\x55\x95\xf9\x32\x23\xe3\x41\xa8\x31\x7b\xd8\x16\x75\x23\xde\xa1\x9b\x36\x6d\x91\x4d\x29\x57\x18\x0f\x12\x8d\x69\x08\xd9\x56\xc5\x0b\x3a\x58\x9e\x01\x70\x18\x62\x42\x2c\xa8\xea\x59\x33\xe3\xe2\x23\x72\x62\x2c\xef\x71\xe6\x48\x15\x47\xb4\x8d\x8c\xd3\x94\x0a\x2b\x36\x54\xfc\x25\xae\x6a\x84\x8c\x53\x91\xea\xd4\xaf\xfc\x81\xa4\x9e\x71\x96\x58\xb4\x94\xf5\xc8\xd7\xa2\x6e\x72\xd8\x5d\xf5\x8e\x33\xce\x80\x63\x85\x4c\xd4\x99\x76\xb8\xcd\x6f\xe2\x03\x6e\x00\x8a\xc7\x6e\x62\xf7\x17\xe4\x54\x5a\xd4\xfe\x79\x16\xcf\x71\x1e\x53\xec\x34\x91\x6d\x96\x6b\x9f\x76\xea\xe1\xc0\x8c\x73\x4d\x6d\x5b\x65\x75\xf9\x8e\x32\xd1\xd8\xe6\x51\x56\xd3\xb0\x8f\x47\x84\x23\xff\xb5\xa9\x00\xf6\xad\x9c\x4c\x88\x64\xea\xb5\xf0\x88\xc5\xc9\x24\x24\x83\x62\x4c\xa8\xe7\x47\x09\x81\x39\xce\xfa\x0c\x45\xf3\x2c\xaa\x1a\x94\x55\x47\xef\xbf\x54\xa4\x19\xb6\x18\x21\xae\xd2\x31\xff\xcd\x2e\x12\x8b\x00\xf5\xe0\xb3\x2e\x6c\xb6\x5a\x4b\x85\xee\x41\x8a\x4b\x05\x67\xc6\x13\x69\xa4\x4b\x21\x6d\xd7\x8b\x04\x1b\x8c\x27\xae\x0b\x42\xf8\x68\x79\x4a\xf7\x30\x2e\xa4\x30\x9e\x68\xab\x94\xf0\x19\x93\xc2\x64\x3b\xe0\x89\x81\x68\x60\x6b\x1b\x36\x57\x77\x38\xa5\xc6\x91\x71\x77\x6b\xdb\x3a\x4c\x5f\x5c\x2d\x4d\x0d\xe2\xe9\x1c\x54\xea\x65\x98\x12\x92\x08\x64\x29\x39\x1d\xb1\x95\xc3\xcb\x3c\x33\x2e\x21\xf5\xb2\x9c\x36\x59\x0a\x7a\xdf\x9e\x6e\x2e\x13\xe8\xb5\x1b\xab\x18\x0b\x3d\x22\xb3\xcc\x75\x17\xc3\xfe\x09\xd9\xeb\x5b\xbf\x04\x54\xa4\x12\x8f\x09\x59\x7f\x3b\x76\xdf\xef\x48\xd2\x49\x90\xcb\x95\xb2\x56\xcb\x49\x7d\x5b\x9d\xcd\x45\x1b\xcb\x35\xa7\x2a\x72\xaa\x8e\x50\xdd\x95\x95\x02\x0f\x42\x99\x62\x08\xda\x29\x46\x76\x71\xdb\xe3\x10\x84\x58\xd4\xbe\xcf\x3e\xe0\xe5\xe9\x7e\xf6\x6c\xc0\x2d\x88\xb2\x80\x1f\x0e\xc2\xe6\x65\x1b\x19\x87\x88\xe2\x47\xb2\x3d\x4f\x23\xd9\x91\xf9\x2f\x00\xc7\x0e\x01\x4c\x5c\x8c\x34\xf4\xba\x23\xd2\x36\xa4\x7b\xe1\xde\xe7\x0a\x4e\x59\x7b\xfa\x34\xfe\xfd\xe2\x23\x1b\x62\x73\xd7\xc7\xfe\x62\xce\x2f\xd7\x9d\x4b\xba\xa0\x40\xcd\xb8\x09\x2d\xf2\x78\x2d\xaa\x67\x51\x39\xc9\x17\x16\x06\xda\x20\x95\x37\xaa\x4b\xe8\xec\xa3\x6e\xca\x5e\xcb\x89\x85\x01\xc8\xd0\x85\x1b\xdf\x44\xfd\xb6\x2d\xba\xef\xed\x5a\x82\xa7\xed\xd8\x2c\x24\x11\x17\xdd\x0f\x6c\x9f\x6e\xd6\xbf\xea\x16\x64\x21\x11\x81\x76\x32\x2d\xeb\xf6\xd4\x3d\x42\xf6\x01\x8e\x97\xdc\x0d\xa1\x21\xc3\xf2\xf6\xd3\xee\xc9\xfb\xc9\x21\x8b\x25\x76\x37\x58\xfd\x8f\xb7\x0a\x00\xc5\x58\x37\xff\xbb\xed\x3d\x85\x90\x49\x89\x53\xf4\x65\x67\x01\x47\x87\xcd\xf1\xf9\x65\xf7\xc7\xb6\xa7\x6c\x63\x21\x53\xa9\x65\x08\x82\xc6\xa7\x28\x7e\x4d\x26\x95\xf8\x93\x8d\xc1\xe6\xea\xb9\xb3\x31\x9d\xb9\x21\x0f\x52\x74\x58\xb6\x85\xc9\x4e\x65\xf1\x3e\x20\x49\x58\xc8\x59\x84\xd9\x37\xf8\xc8\x54\xf3\x67\x59\xbd\xcf\x60\x4f\x2c\x0c\x53\x6a\x2c\xa7\x52\x3d\xd7\x0d\x62\x61\xa8\x28\x6e\x8c\x06\xb1\x2a\x8f\x59\xdf\xac\xef\x8f\x03\x09\xd5\xa4\xb8\xd9\x6d\x14\x74\x3a\x23\xc2\x28\xa0\x08\x7b\x6f\x0b\x7b\x9d\xc9\xae\x18\x46\x4c\xe3\xc2\x3b\xbe\x42\xf3\x17\x88\x6a\x7e\x72\x18\x0e\x42\x3a\x13\xc9\xf2\x19\xa0\x7d\x94\x3a\x0a\xa3\x50\xa1\x17\x22\xb4\x25\x2f\x15\xb9\x23\x20\x9f\xe5\x41\xfb\x39\x15\x89\x10\xdb\x63\x7f\x00\xbc\xef\x0a\x18\xa1\xb8\x58\x18\x73\x82\x85\x26\xff\x19\x6e\xe1\xc3\x0a\xdb\xfa\xe3\x8a\x9a\x60\x4c\xcd\x73\x28\x1d\x43\xcc\xec\x51\x92\x30\x40\x20\xf1\x11\xef\xe2\xd0\x0b\x2b\x8e\x5c\xe1\x30\x89\x62\x8c\xac\x1d\x56\xfa\x05\xea\x36\x6f\x7e\xbb\x2e\xa2\xb3\x30\x65\x29\x3a\x7b\x5d\xf4\x3a\xad\x7c\x4d\xe6\x7f\x6a\x02\xac\x7d\x55\x98\x85\x9a\xda\xae\xc9\xdd\x89\x98\x5b\x6e\x75\x51\x75\xe1\xfc\x0b\x66\xf9\x3f\x41\x0c\xb2\x50\x28\x2b\xa2\x52\x97\xa6\x51\xe2\x3c\x64\x3f\xc2\xff\x97\xb5\x3f\x6b\x6e\x1c\x47\xf6\xc6\xe1\xaf\xd3\x17\xcf\x05\x41\x2c\x24\x2f\x65\x79\x29\x3d\xed\xed\x58\xaa\xaa\xe9\x73\xe2\x84\x02\x4b\xc2\xe6\x98\x22\x35\x24\x55\x2e\xf5\xa7\x7f\x83\x09\x80\x9b\xe8\xaa\x7e\xe3\xff\xdc\x74\xcd\x98\x10\x57\x2c\x89\xcc\xdf\xa2\x68\x12\xfb\xd7\x71\x07\x25\xfc\x99\x87\x19\x34\x1c\x67\x31\xce\xc9\xfd\x56\xf8\xab\xc7\x96\x76\x7f\x78\x81\x1f\x79\xb7\x95\x7c\xac\x1c\x7d\x73\x70\xfa\xa0\x5c\x79\xde\xd5\x53\x89\x33\xf3\x25\xaf\x92\x72\xa5\x0c\xe7\xc3\x5e\x6b\xaa\xaf\xe2\xdb\x68\x42\x38\x1b\x6a\x5b\x41\x2e\xf6\xb2\x59\x66\xe9\xa0\xe8\x18\x3c\xd2\xc3\x51\x41\x53\x67\xd7\xd3\x3b\xcf\x55\x4d\x93\x8f\xee\x56\xa7\x1c\x91\x5e\x65\xd5\xca\xfa\x7c\x0b\xc3\x01\xe5\x0e\x3c\xac\xfe\xb5\x79\xf8\xfa\xb0\x7f\x7c\x7a\xdc\x7f\xff\xb2\xd9\xdd\xdc\x6f\xb6\xbb\xfd\xea\xe1\xe9\xeb\xe3\x2e\xb4\x35\xb1\xc1\x98\xdd\x53\xf3\xa7\xdc\x63\xca\x81\x10\xac\xbf\xca\x40\x08\xda\x9e\xcb\xf6\x6d\xb6\xc3\xe4\x40\x29\x66\x63\xae\x73\x59\xfe\xdf\x5e\x96\x3a\x1c\xcc\x1c\x14\x03\x45\x52\x10\xc0\xdd\x1f\x51\x19\x4e\x0c\xdb\xb7\x1c\x0a\xe3\x05\x19\xfb\x83\x5a\xe0\x16\xdf\xad\x52\xd7\xd7\xb7\xbb\xe5\x65\x8a\x5b\x91\x04\x28\x9b\x2f\x76\xdf\x56\x75\x10\x96\x76\xfd\xd9\x47\xeb\xa3\x19\xde\x4a\x2a\x7d\xe8\xbb\x3d\xa1\xb1\x95\x3d\x85\x54\x0a\xb7\x5a\x4c\xe4\xe3\x67\x15\xe3\xae\x81\x44\xe0\xd5\xe3\xea\xe1\x66\xff\x65\xf5\xfd\xcf\xcd\xe3\x9d\xff\xb1\x88\xe2\x14\xf3\x34\x26\x6f\xba\xe1\x35\xda\x0d\x8b\x28\x51\x51\x3c\xf1\xbb\x87\x1f\xeb\x53\xbb\x9f\x9e\x5d\x10\xe2\xdc\x1b\x4f\x08\x55\x9e\x4b\x68\x86\x46\x49\x32\x10\x48\xef\xbb\x99\xc0\x1f\x88\x99\x26\x49\xef\xe6\xd0\x9e\x57\xe3\xc1\x2f\xe2\x44\xa5\x7e\x15\xbc\x39\x1c\x8b\xea\x0c\xb0\xb9\x20\x02\x84\xb6\x56\x60\x9a\xd9\x63\x82\xa6\xba\x2f\xbe\x0d\x65\xce\xa1\xd9\x96\x3f\x66\x4f\x41\x45\x8c\xa9\xf3\x50\xd3\xf8\x13\xb4\x96\xef\x31\x17\x17\x0b\xd3\x6f\x92\x36\xbf\x60\xa4\x50\x41\xd3\x84\x44\x7d\x12\xb1\x27\xf5\x8e\x6e\x23\xd5\x98\xeb\xb9\x1b\x65\x36\x04\x8b\xd2\xc0\xc5\xc1\x97\x8b\xdc\xc7\x66\xcc\xa4\xa2\x82\x93\x24\xf6\x99\x9a\x7d\x01\x3f\xa0\xcf\xc4\x09\xc1\x28\xce\xd6\x41\x57\x12\x13\x90\xb3\xdb\x0b\x3e\xbd\x5d\x6b\x63\x5c\x61\x5c\x35\x6d\xde\x9e\x5a\xf0\xa9\xb6\xe5\x1a\x95\x10\x00\xb1\x0a\xdf\xef\x0c\xc8\xef\xea\x43\x52\x91\xc4\x36\xa8\x40\xfd\x43\xd9\xe7\xf0\x43\x20\x38\x67\xca\x63\xfe\xb5\x0e\x3d\x5d\xa4\xb1\xc0\xd4\xf3\x5b\xfe\xfa\x06\x4d\x7b\x05\xfd\x85\x52\xce\x50\x26\x6e\x77\xb3\xfe\x32\x1e\xce\x22\x4d\x23\xf7\x3c\x6e\x5a\x5e\xe9\xb7\x1c\x7a\x03\x30\x2a\x32\x6b\x51\x19\xae\xa8\x5e\xe3\xdb\xaa\xde\x1e\x64\x51\xb8\x6c\xe2\x22\x7a\x89\x0a\x49\x22\xe6\xf9\x0b\xed\x67\x34\x8b\xa1\x69\x32\x98\xdb\xdc\xd6\xd5\xe1\xcf\xbf\xd6\x98\x5b\x98\x3e\xab\x24\x10\xd3\x81\xd3\x73\xf3\x53\x0f\x79\x4f\x21\x8d\xc5\x7d\x6b\x91\x2b\x95\xe3\xe6\x5e\x49\xfd\xde\xad\x0c\x7f\x9c\x06\x03\xae\x7e\xce\x98\x62\xc4\x66\xff\xfa\x53\x2a\x91\x8e\xb8\x38\x43\x7e\xee\x6b\x99\xb7\xa1\xd6\x27\xb4\x48\x70\xa4\x5c\x05\xd0\x10\x15\x5a\x4b\x32\x62\xa6\x6d\x74\xd5\x23\xc8\xa8\x30\xc2\x08\x27\x2f\x02\xef\xc5\xf9\xbe\x6a\x5b\xa8\xcf\x57\xcb\x73\xa0\x30\xa9\x42\xb8\xe0\xb6\x2a\x4e\xcd\x73\x21\x5b\x5b\xd5\x87\xfe\x4c\x99\x10\xbc\x7f\x6d\xc8\x88\x1c\x10\x0a\xf3\xf4\x8a\x30\x20\xb1\xdc\x70\x38\xbb\x8a\x9b\xff\x33\x30\x82\xe0\xe3\xf2\x74\x70\xa3\x65\x5e\xcc\x13\x20\x18\xa2\x20\xa0\x34\xce\x03\xfe\x97\xc9\x07\x01\x29\xc1\xac\x24\x42\xa1\xfa\xb7\x04\x19\x43\xed\x83\xc1\xc7\x7d\x64\xac\x46\x13\x42\x34\xe6\x0b\x7d\x31\x18\x4d\x21\xbd\xe2\xcf\x40\x3f\xc4\x08\xe5\x1f\xe5\x0e\x13\xc2\x52\x14\x88\xb6\x68\x0d\x94\xcf\x27\xfa\x84\x30\x27\x12\xb3\x6f\xa4\x85\x87\x53\xb1\xdc\x87\x13\xc2\x23\x64\xd4\x23\x94\x74\xe4\xc6\x47\x13\x92\x25\xca\xd5\x0a\xca\xc5\x79\x3c\x21\x40\x1c\x22\x0c\x1a\x2d\x8b\x10\x3e\xf9\x83\x31\x97\x28\x7c\x15\x42\x83\xdf\x11\xb6\xa6\x89\x8b\xe9\x3d\x52\x2e\x14\xee\xbd\xab\xc7\xaa\x5d\x15\x1f\xf2\xdc\xf8\x8d\x96\xc3\x4e\xa1\x76\x55\x78\xcf\x34\x25\x76\x6e\xa0\x72\x21\x59\x31\x3b\x7f\xea\x16\x4d\x1d\x6a\x1c\xff\x7a\x5e\x61\xf6\xb1\xe9\x4f\x9a\x81\x91\x83\xb9\x76\x5e\x95\xcd\xc6\x17\x76\x9a\x7e\x02\x49\xa8\x04\xac\xc1\xbb\x7a\x12\xc2\xd2\x5c\xf6\xc8\x1f\xe7\xc2\x25\x6b\xd6\x8f\x55\x0b\xf3\x64\xc4\xe2\x3e\xda\xff\x30\x21\x80\xc0\x98\xab\xed\xf2\x9e\xee\x12\x8f\x92\x24\xd4\xe0\x3e\x77\x48\xff\xf9\x30\x79\xfa\x0d\x53\x42\x71\x0a\x0b\x49\x57\xbc\x69\xdc\x00\x16\x30\x86\x76\x0d\xbb\x82\x7f\xfc\xef\xa5\x4a\x0b\x4d\x52\x61\x53\x0f\xd7\xb8\x0a\xba\x32\x0b\xa1\x6a\x92\xa6\x16\x03\xe8\x12\x7e\x8e\xbd\x51\x69\x92\x6a\x60\x2e\x53\x29\xbb\xa1\x7a\x38\xc2\x0c\xba\x93\x64\x71\xa6\x3c\x88\x08\x37\x93\x43\x70\x94\x64\x8c\x47\xae\x84\x78\xbe\xad\xea\x9d\x6c\x96\x61\xa9\x34\xc9\x4c\xc2\xd1\x87\xe4\x3a\x4c\x78\x89\x4c\x94\x33\x84\x0f\x81\x79\x08\x37\xbd\xe3\x5e\xdf\x09\x64\x0a\x18\x60\xad\x57\xbb\xb0\x27\x9a\x95\x0e\x12\x69\x24\xf2\xc0\xf4\xb0\xd1\x4b\x94\x70\x6e\x30\xb5\xc3\xdc\xe1\x4b\x59\x2e\x8f\x27\xda\x2a\x1c\xf9\xf7\xab\xeb\xdf\x89\x22\xd1\xc4\xf0\x18\x8b\x33\x2f\xab\x60\x38\x4d\x13\x60\xda\x04\x65\x0e\x79\x80\x55\x69\x56\x7d\x99\x27\x01\x11\x21\x0f\xde\x4d\xb9\xcf\xab\x09\xa6\x2e\x01\x21\x33\x9f\x57\xea\x33\xc1\xd3\x4f\x07\x89\xc6\x1d\x6b\x5d\x15\xc5\x75\x4f\x95\xa2\x89\x25\x0a\x61\xdc\x7b\x79\x3c\x76\x33\x8a\x7c\x7d\x05\xb3\x54\x98\x49\xa3\x48\xa0\x10\xe4\xd3\x47\xd9\xbd\xd9\xa7\xff\xfe\x23\x1c\x60\x1a\x6d\xfa\x9c\x94\xce\x88\x6b\x37\xdf\xb9\x7e\x3a\x85\x7e\xf6\xf7\x39\x12\x68\xd4\xf3\xc3\xb5\xc1\x28\x27\x7d\xfb\xd5\xc7\xb6\xe1\xae\x88\x34\x98\x6d\xbe\x7b\xba\xbf\xbe\xf9\xaf\xfe\xaf\x96\x63\x59\xdd\x89\xb3\x85\xbf\xc6\x99\xb2\xde\xe7\x0a\xc5\x90\xc2\x9f\xa5\xab\xbc\x79\xbb\xd0\xcf\x36\xf1\xa1\xb5\x62\xc1\x41\x6c\x5b\xc8\xe6\xcd\x65\x0b\xbb\x88\x79\x3a\x14\xba\xed\x14\xa2\x5c\xa4\xd6\xa7\x5a\xea\x80\xaa\xe9\x42\x2a\x04\x7f\xf5\x38\x93\x86\xfc\x5a\xd7\x6c\x38\xa3\x72\xbc\x7e\x97\x2c\xbc\xed\xd6\xbf\x1e\xf2\x93\x32\x02\xd1\x20\x11\xb2\xf8\x69\x19\x73\x72\x90\x4e\xfb\xd7\x7c\x1a\x01\xfa\xe6\x3c\xd6\xd6\x33\x51\x6e\xb0\x2f\xf4\xde\x12\xc3\x3a\x95\x72\x2b\x31\x84\xb9\xd9\xae\x5f\x9e\xbe\xef\xbf\xaf\xee\xef\x83\x81\x01\x4d\x85\x20\xa0\x7c\x76\x05\xe0\x6f\xd8\x1f\xc7\xfe\xce\x34\x15\x59\x8c\x32\xba\xbb\x6a\xa2\xb7\x43\xd3\x44\x28\xd4\xed\x2e\xe1\x23\x08\xf3\x3b\xe5\xa1\xf9\x8b\xf2\x8f\x39\xee\x2b\x49\xa6\xd1\x2b\x56\x57\x95\x43\xd3\x2e\x19\x41\xd0\x34\x63\x3c\xf8\x82\x8d\x11\x5d\xf3\xe8\x24\xcd\x52\x8e\xe1\xd7\xeb\xf9\x30\xec\x94\xd3\xcc\x52\xee\x53\x3f\x8f\xa7\xc3\x1a\x29\x07\xd3\x89\x22\x95\x91\xb3\x34\x3d\xca\xba\x8d\xa3\xd9\xfe\x38\x95\x2c\x45\xea\x91\x71\x13\xd8\x55\x21\x35\x0a\x1b\xde\x56\x35\xfc\x18\x9a\x29\xa3\xd1\x45\xb2\x05\x79\xa0\xe3\x70\x3a\xd5\x7e\xa6\x1d\x70\xb0\x3d\x22\x9c\xa6\x5a\x50\x1c\x2f\xf2\xc7\xc8\x9c\x98\xa6\x5a\x52\x04\x2c\x6b\x87\xb3\x1e\xa7\x8a\x52\x23\x20\xe2\x13\x48\xd3\x58\xc4\xe8\x93\x2e\x02\x8a\x38\x87\x1d\xf9\x0e\xc1\x8f\x77\x79\x56\x4f\x6d\x24\x70\xfa\xdf\x3e\xdd\xdf\xfc\x02\xa0\x99\x5a\x4e\xc4\xa0\x25\x34\x12\x0b\x0b\x81\x66\x6a\x13\x47\xf9\x09\xa5\x44\xb7\x65\x9f\x6f\xe0\xb2\x28\x12\x36\xf6\x01\xd2\x69\x36\x4f\x66\x91\x8a\x30\xee\xad\x6d\x5e\x9a\xe7\xf6\x62\x8f\xb1\x1c\x0a\x64\x84\xf5\x92\xa3\xa8\xe8\x5d\x95\xa7\xc6\x77\x9c\xab\xf3\xee\x7c\x9c\xa1\x1b\x49\xf8\x59\x12\xc7\xd9\xa0\x18\x8a\x3a\xf4\x2d\x1c\x3e\x29\x24\xcf\xaf\x29\x89\xf6\x8f\xbb\xc7\xa4\xd3\xbe\xc9\xff\x9e\xad\x4a\x19\x01\xc7\x80\x09\xbc\xdd\xe6\xe9\xe3\xa2\x2e\xd4\x35\xc2\x72\xff\xf7\x7f\xa4\x3c\x41\xb3\x98\x19\x94\x2d\x7b\x38\xef\xc2\xa2\x78\xf1\x9e\x16\xe6\x99\x8c\x31\x89\x62\xbf\x2e\x03\xf3\x7d\x77\xb3\xfc\xa9\x33\x96\x32\x14\x93\xdd\x54\xa7\xb1\xcf\x31\xcd\x98\x15\xd4\x29\x63\x1f\x8e\xc5\x80\x53\x5b\x3e\x0b\xe7\x0a\x23\xe5\xad\xc3\xa3\x3c\xcf\x7d\xe6\x3f\x79\xad\x5c\xba\xb5\x14\xe5\xba\x1e\xbf\x3e\xf8\xf4\xd6\x7e\xfb\xe7\x7d\xb8\x0d\x11\x01\xe2\x17\x1d\xa9\x6f\x59\x11\x79\x3a\x20\x32\x41\xb3\xd8\x23\xff\x7f\x2f\xad\x40\x33\xc1\xb9\x76\x16\x99\xed\x53\xf9\x45\xd6\x5d\x7f\x0f\xd1\x56\x96\x50\x07\xcc\x09\xb1\xf4\xd5\x6a\xd7\x1f\xe2\x80\x99\x84\x67\x79\x94\x57\x20\x27\xa5\xfc\x2c\xc9\xd2\x90\x96\x7e\x84\x8f\x6e\xfc\xdf\xc3\x0f\xf8\x64\x0b\x92\x25\x32\x0e\xeb\xd9\x38\x11\x3d\x6f\xa5\xf5\x40\xb3\xbb\x95\x45\xa1\x46\x26\xdd\xcb\xcb\x55\x96\x58\xaa\x1c\x52\xde\x69\x2c\x48\x27\x35\x3a\x83\xef\xfd\xb3\x81\x97\xb2\x0c\xa3\x92\xa0\xa4\xd1\xc0\x48\x57\x66\xd6\x94\x47\xa9\xcf\xa3\xc9\x7e\x2f\x9b\x65\x34\x52\xb2\xd7\x90\xcb\x0f\xa7\xc3\x90\xb3\xc8\xb2\x24\xb6\xbd\x42\xd3\xd2\xdc\x34\xbb\x9b\x2c\x8b\x63\x97\x80\x45\x63\xd7\xbd\x0c\xce\xa9\x34\xcb\x6c\x46\xed\x90\xe6\x35\xb7\x43\x81\x3b\x93\x91\xa3\x33\xf8\x6d\xbb\x83\x4c\x4f\x40\xf8\x99\xd4\xde\x0d\xe4\x74\x7e\xa8\xca\xd3\x18\x62\x36\xbb\x07\x69\x2d\xf6\x0e\xcc\x44\xf8\xda\x87\xd3\x4c\xac\x96\x28\xa7\x43\x59\x61\x76\x1e\x15\xbb\x74\xf1\x4b\xb7\xec\x34\x10\x1c\x61\xc2\x0a\x94\xa9\xd8\xe9\xc7\x34\xd0\x7e\x71\x86\xa6\x88\xde\xdc\xce\x0d\xb4\x69\xa6\x32\x12\xf4\x3a\x76\x68\x8f\xff\x02\xdd\xb8\x69\x9e\xa1\xf6\xea\xbe\xee\x0f\x50\x3b\x62\x5d\xb8\x82\x91\x96\x0c\xa0\x39\x88\x27\x2f\x9f\x45\xe1\x9f\xc5\x15\x28\x33\x4a\xe1\xee\x34\xd7\x55\x99\xeb\x31\xed\x8f\x66\xc6\x3a\x1f\x78\xdd\xa3\x69\x66\xa0\x9b\x0c\x24\x75\x2e\x33\xad\xac\xdb\x6f\x15\x3a\x23\x82\x3c\xcc\x1e\xcc\xda\x04\x85\xfa\x6f\x1f\xc2\xd4\x20\xa3\x44\xe0\xa7\x7c\xcd\xed\x45\xf2\xa9\x6f\x92\xe0\x42\x86\xc5\x27\x14\xe4\x18\xdf\x9c\x24\xa9\x48\x7a\x78\xd6\xbe\x96\xba\xd7\x9b\xa2\x92\x48\x2a\x3d\xcc\x6d\xcd\x6e\xc3\xfe\x39\xd8\x0e\xd6\x5d\xc7\xb9\xd4\x7f\xec\x7e\xe6\x50\xcd\x7f\x41\xf3\x38\xb7\x1b\xfd\xd5\x3f\xf3\x6a\xd5\xaf\xf0\x4d\x92\x58\xa7\xed\x74\x07\xed\x83\x2c\x73\x0b\x4d\x5b\x5d\x9d\x7b\x63\x97\xe5\x51\xed\x7f\x1b\xa7\x09\x6e\xc1\x67\xe6\x5b\x9f\x2d\x80\x41\xef\x7a\x1c\xde\x49\x9a\xc4\xc2\xe5\xaf\xab\xe3\x7f\x9d\xe0\x04\x23\x35\x18\xdf\x84\x11\x8b\x68\x7d\x03\x8d\x86\xb2\xfd\x57\x78\xad\xcc\xc6\xa8\x17\xf1\x11\x92\x58\x4f\x47\x40\x31\x92\x59\x6e\x45\x72\x12\x3b\x0c\xa9\x7c\x07\x23\xf3\xe2\x7c\x71\x5c\x62\x1d\xb9\xaa\xa5\x2e\xf2\xbf\x01\x05\x08\x9c\x7b\xe5\xa4\x7f\x49\xc1\x9d\x10\x9d\x93\x3f\x09\x0e\x5e\xb3\xdb\x15\x69\x86\xb7\xfb\x2a\x0f\xf0\x14\x38\x3d\x52\x48\x83\xba\x6e\x68\xea\xbe\xc2\x4a\x83\xd3\x6b\x5e\x4e\xba\x4b\xa1\x5c\x59\xff\x28\xcf\x83\x77\xf6\xf2\xdc\x21\x13\x95\x44\xce\xa6\xa0\xeb\x4e\x65\x65\x20\xa4\xa4\xc3\xd5\xb3\x28\x43\xf1\xb9\xe7\x97\xcd\xfa\x66\xff\xb2\xda\xdd\xec\x77\x5f\x36\x2f\xa1\x92\x26\x25\xcb\x78\x3a\xf2\x93\x43\xa2\xf8\x64\x2a\x93\x32\x73\x34\x74\xa7\xe6\xda\xb3\x4e\xa4\x22\x31\xd6\x7c\x82\x83\x51\xff\x77\x93\x40\x3c\xd2\xa8\x0b\x62\xd6\xcb\x28\x60\xa9\x19\xc3\x9d\xf2\x01\xe7\x92\xbc\x7c\x9d\x08\xaf\x75\xc7\x25\x92\x5b\xd1\xbb\xd6\xab\x06\xf5\xd7\xd2\x59\x8a\x95\x92\x90\x9e\xd9\x5f\xe7\xd6\x42\x17\x13\xef\xa5\x2b\x00\xed\x2b\xbb\x97\x98\x85\xda\xb7\xd5\xfe\x20\xcb\xf3\xe7\x08\x2e\x09\x51\x8a\xf1\xca\xcd\xee\x71\xbc\x12\x4b\xe0\xb1\xf0\xca\x92\x6b\xa8\xbb\xc7\xd1\x63\x97\xf4\xff\x57\xff\x4e\x87\xf1\x85\x4a\x3c\x95\x20\x62\x9c\xe6\xf6\x58\xe4\x9e\x7e\x26\xf0\x5e\x0e\x3e\xa4\x6d\x6e\xab\xba\xd7\x51\xe9\x5f\xb6\xa5\x9a\x45\x01\x1d\x33\x06\x90\x4d\xce\xa5\x22\x22\xd3\x81\xef\xb6\x5b\x3d\x75\x7d\x03\xca\xd6\xf9\xd6\x5f\x14\xc5\x7f\x2b\x1c\x46\x15\x61\x1a\x51\x91\x2d\x56\xa4\xa7\x03\x47\xc5\x54\xe1\x5d\x69\xdc\xd0\xc2\xe9\x50\xb8\x64\xf7\x63\xbf\xb6\xa8\x58\x33\xd4\xae\xf2\x22\x41\xb9\xaa\x65\x3d\x1b\xcd\x2a\x36\x09\x56\x07\x9a\xfc\xb5\xbc\x95\xba\x37\x8a\xf4\x87\xbb\xe5\x5e\x06\x32\xa7\xaf\x8b\x7f\xa2\x9e\x4f\x15\xd5\x29\x0e\xf8\x23\xe8\x3e\xf3\xa5\x58\x04\xca\xeb\x90\x9a\xbc\xbd\xf9\x0f\x5a\x83\x5c\x76\xa7\xd0\x3a\x91\xa8\xf3\xd4\xcf\x52\x7b\x69\xcc\x79\xac\x23\x31\x4c\xf9\x8a\x65\x24\x75\xf0\x54\x2f\xe0\x3d\x3b\x57\xe6\x08\x22\x57\xa7\xda\xed\xe0\x7d\x3e\x78\x92\xe9\xfe\x07\x21\xbd\xe2\xde\x32\xba\x81\x5e\x65\xfa\x16\x60\xa4\x08\x34\xbd\x2e\xb7\x8e\x6e\x5c\x05\xda\x90\xff\xbb\x88\x24\xa5\xa3\x71\x37\xec\x29\xd2\xe5\xe5\x46\x09\xc1\x11\x97\x76\x1c\xfb\x5a\x12\x3e\xa3\x8b\xa9\x94\x6a\xa2\x83\x17\xe2\x9d\x5c\x96\xe9\xa0\x2a\x55\x0e\x8f\x82\x18\x2a\xe4\x64\xf4\xc9\xe9\xd0\x42\xa7\x98\xf4\xc0\xa2\x33\xc6\xcd\x24\x0a\x20\x31\x95\x41\x86\x59\x34\xb4\x88\xa5\xb3\x67\x96\x54\x66\x49\xc8\xd8\x83\x3c\x38\x29\x91\x85\xfc\xaa\x92\x52\x58\x36\x18\x60\x57\x47\x28\x83\x9c\xab\x6f\x61\xb8\x65\xf1\x44\x84\xc3\x55\x7c\x67\x97\x34\x1e\x7f\xdd\xad\x85\x23\xf6\x9e\x82\xcc\x20\x8e\xe0\x58\x48\x3d\x58\x9f\xce\x53\x59\x0a\x94\x46\xe0\xa9\x0b\xaa\xb7\x50\x14\x88\xac\xbb\xad\xea\x55\xfb\x56\x40\xbb\x6c\xf5\x83\xbf\x43\xbb\x94\x7d\x3d\xe4\x16\x94\x25\x5a\x79\x09\x20\x79\xbe\x0e\x9e\x0a\x18\x1f\xf7\x4d\x98\x88\xb2\xbe\xdc\xb5\x83\xc3\xb1\x18\x28\x0d\xae\x8d\x8e\xd2\x04\xa1\x73\x9b\x52\x3b\x86\x05\xd4\xf4\x8f\x70\xcc\x18\x84\x56\xdf\x57\xaf\x8f\xf0\x31\x32\x16\x5f\xec\x3a\x9a\x44\x29\x63\x83\xf6\xd3\x3d\x58\x94\x2b\xc0\x9c\xc1\x8b\x1c\x95\x0e\x34\x49\x34\xf7\x48\x00\x9f\x04\x5c\x04\x40\x6a\x62\x63\x5c\x73\x4e\x65\xa1\xc2\x6f\x63\xe2\x14\xce\x42\x2c\xb0\x31\xf1\x31\xa4\xac\x66\xd9\x71\x1d\xa7\x26\xf0\x25\x9d\x30\x93\x9b\x3e\x6f\xab\xfa\xf6\x74\x59\x23\xd7\x71\x0a\x41\x35\x15\xbb\x51\xc8\x68\x0f\xf2\x8e\x54\x53\x65\xbc\xfc\x2b\xce\x2b\xbe\x14\xfd\xe9\x52\xa5\x99\x76\xce\x33\x07\xf9\x0e\x1e\xc0\x50\xcd\xaf\xcb\xb4\xc6\x34\x11\x42\x8d\x2e\x04\x4e\x96\x07\xaa\xe6\xc4\x39\xe4\xb4\x6f\xd0\xe0\xb6\xfd\x75\xe8\x90\x9a\x0b\x97\xb9\xc4\x60\x0a\x3f\x40\xd3\x1f\xca\x9c\x65\x30\x02\x98\x17\xd5\x0b\xa8\xe6\x40\x47\x36\x7e\x57\x2f\xab\xd9\x0d\x8b\xd4\x62\x2e\x6f\xb5\x19\x89\x63\x51\x1d\xc0\xb4\xb2\x46\x84\xd1\xd7\xb2\xa9\x8a\x5f\xf9\x8a\x52\x9d\x70\x30\xbe\x23\xdc\xc9\x16\x3e\xe4\xf9\x6a\x76\xa9\xc4\x24\x8e\x5a\x7e\x3a\xf8\x1d\xa8\x3c\xf7\x61\x93\x4e\xac\xd3\x0b\xf4\x28\x2a\xa4\x15\xb0\x31\x8e\x42\xa7\xc4\x89\xe5\xae\x6a\x95\xb7\x17\x5f\xbc\xdb\x89\xc6\x7e\x23\x6a\xab\x7a\x96\x34\xd4\x32\x15\x48\x20\xda\x77\x61\x57\x2d\xd5\xb3\x13\x3d\x93\xd3\x69\x41\xab\xd8\xa2\x7e\xff\xe6\x71\xb3\xdb\xac\xee\xf7\xdb\x9b\x9b\xeb\xfd\xed\xea\xe5\x61\xf3\x78\x37\x45\xf1\x68\xad\x63\x04\x97\xed\xa3\x9f\x1e\x2c\xbb\xee\xc5\x5f\xba\xa3\xa9\xf2\x51\x1e\x2e\xb1\x43\xa8\xd7\xf7\x3f\x6d\xb4\x76\xb1\x76\x2b\xf3\xa2\x79\xb2\xdf\xf3\xd2\x54\x1f\xe1\xb0\xe1\x40\xdc\x61\x75\x7a\x0d\xee\x96\xf0\x26\x47\x42\x15\xd3\x7b\x37\x8a\x93\x64\x1c\x99\xb5\xd5\x3e\x9a\x3d\x1f\x08\x67\x18\x61\xaa\x97\xea\x54\x40\x3b\xb2\x77\xfe\x75\x4d\xa1\xef\x50\x90\x4a\x07\x37\x76\xf6\xe6\xcf\x4f\xb3\xef\x60\xa5\x33\x7f\x39\x95\x0b\x02\x2c\x54\x5b\x65\x3c\x9e\xe0\x47\xf5\x3e\xb2\xb7\x9e\xb5\xd2\xdc\x0e\xd3\xeb\xa3\x3c\xc0\x0b\x74\x73\x9d\x6e\x61\x22\xf5\x4c\x0d\xe1\x8e\xd7\xb1\x7d\x93\xa6\xfa\x18\x87\x90\x26\x66\x71\xd0\xec\x77\x18\xc9\xe7\xaa\x9e\x2d\x03\x86\xd9\x8c\x89\x50\x11\x8f\x02\x29\xca\x1f\x0c\xe3\x52\x23\x08\xfb\xd2\xa6\x90\x1a\x1e\x5b\xd4\x90\x7b\x3a\x42\xe9\x47\xd0\xe4\x16\x38\x4d\x91\x8b\x83\xa4\x11\x2b\x35\x2c\xb8\x14\x0e\x92\x4c\xd4\x88\xd8\x69\x9f\xc9\xc3\xa6\x1f\x8b\x46\x08\x97\x30\xf7\x78\x84\x6e\xb5\x6a\xfa\x63\x89\xc5\x31\xd5\x05\x3a\x7e\xe2\xdd\x55\x77\xc3\xbe\x67\x79\xb0\x9a\x84\xc7\xd9\x90\x6a\xc1\x95\xa0\x9b\xdf\xaf\xa4\x7e\x87\x91\x5c\xf6\x3c\xec\x5c\xec\x77\x26\xe5\xb1\x97\x36\x3e\xb5\xa6\xfa\x28\x47\xf5\xad\xfe\x3e\xd3\x34\x32\x1e\x3e\xf8\x1c\x6c\x3e\xbb\x06\xeb\x81\xee\x36\x8f\xe6\x4c\x2a\x33\xac\x8f\xb4\x6f\x70\x5d\x95\xef\x70\xfe\x73\xa0\x02\x9b\x54\x49\xd4\xbe\xe8\xa2\x3c\x4c\x08\x7f\x96\x0c\x9b\x74\x2c\x93\x02\x4b\xc7\x65\xe3\x31\xc9\x62\x29\x7a\x33\x92\x19\xcc\xf1\xac\x8e\x55\x51\xa0\x3f\xc6\x72\x32\x77\x31\xa6\x35\x2a\x12\x78\xb9\xdd\xd3\x6e\x75\xbf\xfd\xb2\x1a\x48\x6b\x46\x11\x57\x44\x91\xc6\x3c\x57\xcd\x27\xa9\x2a\xa3\x52\x40\x6c\xc6\x97\x87\xf5\xa4\x63\x29\x15\x27\x8e\x4e\xf3\x43\x16\xb9\xb9\x14\x92\xa7\x46\x69\x8e\xb5\x60\x57\x74\xfc\xd7\xd3\xcb\xc5\xe6\xe9\x34\xe0\x37\x8d\xb2\x96\x79\x08\xd4\x1e\xfd\x2b\x50\xae\x62\x9f\x97\xfb\x66\xbc\x03\xf1\xad\x75\x94\x38\x95\x16\xc7\x37\x19\x21\x43\xc2\x0d\x6a\xd0\x08\x59\x5a\x57\x87\xa3\x2c\x3d\xab\xe6\x1f\x78\xd5\x52\x63\x12\x29\x7d\xa5\xf6\x4a\x96\xef\x8f\x23\xa3\x71\xdf\x02\x04\x18\x31\x04\x5f\x5d\x10\x3d\x6c\x92\x0d\xc8\x58\xba\x82\x74\x89\xd2\x76\x37\x3f\x75\x71\x32\xfd\xb4\x6b\x6c\xe2\x00\xa7\x57\xd7\xf2\x3c\x79\xa7\x36\x31\xb1\xc7\xc1\xb8\xa9\xcb\x95\xee\xc6\xd8\x12\x63\x8d\x43\x4e\xe5\x8d\x17\x7b\xbc\x3d\xf5\x09\x4c\x63\x81\x5b\x84\x49\xf8\x3f\x40\x44\x35\x7a\xf4\x7e\x39\x1d\x64\x79\xf3\xb2\x8e\x63\xfa\x0f\x61\x10\x10\x09\x90\xde\x06\x60\xd8\x2a\xfc\x63\x39\xd4\x70\x92\x84\xa6\x41\x42\xb6\xfa\xd1\xed\x39\x7c\x72\xa3\xdb\x55\x8e\x1e\x0b\x88\xd7\xf6\x97\xa8\x2c\x3c\x82\x49\x03\xc9\x24\xce\x60\x0f\xab\xc7\xd5\xdd\x0d\xea\xfb\xdf\x3f\xad\xff\xbc\xb9\xf6\x8e\x23\x7d\x3b\xa5\x30\xeb\x61\xe0\x3f\x27\x38\xc1\xa6\x7c\xed\x69\x00\x10\x93\x0c\xd4\x04\x43\xf6\x99\x4b\x1e\x85\x98\x0b\x17\xe7\xc9\x03\x6c\xcc\xdd\x5c\xba\x91\x42\x2c\x23\xdc\x90\xff\xbb\xca\xcb\xb1\x87\xde\xf2\x80\x07\x2a\x9c\xb6\xaf\xad\x4e\xb5\x37\xef\x9b\xa9\xd2\x51\x60\xa9\x41\xd1\x84\x7d\x73\x6c\x7f\x2f\xb6\x36\x3d\x3f\xcb\x34\x0f\x04\xb1\x2e\xc8\xc4\x98\x62\x31\xb9\x1f\x7e\x00\x60\x1c\x28\xb0\x7b\xf8\x85\x29\x07\xb8\x56\x68\xaa\x81\x3b\xc0\x95\x31\x6b\x98\x89\xdf\x40\x92\x2a\x9c\x15\x94\x37\x5b\x4c\x07\x67\xc6\x34\x34\xb1\x14\x03\xb8\xcd\xfa\x09\x35\x62\xfd\x9f\x53\x42\x64\x2f\xdb\xe8\xd2\xa1\xa7\x63\x7f\x90\x2a\xb7\xf7\x91\xe7\xb1\xd4\x2b\x85\xd4\x28\x35\xe1\x9e\x74\xaf\x70\x4a\x13\x99\xf5\xbc\x2c\x73\xaa\x1f\xbd\x09\xd3\xd7\x12\x15\x08\xc0\xec\x76\xb3\x87\x91\x91\x40\x94\xe4\x51\xea\x77\xf9\x0a\x37\x3f\x51\xf4\x69\xf2\x46\x24\x27\x68\xd2\xfb\x70\xb3\xfd\x32\xeb\x0e\x2a\x71\x76\x16\xda\xcd\x33\x63\x11\x4a\x3c\x18\x34\xa8\xb6\x5d\x54\x64\xae\xa1\xd1\x75\x7e\xbc\xcc\x24\x82\x8e\xc4\xe0\x6e\xb1\x6d\xa5\x1e\x13\x2e\x40\x47\x4e\x30\xb3\x79\xab\x3e\x9e\xa1\x3a\x16\xb0\x29\x31\x83\xda\x37\x90\xce\x5d\xee\x42\x38\x6a\x76\x19\x63\xa3\x98\x86\xd4\xf5\x77\xc8\x5f\x40\x8f\xa1\x9c\x00\x86\x62\x14\xfd\x9f\x13\xd4\xe7\xc7\xf9\x3c\x31\xee\x47\x00\x1a\xcb\x3a\xd0\xbe\x8d\x9c\x85\xa8\x8d\x14\x49\xd9\xf8\x5b\x3d\xc8\x9f\x0b\x13\xb4\x8d\x94\xc2\x0c\xff\xde\x83\x96\xb7\xef\x79\x51\xb8\x6a\xd7\x34\x1c\x9c\x3c\x80\x25\xc4\x20\xe1\x67\x0b\x6d\xcf\xac\x7f\xae\xf3\xb2\x5b\xd0\x8b\x29\xa7\x2a\xfc\x22\x26\x13\xc5\x9e\xe6\x7e\x8c\x42\xb1\x24\xb6\x88\xb7\xc3\x64\xed\xad\xeb\x96\x4b\xa8\xbd\xae\xa1\x17\xd6\x5a\xf0\x0d\x98\x07\x0f\x96\x74\x43\xa0\xaf\xe4\x05\x41\xd4\x65\xfc\xaf\x8d\x65\x8a\x38\xba\xbe\x04\xbc\x0e\x2f\xaf\xbf\xcd\x6e\x26\xb7\x03\x2c\xf0\xae\x1a\xcf\x9f\x96\x53\x27\x93\x79\xef\x0c\xe5\xae\x2e\xaa\x61\xa1\x5d\x62\x4d\xe2\xc3\xb5\x6b\x38\x54\x7a\x39\xbd\x60\xb9\x62\xc2\xc5\x67\x76\x7b\x6e\xba\xf0\x26\x1c\xe8\x26\xb4\xee\x04\xa7\xb2\x1b\x2f\xeb\x42\x36\x8d\xa3\xe1\x4f\x1f\x5f\x88\x38\xd0\xed\x77\xd5\x91\x90\x7d\x1c\x79\x9f\x80\x30\xeb\x59\xa1\x1d\x28\xa9\x57\x5e\x2f\x8a\xea\x03\xcc\x1c\xc5\x61\x85\xc9\x70\x3d\xc6\x40\x43\xb6\x18\x8d\x23\x68\xa2\x94\xc5\x64\x98\xda\x44\x46\x59\x2f\x70\x0b\xd6\xe6\x3a\xc7\x8c\x19\xba\xb8\x2d\x99\xa3\x50\x9b\x28\xe7\xb3\xf6\x8a\x60\x10\x05\xf5\x93\x7d\x7e\xab\xda\xaa\xbf\xcb\x04\x62\x7c\x63\x35\x98\xd3\x5c\xea\xc1\x66\xcc\x61\x9b\xbc\x09\x48\x2f\x78\x3a\x49\x6d\x84\xb6\xdc\x12\xaf\x43\xe4\xe5\x40\x27\xf7\x9e\xc9\x24\xed\xc7\xff\xee\xa4\xe0\xb9\x86\xa3\xcc\x67\xd4\x29\x2b\xa3\x04\x97\x78\x0b\xfa\x6d\x55\x14\xfd\x10\x98\x21\x58\xac\x8c\x23\x4c\x6b\x7b\xc7\x93\xc5\xe8\xd0\xca\x04\x10\xd7\x91\x37\xdb\xbc\xbb\x95\x35\xca\xa4\xbb\xdc\x7e\x30\x34\x09\x4d\xd3\x04\x37\x44\xbd\x0f\x97\xd9\x16\xfd\x02\x6b\x25\xb0\x98\x0f\x3e\xc5\xdd\xe4\xfc\x9b\x0c\x8f\x55\xcc\xe5\xbf\xbc\x1b\xed\xd5\xa9\x2e\x2f\xaa\x41\x56\x29\x8d\x20\xa3\xa7\xb2\xc8\x4b\xd8\x56\x3a\x97\xc5\x68\x93\xf3\xdb\x28\xc6\x2a\x1d\x23\x51\xed\x03\xf2\x97\x51\xd6\xc8\x6a\x9e\xf6\x7e\xbc\x16\xea\x4f\xb6\x81\x56\x4b\x8b\x92\x2b\x77\xa8\x0d\xf5\x37\x8c\x2a\xc2\x56\xab\x94\x3b\x0f\x79\x14\xd3\xf4\x46\x9e\xfd\x51\x4b\xa3\x5e\x36\xad\x3a\x42\xdd\x9e\x5f\xe4\xe0\xac\xdf\x35\xc8\x9c\xbe\x1c\x82\xe2\xbe\x41\x33\x13\xca\xee\x5a\x48\x2c\x74\xdc\x57\xd5\x7f\x86\x4c\x8e\x3f\x68\x04\x37\x5e\x06\xf1\x66\xf7\xe5\xe6\xe7\x11\xba\xad\xe9\x2d\x7c\x2a\x87\x11\x7e\x97\x4a\x94\x38\x5b\x5f\xad\xff\xfc\x15\xfc\xd1\x42\xc4\x11\x70\xf7\x7c\x42\x8a\xe1\x18\x17\x6e\x81\x44\x08\x8f\xca\x9b\x07\x68\xa1\x1e\x5e\x2b\x80\xa3\x81\x07\x79\xed\xaf\x13\x1b\xb4\x59\xef\xb3\x11\x49\xbd\x75\xd4\xbe\xcd\xf5\x3b\x9c\xf7\xb6\xee\x61\x5a\xd6\x12\x85\x20\x29\xaf\xae\x38\xae\x4e\xa6\xa1\x09\x57\xd8\x29\xaf\xf2\xb6\xad\x54\xcf\x1f\xb4\x36\x73\x89\x9a\x63\xb7\x46\xd4\x48\xf2\x9d\xe6\x8a\x59\x14\x69\x1a\x39\x54\x62\xb7\x02\x1e\xbb\x79\xc2\xcf\x3f\x93\x2e\xc0\x22\x92\xc6\x18\x57\xe2\xfa\xae\xdb\xdb\x5a\x4e\xcd\x21\x96\x5e\x33\x8b\x48\xa6\x65\xf7\xed\xbe\x3f\x7d\x1f\x85\xf8\x2c\x22\x20\x10\x23\x50\x60\xae\xef\xc9\x0e\x11\x71\xd3\x37\xb1\x29\x32\xc0\xa5\x31\x3e\x4b\x05\xbb\xaa\xc7\xee\xcf\x10\x55\x2c\x8a\x49\x8a\x5c\xed\xe3\x69\x26\x98\x4d\xe2\x34\x34\x91\x1a\x1d\xb0\x70\x5b\xf5\x17\xc8\xba\x57\x1a\x61\x11\xe5\x80\xef\x41\x1e\xa0\x34\x37\xb2\x2e\xce\xcf\xe3\x6c\xfd\x2f\xa8\x3a\xe1\x04\x0a\x32\x47\x58\x5f\x1d\x8f\xa1\x14\x79\xf1\x16\x59\xca\x30\xc1\xde\x3d\x42\x78\xaa\x6e\xd7\xdc\xfc\x71\x81\x6d\x18\x90\x0f\xb3\x5a\x18\x8b\x38\x33\xb8\x9d\xd1\xb2\x79\xab\x4e\xfd\xb7\x14\xd2\x29\x7a\x39\x86\xf9\x85\xaf\x35\x8b\x84\x8e\x12\x97\x83\x1c\x65\xfc\x58\x94\x50\x27\x2d\x1c\x16\xa0\x6e\x63\xf0\x9c\x4f\xe7\x78\x16\xa5\xd4\xb9\x6a\x48\x63\x06\x0f\xc8\xb9\xce\x3f\x8b\x52\x41\x5d\x1c\x18\xa4\x11\x66\xea\x5b\x5d\x0b\x46\x3d\x8c\xc5\x4d\xf2\xf9\x01\x9a\x56\x1e\x8e\x34\xee\x9b\x78\x81\xae\x1d\xc8\x43\x17\xa5\xe4\xe5\xab\xd3\xff\x27\xe9\x43\x85\x1c\xbc\xd0\x50\xab\xcc\xf4\x13\xee\x66\xfd\x74\x29\x44\xc4\x22\x29\x15\x76\xb6\xfd\x9b\x6c\x1e\x2f\xdf\x8a\x4a\x9c\xef\x9d\xe7\x84\x3a\xe5\xf6\xc5\x70\x9a\x45\x4a\x3b\x4a\xe0\xe3\xd3\xe3\xfe\x79\xf5\xd7\xea\xea\xfe\x66\x92\x8d\x64\x91\x8e\xb4\xf4\x22\x04\x0f\xf2\x67\x7e\x38\x1d\x70\x91\xf3\xda\x85\xf9\xec\xd6\x74\xd7\xcf\x71\xf6\x3f\x95\x7d\x6a\x6d\xdb\x56\x97\xc0\xa4\xf0\x03\x6b\x71\xdd\xeb\xb6\x39\xe8\x62\x00\xe6\x6a\x9e\xe9\x9f\xfd\xc4\x24\xd6\xa1\x2c\xb1\x64\xe1\x93\x57\xcb\xb9\x16\x4f\xff\x19\xff\x13\x06\x8f\x01\x89\x08\xe3\xf5\xd3\xc3\xd5\xe6\xf1\xe6\x7a\xff\xfd\x66\xb3\xbf\x7b\x5a\xdd\x87\x07\x87\x58\xe0\x44\x3e\xb1\x71\x1d\xb2\x78\x2c\x82\x24\xb5\x8e\xf1\x53\xfd\x1b\xf4\x8c\x11\xca\x22\x50\xce\xe3\xdf\x6d\x4e\xef\x73\x0d\x65\x03\x3b\xa8\x0f\xcd\xa2\x56\x27\x23\x51\x64\xbc\x51\x09\x9a\x17\xa1\xff\xe2\xae\x96\x61\xfa\x63\x24\x22\x22\xe4\xba\x56\x3d\x53\xd9\x2d\x71\xf3\xe9\x83\x44\x19\x47\x49\xd5\xbc\x27\x65\xfc\x4e\x4f\x69\x79\x1e\x20\x51\x06\xdc\x5f\x74\x97\xe7\x87\x3f\xcf\x0a\xea\xbb\x6a\xa9\x16\xc3\x48\x1c\x09\xc6\x43\x5f\xe9\xe6\x0b\xaf\x71\xbb\x24\x98\xcf\x48\x4c\x13\x0c\xb2\x1c\xf7\x2d\x0b\x4f\x19\x33\x86\x69\x96\x5b\x00\x33\x77\x72\x1d\xad\x64\x8c\xc4\x1c\x90\xdc\xd4\x63\xf1\xbc\x89\xfa\xae\x7a\xbc\x5d\xf7\x67\x13\x10\x0d\x0c\x94\x50\x6b\x9d\x9c\x87\x46\xb1\x1e\x89\x09\x10\xb7\xd9\x08\x8e\x5a\xe9\xec\x2b\xd1\x58\x23\x60\x65\xae\xca\xf2\x79\xc5\x9c\x11\x1c\x17\x6e\x22\xeb\xe6\xa2\x2e\x28\x98\xcb\x71\x31\xc2\x48\xe4\x74\xca\xe4\xcf\x9b\xdd\x97\xcb\x9d\x15\x23\x22\x02\x1d\x60\x81\xa1\xe6\xdd\xdb\xde\x84\x36\xa9\x43\xb8\xb7\x5d\xdc\xea\x91\xf9\xb3\x0b\x25\x56\x62\x9e\xea\xb5\x7a\x46\x4f\x8f\xf0\xd3\x54\x3b\x7b\x52\xdd\x57\x14\x96\x07\x20\x49\x8d\xa6\x4e\x5f\xe8\xb6\xaa\x4c\x33\xd1\x22\x63\x24\x23\x56\x0c\x29\x76\x7c\x8e\xaa\xe8\xdd\xf9\x18\xc9\x44\x84\x92\x9b\x5b\xbf\xa5\x71\x09\x81\x4f\xf8\x0a\xe1\x37\x3a\x4b\xfb\xec\xc2\x68\x0c\x12\x49\x62\xe5\xe7\xcb\x3f\xf3\xd6\x8b\xec\xcc\xa7\x8f\xe9\xb9\x14\xd3\x26\x1d\x65\x6a\x6f\xab\xfa\x05\xf5\xf2\x69\x38\xa9\x92\x16\xd9\xa2\x87\xbd\x33\x63\x70\xfa\x8d\xb3\xa5\x8f\x98\x48\x62\x95\xa5\x1b\x61\x7b\x23\xcf\x05\x0a\xee\x4c\xdf\x14\x08\x8d\x95\x3d\x05\x6d\x0f\x54\x67\x04\x54\xe2\x35\x14\xb0\x37\x8e\x5c\x39\x9a\xf9\xef\xad\xd4\x83\x6e\xe1\x6d\x0e\x85\x69\xa6\xb9\xba\x74\xf6\x6d\x2c\x4d\x10\xd6\xfc\x56\x7d\x3c\xf4\xe9\xd1\x55\xdd\xcd\xc5\x0e\xfb\x58\xd5\x0f\xe1\x46\x62\x92\xc5\x11\x73\xb4\x07\x74\xc8\x74\xad\xbb\xd1\xda\xb7\x00\x9d\x3a\xb8\xf1\x50\x83\x62\x71\xcc\x32\xed\x95\xcb\x5d\xe5\xd6\x91\xde\x4d\x7f\x3c\x8b\x13\x73\x31\xe8\x26\x37\x1a\xc7\xca\xb9\x83\xbf\xc8\xbc\xf8\x7b\x1c\x4b\xc5\x94\xf0\x44\x05\x97\xd9\xf2\x17\xd9\x20\x16\xb3\x54\xf2\xa1\x66\x74\x5d\xcb\x8f\xb9\x8d\x25\x8b\x59\xe6\xf2\x62\x07\x59\x9e\x64\x71\x75\x3a\x2f\x2c\xa9\x31\x53\x2c\x98\xa3\xfa\x05\x05\xfd\x1f\x26\x5f\x3c\x66\x36\x43\xb5\xab\xcd\xc3\xcd\xe6\x21\xdc\xad\x48\x23\xbc\x85\x23\x2e\xb3\xbb\x0a\xe7\xe3\x4d\xe3\xd1\x95\x7d\xab\x0c\x4c\x36\x0b\x49\x16\x8b\xb7\x61\xce\x88\x85\x64\x41\xdc\x7d\x0b\x45\x91\x97\xaf\xe3\x6a\x84\x6f\x94\x44\x46\xb9\xc9\xb9\xb0\x28\x14\x7b\xd2\xed\x78\xb3\xc1\xe2\x94\x18\xed\x01\xbf\x9e\xf9\x7d\x0a\xfb\x67\x34\xda\x72\xd1\x33\xce\xb3\xf3\xad\x2d\x8b\x53\x6d\x53\x2f\x6a\x50\xfd\x18\x04\x4c\x7f\x0f\x12\x62\x71\x96\x44\xb1\x67\x54\x6d\xcc\xcf\x2b\xd9\xea\xb7\xab\x73\x17\x5e\x95\x7d\xda\x3d\x8e\xc2\x6a\x15\x67\x69\x1a\xf2\xc9\xf7\xd5\x6b\xb5\x38\xdf\xc7\x52\x30\x24\x91\x5c\xef\x5e\xc2\xf4\x1e\x4b\x6d\x33\xe3\x89\x3b\xd7\xdb\xab\xcd\xe7\x2c\x06\x16\xab\x10\xc9\xbd\x81\x7e\x07\xb3\xcf\xfb\x1e\xa7\x52\x40\x86\xa4\xd3\xf7\x7f\x90\x75\x17\xa0\x2d\x56\x35\x66\x32\x18\x2c\x56\x9a\x26\x7e\x27\x89\xf4\xe8\x75\x85\x2f\xd4\x19\x32\x4d\xdf\xa6\xb2\x4e\x4f\xd5\x8b\x90\x86\x6a\x55\xd9\xae\xe5\x71\x97\x43\x1d\xcf\x3e\xae\x26\x09\xe2\x59\x07\xd7\xef\xb1\x94\x16\x8b\x35\xe3\x28\x6a\xf6\xf2\x74\xb5\x09\xe5\x1f\x16\x43\xe4\xaa\x10\x47\xe7\xc0\xe4\xc4\xfb\xbb\x69\xf3\xff\x4a\xfd\x7e\xac\xda\xd9\x5a\x3c\x7b\x47\x96\x38\x99\x2a\x53\x57\xc7\x10\xcf\xcf\x63\x8b\xd8\x5a\x37\xe9\x96\xa7\xc3\x73\x55\x04\xd8\x00\xa3\x51\x94\x72\x1f\x2a\xe2\x77\xf0\xab\x4f\x38\xca\x00\x10\xf9\xfb\x56\x57\xe5\xa9\xff\x11\x21\xae\x08\xd9\x8e\x69\x23\x61\xaf\xd2\x6c\xca\x75\x79\xee\x9b\xd2\x28\x75\xfc\x9c\x1f\xeb\x93\x8f\x30\xfa\x63\x49\x14\xf9\x7d\xf3\x71\x3c\xbe\xa7\xcf\x47\x49\x42\x30\x23\x1f\xca\xf0\x37\xab\x97\xfb\xbf\xae\x36\x2f\xd7\x7b\xa7\x97\x1c\x4e\x17\x13\x85\x84\xc4\x22\x47\x1d\xcd\x43\x5e\x4e\x57\x39\x1a\x67\x02\x4b\x45\xd7\x20\x8b\x35\x4e\x73\xd2\xf1\x97\x65\xf3\x89\xc3\xe0\x34\x0c\x9d\xf7\x6e\x4a\xa5\xc6\x37\xef\x79\xee\x93\x51\x4c\xa9\x71\xbc\x19\x94\x7b\xef\x79\xb6\x78\xc5\x7d\x5b\xed\xf5\x59\x17\x70\x0d\xdf\xf2\x30\xb3\x53\xc6\xdc\x58\xd1\x6f\xb2\x7e\x85\x87\xaa\x84\xfe\x2d\x32\xae\x50\xac\xdc\x85\xcf\x2e\xcc\xfc\xef\xea\xa0\x72\xd8\xff\xf7\xd3\xd5\xfe\xb5\x2a\xcc\x51\x0e\x9f\x8d\xe9\x34\x32\x5e\x2a\xb8\x44\x8f\xe2\x3f\xa6\xf8\x15\x46\x39\xe3\x0a\x7a\x29\xf9\x52\x63\xa7\x99\xbe\x77\x9e\x32\xcc\x3a\x14\xd5\x6b\x2f\x5d\x0f\x97\x88\xbd\xd9\xd7\xe2\x0a\x42\xed\xf0\x5e\x36\xed\xad\xac\x0f\xa3\x4c\x70\x1a\x5a\x19\x07\x1c\x78\xed\x22\x54\x7f\x65\xe2\x3e\x3c\x11\xd3\x96\x96\x60\xed\xc2\x8f\x68\xb4\xc0\x59\x9c\xbe\xa8\x50\x06\x83\x94\x6e\xc4\x9d\x1f\xf4\xba\xfb\x50\x13\x89\x43\x46\x93\x28\x25\x41\x0b\x42\xd7\xb9\xfa\xac\xcb\x25\xca\xe9\xda\xb5\xf9\x27\xb2\x09\x8c\xa6\x5c\x63\x56\x56\x36\x4d\xfe\x5a\x06\x04\xf4\x74\xfa\xa0\xa9\x88\x22\xe6\xd7\xba\x12\x8a\x66\xdb\x23\x8e\x18\xcd\x18\x08\xef\x31\xfe\xcd\x65\x53\x87\xb0\x91\x66\xd6\x7d\x41\xa9\xb5\x53\xb4\x02\x33\x10\xeb\xa6\x37\x22\x13\x9b\x04\xf5\xab\x3f\x1f\x71\xa1\x7c\x0c\xc0\x11\x46\xa5\x8c\x8c\xab\x0d\x37\x50\x5f\xcc\x20\xcb\xfb\x07\x2a\x4d\xe2\x80\x21\x32\x2f\xce\xdd\xeb\x1c\x34\x7a\x18\x55\x44\x22\xfa\xac\x39\x42\x69\x1e\xab\x5e\xc6\x8f\x51\xc5\x1c\x05\x42\x1a\xb3\xae\x0e\x17\x41\x3b\x55\x46\xe0\x00\xcd\x5b\x38\xf8\xca\xce\xf4\xba\x5a\x49\xcc\x65\x39\xdb\x64\xd9\xb6\x05\x0c\x85\x17\x46\xb5\x55\xe8\x16\xfc\xc3\xa9\xf5\x61\x18\xf3\x3c\x66\x42\x32\x0a\x9e\x65\xd1\x85\xdb\x27\x93\xb7\x61\xb1\xfc\x5a\xcf\x76\xbd\x14\x52\x13\x3b\x15\xcb\x0f\x0c\xa4\x3c\x5a\xd5\x77\x2a\x12\x3a\x95\xd5\x16\x25\xf0\x6f\x9e\xb6\x77\xa3\x8f\x67\xad\x08\x6e\x8a\xbb\xbc\x3d\x15\x32\xaf\x61\xbf\xae\x0e\xc7\x16\xf6\xde\x76\x83\xb1\x48\x51\x5c\xe9\xaf\xbe\xfe\xb5\xdf\x3c\xae\x5f\x6e\x56\xdb\x9b\xfe\x98\x21\xc2\xab\xc4\xf4\x98\xff\x49\xdf\x61\x84\x2a\x04\xa2\xcb\xbc\xee\x66\xf6\xe9\x5c\xc6\x88\x4d\xb3\xc1\x67\xfa\x7b\xde\x96\x17\x5b\x3b\x16\x93\x04\x09\x21\x0e\x83\xd9\x05\x37\x21\xb9\xc1\xe2\xcc\x41\x1f\xdc\x94\x75\x55\x9d\x5e\xdf\x7e\x6d\x79\xd1\xfd\x84\x27\x3e\x3a\x78\x39\x95\x3d\x72\x79\x66\xce\xe6\x1b\xd3\x98\xe2\xea\xfc\x73\x50\xad\x63\x8c\x5a\x57\x7e\xfd\xfa\x6d\x73\xbd\xb9\xfd\x6b\x64\xab\xcd\x18\x53\x34\x23\x13\x41\x61\x07\x76\xf6\x87\x05\xb7\x92\x0f\xc6\xfd\xe0\xc0\x42\xb3\xe7\x15\x22\x43\xd2\xba\x37\x1b\x0a\x01\x07\x4b\x22\x27\xb2\xf2\xb5\x31\x6b\x79\x74\x79\xd0\x65\x1b\x78\xc6\x92\x24\xf2\xfb\xa4\xc3\xd1\xbf\x9c\x7e\xdc\x85\x26\x3a\xc2\xd5\xba\x95\xef\xb0\xba\x3b\x41\x33\xeb\xc6\x2c\xd1\x0c\x1f\x1e\x61\xd2\xe3\xf9\x87\xa5\x29\x89\x9d\xa6\x14\x22\x67\xbd\xcf\xde\xec\x31\xd2\x8c\xa0\xf8\xdd\xea\x6a\xb7\x46\x5f\x8c\xf0\xeb\x8c\xc4\xf8\xcd\x03\x4c\xfb\xb1\xfa\x21\x87\x63\x94\x2a\xbf\xb3\xf9\xaf\x53\xd5\xc2\x44\x62\xb3\x3b\xce\x85\x08\xf3\x3d\xfc\xc0\xe8\xe2\x7b\x5e\x96\x50\x8f\xd8\x34\x8c\x65\x2a\x92\x03\x5f\xe1\xe1\xeb\xfd\x6e\xf3\x7c\xbf\xb9\x79\xd9\x6f\xd6\x4f\xbc\x6f\x64\x12\xb4\x2c\x0b\x9b\xf8\x87\xfe\x88\x32\x80\xe5\xa1\xfb\xb7\xe6\x9f\x55\x05\x18\xd3\x14\x8c\x47\x1c\xef\xde\x6a\x68\xde\xaa\xc2\x6c\x51\xac\x63\x2b\x2d\xb8\x3c\xc3\xec\xfd\x6a\x16\x3b\x6b\x90\x6e\x09\x9d\xc0\xb4\x18\xd3\x89\xc1\xb2\x93\x0b\xd8\x42\x7a\xe1\x82\x8b\xfe\x0b\x6a\x0e\x63\x86\xa6\x88\xfb\xfb\x91\xc3\xc7\xfe\x15\xda\xfd\x9d\xcc\xfb\x75\x9d\x19\xe1\x42\xb8\x8f\xc1\xb6\xe6\x41\xce\xe2\x46\x66\x94\x73\x50\x78\x01\x7d\xaa\xbb\x4b\xcd\x15\x44\x7e\x05\x24\x60\x0c\x92\x04\xb1\xeb\xff\xae\xf2\xd2\x19\xc3\x85\xab\x43\x9a\x61\x6a\xef\x6b\xef\x41\x39\x12\x5e\x99\x3e\x06\x48\x81\x6c\xbc\x9b\xb8\xff\x3e\x60\x23\x67\x47\x52\xe7\xe6\x15\xfc\xb2\x53\xd5\xcd\xc8\x92\x88\xf1\x88\x13\x13\x84\xcc\xc3\xfc\xd9\x3c\x56\xed\x63\x8f\x6e\x61\x3c\x52\x24\xf6\xf3\xac\xab\xb2\xdf\xf7\x3b\x69\x0f\xf8\x67\x9c\x24\xd4\xab\x62\x97\xed\x97\x6a\xfa\x0d\xbb\x4b\x90\x50\x44\x5f\x15\xc5\x88\x42\xcd\x78\x4c\x1d\xab\xa4\xa8\xaa\xf7\xd3\xf1\x92\x85\x37\x91\x03\x1c\x50\xfc\x8c\x53\x9a\x04\x5d\x87\x9b\xf6\xed\x25\x94\x3b\xfa\x3b\xa2\x29\xc1\x64\x8c\xdb\x33\x7c\x1b\xab\xea\x8d\xfb\x24\xa7\x59\x82\x69\xe6\x53\x03\x8f\x50\x95\x0f\xb2\x56\x05\xcc\x66\x57\x4e\xa5\xd3\xba\x40\xa4\xf3\x21\xdc\x3b\xe3\x60\xd3\x50\xfb\x7f\xcd\xab\xb2\xe7\xd1\x3e\xe7\x3f\xa1\x78\xfe\x3c\xce\xe5\x4c\x08\xf4\xc9\xc7\xe4\x65\xb7\x77\x2c\x9b\x53\x8d\x94\xe8\xc9\x50\xe6\x9c\x02\xea\xf6\x3a\x50\xdf\x62\x56\x8f\x0b\xad\x30\xac\x47\x41\x9c\xf0\xc3\x24\x32\x2e\xa8\x68\xba\x58\xe0\xe6\x3f\xdc\x75\x1c\xee\x46\x05\x0f\xad\x48\x8c\xb1\xe6\xc1\xd1\x3b\xf7\x2a\xb0\x40\x18\x4f\x79\x84\xd9\xa6\x41\xd7\x7e\x79\xdb\xc6\x53\xc1\x10\xbf\x7b\x2c\xe4\xf9\x82\xaf\x32\xbd\xd3\x34\x8b\x1c\xff\xf2\x74\x5e\xed\x5e\xfa\x2b\x29\x93\xf8\xb4\xd9\x97\xe3\xac\xeb\x64\x29\xc7\x6a\x7e\x37\x9e\xaa\xba\xef\x35\x92\x13\x70\x4e\x65\x28\x24\x51\x55\x53\xc1\x7d\xc6\x65\xc2\x82\x7b\x12\xea\x23\xd5\xcd\x2a\x20\xc7\x87\x36\xca\x15\x4f\x5d\xa9\xf0\xdf\xa0\xdb\xcf\x50\x22\x8c\x2b\x21\x11\x28\xa0\x4e\xe7\x2b\xd9\xe4\x7a\x2d\x6b\xd3\xec\x1f\x1c\xfb\xf2\xd7\x8b\x29\xd7\x69\x1a\xf5\xee\x5b\x5f\x64\x33\xd4\x9e\x6e\xab\xfa\x79\xcc\x09\x5e\x7e\xc1\x86\xa7\xc2\x55\x9a\x54\x91\xeb\xf0\x3d\x9a\x00\x52\x0b\xad\xb4\x46\x29\xb3\x7d\x8e\x91\xe7\x53\x5f\xa6\xe1\x90\x08\xd5\x5b\x1f\x9e\x0c\x94\xad\xdb\x26\x4c\x22\x6a\x0e\x12\x30\x78\x44\xd3\xb1\x6f\xd5\x47\x33\x67\xda\x7f\xc2\x74\x5c\xce\xeb\x7f\xce\x99\x1c\x61\x59\x18\x07\x9d\xa2\x5d\xf7\xed\xd3\xd7\xc7\xeb\x9b\x97\xfd\xcd\xbf\xd6\x5f\x56\x8f\x77\x37\x7b\x84\x4c\x86\x07\xb0\x9c\x67\x21\x93\xb7\x1d\xe0\x70\x13\xa9\xc1\x50\x7a\xfb\xe4\x7f\x75\x13\x47\x08\x58\x44\x44\x23\x5c\x74\xdf\xa4\x4b\x1d\xa2\xd4\xe2\x9b\xac\x03\x44\x82\x89\x88\xbb\xd1\xe3\x88\xa6\x79\x75\xda\x7f\xf4\xca\x38\xa1\x89\x97\xe4\x6e\x4e\xb9\xce\x0d\x0a\xf6\x4d\xc7\xa5\x20\x91\x20\xe3\x44\xa6\xe7\xa2\xfe\xb1\x90\xa6\x10\x84\x3b\x78\x76\x2f\x25\x3f\xe7\x4c\xf5\x37\x1f\x7b\x13\x53\x97\xfa\x7c\xb2\x0b\xc1\x91\x88\x63\xd7\xb3\xab\xb2\x38\x3f\xd7\xf9\x41\xd6\xe7\x87\x61\xa7\x2f\x62\x63\x71\x50\x99\xdc\xda\xcb\x3a\xa0\x6f\x44\x95\xcb\xa3\xbb\xf0\xaa\xc8\x61\x18\x39\x82\x31\xd0\xbe\x34\xf7\x5c\x57\x87\xbc\x99\x6d\x27\x05\x4b\x9d\x49\x02\x1c\xa0\x7e\x85\x52\x9f\xf7\xa7\x1e\x04\xc0\x04\xa7\x02\x65\x33\xae\x65\x0b\x63\x59\x85\x70\x38\x85\x58\x7a\x52\x50\xbb\xc8\x2c\xff\x7f\xfc\xff\xfd\x75\x05\xcd\x30\x3a\xf1\x4a\x1f\x2b\x67\xff\x17\x0e\x6a\x8a\x34\x16\x19\xa2\x30\x91\xa4\x02\xb7\xcc\xd5\x11\xca\xde\x66\x8b\x89\xc4\x64\xda\xf6\x5a\x1c\xb3\xdc\xea\x3f\x48\x34\x88\xc4\x26\x5a\x79\x88\x76\xbf\x26\xcf\x5e\x11\x3a\x3b\xa2\xaa\xf8\xcf\xef\x55\xdd\xb4\x63\xaf\x28\x26\x32\xe2\x32\xe8\xaf\xb5\x3c\x42\x83\xa6\x6c\xe6\xa4\xe1\xaa\xea\x36\x59\x7d\x23\x91\xa2\x98\xe3\x87\xa3\x79\x62\x64\x18\x94\x71\x98\x90\x51\x86\xf0\x9c\x95\x31\xde\xe7\xab\x5d\xe4\xf7\x30\x21\xe3\x14\x77\xe2\x7b\x69\x8c\xa3\x6c\xff\xb1\x90\x55\x49\x43\x6b\x6e\x0c\x04\xc6\xd3\xd2\xcb\x19\x9e\x51\x45\x9c\xcb\xb0\x44\xae\x7b\xe1\xfb\xcf\x1a\x3b\x37\xae\x63\x5d\xfd\xcc\xc1\x4c\xaa\x33\xd3\xfb\x55\x31\x0d\x02\xd2\x5e\x94\xb3\xde\x94\x3f\xaa\x5c\x43\x73\x75\xee\xf6\x21\xa7\xe5\xac\x47\x78\x02\x25\x52\xc4\x9f\x3f\xdc\xbc\xac\xbf\xf6\xba\x3d\x4c\x00\x4f\x31\xcf\x7c\x5f\xbd\xfa\x59\xf6\x6b\xa9\x1d\x81\x75\x01\xf9\x3c\xbd\x27\x48\x69\x6c\xfa\xd5\xaa\x85\xd5\xfc\x7b\x43\x96\x86\xf4\xf7\x6d\x0d\x70\x5f\x29\xcc\xad\x8d\x03\x1e\x61\x09\x49\xb9\x1f\x36\x37\xed\x1b\x6a\x00\xd5\x13\x20\xd0\xe7\xf0\x3e\x26\xac\xe0\x41\x09\x73\x7b\x94\x1f\xa5\xdf\x34\x85\xe5\x21\x89\xac\xc5\x7c\x5a\xaf\xce\xf6\x6b\xbf\x03\x96\x10\x91\x22\xa6\xd4\x71\x2c\x37\xe5\x1a\x33\x5d\x53\x3a\x2a\x4b\x28\x73\x5c\x53\x5d\x1d\xcf\x23\x43\x91\x8b\x90\xf9\x52\x5f\x83\x25\x14\x38\xf2\x46\x65\x20\x84\x6d\x7b\x9c\x0e\x4b\xb8\xb2\xc8\xb7\x33\xf9\x0f\x92\x2e\x77\x9a\x84\x5b\x17\x34\x77\x01\x00\xae\xad\x7f\xc2\xf9\x2e\x9c\x40\x58\x82\x93\xd4\x03\x94\xa7\x28\x9d\xdd\x76\x22\x22\x08\xa9\x87\xba\xbd\x34\x5b\x61\x49\x92\xa4\x08\xe3\x06\x73\xe9\x0c\xe1\x9b\xa4\x51\x14\xf9\xcb\xdf\xe6\x65\xde\xbc\xf9\xde\x17\x0e\xa7\xd6\x11\xce\x7f\x94\x47\xa8\xc1\x63\x98\xc3\xd1\x2c\x4e\xf0\xf9\x72\xed\xcc\xda\x1e\xe4\xcf\xde\x29\x99\x25\x92\x68\xdc\x05\xd7\x32\x6f\x90\xa4\x88\x3c\x81\x50\xad\xfd\x3c\xeb\x99\x46\xe3\x2c\x3a\x11\x51\x38\x1f\x87\x2c\x1b\x5b\xeb\x77\xb7\xda\xdf\x8b\xb4\x59\xac\x7b\xc6\x7e\xfb\x50\x99\xd9\x7a\x90\x28\xef\x9a\x78\xac\xab\x2e\x8e\x9d\x43\x5d\xc2\xe2\x96\xe8\x28\x13\x66\x90\x72\x73\x90\xb6\x7e\x30\xcf\x53\x6e\x89\xc9\x12\x74\xe6\x1c\x29\xc7\xcc\xc2\x91\xe9\x6d\x18\x1d\xa1\x78\xce\xb1\x07\xd6\xdf\xec\xbe\xf8\xca\xdb\x1f\x7d\x1b\x9e\xb9\xcc\xa2\xbe\xe0\x7c\x5c\xe2\xb5\x58\x62\x8c\xc0\x44\x87\x3a\x9d\x6f\xda\xb7\xd9\x73\x43\x94\x39\x5c\xc9\xd3\x9f\x37\x8f\xe8\xf5\xd7\x5b\xfd\xb1\x04\x88\x63\x98\xdf\xe6\x3f\xcf\x13\x3d\x66\x96\x40\x9c\x60\x70\xf1\x21\xc7\xb4\xa2\xee\xef\x0a\xad\x18\x1c\x89\xca\x6d\x0a\xba\x57\x3e\x7b\x2f\xa0\x63\x9c\x65\x31\x7c\xb9\x3a\x95\x7d\x8a\x3e\x01\x70\xd8\x8c\xcd\xfa\xe9\x8b\xac\x8d\x1e\xba\x8c\x8d\x49\xd2\xbd\x9b\x9b\x02\x74\x5b\xf7\xd9\xc9\xc4\x32\x89\xf8\xc8\xa6\xad\x8e\x68\x23\x73\x3e\xba\xef\x96\x86\x06\xa9\xc4\x85\xc4\xb1\x33\x27\xb3\x46\x1a\x45\x31\xd1\x63\x70\xce\x35\x48\x53\xe4\xc1\x34\x84\xa5\x11\x67\xcc\x0f\xa4\xf5\xea\x69\xcc\x8c\x67\x29\x89\x39\x4a\x29\xa1\x25\x07\x22\x77\xc6\xe6\xec\x2c\x25\x3c\x41\x00\x47\xb0\xf1\x59\x56\x23\x63\x69\x4c\x04\x0a\x6e\x1d\xe4\x3b\xac\xe5\x0c\xad\x35\x45\xe9\xb3\x94\x26\x19\xe2\xb9\xaf\x76\xeb\x30\xb5\xa7\xd4\x58\x5f\xa3\x7b\xfa\x01\xb5\x1d\xd9\xcc\x4e\xfb\x57\xca\x08\x47\x90\xf7\xd5\xa9\x45\x5e\x60\x38\x01\x33\x1a\x0d\xae\x5c\xb7\x0e\xfe\x5a\xcf\x75\xf5\x23\x1f\xd1\x77\xe6\x27\xb3\x76\x52\xad\x59\xbb\xc2\x03\xa6\x67\x87\x7d\x70\xca\x55\x16\xe9\x1e\xcf\x29\x0b\xb7\x5c\x87\x2b\x0b\x02\x18\x3a\xcb\x00\x2e\x1d\xc1\x02\x43\x93\x4c\x60\xae\x2f\x6f\xae\x03\x73\x3a\xaf\xca\xeb\x99\xfc\x17\x4b\x85\x61\x48\x0d\xde\xa3\xea\x81\x59\x30\x8b\xe8\xa2\x3e\x86\x35\xa4\xb0\x48\x3c\xd7\xb0\xcd\x5f\xcb\x90\xb6\xf8\x47\xea\xd3\xa3\xb3\xa9\x04\x81\x5b\x0f\x79\x01\x4d\x5b\x95\xb0\xbf\x92\xe5\xbb\x47\xea\x78\xaf\xef\xf1\x58\x4c\xbb\xaf\xe7\x7d\x5e\xf7\x35\xfc\x1b\xa1\x99\xe1\x4d\xa4\xdc\x71\x87\x5e\x83\x81\x66\xd6\x1f\x01\x27\x7c\x88\xdb\xf8\xd6\xb3\xfe\x2f\x41\xdc\x2c\x95\x11\x75\x69\x64\x8f\x16\xbf\xad\xea\xbf\xd0\x2e\x35\x9c\x49\xc6\x84\x46\x83\xc6\xd1\xba\xdb\xf0\x35\xde\xa9\xc3\x0f\x97\x54\xd1\x14\xc9\x46\xd6\xf9\x96\xaf\xe5\xf1\x05\xa4\x7e\x1b\x6e\x54\xa5\x02\x06\x41\x08\x9f\x14\x9b\xde\x88\x8e\x24\xcd\x82\x15\xcf\x3d\xd8\x65\x99\x58\x96\x1a\x43\x70\x74\xad\xab\xa6\xdb\xfa\x59\xbb\x34\xf5\x0f\xcd\x81\x32\x64\x70\xca\x53\x5b\x1d\x64\x9b\xeb\x3e\x49\x17\xee\x0d\xac\xa2\x21\xcd\xf3\x74\x9a\x7f\x7d\x1b\xb9\x64\x29\x8a\xc3\x57\xc5\x2d\xb9\x8d\xff\x98\xa5\x6d\x52\x4b\x18\x6e\xf6\xbd\x86\x9f\x9b\x34\x5c\x62\x3f\x5c\xc4\x0a\x83\x9b\x87\xa7\x12\xae\xea\xea\xae\xa8\x54\x10\xe9\x63\xa9\x95\xe0\x85\x9d\x37\xc1\x87\x86\x65\x51\xa4\xb0\xf2\xd2\x67\xe9\x66\xa0\xd3\x2c\x32\x3c\x4b\xb1\x41\xf0\x70\x6f\x02\xde\x22\x34\x21\x8a\x39\xef\x73\x39\xf0\x02\x2f\xa8\xe0\x2c\x8b\x63\x9a\xb0\x7e\xb0\x78\xfd\x9a\x70\x8c\x29\x84\xe8\xdb\xbc\x34\x2b\x0c\xfd\x77\x6f\xe0\xf2\xae\x7d\x93\x2c\x46\xc2\x3f\x1c\x72\x17\xe9\xf5\x05\x7e\xcc\x75\xcf\x76\x90\x59\x2c\x65\xa6\x27\x80\xa2\xc7\x5c\xbf\x97\x17\x90\xc2\x8c\xb2\x08\xab\xdc\xeb\xaa\x3e\x56\xb5\x6c\xe1\x11\x3e\x9a\xdf\x27\x64\x33\xca\x00\x81\x4f\xd7\xf2\x78\xf4\xa9\xf8\x0b\x81\xfa\xff\x33\xbb\x94\x8c\x04\xf4\xe6\x6e\xf7\xd5\x54\xd4\x24\xbc\x39\xfa\xbf\x8b\x1e\xc5\x2c\x63\x24\x43\x96\xca\xde\xcd\x85\xf8\x5b\xc4\x7f\xca\xba\xcd\x2f\xa3\xd5\x8b\xdf\x27\x32\xc5\xbd\xcd\xcd\x76\xcc\x8b\x64\x59\x9a\x58\xe9\x41\x9e\x8f\x95\x81\x97\xfc\xf5\xad\x5d\xbf\xe5\xc5\x54\x4e\x80\x65\xa9\x4d\xd0\xaa\xac\x8b\x90\x65\x21\xfb\x4c\x5b\x96\x71\x8a\x1d\x73\xf7\x06\xb7\x55\x55\xbc\xc8\x7a\x52\x4e\xcc\x32\xa5\xd1\x3b\xe5\x0e\x4a\xb7\x18\x21\x1e\xfe\x6b\x03\xf5\xe6\x7a\xb6\x27\xca\x32\x00\x9c\xb8\xca\x60\xc4\xf7\xf9\x17\x90\x09\xa5\xc9\x80\xb6\x76\x68\xab\x39\xc9\x65\xf6\x09\x64\xa2\xd5\xc8\xb2\xd7\x31\xe6\x77\xd5\x28\xab\xc3\x42\x4b\x69\xd1\x81\xc0\xe7\xf7\x1c\x61\x24\x1c\x53\x19\x76\xe5\x2f\xb2\x59\xc8\x21\x64\x12\xc2\xea\x8b\x4f\x7b\x94\x4d\xe3\xdc\x35\xe6\x51\x58\xa6\x54\x6c\xc6\x38\xbf\x2d\xd4\x3f\x72\x0d\x03\xa0\x2a\xd3\x96\xa7\x9e\xf2\x8a\x96\x16\xb3\x13\x98\xc8\xe0\xf2\xb8\xfb\xd6\xc3\xed\xe7\x23\xd8\x10\x81\xd8\x8c\x2b\x6b\xaf\xab\xea\x30\xf9\x32\x26\x8b\x51\xce\xe1\x28\xeb\xc6\x7d\x9a\x2f\x20\x4d\xb0\x09\xf0\x8d\x80\x1a\x44\xef\x6d\x65\xf9\x7a\x6a\x26\xbf\x07\xa1\x90\x3e\xff\x20\xdf\xe1\xea\x74\x76\x94\xda\xdf\x30\xa0\x67\x5f\x04\x32\x41\xa4\x0b\xab\xf6\xcf\x2f\x37\xfb\xed\xea\x3e\x64\xaf\x32\x9b\x31\xe5\xed\x33\x1f\x64\xab\xdf\x1c\xf4\x64\xb4\x24\xc8\x88\x30\xec\xd3\x55\x89\x76\xb7\x63\x8b\xd9\xd0\xc2\x8a\x68\x8c\x98\x0e\xd0\x8f\x5e\x82\x09\xbf\xec\x18\xd4\x3d\x4b\x1b\x49\x42\x8c\x75\xab\xfc\x61\x8c\xcb\x90\xc4\x72\x57\x6c\x2b\x64\xee\x5e\x6b\x73\xa9\x1f\xca\x64\x6c\x23\xc4\x72\x56\x93\x97\xb3\xb8\x6c\xcb\xd8\x72\x2c\x0c\x3d\x54\x5d\x18\x11\xf4\xe4\x99\xa4\x4c\x3b\x9f\x61\xd9\xc0\xc3\xf3\xd8\xe8\x80\x49\x9a\xc4\x08\xe6\x95\xc6\x8c\x55\x92\x17\x97\x35\xc9\xe2\x0c\xf3\x77\x0e\x21\x71\xfd\x5e\x38\x16\x8d\x27\xd0\x2c\xc7\x66\x92\x51\x97\x6a\x5c\x57\xa7\xba\x59\xf2\x60\x1e\x35\xcd\x12\xcc\x68\x77\x91\xf5\xc8\x05\xee\xe6\x5f\x5f\x96\x43\xc7\x30\xb9\x48\xc1\x44\x26\x7b\xee\x59\xf7\xf3\x90\xf3\x5b\x7e\x10\xc1\x9c\x5f\x86\xc3\xe1\x91\x3f\x66\x47\x53\x91\x45\xa3\x71\x15\xce\xf5\x8f\x82\x27\x29\xa4\x48\xe5\x10\x8b\xec\x40\x1e\x42\xda\xb4\x4f\x9a\xfa\xa6\x89\x72\xd2\x8c\x6b\x59\xce\x95\x9e\x98\x4c\x23\x2d\x7c\x62\xe0\x2a\xac\xb8\x32\xa5\x62\x84\x21\x7d\x96\x4d\xf3\x51\xd5\x4b\xda\xd8\x4c\x76\x5b\xb4\xa4\x8f\x7d\xfd\x32\xd6\xcd\xf8\x41\x7b\x6c\x71\x8e\x93\x99\xca\xdc\xce\x41\x1e\xbf\xdf\x6c\xc2\x75\x33\x93\x20\x1f\xd4\x55\x35\x50\xd5\x7c\xc2\x18\x65\x52\xc5\x1a\x27\xa3\xee\xc3\xec\xdb\x6a\xaf\xf2\x20\x60\x48\x66\x2f\x48\x53\x0a\x4e\x7c\x27\x24\x5d\x67\x4f\xae\x8d\x0c\xb6\xc7\x3d\x37\x4b\xd6\xed\x55\x1e\x82\x06\x69\x84\x45\x53\x21\xa7\x03\x99\xab\x02\xae\xe1\x50\xf5\x47\x53\x48\x5d\x9a\xb5\xc1\x27\x75\xf5\x20\x7f\x10\x14\xb3\xd1\x48\xa7\xe6\xf3\x8c\x95\xb4\x52\x26\xbd\x02\x8e\x86\xfc\xd8\x2e\xc5\xde\xd2\x2a\x1e\x0f\xe2\x6e\xfd\x16\x40\x5a\x43\x30\xe0\xf4\xfa\x2a\x5f\xbb\x1f\x8d\xa7\x46\x15\x09\x82\xe5\xf8\xb5\x3c\x1c\x65\xfe\x5a\xce\x3f\xcc\xe4\x32\x2a\x4a\x0d\x23\x83\xab\x75\xbc\x6f\x5c\x80\x1f\x0e\x43\x14\x7c\xea\x51\xcc\xde\x3b\x5e\x5d\xc2\xfd\xfd\xe4\xa7\x88\xd5\xb8\x23\x75\xde\x30\x1f\xe5\x58\xfe\x93\xa9\x18\x38\xe2\x07\x8b\xea\x03\xea\xc9\x97\x56\x94\xbb\x1c\xa8\x27\xb2\x21\x83\x14\x71\x35\xf3\xd5\x33\xb4\x17\x8e\x60\x6e\xa0\x9f\x92\x14\x55\x31\x8d\x07\xb0\x78\x65\xed\xc4\xe2\x95\x29\x46\x19\xce\x7b\x56\xe6\xc5\xf7\xbc\x7d\xf3\xf8\xb1\xc9\x8d\x30\x91\x22\x94\x72\x2b\x4b\x36\x5b\xb7\x14\x33\x14\xb1\x23\x06\x5a\xa8\x0f\x79\x09\x77\x95\x2c\xb6\xba\x42\xd6\x9f\xac\xcd\xc6\x2c\x33\x71\xa6\xef\x5c\x44\x19\xf5\x3d\xf1\xa5\x2a\x8a\xaf\xa8\x7b\xb4\x38\xec\x55\x42\x39\x4a\x2b\xf9\x67\x27\x21\x5d\xad\x12\x91\xc6\xac\x9f\x6b\x7a\x0f\xba\x70\x34\x13\xc8\xb6\xca\x1b\x97\xea\x9f\xbd\xbb\x24\x73\x71\x3f\x54\xcd\xd5\x6a\x7b\xf3\xc9\xb5\x53\x2a\xd1\xd7\xd6\x62\x36\x6b\xfd\x26\x0f\xc7\xbc\x2a\x07\x91\x2d\xa6\x52\x23\x70\xb5\x59\x39\x9c\xcb\xec\x2a\x59\x9a\xa5\x49\x8f\x53\xd3\x17\xb2\xb7\x0b\xd3\x8b\xca\x24\xc3\x33\x76\x2b\xee\x7e\xbb\xbb\x09\xd9\x15\x25\x63\x81\x9b\x99\x43\xbe\x50\x89\x5f\xaa\x04\x2b\x99\x30\xde\x67\x4d\x90\x60\x1b\xce\xa5\x53\xe7\xdb\x55\x83\x34\xfb\xa0\xaa\xb6\x97\xed\x3e\xef\xd7\xf2\xe1\x2d\x68\x93\x05\xd7\xa0\x2d\x48\xf4\xf1\x0a\x4c\xc4\x0b\x7d\x95\xc9\xf2\xa1\x34\x58\x4c\x4d\x7b\x88\xe1\x30\xa8\x0c\x95\x31\xfa\x03\xe5\x50\xbf\xc8\xbc\x3c\xc8\x77\xa8\x03\xb5\x79\x31\x2d\xaf\x8c\xb4\x98\x0d\xd6\x50\xb6\xcd\xa6\x7c\xee\xee\xb8\x37\x6b\x65\x0a\x98\x63\x66\xdd\x43\x69\xea\x3f\x3e\x97\x5b\xee\x5a\x12\x84\x27\xfc\x59\x9f\x8f\x6d\x75\x3c\xf7\x21\xda\xc3\x05\x73\x41\x75\x83\x95\x78\x85\xd7\xe7\xaa\x2a\xfa\xab\x49\x47\x48\xf8\xf3\x65\xbd\xb0\xaf\x56\x56\x58\x64\xeb\x1f\x30\x93\x89\x48\x05\xff\x4b\x1d\x91\x0c\x37\xc3\x65\x85\xd9\x4f\xfc\x75\x4f\x1c\x0c\xdf\x47\x13\xa6\x3c\x0d\xb6\x28\xae\xa1\x6c\xa5\xae\xf2\xb2\x59\xbd\xca\xbc\x6c\x9c\x0a\xd3\xf4\x1b\xe9\x98\x25\xa8\x38\x7c\x90\x79\xe9\x1c\xc0\x47\x9e\x1d\x4c\x53\xc6\x10\x94\xb0\xef\x57\x06\xef\xe7\x3c\xee\x2f\x9a\x82\x09\xe9\xe3\x2f\x55\xe1\x13\x22\x33\xbe\x87\x66\x00\x59\x20\xaf\xe4\x3f\xe0\x39\x70\x77\x99\xe6\x9a\xe2\x8b\x1d\x43\xce\x77\xd5\x66\xbd\x7a\x76\x13\x0d\x06\x76\x97\x83\x60\xa9\x66\xa4\x05\xe1\xa8\x03\xfa\x9a\xff\x80\x3f\xf3\xf2\xd5\x8c\xd0\xeb\xbf\x88\x74\xb4\x60\x92\xf8\x1c\xd3\xea\x78\x5c\x5e\x8a\xb5\x48\x5c\x38\x84\xb6\x3c\xb2\x7d\xfb\xcc\x9a\x87\x69\x21\x33\xeb\xbb\xfe\xed\xea\x6a\xa5\xc7\x12\x30\x8b\x1c\x23\x2d\xac\x40\xf6\xd2\xf3\xea\xaf\xa7\xaf\xbb\xfd\x6e\xf3\x10\xe2\x66\x9d\x28\xcb\x7c\x56\x19\x3f\xce\x48\x9b\xfd\xd2\x23\x92\xe9\x94\x3a\xab\xac\x57\x68\xbd\xb2\xf3\xd5\x79\x82\xf2\x9e\xdd\x6b\x6a\xb8\x43\xad\x41\x59\xbd\xd6\xd2\x7e\x1a\x57\xf5\xed\x2d\xee\x61\x5a\x68\xda\x07\x38\x54\xf5\x79\x53\xb6\xf0\x5a\xe7\xed\x19\xf3\x3c\x94\xb8\xfa\x85\x6f\x9e\x65\x4a\x98\x50\xa6\x75\xf2\x37\xab\xbc\xbe\xee\x26\x3d\xdf\x42\x0a\x0e\xde\x4a\xdd\x21\x4a\xbb\xa5\xeb\x7c\x5c\xb2\xa1\x60\x5a\x31\xa7\x81\xb0\x0f\x24\xc6\xee\x7d\x5e\xd8\x6b\x32\xad\xa4\x30\x63\x4b\x72\x94\x27\xfd\x3c\x9f\xa1\x95\xce\x30\x65\xa3\x4e\xe7\xe7\xaa\x95\xed\x0c\xba\xa3\x35\x25\x5c\x05\xbb\x55\x2c\x8b\x4e\x66\x66\xdf\xca\x28\xc5\x94\xe7\x79\x36\xa8\xd1\x1d\x1e\x12\x52\x67\x7f\x1c\x7c\x07\x6e\x03\x89\x47\x5b\x19\xa1\xb1\x0e\x96\xf7\xfe\xcc\x91\x41\xd1\x1f\xd3\x1c\x77\x0a\xdf\x57\x57\xa5\x4f\x8c\xff\x22\x05\xaf\xad\x96\x51\xd4\x53\x20\x5d\x81\xa2\x19\xef\xb0\x4c\x24\x1c\x1d\xdd\xe5\xd4\x6e\xda\xb7\x5d\x35\x78\xd1\x8d\xa3\x62\x12\xa7\xe1\xdf\xf0\x53\x29\x8d\xf3\x58\x93\xe6\xc9\x19\x17\xfb\xdb\x34\x31\x8b\x31\xe2\xd2\x01\x44\xb0\x20\x5f\xc1\x4c\x2c\xd2\xe0\x20\x74\x2d\xeb\xf7\xb2\x32\xd0\x57\x9b\xe6\x4d\x13\x8a\x41\x6f\x29\x0f\x30\xf7\xfc\x62\x86\x51\x2b\xbc\xb7\xc8\xca\xda\xbc\xc8\x65\x0b\x5b\x68\x2f\x02\x57\xc3\x44\x1a\xe4\xe9\x1f\xce\x08\x98\xb8\x82\xdf\x74\x6f\xc3\x12\x83\x15\xad\x6b\x79\xbe\x96\xc3\x24\x7f\x81\x94\x9f\x5d\x49\x13\x14\xe4\xde\x03\xda\xab\x6c\x4a\xeb\x60\xf6\xae\x54\xf5\x99\x0f\xd3\xe7\xa3\xd8\x70\x93\xb1\xf1\x46\x77\x55\x9a\xfb\x05\x72\xea\xec\xe6\x45\x14\x21\x6b\x60\x9d\xa3\x50\xd7\xcd\xcb\x3a\x8e\x48\x1a\x89\x38\xfb\x45\xfd\x66\x7e\x0e\x22\x69\x00\xa9\xdd\x3e\xa3\xce\xc5\x10\x28\x1a\x11\x5b\x87\x4c\xcf\x4b\x83\x08\x19\xa7\xb5\xdc\x9e\xaf\xce\x2f\xf0\x7a\x2a\x10\x0f\xfe\x79\x98\x62\x84\x72\x4a\x43\xb5\xb7\x5b\xbe\xc1\xb5\xbb\xdf\x0e\x98\x44\x3b\x63\x66\x07\xf1\xfd\xba\x29\xdb\xd4\x25\x6b\x26\x11\x82\x49\x40\x92\xa0\xeb\x14\x92\xe2\x4d\x88\x39\x17\x03\x01\x93\x46\x11\xb2\x6a\xde\x64\x13\x8a\x2f\xcf\xce\x1b\x78\x7a\xea\x94\x5a\x24\xa4\xdf\x41\x7b\x5f\xc9\x72\x63\x30\x2b\x57\xd5\xad\xad\x8a\xbc\x5a\x9e\xf0\x4d\xda\xcb\xc9\xd9\x53\x69\x7a\x71\x90\x4f\x50\x60\xb3\x1f\x67\x34\x43\x9d\xe2\xdd\xcd\xea\x61\xff\x7c\xf3\xb2\xbe\x79\xdc\xad\xee\xc2\xfc\x6f\x32\x05\xb8\xa6\xa9\xdc\xac\xd7\x8b\x22\x97\xcc\xc8\x04\x68\x1a\x84\x47\x8a\xaa\xee\x5d\xcb\x99\x91\x59\x2c\x93\x7e\xc8\x23\x0d\x7b\xf2\x45\xa4\x66\x98\xc7\xbc\x3d\xe9\xf7\x6e\x0b\x13\x7e\xa7\x12\x22\x69\xaf\x37\x0a\x35\x80\x27\xc9\xf6\x0d\x52\x83\x53\xda\xbe\x84\x9f\xed\x73\xd5\xee\xe4\x2c\x02\x34\x9a\x44\xb1\x07\x9f\xe1\x40\x68\x3f\xaa\x79\x8b\x58\x61\xcd\x6c\xdf\xc8\x1f\x30\x51\x8e\xfa\x95\xe0\xf3\xe8\xf7\x06\xb2\x61\x53\xed\x72\x6a\xe3\xc4\x9f\x31\x8c\x62\x6f\x2e\x64\xd3\xae\x65\x51\x3c\x7f\xdd\x86\x72\x96\x31\x19\xcf\xc8\x68\x4e\x1e\x82\x97\x59\xd7\xb1\x69\x82\x70\xbd\xed\xf3\x66\x77\x33\xfc\xde\xaa\x9e\xd3\x79\xb3\xfb\xb2\xdc\xeb\xac\xb2\x10\x08\x63\xc7\x0b\xce\x1f\x44\x4a\x20\xe8\x72\x7f\x06\x59\xef\xde\x6a\x80\xb1\x7e\x13\x03\x12\xc9\x2c\x1a\xdd\x62\xd3\x1f\x20\x31\x27\x7d\xa9\x79\xb0\xfb\xbd\xbf\x24\x77\x02\xf1\x3d\x00\x8b\xf4\xa8\x1c\x3a\x52\x6d\x09\x6d\x94\x23\x54\x80\xaf\xc9\x3d\x85\x7e\x00\x31\x65\x08\xa8\xcf\x7d\xa7\xde\x76\x71\x45\xd3\xe6\x4e\x8e\x1e\x13\x70\x4d\xfe\xba\x54\x9e\x81\xd8\x70\x9c\x15\xfb\x65\x7d\x0a\x4e\x04\x4a\x9d\x8d\xfd\xea\xf1\xeb\xe3\x5f\xab\xfe\xaf\x89\xc4\x9a\xef\xb1\x06\x9b\xff\x04\xf3\x65\x24\xf8\x19\x9a\x48\xe7\x28\x52\x95\x6e\xa9\x19\xe9\x3f\x31\x60\xdc\xbd\x53\xe9\xf0\x3a\x7f\x5f\xf0\xc2\x80\xe9\x1e\xe3\xb1\xcb\x0f\xb8\x4e\x6f\x41\x57\xa5\x69\x7a\x81\xf2\xd9\x05\x99\xa1\xc8\xf5\x76\x56\x54\xf3\xc4\x40\xaf\x3d\x76\x31\x31\x00\x33\x0e\xb7\xb9\xea\xbe\xea\x6d\x55\x0f\x52\xee\x79\xbf\x7d\xfe\xd5\x74\x0c\x3c\x4e\x10\x3f\xb1\x79\xb8\xbe\x19\xfb\x66\x4c\x56\xe9\xf9\x72\xd6\xfd\x7d\x3c\xc8\x41\x44\x80\x9a\xda\xb9\xae\xf6\xc7\xba\x3a\x54\x7b\x87\x18\x5d\x8e\x09\xa1\x0b\x87\xbd\xae\xee\xab\x33\x0d\xef\x65\xdd\xd3\xd0\x24\x71\x25\x5e\x04\x43\x1f\x02\x1f\xee\xe9\x08\xe5\xb6\x85\x63\xff\x89\x05\x38\x66\x14\x86\x24\x79\x59\x42\xd8\x18\x4c\x26\x21\x48\xa2\x08\xcb\xb3\xba\xa8\x4a\x98\x68\x39\xfe\x3a\xbb\xd7\xfd\x10\xfa\xbd\xaa\xd7\xfc\x01\xd3\xe3\x2a\x42\x2b\x91\x0a\x15\x04\x09\x0e\x93\xc2\xd6\xb0\xe6\x42\x92\x38\xf5\xa6\x3b\x68\xfb\x65\x69\x32\xcd\x42\x92\x18\x39\x30\x23\xdd\x4e\xb0\xae\x16\xb6\x72\x90\x64\x29\xf3\xe9\x87\xd5\xeb\x45\x1e\x01\x12\xa0\x18\xa4\x3f\x6c\x1e\x77\xfb\xcd\xe3\xee\xe6\xe5\x5b\x2f\xe8\x00\x29\x75\x13\xfe\xf6\x28\xeb\x77\xb4\x76\x1c\x65\x62\x20\xe5\xae\x5c\xf1\xd7\xdd\x53\xff\x27\x99\xa0\x34\xd7\xbe\x71\x80\xd7\x26\x37\xfd\xa3\xa7\x8a\xe2\xf4\x7e\x07\xed\xaa\x79\x0f\x04\x96\x6b\xd0\xf9\xa1\xaf\x26\x42\xaa\xac\xcd\xbc\xb8\x05\x2a\x20\x36\x73\x87\x16\x06\x19\x68\xda\x3b\x6a\xbb\xfd\x67\x70\x07\xba\xad\x4e\x21\xcb\x06\x32\x76\x7a\x9d\x77\xd0\x5e\x3f\xed\x1e\x4f\x87\x17\xf8\x51\xbd\x77\x41\x61\x37\x8e\xa1\x99\xbd\x51\x45\x08\x6a\x1a\x5c\x57\xaf\xaf\xe7\xc9\x73\x2a\x19\x45\x3d\xbe\xf3\xad\x2a\x4c\x9f\xab\x07\x65\x22\x64\x09\x3d\x9e\x4a\x68\x76\x88\xd8\xcf\x87\xdf\x19\x40\x3e\x32\x26\x87\xf6\xed\x1b\xec\xbf\x54\x7d\x4d\x15\x34\x4b\xf1\xac\x2e\x39\x88\x17\x8c\xa3\xbe\x82\x0a\xda\x48\xeb\xd8\x5c\x3f\x90\x83\x3c\xa2\xe3\x80\x06\x8d\x18\x96\x53\x13\x10\x44\xdd\x78\xdc\xd8\x95\xab\x58\x5d\x20\xf2\x3e\xe9\xb1\x86\x65\xd2\x09\xff\x3c\x57\x1f\x50\x9f\x2e\x94\x5c\xc0\x46\x89\x77\x77\x19\x24\x43\x71\xf6\x0f\x77\x62\x81\x61\x09\x5f\x49\xfd\xbe\x7d\xcf\xcb\xee\xf1\xc7\x6c\x06\xb0\x96\x20\x95\xfc\x43\x16\xa7\x31\xb7\xd5\x46\x82\x27\x43\xc5\x60\x55\x14\x13\xfa\xa6\x8d\x52\x67\x2f\x39\x64\x62\xe7\x52\x71\xcc\x92\x48\xd3\xde\x4e\xd3\x47\xa7\xf8\x3a\xfa\x4c\xab\x25\x99\xa5\x49\x7f\x15\x67\x8d\x33\xfd\xee\x96\xa8\x08\x05\x15\xf7\x7b\x5b\x54\x55\x0d\xe6\xbe\x7a\x25\xd1\x7e\xea\x4a\xde\x35\x73\xf4\x46\x7b\x94\x35\x02\x86\xfb\xfd\x88\x25\xda\xdb\x3a\xa2\x17\x9d\x5e\x42\x13\x5b\x1a\xd3\xa0\xc7\x86\xae\xb0\xbb\xea\xe6\xe7\x31\xaf\x67\x5d\xdb\x52\x9e\x61\xd5\xb8\xf7\x9b\x77\xd5\xf8\xfe\xb5\x70\x96\x26\xbd\xd3\xcf\x77\x80\x77\x5c\xa9\xc3\xd1\x94\x67\xb8\x14\x7b\x45\xc9\x59\x46\xd1\xa6\xa9\xc6\xb2\xd7\xae\x9a\x40\x98\x6c\xc6\xe2\x98\x84\x5c\x66\xd5\xce\xde\x4f\xa6\xb3\x10\x3a\xed\x7b\xa3\xdc\xbd\x1a\xab\x64\xcc\x43\x23\xff\x4b\x19\x6b\x0c\x89\x5c\xf6\x0e\xca\xb6\x59\xcf\xd2\x68\x56\x42\x82\xfb\xa2\x37\x28\x8a\x6a\xf6\x79\x55\xec\xf2\x88\x7b\x24\x34\x62\x89\x68\xa1\x7c\x3e\xd0\x56\x17\x82\x7c\xab\x58\x8c\x89\xfa\x1e\x23\xf9\xc5\x0d\xdf\xa5\xf5\xd2\xff\x44\xa7\x11\xe6\x3f\xca\xd3\xeb\xeb\x9c\xfb\x64\x0d\x49\x70\xfa\xc6\xa9\x07\x33\x78\xbb\x8f\x6a\x86\xa0\xb2\x86\xb3\xc4\x8d\xab\x55\x58\xf8\xcd\x6c\xa1\x0e\x2d\x13\x87\x91\x75\x60\x34\x84\xdc\xaf\x76\x9b\xa7\xc7\xfd\x80\x49\xb3\x46\x2a\x04\x9a\x1e\x73\xfd\xbe\xae\xca\xa6\x72\xfb\x39\x14\x61\x9b\xa3\xf5\xac\x01\x82\xc6\xa9\x83\x3a\xa8\xae\x6a\x67\x87\xb2\x03\x79\x18\xe5\xb6\x67\x4f\x6d\x40\xa3\x6e\x81\xb3\xba\x90\xe5\xbc\xef\x00\x77\xe2\x04\x1f\x90\x0f\xa0\x46\x0b\x52\xe1\x62\x79\x73\xc8\xdb\xfd\x93\xb5\xfa\x4d\xe6\xa5\xc7\x10\xdf\x16\x72\x39\x3b\x34\x5a\xe8\x2c\x80\xf3\x42\xf8\x56\xfd\x84\xe2\x5f\xe1\xb4\x36\x06\xef\x78\x55\x63\x95\x0c\x7b\xeb\x24\x1c\xb5\x96\x51\x44\x9a\x7e\xed\x8d\xb2\x1f\x73\xfd\x3e\x96\x76\x9a\x75\x46\xab\x19\x6a\xd2\x63\x39\x3f\x07\xb7\x6e\x34\xb3\xee\xb0\xb8\xa5\xb6\x56\x2b\x6e\xc2\x96\xc6\x13\xb2\x1e\xf2\x32\xbf\x90\xd7\xe2\x51\x14\x49\xe4\xe0\xee\xf2\xb6\x80\x4f\xa8\x8e\xcb\x4c\x8c\xf1\xe7\xe0\x51\x14\x53\x84\xea\xfe\x77\x5e\x14\xd5\x07\xa6\x97\xf0\xdd\x2e\x7e\x3d\x1e\x45\xd4\x50\xe7\x0b\x5e\x74\x1f\xbd\x96\x45\x3f\x1f\x62\x6d\x01\xa6\xda\xa7\x3c\x8a\x12\x70\xe7\x97\xef\xd2\xef\xa8\x79\x14\x99\x8c\x64\x61\x93\x54\xd7\x58\xdf\x99\xfe\x8c\x10\xc0\x9c\xd7\x43\xf5\x23\xff\x55\xc1\x96\x47\x71\x9c\x21\x21\xb2\x84\x8f\x75\x33\x7b\x49\x31\xa7\x99\x08\x8a\x5d\x0e\x70\xe7\xd9\x0c\xeb\x4f\x85\x4b\xba\xee\x47\x11\x7c\x7e\x90\x3f\xfb\xa4\xc6\xe0\x0a\xca\x23\x9a\xc6\x48\x08\xeb\x96\x40\x49\x67\x23\x83\x47\x54\x0a\x9c\xfc\x6e\x5e\xd6\x49\x4c\xf0\xeb\x0f\x04\x0c\x1e\x51\xe5\xca\x20\x8e\x3f\x81\xb0\xbd\xdf\x94\x28\x66\xb7\xc7\x33\xae\xc9\x58\x0a\xa8\xaa\x37\xd7\x8b\x72\x7f\x3c\xe2\x32\x72\x42\x5a\x85\x6c\x9a\xf3\x10\x32\xf0\x28\x21\x06\xe1\x45\xdb\xf5\xea\x65\x75\x85\x77\x49\xfa\x63\x0a\xd0\xf7\xf6\xdf\x55\x5e\x82\xe9\xf3\x41\xcd\x3d\x94\xbd\x6f\x3e\x8f\xd2\x8c\x63\x4d\x0d\x33\xa0\x98\xb8\x1f\x02\xe6\xff\x33\xfc\x97\x84\xfb\x4e\xa5\x70\x2e\x63\x55\x37\xd2\x1e\xf2\x72\x50\x66\xe4\x51\x6a\xd2\xd4\x7a\x00\xfb\x66\xfd\xb4\xe0\x05\x33\x7b\x0b\x19\x15\x48\xf2\xfa\xb7\x53\xce\x18\xe4\x8e\x79\x94\x49\x57\x86\x74\xe1\xfe\x35\x94\xd5\xa1\xdb\xb9\x85\xb5\x9a\x47\x92\x70\xdc\x20\xff\xa8\xda\xde\x85\x35\x70\xef\x96\xaf\x26\x63\x48\x7a\xb6\x5f\x73\x2a\xda\x4b\x5f\xcb\xd0\x0d\xe2\xd0\x0f\x24\x13\xb8\xd8\xc1\x21\x47\xa7\xc8\x1f\x10\x80\x5e\xfd\xb4\xc4\x23\x99\x00\x72\xcb\xc0\xb1\x5b\x9d\x4a\xae\x17\x06\x32\x3f\xf2\x66\xb8\x69\x4d\x45\x1c\x44\xc3\xd6\xb2\x36\xfd\xd7\x32\xa9\x44\xc5\xb9\x35\x86\xe6\x45\xd5\xb6\xd5\x68\xd1\xe5\x91\xc9\xa4\xed\x06\xc8\xcd\xe3\xf5\x90\x62\xe7\x91\x51\x94\x3b\x90\xbc\x79\x96\xe7\x3e\xe7\xf5\x59\xfa\xe6\x02\xfc\x30\x5f\xcf\x78\x04\x84\x21\x10\xc6\xed\x14\xfe\x02\x59\x37\xdb\xbc\xd4\x30\x71\xb5\xe1\x11\xc4\x4a\x7b\xf2\xe6\xfd\xfd\xb7\x3d\x98\xbc\xdd\xc7\xf1\x78\x6f\xc4\x23\xa0\x49\x6f\x1a\xfd\xd6\x2d\x78\x93\x9e\x04\x2c\xc1\x3a\xff\x9f\x27\x53\x8d\xfb\xb4\x8d\x01\xb1\xe8\x36\xef\xde\x66\x01\x83\x58\xdd\x74\xfd\x5e\x9a\x7c\x79\x64\x95\x88\xcd\x04\xbf\x5a\xe9\x05\xa5\xaa\xe9\x43\x93\x28\xa1\x48\x00\x46\x3b\x96\xc9\x5e\x9f\x93\x48\x31\xea\x0a\xab\x5d\xd4\xec\xc9\xf4\xe1\x20\xa1\x04\x5d\xf2\xa1\x7d\x83\x1a\xb3\x96\xfd\x11\x95\x32\x8f\x87\xd9\x1e\xa5\x86\xe6\x2d\x3f\x3a\x95\x90\x5f\x45\xd9\x9c\xd0\x94\xa2\xe8\xc5\xf3\xa9\x86\x55\x5e\xff\x33\x62\x36\x27\x54\x0b\xe2\x09\x5d\x33\xe7\xe7\xe9\x0b\x22\xd4\xa8\x54\xf8\x28\x78\xdf\x76\xe1\x20\x8e\xfa\x55\x69\x36\xce\x90\xe0\xe6\x3f\xb3\x17\xc0\x19\x37\x83\x6d\x5c\x55\x1f\xdc\xbe\x30\x1c\x05\x86\xf7\x7b\x94\x28\x3e\xf4\x74\x6a\x5f\xab\x6e\xb3\x36\x60\x80\x46\xc6\x7c\xfe\x37\x82\x71\xf0\x48\x5e\xa7\x8e\xf2\x35\x9f\xd5\x95\x38\x49\x98\xa4\x64\x62\x9a\xb5\x85\xc2\x4e\xb3\x88\xa1\x69\x62\x63\xef\xf0\xdd\xeb\x64\x2d\x7f\x67\x49\x29\x84\x25\xeb\x5c\xc8\x8f\xa6\xcf\xc1\x3e\xe4\xe5\x73\xd5\xb4\xc7\x6a\xfc\x75\xa5\x20\x88\x55\xbd\xce\x2f\x01\x40\xb3\xd7\x2a\x0d\x0b\xe0\xe4\xc7\xd3\xe1\xba\x96\xaf\xbd\x30\x29\x27\x12\x64\xe2\x51\x45\xa8\x7f\xf9\x2b\x3f\x4a\xff\x13\x25\xc0\x7a\x71\xaa\x55\x51\x7c\xab\xfa\x8c\x17\x27\x4a\x51\xc7\xc1\xed\x82\xca\x9b\xd2\x34\x84\x87\x43\x3a\x72\xe6\xe5\xaa\x98\x88\xf7\x70\xa2\xe3\x04\xbf\x21\x82\x9d\xb1\xa0\xb0\x85\x76\x34\x75\x13\xcd\x18\x09\xa4\xaa\x1f\x52\x55\xed\x3c\x27\x1d\xda\x71\xe5\xf7\x99\xe6\x5b\xb0\x47\xfe\x8d\x62\x31\x27\x3a\x33\x08\xfa\xb9\xbe\xbb\xea\xcf\x23\x0d\xe6\x07\x77\x5f\x9e\xbe\x6e\x57\x8f\xd7\xfd\xdf\x75\x62\x9d\x44\x5e\x5e\x5e\x58\x0d\x71\x62\xba\x27\x19\x07\xe8\x8b\x32\x5f\xcb\x77\x61\x98\xb0\x74\x94\x0f\xc4\x25\x2f\x9c\x18\x84\xa2\x9e\x1e\x4c\xa2\x68\x04\xf4\xe1\x04\x80\x62\x56\xc3\x6f\x97\x27\xa3\xdc\x66\x10\x47\xbd\x0a\xd0\x93\x9d\x56\x7c\x78\x1c\x51\x89\x79\x17\xa7\x5a\xfb\x58\x39\x1f\xbc\x4b\xc0\xc8\x64\x30\xc7\x51\x06\x58\x58\x0c\xbc\x88\xd1\x6e\x9e\xc7\x44\x30\x96\x05\x32\xf2\xfa\xd4\xb4\x95\xc9\x65\xd9\x1f\x55\x1c\x23\x02\x69\xb0\xd0\x85\xb4\xc2\x3f\x66\x13\xce\xa4\xa7\xc5\xb1\x70\xb6\xab\xf7\xd5\x6b\x8f\x16\x5f\x7f\x6e\x3d\xcd\xe3\x58\x6a\x2c\x87\x8d\xf7\xd1\x83\x0c\xb4\x6f\x44\x69\x8a\x12\xe5\x41\x1a\xfc\x21\x2f\x7b\xab\x57\x1e\xd3\x8c\x62\xe1\xa0\xdf\x77\x3c\x56\x4f\xd6\x2d\x98\xdd\x38\x0f\xe8\x21\x1e\xf3\x18\x82\x6c\xd9\xc8\x81\xef\x93\x1b\xe3\x5c\xa2\x82\xcb\x23\xd4\x55\x38\x81\x60\xae\x3c\x1a\x50\x5a\xcd\x02\xf2\x8a\xc7\x82\x03\x4e\x48\xc7\xee\xac\x7b\x39\xe9\xf2\xb1\x30\x51\xe6\xb4\xbe\x71\xa6\x1c\x91\x99\x96\x32\xe7\x3c\x4e\x88\x45\x8a\xcf\x3e\xc8\xae\x7f\xdd\x5e\x2f\x5e\x35\x11\x09\xc6\x16\xd7\xf0\xe3\xe5\xf3\xa4\x26\x8f\x93\x94\x12\x9f\xf5\x75\xf5\xf0\xe9\x07\x4c\xb4\x13\xae\xf1\x50\xbe\xae\xeb\xba\x59\xf5\x36\x7f\x7d\x6b\xe3\x6b\x90\x33\x56\x13\x8f\x53\x95\xe0\x4f\xbe\x6f\xee\xaf\xc7\x61\x46\x9c\xa5\x8e\x58\xdd\xef\xa1\x9b\x7f\xee\xa8\xdb\x9f\x22\xb1\x7d\xf9\x05\x55\xed\x90\x40\xe2\xf6\x06\x2c\x9a\x2c\x7b\xcb\xda\x76\x3c\xce\x0c\x47\x52\x61\x8b\x60\xb7\x11\xd6\x8d\xc7\x52\xa8\xc0\xfe\xec\xe9\x42\xae\x60\x3c\xfb\x0c\x32\x31\xc2\xa3\x0f\x6e\x7e\xb6\xb5\x1c\x73\x63\x3e\x79\xd1\xd2\x38\x0b\xf7\xb2\x2a\x6f\x4f\xe5\x6b\xae\x0a\xf0\xf4\xec\x80\x44\x98\xc7\xf6\xe3\x4a\x33\x8f\x95\x70\x40\xbd\xa6\xfb\x50\x28\x21\x36\x95\x2b\x9e\x7d\x05\x1d\x39\xcc\xb1\xfc\x99\x43\xb3\xa8\x35\x31\xbb\x3f\xcd\x1d\x68\x53\x9a\x7f\x9f\x9a\x6e\xc7\x3c\xb3\x58\xe1\xb1\xd6\x16\x0b\x04\x7f\x6d\xfe\xda\xfe\x22\xf0\x8e\x8d\x24\xa4\x07\x37\x04\x6d\xc2\xb5\x3c\x3a\x49\xe4\xd0\x1b\x8c\xb2\x98\x1e\x38\xe6\xfa\xfd\xeb\xcb\x7d\xff\x67\xcd\x53\x8f\x39\xf9\xaf\x53\xde\xde\xcf\x61\x44\x3c\x86\xcc\xa2\x37\xd7\xa8\x08\x3c\xb5\x14\xfb\xe4\x01\xc1\x40\x3a\xb0\x07\x27\xc8\xfb\x49\x3b\x4b\x5d\xde\xa2\x05\x79\x58\x58\xcd\x62\x2b\xdc\x8b\xca\x9b\xe7\xba\x7a\xad\xe5\xc1\x1b\x1c\x4e\xc1\x7d\x3c\xb6\xa9\x0a\x6a\x5c\x57\x55\xf5\xee\x3b\xea\xd8\x09\x95\xd3\x6e\x23\x85\x69\xb0\x3a\xe4\xc1\x26\xcf\x4a\x49\x1a\x13\x27\x1e\xe3\x00\x1b\xdd\x4c\xf7\x2b\x43\x68\x4e\x89\x52\x18\x34\x76\xf1\xe4\x17\xd9\x2d\xe1\x21\xc3\xc5\x69\x4c\x68\xe2\xec\x28\x7e\xfe\x5d\x05\xa1\x12\x4e\x63\xce\x91\xc0\xd6\x9c\x86\x3f\x89\x18\x97\x96\xf6\xb5\xf6\x4f\xdf\x3c\xcb\xba\x1d\x4d\x4f\xe8\x26\x29\x1b\x78\x46\xb6\x67\x70\x24\xe0\x94\x65\x4e\xb1\x17\x13\x6d\xd7\xf0\x03\x8a\xea\x88\x86\xa5\xfb\xbe\x85\x72\x55\xa3\x89\xe7\x17\xcc\xab\x80\x9c\xf2\x88\xe1\x58\x7f\x3a\xc2\x38\x47\xc8\x29\x67\xce\x00\xac\x06\x03\x70\xb8\x04\x70\x71\xca\xb9\x73\x87\xd8\x37\x45\xd5\x05\x19\x8f\xf0\x31\x7b\xb1\xdc\xc4\xa0\xfd\x6e\x12\xe5\x2d\x3f\x45\xc1\x70\x2a\x24\x47\x25\xb1\x7d\x03\xed\xd5\xa9\x2e\x6f\x01\x21\x7b\xb3\x6b\x0a\x65\x71\x7f\x7a\x75\x3a\x6f\x9e\xef\xc2\xbd\x26\x51\xe6\x2c\xcb\x7b\xdb\xd1\x6f\xf2\x54\xfc\x16\xa5\x3d\xfb\xa8\x09\x49\x10\xcc\xda\x2d\x69\xdd\x1d\x2c\xcd\xf8\x34\x49\x29\xf3\x51\x62\xb7\xc4\x6a\xc0\x4c\xfa\xf7\x3c\x50\x83\xa7\x2f\x20\x8d\x53\x04\xd6\x06\xf8\xf8\x2a\x28\xfa\x70\x2a\x19\x20\x48\x14\xad\x57\x3c\x13\x6a\xa9\x73\xca\xcc\xe0\x26\xf9\xe6\xee\x6e\xbb\xdf\x3d\xed\xbf\xac\x76\xeb\x2f\x7b\xf2\x65\xf3\xbc\xdd\x05\xa9\x2a\x4e\x15\xcf\xf0\x5b\x1c\x11\x15\x49\x9c\x28\xef\xfe\x38\x0a\x82\xa8\x49\x1d\x11\xed\xe1\x7c\x2b\xf3\x7a\xf2\xad\x8d\x8d\x13\x7c\x7f\x27\x28\x66\x97\x87\xd4\x69\x03\xbd\xc9\xe6\xed\xdb\x43\xf8\x81\x15\xd4\x17\xb5\x4a\xd3\x67\xf2\x77\x95\x77\x90\x99\xbd\x32\x9b\x00\x32\xbf\xae\xae\xef\xc7\x57\x65\x31\xcd\x02\x90\xe2\x3a\x6f\x74\x90\xc5\x5f\xce\x06\xb1\x98\x33\x4c\x86\x38\xbe\x5d\x25\x1d\x6e\x68\x8b\x72\xae\xf3\xdd\xf2\xff\x88\xa1\x7f\x65\xbe\x83\x31\x4a\x40\x87\xdc\x81\x6c\x81\x52\x1a\x6e\x84\x66\xd6\x85\x28\xd5\x01\x82\x97\x05\x0b\x07\x59\x14\x3b\x1e\x51\xf5\x7e\x72\x11\xf9\xe4\x21\x18\x95\x38\x5d\x07\xe0\xf6\x6c\x7e\x62\x8c\x19\xa0\xa1\xbf\xe4\x18\x97\xcd\xc4\x36\x38\x63\xdc\x81\x97\xcb\xd3\x01\xd9\x29\xfd\x46\x81\xb1\x54\xf3\x3e\x41\x77\x2a\x07\xfd\x07\x7f\x5c\x10\x8b\x31\x5a\xd7\x65\xa7\x96\x47\xd3\xcd\x0d\x13\x2c\x46\x2d\x89\x43\x5e\xa2\x25\x4f\x2d\x3f\xd0\x57\x7c\x7a\x23\xc2\x50\x4c\x0d\xad\x4a\xd9\x56\x87\x5c\x7e\xf2\x29\x12\xaa\xdc\xc9\xbc\xd6\x7d\x95\x23\xb4\x70\x76\x6f\x89\x30\xa1\xfa\xe7\x61\x6b\xbb\xf3\xd1\xd5\xad\xe6\x22\xbd\x9c\x25\x49\x0c\x72\x70\xf3\xf6\x8a\xc9\x93\x88\xaa\xcf\x24\x0f\xe9\x64\xce\x12\x69\x31\x0f\x5a\xc8\xa6\xbd\xca\x4d\x5f\xa8\xe3\x2c\x51\x6e\x3b\xe0\x14\x7b\xb6\x08\x96\x0d\xa5\x49\xce\xd2\xd8\x86\x05\xf0\xa9\x74\x63\x78\xf5\xba\x2c\x14\xc5\x59\xaa\x35\x06\x05\xd2\xd7\x78\x31\x9e\x18\x57\xaf\x38\xcb\x14\xf5\x42\x73\xdd\x4c\x8e\xfc\xe0\xa5\x7d\x01\xcb\x8c\xb3\x50\x7e\x90\x67\x59\x3e\xd7\x55\x5b\xe9\xaa\x98\x0b\x8c\xcc\x2e\x2f\xa9\x41\xf9\x35\x54\xb5\x90\x75\x7b\x51\x8a\x1f\x35\xcd\x34\xe6\x74\x36\x87\x23\x48\xfd\x76\x40\xac\x20\x42\xf3\xcd\x67\x18\xd6\x69\x3f\x51\x44\x63\x39\x57\x9f\xea\x67\x79\xde\x75\x0f\xb2\x09\x2b\x1b\x53\x8a\x22\x30\xec\xb1\x52\x05\x34\x0d\x3c\xa9\x22\xef\xd7\x24\xa6\x40\x23\x72\xfc\x28\xcf\xaa\xd7\x46\xe5\x4c\xc7\x80\x50\x9d\x2f\x79\x3b\x89\x06\x26\x89\x90\x79\x50\xb6\x98\xf8\x60\x9a\x49\x2c\x8c\x5c\x57\x1f\xa5\xf7\x00\xfe\x63\x01\x2f\xcd\x99\xe6\x29\xc2\x7a\x57\xa6\xf9\x01\x65\x7b\x9a\xd0\x08\x39\xd3\x4a\x60\xcc\xb0\x7b\x83\x4d\x51\x9c\x30\x2b\x99\xf7\x07\x4d\x86\x29\xc6\x35\x6a\x4c\x4e\x7f\x67\x6d\xe0\xd6\x5e\x78\x92\xf8\x26\x40\x63\xad\xbd\x31\x4e\x79\x72\x8a\x46\x4b\x61\x6b\x68\x9e\x72\x8c\x82\x8a\xdc\x02\x52\x35\xe6\x23\x12\xb4\x41\xa8\xc3\x37\x79\x2e\xf3\x90\xf2\x65\x96\x08\xe1\x5d\xcd\x1f\xab\xf2\x58\x57\x36\xef\xa6\x50\xd5\x85\xfb\xdd\x37\x5f\xdc\xd5\x30\x4b\x24\x22\x1b\xbf\x6d\xbe\xad\x5c\x95\xd1\xad\x92\xb3\x56\x34\x43\x8c\x2d\x74\x5b\x8f\xb7\x5e\x73\x69\xd8\xf2\x86\x76\x2c\xc5\xa0\x49\x9d\xce\x7f\xe6\x4d\x73\xb5\x5b\x77\x8b\xe0\x5a\x16\x85\x92\x9f\x38\x59\x70\x1e\xc5\x4e\x49\xd0\xc0\xb1\xc5\xdd\x6f\x0d\xcd\xb1\x9a\xa9\x36\x71\x1e\x09\x86\x4c\xb4\xbb\xb2\x6a\xf2\x66\x1a\x05\x7f\x1a\x41\xf0\x28\xe5\x58\xd7\xc5\xec\x80\xcb\xc2\xfe\x11\x0e\x49\x89\x65\xb7\xab\xa7\xc7\xaf\xdb\xfd\x6e\x73\xf3\xb2\xcf\xf6\xf7\x9b\x87\xcd\xae\x6f\xa1\x5d\xbc\xab\x4e\xe8\xf1\x7a\x21\x89\xc4\x39\x21\x4c\x7b\xcb\x9e\x47\xd9\x93\xdc\xd2\xfe\xa8\xe1\xbe\x6f\xdc\x04\xc1\xa5\xf5\x48\x84\x63\xf6\x22\x48\x0c\x88\xe9\xbd\x69\xdf\x70\x07\xd4\x4d\x7a\xf1\xec\x2d\x90\x34\x65\x72\x0c\x26\xba\xcf\x51\x87\xd5\x73\x3b\xe7\xad\x55\x9a\xf9\x0d\xb0\x97\xe4\x1f\xc4\x6f\x39\x27\x40\x1d\x2a\x5c\xfe\x00\x74\x3c\x5d\xc2\xb4\x71\x1e\xc7\x29\xa6\xec\xca\xd3\x01\x33\xd1\x3f\x64\x31\xeb\x91\x3c\x4e\x29\xe2\x9f\xbc\x42\xd3\xd4\xe8\x24\xb4\xc9\x04\xf5\x41\xd2\x36\x6f\x3d\x4e\x6a\x59\x36\x88\x73\x1a\x99\x44\x07\xb3\x4d\xd4\x30\xbe\xaa\x01\x4c\x70\x96\xef\x1a\x0b\x16\xda\x72\xad\x7d\x51\x1d\xfb\xee\x62\x47\xef\xc2\x13\xcc\xb4\xbf\xc9\xda\xac\xe5\x31\x90\x34\xc2\x64\xcd\x99\x88\x10\x4e\x0c\x3f\x5d\x1a\xe9\xea\x74\xfe\xf5\xae\x86\x33\x23\x30\xdb\x21\x8d\xd9\x41\x39\x92\x25\xbf\x4c\x4b\xff\x7f\xfc\xb7\xbf\xa0\x93\x73\x71\xfe\xb1\xff\xff\x05\xb2\x5d\x67\x16\x2a\xf8\x5b\xfc\x09\xe7\x45\xfd\x66\xce\xb9\x36\x98\x4a\x1d\xb4\xf0\x16\x88\xe7\xc3\x5a\xcb\xb9\x01\xc4\xdf\x5e\x15\x52\xbf\x3f\x9f\x6b\x79\xc8\xfb\xfe\x25\x08\xc1\x2c\xda\xee\x79\x77\xa9\xc4\xc3\xb9\x60\x2a\x73\xf4\xde\x2e\x80\x9a\x96\x9a\x39\x17\x9c\x3b\x9e\x4c\xa8\x70\x8d\x00\x25\x9c\xa7\x02\x90\x44\x19\x56\xdf\x75\x75\x38\x9c\xca\xbc\xbd\xf8\x66\xa1\x7d\x42\x13\x27\xe3\x86\x98\x89\x55\x33\x20\x4b\xbb\x83\xc2\x8c\x15\xd5\xae\x6b\xe4\x64\x4e\x5f\x7e\xaa\x9d\x28\xab\xc3\x90\x5c\xc9\xd7\xd9\xd3\x64\xd6\xa4\xa9\x07\x12\x43\xe3\x13\xe0\x93\xd9\x40\x25\x36\x40\xf6\x57\x0e\xce\xd3\x33\x58\x3f\xf9\x18\x2a\x65\x58\xf5\xc8\x1b\xa4\xb3\x97\xf8\x92\xef\x2f\x16\x18\xae\x09\xc3\x33\x37\x47\xd0\xb9\x2c\x7c\xa5\x00\xcb\xa8\x9b\x3e\xa5\xcf\x35\xe3\x48\x9b\xbc\xd9\x3c\xc7\x91\xdf\x39\xf7\xc7\x32\x67\x6e\xe6\x9e\xee\x66\xf7\x65\xce\xd9\x9d\x64\x46\xe6\x7d\x4b\x83\x53\x25\x6e\xa0\xdd\x7d\x54\x21\x70\xfa\xad\x37\x6e\xff\x6b\x85\xa6\x17\xab\xe9\x06\x84\x9b\x28\x41\xf6\x80\x53\xcd\xee\x1e\x3b\xfe\x6d\x9f\xff\x9c\x8b\xc3\xb9\x49\x74\x70\x13\x96\x7e\xfe\xb9\x92\x0d\xbc\xcc\x95\x57\x38\x87\x48\xc4\xfe\x79\x36\xda\xd7\x97\x67\x2d\xa4\x0d\x10\xd6\x3d\x92\xbe\xf6\x36\x00\x70\x38\xb7\xb1\x8b\x32\xdd\xcb\xbc\x83\x32\x9a\xbd\xcd\xbe\x0e\xc9\x2d\x30\x14\x43\xcd\xad\x8f\x5d\xec\xa9\xd8\x42\x89\x54\xcb\x66\xd7\x2f\x55\x16\x04\x78\x1d\x32\x27\x6d\x71\x53\xb6\xc8\x73\x99\xe6\x0c\x45\x14\x4b\xc3\x07\x81\xe1\xbc\x3a\x35\x83\xbe\xec\x1f\xa1\x51\xa6\x1c\x83\xb7\x3a\x74\x41\xe0\xa4\xb8\x27\x88\x21\x38\x4b\xfb\x99\xdc\xd7\xc5\xa6\x51\xbc\x20\x46\x23\xf9\x12\x97\x94\x6e\xe5\xd8\xe8\xea\x6b\x63\xd6\x30\xe1\xd2\x72\x11\x83\xb3\xe2\x58\x5d\x7f\xdb\x6c\x9f\x5e\xb6\x63\xf5\xc8\x6e\xf8\xc7\xc8\xfc\xff\xd4\x30\x7c\x71\x28\x0b\xa6\xe3\x94\x05\x1c\x06\x6a\x7d\x53\x36\x7d\x06\x1e\x1b\x62\x43\x62\x15\x15\xe4\xc6\xa5\xc6\xe1\x4c\x9c\xe9\x2c\xc8\x63\xc1\x41\xb9\x4c\xf7\x4b\x75\xc1\x38\xe6\x42\x50\x82\x65\x38\x6f\x0a\xe5\x50\x37\xe1\x98\x70\x2c\xe0\xdd\xcd\xea\x21\xd4\x7d\x45\x42\xe3\xcc\xb9\x1c\x38\xc6\xd3\x58\x3c\xb6\x3b\x6a\x31\x28\xb1\x55\x51\x54\x1f\xbf\x2e\x41\x89\x2e\x7a\x87\x81\x2f\xbe\x0f\x9b\x50\x21\xd3\x0c\x6d\xb4\x90\x82\xee\xf4\x89\xa7\xcf\xa7\x28\x41\x6b\x07\x87\x40\x71\xa9\xcb\x41\xd9\x64\x71\x99\x14\x2a\x31\xb8\xc6\x6c\xf3\xd7\x32\xac\x91\xf3\xd3\xaa\x4c\xeb\x90\x4c\x2e\x9b\x39\x98\x94\x0b\x1d\x91\x94\x84\xf9\xb4\xce\xa1\x19\xeb\xa7\x71\xa1\x99\x03\xbf\x7e\xaf\x2a\x33\x86\x58\x72\xa1\x85\x32\xbd\x20\xeb\x4b\xd7\x37\xa7\xdd\x5b\x27\xc4\xb8\xf9\x70\x15\x90\x71\xfd\x4f\xd3\x2c\xf6\x85\xb5\x2e\x54\x7b\x39\x15\x30\xff\xdc\xda\x38\xcf\x97\xeb\xd3\xe1\x70\x7e\xfa\xf6\x34\xb9\xb4\xd1\x49\xea\xf9\x50\xdf\x65\x5d\xe7\x55\xdd\xcc\xc1\x23\xc2\x80\x1b\x1b\xb7\xab\xe7\x5b\x94\xcc\xc2\x6f\x4b\xfb\x53\x80\x44\x81\x49\xac\x70\xcb\xd7\x69\x9f\x84\x94\xb9\x08\xba\xd6\x71\x34\x85\x33\x86\x16\x2a\xc6\x87\x6f\x4e\xea\x90\xb7\xa3\x42\x6b\xb7\x32\x6e\x03\xe4\x6e\x39\xf0\x9d\x66\xdf\xff\xe7\x7f\x07\xa3\xc0\x99\x65\x20\x17\x60\x12\x67\x72\xe7\x43\xb5\x00\xe3\xe2\xc2\xd2\x08\xe5\xe8\xbf\xbf\xc9\xf6\xbb\x6c\x1e\xce\x08\x74\x9f\x7c\x81\x24\x22\x1c\x39\xb4\xb8\x81\x6e\xde\xfe\x58\xd2\x91\x9d\xa2\xdb\x79\x42\x04\xe0\x0e\xc9\x15\x32\x10\xef\x3c\x1f\x60\x09\x51\xd2\xa2\x89\x71\x7e\x38\x16\x30\xb0\x9c\xfe\x51\x60\x94\xc4\x40\x71\x07\xd1\xe8\x85\x5d\xf0\xaf\x57\x9f\x84\x1a\x86\x75\xb2\xbe\xd4\x15\xd6\xe4\x67\x67\xb3\xb5\x5c\x6f\x4f\x98\x71\x1c\xd3\xa6\x94\x79\x71\xf0\x9e\x6d\xff\xf1\xaf\x32\xe1\x11\xf7\x4a\xa9\xde\xae\x63\xf9\xda\x9c\x38\xf6\x9b\x77\x17\xc0\x05\x7b\x6c\x11\xc0\x13\x11\x51\x04\x11\xa2\x6e\x75\x1f\x2d\x9c\x2e\x8c\x3a\x3e\x63\x82\xf1\x44\xd0\x04\x77\x28\xdb\xb7\xea\x78\x0d\x3f\x1d\xc2\xb8\x3f\xbd\xd0\xda\x09\x4c\xb8\x82\xdd\xa7\x1c\x80\xa5\x1d\x75\x92\x80\xc5\xc0\xfb\x7a\x73\xb7\x09\x67\x4c\xac\x45\x00\xd4\xa9\xac\xd0\x2e\x49\x16\x5d\xe8\xd2\x75\xdf\xaf\xc7\x5e\x78\x86\x27\x29\xe5\xbd\xc2\x63\xd5\xb4\xa8\x3b\xb1\x31\x63\x42\xa4\xbb\xe2\xe5\x8e\x2e\x49\x13\x8d\xd4\x01\x28\xf5\x68\x2b\xb5\xd0\x30\x13\x32\xee\x9d\x17\xd6\x45\xd5\xf8\xdd\x43\xa8\xf2\x26\x99\x26\x98\x5d\x3e\xca\x73\x9f\x2e\x6f\x50\xe4\x60\xfa\x9c\x99\x56\x06\xc6\xf4\xf7\x5f\x65\x4b\x12\xa9\x89\xce\x06\x57\x87\x53\xbd\x14\x41\x4f\xfb\x81\xa2\x71\xec\x97\xb4\xa7\xd5\xcb\xec\xea\x8a\x27\xc8\x7e\xff\xcf\x7f\x4e\xf9\xdf\x1f\xa8\x5a\x35\x9e\xb9\x12\x95\x18\xeb\x75\x0e\xef\xf3\xb6\x2d\xc0\xa1\x14\xee\xf2\xba\x08\x16\x8f\xa1\xa5\x4c\x70\x0b\xf4\xb0\xfa\xd7\x7e\xfd\xf4\xb8\x7b\xd9\x5c\xed\xd7\x5f\x6e\xd6\x7f\xee\x6f\x1e\xaf\x47\x14\x5f\x9e\x28\xad\x62\x37\xc5\x3b\x03\x9f\x5d\x7d\x6a\x5a\x30\x2e\x65\xa7\xcf\x8b\x48\x6c\x9e\x68\x4d\x30\xd1\x74\xf3\xd3\x0d\xf5\xbb\xdc\x4e\x68\x15\x3c\xd1\x86\x63\x6a\x72\x34\x7d\x7e\x32\xbe\xb4\x37\xb8\x1f\x4b\x80\xce\x2f\x67\x1d\x49\xe0\xad\x3a\xc0\xb5\xcc\x83\xfc\xbd\x3f\x6a\xa8\x4b\x7e\xaf\xd7\x5f\xf6\xf7\xf7\xdf\xf6\xb7\x9b\xdb\xd5\x9e\xf4\x47\x99\x46\x52\x5d\xfb\x56\x57\x1f\x5b\x5d\xcb\xe3\x6c\xb5\x48\x40\x48\x54\xd6\x34\xe0\xaa\x2d\x53\x0a\xe9\x27\x1f\xd2\xb2\x54\xf8\xc2\xd3\x23\xfc\x6c\x03\x7e\x6d\xf0\x46\xe0\x89\xe5\x0c\x9c\x08\x4f\x09\xed\x9b\xbc\x93\x2d\x7c\xc8\xf3\xf2\x5b\x48\x23\x2e\xa8\x1e\xd9\x07\xff\x31\x52\xea\x1e\xed\xc2\xd2\x48\x25\xa1\x94\x8c\x1c\xc1\x6b\x75\xf6\x72\x11\x93\xfb\x4b\x23\x50\x21\x59\x75\x0b\xbd\xa4\xfd\xb4\x0d\x21\x11\x62\x20\xbd\x7c\xc7\xf6\xed\xd4\x9a\xea\xa3\x9c\xb7\x32\x1a\xa3\x9e\x6d\xa5\xf3\xab\xfe\xad\xa7\x71\x94\x05\xe9\x76\x1f\x9c\x91\xa4\x3f\x26\x75\x00\x98\x6f\x74\xb5\x29\x6d\xd5\x1f\x51\x09\xae\xeb\x4f\xf5\xcf\x31\x0c\x23\x8d\x81\xf3\x31\xe9\xf4\xea\x93\xed\x5d\x4a\x89\xdb\xbc\xbf\x06\xf7\xd7\x71\xc0\x97\x86\x46\x59\x42\xc9\xc8\xf2\xf0\x93\x40\x68\xf6\x09\xa8\x22\x8e\x18\xe0\x51\x3e\x78\xdf\xbf\x4c\x0c\xa4\x82\x28\xe2\x13\x12\x5f\x4b\x85\xe5\x0f\xe3\xfa\xe6\xe5\x06\x3a\x15\xdd\xa0\xc0\x42\xc8\xf6\xa1\x1d\x8d\xeb\x54\xa8\x38\x08\xd1\x0c\x9b\xf1\x59\xc2\x36\x34\x85\x04\xf7\x7f\x1e\xc3\xf8\x02\x4d\x75\xaa\x67\x64\x21\x9e\x26\x0a\x30\xf7\xae\x21\x5f\xd6\x09\xe0\x69\x02\x06\xab\x5d\x45\xa5\xdf\xa7\xda\x0b\x3c\x4d\x55\xac\x1d\x36\xb6\x3a\xce\xfb\x55\x96\x69\x64\x3d\xb9\x04\x1b\xb2\x11\xbc\xda\x41\x88\xfa\xd2\x4c\x27\x31\x1f\xbc\x72\x46\xd4\x71\xdf\x40\x6a\x27\xb6\x35\xc1\x9e\x4c\x87\x7c\xaa\x13\xce\x1d\x48\x46\xe6\xe5\xe6\x7a\x0b\x7d\x85\x35\xd5\x60\x28\x1f\x81\xb1\xa6\x3f\x04\x46\x94\xb3\x99\x3e\x54\xf3\xc8\x2b\x05\x9e\x22\xc8\xeb\x05\x0e\xf2\xb8\x39\x1c\xab\xba\x05\xf3\x58\x75\xe7\xe9\x4f\x6f\x53\x86\x9b\xe7\xef\xbb\xdb\xf1\xec\x9b\x5a\x19\xdb\xc0\xe8\xa8\x6b\xe9\xf0\x04\x13\x86\xf0\xf2\x32\x91\x45\xd4\x99\x93\x60\x27\x59\x5e\x2b\x27\xef\x27\x8b\x52\x6b\x3d\x94\xc9\x0b\x37\x54\x4d\xfb\xa5\xaa\x7e\xcd\xc1\xe6\x59\xac\x1c\x7b\x67\x5f\xcb\x1e\x80\x93\x31\xe5\xbc\x1d\x9d\xe8\xcc\x58\x10\xcb\x37\xe0\x31\xc3\xa1\x57\xc2\xc7\xc2\x87\xc8\xb8\xce\xec\xa5\x52\x7d\x38\x68\x53\x45\x42\x2c\xee\x10\x10\xcf\xba\x7d\xb2\x57\xd0\x8e\x84\xee\x78\x26\xb2\x34\xa8\x6b\x3f\x56\x2d\x34\x23\x13\x1c\x9e\x09\x93\xc1\x18\xf1\xd9\x73\x98\x7f\xb9\x5b\xca\x92\x24\xc2\x94\xeb\xb5\x6c\xe5\xcd\x7f\x4e\x33\x03\x7b\x9e\x25\xa0\x70\x10\x40\x9d\xeb\xd3\x7b\xfe\x7b\x2d\x46\x9e\xa5\x34\x46\x14\x51\x40\xc3\x35\xf7\x88\xfa\x0a\x37\x9a\x32\xc0\x35\xed\xbb\xfc\xd1\x3d\x82\xcf\x43\x8d\x3b\x49\x96\x25\x04\xd1\xd8\x7e\xfb\x78\xeb\x14\x46\xfb\xa3\xc6\x4d\x5e\x58\xc4\x74\xf4\x75\x9b\x7f\x4e\x47\xb8\xb0\x55\xfc\xa7\xff\x4e\x1e\x4a\x26\x0e\x29\x92\x6b\x27\xe0\x12\xdf\x94\x0e\x22\xee\x8f\xab\x2c\xc1\xdc\xb0\xeb\x20\x21\x7f\xb1\x38\xfb\x66\x4a\x59\x1c\xfd\xb6\xa8\x64\x37\x9b\xf6\xe7\xd0\x3a\x09\x25\xb2\x8f\x50\x8a\xf0\xbc\x90\xef\x6f\x50\x3e\xcb\xc1\x7c\x80\x67\x5a\xeb\xc4\x57\x7e\x1d\xf0\xe7\x5b\x5e\x9f\x1a\x07\x34\xfb\xe4\xc2\x86\x28\x3d\x50\xc9\xef\xc1\xb6\xd3\x88\x27\x33\x92\x61\xa1\xb5\x87\x0d\xcb\x3a\x6f\xcf\x03\xaa\x6d\xda\x37\x20\xe6\x58\xe7\x7a\xcd\x7f\x80\x37\x1e\x79\xa8\x6a\x70\x28\xcd\xe5\x3b\x80\xc4\x15\xe2\x5f\xa1\xbd\x39\x56\xfa\x0d\x29\xe3\xd3\x26\x96\x27\x58\x13\x09\x52\x65\x7d\x9e\xe7\x37\xe3\xd6\x0a\xea\x5c\x0f\x70\x33\xec\xa9\xee\xb3\xa1\x26\x23\x42\x21\x38\x5b\x97\xcd\x05\x55\x43\x46\xa9\x45\x51\x30\x0c\x0e\x0f\xb9\xf7\x09\x1a\x88\x02\x32\xca\x2c\x7a\x98\x84\x92\x0e\x89\xc3\x7e\x56\x92\x48\x61\x19\x55\x9d\x6a\x97\x03\x1a\xa5\x80\x24\x61\x14\x6b\x96\x18\x78\xbd\x54\x79\xff\x77\x2e\x30\x4d\xda\x6d\x5d\x7f\xe4\xed\x79\xe4\x29\xc4\x25\x49\x24\x91\x03\xe4\x2e\x88\x5f\xa4\xff\xc3\xc2\xf3\x10\x1d\x23\x4d\xf5\x79\xfb\xb0\x47\xfb\xab\xf0\xd3\x38\x4e\x30\xd9\xb1\x7a\x5e\xf7\x7f\x62\x0e\x6a\xd2\x06\x6e\x50\xf0\x74\xee\x1b\x08\xb7\x2c\xe6\x0d\x26\xcd\xea\x03\x98\x3e\xcb\x3c\x7d\x4d\xb1\x30\x89\xe9\x61\xb9\xcf\x50\x1d\xfb\xcc\x82\x8c\x8d\xc1\xd5\xfc\x4d\x36\x4e\xd7\xbb\x3f\x60\xdd\xa3\x9a\xaa\x0c\xf9\xc4\x69\x87\x92\x34\xd2\x94\x4e\x1d\x9d\x3f\x4b\xbc\x48\xca\x9c\x52\x90\xc9\x1b\x8c\xb6\x2f\x0e\x5b\x26\x87\xfc\xc6\xf6\x74\x98\x05\xac\x92\xa6\x02\x17\xc0\x1f\x48\x6f\xbc\xe9\xe7\x7a\xc9\x32\x1b\x43\x5f\x36\x78\x96\x17\x97\xe6\x31\xc7\x8c\x5a\xc0\x1b\x05\x2a\x84\x3f\x9c\x50\x8e\xd1\xd9\x51\xd6\xed\x80\x09\x9e\x4c\x82\x32\xb5\x0c\xaf\x81\xeb\x41\xbf\x23\x9b\xdc\x9f\x14\x24\x1a\x29\x5e\xf7\xaf\x51\x0a\x70\x6a\xfb\xb5\x2c\xdb\x99\xd2\x2e\x97\x41\x2d\xa2\x69\xab\x5a\xbe\xce\x40\xfc\x52\x5a\x67\x99\x8d\xe3\xbb\xdb\x0e\x5e\xa8\xaf\x4d\x07\x95\x54\x91\xc6\x44\x9e\xcb\x5c\xd6\xd5\x0f\x28\x2f\x43\x60\xa9\xa4\x83\xbe\x38\x5b\xc9\xd9\x1d\xe9\xd8\x06\x97\xe5\x7b\x34\x1e\x1b\x45\xf7\xd2\x98\x0c\xbb\xdc\xf6\x98\xbf\xf7\x7f\x84\x48\xe0\x2f\xec\xa9\xd4\xfb\x88\x45\x57\xfd\x81\xd8\x12\x07\xff\x2a\x9d\xd1\xc0\xf0\xd2\x41\x18\x5c\x1b\x9f\xac\x85\x6e\xda\x7e\x3a\x8e\x4c\xae\x67\x0f\x65\x19\xc1\x41\xe3\x3e\xf0\x0e\xe4\x0c\x48\xa1\x22\x92\x82\xd3\x18\xdd\x9e\xd4\xbf\xd1\x23\x3f\x6f\x60\x27\x8f\xf3\x76\x99\x44\x04\xd9\xf5\xe6\x5b\x18\x65\x8a\xc4\x2e\xd0\x2f\xe4\xa9\xd4\x33\xc0\xa9\x22\x2c\xa6\x83\xe6\xf0\x00\x64\xea\x0e\x84\x84\xb5\x1f\x94\x0e\xec\x3c\x89\x48\x55\x6c\x1d\x70\xeb\x15\xda\xef\x58\x5a\x06\xe3\xea\x26\x2e\x1d\x3b\xbb\x18\x25\x06\x5f\xe3\xe1\x3c\xda\x3b\x28\x9a\xb9\x84\x03\x6e\x68\x57\xeb\xdd\xe6\xeb\x43\x7f\x48\xb3\x78\x20\x17\xbb\x2b\xcc\xcf\x09\x8e\xcf\x7b\x57\xc9\x22\xc8\x7d\x2f\xbe\x64\xc5\x18\x45\xd4\x16\xe8\xaa\xf4\xc8\x2c\xaf\x31\x11\x1a\x28\xc5\x83\x00\x81\x1f\x48\xe1\x10\x27\x89\xd3\x12\x36\x66\x2b\xed\x27\xe5\x5f\x25\xd2\x98\xd9\xc1\xad\x01\xea\x05\x0d\x8b\xae\x95\x93\x4b\x7d\x7e\xd9\x7c\x5b\xed\x6e\xf6\xdb\xdd\xea\x0e\xff\xfb\x12\xca\xd6\x2a\xa1\x86\x06\x24\xb7\x23\x86\x3f\xc2\xc7\x0b\xfc\xc8\x47\x64\x0d\x95\x70\x45\x9c\x50\x41\xf5\x5a\xc0\x24\x43\xab\x52\x41\x30\x59\xe9\xb8\x31\xeb\x6e\x17\x10\x22\x80\xd0\x42\x0b\x9c\x8e\x30\xb7\x82\xce\x27\x4f\xfd\xe5\x53\xe3\x6c\xb1\x30\x8b\xd7\x9d\xa0\xef\xdb\xe3\x08\x44\x65\x31\xd5\x32\x98\x6f\xf6\xf2\x1f\xd3\x0e\x92\x31\x4e\x9d\x4a\xa3\x3a\xbd\xee\xff\x7d\x32\xaf\x7d\x17\xfa\x1f\x42\xff\x77\x0e\x7d\x5f\x4a\x7c\xce\xc3\xa5\xff\x61\x43\x23\x12\xfd\xef\xe8\xcf\xe1\x9a\xda\x19\xc1\x3f\xf5\xec\xd7\x91\xc3\xda\xaf\xf2\xae\xa1\x20\xad\x32\x2b\xa2\x64\x1c\xa9\x77\x27\xba\x3b\x49\x9c\xe0\xc2\xac\xa0\x64\x14\x61\x71\xc4\xbd\x14\xa7\xff\xf9\x58\xd5\x07\xb7\xd1\x9f\xbc\x2a\x99\xb9\x5c\x84\xeb\x19\xf9\xe1\x74\xf8\x72\x36\x75\x85\x06\x6a\x9f\x4c\x0a\x4a\xea\x38\xf4\xb9\x4f\x6c\x0f\x7d\x43\x95\x18\x8c\x5f\xa5\x8b\x1f\xc2\x5f\xd3\x18\x33\x0a\xdf\x77\x4f\xc3\x9f\x20\xce\x3c\x7d\x21\x2f\x4f\xd5\xa9\x19\x7c\x5d\xb8\xea\x7a\x3f\x56\x64\x4b\x8d\x5a\xd4\x57\x27\x6b\x9f\x7b\x3b\x8f\xd0\xca\x68\x26\x83\xfc\x0d\xee\x2e\xf7\x3f\x88\xe8\x0f\x1a\x57\x10\x96\xc6\x3c\x95\x4f\x25\x38\x74\xeb\x2f\xa3\x24\x65\x80\x22\xa1\x66\x2b\x8d\x29\xe0\x79\x3e\x67\x40\x6c\x23\x77\x78\x92\x57\xfe\x2d\xe8\x28\xfc\x3c\xb5\xe0\x5c\x70\x30\x7e\x08\x34\xa4\xd5\x7c\x1a\xb1\x99\x40\x7c\xfd\xff\x7d\x7a\x9e\x1f\x01\xce\xcd\x80\x61\xbb\x3a\xdf\x1c\x64\x5e\x4c\xbb\xb9\x8e\x12\x8e\x38\x93\x5d\xa0\x62\x8d\x88\x73\x3a\xca\x6c\xec\x40\xf3\x47\x44\xc0\x8d\x19\xd0\x5c\x93\xc8\x79\xfe\x1f\xe5\x79\x55\x9a\x2f\xb2\x34\x0b\xda\x60\x93\x5b\xd2\x84\x1b\x14\x43\x06\x9f\xa6\x7b\x91\xed\xcc\x57\x91\x6b\x2a\x98\xd7\x8f\x72\xe8\x67\x24\x69\x4d\x6f\x9a\x26\x8e\xaf\xe4\xeb\x52\x4b\xd4\x76\xae\xa9\x52\x22\x68\x6c\x37\xaf\x21\xef\xac\x19\x50\x57\xeb\x80\xd2\x6c\x9d\x0d\xf4\x71\x90\x27\x9b\x9e\x82\x53\x6d\x89\x8f\xca\x7d\x00\x36\xdb\x09\x85\x86\x90\xa1\xeb\xe3\x21\x3f\x78\x9c\x8e\x60\x93\x81\xa9\x05\x8b\x42\x5d\xd7\xc1\x60\x9b\x0b\x46\x6c\x1a\x9a\x72\xaa\x24\x72\xc4\x7e\x74\x5f\x44\xf6\x4b\x9b\x4e\x52\x27\x8a\x59\x43\x5b\x9f\x9f\x6a\xa9\xbb\xf1\x3a\x93\x80\x0e\x4d\x65\x86\x4b\x42\x98\x48\x6e\x4f\x45\xe1\x93\x6e\xb7\x75\x75\xb8\x92\xe5\xfb\x34\x64\xd5\xa9\xa1\x18\xd0\xac\x77\x0f\xfd\x9f\x2c\x63\x5e\x3f\xa1\x47\x89\xeb\x8c\x3b\xaa\xb7\xe3\xbc\x62\xb6\xa7\x79\x72\x76\x43\x53\x96\xe0\xf8\x99\x32\x63\x70\x87\x75\xb7\x7e\xfa\xd7\x3f\x1c\x01\x5a\x12\x81\x7c\x6b\xbc\xcb\xbd\xa9\xca\xa1\x90\xac\x55\x0c\xde\x71\xc0\xd6\xd0\xbc\x05\xfb\x14\x4f\x29\x1d\x85\x45\x5a\x79\xfd\x6d\x97\xfa\x1b\x74\x84\xbb\x23\x20\xe3\x90\xe7\x2d\xf5\x1b\xfa\x37\xce\xf7\xfa\xa1\xad\x14\x21\xaf\x70\x1b\x20\x65\xfd\xa1\x24\x76\x80\xe8\xfb\x11\xc2\x49\x2b\x9d\xa6\x3d\x24\xfe\xeb\xf6\x1a\xe3\x9e\xfe\xa8\xa6\x04\xc9\x71\xa6\x9a\xe5\xa2\xc3\x71\x4e\x74\xec\x85\x89\x3d\x9a\xb9\x8b\xad\xc2\x51\x61\x95\x5b\x02\xab\xc3\x24\x23\xaf\x75\xe6\xe0\xbf\xe8\x8f\x33\x86\xda\x4c\x4f\x6f\xa4\x95\x81\xed\xf0\x54\xc2\xb7\xaa\x38\x0d\x6f\xcc\x0a\x82\xf4\x84\xa3\x3c\xbf\xc8\xf7\x59\x80\xaa\xad\x01\x1d\x70\x76\xdf\xbf\x4c\xf4\x54\x5d\x0b\x13\xc5\x1a\x01\x32\x6e\x88\x3f\x38\x50\xee\x20\xcb\xd5\x74\x81\xfc\xc7\x5c\x10\xc0\x90\x24\xc5\x5d\x5d\xd8\x0d\x4e\x22\x1c\x43\x32\xd9\xfb\x72\x76\xaf\x2b\xaf\x46\x00\xae\xd0\x46\x81\xe3\x8d\xd6\x88\xea\x75\x32\x56\x63\x50\x80\xa1\x8a\xa3\x4a\xd9\xb1\x2a\x72\x7d\x1e\xd8\xf1\xfe\x30\xe3\x86\x3a\xad\x5d\x34\x2f\x6f\xc2\x9c\x61\x38\x31\x24\x9b\x52\xeb\x6f\x76\x5f\x66\xd4\xf0\xd0\x96\x31\x05\x97\x6a\x85\x5f\xcb\x36\xff\xcd\xb6\xdb\x70\x9e\x61\x32\x63\xa7\xaa\xea\xfd\x77\x2e\x53\xdc\x70\x9d\x25\xde\x9f\xff\x33\x73\x88\xe9\x34\x65\x38\x08\x4c\x43\x7b\xa3\x15\xbc\x44\xef\x1d\x3a\xa2\x9f\x1b\x41\xbc\xdd\x22\x4e\xf8\x8f\xfd\xe0\x37\x82\x6a\xd4\x28\x7a\xb9\x79\x58\x6d\x1e\x37\x8f\x77\xfb\xed\xd7\xe7\xe7\xfb\xbf\xc2\xf1\x84\x18\x9c\x31\x9d\xc3\xdb\xcf\xe7\x42\xb6\xdd\xa2\xd2\x1f\x4e\x00\x53\x64\x38\x03\xa2\xfe\xcc\xc8\xf5\x9e\x9b\x34\x62\x1c\xa7\xd1\xbd\x01\x67\xc3\x17\x8e\x48\x42\xb2\xb8\x97\xf3\xbc\x95\x27\x3d\x53\x46\xe1\x46\x4a\xbf\x60\xca\x63\xde\xca\xc2\x8d\xb7\x9d\xac\x5f\x87\x5e\x24\xb5\xc1\x2d\xd2\x02\xc1\x7f\x75\x6a\x97\xcd\x6c\xb9\x51\xb1\x41\xfd\xd4\x67\x79\xae\x4e\xed\x7f\x9d\xe0\x04\xdb\x01\x84\x61\x54\xec\x8c\x3d\x9e\xab\x40\x39\x35\x9a\x3a\xdb\xff\x06\xda\x6e\xc2\x59\xdc\x75\x1b\xed\xb9\x7a\x70\x38\xb6\xe7\xed\x5b\x7e\x5c\xcb\xfa\xd5\x89\x02\xf6\x1f\x4c\x2b\xc5\x65\xbf\xc9\xf1\x5b\x93\xd9\x69\xc0\xb9\x39\x99\xc1\xa7\x16\x8b\xe7\xe1\xb0\x75\xe4\xb6\x6f\xdd\xac\x76\x40\x98\x70\xb7\x75\x0c\xb3\x8e\x6f\x65\x88\xc5\x81\xa1\xa0\xdd\x57\xe5\xbe\x9b\x16\xfa\x82\x95\x31\x31\x61\xc1\x37\x57\x16\x70\xdd\x6f\xa6\x02\xa1\xc9\x18\x95\xb8\x75\x62\x44\xa1\x7d\xae\x9a\xb6\x7d\x75\xfe\x5f\xcb\xef\xd5\xd8\x04\xa3\x0b\x93\x37\xdd\xf4\xed\x94\xf1\xaa\xf9\xf3\x01\x4b\x31\x8d\x84\xbf\x6d\xda\x7a\x02\xc0\x34\xc0\x2c\xae\x2b\xc5\x49\xbf\x9f\xbb\xa0\xb7\x96\xfa\x1d\xea\x40\x3b\x32\x00\x14\x05\x83\xff\x73\x82\xfa\x1c\x23\x7a\xf8\x4e\x36\x13\x65\xc0\x7f\xa0\x86\x62\xc0\x4a\x9c\x9c\xba\x8e\x73\x33\x64\x95\x8c\xe5\x11\xee\x22\xdb\xfc\xb8\xaf\x87\x14\xa6\xb1\x9c\x60\xca\x08\x45\x8a\x2e\x44\xfb\x38\x44\x91\x93\x82\x53\xf0\xf7\xb1\x2a\xc6\x33\x38\x44\x2c\xc2\x95\xc6\x4d\x98\x70\x41\xa0\xf8\x3f\xb3\x33\xf1\x08\x7c\xd9\x6f\x7f\xf4\x92\xe2\xfb\x6e\x9e\x9a\x1b\x84\x76\x4d\x19\x8a\xda\x3c\xa0\xbd\x74\x7e\x3a\x4c\xaf\x9b\xd2\x58\x87\xf5\xaa\xdb\x04\x4e\x82\x3d\x20\x22\x65\x01\xb9\x75\x6a\x61\xbb\x1c\xfa\x03\x65\xcc\x26\xc1\x31\x78\x98\xf3\xbb\x51\xb0\x90\xa5\x02\x2a\x34\x2e\x73\xb6\x17\xea\x1f\xdb\xbd\x71\xa0\x36\xe2\xbe\xeb\x05\x71\xd5\xd9\x43\x31\x02\x68\xe4\xe6\x4d\x83\xe6\xa5\x0b\x60\xd4\xa9\xae\x20\x8b\xeb\x7c\x09\xa7\x03\x2e\x12\x1c\x20\x3e\x45\x55\x57\x95\x1d\x61\xe5\xfe\xcf\xe2\xff\xfc\xf4\xc0\x3f\xff\x9f\xe4\x7f\xc3\xf5\x13\x8b\x3b\x66\x9f\x48\xae\x5e\xab\xaf\x75\xb1\x0c\xca\x04\x9e\x45\x88\x14\xba\xab\xab\xd3\x71\x1f\xb2\xa5\xc0\x3d\xb5\x64\x0b\xfa\x54\xe7\xed\x79\xbf\xea\x36\x5e\xce\x7f\x63\xfb\x26\x69\xd7\x01\x77\xd5\x38\xe4\x9b\x9d\xd6\x24\xe0\x1d\x81\xda\x55\x51\xcc\x33\xbd\xc0\x6d\x94\x0e\x02\x1e\xdf\xba\x17\x95\x83\xd9\x8e\xf2\x53\x4b\xca\x34\xd3\x52\x06\x08\x12\x87\x8e\x7a\x95\xd7\xed\x1b\x0a\x55\xf7\xc7\x14\x6e\xe9\xbd\x15\xa4\x2f\x52\x0c\xe9\xea\x59\x86\x0a\x04\x81\x50\xc0\xda\xcb\x5a\xe5\x6d\xb3\xff\x98\x13\x20\x16\x10\xc3\x20\x52\x4e\xe7\x56\x89\xb3\x1e\x99\x18\x86\x4e\xbb\xeb\x75\x48\x43\x41\x9a\x44\xca\xcd\xb0\x56\x9e\x8a\x76\x3c\xd0\x21\x23\x94\x25\x43\x79\x25\xff\x1b\x43\x0f\x17\xbb\x4c\x13\x86\x90\x65\x0a\x06\xbd\xe9\x2f\xf9\xeb\x1b\x34\x0e\xd4\xd1\xec\x97\x59\x52\x90\x29\x13\x8f\xb5\x1a\x7f\x59\x2e\x06\xa9\x5d\xfd\xc9\xc5\x5d\x58\x69\x58\x5c\x79\x40\x09\x12\x4c\x46\x7d\x03\x44\xcd\xff\xca\xe3\x96\x83\x66\x24\xf8\xd8\xb8\xb8\xe1\xc3\xcc\x82\x56\x30\x5c\x23\x2a\x02\x5d\x8a\x57\x45\x2e\xfb\x67\x37\x06\xa0\xb7\xd3\x1b\xb3\xa8\x2e\xb1\x33\x60\xac\x48\x8d\x7f\xa5\xdf\xc0\x31\x0c\x9c\xc1\xb7\x6f\x00\xb1\xc3\xa2\x7b\xe8\xd2\xae\x9b\x26\xeb\xdb\x7c\x14\xb4\xcf\xcc\x32\x38\x58\xe6\x6c\x5b\xec\x3e\x48\x35\x84\x93\x59\x2e\xb1\x6f\xdf\x41\x7d\x90\xa8\x1e\xf8\xc9\xdb\xb5\xd2\x89\x1a\x34\x4e\xd9\x7f\xf6\xe8\x56\xb9\xc5\xdc\xe6\x45\xb1\x7b\x83\x91\xec\x10\x58\x1b\x61\x38\xfd\x26\x6b\xa3\xab\x1a\xae\x64\xdb\x16\xd0\xed\xcb\x96\xe7\x50\x1b\x91\x34\x98\x3c\x7e\xaf\x82\xb5\x25\xb7\x51\xe2\x99\x7d\xab\xfb\xfb\x4f\x6c\xd1\xbb\x46\x4a\xb0\x21\x6b\x00\x66\x32\x9f\x76\x87\x31\x38\x7d\xd8\x3c\xee\x9f\xef\x57\x7f\xdd\xbc\x6c\xfb\x43\x90\xe0\x5b\xed\xee\x65\x57\x6d\xdb\x65\x33\x11\x6e\x23\x1b\x21\x7b\x12\x2b\x6b\xdf\x7b\x36\x4e\xf8\x3a\x96\x08\x8e\xa4\xac\x1b\xf3\x2a\xeb\x97\x5c\x77\x8f\xfd\xfd\x54\x36\xfa\x0d\xfa\x26\x99\x53\xfa\xe9\xb6\xd5\x3d\xd0\xd3\x1f\x8b\x39\x1f\x13\xef\x66\x2c\xeb\xe9\x90\xb2\xb1\x74\x92\x26\xed\xb0\x37\xb2\xb1\x71\x1e\xc3\x2e\xf3\xfa\x20\xcb\xf3\x75\x9d\x97\xef\xc3\x6f\x80\xe1\xfa\xba\x6f\xda\x7a\x5d\x95\x5a\xb6\xbf\x82\x9d\xf9\x1f\x51\xcd\x51\x55\xea\xbe\x7a\x5d\x32\xe5\x59\x8e\xe7\x2d\xe3\x31\xf7\xd2\x07\xae\x16\xb5\xdc\x8c\x13\xb7\x02\x49\x37\x39\xd3\xd9\x43\xf2\xd8\xd1\x52\x77\x77\x2f\x5f\x9f\xc7\x4b\x76\x77\x04\x8b\x27\x28\x19\x86\xbb\x9d\xfc\x92\xd3\x65\x79\x66\x70\xfa\x42\x71\x92\xc7\xf8\xe6\xa7\x06\x8c\x12\x27\x20\x81\xb0\x16\x58\x41\xa5\x9f\x8a\x61\xb3\x7e\xba\x82\x12\x10\x1e\x50\xcf\x98\x9e\x56\x24\xc4\xb9\x09\xbb\xec\xc3\xd0\x11\x26\xa7\x15\x6c\x94\x15\x3d\x5d\xc0\xe5\xe2\xd9\x38\xb5\x22\x91\xe0\x9f\xe8\xe6\x98\x37\x95\x99\xed\xae\x6c\xaa\x09\x5a\x28\xa0\xbc\xfe\x97\xea\x54\x37\x7f\x4c\x4e\x20\x29\x05\xe5\xa0\x53\x05\x52\xdd\x96\x60\xc4\x56\x2a\xca\xa6\x4a\x40\x58\xc2\xb3\x2d\xd4\x37\x4e\x70\xeb\xb3\x2f\x3b\xbb\x5f\x09\x22\x8a\x03\xdc\xbb\x39\xd5\x97\x05\x1d\xab\x0c\x41\xd5\xe3\xe7\xaa\xfc\x7b\x10\x42\xb0\xca\x18\x5c\x38\xf6\x55\xfd\x59\xe9\x28\xed\x9b\x82\x75\x3a\xad\xdd\x44\x37\x38\xda\x2e\x6e\xed\xad\x56\xcc\xc9\x33\xe7\xdd\xe6\x17\x7e\x20\x2d\xd9\xef\x95\xe7\x4e\x06\xdc\x6a\x43\x91\xb9\xd7\x05\xb6\xcd\xaa\x9e\x05\xdf\x56\x03\xc8\x34\x60\xaa\x4e\x5d\x4c\x88\x09\x33\x35\x08\xaf\x58\x03\x0a\xab\x64\x3f\xa0\x34\x55\x3d\x12\xee\xf1\xc7\x21\x62\x2c\x78\x64\xa0\x39\xd7\x8b\xe3\xc1\x3c\x56\x2d\x82\xc3\x47\x48\x6a\x0b\x9c\x63\x91\x16\x35\x20\xef\xea\xde\x89\x91\x5b\x10\x71\xe4\x5c\x54\x75\x55\x1b\xd4\x37\xb8\xbb\xd0\xaa\xb0\x60\x52\x1c\x2a\x88\xe4\xba\xaf\xaa\xf7\x53\x40\x18\x5b\xcb\x5d\x72\x20\x68\xc4\xf6\x7f\x4f\x22\xac\x69\xec\x8f\xf2\x7c\x0b\xfd\x22\x63\x6d\x26\x02\xcb\xc2\xa5\x3e\x01\xdd\x28\x1e\xaa\xb2\xfb\x08\xbe\x99\x88\x22\xc2\x7d\x51\xaf\x95\xc5\x33\x12\x1f\xfb\x43\x5c\x61\x8a\x27\xf0\x84\xba\xb5\x0c\x1f\xf6\x9f\x74\x2d\xd1\xed\x10\x22\xa7\x1c\xd2\xe6\xf6\xdc\x17\x8f\x97\x76\x01\x22\x8a\xac\x13\x36\x70\x42\xa7\x6f\x79\x61\x66\x98\xc1\x69\x73\x42\x29\xa6\xac\x7a\x77\x46\x59\x04\x44\x5e\xff\x64\x31\x73\x19\xa8\xdd\xea\x5f\xa3\x49\x47\x44\xb1\x76\x12\x02\x0e\x61\x7f\xae\xec\xe3\xa4\xcf\x60\x03\xd4\x73\x86\xf6\x6d\x0b\xa5\x99\xda\x11\x7e\xba\xee\x8b\x88\x1a\xea\xb4\x4b\x5c\xb9\xe7\x1a\x5a\x99\xcf\xd8\x7e\x22\x62\x71\x62\x3d\x6f\xe2\xee\x79\xfb\xd2\xf5\xb4\x79\x8b\x24\xc3\x84\xf6\xde\x07\x93\x5f\xf2\xa6\x5b\x41\x90\xe5\xf1\x49\x5d\xe6\x73\x31\xbb\xd0\x3e\x84\x90\x22\x62\xa9\xc6\x30\xc8\xbd\x69\xd9\xbc\x55\xa7\xfe\x8b\x73\x9d\x25\x10\x92\x14\xf5\x6b\x5e\xf6\xea\x47\xcb\x53\xbf\x88\x44\x94\xba\xf2\xb7\xb4\x70\x77\xea\xe2\x22\xbc\x64\x3c\xd5\xb4\x21\x7d\x73\x91\xe0\x82\xf2\x05\x8a\xa2\xfa\x5e\xd5\xc5\xa4\xae\x25\x22\x91\x3a\xd1\xb9\xeb\xbf\x36\xbb\xdf\xb9\x5c\xa4\xe1\x37\x36\x43\x4f\x7b\x35\x77\xca\x1e\x09\xa2\x89\x28\x89\xb4\x05\x3f\xfe\x7e\x40\x7d\x76\x6c\xc7\xe3\x31\x90\xb1\x45\x94\x50\x86\x73\x6a\x93\xbf\x96\xbb\xca\x2b\x5b\xad\x8c\xeb\x88\x83\x43\x8a\x88\x92\x24\x96\xdd\x90\x71\xc3\x21\x6f\xde\x82\xd4\xa7\x33\x5a\xbe\xcd\x65\xfb\x0c\xf5\x4d\xfb\x76\xb1\x59\xeb\x7e\x9b\x41\xd2\x57\xa3\xae\x4e\xe7\xd9\xf1\x94\xa6\x08\x20\xb5\x75\xf5\x37\x94\xbd\xef\xd2\xb4\x83\x66\xc2\x49\xf1\xa3\x9c\x50\xd7\xc9\x46\xf3\xef\xb4\xa5\x04\x8b\xb4\x8a\x22\x3f\xe4\x6d\x3f\x32\x94\xa2\xb8\x44\x6e\x37\x77\x0f\xab\xf0\x47\xed\xad\xa4\xbb\x69\xee\x5b\x15\x36\x08\x22\xd2\xa9\x9b\xd2\xba\x09\x76\x94\x8b\x14\x91\x96\x4e\x2a\xa1\xdb\x9c\xad\x8c\xf9\x94\x10\xef\x9b\x1b\x6f\x86\xe9\x16\x81\x3f\xe1\xec\xa4\x23\x67\x8f\x06\x82\x38\xe6\x62\x75\x38\xe4\xed\xae\x9a\x6c\xf4\x44\x04\x59\x86\xf2\x89\x57\x1e\x4d\x3e\x42\x2d\x77\x07\x15\x0a\xac\xb8\xfd\x89\xd3\x9e\xa9\xcf\x13\x11\x21\xdf\xd2\xf2\x08\xa7\x74\x25\x9b\x89\x47\x83\x20\x51\xc4\x64\xd7\x4d\xbe\xe5\xcd\xac\x98\x22\x48\x94\x46\x72\x9c\x18\x1d\x78\x4f\xf3\x86\x36\xc2\x3c\x45\x98\x9d\x10\x87\x30\xbd\x05\x42\xb8\x46\x0c\xd9\xc3\x39\xe8\xdb\x2f\x02\xc3\x05\x21\x82\xe1\xde\xb8\x9f\x40\x2f\xc3\xbb\xae\x91\xf3\xdc\x7c\x86\xfa\xbd\xb9\xb0\xf8\x0f\x8d\x12\x4a\x3c\xdf\x1a\xa5\xd4\x1d\xa9\x79\xa4\x24\x25\x08\x01\x8a\xa5\x91\xdb\xbc\x79\x53\xb2\x7c\xbf\xaa\xaa\xf1\x6a\x41\xe2\x04\xb0\x3f\x55\xbe\x74\x33\x9d\x90\x26\xff\x9d\xd0\x5a\xdc\x7f\x27\xb3\x52\x38\xa3\x89\x98\x83\x57\x38\x89\xd0\xc5\xcd\x4b\xb7\xf5\x76\xab\x1f\x6a\x39\xb6\x7a\x4e\x9e\x09\x17\x0b\xda\x9d\xe9\x42\x3d\x46\x10\xc6\xd3\x84\x8f\xb3\xe0\xf0\x29\x30\x72\xfa\x43\xc1\x5d\x52\xc8\xf5\x2c\x6f\x72\x8e\xd2\x11\x3d\xa3\x7a\xd4\x38\x15\x58\xb5\x44\xa3\x95\x1a\x4c\x30\x18\x76\x63\x64\x81\x0c\x22\x88\x50\x8e\x96\x31\xdc\xd8\x58\x23\x5e\x90\x84\x71\x27\x96\xd8\x5d\x72\x1f\xfe\x9a\xa6\x4e\x1c\xdc\x42\xab\xdf\x30\x4a\x6a\x6e\xab\xfa\x01\xba\xee\x14\x76\x4c\x82\x64\xb1\xb3\xa9\x3b\xd6\xf9\x0f\xd9\x42\xc0\xc4\xcc\xcb\xcb\x82\x68\x4a\x71\xe8\x61\xca\xaf\xf9\xcf\x49\xd6\xa3\x43\x12\xf7\xdb\x98\x84\xbc\x42\x51\xcb\x49\xb7\xd1\x99\x46\x0e\xeb\x10\x8e\xae\x91\x1f\x99\x7f\x0a\x7c\x14\x44\x4b\xc5\xbd\x4d\x6c\xb7\xca\x76\xc1\x10\x72\x1e\xfc\x61\xc3\x00\x85\xd8\x1f\x9f\x6e\x76\xe3\xe5\x9b\x98\xc4\x38\xe4\x18\x62\xa1\x37\x07\xf9\x3a\xff\x00\xc6\x38\x10\x7e\x30\xac\x97\xed\xc4\x23\xf6\x13\x58\xa7\x20\x10\x03\xca\x93\x62\x40\xbb\xae\xea\x5f\x4b\x8f\x09\x02\xdc\x08\xd9\x03\xb7\xff\xac\xda\xfc\x3d\xdc\x24\x68\x86\xfe\x44\xdb\xcd\xfd\xb7\x9b\x97\xfd\xea\xe1\xe9\xeb\xe3\x6e\xbf\x7b\xde\xf5\x0d\x0c\x05\x19\xbe\x78\x55\x14\x50\x37\x57\xe7\xc1\x2e\x7c\x32\xeb\x11\x9b\x4a\x1e\x8f\x23\xd0\x7d\xbc\xcf\x9d\x32\x29\x26\x49\xf6\x12\x13\x41\x5d\x5c\x5a\xe7\x18\x7b\x60\xab\x70\x2d\xab\x01\xa9\x2b\x4e\x0b\x79\xfc\x32\xe3\x28\x72\xce\x16\x88\xbb\x29\x8a\x11\x13\x64\x32\x56\xe3\xd0\x9c\x11\x0c\xe9\xd4\xe9\x3c\x5e\x0a\x62\x12\x67\x38\x3a\xb1\x7f\x4c\xd0\x2e\x22\x26\x42\x62\xc1\xe5\xb1\x72\xf7\x1e\x5c\x2b\xa6\x1f\x2d\x8e\x23\x4a\x02\x80\xa7\x32\xa7\xa2\x47\xab\x4d\x07\xcc\x28\x92\x89\x63\xca\x11\x3e\x8e\xb5\xbb\xb6\x6a\x61\x92\x62\x0a\x8d\xa4\x33\x90\x01\xf4\x0a\x68\x56\xa1\x83\xc5\x94\xc4\x4c\xf4\x95\x89\xe6\xa9\x44\x3b\xa5\xff\x1f\x6d\x7f\xd2\xdd\x38\x8e\xe5\x0f\xc3\xdf\xe5\xbf\xca\x45\x2d\x48\x90\x18\xf8\xee\x24\x5b\x76\xb8\xc2\x53\xdb\x8a\x88\xca\xac\x53\x47\x07\xc3\x85\xcc\x36\x45\xaa\x48\xca\x11\xce\x4f\xff\x1e\x5e\x00\x9c\x44\x3b\xb3\x17\xcf\xa2\x3b\x2a\x4d\x88\xa2\x48\x02\xb8\xc3\x6f\x58\x46\x30\x75\xa3\x15\x3a\x1e\x76\xcf\x0b\xca\xf6\x4b\xd5\xb4\x8f\x32\x37\xeb\xf7\xd5\xc3\xf4\x61\x91\x84\x03\x0f\x25\xaf\x72\x0f\x85\xef\x92\x2f\x2d\x30\x21\x2c\x22\x69\x1a\x05\x63\xa1\x6f\x4f\x37\x4b\x42\x37\x8c\x30\x1f\xc0\x0c\x72\xed\x0e\x0d\x31\x1d\x94\x49\x04\x1f\x21\xee\x75\x8d\xba\xab\x01\x0b\xe6\xc3\x25\xc2\x63\x83\x6b\xcd\x21\x2f\xc3\xce\x73\x53\x6e\x02\x1a\x91\x11\x6e\x7a\xdd\x8e\x6d\xae\x5f\xa1\xfd\x20\xf4\x23\x42\x10\xa0\x61\x51\x0a\x0f\x7d\x69\xeb\x27\x42\x64\x08\x70\xbc\xe9\x6b\x8c\x1f\xb5\xf9\x3e\x0c\x60\x3f\xfa\xfb\xec\x8b\xa4\x96\x81\x7b\xfe\x51\xc8\x4a\x64\xaa\x5c\xcd\xa5\x7b\x0b\xbd\x7a\xfd\x74\x84\x8a\xb2\xde\x52\xa8\x1b\x74\xdf\x9b\xbd\x32\xa2\x28\xa1\x68\x7c\x27\x0f\x70\x87\xee\x42\x4e\x5a\xbf\xdf\x0c\xc2\x38\xc6\x44\x12\x84\x35\xc6\x36\xe6\x9f\x67\x4d\x44\x53\x88\xbb\xdb\x1f\x84\x32\x7b\xf7\x9b\xf9\x1d\xe8\x6b\x11\xd3\x2c\x84\x68\xe5\x54\xc9\x2e\xef\x6e\xc2\xb5\x68\x03\x76\x84\x1e\xdd\xca\xf2\xf5\x6f\x5e\x8d\x89\x0c\xb6\x79\x76\x3f\x21\xdf\x56\x57\x79\x39\x12\x6b\xf6\x43\x40\x65\xda\xa3\x29\xae\xab\xc2\x4c\x45\xb3\xc2\x18\x43\x51\xe2\xe4\x5f\x87\xaa\x84\x56\x4e\x96\x20\x6b\x12\xe1\xfa\x32\x58\xca\x3a\x7d\x28\x81\xc9\x92\x98\x28\xc4\x55\x6d\xeb\xfc\xd8\x0c\x39\x30\x4b\xe2\x54\x62\xdd\x76\x0d\xed\x03\x36\x0f\xbf\x8b\xb4\x3f\x26\x32\x24\x2a\x3e\xde\xae\xee\x37\xdb\x31\x30\xba\x3b\xe6\xea\x78\xd0\xbe\xac\xf3\xea\x57\x17\xaf\x93\x70\x8c\xc4\xd6\xd9\x8d\xfc\xcc\x5b\xfd\x82\xf5\x65\xec\x85\x3f\xa1\x0e\xe3\x43\x61\x7a\xe3\x59\x96\x90\x04\x70\xeb\xcc\x1b\x9f\x65\xdf\xf7\xab\x6f\x92\xa4\x19\x96\x4f\x64\xb7\x18\x78\xdd\xae\x71\x4d\x93\x25\x29\x75\xcc\x6c\x87\x85\x1e\x21\x11\x58\x92\x32\xed\x9c\x87\x06\x04\xbb\x08\x87\x84\x44\x4a\x8b\xb7\x88\x43\x50\xe5\x72\xa3\x92\x25\x94\xb8\x92\xa1\xb7\xb7\x6e\xbe\x42\x08\x78\x13\xca\xa4\xca\x46\x2c\xb9\xa7\x10\xde\xf4\x03\x14\x25\x3c\xd4\xc4\x1f\xa5\x57\xb7\x9f\x9d\xdf\xa6\x01\xa8\xd5\x0b\x7b\x3f\xd6\x95\x39\xe9\x76\xd5\xfa\x88\xa6\x59\xbf\xdf\x55\xc6\xaf\x87\x61\xe5\x4b\x98\x20\xd6\x37\x55\xd0\x67\x63\xdc\x3d\x66\x09\xe7\x8a\x25\x23\x24\xd5\x6d\x25\xcb\x27\x38\x16\x52\xc3\xe5\xe9\x58\xe4\xe8\x0f\xf5\x79\xec\x96\x88\x34\x51\x3a\xa0\x2d\x27\xc1\x7e\x22\xa4\x44\x95\xc3\xcb\xcd\xfa\xdb\xf5\xee\xee\xe1\xb2\x7f\x31\x32\xe9\x78\x29\x0e\xd3\x7e\x51\xbf\x3f\x57\xc5\x03\xa2\x7f\x9b\x7e\x88\x8a\x0c\x9f\x88\xae\x5e\xe6\x8d\xae\xe1\x28\x4b\xdd\x7f\x83\x8c\x12\xec\xee\xbe\xc0\x2f\x62\x40\xcf\x6e\x9b\x8c\x3c\x01\x41\x16\x6f\x23\xb4\x5e\x38\xaa\x09\x51\x61\x7b\x1b\xfc\xa6\x59\xa2\x12\x85\x96\x99\xc1\xb3\x79\xfb\x02\x07\x30\xcf\x47\xa4\xb7\x2e\xae\xc0\x89\xa6\x71\x58\x18\x51\x1e\xf9\xe0\xa8\x52\xc8\x8a\x3f\xbb\x7f\xd3\x49\xa7\x59\x84\x18\xe6\x27\x40\x46\xfd\xc4\xf8\x86\x25\x86\x11\x04\x74\x75\x53\x7f\x62\x4a\xfd\x37\xff\x0d\xa7\x91\x11\x56\xc7\x8c\x27\xba\x0c\xae\x2f\x1e\x7f\x39\x67\x6f\xb0\x04\x88\x53\x17\x77\x31\xb9\x33\x52\x76\xfb\xd5\x28\xb4\x1d\x4f\x18\xe0\x0c\xc5\xf5\x1f\xee\x37\xbb\xcb\xd5\xef\xbf\xf5\x7f\x76\x9d\xec\x91\x19\xec\x4b\x8d\x9b\x62\xc0\x49\xb3\x04\x44\x42\x22\xdf\xd1\xb9\x7e\x7c\x0e\x7f\xb6\x44\x7a\x81\xf9\xff\x3d\x35\x93\x54\xe0\xef\xf2\x8a\xc2\x89\xd2\x08\xef\x62\xf3\x7e\x8c\x67\x6f\x81\xa5\x8e\xe6\x8e\x42\x29\x6b\x68\xc7\x44\x2f\x96\x46\x34\xc3\x0f\xea\x02\x24\x46\xf5\x5d\x54\x86\xb1\x77\x09\xc3\x28\x12\xf1\xb8\x07\xbc\x21\x0a\x73\xc9\x3e\x37\x0c\x26\x0c\x23\x1d\x8c\xf1\x70\x0a\xff\x36\x1b\x20\x32\x7c\x56\xcf\xc8\xad\xcc\x2b\x73\xb3\x7d\xd8\x35\xcb\xc9\x50\x9a\x10\xc7\x69\xed\x25\xd5\xfa\xd6\xc3\x94\x48\xc8\xd2\xc4\x44\x4e\x7e\xb7\x0b\x12\x9b\xa1\x09\x79\x53\xea\xaa\xae\x41\x23\x74\x63\x1a\xdc\xa5\xa9\x31\x68\x71\xf5\xe3\x61\xfd\x09\xd0\x88\xa5\x94\x90\xac\x07\x5f\xe5\x65\xfb\x60\x67\x97\x49\x39\xc7\x32\xf8\x60\x33\xb8\x94\xa7\xa5\x54\x26\x08\xa4\x59\x6d\xb7\x4f\xbb\xc7\xa7\x87\xcb\x6f\x17\x37\xeb\xdb\xb0\x6a\xa4\x4c\x51\x6c\xbd\x06\x3f\xb2\x56\x16\x1b\x59\x0f\xea\xf9\x2c\x65\x56\x61\x8a\xb1\x29\x40\xb7\x75\xe5\xd4\x1c\xfc\x31\x4e\xb9\x74\x10\xcc\xd2\x6d\xb4\xdb\xea\x2b\xc0\xb1\x3f\x2c\x9d\x2b\xc9\xc8\xe7\x70\xb1\xc9\xce\x52\x11\x9b\xd4\x93\x5f\xd1\xd1\x6d\xf6\x5b\x05\x49\x11\x6f\x8b\xca\xa6\xd9\x38\x8e\x4f\x05\x75\x62\x85\x4d\x3f\x17\x36\x23\x9c\xeb\xfc\x3c\x99\x92\xd9\xa4\x73\xfc\xa9\xb2\xc6\x87\x6f\x7f\x2a\x74\x84\x19\x42\x09\xa7\xee\xce\xf5\xaa\x1a\x2c\x15\x96\x38\xcc\x06\x5e\xc3\x77\x59\xe7\x52\xcd\xb5\x49\x58\x9a\x31\xc0\xf0\x72\xab\xff\x9e\x33\x04\x4b\x33\x1d\x49\x4f\xda\x09\xed\x92\xe5\x4b\x93\xb1\xf3\x99\xc5\xf0\x2e\x84\x14\xa9\xcc\x5c\x3a\xbc\xdb\x1d\x2a\x33\xa6\x95\x87\xe3\x60\xb1\xfe\xa3\x4e\xef\x17\x0b\x12\xe6\x1f\xdc\x06\x69\x1d\x2b\xec\x0e\xca\x53\x44\x3e\x9c\x9f\x21\x00\xed\x56\xdc\xcb\xaa\x28\x64\xff\x02\xe9\x58\x64\xdd\xeb\x77\xbb\xbe\x18\xaf\xd1\xa9\x26\x90\x39\x30\x17\xca\xdc\xed\xbc\xb7\x59\x7f\x58\x26\x38\x9f\xf7\x55\x61\xd6\xf3\x1a\x6a\x18\x03\xfd\xcb\xf7\x03\xe0\xd5\x41\x8d\xa7\xd7\x65\x62\x07\x90\xf5\x7d\x4f\x5c\xa6\xd6\xef\x4f\x55\x31\xc1\xe3\xb3\xd4\x70\x70\x5d\x05\x5f\x60\x6d\x1a\x98\xaf\x30\x46\x3a\x73\xe9\x1d\x2e\x6b\xde\x19\x1c\xd7\x22\xa8\xcf\xbe\xd6\xc4\xc8\x3e\xbb\xe8\x13\xe9\xe5\x0a\x52\x0a\x42\xeb\xb8\x07\xe0\x5d\xbc\xc8\x6e\xf1\x39\x3f\x9f\x4d\x9d\xad\xd3\x23\x04\x0e\x49\x33\xb9\x99\xd6\x48\x8c\x0c\x0e\x79\xd9\xa3\x0a\x59\x6a\xad\x45\x39\xbb\x4b\x90\x45\xb7\xfc\x16\xf0\x11\xf0\xa9\x6f\x57\x9e\x1b\xcd\x30\x1a\x89\x04\x55\x64\x76\xdd\x4d\x2c\x75\x0d\x26\x6f\xc1\xe0\x92\x35\x2b\x46\xd2\x48\x31\x6c\xca\x7b\x7f\x9d\xc7\xbe\x58\x43\xe3\x2e\x83\xf3\x01\x75\x71\x32\xdd\xa1\xa6\xe7\x1a\x30\x1a\x1b\x1d\xc3\xd0\x60\x5f\x7e\xf1\x29\x49\x88\xf5\x59\xac\xac\xf7\xbb\x64\x97\x97\xc7\xd3\xec\x39\xd1\x34\x05\xf4\xb0\x40\x02\x0d\x42\x29\xef\x57\x37\xb7\xbb\x8b\x87\x60\xab\xcb\x68\xaa\x38\x62\x21\x56\x6d\x5b\xd5\xd0\x5c\xe6\xfb\x1c\x9d\xec\x82\x71\x2a\xcc\x7f\x17\x8d\x04\xfe\xae\x43\x5e\x0e\xa6\x07\x8c\x52\x16\x21\x54\x74\x5f\x4b\x0d\x6e\xdb\xc1\x39\xd9\x1f\xb7\x91\x71\xf5\x94\xe3\xfb\xaa\x28\xbe\x1c\xd5\x7d\x65\xba\x98\x13\x91\x17\xdd\x93\x9a\x5e\x3a\x33\x5a\xb1\x89\xc0\xf5\x00\x4f\x66\x94\x27\x6e\x9d\xbf\x83\x5a\x9f\xea\x91\x71\x78\x38\x4e\x21\x1d\xec\x05\x46\x36\xcc\x93\x65\x86\x72\xe1\x84\xf3\x7e\xf6\x10\xf6\xa1\x91\x3b\x2a\x64\x50\x91\xc5\x28\xae\xf4\x58\xc8\x49\x74\x45\x85\x12\xaa\xf7\xb5\x58\x10\x32\x58\x02\xc9\x32\x9a\x45\x19\xa5\xfd\xd5\x7d\x39\xa7\x6e\x31\x9a\xc5\xaa\x2f\xf6\x5f\xc9\x1c\xe1\x72\x3f\x5e\xba\x34\xb6\x3a\x1e\xc1\xfc\x36\x1d\x2c\x28\x96\x68\x7b\xe9\x52\xd7\x9a\xbb\x9a\x21\x1d\x19\xcd\x0c\xe5\xc9\xa8\xd9\x1a\x80\xce\x1f\xbc\x63\x32\x25\xd4\xc1\x9d\xf5\x73\x3f\x95\xa8\x34\x4c\x3b\x7b\x90\x37\x28\xbe\x1d\x2f\xe4\xc4\xca\x7e\xda\xed\x67\x54\x45\x0e\xcb\xff\x9c\x97\xfb\x53\x81\x0c\xe5\x2d\x34\x6d\xb0\x7f\x61\x54\xf3\x4c\xf9\xd2\x0a\xd6\x0a\x2f\x65\x2b\x3d\xfd\x72\x5a\x8a\x99\x54\x64\xa8\xd6\x2c\x18\x66\x5f\x6e\x6a\x4d\x22\x2c\xb4\x61\x16\xb8\x29\xbb\x4d\x68\xea\x34\xce\xa8\xd1\x11\x86\x22\x9b\xd2\x04\x0a\xe8\x7c\xb9\x9f\xde\x2c\x50\xce\x35\x76\x8f\x20\x99\x57\xb4\x65\x1a\x9a\xaf\xd4\x1a\x92\x8c\x4b\xaa\x5e\x80\xbc\x5a\xa4\x5f\x33\x6a\x21\x4a\xbc\xf9\x5a\xf7\xd7\x1b\x1d\x62\x57\x16\x11\xe5\xb4\x2b\xd1\x5a\x15\x17\xc9\x27\xc0\xc8\xeb\xb6\x9b\x7e\x6d\xe0\xb6\xdd\x57\xed\x48\x25\x92\x61\x1b\x34\x1d\x3a\x51\xe7\x56\xda\x8c\x45\x99\x42\x9a\xd4\xce\x41\x55\xce\xf6\xba\xd9\x4d\x65\x91\x22\xc4\x91\xa2\xdf\xa1\xc6\x88\x62\x76\x3e\x95\x84\xba\xcb\xf3\xe9\x70\x53\xae\xdf\xfb\x16\x79\xb8\xcf\x2c\x52\x0a\xcb\x57\x2e\xec\x5f\x15\x05\xaa\x3b\xcd\x7a\xad\x67\x3d\x00\xb1\x58\xf1\x65\x91\x56\xd6\xb5\x0e\x51\xfb\x07\x74\x3e\xec\x8b\x2c\x8e\x22\xdc\x4e\xdd\xe4\x9b\xa5\x21\x61\x4c\x46\x02\x03\xe3\x56\x36\xed\xea\x64\xf2\xf6\xb2\xd2\xa7\x6e\xac\x3c\x83\xb2\x30\x46\xb8\xc0\x18\x0f\x5f\xee\x1d\xdf\xc9\x71\x21\x80\x11\x01\x48\xfc\xfc\x09\x79\xe3\xf1\xcd\x33\x4e\x2f\x63\x49\xa4\x02\x83\xd6\x63\x99\xe5\xec\x9a\x92\x84\x72\x67\xa1\xd2\xa0\x96\x7b\xae\x0a\xac\x54\xdd\xc1\xe7\xf2\x67\x0b\xe1\x92\xdb\xa3\x66\x17\xa0\x52\xed\x42\xa2\x93\x19\x19\xef\x31\x96\x46\x02\xfc\x95\x39\x0d\x82\xaf\xf0\x3e\xc9\x56\x58\xca\x05\x62\xcc\xee\xe1\x54\x57\x97\xab\x87\xe5\x6a\x05\x4b\xb9\x92\x7a\xa2\xd1\xee\x8c\xce\x67\xbf\x93\xc5\x2e\x31\x85\xf6\x65\x57\x07\x8f\xab\x70\x8c\xa7\x09\xed\xf5\x5f\xba\x6c\x90\xce\xee\x23\xb3\x1a\x9b\x04\x2f\x55\x61\xf2\x72\xdf\x3c\xd8\xdd\x7a\x33\xd3\x8f\x62\x8c\x27\x29\xa2\xd1\x64\xd3\x40\xdd\x6e\xfe\x1b\x53\x0f\x1c\xa7\xff\x98\xfc\xdb\xbf\x9e\x42\xa6\x58\xbe\x73\xec\x67\xef\xd6\x04\x8f\xb2\xd6\x50\x34\x73\x72\xf7\xbf\xff\x33\xbb\xb7\x99\xd6\xa1\x1a\x72\x55\x03\x60\x2c\x56\x7f\x80\x81\x60\x19\x44\x18\x25\x1d\xf2\xbd\x23\x21\x04\x90\xe9\xa8\x0c\xc9\x14\x75\xca\xdc\xd8\xed\x77\x77\x33\x1f\xfc\xd5\x19\x53\x59\x82\x72\xd8\x5d\xee\x7e\x55\xd5\x4f\x70\xac\xea\xb6\x4b\x24\x07\x45\xde\xdf\x96\x16\x6f\xa6\x23\x87\x53\xda\x9d\xca\xee\xb3\xc1\xdb\x2f\x9c\xd7\x88\x34\x92\x13\xa1\xc9\x74\x22\x34\xc9\x98\xb1\x24\x09\x6e\x79\x79\xf9\x3a\xee\x27\x31\xa0\x31\x32\xb9\xaa\xa6\xc8\x5f\xc7\x3b\x22\xb3\x29\xc5\xbd\x6d\x2d\x9b\x5c\x93\x64\x30\xa1\x5c\xbe\x47\x96\xf1\xc4\x99\xae\x38\x0d\xae\x97\xbc\x30\x53\xb1\x5c\xc6\x23\xe2\xb4\x03\x43\x75\xba\x99\x2d\x4b\x3c\x4a\x9c\xd4\xe5\xfe\x73\xb3\xcd\x30\x9a\x47\x48\x0a\x38\xe4\x06\x2b\x37\x18\x2b\x8f\xfb\xd4\x3c\xd2\x8e\x15\xbe\x2e\x4e\x5e\x6f\xac\x3f\x02\x31\x16\x8d\xdd\x7a\x7a\x0b\x7b\x28\x8d\x1c\x3a\x2a\x4b\x6b\x18\x8f\x23\x57\xdf\x6c\xba\x05\xe1\x0d\x42\x08\xbf\xd0\x63\xe1\x31\x75\x22\x8b\xeb\xca\xbc\x3f\x94\x0b\xaa\x0b\x8c\xc7\x4a\x38\x31\x6a\x94\x2e\x79\x18\x43\xbb\xfe\x9d\x2c\xf3\x82\x45\xf8\x28\x58\xd4\x88\xdf\xd7\xfb\xd9\x49\x49\x42\x62\x3a\x42\x34\x76\xd9\xf1\x6f\xd3\x96\xf0\xe2\x1e\xc9\x09\x08\x8c\x10\x6e\xab\x7d\x40\x03\x2f\xe8\xc1\xcd\x3e\x63\x63\xac\xf7\xa1\xcf\x0d\xba\x90\x7a\xa0\x81\x3f\x9e\x44\x19\x32\xc5\x65\x51\x5c\x9f\xae\xf3\x37\x28\x77\xfd\x21\xe1\x70\x8c\xeb\x53\x5d\xf6\xf4\xa2\x3e\x11\xa3\x91\x2f\x3d\xf1\x34\x33\xd8\x78\xfd\xe3\x61\xac\x83\xc9\x38\xd5\x16\x4b\x27\x77\xf2\xd7\x5f\x91\x9f\x18\x67\x59\x96\xd8\xb1\x8d\x57\xef\x22\x38\xfd\x3d\x3c\xd1\x12\x7a\xab\xd7\x43\x35\x4b\x58\xc3\x28\x50\xe0\x59\xe7\xf9\x7e\x2c\x9a\x37\x79\x52\xcb\x75\x75\x2e\xd2\x14\xb9\x88\x9e\x77\x76\x97\x8f\xfa\x41\x5c\x68\x82\x31\xe8\x97\xca\x14\x9b\x99\x6b\x16\xe3\x59\x94\x62\x79\x0a\xe9\x7a\xcb\x93\x90\x67\xd4\x39\x18\x35\xa8\xf7\x7b\xa6\x10\xcb\xb8\x64\x0c\x17\x7c\xe7\x9c\x8c\x59\xcf\x07\xa7\x52\x09\xb3\xfe\x66\x5c\xe5\x8d\x96\xc5\x77\x27\xe7\x3d\xfd\x3d\x2a\x71\x5d\x0b\x17\x23\xe0\x2c\x1c\x97\x39\xb8\xe2\x19\xba\x91\x0d\x52\xfc\x4f\xe8\xed\xf6\xf9\xcb\xa8\xc0\x71\x16\x9f\xbf\x7d\xdf\x6d\x7f\x7f\x0c\x55\x1f\xae\x23\x8a\x40\xc8\x12\x7e\x3e\x56\xe5\x9f\xf9\x55\x9d\xcf\x01\x9b\x8c\x6b\x22\xe8\x98\x60\x84\x4f\x7a\x96\xfb\x70\xcd\x00\x17\x63\xd7\x50\x7e\xca\x4d\x0f\x66\xe3\x9a\x83\x91\xfd\x1a\x84\xaf\xf5\x7a\xce\xff\x63\x1c\x48\x8a\x5b\x82\x85\x2e\x47\xd2\x72\xdc\xdf\xe7\x90\x51\xa4\xfa\xdc\xaf\x36\x17\xfd\xdf\xa4\x23\xf5\xfe\xd8\x3c\x3f\x4f\x5e\x65\x00\x67\x4f\x78\xac\xf3\xb7\xbc\x80\xfd\x20\xb7\x7d\xdb\xcb\x9a\x31\x6e\xb3\x2c\x92\x53\x9b\xb5\x6f\xcf\xf3\x8b\xb2\x0a\x10\xf1\xba\x2a\xab\xee\x49\xb8\x89\x8c\xdb\xe3\x3c\xb8\x11\x51\x2a\xa5\x09\x7d\x64\x0c\x6d\x66\xc7\x81\xa2\xb0\x07\x1c\xf2\xf6\x9f\x95\x42\x2c\xc3\x4a\x6b\x38\x2e\x64\xdb\xfe\x23\x71\xa2\xa9\xeb\xc3\x15\x05\xd4\x37\x66\x5e\xda\x10\x71\x2a\xb0\x88\xbb\x3b\xd6\x7d\xb3\x6d\xc1\xa8\xa8\x1b\x98\xe1\x23\xd8\x3e\x3d\xdc\x5f\xdc\xae\x9e\x9f\x6f\xc2\x6d\x14\xb1\x8c\xb0\xc7\x83\x2f\xf0\x73\x70\xf0\x5c\x1d\xf3\xaf\xf0\x3e\xd9\xf5\x04\x89\x5c\xdf\xff\x0f\xa8\x2b\x74\xae\x19\xdf\x75\x41\x22\x89\xc5\x0c\xb7\x50\xde\x74\x29\xf7\x38\xc0\x9b\x4e\x06\x91\xa4\x2c\x8e\x46\xdd\x91\x4d\xa3\xe5\x71\xc2\xa6\x4e\xc8\x3f\x46\xd9\xe6\x24\x73\x12\x09\x8b\x31\xd8\x86\x5f\x79\xd3\x36\xcb\xa5\x44\x91\x80\x9b\xde\x3f\xbe\x7c\x9b\x5c\x68\x4a\x94\x1e\x54\x53\xee\x2b\xc4\x5d\x0e\x2b\x3a\x4b\x7d\xd9\xaa\xfb\x1f\xe1\x23\xd4\x3a\xdc\xe1\x0b\x5c\xbc\x2b\xa8\xaf\x65\x0b\xaf\x00\x47\xa8\xb7\x3f\xab\xfe\xbc\x8c\x83\xd3\xac\x28\xf2\xb7\xde\x12\x66\xfa\xb3\xd3\x4c\xa2\x89\x1d\xda\x9a\x77\x51\xff\xc5\x4b\x35\x77\x6f\x60\x68\xc9\xe6\x27\x0c\x16\x5b\xf3\xaa\x1c\x55\xf4\x05\x25\x16\xbb\x37\x0a\x43\xa2\x49\x5b\x48\xb0\x04\xd0\x43\x24\x2f\xcf\x15\x36\x67\x8f\x80\x71\x8e\x85\x80\xb6\x3e\xc1\xec\x24\x19\x38\xb0\x18\xc2\x2c\x8b\xaa\x01\xd3\x3b\x9f\x87\x31\x42\x51\xeb\xb5\x51\xef\x7a\x86\x40\xb3\x7e\xdf\xbe\x1f\x67\xeb\xbb\xc8\xb8\x46\x25\x45\x5f\x00\xef\x17\x06\x91\x49\x8a\xd5\xbb\xe3\xa9\x9d\x3c\x21\x29\x04\x42\x32\x7a\x3b\xc9\xeb\x5a\x1e\x61\x7d\x7a\x77\x2a\xc1\xb3\xd3\x1b\xa2\x30\xe0\xfa\x03\x4e\xe3\xc6\xaa\x30\x34\x11\xc9\x8c\x17\xd9\xc5\x4f\xe3\xb9\xb9\xdc\x9b\x1f\x17\x44\x85\x01\x6b\xa2\x00\x58\x3c\x54\x6f\xce\x05\x07\x35\xff\xfc\x0f\xba\x69\xe1\x70\x6e\x3d\xfd\x21\xa1\x81\x09\x63\xb9\x33\x5d\x2d\x5a\xa8\xaf\x00\x3b\x59\x66\x9a\xd8\xfb\x91\x90\x68\x44\xcf\x6c\xaa\xe6\x31\xff\xf3\x4f\xf9\x5c\xe4\x1a\x50\x4a\x66\xfa\xc6\x80\x72\x44\x3b\x67\xb4\xe7\xf0\x54\x1f\xcc\x3c\x4b\x28\xa6\x05\x37\xba\x2a\x3f\x60\x33\x31\x61\x33\x8d\x4b\x3e\xa2\x52\xf2\xa6\x75\xdc\xd0\xa5\xbe\x42\x16\x09\x95\xd8\x91\x7c\x63\x80\xa5\xdd\x82\xd9\x43\xbd\xda\x7e\x7e\xab\xc3\x6c\xcd\x22\x61\x91\x49\x7b\x75\x75\xfd\x59\xe8\x91\x45\xc6\x79\x36\x5c\x40\xf7\xca\x15\xc5\xfb\x4d\xb7\x7b\x9b\xf1\xfb\x93\xc5\xb1\x73\xe5\xde\x16\x7a\xf4\x42\x64\x71\xe2\xf1\xbe\x2f\x75\x55\x1d\xa0\x7e\xbf\x92\xf5\xa1\xcf\x99\x33\x22\xb5\x18\x9b\x1c\xf6\x6a\x71\xf7\xd5\xd4\xca\x8e\x65\x09\x03\xe3\x7a\xe6\xd8\x93\x3a\x3a\xe3\x13\xc4\x97\xe3\xaf\xf2\xc1\x8a\x18\xf9\xd3\x8c\x5e\xac\x0f\xf8\x18\xff\x19\xbf\x76\x19\x4d\x01\xc5\xd6\x7b\xf6\xdd\xe4\x29\x66\x2c\x8d\x82\xfe\x1c\x32\x5c\xff\x4f\x5d\x8b\x8c\x89\x08\xd7\x6a\x69\xcc\x6a\xed\x3f\xfa\x01\x9b\x30\x7c\x02\x20\xf8\x83\x77\xb7\xda\x38\x37\xf3\x2b\xc0\xc6\xf1\xf9\x86\x93\xf1\xc4\xe1\x59\x9f\xbc\xdd\xfb\xa1\xdb\x31\xca\x72\x70\x94\x5b\x8e\x80\x33\x41\x15\xf8\x65\xa5\x5b\x23\x9f\x65\x21\x83\xaa\x1f\xcb\xb2\x54\x61\x75\xe0\x29\xf8\x0b\xb3\x2c\x13\x29\xfa\xb8\x75\x67\x19\x97\x80\xb2\x4c\x32\x6a\x7b\xbf\xf9\x49\x2e\x9f\x49\x2d\x42\x47\x00\x81\x8e\x50\x6a\x08\x12\xc7\xcb\xc1\x5b\x26\x6d\x6c\xbd\xc6\x7b\xde\xbc\x84\x77\xfd\x1a\xfa\x73\x2a\x42\xac\x73\xe0\xec\x21\x5d\x5e\x5b\x1a\x55\x0f\x47\x7a\x0a\x2c\x53\x89\x45\xf0\x5d\x8f\x89\x6b\x7c\x55\x6b\x56\xc7\xca\x34\x4b\xb0\xee\xaf\x64\x40\x49\x6e\x6b\xe9\xb5\xaf\xc5\xbf\xc9\x7f\x46\xba\x47\xe9\x7f\x46\xaf\x12\xff\xcf\x90\x9e\xff\x9b\xfd\x27\xec\x63\x99\x16\x8e\x8f\xae\x4e\xef\xe1\x71\x4c\x9e\xb2\x49\x13\x0c\x77\x7c\x7f\x23\x70\xe7\x6f\xbf\x6d\x67\x8f\xd7\x70\x41\x87\xf5\xe6\xae\x32\x0b\xec\xf1\x6e\x94\xc1\x39\x8d\x2f\xc8\x2d\x48\x93\x97\xfb\x2e\x78\xf8\x60\x69\xca\x20\x02\x44\x48\x07\xe9\x65\xbf\x2b\x2d\x06\x47\x99\x8d\xb5\xdb\x3c\x5c\x8b\x60\xf0\xb5\xcc\xab\xd2\x8b\x25\xf9\xdb\x28\xa3\xd4\xad\x19\x85\x6c\xba\x07\x5e\xd7\xb2\x68\x10\x43\x1f\xb2\x27\x19\x73\x8b\xb1\xe4\xa1\x32\xb9\x7d\xc7\xce\xe3\xc5\xa0\x92\x36\xbd\x4c\x19\x7b\xfb\xef\x2f\x50\xe4\xd5\xa4\xc3\x22\x09\x58\x2c\x0c\xdc\x94\x06\x0e\x65\xde\xe0\xd5\x04\xe7\x06\x26\x89\xcd\x84\xec\x4b\x3b\x4d\x55\xca\x02\xb5\x9c\xae\x7a\xef\x61\xf8\x60\x45\x96\x49\xcc\xe3\xe1\x8e\xaf\x8a\x62\xd5\xb6\xde\xd4\x0d\x45\xd4\x2f\xaa\x02\x43\x05\x35\xdf\x1f\x65\x92\x48\x04\x3e\x3e\x55\xa7\xd2\xac\x07\x95\x14\x26\x13\x9e\x60\xee\x94\x97\x23\xa9\xeb\x99\xb0\xc6\xec\xb7\x27\x3a\xc3\x66\xf3\x8d\x3d\xcb\xd2\x26\xeb\xb9\x4c\x20\x42\x0a\x4f\x20\xe0\x98\x78\xe0\x1c\x33\x99\x46\x80\xe0\x98\x9d\xfb\x39\x9b\x5f\xd8\xed\x99\x85\xd4\x32\xb5\x0c\x17\x83\xbb\x87\xbb\xf0\x41\x1a\xd1\x20\x76\xd8\xdd\xb5\xd9\x4f\xa5\xdc\x89\x5a\x76\x97\x82\x3b\xb4\x0f\xec\xe2\xf1\xd2\x2a\x29\x38\xc7\xc2\xbe\xd8\x17\x2a\xb0\xcb\x77\x9e\x5a\x8b\x19\xb3\x4b\x14\xbc\x60\xda\x78\xda\x48\x16\x6b\x54\x9b\x39\x80\xc9\x75\x15\xc2\x1b\xc9\x98\xd1\xbe\x4a\xfe\xbd\x6a\xe1\x09\x9a\x53\xd1\x07\x50\x92\xab\x0c\xfb\xfa\x07\xf9\x6b\xcc\x6a\xbc\x19\x55\xb8\xa4\x30\x32\xe1\xbd\x0b\xfd\x0f\x04\xc9\xcc\x42\x4a\x99\xc5\x12\xc3\xdc\x67\xf4\x40\x58\xda\x5b\x65\x96\xa6\xa8\xd6\xf7\x03\x8a\xe2\xfd\x51\xf6\xa7\x97\x09\x45\x2e\xc5\xe3\xb7\xf5\xed\xcd\xc5\xee\x79\x75\xbb\x79\xde\x91\xdd\xe3\xe6\xe9\xe6\xe1\x72\xb7\xe9\x57\x59\x29\xa9\xb3\x35\x40\x41\x38\xd5\x54\xc5\xa9\x85\x40\x2d\xea\x53\x53\x29\x99\xc6\xd6\xf2\x63\x72\x39\xf5\xdc\x66\x52\x25\x4e\x3b\xf1\x69\xf3\xbc\x79\xfa\xbe\xb9\xdc\x6d\x1f\xbe\x6e\xee\x9f\x77\x57\x0f\x4f\xbb\x9b\x8b\x87\x1d\x5a\xb1\x6d\x9e\xfb\xe1\x56\xa3\x6e\x61\x77\xdb\xa6\x5d\xa7\xd9\xb3\xd1\xca\x31\x12\x43\x1a\xe1\xaa\xf9\x23\x60\x50\x18\x07\x99\x0a\x4e\xce\x17\x0f\x3f\x00\x5e\xe3\x85\x3e\xb0\x04\x6a\x21\x54\xcb\x86\x22\xe2\x42\xa5\x4c\x82\x56\x59\xf7\xc5\xbb\xc2\x09\xcf\x4e\x6b\x26\xcb\x2f\x92\x65\x4a\xfa\x3e\xc7\x25\x7c\x84\x77\x93\x56\xc6\x98\x19\xa1\xd3\x74\x2d\x47\x70\x36\x15\x09\x42\x44\xef\x6f\x13\x80\xf9\xb3\x49\xa0\x22\xe5\x18\x8b\xba\x2a\xf7\xa3\x67\xa0\x22\xab\xf1\x92\x11\xee\x82\xd2\x74\xd8\xd1\x9c\xbc\xca\x2a\x4e\x29\x06\xcd\x9b\x3f\x9d\xd5\xbc\xff\x33\xe1\x49\x16\x87\xcf\x0e\x2d\xc5\xcf\xa2\x0d\x11\x3e\xaa\x00\x1b\x6b\xdd\x63\x7e\x5a\x6d\x37\x01\xa4\xa8\x12\x6a\xb9\x23\xac\x4b\xb3\x3b\x05\x35\x38\xa6\x52\xc6\xc6\x9e\x72\x3f\x64\x5f\xff\x52\x29\xe3\x03\xfc\x15\x25\x0a\x97\xa8\xc9\x4c\x51\x70\x75\x1f\x23\x5b\xf9\x8c\x22\x59\xc1\x8a\x10\x17\xc1\x07\xfb\x9c\xff\x6a\x01\xa6\xcd\xbd\x70\xc1\xcc\xb3\xc9\x57\xa5\xec\x3b\x51\x8a\x81\x76\xee\xe3\x2f\xd5\xcf\x5b\xd9\xb4\x53\x47\xfd\x30\xc8\xa6\x98\x89\xb8\xda\xcd\xdd\x74\x62\xcf\x9e\x12\x8f\x53\x07\x9b\xfe\xad\xff\x83\x93\x47\x6a\xa0\x5d\x9d\xda\xea\x1e\x7e\xaa\xaa\x34\x83\x2e\x10\x53\x9c\x39\x07\xf4\xbb\x53\x17\x83\x04\x74\xcb\xec\x1a\xb8\x12\x98\x5b\x34\x3d\xb4\xcf\xc3\x84\xa7\xc3\x84\x70\x1e\x88\x0d\xb4\xb7\xb7\xdf\x77\x60\xf2\x76\x17\x47\xd3\x77\x41\xd8\x48\x06\x82\xf7\x40\x2d\xed\x2f\x38\x4b\xa9\x0a\x89\x51\x77\x57\xc7\x52\x92\x4c\x49\x9e\x25\x43\xe9\xcf\x15\x9e\x1d\x69\x71\x79\x57\x55\x2a\x56\xe8\x85\x71\x84\x3d\x46\x50\x7f\x0f\x79\xbc\x1c\xe0\x2a\x15\x03\x6a\xce\xb6\x95\xdf\x17\x67\x77\x5f\x51\xe9\x48\x54\xa7\x77\x07\xe2\x98\xde\x1d\xc5\xe3\xe0\x58\xe0\x11\x1c\x50\xe3\x6f\x0c\xbf\x4e\x09\x8b\x0b\x33\x32\xa1\x67\x5e\xbb\xd3\x6f\xd2\x24\x49\x44\xd0\x22\x6e\x4e\x87\x81\x71\xcb\x94\x49\x01\xa9\x39\xdd\x57\x04\xad\xc6\x8f\x40\xe3\xd3\x0b\x34\x20\x31\xe9\x3a\x56\x4d\xeb\x42\xc2\xcf\x44\xe7\x99\x82\x24\x13\x4e\x7b\xca\xbb\x1f\x5e\x55\xf5\x99\x5a\x3e\x53\x40\x5d\x5f\x37\x6f\x3c\xf0\xe2\x21\x44\x36\x0a\x24\x20\xd0\xc9\x54\x3d\xaa\xfb\xa3\x47\xf1\x69\xd9\x41\x59\x65\x52\x9f\x49\x20\x65\xe3\x71\xd0\xe3\x3b\xbb\x7b\x3a\x22\x20\xc4\x28\x8a\x18\xa4\x6c\xfc\x00\x92\x18\x84\xbc\x6c\x8a\xbc\x85\xe7\x97\xfc\x78\x0c\x2e\x29\x9f\x24\x91\x9a\x28\x9a\x18\x34\x2c\xc9\x0f\x7a\x5e\xc9\xd2\x04\x04\x8a\x87\x4b\xac\xce\xcd\x17\xf5\xa5\xdc\xcd\x7f\x30\xd1\x10\xca\xdd\xdf\x57\x6d\x75\x70\xb1\xfc\xd2\x05\xa4\x94\x62\x64\xd3\x4d\x2d\x72\xeb\x4c\x17\x46\xad\x2f\x4d\xb9\xc5\xec\x4f\x25\x64\x5b\xad\xdf\x7b\x81\xd4\x70\x38\x4b\x63\x34\xf8\x7a\xbe\x9c\x5c\x39\x55\x3a\xee\x99\xc8\x61\x81\x30\xbf\x9d\x66\x2a\x87\x4c\x33\xcb\x98\x27\xc3\x3c\xe7\xc5\xdb\x47\x1c\xf8\xe5\xd8\x4e\x0b\x9d\x66\xf1\xb8\xfc\x0f\x35\x16\x0a\x7e\x3b\x27\xba\xe8\x2c\xe3\xb8\xca\x23\x33\xab\x3d\x29\x64\x7f\x84\xeb\x95\x09\x51\x34\x4c\xa3\xcd\xaf\xbc\x99\xee\x46\x5a\x45\x09\xf6\x3b\xbe\xde\xac\x6f\x9e\x77\x93\x9f\xaa\x68\x12\x7b\x2a\x08\xee\xd5\xa5\x73\x92\xbc\x5d\xe8\xa7\xcd\x9e\x92\xa2\x1a\xb1\xb4\x16\xba\x08\xf2\x2a\xaf\x9b\x76\x55\x23\x8e\xc1\x2d\xea\x13\x43\x04\xa6\x95\x24\xa1\xb1\xbf\x2a\x8a\xf5\xe9\x7d\xa0\x14\x6a\x4d\xa5\xc3\x7d\x42\xd3\xde\x34\x0f\xa8\xec\xf0\x28\xf3\xfa\xc9\x87\x23\x0b\x00\xef\xcf\xaf\xcd\xf0\x58\x41\x1f\xf0\x29\xa8\x1f\xac\x93\x04\xee\xbf\xd2\x28\x89\xa1\x91\x3c\x1e\xa1\x9c\x32\x90\x35\x44\x04\xa1\xfc\x61\xb6\x7c\x46\x43\xd7\x20\x12\x32\xf0\x02\x9f\x5b\x59\x3b\x10\xfb\x07\xa3\x33\x81\x71\x77\xcf\x1f\xad\xca\x99\x2f\x0f\xd3\x60\x53\xac\x49\x04\x8b\x21\x17\x47\x26\xbb\xe7\xed\xea\x6b\xe8\x38\x68\x1b\x03\x62\x43\xae\xa1\x5b\xe4\x47\xe5\x19\x13\xc5\x9c\xf0\x60\xfd\x8a\x30\xfe\xad\xfc\xf5\x28\x6b\x79\x80\xf6\xc3\x4e\xb2\x89\x84\x53\xc9\xc4\x82\x01\xa6\xd3\x41\x69\x97\x99\x48\xa5\x18\x1d\x7a\xd0\x60\xe3\xed\x33\x5c\x53\x7d\x34\x08\xfb\x0e\x75\x37\x28\x19\xa5\x47\x26\x26\x89\xc7\xff\x62\x6b\xe9\x13\x00\xb0\x89\x25\xf3\xb2\xa9\x48\xdb\x0b\x7f\x26\x49\x9c\x26\x23\x88\x85\x2f\xf7\x87\x2e\xc8\xb4\xf5\x63\x08\x73\xb6\xbc\xae\xc9\xd8\x6d\x5c\xb2\x85\x5a\x16\x8f\x55\x35\x55\xc4\x64\x86\x80\x23\x6d\x7c\x79\xb8\xbd\x44\xf0\xda\x20\x03\xcd\x0c\xb1\x80\xc5\x3b\xcf\x9a\x44\x39\xc6\x2e\x6e\x1b\x6c\x1e\x98\x49\x28\x18\x4f\x12\x70\x1d\x9b\x59\x7c\x62\x12\x49\x94\x08\x4d\xf0\x5e\x78\xf1\x62\x26\x1d\xce\x4c\xa2\x6d\xe4\xca\xfe\xf2\xcf\x77\x90\xf5\x79\x86\x62\x12\x9b\x2a\xee\xc0\x0e\x4f\xb2\x85\x6f\x4f\xb7\xe1\x2a\x52\x9d\x62\xd3\xe8\xdb\x7a\x7b\xd1\xff\x0d\x94\xe5\x7e\x4e\xed\xb0\x55\x3e\x26\x04\x9a\xd4\x02\x36\xb4\xdf\x72\xf0\x58\xae\x27\x38\xc8\x7c\x04\x54\x36\xa9\xb5\x38\x2b\x91\x9d\x59\xcc\x6f\x1d\x8d\x05\x96\x4a\x51\x76\xde\xa9\x50\xdd\xe5\xf3\xce\xa5\xa1\x49\xca\x32\x2f\x54\xfb\xe8\x9e\xff\x66\xfb\x25\x7c\x03\x4d\x2d\x66\x90\x18\xa8\x74\x7b\xd2\x9d\x93\x18\x0e\xf4\x93\xcf\x44\xed\xfe\x6a\xbb\x0c\x5f\x91\x65\x19\xeb\xa9\xa2\xde\xcc\x33\xaf\xc6\x64\x7e\x43\xf5\x60\xa6\x26\x9b\xe6\x58\xd5\xed\x6d\xb5\xcf\x75\xa0\x8f\x87\x71\x4c\x0b\xe9\x23\xb5\xad\x2c\x5f\xc7\xd0\xf8\xfe\xe5\x63\x3a\x73\x16\x8c\xd2\xf3\xca\x7a\x55\x4b\x3f\x80\xa7\x11\x86\x3c\x23\xd4\xe1\x79\x0f\xde\x08\xe9\xb2\x51\xef\x2f\xe3\x31\x24\xbe\x20\x1d\x76\xd0\x64\x5c\xab\xea\xff\xe3\x33\xfb\x42\x66\x32\xe2\x84\x0b\x8a\x2e\xf8\x96\x45\x31\xd6\x89\x09\x43\x54\xa4\xa9\xa7\x1b\x9c\x13\x43\xfa\x2d\xc9\x74\x73\x35\x72\x34\xb8\x21\x18\x33\xca\x4a\x94\x56\xba\xbc\xb9\x9f\x90\x76\x8d\x16\x02\x4b\x7f\x48\xdf\x36\xb0\xfd\xd7\xff\xad\xd8\x6a\xb4\x70\x24\xd2\xa3\x5b\xd4\xbc\xaa\x16\x4e\xea\x30\xc2\x67\x6c\xf8\xca\x87\x54\xb6\xdb\xcd\xaa\x53\x3b\xc0\x4d\x07\x5e\xaa\x31\x51\x12\x72\x85\x27\x30\x00\x87\x05\xac\xbc\x31\xd4\xc5\xc0\x5d\x26\x50\x35\x0d\xc6\xaf\x23\x4e\xe5\x30\x10\xb2\x0c\x39\x5c\xcf\xd0\xfa\x18\x7e\xf9\x87\x80\x4d\x94\x7f\xdd\x2e\x4f\xaf\x4e\x8a\x72\xbc\xff\x18\x9b\x98\x60\x74\xec\xe4\xe7\xf1\xb9\xdf\xe5\xe5\xb5\x6c\xee\x01\x4c\x8f\x71\x82\x18\x28\x32\x5b\xef\xe5\x21\xc7\x14\xd6\xff\x9d\x30\xe7\xa1\xe7\x37\x25\x94\x55\xf2\x0d\xcd\x0f\xe4\x43\xc2\x07\x75\x1a\xe9\xa1\x3c\x66\x6d\x5e\xe4\x67\xb0\x7f\x48\x22\x86\x8b\x55\x09\xbf\xda\xab\x02\x7e\xe5\xaa\x00\x1f\xbd\x87\x11\x44\x2b\x6f\xeb\xf4\xec\x4c\x95\xaf\x5c\x3f\xfa\x23\x1d\xf5\xee\x23\xce\x52\x09\x65\xd7\x50\x5c\x77\x59\x0d\x01\x12\xa6\x5d\xca\x77\x04\xd0\x2f\x0f\xf6\xdc\x5f\x89\x41\xc2\x9d\x56\x5a\x1b\x60\xaa\x57\x88\x80\x0d\x47\xb3\x4c\xc7\x41\xc1\xf5\x32\x7f\xcb\x9b\x79\x09\x0c\x52\xce\xf0\x61\xea\x60\x48\x34\x4d\x8d\x21\xcd\xd2\x88\xf7\x4e\x70\xdf\xca\xbc\x9d\x9f\x20\xcb\x12\xdd\xa3\x22\x3e\x58\xac\xce\x15\x64\x20\x95\x49\x02\xa1\xd8\xbb\x6e\x75\xa8\x1d\xbb\xb2\xef\x43\x39\x69\xb2\x8e\xbe\x0e\x62\xd4\x03\x41\x81\xac\x40\xda\xfd\x34\x48\x02\x2a\x14\x78\x16\xfd\xee\xd4\x7c\x60\xa2\xdd\x0d\xd3\x91\x0e\xce\x29\x45\xb7\x2f\x37\xb3\x80\x68\xf9\x55\xa2\x1a\x70\x09\x3b\x7a\x23\x65\x9c\x38\xff\x94\xfa\xf5\x58\xf5\x0f\x82\x25\x2c\x0e\xc0\x25\x28\x0a\xec\xce\x9e\x26\x58\xcd\xe9\x39\x19\x00\x6e\x18\x37\xf7\x9b\x7f\x4d\xe2\x58\x10\xda\xcb\x23\xe0\xbb\x8e\x41\xc8\x71\x84\xf7\x80\x8c\x64\xb8\x99\x77\xeb\xde\x25\xe8\xfc\x20\x67\xf3\x1c\x32\x9e\x22\xcf\xf2\x50\xd5\x72\x4c\x1a\x83\x2c\x53\x18\xe8\xfe\x6b\x3b\x81\xfa\x80\x4a\x04\xba\x0a\x60\xda\x89\x70\xf4\xab\xaa\x9e\x04\xb6\xa0\x59\x8c\xf6\xa3\x50\x9a\xcd\xdb\x10\x2c\x81\x16\xce\x77\x25\x30\x7c\xb7\xde\x4e\xe5\xd8\xad\x52\x73\x72\x0b\x68\x0d\x59\x14\xd6\x35\xba\x73\x40\xc4\x6b\xd9\x7c\x6b\xe4\x1e\xe2\x34\x8a\xd6\x15\x52\x43\xfd\x70\xc3\x22\xc8\x7a\x26\xe6\xcf\xd2\x67\x2e\x3d\x10\xc0\x0f\x03\x61\xd1\xac\xc4\xc1\x71\xfc\x6b\x16\x87\x93\x58\x95\x21\x85\xd8\x3f\x63\x2f\x40\x34\x27\x4d\xd9\x38\x02\x84\xe2\x9a\xfc\xed\xaa\xaa\xfb\x96\xcd\x6d\xfe\xdf\x93\x73\xcd\x9e\x74\x6c\x6c\xec\x75\x31\x76\x4a\xb7\xd5\x5f\xd6\x24\x26\x53\xda\xc6\x99\x41\x91\x2b\xe4\x2c\xb1\x31\x98\xc7\xc6\x96\x60\x3f\xa6\x4b\x62\x3c\xbd\x60\x55\x4f\x73\x20\x4b\x68\xaa\x3c\xa9\xe0\xa2\x2a\xdf\xa0\x46\xa9\xf5\x21\x94\xb3\x44\x58\xe7\x75\x85\x20\xeb\x03\x0a\xbb\x78\x61\xb3\x4f\x33\x71\x4b\xb2\x08\x5f\x3d\x53\x41\x83\x4f\xd9\x65\x60\x93\x59\x64\x09\x50\xc4\xdd\xed\x1a\x68\xbf\xc8\xbc\x46\xca\x2e\xd6\x66\xf8\xec\x96\x26\x84\x62\xff\x14\x31\xc7\x37\xd6\xeb\x88\x06\x46\xc9\x43\x8d\x8a\xd3\xfd\x16\x60\x13\x22\x9c\x12\x91\x93\x9a\x6b\xe6\x67\xa3\x0a\x81\x86\x57\x00\x63\x93\xda\x70\x54\x3b\xa0\xa2\x13\x14\x58\x48\x46\x6c\x62\x22\x6f\x32\x7e\xc8\x5b\x30\x13\xc9\x65\x66\x69\xec\x88\xe6\x6f\x55\x0b\x23\x86\xbc\xa5\xca\x3a\x03\x94\x2e\xe7\x82\xc6\x19\x30\x86\x7d\xda\x32\x48\xe3\x28\xb8\xa3\xde\x34\x2e\xe7\xf5\xc7\x78\x12\x27\xde\x57\x6d\x07\xa5\x31\xa3\x07\xc4\x33\x57\x0a\x73\xf5\x84\x8b\xaa\x1a\x7c\xc8\xfa\x11\x60\xfc\xc6\x79\x07\x4d\x73\x26\x0b\x62\x05\x21\x48\x98\xbe\x3c\x95\xaf\x8f\x72\x6c\x32\xc7\xac\xe0\x0c\xb7\x95\x97\xf7\x23\xd4\x0e\xe0\xbf\x90\x88\x5b\x91\xd1\x28\x68\x3b\x96\x98\x70\xf7\x78\xcb\xd9\xad\x13\xca\x55\xdf\xdb\xfc\xd7\xd8\xaf\x35\x1c\x85\x34\x90\x5c\xda\xab\x60\x4f\xba\xfc\x82\xc9\x88\xf1\xb8\x2f\xd7\xbe\xc8\x1a\x9e\x5f\xe6\xbd\x74\x2b\x63\x81\xbc\x3d\xc7\x9d\xfc\xf1\x32\x88\xa2\xe7\xe5\x1e\x95\x1b\x2f\x4f\xdd\xff\x1c\x3c\x47\x98\x55\x82\x23\x28\x13\xc1\xd5\xb5\x6c\xc1\xac\x4f\xef\x73\x5f\xd9\xc9\x2c\x52\x2a\xc5\xa2\x72\x37\xcb\x7e\xa9\xca\xbb\xe9\x9f\xea\xc9\x5b\xa5\x40\x09\xdd\xeb\xa7\x07\x27\xf0\x40\x01\xb0\x16\xa2\xc8\x8e\xa0\x86\x1e\x29\xe9\xd7\x2f\x1e\x45\x91\xc1\x85\xd8\x31\xbf\xa0\xbd\x0b\x64\x40\x1e\x45\x94\x04\x5f\xe8\x5b\xd9\x65\x14\x18\x81\xe7\x55\x40\x59\xe7\x50\x5f\x5c\x7c\x1b\xef\x65\xe3\x9b\xc4\xa3\x48\x83\x67\x82\x14\x48\x40\x92\x79\xf9\xf0\xa1\x74\x61\x78\x00\x3c\x8a\xe3\x08\x85\xdb\x6b\x24\xc6\x8f\xf2\xb8\x70\x5d\xb1\x74\x5e\xa3\xae\xad\xbd\x0e\x0b\x1e\x8f\x08\x4f\xa8\x97\x7a\xbb\x90\xc7\xbc\xad\x96\x9d\x43\x79\x94\x28\x6e\x7c\x9e\xf8\xf8\xf0\x70\xeb\x2a\xc9\x13\xb8\x34\x8f\x12\xa0\x11\x73\xdd\x83\x3d\xa4\xae\xf1\xe2\x0f\xa5\x91\xc4\x45\x63\x65\x4c\x97\xcb\xce\xe2\x21\x1e\xa5\x34\x61\x81\xfc\x2d\xcb\x2e\xf0\x5f\x26\x10\xa5\xc3\xab\xce\xa3\x54\x08\x1b\x92\x37\xef\xdf\x50\xdd\xf4\xcf\x74\xe9\x5d\xe5\x51\xaa\x1d\x8e\xf3\x6e\xf5\xaf\x9b\xbb\x6f\x77\xc1\x27\xf9\xdb\xf6\xe6\xe1\x7e\x77\x7b\x73\x77\xb3\xdd\x5c\x86\xce\xd8\xb7\xe7\xcb\x70\xfd\x94\x46\x68\xb5\x0f\xa7\xba\x1a\xd0\x85\x3c\xa2\xd2\x35\x38\x7b\x80\x3b\x02\xe6\x7e\x9b\x7e\x27\xb5\x04\xcb\x78\x5e\x96\x61\x41\x33\x78\xf6\x1a\x50\xab\x4d\xda\x07\x6f\x4b\xfa\xc2\x3c\x62\x9c\x66\x4e\x68\x7c\x9f\x2f\x93\x4a\x27\xcf\x86\x49\x45\x7d\x3c\xb8\x49\x9f\xaa\x9f\xbe\x96\x36\x3f\xa9\x72\x9e\x45\x8f\xd7\xfd\x2f\xe7\x00\xb8\xaa\xd9\xaa\x3e\x48\x57\x5b\x98\xfe\x3a\xa1\xa8\x7b\x67\xb1\x01\x33\xda\xf7\x78\x94\xc5\x0e\x4d\x51\x95\xa1\x48\xe9\x54\x8d\x1d\x76\xe2\xd3\xf0\x8f\x47\x19\xc9\x1c\x81\x2d\xa0\xc3\x6e\xfc\x62\xfd\xc1\x4d\xcb\x94\xab\x5c\xcb\x37\x99\x17\xdd\xea\xf8\xe8\xea\x22\xbd\x1e\x28\x8f\x54\x92\x21\xbe\xef\xf6\xe1\xe2\xeb\xb7\xc7\x1d\xbb\xc3\xa6\xe4\xf6\xe6\x6e\xf3\xbc\x5d\xdd\x3d\xf6\xc3\x84\xc2\x45\xe4\x45\x36\x57\xf9\x1b\xfc\x0e\xb2\x9e\x02\xf2\x79\xa4\xa4\x15\x69\xff\xea\x5d\xe7\x6f\x10\xd0\xc8\x3c\x52\x4a\x20\xf0\xf0\xe2\xe9\xe1\xc7\xe5\xee\xc7\x66\xf3\x35\xf6\x6f\x54\x3f\xc2\x6a\x24\xdd\x75\x91\x19\xae\x0c\xfd\x3c\xd1\x29\x61\xc1\x4e\xa8\x44\x12\x7c\x7f\x33\x8d\x92\xa8\xc4\xb0\x7d\xd8\xae\x6e\x77\xe8\xf1\xbd\xea\x2f\x19\x68\x8a\x02\x83\x79\xd9\xc5\x5e\x67\x49\xd4\xe4\xc6\xda\x08\xb0\x00\x67\x06\xdc\xca\x59\x69\x9a\x47\x56\x64\xc1\xbc\xf5\x7a\xfb\x30\xc9\x2e\x78\x1c\x91\x0c\x1b\xf0\xad\xe7\x8f\x17\xbd\x42\xdc\xd8\x81\x85\xc7\x71\x44\xb5\x0e\x0a\x33\xa7\xa2\xfd\xcc\x22\x91\xc7\x71\xec\x1c\x87\x82\x72\xdb\x0e\x31\xb6\xd3\x2a\xcb\xbf\xe3\x69\x35\x9e\xc7\x71\xa2\x70\x2f\x3f\x38\x67\x9c\xdb\xbc\xc1\x15\x79\x36\x28\x75\x4b\xbe\x8f\xab\xfa\x40\x7e\x34\x02\x52\x19\xa2\xe5\xee\x3e\xf4\x92\x93\x3c\x26\xd4\xb9\xe0\x75\xb1\x79\xd8\xb4\x9c\x75\xf2\xf4\xfa\x09\xb7\x58\xad\xfb\x03\x26\x0a\x14\x3c\x26\x3a\xd6\x4e\x31\x11\x60\x24\x9a\xc6\xe3\x84\xb9\x77\x1c\x77\xce\x27\x7c\xc7\xbf\x35\xe6\x02\x71\xd7\x61\x88\x10\xce\xdf\x1f\xda\x6b\x28\x61\xda\x25\x3f\x0d\x36\x0d\x3c\x4e\x4c\x86\xc2\xeb\xd8\x64\xdf\xc5\x51\xb4\x23\x34\x0a\xa7\x49\x55\x84\x3d\xe5\xca\xda\x05\xcc\xe0\xec\x96\x52\xe3\xc2\xe0\x6d\x0e\xf5\x8f\xbc\x30\x5a\xb6\x41\xe4\x77\xf9\xc9\xb1\x18\x9c\x6f\x73\x75\x38\xc8\xd2\x5c\x43\x3b\x5e\xfd\x63\x46\x9c\xf7\x65\x0d\x6d\x2d\xf3\xf6\xb9\x95\xa5\x91\xb5\xd9\x91\x30\x80\xa7\x54\xca\x01\xe4\x83\x8e\xf4\x70\xc6\xd5\xef\x07\x6b\x6f\x4a\xd8\xed\x76\xc1\x10\x29\x1c\x14\x0c\x45\xa4\x9f\x56\x5b\x94\xd0\xd8\xc5\x69\x7f\x08\x6c\x28\x3c\x7f\xaf\x3c\x81\x48\x1e\xfe\xcf\xad\xc7\xd9\xbd\x12\xc4\x04\xfb\x26\x59\xb8\x4a\xc6\xcd\xc5\xc3\x18\x68\xcb\xe3\x2c\x06\x94\xed\xcc\x9b\x1f\x2f\x88\x61\x7a\xef\xcb\x98\x3c\xce\xa8\x21\x49\x2f\x6f\xdc\xca\xa2\x70\x2c\xbe\x71\x7c\xce\xe3\x8c\x09\x87\xa4\x29\xaa\x9f\x21\x7c\x88\xc3\x31\x1e\xd3\xee\x86\xfc\x74\x8a\xf8\x6f\xb2\x95\xfd\xfd\xc8\x40\x48\x3f\x03\x67\x45\x9f\x61\x23\x8d\x55\x0a\x89\x0e\x56\x7d\x75\x17\x64\xcd\xe8\x3c\x7e\x9c\xe6\x52\xaa\xf0\x5b\x77\xdd\xdb\xfc\x27\xec\x5a\x08\xd6\x33\x3c\xd6\xd2\x15\xd7\x8c\x6c\xe5\x2c\x17\xe3\xb1\xd6\x19\xee\x6a\x08\xfb\xea\x7e\xa3\xaf\x52\x85\xc3\x60\x52\x07\xb7\x92\x75\xbb\xae\x26\x58\x61\x1e\x6b\xcb\x30\xc4\x39\x9e\x8a\xc2\x95\x63\x11\x0c\xe5\x97\x13\xdb\x42\xed\x8c\xe1\xfd\xa2\x1f\x3e\x66\x12\xc0\x2b\x96\xc6\x6c\x7e\xb5\xb5\xbc\x94\xef\xcd\xec\xb2\x8c\x4c\x71\x31\xbe\x76\x39\xfe\x78\x03\x8b\x21\x8a\x91\xca\x75\x3c\x35\x2f\xf7\x95\x01\xf4\x84\x98\x91\x72\xc3\x50\xea\x6c\xc3\x46\xf6\x45\x4d\x10\x6b\xc1\xe4\x3b\x9c\xd3\x02\xc3\x1a\xc1\x2e\x24\xd7\x5f\x64\x6d\xe6\x05\x77\x4e\x22\x9a\x00\x1b\x5a\x0d\xdb\x97\xbc\xc1\x39\x15\x60\xd5\x9c\x44\x4a\x61\x1c\x5a\xe4\xb2\x1c\x39\xcb\x73\x12\x47\x96\xf5\x99\xe2\x9d\xcc\xcb\x21\xa6\xe6\x24\x4e\x39\x2e\x04\xda\xdf\xbb\x9b\xe6\x02\x6b\xb8\x53\xfb\x46\x4e\x62\xa3\x44\xe6\xb5\xc7\xf3\x1a\xbe\xbe\xeb\x41\xee\xc1\x0f\x21\x82\x21\xad\x2b\x6f\xb6\x2f\x50\xc3\xaa\x7c\x28\xaf\x2b\x54\x78\xf1\x7d\x8f\x30\xce\xa4\xd8\x84\x80\xd2\x56\xb5\x0e\xf1\x8c\xd3\xc8\xf4\x43\x12\x12\xa1\x3e\xc6\x3d\xfc\x44\x57\x93\x2e\x8b\xc0\xac\xd2\x57\xd8\x3e\xa8\xad\x7f\x08\xbe\xe6\x24\x8d\x08\x4e\x8a\xd5\xe6\xfe\xe6\xfa\x6e\xf5\x47\xf8\xa6\x14\x38\x8a\x36\x3e\xca\x32\xb8\x24\x73\x42\x23\x19\xb8\x98\xcf\xaf\xa7\xa2\x98\x3d\x0b\x1a\x67\x98\x64\x3a\x26\xcf\xcc\x09\x6f\x34\x91\x08\x4d\x9c\x74\x6e\xe9\x9b\x7a\xb7\x20\x6d\xff\xbc\xa8\x10\x2a\xa0\xab\xce\x76\xe8\xc9\x6c\x27\xd4\x30\xec\x0f\x3a\x92\xc5\x34\xba\xfb\xa8\xaf\x30\x94\x84\x38\x61\x44\x40\x88\xd6\xbb\xf7\xf9\xb9\x85\x23\x99\xfd\x28\xa6\xa4\x13\x0c\x2d\x83\xcc\x45\xdd\xe6\x33\x5f\x62\x4e\x38\x95\xca\xaf\xcc\x77\x53\x5d\xad\xcf\xd7\x45\xc2\x95\x13\x91\xee\xc3\x37\x57\xdf\x3d\x87\x63\x71\x22\xa2\x84\xb8\x66\x42\x51\xdc\x4d\x3d\x64\x39\x11\xb1\xc5\x19\xec\xeb\xe9\xde\x7c\xce\xcc\x4f\x91\x58\xcc\xd9\x90\x47\x87\x81\x78\x68\xef\xce\x8a\x80\x61\x3c\x77\xdc\x0a\xa7\x71\x1c\xcc\xf8\xc3\xed\x13\x82\x6b\xd2\xe3\x37\x83\x8e\x43\x17\x15\x34\xad\x3c\xcc\x67\x6a\xc6\xa3\x2c\x19\x15\x12\x47\x32\xfd\x61\x84\xb5\x36\xe0\x71\xab\x43\x50\x48\xf0\x07\x25\x17\x9e\x22\xf3\x56\xe9\x01\x36\xc2\x89\x4a\x62\xd4\x7f\xf0\xe0\x49\x44\x90\xbe\x9c\x83\x7c\x38\x51\xd2\xa1\xf8\x5d\x95\x64\x73\x40\x57\xaf\x69\xb2\x3e\x95\x26\x08\x8b\x16\x51\x5a\xa0\x70\xef\xf5\xc5\x45\x88\xd0\x51\x54\xd4\x1f\x36\x2c\x41\xce\xd0\x65\xfe\xf6\xf6\xfe\xed\xb8\x58\x9b\x9f\x93\xd7\x3f\x2b\x92\x71\x62\x94\xf1\xeb\xf1\x1b\xd4\xed\xee\x20\xf5\x4b\x5e\x0e\xdf\x67\xd2\x2c\xd4\x47\x30\xa1\x82\x87\x53\xbb\x6a\xdb\x6a\x92\x80\x13\x63\x04\x72\xe7\xb0\x80\xba\x06\x5b\xd5\x30\xf6\xf7\xf5\xa3\x2c\xa1\x58\x3b\xea\x02\xd8\xee\x4d\x98\x36\xa7\x66\xd7\x65\x69\x4a\x9d\xc4\xfc\xb7\x9b\xfb\x6d\x4c\xa2\xd9\x33\x46\x6d\xfc\x11\x1d\x6f\xfd\xfe\x04\xcd\x7f\x4f\xe1\xca\x93\x38\x03\xa7\x58\x32\x71\x02\x0f\xf8\x80\x05\x80\xc8\xec\x9f\xc9\xd5\x24\xb1\x14\xb8\x60\x1a\x5f\xea\x08\x35\xf8\xff\xef\xac\x92\x26\x6b\x67\x12\x6b\x8d\xb2\x99\x8f\x05\x98\x7d\x70\xf4\xef\xb7\x89\xc9\x9d\x49\x48\x0a\x58\x5a\xe8\x36\x75\x94\x2d\x27\xbf\xfd\x35\x9f\x93\x27\xc4\x44\xa8\x6b\x97\xef\xcb\xaa\x86\xaf\xbf\x5f\x74\x29\x48\x70\x12\xe0\x49\x12\x29\x11\x16\x64\xbc\xb2\xb8\x3f\xc2\x52\xc4\x19\x9e\x4a\xe5\xa1\x93\xa3\xf6\x25\x4f\x12\x01\x18\x81\xfc\xaf\xd4\xaf\x8f\x55\xbb\x86\xa6\x1d\x9c\xda\x78\x92\x98\x18\xb5\x38\x90\x05\x77\x27\xcb\x93\xb3\xe1\x1a\x7d\xde\xa4\x8e\xa4\xea\x9d\xb0\xce\x9b\x37\x3c\x49\x6c\xc2\xa2\xff\x9b\xaa\xd4\x07\x6c\x88\x0f\xff\x9d\xde\xe3\xd4\x5a\xcc\x01\x7a\xe9\x2f\xb3\xd9\x7e\x99\x5d\x14\xa5\x11\x66\xa4\x01\xb9\x31\xa0\x37\x97\xcf\xc9\x12\x11\xcb\x51\x1c\x30\x62\x4e\xf0\x84\x65\x1a\x67\xd8\xfa\xe1\xdb\xfd\xf6\xf7\x45\x1b\x9c\x6e\x10\xa0\x01\x9f\x8b\xc3\xf1\x41\x48\x6f\xfd\x3e\xfb\x2a\x6b\x62\xd6\xf3\x30\xa6\x61\xa8\x1f\x92\x25\x0a\xf9\x6c\x8e\xac\x87\x60\x9d\x2f\xb2\x18\x4c\xc2\xd2\x33\x23\x67\x9e\x64\xda\x51\xc5\xf7\xd0\xfe\xb3\x52\x4f\x12\x37\xa7\xe5\x1f\x9b\xd9\x0c\x1f\x3b\x26\x94\xd7\xf2\x00\xbe\x5f\x30\x36\xb9\xe7\x89\x24\x02\x7b\x54\xae\x80\xfb\xa3\xaa\x5f\x67\x57\x29\x29\xc3\x46\xc7\xf7\xfc\xf5\x75\x5c\x9c\xe5\x89\x54\x44\xc3\xe0\xdc\x76\x05\x70\xa6\x1d\xc2\x13\x95\x44\xc1\x12\xea\x2b\xbc\xf7\xa2\x26\x43\xaf\x76\x96\xa9\x27\xca\x80\x13\x5f\x7c\x6f\x5a\x38\x2c\xda\x53\x84\xec\x2f\xd1\x94\xe1\x8e\x56\x59\xf4\x92\x29\x46\x74\x7e\x9e\x68\x15\xe1\xb2\x5b\x63\x17\x19\xcc\x57\x59\x1f\xba\x00\x7d\x32\xeb\xb5\x51\xd8\x48\xbe\xcd\xdb\x60\x2a\xc5\x13\xa3\xc4\xe0\xed\x77\xbf\xb3\xa5\xee\x8f\xe8\x04\x2d\x6f\x1c\x3d\xf1\xa1\x2c\xf2\x12\xae\x7f\x0c\x47\x79\xec\xcb\x07\x17\xef\xba\x18\x49\x15\xf2\x04\x14\x30\xf7\xea\x39\xcc\xe6\x47\xcd\x46\x9e\x58\x16\x63\x6f\x2f\x2c\xa8\x55\x3d\x7f\x71\x6c\x26\x99\x1c\x21\xc3\x2f\x6f\xa6\x56\x19\x3c\x8d\x78\x86\xdb\x73\x5e\xfe\xcf\x29\x6f\x6f\xcf\xd2\xf6\x34\x52\xdc\xa1\x04\xbb\xb4\x02\x4e\x87\xeb\xaa\x30\x8f\x75\xb8\xda\x34\x26\x12\xe7\xc2\x16\xe4\x61\x55\x1a\x5f\x38\xf3\x6e\x36\x81\xf5\xb0\xbc\xad\xa4\xb1\x54\xa9\x2f\x6b\x9e\x8e\xa1\x45\x72\x55\xc8\x7d\x7f\x72\xeb\x52\xb7\x36\xef\xcd\x41\xc2\x21\x42\x09\x16\xe0\xf7\xf9\x1b\x3c\xd6\xd5\x1e\x74\xfb\x09\xd0\x8b\xa7\x84\x67\xc4\x4e\x04\x9f\xd6\xef\x9b\x37\xa8\xdf\xab\x72\xd2\xbf\xe7\x29\xb1\x3a\x51\x73\xc2\x42\xf8\xda\x14\x32\x54\xe3\xb8\x90\x45\xe1\x90\x6e\x7f\x17\x07\x31\xbb\x1e\x1a\x1b\xac\x25\x4a\x63\xfe\xe7\x94\xeb\x57\x54\x06\x18\x97\x05\x52\x6a\x9c\x69\xd2\xff\xca\xbc\x70\xd1\xe1\x8c\xf9\xcc\x53\xc6\x28\x16\x9a\xe0\x57\x0b\xa5\xb9\x0c\x85\xfc\xe9\x37\x71\xaf\x3f\xf9\x7c\xcc\x35\x78\xc7\x83\xf0\x1d\x5c\x3a\x71\x91\x3d\xb4\x3f\x6a\x79\x3c\xf6\xde\x3e\xfd\x00\xeb\x28\x03\x35\xde\x85\x27\xf8\x5f\xd0\xfd\xbd\x10\xa0\x91\x4e\x7d\xf9\x5e\xca\x43\xae\xe3\x1d\xfd\x35\xfb\xea\x2c\xd6\xb8\x15\xe8\xa2\x6a\xfa\x00\xd9\x1f\x93\x3c\x72\xaa\xf6\x85\xd4\x70\x5f\xb5\x30\x12\x08\xfd\x00\x5b\xca\x53\x95\xda\x50\x31\x7b\xce\xf7\x65\x97\x4d\x9d\x54\x91\xeb\x19\x4b\x9b\xa7\x2a\x73\x7e\xec\x3d\xaf\xfd\x20\xeb\x77\xef\x08\x62\x7c\x57\x73\x7a\x2f\x0d\x33\x22\x1e\x04\xf2\xc2\x65\x1a\x9e\x48\xef\xca\x7e\xeb\x48\x0e\xe3\x6c\x6b\xae\x69\xb5\xf8\x8f\x3f\x93\x4d\x12\xd4\x2c\x30\xd5\x73\x7b\xb2\x36\x7c\x81\x15\x3c\xf5\x98\x8d\xbc\x34\x50\x5f\xc8\x42\x2f\x77\x19\x52\x2b\xc0\xb2\x60\x9a\xf7\xf6\xd1\x20\x48\x78\x34\x92\x03\xde\x3e\xf7\xdf\x64\x39\x8a\x13\xfd\xfe\xf0\xfb\xc3\x8f\xe9\xaf\xa7\x51\xc2\xd0\x37\xe6\xea\x54\x1a\x9f\x1b\xb8\x3b\xfb\x0c\x7f\xa1\x83\xc5\x69\xa4\x89\xe1\x21\xe0\xbc\x29\x27\xd1\x28\x8d\x39\x47\x34\x8c\x83\x42\x39\x98\xc9\x79\x0e\x40\x49\x1c\x51\x36\x08\x8c\xe4\x25\x5c\x55\xf5\xe7\x99\xdd\xe4\x67\x53\x92\x52\x7c\x7c\x72\x66\xb8\x32\x1f\xc6\x54\xd4\x7b\xe7\x78\x80\x65\xaf\x0c\x15\xc6\x08\x43\x3d\xac\xe1\xa6\xcc\x51\xff\xf8\x7c\x11\x9e\x9f\x37\x73\x19\x96\x67\x6c\xce\xee\x2e\xd1\x16\x19\x1b\x79\x83\xaa\xef\xbf\xf2\x66\x2e\x0b\xc5\x69\xa2\x62\x6f\x27\x8e\x77\xff\x61\x51\x26\x8c\xd3\x34\xd6\x19\xcc\x28\x0b\xc9\xe4\xdd\xa7\x69\xe2\x5e\x93\xd3\x71\x5f\x4b\x03\x23\x5d\xc5\x30\x40\xd8\x10\x1a\xa0\x59\x6d\xff\xcb\x53\x15\x3b\xf8\x1b\x3e\x85\x5e\x2a\xfa\xb3\x15\xee\x83\x04\xa7\x3f\x21\x41\x9c\x22\xa6\x76\xf5\x87\x81\xa0\x1f\x4d\x63\x13\xb8\x14\x08\x84\x69\x4e\x87\xc5\xb4\x20\x0c\x57\x3e\x48\x76\x81\xe6\xe0\x22\xfd\xe1\x8e\x49\x59\xc4\x70\x0e\xba\xe2\xdc\x2c\x3a\xa6\xcc\x26\x58\x9f\xb8\xad\xf6\x9b\xba\xae\xea\xbb\x66\xbf\xa4\xd8\xc3\x29\x97\x44\x07\xc4\xf3\xce\xc0\xf1\x03\x1f\x45\x4e\xb9\x71\x89\x91\xed\x42\xb6\xf5\x69\xba\x48\x51\x41\x79\xe4\x7d\xcc\xbf\x57\x27\xfd\x32\x2c\xcc\x54\x30\x15\x98\xcd\x8f\x37\xee\x29\x93\xfe\x98\x92\x28\x03\xe2\x0b\x13\x57\x55\x7d\x0d\x25\xdc\x4a\x35\x5d\x7d\x69\x96\xc5\xde\x88\x4e\x16\xb7\xd5\x7e\x9c\x27\x7d\xac\x02\xd4\x7d\x2c\x83\x68\x80\xeb\x7e\x85\xf7\x51\xe3\x83\x66\xd2\x05\xdb\xbb\xee\xae\x8f\x4d\x31\x39\xcd\x34\xb1\x71\x60\x63\x1f\x8f\x79\x09\x4d\x73\x91\xb7\xf9\x9f\x73\x05\x08\x4e\x33\x13\xeb\xc4\x37\x88\xbc\xa0\xf1\xdc\x2e\x6c\xf9\x15\x91\xc2\x60\xdd\xe4\x58\x35\x8b\x3d\x6e\x4e\xa5\x16\x78\x15\x8f\xab\xdf\x1f\xbe\x6d\x77\x97\xab\x6d\x08\xc9\xa9\x34\x99\xf3\xa6\xaa\x8e\xf0\x24\xf3\xe0\x11\xe2\x8f\xea\x24\xc1\x68\xea\xb6\xda\x3f\x9e\x66\x64\xf2\x98\x88\xe9\xb7\x68\xee\x30\xcd\x08\x7d\xd2\x55\x69\x7e\x07\x89\xce\x73\x3f\xbb\x75\x6e\x51\xbf\x9a\x53\xad\x12\xa0\x61\x3b\xf4\xd6\xb2\xe1\xdb\x8d\x8e\x60\x48\x91\xfd\x92\x74\x89\x55\x9d\x73\x19\x3a\x4e\x0d\xa4\xd8\xcd\x40\x38\xcd\x43\xe9\xd4\xb3\x27\x98\x6e\x4e\x81\x2b\xdc\xf8\x9d\x81\x65\x5e\xee\x5d\xf7\x75\x7a\x22\x90\x14\xf8\x88\x13\x33\x7b\x50\xd6\x83\x17\x74\xc8\x97\xc6\xfc\x26\x4e\x2d\x8f\x51\x64\x71\xb3\xfd\xd2\x03\xc3\xfb\xbe\x3a\xb5\x06\x92\x41\x0c\x05\x45\x18\xdd\x92\xfe\x29\x24\xd8\x7d\x98\x45\x31\xb1\xc1\xed\xb9\x6a\xe0\x9f\x79\xb9\xef\x85\x68\xfd\xc6\xfa\x6f\x1a\x30\xb3\xc4\x2b\x3b\x71\x16\x65\x06\x13\xb7\xdd\x6e\x04\x20\xe3\x2c\x52\x31\x0f\x5c\xa6\xc7\x17\xd9\xbc\x5c\xd5\xd5\x61\xed\xbc\x2c\x6f\x96\x49\x88\x9c\xc5\x24\x46\x9a\x6f\x51\x49\xe3\x54\xf5\xc3\xe9\x62\xaa\xb1\xab\x0b\x08\x34\x79\x82\xfd\xa9\x18\x33\xbf\x27\xef\x0a\x8b\xad\x03\xf1\x40\xd3\xdd\xc5\x11\x5e\x86\x33\xc2\x45\xdf\xd8\xaf\x8e\xd2\x61\xde\x17\x9b\x48\x8c\x18\x8a\x04\xe6\xdd\xaf\x50\x97\x65\x49\x24\x89\x83\xd4\x60\x59\xef\xcc\x7f\x6a\xba\x4f\xb3\x24\xc9\x10\xcc\xbe\x6b\xa0\x28\x1e\x4f\xed\xb6\x7a\x38\xfe\xf5\xfe\x3a\x3b\x49\x1a\x53\xdc\x7f\x6c\x5e\xf6\x08\x4f\xf4\x05\xf8\x40\x43\x95\xb3\x14\x0c\x22\x43\x9d\x69\xb3\x83\xf0\xfa\x22\xf1\x43\xf9\xcf\xd3\xa0\x7f\xcc\x19\x15\xc2\x69\xa4\x1c\x8f\xc5\xfb\xee\xb9\xad\x6a\xd8\xdd\x98\xdd\x15\xf4\xcf\x91\x66\x91\x5f\x38\x70\x9f\x9d\x58\x83\x7d\x1c\x37\x32\xce\x39\x5e\xc3\x76\x3b\x70\x2d\x38\xe3\x19\xc3\xa2\x80\xd3\x87\x44\xdb\xed\x05\x9b\xab\x11\x6b\x9a\x33\x91\x3a\x67\x41\xec\x4e\xb8\xc9\x1d\xf9\x43\x59\x1c\xa3\x5e\xcd\xaa\xae\xfd\xcf\xbb\x69\xae\x50\x7a\x73\x3a\xa7\x58\x26\x62\x44\x9c\x8d\x3b\xe0\xd8\x95\x0c\xd7\x95\x65\x12\x8d\x4d\x91\x1e\xdc\xd3\xbe\x39\xcb\x94\xc6\x20\xcd\x73\x42\x9f\x8f\xdd\x12\x36\x92\x4a\xe8\x46\x38\x93\xe3\xea\x08\xe5\xe6\xf9\xe1\x31\xe4\xcd\xe3\x9f\x90\x69\xe2\x22\xa5\x6e\xb5\x72\xaf\x75\x33\x10\x2c\xdd\x71\x67\xb7\xb0\xaf\x5a\xa9\x47\xf7\x4b\x45\xce\xd7\xf0\xfe\xa4\x0b\x38\x35\xdf\x31\x41\x1f\x27\xfa\x5d\x70\x15\x64\xda\x2f\x73\x0d\x3f\xf2\x72\x2a\xc4\x34\x01\xa2\x8f\x5a\x03\x4c\xc5\x94\xb1\x91\x61\x8b\x43\xdf\x37\xfd\x79\x65\xe2\x36\xdc\x9e\x78\xe3\xb5\x16\xce\x23\x24\xa6\xbd\xd9\xb1\x23\x75\x34\xad\x2c\xe6\x53\xc9\xc8\x28\x0a\xf7\xf7\xe2\xe1\xe6\x3e\x7c\x0b\xf0\x0c\x03\xa7\x56\xd6\xf8\x03\x9c\xa6\x87\x87\xf9\x85\x31\x40\xb0\x27\xbd\x69\x5f\x7e\x9c\x7e\xe5\x32\xfc\xdd\xc6\xda\x9b\x6c\x60\x42\xb3\x2a\x7b\x8c\x6a\x28\x27\x33\x4b\x9c\xad\x7e\xb7\x0a\x94\xcf\xef\x07\x15\xb0\xef\x9c\x59\xca\xf1\xce\x3e\xbf\xe4\x6d\x77\xc7\x2f\x86\xa2\x1c\xb3\x19\x77\x14\xf9\xbc\x04\xaf\x04\x32\x79\x9f\x78\x94\x32\x64\xa8\x5e\x5c\x5f\x8c\xde\x6e\x1e\x89\x04\x05\xc0\x1e\xd6\x9b\xab\xd5\xc5\xf4\x16\xf0\x98\x6b\x67\x41\xfc\x22\xf5\x6b\x35\xa1\xfe\x71\x4e\x24\x49\x64\x10\x98\xde\x9f\x7a\xb8\x62\x77\xc4\xb5\x42\x5d\x63\x20\x3f\x9c\x0e\xeb\x99\xf6\x37\xe7\x49\x04\x86\xcf\xd8\x8a\xcd\xfa\x54\xbc\x7e\x1c\x97\xf1\x24\x35\xd4\x77\x79\xd7\x70\x06\x31\xff\xc7\xec\x0b\x74\x64\xbc\x08\xed\x73\x75\x2a\x66\xbf\x2c\x05\x1a\x80\xe8\x8f\x2e\x21\xf9\x01\xf9\xec\x12\x29\x77\x3c\xae\xcb\x93\x7e\xed\x27\x0f\xa7\x92\x62\xa3\xe0\x52\x1a\x39\x16\x92\xf0\x87\x19\x4d\xb0\x94\xbb\x6b\x5a\xb4\xd0\xc6\x3c\xf9\x09\xcd\x60\x67\x97\x20\x48\xe4\x00\x02\xfe\x6d\xbd\xcc\x1b\x39\x57\xa4\xe0\x5c\xe8\x08\xcb\x65\xb2\xae\xe5\xfb\x83\xbd\xaf\xca\x6d\x9d\xbf\xe5\xb2\xe8\x3d\x23\xfd\xc0\x2c\x31\xda\x19\xbc\xbf\x55\xaf\xf0\x50\x6a\x98\x0b\x37\x73\x2e\xa5\x4d\x1d\xe4\xa4\x99\x3c\x4a\x69\x29\xc6\x00\xcd\x49\x75\xcf\x21\x34\xe7\xfc\x51\x95\x49\x0c\x88\xf2\x06\xf5\x83\xe6\x27\xd5\x24\x16\x69\xe8\xbd\x7b\xf3\xd4\xf1\xd2\xce\x75\xc2\xa8\x0f\x15\x8f\x0e\xcc\x77\x74\x3c\xd6\x70\x3c\xb5\x98\xd3\x34\x27\x75\xc8\x43\xa3\x77\xb2\xb8\xce\x2b\xdf\x5c\x83\x51\xce\xe6\x5a\xbf\x9e\x8e\x31\x99\xa5\x52\xdc\xa4\x02\xc9\x9d\xc8\xc1\xc7\xf8\x33\x09\xdf\x66\x8c\x41\xb8\xb6\xee\x9b\x48\x3b\x2c\x88\x84\xe3\x96\xb2\xd8\x91\x90\x31\x50\x43\xb5\x22\xd7\x1f\xf1\x08\xce\x11\x0c\x92\x8b\x28\x72\x3c\x85\xbb\x4b\xda\xc5\x0a\x6e\x6b\xce\xcb\xfd\x57\x78\xff\x59\xd5\x66\x22\x7e\xc1\x45\x14\xeb\xb0\x2f\xdd\xc3\x2f\x47\x05\xbf\xac\xca\x85\x7a\x8c\x88\x52\x8e\x60\xb9\xbe\xc3\x1d\xbe\x31\x26\x69\x16\x16\x2e\x54\xde\x47\x31\xec\x71\x04\x29\xe2\x44\xe0\x8e\xff\x63\xfd\xad\xff\x14\x8f\x30\x67\x43\x0f\x41\xf7\x8c\xfc\x91\x24\x4e\x31\x54\xef\x63\xb7\x1d\xb4\x2f\xbb\x51\x18\x23\x12\xce\x31\xf8\x7b\x5a\xdd\x8d\xf1\xf8\x5c\x24\xca\x62\x14\xb5\xb9\xbe\x7e\xde\x6d\x1f\x76\x5f\x56\xdb\x8b\x2f\xbb\xf8\xf2\x69\x75\xfd\x70\xdf\x0f\x32\x8e\x44\x61\x01\x9e\xe0\x58\xbc\x6f\x5f\x6a\x90\xfd\xb9\x53\xe1\x88\x8c\x3f\xeb\xbc\x05\xa3\x3e\x49\xe4\xd0\x39\x01\x89\xbc\xf7\x57\x4f\x9b\xcd\x1f\x9b\xdd\x76\xb3\xba\xdb\xb9\xea\x7a\x38\x1d\x4f\x14\x42\xbf\x10\xe5\xbc\x45\xa4\xd0\xe8\x7a\x79\x0a\xc1\x04\xbb\xbb\xfd\xab\x00\x72\x73\x8c\xa0\x30\x88\x43\x6a\x02\xab\xa5\x2a\x9b\x5e\xcb\x2b\x1c\xd7\x99\x1d\xe5\x55\x23\x89\xfb\xe5\x80\x4a\x70\xcb\x71\x9e\x7f\xad\x4c\xa5\xfa\x72\xb2\x10\x91\x90\xb6\x67\xaf\x3c\x57\x85\xb9\xae\xfa\x4a\x87\x10\x31\x18\x08\xbd\x1b\xa9\x5f\x5d\xcf\xf2\xc2\x69\xf9\xcb\x85\x06\x81\xc8\x8c\x45\xec\x7b\x5e\x3a\xfd\xef\xbe\xac\x3a\xa9\xb4\x08\x19\x3b\xdd\x7d\xff\xb5\x98\x3e\xbc\x85\x83\x3a\x4e\x5d\xa8\x23\x4f\x3d\x66\x4e\x98\x94\x60\x8b\x02\x89\xbb\x2e\x89\x9e\x09\xe5\x73\x61\xa8\xc5\x3e\xb8\x37\x9e\xc2\x42\xf5\xf2\xdd\x30\xe0\xcc\x55\x4f\x0d\x5a\x98\x5f\xcb\x43\x17\x90\xda\x22\xef\x49\x76\x1f\xf4\x42\x97\xd7\x83\xb3\xe6\xd0\x44\x3b\xcc\x7f\x27\xc4\x11\x9a\xb5\x3f\x6f\xbe\x3c\xed\x7e\xac\x6e\x6f\x37\xdb\xdd\xea\xf2\xf2\x69\xf3\x1c\x82\x29\x01\x42\x10\x4f\x8d\x5d\x69\x47\x4d\xf6\x64\xda\xf5\xfb\x4d\x69\xe0\xd7\x07\xb4\x7b\x2e\x40\x25\x08\x96\x72\xa5\x2b\x8f\xf9\xf9\xf1\x02\xe5\x63\x77\x13\x67\x99\x92\x00\x95\x6a\x39\x78\x74\x4c\xf0\xe2\x5c\x80\xe5\xc8\x6a\x7d\x02\x59\xdc\x49\x53\xe7\x61\x9e\x64\x11\xc9\x50\x58\xc7\xb5\x55\x56\x88\x21\x43\xcd\xfd\x2e\x6e\x99\xdd\x8b\xb0\x5f\x66\x51\x12\xe1\x87\x5a\x07\xc5\x73\x02\x3e\x67\xc2\x2b\x93\x3a\x8d\xff\x64\x4c\xa8\x4c\x7b\x13\x8d\x6e\x07\x3f\x33\x86\xe1\x59\x9c\x6a\xe6\x30\xde\x55\x51\x95\xfb\x71\x6a\xe1\x47\x90\xc8\xc5\x1c\x85\x6c\xda\xc7\xee\xcb\x1f\xde\xa0\xb6\x45\x60\xa8\xf2\x8c\xa4\x02\xc1\xe9\xd5\x08\xcf\xfb\x9c\xff\x09\xfd\x71\x1a\x63\x81\xe3\x51\x96\xdd\x6e\x5b\x0f\x07\x44\x8c\x1a\x6b\x45\xb5\xcf\xa7\x36\x9a\x3c\x4b\x08\x44\x5e\x71\x37\x24\x49\x73\xa5\x88\xc9\x3b\x99\x25\x29\xa0\x30\x5a\xf3\x9a\x97\x8e\x8c\x67\xc6\x9d\x9f\x2c\x91\x40\xc9\xc4\x3a\xea\x52\x56\x08\x25\x98\x40\xd4\xb2\x34\x11\x34\xeb\x7b\x74\xe3\x32\x7d\x96\x66\x19\xa2\x17\x4a\xf8\xf9\xad\xce\xd7\xb2\x99\xee\x91\x19\x8d\x6c\x68\x72\x8c\x52\xe4\xc5\x1c\x2f\x63\x71\xac\x54\xcf\xdf\xbb\x2e\x2a\x25\x8b\x8b\xaa\x6c\xda\x5a\xe6\x68\xc6\xd0\x4b\x79\x87\x9f\xbb\x94\xa3\x65\x4c\x72\x35\x14\x39\x27\xfc\xe7\x7d\x7f\x9f\x99\x49\x31\x39\xc7\xe4\x71\xb2\x9a\x66\x0c\x9c\x06\x60\x17\x04\x7b\x29\x7c\xec\x12\x4f\x5f\x12\x9e\x30\x87\x6c\xfe\x29\x8f\x9e\x99\x5b\xd5\x5f\x07\x0a\xca\xec\xa2\x04\xc9\x10\x59\x55\xc8\x53\xa9\x5f\x06\x73\x96\x51\x54\xf8\x61\x7c\x98\x89\x34\x55\x93\xad\x2c\xbc\x51\x3d\x56\x3f\x13\xcc\x86\x47\x89\x58\x86\xee\x01\x56\xb5\xef\xcb\x87\x41\x92\x59\x2e\x07\x0f\xf1\x1f\xb2\xae\xf3\x51\xd7\x6c\x7c\x0d\xe1\x13\x22\xb1\xbe\x2a\xd4\x77\x18\xa7\xf7\x41\x2a\x8d\x71\xb6\xec\x5e\x98\xa7\x53\xd9\xcd\x49\x87\x35\xf9\xab\xbe\xb7\x3f\x81\x8a\x9d\x9d\x3d\xf2\x5e\x0e\x0a\xea\x0b\x59\xa2\x7f\xf7\xf4\x06\x2a\x2b\x71\x21\x1b\x30\xfc\xfe\x80\xb6\x16\xb9\x23\x4e\xb8\xec\x74\x26\xde\xb7\x88\x62\xc8\x4c\xca\x50\xaa\xef\x72\xf5\xb0\xad\x4f\xe7\xb8\xf1\x7f\x2c\xcb\x7b\xfb\x6a\x98\x3f\x09\xa4\x0a\xe3\x04\x38\x1c\xdb\xf7\xd9\x64\x05\x91\x4a\xaf\x4d\x71\xf1\x02\xff\x3d\xc1\x38\x38\xc9\x6c\x12\xa1\x50\xb0\x3a\xd5\x65\xb7\x57\xcd\x6e\xaa\x4d\x0d\xae\x97\x3b\x04\x5d\x1e\x8e\x32\xdf\xcf\x17\x03\x9b\xe9\x6c\x6c\xa2\x17\x56\x54\x19\xc5\x31\x4b\xbd\xac\xc8\xb6\x97\x3d\x05\xe8\x17\x1f\x19\xa5\x0a\xe3\xde\xaf\xdf\x7e\x9f\x08\x80\x73\x19\x71\x07\xa4\x6c\xa0\xfd\x71\xe6\xc6\x27\xfa\x41\x32\x10\x95\x90\xcf\xe3\xc3\x6a\xbf\x9f\x4c\x7f\x89\x8c\x32\xc1\x9d\x88\x28\x12\x55\xaf\x1f\xff\x75\x9e\x07\xf9\xa1\x31\xb3\xb1\xef\x09\x3e\xeb\x3a\x3f\xb6\x9b\x5f\xa0\x4f\x73\x45\x41\x2e\x89\xcc\xd0\xfb\x65\x17\x68\x1a\xdb\xd5\xd3\xf5\x66\xfb\x5b\x7f\xd8\xaa\x64\xc0\x46\xae\xa1\x4f\x25\x64\xc2\x05\x9a\x02\x75\x41\xc7\xf3\x49\x35\xf8\x2d\x67\x21\xaa\x4c\xb2\x28\xf1\x0e\x72\x3e\x85\xfd\xc7\xd2\x3f\x61\xb4\x02\x4e\xe7\x6a\xbb\x1f\xce\x28\x99\x40\x8a\xde\x5a\xb9\x76\xfd\xce\x80\x40\x96\x69\xc4\xa5\x17\x54\x59\x9f\xea\x72\x81\xb9\x37\x14\x0c\x24\xe3\x14\xb7\xdb\x4b\xd9\xca\x6e\x73\x42\x55\xde\x0f\xf0\x22\xfe\x23\x9c\x71\x48\xfa\xd5\xf5\x62\xb5\xbc\x50\xc9\x6e\xfd\xc4\xd4\x18\x23\x6a\xb7\x7e\x14\x60\x7a\x7b\x6e\xdc\xee\x66\x4f\x44\xa4\x4c\xd2\x60\x78\x51\x9e\x73\xc7\x67\x0f\x5a\x08\x8d\xd5\xe3\x7c\xac\xa6\x11\x6e\x43\x16\x3b\x9e\x50\xb7\xa9\x63\xc5\x16\x5b\xc3\xfd\x51\xce\x29\x19\x9a\x53\xb9\x2c\x36\x25\x1c\xde\x2f\xaa\x83\xca\x47\xe9\x06\x6a\x61\x86\x8f\xc8\x10\x18\xb6\xb2\x70\xfb\xda\xca\x35\x58\x8e\x83\xba\x19\x97\x99\x02\xa4\x85\xaf\xf3\xf6\x19\xba\xe4\x77\x55\xd7\xd5\xff\x4a\x33\x7c\xb5\x66\xda\x9b\xa2\xad\x4a\xb3\xad\x8e\xa7\x59\xe9\x45\xca\x38\x35\xa4\x6f\xaf\x20\x9b\xf2\xe1\xd4\xea\xea\x03\x77\x36\x2e\x25\x51\xc8\x51\xaa\x0f\x27\x5f\x2c\x21\x62\xba\xc4\x48\x95\x12\x7c\x9b\xef\xde\x9b\x16\xea\xfc\x74\xc0\xf9\xba\x74\xe3\x8c\x27\xf1\x7c\xbf\x79\xde\xae\x46\x75\x2b\x09\x51\x84\x55\xea\x3f\x40\xe5\x77\xb2\x8b\x04\xfe\x4a\xba\xed\xff\x0a\x54\xfa\xab\x1a\xea\xe2\x8f\x87\xc8\x20\x8c\xf5\x1d\x64\xed\x9a\x08\xfd\x3c\xb5\xdc\xad\x9d\x3d\x3c\x34\xe8\xe0\xdc\x43\xbe\x7f\x51\xd5\x69\x44\x52\x58\x7e\x8b\x2d\xc4\x3c\x0b\x05\xb5\x56\x16\x8e\x54\xfe\x0c\x6d\xf7\x0a\x3b\x15\xaf\xc5\xa2\xb7\x8a\x62\xa3\xb3\xe0\x46\x51\x2c\x30\x2a\x46\x43\x15\xa0\x7e\x58\x00\x61\x4f\x1a\x38\x61\x8c\x61\xd8\x55\x69\x4e\x87\x9b\x8b\x87\x80\x53\x53\x31\xd5\x58\xcd\x3e\xf6\xfe\x93\x3f\x83\xe0\x23\x57\xa4\x0b\xdb\xfa\xbe\x81\x73\xe1\x97\xc5\x75\xfe\x06\xab\x9f\x23\x84\xfa\x72\x85\x5a\x11\x16\x4b\xc7\xfd\x87\xbe\xcb\xae\x88\x05\xc4\x6a\x16\x27\xfd\xfa\x5e\x06\x51\x54\xae\x92\x48\xe0\x62\x04\x1e\xdf\x79\x79\x73\x19\x98\xd0\xd3\x35\x51\x75\xab\x5c\x77\xda\xa7\x01\xc3\xa0\x52\x0e\xae\xea\xd2\xed\x32\x93\x88\x51\xa5\xc0\xb0\xd1\x5c\x06\x81\x96\x70\x80\xa6\x1c\x9c\x63\x91\x37\xea\xbb\xcc\x6b\xd0\x6d\x35\x53\x4f\x0c\xa3\x69\x8c\x4a\x0c\x98\xd4\x3d\xca\xf7\x81\x77\xa3\x28\xe5\x91\xaf\x0b\xb6\x79\xb9\xef\xb2\xef\xe6\xa5\x17\xee\xe1\x8a\x72\x8b\xc8\x85\x6b\xac\xd5\x41\xfd\x94\xef\xbd\x00\xf0\xf2\x83\xa7\x5d\xd8\x3f\xba\x15\x5d\x5e\xb0\xd9\x7e\xd9\x56\x03\xd1\x4f\x51\x4d\x50\x7f\xf5\xe1\x62\xfb\x43\x36\x2d\x6c\xab\x4d\x09\xf5\xfe\xfd\x9f\xdf\xfb\x11\x36\x46\x73\xc0\x5f\x47\xfc\x39\x53\x66\x94\xe2\x89\xab\x65\x3a\x20\xdb\xd7\xdf\x2f\x96\xd7\x60\xc5\x69\x8c\xb9\xa4\x23\xc4\xd5\xd2\x7c\xcc\x87\xfb\xa8\xa4\xac\xb8\x8c\x30\x7d\x73\x2a\x1a\xcd\xaa\x06\x2f\x4c\x11\x2e\x46\x64\x0c\x8b\x99\x4a\x9a\x3d\x78\x55\x81\xfe\x4a\x33\x49\x51\xa0\x2d\xec\x2f\x53\x67\xc2\x30\x08\x12\x04\x27\x97\xd5\x21\x2f\x07\x2d\x13\xae\x24\xe3\x0a\xbc\xc4\x06\xd6\x20\xa6\xad\xb9\xee\x38\xea\x53\xac\x6a\xd9\xe8\x71\x8d\x5d\x29\x42\xf1\x81\x7f\x2b\x0d\xd4\x87\xbc\x1c\x79\xc1\x7e\xb0\x38\x85\x0f\x76\x3b\x22\xee\xc2\x06\x7e\x61\x5b\xbf\xaf\x6c\x2a\xc5\x5c\x43\x61\x57\xc3\x1b\xc8\x62\x9d\x9b\xbf\x52\xd8\x3b\xb3\x75\x5f\x5c\xbf\x95\xe2\x32\xf4\x8a\xdd\x02\x33\xe6\x87\x28\x1d\x59\x84\x2d\xba\x37\x21\xaf\x4d\x5d\x1d\x3f\x78\xf9\x34\xcb\x70\xd3\x5b\xe7\xed\xf5\x29\x2f\x8c\x93\xf3\xf3\x07\x4d\x9a\x21\xf0\xb9\x4b\x36\x9d\x2a\x31\xbe\xa0\x8e\x64\xe6\xc7\x00\x27\x7c\x70\x1e\x9b\x14\xde\x15\xc8\x84\xda\xb1\x22\xcb\xd0\x36\x8a\xe7\xbf\xc8\xf2\x14\x17\xa6\xdf\x7f\xff\x7b\x56\xa4\x1c\x55\x5a\x21\xc8\xb7\x81\xf9\x1d\xba\x7d\xca\xc8\xb0\x12\xe8\x28\x62\x88\xb4\xee\xd6\xf2\xc0\xc3\xc5\x05\x66\x56\xe7\xd1\x11\xa5\xc1\xe4\xf7\x1e\x7e\xa2\xca\xec\x8c\x4b\xb1\xf8\x10\x74\x9c\x29\x34\xad\x7d\xab\x5a\x28\xaa\xfd\x6f\x63\x85\xd8\xf9\x50\x05\x58\x90\xdd\x63\x6a\x89\x75\x8c\x51\xeb\x47\xc7\x60\x30\x00\x0d\x6d\x96\xad\x23\xe9\xcf\xae\x33\xe8\x79\x39\x7a\x63\xfb\xb2\x96\xe5\x6b\x37\x3d\x7c\xcd\xbc\x9f\x60\x9a\x00\x30\xd2\xab\x7a\x60\xf6\xb9\x29\x4d\xb3\x0a\xd3\x40\x27\xc2\x2d\x16\x9b\x43\xf5\xbf\xf9\x68\x16\xe8\x54\x4a\xe8\x33\x58\xbc\x69\xdf\xa1\x19\x9d\x99\x46\x06\x6d\xdf\xa0\x5b\x3a\xd7\x5d\x16\xe7\xaf\x32\x9e\xa0\x52\xc2\x68\xea\x74\x76\x1c\x24\xfa\xa4\xe0\xaf\x9f\xaa\xa6\xc6\x69\xd0\xdd\x6e\x2e\xb1\x1a\xe9\xa4\x7a\xc3\xf7\xf3\xc8\xa0\x34\x26\xfc\x3a\x76\x77\xf9\x09\x8a\x4a\x9a\xfb\xd3\xc7\x74\xb9\x10\xfd\x6a\x9e\x99\x1e\xf9\x59\x15\x43\x16\xa7\x45\x9a\x25\xde\x29\x69\xa2\xe2\xbd\x3c\x61\xb4\x60\x84\xf7\x3a\x71\xed\xb8\xf9\x7a\x1a\xe1\x5e\xb5\x90\x8a\x0f\x38\xb8\x1e\xa0\xf0\x39\xca\x42\x67\x34\xa2\x22\xd4\x59\xc6\xde\x07\xe7\x81\xb8\x56\x31\xc5\x02\x61\x17\x53\xcf\x5e\x14\x1d\x43\xec\xbb\x45\x9b\x5f\x5d\x32\x0e\x75\xf7\xae\x84\x5f\xac\x55\x9a\xf6\x9e\x12\x7b\x32\xfc\x99\xf2\x60\x77\xe8\x12\x20\x78\x86\xc2\x39\x59\x3d\xbf\x54\xa7\xc2\xdc\x57\x5e\x79\x16\xe5\x5a\xa6\x88\x45\xad\xb5\xc6\x78\xd1\xc1\xd7\xee\x06\xfe\x84\xd6\x46\xe0\x91\x5d\xde\x04\xb0\xe9\xec\x82\xc1\xc6\xb8\xe8\xbb\x2d\xe3\xfb\xcd\xe3\x2c\x9a\xd1\x60\x6d\xc0\x28\xaf\x03\x15\x36\x9c\xde\x26\x69\x40\x55\x39\xfb\xdc\x41\xf5\xf6\x09\x70\x71\xf0\xd8\x89\xe9\x29\x2d\xe7\xb8\x4d\x39\x7a\xe2\x75\x7f\x36\x1d\xa3\xa2\x80\x71\xbd\xa3\xd5\x7e\x2c\xcb\xef\xc6\x98\x38\x95\x08\xa1\xbc\x93\xbf\x5c\x05\x30\xbc\x4c\x86\x50\x82\xe2\x36\x2d\x34\x4d\xfd\xaf\xe1\xaf\x29\x16\xc0\x2f\xee\x1e\x06\xef\x78\x7f\x2c\xa1\x04\xd7\x48\x97\xef\x38\x8b\x11\x74\xe7\xd9\xe5\xde\xca\x62\x81\x1a\x69\x12\x16\x73\x86\x10\x93\xa2\x19\x4e\xc5\x19\x42\x82\x9f\x1e\x6e\x37\xbb\xdb\xcd\xf7\xcd\xed\xee\xf1\xe9\xe1\xfb\xcd\xe5\xe6\xa9\x1f\x22\x5d\x67\xe9\x20\x5f\xe1\x0f\xa8\x67\x6c\x63\x93\x6a\x89\xa0\x64\x87\x98\xb8\xaa\xab\xc3\xe7\x2f\xac\xa1\x31\xc7\xa0\x15\x53\x36\x9f\x17\x05\x3d\xf3\xf1\xb4\x36\x34\x8d\x1d\x76\xca\x19\x47\xcf\xbe\x97\xf2\x48\x77\x6f\xe4\xc3\x97\xeb\xa7\xfc\x0d\xea\x27\x68\xaa\xe0\x50\xcb\x0d\xd5\x4c\xb9\x70\xb7\xec\x16\xbe\x42\x1e\x9b\xb1\x55\x1f\x37\x8c\x13\xec\xec\xb8\xc9\x76\xa3\x2b\x24\x46\xb9\x6d\x6a\xfa\x45\x3c\x75\x0a\x5f\xa8\x59\x97\x9b\xcd\xf6\xcb\x5a\xf6\x7b\x99\xe1\xcc\xbd\x65\x7d\xf4\xbf\x69\xda\xfc\x30\xa7\xba\x85\xc1\x99\x45\x35\x7d\x75\x7a\xbf\xd1\x70\x59\xcb\xb2\xb7\xa3\xe3\x86\x1b\x82\x4f\x1c\xab\xb0\xc1\x2f\xd8\x1f\x13\x51\x22\x93\x20\x9f\x86\x18\xe7\xd1\xca\xf9\x8f\x61\xf9\x34\x22\xe6\xb8\x7c\x1e\x97\x1c\x34\xb9\x11\xdc\xf5\x31\x5d\x4f\xf8\x09\xec\xa6\x7d\x99\xab\xe3\xfa\xa1\x99\x21\x48\x65\x3b\x4f\xe1\x3e\x4f\x9c\xfc\xc7\x65\x2c\x82\x2d\xc6\x13\x2a\xf8\xe5\x1a\xe6\x86\x66\xdc\xc8\xc4\x3d\x85\x41\x3a\xf2\xaf\x40\x47\xe1\x87\xca\x4c\x63\xe6\xe0\x70\xc2\xe1\x73\x9f\xbf\x79\x2a\x4a\x94\xc7\x07\xff\x36\x3d\x20\x59\x14\x79\xc9\x20\x16\xee\xb9\x8e\x34\xf5\x75\x02\xdf\x4f\xd8\xf4\xdd\x38\xa3\x0d\xc1\x3a\x60\x73\x3a\x4e\x61\x1d\x46\x5b\x83\x6a\x03\xa5\xcf\x7e\x9b\x5b\xb0\xfd\x6b\x69\x34\x25\x71\xef\xf1\xb1\xe0\xa2\x8d\x21\x1c\x0d\xa3\x21\x95\x7e\xff\xd9\x69\x59\x1a\xd7\x81\x1c\xdf\x05\x63\x99\x36\x93\x22\x3b\x9a\x08\xb8\xda\xd6\x67\x02\xcb\xdc\x80\x8d\x02\x86\xfa\x0a\xe0\x09\x74\x7e\xcc\xa1\xf7\x9f\xf4\x83\x6c\x2a\x50\x0b\xda\xaf\x34\x30\xe7\x93\x1a\xab\x33\x7c\xfd\x91\x54\x11\xc4\x0a\xc4\xe0\xb8\x39\xdd\x51\x21\x62\x14\xb1\x13\x8f\xb7\xab\xed\xcd\xfd\xb7\xbb\xdd\xea\xee\xe1\xdb\xfd\x76\xf7\xaf\xc7\x7e\xbd\x81\xc8\x72\xd4\xac\xd8\xfe\xcc\x1b\xcf\x97\x0b\x87\xe2\x88\x64\x3e\x51\xeb\xa6\xeb\x64\x12\x4c\xae\x0b\x62\x42\x10\x35\xb0\x0b\xb2\x7a\xe1\xef\x99\xc6\xba\xc8\x66\xbd\xd9\xce\xfb\x67\x40\x28\x20\x0b\xd8\x29\x58\x0e\x3d\xc5\x79\x51\x0f\xd2\x98\x58\xe7\x68\xaf\x4f\x75\xde\xce\x85\x7c\xc2\x28\xc2\x48\x17\x52\x7d\x7d\xb8\x7f\xde\xae\xee\xb7\x0f\xfd\x4f\x4c\xd3\x0c\xaf\xee\xe6\x72\x52\xd1\x84\x94\x29\x69\x47\x31\xdd\xf7\xea\xd7\xc8\x7f\x66\xfe\x6b\x45\xf8\x14\xb0\xd4\xbf\x26\x7e\x7f\xbd\x0b\x01\x2d\x30\xe1\xc2\x69\xd7\x68\xbc\xac\x4f\xaf\xaf\xe7\xe9\x99\x1f\xcb\x23\x17\xd5\x7c\xaf\x5a\xb8\x3b\x35\xb9\x9e\x67\x31\x61\x9c\xd1\x78\xce\x9b\x8b\x07\x5c\x34\x17\x40\xe7\x9f\x96\xd4\x40\xd0\x14\x81\x59\xd2\x98\x31\xb7\x68\xf2\xa3\x44\xe6\x92\x7d\xfc\x51\xea\xfd\xae\x3a\x1c\xe4\x6c\x35\x03\x21\x33\xe1\xbc\xf4\xbd\x0b\xf4\x75\x35\x83\x77\x40\xc6\x41\x74\xcf\xc0\xcf\xe0\x70\xbd\x4b\x3a\x7a\x1c\xa4\x70\xb8\x74\x04\xac\x79\x72\x6c\x1a\xf5\x07\x05\xee\x73\x8f\xd7\xd7\xf2\x30\xe9\xc1\x80\xcc\x1c\x3f\xe4\xe6\xfe\x6b\xf8\x93\x92\x89\xf6\x09\xfd\xfa\xf4\xde\xa5\xfc\xe7\x19\x36\x28\xc3\x99\xf6\xc5\xd8\x39\x3f\xfc\x33\xbc\x25\x68\xe9\x25\x6c\x5f\x40\xbf\x92\xe5\x7a\x1d\x98\x58\x39\x1b\xb0\x41\x36\x76\xf1\x4e\x1b\x1a\xc7\xbe\x4a\xb9\x3a\x22\x56\xcb\x54\x0b\x46\x8f\x1c\x4c\x16\x29\x2f\xfc\x87\x6f\xfd\x58\x70\x8e\x83\x51\x04\xc3\x7c\x03\xba\x0a\xea\xee\x7f\x59\x6b\x9b\x5d\x31\xa4\xc8\x70\xb9\xcb\x75\x5e\x3e\xc9\x46\xfe\x53\x1e\x4e\x61\x61\x05\x30\xc6\x8a\xc1\x4a\x7f\x55\x1a\x1f\x71\x9e\x31\x14\xc0\x02\xb8\xd5\xd9\xfb\x94\x5f\x6e\xbf\x8f\x1f\x98\x8d\x18\x68\x1f\xcd\x5e\x55\xf5\x6b\x20\xe3\x4c\x0b\x7b\x36\x52\x42\x0f\xcc\xcd\xaa\x9c\x1a\xad\x76\xc7\x2d\xe2\x7a\xbb\xd7\x18\x9c\x66\xd0\x18\xcf\xee\x54\x9e\xc2\xd2\x67\x23\xeb\x64\xb0\x1b\x68\xbf\xe6\xe5\xde\x54\x07\x87\xf5\x0d\x53\xd5\xc6\x8c\x68\x31\x40\xe4\xbb\x15\x6a\x52\xa6\xb2\x31\x70\x8b\xe6\x44\xbb\xa6\xb2\xed\x85\x3c\x7e\x6b\xc2\x7e\x64\x49\xea\x30\x03\x2f\xb2\x79\x79\x94\xfd\x2b\x66\x49\x66\x8d\xe9\xeb\xe8\x01\x26\xf7\x78\xbe\xdf\xdb\x04\x28\x36\x2a\xc6\xaa\x0f\x0f\xf6\x42\x9e\x0a\x53\xfb\x4d\xdf\xbf\x31\x36\x8d\x52\xdd\xe7\x45\x9e\x1f\xfc\x02\x87\x69\x70\x6f\xd3\x48\xb9\xee\x35\xfe\x88\x27\x68\xa0\x7e\x83\xef\xfd\x43\xb2\x34\x4a\x5c\x53\x6b\xf3\x1d\x41\x24\xfd\xdf\x63\x89\x94\x75\xd9\xbe\x4c\x1e\x1a\xd5\x02\xf7\x0e\xe8\xb2\x58\x5f\x8f\xbb\xaf\xae\x60\xd6\x7b\xb3\x4c\x41\xec\xbc\xa6\x4f\x0d\x38\x7f\xd3\x59\x1c\x6f\x79\x0a\x88\xf2\x3d\x1d\xcd\x45\x75\x3a\x56\x25\x36\x02\x9c\xdd\x41\xaf\x1e\x31\x8a\x9d\x2d\xd7\x52\x65\xfd\x6d\x74\x4e\x48\xd3\xd9\x61\x39\x10\x19\x0f\xac\x92\x8b\xaa\x99\xf5\xc9\x6c\x46\x93\xd4\x97\x3d\x6e\xf3\xf2\x15\xcc\x4d\xff\xdb\x74\x14\x59\x9f\x21\x6e\x1f\xb7\x9f\x6a\x0b\x59\x6d\x1c\x26\x09\xd7\xb2\x9b\x8b\x87\xd9\xb7\x68\xa3\x50\x71\xd5\xe5\x45\x33\x01\xc6\xe9\x50\x13\xa5\x18\x8d\x6c\x5f\x20\x30\x06\x03\x6f\x2a\x8c\xd0\xa9\x57\xae\x5c\x12\x28\x1e\x80\xaa\x16\x3c\xcf\x61\x2a\xfd\xb2\xcc\x72\xb3\x60\x63\xe4\x19\x85\x6e\xe0\xe7\x12\x12\xd6\x02\xc5\xe2\xe8\xe0\x8d\x72\x8d\x2a\xc2\x17\x83\x14\xa7\x88\xa2\x88\x92\x91\xab\xee\x10\x7a\x5d\x55\xf5\x20\x1a\x22\xa2\x98\x19\x39\x56\x9c\xff\xcb\x84\x45\x44\x31\x87\x88\xce\x84\xc5\xe7\x3f\x4a\x44\xb1\x4a\x1d\xdb\x01\x01\x27\xbb\xfe\xfb\xb4\x6b\xa5\xbb\xfa\xf8\x3f\x2b\xb5\xb8\xf7\x88\x88\x30\xee\x70\xae\x70\x38\x16\x7d\xc0\x22\xa2\x24\x55\xb8\x08\xb9\x62\xd8\xf6\xe6\x4c\xcb\x39\x8c\xe3\x2e\x7f\x7f\xcb\xe1\xe7\xae\x0b\x18\xf7\xf2\x00\x83\xf4\xb6\x88\x52\x26\x62\xd1\xc7\x7b\x5e\x95\xc4\x2d\xe1\xfd\x4d\x4c\x05\x73\x26\x1d\xf2\xbd\x5b\x54\xff\xda\x22\x48\x44\xa9\x89\xe3\xa0\x5c\x87\x68\x3a\x8c\x6c\xb7\xd5\x6f\xd3\x61\x34\x01\x70\xee\x7a\x5d\xee\x53\xda\xaa\x3e\x38\x99\xd6\xe5\x5f\x43\xd3\x08\x35\xf7\xef\xab\xda\x34\x6d\x5d\x1d\x1c\x29\xf7\x09\xd3\x44\xaf\x3b\x3a\xe0\x67\x45\xc4\xe2\x24\x64\x1b\x4e\xf1\x7a\xc4\x01\x17\x11\x4b\x59\xc2\x47\xcc\x5a\x34\x50\x71\x29\xe7\x6f\xd3\xe2\xd2\xdf\xf8\x67\x72\x9d\x2c\x55\x41\x9b\xb8\xfb\xf1\x7e\xf6\x6c\xb7\x77\x9e\xac\x10\x3b\xf5\x05\x5f\xe2\x11\x11\xa3\x04\xab\x00\xbd\x5d\xdd\x14\x71\x3d\xbd\x67\x9c\x70\xcc\x4a\xf2\x16\x0e\x18\xd1\x6f\xab\xc0\x8a\x9c\xbd\x7b\x9c\x66\xa4\x7b\xf8\xbb\x3e\x0b\x1d\x89\x73\xcc\x86\x7a\xb3\xa6\xbc\xe9\xc3\x5f\xe7\x97\xfa\x5b\x3f\x20\x65\x22\x60\x33\xf6\xa1\x4f\x3e\x0d\x47\xc2\x50\xeb\xdc\xd8\x0a\xd9\x63\xd2\xf2\x3f\xc1\x8c\x7c\x67\x44\x24\x84\xa4\x69\xcf\x5f\x73\xc6\xdb\xcf\xed\xe8\x05\x17\x36\x31\x4e\x1c\xaf\x74\x22\x0d\x8b\xe1\x8c\x88\x32\x9a\x62\xcc\xe3\xca\xa1\x4f\xd0\x4b\x16\x8c\x90\xa0\x22\xca\x78\xcc\x7c\x19\xeb\xf2\x54\xee\xa1\x2a\x2f\x73\x6b\x73\x7d\x2a\xda\xf7\xd9\x9d\x90\x11\x63\xe9\xc8\x0d\xc8\xf9\x56\xfa\x8e\x6c\x18\x63\xa2\x49\x40\x3e\xd3\x41\xed\x06\x00\x2e\x65\x68\xd8\x70\x0f\x3f\xaf\xe5\x41\x15\xde\xd1\xff\xcc\x37\xe8\x6f\x85\x41\x22\x52\x09\x03\x3e\x90\xba\x2e\xe4\xc0\x07\x14\x91\x12\x69\x6a\x47\x57\xfd\x03\x50\x6e\x7b\xf9\x4c\x3a\x72\x9e\x5f\xc5\x71\xd5\xbc\x8e\xca\xfd\x22\xd2\xd4\x0e\x4c\xf1\xde\xcb\x40\x44\x9a\x0b\xbc\x29\xdd\x76\x2d\x6b\xfd\x82\x32\x51\x83\xde\xb9\x88\xb4\x54\xe8\x3b\x78\xe5\x1c\x2a\x48\xff\x77\xa3\x93\x61\xdb\x39\xd7\x9a\x10\x91\xd1\x29\xca\x40\xe5\x3d\xa5\xd4\x49\xbf\xf6\xaf\x0a\x70\x57\xe4\x78\xd8\xae\xfa\x3f\x09\x47\x83\x6d\xa0\xfd\x56\x7a\x61\xdc\x3b\x0c\x2f\xe7\xce\x6a\x22\x02\x69\xb8\x23\x65\xb6\xa7\xba\x7c\x40\xb3\x0e\x34\x8a\x98\x5d\x87\xd5\xae\x77\x96\x8f\x34\x89\x45\x1c\x11\x67\x23\xd6\x48\x0b\x17\xb2\x69\xbd\xb1\xfb\xe4\x7e\xc6\x11\x65\x18\x01\x5f\xdf\x3d\xb9\x22\x33\x3a\xd0\x0d\xea\x85\x22\x8e\xa4\x73\xdd\x5a\x9f\xde\x2f\x64\x7d\x25\xf3\x62\xc1\x51\x65\x76\x52\x9d\xb9\x9a\xcc\x8b\x9c\x90\x43\x45\x1c\x33\xe3\x5c\x85\xbb\x30\x1f\x5b\xab\xb2\xe8\x22\x87\xd9\x55\xc5\xd2\x81\x39\xfd\xd7\x4c\xfa\x86\x61\x08\xc4\xc1\xff\xe6\x12\xd4\x69\xdf\xdf\x43\x7f\x9c\x80\xc8\xf8\x04\x5b\xe7\xa0\x11\xd3\xb3\x10\xd0\x9e\x07\xff\x96\x37\x30\x11\x9c\x16\x71\x92\x44\xa9\x9b\x09\x75\xb7\x03\x3c\x94\x6b\x78\x91\x85\xed\x9e\xf5\x13\xbc\x41\x7d\xde\x19\x39\x4f\x11\x96\x25\x56\x44\x9c\x30\x47\x8b\x77\xc5\xba\x6f\x8d\xc7\xb6\x4e\x07\xa5\xcc\x75\x01\xd4\xa9\x2e\x97\x22\x27\x11\xa7\x99\xc5\x28\x4e\xc1\x3e\x2f\x87\x62\xa0\x88\x53\xeb\xcc\xa9\x6e\xab\x7d\x34\x7d\x04\x94\x67\xa8\x4c\x96\xfb\x02\xe1\x63\x12\x3e\x43\x01\xc4\x18\xd2\x84\x72\x8d\xb3\x27\xd3\x4d\x32\x94\x05\x38\x99\x3d\x38\xb3\xac\xe1\x9e\x73\x19\xa3\xbe\x0b\xc2\xf0\xb7\xd5\xba\xdb\x17\xaf\xf2\xb2\x84\xf7\xf0\x15\x1c\xb4\x09\xc0\xaa\x5e\xf6\x7c\xf6\x15\x22\xb2\x8e\x40\xdc\xcd\x46\xc4\x6f\x2f\x6f\xa9\xb1\xa0\xce\xed\x5d\xe6\xf5\x65\x5d\x1d\xa7\x00\x80\x19\xbc\x49\xc4\x99\x31\x02\x26\x2f\x84\xbb\x80\xaf\xc3\xd5\x49\xe5\xe4\x54\xa5\xe9\xed\x61\x10\x09\xb7\xb8\x99\xc5\xd2\x00\xea\x22\x4a\x95\x8f\x6b\x3a\x22\x56\x84\x21\x9b\xc8\x49\x13\xfb\xde\xeb\xae\x3f\x0a\xc2\x4b\x7b\x05\x6c\x8b\x88\x35\xa1\xc8\xf9\xee\x7d\x80\xf6\xb0\x7e\xef\x62\x3c\xd3\x8f\xb0\x2e\xff\x93\xc6\x04\x73\xe7\xc5\xe6\xb5\x88\x4d\xe2\x92\xe4\xdb\xaa\xdc\xaf\xab\x53\xb7\x94\x86\x5b\x42\xc6\x8e\x1f\xd3\xd7\x33\xfc\x61\xb8\x5f\x46\x6a\xbc\x5f\x9b\x8b\x2f\x0f\xe1\x2a\xc0\x30\x84\x9e\x15\x95\x7e\xc5\x97\xa7\x3f\x00\x12\x63\x50\xcf\xb5\x6c\xba\xed\xb0\x9b\x27\x77\xd0\xca\x2e\xc8\xfd\xed\xac\x7c\xb6\x64\x71\x2c\x62\xb0\x36\x68\xfa\xdf\xc9\x5f\x73\x76\x8f\x88\xad\x04\x5c\x8c\xa0\x34\xcf\xdb\xfe\xb2\xac\x96\x2a\x09\x88\xb8\xfc\xe8\x95\x9d\xc3\x53\x46\x21\xaa\xf7\x6e\x7d\x98\x30\xa2\xba\x8f\x39\xcb\x0f\x77\xd7\xc3\xd2\x3d\xb9\x1e\x6b\x9c\xa8\x4c\xde\x3c\x0f\x5d\x44\xf7\xa2\xa1\x34\x51\xff\x7c\x2c\x44\xa8\x31\xf3\x07\xc8\x42\x4f\x68\x69\xdd\x31\x82\xfd\xac\x1d\x1c\xf2\xd6\x53\x76\x3e\x68\x6c\x4f\x9f\x01\x89\x92\x34\x46\xf4\x5e\xfb\x52\x40\x0b\x68\xae\x34\x3a\x33\x89\xd2\xc8\xd1\x4d\x1d\x40\x63\xa9\xec\x2d\x48\x04\x04\xd3\xe0\x12\x7e\x8e\x71\x9d\x7f\x65\x89\x33\x3b\x89\x65\xe8\x76\xd2\xdd\x85\xea\x10\x66\x0c\x89\x95\x4a\x93\x7e\x19\xdb\x55\x68\x18\x30\x79\x1f\x09\x89\x52\xe1\x85\x08\x83\x4f\x99\x07\x42\x4c\xc7\x25\x32\xc3\x0a\x86\x3b\xd5\x15\xc0\xb6\xcb\xd0\xa6\x57\x91\x18\x67\xdd\xef\x1d\x46\x26\x15\x20\x3f\x84\xa6\x80\x2a\xed\x2f\xb9\x81\xe7\x93\xea\x12\xa2\x7d\x35\x23\xad\x09\x42\x79\x14\x54\x8f\xee\x31\xf9\x2e\xaa\x76\x39\x8d\x21\x2c\x75\x26\xfb\x47\x94\xb0\x54\xdd\x26\xe2\x04\xc3\x73\xa8\x9b\x9b\x30\xbd\x67\xe7\x67\x1a\xb0\x78\x81\x73\x6c\x5b\x39\x99\xac\xf9\x18\xeb\xf8\xb3\x4e\xfd\xf3\xb5\x57\x82\x3f\xc3\x56\xf9\xf1\x9c\x2a\x0c\x63\x0f\xb9\xd3\x04\x3e\x1d\x97\x25\x67\x66\xd7\xcf\xb3\x84\x38\x8f\xe6\xfc\xcf\x31\x08\x56\x10\x2e\x33\xd4\xf1\x32\x3e\xa7\xc5\x1a\x8a\x0b\x8e\xfd\x88\x4c\xba\x3c\x35\x04\x8b\xab\xd2\xfc\xe8\x16\xe4\x6f\x75\x71\xf6\xad\xe3\x79\x43\x64\x6c\x30\x7b\xf9\x5a\xe7\xcd\xb6\x37\x72\xeb\xfe\x6e\x83\x0b\xd2\x65\xfe\x76\x31\xb2\x6c\xf4\x03\x54\x0a\xf8\x23\xbb\x1d\x31\x68\x0e\x08\xa2\x74\x82\xb2\x9c\x4f\xc1\x78\xf9\xa2\x2a\x9b\x2e\x1b\x47\xf0\x52\xfe\x16\x38\x5f\x82\x18\x41\xbd\xfb\xde\x2b\x94\x77\xf9\x68\xc7\x5f\x4e\x85\x89\x31\x69\x3c\x2c\xbd\x13\xf7\xe5\xe9\x40\x20\x0c\xd3\xd9\x5c\x57\x9b\xd2\xdc\xf6\x9d\x5d\x41\x20\xe3\x51\xe6\x61\xdd\xb5\x59\x96\x92\xc3\xe8\xee\x43\x12\x92\x20\x00\x34\x28\x2e\xac\xdf\x0b\xf9\xb3\xb9\xcb\x0b\x68\xda\xaa\x84\x3b\xf9\xeb\xb1\x6a\xda\x63\x35\xd8\x6b\x09\x62\x13\x87\x37\x41\x5d\x98\x99\x68\x52\x77\x14\xf0\xed\x46\x45\xcf\xb9\x32\x55\x18\xc3\x41\x0c\x33\xf7\x29\xdf\x57\x88\x4f\x58\x0c\x33\x92\x28\xb6\x4e\xa0\xfc\xa4\x2e\xe1\xed\xa1\xff\xe9\x49\x24\x34\x96\x88\x5e\x9c\x4c\xea\x4d\x39\x92\x47\x16\x49\x24\x39\x26\xe8\xeb\xed\x97\xa7\x6d\xb0\x8b\x5d\x7e\xbb\x93\x08\x22\x6c\x84\xac\xb6\xdb\x49\x49\xc2\x1f\x8e\x85\x40\x53\x6f\xa9\x64\x69\x46\x7f\x86\x4c\x7b\x4a\xc6\x63\x21\xdb\x2e\x15\x5b\x90\xd7\x11\x09\x21\x69\xe2\x94\x32\x2b\x9b\x07\x01\xd3\x70\x12\xa2\x34\x26\x00\x9b\xed\x97\xdd\xe3\xd3\xcd\xc5\xa6\x3f\x00\x0a\xf5\xe6\x8a\xaa\xc8\xfb\xb2\x43\x92\xc4\x0a\xe9\x29\x12\x33\xdd\x47\x94\xfc\x0d\x87\x28\x43\x6d\xc0\xbc\x59\x9f\xea\x72\xd0\x8b\x14\x49\x22\xc1\x7d\xe8\xbf\x27\x79\x90\xfd\xf5\xa7\x84\x63\x84\xdf\xed\x0c\x28\xfa\x71\x51\x99\xd9\x8b\x97\xa4\x94\xa0\x8a\xd6\xdd\xea\xe9\xeb\x66\x3b\x0a\xcd\x93\x94\x11\x2d\xfb\xe5\xf0\xaa\xae\x0e\x23\x25\x58\x3f\x86\x46\x19\x02\x07\x65\xd3\x60\xfc\xef\xf2\xf3\x6d\xe5\x89\x19\x9b\xff\x9e\xf2\xf6\xfd\x6a\x48\x6f\x13\x4a\x24\xde\x0d\x3f\xdc\xcb\x8f\x96\xa6\x4b\xda\x90\x87\xf1\x57\x28\xd4\xc5\x3a\x79\x38\xb9\x92\xd8\x82\xbd\x85\x7d\x55\xc8\xfe\x45\x61\xc4\x60\xa4\x1d\xfc\x48\x1d\x4b\x66\xf9\x14\x2c\x33\x4c\x8d\xb8\xda\x73\xaf\xf4\x19\x74\x2c\x7c\xca\x26\x81\x96\x1d\xc0\xac\xeb\xee\x46\xe4\xfd\xd2\x91\x08\xe9\x5a\xd9\x35\x12\x1f\x07\x53\x88\xfe\xb8\x62\xb8\x91\xa1\x69\xe2\xd0\x02\x15\x49\x96\x5a\xd3\x93\x42\x31\x85\x5d\xf5\x87\x68\x8c\xb0\xb8\x87\x1f\xf7\xbb\x8b\x41\x64\x7f\xa1\x25\x22\xc2\x27\x84\x55\xdd\x27\xbc\xe1\x5d\xd0\x1f\xf6\x47\x65\x02\xd2\xf1\x53\xdb\xb6\x72\x3f\x64\xb4\xbc\x26\x92\x3a\x41\xb8\xa7\x5c\xbf\x04\xac\xf2\x1c\x6d\x34\x5e\x76\x12\xc9\x52\x44\x50\xdc\x34\x2b\x17\x44\x4f\x13\xd8\x44\x66\x04\x7c\x96\xe5\x38\x0c\x41\x88\x7e\xf9\xd9\x28\x49\xc2\xb3\xb9\x69\x9e\xa1\x6d\x47\xa7\x52\x32\x65\xac\x5f\x70\xbe\xe4\xc6\x40\xb9\x2c\x33\x24\x12\x6d\x62\xe9\xa5\x4a\x4e\xa6\x79\x84\x7a\x13\x84\x00\xbb\x63\x80\x29\x4f\x09\x3f\x11\x67\xd8\xff\xdd\xb2\xc4\x49\xb5\x22\x82\x5f\xbf\xf6\x89\x5c\x62\xba\x1c\x36\xe0\xb9\xca\x71\x0b\x42\x24\xc6\x3a\x0d\xdd\x3d\x52\x2e\xc2\x16\x3c\xd3\x3a\x13\x89\x35\x06\xe7\xef\xcd\x8f\xd5\xfa\x21\x04\x9e\x69\x14\x59\x4c\xd0\xd0\xa9\xa0\x2f\xf8\x8b\x34\xca\x68\x90\xca\xfa\x91\x97\xae\x8f\x7c\xcc\xcb\xfd\xcd\xe5\x82\x46\x85\x48\x63\x4a\x10\xf5\xf7\x7c\x44\xd2\x07\xa6\xbb\xcd\xfa\x7d\x71\x2d\x4e\x63\xc6\x91\x23\x72\x6a\xa0\x6e\x1e\x07\x42\xa5\x48\x63\x2e\x70\xa7\xbf\x5d\x3f\xdf\x0f\x7f\xcb\x10\xc8\x93\x1f\x6d\xb3\x6a\xbd\x69\xe0\x6d\x55\xbd\xce\xd0\xf3\x22\x8d\xb3\xc4\x9b\x60\xb5\xdb\xbc\x80\x2f\xc7\x73\x44\x5b\x98\x4d\x69\x2c\x1d\xe9\x48\x9d\xde\x6f\x5a\x38\xfc\x2d\x91\x2c\x91\xc6\xc6\x20\xe2\xb5\x7d\xc9\x6b\xe3\xaa\xaa\x2e\x05\x9b\xc0\x53\x45\x4a\x98\x0c\x0e\xf0\x18\x6f\x5f\x82\x34\x45\x5e\x8e\x71\x02\x22\x25\xca\x45\x12\xc8\x51\x48\xc3\x47\x13\xe6\x76\x73\x1f\x20\xe2\x5a\x77\x35\xf0\xdd\x16\xb7\x9e\x34\xd1\xb1\xd3\x7e\xce\x07\x7b\xd0\x31\x6a\xba\x1b\x41\xb0\xef\x7d\x77\x73\xbf\x5b\x5d\x5c\x6c\x1e\xb7\x9b\xcb\xd0\xe8\xbf\xba\xb9\xbf\xdf\xfc\xde\x8f\xb4\xd6\x75\x14\xf3\x7d\x79\x9a\x8a\x11\x8b\x34\xa5\xe0\x96\xd6\x17\x99\xcc\x0e\xd1\x34\xc1\xe8\xd7\x2d\x69\x93\xb4\xed\x2f\xee\x2a\xa3\x19\xae\x9d\x58\x52\x19\x61\x9a\xfd\x61\x1e\x39\xab\x08\x2f\xc7\x75\x27\x5b\xa8\xf3\x99\x7f\x99\x48\x79\x16\x61\x5e\x2e\xf7\x50\xb6\x37\xe5\x5b\x35\x3f\x8b\xb1\x58\x4d\x71\x6b\xd8\xc6\x17\x62\xcf\x1a\x30\x22\x15\x84\x38\x1c\x61\xfe\xa7\x3c\xa8\x90\xe0\xa6\x82\x47\x3a\xe0\x05\x07\x37\xd9\xe5\x1f\x24\xb8\xe3\x17\x39\x8e\xfd\x90\x76\xf5\xe7\x12\x1a\xbf\xa2\x97\x98\x93\xcd\xeb\xfc\x2a\xac\xc2\xca\xaa\x34\xc6\x2b\x2e\xd7\xff\xac\xd4\xe7\x91\x60\x2a\x49\x12\xf5\x6e\xab\x87\x63\x0b\x3b\x3a\x49\x06\x53\x49\x18\x2a\x0e\x1e\x64\x83\xfb\xbb\x7b\x1f\x3f\x61\x0e\x8a\x54\xa6\x5c\xa5\x3d\xa8\xb6\x99\x9d\xcf\x38\x73\xc8\xab\x2e\x4c\x7b\x86\x33\x84\xb7\x48\x25\xc4\xb8\x30\x34\xb2\x00\x17\xd7\x4c\xfa\xed\x22\x55\xd4\x60\x67\xd1\xe6\x03\x8e\xa5\xff\x72\x25\x9c\x66\x4f\x77\xad\x2b\xbf\xfd\x5f\x01\x2c\xcb\x2c\x8b\x54\x59\xc6\xfd\xb4\x7b\xec\x72\x85\x01\x51\x2e\x52\x1d\xa7\x88\x4b\xb8\x95\x1a\x9a\xbf\xdc\x56\x52\xcd\x1c\xb6\x72\x3d\x5d\x1f\xc2\x51\xc9\x55\x50\x43\x3a\xb5\x6d\x55\x8e\xeb\xb8\x29\x18\x89\x31\xd4\xa2\xa2\xea\x70\x12\x9b\x38\xb5\x36\x7c\xed\x77\xed\x0b\xec\xea\x53\x01\xb3\xfb\x67\xa5\x75\xc2\x2d\xdd\xc2\xef\xed\x03\x37\x6f\x7d\xfe\x4c\x23\x21\x43\x07\xe9\x09\xba\x25\x68\x02\x64\x14\x34\x26\x29\xce\xca\x8b\x2a\x2f\x69\x96\xc6\xfd\xdf\x99\x44\x4c\x1a\x02\xdb\xae\x6a\xa7\xac\xdb\x1f\xcc\x00\xbb\xc4\x23\xaf\x9b\xc1\xe7\x46\x50\x12\x11\x2c\x77\x1f\xe4\xaf\xdd\x76\xe0\x44\xed\x8a\x81\x19\x2c\x28\x49\x39\xde\x6f\x24\x9b\x7a\xa8\xd6\xd3\x05\x89\xc2\xf1\x24\xcd\x90\x00\x7d\x94\xef\xdb\x0a\x51\xad\x93\xbb\x43\x13\xea\x5c\xff\xdc\x66\xeb\xc5\x52\xc6\x71\xf5\x55\x55\x3b\x88\xea\x79\xe3\x5c\xd0\x84\x25\xcc\x11\x81\xdf\x40\x16\x23\x78\xde\x88\x28\x3f\x0c\x05\x07\x8e\x2f\xcd\x7c\xd3\xa4\x09\x37\xd2\x86\x67\x74\x87\xfe\xc0\xab\xb6\x85\xc3\xb9\xa1\x7b\xf8\x80\xd0\x89\x03\xab\x7b\x68\x98\xeb\xab\x9d\x77\x5c\x05\x4d\x99\xeb\xb5\x23\x36\x18\xf6\xb9\xf6\xba\x04\xa3\x07\x91\x2a\x89\xc1\xd2\xca\x98\x27\xac\xa0\x37\x7e\x1b\x9e\x9d\x8a\x46\x8a\xc9\x71\x44\x79\x7a\x1f\xbf\x91\x94\x66\x52\x7a\x3e\xba\x86\xa6\x19\x7d\xd1\xe2\xab\x49\x99\x36\x0e\x5e\x0a\x26\xd7\xf2\xd7\x30\x5d\x29\x33\x34\xf6\x18\x9a\xc0\x2b\x1a\xb4\x77\x05\xe5\x09\xc1\xb5\xfa\xf2\xe1\xf6\x76\xf5\xb4\xbb\xdc\x5c\xdc\xdc\xad\x6e\x9f\x77\x77\xdf\x6e\xb7\x37\x8f\xb7\x37\x01\x51\x26\xa8\x88\xb3\x20\x82\xff\x5d\xb6\x37\x66\x08\x16\xc6\xf3\x90\x0a\x22\x30\x4d\x7c\x83\xd2\x54\xf5\xb8\x83\x48\x85\x34\x58\x4a\xd9\xfc\x3a\x16\x55\x0d\xc3\x5d\x13\xd2\x60\xb0\xd4\x78\x88\xf8\x84\xa8\x90\x86\x41\x56\x26\x6a\x04\xc2\x0f\x2a\x7a\x4e\xee\xc6\x0f\xca\x34\xc3\x85\xbc\x3a\x3a\xb5\xa4\xc0\xa4\xbd\xb9\xfc\xe0\xc6\xc9\x44\x21\x95\xd3\x2b\x4c\x8d\x66\x47\xa8\x04\x50\x49\x41\x07\xe6\x3f\x42\x5b\x77\x36\xee\x67\x85\x62\x89\xf1\x21\xcc\x18\x1d\xb5\xce\x67\x55\x06\xaa\x98\xb6\x3e\x7d\xfe\x03\xda\x97\x45\x3e\xbc\xa0\x9a\x65\xde\x19\x1f\x64\xdd\x57\x32\xa7\x63\x80\x70\xa7\x41\x53\x57\xa7\x63\x33\xb9\xc3\x90\x46\x18\x8b\x14\xb9\x05\x07\x8c\xd9\xf5\xb7\x06\x74\x8c\xb9\x44\x01\xb6\x65\xb3\x8b\xb3\x34\x8a\x63\x8f\xbf\x7d\xea\xde\xb3\x7b\xf8\x15\x4e\xca\x22\x11\x51\xe9\x34\x77\xbb\x65\xe7\x2e\xd8\x64\x08\x16\x29\x8b\x20\xc3\xe6\xa5\xfa\xf9\xb3\xaa\x7b\xfe\x8d\x60\x91\x71\xca\x2e\xbb\x50\xc6\xe9\x2b\xc8\x53\x81\xfb\x7f\x2c\xff\xe7\xe2\x2e\xcd\xe2\x88\x60\x40\xac\xab\xc3\xb1\xc8\xbb\xa0\x79\xd2\x3c\x61\x24\xce\x30\x9b\xba\x43\x87\xd0\x45\x37\x5e\xc1\x88\x71\xa9\x2d\x1a\x1f\xe5\xe5\x7e\xfb\x7e\x0c\xb3\x8e\x25\x31\xc4\x62\xe2\x75\xfd\x61\x40\x34\xec\xbf\xb3\x11\x61\x2b\x64\x09\x55\xd1\x20\xf0\x1a\xae\xc6\xa3\x5e\x66\xbf\x73\x7a\x89\x89\x16\x86\x3a\x10\x91\x2e\x4e\x06\x66\x10\x4b\xc1\x12\xe3\x24\xff\x26\x0d\xd5\xe7\xb3\x9c\x86\x25\x36\x41\xea\xc5\x02\x44\x76\x71\x3f\x66\xa9\xa4\xb8\xc2\xf9\x65\x27\xf8\xf1\x7b\x7b\xde\x30\xc8\x44\x08\x30\x7b\x5a\x5d\x0e\x5a\x62\x82\xd1\x28\x46\x6d\x98\x91\xec\x66\x14\xee\x05\x15\x22\x98\xe1\xd8\xbc\x3e\x7c\x87\x5a\x55\x23\xc4\xca\xc7\x98\x18\xc1\xa8\x56\x86\x0d\x9a\x24\x9e\x16\xd1\xac\xdf\xb7\xb5\x74\x5a\xb6\xf9\xe7\x86\xa7\x82\x31\xe1\xb8\x2b\xb8\xe5\x1e\x8b\xf7\x27\xf9\x73\xb9\xf0\xca\x78\x2c\x51\x6d\x19\x95\xa3\xe6\x8b\x3b\xe3\xc4\x0a\x8f\xf1\xc3\x8e\xef\x79\x2c\xca\x44\xea\x9a\x12\x25\xfc\x6a\xbf\x95\xb7\x13\xc2\x84\x60\x82\x6a\x93\x0d\xf4\x51\xaf\x79\x39\x3b\x85\x8a\x53\x61\x82\x9c\x17\x3a\xec\xbe\xfb\xc2\xc9\x5d\x65\x60\x23\xeb\xf2\x5b\xd9\xe6\xc5\xad\x6c\x5a\x27\xba\xb0\x06\x5d\x1d\xc0\x6d\xad\x61\xe5\x1c\x73\x57\x3f\x98\x4d\x2a\xcd\xa8\x8b\x13\xf5\x16\xe7\x7b\xf0\xd3\x1b\x93\x2e\x05\x53\x2a\x71\x56\x5e\x2f\xd5\xcf\x72\xf6\x7e\x29\x05\x9e\xea\x8a\x6a\x57\x83\x9e\xe0\xb9\xa8\x4d\x80\xf2\xcd\x2e\x42\x47\x80\xed\xec\x4b\xe7\x3d\x17\xbe\xd4\x24\x06\x13\xee\x6e\xf0\xb6\x5a\xbb\x53\xcd\xee\x93\xc9\x58\x16\x18\xc3\x3b\x2f\xd6\xb3\x58\x19\x67\x46\x09\x0c\x7a\x77\x5d\x96\x9e\xef\xbd\xcc\xc1\xa7\x25\x6c\x06\xd4\x59\x8f\x3c\xe6\x25\xc8\xe3\xb1\x80\x55\xad\xa5\x81\x6d\x5d\x1d\x5f\x66\x95\x7d\x06\x86\xa0\x20\x55\xd0\xc6\x94\xc5\x8f\xaa\x2e\x8c\x0b\xec\xc6\x2e\x39\x31\x41\xb3\xfb\xaa\x2a\xfa\x55\x02\x2c\x4b\x03\x7e\x62\x8e\xe2\xed\xbf\x81\x47\x31\xa5\xba\x2f\x25\x6d\x5f\x4b\x24\xaa\xf4\x5c\x2a\xc1\x23\xa2\xb5\xf3\xd2\x52\xa7\xfd\xee\x45\x36\x2f\x84\xb2\xcb\xea\xa4\x0a\x3f\xcb\xc2\x38\x6a\xb1\x34\x77\x0f\xd5\x87\x9c\xf0\x30\x34\x13\xc1\xd5\xfd\xaa\x06\x58\xf2\x8c\x15\x3c\xa6\x2e\x28\x6c\xbb\x45\xee\x09\x0e\x32\x1f\x5b\x4f\xa1\xed\x92\x83\xcf\x42\xd9\x6d\xc8\x70\x95\x17\x30\xaf\x48\x2c\x85\xf3\x9c\xb0\x04\xab\xac\x9b\x32\xdf\x1f\xe4\x76\x72\x4e\xae\xd0\x99\x6f\xe7\xed\x50\x3c\xb5\x70\x7a\x61\x44\x29\x74\x5e\xdd\xf9\xf6\x60\xe1\x3b\xc7\x4b\xd3\x9e\x13\x1d\x65\x69\x70\x59\x6c\xaa\xc2\x4c\xbf\x4f\x33\xdc\x56\x1a\x79\x38\x16\xf0\xdc\x56\xf5\x90\x19\xf2\x84\x47\x58\xfe\x42\xf8\xaa\x73\x18\x5a\xb0\x70\x11\x3c\x31\x04\x6d\xe1\xb6\x5f\x56\xf7\x5f\x9f\xb7\x9b\xe7\x6d\x38\x43\x6a\x25\x62\xdb\x7c\xef\x30\xd8\x40\x84\xc3\x34\x49\xb0\xdd\x75\x90\xbf\x9e\xa0\xa9\x8a\x37\x30\xab\x7d\x55\xde\x98\x7e\x80\xc7\x5b\x9f\xca\x80\xcc\x3a\x73\xfc\x99\x5e\x0a\x95\x8e\xf0\x09\xae\xae\xb6\xbd\x7d\x0c\xa1\x0e\x67\x91\x4b\x4e\x8a\x4a\xa2\xc7\x91\x92\x0d\x4c\xec\x1c\xe7\xb7\x99\xd1\x58\x6b\xaf\x30\x57\x83\x34\xef\x37\xfd\x85\xb3\x2c\x43\xa0\xad\x23\xbc\x8f\x13\x81\x99\x13\x9c\xe0\x3c\xd2\x98\x58\x39\x55\xff\x59\xbd\x2f\x8c\x61\x12\xcb\xd6\x2d\x34\xed\xf6\xa5\xae\x7e\x6e\x6b\x59\x5a\xe7\xfb\xb6\x39\x1c\xdb\xf7\x09\x70\x56\x70\x11\x29\x0c\x77\x1a\x69\x61\x7e\x88\x24\x08\x3a\xf8\x56\xe6\xba\xaa\xcb\xbb\xbc\x78\xed\x0f\x25\x94\x05\x9d\xeb\x35\xb4\x1e\x59\x16\x0e\x32\xc2\x49\xa8\x12\xe0\xbe\x18\x0c\xa0\xc2\x80\x2c\x8b\xc6\xae\x3f\x81\x8e\xf3\x0c\xf9\x9f\xf3\x44\x9b\x0b\x69\xa4\xee\xed\x52\x76\xc8\x97\x9b\xc6\xd2\x5c\x18\x8e\x44\x5a\x75\x7a\x7f\x3e\x82\xce\x65\xb1\x3e\xe5\x85\xf9\xc4\x74\xab\xff\xa0\xe2\xbe\x47\x71\xf1\xf4\xfb\xe3\xf6\xe1\x7e\x77\xf1\x6d\x3b\x69\x45\x73\x29\x00\x6b\x1a\x8e\x68\xd7\x6d\x55\x21\xd7\xe4\x2a\x8a\xb0\xe7\xde\xbd\xa6\xdd\xff\x75\xa9\xe4\x47\x25\xf8\xe9\x8f\x52\xb1\x8a\x5c\x1a\xd7\x83\xe8\x02\x03\x78\x7d\x7a\x47\x5f\xbe\xe7\x85\x25\x27\x2c\x87\x5c\x49\xc0\xd8\x02\xa7\x93\x85\x1a\x4a\x0d\x8f\xb2\x9b\x17\xae\xa8\xf9\x80\x71\x7d\x7e\x1e\x41\xcd\xe2\xc8\xc9\xdd\x50\x0a\x2c\xed\xf9\x5a\x4e\x4d\x68\xbc\xf1\xce\x6e\x9e\x32\x1a\x7b\xf4\x5e\x58\xff\x83\x62\xbf\x1f\xac\x13\xa0\xa6\xef\xe5\xfd\x1d\x8d\x2e\xc1\x75\xca\xd2\x11\x7e\xd1\x69\xb2\x99\xb3\xe2\xeb\x72\x34\x83\x12\x93\x38\x47\x4f\x26\x90\xa3\x5c\xb5\xba\x8f\xbe\xb9\xe6\xd6\xfb\x3f\x77\x0b\x32\xba\xa4\x21\x6e\x7c\x52\x86\xe6\x5a\x6b\x41\xfa\x9a\xe7\xeb\xb9\x36\xc8\x62\x5b\x83\x6b\xeb\xec\x36\xd1\x6a\x7e\x5b\xf5\x92\xf2\x7f\xd5\xa3\x99\xbc\xd9\x86\x24\xd2\xc1\xd8\x9c\x1e\xe5\xc4\x6c\x16\x19\x78\x89\x19\xa4\xe5\x10\x3f\x77\x3d\xef\xb0\x71\x88\x34\xe2\x46\xeb\x53\xf9\x58\x9c\xf6\xf9\x34\x39\x4e\xa3\xd9\x8d\x03\x42\xb0\x06\xd4\xe6\x50\xd3\xf1\xb7\x59\x16\x73\x11\x36\xa9\x5c\x9f\xfd\xa2\x85\xb0\x94\x5b\xab\x33\x3f\x7b\xbb\x19\xfe\x28\xdf\xd7\xef\xf7\xa7\xc3\xe4\x33\xe1\x96\x89\x88\xa9\x64\xdc\xd3\xfe\xa3\x2a\x3f\xe8\x49\x8a\x48\x3a\xfa\xd0\x40\x48\x77\xb3\xe7\xbe\x2a\x37\xed\x0b\xd2\x7f\xb7\xd5\x9d\x2c\xdf\x3f\xd4\x96\x45\x3c\x8e\x93\xc7\xad\x0e\x47\x28\x1b\x9c\x2f\x57\x32\x2f\x3e\xc1\x0a\x0b\x92\xb8\x78\xe7\xed\x78\x1c\x6f\x7e\x82\xa4\x0a\x63\x9b\xc7\xaa\xfc\x33\xef\xd1\x83\xfd\x51\xae\x63\x0f\x11\x42\xad\xb6\xc9\x9b\x22\x88\x71\xc2\x2a\x07\xf9\xeb\xe2\x45\x76\xd9\xcf\x50\xe7\x12\x49\xca\x85\xc7\x38\xe4\xba\x42\x15\x40\x94\x8b\x1a\x06\x68\x4a\xe4\xb4\x7d\x86\x90\xe3\xc7\xc1\xbf\x41\x88\xd4\xab\xb5\x77\x6b\xf8\x40\xa7\xc7\xd6\x42\x80\x3c\x5e\xca\x56\xee\xc4\x64\x61\x15\x69\x06\xf8\xb1\xb5\x6c\x5e\x7d\x05\x66\xe9\x7e\xce\xee\x51\xaa\x44\xc4\x07\x9f\x9c\x8f\xaa\xc9\x22\xd5\x06\xab\x9a\x3a\x50\xb6\xd1\xe1\x67\x00\xad\x89\xd4\x2a\x27\xf7\xf2\x02\xfa\x15\x4b\x0e\xcd\xaa\x34\x77\x18\xec\x2e\xc2\x2b\x46\x9f\xa5\x96\x04\x12\xeb\x9f\xeb\xaa\x2a\xc6\xe7\x65\x34\xc1\x20\x63\x5f\xcb\x23\xe0\x92\x9b\x17\xc6\x2d\x9c\xbf\xf5\x43\x00\x25\xa1\x74\x01\xb2\x3c\x1d\x47\x95\x49\xc1\x24\x63\x63\x80\xf7\xbd\x3c\xc0\xbf\x6e\x2e\xbb\x0d\xf6\x52\x1e\x8f\xbf\xcd\x96\x83\xf1\x45\x31\x2d\x13\x8f\x86\xfa\x02\x75\xb5\x7e\x9c\x6e\xde\x82\x27\x4e\xa5\x1b\xfb\xfd\xed\x49\xc1\x45\x91\x1f\x3f\x32\xf1\x9c\x4e\x08\xce\x52\x24\xf4\x48\x63\xd6\xd5\xa9\xd4\xf3\x7d\x54\x88\xc8\xd9\x68\xae\xf3\xb6\x85\xe2\x14\x8a\x13\x42\x08\xcb\xe2\x31\x3f\x62\xb1\x9a\x28\xb2\x88\x60\x75\x23\x2f\xbb\x48\xb1\x01\x5f\xb2\xed\xd6\x07\xdc\xae\x7a\x73\x7c\x21\x32\x26\xb1\xc4\x6f\xa0\xc8\xdf\xa0\xc6\x8a\xf5\xf4\xae\x84\x81\x5c\x7b\xa8\x3c\x46\x84\x3b\xb4\x3f\x08\x67\x91\x89\x45\x9d\xa2\x5d\x80\xaf\x5f\x55\xf5\x72\x5c\x2a\xa4\x54\xc4\xcb\xa3\x8d\xe8\x59\x7f\xab\x47\x23\xa4\x01\x94\xe3\x39\xf6\x76\x41\xd3\xdb\xa6\x98\xd3\x7e\x3e\xe4\x65\x97\xed\xe6\xe5\xfe\xba\x92\xc5\x50\x4a\x13\x86\x66\x58\x38\xc4\x29\x7f\x29\x5b\x57\x86\xf8\x21\xdf\x20\x84\x8b\x02\x64\x4c\x42\xc9\xb8\xef\x98\xf9\x63\x96\x28\x84\xdd\x22\xb6\xf7\xa9\xf7\xa4\x10\x59\x24\x1c\x7b\xd5\xc7\x3d\xd0\xbe\xec\xde\x46\x10\xa1\x2c\x12\xae\x54\x7f\x80\x62\x90\x33\x9f\x2d\x71\x59\x04\x6e\x83\xc8\x9b\x55\x0d\xa5\x9c\x8a\x75\x8a\x8c\x10\x70\xaa\x87\x32\x6f\x60\x75\x3c\x42\x20\x4c\x89\x8c\x24\x31\x32\x7b\x8e\x75\x75\xa8\x46\xd2\x98\x22\x23\x54\xe0\x4b\xda\x78\x4a\x10\x76\x80\xe2\xfe\x68\xe6\xdc\xb4\xbf\x95\xdd\x3b\xdc\xdd\x8f\x0d\x46\xab\x73\x78\x73\x46\x94\x42\x43\x42\x5f\xf7\x79\xc9\x0b\xd3\x5b\xb7\x2f\x24\xc5\xfd\x24\xca\x88\xa1\xb8\x28\x05\x4f\xc9\xdd\x2d\xe4\xb3\x3e\x46\x96\x10\x87\xdf\x47\x11\x8c\xaa\x5c\xee\xd7\x66\x49\x02\x61\xa1\x7a\xbe\x7b\x9c\xb0\x78\x86\xae\x40\x96\x80\x7b\x42\x5e\x27\xf6\x4d\x0e\x0b\x7b\x96\xd2\x58\xf0\x3e\xac\xf1\xd1\x7f\x5e\xee\x1d\xe9\x60\x71\x0b\xc9\x52\x63\x48\xf0\x56\x1e\x45\x23\x19\x8d\x13\x04\x3c\x0f\x55\xb5\x39\x6c\x36\x0c\x64\x59\x60\xc4\x7d\xad\xf2\x57\x98\x3f\x55\xe6\x7d\xf8\xeb\x1e\x1b\x3f\xbd\x00\x26\x94\x0e\x6b\x5b\x7d\x6e\x50\x2c\x32\xae\x62\xc4\x96\x3d\x3e\x6d\xf0\xb5\xfc\xb2\x7a\xba\x1c\xb0\x2d\x19\xd7\xb1\x75\xe7\x2f\x4d\x75\x18\xf9\xf0\xfd\x1d\xf6\xc1\x64\x55\xc9\xb8\xb1\x59\xe8\x06\x1e\xf3\xa6\x32\xfd\xeb\x9d\x51\x26\x06\xa9\xaf\x4b\xb0\xf2\x54\xb4\x7f\x54\x26\x97\x67\x26\x58\x67\x81\xd8\xe2\x4c\xcf\x32\xeb\x96\xa5\xaa\xfc\x36\x51\xd1\xfc\xc7\x6c\x94\xc5\xd2\xde\xe1\xdd\xc1\xa3\xc7\xb0\xbc\x4c\xd1\xcc\x78\x75\x86\x4b\x87\x4c\x6c\xee\xa7\x9b\x79\xa6\xe3\xc8\xf8\x44\xf7\x12\x0a\xd8\x2f\xa9\x7d\x7e\x50\xcf\x0b\x67\x30\x0e\x6f\x76\x3a\x36\x50\xb7\x0f\xe5\x02\x17\x2e\x08\x5a\xcd\x3e\x69\x08\xc1\xaa\x45\x09\x3f\x7d\xcd\x6c\x1e\x2a\x3b\x9a\x68\x18\x9e\xd1\x20\xd2\xee\xb8\x0b\x17\x1e\xb7\x38\xa7\x04\xfa\xf1\x10\x73\x84\x42\xef\x76\x4d\x21\x9b\x97\xdd\x6e\x36\x9d\x80\x46\x3c\xe9\x03\xe5\xf6\x1c\xdf\x17\xc6\x49\xf7\x20\x4a\xf8\xd5\x9e\xd7\x06\x33\x1b\x69\x94\x28\x09\xf3\xfb\xaa\xaa\xe7\xdf\x64\x65\x6c\x7c\x9d\xe7\x2a\xdf\xbf\xb4\x67\xaf\xb8\x55\x14\x83\x6f\xdc\xad\xd0\x85\xb5\xca\xcf\x0d\xf9\x86\x45\x45\x46\xe0\x78\x11\xeb\x3a\x37\x7b\xd8\xbe\x80\xb3\xc4\xf1\x47\x63\xe2\xd4\x61\x77\x7b\x68\xbf\xe5\xa1\x3e\x92\x86\xa3\xd4\xc6\x71\xaf\x66\x74\x27\x7f\x4d\xd2\x61\x19\x73\xe5\x1a\xf8\xf3\x42\xa9\x8c\x41\xa0\xe8\x59\x97\x45\x93\x2b\xd4\x24\xf1\x47\x08\xa3\x88\xc7\x38\x95\x3f\x5f\xf2\x16\x10\xfe\xe0\x2e\x1e\xce\xd6\x03\x49\xb2\x0c\x73\xab\xbb\xf7\x65\x5f\xb4\x45\x92\xb7\xff\x6c\x9a\x05\x49\xd4\xc6\xa1\xdc\xbe\x95\x83\x5b\xea\xd4\x06\x4b\xc8\x14\x04\xd3\x63\x85\xba\x27\xf9\x33\x1c\xa3\x84\x62\x65\x2d\x3c\xb5\x8f\xe1\x9a\x92\x52\x2d\x54\x90\xf3\x6c\xda\xa7\x2e\xfa\x9b\x0d\x61\x9a\xa7\x59\x78\xc0\x75\xe3\xd8\x5c\xba\x32\x50\xdf\x8c\xe4\xd4\xba\x71\x1a\xed\x21\xba\xbd\x26\xd4\x5e\x3c\x40\x04\x55\xfc\x67\xa7\xe5\x29\x25\x14\x65\x28\x7d\x5f\xd8\xdf\xa1\xc9\x3f\x61\x6c\x16\x45\x5e\x37\xe0\x47\x78\x06\x1f\xe1\xfb\xc7\x6f\x12\xd7\x12\x6b\x90\x55\x19\x6e\x5f\xe8\xc0\x7d\x94\xb0\x8e\x63\x22\x29\x32\x67\x8a\x23\x8d\xd9\xb5\xd5\x4e\x9d\xde\x77\xce\x29\x34\xfc\x64\xa1\x92\xd4\xe3\xbe\xba\x55\xec\x66\x2e\xc2\xe3\x8a\x17\xd1\x4c\xf5\x4e\x48\xa1\x33\x3a\x44\xdb\x97\xf0\x36\x9d\x53\x52\x18\x86\x4a\xf9\x07\x59\x4a\xcf\x1f\xf1\x47\x32\x9a\xe2\x6b\x3a\x60\x19\xef\x06\xdb\xfd\xfe\x2d\x94\x71\x84\xec\x5d\x0c\xd6\xff\x59\xe5\x41\xd7\xed\x7f\xc6\x76\xe2\x61\xac\x50\x81\x41\xe9\x14\x5f\xbc\x22\xcf\x6c\x94\x24\x88\xc9\x71\xc0\x9f\xe6\xe6\xf2\xeb\x6c\x80\xd2\x29\x26\x70\x5d\x46\x83\x3e\x15\xc6\x77\x00\xc2\x95\x6b\xce\x10\x85\xa9\x3d\xe1\xf8\x2f\xe5\xbd\x84\x34\x94\xa0\x99\xc7\x65\x75\xfa\x7d\xe2\x7e\x22\xa4\x51\xd6\x49\x04\xb9\x8b\x78\xb0\x78\xf4\x5b\x03\x66\xd5\x38\xcc\x54\x18\x09\x0a\xa2\x68\xac\xd3\xd3\x25\x17\xeb\xd3\x19\x47\x2f\x0c\xd7\x10\xca\x50\xeb\xd3\xbb\x6b\xdc\x2c\xb7\xe5\x24\x18\x82\x1a\x29\xf9\xaf\x3c\x44\xf0\xd2\x26\xce\xfa\x68\x77\x90\xf9\x54\xf5\x41\x48\xdb\xe5\x3a\xff\xef\xff\xf7\xff\xbe\x3f\x5d\xed\x36\xd7\xd7\xbb\x8b\x87\xbe\xa2\x2a\xad\x10\x89\x0b\x44\x0e\xbb\xb6\x96\x8b\xd5\x89\xe9\x85\x5a\x01\x26\xed\xdf\x84\xa0\x37\x3d\xdd\x01\xa5\x35\x30\x88\x8c\x7b\x6d\xf5\x6b\xd9\x97\x11\xa4\x85\x94\x8c\xfc\xd9\x5d\x95\x76\x3d\x75\x8c\xc6\xef\x0d\x44\x56\x15\xc7\x80\x8e\x1b\x97\x7f\x54\x25\xe0\x4a\xfe\x97\xcf\x51\x11\x70\xbd\xbf\x2e\xe5\x2e\xaa\x76\x55\x1a\xe4\x27\xbb\x56\xf9\xbf\xff\xf3\xd9\xa2\xa8\x12\x42\x82\x67\x47\x9f\x6d\x4f\x1e\x83\x4a\x24\x4d\x1c\x9d\xaa\xfa\x5f\xd0\xed\x1d\xce\x99\x99\x6e\x9f\x50\x69\xaa\x11\xc5\x2f\x9b\x6e\x27\xdf\xfc\xf7\x83\x95\x39\x8c\xa6\x11\x06\xfc\x79\x89\xba\xb8\xe1\xaf\x4a\x30\x1f\x87\x1f\xab\x06\xe6\x5c\x67\x45\x63\xe9\xd5\x25\x6a\xd7\x3a\xf8\x5e\xb5\x0b\x85\xcf\x30\x9a\xb2\xd4\xa3\x03\x1d\x69\x58\x57\xcb\x51\xaa\xa2\x19\xc7\x17\xe7\x0d\x4a\x73\x9a\xb2\x76\x15\xa7\x69\x96\x0c\x9c\xd1\xd5\xc9\xe4\xee\xff\xcd\xb4\x6b\x84\xe2\x32\xc6\x14\xdf\x9e\x4a\x5c\x70\x51\x8e\x6e\xf2\xba\x28\xde\x2d\x79\x7e\x07\x8a\x7c\x1b\xa2\xff\x22\x60\x96\xf6\x2c\xcb\x1b\xec\x0c\xfd\x36\x12\x01\x16\x8a\x5b\x8a\xa2\xa9\x9e\x25\xd8\x4c\x3a\xdd\x4a\xe8\x14\xc3\xf3\x23\xb6\x98\x7a\xd8\x92\x3f\x9a\x45\x84\xb8\x69\x77\x90\x65\x9b\xeb\xef\x4e\xbb\xa0\x3f\x4c\x09\xb2\xf1\x1e\xeb\x5c\xe7\xe5\xde\xe9\x99\xce\x9e\x70\x26\x53\xb4\x69\xcb\xcb\xbc\xfd\x2e\x47\x58\x9c\x70\x1c\xe2\xc8\x11\x49\xf2\x3f\xe1\x13\x1b\x62\xa1\xa4\x26\xa8\x21\x76\x07\x26\xef\x66\xcc\xae\xdf\x7c\xe7\xd1\xed\xf2\xe7\x55\xa4\x31\xf8\x6a\x41\x1e\xa6\xab\x91\x52\xb1\xc0\x42\xed\x21\x2f\xdb\xcb\xe7\xf5\xc5\x54\xbd\x6a\x76\x1a\xe6\x48\x1e\xab\x57\xa8\x9b\x97\x0a\x5e\xc7\x2b\xa0\x52\x99\xc5\x9c\x13\x11\xd8\xdd\xe4\x7f\x9e\x17\x1b\x95\x66\x14\x92\xa1\x1d\x86\xfb\x7f\xbd\x7a\xdb\xcf\x7c\xc6\xa7\x1f\x02\x9d\x21\x3a\xc4\x69\x21\x39\xad\xfb\xd9\x9d\xb4\x2c\x52\xe3\xda\xa0\x07\x4e\xf5\x0e\x70\x42\x59\x1b\xc7\x1e\xc8\x78\x59\x57\xc7\xdf\x96\x7a\xbb\x6e\xa8\x8e\xa8\xc0\xf6\x33\x92\x26\x2c\x8c\x42\x94\xf9\x40\x25\xa4\x3f\xe7\x45\x20\x3f\x4d\x48\xdb\x3a\x52\x8e\x8b\x17\x66\x54\xe3\x38\xa8\x16\xea\x1a\x96\xc1\x2b\x3a\x26\x0a\x97\x33\x03\xb2\x7d\xc1\xb2\x9b\x0d\x38\x19\x1d\x67\x11\x22\xd4\xee\xf3\xbb\xa0\xe3\xf3\xd7\x8b\x9d\x26\x32\x52\xc1\xf3\x7a\x9d\xd7\x33\xe5\x33\xa1\x93\x88\xf8\xca\xad\x53\xfc\x7d\xb0\xb6\x81\xb9\x6b\xb4\xd0\x89\x92\xb8\x5e\x3d\xca\xba\x9b\x46\x45\xe0\x97\x87\x8b\x4b\xac\x0d\x36\xac\x88\xa5\x47\x80\xd4\xf4\x9b\x52\x96\x38\x5c\xd9\xa2\xb0\x8b\x23\xeb\x9f\xce\x50\xcb\x3a\x05\x21\xfc\x05\x3a\xc2\xdc\xae\x19\xd1\xf6\x35\xa5\x3a\xe5\x83\x5a\x4d\xfe\x27\x7c\x47\x03\xcc\x65\xdf\x7a\xa1\x59\xe4\xda\xa9\x3e\xad\xa9\xca\x7d\x3d\x17\x24\x3a\x7f\xd6\x8c\x11\x29\x47\x42\x33\xe7\xba\xbe\x42\x33\xa9\x9c\x2c\x90\x6b\x42\xde\xb4\xa1\xcd\xe2\x8f\xf3\x6e\xfe\xe0\x17\x57\x3f\xcd\xb3\x2c\xe0\x4e\xea\xba\x92\x65\xf3\xbe\xea\x87\x40\x92\x79\x6f\xd7\x11\x0b\x45\x8b\xd4\xa9\xf4\x2a\xd9\xea\x17\x07\xe8\x9f\x89\xbc\x4e\xaa\x20\x5a\x18\x89\x59\x92\x81\x60\xf2\xb8\x93\xe6\x90\x97\x3b\x5d\x05\x2d\x06\x3f\x32\x8b\xdd\xca\xd2\x40\x69\xb6\x95\x7f\x25\xbb\xb7\x74\xc2\xba\xfe\xe0\xa6\x64\xb1\x41\x56\x88\x37\xe8\xbf\xa8\xaa\xc2\x54\x3f\xcb\xbe\xf1\x18\x64\xd9\xc7\x9f\x70\x6b\x44\x98\xa8\xbe\xfc\x33\x9b\xcf\x3a\x93\xdc\xf8\x66\xd3\x63\xfe\x0b\x7c\xed\xaa\xb7\xc6\xfe\x77\x30\xf0\xfc\x4f\x18\xaf\x95\x43\xa8\xe7\x87\x3e\x21\xd1\x19\x28\x15\x2a\x21\xf0\x3e\xf1\x7c\xf4\x23\xa4\x8e\xb9\x59\xd0\xcc\xf8\xe1\x35\x33\x92\x89\x64\x86\x56\x24\x4e\x91\x48\x62\xf2\xb6\x8f\xfa\x7f\x3b\x8f\xf2\x75\xb7\x2e\x24\xa3\xcb\x47\xc0\xdb\xe4\x02\x3e\xb8\xa1\x4a\x8b\x34\xa8\x32\xf6\x1d\xb6\x47\xa9\x5f\xe5\x3c\x09\xd2\xca\xd8\xd8\xc9\xe9\x7e\xc3\x7b\x82\xed\xdc\xf0\xd3\x35\x15\xe0\x7b\xf1\x13\x69\x27\xa1\xb5\x88\x31\xdf\xf4\x25\x80\xcd\xaf\x23\xe8\x16\xdf\xd2\xde\xb2\xc0\x6d\xc1\xa2\xff\x80\xeb\x20\x94\x55\x8b\x92\x9b\xd3\x57\x5e\x4b\x92\xd1\x21\xea\xdd\x56\x7d\x9e\x85\xbf\xf9\x83\xfd\x4c\x6b\x4b\x10\x9a\xf2\xec\x43\xfc\xf1\x5a\xf1\x79\xa1\x46\x1b\x62\x70\xb6\xa3\x58\xea\xd3\xb7\xcb\xf0\xc3\x20\x89\x52\xe1\x01\x86\x3f\x01\x5e\x77\x3f\x11\xa1\x92\xf4\xc7\x41\x70\xc7\x11\x3f\xe4\xa5\xe3\x23\x3e\x55\xc5\x9c\x55\xeb\x07\x5b\xa2\x74\xe8\x19\xb7\xb2\x1e\xe9\xbb\x68\xcb\x98\xfb\x9e\xfc\xbf\xa7\xdc\x38\xfe\x65\xf7\x64\x7f\x04\x0f\x33\x61\xa2\xd4\x79\xe4\xb8\xd4\x6c\x27\x27\x41\xb7\x89\x04\xf1\xbb\x7e\x61\xbd\xbf\xc8\x79\xb5\xc6\x44\x2a\x25\x66\x8c\x70\xc6\xea\x62\xde\x67\x7a\x26\x8e\x29\xae\xa5\x8f\x55\xf9\x3e\x18\x21\x75\x7f\x77\x72\xa3\x3e\x58\xf2\x1e\x4f\xcb\x50\xb9\xd9\x77\xc6\x44\xa6\x3d\xea\xfa\x07\xe4\x7d\x6a\x1a\x8e\x0b\x07\x90\xb6\x80\x1a\xb0\xcf\x47\xe4\xf8\x4f\xcf\x41\x62\xeb\x00\x0b\x55\x51\xa0\x63\x79\x33\x1f\x60\x25\x7a\x37\x60\x49\xbd\x79\x71\xdb\xf9\x27\x4d\x35\x93\x52\x67\xd6\xd5\xc5\xdb\x75\xdb\x9d\x31\xe8\x4b\x96\xc6\xb3\x9e\x36\xce\xfa\xea\x73\x7d\x20\x43\x09\x38\x4f\xb2\xaa\x2a\x66\x55\x51\xc3\x22\x20\xbd\x2e\x32\xc2\x9f\x9c\x4a\xde\x50\x95\xf9\x74\xe2\x1a\x96\x51\x74\x35\xc2\x05\x7a\xde\xfb\x3c\xef\x2e\x1a\x4e\x12\xc4\x2d\x6c\x91\x94\xf6\x09\x30\x7f\xf6\x3d\x9c\xc5\xd6\xf1\x06\xca\xee\xe6\xe5\xfb\xc9\x0e\x63\xb8\x36\xb8\x7d\xc0\x2f\x97\xf7\x4f\x71\x36\x86\x43\x84\x11\x6f\x28\xc3\x5c\xbc\x84\x46\x85\x11\x9a\x63\x82\xff\x7c\x3a\x1c\x64\x3d\x35\x03\x42\xc4\x55\x18\x67\x24\x2a\x2e\xc2\x7f\x4f\xb2\x57\xc9\x9d\x4c\x1e\x93\x25\x5c\x0e\xb5\xfb\x91\xbb\x48\xcc\x86\xd4\x6a\xfa\xb3\x32\xae\x13\x1f\x3b\x60\x9b\xfa\x51\xee\xc1\x61\x72\xa7\x67\xb6\x3a\x1d\x70\x02\xbd\x8e\x5b\x17\x59\x4f\x1f\xb5\xcc\x94\x35\x83\xa8\xb2\xab\x42\x37\x0f\xe5\xb9\x43\x83\x30\x4a\xa4\x4a\x87\x99\xf6\xdf\x53\x5e\x83\xc1\x02\xbd\x0b\xe9\xfa\x69\xab\x80\xcb\xb1\xe3\xf5\xdf\xd8\x1f\x8d\x8e\x0c\x16\xaa\xb6\x4f\xa3\xb6\x6a\xb7\x6e\x23\xd3\xfd\xd0\xc5\xc9\x77\xf9\x39\x84\xa2\xbf\xd9\x36\x89\xb1\xdc\x70\xc8\xcb\xa0\x97\x37\x6e\x0a\x18\x0b\xc0\xbc\x86\x2e\x8a\xcc\x78\x25\x9c\xe5\x89\x04\x51\x2c\x51\xe5\x03\x1b\x69\x43\xb0\x35\x1a\xc0\x09\xbe\xc4\xae\xa3\xfa\x41\x03\xdf\x8f\x8d\xe3\x14\x31\x4b\x45\xb5\x0f\x3d\xb8\xcf\xcb\x03\x10\xb3\x18\x8b\xa8\x37\x2d\x1c\xc6\x7a\xfa\xfe\x30\x91\x36\x82\x21\x8a\x5b\xcb\xb6\xfd\x08\x55\x07\x44\xcb\x80\x45\xbd\x28\x4e\x90\xf6\xe7\xf0\x61\x4f\x2d\x4b\x73\x09\x45\x10\xd3\x17\x40\x2c\xc1\xc6\xbc\x7b\x71\xcc\xe4\x8b\x13\xed\xd4\x06\xa5\x31\xce\x6b\x1a\x4c\xf7\xce\x4c\xdf\x28\x48\xb4\x0d\x10\x75\xcf\xab\x18\xbf\x99\x90\x58\x0b\xff\x7f\xce\xde\xa4\xbb\x71\x1c\xdb\x1a\xfd\x2f\xdf\x28\x07\x35\x20\x48\xb0\xc1\x9b\xc9\xb2\x1c\x56\xa5\xbb\xcf\x52\x44\x56\xde\xbb\xee\xd2\x3a\x00\x0e\x64\x5e\x53\xa4\x92\xa4\xc2\xe1\xfc\xf5\x6f\xf1\x00\x60\x27\x29\x22\xdf\x1b\x54\x39\x52\x04\x3b\x10\xcd\x69\xf6\xd9\x7b\xb8\x81\x73\x3f\x68\x09\xb5\x23\x6a\xd6\xd3\x3c\x35\x14\xbc\xda\x2d\xdf\x3a\x5b\xba\xdc\x5b\x5d\x77\x3c\x4b\x84\x21\x17\x01\xfa\xca\xcc\xd2\x54\x4b\x2c\x8a\x29\x10\x0b\xb9\x4c\xac\x70\x89\x0f\x27\xbd\x54\xed\xf2\x34\xf3\x35\x31\x8e\x33\x02\xb5\xb7\x1f\x79\x67\xe4\x74\x3e\xd0\x86\xb4\xd1\x5d\x38\xfa\x6c\xa9\x72\xe7\x25\x61\xea\x68\x82\xbf\x57\xef\x38\x4f\x5f\xfb\x46\xa9\x16\x16\x88\x32\x23\xf7\x9c\xf4\x51\x22\x38\xd8\x7a\xe8\xa7\xa7\x11\xe6\x19\xd3\x24\x36\xae\xb0\xe6\xe6\xf4\x39\x09\x8f\x63\xc6\x2c\x53\x13\xc5\x02\x8f\xd3\x2a\x1f\xcc\x62\x46\x8b\x76\x2f\xeb\xbc\xd0\xfa\x42\x20\x75\x30\xcc\x30\x8b\x39\x09\x4f\x6c\x6e\x5f\x7f\x56\x07\x85\x19\x5a\x7c\xfb\xc6\x42\x67\xc6\x6e\x2e\x8a\x20\xa4\xa8\xf2\x13\x7e\xbc\x42\x8b\x9b\x39\xd7\x09\x8a\x98\xe9\x7e\x1b\x5d\x8e\x5c\x9d\x79\x3b\xcd\x29\x32\x6f\x6b\xa9\x96\x45\xae\xde\x9d\xfa\xe5\x78\x6b\x42\x61\x24\xd5\x1d\xbd\xe3\xa7\xc7\x24\x36\xbd\x96\xe7\xa8\x00\x1c\x81\x33\x29\x7a\x84\xd6\x19\x07\x0b\x42\x1a\x50\x5c\xd5\x9a\x25\xd6\x1f\x9d\x06\x04\x11\x32\xb4\x2a\x33\x44\x42\xf9\xba\x19\x7e\x37\x54\x8d\x7a\x80\xf2\x04\x85\x45\x4c\x4f\x26\x91\x4c\x6c\xbd\xf4\x43\xb5\x27\xcb\xf8\x21\x27\xdd\x85\xcb\x2b\x81\x4c\x81\x36\xe2\x5d\xde\xdc\x9f\x86\xa2\x7a\x94\x82\x73\xe9\xb3\x63\x3a\x9f\x6d\xbc\x93\x0f\x24\x8d\x48\xe3\x9e\x45\xea\x4a\x59\x12\xaa\xc4\x50\x90\x66\x89\xc6\xdf\x43\x65\x51\x66\x7a\x91\x6a\xaa\x69\xec\xdf\x5e\x29\x49\x7c\x10\xa0\xb5\x55\x80\xbd\xbc\xfa\xe8\x4c\x52\xb1\x53\x59\xb5\xaf\x94\xe4\xec\xdc\xa5\x0d\x9e\x73\x0f\xfb\xf6\x18\x52\xad\xf6\x1b\x34\x37\x48\xf9\xb3\xa6\xad\x4f\x83\xe2\x45\x86\xc8\x25\x19\x7b\xbb\x6e\x96\xeb\xb5\x21\x5d\xc4\xcb\x70\x06\x44\xe0\x64\x60\x51\x37\xdf\x58\xdd\x6f\x7f\x1d\x13\x0b\x23\x07\x68\xfc\x73\xa1\x7b\x7a\xd2\xd9\x72\x66\x94\xb0\x3c\x14\xce\x3d\x5c\x35\x0a\x8e\x78\xdf\x59\x2f\xfd\xc5\x50\x53\x22\x77\xb1\x7e\xbd\x7d\x7d\x7e\xd9\xec\x5e\x56\xaf\xeb\x67\x6f\x6f\x9b\x20\x0c\x48\x74\xb2\xb3\x23\x1c\x18\xfc\x34\x94\xf9\x1a\xd6\xd9\xf8\x7d\xc5\xc1\x08\x2e\x38\xcb\x4f\x99\x50\x32\x62\x53\xd9\x60\x7d\xc4\xb2\xbd\xef\xb5\x80\x33\x13\x71\xa9\x6c\x28\x84\x20\xca\x8b\x52\x4f\x58\x9d\x2e\xf6\xb6\x89\x23\xed\x8b\x14\x6f\xa1\x05\x8f\x27\x9e\x35\x42\xfb\x09\xc7\xa2\x45\x77\xd5\x88\x7d\xce\x24\xda\x0a\x9e\x2a\xff\xb5\x3a\x1f\x40\x42\x83\xdb\x1f\x97\x3f\xb3\x49\x5d\xd5\x14\xc9\x56\xd8\xcb\xba\x44\xe7\x2c\xd9\x62\x84\x31\xb4\x11\xef\x6c\x8e\x3c\x8c\x13\x7f\x57\x90\x32\xb2\xeb\x4e\xfb\x88\x4d\xd3\x99\x6e\xe3\x61\x6f\x40\x73\x72\xc6\x3c\x47\xea\x6b\xde\xf4\x0b\x93\x91\x1c\xc8\x5a\xd8\xbc\x55\x55\xfb\x5a\xc9\xbc\xbc\xaf\x46\xc2\xd9\x93\x0b\xa9\x20\xa3\x5c\xd7\x80\x77\x7e\x3a\x23\xb0\x30\x8a\x59\x52\xe8\xdb\x93\xfa\x87\xb1\x26\xa3\x92\x98\x46\xe0\x40\x1a\x44\x61\x8c\x8b\xeb\x80\x51\x12\x28\xae\x63\x2c\x74\xa6\x07\xbf\x4c\x36\x17\xa3\x03\x99\xe0\x58\xe7\xb2\x21\xaa\x28\xef\x4c\xfb\x01\xa7\xa3\x18\xfb\x2a\x60\x2b\x40\x7f\xd9\x70\x9f\x3c\x82\x36\x91\xe6\x63\xe1\x46\xc2\x23\x35\x93\x28\x9e\x41\xad\x49\xf0\x98\x68\x7c\x5f\x88\x89\xc4\xf7\xb9\x09\xb5\x1a\x80\x08\x2f\x36\xe0\x3f\x2f\xcf\x9a\x4c\x3d\x63\x04\x67\xc9\x24\x5c\xf5\x2b\x58\xf0\x2f\xff\x5e\x99\x11\x73\x7b\xd2\x18\x15\x59\x81\xc6\xa2\xb5\xe5\x5d\x0b\xa5\xfa\x37\xc1\x2c\xb1\xd1\x70\x62\xbe\xa4\x5f\x45\x10\x08\xa0\xa0\x9e\xc7\x7f\x2d\xce\x09\xd6\xcf\xf7\x4f\x11\x30\x29\x88\x07\xd0\x3b\x1a\x6e\x19\xba\xab\xab\x03\x29\xc3\x4c\x06\x9a\x08\xc2\xc0\x50\x58\xf8\x05\x54\x6e\xf2\xa6\xbd\x83\xba\x8f\xe3\x88\x20\x14\x3a\x73\x06\xfa\x0e\x8a\xcb\xab\xb2\x08\x22\x1e\x10\x10\x37\x6f\x9a\x13\x4e\x82\xd8\xae\x41\x6c\x34\xed\xa3\xb5\x55\x55\xb1\x65\xb9\xd3\x26\x09\x37\x24\x44\xe8\x0c\x5a\xbb\xae\x4f\x2c\xea\x4b\x03\x59\x04\x49\x8c\xc2\x05\x07\xad\x89\xb2\x39\x82\xc2\x6e\x9c\x52\xde\xea\xe6\x73\xad\x67\x6f\x9c\xa6\x40\x77\xda\xbc\x81\x45\x00\xf7\x06\x86\x08\x52\x4c\xb3\xd4\x5b\x53\xdd\x5e\xdd\xc7\x9a\x66\xdc\x5b\x22\xc8\x02\x46\x5e\x9b\x15\x46\xbb\xdd\xf4\x7a\xbb\xd9\x58\xf7\x7a\x68\x4c\x89\xc4\xc1\x50\x7c\xab\xb0\xcc\x7f\xbc\x74\xfe\xf0\xcc\x60\x14\x41\xc6\x38\x05\x33\xad\xb5\x60\x81\x2e\x97\x7b\xbe\xb3\xec\x5c\xb4\xcb\x02\x44\x4e\xf5\x99\x50\x81\x08\x20\x60\x54\x91\xd5\xbb\xa6\x50\xb8\x79\x96\xf9\xb2\x26\x0a\xec\xfd\x04\x41\xea\xc6\xb1\x08\x20\x75\x9e\xbc\x8d\x21\x38\x86\xf7\xc9\x08\x04\x61\x81\x77\xc7\x41\xc7\xf8\x31\xb7\xd8\x95\xb1\x85\x29\x02\x50\x11\xd1\x9b\x1c\xf2\xb2\x75\x1e\xa5\x3f\x24\x43\x20\x20\x09\xd5\xbb\x5d\xab\xc9\x72\x6d\x55\x92\x51\x58\xe8\x0f\x28\x46\x74\xc0\x22\xd0\x89\xb0\xe4\x04\x55\x31\x5c\x18\x43\x48\x9c\xb7\xe0\xd3\xa4\x8e\x36\xc6\xd3\xb8\x9c\xd9\xae\x22\xc0\x2c\xa2\x6a\xd0\xbc\x79\x2e\x07\x1a\x69\x11\xa0\xd0\xa1\x63\xc8\xe9\x85\x9a\x36\x47\x1a\xb6\x23\x78\x92\x08\x10\x04\xe5\x3c\x95\xe5\x21\x1f\xea\x47\xfe\x35\xfd\x50\x28\x81\x92\x3c\xa6\x80\x7d\x7f\xae\x66\xa4\x15\xa6\x11\x8a\x7b\x22\x33\x1f\x08\xaf\xbb\xa3\xc8\x7b\x7d\x16\x2a\xb9\xf7\x47\x4c\xc8\xac\x16\x7a\x5d\x7d\xe8\x1d\x96\x7a\xa7\xfb\xc0\xbd\x60\x81\x0c\xd2\x6e\x71\x79\xfa\xba\xec\x7f\x52\xda\x4a\x48\x9d\x64\x43\x56\xf0\x43\xa5\xde\xe7\xe4\xc4\xae\x2d\x8b\x32\x6a\xbb\xbe\x5f\xfe\x8a\xd9\x40\x30\xa6\xb4\xb0\xfc\x1e\xc5\xf7\xbe\xc4\xad\x0f\x8d\x74\xc7\xad\x8e\xc1\xa9\x6c\xc0\xe0\x2b\x36\xf9\xbe\x9c\x51\xec\x0a\xc6\xd0\xd2\xe4\xe4\xcd\xd7\xb2\xc6\xee\xfa\x83\x15\x27\x58\x98\xc9\xd4\x05\x31\x76\x54\xcc\x47\x81\xf6\xdd\x5f\x27\x3c\xe1\xae\x73\xf2\x3c\x17\x8e\x60\x21\x48\x32\x97\x75\x5d\x1d\x3b\x9b\x66\x0e\xdb\x11\x2c\x8a\x7b\x8e\xfe\xa9\x96\xd6\x19\x70\x58\xb0\x28\xb1\x75\x00\x05\x34\xed\xf2\x8f\xe5\x6a\x7b\xef\xef\x13\xc9\x2c\xf0\x19\x48\xef\x3c\x4d\x22\xe9\xae\x1d\x0f\x52\x35\x5e\xe6\xb7\x97\x13\xbf\x82\x71\xc3\xd0\x5b\x57\xce\x2a\xf3\x5c\x2d\xd3\xf9\xce\xe2\x6e\xa7\xeb\xf9\xab\x6e\xf3\xe6\x78\x6a\xf1\xe7\x85\xcb\xee\xcc\x24\xd6\x4a\xf6\x58\x14\x32\x75\x6e\xb1\x68\xe1\x92\xb4\x89\x60\x89\xb2\xa1\x5a\x8a\xea\x6a\xc4\xc3\x4f\x63\x32\x82\x65\xdc\x56\xe4\xd9\xfa\xd3\xc2\xce\x96\xaa\x6c\xaa\xcb\xb5\xce\x82\x65\x20\x99\xb4\x91\xb1\x61\xe8\x8a\xce\x2a\x20\xd3\xa5\x30\xf9\x10\x34\x1f\x60\x7b\xbe\x1d\x46\x44\xff\xf9\x2d\x2f\xff\xfe\x47\xd8\x04\xc1\x20\xb4\x5a\x0e\x9e\xa3\xe7\x42\xc0\x4c\x30\x88\x30\x74\x89\x54\x5f\xca\xef\x1f\x0d\x32\x49\x79\x3a\x6c\xdf\xc8\x4a\x5a\x97\xbd\x12\xa7\x60\x00\x96\x32\x01\xb4\xde\xb4\x60\xcc\x59\x1a\xa3\x1f\x80\xa0\x8c\x49\xe7\x21\x93\xc9\x83\xaa\x34\xa2\x92\x3e\x67\xeb\x11\xa5\x51\x3f\x19\x34\x37\xe8\x28\x65\x4b\xca\x98\xf5\x90\x21\xc1\x34\xda\xba\x02\x53\x57\x87\xed\xc3\x62\x7a\x55\x6d\x6c\x31\x82\xb7\x4b\x51\x2f\xe6\x13\x1f\x13\x63\x95\x04\xdf\xf2\x66\xea\x2d\x0b\x86\x69\x2c\xcd\x40\xbe\xef\x10\x26\x3f\xf5\x19\x04\x33\xb1\x42\x9b\xf1\xa5\xf0\x85\x39\x15\x0e\xcd\xed\xaf\x6a\x20\xa1\x44\xd1\x4b\x63\xf9\xc5\x36\xf9\xfe\x4a\xc4\x44\x30\x83\x8c\xa0\x61\xed\xe7\x11\x6f\x4e\xc6\x9c\xad\x35\x61\x90\x70\xcb\xc2\xd4\xb9\x5b\x8b\xb6\x05\xf5\x46\x45\x19\x73\x84\xb6\x08\x03\xa9\x68\x12\x1d\x50\xe7\xe3\xfa\x4d\x11\xb2\x28\x14\x66\xd4\x4d\x37\x45\xb5\x9f\x74\x64\x18\x86\x09\x79\x19\x1b\x6c\x89\xfb\xf1\x82\x0c\x9f\x08\x43\x1e\x52\x08\xe5\x0d\x0a\x47\xca\x38\x92\xd0\x14\x61\x18\x07\x14\xf4\x54\xd5\xe1\x50\x95\x37\x27\xdd\x6d\x32\xa3\x88\x41\xd7\x42\x11\xf2\xdf\x9a\x09\x0e\xea\x32\x89\x2a\x88\x30\x62\x52\xa9\xc1\x25\x7b\xf2\x3a\xba\x22\x8c\x22\xe3\x53\x74\x76\x79\xfa\x72\xc2\xa6\x71\xe1\x5a\xdf\x88\x33\x0b\xba\xea\x79\x59\xba\x3d\xb3\x6c\xab\xfa\x73\x56\x03\x29\x42\xce\x91\xfc\x23\xcb\x0b\xeb\x07\x63\x18\xeb\x54\xca\x91\xaa\xf1\x4d\x0d\xfb\xfe\xf2\xb1\x11\xe8\xd0\x84\x7f\x54\x75\x83\x84\xb0\x5a\xeb\x89\x17\x22\xc2\x24\x31\x0a\x7a\xf5\xa2\x4d\x55\xe8\xe7\xd2\x56\x8b\x8f\x38\xe6\x45\x98\x98\x94\xe6\xe5\x97\x47\x8f\xa4\x70\x07\xd2\xc8\xb0\xd8\x4f\x3c\x1b\x94\x9f\x7c\xad\x8c\x89\xc4\x19\x51\x2e\xe8\xd4\xd8\xb4\xdc\x95\x7a\x36\x7f\x5a\x02\x52\xf7\xd2\xd9\xce\x5e\xf4\xae\xd7\x14\x5a\x20\xc2\x2c\x4b\x68\xf1\x7e\xa9\xb1\xf1\xc2\x14\x3d\xf7\xec\x2f\x7c\x0a\x77\x09\xc1\x24\x09\x50\x38\xc2\xe3\xb1\x16\xfc\x78\x74\xcd\xce\x82\x00\x79\x38\x56\x7c\x76\xa4\x49\xfe\xb0\x8e\xc5\xc0\x30\x47\x05\xa1\xbf\x42\x8c\xbb\x33\x55\x10\x92\x12\xa8\xaf\x6d\xf2\x8c\xe1\x45\x45\xbc\x35\xa3\x41\xa4\x74\x44\xdc\x2e\x56\x85\xe5\xfe\x53\xd7\xd3\xf9\xa4\x23\xe6\xdd\xc7\x55\xa9\x09\xd1\x34\xae\xb1\xf4\xad\x64\x10\x5b\xd3\x9c\x4e\xa6\xa8\xc9\xd8\xc1\xf5\xcd\x8c\x26\x1a\x39\x9f\xe5\xbe\xb5\x6a\x8c\xfd\x28\xc1\x20\xa1\xc7\x1e\xc0\xfc\xb7\xf9\xf7\x66\x76\x2f\x74\xd4\x97\xda\x09\x3d\x3f\xf5\x28\x39\x11\x62\x64\x23\x08\x33\x1d\x10\xcb\xe2\x32\xbb\x4c\xa6\x3d\x2a\xfd\x5b\x8e\x1f\xdd\x04\xf4\x4a\x0a\xb3\x86\xc8\x20\xec\xe1\x7b\x5f\x1b\x5b\x15\x7c\x53\x80\x7a\x1f\x6f\x10\xbe\xb5\x49\x52\x57\xf7\xb8\x58\x3e\xbc\x56\x05\x66\x22\x0d\xa3\x8c\x85\xa2\x33\xe3\x82\x80\x85\x51\xe0\x1f\xd7\x64\x4c\x9b\x89\xcb\xbb\xad\x11\x9a\x53\x3d\xeb\xdf\x28\x60\x60\xac\xc5\xbd\xef\x0d\x1e\x7f\xc8\x25\xa8\xec\xc8\x3b\x4f\xbf\x8f\xc7\x6d\xe6\xce\x61\xcc\x92\x77\xda\x62\x14\x55\xf9\x6b\x31\x25\x6c\x26\x64\x52\x5e\xeb\xa6\xc5\x65\x2f\x27\x0a\x83\x90\x74\x40\xfe\xb8\x7f\xf9\xad\xff\x29\xa5\xad\xea\xee\x76\x79\x29\xe2\x2d\xa2\xd0\x05\xa8\x5b\x6c\xda\x5d\x6d\x53\x01\xfd\xc9\x29\x10\xc4\xc1\x8f\x91\x5d\x43\xe1\x78\x07\x70\x91\x9e\x52\x78\xd2\xeb\x51\xa8\x21\x75\x11\x4a\xca\x78\x42\xb1\x23\xce\xf6\xdd\xa1\xea\xc9\xda\xbb\x56\x8a\xf2\xcf\xce\x3d\x9a\xe4\x2b\xa6\x0f\x18\xa5\x96\x88\xd4\x46\xe9\x1c\x53\xc9\x74\xe5\x8b\xa2\xd4\x52\x22\xdb\x10\x87\x83\xa9\xf5\xfe\x9a\x6b\xc4\x99\xa1\x20\xcd\x76\xb9\xd8\x78\xeb\x33\xe2\x22\xb4\xac\x49\x70\x20\xcc\x6a\xef\x15\x45\x5c\x33\x36\x08\x7a\x7f\xad\x8b\x8b\x4f\x17\xc7\xb6\x8e\xbc\x21\xd2\x61\xca\xba\xcd\x26\x49\x14\x67\x09\x99\xed\x3d\xd1\xf1\x1e\x67\x8a\x03\x22\x8a\x65\xc2\xa2\x61\xb2\x60\xd9\x36\x6e\x9f\x9a\x37\x54\x48\x9f\xe4\x83\x84\x2c\xae\x39\x48\x51\x22\x33\xcd\x27\x84\xf4\xaf\xc4\x78\x35\xa2\xd0\x15\x51\x0a\x01\xad\x27\xdd\x86\xd6\xca\xaa\x7a\xef\x0f\xe8\x88\xb2\x03\xcb\x37\x38\x1c\xfb\xd4\xad\x88\x52\x0c\x69\xe7\xe8\xd6\x84\xaa\xfe\x5c\x94\x7a\x83\xe5\xcc\xdf\x8f\xb2\x24\xf6\x3c\x9d\x5f\x2c\x19\x44\x55\x37\xeb\xde\x13\x8b\xb2\x2c\x90\x63\x25\x80\xcd\x1b\xd4\x78\xd9\xae\x8d\x84\xb1\x5c\x97\x35\xaa\xea\x3b\xd6\x4b\x98\x99\x59\x11\x60\x4a\x86\x0c\x25\x03\xd6\x96\x65\x9a\xfb\x3b\xc9\x94\x93\x21\xa9\x2a\xcb\x12\x85\x16\x55\x38\x2e\x8e\x16\x91\xcc\x64\xe0\x41\x53\x96\xcf\x3b\x57\x50\x3c\x42\xfd\x6e\x29\x38\x72\xf5\x3e\xff\xa0\x8a\x69\x6b\xfd\x92\x3d\xe1\x1c\x72\x3b\xe8\x7a\xe5\xcf\x7e\x21\x8d\x14\x4a\x39\xa4\x9a\x29\xa4\x40\xa4\x1e\xd7\x49\x71\x7a\xd3\x27\x52\x86\xa7\x4e\x76\xb5\xde\xa3\x4d\xfd\xd9\x94\xc3\xdd\x15\xd6\x07\x11\xe9\xd0\x7e\xd5\x3d\xb6\x23\xa5\x4d\x11\x69\x2e\xc8\xfb\xff\xf7\x76\x35\xde\x55\x22\x23\x99\xc7\xff\x55\xa7\x11\x15\xdb\x35\xf0\xa1\xe0\x41\x60\xc8\x56\xda\xbc\xe7\x93\x40\x02\x0f\x42\xa0\x05\x77\xb7\xd3\xb6\xdc\x69\xb7\xeb\x0f\x01\x12\x9b\xe9\x50\xa5\x38\xbb\x26\x18\xf4\xcb\xd0\x1d\xe4\xc5\xcd\xa9\x2e\xbf\x9c\x3e\x9f\xaa\xc5\xa9\x77\x1b\x38\xd3\x32\x71\x06\xca\x50\xd6\x2d\x78\x14\x24\x34\x27\x96\x50\xda\x84\xb8\x3f\xc0\x23\x20\x04\x83\x6c\xdb\x66\x82\x8d\x15\x3c\x0e\x39\xc5\x75\x9f\x56\x37\xcb\x9f\x39\xe5\x3c\x86\x8c\x30\x2c\x56\xc0\xe4\x75\xb5\x59\xbd\x7e\x5b\xb1\x81\x29\x59\xf0\x58\x32\xda\x10\x5a\x78\xc7\xc1\x1d\x9f\x5e\x44\x27\x96\xdb\xc3\x6b\xd1\xf5\xe7\x62\x10\xe8\x41\x5a\x8f\xc4\x6b\xfc\xc8\xe1\x49\xa8\xa2\xf1\x0e\x0a\xaa\x0d\xa7\x13\x84\x27\xb1\xa6\xcc\x84\x86\x16\xee\xaa\xfa\x22\x1f\xb7\xe0\x89\x8e\x48\xb0\x63\x73\x2c\x28\xb3\xba\x6a\xdf\xb6\xd5\xaa\x55\xfe\x46\x69\x04\x94\xd7\x7e\x79\x5d\x6e\x59\x10\xec\x6e\x47\x84\xb3\x82\xa7\x49\x90\x88\x79\x61\xcc\xec\x0e\x69\x92\x68\xed\xe3\x6b\x4e\x6d\x6a\x12\xa1\x16\x3c\x8b\x84\x15\x8b\x7f\x43\xf5\xfe\x05\xf2\xb2\xd9\x56\x0e\xbd\xe3\xef\x94\xa5\x31\x71\xc1\xec\x34\xaa\xfc\x00\x45\xc3\xb2\xfe\x90\x41\x0a\xfd\x7e\x14\xbd\x4a\x9a\x3b\x22\x62\x96\xda\x1a\x8a\xf2\x7b\xae\xda\xbb\x7c\x5e\x4b\x32\x0c\x32\x81\xcc\xaa\x0f\x9f\xea\x31\xc0\x58\x70\x48\x42\xe9\x4a\x65\xc6\xb6\x0a\x69\x94\xd0\x34\x65\xc1\x74\x54\x80\x88\x08\x01\xdb\xee\x71\x83\x6d\x9b\x97\xfb\xe6\xa5\xdb\xbf\x5d\xa4\x6c\xed\x6a\x8c\x5f\xb0\x1e\xd1\x8b\x0a\x2e\x33\xfb\xb9\xba\x07\xad\xea\x1c\x4f\x24\xee\x94\x2b\x36\x9e\x91\x5c\x42\x16\x45\x83\x40\xf6\xcc\x7d\xe4\x0a\x18\x21\x2a\x96\x50\x4e\x4e\x53\x5a\xd8\x85\xb5\x00\x45\xb5\x1a\x3f\x35\x93\xb9\xd2\x8a\xea\x63\x17\xb7\xff\xf9\xa9\x1a\xf0\x2f\x8b\x14\x7f\xf1\xdf\xee\x76\x3a\x88\x89\xf0\x4e\x9e\x3e\x77\xba\x1e\xc9\xf2\xcc\xdb\x25\x48\xee\xe4\xb6\xce\x8f\xdd\x28\xda\x22\x1c\xa6\xbe\x1a\xd7\xa9\xb4\x62\xd4\x05\xe4\x07\x47\x6a\x3b\x97\xdf\x11\x1c\x83\x28\x71\x98\x83\x62\x51\x3a\x4e\xe0\x5d\x78\x59\x31\xd4\x9f\x13\x23\xeb\x06\xe0\x97\xd5\xea\xb7\xfe\x27\x13\xda\x02\xe4\xce\xdc\x5c\xf4\xa5\x65\xf3\xbb\xa1\x65\x67\xdf\x75\xfe\x5b\x7e\x70\x62\x08\x17\x57\x68\x6e\x92\x98\xf6\x0f\x0b\x6e\xa0\x17\xa0\x10\xe2\x6c\xaf\xe7\x06\x2d\x60\x83\x5a\xdc\x63\xe1\x87\x6b\x1c\x24\x40\xc1\xcc\xc7\xc5\x7f\x76\xdb\xd7\xc5\xd3\xf2\x7e\xb5\xf1\xc7\x18\xb7\x56\x4e\xe7\xa4\x39\x9c\xd4\x78\xe4\xc6\x4c\xa8\x38\xe8\xab\xb2\x67\x88\xfe\x8b\x9f\x2e\x0e\x43\xae\xbd\x6c\xbd\x03\x16\xdf\x14\x95\xec\x7c\x44\x7c\xaa\xda\xd7\x3e\x0a\xe2\x9f\x21\x8c\x74\x9a\x0e\xfa\x8f\x8e\xdc\x6c\x6a\xb3\xc5\x61\xca\xbd\xc3\x3b\x4b\x48\x58\x5c\x0d\xa5\xb7\xcf\xd3\x12\x71\x98\xa5\x94\x16\xee\xe6\x19\x4e\xa8\xc8\x7c\x03\x23\x68\x97\x18\xf2\x7b\x4b\xcb\x46\x87\xf3\x4b\x71\x13\x4b\x5b\x88\x5d\x2e\xdf\xaa\x1e\x2a\x20\xe2\xb8\xfb\x48\xce\xd3\x22\x56\x24\xa8\xdb\x5c\xe5\x47\x28\xaf\x80\x6a\x2f\xcf\xb1\x38\x16\x31\xed\x4c\x26\xaf\x1b\x87\x38\x5f\x3e\x7b\x98\x54\x7f\x33\xb4\x4a\x5c\x34\x9c\x7d\x32\x7c\x16\xd6\x8d\x93\x34\x23\xcf\x07\x7f\x1c\xf3\x1a\x47\xc0\x21\x11\x27\x19\x90\xed\xb8\x25\xb6\x29\xd6\xff\x2c\x22\x10\x3e\xa0\x30\xc1\xe3\x88\x38\x31\x0a\x1d\x8a\x61\x51\x5c\x25\x83\x76\x8d\x53\xce\x68\xb4\x7d\xf9\xcf\x6a\xf3\x01\xc7\x63\x6f\x52\xc4\x69\xc6\x48\x75\x98\x96\xf4\xb5\xf9\x13\xa1\xbe\x87\xe6\x05\x9a\x21\xc8\x16\xa7\x3a\xa1\x24\x7b\x79\x3a\x3c\x9b\x07\xdc\x63\xa9\xa1\xee\x9f\x3d\x35\x99\x34\x43\x21\xce\x63\xf5\x1d\x07\x64\xb6\x7f\x00\x91\xf0\x40\x78\xf0\xff\xbe\xb6\x2a\x46\x7d\x9c\x33\x16\x69\x4c\xf8\xde\xfb\xe5\xc3\xaf\x83\xec\xb1\x50\xd2\x4a\xae\x9c\xca\x77\x6b\x88\x11\x31\xc3\x28\x5b\x11\x43\x66\x19\x3c\x6d\x39\xec\x1f\x88\xef\x8f\x90\x97\xeb\xe5\x33\x2d\x33\x5e\xb1\xbe\x6f\x2d\x5d\x9d\x37\x94\xdd\xf6\xed\x0a\xbd\xa7\x53\x39\x06\x09\xc4\x90\x52\x40\x69\xc3\x94\x4b\x28\x75\xdf\x0b\x92\x6b\x0a\x61\xbd\x9e\xc6\x59\x93\x58\x1a\x4b\x90\xdf\x5a\x5a\x46\x16\x1c\xeb\xd1\x18\x55\xcc\x46\x24\xf6\xe8\x10\xd2\xa8\x69\xeb\x1d\xb3\x8b\x77\xad\xa4\x96\xbd\x10\xcc\x85\x92\xe6\xb1\x33\x1a\x2b\xae\xc8\x81\x3c\x59\xee\x03\xfc\x3e\xb1\x95\x63\x95\x24\x09\x8c\x98\x2e\x0f\x87\xaa\x74\xe0\x5d\xdf\xc2\x44\xc4\x35\xf8\x1d\x8a\x5c\x8f\x25\xc1\x67\xab\x73\xac\x39\x32\xd9\x17\x74\x50\x66\x9d\x04\x26\xa7\x43\x0f\x33\x49\x0e\x87\xf5\x38\x2f\x60\x75\x45\x8c\x2a\xe6\x9e\x59\x1a\xd4\xfb\xfc\x28\x46\x64\x5f\x5d\x0b\x21\xb9\x66\x86\x27\x54\xd0\x7b\x80\xfa\x7d\x51\x14\xaf\x3d\xc0\x43\x24\x01\x47\x6d\xd7\x4b\xe7\xef\xee\x6c\x8d\xcf\x6f\xe7\xe6\x7a\xc2\x98\x26\x5f\xc2\xcd\x07\x2b\x8a\x77\xf3\x79\x39\xee\x9e\xb0\xd0\x08\x5f\x40\x30\x64\x00\xb7\x7d\xf0\x6e\xfa\x2a\x09\x8b\x18\xf9\xc1\x4f\xf8\xb1\x2a\xdb\x7a\x4a\xf3\x21\x12\xc6\x53\x1a\x2c\x35\xe5\xf8\xfd\x28\x49\x42\x40\xf0\x3c\x12\xcf\xcf\x0f\x3b\xd4\x79\xbb\x0b\x27\xca\x79\x22\x89\x58\x2a\x9d\xcb\x40\x41\xde\x81\x2a\x55\x24\x51\x6a\xc3\x57\x47\x1b\x79\x78\xc9\x1d\xcb\xc4\x40\xa8\x41\x6d\x24\xf7\x8a\x31\x7b\x8a\x6c\x5d\x0d\x8e\x4d\x6f\x9c\x69\x74\x6e\xef\xba\xc5\xc3\x53\xd5\xeb\xcf\x4e\xdf\x3d\x52\x56\x2d\xaf\xf5\x42\x2f\x93\xe2\x6c\xdf\x48\x83\x74\x3e\xef\x53\xa5\xd1\x87\x47\xc7\xf9\xe5\x24\xce\x98\x0f\x61\xbe\xc0\x50\x65\x34\x2d\x64\x9e\x9c\x91\x44\x21\x81\x12\x15\x94\x57\x19\xb0\x2e\x0c\x85\x24\x31\x0e\xb1\x79\xc8\xcb\x4d\x8f\xd8\x5e\x97\xdf\xf3\x73\x78\x90\x3f\x27\x4d\x06\xdc\x57\x7d\x78\xae\x41\x5d\xc1\xa5\x88\x24\xc9\x20\x72\x51\x96\xe7\x23\x96\xaf\x55\x75\x38\x57\x32\x14\x49\x1a\x2b\x70\x02\x9f\x97\x87\x7e\x92\x26\xd2\xa2\xca\xed\x76\x9a\xff\x8d\x8f\xa3\x38\x4d\x92\xb9\x1a\xc2\xbc\x21\xc0\x97\xd5\x54\x98\x7d\x9d\x4c\xd9\x1a\x49\xfa\xf0\xea\x0d\xf2\x72\x79\x6a\x73\x6c\x06\xc8\xbf\x48\x32\x2d\xc9\xdf\xfa\x02\x7f\xe3\xc8\x65\x4c\x44\x66\x82\xb0\xd7\x37\x9a\x99\xba\x89\x30\x92\x90\xdc\x5f\x37\xb7\xab\xed\xfd\x40\x2e\x23\x12\x60\x29\xf0\x21\x5c\xfb\x8a\x8d\xe7\x6f\xbb\x18\x95\x48\x14\x44\x84\x14\x3b\x9e\xda\x9d\x8f\x3c\xec\x4c\xf5\xcb\xe2\xc4\xab\xd6\xef\x78\x8c\x28\x0c\x98\x67\xd5\x80\xbc\xf8\xa4\x81\x62\x0b\xf4\xbf\x55\xc5\xe9\x80\x1b\x1c\xa7\x6a\x12\x1d\x5b\xa2\x65\x02\xea\x1e\xab\x7a\x46\x80\xee\x5b\x65\x81\x17\xcd\xe8\xd5\x35\xfa\xa5\xe4\x92\xf9\x9a\x60\x10\x59\x2c\xf7\xc0\x1f\x70\x05\xe0\x28\x12\xd4\x69\x0c\xce\x0e\x6c\xf0\x52\x9d\x9f\x48\x0c\x0f\xc8\xab\x23\x2a\xfa\xe7\xb2\xdf\x08\xd2\x20\x0a\x69\xde\x2e\x8b\x7c\xcc\x22\x26\xd2\x80\x47\xe4\x49\xae\x55\xd5\x3b\x52\xbf\x90\xf4\x14\x69\x00\x81\xf1\x95\x40\x9d\xf7\x66\x79\x69\xfb\x50\x4a\x5e\x95\x84\x19\xf1\xad\xb5\xd5\xa1\xb1\x7b\x82\xdf\xe8\x52\x16\x82\xb1\x44\x0a\xe5\x7e\x8b\xf5\xe1\xbe\x2a\x46\x5d\x9e\xb2\x34\x12\x6e\xbf\xf9\xb6\x7e\x19\x71\x69\x8b\x34\x34\xb6\xdc\xbb\x1e\x07\x72\x08\xe2\x7f\xb5\x38\x42\xa4\x11\x0b\xa9\x9a\xab\x5b\x13\x89\x08\xfc\x76\x30\x09\xd2\x48\x07\xe4\xc7\x76\x03\xfd\x03\x6a\x9c\x74\x51\x84\x11\xb3\x31\x2d\xc2\x5b\x6c\xb0\x28\x96\x79\xfb\x79\x57\xd5\x03\xf2\xdf\x9b\x3e\x29\x8f\x52\xf2\x3e\x8e\x30\xd2\x51\x12\x29\x4f\x22\xe8\x19\x8c\xce\x25\xad\x44\xca\x05\x68\x2b\xcf\xe0\x40\xb4\xd3\x29\x9b\xc6\xc8\x69\x62\xb9\x32\x40\x9f\x9b\xf8\x5a\xe6\x7d\x78\x30\x4d\x02\x4b\x2c\x45\x85\x8c\x4e\x51\xf9\x9c\x8d\x47\xa4\x49\x1c\x11\xaf\x29\x25\x79\x07\x14\xe5\x0c\xcf\x29\xd2\x24\x4d\x42\xb7\x15\x2d\x76\xdd\xde\x48\x15\x3a\xb3\x8b\xa5\x46\x90\xad\xf7\x75\xbb\x1c\x89\x40\x8a\x34\x63\x82\x39\x4a\x66\x27\xf1\x77\x46\x27\x32\x5a\x7e\xd3\xcc\x28\x0a\x42\x53\xfa\x72\x08\xca\x91\x42\xc5\x65\xe4\x99\x48\x45\xc0\x88\x4c\xf1\x8f\xbc\x7d\x1b\x87\xd7\xa6\x0f\x08\xa9\x06\x39\x0f\x35\x0f\x30\xa0\x51\xa9\x63\x0f\x17\xba\x00\x12\xfa\xd7\x2c\x38\x9d\xca\xc0\x8a\x6e\x5b\x60\xf4\x25\x2c\x49\xaa\xb8\xc5\x6c\x37\x6f\xd5\x87\x0f\x34\x50\x61\xc9\xdd\xa9\x28\x66\x7d\xad\x32\x1b\x4f\x3e\xc2\xe7\x08\xdd\x7d\xf3\xb9\xb8\x30\xcd\x53\x25\x03\x42\x9a\xba\xd8\xd4\xc4\x80\x4c\x95\x42\x42\x64\x77\x6b\x7b\xbf\x3c\x8f\x7a\x5a\x87\x92\x39\x44\x09\xd5\x11\x2e\xea\xba\x77\x4d\x52\x1d\xc7\x44\xf4\x74\xf0\x45\x40\x5f\xb0\xbd\xa9\xa0\x9e\x65\x2e\x53\xe4\xa9\x27\xee\xec\xe6\x51\x67\x6e\xaf\x66\xa5\x1f\x22\x0b\x02\x45\x50\xdb\x43\x5b\x5f\xe4\xf7\x11\x59\xc0\xb5\x67\xd5\xd9\xc0\x1e\x3c\xc4\xb5\xee\x8f\xc7\x86\x4a\x78\x9a\x28\x74\x61\x9d\xe1\x00\x01\x34\x5e\x5e\x96\xb3\x2d\x28\x0b\x0c\x63\x66\x08\x41\x4f\x20\x79\xd3\xa1\x91\xb1\x48\x50\x16\x22\x6f\xfe\x98\x71\xde\x3c\x5c\x00\xc6\x65\x0c\x52\x32\xe8\xec\x46\xb1\x98\xbd\x2d\xd3\x01\xf9\xd0\x5d\xbf\xdf\x55\xf5\x1f\x55\xfd\xfe\x73\x37\x3d\x63\x3a\xa6\x6f\x4e\xab\xb5\x7b\x3f\xd7\xc1\x59\x98\xd8\xd4\xad\xed\x10\xcb\x79\x56\xb7\x67\xec\xbb\x22\x0b\x25\xcb\x5c\x98\x66\xb3\xfa\xfd\xeb\x65\x4b\x25\x0b\x75\x6a\x09\x72\x89\x0f\xdc\x89\x99\x13\x39\xaf\xf5\xcc\xc6\xf8\xb3\x84\xf7\xc3\x3e\xfc\x9f\xb9\x62\xf1\xd8\xfb\xc8\xa2\x24\xd1\xa9\xd5\xca\xcb\xb2\xac\xa7\xad\xde\x84\x97\x4d\x97\x2c\xd2\xa1\xcd\x8a\x57\x85\xde\x7c\x1e\xa4\x67\xd5\x11\x19\x0f\x22\xc2\x51\x22\xb1\x95\xe7\x0a\x6d\x39\xc0\x65\xf4\x3b\x35\x57\xd1\x54\xcf\xb9\x98\x30\xba\x8b\x8c\x63\x4c\x93\x6f\xd7\x9c\xe4\x9c\x28\xf6\x62\x0a\x26\x8b\x03\x43\xf8\xd2\x12\x7f\xb4\x9b\x16\x8f\xb3\x8e\x8e\x43\x4d\x85\x4c\x2f\x8b\xd7\xcd\x6a\xb9\x5b\xbe\xae\x6e\xd7\xdb\xcd\xee\x71\xfd\xb4\x7e\x5c\x3c\x38\x01\x28\x7f\xf7\x38\x4a\x84\x05\x9c\x80\xfe\x6a\x2f\x33\x9d\x41\x59\x2c\x24\x85\x75\x6c\xea\xf1\x01\x88\x3d\xb9\x46\x9c\x37\x83\x28\x10\x97\x96\xd1\x2b\x5d\x1c\x83\x24\x52\x46\x1b\xb6\xef\x2c\xef\x09\x32\x31\x4b\x38\xf7\xb0\x89\xbb\x1a\x91\xf2\xd9\xb3\x61\x9e\x70\x41\x79\xb4\xed\xe7\xdf\xd5\x44\x1f\x4d\x64\x89\xb0\xd6\x38\x45\x3e\xac\xfa\xb7\x15\xdf\x6c\xe6\xd1\xbc\x2c\x31\x26\x0a\xfb\xdc\x77\xf7\x65\xd6\xa4\x31\xbd\xc7\x68\xd6\xb1\x59\x1c\x13\x72\xc7\x0e\xf5\x33\xbe\x0e\x41\x42\x1f\xc2\x3b\x13\xb4\xa1\xcd\x31\x1a\x59\x26\x43\x37\x93\x1f\xab\xf9\xb4\xcd\x14\x33\x66\x54\x46\xd2\x4d\x73\x3f\xbc\x66\x2d\x75\x2c\x28\xe1\xf8\x2b\xbf\x61\x62\x53\x8e\x6d\xc0\xce\x51\xa6\x42\x1e\xe2\xe0\xa5\x41\xe9\xd8\xea\xa6\xaf\x24\x52\x46\xe8\xef\x9d\x3c\x7d\xbe\x42\xf9\x7e\x65\x81\x12\x4e\xc0\xb4\xf2\xe4\xca\x67\x22\xdc\x22\x03\x96\xd1\x2a\x82\x43\xd5\x75\x33\x08\x12\x8a\x0c\x20\x8c\x64\xef\xb5\xaa\x3e\xa7\x38\xbb\x8a\x8e\xd1\xf9\x1d\x3b\xa8\x65\xde\x36\x3b\xe7\x40\xee\xaa\x23\x96\xa3\x0d\x24\x53\x82\x13\x2f\xc6\x06\xdb\xdb\x5c\xbf\xc0\xe7\xf3\xa9\xbd\x80\x20\xcc\x14\x32\xd2\x20\xb0\x29\x9e\xce\x5d\xa4\x6f\xb7\xbe\xbd\x32\xa9\xb5\xb2\xe1\x70\xcf\x0c\x1b\xb1\x89\xd3\x9b\x61\x24\xe2\xc0\x73\x6e\xfe\x52\x28\x40\x64\x26\x4d\x28\xee\x78\xac\x51\xe5\x15\x0e\x35\x8e\x22\x33\x32\xa0\x80\xbd\x9d\x7c\xb7\x38\x00\x4e\xc6\xdf\xd2\x68\x2b\xa2\x42\xa3\x7d\x10\xd3\x17\x82\x69\xa4\x7a\xf7\x3b\x92\x77\xf6\xbf\x86\x01\x12\x20\xc1\x4b\xf2\x2e\xa1\x79\xab\x4e\xed\x6f\x3f\x8b\xb2\x8b\x30\x62\x24\x45\xf9\xf2\xba\xda\xad\x97\xcf\x76\x39\xf9\xfa\xb8\x5b\x3e\x3f\x6d\x5f\xd7\x37\x5f\xb7\xeb\xe7\xa7\xfe\x06\x80\x64\xab\x7f\xbd\x59\x6d\x97\xcf\xeb\xa7\xdd\xc3\xea\xf6\xcb\xea\x75\xb7\x7d\xf6\xff\x5a\x3d\x6d\x5f\xff\xdc\xdd\x3e\x2f\xbf\x3e\xae\x9e\xb6\xbb\x97\x45\x8f\xda\x14\x51\x10\x52\xfc\xa6\xce\x9b\xf7\x66\x3a\x1a\x45\xc4\x13\x12\x64\xeb\x56\xbe\x97\xaa\x21\x14\x80\xa7\xb1\x17\x22\x8a\x6d\x8c\x69\x8f\xed\xe2\x20\x73\x2c\xdb\x2d\x1e\x8e\x2e\xae\x4c\x61\x85\xf9\xf5\xb8\x01\x9a\x04\xdb\xea\xf8\xf5\xe8\xb8\x55\xdc\xa1\x38\x0c\x44\x7a\xd1\x0d\xec\x5b\x44\x01\x71\xfe\x2d\x9a\xb6\xf3\x5d\x4b\x52\x6c\x18\x1b\xe4\x22\x8d\xa3\x4c\xf4\x1a\xd6\x9d\xcf\x30\x1e\x27\x22\x4d\x2c\x89\x57\x63\x59\xe2\x67\xf3\x45\xa4\x26\x53\x66\xc4\x04\xe6\x96\x02\xf2\x30\xe6\xa6\xb2\xc8\x78\xea\xa1\x00\x9a\x88\xcf\xce\xcd\x64\x91\xa1\x61\x67\xe9\xb6\x47\x78\xbf\x30\x40\xa7\x27\x0a\x6e\x69\x32\x6e\xf1\xbb\xaa\xca\x70\xf2\x8e\x22\x49\xa5\xed\x27\x8d\x78\x58\xfd\x20\xb9\x19\x7d\xdd\xbf\x11\x42\x6b\x5a\x9a\x57\x9b\xea\x54\x4c\x2e\x05\x01\x52\xb8\xfa\xf9\x88\xe5\x62\x4d\x6b\x12\x51\x0d\x4e\x1b\x31\x8c\x92\x81\xcc\xb7\x3d\x4b\x46\xf9\x76\x90\x10\xc8\xf8\xdf\x27\xbd\x1f\x6d\xcf\x14\x52\x9f\xac\x8a\xfd\x60\x00\x0c\x46\x6a\x3b\x37\x20\x73\x1c\xdb\xdf\x3f\xfd\x97\xbb\x84\x8c\x38\x85\xb4\xec\x74\x5d\x56\xa7\x63\x81\xeb\x03\xec\x71\xfd\x72\xb7\x79\xeb\x5c\xcd\xc9\x00\x90\x71\x44\xb1\xdb\xd7\xf5\xf2\x7e\xf2\x92\x32\xe1\xba\xdf\x48\x7a\x6e\xf6\x9d\xc6\xb2\x3a\xe4\xe5\x08\x18\x24\x64\x92\xd2\xa2\xfa\x6d\xfd\xba\x9d\x5e\xc2\x64\xc2\xd5\x51\xd8\xed\x78\x5b\x59\x84\xf0\x93\x27\xca\x10\x42\x05\x51\x12\xf4\xae\xeb\x78\x79\xf7\x0d\x38\x8f\x3c\x05\x22\x45\x69\x3a\xc7\x84\x20\x92\x57\x8a\x71\xdc\x79\x9a\xc5\x71\x32\xcf\x4e\x9c\x87\xf7\x84\xce\x78\x60\x2c\x1f\xc7\x4b\xf5\x3e\x30\x35\x4c\x7a\x09\x03\xa3\xc4\x98\x5a\xf1\xa5\xea\x2f\x80\x51\x4a\x55\x9f\xdd\x52\xb6\x28\x27\xaa\xd2\x97\x17\x5b\x81\x59\x4a\xde\xbc\xb5\x36\x46\x24\x4d\xf3\x76\xca\x10\x15\xed\xf1\x0d\x1a\x8c\x56\xa5\xa5\xf4\xf0\xf7\x35\x2c\x20\x48\x6c\x5d\x55\x87\xa7\x7c\xff\xd6\x36\xcf\x66\xe2\xc1\x5e\x88\xdc\x09\x23\x34\xcd\xf7\x3f\x97\x37\xe3\x4f\x05\x81\x4c\x52\x31\xc3\xb3\x55\xe7\x7b\x7a\x9f\x0d\x62\x9e\xc9\x70\xda\xeb\x10\x26\x09\xd5\x42\x3c\x61\x55\x5e\x82\x5b\x8f\x7b\x15\xc2\xd4\xba\x14\xc7\x37\x9c\x04\x5a\x20\x0a\x42\xc2\x75\x7d\xdd\xdc\x2e\xfb\xdf\x20\xf0\xca\x94\x8f\x79\x79\x6a\xcf\x7d\x5d\xdf\x10\x2d\xbf\xf9\xb2\xaa\x25\xcc\x52\xf9\xc0\x99\xf0\xb2\xbc\xbb\xa6\x33\xb0\x76\xb7\xf0\x39\xdb\xdf\x81\xc7\xcc\xc8\x5e\xcf\x51\x11\x11\x41\x89\xc5\x64\xe2\x00\x8f\x2d\x5c\xc8\x63\x3a\x2c\xd0\xb9\x73\xaf\xad\xd2\x43\x63\xff\x3c\x55\xed\xba\xfc\xda\x78\x06\x66\x01\x5c\x58\x35\xab\x03\xfc\x18\xc7\x36\xec\x58\x98\xf9\x67\xc0\xa5\xa6\x8d\xc8\x74\xe3\x17\x7c\xb0\xa8\xcf\x3f\x01\x57\x8c\xb4\x5c\x6f\xf1\xfb\xd4\x5b\x84\xd8\x84\xda\x4c\xcb\x6f\x6c\x1e\xd9\x1d\x4f\x84\x0a\xfa\x4c\xaa\xf4\x70\xbf\x33\xdc\x8e\x6b\x9d\x82\xad\xb2\xbb\xc5\x62\x53\xa9\x1c\x0a\x4f\x7e\x34\xf3\x78\x5c\xf3\x8c\x59\x89\x74\x4a\x94\xbc\xcc\x99\xcb\x2f\x7f\xb6\x2c\x4a\x89\xa0\xb2\xa0\xc2\xdf\x9f\x3a\x83\x20\x78\x1c\x0d\xf2\xdd\x6e\x71\xf1\x7d\x77\x56\xca\x01\x42\x47\x04\x02\xba\xca\x93\x30\x7d\x7a\xa1\x13\x0a\xb5\xdb\x95\xef\xd5\xab\x4f\x38\x7b\xdc\x35\x02\xb0\x13\xc9\xc6\x98\xd4\xa7\xdd\x19\x2d\xfa\xcd\x35\x91\x28\x69\xaf\x7b\xb1\x32\x64\x5f\xe0\x80\xab\x1f\xb3\x1d\x16\x74\x00\x91\xab\x7f\xb4\x95\x36\x17\x02\x3e\xa0\x03\x34\x13\x86\x01\x3b\x5a\x7c\x48\xeb\x72\x87\xea\x38\xb0\x61\xcc\xbc\xd4\x36\x4d\xb5\x05\x2f\x11\x23\x40\x43\x4a\x7e\x42\x8f\xe9\xb6\x3b\xd9\x38\x76\x08\xc8\x14\x11\x46\x94\xd0\xe6\xdf\xf1\x15\x8f\xa7\x76\x0c\x4e\x01\x54\x90\x26\x3d\x04\xbe\x86\x79\x1e\x0c\x4c\xc0\x89\x3c\xd0\x7e\xa7\x27\x50\x77\x75\x75\x78\x7a\xb8\x9b\xf5\x81\x61\x96\x5c\xeb\x35\x6f\xb0\xfe\x0e\xab\xed\xfd\xbc\x41\xa8\x95\xab\x40\x1d\x15\x32\xce\x6f\x06\x96\xac\x7a\xa1\xf5\xc8\xaf\x39\x27\x21\x10\x60\x94\xa4\x9c\xaf\x3c\xd5\xb3\xf5\x41\xb2\x28\xa3\xdd\xf3\xf7\xbc\x28\x06\xfe\x2f\x21\x59\xca\xac\xce\x7a\x7e\x38\x16\xd8\x5e\xd3\xd6\x98\x3c\xb6\x64\x59\x10\x12\xbd\x22\x62\xf3\x6a\xd5\xf3\xf6\xb5\x27\x34\x11\x92\x19\xa0\x10\xe4\xeb\xf3\xc3\x8a\x90\x0e\x9b\x3b\xaf\x53\x29\x64\x18\x58\x09\x5a\xd0\x7a\xf5\xa3\xad\xe1\x8a\x5b\xee\x5b\xcb\x80\x9c\xb1\xc5\xcd\xed\xea\x61\xb7\xb8\xbd\x7d\x5d\x6d\x36\xfd\xa5\xb4\xad\x67\xe9\x8c\x38\x2f\xbe\xeb\x63\xb0\x32\x8a\x2c\xab\xca\x17\x6c\x97\x79\xfb\x49\x2c\x9c\xfe\x50\xd6\xd7\xb5\xad\xcb\xef\x15\xd1\x2c\xba\x55\xc6\x03\x98\x2f\x05\xea\x65\x64\x32\xb2\x90\xef\x0a\x38\x0c\x6f\xcb\x85\x4e\x7a\x02\xda\x25\x1c\x09\x5b\x01\xea\x6d\x8e\x5b\x90\x1c\x22\xc2\x0c\xdf\xe2\xb1\xdf\x64\x25\x57\x96\x0c\x9b\xce\x76\x49\x90\x97\xba\x3a\x54\x76\x51\x9b\x5e\x21\x66\x4e\xd0\x91\xf4\x88\x0f\xa7\x32\x6f\xaf\xa9\xd2\xf8\x33\x42\x6b\x85\xd4\x4e\x5b\x74\x3c\x0d\x64\x1c\x4a\x21\x1d\x43\xdb\x98\xa8\xfa\x52\xc8\xd3\x9f\xc2\x03\x0a\x61\xdf\x9d\xd4\xfb\x9f\xd5\xa9\xbf\x92\x8c\x69\x74\x1d\xe0\x07\xe5\x02\xc6\xf0\x29\x19\xa3\x55\xf8\xaf\x4e\xed\xf1\xd4\xda\x3c\xd5\xe5\xaf\x9d\x30\x4b\x04\x68\x4d\xbc\x6f\x98\x9b\x4f\x4f\x7c\x38\x6a\x94\x19\x1e\x0c\xce\x83\x63\xa6\x99\x84\x3f\x65\x8a\x29\x77\x59\xf6\xc7\xcf\xce\xe4\x75\xa6\xfd\x6c\x52\x64\x22\x23\xdb\x9b\xe2\xcd\xcb\xaa\xfc\x8e\x75\xbb\x2e\xdb\xea\xbe\x2d\xd4\x6f\xff\xb0\x70\xf4\x7a\x74\x58\x66\x92\x3b\x9d\x1f\xd0\x63\xbe\x37\x21\x33\x2d\xe3\xd8\x9a\x56\x37\x23\x96\x65\x21\x45\x14\xa9\x91\xb2\xce\x1d\x14\x85\x84\x0b\x76\xd7\xb9\x58\x9f\x90\x22\x4e\x69\x58\xbf\xde\x4c\xac\x55\x29\x52\x4d\x76\x03\x45\xfa\x37\x79\xef\xc1\x4a\x88\x6c\x9e\xde\x65\x2e\x5d\x15\xdc\x39\x71\xb2\x90\x90\x61\xc2\x7a\xd4\x42\x91\xab\xbc\xdd\x58\x95\xdd\xcf\x31\xa8\x43\xca\x38\xa6\x19\x02\xc7\x71\x5d\xeb\xa5\x24\xb2\x54\x01\x12\xe2\xa9\x5b\xe9\x71\xe2\xda\x49\x15\x5a\x67\xe1\x06\xf6\x2f\xa0\xde\xa7\xc7\x78\x4c\xd4\x26\xdb\xfb\xe7\xfe\x27\x08\xb5\xc3\x97\x3a\x8d\xd7\x8b\x0a\xf4\x97\x87\x9c\x92\x8e\xe3\x17\x0f\xd5\xf4\x46\x46\x50\x81\x69\x9b\x77\xbb\xdb\x31\x1f\xad\x6f\x5a\x5a\xf4\x39\x75\xe8\x16\xe1\x70\x77\xb2\xf2\x30\xbd\xfd\x22\x31\x4b\x81\xd9\x98\x4d\xe9\xad\x2c\x77\xc8\xa8\x84\x30\xb5\x2f\xeb\x6f\xcf\xdb\xe5\xfd\xc2\xd3\xd5\x08\x15\xc8\x30\x76\x81\x9e\xbe\xac\xf1\x12\xfa\x5f\x31\x16\x64\x16\xdd\x66\x41\x6b\xa7\xc2\xcf\x69\xc5\xb2\xc4\x77\xc6\x13\x7e\xdc\x9c\x9a\xbc\xc4\xc6\xd3\xd3\x4e\x3e\xaa\x62\x99\x24\x68\x31\xf9\x3f\xa7\xe6\x02\x40\x54\x31\xa1\x29\x21\xa5\xaa\x52\xc1\x45\xa0\xbf\x0a\x39\xa7\xca\x7f\xfc\x81\xea\xd4\xe2\x06\x0b\xa3\xd1\x12\x5b\xf8\x67\x0a\xbb\x99\x3d\x29\x0f\x87\x4f\x5a\xef\xa6\x33\x5b\x71\xae\xd1\xb8\xf5\xe8\x31\x27\x2d\xbf\x0b\x2a\x04\xd3\x73\xe2\x20\xa5\xd2\x73\xef\x77\xdf\xe2\xf7\xab\x59\x20\x15\xc7\x19\x77\x09\x8b\x61\x79\xcd\xfe\x3b\xfe\x1f\x7f\x1c\x91\xa2\x64\xee\x5d\x48\x60\xe6\xce\x69\xca\x8f\x83\x42\x2a\x49\x45\x9a\x78\x6d\x0e\x85\xc7\x96\xb6\xb0\x8b\x26\xa6\x4a\x84\x05\xf5\x13\x29\x28\xd6\xb9\x53\x05\xf3\x9d\x93\x46\x31\xe1\xde\x64\x5e\xb7\x6f\x36\x80\xfd\x56\x63\xf3\x56\xf5\xc0\x41\x95\x26\x89\x95\x7d\x85\x93\x4d\x7f\x13\xe3\x76\x8b\xe5\x28\x62\xa2\xd2\x54\x13\x42\xaa\xf3\xd6\xc6\xd5\xd9\x2a\x05\xcb\x58\xe6\x6c\x4a\x57\xf2\x7b\x5e\x47\xaf\x52\x4c\x29\x54\x77\x93\xb7\x45\xfe\xd7\xa9\xaa\x37\x2d\x94\x1a\x6a\xfd\xcf\x28\x3a\x84\x12\x99\x0a\xfc\xaa\x0b\x3f\xbe\x40\x33\x22\xf2\x11\xaa\xfb\xbe\xc4\x30\x72\xa8\xca\xf6\xae\xc6\xf2\xef\x19\x18\x46\x09\x15\x93\xf0\x5f\x53\x54\x47\x9c\x01\x86\x95\xc0\xcc\xba\xb3\xd5\x04\x20\xaf\x64\x28\xb4\x57\x75\x58\x35\xaa\xae\x3e\xfa\xa0\x95\x92\xca\x12\x62\x78\x83\xb7\x73\xd1\xfb\x39\xaa\x54\xac\xc2\x21\x27\x68\x7d\xd0\xe7\xf2\x95\x14\xce\x9b\x89\x08\xfa\xec\x8b\xaa\x18\x49\x45\x5c\xe6\x7a\x5e\x76\x3c\x1d\x6f\x2a\xb3\x62\x36\x3d\x2b\xed\x2c\xa8\xad\x94\x8e\x04\xf8\x80\xab\xbd\xc4\x6e\x71\x79\x2b\x57\xca\x84\x99\x1a\xd9\x19\x84\x8e\x55\x55\x7d\x05\x2a\xa0\x34\x97\x14\x42\xd3\xa8\x72\x9d\x97\xfb\xb1\x8f\xad\x34\x24\xf4\x0a\x34\xa4\x5e\xbe\x79\x54\xbc\x42\x96\x90\x3f\x74\x80\x1f\xaf\x23\x4c\xbe\xc2\x28\x92\x4e\x5b\x89\xb4\x45\x56\xaf\xcb\x2c\x0c\x1e\x07\xce\xfe\xe9\xb3\x62\x6c\x05\x51\x35\xcd\x46\xe2\x82\xea\xaf\xa4\x99\x70\x01\xde\xa7\xca\x86\xe0\xa1\x97\x41\xed\x3b\xc6\xc4\x49\x30\x05\x8a\x0c\x49\x7e\x7f\x25\x23\xac\x35\xb4\x73\x10\x80\x57\x34\x3f\xa1\xba\x16\xca\x40\x16\x3a\xb8\xb8\xab\x47\xba\xa0\xda\x74\xe5\x54\x9d\x32\x39\x01\x7d\x4d\x97\x2e\x1d\x1a\x45\xcc\x84\xb7\x95\x6a\xab\xfa\x2c\xb2\xa6\x23\x60\xb1\x1c\x96\x65\xfa\x14\x83\x81\x71\xd1\xd9\xd4\x11\xea\xcc\xf6\xb9\xc9\x4b\xf4\xf8\xd3\x1b\x4a\x2a\x3c\x74\xcb\xba\xbf\x38\x67\x81\xaf\xe8\x5f\xab\x6a\x4a\x68\x3f\xf9\x2e\x9a\x43\x42\xbc\x3b\xb9\x53\x6f\x98\x15\xbe\x4f\xdf\x5a\xc7\xc2\x72\x76\x39\x0a\x1a\x92\xc6\xee\xcf\x99\xba\xe5\x3a\xd6\x56\xfe\x7d\x51\x1c\xdf\xc0\xd6\xe1\x8c\x64\x29\xbd\x49\xa4\x13\x26\x08\x98\xd4\xcd\x56\x2f\xc8\x6e\x93\x4b\xd3\x5b\x27\xcc\x62\x91\x1b\x6c\x9f\xeb\x3d\x94\x67\x02\x9d\x42\x27\x69\x4a\x44\x5d\x1f\x79\xa9\xab\x0f\x8b\xc5\xa7\x58\x05\x31\xce\x7a\x08\xae\x4e\x74\x42\xde\x13\x29\x81\x3a\x3c\xc4\xc2\x49\x7b\xcd\x6e\x9a\x06\x01\xd1\x73\x6f\xdf\xf0\x0b\x5d\x6e\x3b\xe2\x77\xba\xbe\xee\xe9\x34\x0e\x47\x4c\x76\x9b\x7c\x5f\x6e\x2b\xcb\x79\xbb\xd8\xd7\x88\x67\x22\xd2\x42\xa7\xa9\x95\xaa\x26\xc1\xb5\x66\x5b\xfd\x01\x79\xfb\x50\xf5\xb8\x17\x9d\x25\x2a\xee\x39\x5a\x5b\xc8\x8b\x79\x4c\x5a\x67\x92\xdb\xa2\x1d\xac\xeb\xaa\x9e\x44\x70\x74\xa6\x80\xaa\x2e\xba\xa1\xfd\x52\x5d\x89\x65\xe8\xcc\x88\xc4\x79\x41\xb6\x3e\x9b\x60\xb5\xcd\xd2\xf3\x38\x93\xd0\xbc\x7f\x20\x21\x83\xd8\x4a\x63\x9b\xbc\x28\xba\x43\x26\x47\xb2\x79\x06\x59\x14\xa1\x05\x6a\x2a\x7d\x71\x13\xb2\x33\x8b\xae\x38\x26\x1a\xb2\x58\x47\x33\xf9\xc0\xba\xcd\x55\x31\x0c\x6b\x89\x92\x34\x62\xcc\xa9\xd4\x77\x55\xed\x74\x3d\xfc\x51\x95\xa5\x1e\xbd\xf5\xb5\xc1\xfa\x11\x7e\xcc\xd1\xa2\xbe\xa1\x94\x46\x0c\xc9\xce\x87\x4a\x36\x6d\xbf\x7d\x68\xa5\x13\xca\x39\x37\x90\x6f\x4f\xd2\xff\xaa\x05\x86\xe1\x20\x11\x58\xe7\x23\x68\xe4\x45\x71\xe4\x99\xe9\xaf\x35\x5a\xb2\xda\x12\x4f\x75\xa5\xa1\xef\x47\x0c\xad\x1a\xf0\x06\x5b\x57\xac\x3d\xaf\xa1\x9b\xf5\x93\x61\x32\x70\x71\x3d\xe2\x07\x70\xac\x63\x0f\xd0\xb4\xee\x9f\xeb\x2b\xf9\x71\x64\x22\x93\x03\xaa\xd7\xdf\xe6\x34\x26\xe9\x98\xde\x0c\xc3\x24\x88\xb5\x47\xb8\xd1\xc2\x6b\xe3\x31\xdb\x8a\x26\x56\x35\x1b\x84\x18\x66\xc0\x9d\x90\xd9\x17\x38\xa0\x2d\x07\xf5\xdf\x0f\x43\x15\x90\x53\xe8\x04\x88\x88\x3b\x1d\xe7\xb5\x0b\xd7\x00\x7b\xb3\x1b\xe9\x8c\xaa\x0e\xde\xa0\xd4\x45\x67\x3e\x76\x5b\x06\x95\x20\x36\x44\xe0\x71\xa5\x07\x78\x00\xc6\x29\x02\xef\x71\x73\x3a\xcc\x1e\x9f\x87\x11\x79\x89\x5e\x18\xdc\x0c\x58\x2d\xe4\x69\x66\x1c\xf9\xc7\x17\x68\xee\xaa\xfa\xb6\x86\x8f\x01\x99\x86\x1c\x43\x1b\xc2\x26\x10\xf4\xe8\x11\xdc\xf1\x38\xb4\x15\xbc\x7b\x6c\x47\xb5\x30\xfd\xe0\xc6\x38\x0b\x49\xb7\xe8\xee\xd4\x9e\xea\xff\xe0\x95\xd1\x35\xc2\x59\x60\x12\xc5\xc2\xf1\x4f\xac\x55\x75\x41\x55\xbb\x6b\x02\xe4\xed\x2b\x72\x65\x1b\x1f\x55\x9d\x65\xe6\x30\x89\x53\x21\x47\x0c\x0f\x1e\x71\x73\x39\x2a\x6e\x35\xa7\xfc\xc8\xc6\x44\x5a\x1e\x36\x1f\x2a\x1a\x6a\x1e\x2e\x06\x1d\x31\x95\xb6\x23\x4d\x5d\xfd\x8d\xa4\x65\xd8\xcc\x93\x67\x98\x9a\x98\x78\x59\x9e\x97\xff\xb5\x78\x59\xfb\x2e\xca\x62\xe7\x66\x21\x1c\xa6\xe9\x41\xcc\x52\x4b\x04\xec\x49\x06\x87\xf2\x0e\xdf\x40\xa2\xb4\x9a\xf2\x04\x3b\xba\xe2\xbc\xa0\xe0\x16\x7c\x03\xfa\xfb\x60\xc1\xb3\xf8\x5f\xa3\x49\xe2\x80\x30\x09\xff\xd7\xf8\x3f\xfc\xf9\x49\x4a\x74\xec\x37\xab\x3f\xfd\x9d\x21\x54\x94\xb3\xab\x4a\x3b\xa0\x5e\xaa\xa2\xb8\x23\x4e\xe5\x51\xfa\x1c\x21\xe1\x3e\x04\xb5\xa1\x07\xea\x4f\x4f\x53\x5b\xd8\x5a\x83\x97\x1b\x9d\x6b\xc1\xcc\x06\x39\x40\x42\x50\xae\x53\x43\xac\x6b\x67\x40\x31\x94\x11\x8b\x2c\x9b\xca\x2b\x82\xfe\xdc\x56\x8f\x67\xf6\x0b\x4a\x6e\x08\x2f\xf6\xf8\xe7\xbf\x7b\xd2\x40\x81\x12\x33\x9a\x20\x45\xf5\x09\x45\xfb\x39\x16\x39\x11\xa8\xb4\xad\x58\x75\xf5\x6e\x14\xac\xbe\x39\xf9\x48\x06\xea\x40\x46\x9e\x41\xb8\x06\xd5\xb9\x50\x5f\x60\x5a\x5c\x88\x3a\x44\xaa\x23\xd9\xf5\x74\x06\xf5\xd8\xe3\xbb\xfc\xbe\x1a\x53\x4a\xae\x34\x4e\x00\x7d\x10\xca\xf7\x0d\x0c\x63\x7c\x14\xf3\xa2\x11\xea\x90\xdc\xbe\x0d\x66\x29\x31\x3c\xdd\xc2\xdf\xfd\x4f\x60\xf9\x70\x5b\x02\x09\x5c\x08\x17\x21\x6a\x13\xb8\x57\x7a\xd1\x86\xd0\xad\x67\xd8\x0f\x34\x3c\xa0\x92\xd8\xd2\xed\x6a\xf7\x08\x45\xfb\xf6\xe9\x8a\xaa\xf3\xaa\xb7\x5f\xd1\xa4\xb6\x8e\xc9\x03\x9b\x29\xc5\x52\x57\x87\xaa\xbd\x66\xbf\xa1\xc9\x42\x8a\x28\xc9\x53\x71\x46\xa3\x3c\x09\x45\xcd\x4e\x03\x26\xe3\xf1\x84\xef\xde\x70\x16\x78\xb5\x4d\x4d\xc0\x2c\xd8\x04\xb4\x3e\x83\x2f\xfb\x26\x11\x12\xad\xf5\xda\x8b\xdc\x61\xed\x24\x47\x85\x09\x94\x22\x54\xee\xb1\xc6\x5d\x33\x42\x82\x1a\x16\xea\xc0\x11\x4e\x8f\x01\x31\xfd\x51\xa4\x9c\x6c\x59\x7d\x87\xa9\x61\x69\x58\x66\xe5\x31\xac\x11\xfa\x98\x17\xd8\xb4\x55\x89\x83\xdb\xfd\x42\x0a\x45\x5e\x41\x54\x18\xa6\xc2\xc4\x3b\xc2\x58\xfb\x5e\x1a\xc7\xd5\x7f\x2a\x69\x23\x0c\xd3\x11\xd9\xdd\x9b\x0f\x98\xc1\xbf\x4c\xc8\x02\x4a\x1c\x58\x46\x05\x72\xb3\x17\x39\x51\x1e\x5f\x23\xed\x31\x61\xc8\xc1\x45\x59\xa8\xbf\xff\x5d\xc9\x59\x97\x87\xa9\x8e\xc7\x7c\x0d\x93\xe8\xd5\xe5\x47\x8c\x52\xc5\xbd\x82\xdf\x2e\x2f\x69\x87\x1f\xc9\x34\x08\x13\x89\x98\xc0\x29\x6d\xd5\x77\x24\x4f\xad\x39\xa5\xab\x7e\xc6\x74\xf6\xdb\x35\x35\x13\x61\x38\xea\x14\x86\x2a\xaf\x2d\xec\x67\xbd\xc1\x8d\x8e\xd3\xc1\x04\x7b\xa9\xab\x1f\x7e\xfa\x9b\x24\x32\x14\xd7\xee\x16\x6f\xd9\xff\x18\x07\xc6\xfb\xea\xa3\xd5\xd0\x24\x69\x20\x94\x43\x81\xff\xcc\xa7\x35\x09\x66\x54\x8d\xac\x6b\x20\xa9\x05\x9b\xc0\x1a\x7b\x5a\x26\x65\x16\x7b\x55\x40\x43\xca\x06\x7d\x04\xc1\x64\x31\x50\xaa\xc3\x0d\xfc\x59\x56\xea\xa7\x06\x88\xc9\x92\x80\xea\x49\x56\xe5\xbe\x86\xb1\xa6\xde\x74\x6a\x64\x99\xed\xb2\xe5\x1b\xc9\xcc\x0f\x6f\x98\x81\xd5\x46\xed\x9e\xea\x15\x5a\x87\x6c\x24\x42\x9a\xbb\xaa\xb6\xf0\x45\x95\xfb\x9d\xba\xdf\x6d\x8d\x60\x31\x4d\x78\xe8\x1c\x89\xbe\x4e\x7c\xfa\x6c\x82\x59\xba\x85\xde\x94\xee\x3f\xb9\x90\xf6\xa9\xc9\x71\xcc\xcb\xfd\x23\xf6\xd0\x48\x03\xdc\x4a\xf4\x12\xa8\xe5\xb5\x92\x7d\x4a\xc2\x80\x92\x24\x1b\xbc\x7e\xda\xae\x5e\xbf\x2d\x1e\xfc\xef\x32\x8d\x2d\xef\x9a\xcb\xd1\xd9\x20\xff\xe5\x0f\xa5\x02\x46\xcf\xf4\x05\xdb\x9b\x5c\x6f\xb0\xce\xe7\x8c\x23\x46\xe9\x40\x78\x44\x11\xf9\x63\xe7\x5e\xb8\x6b\xa9\x19\x07\xe6\xe5\x82\xb7\x75\xfe\x3d\x87\x62\x08\x92\x4d\x6f\xac\x75\x46\x59\x68\x0f\xa5\x7a\x58\x3f\xae\x3d\x20\xd3\x20\xe3\x44\x54\x78\x80\x1f\xd6\xeb\x7c\xa9\x9a\x26\x1f\xb2\x61\x06\x43\x9b\x7f\x75\x39\x43\x38\x1c\x21\x2f\xf7\x93\x7d\xcf\x74\xa6\x5d\x34\x82\x0e\x35\xdb\x8a\x2a\x57\xa6\xcf\x81\x59\x1c\x38\x07\xd6\x7f\x94\x59\x03\x8c\x69\x7f\x5c\xde\x6c\xec\xf8\xbd\x60\xf9\x5d\xb5\x8e\xa7\xbc\xbf\xc2\x98\xd4\x60\x70\x0e\x85\xed\xf9\xb0\x20\x08\x52\x4d\xb1\x35\xc7\x5e\xf6\x98\x97\x4e\xa7\xa5\x97\x94\xee\xda\x58\xa0\x35\x96\x56\x38\xef\x42\xdc\x1e\x82\x00\xb2\x70\x1c\x70\xb5\x15\xda\x73\x96\x3e\x08\x58\xa0\xc6\x2e\x14\x94\xef\x33\x5d\x21\xdf\x4e\x58\xbd\x0a\xe7\x43\xd8\x50\xfb\xb4\x37\x21\x08\x39\x44\x66\x08\x07\xad\x9f\x16\xa3\x39\x0f\x41\x04\xf6\xe5\xdc\x42\x34\xe4\xf2\xe6\xd7\xe1\x22\xa0\x78\xf6\x4b\x0d\xef\xd0\xbc\x4d\x2e\x12\x87\x81\x23\x18\x76\xc3\xf1\x1a\xbd\x30\x04\x31\x07\x4b\x1f\xdd\x9f\x2b\xac\x32\x9d\xc1\x56\xbd\x39\x8d\x2a\x8d\x3f\x6e\x3e\x37\x25\x1c\x9b\xb7\xaa\x9d\x54\xd7\xf9\x93\x40\xd3\x3c\xb3\xa3\xc8\x0a\x49\xfe\xd4\xf6\x81\x20\x46\xcb\x2c\x92\x97\x4d\x0b\x65\x9b\xff\x44\xe5\xd7\x9d\x91\x44\xda\x61\x90\xbb\xcf\xd4\xcd\x1a\xf4\x0f\x9d\x24\x01\xb7\x4c\xcd\x48\x71\xd3\xc9\x16\x39\xbd\x6f\xa2\xa4\xf7\x66\x76\x96\xdf\xbc\xbf\x88\x42\x1f\x19\xa3\x3a\x56\x17\xcd\x99\x7e\xe3\x2c\xb0\x38\xb6\xbc\xeb\x94\x67\x73\xc1\x14\x87\x40\x04\x5c\xdb\xb9\x99\x53\xad\xe0\x6e\x45\xd2\x89\xfd\xd3\x8a\x4c\x69\xab\x5f\xa5\xde\xd1\x2b\x1f\xfa\x83\x10\x47\x94\xf5\xb8\xc9\xd5\xa7\x2a\x70\x8c\x57\x86\x40\xf1\x54\x0d\xd0\x62\x37\x99\xed\xfc\x9a\x3e\xa6\x92\x76\xcf\xfa\xb6\x1c\x67\x43\xfd\x41\x15\x51\xb1\xc1\xe6\x71\xfd\xf0\xbc\x5b\x3e\x3f\x3e\x7e\x7d\x5a\x6f\xff\x9c\x40\xbe\x21\xc0\x18\x52\xcf\x75\x52\xbd\xf4\xf0\xeb\x6b\x64\x88\x10\x60\x16\x3b\xee\xd5\xdb\x1c\x0e\x55\xe9\x53\x58\xfe\x82\x86\x21\xa9\x73\xdb\x82\xdd\x11\xf5\xfe\xf4\x0b\xb1\x20\x05\x97\x0b\xb7\x72\x8c\x57\x98\xa2\xe7\x1c\xb3\xb3\xab\xb0\x50\x18\x46\x43\xc2\xd2\xbe\x59\x1b\x6e\x44\xad\x0a\x2c\x0c\x34\x21\xc6\x3a\xd3\xe3\x26\x6f\x57\x7f\x9d\xa0\xb8\x83\xbc\xa0\x01\xff\xfc\x7c\xd3\xb7\xe3\x29\x61\x11\x36\xf9\x69\x3c\xcd\x58\x98\x5a\xa1\xf6\x23\xb1\x5d\xc7\xb8\xf7\x7c\x79\xc0\xa2\x54\x90\xe5\xb6\x5c\xbd\xde\xec\x86\x72\x43\x60\x11\xd8\x9d\xbb\x85\x77\xec\xf9\x28\xed\xcf\x5d\xdf\xcd\xc1\xa1\xc0\x22\x44\x4a\xfe\x63\xad\xc2\x60\x72\x84\x67\x82\xc0\x23\xdf\x73\xec\xcb\x71\x3c\x05\xd4\xbd\x25\x48\x9a\x4e\x53\xc6\x0d\x23\xb0\x83\xd5\x2e\xea\x46\x9d\x4f\x21\x00\x8b\x63\x46\xf3\xa2\x07\x9b\x8c\xd8\x5c\xae\x6c\x67\xc0\xe2\x54\x9b\x81\x5a\xc8\x7f\xef\x5f\x04\x42\x66\x1f\x2a\x4e\x6d\x99\xc2\x9e\xb8\x46\x6f\xa0\xe9\xbf\x4f\x92\x66\x54\x62\xf9\xf0\xf5\x71\xe1\x7f\x4b\x03\xbb\xef\xed\x8c\x4d\x96\xef\x3a\x2f\xcb\x1f\x63\x09\x15\xe6\xcd\xe4\xdf\xbb\x51\xfb\x6f\x50\xef\xc7\xea\xda\x88\x4b\x43\x13\xa2\x2f\xe1\xfe\x28\x57\xe5\x3e\x2f\x71\xd6\x77\x69\x6c\x17\x4a\x1b\x61\x99\x94\xbc\xf5\xbb\x17\xb0\x2c\x49\xa9\xca\xb4\xa8\xaa\xf7\xd3\xf1\x9c\x41\x0e\x58\x06\x19\xa5\x03\xbe\x96\x4d\xe5\x3e\x75\x73\x73\xaa\x67\x71\x55\x60\x99\x8a\xa9\x40\x6e\xf3\xe8\x67\x24\x13\xa1\x4a\x9d\xd3\xf6\xc7\xc3\xe3\xd6\x90\xba\xfa\xec\x34\xc1\x2d\xe4\xcd\xea\xf6\x15\x55\xdb\x56\xc9\x7d\x75\xaa\xcf\xcb\xee\x2f\x7f\x51\x91\x70\x2a\x03\xfb\xf6\xfa\xef\xc9\x60\x13\xa0\x88\xcc\xc4\xa0\x7a\x5b\x14\xc5\xb7\xaa\x75\x31\xb2\x97\xda\xca\xe4\xdc\x7c\x5e\xd8\x18\x98\x90\xdc\x92\x85\x6b\x6d\x39\xcd\xaf\xdc\x55\x65\xe4\x87\xb9\x6a\xc0\x11\x5b\x24\x30\x81\x51\xdc\xaf\x43\x97\xe4\xb0\x81\x81\x94\x96\xb6\x87\xb4\x6e\x72\x2c\xdb\xe9\xda\x7d\x65\xe4\x81\xe1\x8a\xf7\x25\xcc\x13\x3e\xee\xd9\xf3\x49\x21\xc8\x14\xdb\xdc\x2c\x57\x57\xc6\x90\x94\x2c\x71\x36\xe0\xbf\x9b\xaa\xdc\x56\x2e\x3a\x78\x01\x7e\xd3\x35\x06\xca\x1c\xf9\x69\xbb\xe9\xad\x1b\x26\x35\x10\xee\xf9\xa1\xda\xbf\xe2\x6c\x24\x4f\xe3\x26\xd9\xfc\xa2\xc8\x53\xca\xce\x2e\x9f\x86\x40\xc2\xf4\x3d\x34\x0f\x0d\x1f\x95\x24\xf0\x71\xb4\x1d\x98\xce\x80\x84\x64\x7e\x44\x61\x14\x46\x3e\xbe\x7a\x21\x5b\x30\xeb\x1e\xad\x59\x12\x8e\x4a\xf0\xae\x74\x11\x32\x4e\x43\xbf\x79\xab\x3e\xee\x5e\x1e\xaa\x0f\xac\x8b\xbc\x7f\x71\x93\x42\x4f\xc8\x80\xcd\xe5\x38\x28\x30\xa3\x91\xbb\x4d\xfa\x11\x7e\x7c\xe4\x13\xa8\x14\x84\x81\x0e\x28\xf1\xdb\x6b\x89\x76\x96\xc0\x24\x60\xdc\x5f\x2a\x0c\x4c\x6a\x85\x19\x47\x83\xce\xd9\x3a\xa3\xdd\xba\x6b\x46\x85\xb6\x79\xb3\x26\x95\x8b\xb3\x1c\x21\x84\x2c\x82\x9e\x9f\xa6\xdb\x40\x3a\x67\x74\xc6\x1d\x06\x61\x94\x1a\xaa\x73\xbf\x0b\x6f\xfd\x4f\x9c\x65\x54\xca\x49\x15\x5a\x88\xfa\x1e\x9a\xb7\x45\x7f\xd0\x68\x4b\xbd\x66\xc1\x3c\x5f\xb0\x44\x5b\xda\x38\x7d\x8b\x38\x64\xe4\x8e\xc9\xce\xe8\x2c\xff\x37\x2f\xbe\x60\x09\xc7\xd1\x9a\x14\xc6\x61\x46\xdb\x14\x34\x9f\xa5\x3a\xab\x4c\x87\x30\x06\x24\xa9\xad\xed\x6a\xb3\xdd\xdd\x3f\x7f\xdd\xac\xfc\x23\x24\x22\xa2\xac\xd9\xfb\xa7\x1a\x53\xbf\xfd\xdc\xb2\x0b\x13\x6d\xa7\xd5\x97\x09\x78\x07\xc2\x6e\x5b\x1f\x4d\xf2\xce\x8e\xee\xcd\x9e\x30\x05\x1b\xac\xf1\x91\x83\x2f\xf9\x77\x84\x0f\x98\x99\x5f\x61\x0a\x59\x26\x87\x62\x48\x67\x1e\x13\x07\xa7\x5d\x19\x88\x8f\xc7\xba\xa4\x5e\x1c\x64\x02\x34\x1a\xd9\x0b\x93\x5c\xd2\x28\xf0\x05\xa1\xe0\x8a\x82\xcf\xd2\xf3\x7a\x8e\x22\x0b\xbe\x89\x4c\x2d\xb2\xdb\x12\x88\xf5\x6e\xdf\xf8\x32\x10\x64\x04\xd8\xde\x2e\xbe\xfe\xbe\x5a\xfc\xe9\x09\xcd\x20\x84\x24\x20\x74\x88\xa9\x6a\xcc\xf7\x25\x95\xec\x8f\x00\xef\x10\x82\x46\x42\x9c\xde\x56\x56\x19\x6e\x56\x49\xff\xdf\xe1\x10\x20\x4b\x9d\xcc\x67\x9f\xb7\x19\x8e\xcd\xbe\x0b\x60\x48\xa3\xed\x3d\x2f\x8a\x6d\x5e\x78\x8e\x9b\x51\x64\x1e\x42\x69\xb4\x71\xeb\x75\xf8\xff\x6b\x3b\x0f\x95\x0c\xb9\xc5\xc1\x36\x6d\xd1\xf9\x40\x0b\xfd\xbf\x27\x27\x6b\xe3\x9a\x20\x13\x94\xba\x7d\xda\xbe\xfe\xb9\x18\x99\x1b\x03\xf5\x0c\x84\x18\x5a\x99\x58\x57\x4e\x78\xea\xb6\xef\xaa\x98\x8d\x7d\xe4\x89\xd5\xc6\xee\xeb\x07\x86\x8a\x49\x08\x4d\x62\x93\xea\xa4\xb5\x5b\xe0\x94\x7d\xc6\xb6\x89\x02\xce\x2d\x1f\x1a\x85\x9d\xfe\x31\xbd\x06\x44\x41\xa2\x28\x51\xea\x6d\xfc\x89\x9d\x1e\x31\x63\x85\xd0\x6a\xb4\x5c\x68\x15\xd4\xda\xe9\xb2\xcc\xcd\xe6\x28\x8c\x24\x65\x1a\xe7\xab\xd4\xd5\x2c\x2d\x44\xa1\xc8\x7c\x11\xe5\x1d\xe2\xbc\x16\x79\xfa\x86\x11\xb3\x81\x6f\x2f\xc9\xe7\x91\xef\x33\xc2\x6d\x88\xa2\xc8\x16\x70\x1e\xe0\xc7\xae\x99\xbc\x4d\x64\x62\xc2\x32\xee\xb1\x25\xde\xe7\xc9\x2e\xe4\xdd\xb3\x88\x07\x48\xc3\xeb\xe6\xf7\xf1\xac\x8f\x38\x53\x99\xc7\xe0\xaf\xea\xba\xaa\x5f\xab\xaa\x75\x2c\x66\xed\xa7\xad\xa5\xfb\x5a\x56\x1f\x25\x6a\xaf\xe1\xea\xcf\x8c\x04\x91\xfd\x1c\x5d\xb6\x7e\x09\x47\xd2\xf7\x1c\x1a\x70\x9e\x5a\x85\x8b\xf6\x16\xf1\x4c\x0b\xea\x62\xa9\xef\x3c\x08\x10\x71\xa1\x68\xb5\x6a\x2c\x4d\xb3\xb4\x55\x89\x6d\x0b\x26\xff\x49\x61\x04\x44\x5c\x4a\xbb\x7b\xd0\x1b\xf8\x6f\x30\xc7\x78\x42\x14\xc7\x10\x4f\xa8\xc8\xba\xcf\x30\x8b\x30\x44\xb1\xd0\x5e\xbe\x67\xa5\x4f\x76\x95\x5d\xe6\x6d\xfe\xf7\x9c\x38\x01\xa2\x58\x5a\xe4\x6e\x4e\xa6\xc3\x15\x76\x0d\x88\x62\x63\x0d\xd1\xce\x24\x72\xd5\x85\xee\x48\xa2\x22\x6d\x55\x35\xe1\x70\x29\x5c\x33\x7d\xb2\x04\xad\xbc\x54\xb7\x67\x6f\x0e\x50\x14\x63\x69\x1f\x88\x12\x13\x83\xc5\x1c\xca\xd3\x7e\xf6\xa4\x19\xc8\x50\x8d\xc8\x9a\x4e\x75\x33\xe1\xf3\x86\x48\x04\xb6\x2c\x47\x9e\x3e\x5f\xb0\xde\xa0\xd3\xad\x61\xc9\xd4\xf3\x8f\x04\x57\x64\xd8\x63\x0d\x0d\x5a\xc3\xd9\x49\x81\x8c\x61\x34\x10\x09\x94\xb6\xfc\xbe\xa8\x24\x14\x8e\xaa\x78\xbc\xb0\x46\x90\xd9\x10\x36\x39\xf8\x3b\xcb\xf3\xd1\x9f\x0e\x60\xb7\x52\x2c\x75\xaf\x3e\x3d\x5a\x50\x22\x19\x30\x0a\xf3\xf5\xf9\xc2\xf2\x06\xdf\xa0\x30\x3f\xdf\x0f\x23\x09\x4a\x5b\x26\x7b\xf5\x7e\x3a\xee\x3a\x87\x4a\x57\x1f\xfd\x04\x91\x2a\x24\xdb\x37\xb7\xd1\x7f\x97\xa2\xb8\xb4\xe6\xa8\x28\xa1\xdc\xe2\x6d\x55\x14\xf7\x90\xf7\x5f\x54\x71\x4e\x60\x8f\x5e\x34\xad\xea\x0f\xe9\x24\x14\xc1\xb8\x0c\xce\xaf\x71\x75\x9f\xbe\x9e\x3e\xac\x4e\x95\xb6\x22\xd1\xc5\x95\xea\x1d\x88\xb4\x0c\xc8\x35\xd9\x1d\xc8\xc8\x1a\x38\xb7\x21\xc2\x28\xa5\x42\xf6\x8d\xcb\x68\x59\xf8\x4c\x5e\xee\x6d\x00\x72\x3f\x0b\x45\x44\xc8\x39\x21\x0a\xa1\xe9\x0c\xba\xea\x3b\xae\x4b\x53\xd5\x87\x8b\x66\x86\x3f\x45\x08\x2a\x7f\xbe\xcf\xf7\x6f\x4b\xda\x64\x26\xeb\x8d\x49\x2c\xbb\x7d\x3b\xca\x96\x2c\x4a\xed\xa0\x3e\xd4\xf4\xee\x54\xaa\xc9\x0d\x4e\x17\xb0\x71\x10\x99\xce\x68\xfb\x3f\xff\xcf\xff\xf9\xeb\x84\xf5\xe7\xf2\x2d\x97\x53\xd6\x70\xe0\x41\x92\xe9\x31\xaf\xf2\x6f\xfe\x77\x69\x13\x44\xe0\x2b\xea\xbe\x1e\xf7\x83\x60\x00\xf0\x40\x59\x03\xe9\xcf\xea\xa4\xb1\xb7\xfc\x79\x98\x58\x0d\x0d\x8b\x0c\x58\x39\x09\xa0\x9b\xd3\xe7\x64\xd7\xf8\x07\x05\x86\xc0\x43\x47\x09\xe7\x8a\x69\x68\xd5\x1e\x92\x7c\x7e\x5e\xf1\x10\xa5\x47\x5b\x5d\xf4\x53\x78\x14\x85\xe4\x52\x38\x14\xa9\xab\x4e\x9d\xac\xaf\xbe\xa5\x51\x54\x94\x59\x63\x7b\xaa\xcb\x5d\x8d\xff\x4b\x84\x70\xbb\xa3\x0d\xcd\xce\x7a\x8e\x0b\x45\x4b\xc3\xb7\x6e\x53\xaa\x5e\xa1\xdb\x99\xc6\x5f\x91\x73\x40\xe1\xb0\x22\x8b\xaf\x8f\xb3\xb3\xe3\xd0\xca\x3e\x97\xf8\xf1\x65\x54\x5d\xff\x73\xc3\x84\xc7\x71\x4c\x4f\x68\xba\x8f\x52\x8f\x23\x7c\xbe\x41\x9a\x22\xf4\xaf\x30\xb8\x0f\x63\x02\xd0\xe9\x25\x93\xd0\x58\xb7\xd5\xa3\x81\x9f\xf0\xe3\x5c\x42\x1d\x78\xc2\x13\x67\x2c\x16\x15\x68\x62\xa5\xfa\xa9\x67\xca\x93\x24\x20\x04\xac\xaf\x9e\x5e\x3f\x7d\x5b\x6d\xb6\x8f\xab\x3e\x3a\xc7\x93\x0c\x2d\xa9\xc1\x4d\x35\x40\x48\x81\x27\x42\x31\x57\xf6\x6a\xd3\xb4\x45\x9f\x66\xbc\x10\x95\x77\xc9\x7f\xe0\x89\x34\xe4\xdd\x5b\x07\xc6\x01\xf5\xdd\xb1\x54\x59\xe7\x66\x73\x2a\x5f\x6c\xcf\x8d\xb9\x5a\xa7\xcf\x9d\x09\xce\x7a\x20\xd6\xc0\x9e\x74\x47\x25\x5f\xbe\x0d\xa8\x20\xea\x01\xc7\xdd\xa2\xd4\x1f\x12\x10\x11\x64\xd3\x1a\x7d\xdb\xfa\xd4\xb4\x1b\xf5\xeb\xde\x82\x2c\x65\x44\xed\x55\xe5\xa5\x74\x73\xdc\x5f\x12\x04\x90\x55\xf2\xe3\xad\x69\x27\xbf\x1b\xcb\x29\x3c\x30\x16\x4e\x07\x83\x0c\x32\xaf\x08\x40\x5f\x74\x28\x97\x07\x2e\xd1\xd2\x2a\xe4\x65\x67\x42\xe5\xdf\xf1\x8c\x74\x1b\xb8\xca\x18\xed\x9b\x9b\xd5\xe2\x76\x0a\x3a\xbe\xfc\x0e\xca\xd5\xc2\x83\xd6\xdf\x8e\xe6\x57\x43\xfa\xec\xef\x6c\xfe\xeb\xd8\xc2\xe6\xd4\x58\x53\x06\xb8\x96\x9c\x3c\xbd\x7e\x61\xba\x39\x7d\xde\x8c\x3e\x35\x46\x41\x18\x8f\x84\x6f\x2e\x2f\x0a\xc8\x13\xaa\x9f\x3f\xd6\xb8\x2f\xa1\x6c\x5f\xaa\x32\xc7\x26\xc7\xfe\x33\x62\x0a\x64\x96\xfb\x7d\x94\x68\xfb\x28\x80\xdc\xb7\x00\xee\x29\xfa\xbf\x96\x1a\xeb\x6e\x79\x3c\x79\x28\xc7\x34\xe4\xc0\x92\xf3\x3c\xd2\xb5\xff\x77\xce\xcc\x14\xda\x02\xdc\x48\x96\xb8\xec\xef\x28\xa2\x39\x7d\x29\x23\x7b\x9a\xc2\x5e\xd4\xfc\xe3\x6a\x35\x17\x70\x83\x19\xe5\x7a\x0e\xd6\xaa\x1f\x63\x00\x20\x0e\x62\xc9\x1d\xf9\xc4\xe2\xd4\x76\xbd\x3c\xb2\x0b\xa7\x17\x8a\x19\xe7\xa4\x2a\x85\x4d\xeb\x8d\xc3\x6b\xa8\x7f\x88\x99\x30\x64\x30\x0d\x45\xef\xab\xb2\xc5\xfa\x58\xe7\x7d\xd4\x34\x66\x3a\x30\x7d\x90\x97\xc8\x63\xd7\xe5\x84\x46\x13\x62\x86\x19\x31\x94\xec\xda\xfc\x30\xb1\x8f\xe2\x50\x30\x02\x47\xfe\x9e\x97\xfb\x53\x5e\xfe\x5e\x57\x1f\xbd\x79\x15\x47\x51\x42\xb8\xf5\x2f\x35\x94\x73\xc6\x91\xcb\xc3\x3a\x8e\x32\x4b\xb9\x65\xc9\x7e\x5f\x88\x2c\xac\xe8\x56\xca\xda\xa3\x1c\x20\x8e\x54\x44\xe0\x91\xde\x20\x6d\xee\xab\x42\x63\xfd\x38\xae\xd2\xbe\x68\x0b\xc4\x91\x09\x29\xcd\x57\x56\xe4\x5a\xf8\x2b\xf2\x18\xd0\x25\xe2\x6c\x2c\xd7\x49\x56\x0e\x00\x4f\x88\x79\x2a\x1c\x9f\x4b\xa9\x5d\xe1\xd5\xa2\xd4\xc3\x33\xf4\xed\x74\xe2\x78\xfe\x54\x55\x6b\xab\x43\x36\xdb\x6e\xe3\x58\x06\x84\x6c\xdc\x14\x98\x1f\xcb\xbc\xfe\x18\x65\x59\x21\x8e\x75\x44\xc6\x7d\xde\x8c\x08\xc5\x20\x4e\x62\x46\xe1\xfb\xd5\xe3\x7a\xb3\x59\x3f\x3f\xed\xee\x9e\x5f\x77\x2f\xaf\xab\xcd\xe2\x61\xd5\xb7\x91\xa1\x47\x1e\x59\x92\xd2\x3f\xa0\x5e\x77\x5f\xdc\xc0\x0c\xee\x02\x71\xa2\x80\x72\x60\x05\x34\xe3\xb2\x02\x88\x13\xa7\x23\x51\xc0\xfe\x16\x4d\x5d\x35\xc3\x23\x60\x46\xb8\xfa\x9d\x35\xd1\xad\x50\xef\x6d\x09\x13\x2b\x3d\x4e\x4c\x64\x25\x91\x4f\x75\x49\x89\xb5\x8b\xe6\x52\x9c\x18\x24\x47\x93\x40\xdd\x3e\xf7\x79\xf9\xb3\xa5\x81\x7d\xad\xf5\xed\xef\xfe\x51\xb2\xd8\xb2\x7c\xde\x54\xfb\x63\x5e\x8c\x09\x1f\x20\x16\xcc\x82\x99\x6d\x7e\xb6\xb3\xc8\x1d\x0b\xa4\x3f\x1e\x29\x4b\xed\x5f\xe3\x2e\x57\x97\x55\xd9\x20\x16\x28\x89\x6c\xc0\xa9\xf2\x38\xd5\xd9\xb1\x3d\x14\x43\x92\x51\x78\xb4\xce\xd5\x1b\xed\x16\x57\x49\xe7\x20\x96\x68\x95\xa3\x7a\xba\x81\x5b\x24\x38\xfd\xe0\x9f\xc6\x8a\x09\xe5\x52\xd9\x7f\x20\xbe\x3f\x55\xfd\x01\x11\x58\x6d\xdb\x43\x5e\xb6\x33\x6f\x7a\xfa\xc7\x9f\xa0\x80\x7a\x67\xae\x5d\x74\x47\x48\xc4\xf3\x72\x64\x88\x95\x89\xe9\xa3\xfd\x75\x82\xba\xc5\x3a\xf2\xb7\xd6\x19\xa3\x4f\x6e\x08\xc7\x37\xad\x65\x87\x58\x6b\x4d\x70\x4a\x3c\x60\xbd\xc7\x52\x7d\x2e\x4a\x7d\x9f\x6b\x8d\x25\xd1\xb2\xed\xf7\x7d\x80\x26\xd6\xda\x96\xf2\xf6\x4d\x9d\xb0\xdc\x6c\x70\xf4\x73\xc4\xc8\xc8\xaa\xa8\xd8\xe8\xdf\x1d\xe2\x59\x08\x22\x09\x78\x60\xf5\x28\x6d\x4d\xc3\x88\xf4\x7a\x66\x79\x25\x41\x16\xe9\x21\x25\x4f\xbb\x4c\xb7\xc0\x8c\x2a\xf8\x20\x09\x04\xb3\x60\xa4\x6e\x21\xfc\x5a\xe6\x7f\x9d\x70\xa2\x8d\x0e\x09\x8b\x33\x93\x7a\x16\xc3\x0d\xb6\x6d\x41\x20\x30\x57\x0c\xde\xb7\x82\x90\x94\x03\x9f\xf0\xe3\xf7\xea\x02\x65\xeb\x3f\xc4\xff\x4e\x87\x63\xc2\x64\x98\xe8\x5e\x76\x67\xf9\x4c\x55\x3a\xdb\x8f\xaa\xbf\xab\x94\x64\x01\x5b\x39\xa0\x76\x1c\x43\x22\x81\xe7\x29\x5a\x7b\xde\xdd\x09\xd3\x16\xbb\x69\x97\x8d\xb1\xd8\x00\x24\x61\x22\x6d\x45\x9f\x31\xb4\x30\x7a\x32\xe8\xe9\x03\x86\x19\xf3\x58\x1c\xcb\x73\x54\x9a\xaa\xef\x93\x10\x45\x5f\xa7\xb1\x2f\xab\x1a\x7b\x04\x77\x33\x2e\x06\xa9\xaa\xa2\x7f\xa2\xd0\x68\x22\x50\x7c\xfa\xb6\xbd\x5a\x0b\x3a\x7d\x82\x38\xc8\x14\xf6\xa1\x93\x65\x55\x15\xe4\x37\xcf\x1a\x45\x4a\x58\xba\xa8\xf6\x8b\xad\xcf\x9f\x37\xe0\x40\x60\xb1\xc2\x8a\x64\xba\x19\xe4\x31\x37\x43\x0e\x36\x89\x75\x46\xce\xce\xa9\x21\xd1\x84\x76\x16\x49\x4b\x92\x50\xd2\xde\xb8\x79\x7e\x58\xfb\x10\x7e\x92\xc4\x31\xd1\xec\x7e\xff\x95\xe8\x36\x24\x69\x60\x51\xa6\xb7\xf8\xe3\x57\xf0\xbd\x6b\x57\xe0\xb1\xd3\x93\xb1\xd3\x76\xac\x26\x08\x49\xaa\x62\xee\x92\x3b\x1b\xf5\x86\x07\x20\x2a\x96\xbc\xfd\x3c\x27\xb3\x82\x24\x35\x96\xd0\xb8\x73\xd0\xaa\x93\xdb\x5d\xae\x71\xd1\xf6\xe7\x70\xcf\x95\x6e\x07\x54\x73\x09\x78\x09\x49\xc6\x0d\x71\xca\xac\xda\xb7\xc7\xa6\xc7\x57\x24\x99\xb0\x68\x57\x5b\x29\x32\x62\x90\x87\x24\x03\x8c\xc6\xd1\xff\x17\x28\x40\xe7\xe5\x19\x20\xdb\x35\x17\x21\xf3\x62\xc7\xb6\x7a\xc0\xef\x0b\xb3\x4f\x2f\x44\x40\x1e\x3c\x91\xb3\x64\xa3\x12\x3e\x48\x84\xb1\xf6\x1e\xa9\x25\xb4\xa7\x02\xf2\x1a\x77\xcb\xea\x70\x6c\x71\xc7\x7c\x23\x88\x62\xab\xea\x54\x20\xd4\x17\x31\x3f\x09\x64\x32\x71\x8f\xf2\x58\x95\xed\xdb\xaf\xb8\x77\x21\x91\xcc\xd2\x14\xec\xb1\xbd\xb9\x42\x2b\x03\x89\x4c\x32\x0a\x6d\x7a\x68\x12\xf1\xda\xcd\x8d\xd6\x44\x0a\x89\xbe\x2c\xe1\x63\x5b\x79\xe3\xb6\xdb\xa4\x27\x2a\xbd\x90\x48\x95\xc5\xe0\x79\x02\x5a\xac\x29\xeb\x38\x7b\x15\x15\x84\x94\x88\x6f\xc0\xe0\x60\x27\x47\x67\xad\x64\x98\x8c\x00\xb8\xae\x9c\xa2\xe9\x6c\xab\x0b\x61\x0a\x77\x96\x0e\x35\x71\x97\x3d\x2e\xb6\xcf\x5f\xfd\x43\xe9\x48\x90\x35\xfb\x80\xf0\xde\xff\x26\x05\x05\x90\x2c\xe4\xf5\xcc\x0a\x77\xad\x30\x00\xcb\x16\x92\x3b\x9d\x93\x6b\xb0\xbb\xd9\x63\x20\x06\xa4\x63\xbc\x73\xe8\xab\xee\x35\x27\x6b\x63\x1a\x88\x94\xd6\x1c\x2a\x4d\x1c\x7a\xa1\xd9\xd7\xd5\x3c\xb4\x9e\xb2\x2c\xa0\x0e\x6b\x11\x0e\x4e\x92\xec\xd8\xef\x69\xbb\x03\xfc\xf0\x17\x0d\x11\x68\xde\xd2\x82\x3b\xdb\xca\xd2\x28\x4b\x28\x40\xde\x7c\x20\x5e\xae\x3c\x80\x34\x12\x19\xa6\xbd\x7c\x31\x65\x3a\x5e\xd1\xac\x4b\x55\x1d\x2e\x33\xca\x43\xca\x25\xa7\xba\x45\xd4\x79\xbb\x38\xe6\x57\x77\xad\xb1\xa9\x97\x72\x44\x92\x09\xb2\x03\xea\x02\xde\xd8\xb7\x33\xb6\x12\xcd\xcf\xd7\x39\x49\x21\xa4\x71\x96\x84\xb1\xa7\xfd\xaf\xef\xd8\xba\x6c\xef\xc2\xee\x5f\xe1\xd7\xbc\xfb\xa7\xdf\xbf\xce\x73\x1d\x43\xcf\xc4\xc6\x2e\x77\x9d\x1b\x55\xcb\xbc\xc5\xfa\x1a\xfd\x0a\xa4\x89\xd0\x91\xa3\x21\xc8\xcb\xfd\x16\xea\x7d\x6f\x80\xa7\x09\x24\x54\xd7\xfd\x31\x48\x84\xfb\xc4\xbb\x67\x49\xf3\x2d\xb5\x20\xfb\x47\x9e\x3e\xb7\xa4\x79\xf0\xdb\x25\xa3\xec\x27\x96\x5a\x9a\xc6\x40\xa4\x7f\xaf\x79\xf3\x4e\x0b\x8e\xfd\xdc\x2c\xcc\xfc\x46\x98\xa6\x12\xac\xc6\x74\x75\x38\x42\xf9\x39\xaa\x79\x87\x34\x93\xa9\x91\x33\x34\xb4\x47\x85\xaf\x28\x08\x37\x00\xaa\xd2\xcc\xc4\x38\x18\x41\x8e\x97\x6e\x5a\xf0\x32\x97\x99\x84\x14\x52\xa4\xf0\xcb\x6a\x7b\xbf\x7b\x59\xbd\xee\x1e\x16\xaf\xde\xdd\x48\x21\x33\x64\xc2\xdf\xff\xfb\xce\xff\xa4\xc2\x40\xa7\xbe\x8e\xca\x16\x21\x10\x0f\xf4\xf4\xa2\x2a\x04\x87\x68\xfb\x74\xc2\x9c\x97\x69\x1e\xfa\xe6\x92\x1e\xfc\x08\x9f\xdd\xfe\xfb\x53\x2b\x20\x55\xa1\x26\x43\xe9\x0d\x1a\x62\x7c\x3b\x1e\x0b\x2f\x41\x56\x57\x87\x4d\x75\xaa\xd5\xb5\x39\xa0\x92\x48\xc5\x23\x82\xa5\x9e\x72\xd6\x1f\x57\x56\xd9\xef\x15\x0f\x70\x5c\x1f\x8e\x55\x3d\x44\x70\x52\xcd\x42\x6e\xe5\xbc\x9b\xb6\xae\x3e\x27\x41\x1c\xd7\x04\xa3\x80\x0c\x29\x3b\xf7\x9b\x61\xc4\x61\x6c\x15\x4b\x40\x6b\xc2\xcb\xf5\x34\x97\xd9\xe5\x85\x29\x45\x1d\xd0\x6c\x7d\x5c\xfc\x67\x77\xb3\xbe\xdd\xdd\xbd\x2e\x96\xbb\xed\xf3\x4b\x7f\x41\x13\x11\x55\xd4\x2f\x98\xac\x36\x70\x20\x62\xca\xb5\xf6\x7b\x58\x6a\x18\xa3\x6f\xfa\x8a\x6d\x9d\xa3\xaf\x64\xf4\x07\x33\x0b\x97\x38\xd6\xb8\xc4\xb2\xa9\xea\x11\x6e\x20\x0b\x32\x20\x54\xcd\x9f\x50\xc3\x5f\xbf\xf9\x1f\x45\x40\x3c\x23\xdd\xdb\x76\x33\x79\x1e\xa9\xf2\xcd\xb4\xa0\xaa\xa6\xbc\x71\xa5\x43\x63\x4b\x25\x0b\xb4\x21\x8f\x3f\x6f\xee\xf2\xba\x69\x6f\x40\xef\x71\x35\xd3\x5c\x80\x8c\xf1\x44\x3b\x0c\x2f\xe1\x9f\x5f\x6a\x5c\x2f\x9f\x7f\xeb\x8f\x2a\x1b\x22\xfd\x9c\x55\xcd\x40\x16\xa6\x28\x85\x97\x89\x55\x95\xd5\x7b\x99\x8c\x8c\x2c\x84\x80\x16\xb0\xc7\xf5\x66\xeb\x15\x6b\x20\x8b\x34\x27\xaa\xae\xce\xd3\x7d\xfc\x6c\xdf\x3a\xdf\xef\x6a\x15\x36\x64\x89\x13\xe6\xfd\xdf\x53\xfd\xf9\x5c\x16\x79\x89\x63\x78\x35\x64\x49\x1a\x52\x2e\xe5\x76\xfd\xe4\xc8\xbb\x66\x36\x76\x96\x32\x65\x59\xd0\xeb\xaa\x81\xbc\xfe\x56\x9d\xd4\x1b\xd6\xcd\x98\x80\x03\xb2\x94\x07\xd9\xc0\x16\xd8\x6d\xdf\x63\xef\x7f\x3a\xe4\xb3\x34\x4b\xa3\xa1\xc6\xe4\x4c\xe2\xcf\xdb\xe6\xd1\xe5\x4a\x6d\xc8\x52\xb0\x7d\x47\x0a\x6d\x17\xeb\xaf\x67\x9d\x90\xca\x98\xe6\x98\x86\xbc\xf8\x24\x8c\xd7\xb0\x69\xfb\x26\x3a\xa3\xc0\xfa\x1b\x34\x0f\xb9\xc2\xb2\xc1\x2d\xd6\x87\x99\xf3\x9d\x65\xcc\x46\x40\xf3\xc6\xc9\xac\xcc\x0e\x2b\x2b\x2d\x00\x5a\x7f\xc3\xc6\x95\x00\xc8\xeb\xfc\x4e\xb3\xc7\xcc\x14\x37\x38\x64\xe4\x9d\x47\xa3\xf1\xc7\xaf\x80\xca\x99\x08\x12\x52\x49\x29\xaa\xbd\x2f\xcb\xfd\x96\xc3\x5d\x0e\xe7\xb2\x45\xd3\x27\x16\xa1\x65\xc8\xf3\x1e\x5c\xb7\x79\x8d\x8c\x6c\xdf\x4a\x46\x5e\x63\x6f\xa7\xaa\xc3\x01\x4a\xed\x0b\xbc\xa6\x0d\x21\xb0\x91\xec\x9d\x0c\x7f\xbb\x94\xaa\xcd\x24\xb7\xec\x4d\x8f\xa8\x73\xb8\xa9\x2b\xd0\x0a\xfa\x58\x4f\x26\x63\x26\x33\xaf\x95\xaf\xbf\xc0\xb5\x41\x2d\x53\x4d\xb5\x63\xcb\xc5\xb6\x3f\x35\x45\x92\xc8\xe8\xf7\xcf\x9d\x05\x41\xf6\x23\x54\x0a\x9b\x08\x5b\x6d\xef\x87\x93\xa4\xa6\x15\x6d\xfb\x06\xe5\x5b\xf9\x7d\x1c\xd0\xc9\xa4\xc9\x28\x47\x47\x64\x45\xde\xcc\xb8\xac\x01\x37\xad\x46\x86\x4c\xc5\x56\xf6\xc0\x3e\xc1\xb6\x86\x91\x69\x9d\xa9\x4c\x51\x49\xbe\x2d\xa0\x1f\x50\xb7\x99\xd2\x69\xe6\xa3\xbb\xa7\xba\xac\xbe\x77\xb7\xbb\xd2\x01\x18\x06\x61\x36\x29\x40\xe8\x9e\x50\xbd\xcd\x97\x27\x8c\x04\x65\x83\x77\xa7\xb2\xb3\x98\x57\xa5\xaa\xb4\x4d\x45\xae\xf5\x6f\x93\xb0\xbc\x3f\x21\x0e\x3d\xef\xec\xee\x58\x7d\xcc\x41\x00\x19\xc6\x60\x55\x9f\xde\x60\x59\x1d\x0e\xf9\x7c\x00\xa0\xc6\xcc\x4d\xa3\x5f\x2a\x29\x41\x66\x98\xf1\x06\x98\xf3\x5c\x36\x2e\xac\x62\x03\xbe\xf3\xb1\x3b\xb6\x03\x33\x13\xcb\xd4\x31\xd2\xfe\xe7\x65\xe1\x74\xd7\xed\x31\x11\xc4\x9c\x0a\xfe\xed\x0a\xb3\x3e\x9e\xf5\xe3\xbf\x7e\x02\x9b\x10\x61\xa2\x29\x86\x7c\x00\xbb\xb6\x8e\xd9\xbc\x41\x44\x11\x7a\xb5\x98\xcd\xc1\x2b\x4b\x74\x8e\xee\x79\x52\x4d\x44\xda\x52\xd9\x12\x33\xad\xb5\xd4\xf1\x63\x50\xb0\x18\x37\x94\x7a\xe0\x48\x9b\xc0\xa4\xa7\x5f\x40\xf0\x24\xa2\x2f\x44\x1c\xfb\xd7\x4a\x59\x86\x0b\xc7\x71\x46\xd4\x39\xb9\xaf\x1e\x24\x6b\x92\x04\x56\x2f\x07\xfb\x45\x9c\x8a\x70\x00\xee\xf4\x28\x98\xd9\x63\xc4\xa9\x95\x41\x57\xca\x95\xae\x8f\xf8\x4e\x40\xc4\x60\x09\xc1\x8e\x39\x0e\x3f\x59\xd9\x81\x27\xfc\x78\xa9\x5a\x2c\xdb\xdc\x95\x8a\x5e\xde\x24\x44\x6c\x2c\x52\xbf\xc1\xf6\xfe\xfe\xf5\x22\x6e\x48\x24\x18\x52\xba\x74\xb9\xdd\x8e\x45\xda\x41\xa4\x11\x52\x90\x4e\x56\x75\x5d\x5d\xec\xf0\x54\x3b\xc2\x75\x22\x0e\xc6\x16\x34\xb4\x30\x27\xc0\xbf\xe4\x7f\x88\x2c\xb2\x09\xd5\xdf\x4f\x45\x75\x1a\x4d\x60\x91\x81\x70\x34\xef\x65\xd0\x75\xf0\x72\x3c\x6a\x32\x25\xc9\x50\xe8\x0e\x4c\x0c\x0d\x91\x69\x54\xce\x83\x58\xd9\x52\xd8\xa6\x7d\x36\x2b\x50\x6f\x17\xcc\x39\x21\xc2\x80\x62\x66\x2e\xa4\xd9\x27\x8b\xfc\xd5\x04\x00\xe5\x0c\x77\x8d\xa5\x3c\x98\x79\xa5\x42\xa0\xa0\x9e\xf1\xa5\xdc\x9a\x62\x7a\xcd\xfc\x2e\x46\x65\x69\xef\x61\xbe\x75\x0b\x55\x4f\xe6\xba\x1c\x34\x9e\x9e\x2f\x6b\xa9\x82\x90\xa1\x24\x66\xe3\x9d\xc9\x8b\x62\x09\xb5\xde\x58\x86\xaa\xa9\x79\x79\x89\xda\xc1\x5f\x20\x8a\xa1\xe7\xfc\x72\x20\x99\xa1\x74\x4a\x48\x1e\x24\x16\xb0\xd4\xf7\xbe\xcc\x02\x72\x8b\x96\x6f\x50\xef\xbb\xcf\x32\x8b\x1b\x0b\x09\xb6\x12\x62\x24\x14\xfb\x2b\xbc\xf9\xcf\x71\xe8\x42\xca\x20\x04\x0f\xde\x23\x60\xae\xa9\xae\x4c\x2a\xc5\x45\x2a\xfd\xfb\xdc\x9c\xca\x32\xc7\xc6\xda\xc7\xfd\x38\x50\x49\x94\xf8\x84\xdc\x5f\xa7\xdc\x74\x7b\x7f\xd3\xe6\xed\xa9\x25\x2d\xa8\x85\x9e\xaf\x04\x4a\x46\xb4\x97\xbe\x9d\x4a\x5d\xa3\x9e\x94\x5c\x77\x47\x21\xf2\xe4\xf2\x35\xa1\xe0\x77\x95\xd9\xed\x7d\xa1\x59\xe6\x9b\x99\xd0\x55\xab\x53\x1a\x4e\xe6\x7d\x98\x41\x68\x66\x28\x94\x76\xb2\x61\x69\xe7\x68\xfa\x8c\xa5\xd0\x51\x16\x09\xcf\xee\x75\x2a\xfb\x7a\xf5\xe9\x43\x6a\x6e\x35\x60\x7b\x01\xcb\x33\xf4\x99\xd0\x89\x24\x4b\xfb\xcb\xea\xbf\xd6\xfd\xbd\x53\x91\x79\x55\x7a\xc2\xd3\xdd\x60\xeb\xcc\xf4\xd9\x0d\x30\xb0\x0b\x9c\x27\x9d\xa2\xc5\xa8\x7f\x07\xcc\x92\x94\xf5\xfd\x9e\xf7\xbf\x9b\x0c\xb8\x93\x38\xdb\xc9\xf3\x9a\x00\x61\x24\x23\x57\xfd\xed\x74\x80\x32\xff\x6b\xb2\xb8\x18\xc5\x1d\x13\xce\x11\xe7\xb1\x90\xcb\x30\x1d\x61\x8c\x24\x88\x53\x8f\xc2\x99\xd1\x99\xf4\x0e\x0d\x04\x81\xd5\x49\xde\x7b\xbf\x60\xfa\x60\x10\x64\x09\xcd\xdf\x43\x5e\x7a\x49\x91\x9f\xd9\xff\x10\x18\x0d\xda\xb5\xbf\x54\x08\x06\x2c\xe0\x91\x03\x4e\xfa\x69\x31\x51\x81\x06\x60\x1c\x2c\xa1\x61\x6f\x04\xcd\x49\x30\x4f\x67\x38\x30\x60\x02\x4d\x3a\xe5\x23\xf8\xbf\x27\xac\x3f\x7b\x9a\xb2\xe9\x63\x86\x2a\xcc\x02\xbb\x99\x8f\x21\xbd\x2c\xbc\x5a\x94\xe9\x4e\x8c\x98\xa2\x41\x4a\xce\xd7\xeb\x7a\xb9\xca\xfc\x63\x47\x51\x9a\x3a\xe6\xab\xc7\x66\x7f\xe9\xa6\x51\x1c\x50\x54\xeb\xe5\x75\xb5\x5b\xbe\x3e\xff\x71\xbb\x59\x3c\xac\x76\xb7\x5f\x5f\x17\x83\x02\x00\x00\x8f\xac\xcc\xc5\x1e\xdb\x27\xf9\x52\x57\xff\x8b\xaa\x6d\x26\xd9\x47\xe0\x18\x12\x47\xa6\x8d\x53\x3f\x2f\xe7\x5b\xf7\x74\x34\x00\xc7\x88\x39\xb3\xc7\x73\x81\x5c\x7a\xbc\x98\x73\x4f\xad\xfc\x9f\xe5\x4b\x71\xda\xcf\x8b\xe4\x20\x96\xa1\x1a\x04\x6b\x2e\xab\xd5\x00\x24\x98\x50\x71\xba\x03\x5a\x75\x8e\xdb\xbc\x85\x61\xd2\x2d\x8d\x5f\x0b\x2b\xdc\xf9\x7c\x6a\x29\x70\x37\x71\x17\x20\xd5\x82\x86\xfe\xed\xf3\x72\xe9\xfb\x27\x63\xd6\x1e\xca\x7f\x60\xd9\xb9\xfe\xfe\x77\xc1\xf8\x88\x83\x7e\xad\x11\xe6\xdd\xf1\xdf\xff\x33\x1d\x8a\x82\x9b\x51\xf6\xf3\x6b\xe3\x02\xb7\xb4\xb4\x11\xe2\xee\xac\xaa\x06\x44\x62\x22\x5b\x80\x50\x14\xa8\x48\xae\x45\x8d\x69\x1f\x00\x44\x9a\x59\xfe\xc7\x9a\x88\x67\x67\x3d\x28\xb2\xc4\xf3\xce\xe4\x87\xd3\x61\x5c\x32\x45\x1b\x63\xd8\x5f\x46\xd8\x52\xf8\x75\x43\xa4\xf1\x03\xa7\x2f\x00\xc4\x31\xb1\xca\xbd\xd4\x55\x4b\x80\xb2\xc5\x31\x9f\xdd\xa6\x9b\x0f\xe9\xc4\x5e\xa7\x0d\x63\x35\x01\x83\x83\xcc\x18\x73\x1f\xfc\xe1\x79\xd9\x19\x24\xf3\xb2\xc2\x2b\xd9\xbc\x4b\x96\x1f\x48\x19\x27\xc6\xe7\xe5\x49\x10\x76\x3d\x2e\x03\x03\x89\x69\x30\xd7\x38\xbe\xab\xea\x8b\x96\x16\x48\x63\x3c\xd7\xe0\xcb\xb7\xd5\xe5\x34\x17\xa8\xc0\x10\x0c\xa1\xaf\x8f\x80\xe6\x6c\xb5\x07\xc5\x52\xd2\xa5\x76\x0a\xa1\xcf\x5e\x65\x65\x36\xd2\x54\xc2\x28\x79\x47\xa0\xcb\x91\x5c\x16\x80\x36\x8e\xb2\xc5\x95\x5e\x7e\xf5\xdb\x53\x33\xde\xd8\x00\x59\xa4\xe4\xb8\x6e\xfc\xe6\xf3\xeb\xe6\x76\xf6\x30\xc8\x6c\x09\xaa\x4f\x61\xf4\x4f\xd3\x6b\xa0\x0d\x6e\x1d\x20\x8f\x69\x24\x15\xd0\x58\x3e\x4b\x62\x88\x3a\x16\x79\x1f\x9b\x05\x13\x08\x60\xde\x8c\xa7\xc5\xd9\x5a\xf3\xb6\x53\xfb\x56\x89\xb0\x1c\x69\x44\x04\xec\x88\x85\x2d\xfa\xe5\x27\xc0\x35\x30\x68\x88\xba\x72\xbd\xfd\x99\x18\x3f\xc8\x20\xce\x68\x36\xbb\xc9\x80\x93\x6b\xfa\xb7\x91\x8c\x65\x64\x28\x36\xf9\x7e\xee\x41\x5c\xba\x28\x83\x58\xdb\xc4\x5d\x71\x56\x3a\x35\x5a\xf7\x25\xd3\x49\xc6\xfa\x7c\xe8\x5d\x5d\x1d\xce\x8a\x71\x5d\xcb\x90\x19\x8a\x42\x7b\x8e\x43\xca\x18\xbb\x63\x51\x80\xc2\x87\x12\x77\x14\x60\xde\xbc\x55\xa7\x42\xdf\x60\xd4\xa7\x53\xc8\xe1\x68\x6e\x3e\x59\x10\xf4\xa7\xc5\x99\xad\xac\xca\xf7\xb2\x1a\xf3\x7e\x82\x8c\x30\x72\x25\xed\xdd\x73\xfd\x3e\xe2\x44\x9e\x3e\x15\x0f\x43\xfa\x82\xa0\xf5\xea\x70\x2c\xaa\x4f\xbc\x46\x16\x75\xa9\x97\x78\x9a\x48\x37\xe7\x6e\xf1\x3b\x16\xd5\x71\xce\x1a\x05\x92\x8b\x2c\xb5\x61\xc7\x0d\x09\x83\xb5\x96\x47\xe8\x78\xc1\xf1\xf0\x67\x28\x20\xa7\xba\x7b\x61\x5b\x76\x38\x19\x18\x92\x6b\x2b\x7a\xfb\x02\xc7\xcf\xfa\xd4\x78\xe6\xb6\xe9\x45\xe2\x90\x85\xd2\x25\x82\xc6\xe1\x7c\x19\x1b\xa5\xdc\x6e\xb4\xfd\x3c\x4e\x77\xa2\xe9\x08\x94\x49\x14\x65\xc1\xd4\x84\x3e\x17\x18\xbc\xdc\xaf\xa9\xb1\x6a\x0a\x44\x55\xbc\xc1\xb6\xcd\xcb\xbd\x9b\xb0\xff\x18\x40\xf8\xff\x09\xbc\x20\xb3\xc0\x52\xcd\xa9\xaa\x6c\xf3\xf2\x84\xeb\xad\x8f\xcb\xca\x2c\xb2\x15\x35\x4e\xe8\xad\x6c\x4e\x35\xd6\xc3\x4a\xe4\x5a\x89\xc0\x0e\x79\xfc\x41\xe9\x98\xe7\xf2\xda\x48\x06\x99\xd9\xa0\x08\x14\x8e\x28\x67\x88\xf7\x48\xd0\x32\x91\x93\x18\xc7\xc3\x44\x99\x60\xfa\xd0\x32\xb0\xda\xfa\x8f\xaf\xb7\x9b\x91\xde\xb1\xbf\x98\x92\x9c\xaa\x5c\x7c\x8c\x80\x96\xa1\x2f\x78\x56\xe7\x2e\xb5\x0c\x02\x87\x92\xec\xdc\xaf\x19\x48\xf2\x72\x46\xeb\xb2\xed\x2a\xb5\x89\xad\x8c\xa6\xe3\xc8\xee\x19\x0d\x24\x06\xc2\xaa\x96\x7b\x22\x1c\x90\x18\xc7\x84\x74\x78\x83\xe6\xed\x01\xcb\x7d\x8f\x5c\x20\x3c\x2a\x58\x5a\xf2\xce\xb0\xb8\x04\xec\x97\x98\x66\xe4\xc3\x1d\x4e\xc5\xb6\xb2\xa5\xbb\xbf\x4d\x1a\x98\x88\xbb\xc2\xad\xc2\x92\x9e\xfb\x35\x55\x05\x0c\xe9\x29\x37\xf7\x0b\xb2\xe6\xfe\xdc\x6c\x3d\x95\x0a\xa8\x40\x01\xb9\xa3\xf2\xf4\xf9\x2d\x87\x7f\x57\x6f\x50\xf6\x87\x90\xd1\x0e\x60\xa0\xcd\xf7\xa7\x49\x14\x43\x05\x88\xc4\xc0\x62\x87\x49\x67\x8f\xfc\xee\x35\x7f\x41\x31\xc8\x08\x54\xf1\x81\xf9\x2b\xe4\xcd\x04\xa2\xa8\x98\xb1\x25\x0d\xf6\xcc\xe2\x38\xa8\x21\xba\x06\x61\x9c\xd2\x77\x26\xc9\xb8\xe6\xed\xcc\x8d\x98\x6c\x86\x2a\x4c\x0d\x85\xe0\x73\xf7\xd9\xfb\xb7\x0e\x55\x92\x39\x9a\xa7\x41\x53\xd4\x1f\x8c\x38\x23\x0a\x85\xf2\x74\x78\xac\xf4\xa9\x18\x3a\x2b\x42\x20\x68\xbb\xc5\x0b\xae\xbe\x43\x71\x82\xde\xe6\x9e\x26\x0d\xaf\x82\x59\xdd\xa5\x38\xd7\xe4\xdf\x6d\x6f\xb6\xbb\xc7\xf5\x93\x17\x1e\x00\xc5\x91\x69\xaa\x62\xc1\x03\x4d\xac\x53\x8d\x4e\xab\xd9\x35\x48\xc0\x6e\x40\x79\xf3\x2c\x9b\x8a\xd4\xc2\xdd\x91\x34\x53\xf4\x56\xb7\x95\xa2\xdd\xc9\xfd\x9c\xb1\x90\x0a\x92\xb1\xb5\x91\x91\x11\x63\x26\x28\xc1\x24\x65\x9f\x4f\x25\x45\x57\xa6\xd6\x84\x12\x29\xd2\x0c\xed\xa3\xc3\xb7\x30\x96\xa8\x00\x25\x0c\xf4\x2c\x33\x04\xe9\x1e\x81\xb4\x94\x14\x82\x2c\x5c\x2a\x00\x9b\x0e\x59\x85\x2c\x8d\x42\x97\x8e\x71\xec\x7c\xfe\x34\xe4\x8c\x02\x0e\xb6\xcc\x7d\x8b\x4d\x3b\x8a\x16\x29\x04\x20\x7e\xe6\x2f\x8e\xc9\xe3\x0b\x1c\x64\x81\xf5\xc0\x21\xa3\x8c\xe0\xda\x6d\x26\xdb\x1c\x6b\x92\x54\xf8\xe9\x92\xa7\x19\x67\x38\x60\xd3\xad\xbf\xbd\xb4\xcb\x5f\x73\x37\x72\x9d\xaf\x9e\x8e\x98\x78\x2d\x17\xa2\xb6\x33\x27\x8f\x45\xd5\x2c\xed\xd9\xd8\x1c\x51\xc1\x1d\x5a\xc4\xf9\xec\x22\x99\x2d\x9c\x94\xdd\xd2\xf4\x4c\x02\x6f\xcd\x4b\x5d\x1d\xf2\xa2\xff\xf4\x9a\xe9\xcc\xeb\x05\xdc\xa2\xec\x06\x74\xf7\x67\xb6\x51\xea\x30\x48\xf8\xa8\x44\x65\x93\x97\x0a\x5f\x11\xf4\xc8\xf6\xd6\xa1\x53\x2c\xfe\xfa\xb8\x9c\x44\x00\x75\x88\xe0\xf3\x39\x0e\xf6\x40\xba\x7a\x84\x64\xeb\xc3\x03\x3a\x34\x61\x26\x7c\x9c\xeb\x05\x6b\xc7\xc5\x7a\x39\xc2\xef\x02\x1f\x3a\x0a\x78\xea\x63\x07\xca\xe7\xf5\x96\x45\xd5\xa0\x1e\xd9\xd7\x9a\x27\xd2\x26\xea\xa2\xb0\xad\xee\xf1\x87\x23\x1e\x9c\x0c\x4c\xcd\x53\xab\xe6\x39\x08\xf3\x58\x50\xcc\x78\x23\xd2\x3c\x55\xc4\xfb\x79\x5b\xc3\x7e\xf8\x35\xd6\x29\xc5\xbf\xbd\x3d\xf4\x6c\x4c\xe3\xa3\x8e\x37\x9f\xcf\x3d\xe5\x84\x4e\xb2\x90\x28\xba\xee\x2b\x4a\x49\xdd\x3e\x6d\x66\x9f\x2c\xc9\x42\x30\x5e\x40\xe4\xf9\x8f\x61\x12\x6b\x01\x3d\xf1\xba\xcb\x99\x77\x13\x63\x12\x07\xd2\x42\x65\xe4\x84\x7e\xb1\x6c\x40\xcb\xaa\x24\xfe\xe9\xb1\x5d\xa4\x21\x48\x7c\xed\xe0\x14\xcd\xa0\x81\x09\x2a\x3d\xdc\x3e\xff\xbe\x7a\xda\xfd\xb1\x78\x78\x58\x6d\xfb\x63\x59\x00\xa1\xc7\xc4\x97\x25\xd6\xcd\xc3\xf0\x81\x65\x68\x49\xf9\x7b\x26\xfa\xd3\xbb\xcd\x98\x35\x23\x69\x76\xd0\x12\x62\xa0\x2f\x0c\x47\x3e\x1b\x5f\x3a\x8a\xc9\x0c\xff\xa3\xaa\xdf\xb1\x7e\xa9\xaa\xe2\xde\x53\xd2\x82\xd6\x98\x31\xe6\x2c\xd0\x70\x07\x5a\xe7\xe5\xde\x05\x64\x7c\x0b\x63\xc1\xa2\x47\xeb\x9c\xfa\x7a\xee\x43\x93\xff\xdd\x77\x3d\x86\x3c\xb1\x2c\x3b\xef\x38\x26\x93\x99\x3c\x08\x06\x51\x42\x05\xe3\xea\x0d\x8a\x02\xcb\x3d\x4e\x90\xfa\x18\x24\x8a\x42\x29\x9b\xc5\x1d\xf6\xfb\x29\x06\x90\xda\xb9\x5e\xe6\x7f\xcd\x3c\x15\x64\x99\x36\x3d\xb1\xac\x63\x6d\x7b\xa8\xd4\xfb\xed\xd9\x74\xed\x16\x69\x32\x72\x08\x4c\x78\x5e\x70\x84\x91\x44\xe9\x24\x45\x1d\x8b\xf7\x68\x8c\x23\x0f\x83\x00\x7a\x2a\xe6\xce\x60\xc9\x0b\xdc\x4f\x2b\x28\x91\xa7\x01\xb8\x40\x21\x81\xf9\x67\x4f\xc0\x53\xfb\x85\xca\xaa\xad\xea\xae\xef\x26\x27\xc7\x18\xd0\x6b\xd2\x22\xf0\x08\xe5\xe7\x34\xda\x35\x70\x2f\x8e\x2a\xcd\xc6\x90\x4e\x8c\x31\x4a\x43\x0f\x7e\x3b\xb5\x6f\x96\xac\x7f\xfa\x08\x49\x64\xe1\x1b\x72\xca\xe2\x85\x89\xc8\x1c\xab\x58\xa9\x67\x56\xb5\xbb\x4d\xdf\x50\x01\x8c\xc6\x77\xfd\xd9\xc3\x02\x1f\x7a\x9a\x54\xc0\x34\x91\x84\x98\x1b\xc9\x62\x9f\xe5\x1a\xce\xe1\x30\x98\x76\x53\x8c\xe8\x36\x3a\x97\x42\xbd\x3b\x2a\xb1\x6b\xb1\x47\x77\x56\x16\x49\xe2\xbd\xb9\x5d\x6f\x5e\x1e\x16\x7f\xee\x96\x0f\x8b\xcd\x66\xfd\x7f\xbf\x7a\x24\x0d\x66\xb1\xb4\xd6\x7c\x5b\xd5\xf8\x64\x6d\xf1\xff\x3e\x2b\xcc\x9f\x5f\x35\x63\x90\xb8\x84\xb1\x4f\x9b\xcc\x19\xaf\xff\x35\xd3\xdf\xbf\x56\xe3\x7c\xed\xef\x74\x76\x64\x8a\xd1\x7b\x8c\x8b\x25\x7b\x30\xf5\x65\x33\x1a\x45\x96\x28\x33\x52\x94\x2a\x1d\xe7\xdd\x2c\x1b\x82\xc0\x42\xf2\x41\x95\xaf\x01\x74\xe2\x21\x64\x57\x4f\x03\xea\x08\xa1\x49\xd0\x87\x92\xbb\xdd\x34\x2f\xf7\x93\xcc\x20\xca\xcc\x10\x64\x3e\x6f\x9e\xaa\x96\x84\x9e\x2f\x45\x5c\x51\xa2\xd4\x96\xdc\xdb\x2a\xd3\x7f\x0e\x46\x11\x2a\xcc\x64\x40\xf6\xff\xd3\xb6\x1a\x70\xbf\xa8\x79\x44\xd6\x42\x45\x26\x54\xe7\x12\x9f\xe6\x49\x1b\xc4\x80\xf3\x19\xc7\xb7\x07\x03\x78\xcb\x0f\x31\x82\x98\xf7\xa9\xe9\xc5\xf6\xb1\x27\x23\x76\x0d\x0c\xb3\x80\x16\x38\x1e\xb1\xd4\x76\x2d\xb0\x05\xf0\x53\x09\xf9\x59\x87\x1b\xc1\x48\x9b\x7c\x9b\x1f\xf0\x01\x4d\x7b\x83\xa6\xaa\xe7\x5c\xb1\x60\x98\x04\x25\x9c\x64\x70\x5d\xcd\xc2\x99\x86\xa9\x8c\xd2\xc1\x14\x86\x7d\x5c\x3f\xed\x6e\xbe\xfe\xe9\xcf\x0c\x95\xd5\xcf\x1f\x48\x53\xaa\x9f\xcb\x66\x75\xa7\xa0\x65\xaf\xa4\xca\x37\xd5\x8e\x2d\x74\x13\x6a\x46\x44\x5f\x45\xf7\x63\xe2\x7f\xe5\x02\x28\xbb\x46\x82\x1f\x90\x9f\x15\xc4\xb9\x66\x31\xcb\x48\xca\x76\x77\x26\xe0\x35\x8b\xd7\x5d\x0a\xcc\x99\x38\x8d\x7d\x30\x70\x43\xc4\xa6\x7d\xa8\x60\xd6\x1f\x89\x0a\x9d\x06\x73\x0b\xc5\x54\xa0\x03\x4c\x9a\x71\xca\xa7\x5a\x09\xe2\xd5\x77\x2c\xdb\x66\xf5\x63\x94\xd4\x72\xed\xb2\x10\x3c\x6f\x14\x01\x99\xbe\x96\x0d\x41\xc8\x88\x7e\xde\x5f\x4c\x18\x4b\xa8\x57\x23\xcc\xe2\x06\x06\x82\x4c\xba\xbd\xe4\xb6\xdb\x66\xcf\xb6\x10\x03\x3c\x91\xac\x0f\x24\xfa\xa1\x66\x20\x55\x09\x8c\x34\x48\x9b\x77\x6c\x2f\x97\xf1\x5f\xa2\xd2\x9d\xf5\x99\x54\x5a\x3b\xeb\x73\xe5\x8c\xb4\xb3\x12\x27\x23\x4d\x92\x88\x09\x57\xe2\x98\xb1\xb4\x7f\x30\x15\x25\xe4\x1b\x3f\x7f\x94\x23\x53\xd2\x28\xc3\x68\x6c\xf6\x1f\x75\x93\xef\x2f\x42\xbb\x8d\x76\x94\xb7\xae\x4c\x64\xad\x2a\x8a\x15\x8f\x74\x11\xc1\x98\x54\x70\x9b\x77\x71\xa5\xad\x9b\xcf\xa6\x45\xb7\xb3\xc8\x20\x08\x85\xd3\x02\x6b\x37\x58\x14\xbd\x0a\xc0\x44\x88\xcf\xb7\xcd\x4c\xe0\xfc\x00\x57\x0b\x79\x9e\x2d\x90\x41\xa0\x38\xa5\x44\xf7\x75\xf5\xe1\x1c\xa4\x66\x0c\xf5\x92\x01\x8b\x2c\x6b\x9f\x82\x42\x4d\xe4\xce\xfe\x35\xbd\x12\xcb\xa4\x72\xb4\x9d\x3e\x91\x71\x8b\x47\xbf\x16\xc9\x20\x64\xda\x12\x34\x81\xc1\x17\xf8\xbc\x54\x24\xe1\x5b\xc6\x9c\x96\x57\x99\xbb\x72\x3a\x2b\xd3\x60\x09\x3a\xc6\x86\xb0\x0c\x42\x95\x49\x47\xea\xd2\xad\xad\xdb\xff\x5c\x79\xb8\x88\xb3\x28\x19\x25\xf4\x1a\xff\x54\x51\x62\x95\xa5\x5e\x5e\x57\x3b\x5a\x40\x6e\x9e\x9f\xbe\x6e\x76\x2f\xab\xd7\xe5\xea\x69\xbb\xf8\xb2\xea\x1b\x66\x86\x24\x8c\x50\xd7\x13\x9a\x73\x19\x44\x46\x91\xd9\xd4\xbd\x11\xd6\x83\x80\xcd\xf8\xeb\xcb\x80\x47\x18\x38\xec\xcd\x8b\xf5\xde\x67\x13\x57\x06\x9c\x43\xec\xf9\x41\x2b\x32\xed\x5d\xc5\xef\x84\x6c\x59\x06\x3c\x66\xb4\x13\x2c\x17\x5b\xc2\xb9\xae\xb6\xf7\xbb\xcd\x6a\xf9\xfc\x74\xbb\x5b\x2d\x5e\x1f\xfe\xdc\xdd\xac\x5f\x6f\x77\xaf\x8b\x6d\xff\xf0\x3c\x0b\x84\xe7\xb9\x27\xf0\x6f\xb3\x21\x86\x36\xed\xe3\xe3\x5d\x93\xc4\xab\x2e\x2d\x97\xf7\x3b\xd4\x79\xbb\x0b\x93\xb1\x55\x25\x83\x18\x0c\x95\x26\x35\xf0\x1d\x6f\xba\xef\x30\xfb\x1a\x09\x24\x44\x96\xd5\x50\x84\xd2\x9a\x85\x58\x4c\x3f\xdc\xc5\x55\x57\x06\x69\x68\x02\xcb\x07\x4d\x39\x07\xeb\x84\x5e\x65\xab\xb9\x72\x8d\x48\xca\x49\x5e\x6b\x8f\xe7\xc4\x6d\x32\x48\x53\xcb\xba\xd6\xed\x30\x7d\x79\xf3\x90\xc1\xf0\xad\xa4\x95\x37\xb3\x6e\x20\xd1\xc7\x16\x45\x7f\x10\xb5\xf4\x35\x07\xcc\xff\x98\x85\x22\xb4\x7a\x5f\x54\x9d\xe2\x28\xa7\xef\xaa\x7a\x31\x9c\x98\xa5\x86\xe2\xc9\xcd\x2f\xe5\x47\x64\x20\xc2\x98\x0c\x2d\x2b\x25\x70\x0f\xcd\xaa\xd4\xde\x07\x95\x81\x88\x45\xc0\x27\xa2\x94\x43\xd1\xd9\x68\xcb\x92\x81\xc8\x02\x1a\x2d\x2f\x6f\x15\x96\xf9\x0f\xaf\x18\xea\x0f\xcb\x2c\x0b\xfb\x1c\xb3\xad\xed\xb0\xa8\x0b\x62\x9e\xea\xbe\xd9\x06\xeb\x1c\x8a\xbe\xd8\xc6\x9f\x27\x94\xc7\x33\x3d\x40\xe7\xee\xf4\xb5\xc5\xff\x80\x49\xab\x3b\x1d\x35\x1f\x9c\xb4\xbc\xdc\x8f\xbd\x17\x19\xa8\xd4\xd0\xba\x44\x09\xd6\xdd\x1f\x8b\x6f\xab\xb0\x1b\xeb\xeb\xe7\x5b\xdf\x42\x07\x21\x91\xc3\x5b\xa2\xe3\x59\xdf\x61\x20\x08\xc6\xb0\x7e\x5a\xfd\x87\x1e\xec\x09\x3f\xfc\x89\x28\xec\x37\xb0\x4a\x7b\x2d\xbc\xf7\x33\x19\x31\x26\x68\xef\x97\xc5\xc6\x66\x85\xfd\x01\xa3\x02\x9b\x7a\xa5\x81\xbd\x7c\xab\xaa\xe6\x72\x1d\x73\xd7\x94\x51\x5a\xaf\xe7\x67\x24\x7d\xb2\xcd\xb1\xc8\xcf\x28\x1a\xcf\x0a\x16\xae\x5a\x4a\x92\x05\xa1\xa0\xc2\x73\x4a\x6d\x04\x3b\xa4\xe0\xb3\x13\x76\x2f\xb0\xee\x9c\x51\x3f\x74\x59\xc0\xe3\x88\x8f\xb5\xb3\x6f\xa0\x55\x6f\xfd\x51\x91\x2a\x97\xb5\xfd\x82\x25\x3e\xe6\x3f\x70\x9e\xbd\x9b\x98\xd2\x92\xb1\x00\xc9\x5d\x7b\xc4\xe6\xed\xa5\xca\xcb\x5e\x27\xff\x02\x56\x53\x32\x66\x64\x64\xd3\x91\xea\x54\x5b\x6f\xe5\x65\x46\xed\x26\x59\xc8\x14\x39\xd1\x60\xdd\xa3\x19\xc5\xf9\x64\x67\x9f\x9f\x67\x88\x8d\x77\x18\xad\xab\x46\x41\x31\xc6\x5f\xf9\xa6\xa1\x25\xf8\x68\x1c\xcd\xc1\xda\x05\x3c\xe6\xcd\xb2\x90\xc0\xb7\x8f\x8b\x8d\xa5\x78\x76\xf4\x3b\x3f\xb5\x12\x25\x0b\x25\x12\xe8\x16\x94\xaa\x4f\x76\x0f\x9f\x01\x2a\x2e\x0e\x0f\x16\xaa\x90\x62\xb2\x36\xd6\xe6\xeb\x0e\x1e\xa1\x79\xbf\xb2\xaf\xb2\x50\x2b\xaa\xf4\xba\xc5\x8f\x51\xa8\x4a\xb2\x28\x52\x94\xf6\xfe\x03\x5a\x78\x83\xe9\x21\x99\x58\x26\xd6\xfc\x80\x77\x75\xcf\x61\x23\x59\xa4\x39\x3a\xce\x9c\x2d\xc2\x61\x5e\x57\x71\x41\x19\xaf\x3b\xc7\xd6\x37\x4d\x55\xf4\x2e\xbf\x1d\x0f\x63\xe6\x6c\x8e\x27\xa8\x55\xd5\x2c\xab\x1a\x7f\x3e\xb8\x38\xcf\x62\xe6\x37\x3d\xaa\x1a\x99\x98\x1f\x8c\xc7\x82\xd0\x52\x04\x72\x7b\x1a\x38\x47\xaf\x6a\xb0\x48\xc6\xd3\x90\x0f\x02\xa5\xd3\x3d\x8a\xf1\x0c\x29\x75\x7f\x6a\x2c\x29\xe1\x97\x13\xd4\x7a\xd6\x26\x4e\x34\x91\x1c\xd0\x3d\x4b\x38\xb5\xcd\x84\xe6\x46\xb2\x38\x8d\x59\xdc\xcf\xb0\x75\x69\x2a\x2f\x7e\x3e\x7d\xb9\x18\xac\xcd\x78\x74\x75\x2e\x5e\xc9\xcb\x1d\x4e\x84\x4a\x6d\xb9\x4c\x5e\x8e\x45\x86\xdc\xe1\x14\x24\x91\x78\xf7\x1c\x2c\x2e\x2e\xda\x5b\xb0\xe2\x7f\x66\xf5\x3a\x7d\x6c\x41\x32\x11\x66\x10\xf7\x75\x55\x58\xef\x7b\x16\x0b\xc9\x04\xf0\x34\xf1\x6e\x61\xfe\x37\xee\x88\x07\xe8\x32\x20\x74\xf6\x85\x41\x19\x22\x08\xf9\x2f\x55\x56\x3f\x26\x83\x0e\x74\x42\x79\x03\x07\xc4\xb1\x6a\x2a\x57\x48\xbc\x24\x93\x3c\x20\x83\xac\xc4\x0f\x2b\xa7\xff\x4f\x6e\x2e\x85\x9d\x3c\x6e\x87\x9d\x75\xb6\xca\x02\x32\xe5\x1e\x17\xeb\xa7\xcb\xb6\xdc\xee\xe5\x7e\xb1\x59\x85\xbf\xf5\x27\xa4\x44\xdb\x4f\x46\x42\x9b\xcf\xf5\x84\x67\x37\x57\x8a\x9b\x7e\x55\xbd\xa1\xb8\xfd\x6c\x29\x51\x26\x64\x36\xb6\x66\x0b\x72\xcf\x0e\x5b\xfa\xf7\x12\x3f\x6e\x6a\x7c\xab\xca\xab\x78\xc2\x3e\x41\x3e\x2b\x71\xb8\xb6\x6f\xfc\xc3\xdf\xdd\x73\xe8\x28\xa5\xad\xb7\xdb\x4a\x28\xf4\x0a\x65\xe7\xb3\x7c\x3d\x2e\x4a\xfd\x50\xed\xf3\xfe\x8b\xea\x24\x35\xa2\x47\xf9\x17\x3b\x9d\x37\xf2\x54\x37\x38\x64\x8b\x24\xd3\x52\x90\xae\xcd\x1b\x34\x9b\x53\xae\xf2\xc1\x42\x61\x26\x0a\x03\x47\xd8\xd3\xf5\xc7\xac\xc8\xf4\xf2\xc3\x85\x01\xb7\x41\x4d\x97\x8b\x80\x02\x5b\xe7\x39\x9e\x27\x93\x46\x67\xe9\x80\x70\x7f\xbb\x1e\x2f\xb8\x7d\xc3\x03\xae\x8c\x41\xd5\xfe\x76\x2e\xc3\xdb\x9d\x21\x0c\x78\xc4\x7a\x5d\x49\x90\x79\x31\xae\x27\x3e\x9d\x15\xc0\xc9\x90\x71\x4d\xc2\x5b\xf9\x61\x94\xb0\x91\x21\xd3\x51\x30\x84\xe7\x48\x5f\x63\x6a\x4b\x86\x61\x60\x69\xbf\x41\x6b\x57\x80\xef\xb5\x78\x66\xb6\xd2\xf4\x19\xc3\x48\x58\xb4\x21\x49\xbf\xdf\xe0\x3e\x2f\x07\xdc\x8f\x0c\x43\x95\x92\xb9\xfb\x8e\x78\x3c\xe2\x98\x1b\x48\x86\x21\x32\x4a\x02\x91\x18\xc3\x2d\x7c\x7a\x23\x35\x8c\x22\x41\x4b\x4e\xd7\x53\x77\xd0\xbc\xe5\x55\xf9\x02\x35\x4c\x85\x78\xd9\xec\x8f\x3f\x37\x36\x81\x97\xc7\x20\x2f\xd7\xaa\x71\x12\xfb\x96\x6b\xc2\x53\x11\x59\x52\x94\xef\x08\xc5\x12\xf3\x62\x5c\x7b\x3d\xff\x3b\x28\x57\xf5\x7d\xcc\x55\xe4\x35\x12\x5e\xf1\xaf\x53\x5e\xa3\x7e\x84\xff\xad\xfa\xce\x8e\x53\x1d\x8d\x8c\xec\xee\x31\x28\x49\x38\xf9\x70\xd9\xc5\x84\xa8\x0c\x63\x21\xb5\x73\x9f\x4f\xc7\xb5\xba\x8c\xba\x95\x61\x9a\xa5\x16\x74\xa0\xf5\x1d\xe2\x1d\xa2\xbe\x19\x3b\xab\x63\x97\x28\x4c\x33\x20\xbe\x0f\x3b\x5e\x6f\xa0\xbc\x2c\x79\x21\xc3\x54\x31\xca\xbb\x1c\xe0\xc7\x4b\x5f\x1e\x2e\xc3\x8c\x05\x2c\xf3\x5c\x2d\x14\x07\x99\x9e\x96\x65\x89\x87\x79\x3f\x55\x75\xfb\xf6\x52\x15\xf3\x0d\xd5\xb7\x04\x69\x65\x44\xfc\x6e\x71\x8d\x6b\x47\x86\x99\x36\x84\x06\x7d\x5a\x2e\xbf\x7e\x0e\x83\x46\x04\x42\x99\x7e\x57\xeb\xec\xff\x97\x1a\xbf\xe7\x95\x37\x6d\xfa\x88\x5c\xd7\x14\x28\x3c\x8e\x0e\xec\x42\x2a\x6f\xfd\x41\x2e\x2c\xc7\xac\xf5\x4b\xd6\xa5\xaf\x32\xf1\xc7\x85\xa0\x3a\xcd\xf6\x54\x0f\xf7\x46\xcb\x7e\x9b\x2b\xcb\x2e\xdd\x6b\x43\xca\x10\x12\x43\x86\xbe\x22\x6f\x69\x75\xac\xd4\xdb\xd7\xe3\xb6\x9a\x75\x14\x64\x8c\x88\x7f\x68\x4f\xef\xe5\x70\xfd\x41\x91\xf8\xa5\xe8\x36\xdf\xe7\x2d\x14\x8b\x9a\x22\x28\x79\xb9\x3f\x93\xa1\x66\x61\xe6\x4f\xd3\x91\x0f\x82\x6d\xde\xb1\x55\x6f\xd8\x3c\x97\x14\x01\xfb\x23\x6f\xdf\x2c\x95\xcf\xec\x2b\x00\x06\x3e\xcb\xb7\xac\x4e\xc7\xaa\x7c\x3c\x15\x77\xa0\xe6\xaa\x7c\x32\x94\xdc\x22\xa8\x8f\x03\x5c\x63\x1c\x16\x96\xa1\x44\x8b\xe3\x24\x06\x58\x07\xff\x9b\xb6\x50\x3c\x22\x33\xc5\x66\x8a\xbf\xe4\xd0\xf3\x8d\xc9\x50\x87\xda\x8f\x9b\x85\xcd\x81\xd4\xef\xd8\x52\x81\xd8\x90\x89\x91\xa1\xe6\x48\x04\x8e\x6a\x54\xea\xde\x0d\xaf\xf9\x30\xd4\x98\x52\x12\xfd\xad\x3a\x35\xde\xd1\x7c\x36\xe4\xe1\xfb\x3b\x62\x28\x69\xd6\x2c\x17\xbf\x6f\x46\x23\x05\x23\x46\x01\xc7\xcd\x76\xf1\xba\x5d\x3f\x7d\xd9\x3d\x3c\xdf\x6c\xb6\x3e\x57\x28\x43\xe4\x4c\x4e\x90\xde\x9b\xb7\xfc\x78\x03\x6d\x5b\xe0\x1f\x79\x39\xc8\x83\xb8\xc4\xa1\x0c\x31\xd1\x6a\x8c\x81\x98\x4e\x71\x14\xa1\x23\xd6\xf8\x80\x5a\x2f\xca\x3d\x0e\x0f\x68\x44\x12\x7b\xc7\x24\x6f\x3f\x9d\x31\xd6\xd7\x2f\xba\x66\x86\x25\x14\xe2\x25\x87\x58\x55\xda\x32\x66\x9c\xe6\xd3\xcd\xa4\x40\xf9\x85\xa5\x9f\x6e\x1e\x37\xa7\xbf\xaa\x61\x41\x8c\x02\x2e\x90\x11\x08\xab\x6d\xb1\xfe\xbc\xf9\x5c\x6d\xef\xe3\xe9\xa5\x22\x06\x40\xdf\xea\xbf\xbc\x2e\x83\x8c\x98\xd4\xb1\x8b\xa7\xd7\xa8\x72\x9b\xe2\xed\xb1\x05\x32\x0a\xc3\x54\xb0\x41\x14\xbe\x8f\x98\xaf\x7c\xa2\x51\x46\x61\x2c\xa8\xb4\xad\xed\x69\xe0\x6c\xed\xe5\xf3\xb1\x9f\x17\x51\xe8\xca\x38\x1b\x4a\xc2\xfa\xfa\xe6\x61\x7c\x44\xa1\xe0\xe8\x00\x41\xaf\xa8\xf2\x63\x8e\x9e\x1e\xeb\xa2\x5e\xa9\x8c\x42\x93\x84\x96\x71\x7b\xf1\x38\x51\xdd\x90\x51\x24\x39\x7d\xe9\xea\x38\xd5\x58\x93\x11\x8f\x30\x33\x9e\x1f\xbd\x73\x49\x96\x35\xea\xbc\x9d\x75\x13\xcf\x22\x42\xf7\xa9\x02\x72\xc7\x64\xb5\x1a\x17\xeb\xc9\x88\x03\x97\x56\xcf\xb3\x69\x51\xdb\xbc\xeb\xa2\x28\xb6\xd5\xa2\x98\xf2\x4b\xc8\x28\x86\x90\xca\x98\x8f\x50\xb7\x65\x2f\x8d\x26\xa3\x24\x30\x5c\x3b\xbc\x9b\x4d\x63\x84\x9c\xd8\x2f\xfa\x87\x4d\x50\x53\x20\x6f\x79\x18\x43\x05\x65\x94\x32\x8b\x94\xd3\xd5\x2b\xd2\x23\x5e\x5e\x7c\xa3\x34\x11\xc4\x85\xb9\xfd\xf1\x5c\xe7\xfb\x79\xc1\x89\x8c\x52\x4c\x62\x97\x3c\x5f\x42\x51\x6c\xd4\x1b\xea\x53\x81\xfa\xe6\x73\x3a\xd4\xa3\x8c\x1b\xd1\xf7\x5a\x79\xf2\xe7\x8b\x50\x13\x89\xe8\xe1\xb1\x1b\xbb\x34\xab\x67\x1d\xd9\xed\x82\xd0\xaf\xf3\x44\xd1\xed\x4f\x06\x10\x49\xea\x21\x16\x34\x3d\xac\x6c\xa6\x3f\xac\x92\x28\x70\xc5\xf0\x6f\xf9\xf1\x62\x62\x5a\x46\x8a\x1b\x82\x10\xbf\x3a\x1e\x8d\xdf\x46\x38\x08\x19\x29\x88\x68\x7e\x2d\xef\x1e\x7e\xeb\x7f\x32\xa4\xcc\x60\xb1\x74\x43\x74\x5d\x46\x4a\x3b\x35\x81\xaa\x7d\x59\x4e\x87\x5c\x18\xfc\x33\x7b\x37\xd2\x2c\x20\x74\xe5\xcd\xe3\x72\x3b\xf9\x62\x5a\xa7\x5c\x4c\x60\xb7\xf9\xdf\x34\x30\x47\x70\x2e\x19\x61\x18\x69\xd1\x87\xe1\xc6\x69\x6e\x19\xa1\xab\xbf\x73\x34\x05\x50\x9e\x0c\xa8\xce\x1c\xa9\x2f\x54\xb5\xc8\xc8\x64\x49\x64\x06\x05\xa4\xed\xe7\x71\x9a\x59\x94\x3c\x88\x6d\xfc\x9f\x3e\x8d\x4f\xb2\xbd\x92\x59\x39\x42\xf4\x49\x1e\x08\x85\xca\xcf\x4b\xaa\x5d\xf9\x6d\x9a\x3d\x75\xed\xba\x2d\x2c\xf5\x61\xa3\xf6\xa3\xba\x83\xa2\xc1\x45\xd3\x60\xdd\x3e\x55\x9e\x45\xde\xb5\x8d\xc2\x88\xa2\x06\x48\x65\xba\x79\xa5\xfd\x6a\xc4\xb9\x30\x14\xe1\xfe\xa8\x3e\xa1\xfa\x2b\x87\xb2\xfb\xdf\x74\x42\x71\x0e\x36\x80\xeb\xd3\x20\xab\xed\xfd\x66\x86\x2f\x94\x9c\x2b\x41\xc1\x31\x05\xc7\xb1\xd1\xe6\x8f\x1a\x4b\x52\xbc\xbd\x79\xf6\x8b\x06\x8f\xc1\x72\x51\x6f\x2a\xa5\xac\xb2\xce\xcc\x49\x9b\xf6\x5f\x82\xcc\xb8\x68\xc2\x37\xac\xbb\xd5\xbb\x79\x36\x3d\x41\xef\xf4\x76\x69\xa4\x22\xc7\x93\xf3\x3b\x7e\x36\x37\x9f\xb7\xd8\x2d\x7f\x6e\xbf\x19\xe3\xd5\x24\x4f\x53\x27\x83\x30\xca\x26\xdf\x7c\x3e\xe0\x1e\xd4\x19\x24\xf8\x72\xe4\x87\xa7\x8a\x05\xd2\x56\x60\xa6\x21\x1b\x31\x76\x4a\x2e\x82\x8c\xf2\x68\xcb\x9b\xe7\xfe\xa7\x84\x73\x7d\x85\x2d\xe3\xe6\xb3\xc5\xee\xd5\x7c\x5b\x48\x33\xe6\x8a\x7f\xbe\x55\x2d\xd6\xb3\xb0\x3c\x97\x99\x5d\x71\x6e\x89\x30\xed\xb7\xfe\x57\x08\x87\xb2\x09\x0a\x91\x6d\x73\xe7\xd3\xce\xfc\x2b\x2e\x4d\xea\x8b\xe0\x28\x26\x42\xad\xe7\xb8\x78\xc9\x15\x0f\x28\x0d\xad\xab\x12\x5a\x5c\x6d\xef\x7f\xeb\x0f\x58\x17\x69\xd5\xb4\x0f\xf9\x5f\xa7\x5c\x4f\xf5\xbf\x25\x57\x68\xb9\x69\x7c\x58\x6c\xdf\xf9\x25\xf9\x0f\x2c\xae\xe3\x8a\x25\xd7\x4c\x08\xec\xf1\x88\xa3\x90\xe0\x45\x1f\x73\x90\x88\x1d\x9b\x13\x5c\x47\x86\xe2\xdf\xff\x19\xa5\x6d\xcf\xd3\xef\x92\xeb\xd8\x96\xc3\x38\x3d\xa0\x52\xff\xbb\xca\xcb\xe5\xed\xcb\x2d\xe4\xb3\x5e\xc0\x54\x58\xdd\x31\x87\x50\x27\x43\xda\x33\xfc\x8b\xbe\x55\x66\x89\x73\x1e\x51\xaf\x7c\x4c\x9b\xa3\xb1\xae\xf9\x08\x26\x8d\xfa\x52\x49\xbc\xe4\x06\x54\x86\x6e\x80\x34\xbd\x17\xe4\x0f\x1a\x13\xe1\x88\xc9\x68\x9e\x68\xbe\x1c\x6c\x19\xbf\x6f\x1c\x28\x4d\x41\x64\x68\x5b\x50\xef\x24\xaa\x30\xee\x55\x76\x4d\xe6\x4e\xc6\x2c\x4a\x62\xe7\x65\x65\x61\xb7\x09\xfd\x76\xd6\x42\x60\x20\x46\x0a\x03\x83\xd5\x12\x33\x05\x54\xe7\x5e\x57\x85\xa5\x16\x99\xa3\x40\x26\xbd\x10\x33\xcd\xfc\x8a\xba\xb4\xa6\x90\x1d\x59\xe7\x29\x81\x38\xe4\x49\xe4\xb8\x69\x5c\xd6\x14\x6b\x17\xab\xb2\x79\x98\xc2\x45\x6c\xfc\xbc\x89\xa3\x28\xb6\xda\x2f\xb9\x69\x9b\x8b\x01\xbe\x38\xe2\xda\x0a\xa4\x77\xbe\x40\x69\x73\x6b\x8f\xd5\xf7\x79\xf6\x2f\x8e\xb2\x80\xdc\x9b\xbb\xaa\x26\x42\xaf\x6a\xb5\xbe\xf3\xaf\x1c\x29\x49\x28\x20\xd0\xfa\xa9\x1a\x22\x61\xa3\xe5\x27\xe6\x41\x42\x50\x3b\x82\x05\x3b\xb2\x85\x31\x51\xa4\x8c\x79\xa8\x53\x3e\x5a\xe8\xc9\x3b\x5e\xfd\xb5\xee\xbd\x85\x98\x47\x16\xb7\x73\x80\x1f\x54\xb3\x74\xc1\xc4\x8a\x79\x12\x6a\x17\x15\x79\xf4\x9b\x5c\x1c\x2b\x46\x56\xd5\xf1\xd4\xbc\x4d\xf3\x72\xae\x41\x02\x86\x04\x2d\xfa\x00\xc8\xa1\x7a\xac\x4a\x1a\x77\x17\x57\xe9\x38\x65\x82\x4c\xa5\x3f\xaa\xa2\x27\x09\x97\x71\x8a\x92\x02\x88\x64\x3c\x6d\x70\x7f\xc0\xc1\x9f\xa1\xba\x71\x17\x3c\xeb\xb6\xce\x31\xb3\x95\x8c\xb3\x54\x8e\xea\xf6\x5f\x4e\xc7\xe3\xe7\x26\xef\x3a\xd1\x7d\xdf\xab\x00\xd8\xe9\x82\x12\x67\xca\xaa\x6c\xb9\xfd\x79\x39\x43\x35\xc8\x58\xc4\x9c\x07\x3e\xa7\x5e\x97\x96\x13\xe4\x1a\x3f\xd7\xf4\x54\x60\x29\x99\x0a\xa4\xb0\xad\x47\x28\x62\x19\x43\xc2\xcd\x58\xe9\xfb\x09\x0e\xf8\x9f\x12\x0e\x67\x4c\x88\x7d\x5e\xc8\x8f\x0b\xc9\x94\x70\x5e\x9e\x25\x29\xbb\x1e\xbd\x89\x25\x0f\x09\x0a\x53\xe4\x0d\x01\x83\xfb\xae\x95\x42\xb9\x02\xf4\x76\x42\x22\x29\x63\xa9\x62\xea\xf4\x3f\x5e\x16\x7f\x4e\x7b\x5c\x39\x32\xfc\x07\x26\x76\x63\x9b\x2a\x56\x00\x44\x43\x46\xc9\xf0\x52\xcf\x0b\xbd\x67\x1d\xae\x95\x0d\x52\xaf\x9b\x85\x45\xeb\xce\xfa\x5b\x63\x48\xb6\xd7\xdd\xa9\xbc\x83\x7c\xa4\xa2\x22\x63\x8c\xac\xe4\xce\x3d\xb4\xea\x6d\xb5\xdf\xf7\xbf\x27\x49\xea\x60\x83\x4f\xf8\x71\x21\xc8\xf3\x8b\x31\x60\xb8\x25\x4e\x02\xad\x6f\xa1\x85\x4d\x5b\x23\x1c\xe6\xeb\xe7\x64\x7f\x4d\x82\x28\x0a\x86\x18\xd0\x83\x0f\xea\xb9\xcb\x8f\xaf\x9e\x04\x19\x27\x5a\xbb\xe6\x23\x6f\xd5\xdb\x08\x2e\x2e\x13\x16\x67\xa4\x72\x6e\x4e\xa5\xee\xa6\xf8\x99\x64\xcb\xe4\x39\x93\x50\x28\xe2\x13\x38\xec\x56\xdb\x7b\xbb\x1f\xf7\x24\x3a\xf5\xf7\xde\x2d\x4f\x22\x65\xa9\x19\x47\xd4\xef\xce\xb2\xb7\x77\xf7\x26\xda\xcf\x75\x77\xfa\x8b\x65\xbe\x38\xf0\x74\x7c\x05\x85\xbf\x5d\x88\x93\x26\x3c\x4e\xb9\xd7\x7e\xba\x23\x85\x42\xff\x30\x5c\x58\x55\x8c\x86\x33\xa7\xe2\xde\x1f\xb0\xca\xbb\x75\xd5\xbd\xfd\xa8\x02\x44\x26\x5c\x46\x76\xed\x73\x02\xeb\x3b\x98\x04\x57\x13\xae\x53\x32\x3c\x89\x2c\x7e\xe7\xd1\xa2\x3b\x42\x68\x4d\xb7\x80\x24\x91\x26\xc9\x9c\x42\xe1\xe3\xa7\x05\xfc\x4e\x3f\x65\xa2\x19\x81\x9e\x37\xdb\xcd\x76\xb5\xf1\x56\x68\x92\x60\x24\xb9\x8d\x72\xbb\x29\xb2\x2e\xcf\x4b\xaa\x64\x92\xb2\x58\x79\xea\xc5\xce\xed\x7e\x85\xf2\x7d\x8c\x22\x92\x49\x1a\x61\x0a\x7d\x2d\x54\x2f\xd1\x29\x93\x94\x47\xf4\x1a\xdf\xab\x16\x09\x19\xa0\x73\xfb\x39\xe7\x3a\x7b\x32\x49\x13\xa0\x4f\xda\x38\xd7\xb0\x73\x13\xa7\x49\x3c\x7e\x71\x90\x9f\x95\x4c\xf9\xeb\xe9\x78\x80\x59\xf7\x84\x0d\x53\x18\x50\x92\xa2\x61\xc2\xc1\xe2\xfa\x8a\xda\x6b\x05\x1e\x32\xc9\x94\xa6\x04\x6f\x5d\xea\x47\xf8\xb1\xf3\x57\x11\x61\xcf\x8e\xfe\x52\x57\xfa\xa4\x2e\xeb\x16\xca\x44\x44\x21\x19\xf2\x8d\x13\x2a\x79\xfe\xde\x07\xdc\x13\x91\x5a\x04\xb6\x2d\xca\x73\x54\x23\x7f\xcf\xb7\xa5\x44\x08\x23\x25\x11\x7e\xe3\x61\x5b\xc3\xac\x13\x01\x94\xca\x2c\x8c\xf5\xb8\xe9\x56\x2a\x94\x5f\x72\xd3\xbf\xae\xd4\x09\x2d\x7d\x4b\xa7\x81\x93\x97\x8e\x4e\xa2\x6f\x60\x22\x22\x06\xca\xdd\x7c\x3b\xcd\x80\xb9\x17\x6c\xc8\x44\x31\x65\x7a\x3a\x87\x7b\x2c\xf4\xc4\x9b\x4c\x54\x22\xd0\x66\x0b\x07\x75\x17\x8b\xec\x72\x0d\x74\x82\xdc\xaa\x01\x14\xfa\x85\x62\x58\xe3\xb5\x37\xd1\x89\x61\xda\x97\x25\x34\xcf\xc3\xef\xc6\x96\x17\xde\xae\x1e\x9f\xef\x17\x9b\x7b\x02\xcd\xcf\x1f\xf4\x34\xd7\x62\x92\x09\xb2\x00\x1c\x88\xda\x41\x4c\x2e\x00\xa8\x5d\x5b\x93\x25\x54\x9b\xb1\xbc\xb7\x05\x15\xc4\x33\xf3\x5b\x7f\x50\xf0\x91\x30\xf0\x8a\x84\x6c\x67\x5f\xcb\x48\xab\x30\xfc\x05\xdb\xe7\x7a\x0f\xe5\x04\x0e\x92\x18\xc5\x6d\x50\x6e\x40\xd5\x4d\x07\x4c\x1a\x04\x8c\xa0\x7e\xaf\x56\xb5\x4c\xdf\x2c\xef\x7f\x46\x04\x24\x53\xc6\x12\xb4\xec\xe7\xdf\x73\xfc\xb0\x74\x11\x5e\xc8\xea\xe2\x98\x4c\x43\x08\x71\x42\xe5\x7a\x2a\xaf\x40\xd8\xd2\x50\x6b\xcf\x63\xf0\x98\x97\xf9\xa1\xa7\x5b\x98\x36\x8b\x18\x27\xa2\xf4\x9b\xd5\xf8\x43\xa6\x11\xf0\x44\x4e\x21\xb9\xfe\xc9\x7c\x0b\xc5\x02\x4b\x5c\x6e\xe5\x5b\xba\x7d\xf6\x4e\x99\x9f\xc9\x53\xbb\x33\x79\x6c\xa8\xfa\x8e\x86\xec\x4d\x31\x61\x9d\x74\x4d\x12\x14\x9e\x02\xe1\x15\xcd\x65\x1b\x2e\x4d\x83\x94\xa9\x5e\x21\xb6\xc7\x1c\xcb\x54\x48\x49\x59\xab\xc7\x2d\x16\x43\xe5\x92\x4c\x21\xb0\xa4\xf0\xda\xee\x3e\x97\x09\x70\x65\x0a\x06\x6d\x91\xa5\x73\x81\xa6\x60\xbb\x54\xf2\x98\x2c\x82\x37\x68\xde\x2c\x15\xf0\x05\xb0\xb4\x4c\xa5\x52\x99\x2b\x62\x73\x35\x20\xfd\x05\x4c\x84\x1e\xce\xd0\x99\x6f\x63\x4b\x2c\x55\x11\x77\xe5\xca\xad\x27\xcc\x0d\x27\x10\xb8\x54\x47\x19\x15\xfa\x36\x2f\x54\x5a\xd5\x3f\x97\x4e\x24\x65\xfa\x0f\xf0\x8e\xf5\x57\x97\x00\xfe\xbd\x54\xb3\xb7\xc3\xd4\xc2\x6a\xb7\xb3\x2f\x6e\x02\xad\xf5\x25\x87\xed\xb2\xe3\x36\xf0\x50\x5f\x1c\xda\x86\x5b\x86\xec\x9d\x82\x42\x75\x4f\x19\xcc\xc6\x9d\x41\x5b\x93\xee\x45\xf8\x08\x07\x7c\x79\x28\x67\x41\x80\xb4\xe7\x5b\x64\x9e\x77\xae\xfa\xa9\x99\x05\x31\xba\xb0\x3a\x19\xcd\xb3\x60\x63\x16\x48\x4d\xfb\x86\x23\x13\xb8\x82\x07\xc8\x58\xa0\x08\x0f\x80\xc7\x4a\xbd\xcd\x2e\xc1\x24\x03\x33\x70\x22\x8f\x93\xaf\x59\xc8\x18\x7d\x0f\x55\x54\x0d\x45\xc8\x58\x7f\xc4\x70\x32\x90\x5e\x16\x7f\x2e\x9f\xd7\x4f\x0f\x7f\xfa\x03\x51\x68\x29\x7f\x8e\xf0\x39\xa3\x19\xe8\x8e\xa5\x81\x47\x4d\x38\x01\x7d\x92\x84\x58\x50\x5d\x9b\xaf\x9f\x9d\x3d\x5f\x14\x45\xcc\x41\x3b\x17\x75\xfb\x51\xd5\xef\x5f\xea\xea\x74\xec\xef\x97\xda\x8a\x9f\xc5\xe3\xcd\x62\xb3\x59\xdc\x3e\xbf\xee\x36\xeb\xff\xf8\xa3\x9c\x59\xc5\xa4\xce\xfa\xae\x60\x59\x95\x0d\x96\x8d\x07\x04\xcb\x8c\xc7\x8a\x8d\xeb\x95\x88\x3e\xad\x73\x5e\x7b\x3a\x95\x45\xd1\x8e\x85\xb0\x67\xfd\x1a\x33\x41\xc5\x50\xe4\x76\x50\xfa\xf8\xd9\xcc\x1e\x3f\x16\xdc\x4b\xee\xcd\x63\x89\x97\x62\x8a\x59\x12\x05\x22\x9e\x96\x73\x57\xb5\x8f\x4d\xfd\x36\xc1\x2e\xb8\x33\x3c\x7d\xb7\xa3\x29\x2b\x49\xbf\x79\xfa\x10\x29\x46\x16\xf3\x4b\x9c\x40\x63\x96\x48\x99\x65\x89\x0e\xfc\xac\xec\xac\x7d\x0a\x10\x9f\xe6\x88\x97\x2c\x83\x24\xf3\x6c\x19\xd5\xac\xda\x5a\x66\x99\xb2\xc9\xcd\x06\xdb\xcd\x11\x14\x2e\x6b\x30\x73\x5d\xc1\xe9\x12\x97\x29\xc6\x6c\xdd\x0d\xd9\x00\x34\x5f\x2d\xfc\x7d\xda\xc5\x2a\x46\x5a\x92\xbc\x39\x46\xb2\x2f\x1f\x75\xde\xa2\xa7\xb0\x21\x03\x6d\x06\xea\x70\x27\xeb\x54\xd1\xbb\x51\xfb\x65\x55\xea\x7c\x80\xf8\x4c\xb7\xe3\x0c\x63\x83\xb6\xa6\x4a\x55\xa5\xb6\xfe\x98\x0d\x02\xac\x4a\x3d\x0e\x59\x67\xa8\x0c\x81\x1b\x5a\x84\xc3\xa2\xd7\x00\x99\x1a\x74\x99\xc9\x62\xba\xf3\x53\xa5\xd1\x0b\xb5\x9f\xed\xee\x3e\x72\x2b\x82\x44\x91\xa7\x86\xdd\xd4\xbf\xc9\xf5\x5d\x55\xdb\x94\xe8\xb4\x33\x44\x00\x11\x49\xbb\x6e\xb6\x8b\xed\x6a\x77\xfb\xfc\x44\xa4\x38\xbb\xd7\xe7\xaf\x4f\xb7\x3b\x9f\x65\x11\x8c\x59\x25\xcd\x3d\xb6\x1b\x2b\x4e\x78\xb4\x5a\xa0\x55\x83\x7a\xd1\x4e\x8d\x72\xc1\x74\x4c\x90\x2d\x82\x64\x0e\x94\x3b\xfd\xc5\x50\xf8\x7a\xbf\xf1\xc5\x9e\xaa\x6e\xdb\x98\x5d\xc9\x70\x02\x78\x92\x94\xea\xb3\xb9\xc9\xbb\x11\x5c\x62\x9f\x7c\x11\xa1\x10\x94\x10\x03\x6f\x54\x3e\x42\xd9\x0f\xd5\xff\x8e\x03\xdf\x1d\x51\x1c\x08\x33\x00\xe9\xda\x8a\x34\x0c\xbc\xfb\x3d\x9e\x8a\x59\x7f\x86\x25\x86\x7d\xc7\xcf\x2b\xf6\x85\x88\xf4\xff\x4b\xda\x9b\x75\x37\x8a\xab\xfb\xc3\x5f\xa7\x2e\xce\x05\x12\x08\xd0\xa5\xed\x38\x89\x4f\x65\xda\xb1\xab\xab\x7b\x9f\x75\x96\x97\x86\x47\x09\xbb\x30\xf8\x00\x4e\x95\xfb\xd3\xbf\x8b\x47\x12\x93\x71\xaa\xff\xeb\xbd\xd9\xd5\x3b\xc8\xd8\x80\x90\x9e\xe1\x37\x84\x28\xe2\x54\x23\x26\x75\x0a\x02\xfa\x34\x6d\xe5\x8c\x07\x68\xa3\x71\xf3\xf2\x99\xca\x47\x3b\x2e\xc6\x36\xf9\x3a\x17\xfa\x58\x56\xa2\xbb\x72\x06\x2a\xf0\x00\xd3\x85\xd6\xe3\x6d\x97\xc7\x69\x60\x35\x66\x3a\x63\xef\xe1\xbe\xc9\x63\xae\x90\xd9\x02\x1e\xb1\xde\x2e\x07\x50\x35\x19\xd4\x93\x90\x64\xf4\xa3\x63\x88\x30\x86\xd8\x1f\x2b\x78\x54\xb7\x5d\x24\xcc\x13\x1a\x69\xd2\x49\x1d\xe5\xa7\x3a\xfb\xb0\xa4\xe1\xb9\xc2\xae\x2b\x74\x74\x0f\x39\xa1\x31\x02\x5c\x0f\xa7\xbc\xc9\xec\xc2\xdd\xbe\x80\x37\xf3\x9a\xa6\xe3\x77\x9e\x27\xcc\x4a\x64\xe2\xe2\x36\x96\xab\xb9\x72\xe7\xd3\x80\x60\xd1\x7b\xf7\x0e\xf7\x6d\x50\x72\x84\x6e\xe5\xe2\x69\x94\xe0\x5b\xb3\x38\x88\xbf\xcb\x62\x09\x75\x53\x43\x9e\x43\xf5\x20\x64\xfd\xfb\x00\x9c\xa7\x31\xc3\x62\x0a\xde\xd2\x36\x1f\x1d\xc6\x0c\x9c\xf3\xc4\xe8\x81\x8b\xc5\x3d\x6a\x7f\xc2\xaf\xc9\xca\xc7\xb9\x4c\xb0\xa4\x2a\x2a\x99\x35\xed\x1e\x6c\xcb\x9d\x5d\x57\xc4\x0d\x13\x24\x4e\xac\x83\x56\xa6\x00\x5d\x79\x6b\xcf\x18\xbc\xa2\x52\x36\xe6\x39\xd3\x60\xb8\xe6\x73\xa1\x6d\x41\xb2\x0d\xb1\xc4\xf1\x15\x44\xbb\x3a\x76\xdf\x65\x18\x3e\xa2\x9f\x87\xd3\xbc\xa3\xb6\xe4\x92\x28\xa9\x2f\x58\x39\xba\xdb\xf9\xb9\x8c\xa9\xb4\x1a\x6d\xcb\x90\x7e\xf9\xec\x99\x4a\x0d\x34\xf1\xa8\xd4\x03\x3e\xa5\xe5\xf9\x7b\xbb\xe0\x5e\xc5\xbe\x8e\x57\x69\xae\x12\xab\x04\xe1\x90\x70\x28\x99\x35\xf0\x5c\x90\x5c\x41\x2c\x7a\xd5\xaa\x8b\x19\xf3\x9b\x0e\xd1\x6f\x01\x7d\x93\x02\x3a\xd7\x71\x8a\x02\xad\xce\xf8\xc3\x45\x2a\x93\xe7\x0e\x34\x45\x8d\x81\x43\x56\x34\xaf\x70\x25\x6f\xe2\x10\x25\x58\x13\xd9\xe7\xa8\x2f\xe2\xff\xca\x42\x54\x0c\x79\x84\x06\xaa\xed\x90\x44\x31\xdf\x78\xe3\x60\x00\xc9\x0f\xb9\xa8\x2d\x97\x75\x0c\x81\xe3\x46\x80\x2f\xd4\xaf\x77\xf7\xbd\x09\x9f\xe4\xc6\xc4\xb8\xf3\xe7\x60\x1a\x4e\xc6\xdb\x89\x20\x5c\x63\xe6\xb8\xbe\xbb\xdb\xee\x77\xcf\xfb\xfb\xc5\x6e\x75\xbf\x27\xab\xd7\x85\x6f\x4e\x0a\xa2\x42\x2c\xd9\xec\x6b\x25\xd0\x95\xd9\x87\x06\x83\x35\x41\x10\x90\x83\xfe\xd2\x1d\x14\x56\xcb\x66\x74\x0d\xa2\x8d\x0b\xf1\x29\xd7\x0e\xab\x68\x9d\xc1\xa7\xf9\x91\xa0\x29\x47\x05\xc5\xfa\x28\x7e\x16\x83\x6f\xbb\xb8\x2b\x22\xe4\x20\xbc\xe0\x2e\x26\xe5\x5d\xb5\x5b\x84\x00\x83\x28\xea\x03\xaa\x06\xaa\x57\x71\x98\xa4\x43\x22\x62\xb6\x73\x26\x45\x0d\x2f\xa7\x22\xeb\x90\x25\x22\x4a\xa4\xb5\xe8\xcc\x54\x67\x36\x2e\x45\xa4\x14\x12\x1f\xc4\x98\x77\x3c\x7e\xe8\x82\x85\x81\x4f\x30\x6f\xc0\xb4\xb7\xe2\x15\x54\x79\x40\x2f\x48\x7f\x26\x96\x30\x6c\x59\xdc\x9f\x0e\xa2\xd8\x36\xa2\xd0\x1d\xaa\xea\x93\x95\x6b\xfa\x45\x69\x80\xb4\x85\xaa\x8d\xb8\x06\x3b\x86\x60\xa9\xd5\x49\x3e\x88\xe2\x24\xf2\xe7\x0f\xa8\xaa\x4c\xc3\xda\x86\x3f\xf7\xd9\xdb\x3b\xd4\xcd\x32\xd3\x8b\x42\x2f\x33\xad\x2f\x3b\x09\x93\xef\x89\xa3\xd0\x2b\x1b\x5b\xb9\xf8\x0b\x81\xb0\xcb\x1a\x95\x88\x93\xc4\x08\x87\xbd\x7b\xa9\xe0\x90\x9d\x0e\x2f\x62\x4a\x17\x12\x89\xd4\xca\x0a\xde\xb7\x4b\x59\x87\x3d\xb9\x2d\xab\x36\xdd\x99\x3c\xae\x04\x58\x12\xf4\xae\xa2\xa3\xca\xdc\xc5\x4b\xdd\xaf\x96\x22\x81\xc4\xf4\x1d\x0c\x44\x54\x4e\x57\xa6\xd1\x8a\x24\x30\x9e\xf5\xe5\xa7\x42\xe4\xaf\x58\x0b\x9b\xc4\x71\x7e\xac\x16\x38\x5f\x8f\x8e\x75\x37\xec\x7f\x8a\xd4\x18\xe5\x44\x6e\xee\x2a\x71\xec\x40\xe2\x82\xd3\x24\x6e\xdf\xab\xc5\xb2\xbe\x9e\x5f\x08\x1e\x1a\xd4\x4b\x3b\x88\xb7\x4c\x59\xe5\x58\x7f\x44\x24\x58\x7e\xbb\x5d\xac\x76\xcf\xaf\xfb\xa8\xfb\xbb\xe6\xb8\x5f\xae\x0f\x22\xcb\xb7\xc3\xbc\x73\x26\x5e\x11\xdc\x84\xcc\xf7\xb5\x56\x39\x88\x6a\x99\x79\x95\x11\x7f\x42\x41\xad\xd5\x95\x70\x00\xac\xab\x37\x7c\x76\x86\x8a\x54\x5a\xca\x42\x1b\x74\x55\x53\x55\x79\x37\x48\xc6\xd6\x86\xb3\x53\xd2\x41\xcd\xd6\xc9\x98\xd4\x42\xb2\xda\x5f\xfa\xf2\xe3\xcd\xa1\xa4\xfc\x41\xc1\xa8\xb3\xa7\xc4\xb2\x7b\xf7\xe3\x15\x50\xd4\xd1\xfc\x71\x56\x17\x9a\x58\xdd\x90\x84\x24\xde\xaf\x13\x2b\x83\xd7\x59\x56\xdd\x47\x34\x1a\x43\x65\xf5\xa6\xc0\xd6\xf3\xf8\xb0\x66\x1a\x3a\xfd\x92\xc7\xac\x98\xf3\x3a\x92\x42\xa7\x3a\xb5\x4d\x64\xf4\xdb\x19\xa8\x28\xf8\x46\xc1\xff\x4e\xee\xa5\x96\x12\x97\x8c\xf5\xee\x65\x18\xa9\x08\xa0\xc2\xfb\xa2\xe2\x14\xd1\xb7\x99\xec\x8e\x29\xeb\x36\x5f\xc1\x47\xf6\x31\x49\xc7\x05\x80\xc1\x65\xbb\x6e\xca\xe3\x6e\x40\xc0\x10\x26\x26\x48\x8d\x70\x64\x5c\xda\xfd\x3d\x11\x41\x0f\x89\x7c\xa9\x4e\x20\x3d\x78\x49\x06\x51\x8a\x2a\x94\xee\xdd\x7c\x3d\xe5\x53\xc9\x7a\x29\x03\x23\x00\xfa\xd2\xd7\xcc\x8c\x94\x84\x47\xa1\x25\xa3\x7b\x65\x8b\xd9\x00\x46\x12\xc1\xc0\xf4\x5f\x77\x03\x83\xe4\x78\x74\x42\x1a\xf4\x45\x27\x71\x6c\x44\xe6\xbd\xf9\xfa\x2e\xf6\x44\xa5\x41\x4a\x9a\x5a\xfd\xa4\x43\x56\x0c\xa1\xb7\x32\x0c\x12\x9f\x0b\x3d\xda\xa7\xd5\x55\x6e\xfd\x88\x38\xc5\x1a\xf2\xb1\xcc\xf3\x1b\xd1\x08\x54\x23\x7c\xef\x11\x8b\x92\x31\x85\xd6\x3f\x12\xb9\xf8\xd6\x99\x05\x6e\xcb\xea\xf6\xd4\x9c\x2a\x5b\x31\x9c\x5b\xd6\xfc\xa7\xb5\x35\x39\xaa\x7b\xc9\x96\xf1\x80\x38\x12\x12\xba\x5a\x70\xfb\xf0\x2c\xa9\x78\x34\xf7\x64\xc2\x18\x26\x14\x35\xf2\xe6\xe6\x1e\x43\x92\x12\x8b\x06\x3c\x55\x8f\xe2\xd7\xb2\xcb\x6b\x65\x9a\x18\x84\x1f\x64\xf5\x4e\xf4\xf5\x59\x7f\x30\xd5\xb8\xc5\x23\x8a\x05\x75\xd8\xbb\x8f\x49\xaa\x87\xc2\x8f\x2f\x50\xf5\x45\x4d\xc9\x43\xe2\x85\x9e\x9e\xe0\x17\xca\xa5\x2e\x9a\x1f\x73\xdd\x70\xc9\x0d\x58\x5e\xa2\x1e\xca\x57\x5f\x3c\x75\x41\xa2\x50\x8d\x6b\xbc\xc3\xe6\x8b\xff\x62\xa1\x21\xc2\xc0\xa5\xd6\x83\x9f\x23\x19\x8f\x7a\x92\xbc\xad\x5d\xbb\xbd\xf3\x9f\xe6\x8d\x57\x63\xcd\xb9\x55\x52\x4a\x26\x8c\xc7\x91\x91\x5b\x91\xe5\xdd\x0f\x94\xb1\x25\x6c\x6c\x1a\x38\x38\x44\x75\x77\x88\x1b\x2c\x7c\xc9\xd3\xd9\x37\x4f\xc6\xb7\x4a\x2a\x3b\x5b\x97\x59\x53\x88\xc2\x79\x9d\x0d\x65\x27\xdd\x38\x1d\x06\xb8\xd9\x2d\x1f\x76\xc3\xad\xc8\x1f\x15\x09\x84\x7d\x3d\x0a\x7a\xc5\xe2\xc1\x0e\x2b\xb5\xb2\x84\xd2\x7d\x87\x52\x98\xeb\x3e\x7d\x9e\x65\x4b\x6d\x04\x86\xf9\x4e\x13\xd7\x36\x87\x2e\xf3\xca\x2e\x50\x97\x10\x04\xcc\xc9\x20\xdc\xb5\x81\xa7\x98\x74\x00\x24\x44\x89\x6d\xab\x21\x64\x6a\x57\xf6\x3e\xae\x52\x82\xe2\xd8\xa1\xb0\xf2\x46\xfb\x5d\xba\xfe\x73\xbf\xb8\x79\xdc\x3c\xf9\x01\x26\x08\x13\x87\x02\xf4\xd8\xdd\xb9\x6c\xfb\x37\x17\x65\x18\xc1\x6a\xf1\xcd\xf3\xf7\xfd\xf7\x0e\x8b\x24\x4d\x12\x22\xd6\xf3\x36\x3f\xaf\x44\x35\x74\xa2\x97\x2a\x08\x52\x94\xfc\xfa\x55\x89\xee\x4f\x11\xd8\xb3\xac\x57\x9b\xc7\xc5\xc3\xd6\x6e\xfb\xdd\x51\x16\xfb\x1a\xe3\x53\xd9\x88\xea\x3c\xcb\x61\x50\x01\x4b\x03\xf7\xee\x60\x0b\xfc\x0a\xa5\x78\xf4\xfb\xdb\x0f\x85\xa1\xf7\x37\x9e\x28\x11\x49\x15\xc8\x14\xab\x82\x99\x47\x78\x5a\x42\xee\x6e\x64\x6c\x2f\x15\xa1\xc6\x02\xe1\x07\x52\x03\xbe\xec\x13\x8d\x5a\xe3\x3d\x08\xe3\x33\xae\x89\x22\x5c\x6a\xd1\xb7\xca\x8d\xc9\x47\x12\x45\x12\x1d\x54\xa3\x0e\x76\xa1\x40\x3f\x95\x7d\x5c\xa0\xc2\x20\xe0\xae\x81\x71\x53\x95\xc7\xee\xef\x91\x88\x2d\x7f\xb4\x68\x43\xd5\x1b\x50\x58\x0c\x1e\x4f\x2a\xc5\x52\xeb\x0a\x6d\xcd\x3f\x1b\xf1\xd6\x55\xc5\x15\x13\x02\xa3\x2f\xe4\x9a\xb4\x41\xff\x07\x54\x5d\x5e\xae\x98\xb4\xae\x52\x6f\xbd\xc4\x34\x46\x3a\xfe\xb0\x49\x9d\x46\x40\xa1\x27\xf2\xb0\x93\x67\x12\x8b\x04\x11\x3e\x42\xff\xe7\x54\x37\xab\xd3\x95\x36\xaf\x4a\x82\x04\xb5\x37\x96\xbb\xdf\x66\x16\xfe\x13\x46\x70\xb7\x6e\xae\xda\x04\x67\x7c\xbe\x94\x49\x8c\x34\x50\x46\xae\x87\x95\xa9\x34\xd5\xf8\xa6\x14\xe2\x00\x68\x38\x38\xbb\x28\x2b\x9e\x24\x18\x6d\x1e\xcb\xa3\x6a\x63\xe4\x51\xa8\xac\xb8\x8c\xad\x04\x44\xa1\x9f\x0d\xda\xf3\x8f\x67\xaf\x20\xd6\x30\xd3\xf1\x5e\xea\x95\x28\x50\x34\x60\x32\x4a\x73\x7c\x38\xd8\x7d\xaa\x1b\x44\x68\x5b\x9c\xdf\x78\x9c\x8c\x28\x76\xa0\xf7\x38\xaf\x76\x65\x6f\x49\xe5\x07\xc4\x26\x70\x58\xd7\x87\xb2\xee\x48\xdc\xbd\x72\x94\x54\x52\x04\x08\xb9\xdf\xf7\x22\xec\x17\xa4\xc3\x99\x74\x44\xb5\x79\xa7\xe8\x4a\xcd\x2f\xa2\x6a\x9e\x4d\xef\x1f\x8d\x49\x50\x3f\x69\xa4\x8c\x11\xd8\x2a\xa1\xa9\x17\x15\xbc\x88\xf3\xb5\x2e\x8f\x52\xae\x0a\xd0\x78\x2d\x9e\x89\xd4\x8f\x54\x4a\x12\x44\x5a\xac\xcb\xfa\x25\xfb\xfb\x6f\xb1\xcd\x2f\x34\x4b\x94\x92\x26\x76\xe2\x62\x18\xfc\xcc\x8b\xd8\x4b\xa5\x03\x2b\x73\xd9\x7d\x49\xf6\xf2\xfa\xfc\xb4\x7b\x7e\xc8\x3e\x7a\xbb\x2d\xa9\xb4\xb6\xb4\x3e\xbc\x8f\x6f\xf5\xd3\xe9\x0a\x72\x5f\x69\x50\xda\x05\xe2\x9b\xba\x3e\x4d\x89\x21\xe3\x18\x5c\x41\x60\x19\x86\x15\xd4\x65\x6e\xa5\xc1\x7d\x8f\x64\x56\xce\x66\xf2\x65\x20\x18\x56\x3e\x3e\x32\xf8\xb9\x2a\x0f\xc7\xb2\xb8\xda\xa2\x53\x26\x00\x54\x2d\xbc\x5b\x2d\x5e\xfc\x55\x99\x38\x42\x90\xc4\x1d\x34\xaf\x6d\x1c\x74\x1a\x60\xc1\x94\x31\x11\xc1\x7d\xac\x3e\x17\x6a\x3b\x23\x39\x3f\xfe\x02\x1d\x84\x04\xd9\xee\x56\xff\x00\x2f\xfe\xcb\x64\x84\xb4\xb6\xfc\x42\xeb\xd5\x7b\x96\xcf\x6b\xd8\x4b\x1d\x18\x4b\x92\x70\x32\xde\xcb\x76\xb7\x1b\xad\x9b\x9a\xc8\x18\x09\xa5\x76\xc0\x0e\xcb\xa5\xee\x9a\x34\x65\x29\xaa\xfe\xfd\xa7\xcc\x8a\x47\x2c\x1c\x8c\x6e\x48\xe4\x12\x7b\x1d\x06\xd6\x05\xf8\x2b\xfc\x18\x6e\x5b\x3a\x24\x09\x58\xa0\xdd\x27\x04\x0d\x1d\x26\x5c\xb6\xab\x5c\xd6\xdc\xc0\xc7\xa0\x22\xa2\x59\x10\xa5\xed\xee\xf4\x52\xe6\x99\x3a\x4f\x45\xd6\xc7\x59\x6c\xf7\x11\x65\x05\x5b\x7b\x96\x17\x36\x39\x06\x3c\x4e\xcd\x42\x09\x62\xc0\xc6\x46\x11\x71\x7f\x2c\xb6\xae\x9e\xdf\xff\x5c\x75\x7f\xd2\xa1\xd5\xf5\x51\x65\x05\xd8\x68\xac\xaf\x2a\xa9\x8d\x6f\x6d\x4c\x0c\x1d\x7a\x5e\x8c\x0b\xaa\x3a\x8e\xad\x7c\xca\x63\xa9\x33\x73\x6e\x57\xc9\x2f\xa3\xfa\xe3\x27\x68\x61\x1d\x6b\x41\x7a\xd1\x2c\x79\x6a\xe0\xcf\xc5\xe6\xe9\x72\x7b\x98\xdc\xea\x24\x66\x98\xfd\x3a\x49\xa4\xb1\xad\x81\x1f\xc3\x29\x9a\x21\x2d\xb3\x46\x95\x59\xb1\x12\xf5\xbb\x93\x38\xee\x46\x68\x2b\xb1\x56\xb7\x8b\xc1\x4b\xe9\x57\x3f\x9d\x52\x49\x03\xdf\x76\x5c\x89\xee\x42\xd3\x38\xe6\x43\xaa\xc2\xc2\x99\xb2\xd7\xde\x16\xce\x8f\x4b\xac\x29\x4e\xfb\xb0\x1e\x85\x7a\xcf\x8a\x51\x14\xa4\x05\x61\x91\x3b\xff\x73\xde\x75\x4c\x66\xeb\xa3\x5a\x28\x82\xfb\xf9\xd7\x87\xed\x3f\xdc\xe9\xb4\x94\x0a\x15\x0e\xdb\x9d\xc6\x09\xcc\x5d\x2d\x6d\x7c\xfe\xfa\x4a\x00\xeb\xb9\xd2\x54\xfb\xdc\x82\xeb\x46\xdf\xa4\x18\x4b\x9d\x0f\xe5\xfb\xbe\x2f\xcd\x6a\xc5\x04\x06\x1b\x3f\xa7\x28\xce\x51\x83\xeb\xca\x6c\x83\xc4\x60\x26\xb8\xca\x33\xf5\x63\x79\x6a\x9a\xb2\xbb\x71\xc6\x90\xd8\xed\x5c\x03\xf5\x2b\x09\x24\xb0\x6b\xd6\x9b\xd5\x14\xbf\xad\xca\xc3\x08\xff\x36\xbe\x2c\x20\xa1\x4e\x2c\x09\xee\x84\x05\x3f\x0c\x89\x7a\x42\x0b\xea\x59\x3a\x7e\x8f\xf3\xa5\x78\x36\x28\x66\xe6\xe8\x2d\xe7\x75\xd1\x64\xcd\x44\x9a\x04\x42\x91\xa2\xce\xda\xfe\x23\xf4\x27\x0a\xb5\x41\x01\x94\x8f\xec\x88\xa1\xda\x01\x8a\x36\x8c\xed\xc4\x83\xba\xbd\x10\xa2\x30\x74\xd8\x02\xf5\xa3\x7e\x81\x0a\xb7\xca\xee\x60\x9a\xa2\xc6\xed\xcb\xb7\xe5\xc3\x66\xb5\x7f\x5d\x6f\xd7\xaf\x7f\x74\x01\x37\x30\x9a\xa4\x16\x20\x33\x36\xfe\x7d\xa9\xc0\xb2\xad\xbf\x8c\x9a\x1b\x9f\x47\xf5\x90\x08\x1b\x66\x78\x44\x89\xf5\x97\x9d\x37\x7d\x99\x7e\xd4\x44\xa8\xca\x77\xfb\xfc\xed\xe9\x66\xfd\xba\xbf\xfd\xf6\x74\xe3\x9d\xa3\xdb\xa3\xb6\x70\x6d\x4d\x36\x3c\x9d\xb6\xae\x3d\x03\xfd\x4a\x3e\x79\x55\xfe\x5e\x42\x6a\x78\xe4\x79\xe5\x58\x5f\xd8\x9b\xd8\x7f\x1b\x0f\xac\xdb\xa6\xa7\x0a\x7c\x87\xac\xa7\x8d\x00\x0f\x24\xc2\xc2\xc4\x07\x54\xe2\x0d\x3a\x97\x18\x7f\x38\x12\x18\xaf\xde\x89\x76\x17\x39\xef\x1f\x4f\x7f\x65\xfb\xa7\xb2\xbb\x14\x9e\x50\xdb\xe5\xd8\x3c\xed\x11\x14\x87\x3d\x86\xf5\x9f\xab\xfb\xc5\x53\xa7\xfc\x05\x5c\x09\xac\x50\xdd\x41\x55\x65\x03\x31\x66\x09\x22\x16\xf6\xbd\x12\x06\xb6\x27\xd9\x54\xe1\xcd\xc3\x95\xb9\x2a\x14\xc5\xfe\xc8\x76\xb7\x58\x0f\xb9\x3f\x20\x89\x40\xa0\xa3\xcb\x90\x87\xd5\xba\xdf\xb5\x8b\xfc\x19\xe2\x40\xc6\xde\xfe\xf0\x90\x15\x53\xf3\x0c\x09\x92\x1b\xf4\xa7\x3f\x94\x1f\xb6\x80\xd3\xab\x99\x5e\x13\xea\xee\x3f\xdc\x26\x05\xa4\x2f\x03\x5e\xc1\x6d\x81\x8a\x53\xdf\xe0\xd9\xdc\xec\x95\x55\x26\xf2\x17\x09\x34\x22\x72\x40\x89\x99\x88\xe6\x4b\x80\xc4\x26\x94\x48\x2c\x6c\x43\xba\xf6\xdd\x6f\x23\xd9\x8b\x12\x1d\x18\x46\x29\xf2\x07\x9f\x9f\x6e\x37\x77\xfb\xc7\xc5\x9f\xfb\xdd\x66\xf5\x75\xbd\xdb\xfa\x93\x99\x44\x0a\x36\xe0\xe4\x8f\xa1\x8b\x76\x90\x09\x84\xa5\xc8\x1c\x9d\xd6\xe5\xb8\xb4\x39\xbe\x07\x86\x84\x96\xe5\xff\x6d\xb7\xda\x36\xa5\x9f\x7e\x26\x8c\x68\xe8\x82\x9e\x17\xcb\x23\x9d\x7c\x49\xc8\x42\xdc\x16\xdf\xb2\x0f\xf8\x44\x27\x7a\xfc\x65\x11\x23\xcc\xca\xac\x0b\x3d\x0c\xf8\x0d\x4b\x4c\x04\x5e\xc5\xed\x00\x75\x73\xd1\x2e\x32\x71\xc0\x42\xd7\xea\xf4\x22\x7c\xb3\x3d\x01\x13\x53\x83\x78\x01\x2c\x84\x95\xc7\x32\x3f\x6f\xdf\xab\xec\x70\xbc\x15\xd5\xe1\x72\x70\x1a\x73\xa7\x17\xdf\xcc\xcb\xcf\xce\x15\x9d\x5c\x34\x66\x92\x88\x61\xfb\x75\xfd\xb8\xd9\x6e\x37\xcf\x4f\xfb\xdb\xe7\x57\xd4\x67\xd9\xee\x16\x77\xeb\xc4\xdf\xcc\x94\x01\x4a\x3b\x6d\xb3\xb7\x83\xd8\x3c\x0f\x77\x5a\x93\x26\x84\xce\x2b\x67\x8e\xe2\xbf\xc0\x0f\x17\xd6\x78\xf4\x0d\x9a\x45\xe3\x96\xe8\x59\x7e\xa4\x11\x91\x8c\xc0\x87\x44\x0b\x8b\x30\xf7\x5f\x2a\x54\x28\xe5\xd5\x69\x34\x55\xab\x1d\x3f\x43\x19\x24\x8a\xf7\x88\xd7\xdf\x3c\x71\xa9\x12\x16\x76\xf4\xba\x91\xc8\xa2\x1b\xa1\xa8\x09\xc3\xc1\x0b\x74\xb3\x78\x9e\x03\x94\x1a\x08\x04\xa8\xbe\x4e\xb9\xfe\x35\xa5\xf8\x18\x88\x00\xb3\xb5\x3b\x91\xe5\xf9\x44\x27\xc1\x40\x9a\x62\xfe\xbf\xa8\x1a\x38\x99\x59\xdb\x52\x37\xd2\xa8\xc4\x0a\x55\x0a\x4c\x62\x61\xac\x3f\x62\x8c\x61\xc2\x11\x65\xbc\x98\xac\x90\x39\x20\x1b\x6c\x14\x54\x0e\x7f\xbe\x0a\x82\x90\x20\xe9\xcc\xd6\x4b\xf6\x1b\xb7\x37\xaa\x20\x50\x80\x90\xd4\x53\xf1\x2e\xf2\x66\x1f\x06\x9d\x72\xa1\x0a\x08\xb5\xf4\x99\x2e\x9c\x2b\xb4\x65\x1d\x60\x69\x7b\x56\x53\x6c\xe6\xbf\xdc\xc9\xa8\x23\x94\xb5\xcb\xca\xd3\xb7\xc7\xe5\xfa\x75\xff\x7c\xbb\x7f\x79\x5d\x3f\x6e\xbe\x3d\xda\x59\xeb\xbf\x97\x42\x60\x1d\x2f\xc5\x07\xd0\xf1\xb4\x18\x4e\x32\x15\x44\xc4\x16\x1f\x40\x67\xcd\x4b\x55\x9a\x2c\xef\x99\x3d\x83\xc0\x7a\x78\x3f\x06\x1e\xe7\xd3\x21\xfe\xa4\x34\xc4\xae\x10\xd6\x78\xfe\x75\x12\x1d\x22\x53\x05\x91\xe4\xb8\xad\xb5\x0b\xc8\x16\x5c\x70\x3b\x94\x8e\x50\x41\x1c\xc6\x69\xec\x65\x56\x72\x71\xee\xfd\x3a\xfd\x00\x23\xb0\xe3\x65\x31\x57\x2f\xaf\xeb\x2e\x61\x56\x41\x9a\x6a\x14\x2c\xfe\x99\x15\xce\xcb\xa8\x5d\xdc\xba\xa3\x02\x82\x21\x70\x03\x57\x98\x4e\x53\xd5\x8f\xe2\x24\x44\xca\xbf\x29\x4f\x95\xaf\x6b\xab\x80\xa7\x1c\x8d\x80\xf1\xb4\xae\xa4\x69\xd5\x33\xc6\x78\x41\x15\x70\x69\xac\x72\xc1\xfb\x00\x2b\xe5\x8e\x89\x88\x18\xcb\xdb\x93\x0d\xd4\x05\x74\x57\x2d\x09\x4b\x7b\xa2\xda\xd3\xed\xee\x52\x46\x7b\x2e\x81\x8a\xfc\xc7\xc3\x04\xf7\x70\x88\x55\xcc\x80\x87\xdd\x69\x23\x01\xac\x57\xd4\xab\xad\xd6\xc6\x67\xd8\x42\x15\x48\x01\x4c\xf6\x0b\xc4\x2b\xe8\xbe\xbe\xe2\xcf\xab\x82\xd0\x42\x33\x9c\xca\xc3\x73\x01\xbd\x08\xa5\x0a\x14\x57\x08\x0d\xb0\xeb\x93\x87\xf3\x2c\x64\xf6\x65\x34\xfb\x94\xb1\xf1\xac\xb6\x72\xc1\xfe\xd3\x3a\x50\xd4\x72\x30\xab\x1f\xdd\xdf\x22\xd2\xc1\x4a\xae\x8a\x52\x5d\x54\xb9\x55\xa0\x63\x6b\xdf\xb2\x3a\xd5\x4d\x79\xb8\x01\x91\xb7\xb3\xe5\xff\xb1\xf1\xe0\xcf\x25\x94\xa1\x5d\xfe\xff\x8a\xd4\xde\x51\x89\x40\x05\x1a\x00\x4b\x80\x56\x48\xa2\xec\x6a\xb9\xcb\x73\xbb\x0b\x67\xa3\xae\xff\xb5\xab\xb0\xaf\x69\xbf\xbb\xa2\xa3\x0b\xaa\xb9\x8f\x58\x35\xf3\x6c\x1a\xff\x09\x6a\xd9\xec\x56\xdd\x0d\x9c\x7c\xdd\x6f\xea\xd5\xed\xc7\x84\x0b\xa8\xde\x50\x2c\x6a\x32\xb3\x21\xb2\x68\x47\x64\x72\x96\x47\x28\xbc\x40\xc9\x6b\xef\xc5\xa2\x02\x10\xd6\x11\x7b\x6f\x9f\xfe\xe3\xc3\xd2\x36\xa3\x36\x7a\x36\x84\x51\x01\xa8\xc0\x16\xb8\x2d\xa1\x25\xcf\x06\xe5\x24\x37\xc4\x04\x29\x75\x6a\x20\xb7\x0f\x5f\x6f\x6e\xcb\x6a\xda\xaf\x50\x81\x49\x81\xb8\xd4\xcd\x1a\x20\x6c\xd5\xd4\x2d\x56\x05\xc6\x30\xa7\x87\xfd\xcb\x13\x00\x3d\x21\x4d\x91\x20\xb6\xc4\x01\xa1\xb5\x6d\x29\x5f\xf8\x23\xf9\xc5\x98\x10\x16\x62\xa8\x97\xd5\x2f\xf4\xe5\xeb\xfd\x58\xc8\x6b\x7c\x7d\x84\xa4\x0a\xe3\xe8\x0f\xa8\x32\x73\xbe\x3a\xf9\xe6\x71\xf4\xd4\x7f\x23\x0d\x29\x36\xd6\x1e\x33\xdf\x53\x55\x84\xb2\x18\xed\xc5\xfb\x6a\xf9\xec\x73\x25\x54\x85\x18\xb7\x2d\x77\xdf\x9f\xf7\xab\x87\xc5\xe6\xd1\x4b\xcf\x75\x67\xd2\x29\x86\x38\xa2\xca\x9a\xf7\x03\x34\x99\x9a\x0f\x38\x15\x09\x43\x81\xd0\xe3\x63\x05\x1f\x59\x9e\xbd\x81\x9e\x0d\x63\xdb\x81\x0a\xc5\xcf\xed\x63\x5d\xc2\x8c\x9f\xb4\x22\xa1\xb0\x3d\xd7\xf6\xbd\x76\xfe\x47\xe3\x01\x91\x96\xd8\xde\x44\x1d\xd7\xf7\xaa\xfc\x59\x63\xae\x85\x78\xe1\x4d\xa1\xca\xaa\x02\xd5\x0c\x20\xc6\x8a\x30\x26\x99\xdb\x74\x35\xdc\x96\xd5\xc4\x5f\x81\xfe\xef\x78\x49\x1d\xbe\x69\x84\xc5\x94\x84\x03\x2b\xbe\x11\xdc\x65\xb8\x76\x91\x38\xb0\x50\x73\xbb\x18\x6c\x8a\x31\x32\x58\x91\x98\x91\xc8\xe3\xf2\x06\xe0\xff\xf6\x00\x0f\xa9\xeb\x54\x74\x4a\x25\xbd\xac\xdb\xf8\x1e\xc6\x49\xe0\xf9\x2e\x56\xd3\xc9\xd6\xd0\xc7\x83\x12\x6a\x7c\x67\xdd\xb2\x25\xc6\xbf\x24\x51\x4c\x48\xdf\xe0\xfa\x79\x61\xa7\xa9\x48\x62\x94\x97\x60\xfe\x0e\xe2\x58\x16\xf5\xa2\x3a\x9c\xe9\x64\x14\x4f\x92\xd0\xe1\x8a\x97\xc3\x55\xd8\x1f\x56\x24\x61\x1e\x48\x21\x50\xe3\xb8\x99\x7e\x11\xd7\x54\x75\x0c\xc3\x83\x14\xcd\xf7\xb2\x68\xf7\x96\x59\x8d\x2b\x45\x84\x8c\xb0\x28\xd8\xbf\xa8\xa5\xb9\x14\x22\x53\x44\x25\x02\x59\xc2\x99\x2a\x3b\x89\x33\xea\x6f\xb7\x0e\x08\x92\xe9\xb4\x05\x93\x79\xdc\xa8\x3f\x1a\x09\x2c\x9f\xdc\x55\x00\xc5\x5a\x95\xd8\x80\x19\x84\x8b\x8a\x68\x6e\xad\x64\xfa\xf2\xa1\x4b\x87\x2f\x6c\x3b\x26\xf1\x1a\xd1\xdc\x60\x66\xe6\xf4\xe0\x3a\xde\xe4\xe4\xf1\x40\x10\x89\x78\x88\xff\x73\xf9\xe7\x4d\x36\xe9\x01\xbb\x66\x8f\x22\x40\x89\xee\x44\x72\x46\xea\x2b\x8a\xb4\xb9\x0a\x16\x48\x00\xb6\xd0\x9c\x8e\x9f\x86\xf7\x8a\x06\x31\x47\xd2\xe3\xde\x58\x32\xec\xe4\x68\x4a\xb0\xdc\x6c\xdb\xdf\x75\x5f\x5f\x50\x94\x24\x1a\x65\xcb\xfe\xae\xff\xf3\xf7\x27\xa8\x6e\x45\x89\x89\xa5\xf4\x2d\x0c\xf5\x03\xb4\x25\xa0\xf4\x59\x58\x3b\xc4\xa0\xe8\x4f\x8d\xdd\x51\x3b\x6a\xe9\xbf\x88\x0a\x85\x4d\x7c\x87\x7b\xdc\x5b\xb6\xc8\x78\xf2\xd1\x30\x60\xd6\x1e\xa6\x41\x5b\x9a\x5c\x4c\x2e\x84\x45\xb1\x75\xad\xc9\x8a\xe6\x8a\x88\x6e\x37\x52\x61\x0e\xf2\x13\x17\x98\x1b\xf8\xf0\xbf\x83\xf1\x98\x45\x3e\x2c\xb5\xbb\xde\x8d\x68\xc4\x58\xa2\x4b\x51\x66\x18\x66\x6d\x79\x56\xfc\xf0\xfd\xac\xc9\xc2\x48\x63\x02\xd4\x65\x42\xed\xfa\xf2\x9a\xbd\xbd\x37\x2f\x42\xfb\x53\xc4\x89\xc4\xa8\x48\x1d\xca\x11\x52\x55\xd1\x58\x84\xae\xaa\x6b\x57\x27\xec\x05\x2f\xcf\x58\x5a\x69\x5f\x92\x17\xa4\x0d\xfd\xae\x44\x73\xb5\xdc\xa5\x68\xac\x38\xe6\xe8\xdb\xdd\xbf\x5e\x2a\xd8\xac\x9e\xc3\x1d\xd4\xcd\x3d\xe4\xc7\x2b\xae\xf6\x8a\xc6\x20\x11\x7e\xb1\x7e\xab\xa0\xc9\x86\x62\xbf\x8a\x26\xd4\xaa\x39\xed\xe5\xe9\x7c\x05\xa6\xa7\x68\x12\x0a\x9e\xfa\x1b\x6b\x2e\x11\x37\x8a\x26\x09\xc7\xa2\xdf\x5b\x99\x6b\x6f\x7d\xd5\x94\x55\x57\x4e\x55\xb4\x5d\x29\xc1\x96\xb0\xee\xd6\xfb\x76\x93\x5b\xef\xee\xd1\xc4\xae\xbb\xab\xa9\xd1\x31\xb8\x29\xe0\x2e\xc8\x1d\xe1\x31\x95\xbc\x73\x23\x58\xbc\x5d\x44\x1f\x94\x73\x8d\xd0\xad\x85\x2e\x91\xbf\x81\x54\x9b\x5e\x99\x03\xdf\x67\xe6\xc7\x4a\xe5\x23\xee\xff\x2e\x4f\x13\x5c\x89\xa2\x82\xf1\x30\x1d\x88\xdf\x81\xde\x95\xce\x03\xa1\x17\x37\x53\x54\xa6\x14\x0b\xae\xdf\x21\x7b\x10\xd9\xfa\xd7\xe8\xb6\x6a\xc2\xbc\x38\x14\xa2\x0a\xda\x45\xab\xbb\x4e\x1d\x72\xe4\xc4\xed\xda\x74\xbc\x12\x87\xe7\x23\x14\x4f\x80\xd4\xaf\xb1\x9c\x97\xa2\x10\x4b\x5c\xd1\x2d\x56\xa4\x8d\xdf\x2f\xdc\xcf\x14\x35\x41\xa4\xf9\x68\xfd\xfb\x56\x67\xc5\x1b\x82\x94\x2f\x42\x84\x59\x04\xb6\xa2\x26\x8e\x9c\x4c\xa2\x13\xa4\xf3\xe2\x8d\x33\x11\x41\x18\x04\x09\x1f\xba\xe1\x5e\x24\x1f\x61\x90\x24\xdc\xf3\x24\x3f\x44\x96\xb7\xe9\xfb\x1f\x80\x05\x39\x97\x4a\x8e\xbe\x3e\x0c\xd2\x14\x71\xa4\xf7\x50\x65\x28\xe1\x35\x56\xc0\x9a\x5f\x1a\xc3\x20\x15\x58\xc2\x5f\x14\x70\x28\xb3\xcf\xd6\xb8\x90\x84\x0c\x13\x83\x63\x59\xe6\x43\x64\x9b\xff\xc1\x44\xc7\x89\xab\x8e\x3d\x95\xcf\x66\xeb\x99\x2a\xfe\x38\x8d\x62\xc4\x5b\x60\xc1\xd0\x16\x7b\xad\x5b\xc2\xe6\xe9\x8f\xf5\x76\xf7\xfc\xba\xed\x46\x2a\x86\x79\xd7\xe2\x13\x0c\xb5\x0a\x29\x24\x89\xc5\x58\x3e\x0a\x3b\x75\xea\x11\xcb\x41\x85\x61\x44\x30\xef\xff\x2e\xda\x65\xaa\x5b\xd6\xc3\x90\x49\xd4\x47\x28\x15\x88\x62\xd0\x00\x51\x61\xc8\x05\x3e\xc3\x7f\x6d\xef\xbf\xad\x9e\x3d\xd0\x47\x85\xa1\x60\x88\x41\x7e\x5d\x6f\xd7\x8b\xd7\xd5\xfd\x7e\xf1\x74\xb3\xbf\x59\xff\xb1\x7e\x78\x7e\x79\x5c\x3f\xed\xfc\x05\x8d\xe3\xcd\x30\x0a\x2d\x9a\xb1\x5d\x5f\xb0\x69\xdb\xfd\xb4\x28\xb6\x15\xbd\xa6\x7c\x7b\xcb\xe1\x5e\xe4\xcd\xe0\xc5\x08\x23\x2d\xc1\x1a\xe2\x62\xcb\xcd\x27\xed\x61\x1c\x1a\xdc\x13\x17\xb2\xc6\x39\x3e\xba\xbf\x71\x6c\xa5\x70\x0a\xf8\xe9\x69\x12\x16\x88\x33\xbe\x6d\x31\xb7\xe6\xe3\xc7\xf2\x78\x09\xf5\x52\x61\x2c\xc0\x5a\xeb\xe5\x20\xbc\xca\xcb\x78\x44\x12\xe9\x54\xf7\x99\xf3\x54\x7e\xc5\x8f\x62\x21\xf6\xea\xbf\xaf\x37\xe8\x91\x71\xbb\x79\x7a\x5a\xff\xe5\x7f\x6b\x92\x28\x0c\x07\xbe\x15\x8e\xb5\x3a\x54\x5b\x99\x9c\x88\x13\xac\xbc\x7d\xc7\x0a\xcb\xdc\xc4\x4c\x14\xd8\x89\xe5\x8b\x60\x4b\x51\x77\xb3\x32\x01\x6b\x18\x64\x79\x8d\x7e\x9a\x60\x25\xbd\x1f\x12\x7a\xff\xee\xed\x51\xfc\x2c\xb2\xe2\x6d\xae\x66\xdb\x0e\xb4\x48\xf4\x6f\xdb\xa7\x8b\xd7\xea\x33\xb4\x5f\x17\xec\x85\x29\x05\x4c\xa8\x10\xf8\xbb\xa9\xb1\x6b\x83\xe8\x0e\x6c\x7b\xce\x61\x9f\x55\x98\x46\x31\xaa\x4d\xac\xca\xa2\x3e\x1d\x10\x66\x92\x0d\xb3\x5b\x3f\x0c\x2c\x83\x79\x8f\x4f\xce\xed\xa9\x9d\xe9\xd6\x05\xf8\x4f\x85\x5c\x1a\xec\x88\xde\x54\xa0\xdf\xaa\xed\x4f\x71\xdc\x96\x79\xe9\xd6\xf9\xff\x1a\xfe\x33\xe3\x01\x76\xe5\xef\xfe\xd4\x4a\xf2\xd0\x91\xb1\x6d\x07\x6e\xbe\x58\xfb\xe9\x5d\x4b\x27\x27\x95\xb1\x15\xb8\x43\xe0\xd1\xb9\x6e\x44\xde\x86\x91\x5f\xb3\x42\x7f\x87\x36\xb8\x98\xcc\x73\x15\x04\xa8\xea\xd4\xa6\x8c\xba\x12\xc6\x35\x1d\x47\x65\xb8\x50\x45\x32\x74\xf1\x4e\x1b\x2e\x39\x3c\x89\x3b\xa8\x99\x2d\xdc\x3c\x2e\x9e\xee\x17\xbb\xdd\xe2\xe9\xe5\xf5\xf9\xcf\xbf\xe8\xd3\xcd\xe2\x8f\xb5\x1f\x03\xc4\x60\xd6\x7b\x28\x35\xfc\x3a\x4e\x12\xe4\x41\xce\x15\x02\x07\x22\xba\xf4\xf8\xaf\xf2\x54\xd5\x90\x9b\x2f\x33\xc5\x6b\x15\x9a\xc4\x4a\xb2\xee\x7b\xdf\xf9\x5d\x65\x0d\x34\x47\x6f\xbc\xe1\x04\x93\xe5\xfa\x68\x5b\x15\xfd\x02\x62\x04\xa0\xf5\xdc\x12\xe0\x5b\x31\x68\xb1\xce\x2d\xec\x51\x10\xd9\xcc\xbd\xc6\x6d\xa3\x5e\x65\x48\x1b\x1c\xfd\xa4\x88\x84\x1c\x4b\x3e\x1f\x19\xfc\x0c\x9d\xae\x84\x8a\x88\x26\x88\x80\x7a\x28\xdf\x3a\x13\x95\xce\x14\x7b\x34\xdb\x22\x4a\x52\x62\xa3\x6c\x73\x2a\xf4\xb5\x46\xa8\x1b\x1c\x05\xb1\xb7\xc8\xd8\x14\xc7\x13\xb2\xc6\x3e\x65\x01\xaa\x28\x0a\x03\xe9\x40\xdc\xb7\x59\x21\xf2\x07\xab\xf7\x3a\x07\x73\x54\x51\xa4\x24\xed\x14\xc3\xb3\xb2\xf8\xd7\x49\xd8\x4e\xb4\x3f\xae\x0d\xa6\x04\x32\xd3\xf5\x5e\x95\x87\xe3\xa9\x01\xbd\x57\xa7\xaa\xeb\x4e\xa8\x88\x29\x43\x2d\x2d\x45\xff\x77\x29\x7d\xd4\xe1\x25\x1d\x67\x40\x1a\x2a\x8a\x09\x70\xd7\x1c\xc2\x06\xa0\x73\xa8\x99\xdc\xea\x58\x25\xa8\x61\x23\x3d\x05\x7e\xef\xbf\x32\xd1\x5a\xa9\xce\xb1\x6b\x00\x95\x50\x51\xca\x6d\xe1\x16\x45\x78\x9e\xcd\x4b\x2e\x0a\xb8\x0a\xae\x75\x9f\xf1\xdd\x57\x1b\x19\xb9\x3b\x85\x36\xba\x97\xab\x5b\x37\xb5\x22\x11\x5b\xf0\x97\x86\x1c\x59\xe2\x57\x42\xe6\x48\x98\x84\xf6\x66\x40\x4f\xf0\x13\xf5\x7a\x6e\x20\x9f\x78\x91\xa8\x48\x06\x0a\x37\xdd\x5b\x4c\x7a\xb0\x40\x3f\x30\x49\xec\xbf\x59\x06\x90\xb8\x75\x1a\x15\x4a\xb2\x29\xfd\x47\x45\x32\xb1\x4a\x50\x7f\x64\xf0\xb3\x83\xa4\xab\x48\xa6\x89\xb6\xcb\x6e\x95\xf9\xd7\x3b\xc2\x4c\xa3\x7d\x47\x4e\xc5\xcc\x46\x18\x29\x16\x63\x83\xc5\x96\x3e\x5e\xca\x7c\x0c\x94\x52\x91\x0e\x09\x77\x90\x74\x4c\x51\x6e\x40\xe4\xbb\xec\x30\x11\x80\x52\x91\x66\x1c\x85\x51\x90\x27\x36\xf6\x51\x55\x91\xd6\x56\xb0\xe8\x06\x0e\xa5\xaa\x84\xea\xa6\x20\x84\x06\x0b\x28\xfb\x36\x86\x76\x5b\xac\xb3\x32\xfa\xe4\xe1\x40\x6a\xc9\x1c\x05\xfc\x6a\xda\xa7\xd3\xc3\x9c\x54\x04\x5c\x31\x67\x67\x74\x14\x15\x0c\x91\x91\x93\x89\x01\x26\x24\x4e\x85\xae\xc2\xbe\x81\x7d\x59\x8f\x4e\x31\x75\x90\xd5\x46\x26\xd1\xc2\x2d\xca\x8f\xa2\x51\xef\x03\x8e\x99\x62\x41\x10\x79\x5d\x86\xcd\xea\xb9\x57\xeb\x50\x2c\xd0\x09\xb3\x0e\x63\xda\x93\x89\xae\x54\xa7\xdd\x07\x48\x1a\x60\x95\x64\x7f\xfc\x2c\xb1\x65\x6d\x9a\x93\xf6\x4a\x9c\x56\x42\x7d\x22\x8c\x30\xf9\x84\x56\x11\xe9\x9c\x15\x5f\x87\x5e\x78\x8a\x85\x51\x64\x84\x07\xb8\xec\xde\xb3\xfa\x15\xda\x45\x60\xca\x93\x69\x07\x6a\x9f\x37\x5b\xae\xf0\xaf\xa2\xf3\x23\x55\x2c\x34\x31\xb1\x11\x13\x4a\xe3\xac\x77\xf7\xe3\xb9\xc6\xa2\xd8\xa4\x88\x70\xe8\x42\x47\x16\x71\xc0\x8c\x73\xf5\xfc\xf0\xfc\xba\x5f\xbe\x3e\x7f\xf7\xc1\x28\x63\x81\x65\x6d\x2f\x8a\xa2\x3c\x15\x16\x0d\xf3\x1b\xa4\x97\x62\x8c\x58\x12\xb2\x6d\xbd\xa0\xe6\xfa\xdc\xde\xc3\x18\x4d\x2d\xb3\xc1\xb6\x3c\xbe\x5c\x76\x1b\x18\x73\xbc\x67\xd3\xae\xb3\xd9\xdf\xd0\xd1\x26\x3a\x21\x13\x37\x30\x26\x0c\xfd\x3d\x94\x28\xbc\x36\xda\x47\x99\xa9\x36\x83\x71\xcb\xf2\x5c\xc4\xc7\xe2\x08\xa4\x55\xea\x03\xf8\x1b\x96\xe7\xa3\xa8\xeb\x81\x39\x91\x1b\x95\x26\x44\x9a\xbe\xe4\x52\x5b\xcd\x97\x9b\x19\xfe\x99\xfb\x00\x0f\x38\x36\xec\x94\xff\xb9\xf3\xb2\xa6\xed\x40\xe9\xf1\xa8\x8b\x3c\x7f\x14\x98\x72\xa1\x86\x50\x37\x31\xb8\x49\x94\xb8\x82\x56\x67\x7d\x91\x2c\xfe\x87\x68\xf5\xf6\x84\xd6\x75\xfa\x66\xb1\x7b\xf1\x5f\x22\x02\xdb\xff\xde\x66\x87\xe3\xc8\x29\xad\x1b\x20\x00\x23\xb8\x87\x52\x89\xbc\x76\x0a\x45\xef\xd9\xb1\x3b\x0e\x04\xf3\x6b\xc7\x4d\x2c\x2f\x51\xa6\x83\xa7\x2a\xd3\xd0\x87\x57\x9b\xe2\x23\x6b\xc0\x22\xcf\xc7\xb7\x46\xa9\xd8\xf6\x0e\x2c\xff\x42\x57\xf0\xf6\xe5\x77\xf8\x22\xc5\x14\x58\xae\xe9\xb1\xfc\x09\x55\x9b\x0b\xcd\x6e\x4c\x63\x15\x3b\xc5\x34\x03\x24\x0e\xe0\x96\xb6\x85\xa6\xfd\xfd\x83\xdf\x0b\x81\xb5\xaf\x9c\x22\xf3\xc6\xb3\x04\xa8\xc4\xab\x7a\x74\xf0\x25\x64\x8e\xfb\xfb\x63\x62\x8d\x28\xeb\x2d\xfa\x99\x9f\xde\xd6\xbf\x1a\x27\x53\x36\x42\x50\x28\x66\x38\xc7\x9d\xe7\x09\x7e\xae\x8b\xa6\xef\x85\x7e\x0a\x01\x53\xcc\xc8\x04\x1b\xe3\x07\x0b\xe8\xb4\x66\x4f\xbf\xbd\x5d\x71\x00\x69\x10\x7b\x49\x9d\xe1\xcb\xe5\xa7\x5f\x4c\x22\x16\x38\xd7\x45\xe7\x5b\x3c\x3f\xe7\x63\x92\x5a\xf8\xaa\x3b\xfa\x6c\x9e\xfa\x3c\xcb\x0d\x09\x9d\xc8\xd8\x13\xfc\x6a\x7a\x69\x7a\x15\x87\xa9\x4d\x9c\x70\xff\x41\x25\x73\x5d\x5e\xc3\xb9\xba\x8f\x44\x51\x80\x9d\x67\x5b\xe4\x45\xf3\x7b\xef\x7e\x3a\x7b\x83\xe2\x28\x25\xf8\x4a\x0a\xd5\x9c\x44\x3e\x80\x8e\xb5\x87\x62\x15\xb9\x06\x82\x2b\x3f\x0e\x00\x4b\xaa\x5d\x23\x10\x9e\x6d\x85\x1c\x31\xc7\x19\xa8\x39\xaa\x98\x31\x2b\x9d\xe9\x55\x0b\x3b\x77\x80\x51\x02\x10\xb3\x94\x7b\xf7\x83\x07\x51\x37\xdb\xdd\x6a\xf4\x2b\x98\x21\xb8\x14\x60\x4e\x85\x95\x82\xae\x03\x18\xc7\xd4\x8a\xbc\x3c\x94\x6f\xab\x32\xcf\x61\x06\xd2\x3f\xbe\xda\x38\xa4\xd8\xf1\x45\xfb\x16\xc8\xc7\xd7\x1b\x87\xc6\x28\x0f\xc9\x3c\x15\xf5\xf7\xac\x79\xc7\x88\x69\x33\x16\x79\x56\x71\xac\x38\x8e\x34\x59\xa1\x97\x50\x77\x97\x12\xeb\x20\x72\x02\x3b\xb7\x00\xde\x16\x61\x22\x96\xa4\xe2\xd8\x50\x54\x7a\xec\x4b\x5d\xb7\x00\xae\xf6\x7d\x85\x4e\xa2\xe2\x24\x16\x98\x4c\xad\xbe\xfd\xdb\x7f\x5d\x62\x9c\x9c\x6f\x57\xee\x72\x4d\x87\xf1\x27\x53\x2a\xb5\x0b\xda\xac\x10\xd8\xa2\x17\x25\x5d\xe4\xb9\xed\x74\x8c\x7f\x61\x1a\xa6\xde\xdc\xf1\xa5\xec\xaf\x2f\x95\x0a\x01\x63\xdb\xa1\xec\xd1\x6c\xa2\x1e\x73\xc6\x30\x76\xc3\x10\xd9\x67\x1c\xbf\x2b\x19\xfb\xcf\xf2\x30\xd0\x1e\xc1\xf3\xf3\x56\xe4\xb9\x44\xa2\x0f\x8a\xa6\x59\x43\xa3\xd3\x68\x26\xf2\x76\x47\x74\x94\x57\x39\x78\x1e\x02\x8c\xb2\xda\xf4\xd9\x24\xc4\x8f\x65\x1c\xa4\xcc\xf5\x02\xca\xaa\xfd\x1e\xd4\x0d\x9f\x5f\xc3\x62\x29\x28\x56\x40\xb2\xfa\x41\x34\xb0\x9c\xf4\xab\x63\x95\x86\x18\x68\x77\x16\xcb\xbf\x45\x0e\xcc\x67\xdb\xf3\xef\xb4\xa1\xe0\x53\x31\xaf\xc8\x96\x8c\x17\x10\xa3\xa2\xd0\x01\x61\x50\xa2\x60\xb3\x7a\x9e\x95\xc1\x9b\xfc\x9a\x39\xf7\xe0\x41\xdb\xd2\x37\x98\x92\x80\x48\x91\x0e\x80\x1a\x65\xe9\xf5\x18\x55\x42\x12\x82\x75\xe6\x1e\xb8\x2a\xc8\xbd\xa8\xdf\xf7\xee\xcc\xdd\x38\x09\x18\xff\x5b\x63\x30\xac\xb5\xf6\x81\x71\x42\xc0\x22\x40\x6d\xed\xe8\x1f\x28\x33\xb6\x1f\x51\x64\x20\x37\xf2\x8f\xb6\x83\x84\x52\xae\x2c\x36\xb9\x68\x4e\x9e\xb8\xa7\x12\x9a\x18\xcc\x43\xca\x5c\xaf\xb2\x0a\xdf\xa5\xac\x78\x1b\x92\xe8\x54\x42\x95\x6d\xb8\x1c\x3b\xe7\x5a\x7f\x40\x47\x22\x1a\x34\x24\x87\x50\xa3\xd1\xe3\x75\xe3\xc3\xd0\xa0\x0a\xf2\x4f\xc8\x76\xe5\xb7\x7a\xac\x9f\xaa\x92\x90\xf1\x58\xb9\x7e\xee\x97\x31\xc8\xfc\xb3\xc9\x33\x2d\x00\x25\x51\x1a\x62\x5d\xc5\xc6\x47\xcb\xd3\xd9\x86\x48\xf3\xf7\x25\x52\x4c\x05\x9e\x33\xf6\x6c\x8c\xbf\xb6\x48\xc7\xd4\xfa\xe7\xab\x1f\xa0\x37\xc5\xb0\xf6\x91\xb0\x98\x21\xfe\x68\x71\xb3\x7a\x17\x59\x81\x22\x71\x13\x1e\xc6\x64\x4a\x77\x1f\x94\x44\xf7\x24\xb1\xe5\x79\x31\x29\x55\x24\x31\x4f\xf1\x1e\xe5\x6d\xb8\xb2\x1a\xc8\xb1\xf9\xe3\x32\x92\x0e\x75\x8a\xd9\x32\xe8\x8b\x1e\x58\x37\x7b\x13\x22\x90\xc3\x5f\xc0\xcf\xb1\xea\xe6\xe4\x1e\xa4\x89\x55\x81\x11\x52\x2a\xdb\x95\x53\x7d\xc1\x3a\x49\xb9\x91\xd4\x33\x2c\xd1\xfd\x4e\xbf\xc1\x3c\x19\x49\x25\x3c\x22\x88\x2c\x3d\x56\xd9\xdf\x70\x01\xff\x48\xb8\xb0\xd2\x5f\x15\x98\x61\x59\xc5\x1f\x55\x02\x37\xbc\x85\xd6\x13\x73\xca\xf1\x38\x11\x87\x3e\xef\xc3\x5f\x74\x19\x2b\x26\x22\x25\x91\x95\xe2\xc0\x7b\xf3\x07\x7a\xc2\x38\x07\xc5\x8e\x50\x75\xb5\xb9\xe2\x4e\xa2\x42\x26\xf9\x40\x66\x63\xdf\x40\xdd\xa7\xcf\x89\x8a\x02\x7c\x0f\xef\xc4\x01\x1e\xca\xb7\x4c\x4d\xba\x3f\x89\xe2\x80\x4d\x2d\xe8\x30\x6e\x89\x26\x90\x22\xc4\xe4\xfc\x35\xcb\x73\xa8\xa6\x1f\xd1\x21\x8d\x88\x17\x89\xdd\x67\xe5\x69\x2f\x7c\xff\xa5\x1b\xc2\x52\xdc\x0e\xb3\xba\x5d\x47\xd6\xbf\x8e\x59\xc7\xe1\x54\x89\xd6\x1c\x8b\xf7\x7b\x25\x8a\x57\xb4\x61\x9b\x5f\xd7\x13\x20\xd4\xcb\x22\x9d\x8e\xdb\x46\xa0\xa8\x7c\x1b\x13\xdc\x42\x7f\x36\x60\x01\x32\x72\x0f\xe2\x97\x17\x8b\xdc\x14\xdf\x21\xeb\x8e\x27\x71\x88\x2a\x31\xdb\xd5\xca\xff\xcd\x24\x36\x80\x5c\x18\xc8\xb3\xa1\x74\xee\xf8\xfb\x8d\xd2\x08\xde\x58\x3e\xfc\xf1\x3b\xe9\x5c\x95\x06\x46\xf3\xa0\x13\x54\xdd\x36\x17\xa8\xbf\x94\x50\x85\x46\xa2\xce\xe7\xd8\x73\x89\xda\x1d\xfe\x8b\x1f\x92\xc8\x78\x68\x8b\xd0\x5b\x34\x8e\x6f\x4d\x4a\x13\x1e\xc8\xae\x0f\xed\x81\x7e\x29\xd5\x4a\xf5\x88\x60\x5b\xad\xed\x4d\xb0\xfd\x4b\x97\x86\x14\xd0\x29\xf2\x4e\xe4\xe2\xd7\x19\x3b\x3f\x9f\x5d\x5a\xe4\xfc\x88\xad\xfb\x51\x17\xe0\xa5\x71\xa4\x91\x74\xe7\x20\x5e\x63\x01\x21\x95\xc6\xa0\x90\xdd\xf4\xf4\xf8\x99\xe2\x9b\x4a\x93\xc4\xc2\xaf\x45\x9e\x97\x3f\x3d\x54\xce\xcf\xb6\x34\x91\x14\xa3\xb9\x8d\x06\x5b\x82\x9c\xdd\x86\xd3\x94\x72\xac\x91\x3d\x0c\x65\x4b\x55\x9a\x32\x2b\xc3\xd1\x93\xab\xaf\x54\xfb\xd3\x34\xb1\x02\x28\x03\x8d\x03\x04\xd9\x8c\x9f\x61\x9a\x32\xe5\x1a\xb7\x37\xa0\x6c\xca\x3b\x19\x21\x53\xa4\x24\xed\x7d\xf6\x6f\x65\xb8\xfd\x51\x9d\xe0\xfb\xe8\xa1\xc0\x1b\xe3\x4c\x04\xd1\x4b\xe0\xf1\x7a\x3b\x72\x90\x89\xa6\x5c\x12\xe5\xde\x8b\xcd\xd3\x6a\xfd\xb4\xdb\xfc\xb1\xde\xbf\x3c\x3f\x3f\xec\x17\x37\x37\xaf\x93\xeb\x12\x41\xe8\x6d\xb0\x97\x27\x74\x7f\x98\x8b\x08\x53\x41\x63\x2c\x69\x69\xf8\x78\x44\x1c\xac\x8d\x78\x6d\xe9\x73\x7a\x8d\x22\x0a\xa4\xa7\x63\x3d\x95\x0d\xca\x37\x4e\xce\x27\x43\x82\xf5\x56\xfd\x2e\x8a\x11\x1c\x00\xb5\x92\x1d\x20\x2c\xcf\xa1\x78\x83\x2d\x72\x36\x1b\xd0\x57\x1e\xad\x4c\x03\x6f\x72\x87\x8a\xd3\x43\x5f\x09\x95\x4a\x6e\x2b\x4b\x35\x34\x6b\xef\xf5\xe7\x60\x01\x93\x5f\xd4\xe6\xd9\x5d\x35\x77\xb3\x7a\xb6\xa9\xee\xf8\xca\x74\x60\x19\xd4\xea\xbd\xac\xa1\xe7\xc3\xfa\xa3\x14\x34\x38\xd9\x4a\xd2\xfd\x31\x8c\xd1\x4d\x65\x77\xbf\x78\xfa\x8a\xa2\xec\xdd\xeb\xa8\x79\x2a\x6c\x13\xb3\xa7\x43\x9c\x7a\x41\xc0\xa1\xd8\x93\x4a\xb5\xb1\x65\xed\x3b\x0b\x9c\x9f\x10\x8f\x55\x0a\x34\x42\xe1\x4a\x65\xc5\xb8\x46\xcd\xf0\x14\x98\x41\x1a\x27\x06\x79\xbb\x93\x84\x97\x0a\x8e\x22\xeb\xee\x12\xa4\x06\x3a\x1a\xc1\x58\xa0\x5e\xa5\x00\x11\x2e\x5d\xd8\x74\x73\x0a\xab\x8b\x49\xfb\x3c\x35\xdc\x72\xae\x6e\x6c\xb9\xf7\xb2\x65\x9f\x1a\xce\x30\x9b\x6f\x7f\xc2\x0c\x40\x2b\x35\x5c\x61\xa9\x21\xab\x6b\xa7\x45\xde\x49\xc4\x7e\x9e\x18\xa6\x46\x85\x81\x25\xeb\xeb\x85\x9e\x20\xe5\x3e\x33\x8c\xb1\x1f\xe7\x41\xa2\x30\x63\x79\x10\x85\xf6\xb8\xae\xdf\x86\xb0\x3c\x90\x14\x59\xaf\x47\x71\x0e\xd8\xd8\x11\x4f\x71\xc2\x88\xf0\x62\xf8\xf3\xca\xb2\x7e\xfa\x72\x22\x35\xa6\x65\x42\xeb\xc7\xf2\x03\x2e\x36\xf4\x0e\xdb\xc9\x89\x16\x42\x79\xc4\x3c\x2e\x1b\xdb\x7e\xa3\xe3\x34\x10\x18\xcb\xb7\x1b\xfc\x56\x14\x59\x73\xc6\x05\xb7\x3b\x1c\x81\xd3\xdb\x52\x76\x35\x79\x85\x0e\x4c\xc4\x43\x6a\x05\xf4\xfd\xb2\x33\xd7\xb7\xe6\x61\x64\xd9\x8a\xa6\xac\x94\x2b\xf4\xae\x8c\x93\x0c\xf5\x0d\x5a\x1e\x26\x1a\x83\x71\x27\xf9\xf1\xb0\xdc\xef\xd6\x8b\x47\xff\x3d\x11\x65\x10\xf5\x6c\xe2\x36\x30\x1d\x83\x97\x78\x14\xca\x58\x79\xfe\x4f\x7b\xbf\x55\xb3\x42\x07\x9e\xd1\x3d\x8b\xa2\x30\x74\x60\x1c\xab\x1d\xb3\xfd\x91\x8d\x35\x24\xda\x31\xd2\x36\x01\xbd\x5e\x4a\x76\x28\x2b\x9d\x61\x67\xeb\x9f\x25\x1c\x3c\x62\x3a\xf4\x76\x0b\xcf\xc6\x5c\x18\x6d\xa6\xe3\x5d\x97\x47\x5a\xe2\xf8\xc7\xc7\xdf\xed\x99\x9c\x11\x8a\xe2\xce\xca\x62\xae\x47\x6f\x2b\x67\x84\xe1\xd4\xd2\xe5\x8b\x38\x97\xa7\x3e\xc8\xfb\x9f\x88\xf7\x09\x5e\xc4\x27\x55\x06\xce\xa2\x40\xdb\x44\x17\x55\x96\x9b\x06\x26\x8b\x1c\x67\x42\x81\x0f\x3b\xe7\x6c\x5e\x15\x8f\x05\x55\x0e\x36\xe4\xba\xeb\xea\xc7\xcc\xdb\xcc\x63\xc1\xf0\x5a\x57\xcf\xcf\xfb\xed\xfd\xe2\xd5\x77\x74\x79\x0c\xd6\x85\x4d\x42\xb3\xa9\xb7\xd0\x34\x79\x3f\x47\x53\x62\x01\x25\x6f\xd0\x2c\xb3\xfc\x4a\x4b\x81\xa7\xa9\xb0\xa0\xd8\xfa\x21\x2b\x7e\x80\x9e\xb1\xa2\x53\x9c\xd3\x48\x33\x1b\x68\x57\x96\xaf\xd0\xe3\x3c\xb8\x88\x0c\x02\x74\x71\x99\xf1\x21\xc3\x55\xe0\x33\x17\xc0\x10\x0d\xf5\xaf\x13\x54\x67\x0b\x43\x1f\x21\xcc\x26\xc3\x25\x55\x88\x44\x7f\x2c\xf5\x29\x47\xfc\x70\xf7\x8a\x5f\x29\x91\xb8\x0f\x2a\xca\x11\x14\x5d\xc0\x4f\x97\x1c\x8c\x2b\x07\x93\xd1\x40\x31\xf4\xf6\xcb\xf1\x53\xd9\x3c\x9d\x2e\xdb\x57\x7e\xb4\xa1\x28\xfc\xbd\xcd\xde\x8a\x3f\xa0\x42\x9a\xde\xdc\xc4\xd3\xa9\xed\xf0\x79\x76\xcb\x6d\x59\x21\x32\xf0\xca\xb5\x6a\x67\x23\x81\x24\x98\xbc\x6c\x7c\xdc\xc5\x21\x25\x88\x60\x6b\xaa\xec\xed\x0d\x2a\xbb\x5f\x36\x03\xef\x4d\xc5\x41\xe9\xc0\x6e\x6f\x37\xa0\xfc\xe7\x4c\x12\x24\x91\x6f\x4d\xb7\x21\x6c\xdd\xdc\x82\x77\x64\x9d\xcc\x31\x93\x48\x7c\xcd\xa1\xd0\xdb\x8b\x88\x8c\x9b\x94\x23\xf7\x7e\x65\xed\x96\x66\x9a\xae\x9f\x61\x2c\xb8\x51\x56\x8d\xfa\x28\xce\xb7\x65\xe5\xfd\xf1\x67\xef\x82\x08\xb4\xc6\x50\xb5\x79\x83\x8e\xbc\xab\x04\x09\x0c\x97\x5d\x89\xd5\xf1\x83\xc6\x25\x24\x3f\x32\x49\x18\xb3\x59\x14\x54\x56\x4a\xa7\x3b\xc2\x2d\x40\x3c\xfb\x80\x69\x34\x29\x42\x19\x45\x4e\x4d\x68\x28\xd5\x38\x7e\xf2\x22\x54\xcc\x93\xef\x6e\x44\x33\x67\x27\xa0\x44\x94\xc4\x48\x1c\x42\xaa\x42\x1b\xb7\xda\x7e\x92\x1e\xb5\x89\x27\xe7\x8d\x00\x8c\xa3\x58\x2d\x4f\x59\x3e\x21\xb1\x08\x46\x12\xed\xbb\x3c\xb8\x06\x2f\x4f\xe7\x1b\x68\x50\x5a\x6b\x3a\xd2\xa4\x74\xe0\x25\x71\x3a\xe0\x23\xeb\x39\xbc\xfd\x15\x33\xcd\x28\xeb\x9d\x51\x2c\xf6\xf1\x7e\xb3\x9a\x85\x21\x08\xa6\x05\xce\x80\x43\x56\x34\x33\x72\x1a\xfd\x69\x63\x45\xb1\x15\xb2\x29\xea\xd3\x34\x5f\x15\xb1\x49\x22\xa4\x2a\x94\x8d\x68\x4a\x07\xca\x9b\x88\xd1\x2a\x91\x44\x04\xd5\x24\x97\xff\x5e\x8d\x69\x85\xe3\x6f\x4a\x78\x88\x49\x1c\x34\xef\xb8\x6a\x6e\x7c\x5c\x2b\xd2\x48\x47\x7d\xfb\x18\x13\x51\x1b\xa9\xee\x2a\x3b\x73\x6e\x01\x1c\x1b\x2d\xeb\x12\x74\xc1\x85\xf2\x08\x91\x25\x38\x3a\xfe\xb5\x75\x4c\x70\x48\xb0\x7b\xdd\x35\x16\xb1\xaa\xdf\xc7\x88\x42\x04\x41\x1a\xba\x00\x75\xd8\x69\x16\x82\x59\x70\x7f\x3b\x81\x06\xe8\x2f\x21\x84\x80\xd8\xe7\xf2\xdf\x21\x1b\x96\xdc\x85\x10\x12\x2b\x21\x16\x92\xe3\x24\xc9\x31\xb3\xdd\xb8\x6a\xc3\x85\x96\xdb\x15\x18\xd4\x1c\xa3\x71\x72\x6d\x42\x27\xb2\xe7\x89\x3c\x66\xde\x04\x6a\x5c\xab\x73\x83\xa5\x48\x64\xc7\x2d\x5c\xbd\x8b\xea\xad\xdf\x1c\x84\x22\x1c\x57\x15\x84\x1c\x0e\xc3\x13\xa1\x42\x19\x51\xef\xb2\x6d\xc9\xc7\xdd\x21\x66\xf0\x0d\x36\x80\x64\x91\x77\x70\xf5\x86\x09\x58\x41\x68\x96\x62\x9f\xbd\xdd\x79\x3a\x89\xae\xe9\x5d\x98\x7f\x8f\xb5\xb0\xa5\x23\xab\xce\x3a\xb0\x9d\x52\x42\xeb\xd8\x73\x37\x6c\x19\x68\xaa\xd5\xf1\x69\x1c\x23\x20\x20\x18\x62\x76\x36\x8b\xb7\xa7\x42\x0d\x98\xd9\x4a\x00\x09\x71\x55\x06\x9d\x39\x9a\xcc\xe9\x92\x4f\xff\x5f\xed\xff\xf9\x1f\xf6\xbf\xfe\x33\x8c\xe3\x02\xf0\x0e\xe2\xb8\x2d\x2b\x2f\xf4\xf8\x3f\xdd\xf1\x84\x10\xe3\xde\x4e\x6b\x9a\xf9\xc9\x8b\x23\x03\xae\x71\x32\xdd\x8d\x3c\x6e\x95\x0c\x04\x43\xbe\x96\xeb\x98\x7e\x0e\x73\x90\x24\xb5\x6b\x56\x01\xa0\x6f\xb3\xb7\xf7\xa6\x4d\x21\x4e\xb9\x9f\xe7\x92\xc8\x98\xb8\xdd\xa7\x63\x6d\xcd\x74\x36\x26\x27\x05\x8e\x25\xfc\x93\x73\x45\x59\x74\xa7\xa3\xce\x2f\xb4\x16\xa2\xd3\x1a\x9f\x3f\x47\x18\x0b\xb0\x0e\x42\xff\x77\x82\x1a\x45\x18\x76\xe5\xb7\xed\xcd\x97\x39\xee\xec\xe4\xa3\x09\x4d\x55\xd7\x4e\x7f\x85\x0f\x6b\x9f\xe1\x33\xc6\xc9\x6a\x2b\x43\x6e\x95\xaf\xdf\x70\xb5\x5d\x76\x39\x9e\x0c\x55\xca\x6d\x59\x56\xe8\x75\xf3\x3e\xd6\xd5\x54\x32\x4a\x04\x96\x42\x70\xd1\xb8\x6d\x63\xfc\xad\x38\x1c\xc7\x88\x39\xc9\x22\x9e\xb8\xf0\xfc\xd9\x91\x17\xbf\x0c\xcd\xfd\xfc\xb0\x98\x23\x0f\xf3\x0e\x1a\x5b\xdc\x1b\xf2\x89\x26\x97\xc7\x44\x80\xd5\x6b\xbb\xe4\xaf\xca\x36\x48\x2f\x2e\xfb\x6e\x32\x65\x29\xd6\xae\x5e\x5e\x57\xf3\xe5\xb6\xcb\x1c\x4d\x72\x1e\x63\x25\xfa\xa1\x7c\x7b\xf4\xee\x2f\xde\x72\x7b\x7c\x76\x19\x50\xa1\xb1\xcf\x5d\x65\xff\x39\x89\xc2\x77\x17\xa4\x24\x21\x24\xfe\xad\x7c\xbd\xdf\x75\x7f\x77\x94\xd1\xed\xfd\xd3\xbf\x69\xf7\x47\x11\x63\xcb\x2a\xab\x5f\x2a\xe8\xf6\x5a\x98\x6c\x9d\x52\x02\xc5\x1a\xd0\xd3\xe6\xf1\x76\x81\xe8\xde\xf5\xee\x7e\xff\xf2\xba\xde\xf7\xb6\x10\x4a\xaa\xd4\x92\x4c\xda\x49\xf7\x8e\xb4\xae\xa1\xa5\x94\x92\x4a\x2a\x5c\x14\xf6\x47\x71\x5e\xbd\x67\xea\xfa\xbb\xa5\x0d\xc1\x80\xb5\x7d\x13\x17\xaf\xab\x2b\xa3\x20\x49\xb0\x9b\xbf\xcc\x1a\x67\x71\x24\x3a\xc6\x8a\x84\x94\x23\x68\xb9\x4b\x2c\xb0\xd4\x72\x85\xfd\x27\x41\x5a\x0a\xca\xca\xaa\x68\x4c\x25\xdb\xdc\x28\x13\x11\x54\x37\x71\x50\x99\x97\x0a\x79\x37\xe5\xaf\xf3\xe4\x76\x19\x41\xb0\x20\xfc\x7f\xa7\xb2\x81\x45\xed\x53\x5a\x15\xd0\x08\xb5\xf2\x54\x29\x2b\x51\x6d\x0e\xc7\xf6\xcd\x9a\x54\xd1\x51\xd6\x11\x05\xbb\xc4\xf1\x08\x85\xfe\x86\x0a\x10\x5b\x9c\x24\xb3\x00\x1e\x45\x12\xdb\x53\x77\x69\x2e\x52\x26\x57\x65\x9e\x8b\x06\x2a\x91\x77\x3b\xdb\xe8\x52\x14\x35\x0c\x63\x88\x9b\x4c\x01\xca\x1d\xcd\x57\x11\x55\x18\x28\xcc\x34\xe4\xe9\x8c\xed\x26\x4b\x0e\x42\x8a\xf0\x3f\x5a\xca\x55\x18\x01\xc2\xc2\xff\xce\xf2\x5c\xec\xab\x09\x2b\x5d\x45\x81\xcd\xd1\xb5\xdb\xbe\xf6\x62\xd8\xad\x57\x91\x90\x9e\xfc\xea\x55\x0d\xba\x75\x64\xdd\xe3\xb6\x14\x0b\x00\x6b\x4d\x1d\x8b\xef\xba\x74\x96\x52\x8c\x70\x04\x12\xf9\x54\x36\x3b\xc0\x80\x68\xa9\x18\x01\xc4\xdc\xff\xc8\x9a\x4b\x5c\xac\x62\x8c\x04\xae\xe9\xbe\x03\x71\x98\xd6\x7b\xfa\x35\x45\x31\x16\x25\xb6\x4d\x9b\x5b\x51\xb4\xc7\x6c\x0e\xb6\xe5\xb7\x1f\xc5\x12\x4b\x3e\xf7\x5e\xe5\x97\x78\x59\x3f\xc1\x14\x53\x56\x8c\x38\xab\x1f\x4e\xc5\x79\xc4\xec\x53\x0c\x98\x2b\xb9\x7f\x94\x3f\xb0\x62\xb1\x3c\x5b\x4d\xa7\xd9\xb7\x48\xc5\x81\xd5\x2a\xcf\x6a\x54\x8a\xb6\xa1\xf1\x97\xe9\x18\x40\xf4\xd3\xd6\x33\x36\x54\x1c\x4a\x8b\x74\xf1\x99\xec\xed\x00\x46\xa7\x62\xa1\x06\xe2\xff\xce\x76\x71\xb0\x7d\xab\x24\x15\xf8\xbe\x59\xe2\x11\x0d\xea\xf3\x41\x7a\xf1\x1a\xa5\x12\x10\x58\x58\xfb\x33\x13\xdd\x65\xa5\x1c\xac\x89\xff\x6a\x40\xec\x50\xa9\x14\xde\xa8\x6a\x79\x3a\x3b\x4b\xed\xbe\xa2\xaf\x52\x45\xd1\x46\xe2\x52\xc6\x64\x14\xe2\xb8\xd1\x3c\x0e\x71\xe3\x32\xa7\x42\x2f\x4f\xd5\x95\xd5\x49\xf1\x54\x22\xa1\xc2\xed\xf0\xeb\x3c\x3b\xb4\x1b\xc0\x95\x5c\x4c\x71\x2e\x44\x38\x74\xb8\xba\x2d\x2b\x07\xf2\xc6\x57\x6a\x72\xaf\x05\x13\xe1\x50\x02\x6c\xae\x98\xa0\x44\x6a\x62\xd7\x6e\xc5\x08\xdb\x56\xb7\x26\x83\x64\x98\xe2\x2d\x6b\xa0\x68\xde\x91\x52\xe5\x6f\x8b\x8c\xb4\xbf\x6d\x2f\xed\xba\x99\x95\xc5\xa3\xf8\xd5\x61\x77\x46\xab\x99\x92\x8c\x3b\x3f\xd3\x0f\x10\xb9\xc5\x74\x4c\x7e\xb3\xe4\x86\x3a\xe8\xec\x5e\x0c\x93\x73\x7f\x5c\xc7\xf8\x4a\x59\x80\xdf\x68\xba\xb6\xeb\x9d\xa3\xf4\xb7\xd1\xf8\xaa\x2c\x14\x1c\x9b\x3e\x69\x55\x2a\x4a\x10\x2a\xf9\x28\x9a\xf7\x2f\xa3\x6f\x6d\x17\x17\xd2\xf5\x42\x1a\x58\xf9\x02\xfc\xe4\xdb\x95\xa1\xda\x0b\x3b\x3a\x89\x8b\xa1\xb7\xae\x52\x9a\x52\x5b\xe5\x11\x07\x78\xb5\xf1\xce\x67\x68\x75\xa5\x95\x49\x03\x5f\x7c\x6e\xd3\x95\x17\x71\xaa\x41\x0f\x20\x06\x0a\x48\x80\x7d\x95\x6a\xa0\x88\x3d\x1f\xad\x29\x88\x38\x16\xb0\x0e\xe8\x14\xdb\x26\xc4\x93\xe3\x09\x20\xa8\xb2\x72\x86\x03\xed\x0b\x77\x5b\x95\x87\xef\x02\x5d\x76\xba\x62\x95\x02\x49\xf0\x41\x15\x65\x93\x99\xf3\x70\x02\xfb\x35\x46\x07\x82\x59\xda\xb9\x7b\x1d\xbe\x67\xcd\xbb\xd5\x90\xb0\x14\x99\x01\xea\x72\x7e\x3d\xd7\x81\xb1\x1e\xfe\xbb\xd7\xe7\xa7\x55\x2e\xea\x3a\x53\x9f\xd5\x0d\x35\xa5\xc4\xea\xf2\x20\xb4\xc9\xff\x56\x4d\x19\x0f\xa2\x21\x98\x68\x51\x68\xab\x6f\x36\xa3\xb2\xa3\x74\x98\x30\x62\x0d\x6e\x7f\x5e\x94\xae\xa6\xfb\x4f\xaf\xe1\xf2\x0f\xe1\x30\xfe\x3b\x4c\x80\xef\x94\x40\x3e\xc3\x0c\x42\x5c\x47\xc4\x60\x91\x1c\x1b\x2d\xab\xf2\x70\x84\xa6\x57\x00\xbf\xa6\xeb\x95\x06\xa3\xb5\xbb\x3d\x89\xb6\xaf\x13\x96\xf8\x6c\xe1\xce\x07\x64\x3a\xa2\xdc\x93\xd6\xdb\xe9\xd4\xab\xb8\x8c\x7f\x6b\x94\x44\x48\xae\xf8\xfb\x87\xef\xf7\x3b\x60\xc2\x55\xe7\xa0\xbe\x38\x3f\x8b\xc7\xb9\xf8\x2f\xff\x45\x9a\x62\x1b\xed\xd7\x7c\xdf\x56\x47\x46\x5b\x3a\x8c\xf8\x75\x27\x0e\x7d\xc7\x5c\xb3\x30\x41\x79\xd2\x4e\xc9\xf0\x77\xfa\x20\xb3\x99\xf7\xf0\x7f\xbb\x3b\xc8\xb4\xf2\xf2\xe3\x4f\xf0\xcb\x36\x16\x5c\xd7\x51\x2f\x61\x36\xc1\xd6\xb1\xf2\xce\x23\xa0\xb7\x59\xf1\x96\x5b\x65\xd0\x41\xac\xa1\x93\x00\x12\xea\x2c\x1c\xb2\x06\xeb\x11\xdd\x74\x4d\x59\x1a\x75\x65\x85\x36\x4d\x56\xef\xdd\x26\xa3\x53\xa6\x95\x4b\x76\xbf\x67\xce\x46\x75\x3a\x81\x53\xa9\xb1\xda\xb9\x11\xc5\x60\xff\xd2\xa9\x96\x08\x4d\x40\xf8\xcd\xe7\xd3\x93\x07\x80\x22\x26\xeb\xc5\x3f\x4c\x26\xb4\xa0\x02\x27\xc9\x56\x18\xeb\x11\x3f\x57\x69\xd3\x22\x8a\x90\xcf\x9f\x97\xe5\x8f\xd3\xf1\xb5\x3c\x8b\xbc\x99\x20\xce\xb4\x24\x56\x33\xdd\xab\xb0\x43\xd5\x64\x26\x53\x23\xa4\xa7\x1f\xaa\x53\x67\xad\xde\xf1\x08\xfc\xc5\xaa\xd4\x5a\x36\xd5\x65\xd7\x0d\xd7\x4a\x6a\x4c\x33\x11\xfa\x3a\xd4\xbb\xd0\x4a\x0b\xf0\xee\x1e\x2e\x2c\xb7\x35\xc0\x07\xd1\xfe\xc9\xa7\x95\x4f\xe5\xd0\x9e\x52\x69\x88\x42\xdd\xab\x55\xdb\x98\xf6\x51\xfc\x42\xd6\xf4\x97\x49\xa1\xb5\xfb\x48\x8c\x53\x75\xb9\x78\xfa\xfa\xb4\xf6\x09\x93\x36\x21\xc1\x29\x63\x9d\x2d\xce\xa2\xfb\xbb\x24\x30\x6e\x79\xdf\xdf\x8e\xef\x17\x04\x41\x8a\x41\xa2\x13\x3f\x38\x3d\x8a\xfa\xc7\x95\xd4\x03\x02\x26\xb1\xdf\x2b\xcb\xaa\xb8\x15\x07\xd0\xed\xea\x32\xbf\xf1\x40\x10\x07\x78\x73\x9d\xbf\xe0\x16\xa1\xb0\x6e\xc7\x1a\x39\x8a\xfa\xf1\xd2\xfa\x56\x5b\x52\xf7\x65\x19\xee\xea\xcb\xf8\xe9\x1e\x00\x81\xb4\x38\x12\x57\xd1\x9a\x7c\x29\x21\xf6\x09\x54\xd9\xdb\x7b\x13\x8f\x8d\x50\x15\x90\xd4\x72\x09\x2a\xa4\xb1\x7f\xdb\x4e\xc0\xae\x40\x99\xc0\x34\xb5\x38\x1d\x9c\x36\x82\x7f\xcf\x80\x0a\xeb\x78\x85\xfd\xb1\xb2\xda\x17\xf0\xb3\x3b\x04\x01\x38\x0f\xf9\x07\x51\x37\xbb\x9f\xe5\xe2\x20\x45\x5d\x0b\x5d\x56\x57\x04\xa1\x80\x9a\x10\x15\xb9\x2c\x7f\xad\x7e\x3e\x14\xd9\x4d\x1f\x25\xbb\x41\x21\x00\x92\x9f\xfc\xc3\x5e\x1f\x8e\xd9\x54\x7d\x07\x22\x16\x60\x1b\x5d\xa0\x26\xe7\xbb\xe8\x7e\x56\x64\x88\x87\x71\xdd\x89\xba\x33\x90\xbc\xec\x1c\x00\x0b\xad\x3a\x15\xd2\x6a\x7e\x65\x87\xd3\xc1\x5a\x9f\x1e\xa0\x68\xd0\xf8\xd6\x27\xb6\xc0\xd2\xc4\x1a\x3c\x61\x38\xb0\x6d\x73\xc4\x29\xf8\x01\x62\x2e\x71\x29\xfb\xb6\xbd\xd9\x6f\x9e\xda\x64\xdd\x7f\x3a\x89\xac\xf8\xc8\xb1\x2a\x9b\x52\x75\x21\x37\x24\x9c\x61\x37\x7c\x0b\x95\xcc\xc4\x47\xbd\xac\xc4\xdf\x59\x7f\x54\x82\x17\x3e\xff\x56\x64\xff\x77\x82\xed\x11\xc3\xc0\x61\x75\x15\x04\x4b\x9c\x9d\x5d\x5e\xfe\xbc\x3d\x15\x6a\x24\x0b\x35\xd4\xf5\x02\x21\x68\xe8\x92\xa8\x8e\xea\xee\x03\xd1\xc9\xca\x09\x42\x47\xd2\xf4\x8a\xc5\x8e\x2d\xe6\x0e\x2a\x4e\x50\x48\xc6\x32\x26\xb0\x1a\x5d\x67\x6f\xe3\x90\x79\xba\xa7\x81\xd2\x01\x56\x17\x3d\x0d\xdd\x71\xb9\xbb\x73\x02\x43\xbc\x34\x4e\x3e\x8c\xae\x97\x42\xfd\xe8\x0c\x8d\x15\x28\x13\x63\x86\xb5\xcf\x8a\x0f\xa8\xea\x49\x00\x0f\x5a\x04\xde\x6a\x13\xf7\x97\x76\xf7\x1e\x2d\x38\x00\x69\x92\x78\x55\xb4\x49\x28\x0d\x20\x84\x37\x30\xdb\x95\x5a\x9c\x71\x71\x1b\xf7\x9c\x01\xb4\xc4\xe4\x5d\x0d\x89\x87\xe3\xd3\x18\x62\x2d\x52\x7f\x1d\x41\x35\xe5\x6e\x77\x4b\x86\x4b\x31\x18\x6a\xf9\xba\xab\xf5\xea\x49\x9c\x8f\xe7\x4c\x8b\x2b\x40\x45\x30\x42\xc7\x6e\xb7\x5d\x64\xd5\xba\xd0\xcd\x85\xd4\x0e\x18\x61\x88\x53\xc0\x69\xb7\xd5\x7a\x5d\xe8\x4b\x41\x1e\x13\x28\x82\xb1\x4d\xd5\x41\xaa\x0c\xe1\x1c\xe5\x75\x6c\xcb\xdb\x51\x38\xa7\xc9\xfb\x3f\xfc\xd7\x9f\x52\x59\xe6\xfe\x43\xf9\x76\x0b\xb0\xfe\x10\xea\x34\xb3\x4f\x19\x1a\x04\xd8\x0e\x86\xe2\xcd\x89\x8e\xf7\x37\xd8\x50\x9a\x5a\x92\xde\xd3\xd3\xee\xc6\xd7\xb7\x4c\x18\x5a\xa5\xc2\x2e\x66\xb5\x34\x64\xd0\x83\x2e\xc8\x3f\xfb\x8d\x21\x8b\x51\x94\xfd\x66\xbd\x22\xac\xa7\x98\xf9\xa3\x09\x60\xf6\xbc\x29\x4c\x59\x1d\x5e\x41\x9e\x26\x04\x4a\x13\x72\x6b\xc9\xb0\xcb\xd4\x4e\xa8\x5d\xf9\xb9\xdc\xa5\x32\xa1\x20\x98\x43\x09\xad\x5f\x5f\x17\xe3\xc5\xc2\x84\x10\xa7\xb6\x09\xef\xee\xc2\xfa\x57\xbb\x20\xce\xaf\x9a\x26\xe2\x0a\xeb\x8e\x0e\x56\x33\xe0\xf8\x99\x48\xdb\x9a\x80\xb2\xe4\x88\xb1\x5a\x84\x61\x89\x92\x56\xa0\xb3\x5d\x05\x27\x37\x9c\x69\x89\x5a\x16\x15\xa8\xea\x94\x35\xf7\x50\x95\xfe\x50\x22\x13\x04\x3c\xd7\xb9\xa8\xdf\x3b\xc7\x85\x1f\x30\x15\x11\x18\x5f\x71\xa2\x39\x22\x22\x8f\xb9\x38\x2f\x0a\x7d\x9b\x15\x59\xfd\xfe\xdf\x42\xfd\x38\x96\xbf\xb5\xa0\x71\xa7\x48\x83\x28\x74\xa2\x8b\x6d\x04\xde\x17\xa6\x4d\x4a\x18\x36\x0a\xc4\xf1\xf8\x5d\xd4\x8f\x62\x0a\xf7\x30\x3c\xb0\x3c\xa0\x75\x1b\x98\x9a\x1e\x2e\x67\x38\x15\xb8\x53\xf4\x5c\x8c\xe5\x40\xa6\xe0\x7a\x71\xc8\x70\xc3\xa0\xb7\x24\xdb\xa2\x42\x8b\x73\x1a\x73\x23\x44\x6a\x2d\x09\x50\xee\xca\x62\xbd\x3d\x22\xf3\x75\xf0\x90\x84\x90\x48\x29\x3e\x20\x6a\xee\x60\x99\xe6\xb3\xa5\x11\xff\x01\x48\x10\x02\xe3\x87\x7d\x2b\x7a\x4b\xda\x76\x61\xdc\x95\x16\xde\x35\x5b\x32\x35\x32\x0c\xd2\x81\x4e\x15\x16\xd7\xfd\x56\x66\x64\xa2\x90\xd5\x64\xc3\xa4\x97\xf2\x78\xca\x45\x35\x84\x44\x8e\x7f\x89\x8e\x75\x84\x56\x63\xab\xfb\xfd\xc3\xc3\x1f\xfb\xdb\xcd\xed\xc2\x3b\x1c\x2b\xa3\x53\x8e\x7b\xd4\x3e\x2b\xd4\x30\x90\x34\x5a\x28\xec\x79\x6c\x77\x8b\xd7\xdd\xe6\xe9\x6e\xff\xb2\x58\x6d\x6e\x37\x5b\x1f\xe8\x19\x88\x05\x5a\xe5\x34\x4e\x92\x1e\xa1\x03\x70\x3a\xec\x27\x5a\x61\xa6\x5d\xae\xac\xf4\x95\x95\x07\x5f\xb6\x53\xab\x82\xee\x7a\x8c\xa0\x44\xf5\xfe\xb0\x7a\xd3\xc0\xc1\x4d\x71\x1d\x04\x01\xb7\xc5\xdf\x3e\xcb\xdd\x95\x36\x9b\xa7\x01\x49\xbb\x61\x29\x47\x39\x0e\xbf\x97\x5d\x25\xb1\x0c\xef\xb3\x0e\x02\x21\x3b\x49\xea\x75\x6e\x56\xe5\xe1\x70\x2a\xb2\xe6\x3c\x3d\x8d\x1b\x4e\x28\xc5\x2e\xfe\xd1\xe2\x84\x9d\xcc\xcc\xef\x50\x46\xb3\x2f\x4a\x7b\x32\xdb\xe8\xf0\x31\xd2\x63\x56\x34\x5f\xa1\x67\xa8\x8d\x07\x87\x01\xd6\xd8\x5e\x5e\xd7\xdb\xc5\xc3\x7a\x8f\x4f\x65\xff\x7d\xbd\xfe\x1a\xfa\x5b\x10\x4a\x82\xd3\xa2\x71\xbf\xca\xfd\x39\x8a\x54\x60\x15\x69\x8f\xe2\x84\x02\x9e\x70\x38\xf6\xbc\x1c\x1d\x44\x9c\x58\xd1\x64\x71\xfc\x9e\x69\x8f\xff\xd6\x01\x23\x96\x39\x70\x0f\x45\x75\x7e\xcc\x8a\xec\x9f\x25\x50\x3a\x60\x94\x2a\x27\x7a\xb4\x77\x24\xd2\x3d\x7a\xfa\xd6\xfb\x83\xf8\xf5\x65\x7c\x17\x18\x4d\xb1\xe8\xef\x13\xf2\xbd\x4d\xf0\x7d\xd1\x4d\x07\x4c\x68\xa4\x74\x3c\x3d\x3c\xf8\x3f\xc5\x34\x88\xbc\xf2\xa4\x7d\xa3\x16\x15\x74\xf0\x9f\x36\x2a\x42\xeb\xa4\xbe\x23\x8e\x06\x2b\x51\xe8\xfa\x72\x6d\xc2\xbb\xf5\x2d\xd2\x6e\xa2\x25\xc4\x12\xe9\x5c\xb2\xb6\x55\xe5\xe9\x58\x5e\xa9\x65\xe9\x20\x11\xc0\x7d\x05\x35\xd3\x1e\x0f\x31\x9e\x2d\x69\xac\x71\x09\xf6\xb9\xbc\xf3\x80\xf1\x47\x39\xb7\x09\x64\x76\xc8\x9a\x75\xa1\xfb\x2d\x41\x07\x29\x80\xf1\xd2\x78\xcf\xaf\x73\xa0\x08\x1d\x70\xc9\x71\x45\xda\xc1\x6a\x10\xa3\xe8\x80\xab\x18\x5b\xbc\x88\x82\x9f\xc9\x5d\xe6\x27\xa3\x08\x25\x8a\x8a\x22\xb7\x64\x79\x1e\x92\xff\x74\x20\x98\xf1\xaa\x6d\xc8\x4f\x59\x8d\x0e\x26\x21\x96\x15\x70\x19\xe8\xc8\xb7\x59\x59\x60\xb9\xa7\x2f\xee\xe9\x40\x08\x8d\xe5\xf0\x23\x22\xaf\x50\xe1\xe0\xb9\xb8\x50\x7e\xd6\x81\x80\x08\xc3\xf0\x45\xfd\x0e\xa3\x4b\x93\xa1\xe6\xd2\x21\xa5\x3c\xfc\x73\xfc\x51\x19\x49\xaf\xb7\xf5\xe7\x8b\x5f\x5b\xe7\xef\x9f\x94\xd6\xeb\xf1\x71\xf3\xb4\x79\xfc\xf6\xb8\x5f\x3d\x3f\xed\x5e\x37\xcb\x6f\xbb\xcd\xf3\x93\xff\x42\x25\x00\xc3\x7b\xbc\x2b\x43\x7f\x2a\x1d\x28\x93\x60\x1a\x84\x6c\x7e\x6b\x8b\x34\xbc\xb3\xb6\x88\x45\xfc\xed\xd5\x01\xc1\xd7\xf7\x5d\x7c\x80\x6e\x6f\xd2\x0d\x7c\xf4\x05\x0d\x1d\x68\x9a\x20\x95\xef\xff\x7a\x64\x5a\x27\x21\x10\xd2\xff\x21\xe4\x7f\xfd\xc0\x50\x29\x33\x70\xa4\xd8\x75\x18\x12\x1d\xe8\x34\x41\xd0\xf2\xc3\xbf\xff\xdd\xfd\x49\x87\xca\xb1\x11\x96\xdf\xbe\x5d\x54\xb9\xc6\x73\x00\x18\xb1\xe6\xd1\xb5\x93\x68\x2d\xfe\x75\x82\x13\x4c\xee\x5b\x1b\xa8\x87\xae\xde\x63\x4d\x46\x2d\xef\xc8\x7f\xa5\x89\x82\x50\x78\x1b\xda\x85\xd6\x0b\x75\x51\x1c\xd7\x81\x69\xa3\xdf\x76\x7f\xbb\x26\x5b\xa5\x03\xa3\x02\x6c\x53\x7e\x94\x0d\xd4\x7f\x75\xef\x0d\x09\x28\x61\x08\x6d\xac\x84\x15\x51\xa9\x2f\xb9\x31\xc3\xe5\x88\x04\x4e\x42\xaa\x6e\x63\x00\x74\x7b\x3f\xdf\xe6\xe2\x6d\x84\xc0\x76\x43\x09\x11\x18\x4f\x21\x02\x7a\x57\xfe\xd8\x96\xb9\xbf\x2e\x42\xb8\x8e\xac\x02\xd8\x1b\xe4\xed\xb3\xfb\xc3\xcf\x05\x42\x09\xb5\x89\x85\x33\x85\x41\xc7\xbe\xac\x2c\x90\x30\xaa\xb2\xe3\x85\x84\xad\x26\x54\x48\x81\x48\xa5\xc7\xd5\x50\x41\x5e\x93\x30\xb2\xca\x99\x2b\xaf\x87\x5d\xf7\x47\x42\x08\x3c\x6e\x7a\xb0\x5a\x90\x50\xf3\x84\xfa\x0e\x98\xbe\x05\x98\x0d\x04\x34\x09\x41\x58\xb2\x19\xfe\xcc\x36\x10\x7c\xa9\xca\xff\x80\x6a\xc3\x8b\xf1\xf3\x21\x51\x9c\xa0\x12\x26\x5a\xd3\x5b\xc5\x80\x49\x51\x5c\x93\x88\xcb\xb0\x83\xb6\x56\xb0\x29\x9a\xfa\x4b\x0f\x20\xe9\xbf\x96\x51\x8d\x69\xdb\xf1\x54\xbf\x2f\xdb\x6f\x59\x54\x95\x98\xe7\x6f\x68\xc2\xa2\x00\x31\x18\xed\x0d\x5e\xf6\x01\xfc\xf8\x35\x27\x8c\x27\x88\xf3\x92\xa7\xf3\x4d\x25\xde\x26\x59\x8a\x26\x4c\x50\x14\xd4\x78\x28\xdf\xda\xfd\x0e\xe6\x1d\x94\x34\x61\xd2\x9a\x56\x3b\x9c\x32\xd6\x82\x5c\x27\xcf\x8d\x88\x8d\x4e\x6d\x1a\x97\xe7\x37\x22\xfb\xb4\xd8\xa8\x49\x12\xc7\x3e\x87\xdd\x82\xaa\xa0\x99\xfc\xae\x94\x5a\x27\x34\x57\x84\x68\xf7\xa7\xf1\xe5\x8b\x48\x7a\x5d\x8e\x0b\xdf\x36\x4d\x44\x92\xc4\xac\x73\xe2\x3b\x43\x65\xf5\x41\x2d\xfc\xca\x09\x82\x6a\x22\x15\xc7\x56\x83\x3c\x9d\xbf\x9f\x7e\x65\xe2\x51\xf4\x4c\x30\x4d\x54\x68\xad\x6f\xeb\x7b\x51\xdf\x94\x3f\x8b\xf6\xf5\xba\x6c\x4a\x8f\xbf\x57\xa5\x01\xe2\x13\x31\x52\x39\x96\xd5\xf4\xb2\x94\x88\xc0\x29\x25\xdf\x9d\xda\xf7\x71\x74\x54\x13\x96\x0c\x6b\x41\xb7\x00\xa3\x34\x46\x13\x4d\xa9\xab\xed\xa3\xed\x5d\x59\xd4\xde\x8e\x35\x8e\xc6\xef\xb2\xa6\x56\xb7\x45\x89\x06\xde\xca\x2a\x53\x22\xc7\x87\x56\x4f\xee\xa3\x4e\xe3\xd0\xa1\x9b\x95\x28\x4e\x35\x54\xa7\x62\x72\x33\xb5\x31\x68\x2d\xde\x79\x45\x5c\x4a\xab\x74\x5d\x69\x4d\x20\x96\x2c\xf6\x2f\xdf\xea\x12\xcc\xad\x09\x08\x93\xa4\x1d\x67\xab\x12\x55\x6f\x48\xa8\x89\xd1\x86\xf6\x52\x1d\xe3\x5f\x42\x03\xc2\xfd\xac\x41\x2c\x49\xfb\x66\xa2\x22\xd9\x6c\x91\x42\x53\xc2\x84\xb6\xa2\x55\x4d\x1b\xe8\xcd\x57\x48\x35\x25\x31\xc1\x1d\xaa\x2a\xf3\x79\x4e\x82\xa6\x34\x66\xa8\xe8\xe6\x4c\x04\xf6\xcf\xb7\xfb\xd5\xfd\xf3\x66\xe5\xbd\x03\x34\xa5\x89\x51\xce\x3a\xca\xa2\x18\x07\x57\x45\xa9\x0c\x23\x37\x1f\x17\xc7\xa3\xcb\x67\xb4\xdf\xb5\xdc\xa0\x48\x48\x8b\x80\xcf\xcb\x1a\x16\x3d\x5a\x0e\x87\xf7\x26\x2d\x7e\xb4\x26\xb8\x94\x56\x1f\xbe\x4a\xea\x0f\x18\x86\xa7\xb1\xd9\xc6\xf2\xbc\x6c\xd4\xee\xd7\x90\x60\xad\x29\x8b\x25\x2e\x5a\xa3\xfc\x6d\x7c\x4f\x58\x4a\x02\x87\x0b\xf3\xfc\xa7\xee\x08\x4d\xc4\x8c\x47\xd3\xb3\x79\x2e\x60\xf1\x06\x85\x3a\x4f\x1e\x1b\xe3\x1a\xdf\xc6\x7d\xbb\x36\xac\x44\xbb\x5c\xa3\x2e\xc4\xef\xb2\x80\xc9\x59\x84\xc1\x5f\x54\x01\x82\x18\xf1\xad\x77\x87\x62\x9d\x5a\xeb\x01\xe8\xe8\xa9\x33\xb4\x65\x3f\x18\x24\xd6\x46\x40\xbf\xc1\x4b\xf6\xd6\x66\xa8\x77\xfe\x44\x09\xb5\x37\x66\x27\x60\x10\x74\xd0\x94\x04\xc8\xdb\x43\x2f\x80\xac\xf6\x48\x80\xc9\x65\xa6\x29\x70\x1b\xdf\x0d\x73\x72\x4d\x53\x6d\xdd\x86\xd6\xab\xdd\xef\x73\x02\xca\xd3\x94\xf5\x4d\xe7\xdc\x3a\xf3\xf9\x63\x82\xe2\xcb\xea\xe1\xac\xf7\x65\xae\x51\x4a\x66\x68\x35\x30\xbe\x5a\x11\x70\x12\x0c\x44\x4f\x3d\x8c\xb3\x7e\xe9\xc8\x4e\x9a\x0a\x13\x3b\x51\x0a\xef\x85\xef\x04\x0d\x6f\xb3\x42\x74\x77\x41\xa5\x0a\x8b\xfd\xaf\x95\x1a\x6e\xc4\x54\x71\x8a\xca\xa3\xb2\xca\xf4\x1b\x3c\x95\x7a\x22\x69\xae\x69\x3b\xe3\x70\x6f\x10\x39\xa0\x5d\xd7\x5a\x54\xf9\x79\x99\x55\x7a\x5d\xe8\x41\x2e\xad\xa9\x0e\x4d\xe4\x0a\xc1\x5f\xe1\xdc\xf5\x60\x4e\x1d\x37\xa0\x7b\x5b\xb4\x92\xb4\x03\x87\xce\x79\x2c\xb9\x71\x20\x52\x5c\x03\x7c\x6e\xd1\xd5\x83\x67\xbd\x50\x26\x2b\x83\x09\x23\x4c\x5e\xf0\x55\x6c\x17\xb3\x1c\x1a\xf0\x30\x14\x4d\x4d\x42\x71\xc1\x5e\x89\x2a\x1b\xde\x92\x30\x08\xac\x72\xeb\xc9\x8b\x14\x41\x3d\x93\x61\xf8\xc1\xce\x4a\xe9\x5e\xd4\x77\x65\xe9\x58\x60\xfe\x3a\xc3\x40\x5b\xc9\x2b\x1f\xa3\x5b\xe9\x9d\x31\x14\x43\x87\x01\x0c\x9e\xa0\x7b\x78\x9f\x29\xe2\xe9\x90\x50\x22\xc3\x5e\x05\x41\xbb\x82\x41\x07\xe2\xd0\x21\x49\x2c\x08\xe8\x59\x35\xa7\x7a\x74\x79\x34\xb4\x56\x1d\x0f\xa5\xd7\x5d\xb2\x4b\x9a\x38\x3a\xff\xe4\xb9\xf0\x32\x0c\x09\xe7\xae\x84\xd0\x26\x3b\xdf\xb3\x42\x97\x3f\xc7\xd3\x35\x0c\x23\x46\xb9\x7b\xc9\xab\x4c\xd9\x7a\xfd\xf8\x52\xa3\x54\x62\x7f\xc2\x6e\x47\x63\xdb\x83\xc9\x35\x32\x27\x84\x60\x67\xd3\xe4\xd5\x08\x99\xe4\x58\x06\x5d\xbc\xfe\xe9\xca\x14\xfe\xfa\x62\x02\x2e\x07\xc6\xe8\x23\x7b\x6b\xd7\xde\x69\x58\x17\xc6\xc4\x9a\x14\x62\xce\x63\xef\xf5\x85\x7f\x9c\x0e\x13\xa6\x85\x2f\x36\x3c\x8a\x1f\xb0\x69\x6e\x45\xd6\xdd\xe3\xc4\x30\xea\x02\x82\xc5\x5b\x56\xbc\x5d\x54\xb5\x75\x98\x4a\x6b\x49\xd5\x55\x85\x31\xa9\x7c\x36\xbe\x7f\xd3\x14\xb5\xcf\x3f\x66\xb7\xb7\x30\x75\xce\x3d\x73\x88\xa3\x01\x3c\x49\x87\x3c\xb2\x64\xb4\x7a\x22\x2a\xa7\x43\x1e\x33\xb4\x1b\x90\xa7\x33\x54\x8b\x09\xf0\x78\x74\x8a\x84\x22\x09\xe9\x76\xb1\xdc\x8c\xa6\x0c\xe7\xae\xa7\x8e\xdc\xd5\x2f\x33\x68\x81\xd1\x7f\x5e\x3d\xf0\xcf\xff\xd3\x3f\x26\xc1\x34\x68\xb7\xa0\xbe\xa0\x14\x86\x6f\x0f\xe8\x50\x18\x6b\x1f\xea\x17\x87\x07\x38\x94\x45\x33\x8c\x56\xda\x6c\x3f\x48\x07\x0c\xf3\x6d\x7d\x9c\xd1\xb1\xf0\xf9\x6b\x28\x35\x31\xa9\x23\x14\xd8\x39\xe1\xa4\xe9\xfb\x19\xa1\x1c\xb6\xe2\xbf\x4f\x7f\x67\x56\x66\x78\xbc\xc3\x86\x9a\xd1\xd0\x11\xc6\xe8\xb3\x99\x4c\x07\x1d\x33\xec\x48\x1d\xc4\xaf\xa1\x92\x53\xf7\xd9\x24\x40\x2c\x92\x55\x74\x6f\xae\xa1\xc3\x27\x53\x44\xa7\x0c\xd3\x84\x3b\x51\x88\xa9\xd0\xfb\xec\xb2\x1a\x6a\x30\x58\x59\x2a\xab\xf3\xdf\xc2\x7f\x39\x98\x34\x71\xf1\x59\x1b\x49\xe6\x59\xdd\x38\x73\xca\xf1\x87\x4d\x00\x38\x4b\x84\x93\x50\xfa\x07\x1e\x86\x3a\x34\x3a\x65\xdc\x25\x18\xb7\x27\xf5\xc3\x3f\xa1\x28\xa2\x02\x2c\x5a\xea\x5b\xfb\x3c\xbe\x0c\x81\x1d\xa3\x53\x44\x51\x02\x3e\xd8\xb5\x4d\x7e\x8c\x22\x8f\xe2\x38\x69\x70\xea\x28\x52\x56\x2e\xa0\x7d\x67\x1e\x5d\xfc\xba\x28\xf4\x76\x00\xb1\x7b\x82\x9f\xb8\x75\xa9\x77\xd1\x45\x0a\x51\x64\x08\x3e\x3a\x5c\x87\x51\x2c\xb0\xab\xa0\xeb\x88\x25\x54\x5a\xe4\x64\x37\xbd\x22\x06\x14\x83\x03\xf4\xb9\x11\x39\x0d\xc7\x36\xe6\x3a\x8a\x13\x43\x69\xbf\x86\xb5\xe7\x5c\x37\xef\xf3\xaf\x7a\x94\xd0\x04\x2b\xcd\x03\x45\xba\x4f\x37\xb8\x28\x61\x11\x82\x33\x0f\xfb\x76\xc2\x7a\xf8\x94\x8e\x92\x24\x41\x78\x19\x5e\xc7\x5d\x59\xba\x18\xb3\x8b\x1e\x3e\x7f\x56\x51\xa2\x12\xef\xab\x8c\xf7\xce\x81\xbe\xdd\x51\x9e\x12\xdc\x1d\x6f\x44\x0e\xe5\xc8\x81\x55\x47\x5c\xe9\xc4\x95\x6d\x3a\x8b\x0b\xbf\x17\x46\x5c\x0b\x4c\xf9\xeb\xa6\x3c\x3a\x85\xac\x7e\xea\x47\x82\x6a\x7c\xba\xe8\x9d\xaf\xca\x01\x9f\x7a\xf2\xeb\x74\x1a\x78\xbf\x9a\xbe\xea\x30\xd1\x13\x9e\xd1\x11\x6c\x3f\x08\x08\x53\x39\x15\x7e\x35\x58\xd4\x37\xce\xbf\xcd\xff\x0a\x88\x02\xd7\xed\xba\x75\x51\x5a\x77\xdd\xc0\x12\x04\x76\xbc\x3e\x3f\xac\x6d\x4f\x78\xbf\x7a\x5d\x2f\x3a\x53\x7d\x1d\x81\x20\xd2\xc1\x0c\xb0\x49\x70\x5b\x56\xcf\xce\x43\xd8\x0d\x61\x01\x0b\x88\xbb\xca\xa7\x72\xde\x04\x4f\xb3\xa0\x5d\xb5\x90\x2f\xbb\x85\xf6\x2e\xdd\x64\x35\x2a\xce\x22\x23\xf1\xb5\x1c\xb4\xa8\x66\x0b\x20\x8c\x18\x6b\x3a\x57\xdb\x46\x03\x4a\xec\x5d\xb2\xd3\x34\xa3\x84\xa0\xa4\x3e\x6e\x81\x7b\xa7\x46\xe9\xaf\x97\x51\x41\x8c\x3b\xcb\xb6\xa9\xb2\x1f\x63\x12\xfc\xe4\x2b\x43\x2e\x43\xe6\x4c\x29\x9b\x17\x28\xda\xc0\x76\xb4\xc0\x8d\x1e\x05\x0b\x25\x75\xcb\xf2\x47\xf9\x03\x5c\x75\x6b\x8e\x36\xaa\x19\x23\x69\xdc\xde\x8c\xf7\xb2\xaa\x01\xd5\x17\x6c\xc1\x7b\xfc\xfd\x2c\xb4\xf4\xdd\x6e\xf6\x88\xea\xec\x80\xe8\xd7\x9c\xdd\xae\x2a\xee\x69\xc6\x98\x93\xb6\x47\xf5\x95\xb2\x9a\x7e\x59\x42\xd0\xaf\x78\x3f\xb2\x54\x9b\x5c\x22\x93\x31\xb2\xdb\x9b\xf7\xac\xd2\x7d\x8b\x4d\xb3\x58\xa8\xc4\x6a\xc7\x2f\x1e\xd6\x7f\x76\x7f\x95\x0a\x91\x24\x4b\x51\xfc\xa8\xca\xcc\xff\x39\x89\xc2\xd4\x93\x21\xe1\x70\xaa\x2a\xf1\x06\xb7\x48\xba\x69\x13\xb5\xf1\xcf\x4a\x52\xe9\x44\x0f\x1a\x91\x23\x7e\xcd\xc3\x64\x35\x4b\x03\x0a\x74\x40\x83\xb6\xa0\xa8\xf1\xe7\xb9\xb2\xfd\x36\xff\x76\x74\xab\xc4\xdc\x2d\xe2\x9a\x20\xb2\x4f\x63\xf9\x7d\x36\x64\x64\x82\x52\xe6\x80\x2f\xd9\x9b\x4f\x4a\x9c\x90\xd5\xf8\x66\xa9\x28\xc2\xb2\xc3\xd1\x42\xd1\xfd\x5f\xd3\x08\xfb\xec\x59\x6d\xb5\x2b\x46\x49\x3d\x53\xca\xf5\x81\x2a\xa1\xc1\x59\x64\x74\x9f\x04\x8b\x48\xc7\x02\xe7\xd8\x93\xde\x8d\xd0\x4e\x7b\x19\x1f\x71\x7b\x7a\xdf\x5f\x62\x3a\x4d\x11\x92\xfa\xb0\xfb\xeb\xae\xfb\x1b\x00\xe2\xf3\xd6\x77\x77\x68\x49\x7b\xbf\xd8\xad\xee\xf7\x64\xf7\xed\x75\xe7\x09\x2e\x9a\x41\x64\xb0\xed\xbe\xac\xca\xdb\xac\x1e\x18\xd3\x6a\x66\x42\xab\xad\x5e\xc0\xaf\xc6\x97\x93\x6b\x8b\x55\xd9\x76\xf1\x0c\x33\xa9\xc6\x95\xcd\x94\xd5\x4f\x51\x69\xe4\xdc\x95\xae\x08\xe3\x40\x2b\xe3\x27\x66\x44\xc0\xdc\x2b\xba\xa8\x40\x5c\x49\x16\xe2\x80\x44\x08\x1a\xb9\xcd\x7e\x81\x5e\x41\x96\x0f\x10\xa3\xd3\xa1\x12\xd0\x97\x64\xb3\x7a\x9e\xf5\x30\xd0\x71\x00\x56\x9c\xa2\x1a\x69\x2a\x8c\xe1\xb5\xc3\x59\x10\x07\xa0\x53\xe6\xa7\xf0\xc7\xea\xd4\x38\x88\xd3\x14\xdb\xae\x63\x12\x45\xf8\x66\x2c\xf4\x87\x28\x14\xb4\x8b\xe8\x1f\xa5\xfa\x9d\x16\x91\x8e\x29\x4d\x70\x1d\x13\xa3\x5f\x34\x9e\xbd\x7e\x68\x02\xdc\xd2\x19\x76\xd5\x19\x5c\xe3\x7f\xa2\x3d\xa2\x63\x2a\x53\x2c\xf8\x64\x75\x1b\xf3\x57\x75\xd7\x45\x43\x4f\xa3\x31\x4e\x70\x76\xaf\x89\x43\x95\x24\x12\xdb\x7d\x7f\x8b\x4a\xbf\xc2\x31\x17\xed\x05\x0d\x41\x78\x17\x9f\x30\xc2\xb7\xf0\xb3\x5f\x90\xf7\x6f\xa8\x2b\xde\xfb\x20\x35\x8e\x12\xe2\x6f\xe8\x52\xd4\x90\x67\xc5\x4c\x09\x28\x8e\x12\x1d\x76\x78\x2b\x67\xd0\x8e\x61\x8a\xca\x8e\xe2\x5a\xce\x15\x47\x52\x79\xc0\x6e\x47\x28\xf4\xd4\x9a\x4e\x65\x4a\xc7\x2c\xe0\xf8\x66\xbf\x6c\xf6\xeb\x9b\xcd\x6e\x1f\x76\x07\x62\x89\xeb\xd5\x21\x2b\xbe\x43\xd6\x83\xd4\xfc\xf1\x38\xd2\xb1\xe8\x44\x29\xdb\x9f\x5d\x5f\xc2\xa3\xdd\xd8\x24\x10\x28\x84\x63\x79\x8a\xb6\x12\x7c\xa9\x0f\xa9\xe3\x24\x24\xd8\xc1\x7f\x38\xe9\xd3\x61\x18\x8e\xc4\x69\x6a\xf5\xa5\xd6\xcd\xfb\xcb\xb9\x12\x87\xae\x66\x12\xa7\xca\xb8\x70\xb4\xd0\x03\x6e\x8a\x8e\x39\xa1\xc4\x51\x85\x6e\x4a\x75\x3a\x5c\x0d\x2e\xfc\x78\x25\x70\xce\xfe\xd4\x1e\x17\x30\x0d\xda\x7d\x2a\x13\x73\xb0\x37\xad\xb6\x24\x83\x97\xaa\x6c\xc3\x31\x1f\x2a\xc6\x82\xda\xb0\xfa\x60\x39\xe5\xcb\xd3\xb8\x3b\x19\x8b\x58\x47\xb6\x2b\xe8\xe2\x6e\x04\xed\x7e\x56\x25\x88\x45\x6c\x50\xb8\xe8\x58\x95\xbf\xce\x17\x40\x8e\xd9\x64\x72\x7c\x75\x92\x59\x31\x97\x37\x68\x5c\xa3\xb8\x77\x53\xb4\x3e\xa0\xfe\xd7\x29\x96\xa2\x00\x52\x56\xf7\x85\xcf\xcd\x6a\xf1\xe2\x38\xef\x53\x6c\xed\xe4\x87\x2a\x65\xbd\x1e\x1d\xd4\xe3\x42\x9f\x43\xc7\x4a\xa7\xe8\xd9\x85\x1e\xe8\x8b\xdd\xe6\xf9\x69\xbf\xdd\x2d\xbe\xae\xbf\xf4\xc7\xb5\xcd\x71\x8d\x79\x69\xba\x9f\x05\x2c\x06\x3b\x9f\x8b\x33\x5a\x07\xd4\x4f\xe5\x2b\x34\x6d\x2e\xfd\x8f\xd0\x0b\xb1\xa1\x91\x8e\xbc\x15\xff\xa1\xf6\x70\x83\x24\xa0\x04\x03\x7b\x54\x23\xfe\x9a\x79\x17\x50\x9d\x04\x31\x0b\x5c\x08\xbc\xcd\x1a\xb8\xe2\xff\xa8\x93\x40\x5a\x09\xd5\xa5\x68\x9a\x1c\x9e\xcd\x2e\x6b\x44\x31\x2a\xd4\x24\x81\x0a\xd4\x50\xc6\x66\x57\xfa\x92\xef\xe7\x01\x7c\x42\x82\x14\x58\x6f\xc2\xf6\x50\x0e\xb0\xd8\xfe\x4d\x73\xe4\x67\xfb\x2f\x8d\xfe\xd7\x7f\x94\x24\xce\x7b\xaf\xd0\x16\xda\x3c\x3f\xb7\xda\x81\x78\x63\x50\x03\xe2\xb5\x3d\xbf\xff\xd9\x84\x69\xae\xf1\xca\xd4\x0f\x5d\x76\x53\x24\x21\x86\x20\x44\xdd\xc6\xce\xce\x6d\x9f\xee\x57\x8b\x17\x3f\x82\x72\xea\x65\xde\xdc\xbc\xb1\xaf\x40\xbb\x0b\x4e\x53\x22\xff\x11\x61\x69\x74\x1a\xf4\x49\x35\xa3\xe5\x61\xf2\x83\xa9\x49\x31\xc6\xb0\x02\xfe\x7f\x4c\x44\x58\x75\x12\x46\x32\x0c\xbc\xfc\xde\x63\x56\xa0\xfb\xc5\x6c\x4f\x3d\x09\x55\x80\x12\x6e\x87\xac\x68\xbe\x67\xcd\xfb\xd4\xf3\x66\xbe\x06\x9e\x44\x09\xc7\xae\x57\x56\xdf\x54\xd9\x07\xfc\x7d\x76\xcb\xb2\xad\x76\x23\xce\xb8\x57\x15\xd4\x49\x94\x12\x6c\x47\x1d\xca\x22\x1b\xf0\x87\x07\xed\x9a\x24\x32\x1a\x45\x99\xef\xf2\x52\x8a\x7c\x57\x9e\xaa\xd1\x04\x62\x2c\x0c\x3d\x65\x7d\x1a\xcd\x0d\xea\x3e\x09\x4b\x02\x0c\xf5\x75\xb9\x1c\xbc\x19\xfe\xa0\xb1\xb1\x4f\x7b\x92\xae\x2a\xe9\x8e\xc5\x01\x51\x81\xcf\xc5\xea\x32\xff\x18\x55\xda\xa6\xc5\x9c\x24\x09\x78\x60\x0b\xb2\xd9\xdb\xdb\x21\x1b\x27\x8f\x49\x12\x47\x2c\x71\x25\x82\xe5\xd3\x6e\xf2\x33\x52\x97\xd3\xe3\x1e\x3a\x95\x37\x19\xdf\x67\x4e\x53\xec\x0c\x22\xca\x80\xec\x4d\xa1\xbe\x74\x47\x38\x92\x78\x76\x37\xf3\x01\xc5\x70\xff\x49\x04\x63\x08\x2d\x7e\x39\xc9\xaf\x70\xbe\x17\xf5\xfb\xee\x7c\x84\x1e\x03\xd1\x8d\x33\x76\x0a\x16\x58\xe7\x7e\x36\x9e\x82\xd4\xdd\x25\xc9\x68\xe4\x36\xc5\xf6\x25\x6e\x44\x3e\x24\x98\xe9\x44\x69\x65\x5c\xe5\xee\xe1\xe1\x8f\x3d\xe8\xac\xd9\xa7\xa3\x9e\x4f\xa2\x8c\x41\x05\x88\x8e\x99\x55\x89\xe3\xb1\x17\x1a\x5d\x5c\xb0\xea\x74\xa2\xa9\xc5\x8c\xe3\xb7\xbe\x54\x30\x54\x90\xd5\x89\x16\x86\xdb\x25\xc2\x96\xe0\x45\x56\x7d\xa2\x20\xe0\x3e\x04\x4c\x82\x6b\x47\xac\xf2\x53\x07\x12\x49\x20\xb1\x6a\x84\xa7\x1a\xaa\xbb\xaa\xfc\x59\xbf\x94\x65\x3e\xfe\x3e\x48\x05\x3e\x5c\x0f\x3b\xb2\xc0\xf4\xee\x16\x81\x12\x48\x24\xbe\xfd\xf6\x74\xb3\x79\xba\xdb\xaf\x9f\x6e\xf6\xbb\xcd\xe3\x7a\xbb\x5b\x3c\x76\xcb\x83\xa1\x31\x38\x99\xac\xcd\x8b\x7f\x33\xa7\x52\x1c\xe3\x5f\x6c\x20\xc6\xae\xce\x3d\xe4\x59\xe9\xbf\x2d\x0d\x02\x22\xfa\xed\xa6\x7d\xd7\xb3\xe2\xcd\x99\xfd\x8c\x66\x5d\x1a\x70\xab\x17\x7f\xb4\x08\x82\xbd\xd5\x62\xed\xce\xa3\xc2\xc8\x46\x28\xb2\x0d\x51\x1c\x23\x61\x7a\x0a\xc5\x7d\x09\xc8\xfd\xe6\xe5\x79\xa3\x27\x83\x88\x20\xca\xc9\x62\xaf\x72\x71\xd8\x4d\xf1\x63\x29\x11\xb6\x49\xb6\x7c\xd9\x2f\x76\xf7\xeb\xa7\xcd\xc2\xa3\x77\x52\x02\xd4\xf7\x2e\x77\xa2\xf8\x81\x13\x6c\x2d\xaa\x02\xf4\xa8\xfe\x92\x12\x63\xbb\xa0\xb5\x30\x1d\x8a\x6c\xf5\x9e\xe5\x17\xa2\x9b\xf3\x91\x81\x3b\x0b\xa5\x31\x61\x5d\x04\x77\x5b\x56\x8b\x0a\x9d\x87\x6d\xef\xc0\xb1\x4d\x26\x3f\x3e\x64\x16\xab\x05\xa7\xaa\x74\x06\x85\x93\x01\x89\x09\x1d\x1e\xc0\x4a\x39\xec\x20\xcf\xa7\x29\x75\x1a\x2a\xc5\x59\x6f\xa6\xbf\x2d\xc4\xb1\x7e\x2f\x9b\x4e\xe2\xe6\xf1\x94\x4f\xcb\xfc\x69\x44\x8d\xd0\xae\xe8\x64\xdd\x1d\xfd\x6d\x8b\x84\xa5\x9a\xa8\xaa\x7d\xe1\xe6\x70\xc2\x3a\x65\x91\xd1\x2e\xfe\x71\x45\x98\xae\xc8\x96\x32\x6e\x30\x36\x42\x47\xf6\xee\x8f\x22\xc1\x15\xee\x8f\x72\x46\x06\xba\x5f\xb8\xd3\x38\x48\x91\x23\x8a\x9a\x76\xcf\xa7\x6e\x46\xc5\x51\x1a\xb9\x8c\xce\xa5\x49\xdf\x0a\x6b\xfe\x89\x50\xbf\x45\xbb\x6c\x80\x7e\x81\xca\xa9\x42\x8e\x7f\x6e\x1c\x07\xd2\x7d\xba\xb3\x30\x72\xd7\x35\x1e\x67\x84\x88\x87\x9c\xe3\x5d\x79\x97\x7d\xfc\xde\x44\xf3\xb3\x7f\x2f\x04\xc3\x27\xb7\x32\x71\xb0\x4d\xcb\xe0\x77\xc2\x3a\xbb\x72\x09\x36\x1c\xbb\xd6\x5f\x4b\xd3\x30\xc4\x55\xf8\x88\x17\xdc\x3e\xc2\xdd\xf3\xfe\x67\x97\x8a\xa4\x3c\x4d\x10\x9e\x63\xdf\xe5\x45\xa1\xef\xa0\x99\xb8\xdb\xeb\x54\x24\x06\x01\x30\x7f\x3c\x2c\x6d\x77\x17\x9d\x1c\x27\xd3\x4b\x28\xf0\xcb\xcb\xe9\x78\x0d\x60\xeb\xc6\x4a\x22\x11\xb8\x7c\xc8\x7e\x61\x5b\x79\x3e\xc8\x4b\xa5\x8e\x50\x83\x7f\xe7\xa9\xc0\x36\xe1\x04\x3d\x71\x3a\xf9\x3c\x08\x4d\x55\x68\x17\xbe\xa3\xcb\xc4\xf4\x44\xf4\x5d\x23\x48\x41\x74\x98\x27\x47\x63\x76\xcb\x0d\x9d\x8e\x65\x01\x96\x17\x2d\xd4\xf8\x5b\x91\xa9\xb2\xf2\x9b\x70\xaa\x39\x45\x48\x66\xf3\x0e\x1d\xa4\x5d\xa7\x40\x41\xa0\xc6\x90\x90\x79\xf9\xb3\xfb\x6b\xc4\xb0\xfc\xdc\xbc\xc3\x5d\x95\x4d\x27\x23\x30\x8d\x09\x2d\x1c\xa0\x42\x5c\xc1\x40\x7b\xfa\xd3\xb2\x76\x6a\xa8\xd0\xc3\xbe\xce\x28\xe6\x48\x4d\x92\xe0\xab\x73\xb7\x5e\x93\x20\xe8\xfe\xca\x99\xb5\x53\xb7\x85\xe5\x9b\xea\xf4\x36\x89\xda\x78\xc0\x85\xe6\x1e\xb5\x04\x7a\x51\x38\x87\x88\xb9\x04\x9e\x93\x34\x40\xce\xca\xeb\xaf\xf5\xe2\x61\x87\x1a\x94\x39\x8c\xa5\xb6\x34\x27\x3c\x24\x56\x82\xa6\x78\x7b\xe8\xfb\xe0\x9c\x40\x1a\x38\x09\x7e\xdc\x54\x57\x65\xf5\xcf\xb4\x8d\x74\x1b\x00\xbb\x22\x5c\xbb\xdf\xcc\x79\x28\x68\x4e\x93\x20\xf6\x56\xa8\x95\x98\xa6\x4a\x9c\x26\xd6\xc4\xee\x20\x7e\xb9\x4a\xec\x58\x1b\x47\x73\x9a\x0a\xe3\x6d\x91\x44\x27\x27\xa4\x39\xe5\x04\x25\xfa\xb2\xfa\x01\xde\x44\xbe\x68\x1a\xe1\xa4\x93\x66\x7e\xa8\x22\xd8\x74\x6a\xa0\x6e\x7c\xad\xbc\x3b\x8f\x02\x6c\x2f\xd9\x76\x21\xf6\x59\xee\x41\xe0\x7e\x3f\xd8\x4a\x38\x35\xda\x84\xc3\xe6\x7e\x5d\x4f\x4b\x5c\x3c\x4c\x58\x0a\x63\x40\x78\x97\xf4\xf1\x10\x04\x52\x6b\xdb\xd0\xf4\x16\xe0\xe9\x74\x70\x1a\x3e\xdd\x71\x85\x6f\xe9\xb1\x2c\xf3\xef\xc3\x9d\x9b\x47\x01\xc3\xc8\xd8\x6a\x7d\x2d\x4e\x4d\x59\x65\x5a\xe8\x75\x3b\x77\xca\x4a\x8c\xbd\xbd\x34\x8f\x78\x8c\xe5\x6d\xf0\x8c\x0d\x84\x20\xf4\x98\x5f\x1e\x71\x6b\xd8\x7c\x33\xf9\xf9\x2c\x36\xa4\x13\xa2\x9d\x66\xe0\x7e\x8c\xa1\x11\x73\x71\xef\x0f\x98\x54\x75\x79\x12\xeb\xc4\x5a\xaa\x7f\x20\xd5\xf5\x70\xc8\xea\xba\xef\x9b\xf0\x24\x89\x2d\xec\x6c\x48\x22\xed\x8e\x69\x2c\x54\x63\x19\x14\x75\x5c\xf2\xb2\x9e\xa2\x0f\x78\x0a\xb6\x5f\xbe\x77\x37\x63\x2e\xe5\xe1\xa9\x89\x20\xec\x52\xb3\x95\xa8\x74\x7d\x03\x06\x3a\x06\x8f\xe6\x3c\x0a\x90\xc1\x63\x97\x95\x57\x68\x44\xd6\x11\x6f\x35\xe7\xcc\x20\x6d\xce\x07\xb0\x8b\x42\xdf\x8e\x40\x62\x93\xe9\xc5\x25\xc5\xde\x2e\x14\x1a\xbd\xd6\xdc\x9f\x45\x22\xb1\xd4\x87\x65\xdb\x17\xa8\x9c\xbf\x9e\x0d\x3e\xae\xa4\xda\x5c\xe8\x20\x85\xee\xb7\xf7\x45\xa9\xee\x7d\x10\x46\x75\x39\x7b\x23\xde\xfa\x4d\x9e\xcb\x28\xe2\xd2\x27\x38\x1f\x50\x9c\x00\xab\xc9\x56\xa0\xa3\x87\x4a\x8d\xaa\x26\x5c\xa7\x8c\xa8\xce\xcc\x15\xdf\x30\x5c\x69\x76\xe5\x42\xf5\x98\x4b\x0e\x31\x44\xc9\xc0\xa2\x70\xb3\x7a\x1e\x6a\x3d\x6b\x0e\xa9\xc0\x47\xbf\x7a\xbc\xbb\x23\x74\xeb\xfc\x34\xfe\x21\x3d\x81\x83\xb1\x4a\x21\x0f\xe5\xdb\x4b\xbb\x69\x58\x3a\xf0\x30\x73\xe1\x26\xe4\xb8\x68\x5a\x8f\xd0\xc9\xe4\x31\xdc\x32\xe5\x9c\x58\xfc\xac\xd1\x91\x1d\x2a\x82\x90\x73\x57\xbb\x7c\x12\x4d\xf6\x01\xaf\x70\x3c\x35\xe2\xb2\xf1\x23\x08\x63\x58\x03\xb0\x8c\x4c\x2b\x1b\xd6\xa7\x80\x82\xc4\x10\xd9\x85\xa9\x12\x6d\xc2\x35\x43\x49\xd7\x82\x70\x4b\xbf\xab\xf1\x1c\xed\xa2\x51\x0d\xdc\x72\xb5\x20\x90\x50\xb7\x2a\xb4\x73\xfe\x25\x17\xe3\x4a\x9a\xa0\x82\x0a\xe2\x9a\x55\xd5\x47\xef\xa4\x05\xdd\x00\x0d\x48\xd0\xfa\xbe\xfe\xfd\x7d\x16\xd4\x28\xe4\xcc\xce\x02\x34\x66\x22\x68\x11\xea\x24\x74\x26\x4c\xbb\x72\x28\xba\x3e\xad\x18\x8a\x28\xd6\x68\x62\xd9\xff\xc2\x3f\x15\xe4\x93\x5b\x1a\xe9\x50\x71\xdf\xec\x1d\x52\x16\x44\xa4\x6d\x2d\xa7\x80\x9f\x96\xf1\x33\x29\x9e\x08\x96\x5a\x47\x53\x84\xe4\x35\xfd\x72\x26\x98\x92\xac\xb3\x8f\xec\xfe\x68\x34\xca\xbd\xda\x7a\x6c\xd7\x66\x1b\xed\xce\x22\x8e\x01\xd9\xf2\xbd\x0b\xd2\x1c\x8c\x4f\x24\x71\x8a\x19\x01\xae\xdc\x55\x79\x98\x18\x67\x5c\x99\x67\x89\x0e\x50\x34\x11\x3b\x5c\x98\xba\xf4\x4e\x1b\xe3\x91\x69\x40\x31\x2a\x04\x4b\x35\xc5\x70\xf3\xb2\x6c\xe6\x07\x33\x1a\xb9\x37\xc5\x7a\x4e\xba\x54\x70\x28\x62\xe7\x87\x26\x16\x39\xef\x4e\x74\x7b\x2a\xf4\x4b\x2e\x1a\x53\x56\xbe\x8b\x23\x52\xc1\x50\x06\xa4\xc0\x37\x01\x37\xbf\xf7\x76\x2a\x4f\x4e\x64\x28\xee\x28\x7b\xf4\xec\x42\xfd\x82\x8b\x84\x47\x70\xa2\x11\x34\x79\x2a\xfc\xc6\xd8\xe9\x11\x6a\xc1\x65\xe2\xe1\xf0\xf7\x90\xe7\xbe\xfc\x26\x84\xb0\xc2\x77\xf7\xcf\xdf\xb6\xeb\xfd\xfa\xe6\x6e\xdd\x1d\x31\x81\xa0\x7e\xe2\x7d\xe6\x0c\xe4\xc6\xcb\x30\x45\x5d\x9e\xe5\xf3\xd3\xb7\x2d\xd9\x3f\x6c\x1e\x37\xbe\x0d\x24\x54\x60\x1d\x65\xef\x30\x63\x1b\x71\xbd\xb5\x50\x89\xa5\xf2\x3a\x14\x64\x0f\x81\xf5\x03\x34\xa3\x26\x72\x32\xb1\xd1\xe4\xa2\x21\xd4\xd6\xfa\xa4\xcd\x75\x1e\x4e\xea\xc7\xd8\xb1\x61\xfc\x13\xc1\x61\x84\x47\xfa\x94\xbf\x49\x63\xfc\x47\x79\x88\xb5\xa0\x7d\xdd\x66\x22\x76\x96\x8e\xfb\x3b\xb3\x2f\xf1\x85\xf3\x8d\x3f\x9d\x8e\x2c\xaf\xca\x55\xe7\x71\x9f\xb0\x3a\x77\x73\x2a\x5d\x5a\x98\x20\xd5\xbc\x97\x50\xdc\x36\x70\x38\x8a\x2b\x5d\x70\x61\x22\xed\xf9\x30\xbb\xf2\x84\xcc\xd6\xa2\x19\x74\x95\x85\x61\x01\x9a\x42\xd9\x6a\x8e\xcf\x13\xae\xd6\xfa\x47\xbf\x5d\x06\x54\x63\x71\x7d\x97\xbd\x9d\x44\xc1\x06\x9d\x4b\x19\xa4\x04\x1b\x36\x76\x75\xa1\xdd\x9f\x21\x0d\x5d\xa5\xf6\x92\xeb\xe0\xc6\x10\xca\xb1\xa8\x6f\x45\xf8\xbd\xb7\xee\x5e\x75\x5d\x69\x49\x94\xc2\x1e\xf9\xcb\xb7\xe5\xc3\x66\x85\x6a\x81\xdb\x3d\xd9\xbf\x2e\x76\x7e\xce\x4a\x1a\x5a\xf9\x47\xe9\x93\x7c\x2c\x6f\x7c\x2b\x94\x55\x8e\x5d\x95\xe5\x8f\x0c\xba\xc1\x31\xc1\xfa\xd4\xbb\xa8\x86\xa6\x62\xfe\x70\xc4\x25\xd6\xa0\xd0\x1c\xc8\x0a\xfb\x5f\xc9\x3a\x65\xa4\x85\x75\x88\x75\xeb\x8b\x65\x74\x62\xc4\x37\x5c\xfc\x25\x23\x96\xca\x7b\xf7\xf8\xaf\xdf\xf6\x29\x25\x23\x29\xc6\xbb\x7e\xd1\xca\xc6\xed\x2a\xc9\x22\xc5\x87\x68\xdf\xad\x8d\xde\xc7\x0b\xa8\x7f\xff\x25\x4b\x38\x46\x54\x6d\x38\xfa\x50\x76\x40\x5f\x19\x2b\x82\xe6\x84\x9b\xed\xf0\x39\x26\x24\xc5\x76\x20\x16\xbc\xc6\xfa\xe2\x5a\x26\x69\xa8\x9c\x66\xff\x3d\xd6\x90\x1d\x61\x66\xfe\xa5\x93\x49\x2a\x42\x17\xb8\x58\x7e\xf2\x4c\x36\x2d\x13\x35\xb0\x40\xf5\x33\xb6\x0d\x22\xda\xc7\x78\x0b\xdd\x33\x4b\x03\x16\x7a\x7e\x82\x0b\x35\xe6\xa0\xd0\x32\x35\x29\xd6\x36\xd6\x0f\x8b\xdf\xa8\xd1\x6b\xc9\x63\x16\x9a\xc1\x8d\x1c\x7a\xed\x6b\xc9\x93\x08\x81\x92\x56\x5d\xce\xde\xe9\x61\xad\x52\x72\x45\xc2\x5e\x43\xe3\xa5\xcc\x33\x87\xb5\x70\x71\x93\x94\x3c\x48\x85\xb7\x01\x5c\xe4\xb9\x7b\x85\xfd\xe7\xa5\x04\x8f\xda\xbe\x05\xd8\x4d\xad\x71\xb4\x54\xd4\x68\xe2\x25\x8a\x7e\x7a\xd1\x84\xcf\xdf\x51\x9d\xd8\xfb\xd9\xee\x17\xa2\x7e\xcf\xae\xe8\x67\x6b\xa9\x8d\x40\x2e\x38\x12\x4c\x45\x8e\xf4\x39\xaf\x2a\xe2\x86\x40\x28\x5d\x7f\xc8\xa1\x01\xb6\x4d\x25\x1a\x78\xeb\xee\x00\xc4\x0a\x57\x93\xbd\xb3\xe3\x47\x36\xc4\xb5\x65\x71\xf4\xf5\x2a\x20\x14\x41\x6c\xab\xff\x76\xfe\x43\x5a\x05\x89\x4d\x07\x8f\x99\x2a\x8f\xf5\x3e\xab\xf7\xe0\x44\x4b\xdd\x00\xa2\x22\x64\x86\x60\x2e\x29\xb2\xdc\x4a\x7d\xb5\x6f\xf0\x8b\x40\x21\x3c\x71\x80\xa7\xb2\xcf\x35\x14\x15\xd4\x9a\x87\x3c\xae\x56\xeb\xd7\x15\x0d\x3e\x9b\x0e\x2a\x0a\xac\x7b\xc5\xcf\x7e\x49\xb8\x81\x0f\xc8\xcb\x23\x54\xf5\xaa\x2b\xbe\xa9\x28\xa4\xd8\x21\x5a\xdc\xbe\xe2\x14\xfc\x07\x67\x66\x61\xe2\x02\xdf\x9b\x13\xe4\x64\xfc\x9c\x55\xa4\x62\x61\xb1\x12\x28\xbb\x89\xcd\x9d\xf1\xdd\x8a\x85\xc1\xa7\xfa\xad\xd6\x3d\x53\xfe\xa3\x0d\x68\x67\xd7\x25\x15\x03\xc5\xfe\x7c\x59\x38\xa5\xb7\x09\x4a\xad\xdd\x79\x69\xda\x77\x91\x77\xa2\x42\xcf\x24\xa1\xde\x07\x63\x42\x66\xd9\x45\xed\xf4\x7d\x18\x70\xde\xdc\xf1\x94\x05\xb8\xa9\x3a\x4d\x95\xf6\x75\xab\xed\x23\xd1\x9b\xa2\x81\x1e\xeb\xaa\xd2\x94\x9b\xb8\xdf\xc3\x6e\xb2\x5a\x9e\xaa\x1a\x2e\x6b\x16\x8a\x47\x56\x26\x70\x2b\x8e\x19\x8c\x82\x7e\xc5\x19\x49\x2d\x0f\xb6\xce\xde\x8a\xae\x0b\x31\x67\xdc\xa3\x15\x77\xed\x55\x5c\xff\x75\x25\x0e\xdd\x59\x1c\xf3\x62\x99\xe5\xb9\x2c\xfb\xee\x8a\x12\x01\xc3\xf8\x58\x64\xd5\x6d\x55\x1e\x5f\x4a\x6f\xa0\xae\x95\x60\x56\x8c\xf9\x54\xeb\x17\xa8\xd6\x5d\x6a\xa6\x44\x22\x02\x2b\x91\x8c\xc5\xb1\xc7\x4e\x0d\xc1\x0f\x90\x94\xe1\x4e\xd3\x6d\x4b\x74\xaa\xa4\x3a\x79\x2d\xa4\x73\xe2\x56\xed\xcd\xbc\xcd\xb3\xe3\xb1\x7f\x1e\x9a\x31\xeb\xa1\x24\x4f\x67\x94\x2c\x1b\xa8\x02\xfa\x21\x71\x84\x2c\x68\x9b\x5c\x2f\x0a\xbd\x2e\x74\xf9\xf3\x66\x7e\x81\x56\x9a\x73\x44\x4e\xec\x11\x22\x22\xff\xbe\x10\x81\x9f\x8e\x37\x40\xe8\x48\x77\xa2\x83\xc4\xfc\x13\x70\xaf\x32\x49\xca\xbd\x37\xec\x10\x14\x7c\x53\x16\xdd\x2d\x35\x5a\x08\x3d\xd0\x29\x2c\xce\xd3\x5a\xbd\x32\x26\x32\x5d\x01\xd6\xc3\xd4\xb2\xe2\x0d\xf1\xa7\xc5\x74\x2a\xe8\x80\x59\xae\xda\x1b\x34\x9b\x83\x13\x9f\x7d\xb0\x80\xe5\xe1\xcf\xf4\xb8\x19\x4d\xa2\x34\x70\xbf\x72\x89\x64\x97\xc9\xf9\x08\x24\x68\xb1\xfe\xd7\x5f\xcb\xe1\xfc\xd4\x04\xac\x09\xe2\x1b\x34\x48\x8a\x6d\x63\x4d\x5b\x24\xf1\x23\x28\x91\x81\x55\xc3\x46\x2a\x4f\xfb\x4a\x65\xc5\xdb\x28\x99\xd7\xa1\x22\xdc\x65\x0e\x03\x58\xcc\x28\x62\xd2\x11\x4d\x1d\x2c\xb2\xbd\x47\xf7\xa3\xe0\xd1\x0f\x49\x34\x86\xd6\xdf\x9d\x6e\x9e\xff\xb3\xa1\x9c\x7a\x83\x34\x57\xfc\xde\x42\x9e\x7b\x07\x07\x3f\x8e\x09\x45\x23\x7c\x0d\x3f\x60\x7c\x00\x28\x02\xbf\x94\x28\xd6\xed\x4c\x1e\x72\x72\xdc\x90\x38\x0e\x70\x96\x64\x85\xc2\xdc\xab\x82\x49\xab\x58\xc7\xdc\x16\x5a\x44\xa7\xae\xf5\x58\x6a\x3f\x03\x74\xac\x20\x71\x8f\xf7\xd5\xa3\x3c\x26\xbb\xbc\x4e\x22\x26\xa5\x67\x55\xb7\xf1\xcf\x3f\x99\x7f\x3a\x89\x12\x04\xbc\x76\x6f\xe3\xd7\xf3\x6a\x57\x2e\xc1\x71\x1d\x26\x05\x2f\x9d\xe8\x58\x13\x27\x17\x79\x3a\x1e\xbb\xaa\xa0\x4e\x20\x8a\x86\x85\x67\x91\x7b\xd6\x90\x1f\x91\x3a\x43\xcc\x1a\x0a\xed\xfd\xf7\xfc\x31\x1e\x30\xfc\xf4\xe3\x62\x37\x88\xbc\xb4\x48\x09\x56\x83\xb0\xfe\x66\xcd\xa9\xd1\x92\xe0\x37\xdb\xe9\x7c\xd6\xd2\x26\x65\xb8\x36\xef\x8f\x0e\x8d\x86\xb5\x36\x93\x5d\x31\xef\x6f\x3f\xc0\xb0\x5f\xf7\x08\x3a\x53\xe2\x7c\x2a\x1e\xb2\xe2\xc7\x67\x9b\x9a\x96\x11\xb5\xd1\x8d\x5d\xfe\x1d\x03\x62\x70\xa1\x8a\x0b\xac\xec\xbb\x2e\xbc\xed\x77\x5f\xdc\x65\x65\x52\xe2\xaa\x6e\x7b\x0d\x22\x6f\xf3\xac\x8b\x06\xab\x86\x38\xb0\xfd\x06\xdf\x90\x2c\xaf\x78\xb7\x68\x0d\x3c\xc0\xc0\xf6\xb6\x44\x98\x42\xcf\x02\x73\xc7\x0d\xa3\x88\x76\x02\x51\xe5\x67\x07\x18\xc1\x2c\xac\x1b\x90\x70\x2a\x1d\x2e\xda\xe1\xb2\xef\x44\x8d\xca\xdf\xe3\x5f\x05\x01\xa5\xd8\x6e\xd7\x55\x79\x5c\x14\xea\xbd\x9c\x45\xe2\x41\x10\x19\xac\x81\x8b\x53\xf3\x5e\x56\xed\x36\xec\xbd\x01\x11\xf4\x67\x79\x5c\x64\x2c\x98\xe0\x3f\x0a\xca\xea\xb0\xdf\xaf\xbf\x3f\x3f\xdc\x92\xe0\xcf\x71\xfe\x70\xed\xdf\x6b\xb9\xed\x04\xdd\x31\xbe\x1c\x42\x1d\x9e\xb1\xe8\x1b\x9d\xd7\xe1\xcf\x40\xb4\x42\xad\xa0\x0a\xb7\x9a\x37\xc8\xeb\x4e\x60\x4e\x03\x25\xd6\x41\x07\x95\x19\xca\x1c\x44\x61\xa1\xe5\xa3\x33\x50\x1e\x21\xcb\x4b\xbd\xff\xb0\xaa\x09\x9f\xc1\xd4\x80\x8a\x80\xb9\x70\xf8\x5b\x36\x35\xaa\xfd\xaf\xc1\x8d\x9f\x36\x15\x21\x0c\x09\x52\x56\xfc\x0b\x7b\xf3\xfa\xf2\x6d\xf2\x28\x23\x13\x61\x39\x44\x68\xfd\x04\x3f\x17\x59\x85\x5a\x0c\x33\x65\xbd\x8b\x50\x16\x18\x09\xf0\x85\xc6\xf2\x98\x6d\x1e\x63\x19\xc9\x67\xc1\xc0\x12\x4b\xb9\xfa\x03\xba\x59\x08\x31\xa7\x69\x64\x7b\x1f\xb5\xaa\x32\x79\xa5\xe8\x04\x31\x57\x98\x64\x38\x7d\xc1\x1b\x91\xe5\xe7\x9b\xec\x63\x52\x77\x87\x98\x1b\xeb\xd8\xee\xf6\xd5\x85\xf5\x2f\xff\x8d\x22\x94\x86\x58\x86\x51\xd8\xa1\x9d\x6e\xab\xf2\xb0\xcc\x85\xfa\xd1\x06\x56\x93\x6f\x48\x22\x21\xdc\xdd\x5f\xd7\xc8\x30\xb0\xcc\xee\x49\x8b\x11\x52\xc6\x71\x73\x72\xb9\xe1\x4a\x5c\x5b\x72\x00\x29\x24\x6e\x91\x7c\x96\xed\xe0\x36\x94\x2f\x4f\x4d\x87\x93\x9a\xbf\xdf\xed\xcf\x46\x51\x84\xd5\xb0\x04\x01\x3c\xa4\x58\xcf\xf5\xdd\xcf\x2b\xdf\xca\x1d\x46\xbb\xcd\xb7\x3a\x87\xe1\xa9\xac\xec\x3f\x7c\xad\xdc\x29\x45\x1c\x60\xd4\x65\x81\x70\x47\xd0\x99\x18\xfe\x30\x45\x12\xb4\x51\xca\x8a\x8f\xac\x99\x22\xcc\x41\x85\x5a\x58\x8b\xc9\xba\xa9\xca\x2b\x12\x0f\xa0\x52\x92\x3a\xd7\x78\x2b\x13\x3d\xa8\x64\x83\x86\x10\x75\x59\x8e\xb6\x10\xb0\x71\x2d\x20\x57\xf2\xdc\x14\x1a\x77\xd0\xf1\x09\x35\x28\x61\x7d\x13\xeb\x66\x51\xe8\x65\xe7\x02\x3e\xbe\x5b\xc0\x42\xc9\x7d\x0e\x2f\x2a\x3d\x30\xf0\xfa\x6d\x93\x12\x0c\x89\xb0\x90\x81\xd8\xbf\xfd\x11\xaa\x11\xfa\x1e\x0c\xd1\x98\xd2\xb7\xe1\x64\x56\xa8\x1e\xf1\xde\x0d\x08\xa9\x74\xb1\x10\x3e\xa6\xa5\x68\xd4\x3b\x5e\xb8\x9b\xc9\x84\xa6\x17\xff\x85\xb6\x3a\x03\x24\x45\x37\xd5\x8d\x54\x88\xab\x45\x45\xd1\x70\x92\x83\x99\x20\x76\xc0\x54\x57\x8b\xec\xb0\x94\x37\xf0\x81\x1c\x25\x3f\xce\x68\x61\x91\xe1\x8b\xe3\x31\x77\xea\xb5\xeb\x5f\x59\x53\xcf\x35\x21\x0c\x09\xa2\xd8\x56\xef\xcc\xa9\xd0\xfe\x0a\x27\xdf\x4d\x98\x65\x1c\xe1\xdd\x19\x26\x5a\xff\x35\x19\x27\x52\x6c\x78\xaf\x9f\xfe\xbb\xc7\xd7\x8e\x9f\xab\xa1\x41\x8a\x5b\xd2\xb6\x29\x8f\xff\xf2\x3f\x9a\x26\x14\xcb\x54\xab\xb2\x3e\x94\xa3\xad\x73\xfc\xe1\x30\x20\x42\x78\xae\xc4\xd7\xf3\x8c\x8f\xf3\xfc\x12\x68\x42\x26\x24\x8c\x84\x04\x16\x85\xb6\xae\x4d\x57\xea\x0f\x26\x4c\x53\xd5\xf9\x25\x7f\x73\xe4\xe9\x45\xa1\xbf\x15\x23\xb2\xb2\x9f\x0c\x26\x14\x14\x21\x2f\x4a\x38\x0c\xe4\xf2\x74\x7e\xea\xa9\xc5\x93\xb3\x47\x44\x61\x90\x2e\xba\xfb\xe4\xfa\x95\x3d\xb2\xc7\x44\xb1\xf5\x1b\xfc\x37\x14\xda\x9b\x42\x6a\x13\x39\x7f\xb5\x53\xa1\xca\x12\xcd\x5e\xb2\x0f\xdb\x10\x9d\xd4\x67\xed\xbc\xe3\x43\x9b\x70\x6d\x22\x4d\xd1\xc9\xeb\xee\xe1\xcf\xd5\x80\x32\x68\x18\x8b\x90\x88\x3d\x36\x58\xd2\x86\xa5\xa1\x0d\x46\x1c\x62\x77\xb9\xbc\x19\x29\x1e\x6a\xc3\x8c\x42\x25\x86\xbd\xb3\x9e\x9d\xb7\xc2\x9a\xcc\x94\x98\x50\xdb\x46\x6d\x6f\xee\xc2\x41\x69\xf0\x1d\xea\xee\x67\x2c\x74\x6c\x25\x3c\x16\x55\xe5\x20\x69\x9b\xfa\xa9\x6c\x6c\x6f\xe3\xb6\xac\x1c\x00\x7a\x7c\x63\x63\x61\xbc\x90\xe7\xea\xfe\xee\xdb\xf6\x66\x06\x85\x6d\x12\x1e\xea\xf6\xdc\xf8\x1c\xdb\x20\xe7\xcb\xb0\x21\x36\x17\x4c\x98\x94\x5a\xbb\x9f\x5f\x69\xea\x55\xec\x4c\x9a\x28\xfc\x89\xfb\x8e\x61\x58\xaa\x1f\x9d\x10\x54\xff\x75\xa9\x50\xa9\x2d\x65\x29\xf0\x8c\x78\xa4\x50\x7e\x08\x79\xe9\x7a\xe9\x3f\xa4\xac\x43\xf6\x1b\x34\xb7\x15\xc0\xee\x54\x35\x79\x97\xaa\x99\x54\x29\x9c\x6d\x7b\x9b\x63\x75\xae\x3f\xe3\x9b\x21\x62\xa3\x64\xdf\x3e\x5a\x68\x6d\x0d\x14\xfd\xe1\x24\xc0\xfa\xe2\x32\x6b\x7e\xc0\x08\x72\x6b\x84\x49\x4c\xd0\x33\x20\xeb\x81\x8e\x88\x91\x01\x61\xc6\x7b\x96\x8a\xba\x53\x16\xf8\x0e\xd9\xe4\xc2\x65\x10\x19\x17\x3b\xaf\x7f\x65\x75\xb3\x82\x7c\x92\x8d\x19\xc9\x39\xc6\x61\xcd\x50\x67\xa4\xb6\xb6\x71\xf9\x45\xa3\x76\x72\x8f\xa4\x32\xbe\x05\xb9\x12\xc7\x0b\x02\xad\x51\xa0\xd3\x1e\xac\x85\xd7\xbe\x1e\x95\xec\x8c\x26\x34\xa2\x43\xeb\xed\x6a\xab\xca\x0a\x36\xc5\xf2\x94\xff\xb8\x1e\x97\x18\xed\xba\x63\x6d\xd2\x5e\x68\xf8\xb5\x9c\xe2\x0d\x26\xef\xbb\x86\x10\xc1\xe4\x42\x66\xe3\x64\xd9\x80\x49\xa2\x4e\xb4\xac\x16\x39\xec\x91\x25\x36\x50\x8c\x32\x86\x24\x48\xaa\x7b\x3d\xd6\x03\xc1\x11\x63\x22\x81\xef\xa6\x50\x0d\xe2\xaf\x87\x9d\x7d\xeb\xbb\x6d\x32\xa8\x46\x11\xad\x31\x60\xe3\xa9\x1f\x1f\xea\x26\xfb\x98\xaf\xbb\x18\x03\x0c\x91\x98\xf2\x74\x7e\xc9\x07\xc0\x9c\xf1\x1b\x61\x0c\x47\x76\xa1\x97\xd1\x82\xa3\x45\xf9\xdc\xc2\x78\xfe\x43\x10\xb0\xce\x0a\xd1\x1f\x24\xdd\xb1\x58\xcb\x5e\xee\x4b\x9f\x54\xb3\x6d\xda\x1d\x66\x0e\x7d\x07\x41\x90\x28\x4c\xb3\xde\xb2\x0f\x58\x37\xef\xbf\x46\xca\x44\x10\x04\xa9\x44\x3a\x8c\x33\x97\xc5\x7d\x71\xbc\x28\xba\x07\x08\x01\xd1\xd6\x0f\x75\xa1\xf5\x50\xef\x62\x12\x9f\xff\xd7\xe5\x5f\xdd\x3f\x97\x4c\x1f\x08\x68\x12\x62\xd6\x8f\x73\x7d\xa0\x34\xe9\x0f\x73\xcb\x5f\x73\xef\xec\xd4\xe2\xc1\x8d\x0a\x99\xc0\x7d\x67\x09\xcd\x73\x71\x2f\xea\xf7\x3f\x52\xea\xaf\x2f\x62\x41\x48\x7a\xb4\xb3\xeb\x4c\x5f\xb1\x9b\x87\x20\x4a\x43\xc2\x3a\xcc\x4d\x59\x4d\x94\xcc\x27\xf7\x36\x4a\x53\x91\x0e\xde\xc4\xac\xda\x8a\x5c\xdc\xc0\x8b\xa8\xc4\xa7\x1d\x56\x08\x22\x9e\x60\xfe\xe2\x52\x6d\xa7\x70\x6c\x13\x2a\x37\x84\xc5\x06\x9c\xee\xc6\x32\xab\x9a\xf7\xde\xce\xae\x3f\x0d\x93\x20\x3b\x6d\xc2\x2f\x23\x73\x8b\xdf\xfc\x7b\xf1\x86\x42\xc0\x34\xe3\xda\xb9\xeb\xed\x4a\x57\x42\xe9\x45\x5c\xcb\x1c\x97\xb4\xc9\x0f\xd0\xa9\xc0\x6e\xb6\x2a\x0f\xc7\x53\x03\x4f\xf0\xab\xb9\x83\x22\x18\x74\x85\x21\x88\x53\xeb\xd6\xf4\x91\x55\xcd\x49\xe4\x2e\x3f\x1e\xed\x8a\x10\x24\x3a\xd1\xa2\x37\xd1\xfa\x9a\x35\xcd\x79\xa1\x46\xca\xdf\xdd\x2f\x4e\xfd\x4f\x4e\x29\x63\xbd\x99\xe2\xf3\xcf\x02\xa5\x96\xc6\xcf\x34\x95\x14\x6b\x44\x8f\x59\x01\xf5\x73\xb1\x43\xfe\xc0\xf8\x2a\x52\x65\x51\xc8\x76\x4d\xb3\x2b\xfe\xef\xf2\xf1\xf1\x19\xb8\x4a\xbd\xd1\x54\x9b\x1f\x39\x94\x7b\x57\xd2\x9e\xfc\x24\x0e\x02\x79\xf6\x6e\x56\x5a\xea\xef\x15\x47\x5c\x08\x04\x33\xc2\x9a\x41\x7c\x88\x2a\x13\xc5\xf4\x6c\x42\x4b\xe3\xd0\xd1\x1d\x8b\x80\x10\x7f\x5f\x85\xe1\x3c\xf4\xcb\x05\xae\x7a\xb7\x03\x4b\xa0\x2b\x97\x23\x03\x9b\x5e\xd7\xd0\x6c\x21\xcf\x2f\x58\x86\x10\x48\x29\x30\x0c\xce\xca\x9f\x85\xff\x2a\x45\x53\xdc\x3c\x74\x25\xb2\x62\x2f\xf2\xbc\xb9\x9e\xfc\x43\xa0\x42\xab\x47\x6a\xc1\x67\xe8\x00\x3e\x27\x99\x07\x81\x4a\xad\x09\x5f\x6f\x6a\xf2\xff\xdb\xcd\xc4\x9d\x59\xb3\xc0\xca\x8c\xb7\x21\x58\x27\x92\x70\x5b\x56\x73\xef\x9a\x96\x01\xb6\xed\x7f\xc0\x79\x61\xb7\xb0\xc9\x00\x48\x0d\xaa\xfa\x3b\xa6\x43\x47\xf3\x9b\xbf\x7c\x10\x0c\x1b\xfb\x36\x26\xb3\x9b\xf8\x6d\x79\x95\xa4\xe7\x3f\x05\xc6\x23\xda\x76\x99\xfa\x01\x63\x7a\xff\x74\xb0\xb1\xd0\x00\x0d\xa6\x2a\xeb\x91\x93\x3e\x04\x26\x66\x60\x79\x7b\x4b\xc8\xcb\x9f\x63\x65\xc3\xe1\xbe\x05\x81\xe1\x12\x5b\xf1\xdb\x83\xa8\x1a\x25\x2a\xd9\xeb\x67\xcc\xff\x4a\x03\x40\x86\x5e\x55\xaf\x60\xc6\x6f\x3b\x09\x48\x8a\x68\xa1\x83\xf8\xb5\xeb\x23\xda\xee\x68\xcc\x4d\xd8\xeb\x00\x3a\x3e\xff\xec\xdb\x41\x02\x09\x78\x91\xc7\x2a\x3b\x88\xea\x3c\x40\x9b\x00\x21\xc4\xba\x68\xba\x4f\x3c\x1b\x6c\xec\xed\x4a\xd5\xc5\x6d\x40\x68\x60\x23\x22\x6b\x67\x0b\xbb\xf2\x45\x9c\xad\x99\xd5\x48\xd1\x09\x08\xa5\x09\x3e\xde\xaf\xbb\x55\xe7\x88\xd8\x9d\x24\xa5\x1e\x15\xe1\x68\xdb\x08\x62\x1b\xff\xd2\x30\x0a\x11\x5b\xf5\x28\x9a\xf7\x17\x84\x01\xf4\xf7\x23\x52\xd6\xb7\x76\xe4\x75\xe4\x8e\x31\xc2\x23\xe7\xb6\xbd\xcc\x9a\xba\x9c\xc3\x69\x02\x61\xc0\x23\xd9\xe9\xbb\x19\x0c\x1c\xfd\x21\x63\xa3\x69\x6c\xfb\xb9\x2d\xad\x3b\x7b\xcc\x02\xa4\xf0\xd4\x5d\xcd\x7d\x57\x2e\x4f\xe7\x2e\xaf\x00\x92\x68\x40\x88\x6b\x87\x56\xd2\x93\xaf\x4e\x83\xc4\x36\x8d\x3f\x44\x9e\xe9\x09\xa9\x1a\x48\x9a\xc4\x28\x4f\x70\x84\xea\x20\xda\x2c\xd6\x1f\xe0\x29\xe7\x30\xe3\x05\xe4\x0f\x03\x60\xc4\xee\xbc\x0b\x2f\x0a\x29\x93\x89\x20\x88\x42\x1a\xdf\xf7\x4e\x14\xc8\x34\xbb\xf2\x52\xef\x00\x88\x60\x0c\x59\x6f\x12\xdd\xa0\xfd\x1f\x05\xc5\xe5\x48\x36\xb5\x37\x2a\xf7\x6b\x28\x91\xdc\x60\xcc\xbb\x7a\x7d\xfe\x7e\x83\x68\xe4\xef\x8b\x87\x87\xf5\x6e\xbf\xb8\xb9\x79\xed\x06\xc9\x38\x0c\x7b\x23\xf1\xab\xbf\xfa\xf4\x5b\xce\x04\x10\xcd\x99\x43\x06\x37\x1d\x83\xe0\x5e\xe4\x03\xb4\x23\x10\xa0\x02\x6d\x6b\x31\xb5\x5f\x2c\x37\x38\xe3\xfc\xb1\x10\xb0\x5b\xf1\xf2\xfc\xb8\x58\x3d\x6f\x9e\x06\x7f\x97\xa4\x73\xb0\x5e\x9e\xce\x03\x4d\x1a\x3f\x04\x24\xb6\xf1\x97\xa2\xaa\x20\x5f\xbc\x81\xbe\x7d\x7e\x7c\xf6\x27\x30\x81\xf5\x9d\x5d\xdf\xfd\xf5\xb2\xeb\xfe\xa8\x05\x56\x3e\xbf\x97\xd5\x0f\x55\x66\xc5\xbc\x69\x24\x10\x63\xa4\xad\x8a\x40\xdd\xec\xde\xab\xf2\x67\xfd\x0a\x58\xd1\x1a\x5b\xf7\xac\x0b\x67\x59\x69\xff\xaf\x9f\x87\x34\x48\x8c\x08\x3a\x35\xc6\x76\x89\xc5\xc5\x6f\x18\x34\x51\x0a\x96\x0d\x6c\x0b\x77\x79\xd9\x34\x65\x72\x23\xce\x97\x80\xb7\xd9\x39\x44\xc3\xd8\x16\xc0\x6b\x68\x16\x45\x9b\x50\x5d\xe6\xc2\x40\x23\x6a\x01\x19\x63\xd9\xeb\xdd\x3c\x5f\x16\x28\x0b\x12\x6f\x82\x81\xa6\xa0\xab\x53\x75\x99\x79\x02\x8d\x43\x40\x22\x9c\xc9\xaa\xba\x71\x00\xfc\x2b\x9b\xf4\xe5\x4e\x46\xe3\x94\x87\xce\xdd\x62\x0b\x85\x7e\x79\xde\x5e\xe9\x9f\x0d\x17\x76\x1a\x0b\x4a\xfd\x3a\x5b\x6e\x5f\x61\x4e\x46\xc1\x0f\x55\x01\x06\x87\x3f\x45\xd6\x0c\xfb\x9b\xed\x91\x30\xb0\x65\x9c\xca\xd7\xd8\x2c\xbd\xc2\x1f\x07\x86\x51\xc1\xfe\x90\x15\x68\xec\xbe\x6d\xaa\x69\x9a\x41\xaf\x5b\x6b\xbb\xb3\x24\x21\x20\x70\x50\x9e\xce\x0f\x99\x82\xa2\x86\xdb\xb2\xb2\x38\x8d\xf1\x0f\x4d\xb4\xf5\xa4\x72\xd6\xaf\x73\xf4\x2e\xa0\x69\xa0\x11\xf7\x64\xb2\x42\xb7\x21\xeb\x5f\x03\x14\xf4\xa0\xfa\x03\x34\x0d\x6d\x3f\x08\x1c\xc7\x7f\x57\xce\x14\x55\x81\xf2\x94\x21\x3a\xfd\x80\xe6\xbc\xb8\x35\x4c\xed\x5d\x80\x72\x6d\x55\x77\x30\xda\xd8\xcb\x5e\x3f\x11\xa8\x08\xed\xde\xe2\x74\x7a\x7d\x2f\xbd\xbb\xc7\x22\x8e\x92\x60\x8a\x31\xbc\x12\x58\x51\x91\x86\xd8\xae\x5d\x1f\xfe\x23\x86\x92\x8f\x40\x85\x0c\x6d\xb6\xd7\xd7\x0e\xae\x24\xe1\x33\xf8\x65\xa0\x02\x58\xec\xb1\xbb\x59\xf1\xd6\x37\xf9\x81\xaa\xd8\x44\x7a\xe0\xb9\xf8\x47\x1b\xd4\x65\xe3\x7a\xe6\xd0\xb4\xcd\x7d\x4c\x07\x31\xe7\xfd\xbe\xd9\xc0\x3e\xf4\xa9\x1b\x85\xc0\x82\x98\x75\xb9\xb1\x15\xdc\xa1\xf6\xfa\xb5\xf7\xd9\x7f\x96\x06\x49\x32\x58\x3f\x6b\x27\x1e\xb4\x1a\x02\xea\x7a\x5a\x1e\x84\x41\x18\x20\x20\x7a\x09\x75\x33\xe3\xac\x09\x61\x10\x25\x9e\x43\x84\xf9\xc1\xa4\xfc\x8e\x03\x3a\x8a\x6c\x55\xd6\xf5\xaa\x2c\x0a\xe4\x94\x8c\x8b\x6e\xf3\x71\x5d\x18\xb0\xb4\x8b\x78\xca\x1a\x91\xd1\x1b\x3d\x65\x6e\x4f\x3e\x92\x84\x9e\xcb\x77\xb1\x8a\x87\x24\x4a\x50\x8e\x03\x11\xbf\x8d\xc8\x51\x36\xf4\xd3\x98\x3f\x24\x71\x48\x47\x82\x85\xeb\x37\x44\x12\x4c\xcf\x9c\x24\x28\xac\xe0\x9b\x32\x9b\xa3\xa9\x91\xa2\xb8\xcb\x9a\x89\xdc\x33\x84\x94\x12\x2b\x3a\xeb\xcf\x69\x9f\xc6\xbf\x9a\xf3\xf2\x6c\xb5\x93\xc6\x27\xa7\x89\xd6\x2e\x59\xe9\x2a\xeb\xf3\x37\x8c\x42\x84\xb0\x1a\x40\x5b\xee\x81\xc7\x26\x84\x21\x0f\x64\x34\x52\x53\x7b\x84\xe6\xbd\xd4\x8b\xe5\xa6\x1f\x22\xb1\x0e\xa9\x3a\x00\xb6\x57\x47\xfc\xfc\x31\x45\x21\x23\x71\x8f\x37\xf8\x9e\xa1\x84\xe9\xae\xfc\x9e\x15\xdb\x73\xdd\xc0\xc1\x7f\x01\x23\x76\x3e\x3d\xf6\xdc\xf9\x95\x25\x6e\x4f\xf7\xc6\xff\x57\xce\xa5\xff\x82\xc4\x12\xf0\xdb\x8d\xf3\x09\x7e\x3a\xe1\x47\xdc\x0b\x2d\x61\x74\xe3\x6a\x8d\x8b\x42\x2f\x6e\xc0\xfe\x77\xf7\xeb\x12\x89\x7b\xcd\x22\x6b\x97\x6c\x63\x32\xd5\x23\xd1\x5f\x9f\xb7\xdd\x4f\x9b\xab\x91\x84\xb1\xe0\x88\x44\x7b\x82\x53\xe5\x2b\xa3\x10\x26\x81\x44\xea\xfd\xd0\x06\xe6\x53\x82\x27\x84\x09\xd5\xca\x02\x83\x4c\x56\xc0\xaa\x9c\xa0\x25\x21\x4c\x84\xf6\x72\x66\x6e\x99\x5a\x54\xd5\x04\x3c\x04\x61\xa2\x2c\xf6\xd7\x11\x00\xcb\xea\x3b\x64\x7d\x9d\xc7\x0d\xe2\x44\xe1\x02\x8b\x3b\x70\xbb\x6d\xd0\xb0\x3b\xc4\xec\x9b\xfd\x2a\x0a\x5d\x1e\x86\xd6\xe4\x10\x0a\xc9\x49\x38\xaa\xb5\x0e\xf1\x4b\x73\xb5\x94\x4f\xdb\x2a\x10\x0a\xc3\x43\x33\x90\x02\x7e\xcc\x26\x80\x39\x08\x65\xc4\xa8\x8b\xfd\xbc\xea\xc7\x25\x52\x01\x42\xa9\x63\x2c\xec\x6d\x91\x0b\xa8\x01\x31\x86\x83\x15\x4d\x47\x80\xcd\xb1\xdb\x4c\x96\x85\x50\x2a\x1b\x30\xf0\x20\xd4\x2c\x0c\x42\x4f\x6f\x72\x7a\xde\x73\x9c\x26\x08\x75\x6c\xed\x2f\x50\x29\xbf\x8d\x2d\x86\x32\x86\xd3\x67\xa1\x13\x0b\x41\x6d\xc3\xa2\xdb\xb2\x6a\x4e\xdd\x0e\x11\x6a\x69\x98\x5b\xe1\xd0\x0b\xec\x45\x54\x4d\x01\x95\x4b\xfc\xc6\x77\x49\x2b\x15\x07\x8e\x18\xb7\xaf\x8f\x99\x82\xfd\x01\xf2\xa1\x44\xad\x1b\x08\x44\xa3\x04\xb8\xc9\xea\x77\xa8\xfe\xea\x54\x85\x06\x23\xb4\x95\x34\xac\xed\x2f\x1f\xc8\x54\x8c\x67\x63\x14\xc4\x81\x67\x55\x7c\xcd\x8a\x37\x5d\x0e\x29\x35\x10\x91\xc8\x3a\xe3\xac\xf3\xec\x57\x37\x3f\x22\x12\x4b\x64\x89\x55\x38\x77\x6e\xb3\xb7\xf7\x86\xde\x80\x68\xde\xc7\x84\x51\x88\x48\x62\x35\x46\xee\xc6\xa6\x48\xa7\xab\x68\x1c\x88\x68\x64\x70\xad\x29\x8b\xdc\x66\xb5\xdb\x2e\xb9\x9c\xdb\xa1\xa2\x30\x92\x18\x67\xdd\x2c\x6e\xfa\x5e\x35\x44\x61\x2a\x13\x67\x61\x7f\x14\xe7\x61\x38\x10\x85\x90\xa0\xc6\x81\xc5\xda\x7e\xcd\x74\xfd\x90\x15\x3f\x7e\x07\x67\x87\x28\x82\x04\xd5\x0f\x6e\xd6\xb7\xaf\xcf\xdb\xdd\xfe\xf1\xf9\x69\x77\xff\xf0\xd7\x58\x30\x0c\x22\x46\xad\xb4\x7a\x1b\x64\x75\xf2\xcd\x17\xaa\xff\x10\x31\x16\x5a\x27\x2f\x55\x65\x03\x7f\xb1\xc1\x74\x8d\x18\x13\x28\xce\xe4\xca\xd4\x48\xb2\xff\x74\x7d\x8c\xe2\x54\x58\x83\x29\x87\xd5\x7a\x14\x93\xba\x60\x14\x0b\x23\xdc\x8e\x7e\x63\x5d\xa8\xee\x2a\x81\xdc\xc2\x3e\xb8\x8d\x62\x19\x63\xee\xfb\x03\xce\xf5\x2b\xa8\xf9\x42\x4b\x14\x9b\x04\x1f\x55\x7b\xdf\xff\xfc\xf4\xd6\xc5\x46\x4a\x2f\x2b\xdc\x26\xf3\x7f\x96\xd5\xad\xc8\x72\x2c\x27\x3d\x3f\x2f\xfd\xd7\x26\x51\x8a\xc5\x21\xa7\x50\x31\xc6\x23\x9f\x2e\x21\x2c\xe9\x48\xe0\xb0\x5f\x05\xa2\x44\xa6\x28\x47\x86\xfa\x38\xaf\x5e\xe8\x71\xfe\x0d\x48\xb4\xb6\x4e\x54\x43\x47\xc5\x97\x7e\x0e\xa7\x51\x12\x59\xaa\x79\x59\xd6\xe0\x0c\xbf\xe7\x2e\x92\xc7\x29\xb6\x6a\xdb\x60\x7f\xfa\x22\xf0\xc4\x46\xb2\x3a\xab\x8f\xb9\x38\x3f\x65\x13\x10\x32\x44\x9c\x4b\xbc\xf6\xe2\x74\x18\xd5\x41\x22\x2e\x28\x92\x7e\xdb\x4d\xc5\x05\xda\xfd\xa1\x88\x38\xdc\xbf\xf3\xac\x6a\x23\xa8\x0b\x52\xd9\xe4\x8b\x94\xb1\x22\x7a\x65\xae\xb7\xe5\x29\x5f\x82\x12\xa7\x7a\x3a\x3b\xb9\xd6\xb8\x62\xb7\x8f\xe9\xb2\x6f\xf0\x3b\xf0\xde\xa7\xfc\x1b\x88\xb8\x31\x58\xda\x59\x14\xcd\xdf\xa3\x57\x53\x50\xdb\x6f\xfd\x56\xf4\x10\xb3\xc9\x0f\x13\x3c\xc2\x1d\x77\xa3\xca\x57\xa8\x4f\x87\x6e\xb3\x8b\x84\x4c\xb0\x14\xb4\x5c\x3c\x7d\x7d\x7d\xf6\xb6\x52\x10\x09\x6d\xa2\x8e\x93\xec\x30\x7c\xdd\x52\x26\x8c\xf8\xff\x38\xfb\x93\xee\xc6\x71\xac\x5b\x18\xfe\x2f\xef\x28\x07\x35\x00\x3b\x10\xf8\x66\x92\x2c\x47\xb8\xc2\xb6\x5c\x92\x9c\x91\x59\x77\x3d\x4b\x0b\xcd\x81\xcd\xc7\x14\xa9\x22\x29\x3b\x54\xbf\xfe\x5b\x3c\x00\xd8\x89\x76\xe6\xbd\x93\xca\x28\x03\xa4\x48\x10\xcd\x69\xf6\xd9\x1b\xb1\x58\x56\x1a\x66\x44\xe5\x35\x9f\x5a\x8a\x25\xb1\xba\x5a\x16\x69\xd4\x3a\xff\x50\x2d\x66\x42\x53\xb1\x34\x2c\x74\x19\xab\x26\x47\x7a\x63\xd7\xa0\x68\x6c\x09\x4c\x2a\x51\x34\xf5\xa0\x1a\xce\xb7\xcb\x10\x97\xa8\x33\xb7\xea\x83\x68\x4d\x9b\x83\x3c\x5f\x26\xbf\xa0\x89\xf0\x6c\x99\xf7\xa5\x7a\x3b\x9f\xee\x07\x41\xf7\x79\x5b\x2e\xd6\x09\xf1\x07\x92\x2f\xf6\x19\x07\x29\x63\x20\x06\x17\x44\x03\xe2\xb8\x28\xf4\xfa\xd7\x09\xaa\xa6\x1e\x4f\x4a\xc3\xa9\x55\x1f\x3b\x59\x40\xa6\x2f\x7f\xc5\xa4\xe8\x27\x0b\xcd\x88\x14\xf7\x26\x61\x73\xf4\xdf\x45\xed\x74\xff\x87\xe4\x21\xb6\x6f\x42\x92\x00\xd3\xca\x1f\x90\xf9\x60\xd6\x97\xaf\x95\x10\x61\x29\xe5\x5d\x3c\xb3\xa7\xfe\x75\xed\x41\x4c\x02\x97\x25\xb7\x16\xcf\x30\x55\x93\x04\x49\xa8\xbb\x12\x55\x84\x00\xe2\x5b\x67\x50\x28\xb8\x87\x77\xf0\x52\x2c\x93\x1f\x0d\x34\x45\x74\xb1\x11\x59\x5e\x0b\x03\x07\xa1\x75\x36\x54\xd7\x9c\xf4\x0f\x49\x80\xd1\x84\xf5\x6a\xb1\xfb\xee\x7f\x3b\x54\x32\x09\x3c\x94\x59\x95\x95\xfe\x01\x97\xdf\xae\xe4\xbe\x5d\xe7\x28\xb1\x8a\x89\x79\xa5\x9c\x7b\x38\xfe\x78\x49\xa4\x2d\x44\x4f\x9d\x8f\xad\xe7\x91\xbd\x4f\x6c\x87\x24\x32\x31\x56\x70\x9d\x2a\xc8\x54\xd9\x6b\xa9\x41\x12\x47\x22\x70\xa6\xc0\x7d\x29\x8a\xb1\x89\x32\xde\x44\x92\x84\x48\x84\x14\xe7\x02\xed\x70\x2c\x06\xe8\x2a\x82\x20\x49\x75\x84\x7e\xc0\xb1\xd4\x99\xb9\x7c\x2f\xab\x1a\x2e\xb7\x00\x96\x25\xd7\x72\xb5\x0f\x47\xc8\xe5\x45\x13\xc6\x22\xe2\x79\x5a\xce\x4d\x59\x94\xc7\xf2\x5c\xef\x4a\xd3\x7c\x88\x0a\x36\xd5\x4b\x0f\x2e\x80\x84\x07\xdc\x4b\xfc\xad\x75\x79\x9d\xaa\x49\x78\xa8\x44\xbb\x83\x61\x4a\xed\x07\x14\xba\x44\x5a\x0a\xdf\xca\x35\xc2\x09\xfe\xb7\xcc\x8a\x4e\x9d\xd7\xb7\x89\x00\x23\xd6\xb8\x27\x3c\x64\xc5\xb7\xd2\xcb\x0c\x40\x22\x43\x86\xae\x3b\xb6\xd9\xcf\x14\x5a\x49\xfb\x30\xf6\x69\x5f\xb7\x6f\x78\x44\x97\x7f\x20\x15\x82\x87\xbe\xf9\x2d\xba\xd3\x49\xb1\x05\xfd\x9d\x66\xc3\x64\x35\x68\x9e\x8a\xb0\x57\x3f\x70\x2c\x17\x5d\xfd\xe7\xf8\xbd\x81\x07\x58\x64\x08\xbf\x40\x9d\x11\xaa\xf0\xe6\xea\x32\xf1\x02\xa1\xae\xe4\x5f\x21\x01\xe0\xd0\x57\xc0\xa8\x8b\x8b\xf7\xf8\x1d\xf0\xff\xb0\xff\x19\xcd\x42\x30\x31\xc6\x0b\x31\xac\xf5\x9a\x41\xae\xff\xa2\x44\xad\xbd\x84\x21\xc2\x63\xf5\x9a\xbd\xc3\x90\xf6\x0f\x28\x89\x65\xd0\xd1\x97\x59\x91\xc8\x69\xa2\x0b\xf1\x6f\xf4\x7f\x06\x47\x3c\x0d\x02\x85\xe1\x75\x47\x84\x57\x95\xc7\xe7\xc2\x52\xb6\x8d\xdf\x8d\x86\x52\xa2\xa3\x73\x93\xbd\x64\x8d\xc8\x07\x46\x22\x0d\x15\x67\x61\x8f\x95\x5b\x6c\xff\x18\x16\xc6\x01\x8d\x62\x12\x5a\x82\x72\xa7\x1f\x39\x39\xd6\x69\x94\x0a\x0c\x7e\x77\xa7\x95\x27\x30\xf9\x9a\xee\xc6\x5f\xad\x6d\x4c\x01\x51\x41\xa7\x7e\x9f\x99\xe9\x09\x06\x33\x76\x99\xb2\x72\x9c\xde\xa4\x71\xa9\xcd\xc1\x2a\xa6\x71\xc0\x11\xd7\x84\x71\x47\xe4\xad\x18\xe5\x73\x68\x2c\x2c\x88\xf3\x29\x6f\xb7\xc7\xd1\x87\x48\x8c\xd5\x36\xcd\xcb\x97\x45\x9e\x0f\x66\xcb\xe4\x64\xa3\x54\x89\xc4\x78\x26\x87\xaa\xb6\xa1\x21\xf4\xd6\xe6\xe4\xbc\x81\x52\x6d\x4b\xb4\x15\x0a\xaf\x7b\xa2\x7f\x36\x79\x49\x6a\x00\x67\xf9\x7e\xbf\xfa\x5b\xe5\x68\x40\x99\x21\x84\xa0\xaf\x60\x23\x2c\x77\xc5\x00\x5a\x34\xb9\x3b\x27\x16\xe3\xb0\x68\x6c\x74\x44\xd8\xb5\xe7\xdf\x9d\x47\x14\xc1\xf6\xf6\x70\x68\xed\x0e\x3c\x20\xda\x4d\x6b\x71\xca\xba\x5e\x31\x43\x5e\xa5\xa7\xef\x9b\xf5\xe3\xdd\x1f\x87\xd5\x66\xbb\x5b\xdc\x6d\x0f\x0f\x8b\x3f\x0e\xab\xc5\xf6\xdb\xa6\xeb\x98\xc4\xba\xe3\xa6\xbe\x55\xfd\x0d\x14\xe0\x42\x6b\xed\x40\xd1\xa8\xd7\x2f\x70\xe2\x40\x39\x84\x24\x1e\x8a\x34\xd5\x33\x94\x42\xa3\xc8\x13\x15\x81\xc4\x13\xe9\xe9\xee\x8f\x91\x62\x8c\x6f\x0e\x05\x7a\xcf\xed\xf3\x3e\xad\xb7\x77\x9b\x9b\xc3\x6a\xf3\xdc\xf9\x2e\x54\x26\x31\x0d\x7d\xc5\xc0\x4a\xa8\x57\xb8\x81\x1a\xc9\x80\x41\x6f\xe1\x54\x56\xcd\x63\xb9\x7b\x2d\x3f\x96\x65\x31\x5d\x66\x32\xb1\x24\x20\xf5\xf9\xf8\x5d\x54\x7a\x25\x4e\x4f\x67\x99\x67\x6a\x38\x37\x65\x6a\xf7\xb1\xcc\x1d\x17\xb6\x8a\xda\x37\xb2\x04\xb7\x81\x77\x91\x9f\xe1\x1b\x34\xbf\x8d\x3e\xb5\x04\xc7\x5f\x2d\x2e\xbf\x4d\x42\xe7\xae\x87\x82\x40\xba\xd5\x64\xb5\xde\x76\x90\xe7\x5e\xc1\x73\xdc\x55\x87\x09\x6e\xe2\x07\x44\x44\x41\x01\x75\x1d\xe6\xc3\xe5\xe7\xfb\x25\x51\xe0\xf1\x00\x67\x89\xfc\xb3\xcd\x04\x3b\x06\x54\xa7\x5a\x0e\xd5\x73\xea\x26\x6b\x30\x58\x6b\xe9\x7d\x66\x19\xfa\xff\x31\xb9\x85\x16\xf8\xe8\xd6\xcd\x1b\x0a\xa5\xfd\x0d\x28\xc6\x70\x67\xa6\xda\x44\xb8\xd2\xe0\x17\x54\x2a\xab\x61\x73\x1a\xad\xdf\xcf\xef\xd1\x6f\xac\x26\x8c\xd0\x40\xcc\x8b\xdf\x46\x83\x61\x58\x8c\x1e\x01\xaa\x21\x0d\xb5\xb8\x26\x64\x34\xbe\xbb\xd6\x08\x41\xaa\x90\xff\x6e\xed\xf5\x67\x81\x1a\xc3\xb9\x53\x0d\xf8\x3d\x2b\xe0\x22\x2a\x3d\xda\xef\x5d\xed\x43\x7f\x9c\x0e\x0f\xd1\x94\x18\xed\x29\xdf\x10\xe4\x39\x62\x82\x1c\xbc\x46\x1a\x68\x40\x48\x63\xeb\x86\x3b\xa7\xcd\xb7\x98\x18\x89\xf0\x0e\xaf\xa2\x5e\xe4\xf9\x2e\x7b\x99\x07\xe3\x41\x1a\x32\x63\x8f\xc5\xb2\x30\x19\xaa\xdd\xb4\x46\x97\xbf\x4f\xc8\x29\x7e\xb5\x87\xcd\x62\x35\x3a\x37\xd2\x50\xf0\xd0\xc6\x4b\x8b\xb7\x6d\x99\xe7\x4b\x28\xc0\x64\x2a\x13\x55\xdf\x45\x09\xcc\x7c\x23\x55\xb1\x0f\x5a\xf6\xcb\x7b\xf5\x7a\x2e\x7c\x9a\x24\x8d\x92\x24\x4e\xbd\x10\x24\x54\xcb\xcb\xfa\x28\xb2\x1c\x73\x0d\x63\x0e\x02\x48\x23\x6e\x15\x32\x5e\xa0\xb3\xea\x27\x1d\x74\x8c\x12\x3e\xf9\xb9\xb8\x54\x1d\xe9\x9b\x6b\x8c\x03\x2b\x5d\x9c\xd5\x96\xed\x64\x5b\x76\xc2\x60\x90\xc6\xb1\x2d\xdd\x6d\x2a\x51\x38\x59\x63\xa8\x7a\xa1\xb7\xf9\x11\x8c\x45\x82\xe5\xb9\xe2\x5d\x54\xe2\xc5\xb2\x83\x0c\x82\xd6\x69\x12\xca\x98\xf8\x92\x13\x94\x05\x43\x9c\x92\x6f\x8d\x53\xe5\x0a\x98\xfc\xd0\x8c\x63\x40\x93\x5f\x4b\x92\x00\x63\x88\x0d\xd4\xcd\x5d\xd1\x20\xff\xbb\xdd\x63\x5c\x9c\x32\xfa\x9f\xae\xa7\x05\x2e\xa1\x7a\xdd\xee\x8a\x9b\x1d\xd2\x44\x6b\xab\xfd\x69\x43\x4f\xc3\xa0\x58\x4a\x89\x40\x5b\xe6\x7d\xf0\x05\x7c\x53\xd2\x15\x81\x3d\x88\x22\x33\xed\x83\x7c\x4d\x06\x0d\x29\x4d\xe3\xc0\x65\xa7\x7f\xbe\x8a\x1c\xfc\x6c\x98\x09\x7f\xa6\x94\x85\xcc\x52\xea\xee\xc4\x84\xde\x06\x52\x0a\x11\x92\xe2\x2d\xb3\x3c\x2f\xcd\xbd\xd0\xdd\xd1\x9e\xa6\x11\x41\x50\xc1\x9f\x9b\xe7\xe1\x91\x9f\xa6\xc2\xa0\xa6\xf3\x72\x37\x30\x8e\xd3\xd4\xa9\xf5\x35\xbd\x09\x60\x00\x46\x60\x95\x34\x35\x80\x3b\x8d\xf4\x65\x36\x2e\x56\x3d\xcd\x10\xa5\xa9\x31\x81\xf1\xc9\x77\x0c\x5f\x7c\xae\x90\x0e\x29\x33\xc4\x58\x53\xf7\x38\x8b\x55\x86\x94\x27\x21\x52\xd2\x68\xf1\x3e\x7a\x15\xae\x2d\x96\xa4\x86\xe6\x70\xea\x89\xdf\x9d\x44\xf5\xfc\x11\x9b\x8a\x80\xf2\xd4\x93\xf5\xcf\x88\xe1\xfb\x6e\x9c\x5a\x28\x49\x6b\xf5\x1f\xde\xcb\x66\x54\xff\x05\xa9\x8c\x28\x96\x0d\x9c\xc4\xe5\xf6\xea\x81\x25\x27\x5e\xa8\x6a\xff\x32\xcb\xb0\x0c\xa9\xe2\x80\xee\x48\x5e\xbe\xdc\xe6\x65\x59\xfd\x76\xed\x1d\xa5\x4a\x52\x6f\x2e\xce\xe0\xb0\x52\xa5\x13\xac\x52\xec\x8b\x9a\xd7\xbf\x5c\x89\xf6\xdf\xca\xad\xa4\x9a\x98\x38\xc6\x14\x57\x7b\x6e\xff\x80\xd6\xda\xad\xa1\xa8\xbb\x6c\x47\x0a\x84\x62\xdd\xaf\x3c\x5f\x7a\xcb\xd2\x3f\x1e\x44\x31\x86\x9c\x4d\x55\x1e\xbf\xc3\xaf\xf1\x00\x01\x4b\xb9\xe9\x33\xc5\x8b\x3e\xbf\xe6\x83\xe8\x29\x70\x8e\xe7\xe8\x90\xa0\xe2\xcb\xac\x42\x0a\x5c\x58\xa5\x5a\x9f\x66\x7b\x6a\x4d\xf0\xfe\x69\x45\x22\x9d\x3f\x3b\x3e\x00\x8c\xb6\xc5\xc3\x4d\x75\xd9\xe1\xc9\x5e\x94\x1a\x6c\x90\x61\x8e\x8d\xa6\xbd\x40\x51\xa7\x20\xb7\xec\xd4\x86\xb3\x69\xd0\x3d\x35\xc6\x60\xcd\x7f\x56\xe8\xec\x3d\xd3\x67\x91\xe3\x06\xda\xc9\x92\x00\x23\x42\x23\xb1\xe5\x6b\xa9\xf3\xbf\x51\xe9\x0b\x2c\x60\xb6\x58\x4d\x60\xa5\x08\x1e\x76\x1d\x1a\xd0\x77\x91\x8a\x3b\x7d\xa0\x01\xa3\xf1\x72\x26\xf9\xea\x2f\x50\x09\xd6\x25\x9f\xca\x32\x5f\x37\xaf\xbd\x18\x72\xdb\x64\x85\x6e\x65\x87\xcd\x9b\x5f\x10\x2c\x74\x76\xe6\x09\xaa\x3a\x13\x5d\x5c\x88\xc5\x2c\x8e\xa1\x43\xa6\xfe\x84\xec\xe5\xf5\xd3\x80\xd4\xe4\x96\xb1\x8e\x03\x27\x45\x54\xf5\xc8\xf0\x3e\xb5\xe4\xba\x25\x31\x68\x1f\xc8\x81\xfa\x9c\x37\x73\x91\x04\x96\x24\x14\x93\xa1\xa7\xde\x41\xb2\x8e\x93\x65\xe3\x75\xbd\x28\xb1\xaa\x15\xa6\xfd\x4c\xad\x47\x0d\xe2\x38\x3a\xc9\x19\x0d\x43\x2c\xd1\xc7\xca\x8d\xc5\xe6\x4e\x2f\x2f\x8f\x62\x4c\x8a\x03\x8c\x72\x16\x7b\x31\x61\x93\x97\xe2\xad\x5e\xbc\x88\xac\xa8\x9b\x99\x5c\x2f\xa3\x9a\x44\x2e\x61\xee\xc8\xfc\x1c\x87\xf0\x10\x3a\x37\x79\xe7\x34\x61\xf8\xce\x18\xc1\x44\xa6\x78\x3c\xd9\xbf\x04\x03\xb0\xd4\x24\xae\x2a\xd1\xe6\x4f\x2a\x67\x0a\x84\x5d\xbb\x42\xa2\x59\x9b\xe4\x2b\x2b\x14\x00\xfb\x8b\xe9\xc8\x12\x85\xc0\xf5\xfb\xc5\xf6\xdb\xfa\xf0\xf4\xbc\x5d\x7d\x5f\xec\xd6\x07\x24\xcc\xf2\x43\xc6\x63\x4b\x6d\x8d\x58\xcd\x1c\xee\x6e\x96\x97\x91\xb6\xc7\xf8\x29\xb9\xd0\x84\xf8\x82\xab\x5f\x58\x15\xfa\x04\x55\x6b\xe6\x4c\xc6\x8d\x1b\x8a\x8a\x3e\x7d\x26\x79\x6e\x37\xeb\xb1\xf7\xff\x8f\x79\xe6\xc9\x0b\x8b\x88\x63\x84\xf5\x24\x2e\xbb\xf2\x08\x65\x31\xcf\xc1\x0e\x4c\xc4\x02\xdd\xea\x73\x0d\xd5\x1e\x0a\x81\xf1\xcd\x57\x04\xf8\x4f\xbc\x0f\x26\x8c\x8a\xdc\x79\xb0\xcb\xc5\x3b\xb2\xd7\x8e\xf5\x42\x81\xc9\x28\x96\x3d\xff\xc5\x23\x7c\xec\x40\x9d\xab\xac\xb9\xdc\x8c\xf1\x3d\x73\x10\x09\x26\x15\xc3\xbc\x8c\x45\x59\x23\xac\xfb\xcb\xe0\x29\x53\xc6\x16\x1c\xb4\x9f\xec\x35\xab\xc7\x21\x45\xa6\x8d\x3d\xfc\x4e\x55\xa9\xda\x03\x7e\x54\xcf\x06\x0c\x62\x8a\xb1\x89\x97\xf3\x7c\x85\x1c\xb4\xd6\x94\x71\xa4\x92\xfe\x48\xfa\x84\x02\x0e\x98\x09\x80\xb9\xc1\xe9\xfd\xc7\x27\x51\x89\xe3\x5f\x62\xd3\xfd\x1d\x22\xae\x5d\x80\x1b\xcd\x4d\x9b\xda\x7e\xf0\xa8\x46\x66\xc0\x16\x87\xdf\x79\xfd\xcb\xed\x79\xb7\x7f\xc8\x8a\x97\x5b\x91\xbf\x38\xaa\x14\xe0\x24\x22\xc6\x91\xca\x66\xc7\xf3\xf1\xb1\xec\x89\x5a\x46\x76\x10\x27\xd2\xe2\xdc\x1c\x13\xb1\x63\xd2\x6b\x3f\x78\x30\x76\x50\x39\x51\x0a\x8d\x84\x6f\xe5\x7b\x3b\x06\x83\x15\x7c\x9d\x3f\xf7\x97\x40\x00\x83\x3a\x95\xd5\xb9\xc9\xec\xbc\x8f\x6d\xcc\xd1\xfd\x27\xb8\x2e\xec\xb5\xad\xee\x36\x41\xbb\x6e\xff\xbf\xff\xdf\xff\xf7\xb8\x79\x3c\xec\xb7\x8b\xc7\xdd\xed\x7a\xbb\x58\xde\xaf\x91\x72\xde\xbf\x48\x48\x28\xe2\x0c\xd7\x9b\x87\xee\x4f\x8c\x38\x71\x8c\x76\x71\x7e\x13\x93\x03\x8f\x87\x02\x50\xb1\xf4\x60\xc0\x53\x6d\x0e\x1a\x01\xa8\xe5\xca\xd1\x00\xc7\xdd\x6b\x6b\x30\xdc\x15\x4d\xe9\xa2\x97\xfe\x37\x22\x4e\x6c\xaa\x4e\x1c\xb3\xfc\xb2\x85\xba\x3c\x57\x0a\xdc\xfc\xf8\xbb\x3e\xb0\x37\x22\x78\xa4\x98\xcf\x88\x74\xac\x5f\x76\xba\xce\x25\x8f\x79\x4c\xa4\xf4\xa4\xbe\x87\xf6\x7f\x84\x74\xac\xc7\x0e\x70\xb5\x12\x35\xac\x7f\x9d\x40\x21\x4f\xd3\xb9\x33\x91\x79\x1c\x59\x02\x5c\xb4\x08\x07\x3a\x43\x75\xd7\x41\x24\xc6\x1f\x0a\x50\x39\x8d\xe5\xf1\x08\x25\x09\xef\x14\xf4\xe7\x8b\x7c\x78\x22\x89\xf2\xca\xf3\xa7\xb2\xa8\x4b\x74\xb6\x6a\x27\xaa\xd0\xde\xf3\xb3\xbc\x26\x4f\x64\x88\x4f\xa8\x9d\xe4\xdf\x73\xe5\x83\xd8\x9c\xc6\xd6\x0c\x59\x6d\x9e\x9e\xd6\xdb\xc3\xe2\x61\xf3\xfc\xb8\x3f\xfc\xf1\xb4\xde\x76\x3d\xd2\x18\x15\x15\x7f\xae\x47\x48\x5a\x4e\x41\x22\x09\xbc\x2a\xe1\x09\xaa\x75\xf3\xba\x31\xa6\xee\x32\x5b\x3c\xe5\x52\xb8\x80\xc9\x47\x56\xcc\x06\x03\x39\x8b\x15\xbe\xd2\xff\x96\x96\xaf\x74\x51\x68\xab\x09\x33\x6f\x6a\x70\xa6\xa8\xf4\x32\x98\x48\xaa\x8c\x6c\x47\x56\x1e\xa9\x1b\x6d\x91\x30\x9b\x94\x13\xc5\xb7\xde\x9e\xe1\x22\x0d\x10\xf9\x77\xff\xef\x7b\x17\x2a\xed\x5a\x40\x23\x65\xd0\xf7\xc5\xea\xfb\xdd\x76\xf3\xe3\xd9\x37\xc8\x54\xa0\x19\xea\x80\x1a\x13\x43\x9d\x4b\x43\xb8\xf2\x82\xf1\x4e\x85\x78\x0a\x26\x1c\x3f\xbf\x52\x96\xd4\xd2\x95\x0a\xa1\xe9\x3e\xf5\x09\x5d\x57\x48\x54\x94\x3a\x7a\xa9\xac\xdd\xd8\x17\x2e\xae\x3c\xa0\x23\x01\x0e\x94\xa7\xda\x6b\x0f\xfe\xe5\x0a\x19\x5a\x2a\x1c\x98\x0c\xec\xae\xe6\xd6\x86\x7b\xcb\x91\xd1\xc3\x4d\x98\x62\x5d\x50\x87\x97\x5c\xe4\xf9\xa2\xba\x8e\x92\x4c\x5e\xd4\x70\x0b\x25\xa9\x91\x3b\xd0\x19\x37\xeb\xd5\x76\xbd\xda\xfc\xbe\xde\x5e\x09\x57\x0c\x9d\x61\x67\xb6\x09\x12\x2b\xe9\xf6\x6e\x9b\xa8\x15\x32\xcb\xb3\xe6\x53\x0c\xfc\xe8\xed\x04\xa1\x0a\x99\x34\x97\xf7\x0f\xb3\xe4\x22\xbe\x1b\x0f\xa9\x0b\x40\x2d\x05\x7a\xff\xcd\xf8\x6c\x61\x5d\xa5\x95\x20\x32\x89\xbd\x4e\xbe\xe5\x81\xb8\x2b\x5a\x5b\x49\x5c\x27\x51\x04\xd1\x0c\x29\x85\x6e\x2c\x01\xc2\x15\x6b\x3d\x88\x00\x00\x71\x3b\x37\xe2\xb4\x12\xc3\x3a\x5a\x10\x81\x31\x08\xec\x6b\x4d\x25\xbd\xfe\x25\x8e\xa7\x29\x8e\x5c\x84\x09\x45\xff\xec\x8f\x3f\xff\xf4\x57\x45\x9c\x28\xe7\x12\x6e\x3e\x40\x5f\x09\x9e\xba\x6e\x71\x2c\x85\xec\xb0\xd8\x58\x9e\x63\xe3\x66\xb3\x7e\x95\x48\x02\x8a\xd4\x4d\xff\xdc\xfa\xc0\xb0\x48\xc2\x10\x3d\x3f\x0d\xef\x43\x62\x71\x10\x49\x22\xd1\xeb\x3b\xb4\x9b\x58\xb7\x73\x0e\xd5\x7b\x86\x67\xa0\x48\x28\x20\x25\xe5\xe2\xe6\x77\x7f\x07\x1a\x47\x78\xc8\x94\xa7\x7a\x5c\xa5\x29\x68\x0a\x58\xf2\xb9\xde\xaf\x5e\x45\xe5\xc8\x12\x27\xaf\x46\x39\xe0\x92\xd9\x83\xab\xf4\x99\x7c\x14\xaa\x6d\x65\xef\xb2\x6c\xac\x92\xcd\xf8\x72\x0c\xe2\x75\xc9\x7c\xab\x0e\x32\xe9\x11\x09\x6f\x46\x7b\x02\x24\x87\x18\x1f\xff\x50\x1a\x6b\x44\x4a\xf9\x35\x73\x23\x32\x55\x4e\xef\x95\x46\x68\xec\x6e\xd7\xf7\xeb\xd6\x6e\xde\xed\x17\xfd\x10\xb3\x30\x44\x23\xdf\x95\xa4\xbe\x66\xc5\x4b\x67\x39\x76\xa9\xc4\xff\xf3\x3f\x57\xd9\x45\xf7\x0f\xe6\xd7\x10\x8b\x6c\xed\x67\xfd\x21\x4e\x93\x7c\x95\x60\x11\x65\x81\x57\x23\xaf\x40\xd4\xe7\x8e\xcf\x78\x76\x4d\x0b\xa6\x15\x66\xac\x17\x4f\x4f\x87\x87\xc5\xe3\xe2\xdb\x7a\x7b\xd8\x6e\xbc\x06\x24\x08\x06\x16\xdc\xed\xb4\xc7\xad\x0e\xc3\xbc\x19\x28\x98\x61\xe8\xae\xfb\x32\xe4\x4f\x96\x27\x0f\x24\x1e\x9c\x0e\xf3\x84\x15\xe3\x63\xf5\xfb\xbf\x65\x07\x0a\x9e\x28\x34\xa1\x73\x51\x37\xce\x6a\x2e\xab\x91\xed\x26\x38\x0b\x82\xd4\xbb\x48\x65\xa5\xb3\xe2\x3a\xde\x24\x38\xb3\xa4\xd4\x0f\x47\x5b\xfb\xf5\x45\x42\x4a\x88\x00\xc2\x0e\xd8\x5d\x34\x50\x34\xcb\xcb\x8d\x68\xc4\x27\xf5\x08\x93\x8b\x13\x2b\x87\x69\x8b\xd0\x13\xf2\xf6\x5c\xeb\xbb\x62\xd5\x13\xb7\x83\x10\x54\x78\xe9\x9b\xb1\x53\x21\x04\xd3\xb1\xad\xab\xb3\x46\xc1\x67\x38\xe2\xc9\x20\x09\xee\x0a\xb0\xac\x30\xbd\xff\x2b\x80\x67\xdf\x6d\x3d\xb1\x95\x38\xdd\xd9\x70\xc0\x4f\xc8\x3e\xf9\xb8\x2a\xe6\x18\x60\x6c\x32\x18\x09\x2b\x8d\x7f\x0e\xa4\xa5\x43\xaf\xa1\x71\x4c\x0d\x8b\xc9\x68\x9b\x40\xe3\x56\xf5\xb4\x5d\xed\x03\x42\x0e\x5b\x0f\x8c\x17\x06\x88\x67\x1a\x58\x9d\xeb\xa6\x3c\x5a\x19\xb6\xe2\x65\xe4\x8c\x4b\x12\x1b\xcf\x7a\x67\xc7\xc2\xf1\x78\xcc\xc7\x1b\x25\xa1\x14\x4b\x22\x90\x2a\xca\x9b\xe3\x49\x8f\x6c\xa5\x6e\x75\x4d\x8f\x2d\x7f\x39\xa4\x51\xa7\xaa\xff\xa4\x9a\x5d\x03\xa7\x89\x95\x2c\x83\x94\xa3\x51\x74\x14\xbf\x5c\x66\xac\xb5\x85\x3b\x5a\x60\x90\x21\xb1\xfc\x6c\x76\x13\x7a\x12\x2f\x30\x5f\x12\x2a\x23\x0a\x91\x2f\x37\xc0\x69\xe5\xff\x0e\xc4\xca\xd5\x97\xea\x2f\x93\xa6\x32\x4e\xac\xdf\x6f\x65\x76\x2c\xdc\xad\x27\x11\x00\x19\x03\xc1\xc7\x95\xa2\x51\xaf\x5b\xc8\x3d\xcf\x31\xee\x34\xbd\xc3\xf2\x19\x08\xb8\xdb\x90\x7a\x26\x1b\x36\xda\xb5\xc6\xfb\x17\xf3\xa6\xbb\x4c\x62\x2b\xb0\x57\xff\xe7\x2c\x2a\xd8\x98\xdd\xf9\xda\xe5\xf3\x5d\x45\x2a\x54\xcf\x28\x00\x95\xd7\x88\xb8\xce\x03\xc9\xc4\x58\xfe\xae\xf5\xfe\xee\xf1\xcb\x71\xa1\x71\x80\x35\xa6\xf7\x65\x95\x35\x62\xe9\x53\xb6\x92\xc6\x16\xe2\x8d\x48\xe0\x6b\x8f\xad\xef\x85\x89\x97\x87\xc5\x1f\x87\xd6\xcd\xb2\xe2\x1d\xcf\x4f\x4f\xf7\x7f\x76\x37\x62\xdc\xa4\x8e\x93\xe0\x2a\x4a\x2c\xa9\xa6\xe8\xb9\xa8\x32\xeb\x43\x3c\x03\x06\xcb\x49\x6f\x63\x8b\xa3\x7d\x31\x56\xeb\xe9\x4e\xa6\x5d\x1a\xa4\x58\xee\xe7\xd9\x37\xfa\x30\xa4\x4c\x29\x00\x92\xb5\x1c\x33\x5c\xe0\x76\x1d\x7d\xcb\xde\xe1\x2f\x0a\x36\x64\xea\x42\x9c\x56\xe2\xf8\xae\x40\x26\x23\xf8\x9c\x98\x0b\x24\x8b\x02\x07\xfc\xc0\x5a\xf5\xd9\x98\xbe\x64\x49\xea\x05\x5a\xda\x79\x7d\x08\x13\xff\xa8\x8c\xa9\xc0\xc9\xe0\x55\x2f\x15\x40\xf1\x1d\x44\xde\xbc\x0e\x6d\x27\xc9\xb8\xf0\x49\xaf\xa7\x32\x2b\x9a\x49\x00\x43\xf2\x94\xa2\x3a\xb2\x40\xe9\x84\xf5\x7f\x82\xd4\xcd\xe8\xf4\x1f\xee\xbf\xbe\x23\x0b\x70\xae\x3c\x6e\xf6\x87\xf5\xe3\xcd\xfa\xe6\x70\x7b\xf7\xe8\xcf\x3a\x29\x42\x8e\x0e\xad\x53\x72\x3c\x3c\x6d\xb6\xa8\xcb\xf9\xf0\x7c\xbf\xbf\x7b\xba\xbf\xeb\xbc\x27\x29\x04\x90\xfe\x28\xf7\x65\x51\x9f\x1d\x5b\xe3\xa1\x10\x2a\x08\x5c\x4d\xed\x5c\x44\x70\x7e\x1f\x97\x32\xb4\xf4\x7a\xd6\xc2\x33\x19\x1e\x3f\x28\x48\x32\x9b\x6f\x90\x32\x11\x88\x9e\x19\x57\xa8\x2c\xcf\x57\x21\x77\xd7\x5f\x85\x94\x6a\xbf\xf9\x22\x68\xef\x79\x77\xd3\x1e\x4d\xfb\xf2\x27\x64\xdb\xc1\xf6\x01\x49\x82\xe0\xa9\x49\xcd\xd6\xfc\x6d\x41\x53\x8b\x20\xde\xde\xba\xeb\x55\x14\xd0\xd4\x0c\x9f\xec\x5b\x29\xf2\xfa\xb6\x2a\x8f\x1e\xb9\x01\xe8\xfd\x7e\x1a\x0e\x9a\x2b\x4b\xf0\xf7\x0e\xd3\xd0\xd1\x15\x3c\x65\xaa\x69\xdd\xf9\xa1\x3a\x64\x2f\x79\x3b\x1a\x2c\x15\x33\x89\xe1\x93\x65\xd6\xb4\x86\x68\xeb\x8f\xf8\x16\xce\x51\xc4\xbf\x46\xad\x91\xcd\xed\xad\xa9\xac\x46\x5c\x57\x85\xac\x62\xdd\x89\xb8\x3d\x41\x55\x77\x6e\x9c\x4a\xc2\x40\x30\xcf\xfe\x3a\x40\x69\xcd\x2e\xa6\xc1\xbf\x06\xb4\x61\x7f\x51\xe8\xaf\x12\x11\x11\x5f\x79\x3a\x90\x17\xf1\xad\xc6\xc4\x96\x24\xe4\x39\xd3\xe3\x26\x1a\x69\xd1\xa1\xdc\xee\xea\x4d\x91\x5f\xb0\x84\x64\x6c\x74\x28\x4a\x53\xe7\x89\x5a\x05\xf5\x76\x2f\x29\xfa\xf0\xf8\x64\x18\x59\xcc\x82\x70\x20\x7a\xdb\x4e\x53\x3f\x18\x8c\xc6\xbc\xab\xd5\x2e\x3a\xee\x1a\x50\x8c\x03\xda\x35\x87\xac\xb6\xa8\x8e\xae\xc1\x28\x3c\xa6\x5a\x4f\xe2\x8b\x6d\x5d\x71\x6e\x45\xd9\xff\x57\xa8\xb7\x53\xd9\x0c\x37\x0e\xc5\x45\xe2\xe5\xee\xee\x41\x98\x79\xc0\xaf\x12\x22\x40\x1f\xf0\x60\xb9\xcf\xbe\x67\x2f\xaf\x08\x63\xd7\x7a\x1a\xa4\x56\x52\xc5\x5e\x52\xed\x11\x3e\x96\xdb\x3f\x9e\xc4\xc4\x07\x54\x8a\x50\x4c\x16\x2c\xcf\x97\xc5\x75\x6d\xda\x2c\x59\xe5\xc8\x37\xfd\xc7\xf4\x76\x96\x16\xa9\x72\x7c\x0a\x43\x22\x00\xa5\x02\x92\xba\x7c\xdd\x73\xe1\x40\x6e\x08\x6d\xca\x7e\x41\x3e\x22\x7b\x98\x07\x95\x74\x1f\x5a\x99\xa4\xe3\x5f\x40\x77\x01\xf3\xe1\x36\x02\xd4\xff\x9c\x0e\xed\xe1\xd0\x4e\xb7\x87\x73\x1e\x26\x74\x79\x09\x13\xea\x9b\x21\xb0\xe4\xd9\xf5\x80\x04\xab\x6b\x8b\xb8\xd5\xb8\x69\x44\xd5\x91\x95\x4e\x06\x17\x58\x82\x05\x13\xeb\xfd\x10\x04\x34\xf7\xcd\x41\x1a\x8c\xb0\x3f\x94\xd5\xe9\x15\xce\x23\x94\x9b\x32\x44\x7b\xd1\x5d\x47\xf2\xdd\xb5\xa8\x18\x27\xe8\x47\x59\xbd\xdd\x96\x55\x77\x80\x68\x42\x25\x75\x99\xc4\xdd\x6b\x76\x1a\x55\x47\x8f\x27\x8b\x26\x2c\xb5\xc9\x7c\x91\xc3\x83\xe5\x24\xef\x74\xc4\x41\x13\x2e\x15\x1f\x2c\x98\xdf\x11\x4f\x34\x9b\x74\xd4\x44\xb8\x08\x63\x5e\xd6\xa8\x5f\xa9\x5e\x61\xe1\xf1\xc5\xae\x4f\xc0\xec\x77\x19\xe4\x7c\xef\xf7\xab\xdd\x71\xc0\x55\xe9\x37\x03\x1d\x12\x5b\x47\xde\x38\x43\x7e\x3f\x04\xff\xea\x30\xe2\x08\xe9\xfb\xf7\xea\xf1\xcf\x19\xe4\x98\x8e\x22\x57\x9a\x7f\x96\x87\x93\xf5\xc4\x5d\x66\xfd\x50\x97\xf9\x27\x31\x48\x1d\xc5\x29\x62\x9b\x4f\x50\x99\xb2\x3a\xda\xb3\x1b\x35\x20\x87\xa9\x63\x1d\x71\x8e\x07\x74\x03\xe2\x68\xc3\x0b\x07\x6f\xf6\xeb\xc8\x58\xff\x5b\x95\x1a\x7e\x0d\xc0\x9b\x3a\x21\x96\x75\xd3\x31\xd0\x96\x6f\xf6\x5c\x18\x95\xb9\x8e\xb0\x43\x3a\x31\x21\xfe\x4c\x01\x1f\x7b\x1f\xeb\x15\xc7\x93\xc8\x5e\x8a\xdf\x66\x96\xda\xd5\xd9\xac\x69\x2a\xe2\xb8\x23\x95\x51\x63\x86\x2a\x4d\x79\x80\x31\x92\x3c\x3b\x66\xcd\xb0\x84\x74\x32\x28\xa9\x8a\x5c\xb5\xa7\xa7\x9e\x98\x50\xbf\x5f\xf5\x17\x48\x65\x63\x50\x4b\x71\xfd\xcb\x73\x38\x82\x66\xc4\x82\x16\x6f\xcf\x85\x9e\xb8\xfa\x9a\xb1\x10\x91\x1d\x7a\x02\xe0\x83\xea\xa7\xa8\x57\x65\x55\x41\xdf\x97\x07\x11\x82\xe3\x0b\xf8\xd5\x20\x6a\xcd\x0b\x82\x81\xe6\x12\x90\x27\xa4\x81\xe3\xe9\x6a\xb3\x98\xf5\x52\x34\x37\x1a\x13\x42\x77\xab\xcd\x61\x14\x58\xd4\x32\x0d\xd1\x8a\xb0\xb0\xf0\xb5\x95\xa2\xcf\x0a\x44\x56\x8d\x17\xbb\x96\x26\x8e\xa8\x0f\xbc\x65\x0a\x86\x8a\x0c\xae\x8b\x8a\x0d\x4a\xc4\x3a\xd5\xef\xd6\xbe\x9d\x1f\x70\x95\xda\x14\x83\xd0\x56\x02\x63\x63\x4c\x27\xcd\x97\xf8\x3e\xc6\xea\xe0\xf7\x06\xce\x9f\x20\xaa\x6f\xe2\x88\xab\xb8\x78\xb1\x2c\xe3\x7d\x84\xa9\xfb\xea\x9a\x82\x74\x0f\x7a\xdb\xa3\xa5\xb4\x56\x16\xca\x7e\x38\x78\x46\xc4\x6a\x25\xf2\x5c\x0e\xf9\x0d\xe6\x3f\xb7\x56\x0c\xe3\xc5\x45\xd9\x64\xe6\xb2\x9b\xc9\x74\xfa\x8e\x86\xd2\x04\xd1\xaf\xd6\xd9\xf7\x3f\x0d\x01\x0b\x52\x9f\x21\xc7\x53\xe1\x7a\x78\x21\x12\xb8\x43\xfe\x80\x53\x3e\x62\xf4\x03\x0d\x69\xac\x82\xce\xb9\xda\x5e\x41\xa3\x34\xf0\x58\x7a\xf9\xe6\xac\x80\xe7\x93\xa5\xca\x3b\xa0\xf0\xf2\x27\x73\x18\x64\x80\xe5\x19\x7a\xc4\x21\x0e\x1a\x14\x65\xed\x86\xf8\xd1\x0d\x9c\x11\xe0\x5d\x81\x5d\x6b\x19\x61\xee\x0f\x9a\x3e\xd6\xaf\x8d\x89\xb4\xf4\x94\x83\xd5\x31\x1b\x20\x5c\x6c\x0f\x20\x11\x41\xc2\xbb\x5b\xa1\xda\x2b\xc7\xd1\xa3\xd1\x24\x02\x92\x5a\x7a\xa3\x87\x3f\xd7\x0f\x4f\xeb\xed\xc6\xdb\xf0\x40\x78\xec\xc9\xb3\x77\xb8\x80\xce\x15\x6c\x37\xb7\xdb\x21\xdc\x0b\x88\x73\x87\xda\xa5\xdc\x9a\x70\x58\xdf\x30\x5a\x87\x10\xc4\x04\xd9\x5e\x50\xef\x7e\x38\xd0\x10\xa4\x40\x10\x8c\x2b\xaa\xf7\xac\x18\x6c\x6d\x10\x06\x92\xf5\x54\xe2\x58\xa4\x77\x78\x83\x8b\x1f\x01\x88\x68\x82\x30\x5e\x1b\x75\xeb\x80\x57\x68\x24\xeb\x63\x36\x24\x4a\xee\xae\x30\xc4\x29\xe4\x97\x9f\xa9\x00\x01\x44\x26\x4e\x6d\xb0\xf4\xdc\xd4\x5f\x27\xda\xe7\x82\xf1\xe3\x91\x8d\x4c\x8a\x00\xb1\xa7\xf6\xdd\x3a\x4c\x1f\xc4\xda\x72\xce\x0b\xed\x44\x05\xea\x7d\xe9\xbd\xc2\x89\x97\x02\xb1\xd1\xac\x13\x63\xfa\x99\x35\xaf\xdd\x97\x18\x7d\x85\x24\x89\x94\xea\x38\x08\xae\xd4\xa6\x01\x12\xc1\x30\xad\x30\x22\x70\x1f\xb8\x10\xae\x1b\x4d\x62\x62\x43\xbd\xef\x50\x34\xd0\x7f\x29\x6a\x22\x62\x05\xf4\x84\x46\xb2\x9f\xaa\xcc\xf3\xfa\x8f\xf6\xb8\x1a\x6d\x06\x90\x32\x82\xca\x2f\x88\xcf\x19\x8e\x71\x17\xe6\x00\x16\xd9\x87\x75\xbb\x96\xc5\x0a\x7c\x52\x2f\xe0\x2f\x11\x56\x99\xd0\x3b\x1f\x43\x5b\x07\x78\xa4\x30\x5c\x7a\x2a\xeb\x66\xd2\x92\x1a\x4c\x61\xff\xee\xf9\xe7\x3e\x3a\x35\x45\xd7\x43\x86\x04\xa3\x57\x7e\x8b\x72\x78\x1d\xdf\x1a\x45\x06\x3d\xb1\x76\x22\xb4\xfb\x50\xfb\xbd\xfa\x46\x2b\x14\xfe\xe3\x9f\x2b\x6f\x06\xc2\xf9\xd8\xb5\x26\x04\x25\xe2\x0f\xf2\x5c\xe8\xfc\x53\xee\xff\x6e\x50\x64\xa2\xac\xf9\x8f\x05\x02\x37\xe5\xd8\xcf\x00\x99\x6a\xab\x5b\x82\x4a\x7c\x8b\x29\x15\xee\x64\xd6\x48\x06\x09\xae\xab\xe7\x95\x7f\x1e\x95\xe8\xd4\xa7\x71\xca\x32\x1f\xa2\x39\x41\x51\x83\xa7\x43\x7b\xeb\xf5\xfe\xfb\x64\x4e\x28\xce\x15\xeb\x2c\xfa\x6b\xdd\x79\x00\xa5\xad\x54\x99\x1c\xe1\x0d\xfa\xc8\x8d\xef\x66\x2c\xb4\xca\x65\xf2\xdd\x2e\xd1\x4e\xea\x07\x98\x04\x88\x69\xec\x2a\xbf\x46\x9f\x13\x02\x85\x35\x6a\xf2\x7c\x81\x6a\xfd\x4b\x01\x68\xd0\x5e\xf1\x61\xac\x99\x35\x59\x89\x86\x24\xb8\x05\x1d\xf2\xf2\x03\xaa\x9b\xf2\xe3\x93\xc4\x8f\x21\x86\x20\x34\xdb\x3e\x23\xe2\xdd\x9f\xca\x8f\x4f\xf8\x38\xe6\x23\x11\x26\x10\x14\xcf\xc3\xa3\x78\xf3\x3e\xde\xa4\x03\x30\x36\x0a\xa3\xd8\xf2\xe9\xc3\xfa\x77\x1f\x69\x31\x61\x28\x3c\x1d\xec\x0a\x19\xdc\x56\x38\x2f\xba\xe6\x44\x20\xbd\xc6\xe0\xf0\x5a\xff\x6a\x2a\x31\x3a\x2b\x67\x37\x25\x13\x52\x91\x7a\x59\x9a\x1d\x86\x2f\x86\x1e\x8c\x09\x59\x18\x73\x5f\xb6\xf1\xed\x6c\xe1\xac\x7d\x1b\xc5\x8c\xf1\xe6\xe6\x7e\x0c\x26\xb8\xf6\xbc\x4d\xc8\x43\x0c\xbe\x2d\xf7\x1e\x4c\x61\xa2\x90\x62\xd1\x14\x5a\x18\x12\x86\x73\xd0\xc4\xb1\xdd\x60\xd0\x36\xf7\x14\x5a\x56\x27\x52\xe8\xbf\xe4\xcc\xf0\x37\x49\x43\x4c\xdb\xed\x9a\xb2\x12\x2f\x70\x0d\xb1\xf9\x7a\xc3\x36\x31\x8b\xc0\x9d\xab\x0f\x97\x9f\xe2\xa5\x1f\x96\x98\x13\x7c\x74\x73\xce\xf3\x81\x73\x6e\x62\x65\xcb\x61\x72\xd4\x3c\xf8\x5a\x75\x07\x4c\x12\x81\x6e\x17\xca\x5d\x91\x35\x56\xfb\x68\xf3\xc3\xdf\x29\x11\x10\x06\x3e\x18\x82\xb6\xde\xa7\x14\xcb\x60\x12\x05\xa1\xf7\x33\x03\xac\xb9\x2c\x5e\xb0\x0e\xa9\xbb\x1b\x08\x4c\x15\xa0\xf4\xc1\xe4\x28\x34\x14\x52\x9c\x5c\x96\x06\x6d\x74\x63\x0a\x1a\x4b\x1f\x0e\x5d\x95\xe8\xbc\xe9\x65\xd2\x50\x07\x56\xa5\x4f\xbd\xad\x9b\xd7\x6d\xbb\x1b\xf9\x1f\x4f\x39\x78\x1c\xb2\xa3\xb9\xac\xe1\x79\x7b\x37\xfe\xa5\x54\xd1\x98\x0f\x09\x0d\x7b\x7f\xc2\x39\x45\x86\x05\x36\x70\x61\xaa\xb2\x68\xb6\xe7\xc2\x52\x21\xb4\xb6\x5c\xdd\x88\xa3\x8f\xe5\x1a\x16\x12\x14\x5f\x2b\x2b\xdd\x6e\x0b\xa0\x2c\x51\xd0\x6c\x28\xc3\xb0\x04\x88\x35\xdd\x54\x59\xe8\x9f\x00\x96\xf6\x60\x58\x0b\x6b\x58\x6a\xd1\x8c\x96\xdc\x61\xf7\x96\x15\x8b\xd3\x09\x04\xea\xd8\x8d\x86\x23\x08\xbb\x47\x35\x61\xec\x02\xb0\xeb\xe3\x29\x2f\x2f\x4e\x41\xcd\x35\x73\xc5\xf1\x57\xdb\x0d\xb4\x53\xca\x99\xb7\xc7\x8c\x20\x04\x9c\xab\xfd\xb4\x5d\xef\x6f\xd6\x6e\x79\xf7\xe5\x26\x93\xed\x44\x84\x11\x26\x4f\x7c\x4e\xd5\x52\xd4\xf9\x9f\x16\x51\x37\xaf\xee\x6a\x5b\xb2\x70\xb5\x1a\xfa\x64\x81\x91\x3a\xf1\x25\xb0\x2e\x3f\xe5\x88\x51\xc6\x0f\xa9\xd2\x34\x35\x8e\x44\xb2\x11\x43\x5b\xc4\xe8\x58\xa1\xf3\xf3\xaf\xe7\xc5\x76\xbf\xde\xde\xff\x79\x70\x0f\xe6\x9f\x48\x27\x86\x5b\xed\xa9\x77\xac\x9a\x7d\x17\x39\x32\xb5\xb9\x66\xa0\x1a\xcf\x7a\xfb\xbe\x0f\x65\xd1\xbc\xe6\x9d\x92\xfc\x4c\x45\x80\x69\x6d\x0e\x7c\xc3\xd7\xf2\xc3\x11\x38\xee\xca\xaa\x5b\x0a\xc0\x14\x26\x15\xd7\x4f\xfb\x2f\xcc\x60\x63\x22\xe5\x13\x97\xb6\x08\xb9\x7b\x20\xa3\x05\xc1\x7a\xfb\x42\x97\x55\x0d\xd7\xb2\xf0\x86\x90\x48\x60\x58\x15\x59\xb1\x5b\x1f\x73\x18\x70\x31\x84\x28\x82\x85\xb8\xaf\xa2\x3e\xf8\x92\xf3\x03\x20\x72\xa9\xeb\x21\x8d\xcd\x66\xb4\xcf\x6f\xc1\xed\xbe\xc9\x58\x41\x6a\x4b\x00\x5f\x77\xcc\x56\xbe\x3d\xa0\x09\xb8\x8c\xf6\xe1\x24\x2e\x87\x0f\x1f\x6c\x31\x24\xe0\x51\xd8\xde\xf5\x58\x34\xa7\x7d\xd9\xd5\x1e\x34\xbe\x98\xd7\x90\x00\x02\x3f\xd9\x6c\x25\x18\x16\x81\x35\x53\x77\xc9\x90\x50\x5a\x7d\xe0\x1a\x59\x67\x30\xbf\x3f\x65\xaf\x36\x24\x62\x09\x06\x96\x8a\xf3\x71\x00\x84\xe8\x9e\x34\x62\x22\x11\x7d\xb1\x69\xf6\x5f\x68\x77\x0e\xcf\x4d\xe1\x3b\x71\x81\xab\xd9\x7e\xfe\xfc\xc4\x46\x33\xcf\x90\xc8\x24\x2a\xf2\x74\x79\xcf\x85\xdd\x78\xfd\xc5\x71\x98\x3a\x9a\xc3\x3c\x7f\x2a\xeb\xec\x0a\xa3\x62\x48\xcc\x35\x38\x61\xf7\x65\xfb\xa9\xbb\x6b\x93\xd8\x66\xdd\x51\x45\xb1\x12\xf9\xfd\x94\xbe\xd7\x90\x84\x3a\x09\x8d\xb3\xb4\x7b\x99\xdf\xa3\x47\xbf\x40\x03\x40\x5a\x5e\x3b\x05\x3e\x0f\x64\x0e\xae\x88\x39\x4e\x1f\x25\xf2\x7c\x53\x6c\x5b\x9f\xa6\xff\x44\x2c\xa0\x98\xc5\x7f\x5a\x6f\x7f\x8c\x66\x15\x0b\x59\xaf\x49\xb9\x84\xa6\x1b\x67\x26\x28\x19\x2a\x2c\x85\xd7\xb4\x3d\xc3\x68\xfa\xb4\xd0\x7e\x00\xc8\x32\x84\xe9\xb8\xc3\xc3\x5f\xab\xf5\x1b\xc2\x20\x42\x3a\xe0\x4e\x69\xb1\x97\xd2\x98\x0c\x1e\x8f\xad\xc4\xf6\x0b\x52\x50\x22\x6d\xd1\x30\x36\x62\x88\x88\x6d\xa2\xcb\x8b\xef\x20\x5b\x50\xd7\x48\x6d\x31\x9b\x8d\xf2\x5a\x11\xd2\x2f\x70\x1b\x86\x48\x15\x24\xa1\xf7\x9c\xae\xcc\xef\xe1\x2b\xaa\xd4\xca\x51\xd4\xd0\x58\x37\x2c\x2b\x8b\x7a\x25\xf2\x7c\x0a\xf7\x34\x44\x07\x14\xb9\xaa\xe1\x98\x35\x28\x31\x5a\xd5\xcf\x18\x7c\xd3\xd7\x89\x57\x43\x74\x24\x31\x7e\x89\xbc\x15\xf3\x5f\x5e\xd3\x14\x4c\x8f\x08\xc9\xca\xeb\x50\x85\x21\xa0\x28\x3a\x6f\xff\x16\x03\x1f\xd9\x04\x44\x09\x4d\x70\xd3\xa9\x40\x1c\xc7\x1c\x3f\x26\x20\x46\xc7\x2e\xeb\xb2\x3c\x0f\xab\xb7\x4c\x10\x84\x91\x25\x15\x44\xae\x07\x63\xb2\x3c\x13\xcd\x3c\x67\x85\x09\x02\x48\x4c\x97\x08\xf1\xdb\xf0\x88\x7c\xd8\x75\x0c\xc3\xd8\x51\x2b\xfe\x1a\xc8\xdd\x7d\x05\xbe\x30\x41\x18\x25\x18\x14\xf1\x79\x49\x97\x96\x74\x59\xc9\x74\x14\x56\x33\x41\x14\xa6\x1e\xfb\x61\xeb\xf2\xc6\x37\x8b\x62\x82\xb5\x6f\x15\xba\x79\xbb\x29\xee\xd2\x04\x91\xd1\x21\x1f\x04\x2f\xed\x5b\xcc\xd9\x09\x26\x88\x49\x42\x5d\x99\x99\x85\xf4\x8c\x90\x59\x26\x88\x43\x16\x87\x5e\x0e\x79\x91\x67\xa2\x1e\x9a\x37\x6d\x3b\x27\x4e\x68\x5d\xf6\xd3\x38\x88\x65\x4a\xa5\x0b\x97\x6c\x71\xa3\xf1\x36\xa6\x09\x62\xcd\x84\xdd\x80\x9c\xb0\xbb\x3d\x28\x46\xbb\x7d\x90\x10\xab\x5c\xde\xa0\xcd\x54\xf7\xa5\x2b\x26\x48\x42\x4d\x6c\x51\x1e\x66\x5b\x57\x58\xb2\x79\xae\xa0\xef\xc0\x20\xb5\x78\x64\xa7\x17\xd8\xe3\xcb\xbb\xd4\xb8\x09\x68\x64\x13\x51\x8b\x17\x31\x9c\x6d\x14\xa4\x67\x33\xbd\x3b\x6c\x83\xc9\xd0\x32\x66\xab\x18\x5d\x75\xd3\x5f\x61\x6f\x26\x83\xcd\x8d\xc1\xb9\x7a\x78\x15\xad\xb3\xec\x49\xe4\xdc\xc1\x30\xee\x2b\xe2\x10\xcb\x37\x91\xe9\xa0\x1a\x42\xf1\x4c\x20\x78\x88\x6e\x51\x71\x3e\xb6\x36\x65\xbd\xcb\x0a\x05\x8b\x33\x96\xef\xa1\x54\xc4\xf4\x5e\x86\xf3\x6e\x8f\xd8\x7f\x64\x4d\x03\xd5\xdd\x3c\xd5\xcf\x3c\xfc\xc5\x04\x92\x48\x04\xdb\xc8\x73\x6e\x2d\x49\x24\x76\x9b\xc7\x48\x98\x40\x85\xb6\x08\x11\xd1\xd6\x26\x7b\x87\x05\x4e\xfc\x5b\x91\x7b\x8e\x3e\x13\x28\xc5\xd0\xea\xdd\x2d\xbe\x2d\xba\xc0\xc3\x78\x2f\x0d\x94\xe2\x58\x64\xf4\x5d\xd4\xaf\xfb\xcb\x09\x2c\xb0\xaf\xb7\x9d\x4d\xa0\x13\x93\x76\x89\x3d\xfd\x02\xd5\xa3\x38\x42\xcf\x14\x6c\x02\xcd\x6c\xee\x13\x9a\xd7\xbf\x5e\xae\x9f\x7c\x37\xcd\x89\xec\x9c\xb6\x25\x88\xc1\x64\xd6\x26\x36\xe9\x60\xad\x7d\x5d\xbb\x70\x25\xb1\x3e\xf9\x21\xd0\x56\x7f\xfa\xe3\x78\xb6\x91\xce\x20\x64\x23\x0b\xdc\x04\x26\xa5\x38\x3f\x6d\x90\xa7\x1e\xc5\xdd\x4d\x60\x54\x12\x75\x55\xb6\xbb\x53\x9e\x35\x7d\x0b\xc5\x82\x1e\x4b\x44\xec\xd4\x26\x3c\xa1\xc6\x4a\x54\x7d\x47\x2d\xf1\xf0\x2f\x8d\xc1\x70\xcf\x78\x2e\x85\x41\x08\x08\xa4\x5f\xde\xed\x77\x37\x8e\x8b\xa1\x4b\x37\x8e\x3f\x5f\x18\xa4\x1a\x77\x81\x5c\xd4\x98\x4f\x1f\x6d\x1d\x61\xc8\x6d\x9c\xe4\x11\x5e\x90\xbe\xe6\xe7\xeb\xd9\x98\x0c\xea\x1d\x5c\x93\xd1\xcc\x81\x9c\x4d\x18\xea\xa0\x73\x0f\x75\xf6\x92\x0d\x0f\x86\x30\x36\x21\x6e\x33\xcd\x50\x35\xed\xaf\xbe\xfb\xf8\xf9\x93\x20\xe1\xca\x83\x55\x7c\x41\xce\xb5\x69\x6e\xc2\x84\x5b\x78\x61\x71\x3e\xb6\xb6\x4d\x9d\x79\xc9\x5c\xdf\x0e\xe0\x15\x3c\x7e\x96\x9f\xc2\x1b\x5d\x67\x2a\x12\x8f\xe1\xc5\x58\xdc\x0b\x14\x4d\x38\x19\xd9\x34\x54\xc4\x69\x8b\x97\x15\x16\xc1\x16\x50\x79\x5a\x6f\xff\xab\x69\x92\x22\xce\x74\x99\x35\xf5\x6b\x79\x12\x85\x06\x51\x75\xe3\xc3\x42\xc9\x5c\xf2\x60\xb0\xbb\x86\x2c\xe2\x69\x6f\x97\x5e\x87\xc1\x4c\xc8\x52\xab\xb1\xfd\x94\x35\xeb\x73\x35\x6d\x64\x49\xd8\x55\x24\xd5\xd7\x72\xfd\xe3\x57\x65\xcc\x02\x9d\x5f\xa0\xe9\x93\xed\x93\xb1\xe5\x84\x68\x84\xdb\x66\x47\xb8\x2f\xd5\x5b\x3d\x6d\x0f\x02\xe4\x77\xcf\xb3\xba\x59\x2e\x37\xfe\x3d\x38\x4d\xb1\x20\xe0\x79\x7f\x77\x7f\xb7\xff\x73\x80\x65\x35\x21\x77\xd1\x2f\x2c\x66\x79\x12\x99\xd5\x6a\xab\x6f\xcb\xea\x01\xda\x07\x9e\xf0\x35\xb6\x13\x89\xd8\xc4\x5c\x05\xb0\x04\xa8\x36\xc5\x03\x8c\x27\xb3\xa0\x1a\x03\xac\x7f\x6e\x36\xcb\xc5\xac\xff\xf5\x65\x4c\xc6\x84\x42\x02\x3e\xd3\xef\x65\x07\x21\x62\xb3\xe1\x1f\x13\x4a\x21\x89\xfb\x72\xa8\xd8\xe5\xa4\x81\x7d\x2b\x30\xa4\x0b\x7d\x10\xe7\xec\x67\xf9\x91\xc1\x68\x55\xa8\x50\xc8\xae\xbe\x19\x15\xcf\xca\x1a\x7c\xa9\xd9\x30\xa1\xea\xfb\x47\x02\x93\x34\xed\x12\xc6\xa0\xe7\xe1\x3d\x20\xed\xfe\x7a\x70\x9d\xbb\x1b\xc7\x31\x32\x7e\x3c\x3b\x61\xe9\x2c\x7f\xeb\x76\xc9\x10\x28\x47\x26\xba\xbb\xd5\x06\xc5\x52\xa1\x6b\x60\x3a\xee\xe3\x90\xfb\x4a\x78\xa0\x80\x09\x81\x03\x02\x9d\x9a\x57\xb8\xe9\x51\x00\xbe\x51\x48\x08\xfa\xd8\xba\x68\xca\xaa\x17\x0c\x1f\x0f\x2c\x28\x2b\xee\xab\x5b\xc3\x71\x10\xb7\x9d\xde\x11\x42\x8c\x59\xb5\x26\xc3\x53\xd9\x74\x4f\x61\x28\x8e\xd7\xea\xe1\x9b\x03\x2e\x99\x88\x44\x1a\x4d\xc5\x53\xbb\xe1\xaf\x2d\x3f\x6f\xd7\x16\x47\x89\xee\x09\x9f\xa1\x41\xdf\x0c\x2d\xb0\x7a\x98\x7a\x76\xdb\x79\x14\x06\x84\x42\xa7\x8b\xb0\xb8\xbf\xff\x73\x7e\xa9\x44\xa1\x32\x44\xb9\xcc\xf9\x64\xa1\x47\xa1\x4e\xb8\x65\x73\x18\x80\x42\x4c\x14\x85\x21\x52\x14\x08\xad\xaf\x98\x02\x67\xb7\x9e\x28\x52\x21\x73\xc6\xf4\xe2\x22\x8a\xe6\xa6\x2a\xb3\x66\xad\xca\xa2\x3c\x66\xff\x39\xc3\xc1\x71\x58\xb3\xee\x17\xb4\x49\x53\xaf\xc9\xb0\xc8\xf3\xdf\xcb\x29\x41\xa9\x89\x62\x07\xbc\x47\x8f\xa9\x1f\xa8\x98\x29\x0c\xce\xdd\x15\xad\x65\xe0\x4a\x2e\xbe\xe6\x50\xf9\xc7\x6c\xab\xbf\x9f\x50\x14\x3c\xc2\x7b\xc4\x23\xe7\x3a\x24\xc4\x52\xb8\xa9\x41\xd1\xd7\xe6\xd4\xad\x8c\x28\xa1\x86\xdb\x10\x67\xd3\x94\x6e\x37\x1a\x92\xe5\x9a\x28\x11\x69\xd2\x29\x7c\x8d\x0d\x3f\xd7\x83\x92\x08\x0f\x8c\xd7\x32\x9f\xa4\xe9\x4d\x44\x53\x82\xe1\x9b\x8e\xf6\x71\x81\x32\xbf\x7e\x8b\xec\xba\x31\x4b\x61\xfe\x62\x23\x80\xcf\x45\x93\xe5\x9e\x74\xcd\xf3\x45\x8c\x92\x26\xed\x25\xb1\x34\x03\x64\x50\x23\xf2\xb1\x68\x9f\x89\xa8\xb6\xf9\x9f\x83\x85\x16\xec\x4e\xd3\x5d\x3d\xa2\x86\x99\xa0\x2f\xe2\x6b\x4f\xcd\x2f\xcb\xb9\x3f\x31\x14\xa3\x54\x10\xe3\x9f\xbf\x9c\x4c\x05\x16\x0a\x62\x11\xba\xdf\xd7\x8b\xfb\xc3\xf3\xe3\xdd\xde\x3f\x20\x13\x0c\x43\xda\xcb\xed\xe6\xf1\xdf\xeb\xeb\x42\x35\x13\x31\x07\xf5\xf1\xa0\xb2\x39\x63\xab\x43\x26\x7f\x0a\x95\x33\x11\xd3\x0c\xd3\x72\xbb\xd1\x06\x1e\xb5\x6b\x97\xdb\xa4\xcb\x1f\xfd\x19\x34\x59\x1f\x3c\xa1\x22\xee\x20\xae\x2e\xc9\xf8\x20\xea\x29\x57\x50\xdb\x13\x64\x27\x8a\xee\xca\xb2\xb3\x7a\x10\xae\x1d\x10\xc8\x05\xfe\x1a\x16\x30\x62\x61\x7a\xc5\x5b\x51\x7e\x4c\x3f\x11\x67\xb1\x74\xc4\xc9\xdb\x72\x90\x6b\x1b\x50\xa3\xba\x9e\x92\x4a\xac\xad\x55\x50\x34\xf5\xd3\x28\xed\x6f\x22\xc9\x54\x24\x06\x61\xeb\x6b\x39\x8b\xc9\x5b\x4b\x61\xe5\x71\x2a\x10\xba\xb3\x16\x27\x5d\x40\x23\x08\xe2\x94\xa9\xb7\xe7\xa2\xdd\x2b\x9e\xc4\xe0\xa8\xee\x06\x5f\x43\x88\x45\x3a\x65\xb1\x03\x31\x10\x5a\x99\x3f\xe9\x22\x48\x28\x86\x7e\x4c\x56\xe8\xcd\xb9\xf1\xeb\x60\x79\xb1\x55\x0c\x2b\xd1\xc0\x4b\x59\x7d\xad\x09\x68\x22\x60\xa9\x67\xd5\xf9\x26\xf0\x94\x57\x55\x0f\xaa\x37\x91\x49\x08\xa6\x70\xd0\x68\xbe\x5b\x6d\x26\x91\x77\x13\x93\xc0\xba\x33\xc3\xd2\x81\xeb\x19\xf6\x17\x16\x7f\xff\x79\x62\xe2\xf4\x86\xe6\xb8\xf4\xce\x03\xb6\x5b\xd7\x3d\x80\x18\x7d\x70\x59\x81\x78\xdb\x67\x93\x80\x44\x1c\x12\x86\x68\xe5\x9b\xf5\xed\xe2\xf9\x7e\x7f\xd8\xad\x1f\x6f\x0e\xdf\x16\x3b\xff\xf4\x21\x8d\x23\xf7\xfa\x7b\x51\xbc\xf5\x25\xfa\x7e\xcd\xc6\xa1\x60\xa8\x7b\xb0\xcf\x1a\x31\x9c\x2a\x71\x14\x50\xea\x62\x59\x88\x19\x1f\x86\x57\xe2\x98\x70\xf4\x42\xf1\x8a\xed\xcd\xea\x4b\x96\x02\x13\xc7\x5c\x90\x64\x24\x1f\xed\x1a\x12\x1a\x78\x3e\xf0\xd5\x30\x01\x3d\xcd\xf7\x9a\x98\x06\x11\x9a\x82\x39\x98\x26\x20\x93\x61\xa0\xb1\x3d\xa9\x7d\x34\xf0\xa9\x82\x1d\xd6\x27\x5a\x14\xda\x57\x7b\xd9\xf5\x47\x1b\xc4\xcd\x62\x2a\x13\x4c\x63\xfa\xd0\xdf\x01\x8f\x60\x33\x23\x32\xe6\x2e\x48\x09\x43\x50\x8a\x93\x91\xb0\x41\xbc\x5b\xdc\x78\xfd\x3b\xa7\xa9\x42\x5d\x37\xbb\x99\xa1\x70\x7d\x17\x58\x1b\xfc\x74\xca\x22\xdc\x94\x0f\x2f\x56\xaa\x1e\xb6\x20\xf2\xe3\xa7\x48\x21\x13\xa7\x5a\x07\xdc\xb9\xe9\x77\xc3\x42\x97\xd9\x32\x0e\x77\x11\x8b\x23\x6e\x6b\x45\x8b\xb3\xc8\x0f\x1f\x23\xda\x11\x13\x33\x15\xa0\x8d\x66\x9f\xf5\x21\x2b\x1c\x49\xf7\x4c\x70\x2c\xe6\x22\xa4\x96\x8d\x03\x8b\x0f\x0f\xd0\xd9\xa5\x31\x57\x0a\x41\x0a\x15\x82\xd3\x9e\xeb\x01\xdc\x68\xde\xfd\x8a\xb9\x16\xb1\x1c\x61\x1e\xf5\x68\x76\x8a\xd0\x32\xfa\x3a\xe0\xcc\x4c\xdd\xb7\x89\x65\x2c\xb1\x54\xf3\x68\x8b\x54\x6b\x3b\x25\xc6\x07\x68\xac\x94\xb2\xe0\x1e\xe4\xa6\x6a\x7f\xc2\x1a\x32\x7e\xc8\x82\xc4\x0f\x95\x82\x34\x76\xa9\xf9\x1b\x1b\xd6\xd2\xae\x5a\x71\x1c\xa4\x75\xdd\x35\x4b\x51\x7f\xe6\xb0\x12\x79\x6e\x53\x76\x70\x45\x12\xd5\xf7\x8d\xc5\x20\x2e\xef\x8c\x84\x91\xa5\x17\x6b\x45\x30\x07\x66\xbf\x45\x47\x3a\x7e\x8d\xd7\xeb\x37\x1b\x88\xa3\x30\xe8\xc9\x78\x37\x66\xf2\xc9\x20\xb1\xfe\x93\xaf\x1e\xb1\x62\xba\x2e\xc5\xfb\x49\xd4\x39\x06\x1d\x21\x1d\x66\xdd\xc0\x29\xf4\x0f\x67\x22\x85\xae\xe3\xcd\xb9\x78\x81\xb2\x58\xbd\xb6\x1f\x64\x48\x18\xf7\xb7\xa9\x39\x3a\x44\xe7\xa7\xa1\x92\xd8\x48\x8e\x8f\xdd\x55\x0f\x0c\xe5\x0d\x96\x17\x34\xf4\x5f\x45\x7d\x45\xe5\xef\x2f\xd7\x80\x7b\xaa\xaa\xca\xba\x3d\x12\xde\x46\x5b\x9b\x31\x4a\x06\x4e\x9e\x37\x7b\x87\x4e\xdd\x7d\xfa\xfc\x33\x6b\x36\x21\x46\x7a\x6a\xdb\x7d\x25\x4e\x57\x9a\x92\x6d\x0f\x8d\xf8\x8e\x0f\x9c\xb0\x1d\xa8\x6b\xd7\x05\xf8\x92\x20\x54\xfe\xc4\x1a\x92\x01\xcc\xa6\xf4\x4c\x12\xb0\x18\x33\x91\x8f\xf0\xf1\xa3\x1c\x88\x17\xfc\xcd\x51\x77\x77\x09\x75\x8c\xbc\x26\x56\x59\x6a\xd7\x54\xd9\xe9\xd4\x61\xf1\xda\x66\x41\xad\x1e\x87\x7a\x2d\x32\x25\xf2\x51\x48\x32\x89\x12\x9b\xf9\xed\x15\xc4\xb6\xeb\x9f\x8b\xed\xcd\x28\x4b\x6b\x92\x38\x48\x23\x1b\x92\x47\xb1\xff\x60\xe7\x91\x44\x26\x49\x04\x4b\xbc\xfa\x55\xd5\x64\x75\xd3\xeb\xcf\x99\x84\x3a\x81\x61\xac\xf5\xfb\xcf\x39\xab\xe0\x78\x15\xf7\x4e\x28\x4d\x30\x32\x5f\x34\xaf\x08\x6a\x40\x92\xa8\x47\x7f\x8b\x34\xb0\x84\x79\x77\xab\xcd\xd3\xf6\x6e\xe5\x83\x01\x09\x23\x1c\x2d\x4f\x40\x6c\xa3\x33\xc7\x3b\xda\x0a\x93\xb0\x80\x13\xe7\x58\xf4\xea\x93\x7c\x64\x3c\x26\x2c\x10\x96\x6a\x3b\x7b\x07\x2f\x37\x71\x9d\x1a\x4a\x78\xcc\xd1\x36\xce\x6a\xef\x1c\x0c\x2b\x1d\x4c\x22\x12\x81\x45\x26\x96\x6e\xce\x33\xcc\xe2\xe4\x62\xbe\x8b\x8c\x30\x38\xe4\x4f\x39\x3d\x57\x73\x3a\x9c\x8e\x42\x72\x3f\x95\x1e\xe1\x57\xeb\xd1\x9d\x7a\x5a\x3e\x93\x48\x22\x03\xe5\xa2\x2b\xf6\xa0\xf4\x0d\x02\x90\x36\x41\x14\xea\xb5\xac\xe6\xb3\x07\x89\x54\x09\xc6\x90\x46\x1a\x44\xfe\x0e\x2a\x04\xe3\x6a\x4b\xbd\x93\x33\x5c\x0c\x7f\x6b\x13\xf0\xb7\x4a\x34\x86\xdd\x11\x92\x87\x79\x59\x55\xea\xac\x78\xf1\xa4\x97\xa3\x8f\xa1\x3a\x20\x73\xed\x70\xff\xa3\xa7\x32\xa9\xe4\x7d\xf6\x00\x19\x01\x87\x03\xa2\xc3\x08\x6b\x17\xf6\x9b\x1f\xeb\xc7\xdd\xe1\x76\xf3\xfc\x78\xb3\xd8\xdf\x6d\xba\x79\x04\x44\x22\x3b\x26\x12\x34\x96\x85\x5e\x5e\x1c\x33\xc6\xd0\xa4\x4a\x20\xb1\x87\xa6\xce\x8c\x99\x3f\xab\x13\xa0\x01\x7a\xed\xc8\xc2\x56\xbf\x22\x3c\x69\x59\xfe\xfa\x6d\x52\xa1\x34\xb9\x88\x2b\xe4\x7e\xb3\x34\x61\xfb\x81\x96\xcd\x60\xb8\x4c\x48\x50\x48\xe0\xfe\x61\xe1\x9f\xda\xd0\xc4\x16\xf0\x88\x06\x64\xa9\xba\x3f\x8b\x58\xf4\x20\x04\x97\x8a\x98\xad\x24\x33\x94\xb4\x1b\xe3\x00\x43\xb8\x6d\xad\x81\x47\x57\xf4\x68\x28\x51\x06\x63\xa0\xfe\x1c\xc1\xb4\xa6\xaf\xcf\xfb\xd2\xcc\xa7\x01\xb1\xd9\xc1\x07\xd1\x34\xaf\xf0\xf1\xb3\x2c\xfe\x0e\xad\xb2\xa1\x41\x18\x90\xb0\x47\xda\x89\xaa\xca\x3a\x6f\x9d\x06\xa9\xc1\x42\x93\x4c\x95\xd6\xf6\x9a\x9a\xf5\x34\xd0\x22\x4a\xbc\x40\x86\x6c\x46\x61\x34\x1a\x92\x18\xa7\x36\xea\x2f\xe1\x62\xee\x4b\x67\xdb\x56\x5b\x0f\xe5\x04\x3c\xa1\xda\x0d\xf7\x67\xdf\x29\x70\x89\xae\x32\xcf\x6f\xd0\x5d\xf5\x0d\xb1\x85\x32\x9c\x44\x55\xc3\xb2\x2c\xf3\xb1\x3d\x42\xc3\x54\xe0\x22\xc7\x43\xcc\x63\x47\xae\x50\xba\xbe\x33\x27\x89\xf1\x95\xfe\xd6\x08\xf9\x3b\xc1\x6d\x1a\x4a\x12\xf6\x6c\xb6\xcf\x3b\xf8\xcf\x4b\xd5\xed\xe7\x34\x0a\x23\x04\x62\xea\x72\x98\xe8\x99\xdb\x61\x68\x14\x5a\x84\xf9\x03\x40\x73\x3e\xcd\xaa\xab\x5c\x3b\x35\x34\x8a\x99\xb4\x36\x57\x79\x72\x84\xf1\xdd\x6f\x27\x11\xae\x1d\x8b\x04\xb1\x69\xad\x7a\x78\x3e\xd3\x38\x8a\xfc\xf0\x7f\x17\xf5\x2b\x68\x74\xe7\xae\x36\x90\x2f\x04\xf7\x0c\x4d\x42\x50\xa9\x83\x80\x59\x35\x37\x87\x65\x1a\x0f\x53\x7b\x64\x25\x48\xfc\xad\x91\x56\x60\x64\x8f\x51\x1a\x84\x58\xe6\x33\x30\x51\x7b\x3e\x7b\x8f\x65\xf2\x9d\x53\x2e\x11\xfe\x80\x2b\x5d\x18\x93\xc3\xdd\x6a\xd3\x35\x4a\x8d\xd9\x90\xdd\xf2\xce\xb2\x66\x7e\xa6\xa3\xe5\xfb\x1b\x8e\x74\x1c\x77\xf7\xf7\x77\xff\x7a\xbe\xbb\x39\xd8\x0d\xcb\xdf\x8e\x05\x01\xce\xbd\x7e\x56\xdc\x7e\x22\x35\x66\x28\x93\x91\xe7\x71\x7b\xb8\x74\xee\x59\x77\xf4\x53\xa6\x44\x4a\x3c\x6d\xa9\x13\x86\xbd\x0a\x28\xf6\xdb\x0f\xe5\x34\xc2\x50\x6a\xeb\x2e\x63\x51\xe8\xf6\x9c\x83\x0f\x14\x53\xce\x0d\xf5\x5c\x8e\x77\x05\xee\xe8\x3f\xe0\x32\x5f\x37\x6a\x28\x37\xc2\x3a\x87\xad\x69\x7e\x5f\xaa\xb7\xac\x78\x19\x2a\xd8\x18\x2a\x22\x8d\x60\xc6\x83\x67\x9b\xf8\x77\x59\xc0\xbd\x28\xf4\x6f\x36\xc4\x72\x25\xd0\xee\xaf\x4b\x43\x66\xb3\xc4\xc8\x1d\x70\xce\x9b\xec\x94\x43\xbb\xab\x4f\x41\xf5\x86\x0a\xc5\x70\xb0\x5d\x8c\x19\xeb\x89\xfe\x2e\x68\xde\xdd\x42\xb2\x14\x41\x41\x9b\x9f\x8f\xeb\xed\xe1\x69\xb3\xb9\x3f\xac\x36\x0f\x0f\x77\xbb\x5d\x7f\xb6\x50\x25\x0c\xf5\x05\x43\x58\xe0\xec\x0e\x95\x7f\x9c\xbb\x77\xb9\xbe\xb3\x89\xc2\x34\xe9\x6a\x1b\x6b\x87\x2d\x9c\x8c\xa3\xa1\x41\xe0\x3a\xf9\xa2\xbb\x01\x16\xd0\x50\xc3\x19\x73\xe0\x90\xe7\xbc\xc9\x8e\xa2\x81\xcd\xb9\x51\xe5\x71\x08\xc0\x37\xd4\x88\x18\x4f\x96\xbb\xd5\xe6\xa0\x1d\xe3\xb6\x6f\x92\x02\xef\x70\xbb\x5e\xec\x9f\xb7\xeb\x8e\x7e\x6c\x77\xd8\x3c\x1e\x96\xeb\xef\x8b\x7b\x1f\x40\x4f\x09\xb1\x5a\x9b\x99\x3e\x98\xb2\x4f\x5b\xcd\x4e\xf4\x94\x04\x20\x1c\x89\xcf\xcb\xb9\x5f\x7a\x29\x71\x0c\xe7\x96\x76\xeb\xf1\x7c\xdc\x9c\xa0\xb8\x01\x91\x4f\xb6\xe1\x94\x24\x0c\x37\x48\xf9\xb9\x42\xe0\x78\xb0\x52\x22\x6d\x01\x9d\xe3\xc1\xf3\xe9\x11\xdf\xaa\x94\x4f\xf9\xee\x2b\x81\x1b\x57\x3f\xf9\xd3\x20\xb6\x08\x5a\xe7\x3a\xd8\xd3\xe1\x51\x1c\xad\x9c\xf2\x64\x6b\xf2\xd7\xa4\xc0\x88\xdf\xf0\xd0\x64\x41\x42\x32\x7f\x50\xa5\x81\xb4\x75\x30\x28\xd2\xb9\x2f\x9f\x77\x37\xbd\x36\x90\x49\x03\x13\x29\x17\xa4\x59\x6a\x5b\xb2\xe8\x80\xc1\xbd\x03\x4b\xdd\x4c\x4e\x43\x66\x05\xfe\xda\xb5\xf9\x08\x1f\xdf\x3a\x8c\xaf\x49\x43\xce\x1d\xae\xc4\x3e\xb9\xe3\xf4\xf2\xad\x40\xb0\x06\x69\xd7\x08\x99\x35\xc3\xc8\x95\xef\x60\x54\x9a\xfa\x19\xa6\xbd\xba\xf4\xf5\xe0\x46\x81\x95\xae\x84\x5f\xd6\x02\xf6\x0c\x08\x16\x8d\xe8\x0e\xe1\xf1\x17\x8c\x54\x22\xc6\xc5\x8f\x8e\x98\xc7\xb5\xc7\x71\x02\xae\xde\xd4\xda\x73\xaf\x59\xa5\x97\xf0\xd2\xa1\x3a\xd2\x38\x09\xf0\x0e\xdf\xda\x1e\x65\x05\x3d\x68\xd5\xa4\x09\x09\x53\x47\xd0\xdd\x85\xe1\xd3\x24\xa2\xa1\x25\x4e\x80\xea\x05\x0a\xd5\x21\x33\x6d\x46\xb4\xeb\x95\x3a\x55\x50\x65\x3d\x92\x51\x36\x3e\x4d\x62\x61\x13\x30\xc6\xa0\x58\xdf\xf0\x0c\x4b\x93\x44\xa5\x2e\xb9\x6c\xcd\x58\x2b\x2a\xeb\x3f\x59\xd4\xc7\x69\x06\xff\x0c\x07\xca\x18\x26\xa5\x84\x23\x47\x34\xca\x09\xef\x9a\xf2\xb4\xba\x74\x86\x6e\x4a\x29\x47\xa0\xc0\x51\x54\x83\x81\xa0\x22\xc0\xc9\x8b\x29\xf9\x5c\x64\x47\x70\xdc\xdf\xe3\x11\xa7\xda\x20\xfa\x50\xe4\x36\x0e\xd1\x1f\x54\x69\x4a\x2c\x1c\xab\xc6\x57\x1d\xcc\xd2\x34\x8a\xb8\x19\x56\x3b\x7e\xba\x33\x0e\x0d\x81\x34\x4d\x58\xc4\x3b\xf1\xa4\xee\x9b\xa6\xd4\x60\xe8\x4b\xf8\xf9\x31\xa2\x7a\x30\x69\xca\x2c\x4c\xa1\xee\x91\xc8\x23\x37\x20\x65\xd2\x5a\x11\x58\x48\x62\x63\x1f\x9f\xb3\x57\x98\x94\x93\x84\xa4\x2e\xbf\xb6\x9e\xea\xdb\x99\x54\xc4\x96\x29\x4d\x41\x51\x9f\x2b\x5f\x0f\xfa\x8f\xa1\xcd\x9f\x0a\x66\x0b\x9e\x5a\x0f\xb6\x9d\x25\x83\x18\x73\x2a\x53\x69\xd9\x67\xea\x3d\x88\xe3\x3d\xda\x75\xf6\x1c\xdb\xbc\x43\x75\x67\xda\xbf\xce\x9a\xdd\xa9\x14\x44\x04\x83\x4a\x62\xd9\x25\x27\x53\x1d\x45\x58\x90\x22\xb4\x5e\x89\xfa\x15\x4b\x0e\x27\x00\xcc\x4f\xa3\xd5\xdd\x8b\xeb\x58\x0b\x67\x4b\x21\xb4\xde\x12\x6b\x74\x3f\x91\x72\x2d\x5c\xc1\x28\x4e\x94\x07\xf1\xeb\xa6\x2c\x7a\xb4\x6b\xaa\xa5\x55\x3f\x3f\x0c\x38\xc7\xe6\x49\x9d\xfd\x05\xca\xa0\x69\xf2\x0a\xa2\xfb\xda\x06\x42\xa4\x0b\xc2\x6c\x2e\x6e\x73\x78\x4a\xf9\xaf\xcd\x48\x48\xb9\x4f\xab\x62\xe8\xdf\xfd\xc2\xac\x41\xc3\x48\x6a\x30\x6c\x0d\xc5\x7f\xce\x70\x9e\x80\x8a\x18\x69\xbf\xc5\x60\x40\x1d\x88\xc5\x21\x36\xc6\x49\x15\x7f\x89\x8e\x70\x8e\x56\xc8\xf2\xdc\x2e\x9b\xbb\xd5\x66\x68\xb5\xb8\x7e\x01\x28\xa3\xba\x72\x3d\x4b\x32\x36\x9b\x26\x63\x81\x71\x89\x6f\xb4\x10\xef\x54\x79\x93\xd5\xca\x95\xda\xb7\xdb\xae\x78\x71\xd9\x2d\x76\x6d\xba\xb0\x90\x29\xde\x69\x8e\xd8\x91\x58\x34\xdd\x1b\x8c\x1f\x29\x94\x4c\x39\x88\xc5\xc0\x78\xeb\xf7\x21\x16\x45\x36\x6e\x5e\x43\x73\x0b\x50\x3f\x88\x5f\xcf\xa7\xa6\xbc\xde\xe0\x59\x94\x30\xdc\x27\x51\x52\x53\xe4\x3f\xcb\x2a\xef\xc8\x19\xcf\x1d\x0d\x90\x25\xad\xf0\x97\xa4\x81\x07\xd0\x78\x12\xb2\x4f\x3c\xc2\xee\x02\x2b\x3d\x71\x5b\x65\x4a\xa8\x1e\x96\xc7\x22\x16\xa7\xcc\xe7\x5e\xeb\x46\x14\x4d\x66\x4f\xc9\x2b\x75\x4d\xc3\xe2\xf6\x90\xc3\x8c\x7f\x03\xbe\xe0\xda\x37\xa5\xc4\x43\x03\xcb\x77\x78\xbc\x9d\xa5\x1b\xf3\x7d\x85\xc0\x8c\x60\xf9\x31\x20\x57\x71\x6d\x09\x09\xd0\x50\x33\x79\x76\xaa\x7f\x96\xdd\x63\x26\x49\x8c\x71\xd1\x02\x3e\xf0\x1c\x2f\xbb\x5f\x4e\x0c\x0f\x6d\x35\xe0\x53\x79\xb3\x1e\x60\xe2\x19\x25\x2a\x31\x9d\x17\xfb\x85\xec\x81\x61\xd4\x24\x20\xba\x02\xf1\x41\x58\x83\xa5\xa1\x94\x41\x1f\x58\xab\x17\x85\xee\x2b\x30\x26\x51\x64\x96\xf2\x08\x9f\xc5\x64\xbf\x0e\x62\x54\x4f\xe6\x3b\x28\x16\x0f\xa3\x4c\x9b\x73\xd3\xe9\x7a\x18\x96\x42\x84\xae\xb1\xf5\x1c\x77\xf5\xe9\x13\xe2\xad\xf1\x1a\x62\x41\x80\xe5\x05\x5e\x48\xae\x3d\xed\x7f\x0e\x23\xa0\x73\x5c\x22\x86\xb1\x94\x30\x07\x88\xae\x32\x98\x88\x9c\x19\xc6\x04\x21\x23\x7a\x1b\x6b\x19\xec\x9a\xea\x8c\xb4\x2f\xdd\x3b\x33\x01\x78\x6c\x9d\xca\x13\xf6\x43\x05\xea\x06\x8e\x2e\x5c\x77\x99\xa6\x2a\x19\x93\x29\x1f\x06\x17\x66\xe9\x03\x86\x67\xf3\xd7\x89\xc0\xfe\x91\x79\xcc\xa1\x63\xc7\x68\x0d\x3e\x51\xe9\xd5\xcc\x47\x10\x89\x55\x99\xac\xe0\xbe\x14\xfa\xd3\xa4\x34\x93\xa1\xea\x0b\x27\xd6\xcd\xeb\x3f\x2d\xff\xc9\x16\x54\x3b\x5e\xdd\x34\x93\x52\xa2\x7d\xbe\x91\xff\x8b\xc6\x08\x6a\xf1\x4d\x08\x29\xa6\x77\x56\x02\x9f\xd4\x25\xb2\x3e\x99\x94\x52\xd3\x78\x44\xce\xff\x08\xcd\x47\x59\xbd\xf5\xa4\xd4\xfd\x9e\xf6\x77\x83\x7f\xdd\xad\x01\xd3\xc5\x0f\x99\xaa\xca\x9b\x85\xb7\x41\x98\x4a\x55\x62\x89\x5a\x30\xe8\xff\x00\x9d\x15\xcb\x74\x14\x62\xdc\xf2\x08\xf9\x55\xd8\xc2\x77\x89\xb9\x50\xde\x5c\x2c\x7b\x6a\xa0\x49\x2f\x99\x62\xda\x54\x9e\x2f\x37\x59\x85\x7c\xa0\x96\x68\xf8\x94\x0b\x35\x9d\x86\x90\xc6\x98\x77\xab\x5b\x77\x57\x7b\xf3\xdb\x37\x32\xc3\x75\xe7\x69\xae\xf7\xdf\xf7\xa5\xe7\xb5\xfb\x3a\x30\xc6\x40\x48\x5c\xef\xff\x7e\x5c\x4c\x7f\x50\xc6\x69\xec\xea\x15\xae\x30\x73\xad\xbb\x89\x45\x01\xa6\x02\xf8\xef\xfe\xc3\x9b\xba\x9c\xa4\x01\x52\x14\x55\xa7\xf2\x63\x7e\x36\x71\xc2\x52\xac\xea\x78\x15\xf5\xeb\xb2\x9d\x1d\x43\xff\x8f\x13\xa6\xa4\xa3\xfd\x5d\x89\x53\xe3\x89\x12\xbe\x14\x22\x35\x9c\x98\x50\x4a\x1f\x83\xfe\xd8\x0a\x29\xb3\xc9\x9e\xcd\x83\x88\x63\xd5\xc4\x53\xf9\x06\xaa\xbc\x26\x2c\x9d\xdc\x31\x8c\x13\xea\xa0\xfd\xeb\xa2\xe9\x4b\xa5\xe7\xe7\x11\x0f\xb9\x1a\xc0\xcc\x9c\x35\xe8\xc9\xee\x46\xdb\x14\x0f\x75\x84\x8c\x5e\xef\x19\x7c\xdc\x02\x96\xa0\x3f\x39\x14\xd7\x2d\xf8\x4f\xca\xa3\x34\xc1\xe1\xc7\x64\xfa\x77\xc8\x4f\xdd\x11\xc3\x23\x69\x7c\x49\xab\x53\xd6\xb2\x74\x1c\x59\xf1\x72\x0b\x28\x57\x59\x77\xa7\x02\x8f\x89\x75\xf8\x9b\xcb\x09\x3c\x15\x87\xe1\xb1\xb1\x04\xdd\xa7\x6c\x2e\xb0\xce\x13\x1e\x61\x26\xd5\x16\x51\xd9\x7a\xc8\xf9\xf7\xa6\x22\x00\xe7\x3b\x23\xcd\xe8\xa7\xd4\xbc\x23\xe3\x84\xa7\x89\xa0\xb1\xd7\x94\x46\x9a\xc1\x2f\xa7\x29\x4f\x85\x46\x6e\x07\x8b\x2f\xbf\x8a\x36\x8d\x3f\x5d\xaa\x8c\x67\x77\xb4\x34\x59\xa3\xd0\x1e\x4f\x35\x41\x0b\xe0\x4e\x66\xff\x15\xf8\xe3\xc3\x9c\x2f\x4f\x21\x12\xc4\x11\x27\x43\xdd\x3c\x89\x4b\x79\x9e\x6c\x9c\x9c\xc5\x36\xd6\xb1\x78\x5e\x2f\x47\x17\xb3\xd4\xb2\xa8\x18\x4b\x46\xf2\x60\x19\xdf\xf7\xa2\x42\xab\xe2\xb9\xee\x3e\x00\x53\xc0\xcc\xe0\xfc\xbb\x05\x78\x3c\x1f\x1d\xa1\x9d\xef\x03\x04\x83\xb8\x0f\xe3\xdf\xe0\x3a\xc2\xea\x1e\x09\xcd\x7d\xf9\xd1\xfd\x15\x84\x13\x8e\x68\x3c\x34\xeb\x66\x39\x59\x02\xdc\x58\x42\xcc\x9d\x30\x70\x83\x5a\x87\x9f\x7c\x55\x11\x87\x18\x3a\x3d\xbd\x66\xb9\xd0\x90\x9f\x5e\x33\x31\xa8\x8b\xe2\x22\xb1\xe1\xf4\x63\x56\xec\xb2\x97\xa2\x9f\x57\x82\x6a\x74\x25\x50\x7f\xd1\x19\xd8\xd7\x65\xb7\x86\x0b\x29\xc0\x6b\x91\xd4\xbd\x6c\x6d\x7f\x1f\x09\xb8\xbd\x38\xf4\xe5\x0e\xf2\x7c\x0c\xaf\x1e\xbf\x98\xd0\x56\xa9\xdd\xae\xbe\x69\xfa\x7b\xf2\x72\x32\xb5\xf8\x72\x6f\x26\xa0\x0e\xe6\x90\xcc\xd5\x70\x29\xad\x70\x38\x12\x87\x58\xb1\x04\xfc\x04\x43\xfe\x55\xdf\xd5\x70\x84\x63\x1e\x4e\xe2\xb2\x2a\x8f\x13\xf6\x48\xd7\x49\x07\x0a\xd5\x94\xfe\x3b\xf5\xbd\xb8\x8e\x38\x71\x91\x68\xb8\xcf\xfe\x73\xb6\x48\x53\x5f\x18\xe8\x45\x3c\xfd\x73\x69\x08\xd1\x6a\x3a\x23\x00\x6a\x77\xb2\x35\x9a\xa3\x14\x1f\xd7\x26\x4c\x2d\x01\xcf\xc7\xba\x68\xcd\x8e\xb9\x8c\xf7\x38\x78\xfe\xc9\x19\xed\x0d\x15\x8e\xc4\x23\x03\x66\x5e\x35\x2a\x0b\x1e\xaf\x6c\x93\xc8\xd0\x87\x7a\xe1\x58\x56\x97\x9f\x55\xf6\x09\x3f\xaf\x11\x41\xcc\x50\xa1\xc9\xe9\x65\xa3\xfb\x87\xe5\x25\x96\x50\xcc\xf7\x4a\x13\x0c\x5e\xe1\xe2\x5f\xbf\xbc\x4c\x63\x5c\xe3\x27\x10\x81\x00\x92\x78\xd2\x51\x3f\x92\xbb\xac\x78\xc9\x5d\x9d\xd2\x27\x35\x25\x22\x0a\x83\x20\xf0\x88\xba\x31\xfa\xd2\x0f\x85\x88\x28\xc5\xc8\xb3\xa3\x0b\x7d\x15\x35\xec\xcb\xbb\xd5\xe6\x03\xe0\x2d\xf2\x0f\x1c\x09\x86\xf6\xca\xbb\x45\x0e\xc3\x50\x2c\x75\xf4\xf9\x45\xac\x06\x75\x1f\x4f\xf9\x5f\xa8\x6b\x18\x91\xc4\x92\xb9\x1a\x64\xcc\x0e\x22\xd9\xfd\xe8\xad\xa6\x17\xd0\x20\x36\xbe\xba\x2a\x17\x1f\xb5\x27\x2c\xb1\x28\xf0\x9b\x73\x35\xe0\xd0\x69\xbb\x87\xb8\xb1\x39\x91\x88\xb9\xc2\xcb\xaf\xdd\xff\xab\x9f\xa7\xd0\xa9\xcd\xdc\xe9\x8d\x79\x7e\xbe\xbb\x19\x45\x51\x44\x22\x28\xf2\xdc\x9d\x8e\xbe\x4e\xda\x3f\x0c\x4d\x62\xd6\x81\x66\x2c\x01\xaf\xff\x2e\xf5\x52\xe4\x79\xd9\xf7\xd4\x02\x45\x18\x1f\x4a\x7d\xce\x9b\x2f\x79\x0e\xc6\xe3\xcf\x02\x89\xb4\xe0\x43\xf1\xd3\xf9\x81\x6c\x8d\x75\xd2\xd1\x8a\xb8\x9c\x91\xff\x7d\x4e\x28\xca\x43\x09\xad\x6f\xdb\x39\xfc\x09\x77\x91\x11\x5c\x29\x5c\x49\xdf\xa1\xca\xb0\x9e\xcd\xfa\x27\xb7\x42\x35\xa5\x17\xf4\x33\x82\x43\x62\x65\xd5\x91\x17\x75\x32\x65\x04\x55\xd2\xaa\x57\x5a\x51\x81\xfb\x52\xbd\xad\x3b\x1c\xae\x10\x69\x8a\x8f\xa2\xc1\x86\xac\x26\x01\x04\x21\x64\x84\xe9\x5d\x64\x5b\x5d\x34\x8d\x50\xaf\x58\x8d\xda\x23\x29\x03\xe2\x27\xbb\xd0\xb1\x2d\x20\xef\x39\x3c\xf6\x20\x8e\x5f\x31\xcc\x18\x21\x49\x12\xbb\xb0\x59\xf7\xb5\xae\xcd\x73\xdf\x59\x47\x58\xcc\x71\x7c\x12\xe7\x1a\xf4\x20\x4d\x2e\x54\x64\xeb\x1d\x0c\x40\xfd\x4d\x20\x29\x4c\xf7\x92\x9a\x45\x98\x10\x3c\x34\xd9\x11\xb6\xbe\x08\xaf\x6f\xb5\xc2\xa8\xeb\xa2\x81\x6a\x0b\xc5\x90\xa8\xd1\x08\xad\xad\xbb\x27\x6d\x45\x88\xff\x33\x10\x9a\x74\x26\xbb\xa8\x9a\x3b\x55\x3e\x55\x98\x3e\x1b\x3f\x31\xc4\x0c\x59\xe7\x0d\x26\x6a\x6a\x54\xac\x2c\x3c\x9f\x88\x11\xc0\x2c\xc6\xe4\x6e\xb5\x39\xce\xa4\x35\x7d\x2f\x43\x45\xe2\x21\xd8\x50\xdd\x96\xd5\xbd\xa8\x9b\x07\x2c\xe7\xee\xdf\xc3\x50\x86\x11\xe2\x93\xb8\x40\xa7\xe7\xb8\x12\xa7\xac\x2f\x3b\x17\x86\x25\xc4\xd1\x90\xa2\xd0\xd1\x78\x2b\x34\xd2\x66\xa0\x70\xe7\xdc\x42\x0d\xa2\x52\xaf\x57\xcc\xfe\x9f\xac\x5d\x03\x52\x89\xbf\x2e\xb4\x19\x5f\x25\x89\xb6\x7c\xb5\x3d\xf9\x19\xee\xea\x77\x85\x29\x3d\x8c\x4b\x06\x3c\xd5\x41\xcf\x09\xde\x9e\xaa\x9b\xe2\x8b\x40\x89\x0c\x03\x8b\xd3\x43\xdd\xbf\xc2\x97\x7b\x5a\x39\xa2\x49\xcf\xc4\xb0\xd0\xe5\x6c\x56\x90\x77\xc9\x23\x19\x72\x8d\x49\xc1\x93\xa8\x9b\xc5\x4b\x05\x33\xf0\x1e\x19\x1a\x86\x6c\x64\x59\xbd\x6a\xad\x11\x57\x31\x6a\xeb\x1d\xbb\x2e\xb2\xd7\x59\x46\xc5\x8e\x75\xf3\x6a\x2b\x97\xd1\x40\xf9\x3e\x49\xa9\x5d\x95\xd7\xc9\x98\xb1\xd8\x72\xb2\x6d\x4c\x05\x35\x54\xb6\x5a\x79\x62\x18\xc8\x58\x26\x69\xe4\x37\xbf\xf9\xe3\x53\x26\x84\xe0\x51\xff\xbf\x65\x56\xf8\xc0\xe8\xe4\x36\x49\x60\x15\x52\xfe\x55\xd6\x59\x71\xae\x07\x75\xa8\x32\x09\x89\x67\x25\xbb\xcd\x0a\x51\xa8\x4c\xe4\xb3\x01\x62\x99\x88\x98\x85\x03\x02\xbd\xab\xf4\xa5\xa4\xa9\xb1\xde\xd2\xd3\xb9\x7a\x01\xa7\xd7\xd1\x8d\x3d\xd5\x9c\x0f\xc2\x39\x03\x4e\x99\x29\x89\xba\x91\x69\x6c\x93\x37\xdf\xcb\x73\x85\x2c\x64\x8f\xbd\x23\xd9\x75\x11\x60\x41\x4e\xcb\x76\xed\xd9\x89\x3f\xbe\x0b\x8b\xed\xbe\x6e\xc5\x49\x06\x5c\xc4\xbe\xdd\x04\xb8\x0f\xbb\xab\xf6\xa5\x75\x14\xee\xae\xe0\xe2\xae\x3f\xa7\x34\xb2\x0c\x88\x16\x7a\x32\x8d\x31\xce\x7f\x1f\x11\xa6\xa8\x52\x70\x3c\x64\x5d\x61\x68\xbd\xf4\xb0\x2b\xbf\x73\x8c\x7f\x49\x30\x8d\xfb\x50\x53\x7e\x87\x5f\x3b\xcb\x8d\x30\xbe\xab\x8c\x14\xc2\x60\x7a\x20\xdc\x13\x2a\xa7\x85\x43\x0d\x08\x23\x25\x97\xb8\x0f\x1f\xb2\xda\xd5\x61\x4e\x7e\x49\x45\x80\x53\x63\xf9\x7c\x7b\xdb\x15\x41\x48\xe5\x84\x32\xa4\x67\xe0\xf9\xb2\xd4\xcc\x5d\xa4\x63\x83\xfb\x19\xee\x33\x4e\x39\xf1\x6f\xc5\x5f\x24\x44\x2c\x54\x9d\xb8\x35\x06\xbf\x07\x53\x14\x44\xa2\x3a\x0e\xa5\xde\xba\xde\x7c\x74\x47\x81\x04\x80\xd0\x27\xb4\x6d\x10\x11\xaa\x76\xaf\xfc\x26\xea\xc5\x4c\xe0\x51\x91\x80\x62\x7f\x9f\xcb\x7f\x12\xea\xed\xea\x5c\x52\x81\x3b\x24\x3a\xf7\xac\x2a\x8f\xb6\xc6\xbb\x67\x0c\x9b\xdf\xab\x54\x48\x42\x4c\x04\x3a\x9b\xf6\x07\x5c\x06\xd2\xb7\x46\x85\x34\xc6\xe2\x39\xcf\x69\xfd\x85\x34\xa2\x51\x11\x89\x11\x85\x62\x95\xa1\x06\xd9\x74\x15\xa9\x28\x92\x98\x6e\xb4\xb0\xed\xdb\xb2\x6a\xce\x05\xac\xca\xf2\x2d\x1b\x72\xff\x18\x15\x83\x40\x63\x14\x83\xcc\x4f\xd0\xb8\xad\xed\xf3\x17\x48\x28\xc5\x77\x77\xb9\x69\x27\x29\xe8\x7f\x38\x01\x83\xd4\xfa\xea\x30\x2a\xfd\x18\x70\x26\x19\x95\x18\x8d\xfc\xf3\xb7\x5b\x0b\x31\x70\x7f\xa6\x42\x87\x1e\xd2\xe4\x99\x18\xd1\x76\x5d\x5e\xf6\x59\x93\x4f\x8a\x8e\x14\x95\xc6\x32\xe3\xa8\x32\x82\x62\x68\x1b\xa8\x54\x84\xbe\x06\x6e\xdd\xbc\xce\x7e\x67\x26\x02\x34\x11\x5c\x6a\x7d\x28\x9b\x3c\xff\xda\x3c\x89\x49\xe4\xd8\x76\xad\x64\x31\xaa\x53\x2f\xb3\x4a\xaf\x0b\x3d\x74\x48\x14\x97\x06\x11\x7c\x07\x77\xae\x7e\x88\x4a\x2f\x73\x31\x80\xd8\x0f\x2d\x5c\x25\x22\x92\xa4\xee\xe8\x79\xca\x85\x9d\x0f\xa3\x98\x84\x92\x31\x24\xc3\xf9\xe6\x98\xce\xe7\x9f\x54\x82\x75\x60\x5f\xa0\xb9\xad\x00\x6e\x2a\xf1\xd2\x99\xa2\x4a\x71\x65\xfa\xa3\x72\x52\x77\xe9\xfa\xe8\xc4\x52\xfd\x7e\xb3\x14\xf9\xee\x0b\xbb\xc4\xf8\xb8\x2b\x10\x70\x64\xf0\xed\x88\xdc\x67\x05\xfc\xac\xca\xce\x44\x51\x40\x6d\xa1\xe8\x41\x68\xfd\x03\xe0\x34\xdd\x88\x15\x68\x1a\xda\x74\x48\x5d\xe6\xef\xb0\xec\xf0\x5f\x0a\x80\x45\xc6\x73\x50\x94\x47\xa7\x76\x37\xfe\x75\x13\x05\x10\x0d\xe1\x77\x58\x1d\x34\x55\xcd\x34\x9a\x84\x1c\xe9\x72\xff\xfc\xf7\x6a\x4e\x57\xe5\x7c\x05\x0e\xd3\x01\x4d\xe2\xa0\xc3\xc2\x43\x15\x8e\xc1\x08\x3a\x90\x01\x7a\xa6\x47\xf1\xab\xfd\x59\x57\x88\x75\x8f\xc2\xee\xae\x4b\x18\xa5\xc8\xe4\x7c\xb7\xd9\x0d\x0d\xcc\xf6\xef\xe0\x7c\x34\x17\x28\xff\x39\xaf\x5f\x66\x74\xc8\x24\xa6\x57\x1b\xa8\x51\x14\xce\x69\x74\x35\x97\xf6\x1f\xfe\x7e\x91\x90\x6c\xc0\x08\xe1\xff\x1c\x1b\xc6\x9d\x9d\xfd\x7b\x76\xba\x62\xb3\x32\x3a\x49\x23\x6e\xab\x4a\x0a\xbb\x42\x12\x7f\x69\x22\x22\x3e\x46\x3b\xec\x1e\xee\xee\xd7\x9f\x39\xc6\x3a\xd1\x29\x82\x8f\xd7\x36\xff\x37\x0b\xc0\x1b\x8d\x6e\x02\x16\xa1\x7e\xd0\xa0\x4a\x0d\x3b\x4c\xbc\x0f\xc3\xbc\x9a\x06\x01\x0a\x18\x22\x3d\xe6\x38\x85\xa6\xa9\x13\x60\xeb\x4d\xc8\xae\x0c\xe1\xb6\x5d\x39\xbe\x5f\x1a\xd8\x9d\x16\xc1\xd6\xed\xe1\xf7\x6d\x7d\xd8\x78\x8d\x05\xa3\x53\x4e\xa9\x27\x29\x29\xdf\xe0\x58\x5e\x3d\xf3\x97\xa7\xb7\x4e\x85\xc0\x02\xbb\x73\x81\x41\xee\x2e\xa8\x3b\xbb\x28\x35\x63\x21\x62\x5b\xbe\x41\xb3\x7a\xcd\x4e\xd7\x9c\x47\x9a\xc9\x18\x49\x53\xde\x45\x91\xd5\xaf\xed\x31\x37\x99\xee\x9a\x13\x8e\x56\xd4\x84\x5b\x74\x77\x96\xc7\xac\x19\x28\xe0\x5c\x39\xdf\xb3\xa7\xb2\xe6\x26\x40\x73\xf6\x46\x94\xdb\x73\x4f\x9d\xa2\x45\xc0\xb0\x3c\xef\x55\xd4\x4f\x65\x99\x0f\x2b\xfd\x7c\x8f\x28\x41\x72\x65\x7f\x48\x4e\xb0\x0a\x5a\x24\x8a\x75\xf1\xb6\xd6\xbf\x2b\xcb\xfc\x21\x2b\x9a\x7f\x9d\xcb\x0e\x90\xa0\x65\xc4\x70\x4f\xdb\x57\xea\xcb\xc9\x22\xd3\x00\x63\xbb\xba\x3c\xcb\x2e\x04\xad\x65\x1a\x22\x89\xd4\x0b\x72\x5b\xf9\xbf\x2a\x92\x60\x38\xe3\xe4\xbc\x91\x55\xbb\x22\x86\xda\xd1\x46\xab\x30\xc6\x58\x5b\x0e\xa6\xe1\xf1\x64\x84\x4d\x12\xe8\xc4\x03\x11\x17\x79\xe7\xc7\x8f\x5f\xdf\xa4\x31\x02\x5b\x0e\x18\x42\x8a\x0e\xc3\x65\x67\x84\xa2\x7e\x7f\x5d\xfc\x61\xb2\xa2\x80\x89\x71\x09\x01\xa1\x18\x44\xb1\xd5\x17\xf7\x96\x57\x6b\xf4\x0b\x10\x10\x81\x3a\xde\x38\x9f\x47\x62\x62\xff\x98\xdc\x2b\x92\x3c\xf4\x7a\xa7\x0e\xec\x39\xc7\xf1\x6e\x20\xa4\xd2\x92\x65\x89\x2c\xaf\xaf\xe5\xcb\x0c\x84\x32\x4a\x12\x5f\xa4\x78\x84\xdf\x45\x87\xb0\x80\x10\x24\x77\x15\x08\x3b\xc8\xbb\xda\xde\xc9\xa6\x35\x79\xb4\x28\xa0\x98\x86\xf0\xd5\x5c\x8f\x65\x93\x19\xcf\x58\x35\xe9\x9a\x58\xc9\x6e\xa1\xf5\xea\x55\xb4\x33\xa9\xc3\xd2\xcc\x47\x11\x20\x02\x45\xb5\x17\x53\x37\x50\xe8\x65\x59\xd6\xcd\x80\x97\xdb\xf5\x8b\x63\xa1\x9d\x91\x10\x3f\x74\x86\x23\xc4\x29\xb5\xa0\xce\xd7\xf2\xe3\xe1\xe2\xb8\x13\x47\x26\xbb\xeb\x98\x30\x40\x90\xcf\xbe\xca\xfa\x1d\x08\x12\x63\xc1\xd7\xaf\x42\xbd\xed\xa1\x38\x97\xe7\x89\x4b\x04\x94\x68\x04\x0f\x75\x29\x49\x3c\xce\xa1\x9a\xe7\xda\x01\xaf\x6e\x81\x44\x51\x9d\xa6\x95\x87\x84\x4e\xdd\x29\x60\x82\x08\xac\xed\x95\xea\xbe\x6c\x9a\x72\x6b\x4f\xcf\xee\xf9\x98\x08\x88\x25\x27\xf8\x91\x0d\xc2\xe6\xc0\x94\xb4\x72\xdc\x55\x79\x2c\xdb\xef\x80\xfc\x77\xfb\x12\x01\x25\x62\x7a\xfc\x00\x0f\x38\x62\x15\xfc\x32\xf7\x31\x86\x2e\xbc\x80\xb2\xac\xed\x73\xbf\x97\x0d\xb4\xd3\x61\x05\x53\x2c\x04\x70\x11\x60\xc0\x77\xf9\xe3\x79\x78\x0c\x82\x08\x00\x91\x6b\xde\x65\xba\xd6\x9a\x9e\xec\x62\xfe\x3a\x1a\x63\x02\xb0\x75\x00\x5f\x72\xd1\x61\x0a\x40\x88\x10\x33\x1c\x4a\xe4\xf9\x1e\xea\xcf\x19\x5c\xae\x08\x6f\x0d\x08\xad\x3c\x04\xc5\x61\x7b\xbf\x74\x4b\x40\xca\x00\x92\x21\xfa\xfe\xbb\xa8\x17\x66\x52\xd8\x06\x5a\x71\xac\xa4\x7f\x05\xfd\x32\xa1\xb5\x02\xad\x43\x13\x7a\x66\xf1\xba\xe9\x53\xa4\x00\x91\xcd\xc2\x78\x6f\x58\x7c\x2d\xbc\x39\x02\xe6\x00\xa4\x56\x40\xd9\xbb\x0f\xb3\xb5\x81\x93\x97\x81\x54\x26\xe9\x00\x8e\xf4\xaf\xb3\xa8\x1a\xa8\x76\x20\xea\xb2\xf8\xad\xbf\xb9\x21\x2a\xe2\x76\x5a\x2d\xcf\x97\x65\x3b\xf7\xbb\xa7\x36\x41\x60\xeb\xaa\xb1\xa2\xe0\x07\x8c\xe5\x5b\x8c\x09\x44\x82\x26\xff\xdd\x6a\x73\xf8\xbe\xd8\xde\xac\x16\x4f\xfe\xca\x30\x00\x0c\x51\xdd\x97\xae\x50\xf5\x6a\x02\x0c\x3f\x95\x09\x93\x44\xd3\x11\x63\xcb\x48\x23\xc3\xf5\x8a\x79\x84\x45\x47\xf7\x9b\x6f\x07\x1f\x66\x74\xa1\x31\x1b\x8d\xe9\x7e\x64\x74\x59\xc2\xed\x91\x28\xb4\x7e\xc8\x8a\xf3\x15\x97\x84\x49\x94\x44\x58\xa2\x23\x43\x1e\xe5\x26\xfd\xf2\x34\x89\x21\x61\xd0\x6b\xa8\x57\x20\xf4\xe5\xb9\x9e\x2e\x7a\x43\x69\x82\xb9\x9d\x7b\xa7\x52\xfc\xd9\xe9\xfd\xe5\x54\x34\x34\x05\x0c\x3d\x78\x5e\xec\xa7\xaa\xfb\x26\x54\x31\xad\xed\xa0\xa3\x2a\x7d\xe7\x65\x1a\x0a\x3c\x0d\x1c\xe9\x5a\x6b\xb8\x8b\x6a\x72\x48\x99\x34\x0c\xb9\x93\x47\x6d\xb7\x18\xa8\x2e\x73\x16\xb8\x61\x41\x64\xf4\xc0\x31\x41\x0d\xc5\x89\x91\x6f\x58\x28\x30\xbe\xe3\x93\x2d\xf6\xc8\x9b\x0f\x1c\xcc\xbf\x24\x4b\x93\x58\x79\x55\x14\x51\x59\x65\xdb\x1b\x90\xe7\x97\xdb\xb2\x6a\xd7\xcf\xf6\x69\xe5\xdf\x8d\x47\x96\xfc\xf8\xb1\x14\xaf\x83\x60\x81\xe1\x89\x11\xb6\x5e\xb3\x69\x3d\x84\x91\x28\x83\x31\x5c\x32\x24\xfa\x2a\xe0\x63\x82\x5d\x76\x1d\x04\xa7\xde\xea\x5c\x96\x65\x3e\xa2\xb4\x73\x5d\x64\xac\xb1\xa0\xa3\x80\x5f\x16\x06\x3c\x80\x65\x1b\x99\x00\x75\x5e\xd9\xfa\x1d\x85\x16\x67\xbc\x90\xfe\x8d\xa5\xb2\x99\x1c\x28\xf4\x9d\x42\xf9\x14\x74\x0b\x7d\x0e\xc9\x48\xcd\x3d\x4d\xe8\xad\x32\x5d\x35\xdf\x57\x40\x76\xa3\x1c\xa5\x5d\x5e\xbe\x64\xf3\xec\xac\xc6\x28\x16\x05\xc2\x0b\xeb\x60\x82\xee\xae\x68\xe0\xa5\x75\x3a\xb0\x3a\x2f\x0a\x2d\x26\xc3\x77\xd7\x2a\xb0\x44\x02\xf6\x01\x6e\x6c\x5a\x61\x62\xcf\x18\x1d\x8a\xc0\x31\xf1\x7f\x42\xfa\xf6\x25\xe1\x8a\xbb\x0b\x70\x89\x65\xe2\x7e\xb2\xed\xcb\xbf\x39\x7d\x40\x26\xc8\xac\xfe\x70\x59\x96\x7f\xb3\x3c\xc8\x80\xb2\xa8\xd2\xf7\xac\x50\x99\x07\x19\x73\x42\x88\x8c\xb4\xe3\xd5\xf0\x45\x3b\xc3\x97\x6d\x7b\x18\x85\xf5\x02\x6f\x59\x9e\x77\xa7\xda\xc8\x44\xe6\x84\x04\x24\xd6\x7d\x4d\xbb\xfb\x6e\xc3\xea\x9f\xeb\x63\x6b\x98\xa0\xbd\xfe\x3f\x13\x0e\x8e\xf6\x27\x62\x83\x5e\x16\x46\x76\x76\x9d\xb7\xb9\x31\xdf\xcb\x73\x0d\x6b\x3d\x8e\x6a\xb5\x17\xb0\x28\xb6\x1a\xeb\x65\xf5\xd1\x3a\xd3\xad\xf5\xf9\x13\xb2\x49\xb7\x50\x4b\x2c\xd9\xab\xb2\x97\xd7\x26\x48\x27\xad\x91\xd0\xc6\xca\x76\x63\x1c\x09\xf4\x2d\xb8\xe9\xd2\x36\x1a\x83\xc0\xc8\x3f\xd6\xfb\xd0\xff\x2d\x0e\xa5\x30\x57\x6c\xf5\xbd\x37\xd8\x76\x89\x75\x60\xf1\x06\xa2\x86\xfd\x47\x39\xc4\x74\x75\xb7\x49\x9c\xa2\x92\x33\x52\xf2\x72\x7e\x1d\x70\x42\x92\x90\x7a\xe9\x67\xaf\x7a\xdd\xff\xee\xf8\x6d\x12\x6e\x0d\x9c\x83\x16\x97\x7a\x5f\xde\x4c\xdc\x68\x4e\x08\x0d\x42\xb4\xc0\x97\xe2\xbf\xff\x7d\x6d\x3a\x0b\xa7\x6d\x89\x6c\x28\x0c\x33\xff\x1d\x49\xef\xf2\x72\xcd\xfe\xd4\x76\x4e\x2c\x07\x45\xeb\xd4\x41\xd5\x5c\x76\x63\x22\x81\xb6\x07\x8b\x1c\xec\x5d\xe2\x93\x0e\xcc\xe8\x7f\x8c\xef\x95\x12\x2b\x6d\x3d\x54\x97\xff\x34\xe1\xf9\xc9\x2d\x82\x30\x95\x1e\xed\xda\x5c\x6d\x76\x6d\x8f\x90\x2a\x9f\x49\xe9\x58\x8c\xda\xbf\x2b\x8d\x8e\xd9\x7e\xf3\xc7\x00\x97\xd2\x36\xe8\x04\x03\x3a\xfe\x03\x59\x9b\x24\x9e\x8c\x03\xa3\x11\x06\x94\xb4\x8d\x4c\xed\x41\x1c\x9f\xa0\x9a\x50\xfb\xb7\xfd\x98\x2d\x6d\x3c\x17\x35\x34\xeb\xed\x2a\x4d\xd3\xc9\x78\x31\x4d\x7d\x6a\xfb\x3b\xaa\xdd\xe1\xea\x1a\xbf\x04\xe7\x80\xa0\xf8\x53\x05\x77\xaa\x1c\xbe\x86\x20\x96\x88\xca\x79\x9d\x23\x05\xf1\xc9\x58\x09\x9e\xe2\xd1\x01\xc5\x90\xe3\x9d\x13\x22\xd3\x4e\xcb\xeb\x67\x59\xbd\xf5\x18\xde\xf1\xf5\xca\x10\x8c\xf2\xc0\xa9\x54\xaf\xbf\x75\x7f\x34\x9e\xb5\x7d\x5d\xbf\x94\xfb\x3f\x6e\x27\x3c\xac\x9c\x10\x1d\x45\x28\x28\x33\x5e\x39\xab\x11\xcd\x21\x76\xb3\x62\x78\x1d\xdc\x7c\x00\x37\xf8\xdc\xc9\x6a\x2f\xa4\x06\x41\xe7\x47\xf1\x0b\x8f\xb3\xa0\x0f\x6e\x3f\xb5\xc3\xe9\x30\x10\xbe\x37\xb3\x4a\x31\x9e\x1e\xc9\x43\x67\xf6\x15\x4c\xe7\x8e\xd6\xdc\x89\x40\x7d\x78\x9b\xe0\x01\xa9\x3f\xec\x9c\x18\xfc\xf9\x2b\xbc\x03\xde\x48\x22\x07\xc3\xcf\xd5\xad\x7f\x0c\x08\xc2\xd8\xeb\xe4\xa0\x3c\x56\xdf\x90\xd0\x60\xa8\xe4\x5a\x97\x85\xc8\x1f\xb2\x42\x8d\xbd\xc6\xb6\xab\x4c\xac\xa9\x60\xc3\x4b\x1d\xc3\xdb\xf4\xcb\x19\xc2\x88\x2d\xb5\x7a\x87\x1e\xf7\xde\x0b\x27\x76\xfa\xb3\xb6\x7f\x40\xe2\x94\x68\x97\x76\x5a\xd4\xab\xf2\x98\x15\x2f\x8b\x42\xdf\x62\xfc\xe8\x37\xdf\x29\xb5\x8a\x14\xf5\x80\x99\x61\x7e\x23\x0b\x88\x4a\x89\xec\xf9\x47\x5a\xbb\x0a\x03\xd1\xf5\x6d\x59\x3d\x95\x65\xde\xdd\xd2\xa4\xa1\xb3\x99\x7f\xc0\xa5\x5e\x5e\x9e\xce\xd5\xa9\xac\x27\x5b\x59\x10\x52\x81\x13\xd1\x4a\x57\xd5\xeb\x5f\x50\xa9\xac\xee\xc9\x4a\xe6\xe2\x48\xed\x65\x2a\x16\x7d\x1d\xef\x84\xac\x9c\x93\x20\x4a\x0c\xe6\xdb\x8f\xe2\xd7\x16\x84\x7a\x75\xfe\x68\xdb\x22\xec\xbe\xee\x1d\xcc\x61\xa6\x6e\xf2\x23\x91\x0e\xa0\x53\xed\xeb\x88\x3d\x9c\xb3\x36\x02\xfa\x4c\x2e\x8c\x25\x49\x6d\xee\xa9\x54\x6f\x22\xab\x50\xa8\xc1\xb5\x25\xa1\xc6\xb2\xb6\xfb\xac\x35\xf5\x1b\xf5\x37\xd8\x90\xda\xab\x20\xd0\x6a\xe8\xfc\xb9\xcf\x34\x55\x03\xe2\x24\xa0\x52\xa1\x27\xa0\xb0\x64\x64\x5a\x67\xe8\x3a\xa5\xc4\x32\xf0\x61\x15\xf8\xfb\xe0\xb8\x0c\xd2\xc0\x26\xc2\xcb\x02\xfa\x3f\x59\x55\xfb\xba\x35\x43\x8b\x73\x8d\x56\x61\x30\xf9\x59\xa6\x62\xa7\x7d\x5d\xed\xa0\x7a\x87\xca\xd9\xee\xd7\x96\x26\x27\x81\x0c\x89\x65\x2b\xc0\x5a\x8e\x53\x56\x74\x3f\x2f\x9d\x54\x08\xbc\x0b\x75\x1e\xf8\x4c\xbe\x99\x5b\x05\x13\xac\x49\xf1\x30\xb2\x81\x49\xe2\xba\xa9\xd8\xca\x6a\x5a\xc4\xc9\xef\xed\x44\xf5\x3f\xa0\xd2\x04\xbf\xbf\x2a\x8f\xc7\x69\x84\xba\x6d\xe6\x31\x66\x78\xea\xd7\xf2\xc3\xef\x6e\xc3\x22\xac\xb6\x0b\x88\x74\x28\x01\xbb\x56\x65\x7d\xa9\x1b\x38\x0e\xc8\x9c\x39\x09\x74\x9a\xe2\x24\x78\x2f\xb1\xaa\xd4\x12\xa6\xb5\x5e\xea\xf8\x8d\xb4\x20\x18\x2d\x42\x8b\xc9\xe6\xef\xa7\xfb\xd0\xe8\x09\x43\x12\x26\x18\x8c\xd8\x18\x93\x29\x91\xb7\xe7\x8c\x07\x68\x70\x12\x06\x8a\x44\x4e\x87\x47\x67\x4d\x8f\xab\x18\xdf\x23\xd0\x1a\x19\x49\x1e\xb2\x62\x09\x8d\x0d\xc5\x5b\x7a\xb7\xc9\x6c\x0a\xa3\x90\x5a\xfb\xb7\xb4\x96\xf9\xfc\xf1\x1f\x46\xd4\xb2\x4f\xef\x5e\xbd\x38\x43\xfb\x47\xc5\xd1\x9f\xfb\xf3\x7c\x1a\x12\x72\x72\x12\x26\x42\x62\x28\x0d\x9a\x0e\x0d\xd7\x94\x3f\xfe\x5c\x4d\x7e\x3c\x01\x0b\xb2\x2f\x2c\xb6\xfe\xce\x2f\xe2\xb0\xf5\x62\xbd\xd8\xc0\x4a\x78\x39\x87\xb6\x41\x68\x04\xc2\x2f\x64\x8d\x9f\x6e\xf7\x71\x95\x01\x6a\x7b\x49\x8d\x65\x9d\x5b\xac\x47\xff\x56\x89\xd3\xeb\xb2\x2c\xa7\x65\x64\xbe\xb3\x06\xc4\x8b\x59\xf2\xd0\x29\x35\x2c\x27\x61\x9a\x58\x64\x32\x12\x98\xb8\x60\xe3\xc6\x98\x49\x2f\x16\x25\x18\xe1\x36\x16\x8c\x15\x0e\x63\x33\x6d\xb3\x09\x71\x5b\x95\xa5\xbe\xac\x73\x44\x82\x2c\x2f\xbb\xb3\x44\x8c\x34\x2a\x46\x8c\x9f\x8a\xc7\x71\x2c\x3a\x4c\xa3\xfc\xe4\x9c\x0f\xb9\x88\xc2\x3e\xb0\xb3\x15\xe7\xba\xaf\xb0\x0e\xba\x95\x73\xee\x44\xbe\x38\x09\x05\x8b\x94\xf6\x15\x4f\x16\x88\x7a\x9e\xb5\xfc\xbe\x0a\x12\xb4\xf7\x91\x36\x08\x87\xa1\x26\x9f\xad\xe5\x24\x54\x44\x23\x15\xa1\x27\x5b\xf2\x4c\xca\x75\xb7\x47\x87\x2a\x12\xda\x46\x52\x36\x0f\x77\x8b\xe0\xb0\xb8\xb9\xd9\x76\x6d\x94\x21\x22\xf2\xa9\x2a\x1b\xb4\xf5\xb7\x30\x56\x01\x98\x5f\x35\x8a\x87\x16\xa2\x96\x8b\xcb\x77\xe1\xcc\x9a\x51\x99\x99\xfd\x5f\x2f\x8e\x3f\x14\x77\x3f\xf7\x0a\x67\x9c\x84\x3a\x49\x10\x58\xb0\xdf\xec\x17\xf7\x43\x0d\x74\x4e\x42\xa0\x31\xc6\xe8\x36\xa2\x79\xed\xfe\xa6\x01\xf5\x30\x21\x3b\x05\x34\xd9\x9d\x4f\x28\x53\xa9\x27\xd3\xc3\x04\x31\x1f\x1a\x4c\x9e\x07\x67\xf6\x6d\x22\x42\x20\x72\x3c\x50\x8f\xf0\x31\xc9\xd7\x0f\x0f\x8e\x88\xc4\x51\x6c\x05\x5b\x0d\xec\xcb\xdd\x59\x8e\x37\x4d\xdf\x0b\x62\x4c\x56\x5a\xc8\xc3\xb9\xd0\x5b\x31\xf8\x1e\x51\x90\xda\x42\x62\x9c\xbb\x56\xc8\x00\x55\x56\x7b\x32\xa4\xb6\x93\xd4\xf8\xbd\x0f\xf2\xec\xc4\x1b\x6e\xab\xf2\xb8\xc3\x42\xf5\xf1\xac\x8c\xc2\xc8\x9e\x8f\xfb\xea\x5c\x37\x39\xd4\x75\x07\x89\xc5\x33\xe3\xa1\xd4\xad\x8f\xdb\xbb\xed\xfd\xce\x1e\x85\xd2\x78\xc1\xb2\x1b\x71\xb1\x91\x24\xff\x04\xa1\x09\x44\x6f\x9b\x2e\xa1\xf8\xaf\x15\x1f\xfa\x64\x10\x23\x0d\x68\x9c\x61\xd9\x5d\x17\xb5\xe1\x24\x8a\x53\x6a\xe1\xca\xe7\xa3\xb2\xd5\xc2\x5d\x8b\x8c\x43\x47\x79\x3d\xa8\x07\xe5\x24\x4a\x64\x8c\xb4\x3f\xcb\xac\xc8\xce\x9f\xa7\x96\x38\x89\x68\x1c\xa2\xfd\xb6\x2a\xeb\x63\xe9\x2f\xf7\xaa\x79\xb5\x47\x28\xef\x26\xfa\xc0\x9c\x44\x3c\xb2\x6f\x7e\x14\xbf\x9e\xa0\x42\xd0\xa3\x6f\x01\x82\xe2\x9e\x05\x7c\xdc\x88\x8b\xff\xab\x88\x00\x11\x01\xc6\x51\x04\xdf\xa9\xee\xe7\x04\x0b\x91\x1f\xce\xd1\x5e\x9c\xba\x9a\x42\xf0\x96\x75\x24\x03\x83\xc4\x58\x50\x08\xd5\x74\xec\x78\x22\x3f\xe4\xc3\x58\xcf\xec\xca\x8f\x94\xb2\x81\xd7\xb1\xfa\xfa\x2c\xa0\x84\x93\x48\x13\x81\xc2\x0f\xa7\x09\x96\x65\x74\x9a\x46\x3a\x8a\xe2\x11\x06\xe8\x16\xd5\xde\xc6\xab\x28\xd2\xdc\x22\xbd\x7f\x82\x44\x42\xaf\xee\x6a\x19\x60\x58\xe2\xd7\x6f\x83\xa9\x04\x3c\xc1\xe9\x72\x03\xf5\xdb\x95\x26\x30\x27\x91\x09\x55\x6c\x55\x22\x5a\x8f\x1d\x8a\x06\xf7\xf6\xee\xa8\x8d\x8c\x89\xb1\xee\x15\xb1\xaa\x37\x3f\x22\xf7\xf7\x38\x88\x03\x44\xea\x0f\x18\x3b\xda\xbf\x4a\xcb\xd8\xb1\x7c\xfc\xd9\xfd\xc9\x84\xf8\x45\x7d\x8e\xc3\x27\x57\xaf\xdd\xae\x38\x30\x36\x0d\x7b\xc4\xb4\xf4\x30\xa8\x79\xc5\x45\xc2\x51\x28\x07\x81\x85\x1a\xde\x63\xbb\x48\xc3\xa7\x2e\x0c\x14\x87\x42\x84\x16\xfb\x81\x5b\xcc\x6d\x7b\xb2\xb6\x27\x0c\x4c\x0e\x8f\x38\x94\x56\x34\xe7\x84\xc1\x8a\xd1\x4a\x88\x43\xad\x34\xf7\x6d\x0f\x65\x01\x97\x7f\x9d\x85\x2d\x4a\x72\x3d\x22\xa2\x88\x0b\x5e\xfe\x0e\x55\x9d\x95\xc5\xdd\xf1\x64\x4f\x36\x87\x2e\xfc\xa2\x1e\xa7\xbd\x3e\x90\x74\x98\xcb\x5b\xe4\x39\x4a\xc6\x4d\xd3\x88\x9c\xc4\x71\x02\xdc\x0c\xad\xe3\x47\x39\xe9\x41\x0d\x18\x4b\xbb\xff\xb1\x3a\xdb\x8a\x96\xd1\xc7\x8e\xd3\x98\x28\x07\xdf\xd9\xd4\x4a\xf8\x75\x10\xa7\x42\x63\xcd\x53\x87\xcd\x72\x9c\xcd\xe3\xab\x59\x24\xb0\xc6\xe4\xa9\x9d\x93\x56\x92\x61\xda\x83\x05\xd4\xd2\x15\xd7\xe7\xbc\x41\xf9\x8e\x6a\x30\x9c\xcc\x24\x56\x18\x69\xe4\x56\x7f\x1b\x88\xcd\x8f\xdf\x47\xa4\x3a\xb6\x42\x19\x5a\x8c\xa8\x3a\xda\x36\x61\x85\x83\x4d\x59\xc1\x4b\xd5\x01\xbd\xda\x16\xad\xd0\x38\x5c\x6f\x57\x61\x64\x05\x2d\x86\x33\x68\xfc\x13\x32\xa6\xf8\x4e\x8f\xeb\xcd\xd0\x76\x8b\x25\x4d\x2d\x1b\x8a\x2a\x91\x47\x5d\x5b\x37\x3a\xef\x3e\xbc\xd4\x54\x93\x01\xd5\x6e\xdd\x09\xa9\x8f\x7f\x40\x51\xc2\x3b\x6e\x6a\xa1\x9a\x4e\xc0\xa2\x6d\x93\x1a\xb3\x86\x2e\x24\x33\xa8\x62\x71\x1d\x74\x68\x5d\x6e\x69\xc9\x90\x36\x13\x73\x2b\xd6\x91\xc1\x64\xcc\xdd\xe2\x66\x6c\x69\xc5\x3a\x01\x0c\xa6\xda\x9c\xcc\x61\x25\xea\xd7\xc3\x53\x55\x96\x66\xa6\x2a\xb8\xed\x2e\x22\xb4\x45\x96\x67\x2c\xba\xfa\x8b\x50\xd6\xfc\x8e\x18\x6b\xc5\x10\x1c\xe6\x18\x42\x2b\x8b\xcf\xba\xcf\xe4\xf4\xa9\x5b\x03\xa2\x3d\x18\xb7\x3b\xc7\xaf\xe6\x1a\x20\x50\xb6\xee\x00\x65\x93\x7c\x0d\xdf\xe8\x47\x12\x12\xaa\x70\x10\x05\x1d\xe7\xdf\xbc\xf9\x92\x10\x69\x8b\x08\x4b\x99\x67\x2f\x6e\x21\xba\xa6\x40\x07\x4c\xf8\x1c\x92\x55\x3d\x9e\xec\x43\x49\x98\x28\x62\x41\xa7\xef\xf7\x83\x40\x47\x12\xf2\x04\xa2\x5e\xc2\x74\x0c\x4b\xf1\x7d\xa4\x25\xb2\x45\x95\x34\x31\x92\xf1\x1d\xfb\xcf\x49\x04\x26\xc1\x28\x72\xe1\x72\xd7\xae\x16\xe2\xeb\xf4\xaa\xbf\xd8\x58\x4a\xc7\x51\xcd\xc5\xff\x61\x7d\xc9\x32\xfd\x9f\x49\x32\x73\x76\xff\x49\xe2\xd4\xf2\x4c\x38\x06\x58\xf1\xeb\x9f\xe7\x6b\x8d\x70\xdf\x57\x4a\xc4\xe5\xdc\x3d\xde\xed\xef\x16\xf7\x87\xbd\x4b\x35\x62\x93\x06\x8b\x26\xed\xa9\xd8\xce\x3d\x8f\xc6\x8c\x09\xda\x27\x57\x39\x49\x92\x20\x45\x80\xe2\xf3\xef\x37\xc3\x55\x98\x24\x21\x47\xb0\x92\x8d\x4d\x78\x5a\xa6\xc9\x0e\x9e\x24\x52\x61\x18\xee\x5f\xdb\xf1\xc5\xc6\x48\x37\x44\xea\xcd\x73\x14\xcc\x6c\xac\x49\x2a\xed\x11\xa8\x44\xb1\x6b\xca\xd3\xcf\xb2\x7a\xf3\xf7\x48\x4d\xc8\x7a\x63\xeb\x3e\xab\x47\xc5\xd2\x7f\x6b\x59\x24\x4c\x31\xe1\xa4\xb6\x97\xe7\xcb\x2d\xc0\xf2\x34\x7d\x03\x06\x21\x12\xb6\xc9\xf3\x65\x5a\x43\xe7\x7a\x70\xaa\x75\xe0\xb7\x11\x14\x04\x5d\x9e\xab\x59\x20\x29\x27\x89\x48\xad\x30\xe5\x76\x26\x2e\xf9\xc9\x15\x9c\x60\x68\xac\xc0\x08\xfa\xdd\xf1\x58\x56\x8d\xc8\xbb\x35\x23\x20\x41\x88\x8b\x01\xf5\xea\x90\x61\x18\xb7\xec\x55\xfe\x38\x49\x64\x1a\xe2\x7c\x3e\x58\xf5\x2a\x97\xdc\x74\x72\x86\x9f\x4c\x29\xc9\x08\x1e\x9f\x68\x97\xed\x9a\xb3\x86\xa2\x29\x1c\x2c\xb2\xfb\x75\xa9\x13\xc4\xec\xd4\xe7\x13\x54\x7f\x2f\x7e\x99\x48\x90\x08\x55\x47\xf8\xc6\x53\x55\xca\x1c\x8e\x93\x41\x57\x3c\x46\xec\xcd\xe2\x79\x7b\xf7\x87\xff\x2d\x1d\x85\x68\x54\x1c\x0a\xf8\xe8\x88\x01\x7c\x9b\x12\x58\x1b\xf9\x2a\xde\x61\x9d\xb5\x7b\xfd\xa2\x71\x30\xbe\xab\xca\xc7\xf9\xaf\x08\xd4\x52\xd3\xfe\x73\xb7\x79\x3c\x0c\xdc\x45\x4a\x08\x0f\x9c\x69\x6c\xe3\x14\x33\xf3\x94\x92\x48\x7a\xcd\xf4\x75\xad\xaa\xf2\xa3\x5e\x5e\xae\xe4\x10\xda\x7e\x31\x21\x36\x30\x57\x74\xf7\x07\xab\x5d\xf1\x7b\x59\x95\x05\xfc\xd7\x9f\x40\x34\x70\x35\x60\x1d\xb3\x63\x99\x23\x49\xf7\x98\xe5\xa5\xeb\x0c\x98\xf5\x36\xe7\x42\x6f\x8a\x49\xde\x8d\x06\x5a\x84\x58\xd0\xbf\x78\xfc\xbe\xd8\xef\x17\x8f\x4f\xdb\xcd\x1f\x7f\xae\x17\xbb\xfd\xfa\xf1\x66\xe1\x74\x81\x39\xa1\x61\x10\x23\x5b\x9a\xe5\xef\xfc\xe3\x69\x31\x3f\x25\x69\x98\x46\x98\x87\x10\xf5\xa5\x50\xb6\x1e\x04\xe6\x79\xb9\xdb\xce\x22\x8e\x1d\xd1\x78\x6b\x4e\x7c\x92\xad\x1d\x6f\xc0\x34\x02\x46\xc9\x90\x0a\xa3\xca\x86\xe9\xdb\xf1\x2f\xc4\x09\x43\xd3\xbc\x80\x8f\xef\x03\xee\x61\xdf\x4a\x65\x2c\xfc\xef\x37\xf0\x21\x26\x01\x30\x4a\xa3\x20\xb6\xbc\x2e\x2f\x2f\x39\xdc\x5b\xd5\xa4\x42\xc1\xc0\x54\xa7\x34\x56\xb8\xca\x44\x75\xbc\x2c\xb2\x4a\x55\xc2\x34\x8e\xf9\xb2\xbe\x62\x91\x68\xfb\x33\x2a\xba\xf8\x22\x6a\xf9\xe1\x30\x79\x64\xba\x37\x88\x28\x55\x56\x11\x5e\x68\xbd\x2d\x2f\x22\x6f\x2e\x9e\x0d\xf4\x93\x77\x4d\x29\xb7\x72\xa4\x8d\xc8\xf3\xac\x2c\x5a\xd3\x7d\x7e\x01\xd3\x54\x52\x4f\x0d\xb6\x76\x50\xf1\x71\x07\x46\x42\x8b\xb4\xc5\x83\x7a\xa4\x76\xd9\xb6\x52\xab\xdc\xdf\x21\xb3\xe6\x83\xd4\x54\x04\x81\x87\x29\x2c\xf2\x1c\x2d\xf1\xcd\xb9\x9b\x7a\x22\xa4\x08\xed\xaf\x4b\xd3\xf4\x09\x65\x2a\xa4\x2d\x2b\xb5\x39\x28\x3b\x85\x3a\x41\x46\xac\x1c\x8c\xf0\x74\x41\x7a\x45\x4b\x07\x7b\xf7\xf8\x6d\xbf\x5e\x3c\xf8\x1e\x4a\xa4\xa1\x67\x0c\xd8\x62\xc9\x90\x43\x57\x74\xf7\xd0\x49\xca\xdc\xc4\x6b\x9d\xd5\xb9\xda\x9a\xb6\x17\xe3\x1e\x36\xdf\x21\x6a\x77\x20\xba\x2d\x8e\x42\x00\xca\x15\x39\x62\xd9\x2e\x22\xad\x67\xf7\x10\x0a\x3c\x26\x6e\x22\x7a\xf8\xee\xe8\xc7\x52\x12\x5a\x9a\x8c\x17\xc0\xa8\xe1\x9d\x5e\x5e\xb6\xa2\x78\x1b\x7f\x97\x94\xc8\x80\x69\xc7\x91\xb9\xc8\xf3\x2d\xbc\x67\xad\xe5\x39\x50\xd1\xa9\xc7\xb9\xa5\x94\x00\xc3\x90\x10\x16\xd7\xfa\x17\xbd\x32\xbd\xd2\x20\x4e\x91\x52\xd2\x7b\xe4\x58\xa0\x60\x41\x1b\xae\x47\xa8\x13\x26\x86\x51\xa0\x73\x9e\xfb\x48\xd0\xac\xad\x32\xaf\x0e\x33\xd5\x8e\xf9\xbf\x0a\xdc\xa5\x51\x40\xd1\x2f\x6e\xdf\x7f\x2d\xaa\x22\x2b\x5e\xbe\xac\x01\xc6\x4b\x18\xda\x09\xc7\xcc\x8a\x2d\xdf\x96\xd5\xa3\xe7\xce\x9a\x8c\x6e\x14\x32\x0c\x74\xee\x6e\xf7\x4f\xdb\xf5\x6a\xe3\x77\xbf\x34\x4a\x52\x3c\x5f\x9e\xc7\xd8\xe6\xe5\x05\x97\xce\xf8\x43\xc6\xa1\xab\xc5\x2f\xb2\xa6\x86\x97\xce\xa7\xfc\x3a\x30\x91\x26\x51\x12\x0d\x0b\x6d\x1e\x44\x56\xf4\x61\x91\x34\x89\x79\xca\x3d\x11\x65\xfb\x1a\xee\xb8\xdd\x97\x8e\x36\xc0\xdb\xdd\xee\xbf\xfe\xb2\xd4\x2a\xa7\xef\x00\x76\xe5\xb9\x1a\x5a\x5a\x69\x22\x03\x14\x30\xba\x2f\x5f\x3a\x22\x2a\xe8\x78\x37\x27\x43\x93\x48\xc0\x0d\xe1\xd8\x36\xd7\xd9\xcb\x28\xbe\x96\x26\x26\x08\x9d\xb1\xe4\x86\xc6\x61\x41\x26\xa1\xc4\x94\x86\x02\x8b\x65\x30\xa3\xb0\x44\x71\x9c\xab\x13\x33\xa5\x51\x60\xac\x59\xda\x53\xf1\x4e\x46\x8b\x8a\x88\xb9\x10\xf3\x52\xa8\x37\xeb\x4a\xde\x1d\xb1\x4e\xee\xca\xba\x4f\xa9\x30\x1d\xc7\x9e\xd5\xcc\x12\xb1\x7f\x74\xaa\x02\xea\xc8\x7f\xbe\xae\x55\xe2\x24\x4d\x23\x82\xc4\x3e\xf2\x5c\x15\xbb\xd2\x51\xeb\xd6\xb7\x65\x35\xd1\xc3\x6a\xbb\x32\x21\x6d\xd1\x9d\xdf\xe0\xff\xdf\xdc\xb3\x34\xd5\x0a\xa3\x03\x35\xa2\xda\x57\xc8\xb2\x3d\xeb\x77\xa7\x2c\x89\x6d\xf6\x50\xeb\xa7\x0c\xd4\x84\x49\x62\x6a\xe3\xf8\x8b\x64\x82\x55\x0f\x2e\x0b\x8c\xd0\xc1\xfe\x70\x4b\x79\x4a\xb1\x2c\x28\xd3\x3d\xb4\x24\x15\x51\xaa\x12\xbf\x55\x15\x1a\x6b\xf6\x6f\x90\x7b\x74\x53\xac\xa7\xc5\x52\x9f\xa0\x57\x27\x8f\x21\x0c\xc5\x9d\xf4\x5c\x74\x7e\x5b\x2a\x49\x64\x0d\x22\x34\x39\xc6\xb4\x27\x7f\x99\x95\x4c\x65\x68\x73\xc1\x56\x13\xac\x79\x1d\x89\xee\xb4\xed\x89\x4d\x46\x39\x2f\x7e\x82\xbf\xf3\x9d\xc0\x0a\x71\x94\x9d\x3c\xef\xed\xb9\xd0\x63\xa7\x3d\x55\x09\x41\xa8\xa7\x40\x61\xfd\xf6\x3c\x19\x1d\x36\xa9\x36\x56\xc7\xea\x00\xad\x53\x3a\x9a\xcd\x9f\xd1\xbe\x8c\x0f\x8f\xd4\xd0\x14\xb1\x57\x27\x71\xae\x61\x79\xbe\x48\xaf\xca\xd6\xb6\xa5\xc2\xc1\xf8\x0a\x05\x39\x32\x7f\x18\x03\xd5\x88\x7c\xae\xbd\x61\xf7\x4d\x19\x89\x62\x3c\xd6\xb0\x90\x61\x32\x2b\xfc\x79\xc0\x88\x4a\x99\xa5\xa1\xff\x65\xcf\x15\x33\xa0\xbc\xe1\x84\x05\xc4\x92\x8b\xe2\x7e\xf0\x0e\x35\x16\x8d\x7e\xb9\x11\xb3\x40\x59\xd2\xd4\xa3\xa8\xde\xb0\x5c\x75\x28\xbd\xd4\x77\x0b\x13\x15\xba\x8a\x68\x4b\xef\xd4\xdb\x06\x2c\x64\xca\x91\x75\xfc\x6a\x9e\xaa\xf2\x98\xd5\xd0\x25\xde\xda\x46\xed\x29\x09\x71\xca\xd8\xcb\x9f\x8b\xd6\x66\xaa\x1d\xed\x83\xeb\x1b\x25\xf6\x50\x98\x94\x5d\xf7\x12\xe5\x6d\x1f\xca\xd0\x34\xbe\xf9\x63\xd5\xfd\x89\x01\xe9\x0a\x2c\x2d\xe0\x63\xba\xc5\xb1\x88\x73\xdc\xe2\xf6\xa0\x5e\x8b\x72\xd9\xcd\x67\x16\x13\x86\x71\x88\x4f\xe4\x39\xdb\x1e\x91\x0d\x5c\xa2\x0c\xe2\x22\xb7\xcc\xb3\xe0\xc4\x10\xbb\xdb\x44\x1a\x85\x1d\x8a\xf3\xf1\xce\xb3\x9c\x76\x6d\x26\xb0\x9a\xc9\x79\x59\xc3\x43\x39\x2d\x2d\xe0\x84\x25\x89\xc2\x54\xf8\x62\xb5\xff\x2a\x15\xc0\x12\x69\x75\xf6\x91\xed\xf3\x5a\x22\x65\xec\x29\xc5\xfe\x22\x60\x68\x9d\xbc\x64\xef\x80\xfb\x6c\xd5\xb3\xc2\x72\xc2\x68\xa8\x03\x39\xa8\x10\xba\x56\x68\x69\x3b\xb1\x14\x4f\xf8\x5d\x76\x2c\x73\xe8\x82\x6a\x8c\xf2\x2e\x8e\xfa\x20\xaa\x76\x00\x07\x5a\x70\x6d\xbb\x86\xc8\x4a\xee\x79\xab\xf4\x5a\xcc\xca\x75\x65\xcc\x46\x44\x51\x53\xcd\xb2\xaf\x75\xa3\xcb\x43\x7b\xf6\x28\x28\xbb\x3f\x25\xd0\x79\x79\x2e\xad\xfe\x09\x58\x77\x7e\xde\x73\xb0\xe4\xff\x4e\x88\x71\x90\xcd\x61\xdc\xd0\xa0\x67\x3f\xb4\x44\x9a\x93\xf1\x10\xd2\x72\x1f\x54\x65\x6e\x65\x74\x67\xed\x4b\x26\x99\x25\xba\xf4\x11\xe9\x4e\x50\x5c\xe4\xeb\x5f\x27\x28\xea\xce\x80\x66\x2a\x12\xb4\x0b\xa5\x3d\xd7\x50\x8d\xd3\x2b\x4c\x29\x95\xf4\x51\x85\x8d\xb1\xcc\x80\xeb\xa2\xa9\xb2\xfe\x26\x3a\xa0\xba\xed\x64\x21\xea\x28\x89\xea\x93\xf4\xd7\x41\x7f\xa6\x45\x6c\x79\x4d\xb2\x23\xec\x33\xa8\x82\xee\x36\x3a\x0e\x1c\x3f\x00\xee\xac\x79\xe3\x37\x5a\xdf\x03\x48\xcc\x2d\xa6\xa7\x6e\xca\x6a\x72\xcc\x32\x08\x75\x28\x5c\xdd\x61\x99\x15\x83\xad\x02\x42\x8b\xf6\x3c\x8a\x2c\xaf\x0f\x4d\x79\xd0\x90\x67\xef\xfd\x5b\x1a\xca\x70\x4f\x3d\x17\x15\xd4\xa7\xb2\xd0\xa0\x57\xdd\x42\xe2\x84\x50\xa3\x3c\x3d\x54\x05\xaa\xc1\x4d\x15\x21\x4a\x18\xea\xdd\xb6\x0f\x39\x7e\x16\x4e\x88\x36\x0e\x2c\x7f\x03\xb2\x99\x53\xe8\x68\x7b\x25\x11\x25\x63\xe2\xa9\x7a\xa6\xda\xb1\xed\xa9\x20\x68\x67\xfc\x6a\xf1\xb8\x5a\xdf\xa3\xe4\xc5\xe1\x66\xb1\xf7\x46\x29\x0f\x42\x8d\x9b\x51\x7b\x2a\x64\xc5\xcb\x03\xb4\x67\x78\x56\x1f\xef\x87\xbe\x1a\x0f\xa5\x2d\xe0\x7e\x2a\x9b\x8d\xb1\xa1\x6e\xd7\x12\x25\x16\xce\x82\x32\x5f\x97\x53\x23\xce\x95\xf3\x96\x6e\x27\xfc\xc3\x6d\x67\xe6\xc8\x17\x05\x4a\x31\x2d\x6a\x7f\xb0\x8c\x8f\x75\xdf\x5b\xda\x60\x3e\x0a\x5d\xfa\xc2\x3d\x36\x87\x16\xe4\x91\x49\x30\x44\xb6\x05\xdc\xa5\x97\x67\x5f\xf5\xe0\xda\x63\x6e\xfc\x0c\xb1\x0b\x7e\xd3\x81\x7f\x78\x2c\xc3\xd0\x89\xd0\x5c\xc7\x74\x26\x7e\xc6\x8c\x15\xc9\x63\x95\x22\xd9\xdb\x7b\xe9\xb0\x36\x7e\x39\xf1\xc4\xd1\xdb\x1e\xb3\xa2\x59\xff\x6a\x2a\x31\x3a\xd2\x79\x12\x13\x64\xf8\x5e\x6f\x57\x01\x4d\xfa\xbf\xc6\xac\x2f\xbf\xbd\x17\x85\x6e\x8f\xba\x2f\x31\x85\x3c\x49\x23\x1a\x75\x3b\xc0\x6d\x55\x1e\x6f\xcf\xcd\xb9\x82\xf5\xaf\x93\x28\xea\x76\x25\x3c\x88\xd3\xe4\x5b\x24\x32\xc4\x7c\xd0\xdd\x93\xea\xf7\x12\x9e\x68\x43\xad\xec\xae\xac\x44\x75\x09\xcd\xb9\xe8\x49\x77\x38\xe1\x69\x60\xb0\x0e\x00\x54\x05\xaa\x7c\x87\xea\x67\x25\x4e\x27\xa8\x7e\xcf\xe0\x63\xde\x81\xf3\x17\x86\x80\xd1\xd4\xfb\xf2\xc5\x97\x6b\xd9\x79\xf4\x99\x89\x37\x3c\x48\x78\x1a\xa7\xdc\x19\x8b\x22\xcf\xbb\x87\xe1\x1c\xa1\xd5\x77\xdb\xa5\xff\x13\xa3\xe1\x80\x67\x6c\x27\xf2\x61\xed\xf9\xfc\xe0\x31\x43\x1c\xe7\xe2\xc5\x89\xe5\x2f\x2f\x16\x05\xd3\xf6\xa3\xf1\x3f\xdc\x7f\xc6\xc3\xa7\x22\x8a\xaa\x8d\x1d\xe3\xd7\x97\x46\x58\xe7\x52\x8d\xff\xef\xd5\x28\x29\x6e\x94\xe8\x45\xf4\x9d\x0a\xed\xee\x43\x9c\xae\x92\x89\xee\x0a\x1d\x86\x58\x1e\x71\x14\xc5\xe5\xa0\x30\x27\x2c\x45\xf1\xd6\x4d\x32\x1d\x2a\xd4\xa8\x7e\x15\xf5\x20\xa3\xce\x75\x24\x95\xf5\x2c\xee\xf4\x84\x7e\x89\xc6\xbe\x0f\x65\x68\x9d\x9d\x2a\xe4\x68\x1a\xa6\x43\x38\xc4\xb6\x4e\x17\x2b\x59\x5e\xba\xbf\x32\x83\xeb\xdb\x26\x49\x2c\xef\xb4\x4b\x6c\xf8\x1e\x2a\x41\x1f\xef\xc7\x45\x42\xb5\xc8\xaa\x9b\xaa\x9c\x4e\x4c\x54\x27\xee\xd4\x38\xdd\xf9\x3c\x9a\x0d\x86\x06\x96\xf0\x2f\xcb\x3b\x26\x0f\x0f\x6b\x99\xe4\x3f\x3a\x48\xff\x27\xf3\x52\x10\x06\xe9\x28\xed\xfe\x5c\x38\x48\xc4\xb7\xb2\x1c\x3f\x99\x20\x22\x14\x96\xff\xc1\x96\x47\x6d\xcc\xbe\x2a\xcb\xd3\xa7\xb4\x1b\xee\xb2\x40\x5b\x2a\xb5\xfd\x6e\xbf\xde\x75\x10\x7d\x11\x12\x32\xa2\x1f\xf8\x6d\x02\x6c\x15\x61\x12\xe8\x9e\xde\xf2\x11\x3e\xf6\xa2\x78\xfb\x09\xe2\xd4\x2d\x47\x11\x26\x06\xcd\xdc\x9f\xb0\x74\xfb\x6f\xd9\x35\x41\x80\x74\x81\x1d\xd5\xbd\xdb\x96\x7d\x7b\xa4\x59\xea\x64\x84\xef\x45\xf1\x72\x16\x2f\x30\x1a\x65\x11\xeb\x10\xab\xde\x64\xf9\x8e\xbc\x55\x37\xbd\x18\x8a\xbf\x47\x12\x11\xe6\x11\x80\x36\x4c\xb9\xbc\x74\x36\xc3\x38\x84\x24\x12\x0e\x68\x2f\x2d\x45\x9d\x29\xe7\xdf\x77\xc2\x51\xcc\x77\x52\x29\x96\x2d\xdc\x43\x5d\x97\xc5\x21\x98\x77\xa1\x05\x0d\x29\x6a\x54\x2a\x51\x6c\xa1\x56\xe7\x49\xf4\x44\xd0\x84\xa0\xa5\xe0\x6a\xba\xd1\xb0\x98\x74\x49\x49\x10\xf9\x73\xaf\x83\x1b\xf8\xf7\x4a\x43\x61\xf9\xaa\x2d\xa3\xe4\x4a\x9c\x76\x30\x39\x58\x45\x1a\xc7\xc6\xda\x2e\x75\x3d\xb0\xc6\x44\x2a\x85\xfd\xac\x88\xcc\x19\x50\x38\xb9\x76\x96\x04\xc8\x29\x8b\x68\xbb\x25\x34\x5b\xcc\x97\x8f\x46\x81\xf1\x54\x21\xb0\x05\x35\xfb\x66\xe8\x81\x38\x11\x3c\x0d\x84\x83\x09\x3d\xdd\x59\xf9\xb2\x30\x1d\x7f\x40\xae\x14\xea\x28\x15\xe2\x98\xb9\x92\x45\xff\x10\x22\x0c\x2c\x10\x5f\x64\xf9\xa5\x27\xc5\x68\x5b\x58\x64\x35\xbd\xeb\x9e\x17\x61\xf6\x01\x64\x12\x23\x60\x57\x95\x85\xc9\x5e\xce\x15\x3c\x38\xaa\x04\x5c\x72\x93\xbe\xa9\xc6\x00\x80\x45\xab\x6e\xcf\x05\xea\x92\x8d\x93\x08\x42\x2a\x89\x24\x56\xfb\xaa\x2c\x2e\xd6\x9f\x52\x97\x69\x05\xc9\x64\x22\x28\xa7\x87\xa3\xa1\xf5\x9a\x27\xa9\x35\xa1\x02\xe6\xa3\x32\x0f\x59\xf1\x4d\xd4\x57\x45\x8d\x6d\xa7\xc8\x60\x78\xf9\xe0\xd9\xa5\xc6\xcc\x26\x93\x37\x51\x69\x82\x69\xea\x53\x55\x9a\xac\xa9\xad\x95\x84\x6a\xce\xfe\x35\x94\x4a\xe3\x61\x66\xc1\xc9\x6a\x7e\x5e\x2c\xca\x89\xd0\x11\x41\x34\xaf\x7f\x5b\xcc\xec\xd4\xaf\xd9\xc9\x4f\xcc\x6a\xea\xe5\x09\xad\x15\x17\x43\x08\xd2\xc3\xc5\xe6\xdc\x1f\xc4\xaf\x49\x57\x08\x62\xcc\x3f\xd4\x1f\xe2\x74\x10\xb2\x9f\x05\x40\x23\x84\x55\xd9\x98\xc3\xa2\x3b\x58\x05\x50\x86\xf6\xc4\xcb\xa5\x2b\x01\x10\x26\xb0\xda\x90\x22\xcf\x97\xe5\x2f\x1f\x26\xf6\x8d\xca\xf2\xdd\x08\xad\x91\x9e\xf1\x7a\x4b\xbc\xaa\xad\xb2\x57\x4a\x42\x13\x84\xd0\xe6\xc2\x51\xf0\xff\xe6\x1b\x98\xcd\xb8\x21\x1d\x68\xa1\x07\x5c\xa1\x6d\x23\x58\x12\x2e\xed\xe8\xf5\x3b\x9e\x1a\x4e\x64\x90\x1a\x6e\xc5\x9b\x5a\x93\xdb\x05\x97\xf7\xaf\x15\xd4\xaf\x65\xee\x97\xa1\x0c\x43\x4d\x1c\x75\xeb\xe1\xe4\x89\x71\xfe\x62\x27\x97\x61\x12\x22\xf3\xca\xb7\xb2\x7c\xc9\x01\x69\x4f\x66\x02\x3e\x32\xa4\x04\xed\x92\x47\x71\x04\x9f\x87\x9d\xe1\x70\x9b\x8b\xbf\xc9\x50\x40\xdc\x8b\x05\xda\xca\xbf\x11\x4e\x72\xb4\xab\xca\x50\x01\xa2\x6e\x8e\xef\xc5\x09\x2a\xe8\x40\x99\x32\x22\x61\x62\x8b\x51\x0f\xa6\x93\xd0\xf7\x6d\x01\x47\x6a\xfa\xdd\xf7\xc5\x76\xfd\xb4\xde\xde\x6d\x6e\xba\x26\xce\x10\xe6\xb7\xb3\x34\x37\xdf\x7e\xee\xc7\xcb\x45\x46\x9a\x5b\x6a\x63\x04\x1f\x8c\x2c\x24\xd7\x23\x56\x16\x41\xd1\x5a\xbd\x0b\xcb\x5b\x3f\xb2\x7b\xdb\x0e\x98\x93\x2a\xce\xc7\x41\x76\xba\x6b\x4e\x12\x1a\x58\xf5\x95\x1a\xaa\xc9\xae\x2b\x13\xa0\x0e\x95\x85\xfb\x99\x95\x80\xeb\xdf\x8c\x86\x09\x86\x2e\xea\xa6\x54\x6f\x3d\x81\xed\xd7\x5f\x95\xa6\x81\xcf\xe3\xb4\xd6\x4a\x96\xc3\x0b\x58\xd5\x96\xc1\x3c\xa5\x32\xb4\x42\xe2\x65\x71\xee\xdd\x60\x49\x4d\x8a\x5c\xea\x5b\x51\xbf\x66\x7a\x18\x1b\x94\xa9\xd6\x88\xab\x69\x48\x78\x18\xa3\x9e\x1e\x84\x9a\xb7\xe6\x64\xaa\x8d\x95\x25\xd3\xba\xdd\x7e\x97\x97\xa7\xd7\xb2\x98\x61\xf3\xe5\x44\x72\x26\x82\xc0\xc5\xf2\xf1\xfc\x99\xdd\x5a\x24\x97\x80\xd9\xc9\x2d\x86\x56\xb1\x24\xe8\x3a\x6f\x24\xb9\xb2\x05\xaa\x9e\xe2\x63\x3a\xae\x82\x00\x55\x9d\xff\xb4\x31\x4b\x68\xda\xe5\x72\x5b\x56\x0f\x48\x69\xe9\xd2\x09\xf3\xbb\xb4\x14\x51\xac\x54\xc7\x94\x8e\xab\x7c\x1c\xfd\x94\x42\x08\x3c\x75\x2c\xe7\x56\x59\xe6\xeb\x69\x5a\x45\xca\xc4\x0a\xd4\xac\x9b\xd7\xf0\x79\x77\x33\x6d\xa5\x01\xb2\xe5\x8c\xea\xe0\x66\xd8\x27\xda\xae\x8c\xa4\x2e\x47\xf6\x7b\x99\x9f\x8f\xe0\x35\x3a\xea\xe1\x41\x28\x55\x40\x71\x63\x92\xe7\xca\x7a\x02\x8e\x4d\x90\x13\xa9\x23\x82\x02\x40\x07\x9b\x0e\x7b\x15\xd5\x71\x74\xf2\x4a\x2d\xad\x76\x97\x2a\xeb\x66\x63\xf6\xbf\x1c\xb3\x94\x6f\x85\x24\x48\x7b\x26\xc6\xf9\xf8\x92\x04\x22\x71\xa6\x5b\x01\xd3\x21\x40\xb3\x33\xff\x24\x00\x15\xa2\x13\xa5\x2d\x6a\x53\x56\xb6\xe4\xe3\xcb\x2c\x91\x34\xc4\xfa\xec\x36\x5c\x7f\x9c\x18\xe0\xd2\x44\x31\xb3\xb5\xa3\x4e\xb6\xfb\xc1\x93\x19\xf9\xdf\x35\xb1\xcd\x69\xda\xc4\xae\x03\xd1\xeb\x7d\x89\xe4\x5d\x93\x12\x36\x69\x28\xc7\x98\x5a\x5e\xbe\x94\x9e\x6b\xbd\xfd\x33\x4b\x45\xe4\xb5\x5f\xdb\xd1\xfb\x02\xa3\xa2\x82\x90\xb1\x71\xf9\xd6\x6d\x30\x7e\x6a\x15\x46\x14\x03\x4e\x07\xa1\xf5\x4f\xc8\xae\xf9\xc9\xda\x3e\x34\xc5\xaa\x1c\xfc\xdc\x5b\x50\xe5\xf1\x08\x85\xbe\x46\xa3\xaa\x28\x0c\xd1\xdf\x94\x18\x45\xd8\xf5\xc1\x51\x15\x89\x08\xfd\x05\x57\x32\x60\x8b\x5e\xba\x46\x13\x31\xe3\x09\x54\x3a\xe0\xf1\x68\x6e\xa8\x98\xa4\x58\x48\xa2\xcb\xa2\x6c\xee\xaa\xb2\xb8\x11\xa7\xd3\x70\xe3\x50\x71\xc2\x71\x64\xf2\x02\x5d\x2e\xd0\x73\x88\x76\x15\x53\x8e\xbb\x56\x67\x00\x1c\x74\x66\x4c\xa6\xce\x79\x73\x39\x88\xa6\x81\xe3\xe9\x53\x8e\x0b\x7f\x0b\x65\xcb\x9e\x5e\xda\x4f\xe0\xc8\xec\x7f\x66\x85\x1e\x93\x3f\x72\xa2\x28\x61\x58\x10\xd4\xda\x48\x8f\x9f\x41\x36\x15\x95\x16\x5d\xe7\xa5\xce\x06\x87\xb2\xa2\x3a\xc0\x4c\x96\x3b\x57\xc6\x78\x69\xd7\x27\xe5\xc2\x6d\xde\xa2\x6a\x16\xa8\x84\x9a\x15\x2f\x58\x2f\xdd\x33\xc1\x71\xa2\x98\xb0\x88\x31\x64\x1f\xc4\x32\xec\x11\x71\x5b\xd7\x4b\x62\x55\xc2\xca\xd1\x98\xf5\xb2\x06\xb3\xab\xa3\x57\xe3\xfb\xe2\x3f\xee\xd6\x9c\x25\xe8\xca\xc8\xf3\x65\x05\x95\x23\xe0\x99\xd8\x95\x8a\x33\x5b\x44\xe5\x48\xd8\xb6\xa2\x78\x5b\x96\x7d\x1c\x5b\x71\x4d\x0d\x43\x7f\xa8\x78\x83\x6a\xfd\x2b\x1b\xf9\x00\x4a\x84\x04\x0b\x2d\xb2\x22\x6b\x0e\x1f\x23\xf5\x98\x6b\x49\x92\xee\x9a\xd4\x74\x91\xa8\x61\x52\xcb\xb7\x47\x4c\x73\xbf\x8a\xac\xa0\xcc\xec\x87\x10\x5c\x4b\x17\x25\xff\xd6\x1e\xf3\xcb\xcb\xbf\xce\x22\xcb\x9b\x8b\xc3\xf5\xf9\x6e\x22\x94\x71\x4f\x89\xf7\x5f\x40\x3b\xf8\x66\xa0\x1f\xd8\x76\xd2\x09\xea\x6d\x9c\x1c\x5b\xd5\xb6\x0f\x06\x28\x49\x62\x70\xe3\x38\x27\xf4\xd0\xfd\x90\x8c\x59\xd2\x53\x22\xcf\x5b\xd2\x93\xa1\x90\xca\x46\x22\x50\xfe\x4a\x96\x85\x50\x6a\x52\x71\xaf\xa4\x11\xe8\x88\x09\x59\x56\x13\xef\x50\x29\x2d\x90\xd0\xcf\x63\xa3\x16\x55\x25\x2e\xed\xb1\xe7\x09\x0d\xb3\x4e\x04\xf7\x53\xf5\x31\x4e\x94\x26\x9a\xd0\x01\xda\xc1\x11\x9c\x78\x76\xc7\x91\x0d\xe0\x2f\x49\x2c\x30\xe9\x77\x78\xcd\x54\x0e\xdb\xfd\x66\xf2\x68\x9a\x06\xa9\x17\xd4\x46\x0e\xfa\xdd\xdb\xb4\x60\x4b\x69\x46\x10\x21\x9a\x67\x0a\x8a\x1a\xf6\x50\x1d\x6b\x54\xf8\xaf\x9b\x27\xa8\x76\xf0\x89\xf9\xa1\xb4\x56\x3e\x27\xbb\x3e\x65\x75\xa9\x5d\x46\x76\x32\x72\xc0\x2d\x71\x22\x52\xd3\xc2\x9d\x2a\x3b\xce\xe9\xae\xb6\x76\x78\x94\x2a\x13\x19\x2c\x33\x5d\xfc\x58\xdc\xdd\xed\x37\xdd\x9f\x13\x86\x29\x91\x76\xba\xfe\xd9\x1d\x8f\xca\xa4\x21\x26\x05\xda\xcd\x66\x55\x1e\x8f\x25\x72\xb4\x6f\x45\xeb\x8a\x8e\xe2\xab\xca\xa4\x14\x8b\xa3\xe5\xb9\xd0\x39\x6c\xcc\x0c\x20\x4e\x99\x54\xe0\x24\x85\x5f\x59\xdd\xd4\x78\xde\x8e\x5f\xc6\x28\x48\x1c\x7c\xeb\x05\x9a\x97\xb2\x9c\xd6\x12\xea\x80\xca\x88\xf4\x2b\xf9\x26\xab\x4f\xe7\x06\x96\xe7\xcb\xe0\xec\x1e\x6e\xf1\x3a\xe0\x21\x96\x24\x1d\x6c\x3c\x76\xd6\x7f\xd6\x81\xb2\x8e\xcf\xee\x7c\x3c\xce\x04\x29\x7b\xc8\xf0\xe8\x5f\x67\xaf\xc8\xe5\xee\x12\x86\x00\x8e\xb1\xe4\x4e\x95\xed\x47\xb6\x61\xba\xd9\x55\xa1\xc3\x98\x28\x17\xb5\x3b\xe8\x19\x6d\x5d\xdf\x8d\x11\x2f\x3d\xba\x14\xf5\x1b\x34\xed\xf4\x2f\xae\xac\x46\x1d\x2a\x4b\x9b\xdb\xe7\x3f\x91\x1f\x3f\x7b\x41\xd6\x72\xcb\x14\xed\xbb\x9a\x14\x4b\x32\x5a\x47\x13\xb4\x5b\x07\x8b\x42\xaf\x44\x9e\x5b\x81\xf2\xbf\x48\x83\x8d\x43\xef\x93\xbf\x8e\x1f\x2b\x4a\x89\xec\xa2\x43\x18\x6a\x9e\x3c\x77\xcc\x25\xd7\x9d\x36\xda\x58\x9a\xcb\x77\x91\x0a\xa1\x04\x59\x81\xc5\x10\xdd\x5f\x35\x42\x0d\x3f\xa0\x19\x84\x7c\x74\xc2\xac\x92\x6e\xf3\x52\xb9\x71\x78\x12\x55\x33\xa0\xa7\xf0\x1d\x69\x10\xf2\x0e\xb9\xfd\x09\x9e\x51\xd3\x08\x12\xdd\xfb\x00\x5e\xa5\xdd\xb7\x32\xe9\x03\xaf\xed\xd8\xed\x2f\xa7\x29\x26\x5a\x53\x19\xa3\x7b\xf7\x76\x51\xfe\x87\x53\x16\xa1\x54\xcf\x72\xbd\xbe\xfd\xe7\x7a\xfb\xe3\xcf\xc9\xeb\xb2\xc8\x5a\x84\xbb\xa7\x0e\x00\xa7\x99\x88\x11\x22\x27\x85\x7e\x81\xd1\x33\x88\x54\x45\x56\xf4\xec\x1b\x14\xf0\x90\xfd\xea\x2c\x20\x2d\x84\xf1\x84\x3c\x0f\x59\x91\x1d\x45\x3e\xae\xdd\xd0\x32\x14\x36\x33\x7b\xe5\x9c\xfd\x5f\x21\x5a\xb4\xa4\x61\x64\x86\x3b\x34\x4e\x29\x91\xbb\x39\x75\x75\x3c\x0c\x9f\x5f\xa6\xcc\x26\xb8\x3d\xaa\xbc\xd3\x0d\x6d\x1b\x5d\xd1\x13\x1a\x45\xb8\x4f\x2f\x27\x12\xf7\xae\xa3\x22\x14\x8d\xc9\x6f\x9e\x0a\x63\xb4\xe9\x69\x25\x2d\x26\xd6\x3d\xc8\x13\x94\xa7\x2e\xf2\xa2\x35\x09\xd1\x07\x71\xf4\xa2\xb7\x55\x79\xfc\x4b\x64\x79\xef\x8c\x6a\x1d\x46\x68\x9e\xe6\x59\xdd\x3c\x55\x17\xd5\x94\xb4\xbb\x33\xd7\xe8\x5c\x9c\x00\x91\x16\x3f\xb3\xe6\xf5\xa6\x67\x97\xe3\x44\x43\x1c\xe3\xb5\x3a\x7b\x87\x64\x32\x0d\x80\x85\x91\x4d\x3e\x1e\xb3\xe2\xa1\xd4\xdd\xf3\x02\x07\xb4\x1c\x2c\x5c\x12\xf9\xaf\x57\x5d\x05\x80\x36\x71\xec\x09\xbe\x6e\x4a\x75\xc6\x70\xc5\xac\x7e\xc5\xe7\x6a\x4e\xed\x5d\x24\xc1\x23\xfb\x54\xb9\x3a\xa4\x61\xc4\x12\x02\x62\xa9\x85\x5b\x77\x0c\xb3\x33\xfe\x83\xf7\x1d\xc2\x84\xf8\x44\x24\x0c\x30\xb0\x10\x68\xc0\x9c\x96\x43\x21\xdc\x5a\x1e\x1e\xbf\x35\x41\x18\x50\xe2\x0e\x00\x54\x49\xd4\xa2\x99\x2e\x29\x08\x25\xb7\xca\x79\xa4\x3e\x81\xca\xfa\x5f\x0d\x75\xe7\xda\x56\x50\xbf\xde\x97\xea\xed\xf9\xe4\x88\x01\x5c\x97\x28\x02\xde\xb1\x6d\xdf\xdc\xec\x4d\x69\x71\x35\x3d\x04\x1c\x22\x15\x7a\x19\x44\x67\xcb\x7a\x4b\x22\x08\x99\xdb\xea\x21\x4e\x39\x5a\xeb\x50\xa9\x80\x26\x78\x0b\x23\x14\x5c\xd5\xdb\x8e\xd0\x14\x10\x8b\x20\x22\x9e\x7c\xf3\xa6\x2c\x46\x79\x71\x48\x88\x14\x43\x96\xba\x45\xde\xf8\x80\xf5\xe4\x68\x9b\x8d\x56\xb5\x8e\x2c\x12\xcb\xb4\xbe\xdd\x9f\xdd\x4d\x53\x5b\x31\x20\xac\x8b\xb4\x2e\x74\x3d\x72\x81\x20\x49\x95\xe8\x42\xc7\xd5\xd1\x57\x05\x2e\x0a\xed\xe3\x9d\x96\x72\xf6\xdc\x57\x91\x78\x5b\x10\x68\xac\x83\xc8\xe6\xb3\x5c\x76\xcc\xff\x6c\x1a\x06\x78\xc4\x20\x6c\x65\x24\x5c\xe4\x3b\xd0\x40\x59\xc1\x36\xcc\x5c\x7a\x47\xb2\x2a\x8f\xbb\xec\xa5\x40\x4d\xb0\x61\x40\xeb\x53\x64\x95\xbf\x5d\x4a\x51\xa3\xf0\x28\xde\xe0\x3e\xeb\x12\x2b\x90\x0a\x9b\x4f\x54\xa5\x86\x5f\x88\x0e\x99\x44\xba\x81\x85\xd4\xba\xcf\x19\x54\x9d\x18\xcc\x78\x60\x59\x14\xa0\x8c\x70\xbb\x3b\x58\x9a\x9b\xdd\x5b\x96\xe7\xf5\xdf\xdd\x2d\xa7\x45\xdd\xc0\x40\xeb\x76\x8a\xfd\x33\x2b\x94\x0b\xc8\x3d\xd9\xbc\xde\xa7\x14\x79\x7f\x73\x43\x9e\x4c\x09\x66\xd2\xc4\x66\x90\xdf\x01\x33\xbc\xbb\x76\x7a\x4e\xea\x29\x80\x73\x89\xe1\x34\x2b\x79\xb9\x45\xeb\xb1\x1b\x41\x41\x8c\xb4\x75\xa9\x3b\x34\x17\x96\x97\xf5\xf9\x05\xba\x8c\x3d\x48\x4e\x51\x42\xf1\x69\xbb\x79\x58\xef\xbf\xaf\x9f\x77\x07\x4b\x47\x7c\xf7\xb8\xda\xae\x1f\xd6\x8f\xfb\xae\x27\xe8\x38\x1a\xe5\xfd\xcd\xaa\x3c\x57\x7d\x00\x0f\x14\x09\x99\x23\x4a\x7c\x2a\x3b\xb0\xd4\x38\x77\x05\x2a\x49\x91\x78\xd4\xd9\x2d\xf3\x07\x37\x68\x2a\x11\xba\x81\xfe\xab\x2f\x79\xf5\xbf\x03\x21\x20\x7e\xe7\x76\xb5\x7a\xca\x85\x02\x7b\x64\x7c\x5d\xa5\x00\x10\x47\x91\x83\x2d\xa0\x20\x06\x86\xce\x6e\x7a\x0f\x0a\x40\x13\x65\x91\xb9\xcd\xca\x07\x4b\xa7\x56\x3d\x80\x06\x24\xaa\x59\x6d\x1e\x1e\x86\x4c\x03\x60\x08\x13\xee\xf6\xed\xa3\x36\xd7\xa1\x6c\x43\x98\xc4\xa1\xf6\x25\x8c\x13\x56\x07\x43\x38\x93\xb2\x33\xa5\xf6\xe2\x6d\xe2\x06\x1b\x22\x2c\x99\xc7\x12\x54\x79\x84\xbd\xd0\xa7\x32\x87\xa7\x2a\xeb\xe9\x46\x0c\xd1\x12\xcb\xe6\x56\xdb\xdd\x00\x3c\xeb\x1b\x4d\x8c\x83\x3a\x00\x95\x8c\x62\x51\x86\x18\x40\xe1\xb9\x06\xea\x26\xf4\x2b\x0d\x55\x30\x5d\x87\x40\x73\x9c\x6a\x77\xbf\xfe\xff\xb4\xfd\x49\x73\xe3\x38\xb6\x3f\x0c\x7f\x9d\x5a\xf4\x82\x18\x38\x2d\x65\x59\xce\x54\xa7\x6d\xb9\x2c\x39\xb3\xaa\x3b\x3a\x14\x18\x0e\x6c\x96\x29\x52\x4d\x52\x76\xba\x3f\xfd\x1b\x3c\x00\x38\x89\x72\xd6\xff\xbe\xf1\xdc\x45\x57\x5e\x13\xa2\x28\x12\x04\xce\xf0\x1b\x00\x19\x0d\xfe\xef\x34\x04\x2f\x58\x36\x74\xe7\xf5\x47\x55\x82\x02\x1e\xaa\x2c\xde\xa0\x6a\x76\xe5\x40\xb2\x6d\x14\xed\x1b\xaa\x2d\x73\xf1\x19\x9a\x8d\xfc\x6b\x99\x8b\xba\x76\x92\x35\xbe\x24\x6e\x98\xb4\xb5\xc4\xcc\x82\xf6\x90\xaf\xd1\x26\xc3\xdd\xe2\x65\x98\x06\xe9\x2d\x4e\x40\x1c\x2c\x57\xc2\xfe\x50\xe7\x43\x38\xbe\xad\x5c\x31\x6c\x92\x77\xda\xf5\x22\x9f\x0d\x64\x0d\xd7\xd4\x74\x6e\x06\x77\xe2\xe7\x52\x1c\xc7\x7a\x41\x26\x0c\x94\xaf\x0a\x60\xdc\x3e\xc9\x67\xbb\x25\xc4\x84\x54\x60\x62\x76\xbb\xd9\xed\xba\x0f\xf3\x54\x0a\x8f\x03\x50\xaf\x18\x01\xdd\x94\xd5\x6c\xca\x63\xc2\x90\x20\x53\xb0\x34\x06\xaa\xab\x46\xb5\x4b\xef\xe2\x78\x9c\x7f\x9d\x4c\xa8\xa8\xea\xc2\x78\xf3\x39\x88\xc3\x84\x26\xc5\x90\xfe\xfa\xeb\xd3\xd5\x80\x5c\x65\x22\x49\xfd\x43\xf6\x49\xea\xd5\xc7\xd8\xbb\x6b\x7c\x8d\x09\x89\x03\xab\x3c\x57\x8f\x14\x5d\x4c\xa2\x08\x02\xa3\x5f\x3e\x32\x0f\x0f\x33\x82\xc4\x38\xfb\x55\x59\xd4\x68\x4d\xdb\x85\xfa\x46\x30\x16\x5b\x69\xa5\xb2\xb2\x30\xc6\x76\x45\xb8\x81\x36\xe9\x79\x04\x95\x1d\x11\xa5\x67\xd3\x97\x99\xf2\x9e\x11\x71\x6c\xcb\x99\x5d\x7d\x6f\x5d\x98\x1c\x5f\x8d\x91\x05\xcf\xfc\x2a\x6c\x44\x92\x22\xdd\xfa\x0b\xa6\x70\xf0\x49\x75\xde\x08\xc1\xa0\x7b\xfe\x99\x1a\x55\x8e\xdc\x56\x98\xf8\xa1\x32\xc6\xe5\xe6\xaf\x53\xdd\x84\x01\x72\xb2\xfc\x11\x4d\xa0\xc7\x20\xee\x4d\x55\x1e\xf6\xef\x53\x62\x8f\x1f\x0b\x56\xc1\xed\xba\xcc\x45\xb5\x2b\x75\xa7\xe8\x60\xa4\xb1\x7a\xa1\x4d\x75\xaa\xad\xc8\xa1\x2d\x47\xfe\x3d\xe2\x9f\x51\x54\xe0\x62\xe5\x8a\x7d\x5f\x04\x36\x99\x4d\xe6\xf1\x29\x46\xb5\x53\xd0\xbd\x65\x8f\xeb\x4d\xf7\xb2\x6b\xce\x02\x9b\xe1\x63\x25\x1b\x9b\x3f\xbc\x3b\x18\x32\x9c\xb5\x46\x54\x87\x5d\xe6\xf6\x4b\x0f\x43\x1b\xdc\x1c\x1d\x72\x6c\x58\xca\xf6\x61\xdb\xfe\x91\x3f\x12\xc5\x1d\x0e\xd0\x66\x43\xee\xfd\x40\x7e\x43\xf7\xeb\xb5\x61\xa8\x72\xbe\x7f\x2b\x4f\xea\x05\xaa\x7a\xb4\xe8\xb8\x41\x10\x46\x41\x57\x24\xb5\x7e\x72\xb3\xcf\x95\x04\x41\x14\x63\xb2\x9a\xd5\x23\x4d\x9f\xd1\x7c\x27\x01\xe1\x06\x03\xd8\xbd\x45\x4c\x9d\x93\xb1\xfa\xe7\x4f\x02\x2a\x15\xea\x39\xec\x70\x05\x19\xc7\x57\x24\x60\x81\xc2\xd4\xb4\xfd\xfd\x23\x1d\x49\x12\x30\x46\xb1\xa7\x67\x25\x65\x30\x8b\xd8\xee\x17\xdf\x17\xeb\xdb\xc5\xd5\xed\xaa\x1b\x95\x2a\x84\xbe\xd9\x4b\x71\x9c\xb2\x8e\x7c\x3f\xff\x2b\x99\x32\xf8\xa5\xbb\x17\x28\x8f\x2f\xa2\x80\x7a\xf0\xd6\x92\x80\x01\xc3\xd8\xdf\x9a\xaa\xf6\x04\x65\x77\x98\xcb\xc8\x70\xbf\x07\x20\xd6\xc3\x79\xc3\x01\x74\x36\xff\xed\x30\xc5\x10\x61\x9b\x39\x3c\xfc\x95\xef\x09\x25\xb3\x33\x91\x04\x5c\x4b\x4d\x7b\x4b\x3f\x87\x01\xf8\x0c\xc4\x47\x82\x90\x00\x16\x0b\x8f\x65\x99\x8f\xa3\x07\x12\x84\x3c\xc4\xb6\xac\xcd\xbf\x1e\x1e\x57\x6d\x0a\xd6\x1d\x8c\x8d\x75\x8a\xe8\x6c\x55\x97\x0f\xf7\xfe\x60\x14\x10\xbc\x01\x88\x06\x77\xd6\x46\xe3\x44\x61\x14\x2d\x90\x20\xd2\xb1\x14\x9d\x72\x59\xd7\x31\x27\x41\x92\x58\x83\xfd\x76\x9d\x38\xc9\x3c\xab\x5f\xa0\x5a\x9e\xe6\xb5\x67\x48\x90\x32\xe9\x99\xcf\x4f\x59\xd1\xdc\x90\x1b\x7a\xe1\x09\x2a\xa9\x91\xca\xd8\xab\xea\xcc\x9b\xcc\xa6\x24\xd0\x21\x05\xe1\xcd\x6c\x8e\x68\xe0\xea\xaf\x0e\xa4\xc0\x19\x26\x4f\x1f\x57\xe5\xc0\x67\xcd\x1d\x36\xcc\x5a\x27\xcb\x0c\xdd\x4c\x6c\x60\xaa\xaa\x72\x26\xa4\xf6\x9f\x08\xad\x56\xb0\x65\x10\x62\xf8\xd5\x37\x34\x08\x09\xb8\xf5\x3c\xb3\x1d\xa2\x21\x70\xc4\x0f\x08\x13\xed\x7a\x41\x77\x88\x12\x99\x78\x6a\xa5\x84\xd0\xd0\x20\x58\xb1\x79\xc9\x2a\xfd\x03\xe0\x75\x50\x32\x23\x84\xc6\x0a\x91\xbb\x7b\x95\x83\xa8\xba\x74\x77\xf6\x76\x13\x16\x69\xe6\xfa\xf6\x4d\x0e\x43\x3a\x9d\xaf\x1a\x10\xc2\x03\x8a\x51\xec\x01\x7b\x56\x56\xc3\xce\x7f\x19\x0f\x43\x2c\x48\x58\x32\xc2\x5c\xe3\x94\x10\x1e\x31\x4d\xdd\x04\xd8\x6c\x6e\xe7\x40\x47\x84\xf0\x38\xc4\xf5\x24\x2b\xd4\x7d\xd9\x05\x79\xed\xdf\xb5\xb1\xc8\x46\xdc\x11\xc7\x29\x11\x21\x3c\x05\xec\x66\x55\x50\x83\x85\x49\x67\xc5\xf3\x30\x8f\x26\x24\xa4\x0a\xab\x8d\x4e\x6e\x70\x88\x29\x20\x24\x0c\x03\xff\x22\xdb\xde\x34\x9e\x63\x72\xbf\x43\x21\xfd\x20\xdf\xa5\x98\x7d\xf6\x24\x54\xc2\xa7\x0d\x0f\xe2\x03\x2a\xf7\xde\xf8\xa3\x90\x22\xe8\x1b\x21\xbd\xca\xba\x5f\xdd\x82\x69\x36\x67\x86\xd9\xee\x03\x11\xe7\xc6\xe1\xcb\xd7\xca\x59\x07\x0d\x8b\x45\x84\x44\x00\x88\x46\x69\x83\xd8\xaf\xa2\x5e\x96\x15\x62\x57\x1c\xd3\x70\x3b\x88\x4c\x09\x89\xb9\x35\xc5\x14\x5a\xaf\x10\xfa\xad\x60\x8a\x12\x1f\xbf\xd2\x24\xe6\x76\x61\x46\x7e\x5b\x71\x3a\x74\x67\x72\x52\xa4\x0e\x4c\xf1\x54\xe4\xb6\xdf\x38\x71\x83\x6d\x47\xc6\x1a\x2b\x3c\x23\x7b\x57\xac\x5a\xf5\xf9\xe6\xec\x2b\x4b\x62\x65\xbd\x5b\x3b\x7c\xe5\x23\x08\x8d\x20\xa4\xc9\x38\x60\xc8\x5c\x05\x4c\xea\x27\x6a\x27\x84\x24\x9c\x84\x4e\xb9\x75\x83\x4d\xd5\x21\x8b\x61\x68\xd7\x3f\xf8\x27\xfd\xcf\x70\xf6\x27\x61\xec\xeb\xfc\x1d\x1d\xf8\xd3\x78\x82\x90\x94\x0b\x61\xa1\x7c\x3f\x9d\xc3\xe8\x58\x89\x86\x90\x14\x42\x6b\xfc\x84\xbc\xba\x01\x9a\xa5\x5d\xc0\xbb\xaa\xc2\x79\xb3\xea\xbc\x98\x9d\x9c\x29\x9b\x12\x22\x78\x80\x20\xdd\xc5\xe3\xc3\x70\x53\x23\x22\x8c\x64\x57\x51\xb2\x74\xfd\xf6\xfb\xfe\x05\x55\x39\x4a\xcf\x08\x11\xb1\x35\x1d\xb2\xdb\xdf\x00\xc1\x4b\x88\x48\x9d\x2a\x55\x05\xd6\x94\x00\xb5\x78\xfc\x41\xad\x2c\x1e\x44\x9c\x1b\x07\xf4\x35\x10\x42\x64\x68\x2c\xb4\xec\x24\x67\xb0\x40\x84\x28\x50\xd4\x5b\xbf\x74\xd2\x06\xeb\x19\x17\xcc\xf1\xd3\xd6\x81\x75\xa7\x39\x64\x85\xd3\xd7\xf6\x17\xa6\x63\x0b\x54\xb9\xfe\x71\xb5\x1b\x8b\x8e\x7f\x16\x0f\x13\xa2\x13\xae\x7a\x99\x40\xab\xa1\xd4\x01\x00\xe6\x77\x1b\x02\x92\xa2\x77\x8b\xb0\x59\xbf\xa3\x8a\x4d\x26\x26\x18\x8a\xd1\x73\x9b\x71\x8e\xf5\xdc\x2e\x4c\x2a\x30\x21\xc2\x1c\x8f\x9d\xf9\xea\x30\x22\x21\x66\xe8\xbe\xe7\xa4\x0f\xf2\x7c\xbc\xb5\x18\x43\x51\xf3\xd0\xbb\x13\x3c\x8a\x06\x6c\xdd\xf2\xcc\x62\xa3\xfb\x84\x95\x8f\xc8\x45\xdd\x58\x98\xe0\x64\x83\xa4\x84\x27\xd8\xb3\x3a\xd5\xba\x1a\x48\xe3\x11\x4a\xa9\x75\xef\xc1\xea\xc0\xb2\xf4\xa9\x15\xa1\x54\x28\xac\x28\x7d\x7b\xfa\x73\x39\x9c\x9e\x94\x05\x89\x56\x23\x2c\xce\x18\x12\x42\x28\x0f\x0c\xe7\xbe\xc6\x6e\xa0\x82\xc9\x5d\xa5\xdc\x10\x65\xbc\xdb\xbe\x46\x27\x90\x17\xff\xe1\x90\x86\xb8\x8a\xff\xc8\x34\xac\x0a\xa8\x9e\x3f\xba\x23\x11\x20\x44\xc8\x12\xc3\xee\x4e\x75\xb3\xf4\xc9\xd3\x78\x27\xa0\x21\x28\xdc\x0a\xed\xee\x8d\xf2\xa9\xed\x9b\xe3\x4f\x14\x4b\x85\x84\x20\xd4\x05\x58\x3d\x6e\x7d\xc4\x7a\xbb\x59\x7e\xdb\x0f\x01\x73\x84\xc6\xda\xaa\x27\xad\xfe\x78\x58\x2d\x77\xab\xeb\xfd\xb9\x6a\x62\x3b\x48\xe0\xee\xfa\xf8\xa8\x4a\x0f\x42\x70\x87\x92\x38\xc4\x77\x79\xbd\xdc\xd8\x22\x56\xd4\x1f\x49\x31\x4d\x12\x15\x6a\x83\x7a\x20\xe1\xe4\x4e\x25\x52\x62\x4b\x6f\x27\x0a\xf1\xea\x03\x56\x9a\x72\x40\x3e\xcc\x21\x2b\x86\x7a\xe5\x6d\x3a\xe1\x46\x48\xe7\x5a\x23\xad\x6a\xc6\x68\xde\xb8\x70\x9f\x2a\x66\x10\x07\xb0\xfa\x73\x74\xc9\x2a\x91\x71\x67\x3c\xf9\xa5\x8d\x10\x47\xaf\xfe\x3f\x66\x16\x02\xaa\x23\x40\xa0\xba\x7b\x97\x26\x3d\xfc\xd9\x37\x85\x6a\x48\xb4\x85\xf9\xff\x1c\x09\xd4\x12\x0a\xd2\xa2\x00\xad\x9e\xd5\xc6\x3c\x5d\x6d\xea\x3e\x52\xa5\x00\x14\x89\x43\xa8\x66\xd2\xee\x65\xfd\x6c\x36\x91\x0d\x4b\x9f\xa1\x59\x34\x2f\x50\x64\xa2\xa8\x37\xc5\xee\x05\xac\xab\xb7\xc9\x20\xd7\x93\x3b\x6c\x22\x85\xb6\x1e\x58\xb5\x59\xff\xbe\x1b\xdd\x0b\x93\x86\x48\x1e\x7a\xca\x9b\xee\xd6\x1a\x93\x98\xce\xc8\xde\x0b\x05\x4f\x66\x20\x0b\x48\x82\x01\xe9\xf2\x43\x42\x85\x45\xa3\x4c\x0d\xcf\xcc\x02\x6e\x30\xfc\xcb\xea\x6f\x7f\x2e\x1f\xe1\xbf\xa7\xbe\xd6\x4d\x58\x90\xb2\x4e\x1e\x36\xf3\x7b\xc0\xf8\xba\x19\x09\x13\xe3\x5a\x71\xeb\x3a\x17\x13\x8c\x13\x61\x24\x49\x62\x17\xa1\x3f\x76\x2d\x8f\x31\xd4\x85\x30\xa2\x93\x2e\x30\x41\xec\x4e\x59\x34\x5d\xda\x4f\x18\xe5\x21\xe1\xc8\x46\x35\x59\xdf\x11\x6d\xff\x2e\x31\x50\xb7\x5a\x35\xd3\xb0\x68\xfe\x79\x33\x9a\x72\xac\x92\xa9\x17\xec\xf5\x0f\x03\x24\x46\x65\x42\xac\x88\x4d\x63\x03\xc3\x51\xc7\x63\x76\xd1\x63\x54\x59\x3d\x1f\x25\x72\xb5\x5d\xdd\xde\x96\xe7\x21\x21\xa3\xda\x12\x6e\x96\x8b\xdd\xc2\x7f\x57\x18\xa7\xd6\x83\xae\xcf\x88\x6f\xb3\xba\x19\x8b\xfb\xf5\xd8\x50\xc2\xc2\x94\xa3\x7a\xe8\x3f\x57\xbb\xa7\x6d\x7f\x1a\xa1\x82\xc4\x3b\xdb\xaf\x47\x0f\x6a\x7c\x0d\x11\x31\x91\x5f\x0d\x45\x61\x2d\x47\x97\xa2\xd0\x67\xe3\x12\x86\x65\x84\xf5\xe6\x1a\xd7\x23\xff\x45\x91\x66\xd8\x38\xfb\x56\x36\x2f\x3f\xb2\xf3\x1d\xf1\xff\x52\xc7\x27\x2c\x66\xb1\xc5\x97\x36\xe5\xf1\x26\x17\xcf\x1b\x63\xfc\x17\xc6\x3c\x26\xae\xe8\xdb\xbe\xfe\x57\xe5\xe9\xf9\xa5\x99\x5c\x6c\x1c\x42\xa2\x7b\xe3\xb3\xd5\xc0\x4b\xb4\x3d\x9a\x58\x21\x93\x87\xcd\x76\x1c\xb1\xb4\x47\x50\x49\xca\x8a\x65\xee\xbe\xac\xbc\x0f\x68\xfb\xf1\xed\x60\xa7\x64\xb1\x8c\xc0\x79\x86\x2c\xc6\xf2\xbd\xf3\xdd\xc6\x39\x26\x25\x61\xb1\x22\x22\xf6\x16\xe4\x67\x16\x35\xed\x00\x4d\x9c\x1c\x3d\x76\xf8\x2c\x91\xb3\xdd\x93\x3b\x3b\xd5\xe9\x2f\x37\x29\x96\x72\xdf\x32\x78\xb7\xf2\xad\xb7\x65\xb3\x31\xcb\x5c\xf4\xc0\x61\xc2\x12\xc3\x90\xe0\x8d\x8b\xa8\x5d\x0e\xc7\xe2\x04\x7f\xa7\x0b\x33\x4f\x6a\x22\x2c\x25\x89\xe8\xf5\x18\xb6\xbe\xc3\xfd\xd9\x83\x4f\x26\xf7\x25\x8d\x62\xed\xfa\x86\xf7\xf0\xb3\xb9\x01\x18\xf8\xc9\xfb\x31\x89\xf1\xd1\x5d\x47\x54\xc8\x8a\xe7\x9b\x89\xf6\x24\x61\x92\x80\x57\x7f\xfd\x52\x95\xa7\xa3\x15\x06\x9b\x5e\x8f\x8f\x7b\x99\xa4\x69\xe8\x36\x0b\x10\xf9\xe3\x29\xbf\x58\xe4\x62\x4a\x59\x86\x79\x8d\xa6\xb4\x58\xd8\x9d\x41\x7e\x12\xa6\x4c\x88\xef\x39\x94\xdd\x13\xd0\x94\x01\x1d\x19\x72\xde\x15\x1f\x0b\xd3\xa6\xc6\xef\x62\xbe\x28\x4d\x98\x66\x01\x0a\xcb\xdd\xae\xaf\x47\xab\xb5\x8e\x52\x2c\xde\xd8\xf5\xc9\x1e\x9a\x9f\x86\xb3\x1d\xf1\x4b\x0f\x7d\x7c\x1b\xb5\x4e\x38\xea\xae\x3e\xae\xb6\x9b\xdb\x6b\xec\xe5\xac\xb6\x5b\x7f\x0d\x10\x24\x48\xd8\x72\xac\x25\xb4\x9f\xdc\x9e\x8b\x03\x5f\x78\xdf\x21\x8e\x85\xee\xc5\x15\xbb\x60\x8d\x19\x4e\x2d\x41\x06\xd4\xdd\x29\xff\x7b\xf1\x36\x33\x3c\x46\xea\xcd\x23\xa0\xa4\xf2\x85\xbb\x69\x64\x14\xd8\xfa\x79\x5e\x56\xb7\x20\x34\x54\xb2\xc7\x48\xb6\xc7\xad\x4a\x81\xc8\xf4\x43\x59\xe6\x43\xb9\x18\xc2\x8c\xb2\x24\x30\x99\xe9\xb2\x7c\xb1\x98\x80\xd1\x5a\xc2\x03\x2e\x4c\xef\xa1\x80\x0f\x65\x44\xb9\x1e\x5f\x0d\x0f\xda\xcc\xba\x47\x98\xef\x8f\xe5\x3b\x54\x24\xf9\x6d\x32\xca\xd9\x00\x62\x43\xc5\x06\x65\x95\x57\x53\x6d\x8f\x72\x24\x9f\xb8\x3c\x03\x17\x31\x8b\x6f\xf2\x03\x8c\x75\x40\x72\xa5\xe6\x47\xb4\x5a\xc3\x57\x74\x54\xd0\xe0\x81\x49\x23\xe7\xe6\xb1\xee\x7c\xcc\xfd\x41\x12\x28\x14\x03\xa9\x1b\xf1\x0a\x4e\x73\xaf\x37\xcc\xc4\x01\xc0\x89\xef\xfa\x5b\xea\xfd\xb9\xa4\x0d\xe1\x24\x54\x98\xbc\xec\x1e\x17\xf7\xdb\x9b\xd5\xe3\xdd\xe2\x7e\xf1\x65\xf5\xb8\xff\xb6\xfa\xb3\x3b\x93\x34\xb8\xb7\x21\x6f\x77\x68\xc8\x31\xbf\x89\x73\xa2\x23\xc4\xd6\xa0\x85\xcc\xa8\x8d\x4a\x38\x25\x0a\x03\xa3\xd5\xf2\x71\x39\xdc\xc1\x38\x65\xe0\x7d\xfb\xac\x7c\xc1\xad\xa8\x1b\xbb\x57\xae\xaf\x27\xd7\xcc\x28\x09\x1d\x5b\xc3\x02\x73\x1c\x94\x62\x7c\x19\x2c\x02\xbc\xcd\xa8\x9c\x73\x0b\xa6\x19\xbe\xad\x9c\x93\x10\xf3\xcb\xea\x54\x0c\xa4\x54\x92\x7f\x73\xdf\xf2\xa2\xff\xf9\x37\xff\x8f\x1f\x9c\x6a\x24\x52\xee\xcb\xf7\x19\xd8\x69\x1f\x06\x70\x6e\x28\x62\x9f\x16\xb7\x57\xcd\xf0\xdb\xc2\xc4\xea\xeb\x63\x3f\x62\xdc\x5f\x9e\xd9\xaa\x1c\xe0\xc1\x47\xce\x3c\x14\x31\x36\xf0\x3a\x09\xcc\x55\xa1\x27\xaa\xa5\x84\xc7\xda\x8a\x62\xa0\x4e\xcd\x08\x39\x43\x78\x12\x10\xaf\x72\xb4\x7c\x11\xcd\x1d\xd4\xb5\x78\x86\x45\x73\x2e\xba\x4f\x78\x42\x02\x84\x9e\x3b\x8f\x6d\xac\x75\x94\xd5\x47\x77\x2a\x42\x50\x06\x40\xb5\x51\x60\xdd\x6c\xde\x6c\x49\xbd\x3f\xcc\x71\x4f\x73\xa8\xa6\xfd\xb3\x38\xc0\x5e\x8e\x42\x77\x9e\x48\x8a\x78\xe0\x76\xe6\x2e\xf2\x7c\x53\x21\x65\xbf\x19\x94\x72\xfe\x3d\x2c\xe6\x0c\x41\xb5\xe7\x75\x92\xe9\xbf\xfc\x3d\x4b\x69\x1a\x46\x1e\xa0\x9a\xa9\x09\x9c\x87\xf0\x94\x77\xbc\x09\x44\x18\x54\xbd\x27\x8c\x1f\x91\x04\x9a\x0f\x1c\x41\x3e\x7b\xee\x69\x0a\x88\x47\xd7\x59\x6d\xc5\xdd\x90\x44\x3e\xf9\x4a\x41\xac\x7f\xc4\x33\x34\x3f\xb2\xe2\x71\x6a\xfc\x41\xb8\x08\x25\x32\xa3\x8f\xe5\xd1\x96\x27\xfc\xa5\x08\x60\x9e\x08\xe7\xd0\x85\x1e\xca\xf0\x54\x83\x76\xdf\x66\xe5\xea\xbb\xf4\x8e\xcb\xd8\x68\x3a\x64\x07\xb4\x11\x4b\x1b\xac\x0d\x9c\x64\x26\x6f\xae\xd4\x80\xab\xe5\xde\xf7\x94\x11\x3b\x26\x1a\xf1\x37\xa1\x99\xee\x7f\xfb\xfb\xa2\x43\x1b\xb3\x9b\x4c\x34\x56\x6e\x7f\x69\x9b\xe9\xa0\x6d\x67\xcb\x8f\xd3\x56\x1a\x25\xab\x2d\x12\x68\xc2\x75\x24\x5c\x43\x84\x82\xc6\x56\x8a\x27\x2b\x9e\x7f\xa1\xb1\x45\x38\x10\x00\xe2\xcb\xc9\x5b\x10\x95\x7a\xc1\x9c\x61\x20\x5a\x4a\xb8\x89\x09\xb6\xf8\x5d\x72\x39\x46\x64\xf8\x31\x86\xa1\x90\x3c\x16\x3e\x6f\xc6\x7c\xf3\x7f\x0f\x19\xe7\xa3\x89\xda\xb3\xce\xe7\x67\xab\x3d\x79\x18\x04\xa9\x88\x87\xed\x8c\xaa\x3c\xdc\xc1\x05\x58\x2e\x09\x03\x12\x2a\xb7\xf2\x2d\xdb\x0d\xf3\x2a\xef\x14\x9c\x48\x18\x24\xd4\x27\x11\xf7\xa8\x6b\x74\xa9\xe1\x4b\x42\xa2\x62\xd4\x54\xfd\x52\x89\x42\xdf\xb4\x6f\x6a\x55\xa0\x13\xe1\x8c\x8b\xfb\xb0\xb6\x1f\x52\x9e\xd8\x84\xca\x4e\xc3\x36\xa7\x79\x10\xde\x0d\x85\x84\xd4\x04\xd2\x4d\xd4\x5b\xac\x33\x21\x7a\x72\x62\xdf\xd3\x0e\x8b\xf1\x4a\x7f\x94\x55\xae\x97\xa7\xe3\x85\x38\x69\x72\x21\xe3\x73\x30\x1d\x20\xfb\xd5\x1e\xbc\xc9\x4b\xd1\xec\xca\xa7\xc2\xa2\x8b\x47\x0d\x89\x90\x27\xa9\x75\x09\x40\x45\x8c\xd1\x26\x1b\xf2\x44\x59\x81\x4a\xe4\x6a\x7b\x27\xa1\xf6\xbf\xd3\x39\x18\xb6\xff\x97\x76\x48\xa2\x1f\x90\xb9\x25\xe3\x4e\x38\xc2\xd3\x74\xbc\x0c\x88\xe8\xdc\x9d\x8d\xa5\xb6\xce\x46\xeb\x61\xa8\x14\x6d\x6f\xeb\xd7\xac\xb9\x14\x38\x26\x33\xb1\x7a\x32\x1f\x25\x86\x91\x08\x6c\xca\xde\x55\x10\x6b\x2c\x5d\xf8\xa8\x2a\x8c\xda\xb0\xab\x47\xa6\xf6\x6d\x43\x3f\x20\x86\x10\x97\xcf\xac\xfe\xfd\x24\xf2\xac\x41\x0d\xbe\x39\x48\x07\x09\x05\x0f\xc2\x5e\x43\xba\xf3\x1d\xcb\x8a\xec\x70\x3a\xdc\x00\xcc\xb5\x91\x43\x19\x4a\x4c\x64\xef\xa1\xb4\x93\xa0\xaf\xee\x85\xca\x80\x50\xe3\x9c\x02\xe9\xfb\xae\x17\x34\x6a\x5d\x4e\x74\xe8\x48\xa8\x39\x37\x8e\xf0\xfd\x78\x73\xb3\x05\x54\xd9\xa9\x17\x7a\xfa\x30\xb5\xa4\x2c\x70\x22\x62\xa8\xcc\x6c\xc5\xb1\xee\xcb\xdd\x4b\xd5\x77\xe9\xec\x97\x74\x6f\x2b\x90\x80\x5b\x78\x57\x75\x73\x2a\xd4\x78\x96\x41\xfb\xdd\x36\x65\xc9\x3f\xf6\xaa\x3c\x1c\xa1\xa8\x07\x40\x26\x12\x82\xd3\x5b\xb8\xcd\xde\xb0\x28\x55\x7b\x0c\x5e\x3d\xc4\xe0\xfd\xff\x83\xbd\x23\xa1\x61\x96\xa4\x6a\xf3\xbe\x3b\xf1\xb3\x7d\x0a\x98\x14\x5d\x9f\xda\x8b\xfd\x72\x12\x95\x28\x1a\x40\x5b\xe9\x81\x21\xb3\xfd\x78\x14\x30\x8e\x3d\x98\x61\x6b\xa4\x3b\x14\xa1\x4b\xf1\xd7\x6b\x5b\xff\xea\x31\x36\x24\x0a\xe2\x10\xef\xa6\x5d\xe3\xaf\x3e\xda\x35\xa1\x38\x17\x98\x9d\xbf\xe6\x28\x10\x42\xaa\x51\x0b\xfe\xaa\x5d\xdf\xfa\xda\x4f\x44\x18\x20\xf8\xf6\x66\xb7\xec\xfe\x64\xe2\xc4\xbd\x8d\x28\xb9\x66\xf1\xa2\xee\x20\x15\x29\x12\x90\xbf\x5c\x2f\xed\x4e\x19\xf6\x47\x24\xf6\xf5\xda\xf9\x59\x3c\x6f\x9b\x32\x87\xe2\x41\xfc\x1d\xd9\x7b\x77\x02\x66\x12\x0c\xbc\x11\xe3\xe1\x2b\xb5\x11\x8f\x53\x66\xb5\xeb\xdf\x00\xf9\xb0\xff\x2c\x6d\x2e\x32\xdf\x5e\x8c\xc2\xc8\x62\xe0\xed\x63\xca\x8f\x84\x4c\xee\x76\x18\x47\x88\xb3\x30\xed\x4f\x1b\x4a\xe6\x91\x28\x4c\x22\xec\xd9\x2d\x5f\xc4\xe1\x98\x95\xc5\x36\x3b\x1c\xcf\x31\x9c\x6e\x70\xc4\x42\x65\x11\x19\xcf\xfb\x43\x76\xc1\x6c\x87\x44\x51\x2c\xc0\x55\xdb\x9d\x9f\xc1\x58\xb4\x82\x44\x91\xe0\x7c\xd2\x95\x10\x39\x74\x42\x59\x24\x8a\xa4\xad\x92\xac\x55\xb9\x90\xa2\xd0\xe5\x74\x1d\x8e\x22\xe5\x00\x01\xc2\x6f\xfc\x51\xac\x42\xa1\x27\xc2\x65\xe7\x52\x9e\x24\x4a\xb8\xc1\x5a\xd2\xdd\xdd\xe3\xe4\x46\x25\x29\xc1\x40\xce\x3b\x95\x39\x94\xe0\xa2\xbd\x6d\xd8\xb0\x1b\xad\xf7\x91\xa0\x92\xa6\x3d\x31\xe7\x6b\x59\xd5\x88\xbd\xdf\x36\xa7\xe9\xbb\x20\x78\x8c\x9a\xa7\xed\x33\x65\xe3\x65\x67\xb4\x29\x46\x82\x5b\xa3\x6f\xa1\xf5\x03\x7c\xee\x2a\x7e\xf9\x25\x90\xa1\xc2\x0e\xf1\x6e\x7d\xb7\x42\x64\xcf\x7a\xb9\xf1\x17\x2d\xc1\x0a\x8d\x7c\x5d\xdd\x3e\xf0\xaf\x4f\x77\x8b\xfb\xf5\xce\xa7\x67\x91\x4a\x53\xe3\xe5\x0a\x1d\xc4\x76\x55\x68\xb4\xc0\x42\xe7\xbc\xd1\x4e\x13\x69\xa9\x3c\xf3\xd8\xc6\x98\x88\x7e\x5e\xb6\xab\x55\x93\x0d\xad\x2b\x07\xab\x75\xfb\x21\xec\x21\x2e\xcb\xac\x88\x93\x08\x53\x1b\x92\xf8\x0b\xd0\x26\xc5\x56\xc9\x63\x6f\xc3\xd1\xfe\x11\x04\xed\xa0\x95\x68\x09\x39\x8a\xa2\xdd\x30\x08\xad\xd6\x74\xd3\xa9\x5d\xde\xf6\x3d\xe7\x08\x52\x86\xf1\x68\x27\x35\xd5\x5e\xeb\xf7\xc7\xed\xc4\x36\x74\x76\x4f\x8d\x40\x46\xc8\x8b\xda\xba\x05\x62\xa8\xb2\xf2\x8f\x0b\xff\xeb\x3e\x6a\x42\x8d\xb1\x23\x2a\x6d\xfe\xb3\x94\x88\x24\xb0\x74\x54\x38\x33\x5a\xf6\x9f\x89\x15\x65\xdd\x6e\x9f\xcf\x39\x3b\x91\x38\xa0\x1a\xfb\x62\x2f\xd9\xf3\x4b\x7b\xcf\x07\x5e\x91\xf3\xd3\x22\x0e\xda\x40\xd6\xa1\x1a\xb2\xc9\xc3\x8c\x49\x10\x62\x8a\xb2\x47\x01\x42\xaf\x18\xb2\x31\x33\x6f\x50\x4c\x48\x84\x09\xf6\x3d\xbc\x63\xe9\xf2\x4c\x07\x85\xc4\x24\x09\x54\xdc\x45\x97\xda\xd6\x5a\xc8\xf6\x98\x67\x03\x78\xec\xe4\x33\x2c\xb4\x94\x0d\x27\x5a\x6a\xf9\xdf\x57\xd9\xa0\xbb\xd8\x87\xc5\xfe\x23\x22\x1a\xf8\xc0\xcc\xf8\xbf\x4c\xa3\xe4\x98\x93\x44\x91\x4e\xc5\x05\x9f\xe6\x99\x79\x14\x89\xc3\x28\x45\x3d\x9c\x77\xf0\x5a\x37\x77\xc2\x47\xfa\x71\x14\x30\x08\xc7\x30\xf0\xbb\x8f\xf6\xbb\xeb\xf6\x39\xe4\x30\xd5\xdf\x24\x71\xc4\x03\xe9\x3e\xb1\x5d\xdd\x0a\x09\x9e\xd1\x4a\xe2\x38\x91\xa9\x9a\x88\xdd\xce\x54\x50\xe3\x24\x66\xd8\x1a\x7a\x17\x55\x95\x95\xd5\x2f\xda\x4c\xb1\xd0\x02\x5b\x29\x6d\x62\xbd\xb4\x4e\x0f\xb6\x58\x80\x8e\x83\x6b\xed\x2c\xef\x57\xc8\x63\xf4\xd7\x22\xb9\xb1\x32\xa1\xbf\xff\x31\x8c\xe0\x62\x1d\x04\x29\x78\x33\x66\x2c\x8e\xcf\x3d\x72\x4d\x25\x56\x40\xdf\xcb\xfc\xf5\x0b\x14\x50\x67\xe7\xb0\xd2\xf1\x45\x82\x4a\x80\x76\x2b\xf6\xe2\x78\xf4\x4d\xa3\xe1\x92\x18\x9b\xc8\x6a\x08\xbd\x77\xf8\x9e\xd8\x28\xe5\x49\x6d\xff\x2c\xa5\x67\x7c\x4c\xb3\x8d\xf1\xe5\x19\x9d\xe0\x56\x27\x4f\x1f\x5f\x56\xf7\xc1\xf2\x25\x93\xd9\x67\xb1\xb1\xfd\x58\x42\x78\x18\x5b\x4e\x4b\x21\x0e\xb0\x6d\xca\x36\xea\x1f\xbf\x3b\x09\x89\xd2\x84\xf8\x02\x41\x69\xba\x29\x8e\x2a\xcc\x7d\x02\xe6\x46\xd3\x44\x38\x6c\x4a\x53\x89\x3d\x2a\x80\xec\xb5\xe7\x6d\xb8\x31\x2c\x88\xfd\x42\xfc\x08\x07\x91\x15\x1b\x63\x85\xcf\x67\xb7\xdc\x84\x85\x29\xee\xcc\x05\x80\xae\xaf\xb2\xca\x0b\xb7\x90\x84\xc5\x21\x73\x33\xef\xd9\xd9\x09\xf8\x23\xda\x8a\x3e\xda\x69\xb1\xbe\xbf\x5e\x5f\x3a\xb9\xd1\x81\xa7\x0d\xb4\xb1\x1e\x3e\x7a\x77\x2c\xe4\x51\x62\xcb\x0c\x79\x7e\xd5\x6e\x9b\xf3\x5c\x51\x92\x84\x49\x8c\x84\xab\x8e\xc0\xe2\x9d\x6f\x49\x12\x85\x31\x82\x29\x70\x2b\xd8\x67\x85\x29\xab\xc3\xe8\x66\xc4\x54\xa4\x56\x7c\x66\x75\x38\x36\x1f\x33\xfa\x25\x24\x89\x59\x10\xc0\x30\xe8\xf0\x81\x4e\xbf\x62\x26\x71\x64\x05\x0a\x3a\x87\x2c\x3b\x97\x3b\xe6\xb5\x1f\x96\xa4\x48\x69\xbb\xfb\x73\xb9\x59\xfb\xa2\x62\x92\xf0\x90\x0c\xf5\xd5\x9e\x6a\xa8\xbe\x54\xe5\x7b\xf3\xf2\x50\x96\xf9\x27\x7a\x4c\x24\x49\x42\x70\x7e\x73\x3f\x1b\x2b\xb8\xb6\xbe\xee\x4e\x9b\x5a\x29\x7c\x2b\xce\x85\x45\xf6\x4b\x67\xd1\x8c\xd0\x5e\x8c\x7f\x32\xa9\x52\x11\xa6\x56\x95\xc9\x1a\x78\xfa\x3f\x83\xc6\xc2\xcd\xbf\xb2\xa2\xd4\x83\x3f\x1b\xc0\x45\xf0\xf9\x34\xb5\xc0\x24\x89\x68\xb3\x26\x7c\x1c\x2b\x0b\x3a\x02\xed\x8a\x7c\x08\x9b\x18\xcf\x7c\x41\x01\xf5\xda\xdb\x0d\xad\xae\xcb\xea\x63\x69\xeb\xfd\x53\x0a\x12\x49\x64\xc2\x90\x36\x82\xf1\xc8\xd6\x0b\xcb\x91\x44\x05\x96\x44\x7c\x5b\x3e\xa3\x6b\xd5\x99\x54\xd6\x78\x2b\x4e\x54\x9c\x20\x55\xe1\x45\x9c\xc5\x95\x89\x12\xd6\xd8\xef\xea\x54\x15\xbd\x65\xd8\xa7\x15\xe6\x44\xf3\x00\x91\xf5\x02\xb7\xe4\x11\xce\x6f\xbc\x5a\x25\x40\xad\x80\xe8\x17\x2b\xb4\x82\x78\xbd\xf6\xf5\x66\xe3\xa5\x37\x31\x44\x4a\x67\x13\xff\x17\xa8\xe6\xdb\x49\x77\x5d\xa2\xc4\xf0\x14\xd1\xdf\xf7\xd7\xc3\xb9\x65\x42\xe3\x7b\xe7\x77\x99\x05\xe4\xef\xaa\xec\xf9\x79\xda\x0c\x4c\x4c\x64\xb5\xb7\xda\x57\x11\xf5\x40\x46\xb8\xbf\xc4\x24\x11\x9e\xe7\x7a\x75\xbf\xb9\x5b\xdf\x2f\x76\x1b\x47\xce\x21\x29\xe1\x96\x75\xee\xf1\x6a\x4f\x55\x3e\xc7\x36\x27\x6d\x6a\x69\x9c\x12\xdc\x52\x1c\x85\xf2\x34\xf9\xee\x22\xda\x20\x15\xb9\x04\xbb\x41\x9d\xfc\x1f\x93\x21\x32\x44\xc5\x80\x87\x5c\x34\x59\x71\x1a\x9b\xd0\x5d\x14\x48\x27\x29\x0d\x98\xc0\x4c\xba\x03\x75\xd8\x78\xba\x54\xaf\xbb\x72\xc8\x2e\xf3\xe3\x99\x8e\xad\x6f\x71\xbe\x3d\x1d\x07\x7e\xe7\xa3\x27\x92\x52\xc3\xbd\xde\x8b\x13\xa2\x1d\x1f\x67\x92\x82\x15\x3c\xb5\x4a\x0a\x97\x52\xcd\xe9\xa7\x84\x6d\x37\xe1\x02\xea\x78\xa0\xd3\x92\x5f\x1a\xa6\x06\x58\xc7\xb0\xbe\x11\xd8\x0b\x3b\x0d\x40\x11\x69\x44\x63\xe6\x18\x13\x1d\x3a\xe0\x5c\x7b\x80\xa4\x91\xd4\x08\x9d\x7a\x7e\x56\xd3\x23\xc0\xfd\xfe\xb3\xc8\xf3\x6d\x03\x47\x3f\xe1\xd2\x38\x50\x88\xbf\xae\x85\xe9\x28\x2b\x53\x5a\x14\x49\x63\x1e\x1b\xd9\x0b\xcf\xdb\xfc\x77\xfc\x1d\x71\x08\xd6\x94\xc7\x2a\x3e\x5d\xdb\xea\xb4\x5e\xbd\x4d\xc5\x10\x49\x1a\xc7\x2a\x74\x75\x93\xeb\xdd\x24\xc7\x4a\x13\xca\xb4\xb7\xfc\x17\xf5\x8b\x0b\x40\x46\xb3\x20\xe1\x81\xe8\x48\x46\xfe\x12\x93\x24\x46\x34\xff\xfa\xee\x7a\xf5\x87\xbb\xce\x59\xfd\x15\x3f\x1e\x02\x14\x8b\xbf\xcd\x0a\x93\x15\x9d\xcf\x22\x49\x53\x07\x3c\xb7\x7d\xae\x76\xf1\xde\x77\x87\x84\xa5\x9f\xe9\xa2\x70\x36\xd1\x77\xce\x5a\xc2\x8f\x10\x9c\xa0\x9e\x3b\x14\xfa\x26\x1b\xc0\x14\x26\x5f\x2e\x84\x85\xe8\xfe\x6b\xfd\x65\x3d\x78\xd1\x53\xa1\x8c\x8f\xc0\x8f\x58\x32\xc9\x45\xdd\x34\x03\xbf\x8e\xc9\x14\x93\x2c\xc0\xb5\xf8\x66\x37\x0a\xc8\x52\x29\x2c\x77\xca\x47\x3e\xf5\x6a\x60\x25\x49\x52\x09\x49\xd2\x47\xc5\x16\x35\xd3\x99\x71\x7c\x8a\x9a\x49\x25\x58\xe6\x58\x57\xe9\xef\x15\x56\x48\x2a\x4d\x84\xed\xc8\xd5\xf3\xf3\x60\xf1\x9d\x7b\x5b\xba\xc9\xad\x52\xed\x7d\x97\xb1\x19\xbe\x56\xe5\x5c\xb1\x28\x55\x22\xc1\xae\x07\x82\x10\x8f\x55\x56\x43\x7d\x7b\xeb\x0b\x34\xa9\x66\x1c\x43\x90\xbb\xc5\x1f\xeb\xbb\xa7\xbb\xfd\x7a\xb9\x71\x20\xba\x6e\x44\x22\xb1\x5a\xec\x1d\xc1\x3f\x61\x43\xfe\x32\x99\xc6\x7a\x7b\x1f\x37\xa4\x40\x38\xb6\xac\x8f\x15\xe8\x4c\x35\x43\x22\x71\xd2\x0d\x49\xb1\x59\xf7\x24\xb3\xff\xfa\x4b\x82\xd8\xa0\x45\x57\x6d\x29\xd5\xf7\xf0\x7e\x57\x96\xc5\xe4\x75\x00\xad\x62\xd5\xb5\xd3\xb2\xe2\x63\x0b\x85\x1e\x2b\xd4\x92\xd4\x30\x82\x6c\xcf\x45\xf1\xea\xb7\xf0\xd4\x38\x71\xf5\x83\x78\x85\xca\xe1\x88\x07\x52\xda\x24\x35\x69\xa0\x44\xa7\xe8\xe6\xfd\x20\x77\xa5\x5d\x5a\x46\x77\x5f\x04\x84\x13\xde\x49\xb0\xbc\x65\xe5\xc9\x69\x24\xcd\x4e\x6f\x11\x08\x85\x6a\xed\xf0\xdf\x53\x3f\xeb\x44\x20\x05\xa2\x70\x32\x55\x3a\xc7\x7b\x77\x80\x24\x69\x04\x9d\x36\x17\xf2\x2e\xcb\xca\x43\xa0\x9d\x25\xf1\xe8\xae\x08\x62\x48\xe4\xdd\xba\xc5\xcf\x1f\x1d\x12\x4c\xd0\x28\x12\x1d\x56\x79\xd5\xbc\x2c\x2d\xb8\xeb\x11\x54\x06\x6f\x5d\x20\x20\x18\x0f\x82\xc8\xf3\xf4\xbc\xb3\xc1\xe6\xd4\xa8\xf2\x30\xf4\x5c\x20\x82\x29\xeb\x96\x54\x59\x65\x0f\xbc\x81\x37\x65\x75\xb0\x37\xc9\x0d\xe2\xa9\xe5\x73\x79\x39\x3b\x6b\xf5\xe8\x8f\x86\xa1\x5d\xd0\x34\xbc\x41\x5e\x1e\xa1\xda\x0b\xad\xf7\xaa\xac\x9b\x7d\x69\xba\xee\xd7\x78\x89\x13\x61\x1c\xda\x02\xaf\x31\x59\x9e\x89\xe6\x1c\x0e\x23\x42\x69\x33\x68\x09\x75\xb3\x3d\x59\x68\xbc\x67\x4f\x12\x11\xc5\x36\x97\xc7\xa0\xf9\x06\x83\x47\xd4\x4b\x1a\xe2\xec\x45\xcc\x12\x2f\x5b\x84\x25\x69\x44\x0e\x8e\x09\xa0\x93\x27\x1b\x33\xe1\x58\xef\x20\x10\x2a\x8c\x02\x02\x9b\x53\x73\xf4\x1e\x59\x44\xc4\x42\x60\xcf\x15\xe7\x2b\xf5\x7f\x4d\x42\x6a\x7a\x90\x90\x35\x92\x1e\x74\x07\xfd\xa8\x34\xc6\x20\x36\xcf\x8a\xd7\xc9\x33\x4f\x83\x00\xe7\xe0\x7e\x8c\xaf\x98\x76\x5b\x85\x48\xb9\x21\x9e\x60\x08\x35\xba\xc0\xc0\x35\xdc\x41\x2d\x1c\x01\x6e\x4a\x5f\x98\x94\x02\xfc\x79\x24\x60\x98\x66\x7d\xea\x2b\x10\x6e\x57\x9e\xb8\x6b\x12\x21\x14\x8f\x5d\x49\xee\x5e\xa8\x5d\x79\x0f\x8d\x99\x5e\x93\x36\xf8\xe3\x37\x0f\x5e\xcf\x62\xbb\x5b\x7c\xf3\x94\x2a\x21\x1c\xaa\xdb\x31\x23\x86\xf4\x9e\xf1\x57\xc9\x40\x61\xfc\x23\xac\x58\xae\xed\x71\x0e\x99\x2d\x42\x51\x85\xcc\x1c\xcc\xeb\xed\xf2\xee\xe3\x6d\x3f\x82\x47\xa8\x97\xd0\x4e\xa7\xa1\x2d\x39\x11\x2a\x86\xc8\x8a\x80\x69\xf8\xb9\x99\xfe\x06\x95\x5a\x1b\xab\xa3\x63\xae\x8d\xdd\x16\xfd\x20\x9d\x60\xa0\x70\xbd\xfa\xe7\x70\x43\x12\x9a\x08\x14\x97\xfe\x0e\x55\x21\x0e\x0f\x9d\xe6\xc6\xa0\xd6\x2c\x34\x8d\xbd\xc0\x17\xc2\x2c\x3a\xb5\x0d\x22\x34\xb7\xd4\xf1\x36\x9c\xde\x95\x5b\x68\x3a\x22\x62\x32\xe8\x7e\xba\xc1\x26\xd1\x38\x51\x2a\x18\x18\x66\x1f\xb7\xaa\xac\x66\x84\x62\xc7\x97\x6f\x14\x67\x8e\x73\x64\x11\xee\xb3\xd4\x62\x22\x89\x08\xb0\x0c\xb9\x7d\xcf\xea\xda\x0a\x61\xaf\x7e\xda\x99\xfd\xff\xba\xab\xb8\x33\x52\x0a\x72\x58\x14\xb7\x8f\xff\x01\xaa\xaf\x50\x65\xcd\x25\x8a\x9a\xa4\x8c\x93\x74\xb8\xb8\xdc\xf4\x75\x51\x49\x39\xc1\xb9\xf0\xf5\x98\x9f\x46\x3c\x45\x49\x43\xc9\x2c\xff\xe9\xad\x7c\x85\x45\xa1\xb7\x80\xfb\x0f\xa0\xfa\xf9\xb8\xd2\x39\xf9\x42\xc9\x02\x07\xd0\x59\x8f\x9f\xbd\xe4\xcc\x6a\x65\x18\x0b\x08\xf3\x48\x4a\xff\x9d\x5c\x04\x28\xde\x71\xdd\xe9\x06\x76\x47\xb4\x95\x7b\x69\x83\x9d\x07\x14\xc8\xee\x51\x1e\x32\x74\x8e\x36\xcf\xe2\x80\xab\xc6\xe4\x4b\xc3\x84\xa3\x08\xdd\xde\xea\xb7\x7e\x17\x79\xa6\x87\x76\xd4\x93\xdb\x1c\x89\x20\x89\x06\x16\xe1\x03\xb2\xc0\xfc\x07\x62\x61\x35\xd5\xa6\xde\xeb\xe3\xbb\x12\x6b\x06\x76\x9b\xd0\x00\x87\xed\xa9\x6a\xef\xf8\x08\x60\xe9\x07\x9a\x10\xf4\x90\xfd\x3c\xfe\xb6\x44\x70\x6c\x34\xb7\x77\x02\x0d\xf1\xfd\x5d\x48\xe3\x14\x3b\x41\x18\x57\x56\x75\xf3\x03\xe0\xb5\x2f\xda\xcb\x54\x46\xdc\xc1\x27\xaf\x17\xc7\xe3\x68\x2f\x91\x22\xd4\xb8\x59\x1e\x2b\x58\x2f\x37\x77\xa2\xf8\xb8\xa8\x21\x47\xa4\x10\x12\xf3\x81\xe5\xf2\x76\x34\x63\x24\x0d\xad\xa9\xd6\xe1\x98\xef\x8f\x83\x12\x8f\x94\x3c\x41\xb6\xea\x61\xdf\xbe\x9d\x52\xd4\xfd\x11\x49\x89\x55\x0d\xc8\x44\x7e\x0d\x42\xe7\x59\x31\x38\x68\x45\x1e\xbf\x40\xa7\x01\xd3\xeb\x22\xb5\x87\x81\xa3\x69\xe0\x11\x1b\x66\x3b\x31\xb5\x53\x27\x52\xea\x08\x17\xd5\xef\x90\x89\xe7\x73\x61\xe4\x76\x80\xc2\x1d\xd2\x89\x2a\xf8\x53\xab\x24\x74\x9a\x50\xcd\x0e\x99\xdf\x93\xee\xa3\x54\x89\xe0\xa1\x17\xdf\x5d\xe8\xee\x7d\xd2\x8a\x23\x50\x14\xdb\x71\xf7\xf0\xbe\x3d\xe2\x1a\xd8\x49\xd8\x8c\x2f\x4f\x9b\x14\x97\xbc\xac\xde\xb9\xdc\xd6\x2d\x50\x12\x02\xc9\xc8\x60\x12\x58\xeb\x81\x49\xcc\x25\x81\xda\x36\x94\x5d\x56\x96\xcb\x65\x99\xcd\x8a\xb3\x13\x09\x69\x80\xfd\xbb\xbd\x3e\x4d\x81\x01\xd2\xa4\x2a\xf4\x7a\x15\x7b\xdf\xb3\xc1\x32\xd2\x8d\xf0\x2a\xe2\x44\x1a\x90\x88\x3b\x59\x56\x1f\x75\x93\xf9\x7c\xdc\x1e\x54\x01\x63\x58\x5e\xdb\x39\x47\x91\xee\xef\xa1\xc4\xfc\xb6\x47\xb4\x8e\x7f\x81\x22\x44\x21\x98\x4f\x5b\x09\xbb\xa1\x37\xf0\xec\x22\xa8\x08\x50\x45\x9c\xea\x52\x47\x0b\x9d\x92\xf3\x14\x0d\x58\xec\x80\x29\x8b\xaa\x59\xd5\x6a\xae\xe0\xa7\x28\x4b\xa9\xd5\xec\x7e\xdb\x0a\x73\xa1\x65\xa9\x68\x98\xc2\x50\xd8\x42\x9e\x11\xd0\xfc\xc0\x58\x52\xcf\xe7\x6b\xc7\x22\x93\x6a\x94\xa7\x2b\xc6\x42\xac\xdb\xe2\xad\xce\x0a\x54\xeb\xc5\x82\xe4\xea\xbf\xdf\x45\xee\xa3\x5d\xc5\x20\xb4\x90\x4c\x39\xf9\x5d\x0c\x62\x5b\x59\x79\x29\xdf\xf3\xb7\xff\xbd\x94\xa7\xc9\x00\x1e\xd2\xd4\x72\x34\x10\x8b\x93\x67\x75\xb3\x3d\xda\x74\x60\x32\x30\x0d\xa8\x95\x47\x70\x70\xb8\x55\xa1\x72\xf1\x76\xa9\x74\xa8\xb8\x8a\xad\xc3\xfd\x14\x3b\x4b\xa2\xc0\x0d\x89\xa8\x40\x3e\xe3\x6d\xe9\xbd\x6e\x46\xe3\xe8\xb8\x50\xa3\x62\x02\x54\xf6\x20\x35\x6c\xb4\xf5\x19\x93\x8a\xa9\x46\x11\x93\x97\x32\xd7\xdb\x93\xec\xb4\x6b\x67\x68\xb4\x2a\x4e\x05\xae\x89\xcb\xcd\x7d\x40\x49\xec\x6f\x63\x42\x63\x0c\x85\x16\xda\xaa\xb2\x5e\x30\xe2\xf5\xa3\x63\xa6\x9c\x86\x24\x42\x77\xcf\x38\x22\xe3\xef\x4c\x80\xa1\xd8\x1a\xb8\x4d\xdd\x11\x29\xdc\x51\xa1\x05\x2e\x3c\xf0\x66\x2d\x9f\xfb\xc5\x50\x49\x6e\xa9\xfb\x50\xe8\x8d\xa1\xfc\x6b\xf7\xf7\x34\x11\x66\x04\x3b\x98\xc3\x8d\x2b\x25\xac\xdd\x9c\x86\x37\xff\x49\x4d\xb9\x93\x9f\x6d\x10\xac\xf5\x99\xeb\x1e\x51\x9a\x87\xb6\xde\x9a\x67\x50\xdc\x88\xea\xd0\x9d\x26\x86\xd4\xdb\x9c\x14\x90\x5f\xc3\xa8\x0d\x35\x8f\xed\x51\x1a\x14\x32\x52\x2d\xc9\xec\x7a\x7d\xbf\x71\x8a\x6c\x43\xba\x99\x82\x44\xe1\x7a\xba\xfe\x7d\xd7\xa1\x46\xfb\x63\x10\xb8\xca\xe5\xee\xbd\x9c\xfc\x5a\x00\x82\x4d\x0c\xe9\x44\x30\xe6\xad\xbb\x89\x02\x13\x09\xcb\x61\xfc\x58\xf8\x7c\xc8\x7f\x81\xa1\x04\xe1\x5d\x4d\x2f\xe5\xf5\xa9\x97\xa3\xff\x58\x2c\x30\xf9\x3d\x59\xcb\x8e\x91\x22\xde\xf8\x1e\x18\x19\x23\x3d\x47\x41\x96\xa3\x73\xeb\xe8\x44\x3a\x90\x0c\x7f\xc3\xfe\xd0\xee\x6d\xb3\x5f\xa6\x03\x6d\x45\xf2\x84\x52\xd5\x09\x96\xe5\xe9\x58\x16\xf5\x03\x54\xb6\x66\xb3\xda\xf9\x59\xa2\x49\x18\x63\x58\x96\x83\x69\x08\x99\x7c\x13\x09\x6d\x97\xe3\x1d\x32\x1b\xb6\x77\x4e\xab\xa4\x8d\xae\x71\xde\x1c\xf3\x53\x53\xaa\x4a\xa8\x8f\xfc\x2d\x5f\xa8\x17\x9b\xf4\xce\x2c\x8f\x9a\x32\x41\xc4\x84\xa2\xe9\x0f\xa5\x0c\xc5\x6d\x2e\x66\x81\x9a\xb3\x10\xf7\xee\xc3\xc7\x50\x42\x40\x73\x26\xb1\x2d\x5d\x65\xcf\x2f\x4d\x1c\x4d\xae\x9f\x47\x14\xa3\xbc\x17\x51\xbf\x3c\xb5\x8b\x56\xfe\x91\x15\xcf\x03\xc0\x6c\x67\xcc\xe5\x83\x11\x1d\x86\x89\x8c\xcf\x4c\xf9\xff\x9c\x04\x55\x3a\x0c\x15\xc2\xcf\x1f\x4f\xd9\x1f\xa7\xa1\x8c\x0e\xd1\xa1\x8e\x11\xcb\x59\x9e\x1a\x72\x5d\x76\xd1\x87\x8e\x28\xc1\xe5\xdc\x9d\x28\x14\xfd\x81\x10\xdc\xe6\x72\x3a\x2e\xcb\x6a\xea\x48\x3a\xff\x84\x23\x16\x79\xf5\x65\x57\xbe\x40\xf7\xa3\x4f\xd1\x3d\x3a\x66\x76\xef\xb1\xf9\xac\xc7\xf6\x37\x48\xc0\x1f\x81\xcf\xba\x75\x53\xc7\x91\x94\xd2\x67\x09\x8d\xc8\x9d\x09\x8a\x8f\x50\x74\x9c\x10\x8c\xde\x5e\x5f\x77\x50\x37\xeb\xe5\xc6\xef\x3a\x3a\x09\x52\x34\x8f\xdc\xdb\x74\xd6\xca\x56\xfe\x4a\xe8\x66\x48\xbe\xd6\x89\xb4\xbe\xe2\x57\xa7\x0f\x9b\xbd\x77\xcf\x3d\x25\x1a\x63\xf0\x1b\xa8\xaf\xa0\xea\x5a\x37\x3a\x8d\x42\x4e\x3a\x21\x7e\xd0\x5b\x31\x89\x4e\xb4\x70\x46\xa0\xfe\xed\xbd\x24\xa7\x39\x89\x52\xb5\x48\x09\x2a\x18\xfe\x58\xdc\xde\xae\x76\xfb\xdb\xab\xfd\xe2\xfa\xae\x2b\xa3\x6a\xa9\xb9\x62\x76\xc1\xd8\x95\xa7\x36\xe3\x84\xa2\x19\xb3\x80\xdc\x48\x15\xc4\x71\xcf\xa8\x5f\x1c\x8f\xb9\xd7\xbc\xff\x4c\x51\xf2\x93\xff\xf8\xf3\x12\x62\x5c\x49\x0b\xb1\x98\x0f\x17\x3d\x3f\xba\x0f\x48\xe2\xcd\xdb\x96\x4f\xdb\xeb\x0b\x4b\x89\x8a\x34\x6e\x4c\x48\xe7\xbe\x29\x2b\x6f\xc7\xe7\x7f\xb9\x4a\xc3\xc8\x35\xbe\x6f\xcb\xe7\x51\x1e\xa0\xb5\xb0\x5e\x7f\x6a\x90\x95\x69\xe0\x06\x77\x62\x84\xe0\xb7\xf3\xbd\x9d\xb8\xf5\x5c\x92\xa3\x21\xe4\xb1\x2f\x02\xba\x90\xb7\x1a\xb6\x97\x34\xe8\xc4\x88\x41\x0e\x7b\x35\xeb\xe5\x43\xb4\x09\x3a\xaa\xe2\xc8\x25\x8a\x68\x93\x86\x48\x42\xbe\xda\x8e\x24\x08\xb4\x11\x69\x64\xf3\xab\x63\x59\x8d\x0a\xac\xc4\xdf\x19\x03\x9c\xba\x93\xde\xc0\x79\xa2\x6f\x47\x41\x10\xa6\x74\x28\x30\xd7\xe7\x50\x10\xc4\x4e\x5b\x0e\xf5\xe0\x4f\xb3\x71\xea\xf4\x6c\x22\xc4\x18\x04\xdf\x29\x0b\xe8\xde\x36\x30\x36\x38\x20\x10\x48\xeb\x13\xfc\x50\x95\xa5\xb1\x1c\x9d\x5e\x30\x8e\x40\x00\x2c\x55\x1e\x3c\x6e\xd5\x3a\x26\x82\x28\x93\x6f\x25\x2c\xc5\x8e\x64\xa5\x8a\x41\xb6\x0f\x24\xb5\x5e\x74\x56\xe9\xed\x53\xfb\x66\xff\x09\xa5\x30\xa6\x1b\xf9\x83\xff\x0a\x47\x79\xe1\x56\x50\xaa\xd2\xc0\x6b\x16\x19\xa1\xa0\xbe\xa4\x14\xea\x5f\x62\xa0\x4c\x60\x8a\x67\xd7\x3f\x2c\xf9\xd8\x52\x4a\x51\x6a\x18\xf7\x91\x81\x1a\x8a\x60\xf4\xaf\xe5\xef\xa7\x19\xc4\x11\xb0\x00\x94\xb5\xcf\xf8\x68\xb3\x50\xcb\x41\xfa\xbf\xa1\xe3\x80\x31\x9b\x99\x16\xa7\xc3\x55\x05\xef\x7e\x99\x83\x30\x60\x58\x57\xca\x6a\x54\x42\x47\xce\x70\xd5\x3d\xc6\x90\xca\x94\x78\x5f\x3f\x2c\x59\xfb\x03\x51\xaa\x98\xd3\x01\xad\xf4\x55\x59\x4e\x0a\x9b\x10\xa6\x52\x99\x9e\xf4\x7c\xdf\x0b\x63\x40\xa4\x03\xef\x2b\x7c\xb3\x7e\xdc\xee\xf6\xdb\xdd\xea\x61\x7f\xbb\xbe\x5b\xef\xfc\x90\x98\x58\xe5\x37\xcc\xc9\x69\x81\xc2\x3e\x93\x9b\x13\x33\x2a\x5d\xbf\xcd\x56\x3b\x86\x0e\x18\xc3\x7b\x30\xd4\xef\x81\x38\xb5\xbe\x39\x2f\xa5\xce\xa1\xc2\xed\x66\x58\x1a\x87\xd8\xd8\x3e\x19\xae\x1c\x96\x88\xf8\x88\x2d\x2f\x77\x3c\x89\x02\x6f\x7e\xfb\x20\x10\xc0\xaf\x67\xed\x45\xdb\x91\xcc\x75\x22\x1a\xaf\xe6\xdd\x15\x00\x4f\x03\x2b\x14\x02\x49\x42\xb0\x1a\x23\x64\x76\x0b\xc5\x73\xd3\x6b\xb2\xf8\x49\x95\x68\x86\xa8\xb7\xf6\x66\x5e\x65\xcd\xa6\x6a\xd3\x5c\xe4\x61\x6c\x36\x57\xdd\xa5\x19\xc5\x7a\x85\xff\x87\xec\x78\x8e\x8c\x1b\x4f\xbf\xd4\xd8\xef\x7d\xc9\xd0\xd0\x75\x6e\x2b\x01\x41\x53\xee\x2a\x63\x5b\xe8\x04\x39\xa7\xb9\x19\x08\xae\xd1\xd4\xa9\x2e\x44\xa3\x5e\x40\x6f\xfc\x22\x07\x22\x4c\x41\x3a\x00\x52\x87\x9c\x9e\x7e\x3a\x11\x81\x73\xec\x39\xcb\x04\xc6\x97\x23\xd3\x18\xa3\x8b\xe3\x8b\xa8\x0e\xa2\xa9\xb2\x09\xf9\x0a\xa4\x4a\xa2\x76\xc2\x16\xe5\x0d\xc0\x59\x24\x30\x1e\xab\x88\x35\x64\xdd\xd7\x2f\xa7\xe6\xba\x7c\xef\xae\x59\x25\x3c\xb4\xc4\xb7\x45\x73\x57\xd6\xcd\xd8\x3b\x64\xb4\x27\x82\x4a\x09\x96\x0e\x37\xef\xd8\x1f\x59\x1f\x8e\x79\x77\x1a\x2d\x50\xe2\xfb\x0e\x8a\x13\x99\x84\x77\xa0\xa3\x04\x65\xf4\xdc\xd3\x6a\xa7\x87\x57\x38\x1b\x23\x14\x26\x17\xad\xc1\x0a\x93\x5f\x7b\xb7\xf4\xbf\x07\x11\x07\x88\x25\x96\x62\x5d\xd9\x62\x90\xb7\x82\x21\x56\x7a\xba\x86\x66\x2a\xce\x3a\x7b\xe3\x4c\x40\x19\x92\x3c\x5f\x4e\x85\xae\x40\x7f\x9b\x48\x93\x98\x80\x1a\x5c\xfc\xaf\x21\x17\x1f\xde\x8c\x78\x7c\x0a\x42\x04\x0e\x69\x23\xf5\x1f\x59\x31\x74\x90\x26\x86\x28\xe3\xfc\xe6\x85\x69\x7a\xd1\x28\x43\x0c\x43\xdc\x23\xf6\xc1\xac\x0f\xf0\xe4\xb4\x34\x0e\x10\x42\xad\xa7\x96\x98\xc4\x50\x90\x28\x88\xfb\x02\x59\xf7\x45\x8c\x6b\x14\x56\xed\xec\x23\x27\x98\x87\x33\xe6\x9c\x53\x47\x1a\x91\xb5\xfa\x68\xd2\xb0\xf6\x95\x72\x7d\xcd\xb2\x68\x84\xf2\x22\x85\x57\x1f\x33\x4c\x41\xc3\x14\x47\x88\xef\x97\xed\x9f\x9f\x71\x86\x0c\x97\x31\x2a\xd7\xd5\xe5\x29\x6f\x97\xda\x87\x33\x14\xa9\x09\x23\x16\x8b\x0e\x51\xe5\xb6\xda\x61\x1c\x63\x42\xc5\x30\x2a\xd5\x65\x21\x1a\xb4\x0d\xb0\xe8\x51\xb4\x62\x1e\x3e\x67\xcf\x9a\x34\xa1\x61\x28\xa3\x73\xb7\xf8\xc3\xf6\x9d\xf7\x5f\x1e\x17\xf7\xbb\xd5\xca\xf7\x9f\x4d\xa4\xac\x73\x57\x4f\xab\x5b\x2f\x37\x68\x5e\xe7\x47\xc4\xed\x6d\xc7\x57\x89\xd0\xe4\x2a\x9b\x94\x06\x4c\xac\x0c\x5a\xda\x88\x37\x91\xe5\xe8\xd1\x34\x14\xe9\x31\x49\xc8\xb1\xa5\x6f\x37\x53\x2c\x83\x6f\xaa\xe7\xb3\xd9\xd9\xcf\x65\x93\x06\x04\xd1\x6e\x2f\xd9\xf3\x0b\x2e\x96\xba\x07\x80\x99\x54\x4a\x6f\x52\xe6\xbc\x5b\x50\xb5\x66\x32\x51\x52\xc3\x3d\xf0\xfa\x11\xb7\x70\x95\x9f\x90\x52\x31\xc8\x0a\x8d\x08\xc2\x30\x1c\xee\x03\x63\xda\xb4\x11\x24\x8d\xb4\x97\x49\xab\x51\xc4\x0a\xb4\x35\x08\xf2\xd6\xbd\x83\x7e\x80\x11\xb4\x73\xac\x7e\x10\xd9\x85\x2d\xc5\x48\x1e\x26\x76\xd3\x45\xf1\xd9\x3b\xf1\x17\x7a\x4b\xfa\xc4\x6c\x32\x38\xe5\xd8\xb0\xcc\xea\x6d\x53\x0e\xa4\xd7\x8c\xe2\x0c\x49\x34\x6d\x02\xb1\x13\x3d\x57\xca\x1f\x8e\x15\x1a\x31\xec\x2a\x80\x81\x1c\x89\xd1\x44\xc5\xba\xf7\x12\x84\xea\xea\x03\xa1\x71\xa3\x0f\x6b\x29\xc3\xb0\x67\x66\x3f\x55\xf9\xb0\x46\x6c\xb4\x89\x10\x67\x01\x39\x28\xe7\xbc\x82\x6b\xb4\x2a\x87\x26\x06\xf3\x3f\x1e\x42\x11\x59\xa8\x76\xfb\xf6\x5f\x61\x31\x75\xc4\x4c\x30\x10\x4b\x21\x5d\xb6\x61\x8f\xb4\xfb\xd5\x25\xd1\xbf\x71\x45\xc4\x80\x60\x61\x17\xf5\x5a\x2b\x1e\x1b\x18\x4c\xae\x42\x13\x65\x79\x3a\xc6\xe4\x30\x40\xc4\xcf\x89\x85\x7c\x9a\x80\xfa\x6d\xd8\x00\x88\x74\x68\xbb\x76\x55\xf6\x11\xc0\xfc\x62\x6e\x4c\x24\xb1\xf0\xe6\xa0\x5b\xf5\x0d\x66\xa2\xf6\x3e\xd0\x20\x48\xa4\x11\x1d\xf2\xa0\x3c\x55\x6d\xdc\x8a\xd1\x9b\xa8\x3e\xe6\xbc\xeb\x68\x40\x84\x4a\x5d\x16\xb4\xdc\xdc\xfb\x13\xb5\xd9\x11\xb6\x0c\xec\xf5\xee\x4a\xa7\xe1\x37\xbc\x7e\x1a\x30\x12\x05\xc1\x80\xe6\x3b\x50\xde\x9f\x5b\x3e\xff\xe3\x3f\x96\x4a\x6b\x8d\x6b\xd7\xaa\xef\x28\x9a\x38\xb9\x2c\xa6\x24\xe2\x3b\x8d\x85\x99\xfd\x38\x57\x60\x1d\x2e\xc2\x23\x6d\x79\x1a\xf0\x38\xe2\x4e\xd6\xe2\x6b\x59\xbe\x5a\x4f\xdd\x72\xfa\xcb\xb9\xa4\xb8\x05\x1c\xc4\xcf\xef\x50\x65\xc3\xf5\x87\x06\x5c\x05\xd8\xfc\xfb\xfd\xdb\xb2\x7f\x15\x68\x10\x0a\xc9\x94\x03\x99\x3c\x62\x19\xa0\x3b\xa2\x15\xb6\x03\x9f\x6a\xad\xd0\x6e\xdd\xff\x1d\x14\xd7\x5d\xd1\x60\x7b\x2c\x8b\xba\x44\xaa\xc1\xa7\x0f\x9a\x06\xa1\x91\x88\x81\x69\x03\xbf\xde\x4b\xf6\xe4\x91\xce\x34\x88\x22\xc6\x23\x0f\x5c\xac\x9b\x1c\x6e\xcb\xb2\xe9\x5c\x86\xb3\xb2\xe8\x4d\x3b\xc7\x67\x8e\x52\xc0\xdf\xbd\x47\xb4\x49\xf5\xda\xb1\xbc\xdd\xf1\x38\xb6\xcc\x88\xfa\x24\xbf\x67\xd5\x39\x79\xdb\x0d\x4b\x99\xd6\xd1\x90\xaf\x8a\x2f\x44\x77\x10\x62\x97\xb7\x3f\xd5\x50\x3d\x82\x99\x13\xc5\xa4\x41\x9a\x1a\x2d\xbb\xbb\xd3\x6e\x03\xab\xe6\x65\xbe\x51\x42\x83\x54\x32\xe5\xf7\xd8\xaa\xd3\xa0\x1c\x3e\xf8\x14\x40\x5a\x41\xf7\x76\x1d\xf0\x45\xf1\xf2\xdc\xc2\x72\xfe\x27\xc9\x80\xe2\xa6\x53\x94\x3d\x6c\xcb\x1f\x62\xc2\xdb\x1e\xde\x58\x20\xcf\x72\x38\x5d\xa4\x8c\xf0\x93\x39\xe8\x67\xa8\x86\x4a\x1b\x34\x50\x29\x47\xc0\x4c\x57\x68\xba\x29\xab\xcd\xc8\xbc\xfd\x34\xcb\xa5\xa1\x81\x56\x40\x1c\x4f\x6f\x51\x3c\x43\xbe\x14\x95\xde\x42\x95\xb9\xf7\xac\x1b\xa6\x39\x26\x78\x26\xab\x6a\xb4\x63\x6d\x0a\x8b\xca\xe9\xb7\x25\x1a\x68\x03\xc8\x83\x5f\xdd\x2c\x1e\xef\x86\x53\x1a\x98\x4a\xdd\x3c\x6a\x1f\xd5\xa4\x58\x37\xfc\x1e\xe0\xda\x12\xef\x9c\x0a\xc3\xaf\x2b\x89\x34\x30\x46\x60\xeb\xa6\x7c\x2f\xa0\xda\x98\xe1\x9e\x41\x09\xe1\xd6\x2a\xd1\x5b\xac\x8e\x69\xbe\xe3\xa1\x29\xc3\xa4\xd2\x93\xfe\xc6\x20\x64\x4a\x68\x10\xf8\x46\xb4\xc5\x13\x7b\x38\xcd\x2d\xbc\x41\x7e\x53\x9e\xc6\xe9\x4d\xfb\x81\x10\x69\xf3\xc5\xe9\xf0\xcf\x52\xfa\xdb\x44\x28\x63\x36\x2c\xd1\xfa\xea\xf4\x31\xb5\x1a\x9b\x7c\x27\xe3\xb8\x5f\xda\x5d\xa7\x3f\x43\x2c\x06\xc9\x98\x15\x23\x98\xab\xc5\x53\x42\x63\x42\x6d\x33\xbe\xf0\x09\x8b\xe5\x7f\x66\x43\x07\xf0\x4f\xaa\x98\x94\x50\x1d\x60\x8b\x11\x6d\x3b\xae\xa0\xa9\xd7\x06\x21\xaa\xf7\x65\xb3\x3d\x21\x48\xfd\xb7\xb1\x85\xfe\x7c\x96\x40\x09\x6f\xdf\x7b\xdb\x55\x37\xd9\x4f\xd0\x1d\xda\xf9\x8c\x23\x36\xdb\x5c\x69\x4f\x20\x65\x3a\xa0\x1e\xdb\xce\xe8\xd5\xc7\xe0\xff\x59\x14\xda\x02\x37\xd7\xf3\x92\x36\x94\xf0\x30\xc2\x55\xf4\x50\xea\xcc\x64\x50\xad\x7e\xfa\xdb\xca\x1d\x5c\x07\xcd\x75\x7e\x0c\x7d\x4a\xeb\xc9\x93\xe5\x32\x42\xac\xd9\x41\x54\x55\xd6\xed\x8d\x84\x43\x88\x50\xaf\xbe\xa7\x73\x3a\xf3\x28\x9c\x06\x07\x94\x84\x32\x44\x28\xf5\x97\x32\xd7\x77\x59\x01\xb3\x34\xff\xd3\x14\xd9\x4d\x49\x14\x53\x94\x0d\x51\x65\x39\x5a\x0d\x48\x24\xad\x50\xd0\xbb\x53\x32\xb4\xcd\x8a\xee\xa8\x32\xb8\xed\x38\xeb\xb9\xad\xc8\xa1\xf6\xcb\xd8\x28\xce\xa4\x24\x26\x01\xa4\x03\xd7\x1b\x7b\xa2\x91\x72\x38\x25\x71\x18\x04\x4e\x3a\x0a\xf1\xbb\xae\x0e\xf8\x59\x73\x91\x92\x58\x71\xe6\x2d\x19\x2a\xa1\xf2\xce\x82\x6d\x7c\x9f\x13\x9a\x38\x1f\x9a\xc3\x21\x6b\x3a\x52\xd2\xe8\x36\xc8\x20\xe0\x97\x80\xd6\x93\x47\x2f\x49\x68\xa5\x72\x84\x2c\xab\xaf\xe5\xa9\x1a\x97\xfc\xce\xef\xf8\xe0\xa3\x54\x63\x80\xd8\x87\x7f\xbf\x7d\xb6\xce\x13\xc9\x43\xd4\xf6\xeb\x7a\x07\xed\xcb\xe3\xb5\x69\x27\x43\x75\x64\x82\xbe\xb1\x36\x11\x1c\xa5\x44\xc7\x14\x74\xc7\x2a\xd2\x1d\x2f\xe4\xb7\x41\x3e\x45\x89\x06\x45\xc9\xc0\x28\xe8\x5e\x1c\xe0\x8f\xf5\xf5\x19\x77\xcf\x67\x33\x94\x00\xb1\xc6\x8f\x68\x31\xdf\xeb\x77\x52\xd2\x86\xba\xd1\x20\x66\x5c\x62\xb0\x31\x5e\x83\xdd\x50\x13\x6a\x70\x58\x5b\x44\x2e\x7d\x2f\x9b\x0b\x64\x0f\x4a\x8c\x73\x22\x71\x2e\x7d\x37\x22\xcb\xfb\xa2\x2e\xa5\x01\xb5\x2b\xd5\x6a\xf7\xd4\xfd\x29\x96\x3a\xf1\x22\x49\x4b\x51\xd5\x6b\xfd\x73\x79\xd6\x03\xa6\x34\xd0\x1c\x3f\xba\x2f\xca\xf7\x6b\xd1\x0c\xc0\x50\xed\xb1\x10\xe3\xd5\xeb\xec\x80\x4e\x36\xb3\x55\x5e\x37\x96\x32\xc0\x3c\xf7\x2a\x3f\xc1\xa3\x4b\x00\x2c\x24\xe9\x72\x02\x4d\x29\xd3\x60\x0b\x0a\x03\x1d\x4f\x1b\xe9\x8d\xab\xf8\x94\x72\x1a\x23\xc6\x5c\x89\x62\x5b\x7a\x74\x0d\xa5\x3c\xb5\xee\x03\x15\x3c\x9f\xd0\x70\xe1\x15\x8a\x3b\xf1\x13\xdf\x4c\x3f\x26\x0c\x2c\x3e\x38\x2f\x55\x9b\x9f\x7c\x5c\xd2\x23\xf0\xc3\x13\x9b\xd4\x0b\xdd\x2e\x29\xcd\x99\x9c\x33\xa5\x51\xe0\x9c\x1c\x32\xa8\xf6\x4a\x1c\xf7\xc4\x7f\x55\x1c\x87\x48\xaf\xb0\xbb\xcb\x3d\xbc\x23\xf6\xfb\xf3\x58\x92\xc6\x71\x6a\xcd\xe7\xa5\xea\xce\x23\x41\x5b\xd9\xf8\x36\x22\x19\xc5\xbe\x34\x09\x23\xed\x75\xe2\x33\xf5\x5a\xdf\x94\xd5\xd0\x69\xd9\x8f\x82\x34\xd0\x23\x1c\xf0\xd5\xf6\xd1\x9f\x22\x55\x21\xf6\xc9\x0b\x78\xdf\x1f\x44\x56\x8c\xb7\x41\x3f\x08\x18\x3a\x4a\xd9\x66\x15\xb6\x13\xa6\x45\xc0\x09\x01\x96\xd2\xd4\x30\xdc\xef\xbe\x7d\x1f\xe2\xb9\x28\x15\x09\x47\x31\xbd\xa3\xf8\x38\x74\xce\x6b\x94\xca\x80\x60\x29\xf6\x5d\xe4\xaf\x38\xfe\xb6\x6c\x2e\x0a\xa7\x9e\x03\xe2\x07\x6f\x24\x95\x01\x27\x3e\x6c\xc6\xee\xfe\xf6\x74\x68\x97\xa9\xc9\xb2\x48\xa5\x20\x58\xe3\xee\x10\x76\xcb\x53\x55\x5d\x7f\x14\xe2\x90\xa9\x01\xb6\x82\x52\x09\x1a\x57\xa1\x76\xd5\xba\xbf\xd9\xd5\xf7\x65\xe3\x49\x7c\x7d\xee\x34\xa6\xf3\x52\xaa\x22\x0e\xc6\x2b\xea\x74\xd1\xfe\x04\xc5\x77\x9e\x73\x51\x2d\x42\x5c\x81\x1e\xcb\xf6\x79\x3f\x94\x65\xee\xb5\x33\xc6\xcf\x44\xeb\x10\x71\x15\x99\x12\xc7\xae\x88\x3a\xb2\x89\x1c\xab\x6f\x77\x1f\x8b\xb5\xdd\x8c\x8a\x36\xd7\x82\x6f\xf0\xe1\x7f\xa6\x21\xd6\xf5\x04\x10\x3a\xd4\x23\xf6\x29\x35\x31\x41\xcd\x26\x87\x49\x69\xda\x0f\x3e\xcf\xf6\xd8\x28\x35\x2a\xb1\x16\x72\xa2\x7e\x7d\xa8\xca\x76\x95\x05\x7d\x5f\x2e\xcb\x7a\xe8\xe1\x61\x07\xb3\x80\x06\x78\x35\x9d\x85\xca\x9d\xc8\x50\x72\x61\xba\xef\xf5\x8f\x97\x11\x08\x4c\xfa\xff\x04\xb3\x1e\xe5\xc2\x8c\x12\x82\x30\xe4\xfa\xa5\x7c\xbf\xcd\xde\xc0\x77\x32\xfd\x22\xc1\x28\xb7\xf5\xf4\xab\xc5\xfd\x72\xf3\xb8\xbf\x5f\xed\x7e\x6c\x1e\xbf\x75\x47\x8d\x96\x61\x9f\x30\xad\x7e\xce\x4b\x28\x52\xc6\x54\x80\xc4\x36\xa7\x5b\xf7\xdb\xf4\x28\xb1\xaf\x35\x12\xa5\xcf\xb3\x71\x3f\x4c\x87\x91\x43\xec\x3d\x15\x47\x91\xe9\x01\x1c\x7f\xa4\x0f\xe0\xc6\xf3\x08\xac\x19\x3f\xd4\x0d\x19\x66\x5c\x8c\x27\x81\xd3\x93\xcb\xf3\x6d\x79\xca\xe7\xbc\xad\x29\xe3\xca\x22\x63\xee\x16\x7f\xec\x1f\x57\xdf\x57\x8b\xdb\xfd\xf5\xd3\xe3\x62\xb7\xde\xdc\xef\xd7\xf7\xfb\xed\x6a\xb9\xb9\xbf\xde\xfa\x7b\x11\x31\x81\x44\x92\xae\x40\xae\x4f\xea\x6f\x4b\x43\xf8\x73\x24\x29\x74\x6e\x62\x8f\x56\x01\xe1\xa3\xfb\x82\xd4\x5a\x66\x75\xaf\xe8\xa2\xd0\xd7\x60\x9d\x30\xb1\x86\x39\x23\x34\xdb\x86\xf5\x84\xda\x9f\x0a\x7a\x24\x64\x4f\x59\x0c\xd6\xb4\xee\xe0\x4a\x2c\xd3\xf5\xff\xe2\x3e\xcf\x62\x88\x90\x66\xdb\xab\x14\x62\xd8\x0e\x53\x91\x3a\xca\xd2\x90\x06\x4e\x36\xf6\xf7\x53\x59\x9d\x0e\x3e\xd4\x1b\x3e\x28\x41\x04\x6e\xe3\xdb\xab\xe5\x6a\xf2\x79\x41\x01\x9f\xf9\x3f\xb3\xe2\x8b\x28\x9e\x07\x29\x20\x13\x2c\x42\x5a\xe1\xc3\xd5\x27\x1b\x70\xfb\x50\x6c\x00\x9d\x29\xa8\xca\xe1\xea\xcb\x44\x94\x0a\xe8\xb9\xba\x8f\xf0\x06\x85\x2b\xa0\xf9\x2b\x93\x0c\x6c\x7e\x61\xcd\x4f\x7c\x50\xbb\x83\xc3\x71\xa8\x30\x3e\xcd\x26\x2f\xc8\x5a\xfd\xea\xbf\xe3\x2b\x97\xa9\x2d\x26\x3f\x43\x73\x2d\x1a\x31\x4a\xdd\x99\x4c\x25\x5e\x3b\xa6\x4d\x36\x8c\x7b\x38\x97\xfd\x74\x83\x15\x44\xd8\x83\xd1\x95\x30\xcd\x3d\xbc\x2f\xfb\xd8\xbd\x7d\xa7\x22\xe7\xa1\xd2\x2e\x7f\xf3\xf3\x52\x4b\x9e\x5a\x6b\x6c\x53\x56\x87\x8d\x31\x98\x50\xb4\x31\x43\xbf\x76\x4f\xd6\x7c\xa6\xc1\xca\x06\x60\xb8\xba\x1b\x43\x4b\xae\x21\x87\x67\x31\x07\x7d\x1b\x2d\x53\xf3\xdc\x10\x77\x7e\x20\x32\xe1\xae\xa8\xb5\x2b\x71\x89\x2e\xf3\x33\xa9\x52\x3f\x98\x46\x08\x26\xf6\x66\x98\x5f\xda\x04\x59\x96\xe5\xab\xbf\x0d\x26\x48\x31\x63\x5a\xde\xde\x3f\x3a\xa0\xcc\xa7\x4d\x25\xca\x0c\x89\x2d\x66\xc3\xe2\x9a\x97\x2f\x53\x41\x4a\xca\x4c\xc2\x71\x99\xb9\x5a\x2c\x57\xfb\x0e\x61\x46\x99\x71\x0f\xaf\x5d\x98\x6e\xb1\xf6\xf2\x20\x3e\x64\x27\xec\x46\x99\x11\x01\x02\x57\x96\x2f\x59\xde\x93\x4b\x4e\x23\x01\xb0\xd1\x42\xce\x03\x66\xb9\x04\x6d\xec\x45\x87\x33\x85\x07\xa1\xa5\xc4\x3b\x04\xb3\x6d\x7b\xe0\xed\xb2\xdd\x82\x25\x14\xcd\x24\x1a\xe0\x81\xa3\x10\xe6\xa2\xd0\x07\x51\xbd\xa2\xf6\x86\x3b\x46\x38\xc1\x0a\x9e\xf5\xc8\xf9\x21\x6a\x97\xb1\x9b\x53\xde\x0f\xb1\x46\xec\x9b\x23\x14\xd7\x53\x19\x74\xca\x49\x62\x25\x41\x7d\x32\xf0\xad\x50\x53\x0e\x12\xe5\x8c\x5a\x31\x8e\xac\xf6\x6d\x03\xcc\x17\x5f\xce\x05\xfb\x28\x47\x15\x5c\x27\x08\xdc\xce\x50\x05\x8f\xf0\x96\xa1\x0e\x98\x5d\xf6\x69\xe0\x46\x72\x45\x91\x90\x75\xac\x20\x53\xe5\xd3\xf6\xda\x5f\x32\x37\x3c\xf5\xc2\xd2\xf6\xdc\xbb\xb2\xe3\xf9\x4e\xbe\x2e\x0c\x84\x72\x9b\x6e\xfb\x62\x2e\xcb\x3c\x17\xfb\xc5\x62\x1f\x90\x19\x90\x1f\xe5\x21\xb5\x21\xa7\x7d\x00\x37\x00\xcb\x4e\x6d\x77\x7c\xde\x88\x58\x18\xd4\x90\x9c\x75\x4e\x31\xa6\x3c\x12\xd2\x53\x9d\xce\xac\xbb\x26\xbc\x28\xca\x23\x08\x3b\x3b\xc9\xce\xf1\xd4\x5d\xe6\xe8\x86\xc7\x34\xc0\x02\xeb\x31\xfb\xdf\xff\xc4\x30\xe4\xe3\xb1\x31\x5e\x06\xcf\xc1\x53\xce\xf4\x32\x28\x4f\x02\x82\xa5\xef\x36\x3d\x28\x8b\x36\x5d\x5c\xeb\x3b\x71\x3c\x0e\xbd\xa7\x86\xd9\x25\x4f\x82\x48\x58\x34\x51\x73\xaa\x8a\x73\xe6\x00\xe5\x89\xe6\x3e\x13\x5c\x35\x2f\xf7\x33\xdb\x0b\x4f\x89\xc1\x00\xb1\x3e\xc9\x5d\x79\xaa\xb0\x0f\x92\x15\xcf\x83\x6c\x8d\xa7\x69\x8a\x52\x04\x2e\x82\xf9\xb2\xf0\xc6\xa1\x03\x00\x07\xe5\xa9\x54\x1e\xce\xbe\x6f\x03\xcc\x7d\x79\xec\x36\x0a\x9e\xea\x24\x0a\x3b\xe6\xf6\xad\x78\xff\x80\xca\x47\x48\x5c\x12\xca\x42\x0f\xfd\x20\x96\x14\x32\xb9\x4a\xc9\xec\x46\x63\xeb\xc5\xbb\x72\xc6\xb4\x91\x72\x19\xc6\xcc\x63\x41\x7f\xb4\xfb\x71\xfb\x23\xca\x53\x33\x4d\xde\xb9\x94\x44\xf7\x4d\xc6\xd5\xee\xeb\x39\x87\x85\x72\x45\xad\x80\x8e\x5f\x3c\x3a\xeb\xe0\x4f\xc1\xc6\x94\x2b\x11\x86\x56\xb1\xae\xd0\x62\x2a\x54\xf7\x37\xf7\xaf\xb3\x53\x46\xc4\x16\x95\x4e\xc7\x5f\x40\x82\x29\xd7\x3a\xb4\xc6\xcc\x28\x40\x01\x79\xde\x53\xcc\xe6\xbe\xd5\x83\x52\x28\xd7\xa0\x95\x4b\xff\x56\xc7\xac\x2e\x35\xd8\x77\xf3\x70\x18\xb8\x20\xcc\x87\x5d\x1c\x22\xe6\x25\x04\x9d\xd1\xff\xa3\x2d\x28\x4c\xdf\x3c\x13\x49\x64\x18\x2d\x37\xf7\xbb\xd5\x76\xb7\x5f\xdf\xef\x56\x8f\xdf\x17\xb7\xfe\xd1\x18\x87\x49\x6f\x57\xb5\x87\xb2\xaa\xd5\x8b\x9f\x86\x61\x40\x2c\xf3\x52\x3c\xbb\xf9\x39\x59\x73\xc3\x20\xe2\xb8\x4c\xac\xef\xd7\xbb\x11\x6d\x9a\x86\x41\xcc\xfd\x6f\x5b\xe4\xf9\x43\x5e\x7a\xd4\x27\x0d\x83\x54\x11\xef\xbf\xb7\x97\x1f\x7b\x1f\xcb\xf9\xc3\x32\xc0\x18\xe2\x98\xa9\xf2\x58\xef\x4f\x75\x7f\x88\xc4\x56\x60\xb5\x8d\x81\x1f\x87\xb1\xcc\xec\x3d\x0a\xdb\x05\x22\xec\xaa\x55\x9f\xf2\x97\x68\x48\x21\xc1\x16\xc0\xfa\xcb\x20\x60\x0b\x59\x98\x20\xae\x50\x9d\xea\xa6\xd4\xd6\xeb\xa1\xbf\x1e\x16\x05\x58\x97\x7e\x2c\xcb\xc3\xdd\xf8\x57\xb0\x84\xaa\xc0\x2b\x6f\x0c\xb1\xb6\x34\xe4\x24\xb5\xe1\xed\xeb\x47\x21\xd4\xe0\xcb\x78\xca\x22\x67\x4e\x29\x50\xf9\x6f\x29\x8e\xeb\x62\xd5\x75\xa2\x42\xae\x28\xe2\x0b\xdc\x6a\x5b\x36\x22\x7f\xf4\x63\x27\x8f\x26\x0c\x24\xea\x09\xa0\xd0\xa3\xbb\x82\xc9\x90\x28\x0e\x11\x1f\xe2\xee\x09\x5a\xd6\x5a\xcf\x32\xff\x7d\x91\x8a\x89\x1e\xe8\x13\xdf\xa0\x0a\xd0\xc7\xcc\x02\xdf\x2e\x04\x81\xea\xb4\x76\x94\xc8\xf3\x67\x7f\x96\x38\x64\x9a\x79\x06\xfd\x17\x9b\xb7\x66\x65\xe1\x85\x1e\xba\x61\xa9\x41\x6c\xd5\x02\x2b\xa1\xfe\xaf\x09\xd7\x38\x1b\x7c\xe7\x62\xdc\x18\x0d\x93\x24\x40\xd3\x93\x5a\xbc\xc1\xb8\x6c\x1b\x26\x2a\x41\x56\xcc\x00\x9b\x3b\xbc\xd9\x89\x0e\x51\x42\x3a\xab\xd7\xaa\x7c\x3c\x15\x45\xd7\xbe\xa7\xa1\x10\x14\x4b\xc7\x9e\x97\xfd\x23\x6b\x5e\x06\x8f\x41\x28\x6a\x6d\x16\xeb\xf5\x72\xb3\xe9\x17\xdd\x50\x68\x02\x71\xaf\x4d\xbf\xc8\xf3\x9b\x76\x67\xbf\xb4\xd1\x85\x32\x61\x5e\x58\x77\x59\x4a\xb8\xa9\x32\x98\xd8\x9f\xd0\x50\x49\xad\x7b\x10\x13\x1a\x1b\x4d\x06\xe8\x24\xd0\x03\x64\xea\x1e\xd7\x21\x7f\x49\x9a\x01\x52\xbc\xf4\x75\xf9\x5e\xd8\xca\x6a\x79\x25\xea\x4c\x4d\x6e\xa4\x69\x1f\xe1\xd4\x39\xcd\x9a\x48\x94\xd5\xc7\x58\x66\xe5\xf2\x4b\x64\x62\x8a\x8a\x23\x6f\xf0\xbf\xc6\xb6\x23\x6d\x19\x76\xda\x75\x8e\x82\xd0\xaa\x8c\x3a\x85\xc3\x9d\x23\x9b\x9f\x21\xdf\xfd\xf0\x94\x11\x97\xb4\xbb\xc2\xfa\x6c\x8f\x3d\x0a\x20\xc6\x12\xe8\x73\xf6\xe6\xca\xf4\xbf\x4d\x4e\x64\xac\xd4\x3e\xea\xad\xdf\x94\xd5\xea\x54\x95\x93\x21\x54\x4a\xec\x7f\x34\x59\x63\x9b\x5b\xb6\x29\xfc\x9b\x3f\xac\xe3\x2e\xb2\x18\x57\xeb\x27\xd7\xcc\xa4\x55\xe2\x85\xe6\xc5\xc3\x51\xee\x44\x37\xff\x22\x06\x2c\x76\xd6\x47\xcd\x05\x99\xf5\x8b\x30\x71\x1a\x71\x41\xa2\xd4\xa1\xaa\xbc\xc5\xdd\xa7\xbb\x54\xc4\xc1\x6a\x54\xbd\x89\xfc\x04\x0f\x50\xdd\x65\xaa\x2a\xfb\xea\x51\x14\x46\xd2\x1a\x49\xfb\x54\x7d\xe4\x5c\x77\xf6\xa8\xa3\x30\x4d\x23\x1f\xe9\xb4\x09\xdd\x00\xa7\xe1\x27\x55\x14\x71\x92\x5a\x00\x73\xa6\x9c\xf3\xd7\x85\x9b\x15\x07\x1a\xa7\xa9\x93\x6c\x1e\x59\x07\xfb\x21\x82\xe1\x05\x1a\xab\xef\xf0\x1d\xb0\x20\x35\xa6\xb1\xd3\x28\x96\x34\x25\xbd\x9f\xcb\xc8\x56\x89\x46\xb1\x16\x48\x73\xe8\x64\x5e\xbe\x38\xe9\xb2\xf1\x57\x25\x81\x45\x7a\xdd\x94\x55\x63\xe3\xea\x3e\x05\x8f\x12\x2a\x31\x33\x45\xc2\xf1\xa6\x98\x7e\x14\xa8\xf6\x60\x81\xdb\xcd\xd3\xf5\x4d\x59\x7d\x11\xd3\x9f\x92\x26\x89\x23\x9a\x23\x88\x7d\xac\x98\x48\xa3\x34\xe5\x08\xf9\x6a\x73\xad\x1b\x91\xe5\xdb\xd2\x34\x03\x4f\x3c\x1a\xa5\x2a\xf0\x66\x30\x8b\x4e\x64\xec\xf2\xa3\x4a\x81\x63\xd7\x66\xe8\x01\x3a\x51\xea\xa1\x91\xa0\xd6\xd0\x46\xb5\x67\xb3\xc0\x57\xd0\x3d\xcb\x9e\xa2\xd2\x68\x38\xd0\xb2\xdd\x0e\x96\x99\x48\xa4\x02\xbb\x37\x3d\xa5\x73\xa0\xc4\xb1\x28\x34\x82\xa7\xfc\x58\x11\x88\xc4\x65\xc1\xab\xe6\x65\x57\x4e\x5e\x62\xc9\x18\x0a\x77\x1d\x73\xf1\xb1\x3d\x82\xca\x4c\xa6\xae\xcb\x93\xcc\x2f\x80\xf3\x69\x24\x85\x40\x8d\x96\x63\x55\x96\xa6\x87\x87\xd2\x48\x6a\x82\xbb\x47\x56\xb7\x93\x01\xcb\x8b\xd9\x34\x20\x8f\x14\x49\xa3\xc1\xa4\x68\xaf\xf6\x02\xa8\x75\x98\xcc\x47\x9a\x12\x64\x6d\x3a\x85\x48\xbb\xaf\x95\x93\xee\x77\xa4\x8d\xc6\xe0\x54\xa2\xaf\xfc\x9f\xe5\x69\x77\x92\x60\x9d\x4d\xfd\x45\x9a\x40\x61\x0e\xe5\xf0\x04\x75\x8f\xcd\xa7\x91\x49\x79\x0a\xc3\xb7\xf2\x47\x99\xbf\xee\xca\xce\xd8\xb7\xfb\xa2\x38\x08\x78\xe0\x0a\x26\xef\x5f\xa1\x2a\x6f\xcb\xa6\x81\xea\x63\xa6\x02\x1b\x07\x89\x42\xe5\x50\x91\x43\x53\x4e\xc0\x69\x34\x26\x81\x8a\x86\x3b\xae\x25\x1e\x74\x7c\x07\x1a\x93\x28\x08\x79\x87\xfe\xaf\xba\x3f\x4b\x6b\x24\x8b\xd8\xb1\x07\x91\xe9\x5d\x69\x01\x1c\xf3\x4d\xfd\x98\x48\xcb\x4c\xaf\xa1\xf9\x9a\x3d\xbf\xa0\xcc\xc2\xe4\x37\x51\x22\x91\x74\xaf\x5d\x89\x77\x68\x47\xf0\x8f\xc9\x50\x60\x58\x15\x3e\x88\xe2\x63\x6f\x57\x11\x95\x75\x8d\xa3\x98\x11\xeb\xff\x7e\xbd\x1c\x7a\x00\xb6\x7f\x17\x28\xcc\x6b\x23\xaa\xda\x89\x78\xf9\x83\x8c\x62\x7b\xe6\x4e\xfc\xc4\xaa\x06\x22\x1c\xc6\x93\x35\x66\x91\x6d\x76\xdb\x9b\xd1\x59\xd4\x31\x3a\xbc\xe1\x3c\x4d\x91\x75\x74\xc8\x8a\xab\x8e\xfe\x44\x63\xae\x48\xd4\xe9\x13\xd6\x7d\x8f\x41\x3b\x44\x4d\xfb\xff\x94\x5d\xd6\x16\x87\x5a\x63\x6d\x18\xfd\xcd\x00\x7e\x7f\xf8\x73\x72\xbb\xa2\x40\x30\xc0\xc0\xfa\x0d\x7a\x32\x00\x8d\x23\x16\x22\x26\xf3\x54\x64\xff\x6d\xd7\xfe\x91\xb8\x1b\x8d\xa3\x38\x44\xd4\x6e\xe7\x32\x32\x67\x59\xf1\x7f\xfc\xd7\xdf\xaa\x21\xc7\x31\x81\xc0\x21\xfe\x97\x50\x35\xed\x0b\x2f\x1a\xb8\x83\x06\x65\xf0\x2e\x31\x57\xa7\x27\xa1\x11\xe2\xd6\x31\x0d\x7e\xa8\xbc\xf4\xea\x39\xee\x60\xf2\x31\x46\x94\xe3\x88\xba\x5a\xf3\xd5\xc7\x52\x14\x3a\xd3\x1d\x59\x94\xc6\x89\xe2\x68\xaa\xdf\x88\xea\x19\x1a\x9b\x0b\x77\xab\x89\x1b\x93\x06\xc4\xe2\x5c\xe0\x67\x83\x0e\xb6\xb9\x25\x1a\xb8\xc3\x82\x10\xe9\x50\x5c\x57\x95\x28\xd4\xcb\xe4\xe1\x09\x2e\xe2\xa1\x0c\x64\x1b\x73\xb6\xd3\x11\xc5\xad\x3e\x6f\x3b\xc6\x22\x0d\xac\x62\x80\x2a\x07\xe1\x68\x2c\x84\x88\xbd\x9d\x15\x14\x30\x1b\x32\xc5\x42\x71\x33\x70\x0f\xf5\xfb\xa9\x0b\x59\xda\x09\x6d\x5f\x8a\x99\x6a\x47\x2c\x95\x40\x86\x0a\x1c\xa0\x7a\x86\x42\x7d\xa0\x0c\xef\xae\x7c\x7e\xee\xb6\x8d\x58\x71\x82\x20\xfc\x6e\x39\x99\xeb\x86\xc5\x2a\x0a\xb0\x27\x7c\xb5\xfe\xf6\xfb\x69\xb0\x6c\xb9\xc3\x5a\x10\xcb\x5e\xc8\xf3\xf2\x7d\xc4\x70\x9a\xcd\xdf\x63\x2d\x13\x7c\x5e\x59\x91\x35\x93\x2f\xfc\x9b\x53\xb2\x3d\x83\x71\x7d\x55\xb0\x1a\x68\xe3\x4a\xb9\x1b\x07\x9c\x61\xbb\xac\xc2\x76\xdf\x42\x3b\x89\xf7\xcf\x4f\x0e\x51\x8a\x75\xe6\x7d\x3b\x19\xb0\x81\x34\x0a\x78\xfe\xe6\x25\x82\x26\x58\x7d\x29\xe0\xdd\x6a\x92\xcf\x23\x0e\x62\x43\xac\x74\x09\xf6\x84\x16\xf7\xd7\x9b\xbb\xfd\xf5\xea\x76\xf1\xa7\x7f\x42\x86\xdb\x0a\x01\xfc\x7c\x11\xa7\xda\xaa\xa9\x5d\x8d\xda\x5a\xe3\x2f\x4e\x02\x99\x20\x97\xb0\x3e\x56\x20\x34\x3a\x6b\xce\x2e\xca\x49\xa0\x6d\x15\x6e\xfb\x2e\x8e\x6d\xee\xf5\x3f\xf7\x95\x09\x89\x6c\xb7\xd8\x2b\x66\xb7\xf7\x0c\x5b\x43\x75\x53\x95\x1f\xdd\xa8\x98\x24\xbc\x13\x47\xf1\xd4\xc1\xfa\xa6\xac\xbe\x43\xa1\xa7\xb5\xc8\x84\x24\x31\xc6\x15\xed\xbd\x3c\x3c\xa0\x66\xc9\x85\xeb\x22\x42\xf8\x0e\x4f\x57\x8d\x1c\xd2\xcd\xba\x95\x3b\x21\x4a\x47\x61\xb7\x3f\x5c\xc4\x39\x4f\x4e\x0f\xd4\xc2\xd5\xda\x5c\xca\x5a\x36\x5c\x14\xf7\xf9\x9b\xb3\x72\xbe\xad\xf0\x8f\x71\xbf\xf8\xff\x8b\x73\x4f\x09\x18\x34\xa1\x5c\x0d\x9a\xc9\x88\x24\x9c\xed\x24\x27\x34\x25\xd8\xab\x3b\x56\xd0\x41\xc1\x1c\x66\x7c\x08\xd4\x4a\x58\xc0\xd0\x57\x04\x0d\xd7\x7f\x00\xbc\x3e\x15\x48\x0d\xeb\x96\xd6\x84\x69\x81\x21\x49\x1b\x45\x36\x16\xcb\x85\xd8\x77\xd2\x0d\x80\x08\x55\x1a\x84\xfa\xef\x29\xab\x11\xd4\x57\x0f\x5d\xd9\x69\xc2\x69\x12\xd0\x41\xa1\x1a\x2a\x94\x73\x98\x5c\x32\x67\xd4\xa9\xb6\xe1\xf9\xf5\x40\xf1\x92\x26\x9c\x6b\x2c\xa9\xec\x1d\x80\xf3\xb1\x9c\xac\x2a\xc9\x70\xe6\xf0\x48\x48\x6b\x10\xd9\x74\x5a\x6d\x17\x67\xc1\x79\xbf\x32\xe1\x89\x95\xb3\xb7\xe1\xe5\xaf\x96\x06\xff\x21\x25\x03\x35\xa0\x79\x3f\x54\xe0\x74\xde\xdd\x80\x28\x0d\xb8\xdb\x12\xf6\xba\x9c\x45\xec\x0e\x97\xb7\x24\x4a\x6d\x2c\xfe\x78\xaa\x87\x1a\x2e\x34\x89\x63\x82\xfd\xcf\xbf\x44\xf1\x50\x36\xfb\xee\xcf\x89\xb4\xd6\xc6\x16\x4d\xfe\x09\x0c\x2d\x89\x55\x12\xbb\xe2\xc7\xbd\x78\xbb\x1d\x6e\x96\x49\x12\x02\x2e\x59\x18\xa7\x54\x1f\xbd\x24\xe4\xb4\x6c\x3b\x3e\x65\xa2\xa0\x37\x1c\x7f\x2c\xf3\xbc\xbe\xfa\x38\x07\xd4\x24\x69\x20\xd1\x7e\x64\x7b\xc8\x9a\x97\xd1\xaf\x4a\x99\xe5\xca\xbc\x88\xda\xcd\x69\xeb\x97\xed\x0f\x27\x29\xc2\xf0\x71\x1b\xf2\x82\x90\xa3\x27\xeb\x07\xa6\x4c\x7b\x90\xec\xe9\x63\x59\x3a\x8d\xc4\xa7\x22\x9b\xf6\xad\x12\x11\x04\x28\xa4\xac\x51\x58\x03\x6b\x8f\xe3\x01\x32\x88\xb0\xab\xb4\x5a\xd4\x75\xff\xd2\x48\xae\x34\xed\xb4\x99\xf0\x5a\xbe\x8a\x4a\x77\x56\x17\x34\x91\x51\x82\xea\xe6\x7b\x79\xfa\x78\x38\x35\xbb\x12\xc1\x77\xbf\xdc\x63\xc6\x3f\x44\xc6\x29\x85\x11\x71\xc2\xb2\x0f\xa6\x10\x8d\xe9\x44\x1e\x9f\x45\x85\x46\x3a\xa9\xda\x45\x55\xad\x8b\xe6\x26\x83\x5c\x33\x7f\xa5\x2a\xa1\xa2\x87\x21\xd8\x9f\x39\x5b\x02\x99\x3f\xbb\x0e\x52\x6d\x0b\x60\x96\x84\xde\x3b\x64\xd3\x44\xd3\x00\x41\x65\xfb\x53\x71\x14\xea\xf5\x01\x9a\x73\xc6\x09\x4d\x34\x27\x08\x64\x7d\xb3\xf8\x93\xf9\x37\xc2\xbf\xe2\x33\xf2\x29\x34\xd1\x09\xc1\xde\x85\xbf\x4f\x03\xb3\xa2\xf9\xa9\x0a\x51\x98\x52\x57\xca\xf6\x6a\x16\xeb\xe2\x5a\x7c\x4c\xc1\xf8\x09\x44\x92\xb8\xc0\xf1\xa9\xab\x15\xb9\x8e\x54\x62\x02\xab\x54\xb5\x74\xc8\x1e\x51\x35\x57\x1d\xff\x64\xfc\x8d\x86\x44\x4e\x2f\x18\x4d\x1d\x4e\x45\x6f\xea\xde\x6e\xa9\x84\xde\x95\x45\xf3\x32\x9d\x9e\x46\x09\xa2\xdd\x0f\xbb\xae\xc4\x7b\x3e\xcc\x90\x12\xa3\xc3\xd0\x1a\xd5\xb8\x12\xf7\xa7\x35\xa8\x34\x88\xac\x82\x60\x56\x23\xf6\x5a\x65\x47\x31\x51\x2a\xa4\x29\x91\x04\x35\x21\x9a\x4a\x68\xb8\x06\x91\xf7\x7a\xdb\x6e\x04\x0d\x15\x93\x4e\xfe\x34\xff\x18\xf2\x93\x68\xca\x94\x42\x76\xe0\x6e\xf3\xf4\x6b\xec\x70\xca\x40\xd2\x2e\x65\xdd\x2a\x71\x38\x20\x81\x4c\x64\x93\x72\x65\xca\x0c\x27\xe0\x4a\x16\xeb\xe2\x2d\x6b\x06\xa8\xa3\x5f\xbc\x50\xbe\x0a\x93\xf2\x40\x9a\x74\x10\xe0\xcf\x4c\x91\xf9\xbb\xc6\x23\x8a\x61\xd0\xfe\x98\x0b\x85\xeb\x39\x7e\x6a\x33\xd4\x84\x9e\xe4\x38\xfe\x93\x10\x10\xea\x2e\xdb\x02\x8c\x31\x9f\x72\x47\xc3\x28\x44\x6e\x72\x3b\x6b\x7e\x0e\x9a\x1e\x69\xa8\x03\x84\x25\xe7\xe5\x87\xc8\x9b\x8f\xde\x3b\x8d\xa6\x51\x42\xbc\x95\x6e\xbb\xb0\x7a\x6a\xc8\xfc\x85\xc7\x69\x60\x3d\x14\x41\x1c\x76\xef\xe5\x75\xf6\x56\x4f\xb7\xf6\x34\x16\x06\xdf\xfd\x55\x9e\x1d\xb2\xe2\x62\x7e\x9f\xc6\xca\xba\xbb\x2a\xd7\x1d\xf3\x7f\xd6\x31\x2a\xab\x5d\x67\x0a\xc6\x1d\x98\x34\x25\x04\x29\x2a\x8d\x78\x85\x6d\x21\x8e\xf5\x4b\x39\x9d\x6b\x29\x84\x21\xed\x6a\x5e\xb7\x99\x85\xb8\x8d\xde\xec\x34\x35\x14\x69\x5b\xed\x32\xea\x4f\x2d\x98\xc2\xf4\x62\x75\xf7\xc5\xbf\xf0\xe3\xd7\x26\x15\xb1\x35\x57\x6e\x37\xe2\xac\x99\xc8\x8b\xd3\x54\x08\xcb\x4c\x3e\x58\xeb\xab\xce\x58\xe0\x26\x33\xdd\x26\x98\x0a\x15\x92\xde\x7e\xc9\x3a\xa7\xcc\xb5\x61\x53\x29\x12\xe4\x1d\x77\x52\x46\x55\x79\x78\x7c\xef\xf0\x32\xa9\xe2\x11\xba\x22\x61\x63\xe0\x09\xf1\xd5\x7d\xb3\x23\x55\x21\x15\xf1\x20\x9e\x2b\x6b\xdf\x8d\x1e\x5f\xb3\xa6\x01\x62\x5b\xdb\xfb\xf9\x74\xfc\x51\x56\x1e\xfa\x91\x6a\x88\x87\xe0\x82\x3d\x25\xa3\x8a\x52\x0a\x11\x8d\x60\x00\xa0\x1f\x72\xa7\x26\x77\x1b\xd2\x00\x45\xab\xd4\xa9\x6a\x77\xde\xee\xbd\x06\x65\x51\xda\xcf\x5e\x68\x7d\x46\xe5\x94\xa6\x86\x10\x2c\x01\xf8\x87\x62\xf5\xbd\x86\x90\xdb\xd4\x24\x5a\xf7\xa4\x91\x2b\xb8\xec\xa8\x35\x01\x07\x89\x80\x47\xd4\x3d\x33\x1f\x8f\xdc\x9f\x7c\x51\x53\x04\x89\x6d\xd3\x20\x4d\xb7\x6e\xca\x03\x6e\x71\x53\xbe\xa5\x1f\x6c\x2c\x8c\xde\xd5\x7f\xad\x29\xe6\x30\x26\x16\x84\x24\x56\x2e\x57\x14\x8f\x28\xb5\xe9\xca\xdd\xf3\x88\x31\x41\x03\x6d\xd5\xbb\xee\x37\xf7\xeb\xbb\x3f\xfc\x59\xa8\xe4\x98\x9c\xa2\xa3\xfc\xee\x75\x5e\x3d\x8f\x0a\x96\x40\xdc\xb7\x98\x36\x47\x28\xbe\x8b\xbc\x4d\x7a\x0b\xf0\xbc\x9c\xcb\xad\x08\xc1\xd2\x08\xfb\x76\xdf\xcb\x1c\xa1\x1f\x93\xb5\x53\x70\x1a\x07\xfd\xe6\xda\x19\x00\xf9\x6b\xe4\x89\xb5\xe0\xaf\xc1\x7a\x24\x4c\x05\xd6\xfc\x30\xa5\xa8\x65\xbd\x0a\x8d\xdd\x0e\xff\x53\x46\xbf\x24\x34\x0c\xe5\x2c\xaf\x44\x3d\x94\x57\xa3\x22\x4a\x59\x1a\x7a\x97\x82\x46\xe4\x8b\xac\xba\xae\xca\xe3\x78\x8a\x8b\x38\x88\x43\xab\x48\xd9\xbc\x88\xf7\x9d\x6f\x66\x8b\x38\x50\xdc\xc6\x68\xc7\xbc\xfc\x80\x6a\x40\x13\x10\x31\x33\x58\x3d\x6b\x2c\x3a\x2b\xef\x59\xff\x54\xc4\x09\xd1\x7d\xbf\xb6\xbd\xa8\x99\xe8\x43\xc4\x09\x67\xaa\x53\xd4\xb2\x40\xae\x81\x01\x28\x15\x71\x4a\x78\xe2\xe9\x78\x1f\xc7\xa6\xfc\x0e\x55\x7d\xaa\x47\x84\x16\x11\xa7\x4c\x0f\x52\x97\xbd\x8f\xae\x44\x42\x08\x4e\x25\xec\xfa\xdd\x65\x39\xd4\x4d\x59\xc0\x79\x46\x3a\xb8\xee\x84\x53\xee\xc5\x46\x3b\xbc\xea\xf2\xc7\xe4\xba\x53\xa6\x99\x13\x4b\x5a\xe4\x0d\x6e\x20\x17\x88\x4b\x9f\x81\xe2\x84\x10\x81\x6d\xbc\x17\x6f\x50\x74\x0a\x07\x54\x48\x99\x60\xf1\xa0\x7c\x83\xaa\xca\x34\x0c\x34\x61\xa9\x50\x92\x63\x9b\x45\xf5\x75\xd2\x73\xd4\x93\xd0\x31\x4d\x9c\x32\x8f\x31\x7b\xea\x3f\x0c\x81\x35\x02\x54\xa2\xb0\x4d\xa9\x9b\xaa\x44\x99\x27\x5d\xbe\x2f\xf4\x5f\x27\x0b\x0f\xb5\x16\xdc\xfe\x23\x22\x40\xc5\x1b\xf8\x79\xc4\x4e\x0c\xe8\xdf\x9c\x7a\xe1\xe8\x96\x98\x20\xc2\x3a\x15\xb6\x2e\x3e\xea\x06\x0e\x03\x20\xc8\xc4\x0e\xd3\x7f\x24\x56\x58\x7d\x69\x5e\xaa\xf2\xbd\xfe\xf1\x02\xc5\x17\xab\x52\xdc\xd3\xab\x57\x56\x03\xab\xab\xa9\x09\x23\x54\xa4\xfb\xf5\xe3\x4f\xd2\x1d\x50\x0c\x4b\x42\x8f\x9b\xdb\xd5\xfe\x0e\xa1\x1e\xee\x90\x0c\x18\xa1\x1e\x07\xf2\xb8\xbe\x7a\x42\x48\xf0\x76\xb7\x78\xdc\x75\x23\x54\x68\xbb\x28\xe5\xfb\x6f\x33\x2f\x97\x0c\x74\x6c\x17\xc0\x32\x9f\x67\xcf\x53\x19\x18\xc0\x09\xef\xc4\x02\xad\x29\x85\xdf\x36\x25\x89\x2c\x61\x7f\x79\xff\xe7\xdf\xf3\xed\xa0\x92\xa4\x49\xdc\xa7\xed\x87\xac\x50\x62\xf2\xd2\x4a\x22\x03\x84\xbd\x3f\x0a\xf5\x02\xf9\x30\x9d\x93\x44\xba\xb2\x2d\xb6\x97\x45\x9e\x4b\xa1\x50\xe0\xec\xb3\xc6\x8e\xa4\xa1\xc0\xe5\xd0\xad\xc8\xa3\xa5\x5b\x32\x4a\x13\x97\x61\xaf\x2b\xf0\x9b\xa8\x64\xa9\xb4\xe2\x02\xe8\x30\xf6\x20\x9a\x51\x3d\xee\xd3\xa4\x5d\xf2\x88\xa5\x41\xf7\x1b\xaf\xe1\x6d\xb6\x9c\x22\xb9\x8c\xbc\x3f\xf6\x5e\x42\xd3\x94\xd5\xbe\x93\xbd\x6d\x8f\x4a\xe4\xd6\x57\x5d\xbd\x42\x72\xad\x51\x16\xe6\xf8\x82\xeb\xc1\x7e\x80\x30\x93\x51\xc4\x89\x35\xbb\xc1\x9c\xf1\x6b\xf6\xfc\xd2\x1d\x02\xe9\xc5\xb8\x1e\x10\x2f\x39\xd3\x8c\x95\xb1\xd4\x34\xee\x0c\xb6\x70\x51\xdf\x4f\xae\x37\x96\x06\x2b\x04\x3e\x45\xee\xfd\x1e\xa8\x8c\x75\xe8\x29\x8c\x0e\xdd\xf9\x45\xd4\xf9\xa0\xc5\x29\x93\x88\x61\x1a\xb0\x90\x42\x3e\xf4\x39\x6e\x77\x38\x8e\x31\x80\xf2\xb6\xdd\x1b\xd3\x45\x96\x77\x59\xfe\x3a\xb9\x94\x94\x05\xfe\xa1\x3d\x42\x7d\x04\x54\x45\xb0\x4b\xf1\x64\x60\xd4\xc9\x78\x5f\x1d\xcf\x63\x20\x99\x1a\xc0\x05\xe5\x0f\x28\xba\xce\xa9\x14\xdc\x12\xc5\xbe\x54\x99\x76\x42\xd8\x33\x30\xf4\xf9\x4a\xb5\x14\x71\xec\x25\x8c\xbe\x43\xd3\x5b\xfe\xf7\xab\xb1\x94\x0c\x22\xe1\x1d\xef\xde\xa0\x5a\x1f\x06\xda\x24\xa3\x99\x2b\x4d\x84\x0e\xee\x2b\x7f\x69\x8a\xd1\xb0\x8b\x4a\xba\xc6\x93\x54\x4a\x5a\x88\x95\x38\xd5\xf0\x08\x1a\x0e\xc7\x41\x2b\x58\x2a\x13\x20\x6a\x7f\xbd\xdc\xec\x1f\xbe\x2e\xb6\x2b\x3a\x02\x1e\x4a\xcd\x12\x2c\xb3\xb4\x5b\x95\x57\x06\x9e\xdc\x28\xcd\x8c\xd5\x76\x16\x59\x61\xeb\x7e\x8d\xc8\xad\x02\x8d\xb5\xe5\x6c\xd7\x10\x3f\xd6\xd8\xde\x9c\x4d\x2d\x11\x9a\xda\x40\x25\x26\x9d\x36\x09\xa1\x55\x09\x6f\xa3\x4c\xc4\x62\xeb\xf2\x1a\x56\xb5\x3a\x41\x3e\x25\x8e\xcc\x2f\x4e\x10\xc5\xd8\xb8\xff\x93\xec\xf3\xbe\xa5\x31\x0a\x0f\x25\xa8\x10\x01\x24\xe8\x81\x6f\x17\xb1\x36\xff\xcc\xb3\x73\xc5\xd7\x4b\x10\xc2\xe9\xb7\xaa\x10\x7b\x24\xe7\x62\xc7\xf3\xe5\x0c\x69\xa8\x44\x1b\x02\x67\x8e\x6b\x2d\x8a\x97\x03\x56\xdd\xf8\x56\xab\x20\x08\xd3\xa0\x03\xa4\x38\x5d\xbc\x0e\x37\xeb\x9f\xb9\x0a\x02\xc1\x86\x49\x02\x5a\x36\xf4\x07\x0d\x86\x20\x99\x53\x19\xaa\x47\x59\xb5\x22\x29\xc3\x1c\xe8\x28\xd4\x2b\x1a\xd5\x8d\x1f\x8d\xa2\x52\xc9\xbe\x24\xfc\x08\x2a\x3b\x66\x53\xf7\x1e\xaa\x18\xb1\xbc\x88\x7f\x6d\xd6\xf7\xc3\x97\x59\xf1\x80\x71\xee\x5f\x4f\x03\x55\xd5\x26\xfd\x7a\xfa\x25\x5c\x58\x05\xf4\x3b\x6c\xa2\x8e\xd1\x24\x6e\x48\xc8\x62\xb0\xe5\xbb\xc6\x19\xa9\x0f\xd6\x3c\x15\x3a\x88\xb7\xe7\x9e\x26\xfe\xef\x71\x84\xb2\xa5\xa7\xa2\x9d\x16\x6e\xf1\xb5\x9e\x32\xbb\xcd\x7c\xc0\xad\x22\x19\xa5\xb1\xd7\x30\xfb\x22\x0a\x31\xbe\x61\x91\x34\x5e\x7e\xcd\xee\x22\xf5\x20\xf1\x56\x71\x20\x8c\x33\x9d\xd9\x3f\xdd\xef\x6f\x37\xcb\x6f\xfb\xdd\xfa\xce\x6b\xfe\x50\x15\x27\xb1\x03\xdf\x5a\xf8\xd4\xbe\x02\x75\xaa\x54\xf6\x06\x53\xae\x8c\x4a\x38\xc1\x12\x86\x3c\x7d\xbc\xc2\xd9\xc1\xd8\xca\x2c\xfc\x55\x66\xc5\x43\x55\xbe\x65\x7a\x5a\x15\x52\x49\x22\x30\x62\xf6\xf6\x6a\x32\x87\xd1\xb3\x49\x40\x22\xc8\xfc\x7a\x7b\x23\xf2\x1a\x46\x9b\xa8\x1b\x92\x0a\x42\xc4\x00\x25\x58\xd3\xcf\xdb\x5f\x2a\x15\xa9\x77\x6c\x6b\x6c\xcd\xea\x7a\x30\x17\x53\x61\x9b\x63\xa2\x5d\xa5\x45\x03\xd8\x14\x3a\x0d\x9c\x28\xa8\x12\x4c\xe0\xef\xda\x66\xc5\x73\xde\xc9\x83\x5f\x52\x9f\x19\x2e\x91\x4a\x86\x06\xa3\x4d\xe7\x0e\x3d\xcf\x89\x19\x06\x22\x93\x07\x2f\x53\xcb\x0a\x7b\x46\x13\x12\x1b\x33\x22\xd4\xa5\x7a\x5d\x15\x7a\x38\xdd\xa4\x16\x58\x65\xae\x4f\x52\x36\x1f\xea\x50\x16\x30\xaf\x11\x4e\x95\x04\x89\xa1\xae\xad\xd1\x5c\x65\xcd\x10\x3c\xad\x14\xb5\xc2\x31\xba\x12\x59\xd1\xe1\x3d\xc7\x13\x4e\x13\x83\xc6\xa9\xab\xdd\xd7\xfd\xf5\x6a\xb9\xbe\x5b\xdc\x76\xb3\x49\x53\x89\xcc\x08\x51\xab\x2c\xdb\x95\x7d\x11\x91\xf8\x01\xed\x7e\x8c\xe9\x8d\x68\x5e\x30\x83\x17\x24\xf4\x9f\x36\x44\x73\x97\xdc\x6f\x9b\x0e\x1a\xaa\x8c\xe6\xf8\x32\xef\x6d\xd2\x78\x07\x7a\xd2\x16\xf3\x6f\x97\x01\x89\x91\xfa\xad\x28\xc4\xf2\x45\x54\x39\x40\x31\x1b\xfd\x0d\xe3\x3e\x1d\xa4\x0a\x63\x17\xd5\xed\x06\xa3\x75\x5a\x07\xa9\x41\x39\x4e\xe7\x29\x62\x49\x5d\x3e\x75\x9c\x04\x2b\x3a\xd0\x04\xab\x94\xdd\xa7\x49\x64\x01\x51\xcf\xe2\x00\xeb\x7a\xf3\x36\x7d\x2b\x34\x11\x12\x25\x31\x97\x9b\xfb\xef\xab\xc7\xdd\xea\x71\x6f\xff\xb5\x6d\x83\xe6\x1f\x5f\xd7\xbb\xd5\xed\x7a\xeb\xf7\x43\x4d\x43\x8a\x8f\x2f\x1b\xa6\x28\x9a\x46\xb1\xf7\x83\x5d\x35\x2f\x4f\xb5\xee\xb9\x2b\x93\x6f\xa3\x89\x55\xaf\xdf\x76\x7a\xac\x54\x53\x43\x30\x74\x95\x1e\xe9\xe3\xee\xa7\x66\x8c\x62\x0f\xa2\x5d\x3c\x96\x8f\x8b\xdd\x6a\xbb\xdf\x6d\xf6\xdb\xd5\xad\x47\x74\x6b\x26\x01\xa5\xe3\x00\xed\xb9\x46\x75\x05\xcd\x29\x47\xce\x80\x94\x6e\xa3\x98\x1c\xe6\x91\x15\xfd\xc7\x9d\xd1\x22\x02\xea\xee\xa0\x4e\x51\x86\xe0\x6d\xbc\xd9\x4e\x3a\x60\x73\xe5\x71\x1d\x92\x14\xdb\xfb\x8b\xdd\xf6\x8f\x4f\x98\x6f\x3a\x4c\x12\x24\x58\xac\xef\xd7\xbb\xf5\xe2\x76\xbf\xdc\xac\xef\xb7\xfb\x9b\xcd\xe3\xfe\xfb\xfa\xe1\xe1\x76\xb1\x5c\xdd\xad\xee\xbb\xfb\x1e\xa6\x02\xe9\xdd\x3b\xf1\x0a\xce\xee\xc1\x1f\x8a\x02\x8e\xb9\xe9\x32\xab\x10\x37\x95\x15\xcf\x43\x29\x76\xaa\xa3\x88\x11\xd7\x92\xf8\x13\xc4\xf4\xf9\x47\x49\x84\xab\x04\xba\xb4\xf5\xd2\xbe\xe3\x31\xa9\x60\x4e\xc0\xe4\xbe\xd4\x50\xef\x4a\xcc\x40\xe7\x56\x0d\x1d\xcb\x08\x93\xaf\xbf\x4e\xba\x27\x7e\xfe\x9b\xb0\xff\x9c\x57\x9b\xce\xff\x35\x0d\x67\xfe\xcd\xfb\x41\x24\xf8\xcf\xe0\xcf\xfe\xdb\x4c\x9c\xc4\x23\xf2\x4b\xcf\xb9\x99\x5d\x91\x75\xa2\x12\x65\xbc\x78\xf5\xfa\x70\x2c\x2b\xb4\x58\x9a\x5d\xad\x74\x9a\x40\xea\x99\xfe\xed\x64\x9e\x6f\xce\x7c\x9e\xf4\xe8\x34\x8d\xb4\xb7\xf8\x2e\x8f\xa7\x1c\xdd\xb6\xae\x3e\x36\xc6\xd4\x30\x7d\x3f\xd2\x34\x46\x9a\xcf\xef\x27\x61\x45\x4d\xac\xf3\x96\x7f\x94\x29\x30\x99\x38\x79\x55\x05\xc7\xf6\x59\x3f\x88\x8f\x03\x72\xc4\xdc\x10\x41\x53\xec\x96\xa1\xb5\xc2\xd4\x76\x63\x2e\x09\xd4\x22\xb1\x7a\xc8\x0e\x90\xba\x6d\xe0\x88\x35\x99\x45\xde\x7d\xaf\x50\x34\x4c\x46\xe6\xc5\xeb\x06\x0e\x03\x65\x2e\x3f\x0e\x54\xe8\x16\x82\x5b\x51\x37\x57\xa7\x33\x82\xbe\x96\xc6\x22\xb4\xc4\xb1\x5d\xd0\xd0\x9e\xba\xbb\xca\x4f\xb1\x06\x5a\x19\x16\x3a\x54\x6c\xd5\xbc\x78\x2f\xa1\x47\x6b\xfc\xd5\xcb\x2a\x69\x4d\x28\x52\xe0\x2c\x03\xa7\x9d\xa9\x8f\xf0\xdf\x0b\xb3\x41\xb3\x04\x4b\x72\xa2\xaa\xc4\x87\xb0\xda\x36\xe3\x11\x26\x22\x98\x68\xbc\x8f\xe4\x61\x6e\xa6\x90\x0c\x6d\x22\x40\x34\xae\x29\xab\xe6\x54\xc0\x1e\x53\x3c\x59\x81\xe8\x56\x49\x93\x5a\xc2\x94\xbd\xae\xeb\x6a\xa8\x7e\x3e\xb7\x31\x18\xc3\x31\x0b\x6e\x83\x90\x9e\xd1\x04\x81\x14\x28\xcb\xfe\x5c\xe6\xfa\xaa\x3c\x75\x6a\xb2\x14\x08\x01\xca\x5d\x13\xc2\xee\x21\xb7\x60\xfa\xa3\x51\x8c\xe1\x4f\xad\x5e\x40\x9f\x72\xc0\x1d\xb8\x67\x0e\x02\x49\x74\xea\x5e\x8c\x3f\xd5\x61\x2a\x10\x33\xfa\xb1\x40\x84\x44\xb5\xfe\x0c\xd5\x0c\xc1\x77\x90\xa1\xde\x4e\x2b\xf6\xc0\x98\x75\x9a\x02\x14\x34\xf5\x22\x3b\x83\xd2\x21\xf0\x20\xb4\x7e\x74\x2e\x5c\x7f\xb0\xe0\xd0\xc9\x79\x38\x51\x08\x03\x47\x12\x7d\x86\xac\xff\x31\x0b\x02\x38\xa5\x91\x70\xa8\x34\x9f\x89\xdf\x00\x2c\xe4\xe4\x91\x02\xa7\xcc\xf2\xe2\x9f\xcf\x22\x77\xe0\x32\xc6\xd5\xb4\x03\x32\xcc\xc8\x7c\xb7\xa3\x12\xab\xc7\xe4\xd8\x0f\x56\x4b\xed\x7f\xa0\xdd\xdb\x38\xfd\x42\xa5\x71\x2b\xca\x94\xa5\x38\xd7\x4f\x45\xdd\x67\x85\x10\xa6\x89\xed\x03\x42\xdd\xec\xdb\xd9\xbd\x76\xc6\x28\xff\x5d\x77\x61\x00\x24\x9c\x61\x62\x8f\x70\x7e\x7b\x16\x5c\xb2\x2f\x83\xa1\x21\xd1\x09\x92\x6c\xae\x45\x96\x7f\x58\x9f\xe5\xb9\x5c\x02\x52\x07\xdc\xed\x4d\xe6\xe7\xf7\x2c\x10\x22\xc2\xe2\xb0\xbf\x37\xb7\xe5\x1b\xba\x79\x7f\x8c\xf5\xa0\x2e\xa5\xa5\x20\xb4\xc0\x3d\x37\x6f\xd7\x06\xe4\x44\x09\x12\x7d\x15\xf5\xcb\xde\x8d\xf3\x3f\x56\xb2\x50\x3a\xb7\xc8\xad\x70\x90\xb1\x29\x25\x0b\xa4\x49\x22\x2b\xa7\xfd\x66\x1d\xad\x60\x27\xea\x57\xd7\xda\x5a\x34\xe7\x12\xa9\x14\x54\x04\x88\x9b\xb2\xaf\xa0\x6d\xbf\xcf\x04\xc4\x83\x0f\x98\xd0\x23\x37\x5c\xf5\x66\x07\xde\x30\xa4\x3d\x1a\xd9\x7c\xb4\x12\x45\x83\x9e\x6b\x4f\x45\x1b\xc5\xe0\x4c\x1f\xdf\xc8\xc1\x7c\xd7\x49\x82\x95\x95\xa5\xca\xcc\x30\x01\x01\x08\x98\x95\x5c\xb6\xdf\xf4\xd4\xd3\xc1\x00\x00\xa2\x5e\xa2\x65\x51\xe8\xab\xd3\xc7\x22\xcf\xc7\xad\xa1\x8b\xb5\xe8\xd9\xcd\x0d\xc0\x40\x2a\x7d\xb1\x05\xdd\xc4\xf3\xb3\xb7\xce\x68\x1a\x5b\x9a\xcf\xa9\x68\x36\xe6\xfa\x22\x2b\xca\x04\x01\xc5\x17\xe7\x80\xea\xe6\x13\xae\x82\x09\x02\x8d\x4d\xad\x1d\x6a\xa6\xac\x7e\x1e\xa1\x6a\x86\xbf\xdd\x10\x63\xf5\x40\xdd\xc4\xd9\x37\xe5\x1e\xff\xf9\xdb\x19\x2a\xcb\xb0\x90\x60\x77\xb9\x3c\x42\xd1\x66\x21\xfe\x26\x19\x1e\x11\x70\x1c\x2e\x54\xe8\xdf\x98\xb9\x0b\xe5\x49\x32\xd8\x1e\x6c\x89\x06\xba\x5b\x39\xba\x45\x86\x6b\x6a\xf9\x6b\x47\x51\xbc\x8e\xae\x37\xa4\x1a\x21\xe0\xd7\xeb\xe5\xaa\xfb\x1b\x8b\x91\x77\xf2\xe5\x76\x71\xd7\xfd\x4d\x01\xb6\x1c\x2f\x88\x5e\x8e\x83\x47\x13\xb5\x2f\x49\xa7\x42\x9e\x35\x18\x8b\xa1\x50\xed\x8c\xe1\x2b\x35\x91\x88\x79\xd7\xd4\xc7\xcb\x5b\x8a\xe3\xae\xb4\x82\x03\xfe\x0a\x62\x29\x70\xad\xbe\x5b\xdd\x6e\xee\x1f\x36\x8f\xbb\xfd\x72\x73\xf7\xb0\xb8\xff\x73\xe8\xaf\x48\x4d\xa2\x01\x39\xf8\x77\x7f\x8c\x7e\x67\x4a\x23\x08\x9d\x45\xea\x5d\xf9\x06\x57\x55\xd9\x1d\x8a\x08\x71\x8d\x26\xc4\x38\x88\xce\x2b\x63\x4e\x0c\xc5\x08\xc2\x31\x35\xb9\x12\xc5\xab\xd7\xd1\x77\x87\x24\x17\x28\xda\xd3\x40\x65\x3b\xe3\x0f\x42\xbd\x0e\x9c\xfa\xfd\xb0\xd8\xda\x6a\xb7\xaf\xd8\xc3\x40\x4d\xc0\x1d\xd6\x44\x51\x6b\x95\xd3\xec\x11\x8f\x38\x0d\x4f\x8c\x26\xc6\xbb\xf0\x3f\x88\x0f\xe8\x68\x74\x33\xf2\x24\x06\x02\xdb\x50\x79\x28\x5f\xa1\x72\x62\xe6\xfe\x10\x0f\xd0\x09\x4c\xb6\xcf\xf3\xaa\x9f\xa5\xdd\x63\x04\x08\x89\x7f\x8c\xcb\x8d\xed\xae\x8c\xaf\xd5\x04\x1a\x79\xdf\x7e\x25\xed\xcd\x50\xa9\x31\x2c\xf6\x95\xcc\xbb\xf6\x67\x7c\x2d\x0f\x4e\xf2\xaf\x9e\x9e\x85\x4b\x14\x24\x41\xc0\xb1\x67\x41\xf8\x63\xb1\xed\x29\x15\xf0\x7e\x73\x6a\x4e\x15\xf8\xe3\x73\x81\x10\x0b\x02\xe6\x5a\xde\xf8\x3e\x88\x1c\xea\xc5\xe4\x06\xb3\x20\xe0\x80\x0c\x51\x84\x1a\x3b\xcb\x39\x79\x01\x3a\xcb\x02\x42\x35\xd6\x20\x6f\x4b\x31\x4c\xeb\x58\x40\x40\x32\x2f\xb5\xdf\xc0\x61\x73\x1c\x69\xec\x0f\x42\x20\x16\xb0\x88\xb1\x4e\xb3\xaa\x12\x0d\xf8\xce\x16\x0b\x38\x4d\xfd\xab\x72\xb3\x79\xba\xbf\x5e\x3d\x6e\xf7\x0f\x9b\xcd\xed\x7e\x71\x7d\x3d\xf6\xcb\x66\x01\x8f\x04\x19\x6a\xe2\xa2\xbe\x82\xdf\xaa\xfd\x18\x6d\x69\x59\x28\x5f\x93\x59\xd1\x8e\xac\x2c\xa6\xd2\x07\x2c\x08\x09\xc7\x28\xeb\xdb\xfa\x69\x3b\x78\x55\x58\x10\xca\x00\xa7\xe7\x8f\xb2\xca\xf5\x56\x18\x68\x3e\xb6\xa0\x4e\x6d\xb4\x3f\x1a\x17\x05\x29\x06\x5a\x5f\x7e\x8e\x01\xb3\xfe\x30\xb5\xea\x6f\xb6\xbf\xe2\xdb\xff\xbb\xd2\xca\xaa\xae\x7e\x1e\x3b\x4c\x08\x0b\xa2\x88\x61\xaf\xee\x61\xb5\x7b\xdc\xfc\xb2\xc7\xc4\x82\x98\x46\x0e\x66\xfc\x56\xbe\x82\xd7\xf9\xd8\xe2\xf7\x4c\xf1\x9d\x17\x98\x08\xe3\x8b\x8d\x95\x40\x3a\xc3\x4b\x79\xaa\xe1\x1b\xc0\xf1\xb7\xd9\xb9\x90\x04\x4a\xdb\xef\x45\x60\x4f\x5f\x6e\xbe\x18\x63\xb2\x20\x21\x4e\x19\xa3\x2a\xdf\xb1\x25\x38\x2c\x03\xb1\x20\x61\x21\x16\x79\x8f\xe2\x23\xeb\x6e\x6d\x22\xac\x14\x00\x2e\x88\xfb\x6a\xe0\xdc\xca\x82\x94\x44\x92\x0e\xd6\x56\xc0\xc2\xeb\xe8\xf6\x88\x40\x3b\x8a\x0c\xa8\x57\x57\x8e\xfe\xfd\x54\x36\x62\x36\x3d\x64\x81\x48\x02\xc9\xc7\x7a\xba\xff\x03\xbd\x6d\x57\x17\xbb\x7e\xf9\x71\xa9\x4e\xa9\x07\x7a\x8d\xc0\x4c\xff\xee\xf3\xe2\x7f\x87\xff\xf9\xc7\xa8\x17\xf9\x49\x99\x81\x05\x02\x12\xe9\x48\xd7\xed\xbd\xb9\xc9\xc5\x73\x1f\x53\xb3\x40\xc6\x02\xcd\x08\x1c\xd5\x61\x73\xc9\x29\x85\x05\x52\x4a\xe8\xf5\x2f\xae\x00\x34\x52\x0d\x27\xdc\x5b\x16\xa8\xc0\x9a\x5e\x3e\xf7\xbe\x0d\x22\x5f\x15\x4d\xf5\x71\x53\x56\x8e\xfd\x34\x7e\x80\x8a\x10\x5c\x26\x55\x27\x8e\x39\x7f\x05\x8a\x06\x41\x7b\xad\x6f\x99\x6a\xb2\x83\xbf\x67\x2a\x8c\x31\x28\xb6\x9c\xac\xed\xf0\xe3\x7f\x27\xed\x66\x81\x92\x09\x1b\x56\x96\xdb\x70\x6a\x96\x3a\xf8\xf9\xbf\xba\xb3\x99\x24\x1d\xb8\xc5\x2f\xb4\x3e\xc7\xe8\xfa\xb1\x3a\xa2\x0e\x04\xb4\x56\x9d\x79\x6a\x9f\x24\x0d\x28\x49\x2c\xd0\xa1\xb5\x4b\xa8\xe0\x0d\x44\xbe\x05\x35\xa8\x6d\x4f\x9e\xb9\x96\x44\x48\x4f\x23\xfb\x4b\xa8\xd7\x73\x69\x09\x16\x68\x2d\x13\xff\xe5\x1a\xc4\xe4\x99\x00\x21\x71\xb7\xcc\xd7\x8f\x20\x74\xfb\xf8\x1c\xc6\x7c\x72\x26\xa0\x56\xb6\x76\xbf\xdd\x2d\x8b\x71\x40\xc7\x02\xd0\x5d\xbb\x6d\x2b\xde\x40\x7f\x17\x95\x3f\x64\x42\x23\xa1\x33\x80\xf0\x15\xa5\x65\xfb\x4e\xd5\xa7\xc3\x6f\xe3\xdf\x64\x40\x53\xb4\xc3\x2f\x5e\xab\xb2\x28\x87\xfc\x53\x46\x02\x12\x80\x63\x8d\x21\xcb\x69\xbc\xff\x31\x12\xc4\x96\x12\xff\x70\xbd\x18\x7f\x4e\x0a\xac\xe4\xef\xd6\x7f\x5c\x82\x51\x9f\x3f\x62\x42\x52\x86\x10\x42\x2b\x79\x72\x87\x45\x6c\x77\x88\x72\xc6\x2d\x42\xfd\xe3\xd8\x94\xaa\x3c\x1c\x45\x05\x4f\xb5\x43\x1a\x3e\x55\xf9\xf8\x57\x11\x1a\x73\xcb\xf1\x75\x4c\x76\x7b\xef\xb6\x0a\x0a\x98\xd4\x90\xba\x6f\xa7\xb1\x55\x7a\xba\xb2\x9b\x0a\x36\x51\x46\xcf\x8e\xb0\x20\x64\x3d\x4c\xde\x16\x60\x26\x23\x12\x23\xac\x9d\xaa\x6f\x81\xa0\xa7\x56\x6f\xdf\x3e\xf1\x19\xea\xae\x97\xa5\x04\x15\xfa\x0e\xb6\x08\x08\xdb\x97\xb2\x71\x4a\xb2\xc7\x4e\x3a\x78\xf6\x35\x23\x4c\x2b\xce\x7c\x7b\xc8\x15\x47\xaa\xf2\xb0\xaa\x54\x14\xc7\xb3\x79\x24\x23\x5c\x02\xb6\xa1\xb0\x86\x3c\xbb\xbe\x91\x88\x71\x54\x77\x7b\xf8\xb2\xbb\x1a\x3d\xdb\x28\xa6\x81\x2f\x72\xd8\xaf\x1b\xc9\xd3\x32\x12\x25\x09\x12\x24\x6c\x7c\x7f\x25\x6a\x78\x7a\x5c\x8f\xd6\x79\x12\x29\x86\xe2\x05\x3e\xfa\xba\x3a\xf5\x7d\xf4\x99\x89\x11\x73\x8a\xaa\x0e\x28\x4a\x8b\xe8\xf6\x51\xe5\x81\x91\x58\x49\xeb\xe6\xfe\xb4\xdb\xdc\xdc\xec\x1f\x1e\x57\xe8\x5f\xbe\xb9\x5f\x75\x23\x74\xa4\x59\x07\xd7\x77\x1c\xf9\xc9\xa4\x49\x98\x46\x6c\xe1\xd1\x06\x26\x13\x0e\xdb\xe4\xb6\xa7\x54\xe1\x4e\x37\x5e\x8f\x2e\xad\x8c\x6e\xce\x8d\xbf\x2f\x4d\x18\x4a\x3f\x2c\xcb\xa2\x80\x59\x43\x48\x3f\xd0\x70\x2b\x37\x8f\x4a\xab\x50\xdd\x97\xd5\xc1\xd7\x24\x19\x11\x5c\x85\xd2\x82\x05\x87\xad\x5b\xd4\xbc\xa3\xdd\xa0\x90\x86\x4e\xc0\xc9\xee\x7f\x7f\xb3\xb3\x3c\xb9\x12\xc9\x18\x16\x0f\xfb\xc9\x36\x47\x55\x63\x44\x05\x01\xb7\xb0\xa7\xaa\x2a\x9b\xda\xd7\xb6\x7d\x08\xcf\x88\x8a\x6c\x8d\xd0\x61\x0d\x67\xb0\xa6\x8c\xa8\x44\x8a\x2e\xf7\xdd\x1f\xad\x64\x60\xf7\xcc\x95\x0e\x94\xa3\x97\x5c\xfd\x7e\x3b\x59\x98\xb4\xb0\x10\x15\xd1\x71\xcf\x67\xd2\x4b\x46\xb4\xb1\x6d\x7a\x5f\xbf\xb0\x0f\x13\xf4\xee\xa5\x2a\x0b\xcb\x6b\xed\x13\x5f\x46\x80\x73\x6c\x17\x5e\x9d\x3e\x6e\x45\xd1\x26\xe2\xab\xe6\x65\x72\x4a\x88\x6d\x08\x73\x65\x91\x55\xdf\x3a\xf4\x2b\x23\x46\x6a\x44\x2c\xed\x2a\x28\x9e\x9f\x45\x0e\xae\x32\xc9\x28\x51\x12\x93\xef\xed\x97\x5d\xf7\x27\xad\xf0\xd2\xda\x58\xdf\x23\x23\x27\xef\x05\x25\x10\xe1\xc6\xed\xda\xf7\x8d\xc2\x42\x93\xa5\xef\x8f\xae\x8a\xb2\x90\x63\xdb\xc7\x95\x64\xcb\x91\x7f\xa0\x1f\x13\x27\xb6\x8f\xb1\xb9\xdf\x3d\x2e\x96\xbb\xfd\xd7\xcd\xed\xf5\xea\x71\x7f\xb5\xb9\x7f\xda\xfa\xcb\x62\x20\x70\xce\x8a\x77\x51\xe9\x36\x4e\xb7\xce\x19\x96\x03\x3b\xfb\xa6\x50\xae\x8d\x57\xc6\x1d\x30\xe0\x2c\x20\x42\xeb\x49\xd0\x42\x43\x26\x70\x69\xb2\x61\xc7\x2b\xe2\x34\xfb\x7b\x48\xc3\xd8\x02\x01\x71\x37\x6b\x03\x9f\xbc\x14\xcd\x54\x44\xab\xff\xee\x98\x4a\x31\x74\xac\xdf\x7d\x1c\x61\xf2\x85\x71\x98\x60\x60\x61\x69\x0d\x3b\x61\x4b\x56\xa4\x3b\x43\x92\x12\xe8\x8d\xcf\x90\x88\xe5\x0e\x25\xcc\x1a\xfe\xd7\xd0\x2c\xe1\xdc\x10\xd2\x8f\x92\x46\xb9\x8d\xfa\xfe\x74\xb8\x83\xba\x16\xcf\xe7\x90\x48\x3f\xd8\x08\x4b\x1d\x13\xc7\xac\x11\xb9\x93\x4e\x68\xef\xd6\xe4\xaa\xd3\x20\xf2\x92\x18\xff\x14\xea\xf5\x58\xfa\xe5\x97\xa6\x0e\x7e\x6a\x53\x8c\x95\xce\x9a\xc5\x33\x14\x5d\x78\x2c\x86\xeb\x8c\xff\x88\xa1\xa8\xa7\x77\x2c\xeb\x26\x53\xa5\x55\x75\xe9\x39\xc9\x8c\x8a\x00\x20\xf6\xa8\xea\xf2\x7d\x07\x3f\x1b\x4c\xbb\xd3\xa8\x1b\x11\x4b\xea\xf4\xcd\x16\xc7\xe3\x85\x5f\x27\xb4\x46\x00\x7e\x01\xef\xf7\x03\xfb\xbc\x8b\xa9\xce\x68\xb9\xa4\x02\x58\xe4\xec\xf3\xa0\xba\x3f\x1d\xae\x41\xe4\x93\x0d\x98\x4a\x10\xd8\xea\xb1\xf3\xfc\x21\x17\x05\x34\x4f\x8f\xb7\x17\xd1\x71\xa3\x17\x40\x91\x20\xe9\x64\xf7\xf5\x57\x6f\x2f\x90\xf8\xc3\x2c\x42\xf1\x9b\xed\x51\x28\xef\x84\xea\x03\x14\xaa\xd2\x00\xa3\x65\xeb\x3a\x8c\x6d\xc4\xdd\xca\x57\xa1\x18\x55\x3a\xb6\x79\xb4\x0b\xfb\x2c\xe5\x6f\x57\xf6\x5a\x15\x8c\x6a\x19\x63\x9b\xfb\x58\x95\x26\x6b\x70\x13\xbf\xca\x1a\x2b\xc8\x78\x0d\x32\x6b\x7a\x5d\x4a\x46\x35\x18\xeb\xe3\xfd\x5c\x2d\x7d\xdb\xa8\x4f\x78\x28\x10\x15\x47\x23\x24\xd0\xaa\xbd\x99\x37\x65\xb5\xda\x7d\xed\x77\x5a\x3f\x9a\xda\x2e\xdb\x7e\x94\x9f\xc3\xe9\x30\x59\x45\x0c\x0f\x51\x48\xf0\x53\xb7\x9c\x4b\x1b\xca\x05\xcc\xbb\x3f\x75\x6a\xc3\xfb\xf6\x35\x6b\x57\xdf\x77\x57\x82\xef\xa0\x24\x7e\x9c\xd0\xa4\xab\xb8\xa1\x0e\x1c\xe8\x9b\xb2\xda\x9c\x1a\x55\x1e\x60\xf4\xbc\x8c\xb6\x69\x7e\x53\x7e\xb5\xee\x51\xd7\x50\x94\x58\xde\x9a\x02\x9b\x18\x35\xa0\x78\x30\x90\xa0\xfb\x15\x53\x86\xb1\xc0\xa4\xb1\xe9\x50\x89\xd7\xb8\x8d\x09\x6b\x8e\x70\x5e\xf8\x66\x8c\x90\x88\xd1\xc1\x42\x64\x5d\x31\x26\x63\x22\xa5\x8d\xe3\x69\x35\x67\xfe\x91\x8c\x11\x61\x7d\x41\x9f\xa1\xd9\x5b\xe9\xed\xf1\x71\x1a\xd8\x39\x01\x3f\x8f\xed\x8e\x91\x55\xed\x0c\x7b\x04\xa1\x5e\xac\x9a\xc4\x64\x74\x98\x60\xb4\x2d\xb4\xbe\xa9\x00\x10\xda\x68\x1d\x14\xd7\xc5\x5b\x99\xa9\x5f\x30\xac\x18\x63\x24\xc1\xa4\x1a\x65\x9c\xce\xa3\x37\x3f\x4a\x10\xbc\xe8\xf5\x6e\xb5\x74\x0a\x9f\x8c\x31\x65\xb0\xe1\xd1\x06\x74\xa7\x22\x6b\x3e\x6c\x75\x75\x88\xbb\x60\x8c\x69\x6b\x49\x7a\xb7\xf6\x78\x03\xc6\x38\xb5\xac\xae\x2f\x65\x99\x8b\xf9\xc7\x34\x5a\x10\x18\x4f\x0c\x56\x55\xcb\x37\xd0\x18\xb4\x58\x63\x78\x61\xc5\xc7\x5c\x5c\x02\x17\xaf\x9e\x0b\x89\xef\xe4\xba\x30\x65\xdd\x5d\x84\xd0\x81\x2b\x73\x7f\x87\xca\xea\x68\x4e\xc2\xfa\x59\x19\x52\xc6\xc2\x84\x61\x6f\x7e\x44\x1a\x39\xb7\x0a\x65\x2c\xd4\x0a\x41\x21\xe8\xb0\x32\xc4\x4d\x30\x16\x91\x20\x76\xc2\xaa\x26\xab\x0e\x88\x69\x42\x86\xcc\xf8\x0c\x89\xb2\xa2\x6c\x87\xb2\xd8\x95\xbb\x4a\x64\xde\x0c\xd2\x29\x4c\x32\x96\x86\x1a\xb1\x3a\x3b\x91\xbf\xd6\xd6\x02\xc3\x1f\x49\x53\xc4\xe1\x7c\xd9\x5d\x2f\xb7\x8d\x28\xb4\xa8\xf4\xdf\x43\x51\x33\x96\xaa\x00\x4b\xaf\xf8\xf6\xae\x97\x9b\xae\xb7\xec\x8f\x43\xca\x3b\xdd\xdb\xbd\xc1\xb2\xc9\xe8\x1e\x09\x11\x45\xd6\xe8\xec\x01\x2a\x17\xee\x0f\x89\x88\x8c\x49\xc1\x49\x17\xcb\xaf\x9a\x97\x75\xf1\x03\x32\x7f\x7e\x69\xe2\xc8\x2a\x0c\x34\x50\xe8\x7d\x9e\x19\xd8\x97\x66\xaf\x86\x2a\xb1\xfd\x5d\x52\x71\x9a\x78\x21\x8d\x11\xac\x83\x31\xad\x6c\xf9\xab\xb6\x5c\x48\x1a\x46\xbf\x7d\x56\xee\xe0\x01\x05\x12\x7b\x9b\xae\x36\x3a\xba\x6b\xe3\x89\x79\x97\x18\xc6\x83\x38\x42\x5c\xde\x15\x34\x9b\xe2\x6e\xf8\x06\xb9\x01\x84\x32\xa2\x3a\x3e\x1d\x2e\x89\xf3\x01\x06\x27\x34\x89\x07\xe6\xfb\x5a\x34\xe2\xa9\xca\x1f\xd0\xf2\x65\x14\xe1\x71\x22\x04\x66\xd1\x59\x97\x8f\x8e\xe8\x51\x93\x0b\x90\x0a\xc1\x3f\xba\x42\x0a\xc7\xf8\x3b\x69\x90\x22\x10\xbe\x12\x85\x0f\x62\x39\x25\x11\x2a\x1d\x40\x9e\x3d\x67\x32\x87\xa5\x33\xe2\x58\x17\xaa\x82\xc3\x0c\x46\xdd\x7f\x8e\x41\xaa\x46\x10\x92\x39\x5b\x29\xc6\x59\xc8\x31\x08\x31\xe8\x2a\xb1\x3d\x76\xf3\x95\xb3\x58\x22\xb7\xee\x26\x93\xed\x72\xdc\xd7\x0d\x38\x4b\x53\x0b\x32\x82\xba\xd9\xab\x76\x8e\xd3\x3d\xdd\x67\x85\x95\x05\xc7\x16\x68\x7d\xf5\x11\xfa\xe1\x5c\x04\x72\x2a\x73\xdb\xed\xf4\xe3\xab\xe1\x32\xd0\x5e\x39\x0a\xaa\x65\x79\x38\xe6\xd0\xa0\x86\xc9\x3c\x45\x91\x71\xae\x42\xaf\x3c\xd3\x66\x16\x3d\xf9\x76\x32\x35\xa2\x50\x23\xc6\x7b\x55\x55\x8e\x32\xef\x65\x3c\x19\x8f\x92\x54\xa4\xc3\x6d\xa4\x82\x33\x21\x28\xc6\xa3\x34\x09\x9c\x87\xd1\x43\xf9\x0e\xd5\xde\xff\xbe\x38\x30\xd8\x7e\x45\xf9\x7c\xb7\xf6\x4d\x80\x24\x9f\xf6\x2c\x19\x8f\x13\x8a\xc4\x0c\x34\x90\x2d\x34\x54\xf4\xc2\xaf\x48\xa2\x50\x07\x1e\x92\xef\x6c\x83\x1c\xa1\x77\xfe\xcc\x89\x4c\x90\x4e\xab\x3a\x83\xaf\xdd\x80\x63\xb8\xbf\xfa\x1b\xfa\xa8\x8c\x27\x4a\x18\xaf\x69\x7f\x75\xfa\xd8\x39\xfc\x9f\x5f\xba\x79\xa2\xc0\xc4\x5d\xb1\xef\xc2\x84\x4c\x8c\xe9\x84\xf4\xb7\xd7\x8f\xb6\x88\x3d\x1e\x92\x4a\x81\x30\xe2\x45\x56\x3d\x96\xc7\x61\x7d\x84\x8b\x80\xa6\x7e\x77\x28\x1b\x58\x34\xbb\x9f\xde\x6b\x63\xb6\x84\xdf\xce\x39\xec\x5a\x2e\xfe\xf8\x63\x7c\x22\x11\x50\x97\xdd\x55\x59\xd3\x4d\x69\x29\x2d\xd3\xf5\x4e\x64\xc5\xd5\xe0\xf5\x93\xca\x7e\x2f\xfc\x14\xed\x5c\xbc\x39\x15\xea\x3c\xd0\xe1\x2a\x8c\xb0\x6a\xdf\xae\x12\x1b\x73\xe1\x06\xe8\x44\x60\x20\xb1\x2b\x5f\x47\x57\xa4\x25\x47\x14\xd2\x55\xe6\xf3\x31\x0e\x01\x43\x20\x46\x53\x5e\x21\x21\x6d\xb8\x94\x73\x48\x6c\xc4\x2c\xb4\xde\x14\x5f\xa7\xa6\x75\x8c\x83\x08\x91\x71\xf3\xbe\xb7\x08\x41\x7f\x52\x93\x52\xcc\xda\xfe\x05\x32\x5b\x96\x19\x62\x67\xef\x9e\x2f\x4a\x5a\xd8\x4f\x85\x01\x63\xce\x21\xb3\x4d\x9b\xde\x61\x9e\x38\xc4\x42\xc2\x28\x46\x6e\x4f\xdb\xeb\xfd\xc3\xea\x71\xbf\xda\x7d\xf5\xd4\x25\x16\x12\x1e\xe1\xb4\x75\x50\x53\x5c\x98\xe7\x85\x01\x26\x27\x4d\xb5\xd3\x53\xc5\x54\x7d\x99\x83\x38\xf3\x56\x64\x21\x11\x09\xa6\x27\x56\x86\xd6\x1a\xfe\xcf\x70\x7a\x59\xd8\xc6\xb9\xd4\xe9\x64\x0d\x97\xf0\x90\x87\x02\x01\x97\x59\x6d\x83\xa5\x81\x8b\x29\x0b\xc3\x54\xa2\x82\x46\xbb\xe9\xf5\x24\x6b\x16\x86\x3a\x42\x43\xbe\x3b\xd1\x6e\xe3\xdd\x5f\x41\x52\xa7\xcc\xfc\x96\xe5\xd0\x25\x0f\x61\x14\x58\x96\x53\x7d\x92\x6e\xf1\xc3\xc0\xd6\x75\xc0\xc7\xbf\x28\x92\x04\x53\xc7\xab\x1f\xcb\xaf\xbf\x82\xda\xb2\x30\x82\x24\x36\xbd\xbd\xa0\xc5\xcf\xb8\x63\x09\xe1\x22\xea\xe3\x1a\xbb\x87\xd6\x7d\xab\xa3\x1b\x97\x08\xc2\x3d\xbd\xf2\x78\xa9\xbc\xdc\x37\xbe\x59\x98\xa4\xb6\x93\xac\xe6\x01\x9a\x2c\x14\x02\xb8\x8d\x34\xef\xd7\x77\x4f\x77\xfb\xab\x95\x2f\xc3\x84\x92\x44\xd4\xf1\x05\xf6\xd6\x8a\xef\x39\x2f\xa5\xc8\xf7\xe2\xa4\x33\xd4\x35\x39\x0d\x9a\x98\xa1\xa4\x92\x38\x88\xfc\x55\xf9\x93\x76\x7f\x8e\xad\x31\xb1\x3c\x7d\x0c\x80\x6b\x17\xa6\x92\x94\x71\x14\x7b\xd3\x12\xf4\x70\x9c\xa6\x56\x83\xdf\xa6\x88\x41\xf2\xb7\x3b\xa5\x4d\x3d\xc6\xef\x85\x12\x0a\xc1\xa3\x88\x0b\x29\x7a\x90\xc0\x2f\x85\x3c\x59\xa8\x69\x8a\x9b\xdc\xd5\xc3\x70\x1d\x08\x75\xc4\xfd\x63\xb4\x65\x9a\x9b\xb2\xda\x82\xaa\xd0\x05\x71\x32\x41\xb4\x91\xb1\xbd\xc0\xbf\x4e\x75\xa7\x6f\xc2\x42\x20\xa1\x65\x74\x5a\xdf\x97\x1b\xdc\xd4\x27\x42\x82\x7e\x68\x1a\x2b\xd7\x38\x6c\x7a\x08\x3e\xa6\x5a\x77\xa0\x33\x31\xa7\x2c\x33\xfe\x1d\x20\x59\xe8\x4a\x50\xbb\xf2\x2a\x17\xea\x75\x2c\x0a\xdf\x0d\x93\x18\x5a\x23\x59\x62\x7b\xbd\xbf\x79\xba\xbf\x5e\xdf\x7f\xe9\x2e\x19\x34\xda\xb6\x2f\x45\x65\x61\x5c\x93\xf5\x2c\x34\x9c\x61\x87\x33\x3b\x8a\xaa\xf9\x6d\xb8\x71\x87\x86\x5b\x1a\x7f\x1b\xce\xf9\xc6\xf7\xfc\x3d\x37\x32\x45\x57\x84\xbb\x8f\x99\x1c\x30\xf2\x5e\xdd\x1d\x3c\x6e\x29\x2e\x54\xa8\xa3\x20\x22\x08\xea\xc0\xb4\xc7\x01\x28\x46\x37\x36\x0a\x12\x6d\x30\x62\x13\x55\xfe\xe1\x7c\x0a\x26\x7a\xea\x2c\x0a\x24\x61\x49\x67\x24\xd1\x6e\xa6\x7d\x31\x6a\x9a\x2f\x45\x94\x72\x69\xd5\x07\x35\xd6\x10\x70\x79\x1a\x38\xf2\xb3\x88\x3a\x0e\xb3\x53\xb9\x42\x14\xed\x75\xa6\x06\x0e\xe6\x2c\xa2\x9c\x60\xf6\xf3\x82\x0a\xd8\xb7\x99\x82\x42\xc1\x4a\x54\xbd\x6e\x32\x8b\x68\x6c\x30\x8f\xb0\xaf\xe3\x9d\xf8\xd9\x1d\x48\x09\x2a\xd1\xdd\x9c\xd4\xeb\xb7\x93\x28\x6e\xb3\xee\x08\x84\xe8\xed\xde\x91\x1f\xad\xc5\xd5\x76\x75\xbf\x1d\xe4\xef\xb3\xcd\xf0\x88\x91\x50\x47\x1d\x49\x1e\x26\x8c\x31\x16\x31\x6a\x05\x9b\xac\x9b\xf1\xfd\x55\x57\x89\xef\x66\x7c\xd4\x86\x5f\x38\x3b\x6a\x04\x14\xf5\x76\x03\xb3\x39\xa3\xff\x50\x9b\xa4\xb4\xa9\x58\xf6\x3f\xa8\x6c\xa8\xe6\x8f\x08\xc2\x89\xb7\xa4\x46\x31\xc1\x61\x5b\x33\x62\xca\xa6\xf7\x26\x2f\xcb\x6a\xc0\x4f\x67\x11\x73\x6f\x24\x5e\x6a\x9b\xfa\xef\xa6\x9a\x90\x7e\x24\x0f\x02\xfc\xf2\xaf\xd7\xcb\xee\x4f\x4c\x60\xb3\xc1\x88\xff\xfd\xef\xa3\xd7\xb8\x66\x51\x98\xc6\xa8\x0b\x78\xb8\x2d\x85\x5e\x14\xfa\x11\x9b\x78\xc3\xa7\x1a\x25\x01\x37\x9d\x25\x73\x59\xfd\x73\xa0\x3f\x34\xbf\xfe\x44\x91\xd1\x61\x27\xfc\x2b\xf2\x93\x2b\xb0\x3c\x82\x2a\x2b\x0d\xd5\xfa\x7a\x28\xbb\xe8\x13\xdb\x28\x26\x81\x74\xcb\x53\xe7\x3a\xeb\x01\x4f\xe3\xa7\x16\x8b\x04\x4b\x8a\xcd\x7e\x51\xe8\xaa\x4b\x1b\xa2\xd8\x24\xc8\x21\xd8\x3e\x0c\x25\x3c\x59\x94\x30\xc3\xf4\x80\x7c\x86\xb4\x06\x5b\x51\x98\x67\xa2\xb1\x28\x31\x3c\x41\xfd\x3d\x09\xed\xda\xb6\x7b\x11\x17\xba\x3c\x51\x62\x62\xd4\x26\x93\xa7\x0a\xf5\xa9\x2f\x4b\xfa\xb0\x28\xe5\x06\xf7\x88\xf2\x78\x2c\x8b\x7e\xff\x89\xa4\xab\x51\xee\x84\x7a\xf9\x38\x03\xf5\xcc\xe4\xeb\x91\x8c\x02\xa6\xc7\xec\xf6\x51\xc8\x1c\x49\x69\xb0\x35\x69\xb5\x56\xcb\xba\x59\xab\xa1\x64\xe8\x5a\xf7\x23\x8d\xe5\x77\x35\x2f\x40\x68\x20\x46\x2d\xba\x48\x1a\x85\xb7\x7a\x53\x29\x6b\xf0\xe7\xfe\xae\x52\x89\x4d\xb7\xf5\x72\xa3\x41\xe8\x3c\x2b\xba\x89\xaa\x8c\xc4\xf7\xd5\x2f\x75\x6b\xb7\x81\x7d\x2e\xa3\xe1\x3e\xac\xa9\x0c\xdc\x92\xef\xcc\xa6\x16\xcd\x5a\xcf\xde\x10\xf7\x09\x48\x53\x6c\x6c\x2e\x9e\x06\xb1\x53\x04\x2a\xc5\x3e\xbb\x30\x0d\x54\x2b\xa1\x5e\xfc\x01\x13\xc5\x88\x7f\xb2\x32\x09\xdb\xa6\xac\xfa\xfa\x6b\x64\x1c\xd5\x0d\x25\xf9\x8b\xa1\x7b\xe0\xec\x06\x15\x19\xad\xb1\x67\xfa\xfd\xe9\x76\xb9\xb8\xdf\x3f\x3c\x6e\xee\xda\xb0\xf4\x69\xbb\x5f\xfd\x81\xcd\x98\xf5\xe6\x7e\x7f\xb5\xd8\xfa\x7e\x66\x1c\xa4\xd6\x5e\xc7\x89\x9f\xdd\x89\x62\xe8\xc9\x3a\xed\x14\xc5\x81\x08\x70\x51\xdc\x6d\xbf\xfb\x57\x39\x26\x8a\x21\xa0\x5b\xf4\x18\x81\x47\xf8\x0b\xd4\x8c\xb6\x92\xff\x84\x06\x14\x57\x39\x21\x7a\xfa\xfb\xd3\xc3\x60\xd9\xf4\x67\xa5\x81\xd5\x39\x7a\xce\xde\x60\xf1\x2e\x3e\xce\xb2\xe1\xf1\x2f\x8f\x59\xc4\x91\xfe\x62\x77\x54\x67\x93\x96\x55\x30\x51\x1b\xf2\xa3\x85\x8e\x1c\x79\x34\x6b\xc0\x06\x0d\xdd\x7a\x15\x33\x99\xc8\x6e\xc7\xeb\xd0\x1e\x97\x36\xab\x98\x01\xc5\xfe\xcd\x32\xab\x54\x0e\x63\x0b\xd9\xb3\xd6\x67\xcc\x4c\xc7\xd7\xf6\x41\xe9\x5c\xd7\x32\xe6\xc4\x2a\xe3\x66\x0d\x9a\xe6\x8d\xc2\xf7\x98\x53\x8d\x96\xff\x07\xf1\x8a\x82\x30\xa7\x33\xc5\x86\xf3\xff\x9d\x9c\x5e\x71\x24\xdc\x94\x6f\x50\xd5\x2f\x65\xd7\xf7\x89\x39\x28\x44\xfb\xbc\x7b\x5b\x9e\xbb\x6e\x3a\xc6\x21\x0d\x3c\xad\xdb\xe7\x46\xe3\x9b\x32\x90\x13\x64\x71\x44\x15\x36\xec\xf6\x15\xd8\xf9\xdb\x9d\x27\x8a\x44\x18\x7b\x1c\xd5\x45\x0e\xe4\xa5\x26\xf8\xf0\x2b\x92\x84\x5a\xb1\xec\xa5\x2f\x01\x9f\x8b\xbe\xb2\x38\x0e\x99\x2d\x99\x54\xa2\x0d\x3e\x1a\x91\x2f\x87\x92\x4e\x2c\x8e\x13\xa0\xda\x43\xa8\x0f\xc7\x06\xf6\xd1\xf8\x86\x27\x8e\xe1\xd9\xe6\xf2\xeb\x69\xff\x37\x4e\x4c\x80\x5e\xd5\x5b\x25\x0e\xdb\x36\xe8\x19\xae\xf6\x71\x1a\xc4\x18\xe6\xca\xb2\x7c\xbd\x16\x1f\xdf\xb3\xa9\x93\x6c\x3b\xc4\x78\x3a\xf1\x37\x98\xc4\xad\x71\x4a\x68\x64\x89\x83\x95\x29\x2b\x44\x81\x74\xa7\x8e\x18\x16\x0b\xdd\x92\xd6\xbe\x40\x22\xdf\x95\xa7\x2a\xab\x0f\x36\xa4\xfe\x7b\x9e\xc4\x2c\x4e\x13\x83\x15\xf1\xab\xd3\xa9\x3a\x88\xa2\x1e\xff\x02\x9d\xb2\x68\x28\xe9\xdd\xeb\x2b\x9c\x19\xc6\xb8\x8f\x88\x58\x28\xc4\x1b\x23\xb5\x40\x3c\x77\x8c\x91\xee\xa4\x22\xb5\x2a\xbb\x3f\xae\xd6\xbf\xcc\xf8\x62\xa1\x25\x38\xff\x8a\x02\x91\xfb\xe3\x5b\x24\x49\x8a\xce\x97\xd6\x70\xab\xfc\x10\xf9\xe8\xfa\x65\xac\x2c\x3f\xdd\xd5\x84\x3c\x25\xf8\xef\xec\x00\xb1\x0a\x6c\x3b\xc5\xe5\xb7\xfa\x19\xf4\x18\x36\x12\xab\x40\xa3\x9b\x8e\x10\xa2\xfb\x53\x0a\xcc\xc6\xf8\x85\xc6\x26\xff\x76\x2a\x20\xcc\x62\xa5\x01\x27\xef\x8b\xa8\x1f\xc4\x34\x52\x8c\xb5\x8a\x71\x01\x5c\x1c\x8f\xd6\xc6\xd7\xfd\x1d\x02\x2b\xd3\x75\x98\x61\xd9\xfb\x21\x69\x90\xca\x5e\x6b\xa5\x7e\x70\xcd\x81\xeb\x19\x19\x11\xff\x11\x29\x35\x9d\x44\xe7\x36\x20\xb1\xd0\x7b\x3f\xcc\x24\x4e\x90\xcf\x79\x65\x58\xea\x7b\xfd\x80\xbd\xc6\xc9\x2f\x30\x14\x58\x87\x28\xba\x1b\xa9\xde\xb1\xd8\x44\x10\xc7\x1e\xc5\x69\xca\xf1\xdb\x66\x34\xc3\xdc\xa5\x2f\x30\xa3\x12\xd0\xcd\xa9\xd0\x88\x05\xbd\x98\xa7\x8d\x17\xb9\x24\x88\x88\x7f\xad\x1e\xda\xc5\xa1\xac\x3e\xf0\x4d\x99\x7a\xc8\xb1\x24\x48\x98\x27\xbc\x39\x5d\xc3\x49\x8c\x30\x19\x2e\x13\x88\x07\x76\x07\x0b\xad\xb3\xe2\xd9\x2a\x69\xf8\x9f\x98\x10\x16\x63\xc8\xb6\x13\x75\xf9\x22\xba\xbf\xa6\xa9\x08\x3b\xbf\x41\xd8\x98\x5b\x51\x37\x63\x0c\x73\x42\xb4\xf0\xea\x63\x2b\x64\x9c\x9f\x39\x81\xb1\x84\x80\xc5\xcd\xda\xdb\xea\xb8\xf0\x97\xaa\xa2\x09\x71\x0a\x29\xab\xa7\xc5\x57\x74\x3d\xf2\x5f\x45\xc1\x44\xb6\x7a\xf3\xa6\x47\x0d\xa2\x84\x05\x0a\xb5\x70\xeb\x32\x7f\x3a\x5e\x97\xef\x05\x7a\x3e\xa3\x2e\x88\x8b\x96\xc7\x37\x9b\x69\x6b\x01\xb1\xcd\x8a\x67\x47\x8e\xdc\x41\xdd\x10\xee\x4f\xc8\x63\x8d\x22\xfc\xbb\xc7\xdb\x76\x46\x9f\xbf\x11\x09\x37\x0c\x41\x12\xd3\x53\xa4\xfe\x14\x21\xe7\xc8\x2b\x37\x42\x35\xbd\xa2\x15\x4b\xc2\x94\x60\x18\x23\xb0\x98\xb5\x97\x83\x6a\x56\x12\xc5\x06\x59\x62\x55\x99\x83\x15\xd0\x75\x07\x12\x19\x5a\x89\x5e\x74\x81\xda\x2f\x6e\x6f\x37\xcb\xc5\x6e\x75\x6d\xc9\xc9\x8f\xdf\x3b\xb4\x4a\x22\x78\x84\x7d\xc6\x76\xe4\xee\xeb\x0c\x2e\x2c\x11\xc0\x11\x45\xd4\xf5\x9d\xaf\xb3\xba\x7c\x2f\xee\xcb\x8e\xc1\xd6\x33\x03\x58\x22\x43\x83\x31\x40\x59\x65\xcf\xfd\xf5\xc8\x88\xa3\x48\x64\x9b\x3a\xef\xca\x3b\xe8\x1f\x85\x54\x3a\xf2\xec\x25\x0b\xb9\x5e\x23\x7b\xce\x64\x97\x1a\x43\x89\xe2\x2c\x88\x07\x2c\xc1\xa5\xc8\x5d\x59\x95\x0f\x5c\x1f\x49\xf4\x8f\xd9\x45\xfc\x73\x48\x6e\xa2\x03\x8e\xef\xd5\xf6\x90\x8d\xb4\x17\x58\xa2\xa9\x41\x3c\x96\x25\x72\x5f\x43\x0e\x73\x78\xb4\xe9\xe9\x52\xdb\xd4\x46\xf9\x04\x78\xed\xf2\xa7\x44\x0b\xea\xb6\x65\x55\xb6\xa9\x20\xc2\x1d\x7a\xc1\x02\x96\x68\x69\xb5\x5e\xd7\xcb\xcd\x7e\xd7\xc3\xc2\x12\x88\x0c\x3e\x8e\x3b\xd4\x1d\xb0\xb6\x1f\x9f\xff\x24\xc3\x94\xea\x45\xf6\x2e\x32\xb1\x7e\xf5\xdf\x99\xbd\x2b\x31\x3c\x88\x45\xd7\xe2\x6f\x53\xb2\x0e\xbf\xf4\x8b\x65\xc6\x44\x16\xbc\xd5\x66\xa0\xbd\x11\x4a\x37\xb3\x4d\x1c\x44\xfd\x35\xef\xca\x63\xa6\xe6\x8b\xcc\x76\x7c\x1a\x70\x21\x6c\xbb\x3c\x2b\x9c\x21\x87\x3f\x92\x5a\xca\x83\xf3\x13\xe1\xf3\x93\x2a\xa5\x01\x24\xa6\xd3\x5c\xb9\x14\x10\xa3\x35\x25\xb6\x16\xdc\xcf\xbd\x3a\xc3\x24\xa7\x34\x51\xc8\xb2\x6d\x5e\xb2\x4a\x0f\x8b\xcf\x29\x85\x10\x5f\x57\xa8\x66\xf8\xce\x6e\x0c\x0b\x02\x1a\xf4\xf5\xdf\x65\xd9\x26\x12\xb6\xb8\x5c\x75\x4c\x58\x96\x32\x15\x78\xb7\xb0\x1b\xf1\xff\xe3\xec\xcd\xb6\x1b\xc7\xad\xfd\xe1\xd7\xe9\x8b\x5c\x90\x98\x48\x5e\xca\xb2\x5c\xa5\xd3\x9e\x22\xc9\x5d\x7d\x92\x95\xa5\x85\x61\xc3\xe6\x31\x45\x2a\x24\x65\x97\xfb\xe9\xbf\xc5\x0d\x80\x93\x64\x57\xff\xbf\x9b\x54\xda\x84\x24\x0e\x20\xb0\x87\xdf\xa0\xea\x5c\x7f\x72\x59\x2c\x02\xdc\xbf\xd7\xf7\xbb\xb1\x71\x38\xcd\x38\x49\xd5\x98\xdd\x13\x40\x9a\xcb\xaa\x2a\x4c\xd5\x87\x32\x99\x20\x4c\xaa\xfe\x09\x6f\x5b\xf9\x3a\xbf\x5e\x21\x13\xeb\xcf\xf8\x9f\xa7\x5c\xbf\x5e\x9d\x3e\x1e\x65\xfb\x32\x96\x90\xa6\x59\x42\x32\x84\x78\xe5\x65\xd3\x76\x4b\x71\x3d\x72\x5e\x0e\x43\xa4\xc5\x04\xef\xb1\x90\x1f\x79\xf9\xec\x92\xc6\xfe\xa0\x75\xa2\xc4\xef\x00\xaf\x0f\x25\x0c\xea\x55\x34\x4b\x23\x12\x00\x6c\xdd\x5e\x72\xe3\xb3\xf3\xf5\xac\xf4\x98\xa5\x22\xce\xa8\xd3\x2c\x44\x9c\x31\x8e\xba\xd8\x47\xcd\x52\x88\xb0\x2e\x68\xba\xbd\x69\xfa\x25\xa0\x95\x27\x06\xdd\xc9\x9f\x8f\xb2\xd6\x50\xcc\x3a\xbf\x59\x46\xb9\x56\x41\xe0\xb3\x7b\xa5\xd7\xe5\x5d\x5e\x9e\x7a\xfd\x4c\x9a\x65\x49\x84\x64\xdb\x85\x31\x5d\x70\x9f\xb7\x2d\x40\xb7\x05\xa1\x75\xd3\x27\x4f\x32\x4b\x45\x68\x9a\x05\xb0\xf6\xb8\x9a\x95\x65\x46\x5b\x47\x06\xcb\x4b\x34\x5b\xf2\x76\xe1\x97\xdf\xbf\x2c\x33\x26\x71\x08\xf8\xfa\x0d\xea\x55\x69\x50\x63\x29\x88\x2b\x8d\x6a\x46\xe7\x0b\xe8\x14\x9d\x34\xe7\xd1\xce\xfc\xd2\xe7\xa8\x8f\x49\xe9\x3b\x93\x2c\xc1\xfa\x85\xe7\x9b\x77\x4b\x6b\x8e\x5c\x2b\xdc\x01\xc7\x4b\x4d\x26\x13\xa7\x77\x61\xe0\x50\xcd\x8e\xa4\xc6\x39\x55\xe2\x8c\x79\x84\x23\x38\x1e\xd2\x64\xbe\xab\x84\xca\xe0\x80\xd8\xbe\x14\xd0\xce\xa7\xb1\x4a\x52\xac\x96\x7a\x3a\x8a\xd3\x50\x3e\xeb\x0e\x66\xca\x6a\xac\x2e\xef\x76\x8b\x50\x26\xc8\x74\x24\xb1\xb3\x15\x64\x2c\xc3\x9f\x09\x0d\x73\xe5\xb1\xae\x5a\x87\x5f\xbe\xa9\xea\xbb\x8f\xa7\xf2\xe8\xfe\x00\xc6\x9d\xf4\x27\xc8\xf5\x4c\x1b\x27\x13\x75\xfd\xfc\xf3\x1a\x0e\xa7\xba\x96\xcf\xb0\x81\x63\x55\xb7\x5f\xc8\xd7\x4f\xe7\x8d\xa1\x52\x07\x97\xe3\x3e\x93\x0c\xa7\x68\xd2\x04\xa9\x0d\xfb\x63\xd5\xb4\x7f\x04\x88\xef\xdf\xd1\x3a\xa0\x99\x81\x34\xca\x42\xb1\x72\xd0\x43\xa4\x19\x44\x31\x62\x28\x2a\x7c\x92\x9f\xba\x37\x4d\xbf\x0d\x18\xc5\xb2\xc5\x3b\xe4\x8f\x9e\x9b\xeb\xaa\x67\xb3\x57\x13\x24\x73\x04\xcb\xea\xe0\x49\xf3\xbe\x38\x95\x59\x45\xb1\xa6\xf9\xf0\x2e\xcb\x21\x20\x41\x41\x77\xd7\xcf\x7e\x45\x55\xcc\xa5\x6c\x5e\xb6\xd2\x0e\xc7\x33\xca\x7d\xfa\xeb\xaa\xf0\xe3\xb9\x25\xbb\x40\x91\x0c\x54\x15\x24\x91\xce\xa1\x1e\x32\x32\x3a\x4a\x1d\x94\xb0\x0b\x85\x16\xd6\xe6\x45\x3e\xac\x50\x92\xd8\x34\xf5\xaf\x6e\x5b\x1d\x67\x72\xd6\xdd\x61\x89\x97\xbe\x0a\x50\x9e\xc9\x6b\xe7\x07\xd1\x98\xe3\xdd\xbe\x5d\x4d\x5a\xe0\x92\x12\x8b\x19\xb4\xa3\xe2\x5d\xa8\x10\x48\x9a\xa4\x58\x76\x96\xc6\x7c\xaf\x4c\x81\x5a\x63\xaf\x9f\x20\x91\x25\x8b\x5c\xfb\x15\xbd\x68\x7b\x77\x63\xf4\x40\x57\x9e\xb1\xd0\x65\x47\xd8\x20\xba\xbd\xe8\x1a\x1c\x0a\x6a\x92\x71\x81\xe5\xf5\x2d\x04\xd3\x97\xef\xb2\x34\x73\xfe\x36\x95\x9c\x64\xc1\xa5\x7c\xe7\xe1\x4a\x50\x3f\x56\x55\x31\x7e\xba\x92\x67\xdc\x3a\xcc\xee\x51\x7e\x20\x5f\xf3\xf2\x05\x70\x99\x19\x17\x91\xe0\xfd\xa8\x4f\x4d\x0b\xfd\x83\x10\x99\x74\xde\x2a\x37\x55\x0d\x5a\x36\xdd\x3a\x39\x95\xd8\xa2\x32\xa5\x8e\xcf\x39\x5e\x5c\x65\x16\x8b\xd4\x19\x8f\x4e\x1a\x05\x32\x8b\xad\xf7\xc6\x6f\x3d\x83\x65\x64\xe5\x36\xdc\x9a\x33\x07\xa6\xfe\x26\x65\xdc\xc1\x4d\x9a\xd3\xb1\xbb\xe8\x77\xa8\x6f\x4e\xc5\x75\x2d\x9f\xab\x72\x9c\x9d\xca\x4c\x10\xeb\xf7\xfb\xa7\xd2\x40\xfd\x5c\x4b\x73\x0a\x32\x09\x9f\x59\x15\xfe\xba\x74\xe6\x83\x64\xc1\x26\xed\x01\x99\x65\x31\x6e\xa9\x01\x84\x77\x2d\xf3\xd9\x94\x97\x34\xc2\x16\xf3\x95\xac\xeb\x8f\xa7\x36\x2f\xf2\xf6\x63\x54\x13\x96\x92\x6b\xe7\xfe\xb2\xde\xdd\x3f\xec\xa6\x0d\x4f\x29\x95\x54\x9e\x97\x50\x54\xfa\x75\xb6\x07\xcf\x1e\xa8\xd4\x06\xb1\x5b\x88\xf3\xbb\x95\x0a\x42\x9b\x5b\x2a\xcd\x83\xf8\xd7\xf6\xa4\xfa\xad\xc3\xdd\xb7\xe9\x2f\x6a\x2a\x7c\x87\x2e\x88\xc3\x5c\xec\x61\x49\x4d\x33\x54\x8c\x2d\x70\x6e\x38\x33\xc2\x70\x88\x47\xcc\x21\x3b\x30\x80\xf9\x39\x99\x34\x3a\xd1\x58\xb4\x5c\xfd\xb1\x5b\x7e\xd1\x94\x90\xc6\x7a\xc6\xf6\xe9\x70\x5c\x94\xe6\xfa\xd4\x37\x11\x25\xd8\xd4\xc9\x3e\xe3\x72\x5a\x15\x6f\x7d\x09\x4f\xda\x88\x20\x8c\x54\x7b\x08\xd5\xec\xa4\x2d\xa5\x88\xe2\xd5\xb2\x36\xd7\xb5\x7c\x9f\xcc\x50\x9b\x02\xd2\x5a\x0f\xf2\x43\x81\x03\xf0\x4f\x8f\x2b\xe3\xc5\xed\xf0\x95\xf7\x77\xe7\x02\xda\xe9\xd2\xff\x0b\xdf\x61\x21\x10\xed\xae\xaa\x3e\xe6\x53\x31\x73\x3c\x8f\x3a\x7f\x7e\xe9\x72\xe5\xc9\x87\x54\xcc\xb9\x9f\x63\x53\xd5\x71\xaa\x62\xe1\xea\x75\xeb\xd7\x53\x2d\x31\x94\xbf\x78\x33\x55\x6c\x18\xba\x2d\x04\x02\xc4\x65\x18\x9a\x22\x31\x71\xb3\xed\xa4\x7a\x28\xc9\x7c\x84\x4e\x5d\x68\x81\x86\x47\xbb\x97\x1a\x9a\x97\x5e\xfc\x84\x2a\xc2\x44\x02\xbd\x31\xc1\x19\x48\x47\xd1\x08\xf0\xe5\x34\x15\xda\xbb\xd4\x9e\x8c\xb2\x44\x1d\xfb\x5e\x77\xe4\xab\xda\x6f\x3c\x35\xa3\xa6\x8a\x4a\x2a\x82\xc8\x74\x55\xd7\xd0\x1c\x2b\x2f\xad\xd6\xc2\x33\xd4\x6e\xa7\x9a\x68\x02\xcc\x6e\x0e\x55\xce\xce\xff\x8f\xbc\x39\xc9\xe2\xa6\x32\xa6\xdb\x55\xfb\x17\x54\x31\x99\x60\x15\xef\xf7\xf5\x6e\x5c\x34\x51\x4c\x0b\x2c\xb0\xed\xdd\x86\x32\x71\xd5\xb9\xa4\x31\x36\xfc\x22\xe7\x09\x42\x68\xcc\x16\xda\x45\xad\xf2\xb6\x96\xf5\xc7\xb9\x63\xdc\xb8\x00\xa9\x44\x66\x53\xef\xa6\xf1\xe8\x51\x82\xf9\x2f\x52\x6a\x95\xc4\x16\xe5\x1e\xae\x65\x15\x67\x51\xec\x84\xe9\xa7\x0f\x34\x81\xc4\x19\x10\x19\xe3\x1e\x42\x71\x81\xd3\xa1\x52\x9a\x22\x9d\x51\xa2\x59\xda\xcc\xe9\x83\xaa\x14\x9c\xeb\x7e\xde\xdc\xa1\x41\xe4\xc5\xfe\xa8\x92\xd4\xc6\xae\xc8\x84\xbc\xa8\xb3\x28\x67\x7c\xb5\x52\x0a\x2c\xe5\xf6\x56\xea\xeb\xee\x7d\x3e\x40\xf7\x9f\xdb\xb1\x10\xcb\x25\x10\x9c\x52\x54\x82\xf3\xae\x0c\x6c\xf4\x45\x5d\xcf\xcc\x52\xa9\x52\xd2\xa2\xf2\x3d\x02\x16\xae\xf2\xda\x38\x6e\xaf\xd3\xdf\x9a\x7e\xa1\x4e\x12\x67\xab\x0e\xd5\x35\xbc\xd9\xde\xe7\x92\x2a\x9d\x09\x2b\x27\x82\x52\xb3\x5f\xd1\x5e\x91\xef\x78\x2a\x8a\x4d\x35\x83\x66\x29\x13\xc5\xcc\xcb\x1f\xae\x36\xd7\xab\xdb\xdd\xc2\x29\x1e\x84\xc3\x31\x43\x86\xff\x21\x2f\x5b\xaf\x6a\x87\x60\xb0\xcb\x89\x8f\x32\x24\xc1\x4e\xf3\xfa\xe1\x1d\xfe\xb7\x3a\xf5\xdf\xc2\x2c\xc6\xb5\xc1\x27\xf4\xf9\x2b\x89\xe7\x19\x30\x6d\x1c\xe2\x29\x93\x45\xf8\x45\x75\xae\x5f\x10\x4f\x82\x08\xa1\x5d\xe5\x4f\x6d\xfe\xb2\x43\x64\x71\xa9\xbf\xdb\x3e\x06\x08\x94\x02\x65\xc0\xd9\x61\xd4\xc7\xca\xa5\x0d\x33\x32\xb2\x8e\x92\x24\xd6\x83\x13\x6e\x73\x49\x2d\x83\xea\x58\x08\xff\x45\x87\xe3\xa9\x85\x55\x69\xaa\xf7\x4b\xb8\xe0\xcb\x41\xb4\x8e\x33\x40\x08\x4d\x2d\x5b\x08\xed\x63\x4d\x74\x9f\x9f\x7b\x3b\x89\x2d\xa2\x84\xa6\xab\xae\x26\xbe\x0b\x7f\x90\x3f\xd1\x50\x36\x7c\x9c\x12\x40\x5f\x12\xd7\xd0\xf7\x26\xb2\xd3\x99\xa4\x69\x9a\x89\xa1\xf0\x2b\xf7\x41\xaf\x92\x6a\x46\x19\xf8\x23\x4e\x44\x03\x2b\xe2\x97\xcf\x9e\x49\x83\xd1\xd9\x5b\x0e\xef\x77\xf2\x27\x9a\x53\x84\x94\x59\xf3\x38\x75\x6d\xcd\xe6\x1e\x26\x3b\x9c\xe6\x09\xd5\x91\x27\x77\xbe\x74\x2b\xef\x18\x4c\xa3\xb9\x74\x82\xee\xef\x58\x00\xf6\x3a\xa3\x3d\xa3\x48\x0b\x96\x70\x3d\x60\xac\xa6\x0d\xc7\x5f\x27\xbd\xe1\x5b\xb2\x0c\x73\x8c\x26\xff\x0b\x1e\x2c\xc2\x3c\xfd\x91\x44\xcb\x94\x05\x82\xe6\x55\x5f\xf6\xd4\x09\x44\x18\xce\x2f\x8c\x71\x31\xaa\xf9\x44\x69\x62\xfa\x32\xe8\x54\x45\xb8\x9d\x4b\x63\xba\x18\x36\x7f\x2e\xd1\x0b\xf5\x32\x43\x59\x67\x44\x21\x95\x1e\x46\x42\x74\x6e\xd1\x08\x03\x98\xc4\x85\xb2\xef\x7e\x79\x4c\x61\xbf\xfd\xd3\xff\xfc\x9b\xfe\x27\x0c\xe6\x4e\x03\xec\x4e\x96\x27\x8b\xf0\x63\x5f\x55\x1f\xbf\x4e\x3a\x4b\x35\x6e\xb7\x23\x5e\xfd\x3f\x4f\x72\x16\x1f\xea\x4c\x09\x8c\xb2\xb7\xdf\x76\x67\x26\x5b\x54\x4b\x6e\xb0\x07\xb1\x5c\xff\xb5\x83\xbf\x66\x3f\xa0\x62\x07\xd1\x77\x15\x66\x59\x8c\x8a\xe5\x5a\x0b\x83\xe4\x5b\x57\xd5\xaa\xea\x43\x37\x1d\xe7\xaf\xa2\xce\x62\x4c\x99\x5a\xd9\xbc\xf6\xed\xfc\xcb\x53\x52\xcb\x0c\x5f\x28\x94\x04\x09\x9f\x37\x84\x20\x3e\x0b\x21\xf0\x87\xbc\x74\xf0\xcf\x6a\xae\x92\xa2\x8d\x51\x28\xe3\xf8\x5c\x15\x66\x57\xad\x4e\x21\x98\xd7\x90\x25\x58\x21\xec\x8d\x3a\x6f\x82\x9d\xbe\x1f\x60\x4d\x92\xf9\x92\x16\xb6\x54\xab\x7a\x9c\x8d\x98\x28\x31\x58\x00\x7f\xa9\x4e\x75\x33\x3d\x92\x26\x92\x8c\xbc\x5f\x28\x9d\xdc\x3b\x13\x19\xc0\x0e\xb8\xaf\x54\xcc\xee\x8c\x89\x49\x8c\x81\xce\x20\x7e\xf6\x46\xcf\xb5\xcf\xa8\x89\x53\xc8\xc8\xf0\xd6\x38\xba\xf4\x64\xea\x19\x42\x20\xa4\xd5\xab\x9b\xb9\x8b\xc8\xe5\x9d\xdd\xd0\x38\xa1\xd2\x9b\xaf\x3d\x63\x3d\xc8\x91\x10\x3e\x35\x7a\x9c\xdc\x6f\xc3\x44\x82\xc5\x92\xab\xdd\x72\xf7\x7b\x08\x68\x0c\x4b\x55\xdc\xdd\xec\xbf\xaa\x83\xca\x27\xa9\x9e\xe1\xb1\xc1\x10\xd4\xb5\x56\x2a\x7b\xa4\xa6\x3f\x44\x12\x34\x03\x76\xe5\xe0\x79\x2d\x3b\x0c\x4a\x09\x9f\xd8\x41\xf7\x4a\x5d\xd3\xf9\x6c\x78\x16\xa5\x5e\xdf\x5f\x1e\x3f\x4b\x5d\x0d\xd7\x1c\x4b\xbf\x41\xf3\x66\x29\xbd\xb7\xd4\xec\xdb\x44\x94\x65\x91\x97\x17\xb8\x0c\x8e\x36\x22\xd5\xb8\x81\x1f\x6b\x6c\x63\x3a\xbf\x8a\x99\x04\x37\x35\x09\xcf\xdc\x44\x76\x80\x87\x89\xe2\x15\x35\x89\xb0\x58\x9b\xbb\x5e\xfd\xb1\xba\x7d\x78\xdc\x2f\x17\x8f\x08\x06\xdf\x3c\x3c\xdd\x5f\xf7\x83\x32\x67\x05\xfb\x22\x9b\x97\x20\xd1\x71\x71\x2d\x32\x89\x16\xca\xfa\xce\xad\xac\xf5\xcb\x75\xfe\x36\x55\x45\x30\x69\x6c\x10\x3b\xef\xfc\x9f\xc6\x29\xdd\xec\xbe\xa7\x4c\xe1\x8e\x56\x79\x79\xc8\x7d\x09\xef\x1b\x59\x9a\xea\x70\xbd\x75\x7e\xb5\x67\xb8\x8a\xbe\x2d\x34\xdc\xa3\x54\x70\x18\x74\x46\x6e\xea\xea\x10\xbc\x69\xc3\x80\x94\x79\xc9\xe8\xe6\x08\xe5\xc8\xf2\x83\x9a\x2c\x72\x6b\xd0\xf7\x0a\xb9\xf9\x6b\xdd\x53\xdf\x4c\x16\x83\xf4\x0d\xce\x9b\xda\x61\x8d\xe4\x4c\xb9\x6d\x76\x22\x99\x88\x90\x4b\xa6\x4e\x75\xb9\x2f\xaa\xa6\xbf\x21\x99\x71\xb2\xfd\x08\xdd\x40\xa0\xe7\x6f\xd3\x0f\x5a\x93\xb0\xde\xd6\xea\x54\xc8\xbc\x86\xbd\x07\x79\x84\xd6\xa4\x91\xb1\xc1\x42\xbf\xeb\x63\x43\x5d\x5d\x50\xa9\x99\xde\x5e\xc9\xb4\xf5\xe5\xaa\x2e\x78\xac\x5b\x30\xbe\x71\x6c\x67\x1c\x6b\x23\xad\x92\xa4\x4f\xc1\x8f\xd5\xac\xf7\x6c\x54\x92\x04\xb7\xbc\x7d\x77\x6b\xf7\xb2\x4b\x0c\x9a\xfd\x20\x2d\x49\x8d\x8e\x09\x36\x57\x91\x53\xfc\x58\x57\xdd\x82\x3c\xfb\x1a\xc3\x62\x6c\xb7\x3b\xb5\xa9\xab\x8f\xa5\x63\x6b\x4e\x26\x5a\x18\x9a\x50\xd4\x96\x29\xab\x36\xb7\x1f\xb7\xf0\x2c\xf5\x47\x40\xc4\x4c\xcf\xdd\x64\x0c\x55\x41\xe6\x45\x51\x63\x32\xa7\x49\xd9\x9c\x0e\x87\x95\xd6\x45\x1f\x84\x18\x20\xce\x5e\x7c\xe3\xf5\x7a\xb6\xad\xb4\xf6\xb7\x8b\x0d\xb2\x49\x8c\x69\x40\x38\xd1\xd9\xe5\xf7\x6f\x4f\xdb\xeb\xc7\x4d\xaf\xc8\x47\x8d\x55\x4a\xab\x00\xd6\x7f\x85\x72\x2c\x1a\xfb\x75\x63\xcf\x58\x90\xd8\xb3\xaa\x7a\xcc\x2f\x44\xc4\xd9\x32\xdc\x74\x3b\x73\x79\x0b\xd2\x0c\x5d\x7b\x88\x23\x82\x01\xff\xd8\xee\x2f\x1c\xe2\x19\x0a\xd7\x2e\x76\x3b\x54\xd7\xde\x3e\xdd\x2d\xae\x6e\xc3\x49\x02\x61\x0a\xfb\x7c\xdd\x92\xf3\x87\x3c\x15\xed\xe0\xea\x48\x81\x5a\xed\x48\xfe\x6d\x75\xec\x62\xdb\x87\xf2\x1e\x7e\xb6\xe3\x20\x12\x18\x11\x18\xc3\xdf\xad\xef\xf7\x3f\xd6\xbb\xef\xd7\x9b\xc5\x8f\xfd\x8f\xd5\xba\x3f\x4e\x89\x17\xdf\xb2\x79\x51\x7c\xcb\x6d\x3b\x1c\x51\x0a\x82\x32\x71\x33\xf5\x7f\xa1\xc0\x94\x65\x3d\x84\x11\x50\xfc\xa4\xbd\x04\x1c\x9f\xde\x38\xe0\x54\x60\xf3\xf1\x20\x7f\x0e\x18\xb8\x70\x2c\x73\xdd\x84\xf7\x5e\xa4\xd9\x1f\x10\x89\x42\xcc\xd7\xfa\xf1\x66\x3b\x8a\x39\x20\x89\x39\xe2\x7d\x9b\x77\x79\x5c\xe8\x36\x7f\xcb\xdb\x8f\x50\xe9\x0c\x43\x8c\x40\xd6\x89\x97\xc5\x41\x64\xde\x20\x9d\xd1\x5f\x4d\xca\xb4\xc9\x3c\x61\x2e\x7c\x34\x13\x71\x78\xc7\xbb\xbb\x7a\x9d\x97\xb9\x2f\x2f\xac\xfb\xbb\x9b\xc9\x08\x83\xcc\x6e\xdb\x1e\xad\xef\x20\x23\x88\x7a\xfa\xf1\x45\x83\xd4\xf3\x8a\x64\x37\x63\xa2\x41\x74\x1c\x8b\x00\x61\x4a\xfe\xe2\xae\xaa\x88\x61\x87\xca\x84\x9a\x16\x28\x4a\xd1\x69\xd4\xbd\x8c\xd7\x20\xdb\x17\xef\x1f\x39\x06\x44\x82\xa2\x5a\x90\xa0\xb8\xfe\x65\x88\x00\x26\x8a\x11\x8b\x0b\xba\x6a\xd0\xd1\x69\x3c\x11\x0d\x63\xe8\x64\x00\x3f\xdb\x5a\x8e\x3b\xaf\x60\x64\x12\x2a\xf0\xb8\x18\x74\xc1\x11\xfd\x6d\xf6\xd5\xd2\xd9\x63\xdb\x1a\xe0\xaf\xb3\xd4\x0c\x8c\x02\x04\x8a\x2d\xbf\xaf\x6e\x97\x0f\xeb\x10\x5f\x00\x28\x8a\x7d\x37\xac\xdb\x6d\x2e\x34\xd8\xc3\x38\x1d\x5b\xff\x9e\xe3\xa3\x1f\x97\x62\xc7\x6b\x05\x58\x65\xb0\xd4\x7e\xfd\xb8\xd6\xd5\x8f\xd9\x2c\xb4\x91\x52\xb8\x92\x54\x67\x7e\x93\x7f\x43\xed\x3b\x00\x19\x2f\x6d\xd0\x36\x56\x02\x63\xe7\xdb\x93\x7e\xfd\x98\xaa\xc3\x59\x92\x28\x67\x91\xee\xaa\x42\x0f\x6f\x50\x17\xb6\x7a\x3f\xc7\xee\x58\x22\x0d\xc6\xb6\xab\x9f\x6d\x0d\x87\x49\xbc\x65\x89\x92\x24\x68\xd1\x99\xfc\x8d\x70\xb1\x8f\x49\x7a\xf5\x31\x44\x96\x96\x58\x89\x08\xe3\xdd\x4b\x30\x55\x08\x47\x28\x11\x3c\x0b\xbb\x12\x96\xda\xfb\xd8\x27\x8c\xa0\x0a\x91\x32\x6e\xb6\x6d\xe5\xb9\xec\xe3\x74\x32\x59\x46\x1d\xb6\xfd\x19\xda\xd5\xc1\x79\xc9\xfd\x4f\xa5\x3e\x49\xbd\x2c\x37\x06\x4d\x1d\xd6\xcb\x07\x8c\xa4\x3e\x4b\x1a\xac\xa0\x90\x78\x64\xf3\x15\x94\x70\x86\x1e\xb3\xc2\xba\x2c\xc5\x4b\x6f\xcd\x3c\x7b\xbe\xd6\xf8\xb0\x89\xd6\x59\x36\x2e\x99\x5d\xac\x4b\xd9\x94\x08\xa7\xd4\x54\xd5\xad\xad\x8a\xbc\xda\x9e\x0e\x07\x39\x14\x47\x67\x17\x97\x32\x8d\x24\xb5\x43\x5e\xa2\x30\xed\xe5\x10\xd5\xa6\x3c\x42\x6e\x6b\x79\x3a\x4c\xf7\x16\x9b\x42\x86\xb4\xd1\x03\x98\xfc\x74\xb8\x0b\x52\xe7\xd4\x4a\x96\x20\x40\xb1\x4b\x27\xbe\x75\x99\x50\x2f\xc0\x3a\x80\x5d\xad\xb4\x49\xea\x06\x3d\x3f\x83\x59\xa0\x5b\x38\x9c\xa9\x54\x53\xab\x88\x83\x2f\x3f\x3b\x05\xcc\x45\xdb\x4a\xfd\x3a\x92\x4e\xfa\x72\xf1\xb0\x9a\x68\xac\xbe\xbf\x23\xd3\x67\xdd\x5c\x8f\x26\x8f\xe6\x80\x6f\xdd\xde\x03\x72\xba\xdd\xcb\x31\x82\x9a\x9b\xbc\x17\x30\xa7\x16\x22\x42\x07\xf9\x94\x33\x25\xff\x7f\xff\x67\x84\xe1\xb5\xc0\x08\x4b\x7b\x37\xe9\xa7\x75\xd9\x4e\x0a\xb7\x61\x94\x74\xc6\xfa\x63\x2f\xb8\xed\xfe\x6e\xf1\x67\xff\x9b\x92\x5a\xed\x2d\x76\xab\x3a\xf4\x69\xe7\xad\x51\x0b\x2a\x46\x90\xd5\x4d\x55\x6b\xe8\xd6\xd2\xef\x50\x1c\xe7\xb5\x1a\x6b\x29\x30\xe9\x90\x18\x50\xb7\xf7\xf0\xfe\x14\x40\x87\xe7\x0a\x9a\x5f\xae\x23\xdd\xf0\xe1\x52\xad\x75\xcc\xaf\x63\x0d\x6f\x79\x75\x6a\xe6\xe5\x0c\x1c\xc6\xa2\x88\x38\x26\xaf\xcb\x89\xfb\xd7\x9b\x45\x91\x60\x18\x8d\x1f\x91\x42\xf9\x58\xc3\x7a\xf7\xb0\xf7\x7e\x68\xeb\xb2\xef\x44\xb2\x28\xca\x94\xd3\xdd\xae\xde\xa1\x7e\x3a\xd3\xd1\x99\x3c\x72\x16\xc5\x2c\xf1\xc2\xed\xb9\x82\xc7\xa0\x8f\x35\xbe\x23\xdd\x18\x83\x05\xa4\x77\xc8\x1d\x93\xd9\x39\x9c\x85\x1f\x8c\x53\x87\x65\x75\x08\x98\x4d\x55\x0c\x5a\xba\x43\xd7\xf3\x1f\xb3\xaf\xd4\x29\x41\xfd\xec\xc5\x6a\x39\xb9\xcc\xd8\x70\xc4\x0f\x75\x6f\xc3\xea\xe7\x94\x6d\xd8\x8f\x01\xc7\xe2\xf7\x4a\x75\xc5\x09\x01\xfc\x97\xaf\x8f\x70\x82\xd9\x6d\x50\x65\x79\xc0\xe6\xe9\x17\xc8\x0f\x16\x51\x48\x9d\x41\xb7\x6c\xf2\xb2\x0a\x3f\xca\x98\x46\x48\xca\x3e\x2f\xdf\xaa\x57\xf0\xca\x7a\x33\xc2\xce\xdf\x9a\x17\xc3\x2f\x71\xe1\x8c\x3a\x71\x51\xd9\x7c\xd1\x18\x63\x11\x57\x0c\xab\x8c\x01\x86\x34\x71\x0f\x66\x11\xd7\x49\xea\x85\xff\x83\xed\xc4\xc5\xc5\x97\x45\xdc\x80\x03\x8e\xa1\xb4\x42\x97\xd8\x62\x6f\xb1\x3f\x6a\xf1\xda\x0b\xa7\xc0\x1e\x42\x28\x16\x09\xe2\x34\xb5\x0e\x48\x45\xc9\xcb\xe7\xb1\xd0\x0a\x8b\x84\x70\x1c\x52\x97\x9a\x62\xc3\x69\x51\xcc\x85\x2d\x59\x24\x24\xc8\xde\xda\x17\x61\x89\xbf\xde\x78\x59\x24\xb4\x0b\x3c\x1a\x84\x40\x76\x71\xfb\x33\xdc\x00\x8c\x96\xb5\xd9\xaf\x00\xc1\xaa\xde\xfd\xd5\xea\x76\x32\xb9\x12\xa6\x22\x1a\x62\xc5\xf6\xbd\xaa\x5f\x31\xd2\x08\x47\x13\x8d\x42\x0f\x5e\xf8\x09\xbb\x7d\x67\xee\x02\x2c\x4a\xa4\x48\x47\x45\x81\x1b\xc7\x9e\x99\xca\x47\xb3\x28\x01\x99\xa5\x01\x07\x55\xbf\x42\x8b\x15\xb2\xb9\x12\x31\x8b\xd2\x98\x22\x17\x43\x0e\x85\xb2\xb3\x21\x94\x61\x84\x7f\x97\x9b\xb2\x5b\x69\x87\x32\x21\x8b\xb2\x28\x52\xa9\xe7\x17\x74\x41\x07\x0e\x38\x67\x19\xb0\x28\x4b\x62\x11\x74\xb7\x1d\xb0\x2b\x38\xf5\x8c\xc6\x64\x82\x8c\xbb\xda\x5d\x88\x22\x2f\x78\x27\xb0\x2e\xb9\x47\x49\x9c\x41\x1b\xca\xbb\xbb\x4e\xbf\x50\x76\x4f\x2e\x78\xbd\x8d\x0a\x81\xcb\xf1\xd4\x91\x29\x91\x53\xc7\xb9\xe5\x6e\x7b\x1e\x7f\xcf\xa6\xb1\x94\xae\x96\xe5\xd8\x25\xf9\xe1\x74\xf8\xa3\x42\x15\x40\xb4\xb8\x9a\x9d\x87\x22\x19\x92\x6a\x01\x29\x02\x4e\xb9\x71\x16\xbf\xb2\x48\x29\x67\xeb\xd6\xdd\x21\xe7\xed\x30\x46\x5c\xb2\x48\x81\x0c\x17\x33\xa2\x49\xad\xcd\x68\x9f\x66\x91\x8e\x39\x5a\x18\x63\xdb\x1e\xe6\x0f\x41\xc7\x09\x2e\xa4\xcb\xcd\xc3\x8f\xeb\xfd\x8f\xd5\xea\x77\xb6\x7f\x5c\x6d\xd6\x0f\xfd\xe2\x6d\xa2\x04\xb1\x1e\x0b\x73\x70\xbd\xe8\xfd\x66\xb5\xb8\xbe\x5b\x8d\xab\x94\x2c\x32\xdc\xe1\xbf\x6f\xaa\xaa\x0f\x17\x2e\x42\xe3\x7e\x15\xf7\xf6\xdf\x07\x88\xcf\x59\x14\xc7\xaa\x9f\x5a\x26\x21\xe0\xb8\x84\x18\xec\x8e\xc0\x26\x2c\x32\x52\x31\xbf\x99\xd9\xfc\x27\x98\x21\xdd\x63\x91\x51\xd6\x91\x97\x70\x9d\x7c\x18\x2d\x2e\x06\x32\xac\x9e\x1e\x6b\x74\x4a\xbb\x50\x72\x63\x91\xb1\x0c\x71\x13\x63\xfe\xd5\x27\x4b\x22\x28\x27\xc4\xe1\x02\x92\xa6\xb7\x1a\x0b\x5f\x65\x23\x02\x51\x70\x60\xf4\x44\x5d\xef\x14\x78\x81\x75\xd5\x8d\x17\xc2\x15\x82\xf0\xf4\x6e\xc1\x8c\x16\x58\x9b\x72\x6c\x4f\x5d\x75\xaf\x7d\x3b\xb9\x19\x56\x42\x06\x83\xea\xc0\x55\x55\x35\x2d\xd4\xff\x3c\xc1\xcc\xe0\x97\xc5\x11\x4f\x70\x11\xdd\xf7\x05\x51\x5c\x65\x9c\xf2\x4b\x1f\xcd\xa5\x61\xb4\x70\xd6\x59\x81\x68\xe0\x2c\x01\xb6\xf2\x00\xf7\xd5\x70\x57\xe3\x28\x11\xde\x8f\x15\xf4\x6b\x80\xa6\x39\x7a\xeb\xec\xe7\x63\xed\x4c\x2b\x9c\xec\xcb\x25\x35\x23\x16\x33\xe3\x88\xaf\x03\xfd\xe2\xa9\x31\xbd\xd8\xa9\x1f\xc4\x33\x1a\x9b\x01\x83\x7b\x9d\xbf\xe5\x06\x4a\xd3\x4c\xf6\x84\x58\x88\x28\xb4\xb6\x30\x5a\xbc\x93\x3f\x1f\x9d\x84\xf3\xec\x37\x45\x9a\x51\xdf\x8d\xbe\x86\x43\x35\x78\x0f\xb2\x58\x64\xd6\x0b\x4c\xc0\x5a\x57\x8e\xbe\xd5\xd3\x1d\xc2\x18\xc5\x88\xab\x53\xde\x76\x21\xcf\xe4\x55\x89\xd3\xd8\xa1\xdb\x9c\x5b\xf5\x51\xd6\xa3\xc4\x9a\xc5\x29\x49\x70\x95\x36\xa5\x64\xb3\x93\x4a\x55\x2a\xfb\xaa\xdb\x13\x9a\xcc\xbb\x3e\xd4\x2f\x37\xfd\xf0\x05\x86\x70\x57\x62\xae\xde\xe0\xea\xe4\xfd\x55\xfe\x31\x19\x93\x79\xf1\xff\xea\x08\xa5\xb7\xb1\xbf\x0a\xe7\x96\x25\x22\x35\xe1\xb9\x7a\x29\xd0\x8b\xbc\x42\x16\x67\x5d\x7e\x31\x78\xe2\x57\xd6\x35\x21\xaf\x66\xcf\x3f\x93\xc4\xc8\x60\xf6\x80\xa4\x93\x6b\x68\x65\x3e\xe0\x73\xff\x31\xb9\x75\x99\x75\x2c\x78\x03\xba\xf6\xd8\xfb\x5d\xb5\x38\x57\x84\xe9\x46\x3a\x01\x68\xd4\x15\x37\x33\x3d\x53\x16\x4b\xa6\x74\x30\xcf\x72\xbe\x40\xcb\x6e\xbd\x38\x9d\x51\x13\x59\x2c\x79\x94\xb0\xc0\xd6\xaa\x8a\x42\xd6\x7b\x39\xae\xba\xb3\x58\xa6\x0c\x11\x11\x08\x77\x72\x6b\xa4\x03\x95\xd8\xf9\xde\x1a\xab\x28\x16\x5e\xd8\xc2\xed\xc1\x7f\xab\x4b\xcc\x62\x23\x93\xde\x23\xdd\x31\x49\x4d\x80\x60\xf9\x11\x90\xa5\x88\xde\x5a\xdd\xad\xb7\x68\xb2\x77\xf3\xb0\xd9\x6f\x17\xb7\xab\xed\x6e\xf1\x6d\x15\x87\x61\x36\xe3\xa9\x8b\x8c\xbb\xcd\xf1\xf7\x4f\x0c\x15\x19\x89\xe2\x14\x5b\xcb\xb2\x6e\xf3\xa6\x5d\x1d\x64\xee\xfb\xa3\x8c\x90\x2e\xb6\xf2\xb1\x4f\xde\x7e\x60\x7a\x74\x49\x6a\xe9\xec\x2f\xbe\x5e\xc5\x08\x49\x28\xa6\x84\xdb\xc5\xdd\xd3\x66\xb1\x0e\x5f\x4c\x09\xd3\x3e\x16\xda\x1e\xab\xb2\xa9\x6a\xd4\x8c\x0f\x55\xf8\x10\xc8\x10\xca\x2d\x92\xb5\xe4\xf1\xb6\xd2\xaf\x43\x3e\x11\x0e\x27\x71\xa6\x42\x35\x0c\x4b\x4a\x37\x55\x7d\x93\xd7\xa1\x20\xc3\x08\x4d\x39\x0a\x80\x3b\xc3\x8e\xee\xa1\xf6\x47\xac\x2b\x30\x37\x27\x75\xc8\xb1\xeb\xef\xf4\x20\x67\x3b\x33\xe9\x92\x4f\x36\x82\xe2\x07\x65\x9c\x5e\x9f\x68\x7a\x4a\x2c\x05\xaf\xa0\x8d\x59\xb2\xaf\x98\xaf\xcb\xc7\xba\x7a\x1e\xa5\x5a\x84\x27\xdc\x19\xd9\xe7\x1a\xca\x26\x24\x3f\x33\x58\x3c\x23\x02\x08\x16\xcd\xde\x42\x56\xb9\x85\xfe\xda\x12\x42\x51\x12\x79\xdf\x04\x2f\xd8\x4f\x48\x39\x8c\x24\xd2\xe9\x99\x23\x06\x6c\xe4\x50\x3d\x9b\x0a\x89\xb1\x48\x09\xc7\xe9\xdd\xad\xe2\x6f\x17\xed\xab\x18\x49\x23\x82\x49\x50\xa0\x7b\x3f\x5c\xef\x6f\x76\xb7\xfb\xed\xe3\x6a\x15\xa2\x09\x92\x12\x8a\xc9\xe4\xea\x66\xb1\x1d\x4a\x72\x8c\xa4\x9c\x10\x8f\xf5\xbe\x9f\x19\x28\x30\x92\x19\xc6\x5c\xc6\xe4\xc4\x0e\x3f\x9c\x48\xd7\x99\xcc\xc2\x0c\x8c\xe3\x3f\x2d\x53\x69\xfc\xb4\x5a\xfc\xf3\x76\x76\xce\x52\xc5\x38\x97\xee\xba\x7c\xa7\x7a\x7e\x2e\x46\x92\x1d\xdd\x51\x82\x6f\xb6\x3a\x7d\xec\x72\x3d\x7a\x5d\x47\x59\xe4\xe5\x9b\x26\x35\x75\x71\x7d\x25\x8b\x75\x89\xf8\xd8\xfe\x29\xab\x44\x70\x7f\xad\xb7\xf9\x30\x2b\x55\x16\x85\xf3\x74\xa1\xeb\x6e\x20\x69\x31\xa2\x74\x8a\xe5\xf6\x53\x89\x9e\xd3\x8b\xf2\x79\x62\xd5\xce\x88\x61\x02\xb7\xd2\x30\x25\x1d\x68\xe0\xb3\xa2\x31\x23\x26\xa1\xca\xdd\x54\x69\x86\x8a\x2c\x43\x57\xbe\x9e\xbc\xb6\x81\x2e\x6f\x92\xc5\x8f\x7e\x83\x22\x20\x99\x10\xbd\xf2\xaf\x9a\x15\x2b\x18\x8d\x04\x60\x73\x64\x71\x6a\xab\xda\xb5\x17\xaf\xa1\x90\x1f\xfd\xee\x48\x63\xea\xa4\xbd\x5d\x7f\x20\x77\x00\xd0\xe0\x48\x32\x4d\x5a\x68\x4c\xad\x03\x4a\x16\x20\xbb\x00\xa1\x41\x50\xd4\x59\x2e\x1f\xae\x8a\xc6\x9c\x62\x03\x7f\xdb\x56\x25\x3c\xca\x63\x1f\x2e\xd1\x18\x58\x4c\x02\x3c\xcf\xb7\x8f\x36\xb2\x9d\x21\xc3\x19\x8d\x2d\xb7\x63\x35\xcb\x1b\x08\xc5\x03\x3f\x80\xc4\x5c\x42\xdf\x67\xee\xf6\xac\x9b\x53\x39\x61\x2b\x32\x4a\xb8\x03\x28\x6d\xff\x7b\xca\xeb\x71\x7a\x44\x89\xce\x88\x0e\x6e\xb0\x81\x6c\xa2\x2b\x24\x25\xc7\xb3\x53\x21\x36\xd2\x0e\x07\x8f\xc1\xce\x12\xbb\x6d\xfe\x8e\x39\xa7\x9c\xb9\x18\xd8\x2f\xf5\x69\xfb\x82\x65\x3f\xc9\x29\x95\x2c\x4b\x7b\xe5\x94\xee\x19\xc8\xbc\x1c\x4b\x49\x75\x43\x52\x64\x42\x76\xe1\x6a\xf5\x25\xd8\x8a\x51\xa6\x33\xa7\x37\x8c\xb1\xe1\x3d\xbc\xdf\x39\x17\xa7\x2f\x0b\xbb\x8c\x32\x93\x20\x1e\x49\x06\x71\xe8\x98\xdc\x55\x65\xfb\x12\xde\x1a\xca\xa9\xc6\x12\xed\xb1\x6a\xda\x3b\x24\x65\x2c\x0b\xe9\x7d\x15\x3d\x18\xba\x9f\x35\x5c\xa7\x98\xc2\xba\xdc\xff\x2a\xef\xa7\x5e\xc2\x85\x5b\x60\xab\x67\x8c\x73\xaf\xc0\x56\x75\x78\xc7\x68\x1a\xb3\x00\xbb\xc2\x2a\xe1\xb1\x9b\x3f\x8b\xcb\x24\x65\x46\x53\xed\xf0\xd2\xee\x47\x56\x48\x31\xbc\xbc\x84\xd2\x2c\x12\x41\x24\xb1\xdb\x53\xfc\x7b\x33\x1b\x13\xc7\xca\xa3\xcd\x7e\x54\x75\x03\x58\xb1\x98\x8d\x91\xd4\xe1\x62\x37\xdd\x0b\x35\x7b\xef\x24\x07\x7c\x6f\x37\xab\xfb\xd5\x9f\xfb\xc5\xee\xe1\x6e\xbd\xdc\x6f\x57\xbb\xdd\x2d\x5a\xbe\xee\xd7\x61\x0d\xa6\x2a\x4a\x98\x6b\x89\x76\xab\x8c\xfb\x9d\x8b\x4b\xe8\xc5\xa0\x24\x26\xe9\xec\xea\x54\x4a\x6c\x1c\xd6\xb3\xa0\xd2\x1e\xf7\x47\x0d\xe1\x5e\x2e\xef\x1e\xde\xaf\xa0\xbd\xa0\x59\xcf\xa8\xb1\x80\xdf\xa1\x90\x58\x18\xce\x14\xe2\x04\xf1\x9c\x25\x80\x01\x33\xb7\x64\x67\x14\x52\x82\xbd\xea\xb7\x6a\xd6\x78\x4d\xc3\x00\xc5\xb1\x37\xd1\xe0\x74\xbe\x75\x4a\x8d\xfe\x98\x95\x14\xcb\x4e\x77\x8f\x2f\x55\xe9\x23\xb6\xfe\x98\xd6\x99\x97\x36\xdb\x54\x0d\xac\x76\xdf\x27\x3b\x12\xb5\xc6\xe5\x5e\xb8\x1f\x91\x47\x6f\x2a\xde\x63\xf2\x2f\x20\xf4\x59\x97\xcd\x05\x15\x35\x47\xa1\xbf\x38\xad\x58\x4c\xdc\x3a\xee\x6a\x3e\xdf\x50\x08\xca\xc9\xca\x87\xde\x0e\x8e\xb1\x08\x29\x43\xa1\xa9\xad\xab\x31\x0f\x07\x33\x8c\x61\xdc\xad\x9c\x61\x64\x19\x8b\x41\x30\x31\x12\xae\x1f\x53\x42\xa6\x01\x02\x23\x19\x15\x28\xab\xf8\x75\x5e\xc1\x48\x66\x31\x31\xe9\x96\xcc\xeb\x5a\xbe\x2f\xca\x0f\x54\xc3\xf9\xa2\x7a\xc8\x88\x95\xd8\x38\x35\x70\x2c\xaa\xc0\x24\x3d\xdb\x5d\xc3\xba\xde\x2d\xcb\x81\x71\xb2\x78\x93\x79\xd1\x6d\x8d\xb8\xab\x2e\x7b\xf7\x8c\x30\x2b\x18\x25\x06\x9c\x9a\x53\x5e\x23\x82\xe1\xd8\x53\xb9\xfa\x21\x3c\x85\x68\xc4\xcc\x73\x0a\x51\x6e\x66\x3a\xe1\xdd\xe9\x9d\xa0\x2a\x53\xd0\x9b\x9e\xe7\x07\xe8\xa6\xd2\x6c\x0c\xcb\xb2\x78\x90\xc8\xcc\xcb\xe7\xee\xce\x8e\xeb\x4a\x8c\x83\x42\xb0\xd4\x2e\x18\xd2\x85\x03\x82\x2b\x2b\x7a\x39\xb9\xeb\xd3\x05\x1a\x1b\x63\x49\x12\xe3\x5c\xee\x76\x1d\x30\x67\xcf\x35\xb1\x4e\xf6\xe1\x54\xb6\x7d\xac\xce\xd2\xd4\x91\x7d\x5d\x41\xe2\x31\xf4\xa8\x19\x4b\x95\x06\x39\x6e\x49\x61\x3e\x7c\x7f\x1a\x44\x53\x67\x73\x01\x81\xa1\xfe\x25\xaf\xf4\xeb\xe4\xba\x32\xce\x44\x3a\x31\x0c\xdc\xf4\x60\x4f\xc6\x32\x49\x83\xf0\x28\xd2\x98\xbc\x8a\xb7\x83\x37\x5f\x5c\x2f\x99\x8c\x25\x56\xb6\x97\xab\xdb\xf5\x43\x88\x11\x99\x54\x1a\x45\xb7\xf7\xee\xd5\xf0\x0a\xf1\x63\x97\x5e\xc6\xa4\x8e\xb0\x6d\x7f\xb7\x58\xdf\x63\xfa\xb3\xdf\xee\x16\x9b\xdd\x7e\xb7\xbe\x5b\xf5\x63\x2c\xc1\x0d\x7c\x07\xcf\xd3\x79\x77\x01\x07\xc2\x98\x4a\x34\xb5\xc1\x37\xef\xa7\x5b\xba\x1f\xec\xa4\x10\xc7\x74\x6c\xb2\xc4\x03\xa5\x66\x27\xa4\xd3\x8c\x64\x43\xce\x8c\x3a\x8d\x13\x83\xa5\xd1\x56\xcc\x8c\x14\x98\x56\x80\xc9\xdb\xbb\xca\x9c\x2e\xb4\x43\x27\x0b\x74\x58\x5a\x8c\x26\xc4\x53\x8d\x36\x70\xa8\xde\xba\xb7\x63\x6d\x30\x02\x5c\xb7\x70\xd6\x19\xfc\xf7\x7f\x3e\x27\x1f\x0d\x0f\x01\x64\x44\xfa\x6c\x7f\xcc\xbc\xc5\x1c\x66\x36\xfb\x40\x32\x8c\xa3\x1f\x1e\x57\x9b\x05\xea\x3a\x2d\xee\x1e\x9e\x82\xd3\x38\x63\x36\x62\xd8\x02\x9d\xfa\xdf\xa2\x20\x18\xc8\x50\x55\x23\x9f\xac\x15\x36\x72\x0d\x02\x0f\xf5\xb6\x15\xfa\x0f\x41\x0b\xb5\xf3\x9a\xf2\x3f\xc2\x23\x15\x6b\x8f\xf2\x5c\x3a\x79\xd9\x2e\x32\x1b\x9b\x82\x5c\x7a\xc2\x3c\x56\x5a\xfa\xa7\x77\x2a\xda\xfd\x5b\xd5\xd3\x7e\x19\x8f\xad\xb3\x7e\xdb\x39\x77\x7c\x1b\xfe\x4e\x38\x60\x34\x59\x54\xef\x03\xb1\x99\x71\x4a\x34\xda\x9e\xa9\xa2\xd2\xaf\x1e\xb3\x3d\xdd\x12\x46\x91\x24\xa7\x2a\x0b\x5b\xe3\x83\x17\x5f\xf4\x9d\xe1\x5f\x38\x8a\x85\xcf\x5b\x9a\x06\x12\x0f\x76\xad\x75\x2e\xeb\x0f\xac\x64\x4c\x9e\x0e\xa7\xd6\x89\x6f\xba\x98\xcc\x61\x3f\x2f\xd8\xac\x33\xce\xa8\x46\x6a\x44\xde\x5c\xc3\xb1\x06\x0c\xc4\x66\xdf\xc5\x98\x7f\x18\x83\x17\xf2\x04\x14\xc8\x38\xe7\x26\xf6\xec\x45\x8f\x08\x3c\xcb\x12\x38\xcf\x08\xb3\x23\x06\xe1\x1f\x55\x71\x0a\xd0\x83\xe9\x48\x21\x0c\xd6\xdb\xfe\xaf\x52\x8f\x3d\xd0\x8e\x71\xe1\x89\xf9\x4d\xeb\xee\x74\xff\x77\x9b\x80\x2f\xfc\x7c\x97\xcd\xcb\xd5\xc7\x25\x66\x79\x37\x4c\xa1\x24\x43\xdf\x58\x40\xf5\xb6\x8b\xdb\x20\x4f\x32\x91\x46\x7d\x2d\xeb\xa9\x81\xda\xb9\x1e\x5f\xe2\xa3\x31\x9e\xe8\x18\xbb\xaa\xce\x99\x7a\xe0\x24\xcf\x47\x09\x84\x97\xda\xaa\xd6\xb0\x2a\x0d\x76\x9e\xfc\xb1\x94\x51\xe6\xa0\x4e\x79\xb7\x15\x6d\x46\x7e\x83\x8c\x67\x4c\x90\x69\x9f\x63\xe1\x54\xff\x3f\xd1\x3f\x60\x3c\xd3\x84\xb3\xbe\xdf\x38\x87\xbe\x7d\x19\x95\x73\x49\x38\x4a\xdf\xfc\xf7\x04\xf5\xc7\xa0\x5c\x3f\xbf\x66\x29\x15\x46\x94\xbd\xcd\xe7\x52\x1e\xc3\x09\x4b\xe3\x80\xc7\xbe\x7c\x7b\x3d\x7a\x5b\xb4\xd0\xbd\xf3\xea\x5e\x16\xc5\xfe\x34\x32\xb0\x66\x5c\x27\xcc\x31\x00\xf3\xe7\x21\x8a\x98\x9c\x9e\x4e\x34\xb6\xe1\x86\x9b\xb1\x0b\x67\xf0\xf7\x0a\x6b\xdc\x24\x2a\x09\x6a\x7c\xfa\x05\x9a\xed\x68\x1e\x1b\xe3\x04\xd8\xbb\xe7\xe0\x9c\x22\x5b\x59\x4c\x12\x23\x0e\xdc\x22\x3c\xa6\xae\x4e\xcf\x2f\x93\x43\x22\x22\x29\x0a\xd1\xf9\xe4\xad\x1e\x69\xfe\x4e\x4e\x41\xc4\x8c\x09\xd3\x73\xce\x35\x34\x4d\x5e\x3e\x9f\xb5\xe5\x44\xcc\x9d\xe3\x4e\x03\xed\x4d\x0d\xf0\x97\x53\x12\x69\x4f\x63\x46\x35\x13\x44\x24\xd8\x22\x39\xe4\x65\x1b\xe4\xdb\xfb\x5b\x31\xf9\x3e\x02\x12\x6b\xe1\x4b\x5f\xa1\x0d\xfa\xe4\xd3\x47\x2b\x88\x65\x98\x72\xa8\x8f\x56\xd6\xf5\x90\x79\xfb\xc3\x54\x68\x18\xdc\xe3\x1e\xeb\xea\x50\xdd\x55\x65\xd3\xce\xf0\x09\xd3\x37\x4a\x20\x0e\xdb\x63\x13\x1f\x4a\xf8\xd1\xa7\xc7\x82\x11\x8b\x35\xa9\xdc\xdb\x1b\x9e\x85\xa8\x61\x1c\x4b\x70\x15\x2a\xaa\xea\xf5\xe9\xe8\xd0\xa2\x75\x78\x21\x2f\x46\x30\x82\x47\x4e\xa3\xf5\x5b\x15\x64\x97\x99\xe0\xdc\x62\xd3\xff\x58\xe7\x65\x3b\xf2\xe6\x63\x82\xa7\xae\x87\x71\x94\x75\x83\xef\xfc\xba\xcc\xdf\xce\xe1\x9d\x61\xb4\x8e\xb1\x47\xf4\x26\xcb\xbc\x79\x39\x47\x80\x33\x21\x18\x43\x7d\x0a\x7b\xea\xaf\x35\xc9\x34\xd6\xcb\xdc\xba\xe2\x38\xd4\x67\xd6\x8b\x4c\x64\x2c\xc6\x47\x3a\x04\xaa\xee\x29\x10\xbf\xfb\x0b\x99\x66\x08\xb0\x6b\x5e\xaa\xe3\x75\x75\x52\x43\x1d\x42\x48\x93\x31\x13\x5e\xcc\xf0\x8c\x57\xb8\x32\x5d\x00\xf5\x30\x21\x21\x45\x75\xb1\x9b\xbb\x6f\xdf\x57\x8b\xdb\xdd\xf7\xe5\x62\x13\xe2\x26\xa1\x24\xc3\x67\xb3\x7d\xc9\x9b\x97\xd3\xaf\x54\xd2\x98\x50\x5a\x07\xb2\x6f\xe0\x20\x85\x23\x96\x21\x65\xfd\x3d\x2f\x4b\x8c\x87\x1c\x82\xd8\x1f\xd5\x11\x0d\x3a\x59\x7d\x73\x7d\x56\xa5\x11\x5a\x12\x34\xf7\x39\x35\x50\x7f\x26\x57\xe0\x87\x9a\x98\xe1\xf2\x0d\xed\xcb\xae\x7a\x6a\x66\x3b\x81\x30\x69\x1a\xf9\x7a\xd6\xdd\xc7\xa3\xd4\xb9\x1d\x6a\x72\xc2\x64\xce\x16\x70\xe8\x3d\xcd\xf7\x88\xfe\x4d\xb0\x69\x9a\x8c\x0c\xc0\x73\x84\x1a\xb7\x9f\x55\x55\x93\x88\xa5\x48\x53\xb1\x79\x51\x4c\xbc\x5b\xff\x76\x09\xe7\x57\xff\x8e\xa8\x9b\x17\xa8\x8d\x2c\x89\x78\x8c\x41\x81\xdb\xa8\x90\xfe\x39\xdf\xa6\x93\x28\x91\xce\x43\xa9\x81\x76\x73\x86\x03\x48\x22\x15\x61\x21\xbf\xaf\x95\x8d\xc5\xb7\xa7\x43\x49\xa2\xb0\x86\xeb\x70\x55\xbe\xb2\x3d\x2d\xf6\x25\x44\x51\x57\x1b\xc3\xa4\x6d\x1c\x46\x27\x04\x54\x22\xfa\x46\x51\x77\x6f\x51\x88\x7e\x3c\xdf\x12\x9a\x64\xa9\x8b\xe3\x9c\x0e\x1c\x56\xd7\xe5\x61\x10\x09\x1b\xce\x86\xc5\x11\x2a\x15\x5a\x6c\x62\x06\x89\x4c\x7f\x90\x0b\xc0\x3c\xe3\x8f\xfc\xb5\x72\x82\x85\xd3\xe0\x71\x7a\x8b\x78\xa6\xe9\x00\x14\xfe\xe7\x69\x5e\x8a\x20\x33\x57\x28\x96\x88\xc4\xc9\xd9\x3a\x51\x93\xfc\x12\x7f\xd6\x8f\x4c\x48\x8c\xd8\x17\xb7\x75\xaf\x4a\x33\xda\x3d\x93\x94\x09\x34\x29\xd8\xe0\xc1\xee\x19\x9e\x89\x7d\x86\x91\x32\xd1\x59\xa8\x2c\xbb\x7b\x33\x4f\x1f\x93\x54\x2a\x24\x54\x43\xfb\xf2\xd4\x98\x11\x5b\x8f\x25\xa9\x92\x2c\xf1\x9c\x99\xa7\x52\x3b\x64\x3e\x96\x45\x67\x3f\x63\x13\xed\x15\x36\x71\xcb\x5b\x05\x5e\x39\x4b\x32\x4b\xb0\x92\x89\xde\xf0\xfb\xeb\xd5\xe2\xfa\x76\x1d\xe4\xca\x58\x22\x69\xec\xf3\xc7\x57\x28\xf7\xe5\x00\x80\x49\x24\x15\x56\x05\x95\xf7\xb7\x7e\xdd\x4e\xa4\x96\x18\x97\x60\x1f\xed\x33\xa6\x2f\x4b\xa4\x65\xc2\x33\x9a\xae\x4e\x75\xe9\x51\xd8\x7e\x9b\xb8\x93\xc7\xf9\xf2\x35\xfd\xb4\xd2\x09\x26\x40\x77\x8b\x3f\xf7\xbb\xcd\xe2\x7e\x7b\xb3\xda\x74\x89\xe4\xf6\x71\x11\x72\xd2\x44\x19\xd7\xae\xad\xe5\xfb\x9d\x2c\x4f\xb2\x28\x3e\x5c\x2b\x61\xdc\x1f\x99\x4d\x3e\xad\x34\x56\x53\x8d\xac\x73\xd9\x42\xbf\xda\x24\x90\x4a\xec\xeb\x20\xbb\x7b\x7f\xb7\xbe\xdf\xf5\x3a\xed\x2c\xb1\x89\x89\x5d\x2d\xcc\x13\x67\xfa\x03\x29\x38\xb2\xad\xae\x96\xf2\xe8\xb6\xf3\x4f\xb0\x67\x89\xcd\x12\xad\x03\x18\x73\x04\x28\x99\x8f\xca\x84\xf1\xdd\xc6\x6f\xdd\xb4\x7e\xf1\x12\xcf\xe1\xb8\xa1\x41\xa4\x7b\x59\x81\xed\xf2\x0e\x28\xdb\x11\xf8\xe9\xf3\x64\x2b\x8d\xb4\x4b\x0e\x9e\xa1\x7d\xcc\x8b\x42\xba\xc2\x43\xf3\x7b\xde\xf6\x2a\x2d\xb3\xfa\x62\x4a\x52\x80\xd4\x91\xac\xf2\xe7\x97\xb1\x46\x10\x4b\xa9\x30\xde\xbc\xb8\x34\x7e\x93\x69\xfa\x63\x90\xc5\x63\x4a\xf4\x65\xa2\xf7\xec\xc7\xa8\x25\xc8\x2e\x0d\x90\xab\xca\xe6\x05\x5c\xbc\xa0\xe9\x75\x09\x42\x8d\xaf\x18\x4e\x49\xe1\xd3\x97\x3f\x15\xa9\x45\x6d\x0c\xe9\xe8\x7c\x8f\xf2\x03\x37\x63\x19\x30\x22\x69\xc2\x33\xc3\x47\xf9\x15\x9a\xe7\x7e\xde\xc7\x49\x13\x91\x65\x2e\x65\x73\x0c\x86\xbe\x3c\x36\x5d\x5c\xd3\xcc\x7a\x5a\xab\x2c\x34\xf2\x74\xc7\xef\x78\x2a\x93\x08\x77\xe4\xb9\xd6\xa1\x08\x03\x14\xe7\x89\x7f\x6e\xd7\x79\x73\x3c\xf5\xeb\x50\xaa\x44\x92\x45\x23\xf7\x9e\xe6\xb3\xf2\x46\xaa\xb4\x93\x9b\xff\xd3\x76\xfb\x69\xd0\x20\x09\xdf\xa3\x4d\x16\x74\x7b\xae\xeb\xaa\x84\xc7\xa0\x02\xcc\x52\x6d\x4d\x34\x3c\x94\xab\xaa\x6a\x3f\xae\x46\x6a\x47\x7e\x94\xc9\x5c\xc1\xa2\x3f\x91\xab\x8f\xd5\xee\xfb\x74\x6e\xa7\x10\x4b\xac\xdc\x2e\xfe\x58\xac\x6f\x17\x57\xb7\xab\xbd\x13\x5c\x0c\x3f\x65\x63\xa7\x80\xd1\x05\xd0\xb7\x95\x7e\xf5\xd5\x9c\x2f\xbb\x7d\xa9\xe5\x51\xd8\x9d\x96\x52\xbf\xcc\x4e\x2c\x8b\x12\x81\xaa\x52\x50\x36\xa7\xda\x89\x79\x0e\x6b\x59\x16\x47\x46\x44\x67\xae\xce\x9f\xe2\xa6\xc6\xb3\x2e\x8b\x65\x0a\x43\xb1\xf8\xf0\xea\xc1\xca\x93\xb3\xcb\x48\x14\xe3\xb3\xbd\x7d\xf8\xb6\xbf\x91\x79\x01\x66\xc2\xda\x98\x0d\xa6\xd6\x0d\xae\x9e\x37\xe8\xb5\x79\x5f\xb5\x68\x64\xf0\x85\x90\x04\xcb\x88\x55\x08\x7c\xba\xfa\x16\x6e\x64\x46\x23\xe7\xb0\x80\x05\x43\x59\x3e\x95\x32\x4c\xcc\x4b\x8d\xbe\x8c\xc6\x4e\x48\xf6\x0d\xea\xdc\x7e\x6c\xa1\x7e\xcb\xf5\xfc\x3e\x52\xc2\x30\x3e\x70\x56\xda\xb7\x93\x26\x70\x18\x22\x75\xe4\x85\x5c\xaf\x64\xdb\x16\xe7\xf8\xc6\x8c\xaa\x4c\x8d\xcc\x70\xf2\x5e\xb2\x87\x65\xd4\x46\x71\xcf\xbe\xd9\x4a\x0b\x13\x57\x91\xf3\xde\xef\xf4\xf4\x18\x8d\xb0\x7d\x74\xb5\x5b\xee\xb7\x4f\xeb\xed\x76\xb5\xdf\xad\x57\x9b\x7d\x00\x5f\x64\x9c\x12\xd4\x0b\x35\xd5\x7b\xb9\x7b\x81\xeb\xba\x77\xa7\x63\x19\x67\x59\xf0\x47\xb9\x93\x3f\x7b\x90\xba\x93\xe4\xeb\xc9\xac\xd3\x2b\xe1\x5e\x37\xbc\x1b\xb8\xfa\x99\x37\xed\x0c\xf2\x99\x71\x9b\x6a\x17\x93\x3e\xd7\x12\x43\x04\x57\xbb\xf3\x87\x85\xb1\x58\xda\x74\xf4\x99\x7f\x9e\xaa\xfa\x74\x98\xd6\x72\xb2\x84\x49\x70\x55\x65\x67\x73\xb5\x70\x24\x63\xdf\xc1\x0a\x83\x54\x82\x6c\xb2\x0f\x54\xb0\xc0\x82\xde\x18\x76\x95\x75\xdb\x1a\xef\x67\xe9\x12\xea\x2f\xb4\x42\x59\x96\x2a\xb0\xde\xdc\xb0\x2e\x2a\x69\xc0\xdc\x41\xfb\x72\xfe\x0e\x86\xe1\x56\xe1\xa6\xb9\xba\x5d\xff\x19\x7e\x30\x23\x2e\x5a\x5c\x2f\x1f\xb0\xfc\xdb\xff\x9d\x3a\x86\xf3\x5e\xd5\x00\xa6\xcb\xc8\x3f\xab\xaf\x86\x0f\x08\x57\xfa\x19\x77\x6b\x51\x52\x7b\xf6\x24\x32\x88\xe2\x34\xc8\xd1\x9c\x74\x3b\x65\x69\xb3\x4c\x8a\x14\x23\x1c\x17\xab\x79\x2c\xc1\xe5\xeb\x91\x99\xe1\xa3\xba\x41\x77\x92\x83\x22\x8b\x1f\xa3\xb8\x53\x25\xe9\x09\x6f\x8f\x75\x5e\xea\xfc\x58\xc0\x68\xc9\x0a\x63\x33\x88\x87\xe9\xfe\xfd\x74\x90\xe5\xd4\xfd\xf0\x52\xa5\xf1\x33\x65\x6e\x96\x29\x99\x20\x48\xe7\xdb\xfd\x72\x08\x37\x3f\x49\x59\xfc\x47\x34\x8f\x32\xef\xee\xf4\x2e\x73\x2c\x80\x6f\x56\xbb\xeb\xd5\x25\x10\x49\xa6\xd3\x4c\x46\x4e\xb3\xe9\x4a\x5e\x8d\xc9\x48\x2c\xd3\x3a\x03\xd9\x97\x99\xb0\xda\x72\x25\xbb\x59\x79\xf5\xf1\x6d\xa8\x1b\x65\xda\x6a\xe1\x0a\x5e\x9e\x5b\x37\xfd\x05\x43\x5c\x43\xb2\xe9\xd9\xfb\x2c\x33\x4a\xf0\xa0\xc2\x31\x35\x67\x65\x99\xd1\x2e\xc4\xc0\x52\xdd\x0f\xdf\xe2\xda\x55\x8e\x12\xf8\x49\xd2\x99\x19\x2b\x91\xa7\x34\xc0\x2a\x7b\x18\x64\x3b\x82\x39\xcf\x58\x5e\xd3\xef\x80\x54\x62\xc9\xe0\x30\x11\x5a\x65\x19\x48\xc7\x6a\xec\xa6\x52\xe3\xaa\x83\x23\xb3\x48\x96\x81\x8a\xf1\xad\x57\xb2\x7c\x85\xba\x71\x3d\x59\x7f\xcc\xa6\x11\x2e\x7e\x2e\x84\x5c\x39\x57\xb5\xd1\x41\x1d\xe0\x91\x17\x6d\x70\xdd\x38\x19\xa5\x1a\x4b\x5b\xbb\x87\xdd\xe2\xd6\x79\x03\xff\x16\x0e\xa9\x14\xcd\x86\x6c\x5d\x1d\x76\x79\x01\xbe\xf0\x1a\xf7\x1f\xd5\x31\x06\xa0\xae\x69\xfe\x47\x85\xee\xbd\x4b\x59\x1a\x94\x31\xbc\xfa\xd8\x96\xf2\xd8\xbc\x54\x6e\x95\xf9\x7a\xd7\x95\x71\x12\x47\x21\x4c\xbd\xf7\x22\x62\x4b\x59\xb6\x57\x35\xf4\x8e\x16\x4c\xc6\x0a\x82\xec\xaa\xd3\x1d\x9a\x7d\x89\x71\x6a\x22\x21\x48\xbc\xca\xcd\x4d\x55\x6f\x5f\xa1\xd5\x33\xd0\xa0\x24\x84\xe9\x68\x02\x46\x3f\x42\xd9\xd3\x50\x99\x24\x34\x8a\x07\x3b\x64\x44\xfd\x84\x43\x9c\x72\xa4\x03\x05\x7f\xf0\xcb\x25\x2a\xc9\xa9\x61\xbd\x9a\x7a\x1f\x21\x48\x2e\xa2\x10\x33\xdf\xc9\x9f\x4b\x39\x43\xbc\x49\xae\x09\x38\xc1\xb0\x9f\x23\x21\x95\xee\xef\x1a\xa1\x38\x5e\x6f\x27\xa4\xd4\xd3\xab\x12\xc2\xd9\x57\xa3\xfe\xe8\x20\xe8\x34\x1c\x45\x01\x91\x4a\xfd\x1f\xe8\xf6\x5b\x51\xbd\x0d\xd7\x9b\x30\x82\x24\xf8\xa3\x2c\xf3\x51\x63\x5d\x26\x89\x8b\x37\x70\x1a\x1d\x2b\xb7\x6a\x8e\xdc\x97\x98\x4c\xc0\x29\x30\x8d\xcd\xd3\x2f\x56\xd3\x65\x1a\x19\x13\xa8\x73\x55\x55\x5c\x08\x6f\x64\x4a\x04\xaa\xb0\x9d\xca\xc0\xf1\x9e\xd7\xb8\x67\x5f\x99\x11\x64\xa6\xe7\xcd\x63\x71\x7a\xce\xcb\x5e\xda\x29\x9c\x9d\x14\x09\x76\x1f\x4b\x78\xf7\x1e\x44\x5f\xf7\xbf\xa5\x4c\x1d\xe1\x77\x61\xcc\x98\xa7\x3d\xff\xd0\x85\x45\x35\xfc\x33\xd9\xb6\xa5\xca\x04\x82\xdf\xff\xdc\x6c\xda\xd1\xfa\x27\x95\x02\x14\xbf\x78\x9c\x88\x62\x30\x69\x98\xb3\x99\xce\x75\x75\x2d\x3f\xfa\xe7\x03\xc4\xa5\x69\x41\x4a\xe6\x3b\x14\x50\xe6\x33\xff\x6b\x26\x81\xa5\xb8\x3c\x57\x65\x97\xb9\x2e\x65\x51\x80\xf9\x6d\x3a\x22\x91\xb8\xe6\xcb\xc0\xcd\xe9\x66\xf0\xe5\x5b\x01\x36\x0a\x6e\xce\x7f\x74\xe9\xad\x2a\x86\xf9\x62\x33\xe3\x00\x33\x01\x19\xb4\xac\x0e\x2a\x18\xad\x4c\x9e\x91\x8a\x92\x34\xb2\xbe\x33\xd0\x5e\x48\x51\x15\xb1\x16\xdf\x45\x47\xeb\xac\x97\x17\x5c\x97\xfc\x48\x1a\x5b\x35\xce\x0a\x06\x82\xd1\x97\xbb\x96\xa2\x22\x41\x12\xc8\xbe\x95\xaf\x80\x6b\x4b\xf3\x92\x9f\x39\xf3\xf9\xc1\x8c\x39\x86\x81\xff\xeb\xae\x9a\xac\x5f\x63\x86\x21\x53\x4c\xbb\x72\xed\x5d\x75\x80\xb2\x95\x05\x7a\x1a\x84\x97\x47\x71\xe2\xa8\xe9\x43\x4b\xe3\xb1\x86\xab\xd3\x07\xf6\x3a\x1d\xad\xe7\xd3\x5c\x50\x71\x9d\x59\xda\x57\x4e\x0f\xc7\x4b\x14\x18\xc5\xc1\x08\xcf\x9b\xaa\x6a\xbc\xb0\xb1\x6c\x13\x53\x42\x50\x04\x3d\x4a\x64\x6a\xae\x9b\x42\x96\x97\x69\xb3\x4c\x89\x44\x05\x85\xac\x1f\x20\x5f\xa1\x04\x73\x0d\x16\xa1\xab\x88\x7b\x9f\x8e\x4e\xd3\x0c\xc3\xd5\x97\xaa\x30\x7d\xc7\x37\x1c\x03\x9e\x42\xe8\xa0\x63\x60\x76\xf9\xa9\xa4\x90\x20\x4e\xd4\x6b\x76\x9e\x3f\xc4\xb3\xd2\xdb\x70\xe3\xb3\xd8\xf9\x5f\x35\xef\x72\x16\xbf\xa9\x2c\x76\x90\x11\x5d\x95\x2e\x80\xfb\xad\x3f\x60\x1d\xc9\x6d\xb1\xd9\xdd\xaf\x36\xdb\xfe\xef\x2c\x36\x6a\xd4\xa7\x18\x6b\x64\x85\x21\xca\x71\x97\x10\x65\xec\xca\xca\x07\xac\x55\x6d\xe0\xbf\xfd\xd7\x28\x83\x38\xc1\xab\xe2\x04\xd7\xb9\x3c\x54\x65\x3f\x11\x32\x1b\x63\xac\xea\x76\xca\x65\x55\xbe\x39\x57\xee\xd9\xaf\x48\x15\x89\x78\x62\xdb\x7d\x5f\x8d\x63\x45\x25\xb5\xc5\x58\x71\x98\x50\x7f\xdc\x5e\xff\x8a\xcc\xa4\x54\xec\xa0\x3f\x87\xbc\xbc\xc9\xcb\x32\x38\xaf\x87\x93\x53\x89\xc1\x10\x2b\x6f\xe1\xf0\x3d\xef\x6e\xc0\xc7\x83\x7d\x9c\xd8\xb7\xcf\x1e\x9c\xb2\x8a\x0f\x9a\x64\xbd\xde\xee\x48\x53\x7c\x7a\x02\x3a\x31\xd6\xdd\x99\x4a\xbf\x36\xbb\xea\x5b\xa0\x3d\x2a\x6d\x1c\xd3\xc7\x07\x2f\xfd\x14\x32\xdc\xe9\x7c\x97\xf0\xfe\x88\x05\x8c\x91\x1a\x2b\x53\x46\x39\x46\xc7\x1d\x34\x8d\x7c\xee\x56\x30\xf8\xac\x17\xea\x3f\x01\xc4\x91\x38\x1a\x68\x17\x6d\x75\xf8\x06\xe5\x25\x88\x99\x02\xe5\x98\x5c\xcb\x30\x75\xae\xf2\x56\x57\x79\xb9\x1c\xcb\x3d\x7e\xc5\x0f\x67\xca\xa6\x11\xf3\x6f\x64\xfb\xc9\xed\xb3\x69\x8a\x95\xcc\xf2\x74\xb8\xaa\x70\x15\x70\x07\x74\x24\x24\xf7\x99\x87\x06\xd4\x9b\xec\x8f\x48\x07\x97\x09\x52\x10\xff\xfa\xb1\xdc\x55\x97\xdd\xe5\x27\x17\xae\x23\x4b\x51\x39\x20\x18\x4b\x3c\xae\x36\xcb\xd5\xfd\x6e\xf1\x6d\xb5\xe7\xe1\xcb\xe3\x44\x60\xc8\x31\x6a\x43\xcf\x24\x94\x98\x8e\x33\xd7\x70\xbb\xad\x9e\xb1\x27\x5c\x54\xcd\x27\x04\x7c\xa6\x63\xe3\x7c\x92\x8f\xb2\x6e\x9d\xae\x8f\x0f\xc2\x2f\xde\x0e\x4d\x62\x8b\x0b\xdd\x76\xb7\xd8\x39\x78\xe3\xf7\xc5\xf6\x7b\x38\x39\x92\x70\x69\xbc\xbc\x5c\xff\xde\xdc\x04\x4d\x61\xa6\x29\x8d\x83\x88\xc0\xae\x87\x2c\x35\xdb\x21\x85\xd0\x94\x1a\xac\x69\xb9\xcb\xd3\xed\xae\xba\x3a\xe5\x45\x77\x77\x3f\xe9\xe7\x68\x6a\x9d\xbb\xb0\x27\x20\xe1\xb4\xfd\x2e\x9b\x97\xa7\xa1\x77\xaf\x59\xac\x4c\x00\x3e\x63\x93\x02\xcc\x3f\xdb\x8f\xf1\xef\x32\x91\xa0\x51\xaf\x92\xe5\xe2\x64\xf2\xb3\x76\xac\x66\x09\x07\x1d\x3c\xaf\x82\x45\xe2\x6c\x73\xd4\x0c\x28\x26\x00\x7b\x84\xa2\x15\xa7\x03\x7c\x81\xef\xd7\x22\x8e\x85\x1d\xe4\x4a\x5c\xf6\x38\x0f\xd9\xb4\x20\xce\xb7\x64\xfb\xb8\xd8\x2c\x27\xaa\x4b\x4c\x0b\xe6\xae\xdd\x97\xe7\x5a\xbd\x19\x2c\xc2\x26\xd9\xa3\x16\x59\x82\x81\x1f\x5a\xa2\xac\xcb\xc7\x2e\x23\xa2\xe1\x6b\x92\x48\xab\x38\x1c\x5c\x95\x26\xd8\xe9\x31\x9d\x24\x99\xc8\x46\x82\x3b\x67\x45\x32\x7c\x21\x27\xaa\xcd\xb3\x46\xb5\x4e\x13\x57\xfe\xec\x82\xf7\x5a\xbe\x2f\x8a\x62\xd5\xbe\x3c\xcc\x34\x1f\x59\x97\x7d\x62\xf1\xe1\x06\xe6\x79\xa0\x4e\xb5\xc1\x57\x70\x51\x03\x28\x39\x0a\x92\x75\x16\x69\x64\xac\xaf\x8a\xbc\x85\xc9\x01\x25\x58\x12\x7c\x8c\x46\x46\x76\xf3\xcd\x6a\xf2\x3c\x64\x66\x71\xee\xbd\xe4\xcf\x2f\xd0\xb4\x53\x9e\x8f\x96\x1a\xb0\x23\x19\xe0\x25\x3f\xc3\x01\x15\x65\xf8\x5b\x7d\x99\xed\x52\x7a\xad\x75\x94\x62\xbf\x62\xbf\xdf\x8f\x3a\x0f\x5a\x2b\x8d\xd8\xd4\xde\x5a\x42\xb6\x2d\xd4\xe5\x59\xd5\x6f\x12\xc2\x5e\x5c\xcc\xb4\x51\x80\xc5\xa0\x2d\xb4\xd7\xf2\x78\xcc\x07\x3b\xa5\xbf\x61\x4f\xc2\xb4\x31\xd2\xc6\x7d\xc1\x09\x6b\x49\xa5\xf1\x9e\x94\x93\x34\x58\x83\x4e\x13\xd7\xbb\x47\xde\x26\x9d\xfa\xe6\x31\x6d\x33\x15\xa3\xb6\xc2\xb7\x09\x9f\x5f\x5b\x45\x8d\x2f\x4c\xae\x5b\x38\xec\xe0\x70\xfc\x5e\x15\xe6\x8c\x7e\x6b\xa2\xc8\x69\xc5\xf5\x4c\x87\x07\xfb\x70\x84\x72\xdb\xc2\x31\x9c\x84\x89\xa2\x14\x6c\x58\xba\x2f\xf6\x17\xc2\x40\x62\x31\x69\x5f\x9c\xda\x97\xaa\xdb\x49\x3f\xd3\xfd\x1e\xfd\x3e\x75\xf2\x6b\x48\xf3\xf1\x02\x2a\x57\xa7\x8f\xea\xd4\x4e\x2b\xec\xd3\x4f\xc5\x91\xc6\xa8\x1f\x05\xd0\x50\xf8\xdd\x4f\xa0\xd3\x99\xa9\x28\x33\x31\x49\x3c\x86\xdd\x97\x29\xb6\x00\xe6\x82\xb1\x63\x18\x4e\x29\x66\xdc\xcd\x11\x65\x36\x96\x0e\xaa\x36\x1b\xa3\x12\xec\xd6\xb4\x75\xfe\xfc\x0c\xf5\x8d\xcc\x8b\x9b\x42\x3e\xf7\x77\x8c\x08\xad\x78\x00\xad\x75\xb3\x0c\xbb\xdf\xeb\xa9\x05\x37\x33\x44\x11\x7c\x7a\xa7\x52\xe2\x1d\xcb\xff\x9a\x19\x9d\x75\x43\x8c\xf5\x41\xf7\xf6\x35\x2f\x8a\xf9\x37\x68\x19\x08\x1f\x57\x1f\x8b\x22\x97\xcd\x7c\x80\x49\x64\xf0\x31\xea\x52\x92\xaa\x9e\xfd\x00\x35\x34\x75\xed\x57\x97\x57\x7e\x87\xa2\xa8\x86\x76\x72\xfa\x0f\x07\xe9\x73\xff\x7b\x61\x32\x1b\x6a\x00\x85\x67\xbb\x69\xfc\x07\xba\x4a\x3e\x4f\xdf\x47\xc3\x98\xc5\x93\x74\x39\x91\x2b\x59\xcf\x6e\x28\xe3\xd4\xf9\x9c\xaf\xef\xf7\xeb\xfb\x3f\x56\xdb\x1d\x6e\x78\x8f\xdf\x17\xdb\x9e\xd7\x67\x18\x4f\x31\xbc\x42\x4e\xff\x15\xb4\x9f\x45\x1e\x7e\x38\x67\x1c\x91\x83\xab\xf5\xf2\x9f\x23\xe3\x52\x66\x38\xa7\x08\x7c\x0f\x0b\x81\x87\xcc\xff\x02\x83\x10\x56\x59\x23\xa8\x44\x1d\xba\x02\x6c\x4b\x67\xd7\x21\x18\xc7\xb9\x56\x43\x53\x15\x6f\x80\x98\x9d\xd9\xdd\x48\x22\xe2\x7c\xf7\x9f\x01\xb7\x22\x59\xb7\x6b\x1f\x60\x87\x13\x4c\x04\xc1\x5c\x14\x25\xcd\xe6\x1f\x4f\xe8\xb0\xaf\xbf\x42\x39\xda\x59\x4d\xc6\x2d\xca\x51\xdc\x2d\xfe\xdc\x8f\x55\x5b\xfa\xe3\xc2\xe2\xb2\x75\xb5\x5b\x26\x24\x8a\xaa\x92\x0d\x37\x25\xd3\x99\xf6\xb5\xf9\x07\xe5\xdc\x57\x66\xbf\x9c\x69\xf7\xed\xcb\x00\x83\xfa\xf9\xd1\x25\x31\x4b\xcf\x19\x85\x1a\x17\x31\xa4\xce\x9d\xc9\xf9\x7c\x16\x83\x1b\x19\x25\x88\xd4\x0f\x71\x98\x6b\x0b\x7b\x63\xb0\xd1\xa9\x4b\xab\x82\x62\xdf\x48\x06\xc8\x1f\x54\xcc\xa0\xda\xa3\x8b\x01\xb7\xad\x7c\x45\x52\xe5\x74\xff\x0c\x63\x65\x9a\xa0\x11\xd8\x5e\x9e\xda\xea\x30\x57\x8a\x62\x46\x69\xe7\xfd\x82\xe8\xd6\x73\x14\xb0\x51\x90\x30\xe8\x75\x57\x3c\x25\xe6\xcb\x60\xd3\xe8\x44\x07\xc0\xda\x15\xfa\xc8\xa3\x67\xd2\x3e\x5c\x9b\x4e\x99\xc6\x7c\xef\x69\xf7\x7d\xbf\xbe\x5f\xef\x96\x0f\xf7\xdf\x36\xab\x6d\x48\xc4\x8c\xd1\x29\x16\x02\x1c\x63\xd3\x73\xe1\x87\xa4\xcf\x00\x4d\x11\x2f\xb9\x1f\x90\xc7\x8b\xb2\x6a\x5f\x1c\x5a\xec\xf2\x92\xdd\xbf\x26\x56\xa4\xd8\x51\x2c\xaa\xe7\xbc\xfc\x03\x3b\x53\xb3\x35\xc4\x1a\x9a\x4a\x5f\x83\xdc\xe7\x25\x2e\xd5\x58\xa4\x8a\x57\xff\xc5\x7f\x43\x7a\x02\x51\x6a\xd1\xef\x7d\xb0\xee\xbd\x20\x06\x9f\x86\xc1\x19\x8f\xe3\xb1\x01\xe2\xae\x7a\x2c\x64\x6b\xab\x7a\x56\xbd\x81\xc8\xd0\xc4\x29\xf9\xc9\xe7\x3e\x94\x82\x08\x28\x71\x88\x8a\x5a\xbf\x6c\x4e\xe5\x90\x08\x41\x64\x53\xc6\x7a\x65\x7c\xf0\xe8\xa3\x66\x0e\x08\x81\x38\x4a\x30\x60\xea\x82\xc8\x11\xc4\x19\x62\x5f\x1e\xe8\xe6\xda\x41\xb6\xd0\xbc\x57\x75\x31\x03\x09\x03\xe1\xda\x49\x2e\xe1\x2e\xbe\x3c\x35\x6d\x75\x98\xbf\x34\x40\x84\x4b\x90\x91\xa9\x8a\xf9\x65\x5f\x0c\xcc\xcb\x67\x47\xcd\x0a\x05\xb8\xe1\x89\x02\x4b\x40\x0c\x04\xb3\x3d\x42\xad\xc3\xc9\x31\x99\x62\xce\xd3\x1c\x8b\x7c\xee\x84\xcf\x80\xe9\x14\xeb\x6a\xeb\xc7\x9b\xed\xb6\x1d\x88\x5f\xc0\x23\x08\xcd\xed\x6d\xfe\x5c\xce\xaa\xfa\x2c\x1a\xff\x33\xe2\x3f\x7d\x15\x07\x01\x57\x09\x0c\x3a\xf9\xfd\xfe\x1b\x8e\x42\xea\xe0\x85\xa0\x4f\xc5\x43\x61\x16\xe3\x8d\x07\xd2\x28\xc1\x16\x85\x17\x89\x18\xcc\x18\x19\xa4\x89\x40\xfc\xc0\x09\x51\x26\x57\x1f\x67\x15\x6d\xc8\xa8\xc3\x36\xed\x1d\xb5\x26\xbc\x12\x9f\x64\xa2\xe3\x3a\xc9\xa8\x58\x02\x8a\x09\xcc\x97\x9f\xca\x66\xd6\xaa\x1a\x82\x6a\x50\x32\x72\x49\x41\x2b\xc7\x55\x63\x50\x86\x62\x41\xf4\xe8\x9b\x1e\x0b\x34\xe1\xaf\x2e\xa8\xbc\x5e\xca\xbc\x41\x13\x4a\xbd\x45\x6d\xb1\x94\x05\xaa\xc6\x39\x3a\x6b\x7f\x96\xff\x66\xe1\x1c\x34\x4d\x70\xe7\xab\xa1\xc9\x7b\xdc\xe9\x65\x1f\xd8\x6e\xb0\xc4\x00\xe6\xe8\xa4\xdc\x67\x65\x0d\x30\x99\xf2\xcc\xf2\xe3\x05\x5d\x43\x3f\x08\x8c\xc4\x4d\xea\x25\xaf\xa1\xf6\x02\xba\x37\xa7\x32\xe8\xed\xfc\xc2\x36\x62\x38\x17\x9b\xa5\x09\x0c\xd6\xa9\x13\xd3\x4d\x06\x56\x1a\xec\x75\xfd\x55\x8d\x71\x1a\x60\xa5\x45\x78\xfb\xf1\xa4\x8a\xbc\x79\xe9\x82\xd7\x62\xf4\x72\x5a\x2b\x11\x87\x1a\xc0\xc6\x67\xf8\x07\x1b\x45\x69\xa4\x27\x36\xf2\x8f\x35\x1c\xf2\xd3\xa1\x79\x94\x33\x9b\x23\x66\x23\xc5\x90\x2e\xb9\xab\xf3\xe3\xa9\x41\xf7\xd8\x71\x28\x6d\x63\x6a\x99\x1c\x78\x8d\xc8\x35\x99\xfe\x5c\x9c\x52\xed\x53\xde\x09\xb1\xc2\xc6\x69\xaa\x06\xe0\xf0\xba\x69\x4e\xf0\x45\x3f\xf2\x8b\x69\x33\xed\x4f\x5a\x92\x69\xd4\xaf\x3c\x80\x91\xc5\xda\x22\x54\x7a\xb6\x4d\x59\x02\x22\x54\x76\x6e\x6f\xff\xd8\x83\xc9\xdb\x7d\x1c\xff\x36\xfd\x1e\x30\x1c\xcb\xbf\x6e\x09\xbb\xcf\xcb\xff\x93\x93\xd9\x1b\x5a\x5a\x96\x12\x27\x4a\x71\xb7\xbe\x5f\xdf\x3d\xdd\x0d\x21\x5a\xb7\x69\x87\xcb\xa5\x69\x82\x45\xf6\x6f\x1e\x51\x18\xfe\x6c\xd3\xd8\xf4\x1b\xe6\xc2\x47\xba\x17\x2a\xe2\x96\x25\x31\x06\x03\xc7\x40\xfa\xf5\x7f\xe7\xd2\xf9\xfe\xdc\x2e\x76\x0f\x13\x11\x34\xcb\xad\x45\x20\x91\x82\xf6\x6e\x64\x01\x38\xde\x67\xac\x88\x64\x88\x98\x7e\x3f\x99\xaa\xb9\x05\x3b\x0b\x0a\xac\x88\x63\x8a\x09\xe7\x4f\xd0\xa7\x40\x1e\x99\x3e\x64\xc1\x32\xe3\x4b\xec\x7d\x45\x62\xf6\x25\x4a\x86\x42\xb1\x87\x87\x23\x79\x17\x7d\x74\x27\x0b\xa3\x15\x90\x22\x83\x26\x2f\xc3\x6e\x8e\xd1\xd4\x6f\x17\x97\xda\x3e\xcb\x0f\xab\x81\x4d\xb8\x42\x8c\xf2\x23\xd4\xaf\x93\xa9\x9a\x08\x47\x38\xb9\x5f\x3c\x86\x3f\xa5\x90\x71\xd6\x57\x58\x07\xd3\x8d\x70\x3c\x23\x34\xf4\x32\xb0\x4c\xf4\x58\x83\xc9\x27\x62\x23\xd3\x37\xda\x66\x89\xc0\xd8\xd4\xcb\xee\x84\x6d\x7e\x3a\x48\xd2\x98\xc6\x81\x3a\x3a\xd4\x65\xfa\xe9\x24\xb9\xd2\x9e\x0e\x70\x0f\xef\x9e\x64\xdd\xbf\x36\x52\x59\xe5\x1f\xd8\x75\xa5\xcf\xc4\x3c\x99\x55\x9c\xe1\x53\x87\x53\x5d\x0d\xae\x38\xb3\x31\xa9\xd0\xd1\x08\x28\xbb\x2f\xc6\xc2\x42\xd6\xc4\x1a\x1f\xd6\x76\xb1\xbe\x5c\x2e\x9c\x3e\x5b\xa3\x1c\x66\xfc\x7b\x55\x7c\x5c\xe5\xca\xe7\x2f\xf1\xd4\x25\x67\xf6\xce\x18\xa5\xd4\x90\xf6\x6c\xc0\x00\x1c\x7c\x65\xf6\x7b\x10\x62\xe9\xc3\x31\x76\x79\x87\xb5\x40\x19\x96\x4d\xb7\xf9\xe1\x18\x1c\xc1\xbe\x58\x20\xe6\x5b\x9c\x05\x01\xe8\xbb\xf2\xba\xcb\x5f\x77\xf2\x75\xb4\x81\x59\x1b\x3b\x59\xda\x7d\xe3\xa5\xb5\x0e\xa7\x76\xe0\x17\x4c\xaf\xdf\x32\x45\xfc\x12\xb7\xc5\xdc\xe0\x0c\x72\x64\xad\x4a\xe3\xcc\xdb\x0f\xb8\x07\x3a\xef\x51\x86\x81\xe0\x70\xb2\x8f\x55\x91\xeb\x8f\x8b\xee\x48\x3c\x8a\xb8\x44\x15\xa6\xdb\xf5\xe2\xfe\xdb\x68\x92\x77\x47\x14\x72\x87\xbf\x05\x56\xe7\xfa\x7a\x12\xaf\xf2\x28\x92\x2e\x29\xbe\x43\x0e\x67\xc8\x4e\x7e\x85\x3d\xf7\x1f\x8e\xbd\xd3\x5c\xd8\x5d\xbc\x9d\xc5\xec\xf4\x48\x66\x71\xc1\x78\x74\xe5\xe8\x51\x15\x9e\x47\x44\xa9\xd4\x59\xbd\x95\xd5\xa9\xd4\xe0\xc0\xbb\xfd\x51\x93\x78\xb9\x2b\xa7\x28\xb8\xc5\x98\xfe\x33\x1b\x69\x1e\xd1\x38\xf6\xe0\xcf\xd6\x93\x41\x17\xe7\xaf\x67\x1a\x06\x13\x85\xe5\xbb\xfa\xb3\x76\x16\x8f\xa8\x66\xca\x19\x09\xcb\xba\xdd\x54\xa7\x02\xda\x16\x26\x37\x98\x45\x19\xf6\x8e\x0f\xf5\xeb\x5e\x4f\x4a\x87\x3c\x62\xc2\x49\x7e\x8e\x8c\x39\xec\xa9\x34\x60\x56\xed\x0b\xc2\x46\xf2\x46\x9f\x31\xdf\x79\xc4\x2c\xc1\x5b\xb2\xfb\x7e\xb5\x9c\xfc\x16\x8f\x5c\xc9\xbf\x3a\xb6\xf9\x41\x16\xab\x9f\xc7\xd9\x27\x79\xc6\x10\x56\xd5\xc2\xcf\xf6\xa6\xaa\x67\x4f\x9a\x2b\x22\x07\xce\xdf\xa3\x2c\x4d\xbf\x54\xfc\x9b\x5c\x4e\x39\x79\x24\x44\x8a\x75\x40\x8f\x27\xcc\xcb\x89\xa1\xfb\x7c\xac\x33\x54\xc7\xe5\xf1\x98\xeb\x70\xde\x22\x4d\xd3\xa1\xd3\x73\x96\x61\x5d\x7e\x94\x22\x8b\xa9\x8b\xe2\x10\xa2\x7d\x9b\xff\xf7\x94\x9b\x73\x16\x34\x8f\x84\x74\x38\xd4\x3b\x59\xd7\xb9\x7c\x86\xd9\xe4\x13\xd2\xc1\x39\x50\x98\x31\x1f\xf2\x92\xf3\x9d\x23\xac\x03\x3c\x4a\x14\x47\x5a\xf6\xd6\x99\x53\xf7\xb5\xd3\x2f\xe1\x27\x3c\x4a\x0c\xcd\x7c\xf0\x33\x3b\xc7\x54\xc4\xcc\xab\x87\x6d\x07\xbb\x5c\x1e\x65\x1e\x07\x17\x34\x2e\x7a\x95\xb2\x7e\x80\x92\x21\x38\xfb\x1f\xa9\x5f\x8f\xd5\xb4\xfa\xcb\x23\xc5\x9d\x8e\xa4\xf6\xd3\x7d\xf3\xe7\x08\x0b\x35\x0c\xe2\x91\xe3\x16\x9e\xea\xf6\x65\xff\x7e\x99\x78\xc6\x23\x9d\x32\xec\xe1\x1c\x5d\x35\xff\x51\xd6\xfd\x5c\xd6\x2a\x45\x01\x39\x8c\x8d\x30\x00\x7d\xb0\x5f\x0a\x78\xf0\xc8\xc8\x48\x8f\x4b\x89\x3d\xdb\x1e\x0f\x61\x2a\xf4\x22\x9b\xbb\xbc\xdc\xc8\x71\x1d\x6c\x32\x1f\xd2\xfe\x03\x26\xce\xc6\xd2\x90\xb3\xa7\x6c\xac\x45\x7d\xd7\xd0\x1b\x35\xe0\xd8\xb3\xe1\x07\xc1\xa6\xa1\x60\xe3\x63\xaa\xf6\xe3\x13\xb3\x1e\xff\x09\xcb\x62\x54\x17\x79\x3e\x29\x05\x75\x17\x05\x3c\xbc\x41\xdd\xbe\xd4\xbd\xaf\x32\x8f\x6c\x96\xc6\xce\x8d\xf8\xff\x40\x07\xdd\xb0\x73\xf3\x48\x37\x3a\x8e\xe2\x38\x8d\x87\xd0\xce\x1c\xf2\x8b\x06\x86\x3c\x8e\x69\x94\xc9\x89\x6e\xe4\xb2\x2a\xba\xf5\xa3\xf6\xd2\x41\x17\x04\x33\x78\x1c\x0b\xb7\x87\x63\x1a\xef\xb7\xce\x30\x8f\x62\x42\x18\xed\xe5\x0a\xce\xbc\x61\xff\x1f\x09\x45\xe1\x3b\x13\x81\xcb\xba\xc3\x92\xc2\x43\x2d\xf5\xcc\x31\x9f\xc7\x34\xa2\xd8\x3d\xe9\xa7\xdc\x80\xf6\x0d\x23\x44\x22\x4d\x20\x74\x94\xdd\xaa\xe6\x97\x89\xe9\x8f\xd1\x94\x28\x3b\xa2\x5e\x7e\x97\xcd\xaa\x5b\x4a\xfb\xaf\xc9\x92\x34\x1a\x71\xd3\x31\x3e\x0b\x07\x59\x1a\x2b\x6f\xb8\xe4\x35\xc2\xcf\x19\x39\xa3\x5d\x97\xc7\x3c\x12\xa8\xbc\x34\x92\xfc\xd9\xc8\x16\x56\x2c\x7c\x23\x97\x1c\x69\x9e\x57\x4f\xdb\xf5\xfd\x6a\xbb\xdd\x7b\x83\x15\x2c\xc4\x3a\x00\xdc\xfe\x76\x7d\xb7\xde\x0d\x1f\xb0\xc8\x4f\x59\xa0\xbe\xe7\xb2\xcb\x20\xbc\x4d\xe3\xe5\xad\x2c\x16\xd4\x52\x74\xf5\xb5\xde\x57\x68\xbc\x70\xc4\x42\x3a\xe9\x87\x67\x68\x17\x45\x31\xf3\x3f\xe0\x71\x12\x27\xd8\xb0\x0d\xe7\xef\xe5\x22\xbb\x80\xe6\xea\xe3\xee\x13\xf3\x1a\x1e\xa7\x3c\xc5\x89\xa7\xab\xa6\x8d\x47\x40\x23\x1e\x67\x99\x22\xbd\xe4\xe5\x8f\xc1\xed\xf1\x8b\x82\x07\x8f\x33\xa0\xd8\x5a\x92\xa1\x66\x33\xfd\x35\x15\xc5\xda\xfb\xae\xf6\x08\xe0\x6b\x35\x9b\x40\x8a\x10\xab\x66\x10\x8d\xbf\x45\x84\xfb\xec\xa4\x14\x11\x88\xe2\x71\xb3\x6c\x10\xd4\xe2\xb1\xf2\xfa\x57\x6e\xab\x5b\x95\xd8\xf2\x0c\x1c\x9e\xd9\xb9\x6b\xeb\x18\x50\x5d\x88\xa7\xab\x63\xff\x1d\x26\xa2\x14\xf1\xc4\x68\xc4\xb9\x6f\xab\xd7\x72\xbf\x5e\x3e\xc4\xfd\x71\xa1\x33\x1d\x12\xa3\x37\x87\xc6\x99\x00\xac\x79\x6c\x52\xc7\xe2\x6a\xc0\xf5\x8c\x1f\xa1\xfe\x5e\x9d\xea\xd9\x09\x40\xec\x10\xd6\xed\x40\x41\xbe\xa9\xea\x6e\xff\x68\x86\x75\x36\x06\xc9\x6d\x3c\x56\xf8\x0d\x82\xfc\x4d\xf8\xd1\xe9\xb7\x5a\x26\x05\xb8\xda\x28\xf6\x6a\xee\x6f\x76\x5f\x6a\xb6\xba\x8f\x91\x48\x50\xcc\xb1\x4a\x6c\x8a\xdd\x56\xc1\x3e\x9b\x93\x48\x46\xd8\x4a\xbe\x5e\xdd\x2c\x9e\x6e\x77\xfb\xe5\x66\xe5\xc4\x20\xc6\x2f\x07\x89\xb4\xc6\x32\x33\x32\x5e\x77\xdd\x62\xf2\xb3\x3f\x64\x1d\x7c\xf4\x5e\xfe\xac\xba\x20\x6c\x1c\x10\x91\x38\x8a\x22\xbf\xb7\x3f\x94\xc5\xc7\xf6\xa5\x7a\x0f\x6b\x9b\x19\x0a\x84\xdd\x38\x08\xe2\xcc\xae\xa1\x82\x9a\x18\xf0\x77\xdc\xda\x38\x89\x13\x40\xae\x5c\x09\xef\x4e\xaa\xfe\xb7\x49\xcd\x8b\x13\xa2\x25\x82\xed\xfc\x9a\xbb\xdf\x55\xfb\xd0\xa3\x08\x2f\x24\x61\xca\x20\xb1\x7d\x1f\x34\xbe\x5f\xa1\xec\x8b\xa0\x17\x97\x57\xc2\x75\x34\x03\xc6\x4e\xe3\x39\xc2\x2d\x45\xce\x74\xbf\x40\x38\xfd\x4d\xec\x38\x9c\x85\x49\x44\x44\x12\x65\x47\x1e\x57\x8f\xe1\xa4\x04\x8d\xd3\x80\x67\x59\x1e\x64\xed\x17\x5d\xbf\xe7\x92\x24\xd2\xc6\x4f\x9e\x07\x6f\xd2\x34\x4f\x64\x38\x49\x38\x70\x5f\xb3\x72\xbd\xa1\x41\x28\x97\x93\x54\x44\x58\x3d\x7b\xba\x5a\xed\x96\x0f\xeb\xfb\xfd\xed\xea\xfa\xdb\x6a\xb3\xdf\x3d\x84\xff\xb7\xba\xdf\x6d\xfe\x77\x7f\xfd\xb0\x7c\x72\x2b\xe7\xf7\x05\x8f\xc9\xf0\xf1\x14\x8b\x89\x55\x79\x27\xbb\xed\xa1\x1c\x05\x3e\x24\x4d\x5c\xfa\xfe\x56\xb5\x60\x7c\x51\x27\x1c\x4a\x89\xf5\x2a\x1a\x6d\xb5\x92\x75\xf1\x31\x3c\x8f\xbf\x53\x89\xe3\x24\x95\x24\x49\xfb\xe5\x35\x7c\x3a\x28\xad\xf5\x4f\x35\x35\x31\x9a\x4b\xb9\x86\x24\x16\x8a\xa7\x05\x33\x4e\x52\xeb\x9a\x9b\xe5\xe9\xd0\x4b\x5f\x84\x4d\x8b\xc8\x94\x61\x69\x63\x53\xe9\x57\x68\x11\x4d\x18\x8e\x64\x14\xe3\x99\xef\xf0\x53\x96\x13\x2c\xe3\x67\x85\x2e\x4e\xa4\x71\x86\xa9\xd6\xa9\x7d\x6f\xab\x83\xaf\x42\x4e\xaf\x4d\x11\x81\x68\x29\x3c\xe6\xab\x95\x66\x36\x46\x47\x4e\x64\x2f\x2f\xf3\x76\x00\xd2\x73\x62\x84\x43\x10\xf5\xb2\x0e\xab\xb2\x3f\x66\x89\x15\xbe\x78\xef\xb9\x97\xeb\xe6\xa6\xae\xfe\x82\xf2\xea\xe3\x7a\x0c\xcc\x9b\xfc\x14\x8d\x44\x82\x78\xba\xa2\x7a\xc6\x37\x1f\xdf\xff\x6e\x99\xfa\xe9\xcb\x6f\xe1\x3d\xa3\x51\x92\xea\x31\xb7\xf8\x3a\x7f\x6b\xfa\x9e\xda\xbc\x77\xc5\x69\x1c\x3b\x03\x53\x83\xf9\xe6\xaa\xd6\x24\x72\x1d\xc6\xc9\x5b\x44\x63\xcd\x31\xcf\x08\xfa\xc1\xdf\xae\x1e\x3f\x39\xd3\xd8\x44\xb8\x4a\x79\xee\xed\xac\x90\xca\x29\x89\x28\x3e\x6a\x53\x5d\xd6\xf8\xe0\x94\x68\x36\x70\x96\x6b\x0d\xc5\x9c\x7c\xce\x29\x8d\x12\xe3\x7a\xa2\x6f\x20\x8b\xad\xce\x9b\xa6\x9b\xb6\xe3\x07\x4d\x29\x33\xca\x3d\x05\x14\xde\x9b\xfd\x08\x63\x91\xc5\xf5\x6a\x09\x79\x81\xf8\xa4\x70\x00\x04\xb6\x60\x9c\x47\x57\x35\x43\x67\x71\xca\x35\xf4\xed\xf1\xaa\x2a\xa6\xbf\x29\x22\x19\x39\xf0\x61\xe1\x33\xeb\x65\xfd\xd1\xb4\xb2\x98\x05\xaf\x54\x30\x07\xab\xc9\x9b\x09\x26\x88\x53\x21\x9c\x62\x16\xce\x9d\x80\xaf\x08\xc7\x74\x84\x5e\x4e\xa6\x5a\xa2\x73\x36\x94\xe6\x0a\x59\xa0\xfd\x00\x88\xd0\xd9\xc3\x11\xbd\xae\xf3\x1a\xe3\xed\x8f\x89\x23\xee\xac\x9c\xc3\x69\x92\x64\xc2\x4e\x64\x67\xd0\x88\xce\x95\xd8\xa6\x67\x9d\x24\x4e\x7c\xac\x45\xa3\x40\xf8\xaf\x33\xbb\x7c\xca\xcb\xf6\xb7\xc9\x3d\x4a\x20\x75\x6b\x62\xfe\x7c\x59\x9d\x9a\xd3\x34\xa5\x58\x22\x77\x01\x06\x4e\xbe\x05\xaa\xb2\x85\x6b\xc9\x34\x43\xd4\x69\x37\x8f\x5f\xa0\x08\x32\x97\x17\x77\x1f\x9a\x81\xc1\x9e\x80\x77\x6e\x2d\xf2\xe3\xdc\x0d\x84\x53\x19\x51\xed\x19\x8a\x77\x79\x51\xf4\xe1\x7d\x38\x9c\x58\x2c\x8a\x74\xd7\x76\x57\xbd\xc1\x34\x83\xa4\x52\x32\x34\x99\xfe\x06\x23\x14\x89\xdf\x03\xa8\x62\x04\xab\x8b\xea\xf4\xb1\x2c\x4e\x4d\xeb\x75\x9a\xc2\x67\x55\x02\xb8\xad\xf5\x1e\xc3\x20\x0f\x63\x4c\x0e\xa7\x2a\x75\x90\xbf\xb6\xdb\x5e\xda\x49\xe8\x4f\x95\x34\x18\x2c\x21\xc3\xcf\xdb\x8c\x8e\xa8\xd8\xd3\x8b\x04\xca\xd0\xf9\xe0\x5a\x56\x9b\x53\x01\x4d\x28\x09\x39\xdc\xe6\xdf\xcc\x5c\xce\x41\xc0\x9c\x02\x4b\x98\xcf\xb6\x7e\xaf\x06\xf1\xb8\x4b\xfc\x71\xce\x22\x2e\xbc\x9e\x7b\xbb\x01\x03\x07\x9c\x50\x17\x94\xda\x39\xeb\x32\xe6\xee\x7c\x57\xa5\x09\xd1\x1f\x8b\x33\xc6\xe5\x08\x3e\x82\xc2\xb6\xa1\x47\x34\x2a\x87\x72\x16\x2b\x1d\x08\xd5\x4f\xdb\xeb\x4b\xf9\x1e\x23\x59\x84\x78\xd8\xe7\x13\x34\xcd\xa3\x6c\x9a\xf7\x91\x9a\xfa\x85\x0b\x65\x34\x89\xb0\x2f\x86\x9d\xf3\xc5\xf5\xf5\xc3\x8f\xfb\xd5\x26\x9c\x1a\x4d\x39\xba\xdc\x5c\x3f\xdc\xbb\x00\x6d\xb3\xd8\xad\xc2\x41\x16\xbb\xed\xe0\x5f\xab\xd5\x8f\xc5\xfd\x6e\x9c\x19\x30\x96\x49\x33\xc0\x09\x50\xbc\x14\xb7\xcb\xd9\xd9\x72\xed\x98\x9a\x87\xbc\xbc\xa9\x6a\xe4\x26\x62\x2c\x3a\x94\x89\x58\x12\x31\xd4\x4c\x7b\xd8\x7d\x5f\x6d\x96\x9b\xa7\xf5\xb6\x0b\x10\xfe\xdc\x6d\x16\x4b\x3c\xa3\xab\xc5\xb6\x3f\xa3\x84\x3b\x78\xda\x41\xbe\x82\x2b\xeb\x84\x03\xca\x95\x80\x1f\x6b\x38\xf6\xa1\xe0\x97\x9b\x3d\x4b\xa3\x34\xc9\x82\x06\xbf\x95\xa7\xa2\xbd\x83\x56\x1a\xd9\xca\xa7\xcd\x7a\xb2\x0a\xb2\x8c\x72\x0e\xde\xb4\x12\x63\xae\x0d\xe0\x66\x35\xbb\xd8\x4c\x64\xa8\xde\xf7\x5c\x99\x2d\xb4\x3d\x9d\xe4\xf2\x46\xc5\x32\x4d\x51\x15\xc5\x91\x2e\x3f\x55\xcc\xe0\x2c\xb3\xce\x99\xe4\x6e\x75\xbf\x5d\xcc\xbe\x44\x72\x1d\x0a\xca\x3d\x4d\x9a\x33\x99\x5a\xa7\xa6\xef\xa1\x0e\xdd\x76\xb9\x01\xfb\xf7\xa2\x20\x26\x15\xc3\x7d\xa6\x09\x2a\x81\x9c\x29\xa2\xb0\xdb\xb8\x85\xc2\x16\x05\xd4\x1f\xff\x5b\x9d\xc6\x2b\x02\xd3\x0a\x68\x80\xbf\x6d\x8f\xa0\x73\x59\x7c\x05\x6c\x9b\xfd\xa2\x21\xce\xb5\xd2\xa5\x60\x4f\x75\x31\xaf\xd6\xfd\x9b\xff\x27\x0c\x55\x0c\x3b\xca\x25\xbc\x07\xb5\x98\xcf\xb5\xeb\x38\x83\x54\x13\xcf\xc6\xf7\xe4\x86\x4f\xca\x8f\xb3\xcf\x59\xaa\x48\x34\x72\xd4\xb0\x50\x7f\x1f\xc9\xa9\xfd\xaa\x74\x12\xbe\xc5\x12\x2c\x72\x78\xd1\x7b\xbc\x63\x63\x7d\x60\xce\x23\x1d\x61\x07\x72\xa8\x1e\x39\xb2\xf5\xd7\x4a\x9b\x9c\xc7\xc6\xf9\xad\x16\xdd\x82\x32\xd4\xd5\x39\x89\x19\x6e\x54\xc8\xda\xd6\x55\x6d\x7e\xe4\x9f\x64\xfd\x9c\x10\xc0\xae\xd7\x0f\x90\xc7\xca\x55\xd7\x7a\x22\x24\xe7\x84\x3a\x79\x82\x12\xde\xef\x00\x39\xbe\x97\xee\x2f\xa7\xd4\x22\xc6\x20\x77\xee\x15\xeb\xf2\x4c\xa2\x89\x77\x11\x48\x14\x24\x3b\xdd\xea\xea\xb0\xfc\xf3\x61\x9c\x23\xb6\xf7\x36\x97\xe5\x95\xac\x86\x2e\x0c\xe7\x54\x70\xec\xac\x74\x31\x29\x94\xba\xa8\x4e\x66\xbc\x18\x71\x2a\x9d\xd2\xfb\x55\x0d\xe5\x73\xd3\xef\x46\xe1\x30\xa3\x22\xeb\x6e\xf2\xc3\xfd\x6a\x7f\xbd\x5a\xae\xef\x16\xb7\xfb\x7f\x3e\x2d\xee\x77\x4f\x77\xfb\xc5\xfd\xbf\x3c\x9e\x6a\xe4\xec\xc9\x39\x93\xc4\xc5\x3d\x0e\x2d\xf5\x2e\xbb\xfd\x77\xc4\x76\x0a\xc3\x74\x1a\x7c\x24\x96\xf5\x87\xa9\xb7\x6d\x55\x3b\x52\xc1\x80\xe2\xe0\x9c\xd9\x0c\x27\x93\xcd\x8b\x62\xf9\x22\xcb\x12\x66\x31\x18\x67\xd6\x75\x63\x0e\x41\x3a\xe3\x32\x46\x9b\x73\x2e\x9d\x36\xc2\x45\xa1\x9d\xcb\xcf\x99\xeb\x0c\x63\x1c\x2d\x8f\x0b\x94\x15\xed\x13\x11\x2e\x58\x4a\xdd\xb6\x36\x4f\x05\xb8\x90\xce\x47\xe3\xdb\x1f\xce\xfb\x7d\x5a\x08\xff\xe2\x95\xe3\x42\x45\x88\x59\x71\x85\xc1\xc7\xaa\xa8\xca\xbc\x4f\xec\x79\x92\x02\xb2\xb0\x4e\x0d\x5c\xaf\x6e\x57\xdf\x16\xbb\xd5\x72\x71\x7b\xdb\x1f\xce\x22\xec\x43\xef\x55\x6e\x0c\xbe\x73\x8b\x12\x8d\x39\xe1\x2a\x3f\x5f\xd0\xa7\x0f\x23\x95\xca\xd1\x7a\x3e\xf4\x4c\xca\x87\xf3\x14\xb2\x58\xcc\x7c\x97\x65\x31\xf8\x65\xf8\x61\x19\x71\xa2\x1f\x06\xd4\xe9\x79\xff\x22\x9b\x17\x7a\xf5\x11\x32\x70\x3f\x46\xc5\x9c\xf2\x50\x72\xbc\xa9\xea\x7b\x78\x77\x7e\x7a\xb3\x3b\xa8\x38\x60\xde\xb0\xdc\x4d\xda\x39\xdc\xc4\x4e\x00\xcc\x13\x04\x46\x89\x33\x37\x71\x82\x16\x7d\x3d\x74\xdb\xc7\x6c\xeb\xb2\x4b\xb1\xf3\xf2\xd9\x61\xf2\x6f\xaa\xba\x47\x43\x4e\x6f\x81\x61\x4e\xdb\x5c\x1a\x73\x1b\xaa\xd1\xd3\xb3\x32\xcc\xe0\x8d\xf8\x91\xff\x2c\x64\xbf\x6c\x18\x1e\xa9\xc4\xab\x5b\xba\x56\xdc\xaf\x54\xbd\x38\x07\xcb\x9c\xa0\x29\xd2\x39\x86\xf2\x38\xb7\x11\x43\x1d\x8b\xe6\xf9\xa8\x67\xbf\x6e\xad\x40\x35\xfc\x3f\xf2\xb7\xbc\x0a\x73\x42\x44\x89\x13\xcb\xac\xa1\xad\x73\x78\x43\x06\x49\x38\x94\x46\x58\xab\xd8\x4b\x55\xd5\xa1\xb9\x37\xb2\xa7\xe5\x22\x26\x80\xf5\x6f\xe4\x24\xce\x7b\xf7\x5c\xc4\x89\xd1\xae\x56\x7f\xac\x6a\x04\xa7\xfc\xf6\x4b\xec\x3a\x17\xb1\x8c\x50\xb3\xa2\x84\x9f\x83\x2e\x70\x77\xd7\x87\x12\x95\x88\x6d\x64\xbc\x8d\x96\xcf\x5d\x6f\xf3\xb7\xf0\x28\x05\x89\x35\x3e\xe5\xf6\x05\xae\x3e\x77\xf7\x08\x83\xa9\x70\x74\x5f\x2c\xd6\x4d\x57\x0f\x41\x58\x2a\x9d\xb3\x7a\x8b\x72\xc1\xe0\x15\xdf\x4f\x23\x13\xd2\x51\xec\x2e\x28\x57\x34\xf1\x92\x48\xf9\x1c\xc2\x76\xfe\xdb\xd4\x3b\xdd\xf7\x82\xb5\xb3\xc2\x81\x60\x1c\xe8\x48\xfa\xec\x3a\x10\x7d\x86\x7a\x63\xb7\x8c\xa0\x24\xe1\xe0\x3d\x6f\x63\x76\x6e\x3e\xdf\x0d\xb4\xb1\x6f\x91\x07\x87\x8c\xfe\x3a\x39\x01\xe6\x4c\xc6\xbb\x0d\xb0\x6f\xd7\x5c\xde\xbd\x04\x4e\xb3\xe0\xeb\x52\x98\xd9\x66\x22\xb8\x25\x08\x09\x5f\x14\xc5\xb2\x37\x80\xea\xfe\x0c\x48\xef\xcb\x1b\xcc\x06\xc7\x02\x09\x5c\x88\x34\x8d\xb0\xe6\x1c\x0b\x1f\x9d\x87\x03\x59\x86\x0c\x3c\x03\x6a\xf4\xca\xcd\x4e\x28\x89\x33\xee\x6b\x47\x37\x79\x81\x52\x85\xbb\xde\x2c\xa5\x3b\x0c\xc6\x99\x07\x3e\xbb\xd2\xea\x08\x8b\x10\x86\x48\xe7\x09\x53\xa2\x3a\x7a\xf8\x60\x46\x25\xc6\x10\xcb\xea\x80\xd5\xf4\x6e\x5f\xbc\xac\xef\xc5\x85\x24\x06\x5f\x2f\xe5\x53\xbd\x30\xb9\x2f\xd0\x9f\xbb\xc1\x20\x83\x42\x4a\x6e\x2e\x43\x0c\x84\xe4\x0e\xd6\x8a\x42\xe5\xce\xc6\x6a\x61\x5b\xa8\x7b\x78\x11\x17\x32\x75\x2a\x66\x48\x4a\x47\x85\xff\x33\x0e\x24\x17\x52\xf1\x9e\xbe\x2d\x6b\x68\xab\x90\x8d\x5e\x4c\x7f\x85\x4a\xfa\x7c\xeb\x8f\x5c\xc3\xb1\x86\x26\x37\x50\xb6\x70\x0d\x77\xd0\xc8\x33\xb7\x83\x09\x4c\xa4\x7f\x8b\xb5\x4e\xb1\xfe\xbb\xbe\x5f\x87\xee\x4c\x38\x69\x43\xe2\x84\x04\x4e\x5f\x2b\xf5\xeb\x59\x89\x53\x00\xb7\x0e\x5d\x51\x3d\x63\x81\x5a\x5a\x5b\xc0\x72\xda\xcb\xbe\x3c\x15\x20\xe3\x78\xd3\xcc\xa9\x7c\x86\xaa\x9c\xbf\x50\x96\xd1\xc0\xd4\x0c\xfe\xb1\xcd\xd5\x07\x72\x28\xea\x8f\x49\xe2\x21\xac\xc9\x10\x52\xe3\x1f\x68\xa0\x56\xce\x67\xbb\xb5\xd6\xf8\x8a\xae\x23\xbf\x74\x8f\x67\xf2\xa3\x49\x14\x2b\xf4\xe8\xac\xab\xa2\xa8\xde\x82\x5a\x6f\x5e\x99\xb5\x5d\x15\xf2\xd8\x93\xd3\x78\x12\xd1\xc4\x51\xae\xab\xd2\xcc\xd1\xc0\x3c\x89\x32\x16\x94\x09\xda\x0d\x1c\x4f\xad\xdb\x64\x66\xcf\xe1\xe2\x53\x4d\x08\x09\x10\xe5\xaa\x86\x3f\xdd\x02\x76\x01\xd3\x17\xfe\x9d\x9c\x3f\x21\x80\x6e\x23\x47\xf9\xf1\x58\x55\xe1\xb5\x4a\x08\x37\x78\xab\xe1\x90\xb7\x9b\xaa\x98\xd1\x39\x47\xcb\x62\x42\xd2\x44\x43\xbf\xc6\x86\x62\x73\xc2\x2c\x83\x01\x44\x7c\x27\x5b\xfd\x72\x39\xa1\x98\x6c\x7e\x09\x17\x34\xd0\xef\x02\x3d\x0c\x95\xe0\x87\xd7\x39\x11\xb1\xc6\x2a\xf8\xf6\x6a\xb9\x0d\xbf\x26\x54\x8c\xd5\x81\x50\x60\x1d\xe3\xb6\xbe\xe4\x86\x76\x1f\x75\xf4\xf5\xc6\x7b\x52\xdc\x4e\x14\x0e\xc2\x20\xe0\x8a\x8e\x2a\x0d\x67\xfc\xb8\x73\xd4\x43\x92\x64\x0c\x23\xbd\xdb\xea\xf9\xf7\x11\x79\xe6\xcc\x4f\xf6\xd2\x9c\x0f\x18\xe8\xf0\xaf\xe7\x13\xf1\x24\x55\x1a\xfc\xfb\xb5\xac\xc1\xe4\xad\xcb\x0f\xce\x65\x4d\xbb\x88\xcf\xd5\xd6\x0c\xfc\xf7\x04\x41\xb3\x82\x27\x19\x61\x4e\x34\xb4\x96\x9f\x7b\xc2\xff\x8d\x42\x4f\x22\x49\x82\xaf\xfa\x68\x73\xca\xc2\x8f\x48\xe1\x24\x91\x91\x69\xb8\xd5\x2f\xd0\xc7\x62\x89\x94\x14\x4f\xeb\xb9\x2a\x4c\x70\x56\x9e\xee\xcc\x89\x94\x3c\x75\xb2\x4b\x6f\xc3\xc7\x74\x86\xcb\xf5\x77\x79\x3c\x7e\x5c\xc1\x04\x35\x94\x28\x92\x46\xc9\x58\x6c\xbf\xfb\xdf\xf1\x6a\x79\x79\x8f\x4e\x14\x01\x0f\x6d\x76\x34\xf3\x39\x5e\x24\x51\xdc\xb5\x4b\x6d\x6e\xe4\x23\xd4\xb8\x5e\xf5\xc7\x92\x34\x0e\x4a\xc0\x17\x6a\xa0\x89\x4a\x0d\xb6\x6b\x11\x49\xac\x1b\x59\x4c\xe8\x75\x3c\x51\x2a\x46\x8b\x04\x95\x4f\xa9\x59\x3c\xd1\x91\xb5\xa4\xd7\x5d\x71\x9f\x7a\x28\x61\x90\xb0\xe6\x89\x49\x09\x8f\x46\x48\x97\x71\x14\x3f\xfd\x32\xa3\x55\x0c\xfd\xc2\xd2\x40\xfd\x26\xfb\xbc\xe3\xb2\x80\x22\x4f\x20\x72\x3a\x72\x48\x82\x2d\xaa\xf7\xdd\x40\x56\x92\xc5\xf8\x5d\xb4\x11\xc7\xad\xfd\x00\x75\x97\xd1\x85\x3c\x34\x9c\xa5\x8d\x49\xe4\x9c\x7c\x1e\xf1\x26\x3c\x3a\x26\xe1\x24\x3c\x48\x2c\x4d\x1c\x35\xb2\x6a\x65\xe1\x4a\x73\x0f\x16\xdb\x4c\xa1\xf2\x8a\x6d\x89\xea\xd4\x8e\xec\xeb\x79\x62\x33\x19\x39\x3b\xa6\x0f\xb4\x03\xf6\x7f\x4f\x23\xea\x34\xbb\x50\x97\x6a\x7d\xff\x6d\x7f\xf5\x74\x7b\xbb\xed\x8f\x72\x83\xd3\x08\xdd\x68\xa7\x2f\x4c\x1a\xa5\x71\xac\x43\x5b\xb3\x70\x32\x1c\x87\xcf\xd2\xfc\x34\xd2\x4e\xb7\xf9\x80\xcd\x09\xdf\x1a\xf2\xc7\x62\x21\x31\x19\xd0\x23\x70\x57\xaf\xd8\xcd\xd3\x38\x61\xd8\x33\xef\x76\x6c\x2f\x65\xf9\xeb\x7e\x54\x1a\xa7\x2e\xc6\x47\xe5\x9f\x77\xc8\x77\xd5\xcd\x0c\xb0\x96\x12\x42\xbc\x0d\x9a\xe3\xb4\xf8\xc7\x36\xea\xca\xa7\x24\x4b\x30\x02\xcf\xcb\xa6\xcd\xdb\x93\x8b\x14\x27\x33\x26\xa5\x71\x84\x12\x10\x4e\x29\x6e\xdf\x7c\xa6\x65\xc7\x53\xca\xa8\xcd\x42\x4b\xd3\x40\x7d\x0d\xb2\xd8\x1e\xcf\x92\xde\x94\x6a\x57\xcd\x40\xb8\xc3\x44\x78\x96\xa7\x2c\xcd\x98\x6f\xe1\xaf\x9c\x23\xe6\x79\x98\x93\x32\xab\x9c\xbc\x0f\x56\x14\xb6\xdf\x17\x9b\xd5\xfe\xe1\x66\xbf\x5b\x2d\xee\xc2\xf7\x70\x99\x26\xae\x62\xd2\x25\x23\x98\xdb\xca\x21\x25\x4f\x45\x9a\x61\x9c\xd8\x6d\x68\x77\x79\xd9\x4e\xfb\xf0\xd3\x5f\x4b\x52\x83\x76\x2b\x3e\x2d\x5a\x2f\x1f\xdc\x3b\x3c\x41\x81\xa5\x49\x96\x69\xd7\x43\xd1\x55\x6d\xce\x40\x40\xd3\xaf\x4c\x23\x2a\xbc\xce\x59\x40\xe4\x6c\x90\xc8\x06\x6b\x3d\xbf\xd8\x94\x26\x5e\xaa\x23\x84\x01\x43\xb4\x30\x7d\xb9\xd3\x94\xa6\xb8\xf3\x63\xab\xef\x36\x6f\x2e\x02\xbf\x3e\x5b\xe3\x87\xf7\x38\xcd\x32\x2a\xc7\xc0\x39\x0f\x70\xf1\x2d\xa7\xc9\xba\x95\x4a\x2a\x82\xcd\xf1\x7a\xb7\x43\x51\xd2\x6d\x3e\xa5\x5d\xf2\x54\x32\x27\xac\xeb\xc1\x4c\xbb\x6a\xe1\x25\xf8\x67\x4c\xe5\x51\x01\x20\x95\x59\x46\x93\xb1\xd4\xf9\x19\x87\x2b\x26\x3e\xea\x48\x55\x4c\x54\xe6\x04\xe8\x46\x2f\x96\xa2\xd6\x17\x84\x4a\x59\xec\xed\xa9\x34\xb5\xcc\xfb\xce\x4d\xaa\x84\x03\x0d\x0d\x86\x1b\x33\xce\xe8\xec\xa1\x69\xa6\x50\x3f\x1c\xab\xe2\xce\x82\x34\x57\x05\x8c\x94\x16\x77\xd5\x76\x2c\xcf\x76\x39\xd2\x9a\x7f\x2b\x10\xac\xf0\x6f\x8f\xd5\xeb\xd0\xae\x98\xbc\xea\x26\x4e\x48\x28\x7f\x61\x35\x7e\x16\x97\xfb\x61\x10\x45\x48\x42\xdb\x56\x63\x76\x10\x4f\x2d\x15\x84\x4d\xec\x62\x7e\xe4\xe5\x48\xb8\x8a\xa7\xd6\x00\x62\x1d\x4a\x78\x7f\xcc\xcb\x12\xcc\xe2\x78\x5c\x97\x4d\x3b\xc9\x6e\x26\x4f\x34\x8b\x12\x92\x75\x53\x6d\x29\x8f\xed\xa9\x86\xdd\x0b\xdc\x14\x72\x22\x10\xcd\xb3\xc8\x30\x15\xda\x7e\x23\x03\x1b\x9e\x45\x60\x11\xd9\xe7\x6a\x5e\x5f\x56\xb0\xa7\xbf\x1a\x47\x86\xf5\xd6\x9f\x8f\x75\x7e\x90\x75\x78\x01\x33\xc2\xd3\xd8\x39\xf6\x99\x6a\x6f\x40\x9a\x22\x2f\xa1\x3f\x98\x99\xb1\x97\xcd\x3d\xfc\x9c\x76\xcb\x32\x62\xd8\x70\x93\xee\x2b\xd3\xa3\xbd\x32\x1a\xf5\xa2\x3b\x8b\x06\x7b\xcb\xfa\xb5\x79\x6a\xa0\x76\xe4\xd3\xcb\xb4\x25\x9e\x51\xe2\x94\xbc\xa4\x31\x08\x45\x31\xb3\x9c\xaf\x4b\x38\x11\x0e\xf6\x3f\xb8\x8a\x85\x5f\x63\x59\x1a\xb8\x32\x5d\x1e\x58\xbf\x92\xe9\x3d\x65\x59\xa6\xc4\x04\x7b\x56\xd9\xbc\xbf\x0a\xce\xdd\x65\x02\x52\x41\xcf\x84\xda\xbf\x2c\x51\x74\xef\x3d\x06\xf9\x5e\x36\x72\xae\x64\xc4\x33\x21\x34\x0d\xe4\x22\x68\x5f\xf6\x6a\x9a\x5c\x86\x51\x99\x92\x83\x62\x82\x19\xd0\x73\xd3\x61\x49\x92\xa0\x9a\xd9\xfa\xad\xaa\x51\xfb\x36\x5c\x43\x92\x3a\xed\xc6\xa6\xed\xe2\x6a\x2d\xe7\x9d\x87\x4f\x45\x81\x79\x96\x46\x29\x16\x07\x3c\x5c\x77\x07\x3f\xfb\x6f\xed\x36\xc3\xee\x10\x2e\x50\xd5\xfb\x08\x4a\x32\x33\xf0\xe8\x86\x5a\x64\x6c\x7e\x83\xf6\xb6\x6a\x5b\xf0\x34\xba\x34\x1c\x4e\x32\xc7\x69\xeb\x82\x6c\xc7\x7b\x86\xa2\xe8\xf5\x00\x79\x96\x7a\x59\xe9\xa3\xef\xa1\x36\x1b\x59\xbe\x86\x83\x59\xa2\x79\x3c\x16\x49\x0e\x71\xfd\xc5\x35\x27\xcb\xa4\x72\xba\x86\xa1\x14\x31\x51\x16\xf1\x83\x64\x6c\x91\x67\xf9\x7d\x08\x90\x33\xa9\x59\xea\x28\x81\xcd\xcb\x6c\xb8\xa2\x56\x0e\x0a\x95\xdb\x57\x0f\x7f\x99\x1b\xcd\xf1\x4c\x09\x57\xcd\xed\xb2\x0b\xb7\xde\xf5\x7e\x5c\xf3\xaf\x4c\x9d\x69\x53\xaf\x1d\xf0\x70\x04\xf4\x79\x9f\x3d\x74\x4d\x04\xaa\x6d\x75\x4b\x68\xcf\x98\x98\x0d\x91\x71\x46\x46\xf2\xbc\xa7\xe3\x59\x6a\x9f\x69\xc5\x83\x1c\x79\xf7\xc9\x7d\x3d\x13\xa2\xf3\xc3\x0c\x8f\xb1\x51\xf8\x83\x6e\xf5\x4b\x55\x15\x5f\x14\x5b\x67\x57\x0e\x2c\x61\xbd\xc3\xd6\xba\x69\x4e\xdd\x3c\xbf\x95\x4d\x7b\x57\x99\xdc\xe6\x7d\x1c\x91\x41\x16\xd9\x3e\x5a\x1d\x49\x8e\x2c\xcf\xbb\xdb\x99\x15\x4e\xaf\x30\xf8\xf6\xdd\xc9\x9f\xf3\x02\xba\x8c\x62\x1e\xf1\x01\x23\xee\x1b\x1d\x8e\x7c\x1f\x86\xd0\x4c\xc9\x91\x97\xda\x08\x62\xf7\xcb\x37\x44\x46\x49\x8a\x6a\x11\x2f\xb2\x71\x24\xd1\xe9\x39\xca\x28\x25\x24\xee\x35\x15\xcf\x1c\x58\xb8\x8c\xac\xf3\xf2\x75\x38\x68\x17\xec\x9a\xe1\x60\xe6\x0d\x34\x0f\xd5\xdb\x05\x47\x45\x2e\x63\x92\x25\x32\x7c\xdc\x0b\xac\x39\x3a\xd2\xf0\x2d\x31\x75\x62\x43\xc7\xaa\xf8\x40\x4f\x95\xdc\x6b\xe0\x8d\x92\x42\x19\xeb\x98\x79\x14\xda\xee\xa5\x06\xf8\x21\x3f\x6e\xbb\xf5\xfe\x42\xe0\x3c\xfc\x3a\x21\x3c\x76\xb5\xcf\xee\x17\x67\x97\x4e\xa8\xf3\x19\x6d\xa0\xdd\x07\x05\x47\x79\x09\x41\x2e\x09\xd5\xd4\x19\x2e\x1d\xf2\x01\xeb\x19\x0e\x1a\x47\x46\x58\xeb\x0a\x15\x98\x46\x8d\x07\x49\x95\x15\xd0\x1b\x21\x57\xa7\xd6\x2b\xe4\x83\x19\xe9\x04\x73\x49\x81\x20\xc7\x30\x6f\xfc\x45\x3b\xa0\xd7\xec\x2c\x58\x22\xb8\x07\x14\x75\x11\xec\xe0\x4f\x13\x8e\xdb\x44\x78\x55\xa6\x2e\x2a\xb9\x3f\x1d\xc2\x11\x1e\x49\x14\x9d\x38\x54\xa5\xac\x83\x72\x27\x97\x3c\x76\x42\x8d\x23\xd0\xab\x07\x39\x0d\x23\x84\x70\x3c\x01\x94\x5b\x58\xed\xbe\x5f\x0e\x95\x24\x67\x31\x2a\x79\xec\x8f\x4e\xd8\x66\x57\x79\x05\xe3\x91\x8d\x1a\x97\xb8\x4a\x61\xe2\xa3\x11\xa1\x32\x4e\xe2\x25\x37\x4e\x71\xf0\x03\xce\xfc\xe2\xa6\xbf\x25\x6c\x26\xfb\x35\xc5\x2f\xb9\xbf\x7d\xed\xb6\x74\x39\xba\x90\x49\x94\x0a\xbf\xf7\x3a\x16\x95\x03\x8d\xcc\x46\xa5\x9a\xe3\xb5\xbd\xc8\x66\x53\xcd\xa2\x3d\xbf\x47\x48\x29\x5d\x1d\xf6\x4a\xb6\xf2\x75\x72\x59\x8a\x12\xe9\x7e\x43\x9f\xea\xbc\xfd\x98\xcd\x1e\x43\x5d\x95\x60\x59\x95\x25\xe8\x91\x93\x2d\x97\xc6\x28\xa4\xb0\xe3\x8c\x39\xcf\xd3\xa4\xb1\xae\x11\x36\x54\x3d\xce\xab\x40\x12\x22\x85\x29\x1a\xfc\x74\x1a\x2c\x70\x4e\xb4\xfd\xf5\x7d\x02\x21\x30\x3d\xb8\xcb\x0b\x68\xd0\xf8\xb7\xce\xf5\x85\xb8\x39\xfc\x1b\x30\x86\xd2\x26\x51\x24\x42\x01\xb5\x6e\xda\xd0\x1d\x38\xc7\x4a\x4b\xab\xa3\x89\x4e\xac\x23\x77\x85\xc9\xad\xe2\x98\x27\xbe\x4c\x77\x5b\xe9\xd7\x19\x9c\x68\x3a\x43\x54\x9c\x2a\xc4\xc6\xcd\x03\xb6\x8b\x61\x90\x8a\x81\x59\xdf\xdc\x73\x88\xc6\xcf\xa0\x0c\xf3\x0a\xde\x78\xa1\x55\xb1\x75\xfa\x77\x83\x0e\x08\xd4\x6e\x53\x1c\x1a\x3a\x8a\xc4\x31\x32\x87\xd0\xee\x6b\x91\xd7\xcb\x5a\x36\x2f\x93\x78\x4f\x11\xee\x98\xbc\x57\x79\xf5\x5c\x4b\x6b\xf3\xfe\xb3\x26\xc6\x80\x06\x67\xd7\xcd\xc8\x69\xcc\x1f\xa7\xcc\x62\x2e\xb8\xef\xe5\xf9\xa7\x77\x58\x51\xce\x11\x76\xe4\xd8\x01\x1f\xd7\x50\xc0\xf3\x5c\x62\x84\x2b\xaa\x33\x14\x8d\xd8\xe5\xd5\x78\x1e\x2b\x6a\x5c\xd9\xb5\x19\x90\x1b\x98\x01\x9d\xc5\x06\x8a\xa9\x14\xdf\x97\x5e\xcd\x74\x7b\x52\x9f\x3c\x28\x1e\xf1\x60\x08\xec\xb7\x96\x87\x93\xd7\xb4\x85\x7a\x9c\xb1\x28\x4e\x13\xe3\xd8\x0d\x85\x7d\xe8\x4f\x8a\x1b\x8e\xc2\x60\xce\xd8\x44\x36\x67\x8a\xc6\x7e\x9c\x48\x2d\x24\x23\xe1\x9a\x5d\xb5\x6a\x5f\xd6\xe5\x71\xa6\xf4\x14\x46\xcb\x08\x2f\x40\xcb\xf2\x3a\x6f\xd4\xa9\x6e\xc0\x7b\x6f\xe0\xe5\xf6\x73\x32\x89\xe3\x34\x09\x02\x48\x37\x75\x75\x58\x9e\xe3\xca\x54\xa2\x29\x46\x16\x2e\x53\x3d\x82\xf9\xc2\x4e\xe6\xb3\xd7\x70\xfa\x3a\xaa\x04\x5c\xbc\xf9\x0d\xe5\x8a\xf3\xc3\xe9\x70\xe5\x02\xf4\xbe\x38\xa9\x12\x1b\x61\x25\x68\x1f\x88\xef\x5f\x70\x63\x54\x9a\x45\x46\x8c\xd4\x24\xdc\xec\xf1\x45\xb7\x91\x44\x06\x4e\xba\x8b\x2b\x84\x4a\xb5\x4b\xad\x9b\xfc\xb9\x94\xc5\x95\xd4\xaf\xa7\xe3\x8f\x99\x2d\x48\x18\x6a\x0d\xd8\x10\x64\x1e\x8e\x2d\xec\xc9\x34\xe5\x51\x99\x00\x14\x67\x71\x75\xc2\x55\x69\xc6\x84\xe7\x70\x7b\x42\x49\x5c\x65\x4a\x89\x74\xf8\x3e\x0f\x2a\xbf\x48\x05\x53\x52\x30\x24\x1f\xdc\x56\xcf\x37\x55\x3d\xaa\xbc\x5e\x6e\x0e\x28\x69\x9c\xda\x2e\x2e\x36\x3b\x90\x61\x47\x55\x2a\xa1\xf8\xb6\xf7\xe0\xdd\x5f\x3d\xc9\x4f\x9e\xe8\xec\x36\xaa\xd4\x78\x11\x02\xac\x37\xc9\xc1\x45\xec\x92\x6a\x43\xf8\x50\x66\xb5\xd7\x17\xfc\x5e\x15\xe7\xf8\x39\xa5\x14\xb0\xb1\xe3\xc9\x60\xa7\x7e\x09\x6a\xa9\x34\x11\x09\xed\x83\xba\xe9\xa6\xa3\x34\x55\x28\xa0\x88\x8c\xab\xc3\x79\xd0\xab\x74\x02\xd8\xc1\x39\xca\x8f\xd0\x8a\x0e\x37\x4d\xa7\x3c\xf6\x0c\x25\x07\x58\xfe\x64\x3e\xea\x8c\x63\x8d\xb2\x5f\x4a\xa7\x26\x7c\x5c\x19\x19\x67\x63\xdd\xb0\xaf\x01\x2c\xca\xc8\x04\xc1\x3d\x7b\xaf\x68\x73\x6a\x3e\xf1\x46\xe0\xca\x68\x99\x39\xb8\xf5\xee\xe3\xf8\x19\x2f\x5a\x01\xe7\xd2\x99\xe8\x75\xdf\xd8\x38\xa7\x97\x3d\x89\xf6\x37\xa0\xea\xd3\x50\xa2\x50\x90\x70\x46\x7c\x9b\xf7\xf6\x16\xe4\xf3\xb0\xa0\x41\x26\xb1\x6f\x76\x0f\xef\xd7\x20\x8b\xff\xe7\x4e\xcc\xa5\x6a\xde\x64\x47\xd2\x11\x49\xb0\xd1\xba\x58\x86\x62\x83\x8e\x52\xeb\xbd\x22\x03\x9e\x63\xde\x88\xd4\x51\xc6\xb1\x1e\x8b\x15\x97\x07\xfb\xf4\xb4\xbe\xfe\x6d\xfa\xb5\x9a\x5a\x31\x88\x30\x7c\x93\x07\x70\xd4\xc1\xc9\x44\xd1\x91\x66\x81\xd2\x85\xc9\x4f\x77\x3f\xcf\x7f\xcc\x08\xdc\xf4\xc1\xe4\x2d\x26\xcd\x5f\xf6\x6b\x74\x04\x4e\xff\x21\x4c\xe4\x5e\x35\x7a\xd1\x56\x87\x5c\xcf\xbe\x9c\xc4\x80\x1c\x47\x55\x9c\xe0\x21\x2c\xda\x9a\x08\x83\xa0\xb5\xf6\x25\xaf\xcd\x2e\x87\x3a\xd0\xc6\x9f\x8e\x47\xa8\xf1\x54\xc7\x6d\x1e\x4d\x4c\x8a\x2f\x8f\xa9\xf3\x37\x58\xca\x7a\x7a\x33\x68\x44\xb1\x0b\x70\xfc\xa8\xe5\xe1\x02\x92\x6a\x7a\x4f\x68\x94\xa1\x08\xeb\xa9\x9c\xca\xa6\x4c\x27\xa1\xa6\x0a\xb0\xb5\x71\x1c\xb4\xce\x1d\x42\x66\x7a\x37\xa8\xd5\x88\xce\xdb\x37\xd0\xa2\x1c\xf4\x55\xe8\x66\x5f\x9e\xb6\x9a\x51\x83\x25\x02\x54\xb6\x23\xd3\xce\xbd\x66\x09\xc3\xdc\xff\x8f\xaa\x85\x87\xf2\xee\x63\x07\x4d\x21\x97\x55\x51\xf5\x77\x82\x01\xc7\xdf\x5b\xfc\xb9\x5e\x2c\x1f\xd6\xf7\x9f\x9c\x3d\xe7\xce\xb1\xeb\xc7\xbf\xba\x59\x3f\x8e\x21\x34\x97\x04\x39\x58\x2f\xb2\xb0\x17\xa3\x40\xcd\xc1\x64\x83\xc7\x77\x6f\xf1\x77\xb1\x24\xa9\x85\x95\xd8\xf0\x7f\x85\x8f\x07\x3b\x5f\xc9\xfd\x98\x44\x12\xea\x65\x21\xab\xab\x53\x78\x31\x75\xa2\xa2\x60\x63\xe3\x1e\xc5\x2e\xe0\x8f\x74\x6a\x18\x3a\x6e\x62\x83\xf4\x9c\x7d\x7c\xa1\x7c\xae\x33\xe2\x82\xf8\xb7\x1c\xde\x31\x85\xee\xe5\x97\xcf\xdc\xd3\xb9\xce\xa8\x03\x11\x77\x81\x54\x0e\xf5\x46\xb6\xe7\xa8\xc4\x4f\xe6\x7f\x26\xf8\x48\x50\x05\x39\x6c\xe1\x48\xc2\x10\xfb\x5f\xf6\x92\x0e\xdf\x65\xf3\x02\xc3\x8f\x5a\x8e\xb7\xa1\xd1\xb2\x00\x13\xfa\x9c\x8f\x53\xfe\x81\xd6\x04\xf0\xd4\xae\x17\xbb\xd5\x7e\xbd\x7c\xd8\x8f\xcc\x5d\xb8\xd6\x09\x43\xec\x8f\x3a\x61\xb0\xe3\xf9\xd9\xb3\x97\x4e\x83\x74\xa6\x87\x07\xa8\x9f\xa1\xd4\x1f\xf3\x28\x60\x76\x49\xda\xa6\xf8\x92\x7a\x96\xd5\x27\x73\xca\x24\x14\x3d\x14\x1e\x8e\xa3\x04\x49\x9b\x44\xd8\xc1\xb6\xc1\x2d\x06\xe1\x18\x28\xa6\xe8\xc4\x01\xb3\xc5\xe6\xa5\x3b\x6c\x62\x12\xe1\xda\xe8\xea\xca\x93\x94\xcc\x10\x22\x10\x1b\x77\xf7\xf1\xd4\x40\x7d\x3f\x40\xdb\xc2\x71\xe5\x54\x2c\xfc\x76\x32\xb6\x63\xbd\x98\x35\x04\x1a\xcd\x68\xc6\x18\x9a\x02\x6a\x35\x1e\xf2\xb2\x1d\xf4\x10\xc2\xc1\x8c\x63\xf3\xe4\xcf\xeb\xc9\x9f\x59\x62\x31\x32\x1f\x35\xdc\xd3\x0b\x60\x30\xc3\x6c\x62\x7c\xbd\xf2\x20\xeb\x8f\x6f\x72\xec\x50\xc2\x0d\x4f\x04\x36\x48\x3d\x78\xba\x99\x2a\xf4\x76\x11\x75\x8c\xc9\xd3\xb6\x0b\xe5\xda\x53\x0d\x1b\x78\xee\x8f\x59\x81\x80\xf2\x0a\x3d\xe9\x64\xb1\xcd\xfb\x29\x68\x04\xa3\x78\x49\x20\xeb\x72\xc4\x93\x32\x22\x89\xb1\xca\x8c\xef\xd3\x7c\x07\x30\x22\x4b\x5c\x49\xa0\xae\x2a\xfb\x60\x37\x20\xcd\xb4\x6a\xf7\xcb\xc6\xa8\x49\x32\x8a\xb9\xb7\x09\x52\x76\x33\x10\xd3\x27\xc1\xc1\x74\x8d\x1e\x77\xa2\x4c\xca\x14\x62\x24\xf6\x35\xa0\xde\xe7\x65\xa6\x81\x49\x99\xc9\xb2\xbe\x5c\x5a\xd5\x8f\xa7\xba\x37\x7b\xe1\x26\xcd\x9c\x21\x67\xf3\x71\x50\x3d\xb0\xc6\xa4\xd6\xa1\xba\x9a\xd3\xe1\xbb\xac\xcd\x52\x1e\xd7\xcb\x07\xe4\xa2\xf7\xcf\x2f\x93\x11\xfe\x3a\xfc\x74\x14\xfe\x41\x46\xa6\xf7\x71\xe9\x87\x6a\x1d\xa7\xc1\x3e\xc9\x31\xf3\x2e\xbf\x41\x46\x45\x14\x5f\xde\xd7\xfa\xe3\xd8\x42\x5f\x1a\x32\x4a\x8a\x60\x5d\xf9\x1d\x64\xd1\xbe\xdc\x54\xf5\xb2\xf2\x7c\x93\xb0\x8a\x1a\x05\xe0\x9c\xdf\x72\xfb\x0b\xf2\xb2\xd1\x52\x63\xef\x6a\xfd\x6d\xb7\xfd\x76\x1d\x7e\xc6\xb0\x14\xf7\x0e\xff\x3a\x36\x8f\x50\x8f\xd1\xa6\xc6\x28\x2a\x7d\xa1\xe0\x7f\xe0\x1d\x8a\x4f\xee\x38\x44\x91\x24\xbd\x81\x0e\xd4\x6f\x60\xae\xb1\x85\x87\x4b\x34\x36\x8e\xe7\x88\x9c\xd9\x17\xc8\x08\xeb\xd1\xba\x00\x59\x2e\xf4\xa4\xac\x12\x02\x6a\x88\x78\x1c\x47\x17\x9f\x91\xd7\x7f\xe4\x10\x0b\x40\x72\x0d\xea\x51\xa2\x94\x84\xb5\xfd\xa3\x87\x38\xb3\x41\x37\xe7\x74\xfc\x7f\x26\x53\xfd\xff\xfc\xf7\x0b\x27\x7b\x0e\xb1\xc9\x6c\x32\x08\xc9\x35\x37\x55\x3d\x01\x37\xf8\x61\x44\x66\x28\xca\x86\xb9\xe4\xa6\xbb\xa9\x63\x4c\x74\x18\xa4\x13\xcc\x0f\x8e\x7d\x93\x78\xbd\x7c\xf0\x2f\x5f\x35\xc7\xd0\x01\xcd\x04\x16\xa0\xfa\x86\x86\xcf\x2e\xc7\x74\x0d\xa0\xda\xe1\x48\xda\x3e\x39\xdf\xbe\xcb\x23\x26\xe8\x5f\x87\x84\x40\xb5\xc1\x08\xf2\x58\xc3\x68\xaf\xbe\x3c\x96\xe9\x18\xf7\x9a\x17\xd9\x2d\x7a\x5d\xf0\x0a\xc6\xb1\x39\xa6\xb1\x2b\x30\xc3\x10\x17\x74\xfd\x74\xff\x6d\xf5\x70\x7f\x99\x66\x0f\x3c\x4e\x70\xa1\x74\x65\xef\x19\x84\x7f\x7a\x13\xb8\x0f\x10\x4c\xa5\x4f\x48\xb2\x1c\x77\x47\x41\x08\xa7\xe8\x9d\xa3\x3c\x9c\x23\x7c\xa0\x5e\x5f\x18\x90\x24\x32\xe2\x81\x4e\xd9\xc2\x61\x8b\x9a\xf9\x63\xf4\x3c\x24\x8a\xa2\xfa\x43\x97\x31\x15\x83\x9c\x28\x87\x34\xa1\x29\x1f\x63\xdf\x37\x60\xfb\x63\x52\x38\x73\xf6\xea\x8a\x92\xdf\xce\xd6\x41\x48\x8d\x60\x6c\x10\x0d\x72\x34\xff\xe9\x2a\x33\x5e\x89\x21\xb5\x34\x94\x59\x10\xe4\x1f\x7e\x27\x8b\x63\xdc\x1a\x2c\xc0\xd5\xc0\xa4\x04\x95\x3a\x97\xa2\x45\xdb\xc2\xe1\xf8\x49\x31\x0f\x34\x18\x24\xb3\xfe\xeb\x97\xd0\x79\xd0\x60\x5d\x45\x74\x0b\xed\xe6\x84\x2b\xcd\x08\xad\x04\x26\xe5\x49\x40\x6c\x3d\xd6\x60\xc0\xe6\x25\x98\x09\xba\x01\x20\x76\xfd\x90\xbc\x59\x62\x90\x55\x0c\x4f\x01\x98\x63\x53\x35\x80\x4e\x4f\x5d\xc8\x70\x03\xae\x22\xc4\xa7\x61\x2c\x40\xaa\xa4\xaf\xfb\xaf\xcb\x33\x94\x60\x18\xa4\x08\xf3\x1e\x08\xa8\xe3\x82\xc2\x65\x7d\x88\x02\x36\x8b\x93\x74\xa4\xc9\x8f\x16\x0f\x5f\x69\xec\xd8\x48\xa4\x4c\xf5\x86\x28\xaf\xf2\x19\xba\xe0\x65\xac\xf7\x16\x06\xda\x18\xa3\xdf\x2e\x73\xb8\xaa\x73\xf3\x0c\x53\x4a\xe4\x74\xf6\xda\x98\x08\x7c\x3b\x7d\xfb\x77\x57\xf5\x31\x5d\x18\x90\x28\xcc\x65\x83\x5c\x50\xdf\xdb\xb5\x24\x82\x14\x7d\xf9\x16\xf7\xd7\xcb\xcd\xff\x3e\xee\xbe\x7a\x7e\x96\x10\x16\x79\xdc\xc3\xfa\x20\x9f\xe1\x1c\x09\x64\x49\x4a\x1c\xc0\x58\x16\xe0\x50\x4e\xbe\x94\xe0\x8f\xd3\x94\x28\x3d\x04\x03\xae\x91\x76\x71\x39\xb0\x2c\x01\x06\xa1\xf3\xfe\x7c\x2a\x50\xa0\x1c\x7b\x64\xb7\xf0\x06\xc5\xa5\x3a\xbf\xe5\x49\x8a\x60\xfa\x9b\xf5\xd5\x62\xfb\x7b\xf8\x51\x9e\x59\x04\xbb\xbe\x55\x73\x5b\x86\xe9\xf5\x09\x62\x55\x36\xaa\x5b\x5c\xc3\x5b\xae\x61\xb4\x01\x7d\xea\xaf\xc0\x6d\xca\x12\x3b\x16\x0e\xdf\x55\x17\x4d\x1a\xce\x2f\x33\x63\x14\xf7\xee\xdd\x8b\x2c\x5f\x67\xfc\x42\x2b\x13\x16\x2c\xe4\xf7\xb9\xae\xca\xfc\xbf\xfb\x76\x8a\x0c\x9c\x4e\x05\x65\xb4\xf1\xe2\x1c\x2f\x93\x2f\x52\x56\xf6\x5e\x71\x57\x27\x8c\x00\x9f\xca\xc1\xbc\x24\xbc\x44\x56\x0b\x8a\x29\xcc\xe3\xed\xe2\x7f\x57\x1b\x97\x60\xec\x1f\x57\x9b\xf5\xc3\xf5\xb6\x1f\x93\x64\x58\xa8\x0e\x68\xa4\x0d\x38\x93\x10\xe8\xa5\x9a\x7d\xea\xf1\x89\xd6\x6e\xf8\x1a\x15\x45\xbe\x63\xf8\x25\xce\xc7\x1a\x23\x90\xdd\xf3\x22\x9b\xbe\x3f\x37\x4f\x39\xfb\xe7\x00\x11\xa0\xc6\x98\x0b\xfe\xaf\x67\xd3\x13\x48\x82\x88\x71\x54\xb8\x5b\xd6\xf9\xb1\xad\xc2\x55\x01\x73\xa6\x63\x8e\x87\xb1\x84\x7a\xa6\x19\x3c\xc1\x10\xcf\xce\x10\x38\xa1\x5e\xc4\x66\x7b\x52\x65\x65\xfc\x2a\x8c\x1f\x21\xb3\x20\xc7\x82\x48\x45\x8f\x73\x5a\xdb\xa5\x2c\x9f\x1a\xf8\x0a\xf0\x69\x41\x58\xc4\x2a\xf7\x0d\xc8\x10\x5d\xcd\x56\x18\x4b\x18\xa2\xdd\xb7\x50\x14\x97\xbf\xf0\x93\x49\x68\xa9\xd6\x1e\x9b\x7f\xf7\xb1\x38\x1e\x7b\xd7\x32\x6e\xad\xb5\x51\x16\x0e\x5d\xc9\x52\x96\xd2\x1f\x13\x51\x44\x98\x75\xfd\x5b\x75\xfa\x70\x56\x64\x66\x38\x26\xb1\x8e\x5c\x75\xdb\xaf\x47\x8b\x0d\x36\x62\x97\xc2\x3f\x11\x45\xe0\x74\x09\x36\xab\xed\xea\xf6\x76\x7d\xff\x6d\xff\x74\x7f\xfb\xb0\xfc\x7d\xbf\x7c\x78\xba\xdf\xf5\xdf\x0c\x1a\xab\x64\xed\x79\xed\x75\x76\xb5\x7e\x56\x88\x28\xb2\xce\x79\x76\xa4\x47\x13\xf4\x86\xe7\x69\xc7\xac\x53\x39\x3d\xc1\x38\x12\xdc\x55\x36\xa5\x7e\x01\x73\x27\xff\xcf\x91\x75\xc6\x77\x53\x44\x31\x75\xb2\x47\xdd\xcb\x76\x8b\x0e\xe7\x8f\xaf\xcf\xdf\xd0\xec\x21\x5c\x43\x9c\x38\xf5\x0c\x59\xe4\xda\x59\x01\x34\xd7\x9f\xe4\x47\x9f\x95\xa6\xdd\xe4\x8a\xc2\x17\x1a\x08\x66\x43\xbb\x79\xf9\xed\x52\x34\x20\x22\x42\x23\xac\x49\x78\x78\xd1\x68\xeb\xfa\x12\xe0\x33\xbd\x21\x84\x3a\xbf\x84\x45\x61\xe5\xae\x7a\x9f\x7a\xa9\x75\x87\xb5\xb2\xfd\x8a\x5a\xfb\x8e\xf2\x78\x9f\x15\x11\x11\x06\xcb\x44\x57\x27\xfd\x0a\xed\xa2\x44\xfd\x78\xa7\x8e\x50\x1a\x2c\xd0\xa0\x04\xe6\x57\x13\x58\x44\x44\x39\xe2\xf2\xe2\xee\x6a\xd7\x93\x74\x44\x44\xc0\x99\x89\xf7\x22\x2a\xf0\x16\x0e\xd1\x94\xc9\x28\x38\xf5\x15\xa7\x49\x11\xa1\x3b\xea\x0c\x0d\xd6\xcb\x87\xfd\xb7\x5a\x1e\x5f\x20\x60\xd7\x44\xc4\x12\x07\xc0\x3d\xc8\x56\xbf\x04\x6e\xff\x55\x6e\x9a\xd9\x85\xb1\xcc\xf9\x40\x36\xce\x58\x68\xe3\x24\xb6\x7c\xe6\xf6\x8f\xc9\x3f\xe1\x13\x92\xf4\x11\x02\x6a\x7f\x1f\xb7\xf9\x5f\x30\x9b\x5d\xdc\xbf\xe4\x18\xbc\xb8\xd0\x7f\x14\xae\x8a\x48\xd0\x08\x81\x5c\x5d\x4e\x7a\x3d\x55\xb8\x10\x91\x10\x1a\xc3\x7d\xb4\x3a\x0c\x41\xf6\x67\xb5\x91\xf0\x99\x0c\x70\xfb\x5c\xae\x1f\x2f\xea\x42\xfa\x61\x09\x03\x94\x10\x94\xc6\x5c\x41\x09\x58\x81\xa8\x2f\xf3\xd8\x44\x94\x08\xd7\x69\x7d\x1f\xa4\x54\x2f\x2e\x55\x97\x99\x8a\x22\x4a\xd2\x44\x92\xde\xf7\xbe\x1a\xb9\x02\xf2\x28\x1a\xf2\xab\xee\x3f\xc2\x27\xa4\x73\xac\x43\x90\x33\xce\xd2\xdf\xce\x4a\x85\xc8\xbb\x4c\x83\xbf\xd4\x34\x88\xfb\xb2\x35\x24\xa2\x94\x32\xd4\xa7\x30\x0b\x63\x66\x92\xf3\x97\x5a\x01\xe1\x53\x09\x43\x04\xbe\xc3\x72\x5f\xe5\x66\xce\x8a\x09\xe3\xc0\x11\xa2\xae\x65\x2b\x7f\x74\xdb\x60\x97\x15\x5d\xe8\x9c\xcf\x7f\x72\x32\xa7\x33\xce\x10\xc6\xa2\x5f\x64\xfd\x0c\x0b\xf3\x06\x75\x9b\x37\x23\x5a\xd5\x24\x45\xfd\xac\xa1\x25\xa2\x2c\xa5\xd6\xeb\x0b\x2e\xea\x36\xb7\xf2\x4c\x8c\x60\x7a\xf2\x19\xb0\xd4\x75\xc6\xab\xf6\xa3\xc6\x5e\xdc\xb6\x87\x58\x89\x48\xb2\x54\xc2\x08\x57\x3c\x86\x5c\xff\xed\x24\x7b\xfa\x30\x24\x4f\x10\x8f\xbe\xfd\xbe\x20\x5c\x74\x11\x76\x6f\x8d\x3a\x3d\x35\x25\xa3\x74\xb0\xe4\xbc\xc9\x4b\x59\x62\xdd\xac\xad\x65\x0b\xcf\x1f\xe1\x14\x55\x28\xe5\x57\xef\xb3\x2d\xd5\xb7\x39\xbb\x21\xce\x97\xaa\x4b\x07\x2e\xca\x4e\x8b\xc8\x50\x8b\x69\x6b\x7e\x38\x16\xfb\x43\x5e\x5e\x42\x68\x0c\xe9\x9d\x88\x4c\xaa\x31\x58\xe9\x36\x90\x1b\x99\x17\x4e\xe3\xd3\x6d\x28\x1b\x70\xd2\x77\xf7\x55\x3b\x12\x18\x16\x91\xc9\x98\x0a\x90\x50\x8f\x59\xdb\x3f\x57\x21\x6b\x11\x11\x70\x67\x42\xe3\xf9\xf8\x88\x88\x1a\x82\xaa\x4b\xa5\xa3\x80\xed\xce\xc2\x3d\x83\xd4\x91\xa6\x71\xfb\xed\xbf\x57\xdb\xc8\xbb\x0c\xdf\xc3\xfb\x76\x6c\x68\xf8\xab\x67\xe7\xbf\xc1\x4a\xc7\xbf\x6b\x3e\xca\xf6\xe5\x1b\x94\x9f\x68\x01\x88\x38\x22\x06\xa1\x26\x58\x1b\xde\x5e\x6c\x92\x8a\x38\x82\x08\xbb\xce\xdf\xa0\x5d\x34\xaf\x18\xed\x7a\x21\xd7\xdf\xc2\x08\xeb\x44\x59\x8f\x6f\x30\x38\xe5\xfb\x63\x71\xe6\x5c\x89\xb6\xaf\x75\xae\xa6\xe5\x5f\x11\xc7\xca\x62\x2a\xbf\x7f\x86\xb6\x57\x76\xc9\x0b\x58\xa0\x78\x12\x25\xff\x18\xad\xe8\x31\x8d\xdd\x62\x3c\x12\xa1\x9d\x9e\x28\x25\x9c\x38\x99\x54\x2f\x4d\x16\xfe\xae\x34\xa2\x8b\xf2\x66\xf5\x56\x15\x6f\xc8\xbc\x40\xb2\xcf\x27\x16\x82\x22\x66\x89\xd3\x66\x0e\x3b\xf9\xca\xe1\x7d\xc3\x17\x32\x9d\x88\x5e\xf7\xa5\xd1\x93\xed\x2e\xe6\xa0\x51\xfb\xe4\x5d\x36\xdb\x93\xc3\x21\xfa\x23\x42\xb1\xd8\x51\xf7\xb4\xeb\xc4\x9c\xb7\xba\x44\x9c\x88\x04\xcb\x6d\x21\xf8\xc0\x16\xff\x45\x54\xbc\x88\x93\x54\x93\x68\x8a\x6a\x23\xe1\xc7\x12\xe3\xa0\xbc\x5a\xd6\xad\xfc\x99\x4f\x6e\x7b\x2a\x14\x62\xf5\xee\x16\x7f\x06\x47\xc6\xfd\xc3\xcd\xde\x9b\x03\xf5\xa3\xb2\x78\xa4\xcf\xb3\x6a\xb4\x3c\xc2\xb9\xce\xb7\x1f\x9c\x51\xe7\x25\x72\xc8\xcb\x9e\x79\x2c\x62\x19\x0b\xeb\xb6\x16\x5d\x95\x66\x4c\x07\xe9\x47\x64\x24\x94\x75\x07\xff\x84\x64\x7a\x47\x65\x46\x9c\xf4\xa5\x6c\x70\xda\x8d\x6a\xfc\x22\x56\xb1\xc0\x8a\x92\x34\x66\x5d\xee\x40\x1e\x7c\x6b\x70\xae\x03\x25\x62\x45\x9c\x9e\xbf\x6c\x9a\xfc\xb9\xbc\xea\xf6\xf9\x8f\x33\x04\x77\x58\x99\x63\x05\x14\x49\x00\xba\x2f\xee\x88\x58\x13\x96\x44\x7d\xe8\xbb\xa9\xaa\xb6\x7f\xb6\x3a\x93\x28\x80\xec\x56\xbf\x4f\x40\x28\x5f\xbf\xb6\xb1\xd6\x4e\xbe\x44\xe6\xb5\xa9\xab\xa3\xd7\x95\x9b\xb8\xae\x8b\x58\x9b\x14\x0b\x10\x2d\x1a\xff\x37\x37\x15\x4a\xf3\xac\x7e\xe2\x44\x9b\x7e\x9f\x89\x89\x17\x54\x73\x40\x9c\xbc\x7c\x9e\x4d\x64\x43\x9d\x52\x24\xb6\x95\x82\xae\x54\x73\x8d\x7d\xba\xe9\xcd\x33\x54\x07\x7e\xf0\xea\xa7\x2e\x4e\x66\xe8\xe8\x0e\x7b\x70\x0c\x99\x13\x0a\x41\xce\xd9\xd5\x09\x2d\xf5\x77\xef\x55\xf8\x39\x1b\x1b\x7c\x02\x9b\xc5\xfd\xb7\x95\xcb\x87\x69\x7f\xcc\x6a\xb7\xca\xc8\x16\xde\xe5\x47\x2f\x7d\x34\xc1\xc6\x0a\x12\xa9\x2c\x1b\x00\x1e\x2d\xd4\x68\xf3\x84\x2a\x3e\x77\xb2\x94\xcf\xf8\x72\x5f\x0e\x94\x48\xcc\x12\xca\xc3\x6b\x8b\x62\xbe\xb3\x59\x4c\xe2\x84\x21\x03\xc1\x63\xe3\x97\x85\x7c\x03\x67\xb2\x31\x1b\xa7\x34\xd6\x98\x83\x75\x8a\x6c\x5e\x03\x25\x69\xc6\xfa\xf9\x5b\x4f\x9e\xc4\xd6\x09\x58\x6d\xb1\xbd\xb7\xc8\xeb\xeb\xba\x3a\xfe\xe9\xec\x88\xa6\x23\x49\x6c\xb0\x89\x71\x38\x15\x7f\xce\x0e\xd1\x38\x75\x82\x69\x20\x0f\xbf\x03\x1c\x9d\xd8\x47\xb0\xc4\xf5\x83\x18\xb1\x41\x1e\xec\xa6\xae\xca\x76\xe5\x53\xb8\x31\x12\x5a\x10\x26\x5c\x06\xf4\xaf\x83\xd2\xfd\xdf\x80\xd3\xb1\xba\xec\x75\xe5\xad\x0c\x67\xa7\xc1\xa5\xd0\x4e\xa1\xbb\x36\x38\x73\x87\x1c\x82\x24\xca\xa2\x26\xce\x11\x23\x93\x55\x69\x9a\x45\xeb\xf8\xf0\xb3\x0d\x9e\xa4\x94\xc6\x51\x00\xd0\x9c\x9a\x30\x0d\x26\xc1\x66\x18\xca\xac\xf2\xee\x48\xf7\xf9\x5f\xaf\xdb\x91\xe9\xb2\x20\xa9\xd0\x78\xbf\x3c\x4f\x70\x52\xd1\x0d\x43\x32\x46\x92\x51\x0e\xbc\x81\xc6\xa3\x0a\x77\xd5\x38\x20\x20\x99\x91\xc8\xed\x9b\xf0\x1b\x04\x9b\x47\xb1\x93\xda\xd6\xa7\xa1\x1f\x91\xc2\x89\xb8\x68\xb4\x95\x6d\x27\x4b\x1e\x91\x52\xa1\xe2\x37\x4e\x81\x91\x5c\xb5\x20\x4a\x3a\x37\xe5\xff\x9e\x64\x2d\xcb\x36\x2f\xcf\xa0\x15\x17\x7e\x4b\x49\x67\x7a\xda\x2d\x13\x60\xd6\x0f\xbf\xaa\x2f\x0b\xa2\x33\x67\xee\xb9\x7d\xb8\x7d\xda\x8e\x37\x0f\xa2\x33\x8d\x90\xc1\x6e\xf3\xf8\xe3\x61\xb7\xba\x0e\xe2\x47\xab\xcd\xb2\x1f\x23\x39\x8a\x86\x2f\xab\x46\xf5\x93\xca\x44\x4e\xab\xb7\x7a\x83\x7a\x23\xf3\x06\xcc\x53\x89\x8c\xcb\x70\x5c\x02\x0f\xd4\xe6\x6e\x99\x9f\x76\x6b\x05\xb1\x16\x24\x84\xdd\xce\xa3\xd1\x6e\x5c\x63\xd7\x0f\xa1\x51\xb7\x52\x0d\x5e\x20\x55\x71\x46\xf1\x0a\xb7\x84\xc6\x3a\x46\x32\xfc\x8d\xeb\x0d\xdf\x00\xac\xcb\x49\x77\x5c\x50\x4a\x23\xea\xe1\x7b\xdb\x7a\x0a\xb9\x11\x94\x05\x33\x3c\x67\xf7\xe8\x03\xbf\xee\x7c\x7a\x1c\x5b\x18\x99\x08\x54\x78\x2a\xf2\xa6\xed\x16\xc4\xd1\xf9\x32\x70\x61\x2c\xae\x97\xfb\xca\xee\x9d\xc6\xcc\x84\x37\x2a\x28\x8f\x08\xe2\x94\x76\x8b\xfb\xeb\xa0\xbb\x27\x28\x67\x16\x31\xf0\x57\x0f\xf7\x4f\xdb\x00\x61\xf8\xb6\x8a\xbb\x6d\x7c\xdf\xed\xe3\xb4\x1f\x09\x12\x57\x2b\x44\x19\xef\xaa\x79\x32\x36\x79\x9b\x28\xb7\x1a\xe5\xf6\x3e\xe4\x4b\x55\x39\x01\xa6\xa7\x7a\xea\x87\x29\xa8\xa0\x11\x22\xbd\x57\xbb\x6f\x0f\xb7\xe3\xd6\x7d\x77\x88\xe0\x46\xf1\x58\x57\x4d\x77\x19\xed\x47\x7f\x84\x1b\x6c\xb1\x1c\xab\xaa\x98\x28\x49\x0a\x9a\x44\xd6\xa5\xa0\xf2\x0d\x1e\xf3\x69\x40\x45\x13\xe6\x68\x61\xbd\x19\xc6\x0f\x74\x0c\x45\x73\xbf\xcb\xf1\x1b\x4d\x63\xe7\xec\xe8\x1d\xa1\x5a\x38\xac\xfb\xbb\x99\x12\x8b\x25\xfe\x67\x79\x08\x80\xbb\x61\x07\xa3\x29\xd5\x21\xf7\x38\x77\x46\x4d\xc3\x20\x21\x9d\x31\xd4\xc7\x1d\xb4\x2f\x95\x21\xd3\x13\x4e\x33\x85\xc5\x0a\x34\xe3\xff\xdc\x19\x25\x8c\x96\x29\x46\x37\x5d\x3e\xea\x92\x51\x0c\x0b\xdd\x32\x36\xdb\xd2\xa9\xcc\x24\xb2\x0b\x71\xc2\xac\xcb\xb7\x1e\x94\x20\xa8\x8e\x12\x64\xf9\xdd\x9e\xf4\x6b\x7f\xcf\x75\x1c\x93\x38\x34\x72\x6a\xd8\xbf\x7e\xe8\x50\xfc\x46\xc1\x82\x7d\x79\x3a\x78\x36\xd3\xf4\x87\x74\x1c\x9b\x9e\xfc\xb3\xd5\xf2\x70\x98\x55\x48\x05\xd5\x94\x66\xc9\xd0\xe8\xde\x7f\x80\xec\xe7\xbc\x16\xce\x38\xee\x58\x35\xa8\x52\xf1\x38\x99\xd0\x46\x38\xad\x01\xac\xbf\xdf\x56\x4d\x83\xfd\xd7\xfe\xa8\x71\x84\xda\xeb\x5c\xb6\xd5\xa1\xff\x2b\x30\x43\x5c\x16\x72\x49\x0d\x69\xf4\x08\x81\x88\x34\xea\x4d\x10\xb6\x79\x0b\xbb\xfc\xf8\x89\x39\xbc\xa0\x20\x28\xf2\x7a\x0e\x13\xde\xa8\x60\x51\xec\x62\xbd\xdd\xa9\xad\xea\x5c\x5e\x26\x58\x9d\x41\x34\x04\x8b\x84\x8b\x1b\x43\x2f\xeb\x5c\xec\x48\xb0\xc8\x48\x07\x7b\x68\x5f\xa6\x04\x21\xc1\xe2\xcc\x45\x02\x8f\x8b\x3f\x7d\x81\xaf\xbf\x30\x46\x64\x8c\x33\xa5\x3a\xb6\xeb\xf2\x5b\x5f\x3a\x66\x44\x6b\x7c\x56\xd6\x83\x50\x11\xc7\xe3\x4b\x9a\xd3\xc9\xc6\x88\x31\x58\xb7\x40\x45\xd7\xbc\x5f\xea\x18\x95\x80\x75\x08\x47\x67\xc5\x19\xeb\x18\x05\x5d\x70\xe9\xc8\xfb\x5b\x79\x80\xfb\x6a\x78\x69\x19\xb3\x1a\x57\x50\x17\xd4\x3b\x89\xbf\x49\x89\x74\x8e\xd3\x14\x8c\x47\x12\xd7\xac\x77\x07\xc9\x9d\xf4\xd6\x04\xe3\x94\x26\x72\xa0\x58\x9d\xb9\x83\x09\xc6\x95\xc4\xa5\xb4\x84\xf7\x10\x62\x5f\x5c\x00\x98\x20\x11\xce\x96\xdd\x0b\xdc\x55\x4d\x3b\x72\x31\x58\xbd\xf5\x2b\x33\xba\xec\x88\x7e\x99\x40\x66\xf9\x67\xdf\x97\x12\xe6\x2b\xf7\xb8\x61\x9c\x6b\x34\x0b\x26\xb2\x98\x7a\xc1\x92\xc7\xaa\xfc\x2b\xc7\xf5\x63\x5d\xfe\x80\x7c\x76\x15\x42\xa5\xdc\x0c\xec\x26\xec\x88\x4e\xa2\x5c\x26\x8c\x65\x66\xa0\xca\xad\x7a\x76\x88\x60\x09\xe1\x38\x09\x8c\x07\xb6\x5d\x9a\x5f\x89\xb1\x38\x89\x76\xab\x6d\xf8\x53\xaa\x33\xeb\xd6\x35\x84\xe8\xf5\xcb\x21\xcb\x04\xc7\x6a\x83\xbb\xe9\x57\xb2\x7c\x9d\x5d\x56\x96\x10\x3e\x56\xea\x7d\x78\x83\xda\xd4\xd2\xb6\x5f\xb4\x59\x04\xcb\xb2\x04\x99\xb2\x77\x95\x9c\x88\x09\x08\x96\x69\x2d\x07\x2a\xee\x58\x5e\x79\x42\xaa\x9b\x7f\x9f\xc9\x52\x27\x41\xe0\x1a\x64\xe1\xdb\x24\x93\xf8\xfa\x3e\xdd\xee\x36\x8b\xfd\xf7\xd5\xe6\x61\x7f\xf7\x74\xbb\x5b\x3f\xde\xae\xfb\xad\x92\x49\xc3\x30\x74\xdd\xad\x57\x9b\x78\xbf\x0c\xb6\x6d\x82\x49\x0b\xd8\xa8\x92\x06\x45\xcf\xdb\x97\x39\xa2\x5c\x30\x95\x25\x28\x09\xa8\xaa\x9f\x64\xdb\xca\x9a\x87\xcf\xea\x48\x61\x4f\x7b\xf5\xb3\x85\xb2\x41\xd9\x0b\x6c\xa1\x87\xd8\x2f\xfd\x4f\x18\x98\x38\x2c\xaa\xbf\x51\xbb\x0a\xc3\xe7\x0b\xe9\x13\xd3\x29\x15\xee\x59\x60\xe6\xb7\x42\x9b\x3c\x57\x99\xea\x65\x8e\xc3\xcf\x83\xd6\xd8\x4b\xb2\x55\xad\xa1\xcf\xef\xc2\x51\x2b\x62\x9b\x05\x22\x65\xe3\x7c\x48\xa7\xd7\x65\x85\xc1\xf0\x73\x55\xc0\xf1\x45\x0e\x2b\x81\x4d\xad\xea\x59\x8c\xd7\x79\x59\x0d\xce\xc7\x82\x59\x69\xb0\xf7\xe3\x7f\xed\x5b\x25\x8b\xc1\xcc\x27\x8c\x51\x99\x30\x83\x8d\x6d\x9f\xb9\x72\x42\x89\x8e\x46\x1e\x78\xa1\x04\x33\x99\x6e\x9c\x50\xb7\x1d\xe2\x06\x8c\x1a\x2a\x81\x03\x23\x38\x49\x62\x0c\x2b\xeb\x53\xe9\x25\xf3\x4f\x83\x99\xea\x59\xe9\x92\x53\x62\x7a\xd9\x9a\xbc\x7c\x0e\xbf\x17\x8e\x1a\xc0\xb5\xc4\x29\xd2\xbf\x07\x69\x05\xc1\xa9\x4d\xb1\xa2\x80\xc8\x20\x1f\xa8\xcc\xd2\x61\xce\x58\xe2\x54\xbf\x2b\x84\x23\x3f\xfc\x7f\x9c\x7d\x5b\x73\xe2\x3a\xb6\xff\xd7\xd9\x0f\xff\x07\x5f\x25\xf9\x11\x08\xe9\xe6\x74\x12\x18\x20\xdd\x7b\xcf\xa9\x53\x94\x2e\x4b\x89\x4f\x8c\xcd\xd8\x26\x09\xf3\xe9\xff\xe5\x25\xc9\x37\x4c\x7a\xcf\xa9\x9a\x9a\xde\x15\x0b\x63\x64\x5b\x5a\x97\xdf\x45\xef\x3f\x8a\xfd\x6b\x5a\x8e\xa4\xef\x48\x1c\xb3\x40\xf5\xcc\xa8\x9e\xe0\xa3\x05\x99\x4f\xc5\xdd\x71\x9c\x18\xbb\x1d\x44\x5b\x3d\x2e\xfa\x44\x7e\x12\xc7\x10\x09\xb3\xb3\x65\xd9\x4a\x41\xbb\x03\xc4\x24\x09\x11\xc8\xbb\x37\x45\x81\xcd\x2d\xfd\xe2\x2b\xe0\x14\x73\xf1\x70\x4c\xa3\xc4\x4f\xda\x75\xc0\x90\xba\xee\xcb\xe2\x68\xcc\x52\x87\xbf\x9e\x52\xf3\x0a\xbf\x40\xfd\x50\x7c\xfc\x4a\xf3\x29\x84\x33\x89\xa9\x66\xa8\x40\xb3\x2f\x4e\x83\xfa\x53\xcc\x7c\x05\x7e\x0f\x1c\x30\xd6\x63\xff\x02\xdf\x45\x62\x16\x07\x18\xa0\xda\x1a\x37\xd2\x01\xd7\x79\x7f\x3b\x18\x48\x1a\xfe\xe6\xff\x4d\x3f\x7a\x82\x7c\x49\xe2\x24\x02\x8c\x52\x7e\x15\x65\xa6\xe6\xe9\x08\xdb\x12\xb8\x7f\xc6\x91\xc8\xef\x88\xca\x24\x4e\x18\x71\x6e\xad\x7d\xed\x08\x12\xf3\x30\x40\x98\xc6\xfa\x73\xf7\x0a\x59\x0d\xe5\xf2\x02\xdd\x31\x61\x00\x4c\x28\x87\x7e\x07\xc7\xe2\xa5\xe4\xa7\xd7\x54\xb6\x0f\x01\x97\x92\xda\x12\x8d\x13\x85\x9b\x9f\x15\x32\xb6\x56\xd3\xba\x1a\x24\x16\x9e\x44\x4c\x2a\x2e\x11\xce\x50\xd0\x0a\x98\xa0\xa0\xfe\x4d\x7d\x05\x33\x71\x57\x61\x18\xfe\x75\xf8\xb4\x88\x40\x38\xf2\xb1\xed\x0a\x34\x77\xdc\xe2\xfd\x2d\x81\x69\xf4\x80\x89\x98\x63\x69\xfd\xc4\x2f\xbb\x22\x3b\x1b\x51\xe3\x0f\x5e\xaa\x6f\x45\xa1\xb6\x70\x9a\xde\x74\x62\x41\x7d\x44\xc4\x48\x3d\xc2\xed\x90\x58\x28\x1d\x9a\x76\x7e\x3d\x3b\xab\xb4\x06\x85\x82\x17\xd7\x3d\xc1\x58\x40\x14\xd3\xde\xc3\x39\x3b\x5d\xb5\xd8\xad\x97\x64\x3f\xbd\x6f\x3f\xcc\x91\x83\x2e\xce\xd9\x9b\xd5\x4f\xc8\x6f\xa9\x31\x90\x58\x92\x28\x6c\x5d\xab\x35\x94\x70\xad\xb8\xe8\x46\x26\x9e\x6b\x54\x3e\x15\x0a\xe6\x97\x89\xd2\x71\x0c\x0a\x4c\x35\xdd\x96\xa5\x76\x20\xcb\xb6\x16\x4b\xbc\xd0\xe0\x93\x5e\x8b\x7a\x53\xd4\xbc\x2e\xfa\x68\x22\x42\x3c\x2e\x42\xee\x10\xbe\x26\xf1\x7e\xee\x93\x87\xba\x6d\x8a\x78\xdc\x49\x60\xa2\xd8\x5d\xb3\xed\xd8\xdb\x3f\xf8\xc7\x8e\xf6\xa9\xd1\xcc\x58\x64\x69\xf3\x8e\x9b\xbd\x0c\xd4\x1f\x13\x6f\x06\x09\x3c\x83\xaa\x1b\x2b\xe2\x5c\x25\xf1\xc3\x6f\x9a\xee\x23\x92\xc0\x6a\xae\xbf\x40\xde\xe4\x38\x30\xab\xb1\xfd\x53\x94\x96\x0f\x9a\x16\x39\x0a\xb6\xf1\x2f\x75\xb9\x6f\x20\x6f\xba\x2a\x8f\xfd\xb6\x90\x0a\xdf\x6e\x6f\xcb\x4a\x9e\x21\x1b\xda\xa9\x12\x12\x32\x6a\x19\xfa\xf2\x5c\x56\xe9\x3b\x18\x58\xf0\x97\x95\x41\x12\xf2\xc8\x14\xad\x9b\xa7\x7f\x5e\x16\xf9\x35\x95\x66\xf4\xab\x43\xcd\x98\xe5\xc8\x61\xa0\xf1\xbd\x2b\x60\x37\xa9\x02\x36\xf3\x0e\x69\x65\x17\x4c\xec\xba\x8c\x2e\x34\xb2\xcc\xb0\x26\x3e\x3b\x98\xfb\xe3\xee\x16\xae\x99\xee\xff\xfc\xf6\x03\x2a\x50\x66\xef\xa8\x8a\x73\x29\x61\x60\x2e\xf2\xff\x7a\xbc\x78\x42\x62\xc2\x98\x5d\x0c\x50\x49\xf7\x3f\x6c\x4e\xba\xb3\x30\xa6\x8c\xa9\x58\x91\x63\x8a\xb2\xff\x28\x36\xc5\xe9\x46\x9b\x8b\xc4\x82\xc4\x1d\xcb\xce\x84\x55\x23\xfd\x0e\x42\x62\x30\xe0\x1c\x91\xd6\x47\x5e\xbd\x1d\xaa\xd7\xe2\x63\x3c\x44\x1b\x67\xbf\x53\x09\x2f\x39\xcf\x0d\x7b\xea\xae\x70\x04\x00\x42\x88\x2f\xbc\xc8\x09\x1a\x9b\x84\xbe\x3a\x15\x79\x35\x55\x2c\x27\x84\xc5\xc4\x08\xb4\x15\xa7\x87\xeb\xbb\x40\xa4\x70\x94\x0f\x5b\xad\x56\xf8\xba\x41\xf7\x6d\x60\x82\xbc\xb4\x72\x31\xde\x0e\xc6\x67\xa1\x5e\x24\x03\xa3\x5e\x52\xf4\xb4\xed\xde\x6e\xb5\xbe\x08\x0b\x28\xfe\x84\x7d\x0b\xbe\xdb\x5a\x6b\xdf\xe9\x45\x97\x30\x12\xa3\xde\xd7\x0e\x11\xe0\x53\x6f\x35\xa3\x26\xb4\x38\x9c\x4c\x40\x37\xc8\x07\x08\x13\x01\x96\x3a\x67\x3f\x46\x05\x3f\x92\x84\x21\xb6\x3a\xee\x9e\xb7\x06\x93\xbc\x59\x6e\x0f\x3f\x97\xbb\xfd\xea\xe9\x5b\x3b\x86\x28\x6e\x35\x73\xbf\xa7\xef\xdd\xdc\x70\x3f\x71\x0a\xa9\x87\xba\x95\xa9\x20\x84\x87\x04\xd3\x9d\x1c\x3e\x5a\xbf\xc0\x5b\xac\x89\xe9\xdf\xcb\x43\x11\xd8\xe6\xdf\x7f\x3d\x2e\xf7\xdf\x07\x5d\xad\xd1\x50\xaa\xd0\x5e\xe5\xc4\x2f\x26\x9b\x1d\x4c\x0b\xe7\x41\x6c\xc9\xf8\x9b\xb2\x38\x41\x59\x5f\x6e\x5a\xeb\xdf\xb4\xda\xff\x02\x16\x48\x08\x97\x22\x64\x36\x14\xdf\xbf\xf6\x54\x93\x9e\x8a\xfa\x5a\x31\x8f\x10\x0e\x20\x3b\xcb\x18\xd4\x08\xcd\xae\xc5\x67\x08\x11\x61\x8c\x72\x54\xce\xb6\xb6\xd5\x12\x71\xc7\xa9\xc2\x1a\x08\xe2\xee\x6d\x7d\xff\xde\xa4\x0c\xc3\x0e\xf3\x68\xe9\x52\x1c\x10\xc2\xa1\xb9\xac\x8b\xf2\x32\x4c\x8a\x9b\x7c\x25\x20\xce\xef\x71\x0c\x58\xbb\x71\xb3\x80\x00\x86\xa0\xd6\x9e\xc3\x9a\x56\xd9\x4c\xcd\x8d\x51\x1c\x37\x9d\x8e\x6c\xc4\x5d\xe9\x94\x68\x92\x20\x8e\xfa\xf0\x82\x70\xc4\x36\x55\x9d\x06\xdd\x11\xad\x49\xdc\x36\x64\xe7\xe7\xb2\x0d\xed\xa8\xe7\x51\x04\xc3\x88\x73\x99\xdf\x3d\x2d\xa6\xdf\x25\xea\xc5\x89\x11\xb7\x4e\xdf\x61\xf6\xc1\x2f\xd6\xec\xa8\x57\x54\x71\x03\xa5\x27\xa4\xab\x95\x83\xec\x59\xf7\x11\xea\x83\xc6\xd9\xff\xb5\x5c\x1d\xf6\xeb\xc3\xea\x69\xb7\xfa\xf6\x7d\xef\x2a\x01\x34\x54\xc6\xc6\x10\xde\x31\xe4\xee\x3f\x92\x34\x8a\x38\x86\xbc\xb3\xbb\xbb\x2d\x4a\x0e\x9a\xda\xfe\xee\x30\x5b\xf4\x61\x83\x34\xf6\x08\xf2\x01\x14\x64\x60\x6d\x8d\xa7\x70\xda\x84\xc6\x42\x18\xf8\x5e\x51\x67\x30\x10\x35\x23\x94\x5a\x16\x95\x71\xc5\x0f\xbc\xbb\xa2\xc5\x85\x51\xca\x22\x64\x87\x77\x80\xd6\x41\x30\x32\x9c\x35\x16\x10\x65\x2c\x5d\x3e\x6d\x8e\x67\xbc\x17\x27\x4a\x23\x94\x45\x1a\x39\xae\xad\x1c\x72\x30\xfd\x2c\x52\xc6\x7d\x8c\xe4\xd0\x32\xfe\x2b\x39\x34\x42\x99\xd2\x68\x28\xf2\x08\x65\x96\xe6\x8b\xbe\xe9\xf8\xc4\x72\x48\x19\x08\xec\x1c\xec\xb8\x86\xbb\xf4\x7d\x7a\x1d\xa6\x4c\x0b\x83\xf4\x99\x2d\xf6\xab\xc5\xec\xc1\xd9\xda\x3c\xce\xfe\x3c\x2c\x66\xdb\x6f\xae\xa7\x46\x93\xd0\x28\xe8\xb9\x78\xf5\xab\x37\x8c\x26\xca\x00\x3e\x4c\xe5\x15\x74\xfb\x7c\x72\x8f\x61\x8f\x00\x55\x04\xdd\xda\xf0\x7b\x07\x47\x42\x45\x40\x10\x41\x6a\x30\xfb\x5d\x32\x43\x45\x28\xb1\xf4\x7c\xce\xd3\x7a\x79\x4a\xe5\xb7\xb2\xf8\xa8\x5d\x24\x42\x65\x18\x62\x09\xbd\x6d\xc4\xda\xbf\x2b\xe5\x71\xe3\x93\xa3\xb0\xb7\x3b\x7a\x9e\x80\x18\x48\xf2\x0b\xd4\xb3\xb6\xa9\x49\x81\x11\x54\x51\x30\x0c\xb6\xb3\x00\xd7\x99\xbb\xfe\xe7\x7a\xa2\xb5\x2f\x65\xa7\xbb\xc7\xcf\x55\x7b\x5a\xad\x03\xcc\xc5\x85\xf1\x1a\x31\x7f\x65\x9e\xa7\x7a\x4e\x33\x0b\x7e\x9a\xb2\x35\x21\xcc\xa7\xc6\xd9\x12\xcb\xec\x81\xd7\xf5\xb9\x58\xe0\x6b\x04\x08\x37\x77\xf2\x71\xf5\xb0\xdc\xed\xd7\x4f\x0e\x74\xc1\xc2\x08\x42\xd2\x43\xe4\xec\x6a\x9e\x2b\x5e\xaa\xb1\xb8\x38\x61\xa1\xf2\xb1\xd7\xb5\xfe\xfe\x6b\xfd\xeb\x57\xfb\x79\x0d\x61\x87\x00\xbb\xa2\x88\x4d\x16\x4a\x58\xa4\xb8\xcf\xdb\x0f\x21\x60\x28\xad\x9e\x73\x04\x1f\xb8\xd9\x60\x91\x06\x4b\xa8\xaf\xa1\x84\xaa\x5e\x5c\x64\x06\x0f\x90\xbf\xb4\x37\x95\xc5\x40\x43\x62\x23\x9a\xd9\x3b\xaf\x79\xd9\x5a\x4a\xda\x11\x24\x30\xec\xba\x0d\xaf\xeb\xcb\x94\x3b\x61\xff\x4d\x41\x35\x3a\x83\xb7\x90\x19\x3f\xf2\x0d\x7f\xe1\x47\xc8\x1d\xce\xbc\x39\x1e\x22\x87\xcb\xbc\x9e\x2b\x59\x4c\x2f\x10\x8c\x79\x21\x66\x4f\x8b\xbf\x5c\x87\x92\x31\x5f\x21\x74\xa6\xb9\x86\x0d\x2f\xfb\x42\x46\x84\xb1\x98\x49\xe6\xde\x92\x12\x13\xcf\xf6\x10\x0d\x8d\x2f\x12\xfa\x70\x0e\x03\x16\x96\x78\x8c\x87\x3d\x25\xf0\xf2\x0d\xea\x47\xfe\x36\x2a\x6a\xfa\xa3\x27\x90\x25\x09\xc5\x55\xf7\xbe\x28\x6a\xc1\xb3\xbf\xdb\x6a\x60\x09\x97\x88\x85\xd8\xff\xb5\x59\x1e\x9e\xd6\xfb\xc3\xec\xe7\x6c\xf5\x30\x9b\xb7\x10\x1e\x96\x80\x31\x1a\x59\xcc\x17\xed\x2f\x17\xbe\x51\xce\xfd\xfb\x92\x2c\xc3\xab\x15\xc2\x0f\x6c\x81\xee\x01\x5e\x78\x66\xac\x0a\xf2\xb7\xc1\x4e\xc2\x84\x32\xe4\xcf\x87\xe2\xa5\x49\x81\x4d\xf6\x7e\xb5\x94\x0c\x3f\x02\x11\x96\xc5\x1f\xff\xda\x6c\x06\xb7\x43\xf9\x12\xa1\xf1\x8e\x89\x54\x94\x8b\xe2\x78\x6c\xd6\x95\x4b\x3b\x84\x86\xc6\x49\x03\x1b\xa9\x15\x94\xef\xa9\x84\x60\x12\x8c\xeb\x12\x36\xa6\x12\xcf\x39\x49\xd8\x6e\x32\x66\x24\xf6\x28\x28\xe2\xb5\x5b\x79\x4f\xf2\x98\x30\xed\x71\x62\x03\xf3\x79\xaa\xe6\x97\x5d\x5a\xf7\x90\x5c\x6c\x34\x5d\x3a\x31\xee\x21\x98\x2b\xb4\x5c\x83\xd1\x18\x69\x50\xd0\x77\xc5\xcb\x96\xb7\x0d\x96\xc4\x13\x80\x2a\xb1\x66\x97\xfd\xd6\x76\x75\xdc\x2f\x48\x3c\xc9\x91\x4a\xfa\x7c\x6c\x4e\xe7\xbb\xcf\xf9\xdc\x10\xcd\x4d\x18\xb7\xca\xb1\x55\x70\xe6\xd9\x82\x9f\x26\xda\x11\x49\x10\xc6\xdc\xfa\x60\x60\x74\x5e\xb7\xe6\xed\x24\x09\x58\x88\x22\xec\x2d\xa5\xee\x67\x91\x9d\x8f\xb0\xcc\x65\xc6\xdf\xe1\x9a\x12\xf1\x3b\xd8\xcb\x80\x68\x34\x8d\x47\x4e\x82\xc4\x88\xd5\xd9\xb0\x7a\x94\x7d\xd8\x41\x61\x64\xaa\x19\x69\xb5\xed\xbf\x9f\x49\x48\x09\x36\x1e\xb7\xa7\xf6\xb5\x4c\x42\xa6\x90\x09\xfb\x81\xe9\x93\x1a\x86\x95\x49\x44\x22\x14\xf9\x48\xab\x05\x3f\x67\xaa\x6c\x72\xe2\x53\x5a\xda\x9b\xc4\xdc\x28\xed\x85\x49\x47\x25\x1f\xa4\x30\x49\x4c\x19\xc2\x2b\x0c\xf4\xb8\x65\x93\xff\x0d\xab\x6b\x82\xbc\x4e\x6c\x23\xac\xcd\x7a\xd1\x7f\xf2\x13\x02\x71\x62\x8b\xf1\xe7\xe3\x06\x05\xc2\xbb\x43\x1a\xdd\x0c\x76\x0f\xeb\x36\xb6\x4b\x88\x16\x68\x9a\x7e\xc7\x2b\x89\xb0\xa5\x2f\x56\xd7\x84\x46\x10\xd1\xb6\x4f\x6a\x23\xa7\x39\xd4\xab\x7c\x42\x53\x8b\x24\x2c\x22\xa1\x3f\x04\x6f\xf9\x9e\xfb\x62\xa6\xcc\x0e\x5c\x99\x67\xc8\x40\xb1\x26\x99\xcd\x24\x49\xa4\x91\x0c\x6f\x62\x57\x14\xff\xf9\x01\x97\xbf\x35\x55\x5c\x46\xa8\xcb\xb5\xd9\xae\xfe\xb9\x3c\x6c\xd6\x7b\x07\x5e\x9c\x7d\x5b\x36\x71\x91\xbb\x18\x01\xcc\x94\x4a\xa1\xaa\xbf\x01\xd6\xdc\xfb\x08\x80\x44\x80\x84\x56\x87\xf6\x25\x2d\xf2\x35\x32\x0e\xad\xf4\x92\x1b\xa4\x43\x67\xc6\x62\x57\x87\x96\x9a\xd8\x9d\x49\x72\x0f\x2b\x61\x95\xe4\xef\x60\x40\x92\x65\xe1\x70\x41\x6e\x8c\x88\x14\xef\x24\x7e\xce\xc2\xaa\x64\x5c\xcb\x71\x35\x63\xa9\x0c\x7b\x53\x53\xbd\x8e\xfb\x36\x89\x8a\x05\x16\x67\x6c\xd7\xd5\x6a\x52\x4f\x01\x77\x13\xc5\xc3\x20\x6a\x23\x15\x85\x2b\x90\xf9\xd6\xc1\x73\xa0\x94\xa2\x7e\xab\x2d\xb1\xe0\x37\xaa\xab\x09\x84\x14\xc1\x2a\x30\xce\x9b\x6f\x0c\xe7\x21\x06\x03\x47\xa3\xdb\x65\x56\x1e\x77\x4c\x18\x2e\x9e\xb9\xb2\x9f\xe8\xe2\x09\x65\xb5\x31\x9c\x97\xd1\xf2\x98\x80\x8e\xbc\x2e\xe2\x32\xf6\x24\xa8\xc8\x6c\x8f\x6b\x9f\x3b\x10\x3d\xda\x15\xfd\xe3\x0c\xd5\x78\x2e\x34\xe3\x2c\x6c\x95\x45\x75\x5a\x1e\xf9\xb5\xd0\x20\x49\x34\x4f\xb0\x6f\xbc\x1c\x6b\x7a\xf0\x0c\xc1\xbc\x30\xc1\x14\x70\x1f\x15\x06\xe8\x8c\x49\xf1\x59\xb6\x2c\x72\xc2\xbd\x28\xb1\x11\x7a\x5d\x42\xfa\x3e\xe2\xa7\xd9\x41\x7e\x13\xc9\x77\xe6\xaf\xd6\x36\xdb\x8a\xff\xa5\xf9\x8b\xf5\xe8\x1e\xbd\x95\x4d\x92\x12\x4b\x57\xe7\x68\xb6\xaa\xc3\xbf\xce\x3c\xaf\xbb\xad\x91\x87\x91\xc6\x0e\xa9\xbb\x6d\xc3\xe8\x62\x32\x4d\xe0\x51\xa4\x30\x6e\x50\xf0\x7e\x86\xec\xdd\x10\x76\x33\x18\xcd\x16\x8f\x12\x45\x6c\xc9\x73\x91\x96\xb2\x2d\x24\xf0\xd8\xd7\xd8\x34\x5d\xa7\xd9\x4f\xcc\x4d\x0d\x6e\xcf\x1d\x25\x26\x7b\xb4\xdc\xc6\xea\xa9\xa8\xaf\x0a\x57\x9c\x04\x31\x0a\x31\x9e\x32\x9e\xd7\xb2\xbf\x2a\x72\xc2\x44\xe2\x5b\x55\xcc\xe7\x5c\x41\x55\x97\xc5\xa5\x57\xc7\xe0\x24\x51\x5e\x2b\x78\xbd\xfb\xd7\x99\x97\xa6\xa1\x75\xa3\x3e\xc8\x09\x37\x92\xb8\x9b\xf5\xf7\x5d\x5d\x9c\x3a\x59\x53\xc2\xa9\xe7\xe3\xd2\x5e\x97\x5c\xc1\xd8\xb9\x99\x70\x4a\xfd\xd6\x97\xd9\x2a\xc8\xb7\x70\x57\x4e\xa5\xc6\x40\x41\xf2\x2c\xbb\x6b\xae\xb2\xc3\x25\x72\xe6\x11\x14\xd4\x38\x15\x95\x53\xde\x71\xa8\xe1\xe6\xeb\x1f\xd3\xbe\x3d\xf1\xf4\x55\x27\x51\xe0\x90\x2b\x86\x85\x67\xbb\x7e\x83\x9e\x21\x4f\xe2\x80\x5b\xd0\x2b\xca\x9e\x67\x19\xb6\xda\x1e\x0a\x9e\xb7\xd6\x31\x3d\x79\x64\xf3\xaf\xc9\x95\x6c\x63\xb5\xbd\xdd\x89\xd2\xb8\xe7\x1e\x1c\x14\x60\x66\x80\xca\x43\xa2\x8d\x1d\xcc\x49\x68\x88\xfc\x46\x74\x1c\x05\xeb\x9a\x30\xc6\xad\x9d\x9c\x0b\xb3\xef\x56\x50\x8f\xb1\xd8\x76\x84\x48\x28\x5e\xfa\x2b\xaf\x7e\x0e\x48\x15\xf6\xb8\x8c\x13\x14\x1d\x6e\xe6\x70\xb5\x58\xff\x8e\x5d\xf4\x75\x5d\x8f\xab\xc8\x0f\x7d\x27\xb8\xf1\xaf\x73\x13\x01\x18\xdd\x08\x77\x9c\x48\x63\xc9\x34\xd2\xcf\x75\x87\xa9\x17\x71\x2b\xda\xdb\x67\x76\xfd\xb7\x4f\xae\xb8\x94\xee\x23\x5c\x05\x60\xdb\xb9\xbb\xba\xe8\xb8\x7e\x5c\x69\x40\x31\xb5\x26\xae\x6b\x56\x20\xbc\x53\x5f\xf0\x5b\x38\x44\x66\x32\xb9\x52\xc6\x32\x1a\xd4\xac\x14\xe9\x55\xe9\x8e\x6b\x11\x92\xd8\xa5\x54\x23\x4b\x73\xc2\xb5\x34\x56\xc9\x60\xf7\xa8\x1e\x52\x9f\x6b\x29\xad\xcc\x90\xe5\xff\x15\xf9\xb5\x3b\x20\x11\xbe\x6f\xe0\xbf\x15\x42\xeb\xee\x0a\x2e\xb9\x7b\x21\x84\x1f\x46\x38\x85\xf8\xd5\xad\xb8\xe7\x68\x25\x14\x3e\x44\xca\xc0\xd6\xad\x74\xd8\x64\x34\x20\x02\x99\x04\xdd\x82\xb9\xc9\x78\xad\x8b\xb2\x75\x66\x9c\x32\x61\x26\x22\xa2\xda\x48\xd2\x14\x99\x5a\xe7\xbb\x1e\x30\x5a\xc4\xb1\x71\x2b\xad\x53\x18\x70\x00\x45\xcc\x78\x97\x0c\xa2\x6c\xc5\x7d\x51\xf6\x48\x57\x22\xe6\xd4\x78\x2d\xa0\x24\xc0\x08\x97\xe4\xc6\xc8\x18\xb7\xa8\x7b\x80\x51\x7d\x66\xf2\xdd\x16\xb1\xa6\x88\x79\xdc\xf0\xb2\x19\x9e\x61\x0f\xda\x7d\x21\xe1\x1a\xcd\xa0\x2b\x14\xc0\x32\x0a\xfc\x29\xcf\xef\x8a\xb3\xc8\xa0\x89\x3e\x6f\x71\xd9\x06\x7d\xf5\x21\xeb\x9e\x08\x4a\x64\x60\xa1\x85\xf9\x68\x07\x16\x2c\x60\xa8\x03\xf5\xd0\x03\xa4\xff\xbf\x7e\xb8\x24\x18\x89\x70\xb7\x77\x52\x4b\x6e\x4d\x53\x83\xd5\x48\x30\x02\x58\xb4\xd8\x3c\x2c\xb6\x3f\x8b\x3e\x51\xdd\x0e\x48\x3c\x53\x1c\x9b\x9d\x9c\x4d\x22\x11\x09\x4f\xb0\x0c\x70\x04\xc5\xb3\x79\xd1\xac\x98\xb9\x9a\x9f\xcb\xbc\x2f\x96\xe9\xe2\x2d\x21\x7c\x8d\x64\x69\x43\x4e\xac\xf9\x5b\x9a\xbf\x58\x35\xee\xd1\x77\x09\x9e\x60\x01\xb2\xca\x78\xf5\xba\x3b\xf2\x2c\x7b\xae\xa0\xcc\x47\x06\x8f\xdd\x2c\x48\x4f\x63\xe8\x55\xe4\xd9\x05\x97\x86\xea\xbe\x4c\x3b\x0f\x25\x22\xa4\xcf\x59\xe2\x70\x11\xf2\xcd\xfd\xf8\x43\x6a\xb9\xa5\xe3\x0b\x90\x41\xc0\x4c\x40\xbb\x3c\xdc\x3f\x3f\xdd\xad\x9e\xbe\x1d\xbe\xad\x67\x0f\xed\xf9\x42\x1d\x72\x87\x3a\x2b\x41\xf2\xaa\xde\xc9\x62\x0c\x80\x17\x32\xe2\x88\x44\x12\x03\xa9\x19\x22\x64\xcc\x05\x75\x9e\x35\x08\xe4\xdd\x3e\x0c\x42\x3f\x21\x75\x80\x77\x8d\x1f\x0f\xe9\xa1\xc8\x0f\xf5\x2b\x1c\x3e\x5c\xd9\xdf\x9d\x46\x79\x89\xc1\xc3\xa8\xb4\x3e\x54\x5c\xc3\x58\x00\x66\x70\x4a\xc5\x94\x41\x69\xdb\x1a\xe2\xcc\x49\xe3\x4e\x87\x4d\x02\x18\xa3\x8e\xb5\x10\x0c\x61\xc1\x42\xfb\x31\x26\xb2\x2f\xfc\x08\x7d\xc2\x99\xd0\x11\x20\x35\x69\xbf\xde\xcf\x1e\x5c\x8d\xfa\x7e\xbd\x3d\x2c\xb6\xeb\x5f\x77\x3d\x12\x93\xd0\xb1\x91\x35\x7d\xdc\xae\xee\x9e\xdb\x89\xd5\x32\x08\x4c\xe7\x6c\x95\xb7\x56\x68\xc3\x9b\x23\x3d\x2d\x9c\x78\x5d\x3b\x64\x95\xcf\xd1\xde\x6d\xd4\xf6\x97\xbe\xc7\x90\x65\x60\xa8\x45\xfb\xe2\xb7\xa4\x5d\xe9\x07\x1c\x2d\x75\xee\xcf\xd2\xfa\x27\x10\xe9\x47\xca\xd8\x03\x64\x45\xd5\x25\x4f\xb7\x5a\x3f\xfd\x7f\xbb\x1a\xe7\x57\x0d\x23\xf7\x8a\x48\x9f\x18\x22\xcc\x73\x05\x19\x54\x95\xdd\xc6\x4f\x56\x74\xc2\x5d\x4e\x10\x52\x11\xb9\x06\x24\xa8\xbe\xe4\x94\x1b\x41\x88\x34\x5b\x22\x0a\xe7\x42\x59\x35\xa9\x9c\x3b\xc8\x18\xf6\xf5\x5a\x6f\x9a\xc3\x91\x7f\xb6\x07\x55\x84\xf4\x82\x3f\xf7\x0f\xbd\x3f\xc9\xa4\xb5\x1b\x48\x4f\xd8\xa7\xb7\xe7\x75\x63\x42\x62\x1a\xb0\xa9\x2c\x96\xb7\xd1\x59\x32\x64\x46\xa2\xe0\x05\xea\xe5\xfe\xfb\xf3\xee\xce\x7d\x3e\x0e\x34\xe6\x57\x87\xc3\xe1\x30\x96\xe1\x9b\x84\xb2\xb8\xcf\x45\x1e\x69\xcb\xe6\xcd\xae\xd4\x9e\x90\x46\xf8\x86\x36\xa9\xa6\x17\xce\xb2\x54\xc2\xfc\x7c\x19\x4c\x63\x0c\x1c\x03\xfb\x54\x16\x73\x78\x49\x9b\xa8\xab\xfd\x38\x09\x04\x52\x4f\xec\xef\x98\x17\x45\xfb\x30\xd0\xc0\x37\x4e\x1d\x65\x7a\xdc\x02\x37\xde\xd1\xbd\x80\x43\xd2\x88\xa2\xa4\xd0\xd3\xfc\x57\xfb\x27\x6e\x04\xd8\xb1\x8b\xb5\xfd\x1c\x44\xfa\x76\x08\xf3\x05\xa2\xde\xce\x79\x2a\x8b\x32\x1f\xbb\x33\x12\xc9\x82\x88\x77\x34\x5e\xbb\x8d\x36\xdb\xf4\xa8\xd8\x29\x59\x60\xe8\x1a\x78\xbf\x7e\x41\xfa\xf2\xda\x1d\x8a\x05\xba\x66\xee\xa1\xaa\xe7\x3c\x97\x45\x79\x5f\x94\xc7\x73\xc6\xdb\x01\x8a\x63\x17\xa6\xc8\xc1\x9a\x7e\x2f\xcf\xed\x4d\xe6\x94\x60\x55\xf7\xa1\xa8\xeb\xf4\xb3\xb3\x4f\x21\x52\x44\x02\x01\x2e\xdb\xe5\x6e\xb9\xfd\xb9\xbc\x3b\x2c\x17\xeb\xdd\x5f\xbb\xfd\xf2\xf1\xf0\x6d\xbb\x7e\x76\xb0\x4e\x29\xa9\x71\x33\xb2\x25\x7a\xc8\x40\x8c\x23\xff\xff\x26\xff\xd3\xfb\x4f\xf7\x39\x2e\x11\x5f\xf7\x5a\x9c\xcb\xc3\xa0\xea\x2f\x95\xf0\xf0\x4e\xd9\x18\x1a\x4a\x9b\xea\xdb\xc3\xe0\xd1\xc4\x24\x4c\x79\x71\x4c\x73\xde\x65\x7f\x12\x78\x88\x9d\x15\x2b\x22\xeb\x02\x94\x9e\xa1\xc6\xe8\x16\x81\xf2\x28\xeb\x8b\xdd\x1b\x9a\x55\xb5\xca\x07\x88\x89\xe1\x6d\xd3\x71\x80\xd7\x67\xa2\xa1\x66\xf7\xb9\x92\x2b\x27\x52\x2b\x3f\xe8\xd0\x5e\xff\x67\x57\xfa\xe6\x44\xdc\x23\x2e\x9b\x3e\x97\xd5\xa0\xf3\x23\xb5\x0e\x95\x6e\xf1\xcd\x4d\xf2\x8f\x70\xb2\xa2\x9a\x96\x27\x22\xca\xf3\x02\x6e\x54\xe8\x44\xf3\xa4\x0d\x77\x01\xe5\x05\x1e\xa6\x4a\x65\x75\xca\x5a\x34\xa9\xf2\x83\x00\xec\xde\x88\xb1\xf3\xd0\x27\xc4\x0d\x4a\x62\xa1\x9c\xc5\x6f\x9d\xf7\xb3\x0b\xe5\x4b\x63\xc9\xab\xd3\xac\x86\x72\x7e\x46\x53\xd4\x0e\x9e\xa1\x02\x66\x3c\xe7\xab\x53\x9a\x3b\x3d\x11\x77\x08\x14\x58\x27\x93\x2b\x21\x5a\x3b\x24\xf4\x13\x62\x8b\xcb\xbb\xf3\xd1\xf8\x8f\xf7\x97\x05\x15\xd2\x10\x4c\xd4\xd8\x3e\xdf\x2a\xa4\x89\x09\xa2\xb0\xc4\x81\xc3\xad\xfd\x85\x1b\x11\x85\xa6\x59\xd5\x4d\xed\x7d\x07\xc5\x6d\x07\x91\x18\xaf\x7c\xb5\x58\x1f\x16\xb3\x4d\xd0\xfe\x5d\x0a\xa4\xde\xdf\xa7\xa7\xca\x9a\xf5\xf2\xae\x99\x3d\xe6\x0a\xa8\x48\x79\x89\x61\xd6\xbe\xa7\x55\x31\x5a\x7e\x54\x04\x42\xfb\xe6\x5a\x73\xb8\x0c\xe5\x55\x89\x8a\x34\x89\x3a\x1f\x1e\x03\x7e\xf8\x9b\xb5\x62\x7b\x06\x12\x79\x18\x29\xee\xb7\xb3\xa7\xdd\xfd\x72\x7b\xd8\x6c\xd7\x7f\xfe\xe5\xce\x4f\x88\xd4\xa8\xc0\xf9\x79\x82\xb2\xae\x06\x66\x8c\x44\x11\xe9\x87\x06\x9f\x50\xc2\xcf\xe7\x4d\x4f\x37\xd1\x8d\xa0\x3c\x41\xbf\xf0\xc3\x11\xf2\xf3\x30\x09\x52\x54\x87\x58\x44\xcd\xac\xb5\xfa\x63\x9a\xff\xe3\x5c\x94\xe7\xe3\x63\x1b\x5a\x29\xe6\xfb\xc6\xed\x7c\xc2\x5a\xcd\x0d\x11\x1e\xe6\x52\x5d\xb2\xd3\xf2\x09\x47\x03\x75\x84\x9e\x30\x47\x73\x43\xdb\xbc\xaa\x3d\x0c\xa8\xbf\x6e\xed\xbd\xbe\xa7\x4d\x24\x79\x99\xee\xef\xaa\x24\x89\x91\x45\xfb\xf8\xf8\x68\x3b\x54\x6d\x02\xab\x12\x6e\x36\xe4\xa3\x69\x8e\x63\x53\x61\xa9\x90\x5f\x8e\x8a\x2b\x93\x0b\x8b\xe2\xbe\xc1\x83\x57\x90\xab\xe5\xfe\xbb\xd5\xe2\xb2\x5d\x75\x1b\x6f\x0e\xef\x1c\x0f\x18\x56\x53\x5e\x78\x75\x5f\x94\x8b\x87\x95\xbb\x00\x61\x49\x8d\x55\x7d\x16\xdd\xdf\x94\xef\x72\xe0\x45\x5a\x5f\xee\x0b\x6b\x3d\x3a\xd5\x29\x53\x42\x44\x8c\x8c\x2a\x81\xd7\xeb\x9c\x12\x42\xa2\x8e\x1e\x4e\xc1\xe1\x0e\x3a\xd8\x86\x1b\x00\x31\x12\xe0\x57\xc7\xd3\xa2\x89\xa7\x87\x3f\x59\x46\xc4\xd7\xfd\xca\x84\xb9\x7b\xd7\x96\x07\x44\x81\x67\x18\xf8\x87\x23\x7f\x83\x5f\x9d\x00\x8b\xe5\x3b\x4d\xc2\x72\x14\xc4\x44\x0d\xdc\x4c\xee\xb3\xf4\x74\x83\x48\xa1\x80\x18\xac\xf5\xbf\xea\xcb\x4f\xa3\xc0\x59\xb4\xfc\x41\x05\x89\x44\x54\x89\xcc\x2f\xf3\x5a\xf6\xb2\x75\xd5\x04\x1d\x7d\xa3\xae\xbe\x4d\xb0\x1d\xa2\xc3\x18\xdf\xd1\xfd\xc3\xdd\xe1\x69\x7d\xe7\x42\x66\xa5\x39\xc5\xc0\x17\x4d\xc0\x0e\x27\x28\x0f\xd0\xb6\x78\x95\x96\x02\xb8\x13\xdc\xea\x39\xfb\x34\x47\x4c\xbf\xff\x03\x66\x25\xa0\x18\x86\x4b\x58\xc1\x8b\x35\xea\xc5\x58\x9c\xb7\xab\x50\x0c\xbb\xd3\xa3\xc6\x19\x78\x60\x10\xbb\x03\x53\xce\xd1\xbf\xd7\xf0\x70\xf0\x39\x31\x61\x49\x7a\x84\x39\xd4\x1f\x00\xb9\x7d\xc8\xdd\xac\x41\x40\x8c\xd4\x96\xeb\xb1\x6f\xf8\x65\x7d\x46\x47\xdc\x6a\xcc\x83\x83\x30\x0c\xcc\xcb\xc9\xd3\xdc\x74\x36\x3e\xfb\x2a\x8a\x04\xa2\xd0\xb0\x05\x6c\x41\xc5\xed\x14\xc3\xb3\x44\x00\x61\x9f\xeb\x3b\xb9\xe4\x41\xa4\x8d\x86\x82\x8b\x6e\xad\x00\x80\x7a\xb4\xdf\x7d\xc7\x5d\x70\x0d\xb1\xc7\x8d\xb6\x0e\x7f\xb7\xa4\xac\xe1\xa9\x62\x16\x72\x97\x89\x1a\xb1\xac\xe1\x71\x02\x04\xdf\x90\xe5\x7e\xf1\xf4\x55\x93\x08\x28\xd1\x68\xf1\xfe\x9c\x3b\x7c\x49\x07\xdd\x1d\x9e\x92\x85\x26\x0b\x35\xe2\x08\x5f\x17\x98\x81\x49\x63\x09\xa0\xca\xf4\xf4\xe8\x1e\x21\x60\xca\x8f\x2c\x38\xcf\x8a\x95\xde\x46\xd1\x43\xa2\x34\xf2\x90\x15\x22\x48\x9e\xe0\x63\x14\xa0\x42\xa2\x8d\xf8\x44\x87\xeb\x7a\xf7\xdd\x5e\x08\x9c\x46\x98\x7a\xaf\x4f\x5c\x76\xc5\x72\xe0\x94\xe0\xba\xbe\xce\xdb\x38\xad\xf8\x32\x36\x72\x39\x15\x70\x66\x90\x4e\xa5\xed\x57\x5e\x51\xef\x81\x27\x1a\x39\x64\x03\x8e\xf0\xef\x1a\xa6\xc3\x39\x16\x5c\xe0\x62\xdc\xa9\x0d\x5a\x89\x11\x7d\xce\x1c\xe6\xdf\x94\xd4\x46\x9f\xd3\xc2\x16\x26\x72\x28\x79\x66\xda\x73\x2e\x42\x05\xe9\x4b\x64\xdf\xd6\xe9\x09\x51\x56\x57\x39\x64\x1b\x14\x81\x24\x1a\x2d\x2f\x66\x9b\x4d\xfb\x69\xea\x23\x18\x70\xb1\x7e\x7c\x7c\x7e\x5a\xed\xff\x42\xf2\x71\x5f\x4f\x9d\x80\xd4\xa1\xa1\x19\x9c\x05\xde\x22\x63\xfa\x35\xce\xde\x46\x3f\x56\xf9\x1e\x37\x75\xc0\xea\x0c\x9b\xf5\xaa\x7d\xe5\x94\x30\xdc\x74\xe9\xb0\x12\xf7\x3c\xcb\x04\xbf\x4d\x56\xb0\x9f\x03\x2f\x44\x2e\xce\xe1\x20\xfb\xe6\x8b\x6d\xfc\x0f\x20\x35\x46\xf1\x68\x4f\xd7\x4e\x6c\x76\x31\x1b\x4d\xb7\x9e\x69\xca\x8d\xcb\x20\xaf\x5e\x0f\xae\xd0\xd1\xbe\x17\x6e\x90\x30\xd1\xd6\x0b\xd4\x26\xfc\x5b\xd5\x70\x9c\x8d\x56\x06\xed\x25\x89\xb0\xa2\xbe\x3b\xa7\x18\x6c\xc8\xf1\x7f\xb8\x11\x9c\x23\x9e\x5b\xa7\xb9\x7a\x82\xcf\x7a\x87\x5a\x2a\x53\x35\x77\xed\x87\xd4\x33\x84\x9b\x3a\x7d\xec\xce\xe0\x53\x6e\x5a\x29\x45\xbd\x47\xf6\x88\x3b\x10\x50\xdf\x33\x36\x6a\xf8\x3c\xac\x47\x8c\x46\x1d\x50\x03\x75\xed\xd9\xf1\x4d\x6f\x69\x3a\x24\x09\x32\x0e\x17\x0f\xab\xf9\xf3\x9f\xbd\xa8\x43\x87\x49\x80\x95\x4f\xc8\xd2\xcf\xd4\x3d\x72\x3a\x0a\x18\xf6\x4d\x44\x13\x76\xdb\xc8\xf2\xa6\xa5\xe7\xf0\xa2\xa2\xc0\x78\x04\x56\xcd\xe6\xb3\xaa\xdc\xbd\xd9\xc2\x29\xe3\x23\xf5\x40\x1d\x51\xe6\x79\xad\x09\x08\x6a\x8a\xe4\x23\x20\xb3\x33\xda\x25\x3a\x4a\x22\xb4\x6b\x3f\x95\x86\x97\x53\x56\xe0\x8d\xce\x47\xa8\x87\xe2\x0b\xa6\xd4\x8b\x7c\xc5\x79\x21\xc6\x83\x18\x45\xc7\xd9\xb2\x49\x89\x49\x30\x3a\x4a\x89\xc6\x4e\xb9\xc3\xce\x8e\x9e\x2d\x4d\x99\x47\x1d\xec\xfb\x0c\xd9\xf8\xe3\x49\x68\x00\x70\x06\xa3\x30\x1d\x05\xea\x44\x6a\x84\x8e\x57\xaf\xbc\x84\x9e\x95\x38\xd1\x22\x00\x12\xd8\xd6\xdb\x65\xac\x55\xd2\x7f\x7c\xb5\xe0\xc2\xb5\x43\xfe\x59\x1c\x45\x0a\xd5\xfd\x39\xcb\x56\xb9\x2e\xe6\x97\x89\x28\x56\x4b\xcf\x93\xc1\xa0\x13\x76\x4b\x0a\xcf\x6d\xd5\x5a\x0a\x8d\xbf\x25\x3f\x1f\xd7\x7a\xc7\x8f\xa7\x0c\xf6\x97\x53\x9b\xa1\x69\xa9\x02\x5c\x59\xaa\x8c\xbf\xc3\x0e\xca\x8e\xb9\xab\x95\xaf\xb4\xb1\xc0\x46\x71\x8c\x7d\xc9\xc7\x4a\x29\x5a\xc5\x31\xca\xe2\x09\x43\x34\x5e\x94\xa0\x52\xcb\xa7\x77\x8b\xb6\x06\x3f\x0c\x0d\x6c\x08\xbd\x28\x7b\x8d\x3f\x0d\x71\x84\xc2\x44\xcd\x7d\x82\x0a\x75\x52\xfa\x47\x09\x20\xe4\xd3\x09\xd7\x1f\x0a\xdb\xb0\x3d\x94\x3c\x57\xc5\xf1\x6e\x77\x30\x26\x4d\xc7\x14\xbd\x67\xa6\x7b\x18\x1a\x94\x51\x66\x80\xcf\xba\xe4\x4d\xaa\xd7\x3d\x07\xa0\x43\xcc\xaf\x4c\x91\xbf\x57\x2d\x18\xea\x06\x4e\x96\x62\x1d\xb5\xef\xa6\xc6\x2e\xd1\xda\x0b\x3d\xc3\x4b\xac\xd3\x12\x7e\xa5\x99\xfa\xee\x1a\xef\x93\xb8\xc9\xf1\x3f\xee\x34\x51\xc4\xc2\x1e\xdb\x7d\x56\xa5\x0a\xae\x44\x95\x6e\xbc\xc9\x9a\x1a\x44\x09\x32\x07\xfe\x5a\x3f\x4f\x98\x25\x7f\x85\x21\x9a\x5c\xe4\xb5\xa6\x46\xae\xde\x12\x2e\x57\x0a\xfa\xdd\x70\xad\x39\x41\x2d\x30\xcc\x17\xd1\xe4\x7f\xeb\xe8\x38\xa3\xe7\x47\x73\xe9\xb5\xca\xf6\x08\xcb\xba\x71\x21\x38\x9e\x7a\x5e\x14\xc4\x23\x19\x52\xa7\x8b\xfa\x1f\xc9\x90\xba\xd3\x29\x0f\xfd\xe2\xaa\x26\x84\x38\x04\x07\x13\x75\x76\x64\x5c\xea\xf9\x41\x22\xac\xf2\xf6\x82\x97\xea\x4a\x41\x9a\x7a\x01\x4d\x10\x51\xb7\x5d\xde\x2f\xb7\xdb\xd9\x83\xb5\x93\xdf\xce\xf6\x4b\x77\x92\x80\x31\xd3\x87\x6e\x16\x4f\xe3\xd0\x6d\x2e\xc3\xb7\x03\xc2\x08\x94\x93\x4d\xb6\x70\x74\xeb\xcb\x3c\x35\xff\xd4\x0b\x19\x13\xf1\x90\x47\x66\xb6\xbf\xae\xb6\x42\xbd\x10\x74\xd8\xb5\xcc\x7a\x5a\x8d\xee\xb8\xe6\xd8\x19\xb5\x4a\x58\xff\x70\xf7\x8f\x7a\x91\x6f\xd8\x9f\x2f\x50\xdf\xc3\x48\xcb\xdb\x0d\x21\x5c\x3b\xa8\xfd\xa6\x2c\xde\x53\x35\x5a\xac\xa8\x17\xd3\x08\xcd\xf4\xb2\x1c\xad\x90\x9a\x2c\x4f\x85\xc1\x64\x58\x4e\xbd\x98\xc7\x89\x4d\xd7\x9e\xf3\x53\x59\x34\x61\x01\xa8\x7f\x9c\xa1\xbc\xf4\xca\x5e\xd4\x23\x01\x60\x77\x33\x95\x45\xd8\x5b\x74\xa9\x47\x35\xf5\x8c\x68\x63\xcd\xb3\xaa\x87\x1c\xa3\x1e\xa3\xb1\x61\x5c\x18\x88\xd1\x2e\xe7\xa7\xea\xb5\xa8\x57\xed\x4d\x66\x10\x60\x15\xe1\xc8\x3f\x77\x4d\x8a\xec\x68\xca\xd4\x6b\xfe\xc7\x91\x61\xdf\x3c\x63\xe7\x63\xaf\xfe\x42\xbd\x44\x2a\xc7\x0f\x70\xfc\x94\x6f\x65\x71\x3e\x55\x3f\xe0\x32\x1b\x4f\x58\xa2\x3c\x8c\xdc\x9f\xe0\x63\xc3\x2f\x65\x91\x65\xa3\xe9\xe2\xb1\x36\x7e\x27\x3d\xaa\xcb\x4a\x7d\x8e\x4e\xc3\xb5\xc2\x80\xe7\x71\xf6\xe7\xea\xf1\xf9\xf1\x40\xa2\xc3\x7c\xb5\x3f\xec\x56\xdf\x9e\x96\x77\x87\xd5\xd3\x7e\xf9\x6d\xb9\x3d\xfc\x9c\x3d\x3c\xb7\x4f\x9f\x12\xa6\x52\xb8\xdb\x2c\x17\xab\xd9\xc3\x6a\xb7\x6f\xe2\xc6\x1f\xcb\xc3\xfe\xd7\xda\x8d\x81\x38\x31\x8a\x2c\x5c\xc3\xb7\x26\x59\x2b\xeb\x94\x67\xe6\xce\x2f\x20\xcd\xbe\x24\xd0\x51\xdf\xf3\x04\x58\xba\xce\x43\xfa\xde\x9a\x1f\x51\xdf\xa3\x8a\x28\xb7\x61\x15\x9f\x43\x8e\x33\xf5\x3d\xed\x59\x8e\x8b\xc1\x2d\x58\xa9\x98\xde\x1e\x49\x7d\x3f\xf4\xf0\x59\x7f\x3c\x67\xbc\x8b\x79\xa8\xef\x53\xdf\x34\x68\xed\xed\x6c\xff\x0e\x09\xd6\xf4\xff\x71\x86\xf3\x70\xb9\xa1\xbe\xaf\x03\xcf\xe8\x52\xef\x78\x2e\xeb\xce\x5a\x8d\xfa\x81\x4f\x85\x75\xe0\x38\xbb\xdd\x91\xfa\x01\x8f\x11\xe5\xe6\xac\x0c\x0d\xa9\x73\x74\xd6\x80\x53\x82\x48\x18\xfe\x06\xa6\x96\xd1\x7e\x5c\x71\xe6\xd0\xaf\xd6\x9b\xd0\x73\xc7\x42\x12\x60\x2b\xe6\x64\x00\x3a\x43\x2e\x2d\xf5\xa3\xd0\x70\x59\x9a\xcd\x6f\xd4\x2a\xa6\x7e\x14\x07\x8e\x85\xfc\x3d\x55\x6a\x64\xed\x4b\xfd\x88\x07\xce\x99\x20\xcd\x5f\xd6\x39\x74\xed\x14\xea\x47\xda\x38\xa3\x1e\x6c\x2d\xac\x5f\x6b\x72\x63\x62\xce\xb0\x3a\xb3\x3b\x97\xef\xe9\x3b\xcf\xb6\x3c\x97\xaf\x7b\xd4\x2d\xe9\xee\x40\xac\x98\xd7\xae\x8d\x06\x7d\x64\x56\x2d\x5b\x29\x6c\x67\x31\xd6\x1e\x2e\x91\xeb\x39\xb6\x14\xb6\x5f\x24\xc3\xd4\x27\x49\x84\x0c\x24\x14\xf6\xf1\xdd\x29\xa8\x6f\x64\x4b\xf6\x0f\x4f\x56\x0a\xeb\x69\xf6\xb8\x6c\x8f\x06\x84\xd8\x5e\xd4\x4a\xa2\xf6\xd2\x75\x1d\x89\xfa\x34\xe4\x56\xfa\x44\x37\x09\xda\x86\x5f\xae\x5d\xb6\xa9\x4f\x63\x1f\xd5\x5b\xd0\x91\x30\x57\x77\x90\xa5\xef\xb6\xf0\x7a\x0d\x16\xea\xaf\xe2\x3e\xe5\x80\xda\xd2\x77\xfb\xc5\xe2\xb0\x7a\x58\xff\x3a\xc4\xed\x05\x8a\x00\x1b\xb6\xce\x29\xab\x8d\xc3\x6f\x20\xdd\xa8\x4f\x15\x25\xba\x9d\x5c\x63\xd3\xb3\xb1\x66\x94\x37\x3f\xa2\x91\x02\xa8\xd3\x2c\xbb\x2f\x8b\xa3\x79\x03\xec\x41\x46\x0d\xc2\x42\x16\xa6\xce\x31\x50\x3f\xa7\x3e\x13\x31\x76\x2d\x72\xf8\xd8\x97\xc0\xab\x73\x39\x7e\x57\x13\x1d\x24\xce\xa9\x71\x0f\xfc\x38\x01\xb0\xa3\x3e\x0f\x63\xec\xc3\xd9\xa6\x50\x56\x54\x50\x8f\x4b\x87\xd4\xe7\x89\x29\x7a\xcb\xf2\x52\xd5\xae\xa4\xde\xfc\x99\x63\x26\xb4\x10\x9f\xfd\x32\x3e\xf5\x45\x20\x02\x70\x7a\x7a\x00\x98\xd0\x96\xf7\x00\xaa\xc9\x47\xd7\xb7\xa6\x43\x28\x1f\x5b\xab\x50\xd5\xe9\x91\xd7\x70\xcd\x54\xa2\xbe\x64\x46\x7d\xac\x2b\xf5\xef\x6a\x2e\xdf\x0c\x2b\xdf\x8d\x91\xd2\xb7\xb0\x9f\xe5\x76\x11\x78\x83\xd8\xd0\x8e\x51\x81\x50\xae\x9d\x64\x8b\x81\xf3\x0b\xf6\x7c\xfa\xb1\x28\xf5\x95\x00\xf7\xca\x3c\x89\x72\xad\x31\x45\x18\x33\x70\xa8\x0f\x84\x60\x3a\x6a\xa6\xb1\xb3\x98\xed\xe4\x7a\x9c\xca\xad\x05\x95\xb9\x04\x8b\xfa\xc0\x3c\xe9\x3a\xea\x3d\xa0\x02\xf5\x41\x1a\xa2\xe7\x4b\x56\x08\x90\xbd\xd7\x58\x87\x11\xf7\xad\x08\xbf\xd1\x84\x9b\x10\x0b\xa4\xbe\x86\x18\x9b\x2d\xa7\xa2\x18\x74\x22\xa9\xaf\xb5\x76\xb6\xd7\x33\x55\x59\xcb\xf9\x29\xaa\x1a\x0d\xbc\xd0\x43\xb9\xdf\x63\xfa\x89\x0c\x98\x2d\x17\x22\xad\x6f\xfa\xd5\xb5\x9f\x8a\x23\x8b\x2b\xfd\x76\xc6\x45\xa8\x8b\x08\x02\x2f\xf2\x21\xea\x7b\xf1\x5e\x3d\x6f\x81\x17\x29\xe6\x98\x74\x2f\xa8\xd9\x5c\x7c\x5e\x56\xcd\x96\xd3\xec\xea\xbd\x46\x00\x0d\x3c\x1a\x60\x99\xa6\x84\xaa\xc8\x50\x97\x32\xcb\x20\x7f\x19\xa0\x79\x69\xe0\x29\x85\x7b\xcf\xdb\x3c\x6d\xaf\xc3\x27\xbe\xb3\x44\x6a\x92\xb8\x5e\xd9\x96\x06\x3e\xf5\xd0\x34\xe7\xc8\x3f\xe7\x50\x1b\x0c\xd1\x5d\x0b\xb5\xa0\x81\xaf\x14\xd6\xe4\xbe\x35\xb1\x5f\x6e\xc4\x30\xed\xa1\xc0\x8b\x11\xa8\xf5\x9c\xd7\xa8\x95\xd2\x5b\x30\x6e\x47\xf2\x43\xb9\xf6\xdb\x13\x1b\xd0\x30\x30\x36\xbb\x47\x14\x7d\x3b\xa4\xb2\x68\xbf\x58\x2a\xec\x82\x2d\xad\xff\x5a\x07\xd2\xbd\x95\x73\xda\x0f\x86\x31\xc7\x6e\x83\x15\xd8\xb9\x2d\xc1\x4e\x83\x88\xf8\x88\x76\xfe\x5e\xfc\xe3\x3c\x3f\x97\xe3\x84\x97\x06\x91\x36\xec\x1b\x27\x67\xe3\x5e\xae\x6a\xf0\x08\xc4\x22\xc2\xda\xcb\x7c\xfd\xe7\xaa\xf7\x64\x07\xb1\x50\xcc\xeb\x2b\x61\xf6\x08\xd9\x83\xfb\x49\x9a\xa5\xdb\x31\x5b\xee\x6e\x8a\x3e\xd1\x80\xfa\x3e\x6a\xb9\xfe\x28\x4a\xe0\xbb\x57\x0b\x43\xff\x22\xdd\x68\x3f\x47\x10\x47\xd0\x92\x79\x73\xf8\xe8\xc9\x5e\xd2\x80\x42\x48\x13\x0b\xaf\x86\xba\x7b\xc9\x27\x76\xc8\x20\x89\x20\x66\x53\x76\xb5\x13\x8e\x07\x34\x48\x48\x84\x2d\x83\xff\x2d\xd2\x7c\xff\x0a\xdf\x9b\x79\x9b\x3c\x2b\x35\xb2\x10\x15\xd4\x6b\x63\x81\x31\x86\xce\x37\x63\x22\x42\x5d\x63\x62\x96\x2b\x04\x95\x5f\x7a\xc6\x51\x34\x48\x92\x10\x65\xaa\x45\x20\xfa\x80\xe2\xe6\x80\xc2\xc8\x3d\x03\xec\xa5\xde\xf1\x4b\xd5\x1e\xb2\xb1\xf1\x01\x41\x62\x28\xf6\x73\x0b\x5d\xe7\x3e\x01\x32\x20\x3d\xd5\x89\x5f\xbc\x2c\xd3\xe2\x4a\xd7\xea\xc6\x63\x9f\xe8\x44\x24\x3d\xf5\x86\x45\x61\xa1\x98\xa3\x9f\xcb\x45\x12\x9b\xea\x46\x9e\x5f\x32\x3e\x88\xfe\x03\xae\x25\xf3\x7a\x0d\x8e\x16\xcd\x3e\xd6\x3b\xa4\x81\xf4\x49\x02\x46\xeb\x41\x14\x69\x9f\xd6\x42\x03\xc9\x43\xe3\x0e\xb9\x7e\xda\xcf\x9e\x66\x18\xdb\xb8\x63\xca\xe7\x48\x0c\x3a\xbc\x18\x47\x06\x03\xe3\x70\x7b\x76\x00\xc4\x8f\x7d\x94\xaa\xb3\xb6\xf0\x4d\x9e\x8d\xdc\xa7\x41\x1b\x99\x06\x9a\x1b\xb7\x4e\x2b\xc1\x06\xfc\x38\x58\xce\x42\x2f\x92\x60\x75\xa5\xa7\xac\xde\x69\xe8\x91\x04\x3b\xc1\x9d\x7a\xeb\x91\x0f\xf5\xe0\x27\xdf\xef\xd0\x23\x32\xb0\x6b\xe2\x1d\xaf\x79\xf8\xf7\xee\x4f\xe8\x09\x03\x6b\x6e\x92\xcb\xe1\xf5\x0c\x9f\xed\xd0\xe7\x0c\xeb\x10\x9a\x1f\x41\x35\x11\xcd\x23\xaf\xaa\x7d\xb1\x52\xe3\x1f\x10\x5a\x50\xec\xa6\x2c\xfa\xf8\x2b\x1a\x86\x4a\xe2\x7b\x67\xab\xf5\xc3\xf6\x06\x0d\x23\x12\x21\x5e\xf3\x3b\x1a\xd4\xba\x3f\xb2\x18\xc3\xd9\x96\xbb\xef\x6a\x31\xa8\xfb\x3c\x5c\xc1\xc2\xd8\xaa\x73\xbf\x40\xfd\xdd\xef\xe3\x34\x69\x18\x47\x09\xb6\xf9\x0e\x3d\xf3\x86\x29\xca\x3b\x0d\x49\xc0\x8c\x47\xb2\xc9\x60\x97\x25\x77\xe7\x20\x31\x37\x05\x14\xae\xe1\xab\xb0\x3a\x24\xb1\x32\x2a\xe1\xfc\x08\x6b\xa5\xda\xcf\xf3\x18\xa3\xba\xbb\xce\x5a\xe9\x0b\xc9\xb9\x66\x3c\x60\x50\xd5\x7a\xb5\x5c\x07\xb2\x76\x24\x8d\x14\xb6\x43\xcc\xe2\x7b\x6d\xa6\xe7\x86\x25\x12\x05\xfd\x16\xf3\xd5\x9f\x5f\xd4\xa6\x98\x1b\x2e\x24\x4a\x2b\xef\x5e\xd3\x1c\x3a\x43\xe0\x5b\xdd\xa3\x09\x5e\x67\xd7\x69\xa1\x21\x8b\x7c\x66\x33\xf8\x9f\x50\x56\x57\x5c\x15\x1a\x32\xe6\x01\x6b\x03\x44\xa8\xfa\x05\x20\x5b\xe7\x6b\x06\x05\x60\xa4\x59\xea\x73\x99\x6f\x0a\xdc\xfd\xdf\xae\x88\xc1\xed\x68\xa3\x3e\xd9\xbc\xd4\x08\x3a\x5a\x6b\x2b\x6c\xeb\x5e\xd8\x90\xb1\x18\xf9\x6a\x28\xef\x56\x21\x65\x68\x97\xfe\x1b\x0e\x0a\x8c\x41\x38\x2a\x2a\xb9\xb1\x09\x31\xed\x69\x9e\x3f\x9f\x5e\x50\x5e\xd1\x1d\x11\xc4\xb3\x8f\xde\xd2\x84\x3a\xcd\xd5\xff\x4c\xe1\x63\x74\x0f\x98\x4e\xb0\xde\x53\xb7\xda\x25\x2f\xa9\x9c\x9d\xeb\x57\x63\x16\x34\xbc\xaf\x89\x6f\xd9\xc5\x36\x25\x7e\xe4\x0a\xbe\x6a\x32\xd3\x30\x09\x3c\x04\x57\xbc\xa7\xf0\x11\x07\xee\xea\x92\x24\xf6\xa5\x83\xfb\x2d\xdd\x02\x3c\xfd\xd4\x25\x4a\x24\x9d\xe4\x70\xfb\xec\x0d\x9c\x12\xed\x50\xae\x02\x2b\x1f\x7f\x2c\xde\x01\xf1\xf9\x46\x7a\x75\x38\x4c\xc4\x04\xef\xeb\xe3\xea\xe9\x70\xbf\x5d\x2e\xff\xb9\x3c\x38\x05\x14\x77\x81\x42\x32\xe7\x83\xbf\xe9\x9c\xb3\x2b\xeb\x44\x31\xd9\x15\xa0\xa1\x14\x92\xc6\x3d\x0f\x8c\xd9\xe9\x04\xa6\x13\x29\x5f\xdd\x89\x15\x89\x30\x40\xda\x9d\xb2\xb4\x76\xe5\xcb\xe9\xd3\x29\xa1\x05\x1d\xd8\x31\xf4\xf4\x53\x69\x08\xa1\x1f\x0b\xc7\x2e\x7c\x69\x36\xc2\x26\xef\x7b\x80\x17\x2e\x2f\x5b\x38\x9d\x4d\x6c\x3b\xd2\x38\xa5\x21\x24\xc2\x95\x25\x3a\xe4\x70\x7b\x4c\x62\x75\x60\xcb\x55\x3a\xf8\x3b\x37\xce\x44\x08\x21\x1e\xee\x2f\xa1\x26\x7e\x60\x82\x97\x63\x9a\x1b\x2d\xbb\xe1\xfd\xd3\xd2\x78\x6b\xed\x56\x8f\xfd\x85\x54\x03\x05\xdd\x3a\x17\xfc\x02\x78\xeb\x97\xf4\x22\x2f\xf1\x13\xab\xdd\x62\x5f\x90\xaf\x56\xb8\xc8\x83\x08\x43\xf7\x0c\x74\xcd\xe8\xf0\x0a\x22\x1f\xb4\xb1\x0e\x30\x2b\xe8\x9c\xe7\x6f\x58\x83\xb3\x87\x03\xcf\xb0\xc3\xb3\xe2\x45\x17\x59\x5a\x0c\x57\x81\x28\x08\x19\xca\x11\x98\xfe\xc6\xe3\xa2\xfd\x58\xcc\xd1\x7d\x6e\xf6\xf4\x78\x7f\xae\xcf\x25\x38\x94\x92\x3b\x2e\x79\x44\x5a\xf6\xe7\xf8\x59\x8d\x02\x45\x22\x03\xed\x45\x76\xd5\x04\xa0\xd9\x0e\x0c\x7d\xaa\x50\x9c\xfa\xb5\x04\xb8\x7b\x70\xa7\x0f\xb9\xb1\x01\x45\x74\xa8\xa3\x3d\xcf\x72\x85\xb3\x68\x5a\x05\xdd\xb2\xeb\x3e\x23\x8d\xe7\x7d\x13\x0e\x3e\x76\x79\x46\x14\x2a\x23\x98\xf0\xbf\x80\x7a\x6c\xe7\xba\x38\xf2\x3a\x95\x8b\x22\xcb\x40\xd6\xad\xd7\x08\x8d\x42\xd0\x88\xa9\x7b\xeb\x3e\x1b\x11\xd3\xf3\x2d\x8b\x7c\x00\x51\xa3\x51\xc4\x7d\xe1\x77\x7c\x1e\x54\x91\xea\x2c\xb5\xfe\x56\x43\x9e\x46\x31\x97\x91\x6a\x5d\x7a\x51\xea\xe9\x39\xcd\xeb\x3f\x46\x1f\x1a\xde\xb2\x98\x2b\x23\x71\x59\xf3\x17\x70\x26\xab\x34\x22\x01\xb1\x24\x8b\xba\xe2\xf7\x67\xf9\x56\x0d\xae\x97\x84\x82\xda\x7c\x63\xb3\x5e\x3f\x18\xab\x8c\x80\xb6\x87\xe3\x48\x76\xd8\x41\xd7\x82\xeb\x0e\x6a\xe7\x6e\x9a\x96\xa0\x5a\xf1\x60\x1a\x11\x1d\x05\xf6\x85\xb3\xfd\x78\x0c\xc2\x86\x37\x99\xfa\x51\xdc\x19\x3e\x99\x2c\xda\x18\x2f\x7c\x5e\x21\xd1\x86\xcb\x44\xc4\x7c\xbf\xd3\x7a\xae\xf6\x06\xd9\x02\xe7\xe3\xc1\x9f\x2e\xb7\x47\x2c\x0c\xd1\xb8\x6b\x53\xbd\x61\x4d\xc3\x5d\x28\xa3\x1c\x03\x3d\x83\xf9\x37\x8e\xfe\x87\xd9\xc2\x49\xdc\xd2\x88\x09\x8d\x17\x29\xd0\xfc\xcc\x2c\x46\xc3\x89\x67\x4a\x60\x3b\xf8\xae\xe4\x2f\x45\xfe\x63\x2a\x48\xbc\xf1\x23\x94\xc4\x87\xfc\x74\x6e\x26\xf7\xeb\xc8\x32\x42\x6b\x78\x94\x52\xa9\xe1\x50\x17\xfd\x96\x3b\x8d\x38\x33\x16\x95\x25\xfc\x2f\xc8\x7a\x01\xa5\x55\x76\x9d\x16\x1e\xa6\x91\x08\x62\xcb\x1d\x45\x79\x5e\x63\x37\xf9\xc8\x6f\xec\x46\x91\x50\xc4\x4c\x5e\x89\x79\x43\x51\x5e\x06\x36\x71\x37\xae\x58\x32\x82\x75\xec\xf9\xd9\xc5\xfe\x91\xd4\x1e\x7e\xaf\x71\x7a\x30\x88\x44\x67\x48\xe2\xc6\x00\x35\x5e\x14\x4d\x0e\xd0\xac\x90\x98\x06\x9b\xf0\x62\x78\x7e\x80\x50\xf4\x20\x8c\x0f\x85\x7c\x7b\x3e\x99\x80\xb3\x03\xce\x8e\xa6\x1c\x74\x82\x55\xbf\x13\x2f\x2b\x98\x17\x45\x36\xc8\x0b\x22\xcd\x8d\xb0\xf9\xb7\xf4\x1d\x66\xf9\x2c\x7f\x81\x6c\xb1\x9b\x0e\xc5\x23\xad\x0c\x86\xab\x82\xfa\x81\x57\xb5\xb1\x28\xda\x42\xe5\xfc\x52\x6d\x53\xd3\x72\x99\x68\xec\xc5\xd4\xa4\x9b\x75\xe1\x48\xab\x34\xf6\x98\x36\x80\xba\x22\xcb\x7a\x32\xd8\x34\xf6\x23\x95\x38\x51\xd6\x6b\xcd\x6a\x1a\xfb\xcc\xa8\x03\x1d\xd6\xc7\x1c\xaa\x2e\x2e\xb4\x87\x03\x96\x68\xd5\x73\x3d\x30\x02\x0b\xa3\x73\x04\xc2\xb8\xaf\xbc\x18\xd3\x07\x00\x65\xf0\xca\xc6\x19\x66\xf0\x6b\xe3\x40\xfb\x58\xf2\x32\xb8\xa8\xd9\x4b\x6b\x68\x40\xe3\x30\xa2\x82\x75\x01\x88\xf9\x18\x8a\xbc\x22\xd6\xc5\x0a\x7f\x0f\x1e\x2d\xe6\x3e\x4a\x05\x76\x6a\xe6\x45\xbf\xce\x1e\x87\x9c\xa1\x62\xe9\x66\xf1\x7d\x96\xb9\xcd\x33\x8e\x78\x84\x7a\x80\xe8\x83\x6f\xa8\x9b\x5f\x58\x68\x5e\x75\x98\x51\x37\xbc\x8b\x09\xe2\x88\x53\x65\xd4\x40\xcf\x15\xec\xa0\xdd\x1a\xe3\x98\x1a\x82\xed\x3f\xf6\xf3\x3f\x6e\x3b\x2b\xd2\x38\xe6\x14\xa5\x19\x5f\x79\x65\xbc\x03\xdc\x09\x08\xe1\xce\xb8\xf0\x31\xcd\xeb\xbb\xf4\xa5\xbf\x93\x4f\xf5\xec\x69\x4c\x68\x4c\x93\x5e\x51\xaf\x2b\x3e\x5d\x53\x9d\x86\x97\x41\xc3\x84\xdb\x52\xdb\x8f\xb3\x2a\xaa\x7d\x61\x44\xd3\xdd\xd5\x50\xb0\xf2\x31\xe7\xaa\x2e\x8e\x03\x1a\x22\x8d\x59\x24\x50\xd8\xe7\xf0\xca\xab\x99\x51\xe3\x48\xb3\xb6\xb1\x4d\x63\xc6\x35\x46\x6e\xaa\x80\x6a\x99\xd7\xe5\xc5\x28\x3b\x0e\xaf\x3d\x89\x7d\x5c\xec\x1f\x8a\x97\xed\x00\xa6\xe7\x8e\x4b\x1f\x09\xdd\xf3\xf3\xa5\x8f\x8b\x9d\xde\xfc\x62\xe1\x1b\x7d\xa4\x17\xa8\x0f\x3a\x2d\xab\x1a\xbf\xec\x8f\x6b\x0d\x58\x1a\x0b\xae\x70\xf3\x3a\x98\x30\x19\x7f\x59\x79\x59\x8d\xbf\x5f\x40\x80\x88\x00\x38\x5a\x87\xb1\xca\x18\xb5\x4d\x8b\x15\xd2\x58\x06\xa1\xe7\xd4\xff\x20\x1d\xbf\x79\x32\x96\xdc\x61\xf0\x31\x87\x46\x99\x9a\xd1\x98\x24\x46\x75\x86\xd5\x62\xdd\x57\x93\x70\xdd\x91\x58\x69\x8d\x1a\x8b\xc7\x22\x6f\x82\x8f\x95\xda\x17\xa8\x13\x8f\xe9\xf4\xf0\x54\xe0\x79\x3e\x77\x3b\x1d\xc6\x39\xf7\x48\x7c\x71\xe0\x59\x1a\x43\x44\x42\xee\xbc\xaa\xde\x8b\xf4\x9a\x14\x77\x63\xa6\x81\x12\xe4\xde\xb6\xa4\x3a\x03\xc9\xaf\xbe\x28\x60\x12\x2f\x34\xba\x8c\x25\x54\xf2\x0c\x53\xb5\x13\xe2\x09\x43\xf7\x3d\xa0\xca\x94\xbd\x4a\xe2\x47\xa1\x31\xe9\xc9\xf8\xa0\xc1\x4d\x7c\xe2\x21\xac\x68\x87\xb6\x67\xa8\x72\x02\x6a\x5b\x9c\x6b\x28\x77\xdb\x9f\x57\x28\x87\xb1\xc9\x3a\x25\xbe\x54\xb8\x34\x95\xa0\xce\x12\xbe\xf3\x5a\xbe\x2e\x8a\x22\x53\xc5\xc7\xad\x1f\x11\x84\x22\xee\x56\xac\xb6\x04\xd2\xdf\x0a\x48\x60\x85\x49\x78\x55\x41\x59\x2f\xff\x75\xe5\xee\x4e\x49\x40\xfb\xce\x02\x07\x61\x72\x9e\x2f\xe7\x9c\x04\x60\x4a\x20\xa9\x2c\x6c\x43\xaa\x03\x00\x51\x12\x68\xe6\x05\xd6\xe5\x68\xc1\x4f\x5b\x63\x62\xeb\x8e\x86\xd4\x37\x3b\xe3\x94\xed\xd0\xe8\x7b\x22\x2f\x36\xf8\x7e\x83\xb7\xae\x8b\xb7\xfc\xb0\x5a\xac\x5d\x32\x4a\x62\x11\xa1\x9b\x08\x3f\xd7\xc5\x0e\xba\xdb\x84\xf6\x6f\x4e\x99\xe0\x0e\x9a\x28\xdb\x79\x0f\xba\x11\x8c\x06\xd6\x08\xe3\x20\xa1\x99\xba\x6c\x8a\x16\x4d\x09\x0d\x68\x90\x74\xc6\x79\x86\xbb\xda\x7b\x62\x98\x1b\x97\x10\xcc\x19\x5a\x8a\xe8\x23\x6e\x66\xe3\xb3\x29\xa3\x81\x7c\xae\x5c\xeb\x18\x3e\x7e\x41\x3a\xbd\x28\x12\xaa\xb5\xb6\xb5\x5d\x34\x42\x1f\x4c\x15\x92\xe7\x27\x37\x75\xc2\x12\x86\xea\x07\x22\x9d\x46\x09\x0f\x12\x30\x92\x84\x06\xf0\xa1\x16\xdf\xef\xdd\xf4\x24\xc0\xa5\x83\xf9\x9f\x2f\xeb\xd3\x20\x11\x25\x89\xf6\x5a\xad\xf5\xfe\x86\x4d\xb8\x27\x10\xde\xf7\x6e\x04\x39\xfa\x0f\x05\xa7\x86\xb5\xad\x4b\x68\xc2\xe3\x05\x2f\xcb\xa2\x1e\xbf\x74\x9c\x45\xa1\x65\xe0\xb5\x55\x15\x22\x3c\x5f\xda\x5b\xf5\x54\xd4\x5b\xc0\xc7\x1c\xd7\x98\xbe\x35\x31\x25\x22\x4e\x30\x52\x5b\x66\x97\xcf\x72\xf7\x5a\xa6\xc7\xd3\x3d\x2f\x8f\xe3\xf4\x8d\x08\x15\x21\x94\xfc\x61\xbd\x7e\x5c\xcd\xda\x67\x49\x28\xa3\xc5\x7c\xe4\x6f\x23\x52\xce\xa8\x1e\x74\xe3\x9d\x90\xa1\x11\xd6\x68\xad\x78\x8c\xf0\xc4\x95\x51\x4e\xf7\x09\xe5\x79\x46\x9b\xe5\xac\xd2\xda\x0a\x52\x0f\xf6\x24\xa2\x7c\xa2\xfa\x7d\x14\x13\x8b\x14\x65\xda\x42\x1d\x88\x0a\x89\x1a\xf9\x1c\xba\xee\x3b\x01\x4f\x39\xa4\xfb\x13\x7c\xd6\x13\xad\x01\x02\x7e\x84\x39\x60\x93\x11\xe1\xf1\x56\x89\x86\x12\x1d\x1a\xaf\xf9\xac\xf8\x58\x14\xc7\x53\x51\xdd\xfa\x21\x9a\x18\xa7\xec\x9e\x4a\xa8\x9f\x7c\xe7\xd5\xeb\xc1\x8e\x6b\xcf\x28\x15\x22\xe6\x5d\x5c\x90\xb5\x15\xe9\xcd\xcc\xe5\x7a\x08\xd0\x69\xb6\xce\xd9\xf6\x07\x9a\x68\x6d\x0f\xfe\xc1\xf3\xfe\x4f\x6a\xc8\x78\x32\xd7\x1e\xd9\x72\xad\xb3\xe9\x06\x27\xf5\xa9\xa1\x3d\xe4\x45\x79\xe4\xd9\xb6\x28\x8e\x8f\x8e\x90\x4b\xb1\x95\xdc\x2d\xb4\x26\xf1\xfa\xb2\x97\x46\x83\x80\xcb\x16\x05\x70\x5a\xeb\xfe\x4b\x42\x03\x99\xe0\x4b\x52\x35\xab\xe2\x39\x43\xc5\xd5\x61\x25\x2e\x9a\x56\x90\xb7\x9f\x0f\x83\x18\x15\xd1\xd2\x6a\x65\xb6\xd2\x2b\x82\x36\xa5\x61\xc4\x10\x00\x85\x0e\x18\x6b\xad\xd1\x9a\x10\xe4\xb9\x86\x47\xfe\xd9\x55\x05\x68\x18\x09\xec\x70\xce\x9f\xe6\xbf\x15\xd5\xa3\x34\x14\x01\x36\xf4\x0f\xdf\xb9\x7c\x4d\xcb\xe2\xed\x3c\xf8\x61\x91\xf4\x31\xda\xdf\xbd\xa6\x90\xa9\xc5\xb9\x1c\xc0\x01\x68\x4c\x22\x6c\x57\xfc\xf3\x92\x65\x69\xf7\x47\xe3\x85\x92\xf6\xcc\x78\xa7\xe7\x94\xf8\x31\x6f\xed\x9d\xee\x78\x0d\x9d\x74\x31\xa5\x24\xf2\x63\xdd\x22\xeb\xfa\xc6\xa4\x53\x84\x0c\x4a\x09\x37\x37\xa8\x55\x24\x99\x2c\xe0\xd3\x26\xb3\x46\x1c\xd4\xa9\xc8\xab\xa2\xec\x17\xf1\x28\x65\xb1\x74\x25\xc3\x55\x9e\xd6\xdc\x19\x77\x3d\x57\x69\xfe\xe2\x64\xa9\x47\x9d\x09\x4a\x13\xf0\x8d\x3e\xfc\xae\x2e\x4e\xed\x5f\x79\x88\xf8\x82\xe5\x5f\xdf\x07\x53\x46\x39\x47\x5a\x04\x36\xab\x0e\x90\xab\x6f\x66\x61\x75\xc7\x19\xf3\xb1\x99\xf5\x0d\xea\x45\x5a\x5f\x76\x43\x4c\x15\x65\xdc\x47\x51\x30\x23\xf9\xea\x2a\xbf\x5f\xa7\xe8\x34\xf1\x13\x61\xa6\xe6\x7f\xcf\xd5\x2d\x20\x21\x4d\x02\x1d\x34\xa3\x36\x70\x14\x69\x93\xf5\xb4\x4e\x86\x94\x26\x89\x42\xf1\xb4\xfd\x51\x46\x7f\xe3\xa9\x4a\x94\x34\xc6\x98\x90\x2b\xe3\x34\x8e\x2a\x3c\x03\x83\x41\x9c\x37\x23\xd7\x88\x41\xb2\x2d\x99\x2f\x78\xcf\x55\xe4\x3f\x5c\x19\x78\x6c\x1c\x01\xd0\x41\x79\x7a\x2a\x38\xd3\xbe\x2d\x2f\x1a\x8c\xc2\xdf\x11\x56\xa6\x94\x8b\x50\x3a\x85\x9a\x7e\x81\x83\x72\xcd\xb0\x76\xee\x5c\xa1\xaa\x8a\xbf\x8c\x4d\x0d\xec\x0c\x4d\xe6\x57\x54\x78\x31\x96\x71\x8e\xfc\xb3\xbd\x9b\xf6\x90\x54\x12\x21\x6f\x0e\x93\x67\x55\x9d\xd7\x27\x63\x61\xe6\xf6\x0b\xaa\x02\x19\xb5\xda\x43\x06\x6a\xd2\x1d\x23\x01\xb5\x0c\x5a\xdc\x01\xad\x4b\x93\xfe\x9a\xe6\xd3\xfd\x70\x95\x18\x7b\x1b\x93\xc8\x18\x85\xdc\xe1\x08\xf0\x12\xb0\xa0\x9c\x6f\xfc\x08\x96\xc9\x34\x3e\xeb\x8d\xfb\xf7\xf5\x97\x83\x32\x6d\x55\x0d\x4d\xe8\x8c\xe0\xd9\x0c\x14\xfe\x8e\x26\xd9\xd8\xf0\x4b\xf7\x30\x81\xe2\x98\xa7\xd6\x9f\x0f\xc5\xcb\xe8\x12\xb5\x1f\xa0\x8d\xdc\x55\x95\x91\xea\xd0\xe8\xaf\xb4\x3b\xbc\x51\xc8\xdb\x35\x5b\x67\xfa\x09\xd9\xc4\xfe\x4a\x35\x35\xb7\x45\x40\x8d\x22\x22\xc0\x8f\x87\xa0\x3d\x61\x02\x58\xc7\x29\xb4\xce\xd2\x1c\xb0\x96\x74\x63\x8f\xa5\x5a\x27\x88\x2d\x72\x68\x58\x3e\x32\xc6\xa2\xcc\xf7\x58\x6c\xe3\xa4\x4d\xc6\x2f\x3b\x18\xf7\xf6\x98\xcf\x43\x0a\x6e\x95\xfc\x2a\xb7\x60\xbe\x0c\x51\xbd\x42\x58\xc1\x86\xca\x7a\x0a\x4d\xa0\xb1\x59\x20\x13\x6c\x07\x9c\x73\x8d\x9a\x44\x4d\x0e\xd8\xad\x51\x2c\x00\x1f\x69\x51\x58\x10\x7d\x2c\x5a\x80\x16\x0b\x63\x63\xf5\x55\xa1\x92\x6f\x0d\x41\x13\x15\xe0\xaa\x38\x39\x03\x2c\x14\xc6\x87\x6d\x99\xbe\xbc\xd6\xaf\xcd\xc2\x9a\xe6\xcd\x4c\x14\x32\xe5\x99\x11\x88\x44\x91\xe3\xbf\x27\x11\x4b\x59\xe4\x47\x48\x80\x77\x89\xe3\x3f\xf7\x7f\xb6\x2d\xaa\xe9\x80\x9c\x45\x24\x41\x13\x2a\x94\x42\x5e\xeb\xa1\xbd\x13\x65\x11\x8b\xb1\x9c\xf5\x04\xef\x5c\xf1\x79\xc6\xe5\x1b\xca\x56\x8c\x4e\xc2\x35\xf2\x4c\x6c\x5b\x7f\x20\x96\x3b\x41\x55\x18\xcd\x42\xa4\x63\x66\xbc\x35\xad\x44\xed\x77\x5e\xaa\x01\x03\x83\x32\xea\x03\xe2\x73\x8c\xaa\xe1\xd9\x79\x5c\x50\x46\xb9\xc9\x95\x2b\xa8\x9f\x9b\x73\xff\x31\xf6\xfc\xb1\xe3\x58\xa8\x7c\xed\xd2\x75\x7c\xac\x51\x4c\xf1\x94\xa5\x30\x0a\xd9\x19\xe3\x0c\x03\xac\xef\xeb\xe7\xbf\x31\xe7\x4c\x86\x28\xde\xf5\x7d\x2a\x35\x64\x4c\xc5\x18\x85\xd9\x5a\xa8\xa9\x72\x74\x82\x32\x23\x92\x0c\x65\x89\x6f\x60\x80\xda\x72\xdc\x1c\xcc\x68\x34\xe1\x89\x4e\x8c\xca\xa4\x9b\xb2\x1e\x39\xda\x0e\xe1\xc2\x24\x9a\xae\x61\x77\x7f\x6e\xf6\xa2\xea\x5c\xf6\x7a\x69\x8c\x6b\x25\x6d\x45\xc5\xaa\xb2\x1d\xfb\x09\xe3\xe8\x59\x11\x42\x21\x5a\x45\x43\xcf\xd4\x9b\x32\x21\x03\xdc\x1c\x0f\x86\x25\x0c\xf5\xee\x2d\xcd\xa6\xb1\x59\xec\xeb\x1d\x8c\xc9\x58\x20\x3a\xe9\x61\xbd\xf8\xb1\xbc\x3b\x04\x7f\x1d\xee\x3a\xf6\x02\x93\x3c\xc4\xd4\xbf\xd9\x85\x76\x67\x71\xe3\x45\x97\x22\xc6\xbe\x2b\xd6\xa8\x9a\x19\x71\x6b\x24\x53\xb1\xc4\x98\x64\xb6\x5b\xf4\xaa\x9a\x4c\x11\xa3\xc7\xeb\x66\x6a\xb9\xff\x7e\x63\x02\x14\x31\xd2\xc4\xab\xc5\xda\x60\x7f\x5b\x73\x39\xca\x14\x17\xc2\xc9\x90\x1e\x74\x71\x2e\x91\xbf\xbd\xfc\xd7\xdc\x6c\x77\x6e\x98\x26\x86\x30\x61\xb8\x10\xce\x46\x1a\x17\x9f\xd8\x0d\x61\x49\xd8\x99\x8b\x6f\xca\xe2\x58\xfc\xb8\xa8\xcb\x74\xb9\x3b\xf1\x02\xe2\x84\x8b\x8c\xee\x15\xa6\x2b\xfb\xd7\x12\x2a\x8c\x03\x06\x93\x93\x78\x31\x67\x26\xf0\x97\xc5\x3b\x94\x97\x56\xc1\x87\x26\x1e\x65\x08\x91\x41\x1a\x59\xf5\x1d\x5a\xea\x49\xe2\xfb\x1a\x6b\x12\x8f\x97\x66\x87\xeb\x6f\x20\x89\x1f\x48\x0c\x9a\x30\x84\xdd\x94\xb0\x5a\xac\x7b\x0f\x61\x12\x10\x4f\x98\xfe\x07\xb6\x04\x47\xed\xda\x24\x24\xc6\x6c\xf0\x1b\xd4\x73\x5e\xc1\xd3\xdf\x43\xe5\x24\x21\xf5\x23\x8c\xe7\x8c\x81\x95\xd5\xca\xbc\x83\x53\x09\x43\x64\x47\xaf\xac\x9c\x84\x20\x74\xe4\x1e\xf5\x22\x03\x9e\x3f\xf2\x93\x09\x7f\x47\xc4\xb8\xe1\xfc\xc6\x1e\x35\x44\xe7\xa2\x38\xde\x17\xe5\x3c\xed\x2a\x7c\x49\xcc\x09\x22\xfc\xe7\xab\xfd\xaf\x57\x9e\xc1\x40\xca\xa4\x39\xcc\x85\x0d\xe1\x9f\xe0\xe3\x86\x23\x35\x4d\xa8\x2f\x51\x74\x72\xff\x01\x79\x7d\x59\xe7\xf0\x98\x66\xd9\x15\xf5\x6b\x38\x05\x4d\x22\x1d\x3b\x01\x7f\x85\xf1\xf9\xe8\x4e\x53\x1d\xe3\x82\xb7\x7c\xd8\x0f\x4f\xf4\x1f\xd1\xae\xec\xc9\x58\x1c\xe2\x6d\x36\x55\xab\x7d\xb1\xe7\x23\x3a\x48\xc2\xb8\xef\x19\x5d\xe5\xa7\x73\x96\x4d\xa6\xa4\x09\x53\x1a\xa3\xc8\x2d\x18\x86\xe6\x00\x84\x94\x30\x20\xa8\xb9\xdc\xb1\x9d\x1f\x16\xbf\x36\xd7\x6b\xa5\x1d\x9e\x78\x04\xa3\xe7\xdd\xd1\x78\xe3\xda\x20\x1b\xe9\xd6\x53\x48\x1c\xf7\xb1\x80\x63\x4d\xe3\x3d\xcd\x32\x9e\xe6\xa8\xe4\xed\xe2\xf2\xd1\x17\x44\x02\x25\xfd\xad\x44\xeb\x09\xf2\x09\x03\x74\x9a\x24\x14\xb0\xdb\x55\xd5\x3d\x4d\x88\xbb\xb4\xe2\x59\x56\x7c\xf4\x8d\x70\x69\xc2\x63\xf0\x79\x67\xcf\xdb\xac\xdb\x07\x5e\x8a\xb4\xae\x0e\xd5\xcd\x90\x3d\xe1\xda\x8f\x54\x0b\x75\xb4\x15\xbd\xfe\x16\x94\x88\x28\x51\xe0\x46\xf4\x5a\xee\xc7\xeb\xe2\x5f\x22\x88\x46\x34\x3f\xba\x51\x61\x20\xec\x0e\x48\x12\xf6\x8d\x3f\xe7\xa9\x6a\x62\xcc\xf3\xb8\x86\x9e\x08\x2d\xb0\xe2\xb1\x79\x7e\xdc\x7c\x5f\xb7\x18\x80\x44\x06\x11\x02\xa2\x9a\x24\xb6\xa2\xed\x5f\x29\xc7\xd3\xe2\x6e\xdb\xe2\xd4\x46\x17\x25\xb9\xa9\x48\xae\x64\x31\x56\x91\xfe\x5b\x12\x45\x34\x91\x9a\x05\x51\x6b\xef\x88\x26\xaa\x4d\xaa\xdc\x4e\xbd\x22\x0a\xeb\x87\xdf\x9f\xf7\x61\x74\xf8\x35\x7b\x78\x58\xba\xea\x4c\x02\x9e\x46\xd1\x38\xab\xe5\xb8\x85\xea\x7c\xec\x3e\x09\x7e\x92\x74\xc4\x21\x09\xa0\xaa\xc9\xb2\x6a\x02\x8c\xa1\xc2\x10\x7c\xa6\x55\x5d\x4d\x99\x82\xd1\x44\xfb\x09\xa6\x23\x75\x79\x59\xe5\x15\x94\xf5\x0e\xfe\x75\x86\x5c\xc2\xb8\x37\xc2\xbd\xc4\x70\x55\x9b\x00\xf4\xb1\xc8\xdb\x65\x9a\x7b\x3c\xc4\xe0\x73\x77\x02\x50\x0b\x6e\x85\x83\x46\x49\x39\xf7\x65\x20\x55\x47\x34\xbf\x6f\xf6\xc2\x56\x50\x82\x72\x5f\x19\x95\xaa\x03\x1c\xd3\xda\xf0\xfc\xd6\x1d\x76\xd3\xc1\xee\xaf\x14\x01\x28\x0f\x18\xb3\xbe\x91\x15\xb4\xf8\x64\xb7\x9e\xf3\xd0\x37\xd1\xce\xe2\xfb\xfd\x61\x7d\xcc\x53\x55\x64\x99\x73\x89\xa6\x3c\x0c\x23\xdc\xbe\xeb\xf6\x26\xdf\xa5\x57\x72\x9f\xc3\xfb\xca\xa3\xc0\x08\xfa\x55\x92\xe7\xeb\x73\x7d\x3a\xd7\xd5\x34\x62\xc3\x8d\x0f\x03\xad\x3b\xf7\x55\xa8\xf6\x85\x53\x79\x1c\xad\x46\x3c\x0e\x03\xdf\x52\xc5\x76\x1f\xfc\x34\xb9\xda\xde\xfc\xb7\x37\x25\x71\x4c\x03\x0b\x6e\x3b\x7c\xa4\xf9\x41\x16\xa0\xdb\x19\x21\x01\x65\xd0\xf5\x60\x5f\x60\xfc\xd8\x70\x12\x24\xbc\x65\x6f\xbf\x1a\xca\xe5\x70\x1f\xe1\x04\x34\xa2\x73\x66\xe7\x66\xea\x86\x1d\xe5\xe6\xcd\x09\x6d\x47\x79\xb1\xf8\x6e\x70\x22\x71\x7b\x30\xd6\x58\x9c\xaf\xa0\x4c\xa1\x9a\x0d\x00\xbf\x9c\x32\x0f\xbb\xb9\x46\x9e\x61\x78\x52\xa9\x85\x23\x92\xed\x5f\x61\x5f\x94\xf2\xf5\xf0\xa5\xc8\x07\xe5\x4c\x12\x7c\x30\x9b\x47\xca\x24\xca\xd3\xfb\xea\xd5\x5c\x4e\x54\xf0\x79\x12\x7b\xcc\xe6\xed\xf3\xd9\xf3\x74\x2d\x8b\x27\xd4\x33\xa2\xc3\x9d\xf8\xe4\xac\x7c\xa9\xfe\x82\xea\x66\x6f\x76\x7a\x7f\xe3\x09\x4b\x70\x67\x3a\x1c\x5e\xa0\x16\xc3\xd9\x4f\x92\x90\x73\x27\x5e\x30\x7e\x88\xb8\x95\x4a\x45\x0f\x46\xf9\x9c\x0f\xbc\x7e\x87\x8f\x26\xe7\x34\x94\x4e\xaa\x86\x57\x60\xc0\x51\xa3\xd7\x9e\x8b\x90\x04\xad\x58\xfd\xf8\xcb\xc0\x68\x6f\x54\xe8\x11\x87\xc1\x8e\x33\x3f\xba\xba\x37\xbd\x07\x54\x44\x94\x91\x2e\x08\xeb\x3b\x1d\x50\x2e\x62\xc1\xfb\xc1\xef\x21\xd5\x07\xcd\xd3\x6e\xe9\xe4\x22\x01\xec\xa6\x59\x6a\x3c\x76\xc7\x7a\x31\x1e\x17\x9c\xea\xa4\x0b\x29\x77\xc6\x7e\x78\xf0\x5a\xdb\x91\x32\x34\xe6\xca\x87\xd3\xb8\x6e\x77\x36\xf2\x4f\xc3\x9f\x2b\x43\x81\xe5\x8f\xc5\xf7\x3f\x07\x0f\xa7\x0c\x4d\x75\x2d\x2f\x1e\x8b\x12\x9e\xe0\xb3\xc6\xcd\xcc\x86\x81\xbd\xae\x0e\x97\x11\x47\x58\x4b\x5a\xe1\x08\xcb\x4c\x1e\xce\xb8\x14\x06\xad\x82\x5a\xca\x03\x4e\x5b\xbf\x70\xdd\x72\xe9\x9b\x0f\x24\xb8\x1f\x77\x48\xc8\xfb\xb2\x38\x7e\x5d\x40\xe3\xca\x97\xa6\x04\x99\xd5\x50\xba\x75\xb3\xad\x58\x0c\xc7\x42\x14\x59\x4f\x79\xf4\x35\xb9\x07\x18\x51\x32\x39\x88\x08\x1f\xfc\xd5\x7d\x0b\x61\xe4\x20\x28\xb7\xfb\xd4\x1e\xf8\x71\xde\xfa\xa9\x99\xbc\x6b\x38\xb5\x00\x12\x5b\x2c\xb3\xba\xe4\x83\xb9\xd5\x61\x84\xda\x4d\x08\x26\xc7\xe9\x9a\x77\xd5\x34\xae\xa9\x41\x94\xbc\x40\xfd\x33\xad\xb8\x09\x30\x36\x3c\xbd\x29\xab\xe9\x3e\x97\x18\x9b\xa7\xc3\xb9\x82\xd2\x42\x11\xa6\x17\x11\x2d\x22\xeb\x4f\x8e\xdd\xcd\x43\x37\xc9\xd3\x6f\x95\xf0\x22\x03\x49\x31\x54\xcc\xd5\x62\x1d\x1c\x1e\x56\x8f\x2d\xcc\x4e\x78\xcc\xb7\xc8\x4e\x53\x00\xbc\x03\x9e\x35\x4f\x2f\xaa\x83\xbc\x77\x2f\x8e\x1b\x9e\x18\x8f\x95\x36\x8e\x98\xbd\x94\x80\x88\xe5\xf6\x84\xdc\x78\x6a\xdd\xa7\xff\xfe\xb7\x5b\x4a\x85\xef\x99\x7d\xdd\x2e\xf3\x38\x2f\xf7\x9d\x88\xde\x97\x0b\xa7\xf0\x63\x4f\xb6\x48\x82\x31\x4e\xca\x8d\x11\x81\x68\x39\x5d\xb9\xda\xd5\xbc\xae\x1e\x5b\x76\xb8\xf0\xb5\xf6\xd5\x10\xc9\x3d\x07\xde\xde\x38\x11\x50\x89\xad\x5c\xe5\xcc\xe3\x46\x15\xda\x9b\x05\x09\x11\xe8\x18\x0b\x2f\xf9\xf9\x68\xd4\xcb\xda\x73\x86\xbe\x4f\xa0\x95\x00\x69\x9e\x82\xb1\x6b\x15\x15\x61\x04\xd6\x04\x95\xab\x26\xeb\x6a\x41\xed\xed\xf9\x43\x2e\x30\x5b\x9f\x43\xab\x19\x8f\x6f\xf0\xef\x12\x93\x89\x9d\x58\x84\xc2\x44\xa0\xa9\x83\xcc\x58\xd0\x46\x64\xfb\xa9\x22\x52\x0a\xfb\xc2\xb6\xe2\x68\xad\xaf\x46\x4a\xf4\x54\xc4\x7e\x14\x05\x2d\x58\x36\x3d\x9e\x8f\xbf\xf8\x48\xe4\x8b\x0a\xe2\x4b\xd4\xde\x7b\x49\xdf\x3b\x1c\xf8\x74\x8e\x2e\x08\x13\xc4\x6b\xd1\x9a\xf7\x25\xc0\xb7\x81\xf5\x0b\x15\x44\x6a\xfc\xca\x54\x16\x1b\x5e\xf2\x23\xd4\x50\x56\xbb\xb6\xce\x2e\x68\x68\xc0\xd0\xcd\x25\x15\xf2\xed\xd9\x36\x21\xfb\xd8\x8b\x68\xf4\x66\xd0\xc8\x03\x0b\x5a\xee\xab\x94\x5b\x99\x7f\xfb\x4f\x4b\xd7\x14\xcc\xa7\x08\x62\x10\xf0\x92\x1a\xe9\xd1\xfe\x4c\x5b\x09\x10\x2a\x12\x65\x90\x82\x27\x5e\x99\x24\x06\xf2\xfa\xa0\x11\x72\xec\xae\x95\x47\x81\xb0\x24\xc9\xaa\x38\x42\x7d\x3b\x8d\x15\x9c\x25\xd2\xc6\x60\x73\xa8\x9f\xf3\xab\x59\x16\x9e\x02\xcf\x96\x7c\xae\x80\x0a\xbd\x61\x01\x47\xa8\x49\x0e\x1f\xef\x3d\x2a\xdc\xf0\x2e\x28\x16\x78\x46\x4e\xeb\x7d\xd2\x8b\xd7\x0d\x93\x54\xb2\x6b\x5b\xcc\xde\xbe\x22\x94\x4c\xa4\xbd\x1b\x58\xde\x19\xe5\xd6\x76\x14\x48\x0f\x03\x22\xe3\x78\xb8\xf8\xe7\xf6\xc6\x24\x68\xc5\x90\x28\x8b\x1a\x32\x19\xaf\xaa\x47\x90\xaf\x58\x99\xf0\x93\xd1\xef\xd4\x3a\xa1\xcd\xfb\x24\xca\x82\x2b\xc9\xab\xfa\xef\xf5\x6f\xa4\x17\x90\xc0\xec\xe1\x47\xcb\x6f\x18\x50\x72\xa5\x47\x14\x3a\xdb\x28\x10\x1d\xc2\xf0\x7a\x35\x90\x1e\x53\xb8\x3c\x1a\xe5\xeb\x29\xa2\xa4\xf4\xfd\x00\x1b\xfc\x68\xc2\x73\x25\x52\x22\x83\xd8\x88\x6e\xc9\xe2\x7c\xba\xc5\xb2\x90\x01\x4f\x06\x64\x83\xfb\xe2\xf3\x86\x00\x89\x0c\xa5\x44\xb4\xa0\xe0\x23\x26\xb4\x8c\xfc\x48\xe9\xbe\xb3\xf7\x54\xd6\x26\x63\xb0\x8a\x94\xaf\xc5\xc7\x63\x13\xeb\x9a\x64\x6b\xfa\xcb\x88\xe7\xe1\x92\xb7\x33\xf4\xef\x7f\xdc\xcd\x46\xbf\x8e\x40\x80\xb1\xc1\x6c\xfb\xb8\xde\xba\xc9\x65\x3a\x44\x0d\xa8\xae\xb0\x31\x84\x47\xda\x79\xf6\xbb\x69\x4e\x3c\x86\xbd\x5f\x5d\x16\x47\x7c\xc0\x12\x72\xd3\x2b\xb6\x17\xcc\xc9\xc4\xf7\xcd\xdc\xe7\x69\xfd\xc8\xaf\xac\x5c\xa9\x4c\xc2\x30\x71\x16\xb1\x87\x14\x33\xd0\x03\xaf\x5b\x36\xbf\x1d\x25\x02\xe9\xdb\xcd\x66\x77\xe2\x12\x9a\x95\xcd\x7a\x74\x63\x01\x7b\x7e\x79\x2c\x14\x98\xad\xd3\xc1\x68\xa5\x50\x5a\x26\xfd\x60\x5c\x18\xe4\x41\xc7\x54\xbf\x16\x08\x1a\x4e\x9e\x0c\x3d\xea\xf5\xb6\xea\xfb\x34\xcb\x26\x05\xc8\xa8\x94\xca\xa3\xc2\x78\x04\xa4\xe7\xa3\xbb\x6e\xe5\x33\x2c\x23\xc8\xe2\x74\x59\xe6\x75\x5a\xc2\xb7\xac\xd0\xe9\x98\x09\x27\x15\x0f\x23\x27\x97\xc8\xcb\x97\xbe\x66\x16\x95\x4a\x0a\x6d\x7b\x28\x69\xbe\xfc\xd7\x39\x3d\x1d\x7b\x4d\xbf\xe9\x00\x47\x42\xc8\x23\xe1\x44\x63\xd2\xba\x5a\xe5\x76\xbe\x26\x98\x44\xe3\x8f\x32\x19\xd9\x06\xc6\x3d\xaf\x5e\xd3\x22\xdf\x9d\xd3\xba\x53\x8d\xf0\xaf\x3e\x20\x42\xdf\x4e\x93\xed\x39\xac\xf2\x4e\x44\xb5\x1d\xa7\xbc\xc0\x28\x1a\xdf\xf1\xa2\x23\x8f\x0f\x26\x42\x79\xc2\x73\xe6\x7e\x4d\x96\xec\x84\x02\x87\x83\x7c\x3f\x66\x9d\x44\xb8\x73\xa8\xbc\x83\x32\x7d\xe7\x18\x4f\xbb\x71\x71\x02\x9d\xc1\x58\xbb\x30\x0d\x2f\x2a\x0c\x38\xda\x26\x71\x5d\x43\xd9\x7a\x12\x0e\xcb\xc2\x2a\x0c\x25\x6a\x81\x8a\x73\x99\x3f\x15\x35\x32\x02\xa7\x96\x7d\x15\xc6\x3e\xee\x34\x07\x65\x60\x9a\x46\x4e\xf6\x6a\xc2\x87\xbf\x27\x24\x01\x52\xdc\xfb\x96\xc8\x8f\x00\xf5\xd9\x96\x00\x26\xd2\x51\x15\x4a\x82\xdc\x58\x2c\x7f\xee\x6a\x38\x31\x77\xad\x51\x10\xe3\xe2\x2d\x79\x3e\x87\xdf\x69\x69\xa8\x88\x72\x8b\xd2\x1c\xac\x49\xdc\xa9\x46\x8d\x2e\x35\x92\x1a\x1b\x2e\x69\x9e\xd6\x29\x37\xc0\x34\x9b\xc3\xdf\x38\xbf\x36\xcd\xa8\x13\x86\x6a\xeb\x1c\x8c\x26\xd9\x10\x83\xa5\xe2\xd8\x47\x9d\x85\xfd\x72\xe1\xdc\x14\x9e\x9e\x1f\x1d\xb3\x42\xc5\x92\x70\xeb\xee\xe6\xba\x70\xfd\x47\xd7\x85\x02\x2a\xd6\x2c\x70\x92\xad\x9b\xf5\xae\x2f\x94\x4a\x15\xf1\x4d\xc4\x89\x54\x19\x05\x70\x34\xa5\xf6\xe1\xe5\x92\x50\x1b\xb1\xfc\x3c\xad\x07\xb5\x09\x45\x98\xa4\xb4\x53\x3f\x18\xfe\x68\x37\x46\x02\x06\xdd\xb2\x38\x9e\x78\x6e\xbb\xba\x2b\x33\x55\xed\x79\x14\x47\xf9\x40\xf8\x3c\x95\xc5\xa9\x4c\xc7\xae\xdd\x54\xd1\x88\x63\x8b\x42\xf1\x9a\xef\xd0\xcf\x7e\x61\x7b\x6f\x4d\x1a\xb5\x1a\x46\x09\xcc\x7d\x48\x07\x00\x4e\xdc\xb3\x17\xc7\x29\xe6\x47\xb2\x6f\x9b\xb3\x80\x62\x74\xd5\x8c\x49\x94\x03\xae\xce\xe2\xb7\x55\x0a\xf7\x11\x4e\x21\x19\xab\x8e\x7c\x2f\xce\x65\x76\xd9\xf6\x6d\x5f\x87\x5f\xc4\xb9\x17\x85\x7d\x72\xfe\xe0\x09\xbb\x8e\xa3\xbb\x44\x5d\x09\x8f\xe3\xf2\x5a\x15\x52\x42\xf9\xcd\xd5\x88\x95\xa0\xa0\x84\x75\x7c\x6d\x59\xe6\xed\xc1\x84\x9b\x9d\x1d\xe3\xa6\x2b\xd2\xe6\xe8\xea\x84\x96\xb1\x45\x62\x0f\x4b\xb5\x4a\x46\x1c\xd1\x0a\x7c\x68\x37\xd5\x1e\x95\x58\xbf\x06\x5e\x66\x97\x79\x5a\xaa\x47\xfe\xb9\x81\x72\x03\x65\xd5\x6e\x60\x4a\x36\xfb\x91\x01\xd1\x36\x17\xf1\x6f\x50\xe8\x01\xee\x2a\x91\x4a\x25\xcc\x69\x7c\x59\xb7\x3f\x0c\x08\x9b\x1b\xbe\x28\xda\x47\x58\x81\xc0\x67\x10\x69\x17\xae\xaf\x3b\x7d\x87\x40\x09\xcf\xd8\x20\x95\xfb\xc2\x75\xfc\x06\x2b\x88\x0e\x7c\x47\xbc\x32\xd7\xca\x67\xb5\x8d\x06\x46\x35\x25\xa5\x63\x2f\x30\x95\xf8\x66\x17\x11\x0e\xf9\x3f\x1e\x44\x11\x8d\x5f\x75\x22\x27\xee\xba\x35\xe3\x46\x8a\xdc\x5a\x10\x9e\x7a\x6c\xf2\xc1\x49\xc0\xf7\x2c\x68\xc4\x39\x40\x23\x10\xf0\xcb\xe5\x13\xfc\x40\xa0\x72\x55\xc6\x2b\x33\x6b\x76\x8d\xa8\x6a\x7e\x74\xf9\x28\xf8\x34\x8e\xac\xce\xe9\x7b\x5a\x9c\x91\xa2\x70\xd5\x68\x07\x9f\x71\x1d\xf6\xbb\xd8\x0f\x1d\x96\x02\x7c\x45\x50\xf0\x77\xb3\x5d\xa2\xc2\xec\x7c\xb6\x5b\x1e\x36\xdb\xd5\x62\x79\x58\x3d\x1d\x7e\x2d\x57\xed\x40\x30\x20\xd9\xd5\xc3\xbd\xe3\xce\x3b\x99\xa2\x1f\x60\xa4\x6f\xdc\x48\x1d\x61\xab\xd4\x54\x21\x4c\x0f\xca\x1d\x0b\x3d\x2d\x6d\x6d\x6d\x63\x74\x21\x06\x0b\xd6\x68\x12\xa2\xc0\x0b\x5a\x4f\x49\x71\xbe\xdc\x68\xb7\x42\xc4\x22\x63\x30\x68\x58\xcf\x60\x75\xdb\x0c\x93\x6e\x74\xea\xff\xfe\x9f\xee\xbf\xdc\xc7\x65\x80\x17\xec\xee\xcf\xa6\x04\x9d\x7e\xfe\x31\xc5\x7a\x81\x48\x2b\x04\xb0\x23\x6d\xa6\x05\xe4\x40\xa4\x81\xd3\xb6\x2b\x61\xd6\x00\xbb\x8a\x41\xac\x7c\xd4\x22\xa8\x5f\xd3\x52\x3d\x14\xed\x93\x0f\x24\x8a\xf1\xc6\xa4\x95\x5b\x0b\xd1\xad\x7d\xf8\x85\x44\x52\x27\x33\xf3\x0b\xe0\x2d\xbb\x8c\xdb\x01\x40\x14\x47\x94\xc2\xc1\xd5\xb8\xdc\x17\xb3\xd8\xd7\x9d\xb0\xfb\xfa\x64\xdb\x0e\x6d\x72\xf2\xb5\xf6\x22\x30\x11\x21\x2a\x13\x54\x97\x2f\xde\x22\xdc\x4f\xfe\xf3\x7f\xf8\x8c\xfb\x6a\x88\x03\xcf\x75\xfb\xf6\xc5\x23\xcf\x2f\x1d\x09\x7f\x9c\x2e\x41\x12\x50\x74\xa6\x51\xe9\x4b\x5a\xf3\xac\xb3\x8a\x75\xc7\x63\xcf\xa1\xe1\x1f\xf9\xe7\x2a\x7f\xb7\x14\xd9\xf1\x8b\x92\x70\xcf\x58\xfc\xda\xd7\xb8\xe7\x8e\x44\x21\x11\x80\x15\x2e\xb7\xe5\xa0\xa8\xf3\xf4\xc4\xf1\xc8\x6b\x7b\x05\x69\x7d\xd9\x42\x85\x1b\xde\xf8\xeb\x38\x01\x6c\x2e\xe3\xc3\x62\xd7\x33\x6a\xe5\x22\xff\x9b\xba\x1f\x27\x3c\xe0\xae\x70\x6a\x97\xea\xdb\xb5\x19\x10\xbe\x81\xa8\x97\x99\x3c\x88\xbe\x34\x1d\x08\xbf\xaf\xda\x5b\x94\xd5\xae\x2e\xe4\xdb\x95\xff\x10\x05\x01\x1e\x02\xbb\x6d\xdb\xdf\xf6\xbd\x90\x15\xdc\x0f\xb3\x27\x57\x68\x90\x41\x28\x9d\x00\x9e\x75\x29\xbf\xd6\x67\x02\x49\x22\x0c\x88\x1f\x67\x7f\x1e\x7e\xad\xf6\xdf\xef\xb6\xb3\x5f\xce\xa0\x8b\x82\xa4\x01\x96\x3f\x77\xfb\x87\xef\x13\xb1\xe2\x14\xb8\x09\xa4\x32\x72\x3a\xf9\x26\xe3\xcd\x66\x83\xa0\xf7\x65\x0b\x21\x00\xa9\x39\x37\x99\x77\x76\xa3\x3b\x0a\xe0\x45\x06\x60\x9b\xcb\x12\x97\x91\x39\xaf\xde\xa0\xae\x30\xfd\xbe\x92\x5e\x6f\x3f\xc4\xb1\x44\xbc\x6b\x82\xb3\x12\x1c\x27\x3b\x74\xdf\x0b\xdc\xc3\xa5\x05\xd9\xe0\x6d\xbc\x04\xa0\x00\x73\xd5\xfb\xd9\x62\xbf\xde\xb6\x96\xbf\x14\x74\x42\xf1\x77\xb8\x10\x77\xce\xab\x2f\x65\x3e\x40\x6b\x8d\xed\x7c\x8e\x05\xcd\x7d\xe1\x6a\xd8\x6b\x63\x89\x34\x98\x25\xed\x27\x11\xf6\x46\xb6\xeb\x6f\xf6\x0b\x75\x10\x00\x4f\x1c\x9e\xd9\x12\x9c\x6f\xcc\x90\x0e\x58\xe4\xdb\x00\x09\x9d\xda\x6c\x3e\x61\x6c\xba\x47\x43\x45\x84\x44\x8f\xb4\x9a\x43\x2b\x55\xda\x8f\x8e\x75\xa0\x63\x69\x3c\x00\xac\xf6\xff\xc0\x00\x90\xea\xd0\xf3\x51\x7e\xcc\x14\xf3\x7a\x5b\x96\x0e\x85\xb0\xc5\xeb\x63\xf1\x8e\x9b\xd9\xb0\x1f\xa1\x43\x19\x60\xb1\x21\xad\x2c\xda\x77\x28\x07\x4d\x75\xa8\x8c\x07\xf8\xce\xc8\xd4\x18\x15\xe4\x49\x30\x85\x8e\x48\xec\x14\x6d\x9e\xe0\xb3\xb6\x7c\xff\x7f\x38\x3b\xd8\xe1\xe0\x98\x41\x62\x2a\xa3\x0f\xe9\xbf\xce\xcd\xde\xd8\xc1\x19\x75\x9c\x18\xed\x9a\x43\x0e\x9f\x75\x1f\xa1\xac\x89\x47\xb0\x2c\xb4\x7b\x2d\x3e\x9e\x73\xcb\x17\x9a\x0e\x81\x34\x0d\x63\x65\x7a\x2d\x73\x9e\xe7\x63\xa0\xa6\xa6\x22\x72\xbb\xc5\xfc\x77\xfd\x02\xcd\x34\x00\x76\x7e\xd6\xdb\xcd\x30\x37\xd4\x49\xe2\xa1\x7a\xcc\x8f\xa7\xf5\xaf\x87\xe5\xdd\xb7\xe5\x61\xbf\x3e\x7c\x5b\xee\x0f\xfe\xfd\x76\xf6\xf4\xe3\xa1\x6d\x88\x68\x1e\x46\x56\xf1\x33\xcb\xf6\xdc\xc2\x18\x7e\x27\x44\xa6\x85\x47\x51\xc6\xc6\x44\xcd\xe5\xc5\xd2\xac\xee\x0a\x79\x1e\x4b\xb4\x69\x11\x70\xec\xc7\xfd\xd7\xfe\xb9\xfb\x93\x74\x3e\x45\x0b\xcb\xeb\x9c\xd5\x9d\x5d\x7c\xef\x7b\x84\x46\xf9\xf1\x45\x91\xe6\x55\xb3\xe0\x55\x93\x20\xcf\xfe\x2b\xa5\x65\x12\x72\x61\x85\xe8\xe7\x3d\x01\x7c\x77\x58\xc4\x51\xdf\x8b\x0f\x8d\x3c\xa6\x6f\x96\x04\x5f\x58\xd0\xd8\x37\x7e\x04\x94\x59\x99\x8e\x11\xb5\x04\x65\x1d\x61\x0c\x61\xc7\x40\x6d\x40\x7d\x81\x4e\xd2\x4a\xc7\x78\x93\xee\xd7\xcf\x4f\x77\xcb\xed\xce\x65\x99\x3f\x97\xbb\xfd\xf2\xee\xe0\xd8\x3c\x1a\x62\x40\x02\x44\xb3\x85\xa8\x77\xe3\x20\xb9\x9f\xad\x1f\x8a\x97\xe2\x86\xec\x8f\x06\x1a\x60\xcc\x72\xae\xe0\xa9\xb3\x6e\x74\x07\x13\x23\xff\x51\xf5\x7a\xe1\x01\x1d\x8d\x11\x49\x40\x3a\x21\x88\xc9\x90\xd7\x0d\x55\xe6\x67\xe0\x4f\xfd\x13\x15\x75\xdd\x95\xeb\x30\x44\xd8\xfa\x4c\x29\xf4\xa2\x38\x97\x15\xfc\x9e\x98\xa6\x75\x2c\x9c\x44\x60\xf3\x7e\x1f\x9c\x43\x05\xd5\x9a\x28\xdf\x6b\x71\x81\x63\x7f\x53\xb7\x40\x33\xcf\x8b\x38\x56\x72\xad\x32\x71\x5f\x32\x75\x7a\xca\x98\xe7\xc5\x11\x22\x13\x53\x59\x74\x02\xfa\xed\xf9\xb4\xd1\x94\xb4\x9d\x2b\x63\x0b\x3f\xf9\x28\x30\xcf\x4f\x78\xe4\xb7\x3c\x0a\xfb\x62\xfe\x02\x9e\xd5\xaf\x3d\x4f\xf5\x89\x46\xd7\xe8\x82\x7c\xc9\x9d\x91\xb4\x89\x1c\xdb\x75\xd6\x4a\x4e\xf7\x81\x61\xcd\x70\x81\x18\x8a\x4d\x59\x14\x7a\xad\x91\xe9\x0c\x6d\x83\x9e\x79\x41\xd4\x6a\xdb\x0e\xe4\x82\xbf\xac\xd9\x35\x1f\xd3\xbe\xab\x85\xee\x5f\xcb\xe2\xa3\x95\x42\xbd\x4b\xab\x26\x23\x7d\x2a\xea\x41\x6a\xca\xbc\x40\x29\x04\x70\xdd\x9d\xa4\xfb\x53\x48\x4c\x77\x7c\x76\xf7\x73\xb5\x5b\x6f\x77\x3d\x5a\xb1\x1b\x12\xf9\xed\x53\x6e\x19\xe0\xd3\xd3\x12\x31\x1f\xcc\xd6\x34\x43\xdf\x49\xe4\x28\xda\x63\x31\x8d\xf1\xf1\xe0\x4a\x75\x6d\x90\xf9\x90\xbb\x3f\x3a\x5d\x9c\xf8\x3a\x72\x09\x81\xe9\xa9\x8d\x00\x19\xa3\xf1\x8a\x2a\x43\x79\xcb\xd5\xd8\x28\x90\x79\x24\x54\x60\xe4\x4a\x5e\x36\x45\x96\xfd\x2c\xea\x1e\x40\x68\xfa\x84\x84\x04\x28\xda\x70\x9f\x15\x1f\xf2\x95\x0f\x70\x2b\xcc\x4b\xc2\x08\xbb\x23\xa6\xac\x38\x46\x27\x4e\x95\x7d\x99\x97\xf0\xd0\x60\x5d\xb1\x1c\xb4\x69\xf2\xda\xcc\x59\xef\x31\x4f\x78\x31\xce\x5f\xcb\x3a\x37\xa1\x61\x4b\xab\xbc\xc1\x73\x64\x9e\x88\xc3\xd0\x72\x12\xdb\xc6\xa1\x79\x84\x7e\x5d\xb7\x9f\xfb\xc1\x02\xf3\x64\xa0\x03\xbf\xe3\xd2\xde\x17\x25\xa0\x25\xe8\xad\xb5\x91\x79\x52\x7b\x71\xe8\xe4\x60\xa2\xbe\x4a\x33\xf3\x14\x8d\x71\x81\xdf\x02\x57\x9d\x7c\x24\xf3\x94\x8c\x98\x6d\xe5\x4d\x9b\xab\x4d\xff\x2e\x20\x80\x7c\xf9\x3a\x3d\xc2\x03\xe8\x7a\x5f\x2c\x5a\xcb\x49\xe6\x01\x93\xe8\xcf\x65\xf4\x82\x8c\xfc\x60\x9f\xb7\x37\xa8\x7b\x0d\x19\xa3\xbf\xfb\x5e\x08\x12\x8d\x24\xad\x37\xb8\xe3\x57\x54\xe0\x1b\x9f\xd2\x24\x40\x85\x9e\xb7\x54\xbe\x15\x5a\xbb\xcb\xd4\x0c\x62\xe8\xd0\xd0\xfc\x04\xe5\x1f\xd3\x0f\x49\x97\x7e\x5d\x1b\x47\xb9\x93\x09\x0f\xd1\x2e\x5c\x14\x65\x3d\xbf\xcc\xcb\xe2\x0d\xda\xe7\x47\x6b\xe3\x65\x0d\x86\x56\xd8\x42\xef\x07\x77\xdc\xf7\xfc\x00\x37\x05\xbb\xfc\xa1\x40\x6f\x7b\x0e\xdf\x03\x8f\x75\x02\x6c\x87\xa2\x8b\xa6\x98\xef\x7b\x06\x22\x6b\xfe\xfa\x3b\xff\x93\xe1\xec\x34\x1f\x46\x9b\xba\x9f\xcb\x6d\xff\x35\xf2\x7d\xdf\xe0\x1b\x34\x97\x75\x51\xb6\x95\x4f\xe6\xfb\x92\xa2\x8c\x92\xe5\x6b\x0d\xcf\x16\x84\x31\x96\x98\xf2\xf3\x71\xff\x9a\xe6\x2f\x95\xfb\x54\x90\x78\x58\x7c\xcb\x40\xd7\x11\x1d\x7d\x2a\x62\x89\x60\x56\xd1\x37\x55\xf5\xab\x31\x3f\xfb\x63\x1a\x49\xec\x3e\xa3\x3c\x30\x21\xaf\x9b\x4f\xa3\x7e\x3a\x9c\xd4\x98\x10\x14\xd1\x79\x28\xea\x1a\x85\xf6\x47\x2e\x6d\xcc\x27\x9e\x87\x3c\x95\x3b\xf8\x05\xe9\x0e\xe4\xb9\x4c\xeb\xcb\xce\x20\x64\x06\x13\x42\xc2\xd8\x89\xda\x61\xbc\x62\x14\x56\x7a\x6d\x01\x37\x8e\xeb\xd8\x62\x59\x9a\x8c\x79\x83\xe8\x84\xe1\x10\x9a\x18\x89\x3f\x71\x2e\x9d\x7b\xd1\x68\x04\x0b\x12\x2c\xb5\xed\x67\xdb\x26\x06\xb5\x61\xce\xec\xee\x6e\xbb\xdc\xed\xdc\x15\x25\x3e\x0f\x4c\x82\xbb\x31\x68\xcc\xb0\x0f\x0b\x66\x3e\xf7\xc3\x80\x3a\xfc\xc7\xbe\x70\x0a\xfe\xee\x01\x31\xb0\xc7\xdf\x52\x02\xa7\xca\xac\xcc\xe7\xc4\xc3\xc7\x06\x2d\x47\x64\xdd\x84\x4c\xf7\x65\x71\x44\x7f\xb8\xae\xe2\xcb\x7c\x0e\x91\xd7\xfc\xd4\xd9\x62\xbf\x5a\x3f\x1d\xf6\xb3\x3f\xdd\xd5\x89\x20\x1a\xb3\xb1\x67\xe3\xc7\x49\x44\x5e\x6c\xb8\x26\x99\x05\x8f\xa2\xfd\xa7\x3b\x4a\x4c\x37\xb7\x2a\x32\x75\x5f\x94\xf7\xa9\x76\xe9\x2f\xf3\x25\x49\xb0\x4d\x60\x80\x8f\x33\xa5\x6e\x24\xb4\xcc\x97\xcc\xc3\x5e\xcf\x23\x4f\xf9\xe8\x2e\xc8\x04\x3c\x44\x24\xcf\x77\xcf\xed\x89\x25\x45\xc8\xd1\x37\xa8\xb7\xa9\x7c\xfd\xc7\x39\x75\x79\x1a\xf3\x95\xa2\xf8\x88\xd8\x18\xea\x20\xfb\xba\xf3\x83\x53\x07\x5e\x08\x44\x8c\x21\x77\x7f\xb8\x83\x94\x59\x81\x1d\xcc\x11\x6c\x14\x53\x16\xc7\xb6\xb1\xe5\x46\x06\xbe\x4f\x3a\x2c\xf9\xfe\x72\x82\x2b\x49\x6e\x16\x04\xd4\x73\x0d\xb4\x4e\xf2\x8b\xf4\xa3\x57\x16\x04\x49\x84\x26\x3a\x87\xb4\x9a\xb5\xc5\xed\x75\x79\x4d\x2b\x68\x86\x12\x63\xe3\x30\xc2\x63\xba\xc3\x10\xe3\x1d\x77\x2e\x0f\x03\x08\xfc\xf0\x25\x0e\xc2\x88\xe3\xcb\x77\xe4\x9f\x07\x2c\xd6\x1e\xde\xd3\xda\x89\x8a\xb1\x20\xa4\x46\xdf\xdc\xfa\x24\xfd\x27\xf6\x9f\x76\x77\x99\xe2\x86\xb2\x20\x8a\x02\xec\x11\xd4\xad\x7e\xc1\x6f\x5e\x02\xf7\x39\x1a\x9b\xd2\x81\x29\x14\xfd\xb8\xc8\x3f\x46\x1b\x41\x10\x25\x31\xe2\xc1\x79\x5d\xf7\x0c\x07\xbb\xc3\x12\x10\x03\xb2\x28\x2f\xa7\xba\xd8\xa7\xf2\x0d\xea\x6a\xb5\x58\xdf\x5c\xac\xff\x8f\xff\xba\xaf\x03\x53\x4a\x45\x0d\x0d\x04\x66\xb8\x97\xdf\x34\x76\xbf\xdc\x1a\x82\xd8\x0f\x31\xa2\x40\xfd\x25\x50\x8e\x01\x3b\xfd\x55\x31\x55\x2c\x6a\x9f\x44\x4b\xa9\xdd\x37\x01\x42\x31\xf2\x54\x62\x01\x89\xa9\x6e\xf9\xe9\x03\x37\xe2\xaf\xe7\x9f\x7a\x0a\xc1\xf8\xbc\xfe\xec\x2f\xcd\x01\xf5\x43\x93\xd6\x23\xd0\xeb\xd3\x2d\x74\xb7\xc3\x99\x2b\x20\xca\xe8\xc7\x50\x26\xf0\x36\xd9\x9f\xb1\xfb\x00\x38\x5d\xbd\x07\x94\x27\xc8\xe3\xa8\xa1\x44\xaf\xe6\x66\x63\xff\x5f\x90\xf5\xe8\xed\x4b\x3c\xe9\xe2\xb2\x37\x98\x43\xc6\x51\x14\x73\x7a\x31\x0a\xd0\x24\xbc\x2f\x42\x33\x3d\x11\x3c\x08\xa9\x55\x5d\xac\xd3\xfc\xc5\x68\x34\x8d\x86\xb0\x10\x4b\x2c\x36\x66\x6d\x17\x8e\xf1\x7b\xf3\xb7\x58\x3b\xee\x9c\x09\x01\xec\x9f\x17\xf9\xb9\xea\x14\x92\xed\x51\x11\x2b\x8c\xf3\xed\xea\x67\x0b\x47\xdb\x73\x76\xed\xe0\xe4\x3e\x41\x08\xeb\xb7\x89\x2c\x73\xf2\xea\x22\xdb\xd7\x47\x88\x58\xb1\x76\xd5\x6c\xd2\x6c\xc7\xb6\xbd\xa2\x14\xb0\x40\x7a\x51\x1c\x3b\xb4\x09\xc8\x54\xa7\x4d\x02\x7a\x1c\x68\x91\x0e\x7f\x1f\xc4\x34\xb0\x66\x65\x5b\x5e\xc3\x93\x33\xe6\x66\x81\x8e\x38\x1e\x59\x3d\xdd\xaf\x17\xeb\xed\xe6\x70\xb7\x7e\xea\x49\xa9\xb2\xd0\x0b\x03\x04\x7a\xe7\xf0\x81\x36\x21\xed\xdf\x19\x41\xb0\xd0\xf7\xc7\x7d\x77\x0f\x7e\x13\x65\x4f\xbf\xcc\xa1\xc7\x99\x93\x78\x73\x25\xa0\xfd\xa7\x35\x60\x1e\xd6\xe5\x9a\xb1\x1c\x77\xae\x67\x13\x7e\xa3\xdc\xfe\x70\x84\x1f\x0a\x83\xf6\x68\x9e\x46\xb3\xc3\xcc\x34\x62\x88\x7b\x9a\xf0\x83\xe9\x09\xfd\x38\x70\xf0\x96\x26\xb2\xa9\x1e\x53\x59\x16\x8f\x85\x6a\xee\xf0\xca\x75\x67\x58\xe8\x4b\x8e\x58\x25\xd4\xdf\x4c\xf3\x14\x5f\x70\x7b\x2c\x08\x23\x61\x1f\x5c\x93\x08\x5d\x49\x12\xb8\x81\x60\x0c\xea\x4a\xd4\xd7\xab\x8c\x1d\x03\xa8\xf9\xa5\x8f\x06\x60\x61\x48\xb9\x51\x35\x6d\x82\xd1\x9e\xca\x14\x0b\x23\x16\x83\x89\xb1\x2e\x4e\x2b\xb2\xbf\x66\x84\x31\xd3\x98\xfa\x48\x7e\x3a\xa4\xf9\xe1\xc3\x69\xb9\xb0\x30\x06\xcd\x75\xff\x1a\xf7\x45\xa7\x1d\x3d\x9a\x12\x42\x14\xca\x14\xa4\xd5\x63\x4f\xaf\x73\x38\xd3\x89\x47\x43\xcf\xee\x36\xb3\x2c\x1b\xac\xbc\x6e\x88\x2f\xb1\x9f\x73\x3c\xd7\xf0\xd8\xb3\xb8\x62\x61\x02\xdc\xdd\x74\xb3\x5b\x58\x17\xf7\xd1\x75\x70\xaa\x23\xbb\xc5\xdf\x3d\xcd\x6e\xcc\x29\x67\x92\x39\x35\xee\x6d\x91\x8d\x1c\x33\x99\x7b\xcb\x42\x9e\xc4\x22\x30\xaf\xa5\x7c\x5b\x64\xe9\x84\x23\xe6\xf4\x13\x2a\x02\x15\x5b\xc9\x02\x74\xa1\x1b\xff\x4c\x91\x44\xda\x56\xb8\x79\x96\xfe\x1b\x1c\x7c\x74\xb0\x60\x86\x42\x46\x46\x0a\xd9\x09\xd9\x66\x37\xc5\xf0\x58\x28\x3d\x8e\xd1\x86\xcc\x8a\x0a\xc6\xe1\x51\x28\x23\x62\xe4\x35\xce\x26\x75\xee\x29\x81\xb2\x50\x52\x12\x3a\x11\x80\x66\x09\xc7\x0e\xe1\x0d\x78\x7b\x6f\x5d\x09\x25\x8b\xf0\x35\xf8\xf9\x6f\x9e\xff\xae\xb6\xca\x42\x09\x11\x3a\xa3\x35\x93\x1e\xb8\xaf\x56\x9a\x4a\xe3\xd2\xe4\x44\x27\xba\xa0\x6b\x3e\x8d\x6c\x60\x21\xf8\x21\xd6\x95\xbe\xf3\x36\xe2\x0c\x41\xd3\xc0\xae\x71\x77\xa9\xd6\xa9\x3c\x67\xf5\x65\xf4\x6c\x68\x1a\x38\x0c\xd9\xa2\xd9\x57\xea\x1a\x03\xc5\x83\x3d\x47\xe4\xf1\x18\x99\x8b\x4f\xf7\x8b\xfe\x1b\x12\x79\x9c\x48\xe5\xbc\xe7\x45\x6b\x7e\x7d\xad\x88\xda\x0c\x65\x28\xaa\x7a\x4c\x73\x5b\xe9\x9b\x43\xbd\xca\x07\xef\x6a\xe4\x87\x5a\xfb\xce\xef\xc9\xcc\xf5\x75\x01\x9b\x45\x3e\x09\xb1\xbf\xf3\x63\xfb\xd7\x66\xbf\x7e\x5a\x3d\x3f\xb6\x27\x48\x8c\x0c\x49\xf5\x5a\x9c\x33\x85\xa5\xb5\x75\x3e\xab\x6b\x38\x9e\x6a\xd4\xd3\xc3\x4d\xe4\xd7\x2b\xe4\x4f\x45\xbf\xdf\xc0\x22\x9f\x07\x66\xdf\x68\x02\x8e\x26\x53\xf2\x37\x9d\x20\x08\x8b\x02\x92\x20\x86\xe2\xd0\xba\x69\xda\xee\x74\xf3\xbc\x04\xe1\xd7\x61\x52\x14\xd0\x08\xd7\x8b\x53\x09\xfb\x17\x68\xad\xd5\x58\x14\xf0\x10\x3d\xaa\x0e\x07\xe9\x9c\x65\x07\xa0\x98\x76\xfa\x02\x90\xf8\x24\xaa\x92\x7f\xac\x6a\x38\xda\x6c\x75\x7a\x97\x8a\x42\x20\x91\xdd\x04\x9b\xc1\xd5\x72\x31\xfd\xc0\x44\x21\x70\xe8\x01\x5e\x6c\x53\xca\x1e\x8c\xfc\x10\x73\x8c\x03\x94\xbc\x82\xa7\x42\x8d\xef\x69\x14\x46\xb4\x17\x40\xf4\x24\x66\x7b\xc2\x78\x13\x28\x1f\x16\x45\x31\xb4\xc6\x4e\xf8\x0e\xcb\xcb\x58\x03\x7c\xf8\x8b\x22\xe2\x23\xe6\xe4\x67\x0a\x1f\x1d\x81\x9e\x45\x11\x35\xeb\x45\x2b\x69\xd7\x3d\x9c\x91\x8a\xb9\xd1\xeb\x29\x6b\xac\x68\x7d\xf1\x0e\x46\x31\x0d\x94\x71\x49\x49\xdf\x31\x4e\x83\xd5\x62\x8d\xe0\x4c\x6b\xaf\xec\xce\x1a\x8b\x08\xa7\x76\xf3\x7d\xb6\x5b\xc6\xc6\x7c\xf8\xb0\x5f\x39\x1b\x2e\x16\xd1\x18\xf0\x4e\xcd\xf7\x8b\xe5\xfe\xfb\xe8\xc9\xa5\x2a\x40\xef\x90\x6f\x45\xa1\x1e\xce\xf2\xad\xff\x53\x98\x97\x38\xca\xf6\x06\x29\x5d\xa8\xec\x9e\xe6\x2f\x46\x7b\x75\x72\xc1\x8e\x18\xa5\xd8\x53\xfc\x56\xf0\xec\x7b\xda\x16\x0d\xb3\xf6\xa4\x1a\x8c\x69\x05\xbe\x67\x5b\x53\x2a\x54\xfb\x62\x29\x8b\xea\x52\xd5\x70\x74\x03\x79\x40\xb1\x52\x7f\x3c\xec\x1e\xb7\x76\x69\x76\x87\x22\xea\x59\xf9\xab\x0f\x5e\x2a\x50\xeb\x73\x2d\x8b\x76\xc7\x8e\x38\x35\xfd\xb5\x3d\xff\x77\x5a\x0f\xd6\x07\x2e\x43\xca\x50\xf2\x07\x9f\xd6\x7d\x5a\xb7\x0b\x6f\x24\x24\xc3\x57\xd5\xa8\x8c\xe0\xc6\xe5\x0e\x35\x61\x99\xd7\x83\x15\x0c\x58\x19\x6e\x8c\x6f\x74\xf6\xd0\x34\xd3\x14\x5a\x5a\x55\x8d\x6e\xef\xeb\x03\x23\x46\x10\x09\x16\x49\xf0\x74\x5f\xb2\xa4\x2e\xb8\x94\x53\x0a\x57\x2c\x52\xbe\x8f\x4e\x8f\xef\x3c\x4b\x55\x1f\x2e\xc8\x22\x15\xf1\xa4\x35\x7e\x3a\xa6\x79\x35\xd5\x33\x65\x91\x52\x86\x0e\x79\x07\xef\x66\xcd\x33\xfd\x86\xc7\xe2\xf6\xd6\x69\x3f\x09\xbe\xc6\x62\xfa\xb1\x90\x6f\xcd\x16\xb1\xc3\xb5\x0d\x5d\xa3\xa1\xb5\xf7\xee\x59\xad\xb0\x08\x02\x03\x46\xb6\xca\x1f\xc6\x85\xc9\x9d\x7c\x68\x98\x35\xfa\x9d\x60\x9d\x34\xee\xcf\xf9\x8f\xde\xa3\x09\xd2\x33\x92\xb0\x28\x54\x8c\xc2\xcb\xd7\xcc\xa2\xdf\x55\x89\x86\xdf\xa4\x85\x11\xe3\x32\xcd\x9f\x95\x05\x60\xdc\x97\xc5\x11\x3b\xed\x57\x2a\x6c\x2c\xf6\x54\x18\x08\x6b\x90\x5f\xf3\xb4\x5b\xbb\x63\x3f\x50\x14\xfd\xaa\x8a\x73\xae\xfc\xbd\x7d\xd4\x8f\xbc\x97\x7a\xc4\x7e\x6c\x34\x49\xda\x48\xaf\xe4\xef\x90\x4d\x33\x6f\x27\x16\x88\xd8\x27\x04\xd5\x51\x0e\xb2\x38\x9e\xce\x35\x58\xf0\xde\xa4\x22\xe1\xe0\x5f\xb7\x5a\xc6\x7e\x12\x46\x2e\x98\x68\x79\x36\xfd\xce\xf0\xd7\xff\xb8\xb3\x88\x00\x31\xa3\x33\xd7\x6d\x66\xb1\xaf\x15\xca\xd3\xc1\x3b\xe4\xb5\x35\xde\xb1\x87\x02\x2f\x41\x01\x78\xdb\x71\x74\xb6\x39\x2c\x0e\xe2\x24\x96\x5d\xf3\x40\x8d\xe6\x3a\x14\x41\x5f\x07\xe4\xb5\x80\x3c\xfd\xfc\xba\xa9\x15\x47\x11\x75\xe0\x70\x07\x7e\x1b\x6c\x17\x71\x44\x39\x8a\x65\xa9\x22\xe7\x32\x2d\xf2\x45\x79\xfe\xf7\xb6\xf8\x5f\xee\xae\x29\x8e\x3c\xd1\x3d\x12\x46\x4d\xa7\x45\x6e\xb1\x98\xc6\x3e\xeb\x84\x03\x11\x6a\x34\xbc\x68\x4a\x62\xc4\x40\xa0\x76\xfc\xea\x1e\xab\xd2\x93\x20\x7e\x16\x33\x69\x5c\x02\xef\xb7\xcb\xa5\x55\x78\x77\x57\x91\x84\xac\xb7\xa9\x4d\x31\x37\x9a\x31\x82\x1a\x7d\xda\xbc\x6a\x72\xfa\xba\x90\x45\xd6\x9e\x80\xc4\xae\xc5\x78\xe0\xcd\x86\x9a\xd6\x97\x83\xb8\x1c\xd2\x69\xd6\x4f\xf3\x01\x8a\x6d\xe1\xbc\x70\xc9\x43\x10\xb9\x43\x94\xe0\x9b\x7c\xe4\x9f\x87\xf7\x4e\x2f\x8f\xc5\x09\x4b\x10\x63\x53\x9d\xc5\xcf\xb4\x3c\x57\x77\xa0\xa7\x77\xce\x66\x24\xe6\xdc\xdb\xf5\xc3\xf2\x80\x3d\xf1\xc3\xe3\xea\x69\xbf\xdc\xb6\xa7\xe2\x0a\xfd\x7f\x0f\x27\x7e\x99\x37\x99\xd0\x70\xcf\x8a\x39\x63\x06\x98\xb4\x7a\x5a\xba\xd2\x6c\x2c\xa8\x8f\x91\x9a\xe4\x99\x9c\xa7\xb9\x02\x35\xcf\xd2\x5c\x35\x77\x3d\x88\xc9\x14\x4c\x90\xc5\x42\xa9\xc8\x40\xfb\x5c\xf9\x65\x96\x75\xe1\x46\x2c\x69\xec\xfc\x2b\x8d\xcf\xd3\x19\xb9\xf3\x39\xb6\xab\xdd\x20\x15\x19\xb3\x6a\xa3\xcd\x3f\xdb\x2c\x46\x77\x4f\xc5\x14\xd5\x72\x97\x9f\xbb\x57\xc8\x32\xc4\x73\xb5\xc7\x80\x07\x96\x1c\xd6\xdb\x99\x47\x17\xa9\x74\xc8\x6d\x9a\xf4\x1d\xca\x62\x56\xf5\x7c\x89\x86\x23\x21\x90\xaa\xf3\x27\x74\x3f\xe9\x6a\x31\x37\x1a\xe3\xc8\x92\x73\x3b\x0f\xca\x33\x47\xad\xfc\xde\xc3\x66\x7f\xe3\xde\x41\x64\xb8\xb2\xd5\xf9\x68\x73\x9c\x71\x73\x34\xd6\x01\x41\x3c\xe3\x4c\x29\x43\x05\x1c\x17\x14\x63\x2d\x29\xb4\x06\x1b\x26\x9d\x1a\x00\x5b\x18\xf1\x42\x29\x0d\x3b\x0d\x9b\xcf\x56\xfb\xbf\x3d\xca\x7c\xdf\x96\x3c\xac\x21\xc3\x13\x3f\x42\x07\x6e\x65\xc4\x53\x1e\xb7\x4e\xcc\x6e\x3f\x72\x7c\xcc\xd1\xf2\x45\x42\xa2\xd1\xe9\x08\x9f\x01\x38\x5d\x97\xbd\x49\x44\x14\xb1\xb1\xeb\xd3\xf9\xd8\x93\x7f\x86\x53\x51\xd6\x4f\xc5\xee\xb5\xf8\x18\xe5\xb6\x24\xf6\x02\x6a\x4a\x01\x79\x71\xce\x25\x0c\xe2\x17\x42\x98\xe8\x04\x3a\x2a\x6c\x1f\xdf\x17\xae\xd3\xee\x06\xd1\x20\xf0\x9d\x38\x2c\xf0\x72\xd6\x44\x3a\x5f\x42\x85\x18\x61\xa1\x8f\xef\xe0\x62\xf1\xfd\xb0\xbc\x5b\xed\x1d\xb8\x84\x11\x46\x42\xcc\x97\x96\x3d\x36\x3f\x23\x8c\x12\x94\xeb\xb3\xe6\x39\xe6\xe6\x5f\xb1\x91\xcd\xce\x9c\xb8\x09\x63\xcc\x40\xdb\x67\xae\xf8\x40\x12\x2e\xb9\x5d\x67\x77\x56\xf4\x74\x7a\x61\x21\x89\xa0\xe8\x24\xb0\x7e\x5a\x1e\x1e\x57\x0f\x0f\x5d\x31\x8a\x24\xda\xc7\xc6\xc8\xd1\x38\xe6\x4c\x93\xa4\xec\x58\x11\xf2\x84\xb7\x2e\xac\xef\x9d\xef\x12\x23\x22\x26\x58\x65\xcc\x9a\x3d\xfc\xae\xfd\xab\x48\x12\x3e\xee\x26\x84\xde\xa0\x09\x40\x84\x8e\x31\x20\x42\x8e\xa8\x4a\xaf\xbd\xcb\x07\x2c\xb3\xe9\x32\x3d\x91\x7e\x12\xb2\x56\xb3\x20\xad\xea\x92\x63\x9e\x3c\x7a\xa6\x24\x95\x58\x72\x9f\xa7\xf5\xac\x14\xfd\x10\x95\x48\x69\x18\x72\xe3\xce\xeb\x97\x7b\x1d\x91\x52\x52\xed\x56\x89\xec\xaa\xf0\x4b\x94\xc7\xb0\x01\xb2\xde\x2d\x3b\xaf\x1f\x46\x94\x54\x91\x25\xca\x2f\x2e\x32\x83\x41\x64\x6f\xc7\x00\x4d\x7c\xee\x5e\xb7\xb2\x55\xe8\x6a\x7f\x32\x50\x40\x87\x86\x19\xf2\x20\xbf\x7d\x5b\x4c\x34\x60\x08\xc8\x88\x74\x8f\xfc\x03\xe8\xfa\xae\xe4\x69\x3e\xfe\x2a\x08\x11\x80\xd3\xbc\x12\x06\x1e\xd2\xc2\xd7\x47\x23\x75\x28\x13\x0b\xb8\x1d\xd7\x47\x47\xe0\x84\x1b\x37\x4a\xd3\x10\x77\xd5\x22\x1f\x17\xa6\xa8\x17\x44\x9e\x71\x1b\xd5\x36\xd7\xe2\x23\xb6\x18\xa3\x9e\xa2\x1a\x2c\x0a\xc1\x96\x43\x46\x23\x7c\x29\x50\xd1\xf1\xb1\xc8\xa1\x2e\xc6\x07\x21\xc2\xc6\xf9\x91\xbf\x41\xbf\x50\xb1\x9a\x26\x55\xa0\xe4\x9f\xf3\x71\x78\x5d\x1a\xf8\x7a\xff\xe1\xa5\x3e\x00\x5e\xf3\x66\x61\xd9\xfe\x8c\x06\x89\x0c\xad\x14\x5d\xb3\x0f\x3c\x9f\xae\x05\x2c\x19\x0d\xb8\xe1\x01\x3b\x62\xcc\xf3\xea\x56\xc6\x8b\x86\x64\xb4\xb5\x8e\xc3\x54\x14\xc6\x53\x17\xf1\x10\xf7\x87\x5f\xb3\xd5\xfe\x30\x7f\x58\x2f\x7e\xb8\xce\x2f\x8d\xa4\x32\x10\x1c\x28\x75\x51\x1e\xad\xf2\xc1\xe4\xcd\xa1\x91\x8e\x8d\xf0\xbb\x52\xf6\x91\x1b\xfc\xd8\x38\x89\x51\xff\x7d\xd3\x64\x6a\xdb\xa2\xc9\xd4\x1c\x2e\xb5\xb7\xc4\x33\xcf\x0e\x27\x91\xd1\x34\xaa\xa0\x17\x1d\xdb\x41\x96\xc0\xc5\x28\x49\x0c\x2b\xb8\x82\x1a\x2b\x2e\xee\xb2\x09\x00\xf1\xad\x43\x73\x8f\x1d\x3f\xfc\xd9\x34\x00\x14\xea\x55\x69\x55\x9e\x4f\xed\x67\x69\x4c\x95\x7d\xbb\xea\x6c\x54\xab\xa0\x34\x09\x30\xfa\x76\xc9\x9e\xd1\x69\xb9\x6b\xb5\x04\x9b\x44\x5a\xa1\x7e\xcf\x2c\x6b\x11\xee\x8c\x32\x29\x51\x08\xe4\x71\xf9\xb0\x7e\x3a\xcc\x76\xbb\x65\x7b\xc3\x13\xdf\xc3\x67\x44\x41\x06\x35\x7c\x3f\x09\xac\x90\x0c\x1f\x3c\x41\x13\xcc\xf7\xf1\xde\x3c\xce\x1e\x1e\xfa\x6b\x0f\x15\x89\x87\x65\xb7\xf9\xfa\xf9\x69\xff\x57\x5f\x3c\x82\x51\x21\x19\xea\xbb\x7d\x2f\xb2\xf4\xad\x38\xd5\xd6\x53\x6a\xf0\x79\x49\x8c\x23\x5c\xf5\xc1\x4f\x63\x14\xd3\x17\xdd\x9a\xab\xc5\x74\xf4\xe4\xc9\x04\x30\x2f\xde\xf0\xcb\xaa\x44\x5d\xbf\xf6\x0b\x45\x82\xd5\x06\xab\x28\x89\x55\x8a\x3e\xf8\xce\x0d\x03\x69\x6f\x62\xfe\x0e\x65\x3d\x72\x51\x66\x54\x25\x14\xb7\xf8\xd5\xc3\xfd\x68\xbe\x20\x26\xa8\x62\x2a\xce\x97\x1f\xe9\x71\xf4\x31\xe0\x2c\xb1\xb0\x6c\x0c\xcb\xa6\x38\xa3\xcd\x28\x60\xda\x81\x06\x36\xad\x82\x08\xa3\x3a\x14\xca\xd8\x1f\x64\xfc\xf2\x65\x4b\x71\xf8\xe4\x68\xea\xe3\x3b\xbb\x5f\x3d\x22\xe2\x77\xb1\x5e\xff\x68\xcf\xc9\x0d\x90\xef\x54\xc2\xfb\x7f\x71\xf9\x76\x2a\xea\xea\x01\xf2\x97\x16\x65\xc0\xbc\x88\xa2\x7c\xdd\xf1\x9c\xd5\xe9\x2e\x7d\x31\x90\x8a\x61\x00\xc6\xbc\xc8\x6c\x63\x36\x4d\x43\xf4\xec\xf9\x1a\x57\xc7\x3c\x22\x30\x54\xb7\x13\x3b\xe1\x3e\xce\x58\x40\x55\x0f\xb4\x84\x18\x5f\xf7\x35\x01\xf8\x78\xc8\xd5\x55\xd6\xef\x50\xaa\xf3\x8d\xba\x39\x0b\x63\x83\x18\xb7\x72\x71\x1b\xd3\xb3\x6b\x21\x08\x2c\x8c\x8d\x9d\xa8\xc6\xd7\xfb\x8f\x5e\x94\xc7\x42\x91\x18\x2d\x7e\xa5\x66\x47\xc8\xd5\x71\x0c\x01\x60\x51\x20\x31\x1d\x4f\x4f\xba\xfa\x36\xc6\x08\xb1\x88\x85\xe8\xf7\x6c\x7f\xe7\x63\x65\x18\x51\x96\x0f\xd2\xd6\xe7\x19\x89\x38\xd7\x9d\xe3\x38\x94\xf5\xe5\x3e\xe3\x2f\x7d\x76\x38\x63\x84\x48\xdc\x50\x4f\xc8\x7d\x33\x36\x2f\x77\xeb\xbb\xf6\xee\x0f\xbe\x99\x10\x40\x29\x9b\xc3\x0b\xe4\xd5\x37\x6b\xac\xdb\x7e\x9d\x32\x92\x22\x78\x2f\xc7\x2c\xe3\x71\x27\x92\x51\x42\xbc\xa4\x43\x19\x8e\x01\x8b\x43\x35\x12\xc6\x98\x67\x38\x93\x56\xcc\xf9\x0b\x1b\xd0\xee\x6a\x99\x95\x6c\x6d\x85\x85\x51\x5a\x26\x1f\x69\xb6\x32\xc6\x7d\x6b\x9d\xda\x64\xc6\x57\x0a\x00\xa3\xb1\x89\x16\x71\xcf\x75\x68\xa5\xd6\xda\x3e\xae\xb3\x5c\x0d\x78\x0d\xa3\xab\x11\x71\xe2\xf5\xd9\x40\xf3\xdd\xec\x7e\x79\x6b\x2c\x67\x18\xfd\xb5\x26\x72\xcd\x32\x62\xa4\x31\xdc\x08\x2d\xd1\x03\xe6\xe0\x7e\xdc\xad\x33\x69\xa3\x8f\x8e\xc4\x36\xc7\xaf\x99\xe5\xca\x2a\xf4\x8f\x66\x42\x71\xe6\xe9\xae\x41\xf9\xc4\x47\x3c\x1c\x96\x78\x41\x80\x25\x30\x55\xb6\xc6\x80\x2c\xf1\x14\x11\xd2\x40\x7a\xee\xd2\xea\x74\xae\xa1\x9a\xd5\xa8\xd8\xd0\xe9\xf3\xb0\xc4\x03\x8e\x35\xd4\x4e\x6d\xa1\xe5\xa5\xad\x5b\x56\xfa\x6f\x15\x9b\x58\xe2\x69\xf3\x66\x3d\x14\x12\x6d\xce\xca\x6d\x51\x75\xf9\x4c\xe2\x2b\xe2\x5b\xc3\x56\x0b\x12\xde\xdb\x30\xaf\xb7\xf0\x24\x81\xe7\xa1\x05\xd0\x1e\x3e\xb9\x29\x36\x1e\xff\xb8\x22\x0b\x31\x37\x38\xa1\x18\x9e\x1d\xb8\x63\x86\xee\x26\xba\xd0\x76\x70\x18\x49\xcf\xd0\xfd\x2e\x83\x4e\x65\x0f\xfc\x38\x2a\xb5\x26\xa1\x0e\x50\x2b\x9b\x3b\xda\xf1\x06\x55\xfc\xc6\x40\x44\x3b\x3a\x0a\x02\xdf\x96\x57\x50\x66\xf0\xbe\x28\xbf\xf3\x52\x7d\xf0\x12\xb6\x08\x6e\x74\xbf\x31\x0a\x25\x63\xad\x87\xe7\x2f\xe0\xa7\x22\xc7\x6a\xc1\xf0\x82\x23\xc1\x69\xdf\xda\x75\x7d\x1e\x15\x74\x92\xd8\x17\x71\x8f\xdf\x35\xce\x02\xba\x51\x58\x05\xd6\xcd\x73\xda\x62\xc5\x9b\xe8\xda\x5d\x50\xac\x14\xed\xf2\x91\x73\xc6\x0d\xd6\xb2\xa5\x7b\x75\xef\x7b\x42\x98\xc6\x84\x73\x52\x90\xec\xea\x55\x4f\x48\x92\x20\x82\x73\xc3\xab\xaa\x49\x84\xfb\x81\x40\x42\x04\x41\x86\x19\xe2\xc9\x8b\x67\x5c\xfd\xdc\x31\x1a\xea\xa0\x15\xe9\x6d\x1e\x00\x59\x83\x9a\xac\x68\x24\x14\x98\xc9\xe3\x25\xcf\x78\x89\xc0\xad\xa1\x15\x30\x4b\x98\x4f\x63\x62\x1d\x50\x6d\x60\x3c\xbc\x4e\x16\x4a\x69\xb8\x38\x6d\xab\x15\xf5\xbd\xdd\x7b\x9d\x30\x30\x76\xc3\x46\xe6\x0a\x9a\x89\x74\x87\x92\x80\x12\xdb\x86\x6c\x92\x9a\xe1\x63\x3d\xbc\xd4\x84\x06\xe8\x6e\x98\xc3\xc7\xb6\xc9\x5f\x5b\x51\x38\x96\x24\x3c\xc0\x2b\xe0\x4d\x1c\xb7\x68\x56\xbc\xca\x22\x41\x6e\xa6\x98\x93\xb9\x8c\xb5\xc2\x61\x09\x8f\x63\xb3\x12\x21\x0b\x8e\x57\x30\xc3\xa7\x04\x6d\xd8\x66\xe5\xcb\xb5\xd7\xdc\xf0\x52\x45\x9c\x18\x37\x8d\xd7\xb3\xd6\x19\xa0\x92\xfc\x70\xce\x24\x70\x84\x1f\x8f\xbd\xb4\x0d\x26\x71\x72\x77\x4e\x24\xa8\xa0\xe3\xb1\x0e\x85\x38\x87\x23\x95\x88\x31\xc3\x5d\xe5\xa7\x73\xfb\xa0\x2a\xa5\x11\xf5\x8a\x2d\x8b\x3b\x8c\x60\x47\x35\xe0\x04\x22\x8e\x37\xea\x60\xd1\x3a\x57\x8e\x17\x93\x3f\x97\x7b\xb1\xb0\x6e\xa7\xcd\x49\xbb\xb6\xf9\x1f\xe3\x61\x12\x1b\x77\x28\x42\x5b\x16\x33\x9c\xd1\x0d\x7f\xc1\x8a\x5f\xd1\xeb\x66\x70\x8f\x51\xdf\xc6\x84\x7f\x36\xe7\x98\x5e\x95\xb8\x27\x34\x0a\xe4\xdc\x17\x25\xbc\x43\x69\x00\x2d\xee\x18\xf8\x46\x57\xc9\xd4\xee\x7f\xe4\x85\x7c\x2b\xce\xf5\xa6\x48\x1d\xbc\x64\xa0\xdb\x3e\xf1\xff\xbd\xeb\xf1\xbd\x04\x1b\x3e\x0e\xa2\xf0\xeb\x15\xf2\xfb\xa2\x7c\x6b\x1f\x71\xee\x33\x0f\x29\x85\xab\xc5\xfa\xa9\x68\xb5\xc5\xba\xc3\x22\xc4\xcc\x0e\x2b\xb2\xeb\xcd\x72\x3b\xdb\x3b\xc5\x1e\xc6\x7d\xf0\x91\xf3\xe4\x1c\xf5\xb1\x44\x70\x03\x02\xc3\x03\x62\x5c\xb4\x4f\xfc\xb2\x80\xc2\x9d\x22\x48\x78\xec\xd8\x25\xd6\x69\xf1\x2e\xad\x8a\x8f\xfc\xa9\xa8\xfb\xca\x23\xed\x78\x1d\x23\x66\x7e\x5f\x3c\xb4\xae\x5f\x8c\x87\x9e\x36\x7a\xb1\x4d\x1c\x6d\xde\x44\xd3\x15\x6d\x07\x04\x01\xc2\x5c\xf1\x4a\x17\x85\xbb\xcd\xee\x68\x28\x5c\xc6\xfe\x2d\x2b\x04\xcf\x16\x45\x5e\xa1\xb0\xcd\x18\x03\xf3\xff\xa6\x5f\x46\x77\x9e\x48\x0f\x28\xc6\x7d\x7f\x60\x37\x84\x80\x6b\x9c\xa2\x14\x0b\x2e\x5c\x8e\x3e\xd3\xbb\x71\x51\x00\xc8\xb3\x7f\x87\xd2\xf4\xa9\xbb\x4a\xa8\x81\xcc\x3c\x76\x69\x94\xfd\x48\x9c\xc4\x3c\xee\xec\x6c\x9d\xc4\x47\xfa\xef\x1e\x19\x8f\x71\xc2\x89\x34\xec\x99\x7d\xab\xdd\xd7\xef\xa4\x73\x1a\x72\x6d\x6b\x3a\x58\x58\x1c\x2d\x9a\x9c\x4a\x03\xe1\xa9\x2c\x37\x6b\x48\x1c\x63\xbc\x49\x42\xd0\x7a\x79\x33\xc0\x5f\x70\x96\x04\xd2\xc2\xad\xe6\x97\x8c\x7f\x54\x0b\x4b\xcf\xfb\x59\xd4\xb0\x45\xe3\x57\x50\x77\xe7\x72\x70\xb5\x09\x87\xc8\x58\xf4\x1e\x79\x8a\xfb\x58\x2b\xf6\xc6\x78\xd2\x84\x53\xf8\x53\x0e\x47\xfe\x79\x78\x29\x78\x76\x28\xfb\xbe\x02\x8c\x0b\x5f\x52\x9b\xdf\x37\x5f\xf5\x82\x5d\x37\x74\x54\xfb\x63\xa2\xd5\xcf\x25\x4f\x9c\x46\xed\xd0\xd6\x95\x71\xa9\x28\x77\x4a\xab\xbc\x1a\x60\xe9\xb9\xf2\xbc\xc8\x46\x5c\x1d\xd1\xba\x13\x8d\x66\x5c\x05\xda\xb7\xe7\x4d\x47\x4b\x17\xd7\x24\x48\x0c\x28\x3c\xcf\xa1\xbc\x03\x99\xaa\x9e\x15\x31\x13\x9e\x07\x60\x5b\x34\xf7\xcd\x5b\x6c\x94\xd4\xdc\x41\x5f\x23\x26\x02\x1f\xfc\x4e\xd2\xba\x5a\x55\xd5\xb9\x9d\x05\xe1\x45\x86\xbc\xb6\x6b\x36\xe3\xb4\x1a\xec\xc7\xc2\xa3\x0c\xc3\x1d\xa3\x85\xb3\xff\x28\x26\xb4\x70\x98\xf0\xc1\x23\xbc\xcb\xfa\xfa\xa0\x78\x11\x84\x1c\x1b\x3f\xcd\xc6\x86\x68\xc1\x65\x55\x77\x99\x88\x08\x63\xa0\xd8\x74\xe6\xef\xb0\x05\xe3\x10\x32\xd1\xb5\x14\xa1\xd2\xc8\x5b\x7f\xe2\x47\x84\x1a\x0c\xa6\x49\x44\x3e\x45\xe9\x3a\xa3\x20\xfb\x0d\xea\x99\x6a\xd2\xad\xb4\x82\xe3\xd8\x6c\x86\x89\x38\xa2\xd0\x2f\xa0\x18\x2a\x09\x2a\x0f\x4e\xbe\xb9\x82\x2a\x63\x23\xbd\xe1\x97\xfb\xa2\x6c\xf3\xb2\xee\x8c\x89\xa7\xa1\x05\x66\xad\x07\xbd\x80\xff\x0e\xbb\x76\x7d\xef\x3f\x83\xff\xe9\x2d\xc4\x22\xe1\x81\xea\x0c\x80\xac\xaa\xdc\xf0\x1a\x12\x6b\x63\xd3\xba\x4f\x98\xae\xfb\xf4\x9e\x2a\x78\x10\x21\x0e\x57\xf2\x7c\x77\xc9\xeb\x57\xa8\x9a\xe5\x3d\xad\xaf\x0c\x1c\xdd\x78\x42\x89\x72\x81\x78\x5d\x5e\x6e\x0c\x13\x32\xa2\x76\x29\xb4\x5a\x31\x93\x8d\xe6\xe1\x9d\x93\x3c\xf2\x3b\x23\xc9\x1d\x40\x3e\x19\xb3\x09\xa9\x85\xb0\xb8\xaa\xf4\x68\x01\x8c\xd5\x1c\x74\x61\x52\x2a\xf7\xc0\xa8\x30\xee\x37\x82\x07\x7b\xa8\x1f\xb0\x7e\x9a\xd9\x3e\x9f\x2a\x26\xf8\x78\xc8\x22\xd7\x69\x79\xec\xc5\x58\x42\x69\xa2\x63\x17\xc4\xad\x14\xc2\x2a\xdb\xf7\x5a\x40\x10\x20\x20\x44\x17\xa5\x86\x74\x00\xdf\x76\x23\xa8\x24\xce\xd4\x09\x9b\x45\x43\x94\x8d\x00\xaa\x34\xed\xda\xd3\x98\x66\xb4\x2f\xa8\xf6\x22\x94\x92\x90\x19\xf0\xf2\x39\x6f\x82\x4b\x17\xe0\x4d\xdf\x00\xad\x05\x16\x1b\x8f\xa8\x57\xbc\xb5\xfe\x13\xc3\x89\x94\x1e\x35\x35\x98\xf7\xa2\x86\xb2\xea\x03\x45\xa5\xc7\x08\x62\xc3\x0e\x46\x50\x60\x0b\xff\x6a\x8f\x08\x91\x44\x2d\xe7\x8a\xe7\xe3\x7c\x53\xfa\x84\x31\xa3\xdb\x50\xc0\x9b\x5b\x1f\x64\xe0\x49\xcf\x73\x02\x03\x3d\x7b\xfa\xc1\x65\xcb\x20\x64\xd8\xbe\xa9\xe4\x2b\x64\x59\x9a\xbf\xdc\xcd\xdd\x09\x42\x5f\x60\x4c\xc4\x95\x1a\x18\x43\x8d\xea\x7c\x13\x0f\x96\x0c\x13\x89\x30\xe4\x59\x7e\x16\x69\xdf\x92\x89\xc9\xd8\x27\xc8\xb5\x48\xf3\x4e\x9e\x63\x10\x12\x47\x6e\xa0\xb5\x77\x36\x06\x71\x75\xb3\xdd\x7e\xd6\x25\xef\xa8\x3d\xad\xbc\xab\xfb\x00\x31\xba\x9c\x7d\xba\x4b\x35\xbf\x0c\xc2\x7f\x49\x88\xc0\xa6\xca\x01\x2b\xc2\x43\x8f\xb0\xe1\xcc\x90\xc4\xe0\xdb\xee\x96\xf7\xb3\xe7\x87\xfd\xe1\x69\xd6\xe2\xaf\x24\xe1\x11\x71\x30\x2a\x7e\x29\xce\x75\x1f\xae\xdc\x02\x20\x24\x01\x4a\xbc\x7e\x03\xcc\x1d\xa0\x51\xcc\xac\xd7\xb0\xc9\x80\xe6\x97\x95\xea\x01\x8a\xec\x30\x16\x72\x5c\xff\x37\xdb\xd5\xcf\xd9\x7e\x79\xd8\xcd\x1e\xda\x4b\x60\x42\x61\xa3\xef\xdb\x6a\xb1\x1f\xe8\xa9\x33\x99\xd8\xb2\xfc\x4b\xab\xef\xba\xe0\x59\xd6\x6d\x4d\x32\xd1\xdc\xe8\xc4\x22\xa1\xc5\x84\x11\x43\x0d\x55\x3b\x90\x13\x82\xb3\xd5\x12\xdd\x07\x8d\x70\x29\x7c\xb3\x38\xa6\xd5\x96\xe7\xaa\xb0\x0a\xba\xed\xd1\xc0\x88\xb5\x19\xd1\xde\xe6\x77\x22\xe5\xa0\xbd\x0a\xc1\x63\xcc\x2e\xf6\xc0\x8f\xb3\x5c\x39\x17\xe0\xde\xa3\x3a\x7c\xcc\x85\x08\x50\xaf\x0a\xd3\x89\x76\x93\x94\x02\xb4\xa1\x7f\xe7\xe9\xb4\x1b\xd3\xf0\x2c\x32\x08\xb0\x9c\x35\x4f\x45\x31\x78\x30\x65\x60\x08\x12\x3f\x31\x72\x03\xf5\xe3\xaf\xc5\xe8\x02\x24\xa1\xc8\x8a\x50\xe7\xe3\x69\x92\x2f\x27\x95\x36\x52\xc7\x26\x61\x5a\x34\x6b\xda\xb0\x50\x28\x21\xa2\xb8\x1f\x2f\x37\x06\x88\x3f\xa5\x15\x3d\x5c\x59\x24\x68\xe3\x7a\xd5\x4a\x82\xb5\x33\xa8\x89\x52\x61\x9b\x06\x39\x7c\xd3\xb4\x39\x79\xfb\x11\xd3\x38\xf9\xd7\x19\xca\xcb\xd3\x80\x69\xea\x46\xf0\x28\xb2\xba\xc7\xf7\xbb\xfd\x6d\x37\x54\xa6\x3c\xab\xd1\x75\x78\x71\x52\x23\xd6\x20\xaf\x7d\x03\x94\x47\xc3\xd8\x46\x5f\x76\xf9\xec\x39\x32\x32\xe5\x71\x22\x2d\x10\x62\x6e\x14\x53\xbb\xbb\x6f\xb1\x35\xa3\xaf\x14\x46\x39\x34\xad\x9e\x8a\xfc\x9f\x50\x16\x93\xd8\x19\xe5\x29\xf0\x6c\x9d\xd3\x3c\x93\xfb\xc2\x68\x8d\xdc\xf8\x25\x7e\xec\x1b\x28\x12\x4a\xed\xa5\x50\xb9\xb2\xbf\x3d\x1e\x44\x0c\x0b\x23\xdf\x8c\x51\x1b\x94\xf3\xb1\xdb\x37\x53\x01\x84\xc2\xa1\x55\x6c\x1b\xe5\x17\xa4\xa3\x41\xa1\x27\x2d\xea\xb0\x09\x1a\x91\x5c\xeb\xbe\x23\xf4\x8d\x2e\xdc\x6c\xb5\x75\xf2\x56\x4c\x85\xb1\x46\x6e\x25\xcf\xe5\x6b\x6b\x09\xc8\x54\xe4\x47\xc8\x72\xe2\xa7\x53\x76\xb1\xc2\xf0\xd5\xb0\x9a\xff\x9f\x41\xe5\x54\xc4\x62\x6c\x22\xa9\xb4\xb2\xf5\xa9\xe7\x0a\xca\xab\x77\x40\x45\x92\x1b\x31\x5f\x5e\x55\x70\x14\xd9\x65\x92\x53\xdd\x7b\x9e\x54\x04\x2e\x2a\x30\x85\x8d\xb5\xd6\x15\xcf\x0c\x4b\x62\x7e\x59\xe7\xed\xc3\x10\x7b\x3e\xbe\x3c\xeb\x4b\x55\x43\xb9\x69\x1e\xf7\xf6\x10\xf7\x85\x63\xaa\xde\x97\xc5\x71\x25\x8b\xf6\x90\x56\x92\xbb\xf2\x7c\xd7\x54\x53\x44\x02\xee\x06\x73\xa8\x77\x50\xcf\xf2\xea\xe3\x77\x44\x33\x45\x14\x03\x65\xb9\xbc\xd8\x8e\xb0\x4e\xd9\xee\x94\xd4\x33\x1a\x41\xcd\x06\xb3\x05\x0d\x65\xec\x7d\xc6\x5e\x7b\xd4\x82\x45\xc1\x82\xff\x9a\xeb\x9c\x65\x35\x6f\x1f\x22\x1a\xc6\x81\x4b\x21\x9b\xe7\xe3\x79\xbb\x1a\x35\xd4\xdc\xc0\x28\xc6\xdd\x65\xf7\x5a\x7c\x5c\x49\x0c\x33\x45\x89\xd1\xbb\x78\xbc\xf0\xaa\x7e\x85\x3c\xe5\x2f\x25\x7f\x4f\xdb\x87\x83\x32\x8d\xc2\xd8\x55\x91\x35\x79\x59\x9a\x1b\x2b\xcc\x1e\x21\x41\x31\xae\x30\x99\x74\xa5\xe3\x29\xb6\xcd\x68\x72\x98\xa2\x48\x82\xfc\x99\xa5\x3d\xea\xbe\xe2\x81\x8f\x5a\xa6\xbb\xe5\xa2\x85\xad\xb7\xc7\x98\x8f\x6c\x25\xf4\x17\x6e\x42\x1e\x1b\xdb\xf4\xf2\x65\xc5\x39\xc3\x48\xc1\xc4\xd7\xff\x55\x5c\xaa\x62\x2a\xc8\x56\x5c\x8a\xc8\x32\x76\x1e\x0a\xf9\xb6\x29\xaa\xaf\xb4\x67\x6f\x3c\xe4\xc2\xa7\xb8\xf6\x37\xaf\x28\x3f\x67\xe8\x57\xf7\xef\x36\x29\x53\x92\x70\x9c\x38\x95\xbe\xff\x79\x63\x16\x24\x13\x51\xe4\x80\x13\xcd\x4a\x87\xad\x0a\x7b\x50\x79\x01\x16\x6d\xcc\x6f\x31\x9e\xf9\xa5\x31\xc0\xb9\xfc\xd1\x8f\x7a\x95\xf2\x8c\x2b\x85\xd9\x1a\xd7\xfa\xa1\xa8\xeb\xf6\x89\x56\x91\xa0\xb6\xf4\x8e\x2f\x89\x81\xc2\xf6\xf7\x2a\x05\x91\x0e\xfb\x75\x5d\x73\x83\x75\x51\xb2\xe0\x16\x64\xd6\x7d\x32\x09\xac\x62\xbd\xd1\x70\xe2\xf8\x3e\x6d\x8a\xb2\xd6\x45\x96\x16\x37\x7e\x36\x48\x82\xf4\x96\xed\xf2\xdb\xf3\xc3\x6c\x7b\xd8\xb6\xae\x75\x4c\x81\xd2\xa1\xe7\xea\x03\x3b\xf9\x5a\x14\x57\xc0\x16\x3b\x52\x87\xca\xb3\x23\x9f\x8a\x7a\xd4\x3c\x57\x9a\x50\x69\x94\x5a\xde\x81\x67\xd6\x5c\x7b\x70\x02\xf0\x3c\x88\x23\x07\x12\xca\xb2\x5f\x69\xae\x8a\x8f\x1e\x54\x08\xbc\x40\x20\xc5\x98\x8b\x26\x1e\xc9\x77\x4d\xe2\xe8\x0e\x25\x21\x3e\xa8\x88\x70\xfc\xd6\x3d\x5f\x83\x57\x0f\x3c\x2d\x50\x52\xa2\x75\xc0\xb3\x11\xcf\xa0\x6f\x0e\x7e\xa0\xb0\x2c\x60\xb6\xf9\x59\x9e\x1e\x7b\x60\x9e\x89\x78\x18\xfc\xd8\x43\x1a\x59\x9a\xeb\xa2\x07\x5d\x1c\xfe\x3a\x9f\x87\xb8\x35\x3f\xa4\xef\x70\x02\xdb\x8b\xbf\xe7\x67\x09\x57\xf0\x8d\xf1\x27\x45\xe4\xdb\x89\xed\x79\x29\x35\x7f\x37\xd4\x99\xaa\x2e\x4e\xe8\xb3\xd7\x2b\xd1\x40\x10\x2a\x34\x54\x1e\x74\xc7\xe2\xf6\x68\x4c\x71\xba\x64\x4f\x3f\xf4\xc9\x49\x51\x33\x08\xfd\x88\x07\xc3\x2e\x54\x91\x1b\xd5\xb9\x3e\xd9\x06\x42\xe2\xcc\xca\x79\x35\x3b\xa5\x9b\xb2\xd0\xe9\xa8\x31\x0d\xa1\xf2\x95\x85\x4c\xfe\x4a\x73\xe8\x94\xa5\x3b\x13\x46\x06\x91\x17\x9b\x57\x17\xdf\x2d\x8c\xd1\x46\xc9\x15\x44\x14\x10\xed\xfd\x50\x14\x03\x8e\x1d\x44\x3a\x66\x0e\x5c\xf8\x36\x06\x28\x41\x1c\x50\xf7\xf5\xae\x25\x33\xc8\xcc\x20\x0e\x74\xc2\x7b\x1b\x98\x85\xe6\x8f\xce\x12\xc9\xd8\xc2\x13\x67\xd5\xbe\x15\xde\x64\x40\x7c\x13\xf0\x1d\x50\x21\xe2\xf3\x32\x7c\xea\x81\x86\x0a\xdd\x65\x5e\x79\xb5\x3e\xd7\x55\xcd\x51\x9b\xb3\x15\xb4\x6e\x27\x89\x12\xc0\x08\x44\x9c\x2f\xfd\x08\x0a\x28\x70\xab\x82\x8b\x18\x0a\xd7\xff\x19\x37\x8a\xa1\xc9\xa7\xb4\xad\xd7\x22\x04\x6b\x0b\xd0\xac\xd6\xdd\xcf\x64\x3a\x24\xb6\x27\xfb\x57\x71\x2e\x8d\xd9\xa2\xc1\xb6\x0e\xe7\x99\xfb\x06\xae\xd2\x4c\x87\xcd\x72\xff\x06\x8c\x0e\x78\xac\x65\xaf\x12\x65\xba\x7a\xee\x18\x89\x31\x0b\x3d\xa0\x3b\xc3\x5a\x77\x15\x60\xe0\x92\x63\xf6\x9b\xe6\x3f\xd2\xaa\x9a\xef\x17\xa3\x89\xe7\xda\x77\x8d\xca\x79\xb3\xf4\x4c\x7f\xb9\xf0\x3d\x24\x49\x2f\x9c\x11\xb0\x01\x46\x8e\x1d\x3d\x18\xc8\x30\x72\x49\x2f\x2a\x87\x8c\x9d\x44\x86\xd2\x2c\xee\x43\x89\x97\xb4\x0e\xcd\x07\xd5\xdf\x4c\xdd\x08\xe5\x23\xbe\x19\x85\xe9\x8f\xe9\xe7\xd0\x3c\xd3\xf9\x4a\xdb\xc1\x4a\x26\x72\xd8\xe2\x75\x4c\x2c\x3b\x40\x47\x02\xdb\xc7\xe6\xfb\xd2\xe2\xdc\x3a\x0e\xa9\x76\x48\x2c\xf0\xb9\x9a\x9f\x2f\xab\x1a\x8e\xa3\xd5\xc9\x0c\xd2\x5e\xc8\x10\x8d\x64\xf3\xd3\x96\xc4\x3b\x98\x12\xed\x45\x7e\x60\x1b\xa0\xb8\x0c\x58\x0c\xca\x68\x94\x1f\xfa\xe8\x34\xff\xb8\x7a\xda\x1f\x5a\xdf\x50\xa6\x7d\x70\xaa\x0f\x56\x4a\xba\x32\xcb\x76\x4f\x30\x95\xe9\xc0\x0b\x31\xfa\x5c\x9c\x4b\x5e\xf7\xda\x06\x3a\x08\x8c\xb7\xd3\x7d\x3a\xb0\xa6\x67\x3a\x08\x79\xcf\xb8\xfa\x96\x5a\xe5\x2d\x49\x24\x1d\xc4\xd2\xd5\xa7\x8b\x77\xc0\xaf\x1d\xa3\xfd\x74\xc0\x62\x8a\x74\xfe\x2c\x85\xdc\x48\xf6\x9b\x3a\x48\x7f\x31\xbe\x41\x72\xd1\x01\xd7\x21\x6f\xaf\xaf\xad\x4e\xb5\x10\xb5\x29\xde\x85\x0e\x7d\xc9\x02\x47\x34\x0b\xd6\x7a\x34\xc5\x61\xa0\x9c\x0b\xce\x82\xd7\xff\x9f\xb2\x2f\x69\x6e\x1c\xc7\xf2\xff\x2e\x73\xaa\x43\x1d\x08\xee\xf8\xdf\x24\x59\x76\x6a\xd2\x5b\x4b\xca\xcc\xaa\xe9\xe8\x50\x3c\x00\x0f\x36\xc7\x14\xa9\x26\x29\x3b\xd5\x9f\xfe\x1f\x7c\x00\xb8\x89\xce\xaa\xc9\x4b\x46\x98\x10\x45\x91\x20\xf0\x96\xdf\x62\x95\xfb\xac\xe5\xae\x1b\x22\xd2\x0e\xd8\x49\x3e\xa7\x53\x5d\xa7\x7f\xfe\xeb\xf7\x71\x91\x41\x07\x32\xa4\x15\x64\xb5\x7d\xfa\x71\x43\x52\xc4\x3f\xd6\x9b\xe1\x13\x0c\xfd\x80\x78\xb8\x22\x6b\xea\x63\x96\x8f\x9f\x43\xd8\xa6\x3d\xa6\x3b\x54\x9e\x1b\x97\x82\x76\xd7\x13\x86\xa6\x06\x67\x3a\xf1\x9d\x43\xe8\x76\x88\xf8\xd2\xa1\x60\xf4\x05\xed\x1c\x7c\xaa\x40\xf6\x8f\x3f\xd4\x66\xd5\xfa\xfa\x0a\x59\x75\xce\xb7\x70\x04\xf5\x0a\xdd\x97\x47\xbe\x24\x4b\x42\xb2\xc2\xa5\x66\xdc\x97\xc7\x0f\xd6\x1d\x45\x34\x6e\xd5\x27\xf8\x28\xb2\xe2\x65\x9c\xd3\xe9\x98\x03\x9a\x4c\x46\xa9\xd5\x6b\x96\xab\x7d\xf9\x0c\xed\x5e\x37\xbf\x84\xe8\x58\x26\x68\xda\x34\x1a\x2b\x6c\xb3\xed\xac\x81\x91\x2e\x9d\x1b\xa8\x35\x95\x34\x8d\x2f\xca\x5f\xb8\xc4\xd9\xcf\x24\xbe\xf1\xc7\x59\x3d\x75\xba\x3a\x3a\x11\xc6\xf4\xe5\xdb\x72\xd4\x90\xd1\x29\xe3\x81\x91\x70\xec\xcd\xb3\x6f\xb3\x9f\x03\x84\xc4\xa4\x8e\xa4\xd3\x24\xe4\x36\x78\x6e\xf7\x54\x6a\x47\x50\xf8\xea\x4f\x66\x58\xaa\x91\x94\x87\x41\x1a\xf1\xbd\xba\x79\xf8\x73\x39\x19\xc3\x63\x49\x33\x7b\x21\xca\x73\xf3\x15\xf3\xf7\x2e\x19\xd0\x3c\xf1\xe9\x71\x59\xb5\x9b\xa1\xca\x9d\x86\xd8\xb0\xbe\x05\x34\xf2\xb5\x93\xff\xd8\x7f\xf9\xdc\x2d\x3a\xd5\x00\x1c\xd8\x20\xda\xbe\x76\x94\x4b\x35\x08\x45\x97\x73\xb3\x78\xea\xbe\x4a\x47\xa4\x3d\xb9\x5f\xd6\x98\xbb\x1c\x52\x0b\x0f\x64\x57\x4e\xb6\xa8\xab\xac\x2c\xcc\x2b\xed\xc6\xf8\x48\x7b\x54\x9b\xac\xec\x9a\xf2\x74\xea\x16\x54\x2d\x7d\x24\x40\xca\x9d\x61\xc0\x53\xd4\x39\xbe\x12\x19\x19\x55\x88\x8f\xa9\x8a\xeb\xe4\x59\x4b\xc9\x03\x9c\x9a\x59\x4d\x31\x0e\x5a\x89\x80\xaa\x5d\xdb\xf5\xd3\xca\x5d\x83\xd2\x2a\xc5\x2e\x08\x7a\x80\x3c\x97\xce\x2e\x71\xb6\x70\xaf\xd1\x17\x14\x12\x3d\x96\x4d\xa6\x33\x6a\x58\x93\xf3\xe5\x6c\x6b\x42\x6b\xc6\x68\x4d\xb5\x3b\xf4\x15\xe1\xb8\x1b\x26\x80\x75\xb8\x6f\x87\x5f\xeb\x6e\x94\x4e\x3d\x6a\xc9\x10\x0e\xcc\xea\xbf\x0d\x4f\xc0\x3d\x2f\xf0\xa4\x81\xca\x9c\xeb\x06\x55\x97\x37\xd6\xd3\x71\x92\x13\xd0\x65\x27\xcf\xaa\x5c\x75\x5c\x10\xee\xb1\x20\x8a\x8d\xd1\x2e\x09\x9d\xcc\x44\xf2\xdc\x63\x31\xa3\x37\x8a\x2e\xe3\x53\x1e\x61\x5f\xa8\xe0\x1e\x13\xc6\x93\xe1\xcf\xed\x1f\xee\x8b\xfc\x76\x1f\x6d\x27\x6d\xfb\x26\xf7\x18\x1c\xee\x05\x41\x40\x39\x78\x9b\x54\xd7\x37\x08\x2a\xcf\x5c\x21\x83\x7b\x41\x94\x52\x38\x60\x0b\x29\x03\xb6\x3f\xf7\x82\x24\xa4\x02\xd6\x0e\x9b\x1a\x65\x59\xa8\xfd\x1e\x7e\x8e\xf5\x1c\xdd\xc8\x34\x26\xf4\x9a\x82\x2c\xbf\x58\x52\x6d\x77\x16\x30\x04\xbd\x36\x91\xb5\x87\x46\xf0\x35\x37\x4c\xfa\x54\x7a\xa1\x55\xfd\x61\xf1\x47\xbf\xaa\x73\x2f\x8c\x3d\xd2\x4f\xa3\x0e\xdb\xd7\x2c\xcf\x27\x9f\x0d\xd3\x90\x38\x4a\xef\x06\x14\xf9\x39\x3a\x8e\x7b\x21\x18\x29\x7b\xdb\xc0\x56\x37\x70\xa9\xbb\xaf\x41\x96\x84\x4e\xa5\x76\x90\x1a\xb4\x47\x14\x7d\x6a\x8b\xa7\xf3\x50\x77\x96\x7b\x91\x67\x78\xd2\x77\x50\x2f\xcf\x97\xee\xaf\x22\xa1\x2d\x3b\x2f\x5f\xbe\x65\x57\x77\x2b\x66\x40\x89\xdb\x22\x6f\xba\xba\x6a\x1b\xbe\x8d\x7f\x54\x6c\x4b\x30\x0f\x8b\xc7\xc5\xdd\xba\xbd\x1d\x87\xe7\xf5\xf6\xb0\x7d\xfa\xf6\x78\xe3\xbe\x27\xd6\x21\x93\x4e\xdc\xe5\x1d\xf3\xf2\x34\xf1\xb8\x68\x87\xa4\xa4\x58\xbd\xb6\x11\xf4\xf8\x68\x12\x9b\x45\x64\xf3\xe5\x3c\xa4\x81\x70\x2f\x65\x31\xa9\xd2\x2e\x33\xe2\x8a\xef\xb2\xbc\xeb\x53\x73\x2f\x15\x3e\x4d\x35\xd3\x27\x75\x0b\xe4\xe8\xb6\x5f\xad\x90\xdc\x4b\x55\x40\x49\xdc\xe2\x61\xbd\x1c\x7d\x17\x67\xd2\x5a\x8f\xd4\x58\x35\xf7\xf0\x71\xf9\x44\x97\x93\x7b\x3c\x8d\x95\x72\x72\x33\x1f\xd6\x1d\x60\x76\x4a\x72\xd0\x54\x20\x7b\x85\x59\x4b\x30\xee\x71\xc5\x28\x2d\xb4\x51\x19\xd6\x03\x5e\x1d\xf7\x20\x06\x22\x8c\xec\x56\x87\x9c\x44\x3e\xbb\x03\x98\x90\x42\x1c\x35\xdb\xfe\xa7\xbc\x69\x67\xbc\xa1\xad\xd8\x01\x32\x0a\xd3\xc8\x68\xfa\xfc\xbc\x3c\x60\xf5\x42\xec\x2b\x7f\xaa\x63\x30\xc9\x7a\xb8\x27\x93\x08\xed\x4f\xeb\x70\x4f\xa8\xc6\xc6\xd1\xbf\x8f\x9f\x9e\x4c\x75\xd2\x2b\x1c\x0e\x72\x2d\xee\x49\x08\xb4\xee\x16\xbe\x7d\xb9\x44\x5b\xad\xee\x7f\x89\x94\x91\x71\x99\x3b\x5f\x48\x28\xcd\x64\xcf\xd7\xf6\xdb\xdc\x53\xb1\x56\xfe\x80\x89\x58\x41\x21\x5f\x71\x3a\x08\x8d\x20\x4b\x4d\xa2\x9b\x5b\x34\x3c\x41\x7a\xd0\xc3\x1b\x8b\x2c\x31\x8a\x2a\xa6\x76\xb2\xcc\xa7\x49\x5b\x3b\x44\x5a\xb4\x82\x81\xb8\xec\x1a\x3c\x75\x1f\xf7\x39\xfd\xe4\xfa\x2c\x8e\x59\xd3\xdf\x20\x77\x38\x61\x14\x6f\x74\x00\xe0\xf9\x72\x6f\x38\x8a\x97\xb8\x87\xa9\x07\x1d\x67\x9d\xc6\x3f\xe9\x39\xce\x26\xf7\x50\x59\x9e\x29\xf9\xc8\xd3\x26\xbf\x93\xaf\x78\x9c\xde\x0d\x54\x40\xd8\xfc\xdb\x0a\xf1\x3f\x63\x53\x25\xee\xe9\x40\x9b\xbe\xba\x81\x5f\x6d\xb1\x3e\x95\x45\x8d\x3b\x5a\x64\xbf\x40\xae\x47\x45\x29\xe6\xce\xa9\x43\xe6\x8a\xb2\x84\xf7\x1f\xf7\xee\xdd\x20\x08\x03\xab\xbb\x7c\x7f\xff\xdd\x50\xcd\xd8\x10\x3d\xc3\x19\xf3\x14\xc1\xb1\x9c\x9d\xc7\xfa\xf1\x86\x14\x1b\x76\xfb\xc5\x83\x5b\x73\x19\x8b\x7d\x25\x9c\x3c\xf2\xc4\x78\xbc\x3d\x1a\x50\x75\x0b\xab\xaa\xac\x16\x85\xb2\x74\x9a\xf1\xd7\x70\x9f\x7b\x4e\xe6\xff\x72\x6a\x4a\x95\xc1\xb1\x2c\xd4\xf8\x66\x30\x3f\x4a\xc0\x4e\x2e\xd3\xfe\xbc\x87\x42\x4d\xb6\x57\x16\x04\xa9\xe7\xda\x37\x43\x8a\xd0\xe8\x31\xb2\x40\x49\x5a\xb4\x16\xeb\xdb\xe1\x02\xc3\x42\x2f\x48\xc1\xe1\x6a\x8a\xb7\x6d\x99\xe7\x77\x55\xf9\xd1\xbc\xde\x96\x55\x9b\xee\x4c\xfa\x23\x9c\x85\x0c\x08\x43\x9d\x69\x7d\xee\xcf\xe2\x0b\x83\x5b\x1c\xa8\xd4\x8d\x96\x14\x16\x85\x26\x84\x59\x6c\xbf\xba\x0f\xc5\x7e\x40\x01\x14\x2d\x11\x63\x39\xbe\x39\x6b\x4d\xf7\xa9\xd8\xe0\x9b\x9c\x70\xe6\xc4\x16\x93\xb3\x38\x49\x09\xe2\x75\x5f\xbe\x98\x5b\xbf\xde\x7f\x99\x5f\x32\x59\x2c\x03\x6a\xe3\x14\x14\xbf\xad\x9b\x57\x83\xf8\xef\x4e\x95\x48\x49\xbd\xeb\x2f\x65\xf1\x72\xc4\x79\x79\x9e\x61\xf7\xdc\x7e\x2c\xe5\x7e\xe4\xa8\x7b\x14\xb6\x7c\xc2\x7b\xb3\xc3\xb9\x60\xb2\x2b\x14\x53\x87\xbc\x5e\x5e\xb6\x50\xbc\x5d\xbf\xa1\xf3\xb7\x84\x4b\x2e\x2d\x50\xfd\xae\xcc\xd5\x12\xda\x45\x79\x79\x59\x83\x7c\x1d\x3d\x6b\x08\x04\x71\x3a\x16\xdb\xd5\xcd\xe1\xf6\xdb\xe3\xcd\xe1\x66\xfd\xfc\xb4\x73\x05\x51\xce\x80\x6b\x52\x24\xa4\xde\xc7\x17\xa8\x97\x88\x85\x41\x51\xa3\xda\x97\x93\xac\x90\x33\x11\x47\x9e\xf3\xa4\xda\x28\x2c\x6c\x70\x3a\x58\x74\x98\x90\x60\x9d\xbd\x9b\xf3\xe9\xaf\x74\x9f\xfe\x4a\x1e\xc2\xed\x07\x4c\x72\x40\xbb\xd2\xf4\xa5\x32\x1a\x14\xf6\x63\xa4\x4f\x5e\x68\x7d\xf5\x65\xb3\x7a\x9a\x61\xc1\x70\xa6\x12\xe3\xcc\x63\xe4\x1e\x8e\x65\x41\x2b\xc8\x2f\x95\x36\x38\x53\x2a\x12\xb1\xb5\x8c\x25\xbf\xe0\xae\x76\x73\x80\xe6\x90\x7d\x4a\x7d\xe0\x0c\x3d\x16\x70\xbb\xc2\xe5\xd8\xe0\x7f\x97\xe2\xb7\xf1\x84\xc0\x30\x31\xfe\xf4\x65\x56\x0c\xaa\x2c\xf3\x55\x69\xce\x30\x35\xf1\x88\x3c\x1c\xe1\x67\x0f\xec\xd9\x95\xb9\xdb\xcf\x18\x6a\x53\x1c\xa0\xa8\xa4\x7e\x75\x62\x12\x96\x62\xc7\x99\x8e\x13\x32\x5c\xb4\xfc\xf4\x7f\x7c\xdb\x5c\x33\x12\x39\xd3\x10\x81\xe9\xb9\x17\x50\x5d\xc6\x28\xac\x4f\x6e\x93\x46\xa0\x7b\xfb\xf0\xf0\x77\x5f\x1e\xad\x95\xe9\x5b\x5b\xbe\xf2\xa8\x31\x39\xa7\x15\x34\x86\xb1\x8c\xae\xd8\xf7\x38\x06\x41\xe7\x11\xf7\xa4\xaf\x84\x0b\xdd\x38\x34\x2f\xba\x38\x5f\x9e\xfb\x46\xcc\x78\x9e\xf8\x4c\x9a\xcc\x73\x91\x0b\xac\x9a\x5e\x8e\x87\xfb\xbe\x17\x1a\x10\x47\x99\x93\xbb\xb0\xfb\x33\x02\x55\xbd\xc0\x86\x17\x63\x73\xc0\xf1\x9d\xf2\xc3\xd0\x88\xb6\x37\x58\x37\x03\xf9\x06\xee\x87\xa9\xa2\x65\x72\xf1\x33\xc3\x85\xec\xd4\xf4\x9d\x88\x04\xf7\x43\x1e\xa1\x05\x48\x61\x65\x10\x1c\x26\x21\xed\x06\x80\x08\xa8\x02\xb6\xf9\x3e\xbc\xea\x10\x14\x35\xa8\xca\x77\x68\xb0\x3f\x9b\x00\xd6\x63\x1f\x86\xfe\x36\xbf\x14\xc6\xe6\x7e\x24\xb8\x64\x9d\xb1\x62\x73\x8b\xb8\x10\xf5\xe4\x3e\x47\x2a\x4e\x07\x2a\xd9\xa6\x59\x41\xed\x9d\x5f\x70\x97\xb8\x1f\x7b\xcc\x96\xf9\x3e\xa0\x22\x31\xb8\x11\x91\x79\x32\x3a\x09\x53\xc2\xfb\x53\x94\x39\xe5\x3a\xce\x7f\x24\x4d\x19\x73\xa4\x08\x52\xdb\xee\x6e\x52\x9a\x2a\x63\x41\x01\x39\xf6\x4a\xf7\xdc\x87\x00\x93\x68\xd0\x24\x6c\xf3\xe3\x67\xb8\xd4\x93\x67\x4c\x1b\xd9\xf8\x41\x03\x1a\x13\xee\xac\xde\x81\xc6\xe7\x73\x21\x9b\x33\xf4\xc2\x75\xcc\x0e\x13\xbe\x26\xf6\x11\x28\xb5\xcb\xcb\x17\xb0\xd6\x54\xa3\x97\xc5\x17\xc2\x23\xde\x1d\xbe\xf7\x02\xe0\x6e\x05\xf4\x85\xf4\xa8\xfe\x7c\x82\xcb\xa1\x29\x0f\x4f\xeb\x07\x77\xf1\x92\x45\xda\xca\x74\x1c\xbe\x2f\xee\xbf\xad\xbb\x03\x56\x54\x6d\x5f\xe1\xdb\x00\x15\xcf\x7d\x19\x86\xd4\xa9\xfc\xb6\xde\x3f\x75\x7f\x4b\x13\x6f\xa8\x89\x44\x04\xa9\x6b\x7f\x48\xee\x4b\x61\x40\xe3\x2f\xd8\x3c\x55\xa6\x62\x6f\x99\x51\xe6\x7d\x24\xf8\xd8\x95\xfc\xca\x3f\x07\x00\x4e\xee\xab\x90\x51\xed\xeb\xee\x71\x3b\x79\x2d\xd1\x03\xd2\x38\x70\xeb\xef\x75\x75\x89\xfb\xe8\x1b\x04\x16\x01\x8b\x09\x85\x5b\xbc\x38\xd3\x48\x37\x24\x09\xc1\xca\xa7\x10\x28\x00\xab\x51\x9e\xeb\x63\xea\x53\x98\x25\xba\x74\x62\x7e\x2a\x21\x1a\x4d\xca\x0a\xb2\x1a\xf7\x70\x9a\x5e\x09\xa6\x94\x48\x3b\xf5\xad\x5f\x24\xe4\xbe\x86\x80\xb8\xcb\x4f\xc7\x22\xab\x97\x5d\x1a\x15\x78\xa1\x24\xe0\x35\xed\x53\x9d\xe9\xfe\xec\x39\x02\x8f\x7b\xca\xeb\xcc\x30\x6c\x95\x79\xf6\x2d\x0b\x18\x70\xba\x49\x74\x49\xdb\xaf\x89\xf7\x3f\xee\x0b\xfd\x28\x74\x10\x30\x0b\xb0\x46\xf5\x54\xa1\x05\x4f\x4d\xd6\xc9\xc0\x57\xd2\x33\xde\xc9\x0a\xf7\xa5\x0b\x69\x87\xf3\x36\xf0\x35\x50\x2f\x62\xf1\xbc\xf1\xdd\x97\x04\x9e\x29\x1f\xe7\x99\xa0\xe2\xa2\x00\xf9\xd6\xbe\x8f\xa3\x79\xd1\x55\xdc\xed\x86\x1f\x87\xa6\x12\x1e\x77\x1b\x7f\x10\x80\x1f\x82\xe3\x8f\xdd\x64\x15\xca\xe6\x86\xfc\xa2\xdd\x71\x19\x3b\xd2\xe2\x73\xf9\xd6\xee\xf7\x57\x9a\xc2\x3c\x08\x94\x4f\x4a\x88\xed\xdb\x77\x42\x99\x4d\x8c\xfd\x5d\xde\x11\x84\xa9\x27\x1d\x14\x81\x1a\x52\x5b\x5b\x3c\xb1\xf0\xb3\x2e\x58\x0a\xc2\xd4\xd4\x64\xcd\x1a\x56\xdf\x9e\x07\x91\xfc\xe4\x41\x84\xa9\xa6\x55\x12\x5f\x5e\xc6\x0e\xf1\xdd\xd7\x46\xbe\x0c\xfb\xce\xf5\xb2\xa9\x89\x9e\x62\xc7\xfc\x3e\x93\x20\x05\x51\x9a\xd2\xaa\x73\x84\x9f\xed\xfa\xb9\x2a\xcb\xb7\xcc\xcd\xfd\x20\xe2\x81\x0d\xdf\x9b\xad\x71\x32\xfd\x02\x85\xca\xa7\x66\x9c\x6e\xb4\xe0\x44\xc9\xfe\x5f\xea\x41\xb6\x59\x83\x3b\x4f\x9c\x84\xd4\x24\xb5\x18\x31\x8b\xe1\x9f\x17\x4e\xe0\x41\xcc\x53\x42\x23\x58\xd2\x30\x4d\xbb\x11\x04\x92\x07\x89\x1f\x10\xf4\x64\x38\x0f\xdc\xa1\x34\xa0\x35\x0c\x2b\x68\x53\xf4\x87\x2e\x99\x9e\x0c\xe3\x09\xb1\xae\xef\xb2\xe3\xd1\xd5\x61\xec\xa1\x34\xe4\x4e\xf6\xf8\xd6\xb0\xf4\xe6\xb7\xe6\x20\x8d\x12\x2e\xba\xfa\x75\x73\xae\x47\xfc\x4c\x37\x48\x78\x0a\x07\x92\x7c\x6d\x94\xb5\xb2\x82\xf8\xce\xbe\xbe\x1d\x85\xee\x4d\xea\xe5\x4e\x18\xef\x4e\xa2\x15\x95\xbc\x55\xf9\x51\xec\x87\x4a\xa9\xe3\x3b\xc7\x03\x46\xca\x38\x25\x79\x9b\x93\x69\xa8\x0b\xf5\x02\x1e\x09\xda\x12\x9e\xb4\x7e\xc0\xe2\xfc\x50\x56\x75\xb7\xb9\x07\x20\x0c\x60\x95\xba\x38\x4e\x33\x69\xf2\xfa\x82\x8e\x49\x02\x67\x59\xe1\x6b\x79\x45\x14\xbb\x0a\x02\x3e\x8b\xd9\xff\x8f\x7f\xb7\x5f\x2e\x42\x4d\xcd\xba\xa6\xf3\x6f\x7b\xf9\xe4\x1e\x88\x54\xd2\xfd\x26\xdc\xa0\xe3\x9b\xa9\xe7\xec\x27\xf6\x06\x09\xff\x64\xb1\x5b\x15\x84\x94\xd4\x85\x41\xe2\xfa\x98\xb9\xd6\xb1\x43\x79\x20\x93\xd4\xb1\x6e\xda\xd7\xc3\xb1\xf6\x26\xb7\x46\x42\x42\x74\x8f\xed\x7e\xc9\xdc\x27\x15\x63\xa4\x14\xb5\x2c\xf3\x66\x34\xbd\x14\x0b\x84\x75\x06\x3d\x6c\x56\x4f\x93\xc2\x6d\xa0\x7c\x6e\xf6\xe0\xac\x50\x47\x38\x1d\xc6\xf1\xf1\xf8\x7b\x55\x10\xa6\x7c\xe0\x3d\xb8\x7b\x2d\xab\xe6\xca\x7a\x90\x07\x08\x48\xbf\xc2\x08\xd6\xb5\x3b\xc3\x03\x8e\xae\x09\x15\x90\x16\xc9\x4b\xf6\x8e\x8b\xaa\xf9\x28\xab\x37\x8b\x37\xbc\x26\xe4\xda\x8f\xe8\x80\x11\x6f\x6c\xff\xb4\xdb\x14\x75\x93\x35\x06\x90\xfd\xa5\xcc\x09\xe1\x30\xc2\x8a\xf1\x40\xab\x50\xe1\x00\x1c\x57\x1b\xaf\xe2\xf1\x75\x86\x5e\x18\x06\xc6\xbe\xe3\x1d\xf3\xf3\x95\x21\xa3\x1b\x15\x01\x49\x8d\x3c\xe2\x47\xc7\x95\x9a\xaf\xf6\x85\x9e\x16\x94\x71\x77\x62\x07\x0f\xe8\xd8\xcd\x3c\x64\x81\x08\xcd\x4c\x29\x0a\x94\xcd\x4c\x85\x3d\x64\xb1\x4f\x08\x9b\x25\xd4\x99\x41\x7d\x5a\xf9\xaa\xee\x1c\xa9\x51\xec\xae\xb3\x97\xc2\xc9\x02\x8e\x57\x9a\x90\xa1\x11\x58\xa9\x0d\xaa\x69\xae\x93\xc3\x43\x1f\x8c\x9a\xf5\xc4\x4e\xe8\xff\xfa\xff\x5f\x59\x78\xf1\xd0\x97\x68\xa0\x18\x99\xa3\xa1\x91\x74\xfe\xf9\x44\x1d\x38\xb7\x2b\x85\x3e\x1a\x9f\x62\xed\xb6\xe1\x30\x08\x34\xf9\x0a\xde\x55\x88\xc5\x8f\xb2\xca\xd5\x2d\x54\x43\x20\x0e\x0f\x83\x30\x8e\x39\x99\xb9\x88\x6a\x80\x22\xe4\x61\xc0\x8d\xad\x0c\x49\x5f\x42\x53\x56\x93\xe9\x11\x86\xa1\x11\x3c\xdd\xac\x9e\x4e\x3d\xca\x93\x87\xa1\x48\x88\xc2\x64\xca\x9a\xe5\xc7\x2f\xb0\xcf\x3c\x0c\x55\x44\x50\x84\x36\x12\x6b\x86\xce\x44\x3c\x8c\xe2\xc8\x2d\xaf\xbd\x65\xfe\xae\x29\x4f\x83\x48\x2f\x8c\x30\x50\x06\x6b\xa3\x10\x8f\x03\x2a\x15\x0f\xe3\x50\xd2\x0f\xd0\xa6\x34\xe9\xba\x8e\x3c\x8c\x05\x27\x72\x9f\x95\x3d\x1b\x47\x0b\x61\xea\xa7\xd4\x4a\x5b\x82\xb8\x2c\x11\x46\xdb\x4c\x98\x62\x68\xe0\x84\x90\xcb\x07\xa8\xde\xb0\x4d\x8d\x7e\x1b\xe5\xb0\x76\x24\x4f\x8c\xe1\x7f\x47\xed\xe3\xa3\xa8\x29\xe4\x89\x69\x5d\x3b\x36\xe9\x76\x86\xcd\xe1\x86\x6a\xcf\xb2\x58\xe9\x85\x58\x37\xaf\xfb\xf2\xc7\xe0\x9d\x80\x98\xd3\x46\x23\xb1\x68\x6a\xdb\x16\x9a\x04\xcd\x21\x48\x20\x74\xf2\xbe\xc2\xa2\x1c\xfd\x24\xc1\xc0\xeb\x51\x5c\x37\xd9\xfb\x0a\xaa\x59\x9e\x38\x0f\xa5\x8c\x6c\xe3\xa8\x59\x5c\xa0\x68\x6e\xaa\x32\x6b\xd6\xb2\x2c\xca\x63\xf6\xef\x33\x1e\x56\xe5\xf1\xd4\xe0\x81\x4f\xbe\x5b\x05\x9c\xa6\x58\xd7\x84\xdd\xf5\xca\x3f\xed\x51\x81\x83\x72\xc6\x6d\x9b\x43\x65\x65\xe1\xf0\x37\xb3\xc5\x92\xf1\xeb\x81\x91\x11\xd7\xdd\x91\xa5\xad\x55\x7d\x1e\x60\x59\x78\xa8\x7d\x74\x60\x3c\xab\x03\x82\x55\xf6\x8e\xd7\x3c\x91\x2f\x50\xbf\x0e\xfb\x0b\xa1\x16\x3e\x45\x53\xb7\x59\x4e\xf2\x77\x9b\xae\x1c\x16\x6a\x34\x75\xdf\x21\xad\xf4\x3e\xab\x9b\x87\x69\x9e\x10\x6a\x1d\x33\x3b\x17\xbe\x66\xcd\xb4\xf7\x1a\x79\x20\x89\x0f\x57\x95\x79\xbe\x2d\xcb\xab\xce\xa8\x1d\xc6\xc0\x37\xd3\xc0\x36\x72\xe0\x48\x84\xd3\x01\x47\xa4\xab\x98\xfc\x93\xff\xeb\xd7\x65\xc6\x88\x69\x43\xe6\xa4\xa9\x60\xfd\x18\xec\x0f\x8b\x7c\xdf\x77\x0a\x54\x94\xd3\x19\x79\xe5\xfa\x50\x4b\xe8\x63\x93\xc8\x17\x31\xb1\xb1\x0e\x95\x89\x0c\x1d\xd8\x70\xfe\x45\x8f\x82\x30\x34\xc6\xcc\x26\xcc\xfd\x5e\x9e\xe5\x2b\x56\x0f\xcd\xeb\xba\x79\xed\x41\x85\x3c\x0a\xd2\x94\x5b\x79\x38\x22\xa1\x98\x93\x4d\xf5\x4d\x3e\xf9\x55\xa1\xa7\x89\xab\x58\x94\xd5\x31\x7b\x83\xec\xbd\x74\xa7\x0d\xa5\xe1\x58\xfc\xf7\xb7\x9d\xab\x90\x46\x91\x0f\x94\x20\x93\xac\xcb\xa6\x78\x2f\xdf\x88\xf4\xe7\x8f\xb8\xfd\xe3\x52\xc3\x75\xbb\x2f\x8a\x42\x4c\x44\xdf\x34\xba\xc5\x46\xbe\x0e\x56\xa8\x28\x0a\xb5\x48\x5c\xed\xf2\x2c\x9b\xef\x70\xce\x9b\xee\x60\x1c\x93\x18\x44\x97\x72\x18\x34\xe6\x1d\x1c\x49\x88\xdd\x9f\x5f\x11\xa2\x38\x32\x3c\xd3\xed\xfa\x6e\xb3\xdb\xaf\xb7\xb7\x6b\x97\xf5\x47\x31\xf8\xc4\xde\x3f\xa2\xca\xce\xc7\xbe\x57\x1b\x25\x09\x23\x95\xd5\x15\x54\x05\xbc\x8c\x42\x89\x28\x49\x03\xd5\x1e\x33\x6d\xf1\xc1\x9b\x13\x25\xa0\x28\xff\x73\x3d\x2a\xca\xf8\x9d\xff\x1d\x8f\x12\x1d\x50\xb1\xec\xeb\x3b\x14\x8e\xe6\xe2\x8e\xa5\x41\xc8\x92\x39\x0b\x8f\xc9\x33\x9c\xb9\xa7\x29\x37\xa7\xb5\xb6\x7a\xdb\x32\xbf\xd2\xd1\xe9\xc7\xca\x38\xb6\x80\x94\x7a\x28\x78\xec\x0e\xab\x28\x0a\x3a\x1f\x21\xa3\x12\x73\xa8\xa0\xc1\xc3\x09\xab\x83\xe9\xf7\x77\x57\xac\x3d\x23\x54\x5b\x41\xdd\x64\xf2\x01\xa1\xee\x9c\xb3\x79\x04\x2c\x22\x6d\xbf\x36\xd8\x1e\x13\x7f\x79\x04\x3e\xe7\x36\x54\xb2\xfd\xc5\x1d\x92\xfb\xff\xf8\x62\xc0\x17\x04\x8e\xba\xc1\x73\x3d\xe8\x64\xb8\xa3\x89\xe9\xcb\x1f\x9a\xf2\xbe\xbd\xae\x89\x1a\x1f\x8f\x40\xc4\x84\xe7\xbb\x5b\xec\x0c\xf8\x79\x64\x4b\xdf\x26\x0b\xc6\x04\xaf\x5d\x9f\xb3\xea\xa6\x2a\x4f\x13\xa9\xac\xc9\x8a\x22\x7c\xf4\x6d\xb3\xe2\x5b\x51\x21\xa8\xc9\xa2\xeb\x86\x85\x1e\x79\xf2\x1c\xec\x14\xb7\x4b\xce\x80\xda\xd1\x8e\x01\x2a\x6f\xdc\x97\x86\xd9\xb0\x1b\x82\xf2\x06\x46\x90\x6e\x78\x04\xa4\x21\xa0\x11\x7b\x6e\x37\x8f\xa4\x30\x06\x8d\xaa\xfc\x51\x56\x6f\x8b\x42\x3d\xc3\x65\xbd\xe8\x5e\x58\x29\x53\x92\x34\x39\x95\x1f\x68\x5c\xad\x87\x92\xdc\x3c\x92\x2a\x36\xfd\x46\x9a\x35\x23\x77\xd0\xf9\x25\x55\x71\x10\xce\xb8\x0d\x9c\x23\x1d\x8f\x30\x34\x3e\x03\x54\x61\xaa\xdb\xd7\x75\x7c\x43\x30\xe2\xa4\xbf\xb6\xd8\xae\x9e\x1e\x17\xee\x53\x3a\xf5\x90\x9b\x10\x77\x57\xea\x66\x35\xdd\x06\x22\x0d\x92\x04\x39\x0c\xb4\x73\xa6\xde\x6e\xc6\xc5\x9e\x65\x22\xec\xbe\x6f\x5c\x86\x11\x7b\x56\x56\xc1\x74\x18\x6f\xce\x98\x0f\xaa\xbf\xb1\xa7\x38\xf5\xf1\xc8\x8e\xe9\xeb\x59\x7d\x62\x65\xcb\x63\x16\x00\x41\xb6\x8f\xd8\xc0\xee\x1a\xc3\xee\x46\x85\x09\xf1\x41\x1f\xa0\x91\xaf\x4b\x43\x65\xfa\x44\x97\xea\x57\x10\x3a\x1e\x07\x1e\x23\x07\x4f\xa3\x3f\x95\x1d\xb1\x3c\x37\xd7\x5e\x7c\x3c\x0e\x58\xca\xf0\xaf\x03\x0b\xe6\xfd\x36\x39\x3f\xa4\xb4\xde\x8f\x34\x0e\x7f\x55\x1c\x8e\xc3\x48\x40\xcf\x6d\xd9\x35\x78\x6a\x23\x69\x22\xa9\xf7\x05\xca\x38\x8c\x7d\x7a\x31\x0e\x64\x00\x62\xc0\x17\xc4\xf6\x22\x9e\xe3\xf8\xb5\x8d\x43\x1e\x50\x27\xee\x08\x6f\x36\xa2\xf8\xad\x3b\xa2\x3c\x5b\x94\xb0\x02\x12\x13\xbe\xb2\x1d\x17\xb1\x44\x6a\xcb\x8a\x1e\x62\x2c\xe2\x88\x29\x61\x37\x43\x0b\x1d\x9d\x7c\x50\x04\xaa\xd3\xf7\x22\x28\xfb\x53\x47\xce\x77\x43\x10\x22\xdb\x35\x79\xbe\x9d\x53\xce\xe3\x71\xc2\x14\x49\xb2\xec\x40\xc2\x20\x03\x88\x93\x54\x84\xf6\xa3\x2e\x2a\xdb\xbf\x56\x88\x33\xed\xa4\x38\x15\x46\x3d\x7b\x57\xbe\x60\x93\xed\x49\x81\xa4\x3f\x13\x0f\x3c\x7f\x7c\x23\x46\xda\xf4\x23\xb5\xfe\xeb\xbf\x31\xcf\xfb\xd7\x9c\xa0\xff\xaf\x43\x9c\x98\xb7\x7b\xfe\x7f\xfd\xbf\xff\xfa\xb1\xf9\xba\x21\x31\xd6\xbf\xec\x57\xc5\x5c\xf8\x51\x6c\x5b\xdf\xe6\x4e\x4e\x2d\x66\xc6\x5f\x01\xa1\x89\x5d\xdb\xbf\x5a\x91\xba\xf9\x1d\x3b\x86\xd4\x23\xae\xd4\xc0\xf0\x63\x32\x5f\x07\xd3\x4f\x84\x01\x55\x3d\xf3\xac\x69\x9c\xba\x2e\x8f\x45\x2a\x92\x78\xd0\xcc\x51\xd9\x7b\xa6\xce\x90\x0f\xfd\x37\x26\x2e\xa5\xb3\x3d\xea\x58\x0a\xa0\x9a\x9f\x1c\xf5\xb3\xe7\x7f\xa1\x94\x9a\x60\xed\xab\x52\xbe\x0d\x77\xbc\x58\xf9\x0c\xa0\x37\xce\xb8\x5e\x8d\x63\xe5\xab\xd8\x96\x5d\x17\xcd\xdb\xb2\xac\xeb\x7f\x9c\x71\xa2\xee\xcf\x63\x15\x30\x4f\x59\x37\xa7\x23\xce\xf2\xbe\x79\x8c\x90\x38\xb6\xc8\x53\xf5\x02\xc5\x63\xe7\x1b\xc5\x63\x94\x8c\x76\xa7\x65\xf6\x62\x1c\xad\x06\xf3\x0e\x55\x8c\xa6\x05\x02\x45\x0d\x34\x83\xad\x7f\xc2\x75\x21\xf3\xf7\x39\x1c\x4c\xac\x03\x3f\x4c\x9c\x56\xc5\x0f\xe8\x92\xc8\x58\xc7\x46\x39\x2d\x93\xb6\x97\x7e\x6c\xb3\xaf\x61\xbf\x3c\xd6\x49\x4c\x05\x9a\x3b\x8b\x6e\x78\xc8\x8a\x71\x47\x3d\xf1\x42\x61\x38\x48\xf5\x42\x4a\x3c\x35\xa8\x36\x47\xdb\xd1\xb0\xae\x3f\xd3\x64\x21\xf1\x12\xdf\x99\xda\x5b\xe9\xde\xd1\x09\xd1\x27\x25\xad\x67\xa8\x2e\x23\x00\xfe\xf5\x64\x6f\xc3\xc1\x54\x39\x1e\x70\x9d\xbd\x8c\x49\x38\x3c\x61\xd2\x18\xa4\xbe\x9c\x4f\xc3\x27\x9f\xf8\xcc\xa7\xfc\xde\x10\x07\x6f\xcb\xca\x34\x69\xdc\x51\x61\xf6\x8e\x57\xc8\x1b\x54\xb7\x0e\xb6\x99\x04\x22\xb5\x8e\xa3\x0d\xe4\x96\x3b\x31\xcc\xb4\x92\xd0\x33\x26\xb7\x79\xf6\xef\x73\xa6\xb2\xe6\xb2\x50\x2e\x30\x4b\x22\x2f\xa0\xa0\x56\x9c\xab\xa2\x4f\xe4\x93\xc8\x33\x92\xc9\x64\x37\x7d\xad\x25\xc8\x93\x88\x71\x3a\xe7\x2e\x2b\x48\x94\x2d\x6b\x2e\x8f\xb6\x98\x35\x32\xe0\x18\xff\xf0\x28\x50\xd8\x41\xdf\x0e\x54\xd7\xea\x4e\x18\x09\x72\x4b\xde\xac\x9e\x56\xa4\x92\xe6\xfe\x2e\x3d\xba\xef\x79\xf9\x72\x83\xe2\x3c\x12\xd2\xe5\x49\xcc\x62\xc2\xc6\xfe\x59\x9e\x7f\x64\x9f\x12\x24\xdd\xe0\x20\xa6\x18\xe8\x94\xc3\x65\x8e\x94\xc6\x93\x38\x0e\x55\x77\x2b\x3b\xa5\x41\x77\x29\x71\x12\x4b\xc3\x78\x44\xf9\xd6\x21\xec\x8c\x0f\xe0\x78\x2a\xc5\x09\x50\x97\xec\xf6\x7e\xf5\x2b\x4c\x42\x12\xab\x80\x64\x34\xda\xbd\x61\xe0\x9d\xc4\x93\x58\x47\xd4\x44\xb7\x2e\xe9\x37\x65\x57\x63\x4b\x62\xcd\xd1\x36\x90\x17\x2f\x55\x46\xfd\xc7\x55\x9b\x00\xbc\x5f\xcb\x08\xf0\x24\x61\x9e\xe1\x72\xdf\x3f\x6d\xff\x74\xa7\x48\x12\xc5\x2d\xf5\xd7\xe0\x2f\xa9\x95\xe5\x7c\x2b\xdc\x20\x60\x84\x31\xcd\xea\xae\x99\x35\x0f\x9a\x4a\x12\x11\xf3\xce\xe8\xc9\xd6\x33\xe7\x22\xc4\xf9\xa7\x92\xf2\x38\xa1\x62\x57\x57\x81\x9b\x77\x75\xe0\x49\x2a\x90\x90\xc6\x9d\x31\xaf\x31\x69\x77\x17\x9c\x6a\x8f\x59\x59\x3e\x67\x1d\xb0\xbd\xca\x5a\x92\x36\xc8\x94\x1d\xf1\xd2\x04\xa1\xdf\x0a\x99\xe3\x03\x56\x6f\xa4\xc9\x5a\x8e\xc1\x73\x56\x1e\x82\x27\x5c\x24\xb4\x2e\xaf\xd6\xfb\xc5\x6a\xbd\x98\x9e\x57\x7a\x9e\xc5\x42\x8e\x28\x48\xe3\x9f\xc0\x51\x87\x9d\x45\xcf\x32\x9b\xa0\xc6\x12\xf0\xcc\x02\x70\x28\xf0\x63\x26\x16\x48\x80\xf9\x54\xb9\x86\xa6\x29\x3f\xb0\x79\x1d\xf7\x81\x12\xf0\x25\x81\x79\x0b\x0b\xb4\x7f\xb8\xb4\xe1\x5d\x59\x0c\xdf\x27\x80\x80\x69\x0b\x51\xb6\xb2\xf9\xf3\xef\x82\x90\xb1\x34\xd5\xf4\xc6\xaf\x9b\xea\xb7\xd1\x41\x19\x86\x18\xf6\x04\xe5\xed\x54\xdf\x9c\x27\x32\x4d\x49\x75\xad\xcb\xbf\x6d\xf6\x76\x93\xd5\x4d\x7b\xcd\x9b\x62\x3b\x34\x77\x70\x9f\xc2\x98\x48\xb3\x58\x28\x18\x94\x5f\x06\xa7\xd5\xb1\xe1\xd7\x43\x03\x35\x36\x87\xfa\x15\xfc\x28\xa6\x37\xb2\x76\x84\x4d\x9e\x28\x5f\x91\x47\x93\x71\xf4\xcc\x06\x01\x68\xa2\xd2\x30\x09\x2c\x47\xa7\x7a\x77\xcd\xd9\xa9\x4e\x19\x4f\x94\x62\x44\xd0\x55\x48\x36\x50\xab\x8e\xc1\xc3\x13\xf4\x7c\xca\xe9\x3f\xca\xea\xf8\x5a\xe6\xb8\xa9\x07\x90\x87\x44\x7b\x8c\x3b\xa7\xb0\x23\xbc\xe0\x17\x72\x51\x9c\xc5\x63\x26\x3a\x88\x88\x45\x6f\x18\x42\xe4\x4e\x75\x15\x35\x7c\xe2\x8b\xfe\xfb\xa8\x63\x96\xe8\xc8\x53\xe9\xd0\xfe\xab\xd9\x67\x48\x1a\x9f\xd2\x79\xa3\xb5\x83\x98\x01\xe0\x2c\x1e\x46\xfb\x8e\x56\xc2\xce\x09\x7a\x9a\x54\x63\xf9\xf5\x52\xaa\xb5\x22\xf9\x86\x7f\x9f\xa1\x6a\xb0\xba\x2d\xcf\x55\x57\x35\x4d\x3d\x26\x0c\xa3\x0f\x5e\x5e\x71\x21\xff\x7d\x1e\xab\x87\xf2\xd4\x4b\x41\x6b\xab\x0b\x91\x15\x2f\xd6\xaa\x6a\x74\xff\x53\x4f\x21\xfa\xc3\xf9\x43\xf6\x18\x7f\x13\x02\xe7\xce\x81\x32\xb5\x78\x86\x39\x84\x77\xca\x12\x11\x0e\x34\x91\xbe\x63\xdd\x38\x89\xcc\x76\xf3\x1d\xe8\xe2\x8d\xaf\x8d\x09\x45\x85\x91\xa1\x55\xb4\x5b\x72\x1e\xe0\xa7\xbb\x0f\xbe\x87\x04\xc6\x30\x9c\xe3\xdd\xb9\xe8\x3d\x40\x78\xea\xfb\x11\x45\x39\xaf\x65\x43\xc1\xdb\x8c\x16\xc1\xe4\xd7\xf8\xa9\x8f\xbc\x53\xd3\x98\xf8\x1c\x0d\x1a\xfd\x6e\x38\x26\x84\x06\xb7\xcd\xef\x2c\xcf\xb3\xb2\xa8\x49\xbd\xba\x73\x91\xdd\x97\x37\x55\xe9\xa6\x47\x1a\x86\xc6\x63\x1a\x28\x62\xb2\x8c\xbb\x19\x05\x3a\x9e\x86\x89\x4e\xac\xbc\xfd\xb7\xa2\x2e\x73\x35\x02\x81\xa4\xa1\x0e\x3c\x8b\xec\x7c\x80\x9f\x26\x16\x19\xff\x96\x88\x21\x4d\x7c\x2b\x1d\xd3\x09\xf8\xa5\xd3\x82\x55\x1a\x2b\x1e\xc4\x53\xb1\x55\xa7\x6d\x35\x3e\x69\x12\xa7\x14\x51\xd3\xfe\x3e\xbb\x55\xa5\x49\xaa\x22\x37\xe4\x50\xcb\xac\xae\x7b\xa0\x66\x9a\x70\x41\x75\x3c\xb3\x8f\x65\x47\xdc\x14\x3b\x94\xdd\x51\xe1\x3b\x08\xbb\x63\x4e\xcf\x4a\x37\x4f\xbe\x31\xf5\xa5\x32\x76\x7a\xed\x67\xc6\x32\x00\xa4\x51\x4d\x30\x5d\x6a\x30\x4c\x81\x00\x76\x0c\x87\x08\x6c\x0a\x6f\x30\xc0\xfa\x19\xaa\x26\x93\xd9\x09\x8a\x09\x91\x8a\xa7\xc0\x34\xcd\xb9\x13\x09\x4b\x6e\x21\xeb\x77\xf4\x14\x24\x23\x0f\x95\xc5\x66\x7b\xb3\x7d\x7a\x3e\xec\xb7\x8b\xc7\xdd\x66\x3f\x76\xb8\xe7\xa9\xf0\x7c\xaa\x85\x1d\xda\xa4\xf9\xb9\xca\x8e\x65\xa5\x32\x98\x37\xf6\x72\x1f\x49\x7c\x02\xcd\x7f\x40\x83\xd5\xbe\xc2\xe9\xe3\x16\x29\xa7\xb4\x2b\xab\xef\xf1\x05\xf2\x41\x11\x37\x15\x60\x54\xff\xc4\x39\x7f\x9b\x8a\x17\x7f\x2a\x7f\xcc\x53\x81\x9e\x1a\x11\x6d\xf7\x65\x1b\x8a\xe6\x53\x7b\xa9\xc9\x85\xca\x50\x47\xd6\x24\x61\xdd\xbc\xba\x77\x76\x46\x83\x83\xa7\x12\x44\x62\x89\x6b\xe6\xba\xca\xea\xb8\x87\xea\x05\x9b\xc3\xa9\x2c\x27\x3d\xef\x14\x45\xe8\xc0\xc5\x5b\x28\xde\xbc\xc0\xfd\x3e\xcd\x7d\x12\xe7\xd9\x3c\x0e\x38\x5d\xdc\x13\x01\x74\x34\x7c\x8a\xae\xed\x35\xb8\xe3\x4a\x70\xbf\x2b\x4a\xed\xce\x23\x3e\x30\xe7\xcc\xf7\x49\xf3\x6a\xf9\xc5\xc1\xc4\x79\x90\x24\x14\xd7\x98\x97\x77\x99\x97\x6f\x3d\x01\x75\x50\xb5\xe0\x81\x36\x0c\x73\xe1\xdc\x8f\x86\x8a\x61\x9c\x87\xc8\x48\xec\x61\xa1\xd4\xaa\x2c\x9a\x21\xa4\xe1\x93\xd4\x77\x3e\x15\xe6\x91\x10\x94\x4d\x61\xf3\xaa\xcb\xea\x14\x28\xd1\x15\xcc\x79\x9c\xa4\xd4\xb5\xc9\xa1\x6e\x4c\xee\xe8\x8e\x70\x6e\x54\xb4\xee\xb0\xa1\xdc\x67\x53\xbc\x77\x87\xc0\xa0\x99\xd7\x7f\xee\x47\xf7\x82\x0b\x45\xd3\x75\xbb\xd8\xaf\x0f\x96\x90\xe0\x8e\x01\xe7\x71\xe4\x16\xa2\xa2\x57\x13\x9c\xac\xb3\x23\xf8\xce\x70\xa1\xe3\xc2\x4b\x08\x09\x92\xd5\xb6\xf0\xf8\xa5\x2b\x21\x71\x11\x99\x46\xcf\xed\x62\xb7\xde\xff\x75\x09\x84\x4b\x01\xa4\xf0\x77\x33\x23\x18\xf8\x09\x32\x97\x4b\xd4\xf4\xca\x5a\xac\x0c\x35\x9a\x57\xe7\x93\x09\x5b\xeb\x29\x77\x77\xfc\x3f\x73\x8f\x42\x05\x06\x80\xde\xcb\x6f\xde\x65\xef\xfd\x0d\x54\x81\x2d\x71\x62\x73\x87\x85\xad\xb3\xb8\xa8\x97\xab\x30\x16\x43\xbb\x70\xea\x17\xbd\x67\xf8\x31\x2d\x76\x71\xa5\x8c\xa5\x61\xfb\x76\xd8\xe6\xd2\x0a\x4e\x6d\x18\xe2\xba\xe6\x1c\x45\x6c\x94\x8d\xdc\xe4\xdb\xbf\x3a\x25\x1f\xce\x35\x4b\x49\xbb\xf4\x5c\xd4\xc6\x5e\xdc\xfd\x3d\x14\xd6\x91\x28\xef\x72\xb2\x91\xb8\x21\xe7\x3a\x8a\x09\xf9\x4a\x2c\xd6\x9e\x51\xcf\xc1\x0b\x7c\x69\x9e\x9f\x8d\x8a\xec\xf2\xb0\x45\xf8\x4c\xb4\xb2\xfd\x90\x4c\x0c\x06\x0d\xf2\x79\x93\x30\x0e\x2c\x09\x42\x1b\x00\x7f\xc9\x94\xc2\xe2\xbe\x7c\xc9\xe4\x74\x10\x84\x4e\x50\xf5\xa1\x54\xc6\x64\x67\x58\x54\x00\x1f\x99\x49\x46\xda\xd4\xfa\x1e\x9a\xfb\xe2\xe5\xf6\x9c\xe7\x76\x2b\x1c\xce\x04\x08\xd0\x18\x13\x34\x58\x37\x8f\xf8\x02\x4d\xf6\x8e\xed\xb3\x78\xc1\xea\x2b\x8e\xf2\x7d\x08\xb4\x47\x6c\x82\xaa\x0d\x3c\x93\x49\x65\x17\xc2\x10\xa9\x46\xb5\x5c\xff\xe1\x6a\xe0\x10\xa6\x31\xdd\xe2\x13\xc8\xb7\x91\xc0\xd6\xe0\x63\x29\x52\xcf\xe9\xd6\x74\xd5\x3b\x78\xd0\xac\x08\xdd\x67\x28\xa6\x4f\x7b\x7d\x10\xa9\xc4\x54\x83\x5c\xb8\x37\x15\xab\xe0\x10\x73\xc3\x04\xff\xba\x5a\x51\x06\xe8\x2e\x3e\xd6\x89\xea\x69\x78\x5b\x13\xd7\x8f\x02\x12\x48\x22\xdf\xee\x16\x06\xdb\x39\xb5\x91\xe5\x90\xf0\x84\x5a\xce\xdd\xde\xdf\xae\xc9\x7e\xf7\x79\x91\x46\x89\x31\xf1\x54\xb5\x83\x92\x5e\xf7\x4c\xfb\xd1\xa9\x15\xee\x59\x9e\x2f\x58\xb5\x8f\xf4\x1a\x86\x04\x09\x72\xc7\x8f\x3a\x58\x70\xdf\x21\x93\x65\x91\xfd\xfb\x40\x12\xde\x35\xf5\xd1\xb0\x57\x0e\xe1\x90\x46\x31\x06\x4e\x02\x80\xde\xe4\x41\x83\x17\xd2\xd4\xa8\x31\x9f\x4f\x2f\x15\xa8\x4f\x40\x40\x90\x6a\x9f\xfa\x1d\xeb\x42\xb6\x9b\x8b\x0d\x78\xdd\x39\x38\x18\x91\xe0\xe5\x66\xbf\x33\x3c\xd5\x21\xa1\x17\xb8\x94\xc2\x68\x36\xe0\x43\x56\xe0\xc8\xb8\x95\x03\x44\x8a\xda\xdb\x04\x2f\xeb\xfe\xc8\x03\x6a\xae\x17\x67\xea\xaa\x77\xcf\x44\x40\x8a\x63\xe6\xc9\xdf\xe3\xf1\x80\x00\x10\xd6\x39\xcb\x00\x45\xf6\xe5\x0f\xa8\x47\xf0\x3e\x10\x2a\x21\x91\xd0\xdb\xcd\x76\xb7\x27\x8a\x1a\x4d\x99\x1e\x58\x06\x32\x8c\x62\x3e\x74\xc4\x35\xe1\xf3\xf5\x14\xb5\xe3\x15\x67\xd2\xe8\x31\xaa\x51\xab\x62\x72\x77\x31\x36\x10\xea\x1f\x14\xa4\x8f\x7e\xd1\xd8\x7e\xb4\x3f\x73\xbb\x14\x11\x79\xb5\x21\x6a\xf9\x7e\x88\x9c\x99\x0e\xd5\x26\x8e\x6a\x17\x94\xcb\xba\x68\xb2\xe6\xb2\xcb\x8e\xa7\x29\xd2\x06\x74\xc8\xd8\xc0\x6c\x14\xa7\xe9\xe7\xe4\xa2\xb5\xe0\xa2\xf7\x55\xf9\x6e\x60\x49\xa8\x5c\x06\xe0\x6e\x49\x78\x1d\x8e\x31\xff\x5f\xbf\xcf\x24\x08\xc2\x53\x92\x00\x5c\x50\xe1\x22\xcf\xbf\x9d\x4e\x58\x49\x70\xd1\xaf\x4b\x7f\x05\x03\x25\x8c\xbe\xe1\xb7\x1a\x2b\x53\x74\x1d\xbf\x24\xc2\xf7\x13\xcf\x6a\xdf\x13\x61\xab\x50\xd3\x01\xdc\x73\x1a\x65\xce\xb0\x66\x0d\x55\xf1\xad\x68\xb2\x7c\x84\x06\x16\x3e\xf8\x04\xa7\x2b\xb5\xce\xb3\x02\xef\xce\xd0\xc6\xb5\x05\x11\x80\x3e\x59\xb0\xec\x27\xc3\x38\x22\x19\x40\xe9\x1a\xd0\x2f\xbd\x47\x09\x17\x61\x02\x3a\xed\x2a\x4a\x07\x12\xbd\x51\xd0\xc0\xe1\xa5\x2a\xcf\xa7\xfa\x40\x74\xfa\x43\xdd\x09\x77\x71\x11\x82\x47\xb5\x85\xe5\x7e\x7b\xef\xfe\x16\x45\x01\xb5\x84\x1a\xac\x8e\xf5\x88\x98\x22\xa2\x54\x53\x0d\x2f\x93\xe5\xf3\xb9\x7e\x6d\xf7\xd6\x79\x20\x8b\x88\x84\xa9\x0f\xbd\x96\x55\x6d\xd4\xda\x66\xaa\x48\x22\x0e\x7c\x2a\xde\xb4\x89\x24\xb1\x5a\xdc\x17\xc5\x3a\x02\x66\x83\x6a\x27\x50\x3a\x5a\x48\x45\xe2\x33\xab\xde\xfe\x01\x95\x5a\x37\xaf\x8b\xfe\x81\xb8\xb5\x5c\x24\x89\x17\xf8\x1d\xc5\x65\x79\xbe\x5c\x9b\xf2\x71\x91\x06\x3a\xe8\x73\xc4\x2d\x2a\x3c\x9e\xae\xeb\x3d\x22\x6d\x77\x33\xd3\x55\xac\xb2\xe6\x32\x2e\x78\x89\x14\x83\xd8\xd0\xcb\xf2\x12\xac\xf8\xe5\xf5\x4a\x2b\xc0\xf2\x94\xcd\x05\xad\xce\x75\x53\x1e\xb1\xb2\xe7\xba\xda\x0b\x04\x28\x03\x73\x6c\x9f\xe4\x42\x29\x2a\xf0\x66\xc5\xcb\xf7\xb2\xe9\x9f\x89\x48\x8d\x86\xa6\x55\x3d\xa0\xe8\xf2\x93\x5c\x45\x88\x34\x21\x67\x60\x7d\x2e\xb0\x82\x7c\x51\xa8\x65\x56\x35\xd6\xcb\xf7\xf7\x99\xb7\x47\x7a\x40\xfe\xa2\xf8\xf3\x94\x55\x97\x41\xb6\x24\x64\xea\xc7\x46\xfe\xb5\x79\xc0\x63\x59\x5d\x16\x55\x05\x97\xee\xa8\x60\x46\xab\xe2\x35\xab\xd4\x0f\xc4\xb7\x07\xc8\x0a\xe7\xba\xbe\xae\x9b\xec\x38\x78\xd8\x4a\x72\xa3\x5a\xdc\xae\x66\x0b\xa5\xb2\xeb\xea\xb1\x40\xf0\x8c\x35\x72\x9e\xdf\x96\x55\xa7\x5e\xc9\xa5\xe7\x19\x03\xbb\x17\x6c\x16\x4d\x03\xf2\xcd\xdc\x7b\xf2\x98\xb6\x43\x7c\x4f\x06\xd6\x2e\xaf\x0d\xd5\xf6\xe5\xad\xf3\x78\xd1\x0d\x56\x9d\xe6\x15\x97\x7e\xa8\x88\xee\xbe\xeb\x4a\x57\xdb\xb2\x3c\x2e\x0a\x65\x1a\x0e\xc3\xbb\xda\x47\x16\x7d\x45\x4f\xfa\x89\x0a\x7b\x0b\x35\x63\x8d\xf0\x30\x11\x3e\xe3\xd2\x07\x1d\x0d\x54\x61\xd6\x50\xe5\x97\x19\x55\x18\x2e\x7d\x61\xc2\x0c\x8a\x04\x7a\xc7\x95\x57\xa8\x91\xf5\xe6\x76\xed\x38\x41\x5f\x4b\xee\x22\x75\x8d\xcd\x4d\x29\xcf\xd4\xaa\x22\xbc\xfb\x27\x86\x70\xc3\x0b\x0f\x7c\x8f\xd8\x13\xfb\x8f\xd2\xd0\xe9\x3a\xe7\xf1\xab\xfc\xd7\xcd\x25\x19\xc6\x21\xed\x00\xa7\x73\x63\xb8\xa4\xcd\xe5\xb9\x2a\xdb\xa0\xb8\x9a\x65\x14\xcb\x90\xa7\x91\xdf\xa9\x1f\x8f\xf8\xc3\x76\x44\xd4\xce\x05\xc2\x24\x28\x5c\x4e\xb6\x8a\xb1\x9e\x30\x97\x31\x37\xf7\xda\xe4\xad\xc7\xec\x7c\xac\x7b\xee\x85\x1b\xa3\x7c\x02\x37\x5b\x61\x95\x79\x43\xf0\xf1\x3d\x8f\x15\xd0\xaf\xfa\xb6\xff\xe1\x9a\xb2\x32\xf1\x43\xb2\xa9\xa8\xdf\xb2\xd3\xa6\xb8\xcf\x8a\x4f\x36\x45\x99\x44\x11\x45\xa6\xe4\x6b\x70\x3c\x61\x93\x75\xc6\x06\xe7\x5e\x6f\x8a\xcb\xd4\x8b\x08\xfd\x6c\x7c\x2c\xdc\xd7\xa4\x7e\x9c\x76\xea\x62\x4b\x68\x9a\xc1\x21\x6b\x15\x4d\x9e\x06\xa2\x2c\xfe\x93\x99\x59\x5e\x77\x03\x54\x64\xac\x7b\xba\x9a\x9f\x4c\xb5\xa4\xb2\x37\xbc\x54\xd8\xde\x4d\x1b\x07\x8c\xee\xa9\x1d\x0a\xd2\x77\xe6\xc9\x4b\xc8\xf3\xb2\x19\x97\x93\x46\xe9\xb4\x04\xed\x7b\x3d\xf5\xd4\x22\x27\xa6\x18\xa4\xf1\x7d\x11\x5e\x4a\xe7\xb7\xb1\xe5\xb0\x97\x28\x85\x34\x90\xb5\x25\x7e\x9e\xdf\x5f\xe7\xa5\x2c\x9e\xf9\x2f\xfd\xfd\x57\x13\x46\x7a\x9e\xb2\xfd\xe5\x99\x6a\xb8\x1b\x24\x50\x76\x60\x8b\xe5\x65\x8f\xe0\x2a\xf9\x52\xea\x40\x8d\x9c\x82\x7e\x51\x86\x92\x52\x2b\x5a\x72\x74\x59\xbd\x7d\xfb\x55\x10\x2c\x95\xcf\x8c\x03\x0e\xe1\xa2\xad\x52\xdb\xb0\x02\x23\x55\xe8\x51\xb7\xe7\x50\x63\x63\xe0\x07\xa3\xfb\xe3\x46\x21\x7a\xd6\xb1\xc5\x7d\x10\x3d\x8f\x7a\x7f\xdf\xb7\xeb\x27\xd2\x30\x3f\x3c\x3d\xaf\x1f\x37\x8f\x77\xa4\x90\xd0\x8d\x62\xbe\xb4\xf7\x85\x16\x0f\x62\xc0\x5b\xab\xd0\xf1\x8f\x42\xce\xa8\xe3\xf1\x52\x96\x6a\xec\x1d\xc5\x25\x0a\xe3\x7f\xbc\xdc\xaf\xba\xe2\xa1\x3b\x84\x8a\x28\x22\x54\x00\xb2\x1e\x06\xc4\x50\xff\xe4\x2d\xd2\x51\x44\x6a\x6c\x44\xdc\x2b\x7b\x76\xbf\xd4\xc8\xa8\xdf\x98\xd5\xf5\x19\x57\xa5\x73\xea\xb2\x0e\x1e\xfa\xb9\xac\xeb\x6c\xf0\x3e\x69\x4c\x28\x8e\xa1\xbe\x3c\xd5\x13\xb2\x7a\x2a\x3e\x20\xb5\x46\x0a\x0f\xdb\xb7\x1a\xaa\x65\xff\xbc\x95\xa7\xbd\x58\x76\x52\x75\x8f\xe5\x00\xf7\x31\x07\x54\xb1\x9f\x62\x81\x31\x4f\x30\x96\x90\x78\x1d\x93\x28\x96\xf2\x20\xe9\x7c\xcd\x6e\x76\x2e\x0f\x50\x4c\x86\xcc\x5a\xa8\xbf\xbc\x18\x15\xee\x4b\x77\x4c\x79\x04\x33\x50\x28\xce\x2f\x26\x8e\xfb\x42\x85\x03\xd3\x2b\x1c\x62\xe2\x15\xc3\x24\xea\xdd\xae\x8f\x66\x32\xb9\x1f\xac\x7c\x1f\x49\x5e\xdf\xde\xbd\xa9\x92\x8a\x0a\x40\x12\xd8\x9e\x48\x13\x37\x98\x37\x70\xf3\x8b\xd5\xd3\x7e\x28\x64\x81\xee\xa3\xfc\xf9\xd2\x88\x0a\x01\x9d\xa1\x8d\xa3\xff\xd8\xb8\xbe\xbb\xb8\xc8\x53\x91\x53\xda\x9b\xf6\x0b\x55\xe4\x0b\x70\x75\x07\x63\x23\x40\xc2\x93\xee\x28\x68\xea\xbf\x9f\x89\x1d\xb8\x84\x46\x9a\xf0\xd4\x1e\x8e\x43\x20\x77\x53\xcb\xb8\xbf\xb5\x32\x45\xee\x68\xe2\x51\x9e\xec\xda\x95\x9d\x72\xc2\xbe\xec\xe8\x9a\x76\x68\x92\xc6\xa4\x32\x94\x43\xdd\x3c\x94\x45\xd7\x6b\x52\x09\xf7\xc1\xef\x5b\x38\xcf\x06\x33\x63\xd2\x52\xd3\xcf\xe9\x46\x2a\xe5\x1b\x44\xc8\x5a\x96\xdd\x03\x70\x9c\x32\x95\x7a\xa8\xac\x15\xea\x0e\xab\xf7\x36\x6a\x9e\xf3\x72\xe5\x2a\x0d\x04\xf5\x3e\x96\xe7\xcb\x76\x35\xa1\xdc\xff\x32\x71\x55\x29\x4f\xb4\x2b\x64\xb5\xe1\x54\xfb\xac\x8d\x9b\xe8\x2f\x91\x42\x8a\x8b\x80\xe2\xff\xc6\xa8\xe6\x3c\x64\xc5\xde\xed\x37\xaa\x9d\x78\xed\x1d\xfe\xfa\xb8\x74\x7f\x12\xb1\x4f\xaf\xd0\xfd\xd3\xdd\x61\x77\xca\x0a\x6b\xdb\xa8\xae\xfc\x32\xe7\xaf\x52\x24\x48\xc8\xcd\x3d\x9c\x9e\xcb\x3c\xbf\x4a\x8d\xfe\x56\x92\xae\x84\xd6\x9e\xd1\x30\xbf\xac\xca\x73\x55\x7f\xb2\x79\x2b\x99\x70\xb7\x3f\x2c\xab\x36\xc1\x6b\x76\xb2\xac\xec\xbd\xb7\x3b\xa5\x52\xcc\x3c\x1b\xac\x9b\x7b\xc2\xb0\x50\x61\x62\xd5\x35\x36\x95\x12\xbe\x33\xd3\x6e\xaf\x6d\x7f\x39\x4d\x1a\xcb\x0a\x43\x4d\x80\x8a\x6f\x8f\xae\x62\xae\x50\xf3\xd8\xc6\x32\xb2\x42\x95\x89\x2c\x6f\xf3\xe9\xfe\xeb\xd9\xa4\x90\xaa\x74\xa0\x12\x18\xc3\xf6\x2c\x98\xe8\x3f\x38\x15\x74\x19\xef\xdf\x4a\x43\x42\x08\xd5\xbb\xbe\x3f\x7b\x39\x19\xc9\xf5\xce\xca\xb0\xbf\x2b\x1a\x95\x08\xfb\xc5\x64\x77\x3e\xee\xde\xb2\x3c\x9f\xd4\xe4\xd0\xf3\x8c\xbc\xf5\x11\xab\x17\x2c\xa4\x51\xa7\x77\xc7\x94\x91\x2d\x18\xe8\xaf\x3f\x57\xa8\xb3\x9f\x23\x00\x0d\xb2\x20\xd0\xdc\xf9\x49\xfc\x1f\xf9\x55\xee\x14\x52\x8e\x4b\x77\x8b\x42\xb5\x6b\xb0\x55\xf4\xf9\x5b\xf3\x05\x99\x62\x04\x62\xd2\x59\xde\x60\xf5\x03\xaa\x2a\x2b\xab\xc5\xb9\x82\x4f\x60\x7f\xe8\x83\xa0\x9d\xd7\xb0\x4e\x1e\xb2\xe2\xaa\x60\x88\x01\x24\x14\x00\x11\x8d\xc4\xe0\x37\x67\xdf\x81\x79\x0d\x5f\x8e\x61\x22\x48\x21\xe1\x26\x2b\xca\x5b\xa8\xdc\x1e\x85\x61\x9a\x18\x74\x8f\xff\xed\xf9\xb5\xec\x92\x22\x4c\x98\x88\x4d\x4d\x58\x96\x85\x9a\xf3\xcc\xe0\x98\x84\x92\x6a\xb3\xd6\xe6\x67\x5f\x7e\xc1\xaa\xdc\x14\x06\x13\x31\xb9\xfe\x44\x7a\x24\xc2\x78\x01\xe8\x72\x3c\x4c\x24\x2a\x22\x15\x95\x62\xea\xdb\xc6\x31\xd5\x81\x67\x43\xca\x87\xc8\xca\x8e\x8e\xbf\x9f\xb3\x88\xee\xb3\x6a\xf7\x80\x33\x2e\xce\x2a\x9b\x76\x7a\xdd\xc8\xc0\xc0\xcd\xc4\xf9\xd2\xae\xc6\x2e\x6b\xb6\x4a\x47\x1d\xf2\x00\xc1\xd3\xca\x72\xbe\x4e\xe7\x06\x17\x79\x6e\xb4\x03\xfa\x38\x19\x45\x1c\x7b\x81\x9d\x64\x84\xf0\x99\x7c\x95\xe0\x26\x41\xa6\x04\xa8\x83\x65\xa2\x64\x21\xf5\x2d\x26\x82\xfe\x1c\x25\xc4\x5c\x4f\x6b\x77\xfe\x95\x61\x30\x47\x29\x0c\x76\xde\xd0\xb9\xcf\x0d\xd6\xae\x75\xfb\x8c\x55\x56\xba\xbd\x01\x55\x22\xd2\xc4\x51\x97\x2b\x72\xc7\x9c\xe9\x5a\x23\x72\x2f\x31\x98\x10\x8d\xc5\x40\xc2\x04\x35\x33\xb2\xcc\x75\x53\x9e\xfa\x60\x67\x7c\xe7\xb5\x66\xd4\x10\x2b\xf0\x67\xb3\xee\xdc\xd7\x3a\x41\x7d\xae\x3d\x1f\x1c\xe3\xde\x64\x0d\x8e\x16\xe8\x28\x63\xa3\x8b\xd1\x9e\x2f\x68\xf9\xda\x7c\xb9\x75\x2c\xa3\xd9\xed\x43\x7b\x89\x20\x20\xc0\x81\x50\x77\xc6\x37\xad\x41\xf5\xdd\xb1\x0f\xa7\x27\x66\xb1\xa4\x1a\x83\xa5\x27\xe2\x6a\xe0\x30\x34\x1d\x9a\x30\x27\x8b\xb5\xcb\x1a\xfc\x1c\xf8\xa4\x83\x20\x71\xe2\x16\xbb\x32\x7f\xc7\xca\xfd\xa8\x19\x73\x23\xae\x83\xd0\x60\x9e\x49\x68\xa4\x2c\xf3\x49\x87\x43\x87\x5c\xd3\xcc\x78\xcf\x9a\x67\xac\x7e\x60\xd6\x1d\x10\x7e\xc4\xac\xc8\x8b\xfb\x5b\x24\x03\x2a\xde\x1f\x4b\x75\xce\x9b\x36\x29\x18\xb3\x56\x75\x24\x39\x35\xd9\x8e\x64\x3d\x4c\x5f\xf4\xa4\x3f\xf9\x1d\xb1\xe7\x53\xe2\xa0\xac\x05\xe0\x0e\xe5\x38\x26\xd7\x71\xc4\x9c\x3b\xdf\x33\x54\x70\x9c\xdc\xb2\x18\x62\x1e\xb8\xba\x57\xdd\x8c\x0d\x93\xc7\x77\x21\x56\xdc\x79\x71\x53\x34\xed\xf4\x53\x8d\x72\x35\x56\xa8\x56\xce\xc1\xc5\xfd\x14\xce\x64\xd4\x83\x3e\xe8\x5d\xfc\x78\x86\x4c\x75\xc7\x05\xd2\x44\xdf\xaf\x1d\x7c\x54\x43\x8c\xd4\x1b\x59\x37\xaf\xcf\x39\xaa\xfe\xb6\x08\x16\xa9\x91\xea\x7d\xbb\xdd\x0d\x4c\x18\xb9\x16\xc8\x09\x90\x37\xee\x9f\x4f\xa3\x73\x2d\x74\x00\xbe\x83\x70\x14\xcd\xe7\x26\x3b\x5c\x4b\x30\x61\xba\x41\xc0\x3e\x69\x63\x53\x46\x4b\xf7\x0a\x8a\x49\x54\xa8\x15\xf3\xc9\x84\x1b\x1b\xd9\xfd\x89\x1b\x0e\x38\x16\xaa\x57\x31\xea\x6b\x2e\x5a\x49\x46\x5d\xfd\x0a\x15\x16\xe5\x31\x2b\xc0\xbc\x0a\xd3\x77\x5d\x23\x4b\x29\x43\xd6\x6d\xbe\xba\x2c\x3b\xb5\x39\x8d\xb1\x71\x48\x5e\x41\xfd\xba\xef\x21\xd1\xe0\x79\x81\x30\x1e\xfd\xaf\x28\xdf\x9c\xc0\x85\xd1\xa0\x9d\xfd\xb5\xe0\x79\xa9\x4a\xba\x52\xd3\x33\x5c\x8e\x74\x77\xc8\x1a\x76\xb4\x78\x80\xc7\x44\xa8\xec\xda\xe0\x40\x7b\xe3\x01\x7e\x9b\x42\x50\x20\x6e\x2b\x92\x83\x2e\xd5\x27\x89\xbd\xfb\x24\x2a\x6d\x48\x16\x3f\xad\x27\x29\x56\x0e\x44\x61\x87\x04\x41\x42\xb9\x21\x18\x50\x40\xbb\x26\x59\x32\xec\xad\x85\xdc\x13\x1a\xf6\x7e\xa8\x02\x3c\xbe\xbc\x20\x31\xea\x33\x34\x05\x34\x56\x95\x6d\x44\xff\x36\xbe\x96\x40\x71\xa7\xa2\xb8\xde\xae\x12\x9f\xcd\xb1\x65\xc1\x0b\x34\x32\xb3\x31\xbf\x7f\x72\x67\xc3\x24\x22\xac\xd4\x62\xf7\xe5\x7e\xfd\xe7\x18\xe1\x02\x5e\x08\x21\xda\xda\xf3\xd3\x09\x0b\x6a\x69\x63\xdd\x6c\x8a\x45\xd3\x94\xeb\xde\x9c\xb0\x1b\x2e\xac\x35\xa4\xc6\x85\x52\x9b\xdf\x46\x28\x02\x37\x48\xa4\x8e\xa7\x76\x97\xe9\xa6\x9c\xbf\xf2\x10\x0d\x70\xfd\x98\x75\x9c\xec\x99\xaa\x1d\x78\xa1\x4e\x68\x49\x7a\x39\x77\xe6\x0a\xed\x1f\x65\xea\xf8\x90\xa5\xc2\xb1\x7e\xb7\x1d\x13\x49\x45\x15\xf1\x43\x8d\xcd\x23\x54\xb2\xac\x57\x65\x85\x93\x8b\x99\x3c\x9c\x38\x02\xda\x49\x54\x56\xd3\x63\x37\x12\xcb\xc7\xe1\x0c\x88\xe3\x84\x68\x44\x16\x3e\xd6\x54\x19\x7e\xa6\x58\x02\x5e\x2c\x18\xeb\xc9\x62\xcf\x5d\xba\x08\x5e\x2c\x7d\xe7\x3e\xb1\x2d\x1e\x8e\xb4\xfe\x75\xde\x7f\xe0\x25\x41\x12\xda\x85\xe2\x16\x71\xd0\x68\x9d\xbf\x99\x49\x9b\xb8\xba\x58\xaa\xcd\x2d\x1d\xb2\xc2\x1e\x4f\xc3\x98\x58\xa8\x0f\x97\xaf\x99\xaa\xd7\xea\x6c\xad\xb6\x3a\x18\x3b\x78\x69\xec\x93\x9e\xb6\x8b\x24\x6e\xab\x91\x9b\x06\x78\xdc\x4b\x8c\x63\x8f\xdb\x04\xdb\xe8\xf6\xfb\xe0\xa1\x70\x48\x51\xbb\xe4\x39\x2b\x96\x97\x55\x07\x34\xb4\xba\x71\xe0\x81\xf6\x51\xba\xf0\x62\xe8\x29\x0f\x9e\xf0\x15\x19\x37\x75\x17\x80\x48\x7d\xbd\x1c\xfb\x16\x13\x78\x12\x2c\x4c\x8c\x56\x93\x7b\x23\x27\xdb\xad\x6a\xe0\xa9\x50\x53\x59\xd6\xe9\x71\x3e\xaf\xb7\x9b\xa7\x1b\xf7\x69\x15\x1b\xa6\xc5\x28\x5c\xba\x0a\x7a\x67\x03\x73\xf0\x30\x44\xea\xb6\x52\x69\xe5\x61\x20\x45\x6c\x83\x2c\xf0\x30\x31\x53\xce\x6d\x53\x83\xea\x51\x7b\x10\xad\x94\x4a\x1b\x13\xef\x20\xc7\x1b\xcc\xb3\xa1\x59\xe4\xf4\xfb\x38\x1a\xb1\x49\xfc\x18\xa5\x9f\xf3\x57\xa7\x59\x14\x1b\x71\x9c\xec\x3f\x38\x7e\xfc\xcc\xd3\x89\xe3\x86\x8f\x35\x54\x87\xe4\xc9\x6e\xac\x41\x24\x89\xf3\xc5\x6a\xf2\x5f\x4b\xfa\x00\x63\xa1\xa6\x72\xc6\xa1\x73\x2c\xb9\xf2\x3f\x9f\xd9\xc8\x81\xb1\x58\x52\x5f\x86\x5a\xb5\xed\x73\xb5\xf9\xab\xcb\xd6\x80\xf9\x3c\x52\xae\x4a\x63\xed\xe8\x0d\xa0\x64\x74\x9e\xd0\xf7\x3b\x23\xc5\xa2\xa9\x2e\x03\x9e\x28\xb0\x28\x4d\x49\xc9\x71\xf9\xb4\x7c\x1a\x4e\x61\x16\xe9\x50\xbb\x3a\x73\x5f\xc2\x9a\x5b\xc4\x58\xec\x01\x5d\xc6\x03\x66\x75\x0d\xa3\xb3\xc4\x81\xf1\x90\xb0\x3d\xd0\xef\x65\xd3\xeb\x26\xbb\x21\x91\xa6\x8c\xc1\x0e\x59\xc1\x69\xd8\x3c\x04\x16\xc7\x3e\xe7\xae\x7b\x3d\xd2\x70\x05\x16\x27\x31\xad\x19\xba\xac\x64\x1b\x71\xd6\xe7\x49\x52\x0c\x2c\xb6\xb2\x32\xe4\xbf\x47\x0b\x15\xf9\xaf\xef\x94\xac\xf3\xe1\x3b\xc5\x52\x88\xa8\x06\xff\xb8\xfe\xe3\x79\xb1\x5d\xfc\x82\x81\x01\x8c\x03\x77\x24\xbe\x4d\xd1\xa4\xbf\x75\xf5\x79\x60\x10\xc7\x46\x35\x8e\x74\xaf\x25\xde\xe2\x70\x2d\x63\x20\x43\x82\x42\xb4\x3b\x88\xfd\x31\x23\xe3\x12\x60\x22\xf4\x09\x8f\x4a\x33\x2a\x33\xf3\xcf\x0a\x47\x55\x6e\x8c\x84\x94\x82\x2c\x23\xa3\xbb\xff\xb2\xde\x1e\x1e\x36\x8f\x87\xd5\xd3\xe3\x7e\xbb\x59\xba\x51\x98\x20\x6d\x9f\x15\xc9\x16\xee\xa0\x29\x77\xaf\x59\xdf\x17\x04\x86\x5c\x11\x35\x65\x79\xbe\xfc\x55\x99\x67\x36\x8b\x07\xa6\x63\x23\x56\x41\x26\x9f\xf2\xad\x8d\x02\x56\x9d\x98\x3c\x73\xcf\x40\xab\x80\x96\x5c\xa8\x8e\x97\xe7\x1c\x0a\xac\x57\x57\xb8\xea\x76\x94\x24\x51\x08\xb3\x01\x7c\x29\xab\x1a\x77\xaf\x25\xf6\x24\xd3\xbf\xe2\x19\xfe\xed\xff\x27\xbf\x41\x87\x54\x10\xdd\x9e\xc9\x29\xce\xf1\x01\xc0\xf7\x7c\x65\x81\xde\xc7\xf2\x1d\x0d\x7e\xc3\x1d\x8a\xd1\x22\xc4\x76\x27\x83\x84\x1c\x9d\xd3\xf7\x52\x9f\x58\x25\xd4\x9b\x38\x58\xc4\xfa\x64\x27\xf2\x99\xcf\x3a\x6f\x48\xd7\x8e\xbb\x96\xc1\x06\xbf\x7d\xc1\x92\xfe\x0d\x59\x3a\x4f\x04\x77\x31\x3e\x33\xf2\x63\xa7\xaa\xfc\x5f\x94\xcd\xc4\x63\x0e\x7c\x5f\x21\x55\xb1\xc4\xf9\xb2\xc8\x73\xf3\xf6\x3d\xc3\xa5\x0d\x59\x3e\x2b\xcf\x8d\x2f\x34\x08\x53\xea\xb5\xd6\x4d\x59\x91\xe7\xe1\x0d\x34\x40\xc8\xfa\x11\x8a\xc3\x85\x13\x7e\xc0\x7d\xe1\xbb\x16\x58\x55\x37\xcb\xf3\xe5\xf1\x7c\xd5\xdc\x74\x83\xc1\x04\xc0\x7f\xd8\x7f\x5e\xfc\xcb\xc2\x26\xf8\x61\x94\xb8\x26\xc8\x03\xe1\xd1\x87\x0a\x23\xd7\x17\x1f\x31\x96\x9a\x0a\x2e\xe5\xae\x43\x76\xe6\xaf\xb0\xa8\xe0\xc7\x89\x4f\x7a\x3a\x24\x53\xed\xa2\x40\x3f\x89\x99\x63\x07\xdc\x13\x5f\x62\xba\xe2\xf8\x89\x48\x5c\x9c\x38\x09\xd6\xc6\xe3\x52\x3f\xd5\x76\x11\xd9\xa3\x7c\x2d\x32\x09\xf9\x0c\xa6\x18\xfc\x34\xd2\xc4\x07\x3e\x5e\x3a\x72\xd9\x9f\xdd\x5e\xe9\xa7\x9c\x51\xbd\xc7\x15\xb1\x21\xc7\x4e\x65\x02\x7c\x2e\x25\xd5\x0f\x0e\x0a\x1b\xac\xda\x04\xf7\x79\xe2\xd2\x0e\x3e\x30\x4d\x72\x9b\x5d\xea\x73\x8f\xef\xd9\xb9\xbe\x59\x3c\xcd\x87\x7e\x3e\xf8\x46\x05\xb0\xc6\x66\x7c\xc1\x7f\xab\xf6\x07\xbe\x08\x05\x55\xa3\x4c\x9a\x33\xa4\xaa\xce\xee\xd7\xbe\xf2\x63\xc2\x35\x7f\x74\xba\x8e\xed\x92\x4a\xaf\xca\xb4\x7e\x07\xbe\x92\x40\x27\xd7\xe7\x42\x95\x33\x2c\x6d\xf0\xd1\x37\x15\x75\xdb\xe2\x5c\x17\xaa\xef\xd0\x83\x8f\xb1\xe9\xd0\xbf\x97\x96\x9d\x94\x7a\x83\x3d\xdf\xd7\x1c\xe9\x5a\xde\x10\x57\xd5\xa5\x19\x6c\x76\xbe\x16\xa9\x11\x69\x75\xf5\x59\xfb\x48\x9e\x09\x55\x6f\x47\x05\x5e\x12\x70\x32\x95\x38\xe1\xb5\xa3\x12\x04\x2c\x14\xb4\x5b\xdf\x55\xe5\xf9\x34\xda\xc8\x03\x96\x48\x67\xe3\xf9\xe5\xc7\xca\xee\x1e\xcb\x8b\x29\x07\x8d\x7e\x62\xc0\x20\xd2\x43\x93\xf8\x07\x72\xdc\x9e\x9f\x88\x01\x03\xe9\x76\xb3\x7b\xa8\x1b\x6b\x71\x65\x78\x81\x76\xf7\x9b\x7b\x2c\x01\x13\xcc\xb9\xe0\x1e\x9a\xeb\x87\x68\x47\xf9\x01\x10\xbe\xf0\x61\xf1\x87\xce\x8a\xce\x79\x0f\x02\x3f\x64\x84\xdc\x5d\x28\x35\xa0\x26\x7c\x72\x8d\x7e\x84\x04\x48\xc0\x01\x47\x8f\x90\x1e\xfb\x8f\xd2\x9d\x30\x88\x8d\xf5\x82\x59\xaf\x69\x5a\xb5\xc1\x35\x29\x50\xba\x21\xa0\x75\x47\xd6\x70\xd0\x0b\x8a\x18\x47\xef\x7e\x10\xc8\x98\x59\x63\xf0\xe7\xc5\x6f\xb3\x8a\x60\x73\x8b\x54\x0f\xd6\xfb\xe4\xe8\xe8\x79\x06\x18\x10\x6d\xcd\xae\xdb\x3d\x89\x1a\x82\x30\x64\x04\x26\xa6\xfe\x99\xf1\xa7\x38\xe8\x73\x17\xf9\x05\x61\xa2\x28\xe4\x72\x36\x0b\xb7\xe7\x1e\x8e\x0f\x41\xa4\xd3\xd4\x90\xdb\x55\xf6\x72\x68\x77\xb5\x83\xd1\xeb\x1d\xdf\xd3\x58\x73\x42\x5c\x69\xa4\x36\x60\x5d\x76\x27\x48\x14\xeb\x35\x72\x28\x7f\x59\xb7\xf7\xe7\xb6\xac\x06\x2a\x29\x9f\x13\xff\xed\x59\xd2\xa0\x23\xf4\x6c\xea\xfa\xfc\x09\x72\x1a\x82\x34\x15\xca\x18\x3b\x6d\xc7\xf1\x5d\x90\x82\xb4\x46\x13\x54\x17\xb1\x6d\x93\xda\x2a\xfa\x76\x2f\x65\x90\x02\x12\x42\xdc\xd4\xec\x77\xd9\x4b\x01\xcd\xb9\xba\x86\x86\x8e\x1f\x72\x2a\x34\x51\x64\xda\x37\x7d\xc8\x13\xb3\x87\x21\x95\xb4\x71\xac\x7f\x66\x79\x76\x1e\x25\x78\x01\xa0\x72\xfc\xa2\x07\xc8\x8a\x6b\x19\x0a\x08\x64\xc8\xa2\xb4\x23\x8d\xcc\x2d\xec\x81\xc4\x28\x64\xce\xcb\xec\xb7\x61\xd7\x08\x02\xc5\xb4\x41\x6e\x7f\x60\xd1\x5c\xf6\xaf\x59\xd5\x5c\x06\x52\x45\x10\x20\x24\xa4\x6c\x4f\x62\x8a\xf5\x64\xfe\x6a\x19\x93\x4d\x51\x56\x9e\x47\xd1\x74\xa0\x15\xd3\xa2\xcb\x7e\x21\x27\x7c\xe4\xfc\x7d\xea\x3e\xa1\x49\x7a\x6f\x08\x7a\x18\x75\x8b\x21\xf4\xe2\x80\x80\xe0\xdf\xd7\xbb\xfd\xe6\xf1\xee\x70\xd3\x59\x9f\x42\xe8\x41\x60\x98\x3a\x56\xb6\xe4\x1a\x1f\xd2\x4d\x98\xd0\x53\x29\x35\xe4\xf1\xdf\x83\xc5\x6a\x24\x41\x31\x7c\x7f\x42\x26\x0d\x31\xf1\x83\xee\xed\xbe\x34\xb7\x67\x76\xfd\x08\x7d\xae\x9c\x87\xc5\x4d\x56\x53\x58\x86\xd5\x68\x79\x0d\x7d\x30\x49\xb5\x59\x60\x0e\x99\x2c\x4d\xe7\xfa\xb7\xc9\x99\x40\x87\xa9\x93\xc1\xb3\xaa\xbf\x63\x73\x47\x37\x50\x72\x92\x75\xd6\x65\x45\x21\x7e\xed\x56\xbe\xd0\xd7\x01\xa1\x44\x0c\xf6\x73\x72\x4b\x46\x0f\x32\x0c\xe2\x40\x5a\x7a\x72\x9b\x85\xb5\xc9\x5f\x3f\xef\xc3\x20\x36\x8e\x25\xe2\x5c\x15\x4b\xa8\x33\x23\x55\xeb\x1e\x76\x18\x24\x01\x58\x9d\x42\x23\xd7\x35\xa5\x4a\xcd\x47\x58\x61\x90\x28\x2a\xbd\xe6\x65\xf9\x76\x3e\x3d\x57\x99\xfd\x05\x13\xdb\x43\x08\x83\x54\x46\xfd\x46\xbe\x29\xea\xb3\xcb\x79\xea\xa7\xd3\xc8\x3c\xcc\x6e\xa4\x9f\xfe\xd7\xfd\xfe\xd9\xbf\x0e\xbe\x11\x23\x32\x1a\xfd\xbe\x58\xb8\x5f\x19\x06\x91\xc1\xc5\x1a\xcb\xa0\xbb\x7e\x19\x0d\xc3\x80\x3b\xc7\xd1\xc7\xf3\x91\x4a\x0c\xae\xc4\x3a\xf9\x25\x61\xcc\xa9\x31\xe8\xe4\xff\x2c\x9f\xc1\xf4\x09\x27\x63\xa3\x50\x50\x46\xaa\xf0\x94\x97\x17\x54\x0b\x93\x21\xbb\x2f\x8d\xb8\x09\xa7\x6a\x6c\x48\x4b\xf4\x06\x6b\x59\x65\xa7\xc1\x76\xea\x06\x82\x1f\x1b\x6b\x7a\x69\xc2\x7a\x52\xe4\xaa\xb3\x97\xee\x4c\x18\x68\x1c\xd5\x6f\x8d\x6c\xc0\x78\x8a\xc4\x91\xa0\x75\x2a\x87\xda\x5c\xc8\x01\x98\xe7\x4e\x11\x27\xc6\x48\x8d\xb8\x22\x63\xcb\x76\x08\x13\x16\x9a\x77\x93\x5e\xed\x91\x6a\xf2\x15\xd9\x02\xc2\x24\xf1\xac\x30\x21\xca\xb7\xf5\xcf\x53\x56\xe1\x64\xd9\x09\x93\xc4\x60\x60\xef\xcb\x97\xb1\x39\xc7\xfc\xc3\x4c\x52\xe3\x5b\xf2\xbf\x65\x0f\xbc\x9c\xcc\xff\x44\x22\x06\xbd\xd6\xe2\x1d\x5a\x40\x5f\xfa\xcf\x30\x75\x17\x96\x7a\xa6\xce\xf5\x0a\xf5\x97\xf2\x5c\xe5\x97\x36\x38\xf8\x91\x35\xaf\xd9\x98\x2d\x7e\x4d\x0b\xbc\xfa\x8d\x69\x00\x46\x1d\xfa\x27\x56\x32\xab\xd1\xfc\x4c\xb5\x3e\xd2\x93\x46\x63\xcb\x30\x57\x0b\x0a\x53\x14\x74\xa3\x69\x61\x75\xef\x19\x49\x00\x8d\x75\x3a\x21\xe4\xce\xb6\x61\xf3\xb8\xde\x1e\x56\xdb\xf5\x62\xbf\x79\x7a\x1c\xba\x27\x43\x08\x9e\xa6\x0c\x4a\x52\x19\x21\xef\x75\xa0\x21\x04\xc9\xa8\x18\xdc\x64\xc5\x65\xf3\x7c\xbb\x7b\x6d\x77\xae\xd1\xbc\x12\x8c\x13\x52\x7b\x97\xc1\x0a\xea\xd7\x41\xb7\x21\x14\x4c\x51\xcf\xd4\x6c\x94\x7f\x73\x39\x10\x69\xa2\xad\x76\x04\x11\x7f\x07\xbf\x5a\xa4\x9a\x70\x42\xed\xb4\xdb\x14\x3b\x3c\x66\xc4\xf4\x21\xcf\xf0\xee\x3b\xa5\x95\x77\x35\xf2\xbf\x03\xd9\xf6\x51\x19\x29\x94\x60\x96\xba\xac\xc1\x63\xfd\xa4\x47\x2e\x04\x6e\x88\x30\x04\x47\x32\x07\x3a\xc2\x75\x8b\x64\x72\xe5\x52\xf9\x54\x64\xa4\x30\x4a\x97\xe7\xca\x79\xca\xf6\x15\x99\x50\x31\xae\xd3\x21\xdd\x7b\x21\x09\xd8\xd1\x4c\x28\xb5\x10\x2a\x0d\xd4\x06\x23\xc6\xfd\x8a\x90\xb1\x78\x45\x02\xb0\x63\x31\x88\x0d\x30\xa8\x68\xb2\x7f\x9f\xaf\x5e\x14\xe4\x82\xb8\xec\xb7\x7f\x3c\x43\xb7\x2d\xa0\x62\x21\x1f\x94\xdc\xea\x7f\x9f\xa1\xc2\xae\x61\x0c\xa1\x66\x46\x1f\x6e\xbd\x5f\x55\x65\x5d\x3f\x97\x0d\x34\xa5\xf5\xe1\x9f\x4f\x9d\x42\x9d\xa4\x14\x25\x74\xc6\xcc\xa3\x84\x68\x72\xd1\x5a\xa5\xa9\x11\xd0\xb5\x89\x60\x2f\xce\xd3\x8d\xd0\x74\x43\x0b\xfc\xd9\x2c\x2b\x17\x79\x47\x5e\xa2\x68\x1f\xd2\x88\x56\xbb\x78\x1c\xc8\x45\x5e\x2a\xd3\xe1\xf2\xea\x70\x96\xf6\x30\xe3\x46\xaf\xf9\xa5\x2c\x95\xb8\x4c\xd6\xdb\x88\xb5\x29\x0a\x75\xf4\x87\x31\x58\xe4\xc7\x82\x77\xf4\x2c\xdc\xc8\x31\x7e\x1f\x22\x5f\x18\xd5\x38\x5a\xaf\x5c\xb7\xc6\x7d\x38\x8c\x38\x09\xc4\x7c\xea\x9c\x72\xad\x71\x3a\x3e\x7b\x98\x1a\x49\x44\x50\x8a\xe4\x10\xa7\x75\xb2\xf1\x4f\x88\x62\x88\xb8\xab\xf7\x97\xb9\x2a\x3f\x8a\x29\xb9\x66\x10\x3a\x44\xb1\xb5\x2f\x1d\xd8\x5f\x92\x42\x2a\xf1\xf7\xba\x9b\x1a\x47\x8c\xc8\x48\x54\x00\xbc\x7b\xba\xbf\xe9\x0e\xc4\x31\xc9\x94\xed\xbe\xdf\x53\x1f\x92\x70\xc2\xcb\xf2\xe7\x44\xed\xff\x9f\xbe\x71\x81\xf8\xa7\x6f\x97\xbf\x28\x61\x8a\x1b\x6a\xcd\x22\x3f\xbd\xc2\x7d\xf9\xe1\xc0\x2f\xcc\x8d\x08\x12\x57\xfe\xf8\x8a\x97\xc9\x86\x12\xa5\xcc\x27\xf8\xa8\x3c\x57\x35\xaa\xc9\xc2\x17\xa5\xb1\x22\xd5\xb1\x87\xc5\x1f\x06\xe2\xfa\xfd\xe9\xfe\x9b\x03\xb7\x42\x94\xca\x80\xb8\x1d\x64\x50\x40\xf0\xd6\xab\xf5\x69\xb2\x5c\x47\xdc\x0f\x49\xae\xf3\xbe\xac\x5d\x27\x74\x3e\xfe\x8b\x78\x20\x28\x6e\xe8\xf1\xf9\xba\x6f\xe8\x44\x9c\x63\xe0\x54\x8f\x75\x55\x1e\xc7\x5c\xad\xf1\x99\xc0\x37\x1e\x3a\xed\x76\x6b\x93\x7c\xd9\x86\x0b\xee\x5c\x10\x87\x54\x51\x3f\x66\x79\x9e\x59\x5d\x9b\x3e\x56\x8e\xa4\x07\x42\x3a\x25\x95\x4e\xc1\xe0\xea\xc5\x8d\x94\x4a\x02\xdb\xbb\xdd\x66\xf2\x75\x30\x75\xd1\xe3\xb4\x86\x1f\x3a\xb3\xb9\x4d\xe1\x44\x2e\x1b\x78\xf9\xb5\x08\x07\x44\x28\xfc\x94\x8c\x86\xbe\xfd\xd9\x6e\x3f\x8b\xe7\xc3\xfd\xd3\x8f\xc3\xb7\x5d\x37\x7b\x34\x4b\x90\x24\xbd\xe5\xc8\xc5\x03\x22\x1d\x85\x22\x70\xf8\xb2\xe6\x95\x58\xbd\xf3\xc2\x86\x10\xfb\x5e\x80\x6e\xc2\xe7\x65\x9d\x15\x2f\x4f\x22\xcf\x5e\x06\x5e\x2c\x6e\x2d\x8c\xfd\x94\xd1\xfe\x60\xca\xd4\x7e\x14\xff\xe6\x0e\x88\x84\x72\x7e\x81\xb2\x3c\xe2\xfe\x5c\x35\x39\x9a\xee\x9f\x1b\x11\xb0\x88\xa0\x75\xf6\x1a\xda\x6d\xf2\x19\xaa\xa6\xe8\x50\x44\x10\x87\xe0\x27\x56\x4e\x43\x2d\x2f\x13\xc7\x35\x88\x23\x4f\x2b\xa3\x57\xb4\xa7\xf2\x18\x5c\x2d\xfb\x71\xc4\x8c\xe4\x1a\xd1\x27\xe9\x0e\x5b\x8c\x9a\x3b\xee\x87\xc6\xd7\xe5\xe9\xeb\xfa\xb1\x57\xa1\x87\x38\x52\xca\x35\xf0\xba\x62\x0d\x25\xf9\xc3\xdd\x3a\x8e\x10\x8c\x16\x5f\x3b\x33\xdb\x0d\xb2\xc3\xba\x52\x2b\xc1\x35\xc9\xee\xda\x68\xba\x39\x2b\xac\x77\xd9\x7f\xa6\xcc\x62\x88\x13\x4f\xd8\x69\x25\xcb\x42\x59\x75\x80\x71\x65\x2b\x4e\x03\x3f\x90\x03\x93\xf2\x1b\x6c\x20\xcb\xbb\x3b\x95\x86\x31\x25\xac\x07\xb7\xff\x8c\x0a\x4b\x93\xe7\xcb\x7d\xa3\x24\xf9\x82\xcd\xd3\xe9\x0e\xba\x93\x40\xe0\x81\x71\x13\xa2\x1c\xcb\x38\xd8\x8f\x2f\x15\xe2\x94\xa6\x86\x01\xf0\x5a\xaa\x83\x3d\x26\x02\x9f\x60\xe3\xa6\x6e\x3e\x30\xec\xbf\x8a\x0c\x63\x11\x7b\x89\x1e\xd5\x28\xf6\xb6\x18\x62\x28\x81\xdd\x25\x09\x15\x50\x11\x81\x54\x4a\xbf\x9d\x26\x13\x40\xa2\x8a\x7b\x4c\xff\xe2\x05\x8b\x89\xc7\x2e\xc4\x2a\x00\x4a\xd7\xc4\x80\xe6\xd2\xc7\x40\xb1\x4a\x8c\xbf\xd5\x41\x42\xf1\x00\x0d\x7e\xcf\xc0\x30\x4c\x49\xae\xc9\xf2\xe2\x7f\x3f\xf7\xf4\x78\x88\x15\x8f\xcd\x3a\x59\x1e\x45\x56\xe0\xc3\xe5\x2e\xab\xf2\x4f\x56\x82\x58\x81\x64\xf6\x56\xdf\x3f\xed\xa7\x02\x88\x93\x4b\xd5\x68\xed\x37\x5d\x4b\xf5\xb6\xac\xda\x57\x62\x92\xb9\xc5\xc8\x39\x9d\x54\x61\x8e\x0d\x12\x1f\xcc\xf2\x08\x66\xf1\x1e\x31\xca\x88\x90\xa8\x07\x71\xce\x72\xb5\xb9\x06\x68\x0e\x6e\x08\x2a\x20\x74\xee\x7f\x9f\x4f\xd9\xe0\x65\xd5\x3c\xa1\xe8\xe2\x66\xd3\xbd\x21\x5a\xc4\x54\xab\x3d\x55\xa5\x32\xc2\x4d\xdf\x0a\x8b\x5e\x77\x9b\xc7\x80\xf9\x0e\xb1\x96\x82\x6c\x58\x4f\xe5\x69\x3d\xea\x75\xc7\x1a\x23\x4f\xba\xac\xbc\x0d\xf7\x6e\xcb\x2b\x24\xdc\xe8\x56\x25\x1e\x33\x1e\xcc\x3f\x36\xfb\x2f\x37\xdb\xc5\x8f\xc5\xfd\x61\xed\x1c\x6e\x21\xf1\x7c\xa0\x96\xd5\xe2\xfb\x62\x73\xbf\x58\xde\xaf\x0f\xff\xfd\xb4\x79\xdc\x1b\x11\xb1\x6e\x50\x1a\x45\x38\x28\x4a\x92\x6c\xa9\x3b\x86\x82\x82\x96\x92\xac\x15\x46\x2d\xcf\x84\x05\x86\x53\x7a\xaa\xf0\x80\xdd\x42\x92\xb0\xd4\x8f\xd0\x6e\x0d\x5f\x8b\xf2\x63\x80\xab\x82\xc4\x67\x01\x85\xfd\xbb\x6f\xcf\xcf\xf7\x7f\x1e\x6e\x9f\xb6\x87\xe5\xd3\xd3\xb7\xc7\xfd\x9f\xdd\x08\x3f\xa1\x70\x00\xce\x4d\x79\x4b\xe2\x41\x83\xc5\x3b\xf1\x93\xc8\xb7\x4b\x89\xd9\xb4\xdb\xbb\xd7\x6b\xfd\x42\xe2\x73\x45\x70\x4b\x4a\x60\x0e\x22\xfb\x04\xa7\x91\xf8\xa0\x85\xd3\x0e\xad\xad\xd5\x94\x05\x78\xf5\x73\x20\x09\xbc\x98\xe8\x55\x23\x84\xf0\x5f\xf4\xe5\xdc\x47\x79\xa8\xa3\x81\x52\x7f\x10\x8e\x16\xcc\x24\x04\x45\xe4\x1e\x6a\xca\xb9\x96\xee\xe4\xe1\x86\x92\xb9\xe9\x70\x83\x1a\xce\x79\x6f\x4d\x75\x07\xf5\xb0\x03\x9e\x44\xcc\x23\x41\x0e\x38\x9d\xf2\xcb\x6a\xa0\xec\xf2\x4b\xf8\x4b\x12\x01\x10\xbc\x1e\x8f\x99\xf1\xa4\x91\x2b\x38\x81\x41\x83\x2f\x94\x9a\xca\xde\x59\x50\x47\x12\xb3\x90\x36\x57\x23\xb8\x62\x96\xc7\x41\xe4\x97\xc4\x2c\x02\x47\xa8\x99\xe9\x05\x26\x89\x6f\x54\xb2\xcc\x3b\x02\xa7\x13\xaa\x2b\xdf\xbd\x4f\xee\x6b\x12\x85\x24\x4e\x4b\x5b\xd8\xf5\xa7\xdc\xa8\xc4\xd0\x3a\x08\x82\x9f\x75\x85\xc3\x24\x8d\x02\x69\x5e\xbd\xba\xd9\xff\x31\x85\xad\xff\xfa\x9b\x53\xd0\xd2\x10\x6e\xd5\x59\xe2\x4d\xf6\x7e\xe8\xce\x2a\x3d\xda\xe0\x6c\x4d\x21\xab\x9b\x7a\x53\x18\x76\xea\xf8\x76\xa7\xd2\xd8\x99\xd7\x48\x4a\xde\xa4\xff\x75\xfc\x24\xe9\x49\x78\xc2\xc8\x01\xcb\xf5\x8b\xba\xfc\x25\xe1\x3a\x24\xb1\x2a\x5a\x21\x20\xcb\x0d\xaa\x61\x53\xd4\x67\xad\x33\x99\x21\x59\xeb\xb9\xc1\x10\xf8\x04\xba\x7c\x2c\x6f\xe1\x0d\x07\x69\x74\x02\x89\x55\x8e\x86\x37\xdc\x0e\xf0\x26\xf6\xb0\x88\x84\x01\xa2\x56\x97\x36\xf8\xe9\x4e\x28\x00\x48\x36\x75\xdd\xc6\x33\xcd\xd0\x3f\x14\x12\x81\x21\x6d\x09\x67\x87\x4c\x9f\x93\x26\x86\x44\x45\x3e\x7d\xf3\xfe\x15\x6f\xb2\x97\xac\x21\xe5\xde\x42\x75\x3a\x73\x90\x28\x11\x59\x4a\xca\x31\x2b\x76\x58\x28\x92\x7f\x19\x51\xa0\x21\x41\xcf\x23\xfc\x91\xd5\xfd\xc1\x31\xf4\x28\x41\x8e\x44\x11\x40\x43\x02\x59\x5e\x16\x03\xbd\x1d\x48\x10\x19\xf1\x78\xdd\xdb\x57\x3f\x96\xcd\x6d\x55\xfe\x07\xa7\xaf\x21\x6a\x41\x7b\xf4\x4b\xa6\xdb\x05\xf9\xd7\x75\x86\xd4\x8b\x99\xf3\x33\xbd\xcf\x24\x16\x12\x77\xaf\xe5\x69\x50\x60\xf5\xa7\x1f\x40\x63\x55\x6e\xee\xd9\xfe\xad\xb8\xe6\xad\x43\xca\x38\xd2\xaa\x4a\x18\x91\x01\x11\xc4\xfe\x98\xd4\xf7\x02\x86\x83\xa8\xa8\x0d\x48\xb2\x17\x93\x76\xd5\x43\x2e\x28\xa4\x7e\xa8\xbd\x61\x57\x6d\x5f\x8a\xb3\x7c\xc3\x66\xff\x51\x4e\xad\x9c\xdc\x27\x52\xa0\xa7\x5a\x56\x20\xad\xad\x08\xa8\x61\x19\x7c\xb8\xb2\xa5\x3e\x78\x1c\x3a\xd6\x6d\x27\x4c\x01\xa9\x2f\xf9\xd4\x39\x79\x62\x9c\x0c\xa9\xaf\x53\xd2\x22\xc9\x6a\x8b\x45\xb2\x7f\x0f\x58\x4a\xf0\x06\x0a\x09\x0e\x1f\x23\x30\x2c\xa4\x41\x10\xa1\xd7\x29\x62\x8d\x16\xda\x34\x64\x86\xe4\x66\x62\x84\x1b\x53\xed\x9c\x2c\x48\x69\x98\x70\xd2\x80\x2f\x3b\x33\xdb\x5f\xe7\x1f\x69\xa8\x3c\xea\x07\x82\x35\xe9\x9e\x2e\x25\x73\xca\x30\xb3\x0d\xfa\x34\xf6\x25\x31\x2d\x6a\x22\x64\xf7\xac\x18\x77\x38\x48\xa9\x58\xf4\x88\x1f\x0e\xbf\x3f\xb9\xf6\x18\xa4\x72\x0d\x55\xcc\xd5\xf4\xa8\x54\x84\xa6\xac\x5f\xb3\xa6\xb9\x6c\xa1\x98\x0e\x48\x50\x88\xde\xa6\x72\x91\xe7\xe5\x87\xb1\xec\x9b\xff\xe1\xa9\x67\x88\xc1\x8a\xae\xb4\x7e\x2c\xbb\x87\x90\x7a\x29\xb5\x14\x80\x48\xf1\xaf\xd9\x74\x41\x49\x53\x06\xc4\xec\x39\xc1\x65\xdf\xee\xed\xd3\x96\x76\x9a\xfa\x82\x12\x21\x83\x9d\x69\x66\x24\x76\x3e\xf5\x6b\x81\x94\x33\x8f\x02\xff\x37\xb4\xbd\xe4\xf1\x6d\xe6\x60\x74\xa3\x3f\xa8\xa2\x1a\xaf\xca\x42\x67\xd5\xb1\x9e\x83\x82\xa5\x80\x46\x4a\xc2\x42\x0e\xa1\x26\x10\x9d\x29\x8f\x8f\xaf\x58\x04\x2a\x75\x08\xc8\x3c\x33\x10\xe6\xff\x45\x39\x0d\xbe\x53\x09\x8c\x6a\x5e\x99\x2c\xd7\x9d\xaa\x2e\xa4\x12\x81\x2a\xfb\xed\x42\xfe\x7c\x76\x12\x69\xf4\xf7\x74\x24\x00\x79\x83\xef\x57\x18\x81\x54\x31\xe3\xbb\x0e\x4a\x91\xad\xdd\x6c\x86\x91\xaa\x20\xa6\x1f\x73\x28\x4f\x48\x6d\x85\xed\xe7\xa8\xec\x54\xa5\xb1\xec\x40\x14\x6d\xc8\x77\xb0\x9a\x47\xdd\x7c\xc4\x44\x50\x04\xe7\x26\x23\x6d\x0d\x6a\xbe\x21\x36\x0a\xab\x3f\x79\x91\xb4\xc7\x49\x66\xa1\xc0\x8f\xaf\x03\x1e\x87\x3b\xca\x02\x6e\xe9\x99\xb6\x5b\xc7\xa6\x23\x42\xa3\xa3\x62\x2a\x99\xed\xae\x6a\x78\xfe\xa3\x25\x4f\x27\x86\x7f\x52\xc3\x3b\x0e\x1d\x00\xa7\xd7\x92\xf8\xca\x74\x32\xcf\x28\x40\x16\xcc\xb7\x52\x76\xc0\x3d\x0f\x69\xb3\xb0\x7e\x46\x66\x57\x9b\x8d\xb0\xdc\x07\x02\x49\x70\xa7\x89\xb3\xef\xdf\x61\x84\x01\xf7\x43\x0e\x36\x19\x1b\x2b\xc8\xce\xf2\x07\x3e\x3b\x89\x48\xd0\x92\x1b\xbe\x63\xd1\x9c\x2b\xac\xe9\x61\xba\x9f\x14\x20\x0f\xbd\x41\x14\x61\x6c\x57\x1f\xf1\x63\x8b\xef\x59\x9d\x95\xc5\x63\x69\x7c\x8d\x7a\xc9\x00\xe0\x21\x08\x62\x64\xb7\x73\x0e\x73\x7c\x19\x5a\x94\xfd\xc2\x22\x01\x78\x14\x84\x44\xe2\x5f\x7d\xb9\x7f\xda\x6e\x1e\xd7\x03\x19\x2b\xe0\x51\x08\xda\xa9\x0d\x54\x38\xd4\xfb\x03\x1e\xc5\x9c\xaa\x63\x9d\x24\x7a\x59\x4d\xef\x75\x24\x21\x1c\x40\x61\x56\x70\xda\x22\xc8\xd7\x6e\xe7\xe1\x91\xf2\x28\xcf\xbf\x59\xaf\x1d\x82\x85\xc7\x5e\x92\x50\x79\x71\xf9\xb5\xfb\x93\xed\x24\xbd\xc0\x11\x1f\xf1\x67\xd3\xfd\x3d\x41\x2a\x64\x16\xf8\xd3\xca\xa3\x77\x47\x78\x42\x82\x62\x7d\xfa\x6e\xac\x76\x26\x2b\x1b\x8f\x75\x6a\x56\x4d\x7c\x77\x2f\x3f\x4f\xbc\x90\xce\x6a\xb5\x22\x36\xea\xe7\xe4\x67\xa5\x00\xb4\xa7\xef\x64\x59\x9d\xb2\xf2\x57\x58\x4e\x9e\x82\x61\x66\xdc\xad\x76\xa3\xbb\x47\xd6\x9d\xae\x39\x6f\xfa\x80\xc3\x6a\x18\xe7\x28\x68\x5f\x55\x15\xd8\xa6\xe3\x14\x4e\xf6\x37\xd3\x9e\xff\xeb\xff\xee\xfb\x75\x82\x66\xbf\x7f\x28\x95\xb5\xfe\xed\x10\x1c\x1c\x22\x23\x20\x6a\x02\xeb\x5e\xf3\x79\x7c\x9f\x04\x4b\x48\x7e\xfa\xf9\xae\xfd\x01\xcf\x39\x34\xba\x74\x8c\x45\xe0\x22\x0a\x88\x09\xb9\xc8\x75\x59\x55\xe5\x20\x00\xe6\x42\x32\x72\xbd\x86\x4c\x55\xe5\x69\xc2\x9b\x07\x2e\x7d\xae\x6d\x8e\xd8\x7c\xd6\x9a\xe0\x32\x0c\xa8\x6d\x47\x6a\x95\xb7\x59\x9e\x8f\x6e\xbf\xe4\x06\x94\xd4\x31\xda\x97\x50\xbc\x8d\x19\x26\x5c\x79\xa6\xc3\x6e\x25\x0a\xcf\x45\x73\x19\x4a\x8b\x01\x57\x71\x44\x6f\xc0\xe2\xf9\x79\xe5\xfe\x86\x81\xa9\xf8\xd5\x67\xf2\xfb\xd6\xe7\xee\xb5\x46\x65\xcc\x39\xcd\x44\xbc\x2f\x61\xc6\x95\xc0\x0e\xd5\x2c\xf0\xec\xc3\xff\x78\xc8\x0a\xcb\x24\x03\xf0\x82\x88\x0a\x14\x0a\xdf\x0f\xc7\x71\x37\x17\xbc\x40\x1a\xbd\x0a\xb7\x32\x39\x21\xd1\xab\xfd\x09\xbc\xc4\xb0\xab\x6e\x32\x6c\x3a\x47\x44\x77\x0c\x22\xe3\x95\xdc\x48\x7b\x6f\x26\xcd\x25\xf0\xb4\x36\xde\x1f\x36\x54\x74\x9f\x64\x9e\x91\x3a\x77\x31\xa0\xa1\x7a\x3e\x0f\x64\x49\xc7\xbf\x12\x98\x87\xb4\x43\xec\x7a\x79\x03\x00\x16\x18\x71\x49\x87\x32\x1d\x98\xc7\x01\x30\x65\x0c\x7c\x0c\x04\xeb\xe9\x1d\xab\x9a\x94\x3b\x46\xd3\x0e\xfc\xd8\x48\x53\x55\x96\x92\xb6\x34\x97\x3f\xce\x98\xdd\xd8\x34\x51\x16\x8f\xbf\x91\x25\x9b\x31\xd3\x03\x08\xc0\x38\xf0\x9b\x6c\x66\xc4\x3c\x1c\x7f\x71\x08\x71\x87\x58\x3b\x41\x93\xcd\x78\xfc\xcd\xad\x11\x10\x25\x9c\xd8\x79\xcb\xd7\xc6\xad\x8c\x10\x21\x26\xc1\xa0\xa5\x65\xe3\x22\xca\x2d\x86\x3c\x51\x80\x48\x87\xe4\x87\x77\x7a\x85\x1a\x0f\x81\xb1\x6f\x3b\x0c\x3c\x1a\x01\x62\x16\x21\xda\x72\xc9\xdf\xcc\xe7\x21\xf1\x03\xdf\x73\xea\x0f\x78\x3e\xae\xa0\xba\xb2\xe7\x3b\x4f\x05\x45\xdb\x8f\x25\xf4\x6e\x1e\x07\x3e\x4a\x57\x67\x16\x94\xb5\xd4\xaf\x50\xb9\xd2\xd5\xdf\xda\x7e\x21\x09\x23\x23\x97\x60\x75\x57\x7e\x64\xcd\x6b\x79\x36\x45\x3c\xac\x4e\x54\x88\x9c\x8d\x20\x20\x0d\x05\x55\xd9\x49\x2f\xe3\xb1\x54\x93\xa5\x0a\xb8\xaf\x3d\x03\x77\xc2\xf7\xac\x3c\xd7\x94\xab\x4d\x27\x02\x0f\x7c\x3f\x74\x7e\x31\xd7\xf8\x2f\x37\x8a\x2b\xd2\x16\x2c\x3f\x0a\xac\x9e\xe1\x5c\xe3\x7f\x83\x7c\x3b\x95\xcd\xa0\x80\x05\x5c\xfb\x89\xe8\xfd\x54\xda\xf0\xc8\x1f\x37\x35\x01\x02\x23\x3d\x6a\x8a\x46\xab\xf2\x98\xd5\xf5\x94\xed\xda\x8e\x42\xec\x45\xab\x1f\x33\xf9\x56\xc0\x71\xba\xf5\xbb\xb1\x61\xcc\xe3\x41\x82\xb9\xfd\xc4\x7a\x1c\xda\x29\x19\x59\x80\xe2\x5d\x99\xab\x81\xa1\xca\x18\xb2\xe9\x86\xc7\x22\x54\x43\xe5\xad\xe9\x4f\x91\x29\x91\xd0\xb3\xda\x1a\x2a\x50\xc8\xde\x6e\x77\x75\x03\xc7\x53\xdf\xde\x02\xe1\x49\xca\x34\x96\x59\xf3\xed\x79\xb8\x62\x83\xe4\x48\xc0\xd6\x75\xd7\x7f\xe8\x8e\x08\x03\x51\xae\xb1\x79\xc4\xce\xb2\x6e\xfe\x87\x49\xc1\x9c\x46\xd8\xae\xcc\xcf\x73\x0a\xe7\x76\x24\x06\xca\xb3\x14\xc4\x1f\x98\xed\x33\xac\x98\xfb\x42\x1d\x86\x94\x34\x98\x9a\x1e\x16\x75\x69\xd4\x8c\xc7\x27\xd0\x11\x92\x97\xde\x38\xd0\x5c\xa2\x2e\x2b\xa4\x1e\xff\x67\xec\x68\x00\xcd\xb5\x67\x41\x03\xdf\xdb\x35\x6e\xda\xd4\x02\x2d\xb4\xb6\xcf\x87\x48\x37\x9b\xc2\x0f\x7f\x20\xbe\x99\x95\xe1\x3a\x9a\x1d\xc6\xf9\xe6\x14\xc2\x8b\x8d\xe9\xf5\x31\xcb\xdb\xd8\xad\x18\x6a\x31\xb5\x47\xb5\x03\x86\x4d\x3a\x9f\x76\x00\xf3\x7c\xe2\x76\x66\xf5\x42\xeb\x2c\xcf\xae\x3b\x5b\xa2\x0d\xda\x7a\xf5\xe7\xc3\xf2\x20\xcb\xf3\xa9\xfc\xc4\x1b\x16\x04\x13\x21\x29\xaf\x4c\x3b\x2e\xee\x92\x98\x0a\xe3\x74\xf0\xca\x40\x8e\x33\xda\xdc\x93\x1e\xae\xf0\xa3\x80\x10\x0a\x7d\x51\x65\xb3\x5a\x3c\xb7\x0b\x07\x71\x3e\xb1\x8d\x5a\x66\xfb\xf2\xee\xf3\xd2\xb0\xba\x29\xd2\x31\x24\xb7\x5f\x99\x44\x81\x08\x58\x4c\x3c\xd0\x45\x91\x1d\x21\x77\xe2\x3d\xb3\x55\x5e\x11\xc4\x0c\x8c\x52\x8d\x7b\x1f\xee\x3b\x8e\x38\x88\x00\x98\x76\x6a\x84\xef\x27\x53\xbe\x1c\xac\x21\x22\x10\x9a\xb6\xf1\x76\x6e\x1e\xc8\xfe\xf8\x30\x02\x57\xdb\x61\xa1\xef\xa7\xbd\xca\x90\xb9\xac\x7a\x79\x99\xcd\x8e\xda\xc1\x3a\x18\xec\x9d\xd3\x7b\xf3\xd9\xff\x93\x10\x4d\x84\x61\x4a\xfb\xaa\x59\x96\x6e\xcb\xea\x8d\xf8\xcc\xdd\xc3\x0c\xd3\x80\xf0\x4c\xef\x99\x75\x88\xee\x0e\x08\x9f\x8a\x6e\x56\x3b\x67\x52\x59\x14\xa1\x0a\x28\x01\xb3\xa8\x0b\x93\x76\x98\xd2\xd0\xf4\xa7\x44\x71\x42\x8c\x2b\x6a\xf8\x77\xb6\xef\x65\x65\x24\xd9\x0d\xbd\xfa\x6a\xde\xd8\xcf\x26\x9c\x77\x3e\x98\x37\x96\x81\x3a\xbf\x4e\x88\x44\x79\xc2\xe2\x44\xf6\xaf\x78\xd5\x80\x15\x89\xf6\x9d\xc3\xe9\xe1\x5c\x0f\xd4\x3e\xdc\xff\xa3\xb3\xa5\x9e\xa6\xc6\xd9\xf2\x3c\x22\xd2\x89\x34\x16\x89\x5b\x11\xca\x06\xbf\x9c\xc5\xb8\xbd\x2a\xb8\x27\xc0\xe9\x43\x67\xcd\xc5\x09\x56\x80\xe0\x91\x4f\x75\x01\x01\xe2\x3f\xf3\xc2\xd1\x20\xb8\x0d\x36\x4e\xd5\x80\x4c\x26\x84\x97\x12\xe0\xdd\x18\x18\x22\x79\xb8\xdd\x56\xe5\xf1\x4b\xd9\xa1\x05\x84\xf0\x8d\x52\x7e\x3b\xb9\x4c\x8b\xcd\x90\xaf\x6e\xcb\xea\x5b\x3d\xed\xcd\x0a\xc1\x91\x7e\x05\xf5\x4a\x6f\x88\x23\xf4\x8c\xd5\x33\x56\x75\x3f\x5d\xa5\x17\x10\x5c\xdb\x5a\xad\xd4\xd3\xc2\x9b\x50\x41\x44\x1d\x15\x6a\xe2\x3a\xca\xca\x78\xed\x15\x2a\x51\xb4\x7f\xed\x30\xd7\x37\x68\x9c\x58\x87\xe7\x40\x3f\x21\x64\x29\xf9\x7c\x4d\xc8\xeb\xd7\xea\x88\x57\x1a\x6b\x20\x30\xe0\x5e\xec\x4e\x30\x62\x60\x08\x94\x8c\x32\xbb\x9b\xcd\x6e\xf5\xf4\xed\x71\x7f\xd8\xed\x17\x77\xeb\xc3\xfe\xcb\xd6\xd9\xb6\x82\x40\xa5\xf4\x00\xe5\xfb\xad\xc8\xca\x62\xa3\xe6\x70\xbe\x42\x0b\xa0\x38\xec\x86\xca\xa4\xcb\x2c\xcf\x3b\xd9\xee\xf1\xdd\x95\x5e\xaa\xb4\x21\x28\x90\xea\xda\xd4\x08\x7f\xfa\xae\xfe\x3e\x44\xde\x48\x96\x78\x24\x48\x61\x6b\xf2\x4e\x4f\xe5\xf7\xf3\x40\x57\x05\x24\x4b\x05\x51\x52\xb7\xeb\x7f\x7c\xdb\x6c\xd7\x37\x87\xdd\xe6\xee\x71\xb1\xff\xb6\x5d\xbb\xae\xa5\x64\x9a\x13\xaf\xb4\x9d\xef\x92\x74\x3d\x8e\x53\x57\x0c\x90\xbe\x8f\x91\xd3\xd2\x38\x94\x05\xee\xab\x33\x2e\x0a\x75\x0b\x79\x8d\x0b\xf2\xc7\x71\xa7\xf3\x83\x80\x16\xa4\x87\xb2\x80\x4a\xbe\x5e\xba\xbf\xdb\xdb\x42\xb8\x86\x43\xcf\x5a\x95\x41\xc0\x8c\x41\x6f\x05\x45\xe3\x4c\x68\x9f\xb1\xb2\xe1\x53\x3d\x7d\xcc\x6e\xc9\x92\x81\x96\x18\x3b\xe9\xc3\xe2\x6d\x8b\x93\x9a\x97\x0c\xe3\xc4\x15\x43\x16\x79\xbe\xcb\x5e\x3a\xc7\x93\xfe\x87\x85\x1a\x08\x64\x97\xd5\x8b\xac\x6a\x93\x57\x52\x7f\xef\x0a\x1e\x32\xf2\x80\x1a\x4d\x0d\x16\x47\x6a\x24\x77\x07\x52\x15\xd9\x19\x71\xc8\xbb\xe5\x50\x26\xa9\xa1\x8d\xb6\x3b\xcf\xcd\x00\x2b\x3c\x5e\x84\x64\x2a\x95\x21\x04\x42\x2e\x6d\xb4\x79\x95\xf6\x49\x9e\xa0\x93\x00\x7f\x3c\x1f\x6f\x36\x37\x5f\xca\x5c\xf5\x48\x06\x49\x66\xfc\xd6\xa0\xa8\x19\x38\x7f\x81\x84\x18\xc9\xce\xa0\xcb\x2d\x0d\x21\xe7\x50\x8f\xe1\x7e\xe3\xaf\x03\x91\x52\xa8\xa5\xcb\xaa\x4d\x04\x6f\x87\x01\xf5\x3c\x73\x4b\x82\x42\x12\xc2\x70\x95\x2f\xb7\x6a\xdf\x18\xeb\xf6\xc7\xb2\x31\x3a\x99\xdd\xed\x04\x34\xc8\x3e\x53\x98\x76\x2f\xf2\x2f\xc9\xe3\x52\xb0\xc8\x1b\xb8\x0d\x3f\xe0\xf1\x2a\x02\x18\x5f\x95\x60\xa0\x42\x27\x5d\x1f\x24\x93\xbb\x2a\x82\xd4\xb7\x77\x95\x48\xa5\xf5\xa6\xd8\x35\xe7\xee\x0a\x05\xf8\xa4\x97\x32\xd0\x66\x29\xfb\x42\xb3\x14\x4a\x92\xc3\x9c\x0d\xdf\xcb\x06\x97\x67\x4a\x31\xb1\xe3\xeb\x3b\x04\xdf\x88\xc0\x21\x95\x97\x98\xee\xc0\x70\x05\x1b\x17\x79\xdd\x04\x0f\xdd\x0c\x57\x91\x11\x86\x7c\xc1\xe6\xee\x8c\x75\x63\x94\x0c\xe7\x1f\x85\x92\x1e\x5a\xd6\xd6\xaa\x3c\x1e\xcf\x45\xe6\xd8\x19\x66\xd6\x4c\xde\x0d\x1d\x7b\x41\x47\xfc\x38\x18\xca\xc4\x01\x46\x59\x80\xd4\xb1\xd6\xe3\x00\xaf\xf3\xfc\xe9\x86\x08\x06\xce\x31\x6a\xf5\xe5\x80\x2a\x6b\x0e\x7e\x64\x8f\x2a\x0f\x8c\x33\x15\x28\xd5\x39\xdd\xa1\x9a\x6c\xe2\xe9\x75\x10\xa8\x3c\x99\x52\x24\xba\x29\xcf\xdb\xb2\x6c\xea\x31\x2c\x73\xbe\x43\x34\x58\x83\x15\xf3\x14\x61\x7c\x9e\xd7\xf7\x4f\xa6\xce\xb8\xb9\x71\xbe\xef\x2e\x26\x57\x4c\x04\x8e\xb9\xf1\xf5\x71\x45\x0c\x32\x2a\xe8\xbb\xc3\x92\x73\x5b\x69\x50\xd4\x34\x98\x0d\xc0\x94\x1f\x19\xb7\xce\xd5\xd3\xee\xc1\x50\xe6\x7b\x97\xee\x4f\xea\x07\xca\x8f\x93\x30\xec\x99\xc4\x9d\xfa\x9b\xfd\x86\x45\x33\xeb\x09\x64\x3f\x1c\xa2\x94\x86\xba\x62\x45\x36\xea\x4e\x15\xd9\x5d\x7a\xa8\x0d\x74\x6b\xb5\xd8\x8f\x7b\x6a\x9f\x34\x5c\xa7\xdf\xa0\x39\xa1\x73\x0d\xea\xf8\x5c\x0d\x3c\xa0\x41\x45\x91\xef\x77\xe2\xbd\x59\x2f\xfc\x0d\x2a\x12\xc6\x69\xbd\x4d\x41\x72\xb8\x5c\xeb\xe1\x80\x4a\x02\x4d\x1f\xae\xce\xc5\x73\x7e\x7e\xc9\x8a\x9d\x31\xe9\x18\x5e\x4f\x07\x8e\xfa\x7d\xb8\xa5\x5d\x11\x62\xc6\xcd\x19\x95\x84\x3a\x75\x86\x86\x79\x5e\x7e\xb8\x95\xc8\x28\x39\x0f\xa2\x70\x95\xa0\x20\x96\x7b\x7d\x42\x99\x41\xde\x06\x50\x03\x03\x04\x50\x29\x37\x04\x45\x53\xac\x34\xdd\x10\xb7\x42\xfd\x33\xfd\xd7\x30\xaa\x50\xa9\x88\x44\xe2\x3c\x54\x1b\x90\xaf\x47\x7a\x28\xd6\xeb\x30\xfb\x4c\x83\x1f\x14\xf7\x3c\x65\xf7\xae\x03\x01\x09\x0f\xb4\x88\x1f\x94\xe5\x20\x8e\xd3\x47\x05\x09\x90\xa1\x82\x69\x43\xef\x61\xf0\x36\xd8\x11\x02\x58\x68\x1d\x2e\x77\xcd\x98\xc9\xa4\x24\x8b\xa8\xbb\xbf\x7b\x85\xa5\x2b\x4d\x2a\x29\x22\x14\x57\x2d\x7f\x7f\x24\x2f\x0c\x4a\xf9\x56\xcb\x61\xf3\x78\x58\xef\xbf\x18\xb7\x27\x77\x0a\x4c\x62\x5a\x1f\xac\x72\x98\x69\x7b\xfc\x45\xbf\x57\xa1\x8a\x94\x41\xa0\x43\xf3\x4a\x80\x1e\x70\x08\x4f\xf4\x3c\x23\x69\xff\x03\x47\x86\x12\x80\x1e\x0b\xbd\x5e\xd0\x75\x5b\x52\x6b\xc2\xa2\x6b\xec\x22\x3a\x07\xaf\x41\x2f\x8e\x93\x8e\x20\x90\xe5\xa4\x82\x7e\x8f\xba\xf9\xad\x3f\x4e\x5a\x1c\xa4\xa8\x4a\xcb\xfd\x58\xfe\x03\xbd\xd4\x27\xfc\xe2\x73\x59\xee\x5e\xb3\x66\x74\x51\xcc\xf7\xa8\xb8\x4b\x2b\xfa\xff\xb4\x41\x91\xf1\x94\x37\xd8\x04\x37\x28\x08\x08\x56\x46\x32\xfe\x6d\x40\x30\x09\x40\x90\x41\x4c\x45\xeb\x7f\x44\x9e\xd7\x9d\x59\x86\x14\x6d\x1e\x33\xfb\x8a\xcf\x32\x24\xd0\x67\x06\x29\x9b\x43\xdd\x94\x83\xed\x1f\xfd\x34\x20\x48\x70\xe7\x90\x33\xe6\x5b\xda\x51\x41\x9a\xd2\x2a\x54\xe0\xc7\x18\x22\x89\x61\x1c\x0b\x93\xd3\xc9\xec\x94\x61\xd1\xac\xf7\x5f\xba\x63\xed\xe7\xfa\x2a\x17\xf5\x6a\x8d\xd6\xcf\xc4\x33\xab\x7f\xe5\x30\x62\xc0\x74\xaf\x44\xd9\x6e\x03\xbb\xf3\xe9\x54\x56\xcd\xa6\xd8\x97\xe7\xaa\x80\xeb\x90\x13\xa3\x38\x25\x12\xa7\x99\x56\xbb\xf5\xfa\x66\x37\xbf\x22\x62\xa4\x24\xb7\xef\xfe\xe3\x78\xc1\xb3\x03\xe2\xc0\x0b\x6c\xb9\xeb\x4b\x9b\x5c\xde\xd8\xbd\x7d\x49\x13\xa2\xfb\xd9\x71\x60\xf1\x16\xa6\x45\xf8\x90\x15\x4d\xe7\x50\xd3\x0f\x8a\x10\x2d\xc6\xb8\x83\x11\xfc\x8a\x10\xec\x3e\x96\x1a\x5c\x84\x2b\x6b\x74\x96\x5a\xb3\xd7\x2b\x8c\xa8\x80\xf8\x9f\x9f\xfb\xd2\xfb\xf9\xdd\x9f\x40\xe7\x31\x96\x40\x3e\x22\x3b\xda\x8f\x47\xb3\x32\x46\xcd\x9c\xc8\xd7\xf9\xd8\x06\x7f\xe4\xf1\x23\xcb\x2e\x99\xc2\x04\x38\xb5\x79\xa8\x23\x41\x68\xd0\xcf\xeb\x32\xf6\x23\x69\x9a\xc6\xa4\x18\xef\xce\x91\x82\x24\x08\xca\x7e\xbb\xb8\xd9\x3c\xde\xb5\x39\xd3\x76\xbf\xbe\xe9\x0e\x8b\x98\x92\x8a\x1f\x0f\xab\xd1\xd5\xf1\xd4\x83\xb4\x23\xff\xfc\x20\xb2\xc0\xf8\x9b\xb8\x0a\x52\x8b\x2a\x2f\xca\xa6\xcf\xa8\x91\x6b\x1d\x0f\x55\x96\x4c\x61\xce\x48\xc8\x4c\xce\x01\x9e\xd1\x4c\x21\xb3\x27\x04\x95\x67\x85\xb3\xe1\x01\x84\x28\x4c\xa3\x8e\x6d\xf9\x50\xbe\xe3\x4c\xcf\x7d\x5c\x24\x47\xc1\x42\x72\xac\xa8\xcf\xc7\x2f\x50\xa9\x15\x9c\x46\x29\x24\x8a\xc8\xb8\x5f\x11\x20\x63\xf5\x0a\xd5\x71\xce\x0e\x15\x50\xc4\x1c\x9c\x72\x41\x05\x1f\x33\x6e\xc3\x6e\xa0\xd2\x14\x58\x9b\x30\xd3\x66\x08\xb4\x72\x8d\xc7\x49\x4c\x03\xd7\xc1\x38\xce\xb8\xc7\xb7\x23\x4c\x02\xe3\xfa\x12\x9b\xe7\xee\xaa\x25\x0a\xaa\x7c\xb9\x39\xb9\x84\x7c\x58\xbb\x41\xa9\x05\x09\x33\xae\x9b\x36\x6d\x00\xf7\x67\x15\xa5\xb4\x4a\x1f\x54\x9b\xa8\x97\x97\x6d\x29\xca\xe9\x75\xa9\x18\x24\x1f\x94\xa5\x2c\x2b\xa9\xeb\xc5\x7c\x56\xef\x45\x05\x82\x44\x0d\xde\x8d\x80\xa2\xe5\x27\xb9\x83\x82\x39\xe6\x99\x79\xee\xce\xf4\xb2\xfe\x6d\x26\xcc\x42\xf4\xc2\xd8\x26\x59\xb9\x05\x41\xcd\xee\x49\x88\x90\x7a\x86\x89\xb2\xfd\xba\xde\x1f\x56\x5f\x16\x8f\x77\xeb\xc9\x7d\xd4\x9e\x8c\xe5\xb8\x9a\x69\x99\x0c\x83\x3a\x05\xea\x80\xf1\xae\x4e\xb1\xcc\x41\xbe\xd1\x62\xf7\x91\x35\xf2\xb5\x1b\x93\x9a\xc0\xd2\x6c\x66\xbd\xe8\xdd\x68\xcb\x47\xad\xb5\xcf\x5d\x33\xd3\xb4\x31\xc7\x65\x74\xed\x79\x01\x01\x3e\x5c\xbf\xa1\x78\x37\xa5\xe7\xed\xa7\x69\xa7\xf6\x42\xe3\x0a\xef\x3c\x68\x20\x47\xc3\x11\xb1\xc7\x99\x0a\xc8\xd9\x50\x63\x77\xd3\x35\x43\x4d\xb2\x00\xa5\xd6\x58\x7d\xc1\xfc\x34\x9f\x80\x68\xdf\xd7\x04\x68\xd8\xbd\x66\xfd\x56\xa4\xfd\x48\x79\x03\x77\x54\x63\xc7\x31\x04\x71\x6b\xdf\x56\xca\x8c\xc1\xa9\x63\x3c\xf4\xbb\x87\xf6\x53\xe3\xc2\xfe\xb8\xfe\x63\x7f\x78\x7e\xda\x1f\x6e\xb7\x8b\xd5\x61\xff\xf4\xdc\x9d\x41\x30\xc2\xe1\x0d\x8b\x06\xee\x90\x04\xd5\x5b\x20\x0e\x5a\xd6\x3a\xf0\xbd\xc0\xda\xdf\x6f\x64\xe9\x54\xcd\x3b\xc3\x87\xeb\x7b\x17\x04\x91\xdf\xab\x62\xde\x9d\x9d\x04\xe1\xaf\xdb\x72\x3a\x10\x46\x2b\xf7\xc5\xa6\xe8\x4f\x9a\x68\x3e\xab\x57\x84\x13\xd6\xcd\x8f\x91\xf7\xc2\xf8\x8e\x86\xa0\x89\x60\xb3\x6c\x5f\x85\xee\x27\x85\x22\x92\x86\xa2\xf2\xf4\x81\xea\xb6\x42\x74\x57\xf2\x3c\xe0\xee\xdb\xc1\x51\x94\x24\x86\x7d\x54\xec\xce\xc7\xcd\xea\x89\x1e\x77\xdc\xd3\x7b\x74\xec\x19\x5b\xa2\x83\xd5\x84\x18\xc5\x51\x93\xdf\x12\x87\x29\x37\x33\x0e\xe5\x1b\x39\x74\x8e\xbf\x2d\x0e\x55\xea\x0d\x9a\x72\x84\xc4\x3b\x91\xdd\x05\xeb\xbe\x2f\x0a\xb9\x61\x4f\x74\xc2\xc3\x63\x45\x4e\xd0\x49\x24\xfc\x5e\xcd\xa2\x9d\x11\xa8\x6e\xcb\xaa\xa3\x90\x77\xb7\x22\x4d\x51\xa8\xbe\x32\xf0\x74\xca\x0a\xca\xd8\xbb\xb9\x95\xca\x50\x18\x66\x7d\x7d\x2a\x8b\x6b\x87\xa6\x41\x2c\xaf\x53\x1d\x29\x74\x2f\xdc\xfa\xe6\xdb\x6e\x10\x28\x6a\xce\x12\x6d\x51\x8a\x5b\x34\x61\xc1\xa7\xaa\x6d\xf3\xf3\x80\x47\x40\x01\x3a\xf9\xe8\x5e\xab\x56\x6a\xae\x3d\xb2\xf9\xfb\x80\x77\xac\x89\x77\xe2\xbe\x1b\x02\x65\x4c\xc3\x8c\x55\x79\xbb\xd5\x7e\x1d\x97\x27\xb5\xf0\x43\xb0\xa9\xd7\xea\x7e\x73\x5b\x56\x77\x30\x3d\xbf\xe0\x86\x4e\x2b\xce\x17\x6b\x95\x3c\xd7\x3e\xd1\x02\xcd\xe3\x69\x7a\xf9\xc6\x27\x6d\xfb\xd7\xb3\xd5\x16\x2d\xb5\x70\x2e\xa4\xcb\x73\x55\x58\x1d\xe8\x5d\x03\xcd\xd5\x6f\x54\x61\x4c\x43\x69\x75\xdc\x9f\xab\x62\x79\xf9\xe2\x70\x94\x6e\xe1\xd3\x2a\x35\xbb\xd2\x7d\xd6\xde\xa8\x9f\xbf\x02\x85\xce\xdf\x69\xc5\x15\x2d\x28\x55\x69\x64\x45\xdd\x4d\xc2\xc0\x94\xcb\x9e\xa0\xce\xea\x61\x54\xa2\x51\x28\x96\x0e\x30\x0c\x07\xb3\x16\x75\x87\xa5\x47\xc2\x20\xeb\xdd\xd3\x33\x59\xcf\xfe\xa8\xe0\x74\xc2\x6a\xf3\x7c\xbb\xfb\x02\xfd\x38\x1d\x78\x14\xe6\xde\x66\x2f\xaf\xcd\xaa\x4d\x9e\x6d\x89\x7d\x7e\xaf\xd3\x1a\x42\x5a\x51\x5c\x77\xdc\x15\x80\xc9\x01\xe1\xd3\x16\x99\xf0\x58\x00\x68\xcb\x42\xcb\x4c\x5d\x83\x9c\x85\xc7\x64\x02\xd2\x29\x6e\xd5\xaf\x1b\x35\xdf\x3e\x12\x9e\x8f\x7e\x94\x76\x68\xbc\xfc\xc4\xfc\xc9\x80\x00\x0c\xc0\xbc\xe9\x28\xec\xb4\x91\xcf\x83\xf0\xec\x67\xc2\x28\x36\xf6\x42\xc6\xad\x98\x9c\x2c\xae\xec\x0e\xdd\xd8\x18\x9d\x98\x67\x1b\x37\x81\x24\xef\x5f\x98\x02\xbf\x84\x17\x45\x41\xd4\xc9\x0d\x9c\xca\xac\x18\xaa\x2c\x08\x2f\xe2\x01\xc5\xb4\x77\x65\xfd\x8a\x45\xbb\xd0\xf7\x4e\xb9\x74\x94\xf2\xe7\xae\x1e\xba\x43\x59\xb5\xc9\xc0\x50\xb3\xac\x2c\xf3\x51\x51\x41\x78\x71\x18\x6b\xa3\x28\xa2\x8e\x59\x71\xa0\xd2\x5a\xd1\x90\xea\xf4\xec\x92\x2d\xbc\x18\xb9\x25\xab\xec\x6d\xd0\xf6\x8c\x55\x3d\x4d\x6e\x84\x97\x5a\x55\x78\x5a\x6c\x5c\xf4\x5d\xb9\x3a\xa9\xf0\x52\x30\x5d\x35\x18\xd6\x32\xfa\x83\x92\x58\x71\xa2\x5d\x46\x4c\x7d\xb2\xef\x25\xbb\x41\xdc\xd7\x9d\xde\xec\xf1\x7c\xb5\x4b\xb9\x51\x49\x4c\x21\x9e\xf5\xd6\x78\x2e\xcb\xdc\x6d\x85\xdd\x89\x94\xa6\x45\x16\x94\x22\x26\x06\xe9\x73\xcf\xbf\x8f\xe3\x7b\x01\x61\x42\x20\x82\xc5\x5b\x56\xc1\xf0\x85\x13\x1e\x44\x21\x01\xf2\xee\xcb\x17\xaa\xd6\xb4\xe9\xfe\xa7\xc2\x9a\xed\x70\x8c\x0d\x1f\xf7\xf2\x49\x7f\xd3\x0d\x04\x49\xc9\x8f\x93\x21\xb6\x71\x13\xf1\x71\xfa\xd0\x49\x78\x20\xb9\x30\xcd\x37\x7d\x1e\x92\x5a\x85\x27\x22\x41\x4a\x0b\x0f\x9b\xc7\xc3\x72\xf1\xf8\x75\xfb\x74\x7f\xdf\x1d\xe3\x92\x62\x19\x5b\x32\x81\xe2\xed\xa6\x02\xb7\x47\x08\x4f\x32\x24\xd9\xf0\xe5\xd3\xe3\xb7\xdd\xe1\x61\xf1\xc7\xe1\xe6\xdb\x96\xc4\x1c\xdc\x08\xc5\x84\xef\xc0\x0c\x27\xf8\x28\xb2\xe2\xe5\x76\xd2\x15\x12\x1e\x4a\xe3\xd4\x5d\xe0\xc7\x0e\xfb\x19\x81\x98\x50\xa9\xc9\x8a\x72\x9b\x66\x85\x63\xe4\x8e\xef\x82\xf6\x23\x52\xab\x22\xc2\xe1\x7d\xd9\xa3\x16\xfe\xd9\x1b\x2d\xfe\x33\xfd\xd7\xb8\x9e\xe6\x58\xdf\xc2\xd3\x20\xc1\x18\xc7\x65\x75\xb3\x51\x36\xcf\x9a\x81\x35\x08\xe6\x05\x9c\xde\xab\x4d\xfd\x44\xbc\xb6\xe1\x4a\x2e\x98\x87\x9c\xc0\xc2\x15\x7c\xd8\xe6\xe7\x93\x9e\x55\xfd\x13\x8c\x79\x9a\x76\xc7\x3b\xb8\x98\xee\x22\xe4\x0b\x55\x7f\xca\xc6\x1f\xa5\x67\x82\xb1\xc8\x98\x06\x3f\x7f\x5b\xde\x6f\x56\x86\x4c\x4e\x09\xa9\xbd\x79\xcc\x67\x48\x3e\x16\x1f\xd8\xbc\xfe\x98\xe8\xfd\xbb\x21\x71\x1c\x9a\x9a\x87\x09\xa6\x1e\xb2\xa2\x7d\x23\xba\x33\x70\x46\xf5\xc5\x7b\x27\x65\x24\x98\x0f\xa1\x35\x3a\x6c\x56\x50\xdc\x64\xb5\x38\x57\x35\xba\x0e\x96\xa9\x2c\xf4\x93\x98\x05\x7e\xc0\x7b\x87\xd9\x76\x8d\x2b\xc6\xed\x7a\xe6\x2e\x25\xe0\x91\x67\x83\x0d\xe3\x15\xf6\xdb\x3c\x20\x78\x3c\xf9\x59\xa0\x7c\xcf\xca\xcf\x3a\x5b\xca\xed\xf9\xda\xf0\xec\x93\x4f\x47\xa8\xa9\x65\xb4\x7e\xbc\x71\x06\xd8\x87\x09\xa9\x44\xb0\xd8\x8f\x08\xb9\x63\xf6\xc7\x5d\xf6\x52\x4c\xee\x62\x1c\x4a\xea\x42\xec\xb1\x6e\xcc\x76\xe6\xde\x2c\x96\x04\x2a\x1a\x0a\x08\x3f\x97\x79\x26\xaf\x24\xfe\x66\x5b\x3a\x82\xb5\xcb\xa5\x74\xab\xff\x0f\x84\xde\xcf\x56\xb0\x94\x21\x09\x3b\x1c\xb2\x7a\x41\x6f\xe6\xa0\x06\x39\x3e\x4b\xaa\x12\x6e\x48\x98\x68\x2c\x71\x0f\xe7\x5a\x0d\x91\x77\x82\x71\x3f\x22\x9e\xe6\x87\xeb\x57\x8c\xdf\x4e\x46\x70\xf0\xff\xfa\x7f\xff\x75\x41\xa8\xd8\x7d\x39\x41\x4e\x09\x46\x1c\xb6\x36\x44\xce\x21\x3b\xde\x3d\xec\xe7\xb7\x48\x06\x5c\xf8\x86\x4b\x53\x37\x59\x41\x51\xad\x3d\x51\xea\x75\xa7\x52\x09\xf7\xed\x98\xaa\xbc\x7c\x6e\xe2\x24\x98\xf0\x80\x32\x05\x71\xbe\x64\xc5\xcb\xba\x96\x55\xf9\x31\xb9\x30\x11\xb3\xc8\x19\x6b\xcf\x6f\x06\x4c\xa4\xc6\x87\xe9\xf0\x02\xa7\x27\xbd\x23\xb9\x91\xdd\x79\xde\x8c\x41\x30\x21\x0c\x1c\x98\x30\x8a\x13\xba\xd3\x6c\xbb\x50\x30\x29\x24\x61\x7b\xcc\xf4\xb9\x19\x58\x02\xb8\xab\x94\xca\xb4\xee\x4e\x65\xed\xd4\x32\xa7\x5d\x80\x5f\x03\x5c\xfe\x69\x65\x80\x04\x53\x49\x4c\x64\x33\x5d\x37\x43\x49\x49\x77\x34\x35\xf6\xa2\x32\xff\x4f\xe0\x8f\x97\x2d\x95\x9a\x60\xe1\x05\x8b\xe7\xb2\x39\x74\x9f\x50\x01\x59\xc7\x9f\xce\x79\xbe\xcd\x4e\xab\xd2\x71\xec\x04\xc3\x20\x25\x98\xa3\x55\xcd\xbf\x6d\xf7\x94\x0e\xbe\x44\xdf\x9b\x4d\xea\x32\x82\xe9\x30\x26\x02\x25\xe4\xf9\x43\x96\xbb\x38\x86\xe9\xc4\x58\xdd\x2d\xd7\xfb\xc3\x76\x7d\xbf\x5e\xec\xd6\x03\xfd\x34\xc1\x34\xc7\x24\x34\xc4\xeb\x6a\xfa\xf2\x69\xf4\x94\x41\xed\xd9\x57\x4f\x39\xc0\xcd\xf8\xbb\x7d\xe6\x99\xe6\x5f\x51\x36\x84\x77\xec\x79\x09\xc2\x67\xcc\x37\xa5\xc5\xd7\xf2\x74\x83\x3f\x87\xdb\xb6\xcf\x12\xcd\x3d\x07\x73\xa3\x9a\x3f\xed\x3e\xb3\x73\xd2\x67\xdc\xa7\x97\x6d\xff\xb4\x5f\xdc\x1f\x2c\x4f\x79\xf9\xb4\xdf\x3f\x3d\x1c\x96\x4f\xdf\x1c\x0e\x59\xf8\x7e\x02\x24\xdc\x42\xfd\x85\xfb\x9b\xc3\xfd\x62\xb9\xbe\xef\x0e\x4a\x2f\x72\x36\xaa\xbf\x8d\xce\x1f\x84\xc0\x3b\x85\xa5\x7a\x79\xf9\xd1\x26\x4e\xfb\x91\x33\x91\xf0\xc3\x34\x21\x30\xcf\x61\xc4\xe9\x1c\x2a\x5b\xcd\x2f\x87\x7e\x28\x02\xe1\x39\x1a\xe0\xa4\xbc\x25\xfc\xc8\xd3\x89\x41\x93\x64\x44\x9b\x76\x0d\x03\xe1\x47\xbe\x30\x1d\xf1\x60\x74\xe7\xa2\x58\x87\x71\x17\x67\x53\x11\x64\x18\xbe\xfa\x11\x1a\x95\x79\x6b\x3c\x6e\xba\x1f\x75\xf7\x86\xe0\x27\x0e\xa6\xf6\xd3\x71\x80\xd2\x06\xdc\xa4\x1a\x3c\x2e\x17\x0b\x3f\x4e\x22\x63\x6e\x5a\x10\x9c\xf6\x57\xc1\xbb\x1f\x0b\x40\x83\xf2\x6f\x93\xf3\xbf\x74\x67\xb7\x9f\x4a\x62\x4e\xb1\x1e\xed\xba\x9b\xc7\xbb\xc3\x72\xe1\x36\x5f\x3f\x11\x3a\x70\xf2\xb0\xae\xd8\x65\xd3\xc3\x7e\x7b\xf4\xd3\x30\x40\xbf\x93\xfd\xb8\x79\x5c\x4c\x6e\x79\x6a\xad\x05\xad\xb6\xdc\x69\x3e\x90\xf0\x53\x25\x22\xfb\xdc\x0c\xa9\x68\xa3\xa6\x00\x12\x37\x52\xc7\xce\x7c\xff\x7c\x72\x4e\x5c\x9d\x4b\xc0\x27\x7d\xf6\xf6\x63\x49\x04\xbd\xa2\x85\x45\x68\x0d\x7b\x04\xc2\xe7\xe0\x93\xa5\xc9\x33\x5c\xe8\xd5\x9a\xbf\xd3\x5c\x0a\x67\xdd\x49\xcd\x29\x87\xdb\x74\x87\x35\x23\x55\x80\x73\xed\xd4\xa5\x0c\xad\xfe\x0e\xa6\x01\x9f\x0f\x5c\x11\xca\xa7\xac\xb2\x97\x1b\x7c\x77\x67\x00\x30\x99\xb4\x26\x2e\xae\xed\xcf\x4c\xb0\x64\xc2\x17\x9e\x17\xf4\x4c\xe3\x4e\x9d\xee\x9d\x6a\x61\x16\xc0\xfe\x6b\x52\xe6\xe8\x8d\x13\x29\xa7\x45\xe8\xdb\x6a\x71\xff\xd7\xa1\x9b\x2f\x94\xa4\x8e\x30\xdd\xcc\x8e\x33\xd9\x75\x47\xdc\x4f\x91\x22\x52\xb6\x23\x36\xd4\x4e\x10\xbe\xf2\x25\x65\x27\x65\x85\x03\xfc\x9d\xf0\x31\x52\x41\x07\x3a\x6b\x53\x96\x79\xd4\x8b\xf0\x11\x42\x61\x41\x9b\x6e\xc7\x9c\xcb\x66\x02\x0f\x58\xea\x9c\x97\xda\xa5\xe6\x37\xf7\x77\x99\x58\x66\x4d\x3b\x2f\x9f\xcb\xaa\x99\x77\x9a\x10\x01\x63\x82\x34\x10\xe0\x1d\x2b\x78\x21\xeb\xfb\xaa\x0d\x9a\x87\xd7\x1d\xf8\x76\xfd\xf8\x72\x86\x42\xe1\xdf\x0c\x80\x03\x3f\x88\x84\x6d\xb0\x2d\x84\x73\xcd\x17\x41\xe0\x71\x12\x0d\x95\x8e\x90\xf6\x4b\xc6\xb5\x08\x02\x1f\xa8\x91\x76\x82\x4b\x2f\x14\x23\x82\x40\x25\xa2\xb7\xe2\x70\x35\x8d\xbf\x08\x2b\x07\xf9\x5b\x10\x68\x8f\xd8\x99\x86\xc8\xbc\x3b\x8b\x4e\x01\x91\x70\xd5\xe3\xd9\x1c\x84\x41\x10\xda\xa6\xed\x96\x16\x83\x99\x0a\x47\x10\x06\x86\x59\xf0\x9a\xbd\xbc\x62\x3d\x26\x79\x74\x43\x90\x2a\xbc\x0e\x6b\x94\xe5\xbd\x04\xd5\xaf\xb2\xc8\x20\x4c\x74\x68\x30\x5f\x70\xb4\xfb\x9c\xff\x27\x82\xeb\x8f\x8a\x20\x04\xf4\x02\xeb\x7d\x9e\x15\x2f\x4f\xe7\xa6\x6f\xaf\x89\x20\xf2\x90\x2a\x79\x59\xbd\xae\x25\x9c\x5c\x7b\xca\x2d\x3c\x41\xc4\xbc\x34\xe9\xee\xc6\xbe\x42\x62\x13\x4c\x7e\x5f\x14\x86\x54\x7a\x68\x03\x21\x03\xb0\x73\xf7\x7c\x8a\x88\xb8\xbe\xfe\x88\x1b\x49\xa7\xed\x1f\x4b\x31\xea\x59\x8b\x20\x12\xa6\xc0\x4f\xdb\x40\xf7\x7b\x62\x2f\x4a\xe4\xa0\x5b\x73\x37\x60\x24\xb8\x21\xb1\x4f\x33\xcc\x76\x0e\x06\x0a\xcd\xfd\x59\x92\x80\x44\x8a\xa5\x61\xbe\x50\xf7\x83\x24\x50\x66\x66\x44\x2c\x03\xab\x4f\xd4\x3c\xb4\xb9\x7a\xfb\xd2\x1c\xaf\x4c\x00\x44\x90\xf8\x91\xd1\x00\x68\xe0\x05\xef\xb0\x28\x8f\xb6\x81\x9e\xda\x01\x5c\x02\x61\x1b\x56\x4f\x9b\xc7\xc3\xf3\x7a\x6b\xec\x0f\xdc\x25\x71\x1d\x24\x0e\x4a\x4d\x38\xea\xe5\x65\xa3\xbe\x67\x75\x36\x80\x0e\xf4\x5f\xc6\x35\xb7\x6d\x6f\x8b\x72\x32\xab\xfa\x6d\x59\x0d\x6a\x07\x01\x04\x1e\x35\x17\x77\x8f\x5f\x7f\x01\xf2\x69\xc7\xc5\x94\x09\x74\x35\x27\x6b\x10\x9c\x35\xaf\xd7\xf5\x5f\x11\xb4\x21\x07\x0c\x44\x73\x17\x0f\x4f\xdf\x1e\xdd\x1e\x1a\x08\x30\xce\x67\x47\xf8\x69\x5d\x47\x07\x13\x5d\xc8\x58\xf7\xe4\xbe\xed\xca\xf7\xe6\xe8\x7d\x22\x90\x42\xd1\x9c\xea\x38\xc9\x93\xe3\x8a\x25\xd4\x71\xa7\x88\x6a\xf7\xfc\xad\x56\xab\x8e\x29\xeb\x86\x68\x69\x59\x86\xcf\xe5\x0d\x21\x7d\xbb\x0a\x45\x80\xbe\xd1\x16\xa4\xdf\x69\x9c\x84\xdb\x64\x44\xbe\x96\x37\x78\x2c\x27\xdf\x85\xdc\x30\x4d\x2d\xe5\x8d\xac\x55\x46\x12\x1e\x83\xc9\x82\xc8\x62\xc7\x86\xca\x0c\x87\xfa\x2f\x80\x4c\x7f\x4b\x78\x5e\x04\x5a\x25\x46\xdc\x04\x5f\x2c\x67\xf3\x93\xcf\x77\xe3\x35\x65\x06\xeb\xef\x0f\xbb\xd5\x76\xf3\xdc\x86\xe8\x77\x9b\xdd\x7e\xfb\xe7\x61\xf1\xec\x92\xe4\xd0\xe3\x91\x33\xae\x50\x59\xb3\x50\xef\xed\xcb\x3b\xc5\x56\x8b\x90\x01\x97\xc6\xb1\x5e\x95\xcf\xe5\x8f\xe1\x6b\x1a\x32\x61\xe7\x58\x59\x39\x8a\x87\x08\xfd\x18\x29\x3d\x83\xba\xce\x5e\x8a\x36\xc3\xbe\x3a\x67\x28\x05\x75\xe5\x49\x8c\xae\x57\x54\x14\x61\x1c\x78\x54\x70\x33\xcd\x98\xfa\x19\x2b\xe3\x8b\xef\x0e\x87\xb1\x13\xbd\x30\xef\xc9\x46\x2d\x5e\x20\x2b\xea\x59\x4e\xb6\x08\x63\x48\x98\x74\x60\x43\x2b\xcc\x04\x63\x3e\x8d\x08\x93\x24\x75\x9a\x60\x07\xa8\x44\xd6\xd4\x87\x1a\x72\x24\xfa\xbc\xfb\xe2\xd4\x0b\x03\x2b\xee\x63\xaa\x74\xcf\x39\x48\xd2\x22\x7a\x3c\x1f\x27\xe7\x4b\x13\x23\x81\x7d\xb0\x00\xd5\x8e\x22\x40\x76\x4b\xd7\x2c\x91\xcf\xe0\xe1\x73\xdb\x7b\xc8\x43\x46\x77\xee\x0e\x9b\x36\x5a\x18\xf6\x01\xed\x08\x88\x85\xea\x20\xd0\xf5\x09\x8e\x16\x7a\xe0\x0e\x27\x1a\x2d\x5c\xb0\x43\x42\xb2\x64\x94\x8d\x84\xc2\x57\xb4\x1c\x9d\x8c\x3d\xdb\x93\xd6\xf2\xd5\xe1\x37\xba\xb2\xeb\xec\xd6\x1c\x0a\x9e\x10\x84\xc5\xd4\x1e\x77\x84\x4d\x3b\xce\xf0\x15\xdd\x70\xc1\x89\x6f\x54\xcb\x57\x54\x67\x1b\x63\x18\xd6\x72\x7d\x9b\xfd\xec\x75\x06\x5c\x53\x21\x94\xcc\xa7\xdc\xee\x60\x7b\x06\xfd\xa6\x3b\x75\x6a\x1f\xdf\x38\xc9\xb8\x67\x77\xeb\xbb\xf2\xbd\x59\xb4\xc9\xae\xb4\xe8\x1a\x03\x63\x9c\x41\x42\x88\x50\x26\x22\xf1\xac\x85\xde\xf1\xe4\x1c\xb5\x68\x23\x70\x77\x54\x45\xa1\x96\x23\x8d\xc6\x76\xfa\x4c\x1a\x14\xa1\xe2\x28\xed\x54\xbc\xab\xca\x8f\x55\x39\xf1\x20\x15\x21\x46\x86\xba\x92\xd5\xf7\x50\x37\x5d\xf9\x6f\x7c\x1a\xcd\xb8\x74\x7a\x58\x65\xd1\xbc\x76\x6f\x9d\x66\x68\x64\x68\xcd\xe2\xb3\xea\xb8\x14\x22\xf2\xc2\xc0\x6c\xe4\xed\x2b\x50\xe6\x39\x75\x2e\xfe\x5a\x41\x57\x44\x0c\xcd\x2e\xfc\x82\xcd\x4e\xbe\xe2\x71\x16\xee\x3e\xba\xbe\xc8\x97\x40\x3f\xb3\x4d\x9e\x06\x58\x3b\x9a\xdb\xd1\x5f\xb1\x7c\xec\x39\x02\x0e\xcc\x32\x5f\xd6\x85\xac\x2e\xa7\xe6\x2b\x5e\x46\x33\x34\x0a\x20\xe0\x8e\x94\xfc\x35\x93\x6f\x93\x5d\x2a\x0a\x54\x9a\x18\x16\x99\x95\xfa\x74\xf8\xee\xf1\x37\x45\x1e\x52\xc0\x47\x3c\xff\xac\xc0\x8d\x5b\x69\xa2\x38\xd0\xc6\x9c\x0f\xde\xaf\xd8\xa9\xa3\x2b\x89\xe3\x88\x32\x4a\x57\x2e\xb4\x15\xef\xb1\x36\x87\x1b\x9b\x18\x67\x01\x59\x1e\x4f\xed\xb2\xd6\xa9\xbb\xfe\xad\xd2\x67\x14\x73\x83\x02\x2c\xca\xc6\x22\x37\x51\x59\xed\x5f\xdd\x60\xe5\x87\x5f\xca\x73\x17\xfc\x45\xb1\x8a\x65\xa7\xdd\x9a\xb7\x1b\x7b\x35\xed\x6a\x45\x09\xe3\x60\x09\xef\xed\x3e\x5b\xcf\xca\x01\x89\x28\x0d\x18\x41\x9a\xd6\xcb\xc5\xe3\xd7\x81\x8e\x83\x88\xd2\x76\xc9\xa6\xd7\xa3\xc9\xaa\x79\x75\x3f\x11\xa5\x68\xf1\x2d\xc6\x22\xcf\x88\xe6\xb9\xd7\xed\x8a\x41\x28\x22\xee\xc5\x68\xa1\x61\xf7\x99\x1e\x28\x58\x89\x88\xa7\x92\x50\xef\x27\x92\xb0\x37\xb0\xb6\x76\x3b\xde\x9e\x73\xec\x7e\x39\xd7\x86\xbf\x66\xd4\xa2\x8d\xc6\x41\xb7\x4b\x47\xe0\x23\xb3\x00\xf4\x25\xa8\x17\xbc\xcb\xde\xa7\xfb\x53\x04\x71\x4c\x94\x0d\x63\x61\xb1\x29\x9e\x3b\x49\x44\x87\x02\x4f\xdd\x48\x85\xce\xee\x93\x00\x00\xae\xda\x1b\x09\x8f\x53\x9d\x7e\xf1\xf8\x30\x74\x28\x13\x91\x08\x3d\x4a\x82\x89\xff\xfc\x23\xcb\xbb\x29\x27\xb8\x31\xfa\x75\x2d\xcc\xdd\x59\xcc\x2f\xb2\x91\xf4\x04\xd5\x48\xc5\xb9\x2a\x9e\xb1\xfa\xc0\xac\x0d\xfb\xbb\xa2\x61\x24\x25\x37\xda\x49\x43\x10\x1f\x9b\xfc\x46\xa9\xa5\xb2\x2b\x75\x3b\x85\xd8\xb8\x0e\x1b\x29\xdf\x50\xaa\xf6\xcf\x9b\xee\x4f\x89\xf2\xac\xf1\xb8\x0d\xdc\xb6\x78\xca\xb1\xc8\xea\xd7\xb9\x25\x7e\xc4\x2f\x98\x10\xa7\xdb\x34\x19\x69\xe6\xb8\x3e\xc4\xcf\xb2\xbb\x75\x18\x29\x22\x78\x14\xf8\x61\x8c\x98\x6f\xcf\xcd\xb9\xc2\x89\x96\xff\xa7\xb1\xd4\xf8\x7b\x74\x0a\x42\xf4\xe4\x9a\x53\x49\xac\x5a\xf7\x55\x5a\x21\x89\x39\x9c\xe0\xf2\x74\x9e\x85\x1a\x88\xd8\x63\xd2\x91\x90\xff\x71\x46\x67\x44\x37\x1e\x62\x99\xfc\x27\xb8\x34\xa5\x85\x90\x88\x98\xf9\x40\xe4\x19\x4d\x51\xe3\xae\x81\xb7\xa9\xde\x8d\x88\x19\x57\x54\xe2\x3c\x58\x45\xcb\x9c\xd0\x31\xa8\x9c\x24\x0b\x55\xdf\x9c\xaa\xd7\xa8\x30\x14\x33\xa9\xa9\x8f\xf2\xf0\xb4\xdc\xdc\x6f\xf6\x7f\xae\xb6\xeb\x1b\x27\xc5\x2e\x62\x3f\xec\x50\xee\x26\x84\x1a\xdd\x96\x38\xf0\x8d\x3e\x89\xe9\x2c\x2e\xf2\xc9\xca\x10\x07\x56\x90\x86\xa6\xee\xcd\x6a\xb5\xfc\xd5\x22\x18\x07\xca\xd3\x46\x5c\xa1\x1a\xbe\x6b\x71\x80\x22\xb4\x37\xdf\x80\x39\xea\x25\xbd\x8f\xd7\xde\x3f\x22\x8e\x63\xe3\x37\x2f\xcb\xfa\xb7\xf1\x81\xb4\x03\x09\x3c\x9e\x8f\xcf\x65\x9d\x91\x56\x81\x5d\x46\x46\xd4\xb6\xf1\x55\x25\x2c\xa6\xfe\x94\xed\xef\x7f\x2f\x9b\x9e\x25\xe9\x86\xa4\x42\xbb\x86\xfb\x16\x3a\x2b\x47\x11\x27\xc2\xac\xff\x3a\x83\xe6\x9a\x21\x20\xe2\xd4\x1b\xac\xae\xc7\x13\x14\x17\x82\x00\xbe\x5a\xe6\xd3\x64\xb0\xe4\xd4\x21\xd9\x9d\xc5\x31\x6b\x4c\x4f\x7f\x89\xcd\xe4\x5a\x78\xec\xa5\x26\xad\x03\x75\x50\x2f\x3f\x0f\x59\xf1\x8e\x45\x53\x56\x97\x83\x05\x48\x1f\xba\x30\x2e\xe6\x0a\x89\x39\xe2\x5e\x71\x6a\xf1\xcc\x4a\x1e\xd8\x0f\x80\x2f\x8c\x93\xc8\xa9\xca\x1a\x7c\xa2\xa6\xee\x97\xac\x1e\x91\x88\x27\x9f\x88\x8d\xca\x8a\x15\xd9\x21\x3b\xcc\x4f\x46\x02\x23\xc5\xa9\x8e\x56\x05\x0d\x7c\x9a\xfa\x0c\x36\xc4\x58\xa4\x41\x6a\x12\xfa\x8c\x3a\x00\xed\x32\x62\xc8\x5f\xee\x77\xca\xc8\x4f\x27\xf6\xaa\xbf\xaa\x89\xc4\x32\x8a\xd1\xc0\xf6\xc5\x64\x17\x8b\x55\x1a\xab\xb8\x57\x18\x1c\x19\x46\x59\x22\x98\x1a\x4e\x5e\xc5\x8d\x34\x96\xf9\xea\xb1\x6e\xd8\xef\xa3\x2f\x55\x42\x12\x3a\x81\xf0\x42\xbb\xd7\xd2\x95\x03\x63\x0c\x8d\xc5\x43\xdd\xa9\x59\x7d\x2b\x6c\x95\xb3\xdd\xb1\x97\xe7\x8b\xa1\xa9\x0e\x50\x4b\xee\x93\x92\x51\x38\xf7\x05\x2b\x51\xaf\x5e\xc7\xe8\x69\x91\xb0\x30\x40\xd1\xe5\x6e\xf5\x2a\x87\x0f\x41\xeb\x46\x37\x00\x12\xc9\x2d\x1a\xc2\xdc\x85\x7d\x49\x82\xef\xe3\x0a\xa9\x1b\xad\x50\xda\x12\xef\xf7\xac\xc0\x0b\x54\x16\xfb\x38\x97\x83\x24\x7e\x82\x04\x9f\x5b\x3d\x66\x0d\x8e\x2e\x2b\x00\x23\xe2\xf8\x0a\xf5\xfe\xa3\x6c\x37\xa5\x31\x66\x4e\x24\x61\x60\xea\xa0\x4e\xbc\x40\xb1\x74\x14\xc7\x26\x91\xe7\xbb\x4b\x69\xc3\x60\xf2\xec\x5f\xff\x6c\x2a\x50\x83\x49\x65\xc7\xc6\xdc\x74\x71\xff\xbb\x1e\xc4\x08\x49\x0c\x7e\x34\x64\xe6\xdf\xe2\x75\x1e\x3e\x3b\x8f\x93\x58\x32\x03\xad\x43\x38\x06\xed\x1b\x35\x52\x12\x17\x49\xac\x05\xcd\xa0\x43\x85\xb2\xac\x94\x13\x1e\x9a\x32\x22\x45\x92\xb0\x80\xda\x28\x9b\xe3\xa9\xac\x9a\x36\x05\x5e\xba\x73\x24\x7e\xe4\x1b\x4d\x3c\x12\xfc\x66\x87\xda\x50\x8b\xdc\xe1\xc8\xd3\x96\xe5\xba\xac\xa0\x90\xaf\x9b\x62\x7d\xca\xea\x52\xcd\x43\x65\x45\x92\x48\x9f\x81\x13\xa4\x83\xec\x68\x3b\x16\xee\xa8\x32\x31\x05\x28\xb5\x87\x97\xe5\xe5\xa1\x6c\xb3\xac\xfd\xe5\x64\xa3\x99\x09\x59\x55\x24\x29\xf3\xb5\xfd\xc0\xe1\xdf\xe7\x72\xc6\x6d\x70\xfe\x32\x52\xdf\xa3\x3c\x69\xbf\xdb\xad\x57\x4f\x5d\xd3\x2c\x69\xdf\x39\x23\xae\x50\xea\xac\x69\xd7\xc8\xa1\x3a\xc5\x68\x12\xa6\xa9\xd1\x4d\x27\xd7\xfa\x4f\xc9\xc5\x7f\x67\xf7\xff\xdc\xee\xb7\x7f\xbd\x93\x54\x1a\x1c\xf0\x11\x15\xe4\xa6\xb0\xf3\xeb\x5e\x5b\x22\xbd\x94\x14\xb3\xd7\xdb\xd5\xa8\xe0\xed\x0e\xfb\x29\xad\xdf\x39\xd4\x8d\x51\x9d\x9c\x4c\x57\x19\x45\xcc\xe4\x61\xc7\x63\xd6\x34\x87\x93\x6d\xa4\xcc\x7f\x9b\x4a\x03\x52\x73\x3b\x95\x95\x2c\x47\x6f\x99\x42\x8d\x36\xe8\x3e\x57\x85\x2d\xfe\x11\x7f\x3e\x57\x0b\x45\x8e\x68\xb5\x8b\xe6\xc6\xe7\xc4\x28\xa2\x1e\x4a\xe9\xfa\x16\x8e\x75\xe0\x4e\x8d\xca\x14\x0f\xc4\xf9\x72\x9f\x1d\x27\x32\xae\x22\x41\x14\xcc\xc9\xd9\xca\x0a\x4e\x0f\x59\x41\xb2\x29\x57\x75\xef\x04\xb5\x59\xd9\x09\x23\xf8\xad\xe9\x04\x05\x44\xa2\x59\x4c\xd9\x68\xf6\xad\xdd\xdd\x60\xf8\xe6\x6a\x00\xaa\x06\xb4\x31\xcf\x53\xe7\x1b\x2b\x52\x4f\x72\xaa\xae\x9e\xe0\xf2\x50\x16\x78\x69\xca\x01\x8b\x58\xa4\x2c\x32\x14\x73\x53\xa3\x7b\x80\x37\xac\x06\x26\x90\x6e\x50\x0a\xa4\x40\xbc\xbb\x1f\xac\xa6\x7f\xd9\xb1\x48\xdb\xf8\x2c\x75\x36\xe4\x1f\x83\xc5\x20\x65\x32\x25\x44\xa0\x55\xbe\xc5\x06\xab\x99\x40\x21\xf5\x59\x42\x60\xcb\xd7\xf2\x5c\xe3\xb0\x6e\x90\xfa\x69\xec\xf1\xbe\x43\x37\x6c\x0d\xb4\xab\x66\x97\x1c\x8e\x7f\x87\x0f\xe6\x09\xdd\x97\x2f\xcb\xf2\x3c\x10\xa9\x9a\x7d\x33\x1c\xc3\x5e\xa4\x01\x53\xb4\xa1\xb4\x51\xce\x8c\x3d\x94\x48\x83\xd0\x57\xb6\x0c\x66\xd0\x3c\x4e\x02\x61\x79\x31\x01\xe4\x2f\x5f\x8e\x34\x88\x15\xad\x43\xed\xac\x2e\xcf\x9f\x44\x0a\x69\x18\x78\xb4\x6f\x0d\xa9\xba\xef\x58\x9c\x67\xb9\x2d\xf6\x33\x91\x17\x90\x8a\x15\x12\x5c\xe4\x06\x65\x56\x7f\xa6\xae\x23\xd2\x28\x02\xcb\x9a\x21\x1c\xff\xfa\x1f\xdf\x36\xb6\xe7\x39\x0e\x14\x67\xbb\xb2\x69\x24\x38\xed\x9a\x66\xcb\xbf\xa9\xce\xf3\xba\xf2\xed\x40\x63\xb2\xb7\x2a\x25\xc8\x32\x1f\xba\x47\x8b\x34\x8e\x0c\x71\xc2\x6a\x12\xd1\x5c\x1d\x67\x57\x69\xcc\x4d\x45\x77\xf1\x88\xc7\x32\xdb\x39\xca\x49\xdf\x0b\x4f\x53\x4f\x13\x78\xd6\xf5\x3a\x6c\x83\x67\x67\x0b\x65\x7f\x25\x6c\x35\xb9\xde\xf6\xf1\x6b\xb3\x31\x2f\xaa\x66\xca\xe2\x10\x29\xf7\x62\x02\xf3\x59\x63\xd1\x6e\x3f\x4a\x79\x98\x50\x0b\xe9\x08\x3f\x6d\x04\xef\x8e\x40\x12\x6a\xaf\x6b\x0f\x99\x06\xd9\x78\xaa\x82\x40\xca\x17\x9b\x76\xee\x43\xa1\x9a\x9e\xc4\x26\x52\x82\xec\x52\xd5\xac\x2a\x8b\x97\x2f\x30\x80\x3a\xb8\x11\x41\x1c\xa9\x31\x03\x33\xea\x3e\x1d\x7b\xe4\x7c\xa2\xb3\x42\x99\x3d\xcd\x02\xff\x3e\x01\x10\xa7\xa2\x4d\x06\x3a\xd7\x9d\xdb\x73\xa1\xb2\xe2\xa5\xb9\x56\x65\x13\xa9\x62\x8a\xde\x83\xd5\x62\x7b\xb3\x78\x7c\x5a\xdd\x2f\x76\xbb\xcd\xca\x7d\xb1\x0a\xbc\xd8\x76\xe3\x6f\xb3\xe2\xba\x79\x91\xaa\x20\x54\x2e\xf0\x7a\xa9\x10\x87\x2c\xd9\xe9\x66\xe5\x76\xdd\x54\x41\x1c\xdb\x14\x67\xdd\xbc\x5e\xb9\xfb\x8b\x14\x85\x9f\xa6\xa3\x40\xf2\x07\x66\xb3\x1a\x25\xed\xd8\x44\x84\x4e\x8a\x4a\x66\x90\xdb\x8e\xfa\x9c\xe5\xaa\x48\xb5\x1f\xf2\x7e\x19\x5b\x92\x23\x5f\x3e\x1d\x13\x01\x51\xb9\x57\x97\xff\xcf\xda\x9f\x74\x37\x8e\x23\xd1\xe2\xf8\x77\x79\xab\x5a\xd4\x82\x20\x38\x80\xff\x9d\x24\xcb\x99\xea\xf4\xa0\x96\x94\x99\x55\xdd\xa7\x8f\x0e\x86\x80\xc4\x32\x45\xaa\x38\xd8\x56\x7d\xfa\xff\x61\x00\xe0\x24\xd9\xd5\xfd\xde\x6f\xd3\xd9\x65\x82\x14\x07\x20\x10\xc3\x8d\x7b\x05\x94\x57\xce\x28\xd3\xa1\x72\xba\xba\xbb\x34\x03\x17\xa1\xfd\x32\xca\xc6\x0e\x57\xb4\x8e\x89\x61\x68\xe6\x35\x6c\x0b\x5d\x2f\xf8\xf9\x27\xaf\x46\x14\x9e\x82\x69\xa5\x2d\xf5\x44\x3b\xbf\x96\xef\x67\xcc\x77\x39\xf0\x01\xbe\x51\x7b\xbd\xc4\x23\x0a\x1b\x6b\x6c\x7f\xc5\x0e\xf8\x69\x3b\x20\xa2\xfb\x77\xf2\xa1\xe4\xe7\xd8\xb3\x4d\xbc\x98\x62\x29\x80\x77\xb5\xab\x9e\xb7\x46\x24\x84\x10\xa3\x30\x53\x9c\x4e\x45\x8e\xc4\x79\x87\xe6\xa3\xac\x57\x42\x82\xc4\x72\xdf\x80\x68\x2e\xeb\x02\x2b\xa3\xc3\x0d\x20\x21\x3a\x11\xa8\x99\xdb\xff\x84\xef\x2b\x27\x0e\x85\x34\xf6\x3c\x03\x3e\x11\x29\x10\x89\x1f\x27\x18\xe3\x60\x5d\x6b\x03\xd8\x14\x3c\x3a\xce\x15\x52\x9b\x98\x9c\x27\x7e\xaa\xab\x76\x25\x91\x50\xce\x5d\xab\xc8\x13\xbc\x3d\x14\x87\x03\x86\x22\x8e\x0d\xee\xf6\x43\x05\xa1\x97\xc4\xc3\x9a\xf7\x4d\x3b\x64\x09\xd9\x45\x12\x25\x3e\x56\xf2\x26\x30\xa1\x8f\x5a\x0d\x44\x12\xd9\x46\x18\xeb\xc6\xac\x3b\x8e\x46\x91\x44\x60\xb4\xcb\x91\x46\xe5\x16\xdd\x90\x48\x62\xca\x8c\x16\x84\xf5\xfc\x89\xf7\xdf\x9a\xc9\xff\xf5\x5f\xf7\x83\x12\x5c\xa6\xf2\x67\x51\xbe\x0c\xfa\xc5\x44\xc2\x42\x41\x7b\x01\xd2\x47\x8b\xf4\xae\xba\xc3\x51\xe8\x00\x40\xb3\x2c\xbb\x2f\xca\x75\x23\xbe\xc1\x65\x6c\x97\x13\xc6\x13\x97\x40\x79\xb8\x42\x44\xd9\x31\x09\x31\x2a\x66\xaf\x58\xe7\x59\xe5\xba\x68\x17\x80\xfb\x9d\x24\x64\x5c\x77\xbf\x63\x7a\xba\x50\x46\x54\x75\x23\x38\x33\x88\x26\x83\xe9\xb2\x32\x26\x83\x27\xe1\x9e\xc9\x12\x7f\xe5\xf2\x65\xb2\x4d\x25\xdc\xa7\x98\xdb\xdd\x36\x67\x28\x87\x56\x21\xe1\x41\x0c\x36\x90\x43\x8f\xd8\x1a\x2b\x2b\xf5\x39\x7e\x04\xe1\x09\xf4\x09\x4f\x3c\xcd\x57\x8b\xe7\xfb\xa2\x29\xeb\xe3\x4f\x80\x49\x00\x96\x08\x6e\x28\x9a\x8a\x92\xcb\x2c\xfd\x0b\xf6\x7f\x36\x50\x5e\xc6\xb8\xaf\x7f\xd3\xff\xb8\xd1\x90\xa0\xcb\xd3\x5e\x15\xa9\xad\xdb\xfb\xab\xb6\x45\x97\x72\x4d\x04\x74\x74\x49\x5d\x7d\xd0\x56\x2c\xec\x08\x29\x7d\x27\x5e\x3d\x50\x2a\xc7\xbe\xa7\x1e\x81\xe5\xc6\x02\xb1\x60\x81\xdc\x02\xe3\xe6\x4d\xf6\x72\xab\x41\x66\xda\x2a\x93\x28\x8f\xe2\xb6\xb2\x6f\xf7\x15\x80\x2d\x12\x4b\x35\xe5\xe7\x5c\x9a\x22\x51\xbe\xc4\x1e\xbb\xcd\x72\xbb\xdc\xfc\x58\xde\xed\x8d\xd0\xcb\xde\xb6\x60\x6d\xdd\x9d\x81\x17\x63\x27\x46\x3b\x31\x6a\x53\xf6\x46\xf7\xc8\xb2\x5d\x0b\x4e\x88\xf4\x4c\xf2\x2d\xcd\x9b\x3c\xed\x76\x79\x4e\x78\xac\x2c\xd3\x32\x8a\x10\x0e\x0b\xfa\x9c\x7a\x92\x9a\x24\x05\xcf\xea\xa3\xec\x3d\x79\x4e\x89\x81\x28\x28\xa8\x79\x7e\xc8\xe0\x9f\x0d\xcf\xeb\x54\x2e\xb2\xa2\x51\xab\xe7\x1d\x26\x88\xdc\x50\x6a\x30\xc1\x26\x13\xf9\x00\xba\x6e\x5d\xff\x9f\x90\xde\xf6\xf0\x38\x95\x3e\x18\x8a\xc2\xd7\xb4\x02\x13\xe9\x74\xd7\x52\x4c\xf6\xca\x0a\xeb\xb2\x38\x15\xf7\x69\x75\x5c\xb4\x01\xd7\x35\xc9\xa5\xe0\x81\x0a\x2c\x7f\xe9\x2b\x54\x35\xa8\x8e\x3f\xa0\x3d\x24\x64\x3b\xd5\xbe\x6f\xef\xe6\xbb\xc5\xf4\x3c\x10\xd8\xe4\xb3\x5d\xaf\x9e\xae\x77\x6b\x1e\x32\x8a\x90\xb8\x59\x75\x4e\x4d\x7e\x69\x10\xe5\xf0\x50\x04\x4e\x63\x0c\x45\x66\xbf\xf2\xea\xd8\x2b\x2d\xba\x29\xc1\xa3\x50\xbb\x48\xfc\x09\xde\xe4\x40\x51\xca\x0e\x88\xa9\x0a\x0c\x36\xdb\xf9\x88\x26\x5b\xfe\x41\x9f\xa6\xe0\x2c\x09\x9c\x0c\xe5\x53\x73\xb2\x5e\x41\xf7\xa5\x59\x12\x49\xd9\xf7\x9a\x18\x05\xb8\x01\xf8\xa2\xbb\x31\x96\x58\x8e\x33\x03\x89\x68\x72\x55\x7d\x03\x38\x4f\xdd\x3f\xce\xc0\x10\x25\xbb\xca\x98\xa9\x7f\x7f\x08\x0e\xe7\x3c\xf4\x90\xe5\xb6\xc9\xdb\xb0\xa7\x4c\xdb\xed\xfe\x56\xd2\x71\x1c\xd8\x70\xe1\x29\xcc\xd4\x2e\x7f\xcc\x16\xb3\x6d\xf7\xfd\x04\x4d\xd0\x63\xba\x2b\xf2\x43\x99\xde\x88\xd7\xb9\x50\x5c\x45\x5d\x7f\xf3\x20\x7d\x3b\x79\x0e\x19\x81\x91\x97\xec\xe9\x16\xba\xd8\x93\x4b\x16\x19\x59\x53\xcb\x2c\x35\xeb\x6a\x23\x33\x61\xa9\x84\x75\xe6\x24\x13\x04\x97\x32\xc1\xba\xa4\x25\x75\xb9\xe9\xab\x72\xa9\x09\xa8\x2e\x0a\xd9\x5e\xf2\xfa\x08\x55\xfa\x57\x9a\x1f\x3e\xc0\xb4\xd9\xf3\x94\x52\x09\xb3\xf6\x67\x48\x2b\xfd\xd9\x4b\x87\x30\x72\x5a\x12\xcb\xaa\x4e\x4f\xad\xed\xbb\x51\x2f\xe0\xc0\xa5\x29\x07\xa1\x5a\x9c\x45\x49\xbb\xfe\x8b\x81\x06\xac\xe0\x3a\xd6\x88\xf2\xc1\xc6\x85\x5d\xb1\x6d\x6f\x86\xe7\x2f\x65\xe1\xa8\xd4\x04\xd7\xca\xc3\x58\x51\x97\xad\xa9\x2b\xca\x81\xfa\x5f\x37\xc2\xc7\xf6\x05\xa7\x75\xbf\x80\xb2\x2e\xd0\xf3\x9c\x6c\x40\xc2\xf3\x0c\x0e\x18\x55\xa7\xca\xe1\xbe\x25\x3c\x62\x56\xe9\x32\x6b\x4d\xd3\x9d\x18\xff\x86\xf0\x02\x86\xe8\xd7\xbc\x38\xa5\x39\xcf\x4c\xf0\xee\x8e\x41\xa0\xec\xae\xf9\xbd\x9d\x82\xc3\xdc\xf5\x58\x0f\x5f\x08\x4f\x87\x89\x4b\x7a\x5e\x91\x64\x08\x41\x58\x84\xad\xdd\x8f\xbc\x96\xc7\x34\x3f\x18\x91\xb5\x5f\x86\x7e\x92\x20\x89\xaf\x55\xcf\xc2\x38\xd2\x6f\x11\x82\x28\x01\xbc\xf3\x3b\x6f\xf7\x05\x09\xa2\x15\x4a\x12\xa1\x5e\xcc\xbe\xaa\xbb\x24\xb4\xf0\x81\x87\xbc\xc3\xb0\x59\x2b\x5e\x4c\x8b\x14\x82\xfa\x02\xac\x8e\x78\x96\x41\xbb\xb2\x91\x89\x61\x8a\x3e\x13\x54\x98\xb6\xab\x0a\xea\x59\x59\xae\xf2\xfa\x3e\x85\x4c\x91\x5f\xc6\x3b\x9a\x08\x7d\x8a\xb0\x7a\xec\xc1\x36\xc2\xba\x37\x67\xa0\x08\x65\x12\x99\x52\xfd\x80\x75\xa1\x32\x24\xdf\xdd\x3e\x2c\x42\x09\xe8\x4d\x9d\x1d\xa0\x0f\xa1\x18\xd0\x7d\xb0\x50\x05\xce\x9d\x7a\x2c\x72\x34\x86\xc3\xa9\x10\xea\xc4\x23\x88\xf6\x1d\xfa\x28\x6d\x14\x29\xfa\xca\xf4\x4d\xfc\xf8\xa0\x4c\xed\x4e\xa2\x09\xef\x21\x61\xd6\x5d\xaa\xea\x55\xbe\xac\x8f\x93\x77\x15\x31\x8a\xc9\x9f\x53\xda\xba\x5e\xdd\x17\x89\x03\x21\x54\xd7\x12\xd0\x3a\x24\xbb\x81\xd4\x81\x1d\xc4\x02\x86\xf9\xbf\xb4\xda\x34\x08\xdf\x5c\xc9\x09\xd4\x47\xb0\x40\x2a\xcb\xd6\xbb\x05\x4b\x44\x5f\xd9\xc6\xe6\x29\x14\xfa\xa6\xc9\x10\x4c\x84\x58\x85\x5d\x3f\x7f\x5b\x2c\xba\x5f\x06\x89\x09\x97\xed\x89\x97\xf5\x4c\xbd\xb6\xd6\x4c\x2d\x86\x62\xd7\x37\x6a\x80\x6d\xc0\x86\xb1\x53\xe5\x78\x35\xb1\x85\xdf\x15\x43\x45\xe2\x19\x36\xf1\xd4\x29\xe5\xcd\x72\x35\x2f\xf9\x30\xa5\x20\x04\xa7\x8e\xa5\xcd\x3c\x8b\xed\xd6\x1b\x2f\x28\x49\x42\x74\x39\x67\x59\xf6\xd0\xb7\x26\x08\x19\xc6\x41\x57\x84\xb9\xe2\x08\x15\x42\x09\xdf\x81\x59\x3a\xb1\xcd\xdb\x33\x12\xb8\x96\x4e\xf9\x19\x17\xeb\x3d\xc0\x38\x7f\x34\x86\x1a\xf5\xff\x0c\x66\x09\x28\xa3\x6c\xa9\x20\x1b\x02\x0c\x6e\x57\x1e\x84\xe6\xa6\x6b\xe0\x81\x9f\x44\x51\x0f\xa6\xa8\xf4\xb4\xf2\x2d\xf2\x0c\x6b\xc1\xb8\xb7\x74\x9d\x13\x37\x38\xf3\x84\x24\x94\x46\x96\xc2\x12\x25\xb6\xca\x1e\x23\x2d\x7d\x21\x8d\x84\x23\xce\x78\x23\x72\x3f\xfc\x8c\x92\x7a\x5c\x19\xe2\x40\x94\x3a\xfe\x8c\x93\x58\x48\x4a\x68\x68\xd3\xc5\x45\xd3\xbb\xf8\x26\x43\xd1\xf1\x75\x08\x49\xa9\x61\x68\x79\x04\x85\x84\xce\x03\xde\xef\x6a\x3f\xf8\x8f\xaf\x80\xb4\xfb\xf6\xac\xd0\xe7\xd4\xa8\x74\x1f\x16\x19\xaf\xaa\x54\xfe\x72\xc5\xa1\x27\x64\x48\x25\x46\xc3\x8f\x05\xbe\x93\x34\xeb\x4e\x8f\x0c\x0b\xc4\xd3\xf7\xc7\xfd\xf3\xfd\x7e\xf1\xf5\x79\xb5\x70\x74\xa2\x42\x46\x44\x19\x2e\x15\x80\xba\x39\x4f\x01\xd7\xff\x85\x3e\x9c\x90\x51\x60\xbc\xef\x8a\xa7\xbb\x6e\x71\xcb\x48\x84\xf8\x86\x4d\x03\xc8\xf2\xbd\x86\x7c\x94\xaf\xec\xe7\x88\x8c\x14\xc3\x36\xe0\x39\x22\xc3\x1b\xc7\x93\xf7\xcb\xe4\x67\xb4\x07\x72\x8c\x0f\xef\x14\x14\xc6\x23\x63\x2f\x32\x79\xf2\x46\x64\x69\x75\x04\x53\xc4\x9b\x86\xc9\x32\xf6\x15\xee\x8b\x6f\x45\x59\xd5\x0b\x5e\xc1\x86\xd7\x60\x08\xa5\x57\xf9\xfc\xec\x96\xa3\x8c\x03\x5f\x5b\xd2\x9e\x6d\x0d\xe7\xe7\x1c\x86\x35\xb1\xf1\x4f\xb3\xd0\xe8\x3c\x8a\xa6\xcc\xdb\xc5\x77\x2b\x52\x95\x2c\x89\xb4\xe9\xff\x50\xae\x57\x64\x7a\x19\x48\x00\x7a\x38\x4d\x9a\x1f\xee\x40\x4e\xc6\x70\x1a\x22\xf6\xeb\xbb\x80\x41\xc8\x21\x39\x33\xe2\x29\x15\xd4\x3b\xcc\x7b\x5c\xce\x46\x74\x76\x72\xba\x60\x0a\xfd\xea\x39\xcf\xb2\xbf\x86\xbb\x81\x94\xbe\x40\x0a\x14\x59\x97\xd9\xbf\xba\xad\x45\xca\x84\xf8\x26\x40\xf9\x03\x64\xfd\x04\x87\xa2\x4e\xf9\x95\x4a\x83\x90\x52\x03\x52\xb4\xf2\x01\x5d\xb1\xbb\x86\x52\xa6\x82\xa1\x8b\x12\x09\xaf\xc4\xc4\xa8\x49\x08\x89\xa5\xc5\xcc\x7b\x8d\xc3\x49\x03\xd4\xed\x35\x08\xda\xc8\x69\x1f\xa0\x7e\x40\x59\x40\x51\xb4\xb1\xc2\x68\x51\xeb\x20\x71\x60\x90\xf6\xe3\xac\xf9\x45\x70\xf9\x32\x94\xd0\x70\x03\x63\x1a\xfa\x0e\x7a\xd7\xbe\x45\xac\x42\xe4\xdc\x58\xda\xc1\xd4\xd5\x4c\x62\xfa\x96\x77\x41\xf0\xe7\x6b\x45\x27\x06\x27\xb5\x5e\xfd\x78\x76\xae\xa2\xd4\x12\xc0\xf1\xc7\x0d\xcb\x82\x9f\xa2\xa1\x95\x47\x63\x6c\x2d\x1c\xe9\xad\xae\x4e\xe7\x6c\x52\x43\xf8\xe0\x6c\x9e\x98\x7d\xa8\x5a\xe6\x0a\x51\xee\x5f\xcf\x62\xf4\xb6\x14\xd1\x9a\x75\x9c\xa3\xf7\xdc\xb2\x73\x7c\x8a\x67\xf8\xf5\x16\x78\x54\xf9\x91\x4f\x3b\xcd\x91\x06\xfb\xe3\xc6\x18\x0d\x37\x8e\x6b\x9b\xb7\xea\xfb\xaa\x94\xaf\x12\xac\xb5\xfd\x2b\x3d\xeb\x8c\x8f\x1a\x1c\x15\xa5\x01\x56\xbc\x90\x96\xe1\x79\x4c\x06\x28\x14\x8d\x42\xcc\x9c\xce\x9a\xfa\x08\x6d\xd8\x3d\x24\x5a\xba\x39\x89\x54\x40\x74\xdc\xdb\x18\xf3\x5b\x63\x67\xf7\xef\x5b\xaa\x54\xa0\x82\xd0\x52\x15\x59\xd1\xa4\x49\x3f\xf8\x67\xae\x88\x0a\x80\x20\xfc\x55\x40\x5d\x17\xa5\x13\x51\x1e\xbf\xa8\x00\x12\xdc\x0c\x17\x9b\xe7\x9f\x77\x46\x27\x66\xf7\x75\xbf\x7a\xda\xff\x5c\xae\xf6\xf7\xdf\x9f\xee\xf6\x8f\x2b\x87\x4d\x54\x61\x14\x27\xe0\x18\xe6\x30\x74\x5b\x2d\x9e\x97\xef\x2e\x24\x1f\xe4\x95\x54\xe4\x51\xe4\x6d\xcc\x05\x3f\xf0\xc1\x9f\x43\x43\x36\xff\x76\x2c\x9e\xdf\xf2\xea\xf7\xa2\xe9\x8e\x24\xa1\xcf\x9c\x1a\xe0\xb7\x8b\x9c\xdc\x67\x94\x84\x88\xd4\x3c\x72\x74\xc7\xd2\x12\xd4\x36\x3d\xe4\x1c\x35\xb9\x76\x85\xf5\xc1\xfb\xdf\xe1\x81\x72\x8d\x03\x06\x5e\x6e\xd4\x58\x5d\x94\xa9\x62\xcf\x37\xbe\x15\x64\xd9\xa2\xe4\xe2\x76\x00\xa8\x62\x15\xb1\x8e\xc4\x7e\x96\x4b\xeb\x50\x9a\x60\x62\xf4\xe5\x2d\xfb\x6f\xf7\x8f\xbd\x00\xf3\x14\xe6\x4f\xba\x5e\x90\x47\x5e\xbd\x4c\xc4\xde\xfa\x9f\x63\xe0\x21\xd7\xc0\xa1\xc9\xab\xeb\x2c\x88\x4a\x3c\xce\x61\x40\x72\x51\xed\x0a\x93\x5c\xeb\x06\x24\x04\x03\x30\xe4\xf7\x9b\xa1\xac\x91\xd9\x34\x4d\x75\xf7\xf6\xfa\x6d\x3d\xbd\xc8\x1a\xca\xab\xcc\xc0\x00\x5b\xa4\x38\x8b\x30\x62\x85\x77\x63\xc1\xdc\xdd\xdd\x5e\x00\x42\x04\xd2\x64\x20\x5b\x87\x6f\xef\x82\xac\x79\x3a\x09\x84\x95\x8c\x42\x9f\xf6\xa6\xb4\xeb\x14\xbd\x6a\x2d\xef\x8d\xa5\x92\xe0\x21\x1c\xe4\x6e\xb5\x58\xee\xbf\xae\xbe\xf4\x9d\x3f\x4a\x79\xb1\x37\x4c\x92\xe0\x9b\xda\x15\x56\xfd\xf7\x6f\xfb\x47\x6e\x96\x31\x94\x8a\x8d\x8a\x16\xc6\x82\x36\xd5\x37\x4e\x2c\x2b\x60\x4c\xdb\x78\x49\xf2\xc9\x4e\xa6\x74\xc8\xd1\x1a\xfc\x0b\xf2\xf4\xdd\xdd\xa9\x8e\x4c\xd7\x7d\x85\xe1\xca\x24\x47\xac\xb4\x66\x58\xd8\xc5\xcc\x2c\x38\xb4\x0b\x78\x71\x82\x82\x23\x19\xe8\x3a\x4e\xc6\xaf\x12\x3c\xc6\x31\xe1\xf3\xb4\x58\x8f\x28\x7a\x05\x78\x9a\xa0\x4c\xc2\xf3\x3b\xc6\xfc\x4f\x50\xbf\x15\xe5\x4b\x7f\x54\xc6\x46\x3f\xeb\x70\xc8\xe0\xae\xec\x42\x5d\x20\xc0\x45\x3c\xee\xf7\xd8\xd6\xfc\x05\x6e\xb2\x0b\xbb\x73\xda\x5d\x08\xfd\x81\xfc\x05\x27\xde\xde\x82\xc1\x16\x45\x9e\x83\xac\x07\x02\x5e\xbb\xe2\x09\xde\x6e\x94\x73\xc1\xa7\x0c\x63\x0b\xab\xec\xf6\x6c\xdf\xd0\x75\xf3\xf6\xf8\xa7\x7d\xcd\x31\xd1\x93\x56\x06\x5e\xbf\xb1\x79\xbc\x8f\x88\x21\xc0\xd7\xda\x55\x1f\xb1\x07\xd5\xd2\x6e\xf4\x53\x0d\xa8\xf0\x91\x92\x13\x72\xd5\x69\xc1\xd8\x43\x81\x32\xcc\x0a\xd5\x39\x4b\xa7\xb8\xc9\xf1\x87\x09\xbd\x98\x39\x99\xb0\x39\xe4\x7f\xb9\x2b\x84\x91\xc4\xbd\xb3\x32\xa4\xa8\xb7\xcd\x02\x84\xb1\x29\xfa\x60\x14\x57\xf3\xac\x5d\x26\xdd\x9b\x0a\xb9\x21\xbd\xc2\x16\x1b\x54\x7e\xe8\x8e\x08\x8a\x5d\x5d\x8f\x50\x73\x55\x64\x19\x2f\x9f\xcf\x83\x64\x33\x44\x24\x66\x30\x22\x02\x36\xc4\xe5\x8e\xc0\x7c\xf0\x6f\xff\x3a\x22\x15\x18\xc1\x33\xab\xd5\xb0\x85\x6c\xe2\x0d\x43\xac\x89\xb2\xca\xd1\x50\xea\xce\xed\x03\xc6\x38\xa6\x0c\xf6\x65\xd1\xde\x26\xb2\xac\x8d\xd6\x10\x30\xee\xe3\x0e\x6d\x59\xad\xd1\x06\xba\xb3\x13\x8b\xf5\xb1\x25\x49\x53\x2c\xb3\x99\x89\x51\x76\x07\x78\xe4\x73\xa3\xae\xd0\x5a\xeb\x89\xb7\x0a\x9c\x87\x8e\x05\x1e\xdb\xaa\xd3\xfa\xf2\xc4\x3f\x50\x90\x16\xc0\x15\x8d\x0c\x84\xb4\x2a\xb2\x57\x58\xe6\xb5\xdd\x48\xa0\xaa\x66\xb9\x1a\xd9\x55\x7b\x8a\x88\x24\x46\xd3\xf8\x41\x9c\xf6\x67\xf7\x18\x8a\x12\xbb\xf1\xb4\x41\x33\x3f\x41\xdd\xab\x0b\x7f\x30\xa9\x95\x30\xc4\x0c\x8f\x17\xc7\xf7\xd7\x7d\x7c\xa0\x14\x19\x12\x2b\x7e\xf9\x1d\xfa\xbf\xc6\x21\x3a\xa7\xa5\x49\x5c\x2c\x51\x28\xa2\xe3\xf0\x99\x3c\x21\x08\xf0\x6d\x1d\x7f\x57\x36\x95\x8b\x25\xf5\x78\x15\x80\x8e\xb1\x05\x0b\xdb\x31\x87\xec\x04\xf6\xb8\xf6\x64\x60\xcb\x98\xe8\x0f\xa7\x58\x6c\x99\x5f\x4c\x2b\xfe\xe4\x0d\x69\xce\xb0\x9e\x7e\x97\x56\x7f\x36\xd5\xbc\xa8\xbb\xab\xa8\x00\x57\xfd\x99\x5f\xee\x61\x62\x60\xb5\xe7\x19\xed\xe3\x87\xd5\x8f\x5f\xdc\x9f\x68\x8c\xd5\xc2\x39\xaf\xa0\x57\x4b\xfb\x1b\x68\xe2\xe7\x31\xa8\xf6\x62\x0f\xe9\xfa\xa1\x3e\x6e\x78\x5a\x81\xea\xa4\xcb\x10\x94\xdc\xfd\x34\x33\xb2\xef\x7f\x14\x69\x3e\x2b\x21\x77\xd5\x17\x4d\x24\x65\x89\x7b\x53\x7b\xb2\xe7\x4a\x75\x87\x34\xc1\xd6\x47\xfb\x5d\x10\x89\xf9\x51\xb3\x9a\x3d\xc5\xf7\x09\x5e\xcd\x39\x38\xe3\x30\x44\xfb\x89\x1f\xa9\x81\x94\xec\x95\x79\x1c\x8f\xe6\x02\x77\xcd\xb3\xa1\x13\x6d\xfd\xf5\x41\xb7\xb7\xa6\x9e\x40\x58\xf8\x91\xe7\x2a\x33\xcc\xc1\x69\x7e\x98\x88\x4a\x4d\xee\x8f\x06\x26\x8b\x08\xb2\x04\x59\xbc\x42\x49\xff\x1b\x58\x90\xa6\x89\x92\xe0\xfc\x78\x5b\xc0\x1e\xb8\x8f\x3a\x90\x21\x22\x85\x2d\x03\x0e\xa8\xa7\x34\xff\x83\xbb\x09\xae\xa3\x38\xc6\x45\x64\x84\xf4\xc8\x7e\x90\x8f\xd1\x11\xf3\xf0\xc3\xd4\xae\x39\xbc\xc8\xb6\x50\x3f\x15\xb5\x9b\xd6\x56\x9f\x62\x08\x78\xd3\x91\x30\xec\xc4\x5d\x65\xa5\x28\xef\xd3\x57\x68\x83\xf4\x6e\x88\x02\x2c\xfb\xda\x2c\x84\x2d\x7f\xb5\x81\xfe\xa2\x00\x47\x30\x32\xec\x50\xd6\x11\x08\xcc\x1a\x75\x64\xde\xd5\xd2\x7a\x4e\x1f\xbc\xcc\x38\xe0\x58\x88\x3b\x23\x7e\xd9\x71\x76\xba\x84\x9f\x8e\x41\x63\x6a\xd1\x74\xe1\x60\x9b\xc7\x36\x3d\x5c\x4d\xa0\xd1\x22\x9f\xfc\x02\x8b\x42\xcc\x6f\xe6\x86\x4e\xbe\x98\x80\x1a\xc7\x86\x47\x33\xa5\x63\x2b\x53\xd3\x7e\xda\x87\xa2\xba\xf2\x9f\xec\xc8\x24\x16\xca\x86\xcc\x7b\x65\xf4\xc1\x95\xeb\xd6\xec\xf7\x2a\x9d\xc4\x86\xc3\x66\xfe\xf4\xd4\xfd\x49\x2a\x3f\xc2\x19\x8c\x73\x72\x50\x4b\xd6\x9c\x68\x2c\xfa\x3d\x6f\xee\x96\x9b\xfd\xfd\xea\xe1\xe1\xc3\xa5\x7d\x4b\x1d\x79\xf2\xe8\x9c\x99\xcc\x9a\xa5\xf1\x7d\xec\xf2\x1c\x9a\x33\xe6\xf7\x94\xcb\x53\x36\xba\xf1\x83\x72\xee\x23\x7c\xc0\xe4\x64\x4b\xae\x0c\x21\x68\x67\x28\x35\xd7\x0a\xab\x9c\xcb\xcd\xc2\xf7\xe9\xdf\xb5\x05\x0e\xfd\x6b\x2d\x92\x98\x58\x4d\x81\xd4\x50\x92\xec\xd3\x5c\xb6\xf1\x66\x47\x3a\xd1\x8e\x71\xe9\x84\x76\xbd\x90\x0f\x66\x92\xe0\x14\x7d\xfa\x54\x16\xbe\xec\x32\x69\x5a\x32\x4f\x9b\x46\xed\xf3\x56\xa6\xf7\xa9\x69\xe0\xb0\x07\x15\x53\x11\xe9\x78\x87\x5b\x27\x6f\x12\x2c\x6a\x25\x01\x03\x4a\x05\x93\x29\xec\x66\xbc\x52\x44\x08\x87\x66\x3d\xc2\x89\x77\x3d\x69\xe3\xc8\xf7\xbf\xb3\xc4\x4a\x47\x4c\xf5\xe6\xf2\xa1\xe0\x7d\x26\xef\xdf\xff\x99\x02\xad\x35\x90\x18\x6b\x60\xdb\xdd\x6c\x28\xe0\x2b\x34\xc4\x42\x85\x5d\x95\x16\xb5\xad\xab\xf9\x65\xb4\xfe\x41\x71\x14\x99\xdd\x1f\xa0\x36\x85\x92\x5d\x4f\x83\xea\x06\x69\xdf\xc3\xf4\x67\x55\xe8\x7a\xdb\x7c\x10\x32\x6a\x1d\x45\x48\xf5\x97\x17\x75\xaa\x2f\x0e\x92\xbc\x37\x4e\x16\xf6\x9c\xd8\xe7\x19\xf9\x25\xd2\xf3\x88\x30\x4d\xf4\xa6\x1e\xf8\x75\xb6\x59\xee\x9f\xef\x91\x30\x69\xf7\xfb\x2f\x6e\x50\x48\x94\x53\xda\x40\xfc\x77\xc7\x36\x95\x9e\x60\x7b\xe6\xf9\xf4\xa2\xb1\x81\x4c\x59\xf7\xe5\x2e\xad\xce\x8d\x43\xa0\x93\xeb\x66\xf9\x5b\xdf\x83\xd9\x4b\x11\x20\xda\xe6\x22\x9e\xee\x3f\x2e\x80\x4a\x8f\x68\x85\xe5\xac\x75\x7a\x3a\xc1\x50\xcb\x57\x7a\x54\x78\xd8\xc2\xd7\xda\xe6\x55\xbd\x6d\xbd\xb3\x6a\x36\x28\x13\x4a\x8f\x6a\x12\x5b\x8d\x13\x39\x3e\x55\x73\x23\x73\x58\x4c\xf4\xf9\xa5\x17\x10\x43\x06\x6c\x6b\x4e\x9f\xe5\xba\xa4\x17\xd0\x18\xdb\x5f\x80\xcb\xe3\xf7\xdc\x34\x92\x8d\xee\x20\x48\x14\x9a\xc8\xe3\x45\x95\x85\x6d\x31\x1b\x51\x02\x4a\x2f\x80\xc0\x00\xc9\x4b\x30\x8d\xed\xe0\xdc\xd4\xf6\x98\x44\x2c\x42\xc6\x2b\x53\x5e\xd8\xeb\xd8\x1d\x0b\xbd\x84\xda\xaf\xb7\x03\x7e\xb2\xb4\x10\xd7\x1e\x92\xf4\x42\xc1\x23\x1b\x4c\x22\xc4\xf0\x69\x20\x2b\x6d\x87\x44\x11\x58\xe6\x5f\x30\x7e\x8a\xfb\x95\x38\xf6\x30\xc9\xfc\xaf\xd5\x43\xf7\x27\xe1\x4b\xeb\x11\xdb\x10\x02\xf7\x7f\x77\x98\x79\x1a\x71\xa1\xd5\xb1\x78\xbb\x45\x20\x21\x3d\x16\x79\x58\x52\xcc\x50\x56\xf1\x8e\x5f\xfa\x73\x55\x18\x24\xce\x20\xae\x16\xcf\x37\x57\x85\xf4\x92\x90\x5a\xed\x9a\xda\xf4\x99\xdd\xb0\x89\x9d\x15\x95\x5e\xc2\x23\x43\xdb\x8a\x0d\x18\x8f\x1b\xf7\x6b\x89\xa0\xb8\xb8\xd6\xa6\x8f\x7e\xa8\x76\x3a\xf9\x3d\x21\x02\x87\x6d\x83\xaa\xc6\x52\x71\x77\x11\x69\x6a\x94\xbc\x46\x8c\x41\x51\xae\x14\xa0\x5f\x3f\x79\xe8\x44\xc6\x32\xb2\xd2\xaa\x0d\x54\x95\x25\x19\x68\x63\x92\xf1\x6f\x49\x86\x54\x06\x80\xf9\xdd\x9f\x53\xfe\x40\x6b\xa0\xa4\x97\x68\x86\x79\xe5\x75\xfa\x6e\x64\xf6\xbb\x50\x52\x7a\x3c\x30\xc5\xad\x59\xf6\xc6\x2f\xd5\x7d\x57\x74\x91\x1e\x76\x49\xe0\x9a\x29\x4f\x69\xce\x6b\x07\xb5\xed\x8e\x73\x8e\x84\xb2\x68\xba\xa6\x20\x74\xe9\x09\x65\x18\x5e\x9c\x67\x73\x57\xf2\x43\x47\xa4\x2d\x3d\xe9\xfb\xd4\x39\x3e\x77\x25\x7f\x5b\xf6\xfc\x8a\xd2\x93\xd2\x24\xf1\xac\x1e\x65\x89\x39\x83\xee\x54\xe5\x11\xd4\xa8\xda\x63\x72\xec\xf9\x0c\x86\x48\xc3\x1d\xd5\x81\xc6\xf2\x45\x06\x55\x95\xe6\x87\xee\x34\xa0\x1a\xbb\x12\xdf\xca\xf4\x03\xb6\x7a\xe9\x41\x6c\x4a\xef\x19\xe8\xba\xf5\x3c\x1c\xf6\x4b\xeb\xfe\xe6\x00\x22\xdc\xcf\xbf\xb6\x06\xe1\xa3\xde\x96\xdb\x36\x40\x93\x08\xfa\x6a\xf1\xb3\x6e\x17\xe3\x2c\xef\x3a\x3d\xdc\x2f\x68\x69\x42\xb5\x99\x03\x2b\x4b\x42\x62\xed\x59\x14\x03\x19\xbf\x68\x42\x58\xff\x26\x31\xcc\x37\x0b\xe9\xbe\x2c\x4e\x5b\x28\x87\x05\xcb\xeb\xbd\x5f\x12\x92\x50\x44\x24\x7c\x29\xa1\x8d\x08\x67\xbf\x0c\x0f\xfa\x84\x63\x81\xe5\x01\xcb\x76\xe9\xe9\x97\x0f\x84\xe5\xbb\xe1\x02\x83\x82\x13\x64\x46\xe8\x6c\x7b\x2c\xae\xd2\xd5\x6e\x2c\xf5\xb0\x32\xcb\x71\xa7\xdb\x63\xd0\xe2\x5e\x00\xf1\x99\x41\x32\x3f\x14\x19\x41\x62\xe5\xae\x38\x24\x89\x2f\xb9\x4f\x3a\xf6\x85\xe6\x6c\x39\x1b\xaf\xa0\x79\x6e\xb8\x32\xd6\x2a\xad\x7e\x40\xae\x8a\xdb\xb9\x48\x49\x68\x68\xe0\x88\x4e\x0d\xa9\x5a\xa9\xee\x6e\x82\xd8\xe4\x62\x45\x93\xbd\x20\x8a\xc9\x04\xcd\xff\xfe\xcf\xaf\x37\xf0\x80\xee\x1c\x19\xc7\xc2\x51\x94\x5f\xae\xaa\x6c\x92\x04\xe0\x87\x06\x16\x93\xff\xb3\x49\xdf\x8b\x1a\xae\x11\x27\x92\x84\x9e\xa7\xbd\x41\xeb\xc0\x63\x1b\x08\x4e\x3f\xe7\x64\xef\x34\x6e\xf8\xc8\x39\x77\x57\x13\x9e\x8b\x95\x87\x0d\x0d\xdd\x83\xb6\xc7\x85\x35\xc7\xae\x02\x5c\xcd\x5e\x79\x9a\xf5\x74\x8d\xed\x28\xd3\x0b\xd0\xae\x91\x28\x9c\x3c\x56\x44\x4c\xef\x08\x0a\x2d\xbf\xd7\xab\x13\x3f\x00\x42\x7f\xdd\xab\x22\xd1\x18\xc1\x7d\xb3\xfe\x3e\x7c\x93\x51\x14\xc5\xce\x16\xe4\xd5\x5b\xb7\x0e\x49\x14\x29\xec\x80\x7a\x68\x5e\x86\x4d\x1b\x92\xc4\xbe\x46\x08\xea\xb2\x3e\xfe\x80\x1c\x13\xf5\x41\x77\x2c\x30\x81\x3b\xb2\xea\xa3\xf8\x7c\x5f\xe1\x1e\x3f\x09\x23\x26\xd4\xdb\x72\xa5\x32\xd8\x9b\x1e\x2a\x7b\x0c\xd5\xb9\xcd\x53\xa2\x57\x67\xa5\x85\x6e\xd4\x41\x25\x49\x34\x31\xed\x74\xed\xee\x67\x37\xcc\xf1\x08\xee\x85\x98\xea\x79\x4d\xab\xb4\x7e\x80\xfc\x50\xbb\x1d\x83\x70\xda\xd5\x6d\x77\xfc\x65\x7a\x8b\x22\x09\x3c\x8b\xe8\x7c\xb4\x52\xff\x43\x33\x4a\x44\x62\xa8\x33\xac\x40\xdf\xb0\x41\xcd\x2c\xe4\x61\x94\xde\x0e\x97\x58\x6c\xb2\x6c\x3f\xb7\xd3\x9e\x9f\x79\xce\x92\x48\x11\xe3\x6e\x6b\x63\x77\xd3\xc1\xe8\x1a\xdf\x27\x73\x5b\x31\x8d\x75\xc4\x2f\xeb\xa7\xdb\x68\x94\xc9\x12\x55\x49\x9c\x78\x0e\x13\xd7\x6e\xab\x8b\xed\x2d\x40\xae\x1d\x0d\x1e\xe5\x86\x12\xc9\x65\x67\xec\x01\xed\xf9\x56\x0a\xfc\xe3\xf2\xec\xf8\xa1\x34\xa5\x56\x6f\xb8\x6e\xca\xfc\xa1\xf5\xaf\x9a\x0b\x94\xa6\x05\xc3\x8d\x89\x0c\x75\x62\xd7\xe3\xb3\x5a\x77\x87\xa4\x0c\x8c\x0b\x73\x48\xe5\x28\xdb\x2c\x7d\xcf\x66\x0c\x37\xab\xed\x37\xf7\x37\xe2\x99\xfc\xbb\x83\xbe\x7f\x29\x32\x65\x7a\x02\xeb\xb1\xcb\x76\x2b\xd7\x22\x7d\x42\x62\x2c\xdd\x6d\xe0\xcf\xa6\xaa\x27\xb4\x86\xd2\xf7\x43\x81\x37\x5a\x8f\xb7\x9e\x9e\xe2\x6b\x5c\xe9\x97\x7e\x40\x7c\xfc\x4c\x27\xab\xae\x6a\x5b\x15\xb0\xa4\xe7\x86\x44\x61\x20\xfb\xf6\xf2\x6a\x2c\xc7\x2b\xfd\x00\x78\x60\x33\x7d\x0f\x69\xfe\x72\xc3\xd0\xf9\x01\x80\xc5\xaa\xbc\x16\x83\xdd\x79\xf8\x1d\xfc\x40\x4b\x7c\x32\xfb\x33\x76\x9f\x9b\xde\x6f\xe8\x29\x84\x39\x1b\xd0\xe2\x34\x0c\x1e\x7d\x59\x3f\xa4\x1e\x4a\x0d\x9c\xcb\x01\x32\x70\x72\xb9\x90\x92\x41\x75\x7c\xb9\xfb\x3a\xaa\x8d\x49\x3f\x54\x09\x96\x30\xce\x1c\xc5\xbf\x79\xe7\x13\xde\x2c\xcc\x49\x3f\xf2\x43\x04\x08\xee\x96\xb3\x47\x0b\xf2\xf6\xdc\xb5\xa2\x44\x62\x95\x79\x37\x7f\x08\x86\x26\xcd\x8f\xb9\xd1\xbd\x1b\x4b\x69\x58\xe9\xdd\xa8\xdf\x89\xdc\x70\xe0\x1e\xeb\xad\xb0\xa5\xdb\xd8\xed\x1e\xf1\xa2\x2b\x15\xfe\x32\xba\xa5\x58\xeb\x44\x0c\x6b\x85\xf7\xcb\xa5\xdf\xe7\x5a\xdd\x4d\xb0\x88\x61\xa7\x96\x82\xd7\x45\xd3\x3d\x7f\x42\x0d\x67\xb4\x6d\xd3\x43\x9d\xdd\xf1\xdd\xf0\x58\x30\xcb\x53\x65\x7e\x3f\xd7\xc5\x57\x28\xd3\xfa\x7a\x37\x9e\x7c\x1f\x41\x78\x62\x03\x68\x43\xfe\xd3\x1a\x95\x0e\x2a\x28\x7d\x49\x84\x6f\x69\x4c\xee\x20\x83\x03\xaf\xe1\x86\xbc\xe3\x75\x0f\xf1\xa7\x6e\x8c\x2f\x95\xc2\x64\xf0\xe3\xf7\x87\xdd\x6a\xbb\xfa\xb2\xdf\x7d\x7b\x72\xbf\x08\xbe\x21\x6d\x6a\xbf\x74\x86\x10\xaf\xca\x70\x5f\x77\x4b\x1a\xb8\x0f\xd6\xe8\x2e\xeb\xe3\xf2\xfd\xda\x35\xf6\xb5\xe7\x61\xf1\x65\xb9\x5e\x7d\x12\xcf\xfa\x3a\xf0\xf0\xcd\xde\x2d\x7f\x38\x63\xe2\xeb\x50\xb3\x5e\x95\xda\xd4\xc2\xaf\xe8\x59\xa5\xaf\x63\x1e\x38\x8d\x8b\xf2\x52\xd5\x93\x3e\x30\xe9\x6b\xc6\x90\xe7\xa1\xf5\xac\xe6\x4d\xae\x32\x18\xcd\x37\xcd\xc3\xd0\x56\x52\xee\xd3\xd2\xf1\x4f\x49\xea\x25\xae\x2a\x71\x2a\x5e\x61\x01\x65\x9d\x6a\xcb\xbd\xe5\xf0\xbd\xc6\xef\xcc\xf4\x38\x6a\xa4\xc4\x37\xfc\x72\x93\x7e\x8f\x89\xe1\xc7\x73\xfe\x4d\x26\x4e\x1c\x25\x61\x84\x55\x2c\x93\x9f\x34\x42\x68\x03\x15\x29\x49\x89\x0c\xdd\x4b\x47\xe6\xd5\x9b\xec\x47\x92\xfa\x34\xa0\x91\x13\x29\x79\x07\x75\x0b\x00\x25\x29\x15\x11\x92\xff\x99\xda\xbb\x73\x7f\x3e\xdb\x22\x68\xc0\x89\x01\xd2\xdf\x8e\x2b\x68\xc0\x21\xb4\xc5\x97\xd5\xe2\x79\x24\xca\xf8\x3f\xf5\x29\x49\x1a\x12\x6d\x3a\xc6\x9e\xee\xfe\x57\x9d\x1a\x49\x23\x20\x01\xc1\x15\x8c\x35\x69\xd4\xa6\xec\x70\x97\x92\xc6\x3e\x45\xa8\xf4\x5b\x9a\xab\xe2\x0d\x29\x23\xb7\x35\x9c\x7d\x77\x9c\x79\xc4\xb4\x27\x61\x1e\x78\x5d\x16\x85\x7e\xd6\x56\xc8\xf1\x98\x9e\x1d\xc0\x68\xe2\x64\xf8\x7d\xca\xec\xd7\xf1\x9c\x60\x5e\x8c\xdc\x4c\x1d\x85\xf3\x76\xb7\x59\xad\xd7\x4b\xd7\xed\x22\x29\x63\x0a\xb3\xfc\x0f\xc5\xc1\x16\x6e\x3f\x61\x46\x91\x34\xf1\x01\xf9\x22\x7e\xa4\xe5\x21\xcd\x1f\x87\x53\x9a\x26\x2c\x8c\x07\x39\x90\x99\x52\x93\xc9\x21\xec\xdc\x7e\x49\xb3\xcc\x25\x23\xc6\x97\x17\x09\xe7\x86\xe8\x28\x57\x45\xbb\xea\xca\xff\xae\xf7\x5c\x52\x21\x55\x14\xf6\x10\x52\x2b\x69\x73\xdf\x40\xf6\x19\x2a\x53\x52\x19\x1b\xf9\x8e\xba\xd7\x6b\xb1\xe7\xba\xc7\x92\x49\xcc\xcd\x16\x56\x1c\x53\x91\xd6\x96\xfe\xc0\x1e\x55\xc2\x68\xd4\xf4\xc0\x99\x47\xa4\x19\xbd\x4b\xb5\x4e\x65\x93\xd5\x17\x37\x12\x3c\x43\x75\x98\xca\x02\x77\xf8\xaa\x3b\xa0\x08\x37\xbd\x1c\x69\x5d\x7d\x37\xcc\xd0\x73\xc7\x29\x60\xc7\x68\x02\xe8\x9a\x15\x26\xe9\x3e\xfe\xca\x3a\xb6\xf8\x32\x4c\x44\x8e\xe8\x77\x7f\x9d\xcc\x14\x77\x06\xc4\x18\xe2\x19\xd2\x7e\x50\x46\x4b\xd4\x35\x3e\x9a\x41\x81\xe7\x27\x96\x4c\x3b\x57\xb3\x1f\x9b\xdb\x2f\x30\xf0\x22\x8a\xf5\x9e\x9f\xb3\x87\x87\xe5\x6e\xbf\x63\xcb\xdf\xf6\xed\xce\xdb\x5d\x25\x01\x64\x84\xfa\x51\xd4\xf0\x9c\x4f\xdd\x05\x37\x08\x78\xe8\x08\xff\x36\x37\xa4\xae\x64\x40\xb8\xd1\xd5\xef\x92\x1d\xc6\x47\x98\x5f\x56\x6a\x3a\x12\x42\x24\x3c\xfe\xed\x8b\x03\x5f\xb8\x5b\xf1\x23\x22\xb0\xe2\xf6\xfc\xf0\xfd\x71\xb9\x5f\xfe\xb6\xdb\xcc\xf6\x46\xd9\x65\xf1\xfc\x74\xb7\xea\x65\x5d\x64\x40\x55\x12\xf6\x71\x61\xc9\x3f\xa3\x47\x76\xa7\x80\x30\x26\x28\xe7\xe7\xea\x58\xe0\xe2\xaf\x6a\x7e\x72\x9e\x61\x10\x68\x0f\x3f\xe2\x2c\xfb\xb3\x49\x33\x5e\xce\x53\x99\xba\x63\x61\x48\x10\xdb\x72\x5f\x14\xf5\x9c\x67\xd9\x20\x20\x0f\x62\x5f\x1a\x5e\x45\x23\x72\x64\xa5\x81\xba\xa3\xd4\xa8\xdb\xb8\xcd\xff\x69\x40\xf4\x3b\xfe\xec\x41\xcc\x3c\xf4\xdc\x6c\x77\x0e\xf6\xae\x18\xbe\x2c\x77\x31\x46\x24\xe2\xc0\x3a\xa7\xde\xd9\xf9\xb1\x5b\x1d\xb0\x04\x5c\xb6\xfa\x09\xde\x96\xef\x06\xdf\x7f\xab\x45\x47\x06\x89\x2f\xf0\x9a\x25\x86\x66\xed\xee\x75\x9f\x72\x37\xb3\x83\x24\x11\xa1\xdd\x48\xef\x01\xfa\x60\xf8\xbe\x98\xf0\xe1\xc8\x80\x0b\xf0\xa2\xae\xf3\x1b\xe7\xf9\x35\x9d\x86\x0c\x38\xf8\x98\xe6\x35\xd5\xaa\x1b\x95\x71\x19\x88\x28\xa4\xca\x4e\x6d\x6c\xca\xda\x15\x8f\xd5\x61\x0b\x28\xb8\x3d\x19\x9a\x18\xbe\xa2\xf6\xfe\x3a\x46\x5b\xf3\x59\xc7\x8f\x29\xb8\x46\x44\xec\xf6\xe5\xf2\xc6\xb3\x97\x0f\x40\x59\x32\x10\x92\xf3\xb0\x83\xed\xce\x9b\xcb\x08\xcf\x23\x03\x19\x9a\xb4\x1e\x3a\xf9\x08\xe9\xef\xb3\xa7\x81\xe4\x0c\x73\xe5\x2b\xc4\xfa\x7c\x4a\x33\x21\x03\x05\xcc\xd0\x69\xf0\xd7\xd7\x7e\x15\x80\xa7\x5d\x9d\xc9\x35\xda\x6e\x21\xbb\x45\xd5\x2c\x03\xa0\x31\x26\x66\x90\x31\x6f\x95\xa7\xf5\xba\x2c\xfe\x00\x59\x0f\x75\x37\x64\x00\x8a\x0f\xa5\x89\x67\xee\xef\xba\x5d\xb6\xb6\xe3\x37\xcd\x61\x80\x81\x6a\x8f\x99\x66\x8a\xbd\x4e\x73\x35\x60\x9e\x1e\xdf\x40\xe8\x05\x21\x66\xe5\x4c\x12\x6b\x0c\x8a\x93\xa1\x07\x31\x36\x9c\xd6\x07\x68\x77\x7c\x34\xab\xee\x18\xa1\x02\xa1\x2a\xf3\xb7\x51\x76\x2b\xf4\x23\xca\xbc\x1e\xce\x80\x49\x83\x05\x32\x43\xdd\xfe\x5e\xa1\xcf\x63\x6d\xb6\xf4\x7c\x92\x46\x0e\x69\x14\x05\x8e\x1d\x7b\x0b\x75\x73\x7e\x4c\xdf\x7b\xda\xb4\xff\xce\xdf\x08\x83\x00\x62\xbf\xf3\xf8\xd6\x60\x52\xc0\x37\x8d\x6d\x18\x88\x84\xd8\xb4\x88\x13\x96\x5b\x5c\x7f\xb6\x30\x50\x06\xfa\x84\x84\x56\xa7\xb4\x77\xaa\x5c\xf0\x1e\x86\xa1\x71\x34\x8a\xb3\xc5\x5f\x3b\xa1\xd1\x31\xc9\x8d\x0c\x23\xc2\x91\x37\xdd\x04\xc6\x41\xf7\xe7\x48\x62\x58\x2d\x79\xa9\xaa\x3d\x4e\xd5\xc9\x3d\x44\x2c\x52\x26\x2d\xb8\xdc\x2c\x98\x4f\xdc\x99\x71\xc2\xb0\x51\xe1\x9f\xdf\x9f\x9d\x02\x8a\x0c\x63\x15\xa2\xfb\x69\xfc\x9e\xfb\x34\x3f\x40\x69\x42\xc6\x71\xce\x6d\xf4\x0b\x4c\xc4\xce\x72\xfc\x2c\xd3\x1a\xca\x95\x1a\x6f\x8c\x21\x13\x80\xd1\x27\xd6\x1a\x1e\x2f\xc3\xcd\x20\x64\x32\x74\xca\x4a\x2b\xcb\x19\xe4\x4f\x1e\x21\x21\x01\x46\xa6\x59\xaa\xc1\x8a\x78\xd8\xfc\x80\x1d\x20\x28\xc5\x9d\xfb\x4d\x74\x7f\x11\xd2\x45\x62\x4e\xaf\xe5\xa6\x51\x0c\x65\x48\xb1\x93\x37\x2b\xe4\x0b\xfa\x81\xc6\xfb\x35\x49\xe0\xf1\x6d\xa8\x10\xb0\x55\xf1\x1f\xb3\xc5\xb7\xf5\xf3\x6e\xff\x73\xf5\xf4\xe4\x40\x91\x32\x54\xb1\x47\xcd\x46\x95\x9e\x50\xac\x6a\xb0\x77\x7e\x2a\x2e\xd5\x9e\xea\xe3\x4e\xb9\x3e\x16\x39\x0c\xd7\x88\x82\x90\x75\xa5\xf0\x8d\x4b\x91\x87\xe0\xc5\xac\x97\x1e\x98\xcf\x9f\xef\x6e\x29\xdb\xcb\x10\x88\x87\x7c\x46\xfb\x91\xcd\x1c\x00\x28\x64\x08\x89\x87\xc8\x50\xc7\x2b\xdf\x0b\x87\xba\x1f\xd3\x5c\xa3\x4a\x7b\xa7\x77\xbe\x28\x4e\x48\x66\x33\xac\x0a\x98\xb1\x91\x47\x03\x1e\x5b\x73\xbe\xd2\x4f\x45\x7d\x5f\x94\x1d\xbf\x9b\x8c\x3c\x46\x71\x03\x3a\xa5\x79\x3d\x78\xd7\xe8\x67\x9c\xc0\x31\x28\x8e\x5f\x4e\xe4\xd3\x88\x59\xec\xea\xcf\x34\xcf\x07\x2e\xd5\xf8\xb7\xfd\xc8\xc7\x22\xcd\xea\x2b\xaf\xc1\x7b\x9f\xef\x16\x43\x1c\x8f\x8c\xa8\x2f\x1d\x5d\xfd\x16\xca\xd7\xd4\xea\x8a\x8c\xf7\xd3\x88\x26\x14\x6b\x2a\x3d\x9f\x7c\xbb\xf1\x4d\x4a\x5f\x11\x4d\x14\xa2\xab\xbe\x67\x75\x3a\xf8\x5e\x11\x55\x1c\xc2\x1e\x52\x59\x94\xc6\x15\x95\x13\x7b\x15\x05\x81\x8f\x6e\xdf\x7a\xb3\x5a\xa0\x9a\xda\x97\xe5\xfe\xf9\x69\x69\x7c\x20\x77\xb1\x28\x08\xfd\x2e\x38\xc3\x0f\xf7\x01\x41\x98\x1b\x1f\x32\xe4\x68\xdd\xf1\xac\x43\xe4\xcb\x28\xd2\xe0\x19\xd9\xd8\xb4\xfd\x78\x0f\x3c\x57\x27\x5e\xbe\x4c\x1e\x28\xa6\x21\xe2\xdf\x4c\xc5\x7b\xd3\x9b\xf6\x28\x0e\x01\x4b\xcd\x85\x43\x90\x76\x07\xb4\x67\x03\x64\x74\xcc\x2e\x23\xc2\xfa\xf6\xb0\xaf\x45\x97\x4a\x5c\xd6\xc7\xe0\xd6\xae\x1e\x31\xa2\x11\xfa\x69\xb4\x1a\x11\x47\x6c\x3d\xd3\xee\x93\xb0\x84\x48\xbb\x4f\xef\x0d\x2f\x85\xcd\x64\x4f\x2f\x25\x54\x64\xba\x2d\x2f\x6b\x6c\xac\x9d\x1c\x4f\x42\x8e\x61\xd1\x3e\xad\x56\xf9\xf6\x3a\x0f\x1e\x25\x71\xe4\x6a\xc7\xab\xc5\xf3\xe3\x0d\xc5\xef\x76\x4c\xec\x5a\x36\x37\x4e\xc9\xc0\x04\x08\xe3\x71\x3c\x34\x52\xdb\x9b\xf4\x5c\xa7\x6a\xb8\xa8\x23\x9e\xc4\x60\x20\x1e\x19\xd4\xf0\x78\x59\x74\x3e\x58\x24\x69\x40\x13\xdb\x90\xb4\x81\x73\x53\xf3\xeb\xba\x6b\x04\x24\x49\xf8\x88\xb1\xe1\x91\xe7\x0d\xcf\xb2\xcb\xe7\x39\xa6\x08\x88\x42\x6c\x1a\x9c\xd2\xfa\x1f\x85\x30\x39\xfc\x69\x8e\x3e\xd2\x2c\x76\x9d\xfe\xeb\x0a\x1a\x55\x18\x18\xe8\xc8\x3d\x8d\x3d\xcf\x30\x8c\xbb\x28\x00\x93\xaf\xd3\x56\x52\x19\x7b\xb1\x81\xe6\xef\x4f\xf5\x71\x57\xfc\x28\x1a\x79\x9c\x12\x8d\xca\xd8\x63\x86\xe6\xe9\x5c\x42\x55\xa7\x5d\xa6\x23\xf6\x12\x8a\x99\x1d\x0b\xfd\x2d\x8a\x6c\xbc\xe2\x63\x4f\x30\xec\x61\xfe\xf6\xfb\x02\x5b\x2a\x1e\x1e\x77\xee\x5c\x12\x86\x46\x9e\xc4\x98\x35\xbb\x99\x1b\x5c\xd9\xf8\x4b\xc5\x44\x99\x56\x24\x74\x63\x07\x75\x0d\xe6\x8e\x83\x46\x11\x8c\x2e\x74\x5f\x94\x3c\x3d\x7c\x29\x79\xb7\xc6\x62\xa2\x15\x9a\x48\x1b\x7a\x3d\xcc\xf7\x8e\xdb\xc2\x8d\xf0\xa3\x40\x19\xea\xa7\x2c\xc3\x3a\xca\x6d\xbf\x22\xa6\x5e\xc0\xc6\x54\x63\x0b\x5e\xd5\x19\x3c\x14\x45\xf7\x6b\xd4\xf7\xb1\xf1\xe6\xae\xb8\x83\xd7\xc9\xbb\xa4\x31\xe0\xce\xa0\x9b\x5c\xad\x07\xa7\xb0\x58\xc6\x5d\x98\x79\xad\xe7\x22\x63\xaa\x0d\x0e\xed\x6e\xf6\xe4\xd2\xf3\x71\xe0\x19\x21\xcf\x3d\xf2\x88\x14\x35\x20\x0a\x00\x21\xb5\x9f\x77\x4e\xc9\x38\xf4\x18\x96\x8d\x76\x25\x54\xca\x45\x48\x71\x18\x6a\x43\xe7\x5a\x37\x5a\x77\x7f\x8c\x7c\x34\x50\x2e\xc0\xc1\xa9\x74\xb3\x5f\xbc\x1d\x0b\x48\x75\xb6\xde\x2c\x57\x8b\xe7\xfd\x7a\xb9\x59\x3d\x77\xef\x38\xe2\x11\x62\x2b\x45\x63\x1a\xc5\x7a\x69\x0d\x19\xc7\x21\x10\x6d\xd7\xdc\x81\xd7\xe0\xe4\x13\x6f\x7f\x05\x16\x73\x8c\xe4\x7e\xff\xfe\xf4\xdb\xea\xe9\xbf\xcc\x7c\xc4\x89\x65\xa1\xac\xa0\xfe\xed\xaf\xec\x45\xfe\xf1\x67\xf1\x76\x2c\xfe\x3c\xbe\x15\xe9\xb1\x4a\x79\xf1\x67\xf3\x06\xe9\x5f\xef\x45\xda\x14\x93\xc7\x4a\xfc\x04\xeb\xda\x60\xc9\x0c\xa6\x87\xb9\x46\xfc\x5e\x5a\x55\x0d\xb8\x10\x6f\xf3\x09\x0e\xe7\x73\x47\x37\xe6\x34\xc1\x64\x94\x2a\x0c\xf7\x86\x65\x7f\xf7\xa7\x97\xbb\xae\x35\xc5\x5c\xc4\x98\xcf\xcd\x9b\x93\x55\x1a\x12\xbd\xa5\x8e\x05\x95\x41\x88\x8c\x2d\xef\x43\x65\x9c\xf6\x80\x42\xe2\xdf\x76\x05\x6d\x77\x8b\x67\xd7\xef\x24\x63\x11\x1b\x68\xc5\x36\xcd\x0f\x19\x6c\x8b\xa6\x94\xd0\x61\x45\xdc\x18\x30\x8d\xb8\xb6\xe3\x0e\x79\x6c\x26\x6e\x5c\x2c\xfd\x00\x7d\xb3\xe7\x1c\x03\x32\x5c\x63\xf3\xa2\x78\xf9\xe1\x11\xea\x9c\xc2\x58\xc6\x86\xa0\xa1\x84\xbc\x8d\xcd\xaf\xdb\xc1\x64\xac\xa4\xc2\x92\xd4\xb1\xa8\x6a\x9b\x87\x73\x67\x43\x04\x7d\xb2\x74\x53\xbc\xdc\x84\xf1\xc4\xc0\x38\xae\x4e\xae\x46\xd1\xd4\xa7\x96\x39\x06\xce\xa5\x91\xd6\x7d\x81\xdd\x88\x49\xf4\x83\xf1\xc2\xd0\x34\xf5\x0d\xf4\x93\x29\x03\x2a\xc2\xf0\x74\x76\x48\x3f\x06\x6d\xff\x4f\xe9\x58\x46\x98\x87\x90\x07\xb7\x34\xb7\x86\x0d\xe4\xca\xe8\x33\xc2\x43\xd7\x4a\x61\xf9\xff\x6c\x5b\xe9\xe8\x45\x31\x9f\x70\x19\x0c\x48\x48\xaa\x95\xde\x98\xb2\x23\x54\xd5\xee\xc8\xf3\x0e\x3e\x2a\x99\xaf\x7d\x6e\x93\xca\xdb\x37\x94\x07\x9f\x5c\x8c\x7a\x02\x1c\x2a\xb2\xe6\x35\xb4\xbe\x69\x9f\x41\x63\x34\x31\x31\x28\xea\x8b\xb9\xc4\x15\xbf\x2c\x8a\xd3\xa9\xc9\xfb\x99\xc6\x28\x37\x0d\xad\x66\x6b\x9e\x34\x5f\xb9\x31\xc2\xc3\x34\xe4\x0f\x9e\x41\xb1\x83\x6a\x34\xd3\x59\x40\x24\x89\xdc\x24\x59\x14\x65\x09\xd2\xb8\x53\x1d\x7c\x96\xb9\x91\x8a\xa0\x80\xef\x13\x74\x15\x15\x16\x00\x20\xb9\x1a\xea\x0c\x8d\xed\xce\xf8\x26\x42\x02\xc2\xb2\xcd\xef\x21\xaf\x3b\x6f\x9d\x85\xdc\xc7\xb5\x92\xe6\xba\x78\x84\xaa\xea\x2b\x07\x2c\x22\x21\x37\x9c\x15\xfb\x5b\x58\x2c\x16\x85\x51\x10\x8e\x6a\x63\xd8\x5d\x7d\x9f\x35\xd5\x71\x90\x45\x1d\x7f\xec\x48\xf8\x01\x19\xca\x24\x9c\x8a\x59\x17\xfb\x33\x26\x62\x64\x54\x32\xb0\xad\x27\x78\xb3\x42\x2c\x4e\xb6\xeb\xff\x96\xc4\x4c\x32\x26\x85\x88\x46\xe9\x5e\xcb\xcb\xe0\x7e\x3a\xa1\x0a\x61\x99\x0f\x69\xfe\xd2\x7a\x5f\xa3\xaf\x94\x70\x0f\x9c\x0a\x5a\xef\x66\x8d\x5f\x47\xc2\x89\xc7\xfb\x1a\xec\x00\xcb\x2a\x59\xa2\x94\xb0\xd8\x8a\x45\xd1\xc6\x7a\xb7\x38\xa7\x25\x4b\x80\x61\xc3\xe5\x3c\x55\xc8\xa2\x3e\x26\xa9\x1b\x3f\x10\x0f\x79\xd8\x3e\x90\x68\x4d\xaa\x5a\xa4\x75\xfa\x57\x7f\xbf\x1c\xc0\xb4\xfb\x94\xc0\x5f\x56\xea\x91\xa7\x79\x0d\x48\xe4\xe8\x7f\x30\x41\x84\x30\x28\x74\x17\xd7\x15\xbc\x54\x5b\xc3\x74\x7f\xab\x40\xc1\x84\x54\x66\x75\x8b\xf1\x7c\x06\xa2\x9c\xbf\xbb\x38\xa6\xe7\x21\x8c\x93\x69\x16\xa2\xe7\xb4\x95\xb2\xfb\x53\x62\x04\xff\xde\x52\x55\x1f\x4b\xfe\x36\x2f\x6c\x5e\x6f\xf2\x72\x75\xa2\x6d\x7b\xfa\xa9\x78\x85\x87\xf4\xcf\x26\x55\x53\xd6\x16\x99\x78\xbe\x41\x82\x73\xd4\x68\x5b\xfe\x49\x2c\xaa\xf6\xd7\xe1\x3f\xee\x11\x12\x8f\x69\x04\x57\x9b\xec\xfb\xff\x0d\xa8\x23\x21\xdc\x34\xea\x1c\xa0\xfe\x02\x39\x0c\xb2\xcd\x81\xe7\x86\x28\x85\xdf\xc9\x82\x8e\xc7\xcc\x3e\x32\xf1\xbd\x50\x74\xe4\x81\x9f\x5b\xf1\xc4\x8f\x3c\xbc\xe1\xaf\xbc\x3a\xda\x7c\xde\xf8\x35\x25\xbe\xd0\x48\x74\xd4\xda\x48\x23\xfa\x05\x86\x8e\xbf\x23\x64\x94\x09\xe5\x21\x3a\x55\x46\x54\xda\x50\xa9\x19\xaa\x23\x37\x22\xf0\x89\x74\xba\xd1\x03\x9a\x0e\x99\x04\x10\x61\x89\x37\x2f\xea\xde\x57\x4a\x22\x4f\x3a\x84\xf9\xec\xc2\xf3\xfa\xae\x2c\xd2\x7a\x29\x8b\xbc\x38\xa5\x7f\x36\xb0\x5f\x14\xa7\x73\x0d\xfb\x68\xf2\xb1\x62\x42\x0c\xa4\x6a\x88\xab\x4b\xe2\x18\x02\xda\x03\xcc\x9f\x6d\x4d\xd4\xed\x9d\x6e\x14\x0b\x30\xb9\xd5\x0b\xfb\xce\xb2\x6c\xcc\xf5\x25\x13\x46\xb4\xb4\x40\xb3\x2d\xae\xb6\x51\x7c\xdf\x2e\x57\x7c\x9b\xa2\x19\xf3\x11\x4a\xa4\xfb\xb3\xb5\xf5\xfb\x26\x3f\xa4\xae\xc4\x39\x0e\xfd\x13\x1e\x88\xb8\x0b\xfd\xed\xce\x75\x3b\x15\x99\x08\x62\x90\x4e\x15\xd4\xa6\x77\x34\x6b\x43\xc0\xc3\xb4\x58\x92\x08\x1f\x7c\x32\xc4\x60\x4d\xbe\xaf\x60\x1a\x01\xe9\xb3\x87\xc5\xfe\xfe\xf9\xfb\xd3\x1d\x2a\xda\xef\x67\x77\x77\x9b\xe5\xd6\x25\x02\x12\x49\x03\xab\x99\x6c\x7b\x13\x8d\xd4\x54\x77\x58\x12\xdf\x91\xa9\xf3\xda\x75\xce\x8e\x6f\x44\x79\x31\x62\x10\xbb\x20\xe6\x6e\xf5\xf4\xec\x2e\xa0\x20\x40\xfd\xef\xd5\xd3\x6e\x72\x7f\xe0\x9b\x56\x88\xed\xfc\xcb\x62\x82\x2e\x4a\x40\x9a\xca\x83\xc5\xd7\xcd\xca\x92\x5f\xba\x63\x3a\x70\xe4\xaa\x77\x69\x85\x9f\x11\x2d\xc7\x73\xde\x8f\x48\x62\xdb\x8b\x7e\xc7\x6b\xbe\x2b\x1e\x06\xfc\xbe\x1f\xa1\x18\xec\xb9\x5a\x44\x18\x24\x7d\x81\xfa\x0b\x3f\x89\x0c\xca\xc5\xb1\x48\xaf\xf0\x31\x89\x06\xe3\x35\xa0\x01\x72\xfc\x91\x9f\x21\x8a\x12\x0d\xcc\xa9\xe9\xce\x67\x53\x08\xa8\x1b\xa3\x13\x44\xae\xb4\x11\xe7\xd7\xe5\xe6\x79\xe0\xcd\x72\x0f\x42\x70\x88\xcd\x22\x53\xd7\x52\x84\x92\x93\x50\x85\x48\x27\x92\xa9\x55\xfe\x9a\x9a\x66\x18\x77\xbe\x2f\x12\x03\x87\xb5\xfc\x45\xce\x03\xb9\xf9\x1e\x38\x8d\xa2\x44\x75\x64\xb3\x3d\x5f\x20\x94\x43\xca\xb5\x7e\xb8\xf4\x13\xe9\x78\x23\xab\x11\x83\x8e\xe4\x81\x4f\x1d\xa1\xa1\x6d\x7f\x1c\x3d\x35\x0f\x82\x10\x59\x5f\x5e\xa0\xfe\xb3\xe1\xee\x7e\xc3\x20\x44\x08\x78\x1f\xae\x4e\x1f\x37\xd4\x26\x23\xb8\xe5\x1a\xd0\xab\xf9\x0a\xd9\xb9\xdb\x48\x79\x14\x73\xf4\xa9\xf3\xa2\xb6\xfa\xde\xaa\x3b\x04\x11\xae\x31\x8e\x15\x8e\xa9\xdd\x1e\xdd\x7c\x1c\x84\x08\x9e\x99\x17\xe2\x91\x97\x19\x5c\x06\xe9\x16\x1e\x87\xd4\x36\x5f\xf2\x52\x1e\x9f\x0a\x35\xf1\xd8\x79\x1c\x6b\x6c\x7a\x7c\x49\xf3\x83\x2a\x4e\xd5\xfc\x62\x73\x1d\xe3\x27\x89\xa5\xa1\xb6\xc0\x44\xd8\x00\xf3\xc5\x39\x27\x0e\xf1\xf0\xd0\xb8\xb8\x73\x7c\x2e\xe7\xb1\x76\x6a\x7d\xf5\x31\xad\x9c\x36\x4a\x77\x09\x11\x22\x0e\x67\x10\x31\x60\x94\xd3\x1f\xd7\xe8\xba\xb5\xeb\x7e\x29\x0b\xbb\xc6\x13\x77\x58\xc5\x81\xf0\x3a\x79\xe7\xc1\xdd\x0f\x19\x8c\x25\x57\x82\x84\x36\x27\x5e\x67\xb0\x38\xf2\x3c\xef\x31\x9c\x1f\x46\x05\x1f\x20\x88\x6e\x17\xb4\x39\x44\xc4\xb3\xec\x5e\xb3\xb7\x09\xa5\x8b\xe4\x90\x18\x6d\x57\x93\x50\x38\x43\x59\x5f\x3a\x31\x40\x77\x97\xc0\x05\xba\xa1\xe3\x0e\xbd\xd0\x3d\xab\xa6\x81\x0c\x46\x8c\xba\xcb\x0e\x44\xca\x75\x12\x25\x06\xa1\x96\xc1\x05\x4a\xbf\x3a\x16\x6f\xc3\x17\x71\xfd\xbf\xe6\x44\xe1\xf9\xc0\x2c\xf1\x15\xbf\xac\x8f\xbc\x82\x65\xae\xe6\x57\xd3\xce\x8d\x0e\x14\x61\xc6\xfb\x1e\x63\x14\x04\x09\x63\x6c\xd2\xfb\xe1\xd4\x45\xdb\x3f\xf1\x04\xad\x50\x09\xf0\x37\x7c\x64\x52\x10\x48\x10\x05\x2b\x1b\x91\xca\x89\x6f\x21\x7c\xa2\xd1\x47\x5b\x9d\xda\x77\xe3\xaa\x65\x55\x77\x98\x1a\xca\xa5\x87\x42\xbe\x34\x93\xa2\xa8\xf0\x13\x0f\xad\xd6\x62\xb1\x1c\x18\x2c\xe1\x8b\x28\x11\x0e\x3d\x65\x38\x64\xc7\x8f\x4a\x89\x17\xdb\x39\xf3\x50\xbc\x5d\xcb\x2b\x48\x41\xa9\x01\x5e\xcc\x79\x95\x9a\x7e\xa2\xc7\x62\xc0\x3c\x33\x19\x1c\x52\xc3\x56\x04\x69\x76\x97\xbe\x7e\xf0\x7e\x03\xdf\xa4\xd7\xd7\x77\x6e\x0f\x14\x01\x23\x60\x37\x39\x03\x83\xbf\x55\x26\x15\x81\xa0\x28\x9d\x89\x5e\x4e\xbb\x46\xb3\x42\xbe\x8c\xb7\x79\x11\x05\x26\xe3\xa0\x40\xd4\x4e\xbe\x4b\x8a\x88\x87\x5e\xe0\x3c\xfa\xac\x28\x6f\x25\x07\x44\x04\x0a\xf5\xa3\xa1\x92\xfc\x3c\x31\x23\x22\xd2\xa6\xbe\x60\x3d\xee\xef\x86\x8a\xcc\x5d\x3f\x0e\x38\xfa\x85\xa7\xc3\xa9\x36\xac\x79\x13\x8f\x6f\xf2\x0a\xe2\x30\x71\xc4\x6f\xf3\x32\x55\x07\xc3\x69\xa4\xb9\x84\xca\x92\xc6\x77\x57\x0e\xad\x46\x12\x12\x68\xe6\x4d\xb5\x3c\x7c\x50\xb5\x14\x31\x33\xcc\xc1\xa7\x34\xdf\x36\x48\x5d\xd2\x5d\x44\x41\x60\x7d\xbe\xaf\xd8\x9a\x5c\x5e\x53\x82\x48\xc1\xb8\x1f\x99\xed\x31\xd3\x77\x96\x9c\xc0\x5d\x21\xa1\x44\xdb\x89\xe2\x5a\xe8\xdb\x68\x30\xcd\xb2\x51\xc1\x49\x24\x09\x43\x67\x23\xcd\xdb\x90\x71\x42\xf1\x21\x45\x22\x09\xb6\xaf\xad\xaa\xaa\xf9\x18\x2d\x24\x38\x0d\xd1\x94\x1d\xb2\x42\x38\x75\xe3\xc9\xd6\x23\x78\xe4\xe1\xd6\x23\xd2\xfa\xc4\xab\x17\xd3\x43\xf3\xd1\xf5\x62\xc3\xe3\xe3\xe8\xa4\xdb\x5b\x6b\xca\xcb\xf4\x8a\x2a\x09\xc9\x50\x36\xd1\x65\x5f\xee\xcb\xe2\x34\x76\x69\x05\xd7\x12\x3f\xf8\xfa\xc8\x4b\x7e\x2a\xca\xee\x80\x20\x51\x68\x14\x33\x9f\xf3\x79\x51\x96\xc5\x24\xc9\x29\x44\x12\x60\x1d\x43\x43\x2d\x8f\xa6\x95\xf2\xbe\x28\x1f\xa1\x8d\x9c\xf3\x7a\x7e\xc1\x4a\xf2\x64\xf2\x49\x5f\x45\x36\xa0\xdd\x9f\x10\xa6\xb6\x4f\x5b\xc3\x3a\x19\xc5\x62\x44\x75\xd9\x57\x8e\x2e\xdb\xae\xb0\xce\xf4\xb8\xd7\x53\x0a\xa9\xa5\x8c\x87\xe9\x80\x2f\xc5\x2d\xaa\x37\x89\xc4\x41\xda\xf6\x52\x7c\xb0\xa0\x55\xac\xb8\x11\xb8\xa8\x9a\x13\xac\x16\xce\xf5\x14\x4a\x6b\x8c\x40\x9a\x5c\x64\x3d\x3c\x4f\x40\x08\x5a\x4d\xf0\x31\x4e\xe6\x52\x0a\x4d\x04\xea\x58\xc0\x20\x15\x3a\xeb\x26\xa2\x8e\x29\x47\x05\x30\xab\xf9\x5a\xf6\x94\xd7\xe3\x9b\xd2\x09\x20\x44\x72\x48\x1f\x65\x0e\x49\x2f\x00\x84\xd4\xe7\xf0\xb6\x41\xd5\xa4\xf1\xa9\xd2\x93\x21\xe6\x89\xe0\x1d\xf7\xb0\x7d\x5a\xb8\x33\x89\x34\xa4\x65\x28\x64\x5b\x1f\x4b\x30\x0c\xd4\xcb\x3f\xc7\x56\x48\xfa\x81\x89\x9d\x97\xef\xdf\xf2\xe2\xfd\x76\x98\x21\x7d\xc6\xf1\x36\xe6\xea\xdc\xa1\xdb\x1d\xf5\xec\x40\x4b\x40\x4a\x5f\x48\x7c\x8d\xb3\x63\x0a\x99\x5a\x34\xe5\xf8\x71\x28\xf5\xfc\xa0\xd3\x91\xa8\x52\x05\x79\x0d\x77\xf0\x08\x15\xff\x5b\x8c\xc4\x68\x79\x4a\x2a\x12\x6c\x45\x9c\x17\xc5\x0b\x96\x11\xed\xdf\x03\x3f\x51\xd2\xed\xca\xad\x77\x31\x64\x92\x93\x32\x88\x63\x4c\xa8\x9b\x57\x7d\xcf\xab\xe3\x34\x11\x42\x3a\xc1\x03\xe2\x5e\x72\xc0\x29\xd6\x33\x17\xbc\x1c\x3d\x4d\xa0\xa8\x32\x82\xa4\xf9\x2b\x94\xf5\x53\x73\xda\xf6\x74\x7b\xd7\x39\x6b\x19\x28\x8e\x65\xbd\x9f\x5f\x67\x4d\x7d\x2c\xca\xf4\x2f\x98\x7c\x8c\x30\x4e\x90\x77\xc0\x10\x67\xfe\xa3\x10\xb7\xba\x2d\x06\xff\xef\xaa\xab\xb2\x0f\x78\x65\xa8\x14\xba\x20\x7b\x93\xda\x30\xdf\x6d\x86\xae\xed\xc4\xa7\x96\x31\xe5\xa6\x82\xca\xd3\x0a\xee\xf8\x85\xba\xfb\x89\x03\x1f\x0b\x5b\x43\x12\x6a\x57\x8e\xbc\x99\xee\x91\xb1\x4a\xb0\xaf\x1d\xf1\x41\xf3\xb4\x54\xd5\xe4\x11\x63\x1d\x23\x4e\xbe\xab\xe2\x4f\x66\x34\xf3\xcd\x7e\xb3\xcc\x8b\xe6\x70\xc4\x60\xa9\x9a\x0e\x09\x8c\x68\x2c\xe4\xaf\x90\x15\x67\x03\x23\x9a\x3e\x53\xe2\x27\x58\xe2\x7f\x49\xb3\x6c\xfb\xe6\xda\xe2\xa5\x4c\x82\x08\x8b\x9e\xcf\x59\xfa\x3a\xfa\x9a\x89\x60\xe8\xd4\x28\xc3\x5f\x64\x4b\xf3\x93\xab\x72\x22\xa3\xc0\x09\x1a\xe5\x2e\x88\xbf\x56\x06\x91\x92\xc7\x1c\x73\x1d\xff\x6c\xa0\x81\x3b\x38\xf1\x5c\x41\xb5\xcc\x17\xbd\xc8\xac\x94\x1c\x64\x62\x19\x5b\x6d\xa0\xd4\x39\xa1\x2e\xcd\xd3\xee\xf5\xd8\x18\xbf\x05\x44\x3b\x59\x4f\xac\xb8\x7a\xff\x63\x43\x27\x85\x90\x91\x2d\x55\xa4\xa7\xe6\xb4\x2e\xde\xa0\xfc\x7e\xde\x62\xc6\x43\xfc\xe5\x6e\xa0\x75\x72\x31\x71\x56\x97\xc0\x4f\x69\x7d\x99\x78\x7a\x52\x0a\x1f\x53\x11\xd8\xfc\xb3\xe6\x0e\x7f\xc3\x06\x73\xd0\xac\xcb\x1b\xd3\x5d\x2a\x13\xf5\x1e\xa0\xde\x36\x27\xb3\x35\x3e\x6b\xbb\xdf\xeb\x26\xdb\xd6\x70\xee\x5e\x85\xf2\x04\xee\x68\x18\x13\x36\x79\x6d\xb3\x99\xee\x68\xac\x58\xd4\x41\x2f\xa0\xbc\x2e\x30\xf7\xce\x81\x54\x2a\x41\x3f\x77\xdd\x9c\x3e\x13\x1f\x96\x52\x13\x6e\xd5\xd5\xe0\xcc\x4b\xf8\xbe\x71\x3d\xd4\x48\xad\xd8\xbe\xf4\xc7\xd9\xd3\xd7\xd9\x6e\x37\x7b\x5a\x6f\x9e\x7f\xfb\x9d\x78\xbb\xaf\xb3\xc7\xed\x6e\xf6\xc3\xc1\x94\x94\x47\x8c\x23\x72\x80\xd3\xd7\x73\x8f\x99\xea\x0f\x47\xde\x70\x83\x18\xaf\x05\xe5\x05\x09\x72\x71\xba\xd4\x04\x58\x9c\xfd\xed\xcd\x4b\x79\x2c\x88\x86\xc2\xb4\x7b\xa8\x8f\x7b\x5d\x16\xa7\xbd\x9c\xd2\xa7\x4d\x4f\x14\x88\x4a\x5a\xc0\x2b\x97\xe3\x6c\xfe\x64\xa0\x0c\x09\xe9\x61\x23\x8f\x69\x5e\xcf\x72\xb5\xe6\xd7\x0d\x90\xe3\xf3\x88\x17\x19\x52\x67\x4c\x00\x6c\xa0\xdd\x2e\xd3\xfc\x30\x4f\x4d\xdf\xf3\x64\x70\xe2\x21\x31\x88\xb1\xc1\x53\xd5\x0e\xa9\x08\x27\x3e\x19\x94\x48\x3f\x6a\x28\x1a\x5b\x1e\xe5\x7b\x3e\xba\xdc\xa7\x34\x6f\x1d\xbf\xee\x25\xfb\xbe\x4f\xc8\x50\x99\xcb\x48\xa8\xf6\xca\xef\xd3\xeb\xd0\xd8\x8b\x1d\x47\x52\xcf\x22\x33\xc0\x5c\x2a\x2a\x45\x38\x84\x1e\xef\xeb\xeb\xf6\x2a\x15\x90\x18\x2b\xed\x86\xf8\xd4\xd6\x06\xa6\x2a\x10\x52\x05\x34\x42\x08\xf0\x97\xe5\xd3\x6e\x36\x50\x87\x96\x2a\xd0\x02\x5b\x47\x77\x29\x94\x7b\x47\xe1\x6b\x8f\x85\xd2\xb0\x68\x57\x50\xcf\xaa\x76\x55\x0c\x51\x68\x2a\xf6\x7c\xa7\xb7\x3f\x73\x30\x49\x84\x91\xdd\x9e\x1e\x71\xc8\x94\x53\x77\x7a\x7e\x7e\x30\xaa\xf6\xfe\x28\x60\x56\x71\x6c\x38\x33\xcd\x47\x5b\xe5\x46\x57\x67\x5d\xa2\xb0\x29\xa8\xa5\x4a\x47\x78\xe8\xbf\xdb\xcc\x3f\x8a\xe1\x3f\x6b\xa5\x50\x2c\x00\x84\x18\xce\xd6\x6b\x9c\xc4\x11\x71\x6d\x12\xed\x8a\xc7\x40\xcd\xd2\xba\x18\x63\x3a\xec\x33\xf9\xe0\x92\x9c\x80\x83\xf4\x74\xcd\x57\xc5\x38\xe4\x98\x9e\x11\x72\xcc\xbe\xb4\xde\xe8\xba\xa8\x60\x3e\x20\x12\xfe\xe8\x47\xa4\xc2\x94\x16\x02\x42\x27\xb3\x84\x83\x46\x30\xfc\xbe\xea\xb1\x94\x8a\xeb\x00\xcb\xf0\xb3\xcd\x62\xf1\x49\xb7\x92\x12\x81\x06\x9b\xbb\x5c\x62\xeb\xb0\x84\x2b\x37\xea\xef\x19\x9a\xa4\x12\xdc\xf4\x77\xd7\x43\xd8\x53\x1b\xbd\x77\xf9\x31\x25\xa4\x51\xa8\xe4\x4a\xfd\x40\xa5\x9c\xc9\xa2\x56\x3e\xc4\xb6\x0c\xf6\x15\xca\x62\xd4\x95\xd7\x8f\x02\xe9\x3b\x39\x69\x9b\xbc\x27\xcc\xfd\x02\x40\x82\xbc\xe9\x9b\xa6\x3a\x0e\xd2\x66\x4a\x13\x16\xdb\x88\xe2\xb9\x6b\x81\x53\x3a\x50\xa8\x1f\xf8\x49\x43\x8e\x1b\xc9\x38\x22\x2e\x7e\xee\xe6\x4f\xc3\x0d\x5f\x69\x4e\x9d\x4a\x41\x6b\x97\xef\x8b\x72\x5d\xa6\xaf\x69\x06\x53\x64\x0e\x78\x01\x0c\x48\x1f\x1c\xd7\xfc\xed\xce\x05\xf0\x89\xc9\xe2\x69\x43\xdd\x60\x56\xe6\xd8\xf0\x83\x2f\x63\x04\xf7\xcd\x10\x2c\xc9\x8d\xbe\x4b\xcd\xdb\x37\x7b\xdb\x2a\x01\x25\x0c\x6b\xd9\x6f\x43\x3c\x0a\x1b\x32\xe3\x4c\xff\x5f\x77\xa2\xc6\x4c\xf0\xb6\x6e\xd4\xb5\x8e\x87\x04\x9a\x44\xf8\x7a\x72\x78\xaf\x6d\x40\x3f\xb9\x59\xaa\x03\xac\x67\x7c\x5f\xef\xdf\xd2\x7c\xde\x31\xce\x4b\x08\x89\x8c\x9d\x64\xcf\x13\xbc\x19\xbc\x5f\x35\x33\xf0\x6d\x1b\x26\x74\x83\x23\xe6\x63\x45\x6e\x0e\xd8\xaf\x36\xa4\xf3\xb8\x39\xbb\x81\x79\x80\x04\x46\x26\x82\x79\x2b\x56\xf9\x6b\x6b\x3d\x67\x58\x83\xbb\xe7\x59\xe7\x1e\x00\x0b\x3c\x14\x9d\x73\x2f\xe7\xa9\xa8\x67\x37\x28\xb4\x25\x30\x2d\x31\x4d\xfc\x50\x1c\xee\x8b\xf2\xc5\x36\x2e\xde\x8c\x30\x20\x89\x8c\x76\xd1\x99\x5f\x46\xd6\x15\x12\x30\x78\xf1\xbd\x68\xca\x1c\xb9\x32\x0e\x1f\xf4\xa8\x01\x27\x3e\x32\xdc\x2c\x1e\x77\x3b\x97\x87\x03\x11\x4a\x74\x34\x53\x59\x60\x9a\x84\x8c\xa8\xd9\x24\x08\x9e\x78\x1d\xd6\xf6\x27\xc0\xcb\x7d\xc7\x09\x25\x41\xfa\x31\xb3\xa0\xb8\x9a\x1f\xa6\xcf\x27\x25\xb3\x8d\xd6\xb5\x85\x27\x4f\x06\x28\x0f\x30\xcd\x96\x9a\x5a\xc9\x20\x7b\x0c\x2a\x94\xa8\x69\x6e\x4b\xe4\x85\xea\x8f\x00\x31\x04\x2d\x86\x18\x57\x7d\x81\xda\x40\x28\xab\x95\xc3\x3c\x01\x90\x18\xab\xdc\x8f\xa0\xf2\xa6\xfb\xe6\xda\xe7\xe8\x1e\x71\xa5\x1e\xf8\x35\xe3\xac\x1b\xc5\x98\x25\x2e\x42\x58\x36\x8e\xb4\x9f\x64\x3c\x2e\x91\xda\x24\x2c\x9e\x9a\xd3\x3c\xe3\xf2\x65\x98\xd0\x01\xcd\x43\x7c\x6f\x6f\x63\x70\xee\xe8\xab\x6a\x12\x1b\xf6\xf6\xad\xe4\xa7\x81\x95\xd1\x3e\xa1\x58\xf8\x9b\xe5\xe9\x09\xc6\x07\x14\xee\xcf\xcb\xdd\xe2\x2b\x55\x3f\xba\x3f\xcb\xd8\x37\x64\x9e\xa7\xaf\xbc\x54\x0b\x7e\x76\x09\x62\xc7\x00\xa4\x29\xf1\x2d\x8a\x33\xcb\x7e\x16\xd9\xcb\x72\x02\xaa\x1a\xaf\x70\x4d\xc3\x08\xa7\xc5\xb9\x2c\x4e\x45\xbb\x2c\x6c\x7f\xf8\x07\x99\x27\x1d\x10\x3f\xe8\x21\x0d\xad\xe3\x9e\xe6\x4d\xd1\x54\x77\xa6\xdf\xcd\x95\xc0\x74\xc0\xba\xa2\xe3\xca\x0a\x35\xdd\xe8\x06\xd7\x01\x63\xdc\x35\xc0\x18\x3f\x69\xee\x5e\xf0\xc0\xa9\xd7\x41\x42\x3c\xdb\x77\x6e\x36\xcc\x5d\x31\x93\x7f\x36\x29\xcf\x91\xef\xaa\x1a\x49\x8e\x49\x1d\x48\x81\xb4\xf2\xfb\x91\x36\xcb\xdf\x71\xf0\x4a\x1d\x06\xa6\x1d\x47\xa4\x93\x4a\xa5\x0e\x43\x89\x70\xde\x8a\x9f\xce\x19\xcc\x8b\x22\xdb\x20\x99\x65\xf7\x93\xa1\x8c\x88\x85\x69\xff\x80\x32\xd5\xe9\xa0\xd6\xd6\xfb\x70\x3a\xf2\x04\x8b\x5c\x45\x54\x7f\xda\x12\xa8\xa3\xc8\xc3\x4b\xbe\x39\xba\x1f\x27\x7e\x9e\xd7\xd5\x7d\xc6\x0f\x93\x5b\x8c\xa2\x04\x65\xfe\x64\x06\xbc\x1c\xcc\xe6\x7f\xff\xe7\xd7\xc9\xdb\x8c\x34\x41\xb4\xd0\x62\xfe\xc3\x65\xa2\x74\xcc\x42\x9c\x59\xdf\x67\xeb\x5b\xdf\x89\x49\x39\xcc\x48\x99\x4f\xe5\x16\x9c\x4e\x68\x60\xa0\xda\x46\xed\xc0\x85\x05\xe8\xc7\x4c\xb5\x58\xa4\x4e\x82\x24\x18\x3d\xd7\xa0\x43\xb3\xbb\xc7\x44\x05\xf2\xca\x3b\x4c\x46\xde\xa1\x4e\x80\x22\xe3\xcb\x6e\xa0\x8e\xf6\xc1\x6a\xd7\xdc\x33\x64\xe9\x03\x62\xeb\x79\xd3\xcd\x56\x1e\x9b\xf6\x9e\xb4\x9a\xb6\x00\x45\xc1\x64\x8e\x70\x45\x7c\x36\x82\x09\x0d\xa4\xca\xf1\x89\x6f\x31\x05\xda\x93\x25\x37\xce\xf5\x53\xf1\x3a\x94\x87\x96\x5a\x85\x0a\xcb\x3a\xb8\xd7\x58\x94\xd0\x47\x4b\x56\xf1\xa8\xd7\x9b\xcc\x8a\xb2\xfa\x2d\xf8\xc5\xe6\x90\x82\x3e\x1e\xf6\xbd\x49\x6f\xb5\x56\xca\x43\xa7\x6f\xbe\x78\xea\x7e\x56\x83\xb1\x3f\xbf\xad\x5c\xa9\xa1\xfd\x8b\xb2\xd6\x13\xad\xdd\x90\x68\xca\x0d\x89\x24\xce\x62\x0c\x1f\xf7\xf5\x40\x23\x51\x6a\x1d\x52\x64\x98\xcc\x3b\xbd\x0b\x3c\xa0\x3c\xcf\x03\x2c\x79\xff\xf8\xbe\xde\xaf\x97\x1b\x84\x2c\xaf\x37\xcb\x3d\x02\x37\x36\x33\xd7\x84\xa3\x3c\x4f\x6b\xcc\x96\xa6\x95\x45\x70\x61\xf8\x32\x80\x55\x28\x8f\x40\x8c\x00\xc0\x25\x2f\xb3\x8b\x5d\xfc\x06\xdd\x3c\x4e\x55\x2a\x8f\x32\x69\x3c\xb6\xe5\x76\x47\xdc\x2f\x04\x96\x37\x06\xcf\x2b\x1a\x17\x26\x0d\x1a\xcd\x95\x17\x5a\x75\x5d\xdc\x7e\x50\xfb\x6e\x78\x03\x61\x60\xf2\xf4\x2e\xd7\x7f\x33\x83\xa9\xbc\x88\xc4\x58\x15\xd8\xdf\x62\x3e\x77\x63\x28\x60\x33\xe4\xfd\xea\x7e\xeb\x56\x78\x79\xb3\x71\x52\x79\x51\x42\x5d\xab\xd1\x2c\x3f\xd8\xea\xa5\x65\x77\x50\x5e\xc4\x89\x0a\x3b\x54\x51\xeb\xee\x74\x4c\xe7\xb7\x00\x5a\xca\x8b\x49\x80\x79\xc9\xfa\x00\x5b\xa8\x1f\xba\x0d\x5f\x79\x71\x22\xb0\xc4\x67\xc0\x44\x1d\xf7\xeb\xf8\x6e\x62\x11\x19\x4a\x43\xb3\xee\xbf\xe7\xe9\x15\xbd\xf4\xa7\x06\x57\x79\xb1\xd6\xe8\xd4\x64\xf9\x5e\xa7\xef\xa0\xe8\x3e\xcb\xcb\xd6\x3b\xbf\xb5\x7c\x94\xc7\xa8\x8f\xce\xba\x00\x59\x9c\xc0\xea\x15\xb8\x63\xcc\xe3\x43\x1d\xd1\xef\x79\x47\x7a\x3e\xf6\x57\x94\x97\x50\xe3\xea\xa4\x15\xce\x2c\x9b\x16\xad\xaf\xd2\x0d\x6e\x78\x1c\xc4\xa4\xef\xd4\x1b\xd3\x50\x75\x63\x12\x04\x9e\xdf\xc1\xc9\x24\x21\x86\x56\x61\x72\x39\xcd\xb0\x49\xc6\x26\xef\x41\x70\xf9\x72\x45\x1d\xa1\x3c\xe1\x4b\x24\x31\x3b\x1b\xec\x3e\xb2\x65\x7e\x70\x45\xe9\x49\x6a\xf6\x5a\xc4\x6c\xc1\xa2\xe4\xe2\x0b\xe4\x16\x74\xd9\x59\x5e\xe5\x49\x02\x98\x71\x7d\x43\xcf\xb2\x13\x4e\x54\x9e\xd4\xd2\x97\x8e\x6c\xc2\x2e\xdc\x6d\x23\x8c\xa8\x9c\x1d\xa3\x3c\xee\x4a\x72\x3b\xd3\xad\x72\x38\x64\xf0\x85\x9f\xe0\x2e\x7d\xad\x2c\xe5\x5e\x3f\x3a\xd1\x98\x17\xe1\x7f\xf1\x3a\x3d\x57\x03\x63\xa7\x3c\xa5\x13\x61\x7d\x83\xde\xb6\x93\x6e\x75\x82\x67\x96\x6c\xf7\x43\xb3\xe7\x61\x3a\x5d\x79\x10\x32\xfc\x20\xad\xa3\x7f\x1e\xa0\x94\xdc\x61\xad\x95\x81\x39\xbf\x16\x2f\xf0\xb1\x3c\xee\x64\x6d\x69\x12\xa3\x32\x50\xd3\x4f\x1c\x6c\x47\xef\x1e\x49\xb3\x18\x5b\x45\xad\x78\x36\x42\xac\x6d\x35\x0a\x1d\x42\x6f\xf8\xaa\xb5\x88\x30\x87\x5d\xbb\xcd\x06\x46\x0a\xae\x8a\x78\x51\x82\xb0\x89\xbd\x9d\x56\x8f\x29\x66\xca\xc7\xc9\x34\x1b\x41\xbb\x7b\x24\x1e\xf3\x30\x71\xf0\x3d\x4f\xb3\x62\x88\x54\x54\xc4\xd3\x8a\xb3\x4e\x71\x7d\xaf\x01\xf6\x0a\x8c\x4c\x5e\x57\xe7\x55\x84\xb0\x38\xf6\x7a\xd6\xe3\xf1\x9c\x23\x24\x31\xe4\xfe\xcb\x13\x94\x07\xc8\xe5\xe5\x7b\xbe\xe6\x8d\x8b\x78\xf0\xb8\xe3\x3a\xb3\x93\x64\xf7\xfe\xc8\xcf\xc3\x5d\x59\x11\xc2\x39\x76\x4c\xb9\x85\x78\x0f\x30\x15\x97\x52\x84\x68\x2f\xb1\x51\xf0\xee\xdd\x64\x8b\xbe\xfd\x3c\x8e\xed\x0b\xf1\x13\xae\x8d\x6f\x0a\xaf\xf3\xbe\x3e\xa6\x88\x0f\x31\x32\xf1\xfc\x05\xd2\xfd\x89\x92\x30\xea\xe8\x1c\x0d\x85\xe2\xf3\xdb\x74\x37\x20\x34\x20\xcc\x26\x5e\xb8\xc9\xd6\x54\x97\xaa\x86\xd3\x6d\x7b\x43\x68\xa2\xb5\x51\xf8\xfa\xa3\x78\x19\x74\xba\x29\x12\x78\x86\xd2\x2a\xcd\x2d\xab\xb0\xbf\x46\xbc\x46\x77\x3c\xd0\xcc\x28\xeb\x97\xf0\x0a\x79\x0d\x6a\x7e\x79\xe2\x86\x72\x37\xad\x2f\x57\x1b\xeb\xe4\x87\x83\x90\x19\x76\xc2\x82\xab\x6b\xdb\x40\x02\x4d\x68\xd0\xe1\x77\x8b\x5f\x6e\x48\x1c\x2a\x12\xd2\x00\x2b\x31\x2e\x3c\xb5\xbc\x92\xe3\x2b\x45\xb1\xef\xe0\x24\x33\xad\xd3\x2c\x45\xde\xfb\xba\xfb\x4e\x11\x97\x3c\xea\x8c\x95\x6b\xbe\xb8\x49\xba\xa2\x48\xec\xc9\x50\xb9\xdb\xd2\xe3\x59\x11\x47\x61\x18\xf5\x29\x2f\x23\xc4\xfd\x21\xab\x97\x22\x2c\x09\x62\x3a\x74\xb3\x66\x39\x0a\x8b\x7e\x42\xce\xa2\x08\x83\x00\x13\xdf\x16\x4b\x35\xcb\xd5\xbc\xb9\x74\xcf\xa5\x3e\xc4\xfa\x5c\x35\x57\x29\xc2\x13\x8d\x3b\x77\x09\x82\xd7\x60\x3e\xee\xde\xbd\x15\x2e\x4d\x4a\xb0\x63\xa9\xe9\x31\x30\x8a\x08\x4f\xab\x11\x24\x5c\x35\xb2\x9e\x0a\xf3\xdc\xca\x88\x29\x22\x82\xc8\xc8\xe1\x59\x2f\xbb\x6f\xe1\x51\x44\xb0\x24\x08\x7b\x24\x29\xa8\x0d\x28\x80\xdb\xc9\x55\x45\x84\x30\x50\x0d\xd3\xd0\x85\x76\x7c\x96\x2b\x33\x05\x66\x59\x36\x99\x05\x02\x12\x74\xa7\x78\x53\x17\x67\x7e\xe9\x04\x15\x14\x91\xd4\xa8\x1c\xa5\xd5\x23\x7f\xc7\x92\x4e\x27\xc4\xff\xa5\xe0\xd9\x48\xfe\x5d\x11\x19\xa8\xc0\x08\x8a\x5d\x66\x39\xcf\x2e\x55\x7a\x1d\x79\x8d\x5f\xb3\x22\x01\x78\x1d\x87\x12\x94\x6e\x86\x3d\xa4\x2f\x3d\x5a\xa8\x7b\x3f\x4a\x49\xf4\x0c\x75\xfa\x0a\xbf\x03\x2f\xbf\x94\xbc\x7f\x41\xe0\xa9\x80\x59\x00\xec\x24\x33\xf7\x37\x4e\x89\xbb\x00\x0d\x2d\x7a\xa6\xe6\x59\xdf\x9f\xdb\x5d\x3f\x0a\x90\x34\x0f\x75\x8c\xf6\x3f\x97\xcb\x6f\x74\xd8\xb0\xaa\x08\x88\x00\x8b\x49\x8f\xb3\xdd\xbe\x17\x3b\xb2\xb2\xab\x03\xb9\xd5\x76\xa4\x46\x15\xdb\x1c\xde\x1d\x60\x75\xc8\x03\xad\x08\x80\x48\x4c\x16\x5f\xc1\x09\x5b\xe3\xe7\x4d\x79\x3b\x63\xa5\x88\xf6\x19\x62\xce\x54\xb1\x6e\xaa\xe3\x47\x83\x14\x73\xe8\x47\xe4\x79\x32\xd0\x8b\xd9\xa1\x04\xa4\xda\xda\x0d\x64\xc5\x26\x9f\x48\x6b\x40\x4c\xd7\x5e\x22\x09\xd4\xb8\x6e\xa2\x7c\x2f\x08\x1c\xe6\x13\xcd\xc2\x4c\xa9\x72\x96\xab\x45\xf9\xd6\x71\x46\x7c\xc4\x95\xfa\xeb\xc4\x3f\xf1\xbd\x20\x42\x9f\xc7\xaa\x74\xa6\xa7\x1b\x8d\x12\x6e\x68\xe2\x05\xcc\x95\x44\x27\x98\x46\xe5\x7b\x82\x92\xc0\x51\x31\xda\x0e\x86\x21\x57\x84\xf2\x89\x47\xa3\xc4\xf1\x15\x3f\xf2\x77\xf3\xbd\x8f\x25\x54\xc7\x8e\x1f\xbe\x1d\x65\x1a\x67\x10\x73\x5d\x94\x29\x54\x43\xd6\x46\xe5\x13\xea\x33\x83\xfd\xe0\x25\xa8\xe5\xfb\x19\xf2\x6e\xb7\xf4\x89\x32\xb2\x29\x07\xc4\xe9\x42\x9f\xa0\x50\xbe\x4f\x43\xa4\x77\xde\x67\xc0\xcf\xed\x4c\xae\xe6\xa0\xa7\x42\x22\xca\xf7\x65\x84\xec\xa8\x02\x0f\xee\x31\x25\x79\x82\xfa\x58\xa8\xbd\xc3\x0f\xb5\x57\x9d\x5f\xa8\xe7\x79\x9e\xbb\x38\x95\x46\x16\xc9\x8a\x86\x9b\xf6\x64\x77\x30\xf0\x24\x6e\x69\x3f\x8b\xf2\xa5\x3a\x3a\x15\x1e\xe5\x07\xa1\xe1\x96\x35\x1c\x19\x06\x43\x59\x8d\x4c\xb8\x1f\xb0\x00\x11\x5e\x73\xe0\xaf\x50\x0e\x76\x43\x3f\x60\x60\xaa\xeb\x4d\x99\xd3\x4f\xcb\x12\xca\x0f\x64\x80\x3b\xff\xfe\xcc\x2f\xed\xf6\xf6\xac\x75\x05\xf5\xe4\xc1\x03\x08\x50\x5a\xb3\x3e\x82\x6d\x7a\xb7\x07\xc2\x30\x42\x1f\x6c\x59\x1f\x1f\x8b\xbc\x58\x17\xd9\xc4\x13\xf7\x23\xdf\x13\x26\x32\xe3\xd9\xb2\xaa\x31\x1f\xd1\x9c\x8b\x61\x03\x8c\xf2\xa3\x88\x29\x87\x08\xb1\xc1\xf6\x95\x7c\xcf\xe4\xbe\x63\x2a\x7c\xaf\x93\xda\x36\x7c\x97\xee\x72\x71\x18\x60\x41\x7b\x00\xa5\xd9\x15\x3b\xfe\xde\x1d\x8f\x0d\xfe\x15\x41\x6c\x27\xa3\xa7\x39\xcc\xee\xb6\x23\x38\x02\x4b\x9a\xdc\xf1\x4a\xae\xad\x1e\x64\x39\x79\x3e\x16\x7b\x58\xe1\x7f\x58\xcf\x56\xa3\x67\x4a\xfc\x30\xb4\x18\xb6\xc5\x76\xb1\xdc\x2c\x62\x9f\x4c\xce\x4d\x24\x77\xbb\xbd\x13\xdc\xcd\x78\x35\x52\x2e\x56\x3e\x27\x86\x47\x17\x5b\x7c\x67\x4a\x7d\x90\x52\x51\x3e\x67\x12\x29\x6b\x9b\x7c\x98\xc9\x29\xa7\x1c\x13\x0a\x35\x41\x30\xf1\xf0\xfd\x5f\xff\x1a\xdd\x32\x87\xc8\xa7\x7d\xe1\xf7\x1f\xa8\x6f\xd8\xbd\x13\xae\x35\x86\xb3\x9d\x23\x59\x16\xa7\x0f\x5b\x3e\xaf\x3c\x09\x7b\x11\x61\x19\xa6\xd2\xbc\x82\xb2\xde\x15\xe7\x54\xda\x2e\x9a\x70\x1a\x07\xd8\xb6\x9a\xd0\x9e\x29\xa5\xa1\x90\xb3\xbd\xcc\xee\xae\xa4\x32\x2c\xb5\xb2\xc8\x32\x90\xf5\xfe\xc4\xd3\x7c\xdf\xef\x98\xa8\x00\x08\x58\x88\xa9\x9b\x12\xee\xe0\xb5\xe7\x5d\x53\x3e\x04\x31\x2e\xa1\x57\xd3\x5e\xf1\x61\x8d\x79\xf4\x41\x40\x12\x66\xab\xae\xad\x2f\x7d\xb3\xff\xd8\x0e\xd5\xc4\xf4\xae\x18\x03\x6a\xa9\xe5\x51\x09\xd7\x46\x28\xe3\x7f\x06\xd7\x18\xff\xd7\x84\x6c\x78\x7c\xe2\xe0\xe7\x24\x95\xa6\x12\xf8\x47\xa3\xc6\x92\x85\xd3\x81\x82\x39\xd6\x3e\xcc\x06\xb7\x7b\xce\xed\xc9\xa2\xb5\x81\xe9\xaf\x16\x77\x23\x8b\x4d\xbd\x90\x05\xd2\x61\x34\x4b\xb5\x5f\xf0\xf3\xd8\x6a\x50\x3f\xf6\xb1\x96\xa0\x41\x1e\x7f\x14\x35\x6c\xa0\x6a\xb2\xfa\xbe\x28\x17\x3c\x57\xa8\x6d\x33\xbf\x98\x1c\xcf\xcd\x09\x4d\x03\x4f\xc4\xb6\x85\xc6\xb8\x99\xba\x28\x99\xef\x7e\x3f\x8c\x42\x24\x18\x73\xd3\xf1\x79\xb2\x32\x69\xa8\x24\xa2\xd4\x9f\xe0\x0d\xa5\x8c\xa7\xde\xe6\x38\xb0\xb3\x27\x45\x32\xc4\xcd\x5b\x97\x00\xb3\x3c\x3d\xf1\xac\x1a\x10\xae\x29\xca\xa4\x42\x73\xf6\xfc\x96\x83\xb2\xa0\x5a\x2e\xd2\x36\x88\x58\x97\xc5\xfb\xc4\xfa\x51\x26\x01\xb3\x20\x55\x5d\x9c\xd7\x25\xac\x64\xe1\x2e\x94\x78\xca\xf1\x88\xac\xaa\x9f\x80\xda\x7d\xe7\xd6\x29\xee\xf7\x5f\x9a\x24\xa1\xb4\x94\x4c\x5f\xa1\x2c\xd6\xc5\x47\x01\x0a\xe5\x32\x72\x82\x17\x48\x91\x3b\xea\xa9\x1f\xdf\x12\x97\xa6\xd7\x2d\xad\x36\x46\x22\x42\xdd\x17\xe5\x1d\x68\xc8\xd5\x94\x67\x49\x51\x0e\x06\x77\x54\xd5\x81\x7c\xb1\xca\xc2\xe3\x11\xd2\x33\x8a\x68\x6b\x07\xe0\x1f\xff\x9a\xa4\xc2\xc5\x20\x88\xef\xfc\xca\xab\xa3\xc1\xb5\xad\xda\x38\xcf\xca\x52\xb8\xc1\x51\x64\xa8\xf0\xaa\x79\x09\xb8\x56\x06\x93\xea\x73\x6f\x91\x4a\x49\x30\x87\x68\x97\x9a\x61\xc6\xbf\x39\xa5\xa9\x22\x0a\x77\xb3\xa6\x82\x72\x7b\x2e\xf2\xaa\x30\x35\xca\x75\x79\x6d\x5b\xa7\x06\x8c\xaa\x38\x20\xae\x1e\x39\x13\xc5\x2b\x8c\x3c\x10\xaa\x12\x81\x49\xdd\xfb\xe5\xa0\xaf\x5c\x51\x05\x1d\x7e\x7a\x5d\x94\xb5\x2e\xb2\xb4\x58\x0d\x10\xb1\x93\x1f\x01\x2f\xc2\x45\x87\x24\x26\x77\x1d\xd5\x99\xa2\x40\xb8\x60\x5d\xc6\xa8\xa3\xfc\xe8\x0e\x4b\xc2\x63\x47\xdb\x5a\x96\x29\x3f\xc0\x1d\xd4\x3c\x75\xf2\x61\x8a\x6a\x1f\x42\xab\xea\xf5\x02\xcb\xfa\x38\x26\xd5\x1b\xbb\x9a\x54\x73\x30\x28\xf4\x76\xdd\xa3\x76\x55\x51\x56\x28\x46\x6f\x7a\xbe\x3e\xdf\xa2\xa9\x86\x00\xa7\xef\xec\xcb\xec\xc7\x72\xf7\x75\xb9\xb9\x81\x62\x57\x81\xe7\xfb\x68\xb4\x0c\x9f\x77\xcd\xeb\xb4\xaa\x53\xb9\x2b\x3b\x13\x1e\x78\x11\x27\x36\x01\xd5\x1a\xef\x0a\x31\x09\xed\xac\xbd\xfd\xf6\x02\x8f\x09\x74\xd3\x0e\xdc\xba\x71\xfb\xee\x4a\x49\x28\x1d\xa5\xf9\x49\xa4\xad\xa3\x0d\xa7\xf3\xf2\xbd\x5d\x7a\x9d\x5a\x9a\xb3\x05\x01\x21\x09\xaa\xe5\x61\x09\x36\x87\xb7\x72\x90\x7e\x0b\x08\x37\x20\xcd\x03\xd4\xcf\x52\x36\xe7\xeb\x9e\x5d\x15\x10\x15\x75\xb5\x6b\xdb\x97\x66\x4b\x4c\x3f\xd3\xfa\xf8\x04\x6f\x9b\x2f\xbf\x0d\x37\xe0\xc0\x27\xc0\x63\x97\x35\xe9\x04\x43\xba\xa3\xcc\x4f\xec\x24\xfa\x82\xfd\x5a\xba\x70\x4c\x4b\xb7\x7e\xdd\x6f\xa3\x66\x5b\xcb\x33\x22\xe5\xb7\x8a\xa1\x2a\xa0\x3e\xc5\x2e\x6f\x55\x72\xd7\x97\x7c\xfb\xbd\x52\x3f\xe6\x46\x13\xbd\x90\x2f\xf3\xe6\xb2\x80\xb2\x76\xe4\x06\xff\xdd\x2a\x0d\x28\x95\x36\x55\xc8\x4b\xa8\x9e\xf5\x76\xed\xc2\xb5\x20\xf0\x09\xaa\x5f\xcf\x9b\xcb\xa6\xfd\xc0\xed\x46\x81\x21\xcb\xd0\x3e\x07\x01\x97\x98\xe8\x3f\x77\x69\xc4\xe5\x7b\x5a\x59\xf0\x0d\x1b\xcf\xdf\x20\x50\x46\x7d\x65\x8a\x21\x6b\xe3\x21\x9e\x65\x1f\xc5\xc2\x63\xd4\xcc\xe8\xaf\xb7\xb1\x33\x2a\x08\xb4\xa1\xda\x94\xc5\xe9\xdc\xd4\xed\xc2\x5a\xb4\x0e\xdd\x95\x41\x0d\xc2\x36\x28\x6f\xdd\xd6\xd6\x94\xc6\xf1\xf4\xa8\x48\xd4\x48\x1f\xb4\x1a\x6d\x1a\x41\xa8\x3c\xf4\x57\x10\xa2\xbb\x05\x4b\xde\x82\x52\x27\x1f\x3b\xcc\xff\xf3\xbf\x58\xbb\xf2\xec\x4f\x46\x34\x44\x3f\x3b\xe3\x15\x22\x01\x07\x61\x53\x10\x51\x81\x49\x55\xae\x14\xea\x60\x7f\xfe\xed\x63\x62\x58\xac\x0d\x3a\x6b\x07\xef\xed\x17\xb6\xe2\xfb\xa3\xb7\xea\xc6\xb3\x28\x74\x2a\xb5\xe7\x0f\xa6\x24\x0b\x4c\x44\x76\xe6\x97\xa2\xa9\x3f\xc8\x43\x05\x09\x35\x9a\xe9\x8f\xab\xa7\xd5\xd3\x97\xfd\xf3\xf7\xdd\xfa\xbb\x0b\xfe\x83\x24\x26\xc2\xda\x4c\x7c\x9b\x23\x7b\x1e\x24\x09\xc5\x00\x47\xf3\x46\x5a\x22\xcd\x11\x30\x46\x05\x5c\xf8\x9c\x0e\x7d\x29\xd3\x2a\x37\x9e\x89\x5c\x70\xa7\xa5\xd0\xf1\x44\x76\x56\x49\x10\x9f\xf6\xb9\xe9\x81\xd4\xe2\xa4\xc9\x55\x05\x92\x44\xd8\x2c\x04\xa8\xef\x08\xd3\x3a\xd0\xaf\xa3\xa7\x96\xa1\xc9\x7f\x9c\x52\x27\x29\xe0\x0e\x58\xbd\xaa\x0a\xb2\x6c\x9f\x76\x16\x4d\xc6\x31\xb5\xe0\x3e\x95\xd6\xa3\x88\x2a\x90\xcc\x40\x61\x4d\xdf\x7d\xa6\xae\x19\x34\x54\x20\xa5\xc1\x0e\xac\x8b\xf3\x39\x1d\xfc\x9a\xf6\x11\x5f\x8b\x84\x7f\x24\x0a\xbb\xce\xa1\x89\xb5\x55\xcc\xe0\xe3\xbe\xf2\xf3\xd9\x39\x99\x01\x30\xe3\xe4\xd9\xa4\x7c\x57\xc3\xbc\x99\x1a\x09\x80\x7b\xda\x56\x04\x1e\x8b\x57\xb0\x55\xd8\xab\xfe\x3a\x15\x68\x6d\x6e\x15\xda\x7b\x19\x45\xd5\x21\x89\x23\xad\x5c\x4f\x20\x9c\xd2\xe6\x64\x78\x27\xc6\xe4\xba\x2a\x24\x2a\x71\x32\xb9\x8f\xfc\xfd\x16\x6d\xb1\x0a\x7d\x1d\x07\x62\xc8\x11\xfa\x85\x9f\x27\x97\xa1\xbe\x37\x20\xac\xf8\x7f\x26\x47\xf9\x75\xc2\xeb\xa1\x42\x1a\x7a\x86\x20\xa0\x69\x9f\xf5\x27\x4f\x7b\x2a\x5f\x15\xd2\x28\xc6\xfa\xc5\xb7\xd5\xdd\x70\xa7\x09\x29\x33\x88\xa5\xc7\xd9\x6f\xfb\xdd\x66\xf6\xb4\xbd\x77\xc4\x82\x2a\xa4\x9a\x38\x49\x70\x87\x81\x6b\x77\xa2\xf2\xd1\x66\x07\x9d\x37\x17\x06\x32\xc6\x7e\xe0\xbc\xa8\x3b\xfe\x3e\x15\x06\x3a\x20\xb6\x31\xcb\x38\x11\x13\xb7\x3d\x0c\xb5\xe0\xbd\x99\xe8\xdb\x88\x27\xef\x36\x0a\x14\x6e\x86\x4d\x9e\x15\xf2\xe5\xb3\x34\x74\x18\x25\x09\x3a\xb1\xa7\xcb\xfe\x34\xe4\x20\x51\x61\xec\x31\xe4\x48\x3a\x5d\x76\x4d\x96\x9e\xab\xb9\xb5\xa4\xc3\xb7\xda\x3d\x4f\x1c\x86\xe8\x36\xda\xe8\xf8\xe6\x4e\x39\x9e\x90\x61\x1c\x27\x38\x7d\xb7\x69\x0d\xe3\x69\xc6\x68\x02\x74\x90\xff\x7b\x4c\xb3\xf6\x55\xe6\xdd\xad\xb1\x50\xe3\x27\xc8\x0a\x3e\x12\xa5\x53\x21\xe3\x86\xd3\xa1\xc9\xd3\x7a\xb0\xf9\x5d\x19\xdc\x90\x71\x6e\xe6\x96\xad\x6c\xb6\x37\x20\x6b\x50\x6e\x6d\x7f\x88\x9e\x57\x21\x13\x04\xdd\xf6\x5e\x86\xfe\xe6\x8a\x0b\x13\x8f\x10\x18\x62\x8c\xcd\x14\xf0\xdd\xec\x4b\x12\x29\x0c\xd5\x6c\x65\xba\x38\x0c\x88\x7a\xb4\x04\x12\x01\x28\x5a\x9c\xa5\x96\xbc\xa6\xd3\x19\x50\xa1\xb4\x9c\x14\xad\x43\x5b\x1d\xbe\x38\x3d\xd0\xf6\x40\xa7\x61\x6b\x79\x72\x5b\x5f\xc1\x61\xe8\xc6\xef\x41\xc6\x02\x01\xb2\x36\x45\x90\x16\x46\x76\xbb\x7a\xd6\x93\xa9\xa7\xc0\xe4\x0a\xb6\xbb\x7f\xda\x32\xd2\x07\x8f\x0d\x56\x56\xd5\xb2\xde\x5b\x91\xe5\xcf\xd0\xf1\x2a\x04\xe1\xc5\x36\x1f\xde\x3a\x9d\xd9\xf5\x7d\x82\x16\x28\x23\x5c\x1b\x65\x70\xab\xbd\x3d\x0c\xba\x43\xed\x07\x7e\xdf\xb9\xd4\xd3\xe0\x20\x91\xc5\xf4\x7a\x3a\x34\x85\xdb\xd3\x4b\x3d\x20\x4a\x51\x11\x21\x09\x35\x98\xc6\xaa\x2a\x5e\xd1\xe9\x1e\xca\x86\xa8\x88\xc4\x1a\xb1\x16\xb6\xd6\x7d\x9f\x66\x93\x06\x7c\x15\x91\x44\xf1\x01\x00\x69\x57\x34\x65\xce\x5b\x4f\x74\xce\xf3\x97\xee\x3a\x10\x61\xa3\xd7\x91\x97\x4a\xf2\xf3\x2a\xef\x7a\xa3\x55\xe4\x87\x86\xa9\xe7\x5c\xbc\x41\x79\xe2\x97\xa2\x5c\x34\xf5\x55\x61\x32\xf2\xb5\x87\x25\x4e\xac\x37\x7e\x69\x3d\xd4\x41\xa2\x33\xa2\x11\xc5\xbe\x4b\x0b\x64\x34\x81\xe5\x40\xe8\x4e\x45\x94\x05\x58\xf8\x1b\x82\x62\x54\x14\xf0\x10\x6b\xfe\x39\xbc\xa1\xf0\x34\xba\xcf\x5d\x56\xa2\x1b\xa5\x02\xd3\xa2\x80\x45\x9b\xe5\xfb\x39\x2b\x0c\x05\xcb\xfc\x72\xdd\xeb\xa3\xa2\xd0\x27\x84\xf5\x0c\x3d\x32\x2b\xaa\x34\x3f\x0c\xdf\x6b\xc4\x13\xa9\x5c\xbd\xb6\x0d\xcb\x26\x57\x88\x20\x21\xb6\xc8\x96\x6d\x6b\xd9\x06\x09\xf3\xba\xb8\x72\xab\xfe\x4b\x1e\xe1\x2b\xda\x8a\xc1\xb6\x10\xc5\x22\xe8\x1a\x8c\x8f\x4d\xfe\x12\xed\x8a\x1e\x9c\x62\xc7\xb0\xd0\x47\x9e\x66\x53\xb8\x7f\x3e\x43\xc9\x2d\xe0\x59\x1e\xe1\x26\x1d\x85\x8a\x70\x69\xfe\x9f\xff\xdf\xff\x59\x2c\x37\xbb\x51\x3e\x34\x4a\xb4\x42\x5b\xbb\x94\xc5\x09\xfa\x79\xc0\x03\x85\x2e\x2d\xcf\xba\x0a\xfa\xf8\xa5\x70\x21\xf0\xa5\x19\x43\x0f\xca\xa8\x7e\x8c\x6d\x48\xc4\x05\x04\x36\x1a\x7b\x48\xf3\x97\xc9\x64\xe5\x2a\x46\x3f\xd5\x7a\xe7\xf8\x2b\xf8\x72\x87\x84\x18\xbf\x4e\xcf\x31\xe2\xbf\x5f\x9d\xa5\xbf\x96\x79\x18\x4b\xbe\xab\x48\xc4\x01\xf6\x33\xdf\xad\xb6\xeb\x87\xd9\xef\xfb\xc5\xc3\x6c\xbb\x5d\xfd\xf3\xfb\x72\xbf\xdc\xed\x7f\xac\xee\x96\xcf\xee\xa1\x85\xf6\xa8\xb3\x1f\x26\xbf\x64\x13\x3f\xa3\xd0\x38\x52\xbe\x8f\xc0\x8c\x75\x59\x1c\x4a\x7e\x3a\x41\xa9\xb8\x52\x97\x51\x1d\x2c\x52\x3e\x35\x8d\x32\x4e\x37\xec\xbe\x99\x08\xc1\xa8\x48\xc5\x0c\x89\x3c\x64\xfb\xa9\xe9\xaa\x32\x69\x64\x77\x90\x85\xd8\x7f\x36\xdc\xd7\xaa\x5f\x46\xa8\xb9\xc9\xd5\xa4\x46\x9c\xd1\xf6\x94\x66\x20\xd2\x5a\x34\x57\x72\x22\xcd\x94\x8f\x50\x45\xe0\x49\xdf\x26\xb3\xe6\x65\x71\x83\x07\x7d\xf2\x36\x21\x30\x4c\xaf\xa6\x20\xd7\x09\x81\xfc\x32\xa9\x21\x8e\xff\xd3\x9d\xcb\xb9\x45\x5e\xd5\x4d\x99\x3b\x80\xa1\xe1\xcc\x1a\xdd\x94\x8e\x19\x12\xd1\x3c\xa4\x39\x58\xae\x67\x77\x84\x47\x64\xa0\xdc\xed\x42\xc7\x5e\xd6\x69\xfc\x4e\x34\x97\x08\xe5\x91\x45\x91\xa9\xe2\x6d\xd2\x95\xac\x22\x2d\x3c\xdc\xaf\xd2\xca\x14\x7d\x7b\x27\x2c\xf6\x3c\x86\x19\x34\xc9\xcf\x74\x7c\xd5\xd8\x8b\x95\x47\x5d\x55\xcc\xf6\xb3\x18\x36\xf3\x9b\xfb\x52\x4c\x42\xcf\x62\xa3\xbb\x2a\xbb\x01\xeb\x8d\x87\xf9\x94\x62\xb9\xe5\x71\xf5\xb4\x5f\x3c\x3f\xed\x36\xab\xf9\x77\x64\xfa\xf9\xb9\x74\xb8\x43\x15\xfb\x8a\xe1\xee\x91\x35\xf2\xe5\x32\xb7\x9f\xd8\x9a\x8f\x98\x52\x8d\x00\xe0\xaa\xe3\x11\x1b\x16\xc7\x63\x1a\xfa\x08\x48\xb4\x7a\xd0\x86\x72\xab\x3b\x66\x90\xa4\xf3\xe6\xe2\x7a\xfb\x47\xaf\x2a\xa6\xa1\x96\x46\x47\x0b\x65\xe2\x8a\xb4\x73\x7d\x62\x2a\x01\xf3\x37\xaf\x56\x1b\x7d\x0d\x53\xf7\x31\x0e\x68\x8c\x19\x32\x4b\x7e\x3a\xbb\xfb\xb1\xda\x3e\x3b\xe7\x35\x0e\x04\x8d\x95\xe3\x6d\x18\x94\x58\x47\xd6\x24\x0e\x44\x82\xdb\x0a\x16\xf8\x04\xaf\x52\x34\xc5\xa6\xe5\xc0\x64\x94\x76\xc7\xd6\x06\xb9\xe1\x5a\x60\x70\x37\x4c\xba\x3e\xf6\x55\x86\x38\x94\x04\xcd\xfa\xfe\x8f\x22\xcd\x17\x77\xeb\x69\x77\x8e\x1d\x16\x91\x88\x5b\x95\x2d\xac\xbd\x2f\x5c\xbb\xaa\x8a\x23\xe0\x21\x73\xbb\xd8\x38\xfe\x8c\x63\x0f\xb0\x54\xc5\x45\x85\x0e\x83\xcd\xea\x96\xdd\x71\xca\x89\xd1\x98\xaa\xab\x61\x4a\xa5\xff\xe1\x58\x28\x8c\xd0\xb2\xa6\xe3\xfe\x55\x71\x0c\xc6\x98\x61\xc4\xc7\xd3\xbc\xab\x5a\x0c\xce\xd3\x0c\x93\x9a\xa2\xb9\x2c\xac\x6b\x25\xb2\xeb\x5e\xab\xd1\x39\x49\x10\xe1\x7e\x6c\x71\x41\x46\x77\xf9\x33\x16\x24\x15\xf3\x88\x22\x03\xb0\x71\x63\xef\xca\xf4\x3c\x21\x58\x98\xbc\x47\x2e\xb5\x91\x1c\xcf\x1a\x90\xc7\xf4\x3c\xb4\x96\xb1\x08\x23\xb4\x96\x46\x0e\xfd\x59\x5b\x5d\xae\xee\x70\x1c\xa1\x61\x7e\x82\xcb\x89\x77\xaf\x50\x30\xc6\x62\xc7\x9b\x8f\x77\xfa\xc8\x11\xe9\x36\x15\xe1\x77\xe3\x75\x8c\xcd\x3f\xeb\x87\x0e\x8d\x10\xab\x28\x42\xaa\xd2\x53\x93\xd5\xe9\x39\x4b\x3b\xb8\xb6\x8a\x15\x0f\x90\xd4\xa4\x57\x8d\x27\xbf\x7c\x90\x91\xba\x99\xc1\x8b\xc1\x37\xf0\x5b\x64\x64\x6d\xfd\xa3\x0f\x36\xb5\x18\x22\xe9\x1a\x06\x37\x50\x9d\x8b\xbc\xba\x9d\x22\x8f\x41\x50\x44\x74\x99\x20\xcc\x84\xde\x26\x8f\x3c\xfc\x34\xcc\xe3\x26\x9b\xe5\x48\x2c\x41\x2d\xeb\xe3\xae\xb0\xb5\xd4\xd1\x67\x61\x9e\x64\x84\xf5\x7a\x6e\x43\x04\x21\x23\xa1\x39\x86\xeb\xda\x21\xc7\x6f\x38\x03\x8c\x44\xcc\xca\x72\x9e\x8a\x57\x78\xe4\xf9\xe5\x23\xf1\x5d\xc5\x7c\x22\x9d\x22\xa6\x61\xa4\x6e\xa7\x3e\x02\xf5\xfb\x40\x87\xf9\x31\xa0\xf6\x0b\xd2\xcd\xa4\x45\x3b\xcd\x2d\x70\x79\x94\x32\xb5\xa3\x69\x6c\x1a\x0c\x7b\x44\xef\x35\x72\x6c\xf4\x22\x19\x8d\x25\x7a\x2f\xcb\xdd\xd7\xfd\x62\xb6\x76\x0f\x4c\x01\x88\xe8\x74\x76\x17\xbc\x44\xda\x31\x37\x23\x58\x90\x50\x7c\xaf\xed\x8c\x40\x7b\xff\x3b\x74\xb3\x91\x05\x1c\x2c\x54\x82\x77\x22\x02\xa3\xf9\xc0\xc2\x48\x20\xfd\xc1\x9f\x0d\x74\x33\x9f\x85\x8c\x23\xb6\x77\x7d\x84\x22\x4f\xdf\x6f\x2f\x1e\x16\x6a\x89\xd9\x2c\x9d\xe6\x0a\x9d\xdc\xf6\x21\x37\x53\x22\xa7\xee\x97\xa2\xc8\xb4\x29\x6c\xeb\x12\xb9\xac\xdd\x9f\xb9\x42\xa2\xb6\x45\x56\x54\xb0\xd2\xf3\xe6\xd0\x1d\xd1\xca\x93\x23\x42\x8a\x5d\xd9\x80\x31\xad\x6e\x4c\xcc\x69\x4c\x27\x85\xe6\xa1\xfe\xea\x80\xf2\xa0\xaf\xd2\x8c\x5f\x7b\x0c\xb1\xb6\xcc\x89\x3f\x21\x1d\x48\x89\x19\x4e\xd7\xf1\x6c\x67\xcc\x37\x45\xaa\x6d\x51\xf7\xc1\x05\x63\x21\x0b\xa0\xff\xd8\xfc\x94\x4e\xc1\x0d\x8c\x31\x30\xc0\x7b\xdb\xd7\x3b\xec\xfb\x56\x8c\x69\xca\x89\x23\x2b\x42\x21\xc0\xc9\x62\x9b\xdc\x74\xc2\xd5\x00\xa9\xf6\x08\xf2\xb8\xdc\x7d\xbd\xbd\x92\x59\x02\xb1\x32\x1e\x5d\xbb\xd6\xf2\xc3\x18\xb0\xc4\xb8\xe7\x9b\xfe\xd4\xa2\xaa\x9f\xf5\x73\x3e\x24\xe0\x50\x8c\x13\x86\xec\x45\x3f\x76\x9f\x74\xc6\x2b\xc6\x99\xc4\xc6\x90\x9e\x0c\xdf\xb4\xf9\xba\xd8\xd8\x0d\x13\x1a\xb3\x6e\x27\x2c\x45\xcd\xea\x1a\x4e\xe7\xfa\x03\x0b\xc4\x84\xc7\x68\xaf\xe8\xf1\x50\xf0\x1c\x89\xce\xd3\xfc\x80\xfd\xe2\xd5\x55\xc4\xed\x78\x38\xda\xaf\x1c\xff\xc7\x16\x6b\xff\x1d\x4c\x94\xcd\xdc\xd5\x49\x68\xe9\x4e\xf8\x69\xd1\xb8\xed\x93\x49\x6a\xb8\x00\x0e\xe9\x2b\x20\x49\xce\xe2\xc8\xcb\x8e\x67\x57\x31\x19\xf8\x58\xe8\xe1\x4a\x21\x34\xef\xb1\x50\x9f\xb7\x0c\x2b\x26\x63\x1f\xdf\x8d\xa1\xa9\xfa\xb6\x79\xbc\x9d\x7b\x62\x32\x49\x1c\x44\x77\x95\xeb\x62\x7e\xf9\x9e\xa7\x45\x3e\x51\x24\x51\x4c\xf2\x90\x12\x07\xf8\xb6\x93\x65\x62\x7b\xa4\x08\x50\x4d\x47\x77\x01\xab\x49\x0d\x4c\x8b\x80\x4c\xf9\xbe\x61\x77\x2b\x79\xee\x1a\x00\x6f\xe1\xee\x99\x4a\x4c\xf2\x66\xef\x92\x8f\x97\x73\x5d\x5d\xec\x02\xff\xf5\xff\x9b\x7f\x26\xbf\x28\x94\xdf\x9b\xef\xfd\xcb\x45\x4e\xfd\x37\xa6\x74\xa4\x7a\x16\xc1\x99\x32\x4a\x34\x1b\xe3\x85\x9b\xb7\x66\x11\x21\x0c\x7c\x82\xa1\xe3\xf7\xa7\x0e\xca\xc7\x00\x4c\x33\x93\xa9\xaf\x90\xc9\x3b\xd4\xbe\x40\x5e\x92\x87\x81\x29\xd6\x81\xf4\x63\xa7\x48\x61\x52\x92\x63\x0f\x2b\xf1\x7c\x2d\x8d\x66\x05\x48\x94\x1a\x31\x19\x61\x77\x98\x50\xe9\x54\x75\xf0\x35\x23\xc0\xe4\xe6\xac\x49\x7c\x4a\x30\xd5\xb5\x6f\x72\x54\x2d\x85\x57\xc8\x4c\x6a\x66\x32\x2e\xd4\x58\x13\xdd\x2c\xef\xbf\x3f\xdd\x0d\xbb\x71\x12\xea\x69\x2c\x93\xe5\xf0\xb6\x03\x7e\x7a\xce\x97\x16\x44\x7c\x53\xf5\x54\x25\xd4\xe7\x58\x21\x71\x2e\xf3\x36\x3d\xe4\xbc\x6e\x1c\xf3\xee\xd8\x93\x48\x82\x38\xc0\xd4\xd0\xe2\xe9\x6e\xfc\x5d\x92\x80\x1b\xdd\x4a\x34\xda\x08\xca\xdb\xbd\xb9\xba\x54\x12\x48\xa3\x8d\xb0\x7e\xde\xfe\xe8\xfe\xa6\x38\x3e\x83\x6e\xbf\x04\x3a\xb4\x16\xe3\xe4\x06\x84\x9a\xa0\x33\xcf\x95\xba\x86\x0c\x26\x11\xf5\xb1\xc5\xf5\x09\xde\x1e\x80\x4f\x25\x0a\x98\xdb\xe5\x93\x48\x00\xba\xc6\x27\xfe\xde\x5a\xa7\x21\x2e\x3d\x89\xb4\xe1\xf2\x37\xdf\xeb\x32\xf2\x5d\x92\x58\x48\xe5\x12\x0f\x12\x91\xc1\xb0\x5a\x3c\x8f\x2a\x25\x09\x63\x26\xfe\xfa\x6d\x72\x73\x2c\x31\xe0\x33\x79\xe4\xe5\x01\xee\x78\x9a\x5d\x0c\xab\xf6\xad\x9c\x48\xc2\xa4\x01\x1e\xb6\x1e\xd2\xc0\xa2\xdb\xa3\x3c\x04\xd2\xe9\x7a\xd9\x5c\x66\x47\x49\xa5\x12\x1e\x6b\x70\xb9\x8b\x0c\x3a\x45\x13\x95\x70\xe1\x2b\x36\x80\xea\x7e\xaf\x7a\x68\x3a\xe9\x2e\x0e\x01\x6a\xf5\x6d\x6b\x5e\x57\xd6\x16\xf4\x57\x00\x11\x6b\x57\xb9\xaa\xa1\x84\xaa\xee\xd5\x88\xaf\xe5\xb9\x27\x73\x99\x6b\x69\x6e\x0c\x6b\xd5\x06\xdb\x68\x9a\x8d\xed\x00\xe1\x03\xe6\xcb\x37\xf0\x0a\x79\x03\xdb\xd6\xe6\xe6\x87\x31\xb7\x0c\xc2\x25\xf0\x55\xde\x6d\x77\xfb\xcd\xfe\x69\x3f\xdf\xaf\x37\xcf\x5f\x36\x4e\x28\x50\x25\x22\x34\x3d\xb9\xa0\x52\x34\xa1\xe3\xaf\x28\xda\xc0\x1a\x91\x89\x65\xf1\x56\xfd\x3c\x42\xfe\x54\xe4\x4e\x93\xfb\x0e\x95\xde\xaa\x99\x63\x3f\x54\x89\x4c\x82\xbe\xd4\x66\x4b\xf2\x28\x0c\xde\x1d\xe7\x28\xb7\xd7\xba\x27\x78\xa7\x45\x66\x2c\x7c\xeb\xe1\xae\x39\xa2\xc0\xf1\x7f\xb7\xfc\x04\xab\x1a\x4e\xab\xfe\x54\xee\x63\x95\x21\xad\x2c\x44\x72\x3c\x09\xa4\x64\xf8\xba\x76\xed\x95\x5d\x99\x67\xff\x54\x20\xf5\xbf\x1d\xa3\x02\xa3\x77\x6d\xbc\xee\x2f\x90\xff\xe0\x4d\xf6\x01\xe4\x27\x51\x82\xa2\x48\xed\x89\xbf\x80\x55\xfd\xfe\x34\x8e\x4a\x94\xd4\xcc\xe6\xd2\x7f\x5b\x3f\xb8\xdf\xd4\x52\x22\xb1\x02\xf6\xd5\x39\x3f\x7e\x4a\xb8\xaa\xb8\x17\x85\xc8\x76\xbc\x01\xa5\x86\x82\x59\x8a\x7b\x32\x46\x9b\x96\x17\x6f\x0b\x9e\xaf\xcb\xe2\x35\x55\xf0\x95\x57\xc7\x6e\x80\x32\xae\x8a\x6a\x6a\x79\x74\x54\xb0\xdd\x31\xe9\x58\xcd\x57\x8b\xe7\x9f\x90\x5a\x9d\x76\x7b\x98\x30\xd3\x73\x7e\x5f\xc2\x09\x39\x29\xd4\xc8\x91\xe1\x24\xe1\x52\xda\xac\x8a\x43\x66\x6f\x80\xab\x4b\x37\x40\x78\x48\x46\x6c\x76\xb8\xeb\xd8\x97\x13\x21\x63\xd1\xbd\xf2\x39\xf0\xf2\x46\x69\x93\xfb\x11\xf5\xa7\xaa\x8f\xd5\xde\x52\x2b\xf6\xb7\xeb\x8b\x18\x85\xb3\x8c\x8e\xfb\xdd\xd3\x6a\xf2\x63\xd4\x0b\x30\x06\x3c\xf3\xcb\x7d\x51\x62\xb5\x79\x95\x8f\x49\xec\xae\x22\xbe\x9b\x1f\x9f\x53\x5f\x22\xa0\xfa\x0e\x34\x3f\x73\xd9\x7b\xad\x3c\xa0\xe0\xb8\x5d\x97\xef\x75\xc9\x31\x7f\x32\x86\x94\xf2\x20\x02\x57\x7c\xea\xea\xf6\xdd\xc1\x30\x49\x5c\x33\xcb\x2a\x17\x03\x32\xb8\xf1\x1d\x84\xe0\x81\xe3\x10\xb8\xe3\x97\xec\x8a\x8a\x53\xf1\x28\x06\x04\x7b\x3c\x9f\x21\x7f\x2c\x72\xb8\x8c\x3b\x33\x78\xc4\x4c\xb9\x96\xab\x3f\x9a\xbe\x9b\xda\x46\x61\xd3\x6b\x25\x84\x19\x02\xf9\xd3\x29\xc5\x26\xf2\xdb\x68\x16\x1e\xb3\x28\xb0\xd4\x08\x4f\x8e\x2e\x6f\x95\x7f\x4d\xab\x76\x07\xb8\xc1\x9e\xa7\x38\x13\x60\x21\xa9\xe9\x44\xe7\xdd\x0d\x80\x18\xfc\x61\x07\xc9\xfb\x78\x2b\xe1\x49\x14\x7a\xd8\xdd\x51\xb4\x86\x18\x9a\xd3\x67\x6e\x35\x4f\x94\x46\x72\x47\xd7\x08\x34\xb1\x88\x9c\xc7\xa6\xb8\xb4\xdd\xed\x16\xa3\xd9\xce\x13\x90\xb6\xcd\xa5\x35\xcd\xbd\xad\xbe\x07\xb8\xbb\xea\x2d\xe3\x9c\x43\x62\x41\xd5\x8b\x2c\x1d\xc8\xb1\x8d\xb7\x27\x2e\x7c\x0f\x3b\xdf\xd0\x01\x9a\x4d\x3f\xa2\xa0\x12\x57\x6f\x53\x41\xb9\x41\xfc\xdf\x28\x67\x46\x26\xd3\x42\x04\x11\xf2\x26\xcd\x16\x8b\xe5\x7a\xb7\xbf\x5b\x2d\x9c\xe7\xd2\x86\x09\x7e\x68\xf1\x1c\x37\xe8\xc7\x5b\x77\x81\x62\x96\xba\xdd\x91\xdf\x7e\x16\xe5\xcb\xd4\x88\x72\x09\x86\xf7\x62\xf9\xbc\xfd\x52\x64\xea\xf6\xce\xc4\x55\x42\x71\xe3\x41\x67\xda\x90\x9a\xb9\x7b\x00\x1f\x98\xd7\xe1\x45\xee\x8a\xdc\x2a\xef\xdb\xc3\x3a\x8c\xa5\x2d\x23\xcc\xd5\xb9\x0d\xc9\x1d\xbf\xa1\x8b\x46\x48\xf4\x1f\x37\x36\x8e\x31\x5d\xf7\x05\x3a\xd6\x7d\xd4\xfa\xd8\x41\x89\x1f\x02\xd4\x63\x5a\x95\x70\xee\xae\x9d\x98\xea\x9e\x41\x3e\xb7\x1e\xcf\x4c\xd7\x37\x80\x53\xe3\x27\xd6\x89\x04\x3a\x2c\x5d\xd4\xa8\x71\x32\x8a\xf6\xb8\x16\x81\x95\xac\x4a\xff\x1a\x2a\x43\xb4\x47\x24\xa6\x1e\xdb\xb9\x6d\x5c\xa3\xd1\xab\x12\x9e\x6f\xe0\xd8\x25\xe8\xa6\x82\xf6\x9d\xff\xd2\x1d\x61\xdc\x06\x2e\x8f\x50\x73\xc5\x6b\x6e\x17\x91\x05\xc8\x0c\xe7\xb4\xf0\xa2\x04\x9d\x11\x23\x88\x36\xbc\x05\xe1\x25\x46\x12\x7f\x4c\x46\xf0\x58\xbc\xa6\xe3\x92\xb8\x20\x82\x61\xc5\xe5\x54\xb9\x2e\x42\x41\x24\x47\xa7\xd3\xd2\xc5\x3d\xa4\xda\x19\x0f\xe1\xb3\x08\xf7\xad\xb4\x72\x01\xe4\x48\xf1\x4d\x09\x1a\x78\x0a\xd9\x71\x4b\x5e\x21\x91\xc9\xd7\x14\x4a\x5e\xca\xe3\x65\x6a\x39\x7a\xd6\x1c\x77\x6a\x12\x46\xb6\xaa\xdd\xce\x01\xc1\x7b\x45\x8d\xf1\xeb\x0b\xbc\x18\xf3\x56\x5b\x24\xf3\x5e\xad\x6f\x22\x1c\x45\x40\x63\xc4\xdb\xe4\xcd\x69\x5f\xa7\xf2\x05\xea\x6a\x6f\x33\x06\xfb\x21\xa6\x50\x04\x61\x8c\x0e\x19\x57\xea\x01\x8b\xe1\x7d\x49\x6e\x92\xdc\x12\xa1\x12\x30\x64\x81\x43\x32\xf3\xcf\x2b\x2a\x22\x8a\x25\x32\x7c\xe9\x26\x97\xf7\x65\x71\x5a\x50\xf7\xc3\xb1\x07\xa4\x77\x8b\xd4\xae\xd8\xf0\x7c\x3a\x55\x62\xad\x8d\x04\x30\xa6\xc7\xbe\xf0\x13\x6c\x9a\x36\xec\x14\x37\xa6\x15\xa3\x81\x86\x01\x25\xc2\x3a\xed\x8a\xc2\x82\x29\x9a\x50\x77\xac\x7d\xc8\x81\xc8\x59\x7f\x85\x84\x18\x76\x82\x76\xb5\xc8\xa6\x84\xc7\x8e\x89\x46\x09\x21\x4d\x8e\xca\x24\xea\x3a\x51\xfa\x89\xd4\xa8\x12\xd2\x33\x50\xdd\x12\xfe\x6c\xd2\x12\xd4\x3c\x55\xd3\x11\x81\x46\x22\x9c\x73\xcf\x32\xe1\xf2\x9c\xe3\x81\x8a\x88\x24\x72\xad\x94\x32\x3d\xf7\xe6\xd4\x0d\xe0\x89\x67\xf9\xa9\xbe\xa6\x87\x23\x54\xf5\x63\x51\xd6\x07\x7e\x18\xb6\x6f\x0a\xa5\x01\xdd\xcb\x87\x42\x36\xd5\x73\x07\xf6\x10\x40\x43\x0f\xcb\x50\x45\x7e\x58\x67\xbc\xa7\x20\xf9\xb7\xdf\x67\x3f\xd8\x04\x8a\x2c\xb4\xe7\x61\x5a\x1a\x37\x09\x33\x01\x3e\xd9\x77\x84\xf6\x42\x0c\xd2\xd0\xce\xb7\xce\x8b\xc1\x27\xba\xa3\x21\x20\xd1\x91\x71\x84\x36\x80\x8c\x22\xd7\x94\x29\x4a\xe8\xd8\x43\xd7\xa3\x67\x07\x84\xd2\xc9\x7f\x28\xa1\x81\x08\x1b\x95\xb4\xde\xd6\xe6\xc3\x1e\x84\xf6\xe3\xb0\xce\xda\x0f\x30\xce\xd2\x63\x1e\x16\x9e\xda\x8f\x9b\x0d\x37\x40\x49\x3c\x45\x6c\x85\xc4\xd1\xe2\x58\x98\xa4\xd5\xc7\x18\x14\xdb\x25\x21\x3e\x9a\xfa\xbc\x39\xb5\x8b\x78\x42\x31\xaa\x24\x51\x09\x42\x4b\x1c\x24\x68\x5a\x2d\xbf\xf1\x0a\xa5\x1f\x6b\xa0\x9d\x24\xa3\x85\xd1\xf4\xef\x46\xfa\x89\xb6\x9a\x6f\x1f\x75\x07\x4a\x5f\x32\x6d\x7a\x26\x4b\xc0\x14\xf3\x43\x71\x08\x66\x79\x91\x5f\xdc\x26\x25\x69\x68\xca\xd5\xee\x53\x70\x35\x65\x5a\x53\x92\xc6\x04\x79\xb4\xbe\x3f\xec\x36\xab\xdf\x06\x50\x73\x19\xf8\x1a\x25\x9f\x86\x8c\xaf\xe3\x6d\x54\x06\x54\xfb\x46\x7f\xea\x6d\x79\x6a\x43\x24\x80\xd6\x0f\xec\x08\xb2\xdd\x30\x91\xa0\xbc\x9d\xb5\x55\x98\xad\xe8\x8e\x49\xa3\xff\x7b\x70\xac\x83\x77\xe9\x01\xaa\x0f\x5c\x0c\x19\x80\xc6\x27\xda\xbb\x6e\xaa\x59\x59\x4f\x69\x4c\x94\x0c\x05\xc5\x42\x68\xc5\x5f\x01\x19\x3e\x6e\x01\x1e\xae\x10\xb8\x53\x45\x00\x7b\xb1\x28\xd0\x0c\x5c\x03\x9d\x51\xff\x69\x43\xda\xfb\x62\x5c\x01\x96\x91\x24\x28\xc2\xb6\xe3\xe9\x1b\x47\x95\x4b\x91\xa5\xf2\xb3\x85\x24\x23\x4d\x8c\x96\x53\x71\x98\xa7\xaa\x6b\xdc\xf8\x14\xfe\x23\x63\x1e\x24\xa6\x9c\x6d\xde\xc0\xf7\x0a\xca\x81\xec\x9b\x1d\xc5\x18\xc5\xad\xe2\x1f\x69\x23\x79\x7a\x4d\xd2\xc9\x6e\xde\x50\xe2\x85\xa2\x77\x2d\x7a\x28\xd9\x08\xa4\x30\xb9\x9f\xc4\x13\xb8\x63\x7f\x29\x01\x5a\x33\x7e\xd7\x06\xef\xa6\xd4\x37\x5a\x73\x89\xcf\xb0\x52\xf1\xf0\xc7\x1b\xfe\xdd\xed\x19\x92\xd3\xc8\xef\x55\x7f\x47\xe2\x74\x4a\xf2\x00\x30\xae\x3b\xf1\x5a\x1e\x4d\x3c\xfc\xfc\x32\xb8\x9f\x6b\xd1\x03\x25\x85\xa7\xc3\xb0\xa7\xcc\x43\x8b\x3e\xeb\xae\x28\x42\x19\x39\xce\xee\xac\xae\x7e\x62\x2f\x0a\xa8\xf9\x05\x93\x1f\xdd\x28\x50\x4c\xb8\x94\xf5\xf7\xbc\xec\x30\x6f\xa3\xbc\x8e\x14\x3a\x06\xf3\x31\x3e\x50\xde\x53\x52\xca\x50\x68\x67\xf1\x07\x5a\xff\x23\x4f\x41\xaa\xc0\x08\xbd\x99\x2c\xe5\xf2\x1d\x4a\x99\x56\xb0\x3d\xf3\xee\xfd\x01\x10\xa4\x4f\x7f\x2d\x6a\x58\xb8\x3f\xea\x30\x12\xc6\xe5\x2e\x0a\xbd\xbb\x9c\x61\xbf\x7b\xd8\x3e\x0d\x71\x92\xca\x0b\xb9\x23\xb0\x37\xac\x3a\x43\xa1\xc5\xd1\xa7\x54\x1e\xa7\x86\x2d\xe9\xad\x0b\xdf\x6f\xdb\x5c\xe5\x69\x8d\xfb\xcc\x89\xbf\xef\x85\x13\xff\xa8\xce\x5d\xf4\xa8\x48\xc4\xe2\x61\x6c\xd2\xab\x28\x4c\x12\x02\xca\x27\x09\xf2\x2e\xbd\x39\x17\x65\x5a\xdb\xe8\xcd\xa2\xf2\x19\xd0\xa0\x0b\x9f\xa1\xfc\x01\xb9\x1a\x70\x17\x9b\xb6\xe3\x3e\x1b\x69\xcf\xa2\x5e\x80\x0d\x94\xbd\x0a\xd3\x87\xad\x09\x8a\xc6\x54\x24\x9d\xe0\xde\xcb\x30\xcf\x34\xbe\xed\xc0\x4b\x94\xb5\xe0\xeb\x8c\x5f\x46\xea\x28\xa3\x09\xa0\x02\x6d\xb8\x25\x0d\xa8\x6c\x08\x6f\x50\xa1\x9f\x60\xca\xb8\x63\xaa\xb1\xa9\xa2\xec\x1a\xd4\xd2\xf7\x0f\xdd\x76\xf0\x55\x28\x12\x74\x66\xf6\xa8\x0d\xd1\xe9\xed\xdb\xa3\x11\x95\x4e\x01\x08\x0d\xf9\xb5\x9a\x8b\x52\x71\x90\x60\xfe\xb9\x03\x00\x6d\x1b\xb7\x95\xa8\x58\x50\x49\x9d\xca\x74\x96\xcd\x5b\x53\xdd\x15\x9e\x55\x0c\xb1\x8b\x95\x9f\xb5\x6e\x43\xf3\x61\x55\x56\x31\x92\xc8\xae\x56\xa7\x8b\xa6\xb4\xdc\xf1\xab\x7e\x48\x22\x8d\x24\x9a\xe4\xf9\x1a\x4a\x5d\x94\xa7\x71\x78\x68\xb3\xd0\x8a\x07\x21\x52\x00\xee\x75\x5a\x56\x66\x27\xe9\xb1\x80\x8a\x43\xac\x8d\x4e\x75\x8d\xc1\x13\x3c\x37\xb5\x2c\x26\xb4\xad\xcc\xbe\x4a\xe6\x4e\xd2\x21\xe7\x6e\x0d\x4d\xfc\x35\x25\x03\x1e\x8c\xe8\x7b\x8b\xf2\xb4\xe3\xe5\x01\xea\xbd\x02\x8d\x59\xb5\xc9\x09\x52\x26\x26\x3d\x97\x8d\x7b\x93\x95\x0a\x3d\x0c\xd7\xdb\xe9\x72\x65\x1e\x15\x44\x80\x60\xdc\x73\xeb\xb5\xcd\x53\xd5\xfa\xd5\x68\x91\xb6\xb2\x9d\x10\xd3\xfb\x02\x08\x71\x55\x6f\xb3\xe2\x0c\x2b\xdb\x33\x3e\xf1\x4a\x95\x8e\x8c\x6c\xd3\xec\xfb\x6e\x3b\x40\x3b\x2a\xcd\x02\x6f\x48\x38\x7c\x97\xbe\xba\x4f\x09\x1e\x21\x48\xe0\x59\x3b\x6c\xdb\x50\xae\xf6\x76\x3c\x00\x1e\x08\xc4\x00\x2a\x7e\x3e\x77\x79\x4c\x20\x3e\xc5\xa4\xb9\xf1\x3e\x56\x8b\xe7\x13\xaf\x3e\xa8\x67\x00\x61\x3a\x31\xcd\xb7\x38\xff\xf9\x14\x4f\x33\x8e\xab\xc0\x17\x0a\xb7\x8c\xcd\xef\xa3\xbe\x63\xf0\x75\xec\xbc\x6b\x24\x9b\xbe\xd6\x52\x51\x40\x49\xa8\x6d\xf6\xd2\x7c\xc8\x76\xcd\x71\x59\xaf\x1b\xf1\x0d\x26\x75\x59\xa0\x89\xc4\x5e\x82\x76\xe6\xe2\x3e\x82\xd2\xe9\xee\xe7\x02\x6d\xe2\x82\x0a\x1e\x9b\xd2\x69\x25\x28\x08\x09\x13\xdc\xac\x23\x28\xeb\x3b\xb7\x9a\x76\xc5\x9c\xe7\x2f\xed\xc7\x74\x03\xa3\x28\xc2\xf7\x06\xa5\xf4\xbd\x9e\x9d\x00\x22\xc1\xb1\xea\x3d\x2b\xeb\x45\xa7\xb0\xa1\x20\x92\xc6\x8e\x71\xa5\xe6\xc5\xfb\x6d\xcf\xe2\x16\x33\x06\x73\xe7\xab\x84\xf3\x41\xe0\x65\x00\x83\xb3\x5c\x8d\x8d\xd7\xf8\x75\xc5\xca\xa3\x83\x9c\x15\x94\x55\xa7\xbf\x75\x13\x32\x07\x8c\x7a\x83\xed\xfc\x0b\xe4\xde\x50\xb5\xab\x03\xc3\xfb\x6c\xf4\xaf\x25\xa8\x57\xc0\x42\xe3\xbb\x95\xad\xb7\x5a\xc9\x36\xe8\x73\xd6\x7e\x3a\xbf\x21\x21\xd2\xc1\x60\x17\x8b\xaf\x96\x6e\xca\x01\xef\x20\xf1\x3d\xd7\x2a\xf9\xd4\xfc\xc1\x87\x42\xdf\xed\x41\x8d\xfb\x13\xe2\xce\xea\x55\x7e\x76\x5c\xc0\x0a\x12\x15\xe2\x21\x04\xd8\xf4\x4d\x34\x33\xf5\x9a\xf6\x2c\x61\x3d\x5e\xa0\xdf\x9e\x20\xd1\x26\x66\x39\xf3\xcb\x3f\xb8\x7c\x39\x17\xb5\x73\x72\x80\xd3\xa0\x83\x39\xcf\xa1\x76\x4c\xa7\x0a\xb8\x08\x30\x1a\xde\x9f\xcb\x42\x42\x55\xf5\x12\xa9\x6b\x2e\x5f\x46\x8c\x81\x6c\xda\x71\x6c\x2f\x21\x3c\x31\x6c\xfd\x28\xf2\x0a\xf2\xfa\x3e\xcd\x26\x95\x30\x90\x3e\xc1\xa4\xd7\x09\x6a\x6e\x85\xa2\x31\xbd\xfe\x37\xad\x21\xee\x6c\x6a\xf4\x5d\xda\x70\xdb\x95\x1d\x30\x8b\x34\xf9\x28\x92\x27\x60\xb5\xd3\xce\x4d\x0d\x58\x07\xff\x00\x61\x05\x92\x83\xab\xdc\x2d\xf3\xba\xbc\xac\xf2\xc7\x22\xaf\x8f\x1f\xca\x5b\xba\xd3\x94\xc9\x32\x94\x60\x52\x8d\x96\xf1\x69\xf0\x51\x3e\xf9\x7f\x93\x97\xa7\x08\x23\xb1\x4d\x26\x62\xe1\xba\xf8\x01\x65\xd5\x54\x36\xb1\xe8\x46\xd1\xd0\x72\x88\x9d\x79\x53\x39\x8d\x31\x67\x34\xb5\x17\x05\xc4\xea\x21\xde\xc1\xb9\xa8\xdb\x2d\xe9\xa6\xa9\xd4\x1e\xe3\x8e\x1f\xcb\x44\x7d\x18\xba\x21\xbc\xc5\x49\x17\x8d\x5a\x99\xb5\xc7\x43\x4c\xc9\xcd\xee\xee\x36\xfb\xc7\xd9\xef\xb3\xfd\x6e\xd9\xd5\xb4\xb4\x27\x49\xdc\x6b\xbd\x2c\x78\x0d\x87\xa2\x4c\x25\xcf\x0c\xe8\xe8\x56\x1a\xc7\x5a\x03\x4d\x58\xc0\x6d\x53\xea\x01\x76\x6f\xc5\xb2\x4b\x1f\x69\x92\x44\x60\x9b\xcc\x3a\x54\x94\x4d\x67\x0c\x9a\x65\xdd\x60\xf0\x51\xa4\xad\x6b\x9f\x6f\x37\xad\xbf\x97\x09\x55\xda\x27\x46\x5f\x6e\xa6\xd4\xae\xb8\x9b\x4f\x2e\xeb\x13\x81\xed\x53\x66\xf7\xd8\x1e\x79\x39\x45\x98\x8d\x3f\xa4\xa6\x89\x08\x78\x07\x09\x58\xa4\xb7\x5a\x59\x75\xc0\x0c\xc9\x83\xbb\xd9\x2d\x98\x96\x2c\x53\xeb\x9c\xa2\x7f\x74\xa0\x1c\x0c\x76\xe1\xe0\x31\xdd\x4b\x0a\x89\x60\x5d\xd9\x72\x5d\x16\xba\xa7\xc4\xd4\x21\x8d\x11\xbc\xee\xc8\x5c\xe6\x90\x83\x4e\x65\xca\xcb\xcb\x67\xd4\xb0\x4a\x87\x3c\x0a\xac\x57\x39\xcb\xb2\xe2\x0d\x5b\x5d\x90\x74\xe0\xf6\x43\x87\x52\x20\xa7\x67\x5a\xe1\xec\xb1\x16\xd2\x7d\x62\xe6\x45\xca\xa2\xc3\xe7\x4d\x99\x77\x92\x41\x93\x97\xc2\x74\x84\x98\x91\xef\xce\x3a\xea\x84\xc6\xf8\x69\x1e\x8a\x83\x7f\x0d\x27\xd7\x49\x10\x62\x28\x92\x01\xbc\x6c\x6b\xe0\xd9\x0e\x35\x8a\xcb\x7d\x77\x7e\x4c\x10\x0d\x5d\x35\xe2\x1a\xee\xa9\x13\x4e\x90\xc7\xcf\x4a\xa3\x7c\xfb\xdd\x85\x33\x9a\x73\x1f\x93\xfe\xcf\x3f\x9f\x96\x9b\xed\x7e\xf6\x74\xb7\x5f\xcf\x36\x3b\xf3\x1f\x43\xf1\x50\xa5\xb9\x0a\x31\xf5\xb0\x7c\x3f\xf3\x7e\xe6\x0a\x2f\xc6\x1d\xf9\xe7\xd7\xd5\x6e\xf9\xb0\xda\xa2\x26\xe8\xe3\xec\xb7\x11\x3a\xb9\x1b\x1c\x05\x38\xc5\x6a\x24\x3c\x34\x70\xea\xee\x13\x8a\x76\x2f\xb2\xa5\x2d\xfe\x96\x3f\x14\x3c\x5f\x4d\xf6\x1f\x2d\x44\xc8\x82\x8e\x3a\xe6\xa9\xc8\xbb\xd5\x02\xca\xee\x94\xe3\x37\x2d\xa5\x17\x9a\x32\xe3\xf2\xfd\x9c\x96\xa0\xee\x80\xab\x2c\xed\xf2\x77\x5a\x6a\x8a\xc9\xe8\x07\xa8\x64\xf1\x0a\xef\xfb\xc5\xef\x8b\x0f\x36\xfa\xf1\x95\x15\x51\xd0\x11\xd8\x7f\x9e\xbf\xd3\x2a\x00\xdf\x35\xe5\xf5\x5c\x91\x5a\x31\xe1\x32\x8f\xf3\x26\xcd\xae\x73\x45\x5a\x81\x8f\x51\xdf\x30\x86\xd1\xe0\x1b\xd2\xc7\xdc\x89\xe3\xb7\x61\x68\x77\x50\x2a\x34\xf0\xc5\x19\x72\x87\x46\xb2\x87\x74\xcc\x30\xad\x8e\x9c\x62\xfd\xd2\xd1\x9a\xd3\x8e\x82\xf6\xfb\x18\x1d\xdf\x3a\xa7\xbe\x60\x3d\x77\xcb\xdd\xde\xfe\x9f\xfd\x97\xcd\xf3\x77\x8b\xc4\x01\x8f\x04\x52\x9b\xfb\x44\x25\x96\x4d\x91\x4d\xec\xe1\xad\x6d\x05\x3c\xa2\x13\x91\xf4\x3d\xa2\xbe\xbb\x9c\x4f\x03\x84\xdf\xad\xbf\xae\x1e\xfa\x04\x19\x78\x34\xe2\x88\x30\x7a\x9a\x2f\x1e\xfe\xb6\x6f\x01\x3c\xca\x8d\x74\xf5\x2c\x57\xef\x45\xf9\x50\x1c\x0e\xce\x1d\x01\x8f\xca\x10\x8d\xc9\x1d\xb4\xb3\xa1\x76\x7c\x83\xed\x81\x04\x4b\x9f\xf3\xe6\xf2\x0d\x2e\xe3\x95\x04\x5e\x28\x4d\xa7\x10\x77\xb8\xc4\x41\xd8\x05\x5e\xa8\x20\xf2\x3b\x7e\x19\x0b\x9b\xb8\x46\x09\x81\x17\x79\xda\x34\x02\x9e\x6d\x12\x0a\xc9\x2f\x3b\xe7\xbf\xf3\x70\xc0\x8b\x95\x6f\x88\xf8\xea\xba\x28\x73\xb8\x6c\xd3\x43\xee\x7e\x2e\x61\x0a\xb7\x36\x97\xe0\x09\x6f\xda\x2c\xf0\xb8\x6f\xf2\xa9\xa8\x4e\x62\x58\x82\x67\x0f\x0f\xcf\x3f\x67\x4f\xae\xc4\x07\x9e\x88\xb9\x61\x19\x35\x6e\xca\x02\x19\xca\x3e\x26\xa2\x01\x4f\x7a\x04\x5d\xe6\xac\x0d\x1e\xdc\xdf\x84\x8f\x25\xf9\x5e\x70\x6e\x7e\xb1\xb5\xf2\x69\xd3\x55\x3b\x58\x44\xae\x3c\x59\x6d\xcf\x65\x5a\xc3\xf3\x5b\x9e\xe6\x07\x5b\xac\x9a\x4c\x44\x09\x1c\x5f\x84\x30\x24\x29\x83\xb7\xae\x18\xf1\x23\x33\xf9\x56\x8b\xe7\x11\x81\x39\x78\x9a\x86\xd8\xde\xef\xf6\x9f\x6a\xdb\x54\x67\xc8\xbb\x26\x1a\xf0\xb4\x12\x78\xba\x81\xad\xf5\x52\x53\x40\x7c\x3f\xc0\x1e\xd0\xcc\xac\x23\x03\x89\xcd\xab\xa6\xec\x1a\x86\xad\xd3\x00\xc4\x8f\x82\x20\x19\xe4\x49\xee\x8b\x72\xc3\xb5\x76\x19\x59\x20\xbe\x4c\x6c\x9a\x23\xcb\x30\x32\xbc\xb5\x1d\x01\xf1\x55\x8c\x95\xd6\x27\x30\x9f\x14\xa9\xa3\x3e\x6d\x29\xbe\x09\x1e\x03\xe2\x6b\x82\xa1\x4b\x93\xa7\x75\x15\x7a\xb6\xf0\x8c\xb8\x02\x77\x4b\x34\x62\x58\xa8\x71\x59\x9a\xa9\xbb\x0f\x84\x0a\x8e\x0a\x50\xf3\xa7\x85\xd1\x46\x6a\x9f\xcc\x22\xb2\xdc\x10\x45\x31\xe2\xfd\x91\x42\x9d\xf3\xd3\x17\x38\x61\x02\x13\xc3\x6d\x37\x26\xf0\x24\xfa\x72\xcb\xa7\xc5\xe6\xf7\x35\xb6\xab\x7c\x5b\xfe\xee\x8e\x86\xd4\xc8\xec\x1d\xa0\xc6\x8e\x3e\x28\x4d\xdf\x6a\x65\x7a\x94\xc7\xd3\x80\x84\x89\x42\xe7\xe7\x81\x9f\x44\xd1\x5d\x42\x48\x7c\x6b\x98\x3b\x1c\x84\x16\x40\x22\xca\xa5\x0d\x49\x1c\xe1\x86\xc5\xaf\x0f\x9d\x3e\x20\x71\x22\x12\xeb\x4f\xde\x97\x00\xae\x34\x32\x7c\xe1\x36\x16\x06\xc2\xa8\xe9\xed\x7a\x48\xb1\x72\xe1\xe4\x4e\xff\x4e\xde\xf6\xb3\x64\x12\x90\x24\x62\x8c\xd8\xf9\x31\x2a\xf7\xde\x36\x9d\x84\x7b\x1e\xe7\xd6\x8b\xbe\x6e\xc3\x70\x83\x02\xd5\x17\x07\x47\xb2\x92\x40\xb8\x32\xc0\x98\xdf\x96\x9b\x99\xfb\x9b\x48\x3c\xa7\xa5\xfd\xc0\x73\x65\xe1\x5f\x7f\x73\x27\x02\x0c\x91\xdc\x16\x40\x99\x8c\xdb\x6d\x8b\x41\x84\x8e\x31\xb0\xe5\x4a\xb9\xe9\xfd\xe1\x9d\xcb\x48\x99\x86\xda\x01\x90\xfc\xbe\xf9\x80\xf9\x1b\x08\x12\xb9\xda\x14\x83\x03\x39\x8e\x08\x06\x81\x00\x91\x38\xcd\x4e\x06\xca\x38\x6a\xa8\x61\x6e\x4c\xe4\x21\xdf\x9f\x2d\x90\x3d\x6b\x2d\x71\x1e\x7f\xba\x8b\x11\x88\x42\xdf\x84\x2a\x8e\xd7\x71\xfc\x69\x75\x18\x62\x82\xca\x52\x3f\x98\x07\x7f\x1f\xf7\x47\x80\xef\x05\x14\x1d\x65\x95\x1e\x3a\xbf\x16\x7c\x2f\x02\x6c\x87\xc3\x52\xed\xf6\x25\x1d\xe4\xa5\x6c\x41\x19\x7c\x8f\x19\xe1\x9d\x4a\x1e\x41\x35\x19\xa8\x5d\x71\xfe\x7e\xee\xae\xc0\x13\xee\x0d\x2c\x53\x5f\x99\x98\xcc\x55\xd6\x9d\xa0\x31\xfe\x79\x03\x78\xc9\x2e\x7b\x95\x56\xa2\x29\x2b\xe4\xb6\xec\xae\x29\x62\x6c\x3b\xea\xd5\xba\x8d\x60\x2c\x52\x6b\xf7\xf7\xae\x23\x2c\x42\x59\x8e\xec\x13\x4f\x33\x77\x88\x10\x40\x5f\x4f\xf1\xcb\x7d\x9a\xa7\x95\xeb\xdc\x77\xeb\xd1\x27\x54\x0b\xab\x19\x9a\x6d\x00\x53\x74\x0b\x9e\x65\x82\xcb\x97\x5b\x04\xec\xe0\xfb\x91\x8f\x89\x48\x84\xff\xd9\xb0\xbc\x42\x0c\x80\xfb\x4d\x3f\x91\x58\xa4\x68\xa3\x40\x74\x4e\x56\xb7\x90\x01\xe0\xfb\x42\xa1\x47\x98\xe1\xf4\x41\xea\x2b\x13\xbb\xf3\xee\xf6\x29\x01\x74\x85\xb9\x28\x4a\x64\xa4\x9c\x7c\x4b\x1a\x79\xd8\x8d\x7e\xe4\xd5\x2c\xcb\x66\x75\x5d\x56\xe3\x8a\x98\xef\x06\x32\x1a\x45\x4e\x35\x99\xeb\xd6\x9c\x4c\x72\x37\x6e\x60\xc2\x71\x2b\x4a\x6b\x38\x99\xba\xe0\xad\x4e\x34\xf0\xa9\xf4\xbd\xa4\x8b\xc9\xee\xc0\x08\x2c\x8e\x23\x48\xf0\x03\xea\x63\x97\x9c\x2e\x8b\xbf\x20\xef\xcb\xdc\xe0\x07\xa0\xd0\x5e\x1a\x57\xe1\xfe\x79\xb3\x5f\x3d\xfd\x58\x6e\x77\x8e\x44\x02\xfc\x90\x98\x76\x49\x87\xc0\xd9\x80\x84\xf4\x5c\xff\xb7\x44\xb1\xc3\xb4\x22\xf8\x61\xe0\x47\xbe\xcb\x42\x72\x59\xdf\x35\xa6\x56\xb3\xca\xef\xf8\xa5\x9b\x48\x61\xa0\x88\x41\x0d\xa4\x2e\x65\x07\x7e\x08\x12\x5d\xe3\x6f\xb3\x87\x70\x90\x92\x04\x3f\xd4\x0a\x61\xc5\xdb\xa2\x7e\x29\xfa\x24\x2c\xf8\x31\xa7\xe8\x41\x54\x5c\x1e\xfb\xbf\x32\xc2\xb1\x87\xd6\xa5\x66\x3f\xae\x55\x80\xcf\x7c\xea\xdb\x10\xc5\x0a\xa6\xd9\x8e\xa7\xa1\x52\x99\x1b\x1b\xd3\xc4\x00\x06\x0e\x36\x08\xc4\x2b\x2f\xf8\x79\xe1\x88\x98\xaf\x50\x50\xb7\xd0\x9f\xe0\x33\x46\xe3\xc0\x89\x6e\xe5\x57\x1a\x67\xe3\x4f\xcb\xb8\x40\x28\x8e\x89\xdf\x51\xe4\xcd\x3d\x69\x12\x86\x89\xb4\x2d\x16\xdf\x00\xce\x69\x7e\xf8\x67\x53\xf4\x0b\x24\x89\x69\x02\x03\xfe\x59\xdb\x0f\x69\x8a\xc7\xb7\x2c\x45\x02\xc2\xd3\xbd\xfb\x5e\xcd\xde\x0c\x47\xc9\x7d\x51\x0e\x8b\x76\xe0\x73\x21\x1d\x4d\xbd\x52\x13\x27\xc3\x57\x5e\xe0\x36\x1d\x53\x47\xdb\x15\x86\x97\xea\x33\xaf\x67\xe0\xf8\xf7\x85\x27\xf0\x41\x45\xac\xf7\xe5\x6e\xf6\x88\x82\xaf\xbd\x00\xeb\x83\xf2\x58\x14\x95\x63\x45\x1d\xdd\x13\xf5\x22\x85\x5b\xd5\x63\x9a\xd7\x7d\xff\xf2\x64\x4c\x9c\xa0\x3d\x81\xfa\xe8\xaa\x3b\xee\x88\x32\x1a\x45\xa2\xb9\x6c\x78\x89\x60\xe3\xc9\xb9\x24\x54\x08\x14\x34\x60\xb6\x1b\x59\x73\xa0\x6d\x6c\x14\x19\x10\x44\x6b\x61\xaa\xc5\xd1\xb8\x19\xf6\xb0\x4f\x74\xe0\x77\xa9\xe5\x2e\x0c\x7e\xce\xb3\xcb\x20\x7c\xa0\x7e\x90\x70\x4b\x65\xfa\x98\xe6\xed\xa4\xb0\xa9\x41\xe6\x06\x84\x02\x63\x83\x6d\x21\x53\x9e\x6d\xe0\x94\x8e\x5b\xf9\x3f\x0e\xaf\xa8\x1f\xb1\xd0\xb0\x26\x20\xf2\x7d\x3f\x53\xaa\xbd\xd3\x39\x2f\x3f\xcd\x94\xdb\xb3\x29\xb1\x5c\x9c\x35\x2f\xeb\x95\x2c\x3e\x64\xbb\xfd\x7f\xfd\xd7\xfd\x9e\x36\x50\x2e\x2b\x52\x35\x82\x9c\x01\x0d\xbc\xd8\xca\xd6\x38\x71\x81\xf1\xd9\x81\xa7\x51\xb5\x08\x72\xf4\x0f\xbf\x38\xbe\x59\xa0\x81\xe0\x18\xdb\x0f\xc5\x58\x56\x8b\xe7\xfd\x6e\xb5\xdc\xd0\x41\xff\x07\xd0\x40\xc5\x0e\xd7\x70\x87\xe0\xd1\xeb\x8f\x1e\x5a\x50\xdf\xba\x84\x79\x73\x99\x1e\x8c\x7d\xb7\x8a\x8c\xcc\x8a\xec\xe5\x5e\x47\x33\x9c\x86\xda\xe0\x54\xdb\x38\x0a\x16\xbc\x2c\x8b\xba\x32\x1a\xff\x37\x3d\x5a\x1a\x69\x05\x86\x24\xfb\xf0\x34\xa8\xaa\x8f\x2c\x0b\x8d\xfd\x98\x8a\xbe\xd4\x63\x51\x23\x37\xed\x3a\x8d\x65\x82\x4c\x95\x55\x23\x2a\x59\xa6\x58\x62\xef\x39\x5b\x26\x17\x66\x5e\x62\xd9\xee\xea\xff\x3f\x6b\x6f\xd6\x9c\x3a\x92\xad\x81\xfe\x97\xf3\xd4\x0f\xfd\xa0\x29\x95\xd2\x7d\x03\x8c\xf7\xe6\x94\x6d\x68\xc0\xb5\xab\xaa\xe3\x04\x91\xc3\x4a\x50\x5b\x48\xb4\x24\xec\x4d\xfd\xfa\x1b\x5a\x39\x68\x40\x76\xd5\x8d\xb8\x0f\x5d\xdb\x4d\xa6\xe6\x1c\xd6\xf0\xad\xef\x7b\xcc\x6a\xc1\x72\x94\x7d\xba\xdd\xc1\x7a\xfe\x82\x3c\xc3\x9e\x8d\x28\xf4\x59\x90\x68\xcd\xc9\x2f\xf4\xe7\x44\xc2\x04\x62\x91\xca\x76\x1f\xdd\x8d\x09\x01\x20\x4c\x04\x8d\xb5\xdb\x27\xde\x3a\x70\x7a\xff\x0c\xa9\xe4\x61\x62\xb0\x99\x8b\x13\xd4\x4d\xbd\x6b\x5c\xda\x08\x42\x16\x86\x28\x06\x73\x40\x3f\x78\xc3\x32\x79\x27\xbe\x3e\xba\x24\x0f\xf5\x92\xd4\x64\x67\x67\x3f\x85\x9c\x52\x5c\xca\x73\xcd\xe5\x62\x75\x9b\x6d\x6b\xaa\x4d\xde\xc5\xfa\xe5\x71\xb5\x7d\xee\xd3\xa2\xb7\x8d\x52\x87\x03\x41\x94\x85\xd4\x59\x37\xdb\x26\x62\x1d\xb1\x13\x59\x93\xfd\x09\x45\xdd\xa9\x9a\x9b\x0e\xd2\xd3\x95\xd4\xc5\xf5\xbc\x56\x46\x8d\xac\xc7\x68\x66\x33\x24\x5d\x7f\x5f\x73\xc9\xcd\xd9\x5b\x73\x97\x46\x1c\x3e\xa7\x0c\xa4\x17\x5b\x47\x0d\x93\xad\x73\xe8\x33\xdc\x40\x28\xa3\x14\x43\x95\xda\x68\xc4\xdc\x4f\xd6\xbb\x14\x4d\x3c\x33\x54\x34\x7b\xaf\xe3\xfd\xed\x7d\x1d\xa9\x22\x5d\x72\xff\x01\x45\x73\xdb\x9f\xb2\xaa\xb9\x75\x88\x6b\x7b\x2a\x08\x42\xcf\xac\x8c\x3b\x47\x85\x80\x2e\xfe\x78\xee\x83\xf1\x93\x59\x9e\x2f\x58\x53\xcf\xb0\x44\xa0\x5b\x3a\x40\xea\x6a\x9a\x1a\x9a\xd5\x99\x1d\x75\x86\x67\x6a\x23\x0f\x95\xaf\x30\xb4\xa4\xb5\xb1\xd6\x6a\x5d\x1d\xfb\x18\x22\x88\xfc\x38\xf1\x03\xc7\xe3\xd6\x2e\xa6\x83\x7a\x36\x88\xfc\x54\xa7\x52\x2b\x6d\x76\x58\xe2\xcd\x37\xf8\x3a\x81\x03\x91\x6f\xf8\x6b\xde\x33\xf8\xe8\xc5\x76\xe6\x37\xa3\xd3\x3c\xb4\xde\xec\x41\x9c\x86\xca\x96\xe2\xb2\xcb\xd8\x28\x8d\x42\x4f\x63\xae\x0f\x29\x39\x00\x87\x66\x77\x66\x95\x43\x54\x67\xf6\x9e\xc3\x38\xc5\x85\xf7\x71\xfd\xfa\xf2\x30\x43\xef\x1f\xb5\x6a\xd0\xc4\xdc\xb9\x5e\xa9\x42\xd2\x82\xe6\x94\x55\xb2\xaf\x00\x02\x11\x21\x69\x98\xf6\xec\x1f\x26\x10\xb1\xe2\x9a\x53\x1f\xcd\xa3\x03\x93\xf2\xa1\x2a\x0b\xc0\x8a\xa8\x62\x54\xda\x0f\x11\x91\x80\xd8\xaf\x4d\x06\x02\x26\x62\x1e\x93\xb9\x3e\x88\x08\x78\x18\x44\x94\xac\x7a\x2b\x4a\x09\x43\x1a\x78\x88\x68\xe0\x47\x3a\x21\xf0\x9d\x55\xef\x50\x37\x4b\xd4\xf3\x73\x77\x4f\xdb\x1d\xc2\x46\x6b\xb5\x48\x96\x6d\x4a\x22\x29\x2d\x89\xb8\x0e\x79\xac\xd5\x3e\xb3\xd1\xad\xe1\xbb\x4e\x64\xa0\xa4\x1d\xf9\x9a\x31\x71\x6a\x8c\x45\xa9\x17\xa0\xd3\xf5\xc7\x1f\xfd\x28\x93\x6d\x0c\x18\x8b\xbb\x92\x99\xa7\xa9\xec\x04\x44\x29\x4d\xb1\xd6\x65\x51\xd6\xe7\x4c\xa0\xf2\x78\xdf\xc0\x8e\x52\x48\x31\x05\x96\x9d\x2f\x65\xd5\xa0\xb2\x4f\x85\x8e\xd6\x1d\x70\xc6\xba\xa8\x11\x23\x0c\x43\xcf\x1a\xa5\x6c\x4b\xe4\x20\x62\xb1\x1f\x9a\x3a\xb6\x7e\xc4\xf1\x2f\x13\xec\xd3\x81\x76\x88\x58\x9a\xda\x3d\xaa\x9d\x3d\x5a\xea\x69\x32\xe0\x12\xb1\x54\xe1\xbe\xbd\x5b\x2c\xca\xf3\x25\xcf\x5a\x8b\xd1\x6a\xc6\x9b\x2e\x9c\xf9\x48\xaf\xda\xfa\x94\xf3\xeb\x6d\xff\x51\x0e\xcc\xda\x88\x43\x68\x07\xa6\x15\x4c\x1d\xbd\x4a\x0e\xc2\x3c\x5f\x21\xa1\x5a\xd5\xa6\xc6\xca\x8d\x5d\xe1\x87\xa8\xca\x7c\xb9\x56\x97\xd6\x16\x85\xac\xe7\x8c\x45\x32\xd2\x15\xf7\x06\xcf\x21\xca\x65\x71\x97\x23\x80\x08\x98\x0e\xe4\x1c\xa1\xd1\x81\xc7\x7d\x6f\x5f\xb6\x7d\x84\x2e\x9e\xe8\x31\xff\xbd\x16\xed\xc6\x64\x4c\xcf\xc1\x5d\x13\x2f\x65\x58\xdd\xf3\x72\x3c\xb2\xfe\x97\x27\xbe\x47\x10\xaa\x62\x48\xbb\x7a\xf7\x4a\x82\x48\xe8\x78\xd4\x95\x3f\x67\xc5\x75\x42\x29\xd2\x76\x4c\x12\xe6\xd9\x7c\xac\xad\xb1\x00\x12\xc6\x3e\x5a\xdc\xdf\xb4\x2f\xb1\x29\xcb\x51\x21\x1b\x90\xc8\x8b\x71\x93\xbc\xe8\x92\xb9\x1f\x59\x73\xb2\x76\xd0\x94\xf7\x19\x47\x83\xb1\x41\x88\x4f\x70\x58\x6f\xca\xe2\xcf\x6c\xf0\x58\xd4\x93\x71\x57\xbc\xf7\x88\xf0\x44\xe4\x33\xae\x47\x08\xce\xe9\xff\x5a\xab\x87\x24\x51\x8c\x1b\x4f\x01\x1f\xbb\x86\x15\x12\x75\x45\xcf\x17\x96\x1d\xef\xb8\x8f\x26\xc7\x24\x49\x52\xcd\xa2\x7d\x40\xe5\xc9\xd1\xe3\x27\x4c\xa6\xd4\xea\x74\x54\x67\x86\xdc\x13\x4f\x63\x2c\x2e\x90\x44\x68\xd5\x1c\x09\xff\x9f\x52\xa1\x40\x12\xd0\x14\xd4\xed\x42\xda\x8e\xe7\xe5\xcf\x0b\x54\x19\xf4\xc8\x31\xff\xd9\x7f\xda\xd4\x8f\xa4\xd3\xaa\x1d\x6a\xf7\xd9\x1e\xc0\xfd\xc8\x51\x65\x68\xd0\xf7\xa8\x0b\x93\x21\xc2\x39\x11\xa8\xa6\x41\xb0\x07\x95\x15\xf2\xa5\xfc\x9e\x15\x86\x66\xf2\x3b\x30\xab\xc0\x69\x8e\xe2\x41\xe4\x33\xcb\x05\x54\x55\xe5\x87\x2e\xd0\x9f\xc8\x32\x10\x4e\x42\x04\xd8\x76\xfc\x9c\x7f\x63\x1d\x21\x42\x32\x24\xa1\xc8\x2c\xf5\xb3\x86\x11\x7d\xab\xca\x8f\x61\x05\x0f\x10\xe9\x05\x44\xb3\x4d\x1d\xaf\x39\xab\xba\xc2\xa4\xe1\x7d\xc8\x48\x44\xbd\x20\x20\x92\x18\x8f\xb7\xec\x9e\x27\x4b\x20\x89\x95\x79\xbb\xcb\x42\x95\x95\x80\x5f\x6e\xa2\x67\xe5\x10\x10\x80\x71\x0b\x3d\x68\x9f\x4a\x94\x56\x1c\x05\x21\x08\x00\xc1\xd0\xa0\xe6\xd0\xdb\x95\xaa\x11\x2e\xbd\x41\x94\x9f\x60\x0a\xec\xa2\xd7\xae\xe0\xc0\x06\xc6\x06\x51\x8c\x21\x07\x36\x6b\x1a\x66\x2b\xb3\x21\xf6\x42\x1f\x33\xed\x7f\x64\xc7\x3f\xd8\xb1\x3f\x8f\x62\x4f\x25\x32\xee\x2b\xf5\xef\x2e\x4c\x40\x7d\xca\x2e\x73\xd6\x34\x79\xeb\x6a\xd7\xf3\xdb\x28\xa9\x0b\x71\x48\x7d\xae\x71\x04\x4d\x56\x0d\x21\x34\x10\x87\xa9\x76\x32\x3f\x32\x5b\xd7\x6c\xaf\x16\x51\xc6\x84\x5b\x7d\xd9\x19\x46\x84\xb0\x10\x47\x89\x87\xef\x70\xf6\x45\x72\x16\x62\x12\x49\xc5\x8c\x42\x10\x9c\x1f\xcb\xea\x6d\x88\x39\x86\x98\xd0\x08\xd9\x16\xc0\x00\x79\xfb\xce\x7e\x4c\x98\x87\x38\x4f\x93\x3e\x82\x3c\x5f\x64\xcd\xed\xb1\xac\x34\xba\xb9\x1f\xd5\x8c\x89\xa0\xd0\x71\xf3\x3c\xb1\x76\xd4\x6f\xe1\x1d\x99\x09\xb4\xbb\x13\x78\xfd\x51\x10\x13\xc5\xb8\x67\x0b\x3f\x56\xf5\x23\xc6\xeb\xec\x95\x63\x21\xd1\x0b\x51\x95\xa9\xb9\xb4\xc9\x9f\x98\x2a\x2d\xdb\x6c\x00\xde\x55\xf3\x51\x56\xe3\xb8\xe9\x70\xf2\xc7\x49\x2c\x3c\xa7\xcf\xc3\x94\x1a\x04\xcf\xe3\x84\xf2\x58\x3b\xcf\x4d\x95\xc1\xfb\x74\xb9\x3c\xc4\x89\x60\x58\xbe\x77\xa9\x34\x79\x19\x6b\x9c\xb7\x30\xbd\xe6\xc4\x69\x98\xa0\x4e\xf0\x5e\x67\x28\x1a\x71\x72\x16\xbd\xed\x41\x35\x15\x26\xc6\x09\xda\x21\xbe\x56\x5b\xdc\xc0\x60\xa0\x4b\x69\x7b\x27\x04\x4c\x06\x96\x5f\x6f\xf7\x98\x5b\x88\xd3\x54\x7b\xd1\x73\x01\xc5\x71\x51\x2a\x05\x30\x18\xc4\x69\xaa\xa1\x9a\xc0\xc4\x69\x96\x55\x0f\x55\x79\x19\x4c\xf8\x38\x65\x31\x32\x7d\xeb\x82\x39\x7d\xf9\x97\xb2\xe9\x91\x3f\xbb\x9e\x42\x27\x3c\xd0\x0a\x99\x1a\x7a\xa9\xd2\x72\xfa\x97\x0a\xce\x0e\x93\x00\x31\x23\x54\x17\x1b\x57\xf0\x9e\x95\x46\x3c\xcb\xd4\xc9\xb8\x3e\x2a\x40\xf8\x81\x1d\x93\xcb\xe6\xb4\x6b\xf8\xf4\x9e\x1b\x33\xa5\x41\x2b\x76\x4b\xd8\x5d\x60\xec\xe5\xc4\x5c\x70\x46\x1c\xbf\x5a\xad\x35\xde\xb3\x09\x3e\xe3\xe9\x0f\xc9\x25\xe0\xb6\x6e\x8b\x24\x1c\x7c\x07\x83\xf1\x65\x67\x19\x0d\xdf\x80\xf0\x12\x24\x02\x39\x1c\x4e\xac\xde\x96\xf7\xcb\xb3\xed\xc7\x23\xac\xf5\x78\x2f\x1b\x18\x66\x78\x63\x19\xe9\xda\xb8\xff\x94\x59\xb1\x65\x02\x66\x85\xd4\x39\x85\x4f\x4e\x25\xe3\xd4\x14\xb3\x36\x97\x51\x11\xe7\x5d\xc5\xc5\xff\x3f\xb1\xa7\x58\xa6\x44\x50\x5b\xa9\xff\xfd\x3e\x61\x10\x83\x64\x08\x2b\x50\x9f\x68\x9d\x42\xac\x02\xc0\x3c\xf6\x2f\x2e\x72\x1d\x2b\xe2\x61\x8a\x77\x9e\x65\xc7\xf2\x8b\xb0\x75\xac\x78\x88\xe5\xc4\xa2\x3c\x5f\x58\xd1\x6e\x4e\x4f\x28\x1c\xd8\x0d\x6a\xea\xf9\x1e\xd2\x8b\x3d\xb0\xfa\x94\x49\x66\x9d\x37\x1a\xa4\x51\x20\x7a\xa3\xc2\x41\xd0\x81\x06\x2c\x35\x2c\x16\x85\xdc\x97\xbd\xcc\x9f\x5d\xee\x28\xf1\x42\x5f\x13\x58\xd7\xa7\xe9\x9c\xe6\x74\xe5\x96\x3d\x9c\x02\xd6\x54\xf2\xb2\x7c\x5b\xff\xba\xda\xed\xa6\x76\xef\xfe\x83\x52\xc2\xb4\xf0\x28\xcf\x9a\x4b\x7e\xad\x87\xce\x33\x25\x22\x42\xdd\x16\x7e\xad\xbf\x8a\xbd\x0f\xde\x1d\x8d\x7d\x8e\x53\x94\x77\x56\x14\xda\x5c\xa3\x5e\x10\x6a\xf2\x09\x24\xd3\x40\xde\x35\xbb\x0a\x50\x1a\x2b\x45\x7a\x22\xac\x7a\x2f\xe4\x25\x86\x62\x4d\x9f\x34\xf1\xec\xea\xab\xb3\x3b\xd7\x69\xfe\x73\xa0\xcc\x0f\x8d\x60\x62\x79\x19\x51\x22\x00\xe5\x89\xd4\x9c\xcb\xd9\x3b\x60\xc5\xf7\xbe\xc4\x7a\xfb\xc1\x2a\x4d\x85\x4a\x62\xde\xd7\x5b\x69\xd7\x95\xcf\x85\xdd\x87\x97\x90\xbe\x67\x69\xa3\x9f\xd9\x4f\xcd\xef\x32\xb2\x75\xa8\x0c\x74\x51\xf3\xb9\xec\xed\x14\xd3\xa7\x03\xe2\x63\x15\xc2\x43\x26\xb0\x30\xd5\xbe\x10\x05\x02\xad\x1b\x8c\xd1\x1d\x9a\xec\x0c\x87\xbc\x13\xf3\x81\xc4\xf3\x43\x94\x41\x7a\x82\x42\x2e\xca\xa2\x80\x51\xb9\x08\x24\x1e\xa7\x88\xb1\xeb\xe8\xca\xb4\x44\x31\xf2\x95\x3d\xb2\xdc\xaa\xcb\x41\xe2\x09\xbd\xc9\xea\x78\x20\x96\x89\x96\xe7\x33\x14\x12\x39\x02\x2b\x97\x8d\xb3\xe3\x3a\xf1\x7d\x0f\x0c\xca\xef\x5f\x57\x18\xb2\xd3\x40\xe2\x87\x29\x6e\xcb\x80\x80\xb3\x5a\x97\x8a\x4f\x4e\xcc\xc4\xa7\x02\x49\x6a\xb6\xeb\xd7\x97\x87\xc3\xd3\xf2\xe5\x9b\x05\x87\x41\xe2\x8b\x88\x87\x66\x7a\x69\x16\xce\xbf\x83\x1a\x86\xc4\x87\xc0\xa9\xe1\x1a\xa5\xc9\x61\x74\x38\x09\x13\x82\x66\x5a\x05\x47\x26\x47\x5e\x46\x12\x32\x8e\xfb\x4a\x01\x1f\xcb\x9f\xd9\x34\x80\x2b\x0c\xac\x63\x9f\x44\x3e\x49\xcc\x70\xd8\x3c\xcd\xf6\x5f\x01\x46\x21\x89\x88\xae\xbe\xeb\xa3\xc7\xc3\xc8\x3e\x70\x24\x23\x64\xce\x73\xbc\x68\xd5\xa2\x2c\xde\xb1\x04\x6c\x38\xbe\x12\x42\xb4\x0b\x59\xeb\xd2\x98\x4f\xeb\xab\x20\x21\x54\xcb\xe9\x1b\x54\x93\x21\x20\x9e\x7e\x71\xb1\xa4\x96\x61\xf1\xd7\xb1\x4b\x9c\xc4\x2a\x31\xcc\xa6\xc8\x66\x65\x41\x30\x9f\xec\x8d\xee\x20\x9e\x68\x50\x6a\xeb\x72\x63\xb1\xfb\xb8\x2e\xc6\xf4\xa4\x8c\x08\x27\x5d\x90\x09\x78\x04\x67\x45\x24\x54\x68\x83\xfb\x08\xcd\x13\xab\x9b\x5d\x56\x1c\x1d\xac\x28\xa1\x4a\x53\x35\xa1\xb8\xb0\x3b\x24\x09\x63\xb4\x82\xf6\xdf\xd7\xdb\xbe\x71\x93\xa4\x9e\xae\xae\x28\x2c\xe9\xfb\xbc\xbc\x1e\x4f\x6e\x56\xa5\xa1\x44\x48\xd6\xfe\x04\xaf\x79\x93\x9d\x59\x03\x3f\xca\x2a\x97\x0f\xd9\x31\x6b\x58\xee\xbc\x6d\xd3\x9d\x79\x8a\x50\xa7\x74\x38\xf1\xfa\x59\xe4\x5b\x46\x93\xf5\xb5\x59\xb0\x6a\xdc\xce\x23\x4f\x2b\x94\xad\x0d\x03\x91\x85\xc0\xb9\x3b\x66\x8a\x82\x66\xd8\x3c\x56\xac\x01\x1b\xbd\x68\xad\x93\xef\xe5\xd8\xf7\x4d\xb8\x8a\x71\x42\x89\x6b\x35\xa1\x06\x0a\x89\x08\x89\x43\xfb\x5e\x65\xd6\x18\x65\xa4\xe9\x10\x51\x22\xc2\x14\x3a\x44\xf4\xf7\xb2\xb5\x68\x6f\xc8\x14\xf1\x8f\xfb\x74\x58\x22\x94\xe6\xb5\xd7\x5e\xec\x3f\xb0\x43\xb7\x70\x27\x10\x84\x88\x68\xc8\x59\xad\xf9\x1c\x0e\xef\xc4\xde\x16\x18\xe6\x97\x42\x35\xed\xa4\xab\xfb\xcb\x7f\xf7\xb6\x20\xd2\xe8\x47\xa3\xe9\x79\xad\x8a\x76\x3c\x8c\x5e\x29\x00\xc1\x62\x55\x03\xb2\x41\xce\x82\x4f\x57\x8e\xce\x9d\x4c\x94\x4f\xb4\xb2\xc8\xa9\xfc\x40\x1a\xb4\xe1\xab\x50\x01\x25\x5e\x2f\x4b\xbe\x2a\xde\xb3\x06\xfa\x90\x7d\x48\x94\xe0\xf8\xa9\xac\xd9\x8a\x85\x08\xb6\x3a\x09\x52\x2f\xf6\x71\xb4\x18\xd1\xdb\xed\xd5\x71\xbd\x43\xea\x09\x88\x85\xf3\x53\xb5\x58\xf8\x63\x59\x21\xa8\x64\xdb\x3e\xad\xab\xb8\x87\xd4\x53\xba\xa8\x86\xe7\x4c\xbc\x7d\x2f\xdd\x5c\x48\x7d\x73\x81\xdd\x7e\xf6\x6d\x79\x08\x0e\xbb\xfd\x6c\xbb\x77\x8d\x89\x26\x4e\x44\xd5\x64\x53\x1f\x34\x7c\xc6\xd4\x4f\x34\xa3\x91\xde\xda\x8c\xd7\x54\x0f\x96\xfe\xd4\x4f\x13\x14\xc6\x42\xf7\x76\xb4\xef\xa5\x81\x47\xb0\xaa\xbf\xdd\x72\x50\x65\x6e\x76\x75\x2e\x54\x1a\x44\x91\x5d\x29\xb7\x70\x71\xbc\x96\xad\xa3\xf8\xb3\xa9\xd8\xbc\x2c\xe4\x28\xb0\x6b\x0f\x24\x14\x73\xc5\x07\xb4\x1e\x8d\x00\xd2\x8e\x29\xb8\xd3\x3c\xfc\x22\x9e\x90\x06\x22\x4d\xfd\x9e\x15\xb2\x2d\xf3\xfc\x99\x49\xf7\xf2\x02\xa9\x64\x62\x55\x2d\x98\x2e\xbd\x63\xba\xca\x43\x1b\x8a\xfd\xb1\x9e\x86\x3e\xc4\xdc\x96\xd8\x6a\x15\xe5\x4e\x66\x65\x38\x6c\xd3\x50\x7a\xa0\x31\xdb\x7a\x1d\xd4\x3c\x9e\xe3\xa7\x8c\x88\x16\x08\x67\xb8\xf1\xf6\x8b\x70\xa6\xa8\x95\x3e\x89\xe1\x0c\x4f\x49\xa2\x04\x89\xaf\x9e\x18\x87\x7c\x57\xe6\xa3\xd8\x53\x4a\x62\xaa\x3d\xbd\x4a\x04\x1e\xc2\x58\xde\x27\x6a\xc1\x27\x77\xee\x94\xa4\x21\xe2\x71\x2c\xd3\x75\x99\x0f\x8d\xcd\x94\x28\x8d\xb9\xad\xb5\x9c\x9d\x11\x83\x1a\x9e\x24\x0e\x78\x68\xd8\x83\xdb\x6d\xba\x0f\xba\xd8\xb4\x8f\xef\xdb\x93\xc5\x91\x87\x2e\x0b\x77\x52\xca\x23\x7d\x5d\x48\x63\xa2\xcb\xab\x2a\x78\x87\xaa\x71\x20\x57\x4b\x2f\x66\x7b\xb1\x00\x83\x15\xc7\x0e\x16\x92\x52\xa2\x85\xc9\x5f\x76\x9b\xfe\x5e\x91\xd2\x58\x87\x17\x9a\x12\x4b\x84\x86\x03\x80\x26\x44\x9b\xa1\x38\x64\x17\xd7\xaa\x2e\xab\x43\x37\xd7\x13\x02\x3d\xb1\xf3\xae\xc6\x76\x5c\xda\x3b\x5c\x70\xd3\x84\x6a\x72\xbe\xa6\x02\x70\xf2\xa5\x90\xa6\xd4\x0f\x7c\x97\x00\x52\xd9\x71\xc0\x9d\x6b\x3a\x31\x9a\xd8\x38\x4c\x3b\x41\x0c\xed\x77\x29\xb2\x41\x55\xca\xe8\x82\x2c\xd1\x01\x19\x76\xac\x60\x64\x26\xa7\x0c\xe4\x00\x9b\xb4\xbf\x07\x51\xa6\x3c\xd6\xf9\x4c\x1d\x68\x59\x77\x89\xe2\xc1\xb0\xe9\x97\xde\xf5\x7f\xb7\xf1\x9a\x54\x80\x66\x1f\x9b\x57\x2c\x2b\x9e\xe0\x98\x35\x3d\xdc\x52\x2a\x0d\x55\x8d\xde\xfb\xfe\x82\xae\x00\x52\x19\x6a\xd0\xae\x16\xa7\xce\xcb\x52\x7e\x59\x1b\x34\x3a\x1a\x08\x47\x5d\xff\xd9\x76\x35\x79\x98\xed\xc6\x74\xf5\xf0\x66\xbb\xd4\x68\x87\x7e\x32\x2f\x05\xae\xb9\x0b\x3f\xb2\x02\xd1\x12\x77\x42\x18\xb6\x9f\x70\x52\x3a\xdf\x59\x7d\x1a\x67\xa2\x99\x17\x0a\x9c\xc1\x86\x57\xe0\x15\x75\x24\x06\xc9\x41\xe6\xc5\x11\x37\x35\x14\x08\x54\x32\x72\xf8\xd7\x3e\x95\xa9\xed\xca\x35\x03\x35\x93\x72\x0f\xec\x3c\x84\x56\x7f\x69\x54\x33\x4f\x78\xe8\x6e\xb0\xa2\x28\xaf\x85\x40\x30\xe4\x4b\xe7\xae\x30\xdf\xe4\xef\x71\x3d\x94\x00\x28\x96\xb3\x85\xcb\x55\xd7\x44\x61\x1e\xaa\x9a\x0e\x9a\x31\x9f\x6b\xb1\x25\x93\xde\x84\xa2\xb1\x7a\x9c\xc3\x7b\x08\x7c\x0f\xed\x63\xac\xc3\x9e\xb2\x6e\x58\x10\x7a\x1a\xcb\x83\x22\x38\xab\xc5\x3a\xdc\x43\xdd\x7c\x87\xfc\x32\x55\xdd\x6e\x0f\xa2\x9e\x6f\x9c\x19\xc3\xa8\x5e\x0f\xe2\xe8\xa3\x37\x11\x24\x1c\x0b\x6a\x4c\x38\x4a\xe7\x2d\x27\xb5\x8d\x3f\x79\x95\xa1\xa7\x15\x6a\x90\xc1\xee\x0d\xce\x65\xd1\x79\xbc\x5d\xaf\xc8\xa3\x98\x7a\x33\x8a\x73\x5a\x50\x0f\xaa\x65\x73\x1a\x77\x4c\x3c\xac\x9c\x43\x2e\x9a\x76\x6a\x3e\xe6\xe5\xc7\x27\xd5\x5b\xc0\x08\xe1\xbc\xab\x90\x7e\x04\x98\x82\x5e\x31\x42\xb5\x88\x3f\x6a\xbd\xad\xfe\x02\xfe\xcb\x48\xe2\xfb\x26\xe4\xf8\x04\xcd\xc9\x08\xde\xcf\x9a\xef\xd9\x78\x2b\x67\x31\x4d\x68\xec\xc4\x2d\x7a\xac\xdc\xbd\x2e\x29\xc1\xd2\x52\xf3\xe0\x59\x0e\x68\x2c\x76\x45\x24\x63\xb3\x90\x51\x5f\x84\xd4\x4a\xd3\xd4\xc8\x11\x0b\x72\x0b\xe8\xb9\x16\x47\x8b\xa8\xdc\x21\x12\xc4\xcd\x2c\x1a\x26\x69\x3b\xcd\x4f\x59\x3b\xda\xda\xe5\x6d\x18\x74\xf0\xdd\xd9\xe3\x08\xe9\xe4\xeb\x2b\x47\x21\xb4\x01\x55\x0f\x30\x4a\x63\xd1\x13\x13\xb2\xb6\x5d\x47\x8d\x05\x2c\x09\xa8\x17\x3b\x48\xea\x16\x58\x8e\x3e\x85\xce\x10\xfc\xe3\xda\x13\x9d\x02\xd6\x7a\x0c\x5d\x52\xe3\x71\xaa\x90\x75\x68\xdd\xd8\xff\x3a\x1e\x8a\x51\xe5\x3a\xb0\x34\xd2\x11\x46\x74\x9f\x5a\x7b\x74\x7e\xfb\x05\x0c\xb8\xc8\x5e\x36\x4d\x24\x42\xf9\xb2\xa2\xb5\x63\x7a\xb1\x84\xae\x3e\xd1\xcd\x17\x16\x69\x8c\x46\x56\x3f\xb1\x9e\xf8\x57\x27\x02\x3c\xb8\x3a\xf7\x00\x85\x94\x1f\xb3\x42\xd3\x95\x7e\x9a\x87\xb2\x07\x10\x9d\x4e\xb0\x94\x10\x3d\xa4\x03\xe3\x24\x20\xe1\x00\x2f\xe0\x5a\x80\xc3\x80\x34\x01\xaa\x7b\x48\x2a\x13\xc2\x47\xb4\x71\xe3\xc4\x34\x6f\x5d\xf1\xf3\xdf\x8b\xf3\x32\xe9\x6b\xb4\xa6\x31\x92\xb5\xce\xf2\xc0\x46\x66\xd2\xe7\x48\x43\x90\x97\xcc\xee\x97\x23\xbd\x2e\x60\x92\x06\x5d\x62\xea\x3e\xa0\xc6\xa4\xa4\x88\x86\xaf\x34\xa9\x77\x01\xb7\x87\xf2\xa3\x78\xc9\x04\xe4\xb7\xe5\x7e\xd4\x19\x82\x88\x18\xaf\x6e\x67\x30\xf0\x26\x9b\xf2\xcf\xbf\xff\xcf\xe8\x94\x31\xd1\xe0\x4e\x56\xe5\x37\x63\x98\x75\x02\x4b\xc0\x40\xb8\xaa\x62\x43\xa0\xdb\xce\xe8\x5e\x42\x9c\x81\xd0\x25\x71\xed\x12\xfc\xf7\x64\x88\x80\x29\x9f\x32\x6b\xe8\xb0\xea\x1d\x5e\x2f\x83\xec\x06\xf7\x88\xc2\xc1\x81\xb4\x32\xb6\x7a\xd9\xb6\x31\x4d\x78\x6c\xa3\x21\x7f\xf5\x3d\xbf\x5e\xa6\xb9\x9f\x78\x98\x0c\x6e\x07\x61\x93\xa9\x0c\xaa\x7d\x39\x91\x4e\xe1\x81\xc7\x98\x19\x79\x1b\x1d\xa0\xd8\x57\x9a\xd4\xdc\x0d\x40\x6b\xe6\xf0\x30\x50\x92\x77\x59\xd5\xec\x4f\x18\x12\x68\x02\x0f\x63\x4f\x74\x88\x87\x2d\xbb\xd6\x5a\x44\xa6\x77\x8b\xfe\x40\x4f\xdd\x0e\x3a\x1e\x45\x34\x89\x7a\x1f\xa4\x7e\x2c\xab\x01\x69\x29\xf0\x88\xe8\x85\xe8\x08\xcd\xc1\xfa\xa8\x07\x56\xd7\xd0\x1c\xa4\xa9\x0d\x3a\xa8\xaa\x3c\xbb\xff\x37\x46\x20\xda\xf3\x48\x5d\x2a\x57\xbe\xb1\x73\x86\xce\x94\xf5\x57\x0e\xf6\x52\xc4\xe7\xf8\xf1\xbf\x95\xa5\xcc\xaf\xe2\xad\xa3\x79\x05\x4e\x52\xe8\xb1\x74\xb4\xa6\xf3\x72\xff\xbd\x29\x5f\x77\x0f\xa3\x57\x1b\x8b\x34\xd4\x2c\xcc\xba\x38\x79\xb0\xd9\x73\x1a\xa4\x68\x0e\xd8\xc9\xec\xc8\xe4\xbf\x10\x54\x04\x4e\xa5\x4f\xfb\x7e\xfc\x46\x63\x0b\x47\xc0\x00\xd3\x39\xf1\x39\x66\x56\xae\x85\xd6\xc0\xb4\x4b\x8b\x1b\x73\x49\x1c\x1b\x12\x5f\xdc\xf3\x7a\x1b\x03\x4f\x04\x57\x66\x4e\x1e\x5a\x3f\xf2\x3d\x6b\x6e\x07\x39\x64\xe8\x1b\xc4\x4f\x78\x2a\xe2\x44\xeb\x5b\xc3\x05\x4f\x77\xbf\x2c\xf0\x54\x4a\x8b\xef\x99\x43\x53\x6f\x34\x83\x83\x0b\x7c\x71\xe6\xf9\x48\x47\xf2\xf0\x7b\xaf\x6c\x94\x33\xc5\x64\x2f\x82\x36\xc3\x7c\xf6\x04\xc8\x8a\x73\x3f\x18\x44\x39\x70\xd5\xb6\x67\xe1\x44\x86\xa2\x93\x04\x5d\x54\x2c\x3b\x6a\x1b\xd2\x76\x50\x41\xe8\x3b\xac\xb5\xc6\xe6\x65\x7f\x82\x63\xcb\x01\x2e\x12\x81\xbb\x6e\x56\xbf\x00\xc8\xa7\x92\xb9\x41\x21\x98\x66\xab\xc0\x65\xb5\xf5\xa6\xb7\x20\xaa\x6b\x36\xa5\xee\x3f\x34\x69\x38\xf8\x21\x26\x86\x96\x2f\x0f\xc3\x8a\x6d\xe0\x10\x49\x0c\xa2\x5f\x1c\x21\xf8\xbf\xae\xac\x6a\xba\x42\x5b\xae\x62\x89\x4c\xd4\x9d\x14\x8b\x6e\x10\x1e\xd1\x54\x1e\xf3\xd5\xcb\xb7\xaf\xb2\xe7\xc2\x0f\x84\xc1\x29\xe4\x79\xbd\x2a\x8e\x55\xeb\x78\x95\xd7\xe6\x01\x2e\x39\x4c\x6a\x2b\x0e\x0e\x0f\x68\xc0\xa3\x81\x66\xeb\x86\x8d\x38\x29\x41\x84\x81\x8c\x48\x3f\x32\xfc\x23\x2b\xda\x91\x6e\xb9\x86\xb4\x0d\xd0\x5f\x0e\x44\x48\x42\xac\x4e\xad\xcc\xba\x5c\xc8\xf2\x6c\x9f\x2d\x64\x29\x46\x1d\xb5\x90\x45\x3b\x68\x31\x37\x35\xae\xdf\xfb\x34\x68\xd6\x5f\x14\xfa\x31\x16\x11\x79\x52\x23\x6b\x4f\xd0\x8e\x2f\x39\x60\x88\x03\x41\x58\x92\xea\x40\xc8\x47\x2f\xf7\xd3\x8e\x7a\x84\x9e\x23\xfb\xc9\x0e\x8a\x3b\x35\xe8\x7b\x3c\x9d\xa0\x51\x82\x09\xfe\x6f\xd9\x3b\x68\xfa\x48\xdb\x10\x7b\x98\x7a\x39\xd4\x60\xf6\xcd\xe9\x85\x40\xd0\x24\xc1\xd9\xe6\x02\x51\xee\x0c\xad\xc3\xdd\xa9\xa7\x19\x72\x13\xd7\x0a\x3a\x18\x5d\xac\xed\x28\x13\x09\xf7\xb0\x7e\xb6\x2e\x3b\x1a\x4f\x77\xa3\x09\x00\xc2\x11\xb5\x6b\x71\xbe\xd8\xd9\x24\xd2\x40\x5a\x16\x42\x6d\x9a\x62\xc4\xc3\x09\x67\x81\x60\x5e\x62\x2a\xf7\x77\xd7\x0b\x54\xef\x59\x6d\xf9\x91\x41\xb0\x58\x63\xf9\xdd\x3c\x1d\x71\x64\x40\xbb\xf8\x44\xba\x9e\xf3\x9c\x15\x5b\xa8\xc5\x15\x7a\x52\x66\xed\xde\x1c\xa7\xbe\xa3\x83\xb4\x42\x0c\xdd\xeb\x01\x5f\x62\xad\xcc\x0f\xc8\xf6\x65\x87\xe4\xe8\x3a\x28\x3f\x40\xd7\xf4\xfb\x72\xb6\xfd\x4a\x8b\x05\x84\x4a\x3d\x6b\x9f\x6b\x8b\x1f\x21\x42\xa5\x5b\x45\xa5\x4f\x42\x14\xa9\x38\xe3\xc4\x1f\x3e\x88\xf4\x21\xc2\x17\x5e\x63\xd8\x1f\x03\xf1\x3d\xa1\x04\x90\x41\xac\xa0\xaf\x25\xb0\x2a\xda\x8d\xa4\x7f\x03\x32\xe4\xb1\x55\x2c\xda\x57\xd7\xba\x19\x6d\xba\x32\x04\xa9\x1c\x9f\x88\x8e\xf9\x39\x1d\x57\x90\x51\x24\xf0\x4d\x19\xe1\x95\xdd\x25\x1f\xb1\x85\x83\x8c\xa8\x4e\x55\x31\x24\x55\x0b\xdc\x91\xa9\x87\xf5\x56\x56\xff\x60\x25\xca\x0d\xab\x1a\xdf\xb5\x33\x19\x59\x73\x96\x69\x7f\xd3\x65\x44\x24\x09\x95\x2b\x0f\x19\x4a\xe5\xda\x0e\x34\x8c\x3d\x0b\xff\xc9\x8a\xd6\xd7\x99\x80\x35\x48\x92\x08\x6a\xb8\xc6\x5a\x83\xba\x8f\x53\xfd\x2a\x5e\x2a\x89\x48\x90\xbf\x1e\x11\xef\xfd\x88\x83\xa4\x11\xc3\xda\x06\xc3\x00\x93\x97\x05\x4c\x56\xcc\x0c\xbe\x01\xa5\x7a\xc4\xae\x4d\x8e\x71\x53\x65\x7f\x22\x73\xe7\xe8\x73\xd3\x24\xc0\xf0\xcb\xb7\xe5\xcb\xd2\x4d\x31\x49\x93\x08\x91\x5a\xe8\x38\x35\xef\x3d\x6b\x42\xd2\x44\x7f\xbc\xcd\x76\x89\x85\xfd\xa6\xc6\x7f\xfd\xb8\xef\x44\xab\x40\xd2\x34\x41\x77\x7a\x51\x39\x6b\xd4\xb4\x24\x3e\xc7\x09\x2a\xc1\x16\x88\x6e\xaa\x52\x5e\xc7\xea\x2e\x20\xd3\x30\xf4\x3b\x32\xe8\x71\x63\x9a\x92\x4e\xaf\x78\x5e\x4c\xf1\xea\x99\xae\x8c\x4a\x7c\x7d\x59\xdd\x2f\x66\x9b\x4c\xc0\x48\x41\x79\x14\x39\x19\xd3\x1d\xc2\xd0\xfe\xae\x84\xea\x70\x18\x08\xd0\x69\x7c\xe3\x56\x33\xbe\x1d\xe9\x79\x83\x94\x3e\x47\x5c\x4f\x6b\xb0\x2f\xdf\xcf\xbb\x1e\xe8\x4d\x4a\x11\xe1\x72\xa2\x75\x4c\x0d\x63\xa6\x8b\xc1\x76\xc9\x7e\x29\x15\xc7\xb9\x26\x21\x67\xb7\xc3\xa5\x2c\xf3\x83\x7e\x27\x87\x7b\xb2\x65\x90\x40\x19\x2e\x0d\xc8\x30\xe9\xec\x91\x7b\x86\x4d\x90\xed\x78\xd7\xc2\xbf\x37\xce\xc4\x1b\x26\x7e\x5c\x93\x42\x07\xf7\x23\x93\xce\xd2\x90\x2a\x20\xb1\x85\x73\x9d\xb2\xcb\x84\xe5\x2e\x55\x14\xa0\xaa\xab\x91\x0a\xd6\x6b\xd3\x28\x27\x82\x94\x2d\xd4\x01\x98\x91\x21\x07\x33\x33\x77\xdd\x34\x05\x15\x43\x2f\xd8\x29\x6d\xae\x95\x45\x2d\x0d\xba\x83\x17\x12\x1c\x74\x79\x59\xbe\x5d\x2f\x0b\x56\x94\x45\x26\x58\xfe\x58\x56\x67\xd6\x27\x67\x06\xf0\xa2\x18\x11\x0d\xae\x3a\x13\xd8\xb9\xbf\x90\x83\x17\x53\x62\xe9\x23\xff\x7b\x65\x15\x74\x8f\x9a\x4c\xa3\x6c\xc1\x4b\x43\x44\xd9\xfe\xa7\xcc\x0a\x43\x2e\x36\xec\xd0\x9a\xbd\x58\x01\x7d\x2a\x57\x75\x8f\x11\x1d\x20\x08\x54\xca\x6c\x89\xe4\xf9\xd2\xc0\x21\x0c\x06\x8b\x2d\x04\x29\x60\x1e\xc3\x0e\xb4\xca\x3a\x24\x83\x7d\x78\x14\x65\x81\x90\xf8\x36\x39\xd4\x3e\xe1\x48\xb8\x7b\xf0\xdd\x20\x4c\x13\x2b\xac\xbf\xcf\x8c\x04\xf4\xac\x90\x46\x40\x7b\xb4\x4c\x42\x94\x68\x0e\x0b\x27\x59\x00\x55\x01\xd7\x09\x5e\x50\x00\x12\x11\x5f\x5a\xb2\x99\x75\x01\x0f\x9a\x2d\xc8\x3e\x3b\x21\x84\x18\xac\xfe\xb7\xf2\x7d\x6f\x57\x6c\xd3\x1a\x7b\x3e\xee\xe7\x96\x55\x4d\x0b\xf4\x4e\x3f\x41\xec\x8b\xd4\x4a\xb5\xe0\xda\x9e\x15\xc7\x5f\xcb\x06\x34\x33\xac\xbd\x5e\x4c\x53\xe8\xc9\xb8\xfe\xb8\x63\x48\xb5\xfd\x18\x45\xa2\xcc\xb2\xc8\xb3\x02\x7a\x3e\x08\xc4\xc2\x03\x07\x01\x09\x0e\x75\x79\x06\xc4\xc6\xdb\x66\xa5\xd0\x17\x42\xaa\x41\xa6\xe0\xf9\x3a\x4d\xbe\x0a\x40\x7d\x1d\xb3\x7c\x2a\x8f\x9b\x32\xcf\xc4\xed\x01\x44\x7b\x31\x39\x5d\xfe\x06\x54\x71\xa9\xc1\xbe\x4d\xc5\x3e\x25\xd2\x06\x48\x42\xcd\x9e\x89\xe5\x50\x07\x38\x5f\xb2\x0a\x0e\xb5\xe8\x4a\xc9\x20\x21\x3a\xce\x90\xd5\x46\xba\x4d\x47\x1b\xb4\xd4\xca\xe8\x64\x4a\xcb\x45\xdd\x80\x55\x03\xf4\x26\xa4\x11\x21\x71\x3f\x14\x51\x3f\x63\x36\x7d\xcc\xd6\x05\x90\x8a\x84\x6b\x4b\x1b\x1a\xf6\x37\x6a\x40\x21\x95\x92\x68\x59\xd7\x6b\xde\x1c\xea\xa6\x0b\x80\x60\x68\x56\xa1\xe9\xd7\xb0\xdc\x64\x09\xeb\x81\x0f\x0b\x2c\x62\x21\xeb\x84\x25\x03\xf7\x7b\x4c\xf1\xd3\x23\x12\x1d\xaa\xb7\xc1\x48\x63\x8c\x62\xb2\x1c\x7e\x66\xae\x5e\xdc\x1e\xc8\x43\x8d\xcc\x69\x8d\xfe\x52\x29\xf7\x73\x94\x5a\xc9\xf9\xa7\x52\xbc\x5d\x2f\x87\x3a\x3b\xdf\x0f\xcf\xd1\xd7\xe1\x44\xa3\x68\x75\xe1\x5d\x7f\x2a\xf0\x58\xf8\xc6\x7a\x44\xcc\xea\x02\x25\xdd\x2b\xf6\x91\x15\xc7\xfa\x4b\x77\x0d\x38\x4d\x31\x5f\xc1\xaf\x59\x2e\x5f\xab\x7b\x10\xf8\xf0\x1e\x44\x10\x98\xca\x4c\xac\x5a\x45\x13\x6f\x48\x61\x05\x20\x22\x8e\x40\x68\x9d\x8b\x43\x79\x80\xa1\x85\x07\x22\x86\xc4\x59\xe1\x4f\xe5\x31\x13\x5f\x23\x57\x40\x26\x21\x0a\x55\x16\xf0\xa3\x7b\xb9\x40\x68\xa2\x15\x23\x75\x6d\xc3\xc1\x77\x2d\x89\x17\xf9\x36\xa6\x9f\x15\x4d\xeb\xf6\xda\x14\xcc\xe0\x71\x20\x21\x48\xef\xc6\xcb\xf2\x6d\xc9\xaa\x02\x81\x67\xd3\x8b\x04\x30\x5d\x77\xb5\x99\xad\x7b\xc9\x30\x00\x45\x7c\x0f\x21\x7e\x72\x71\xad\x9b\xf2\x3c\xc5\x75\x79\xbf\xe6\xab\x58\x21\x07\x35\x93\xd2\x0a\xd2\x8d\xdf\xc0\x70\x0a\x2b\x29\xf1\x61\x01\xab\xb9\x26\x0b\xa5\x40\x49\x40\xce\x16\xa4\x5a\xfe\xe5\x65\xfd\xc3\xdc\xa4\xf2\x62\x12\x0a\xe7\x5d\x44\xe8\xda\xf4\xda\xd0\x12\x51\x0f\xd9\xfb\xf4\xb2\xa0\xfc\xc0\x43\xdb\xb3\x35\x0b\xa6\x93\xea\xca\x0f\x09\x4e\x76\x09\x82\xdd\x40\x7e\x12\x66\x55\xbe\xe2\x02\xe5\xa2\xaf\xb2\x3e\x95\x4d\x5f\x7e\x1c\x54\x40\x53\x2c\x14\xe9\x53\xde\xff\xdb\x8f\xff\x6f\x74\xa9\x80\xea\x70\x2e\x6a\xb2\x48\x4b\xeb\x0d\x2a\x24\x9a\x80\xa1\x86\xc6\x70\x6f\x3e\x02\x58\x8c\xfe\xf0\x14\x61\xcc\xf1\x4a\xff\xbd\xc2\x75\xc0\x98\xa5\x22\x2f\x08\x0d\xec\xa0\xb5\x6a\xeb\xf6\x91\x07\x4a\xb5\xa0\x22\xc2\x74\x58\xa5\x3c\xb7\x3e\x1c\x7e\xed\xc0\x1d\x1f\xa7\x1a\x52\x76\x85\xba\x7e\xcc\xb3\x8b\x6b\x48\x98\x0d\xc6\xcc\x5d\xd6\xbc\x5d\x8a\x31\x4b\xd8\x9a\x6e\x23\x7b\x48\x91\x20\xb4\xb5\x68\xf3\x5b\x03\x38\x86\xa7\x5f\x3e\x09\x23\xcf\xeb\x28\x25\x33\x81\x24\x21\x78\x80\xe9\x11\x87\x90\xd2\xce\x5c\xb3\x02\xe6\xc3\x8f\x13\x73\x85\xe2\xc1\x08\x66\xc7\xba\xf1\xa6\x3c\x88\xe1\xd4\x55\xb1\x60\x9e\x2e\x02\x56\x4d\x18\x8e\x6e\x99\xb2\x28\xee\x83\xc0\xdb\xe7\x7b\x2c\x2b\x47\x31\x07\x8a\x02\x45\x6b\x7b\xac\x58\x34\x41\x68\xa0\x92\x84\x62\x2a\xed\xcc\xde\x60\xd5\x6c\x7b\xc4\x37\xf7\x11\x08\x95\xfa\xb1\x25\x16\x58\x57\xd9\x31\x2b\x58\xae\x45\x2d\xed\x95\x53\x42\x30\x68\xb3\x38\x01\x54\xf5\x0f\x56\x0c\x6a\x45\x54\x1a\x13\x1c\x12\x5b\x60\xf9\x12\xf7\x8d\x61\x33\x8d\x38\xb7\xa1\x94\x6f\x79\xc9\x59\x3e\x4c\xbd\x2b\x64\x45\xb4\x5e\xab\x28\x25\x54\xb8\xd1\xe8\x92\xbf\xe1\x8b\x66\x94\xc6\x0e\x9d\xfb\x68\x69\x64\x3e\x59\x78\xdd\x13\x72\xa6\x67\x77\x6b\x6e\xfe\x15\xd4\xc6\x1e\x22\x34\x2b\xe9\x66\xb5\x58\x6f\x76\xa6\xa2\x11\x2a\x5d\xc6\x74\x17\xd7\x31\x07\x09\xcf\x4f\xdb\xd1\xf4\xfb\x7a\xbb\xda\x2f\x7f\xb3\xcf\x27\x12\x1f\x97\x4a\x04\x87\xb0\xfc\x80\x37\x7f\xa8\xc1\x92\x19\x83\x12\x69\x84\x20\x8b\xb7\x9b\xe8\x09\x3c\x80\x92\xbe\x51\x78\x6f\x2d\xc3\x17\xf8\xd9\x2c\x2b\x76\x18\x3a\x3b\x0a\xe2\x08\x51\xa2\x5b\x28\x2c\xff\x87\x02\x29\x2c\x44\xe8\xf9\x36\x13\xe2\x3a\xd8\xac\x15\x80\xc2\x02\x01\x0e\xcd\xec\xc8\xb2\xa2\xc6\x42\xbd\x4f\x96\x30\xc5\x63\xbc\x37\x4c\x77\x99\xac\xe0\xd7\x65\x9d\xfd\x97\xa2\x3c\x2f\x08\x91\x49\xee\x9c\x15\x7d\x58\xcc\x60\xc4\x2a\xcf\x23\x7a\x5f\xd7\x6e\xc7\x3f\x46\xa7\x10\x5a\x45\x88\x37\x37\x51\x5f\xf9\xf9\xd3\x60\x98\xf2\x02\x4f\xa2\x1d\x02\xff\xbd\xb2\xbc\x7e\x29\x17\x3d\xd9\xa0\xde\x5a\xa4\xbc\x20\x50\x18\xd2\x58\x3d\x3f\x2c\x7f\xab\x41\xd3\xf6\x75\x35\xef\x16\x4e\xa7\xbc\x90\xfa\x58\xa1\xa6\xe7\xdd\x47\x3b\x7b\xcb\x77\xa8\xa0\xcb\x5f\x8f\x1e\x38\x14\x21\xf2\x2c\x9e\x32\xa1\xd7\xaa\x5e\x91\x91\xf2\x42\x99\x60\xb1\xea\xe2\xdb\xbe\x37\x4d\x94\x17\x51\x85\x1b\x8d\xba\x22\x5a\xf9\x3f\x20\x06\x40\x2d\xe5\x45\x09\xc5\xfa\x9a\x5f\x57\x4f\x4f\xb3\x6f\xcb\xc3\xea\x65\xb1\x5d\xce\x76\xcb\x1e\x31\x85\xf2\xa2\x34\xc5\xf9\xc1\xb3\xbb\x62\x68\xd3\x83\x04\xca\xa2\xe7\x9e\xb3\xc2\x62\xbe\x3a\x45\xf5\x7e\x81\x60\xcf\x60\x1c\x9d\x24\xe2\xc8\xbb\xb0\xbb\xd6\xa7\xac\xdb\xd3\x95\x47\x58\x68\x9d\x55\xc7\x89\xdb\xee\x93\x9e\x36\xa2\x1d\xbf\xca\xeb\xee\xc1\x35\x32\x82\x6b\xe7\xaf\x19\x7c\xcc\xef\x11\x8e\xae\x97\x11\xb0\x2a\xf3\x9c\x35\x50\x61\xce\x69\x34\x86\x12\x13\xc8\x73\x02\x27\x2b\xf5\x02\xad\x57\x3d\xee\x17\x71\xad\xaf\x3a\x7b\xde\xd9\xbb\x48\x58\x8c\xb0\x90\x8f\xb2\x7a\x73\xb5\x39\xca\x4b\x94\xc0\x4d\xad\xbe\x72\xb3\x74\xb9\x14\xbe\x5d\xc4\x86\xe7\x4e\x09\x60\xb0\x8b\xd5\x52\xd9\x93\x30\xdf\x07\xc3\xd6\x89\x0f\x7f\xf8\xc8\xdc\x70\xe0\x3e\x45\xdc\x8c\x2a\xab\x8f\xd6\x10\xeb\x45\xee\xbe\x28\x2a\x54\x1e\xa7\x5a\x60\xe6\xb1\x2c\x87\xc3\x84\x83\x1f\x99\x30\xfc\xb7\x0a\xe0\xad\xd6\x45\x0a\x5a\x81\x70\x7e\x1b\xcd\x2c\x49\x54\xd0\xa3\x49\x9b\xe5\xf9\xb8\x03\x44\xa9\xd7\x0f\xd8\xdb\x48\xfd\xe0\xa9\xc1\x4f\x93\xf8\x2f\x79\xcb\x4d\xf6\x50\x79\x10\xfa\x9e\x89\xa3\x62\x41\x00\xa2\x33\x06\xcb\x9a\xf2\x80\xa4\x18\x7e\x99\xcd\x17\x0f\x83\x89\x02\x54\x46\x5d\x09\xcc\xcd\xa0\x8d\x6b\xd7\x0c\xda\xe3\xff\x66\xa9\x55\x5a\xbb\x6d\x71\x13\xb9\x7b\xe5\x8a\x26\xc2\xc4\x11\x55\xd6\x1a\x52\x8d\xcd\x0c\x29\xdf\x63\x29\x3e\xee\xb5\x86\x6a\xd9\x2e\x56\x30\xb4\x14\x95\xef\xd3\xd0\xa7\x1d\x6f\xc3\x33\x2b\x6e\x86\xb6\xc1\xed\x3a\xff\xfc\x0c\x72\xa0\x7c\x3f\x21\x61\xec\xf2\xa6\xae\xc0\x4c\xf9\x3e\x68\x56\x87\xba\x53\x3a\xe9\x6c\xaf\xe1\xec\xf3\x83\x38\x48\xfc\x5e\x91\x73\x85\x35\xed\x23\x22\xb1\x64\x92\xb7\x43\xf9\x81\x92\x80\x21\xea\x52\x66\xea\x36\xff\x84\xe2\x4f\xf9\xa1\x17\xe3\x64\xda\x84\x0f\x06\x50\x69\x6f\x35\x0c\x62\x8c\x52\x8d\xa9\x81\x0f\x3f\x96\xab\x9d\xeb\x24\x22\xa1\xa3\x4d\x0c\x73\x12\x9b\xaa\xbc\xb4\x9b\x28\xd4\x93\x8e\xb6\xf2\x23\x2a\xd0\xf1\x68\xdc\x8a\xb9\x2a\x16\x2e\x5d\xa1\x7c\x02\x34\x30\xd1\xa1\x23\x3b\x83\x60\x95\x2c\x7a\xd5\x57\x83\xc5\xdd\x8f\x7d\x19\x6a\x1e\x93\x1a\xee\x60\x1a\xb6\x0f\x09\x51\x40\x40\x63\x8c\x6d\xd0\x75\xb9\xff\xde\x57\x3f\x55\x7e\x1c\xeb\xe4\x3f\xe6\x74\xee\x8c\xf3\xbb\x0f\x1c\x73\x2a\x3d\xa7\x81\x52\xf5\xa7\xc1\x34\x05\xbd\xf2\x63\x19\x63\x34\x46\x65\xaa\x39\x21\x40\xb3\x5b\x3a\x7d\x1a\x69\x8e\xb6\xd9\x6a\xfb\xb0\x5d\x6f\x0e\xbb\xef\xb3\xad\x5d\xed\xfd\xc4\xd3\xf7\x26\x2c\x0d\x99\x09\x67\xe2\xfa\x34\x1e\xb8\x89\xcf\x89\x23\x6e\xe8\x59\xee\xca\x4f\x22\x29\x35\x74\xf2\x58\xc1\x91\x35\x30\x3c\x7e\x74\xbb\x49\x0c\xd2\xb2\xad\x5c\x58\xdf\x18\xee\xed\x9a\x7e\x1a\xa4\x16\x56\xfc\xad\x2a\xaf\x17\xb4\xae\xeb\xa6\x13\x75\x32\xfd\x18\x8b\xbc\x8e\x06\x7a\x96\xe7\xb6\x2c\xc0\x00\xc5\x1c\x43\xcd\xf0\x26\x18\x68\x92\xec\xc7\xdd\x6c\xb0\x8d\xfa\x0c\x62\xf4\xa0\x71\x70\xce\xb6\xbb\xc3\x7e\x7d\xf8\xb6\x7a\xdc\xdb\x76\x1e\x72\xcc\xce\x8e\xc6\xb4\x90\x5a\x49\xcb\xd6\xba\x22\xab\xa0\x95\x9d\x1c\xa7\x07\x95\x0f\x8c\x45\x26\x81\xdc\x2f\x5d\xfd\x91\x35\xa7\x07\x10\x1d\x90\xe6\x7e\x5a\x29\x8f\x6a\x56\xf4\x1f\xb3\xe7\xc1\x8d\xab\x20\x4c\x2c\x5d\x3a\x88\xb7\xfa\x7a\xc6\x7b\x19\xae\x8a\xbe\x0a\xa4\x2e\xb2\xb4\xb2\x64\x48\x7c\x52\x3d\x7e\x42\x22\xa7\x02\x2f\x0c\x08\xe9\x95\x49\x8c\xe2\xbd\x2a\xf0\x9c\x48\x4b\x21\x57\x45\xeb\xf1\x65\xef\x59\xcd\xa6\x36\x20\x73\x84\x0f\x52\xc5\x16\x25\xf7\x0e\xf9\x66\xb6\xfe\x5b\x15\x67\x2a\x08\x42\x1f\xab\x61\xb1\x3c\xcb\x25\xd3\x55\x10\x30\x65\xa5\xff\x83\xdf\x3f\xb9\x6a\x18\x0a\x04\xdc\xed\x20\xbb\x5d\xaf\xf6\xc8\x90\xf2\x48\x3b\xcf\xac\x39\x3d\xb0\x86\x1d\xde\x53\xdb\x16\x05\x1c\x43\x72\x2f\xaf\xfb\x5d\x97\x67\x51\x41\x44\x52\x2c\x2e\xc0\x50\xdd\x43\x56\xe3\x94\x01\xb9\x6a\xe0\xec\xa8\x44\x4d\x57\x4a\x24\xfa\x51\x1a\xee\x3e\xed\x9a\xab\x80\xc6\xa1\x34\x6a\xf0\x0e\xee\xde\x5f\x8e\x82\x44\x51\xf4\xdd\x9b\x72\xd7\xb1\x5d\xbb\x36\x5d\x86\x30\x62\x7f\x03\x69\x4c\xb2\x05\xbb\x0c\x99\x3d\x46\xef\x25\x8d\x79\x1c\xd8\xe4\x19\x22\xc4\xf5\x86\x36\xbc\xc5\x14\x7c\x84\x23\x35\x27\x93\xac\x99\x44\x41\xab\x80\xf9\x11\xf2\x1a\x41\x25\x92\xc0\x1b\x12\xe4\xa8\x80\xc5\x9a\xbe\xf0\x92\xb3\x46\x95\xd5\x59\x8b\xce\x0d\xe0\xf2\x2a\xe0\x5e\x88\x6c\x77\x4f\xb3\xb9\xfb\x29\x08\x70\x33\x58\xb0\xe2\x77\xd6\x33\x17\x03\xce\x85\x32\xcc\x8a\x47\xa8\x8c\x92\xd3\x9f\x23\x6a\x09\x15\x70\x11\x06\xa6\xb8\x7a\xb5\x5f\xdb\x83\x85\xaf\xeb\x1c\x26\x45\x17\xef\x02\x9c\x2a\x10\x29\x41\x58\xd5\x39\x2b\x9a\x59\x21\xfb\xa5\x31\xa3\x77\x2a\x04\x17\xc2\xd2\xab\xe3\x6c\x7e\xac\xca\xb3\xfe\x73\x28\x63\x3f\xba\x02\xc4\x88\xa8\x1b\x44\x7b\xba\x45\x31\x00\x4f\x2b\xf5\x9c\x31\x0c\xb9\x19\xaa\x3b\x0e\x6f\x01\xa8\x96\x9c\xbd\x54\xf0\xfe\xdb\x76\xd3\xd7\x20\x56\x01\x30\x15\x81\x83\x3d\x2c\x58\x47\x37\xfe\x95\x53\xab\x02\x80\x84\x9b\x10\x0d\xda\xb1\xf5\xfc\x36\x40\xec\x4e\x7b\x70\x81\xf2\x34\x82\x0f\x27\x8c\x53\x72\x1a\x52\x2b\xa8\x40\x91\x04\x74\xa8\x2b\x93\x87\x8a\x75\x63\x4a\xa9\x20\xf0\x0d\x59\x25\xeb\x7e\x64\x98\xb2\x3a\x78\x3f\xbf\xd9\xf5\xd3\xb4\x85\x9e\x60\xa9\xe1\x04\x59\x5f\xa0\x98\x67\xb2\x9e\xdf\xe6\x99\x94\x9f\x00\xaf\x55\xe8\x27\x0c\xa3\xcc\xdf\x7f\xf9\xbe\xf8\xbc\x7c\x5a\x85\xbe\x84\x60\x8c\x45\x7e\x2c\xab\x45\x5e\x5e\xa5\x8d\xbc\xec\x81\x0d\x39\x1e\x55\x18\x50\x3f\xd0\x2e\xb6\xca\xe1\x67\x6f\x00\x87\x41\x6a\x1c\xa1\x0b\xab\xc0\x16\xd5\x0d\x1e\x26\x8c\x62\xc4\x31\x65\xf5\xcb\xf5\xbc\x1d\x88\x4c\xa8\x30\xa4\x02\x53\x3a\x07\x6d\x38\xe3\xa5\xbf\xe0\x76\x50\x61\x28\x53\xb4\xca\xfe\x53\x66\xc5\xac\xd6\x56\x9f\x69\x8a\x18\xc7\x58\xc1\xe6\xb7\x6f\x83\x1b\x88\x04\x20\x75\x0b\x42\xb7\xb4\xc6\x8d\xca\x33\xd1\x6c\xa1\x2e\xf3\x6b\x17\x72\x57\x21\xf1\x15\xa2\x17\x1a\x1d\xe6\x97\x00\x67\x90\x8b\x53\xeb\x21\xba\x2e\xa9\xef\x99\x8d\xaf\xbd\xd9\x6e\xf4\xd8\x1d\x2a\x24\x82\x01\x38\xa6\x18\x24\x0f\x5f\x3d\xd4\x6b\xd5\x17\xe2\xb0\x5d\xa5\x26\xd7\xc3\xe8\xc6\x04\xa6\xf2\x2f\x37\x94\x90\x7a\x29\x2a\xcb\xf3\xeb\x0d\xa9\x39\xa7\x5f\x1a\x0d\x19\xed\x54\x55\x17\xac\x90\xb8\xc7\x8f\x99\x86\x26\x2a\x8f\x54\x48\x39\xc1\x50\x22\x4e\xb5\x4c\xf3\xce\xed\x72\x56\x9f\xb2\xe2\xd8\x07\x13\xa8\x30\x8d\x05\x8e\xe8\x76\xf2\x9b\xa8\x8a\x6d\x12\x51\x84\xce\x1a\x06\xfe\x57\xc5\x09\xaa\xac\xe9\xad\xba\xa1\x00\x42\x2c\x03\xf8\xb3\x51\x42\xfd\xc2\xf9\x0b\x25\xe5\x9e\x11\xb3\xc2\xc2\xe6\x9a\xdd\x25\x1f\x4c\x4f\xf0\x13\xac\x38\x5b\xd6\xa2\xe4\xac\x6a\xb7\xc1\xc1\xe0\x00\xc9\x31\xaf\x06\x86\x35\x4f\xeb\xea\xe8\x28\x57\x47\x51\xa3\x42\x50\x51\x68\x24\xbb\xf1\xf8\xef\x65\x2e\xa1\x6a\xcd\x6b\xb9\xd6\x67\x5c\x7c\xbe\x47\x85\x8a\x86\x98\x7e\x41\x62\xc3\xe5\xc3\x61\xf6\xf0\x6c\x21\x7d\x2a\x54\x8c\x23\x2d\x0c\x1b\x9a\x3a\xa1\x52\xd4\xaa\xee\x2d\x7f\x6a\x1a\x38\x3b\xc1\x0c\x58\x70\x6c\xcb\x44\x5e\x2c\x50\x78\x12\x53\x6c\xab\xc5\xda\x11\x52\xdb\xf6\x24\x40\x6c\xc3\x9e\xed\xd9\xde\xda\x10\x51\xe0\xc7\xb8\x78\xb4\x3e\xdf\x1d\x50\x51\x45\x41\x12\x22\x2c\xee\x3f\x92\xe5\xd0\x0e\x03\x79\x84\xfa\x56\xf7\x2c\x8a\x28\x94\x4c\x59\x1b\x6a\xd9\x9c\xf6\x1f\x00\xc3\xe0\x4d\x14\x4a\x89\x26\x02\x56\x92\xe3\x20\xda\x3b\xbf\xd7\x74\x89\x78\x88\x36\xe5\xf2\xb7\xfd\x61\xb1\x7e\xde\xcc\x5e\x7e\x3f\xec\x7f\xac\x5d\xb3\x62\x48\x00\xff\x08\x20\x39\x13\x6f\x36\x12\xd9\x9f\x18\xc9\xd0\xa7\x8a\x48\xa4\x70\xdf\x7c\x5a\xbe\x4e\x7f\x99\x88\xf0\x88\x98\xf9\xfc\x5c\xca\x6b\x0e\xf3\xdb\x8b\xf5\xaa\xee\xce\x26\xf4\x02\x5f\x94\x12\xd0\x46\xfd\xc7\xa8\x5d\xa5\x48\x19\xb3\x99\xed\xbf\x8f\xde\x61\x92\x42\x64\xf9\x52\x75\xa4\x61\xda\xb5\x8d\xd2\x88\x60\x72\xe7\xa9\x3c\x3e\x67\x9f\x8d\xa7\x28\x15\xa0\xcc\xf8\xdf\x35\xed\x64\x99\x5c\x1d\x22\xc6\x18\xa0\x92\x77\x7d\xc6\x87\x1a\x5e\x8a\x33\x0f\x4c\xa2\x7e\xa5\x51\xcc\xf7\xd0\x0a\x15\x09\xe9\xe1\x39\xac\x54\x78\xd6\xc0\xf9\x90\x61\x55\x8d\xe9\x01\x49\xe4\x75\x4c\x40\xc6\x06\xb3\x0c\x9f\xc3\x4b\xaa\x28\xf1\x92\x9e\x0c\x18\xba\x3c\x13\xf9\x28\x15\xa9\x54\xeb\x1d\xea\xaa\xdf\xfe\x94\x8d\x54\x9a\x24\x56\x05\xbb\x75\xf9\x3e\x71\xe0\x23\xc5\xc0\x51\x76\xa1\x01\xf9\x03\x59\xe0\xf9\xed\xe5\x7a\xee\x17\x55\x25\xff\x8e\x8c\xf3\x4a\xbc\x94\x71\xf4\xaa\x5e\x5f\x1e\x56\x2f\xdf\x9c\x53\xfc\x3c\x33\xb1\x6c\x45\xfc\x84\xa0\x75\xa7\xa5\xb7\x58\x7d\x5a\x5f\x3f\xf9\x4a\xc4\x17\x0a\xad\x7d\xae\x4d\xcc\x83\x13\x5a\x39\xa8\xb2\x3a\x08\x4c\xf9\x1d\xde\xcb\x8e\x0a\x47\x91\xc0\x27\x58\x17\x8d\x5d\xfb\x49\x08\x45\x82\x80\x0a\x53\xc3\xa7\xb2\xea\xdc\xc3\x10\x8c\x96\xf1\xeb\x17\x81\x4b\x12\x70\x1a\x69\x16\x81\xc6\x9d\x58\x85\x5a\xae\x01\xd1\x17\x23\x72\x51\x45\x42\x4f\x20\xc0\xe5\x7f\x67\x8b\x5f\x36\xeb\xfd\x61\xf1\xbd\xd3\x5a\x51\x24\x24\x09\xda\x36\xad\x4d\x79\x67\x45\x0d\x4c\xd1\x29\x00\xba\x22\x61\x0c\x52\xda\x7a\x87\x72\x44\x99\xa5\x48\x08\x1e\xb5\xfc\x1e\x05\xe4\xcf\xec\x67\x97\x9a\x52\x24\x8a\x22\x54\x74\x45\x5e\x89\xb2\x9c\x56\x54\x50\x24\x4a\x62\xe4\x5c\x7f\xbe\xb5\x7b\xf0\x5f\x01\xdc\x14\x89\x52\x0f\x6d\x9a\x67\xf6\xf3\x60\x59\xb3\xdd\x25\x85\xe7\x0b\xb7\xf3\x68\x70\xd9\x18\xc6\xa5\xe5\x38\xdc\x01\x41\xa4\xf4\x84\xfe\xd6\xfa\xdb\x5f\x40\x88\x15\x21\x5e\x90\x86\xfd\xca\xe6\x7e\x24\x86\x90\x84\x50\x8b\x35\x99\xb3\x3f\x9f\xa1\x39\x95\xd2\x8e\xe4\x6e\xaf\x22\x04\x04\xe6\xb3\xcc\x94\xfd\x15\x47\xd8\x83\x83\x33\x28\x12\xa7\x8c\x47\x1d\x1c\x65\xad\x10\x69\x32\xfd\xf2\xe2\x14\xe2\xd8\x51\xe3\xb4\xf6\x62\x27\x74\x71\x97\x4b\x53\x84\x06\x5e\x94\xd8\xb2\x8f\xe2\x9d\x39\x0b\x7b\xf8\x5d\x29\x21\x88\x42\xe9\x17\x21\xda\xbb\xa3\x54\x73\x1a\xd7\x1d\x47\xaa\xe3\x9a\x1c\x9d\x45\xfa\x31\xf4\x59\xa4\x6d\xf6\xd6\x9e\x2a\x49\x03\xac\xe8\x38\xb1\xfa\xf4\x77\x68\x0b\x15\x49\xa4\xd6\x2e\x31\xdc\x76\xeb\x6a\xc2\x8d\x21\xa9\xaf\xd3\x47\x3d\xa7\xdb\x27\xf6\x9a\xa9\x12\x68\xcb\x7c\x03\x0b\x38\x7e\xc8\x2a\x40\xf6\x7a\xeb\x2a\x10\x46\x34\x43\x2c\x22\x70\xe0\x10\xb9\xdf\x13\x4d\x4a\x89\x73\xfc\x78\xad\x3e\xd5\x2b\xf9\xe7\x70\xd7\x1b\x3e\x03\x4b\x39\x15\x7d\x96\x9e\x6b\xd5\xbd\x5d\x26\x12\xdc\xaa\x85\xe6\xb2\x1a\x6e\x61\x84\xfb\x12\xb1\x9d\xdf\x56\xfb\xef\xaf\xf3\xc3\xd3\xea\xe5\x17\x7b\x20\x97\x89\x19\x08\xcd\x4b\x29\x59\x8e\x20\xc0\xd7\xed\xd3\x60\x9f\x27\xc2\xf7\xb5\xa7\xff\x51\x1e\x84\x23\x54\x50\x44\xc4\x14\xb9\x76\x9e\xaf\x79\x93\x5d\x72\x58\x56\x55\x59\xd5\x43\x70\x87\x22\x02\x12\x64\x16\x5c\xbc\xec\x0f\xfd\x35\x9f\x08\x05\xe8\xba\x62\x0d\x55\xdd\x0f\xde\x11\xe5\x11\x4c\x9c\x9d\x6f\xbf\xa2\xa2\xae\xfb\x39\x41\x28\xf7\xc1\x14\x9a\x3b\x56\xd3\xe1\xf0\x56\x54\x50\xa7\x58\xab\x01\xc1\x7f\xa7\x78\x4c\x11\xa5\x88\xc7\x4c\xe8\xd1\xf8\x81\x5f\x9a\xea\xb1\x1f\xf1\xd8\xc8\xf2\xec\xb3\x26\xef\x28\x0f\x3e\x25\x96\x57\xb1\x1f\x87\xb8\x45\xf7\x88\x36\xec\x58\x89\x03\xdf\xc3\x6a\xc6\xd5\x62\x7d\x40\x30\xe3\xa0\x3e\x5e\xc5\x41\x44\x11\xd3\xf0\xf0\xc7\xfa\x05\x34\x6b\x9e\x6d\x89\x23\xab\x3e\x8d\xd9\xfe\x71\x6d\x90\x9d\xcc\x71\x00\x01\x8a\xba\xe1\x5e\xbd\x63\x39\x1c\x34\x61\xb4\x03\x45\x0e\xe7\x63\x1c\xd2\x04\xcd\x4b\x28\xe4\x6a\xb1\xee\xad\x38\x71\xa8\x08\x02\xdb\x0c\x79\x0d\x96\x8b\x4c\xbe\xd7\x38\xe2\xb1\xe2\x66\xbd\x99\x29\x95\xe5\x99\x8d\xc7\x4e\x5b\x4c\x31\x89\xb4\x65\x59\x43\x9e\xeb\x0f\xb1\x12\xa5\xbd\x2e\x49\x83\xb4\x2f\x71\x59\xc9\xc7\xb2\x9a\x89\xff\x5e\xb3\x0a\x4c\xd9\xe6\x44\xde\xc2\x1e\xac\x02\x8c\x89\xae\x9a\x2b\x77\x4f\x12\x13\xc0\x6c\x68\xa9\x14\x54\x9f\xa9\xee\xdb\xbe\x09\xe7\xac\xa3\xf0\x5d\x59\xa8\xa7\x8a\x69\xe4\x63\xd0\x91\x09\x51\x5d\x8d\xe2\xcc\xb4\x19\x13\xd3\x08\x10\x91\x7e\xbe\xcd\xb0\x48\xae\x97\x1f\x57\x31\x4d\x04\xa6\x72\x64\x65\xe1\x22\x2a\x4e\x02\x5d\x87\x82\xfb\xb9\xa1\x09\xb2\x84\x8c\xd3\xf7\x99\x44\x0c\xd9\x23\x8c\xa6\xe2\x6c\xff\xec\x2a\xef\x4c\x8f\x94\x13\xd6\x15\x7a\xf5\xb8\x87\x8c\x56\xd7\xfd\x6d\xb3\x48\x69\x98\xf6\xad\xf5\xb8\xb3\xa2\x57\x9d\x69\x7a\xf0\x48\xfb\xfe\x73\xa4\xd8\x14\xa3\xb7\x98\x8c\xce\xc7\x65\x80\xcc\xfa\x59\x3d\xab\x78\xd6\x54\xec\x2e\x92\x1b\x8b\xc0\xc3\xb8\xec\xf3\xf6\x13\xd9\x43\xdb\x2f\x94\x5c\x9a\x18\xc2\xd7\x01\xa3\x58\x0a\x89\xf0\x4e\x2c\x6b\xfb\x63\xb1\xae\x7a\x63\x1a\xc2\x08\xa1\x88\xbb\xf5\xe6\xfb\xea\xf7\x99\xfb\x39\xe2\x88\x3b\xfc\x80\xcc\x60\x8c\xf7\xa5\x0d\xb6\x4f\x8f\x60\x95\x6a\xc4\xb1\x7e\xb9\xb3\xcd\x6a\x73\xe5\x79\x26\x5c\x69\xaf\xed\xc6\x03\xde\x31\x61\x6e\x33\x71\x72\xcb\xe7\xe0\xf1\x94\x0a\xd0\xa5\x5d\xae\x8a\xf7\x32\x13\x59\x71\x1c\x85\x31\xa9\x27\x42\x89\xfa\x4c\xe5\xdf\x8b\x9b\x51\x4f\x72\x3f\x70\x75\xcf\xcb\xf3\x25\x2f\x6f\x70\x57\x96\x69\x3a\xb7\x76\xea\x18\xe7\x67\xaf\x1c\x72\xb0\xe2\x56\xbb\x2b\xff\x0f\x88\x66\xb0\x98\xd3\x50\x72\xe1\x75\x3b\xfa\x1e\xd8\xb9\x35\xf8\xec\xbc\xa1\x91\x11\x97\xd5\x0a\xee\x9a\x44\x61\x76\x3e\xf7\x4f\x41\x42\x1d\x9d\x7f\x5e\x3e\xad\x5f\x0e\xf3\xd9\x6e\x79\x78\x7d\xb1\x72\x02\x8a\x12\xa1\x05\xdc\xca\x62\x50\x74\xaa\x28\x01\x9d\xf9\xb4\xec\x29\x48\x6b\x6b\xda\xe2\x40\x23\x1a\xda\xc5\xef\x93\xa7\x8e\xd3\xc4\xa3\x3d\xee\x01\xcd\xad\x34\xec\x43\xd3\x00\x83\x47\x5b\xac\x01\x18\x35\x26\x29\xf3\x44\x57\xf9\x9b\xe7\xb6\xf8\xfc\x61\x54\x69\x38\x39\xdf\x68\xea\x45\xa8\xb0\xd0\x39\x19\x1f\x59\x73\xd2\xbb\x9f\x7d\x0c\x16\x00\x26\x04\xf6\xcb\xd9\x33\x1a\xec\xf6\x77\x12\x32\xdf\xac\xb9\x1a\x45\xfe\x15\xbb\xb2\xa2\xdc\x53\xc2\xc9\x9b\x56\x13\xda\x98\xb6\x5f\xa4\x91\x0d\xa6\xce\x62\xfa\xc6\x79\x1a\x23\xdb\xcb\x8e\x9d\x5b\xbb\x60\xbb\x88\x29\xfd\x22\x84\x49\x39\x4b\xac\x70\x91\xd1\x5d\x5b\x36\xa7\x67\xf6\x06\x95\x96\x67\x1c\x71\x21\x29\x2a\x12\xbd\x2b\x95\x28\x88\xdf\xf7\xa9\xa8\x48\x23\xc6\x1c\xdc\x54\xcb\xe7\xb8\xb7\x25\xdb\x1d\x50\x43\x03\x2a\x10\xac\x81\x07\x50\x50\x08\xd8\x5d\x79\x73\xbb\xf4\xd5\xd6\xb0\x2f\x16\x1f\xce\x8e\xc7\xec\x5a\x1c\x33\x14\xdd\x9b\x48\x0b\x52\xf0\x42\x8c\xac\x1b\xbc\x01\xf5\x06\x4c\xc0\x8a\x82\xaf\x40\x27\x04\x6c\x78\xc1\x36\x48\xc2\x9d\xc6\x4c\x6b\xaf\xef\x9f\x36\xbe\x3d\x4a\x79\xba\x62\x98\x5d\x2e\xbf\x42\x55\x67\x25\xd6\xa1\xcf\x9a\x49\xd0\x9f\xa2\x2a\xd0\x18\x46\xfd\x5d\x1e\xca\xe3\xf4\xc2\x44\x15\x8d\x71\x48\xee\xb2\xf6\xd3\x3c\x74\x20\x1e\xaa\x8c\xcf\xb8\x58\x3f\x6f\x9e\x96\x98\xfc\xde\xed\x67\xfb\x57\x9b\xfe\x4e\xbc\x28\x05\x36\x90\x55\x5b\x3e\xed\x17\x4f\xac\xea\x22\x7b\xd6\xcc\x48\x3c\x9a\xc6\x1a\x47\x7c\x7b\x2e\xab\x4e\x23\x43\x25\x9e\xf4\xb9\x21\xe1\xad\x59\x0e\xdf\xca\xce\x55\x4e\x7c\x4f\xa3\x67\xff\x58\xbf\x38\xa8\x59\xfb\x6b\x8c\x3a\x0e\x8e\x17\x20\xcf\x07\xdc\xba\x83\x07\x4c\xfc\x94\xa3\x67\xd8\x71\x34\xf4\xca\x46\xa6\x98\x3c\x55\xe2\x8b\x08\x0b\x70\x79\x86\x28\xcf\xa3\x35\x35\x92\xd0\xf3\x12\x66\xa2\xfc\x96\x01\x0e\xd3\x43\xae\x43\x2a\x83\xc0\x46\xf5\x91\x18\x89\x65\x77\xd9\x8f\x2f\x29\x6d\x54\x42\x42\x8a\xe0\x0b\x79\xbd\xe4\xa8\x2f\x30\xb2\x67\x13\x42\x38\xa6\xb2\x5b\xeb\xec\xc9\x7a\xf2\xd7\x7e\x99\xc6\xf0\x1b\x27\x24\x96\x48\x1b\x24\x4b\x97\xba\x33\x2d\xd4\xd7\xe6\x8f\x28\xcf\x17\xab\xf5\x37\xc1\x31\xa2\x12\x1a\x85\xca\xa0\x59\x7a\x6c\x19\x2a\xa1\x4c\xb3\xd9\xb6\xbe\xd4\x9d\x02\xce\xe8\x14\x2a\xf2\x53\x0b\xcc\xdd\x67\x48\xc3\x92\xf5\xa2\x10\x49\xe2\x03\x46\x7c\x9f\x4b\xbe\xfb\xef\x95\x39\x4b\x2a\x49\x7c\x15\xc5\x16\x5d\xb9\x61\x58\x41\x3d\x7c\xc2\x94\x7a\x18\x62\xe8\x93\x1c\x1b\x9c\x80\x3d\x09\xf3\x43\x49\xb5\x71\xa1\x65\xc6\x86\x67\x60\x1c\x10\x7e\xa7\xb2\x9f\x1b\xa8\x4c\xa4\x78\x72\xcb\x4c\x7a\x73\x3d\x61\x12\x74\xb6\x29\x7b\x07\xc1\x0a\x79\x6b\xdc\x60\x61\x40\xa4\xf3\x67\x1e\xcb\x6b\xd5\xd5\x7a\xb4\x8d\x3a\x6a\xb9\xdc\x2e\x68\xe0\x4f\x10\x2e\x98\x7e\x22\x22\xc2\x10\x37\xfc\xab\xf5\xe3\xb3\xb2\x18\xed\x15\xb6\x23\x15\x91\x70\x74\x7e\xbb\xeb\x79\xdc\x01\x12\x2d\xb5\xb7\xc8\xf2\x3c\x2b\x0b\x96\x55\xee\x66\x94\x27\xd1\x72\xd7\xdc\xa3\x1f\x25\x26\xe5\x97\xff\x9d\x97\x65\xee\xba\x44\x22\xd2\xee\xb0\x91\xe8\xdb\x88\xe6\x37\xdf\xeb\x9a\x95\x36\x88\x8c\xad\x81\xe6\x77\x8d\x5f\xb7\x0f\xe2\x56\x89\x52\xa9\x6f\x0b\xbd\x2e\x65\x51\x97\x95\xab\xdd\x54\xa9\x17\x50\x54\x74\x53\x87\x4b\x95\xbd\xbb\x5f\x43\x65\x53\xf1\xcb\x73\xd6\x8c\x6b\x4e\x55\xea\xc5\x09\xce\x4a\xad\xe7\x92\x99\xef\x3f\xbd\xb5\xa4\x7e\x20\x91\x9b\x0c\xb5\x10\xfb\x44\x20\x2a\xf5\x89\x16\x5f\x6d\xc7\xe6\x41\x0b\x6e\x59\xa3\x26\xf5\xa5\xaf\x9f\xbf\x62\xaa\x79\x81\x8f\xd6\xcd\x68\x0d\x2b\x0b\x4e\x18\xdd\x52\x10\x86\xba\x1c\x14\x6b\x85\x31\x7e\xbb\x37\x9c\xf6\x96\x03\x4d\xa5\x41\x94\x60\xc6\xd8\x44\x8b\x51\x07\xa6\xaf\x51\xf5\xe5\x32\x91\x06\x54\x73\xa8\x1c\x01\x41\xb3\x68\xca\x0c\x7b\x44\xbe\x8a\xd3\x4f\x99\x76\x06\xb4\xd4\x2a\x8d\x42\x0f\xd1\x44\x68\xca\xd5\x27\x56\xb9\x15\x3a\x8d\x64\x8c\x3b\x4f\x56\x55\x20\xaf\x22\xe3\xf9\x1d\x3c\x20\x8d\x14\xc7\xf4\x53\xeb\xd1\x35\x6f\xf3\xd2\xd9\x5c\x29\x91\x10\x47\xbd\xd5\x7a\x5f\x7e\x1b\xc0\xbe\x86\xf7\x1c\xfb\x3a\xb2\xd2\x6e\x05\xf5\x26\xbb\xb8\xfb\x8b\x43\x81\x41\xcd\x0b\xe6\xa3\x86\x3b\x6a\x1a\x4b\xf0\x1c\x9f\x55\x5d\x5e\x2b\xd1\x87\xed\xab\xb4\xb5\x57\xdb\x83\x51\x3f\x70\x32\x6c\x9d\x52\xca\x2d\x69\xdb\xbc\xe4\xa3\x37\x49\x99\x87\xb9\x51\xac\x00\xab\x05\xbb\x80\x6c\x4f\x05\xab\x62\x87\x93\xd5\x5d\x47\xa6\x58\x20\x89\x1b\xf8\x41\xb6\xc6\x71\xbf\xe0\x47\xa5\x54\x49\x6e\x70\x45\x03\x41\xca\xf7\xbb\xfb\x49\x02\xaa\x74\xad\xd1\x7b\x56\x43\xb5\x61\x95\x7b\x9a\x24\x4d\x88\xd4\xef\xba\xcf\xcd\x3d\x7a\x93\x09\x8b\xf0\x4d\xaa\x2c\xcf\xf5\x5e\x34\x90\x29\xfc\x77\xd8\x05\xf6\x7a\x7f\x06\xff\xf7\xcf\xbe\x45\x83\xbf\xa7\xa3\xc4\xcb\xbf\x83\xff\xb3\xd7\x90\x0a\x33\x66\xc7\xde\x7a\xfa\xef\xff\x1b\xdf\x08\x78\x48\xad\xc1\xa4\x1c\xcb\x89\x4d\xb9\x6e\x69\x1a\xc6\x38\xb0\xe7\x57\xe3\xec\xff\xc3\x35\x24\xf8\x4a\x76\xab\xa7\xd9\xd3\xec\xfb\xca\xfe\xce\x52\x8e\x31\xd3\x97\x87\xd7\xdf\xe6\xdd\xe6\x96\x32\x88\xc3\x10\x09\x15\x25\x9c\x33\xeb\xbc\xa5\xdc\xd7\xe1\xcb\x13\xa6\xf7\x4c\xb1\xf6\xf0\xe5\xf3\x50\x33\x51\xd4\x5a\x81\x22\xd8\x02\x13\x5d\x8a\x2d\xe5\x91\x2e\x08\x7c\x2d\x4e\x2c\x1f\xf3\xfd\xaa\x14\x58\x80\xcd\x12\x44\x29\x61\x6c\xe5\xa5\xc0\x84\xd6\x2b\x42\xef\xbb\x27\x60\x67\xda\x95\xaf\xbd\xea\xa3\x46\x49\x96\x85\xad\x5d\x74\x0b\x95\x4a\x42\xdc\xed\x2a\xcb\xa1\xb2\xaa\xeb\x6b\xeb\x0f\xec\x6e\x45\x73\x1a\x19\x37\x91\x3d\x88\xa7\x71\x32\x99\x9e\xb2\x1d\x20\xc6\xb1\xa9\xd1\xe9\xd3\xe1\x58\xe6\x29\x1a\x6b\x52\xf2\xdb\x43\x75\x3d\xda\x59\xce\x3c\xa5\xb7\x9f\xcb\xb1\xec\x87\xe8\x58\x40\x02\x84\xf6\x95\x4a\x75\x35\x60\x8a\x45\x44\xb1\xd8\x04\x74\x9e\x35\xb6\xd4\x35\xc5\x94\x44\x1d\xf6\xf4\xf3\xc2\x4c\xc5\x22\xae\xe1\x9b\xf3\xf6\x91\x6c\xae\x8a\x11\x8f\xa1\x41\xf9\x5e\xb6\xe6\xbc\xd3\xf3\x73\xcd\x52\xe3\x53\xac\xb8\x80\x71\xe0\x3f\xb9\x04\x01\x22\x2d\xb4\x6c\xfb\x4b\x79\x1f\xe6\x66\x31\x8b\x21\xec\x22\xf1\xf6\x32\xb1\xd2\x19\xac\x17\xf8\x68\xe7\x6e\x26\xb2\xcb\xdf\xe5\xef\x53\x8c\xd2\x04\x51\x3f\xaf\xcb\x01\x26\x86\x51\x43\x38\x59\x69\xdb\x73\xbc\x0a\xb3\xc4\x13\x31\x38\xca\x0e\x27\xf1\x90\x95\x45\x87\xb6\x64\x09\xe8\x38\xcf\x0e\x9a\xe5\x3b\xcb\xaf\xd6\x6d\x73\x98\xda\x6b\x0f\xc6\xcc\xd2\x40\xe1\x60\x3e\x95\x6e\xaf\x60\x69\xa4\x79\x90\xe7\x0f\xb3\xdf\x77\xb3\xa7\xa5\xfb\xdd\x28\xb6\x1a\xe2\x9a\xdf\x81\x55\x6b\xb5\x2a\x54\xde\x5f\x03\x59\x4a\x38\xa2\x03\x0f\x70\xce\x9a\xff\x2d\xf9\xa6\x1c\xf0\xdb\xff\xc5\x1b\xfa\xe7\x7d\xac\x9e\xa5\x09\xc5\x8f\x24\xae\xd5\xa6\xac\xb3\xc1\xc5\xb8\xae\x4d\x9b\x3d\xfc\xba\xda\xad\xb7\x87\xf5\x8b\xbb\x5b\x16\xea\xfa\x11\x0e\x56\x53\x56\x31\x1e\x87\xb8\x25\xaf\x16\xeb\xf9\x6a\x00\xc9\x66\x5c\x69\xfd\x20\x33\xe9\x8e\x03\x60\x10\x13\xb1\x26\x6f\xc5\xe2\x34\x77\xab\xdd\x2d\x8a\x58\xca\x3e\x05\xc8\x93\xa9\xb0\xf8\x01\x99\x3b\x45\xca\x90\x94\x31\x13\xe5\x77\x56\x2f\x3b\xcd\x7f\xc5\x04\x00\x72\xd2\x3e\xc3\x19\x06\x37\x25\x03\x29\xcc\x7e\xb2\x67\x3f\x57\xc5\xfc\x32\x32\xfb\x18\x24\x1a\x40\xf6\x8d\xdd\xe6\xac\x60\x05\x1b\x1c\x0f\x2c\x15\xc6\xb6\x7a\x2d\x5c\x58\xe1\x31\x67\x6e\x1c\x83\x08\x31\x35\x88\xcc\x24\x77\xa1\xa4\xf1\x47\xbb\xdb\x3b\xee\xb2\xf6\xd3\xce\x01\x03\x91\x06\xb4\x5f\xf8\x75\xba\x16\x6f\xee\x1e\x14\x98\xb0\x49\x21\x5f\x3a\x42\x74\xd3\xaa\x48\x00\x60\x9c\xb2\xfd\x47\xf9\x6b\x99\x5f\xbb\xa1\xaa\x62\xc5\x3b\x36\xbf\x01\x11\xab\x4d\x88\x30\x45\x3d\x4f\x13\x9a\x14\x57\x96\x0f\x28\x6d\x46\x57\x12\x0a\xa5\xb6\x37\x50\xd5\x65\xc1\x5c\xc8\x6d\x30\x09\xb9\x17\x06\x88\xdd\x37\x9b\xc7\x33\xcb\x8a\x1e\xdc\x92\x7b\xa1\xce\x46\xa0\x73\xf2\x84\xd1\xe9\x6f\xac\x7e\x42\xb5\x80\xc1\xe5\xb8\x1f\xc9\xd4\xb1\x16\x9b\x95\x7e\xde\xde\xf9\xbe\x62\x59\x9e\x15\xc7\x3f\x46\x38\x73\x7b\x1c\x27\x26\xbc\x6e\x73\x65\xdf\xae\xac\xb5\xb9\xc6\x74\x23\x8a\x07\x44\xa2\xc5\xad\x85\x11\x2c\x2c\xc7\x34\x86\xbe\xe6\x52\xd4\xb0\x65\xcc\x90\x0e\x5e\x1c\x0f\x39\xc5\x41\x7d\xa8\xa1\xd1\xc5\xf0\x63\xb5\x77\xc5\x43\xa9\xb9\x40\xb4\xde\x90\x45\xf2\xcc\x6f\x46\x67\x65\x74\x3f\x51\xc0\x31\x39\x56\x5c\xcf\xb6\x04\xdb\xde\x4d\x24\x62\x2c\x0d\x62\xa8\x88\xb0\xfc\x6f\xe0\x9b\x88\xb7\x6f\x28\xf1\x7c\xdb\x51\xfa\x48\x9a\x79\xd0\x3b\xdd\x88\x82\x53\x71\x12\x70\x5c\x24\x2d\x65\x61\xfd\x0d\x29\x59\xc6\xaf\x86\x70\xc9\xd3\x9e\x10\xfd\xac\xde\x41\x9f\x1f\x64\x52\x2c\x78\x60\xc9\xf0\x38\x0c\x10\xc0\x6d\x15\x87\xed\xe0\x9e\xb3\xe2\x6d\x52\x23\xc1\x1e\x47\xf4\x16\xf8\x98\xd5\xa7\x4d\x55\xfe\xbc\x23\xee\x77\xfd\xf4\x96\x6e\x42\x27\x7a\x45\xba\x13\xf6\x51\x3c\x4e\x13\x2b\xfc\xd7\x23\xca\x5e\x15\x0a\x09\x2c\xee\xea\xd4\x78\x2c\x28\x66\x54\x30\x7e\x38\xce\x7c\x0f\x9e\x90\x12\x22\x4d\x44\xf4\x7b\xd9\x98\x58\xc8\xf0\x26\x93\x98\x50\x6e\x75\xe0\xe4\xb0\x5a\x56\xf1\x84\xc6\x36\x18\x3c\xcb\x73\x9d\x74\x42\x49\x63\xcd\xea\xa0\x5a\x3f\x6b\x7c\x42\x29\x9d\x9a\x1a\xab\xd1\xbe\x1a\xba\x03\x3c\x25\x81\x47\x2c\xd1\xbf\x7e\xe5\xbb\xeb\xd9\xb6\xb2\x80\x68\x4a\xc8\xeb\xf9\xcc\xaa\x5b\x9f\x62\xc7\xf4\x10\x31\xc3\x2b\xa0\x2f\xf4\x1d\xf2\xfc\xfb\x4d\x76\xcc\x69\x8a\x4b\x01\xca\xd4\x3f\x30\x5d\xfb\x80\x71\x47\x35\x2e\xd2\x55\x5c\x91\x10\x69\xab\x98\x94\x5a\x94\x1f\xa4\x2e\x55\x1a\x5e\x51\x78\x91\xb0\x3a\x50\xcf\xec\xa7\x75\x2a\x87\x39\x47\xd3\xd5\x4f\xbc\xd0\xef\xbd\x4f\xac\xe8\x9f\xa4\xfe\x6b\xfb\xca\x88\x77\x6a\x04\x86\x21\xc3\x8e\x0b\xe1\x4b\x0f\x2d\x6d\xd4\x6b\xfb\x7b\x45\xa3\x4a\xf8\x4a\xdb\xfc\xab\xa2\x2c\xdf\xfb\xc2\x84\x0a\x73\x33\x4e\xfe\xcb\xa0\xcc\x67\xf2\x1d\xaa\x26\xab\xfb\xe9\x7f\x11\xf8\x00\xa8\x9a\x8b\xb3\x41\x55\xee\xf7\x90\xd1\xc8\x82\x33\x6d\xe6\xa3\x1e\x71\x7e\x29\x11\x92\x84\xb2\xce\x44\x34\xf1\xde\xe1\x6d\x86\x29\x89\x52\xb7\xf0\xdb\x82\x8b\xbe\xfe\xa0\x5d\xa2\x44\xc8\x23\x70\x72\x47\xff\xba\x96\xd5\xf5\x3c\x3e\x19\x10\x4d\xd6\xad\x59\x82\x10\xd2\x26\xb3\xda\x61\x4b\xfb\xdb\x9d\x39\x84\x84\xc6\x35\x82\x66\x25\xe7\x37\x54\xd9\x1d\x7e\x1c\x92\x10\xc4\xe9\xb6\x4b\xfa\xa6\x75\x30\x7a\x98\x5b\x41\x04\x20\xe8\xd3\x70\x4f\x3e\x77\x91\x7c\x11\x0b\xc0\xea\x0f\x13\x3f\xa9\xff\xd5\xdc\x5c\x93\x24\x48\xc7\xd4\x31\xe8\x6d\x41\x64\x97\x0c\x8a\x26\xb0\x7d\xa8\x1f\x22\x64\xea\x97\xb2\x68\xca\x81\x83\x25\xa8\xcf\xb5\x06\x8d\x73\xd5\xc7\x55\xd7\x4a\x50\x12\xe2\xda\x94\xd5\x9a\xf8\xaf\x28\x25\x4c\xa0\x3f\x04\x65\x81\xe7\xb9\xaa\x5e\x4d\x1d\x6c\x9a\x92\xc4\x43\x46\x8c\x0f\xc8\x34\xf8\x05\x35\x67\x6c\x91\x42\xed\xba\xa5\x01\x56\x4c\x5f\x10\x83\xd3\xec\x6f\x17\xe8\x6b\xc1\x2b\x91\x80\xa4\xda\x78\x41\x19\xd4\x59\x73\x2f\xa8\xa8\x44\xea\x47\x18\x70\x72\xe5\x43\xdd\x97\x18\xca\x67\xb9\xef\x92\x06\x5a\xf7\x5c\x73\xf1\x7d\x4d\x3a\x3b\xba\x96\xd0\xc1\xc0\xef\xdb\x1f\xcd\x5f\x89\xd2\x0f\x97\x72\x91\x4a\xbd\x0e\x3e\x56\xac\x28\x32\xf1\x36\xf8\x2e\x8c\x11\xc4\xe7\xc1\xcf\x06\xc1\xb3\xc8\x7c\x74\xca\x2e\xa3\x47\xe5\xbe\x1f\x19\xdc\xd2\xae\x34\x86\xe2\x78\xf5\xe0\x41\x8a\x22\x89\x07\x56\x4f\x25\xba\x46\x0f\xc4\xa9\x8f\x1f\xd1\xa4\xf4\x8d\x98\x83\x3b\xe8\xde\xf6\x10\x5c\xc4\x98\xfc\xe3\x59\xf3\x9e\x9d\x07\x4f\xc1\x05\x0d\x13\x8b\x45\x6c\xa0\x3a\x83\xcc\xee\xf2\x67\x42\x44\x5a\x4c\xae\x86\xe6\x50\x19\x9d\xce\x83\x82\x41\x2a\x46\x48\x10\xb1\x6f\x8b\x4d\x7b\xa4\xa9\x4a\x40\x20\x91\x53\x5c\x66\x72\x51\x9e\x5b\x9b\x6a\x12\x4c\x2f\x80\x08\x5d\x89\xd4\x0e\x99\xce\x8f\x1a\xe3\x03\x04\x24\x29\xb2\xd3\x23\xd5\xb2\xa8\x6e\x97\xa6\x3c\x54\x20\x5a\xd3\xbd\xbf\x22\x29\xdf\xe7\x9a\x47\xab\x7d\xb0\xac\x30\x30\xf9\x46\x23\x37\x6d\xa7\xc8\xf7\x3b\x10\x25\x86\xd1\x6d\x10\x6e\xf8\xda\x55\x92\x8e\x20\x21\xcc\x0f\xdb\x71\x7b\x30\xfd\xcc\x19\xa5\x17\x86\x98\x49\xca\x6a\x8d\x55\x9e\xb6\x13\xa4\x47\xbc\x58\xab\x1f\x5c\x6b\x37\x0d\xa5\xcf\xa5\x06\x22\x19\x5d\xad\x5c\x4d\xc2\x34\xa5\x0f\x54\x69\x59\x34\x9d\x3b\xd0\xe3\x6a\x50\x90\x62\x7a\x86\x4c\x1a\xac\x5e\xf3\x85\x79\x23\x23\xc9\x22\x07\xc1\x37\xb0\xd4\x41\xce\x4e\x46\x8a\x4a\xad\x1b\x7e\xc9\x99\x80\x1f\xd9\x9f\x77\x66\x80\x24\x41\x8a\x51\xc9\xd6\xe3\xc2\x05\x64\x57\xe6\xb2\x4f\x01\xa0\x24\x89\x28\x1a\xc2\x1b\x76\x03\x27\xd5\xb3\x60\x97\xac\xf9\x0c\x4b\x2e\x09\x49\x90\xc4\x76\x5e\xb1\x42\x9c\xa0\x93\xd4\x62\xf9\xd7\x54\xd8\x4a\xc6\x91\x2e\x3a\x57\x59\x21\x27\xcb\xd0\x64\xcc\x24\xc2\x3c\xae\x05\xca\x9c\x8d\x0e\x97\x9a\x4a\x6f\x96\x55\xb2\x2a\x2f\xcf\xc8\xd7\x34\x7d\x93\xb1\x49\xd5\x9f\x35\x8f\xe0\x40\xc1\x5b\x49\x2a\x58\xc2\x06\x88\xb9\xbd\x7e\x98\x95\x1c\x2d\x8e\x32\x21\x7a\xa0\x19\x50\xc8\x46\xeb\x3a\xde\x5b\x00\xc3\xc7\x48\x52\x1f\xa9\x7c\x51\xf0\x7d\x36\xeb\x4f\x72\x99\xf0\xc8\x28\xbe\x4b\x44\xc4\xed\xc7\x29\x27\x99\x70\x85\x2f\x01\x49\xe4\x6c\x99\x82\xd3\xcb\x51\x32\x11\x21\xce\xed\xc5\xf7\xe5\xe2\x97\x23\x6b\xd7\xba\x5e\x2b\x0b\x63\xf4\x49\x9e\x7f\xff\xfd\x9b\xfb\x8d\x30\xd9\x43\xcd\x02\x4e\x29\x0b\x4a\xac\x5d\xaf\x38\xa0\x86\x61\x65\x99\x83\xb3\x80\xbf\x4e\xb9\x4b\x1e\x12\x43\x68\xd4\x54\xd9\xf1\x08\xd5\x43\xc5\x3e\xd6\xc5\xba\x62\x22\xcf\xfe\xd4\x10\x37\x7b\x05\xe1\x69\x15\x91\xd6\xef\xc0\x87\x2f\xab\x5b\x9f\xd9\x4a\x49\x61\x0a\x15\x0f\x97\x76\x95\x68\x1a\x90\x06\xb2\xd6\x7e\x21\x05\x95\xc6\x40\x4d\x7f\x74\x11\x49\x5f\x13\x11\xce\xaf\x37\x5c\x7b\xfa\x86\xb4\x14\x24\xe4\x7e\xcf\x5d\x79\x2a\x59\xb1\xd5\xd3\xe7\x93\x13\xca\x30\xc0\x6a\xec\x03\x52\x92\xb2\x2c\xb7\x58\x44\x17\x08\x1a\x5c\x40\xa6\x89\xe5\x9b\x19\x66\x08\xbf\x8e\x65\x49\x29\x09\xe2\x33\x77\x00\x72\x3f\xa4\x73\x54\x12\x22\x50\x46\x2e\x17\x19\x72\xfb\x91\x3a\x09\x60\x8a\x79\x81\x9d\x0d\x31\x5f\x5f\x50\xbf\xc3\x75\x48\xe5\x11\xaa\x1c\xdf\x83\x25\x95\x1e\xcd\x3e\x95\xc6\x46\x48\x33\xfb\xb3\xb5\x4e\x7f\x94\xd5\xdb\x67\xfb\x5f\x2f\x74\x03\x9e\x47\x40\xc7\x8b\xab\x1a\x76\xa7\x12\x5e\xca\xc6\x96\x50\x0e\x1e\x15\xbc\x50\x20\xb9\xdf\x86\xdd\x90\xce\x3b\x7b\xff\x05\x46\xd1\x01\xf0\x23\x82\x1b\xd4\x7c\xfd\xf2\xba\x3b\xec\x57\xcb\xed\xc1\x3f\x60\xcd\xc8\x3f\x6c\x0f\x2a\x10\x04\x9e\x89\x72\xfa\x71\x21\xf4\x22\x8c\xe0\x89\xd6\xf4\x3f\x34\x27\x38\x34\xa7\x0c\x46\xc1\x40\x08\x23\x69\xb8\xd8\x4c\x88\xf3\xbe\x3a\x09\xc2\x54\xe2\xa2\xb3\xf8\xbe\x7a\x59\xee\x96\x87\xe5\x6f\x8b\xef\xb3\x97\x6f\x4b\xcb\x95\xa5\x20\xa2\x7e\x80\xe0\x6d\xcb\x54\x3f\x08\x2e\xbb\xbc\x41\x32\x8a\xfa\x43\xc4\x63\x1b\x28\x36\x88\xbd\x42\xd7\xb7\x7c\x89\x8e\x46\x21\xe9\x44\x87\x4d\xb5\x37\xf9\x49\x85\x36\xc4\x61\xc4\x53\x1b\x1c\xd1\xe2\x22\xda\x15\x9b\xdc\x52\x21\x4e\x53\x2c\xb7\x6b\x6c\x39\x9c\xbf\x6c\x4e\x1b\x0b\xe8\x05\x1a\x30\x9c\x0b\x4c\x2b\xe8\x6a\x17\xd4\x2d\xa9\x40\x99\xe8\x61\xa3\x30\x2f\x3a\xb0\xe5\x81\x72\x5d\x60\xdc\x63\x2b\x78\x2d\xda\x15\x46\xd6\xd3\xae\x19\x24\x5e\xa0\xfa\xb6\xf6\xf2\xe7\xf4\x34\x85\xc4\x57\xa4\xab\x9d\x6d\x1f\x0d\x63\x45\x23\xd5\x7a\xd3\x39\x0d\x35\xa7\xb7\x26\x09\x06\x69\xf0\x4f\xea\xda\xf9\x47\xa3\xd3\xa7\x5c\x53\x25\x34\x55\x76\xc9\x61\x5b\x96\xe7\x67\xe7\x85\x40\xaa\xe2\x20\x1c\xea\x34\xd8\xcd\xa6\x37\x41\x5a\xa7\x10\xf3\x32\x65\x2e\xa7\x75\x53\x3f\xfb\x77\xf8\x49\x79\xa2\xa9\x56\x51\x53\x0b\xbf\xc0\x27\xfc\xa2\x0a\x44\xc4\x10\x82\xbc\xbb\x5c\x9b\x22\x7b\xb3\x46\xe0\xf0\x7c\x22\x81\xd0\x54\xd0\xec\x4b\x2c\x3a\x6e\xdd\x3f\x8b\x4e\x1e\xbb\x81\x6d\xf7\xd4\x15\xb0\x81\x31\x25\xee\x86\xdf\x27\xf7\x2e\x78\x9c\x6a\x7e\x83\x22\xab\x4f\x9d\x34\xa8\x02\xa1\x02\xf4\xb7\x7e\xc3\x32\xc1\xaf\x40\x8b\x20\x43\xc2\x3a\x24\xeb\xfc\x9a\xbf\xf5\xc9\x84\xea\xcf\x21\xf9\x20\xc3\x14\xf5\x1e\x8b\xeb\xb9\x57\x5d\x6d\xbd\x5e\xb7\x70\x48\xe6\xd3\xc0\x15\x3f\x76\x58\x1f\x90\x9c\x46\x69\x47\xe8\x39\x49\x38\x01\xe0\x47\xac\xab\x7a\x2c\x9b\x11\x15\x47\xff\xfb\x00\x49\x31\xe8\x83\x8c\x92\xa2\xe9\xe3\x03\x41\x79\x0c\xb1\x8b\x73\x64\xca\x79\xec\xc0\x24\xa0\x82\x58\x40\x7f\xcd\xf8\x7a\xad\x50\x69\x88\x9b\x07\xbf\xa2\x44\xca\x60\x5c\x2b\xcf\x63\x18\x9b\xe4\xd0\xac\x8b\xb5\x94\xcb\x77\x28\x7a\x83\x56\x79\xa1\x8f\xd7\xd2\xef\x7a\x5a\x69\xf3\xb3\xf0\xb6\x39\x85\x1f\x70\x23\x04\xdf\xae\x0a\x76\xad\x6e\x37\xa0\x6f\x77\x95\x58\xca\xe7\x04\x13\x61\xed\xfc\x58\x61\x61\x9c\xf5\xc8\x55\x40\x14\xfa\x18\xc6\x14\x7e\x60\x0d\xe8\xdc\xe0\xf4\x94\x55\x61\xc0\x91\xda\xf8\x58\xb1\x02\xbf\x04\x0a\x09\x61\xa0\x50\xc3\x87\x47\x97\x0e\x43\x25\x6d\x6a\xfb\x66\x97\xe1\x91\xac\xbd\x52\x61\x94\x60\x58\x6c\xb5\xd9\xff\x3a\x64\x75\xd3\x6d\xc8\xe7\x54\x16\xf5\xf5\x8c\xe2\x0d\xe5\xfb\xb8\xfe\x5e\x85\x31\x37\xa1\x81\x45\x9e\x41\xd1\xb4\x66\xf7\x27\x0c\x4d\x2a\x4c\x3d\x0c\x8d\x9a\xac\x99\xa9\x61\xb8\xb9\xa5\x47\x85\x69\x84\xf2\xa6\xc7\x72\x77\x2a\x5d\xee\x5b\x45\x7e\x80\x59\xed\xd5\x62\x0d\x03\x00\x83\x8a\x68\x94\x68\xb1\x82\x39\x34\x9b\xb2\xae\xb3\xce\x3f\x53\xc4\x0f\x14\xbb\x8b\x80\x6a\x24\xcd\xe8\x3d\xc4\x7e\x84\x4c\x8a\xe7\xdb\x9c\x89\x37\x1b\x04\xb1\x8d\x24\x70\xf9\x96\xc1\xee\x3c\x7a\x15\xd4\xd7\x4a\x60\x9a\x80\x66\xc1\x1a\x38\x96\xd5\xed\xab\xc9\xaf\x68\x14\xe0\x46\xbb\xbb\x56\x47\x18\x1b\x4a\x8a\xa6\xd4\x37\x17\xfe\x01\xd9\x66\x32\x36\xa3\x12\x11\x87\x7a\xc7\xaf\xaf\xf0\xcc\x7e\x9a\x74\x70\x3f\x0d\xac\x52\xcf\xc3\x64\x79\xeb\x5b\x7e\x00\xbc\x1d\x3e\x10\x11\x69\xf7\x7b\x95\x86\x9e\x41\xae\x34\x4d\x0e\x9f\xe3\x0b\x14\xf3\x28\x92\xc7\xd9\xfa\xb8\x51\x6b\x14\xda\xa9\xfc\xb8\xdb\x8f\xde\x0e\x53\x61\xa0\x23\x2c\x1a\xab\xf1\x00\x39\x34\x30\x99\xb6\x56\x3c\x00\x03\x76\x2b\x3f\xb6\x46\x89\x60\x78\x36\xce\xb5\xf1\xb7\x2b\x8d\xdd\x37\x94\xf7\xea\xcd\x79\x91\x26\xbe\x1a\xa4\xc0\x27\x22\x57\x4a\x88\x48\x84\x8e\x6c\x02\xe5\x02\xcf\xd7\x9c\x35\xd9\x3b\xe0\xe4\x79\x77\x4c\x4a\x4a\xfa\x02\xf1\x89\xfb\xea\x0a\x8f\x79\x76\x59\x2d\xd6\x9f\x96\x96\x7c\x19\x69\x51\x92\xc7\x38\xae\xdf\x0d\x37\xcb\x1d\x2c\x40\x01\x23\x68\x62\x1c\xac\x1f\xbe\x2e\xe0\xb5\xc8\x9a\x55\xb1\x6b\xc6\x54\xdd\x4a\x29\x3f\x05\x23\xac\xd0\x18\xbe\x97\xb2\xfa\x51\x95\x0d\x20\x92\x64\x7a\x52\xaa\x90\xa2\x2d\x60\xcb\x00\x77\xab\x3f\x74\xb6\x94\x79\x1e\x12\x8f\xfd\xcf\xff\xf3\x3f\xbf\xfb\x07\xcd\x2a\x6e\x74\x84\xd0\xf4\x72\xf3\xb0\xed\xc8\x00\x85\x63\x3f\x20\x73\x22\x95\xa6\xc9\x0f\x35\x02\x70\x77\x62\xc5\xcf\x8e\x52\xad\x6d\x01\x81\x88\x06\xe5\x28\x39\x6d\xdc\x04\x1b\x15\xce\xc8\x76\x52\xac\x2d\x7b\xfd\x27\x14\x18\xcc\xf3\x82\x20\xd4\xf8\xf1\x0a\x44\x59\x49\x34\xc6\xd0\x9a\xe8\xaa\x91\x7b\xef\xaa\x3d\x80\xfb\x34\x75\xf5\x6c\xda\x21\x7d\x2c\xab\xd9\xa5\x94\x50\x31\x59\xf6\x6d\x3d\xe6\x79\x61\xa8\xcb\x9c\x74\xf9\x35\x6a\x1b\x3d\xb0\x5b\x6d\xef\x36\x8c\x89\x45\xb8\xe9\xb0\xe7\x5a\x2d\x4e\x65\x26\xa0\x1e\x9d\x27\xf2\x83\xa4\x13\x9d\x1c\x56\x59\x61\x73\xc8\xa5\xc9\xf5\x37\x1a\xb5\x35\x2c\xa7\x6e\xfb\xd0\x10\x03\xe1\x18\x64\xdd\x54\x13\xb2\x9d\x6d\x27\x00\x1c\x5a\x59\x8d\x0c\xb4\x32\x63\xc5\x3d\xb7\x93\xe9\x4b\x22\x82\xd8\x09\x61\x52\x30\x7f\x0e\x9d\x47\xdf\x9e\x93\x90\x10\xab\xe3\x34\x9c\xfa\x2e\xee\xda\xf6\xe0\x09\x5a\x00\x2f\xd7\x3c\x7f\x66\x17\x47\x64\xcd\x3c\x2f\xe6\x1e\x26\x3b\x0e\x15\x1c\x71\x9c\x0f\xdf\x4b\x0c\x1e\xa2\x55\x2f\x18\x6c\xfa\x28\x9f\x9c\x90\x3a\xf3\x3c\xea\x13\x62\x2b\x81\x90\x0d\xe1\x6f\x38\xa1\xed\x61\x5c\xc3\x17\x4d\x3d\x31\x86\xe5\xea\xd1\x1d\x27\x32\xc0\x95\x6f\x03\xcd\xa9\x82\x61\x52\x0c\x9b\x93\x54\xfb\xdf\x98\x9e\x19\xea\x6f\xb6\xed\x8a\x60\x4e\xe3\x90\xd5\x2f\xb8\x58\xec\xcb\x65\x25\xe6\x58\x4a\x3f\xea\x9a\xa6\x1c\xf3\x24\x12\xf2\x86\x2d\x1f\xaf\x85\xf8\xdb\x16\xf3\xf0\x9e\x58\x18\x45\x3a\x73\xad\x73\xcc\xfe\xe0\x5d\x31\xca\x62\xd9\x0f\x4a\xbe\xc0\xc7\x56\x0b\x94\xd5\x8d\x56\x44\x9e\xe4\xc3\x6c\x0f\x05\x89\xda\xc8\xd6\xeb\xeb\xa3\x0b\x47\x43\x86\x29\x86\xce\x28\xf2\x1d\x1c\xbe\x2d\xf7\x87\xc7\xa5\x5b\x35\xb8\x17\x85\x30\x50\x82\xed\xd0\x41\x6d\x73\xec\x59\x8d\xa2\x87\x97\x95\xfd\x55\x78\x0c\xd1\xff\x4f\xe5\x31\xf8\xa4\xa2\xd3\xf6\x0c\x01\xed\xd9\x25\x06\xc6\x9f\x32\xe5\xd6\x0c\x91\x6a\x16\x1f\x86\x91\x41\x96\xc3\xb3\x8e\x95\x8d\x3e\xaa\x80\xd0\xaa\xed\xad\x5c\xa5\xa2\xe6\xa4\x72\x3d\x62\x1c\xe9\xe7\xac\x68\xbd\x7e\x07\x9f\xfc\x02\xd4\x63\x8e\x94\x94\x46\x26\x4b\xb8\x78\xdd\x3d\x4c\x04\x57\xb1\x13\x0f\xb4\xb5\x81\xeb\xd4\x77\xc8\xf3\x12\x65\x33\xec\xf5\xa5\x48\x7b\x2a\xda\xf5\xc5\x1f\x9f\x40\x32\x34\xee\x34\x4d\xce\x84\x30\x16\xf3\x3c\x10\x69\x1a\x76\x7c\x6d\x63\xe5\xf3\xb6\x07\xa4\x88\xb0\x86\x9f\x59\xdd\x58\xe0\xf4\xb0\x8b\xf2\xd3\x84\x75\x51\x36\x0d\x26\xb4\x6d\xb1\x06\xcc\x1f\xea\x32\x97\xeb\x6b\x53\x67\x12\x36\xcf\x7f\xb8\x66\x4a\xc1\x77\x42\x80\xd6\x2b\x19\xdd\xa4\x92\xa1\x48\x7a\x01\xac\x09\x1f\x04\x7b\xd1\xae\x2c\xe5\xd6\xda\x1d\xb6\x01\x12\xe4\x62\xc3\x9c\x23\x2f\xab\x11\x2c\xaf\xed\xa1\x54\xdc\x13\x90\xb0\x30\x50\xdd\xea\x7b\xa9\xd0\xd1\x92\x42\x54\x98\xab\xb4\xb8\x64\xe6\xf9\xbe\xef\xe1\x4a\xad\x0b\x61\xfa\x0d\xa1\x42\x4b\x3c\xab\x5d\x70\xf8\xf1\xda\x4b\x90\x0c\x16\x36\x3f\x48\x35\x33\x75\x85\xac\x33\xbb\x6b\x75\xc9\xaf\xb5\x25\x3f\x66\x9e\x1f\xfa\x54\xc3\xd9\xda\x0d\xf6\x7b\x76\x29\x5d\x43\x20\x51\xa4\xc1\x18\x07\x86\x58\x63\xf8\xfe\xfc\x90\xf0\xa0\x93\x0c\x51\x30\xfa\xc4\x7e\x48\xa4\xa7\x83\xf3\xbb\xec\x38\xb2\x7a\xda\x66\xc6\x29\x35\xe1\xc5\x2c\x6f\xc6\x07\x33\x89\xa6\xbd\x8e\x5a\x3d\xbc\x6e\x67\xfb\xd5\xfa\xc5\xdd\x1f\x44\x58\x04\xf0\xad\xbc\xee\x4e\x3a\x25\x8c\x8b\x9a\x69\x8e\x78\x8a\x3b\x19\x92\x99\xeb\x8c\xce\x67\x1b\x90\x4f\x04\xf7\x3d\xbb\x01\xad\x2d\x85\xda\xf0\x66\xa8\xe7\xa3\x6b\x27\xd8\x65\x83\x55\x04\x2e\x36\xd6\x36\x06\x3a\x61\x23\xca\xf3\xf9\x5a\x64\xcd\x6d\x91\x67\x86\x59\xbf\x6d\x25\x5a\x85\x47\x27\xe3\x7b\xc1\xa8\x2f\xac\x33\x3c\x8c\xa7\xdd\x56\x3d\xcb\xf3\x45\x59\xe3\x4b\xac\xc7\x8b\xe2\xbf\x07\xa8\xda\x81\xe6\xa7\xcd\x92\xb5\xe7\x4b\x53\x74\xb7\x15\x58\x36\x43\xdf\xdd\x21\xc8\x10\x15\x75\xfc\x00\x0d\xa4\x2f\x52\x88\xe6\x88\x84\x2a\xc4\xb1\x3d\xb0\x86\x59\x12\x99\x5f\xdd\x48\x19\x7d\xe6\x44\x05\x5c\x17\x3c\xe5\xc8\x82\xa8\xbd\x46\x84\xd4\x0c\x47\xad\xe9\x9f\x86\x4a\xa5\x56\xaf\x16\xe4\x90\xef\x9b\x79\x3e\x0b\x19\x96\xc4\x3d\x95\x47\x23\xde\x3f\xf6\x99\x87\x6f\x92\x45\x34\x11\x96\x3b\x17\xce\xb7\x45\x79\xe6\x99\x06\x42\xaf\xc7\xf9\xa7\xd1\xd0\x60\x91\xb0\x3e\xdc\xf3\x6d\x55\xd4\xc8\x2e\x54\xaf\xd5\x6c\xc3\xc4\x5b\x8f\x20\xc5\x74\xe7\x9e\x2e\x51\x3c\x5a\xb2\x51\xa8\x40\xba\x6a\xca\xc9\xfd\xc4\xe7\x42\xf3\x6f\x9e\xcb\xa2\xed\x7f\x60\x28\xbd\x37\x3e\xb1\x48\x6c\x3d\x82\x64\xd9\x74\x60\xad\xed\xa6\x18\xbd\x03\xce\xcd\x17\xcb\xb5\x51\xc6\xb0\x6f\x50\xf8\x51\x04\x96\x6d\x22\x13\x5f\xb8\xfe\x6d\xe7\x28\x49\x9d\xee\xde\xcf\x47\x80\x7d\xc5\xe4\xf8\xc9\x45\x1c\x28\x3d\x95\x6d\xd0\xee\x09\x2d\x76\x77\x45\x1e\x21\x92\xca\xde\xd4\xe3\xdd\x5a\x21\x81\x62\xa4\x67\xfe\xd8\x39\xa1\xcc\xf3\xc1\x67\x81\x6f\xc5\x33\xb5\x72\xae\x06\xa2\x0e\x64\xaa\x26\xcd\x04\x1f\x98\x8e\x6a\xcf\xa0\x2a\xeb\x9b\x3b\xa5\x92\x5c\xd3\xd7\xe8\x0c\xf3\xe6\x9a\x5b\xed\x8d\xa1\x55\x18\xf8\x91\x40\x52\x8e\x76\x1f\x5e\xe4\x65\x6d\xdf\x5f\xe0\xd3\x40\x1a\x77\x6d\x56\xd7\x78\x27\x83\x87\x09\xfc\x84\xc7\x26\x2d\x63\x26\xdb\x7d\x85\x53\xdb\x4d\x52\x63\x2d\xa1\xf8\x57\xeb\x42\x57\xa3\x2e\x01\x13\x89\x15\x68\x09\x67\xd5\xd1\x2e\x3a\x41\x20\x7c\x62\x35\x6e\x58\xfd\xa6\xfd\xd4\xd1\x03\x04\x92\xe1\xd8\xc2\x0d\x06\x71\x4b\xac\x58\x17\x73\x38\xb1\x5c\xad\xd5\x16\xc4\xb5\xaa\xef\x55\x50\x3f\x91\x8f\xb2\xe7\x84\x20\x69\x9f\x7d\xb6\x59\x3f\x3d\xad\x17\xeb\xd5\x8b\x63\x55\x9a\x3d\xaf\x5f\x5f\xf6\xf6\x06\xc3\x88\x69\xfd\x38\x4c\xb3\xea\xe1\x30\x73\x8d\x32\xc2\x0c\xcd\x16\x64\x26\xca\xc2\xfd\x0c\x54\x76\x85\x73\x28\xc5\xb6\x65\xc5\x9b\xce\xb5\x36\x65\x75\x5b\xfe\xbc\x64\x95\xa9\x5f\xf6\xed\x63\x46\x41\x12\xe9\x5c\xb3\xb3\x8f\x90\x7d\x0e\x99\x70\xfa\x39\x93\xe1\xf8\x08\x22\x60\x48\x1f\xf6\x3c\xfb\xed\x30\x6f\x6f\xfd\xf7\xc3\xac\x7d\xa6\xd9\x7e\xf9\xd0\x97\x6b\x67\x5e\x40\xb8\x40\x07\xdd\x41\x3a\xda\x01\xac\x25\x95\xc7\xb0\xd3\xee\x55\xc5\x61\x84\x0b\xcf\x25\x6b\x78\xe9\xb6\x8b\x20\x0e\x19\x31\x92\x2e\xc7\x52\xb2\xaf\x16\xa0\x20\x4e\x98\x4e\xf0\x8a\xf2\xdc\x9f\x17\x41\x9c\x46\x38\x74\x32\x30\xa9\xbe\xf6\x37\xa9\xe9\x30\x77\xd7\x42\xa1\xc4\xf7\xf0\x08\xc9\xf0\x6e\x1a\x60\xe7\x2e\xd2\xdd\xdd\x2d\xf5\x24\x17\x26\x42\x92\xbf\xf7\xc0\x0f\x6d\x5b\x44\x98\x49\x76\xb1\xea\x78\x08\x0e\x59\x71\xb9\x8e\x47\x33\x25\x02\x21\x70\xec\xd2\x9a\x3b\x77\x11\x02\xe6\x05\x09\x09\x71\xe6\xcd\x75\x91\xe3\x80\x0d\x00\x9b\x49\x34\x64\x8e\x32\x16\xf4\xa6\x7d\x98\xb5\x1a\x9f\x8d\x31\x2d\x24\xe6\xd0\x87\xbf\xb2\x2a\xc3\x34\xe5\x27\x51\xeb\xf6\x20\xa9\xa3\xce\x82\x75\xdf\x71\x0a\xfe\x6d\x9f\x9c\x85\x61\xd2\x25\x71\x36\x98\x18\xee\xec\xa7\x80\x85\x91\xa6\x97\x7e\xcb\xda\xcd\x44\xcf\xf5\xf9\x6d\x35\x99\x46\x67\xad\xdb\xaf\xf1\x32\x77\x1c\x19\x83\xcc\x00\x76\x8c\xd1\xe3\xbf\x16\x63\xe3\xd4\x75\x60\xc4\x77\xe2\x7e\xe3\x99\xcf\xa9\x2e\xe8\x78\x9e\xbd\xcc\xbe\x2d\x9f\x97\x2f\xfb\xc3\x7e\x39\x7b\x3e\xec\x5e\x37\x9b\xa7\xdf\x7b\xc9\xbf\xb6\x6f\xca\x98\x18\x30\x9d\xb6\x2b\xda\xfc\x36\xe9\x3d\x04\x22\xd2\x8a\x51\xff\xe5\x3f\x77\x18\x49\x1b\x0c\x32\x11\x71\x54\xf5\x38\x95\xb9\x65\xe0\x22\xae\x8d\x04\xb8\x3b\xb5\x4b\xd9\xaa\x68\xe0\x08\xd5\x2f\x70\xd3\xf9\x67\xdb\x45\xe9\x62\x26\x05\xb0\x71\x1b\x7e\x20\x83\x50\x53\xd4\x5e\xf9\x62\x68\x0b\x04\x90\x26\xd2\x84\xd7\x66\x72\xf4\x12\x42\x8f\x84\xa9\x31\xdc\xd7\xcd\x09\xaa\x67\x76\x19\x30\x7e\xd8\x6e\x3c\x01\x8d\xd7\xc6\x98\x46\xed\xe2\x2a\xa1\x9f\xa4\x5c\xb3\xe0\xbe\xeb\xc0\xb2\xf9\x3d\x88\x3d\x74\xb3\x3e\x00\xde\x36\xa5\xbd\x99\x30\xf2\x74\xb6\xf7\x5a\xa8\xaa\xfc\xd3\xbd\x94\x30\x0a\xb5\x90\x07\xb3\x3c\xac\x23\x03\x32\x8c\x88\x12\x06\xc6\xa1\xf9\xf7\x7b\xe6\x50\x68\x2b\x4e\xde\xcb\xfb\x5a\xf7\x89\x24\x05\xf3\x42\x12\xa5\x76\xcf\xdc\xed\x9f\x37\x77\xf4\x6b\x6d\x17\x02\xc2\x90\x00\xf6\x33\x97\xff\x1c\xf7\xd2\x7c\xa8\x52\x6b\x79\x8d\xcf\xc1\xb5\xfc\xc6\xc5\xc9\x30\x30\x2f\x8c\x95\xa7\xcc\x3b\x7f\x45\x80\xc7\x6f\x9b\xd9\x70\x04\x85\x34\x96\xca\xe6\x74\xea\xb7\x39\xb2\x67\xad\x1e\x0c\x0c\xc0\xf6\x49\x28\x42\x19\xd1\x7e\xd7\xc5\x6a\x9f\xe6\xa2\x98\x17\x26\x04\x70\xa7\xae\xaf\x17\x0d\x6c\x68\x2d\x90\xc7\xaa\x3c\x7f\x05\x36\x6b\x8f\x63\x4a\x5b\xbe\xd0\x2c\x2c\x11\xff\x1c\x9a\xfa\x13\x9c\x32\xf3\xc2\x34\x48\x70\x80\x1f\x5c\x2d\xcf\x67\x66\xfd\xe8\x38\xd0\x55\x1e\xa8\xa4\x06\xcd\x4b\xe9\xb2\x9b\x0e\xd3\xc5\xbc\x90\xfb\x80\x6c\x24\x87\x23\x34\x3d\x13\x69\x74\x2e\x1e\xc7\x18\xad\xfa\x23\xcb\x73\xa8\xb2\xeb\xb9\x0f\x48\x63\x5e\x28\x0c\xa0\xa8\x9d\xd0\xae\xae\x78\xc3\x2a\x76\xff\x3a\x26\x2a\x23\xda\x13\x08\x8f\x07\x96\x22\xd2\x24\x81\xc7\xe8\x06\xe6\x85\xd2\x53\xa8\x16\x8e\x6c\x19\xc6\x81\x1f\x87\xc0\xdb\x6e\xca\x23\x1a\x26\x52\x34\x20\x9f\x58\xe1\xe6\x11\xf0\xc4\xd3\x33\x0f\xd1\x6d\x66\x56\xb4\xdf\x6d\x87\xa5\xa3\xd7\xea\x4e\x5f\xe8\x53\xed\xe1\x4f\x51\x15\xbd\xa9\xa4\x02\x12\x99\xd5\xe2\x07\xf0\xba\x35\x49\x9a\xd7\x2a\xb3\xb7\xa3\xe2\x30\x64\x36\xfc\xf9\xa4\x45\xf7\x46\x4b\x8a\x62\x5a\x56\xa2\x83\xab\x8e\xde\x89\xe2\x91\x51\xaa\x7d\xd3\x86\x72\xef\xf3\x46\x3e\x15\x69\x47\x98\xda\xba\x40\xcd\x94\xb3\x75\xf7\xc5\xa3\x20\x90\x9a\x31\x69\xfd\xb4\xde\x1e\x5e\xd6\xfb\xc3\xec\xd7\xd9\xea\x69\x36\x7f\xb2\x61\xaf\xb6\x8b\xc5\x68\xcf\x2e\x19\x6e\x41\xa3\x73\xc4\xca\x92\x1e\xb4\x36\x51\x57\xec\xd3\xb6\x25\x1c\xf7\x7e\x43\x29\x58\x6b\xcd\xa6\x1e\x8f\x8d\xed\xc7\x53\x4c\xa1\x15\xf0\xb1\x28\xcf\x53\x02\xf0\x83\x95\x28\x0a\xe3\x14\x57\x03\x26\xe5\xbc\x2c\xdb\x5d\xec\x5f\x7d\x61\x31\xdb\x8b\x2a\xc4\x6d\xe8\x12\xb2\xa1\xde\xe4\xe8\x45\x84\x9c\xa3\xc9\xa6\xb7\xe3\x79\x79\x3d\x9e\x9a\x55\x81\x05\x7b\x9b\xaa\x3c\xb6\x43\xdc\xf4\x8c\xda\x27\xee\x41\x08\x35\xad\xde\x27\x5e\x58\x14\x71\x0f\x85\x0e\xef\x5c\x0a\xd3\x4e\x02\xae\x78\xaf\x80\xe3\x11\x8c\x92\x7d\xdb\xa6\x24\x12\xd4\x0e\x02\x97\x13\x8e\x6d\x14\xa7\x1c\xbf\x22\x1a\x4f\xfb\x12\x95\x8a\x47\x1f\x29\x16\x44\x99\x12\x3e\xa3\x9b\x25\x47\x51\x93\x88\x06\x32\xc6\x6f\x85\x4c\xd3\xab\x62\xf6\xc0\x6e\xf6\x56\x92\x94\xa1\xc7\x23\x2b\x5d\xba\x63\x7f\x4f\xc3\x04\x51\x92\xd7\xc2\x01\xd6\x6c\x75\x02\xf3\x22\xe6\xa5\x48\x9f\x69\xc8\xe9\xa6\xe1\x36\xb6\x2f\x49\x91\x68\xa4\x62\x85\x7c\x2e\xdd\x00\x62\x31\xc3\x18\x19\x73\x80\x98\x4d\x6f\x57\x88\x58\x42\x84\x67\xe1\xee\x8f\x7a\x73\x1c\x3e\x15\x0f\x05\xa6\x22\xcf\x59\x01\x87\xff\x30\x09\x87\x71\x78\x3f\xe2\xd2\x0b\x94\x0d\x9c\x62\xad\x3c\xce\xad\x61\x27\x21\x42\xd4\xa7\x3f\x30\x29\x1f\x40\xb1\x6b\xde\xac\x2f\x80\xb4\x4e\xf3\x9b\x01\x25\x4e\xe1\x73\x19\x96\x43\x08\xd2\xb3\xcd\x30\xc5\xa0\x0d\x86\x2f\x5d\xa2\x48\x46\xc2\xea\x2c\xb7\x96\xd3\xa2\xcc\x73\x76\xf0\x3c\xbf\xfd\xdf\x20\xc1\x12\x49\x46\xd1\x42\xd8\x2d\x7f\x7b\xe9\xdb\x4d\x11\x84\x11\x4e\xc0\xaf\xd8\x9d\xbe\x8c\xcb\x47\x8a\x6a\xf2\x95\xe7\xe7\xf5\xf0\xd4\x4a\x00\x41\x8a\x8b\xd5\xcb\xc3\x7c\xfd\xf0\x7b\xbf\x91\x78\x29\xc5\x46\x43\xd9\xb8\xd5\xdc\x4a\xce\xca\x1a\xbc\x20\xe2\x49\x9d\xc7\xd5\x69\x26\x8d\x90\xb5\x36\x0c\xf1\x53\x8d\xb0\x9f\xaf\xf7\x87\xe5\x93\x36\x39\x03\xd7\xc8\x63\x44\x0a\x62\x7e\xe5\x40\x0e\x8e\xef\x8a\x79\x24\x10\x24\x35\xba\x83\xe8\xf0\x39\x80\xe2\xe7\x15\xdb\xed\x51\xc0\xb0\x3c\xf1\xa3\xca\x1a\xd8\x35\x57\xe5\xbc\x83\x7f\x4e\xbd\x1e\x12\x28\x5d\x4e\xdf\x0e\x0b\x2d\x2e\x3e\x7a\xb8\x50\x00\x26\x6a\x2d\x00\x7c\xdb\xbb\xc5\x10\x38\x86\x40\xd6\x9b\xa5\x8e\x42\x1e\x76\xfb\xd9\x2f\x76\xe9\x25\x51\x22\x03\x65\x00\xa8\xd6\x15\x79\x2a\x6b\x8c\x55\x5c\xae\x4d\x57\x89\xda\xf6\x15\x1c\x74\x66\x6c\x63\xc8\xfe\x6d\x0b\xa1\x89\x6f\x2c\xa7\x5d\x56\xc1\x78\xfd\x26\x44\x46\x08\xe4\xac\xae\xda\x26\x89\xbc\xe9\xb0\x07\x21\x4a\xb3\x1f\x1c\x2e\x5a\xee\x4a\x83\xd2\x5f\xe0\x63\xf4\xc4\x71\x14\xe3\x6e\x64\x00\x33\x8f\x00\x3d\xe4\x68\xdb\x1e\x87\x68\x83\x3d\xfd\xef\xe2\x7f\xdd\x6f\x69\x28\x34\x60\x09\x58\xb5\x3b\x83\xb5\x7d\x09\x0d\x14\x96\xaa\x36\x59\x93\x23\x23\xdd\xf0\xe6\x29\xa5\x71\x0f\x51\x06\xe2\x64\xe3\x22\x5f\xb9\xbf\x84\xa6\x09\x92\x0d\x66\xa2\xdc\x35\xe5\xe5\x02\xf2\x19\x0b\x26\xf3\x9b\xbb\xae\x64\x5a\xc2\x2c\x67\xe2\xad\xdd\xb3\xfb\x88\xc3\xd1\xd9\x12\x2f\xc5\x85\xda\x39\xf1\x08\x01\xd1\x09\xf7\x1e\x8a\xbb\xed\x29\x00\x4d\x96\x76\x89\x5e\xb0\xfa\x64\x43\xa5\x24\x55\xaa\x07\x97\x7a\x81\x8f\x7d\x79\xad\xd8\xb9\xa7\xe7\x68\x6d\x52\xc2\xfc\x00\xbf\xa7\x01\xf1\xee\x1a\x60\xb9\xbd\xfb\x60\xb0\x2c\x10\x46\x3d\x8c\x86\xfc\x6b\xff\x34\x61\x67\x11\x9e\x00\xd6\xd3\x1e\xec\x02\x3d\xb0\x49\x08\xe7\x2c\x8a\x1d\x46\xca\xa0\x0c\x90\x05\xb3\xf7\x44\x22\xa2\x68\xf0\x67\xa2\x0c\x9e\xd9\x4f\xf7\x33\xe5\xf8\xd9\x9c\x44\xc4\xbe\x1c\xd7\x64\x99\x9e\xd2\x0b\x51\x52\xc2\xa0\x67\x7a\xe1\x44\x22\xbd\x38\xc1\x4c\x7a\x79\x2d\x4c\xae\x00\xb7\xe7\x5f\xa1\x6e\x9c\x8d\x41\xc0\x97\xdc\x04\x47\x91\x5f\x5f\xb9\x9c\x06\x81\x90\x73\xcf\x8a\xc5\xd6\x99\x98\xb3\x3c\x2f\x9b\xd6\xdb\x0e\x3d\xcc\x73\x0f\x07\x13\x24\x01\x16\x2a\x9d\xca\x8f\x67\x56\xf4\x31\xd7\xcc\x23\x4a\x68\x07\x7f\x51\x66\xc5\x53\xd9\x34\x23\x03\x8d\x28\x21\xa0\xcf\xe4\x74\x8f\xcd\x1b\x7b\x17\x71\xfb\x81\xda\x53\xfe\xb1\xdf\xcf\xbf\xa0\xf9\xed\xc7\x0d\x62\x4f\x46\xe8\x7b\xfe\x92\xe5\xf9\xee\x23\x6b\xc4\x69\x59\x1c\xd9\x71\xc8\x22\xd4\xf6\x03\xcd\x56\xa8\x79\x86\x4c\x25\xb9\xff\xb5\x33\x11\xfb\x94\x49\x57\xcd\xf0\xcc\x7e\xf6\x2a\x19\xda\x56\xe0\x4c\x97\xc4\x95\x97\xb2\x06\xc3\xdc\x35\xba\x6e\x10\xa7\xa1\x41\xdf\x3d\x96\x9a\xa0\x4a\x7f\x34\x13\x5e\x1d\xbe\xf2\x38\x48\x08\x56\x7d\x2c\x4e\xac\xca\x9a\xdb\xaa\x40\x6b\x0b\xea\x7a\x78\xe9\x40\x6a\xf1\xda\xfd\x7a\x3f\x7b\x3a\xec\x66\xfb\xf5\xee\xbb\xcd\xb1\xc6\xa1\xd4\x62\x12\x28\x21\xf8\x0f\xfb\x8e\xff\xe9\xfe\xe8\x4f\x89\x38\xf2\x75\x66\x5c\x27\xae\xda\x8d\x7e\x32\xcf\x18\x47\x51\x82\x71\x92\x79\xf9\xf6\x76\xdb\x94\xe5\x9c\x9d\x7e\x5c\xff\xfc\x0e\x95\x1d\x5c\x31\x61\x01\xd6\xb8\x77\x6b\xf3\xe3\x6c\xb5\xff\x7e\xff\xbd\x47\x2f\x39\xf6\x52\x94\xc0\x31\x3c\x55\xbb\x9c\xbd\x4f\x6b\x37\x31\x2f\xa6\x91\x8f\x89\x30\x5d\xe1\x64\x82\x57\x66\x69\x83\xfa\x1f\xa3\xe0\x4e\x9c\x44\x81\xf1\x88\xce\x2c\x2b\xba\xa4\x66\x9c\x40\x22\xf5\x35\x8b\xf7\xec\xde\x58\xfd\xe4\x4e\x13\x90\x9c\xf4\x93\xee\x56\x4b\xce\xb4\xa7\x44\xe9\xbd\x0f\x73\x2e\xe6\x3d\xd6\xbd\x56\xe1\xd4\x22\x56\xa2\xb4\x95\x0f\xcc\x8b\x99\x88\x31\x1c\x93\x9b\x75\x75\x0b\x82\xf5\x98\x4b\xee\x90\xeb\x78\x08\xa0\x97\x31\xdb\x2f\x16\xba\x72\x31\xef\x1e\x8f\x53\xe0\x5e\x8f\x07\xc3\x04\x85\x3f\x95\xe1\x61\x5e\x2c\x08\xc3\x7b\x3f\x97\x45\x73\xca\x6f\x7d\xab\x32\x16\x4c\x0f\xa8\x1e\xbc\x6e\x87\x10\x32\xf9\x55\x85\x05\x1e\xc8\x71\x42\x5b\x45\xb8\x6a\x3a\x7b\x1a\x0b\x90\x58\xf9\xb1\x5d\xee\x96\xdb\x5f\x97\x87\xa7\xf5\xe2\x97\xc3\x7e\xf5\x6c\x77\xfe\x58\x7a\x09\x82\x09\x44\xbb\xf5\x37\xee\x57\x53\xa3\x7e\xac\x98\x80\x9e\x98\x45\xdb\x24\x63\x6c\x82\x33\x54\x47\x28\xc4\xed\x31\xbf\xd6\x27\xd7\x0a\x11\xea\x39\xb6\xc6\x75\x32\x78\x86\x64\xb0\xb8\x80\x97\x22\x90\x7b\xa3\x8b\xbc\x77\x23\x1c\x72\xdb\x83\x24\x18\xd3\xcb\xea\xad\x0e\xe7\xca\xc7\xb2\x5a\x94\xe7\x4b\xce\xb2\x82\x8d\x13\x11\x31\xa8\x48\x19\xfc\xbf\xfe\x1a\xe8\x51\x85\xe6\xbe\xa8\x1f\x88\xd0\x40\xa5\xea\xad\xd5\x53\x71\x6d\x12\xd1\xf3\x7d\xa6\x76\xd3\x14\xb4\xae\x91\x5e\xf1\xbf\x37\xb9\x30\xc1\x45\x0d\xd7\x9e\x40\xa8\xb7\x47\xc4\x9c\xda\xc8\x85\x8e\x69\x98\x6a\xcd\xfe\xee\x4c\x5b\x5b\x0e\xe5\x28\xe4\xfb\x80\x82\x94\x79\x34\x0a\xe2\x58\xab\xc2\x4c\x81\x25\x06\xef\x88\x46\x92\x68\x7e\xd4\xc2\x40\xef\x3b\xc8\x30\xf3\x28\x49\x35\xcd\x3f\x52\x80\x95\x45\x63\x81\x80\x93\x23\x8a\x12\xf0\x63\xd3\xfb\x7a\xf9\x74\xda\x76\xf3\x84\xc6\x52\x6b\xa7\x14\x65\x93\xa9\xdb\x52\x6f\xec\x3b\xc8\x73\x0d\x72\x98\xbe\x4a\x0c\x01\xa2\xd5\x1f\x46\x2c\x4f\xcc\xa3\x34\x0c\x7c\x13\xbd\x6f\xaa\x4c\x34\xaf\x45\x93\xe5\xae\x91\x70\x0c\xdf\xcf\x5e\xed\x06\x66\x1b\x62\x46\xd2\x1e\xe9\xa5\x59\xcd\xfb\x2b\x31\xa5\x54\xcb\x53\x64\xa2\xd4\xa3\x62\x59\xc8\x87\xce\x38\xa6\x94\x07\x69\xd2\xbb\x32\xc2\xc6\x6d\x9b\x88\x51\x12\xec\x98\xbd\xc3\x36\x3b\x9e\x1a\x2c\x42\x1b\x7e\x86\x44\xd1\xd0\x90\xa9\xe3\x1a\x53\xe6\xc3\x88\xbc\x19\xf4\x34\xf5\x04\x37\x55\x9a\x8f\x15\xc0\x9f\x13\x78\x4b\x86\x94\x8f\xa1\x0e\x29\xb5\xa6\xef\xbd\x9a\x81\xe9\xc6\x03\x2f\x56\x76\x07\x75\x38\x7d\x67\xac\x50\x1e\x44\xb1\xa6\x51\x28\xdf\x61\x35\x26\x8f\x32\x9d\x84\xaf\xe5\xb3\x6a\x1c\xad\xef\x77\xc0\xce\xb6\x4b\xa4\x2c\x97\xde\x9e\x5d\x1c\xa5\x86\xbd\x8c\xa0\x5a\xa2\x70\xf9\xf2\x80\xeb\xca\x6e\x3f\x7b\xde\x74\x8d\x02\x6c\xb5\x61\x2f\x8a\x44\x45\x02\xb8\x4a\x88\x8e\xcc\xe9\x2e\xdd\x4f\x45\xea\x23\x8b\xb0\x96\x33\x71\x4f\xb8\x3a\x5f\x72\x84\x9a\x30\x57\x44\x6e\x0e\x90\x2c\x49\x8c\x62\x69\x5e\xde\x85\x5f\xcc\x22\x34\xfa\xd5\x6e\x68\x54\x32\x86\xf2\x22\x05\x7c\xd8\x54\xea\x70\xe4\x02\x93\x34\xb4\xe4\xfb\xb9\xd4\x75\x36\x23\x5c\x11\x55\x1e\xc3\x91\xf4\xb0\x7c\xdc\xae\x77\xfb\xc3\xec\x71\xbf\xdc\x1e\x5a\x7f\xf6\xbb\x4d\xc4\x51\x15\x32\xa2\x27\xf8\xac\x69\xa0\x90\x63\x83\x8a\x2a\x63\x4b\xbe\x5e\x8e\x36\xfc\x66\xd5\xf8\x83\x10\x07\xf9\xf3\x84\x40\xd9\x57\x54\x31\xed\x49\x89\xd2\x85\x9f\x50\x80\xca\x44\xc6\xaa\x9b\x5b\x1c\x55\xa2\xfc\xb4\x03\xe4\xb4\x8b\xf1\x40\x1f\xa7\xed\x22\x3c\xcd\x25\x5f\xbe\xc3\xbe\xdc\xee\x6c\xea\x25\xf1\x82\x08\xe9\x56\x74\x00\xab\x2c\xf3\x81\x39\x95\x78\x61\xc2\xc1\x0d\x30\x24\x68\x90\x56\xab\xa7\x07\xb1\x6e\x7b\x8a\xc4\x52\x82\x3f\xb1\x33\x2f\x9f\x4b\x09\xf9\xf0\x1b\x24\xbe\x12\x78\xa3\x9d\xbc\x80\x8a\xed\x95\x02\x2f\x40\x78\x74\xbb\x02\x7d\x5a\x7e\x32\x3c\x5d\xe0\x73\x0c\x85\x3a\x0a\x9f\x49\x03\x2d\x09\x42\xdf\xf7\x3b\x36\x1c\x4b\xbd\x3e\xbd\xe3\x26\x41\xaa\x77\x36\x99\xbd\x67\xad\xd5\xca\x6f\xde\xe8\x29\x02\x91\x20\x95\xca\xc3\x72\xf6\xf0\xb4\x7a\xb1\x5b\x71\x12\xfa\x0a\xe5\x33\xe7\x2f\xf3\xf9\x5f\x23\x58\x92\x30\x06\x4b\xf7\x6b\xee\xa4\x82\x4f\x36\x8a\x24\x14\x1c\xd9\xdb\x8c\xb0\x5f\x3d\x16\x47\x1d\x9e\x39\x32\x44\xdd\x07\x63\x38\x6e\xd1\x62\xfe\x94\x8a\xbd\x3d\x82\xb2\x74\x54\xa4\x3d\x21\x82\xdc\x76\x64\x0a\x3b\x62\x9c\x64\xc2\x80\x9d\x08\x3a\x26\x11\x00\xed\xd8\x88\xb6\x9a\x60\xe0\xd8\x23\x57\x36\xfd\x88\x9f\x06\x89\x31\x3d\xa1\x6a\x0e\x9a\xa6\x2b\x2b\x8b\x43\x53\x1e\xfa\xf8\xed\xe1\x2d\x91\x80\x23\xd0\x6a\x77\x2b\x2c\x10\xbe\x97\xd9\x4a\x48\x9a\x20\x08\x16\xce\xd9\xfd\x10\xd6\xb0\x13\x39\x01\xc2\x67\x5e\x42\xe3\x08\x8f\x64\x15\x8a\x0c\xf4\x9d\xd9\x84\x52\x2d\x31\x7b\xee\xd1\x1c\xb5\x3f\x27\x21\x5a\xfa\xcf\xe5\x7b\x06\xa2\x83\x7a\x27\x94\x09\x24\x73\xba\x40\xf5\x00\x4c\x3e\x65\x45\x77\x0c\x03\xc3\x15\x64\x62\x02\xda\x5e\xd3\xce\xf3\xac\x90\xad\x8b\xff\x69\x82\x2c\x49\x43\x50\xc1\x1d\x2b\x88\x6d\x24\x80\xc1\xf2\xa7\xf2\xf8\x6a\x32\x82\xa6\xc4\xe8\x73\x29\xba\xf6\x30\x05\x18\x21\x7a\xcb\xf2\xfc\x50\xa3\xeb\x68\xcf\xc8\x98\xde\x6a\x5f\xe0\x43\x5f\x6a\x26\xff\x73\xad\x9b\xf1\xae\x93\x70\x3f\x42\xdc\xbe\x21\xe9\xd1\xd6\x53\x97\xb5\x4e\x78\x18\x22\xe1\xc1\x72\x61\x7f\x11\x26\x04\x7c\x84\xe6\x31\x63\xfd\x82\x95\x7f\xdc\xcb\xb7\x31\x2f\x91\xa1\x42\x14\x08\x9a\x4c\xe5\xe5\xaf\xd2\x18\x63\xcd\xe4\x7f\x0e\xf7\x8f\x44\x2a\x4a\x3d\xb7\xa5\x6d\x75\x3a\xe8\xf6\x58\x95\x67\xfb\xf7\xe8\x09\x21\x54\x9e\x29\xe7\xd0\x96\x4b\xfd\x5c\x76\xa8\xff\x04\x12\x1e\xc6\x76\x7b\x7f\xbc\x16\x03\xab\x24\x01\xe9\x63\x46\x35\x2b\xb2\xe6\xb5\xa8\x1d\x13\x20\xf3\x12\xe5\x73\xcf\x18\x44\xb3\xaa\x7a\xcd\x8a\xe6\x31\x83\x5c\x06\xae\x3d\x89\x70\x96\x60\x98\x02\x2f\xfc\xa3\x62\x97\xcb\xdd\x17\x50\x82\x59\xd2\xcd\x57\xc7\x68\x14\x0d\x5f\x62\xea\x85\x14\xb3\x7d\x43\xea\x19\x73\xa9\xd4\xf7\x34\x82\xb5\x2c\xf2\x9b\x5d\xa7\xd3\x20\x00\xe4\x73\x40\x79\x10\x9b\xe7\x1c\x63\xa9\xd2\x80\x32\xd4\x85\x73\x09\x67\x69\x6c\xef\x7a\xdc\x31\x15\xd2\x50\x9f\xbe\x3b\xbe\xd8\xf6\xb5\x8f\x23\xc0\xd3\x63\x35\x0d\x18\x04\xc4\xe2\xe3\x5c\x59\x98\xbd\xd9\x88\x69\xda\xa0\xd6\x09\x61\xd2\xce\x8b\x94\x44\x2c\xea\xec\x97\x25\xab\x5a\x8b\x68\x7c\x67\x71\x48\x34\xa3\x56\x97\x69\x5b\x2d\x66\x9b\x7f\x8c\x07\xd4\xf4\xb8\xb3\x27\x49\x62\x11\xf5\x18\xa4\x07\x21\xb1\x34\x06\x8d\x1f\xe1\x79\xb3\x85\x86\x65\x05\xc8\x99\xb0\x08\xd2\x94\xa6\xa1\x66\x65\xd0\x58\x15\x70\xe9\x92\x34\x61\x5e\x64\x39\xd2\x58\x21\xad\x80\xe9\xca\x8e\xbe\x34\x8d\x69\x9a\xda\xb7\x32\xbf\xe6\xb9\xfb\xa6\x29\xd5\xb8\xb0\xed\xfa\x69\x79\xd8\xce\x67\x8b\x9e\x64\x5f\xdb\x9c\x46\x38\x6c\x97\xbb\xf5\x66\xb8\x90\xa6\x29\xd3\x55\xd3\x46\x47\x5f\xcb\x00\xd8\x36\xe9\xd9\x62\x12\x2c\x0d\x59\x15\xad\xf7\xff\x09\x80\x23\x4d\x21\xe6\x23\xad\x4e\x9b\xe4\xdd\xb6\x0b\xfe\xe8\x43\x30\x8f\x60\x81\x8e\x51\xf0\x82\x29\xda\xf3\x4f\x46\x07\xf3\x21\xd0\xc0\x4f\x96\xb7\x86\xc5\x1d\x12\xf2\x93\xc5\xa2\xbf\x9d\xa6\x0c\x3c\xe4\xd2\x67\xbc\x7e\xc8\x7a\x51\xfe\xe1\xa5\x78\x98\x22\x7a\x10\x71\xec\x8b\xeb\xe5\x2f\x54\x2f\x07\x57\xe0\x14\xd0\x8c\xc7\x69\x68\xdc\x4e\xc7\xe9\xca\xbc\x54\x08\x86\x50\x76\x64\xe2\xb4\x93\x6e\x52\xab\xa6\xed\x0c\x9a\x69\xf5\x50\xeb\x64\xd0\xd7\x91\x88\x54\x46\x01\x22\x49\x5e\x99\xe8\xb8\x3e\xfe\xaa\x8c\xeb\x2f\xfe\xb5\xab\x6a\x2a\x23\x9d\x23\xd1\xac\x42\x7b\x38\x5f\xee\xd9\xea\xdb\x6e\xa9\xf0\xd2\x61\xc5\xf5\xb6\x6f\xa1\xf5\x8a\x70\x52\x29\x65\x64\x80\x60\x88\x7a\xef\x1b\x12\x3d\x37\x2c\x95\x52\x45\x43\x09\xad\xed\x91\x8f\xaf\x0b\x01\x86\x8d\x3f\x61\xfa\x19\xcc\xf4\x09\xac\xb3\x7d\x4a\x08\xa5\x67\xb9\x47\x4e\x59\x2e\xf5\x1c\x1f\x98\x95\x29\xa4\x02\x0b\xa4\x30\xc6\x35\xcf\xa4\xbc\x2b\xcb\x48\x55\x1c\xa7\x66\xb7\xfe\x06\xcd\x73\x59\x00\x16\x63\x7e\x51\x0e\xdc\x1e\x94\xc4\xe8\x3f\x63\x3e\xdc\xc9\xbf\xda\x81\xa3\x78\xd0\x53\xc5\xed\xe5\x82\xbe\x1c\x95\x13\x64\x4d\xcc\x63\x9e\x0c\x43\xab\x8c\x30\x7b\xf9\xfd\xf0\x63\xf6\xf4\xb4\xb4\x7e\x04\xf3\xbd\x24\xe8\x34\x5c\x34\xf0\xf1\xd7\xd7\xcd\x74\x4c\x8d\x05\x9c\x58\x67\xec\x93\xfa\x34\x16\x08\x1f\x5f\x58\xeb\x33\xfe\xca\xf2\x5d\x76\x67\x8c\xb2\x40\xc5\x81\x19\x36\x16\x62\xbf\x9a\x2c\xbd\x65\x1e\x0b\x43\x0a\x26\xae\xb3\x83\xe6\x7a\x19\x6f\xc9\x2c\x04\x11\x4b\xcb\x63\x82\x29\xf6\x46\xe3\x40\x4e\xac\x1a\x5f\x38\x12\x3c\xd6\xa1\x8e\x77\xa8\xd8\xd0\x65\x62\x91\x4c\x11\x10\xc6\x59\x23\x4e\x6e\xb2\x6e\x77\xf3\x7b\x73\xd9\x1c\x41\x84\x44\x8d\x8d\xf5\x1b\xbb\x64\xfd\xe8\x08\x8b\x53\x1d\xcd\xb6\x08\xbc\x7d\x06\x95\xff\x5a\x0f\xa0\x48\xb6\x2b\xa4\x38\x8f\x2d\x82\x6b\x88\xc8\x61\xd4\x0f\x7d\x31\x66\xbb\xd7\x10\xf8\x47\x96\xd7\x5d\xbf\x20\x45\x7f\x50\x01\x68\x62\x55\xfb\x7b\xac\x03\xa7\xe2\xc4\xda\x05\x14\xaa\x7a\xc8\xc3\xdb\x76\x91\x02\x07\x9b\x25\x7c\x3c\xf8\x18\xee\x83\x2e\xa8\xc1\x28\x68\x6c\xd6\x37\x76\x86\x05\xae\xc7\x7f\x07\xec\xcf\x12\x2f\xb2\x48\xe3\x65\x73\x7a\xad\x07\xa9\x7d\x96\xc4\x12\xdd\x40\x03\x31\xd7\x61\xa4\x32\x97\xa5\xab\x93\x61\x09\x44\x98\x1f\xb7\x40\x7e\x9b\x91\x30\xcd\x29\x21\x9e\x36\xa2\x59\x3b\x2f\x51\xdf\xed\x20\x7a\x3b\x35\x4b\x13\xcd\xf0\x85\x48\x33\xcf\xfe\xca\x58\x62\x18\x58\x1c\xe1\xfd\x73\x56\xf4\x9e\x97\x07\x09\x9a\xc1\x8d\x3a\xba\x9f\x42\x0f\x41\xb0\xf3\xf6\xf5\xbf\xfd\xe6\x7e\xa6\x1e\x4e\xfe\x43\x56\x2f\xca\xf6\xe6\x3f\x0a\x6d\xb2\x4c\xae\xda\x8c\xa7\x31\x09\x7b\x80\x09\x7c\x69\xff\xfe\xbf\x4e\xe8\xac\xf7\xd7\x97\xcb\xd9\xf8\xbc\x52\x67\x6e\x98\xde\x6b\xcb\x11\x4e\x90\x89\x88\x1a\x1a\xe3\xd6\xec\x86\xeb\x79\x5f\xde\x33\xae\xb5\xfd\x08\xa5\x8e\x56\x62\x5e\x96\xcd\x6d\xdc\x81\xeb\x0a\xaf\xd6\xcc\x1d\x44\xfb\x98\xf4\x22\xd1\x59\xe2\x1b\x4d\xbe\xb5\x5a\xac\xed\x2d\x48\xe2\x63\x02\xf4\x97\x97\xf5\x0f\xfb\x1b\x30\x19\x49\x07\x87\x87\xa6\x6f\x65\x31\xe5\xf9\x9a\x65\x17\x2b\xcc\xbe\xdc\x0d\x99\x0a\x03\xac\xb4\x6c\x4e\x59\x65\xbc\xc4\x61\x62\x96\x29\x49\x43\xbf\x87\xc3\x99\x8c\x39\x30\x05\x1a\xce\xd4\x7a\x9d\xbd\x8a\xf9\x9e\xab\x39\xea\xaf\x38\x06\xaa\xaf\x3a\x66\xf4\xfd\xdb\x7e\x78\x42\xee\xc5\x7e\x6a\xe0\x88\xeb\x02\x10\xb0\x58\x34\x1d\xbf\xc7\xb8\x77\xea\x43\x64\x99\xc6\x1f\xdb\x59\x36\xfa\x40\xdc\xe7\xa1\x26\x4d\x44\xa9\xb8\x1d\x34\x2b\xc4\x53\x4f\x8e\x0a\xee\xab\x18\x23\xec\xdf\xac\xbd\x79\x58\x15\x24\x18\x9d\x31\x48\x92\xb8\xd3\xde\x99\x15\x72\x7e\x6d\x0d\x72\x13\xcd\xbf\xde\x96\xcd\xe9\xaf\x0a\x8f\xa6\x07\x25\x0f\xd2\xd4\x0a\x4f\xf6\x62\xea\x83\x30\xed\xf0\xf1\x03\x0e\x82\x77\x94\xdc\x56\xcc\xce\xf2\xf0\xda\xd1\xcc\x43\x5f\x12\x03\x0e\xdb\x30\xf1\x56\xef\xcb\x17\xf8\xd9\x20\x21\xd8\xb5\x83\xed\x5b\xdd\xc0\xf6\x00\xae\x39\x50\x5f\x7e\x9d\xdf\x51\x11\x30\x8f\x47\xa1\xd6\xe4\xb0\x82\xec\x3b\x4b\x57\x68\xcd\x00\x1e\x85\xcc\x5a\x25\xba\x8a\xb8\x03\xef\xf2\x88\xe8\x82\xb7\x66\x6c\xe0\xcd\x8c\x40\xe9\xe8\x23\x47\x69\xa2\x59\xfa\xea\xfa\x0a\x13\x32\x40\xcc\xe3\x84\x78\x1a\xd9\x92\xe7\xed\x92\x3b\x1e\x04\x44\x28\xa2\x7a\x4e\x2f\xe6\x69\x2a\xe7\x45\xd5\x0f\xa6\x5e\x4a\x8e\xe2\x05\x7d\x1b\xc8\xac\xd7\x5f\x46\x2f\x79\x4c\x42\x87\x07\x35\x1f\x61\x25\xe7\xb7\x89\x12\x6a\x4e\x3d\xc0\x28\xb0\x60\x97\x1e\xd9\x78\xdb\x10\x4b\x74\xda\xfe\xb7\xbf\x43\x72\x9a\xc6\x8e\x68\x17\x7e\x36\x3b\xf8\xef\x15\x0a\x01\xce\x15\xe2\x54\x0a\x14\x0d\x74\x6e\xdc\x1d\x25\xd3\xf4\xfa\xd8\x5f\x93\x38\x05\x1d\x63\xca\x6a\x54\x4e\xc8\x8a\xa3\x96\x58\x5c\x15\x86\xd8\x76\xca\x62\xe2\xd4\x20\x91\x8d\x3a\xbd\x65\xb5\xe9\x16\xd5\xe9\xd1\x9b\x50\x69\x14\x45\x6b\xb8\x9e\x6b\xcd\xa0\x63\xda\x52\x48\xa4\x2b\xe9\xee\xf2\x52\xeb\xa2\x9f\x39\xe2\xa9\xd2\x08\x79\x23\x1d\x74\x75\xdb\x3b\xe7\x41\xa8\xd3\x85\xf8\xc5\x1f\x01\x6d\xde\x13\xb0\xe6\x07\xab\x3e\x13\x28\x69\x0f\xa3\x04\x83\x33\x07\x26\xe5\x2e\x3b\x4e\xc3\xd7\xb8\x20\x14\xdd\x18\x8c\x51\x33\x31\x22\xba\x6e\x3b\x28\x61\x19\xcb\x5a\xf7\xe6\xb5\xca\x06\x4b\x3f\x97\xbe\x8e\x57\x9d\x4a\x99\x77\x8e\xce\x27\x8b\x92\x0c\x85\xf7\x35\xe8\x71\x0a\x3e\xc8\x25\xf7\x70\x06\x36\xad\x29\x85\x18\x3e\xfb\x6e\xa4\x90\x08\xbe\x9d\x2f\x10\x55\xd3\x1b\x64\x12\x28\x58\x60\x54\x6b\x0e\xf6\x35\x06\x7e\x64\xcd\xa9\xb3\x61\x07\x46\x3f\x97\x90\x62\x04\x91\x5f\x6f\x8b\xcc\x6c\x81\xd6\x91\xe1\xe0\xc5\xca\x95\xca\x75\xe5\xb5\x1c\x02\xad\xcc\xd8\xfa\xd0\xa3\xe9\x0c\x10\x61\x92\x63\x5e\xdd\xf2\x3c\x6b\xe0\x53\xc9\x9f\xb6\xaf\x62\xa9\x89\x3c\x68\xa5\x89\xe9\x2f\xab\x3c\x82\x28\x8c\x03\x8e\x95\xfd\xa9\x82\xfa\x54\xba\x42\x6c\xae\x28\xd5\x2b\x04\x2b\xec\xe7\x98\x83\x1a\xc9\x59\x33\x4f\x78\x3e\xe0\x4a\x2a\xb3\x77\x4d\x02\xe7\xcc\x33\xe1\x51\x0f\x8d\xab\x59\x25\x30\xf1\xda\x7f\xb3\xc2\x37\x4c\xf5\xdf\xaf\x25\xcf\x36\x65\x9f\x9a\xb7\x6d\x15\x2c\x8c\x3a\x26\xe7\xd5\x27\xcf\x2a\x7c\xf0\x31\xaf\x70\x45\x69\x92\xc7\x6b\x21\x2b\x96\xd5\x5d\x96\x4b\x84\x81\xc4\xe2\xc0\xfd\xf6\x79\xf8\xce\xbe\x74\xd2\xed\xc1\x24\x02\x66\xa5\x1d\xcf\x66\xc2\xa9\xf5\x05\x8a\x07\xe8\x36\x13\x11\x72\x11\x1b\x0e\x99\xf5\x3b\x54\x2a\x2f\x3f\xe6\x18\xf2\x99\x7e\xf3\x22\x0a\xc0\x12\x14\x6d\xd6\xeb\xa7\x03\xc8\xac\x39\xf8\x36\xce\x27\x48\x4c\x59\xd0\x87\x95\x19\x01\x2f\xdb\x4c\x01\x97\x35\xfc\x6c\xce\x71\xef\x07\x65\x44\x1c\x05\xb8\x68\x9d\xaf\x79\x93\xa1\x92\xf8\x54\x39\xc2\xa7\x6e\xad\x88\x63\x5d\x67\xf7\xc7\x72\xbb\xee\xd1\x96\x88\x38\xe6\x08\x4b\x39\xb3\x9f\xfa\x9e\x16\xac\x6e\xf2\xee\xb2\x10\x13\x18\xca\x12\xf5\x73\x09\xfe\xc8\x33\x13\x34\x04\x14\x75\xfe\xfe\x30\xfb\x0b\x05\x73\xe6\x89\x24\xa6\x08\x69\x63\xad\x95\xa7\x37\x48\xdc\x44\x9c\xcb\x2b\x12\x26\x7d\xaf\xcb\xf6\xb8\xf8\xa3\x2d\x12\x9e\x5e\x74\x45\x22\x74\xb6\x12\xce\x97\xe6\xb6\xe8\x56\x05\x91\x80\x87\x90\xbd\xd6\x71\x5a\xb0\x62\x07\x85\x5c\x36\xa7\x8e\x07\xe9\xc7\x09\x0a\xf7\xfe\x3b\x54\x92\x3d\x3c\x25\x80\xe8\x11\x43\x36\x8a\x6c\x4f\xc7\x1e\x73\x8c\x48\x63\x88\x4c\x25\x27\xc2\x24\xb1\x54\x62\xcf\xaa\xa3\x43\x36\x8a\x94\x72\x44\x68\x5d\xd8\xcd\xb0\xf1\xdb\x86\x54\x20\x8a\xe7\xa2\x63\xab\xc8\xec\x39\x95\x27\x16\xad\x93\xa9\x05\xfb\xc5\x5b\x5e\x1e\x07\x28\x4b\x21\x20\x94\x41\xcf\x78\x5e\xc9\x09\x99\x02\xe6\x09\x09\xbe\xf2\x1c\xdb\x1b\x3e\x73\x7f\x58\x40\xa4\xa5\xbf\x2f\x55\x76\x63\xee\xc7\x84\x61\x94\x7c\x97\x15\xc7\x1c\x74\xb9\x96\xf9\x26\xcd\xcd\x75\x12\x1c\x29\xeb\x54\x56\xc8\xf5\xd5\x49\x82\xcd\x6f\x73\x56\x7c\x4a\xab\x67\x8e\x55\x9e\x2f\x51\x24\xa4\x2c\xa0\x2a\xbf\x75\x4b\x97\x50\x3e\xc5\xc8\x32\xc3\x09\x8b\x12\x88\xae\x3c\x6b\x32\xc2\x21\x54\x92\x10\x3a\x0c\x43\xb5\x3b\x24\x1f\x99\x4d\x42\x71\xe1\x73\xc7\xa8\x94\x97\xb7\x26\x3b\x03\xae\x6d\xee\x8f\xa2\xe3\xfe\x6e\x0f\x10\x7e\x1a\xf7\x60\xcb\x05\x54\x37\x8d\x09\xc7\x14\x78\x7f\xcf\x90\x5e\x44\xd0\x73\x98\x5d\x2e\xf9\xa0\xb2\x4d\x7a\xdc\x0f\xa5\x2b\x65\x78\x9b\x94\xd7\x1e\x7c\x76\xe9\x71\x88\x06\x70\xd3\xa1\xdc\x74\x0f\xdb\x20\x3d\xd0\xb4\x81\xfc\x9a\x99\xd8\xea\xa8\xd0\x4d\xfa\x81\xcf\x52\x63\x2c\x97\x79\x26\x3e\x71\x4d\xa5\x2f\xc1\x44\x65\x0a\xb9\x03\x90\xb3\x42\xf6\x79\xe0\x87\xe9\x56\xe9\xab\x54\x73\xae\x68\x3a\xf3\x95\xa9\x13\xfe\x42\xa6\x95\x79\x32\x0c\x88\x66\x65\xbd\xb0\x8f\xc2\x18\xd8\xc3\x6f\x29\x43\x43\x36\x70\xd0\x25\x1d\xaf\x45\x61\x82\x7c\xd5\xc8\x46\x96\x51\x2c\xd0\xe0\xb4\x24\x54\x06\x3e\x80\xd5\x4a\x5d\x98\x25\xbc\xf3\xa3\xff\xed\x07\x9f\x00\xf7\x24\xa1\x89\xd2\x96\xf9\x0e\xaa\x77\x4b\x1f\x39\xb0\x75\x64\xec\x11\xc4\x31\x33\x29\x17\x50\x35\x99\xca\xb4\xa6\xe5\x43\x29\xae\x7a\x32\x8f\xd6\xab\xe1\x7b\x8b\x43\x45\x4d\x62\xbe\x6f\x8d\x3c\x67\x45\x76\x36\x4c\xfe\xd6\xd2\x90\x94\x73\x9f\xdb\x52\x36\x8d\xad\xbc\x0f\x98\xca\xc4\x03\x34\x2e\x32\x73\xe1\x97\xf2\x53\xa6\x1c\x99\xf8\x5a\x37\x6e\x51\x16\x35\x14\xcd\x63\x36\x86\x7f\xc9\x84\x6a\x4c\x1f\xbf\x56\x45\xbb\xef\x0c\xa0\x29\xe3\xb3\x25\x91\xa5\x47\xd0\x74\x0a\x3b\xcd\xec\xd4\x19\x11\x32\x31\xc9\x87\x83\xb6\xa5\xad\x22\xfc\x97\x7e\xa3\x4c\x78\xc4\x3b\x16\x19\x13\x10\xb3\x8c\xfb\x3d\xc6\xad\xfe\x3c\x48\x78\x84\xe3\x11\x43\xed\xcf\x59\xd1\xf4\x50\xf8\x32\x01\x4d\x34\x8a\x9a\x8b\x97\xb2\xcc\x87\x71\x24\x99\xc6\x71\xea\x82\x6c\x59\x81\x23\xca\xd8\xfa\x2f\x65\xf3\x07\x54\x96\xdc\x44\xb2\x50\x83\x84\x66\xc2\x7e\xb5\xe2\x38\x49\x3a\x25\x19\x95\x81\x61\x4a\x68\x1b\x0d\xa9\xc1\xf0\x65\x73\x8f\x61\x9a\xa3\xca\x8e\xa7\x26\x1a\xae\x56\x92\x27\x11\x2e\x02\x8f\xc1\xeb\x66\xf6\xbb\xbd\x01\x2e\x13\x24\xaf\xd1\xf1\xe8\x76\xc9\xd2\xbc\x5d\x87\xae\x03\xa0\x19\x9a\x97\xc7\xd6\x56\x0f\xbe\x5e\x87\xa5\x88\x39\x52\x0f\x39\x58\xe1\xc6\xd5\x04\x49\x01\x3a\x91\x5e\x94\xcd\x29\x2b\x8e\x4f\x19\xb7\x2d\x32\xa6\x49\x3b\x32\x7f\x5d\x0c\x38\x17\xa4\xe4\x11\x6e\xf3\x06\xea\xfd\x0b\xb8\x73\x49\xf0\x30\xce\x3c\x53\x0d\xe3\xbd\xed\x47\xaa\x94\x20\xd1\xfe\x07\x02\x7b\x70\xb8\x0d\x63\x57\x52\x89\x18\xeb\x2b\x1e\x56\x8b\xe5\xe1\x69\xfd\x63\xb9\x35\x2d\xe0\xc5\x02\xfd\x76\x53\x4d\xfb\x3d\x3b\x9e\x6a\x51\x3a\x00\x2f\x78\x22\xf4\xa9\x23\x52\x94\xb0\x56\x0a\xa1\xa8\x5a\x64\x62\xf8\xbe\xc1\xf7\x3c\x74\xdf\x56\x59\x56\x94\x78\x87\x13\x18\x6d\xf7\x16\xa7\x5e\x26\xf8\xb1\xd6\x4a\xc6\x5c\x38\x86\x73\x3b\xfe\x1b\xdb\x45\x45\x81\x91\x3d\xb0\x5c\xe3\xa3\x0c\x30\x04\x21\xe0\xf0\x2f\x2f\x50\xcc\xec\x32\x0e\x01\xe3\x56\xd3\x16\xc9\x97\xb4\x09\xf7\x8d\x9d\x3b\x7c\x17\x44\x92\x4a\xe3\x3b\x3c\xb3\x22\x53\x50\x37\x2b\x59\xcf\x6f\x2f\x3d\x86\xcf\xe1\x7a\x04\x84\xe8\xd0\x87\x31\x45\xf4\xb8\xfe\x7a\x7e\x02\xe1\x3c\x36\xf1\xfb\xcd\xca\xd8\xbf\x74\xb0\x4a\x02\x81\x24\xf0\x4d\x7d\x66\x25\x5b\x7b\x7b\x81\x92\x4a\x5b\x60\xf5\x27\xe7\x37\xc1\x87\x49\xf1\x1e\xe6\x41\x6c\x72\x6d\x47\x6b\x3f\xda\x87\x8e\x59\x64\x93\xaa\x3a\x7d\x01\xd5\xfe\xa7\x59\x68\x9e\x17\x3f\x3e\x79\x6e\x1a\x44\x88\x97\x36\x0b\xeb\x2f\x45\xf9\x61\x94\x51\xbe\xc4\x2e\x01\xe5\x11\xc2\x70\x73\x56\x9b\x00\xe3\x0e\x5c\x90\x11\x12\x1e\x63\xb4\xbd\x39\xc1\xc1\x9c\xe7\xa0\xca\xea\x50\x22\x55\xf8\x61\xe6\xfa\xc9\x00\x87\xf4\x40\xf0\x7f\xd2\xa7\xb1\x07\x80\x42\x1b\x62\x07\xcd\xeb\xee\x61\x03\xd5\x72\xff\xfd\xc0\x6f\xe3\xbc\xa8\xe9\xcd\x3c\x40\x17\x55\x94\x45\xdd\x54\xba\xb0\xae\xef\x32\x03\x33\x9a\x8c\x3b\x74\x8d\xce\x5b\xf8\x18\x9f\x81\x11\x69\x89\x37\x71\x86\xaf\xea\x7e\xd5\xb1\x91\x48\x19\x8e\x5b\x4e\x24\x3a\x46\xb3\xd5\xf6\x61\xbb\xde\x0c\x79\x30\x40\x44\x60\xf1\x11\xaf\xf9\xff\xcb\xdb\x9b\x34\x37\x8e\x63\x6b\xa0\xff\xe5\xae\x72\xd1\x0b\x02\xe0\x78\x77\xb2\x24\x3b\xd5\xe5\xa9\x2d\x39\xb3\xaa\x3b\x3a\x14\x18\x0e\x6c\x5e\x53\xa4\x8a\xa4\x9c\xe9\xfe\xf5\x2f\x78\x30\x70\x10\xe5\xac\x7e\xf1\xe2\x6d\x2a\x2b\x4c\x90\xe2\x00\x1c\x9c\xe1\x3b\xdf\xd7\xe6\x07\xde\x3a\xb0\xb9\xa7\x1a\x74\x11\x0c\xc8\x44\x23\xb4\xc6\xa5\x7e\x1e\x87\x92\x51\xee\x82\x2a\x94\xe8\xe0\x77\x46\xf8\x0e\x3e\x55\x3c\x99\x95\x34\xe9\xb7\x50\x50\x71\x82\xbc\x40\xeb\xb6\x3a\xf2\x8f\x7b\x40\xdc\x90\xff\x1d\x9e\x61\x7a\xcf\x27\xa2\xe6\x88\x1f\x46\x53\x55\x49\x8a\x20\xa3\xb2\x7a\xd0\x98\x07\xef\xef\x59\xc6\x48\xeb\xff\xbc\x5d\xb5\xd5\xd7\xc5\xb7\xc9\x5b\x57\x52\x21\xb4\xb7\xdb\x7c\xfb\x7d\x8e\x04\x81\x43\x10\x00\x90\x08\x29\xea\xf2\x06\x17\xc1\x43\xed\x84\x9a\xe6\xcb\x67\xa0\xd3\x18\x0b\x19\x57\xc5\x69\xe4\x94\x82\xce\x08\x56\xbb\x5c\xd1\x67\xed\xe3\x0a\xd0\x60\x78\xff\x0f\x7b\x69\xa8\x60\x73\x18\xc1\x1f\x74\x60\x65\x59\xdc\xec\xab\x4c\x6e\x4e\x0f\xd9\xfb\x67\xa3\x35\x1d\x84\x92\xd9\x84\xcc\x6f\x79\xdb\x7e\x20\x3d\xc7\xf8\x25\xe8\x00\x32\x4c\x5d\xac\x56\x7f\xbf\xda\x39\x98\x91\x26\x91\x48\x13\x5f\x51\xab\x3f\x10\xd2\xe1\x8e\xc5\x31\xb6\x22\xa2\xe7\xb1\x85\x0b\xc9\x30\x4d\x04\xc7\x4e\xb2\xbc\xc1\x1c\xc0\xc0\xfb\xc2\xca\xa2\xbb\x1a\x0d\x81\xbb\x4d\xa3\x6a\x79\x31\xae\x93\x4c\xae\x19\xf2\x0c\x9d\x6b\xcf\x01\xe0\xae\x12\x2a\xe6\xe8\x25\x4c\xea\x1d\x51\xf4\x9f\xf1\x39\xe9\x88\x2a\xee\x45\x88\xee\x30\x75\x72\xd6\x7d\xa3\xa3\x98\x60\x37\xd6\xda\xb4\xde\xd9\x9e\xad\x73\x86\x35\x1d\x13\x86\xf1\xf4\x35\x7f\x83\x27\x28\x1c\x61\x88\x3d\x9a\xd0\x0c\xfd\xb2\x47\xde\x34\xc3\x79\xa1\x93\x34\x42\x1c\xbd\xd1\xd8\x13\x15\xaf\x95\x3f\x24\x84\x61\x2c\x01\x9b\xd7\x6e\x76\xd5\x42\xbd\xe7\x4d\x35\xf5\xcd\x75\x4a\x53\xdc\x78\xfb\x7e\x31\x9d\x0a\x40\x67\x11\x9f\xce\x32\xb2\x58\xe7\x4d\xf3\x40\x63\x52\x64\xe9\xec\x55\x55\xef\x86\xda\xd2\xe3\xf7\xc4\x33\x16\x78\xc1\xb3\x01\x58\x4f\x73\x1d\x73\x97\x99\x31\x3a\x28\x67\xce\xcf\xf8\x36\x05\x09\xb3\xc4\xb3\x28\x39\x0f\x7e\x32\x1f\x45\xa2\x31\xba\xbc\xb9\xf3\x55\x73\x2d\xc3\x2c\xb3\xa0\xfd\xdf\xbf\x8c\x46\x43\x4c\x31\x6b\xb6\xfd\xba\xa0\x51\x3c\xda\x14\xb5\x26\x49\x60\xba\x6d\xcc\x47\x73\xd4\x73\xc3\xcf\x7c\xe1\x4e\x35\x24\x42\x0c\x0a\xca\x9b\xf2\x1e\x7e\xdc\xf1\xfa\x0d\x5a\xa3\x9a\xe1\xc6\x69\x85\x8b\xa7\xe6\xa5\xfa\x32\xde\x4e\x71\x04\x09\x82\x04\x62\x0f\x49\x35\x3b\xd8\xae\xf2\x4e\x1f\x09\x08\xa3\xdc\x4a\x50\x15\x82\xcb\xb7\x1b\xde\xf4\x87\x0c\x34\xcd\x18\xf6\xfd\x6a\xb3\xdd\x3d\x6d\xae\x9e\x77\xeb\x95\x1f\x91\xc4\x18\xbd\x19\x6f\xdf\x60\xb5\x51\x52\xd8\x1d\x97\x86\xfe\xaa\x8b\xb7\xf7\xbe\xce\x4b\x02\xa2\x13\xd9\x2b\xe2\xfb\xa4\x2a\x09\x28\x35\xb2\x5a\x37\xa7\xce\x21\x1c\xbc\x4d\x12\xd0\x8c\x6b\x4b\x62\xaf\x76\x79\xe1\xb3\x54\xa3\x7f\xdc\x58\x48\x79\xe4\x54\x9d\x5b\xa8\x8f\x55\x5e\xb6\x5f\x26\x4e\xc8\xe8\x35\xb1\xcc\xf4\xe7\x5c\xe5\xed\xf6\xb5\x3a\x1e\x47\x94\x48\x24\x08\x33\x89\xfc\x13\xff\xac\x8a\xea\xa7\xff\xa3\x92\x2a\xec\x39\x72\x4d\x49\xf0\x1c\x31\x4b\x82\x10\x22\xe8\xbd\xa3\x7b\xf8\x61\xa2\xac\xb9\x4f\x4f\x82\x28\x49\xb1\xb4\x89\xc2\x00\x33\x79\xe3\x5f\x49\x3b\x72\x12\xc4\x8c\x06\xb6\x85\xd3\xfa\xa5\xae\xd4\xdd\x1d\x53\xd4\x16\x28\x87\x42\x57\x73\x08\x30\x12\xc4\xa9\xe9\x5b\xb0\x59\x31\xd7\xae\x76\x10\xbc\x69\xb8\xaa\xea\x5e\x41\xaa\x1b\xac\x04\x76\xf6\x4f\xc8\xb5\x48\xd3\x9e\xb5\x1d\x91\x20\xd6\x01\x22\x70\x91\x7b\x75\x71\x68\x27\x19\x6d\x12\x24\x59\x66\xf2\xff\x5d\x8c\x86\x11\x1a\xb2\x01\xfa\x62\x9b\xaf\x3a\xb8\xf1\x12\x30\x43\xcd\x1d\x6e\xfc\xb9\xcd\x0b\x9f\xbc\x22\x41\x9a\x98\x8e\xa9\xed\x9f\xa7\xbc\xae\xa1\xb8\xc9\x0f\x7e\xa2\xa7\x69\x84\xdb\xf4\x72\xfd\xd0\xff\x29\xd3\x96\xf6\xc6\x05\x8f\xe7\x4e\x6b\x9f\xa0\x1a\xbd\xfe\x2c\x0a\x2d\x1a\x04\x7d\x4d\x97\x23\x71\x47\x79\x90\xda\xfc\x8c\x59\x30\xf3\xaf\x3e\x13\xa9\x70\x9d\x54\xcb\x79\x45\x28\x4e\x02\x9e\x24\xa9\x01\xce\x21\x81\x41\x8f\x1c\xb2\x2c\x6f\x76\x98\x20\x81\x8e\x5c\x47\x4c\x0e\xa5\x6a\xae\xf3\xf2\x05\xea\xc6\xdc\x41\xb7\x57\x5d\xc2\x94\xb9\x2b\x30\x8d\x85\x6f\xa4\x3d\xdb\x3f\x2e\x9e\x76\xf7\x2e\x2e\x23\x81\x00\x30\x51\x7f\x3b\x20\xd4\xf9\x9e\xb7\xaf\x86\x8c\xb8\x9c\xf1\x13\x66\x1c\x29\x12\xc8\x40\x63\xd5\x0c\x41\x8f\x77\xcf\xb7\xbb\xcd\xc3\xf7\xc1\xcf\xc8\x30\x34\xd2\xb1\x24\xb5\xbc\x6e\xee\x80\xe2\x99\x69\xac\x18\x36\xe8\xcc\x3f\x88\x0a\x35\x26\x90\x6d\xb1\x8f\x1f\x27\xaa\xb0\xdd\x90\xd8\x10\x66\x55\x1a\x3b\x38\x8a\x1d\x14\xd0\x13\x86\x90\x40\xa5\x01\x76\x92\xff\x79\xca\x5b\x5b\x57\x1c\x7f\x15\xc5\x35\x86\x28\x37\x75\x75\x3a\xda\xb6\xe1\xfc\x42\x92\x86\x04\x10\x44\x98\x58\x3f\x22\x3f\xb6\xcd\x0c\x39\xe9\xe5\xee\x78\xac\x10\x49\xcc\x6b\x91\xb7\xc6\x49\xb8\x46\x26\xf2\xbf\x9f\x9c\xbe\x53\x37\x4a\x1a\xaa\x1f\xab\xc9\x38\x20\xc7\xfe\x57\xf8\x79\x4e\xac\xf7\x13\x48\xe7\x92\x46\x86\xe6\xa8\x84\x9a\x17\x8f\xa7\xfa\x58\x21\x23\x8a\xce\xdb\xed\xb1\xc8\xdb\xb6\x5f\x71\xa0\x09\x66\x33\xbe\x7f\xff\x3e\xb2\x95\x3a\xd0\x8e\xb5\x0e\x21\xd1\x73\xb8\x70\x12\x74\x71\xb1\xc9\xbd\x39\x39\x18\x7f\x7e\xc8\x38\xf3\x9b\xc3\x78\x22\x77\xfe\x50\xd0\xe3\x95\x9b\x0b\x76\x4b\x4b\x46\xb5\xe3\x87\x6b\x5a\x5e\xfa\x44\x71\xdf\xc8\x44\x48\x10\xc4\xac\xc7\xc2\xdd\x3c\x3c\xce\x25\xe5\x09\x09\x98\xc6\xb6\x33\xde\xb6\xf5\xf3\xf3\x66\x35\xbf\x14\x49\xa0\x0c\x9f\x08\x02\xbb\x3c\x5c\x80\x10\x92\x09\x8c\x27\xfc\x5e\x37\xf0\xad\x09\x21\x22\xc0\xec\xb7\x4d\x23\x1a\x31\xb7\x5d\x75\xaa\xf3\xe6\xf0\x97\x50\x57\xdd\x25\xb8\xf0\xe0\xf0\x6e\xf7\x1d\x02\x61\x08\xa1\x94\x99\xfc\xba\x91\x6e\x1b\xe3\x0f\x26\x18\x37\x42\x58\x60\x88\x78\xcd\x3b\xd9\xc1\xe1\x58\x18\x94\xc8\xa2\x79\x43\x46\x9e\x01\x2a\x71\xa6\x39\xe1\x2c\xa8\x77\x97\x25\xa6\x47\xd2\x85\x1f\xdd\x8e\xc0\xdc\x1d\x32\xa1\x31\x47\xf2\xcf\x0d\x7a\x1a\xee\xcf\xa1\x88\x10\xa9\xbb\x37\xf7\xf2\xcf\x4a\xe5\xfc\xd7\x5c\xe4\xf3\x1f\x27\x8a\x0c\x9d\xbd\xf1\xfc\x1e\xea\x97\x91\x6f\x41\xa2\x48\x47\xd2\x14\x80\x31\xc7\xb6\x5c\xf9\xbb\x88\x52\xe9\x9a\xbb\x6d\xd1\x67\xf9\x0a\x3d\x5f\xe1\x19\xc4\x62\xf4\x7f\xee\x1a\x59\xca\x52\x5f\xeb\x32\x3d\x89\xe3\x19\x4b\x22\x30\x5a\xbc\xdf\xf2\xba\x1d\x85\x6e\x84\xc4\x49\x68\x7a\xa1\xf3\xf7\x29\x98\x8f\x90\x38\x53\xe8\xbf\xef\x8f\xfc\x63\xac\xe1\x33\xff\x22\x92\x30\x45\x3b\x6e\x29\x63\x6e\xae\xe6\xa1\x9f\x84\xa4\x4c\xe1\x74\xbe\xce\x7f\x82\x32\xc8\xc9\xd1\x5d\xa5\x29\x44\xf1\x08\xb7\xbb\xca\x3b\x7b\x79\x2a\xfc\x9e\x4b\x52\xc1\x71\x0f\x73\x5f\xdd\xa5\x83\xdd\x61\xc9\xe9\x30\xa3\xbf\x6d\xe1\x38\xf7\x5e\xdd\x70\x4d\x43\xbb\x71\x9e\x2b\xc9\x70\x42\xb2\x80\x63\xae\xd6\xfd\x1a\x32\xf9\xcd\xc0\x6d\x08\xc9\x92\x18\xb9\x93\x2c\xc5\xd1\xa0\x87\xc5\x89\xbd\x1e\x4f\x86\xf0\x71\xfc\x4e\x32\x6e\x74\x30\x5e\xa0\x6d\x2b\xc5\x3f\x7c\xed\x8f\x10\xce\x05\x0a\xd4\x58\x5b\x32\x50\x26\x99\x9b\x17\x93\x77\xcd\x45\x82\x1a\x55\xfa\x54\xaa\x66\x57\x2d\x1d\x3b\xf4\xe4\xe7\x05\x17\xe8\x84\xde\xcc\x8a\x35\xcd\x58\x06\xa5\x33\xa4\x92\x7b\x2c\x78\x09\x98\xd7\x1e\x7d\x42\x20\x71\x18\xf5\x31\xb6\xf1\x1b\x8c\x50\xfa\xf8\x7d\x01\xa5\xca\x58\x98\xd5\x94\x9d\x9d\x10\x48\xb4\xab\x23\xef\x73\x59\x95\xf9\x9f\x7b\xdb\x4d\xb4\xaf\x8e\x83\x1f\x53\xc4\x15\xed\xae\xf2\xba\x7d\x3d\x7f\xbb\x3a\x55\x08\x86\xbb\xae\x0e\xa3\xfb\xa4\x41\xac\x1c\xdb\xe7\x73\x03\xf5\x2c\xe7\x10\xa1\x41\x92\x04\x69\xff\x51\x57\x4e\x40\xdd\x5f\x45\x2b\x9c\x8c\x8a\x7f\x9c\xf7\x9f\x11\x4a\x02\x8e\x49\x4e\x28\xd5\x46\x56\x7d\xdb\x32\xa1\x84\x08\x39\x44\xec\x2e\xf9\xe1\xc8\xf3\x17\x7f\x7b\x44\x19\x66\xc9\xce\x53\xbd\xe6\x79\x81\x55\x59\x54\xf4\x34\x94\xec\x5b\x7e\x80\x4d\x0b\x07\x87\x75\x22\x94\x42\x80\x30\xd7\xda\x68\x79\x60\xce\xc8\x59\x43\xca\x02\x82\xbe\xda\xb1\xae\x0e\xd0\xbe\x0e\x77\x0b\xca\x68\x82\x6d\xdd\x06\x0d\x88\x12\x18\xfe\x01\x58\x68\x30\xe4\x7b\xc4\x55\x7a\x0c\xd3\xfc\xf2\xa6\x2c\x8b\xb9\xf5\x6f\xef\x87\x32\x3a\xc3\xac\x29\xa1\x4c\x32\x4c\x3f\x55\xc3\x78\xc5\x1e\x0b\x09\xc5\x32\xf3\x72\xb1\xdb\x3f\xae\x9f\xf6\xeb\xdd\xd7\xfd\xd5\x62\xbb\xde\x3f\x2d\x76\x6b\x77\x53\x21\x63\x9a\x0f\x10\x7e\xe7\x94\xd5\xdd\x18\x8e\x41\xe2\x21\x2f\x5b\x4b\xe8\xd4\x4c\x87\x64\x29\xa6\x27\xf1\x3e\x4c\x95\x0e\x65\x53\x27\x53\x20\x92\x29\xb5\x61\xba\x65\xf4\xc2\x2f\xfd\xfc\xb4\x19\x99\x7b\x1a\xf7\xe1\xbc\x36\x94\x26\xb3\x6e\x04\x8d\x65\x84\x5f\xf6\x66\xb1\xdd\xef\x1e\xf6\x8b\xe7\xdd\xd7\x87\xa7\xcd\x3f\xd7\xfb\xf5\xef\xeb\xe5\x73\x4f\x32\x4f\x68\xac\x62\xa4\x1f\x92\x45\xe7\x2e\x59\x72\x96\xc9\x43\x24\xd2\x60\x68\x6e\xab\x17\x5b\xbb\x74\x80\xc7\xc9\xcf\xa6\x21\x95\xd2\xa1\x42\x3f\x06\xf9\xa8\xd4\x0e\xc8\x88\x46\x7c\xd6\xa8\xcf\xe4\xd3\x16\x1b\x42\xb3\x94\x19\xd8\x0b\xbe\x88\x35\x32\xab\xcc\x04\x2f\x34\x93\xc2\xbc\x9b\xd3\xe1\x60\x25\x57\x2d\xcf\x9e\x1b\x00\xa6\x13\x6c\x0b\xad\x41\x11\x6d\xa1\x28\xae\xce\x3f\x2b\x8f\x28\x66\xce\xb9\x53\xce\x77\x17\xe0\xb1\xe9\xbb\xfe\xed\x8f\xa5\xfb\x93\xa4\x51\x6c\xd4\xb4\x61\x3d\x10\xce\xea\x8e\x24\x4a\xa5\x7d\x83\xa2\x9f\xd8\xf3\x25\x67\x42\x25\x57\x49\xe0\x29\x6a\x3b\x7f\x6f\x34\xa1\x15\x35\x18\xf4\x6e\x8f\x58\xd5\xfc\xc7\xae\x7a\xac\x2a\x73\x7f\x67\x06\x89\xaa\x04\xd0\x2f\xf9\x7e\x1a\x54\xb0\x08\x55\x3c\x45\x31\x86\x15\xbc\xe7\x8d\x77\x87\x29\x84\x34\x73\x72\x21\x79\x23\xf3\x23\xa6\xcd\xfd\xd1\x28\x32\x84\x1d\x55\x51\x6c\xfc\x7a\x86\x2c\x4e\x02\xcf\x98\xbe\xde\x7d\x1d\x4a\xea\x4d\xee\x06\x20\xc1\xc6\x6d\x93\x6d\xb8\xe3\x79\x89\x9d\x68\xf5\x64\xf2\xe8\x38\x83\xc0\xe3\x9e\xe7\xf3\x98\x84\x91\x48\x24\xbd\xc0\xdc\x63\x9d\x4b\x8f\xc2\x22\x8c\xf2\x24\x8d\xbc\xbb\x32\xae\x08\x1b\x26\xeb\x3e\x62\x60\x94\x1b\x89\x0f\xa7\xf2\xd3\xf0\x69\x38\xc4\x28\x17\xa9\xe7\x8d\xb1\x0a\xc2\x83\x6f\xcc\x28\x30\xd6\x0b\x18\xac\x00\xd4\x88\x88\x76\x72\xeb\x2c\x25\x46\xd6\xc2\x42\x10\xfa\x66\xc2\xe1\x8c\x88\x43\x3b\x3c\x0c\x23\x0c\xb7\xdf\x91\x62\xaa\x67\xe1\x1c\x87\x85\x2c\x4c\x62\x0c\x66\xda\xfd\x5d\x2e\x5f\x79\x5e\x50\x77\x77\x51\x20\x51\x18\xc3\x82\xdb\x1e\xeb\xea\x08\x75\xdb\x27\x22\x6c\x1e\xea\x5f\x24\xb0\x8e\x0a\x8b\x49\xc4\x4d\xde\xaf\xe9\xa2\xa7\x2b\xe0\x93\x8f\xc4\xe2\xc8\x70\xa0\x29\x78\xdf\x37\x6d\x0d\xfc\xd0\x0c\xb1\x3e\x84\xc5\xdc\x08\x04\xbe\xa0\x66\x2c\xd4\x5f\x79\xf3\x7a\xa6\x8c\x42\x58\x2c\xc3\x30\x1d\x77\xe8\x75\xab\x31\x2f\x5f\x3e\x7b\x83\x19\xa1\x98\x06\xed\x2c\xf6\xf2\x76\xbd\x70\x01\x36\xcb\x14\x18\xed\x23\xe3\x26\x7f\xfd\x10\x75\xae\x6c\x51\x73\xf2\xcb\x3c\x91\xd0\x4f\x20\x6c\xa7\xaa\x61\x92\x23\x71\x43\x81\xc0\xa4\x8d\xb0\xf9\x32\x97\x84\x63\x92\x86\xe8\xaf\x5c\xe5\xed\x6b\xb7\xe6\xac\x1b\x34\x74\x06\x98\x8c\x52\xac\x8b\x16\xd5\x4b\xb7\x28\x17\xa6\x09\xb8\x3e\x0b\xf7\x27\xcf\xac\x68\xc2\x7a\xbe\xf8\x47\xde\xe6\x50\xb6\x5f\x81\x17\x86\xe0\x60\xbe\x0b\xd0\x9d\xcb\x0c\x4b\xae\x02\x07\x18\x37\x6f\x7a\xd0\x71\x4d\x98\x4a\xc1\x76\x90\x76\x91\x73\x3b\x61\x76\x20\x0c\x18\x8b\x86\x92\xaa\x4f\xa0\x6d\xc9\xe7\x4c\xa6\xc3\x9e\xa1\x33\x83\xd5\x34\x9c\x42\x86\x4d\xd0\x57\x41\x48\x18\x44\x11\xce\xd8\xbb\xbc\x78\x5b\x56\x63\xca\x3e\x12\x06\x3c\x4e\xcd\x6b\x92\xbc\x40\x78\x8b\x47\x69\x90\x30\x80\x10\xac\xcb\xb6\xaa\xab\xe3\x7d\xd5\xe6\x9e\xe6\xa9\x3b\x9a\x64\xb2\xd7\x2b\x3e\x9c\x0e\x2b\x10\xbe\xdf\x7d\x3c\x0f\x42\x12\x98\xad\x34\x2f\xdb\x6e\xe2\xbd\x40\xd9\x1e\x78\xd3\x74\x4b\xa8\x1c\x7e\xb7\x90\x48\x88\x4d\xe1\x19\xf5\x30\xb0\x34\x3f\x02\xc2\x8d\xaf\x4b\x83\x30\x10\xc8\xab\x57\xb8\x2b\x50\x15\x1b\xf2\xd1\x46\xf2\x23\x7c\xe5\xdd\xcb\x1f\x3f\x74\x18\x53\x7c\xe8\xdb\xdf\xfe\xf8\x15\x44\x91\x84\x61\xaa\x79\xe2\x9b\x82\x4c\x9a\xc1\x3c\xa2\xfd\x2e\xee\x77\x43\xce\xd0\xa2\xfe\x70\xda\xa5\x7f\x99\x36\x9a\x84\x51\x60\x10\x0b\xbf\xaf\x9e\x16\x6e\xb7\x0b\xa3\x30\x65\x76\x8f\x42\x95\x82\x1e\x34\x30\xda\xac\xc2\x28\xcc\x10\x43\xd1\x37\x36\x5b\xf7\x68\x4a\xa1\x3c\xf9\xcd\x98\xa1\xd8\x90\xe5\x43\x38\x07\xef\x93\x30\xca\x0c\x91\xb9\xb1\xb8\x86\x53\x64\x8c\xb3\xe9\xc7\x26\x49\x26\xb3\x3e\x7f\x60\x32\x86\xee\x51\xb2\x20\x42\xd1\x89\x15\x5c\x4a\x51\x86\x59\x60\x02\x49\x07\xca\x40\x90\xd9\x2f\x1a\x4a\xa6\x97\x48\x12\x87\xa6\xef\x4b\xfe\xcb\xe1\x2b\x70\x03\x53\x1d\x79\xf6\xd8\x7d\x0d\x8d\x97\xf3\x22\x21\x8f\x62\xb4\x95\x98\x71\x0e\xe8\xa0\x3e\x4e\x42\x91\x26\x89\x29\xb7\x74\x21\xd8\xfa\x1d\xea\x0f\x51\xb9\x3e\x74\x14\xf7\xf0\xbd\xac\xbb\x87\x59\xc6\x9b\x31\x4e\x8f\x84\x92\x19\xb5\x58\x75\x03\x6d\xe7\x62\x7c\x39\x4d\xb8\xb9\x48\x28\x33\x01\x5e\x43\xcf\xc6\xd0\x9b\x6e\x87\x1a\x3f\xbc\xd4\x2c\x1b\x1a\x16\x9b\x84\x5f\xf2\x5a\x0d\xe1\x63\x24\x54\x24\xc3\xd6\x41\x6c\x24\x78\x3c\x89\x22\x97\x83\x6c\x57\xa8\x42\x9a\x0c\x67\xd3\x95\x57\x3d\xbb\xf0\xe1\x54\x1c\x61\x51\xaf\xfd\x01\xd0\x6e\xda\x91\x0b\x1d\x42\x67\x43\x0c\xc7\x68\x77\x43\xee\x4d\x41\x9a\x62\xea\x5b\xe7\xb5\x05\x12\x2c\xf9\xd1\x1f\xe4\x99\x34\xde\x4e\xa1\x9d\xea\xcd\xca\xf5\xb4\x77\x87\xb9\x25\x06\x3d\x3a\x60\xab\x3d\xa2\x25\x41\x9d\x7b\xde\x59\x2b\x50\xbb\xd7\xbc\xf9\x0e\xf0\xe6\x0f\x6b\x8f\x07\xbd\x32\x0b\xe8\x8c\x6b\x7a\xb4\xb0\xa2\x40\x00\xbe\x0a\x35\xa8\x09\x1b\x75\xc2\x61\xb4\x15\xd1\xd0\x18\x42\xc7\xcf\x72\x0f\x3f\x07\xd8\x5f\xa8\xfb\x3d\x96\xd0\xd4\x9d\x23\x28\x46\x4c\xcf\xbf\x7d\x77\x97\x61\x9d\xa5\xf9\x9f\xff\xfd\x9f\x5d\xde\x16\x30\xa6\x21\x23\x11\x8b\x29\x92\xde\x2c\x5a\x2e\x87\xf6\x32\x62\x82\x61\x4e\xfb\x9f\x00\x8f\xce\x94\x5e\x4a\xa2\xff\xc5\x7f\xed\x95\xc3\x20\x44\x7a\x2c\xb3\x75\x3f\x97\xb9\xac\xea\x72\x80\xe2\x23\x51\x18\x85\xc2\x82\x84\x06\xb9\x91\x33\x07\x39\x0a\xb9\xc9\xb8\xb8\xd2\xf9\x4d\xe5\x71\xf6\x24\x0a\x25\x98\xd2\x84\xa9\x1d\xcd\x47\xed\x51\x24\x40\x58\x99\x64\xa8\xbb\x9d\x58\xf0\xe6\x82\x6f\x1f\xc5\x12\x12\xdf\x7e\xff\x04\xf9\x41\x9c\xea\x06\x54\x9f\x2a\x8f\x92\x38\x8b\x9d\x10\x6d\xaf\x34\xfd\x50\x16\x1f\x83\x95\x10\x25\xa9\xc2\xa6\xcc\xf5\x3b\x60\xc7\xdb\x8e\x97\xe3\xee\xed\x89\x07\x13\x25\x99\x99\x08\x25\xb4\x16\xc3\x62\xbc\x98\x6d\x55\x4c\xf6\xc3\x28\x0d\x34\xa6\x72\x14\x3f\xf4\xa5\xb1\x28\x25\x06\x1e\xe5\xd6\xde\xf7\xd7\xaa\x98\x7a\x42\x93\xeb\x58\xed\xbf\xa6\xe5\xed\xa9\xf1\x6d\x95\xdd\x81\x18\x9d\x91\x82\x37\xed\x2d\x3f\xfa\xa4\x42\x94\x85\x8a\x1a\x26\x5a\x93\xf8\x70\x2a\xf1\x9f\xe6\x03\xa3\x4c\x46\x68\x15\xb9\x6d\x97\x30\x37\xd5\x59\xac\xa5\xbf\xb0\x34\x52\x1b\x2f\xb6\x7d\x1b\x50\xcf\x19\x41\xc0\xfa\x82\x3b\x1d\x71\x4a\xd1\xeb\xbe\xe1\x07\x07\x1e\x72\x47\xd2\x98\x74\x2f\xff\x5b\xd5\x9a\x4c\xf8\x63\xb7\x90\x2a\xd9\xa7\x62\x22\x9e\x71\xa4\x2e\xe9\xa2\x09\x28\x25\xf7\x7f\xd7\x86\x5d\xe9\x09\x8e\x45\x2e\x07\x06\x22\x12\xa1\xa2\xca\x13\xdb\x76\xa6\xf1\x8c\xd3\x62\x72\x83\x22\x62\x58\xf6\x3e\xd6\xb0\x3f\xe4\xe5\x28\xee\x72\x43\xb2\x24\xb6\xf9\x46\x03\xe9\x58\x16\xbc\x69\xbe\x8c\x66\x86\x10\x0c\x09\xe9\xad\x28\x7a\xc5\xeb\x31\x88\x7a\xfc\xa3\x92\x24\x48\x55\x6a\xc8\xcd\xab\xfa\xb6\x1a\xe7\xa1\x23\xa9\x0c\xe8\xaf\x8b\xbb\xd6\x4f\x4b\x1a\xfc\x05\xf6\x0c\x12\xa9\x28\xc3\xbd\x06\xd7\x85\xa1\xd2\x1d\xd7\x1c\x23\x25\x08\x12\x96\xef\x5d\xaa\xd5\x5c\x77\x46\x6a\x8a\x44\xc0\x32\xe2\x04\x67\x5d\x51\xf0\xb9\xcc\xff\x3c\x01\x92\xf1\x36\xb3\x00\x3b\x12\x07\x69\x64\x6e\x62\x1e\x0a\xe7\x20\x03\x71\x90\x85\x18\x2f\x8a\x53\x5d\x1a\x40\xc3\x1d\x7f\x83\xda\x8b\x63\xb8\x61\x42\x61\x16\x0c\xbc\x83\x34\x92\x72\x22\x31\x89\x43\xea\x34\x62\xae\xf2\xf6\xa1\xde\x9e\xe4\x60\x12\xc5\x24\x96\xd8\xac\xff\xca\x9b\xeb\x1a\x00\x5f\x47\x7d\x97\x97\x4f\xbc\xcd\xcb\x97\x66\xe4\x3d\xcc\xbf\xd7\x98\x86\x99\x09\x87\xba\x19\xb2\xdf\xcf\x47\x53\x31\xe5\x09\x62\xfb\xb0\x5e\x8f\x51\x61\x31\x6d\xf4\x25\x31\x95\x41\x68\x0b\x0c\x06\x3a\xdd\x5c\x4f\x78\xc5\x49\xcc\x62\x65\xb8\x8d\x5b\x38\xee\x5e\x6b\x80\x2f\xa3\xdf\x61\x29\x73\xcc\x08\x96\xfd\xdc\xf9\xa1\x8b\xb6\xad\x8c\xcc\xc1\x40\x22\x87\xc4\x2c\x93\x68\x0c\xa5\x75\x99\x2c\x08\xbc\x99\xfe\x2c\x8f\x31\x69\xd6\x8b\xe0\x92\x98\xc9\x20\x0b\x6c\xeb\x90\xf1\x22\xfd\x7b\x0d\xd3\x10\x73\xe0\xbb\x57\xd8\x1c\x0e\x55\xdd\xf2\xa2\x79\x7c\xad\xda\xea\x42\x55\x68\xfc\x63\x51\xc8\x12\x53\xa9\xb5\xe4\xf5\xf3\xcb\x33\x8e\x52\x6d\x51\x29\xe5\x23\xd4\x48\x7e\x3e\x99\x76\xd3\xf2\x40\x1c\x65\x29\xc6\x43\xcf\x25\x8a\x95\xa9\xe1\x6e\x1a\xc7\x24\xe5\x7d\x0c\x6a\x14\xe0\x47\xa0\x70\x12\xc7\x4c\xa2\x75\xb9\xdb\xdc\xef\x1f\x9f\xd6\xfb\xeb\xe7\xfb\xd5\xe6\xfe\x66\x7f\xf3\xb0\xb8\xf5\x63\x42\x0e\xd4\xb1\x8c\xf3\x81\xe6\x31\x02\x21\x88\x1f\x26\x42\x24\xb1\xc7\x7e\xe5\x33\x72\x51\x7f\xc7\x09\x4d\x1c\x5c\xf9\x6e\x6c\x82\x36\x65\xbf\xa9\xc5\x69\xa2\x2c\x39\x92\x69\x66\x25\xcd\xee\x54\xfb\xdb\x4e\x55\x8a\x14\x1d\x2f\xfc\x00\xe3\x94\x76\x9c\xc5\x01\x36\xf7\x2f\x97\x5f\xf7\xeb\xd5\x66\xb7\x67\xfe\x48\xca\x48\xe4\x64\x5b\xda\x9a\x1b\x73\x60\x5d\xfb\xf1\x97\xc8\xa4\xc1\x71\x8a\xaa\x72\xc9\xac\x98\x33\xa3\x49\x8d\x1d\x6b\xd3\xfc\xe3\xb4\xfa\x15\x0b\x30\xfd\x9a\x96\xd1\xbd\x8b\x01\xce\x5c\x89\x58\xc6\xdc\xd3\x3e\x0e\x25\xc7\x26\xd7\x92\x69\x8c\x06\xd2\xd5\x78\x9e\xd0\x61\x9f\xdc\xb2\x54\x02\x5f\xff\x81\xff\xbc\xad\xe4\xdb\xea\x34\x24\x40\x25\xb1\x8a\xb2\xd8\x26\xdd\x26\xfa\x01\x76\x00\x44\x0c\x05\x41\x96\xf5\xc7\xb1\xad\xb6\xfc\x85\x2f\xab\xba\x06\xd9\x82\xfa\x0a\x75\xf7\xe5\xcf\x16\x91\x66\x49\x12\xfa\x66\x3a\xa8\xdf\x7d\xa3\xb7\x1b\xd0\x05\xb0\x03\x2f\x7e\x8f\x0b\xb6\xb3\x90\xf3\x0e\x40\x12\x50\x8a\x6d\x1e\x6f\xf0\xb1\x3e\x1c\x8b\xea\x03\xa0\xb1\xcc\x4a\xfd\xb3\x24\x81\x4d\x15\x77\x53\xa8\x79\x19\x2e\xff\x84\x24\x09\x37\x6f\xa1\x33\xb2\xb9\x95\x9f\x6f\x3c\x0e\xd2\xa7\x26\x12\x22\x62\x8c\x30\xcc\xcb\x44\x71\xc1\x79\x55\x32\x92\xd0\x20\x8c\xba\x75\xf9\xf8\xbc\xfd\xea\xa6\x7b\x42\x95\xa9\x4b\x1d\xd1\x1a\x8c\x27\x61\xc2\x08\x8b\x87\x55\xb9\x7d\x5b\xd9\x5e\x9f\x89\x5c\x27\x49\x98\xe0\x58\xb5\xef\x69\x27\xdf\x5d\x16\x2e\x09\x89\x0a\xb4\xdb\x3a\x6f\xf3\x3f\x4f\x56\x41\xf4\x5c\xa6\x8b\x24\x21\x0b\x11\x24\xb0\xb7\xe1\xdc\x4f\x09\xa0\x40\x9d\x37\x55\x0d\x4e\x09\x53\x42\x7d\x22\x76\x59\x55\xb5\xca\x4b\x97\x6f\x23\x7e\x14\x4f\xc1\x7a\x04\xf7\xf0\x63\x59\x15\x55\x3d\xda\xbf\x93\x50\x86\xd8\x2c\x74\xc8\x1d\x1d\x45\xe4\x1e\x20\x56\x09\x86\xd1\x9e\x76\xe1\xd3\xb6\x69\x92\xc4\x3a\xc6\xfe\x32\x8d\xd5\xe2\xce\xd0\x4c\x6b\xbf\x49\x12\x19\x36\xef\xbc\xb9\x44\xc2\xe6\x06\x66\x9c\xf9\x3e\x05\x28\xd4\x99\x0e\x25\x49\xd2\x90\xb0\x1e\xc9\x87\xf9\xbc\xbb\xbc\xbc\xad\x5e\xaa\x0b\x1e\x6a\x92\xc6\x69\xe0\x1a\x22\xbb\x67\xca\xab\x72\x59\xf9\x2d\x24\x49\x63\x85\xcd\x4c\x36\x5d\x0d\x4d\x33\x48\x2d\x8c\x32\x31\x49\x9a\xa4\x69\x30\xe1\x24\x1a\xe9\xe8\x9f\xb1\xe6\x93\x84\xd3\x38\x35\xf4\x76\xa5\x21\xae\x75\xbf\xcb\x33\xc0\xf9\xb6\x98\x3c\xa0\xa0\x14\xfb\x64\xd0\x49\xda\xa3\xd5\xb0\x47\x24\x4f\x31\x1c\xa8\xab\x53\x79\xc6\x3b\xe2\xc6\xc8\x04\xf5\xd3\x9b\xb6\xaa\x41\x0d\x15\x45\xed\x00\x15\x52\x04\xe9\x98\x06\xca\x89\x37\x93\xa8\x48\x87\xe1\x08\x9c\xe3\xc3\x93\xe9\x75\x12\xc2\xb8\x2f\xd3\xec\xaa\x67\xf4\x36\xc7\xb3\x4c\x29\x1a\x5b\x67\xc2\x83\xac\xea\x09\x71\x31\x49\x14\xa4\xa9\x53\xa6\x68\x79\xb1\xe9\x13\x74\xc3\x9d\x31\x81\x30\x46\xe0\xe3\xbd\x98\xfc\x9d\xd3\x48\x38\x95\xa8\x23\x56\x9c\x97\x95\x82\x91\xfb\x9b\x80\x08\xb0\x14\x82\x9b\xc8\xd7\xaa\x50\xe7\xd5\xd9\x8b\x8d\xcb\x24\x01\xa9\x33\xb0\xfc\x95\xd3\x30\xe5\x9c\xba\x62\x9e\x35\xc7\x5d\x0a\x0c\x1a\xa1\x81\xf6\x86\x37\xc6\x90\x5d\x57\x35\x6e\x25\xb7\x55\x35\xf1\x71\x13\x1d\x18\x9e\x88\xcd\xf2\x61\x6f\x54\xa3\x77\x9b\xbb\xb5\xdf\x1f\x13\xcd\x23\xc4\xec\xe8\xbc\x28\xac\xef\xcf\xeb\xe6\xbc\xa2\xef\x86\x03\x47\x46\x59\x9b\x22\x33\x2b\xff\xb2\x0a\x1d\x49\x83\x10\x90\xfb\xcd\x7e\xc1\x09\x87\xeb\x7c\xdc\x9e\x12\x61\xb4\x04\xb7\x05\x3f\x1c\xa0\x3e\xc3\x80\x93\x94\x32\x6a\x74\x13\x1a\xd3\x70\x81\x1f\xd4\x86\x5f\xe3\x6b\xd1\x98\xa3\xa2\xcb\xf2\xee\xb7\x2f\xee\x4f\x8a\x1b\xee\x25\xe4\x26\x1e\x50\x65\x91\x94\x25\x26\xb4\x5c\xf6\xe9\xc2\xc9\xf5\x18\x64\x58\xf2\x58\xd7\x75\x55\xbb\xc5\x3e\x9c\xb4\x69\x98\x30\x6c\x34\xb4\xa5\x4f\xcf\xec\x6a\xa7\xcb\x5f\xeb\x28\x20\x69\x98\x0a\x64\xaf\x69\xaa\x03\xdc\x41\xfb\x3a\x4d\x48\xa7\x51\xa2\xc3\xee\xc9\x1e\x76\x5f\xd7\x4f\xcb\xa7\xe7\xcd\x76\xfd\xb4\xbf\x5b\xfc\xbe\x5f\x2e\x9e\x6e\x5c\x14\x9d\xc6\x91\x11\x8a\x74\x2d\x87\x83\x62\xc9\xf4\xeb\xa6\x31\x10\x6a\xfd\x05\x7c\xa1\xce\x70\x9b\x26\xfe\x3e\xaf\x90\x26\x24\x71\x9d\xb7\xdd\x1d\xef\xaa\x47\x3e\x88\x3f\x07\x03\x53\xa6\xa8\x9d\xad\x3b\xfe\x73\xb6\xf6\x9c\xa6\x91\x42\x82\x2f\x9f\x75\xfe\x0e\xb9\xa1\x12\x71\xcf\x90\xa6\x92\x85\x6e\xce\x1f\x44\x91\x97\x2f\x97\x94\x00\x49\x9a\x0a\x83\xfb\xe1\x23\x31\x9d\xeb\xaa\xde\x1e\xbb\xb0\x60\xe2\x3a\xa6\xa9\x96\x98\x96\xa9\x6a\x05\xf5\x0a\x8e\xed\xeb\x38\x37\x9d\x66\x3c\x4c\xfb\xfc\xc4\xb0\x3a\x9d\x76\xaf\x4c\x8c\x90\x41\xa6\x84\xe8\x0e\xd3\x20\x1b\x08\xfc\x74\x6f\xd4\x58\x8e\xc9\x0b\xe0\x89\xd0\x72\xc8\x1a\x77\x36\x42\xe8\xd8\x6d\xc7\xd7\xa7\x52\x4d\xb2\xe2\x76\x90\x24\x1c\xa3\xaa\x2e\xde\xdc\x55\xdd\x63\xba\x1b\x91\x49\x44\x2c\xac\xe4\x8c\x16\x9d\xa4\x52\x9a\xcc\x7d\x9f\x7c\xb7\xee\xf1\xf8\xbd\x4a\x15\xa0\x2d\xee\x35\x43\xe6\xf7\xe0\x54\x29\x8e\x61\xb5\x25\x00\x76\x50\xa8\x29\xdd\xed\x2f\x12\xe2\x93\x8b\x42\x60\x88\xdf\xb1\xd5\xbc\xae\xab\x1f\x79\xf9\xb2\x69\xe1\x70\x31\x45\x3d\x2a\xe3\xce\xcf\x14\x20\x06\xf3\x51\x7b\x5d\xf2\x7d\xcd\x65\x5f\xbf\x4f\x81\x02\xe2\x0d\x0b\xd0\x6d\x9c\x4d\xde\x07\x68\x82\x50\xea\xc5\xed\xad\x4b\xec\xa6\x3a\x34\x62\xbe\x5d\x28\x5e\xd5\x1a\x72\x4c\x50\x0c\xca\x37\xc3\x9d\x3d\xd5\x49\x84\xb6\x71\xf7\x0a\xd2\xe7\x8e\x53\x9d\x09\xcc\x93\x76\x2e\xa4\x61\x64\x3a\x2b\x6d\x8f\x9f\x23\x0b\x02\x69\x2a\xba\xfc\xcd\xcc\x32\x83\x62\x9d\xac\xb3\x2c\x60\x46\x54\xc0\xfe\xd5\x66\xc0\x9e\x1b\x50\x8b\xc6\x14\x85\x9c\x0b\x97\x05\x0c\x38\x3a\x01\x27\x71\xc8\xdb\xe9\x75\xa2\x20\xf0\xf2\xbf\x5b\xac\x29\xd9\x6a\xd2\x20\xb3\x9a\x05\x09\xb3\x38\x44\x71\x7a\xb9\xe5\x2d\x34\xad\x6b\x0b\x5d\x76\xb1\xf9\xd0\x83\xcf\x68\x10\xe1\xe0\x4a\xeb\x4b\xe0\xe1\x8c\x06\xda\xaa\x18\x60\x67\x7e\xf9\x82\x20\x3a\x77\x90\x26\x48\xb7\xd6\xbb\x1d\x57\x35\x70\x35\xeb\x85\x65\x94\x87\xc8\xd0\x6b\x45\x7e\x88\xbf\x88\x56\x98\x0c\xc6\xba\xc9\xba\x54\x0d\x09\xdc\x21\x46\x8c\xfe\x7e\x5b\x7f\x2c\xca\xaa\x7d\x45\xcd\x63\x77\x30\x64\x84\x58\x49\x5c\x27\xae\x50\xfa\x63\x51\x18\xd9\xbe\xb0\x8d\x82\xb2\x45\xa1\x20\x5d\xb9\xc3\x71\xa0\x52\xa3\xfe\x62\x68\xc0\x7f\xfb\x90\xfe\x10\x33\x95\x2b\x01\xad\xc9\xe1\xec\xaa\xe7\x06\x21\x95\x57\xbe\x2a\x95\xc5\x51\x86\x3e\x0d\xb6\x8a\x40\xb9\x38\x3c\xb7\x72\x3c\x4f\xb3\x38\x52\xd8\x57\x75\xa8\x9c\x80\xf5\x80\x85\xe8\x8c\x26\xcb\x9d\x94\xa5\xe8\xd3\xba\x58\xc6\xe7\xc7\x56\x35\x7f\xf1\x1c\x95\x24\x8b\x05\x60\x67\x57\xde\xac\xf2\x2e\x6e\x5c\x81\xc8\xdb\xf5\x40\x9a\x81\x64\x09\xd5\x58\x2e\x36\xfe\x76\x0f\x56\x1b\x4f\xaa\x24\x32\xfd\x73\x38\x27\x93\xe4\xe6\x57\xc4\x6c\xee\x34\x19\x84\xd4\x93\xce\xd8\xf4\xcf\xf4\xd2\x20\x31\x92\x83\x9f\x12\x6c\x4f\x58\x73\x75\xaa\x7d\xf5\x23\x4b\x53\xf3\x8d\xba\x19\x73\x53\x54\x02\xd1\xe0\x38\x53\xd5\xae\x52\xbe\x81\x28\x4b\xb9\xe9\x01\xbf\xfd\xed\xf6\x9f\xee\x6f\x19\x0d\x49\x1f\xec\x2c\x79\xa9\x30\xeb\xf8\x50\xae\x0b\x98\xef\x38\x9e\x43\x5e\x67\x22\x0a\x91\x4f\xb7\x31\xa9\x3d\xbf\xf5\x65\x22\x4d\xd0\xc9\xf7\xc6\x79\xbd\xdd\xcd\x87\x29\x99\x00\xe1\x36\xe5\x65\x75\x38\xf2\x72\xda\x63\x47\x32\x49\x74\xe0\x52\x92\x4f\x5e\x68\x69\x7c\x19\x19\x06\x58\xbe\x2e\xe1\xc7\x46\xed\x78\xf9\xf6\x1d\xf8\xd1\xc7\xe1\x99\xcc\xa4\x23\x09\x5a\xb7\xaf\xba\xae\x0e\xcf\xdb\x95\x3f\x28\x8c\x7c\x0c\x57\x26\x39\x6c\xff\xac\x44\x3c\xec\xdd\x70\xe2\x5a\xc6\xe8\x0c\xf0\x31\x19\x10\x85\x08\x14\x5c\x81\x9b\xd2\xf2\x67\x22\x6a\xd0\xaf\x52\xa0\xa6\x31\x11\x89\x1c\x0d\xf3\xf2\xe4\x09\x40\x31\x0c\x80\x1c\x8c\xb1\xdb\x32\x7b\xd0\x4f\x06\x90\x20\xea\xde\xc6\x6b\x79\x89\x69\xd9\x2b\x40\x46\x96\xc9\xa5\x34\x17\x4e\x9b\x7c\x50\x66\x99\xff\x00\x3c\x08\x43\xb4\x62\xa8\xcb\x34\x42\xb9\xf0\x00\x00\xd3\x8c\xb7\xd5\x8b\xa1\x2a\x59\x1c\x8f\x45\x3e\x53\xb3\x98\x63\xab\x23\x18\x41\x30\x2b\x17\xbc\xcd\x5f\x26\x10\x15\x4e\x40\x83\xb5\xec\x46\x26\xee\xac\x2a\x38\x9a\x06\x9c\x06\x81\xf4\x9c\x6d\x25\x72\x39\xb9\x1b\x65\x60\x80\x29\x46\x80\x7a\x56\x8d\xc0\x19\x09\x1e\x66\x3c\x30\x24\x57\xc8\xa2\x95\x1f\xe0\x42\x04\xcd\xa3\x4c\x63\xa7\xd7\xbe\x86\x12\x7e\xb8\xdf\x8a\x94\xc1\x37\x19\x79\x15\xd7\x9c\x3c\xbe\xd5\x38\x36\xe1\x8e\x02\x75\x92\xf8\x85\x26\x0e\x39\x8f\x55\x84\xde\x93\x5b\x21\xfb\xcf\x73\xdd\x3c\xe9\x9e\xdf\x52\xa0\x55\x87\xc3\x4c\x83\xe2\xd9\xf8\x94\x39\x13\xd3\xbd\x96\x92\x1f\xe0\x1b\xd4\xb9\xce\x61\xac\xae\x4e\x78\x12\x06\x91\x41\x3b\x39\x0a\xfe\xed\x8b\x7f\xb5\x49\xc8\x39\x78\xb0\xd9\x1d\x9c\x07\x2b\x3c\xc9\xb4\x91\xa9\xfc\x91\x97\x83\x92\x05\xa1\xe9\xb8\xf9\x6f\xe0\x62\xf3\x04\x62\x64\xac\x38\xe4\x65\xbb\xab\x81\x37\xa7\xfa\x63\x94\x91\xe3\x69\x44\x23\xc3\x08\xd0\x9e\xea\x12\x01\x8c\xee\x48\x9a\xa0\xf3\x9b\xa3\xcc\x10\x32\x09\x5e\x28\x23\x71\x2e\x18\x32\xdc\xfc\x80\xfc\xe5\xd5\x3f\x13\x57\x41\xa6\x6c\x41\xba\x2a\x3f\x43\xb3\x71\x11\xc6\x28\xd0\x67\x1b\x7b\x2d\x2c\x7f\xb2\xe0\xb8\x4c\x28\x02\x3e\x6d\x80\x79\x39\xb6\x76\xe3\x55\x68\xb4\xd5\xbe\xaf\xf6\xdb\xaf\x8b\x27\x87\xc7\xe5\x52\x07\x58\xd3\x5a\xd4\xed\x72\x0a\xd1\xe1\x8a\x8a\x2c\xf3\x9f\xc2\x51\xbd\x5b\xb7\xfa\xd2\x1b\x50\x51\x88\x1b\xf2\x6b\x55\x28\x97\x64\xf4\x17\x4c\xac\x82\x22\xca\xa1\x9c\xea\xd2\x5b\x70\xae\x84\xa0\xb6\x43\xd3\x6f\x0f\xb3\xd4\x43\x84\x2b\x15\x61\x3a\xef\xb5\x0b\xec\x8b\x11\x17\xd3\x85\x95\x0c\x82\x60\xac\x79\xe4\x1f\x82\xcb\x37\x5b\x96\xb9\xb0\x0a\x41\x12\xcc\x3c\x1b\xc5\xec\xed\xe6\xf6\x9b\xef\x38\xe3\x3a\x0b\xb0\x0c\xa1\x4f\xa5\xe4\x9e\x9d\x9f\x70\xcd\x8d\x33\x7f\xac\xe1\x3d\x2f\xf2\x17\x50\xcf\xe5\xed\x8c\x58\x90\x19\x2e\x02\xcd\xd0\x1f\x38\x35\x50\xf7\x9d\xe3\xe3\x31\x24\x0c\x44\xec\xe1\xa3\x7d\xab\xba\x89\xaf\xdc\xa0\x98\x72\xcb\x5d\xb7\x6f\xf3\x03\xe8\x7a\xc8\x16\x3a\xf9\x55\x12\x43\x24\x3d\xa9\x3b\xf6\xa5\x4e\xfc\x0b\x41\xa4\xa1\x88\x7b\xe5\xcd\xb8\xa5\x62\xe8\x91\x0b\x02\x51\x60\x0d\xe9\x5d\x5e\xb6\x5d\x9c\x89\x2c\x00\x1f\x93\xab\x51\x4a\x22\x8b\xe2\x85\xc3\x71\x90\xa6\x16\x94\x3a\x41\xa1\x62\xfd\x53\x16\xa7\xa9\x18\x13\x11\x94\x45\x28\x3c\x76\xac\x8e\xb7\xbc\x7c\x39\xf5\xc5\x73\x41\xa3\x14\xd9\x26\x11\x53\xf2\x1d\xe0\xcd\x24\x20\xdc\xd1\xd4\x10\x14\xef\x4e\x45\x7e\x1c\xce\x3e\x41\xb9\xc4\xf3\x24\x32\x91\x4c\x52\x72\x82\x45\xd2\x49\x21\x6c\xad\x4f\x32\x9a\x76\x82\x65\xc6\xf7\xda\x5b\xcb\x84\x69\xf4\x89\x99\x15\x0c\x4c\xa7\x9f\x2e\xba\xf5\xbf\xaa\xbc\xfb\x2b\xc2\x20\x73\x5a\xab\xdf\xab\x5a\x19\x14\xd6\xd0\xbb\x11\xa1\x32\x45\xeb\xd5\xef\x57\xcb\x73\xde\x58\x22\x42\x6d\xfa\x02\xff\xaf\xca\xc7\xf4\xa5\xf6\x78\x24\x0c\xf6\xea\xe3\xd0\x4e\x65\xb4\x88\x88\x83\x54\x66\x2e\xa1\x9d\x97\x58\xd0\x3f\x4d\xc9\x94\x06\xc3\x43\x89\x9b\x74\x2f\x7b\x35\xc3\xbc\x86\xda\xcc\xa2\xd7\x1f\x7a\xc6\x1d\x6e\x98\x0c\x9d\xe7\x68\xf5\xaf\x34\x56\x21\xda\xfa\xa7\xf5\xe3\xed\x62\xb9\xde\xba\x77\x95\x24\x29\x8b\x3c\xc2\xc0\xc1\x22\xe7\x78\x67\x89\x48\x38\xc4\x36\x53\xaf\xd0\xb9\xae\x6a\x6c\x60\x18\xbd\x9a\x44\x1b\x05\x7b\xc3\x96\xf9\x04\x7f\x9e\xf2\xda\x14\xd4\xcf\xb6\xb5\x61\x24\x6c\xcf\x4e\xe3\x38\xb0\xb7\xf3\xb5\x3a\xd5\x2f\x05\x6f\x9a\x71\x41\x5d\xa4\x32\xc4\x72\x44\xc1\x1b\xc7\xc9\x60\x6e\xd6\x1e\xcf\x42\x89\xf0\xc5\x16\xf3\xf6\xdf\x3d\x78\x5c\x64\x5c\x63\x31\xcf\x78\x07\x57\xd0\xfa\x89\x9c\x49\x91\x3a\x01\xb8\xbc\x3d\x15\x3c\xaf\x61\xdf\xb9\xac\x2d\xec\x63\x3f\x08\x02\xdc\x6f\x9e\x4b\xfe\xd2\xb9\x78\xe3\xcf\xc3\x03\x4b\xfd\x5f\xe5\xe5\xae\xae\xaa\xa3\xbf\x38\x0f\x43\x8c\x04\x8d\x43\x3e\xab\x1c\x38\x79\x09\x3c\x89\x70\x31\xeb\x5c\xb8\x80\x78\x08\x8e\x12\x22\xa6\xd4\x58\xe5\xa2\xed\xdd\x48\x21\x92\x14\xf3\xe0\x07\xfe\x06\xbe\x1d\xf8\x62\x3a\x62\x3c\x3d\x04\x37\x14\x16\x28\xbb\x8d\x14\x6b\x27\x51\x5c\xf2\x2b\x85\x24\x06\xc1\xa1\xab\xfa\x05\xfb\x6b\xce\x13\x02\xe3\xb7\x23\x93\x18\x7d\x74\xf8\xd9\x42\xa9\x1e\x9f\xd6\xbb\xd5\x7a\x32\xb9\x64\xc2\xf1\x1b\x34\xaf\x9c\xed\x23\x47\xf2\x49\x84\x8a\x22\xdc\x50\x3a\x6f\x6e\x05\x92\x7f\xf8\x9d\x6e\xfa\x64\x17\x9b\xb1\x84\xe2\xa6\x5d\xd6\x98\xe3\x4d\xe7\xb0\x7c\x19\x14\x97\x84\x52\x24\xb4\x49\xc1\x75\xa9\xaa\xba\x41\xf5\xbd\xcf\xdd\x30\x01\x49\x86\x3b\x4b\x37\xc3\x8f\xcf\x7d\xf7\x5c\xfc\x6f\x37\x40\x05\xa8\xe1\x32\xa8\x62\x0b\x9d\x72\x74\x4f\xa0\x54\x9b\xe5\xc3\xfe\x07\xf1\x07\x34\x20\x52\x0d\xd9\xd0\xd1\x6a\x16\x7e\xc7\x96\x41\x64\xe2\x87\xcb\x3c\xbe\xe1\x30\x81\x26\x49\xc8\x1c\xee\xd3\x54\x68\x8c\x05\xc5\xb0\xa5\x3b\xb7\xbf\x32\x89\x08\x26\xa3\x25\x2f\xe4\x3d\xfc\xd8\xbe\xe5\xe5\xe2\x78\x04\x5e\xf7\x64\xa4\xce\xd5\x73\x38\x3b\x49\x22\xd3\xc6\xbd\xcc\x8f\xaf\x50\x3f\x16\xfc\x63\xde\x3f\x91\xb4\x8b\xb3\xfe\xe7\x7f\xff\xe7\x6e\xf1\xbb\x2f\xe9\x2f\xee\x1e\x9e\xef\x77\xee\xe7\xa9\x8e\xc3\xb0\xcf\x00\x85\xee\xef\x2c\x48\xd1\x35\x7b\xac\xab\xe6\x88\x86\xa6\xb9\x71\x82\x36\x6e\x4c\x18\xa6\xa8\x37\xf0\x96\x97\x2f\xaa\x3a\xb8\x42\xd8\x35\x40\x5f\xc0\x97\x61\x92\x78\xc6\xaa\xaa\x73\x81\x7f\xcb\xbd\xb3\x29\x43\x25\x90\x40\x04\xda\xd7\xfd\x01\x7c\x6c\x24\x23\x92\x11\x6b\x84\xae\xdc\xdf\xe2\xd4\x14\xca\x30\x84\xdb\x37\xaf\xbc\x86\xfd\x71\x90\x5e\x92\xb1\x0a\x10\x60\xc4\xf3\x7a\xe5\x7a\x7d\x57\xd0\xb4\x75\xe5\xc2\x75\x99\x06\xd2\xb1\xe4\x3e\xd7\xf9\x0c\x88\x56\xa6\x92\x27\xbd\x47\x6e\xaa\xf1\xb3\xa1\x8e\xcc\x02\x8e\x49\x39\x0b\xaa\x47\x74\x42\xd3\x19\x9f\xab\x0f\x97\x2b\x98\x5f\xbc\x32\x23\xa6\x96\x51\x9b\x6a\xc0\x1a\xd3\x1f\xfd\x73\x64\x8c\xa0\x9b\x3a\xc5\xb2\x7d\xba\x18\x64\xc6\x42\xfc\xd4\x3b\x68\x5a\x1b\x37\x8d\x3e\x56\x16\x71\x5c\xc5\x37\xdb\xcd\x2c\x3c\x7c\xb8\x68\x27\xb3\x28\x53\x14\x77\xa8\x83\x01\xc4\xbb\x34\xc6\x3f\x4e\x55\xed\x7b\x7c\x24\x0f\x02\xc4\xb7\xae\x6f\x37\xbf\xdb\x7c\xfa\x16\x06\x1d\xf3\x92\x27\x01\xf2\x4d\x62\x0d\x72\x95\xbf\xfb\xbf\xa7\x1a\xf5\x6d\x6e\x77\x4f\xa3\x1b\x16\x8c\x08\x23\x11\xd4\xf3\x05\x13\x29\x38\x60\xca\x59\x8e\xfa\x23\x1a\x67\xac\xa4\x22\x51\xa0\x70\xf3\x73\x74\xa2\x67\x70\x0b\x09\x91\x70\xa4\x47\x9b\xb2\xdb\x6d\xf3\xf7\x41\xb7\x92\x84\x04\xb0\xb6\x5b\x1d\xa1\xec\x37\x8b\x38\x1c\xf2\x75\xfb\x59\x00\x3c\x46\xed\x63\x59\x7f\x1c\x5b\x7e\xaa\x9d\xfe\xad\x3b\x2c\x4c\x9c\x85\x35\x71\x4b\x1f\x34\xa3\x45\xd1\x0d\x64\x28\x91\x63\x61\x17\x6d\xcd\x5b\x78\xc9\xa1\xe9\x2b\x97\x7e\x82\xa8\x20\x0d\x63\xe9\xf4\x2e\xb1\x79\xe1\xc2\x6e\xf6\xff\xd5\xbf\xee\x77\x79\x98\x5a\xb0\x97\x97\xd7\x1c\x5a\x79\x15\x70\x81\xfd\xf3\x56\x98\x63\xc8\x26\x3f\x24\x5e\x22\x8a\x04\x0a\xd7\xce\xb6\xad\x4a\xb8\xad\x5e\xe6\x9d\x78\x45\x03\x23\x20\x32\xe0\x21\x19\x73\xe3\xba\x71\x11\x45\x9f\xa5\xa8\x7a\x6a\x2f\xa2\x68\x92\x61\x94\x75\x84\xba\xa9\xca\x5e\x3a\xce\x1f\x4f\x03\xc5\xfa\xa2\x04\x66\x9f\xdd\x6e\xa0\x58\x4c\xb0\xfd\x6d\xf5\xdb\xb6\xff\x93\x14\x1e\x5f\x8f\x8b\x72\x5d\xb6\x79\x6b\x84\x62\x2b\x3d\x06\x10\x8d\x97\x90\x0a\x53\x8e\xb1\x8b\xad\x7c\x2c\x5f\x79\x59\xc2\x45\x76\x7f\x77\x92\x4c\xa4\xd1\x31\x39\xe4\xed\xf6\x0d\xcb\xb1\x9d\xbb\x71\x93\xbf\x5f\xc0\x43\xa7\x7f\xf1\x4b\x86\x32\x45\xff\x65\x9b\xbf\x94\x7e\xe2\xab\x88\x11\x2c\x82\x2e\xf9\x31\x6f\x7d\xb0\xa0\x22\xc1\x50\x4a\xd4\xaf\xa8\xdd\xcf\x41\x26\x4f\xc5\x44\x60\x80\x84\xc8\xca\x1c\x6a\xb7\x85\xa8\x24\x30\x49\x35\xac\x61\xe1\x2b\x5e\xf2\xde\xf1\xea\xd3\x15\x2a\x51\x44\xa9\x5f\xaa\x42\xff\x97\xff\x7e\xce\x4d\xe0\x8a\xd1\x2a\x01\x89\x34\x4f\xc6\x8a\x23\x71\xfe\xba\x57\xbd\xb7\x83\x52\x2a\xb1\x7e\xb8\xbe\x5a\xdc\xbb\x92\xb1\xea\x1c\x65\x0c\x91\xa4\xb1\xcf\xdb\x53\x8d\x20\x0a\xa4\xce\x2e\x26\x32\x16\x44\x65\x24\xc2\xbc\x0a\x4e\x9c\x51\x32\x46\x65\x04\xb0\xc7\xa6\x05\xf9\x5a\x56\x45\xf5\xf2\x31\x9d\xaa\x9c\x6a\x61\x92\x13\x6d\x9d\xc3\x3b\xac\x16\x0f\x96\x1a\x64\xf0\x1a\x39\xa3\xe8\xed\x6c\x5f\xab\x63\x2e\x8a\x9e\x89\x4a\x71\x8b\xcb\x6f\xa0\x28\xae\x8b\xca\x43\x87\x15\x17\x26\x54\x78\x58\x6c\x66\x41\xf6\x76\x98\xc8\x0c\xd1\x8e\xe7\xcf\x9b\x0b\x26\xec\x58\x49\x98\x4b\xff\x74\xb3\x6b\xa6\x35\x77\x70\xcb\x4a\x9a\x28\xf0\x79\xbb\x5a\xfe\xee\x6e\x4a\x29\x9d\x04\x83\x1a\xdc\xba\x7d\xfd\xca\x4b\x55\xc0\x3c\xb0\x58\x01\x27\x58\xc4\xc2\x75\x79\x55\x70\xf9\x36\x84\x96\x4c\x06\xeb\x04\x44\x37\x29\xff\xb8\xfa\xed\x12\xca\x86\xce\x2b\xe0\x91\x2e\xfa\xc0\x56\x8b\xda\xf4\x83\x7d\x87\x7c\x53\x6e\xa1\xd0\x9d\xb7\xf1\xc5\x8d\x09\x43\x03\x07\x33\x79\xea\x70\xd2\x09\x07\x81\xa4\x18\x9a\xfe\xc0\x32\x1e\x7a\x20\x7e\x8b\x04\x12\x49\xec\xd3\x93\xbc\x3c\x35\x67\x90\x27\x60\x82\xa0\xfa\x57\xb7\x47\x34\x5e\x69\x91\x00\x93\x41\x60\xc2\x8e\x1c\xa9\xdf\x77\x8e\x49\x90\x40\x28\x05\x76\x5b\xe5\xe5\x3b\x34\xc6\x0c\xb7\x63\x2d\x30\x02\xa1\x32\xe0\x04\x93\x7e\x6c\x5e\xf3\xe3\x53\xd5\x0c\xee\x2a\x04\xae\x7b\x47\xe7\xb9\x81\x7a\x0a\xd9\x98\x2b\xa8\x9e\x55\x5d\xc7\xcf\x12\xea\x04\x51\x59\x9e\xb5\x73\xca\x7a\x3e\x57\x1b\x76\x9e\xb0\x9f\x6d\x10\x11\x8e\x89\x8c\xce\x42\xa2\xaf\x77\x92\xe7\xfd\x9a\x10\xc5\x06\x92\xba\xe4\xcd\xeb\x83\x27\x62\x83\x28\x0b\xb1\x5c\xdb\x59\xb3\xab\x93\x0b\x5f\x21\x8e\x03\xc7\xdb\x68\xb0\xc6\xb0\x1b\x14\xaf\x20\xe6\x86\x31\xb2\x84\x9f\xc8\xc8\xe0\x9b\x10\x20\x01\x23\x2e\x2f\x5d\x65\xec\xea\x54\x97\x23\x3e\x1a\x48\x33\x8e\x2a\xf1\xa6\x9d\x7b\x78\x80\x27\xa9\x0d\x18\x16\x26\x67\x6a\xa9\x93\xfc\xef\x66\x4c\xc4\x6c\xb0\x08\x77\xf9\x71\xfa\x1d\x66\x57\x24\x64\x51\x82\x98\x03\xe0\xad\xed\x77\x69\x16\x45\xfe\x3e\xf1\x8a\x80\x07\x01\x62\xee\x4c\xe2\x77\xc7\xdf\xb0\x2b\xdc\x14\xee\x2e\x84\xa1\x20\x02\x81\x39\x0d\x28\xf2\x43\x5e\xf2\xfa\xff\x4e\x2f\x5c\x4d\x38\xf9\x09\x88\xd4\x70\xb8\x0c\x35\x83\xd4\x99\x32\xe4\x64\x82\x48\x11\x62\x19\x13\x3b\x9d\xbb\x3d\xf3\x36\x3f\xe4\xed\x0e\x3c\x13\x15\x40\x92\xe2\x87\x58\xec\x76\xfe\x4f\xa9\x4c\x52\xa7\x36\x34\xf4\x38\x40\x67\x26\xc1\x50\x83\x73\x4e\xfe\x5a\x39\x51\x13\xce\xb1\xda\x66\x12\x69\xdf\xaa\x16\x3c\xe9\xf9\xac\x39\xd2\x44\x19\x8a\x72\x94\x11\xca\xff\x03\x73\x7d\x06\x9a\x86\x82\x0d\xb5\xc0\x56\xd0\xf2\xbc\x98\xec\x19\x9a\xc5\x1c\x1f\x67\xfd\xf4\xb0\x5d\x3e\xf8\x66\x31\x1d\x32\x6d\xe4\x30\xef\x37\xcb\xe1\x53\xea\x50\x64\x32\x9d\xc4\x24\x37\x97\x7a\xdc\x74\x14\x72\x64\x78\x28\x27\x7a\x52\xee\x70\x2c\x9c\x62\xe4\x53\x55\x14\x0f\xa7\xf6\x78\x1a\xd3\x54\xa6\x13\xa7\x63\xfc\x22\x12\x4d\x31\x8e\xd9\x8b\x1a\x40\x7d\xcf\xdb\xd7\x79\x37\x4f\xa7\x21\x51\x89\x4f\x0b\x5d\xf7\xe8\x44\x9d\x72\xc5\xe5\xc0\x7c\x0d\xca\x52\x3a\x05\x8e\x62\x00\xe5\xe9\xf0\xa0\x57\xd0\xcd\xe8\x1a\x14\x2a\xbb\xba\xf8\xcb\xed\xb0\x3a\x0b\x28\x7a\xfc\x4b\xd3\xcb\xf6\x0d\x9a\x76\x7b\x84\x29\x76\x5a\x67\x24\x40\x03\x6f\x5e\x1f\xe6\xb4\xfb\xcd\x4a\x73\x96\x79\x99\x5c\xc4\x22\xf9\x16\xe6\xf1\x55\x78\x14\x06\x3d\xa3\xfb\xb7\xaa\x73\xd9\x90\x58\xe9\x2f\xfb\xe9\xfe\x42\x71\xec\xd4\x41\x8d\xc3\xe8\x19\x42\x46\x41\x88\xe6\x92\x62\x49\xf2\xba\x2a\x8a\xea\xc7\x79\xff\xdf\xe0\x19\x34\x04\xd2\xd2\x9a\x3e\x41\x93\xab\x13\x2f\x66\x27\xa8\x08\x18\x82\x00\x6f\xaa\xaa\x67\xc7\xfb\xd5\xed\x8f\xdf\x83\x20\x0a\x11\x4a\x0e\x11\xe7\xfe\xcc\x42\xcc\x4c\x37\xae\x9f\x15\xf1\x93\x98\x48\x9d\xaa\x15\xcf\x96\x44\xb4\xa4\x44\x5b\xe8\xd7\xb6\xe5\x5a\xaf\xf2\x06\x7b\xe1\x90\xd2\x7b\x0e\x4e\xa6\xa5\x64\xc2\xd2\xb1\xbe\x80\x0b\x15\xb5\x0a\x33\xe1\x3a\x10\xae\xe7\x14\xf2\x88\x56\x19\xd5\x96\xcc\xa0\xcd\x4d\x5e\x0e\xcd\x72\x93\xbf\x8c\x5a\x81\x35\x08\x8e\xa0\x03\xd3\x89\x62\xf9\xef\xed\x31\x2d\x38\x46\x45\x8f\x8f\x37\xd6\x50\xd1\x20\x48\x0d\x8c\x88\x23\x09\xca\x55\xae\xae\x91\x4f\x72\x1e\xe8\x42\x83\x40\xc9\x84\x0d\x04\xc4\x3a\x37\xf5\xf5\x1c\x37\x46\x03\x42\x29\x35\x6d\xb5\xde\x5b\x9f\x8e\x10\xda\xc1\xef\xda\x02\x7d\xdd\xe1\xdb\xa5\x41\x17\x9c\x75\x4f\xf2\xed\x61\xb7\xb9\xbf\xd9\xaf\xef\x57\x08\x0f\x75\x37\x4e\x40\x61\x69\xd1\xd9\x72\xbf\x4b\x5d\x82\xae\xf6\x0f\x41\x99\xd1\x5e\x69\xac\x76\x82\x25\x3b\xd9\xdd\x3e\x7e\x99\x0c\x84\x10\xf1\x89\x05\x6f\xda\xfd\xab\x0f\x35\x68\xc0\xc2\x14\x57\xe0\xae\xb2\xed\xf8\xee\xef\x91\x86\x5e\x22\xce\x62\xa8\xf3\x83\x59\xc1\x33\xac\x06\x34\x08\xb3\x08\x63\xbf\x3b\x5e\xf2\x17\xf0\x17\x4a\x42\xe2\x04\x1f\x7b\xe9\x93\x53\x0f\xfa\xa5\x41\x22\x12\xcc\x12\x6e\x17\xb7\xa6\x4b\xc6\x9d\x9a\x0a\x86\xb3\x49\xe7\xa5\xba\xce\x5f\x4e\xf5\x24\x02\xa0\x41\xc6\x80\x88\x9e\x4b\x63\xc9\x2d\xb7\xfb\x75\x5d\x1d\x1e\x6b\x78\xcf\xab\x53\xf3\x29\x6b\x32\x0d\x32\xee\x69\x56\xb6\xf8\x58\x06\x32\x35\xfe\x82\x1c\x14\x86\x13\x47\x54\xa5\x7c\xad\x01\x7a\x79\x08\x1a\x88\x94\xa3\x03\xdc\xb6\xc5\x06\xad\xea\xd0\x41\xa1\x81\x10\x22\x15\x0e\x37\xa0\x5c\xa9\x24\x34\xea\xc6\x7f\xeb\x0b\xce\x34\x9c\x66\x7d\x2f\x93\x48\xd0\x40\x48\xa3\xc8\xd9\xed\xbd\x3f\x66\x18\x31\xed\x30\x49\x22\xd9\x7d\xc7\xbd\x6b\x14\xf1\x6c\x53\xe3\xab\xfe\x8b\x7d\x42\x2b\x36\x6b\x4c\x69\x20\xc3\x00\xdb\xd8\xef\x2a\x95\xeb\x8f\x2d\xb4\xed\x50\x4e\xfd\xff\x55\x46\x84\x06\x52\x86\x28\x5d\x88\x1f\xe0\xfa\x54\xca\x33\x2c\x25\x0d\xa4\x0a\x42\xd7\xd6\x68\x20\xb4\xd5\x67\x14\x06\x34\x90\x3a\x80\x64\x00\xb9\xbd\x5f\x7c\xbb\xcb\x65\x5d\x3d\x6f\x57\x93\x19\xa5\x94\x76\x65\x53\x47\x8e\x60\xae\xe8\x76\x3e\x1a\x28\xd0\xb1\x47\x43\x99\x6a\x3e\xba\x5f\xa6\xe2\x59\xd5\x1f\x36\xb9\x65\x87\x03\x8d\x30\x67\x62\xaa\x5b\xdf\x21\x9f\xfc\x22\x68\xc1\x5d\x3e\xeb\xa6\x86\x8f\x0b\x8f\xa0\xc3\x58\x1a\x23\xc3\x6b\xf9\x3a\x67\x94\xbb\x31\x80\xb5\xf3\x63\xfe\x13\x8a\xbe\x79\x02\xb9\xc8\x70\xf9\x8b\xd3\xc7\xd5\xa9\x2c\x3f\x46\x0b\x90\x04\x32\xe6\x1e\x5d\x55\xd5\x8f\x3c\x57\xfe\x44\x9d\x21\x26\xb8\x9b\x39\xe8\x07\x6c\x07\xf6\x9e\x12\x92\x84\x18\xea\xaf\x1c\x5d\xec\x3b\xd4\x8d\x17\x94\x1c\xdf\x1d\x21\x99\x69\x41\xb6\x54\x90\xc3\x50\x71\x3a\x90\x63\xcf\x82\x73\x2b\xaf\xab\xda\xf6\x65\xd9\x01\x34\xa2\xcc\x52\x1a\x23\x3a\x75\x76\x26\x11\x16\x44\xc4\x78\x3a\xc8\x5d\x74\xe2\xc5\x5d\x5e\x3a\x3f\xc6\xa7\xd3\x29\x61\x29\x43\xd5\xd0\x23\xd4\xd8\x8a\x2f\x6c\x2b\xb5\x43\x19\xf2\xe2\xcb\xe4\xc2\x59\x82\x89\xac\x6f\x39\xfc\xb8\x82\x96\xce\x7f\x31\xc2\x24\xc5\xf8\x63\xc5\x3f\xae\x3e\x56\x7c\x48\x3b\x43\x49\x44\x22\xb0\x34\x90\x9d\xfb\xa4\x4c\xf6\xbd\xd9\x37\x9e\xb2\x98\x92\x88\x02\x3e\x66\x0b\x4d\xfb\x50\x73\xe9\xfc\x48\x4a\xa2\x30\x1a\x73\x2f\x9c\xea\x72\xa8\x8b\xea\x86\x59\x81\xe9\xc6\x35\x04\xbe\x9b\x94\xdf\x19\xf3\x0f\x25\x71\xc2\x71\x1f\xd8\x2b\x5b\x2c\x73\xd3\x9d\xc4\x56\x06\xdf\x13\xcd\x54\xa2\xba\xb0\xce\x48\x92\x68\x6d\x43\xae\xdf\xe0\x63\x08\xce\xa2\x24\x4d\x8c\x0d\xe5\xef\x3c\x2f\xba\x08\xc8\xb4\xac\xf9\xdf\x49\x55\x8a\x08\x4a\x59\x00\xaf\x17\xa5\x5a\xa1\x7b\xfa\x81\x0c\x8a\xbb\x1f\xd5\x77\x80\x37\x3f\x36\x0b\x44\x18\x8f\xf2\x67\x36\xb6\xba\x70\x5f\x19\x23\x58\xa4\x58\x5a\x7a\x2a\x23\x45\x3a\xaf\xa4\x75\x9a\x21\x62\x9e\x1c\x1b\xad\x1e\xce\x28\x4e\x9f\x2d\xc8\x53\x9d\xb7\x39\x34\x7b\xe2\xee\x93\xc7\x86\x72\x14\xd3\xe2\xed\xa2\xae\xb9\x7b\x29\xa3\xfd\x85\xa8\x48\x60\xdf\xcb\xc9\x70\x4c\x1b\x67\xa7\xe7\x0c\xa4\x44\x65\x21\xf5\xed\x6a\x4f\x03\x1e\x12\x4a\x94\xce\xf0\x9d\xef\xbe\x6e\x9e\x76\x7f\xec\x57\x8b\x3f\xb6\xee\x10\x10\x47\x1c\x7d\xac\xea\x76\x63\x84\x89\x6c\x79\x79\x22\x9a\x41\x09\xf0\x18\x77\xdb\x65\x3d\x14\xd8\xa1\x04\x80\x23\x6b\x0c\x47\xd1\x70\xd4\x0f\xf7\x98\x93\xe9\x12\x07\xd0\x99\x2b\x32\xf1\xba\xce\xa1\xbe\x1f\x8b\x52\x51\xa2\x03\xc3\x1b\xf7\x35\xc7\xcf\x3b\x99\x86\x3a\x09\x31\xa5\xd7\xad\xf6\x9b\xaa\x7a\x02\x63\xee\xa6\xa3\x52\x93\x3e\x3d\x9e\xc4\x20\xe2\xa7\x44\x0b\xd3\xa3\xdd\x77\x03\x9b\x03\x34\x08\x68\xe2\x1b\xe5\x2d\x04\x66\xf4\x05\x68\x10\x68\xcc\xf4\x2d\x5e\x6a\x40\xb7\xf7\xb9\x2e\xd6\xa5\x3f\x9f\x67\x28\x67\xe7\xd6\xc0\x6d\xf5\x0e\xdb\xee\xf6\x3b\x1b\xd1\xfb\xd9\xe4\xcc\xbf\x9e\xcb\x7a\x51\x1a\xa8\x18\x17\x5b\xeb\x36\xe3\x01\x79\x0c\xa5\x24\x60\x08\xe3\x53\xd5\x13\x88\xd3\xc7\x6e\xac\x06\xda\x1d\x4f\x44\x4f\xa9\x6b\xda\x89\xfe\x59\x1d\x44\x3e\x6a\xf0\xa6\x94\xf2\x88\x6a\x87\x73\x79\xac\x9a\x16\xf9\x48\x7c\xf9\x60\xe3\xdf\x0e\x95\x19\x96\x8b\x14\xc8\x82\xd7\x60\xe0\xf0\x9d\xd1\xe5\xff\x99\x37\xad\x94\x05\x21\xf2\xed\xef\x9b\x23\xc8\x9c\x17\x43\x84\xd1\xfc\x12\xa4\x8c\xc5\x88\x25\x70\x4c\x79\xbf\x12\xe2\xf5\xa7\x49\x04\x1a\x5c\xf1\x52\xa2\x02\xc6\x3b\xd4\x2d\xd4\x0e\x30\xe4\x46\x45\xd4\xf5\xb2\x0f\xc8\x56\xc7\x5f\x38\x0c\x8c\x92\xfd\x56\x56\x47\xb7\xae\x68\x98\x0a\xb0\xbd\x38\xfb\x63\x0d\xfb\xb7\x0f\xb9\x47\x58\xec\xbe\x3c\x1d\x3a\x7f\x69\x92\x79\xa1\x34\xe4\x11\x3a\x7b\xc7\x53\xf3\xba\x7f\x83\x33\x35\xbc\xc9\x63\x87\x32\x09\xa3\x09\xb4\x75\x76\xf3\xa6\xa1\x0e\xb1\x34\x01\xbc\x2e\x3b\x3f\xaa\xf3\x61\xb7\x72\x20\xb9\x3a\xde\x25\x69\x44\x39\xda\xe5\xda\xb6\xeb\xa1\x02\x25\x3f\x0c\x7a\x63\x28\x8d\x6c\xb5\xde\xf9\x3d\xcd\xd5\xc7\x77\xfe\x0e\x23\x1c\xcc\x85\x1b\x8f\x89\x91\xfe\x35\xfd\x07\x5d\x64\xdf\x5f\x36\x4e\xcc\x06\x5d\xc2\x0f\x6f\x4b\x3f\x49\xf3\x52\x9a\x10\x41\x8c\x24\x8c\xe5\x5d\x1c\xe7\x70\x29\x4d\x59\x8a\xc1\xdb\xda\xe8\xda\x63\x53\xf7\x45\x4c\xf7\xfc\x0d\x67\x41\x86\xb9\x15\x43\x4a\xfd\x65\xf4\xfb\x19\x61\xc2\xa2\x03\x77\xc0\x0f\x53\x2a\x8f\x0b\x17\x14\x59\x30\x24\x59\xb1\x52\x39\x13\x9b\x47\x39\x33\x01\xce\x75\x55\xbf\x4c\x80\x96\x94\x0a\x66\x58\x2c\xf6\x4e\x0f\xef\xc2\xea\x10\x11\x27\xd2\x75\xd4\x16\x30\xb5\x4e\x22\x4b\x30\x68\xf6\x54\xc4\xe5\x15\xbc\xf2\x42\x4f\x6e\x45\xf0\x04\x9b\xa8\x9c\xe3\x84\xa1\xa8\xcb\x54\x50\x2a\x04\x4b\x51\x0c\xe3\x6a\x31\x4b\xed\x6c\x87\xc9\x94\x60\x42\xf5\x6e\xb3\xba\x79\x5a\xac\xd6\xfb\xdd\x1f\x8f\x6b\xe7\xf2\x51\x29\x8c\x16\x71\x83\x7d\x9c\x08\x81\xbb\xae\xea\xc5\x10\xbb\xd1\xff\xa2\x54\x71\xe4\xca\xc2\x87\x23\x97\xad\x09\xae\xe6\xbc\x3e\x2a\x21\xf3\xf9\x3b\x23\x2f\x6b\xf8\x25\x1c\x67\xb8\xdb\xfc\xa9\x8a\x0c\x9d\xbe\x21\x15\xc4\xb1\x13\x91\x65\x4a\x95\x36\x14\xe0\x2f\x06\xae\x36\x42\x5b\x51\x0a\x59\x80\x90\x6a\x38\x1e\xfc\x9f\xa4\x09\x90\xb1\xc6\x52\x77\xc6\x7d\xa4\xe0\x4e\x29\x28\x86\x99\xed\x6e\x6f\xe0\x85\xbd\xe0\xc3\xf4\x0b\x68\x2a\xa8\x5d\x70\xfb\xce\xdd\xdf\xcf\xd5\x4d\x26\xdf\x5e\x8b\x2c\xed\xeb\x65\x96\x1c\x75\x12\x9d\xd9\x4d\x9a\x05\x94\x63\x87\xcc\x9f\x27\xe8\x36\x9f\xb2\xb3\x14\x98\xc0\x1d\x5d\x92\x05\x99\xc9\x0b\x20\x30\xe0\x2e\x2f\x7d\x73\x3e\x65\x81\x8c\xa8\xe1\xc9\xb7\xd8\xe8\xd1\x03\x30\xc2\x53\x43\x4d\xd6\x1c\xdd\x19\x94\x44\x91\xfd\x30\x02\x5a\x43\x82\x86\x7b\xca\xe4\xd4\x2e\xce\xc9\x2c\x27\x89\xe1\x7f\xc8\xdb\x57\x03\xd5\x79\xe2\x17\x08\x56\x29\xa3\x29\xc1\x98\xa5\x3c\x1d\x1c\xcf\x6d\x83\x2c\x76\xfd\x2d\xd3\x14\x0c\x13\xf1\xf5\xe6\xdb\xfa\xeb\xf3\xfd\xea\xc9\x29\xc6\x50\x46\x33\x82\xf1\xda\x3f\x9e\x37\x0f\x43\x07\x9b\x51\x88\x11\x24\x63\x76\xc9\x6b\xc4\x55\x0c\x6d\x02\x8b\x38\x44\xd6\x39\xee\x6e\xb4\x3a\xb5\x43\xff\xb1\x9f\xc4\x2c\xa6\x1c\x1d\xd3\xaf\x1f\xa7\xf2\xef\x1c\x46\xbf\x12\xa7\x40\x6c\xe6\x6d\x61\x30\x32\x5f\x86\x67\x72\x86\x59\x58\xa4\x90\x7e\x79\xaa\x4e\xa5\xfa\x0d\x3e\x16\xca\x3f\x59\x0c\x71\x6c\x85\xc2\xef\xb9\xbc\xf0\x86\x62\x10\xd8\x9a\xde\x9c\x84\x21\x61\x1d\x17\x89\x66\x2b\x45\xe7\x04\x85\x94\xc5\x9a\xa5\xb6\x08\x73\xc3\x0f\xdd\x36\x7f\xe1\x07\x93\x30\xd4\xa6\xb8\xf0\xb1\xb4\x74\x9c\xe8\x75\x22\x2d\xe6\x60\x73\x66\x49\x64\x14\xeb\x5f\xa0\x5d\xba\x47\x4a\x74\xa8\x4c\xbb\xc1\x3b\x14\xd5\x11\x6a\x6c\xa5\xb4\x06\xd7\x8e\xc9\x58\x46\x1d\xf5\x8c\x81\x14\xf1\xe2\x89\x7b\xf5\x2b\xca\xb2\x88\x60\xd2\xfd\x7b\xae\x6c\x79\xd4\x6e\x8a\x93\x79\x9e\x25\x51\x6c\x2b\xa3\xc6\x0f\x9a\xf7\x57\x58\xa6\x28\x96\xe1\x7f\xb3\x08\xf5\x2d\x2f\xe0\xee\x12\xbe\x9a\x32\xce\x12\x44\x45\xae\x6c\x73\x60\x5e\xce\xc3\x29\x28\xe3\x61\xe6\x32\xaf\xeb\x46\xd6\xd5\x8f\x8b\xcc\x27\x94\xf1\xc8\x90\xa4\x6c\xdf\x46\xa1\x20\x13\x91\x70\xbd\x3e\xe6\x21\x9e\xcd\x4f\x4c\x9e\x55\x24\x19\x32\x81\x5d\xe5\x6d\x2f\x5a\x45\x99\x10\xa6\x91\x11\xb5\x41\x96\x45\xd5\xc0\xac\x70\x13\x65\x42\xc6\x7a\xe8\x0b\x98\x26\xd9\x59\x5f\x84\x09\x90\xc8\x8c\x66\x4a\x89\xf2\xe4\xa9\xb1\x28\x13\x5a\xe1\x26\xf2\x03\xf2\x47\xa8\x97\x5f\xaf\xdd\x01\xc9\x58\x96\x0c\x3e\x6a\xf3\xc8\x73\xb5\xab\x6e\xf8\xa4\xad\x9c\x32\x99\xc6\x88\x6b\x72\xdb\xd4\xd5\xa9\x78\xbb\x24\x23\xe1\x2d\x9f\xa2\x06\xeb\x84\x55\x78\x50\xab\xfc\x3d\xef\x42\xd9\xbf\x9f\xea\xbc\x51\xb9\x34\x21\xeb\x68\xd7\x64\x8a\x49\x04\x59\x59\x4e\xee\x61\x7a\x99\x32\x15\x87\x56\x2f\xc4\x34\x6c\xd8\x3e\xf2\x09\x90\x9c\x32\xc5\x09\x96\x7b\xb1\x29\xc6\xb3\xed\x9d\xdd\xe7\x6c\x4d\x96\x32\xe8\x42\x1a\x9f\x46\x1d\x36\x06\x4e\xc9\x04\x69\xe0\x4e\x61\x90\xf6\x5d\x13\xf3\xa8\xd0\xf1\x97\xd5\x21\x41\xef\x57\x9e\x5c\x53\x2d\x0d\x83\xc4\x7c\xc1\x77\xa8\x73\xfd\x61\x29\x2d\xdc\xe9\xf6\xd5\xf6\x9a\x2d\xdd\xff\x4e\x0a\x04\x97\x20\xb6\x7d\xbe\xd0\xfd\x92\x4a\x79\x5f\x9b\xe9\xc2\xf4\xe2\xe3\x69\xd8\x7d\x31\xba\xd9\x90\x48\x23\x57\x64\x89\x41\x46\xa8\x0c\x1a\xd2\x40\x63\x56\x1e\xb5\xd9\x0e\xf9\xc9\xc0\x3a\x6e\x3f\xd9\x44\x27\x97\xa7\x61\xa2\x89\x4b\xe7\xf2\x1a\xd5\xc3\xfa\xde\x37\x1a\xd2\x88\x60\x1b\xfc\xce\x03\x43\xd8\xcd\xf8\x8b\x87\x54\x07\xa8\x0b\x61\x74\x64\x86\x27\x33\x11\xbb\xd5\x3e\xdb\x83\x73\x3e\x6d\x43\xa6\x23\x42\xfb\xaf\x59\x73\xf9\x36\x9e\xa5\x61\x08\x01\x33\xd1\x97\xce\xcb\x7c\x8e\xec\x80\x86\xa1\x66\xb8\x4f\x6c\xdd\xde\xea\xee\x28\x12\x86\x27\xc8\x2c\x0a\x9c\xa3\xd7\x55\xdd\xbe\x82\x3e\xb5\xa7\xda\xdf\x78\xcc\xcc\x8d\xdb\x14\x80\x65\x1a\xe8\x2d\x79\x18\xab\x94\x19\xc2\xd2\xc2\x89\xcd\x2f\x79\x59\x56\x16\xb6\xeb\xc3\xdb\xcf\x3e\x82\xeb\x9b\xa2\xae\x86\x39\x57\x6b\xa2\x61\x42\x34\x52\x3b\x74\xfb\xc9\xbb\x91\x03\x9d\x33\x97\x61\x92\x4a\x8c\x4a\x97\xbb\x4f\x68\x77\x69\x98\x08\xc9\x6c\x6f\x4e\x75\x6a\xfd\xfc\x4f\x59\xa4\x88\x2d\x33\xd5\xd5\x85\xa4\x6a\x98\x2a\x8e\x5f\x67\xfd\xd3\xd5\xc0\xbb\xbf\x41\x6a\xc9\xf0\x27\x5f\x2a\x55\x1a\x7d\xa3\xdf\xaf\xdd\x6e\x17\x66\x94\x46\xd6\xa8\x5a\x79\xfb\xff\x80\x7a\x6e\x26\x04\xe7\x6e\x70\xc4\xe5\x30\x8b\xb0\xac\xca\x97\x73\xe3\x1b\x66\x89\xc0\x3e\x9b\xf5\xee\x1f\x27\xde\x4b\x8e\xd1\x90\x53\xa2\x2d\x55\xda\x55\x5e\x14\x48\x90\xe3\x37\x82\x50\x48\x3d\xc9\x89\xf5\x0a\x7d\xe3\xad\x24\x14\xa0\x8d\x55\x2a\x90\x4e\x7c\x7a\x58\x66\xa6\x85\xfd\xea\xf9\x8f\xf5\xd3\x7e\xb9\x78\xdc\x7f\xdd\xdc\x7c\xdd\xfb\x0e\x54\x1a\x2a\xca\xc0\x28\x66\x22\xd1\xe2\x50\x9e\x64\xf2\x86\x55\x16\xdb\xae\xdf\xf7\xea\xcd\xb9\xf4\xe3\xc9\xad\x04\xa0\xeb\x6d\xf2\x32\xe7\xcc\x89\x34\x04\x6a\x04\xb2\x3c\xe7\x93\xe2\xd5\x7e\x48\xd4\x35\xf9\x51\xe0\xf1\x88\x23\xca\xac\x8c\x9a\x37\x79\xf9\xf2\xd8\x67\x5a\x42\xe0\x29\xe6\xa2\x1e\x9f\x1e\x1e\xae\x8d\x40\xd8\x76\x73\xe3\x8f\xaa\xd0\x28\x60\x35\x88\x93\x80\x4f\xe4\xd5\xba\xc1\x29\xb7\x21\xb1\x91\xbe\x74\x57\xd1\xc4\xd0\x96\x1e\x91\x40\xb7\xf8\x18\xf0\x65\x75\xb7\xe2\x26\x6c\x14\x84\x09\xb7\xfc\x82\xeb\xb2\x9d\xf4\x42\xd1\x28\x88\x12\x7c\x05\xfb\x9e\x3f\x02\x25\x4c\x67\x8d\x6c\x14\xe8\x90\x79\xeb\x9f\x83\xb2\x0c\x07\xb7\xbc\x69\x87\x09\xb3\xa8\x73\x0a\xa1\x87\x4d\x9b\xc2\xba\x95\x6c\x19\x5f\x91\x26\x89\x66\x2e\xa2\x30\x9b\x35\x16\xb1\x7b\x74\x03\x8d\x68\x9a\x60\xc3\x2b\x96\xa4\x96\x03\x26\x14\x7b\x9c\xc5\x09\x2a\x2e\x1e\x90\x67\x85\x0e\x3c\xe5\x88\xc9\x20\x36\xda\x4c\x79\x8d\xb3\x37\x2f\x5f\x86\x90\x2a\x1a\x85\x81\x49\xe1\x3e\xf2\xe3\x47\x3d\x21\x1a\x3e\xb7\xbb\x51\x08\x31\x16\x69\x0e\x58\x8d\x3c\x38\x96\xa2\xc6\xa3\x1a\xdc\x75\xa3\x80\x60\x9e\x83\x17\xed\x1e\x9b\x55\x0b\xc4\x62\x8b\xf3\xda\xbc\x3b\x21\x94\x46\x16\xc8\x49\xdd\x39\x91\x02\x77\x3c\x35\xa4\xf7\xa6\x98\x3c\x94\x1b\xa3\x51\xa4\x62\xb4\x69\x2d\x72\x36\x3a\xe2\x17\xb8\xd0\xd1\x4b\xa3\x38\xe4\xd8\x75\xeb\x78\xe2\x1f\x6d\x89\xa2\x2a\x9b\xab\xf3\xfe\x63\x7f\x92\xc6\x3e\xaf\x1a\x9d\x49\x43\xd7\x73\x03\x67\x5a\xa6\x76\x74\x92\x6a\xcc\x3c\xf0\xfa\xf0\x81\x73\xc3\xb4\x86\x35\xdf\x27\x90\x2f\x1a\xa5\xca\xdc\x0c\x3a\x78\x47\xe4\x57\x18\x0f\xc8\x42\x81\x3d\xbc\x2f\x35\x7c\x74\x71\xef\x1d\x2f\x07\x9e\x92\x1b\x14\x47\x26\xd0\x46\xd2\x8b\xbb\x19\x1d\xcd\xc9\x45\x63\x10\xe0\xdb\x5c\xcc\x47\xbc\xae\xab\x43\xe7\xbe\x3e\xd6\xd5\x0b\x48\xbf\x22\x27\x27\x26\x31\x86\xa3\xbe\x01\x7d\x21\x25\xba\x15\x67\x03\x53\x06\x91\xdd\x43\xe7\x39\x74\x27\xb7\xc4\x99\xc1\xbe\xe9\xbc\x54\x2e\x66\xdd\x94\x77\xfc\xe7\xfa\xe7\x11\x73\xfc\xbb\x69\xff\x1c\x8d\x44\x1a\x19\x0c\x67\x55\xa8\x8d\x02\xfe\x1d\xf2\x8d\xac\xdc\xbc\x10\x99\xc9\xcc\x18\xa0\x98\x4d\x5e\xef\xaa\x29\xa5\x9b\x1b\x2d\xd3\xc0\x83\xd5\x71\xee\x99\x0d\xfd\xe4\x7b\x2c\x69\x24\x20\x64\x46\x43\xba\xcd\x35\xb2\x2e\x6b\x27\x41\xfa\xa9\xc7\x1a\x49\xa2\x31\xb7\x67\x13\x75\x1e\xf7\x73\x5b\x71\xd5\xaf\x1a\x95\x66\x49\xcf\x53\xdb\x19\x01\x97\x20\x8a\x20\x4e\xb3\x74\x60\x7c\xaf\xab\x1a\xf2\x97\xf2\x2f\x30\xcf\xd2\x08\x84\x51\x35\x81\x9f\x03\x36\x1f\x77\x61\x4d\x15\xf6\x91\x3c\x81\xc1\x2e\x75\x8b\x7a\x50\xa3\x9b\xbf\xa2\x8e\x22\x27\x69\x8f\x14\x31\xdb\xfc\x3f\x7e\xa5\xea\x08\xf0\x4e\x55\xb5\x50\x2a\x37\x52\x79\xb6\x21\xf5\x6c\x06\x8c\x2f\x2a\x53\x23\x45\xa3\x0e\x79\xb9\x50\x6a\x99\x9f\x65\x6c\xfe\x36\x4c\x47\x45\x5a\x49\x4c\xa9\x81\xca\x5b\x23\x9e\x75\x21\x5f\x3a\xf2\x6d\x22\xad\x43\x84\x9e\x7c\x3d\x1d\x78\xb9\x6d\x79\xa9\x78\x6d\xfa\x85\xe8\x67\xbd\x26\xe6\xec\x38\x88\x14\x3a\x7d\x48\x4b\x7d\x7b\x92\x6f\x1f\xc6\x16\x9c\x45\x3a\xb3\x3e\x7e\xea\xae\x92\x25\xd1\x44\x4b\x1d\x41\xc8\x6a\xb8\xba\x2f\xb2\xac\x9d\x5d\x75\xde\x29\x8c\x03\x19\x60\x9a\xfc\xf1\xe9\xe1\x6e\xbd\xfb\xba\x7e\xde\xee\xb7\x5f\x37\x8f\xfb\xdb\xcd\xdd\xc6\x21\x7c\xe2\x40\xa5\x48\xe8\x7e\xe0\x6f\x60\x27\xfe\x13\x70\x47\xab\x4f\x63\x92\xc4\xb8\x2e\x5b\x68\xda\x4d\x09\x7f\x1a\xef\xa9\x8b\xa6\xdd\x08\x1a\x72\xb3\xdf\xf1\xbc\x81\xbf\x73\xf9\x76\xac\xfa\x63\xd2\xf0\x48\xd9\x1d\x60\xf9\x9a\x1f\xaf\xf8\x8b\x3b\xca\xa8\xa9\xb2\x39\xb6\x0b\x53\x90\x6e\xfc\xe1\x6e\x7f\x1a\x71\x54\x75\x3e\x91\x2f\xb1\xc4\x2c\x0e\x88\x63\x90\x31\x3c\x95\x93\x6a\x89\x1b\x97\xa6\x58\x50\xef\x1e\x01\xab\xe9\xfe\xf6\x98\x1c\xca\xf5\x5c\x9d\x3e\x46\x11\x88\x1b\x04\x09\x12\x9c\xac\x55\xde\xb6\xa0\x46\x8e\xc4\x78\x61\xc4\x61\x68\xca\x21\x7e\x99\x9e\x0a\xb3\xaf\xcf\xc1\xb6\x68\x1c\x6a\x92\x76\x6f\x6e\xf9\xf4\xf0\x7d\x85\x48\x9d\xf5\xee\xeb\x7e\x73\xbf\xff\xbe\xde\xec\x17\xcb\xe5\xfa\x71\xb7\x5e\xed\xef\x1c\xa0\x92\xc6\x11\x51\x18\x37\x1f\xad\x01\x59\xd4\xc0\x7d\xb5\x0c\x6f\x25\x74\x73\x24\x1c\x4d\x9b\x4f\x40\x2f\x71\x94\x18\xaa\xd5\x55\x65\xd5\x03\x99\xfb\xb9\x98\xc5\xe8\x9f\x6c\xdb\xe3\x88\xf8\x9e\xc6\xb1\x08\x34\xb5\x4d\xac\xdb\x96\x4b\x5f\x45\x8e\x63\xdb\xb2\x61\x79\x09\x9e\x36\x73\x71\x48\x1c\xeb\x10\x67\x5d\x61\x49\x42\xa1\x47\x53\xd2\x38\x61\x01\x2a\x31\x1f\xf2\xd2\x36\x64\xf8\x23\x51\x26\x45\x4f\x26\xe6\x7f\xb4\x73\xee\xb5\xeb\x8c\x6e\xbc\x0b\x70\xc1\x95\x8d\x53\xc1\x3c\x06\xe0\x2a\x6f\x7f\xaf\xea\x6b\x9e\x17\x58\xc0\x79\x78\xb8\x72\x17\xcd\x68\xe0\xf4\x49\x47\x72\x18\xd3\x60\x7e\xd6\x5b\x8c\x33\x60\x44\xff\xff\xd1\xfc\x64\x7f\x8f\x13\x61\xa8\x4b\x0b\xe0\x75\x17\xa0\x8f\x02\xa6\xc9\x58\x19\x23\x88\xe2\xaa\xba\xaa\x76\xd5\x6f\xfd\x67\x15\x01\xe0\x06\xa7\xc4\xb7\x4b\xc6\x3f\x16\x54\xd9\xc8\x02\x8e\x83\x50\x29\x16\xa9\xa1\x76\x6e\x3d\xeb\xfe\xfa\xa7\x05\x20\xbb\x11\x4a\x61\x8d\xd5\x54\xe2\x67\x44\x1f\x69\x2c\x93\x94\x04\x8e\x11\xa4\xc2\xb2\x92\x63\xb6\xb0\x23\x54\x98\x85\x36\x71\x6e\x92\x83\x93\x2b\xa8\x58\x81\x15\x70\xbb\x84\x35\x89\x55\x62\xe4\xd3\xf2\xde\xdd\xb6\x49\x3e\x37\xc0\x82\x0f\xd1\x31\x1f\xb0\x43\xfb\xbb\x00\x42\x2c\x45\x98\xa9\xfb\x8f\xf6\x08\x48\x38\xf6\xbd\xed\xf3\x32\x6f\x1f\x8e\x79\x39\xe4\x52\x1a\x8f\xd4\xd2\x40\x0d\x5b\x5e\xa3\x71\xb3\xb8\xac\x0b\x7b\x88\xe3\xd4\xb4\x67\xeb\x38\x44\x38\xad\x9b\xef\xfb\x4a\xef\xad\xe6\x6e\xfb\xb1\x57\x53\xfe\x53\x9a\x04\x59\x80\x4e\xec\x55\x2b\x79\xd9\x1d\xf8\xe2\x0e\x70\x13\x9c\xbe\x43\xe9\x98\xcd\x68\x12\x48\xa5\x99\x2b\xf7\xd4\x6f\xd0\xa2\x77\x3a\xda\x62\x12\x1a\x04\xc8\x83\xa3\x1d\x7b\xfb\x75\x5e\x14\x57\xd5\x94\x24\x8b\x26\x34\xe3\x41\xdf\x9c\xb1\x82\x02\x5e\x78\x5b\xd5\xdd\x27\xf2\x69\xe8\xd9\xf9\x96\xb0\x20\xc9\xac\x52\x71\x4f\xc5\x3f\x7a\x8d\x09\x0b\x24\xb5\x09\xae\x5d\xb5\xb8\xfe\xfe\x65\x72\x85\x84\xa5\x4e\xbb\x79\x9a\x7e\x4a\x42\x42\x30\xb5\xbe\xe6\x75\xfb\x7a\x1c\x6a\x9f\x76\xc7\x04\x52\x86\x22\x33\xe5\x66\xb7\x71\x64\x08\x34\x09\x43\x4e\x2d\x58\xea\xb1\xae\xd4\xe9\x1c\x09\x39\x6b\x6b\x93\x08\x0c\xb6\xf2\x05\xda\x15\x52\x07\x0d\x6f\x25\x4e\x0c\x1d\xc4\xb1\x86\xd5\xcd\x3f\x87\xf6\x36\x49\x82\x08\xad\xc9\xa9\x31\xd9\x65\xff\x77\x61\x8a\x93\xcb\xc5\xd3\xef\x03\x5d\x5e\x9a\x24\x2a\x32\xdb\x76\x1f\x5a\x7a\x66\x30\x3f\x46\xf3\x34\x9d\x94\xd1\x1f\xfc\x4f\xa6\xa9\xc0\x24\xc3\xb2\x2a\x75\x91\xcb\x16\x01\x68\xb8\xbd\x1a\x30\xea\xc4\x81\x4e\x52\x69\x38\x7d\x05\x97\x6f\xdf\xf3\x52\x55\x3f\x16\xea\xff\x4e\xc6\xa3\x7c\xe2\x6d\x5e\xf9\x0b\x6b\x85\x0a\xe1\x22\x57\x0f\xe5\xc2\x34\xc2\xec\xaa\xab\xd3\x04\xb6\x92\x64\x71\xac\x2c\x17\x56\xde\xbc\x36\x50\x68\xe5\x1b\x98\x68\x92\xa5\x1a\x2b\xd3\x37\xd0\xfe\xe3\x04\xa7\x91\x80\x05\x4d\x32\x19\x9a\x1e\x6b\xa5\x1e\xc1\x50\x68\xcd\xcf\x2e\x9e\x01\x92\xf6\x98\x4c\xc2\x08\x63\x9a\x70\x10\x08\xc7\x36\x5c\x04\xf8\xa5\xc6\x27\x8b\x4c\x60\xfa\xfc\xd0\x39\xc1\x72\x46\x08\x7a\x34\x4b\x25\x49\xb0\x1b\x7e\xbd\x7c\xb8\x7f\xb8\xfb\x63\x7f\xf5\xf0\xb0\x75\x6e\x58\x22\x19\x37\x5e\x69\xf9\x32\xa7\x28\x3d\xbe\x50\x9c\x20\x78\x08\x95\x25\xf7\x35\xbc\x03\x2f\xf6\x1c\x7d\xa0\xc3\x21\x6f\xe7\x13\xe2\xee\xdc\x24\xc3\x0a\x5e\x5e\x36\x50\xfb\x76\x8e\xf9\xae\x32\x77\x4a\xc6\x0d\xfe\x8c\x1f\x60\xd4\xa7\x4e\x13\x95\x52\x74\xf6\x0b\xcc\xce\x38\x6a\x5e\x9a\x40\x60\xa8\x73\xff\x71\x7b\xfd\x87\xff\x1b\x64\x48\x5e\x7d\xe4\x1f\x6d\xe5\x46\xa6\x81\x60\xb8\xc4\x6c\x1f\x1a\xb2\xc6\xb0\xc1\xa2\x48\x03\x69\x32\x87\x3d\x77\xa7\xc9\xbb\x78\xf1\x6e\x9a\x76\x3f\xc6\x2d\xd7\xa5\x6f\x13\xa5\x29\xb1\xad\x01\xa2\xfb\x3a\xce\x46\xd2\xcb\xe9\x8d\x94\x05\x86\x65\x79\xf9\xca\xeb\x17\x04\xbb\xb8\x03\x54\x62\x15\x66\xc9\x8f\x47\x53\x25\x51\xdd\x84\x18\x06\x7e\x6e\xa4\xcc\x1c\x3d\xd9\x2d\xef\x9c\x0b\x35\x9a\x52\x29\xd3\x99\x63\xe9\xc1\x96\xed\x59\xc1\x9d\x6e\x98\x21\x93\x7b\x81\xd6\x4e\x5f\xdb\x90\x6b\xaf\x36\x1e\x1d\x8a\xd8\x68\xb3\xf2\x9f\x46\xb7\x62\xfc\x9b\x51\x10\x0a\xb3\xdb\x6d\x7f\xf0\x63\x4f\x7f\x43\xd3\x28\x8a\x94\x85\x1d\xec\x16\x0f\xd7\xfc\x90\x17\x53\x45\x16\x37\x32\x31\x4a\xb4\xb7\xd5\x4b\xe7\x57\x3c\x79\xda\xd1\xe9\x38\x4d\x10\x73\xd7\x60\x34\x73\x51\xf5\xf4\x17\x75\x90\xbf\x8d\x76\x41\x7b\xe9\x38\x08\x90\xaa\xc2\xf1\x26\x9b\x0a\xd3\x85\x5d\x23\x8d\x43\x82\x9c\xfb\x7b\x14\xf3\x28\xce\x0a\xe5\xc3\x8d\x34\x8d\x6d\xff\xd2\xd7\xea\xd4\x80\x97\xf1\xa1\x69\x4a\x28\x76\x1c\xc2\xcf\xbc\xe9\x02\xd8\x8d\xf7\x38\xd3\x94\x32\xdc\x4a\xef\x60\xdb\xcf\xb8\x54\xc4\xc1\x80\x3e\x76\x0a\x64\x48\x53\x2d\x9c\x4f\xb8\xc4\xea\xf5\xf3\x20\x53\xd3\x33\x5b\xf6\x4f\x91\x05\x19\x0a\x87\x37\x1f\x65\xfb\x0a\x4d\x17\x66\x9b\x10\xf8\x5f\x91\x9b\xb4\x59\x18\x64\xd6\x25\xf6\xa0\xea\x5d\xb5\xe8\x82\xe8\x66\x9a\x27\x4a\xb3\x38\xc1\x14\xa6\xce\x8f\x8d\xc9\x25\x1a\x64\x93\x2d\x96\xcd\x67\x2f\xd2\x4c\x11\xdc\x64\xac\xb3\xe3\xe6\xbf\x7b\x6a\x4e\x8c\x2e\xec\xcd\xd5\x70\xcb\x4a\x05\xd1\xd8\x8c\x9c\x37\xb7\xae\x89\x8f\xd1\x51\xc8\x9f\x0a\x99\x65\x46\x74\xeb\xb8\x3d\xf0\xba\x1d\x9d\x2f\x63\xc3\x86\xd3\x40\xbb\x58\xde\x3e\x55\x05\x44\x59\x96\xd1\x2c\x24\x2c\x48\x92\x8c\xb1\x90\xb1\x74\xf2\x82\x65\x12\x4b\x39\xe2\x52\xbd\x38\xf5\xa6\x58\xc2\x59\xdb\x97\xaa\x80\x0c\x54\x56\x97\xd5\xe1\x58\x95\x50\x5e\x68\x7b\x48\x55\x94\xa0\x2f\x21\x5a\xe9\x9e\x02\xe2\x54\xd9\xe6\xf2\x87\x52\xc2\x9d\xd7\x1c\x98\x18\x0e\x90\x3a\x10\xb6\xe1\x09\xb9\x15\x40\x7d\xe5\xe5\x08\x19\x90\x76\x6b\xab\xbb\xfc\x42\xa9\x55\x5d\x95\xf0\x19\x89\xb0\x39\x25\xeb\x2c\x5a\xe7\x06\x0c\x32\x15\x9b\x83\xdb\x43\xb3\x40\x87\x68\x21\x8b\xea\xa5\x1a\x26\x95\x33\x92\x45\x81\xc5\x12\x98\xf0\xed\x36\x17\x35\xf7\xd0\xc0\x8c\x46\x31\x52\xb3\x63\xea\xcf\x77\xf8\xd2\x8c\xea\x04\x9f\xd6\xfa\x51\xd6\x41\xb7\x07\x19\x4b\x84\xf2\x01\x02\x2a\xa8\x1f\x79\xe9\xaf\xc9\xe2\xd4\x76\xec\xe4\x2f\x2f\x50\x5f\xe7\xa5\xcd\xb0\xfb\x01\x52\xa0\x56\xc6\xed\x7a\x87\x5d\x86\xfb\xe1\x74\xc9\x98\x22\x48\xab\xde\x70\x0d\xdb\x93\x98\xff\x42\x59\x18\x46\x88\xca\x5f\x97\xb2\xe0\xef\xd0\xac\xd6\xbf\x3f\xd6\xd5\xcf\xb3\x9c\xcb\x2f\x2d\xd5\x74\x1a\x8d\x76\xd9\x2c\x8c\x42\xea\x83\x3f\xdc\xd8\x76\xb7\x7f\x1c\xa1\x5e\xef\xbe\x7e\x99\xdc\x50\x2a\xb1\xb7\xd1\x94\x16\x57\x06\xdf\x31\xf0\x41\xb3\x10\x14\x6e\x6e\xef\x55\xeb\x81\x05\x0f\xfa\xc2\xe3\x45\x81\xc6\x09\x88\xe2\xed\x9f\x66\xa2\x2e\x4e\xf9\x2c\x4a\x05\xc6\x77\xfb\x61\x1b\x2c\x76\xc0\x3e\xe8\x6d\x5b\xd5\xfc\x65\x92\xc6\xc8\x62\x1a\xa3\x99\xb4\x79\x4b\x14\x57\xd8\x02\xa8\xc5\xa0\xc9\x79\xda\x82\xf9\xdf\xdd\x53\x2c\x18\xb5\xab\xc8\xef\x29\x7d\xa1\x23\x8b\x35\x28\x03\x7f\x6e\x7f\x25\x29\x4a\xb3\x44\x99\x86\xdd\xea\x08\xe5\x10\x62\x3b\xa9\x9a\x67\x69\x42\xc3\x68\x0c\x33\x37\x10\xcf\xd9\x78\x3f\x4b\x05\xc7\x0d\x61\x51\xb6\xf9\x9f\x27\x40\x27\x6e\x76\x6b\xca\x32\x41\x22\xbb\xeb\x5a\x99\x48\x0b\x23\x1d\xe1\xe9\x32\xce\xb9\x42\x4e\x24\xde\xd6\xf0\x3b\xbf\xd8\xdd\xf8\xcb\xf4\xe0\xf9\xeb\x14\x89\x46\x42\xaa\xdd\x5b\x51\x3a\xa9\xe7\xe1\x5a\x92\x2c\xc2\x02\xf8\x43\xfd\x52\x95\xe3\x23\x32\x96\xe9\x00\x65\xf2\xcd\x0a\x36\xff\x3a\xc1\x9f\x49\x95\x86\x3d\x6a\x63\x5d\x2a\xbb\x32\x26\x0b\x42\x85\x29\xa6\x46\x55\x7d\x3c\x8d\x7e\x5a\x45\x49\xda\xe7\xea\x16\x57\xf6\xd7\x66\x71\x8f\x99\x12\xa6\x6e\xeb\x41\xeb\xbb\x6a\x3b\xe8\xa3\x9d\x8c\xd6\x99\xa1\xad\xa8\x4a\x84\x70\xf6\xcd\x49\xe3\x55\xad\x21\xc3\x98\xea\xf9\x6a\x84\x8a\xcb\xb4\xa6\xa9\x6d\x66\x44\x5e\xd0\x6d\xcb\x47\x1e\x18\x0f\x28\x45\x73\xda\x1c\x5e\xc6\x4f\xcb\x03\x15\x68\x1b\x9a\xee\x61\x14\x98\x72\x12\x06\x88\x4a\xbc\xcb\xcb\x8d\x4f\xcd\xfb\x83\x11\x45\xdc\xd2\x36\x7f\x29\x79\xf1\xf8\x51\x4c\x93\x9e\x9c\x24\x31\x75\x3a\x07\x57\x75\xf5\xe6\xed\x28\xa7\x81\x41\x0a\x6d\x0e\x47\xa8\xab\xcd\x6e\x90\xc4\xe1\x94\x19\xa2\x8d\x17\xcf\x64\x33\xd2\xbc\xa6\xbc\xb3\xfc\xc8\x4d\x6a\x80\x79\x47\xff\xf1\xc7\xcf\xc5\x54\x80\x70\xd2\x2b\xf6\xeb\x9c\x3a\x0f\x53\x06\xb6\xde\xbf\xdc\x4e\x1e\x23\x22\x12\x41\xf1\x7d\x85\xb6\x5f\x08\xb3\xcb\x8b\x47\xd4\xac\xef\x9e\x59\x69\x8d\xec\xd9\x23\x45\x8c\xe9\x39\x4c\xe2\xe2\x5d\xff\x84\x5a\xe6\xcd\x64\x4e\xf2\x98\x1b\x0a\xad\xce\x91\x9c\x2a\x36\x5e\xd8\x18\xdc\x99\x92\xd3\xc4\x37\x0b\x3d\x42\xbd\xfb\x39\xb9\x76\x12\xc6\x26\xd9\x89\xb8\x24\x63\x10\xda\xea\xdc\x65\x1e\x9f\x95\x32\x16\x6b\xc7\x24\x8d\xbb\xb0\x25\x31\x99\x0c\x0b\x39\xa2\x4c\xff\x53\x95\xd0\x79\xff\xf5\x61\x0c\x1a\xe4\x29\x50\x47\xb0\x69\xab\x80\x55\x8d\x97\xa3\x17\xde\x54\x16\x25\xc2\x8a\x77\xce\xe8\x58\xcc\x2f\x7d\x9e\xc5\x09\x72\xd6\xb6\x96\xd4\xc3\x17\xa0\x79\xc6\x2d\xf8\x87\x23\x7d\x94\xef\xcd\xe1\x99\x22\xd8\x2a\xdb\x79\x72\xb6\x03\x6e\x7d\x3f\x9d\x1c\x3c\x48\x10\x76\x0b\x65\x0b\xf5\x6d\xd5\xb6\xe0\x2f\xcc\x39\xc1\xe6\x92\x55\xfe\x92\x4f\x6b\xea\x5c\xd0\x18\xb3\x77\x47\x97\xd9\x6b\x61\x5c\x6f\xe6\x32\xe0\xc4\x11\xb0\x35\x50\x23\xf7\xc1\x6c\x0e\x9f\xcb\x88\x19\x45\x16\xcf\xe3\x65\x80\x71\xcb\xd3\xc4\xc5\xe3\x92\x1b\x51\x4d\x71\xfa\xb8\xcd\x25\x94\xcd\xb9\x73\x3a\x5a\x16\x8a\xc4\x28\x3d\xfc\x3d\x2f\xd7\x43\x7b\xc3\x15\x8b\x91\xd7\x72\xfb\xfc\xcd\xfd\x09\x12\x0a\x6e\x53\xb3\x69\x80\x03\x4c\x9d\x4c\x0e\x69\xcc\x6d\x8d\xf3\xb9\x6c\x9b\x3f\x27\x08\x67\xae\x03\x30\x32\x0b\x4d\x17\xbf\x19\x5a\x86\x59\xfb\xca\x75\xa4\xb1\x67\x5e\x56\x65\xdb\x63\x4f\x3e\x2b\x33\x88\x80\xa5\xd8\xe3\xd1\x85\xbe\x5a\xa3\xa1\x35\xf4\x04\xcb\x99\xca\xcd\xfc\x44\x12\x41\x1a\x27\x0a\x3d\xe0\x43\x5e\x4e\x83\x4f\x11\xe8\x4c\xc7\x5e\x1f\xec\x3b\xe4\xd7\x55\x6d\xd8\xae\x8d\x1e\xdb\x6d\xe7\x5d\x7d\xae\x48\x41\x05\xb1\x38\x5d\x04\xf4\x76\xcb\xe1\x4e\x3a\xcb\x29\x88\x32\x20\xf9\xbc\xd4\x05\x9f\xbc\x5c\x41\x89\x4a\xac\xa5\xca\xcb\xad\x69\xe1\xb9\xf4\x5b\x63\x94\xa0\xbd\x40\x18\x28\x92\xcd\xcb\xdd\xb8\x11\xd4\xd5\xc8\xeb\xc6\x55\xa9\xd7\x3e\x10\x13\x61\x12\x61\xc2\xb6\xe8\x9e\xf3\xa1\x9c\xd1\x00\xa2\x22\x8a\x8c\xfe\x74\x55\x73\xd9\xc5\x47\x7b\x04\xbd\xcf\x3b\x4c\xd3\xce\x78\x11\x07\x1a\x99\x88\x9d\xd6\xdd\x9d\xe9\x10\xbf\x28\xeb\x3f\x3d\x5d\x0a\xe8\x7b\x0c\x76\x3f\x57\xbc\xe5\x48\x38\x61\x73\x77\xa3\xdd\x56\xc4\x3a\x00\x69\x95\x5d\x0d\xdb\x7e\x65\x73\x21\x7d\x5e\x7f\x24\xf4\x4a\x45\x92\x25\x88\x5c\x16\xe2\xc3\xad\x64\x91\x70\x82\x61\xc5\xd5\x72\xed\xff\x04\x14\xc1\x81\x7f\x9e\xe0\x04\x77\x95\xf2\x63\xd3\x34\x73\xd0\xeb\xeb\x1a\xe0\x37\x10\xbc\xcf\x29\x8a\x2c\x34\x39\x10\x24\x37\xf8\x81\xd9\x7a\x7b\x84\xab\x80\x39\x35\x56\xc3\x05\x4b\x13\x77\x4c\x44\x2a\xb4\x00\xf1\xfd\xc9\x52\xb0\x4f\xe6\xad\x88\x19\x52\xaf\x0f\x68\xfa\x67\xd1\x17\x42\x80\xe1\x46\x44\x5e\x85\xe6\x73\x4a\x28\x7b\x8a\x0c\x80\xb9\xf2\xad\x41\x9c\x57\x6f\x3d\x39\x0d\x15\x92\xa4\x4c\x7b\x81\xfd\xc7\x82\x4b\xe8\x33\x6b\x42\x12\xe9\x0a\xfd\xf7\xa7\x6e\x9f\x79\xd0\x1a\xea\xca\x23\x62\x85\xa4\x80\x66\xba\x67\xf8\xbc\xcc\xcf\x45\x85\x14\x2c\xb0\x8c\x18\x9a\x97\x62\xda\xb5\x2d\xa4\xe4\x68\x55\x8e\xc5\x47\xfd\x54\xaa\x66\x5e\xcd\x95\x0a\x09\x80\xdf\x54\x9c\xf2\x42\xed\x31\xec\xe8\x71\x99\xa2\x8b\xd9\x91\x55\x9f\xd7\xa6\x75\x0d\x0b\x48\xd8\x24\xe3\xd2\x8e\x02\x48\x12\x5b\xf1\x4f\x37\x60\x06\x27\xed\x06\x53\x86\x3e\xc8\xd5\x62\xbb\x59\xee\x9f\x16\x3b\x3f\x93\x20\xa4\xb8\xe6\x87\x3c\x36\x93\x67\xd2\x44\x21\xd1\xd6\xea\xf9\x69\xb1\xdb\x3c\xdc\xef\xef\x1f\xee\x9f\xb7\xeb\xdd\x7a\x71\xe7\xae\xa2\x63\xd3\xa7\x75\xf0\xc4\x56\xfd\x11\x93\x33\x75\xf0\xf2\x73\x21\xc5\x6e\x8c\x46\x04\x87\x75\x4c\x6c\x23\xe6\xf8\xc5\x6b\x0e\x98\xa2\x39\x1c\x6c\x6a\x79\xca\xd5\x4a\x65\xc0\x02\x44\x90\x1a\xeb\xf3\x54\x55\x0e\x7b\xd9\x4e\x50\x73\x92\x24\x61\x94\x0d\x34\x05\x9d\x3a\xf9\xf5\xa9\x28\xac\xe4\xf4\x92\x97\x1e\x41\x20\x69\x44\x70\x0a\xde\x56\x28\x7b\x34\x86\x4d\xbb\x31\x60\x84\xb4\xde\xf2\xa2\x98\x72\x4b\xd8\x21\x8c\x47\x56\x9c\xb3\xbd\xe6\x45\x21\xb8\x7c\xb3\x5d\xb7\x23\x92\x0d\xc9\x04\x8d\xe2\xde\x1b\xc7\x49\x3f\x79\x02\x26\x14\x62\xaa\xf0\x9d\x0e\x9c\xeb\x4f\x7d\x2e\x19\x5a\x91\xcc\x2e\x20\x94\xd5\x80\xdf\x9c\xca\x30\x8c\x90\x8a\x53\x55\x80\x60\xa3\xaf\xfc\x1d\x66\xdd\x05\x19\xa6\x19\xae\x75\x28\x65\xa5\xc0\x90\x77\x54\x17\xe8\x54\x64\xc8\x03\xf4\xf2\x1a\x27\x63\xeb\x95\x7b\xa8\x0c\x25\x73\xb2\xee\xae\xb0\x63\x32\xa2\xf3\x6e\xb1\x0c\x15\x8d\x53\xa7\x80\xfc\x04\x7a\xf2\x76\x23\x6a\x5a\x42\x97\x55\x0d\x77\xa0\xf2\x5e\xb8\x9b\xca\x58\x1b\x19\x09\xe7\x83\x63\x13\x65\x7b\x52\xf9\x99\xb0\xf8\xe4\x37\x93\x04\x62\x43\x73\x75\x0b\xba\x9d\x0b\x14\x64\x2a\x12\xa7\x43\x86\x73\xe7\xfa\xfc\x65\xcc\x5b\x36\x99\x31\xc3\x60\x27\x8a\xbc\x74\xe9\x36\x99\x65\x2a\x74\xd4\x77\xd8\xe4\xfe\xcd\x68\x69\x0f\x2b\xb0\x7d\xe2\x40\x66\x2a\x66\x46\x42\xb9\x3c\xf1\x62\x98\x02\x93\x92\x18\x42\x0a\x95\x37\xfc\xa5\x86\xe9\x77\x54\xca\x70\xb2\x49\xff\xd3\x4a\xa5\x2e\xe7\x63\x13\x1f\x0f\xe2\xff\x3e\xf7\x67\x24\x04\x1a\x33\xab\x87\xbc\x1c\x03\x58\xdc\xf1\x90\x62\x77\x0b\x96\xf6\xf6\x8f\x4f\xeb\xcd\xf2\x61\xbf\x5c\x3c\xfa\xe3\x51\x6a\x22\xcf\x0a\x25\x54\x87\x0d\x5e\x52\xeb\x2c\xb3\x8e\xcc\x57\xa8\x2b\x8b\xa0\x41\x1f\x68\xfc\x0d\x54\x20\x08\xbe\xb4\x27\x50\xa6\x7e\x30\xdf\xc3\xa8\x02\x9d\x19\xc5\x22\x5e\x3e\x81\x02\x38\x3c\xef\x7e\x7f\x18\x29\xa9\x0f\xb2\x95\x8a\x04\x02\x0d\xca\xdb\x47\xbf\x87\x2a\x22\x8d\x8e\x35\xf6\x8c\xff\x96\x97\x2f\xd6\x5b\x1e\xbf\x5d\x45\xa4\xc6\x80\xeb\x58\x57\xc7\x57\xe8\x22\x32\xdb\xc3\x3a\x19\x47\x43\x19\xb9\x0d\xbb\xf3\x89\x76\x35\x2f\xe5\xab\xfb\x86\x8a\x65\xa6\x7e\xcb\x95\xfa\xed\x12\x07\x88\x62\x60\xe8\x28\x2d\xd4\xa4\x5b\x66\x53\xed\x98\xd9\x8f\xa7\x42\x66\x50\x70\xb9\xac\x90\xad\xd0\x62\x9c\xfc\x17\x50\x61\x9c\x22\xcc\xa4\x39\x02\xd8\x76\x7b\xe2\x4f\x56\x02\x19\x72\x4a\xf8\xf1\x7c\x2c\x2a\xae\xa6\xbc\x82\x27\xab\x96\x32\xf4\x89\x54\x94\x58\x15\x54\x63\xdb\xbc\x5c\xc2\x27\xc5\x0d\x15\x89\x54\xe8\x01\x26\x09\xf5\xef\xef\x00\xd5\x86\xaf\xc1\x63\x00\x54\xcc\x33\x23\xa8\xcc\x11\xd6\x61\xd9\xe3\x0c\x80\xcf\x8f\x51\x0c\x71\xd7\xef\xb9\x82\x6a\x92\x1e\x51\xb1\x4e\x11\x4d\x8d\xd6\xaa\xe7\x35\x09\xdd\xc9\x49\x48\x4d\x2c\x7c\x9c\x2f\x9e\xa9\x24\x14\xd4\xee\x76\x7f\xaf\xc4\xd7\xbc\x7b\x0f\x58\xae\x1a\x0f\x4b\x49\x26\x42\x27\x0a\xd1\x4d\x9e\x6d\xee\x10\x65\x2a\x65\x22\xea\x25\xc4\x2f\x7c\xf1\x34\x03\xcc\xb9\x0a\xec\x0a\xed\x42\x6e\x77\x7a\x96\x68\xe4\x5f\x73\xa4\x4c\x7e\xde\xa2\x77\xdd\xcd\xa4\x53\x83\x3d\x61\x76\xb2\x0c\xd8\x24\x14\x4f\x43\x47\x1b\xb5\x5c\x3c\x8c\x93\xfc\xae\x00\xa3\x44\x1c\x86\x80\x40\x0b\x2c\x28\x5d\x2c\x90\x8d\x6f\x58\x26\x4a\xea\xbf\x56\xd6\xf8\x6f\xff\xfd\x85\xad\xf5\x37\x2e\x33\x95\x49\xaf\x2e\x3a\xee\xa7\x19\x85\xad\x4a\x0a\xb3\x2c\x44\x5e\x62\xd3\x06\x6a\xa7\x76\x73\xee\x82\x55\x51\x14\xb2\x18\xdb\x68\x1c\x9f\xfd\x64\x91\x2b\x46\x53\x9b\xfc\xdd\x2c\x1f\x3e\x55\x51\xa6\x4a\x65\x4a\x59\x6a\xd2\x3b\xde\xc2\x45\x36\x3f\xaa\x80\x66\x2a\x1c\xd1\xfe\x8e\x8b\xab\xd3\xe1\x61\x84\x4c\x1e\xb7\xe8\x9f\xef\xed\xbe\x02\xb3\x3a\x7d\x54\x41\x24\xa2\xa0\xd7\x8e\x7d\xac\xab\xc3\x84\x71\x42\x01\xa7\x66\x73\x87\x52\x0d\x34\xc3\xa7\x83\x94\x50\x8e\xe3\x93\x97\x0d\xc7\x8d\xa5\xb7\xb9\x6e\x18\x44\x2e\xcd\xe4\xab\xe8\xbf\x98\x53\x9a\xc6\xd8\xfd\x7e\xac\xf3\xd2\xe2\x7b\xbe\x8c\x07\xc4\x32\x34\xd6\xab\xc8\x8d\x75\x9d\xfd\xdc\x3a\x31\xad\xeb\x2b\x80\xe3\xac\xef\x7f\xe9\x5f\x77\x3e\xa7\xda\xbe\xa9\x2d\x3f\x1c\x2d\x4d\xd0\xc4\x81\x85\x00\x00\x99\x81\xdb\x57\xb0\xbd\xa3\x5e\x50\xd9\x8e\x20\x3c\x55\xc6\xd7\xc0\x7a\xc5\x6c\x19\x1b\x28\x33\x01\xfc\x6e\xb1\xb9\xdd\xaf\xef\x36\xdb\xed\xe6\xc1\x41\x66\x80\xa6\x21\x76\x44\x5b\x0e\xc3\x2d\xc8\x1a\x30\xf7\xc4\x8b\x5e\x2d\xeb\x6f\x93\x0b\x66\x59\x3a\xa4\x38\x7f\x84\x7a\xa2\xa2\x6d\x07\xb2\x24\x0a\x64\x8f\x73\x58\x6e\xb7\xae\xdd\x09\x58\x2a\xa2\xf0\xec\x1b\xf7\xb5\x66\x08\x03\x30\x95\x6f\xa3\x38\x31\x36\xbb\x10\x45\x80\x50\x97\xcd\x3f\x1c\x72\x11\x22\x4d\xd0\xef\x5a\xf1\x33\x0a\xaf\xf1\xed\xc7\xd4\x20\x84\x4f\x03\x75\x6e\x0a\x71\x14\x26\x7d\xa6\xde\x7a\xd7\x9f\x3a\x63\x90\x50\xc3\xdc\x9c\x37\xf7\xf0\xc3\xc6\x41\xe3\x9f\x4a\x68\x68\x48\x67\xf3\x36\xff\x0f\x94\x4d\x9f\x64\x1f\x5f\x29\x0d\x8c\x9a\x13\xba\x34\xfe\x15\xa4\x21\x11\x2e\x1f\x57\x1e\x4d\x83\x14\xa8\x7f\x9c\xa0\xfe\xb8\x32\x6f\x63\x7a\x99\x28\x42\xef\x03\xc1\x1f\xd7\x79\x51\x3c\xd4\xbf\xe5\x3d\x9f\xc2\xbf\xa2\x7f\x0f\xea\x26\xf1\xbf\xff\x2b\x25\x6b\x0a\x19\x31\x6f\xc8\xa0\x86\xb6\xa6\x59\xa0\xee\xb7\x7e\xe0\x94\xa3\x52\xd2\x72\x40\xcb\xe5\x0e\x25\x09\xd1\x83\x6a\x01\x1e\x9c\x42\x05\x80\x27\xd2\x71\x6a\x6e\xe5\x2b\x1c\xf8\xe4\xab\xf3\xd4\x54\x07\xba\x89\xc7\x3f\xb8\x28\x3c\x03\x6e\xef\xde\x02\xcf\x52\xb4\x9c\xb8\x22\x26\x4e\x8d\x1b\xc2\xd3\x2c\xb6\x3c\xcf\x79\xf9\x72\x95\x2b\x05\x23\xbd\x7c\x0a\x22\x50\x06\x86\x9d\xeb\x76\x6f\x1f\x68\x73\xbf\x38\x54\x6d\x01\x1f\xb7\x79\x09\x93\xe1\x24\xc6\x48\xa2\xa8\xe4\x9b\x89\xf5\x4c\xcf\xdc\x64\x22\x0e\x6e\x53\x70\x4e\x50\x1d\x6a\xbd\xb8\xdb\x3f\xae\x9f\x96\xeb\xfb\xdd\x7e\xfd\xcd\x45\xd9\x20\x04\xc5\xda\x78\x2e\x2b\x2b\x42\x6c\x0f\x48\x62\xba\xb7\xbb\x28\x7e\x5b\x9d\x6a\x09\xb3\x2c\x8a\x20\x69\x94\xf6\x45\x56\x7f\x76\x14\x12\xbb\xee\xb0\x48\xd4\xed\x3d\xe8\x43\xf3\x81\x0b\x0e\x40\x5c\x06\xdf\x46\xb7\xfb\x1f\xb9\xbf\x04\x84\x41\x10\x78\xd2\xdd\x6e\x1e\x34\x98\x21\x99\x7c\x2c\x48\x63\x64\x98\x7d\x3c\x35\xcd\xc7\x2f\x2b\x94\x00\x76\x07\x3d\x7e\xd4\xfc\x90\x4f\xd8\x4f\x74\x90\x29\xcd\x7b\x0c\xb4\xbd\x15\x4d\x62\x83\xed\xc4\xb2\x47\xe7\xbb\x98\xa4\xd9\x40\x4c\xca\x0f\x74\xba\xad\x3f\x5d\x22\xcd\x7b\xae\x03\x7f\x50\x93\x94\xba\xfd\x11\x5b\xf5\xfe\x3b\x56\x58\xaa\x29\x33\xad\x42\xdf\x1e\x97\x3f\xdd\x35\x69\x6c\xca\x4b\xd7\xbb\xdd\xa6\x69\x4e\x7f\x35\x73\xa8\x19\x61\x99\x27\x46\x55\xa6\xe8\x88\x18\x67\x2f\xe3\xee\x06\x5a\x0d\x7f\xae\xd4\x3d\xfc\x98\xdd\x04\x34\x4b\x4c\xc6\x9e\x2b\x85\xba\xda\x15\xa6\x5c\xe6\x37\xff\xe9\x7d\x64\x0a\xf9\x02\x1f\x6e\x57\xdb\xc7\xdd\xc6\xff\xaa\xe0\x91\x2d\x8a\x6c\x11\xa9\xd3\xe6\x3f\x4d\xf7\xd0\xe4\x97\x41\x99\x9e\x72\xc3\x4f\x77\xcf\x0f\x30\xdd\xca\x75\x18\x02\x42\x7e\x8e\x7b\x63\x94\xf7\xfc\x53\x2d\x56\x77\x56\x14\xe3\x33\x9d\x29\xba\x5c\x18\xae\x23\x27\xfb\xb3\xe2\x2d\x7f\xac\xf2\xb2\xbd\xae\xea\xed\x49\xfc\x1f\xcc\x40\x59\x47\xef\x20\x8a\x05\x35\x8a\x75\xba\x0b\x3a\x7b\xda\xb5\x79\x47\x43\x47\x00\x98\x00\x5d\xf2\x5a\x54\xa5\x13\x2c\x44\xf5\xab\x81\x59\xd4\x31\x44\x88\x0a\xfd\x96\xc3\x8f\xbb\x8f\x55\xfe\x3e\xfd\x6c\x49\x22\xa4\xec\x99\x36\x26\xab\x22\x49\x0d\x4c\x02\x83\x8f\xcd\xf2\x61\x7e\xc3\xd3\x49\x46\x11\xf1\x86\x05\x84\xbc\x69\x31\xfb\xb2\x50\xea\x7c\x26\xba\x13\x3a\xe7\xc3\xef\x85\x1b\x59\xa1\x34\x92\x9b\x75\x13\x2f\x59\x27\x82\xe1\xae\x93\x97\x4d\xdb\x99\x84\x66\x7a\x97\x22\x41\x4c\x94\xe4\xb6\x2f\xc4\x65\xb2\x36\xfa\x1e\x60\xe6\x2e\xe6\x22\x3a\x9d\xe8\xc8\x89\x90\x5d\x39\xb0\xdf\x25\x48\x88\xce\x08\xd7\x26\x68\x9f\xfa\x24\x3a\x8b\x04\x2e\x16\x53\x2f\x6a\x01\x1a\x44\x39\x4c\x47\x01\xc7\x39\x6f\xe4\x49\xa6\x4f\xc4\x03\x82\x64\x44\x79\x83\x35\x32\x43\x32\x34\xf9\x72\x82\x90\x24\xf2\x5a\x02\xd3\x2b\x08\x66\xfa\xb1\x0a\xb8\xd4\x7a\xac\x45\x96\x6a\xff\x71\xf3\xf2\x65\x2f\x8b\xaa\xec\x2d\x95\xe0\x14\x2b\xbe\xa6\x39\x14\xe3\xb3\xe9\x1d\x80\x71\xd3\x5e\xf9\x3b\x6c\xbe\x7b\xe3\xae\x65\x20\x70\x3a\x5c\x9d\x3e\xb0\xa1\xeb\x57\x90\x19\x77\x1a\xa5\xe8\xb1\xdd\x2e\xae\x37\xf7\x8b\x5b\xe6\x2f\xa7\x08\xee\xfa\x1c\x3f\x89\xa9\x6e\x6d\xca\xe7\xc6\x1b\x69\x15\x90\xa4\x97\x9d\xc5\xde\xb9\x07\xed\x3d\x21\x4c\x58\x6d\x76\x0f\x53\xd8\x9e\x56\x60\xea\xcf\x2f\x28\x55\x7a\x6a\x96\x15\x68\x9d\xcb\xbc\x07\x04\x68\x48\x03\x8a\x7b\x64\xb3\xfe\xe9\xe2\x59\x16\x04\x01\xa1\xa9\x2b\x4c\xf4\xe9\xa5\x51\x3b\xcb\xf0\xd1\x58\x10\xc4\x1c\xb3\x05\xe2\xf4\x71\x55\xa1\xbc\xc2\xa3\x17\x5d\xed\x8e\xea\x08\xdd\x9a\xf5\xee\x7a\xb0\x7a\x59\x10\x58\xf6\xf9\xa7\xcd\x6f\x23\xe4\xcb\xf0\x33\xb0\x20\x90\x31\x32\x37\x22\x75\x4f\x7d\xe8\xb6\x9d\x27\x90\xef\x5f\x26\xb7\x00\x86\xee\x7d\x6f\x36\xe6\x47\x5e\x23\x79\xf9\x70\x4b\x65\x01\x21\x1c\x21\x15\xdf\xbb\x77\xc8\x6b\xde\x3d\x52\xf7\xcb\xc4\xdd\x11\x11\x46\x96\xfa\x2e\x2f\xa0\x69\xab\x12\xf6\x1b\x59\x5d\xf3\xbc\x73\x91\x06\xbb\x2d\x0b\x28\x8d\x63\xc3\x7b\xab\x72\xfd\xb1\x28\x0a\x4c\x91\x2d\xf9\x71\xba\xbc\x59\x40\xb5\x42\x1e\x8c\xef\x5f\x37\xbb\xf5\xed\x66\xbb\xdb\x5f\x3d\xdc\x3f\x6f\x07\x25\x01\x16\xb0\x40\x90\xc0\x55\xd4\x4f\x58\xee\x71\xed\xbf\x96\x62\x72\x64\x54\x3f\x9d\x69\x2c\x60\x44\x24\x89\x8f\x0d\xd4\x50\x8b\x81\x05\x8c\x6a\x24\xc1\x45\x10\xc0\xae\x86\xe6\xd5\xf3\x9c\xb2\x80\x45\x21\xce\xd1\xef\x90\xe3\xa7\xef\xb6\xf8\x7a\x4e\x12\x94\x05\x2c\x89\x1d\xc1\xb8\x8b\xaa\x96\x67\x10\x45\x16\x84\x91\xd1\x8a\x3f\xf2\x8f\xe7\xa3\xfb\x99\x50\xc7\xb4\x8f\x20\x36\xe5\x2b\xd4\x79\xeb\xe8\xed\xfb\xc6\x19\x5f\xda\xba\x30\xed\x22\x46\x31\x9b\xbd\xe5\x1a\xfa\x84\x7c\xe3\x7e\x25\xe2\x12\x31\x69\xc6\x81\x1b\x3a\x81\x2c\x88\x21\xc1\x07\x45\x4f\x7f\xe3\x05\x15\x9a\xc9\xdd\x27\x69\x8a\xa9\x54\xc5\xeb\xb7\xb2\x52\x30\x52\x9b\x75\x63\x44\x82\xbe\x9e\xd9\xda\xa6\x19\xb9\xf1\xd8\x34\xa1\xca\x88\x47\x0e\x50\xdc\xee\x98\x34\x34\xfe\xc8\x0b\xd2\xbf\x52\x05\xe3\x99\x97\x45\x46\x4e\x55\x98\x4a\xc1\x68\x41\x65\x69\x80\xf1\xe2\xde\xa5\xed\xa6\x1c\xc7\x2c\xc8\x34\x75\xb0\x19\xac\x35\x70\x79\xa6\x3c\xf3\xb7\xe9\x19\x51\x9a\x0d\x85\x3f\x06\x7d\x19\x2c\xe0\xa9\xe7\x32\xba\xe3\x39\xd2\x39\x3d\xf2\x9a\x1f\xa0\x1d\x18\xed\x5f\xcc\x57\x11\x49\x23\x5d\xdc\x5a\xb0\xfe\x5d\xa5\xa0\x70\xbf\x20\x14\x70\x83\x44\x7f\xd0\x5a\xbe\xf2\xbc\x9c\x53\x26\xef\xb7\x3a\x16\xc8\x48\x13\x3b\x35\xf7\x75\x55\xf9\x37\x2c\x65\x84\xa5\xfe\xc3\xa9\x68\xf3\xeb\xfc\x67\x9f\x87\xf9\x17\xfd\xb7\x13\x56\x64\x81\x8a\x62\xfc\xa0\x9b\x16\x0e\xa3\xd7\xab\xa2\x4c\xda\x1a\xd6\xfa\xe5\xa5\x19\x2d\x2b\x10\x01\xd6\x34\x75\x0d\x96\x08\xdb\xa3\xb2\x58\x00\x4a\xa1\x17\x22\xf2\x76\x5b\xcc\xb0\xd5\x4c\xde\x07\xe8\x0c\x39\xb2\xdb\xea\x8a\x37\xc0\xe8\x97\xe1\xc3\xe9\x24\xc5\x0c\x10\x37\x10\x35\x57\xe5\xee\xf9\x7b\x59\xa0\x45\x44\x95\x4d\x12\x75\x5e\xcf\x4d\xae\xdb\xc9\xa4\xd5\x82\x63\x55\x1d\x4a\x75\x75\xfa\xb8\xe2\x28\xf6\xea\xee\x97\x04\x34\xc3\xc0\xfc\x07\xe4\xa8\xd8\xe9\x42\x54\x46\x82\x88\x22\x60\x16\x1b\x06\x07\xc9\xef\xf1\xe5\x49\x10\x8b\x2c\xf2\x08\xa6\x76\x3e\xb3\xc2\x48\xa0\x19\x4a\xef\xb7\xd0\xb4\xf6\x29\xc7\xaf\x82\x10\xa2\x30\x40\x71\x13\xfa\xd6\x60\xea\xcf\x1c\xdb\x91\x9d\xef\xcc\x7c\x0a\x2e\xce\x75\xa2\x12\x33\xe4\x6c\x6e\xb8\x4c\x0c\x14\xb5\x2a\x0a\xde\x42\xcd\x8b\xbc\xc1\x70\xce\xcc\xf4\xf1\x3d\x13\x65\x7c\x17\xae\xd4\x80\xc2\xf5\xd3\x10\xa0\x3b\x29\x43\xd5\x27\x33\x33\x3e\x64\x55\x95\x9b\x9b\x87\x2f\xfe\xa8\x4a\x2c\xf5\x69\xef\x4b\xa5\xff\x22\x81\x9d\x91\x84\x26\x44\x5b\x7b\xe9\x61\x49\x67\x91\x3b\x23\x4c\x3a\x62\x44\x84\x6c\x97\x7a\x7a\xef\x61\x92\xf8\x24\x78\x69\x7a\x73\x3b\xdb\x37\x92\xd9\x19\xdf\x78\xc8\xa5\xe1\xb6\x6f\x5b\x38\x1c\xdb\x5d\x85\x05\xe3\x25\xaf\xcf\x9c\x4e\x47\x43\xc5\x48\xa8\x24\x4e\x3f\x0d\xf0\xc8\x3f\xfa\xb9\x13\x45\x01\x6e\x05\x87\xaa\x6c\x5f\xe3\xc0\xa6\x2f\x07\xc7\xb9\xd4\x56\x89\xb1\x85\x7a\xcf\x87\xa0\x33\x46\x22\xa9\x10\x7e\x8a\xaa\x98\x0f\x1a\xa1\xff\x13\x13\x4a\x62\xce\x33\x9b\xf4\x75\x64\x94\x13\xed\x99\x61\xcc\xcc\x48\x92\x69\x70\xba\x44\xb6\x63\x74\xd8\x11\xc6\x48\xc2\x85\x34\x4d\x0c\xc8\xaa\x7e\xc7\x7f\xba\x23\xa9\x8a\x28\xb1\x95\x3e\x51\xc0\x15\xe8\xaa\x36\x0c\x98\x83\x44\x00\x23\x59\xa8\x22\xfb\x69\x3d\xd1\xea\xc9\x74\x5a\xf5\xdf\x2d\x13\x86\x44\xfd\xdb\x6e\xae\x8b\xeb\x34\xc5\x3e\x32\xc2\xb3\x04\x09\x13\x1f\x91\x69\xe9\xbc\x46\xc9\x88\x48\x23\xac\xf1\xed\xc5\xe9\xc3\x61\x15\x76\xbb\xbb\x33\xc3\x33\xeb\x72\x11\x19\x85\xb8\xb1\x9a\x0a\xa2\xd1\x54\xdd\x3f\x3e\xad\xf7\xbe\xcd\x85\x11\xc9\x01\x41\xbd\x8b\xb7\xbc\xa8\x86\x02\x88\x8c\x48\xc9\xd0\xfe\xc2\x3b\x2f\x4e\x67\xd4\x62\x8c\x48\x95\xa0\xb7\xd3\xf9\x6a\xeb\x9f\x47\xaf\xb2\x31\x9a\x79\x8a\x9a\x34\xcd\xd7\x87\xaf\x0f\x9f\x24\x3e\x18\x51\x16\x83\xe0\x77\x05\x93\x3f\x9a\xe6\xd8\xe7\x77\x37\xa2\xa2\x08\x13\x1b\x96\x4f\x8e\xd7\x97\x3a\xb6\xed\x78\x60\x71\x62\x2b\xe2\xeb\x9f\x12\x8e\x53\x12\xa2\xe9\xf0\x08\x32\x9b\x63\xc7\x3e\x21\x87\xc5\x2f\xa7\x16\x13\xd2\x14\x6d\x50\x79\x3a\x60\x11\xed\x9d\x17\x7e\xea\x6b\x2a\x23\x6a\x91\x87\x25\xd4\x74\xff\x5e\xb5\xa0\x5c\xa8\x7f\xac\xa1\x3c\x1d\xfd\xd8\x98\x68\x9b\x5b\x36\x3c\x84\xfc\x78\x01\xa2\xc2\x88\x4e\x32\x8c\x9e\x9b\xa2\x3a\x82\x35\xe6\xd3\xd4\x0f\x23\x5a\x73\x66\xa7\xf0\xb2\x3d\xcd\xf6\x9e\x31\x1a\x10\x85\x30\xa7\xb3\xc6\x75\x77\x3c\x95\x08\x92\xe2\x0a\xcb\x3b\x9b\xb2\xad\xce\xc4\xec\xec\x50\x12\x40\x9a\xd8\xdd\x0b\xce\x1b\x12\xec\x28\x4a\xa4\x31\xf1\x2d\x1c\xd3\x2f\xee\x8f\xcc\xac\xb6\xf5\xee\xeb\xfa\x69\x7f\xb7\xb9\xdf\x2f\x1f\xee\x77\x4f\x9b\xab\xfd\xf3\x76\xe1\x07\x71\x89\x75\xb1\x76\x18\x4a\xaf\x7f\x1e\x79\xa9\x66\xaa\xb7\xe3\xd6\xea\xf1\x9d\x52\x19\x1a\x2e\xf2\xca\xe8\x95\x7c\x19\xdf\xa1\x0a\xb3\xee\xa8\xab\x31\xab\xbc\x7c\x59\xcb\xaa\xf9\x68\x5a\x38\xf4\xf0\x69\x46\x19\x4f\x30\xd7\xb1\xbd\xda\xf5\x7f\xd2\xd8\x41\xf4\xca\x9b\xdd\x8f\x6a\xdb\xc2\xd1\x65\xdd\xfc\x08\x61\xda\xe2\xa5\xa9\xd0\x3f\xfa\x9c\xb2\x1b\x10\x06\x21\x36\x0c\x54\x5a\x03\xaa\xef\x5c\x57\xf5\x76\xa6\x13\xc0\x0d\x8f\x23\xa4\xda\xc3\x64\xd9\x43\x39\x6a\x6d\x67\x34\xe4\x8a\xda\x8d\xe3\xae\xb3\xde\x93\xaf\x1b\x4a\x89\xb6\xb9\x3a\xb6\xf9\x81\x17\x03\xcd\x53\x37\x00\x14\x76\xf8\x5d\x9d\xea\xf2\xb9\x6c\xbc\xd6\xf2\x64\x94\x36\x45\xe7\x96\x97\x6f\x8d\xb1\xa8\xbb\x57\xb8\x87\x1f\x3b\x5e\xbe\xed\x3e\x8e\xfe\xd9\xa2\x20\xe5\x46\xf2\xae\x3e\xf2\x36\x77\x7f\x8e\x29\xe0\xd6\x2c\x4e\x75\x39\xb4\xa4\xf6\x70\x42\x02\xb0\x09\xb7\xa1\x42\xc3\xe4\xa3\x26\x2c\x42\xaa\xca\x56\xc1\xea\x34\xcc\xea\x32\x9a\xf0\x0c\x9b\x9b\xcb\xd3\x61\x59\x9d\xea\xc6\xdf\x4f\x22\xc3\xc8\x10\x07\xbe\xbb\x50\x92\xa6\x3a\xc3\xfc\xf3\xbe\x84\x9f\xed\xd5\x49\x39\x1a\xc4\x45\xa9\xd6\xa5\x5a\x94\xea\xa1\x8b\xc6\x79\x61\x98\xbe\x06\xde\x22\xcd\x98\xc4\x69\xf5\xca\x4b\xb5\xab\x96\xa8\xb8\x7b\xea\x11\x8b\x8c\xf2\xd8\x34\xde\x23\xc0\xab\xe5\x85\xd3\x11\x98\xce\xdd\xf1\x83\x71\x99\xa1\xcb\x67\x59\x4b\xf7\x9b\xd5\x2f\xa5\x92\xdd\x99\xda\xbc\x12\xdb\xca\xb7\x28\xd5\x75\x0d\x70\x5e\x4f\xf6\xc3\x35\xbe\xe7\xa2\xe2\x67\x21\x5d\x73\x16\xd3\x9d\xb5\xd4\x32\x2a\x74\xe4\xf8\x4b\x2d\x00\x05\x09\x7b\xdd\xfb\x91\x4c\x60\x8f\xcb\x0d\xb4\x96\xa2\x79\xde\x44\x48\x61\x34\x4c\x5f\xc0\xcb\xa1\x4c\xb3\xab\x8c\x4a\x20\xc6\x30\x59\x54\xc4\x05\x43\x4e\x21\x33\x70\x4b\xd7\xc3\x62\x12\x71\x55\xdd\xc3\x22\x19\xd5\x81\x0e\x1d\x6c\xf2\x9a\xe7\x45\x1f\x42\x3f\x97\xe6\xfa\x7d\x77\x2b\x32\x90\x9b\xf3\x58\x90\x12\xa4\x64\x38\x95\x4e\x15\x74\x71\x52\xf9\x0c\x9e\xdf\x8e\x27\xb1\xc4\x70\xe2\x69\xb1\x5b\xef\xb7\x8b\xdb\xf5\x76\xb7\xb8\x59\x27\xee\x72\x24\x35\x6a\xcb\x9d\x01\x45\x91\xbe\xc6\x1f\xc9\x8c\x7c\xa9\xc6\xcf\x87\xe9\x4c\x7f\x48\x2a\x66\x78\xaa\x7f\x83\x8f\x11\x62\x70\x34\x17\x3a\xf3\x49\xe8\x80\x1e\x7d\x18\x04\x31\x9a\x46\xc8\x58\x75\xd6\x97\x76\xc6\x3c\xcc\x18\x0b\x4c\xbb\x10\x82\x7a\x16\xa5\x42\xfe\xb1\xd1\x07\x64\x2c\x8e\x9c\x24\xf3\xae\x06\xde\x9c\xea\x8f\x39\x16\x01\xc6\x98\xce\x10\xc2\x7b\x5b\xbd\x18\x36\xa0\x47\x57\xec\x9b\x9f\x1a\x2c\x8c\x13\x69\x93\xa1\xcb\xe2\xe4\x18\xb3\x18\x0b\x41\x61\x84\x28\xab\xb2\x39\x21\x31\x33\x4c\xee\x29\x4a\x39\x74\xb7\xfd\xb4\x5e\x3c\xae\x9f\xf6\x9b\xfb\xdd\xd3\xfa\x71\xb3\xda\xaf\x7f\xdf\x3d\x2d\x96\x88\xd5\xbc\x5a\x6c\x5d\x62\x87\x45\x22\xc5\x5c\xda\xf5\xf3\xd6\xfd\x29\x49\x43\xc7\x19\x76\x73\xe2\xb5\xca\x79\xf9\x74\x2a\x2f\xd8\x65\x96\x0a\x85\x89\xf3\xe6\xb5\xfa\xb1\xab\x8e\x98\xc9\x1b\xf5\x7c\x31\x96\x82\xc1\x4c\x35\x0e\x21\x73\x09\x94\xca\x58\xc6\x38\xb3\xed\x69\xab\x9a\xff\x58\xb7\xaf\x63\xc8\xc9\xbc\x93\xc4\xb2\x88\x5b\x82\x6e\x5e\xcb\x57\x03\xf7\x6a\x7e\xef\xc6\x4e\x3e\x44\xc6\xb9\xf6\x9d\xea\x5c\x7a\xfa\xfc\xf0\x5f\xff\xfe\xdb\x38\x3f\xd9\x8d\x35\x69\x54\x9f\x57\x78\x38\x42\x39\x36\x85\x2c\x93\x04\x67\xc0\x62\x79\x7f\xbf\x91\xd5\xaf\xfa\x67\x26\xeb\x24\x93\xd4\x55\xfa\x9c\xdb\xb2\x83\xa6\xdd\x55\x13\xb3\x31\x3e\x8b\x47\x94\x5a\xee\x44\xcc\xc2\x58\xb2\x36\x3f\x71\x45\x12\xa1\xf7\x8a\x32\x41\x0b\xa5\xb0\xf3\xc5\xac\x18\x37\x02\x38\x41\x03\xb5\xbe\x5f\x3f\x6c\xcf\xda\xd5\x18\x93\xb6\x43\x1b\x5d\x10\x8c\x83\x26\x8d\xad\x8c\x49\x21\x71\xfb\xde\x2d\x37\x7b\x3e\x5c\xa8\x2a\xcc\xb0\x4c\xbf\xab\x3b\x9f\xb9\xf6\x7f\x8e\x54\x66\x9b\x6b\x57\xf0\xee\xff\x1a\x47\x8e\x04\xff\xda\xa8\x37\x4f\xee\x44\xa9\x34\x20\xae\x47\xd2\x2c\xb1\x89\xee\xaa\x1d\x08\x44\xe1\x33\xa9\x9a\x1f\x7b\xd2\x6b\xc6\x20\x36\x02\xd9\x36\x7e\xba\xae\xab\xff\x0c\xd0\x1c\x7d\x44\xc2\x20\x55\x08\x8d\x7c\xfa\xb9\x5e\xdc\xe2\x1b\x9d\x84\x05\x0c\x94\xb1\x4e\xe5\xe9\xf0\x04\xda\xff\x55\x6b\x34\xbc\x56\x63\x05\x1a\x53\xb2\x9d\x65\x6e\x76\x3b\x24\xd3\xcc\x43\xa0\xef\xa1\xfd\x51\xd5\x2e\x19\x1d\x06\xd4\x40\x69\x3b\x47\xf5\xb5\x82\x32\xff\x69\x3a\x55\xfd\x92\x21\xd9\xbf\xdd\x50\x09\xd8\xf8\x62\x11\xac\x6f\xa2\x2a\xce\x74\x5d\xfd\x50\x9d\x18\x9a\x8a\x5c\x4d\x0f\xa9\x08\xdd\xd9\x4a\xeb\x22\x2f\xe1\xac\xd6\x36\x7a\xcd\x21\x09\x8d\x28\x3c\xb6\x2a\x2f\x1f\xb6\xbb\x2e\xe4\xda\xef\x36\xeb\x27\x27\x65\xc4\x42\x9a\xc5\x98\x90\xdb\xf1\x7c\xe0\x46\x86\x2c\x52\x68\x06\x4c\x76\xf9\x76\xfd\x6d\x7d\xeb\xb8\x35\x58\x18\x91\xc8\x00\x79\x4d\xe3\xe6\xd5\x90\xdd\xe2\x92\xb5\x08\xa3\x30\x41\x5b\x8f\x45\x1a\x53\xc3\x9f\x3e\x5d\x14\x1b\x59\x13\x13\x8b\xe0\x52\xe8\x22\x8e\xc9\x75\x92\xd0\x73\x81\xb8\x2e\x00\x16\xc6\x22\xc6\x34\xc1\x92\x1f\x5b\x9e\x97\xbf\xe5\x6d\x9b\x43\x7f\x14\x22\xc3\xed\x09\xf0\xb6\xff\x31\x68\xe9\x66\x61\x42\x29\xa6\x4b\x0e\x95\x7c\xc3\x74\xbf\xdd\x58\xc6\x3f\x9a\x80\x46\x22\x47\xc9\x0b\x79\x3c\x35\xed\x71\x8e\x26\xda\x8e\x4d\xc1\x08\x2d\x63\x63\x52\x33\xd1\x3c\x65\x61\x16\x46\x98\xb5\x3d\xf0\x9f\xb6\x31\xf4\x0a\xda\x4d\xe9\xd5\xf8\xbb\x11\x5a\x19\xd2\x97\x23\xc8\xd6\x4a\xa4\x8d\x7f\x23\x13\x9a\x5b\xf2\x9f\x51\x16\x79\x3e\x63\x14\x66\x2a\x46\x14\xc6\xf5\xd3\xa3\xfb\x11\xae\x62\x14\x58\x90\x45\x25\xdf\x0e\x9e\x4b\x8f\x85\x42\xe8\xc8\x56\x7a\x6e\x50\x5b\xb0\xc0\xdc\x8f\x3d\x2a\xe3\x04\x57\x6e\xf7\x64\x5f\x79\xf3\x3a\xc7\xa9\xf8\x59\x05\xeb\x02\x4b\xba\x5b\x6b\xa1\x94\x69\x68\x0b\x75\x93\xf7\xa6\xa8\x21\x37\x7e\x37\x2a\xb1\x1f\x87\x8f\x41\xb6\x2a\x54\x21\x15\xa9\xe7\xb5\x40\x4b\x30\x93\x5e\x0f\x55\xc4\x2c\x6d\xb7\x21\x7c\xb7\x9c\x89\xdf\x10\xd7\xf4\xc5\x0f\xd2\x08\x31\xbd\xc9\xdf\x01\x9b\x83\x86\x64\xaf\x2c\x54\x89\xc4\x52\x98\x2e\x72\x84\xa9\x22\x81\x54\x37\x57\x87\x5d\xe6\x6e\x6c\x46\x5d\x32\xce\x37\xd1\x82\x42\x30\xc3\xe4\x8b\xaa\x2c\xc4\xea\xd9\xf5\xf3\xef\xc3\x56\x3b\x16\x2a\xad\x11\x77\xb4\xdd\xdc\x7e\x5b\x3f\xb9\xfc\xc9\xfd\x6a\xe9\x06\x40\x64\x50\xd6\x9d\xd5\xcd\x61\x1e\xc8\xcf\x42\xc8\x0c\x37\x92\x75\x1d\xaf\x64\x75\x3a\x56\x17\xb8\x4b\x3a\xcf\x45\x62\x37\x81\x11\x07\xdb\xd5\x27\x30\x29\xcf\xa1\xf7\x16\xea\x90\x22\x93\x41\xe7\x28\x5d\x56\x69\x60\xa1\x4e\xa9\x51\xa1\x3d\x1d\x0e\x16\x6c\xed\x57\xa6\x96\x11\x9a\xc5\xfd\x65\x96\x56\x33\x32\x0a\x22\x86\x11\xf0\x81\xbf\xc1\x55\xae\x46\x41\x4c\x14\xa4\xc2\x25\xe9\xbb\x8d\x1f\x7b\x50\x5e\xac\x1e\x92\x1d\x42\xba\xa0\xa5\x7b\x8f\x77\x5b\xfb\x3d\x47\x53\x23\x22\x91\x40\x22\xa1\x1e\xe1\xfa\x1d\xe0\xad\xa7\x35\xf4\x37\x42\x35\xe1\xa9\xb5\x05\xdb\xaf\x0b\x36\x4c\xa8\x47\x2c\x16\xe8\x8f\xf9\x5e\x4c\x53\x29\x7a\xcc\x61\xd2\x87\xc1\x22\x26\x63\x44\xee\x3c\x56\xe5\xcb\x3c\x88\x93\x45\x11\x65\x48\x52\x68\x03\xf3\xdb\x8a\x97\x2b\x3e\x60\xec\x62\x51\xac\x3d\x45\xda\x23\x92\x8b\x0d\x72\x2e\x83\x99\x18\x25\x09\x60\x36\xd3\x86\x5d\x86\xbb\xb0\x4f\x92\xa7\xff\xa2\x3d\xc6\x6c\xf4\xbf\xee\xfc\x34\x45\xa9\xe6\x1f\xe3\x0e\xb1\x89\x75\x8b\xd2\x20\xce\x0c\xfc\xc0\xf6\x1f\x62\x0d\x67\xd0\x1d\xd3\xf9\xbc\x1c\x09\xdb\xf6\xc3\x66\x8e\x8d\x95\xad\xfe\x14\x32\xca\x22\xcc\x6f\x9a\xfe\xbd\xee\x2c\xcc\xfa\xdc\x9e\x65\x7d\x22\xce\x01\xc1\x3a\x88\xe0\xdb\xac\xf6\xee\xa7\x39\x30\x8e\x9d\x78\x3e\xcc\x8a\x84\x0c\x33\x53\x70\x3b\xf0\xbc\x3c\x63\xd8\x62\x91\x50\x21\x33\xf5\x13\x4f\x94\xde\xfd\x31\xca\x88\xc1\xce\x9b\x68\x72\x72\x8e\x96\x38\xd7\x90\x1e\xeb\x09\x89\x5b\x46\x49\x82\xd1\x37\x96\x5c\x61\x81\xf5\xc0\x7f\x1a\x8a\x71\xb7\x38\x22\xa9\x0d\xc5\x5b\x37\xe5\xf7\xdd\x45\xbe\x8c\x4d\xe9\xd9\x7f\xed\x79\x2a\x66\xc4\x70\x6a\x9f\x30\x9f\x8c\x92\x28\xfe\x98\xc2\x78\xb7\x5e\xad\x7f\xf7\x7f\x4b\x52\x8e\x7c\x1b\x2e\xae\xbc\x81\x92\x5c\x58\x86\x8a\x87\xc4\x3a\x43\xc5\x48\xf5\x9b\x45\x10\x93\x44\xfb\xe6\xd7\x99\xfa\x6d\x04\x29\x03\xa7\x93\x0e\xc7\x82\x9f\xa9\xac\xd9\x71\x3a\x8b\x88\xdb\x6e\x57\x4d\xfb\x8f\xf6\xa2\x1c\xdb\xf8\xc4\x38\x08\x32\x74\xf1\x37\x07\x23\x1d\x3c\xec\xe7\x1d\x4d\x91\x38\x10\x06\xfb\x7c\xe7\xc6\xb9\xb7\x1e\x13\x41\x70\xaf\xc7\x17\x3e\xbb\x4b\xc5\x34\x14\xe8\x72\x3b\xd6\x58\xe7\xfc\x58\xe7\x61\x90\x5d\x8a\x69\x1a\x21\x67\x84\xe3\xa9\x59\xf2\xe6\xf5\xb1\xae\xfc\xe1\x2c\x95\x89\xeb\x4b\x37\xfb\x82\x3b\x22\x75\x60\xa8\x15\x4f\xf0\xbd\xaa\x8b\xb3\x14\xf4\x70\x12\xc5\xcc\x2a\xc8\xff\xe8\x7c\xb1\xbb\xea\x3d\xf7\x37\x10\x12\x69\x5d\x97\x5a\xed\x0f\xd0\xf2\x62\x6f\x54\x9e\xdc\x71\x11\xf5\xe2\x17\x46\xf4\xed\x9e\x1f\x7a\xe6\x09\x17\x62\xc5\x91\xb0\x69\x37\xde\x8c\x55\x5e\x67\x00\x8f\x2c\x8e\x34\xc3\xb4\xc2\x73\x9b\xbb\xe2\x6b\x1c\xc7\x0a\x39\x54\x3a\x37\x6c\xf7\xc3\xf0\xfd\x3c\xe5\x0d\x5c\xc1\x8b\xf7\x3c\xe3\x44\xa4\xb8\xb4\xb6\xc7\x22\x6f\x11\xea\x34\x52\x21\xfc\xc5\x3c\xf8\xe5\xbf\xe3\x59\x90\x28\x43\xff\x64\x98\xa7\x07\x72\x8d\x2c\x4e\x20\x72\x82\x68\x1b\x1b\xc5\x0c\xe0\x18\xd3\x34\x53\x9c\x92\x20\x31\x72\xa1\xad\x51\x54\xc2\x49\x30\xdc\xa4\xe2\x2c\x8e\x10\x02\xb4\x5b\x3c\xdd\xac\x07\xf0\x52\x16\x67\x22\x40\x7b\x61\x8d\x73\x33\xca\x97\xc6\x99\x10\x18\xf6\x77\xa6\x74\x4c\x65\x7b\xe1\xa9\x78\x10\xa1\x0b\x67\xa2\x9c\xa5\x51\xec\xec\xec\xe5\x37\xee\x05\x46\x59\xcc\xc3\x14\x5d\xfc\xf5\xee\x6b\x14\x04\x55\x99\x90\xcc\x1f\x4a\x22\xa7\x7c\xfe\x30\x89\x4e\x62\x41\x22\x65\xa0\xe0\x58\xaa\x3a\x95\xaa\xc8\xcb\x17\x2c\xbb\xb4\xe7\x69\xd8\x58\xa4\x5c\x0f\x5a\x2f\x51\x53\x3a\xff\x84\xa3\xfa\x53\xf7\x30\x16\x5c\xa1\xf2\xd6\x2b\x6f\xfe\x5e\x89\xee\x45\x1f\x0e\x50\x2a\xbb\x80\x3f\xdd\x3b\x62\x01\x21\xe6\x93\xb6\xa6\xb5\xfa\x8f\x87\xe7\xe9\xad\x42\x86\x89\xe0\x23\xff\x30\xad\x9d\xbc\x7b\x34\xbf\x90\x24\x95\x18\x9d\xe4\xa5\xae\xea\x03\xaf\x1f\x7a\xd7\xd7\x8d\x48\x01\xcb\x2e\xcf\x23\x0d\x9c\x6a\xbe\x5e\x1d\x2b\x41\xd1\xcd\xdc\x42\xa9\x6e\x97\x4f\x7f\x81\x48\x9d\xc5\x4a\x69\x84\x2f\xed\x83\x9f\xd7\x55\xfd\x66\x45\xb2\x7b\x6f\x31\xd6\x84\x26\xe0\xd9\xc2\x1e\x6b\x18\xf2\x15\x8d\x7f\x5f\x53\x43\x5d\x2f\xad\x58\xe9\x04\x00\xce\x62\xad\x8d\x80\x5d\x0b\xfc\x40\x10\xa0\xe9\x6d\xa4\xd6\x0a\x11\xd6\x8b\xd5\xc8\x59\x4d\x48\xc2\x60\xc8\x2a\xbe\x2f\x40\xb7\x28\xe9\xd1\xec\xdb\x6a\x7f\xac\x2b\x44\x77\xda\xd1\x94\xa4\x48\x2f\x71\xb7\xb8\x5b\x77\x31\x6a\xff\x77\x8e\x01\x90\xb4\x6f\x10\xa3\xc5\xbc\x2a\x87\x9d\xfa\x76\x28\x63\x81\xdb\x51\x2c\x31\x24\xa8\xef\xaf\x50\xe2\xae\xfc\xf0\xde\x0f\x0c\x99\x57\x39\x78\x34\x77\xf1\xb5\x3a\x8d\x3b\xa5\x59\x12\x86\x29\x32\x7a\x1e\x0b\x2e\xc1\x64\x61\x46\xaf\xa4\x1b\x80\x4b\xf1\xc6\x56\xa6\xae\x3e\xee\xa7\x97\x48\x8c\xc0\xbe\x4b\xbe\x9e\xc9\x9c\xb3\x24\x52\x10\xba\x4c\xa4\x25\x22\xbb\xe2\xe5\xbc\x68\x19\x4b\xe2\x90\xa0\xba\xc6\xdd\xe2\xf7\xfd\xd3\xe6\xfe\x66\xbf\xdd\xfc\xd3\x19\x8e\x24\x8e\x75\xea\xd5\x3c\x47\x51\x4c\x12\x4b\x92\x59\xf2\x3a\x04\x16\x5a\xe8\xd7\x70\xd7\x48\x12\x12\x84\x8e\xac\xee\x02\x03\xe7\xe4\x6e\x12\xc1\xb0\x7b\xec\x8f\xaa\xa8\x66\xaa\x2e\x49\xa2\x0d\x5a\x06\x4b\x94\x35\xb6\xa7\xf1\xc5\x20\xb5\x37\xb6\x54\x49\x9a\xa4\x56\x46\xa6\x39\x1d\x60\xe6\xfb\xa6\x69\xd6\x6b\x98\x03\x36\x31\xdd\xe4\x75\x31\xf9\xd5\x54\x98\xa4\xe5\x0b\x3f\xc0\xda\xf7\x6c\xb0\x24\xa3\x59\x1a\x0d\x50\x8b\xab\xba\x3a\x36\xd3\x79\x9e\x64\x2c\xc6\x46\x86\xed\x09\xfb\x02\x1d\xb5\xc4\xe8\x7b\x38\x0b\x94\x64\x10\xa3\x69\x44\xd7\xee\x11\xea\xdd\x6b\x75\x6a\x78\xa9\x90\x10\xe1\xba\xaa\xaf\x4e\x1f\x5d\x4c\x6c\x47\x73\x66\xa8\xa4\x8c\x52\xe0\xa3\x51\xcd\xf3\x07\x93\x04\x9d\x95\x2d\xb4\x9b\xc7\xa7\xc9\x6e\x3a\x76\x15\xa7\x0c\x0b\xa3\xaf\x28\x38\x43\x32\x56\xe5\x2a\x4c\x23\x9b\x99\x08\x08\x90\xab\xc5\x8b\x8a\xf3\x2e\xd2\x9a\x6d\x85\xeb\x06\x27\x08\xaf\x84\xf6\xf5\xca\xb3\x9e\xb3\x44\x32\xe2\x98\x10\xf7\xb9\xac\xca\xfc\x4f\xa7\xf2\xfd\xa9\xbd\x4a\xa4\xe4\xc8\x5f\xeb\xe4\x34\xae\xaa\xd3\xcb\xeb\x39\xba\xfb\x17\x99\x03\x7b\x31\x45\x22\xdb\x56\xaf\x67\x48\x48\x59\xa2\x78\x8c\xf8\xba\xe6\xb5\xfa\xe1\x42\xed\xfb\xd3\x61\x3a\x0a\x24\x63\xc3\x08\xed\x7b\x5e\xc2\x16\x8a\x33\xa6\x14\x3b\x1e\x62\xd3\xa5\x06\xed\xab\x25\xff\xb8\xf3\xda\x33\x5f\xfc\x18\x8d\xde\x97\x46\x70\xe7\xd5\xc7\xca\x89\x24\xba\x01\x3a\x08\xb4\x13\x4c\x6d\xe1\x70\x65\x5a\x30\x36\xab\xc9\x3c\xd6\x8a\xb9\x50\xfe\x6b\x75\x80\x85\x7a\x9f\x0d\x0b\xd3\x40\x49\xa4\x6b\xf8\x71\x74\xa5\xfa\x94\x28\x30\x18\xc4\x6e\x9e\x8f\xab\x23\x29\xe5\x46\xba\x46\x57\xa7\xba\x7d\x75\xf8\xf7\xa7\x1e\xa3\x95\x52\x50\x88\x0a\xdf\x02\x14\x70\xd3\x63\x38\x53\x46\x03\xe4\x32\xdf\x6d\x76\x8b\xfb\xa1\xa9\x4f\x19\xe3\x86\x4b\xc8\x49\xa6\x2e\xab\x42\x0d\xb5\xf8\x58\x1a\xa6\xc2\x51\x18\xdd\x55\x65\x67\x0d\x37\xdf\xfc\x4d\x85\x5c\x07\xa6\xf1\xbd\x7e\x83\x76\x7f\x75\xfa\x98\xd4\x94\xdd\x38\x15\xa3\xfd\x2b\xaa\x1f\x50\x5f\x0d\x4a\x77\x69\x94\x19\x74\x42\x0b\x4d\xbb\x3f\x42\x2d\x1f\xb4\x4b\x6b\xa6\x31\x53\x29\x19\x8a\x96\xde\x56\x3f\x4c\xe3\xf9\xec\x44\x4d\x13\x92\x60\x8e\x02\x7e\x5e\x03\x60\x1d\xd4\x5d\x29\x89\x4c\x07\x13\x74\x0e\x3c\x1a\xfd\xe7\xed\xea\xfb\x7a\xe3\x8f\x4b\x8d\x84\xf5\x28\xba\xe5\x55\x28\xdd\xd1\x34\x0a\xf1\x2d\x79\x85\xdf\xb9\x6c\x9d\x1b\xcb\x53\xcc\x52\xae\x56\x8b\x79\x60\x44\x9a\x31\x6e\xe6\xae\x21\xb0\xb3\x1f\xb2\x9e\x8e\x8a\xb4\xd6\x7e\xd4\xf6\xe3\x20\xaa\x62\x64\xf7\xd3\x2c\x49\x6d\xaf\x9c\x15\x3f\x9e\xef\x3d\x60\x69\x06\x7a\xd8\xed\xed\x6a\xc3\xb3\x2b\x25\x15\x71\x8a\xd2\x08\x65\x55\xfe\x07\xea\xca\x83\xca\x0d\x7d\xdb\x75\x55\x2f\x8e\x13\x00\x69\x2a\xd2\x10\x17\x8e\xe9\xcf\xfa\x7f\x88\x7b\x97\xe6\xc6\x71\x2d\x6b\xf4\xbf\x7c\xa3\x1a\x9c\x01\x09\x02\x20\x79\x67\xb2\x2c\x3b\xdd\xe9\x87\xda\x92\x33\xab\xba\xa3\x43\x81\xc7\x86\xcd\x4e\x8a\xd4\x21\x29\xdb\xaa\x5f\x7f\x83\x1b\x00\x5f\xa2\x9c\x15\x5f\xdc\x88\x3b\x39\x59\xc7\x84\xf8\x04\xb0\x5f\x6b\xaf\x75\xbd\xf9\xb1\x7a\xdc\xbe\x3c\x7b\xf3\x96\xc8\x54\x84\xa9\xef\x10\xfd\xcf\x63\xd9\x0c\x2b\xe8\x89\xa2\x89\x4d\x61\x7a\xdb\xa0\x2d\xe9\xc1\x4b\x91\x35\xe4\x0a\x1a\xd1\x0d\x04\x82\xf0\x06\x2b\x56\x36\x59\x1c\x1a\x00\x73\x02\xb7\x95\x4b\x2a\x85\xbf\x09\x32\x13\x90\x9c\x58\x04\xcd\xb1\x86\xab\xa3\xaf\xb2\x24\x26\x4c\x84\x45\xff\xe8\xab\xdc\x61\x80\x7d\xce\x3c\x0d\x62\x1d\x87\x9d\xdb\xdc\xfd\x35\xb1\x64\xec\xca\x0a\xa0\x8f\xdf\x4e\x1a\x12\x8b\x8a\x72\x6f\xdf\x26\x19\xfd\x31\x1e\x22\x9f\x8a\x9f\x58\xe7\x90\xe5\x34\x54\x21\xf6\x04\xe9\xec\x7d\xfe\x8b\xa5\x84\x80\x67\xe3\x5a\x8a\x06\x5e\xcb\x2a\x3b\xd7\xac\x9a\xfe\x86\x1b\x8c\xcd\xd7\xd9\x27\xe4\xf5\x83\xe8\x22\xb7\x94\x18\x46\x71\xb9\x67\xef\xf0\x80\xed\x35\x93\x34\x7a\x1a\x51\x8d\xf5\xce\x97\xc3\xeb\x97\x4a\xe0\xa3\x49\x98\x46\x09\xd3\x43\x7d\xbd\x9f\x59\xf3\x66\x8b\x69\x85\x82\xa5\xc8\xf3\x5b\xd1\x3d\x73\xa4\x15\x36\x94\xec\x30\xa0\xae\x07\x52\x63\x51\x1a\x19\x19\x58\xd7\x4c\x1f\x15\xec\xcb\xe2\x02\x21\x43\x94\xd2\x30\x46\x8f\xe0\xfe\xe9\x76\xf7\x08\x1f\x57\xe7\x11\x97\x1f\x98\x32\x2c\x46\x64\xf5\xba\x02\x31\xc1\x20\xa6\x0c\x08\xc6\xc0\xdb\xf5\xfd\xe2\xaf\x2f\x9a\xee\x86\xc9\x9b\x94\x87\xc4\xf2\x73\xbb\xa6\x9a\x67\xd0\xb0\x3f\xb4\xf3\x7a\x3d\x94\x42\x8c\x52\x4e\xad\x11\x68\xca\x2b\x8f\xea\xfd\xd7\x0c\x80\x39\xe5\x8c\x7a\x4a\xa9\x75\x59\xbc\xbe\x8b\x7c\xfb\xf9\x0c\x4d\x95\xc1\xbb\xc8\x17\x16\x8a\xd9\xdf\x73\xac\x13\x8f\x62\x7c\x29\x8e\x35\xe8\x39\x12\x99\x28\x4d\x02\x1e\xb9\xca\xd7\x6a\x0f\xd5\x2b\x14\xcd\x37\x91\x37\x83\x74\x50\x9a\x04\x36\x56\x43\x2d\x9f\x41\x95\x2f\x4d\x12\x86\x3b\xff\x32\x2f\x8f\xda\x4b\x42\x5d\x24\x17\x9d\x4c\x86\x44\x26\xa9\x1c\xf4\xae\xda\x45\x31\xff\x75\x52\x16\x61\xaf\x1f\x36\xed\xf4\x17\xf0\x47\xc1\xb2\xcc\xfe\x57\xf9\x26\xaa\xad\x4f\xa7\xa7\x82\xd8\x3f\xeb\xaa\x3c\xb4\x3b\xc9\x80\x92\x25\x4a\x85\x6b\xc1\xaf\x00\x43\x84\x99\x12\x43\x2a\xe2\x00\x3d\x56\x27\x94\xfc\x0c\x35\x54\xef\xe0\xe9\x1c\xba\x13\x09\x50\x7c\xc4\xd7\x15\xc5\xdd\x31\x19\x09\xb4\xac\xb9\x98\x9e\x5b\xc7\xd4\x91\xb5\xfc\x28\x3b\xeb\x9d\xca\x30\xd0\x48\xa2\x2c\xea\x06\x7d\xe8\x9d\x08\xbb\xb3\x69\x19\xe0\x6e\xe5\x04\x86\xe6\x28\x28\x27\xaf\x4d\xab\x14\x03\xdd\x6f\x4f\x2f\xcf\xfe\x2c\x10\x86\xd4\xa1\xd5\x37\xab\xe5\xd3\xe3\xf5\x6e\xb3\x5d\xad\xad\xb6\xe2\xfa\xfe\x6e\xd5\x0f\x04\x0d\xae\x10\xd3\xe4\x80\xc5\xbe\x6e\xc6\x9a\x98\x7a\x58\x98\x25\x13\xea\x76\x33\x93\xda\xe2\x60\x8f\x3a\xc0\x4e\xa4\x76\x73\x9d\xff\xb4\x46\x10\xc4\x56\xfc\x58\xaf\x26\xd8\xde\xd4\x08\xe5\x41\x25\x7d\x87\xb7\x3d\x26\x02\xae\x98\xa5\x6b\xd4\x77\xcb\x27\xcc\x2e\x75\x87\x00\x2c\x93\xe3\xfb\x04\x8f\x34\xba\xb0\x08\x13\x4b\x67\x5d\xbe\x43\x65\xf2\x89\xf6\x4b\x7b\x38\xee\x65\x80\x9c\xb7\x7b\xe1\x44\x4a\x73\xdd\x11\x9b\x49\xa8\x9e\xcc\xf7\xa2\xfc\x28\xd6\x55\xeb\x38\x36\xa7\xb3\x7b\x0f\x75\x80\xee\x6d\xeb\x64\x5a\x06\xfc\x61\x61\xd0\x27\xa2\x04\x89\xc3\x80\xd9\x97\xfc\x0b\x6c\x3f\x9a\x63\xee\x9f\xdc\x2a\x0d\x6c\x8b\x88\xe5\xc2\x33\x55\xb9\x97\xf3\x20\x4a\x41\x03\xcb\x7d\xbc\xa8\x9a\xcc\x64\x2a\x13\xf9\x23\x1c\xab\xf6\x7f\x87\xd5\x70\x41\x03\x10\x6c\x84\xb4\x1a\xbd\x60\x9a\x30\xf4\x06\xb5\x95\x6a\x3c\x3d\x03\xe6\x02\x26\x97\x6a\x23\x42\x44\x2f\xb5\x36\x29\x17\xd9\x98\x20\x32\x12\xd4\x91\xe9\xa1\xd3\x87\x6d\x47\x96\x8a\x6e\xd7\x6e\x63\xa7\x1b\x80\x75\x59\xe6\xbb\xcc\x2a\x30\xa9\xb2\xef\xd2\x11\x54\x8a\x68\x90\x15\x7b\xcb\x3a\x2f\x57\xb0\x30\x45\x1f\xcf\x89\x17\xdb\x9b\xdf\x0c\x70\xab\x82\x71\x16\x0c\x0a\x31\x78\xec\x41\x7c\x0e\xb5\x2c\x23\xc1\x05\x8d\x7a\xf8\x17\xb4\x1f\xe9\xfb\x5f\xcb\xc9\x13\x72\x15\xe3\xa0\x5d\x56\xdf\xe9\xd5\xa7\x6d\x3c\x19\x7a\x67\x22\xe6\x14\xdb\x14\x9a\x0c\xaa\x70\x08\x89\x12\xb1\x4c\x02\xda\x6b\x1f\x8a\xcf\x5b\x51\x1f\xce\x58\x1a\x23\x11\x83\x53\xf5\xf4\x79\xe9\x3c\x9f\xdc\x45\x12\x6a\x1a\xf8\xbc\xf3\xd5\xad\x2f\x05\x88\x84\x58\x44\xb2\xb2\xfd\xd8\xcf\x30\x09\x96\x45\x1a\xa6\xdc\x7e\xc5\xcf\x2d\xd4\xcd\x63\x59\xed\x45\xfe\x8f\x48\x64\x22\x91\x46\x31\xc2\xdc\x37\x7f\xdd\xff\xb8\xeb\x5e\x6d\xaa\x39\x66\x4e\x17\xfa\x3d\xab\xa1\x5a\x8a\xfa\xe0\x25\x0d\xdd\x08\x11\xa6\xc3\x50\xc3\xa3\xf0\xc7\x37\x26\x99\x25\x92\x40\xfe\x07\xd4\x5b\x38\xf6\x6c\x47\x91\x90\x82\x05\x36\x31\x66\xa0\xaa\xa0\x5a\x0d\xfd\x30\xa1\x43\x1e\x5b\xb2\xe6\x4e\xa2\x66\x75\xc8\xea\xf2\xdc\x47\xf1\x3f\x90\x16\xbd\xd9\x93\x02\xbf\xbe\xe6\xe0\x25\xf8\xba\x39\x07\xc4\xa0\xe6\xaf\xf8\xb8\xc4\x3e\x13\x09\x48\xac\xdb\x88\x9f\xa2\xaf\x31\xc9\x20\x34\xb8\xea\xb2\xa2\xf1\x9b\x4d\xbb\xd5\x8d\x3f\xb5\x0c\xa4\x31\xd4\xeb\x74\x54\x75\x59\x88\x7c\xd3\xae\xfc\x85\x6a\x8e\x22\xf7\x5d\xc2\xb3\x8e\x95\x0c\x14\xe7\xa1\xef\xaf\x2f\xe0\xe5\x60\x5f\xca\xce\x35\x28\x4c\xae\x14\x6a\x0b\x1c\xcf\xcb\xd7\x55\xad\xc4\x01\xbe\x89\x46\xbd\x79\x4e\x87\xde\xf0\x4b\x12\x71\x24\xb7\x3c\x60\xdb\xe4\x6c\xf2\x53\x12\xaa\x95\xdb\xfd\x36\xc7\x7d\x3d\x6c\x07\xf5\x23\xd2\x28\xe9\x89\x0d\x2d\xa7\xa0\x63\x84\xf2\xb1\x99\x24\xca\xba\x36\x15\x08\xdd\x6e\x4e\x2a\x1f\x53\x93\x44\x32\xa2\x21\x46\xd4\xb6\xdd\x75\x83\x14\x93\xfe\xd7\x91\x31\x5e\x53\xdc\xe1\x66\xcb\xa5\x17\x15\xdd\xbe\x8d\x9b\x19\x25\x25\x0a\xcb\xf0\xe3\xbc\x9e\x83\x33\x24\xe3\x89\x2e\xa9\x90\x08\xc2\xbe\xba\x5a\xcf\x0a\xbd\xfb\x61\x32\x88\x2d\x20\xed\x7e\xb7\x58\x7b\x68\x86\x6c\x3d\x40\xac\x06\xd8\xe7\xee\x4a\x12\x92\x13\xa9\x22\xdf\x3a\x6e\xcb\x8a\x93\x2a\xb6\xe4\x4c\x13\x67\xa7\x45\xf5\xda\x41\x76\x64\x12\xa4\x58\xfe\xfd\x59\x56\xbf\x7e\xb4\x41\xfa\xa9\x3b\xa2\x34\x0a\x72\xec\xe0\xdf\xc7\xec\x70\x5d\x7e\x14\x83\x7e\x82\x7f\x0d\xd7\x90\x4c\x09\x51\xc2\x06\xd5\x6b\x51\x68\xb1\x7a\x5e\x92\xe0\x1f\xf1\x27\x44\x32\x65\xa9\xee\xb9\xd3\x77\x1a\xde\x27\x77\x9e\xca\x04\x95\xbd\x9d\x63\xe7\x6c\xd6\x4d\x59\x3d\x39\x9e\x58\x7f\xc3\x52\x11\x94\x4e\x7b\x6d\x1f\x43\xd4\xf5\x08\x04\xfb\xe5\x06\x24\xa5\x49\x30\xdc\x7a\xd9\x2c\x06\xf9\x66\xa9\x22\xa3\x3a\x0e\xb7\x3c\x47\x59\x9c\x87\xac\xb8\x15\xb5\x6b\x89\xf7\xe3\x78\xc8\xbd\x1c\x99\xa5\xd8\xe9\x23\x0f\xa9\x15\x67\xcc\xd7\x36\xf7\x22\xf3\xe8\xc3\x6d\x96\xe7\x53\x4e\x8f\x48\x42\x60\x35\xe4\x6c\x2f\xcd\x4c\xb7\xa8\x04\x43\xd1\x7d\x2e\x8e\xfb\xd6\xd7\xeb\xae\x63\x98\x4c\x45\x17\xcc\xf6\xca\xc1\x93\xd7\x69\xb4\xa1\x9d\x16\xf8\x06\xec\x90\xf1\x15\x0c\x04\x18\x7c\xef\xea\xe3\xde\x76\xcd\xaf\xa1\xfa\x55\xbb\x86\xb1\xc8\x97\xfe\x55\x10\x2b\x2e\xba\x9a\x02\xae\xfa\x31\xb2\x52\x05\xc2\xd1\xf5\x78\x1f\xfb\xae\x76\x6d\xf8\x6e\x40\x98\x32\x4c\x1b\xb7\x01\x59\x59\xf5\x1b\xa4\x0a\x75\x82\x7b\x85\x29\x2b\x1b\x36\x3e\x15\x57\xf0\x26\x72\x33\xcd\xd2\x2a\x92\x68\xcc\xf6\xc0\x3b\x14\x0d\xda\xcd\xc9\x1b\x53\x44\x51\x4e\xfc\x46\xfa\xec\xe2\x03\x7f\x21\x4a\x43\x70\x89\x69\x34\x34\x65\x75\x9a\x91\x85\x8c\x14\x4d\x6d\x67\xd8\x75\x99\xe7\xa2\x1a\x40\xe2\x14\x0b\x24\x36\x56\x95\xed\xf4\xf0\x36\x68\xb4\xdb\x28\xce\x15\xd2\xc8\x14\x65\xb3\xfa\xf7\x51\xe4\x7f\xcc\xf0\xf7\x8c\x32\x79\x8a\x27\x10\x59\xdc\x5a\xa1\x20\xbf\x15\x7b\xcb\x19\x69\x93\xf5\x35\x36\x62\x60\x9b\x97\x1b\x9e\x70\x89\xd5\x85\x85\x12\x1a\xf6\x63\xa6\x5b\x3f\x24\x91\x91\xe3\x95\xf5\xdb\xe5\x2c\x08\x53\x25\x60\x2c\x5f\x05\x0a\x25\x5d\x9d\x10\x4c\xff\x4d\xf8\xdd\x46\xa5\xda\x20\x2f\xef\x21\x3f\x36\xa5\xaa\x06\x07\x8c\x42\xca\xd9\xae\x31\x78\x7b\x19\x4b\x3b\xbe\xa4\x08\x63\xcf\xed\xff\xb2\xb9\x5e\x6d\xbf\x0d\x83\x2b\x25\x23\xf0\x50\x8c\xc9\x3c\x6b\x23\xfe\xb9\x67\x95\x3c\x4e\x3d\x37\x19\x3a\x32\x7d\xb0\xa1\xa4\xb1\x44\xdd\x6d\xfc\xfe\xb4\xbe\xc4\x46\xd2\xd7\x1d\x87\x1d\x9d\xa3\x4f\xa4\x12\xcb\x93\xd8\x67\x4d\x5b\x23\x3d\x7e\x30\x4d\x34\xba\x4d\x05\x7c\x36\x0e\x5d\x34\x19\x40\x03\xac\x26\xbb\x69\x79\xb5\x5d\xce\xdb\x04\x65\x22\x40\x69\x84\xbc\xfc\x80\xda\x1b\x4f\x1b\x44\xf6\x75\x05\x1d\xc4\x94\x59\x00\xc2\xeb\x9b\xe7\xfa\xf4\xc7\x48\x10\xa3\x87\xdc\xe5\x22\x2d\x22\xaa\x3b\x1c\x01\xfe\x14\xb1\x31\x64\x29\x7c\x06\x59\x47\x82\xf8\x82\xf7\xb2\x02\x9d\x35\x57\x65\x31\x31\x2f\x9a\x02\x95\xcc\x5a\x00\x94\xfe\x99\x22\x50\xce\x3e\xb9\x66\x51\x8a\xe9\xd1\x07\x78\x15\x43\xa7\x4e\x33\xb0\x89\x06\xd7\x79\x36\x9b\xe8\xd6\x0c\x14\x42\x6f\xd7\xf9\x69\x54\xe7\xd4\x9c\xda\x4e\x71\x14\x15\x7e\xee\xfe\xca\x12\xdd\xcb\xe5\xdd\x3b\x65\xd7\xac\x2c\xc6\x0c\x62\x7e\xb4\xb1\xb5\x25\x4b\xa1\xf5\x1d\x4e\x13\x27\x45\xc7\x52\x53\xcb\xa9\xbb\xb9\xc4\x0c\x12\xe9\x84\x44\xc8\x16\x66\xa7\xc7\xd3\xf3\x62\x79\x7f\xf7\x5f\xab\xdd\xed\x62\xe3\x54\x8e\x27\xc3\xe3\x04\xc3\xb3\x2d\x54\x95\x98\xa9\xa0\xe9\x24\xa1\x98\x72\xcd\xea\xc5\xbb\xc8\xf2\xd6\x21\x9b\x10\x57\xf9\x81\x46\x23\xe4\x1d\xb7\xbb\x85\x52\x50\xb7\x9b\xda\x06\xaa\x1e\xf8\xaa\x53\x4a\xad\xec\x87\x30\xf0\x20\x9a\xb7\x85\x3e\xa3\x51\xf3\x23\x55\x84\xe6\xd7\x13\x7a\x9e\x93\xaa\x4e\xf4\x66\x22\x2d\x24\x09\x3b\x94\x00\xa2\xed\x97\x79\x59\x7b\xd3\x30\x7f\x19\xc5\x19\x06\x9d\x1f\xd9\x01\xce\x9a\x23\x27\x43\x13\x81\xfb\x13\x7c\x56\x7d\xa5\x42\x2b\x49\x35\xe9\xdd\x84\x81\x14\x65\xa4\x15\x08\x4c\x40\x3b\xe3\xbc\x99\x91\xc9\x9a\x03\xcf\x68\x4d\x78\x98\x8e\x02\x57\x47\x61\xdd\x1d\x97\x18\xb2\xb9\xf2\xf5\x79\x2f\xb4\xd6\x91\x10\xce\xba\xdc\x5e\x6d\xa7\x07\x15\xc1\xbc\xa8\x97\x4c\xbe\xd0\x61\xe5\x46\x43\x1a\x61\x8a\xc2\x86\xa9\x5e\xe9\xac\xdd\x01\x91\x47\xfa\x50\x66\x33\x4f\xe5\xff\x1d\x9f\xc9\xa4\xa4\x17\x73\x9f\xbe\x6d\x37\xc8\x44\x01\xe6\xc6\x6f\xef\xae\xbb\x77\x6c\x92\x18\x83\xdd\x37\x28\x1a\x91\xd5\x65\x5e\x76\x47\x54\x84\x59\xe7\x4d\xa7\x16\xdb\x1d\x90\x08\x0f\xdc\xa1\xb0\x43\xf6\xef\xa3\x2d\x9f\x07\x93\xc9\x6d\xda\xeb\x39\x87\x7d\x97\x71\xba\x13\xd8\xa2\x6e\x8f\x42\x18\x31\x63\x1d\x0d\xcb\x27\x52\xfe\xca\x66\xc8\x1c\x47\x67\x84\x90\xea\xd8\xc5\x3f\xf7\x5d\x85\x08\x93\x60\x75\xeb\x79\xdd\xda\x8a\x70\x77\x05\xc3\x3d\x81\x36\x82\x0a\xca\xea\x01\x1a\xa1\x45\x23\x9e\xcc\xb7\xac\x6e\xca\x2a\x53\x22\xf7\x7f\x9b\xa3\x72\x8b\x80\x04\x96\x6f\xa4\xf5\x57\x9e\xe1\x70\x6c\xc6\x30\xb3\x33\x9c\x2c\x90\xc0\xa6\xfe\x7d\xac\xf8\x52\xac\x45\x86\xcc\x69\x53\x46\xba\xc9\x85\x52\xcb\x12\x56\x7e\x14\x9e\x16\xf9\x4e\x9f\xa3\x1d\x81\xa4\xd6\x73\xfe\x71\x77\xb5\xda\xae\xa1\x1a\xd6\x09\x80\xc8\x50\xc3\x08\xf7\xb0\xa8\x64\xd6\x4c\x08\xe2\x22\x20\x0a\x7c\x53\xa6\x4b\xc0\x15\x7a\xc4\x6c\x16\x41\x14\x12\xea\xd6\x3b\x8a\xb9\x75\x7f\x17\x76\x27\xf7\xee\xc0\xaa\x79\x5b\x97\xe5\x85\x7a\x2a\xd0\x84\xe3\xdd\x1e\x1a\xb5\x93\x73\xb9\x65\xa0\x2a\x50\x9e\x16\x15\x71\xc5\xd9\xdf\x13\x4e\xfb\x08\x38\x8f\x65\xd4\xeb\x1c\xa2\x68\xfd\xfc\xf5\x78\xcc\xc3\xc0\x43\x24\x6c\xc2\xd6\x1d\x89\x03\x1e\x3a\xef\x61\x2d\xb2\xc2\xca\x2b\x2e\x1a\x8b\x1a\x1e\x9f\x24\xe6\x2a\x18\x30\x26\x76\x67\x48\x62\x34\x87\x37\x77\xdb\xa1\x75\x82\x24\x0a\x71\x51\x3d\xc2\x87\x6d\xed\xab\xca\xfd\x84\xf8\xe6\xc2\x74\x4e\x78\x80\x76\xed\x7a\x75\xb3\x78\xb9\xdf\x0e\x79\x7d\x20\x91\xdc\x6a\x01\x43\x53\x1d\xf7\xaa\xcc\x0a\xa7\xc2\xe0\x8e\x8b\x30\x8a\x79\xe7\x3f\x39\x72\x8b\x2e\x64\x6e\xaf\xc3\xa9\x1f\x4a\x2d\xf4\xc0\x61\xc6\xc3\x91\xc0\xf4\xa4\xb7\x0a\x24\xef\x1b\xf8\xb7\xdf\x76\xeb\xe7\x15\x0a\xc5\x6f\x7f\xfa\xf6\x7d\x90\x32\x90\x51\x47\xf2\x54\x67\x1a\xaa\x11\xe1\xb9\x1f\x06\x02\xb3\xe7\xa8\x04\x51\x16\x4a\x34\x0f\xb0\x2f\xab\x13\x45\x02\x4d\x7f\x32\x15\xda\xc0\x1f\xe5\xe6\x26\x26\x19\x14\xe3\x68\x73\x5a\x47\x6b\x08\xad\xf9\xcd\xff\x8e\xef\x43\x49\x0b\x01\xb8\xde\xac\x5f\xba\x2e\xc9\x69\x28\x0d\x46\x59\xb1\x5c\xbf\x6c\x2d\xbc\x7a\x20\xfa\x1e\x99\x90\x52\x84\x63\x3d\xdd\xdc\x6c\x56\xdb\x30\x8d\x83\x20\x0c\xc2\xee\xa8\xd4\x5d\x7f\x5c\x79\xec\xb3\x4d\x26\x04\x40\x88\xe3\x73\x1b\x72\x57\x88\x24\xb0\x89\x87\xf1\xfb\x32\x84\xc4\x5e\xaf\x76\xc8\xcc\x70\x01\x2a\xe7\x7f\x24\x92\x30\xf2\x5b\x74\xbd\x68\x7c\x82\x66\x72\x6a\x4d\x70\xe6\x6e\xfe\x6b\xf1\xfb\x9a\x94\x89\x42\x89\xbc\x06\x0d\x88\xfd\x6c\x32\xd9\x44\x5c\x63\xcd\x62\x5d\x95\xcf\xa2\x11\x23\xc8\xa6\x1f\xa2\xb5\x25\xa6\x40\x3d\x9c\x7e\x45\x8f\x95\x68\xfe\x7f\xfa\x4f\x37\xd7\x0d\x25\x14\x21\x7c\xef\xed\x4d\x9e\xd6\x55\x59\x9a\xdf\xde\xe7\xff\x07\x97\xef\xd8\x59\x0c\xd5\x56\x4b\xe3\x71\xf1\xe0\x17\xbe\x61\x22\xb4\x34\x11\x36\xaf\xbc\x15\xbf\xa0\x7c\x1f\x74\x7a\x8c\x3f\x05\x53\x01\x86\x94\xb9\x38\x16\xea\x6d\x2a\xdc\xd6\x1e\x0f\xd1\x83\x2a\xe0\xb3\x73\x71\x0c\xe7\x92\xda\x75\xf5\xf1\x9f\x47\xa8\xf1\xbb\x0d\x8d\x58\x1b\x4c\x61\xb9\xe2\x80\xcc\xba\xa3\x4e\x5d\x13\x07\xe0\x34\x37\xab\xe6\xb4\x13\xdd\x9f\x55\x8a\xad\x65\xb6\xe4\xed\x85\x1b\xfb\x44\xa1\x89\x81\xf0\x5e\x5e\xfb\xc1\x6d\xc1\x75\x7d\xec\xf6\x68\x93\x80\x50\xd0\xed\xf3\x98\xb2\x1d\x3f\x6d\x9a\x86\xa2\xf3\x82\xd7\x65\xe3\xb1\xfe\x46\x28\x70\x72\xa6\x0d\xee\x81\x96\xc4\xf2\x5c\xd3\x28\x32\x02\x0c\xda\xd9\x87\x4c\x55\xe5\x55\xd6\x0c\x82\x7e\x23\x59\xea\x1b\x4b\x90\x7a\x01\x73\x43\xdd\xc1\xc4\x84\x3e\xe5\x83\x4c\x7b\xeb\xa7\xfb\xbf\xba\x83\x52\x58\xa6\x39\x97\xab\x9f\x69\x35\x36\x2a\xb4\x94\x45\x36\x04\x77\x58\x8c\x8e\x4b\x3e\x32\x2a\x22\xca\x35\x9d\xff\xbc\x1f\xb4\x61\x19\x95\x84\x4a\x0e\xe1\x2d\x3f\x32\x71\x25\xd4\xaf\x8b\x61\x8a\x51\x82\x63\x8a\xe6\xbe\x7c\x1d\x56\xd5\xbe\x4c\xda\x19\x25\xac\x2a\x61\x5d\xe6\xda\xd6\xf3\xfd\x01\x93\x4a\x27\xf6\xe5\xd0\xf3\xae\xed\xe4\xc9\x0c\xc1\x33\x46\x73\x8d\x59\x77\x64\xef\xc9\x1c\x9f\x19\x9d\x5c\x45\x1b\x00\xdb\x9a\xd2\x75\xac\x1a\x08\x34\xe2\xe2\x8f\x35\x54\xcb\x0a\xd1\xb4\x67\x11\x90\x81\x38\xc0\xb7\xe0\x6b\xc8\xbd\xa3\x67\x4c\x00\xd8\x20\x97\xb5\xb3\x09\xab\x90\x53\xd1\xcc\xb9\xed\xce\x3a\x6f\xe3\x8b\xb4\x9b\x1f\x1b\x38\x46\x33\xea\x36\x91\x31\x94\x20\x81\x48\x7b\x17\xf9\x52\x54\xda\x86\x61\x8e\xd5\xb6\x53\x20\xf5\xa3\x85\x42\x67\xb9\x71\xb7\x4b\x83\x80\xa5\x1d\x63\xf1\x57\x1c\x30\x34\x08\x52\x40\xa7\x7e\xbb\xda\x6c\x77\x0f\x4f\xd7\xab\xee\x14\xd2\x02\xc0\xd0\x2f\x80\x42\x6f\xc4\x7e\x0c\x61\xed\x7b\xa6\x47\xef\x9f\x06\xa1\x26\x78\x71\xab\xb9\x76\x39\x61\x4d\x83\x10\x58\xc2\x06\x9e\xde\xee\x50\x65\xef\xa2\x71\x5c\x75\x7e\x61\xd3\x20\xe2\x32\x54\xbe\x04\x8b\x4b\x0e\xc1\xb6\xfe\x68\x1a\x60\xa7\x15\x5a\xa8\x65\xb9\x3f\x40\x83\xe0\x40\xcb\x7f\x79\xec\xd1\x96\xed\x50\x41\xfa\x7e\xdd\xc7\xb2\x78\x86\x03\x88\xa6\xdd\x07\x7e\x1c\x8c\x77\xa9\xdc\x27\xbc\xa4\xa7\x3c\xda\xe2\x69\x40\x0d\x41\xeb\xbb\x6f\x97\x7b\x0f\x82\xa3\x01\xa3\x14\xd3\xeb\x45\xd9\x64\xe6\x64\x33\x72\x1b\x70\xf9\xe0\x6e\x10\xb3\xa2\x2c\x8e\xf5\x40\x9d\x09\x37\xe1\x14\x1a\xbc\x0b\xce\x13\xc4\x0f\xb6\x4e\xcf\x35\x78\x6f\xc3\xa1\x95\xfc\x59\x63\x2d\xf1\xab\xde\x7e\xfb\xde\xfd\x09\x00\xdb\x48\xdd\x53\x6d\xcb\x45\x7e\x78\x13\x12\x1a\x47\x0f\x33\xb4\xfa\x34\x48\xa2\x04\x4b\xeb\x55\xf6\xfa\xd6\x50\xfa\xc7\xf8\xbb\x25\x3c\xc1\xb9\xe1\x0d\x88\x2f\xd7\xcd\x19\x10\x1a\xa4\x51\x1c\x26\x7e\xed\x8c\x61\x2b\xe3\xd3\xa6\x54\x04\x7a\x24\x3c\x08\x70\x53\x56\x3e\xaa\xf9\x0a\xc8\x41\x83\x14\x24\x96\xfd\xde\x44\xed\xcb\x66\x63\x0f\x8c\x06\x82\x26\x08\x46\xd5\x20\x9a\xb7\x6b\xd1\x88\xdd\x7b\xe4\x5f\x8f\x48\x53\xa1\xbc\x36\x6e\x0d\x55\xe3\x19\x84\x1f\x8f\x7b\x97\x4f\x9f\x80\x8b\xc6\xf7\x2e\x80\xa2\x2f\xba\x6b\xff\xbc\x2d\xad\x07\x3a\x1e\x22\x55\xc4\x88\xcf\x6a\x5b\x2e\xc2\x63\xdd\xcd\x16\x15\x08\x7c\xa7\x2f\x9b\xeb\x5b\xb1\x97\x39\xd6\x8f\xba\x18\x80\x06\x8a\x11\x2c\x76\x1e\x07\x04\xe4\xbf\x27\x78\xa6\x81\x4a\x84\x76\xdc\xd0\xb7\x50\x40\x9d\xd5\x4b\x61\xd9\x97\xba\x33\xeb\x08\xab\xbb\xfb\xac\x18\x52\xaa\xde\x15\x3f\x21\xeb\xc6\x80\xed\x80\x73\xa4\x98\x1a\x8a\x26\x6b\x4e\x77\x7b\xf1\x0a\x2f\xcf\xf7\xb3\xb9\x00\x1a\xe8\x88\x60\xf0\xb1\xcf\x8a\xb1\xd8\xbf\x3b\x0e\x81\x4c\x3d\x25\xc9\x6d\x29\xf2\x67\x10\xaa\x4b\x4e\xd3\x00\xb4\xed\xde\x77\xe4\xf8\x43\xdd\xc3\x09\x91\xa5\xfb\x81\x09\x63\x64\x7e\x3f\x54\x60\xb2\x4f\xd0\x67\x55\x40\x1a\x18\xa9\x89\x74\x2d\x70\x28\x86\x37\xde\x79\x69\x18\x50\x42\x2d\x94\xf1\xa1\x2c\xe0\xb4\xe9\x1c\x1d\x1a\x06\x69\x80\xb6\xfb\x87\x28\xb2\xe6\xe4\x27\xfd\x0c\xc3\xf1\xf0\xa6\xc2\x40\xc4\x86\xf8\xa8\xb0\x8b\x8a\x1c\x4d\xc5\xf4\xe2\xc6\xaa\x21\x5a\xf3\x73\x03\x30\xdb\x7c\x49\x43\xa2\xb8\x6f\x3e\x78\x3e\xe6\x9d\x6e\x9e\x3f\x6a\x12\xac\xf7\x5b\x9f\x73\x46\x0c\x6c\x34\x41\x42\x62\x94\xa7\x91\xcb\x0a\xc0\x36\xa3\x91\x0d\xeb\xff\xd7\xed\x85\xb3\xff\xe7\xbf\xd9\xff\xcc\xfd\x97\xbb\x46\x44\x28\xb3\x55\xfe\x76\x97\xc2\x56\xcb\xf2\x82\x6b\x41\xc3\x88\xc6\x68\xbf\x5b\x5b\x5d\x2f\x45\xd1\x6d\x2f\xfe\x38\x27\xd8\x2d\xf7\xb0\xf8\x73\x67\x49\xe0\x90\x66\xa6\x3f\x9c\x70\xe2\x49\xc6\xac\x28\xd0\xf8\xfd\x50\xca\x11\xcb\xfb\xfc\x9d\x06\xff\xe5\x7f\x45\x65\x80\x7b\xcf\xe6\x65\x08\x4b\x6e\xff\x1e\xc5\x69\x4f\xd3\x31\xc5\xd0\xd2\x90\x42\x80\x5e\xe9\x75\xb6\x17\x3d\x2a\x8d\x86\x2c\x89\xb0\x0e\x5a\x1c\xf7\x1e\x03\x30\x6d\x15\xa0\x21\x4b\x39\x73\xcc\xe3\x59\x9e\x63\xd3\xd3\x26\x7b\x6d\x3d\x57\xcc\x78\xf8\x51\xc2\x32\x5e\x66\x45\xd6\xfc\xcc\x9a\xb7\xcd\x5b\x76\xa8\xbb\x83\x32\x01\x27\x37\xb6\x5c\x7e\xdb\x81\xce\x9a\x5d\x14\xfa\xa3\x5c\x12\xee\x10\xbe\xd5\xe2\xcc\x67\xe9\x06\xd1\xc4\x9b\x57\x65\x85\xc3\xa7\xbd\x96\x34\x8c\x23\x16\x5b\x1e\x20\xc4\xa9\x0e\x69\x47\x68\x98\x86\x1c\x45\x8a\x2c\x75\x86\x38\x1c\x40\x4f\xf0\x71\x34\x4c\x29\x41\xaa\x54\x1f\xff\x2e\x8f\x48\x55\x7e\x46\x58\x41\xc3\xd4\xd8\xda\x5a\x27\xbc\x61\xe9\xcc\x67\xf7\xb7\x50\xa4\xd4\x8b\x9a\x6f\x9a\xf2\x30\xdb\x9c\x44\x43\x19\x25\x8e\xb7\xad\x59\xe3\xee\xb0\xbe\xc8\xb8\x40\x43\x99\x2a\x2c\x79\x1d\x0b\x47\xeb\x3c\x87\x39\xa0\xa1\x0e\x18\x76\x42\x9a\xec\x73\xea\x63\x8d\xcf\xa7\x45\x84\xe5\x7b\x53\xee\xcb\xc8\x6f\x6f\xa1\x06\xcb\xbb\xda\xee\x7e\x0b\xd9\xbd\x4a\xe0\x21\xbe\xa6\xbd\xe5\xab\x1d\xd1\xe9\xd0\x10\x62\xcd\x7a\x2b\xb0\x7a\x5e\x86\x9c\x2d\xdb\x5d\x73\xbc\x05\x53\x37\xdc\x04\xb6\x24\x7b\x0b\x55\xfd\x36\x9a\xd7\x46\x77\x81\xc8\x54\x7e\x04\x53\x82\x7e\x98\x09\x81\xd9\x66\x62\x17\x4f\x5d\x8b\x93\xbf\x57\x12\x84\x21\xa6\x2e\x6b\x51\x6c\x4b\x4c\x97\x8e\x56\x1a\x09\x08\x0b\x3c\x98\xa4\x5d\x00\x9b\x32\x1f\x27\x0e\xda\x21\xb6\xc9\xa2\xdd\x90\x17\xba\x44\x60\x2a\x0a\x4e\x6c\x3d\xe0\xdb\x4e\x5a\x36\x6f\xf6\x49\x40\xc1\x0b\x95\xfe\xe7\xb1\xaf\x6b\x53\x42\x42\x2a\x49\x27\x64\xe1\x6a\x5a\x0e\x5b\xaa\x4e\x93\xbb\x20\xd2\x8a\x67\xda\x26\x94\xb1\x90\x83\x1b\x12\x39\x62\x75\xa1\xb5\xe5\xa6\x1a\x26\x68\xfd\x98\x44\x47\x03\xcc\x81\xfb\x76\x2f\x23\xe5\x2e\x37\x94\x32\xab\x6f\x34\x48\x16\x3e\x55\xd9\x6b\x56\x88\x7c\x72\x6f\xd4\x08\x74\xc5\x1e\xd7\x7f\x6e\x86\x9f\x90\xb0\x28\xc2\x68\xae\x39\x4a\x64\x35\x7e\x19\x48\xde\x50\xc2\xa8\xb1\x1c\x7c\x48\xcc\xe0\xf1\x83\x85\x05\x02\x76\x83\xa4\xe5\xea\xd4\xb6\xd7\x0d\x91\x3e\x97\xca\x28\xe3\x49\x4d\xb8\x63\x8c\x6f\x9d\xb5\x9b\x4c\x4e\x6e\x9a\x27\x1a\xfb\x3c\x50\x94\x17\xee\x9a\xff\xbc\xac\xc9\x7b\xe9\xfc\xca\x6a\x07\x23\xe3\xf4\xfa\x7e\x31\xd2\xd0\x74\x77\xe5\x3d\x0d\x12\x33\x4b\x02\xf7\xe7\xf6\xaf\x1b\xff\x6c\x31\x67\x51\xc7\x64\xe0\x1a\x91\x8f\xfb\xee\xa8\x62\x3a\xf5\xfd\x2d\x53\xc7\xb5\x27\x84\x9a\x24\x74\x28\x89\x01\x30\x79\x79\x53\x1d\xcb\x36\x84\xbd\x5a\x6d\x17\xfe\x9c\x49\x10\x61\x85\x7b\x9f\x15\x80\x5c\xd0\xea\x9f\x30\xa6\x52\x92\xb0\x10\x5d\xd7\xa5\x45\xed\x5f\x20\x06\xa3\x24\x49\x74\x18\x77\xb3\xf4\xa6\xac\x1c\x18\x78\xa0\x9a\x42\x49\x9a\x50\xdc\x8a\x0b\xf8\xe8\xb7\xe0\x4b\xa1\xcc\xfc\xab\x17\x82\x62\x17\x20\xb2\x9f\x21\x3b\xdd\xc4\x18\x10\xa1\x92\x20\x1a\x34\xc2\x2d\x8c\xc9\xf2\x6c\x2a\x82\x4a\x89\xd0\x56\x21\xfb\xb1\xdc\x1f\x2b\x71\x7d\x2a\xc4\x3e\x53\x75\x9f\x10\xa1\x44\x06\x3a\xb1\x94\xa5\x08\xa2\xa8\x07\x76\x8f\x48\x2e\x8d\xc3\x93\xb9\x6c\xcf\x99\x54\xda\x60\xf1\x29\x19\x62\xda\x65\xa8\x5c\x7b\x33\x40\xb4\xfe\x53\x81\x38\x77\x3a\xcd\x23\x44\x4d\x6d\xa0\x39\x7a\x16\xd8\xec\x1f\xd0\x86\xff\xee\xb4\x2a\x08\x6c\x65\xff\xe3\xfb\x51\x7b\x6e\xda\x8b\x62\xe3\xc9\x64\xbb\xd3\x0a\x92\xa0\x13\xab\x77\xf9\x80\x72\x62\xed\x08\x84\x1c\xdb\xaf\xbc\x43\x71\x81\x44\x89\x12\x88\x38\xc2\xc6\xeb\xd6\xef\x3e\xe6\x30\x50\xeb\x1a\x6f\x03\xe3\x9a\xbc\x77\xf1\x06\x27\x12\x14\x5d\xf9\x87\xea\x26\x93\x15\x8c\xf6\x29\x50\xa1\xb4\x4e\x0e\xce\x56\x07\x93\x99\xfc\x5e\x69\xa6\xbc\x74\x5d\x1b\x09\x98\x0b\x6b\x00\x4c\x8c\xf3\xe5\x50\x36\x9b\x8f\x09\x99\x13\x25\x26\x24\xdc\x61\x2b\xaa\xac\x39\x59\xc0\x6f\x77\x0c\x1c\x51\x52\xf5\x0b\x9a\xb0\xfb\x73\x64\x3a\xcc\xc7\xe2\xc9\xd6\x6b\xd5\xa9\xeb\xd0\xbf\x84\xf3\x18\xbd\xf0\x28\xe4\x0a\xd3\x9d\x56\x75\x6e\x12\xba\x45\x84\x51\xdf\x36\xea\xaa\x84\x63\xab\x1e\x11\xa5\x25\x32\x70\x67\x50\xed\x9e\x45\x56\xb4\xd6\xb0\xea\x8e\x02\x47\x8a\x8d\xfa\x23\x6b\xd4\xdb\xb6\x7c\x84\xcf\x91\x40\x30\x8d\xa2\x30\x25\x7d\x57\xeb\x23\x7c\x74\x07\x44\x20\x53\xaf\x38\xae\xca\x4a\x5f\x9d\xd6\x55\xf9\x9e\xe9\xbe\x5e\x37\xdf\x19\xea\x7f\xaf\x19\xce\x0f\x8f\xbf\x7a\xa9\xcf\x41\xb9\x7e\xa8\xb1\xbd\x86\x2e\x27\xb0\x28\x7a\x36\xc9\x23\x52\x85\xda\x27\xf7\x77\x46\x43\x21\x3d\x71\xef\xc5\x9a\x25\x8d\x68\x64\xf5\xb3\xcb\x51\x68\xfa\xbb\x25\xed\x7e\xcc\x78\xea\xcb\x48\x4e\xdc\xb0\xac\xae\xa1\x56\x55\x76\x38\x13\x26\xa4\x11\x67\x4c\xd9\xae\xae\xff\x45\xa4\x32\xe6\x10\x86\x21\x7a\xc4\xb9\x40\xee\x0d\xe7\x2e\x4d\x2a\x17\x17\x37\x80\x7e\x8f\x8a\x5a\xb3\xe8\x28\x08\x6d\xe7\xc4\xd7\x4d\xd2\xd3\xdc\xe2\xfc\xff\x75\xe7\x8e\x43\x4e\x65\x97\x76\x43\x9d\x4a\xbb\xd2\x66\xc4\x1e\x68\x14\xc7\x04\x65\x18\x9b\xb7\xac\xd2\x7f\x3e\xdb\xaa\x0e\xd6\xb9\xfd\xd3\xc6\x29\xf7\x28\x46\x2b\x1c\xb8\xc9\x5e\x8b\x7e\x56\xc6\x42\x3a\xda\xc5\xa6\x6b\x4f\xad\x6f\x60\x14\xa8\x46\x31\x04\x1d\x26\xcc\x8a\x6f\xf7\x5a\xe0\x34\x4a\x42\xad\x5d\xf5\xbf\xc8\xe1\x34\x5a\x33\x89\x26\xb8\x4f\xfe\x78\xda\xde\x3d\xde\xee\xbc\xd6\xb8\x3f\x9c\x86\x54\x7b\xe6\x97\xb2\x6c\x56\xfa\xb5\xfb\x4a\x69\x6a\x43\x1e\x4b\xa6\xd2\x7f\xbd\x54\x47\x88\x06\xb0\x8f\xfa\x64\x6c\xe4\x3c\x9f\xdc\x73\x3f\x91\x04\x30\x77\xb2\x85\xba\xe1\xfe\x3c\x92\x01\xae\x75\x79\x3c\xfd\x04\x71\x98\x54\x25\x69\x24\x63\x65\xa9\x23\x45\xb5\x15\x9f\xd9\xe8\xa9\x64\x4a\x84\x85\x14\x7a\x1d\x95\xbb\xa2\x0d\xf0\xb3\x77\x58\x1e\x9b\x7e\x14\x25\x16\x6e\x9f\xbd\xbe\x62\xa1\xf0\x3f\x84\xfa\x75\x28\x9b\x01\xa1\x0b\x8d\x24\x30\xf4\x1a\x90\x48\x15\x06\x91\x56\xa4\x68\x8a\xe9\x81\xfd\x31\x0f\xf9\x1f\xb6\x05\xb1\xc7\xdd\xd2\x48\x31\x8a\x3e\xf7\xa0\xbf\x27\xfa\x26\xea\xb7\x9d\x7b\x90\xee\x3c\x3c\x08\xc8\xb0\x86\x7f\x75\xea\x74\xaa\xbc\xeb\x15\x29\x09\xa1\xdb\xb9\xb7\xed\x5c\x5a\x8b\xaa\x39\x39\x48\x4a\x59\x5d\x5b\x06\xfa\x61\x36\x37\xd2\xa1\x6d\x14\x19\x67\x44\xa0\xbe\xf2\xd7\xd5\x31\xc7\x45\x9f\xd5\xb8\x6c\xbf\x08\xd5\x22\x9d\x70\xd6\x29\xe7\x8a\xfa\xec\x63\x68\x65\xf9\x30\x4f\x50\x5f\x1d\x4f\x17\xd8\xcc\x68\x04\x01\xd5\x49\x57\xea\xee\xbc\x8c\x51\x3a\x2b\x82\x40\x61\xee\xa8\xf5\x78\x73\xcc\x4f\x8e\xba\x9f\xfc\x28\xc1\xb0\xa1\x6c\x40\x7a\xfd\xb5\xed\x30\xa0\xa4\x7b\x81\xed\xa2\x6d\xa7\x85\xbd\xb0\xff\x5e\x34\xe0\x52\x69\x4f\x23\xd1\x67\x90\x67\x1f\x85\x06\x49\x88\x78\x08\x6c\x8a\xc2\xa8\xcb\x9b\x3a\x1a\x88\xd0\xeb\x67\x7f\x87\xd3\x00\x2b\x49\x69\x20\x2d\x1b\x69\x1b\x1f\x97\x55\x63\xca\x3c\x2b\xe7\x6a\x4c\x94\x06\x5a\xdb\x48\x3a\x7b\x75\xa8\xd9\x39\x2e\x7a\x4a\x43\x6e\xd9\x3e\x6c\x5c\xae\x7e\xe1\x3d\x63\xcd\x69\x4e\xec\x62\xf2\x10\xa1\x8a\x70\xe6\x75\xf5\xa0\x51\x93\x2d\xa5\x84\x86\x48\x79\x51\x1f\xf7\xbe\x33\xbf\x3b\xc4\x2c\x37\x69\x3b\xb9\x3d\x0b\x58\xbd\xae\x4a\x93\x35\x9b\xce\xfd\xa7\x44\x26\xc4\x6e\xf6\xf5\x41\x7c\x14\x3d\xf4\x88\x52\xa2\x13\x12\x74\xe9\xb3\xd5\x67\x53\x09\x64\x6d\xfb\x0a\xbc\x46\x69\x14\x44\x98\x9e\x05\xa1\xde\xd6\x2f\x9b\xed\x61\xf8\x76\xa3\x24\x42\xd0\xa2\xeb\x3d\x80\xa6\x75\x11\xce\xf7\x9e\xd1\x74\xa3\x51\x9a\xd8\xe6\xfd\x0f\x80\xc3\x4b\xd1\x75\x83\x7a\x08\x57\xf7\x32\xa2\x54\x2b\xd6\x89\x9e\x59\xcf\xc0\xc1\xa5\xc7\xf7\x48\x99\x55\xd4\xea\x38\xd7\xbe\xc2\x0b\x51\x4a\x63\xe6\xcb\x91\x0f\xad\x3f\x72\x05\xcd\x95\xa8\x33\x85\x1f\x71\x36\x1a\xa7\x54\x00\x92\x4c\x5b\x1e\xd4\x31\x87\x2a\xa5\xd4\x30\x5c\xd7\xd5\x71\xb2\x4c\x29\x8b\xac\xf4\xbf\x23\x2c\xba\xdd\x2e\xce\x06\x08\x4c\xed\xda\xfe\xa2\x76\x25\xd7\x0f\xe2\x70\xe8\x20\xac\xed\x08\xc0\x4e\x39\x14\xf7\xed\xd8\x2f\x29\x65\x5a\x61\xea\xd1\x06\x4d\xb6\x85\x0e\x05\x9c\x2f\x40\x66\x29\x65\x26\x0a\x74\xe7\x63\x0f\xa1\x07\x8b\x42\xdb\x72\x5d\xdf\xce\xd1\xfb\xc5\xe1\xb9\x5b\x4c\x39\x25\x56\x1c\x01\xfb\xfc\x8b\xac\xb9\xc9\x3e\x27\x4f\x16\x07\x09\xf2\x10\x42\x81\x9b\xfd\xd0\x5c\xd0\x98\x06\x18\xcb\xed\xac\x58\xd6\x3b\x38\x41\xff\xf9\xfb\x8e\x8d\xc1\x45\x71\xfd\xa7\x7f\xf1\xdd\x14\x49\x88\x25\xff\xee\xd0\x74\x05\xd4\x75\x0f\x4c\xea\xe6\x5c\x22\x0c\x9a\x55\xe7\x9f\x5e\x50\x8d\xf7\x83\x8d\xc5\x69\x3d\x1d\x9b\xa9\x60\x14\xa5\xa9\xe0\x9e\xdc\xf7\x7a\xb3\xb5\x9e\xc8\xfd\xc3\xe3\xd3\x64\x37\x11\x41\x80\x35\x32\xe1\x62\x86\x7a\xd3\xf5\xc8\x50\x2a\x43\x8b\x98\x69\x27\xe0\xe9\xba\x3a\xbe\x76\xcf\x23\x69\x8c\xfc\x17\x58\x1c\x1e\x36\xcd\x51\x2a\xb9\x8c\xa9\x77\x2c\xf3\xb2\x9a\x03\x02\x53\xaa\x8c\x41\xe2\x9d\xe5\xe9\xd0\xde\xcd\x53\xf5\x2a\x8a\xec\xef\x41\x6d\x61\xf2\xac\x3a\x00\x74\x25\x1f\x16\xdf\xff\xe3\x7e\xe5\x2d\x15\xd5\xc2\xc2\xb0\x1f\x33\xff\xe9\x3a\x11\x12\x4a\xb5\x0e\x30\x7c\xcd\x54\xd9\xe3\xa2\x29\xd5\x40\xc1\xe6\xdb\x5b\x77\xbd\x86\x4d\x03\x87\x75\xff\xe2\x20\x48\x31\x4c\xf9\x40\x62\xe5\x9d\x3c\x56\xbd\xbb\xdb\x1b\x51\x0a\x42\xc7\x91\xc5\xd7\xe6\x27\x53\x56\x4b\xb0\xcd\x94\x62\x00\xb5\xf8\xd7\xef\xff\xf1\x67\xd3\x22\x52\x3e\xe2\xef\xd4\x1c\xa6\x8e\xed\xf8\xd3\x19\x1a\x60\x9a\xde\xe6\xec\xda\xb8\xfd\x01\xa5\x7d\xea\x17\xec\x8d\xea\xfb\x39\xda\x6d\x47\x79\x36\xd5\xd5\xe7\xa1\xac\xda\x75\x35\x3f\xa9\x58\xc0\x39\x26\x1c\x37\x59\xf1\x7a\xcc\x31\x8a\xdb\x42\x4d\x98\x3f\x55\xc8\x25\x96\x48\x36\x85\x38\xd4\x6f\x65\xb3\x15\xfd\x7a\x61\x21\x37\x16\x3b\x6d\x51\xb7\xed\xae\x3e\xa4\xff\xa1\x8c\x04\x02\xa0\x6f\x47\x9c\x40\xd3\x28\x23\x51\x00\x2e\x13\xbe\xb3\x0d\xf3\xbb\x7a\x40\xe5\xe2\x46\x45\x81\xa4\xbe\x67\xd4\x26\xdd\xd6\x55\xf9\x3a\xb0\x4f\x2c\xa2\x60\x7a\x16\xc8\xac\x78\xb5\x73\x74\xd7\x1d\x97\x1c\xb3\x96\x1f\xc7\xd7\xe3\x20\x1f\xc7\x28\x4f\x2c\xe4\xae\x2c\xa7\xc5\x21\x46\xa5\x65\x84\xc3\x6f\xe4\x8a\xb6\xc3\x8f\xc8\xa8\x62\x5a\xf5\xbd\x69\x0d\xf8\x29\xc7\x18\x8f\x90\x18\xeb\xc5\xd9\x9f\x3c\x5f\xbc\x42\x31\x15\x28\x18\x5f\x8e\x47\x80\x29\x1e\x0b\x84\xb1\x4c\x35\x7e\x66\x74\xf2\x2f\x94\xc5\x8c\xd8\x9a\x1b\x1c\x6e\x44\xb5\xef\xfe\xac\x88\x45\xab\xe4\x19\x14\xcd\x06\x3a\xfb\xdc\x1e\xd1\xc3\xe9\xdf\x09\x15\x5f\x98\x10\x31\x84\xd8\xc0\xe0\xd1\xce\x16\x7c\x31\x19\x63\x08\x36\xbe\x21\x27\x61\x93\x35\xa2\xc8\x8e\xfb\xdd\x3e\x2b\xc4\xb0\xde\xc8\x12\x66\x09\x3e\x6a\x68\xfe\x7e\xb1\x27\x18\xc9\x83\xfe\x37\xf9\x9f\x91\xff\xcf\x12\x88\xa8\xf1\x4c\xdd\x1f\x7e\x8b\x9b\xf5\x8b\x58\x2a\x80\x0c\x3a\x5d\xdb\x97\x3c\x98\xe5\x6e\x90\x88\xad\x08\x16\x7c\x82\x3a\x36\x2e\x33\xdc\xc5\xc9\x80\xdd\x20\x3e\x59\x39\x79\x46\x19\xc6\x29\xeb\xb4\x9d\x51\x78\xc3\x91\xdf\x55\xb6\x0d\x51\x54\xa7\x1f\x1e\x29\x43\x99\x8a\xd3\xc8\x22\x4c\x5b\x07\xc8\x45\x65\xff\x1d\xc6\xfc\x7f\x86\x65\x3d\x3f\x58\x4a\xcb\xa8\x0b\x85\x76\xdd\x4c\xf5\x17\xe4\xb9\x94\x29\x9d\x32\x4b\x7a\x54\x5c\xd4\xe7\x1d\xff\x42\x27\x36\xde\xc4\x48\xb0\x52\x6f\xd9\x80\x0c\x73\x66\x47\x62\x10\x86\x48\xa3\x82\xdd\x51\x0f\xa2\x51\x6f\x57\xc7\xdf\xb2\x76\x4e\xae\x09\xa1\xf0\x8a\xe3\x8e\xd3\xfd\x58\x34\x53\xb9\x56\xca\x20\x56\xd2\x65\xf6\x57\x45\xd3\xe3\x3f\xbe\xfa\x67\xfc\x59\x01\x22\xd4\x41\x68\x7d\xf7\x27\xe3\xab\xe3\xfe\x53\x18\x12\xa0\xf2\x8b\x12\x79\x33\xb0\xee\xcc\x50\x89\x61\xda\xaf\xac\x69\x4e\x68\x8c\xb7\xa5\x05\x14\x8f\xef\xcf\x30\x9e\xb8\x46\x1a\x3c\xbc\x12\x55\x81\xfe\xa3\x3f\x1e\x5b\x46\xb7\xac\x70\x2b\xca\xb5\x5c\xac\x2b\xc0\x90\x5d\x4f\x89\xb5\x7f\x93\xb0\xb0\xa7\xe5\x01\x1d\x92\x03\x5d\x1d\x4f\x7d\x3d\xfa\x8f\xc9\x48\x99\x60\x5e\xda\x41\x13\xb0\xb4\xed\x60\x4d\xc3\x53\x27\xdd\x70\x8d\x49\xba\x83\x8d\x5a\xbb\xee\x46\xf7\x3c\x3c\x4c\x38\xe6\x12\xeb\x7f\x1f\xc5\xaf\xee\x8f\x29\x4f\xc8\xa0\x5f\xb6\xdd\x8a\xae\x17\x77\xf3\x7e\x28\x0f\x95\x15\x5c\xfd\xf9\xed\xe9\x7e\xb5\x43\xc5\xa5\xee\x44\x46\x59\x9a\xc4\xd5\xfd\xcd\xf5\x6a\xb3\x7d\x7e\x59\x6e\x77\xd7\xab\xfb\xc5\x5f\x7e\x04\x09\x34\xca\xa7\xa2\x86\x82\x65\x3c\x88\xba\x63\x91\x52\x4e\x8d\xfb\x1b\x54\xe5\x1f\x5f\xc8\x77\x51\x4e\x4c\x62\xfb\x71\xef\x26\xda\xd0\xed\x21\x8b\x56\x41\x1c\x60\x21\xf2\x45\x51\x7f\x4c\x30\xf4\x94\x47\x51\x8c\xe5\xb3\x47\x04\x10\x3d\xfc\x66\x89\xf1\x88\x5b\x78\x4b\xa7\x5d\xd7\xe7\xff\xff\xe1\x97\x9f\xbc\xc5\x48\x58\x62\x95\xd6\x6b\xb4\x0c\x3b\xdf\x44\x7d\x05\xaf\xc7\xee\x31\xa8\xb6\x3d\x5e\x60\x15\x61\xdc\x5f\x59\x2a\x05\xf1\x94\x11\x4b\x5b\x42\x05\xbd\xeb\x9d\x72\xce\x80\x63\xf7\x73\xa7\xd3\xfc\x3d\x53\xbf\x7e\x8c\x00\xda\x93\x7b\x49\x68\x88\x02\x41\xaa\x38\xad\x9a\xb7\x01\xcc\x8a\x27\xa9\xa6\x0e\xd4\x88\x3d\x68\x50\xe8\xa6\xf7\x3d\x78\x9a\x2a\xf4\x09\x90\xba\xd2\x1b\xb0\xce\x7e\xf1\x54\x26\x41\x3a\x51\x9e\x9e\x7c\x86\x14\x98\x70\xb9\x26\x5c\x7f\x77\x0d\xec\xef\xf4\xc4\x3c\x73\x11\x12\xac\x57\x2d\x94\x82\x43\xf3\x5c\x1e\x9b\x01\xaa\xea\xac\x96\xd6\x13\xea\x50\x2e\x92\x14\xbb\xce\x4d\x55\xee\x91\x24\x6f\x34\xc8\xaf\x1a\x91\x72\x2c\x58\x75\xe0\xa8\x67\x78\xcd\x4a\xab\x69\x9a\x7d\x4e\x22\x83\xff\x0e\xf9\x24\x14\xe1\xc2\x80\xef\x4e\x77\x1a\xf1\x5e\x70\xa3\x7b\x50\x19\x01\xa6\x2e\x1a\x27\xb6\x71\x0d\xfb\x63\x55\x89\x57\x18\xeb\xb0\xf8\xd1\x9c\x39\x3d\xc3\x42\x2f\x45\xa1\x4f\x93\x17\xa2\x22\x1e\xb9\x34\xcf\x4f\x94\x48\x18\x60\x7c\x29\x57\x71\x8a\x5b\xa6\xcd\x56\xa2\x3b\x32\xfd\x7d\x62\xd0\x57\xbb\x6b\x86\xf5\x2d\xae\xc3\x10\xbd\x9c\xd7\x9e\x15\x99\x72\x6d\x24\xb5\xed\x90\x75\x99\xbf\xc3\x12\x01\x12\xf6\xd9\xbc\x6f\xc7\xc1\xe8\x11\xf0\xb2\xbe\x29\xab\x76\x8b\xbc\x24\x3b\x46\xb9\x89\x54\xec\x3e\xfc\x7d\xf6\x0e\x0f\xe2\xf3\x0a\xba\x07\x30\x90\x78\x7c\xc7\x90\x95\x86\xc6\x41\x60\xf9\xdc\x7b\x96\xad\x73\x90\x30\x8d\x03\x61\x30\x09\xb6\x7a\xb7\xed\x14\xa3\x67\x8f\x09\x63\xe8\x24\x61\xb3\x2a\xc0\xaf\x36\xde\xf4\x0f\x1b\x93\x94\x23\x16\xcb\x4f\xe6\x9b\xc1\x21\x95\xa0\x92\xc6\x0e\x8d\xfe\x98\x97\xfe\x5f\x83\x4f\x1d\x33\x6a\x3c\xdc\xcd\xa5\xc6\x27\x90\x7e\x1a\x33\xc9\xb4\x5d\x38\xef\xd0\xf9\x15\x31\x37\x91\xb6\xe0\xda\x76\x6e\x64\xc5\xeb\x0d\x40\x5f\x56\x8d\x63\x9e\x32\x67\xab\x6a\xc8\x8d\xae\xca\x43\x73\xd6\x68\x4b\xe3\x84\x59\x7e\x40\x50\x36\xcb\x32\x2a\x50\x9e\x6b\x3a\x8c\x7f\x9c\x06\xcc\x73\x3d\x5c\x95\x85\xee\x6b\x73\xf3\x9f\x31\x16\x52\x5b\xc2\x4a\xa8\x9b\xbb\x7a\x73\xc4\xd6\x46\x73\xec\x1e\x49\x00\xa3\xa4\x6f\xd7\xc3\x98\xd2\x66\x8e\xfa\x11\x71\x68\x06\x23\x4e\x07\x98\xfb\xa6\x32\x14\x5c\x0d\xb4\xc9\xdb\x08\x7c\x44\x6a\x3f\x79\x10\x45\x35\xb7\xe2\xc1\xdd\x96\xed\x0d\x4d\xac\xb8\xb4\x34\xdb\xa5\xb1\x12\x07\x1b\xac\xfe\xcc\x22\x51\x62\x05\x69\x4f\xd6\xd8\x6e\xf8\x3b\x0f\xc4\xf1\xa7\x83\x38\xc4\x3c\xe8\xa2\x28\xca\x07\xd0\xfd\xf7\x84\x38\xc4\xc8\x6f\xb1\x5c\x0e\x0d\x54\x6c\x98\x65\xc6\x5f\xae\x97\xab\xee\x6f\x4a\xc5\xd6\x70\xb7\x1e\x2a\x38\xf5\x5a\x77\xef\xc3\x92\xe1\xe8\xb5\x24\x41\x10\x22\x5e\x6b\xac\xf6\x79\x75\x5a\x6d\xbf\xcd\x9b\xef\x24\x20\x09\xee\xb8\xef\x22\x3f\xc2\x14\x34\x95\x04\xca\x0b\xa2\xa0\xa7\x7d\x03\x30\x79\x1f\x49\x48\x2c\xe3\x4d\x56\x7f\x87\x13\x66\x29\xe7\xbf\x40\x42\x02\x66\x11\xdf\x7b\x31\x10\x49\xa2\x09\x09\x63\xdc\xcc\x3d\x1e\xbe\xfb\x3b\xb3\x7c\x5d\x05\x7c\x36\xeb\x1f\xeb\x2b\xd1\xe4\xa3\xa2\x49\x42\x12\x89\x94\x16\xdb\x2a\x2b\x60\xf9\xd6\xb1\xd9\xd1\x84\xb8\xfd\xdb\xc7\x31\x4e\xe0\x67\x3c\x85\x12\x6a\xa8\x57\x24\xff\x8f\xb2\xf6\xf6\x32\x61\x21\x33\x56\x06\x02\x3b\x9d\xea\x26\x6b\x30\x21\x85\xac\x5d\xa3\x3a\xf1\x20\x47\x90\x30\x6e\xad\x2c\x96\x5d\x2b\x0c\xc2\x46\x45\x5d\x37\x2c\x96\x0a\x93\xdf\x56\xc8\xc6\xef\x63\x49\x6c\x34\xc2\x2f\xa1\x79\xc3\x26\xa5\x21\x17\x27\x4d\xd2\xc8\x4a\xe0\xec\x70\xce\x6d\xcb\x2b\x68\x1a\x97\x6c\x19\x21\x03\xfb\x47\x4b\x13\xa3\x9d\x50\x5f\x5e\x9e\x66\x19\x29\x69\x92\x0a\x82\x60\xc4\x1a\x31\x96\xd8\x7c\xd9\xdd\x90\xe0\x3c\x1a\x48\x1e\x21\x41\xc7\xb6\xbc\x5b\x2e\xd6\x23\x06\xbf\x8b\xf8\x95\x61\x7c\x91\x48\x2d\x63\x57\x94\x3e\xe6\xdd\xe6\x9d\x48\x08\xb0\xcb\x43\x58\xb1\x5c\xe8\x2c\xc5\x7f\x1c\xab\x09\x68\x28\x51\x69\xa2\x75\xf7\x40\x50\x8d\xc0\xad\x89\x02\x83\x5d\xba\x0e\x01\xd3\x06\x1e\x46\x28\xdb\x77\xa0\xcb\x8f\x6e\x5e\xe8\x14\x62\x97\x94\xbf\x53\xe5\x28\x97\x95\x68\xe0\x98\x43\x1f\xb0\x15\xa3\xd7\x39\xbf\x6a\x20\xb4\x8a\x36\x58\x95\xf0\xc6\xe1\xd2\xa2\x34\xd2\xaa\x7c\xed\x5a\xf3\x3d\x31\x14\xb3\xbf\x48\x03\x4e\xb0\x5a\xf7\xb0\xf8\xd3\x0a\x38\xfd\xe1\x0f\x08\x9e\x76\x9a\x03\x57\x42\xbf\x76\x20\xac\x94\x44\x32\x31\xbe\x72\x71\x39\xc4\x49\x89\x6b\x99\x19\xd4\x83\x66\xcb\x96\x69\xc4\x0c\xee\xc4\x96\x2e\xb8\x6b\xac\x9d\xfb\xc4\x69\x94\x44\x61\xe4\xbb\x06\xde\x45\xa1\x7a\x81\xc3\x79\x20\x64\x1a\xc9\x28\x35\xa3\x3e\x83\xd6\xf8\xfa\x87\xa1\x34\xc4\x4a\xd7\x54\x65\xd1\x45\xcc\xe3\x99\x9c\x52\x26\x70\xf9\x98\xd6\xec\x14\xd0\x64\xaa\xec\x4e\x94\x58\xbc\x4f\x0d\xcd\x9d\xee\xca\x76\x29\x0b\x63\x4c\x0e\x3c\x40\xfd\x86\xe8\xf3\xf9\x57\xc0\x88\x09\x9d\x4c\xce\xba\xcc\x33\x75\x5a\x8b\x4c\x3f\x9d\xf7\xf3\xf5\xc3\x13\x37\xbf\x10\x94\xfe\x28\xf6\x23\xd1\x7e\x9a\x32\xca\x30\xe9\xd5\xa3\x3a\xff\x49\x37\x0f\x4d\x99\x4a\xa9\xab\x00\xef\x9a\xf2\x90\x77\xc4\x79\x5f\xcf\x23\x1e\x29\x5c\x62\x9b\xc5\xfa\xe9\xc7\xe2\xe1\x8f\x59\xfc\xc1\x85\x4b\xf2\x24\xf6\xc5\xad\x57\xa0\x63\x46\x7d\x9a\xc6\x4c\x60\x20\x5c\x89\xac\x06\x4f\x82\x87\x5d\xee\x7b\xe1\x89\x68\xfa\x73\xc5\x89\xc0\xf2\x86\x68\x57\xdc\xfd\xd3\x76\x7a\x58\x27\xca\x82\xc9\xfb\x8d\xa0\x37\xa8\x69\x0c\xdc\xa7\x99\x1d\xb6\xb0\x13\x64\x1d\x9f\x27\x89\x82\x38\x1d\xd1\x65\x63\x6a\x7d\xe0\x7c\xce\xbf\xa6\x24\xb1\xe5\xf7\xc6\x8a\x02\xda\xf9\x3a\xd0\x06\xa2\x69\x2a\x15\xee\x30\xd7\xab\xa5\xd7\x5e\xa1\xa9\x08\x21\x76\xc5\x8b\x49\xdb\xb9\x1f\x40\x09\x06\x52\xcb\xea\xd4\x94\x28\x04\xb2\xec\x5a\x01\x52\x29\x19\xc2\x70\xd4\x40\xd9\x74\xe0\x5f\xb9\x51\x8a\x48\x29\x7d\xcc\x54\x00\x52\xf8\x55\xa7\x25\x32\x3c\x74\xd6\x27\x55\x2a\xb6\x58\x1c\xcb\x8f\xe7\x80\x35\x33\x22\x1f\xc9\xec\x0e\x9d\xea\x20\x92\xaa\xff\x00\x1b\xc8\xf3\x70\x5c\x06\x4c\x35\x8b\x50\x61\x01\xf5\xd6\x9f\xe1\x1d\x23\xf6\xee\x20\x97\xc8\x52\x5d\xbf\xc1\x2f\xf0\xfe\x4e\x0a\x81\xb0\x10\xfb\x72\x7f\xc8\xbd\x9a\x13\x4d\x81\x32\xe4\xaf\xdb\x67\x45\xb3\x14\x87\xbb\xa2\x75\x4e\xfc\x31\x11\x60\x2a\xaa\x12\xc5\xaf\x27\x33\xfc\x04\x22\x70\x0a\x85\xce\x51\x99\x14\x41\x44\x48\x13\xd6\xef\xdf\xab\xe6\xcd\x17\x24\x1d\xba\x64\x3c\x55\x44\x28\x62\xec\x54\x5e\x42\xd5\x20\xc6\xd4\xe2\x9e\x47\xcb\x5f\x84\xc2\xb6\xca\x21\x55\xcb\x16\xc4\xbe\x1e\xb2\x0c\x8f\xf2\x7a\x22\x04\xe2\x09\xa6\x5e\xea\x71\x97\x25\x15\xa4\x7d\x45\xff\xe7\xff\xf9\x3f\xff\x3e\x66\xea\x57\x5d\xf6\x18\x3f\x1f\x31\x09\x22\x52\x24\xc5\x44\x3a\xff\x2f\xf7\x02\x11\x45\x1c\x15\x5a\x1f\x17\x9b\xed\x1f\xdd\xdf\x52\x0c\xe0\x74\x79\x26\x9f\x4a\x51\x40\x4b\xb9\x70\x39\x87\xea\x0c\x3a\xd8\x46\x58\x18\xd2\xdd\x3f\xdd\xee\xfc\x6b\x5b\xb5\xaf\xf7\x62\xaa\xb8\x8d\x59\x30\xb5\xb3\x3e\x55\x98\x8d\xef\x3a\xeb\xa9\xa0\x8a\x10\xbf\x5c\x8b\x57\xc8\xef\x45\xdd\x5c\x89\xa6\xc9\xa1\x23\x17\x71\xcd\xec\x54\xb0\x36\x58\x6c\x43\xb3\x97\x47\x5f\xcb\x11\x0c\x08\xed\x54\x6d\xb2\xbf\x61\x55\xe8\x41\x81\x43\x30\xc3\x58\xa7\xff\xbf\x83\xcf\x43\x59\x40\xd1\x10\x7f\x98\xc7\x56\xd7\xd1\xe1\x35\x47\x46\x5e\xf0\x04\x90\x62\xf8\x58\x43\x95\x97\xaf\x13\xa1\x3a\x2a\x78\x1a\xe2\x46\x70\x10\x55\x0d\x96\xc8\x09\xe5\x38\x9b\x4c\x7a\x64\xa7\x1b\x19\x33\xc5\xa1\x2b\x75\x6e\xca\x5c\x8f\x5c\x12\x11\x33\xd0\x6a\x90\x43\xbb\x86\x3e\xf0\x1c\x1b\x19\x11\x2b\xe3\x1a\x13\x34\xc0\xbe\x8d\xdf\x31\xe3\x38\x4a\x8c\x88\x24\x72\x52\xfa\xfb\xcc\x37\x9c\x4f\x06\x30\x89\x5c\xb1\xd8\xcf\x37\x7f\xa1\xc4\x24\x28\xb8\xd1\xe9\x2b\x7d\x2b\xbb\xb8\x4b\xa4\x44\x23\xfe\x66\x67\x17\xd0\x08\x2b\x39\x3e\x4d\x4a\x19\xef\x54\xa7\x87\xf2\x9d\xf3\x57\x15\x8a\xa3\xc9\xd3\x99\x31\x7f\x4c\x66\xbd\x8c\x80\x3a\x4e\xa2\x5e\x81\x69\xea\x37\xcc\x9f\x56\xf2\x54\xe9\x0e\x73\x7e\x75\x3c\x21\x92\x7d\x94\x64\x11\x2a\xb2\x1b\xb4\x15\x23\xbd\x39\xce\x40\x59\x85\x92\x4a\xbb\x46\xa6\xd7\x42\x14\xcd\xe1\x78\x38\x74\x2c\x3c\x54\xe8\x50\x60\xa2\xef\x1d\xda\x15\x91\x69\xa1\x07\xc7\x24\xa1\xfd\x96\xe3\x94\xc0\x2f\x0b\x2b\x51\xa1\x15\x41\xaf\xd1\x36\x20\xce\x50\xc7\xb5\x43\x28\xc2\xda\x0d\xa8\xb7\x36\xe2\xb0\x93\xf0\xa6\xac\x96\xa2\xd0\xd9\x00\x74\x2e\xb4\xd2\xe0\x36\x9c\x4d\x56\xbc\xe6\x70\x7b\xc4\x42\xb3\x03\x0c\x74\x2f\x01\x22\x82\xf1\x7f\x2d\xda\x5d\xf8\xaa\x2c\xf3\x81\xe5\x10\x26\xd4\xa1\xe8\x4a\x4f\x1d\x8e\x66\x40\xa0\x4a\x85\x11\x80\xf8\xc1\xc5\xb1\x29\xbf\x77\x01\x9a\x0c\x22\x83\x05\xf7\xcc\xd1\x54\xdc\x97\xea\xd7\x1c\xdd\x11\x95\x01\xd7\xd8\x97\xf5\x06\xe2\xb0\xf1\xbb\x5f\xe2\x67\x81\x0c\x44\x84\x7a\x5e\xf0\x39\xe2\xe9\xda\x96\xc3\x78\x50\x86\x2c\xc5\xe2\x94\x44\x33\xd8\x60\xc7\x77\xdd\x1d\xe4\x96\x9e\xb8\xe7\xf4\xc4\x58\xa2\x2a\xf7\xcf\xc8\xf6\x06\x55\xfd\x65\xdf\x88\x0c\x53\x86\xfe\x8c\xa3\xec\x9b\x16\x2e\x64\x28\x03\x44\xaa\xf8\x0b\xb4\x0f\x0b\x8e\xef\xd8\xaa\x72\x20\x5e\x73\xf2\x23\x05\x36\x43\xe3\x20\xbf\x4b\x91\x9f\x6d\x02\xae\x89\xe4\x0c\xfa\x7b\x99\xca\xfe\xeb\x5a\x82\x8c\x42\x40\xab\x2b\xb3\xe6\xa7\x68\x26\xb6\x40\x46\x44\x62\xb6\x6b\x5f\xea\xcc\x9c\x9e\xcf\x0a\x0c\x32\x92\x01\x7a\x9a\xcf\xd7\x7f\x8e\x5e\x3f\x4d\xac\x7c\xce\x2b\x34\x76\xa5\xcd\x2e\x4b\xc9\x08\xd8\x4f\xfd\xea\x77\x16\xc9\x8c\x40\x68\x41\x4f\x51\xec\x0e\xc4\x94\x21\x1d\xe2\x6f\x82\xcc\x11\x4d\x3c\x95\xb1\x61\x8e\x56\xa0\x2e\xf3\xa3\x55\x8f\x1a\x3f\x42\x22\x18\x72\x7f\xd5\x42\x89\xaa\x77\x2e\x64\xa2\x08\xc4\xae\x4e\x27\x2a\x97\x7a\x26\xc1\x18\x0b\x24\xd3\x30\x30\x72\x90\xf2\x3b\x27\xfa\x6a\xc7\x70\xf4\x77\x5a\x17\xe6\x8a\x5c\x5d\x40\xb7\x48\x41\xd2\xd8\xf1\xf9\x59\xb6\x14\x6c\xe2\xdc\xe4\x43\x8c\xdd\xc0\xa8\x48\xc1\x24\xe2\x11\xee\xa1\x2c\x32\xdd\x3f\xb2\xd0\x01\x56\x78\x5b\xcb\xdc\xda\x86\x39\x5e\x77\x2a\x65\x18\xa1\xdd\x6d\x5d\x08\x04\x59\x4d\xdd\x88\xaf\xf4\xb9\xa8\x94\xc4\x4a\x44\xdf\x97\xaf\xed\xaf\xbd\xcc\xef\xf8\x89\x24\x8d\x90\x80\xe2\x0a\xca\x42\x96\xde\xa5\x93\x52\x43\x17\xaf\xde\x2d\x9f\x76\x9b\x97\xf5\xda\xd3\x29\x50\x29\x4d\x88\xf9\xd7\xfb\xc5\xcb\xf2\xdb\xf2\xe9\x11\x05\xd2\xfd\x41\xc5\x42\xfc\xe9\xda\xb9\x9e\xa5\xca\x44\xbe\xce\x45\x63\xca\xae\xc4\x2d\x15\x24\xe8\xc1\x2c\x37\xa3\xcc\x99\xd4\xb1\xc0\x55\xe9\x7c\x68\xcc\x61\x88\xea\xd4\x1f\x96\x49\xc7\xd4\xe9\x4b\x75\xfe\x20\x10\x4b\x33\xf0\x4d\x54\x7a\x99\x83\xa8\xba\x03\x9c\x62\x57\xd8\x87\xa8\xaa\xac\xac\x86\x39\x27\x09\x5a\xa0\x97\xd7\xa1\x2e\xc6\x9f\x00\x4c\x8c\x3c\x29\x48\x7d\x80\x86\xc9\xc2\x07\x7f\x57\x13\x9a\x9e\xc5\xe6\xab\x7d\x91\x71\xca\x03\x42\xa5\x61\x29\x5a\x9e\xe5\xd3\xf3\xea\x71\xb5\x45\x42\xd4\xe3\x39\x60\x79\xdc\xfb\xa2\x82\xc4\x92\xc3\x6b\x90\xc7\xd7\x9d\x17\x40\x44\x19\x38\xb8\x5b\xdf\x6c\xa6\x45\xe2\xd1\xfc\x50\x01\x68\xcc\x42\xb9\x06\xa7\x33\xde\xe8\x99\x09\xad\x02\x63\x5b\xe8\xca\xa2\x8d\x1d\x0b\xf8\xa8\xa5\xc8\x33\xaf\xee\x41\x55\x08\x76\x4f\x77\x58\x34\xb7\x89\x8e\xde\x86\x8a\xb4\xc1\xcf\x21\x8f\xc6\xf8\xdf\x45\x10\x63\x23\xe8\xf3\xcb\xd5\xee\x69\x5f\x64\x1a\x19\x3f\xfd\x51\x4a\x83\x0e\x96\x24\xea\x37\x29\xd4\xaf\x59\x1c\x81\xa2\xda\xa0\x43\xf4\xf3\x76\xd4\x88\xaa\xa8\xb1\x59\x54\x4b\x71\x86\xbd\xa8\x5e\x10\x23\x71\x7d\x1d\xce\xed\x57\x4c\x1a\xde\x13\x37\x6d\x7e\x65\x87\x99\x6c\xb5\xe2\xd4\x72\x4c\x0e\xb2\xd5\x53\x68\xa1\xe2\x8c\x63\x16\x38\xab\x91\xcd\xf3\xde\xb2\x8b\x8f\xbf\x01\x8f\x23\x84\x1f\x62\x5b\xe8\x28\x6f\xae\xb8\x51\x48\x16\x26\xf2\xbc\xfc\x58\xd5\xaa\x2a\x3f\x06\x76\x5e\xc5\x8c\xab\x78\xa2\x34\xdf\x46\x34\xfe\xe7\xb1\xb2\xa4\x5c\x07\x9b\x68\xf6\x38\x56\x95\xa4\x11\xba\x95\xd0\xbc\x39\x7b\x3c\xd9\x6d\x55\x22\x23\xa6\xd1\xa2\x14\x70\xf2\xef\xd9\x1d\x4b\x23\x25\x5c\xf6\x65\x88\xed\xdb\x64\x7f\x4f\xdf\x50\x1a\xa7\xdc\x35\xa0\x97\x66\x57\x9a\x9d\x65\x76\xdc\xfd\xf2\x6c\xc7\x54\xa5\x32\x50\xa2\x23\xbd\xdf\x7e\x4e\xde\x8d\x97\x5a\xfc\x71\xff\x74\xbb\x9c\x69\x06\x1b\x2d\x05\x91\x58\xb9\xf2\x76\x1d\xdf\x64\x5d\x5e\x48\x09\x88\x11\xb6\xb9\xeb\xc2\x48\xa8\xae\xcb\xd7\xdf\x82\x21\xc6\xf3\x4a\x80\x44\x1b\x7a\x40\x7c\x68\xf7\x85\x95\x0e\x31\x47\x2c\x2b\x10\xbf\xe0\x1d\x0a\xab\x6a\xe4\x8e\x02\x4d\x94\x23\x0f\xe8\x60\x29\xb3\xa5\xcc\xee\x89\x21\xb1\xd2\xe0\x8e\x24\xf0\x8b\x8e\xa6\x59\x28\x85\x0e\x0d\xb1\xaa\xa0\x99\xa9\xca\xba\x19\x2e\x01\x4d\x88\xc2\x84\x9e\x25\x00\xba\x2e\x8b\x01\x05\x32\xd5\x24\x91\x9c\x78\x36\x65\x2d\xf2\xfa\xea\x58\x15\xe0\x35\x78\xdc\xa0\x28\xe2\x9e\x73\x6e\x75\x7f\xf7\xe7\x6c\x39\x45\x53\x13\xf8\x94\xec\x6e\x88\xd8\xd0\x8c\xf1\xa4\x43\xa1\xae\x6c\x5e\xfc\x19\x54\x06\x1d\x31\x30\xd5\x2c\xb6\xae\xc0\xce\x94\xd5\x28\xab\x3a\xd8\x83\x34\x13\x11\xb2\x0c\x39\xc5\xfb\xb9\xfa\xaa\x66\x82\x61\x9e\x6f\xfb\xe7\x47\xd6\xbc\x2d\x4b\x7d\xd6\xc6\xe7\x07\x42\x14\xc0\x2c\xcf\x6d\x5f\x19\xd4\x9c\x6b\x81\xb2\x57\x83\x16\x02\xcd\xb9\xc1\xca\xb3\x12\xb9\x7a\xb6\xcc\x77\x33\x9e\x85\xe6\xb1\xf6\x1d\x15\x59\xfd\x66\x55\xdc\x9b\x1e\xb0\xa1\x79\x6a\x1c\x5f\xd3\xa9\x3c\x36\x0f\xd0\xbc\x95\x7a\x71\x75\xd7\x1d\x96\x12\xe7\x6f\x2e\x1a\xec\xa8\x41\xf2\x31\x77\x2c\x0e\xa9\x72\x0d\x31\x18\x67\xd9\x44\x17\x99\x7c\x90\x98\x24\xf8\xde\xd7\xcf\x2b\x34\xe5\xcf\x77\x9b\xef\xbb\xf5\xea\x79\xb9\x7a\xdc\x2e\x6e\x57\xdd\xc9\x98\xf5\x97\x6b\x68\x1c\x95\xcb\xa3\xd8\xcf\x32\xc1\x52\x9d\x10\x83\x70\x2a\x5b\xd5\xf0\x2d\x0f\x3a\xa1\x81\x48\x3c\x0d\x88\x4d\x3a\xb4\xd1\x4b\xf5\x20\x3e\xc7\x13\x29\x91\x34\x10\x1e\x9f\x44\x1c\x71\xde\xf8\xb5\xa5\x01\xc5\xa5\xe5\x0a\x78\xb5\xed\xae\xf5\x07\x5b\xe7\xbd\x5b\x27\xcd\xe5\x2e\xc0\xcb\xa8\x4d\x9d\x12\x8a\x78\x36\xf8\xc4\xdd\xbb\x5d\x14\x37\x8e\x97\xaa\xbb\x0c\x53\xb1\x9b\xef\xcf\xa5\x2c\x91\x8b\x6a\xbe\xf4\xa2\xd3\x98\x61\xaf\xf8\x62\x79\xff\xd7\xf5\x68\x9c\x1f\x90\x32\x42\x3c\xa1\xef\xe9\xd0\x88\x63\xf5\x0c\xaa\x7c\x87\x6a\x52\xfa\xd7\x22\x4e\xd1\x59\x70\xa2\x7e\x4f\xe6\x5c\xd8\x86\x6a\x49\xc0\x69\xe5\x66\xcd\xb5\x28\x7f\xdb\x46\xf5\x7f\x15\x79\x68\x99\x28\xc4\xc9\x5e\x65\x20\xc7\xe8\x6a\x2d\x85\xc1\x34\xa6\x6c\x57\xcc\x33\x34\xc7\xaa\x98\x33\x26\x5a\x4a\xdb\x86\xfa\xbf\x4e\x9c\x7f\x04\x76\xb8\x70\x59\x1d\x47\x98\x09\xc8\xea\x87\xac\xc8\xf6\xc7\xfd\xb0\xbc\xa8\xb5\x89\x50\x52\xa6\x70\x39\xea\xf5\xb1\xf8\x55\x6f\x4b\x97\x1e\xf2\xa3\x20\x52\x5e\x1a\xfb\x06\xa6\xa4\xbd\x83\x74\x81\x06\x4e\x95\xad\x23\xb7\x1b\x12\xe8\xf6\x92\xfe\x24\x26\x88\x99\x25\xdf\xc1\x66\xc8\x0b\xca\x6c\x54\x9b\x88\x20\xe8\x1d\x0a\xbd\xbb\x7f\x5a\x7e\x7f\x59\x77\x67\xe0\x96\xae\x7d\x94\x20\x98\x8d\x2d\xb4\x49\x94\xcd\xc7\x82\xab\x40\x7b\x70\x60\xb5\x1b\xe1\x70\xb5\x31\x01\xfa\xb9\x7f\xff\xfd\xb7\xfb\x13\x04\x21\x41\x2a\xd7\x67\xb1\x87\xe9\xd4\x83\x80\x18\xa5\x46\xdc\x89\xa5\xb9\xc0\x78\x4b\x81\xd0\x30\x1e\x66\x3d\x17\x55\x03\x46\xa8\xa6\xbe\xeb\xcc\x1e\x10\xcd\x23\xfb\xca\x6c\xd0\xec\xff\x1e\x45\xb1\x85\xf6\xba\x0b\x5d\x43\x0e\xaf\xa2\x99\x21\x79\x19\x5f\x33\x8a\x52\x15\xfa\x6e\xf5\x21\x3b\xee\x6c\x9c\x33\xb6\x99\x10\xf1\xc0\xd3\xb2\xf9\x80\x60\x32\x07\x81\x8a\x18\xe7\xaa\x78\x17\x8d\xa8\xe6\x6c\x0a\x70\xad\x23\xe1\x08\xbb\xae\xab\xbe\xf2\x0c\x09\x8b\x98\x3b\xfd\x76\xd5\xbc\x5d\xf2\x1b\xfc\x68\xb0\x2c\xb1\x50\x34\x6d\xf4\x0b\xf0\x2c\x8c\xe9\x21\x32\xd3\x16\x62\x48\xa5\xc5\x76\xbf\x7f\xe2\xee\xee\x22\xa6\x19\xd0\x99\x1b\x2f\x68\x87\xa5\xb8\x2a\x45\xa5\x9f\xcb\x0f\x4f\x7e\x7f\x3c\x07\x0b\x82\x50\x32\xa2\x9d\x71\xb3\xcc\x31\xc7\xa2\x39\x21\xe2\x5a\xec\x1f\xc4\x84\x3c\x04\x04\x28\x4c\x8e\x35\xa2\xea\x9d\x3e\x90\x2c\x46\xfc\x43\x01\xa0\x9d\xa5\xbb\x99\x96\xec\x40\x0a\xea\x55\x49\xd1\x61\x5e\x96\x65\x9e\x15\xaf\xa3\x5e\x5b\x90\x26\xc6\x41\xcb\xb2\xaa\x45\x95\x1d\xf7\x96\x2a\x1b\x67\x6c\xd7\xba\x0e\x2a\xe0\x24\xe8\xd1\xba\x3d\xd7\x1d\x05\x15\x86\xd2\x03\xb1\x1a\x38\xdc\x1c\x0b\x75\x5e\x36\x02\x05\x0c\xf1\x51\x87\xd2\x17\x67\x40\x13\x82\xdb\x3d\xe2\x58\x90\xa3\xea\x5e\x7c\x9c\xfa\x67\xd4\xc6\x4a\x34\x08\xad\x1f\xcb\x66\x5c\xe4\x03\x88\x15\x92\x70\xed\x54\xb9\x3f\x1c\x1b\x58\x96\x7b\x2f\xf4\x30\xbe\x30\x68\xaa\xdd\x4b\x38\x1e\x7e\xfa\x4e\xa1\x99\x6d\x07\x0c\x51\xd2\x39\xd2\x5d\x74\x30\x03\xe4\x02\xa3\x18\x56\x20\x73\x51\xbb\xf7\xfa\x06\x5d\xf4\x6a\x02\x9d\x4a\x97\x59\x5f\x5e\x2a\x62\x9a\x90\x51\xa4\x78\x73\x8c\xd9\xa0\x31\x09\x7f\x53\x56\xb6\xcd\x7f\x7e\x23\x30\x84\x87\xc8\x5c\x29\x33\xfd\xc7\x8c\xfd\x34\x24\x91\xf8\xa8\xe6\x68\x75\x58\xb3\xe2\xae\xe8\x41\x8a\x86\xa4\x42\xe8\x41\x4e\xf9\xac\x72\x6a\x22\x26\x11\xfe\xb8\xcf\xa6\x24\x45\x26\x32\x22\x0c\x3c\xda\x4c\x7b\x4e\x6a\x6a\x28\xe7\xc4\x0c\xc0\x84\x16\x67\x6d\x5b\x71\xe6\x9f\x82\xc9\x04\xb7\x16\x04\x5a\x78\xe9\xea\x01\x00\xd2\xf0\xc8\xca\x3a\xd6\xae\xc2\x8b\x98\x76\x7b\xc6\x2f\x7d\x75\xc3\xb5\x75\x55\xaf\x00\x6e\xb3\xbd\x9f\xa0\x26\x56\x44\x3a\xe0\xde\x3d\x98\x06\x95\xad\xee\xc6\xb3\xc4\x24\xc4\x20\x7d\x89\xe8\xc0\x3f\x53\x98\x8e\x49\x52\x82\x9c\x1c\x9b\xc5\xfd\x2a\xd8\x2d\x17\xde\xa0\x98\x34\x14\x04\x86\xcd\x11\x03\x16\x65\x6a\x52\x12\xdb\xf6\x59\x6c\x68\x39\x5d\x36\x7b\x26\x8d\xac\xbe\xfa\xae\x29\x8f\xc8\x1b\x36\xbb\xe1\x18\x11\x33\x6c\x0c\x43\x7a\xc0\x3b\x55\x0e\xd3\xc8\x46\x24\x9a\xd9\xf4\xdb\x48\x51\x69\xfc\xb0\x42\x31\xac\xab\x54\xa2\x69\xe7\xdc\x53\x01\xeb\xed\xc3\xe4\x85\x08\x63\xdb\xb8\x32\xdf\xcf\x5b\x3f\x1d\x9b\x73\xde\x05\x9f\x5f\x36\x3a\x52\x5e\x68\xfc\x0b\x4a\x3c\xa3\xb9\x61\x56\x48\x6a\x55\x74\xca\x31\xd4\x68\x11\x63\x39\xea\x58\xb7\xdb\x59\x9d\xe9\x4e\x9b\xa9\x1b\x01\x89\xad\x9e\xe2\x02\xd9\x69\x50\xb9\xa8\x60\xd7\x88\x5f\x59\xf1\xba\x6b\xca\x72\x97\x97\x9d\x07\x6f\xc0\x08\x2c\x38\xec\xbc\x1e\xd9\xb0\x42\x65\x4c\x12\x21\xe5\xa0\x4b\x3e\xd5\x57\xa7\xc9\xb2\x1b\xbf\x70\xa3\x63\x6c\xb4\x2e\xca\x27\xe3\x55\xf1\xdc\xe4\x62\x41\x10\x6b\x74\x0d\xcb\x03\x14\xab\xd7\xb3\x20\xd6\x8f\x4a\x3b\xd2\xb4\xd6\x84\xaf\x9a\xb7\x1f\x65\x7e\xdc\xb7\x76\x45\x8f\xb9\xf2\x59\x10\x86\x04\x57\xb9\x2e\x9f\xcb\x3c\xbf\x82\xdf\x12\x1b\x8f\x56\x01\x0b\x42\xc6\x22\xd7\x25\x80\x40\x4e\x2b\x2f\xeb\xef\x37\x14\x32\x4a\x3b\x25\xc1\x07\xe8\xfe\x0e\x89\xad\xd5\x96\x45\xd3\x25\xc1\x58\x40\x42\xe1\x69\x95\x1e\x4b\x0d\x83\x1e\x5b\x16\x10\x46\xd0\x7f\x76\xb7\xef\xba\x67\xc7\x0f\x43\x84\x00\x67\xab\x1f\xe1\xb3\xf1\xb1\x56\x59\xdc\xe9\xee\x34\xd2\x60\x27\x45\x66\x53\x2d\x97\x53\x5d\x2c\x88\x68\x8c\x2e\xc1\xfe\x98\x93\xf6\xd9\x26\x3c\x2e\x2c\x88\x52\xbb\x36\x5c\x93\x4f\xd3\x53\x8d\xfa\xab\x51\xa9\xd1\x2f\x2c\xe0\xb3\xd9\x56\x42\x83\x65\xd5\x74\x47\x39\x8d\xfc\x56\x81\x3b\xf2\xba\x2c\xf3\x4d\xa7\xad\xc4\x02\x0e\xb6\x25\xa9\xab\x50\x88\xe2\x6c\x91\xfd\x6b\xfc\x06\x62\x66\x2b\x79\xcf\x58\xa4\x74\xdd\xbf\x45\x93\xfd\xfb\x38\xae\x2e\xb2\x20\x8e\x39\x6e\xdf\xfb\x4e\x3f\x7b\xe8\xcb\xb1\x20\x11\x80\xb8\xcf\x35\xd9\x0e\x33\xb4\x2c\x48\xb4\x46\xa2\xf6\xa7\x5c\x2f\x45\xf1\x97\xe8\xf9\x68\x58\x90\xca\xc0\x29\x0a\xb4\xeb\x18\xdb\x68\xb3\xe6\x74\xa7\x3f\xfd\x00\x11\x1a\xe0\xc3\xdd\x6b\xb8\xee\x58\x20\x49\xa8\xba\x00\xf2\x70\x6c\xae\x87\xf0\xa4\xf1\xcb\x57\x51\xc2\x85\xd7\x88\xee\x37\x74\x16\x28\x9d\x60\x4d\xe0\xbd\x6c\xa0\x9e\xba\x29\x2c\x50\x26\x41\x8a\xc2\x36\x12\x5e\x7f\x5b\x6c\x56\xa4\x8d\x85\xef\x9e\xae\xfd\xef\x75\x12\x2a\x27\xeb\x89\x82\x57\x67\xc1\x17\x0b\x80\x04\x2a\xf4\xcd\x64\x63\x6f\xda\x8f\x50\x11\x19\xb4\xe4\x76\x37\x07\xda\x02\x43\xb1\xbf\xb2\xcc\x11\xca\x36\xff\x7c\xa0\x15\x4a\x1f\x99\x4c\x74\xaf\xc7\x10\x81\x8c\x61\x0b\x9b\xf8\xb0\x45\xc2\x59\xc3\xc7\xc2\x20\x25\x98\x9d\xb0\xb5\x3f\xef\x07\xb1\x30\x30\xb1\x8f\x69\xb1\x10\xee\x59\x7e\x59\x48\x8c\xc4\xb3\x77\xa2\x7b\x17\xce\x1c\x31\xeb\xfd\x8b\xd6\x5d\x97\x39\x6c\xdc\x04\xf1\xb3\x3e\x64\x34\x11\x0e\x24\x73\x68\x4a\x4f\xd0\xd5\x1d\x15\x02\x29\xf7\x94\xee\x12\x2c\x2c\x8c\x43\x5b\x8b\x7a\xc8\xf2\x3c\x2b\x0b\xab\xf7\x34\x9c\x76\x61\x1c\xd3\xc0\x61\x4c\xda\x88\x70\x48\x68\x82\x7b\x64\xe4\x07\x26\xae\xef\x75\xa1\xc5\x1e\x46\xa7\x48\x69\x98\x42\xff\x51\xca\xea\xe4\x03\x14\x3f\x42\xf0\x00\xa1\xc0\xd8\x0a\x71\x0f\xa2\xa3\x9a\x65\xa1\x48\x6c\x0b\x4d\x2d\x72\xb8\x94\x29\xf7\x43\x75\x80\xdd\x63\x59\x8d\x2c\xd5\x7f\x75\x95\x08\x16\x0a\x10\x44\x0f\x35\x23\xcf\xf1\xd7\x7e\xa4\xa1\x98\x18\xd6\x3e\xcb\x5a\x56\x23\xfc\x0e\x0b\x65\x9c\x42\xdf\x62\xf4\xd7\xd1\x13\xed\x6d\xcb\x59\xd3\xc2\x42\x29\x2c\x54\xdb\xa6\x5b\xbd\x08\xbc\xc5\x15\x76\xd2\xe3\xe3\xbb\x90\x32\xf6\x20\xfe\xbb\xe2\xbd\xcc\x14\x7c\x13\xf5\xdb\x44\x0d\x95\x85\x9a\xa5\x64\xc8\x4e\x88\x42\xd4\x5f\xc5\x7c\xed\x4f\x0c\xa6\x70\xac\x72\x9e\xf5\xe6\x26\x1d\xa5\x2c\xd4\x92\x72\xd9\x3d\xe2\xf5\x9f\xe3\x55\x16\x02\x27\x38\xd1\x9c\xba\x2f\x72\xa4\x1e\x75\xd6\x20\xd6\xb3\x9d\x19\x43\xd4\x2d\x0b\x21\x09\xd1\xe5\xde\x3e\xc3\xe7\x60\xd7\x0a\x4d\x14\x27\xa4\xb3\x09\x65\xb5\xb3\x49\xd0\xec\xb8\x3f\x13\x97\x61\xa1\xa1\xa1\xe8\xa8\x77\x0a\x93\x9d\x67\x92\x2f\xe3\x05\x58\x68\xa4\xc4\xa9\xe1\xb9\x7f\x71\xdd\x20\x2b\x65\xf6\x5a\x88\xe6\x58\x5d\xe4\xbb\xf8\x6d\xe6\x66\x60\xba\x42\x03\x21\xe6\x7a\x6d\x55\xf4\x4b\x93\x41\x82\x38\x45\x5f\xca\xc9\x7f\x58\xb5\x96\xbb\x33\xe4\xeb\xf8\x41\x48\x18\x44\x88\x4f\x43\x2e\x71\x64\xf2\xb1\x72\x95\xde\x7e\x90\x90\x9a\x38\xee\xde\x53\xd3\x29\x44\x4c\x1a\x12\x18\x09\x41\x3a\x9d\x99\x36\x92\xf0\x64\x2c\xb3\x93\x86\x84\x26\xc0\xfc\xf6\x6d\x05\x50\xc8\xf2\xc3\x5f\x8c\x08\x4d\x86\x54\xd8\xf3\x48\x4c\x37\x38\x92\x09\x12\x11\xe5\x99\x4f\x28\x32\x42\x15\x50\xd3\xcb\xe1\xba\xbb\xb0\x65\xb1\x72\x89\x6d\xb8\x17\x6e\x89\x71\xab\xbd\x6d\xdb\xf7\x70\x1e\xaf\xab\xf2\x50\x65\xd0\x88\xea\x74\x7d\x01\x5f\xcb\x08\x33\x94\xcc\xe3\xb1\x2f\x41\xb0\xdd\x0f\xb9\x4a\xd0\xb4\xdc\x2d\x9f\x2c\x29\xcb\x3f\xc1\x9b\x32\xc2\x4d\x8c\x4f\xb8\x7e\xbe\x5b\xae\x76\x8b\x9b\xed\xea\x79\xb7\x79\xba\xd9\x76\xa1\x05\x23\x71\x90\x72\xab\xac\xd4\xa9\xa7\xff\xdf\xe6\x15\xdd\x19\x93\x34\xc4\xe4\x09\x5c\x40\x30\x31\x92\x28\x89\xb7\xe5\x5c\x67\x8f\x3b\x7d\xee\xa5\x54\x18\x49\x0c\x78\x09\x9a\x0d\xa8\x63\x05\xd8\xb4\xd0\xc5\x32\x8c\xa4\x81\xc1\xf2\xe0\xa1\x35\x04\x3b\xb2\xeb\x25\xaa\x18\x49\xdb\x50\xa7\x33\x46\xe8\x84\x0d\x8d\x02\x49\x99\x40\x15\xfc\x85\x10\xb3\xa2\xf0\x67\x55\x57\x46\xd2\xa4\x6b\xd3\x59\xe4\xb9\x15\x5e\xc5\xad\xa0\xef\x9a\x1a\xbd\x8f\xae\x8d\x8a\x11\x11\x98\x04\xfc\x7e\xda\x40\xf5\x2e\xf2\x65\x09\xc6\x64\xaa\x9d\x62\x97\x9b\x71\x26\xef\x55\x86\xd6\xb8\x1b\x71\x54\xd0\x74\x7c\x1a\x1b\x50\xdd\x4b\x93\x44\x22\xd5\xdb\x9b\xa8\x7f\x4e\xd8\xba\x18\x91\x69\x80\x89\xba\x8d\x2a\xab\x31\x30\x6c\xf8\xb8\xe3\xa7\x96\x2a\x8c\xdb\xa7\x5e\xd5\x75\x1b\xa3\xf9\xb2\x3b\x23\x2a\x60\x5e\xe2\xfb\xb1\xdd\x32\x55\x59\x55\xa0\x9a\x6b\xa8\x71\x4f\x6b\x63\xac\x43\x59\x35\x96\xdd\xad\xbb\x3f\x15\x06\x21\xb8\xd0\x60\x6c\x74\x88\x0a\x43\xe1\x5c\x94\xa1\x58\x62\x32\x6f\x49\x88\x8a\x2c\x53\x7c\xfd\x56\x1e\x3a\x76\x18\x7f\x2c\x05\xd3\xeb\xd6\xde\xb9\xf2\xfb\xf4\x7a\x86\x61\x3d\xfa\x9b\x28\xf2\xac\xd8\x82\x2f\x9c\xcd\xbd\x05\xed\x10\x27\xb2\xdd\x26\x1f\xfd\x65\x80\x87\x9e\x58\xf0\x3a\x13\xfb\xb2\xd0\x0e\xd6\x3c\x57\x22\x63\x04\x4c\x2a\xad\xac\x60\xf9\x6b\x67\xca\x6a\x57\x94\x1a\x26\x63\x4c\xc4\x2d\xe9\x73\x56\xd7\x7b\x54\x42\x3e\xbb\x6f\x93\xa4\x36\x54\x3c\xfe\xaf\x70\x70\xcc\x2f\x1d\x93\x28\xa0\x06\xdf\x54\xd9\xee\x52\x1b\x68\xfe\xe3\xf0\x90\x15\x57\x13\x42\x00\x16\x85\x91\xe5\xbd\xdd\x34\x22\xab\x36\x0d\x1c\xae\x41\x89\x93\xe7\xe5\xeb\x52\x6e\x6e\x34\xe1\xd6\x19\xb6\x18\x44\x5b\x60\xad\xbb\x83\xa9\x45\xff\xbe\xa2\x7e\xb8\x87\x02\x96\xd5\x7e\x8a\x6a\x63\x51\x44\xac\x9a\xe1\x7e\x28\xa9\x76\x71\x11\x46\x11\x8f\x31\x38\xb2\xdb\xa0\xbf\x5e\xa4\x85\x89\x3b\x53\xde\x9a\xa5\x75\xeb\xea\x21\xa4\xc8\x0f\x31\x16\x42\xb2\xdb\x23\xd7\x7c\x27\x8e\x15\x92\xb1\x6a\x62\x48\x12\xf7\x0b\x1a\xb2\xc0\xdb\xba\xc3\xde\x9f\x87\x0b\x40\xd0\xee\x41\x9c\xae\x32\xdd\xf7\x71\xb5\x5e\xed\xec\xce\x1d\x71\x65\x8c\x93\x76\x80\xaa\x59\xfd\x9b\xdb\x71\xce\x74\x8f\xf3\x4b\x2c\xe2\x5a\xfa\x60\xd6\x0b\xb8\xcf\x51\x79\x0d\xf2\xbd\x2c\x6a\x7d\x64\x8b\x26\x40\x93\x5c\xaf\x2d\xd7\x9e\x6f\x2e\x66\x51\x2c\x63\x54\x6c\x42\xd8\xfe\x25\xaa\x12\x37\x36\x09\x13\xe5\x58\xad\xda\x68\xfc\xbc\x53\xcd\x8f\x8b\x2c\x95\x49\xa7\x8d\x3b\x39\xac\x49\xe2\xa2\xdc\x87\xac\x78\x10\x3e\x16\x8c\x44\x68\xdb\xcc\x9d\x2f\x34\x8e\x4f\x23\x41\x63\x1a\x77\x7a\x86\xb6\x64\xba\x2c\x6b\xcf\x60\xeb\xd9\xd1\x59\x24\x40\x62\x40\x27\x94\x3a\xee\xb1\xb7\xd7\x5f\x40\x86\xca\x6d\x31\xed\x66\x4b\x18\xff\x63\xf4\x7c\xd2\x28\x4c\xcc\xbc\xbb\x48\x63\xf0\x80\xe3\x17\xa1\xb8\x65\xda\x43\x72\xa4\x65\xe9\x32\xbf\xf5\x74\x54\x6c\xbb\x68\x6b\x40\xac\x96\x6b\xe1\x9f\x0a\xd0\xb1\x48\xc9\xee\xb5\x76\x09\xe2\x89\xbf\x32\xe4\xf8\x72\xbf\xd2\x8c\xe0\x97\xad\x1b\x38\x6c\x3f\xca\x36\x56\x1f\xa1\xa8\x59\xa4\x39\x87\x5e\x8e\x7e\x71\xfc\x74\x1d\x86\x93\xcf\x01\x2a\xc0\xce\x1a\x37\x2c\xab\x90\x16\xef\x9c\xb3\x9c\x45\x26\x80\xd0\x75\xeb\xdf\x56\x62\x86\xaa\xb1\xb7\xc0\x91\x09\xa3\xa4\xf7\x82\x10\x58\xbf\x45\xb1\xcc\xc6\x06\x2f\x33\x5c\x81\xb3\x96\x8d\x06\x21\xf7\xee\xf5\xce\xe2\xc1\xb3\x62\x87\xe2\x20\x3b\x40\x25\xbd\xc9\xf0\x48\x46\x36\x9e\x76\x24\x1e\xf7\xa0\x5f\x7d\xb3\xf4\x0c\x44\x82\xd1\x40\xcb\x78\x40\x0f\x38\x8d\xc2\xdd\xa8\x30\x10\x08\x02\xfa\x75\x52\x4e\x21\x6b\xdc\x49\xc0\x68\x18\x1b\x6c\x3f\xf5\x4c\x2c\x77\xcb\x27\xff\x41\x26\xa7\x12\x96\xb5\xd0\x65\xdf\x47\x4c\x9e\x8c\x12\xa2\x13\xe1\x58\x8f\x37\xa5\x6f\xab\x65\x94\x88\x00\x33\xdd\xad\x89\x38\x1e\x16\x79\xbe\x39\x54\xd9\x54\x15\x83\x51\xa2\x22\x04\x7f\x62\x4b\x8f\x63\x92\xf4\xa7\x88\x42\x86\xdb\xcd\x06\x9a\xab\xe3\xa9\x3c\xce\xef\x1f\x7e\xb0\x88\xc1\xd1\x78\xb4\x73\xeb\xe5\x80\x9e\xeb\xe4\x8b\x9f\x65\x62\x19\x8d\xa4\x80\xb8\xab\xc4\x23\xa9\xac\x07\x61\x8e\xdf\x17\x0d\x0c\x7e\xd8\x5b\x74\x9a\xfc\x3d\x52\x1a\x8b\xa1\x1a\xe7\x72\x2a\xd6\xcb\x28\x65\x29\xb5\x8d\x10\xad\x33\x31\x60\xad\xf0\xc7\x93\x00\xc1\xf6\x4b\x28\x9a\x4a\xe4\x59\x73\xba\xcd\x4c\xb3\x79\xeb\x5f\x04\x35\x81\x55\x89\xc9\x0a\x51\x3c\x8f\x78\x74\xdd\x08\xe6\xd2\xe6\xee\x3d\x17\xaf\xd8\x7c\x3a\xf4\x13\x29\x4b\x02\x4c\xaa\xea\xaa\x6b\x8c\x60\x94\x19\x83\x96\xc1\xc7\x1d\x1d\x1b\xc7\xaa\x79\x43\xe9\xe8\xc1\xa3\xf2\xc0\x0a\x98\xec\x7c\x95\xf3\x8c\xfb\x65\xfe\xcb\xf0\x38\xf6\xa8\xf0\x27\x24\x8b\xda\x66\x4d\x8e\xd5\x9b\x32\x9f\x97\x75\x64\x94\x27\x01\x8a\x34\xac\x4f\x95\xd8\x67\xd3\xa9\xcb\x95\x44\x23\xa9\x3c\xb5\xcd\xe0\x87\xc6\xba\x37\x76\x77\x78\x84\x8f\x6f\xd7\x7f\x92\x60\x16\xf3\xc0\x68\x1c\x11\x9b\x4a\xea\xe0\xaf\x9d\xeb\x3b\xec\xa4\x69\x07\x9a\x38\x19\xbc\x26\x84\x50\x3e\x63\xbc\xb7\x2d\x47\x74\x8c\xfe\x07\x69\x8a\x59\xda\x35\x54\x75\x39\xdb\xb4\xc0\x68\x2c\x34\xd6\x5f\x7a\x1e\x4e\x13\x72\xff\xb2\x63\x50\xd4\xf3\x6a\xce\xe8\xdf\x8e\xee\x2e\xe1\x21\x36\xb3\x6e\x10\x4e\xdf\xd3\x7e\x5c\xda\xb0\xa6\x9f\xeb\x8b\x9e\x2c\x7f\x85\x44\x44\xbe\xde\xf3\x31\x60\x89\xf6\x3e\x09\x4d\x69\x80\x65\xbc\x6b\x78\x17\x9d\x34\x21\xa3\x29\x8f\xf1\x33\x3e\x8a\x7d\xe6\xd9\xa8\xc7\x3a\xe9\x93\x82\x72\xfb\x13\xe0\xb6\x54\xfb\x31\xa5\x42\xfa\x07\x3d\x82\x8c\xa6\x42\x85\xbe\x95\xeb\xf1\x66\x7b\x53\x56\x23\x8a\x87\xb9\xa4\x06\x15\x44\x26\x9e\xd1\x0b\xbf\xc4\x37\x51\xbf\xdd\x40\xa3\x7c\x1d\x80\x4a\x22\x70\xd3\x95\xc7\xaa\xe8\x39\xca\x19\x95\x02\x74\x2f\x66\x8f\x64\x56\x80\xfb\xcf\x64\x3e\x28\x22\x52\x31\x15\xd3\x1c\xf6\x1d\x31\xaa\x34\x35\xb1\x97\xcb\x19\xe8\x67\xba\xc3\x3a\xb2\xb1\xad\x6f\x6d\x58\x0c\x7d\x58\x0a\xa1\x8d\x30\x37\x47\x79\xa8\xc0\x8c\xa0\x2e\x8c\x82\x91\xe8\x47\x5c\x7d\xbf\xf2\x7f\x32\xc6\x0a\x1e\xb5\xa6\xe3\xbd\x6c\x60\xdd\x7a\x26\x23\x07\x86\x05\x81\x8a\x9c\x25\x5b\x5c\x04\xaa\x31\x16\x10\x89\x4d\x70\x48\x9c\xb0\xb3\xa5\x21\x7f\xd7\x2c\x30\x09\x6a\xf2\x15\x62\x3f\x41\x8e\x32\x16\x12\xed\x39\xa0\xb7\x9b\x9e\x8e\xd1\x1f\x8d\x04\x3a\x37\x2e\x45\x0d\xef\x36\x8f\x3d\x39\x05\xb7\xed\x43\x1b\x28\x34\xfa\xed\xdb\xf2\x9c\x20\x8c\xb1\x30\x89\x31\x68\x35\x99\xf7\xdd\x58\xa8\x01\x9d\xba\x87\xb2\x80\xe6\x4d\xb8\x30\x67\x03\x33\xa5\x46\xc6\x48\x14\x1a\x67\x2a\x73\x51\x41\x2f\x23\x31\xf4\x8b\x18\x51\x09\x1a\x88\xfb\xf2\xb5\xbd\x9f\x1b\x91\xe5\x7f\xcc\x55\x5e\x19\x8b\x58\xc0\xc1\x3f\xdb\x90\x5d\xd4\x1f\xe7\x06\x37\xb1\xfd\xb1\x19\xac\xa6\xd6\x3b\xc6\xc7\xc8\xed\xf4\x99\x21\xf9\x6c\xc7\x30\xc4\xca\x29\x14\x13\xa8\xbd\x9c\x06\xe8\x45\xd3\x9d\x46\xb0\xd4\xee\x9e\x6d\xc8\x7f\xac\x2e\x6c\x2e\xe3\xdd\x8a\x45\xca\x2a\x65\x37\x19\x54\xe4\xfe\x69\xdb\x9d\x0d\x42\x4f\xc5\xfc\x52\xfb\x2e\x97\x73\x79\x3d\xc6\x68\xa8\xd0\x8d\x58\xdc\x2d\xbb\x1f\x53\x11\x63\x2d\x78\xfd\x74\xf7\xb8\xdd\xec\xb6\x4f\xbb\xcd\x7a\xf5\xe8\x2b\x19\x8c\x11\x2b\x51\x8b\x15\xde\xee\x8f\x94\xa1\xce\x3a\x56\x05\xd5\x6c\xca\x63\xf4\x59\xb8\xb0\xfc\x5b\xff\xb5\x58\x2f\xfe\xf4\x27\x89\x4d\x82\x25\x80\x7d\x59\x34\x6f\x84\x2a\x5b\x48\xb0\xd4\x85\x7e\x4c\xd2\x3a\x51\x6e\x57\xd8\x35\x1f\x25\x32\xa5\xac\xfe\xfd\xd2\x86\x77\xa3\x77\x9e\x50\x8a\x09\x7b\xa1\xb5\x67\xb8\xf8\xda\x24\xb2\x94\xd8\x1d\x1b\x5b\x95\xf5\x40\x61\x99\xb1\x94\x59\x04\x6d\x7b\x27\x93\xa6\x8a\x4b\x27\x03\x45\xac\xf2\x01\x92\x34\x39\xb2\xbe\x95\xeb\x5c\x9a\x8f\x8d\x98\x0c\xad\x7a\x08\xda\xf2\xa7\xf6\x06\x36\x48\xda\x3a\x9e\xd2\x52\x1a\xe3\x30\x68\xd7\xad\xc1\xb7\xe0\xcd\xf9\x33\x2a\x16\x6a\x9b\xaf\x79\x7f\x87\x62\x07\x16\xef\xed\x0f\xa6\x36\x79\x87\x88\xc0\x3f\xdb\x18\xa0\x4f\xdb\x31\x25\xa4\xe7\xb6\xeb\x10\x9b\x23\xfb\xcb\x94\x0a\x11\x00\x56\x38\x05\xe4\x9f\x90\x0d\x6b\xab\x4c\x69\x16\xf6\xfa\x64\x8e\xa9\x67\x7c\x7b\x9a\xf0\x40\xf7\xb5\x93\xc7\xf2\x19\x8c\xff\xb9\x06\x85\x3c\x20\xb9\x2d\x20\x5e\x2a\xdb\x33\x06\x69\xe4\xa1\xc1\xd7\x9d\x8a\xa4\x3f\xa6\x22\x54\x12\xb8\x3a\xe6\xbf\xa6\x69\x8c\xb9\x53\x41\x82\x2c\xdf\x57\x7f\xf9\x24\x0c\x0f\x88\xa5\xa1\xb6\xe5\x8d\x76\x35\xdd\x94\x15\xb6\x1f\x8c\x55\x25\xe7\xea\xd8\x3c\x88\x4c\xd0\xd3\xd8\xac\x44\x95\x9f\xee\x0a\x55\xee\xe1\xea\x34\x9b\xc3\xe1\x41\x2a\x30\x5d\xe1\xe0\xd4\xbe\xdd\x61\x90\x96\xe4\x81\x48\x71\x62\xeb\x23\xe4\x8b\xa2\x6c\x67\xc9\xb2\x7c\x37\x60\x2e\x38\xe1\x3c\x8c\x62\xd2\x09\xba\x87\xfe\xb9\x42\x19\xa2\x0a\xae\xa3\x3d\xbc\x12\x8d\x7a\xfb\xfd\x1b\xe2\x84\x70\x68\xe7\x4c\x89\xd9\x45\x91\x2f\x0e\x87\xdc\x31\x9c\x6e\xb2\xd7\xe2\xe5\x30\x9a\xab\x9c\x10\x95\xb6\xd7\xfe\x5c\xbd\x3c\x0f\x8a\x23\x9c\xc4\x56\x28\x58\x89\x3c\xf7\x5a\xf9\xe3\xbb\xa6\x89\xc5\xa4\xa9\x66\xe4\x54\x73\x16\xa5\x98\x56\xdb\xb9\x98\x62\xf4\xd0\xe9\xbc\x14\x20\xe3\x0c\x0c\xc2\x90\x71\x1f\xf8\x39\x24\x55\x61\x9c\xeb\x08\x17\x77\x5d\x9a\x66\x29\x0e\xcb\x6f\x37\xfe\x48\x1c\x28\xcf\xd3\xb0\x43\x0a\x1f\x51\xc9\xac\xa9\x77\x07\xa8\x5c\xdc\xe8\x07\xa6\x11\x36\x5e\xa1\x22\x59\x36\x09\xfb\x78\xac\x2d\xc3\xe4\xa1\x82\x83\xa8\x00\x45\x62\x2e\xb6\xdf\x32\x9e\xa4\x96\xa0\x7f\xf3\xb2\xdc\x9e\xf1\x34\x31\x9e\x88\xc0\x4d\xe9\x13\x42\x9c\x91\x75\xaf\x6b\x12\x39\xf6\x64\x2f\x7d\xa2\x78\xb6\x35\x96\x71\x11\x6a\x24\x0b\x7e\x28\xab\xd6\x4b\xf8\x06\x79\x6e\xd9\x07\xfc\x63\xc9\x48\x87\x61\xcf\xb5\xa9\xbd\x94\x40\x97\xc4\xe2\x92\x07\xd8\x4f\xbe\x1b\x60\x01\xbb\xf6\xbd\xf1\xd5\x24\xd8\x5c\x83\xf6\xca\x04\xbb\x02\x3e\x6c\x34\x3e\x9e\x33\x12\x8c\xb6\x8a\x4d\x28\x9d\xad\x77\x16\x92\xbb\x3b\x8c\xbc\x18\xae\x88\x50\x81\xc7\x49\xfc\x84\xcc\xbe\xd3\xae\x54\xc4\x15\x93\x48\xaa\xe0\xf3\x51\x8e\xf4\xee\xc2\x22\xd1\xa1\xed\x92\x75\xac\x01\x3f\xc4\x31\x6f\x66\x39\x5d\x18\xd7\x31\x0f\x1c\x58\xd0\x3a\x56\x13\xe1\xc0\x79\x8b\xc0\x75\xca\xb1\x4e\x78\x2c\x66\x72\x91\x7e\x8c\x01\xa4\x8f\xf0\x99\x47\x0e\x31\xc1\x92\x9b\x53\x78\x73\x66\xa4\x3f\x2a\x85\x27\xd3\x6c\xc3\x37\xbf\xa7\x8c\x2f\x6c\x88\xb6\x1c\x84\xc7\xa6\x7c\x78\xba\xba\xbb\x5f\x0d\x1a\x28\x18\x37\x4c\x22\x6f\xa8\x0f\xa3\x7c\x0f\xc7\x74\x6b\x32\xa9\x44\xb7\xee\xbb\x4b\x6c\xad\x9e\x97\x24\xf0\x24\x2e\x5f\x19\xfb\x38\x60\x56\x23\xe9\x00\x95\x29\x2b\xa7\x89\xb5\x69\x84\xfa\xb5\x6e\xfc\x12\x8a\x89\x14\x08\x9f\x5a\xae\xee\x7f\x9f\xa7\x8d\xa3\x50\x79\xf5\xd9\xed\x9f\x9b\xd9\xe7\x8e\x23\x91\xa2\x83\x78\x95\xe5\xa2\x81\xaa\x2b\x2d\xc4\x94\xa4\x40\x3a\x16\xbc\x65\x59\xe8\xcc\x8a\x6b\xde\x67\xb2\x9a\xb8\x7d\x31\x4d\x63\x0f\x1a\x74\x09\xd3\x91\x50\x0c\x8b\xa9\x02\x41\x7d\x8f\xcb\x98\xfb\xc6\x8d\x60\x24\x88\xfa\x1c\x1a\x12\x78\xfc\xb3\xbc\x55\xcc\xa8\x95\xd4\x40\xc9\xd7\x88\x4f\xcf\x9b\x30\x46\x3a\x42\x80\x71\xb6\xcf\x0d\xe1\x5c\xf8\xa2\xc7\x25\xe9\x4a\x16\xc7\x60\x30\x13\xa9\xf2\xb2\x86\x75\xd9\x8c\x96\x63\x9c\x08\x88\xc8\x00\x09\x2d\xc5\x9c\xdc\x8b\x1f\x0c\x36\x63\xf7\x2c\x74\x76\xdc\x0f\x21\x6b\x2c\x4e\x03\xa9\x2d\x15\x02\x42\x22\xc3\x01\x4f\x02\x8b\xd3\x30\xc1\xc4\xfb\xa1\x51\xc8\x59\xd3\xfd\x28\xa2\x18\xa3\x79\x10\x5c\x7b\xf3\x5d\x3e\xe4\x3f\x1e\xba\x61\x40\xb9\x45\xb9\x5b\x96\x8e\x2f\xb9\x06\x58\x2c\x12\xea\x5e\x4b\xa1\xc7\x6b\x2a\x56\x41\x8a\x08\x7f\xeb\xb5\xfc\x31\xeb\x7d\x7f\xa1\xcf\xc3\x62\xc5\x21\xb1\xe7\xce\xf3\x79\x64\xfe\x59\xcc\x3f\x7c\x11\x0a\x18\xa6\xe8\xdc\x8e\xfa\x1d\xe0\x30\xcd\xb6\xc6\x3a\x64\xdc\x56\x7a\x9a\x06\x26\x1c\x58\x2c\xd6\x49\x88\x65\xb8\x87\xa7\xc7\xc5\xf2\x69\xb5\xd9\x2e\xbc\x6b\x1f\x43\xcc\x13\x27\xa0\x75\x3f\x23\x43\xdd\x7b\x19\xb1\x69\xbd\xf1\x36\x80\xbc\x1a\x06\xad\xb1\x71\xcd\xf5\xa8\x3f\xd0\xa8\xb7\xbb\xc2\x94\x6d\xe0\x1c\x90\x6e\x04\xb7\x04\xa5\x15\x08\xbd\xdc\x5e\x9f\x2f\x87\x24\xa0\x0c\x65\x19\x36\x4d\xeb\xad\x39\x3a\xfb\xb3\x8c\x76\x12\xc4\x56\x31\xe5\xe6\xee\xcf\xd5\xf5\x6e\xfd\xbc\xda\x2c\xee\x57\xbb\x97\xcd\xb5\xe5\x8e\xdd\x61\xc9\xf9\x0f\x3f\x38\x0d\xad\x1c\x47\x8f\x75\xdf\x40\xa1\xd6\x50\x3d\x74\xe8\xe1\x76\x54\x87\xa2\xdd\x20\x99\xd9\xf3\xb0\x18\x3d\x7a\xc7\x49\x20\x98\x0f\x84\x9f\xc1\x55\x3e\xfc\x79\xc2\x24\x40\x1d\xbf\x9d\xb4\x24\xc8\x59\x2f\xa1\xf8\xdf\xff\xf3\xaf\xf3\xff\x38\x0e\x68\x0c\x58\x12\x0a\x82\xf6\x1d\xeb\x65\x3b\x39\xda\x4d\x92\x50\x45\x5e\x21\x6f\xf3\x6d\x41\x18\x1f\xae\x92\x24\x34\x06\xdb\xca\x96\xe5\xe1\x84\x7b\x82\x0f\x28\x7e\x1b\x71\x25\x24\xd0\x98\x13\xed\x15\x9f\x27\xfb\x65\x42\x12\x89\x2c\x18\x07\x71\xb2\x22\x2a\xe3\x17\x12\x31\xdb\xbf\xd9\xfa\x38\xc7\x26\x83\x39\x57\xa3\x3f\x19\x0d\x43\x74\xfc\xea\x53\xa1\x26\x27\xa2\xc4\x4a\xdd\x2c\x8f\x72\x9a\x79\x4e\x68\x64\x50\x62\x08\xe9\x6d\x2e\x9c\x39\x76\x5a\xb2\xd9\xdf\xf0\x64\xce\x49\xd7\x59\x42\x75\x82\x81\x89\x95\x5b\x71\x2a\xdc\xb3\xad\x5b\xa3\x13\x33\x1e\x22\x01\xc9\xf5\xdd\x66\xf9\xf4\xf2\xb8\xdd\x6d\xb6\x8b\xdb\xd5\x6e\xfb\xf3\xc9\x7f\x9c\xd6\xee\x78\x20\xa1\xb6\x90\xee\x06\xf6\xf5\xac\x58\xd6\xf8\xed\x73\x63\xf9\x2e\x77\xf5\x51\xd6\xc3\x5b\x76\xb7\x30\xbe\x93\x98\xdb\x04\x4d\xfb\xaa\x45\xa5\xb7\xe5\xca\x5a\xa8\x3f\x86\x96\x70\x98\x11\xfd\xda\x8c\x24\x71\xa2\x38\xf3\x2d\xa3\xb8\x40\x86\x50\x94\xdf\x38\x2e\x49\xac\x52\xcc\x81\x49\x6c\xf2\xb0\x45\xad\x11\x66\x2c\x89\x95\x6d\xf9\x76\xca\x42\x1b\x54\xc6\xc0\x48\x02\x33\x25\xe7\xdb\x4b\x12\x6b\x41\x5c\x0c\xbb\x16\xea\x97\xf0\x34\x35\x67\x0f\x95\x0c\x37\xc7\x24\x11\x29\x72\xa9\x56\xc7\xfa\x2d\x6b\xa0\x6e\x32\x35\x24\xff\x60\x49\x1a\x4a\x5c\xb5\x96\xb6\xa2\xab\x84\x61\x9a\x73\x10\xd5\xb4\x77\xd2\xad\xc7\x34\x49\xbc\x81\x43\x2e\x89\x0a\x2a\x4b\xbe\xd7\x3d\x9f\x50\x21\x22\xc2\x3c\xf5\x64\x7d\xe7\xf2\x7d\x93\xd9\x2b\x09\x20\xa1\xc4\xbd\x35\x29\xf7\xd9\xbf\x8f\x99\xf7\x47\x13\xc9\x6c\x8a\x64\xd3\x54\x20\xf6\x59\x73\x72\xcd\xd7\xe3\xc5\x21\x63\x00\x2f\x74\x92\x8b\xd7\xaf\x89\xdb\x58\x22\x05\x45\x28\xcc\xbe\x7d\x40\xff\xd2\xb7\xed\xce\x90\x9f\xda\x17\xdb\xe7\xf7\x7a\xfd\x4c\xf7\x53\x15\xc4\xe8\xba\x1b\x68\xd4\x1b\xa6\xcb\xaf\x4e\x77\xba\xf5\x96\xd7\xad\x53\xdb\x46\xa8\xfb\x6c\x3e\x4b\x9e\xa8\x28\x40\x18\x21\xe2\x15\xfc\xd6\x9f\xe8\x48\xa0\xe3\xae\x8f\xfb\x43\xbb\xb8\xff\x38\x6f\xac\x62\x89\x16\xc6\x23\x45\xad\xfa\x58\xf6\x37\xe8\x6d\x79\x3d\xa8\x18\xbb\x91\x46\x5b\xa6\x2e\xdc\x81\x0d\x12\xf8\x23\xdf\xea\x20\x18\x4e\x8c\xa1\x68\x24\x30\x3a\xdf\xbe\x65\xf5\xb8\x4b\x8d\xa5\x01\x23\x88\xce\xb4\xe6\x1c\x9f\xce\x95\xee\xbf\x79\x2f\xdc\xed\x61\xbe\x52\xef\xff\xf5\x77\x9c\x06\x71\x9a\xf6\x50\xb2\xdf\x68\x77\xb3\x34\xe4\x04\x91\xa8\x4f\x3f\x57\xc3\xa9\x99\x86\x71\x80\x8e\x05\x82\x8d\xb2\x4e\x8f\x6b\xc2\x9f\x31\xef\x5a\x4c\x2f\x11\x4b\x61\x7a\x9e\x0f\x1b\xac\x74\xc7\x34\x0c\x04\xf1\xfc\x4c\xf5\xec\x66\x9e\xb2\x61\x46\xef\xc9\x9f\x40\x5b\xdf\xa8\x35\xf1\xf5\x2b\xf6\x48\x62\xd1\xc9\x5f\x80\x30\x69\x09\xd4\x72\x10\x95\xff\x84\x33\x15\xfc\x34\x0a\x62\x84\x1a\xb4\x41\xd2\x18\x7d\x16\x4e\x2e\x19\x25\x94\x59\x9f\xa7\xcc\xf3\x65\x95\x35\x99\x12\xf9\x75\x9f\x4a\x4a\x69\xc0\xb8\xe9\x30\xed\x0a\xee\x8a\xd5\xe7\x1c\xcb\x00\x4b\x29\xb3\xe8\xf6\x57\xbb\xb1\x4c\x33\x4e\x29\x15\xa1\x6d\x06\xc8\xde\xe1\x76\xd2\x55\xdd\x1e\x25\x96\x41\xd5\x4e\x17\x6c\xcf\xac\x67\x4d\x87\xff\x81\x24\x56\x59\xec\x79\x85\x8a\xe7\xad\xcd\x78\xde\xee\xa8\xbf\x71\x26\x52\xec\x4c\x43\x4a\xcf\x5b\xb1\x87\xdb\xcc\x5c\x9a\x38\x4c\x72\x04\x80\xdd\x66\xfb\x3c\xeb\x4e\x60\xec\x6c\xfa\xf7\x51\x38\x5a\xa9\x6b\x68\x03\xb9\xf6\x9d\xab\x12\xea\x47\x68\xbf\xb2\xa8\x32\x51\xaf\x45\x25\x5e\xf6\xe2\xb1\x7c\x17\x4f\xc7\xf7\x4c\x97\x55\x26\xd6\xa5\x86\x6a\x03\x4b\xa1\x45\xdd\x54\x1d\x62\x38\xe5\x71\x10\xa5\x1d\x2b\xd6\x83\x27\xfa\x9a\xf7\x85\x52\x9e\x28\xe4\x5d\x1c\x5a\x8d\x1f\x76\xee\x5d\x78\x96\x98\x9b\x74\xd0\x8b\x04\x43\x55\x5c\xbf\xad\xa6\x71\x9a\x22\x6c\xdf\xbe\xec\x05\xb6\x51\x8e\x84\xac\x66\x27\x7f\x42\x12\x94\x5e\xb0\x78\x97\x1b\x91\xd7\x30\xd8\x11\xd2\x84\x81\x17\x4e\x1f\xd0\x26\xb0\xb4\x35\x63\xe0\x85\x8b\xbe\x67\x79\xd9\x1d\x48\x35\x52\x3c\x14\x59\x31\x75\x47\xd2\x14\x8c\xe5\xd2\x2f\xaa\x8b\x65\xd1\x54\x44\x31\x73\x3e\xf1\x40\x7c\xf0\x82\xb0\x07\x4b\x85\xb2\x2d\x12\xf2\xf8\x75\xc3\x32\x4b\x05\x18\x6a\xef\x4c\xfd\x9a\xb4\x72\xb1\x54\x98\x08\xd9\x11\xb3\xda\x37\xc5\x77\x60\xeb\xf1\x40\x19\xa6\x91\xf0\xdb\xa8\x2a\x2b\xfd\x85\xc6\x07\x4b\x65\xac\xc1\x0a\x97\x15\xf5\x71\x0f\xcb\x32\x2b\x6e\xca\xaa\x9d\x53\x17\xbe\xb4\x12\x4a\xba\x0e\xf4\x87\xac\xf8\x09\x99\xab\xb7\x4d\xde\xa4\xe6\x69\x62\x5b\x34\xb0\x3b\xfd\xbe\xac\x9b\xd1\x5c\xd0\x69\x84\x0c\xa4\x1e\x44\x86\xe9\xf7\x8f\xf2\x63\x36\x4d\x9a\x6a\x69\xac\x23\x9f\x99\x66\xf7\x35\x3c\x2d\xd5\x60\xd0\x5f\x5c\x5c\xfd\xb5\xd9\xf8\xcb\x81\x12\x5e\xa3\xd0\xe6\x70\xee\xf4\x85\x94\x6c\x6a\x22\xc0\x6a\x3c\x36\xdf\x4e\x9e\xca\x24\x02\x69\x14\x6e\x6f\x96\xbe\x88\x97\x9a\x54\x63\x7e\xd6\x46\x36\x96\x13\xd7\xb2\x9d\xcc\x9e\x5f\x04\xa1\xf4\x74\x0b\xcb\x76\xfe\x4f\x7a\xa8\x3b\x59\xed\xe1\x3f\xbe\x3e\x29\x02\x66\x77\xce\x9b\x65\x8f\x2d\xd8\x0e\x58\x2c\xe7\xbe\xb1\x20\x24\x41\xfc\xbb\x5b\x94\x63\x67\x4e\x10\x61\x35\x46\x0e\xc7\xaa\x86\xae\x60\xe1\x0f\x2a\xe9\x49\xb8\x9d\xfc\xc4\xf8\x8d\x08\x62\x2c\x01\xaa\x6a\xb7\x4e\x64\x3f\x00\xa8\x9f\xe6\x95\x83\x99\x88\x88\xc2\xb9\x79\xbb\x7a\x58\x7e\x5b\xdc\xf9\xa4\xbb\x88\x84\xc6\xd9\xd0\x49\xc4\x5e\x95\x97\xd2\xa5\x82\xb2\xd8\x4b\xb1\x3c\x43\xad\x8e\x73\xfe\xa6\x60\x14\x90\xdc\x63\xe3\x33\x06\x6d\x98\x80\x95\xaf\xff\x6c\xcd\x62\x56\x8e\x60\x19\x82\x19\x8a\x7e\xa6\xe7\x62\x75\xb8\xcb\xf3\x2e\xb6\xd6\x8c\xce\xdf\x16\x67\xd2\xca\x69\xbc\x81\xfa\xf5\x0e\x6f\x15\xd4\x87\xf2\x5c\xf9\xda\x8f\x16\x31\xae\x22\xd1\x5a\x5a\x12\x58\xf5\xa0\xee\x93\x70\x6d\x49\x77\x6a\xc8\xf3\x87\xd3\x95\x28\x44\x31\x09\xaa\x45\xac\x03\x5c\x5f\x98\x96\x86\xe3\xfe\x06\x29\xae\x2c\xb0\x43\x0d\x10\xb2\x22\xd6\x16\x1f\x77\xa8\x7a\x50\xc2\x18\xf3\x25\x92\x08\xd0\x68\x61\x84\x99\x86\x93\x2b\x25\x69\x8a\x61\xd2\x9b\xc8\xfb\xb3\x26\x8a\x45\xce\x6d\xdd\x43\x5d\x67\xcb\x72\xbf\x3f\xb6\x11\xf6\xfc\x9c\x4f\x13\xcb\x73\x94\x15\x66\x00\xad\x13\xa9\x14\x89\xf6\xca\xa1\x79\x6e\xf9\x1f\x26\x97\x4f\x95\xb1\x4a\x80\xd9\x67\xf3\xb6\x05\xb1\xef\x05\xb0\xfc\x69\x70\x55\x74\xe8\xa1\x6f\xc7\xbd\x28\x36\x8d\x28\x34\x86\x52\x83\x84\xfa\x14\x6b\x71\x9e\x67\x14\x82\x46\x34\xf1\x88\x8f\xe6\x98\x8b\xac\x82\xdd\xb2\xdc\x1f\x1a\xd8\xa5\x93\x3b\x13\x8c\x8e\x7b\x68\x87\x1b\x9c\x90\x11\x45\xd7\xc2\x96\xeb\x7a\xe0\xda\x68\x0a\xcd\xda\x01\x21\x19\x8d\xad\x1e\x0a\x76\x1e\xc2\xe3\x71\x4f\x7e\x76\xb5\x14\x21\x93\xd4\x53\xac\x20\x51\xe7\xe8\x01\x24\xc4\x96\x2f\xb6\x46\x8e\x7a\xd1\x25\x31\x84\x92\x01\xb6\x3e\xde\x3f\xdd\xee\xae\xa0\xf9\x79\xae\x15\x30\xb9\x0d\xa5\x2c\x07\xeb\xda\x92\x4a\x99\xaa\x75\x29\x8e\x0a\xdb\x4b\x06\x4b\x4d\x69\x12\xf4\x56\x1d\x93\x3c\x37\x55\xb9\x7f\x42\xce\xf5\x9b\x72\xd2\xf9\x22\x74\xc0\x10\x51\x3e\xe8\x58\xf8\x1b\x8a\x2f\x28\x2d\x98\xd0\xa1\xfd\x28\x16\x85\xe0\xdc\xf9\xaf\x03\x25\xa1\x25\x21\x3e\xec\xb8\x6a\x1d\xc3\x42\xcf\x77\x8e\x08\x0d\xd6\x43\x54\xa2\xd0\x43\x41\x56\x26\x80\x33\xe9\xaa\xea\xb7\xfd\x5e\x01\x32\x95\xf1\xa0\x0e\xd1\xf5\x90\x75\xa5\x08\x61\x38\xc7\x70\xe9\x5b\xf9\x71\x5f\x16\xaf\x77\xf5\x75\x56\x1f\x8e\xad\x57\xf4\x0e\x22\xdf\x34\x59\x9e\x3f\x1f\x91\xce\x75\x3c\xa5\x64\xc0\xed\xc2\xbf\x7b\xfc\x3e\x6a\x97\x94\x41\x6a\xf5\x30\x91\x15\x1d\xef\xde\xaa\xa6\xb9\xc3\x61\x9a\x22\x34\x08\x0a\x3d\xf5\xd3\x46\x0f\x2b\x43\x08\xfd\xba\x6d\x7e\xaf\x49\xe4\x7e\x44\x08\x51\x7d\x01\x5a\xec\x48\x30\x9a\x73\x92\x10\x9b\x29\xf2\x9c\xb6\xd3\xd3\xfa\xc8\x5b\x46\x5c\xe0\x9a\xa8\x1b\x91\xc3\x90\xd2\x81\xc9\x28\x26\x68\x01\x46\x85\x5b\x7f\x4c\x87\x18\x49\x37\x50\xec\x45\x95\x95\xc5\xa0\xb2\x28\x69\xc0\xd1\xcf\x6b\xef\x0c\xff\x3e\x7e\x60\x1a\x2a\xcc\xa0\x2d\xbe\xd3\xe4\x37\xec\x5f\x4c\x52\x21\x10\x67\x0e\x3a\x6b\x1e\xb2\xbc\xf5\xb2\x8a\xcb\x08\xae\xe9\xbf\xb3\x67\x34\xb1\x8e\xdc\x34\x7c\x85\xa2\xb1\x30\x50\x5b\x3f\xbd\x3a\x59\xa6\x86\xd9\x69\x29\x59\x94\x60\xd5\xbf\x80\xcf\x06\xd3\x73\x43\xd2\x26\x26\x59\x92\x22\x6e\x6d\xdf\x6e\x01\x7d\x0b\xa4\xe4\x94\xe0\xf3\xee\x6a\x68\x2c\xa7\xab\x2f\x54\x77\x2b\x56\x72\x10\x89\x95\x69\x9d\x96\x2e\x65\x1c\x58\xc2\x2b\xcc\x2f\xd8\x58\xd0\xa2\x8e\x2e\x35\x94\x9d\x97\x8c\x65\xcc\x92\xb0\x53\x42\x19\x75\x55\xca\x38\xb1\x0a\x52\x79\x89\x0b\xb9\x7d\x0b\xe1\x42\xeb\xf9\xc6\x8c\x09\x12\xe6\x1f\xff\xbf\xee\x5a\xb6\x23\xec\x11\xe4\x31\x17\xa3\xd5\x94\xc4\x56\x1a\x72\xd3\xbc\xde\x94\xc7\x0a\x6f\x74\xd5\xef\xdd\x32\x85\x94\x90\x9e\x96\x0f\x0a\x84\xff\x35\x62\x7f\x98\xbc\x2e\x11\x59\x4c\x17\x7a\x7d\x2e\x7a\x9c\x35\xf8\x52\xa6\x21\x27\x7e\xa4\xd0\x17\xba\x62\xa5\x54\x51\xe8\x6a\x8d\x8f\xcb\xcd\x99\xb4\x6a\x3b\xc0\xea\x92\xfb\xea\xdd\xd5\x69\x1e\x08\x25\xa5\xe6\x98\x75\xb6\x70\x8a\xbe\xd7\x72\x72\x5b\x10\x4b\xcb\xd4\xf2\x0b\xc6\x94\x94\xf3\x5b\x81\x8a\x63\x74\x8e\x2d\xa9\xd4\x1a\xaa\xef\x43\xdc\x8c\xd4\x21\xe3\x2e\x97\x70\x9d\xd5\x2a\x3b\xe4\xf0\xe3\xac\x33\x47\x6a\xc7\xc8\x27\x8f\x27\x4b\xa2\xf9\xcf\x14\xf8\xdd\xaf\x21\x50\x28\xc8\x8b\xf5\xc8\x75\x55\x7e\xce\xf3\xd9\x8f\x9f\x13\x42\x81\x2e\xce\xde\xf6\x46\x9d\xb5\xb8\x4c\x11\x90\x12\x24\xb5\x71\x51\xfb\x51\x6d\xa9\xf9\xac\x0b\x5c\x82\x34\x68\x98\x1c\xbb\x18\xce\x31\x0b\x5f\x1a\x8a\x7e\x33\x69\x62\x81\x75\xdb\xe5\x7a\xd3\xf5\x05\xf5\x07\x45\x8a\xbb\x1b\x5e\xc9\x4e\xd3\x51\x06\x4d\x1a\x1d\x72\xd1\xf1\xd8\xdc\x97\xa2\x43\x7c\xaa\x80\x50\xa7\xff\xd5\x58\xa1\x9b\x89\x16\xde\xac\x11\x50\x01\x95\x06\x86\x22\x1a\x20\xf6\xa3\x0a\x80\x8b\x39\xc6\xff\xb8\x1f\x87\x81\x05\xa2\xdb\xf8\xaf\x41\xc9\xcc\x39\x49\x42\xa6\x42\xa2\x71\x07\x7b\x3a\x40\xb1\x78\xfc\x73\x06\xdb\xa0\x42\x46\x9d\xa3\xdb\x9e\x2c\x5b\x97\x65\xbe\xd2\x59\xb3\x23\xa3\xb9\xac\x42\x2d\x31\x63\xbb\xac\xca\xba\x3e\x88\x53\x3d\x5c\xcd\x8a\x24\x76\x11\xb6\x66\xba\x7c\x6f\x06\x08\x95\xb9\xde\x2b\x15\x81\x44\x51\xd5\x17\x29\x7f\x67\x10\x14\xe5\xf6\xfe\xb2\xfa\x09\x55\xde\x16\xc5\x89\xcc\x67\x05\x14\xa3\x96\xac\xba\xf5\xb3\xc5\x71\x00\x0b\x55\x8c\xf2\xc8\x8c\x2a\xca\xf9\xc9\x99\xff\x6d\xa7\xe8\xc0\x14\x8b\x39\xc6\x96\xeb\x1f\xdb\xdd\xdd\xe3\x8f\xdd\xf6\xe9\xfb\xea\x71\xd3\x1f\x95\x58\x8a\xb8\xba\xdb\x5e\xdf\x3d\xae\x9e\x9f\xba\x03\x49\x8a\xd4\xf5\xba\x0d\xa2\x51\x02\x70\x51\xc9\xac\xa9\x7c\xdb\xe8\x0c\xe9\x95\xff\x25\x68\xe8\x53\xa5\xb7\x62\x0f\x17\xb4\x5c\xfa\xf0\xc7\xa7\x96\xdd\x19\xb8\x50\xe8\x95\x1c\xba\x3a\xf3\x1a\xaa\x87\xb2\xe8\x2a\x70\x2a\x16\x96\x2e\x12\xe1\x7b\xf6\x42\xdf\xe1\xb4\xf3\xed\x0e\x8f\x25\x66\x65\xdd\xe0\x24\xe4\x96\xdc\x0e\x15\x33\x5d\x7a\xe3\x77\x3e\xca\xf4\xe6\x26\x73\x3d\xe1\x01\xfa\x70\xd0\xbc\xed\x5c\xd3\x7f\x77\x39\x41\x3c\xae\xe3\x6d\x32\x75\x13\x19\x63\x01\xa0\xe3\x3a\x3b\xca\x3c\xab\xdf\xa6\x85\x59\x95\xc6\x96\x9b\x73\x7b\xb7\xf0\x67\x4d\x95\xc6\x36\x70\xfc\x7c\xbb\x97\xc7\x3b\x5f\x8c\x55\x82\x08\x34\x48\x3f\x56\x9b\xed\xdd\xe3\xed\xee\xee\x71\xbb\x7a\xfe\xb1\xb8\xef\x8e\x47\x0c\xc1\xb6\xdb\x61\x98\x7d\xf6\xd8\xe3\x1b\x10\xc0\x03\xd5\x15\xeb\xcf\xda\xe1\x94\xe4\x1c\x6f\x70\xf9\x56\x95\x45\x59\x2f\xcb\x0b\x40\xd3\xf3\xf9\x2c\x21\x0e\x3b\x21\x35\xdb\xdd\xb2\x2a\xb4\xdd\xaf\xc7\x23\x95\x4e\x7c\x23\x2b\xc6\x1c\xc8\x62\x8b\x7a\x4c\x1d\x68\xbe\xbb\x1f\x65\x64\xe0\x8b\xe5\xcb\x4b\x6c\x3f\x4c\xe9\xd0\xd2\x6b\x98\xea\x52\x1b\x9c\xd2\x91\x41\x5d\x82\xba\x01\xd8\x77\xf3\x4d\xc7\xdc\x33\x9b\xe1\x1e\x71\x2e\x74\xc4\x94\x4e\x02\x4c\x87\x5c\x3d\x3d\xbe\x6c\x76\xeb\x65\xbb\xdc\x76\x3f\x9e\x57\x4f\x36\xa3\x8b\x74\x1e\xbb\xb0\x3b\xa3\x88\x53\x32\x64\x50\x18\xc4\x1e\x7d\x8d\xa5\x77\x82\xa6\xee\x90\x82\x80\xa7\x96\x31\xd5\xbe\x3d\xdc\x69\xbb\xd3\x43\x64\x39\xf4\x2d\xfb\x8b\xc8\x46\x72\x11\x4c\x01\x0d\x23\x0b\x22\x42\x21\xcf\x11\x43\x86\x32\x51\x82\x8c\x5c\x56\xbf\x6f\xf5\xd9\x54\x62\xb4\xe4\xc7\x8f\x6d\xa2\x04\xb1\x25\x4e\x95\xc0\xe7\x02\xda\x2d\xa8\x1e\x14\x8d\x66\x1e\x64\xf0\x5f\xb6\x90\x36\xaa\xa7\x29\xc3\xb8\x71\x54\xc0\xcf\x56\x6f\xb1\xeb\xbf\xef\x46\xa4\xa8\x96\xb8\x7a\xbc\x6e\x27\xfe\xf6\xee\xc1\x17\xf2\x75\x40\x13\x3d\xe0\xaa\xfd\x0d\x72\xc2\xff\x48\x5a\x01\x19\x79\x3c\x21\x4a\x5f\x5c\x48\xd5\xea\x30\x51\x48\xd7\x86\x91\x63\xbb\xc3\xcd\x81\xe7\x75\xa8\x02\x0b\x72\x10\x7b\x18\xe4\x45\x74\x14\x29\xdc\x91\x1f\xa0\xae\xc5\x2b\x6c\x5a\x3f\xb0\x5c\xbe\x89\xa2\x80\x9e\xae\xff\x8b\xba\x8d\x8e\x12\xca\xa4\xf7\x96\x90\xb4\x67\x9c\x7b\xd3\x2c\x26\xd8\x31\x60\xb2\x4f\xd0\xe7\xde\x9e\x66\xb1\xc4\x58\xd3\xed\x85\x8b\x42\x5f\x9f\x93\x74\x8e\xd3\xbb\xfe\x97\x2e\xe1\xb9\x2e\xf3\xd3\xf2\x58\x37\xe5\xbe\x87\xd2\x69\xa6\x65\xa0\x7a\x18\xee\xb2\xcc\x3d\x62\x6a\xd6\x2b\xd5\x3c\x4a\xcc\x70\x3b\xb4\x3c\x1b\x6f\xd9\xc1\x57\x99\xc6\x9f\x87\xc7\xb1\xe8\x84\x75\x73\xb8\x1a\x13\xa1\xf9\x41\x89\xc4\xbe\xb2\xe7\xc5\x76\xb5\x43\x8d\xe0\x76\xf5\xf9\x3b\xe4\xda\x76\x63\xef\xb3\x62\x50\x36\x44\xd0\xea\x65\xb0\xaa\x8e\x45\x88\x00\x67\x5f\x14\x2c\x2b\xdf\xbd\x62\x55\x7c\x2e\xcc\xaa\xf9\x1d\x50\x27\x9c\x20\xb6\x69\xf1\x5a\x65\xe8\x5d\x5d\x43\xad\xaa\xec\x30\xb0\xed\x3a\x89\xad\x32\xba\xfb\xae\x1e\xdd\x32\x3f\x6d\x93\xd8\x26\x54\x94\x28\x1e\xc4\x2f\xe8\x84\x4c\x99\x4e\xa4\xa5\x97\xde\x67\x5a\xd4\x4e\xcb\xcc\xf6\xab\x82\x6d\x78\xcf\x8a\xd7\xc9\xd4\x49\x94\xd5\xce\xb0\xca\x77\xbb\x66\x30\x6f\x45\x20\x8d\x2b\xff\x63\x25\xef\x4e\xcf\x65\x98\x2f\xd5\x3f\xb5\x4c\x22\x6c\x01\xdd\xe3\x95\x9f\x5d\x50\x3f\xe3\xbe\x69\x65\x6c\x35\xfa\x88\x3d\xd0\x57\xd0\xd4\x23\x2d\x77\x37\x4a\xf7\xaa\xb7\x38\xc5\xed\x1a\x7c\x32\x73\xf5\x3c\x0d\x21\xc1\xb9\x73\xb7\xbd\xba\xdb\x6e\x86\x7e\x9e\x86\x88\x63\x6c\x2a\xf4\xbe\xa3\x72\x64\x1a\x92\xd0\xe2\x86\xdb\x25\xfe\x70\xde\x8d\x3c\xbe\x63\x30\x89\x72\x8a\xb1\xf2\xc9\xd8\xdc\xd3\x62\x3f\xd3\x29\xa1\x8d\x4e\x52\x31\xa0\xd5\xba\xb0\xec\xec\x2b\xf4\x77\x6f\x00\x90\x38\x0b\x05\xc3\xde\xaa\xf2\xc3\x92\x05\xc2\x23\x7c\x3c\xc3\x7b\x56\x67\x65\xf1\x58\x36\x08\x88\x1c\xf4\x94\x40\x10\x00\x42\x32\xff\xf3\x71\xfb\x72\x79\x7a\x43\x18\x24\x58\x06\x16\x5a\xaf\xf6\x56\xef\xf0\x12\xee\x6d\x3c\x95\x21\x0c\x63\x84\x5f\xec\xc5\xe7\xba\xfc\xe8\x7c\x4e\x08\x15\x93\xce\x74\xff\x38\xa7\x15\x77\x83\x48\x00\xa2\x7b\x13\xd8\x7d\x8a\xc8\xf2\xeb\x76\xbf\x1e\xad\x69\x20\x24\x40\x8c\xf9\x0c\xdb\x15\x10\x2d\x51\x3e\x63\x57\xab\xa6\xfc\x6d\x4e\x65\xfc\xdb\x28\x0a\x9c\xbc\xb4\x4d\x88\x8e\xcc\x20\x50\x26\xc1\xf6\x71\x14\xaf\x93\xf2\x04\x50\x48\xb1\x1d\x68\x2f\x3e\x97\x3f\x97\x6d\xc0\x6a\x93\xcc\xf7\x50\xd7\xdb\x37\x51\x74\xe7\x30\x56\x96\xe9\xbe\x7c\xdd\x0e\xa8\x54\x46\x0f\xf2\x8f\x34\xdb\x19\x30\xa2\x10\xd2\x74\xb7\xdf\x83\xce\xac\x66\xe4\x25\xa2\x5c\x06\x2c\xb2\xb1\x18\x4e\xdf\x67\x51\xe8\x72\x8f\xea\x34\xa2\xd0\xa2\x9c\x3c\x0c\x63\x89\x68\xa7\xc9\xc3\xdd\xe3\xee\xe6\xe5\xf1\x7a\xb7\x78\x78\x7a\x79\xf4\xfe\x25\xb0\xd8\x20\x91\xdc\xad\x6d\x02\xba\xca\x10\x51\x32\xf9\x0c\x0c\x2c\x36\xb5\xfe\x10\x87\x6d\x39\xc9\x67\x00\x27\xb6\x7f\xc1\x88\x3c\x97\x42\xfd\x7a\xf6\xed\x21\x10\x87\x91\xcd\x74\xf8\xb7\x73\x2c\x74\x8d\x88\x91\xa7\x22\x3f\x2b\x6c\xfa\x1f\xf1\x18\x51\x7a\xc6\xae\xb3\x09\x8d\xe4\xf8\xc6\x62\x11\xa1\xbf\x59\x1f\xf7\x7b\x57\xa8\xea\x25\xa7\x19\x24\x24\xc1\x86\x73\xdb\x96\xa1\xdb\x90\xf5\x4e\x4f\x36\x0f\x48\x14\xd3\x2e\xe9\x8b\x1a\x49\xd9\xeb\xdb\xa5\xf7\x9e\x06\x00\xae\xab\x7f\xa2\x01\x31\xc8\x94\x41\xca\xac\x9c\xfb\xe7\xe7\xe7\xe4\x52\xa9\x31\xe8\xcc\x77\x52\xe0\xce\xb3\xf8\xd2\xa4\x80\x08\xbb\x3e\xad\xb5\xa8\xc4\x1e\x9a\xde\x2a\x83\x0c\x15\xa2\xc0\x9e\xde\xc7\x88\xdb\x99\xc0\x14\x64\x2c\xd0\x41\x2e\xad\x91\xe8\x5e\x93\x94\x29\xb6\x6b\xb4\x1f\x6f\xf5\xfc\x7c\xdf\x46\xb8\x03\x6a\x4f\x06\x52\x85\x98\x67\x45\x24\x4f\x73\x94\xb0\xcc\xb3\xc3\x85\x04\x8c\xff\x49\xeb\x67\xba\x4a\x7a\x59\xc0\x09\x37\xf1\xee\xae\x15\x35\x02\x3a\xb0\xf3\x95\xa8\xc1\xb5\xba\x57\xbe\x7b\xa0\x3f\x93\x12\xca\xe3\xd7\x87\xcc\x6b\xe7\xed\xee\xa0\x20\x45\x74\xf8\x7e\xde\xfa\x81\x02\x81\x36\x45\x42\x13\x06\x41\xb0\x0b\xa1\x8b\x39\x41\x2b\x8d\x19\x61\x68\xde\x9a\x33\x97\x0a\x20\x4e\xd1\xe1\x84\xcf\x06\x55\x57\xd1\x81\x69\xef\x00\x9b\x4b\xc6\xfb\x99\x09\xb4\x9f\x4f\xb7\x50\x04\x6e\x21\x8f\xef\xd4\x70\x4b\x7c\x95\xa9\x72\x55\xf4\x0d\x7e\x60\xd2\x14\x51\x8f\xff\x5b\x36\x58\x21\x1f\x80\x3e\x4d\x40\xa4\x65\xa1\x13\xd5\xaf\x65\xb9\x97\xa2\xb1\xcc\xa2\xa3\x33\x9b\x40\x5b\x21\x9a\xd6\x93\xbe\x71\xa2\x2c\xfe\x43\x9b\x30\xa4\x48\x56\xb4\xad\xca\xa2\x6b\xa8\x34\x21\x49\x70\x93\xad\x9b\xf2\xb0\x81\x3c\x3f\xab\x30\x98\x30\x51\x41\xc7\x7c\x2c\xaa\x66\xa0\x62\xc3\x4c\x08\x04\x63\x57\x9b\x33\x9c\x42\x10\x0c\x61\x31\x76\x44\x76\xc4\xdc\xae\x0b\x65\x5b\x3a\xee\x7d\x3f\x8e\xc7\x3c\xe8\x69\x1c\xb2\x3d\x3c\x64\xc5\x88\x84\xa7\xbf\x1f\x22\x42\xc4\xb4\xf7\x02\x5d\x5f\x9b\x32\x43\xc0\x6a\x79\xca\xb2\xaa\x5a\x53\x66\xf7\xf3\x51\xd4\x64\x22\x16\x23\xf2\xfc\x61\xf1\xe7\xf3\xd3\xcb\xe3\xf5\xa6\x3b\xa0\x08\x86\x53\x42\x6b\xd7\x3d\x38\x02\x62\x1a\xca\xa9\x07\x93\x3c\xc2\x67\xb3\x3d\x56\xc5\xb2\xcc\xcb\x49\x04\x69\x68\xc2\x31\x9b\xb8\xba\xbf\xf2\xbb\xaf\xa1\xc2\xd8\x32\x3a\xc2\x0b\xbc\x1b\xe2\xc0\xe6\x33\xdd\xda\x86\x2a\x8e\x65\x3c\x2b\x68\x82\x1f\xc3\x1f\x8a\x23\x02\x23\xd6\x3e\xb8\xdf\x2e\x7f\x5e\xca\x55\x9a\x98\x09\x66\xb9\x0d\xf2\x5c\x54\xb6\x5d\xe9\x57\x96\x97\xa3\x9e\x25\x13\x27\x04\x39\x56\xcb\x22\x77\x50\x3f\x7f\x40\x85\x74\x58\x91\xeb\x3e\xc0\xe8\x22\x89\x4c\x62\xab\x7e\x54\x63\xd2\x75\xd3\x94\x15\x06\x45\xdd\x5d\x27\x4a\x5b\x2e\xff\xe3\xc9\xd6\xa0\x27\xd3\x27\x95\x0c\xbd\x83\x36\xcc\xb2\x4d\x11\xfe\x80\xd1\x69\xea\x99\x51\x36\xbd\x7e\x28\x33\x82\xd0\x14\x83\xfc\xfd\xe7\xa6\xec\xfa\x94\x0c\x5a\x59\xcb\xd5\xf4\x31\x54\x5b\x1a\x9b\x14\x23\x44\x48\x5c\x4b\xa3\x8d\x21\xba\xdf\x6b\xcb\xe6\x65\x51\xa3\x3b\x17\xad\x46\xbd\x5b\x33\x7e\xbf\x32\x25\xe8\x0a\x1e\x6b\x8f\x14\xf5\xdc\x20\xe3\xeb\x49\x41\xb1\xba\x91\xd5\x43\x51\x9b\xeb\x63\xf7\x38\x52\x27\xe8\x1a\xbc\xe6\xa5\x14\xf9\xd5\xd9\xbc\x95\x5a\x5b\x4a\x61\x5c\x38\xeb\x0a\xf6\xd9\x71\x5f\x4f\xaf\x62\x2c\x13\x4e\x56\xb7\x1b\x5b\x59\x35\x97\x28\x36\x8d\x22\xa9\xc5\x64\x43\xa1\xdb\xcf\x75\xa1\x0d\xd5\xe8\x40\x84\xb6\xbe\x2a\xaa\x57\xf0\x01\xee\x64\x4c\x98\x44\x49\x27\xf8\x7f\xac\xc9\xf4\xb8\x62\xb8\xe4\xd4\x59\x2c\xe9\x06\x80\x51\x18\xef\x35\x6f\x59\xa5\x31\x47\xb8\xea\x67\x80\x21\x0c\xf5\xa0\xee\x9f\x96\x77\xea\x3c\x29\x8b\xa3\x78\x10\x84\x14\x6c\xff\xff\x69\x39\x25\x9d\xe0\x41\x18\xda\xd6\x34\x1f\xf2\x6d\x45\x9e\x67\xa0\x2d\x57\xee\x71\x58\x7d\xef\x0c\x3c\x0f\x48\x28\x54\x57\x4c\x18\xd9\x18\x1e\x10\xca\xb0\x8f\xd2\x2b\x9e\xdc\xdc\x3d\xde\x6d\xbe\x75\x47\x63\x8d\x3e\xfb\x9d\x2a\x8b\x72\x9f\x5d\x44\xe2\x1c\xa7\x10\xee\xfe\x8e\x29\x35\x58\x07\x79\xcf\xaa\xe6\x28\xf2\x55\xd1\x64\x4d\x06\xb5\x47\x88\xfa\x51\x2a\x44\x0a\x74\xdc\xa9\xa1\x42\x64\xe1\xe8\xdd\xf2\x80\x07\x06\xa3\x9a\xab\xac\xd1\xc3\x0c\xdf\xb9\xe7\xc0\x03\xce\x54\x8a\xaa\x7b\x55\xf9\x0b\x2a\x6f\xab\xbb\x38\x62\x90\xeb\xe7\x01\xe7\x8c\x44\x3d\x11\xd4\x4e\x0c\x66\x2b\x0f\x78\x1a\x7a\x1d\x9f\xbb\x06\x5a\x97\xf5\x15\x5e\x9e\xef\xe6\xbf\x5d\x1c\x58\x1d\xa7\x7d\x56\x6c\x8e\xfb\xbb\xe5\x13\x76\xf6\x24\x2f\x9b\x6b\x7f\xba\x98\x32\x1f\x66\x58\x79\x81\xeb\x69\x2b\x09\x0f\x92\x80\xc7\x2e\xb3\x70\x5d\x1d\x5f\xcf\x25\xb5\x78\x90\x08\x8e\x39\x17\xcb\xd4\xb7\xd0\xf5\xb9\x9a\x0e\x0f\x52\xc6\x11\xf3\x5a\xc0\x47\x7b\xeb\xc3\x66\xe7\xdf\x96\x79\xcf\xa6\xd2\xbf\xc6\x1f\x23\x4d\x23\x14\x09\x3b\x88\xd3\x75\x66\xe6\x91\x50\x3c\x48\x81\x04\x29\xe6\xf3\x9f\xb7\xdf\xae\x17\x7f\xf9\xb7\x90\x1a\xeb\x9f\x3b\xa9\x70\x6c\xb0\x44\x08\x2d\xb5\xbe\x49\x48\x27\x27\x92\x3c\x8d\xf4\x20\xba\xee\xf4\xb1\x79\x20\x13\x81\x95\xa5\x7d\x56\x1c\xeb\x6d\x79\x44\x29\x89\xbf\x9d\x2e\xd1\x28\x04\xeb\xbe\xb8\x94\x0a\xbd\xa3\x87\x52\x43\xbe\x2c\xcb\x4a\x67\x45\x4f\x34\xc4\x03\x95\x04\x88\x78\x47\xc7\x6a\xb8\xcb\xd9\x8d\xec\xae\xf8\x09\x59\x37\x36\x55\x48\x1c\xb0\x7d\x83\xab\x32\x6f\xde\xae\x17\x77\xcb\xa7\x4b\x75\xe4\x7f\xfa\xaf\x3b\xb7\x56\xb6\xef\xcc\x32\x2c\x34\xdb\xb2\xbd\xee\xf8\xc5\x40\x40\xd1\xde\x2d\xc5\xe1\x00\xda\x96\xf0\xda\xa0\xfb\x22\x35\x8b\xff\x5d\x22\x07\x41\x44\x56\xbc\xda\x1a\xe3\x79\x55\x91\x07\x20\x49\x9a\x7a\x28\x5a\x6b\x17\x7a\xae\xf0\x25\x6a\x5b\x37\x03\xa4\x0c\x0f\x4c\x64\xa1\x2f\x56\xa3\xa9\xe3\xb3\xe6\x61\x60\x20\x95\xdd\x06\xfc\xad\xcc\xd1\x67\x10\xdd\xf1\x30\x52\x1e\xfd\xb1\x39\x15\xcd\x1b\xd4\x0e\x81\x6d\x55\x60\xc7\xbb\x41\x18\xc6\x06\xb1\xbe\xc8\x2a\xb0\xae\x7a\x86\x20\x7f\x1c\x02\x84\xe1\x9a\xb2\x52\xf0\x0c\x45\xd3\x6e\x3d\x7e\xbb\x09\x89\xb2\x2a\xd2\xe0\xcb\xca\xcf\x4e\x15\xd3\x1d\x8f\x12\xd0\xa9\x97\x59\xae\xba\xbf\x2a\x8a\x8c\xc4\x8f\x3f\xb7\xfe\x4f\x94\x49\x74\x5f\xb3\x1a\xfd\xdf\xa1\xc3\xdf\x0d\xd1\x0c\xa3\x98\x5b\xb4\x87\x03\xa7\x84\x87\x2c\x14\x89\x15\x87\xb9\x86\xba\xa9\xca\x53\xb7\x21\x86\x8c\x44\xb1\xc5\x5d\xc9\x4a\x14\x73\xb2\x12\x3c\x64\xda\x36\x3b\x8c\xa8\x5c\xb7\xa5\x87\xce\x9e\x27\x28\x78\x18\x27\x71\x64\xf9\xfc\xb3\xe2\x15\x61\xf4\x76\x0b\xf1\x97\x8d\x85\xb1\x21\x47\x95\x69\xc4\x50\xfa\x03\x09\xb3\xc4\x8f\x36\x02\x5a\x96\xfb\x7d\xfb\x61\xe4\xd4\x8f\xe0\x61\x92\xa6\x91\xa3\x13\xba\xbd\x5a\x0c\x0b\x23\x3c\x4c\x8c\x65\x07\xec\x5d\xbe\xcd\x66\xf5\xb8\x5d\xfd\x31\xc6\xd0\xf0\x30\xa5\x09\x26\x11\xf7\xa2\x6e\x6f\xb1\x3c\x9c\xfc\x7d\x48\x1d\x63\xfc\x78\x38\x56\xaf\x80\x8a\x59\xfb\x73\x1e\x3a\x1e\x2a\x9a\x18\x07\x5f\x5e\x97\x79\x6e\xa7\x50\xdd\x33\xc6\xf3\x50\x31\x99\x38\x69\xa4\x4d\x73\xd4\x50\x34\x3e\xcf\xeb\x06\xe8\x40\x80\x65\x7d\xff\xbc\xea\xa0\x86\x3c\xd4\x3c\x21\xa9\x3f\xb3\x65\x85\x36\x67\xa9\x1e\x37\x16\x42\x83\x7c\x8f\xbb\xfa\xed\xd8\x69\xdb\x24\xdd\x53\x02\xb7\x8c\x5e\x0d\xd4\xcd\x8d\xc8\xf2\x36\x80\xb8\x3d\x9e\x7e\xbe\x41\xb1\x69\xca\x76\x41\xfb\x8b\x42\x6a\x6c\x65\xbf\x6c\x4d\x14\x1a\xc9\x27\x73\xe9\xa2\x86\xa3\x1c\x06\x7a\xba\x39\x26\x92\xd0\xe7\xc3\x2d\xd1\xdd\x43\xe8\x07\x1b\x48\x91\x66\x02\x71\x61\xa3\x1e\x60\x4e\xc2\x88\x52\x31\x90\x25\x19\xd3\x29\xf9\x41\x9a\x63\xa4\xf2\xe7\xfa\xbf\xfc\xef\x48\x24\x30\x61\xda\x3e\x96\xd5\xac\x99\xfc\x86\x30\x1b\x9e\x6f\xdd\x1d\x66\x65\xb1\x81\xea\x3d\xeb\x2f\x1d\x41\x8a\x88\x0d\xe7\xb4\x5e\xcf\x94\xa5\x66\x23\x27\x4e\x68\x94\xf8\x36\x68\x8b\xbd\xfa\x0e\xe3\x54\x2d\x27\x94\xa5\xb1\xb3\x3e\x0e\xee\xeb\xbd\xa9\x01\xcb\x06\x27\x34\xb1\xb1\x00\x5a\x01\x64\x27\x6f\x0d\xfa\x20\xcc\xe6\x84\x45\x11\x6e\x32\x3a\x33\xe3\x9e\xbd\xd1\x3a\x25\x8c\x73\xea\x48\x79\xbb\x3e\x74\x57\x44\x9a\xac\x4f\xc2\xb4\x55\xe6\x7f\x10\x56\x37\xdd\x92\x48\x7c\xfd\xc8\x5c\x05\x98\xba\xb0\x4b\xb3\xa3\x75\xfd\x2a\x81\xd7\xfe\x28\xb2\xf0\x88\xba\xce\x5e\x8b\xab\xbe\x0b\x6e\x1e\x9f\xc8\x09\x37\x14\xf1\xa7\x76\x1b\xb3\x6c\x63\x22\xbf\x2b\xea\x23\x2a\xe5\x5b\x64\x86\x1b\x1b\x27\x14\xbc\x80\xdb\xf2\xdb\x0e\x74\xd6\xec\xa2\x3f\x46\xef\x24\x4e\xb5\xd4\x5d\x92\xa8\xc9\x7c\xc6\x7c\x09\xd9\x59\x9d\x6b\x72\x27\x49\x98\xe2\xc2\x5c\x68\xbd\xfa\x04\x35\x3e\x6f\x12\x33\xed\xf3\x38\xa7\xb5\xa8\x9b\x9f\x59\x31\x9d\x7f\x22\x88\xb5\x85\xf2\xa1\x3e\xd3\xae\x8d\x43\xce\xc6\x24\x96\x5c\x51\xd4\x75\xa9\x32\xd7\x65\xb5\x15\xf5\xb4\xbd\xd8\x0f\xd7\x06\xd3\xb3\x5d\x33\xdd\xc5\xd2\xf6\x57\xe5\x99\x79\xc6\x15\x4e\x14\x24\xca\xd6\x54\x0e\x59\x23\x72\xdf\x99\xe4\x8e\x6a\xaa\x4d\x84\xe4\x21\xb2\xde\x1c\x65\xe3\x95\xf9\xe6\xdf\x9e\x8e\x93\xc0\x12\x51\xd4\xc7\x3d\xac\x07\x36\x93\xe8\x54\x8a\x68\x64\x4f\xbc\x14\xf1\x8d\x15\x2e\x9a\x2c\x24\xa0\x04\x7d\xe3\xa5\xd8\x1f\x44\x3b\x8b\x50\x9c\x5c\x65\x9d\x08\x31\x27\xc0\x44\xac\x7d\x29\xdc\xd3\x81\x76\x07\x45\x90\x3a\x88\xd4\xfd\xf2\x79\x98\xef\xe6\xc4\x44\x0c\x01\x2c\x36\x4a\xbc\x12\xc5\xaf\x61\x14\xc9\xa3\x40\xa4\x88\x4b\xc6\xd6\x0a\x9f\xcd\xfe\x09\x19\x2e\x54\xb7\x53\x8d\xee\x36\x0a\x69\x34\xa4\xf4\x1f\x6a\xb5\xf2\x88\x44\x14\x02\xdf\x48\x3c\x56\x0f\xe0\x11\x89\x0d\xf6\xe3\x39\x3f\x8c\xb4\x6f\x25\x2b\x8e\xfb\x19\xa7\x3b\x22\xc2\x66\x35\x6a\x68\x2c\xc3\xc7\xf4\xb8\x66\x18\x3e\x3f\x2c\x1e\xbf\x2d\xb6\xdb\xc5\xe3\xfa\xf9\xe9\xcf\xfb\xd5\xe3\xe2\x87\xbf\x5a\xa4\x13\xed\xb6\xa7\xeb\xf2\xf8\xba\x98\xa4\xfb\x79\x14\x99\xae\xfc\xef\x71\xc2\x4f\x1f\xe0\x6a\xea\x0b\x4b\xe2\x37\xd5\x63\x1a\x9a\xe1\x88\xb2\x84\x39\x8f\x6e\x55\x2b\x71\x00\x6f\xf9\x8e\xc3\x9e\x0c\x37\x98\x69\x9b\x13\xff\x51\x36\x33\x4d\x08\x3c\x62\x10\x23\x0c\xf8\xea\x78\x5a\x5d\xad\xb6\xcd\xf0\x2b\x46\xdc\x50\x84\x98\xa0\xaa\xbc\x2d\x4f\x8e\xd6\x4d\x14\x93\x20\x71\xa4\x9c\xd5\x63\x79\x5f\x16\xaf\x48\x45\x34\x24\xd2\xf3\x23\xa9\xfd\x42\x42\xeb\x11\x9b\xe3\xa0\xc3\xd6\x8d\x4c\x22\x82\x4b\xb7\x9d\x38\x37\xc7\x42\xfd\x31\x3a\x4f\x1a\x5a\x36\x24\x81\xcd\xb0\x93\x26\x0e\x7f\x8a\x34\x8a\x13\xcb\xb2\xa1\xd1\x9d\x9e\xe9\x6a\xe5\x91\x48\x8d\xa7\xa1\x78\x84\xcf\x66\x53\x88\x43\xfd\x56\x36\xe7\xe8\x11\x1e\x09\xb0\xfe\x24\xbe\x9d\xf6\xe1\x9e\x71\xf5\x0d\x1a\x14\x78\x24\x53\x4b\xfd\x26\x8e\x4d\x79\x75\xac\xfc\x2a\x89\x14\x0b\x02\x2b\x91\xb1\xcb\x07\xb2\x33\x3c\x52\xb1\xf5\x3d\xad\xa7\xbd\x2d\xcf\x97\x5f\xa4\x03\x69\xbd\xe0\xac\xd0\x8b\x42\x5b\xd0\xcd\x3f\xc1\x43\xf3\x48\x73\x13\xb0\xa1\xdb\x6f\x1b\xcf\x7e\x13\x30\x9e\x15\xf4\x78\xa4\x53\x5b\xaf\x56\x96\xaa\x66\x71\x2e\x42\xc7\x23\xad\xac\x30\xbf\x5d\xed\xcf\x8d\xdc\x20\x74\x1b\x55\x2a\x64\x36\xda\xe1\x23\x08\x03\xe3\x69\xe0\x8a\x0a\x84\x76\xc8\x85\xf3\x64\x15\x8f\x4c\x18\xf9\x2e\xb6\xb5\xa8\xa0\x68\x5e\x8a\xd6\xe8\x76\x5b\x5e\x64\x18\x10\xe1\xfd\x9f\x41\x21\x96\x47\x26\x09\x90\xeb\xac\x56\x1d\xd7\x8e\xc8\xc7\xf9\x1e\x4e\x83\x88\x47\xdc\xcb\xf1\xbf\x7b\x3e\xb1\xaf\x64\xa0\x38\x0d\x12\xa6\x54\xaf\xd8\x87\x82\x09\x13\x73\x42\x43\x4d\x12\xeb\xfd\xbf\x97\xbf\xc0\x4b\xaf\x6c\x10\x32\xf6\xc7\x97\x16\x63\x4e\xec\x98\xd3\x10\x34\xb6\x63\x5d\x3d\x2d\xbf\xca\x9b\x50\x42\xb5\x57\x5e\xfd\x91\xbd\xce\x9a\x3a\x4a\xe2\xff\x97\xb5\x37\xeb\x6e\x1d\x37\xba\x40\xff\x4e\x3f\xe4\x81\xe0\x00\x80\x8f\xb2\x2c\xfb\x28\xf1\x14\x49\xee\xd3\xfd\xf5\xca\xd2\xc2\x50\xb0\x19\x53\xa4\x42\x52\xb6\x95\x5f\x7f\x17\x0b\x00\x27\xd1\x3e\xb9\xeb\xde\x97\x9c\x8e\x09\x52\x1c\x80\x42\x0d\xbb\xf6\xb6\x9b\x51\x5e\xd6\xcd\x5e\x14\x7a\x8f\xc0\xd0\xbd\x75\xd5\x7f\xf3\x83\x54\xe0\xdb\xcf\x87\x6d\xfe\xdd\x17\x8f\x23\x65\xb5\x41\x5c\x9b\xe4\x2c\x72\x97\xc6\x31\x49\x99\x6d\x2f\x87\xcf\x75\x6b\x9a\xfd\xe4\x8f\x93\x34\x40\x6b\x2e\x5c\xf8\xe6\xbc\x29\x7f\x54\x44\xd8\x82\x65\x63\xdb\x1b\x94\x13\x76\x7c\x1c\x7e\x04\xf0\x78\xcc\x80\x73\x2b\x0e\x18\x50\x74\xd7\x30\x26\x31\x9e\x75\xff\xab\x7a\x35\x8d\xa9\x49\x31\x73\x75\xaa\xfb\x84\xb8\xbf\x04\x0b\xd3\xc0\x21\x85\x17\x9f\xd9\xc4\xa2\xc5\x2c\xb6\x7e\x72\xbb\x55\x94\x4d\xcf\x18\x35\xfb\x65\x18\x70\x74\x30\x90\x66\xe9\x7f\xa9\xd1\xd2\x98\x87\x1c\xaf\x2f\xcb\xcf\x41\xc7\x07\x8d\x79\x62\xf3\x4b\xc7\x5c\x28\xf0\xf4\x75\xc3\x76\x4e\x1a\x73\x03\x98\xc5\x76\x5f\x27\xcf\x77\xa7\xaa\x28\xdf\xa7\xbb\x59\x9c\x12\xdb\x94\xb4\x7f\xc9\x9c\x42\xcb\xbc\xf7\x18\xa7\x94\x23\x09\xe8\xbf\xcb\xd1\x2a\x8b\x05\x51\x81\xf4\x4e\xf6\xb6\xcc\x75\x2f\xf3\x52\x9e\x6c\x12\xb6\x1b\xaa\x13\xcf\xdd\xe7\x16\xc4\x04\xaa\x4c\x63\x19\x58\x65\x6e\xa1\xf5\x35\xbc\x5b\xb3\xe5\x4f\x97\x34\x42\xc1\xe5\x27\x51\x29\xc8\xff\xb8\x7d\xfa\xe3\x8b\x52\x43\x3b\x14\xac\xb2\x67\x57\xae\x99\x93\x48\x99\x9e\x24\x03\x7c\x15\x3b\xa8\x1b\xf6\x77\xff\xab\x8a\x59\xfb\xd2\xe7\x63\xbe\x4d\xf9\xc4\x9a\x28\xcc\x98\xbd\x8a\xfa\xb5\x67\xfb\xfd\xbe\x6b\xe0\xf2\xcb\x6b\xd0\x18\xe5\x37\x4d\x73\xc9\x6c\x41\x63\x60\x29\x8a\x16\x38\x96\x96\x7a\x29\x8a\xa2\xc4\xe6\xb4\xc9\xfb\x84\xd4\x6a\xf5\xbe\x57\x6a\x18\x1a\xc5\xa0\x39\xe2\x4d\x9b\x01\x05\xa7\x3b\x64\x02\xe5\x89\xa3\x10\x34\xbf\x2e\x56\xa7\xaa\x5c\x42\xc7\x2f\x4b\x63\x43\x52\x36\x44\x66\x5f\x65\x3a\x96\xbf\x8d\x8d\xa4\xe1\xb6\x1a\xd1\x7e\xc9\x53\xf1\x02\x65\xe1\xd9\x2b\xe6\x9f\xd8\x08\x8e\x8f\xf4\x54\xc1\x7f\xff\x5b\x2e\xef\x77\xf3\xe3\x92\x00\xa4\x9c\x4a\xc9\x78\x36\x81\xad\xd5\x2c\x1c\x91\xd8\x8d\xcf\x26\x89\x40\x87\x15\xc1\x39\x9d\x2d\x4a\xc2\x98\xe1\x82\xda\xee\xb6\xbb\xd5\x76\x17\xf9\xbf\x47\xed\xa4\xb3\xfc\xa1\x50\x5d\xc1\xf7\x75\x73\x9a\xc4\xd4\xaa\x8a\x1f\x45\xf1\x46\x12\x7f\x91\x38\x25\xc8\xb7\x7d\x06\xf8\xef\xb9\xfb\xa3\x32\x08\x20\x3a\x96\xdd\x6b\x4d\x12\x63\xc9\xfd\xf3\x76\x9f\xde\xa7\xe3\x3c\x76\x42\x99\xa5\x05\xee\x4a\xf9\x0f\xf0\x31\x47\xf7\xec\x87\x43\x82\x3e\x66\x2e\xea\x4e\x9f\xbc\xb6\xa5\xe1\x6b\xd1\xdd\x06\x0b\x63\x44\x74\xfd\x10\x95\x56\x5d\x4a\x36\x61\xa1\xf2\x32\x06\x60\x21\x3c\x63\xc5\x0e\x9a\x30\x25\x53\x8b\x83\x90\x87\xac\xd9\x20\xd5\xd7\xd8\xb4\x24\x69\x94\x78\x95\x7d\xfb\x24\x28\x52\xe7\x7f\x42\x84\x14\x69\x18\x2a\x5b\x18\xb5\x17\xbf\xcb\xba\xec\x4d\x22\x18\xc3\xca\xc5\xff\x41\xd1\x78\x34\x34\x4d\x84\x4a\x91\x51\x4b\x0e\x89\x21\xb1\x03\xa8\xfe\xda\xc4\x27\x02\x12\xd2\x69\x81\x5c\x5b\x66\xde\x1b\x91\xe5\x27\x5f\xc3\xa3\x89\x8c\x98\x27\x53\xf9\xa3\x10\x97\x0e\xb8\x1f\x46\x6d\x93\x19\xe6\x15\x7b\xce\x34\x67\x76\x13\x15\x05\x48\x30\xb0\xef\x13\x64\x9b\x3e\x23\x95\x40\x4a\x50\x01\x59\x7a\xf9\xfc\xba\xaf\x17\xd2\x04\x84\xd2\x8e\x35\x64\x02\xf6\xf0\x03\x94\x04\xe9\x69\xae\x3e\xad\x61\x78\x17\x79\xd6\x83\xb4\x68\x62\x02\xc3\x52\x3f\x65\x41\xe4\xfb\xed\x41\x54\xcd\x7e\x7d\x7d\x61\xb7\xc6\x7b\x55\xbf\xb3\x26\x86\x10\xac\x3b\x7e\x40\xb6\x2b\x9f\x6b\x6d\xd7\xfe\xf8\x3d\x98\xc4\x89\x17\x8a\x63\x3b\x09\xf7\xee\xe7\x69\xd0\x7e\xb7\x9e\xaa\xa2\xf5\x57\xb3\xe2\xc5\x4a\x72\x5e\x44\xd4\xb3\x6b\x94\x06\x34\x45\xd7\x69\xf7\x0a\x76\x61\x43\x73\x9d\xbd\xb4\x61\xb3\xdd\xe7\xd5\xb9\xfb\x31\x61\x85\x07\xbd\x19\xfc\xd1\xbe\xcc\xd1\x2b\xa3\x81\xe1\x21\xf3\x5d\x5e\xab\x42\xd7\x7e\x59\xd2\x30\x96\xe8\xad\xaf\xb7\x43\x2e\x31\x4a\xa3\x30\x0d\x62\x47\x5e\xbc\x57\xe2\xe8\x59\x33\x28\x8d\xa4\x2d\x1e\xbe\x67\xf0\x81\x3a\xcd\xff\x10\xd5\x61\x52\xfb\xa1\x71\x18\x22\x43\x3f\xb8\x16\xf5\xce\x75\x71\xc7\x13\x1a\x60\x61\x2b\x2b\x3c\x35\xfe\xad\x98\xe0\x4a\x28\x4d\xb8\x65\x4b\xb9\xca\x5a\xa3\x0e\x0a\x11\xeb\x50\xbd\x0b\xdd\xd5\x38\x28\x25\x29\xa6\x01\x70\xe3\x7d\x28\xab\x83\xc8\xbb\xe4\x75\x59\x75\x02\xe6\x94\xd2\x50\x60\x3e\x37\x2b\xb2\x8e\x0a\xd0\x51\x22\x75\x77\x45\xa9\xc1\x10\x65\xb7\xbb\xed\xbb\x16\x29\xa5\x0c\xb0\xe4\x6a\x75\xeb\x2e\x24\x9e\xfd\x28\x63\xf0\x07\x6c\x70\x33\xb3\x5f\x51\x46\x42\x44\xd4\xb4\x2e\x56\xfd\x68\x3c\xc4\x6a\xd6\x72\x51\x16\x0b\x4c\x62\x6c\xa0\x1e\xb9\xcb\xfe\x30\x97\xd4\x31\xa0\xfd\x5d\x68\x18\x36\x53\x8e\x8a\x5e\x6e\x38\xd7\x0c\x17\xec\x43\xa6\xe0\xf6\x74\x7e\x2a\x8b\xff\xfa\xd2\x0f\x4d\x23\xeb\xf9\xbd\x96\x75\x93\xe5\xb0\x13\x6f\x50\xbe\x7f\xc1\xd8\x40\x69\x2a\x13\x04\xe4\x1f\xc5\x79\xdf\xc9\x34\x53\x9a\xaa\x14\xfb\x87\x7c\x5b\x29\x68\x97\x0a\x9d\xb8\xc2\x34\xd5\x29\x56\xdc\xd4\x5e\xa1\x5c\xcd\x88\x78\x9d\x52\xa1\x98\x95\xe1\xb5\x0d\x94\xb3\xa1\x07\x95\x34\xc4\x70\xf0\x45\x1c\xe0\xf1\x1d\xaa\xab\x33\x72\xfe\xfa\xa3\x8c\xb9\x46\xaf\x3c\x2f\x3f\xc6\x1b\x32\x55\x81\x24\x3e\xad\x5f\xe6\x1a\x05\x81\x40\x1c\x66\x43\x04\xaa\x92\x08\x1b\xff\x27\x35\xec\x0b\xaf\x65\xe8\xe1\x52\x25\x6d\x69\xfb\x16\x46\x7e\x1f\xd5\x89\xed\x63\xb4\xe0\xf9\x07\x71\x80\xfa\x28\xc6\xf4\xaa\x94\x6a\xc9\x02\x4f\x7d\xf1\xf8\x78\x67\x53\x8e\x61\xd4\x5d\x43\x1b\xac\xe8\x1d\x44\x66\xc3\x6f\xd1\xc0\x53\x7f\xd4\xb0\x80\x74\x95\xa9\x9b\xe9\x6e\x45\x81\x82\x5d\x94\xe8\xef\x84\xdb\xf3\x41\x7a\x5e\x7e\x4a\x01\x02\x2b\x9c\xec\xbc\x88\xae\xe9\x6e\xde\x5a\xb9\xb3\x8c\x03\xbf\xa0\x18\x49\x64\xd3\xaf\xfe\x8a\xa6\x8d\x9e\xd0\xe8\x94\x9d\xed\xa7\x86\x59\xe1\xe4\x76\x52\x3b\x5d\xf9\xc9\xaa\x37\x3a\x76\xf0\xea\xa2\xd9\x95\x2f\x2f\xf9\xb0\x2c\xc7\x02\x99\x22\xac\xa9\x80\xba\x69\xe7\x98\x2a\x0b\xbd\x2d\xbf\xda\xff\x59\xa0\x48\xe4\x84\x8a\xda\xcf\xec\x12\xd1\xfe\x9b\x30\x12\x32\x47\x75\xd0\xba\x06\x57\x13\xb9\x0b\xca\xc2\x34\xb5\x62\x1f\x7e\xcd\x5f\x40\x78\x07\xb7\x16\x25\x41\x18\x75\xd0\x5b\x93\xe5\xf0\x94\xa9\x39\x7d\x47\x3f\x5e\x12\x54\x0b\xf0\xf4\x3b\xd3\x05\xe7\xf7\x6d\x16\x13\x8b\xc6\xc8\x8a\x7f\x83\x6a\x1c\x6b\xbf\xc7\x73\xf9\x47\x89\x19\x65\x81\x0b\xf3\xda\xe3\xb6\x10\xea\x0e\x26\x3c\x60\xe0\xad\xe4\x1d\xbc\xd7\xfd\x01\x8e\x07\xf0\xa2\xbe\x21\x04\x31\xad\x30\x24\x86\x9a\x6c\x59\xee\x64\x2a\x09\x56\x16\x46\x88\x51\x87\xbb\x73\x43\x98\x91\x98\x30\x82\x4f\x54\xda\x08\x31\x8f\xe5\x8e\xf1\x80\x23\xcd\xbc\xc9\x2a\x2b\x92\x7c\x57\xbe\x04\x8b\xa2\x2c\xce\x87\x6e\x48\x1c\x63\x11\x56\xe5\x20\x8a\xc7\x53\x77\xd9\x34\xb0\x62\x21\x77\x8f\xcb\x7f\xec\x96\xdd\x5f\x49\x42\xb9\x93\x9c\x58\x4c\xf9\x3d\xdd\x18\x41\x01\x3d\x4e\x09\x23\xb1\x59\xca\x84\x26\x8e\x2a\x27\xcf\xd7\xcb\xbc\x3c\xa1\xb4\xde\xe2\x45\x64\x45\x6d\xdf\xf9\x78\x9e\x32\x01\x40\x3a\x82\xf6\xa5\x4d\xa9\x76\x46\x88\x09\xa3\xf1\xe3\xb6\xf3\x2a\x1c\x24\x5c\x26\xaf\x50\x8a\x04\x35\x02\x9c\x34\x13\xb2\xa3\xe2\xea\xfd\x45\xdd\x83\x49\x99\xf0\xa8\xfb\x75\x71\xbc\x29\x2b\xbb\x18\xee\x5b\xd3\xd0\x2b\xb6\x53\xa6\x42\x16\x05\x03\x30\xd0\x13\x54\x03\xd8\x56\x7b\x5c\x23\x1e\x45\x28\x05\xc7\x66\x5f\xfa\x76\x91\xee\x38\x97\xd8\xf6\x82\xe2\xc8\xa7\xc2\x61\x34\xba\x19\xa4\x84\x82\x14\x45\x0a\x76\xfb\x9e\x7a\xf8\xbb\xec\x0c\xd3\x21\xf5\xc4\xeb\x5b\x61\x86\xe5\x59\xa6\x81\x63\xb6\xee\xda\xa6\xbe\x47\x5f\x08\x52\x82\x91\xaf\xed\xb5\xdc\xdf\x7b\x6d\x02\xca\x40\x72\x4c\xbb\x6d\x77\x9b\xf5\xfd\x38\x7c\xff\x36\x54\x61\x20\x0d\x8a\x94\xd8\xfc\xca\xf7\x31\xaa\x3b\xc5\x90\xd0\x52\xc0\x92\xfd\x7b\xf9\xdf\x4a\x74\xa6\x8d\x99\x34\x45\xaf\xf7\x6e\xfd\xcf\xe7\xf5\xf5\x62\xb7\x7e\x7c\xd8\x6f\x56\xdb\xd5\xe6\xf7\xd5\x7e\xd3\xfe\xdf\x6e\xa0\x8a\x7c\xe6\xcf\x46\x83\xae\x24\x30\xbb\xd9\xf1\x80\x28\x69\xab\x3c\xf5\x8c\x54\xfb\xe8\xe6\x78\xc0\x15\xfa\x20\x7b\xa4\x30\xc8\xf2\xac\x39\x63\x54\x40\xd8\x6f\x93\x81\xa9\x30\xce\x7d\x78\xd4\x13\x68\x36\xe5\x81\x14\xc2\x03\x93\xa1\xd0\x43\x8e\x77\xca\x89\x34\xa1\xe5\x51\x7c\x11\xf9\x55\xd9\xff\xdd\xa4\x49\xd0\xb5\x07\xdf\x8b\xcf\x79\x93\xcc\xc3\x88\x60\x99\xef\x28\xaa\xda\x7e\xfb\xe1\xe4\xe0\xa1\xd6\x98\x66\xdd\xfe\x1c\xc8\xa2\xce\x2e\x1e\x1e\x85\x16\xd5\x25\x2c\xa9\x55\xb7\x63\x8d\x7f\x2f\x4a\x23\x61\xeb\x25\xf2\xf4\xb2\x47\x34\x73\x56\x60\xe8\xf1\xf9\x78\x6a\x8e\xa7\xe6\x6e\x5a\xfc\xe0\x71\x64\x10\xd7\x83\x1c\x3b\x31\x9f\x1e\xa5\x01\xfa\xdb\x38\xd1\xee\xad\xd2\x75\xe7\x49\x5e\xee\x0b\x3c\x96\x2a\xed\x0c\x85\x37\xf6\x7e\xd3\xe6\xb1\x31\x58\x20\x92\xee\xe3\x12\x3a\xf9\xfe\x6d\xc8\x8b\xaa\x87\xd7\xc3\xd5\xc0\x13\x0a\xc8\x34\xff\xf7\xdd\xea\x6a\xbd\x9b\x77\xd6\x78\x22\x62\x2c\x7a\xe0\xbb\xbe\x2b\x85\x95\x36\x19\x30\x8e\xfc\x95\xf6\x61\x22\xfb\x97\xab\x98\xfc\x15\xff\xab\x3b\x1f\x90\x22\xe0\x90\x15\x50\xb5\x11\xce\xa3\xb9\x13\x75\x6b\xe3\x4b\xd3\xdd\x08\x88\xc4\x45\xc9\x9b\xc7\x9b\x8d\x13\xc1\x73\x07\x69\x10\x22\xc6\x19\xb5\x8e\xf3\xb9\x17\x35\xbe\x61\x26\x01\x7d\xb7\x4d\x89\xbc\x48\x8b\x42\x6f\xa0\x46\x99\x8d\xee\x92\x3c\x01\xce\x3b\x50\xf4\x0b\x20\xf2\xcc\x1d\x4b\x13\x99\x08\xaf\x36\x91\xe5\x67\x14\xba\xeb\x0e\x52\xa9\x6d\x01\x02\x7b\x0d\x3a\x6e\x9a\xd3\x6c\x7f\xd5\xa8\x7a\xc4\x45\xc8\xb1\x90\xb2\x2b\x4f\x55\x1b\x17\x17\xcd\xb2\xfc\x46\xb8\x79\x3c\x4f\x05\xa3\x98\x29\xb7\x9e\xdf\x4d\x59\x59\x54\xaa\xbf\x2f\x99\x10\xd0\x9e\x00\xd6\xe9\x37\x7d\x95\x27\x9b\xeb\xf1\xf6\x97\x49\x49\xa7\xbb\xe9\xbc\x94\xe1\xab\x51\x89\xc2\xc8\x7e\x7b\xbd\xfb\x15\x1f\x31\xe5\x2a\x95\xd2\x5d\xeb\x2a\x9b\xe7\xf6\xa2\x5c\x39\xf1\x78\x24\x84\x6a\xb7\x9e\x6f\xcd\x98\x4e\x05\xe6\x41\xf6\x88\x1e\xf8\x28\x26\xdd\x88\xdf\x67\x02\xb9\x36\x12\x21\x4b\xbb\xdd\x68\x11\x40\xc8\x3c\x67\xf4\xdd\x09\x75\xf9\x8f\x93\x0d\x9f\x43\x9c\xa0\x8b\x67\x5d\x9f\xab\x6d\x99\xeb\xfd\xf2\x71\xf3\xb0\xda\x6c\x77\x8f\x0f\xab\xee\x4a\x89\xc0\x0e\x65\xed\x55\x3d\xda\x3d\xee\xa6\xac\x5c\xe8\x3e\x31\x01\x26\x90\x08\x88\xd9\x3d\xee\x16\x77\xfb\xbb\xc5\x66\xb5\xbf\x79\xdc\xec\xfb\xa6\x48\xca\x8d\x31\x91\x6d\xf0\x29\x6c\xa7\xd0\xbc\x39\x4c\x83\x28\xc4\xfb\x93\xf0\x92\x15\x03\x80\x3f\x1e\x01\xab\xcd\x5c\x7e\x9e\x77\x17\x9a\xd1\x3f\xb3\xe6\x15\x29\x71\x61\x28\x78\x33\x2d\x98\xce\x95\x51\x52\xc2\x18\xb6\xe4\x0a\x3d\xec\x63\x9d\x69\xb7\xa5\x69\x48\xac\xa0\x89\xad\xf8\x0d\xd7\x76\x1a\xaa\x10\x43\xbe\x7d\x53\xee\xb2\x1c\xd6\x88\xd2\x8f\xc2\xbf\x0d\xd6\x4d\x1a\xea\x04\x43\x5e\xa7\x14\x8b\xf9\x7b\x27\xb2\x3f\xbb\xd9\xba\xd3\xa2\xd8\xee\x25\x7b\x57\x6c\x7b\x2c\xa0\x53\x7c\xa5\x69\x94\x70\xc4\x1b\xbd\x97\xb8\x9a\x76\xe2\x38\x88\x10\xd2\x88\x06\x81\xcd\x29\x96\xf9\xa8\xd6\x9e\x46\xd4\xf2\xd1\xa2\xf9\x7a\x34\xbb\x57\xd8\x64\x5e\x25\x89\xa6\x71\x10\x5a\xd0\x74\x55\x7e\x34\xfd\x5f\x09\x35\xae\xf4\xf1\x50\x6a\xd8\x9d\x8f\x93\xa8\x2a\x8d\xb9\xd2\xe9\xa8\xb9\xa8\x82\x8e\x8f\xf1\x2f\x42\x27\x59\xf9\x34\xd6\x02\xf7\x73\x24\x23\x5d\x3f\xdc\xee\xb7\x0f\x8b\xf5\x5d\xf7\x7b\xc6\x92\xee\x61\x07\xf9\xe4\x5b\x24\x61\x80\xcf\x2d\x72\xf5\x0a\x87\xf3\xf4\xa8\x12\xca\x95\xd3\xb1\x04\xa4\xeb\xab\xf3\x52\x34\xf0\x52\x56\xe7\x71\x10\x9c\xb2\x20\x15\x36\x1c\xf8\x01\x9f\x16\xf0\x43\xe3\xc9\xe5\x58\x18\xda\x34\x8f\xcb\xcf\x0c\xfb\x69\x87\xb6\x22\x65\x91\x41\xc3\xa2\xca\xc3\xf1\xd4\xc0\x76\x7a\x1d\x25\x88\xed\x9a\x2e\xb2\xfa\x75\x9b\x15\x2f\xb9\xed\xde\x99\x35\x2a\x29\x0f\x04\x61\x9d\x31\x3c\x94\x17\x08\x80\x6f\xbd\xb3\xb4\xdd\xed\x43\xcb\xe3\xfb\x06\x67\x4b\xe1\x35\x91\x51\xa3\x29\xe7\x09\xb2\x1c\x7f\xf4\x3e\xe6\x28\x72\x4d\x53\xa5\x43\xe7\x32\xdf\x56\xe5\x07\xca\xd0\x16\x4d\x55\xe6\x08\x40\x5b\x74\x13\x2a\xd5\x56\xd4\xb9\x16\x65\x2d\x4a\xda\xfd\xd9\x58\xfa\x0f\x9b\xc3\xf8\x59\x56\xcd\xeb\x64\xce\x88\xd0\x92\x31\xa3\x51\x72\x70\xb5\x6e\x5d\x89\xc4\x22\x4f\x5b\x77\xcf\xc2\x88\x27\xb6\x34\x15\x1a\x30\x87\x72\xb7\xba\xde\xdf\x3f\xdf\xed\xd6\xdb\xf5\xad\x3f\x5b\xea\x58\xd8\x8c\xf2\x0b\xde\xed\xa0\x34\x9f\x4a\x10\xd2\x2f\x9c\xc9\x3b\x51\x61\x28\x5d\xb7\xd7\x9f\xe2\x3c\x71\x08\x53\x95\x48\xc4\xb1\xc9\x53\xbb\x2d\x2f\xf3\xb2\x3e\x55\x30\x04\x68\xf8\x71\xd4\x0a\xa5\x75\xcc\x9d\xa8\x4e\xe5\x0f\x4a\x69\x17\xf5\x0b\x34\xa8\xb6\x34\x4c\x8f\xa4\x5a\x5b\xe9\x59\xcb\x1b\x27\xea\x3a\xc3\x16\xfa\x87\xd3\xb4\x9a\x93\x6a\x63\x55\xa3\x4f\xc5\xd0\x5a\x02\xb7\x9a\xa1\x76\x93\xfd\x0e\x02\x96\x82\x00\xd4\x12\x73\x41\x97\x6f\xf8\xda\x95\xf7\xd9\xb4\xf2\x9e\x1a\xa6\x31\xca\xbb\x79\x7c\x7e\x70\x3e\xfd\xd3\x6a\xb3\x5c\xf9\x4e\x4e\x9a\x1a\xce\x91\xf1\xa7\x13\x04\x45\x85\xb2\xf1\x0b\x14\x84\x27\xc8\xe2\xf5\xf1\xda\x31\x2d\x50\x11\x06\x06\x6d\xcb\xf5\x76\x25\xea\x33\xd2\xa0\xd7\xd9\xcb\xff\x44\xf9\x41\x45\x14\x6b\x04\x7f\xef\xad\xbf\xbd\x14\x95\xee\x11\xf6\x5e\x03\x88\x8a\x48\xc4\x51\xda\x29\xb5\x8f\x5a\x9b\x66\x5f\x8e\x88\xa4\x65\x4d\x45\x49\x9b\x7a\x68\xf0\x45\x22\x8d\x97\x25\x45\xcf\x2b\x1c\xf4\x41\x51\x41\x43\x8d\x65\xda\x81\x38\x67\xd8\x1d\x8b\x22\x0c\x28\x36\x8f\x8b\xee\x4f\x22\xd0\x76\xdf\x53\xe5\x01\xa1\xf3\xdd\x11\x43\xb0\xc8\xef\x53\x89\x77\x99\x82\xa2\x86\x39\x48\xa2\xe0\xd4\xe6\x50\x4e\xb5\x9e\x81\x95\x8b\x54\x04\x69\xda\x2b\x4f\xac\x55\xfb\x89\xfd\xef\x08\x66\xac\xd4\x43\x91\x9f\x6f\x2c\x29\x54\xf7\xa8\x92\x84\x84\x0e\x69\x83\xeb\x45\x75\x38\x93\xc9\xe5\x65\x64\xc9\x34\xb2\x22\x6b\x32\x6c\xf9\xfb\x8a\xb5\xc0\x9f\x20\x08\x4e\xdd\xab\xac\x8d\x42\x3e\xbb\x5f\x93\x36\x29\xe6\x55\xc2\x89\x13\x96\xf0\xb1\xc0\x34\x26\x10\x2a\x0d\xbd\xeb\xf5\x77\xa1\xde\x8e\x65\xe3\x90\xc1\x93\x1b\xd4\x09\xeb\x80\x9d\x99\x3a\xe5\xcd\x79\xab\x44\x0e\xf7\x96\x58\x2b\x83\x6a\xe8\x20\x0b\x08\x84\xb0\xf8\x30\x1b\x20\xf9\xbf\x1b\x6d\x55\x85\x5b\x6f\xb0\x47\x10\xcb\x80\x40\x62\xb1\x66\x78\xbd\x19\x98\xb6\x0c\x12\x81\x33\x7c\xfd\xb0\xde\xad\x17\x77\x7b\x64\x71\xb9\x5b\x6f\x77\x23\xc2\x24\x2a\x03\x1e\x63\x41\x32\xab\x1f\x8f\xdd\xf5\x49\xa0\xd1\x48\x62\xe3\x58\xbb\x9e\xf7\x37\x65\xb5\x5f\x66\x15\x6e\xb3\x3d\xfe\x4e\x12\x62\x90\xf8\xc9\x20\x8b\x44\x26\xf2\xfd\x7a\xf9\xd8\x1d\xa4\x09\x74\xa9\xaf\x7d\xe6\x6b\x80\xdd\xe1\xd4\x62\x97\x67\xf9\xd4\xfc\x18\x65\x53\xf1\x2f\xa2\x6e\x5f\x9f\x98\x44\x98\x32\x0c\x28\x5a\x47\x5d\x6e\xcb\x03\x34\xaf\x17\xfe\xa2\x0c\x29\x45\xbb\xb8\x42\x97\xed\xd4\x46\x35\x36\xd5\xf6\xc5\x2f\x86\x2a\x8e\x58\x8f\x35\x1a\xe2\xda\x06\x83\xb4\xc1\x46\x84\xca\x1e\xbd\x2e\xd5\xe9\x00\xf3\xe2\x55\x54\x46\x42\x7a\x7a\xcc\x7b\x0b\x5d\x18\xa3\xa4\x65\x1c\x84\x08\xcc\xb8\xbf\x7d\xee\xfe\x14\xa7\xa1\x45\x8e\x54\xef\xa7\x21\x8d\x17\x95\xb1\x0c\xb0\x6c\xd4\x40\xed\x48\xf2\x5b\x9f\x63\x32\xfd\x64\x42\x22\xab\x62\x90\x15\x22\x1f\x62\x37\x64\x92\x00\xfe\x9a\xb3\xe1\x7e\x96\x0f\x63\x2e\x99\x30\x89\x4c\x95\x35\xf6\xab\xb6\xd3\xeb\xab\xd7\xc5\x8c\xa5\xaa\xf4\x26\x78\x08\x00\x24\x69\x38\x0c\x93\x24\x67\x12\xdb\x11\xa1\xf2\x89\x48\x99\x06\x29\x38\xc6\x14\xdd\x6d\xc3\x52\x84\x16\xe4\x6f\x40\xbd\xfe\x5e\x36\x88\xa9\xb9\x29\x2b\x84\x00\x5e\x9d\xc7\x28\xb9\xf9\xdb\x92\x01\xb1\xa6\x14\x6c\x3f\xf0\xba\x10\x28\x40\xea\x38\xbf\x70\x1a\x7e\x59\xad\x95\x92\x50\xca\x06\x0a\x8d\x8d\x7a\xbd\x68\x7d\x72\x56\x5e\x2a\xc2\xbd\xea\x24\x62\xe3\xa6\xeb\x50\x27\x71\xc8\x86\x82\xd2\x43\xac\x83\xd4\x3c\xc1\x46\xdb\x43\xa3\x9f\x2a\x18\xf9\xcc\x52\x2b\x45\x6c\x03\xe3\xa2\xb9\x03\x51\x7f\x51\xae\x92\x26\xd2\x98\x50\x2a\x2b\xa1\xda\x67\xdd\xff\xe7\x04\xd5\x84\xec\xef\xaf\xf0\x5f\xd3\xb3\x9c\x32\xa9\xdd\x9d\x24\x54\x8f\xe6\x1a\xa0\xf5\x5c\x7d\x41\x66\x38\x89\x55\xe0\x13\xe1\xf5\xba\xe8\xbb\x77\xc6\x93\x4e\x05\x69\xc4\x89\xdb\x18\xad\xca\x46\xeb\xa8\xd4\x48\x08\x39\x5b\xcd\x56\x81\x4e\xd0\x65\xfa\xf3\xf4\x96\x4d\x55\xc0\xa9\x22\x9a\x7a\x96\xc7\x45\xf1\x02\x79\xeb\xbc\xba\x40\xe8\x34\xe8\xc6\x52\xc4\x70\x66\x61\x0f\x08\x03\xdf\x57\x23\x19\x41\x37\x28\x24\x14\x01\x49\x0e\xb0\x6f\xfb\x1d\x67\x3d\x61\x15\x86\xd4\x04\xae\x9e\xf8\x55\x3a\xf3\x72\xda\xa8\x30\xb2\xe9\x5a\xdf\xed\x50\x3f\x41\xf5\x5c\xeb\xcd\x45\x87\x8b\x0a\x63\xe9\xbb\x44\x37\x4e\xcd\x6f\xb8\x46\x55\x98\xa4\x9e\xaa\x6f\xff\xda\xc7\x6c\x17\xdf\x5e\x85\xc6\x96\xc9\x2c\x12\x70\xf1\x52\x01\x22\x1e\x27\xd6\x40\x45\x81\xb4\xb2\x32\xad\xd7\x70\x2b\xea\xa5\x0b\x98\x7a\x4b\xae\x22\xa0\x32\xb5\xd8\xd1\xae\x03\x98\xaa\x58\xd9\x14\x73\x5f\x5b\x5c\x1c\xa7\x71\xbe\x8a\x75\x82\xdd\xe0\xf7\xd0\x54\x65\x51\x1e\x60\xf4\x11\x63\xb0\xcc\xb2\xaf\xa2\xc6\x52\xe1\xf8\xdc\x84\x12\x04\x61\x8b\xca\x39\x8e\x37\x15\x74\xaf\x21\xe1\x16\xfd\xd2\xee\xb5\xa5\x1c\x7c\xf9\xfe\xc9\x68\xa8\x6c\xe7\x73\x71\x11\xb4\x29\x4a\x43\x2c\x62\x2f\x0f\xde\xde\x28\x4a\x13\x96\x0c\x55\x40\xde\xb3\xd6\xa6\x20\xec\x75\x9e\x02\x83\x2a\x2a\x00\x6d\xd4\xe3\xf5\x6a\xf5\x34\x7a\x34\x26\x0d\x17\x9e\x1c\xa3\x7d\x3d\x73\xfd\x2d\x8a\x19\x86\x0c\x07\xf7\x65\x76\xf8\x65\xfe\x47\xf1\x90\x04\xee\xd3\xbb\xb6\x3a\x51\x89\x83\x37\x8d\x2a\x8d\xa2\x38\xed\xd9\xc9\x86\xed\xa8\x43\xdf\xe7\x9b\x7f\xfc\x85\x62\x8d\x2f\x5e\x9f\xec\x52\x76\x79\x78\x7f\x34\xd1\x30\x64\xb2\xfa\x75\x77\x87\x4a\x39\x41\x38\xe5\xb6\x9d\xcf\x15\xe4\x37\xa2\x3a\x74\x99\x36\x25\x02\x8b\x7b\x7a\x5a\x6c\x86\x6c\x2c\x54\x89\x28\x0c\x65\xa7\x22\xe3\xdb\x01\x75\x77\x38\x89\x31\x64\xcf\xc5\xc7\xaa\xc0\x4e\xbc\x76\x7e\x6f\xca\xce\x95\x57\x32\xa6\xc8\xe0\xa5\x5a\x33\xfd\x67\x79\xfa\x1e\x22\xa5\x64\x0a\x14\x17\xa9\x7a\x05\x7d\xca\x61\x08\xc9\xbd\x20\x7f\xa4\x4a\x2a\x8d\xd8\xa9\xe2\x74\xc0\x44\x6a\x73\xaa\xc0\xd1\xc0\x79\xeb\xa3\x82\x38\x1c\xea\xed\xdb\x76\x38\x0f\x15\x79\x80\xe6\xa3\xac\xde\xe6\x2a\x62\x4a\x27\xb6\x5b\xe2\x5e\x7c\xda\xf9\x53\x94\x1a\x6a\x27\x14\x31\xe4\xc8\xe2\xfe\x04\xae\xb0\xcc\x86\x5b\xd2\xfe\x5e\xbc\xf5\x2f\x18\xc2\x04\x2d\xc1\x7a\x6a\x94\xa1\x8d\x79\xfb\xde\x9e\x61\xf7\x91\x02\xae\xd0\x2e\xfc\x10\x85\xae\x1f\x8b\xd9\xd9\x79\x9a\xb2\xbf\x53\x05\x82\xa3\x9d\xff\x87\x38\x67\xa3\x05\x01\x02\xa4\x4f\x10\x77\x48\xcc\xee\xa0\x24\x26\x72\x65\xd2\x09\x5b\xf2\x8c\x31\x35\xc2\xe0\xfc\xbc\xbf\xff\x16\x6f\xac\x8c\x64\xc2\xd9\x88\x2b\x31\x45\xcd\x2b\x23\x25\xee\x0c\x15\xbc\x43\x71\x82\xb1\xe3\xa5\x03\x47\x39\x88\x12\x95\xf5\xeb\x53\x99\x15\xcd\xd5\x19\x9d\xaa\xb2\x1a\x61\xfe\x35\x49\x02\xe8\xc1\xc6\x1d\x10\x65\xe8\x45\x0c\xc8\xfe\xda\xf1\x04\x9b\xe2\x5b\x87\xbe\xbe\x03\xd3\xac\x8b\x9e\xc4\xb4\x3d\x9c\xd2\x9e\xce\x6f\xca\x95\xe7\x9c\x27\x37\x36\x8c\x00\x95\x36\x5d\x77\xb9\x7f\x9f\x3a\x94\xc6\xe7\xc7\x76\x20\x0e\xa3\x97\xad\xa3\xd8\xe0\xc6\xea\x62\x94\x27\x71\x2e\xcd\x45\xbb\xdf\x78\xdb\xd3\x71\xa0\x31\x60\xb5\x9e\xa1\x8b\xcb\xc6\x2f\x54\xc7\xa9\x56\xc8\x13\x7a\xc8\x3a\x31\xb3\xd9\xad\xf4\x6f\x93\xf3\x3c\xa9\x05\xe6\x75\x4e\x47\xd7\x91\x3b\x19\x04\xa9\xee\x41\xa1\x57\xe7\xdd\xe7\x6f\x97\xb3\x4f\x27\x71\x8c\x7b\x52\x7d\x3a\xfc\x10\x95\x5e\x8a\xe3\x53\x05\xeb\xe5\x23\xf1\xcf\x4e\x75\x80\x4d\x45\x77\xd0\xd4\x46\x64\xa3\x62\xb3\x66\x61\x8c\x04\x49\x08\xb6\x30\xa2\x9f\x0c\x4c\x5b\x79\x77\xa1\xf5\xee\x23\x2b\x66\x61\x29\x9a\x33\x83\xcd\x48\x87\xb3\x95\x44\x13\x79\x2f\x31\xec\x86\xa4\x51\x80\x09\xfc\x9b\xd6\x9c\x75\x98\xdd\xee\xa0\xc5\x50\xee\x6b\x70\x0d\x28\x0e\x7e\x4f\xe7\x6a\x1f\x3a\x4d\xb8\x72\x9f\xf8\x0e\x61\x94\xc7\xae\x10\xaf\x53\x6a\x03\xbc\xbd\xdf\x0a\x50\x15\x7e\xbe\x04\xa0\x05\x01\x36\x10\x14\x5f\x14\xfa\x6e\xc6\x79\x9e\x7c\x33\x11\x31\x2b\x1e\xda\x94\x05\xf8\x5e\x25\x7f\x2c\xa6\x4c\x79\x7c\xce\x7f\xcf\x0b\x63\xb2\x3c\x1b\x09\x76\x9d\x06\x50\xa8\xf9\xea\x8c\x16\x49\x2c\x22\x9f\xe8\xec\xba\xe8\xbf\x00\x94\x68\xa1\x34\x96\x9a\xb1\x34\x98\xa4\x93\xb9\xa3\x02\x82\xf5\xe4\xab\xcd\xcd\x45\xe7\xfa\x5f\x51\x6f\x5f\xbe\xfc\xcf\xaf\xaa\x21\xdf\x02\x31\xb4\x22\x09\xee\x4f\xe8\xbe\x4d\x68\x0d\xbb\x21\x42\x77\x5e\xc2\x27\xa6\x6f\xa2\x85\x05\x2e\x67\x65\xf1\x04\x95\x47\xc7\x4e\xcf\xa3\x0c\xe5\xb1\x91\x09\xc4\xbf\x77\xc5\x63\x74\x4d\x1d\xe2\xd0\x73\xf3\x4d\xa6\xa9\x92\x04\x6b\x36\xae\x27\x65\x42\xee\x44\xb5\x52\xdc\xb3\x27\xb4\x3e\x59\x7b\x03\x45\x53\x56\xe7\x79\x7f\x58\xeb\x80\x02\x99\x42\xa3\x22\x0f\x4b\xd4\x5a\x59\xaa\x8c\x9b\x2c\xcf\xaf\x4e\xe7\x71\x3c\xff\x3f\xc2\xce\x27\xdf\x5a\x2b\x20\x8e\xf0\xda\x95\x2d\x67\xca\xbb\x1a\xe2\x10\x31\xa0\x3d\xf3\x65\xdf\x05\xe2\x87\x88\x24\x01\xb7\xe9\xac\x9a\xd7\x5d\x39\xd5\x76\x9d\x37\x57\xa0\x43\xa7\xd6\xaa\x01\x0e\x7b\x83\x8a\x25\x5f\x3d\xca\x78\xa9\x81\xd1\x88\xe2\xff\x3f\xa8\xca\x1f\x65\x39\x56\x58\xf9\xe5\xde\xaa\x4d\x10\x61\xa7\xef\x66\x75\xb3\x5f\x6e\x56\xd7\xeb\xdd\x76\xff\xb4\xda\xec\x17\x7f\xac\x7d\x81\x4b\x9b\xc8\xd6\xd5\x71\xe5\xa3\x42\xb3\xd7\xde\x1b\x7f\x66\xd3\x7a\xfe\xb6\x86\x3c\x62\xf5\xbb\x2f\x2b\xe8\x59\xfd\x28\x04\x21\xc5\x36\xed\xbd\x23\x87\x9c\x68\x63\xb8\x51\x24\xe1\x86\x4f\x65\x95\x47\xaf\x0d\x08\xb5\xfd\x64\x3d\xaf\xe3\x06\xd0\x41\xbd\x13\xed\x9f\x06\xdc\x8e\x03\xb2\x35\x0a\x44\x2a\x34\x26\xeb\x42\x97\xe8\x3d\xf9\x03\x21\x05\x4b\xc2\x22\x9a\xbc\xac\xf4\x18\xd4\x09\x21\x58\x7a\xdb\x0a\xd4\x59\xe5\x56\x8d\xaf\x67\x68\x80\x88\x58\x30\xbc\xc0\x26\xdf\x03\x06\xdf\xb3\x56\x1d\xa2\x90\xa7\xae\x0c\xfc\x00\x9f\xcd\x3d\xb4\xf1\xf0\x93\xd3\xb6\xfd\xd6\x46\x42\x64\x94\x71\x1d\x7c\x57\x63\x4c\xf5\x78\x5c\x1c\x04\xb8\xbb\xf8\xed\x62\x16\x5f\x0d\x71\xca\x24\xed\xd7\xa5\x77\xef\xe7\xef\x3a\x16\x60\x29\xca\xd4\x71\xf2\x63\x49\x98\x62\xe6\xdc\xb5\xaa\x89\xfc\x36\x33\x23\x40\x0f\x24\x51\x80\xb5\xae\xed\xdd\x3f\x26\x7f\x97\x98\xb5\x45\x72\x67\xb2\x5f\x2c\xad\xe2\xeb\x05\xee\x07\x12\x13\x22\x77\xea\xf6\xb5\xfc\xd8\xbb\xfb\xdb\x9b\xb2\xda\x97\xf8\x9e\xf7\x1e\x19\x06\x2c\xa6\xa9\xf2\xa5\x6a\x4c\xf4\xfe\x10\xf5\xa4\x28\x03\x8c\x59\x9a\xba\x1a\x9a\x55\xd1\x54\xe7\x19\xc2\x1a\x60\x26\xc6\xbe\x96\xed\x6e\xb1\x5b\xed\x1f\x7f\x3e\xac\x3c\x25\x0e\x70\x62\xab\x0a\x36\x86\xf8\x09\xd9\x7c\x88\x02\xdc\x41\xfe\x31\x0c\xae\xad\xde\x64\xd6\xd9\x0a\xe0\xc2\x36\xb5\x36\xa2\x7a\x81\xc6\x67\xd0\x21\x85\xd4\x75\x71\x21\x7e\xa5\x67\xa9\xfb\xd6\x84\x80\x60\x42\x5b\xf0\xcb\x27\x8a\x19\x4c\x59\xc3\xbe\x38\x4b\xd8\x0f\x70\x7d\xbb\x5c\x74\x24\x4a\x20\x25\x24\x56\xa3\xe3\xc3\x37\xf4\x7f\xeb\xca\x81\x0a\x88\x45\xbc\xe6\x20\x2a\x47\xae\x36\x10\x84\x9a\x0e\x66\x01\xf7\x0f\x88\x12\x4e\x21\x1f\x65\x7f\x40\x45\x41\x27\xf4\x61\x5b\xdd\xfe\x04\x51\x59\xbd\xf1\xde\xb0\x79\x4a\x08\x50\xc6\x18\x9b\x53\xde\xcb\xc6\xc7\xde\xa0\x13\x1a\x41\x4f\xd9\x53\x47\xe1\xb8\x84\x05\x90\x58\x8d\xd7\x21\x6e\xfd\xa9\x82\xcb\x4e\x5e\x00\x6a\xb4\xe3\x69\xdd\xd7\xea\xb5\x82\x43\x3d\x50\x47\xa7\x00\x82\x61\xa8\x91\xa3\xd2\xac\xdf\x67\x3b\x19\x1d\x0a\xc6\x58\x66\x8e\x6b\x68\x44\x96\x83\xb6\xc8\xb9\x19\x7d\x0c\x3b\xde\x04\x4c\x20\x7e\x57\x66\x2f\xb2\x3c\x60\xd2\x7d\x9b\xbd\x8c\xd0\x59\x26\x50\x12\x9b\x79\xaf\x45\x95\x95\x88\x27\xcc\x6a\x9b\x6b\xec\x46\x40\xc2\x6c\x46\xef\x0e\xc4\xb1\x7d\x85\xa3\xf7\x66\x88\x4a\x7d\xc5\xe8\x29\x9b\xc6\x32\x86\x18\x9d\x10\xdf\x9a\x36\x9a\x04\x6e\x40\x18\x58\x7e\x85\xbb\xf2\x65\x89\xfa\x95\x16\xf1\x34\x56\xb0\x9c\x9c\x92\x30\xc4\xc7\x2c\x5e\xaa\x72\x07\xea\xb5\x0d\xda\x87\x06\xc1\x84\x02\xd0\x50\xc8\x0e\x03\x60\x42\xe0\xd8\xd2\x85\x41\xc2\x70\x63\xf4\xc7\x8d\x4e\x1c\x45\x0b\x6e\xdc\xfd\x86\x6d\x62\x6e\xb3\x35\xa6\x02\x18\xe6\x41\x4d\x2c\x64\xe8\x68\x46\xb7\x03\xd1\xa3\xf1\xcd\x26\x89\xa5\x5d\x6c\xcd\xb4\x50\xbb\xf2\xe1\xee\x66\x3a\x82\x11\x5c\x3d\xbd\x82\x1b\xb2\x57\x4e\x5d\x32\x93\x08\x9b\x74\x28\x8f\x50\x6c\x5f\x4b\x0f\xb8\x34\x54\x70\xfc\x84\x98\xc0\xac\x10\x42\x3f\x3e\x91\x6a\xee\xd1\x39\x8f\x32\xcf\x5e\xec\xbb\x1d\xe6\x36\x7d\x52\xd2\xb0\x20\x41\x56\xb9\xed\xb1\x3c\x35\x97\xcd\x7b\xdf\xae\x5f\xc3\xc2\x84\xb9\x9a\xc1\x36\x7b\x99\xee\xb3\x86\x25\x31\x42\xe9\x0f\xa2\x2a\x47\x12\x7d\xd4\x70\x42\x29\x77\x00\xfd\x21\xaf\x8c\x3f\xcc\x24\x46\x14\x3f\x4f\x87\xac\x78\x99\x05\x6c\xba\x91\x69\x94\xe0\xce\x06\x9f\x48\x9e\x57\x2d\x10\xa4\x0a\x7a\x7d\x25\x8a\xb7\xeb\x4a\x98\xee\xe3\xa5\x9c\xe3\x07\xbf\x5f\xfc\xb1\xbf\x5b\x3d\xdc\xee\x7e\x74\x47\x52\x2b\x10\xb4\x52\x65\x5e\xbe\x64\x4a\xe4\xdb\xd7\x0c\xba\x86\x23\x93\x6a\x01\xa4\x5b\xf1\x33\x65\x2c\x23\x03\x6e\x69\x53\xdd\x56\xf8\x73\x58\x67\xe8\x1f\x4b\xc6\x6c\xd4\x6f\x89\x45\xcd\x39\x4b\x4b\xba\x0c\x83\x91\x26\xd2\xce\xa8\xad\xbf\xc2\x4e\x19\x15\xda\x5e\xff\xf6\xf7\xb3\xe2\x04\x6b\xe5\xbb\x7b\x8d\x4a\x54\x10\x79\xd4\xd7\x44\xf0\x91\x1a\x1d\x04\x56\x7e\xf1\x24\xa7\x30\x37\x3f\x22\x8c\x39\x73\xd2\x9f\x95\x1e\x94\xeb\x8d\x4e\x29\x82\x1b\xac\x9d\x71\xbc\x36\x93\xa7\xe9\x1e\x43\x8b\x10\x3b\x35\xd7\xcb\xc7\xfd\x66\xb1\x5b\x45\xdd\x55\x40\x23\xc7\xad\xc8\xda\x99\x60\x85\x44\x9e\xa0\xda\x55\x1d\xc0\xd8\x00\x61\x9e\xc7\x73\xd3\x65\x78\xbd\xb6\x65\xdd\x8d\x62\x22\xb4\x8e\xdf\xa1\x7c\x87\xe9\xfd\x0c\x03\x56\x03\xed\x5a\x1e\xe4\x8b\x7f\x87\x42\x4f\x7b\x6c\x8d\x09\x03\x0c\xfb\x84\xd6\xbf\xc3\x6b\xa6\x2e\x29\xc6\x2e\x5a\xd2\x67\x9d\x2f\x63\x78\x82\x24\x31\xae\xa4\x87\xcc\x38\xf3\xe4\x8d\xd4\x18\xb0\xfc\xbb\xbe\x55\xeb\x2e\xab\x5d\xe1\xe3\x5e\x1c\x47\x37\xc8\x02\x12\x86\x08\x1b\x75\xf1\xdc\xe5\xbc\x64\x01\xa1\xb6\xe3\xa0\x86\xa6\x63\xf9\x9f\x0c\x09\x89\x44\x5a\x0b\xf8\x04\x75\x6a\xca\x6a\x91\x67\xef\xee\x13\xb3\x20\xe4\x31\x82\x3e\xea\x32\xd7\x57\x00\x15\xe6\x89\xba\x83\xd2\x02\x32\x0c\xf8\x3e\x0b\x51\x9d\x9f\xca\xb1\xbd\x67\x41\x14\xd8\xaf\x57\x97\x55\x33\x51\xe2\x74\xb3\xa3\x1d\x23\x12\x47\xe3\x8b\x9e\xa4\x63\xb8\xbc\xca\x9a\xf6\x17\xfb\x70\x69\xfa\xa2\xa7\x99\x50\x16\x44\x8a\x25\x5d\xe3\x23\x26\xc0\xda\x57\xd8\x75\x76\x4e\x08\xb8\x58\x90\x84\xb1\x8b\xbc\x1a\x87\xbc\xb5\x7a\xdc\xe3\x97\x44\x09\x45\xac\xd3\xd1\xd1\xc4\xf4\x4e\xca\x06\x54\x76\xcc\xc0\xef\x11\x2c\xa0\x5c\x23\x22\x16\xf7\x3f\x4b\x67\x70\x81\xbd\x9b\xfb\xf6\x2c\xa0\x22\xc4\x79\xe2\xca\xb5\xcf\x83\xca\xe7\xe0\x1c\x9b\xd4\xfd\xdb\xe4\xfe\x74\x88\x34\x62\xd7\x95\x78\x29\x8b\x5d\xbb\x88\x4e\x15\xcc\x03\xdd\xc7\x67\xb2\x20\x62\x5e\xd2\xee\x4b\x97\x71\xfe\x7e\x59\x64\xf9\x3a\x84\xd6\xde\xea\x8e\x68\xe1\xbe\x0b\x49\x58\xc0\x62\xc1\xbd\xb3\xe6\xb7\x1d\x57\x3b\x99\xbc\x2e\x7f\x82\x02\x14\xa6\xb1\xcb\xfe\x49\xd4\xf5\x6f\x93\x01\x46\x61\xbe\xf7\x28\xce\xd2\xe7\x58\x69\xfc\xb7\xe9\x17\xe7\xc4\xb6\x0f\xb9\xbf\x6f\x97\x98\xcd\xcf\xda\x07\x1f\x91\x73\xb1\x80\xc7\x09\x62\x3c\x7e\xcf\x54\x53\x56\xe7\x3f\x7e\x19\x17\xb3\x80\xd3\x64\x54\x68\x46\x38\xf5\x4d\x59\x2d\xcb\x3c\x07\xd5\x64\xf2\x0b\xa2\x42\x16\xa4\x54\x28\xdb\x72\xad\xef\xda\x4d\xe8\x77\xa8\xea\x21\xb9\xd1\xf8\xb3\x89\x34\x44\xcf\xb9\x86\xe6\x0e\xbd\xc7\xa0\x77\x60\xda\xa3\x02\x73\x50\x35\x2a\xee\x5f\x43\xd6\x9c\x27\x13\x5a\x06\xc4\x96\xce\x1b\xf1\x02\x1d\x18\x82\x05\x32\x24\xae\xa9\xd0\xf2\x4c\x3c\x89\x73\xb7\xde\x25\x48\xcc\x76\xb8\xaa\xd4\x16\xf2\xbc\xef\xdc\xbf\x7c\x20\x15\x13\xe9\xb2\x37\x43\x6c\x6a\xeb\x2a\x63\xbf\xe2\x30\xc0\xfa\x6a\xa6\x7d\x31\x77\x14\x04\x58\xab\xaa\x85\x81\x5b\xe4\x3f\x1b\x0a\x96\x4d\x06\x6b\x16\x20\x37\xc5\xb6\xc9\x8a\xb7\xf3\x5d\xfb\x3f\xfe\x89\x80\x87\xba\xe7\xfa\xbb\xa9\x00\x9e\x8b\x26\xcb\x2f\x48\x83\x59\x60\x48\x80\xae\xcc\xa9\x86\x4e\xa1\xef\x62\x3b\x65\x81\xe1\x56\xe8\xc4\x6f\x2c\xb8\x5d\x7e\x81\xbc\xf5\xa7\xa8\x48\xba\xbc\xdb\x52\x1c\xe7\xb0\x19\xed\x18\xca\xd1\x21\x3d\x15\xba\x12\x59\xdd\x95\xc0\x18\x21\x94\x43\xd4\x15\xf6\x51\xb8\x76\xab\x32\x28\x14\x4c\x3b\xd1\xdc\x09\x61\x10\x47\x51\xcf\xf3\xfa\xc5\xa8\x28\x4e\x53\x1b\x9a\x18\xb8\x1e\x3f\x24\x89\x62\xdb\x13\x23\x14\xd6\x84\xfd\x9d\x44\x22\xc2\x29\x99\x97\x2f\x2f\x63\xf9\x9b\xf1\xe9\x89\xa3\x5e\xb1\xe2\xf5\x73\x1b\x34\x23\x09\x53\x88\x5f\xec\x09\xba\x76\x20\x0e\xdb\x06\x8e\xe1\xf4\x6a\xd2\x12\x75\xb7\x7e\xc5\xd3\x66\xbd\x5c\xf9\xdb\x49\xb4\xf1\xa4\x23\xcf\x45\xf9\x51\x80\xf5\x5d\xe6\xde\x2f\x49\x8c\x49\xba\x66\x70\xc4\x62\x0f\x9a\xe3\x18\xa1\xc4\xf2\x03\x5a\x58\xdb\x84\x57\x9e\x11\xc6\x40\x3a\x5c\xed\xf6\x08\x79\xbe\x90\xd8\x57\xb3\x2c\x1d\x16\x82\xbb\x71\x3c\x0a\xec\x7e\x3d\xaa\xbc\x8d\x35\xba\x19\xe1\xdc\xb2\x1b\xd4\x96\x50\xe6\xbe\xd4\x60\x95\x3f\xbb\xe5\x4d\xb8\x26\xc4\x59\xb0\x6e\x87\xbb\x4c\x3c\x32\xc2\x21\xe4\xb6\x57\x42\xc2\x77\x9a\xe2\xed\x48\x86\x8d\x7a\x2a\x2f\x6b\xf8\x09\xf0\x96\x9f\xed\x96\xd9\xdd\x95\xf1\xd2\x7e\xa2\x52\xaf\x7f\x2f\xe5\x97\x79\xc6\x0b\xa9\x29\xfe\xd7\xbf\xfe\x8a\x87\x52\xfa\x5f\xe8\x51\xb9\x5f\x4a\x63\x4b\x24\x62\x09\x0f\x6c\xa6\xaa\x7d\xc0\x47\x33\xc9\x9a\x32\x92\xd2\x10\xab\x35\xb7\x8b\xfb\xd5\x1e\xd1\xd2\x3e\xd9\xc2\x48\xca\x03\x24\x92\xdc\x1e\x45\xf1\x36\x2b\x29\x39\x6b\x2d\x88\x88\x34\xee\xf4\xd7\xab\x9b\xc5\xf3\xdd\x6e\x7f\xf7\xb8\xfc\xc7\x7e\xf9\xb8\xdd\x61\x7a\xf3\xc7\xe3\xf3\xc6\xff\x82\x50\x02\x1b\x91\x0b\xf8\xd8\x82\x1a\x45\x58\x5f\xf8\x85\xfe\x44\x50\xcc\xca\x10\xee\x2a\x81\xac\x5b\xc3\xf8\x9a\x11\x19\x2b\x6c\x1f\x12\xd6\x59\xda\x9e\x0e\xb7\x1f\x9e\x87\x97\x11\xa9\x89\xd2\xa3\x24\xc7\x75\xaf\xd1\x33\xf9\x25\x09\xb6\xc1\x16\x55\x21\xdc\xdf\x34\x35\xa9\xcb\x13\xed\x36\x4b\x3f\xfb\x2e\xd0\x1f\x8c\x68\x4e\x70\x3b\x75\x85\x1b\xc8\x41\xfe\x36\x43\x7c\xcd\x08\x10\xdb\xe2\xfb\xf7\x32\x2b\x50\x95\xab\xb6\xd0\xde\xdf\x2e\xdf\xb3\x5f\x0a\x10\x53\x6d\xdb\x94\x3f\x37\x18\x57\xac\xbb\x0f\x07\x10\x28\xda\xd9\x64\x8b\xb8\xb2\x6e\xc1\x60\x66\x83\xe1\xb1\x1e\xc2\x0f\x7e\x66\xc5\x85\xf7\x4b\x4c\x1a\xe3\x96\xea\x8b\xe8\x5b\x68\x9e\xd7\xbf\xc8\x95\x32\x62\x04\x4b\x9d\x03\xd7\x7a\x84\xed\x7c\x9f\x75\xd6\x59\x18\x28\x89\x75\xe4\x89\xda\xd9\xf4\xdf\xf1\xe4\xfb\xf6\xc7\xc3\x00\x02\x2c\x88\x42\x3b\x75\x06\x11\x33\x0b\x03\xe3\xe8\x9f\xc5\xa7\x2d\x24\x0e\x93\xe8\x2c\x24\x2a\xa0\x28\x79\xb3\x7a\xd8\x8d\xce\x23\x3a\xc5\x24\xd4\xea\x90\x55\xa2\x81\xba\xe7\x2d\x60\x21\x01\x89\x99\x46\x4b\xe0\xb7\x3d\x17\x3a\x53\xa2\x01\x9b\x59\xf6\xcb\x2c\x0c\xd3\x14\x59\x24\x91\x14\x01\x45\x09\x06\xed\xa1\x2c\x8c\x42\x2b\x87\x5a\x43\x73\xfb\xb4\xbd\xcf\x8a\xd5\x44\x80\x91\x85\x11\xa3\x44\x74\x5d\xd4\x68\x65\x6f\xca\xea\xba\xfb\xe8\x61\xa4\x34\x3e\xf6\xe2\x9f\xcf\x8b\xc7\xf5\x83\xff\x73\x1c\xd8\x22\x45\x47\x92\xe1\xb1\xc9\xbf\x04\xfd\x4f\xff\xff\xec\xca\x1c\x06\x0e\x61\x4c\x03\x4d\xba\xe6\xec\xf7\x4c\x63\x96\xfe\x58\x66\x53\xd2\x32\x16\xc6\x90\xc4\x6e\xe5\xcf\xf9\x75\xbf\xd0\xbf\x9d\x1c\x1e\xda\xe1\x30\x36\x94\x5b\x16\xa5\xf6\x53\x3d\x1e\xe1\x82\x06\xcd\x0d\x4c\x28\x0d\x5d\x96\x6d\x3d\xf0\x7c\x46\x6f\x3d\x51\x31\x32\x14\x6d\x9b\xf6\x6a\x2f\x99\x7a\x12\x55\xd3\x06\x81\x5f\x4c\xe7\xc4\x08\xcc\xc7\x2f\xad\x86\xc5\x8b\x87\x46\x4c\x9e\x9e\x12\xcb\x9c\x92\xd5\x4f\xe2\x8c\x9c\x81\x05\x36\xec\xdd\xb4\xb1\x63\xee\x3f\x1d\x65\x81\xec\xb0\x63\xc7\xb2\x72\x8b\x54\x97\x1f\x57\xe7\x1e\x6e\x37\xbe\x01\x2a\xc1\x8b\x74\xed\xb1\xb8\xbe\xd7\x53\xd2\x78\x16\xb2\x28\xc5\xbc\xde\x2d\x34\xd7\xe5\x41\x64\x05\xa6\x8f\x46\x6f\x91\xd1\x08\x61\xa9\xad\x1f\xb7\x1f\x13\x8b\xb0\x90\x13\xdb\xa9\xe0\xbe\xdc\x4e\x7c\x4e\xd2\x67\x2c\xe4\x46\x74\x80\x8b\xf3\xb2\x12\xd9\xcb\x6d\xd5\x49\xef\xb3\x30\x0d\x15\x6e\x96\x96\xad\x67\xd5\xbc\x3a\x40\xbf\x3b\x2c\x82\xc4\xf8\x76\x47\xe7\x45\x0f\x99\xa3\x58\x28\x04\xa1\xce\x03\x7b\xaa\xca\x23\x54\xcd\xf9\xde\xbb\x92\xc4\x55\xa2\x87\xde\x50\x28\x49\x1c\xbb\x06\xeb\xec\x70\x3a\x38\xa1\x08\x7f\x39\xad\x92\x10\xbc\xea\xe0\xea\xf3\xf8\x5c\xb4\x6e\xf1\xe4\x91\xb4\xb2\xfd\x52\x58\xd7\x7d\x2c\xdc\x37\xf3\x97\x00\xc5\x90\xa3\x0e\x3f\xb7\x8d\x27\xb2\xe6\xec\x39\x51\xfd\x28\x13\x59\xb6\x15\x9b\x60\x79\xfa\xfd\xc9\xaa\x69\x4f\xd1\x17\x2c\x34\x89\x40\xc8\xf4\xb1\xea\x09\x8d\xe7\x13\x1e\x2c\x34\xc6\x8a\xbb\xc8\xd3\x19\x19\x78\x3a\x7f\xd4\x1e\x8f\x82\xd8\xea\x63\xbc\x94\xfa\xb9\xc0\x96\x03\x7f\x84\xa8\x18\x11\xc2\x42\xeb\xe7\xda\x91\x84\xdc\x95\xaa\x6b\x97\x99\xff\xc1\x88\x98\x88\x74\xc2\x04\x9f\x13\xf6\x11\x16\x85\xc4\xf2\xce\x78\x02\x8d\x41\x0b\x0a\x8b\xc2\x50\x63\x05\xee\xfa\x79\x63\x3b\x3d\xb6\x8b\xbb\xd5\x76\xb7\xb8\x5d\xdd\x2d\xb6\xbb\x6e\x54\x4c\xb0\x6c\xfd\x75\x4f\x2d\x21\xbd\xff\x43\x82\x41\x57\xed\xd0\x22\x45\xa1\xa6\x2a\x1e\xf5\x8d\x79\xf8\xc2\xb7\x4d\xde\x2c\x0a\x4d\x2a\x2c\x93\x8d\x4b\xa7\xe1\x76\x5c\xdf\x96\xe5\x53\x55\x6a\x97\x82\x99\x7f\x3b\x11\x0f\x70\x75\x6d\x5f\xb3\x63\x26\x7e\xeb\xfe\x6a\xa9\xb9\x56\x7f\xae\x8b\xa2\x7c\x77\x94\xf8\xdd\x3e\x12\x45\x10\x12\x54\x03\xf9\x98\xa6\xdc\x06\x57\x36\x2c\xb0\x04\xf2\xbf\x8b\x3c\xd3\xdb\x41\x2f\x84\x1b\x11\x53\x86\x20\x85\x1d\xd4\xcd\x32\x6b\x3a\x04\xb5\xa7\x2d\xfb\xe2\xc2\x49\xca\xad\x14\x49\x75\xf6\xba\x4a\x03\x7a\x03\x16\xd1\x88\x0b\x1b\x2a\xb7\xeb\xfd\xd6\xe5\xeb\xbd\xb7\x15\xd1\x04\x70\x5f\xbd\x05\x91\x43\xd1\x3d\x32\xe5\x02\xfb\x92\x3b\x55\xed\x11\x32\xee\x02\x09\xc6\x22\x16\xcb\x90\xb8\x12\x3e\xd6\x1b\xba\xdb\x9e\xee\x49\xc3\x6f\xcc\x40\xa1\xde\xc3\xed\xe7\xc2\xea\x20\x8e\x67\x23\x03\xa5\xd2\x01\x63\x48\xd3\x23\x03\x66\xf3\x02\x11\x8f\x15\x71\x6a\x59\x21\x54\x2a\x0c\xfc\xf3\xa4\x01\x89\x8c\xab\x90\x7c\x15\x6c\xf7\x0e\x56\x94\x32\x8d\x78\xf0\x4f\x71\x6a\xb7\xea\x5b\x51\x0f\x1a\x41\x58\x24\xa9\x45\xf7\xcb\x53\xd3\x94\xc5\x32\xcf\xd4\x5b\xb7\x48\x64\x2a\x91\x2e\xe2\x66\x77\xe3\xbd\xcb\xa1\x43\x12\xa9\xc0\xb1\xb9\xe6\x13\xbf\x95\x8c\x7c\xc4\xa8\x35\x6b\xac\x47\x15\x21\x4a\x79\xea\xe2\x45\x8a\x11\x64\xb7\xb4\xb6\x18\x83\x4e\xff\x3b\x9a\x46\x91\x1a\x44\x49\x43\x46\xa6\xc9\x5b\xd3\xa9\x65\x3f\xc9\x0a\x59\x7e\xae\xeb\xd5\xe1\x38\x4d\x98\x44\x10\x10\x7c\xaa\x9f\x16\x5b\x5b\x5f\x89\xfa\x0d\x9a\x4b\x80\xc6\xb7\xd9\xb6\x08\x22\x4b\x29\xea\xa5\x0f\xd7\xcb\x47\x35\x85\x01\xf9\xa1\x29\x8f\x2c\x8f\xcd\xc7\xaa\x98\x07\xed\xb2\x08\x20\x8a\x2c\xc9\xf2\xfa\x61\xff\xe3\xf1\xee\x7a\xb5\xd9\x2f\xae\xaf\x7d\x8c\x12\x19\x66\xa1\xbf\xad\x2f\x5b\xe6\x17\xa9\x08\x3f\x4a\xc5\x3e\xa4\xd8\x1f\x2b\xd8\xbf\x9d\xd5\x3e\x53\x65\x91\xfd\x67\x8f\x7c\x60\x7b\x0d\x45\x79\x70\xd2\x21\xa3\x1b\x88\x83\x88\x50\xcf\x62\x92\x15\x2f\xb5\x63\xec\xd1\xb6\xe8\x7a\x31\xb8\xd3\xa7\x5c\xbd\x0b\x59\x36\xdf\x21\x07\x58\x1c\x08\x92\xc6\xbe\x5f\xb5\xde\x95\xd6\x8f\xf8\xad\x3b\x4a\xad\x64\x5f\x0e\xa2\xda\x2c\xee\xbb\xbf\x2b\x83\xc5\xbb\xdd\xed\xfa\x66\x7a\x41\x0d\x48\x8e\x54\x08\xab\x0f\xd7\xed\xd9\x31\x49\x65\xe2\x2a\xfb\x8b\xac\xba\xcb\x4c\x73\x59\xdb\x67\x71\x28\xd2\x38\xbc\xf4\xf7\xa7\x19\xda\xde\x46\xcc\xbe\xee\x38\x0a\x63\x4b\x1e\x01\xed\xbe\x20\x72\xeb\xce\x8f\x24\xfb\xfd\x48\x41\x7b\x35\x54\x27\xde\x50\x2f\x06\x6e\x7f\x1c\x19\x81\xfb\xba\xec\x29\x91\x5b\xe3\x33\x61\x03\x63\x71\x2c\x68\x14\xf9\x76\xb5\x36\xbc\x1f\x38\xd3\x96\x75\xce\xfa\x2a\x7d\x66\x29\x4e\x38\x8d\xa4\x87\x21\x6c\x00\x75\xc0\x7c\xf1\x87\xc5\x49\x9a\x44\x7e\xdf\x6e\x44\xb5\xb6\x0d\x6e\xb3\xe9\x95\x38\x01\xc5\x2c\xcf\x13\x0a\x01\x79\x97\xa0\x1c\xd3\x8f\xb3\x98\xb2\x00\x0b\xcb\xb6\x9f\x67\x57\x7a\xf4\xc9\xf8\x2b\xb0\x20\x40\xb0\x6c\xb7\x1b\x3e\x55\xe5\x4b\x25\x0e\x93\x27\xe6\x91\x41\x2f\x6d\xb9\xd8\xa1\x50\xce\x25\xa6\xc1\x0d\x4c\x83\x44\x5b\x68\x77\x3b\xbd\x1c\x3b\xd1\x9c\x71\x8d\x53\x92\xf8\x06\x6a\xa1\xbb\xb9\x93\x12\x89\x8c\x14\x48\xdb\xd8\xf7\xa5\x4c\x4e\x65\x46\xa0\x56\x45\xb7\x2f\xc5\x29\x67\xb8\xd5\xa2\xac\x1b\x92\xb0\x60\x02\x1e\x0b\xcb\x93\x47\x4e\x21\x65\xb2\xeb\x58\x41\xc0\xcf\x16\x63\xda\x4b\xa9\x6c\x3b\xd7\xc2\xff\xfd\x1f\xf7\x13\x82\x70\xb4\x24\xc7\xb2\x6e\xc6\xf9\xad\x58\x0a\x21\x7a\x7f\xf7\xd1\xfc\x28\xf3\xbe\x13\x92\xc5\xad\x65\x34\x88\xc7\xb5\xef\x79\x91\xe7\x97\x02\x79\x2c\x86\x38\xc5\x0d\xe8\x58\xc1\x0b\x14\xf3\x18\xfd\xf1\xce\x1e\x83\x92\x24\x1c\x36\x2e\xb8\x77\x4b\x26\x2f\xd7\x84\x0c\xcb\xd0\xf7\x22\x6b\x1d\xd2\xd6\xf9\x43\x51\xde\x41\x51\x9f\x25\x41\x28\x22\xe3\xdb\xfc\x76\x20\xba\x1a\xce\x28\x8e\x4e\x02\x66\x85\x98\xf3\xf2\x1d\x9e\x2b\xbf\x99\x24\x61\x62\x9b\x34\x6a\xc8\xf3\x5f\xec\xc1\x49\x1b\x21\xa1\x99\x80\xaa\x91\x9e\xfe\x86\x25\x21\x73\x80\xe0\xf6\x69\xaa\xb7\xd3\x71\x3e\x69\x93\x84\x2a\xc4\x82\x5c\x07\x8b\x6a\x3f\xf5\x01\xee\xbb\x56\x66\x96\x44\x71\x84\x31\x8c\xca\x45\x76\xe8\x0a\x7b\x61\x77\x58\xdb\xae\x53\xdb\x77\xd7\x51\x86\xcc\x91\x2e\xcf\xff\x73\xba\x00\xf9\xb2\x24\x32\xda\xc3\x6f\x7e\x66\x85\xeb\x17\x98\x8a\x82\xb2\x24\x0e\xe3\x98\xfb\xec\x89\x99\x2d\x57\xb3\x24\x8e\x52\x8c\xb5\x0f\x59\x81\x13\xff\xa9\xcb\x26\x24\x89\x88\x2d\x11\x59\x95\xbd\xbc\x40\x1b\x51\xda\x7e\x48\x3f\x8f\x12\x1a\x58\x7d\xe0\xd5\xd5\x1a\xf1\x5e\xdd\xdf\x13\x8e\xc9\xce\xc3\xfe\xa9\x8d\x12\x74\xf7\x77\xce\xb1\xe3\xa0\xcc\xf5\x7d\x96\xe7\x59\x59\xac\x7a\x1d\x45\x96\x30\x4a\x0c\xe9\xd2\x8d\xcf\xe8\x86\x8c\x1c\xc4\x84\xb5\x0f\x65\x9f\x08\x0b\x55\x6d\x54\xf0\x4d\x8b\x09\x4b\x98\x50\xb1\xec\x7b\x8a\xdb\xbd\x7d\x6c\xe8\x12\x66\x54\xec\x68\x03\x77\x1f\xbf\x94\x4f\x76\x27\x71\xa1\xa8\x9d\xe5\xa0\xa0\x10\xf5\x04\xb5\xcd\x92\x94\x87\xae\x9b\xb0\x6a\xc3\xb6\x41\xf7\x54\xf7\xc3\x82\x68\xcc\x12\xe1\xc4\xb1\x2f\x76\x9e\xf3\xd9\x8f\x8f\x01\x33\xdf\x36\x01\xb3\x55\x65\x05\x8b\x42\x4f\xb4\x3f\x2f\x92\x2e\x93\x6b\xa4\x41\xec\xe6\xbd\xdb\x25\xc6\x3a\xcc\xe3\xa7\x14\x60\xd0\xa1\xdb\xfe\xb9\x44\x0a\x80\xb1\xdc\x15\x4b\x14\x35\xb4\x4f\x09\xe9\x61\xb3\xef\x70\xcf\x49\x14\x4f\x10\x5d\xaf\xa1\x81\xea\x90\x15\x6d\x24\x8a\xf4\x73\x98\xe9\xf4\x83\x52\x6e\xe3\x96\xd6\x26\x58\x38\x7f\xc7\x33\xcb\x12\x1d\x58\xe6\x75\x4b\xaf\xe9\x6b\x58\xcb\x76\x2f\xfe\x7f\x5b\xb7\x72\xf9\xa6\xf1\x8b\xd1\x3a\xc0\xea\xd3\x42\xeb\x27\x3b\x55\xfe\x01\xe7\x99\x26\x76\x96\x68\xc3\xb1\xd2\xfe\x56\x94\x1f\xb3\xe0\x50\x96\x40\xc8\xb1\x82\xde\x41\x4b\xca\x6a\xa8\xcf\x36\x7e\xc9\x20\x59\xd8\x77\x8e\xae\x3e\x33\x74\xde\x36\xe2\xbf\xbf\x9a\x8a\x93\xeb\x18\xe0\x40\xba\x8c\xc0\x9c\x87\x4a\x83\x48\x70\xea\xc9\xcc\x8d\x38\xe5\x0d\x86\x7f\x59\x73\xbe\x2a\x3d\x08\x96\xd1\x20\xb6\xa9\x2a\x99\x15\x9d\xa8\x03\xa3\x81\x26\xda\x11\x86\xb5\x5f\x0d\xa9\xf6\xba\x63\x10\xc7\x6e\x6f\xb8\x2b\xeb\x76\x3b\x1a\xdd\x1a\x25\x9c\xcb\x91\x98\x9b\x2b\x12\x8a\x6f\x98\xf3\xe6\x9f\x92\x46\x51\x40\x9d\x1f\x6a\x89\x7a\x90\xe3\x65\x68\x23\x68\xc4\x23\x2f\x9e\x68\x63\xd0\x1a\x06\xce\x12\x8d\xb8\xc2\x74\xb5\xc3\x9a\x39\xfe\xed\x21\xd6\x8f\xd1\x18\x64\xec\x9c\x63\x97\xd7\x5f\xd7\xf5\xa9\x5d\x67\x48\xd2\x34\xfb\x21\x69\x42\x48\x6c\x6b\x6e\x67\x91\x37\xe7\xd1\x56\x46\x93\x34\xf6\x75\x29\x97\x01\x18\xa6\xa1\x28\xe5\x20\x3d\x51\xf6\xce\x52\x14\xd6\xfd\x41\x13\xd9\xd6\xfa\xa6\xac\x60\xdb\x9c\xe4\x85\xb7\x3b\xb2\xe8\x94\xd1\x14\xfd\x1b\x93\xb9\xa2\x70\xbb\xbb\xae\x3c\x4b\x0e\xa3\x8c\xc5\x08\xc4\xfd\xb7\x6d\xf4\x99\x34\xd0\xb5\xc7\x01\xcb\x98\x8b\x3a\x17\x43\xa4\x18\xa3\x4c\x73\x69\x49\x8e\x90\x9d\x41\x7c\x76\x92\x88\x8c\x0a\x62\x61\xf3\x8e\x77\xe0\xa6\x2a\x67\x79\x5a\x19\x95\x32\x88\x61\x34\x1b\xca\x32\x9f\x9d\xaf\x3a\xb2\x19\x58\xec\x49\x40\x75\xfd\xd1\xdd\xe8\x24\x40\x2a\xdc\x83\x25\x48\x80\x29\x5e\xb6\x4f\x0c\x4c\xbe\x94\xd6\x14\x29\x65\x76\xeb\xd5\x26\x1a\x33\x84\x30\xaa\x41\x61\x58\xe8\x9a\x64\x1e\x6e\x3a\x56\xf7\xbf\x92\x8b\x96\x0f\x77\x0e\x40\x88\xf4\x18\xe6\xff\x43\x3b\x43\x77\x29\x21\x7b\x11\x84\xdf\x51\x79\xa9\x19\xc7\xe6\x2e\x28\xa7\x26\x4a\xe2\x68\x2c\x29\x56\x62\x8f\x92\x7f\x14\x13\x47\xc2\x76\x7e\x14\xaa\xac\xae\x45\x86\x59\xbd\x9d\x65\xb6\xcb\x3d\x1d\x30\x63\x01\xe3\x18\xdd\xfb\x0a\xef\x4d\x59\x3d\x4e\xa0\x49\x2c\x24\x80\x00\x13\xf7\xb2\x5d\x63\xe7\xf6\x3b\x99\x0a\xc6\xc2\x58\x22\x68\x43\x66\xc5\x4b\xe9\x7f\x2d\xe4\x09\x4f\x3b\xea\xc1\x66\xf1\xf2\x55\x57\x35\x63\x11\x21\x2e\x53\x5a\x56\x70\x93\xe5\x3d\xc3\xf9\xff\xe8\x38\x8d\x69\xd7\x18\x8b\x98\xc4\x6c\xb2\xef\x5f\x7f\xea\x28\x51\x98\xcd\xd7\xf8\x5e\xec\x46\xe4\x4e\x79\x7b\xf4\x79\x58\xa4\x53\xee\x32\x96\x8b\xba\xdd\x45\xaf\x11\x3a\xe1\x8e\xc6\xc4\x32\x77\x5b\xb5\xa7\x45\x9e\x3f\x57\x59\xdd\x1d\x8c\x62\xea\xac\xa4\x6b\x94\xfb\x4a\xe0\xae\x5d\xa0\x36\x2d\x2d\xf4\xbf\x4f\xb5\x37\xd6\xdb\x63\x95\x39\x56\xae\x79\x77\x95\x25\x09\xb1\xb5\x9d\xba\x75\xbf\xeb\x1e\x15\xeb\x8f\x4b\x82\x59\xcc\x87\xc5\xe3\x66\xbd\xdd\xef\x56\x8b\xfb\x11\xb7\x07\x6b\xed\x3c\x4b\xdd\x0a\x5f\x3e\x42\x31\x10\x0b\x62\x8c\xb2\x18\xb3\x77\xf2\x74\xde\x43\x01\xd5\xcb\x79\x82\x18\x18\xfe\xe3\x50\xad\x8c\x31\x62\xcd\x49\x56\x23\x1b\xc3\xe4\x49\x59\x62\x45\x78\xfe\x1c\x12\x26\x32\xc6\x84\x48\x7a\x60\xb7\x67\x8e\xdf\x42\x9e\x4f\x3e\x08\xd3\x01\x12\xd0\xbf\x42\x9e\x8f\x4b\x0f\x8c\x69\xc0\xc6\x43\xec\x86\xf2\xf4\xc5\xfe\x18\x28\xcc\x34\xde\x67\x85\x57\x9e\x9e\x6b\xc5\x62\x4c\xf0\x10\x1b\x62\x2c\x6d\xe5\x0c\x20\xcb\x8f\x13\x71\x0a\xde\xb3\x6a\xd0\x93\xee\x26\xeb\xf8\x82\x5a\x21\x0c\xf0\xa7\x7b\x26\x7f\x47\x02\x38\x06\xdc\xe2\x78\xac\xca\x77\x98\x28\x4f\xb8\x41\x32\x04\x4c\x44\x0d\x12\xbe\x4c\xc6\x9a\xcb\xbe\x9f\xa4\x23\x9c\xbf\x04\x21\x30\x49\xc1\x78\xb6\x66\x64\x83\x9f\x5e\x1e\x40\x90\x39\xbd\xf2\x2f\xfe\x9d\x02\x06\x98\x22\x32\xe0\x3e\x49\x32\xb5\xc7\x7e\x8c\x0f\xc9\x4a\x99\x15\xaf\x65\x89\x15\x83\xf5\xf5\x64\x9b\x68\xf7\x20\x84\x2a\x1e\xab\xf2\x50\xb6\xbb\xfc\x83\x57\x54\x60\xcc\x30\xc5\x47\x4c\xcf\xf7\xa2\x38\x4f\xe1\x84\x3c\x88\xa8\xec\x3a\x1a\x3a\x32\xe9\x59\x0b\xce\x03\x26\x91\x32\xb2\xeb\x5e\x3f\xb7\x16\xb2\x01\xfd\x2d\x41\xad\x3f\x99\x87\x58\x63\xb1\x73\x54\x98\x31\xe9\x1c\x52\x27\x23\xac\x36\x2f\xd5\xdb\xbd\xab\x65\x0c\xbf\x3d\x0f\x64\x68\x22\x5f\xa5\x40\xa7\x78\x38\x91\x39\x21\x0c\x79\xd2\xd0\x35\xc6\xbe\x03\x9f\xac\x9b\x7c\x40\x4e\x08\x47\xdf\xad\x2c\xf2\xf3\x75\xc7\x1c\xcd\x38\x89\x38\xee\xb9\xbb\x2a\x7b\xcf\x84\x25\x5b\x9e\x01\x62\x7c\x13\x40\x7c\xef\x4d\x7b\xdf\x83\x13\x87\x76\xdb\xab\xd7\xd6\xae\x21\x38\xb0\x6a\xc2\xef\x8b\x24\x3c\x12\xb1\x21\x9e\xbc\xa2\xb5\xa7\x43\x87\x8e\xc7\x9c\x23\x1f\x15\x26\xbf\xec\xee\x25\x3a\x61\xd3\xd9\x02\x73\x37\xe3\xdb\x73\xd1\x2b\xfe\xb9\xdd\x79\x5c\x1d\x8f\xb5\x55\xa2\xa9\x9d\x0d\xaf\x97\x50\x35\x99\xc9\xa6\x6b\x9f\xc7\x60\x10\x1d\xb5\xef\xaa\x3e\x18\x75\xfd\x6f\x31\x22\x4f\x52\x82\x59\x9c\xc3\xde\x31\x4e\x79\x91\xcc\x4e\xd8\x9f\xf1\x44\xa6\x18\x47\xee\xae\x57\xbd\x44\xbe\x3b\x46\x15\x41\xb0\x39\xd2\x30\xed\xaf\x17\x7f\x92\xbd\xaf\x75\xf9\x21\x8c\xdb\x44\x11\xca\xfb\x0f\xbb\xb9\x19\xe7\x24\xc0\x86\x9a\xfa\x24\x6b\x55\x65\x12\xee\x27\x42\x61\x7e\x9c\x10\xd8\xdc\xdc\x40\xdd\xec\x9b\xd7\x0a\x00\x63\x82\xd5\x7f\xda\xf0\xfb\xb7\xd1\x03\xa5\x10\xfa\xbe\xac\x81\x6a\xc3\xd0\x23\x76\x03\x45\x1c\x29\xd2\x51\x8c\x20\x5a\xac\x7d\x6f\xdd\xbd\x09\x9a\x10\xd1\x83\x17\xe7\x80\xaa\x7e\xa4\x36\x48\x57\xdb\x9a\x08\xe7\x4d\x5a\xd4\x79\x17\x98\x70\x2f\x82\xd9\x9a\x3f\xac\x80\x38\xf6\x8b\xb9\x8f\x33\xc9\xa3\x70\x19\x69\x0f\x2f\xd9\x9e\xe4\x38\x14\x1e\xdf\x88\x54\x06\x41\xbd\x76\x3f\xba\x12\xc5\x5b\x55\x4e\xb8\xee\x18\x57\x49\x8c\x7e\xe5\xd6\xc2\x67\xab\xe6\x62\x46\x29\x4e\x30\x75\x85\x97\xb1\x54\x22\x96\xc1\xc7\x56\x74\x26\x83\x65\x42\x99\x7f\xdf\x18\xf8\x56\x17\x39\x1e\xae\xb4\xc1\xb6\xa4\x17\xd1\xd5\xcb\xb8\x8e\x23\x74\xbb\xf6\x05\x4c\xe8\xaf\x18\xd7\x32\xc2\x8f\x28\xad\xf2\x05\x62\x2c\xbb\xf3\x00\x8c\x75\x1f\x6e\xc5\x01\xba\xbe\x48\xc6\x81\x46\xd8\xae\xf1\xc7\xc8\x6a\x01\xe7\x96\x99\xcf\xaf\x0e\x9f\x1f\xb0\x2d\xa3\xb3\x5f\x80\x4c\x57\x89\x09\x62\xe7\x0d\xaa\xb2\xf5\x36\xa0\xf2\xc9\x81\xe7\xe3\xd1\x51\x9e\x0d\x93\x44\xdc\x10\xea\x31\x9a\x5d\x29\x09\xb4\x45\x2b\x5f\x54\x27\x67\xed\x75\x1a\xa4\xb1\xdd\x18\x2c\x7a\xb9\xcc\xcf\xbe\x95\x01\x93\x17\x17\x2f\x39\x0d\x52\xc0\xd0\xee\x7a\x71\x3c\x6e\x40\x68\x3f\xf9\x52\xa2\x28\x66\x40\x7e\x96\xff\x16\x6f\x83\x4d\x39\x25\x5a\x60\x10\x2a\x4f\xe7\x3f\x06\x6e\xf5\x85\x22\xc1\xac\xe9\x48\xa3\xd0\x52\x5a\x1e\x44\xf5\xe6\x98\x81\xc2\x80\xa4\xfe\xe2\x71\x9c\xa0\x93\x56\x77\x45\xc0\x94\x85\x76\xaf\xb3\xcc\xaf\xc7\xac\x98\x3c\x01\x0b\x05\xa2\x56\xef\xcb\xf7\xcc\xe2\xb5\xbf\x81\xe1\xf9\x73\x9c\x02\x69\x56\x77\xc8\x46\xd0\x8b\x42\xf7\xa5\xef\xd1\xf4\x4f\x79\x22\x00\x31\x2e\x0f\x8b\xf5\xdd\xfd\x62\xbb\x5b\x6d\xf6\xeb\x87\xe5\x66\xb5\xd8\x7a\x24\x68\xca\x99\x44\x24\xe8\x1d\x14\xba\x2a\x33\xed\xf0\x13\xc3\x79\x95\xa6\x31\x8d\xed\xef\xde\x9f\xd7\x85\xa9\x26\xa8\x93\x34\xa5\x42\x5b\xde\x74\x61\xc0\xa5\xe0\xad\xc0\xe3\xa2\x59\xab\xf2\xab\x6d\xc1\x9f\xad\xc1\x0a\x81\x15\x25\x6a\x33\x74\x72\x6b\xf3\x9e\x41\x2a\x22\xdb\x11\xdd\x80\x38\x2c\xf2\xbc\x14\xaa\x67\xbd\xc1\xa3\x48\x9a\x96\xb5\x56\xcc\x64\xd5\xa1\x0b\xa3\x53\x11\x13\x14\x0d\xdf\x62\x8f\xa4\x53\xa1\xbd\xc4\xf6\xa5\x42\x45\x18\x54\x3b\x0f\x15\x5f\xc5\x4d\x59\xb9\x0e\x88\x9b\x53\xb7\x0c\x53\x19\x32\x64\x43\xf3\x2c\xaf\x9d\xc7\x13\x5f\x04\xa6\x7f\x91\x9e\xbe\x6b\xa0\x56\xda\xff\xaa\x62\x06\x37\xd5\xde\xee\xaf\xad\xba\xcf\xea\x3f\xd8\x6a\xe9\x7f\x53\x09\x8a\x05\xb2\x7d\x0d\xcd\xf6\x24\x8b\x52\xbb\xa6\xab\x49\xa5\xcd\x0d\xd7\x42\xa3\x77\x7b\x8b\x59\x80\x87\xd3\x61\xe2\xa1\xa4\x1a\x24\x32\xc6\x5b\x01\x03\xe4\x3f\xbb\x86\xae\x50\x9c\x82\x4a\x13\x4b\xf3\x08\x56\xc9\xad\xfe\x51\x7e\xdc\x9f\xd4\xeb\x4d\x87\xe9\x48\x4d\x48\xf1\xfb\x23\xb7\x4f\xf7\xc7\x98\x21\x90\xb3\x8d\x4d\x56\xbb\x1f\xbf\x8d\x9e\x9d\xfb\x41\x2c\x26\x43\x28\x73\xbb\x62\x57\x9f\x13\xbb\x9b\x1a\x2d\x11\x2c\x7f\xb4\x3a\xe0\xa3\x14\xb6\x08\xa8\x5d\x68\x8b\xcf\xa6\x3a\xa1\x3a\xf7\xf8\x6c\x11\xe8\x04\x5d\xf4\xba\x63\x17\x74\x07\x48\x40\x10\xb0\xd2\x64\x9f\x4e\x61\xbc\x3b\x02\x01\xc6\x55\xe2\xa4\xb3\xe6\x61\xf7\xfb\xf3\x0e\x3e\x47\x02\x89\xa3\x0c\xa4\x20\xa0\x99\x95\x60\xed\xb2\xd8\x22\xa4\x01\x16\x7e\x70\xf6\x5c\x03\xea\x9f\x4d\x36\x1f\x11\xb2\x30\x80\x7e\xdb\xf5\xf2\xca\xb3\xd3\x5e\x44\xdc\x20\x31\xf3\x6b\x56\x23\xcd\xc3\xe4\x68\xaa\x85\x07\xee\x54\x99\x7a\x43\xfe\xe2\xab\x53\x96\x4f\xd9\xec\x98\x88\xa4\x48\x5c\x53\x63\x51\x97\xd5\xfd\xa9\xce\xd4\xb7\xad\xc8\x4c\xc4\x31\x78\xfa\x43\x54\x56\x7e\x2e\xb2\xb2\x58\xeb\x49\x8f\x89\x48\xc0\x72\x47\xdb\x54\xc9\xf2\x54\x37\xe5\xe1\xe2\xe7\x69\x10\x63\x3e\xa5\x0d\x79\x9e\x8f\x4d\xd9\x67\xac\x04\x0d\x12\x6b\x13\xa1\x81\x72\x94\x5a\x12\x34\x14\x76\x59\x17\x97\x1c\x5f\xf3\x58\x52\x77\x22\x93\x80\xae\x4d\x01\x1f\x3f\xdb\x68\xbd\x97\xcb\x60\x82\x0b\xad\x5d\x02\xa0\xf5\x10\x30\xf1\x71\xb1\x21\xfc\x02\xb0\xf8\xab\x7f\xc7\x0f\x9f\x26\xcc\x78\x34\xbc\xc8\xe1\x5a\x9c\x1f\xca\x0f\x7f\x3b\x42\x45\xc8\xf8\xe1\x17\xc3\x42\xbf\x67\x75\x59\x8d\xdc\x48\x21\x74\x84\x05\xd9\xf7\x36\x74\x77\xda\x96\xdf\xee\x5d\x42\x52\xab\x76\xf7\xd1\xb5\x65\x5d\x0f\x72\x4d\x42\x4a\x8e\xed\xc3\x57\xf7\x7b\x5b\x47\x5c\xe6\xa2\xae\xf7\x9d\xac\x8e\x1f\xa6\x2c\x19\x12\x72\x30\xfa\xea\xe1\xc0\xb1\x17\x0a\x92\x44\x7b\x5c\x55\xbb\x03\x5c\x67\x78\xfb\xfe\x02\x90\x32\xa4\x42\xc7\xa0\xe1\x01\x3e\x5c\x9e\x17\x3d\x84\xf7\xcb\x52\xad\x3b\xcb\x04\xb6\x97\xfe\x01\x2a\x0d\xa2\xca\xbd\x4b\x25\x03\x96\x46\x2e\xc8\x76\xef\xa9\x5d\x3e\xe3\xdc\xcd\xfc\x86\x23\x03\x26\x6c\xc3\x74\x1b\x6b\x6c\x5b\x4f\xfd\x57\x61\xb5\x3b\x31\x0c\x62\x84\x4e\x1e\x5b\x9f\xea\x09\x71\xa0\xed\x57\x8c\xf6\x3d\xff\x2e\x93\xa1\x34\xc8\xbf\x7b\x38\xe5\xcd\xf9\xeb\x0c\xa8\x0f\x8a\x65\xa8\x23\x6c\x1c\xba\x2b\x5f\x16\x45\xfd\xd1\x7e\xd4\xf7\xd6\xfe\xce\xb6\xb6\xfd\xa2\x9d\xb2\xbd\x5a\xac\x64\x57\x74\x98\xad\xd4\xcb\xd0\xa8\xa0\xe7\xc1\xc2\xe9\xf5\x20\x0e\x60\x05\xad\xc6\xcc\x91\x73\x04\xf8\x4c\x46\x24\x46\x08\x5d\xdd\xc0\x71\x28\x58\xc4\x64\x24\x28\x7a\x28\xf7\x59\x31\xdf\x26\x1d\x07\x6e\x64\x2c\x29\xa6\x2f\xa1\x52\x61\x18\xdd\x88\x3c\xc7\xb6\xb4\x59\x68\xb2\x3b\x85\xa6\x56\x3e\xfb\xa9\xac\x1b\xcf\x6a\xec\x0e\x31\x62\x29\xad\x2c\xcb\xe0\x20\xd9\x43\x7e\x19\x37\xfb\x2b\x80\xcd\xc4\xfc\xfd\x54\x37\x07\xf1\x36\x4a\x07\x48\x66\x88\x17\x63\xb7\x2c\x28\xcf\x45\xd6\xd8\x98\xb7\xd7\x0a\x66\x92\x47\x96\x57\x78\xf1\x52\x59\x26\xcc\x6d\xbf\x91\x4a\x4e\x39\x2e\xa0\xd6\xcd\x3f\x1d\xe7\x8d\xbc\xe4\x3c\xc1\x76\x2c\x25\x8a\xd6\xad\x9d\x87\x24\x49\xae\x38\xed\x38\x30\xba\x4a\xe7\x20\x31\x28\x53\xc2\xb8\xa3\x60\x77\x79\xe1\x7e\x77\x93\x69\x6c\x35\xe4\x0a\xf8\xb8\x9a\x02\x98\xa5\x08\x14\xc2\x90\x3a\x56\xb3\x66\x53\x96\x87\xb1\xa1\x97\x22\xb6\x9d\x5c\x59\xed\x41\x85\xd5\x56\x14\xdd\x0f\x88\xd4\x20\xa9\x0b\x1c\xeb\x2c\x2f\xbb\xb7\x28\x89\x32\xde\x73\xd9\x88\xca\x56\xb9\x4e\x35\x7e\xad\x5e\xf3\xc8\x0f\x4e\x38\x76\x66\x63\x24\xdd\xd1\xf6\xfd\x36\x9c\x0f\x32\x4d\x10\x11\xbd\x38\xf6\x5f\x4a\x85\xe0\xf0\x8e\x76\xe1\x21\x51\x19\xda\x18\x6c\x96\x98\x07\x25\x48\x15\x29\xac\x87\x6d\x85\xf1\xd8\xa7\xf1\xdd\x28\xae\x30\x7a\x78\x2d\x3f\xee\x45\x71\xc6\xbc\xe9\x64\xf7\x93\x3a\x66\x29\xc2\xcd\xc4\x1b\xac\x9b\x9f\xd0\x7e\x7e\xe5\xef\x4b\x0b\x06\x83\x1e\xde\x76\xbd\xb5\x46\xa3\x8d\xd5\x57\xbb\xd1\x53\x69\x43\x28\xf4\x50\xd0\xab\x93\x43\x82\x93\x8e\xec\x0a\xff\xcb\x8d\x86\x90\x22\xa2\xe0\x54\xec\x2a\xa1\xde\x2e\xc5\x97\x7d\xd2\x46\x02\x4f\xb0\x75\x64\xf1\xbc\xfb\xf1\xe8\x31\x70\xd2\x10\x89\x35\xef\xa3\xaf\x24\xff\x22\xeb\xd4\x9d\xa6\xa4\x85\xb5\x18\x84\xb5\x78\x3b\x57\x6f\xb3\x62\x2c\xca\xc7\xa4\xe1\x29\x62\x3f\xed\xc8\x6e\x7f\xed\x90\xdc\xfc\xaf\x7f\xf9\xf9\x3d\xfc\x2f\x7b\xb6\x22\x29\x8f\x89\xf5\xfd\xda\x39\xbc\x2e\x3a\x63\xa3\x88\xb0\x9c\x27\x77\xe5\x4b\x1b\x1e\xcf\x06\xf8\xed\xa0\x44\xda\xce\x90\x45\xeb\xcd\x5d\x3b\xae\xcc\xfe\x22\x12\x33\x5d\x1a\x54\xa9\xc1\x89\xc8\x8f\x1e\x40\x11\xa0\x61\xda\xf5\xe4\xcd\x27\x51\x55\x98\xa8\xc4\x33\x84\x65\x39\x88\x17\x5b\xfb\x99\x41\xca\xa9\x88\x72\x6c\x3c\x3a\x9e\xea\xd7\xab\xd3\xb9\x8d\xa9\x27\x72\x98\x4c\x45\x0a\x10\x3a\x38\x94\x80\xb5\x11\xf1\x20\x18\xbe\x68\xe0\x18\x14\xa3\x54\xa4\x19\xf6\xc1\x65\xaa\x9c\x28\x19\x30\x15\x13\x40\x36\x80\xff\x42\x51\x64\xa3\x58\x4f\xc5\x42\xa2\x7f\xd1\xe5\x10\xac\x14\xe7\x61\x4e\x6b\x73\x6c\xbc\x54\x12\x58\xac\xbd\x6c\xdd\xce\xeb\xad\x2b\x6b\x8d\x92\x43\x2a\x49\x89\xe7\xd7\xbd\x82\x71\x0b\xa0\x4a\x54\x88\xd8\xd7\xab\xac\x6a\x5e\x6f\xa0\xbb\x5b\xaa\x78\xd4\x91\x6f\xd7\x4d\xd5\xfd\xdd\xc4\x3c\x1a\xa8\xa4\x62\x19\xfc\xd4\x95\x55\x15\x8b\xad\xcc\x6e\x1f\xec\xad\x44\x55\x80\x1e\x73\x1d\x8e\x9f\x81\xe9\x10\x2b\x74\xc2\x92\x5b\xda\x9d\xc4\x1f\x03\x77\xac\xae\xb3\x97\xe2\x9b\xe4\x94\x62\x46\xa3\xc6\xee\x58\x3a\x7c\x57\x0e\x18\xb3\x98\xe2\x51\x82\xb8\x85\xac\x30\x16\xa3\xb1\x1c\xb6\x3a\x2a\x0e\xd4\x11\xd3\x8a\xfc\x5e\x14\x27\x91\xdf\xa3\x0a\x0c\x36\xf8\x74\x6e\x97\x4a\xa9\x45\x9f\x23\x16\xb5\xdd\x06\xf6\xbd\x43\xad\x52\x6e\xb5\x3c\xdb\x2d\x2b\xda\xdb\x76\xad\x87\x36\x94\xf1\xc7\x53\x13\xf6\x52\x0e\xcb\xf2\x70\x84\x26\xfb\x8a\x63\x8b\xa9\x54\x5b\x46\xf3\x1f\xe2\x70\xb8\x2a\x8b\x2e\x26\x55\x22\x0a\x88\xdb\x6e\x3c\x70\x6c\x80\x72\xb3\x85\xf5\x89\xbf\xa8\x84\xe2\x68\x52\x3f\x20\x7b\x79\x9d\x76\x11\x29\xa1\x15\x16\x1a\xaf\xc5\x0b\xe4\xa2\x9b\x9d\x92\x02\x46\x9a\x5e\x0c\xac\xa9\xb2\x31\x60\x7f\xf0\x03\x12\x02\x6a\x2c\x33\xeb\xcd\x77\xdc\x6f\x6e\xb8\x8a\x63\x4f\xda\xbb\xcc\x9a\xb3\x17\xce\xda\x64\xea\xb5\x18\xc0\xd9\xfc\xe8\x34\x80\x91\x6c\x0d\x3e\xe4\x00\x69\xf1\x7d\x2e\x5a\xe9\xd0\xe6\x1d\xfd\x0c\x79\xaa\xb2\xf7\x2c\x87\xce\xf4\x4c\x26\x94\xa6\x0c\xcb\x05\x5d\x7d\x65\x0f\xc3\x1e\x15\xa5\x55\x28\x1c\x48\xd9\x7d\x3a\xc4\xad\x4c\x5e\x2a\x48\x8d\x48\x0b\xbb\xb7\x2f\x5a\x4f\xde\x97\xb2\xc9\x28\x1b\xe8\x89\x4e\x68\x3c\xaa\x1c\x2a\x70\x19\xf0\x76\xdb\xda\x36\x65\xd5\x37\x12\x28\xc3\x00\xfb\xe0\x0e\xd9\xe1\x94\xff\x36\x77\xb2\x81\x08\x53\x73\x42\xeb\x21\xd3\x45\x1c\x8c\x5f\x8d\x0e\x24\x55\xd0\xe9\xbf\xd8\xc4\xcb\x94\x67\x94\xe9\x40\xc5\x88\x64\x7e\x83\xb3\x3c\x9d\xa7\x07\x8d\x2d\x50\x28\x91\xe7\xdb\xa6\x6c\xe7\xe4\x55\x73\x09\x25\xfb\xc2\x95\xfe\xaa\xa2\x32\x67\x66\x75\x28\x19\x22\x27\xb7\xaf\xa2\x7a\x1b\x36\x46\xeb\x50\x87\xa8\x28\x86\xb4\xe7\x83\x54\xa4\x8e\x82\x18\xfd\xef\x0f\xec\xf8\x22\x56\xf6\x71\xd8\x6a\xea\xc6\xc5\x49\x8c\x99\xe1\xa6\x33\x94\x17\x77\x32\x6b\x7e\x74\x2c\x25\xea\x56\x1c\x4a\x0d\x9f\x17\x48\xca\xc9\xeb\x8e\xc1\x12\xe7\x1d\xbc\x75\x79\x3c\xc2\x80\xf1\x8a\xe9\x84\x84\xda\x81\x94\x5c\x5d\x46\x09\xcb\xe7\x7f\x75\x7e\x28\xe7\x1a\xf0\x74\x92\x48\xcc\xbb\x37\xd5\xf9\x3a\xab\x5b\xe3\x8b\x4e\xe4\xf8\x87\x13\x1d\x63\x72\xdb\xd5\x57\x17\x5a\x0f\x37\x22\x4d\x39\xc7\x52\x80\x4b\x26\x88\x49\x3f\x9c\x66\x2c\x0a\x92\x4e\xae\xf7\xbe\x2c\x9a\xd7\xfc\x8c\xaf\x6f\x36\x11\xa6\x79\xc8\x91\x3e\xf5\xfe\x7c\x33\x76\x44\xa6\xc3\x64\x10\xf4\x0a\xc7\xed\x13\xff\x0e\x55\x66\x32\x18\x29\x2d\x32\xcd\x53\x42\x5d\x0f\x9f\x75\x19\xdd\x1e\x39\xff\x49\x04\x25\x16\xac\xde\xed\x45\xfb\x43\x17\x33\x6a\xc1\x62\xe3\x70\xa1\xff\x3c\x5d\xd6\xe4\xb5\x30\x14\x17\x17\xe4\xd9\x4b\x26\x73\xb8\x29\x2b\x47\x42\xa8\x26\x39\x5f\x2d\x65\x1c\x0c\x25\x51\x47\xd1\xdc\x64\xa8\x51\xc2\x93\x2b\x94\x75\xf3\x68\x46\xfc\x96\x6e\x90\x0a\x6c\xe2\xe5\xa2\x1c\x65\x85\xaf\xfc\x13\x68\x26\x12\xcb\x3b\xac\xda\xc0\x07\xb4\xd7\xe3\x71\x4c\x1d\xf7\x59\xd1\xcf\x28\xcd\x6c\xd1\x1c\x9d\x9b\x53\x87\xab\xd2\xc0\x23\x2b\x4c\xed\x1a\x40\xbe\x78\x97\x90\x2a\xc4\x62\xfc\xe7\x24\x8a\x26\x6b\xce\x37\x28\x5c\xd2\x5d\x44\x30\x88\xbd\xb7\xf0\x24\xea\xe6\xae\xc4\xb6\xf8\xc9\x35\x80\x22\x49\xc6\xfe\x01\x3e\xee\x2c\xc2\x6f\x50\xbc\x18\x7b\xf6\xda\xa8\x18\xb3\xff\x5e\xfe\x64\xe1\xfa\x69\xec\xa6\x7e\x75\x9a\xb4\xc3\x68\xa3\x38\xa2\xeb\x4f\x85\xa7\xba\xf8\x6d\x04\x71\x9c\x8b\x6e\x21\x88\xac\x90\xec\xa1\xf5\x1a\xa1\x1a\x68\xd9\x31\x20\x82\x83\xc3\x32\x2c\x1a\xe7\x0f\x76\x38\xbb\x69\x47\x01\x10\x69\x99\x59\x4e\x85\x14\xc5\xfe\x74\xd1\x17\x04\x44\xd9\xf8\xfd\xcf\x53\x21\x21\xfb\x15\x9f\x3d\x83\x90\x00\x46\x93\xaf\x53\x69\x7c\x06\x61\x42\xad\x90\x2e\xd4\xcd\xf6\xb5\xac\x1a\x2b\x0a\xea\x6f\x3c\x54\x16\xd5\x61\xa1\x7f\xb6\xd5\xb4\xdf\xa2\x21\x0a\xb9\x76\xde\xe0\xb6\x3c\x00\x7a\x5b\xde\xa9\x80\x28\x12\x81\x72\x3d\x63\x6d\x1c\x3a\xe7\x9b\x43\x94\x04\xd8\x4f\x7a\x14\xe7\xc7\x53\x73\x5b\xbe\x43\x55\x74\xfa\x34\x0c\xe2\x84\x62\xfa\x48\x9e\xce\x3f\xb3\x5c\xab\x8e\xc4\xd5\x1f\x67\x29\x7e\x59\xbb\x23\xae\x1b\xe8\xd3\xe3\x7d\x87\x8a\x8f\x45\x20\xe6\x11\x2a\x0f\xdc\x67\x6f\x42\x97\xa3\x0b\x25\x51\xca\x9d\x44\xcd\x52\x1c\xd7\xc5\xcf\x8e\x93\x00\x12\x11\xa1\x50\xc4\x8f\xf5\xf5\x6a\xb3\x98\x7f\xd1\x63\x9b\x0c\x89\x92\x9e\x66\xf1\xe7\x6b\x79\x05\xbf\x28\x4f\x41\x62\x08\xb2\x2d\xdc\x95\x2f\x0f\x7b\x53\xa8\xaf\x58\x55\xfc\xaf\x8d\xea\x0f\x4e\x24\xe9\xcb\x4b\x47\x08\xb8\xcf\xb3\x37\xb0\x73\x72\x7c\x9c\xc5\x11\xf2\x21\xee\x8f\x95\xb5\x0c\x93\x5e\xf4\x59\x37\x1b\x58\x2c\xa4\x63\xe8\xb9\xff\x9c\x37\xd8\xc0\x74\x88\xe9\x82\xab\xab\x3f\x06\xbb\x27\x70\x62\x19\x52\x06\x42\x59\xc9\x0f\x51\xbf\xee\xdd\x2f\x74\xe3\xa8\xcd\x88\x5b\xea\x2e\xb8\xca\xf4\x4d\x79\x81\xab\xfe\xe2\xa1\xd3\x08\x1c\xad\xdb\x0c\xf3\xad\xbd\xdd\x30\xf0\x63\x63\x87\x80\xb7\xdb\xd8\x2c\x65\x0b\x88\x98\x2b\xe3\x60\x42\x57\xd5\x78\xea\x08\x9d\xa0\x5f\x74\x93\x79\x40\x04\xc8\x88\x5b\xbf\xdd\x79\x87\x36\xcf\xdb\xba\x31\xad\x47\x04\x5f\x74\x91\x82\xa4\x3c\xf1\x26\xe4\x06\x60\x86\xde\x97\x81\xe4\x96\x57\x36\xab\x97\x79\x06\x45\xf3\x24\x32\xfd\x3c\xc1\x16\x82\x54\x96\x11\xfb\xe8\xbd\x52\xed\xe4\xc9\xc7\x1c\x54\x6e\xb4\xa2\x24\x35\x23\xd2\x0d\xab\x2c\xeb\xca\xc6\xfe\xa1\x94\x82\xc4\x74\xa9\xc9\x7f\x9e\xb2\xc6\x5d\x74\x7a\x39\x1d\x78\x5f\x76\x7b\x04\x95\x89\x7c\xca\x6d\x02\x10\x85\xb8\x3e\x7e\x7f\xbe\x5b\x2e\x1e\xf6\x4f\x9b\xc7\xfb\xd5\xee\xc7\xea\x79\xbb\xbf\xd9\xdd\xed\xb7\x4f\xab\x8e\xea\x04\x40\x30\xbb\x9f\x8b\xdc\x29\xae\x75\x39\x6d\x00\x10\xb8\x0f\x3d\xc0\xc7\x00\x3f\x31\x79\x61\x26\x8e\x42\xd7\x65\xfa\x03\xf2\xbc\xfc\x59\x56\x1d\x0a\xde\x04\x2c\x20\x9d\xf6\xd1\xca\x91\xc4\x75\x07\x65\xa4\x7d\x3f\x63\xdd\xc1\x0e\x0d\x61\x12\x23\xb6\xab\x52\xab\x7e\x5e\x1b\xc2\xa5\x4f\x20\xf4\x04\xdd\x24\x1e\x99\x3b\x43\xa4\x6d\xe6\xb1\x0d\x24\x96\xbc\xde\xf1\x88\xce\x4e\x09\x13\x2a\x95\x38\x1a\x3a\xdf\xf2\xd0\x3d\xbf\x09\x4d\x0c\xa1\xd7\x4e\x40\x56\x8b\xd7\xec\x38\xf7\x89\x4d\x44\x20\x10\xde\x07\xcc\xf5\xa4\x00\x6c\xa2\xd0\x3a\xff\x8f\xc6\xe4\x59\x01\x4b\x51\x37\x39\x0c\x19\x94\xe7\x33\xf1\x26\xa2\x89\x67\xc7\x68\x7d\xa8\xf2\xd4\xcc\x90\x86\xb6\xc3\x94\x67\x16\xf5\xec\x13\x6d\xbc\xd4\x97\x14\xbb\x1d\xc5\x44\xa9\xe6\x9d\xfc\xc0\x56\xe4\xf0\x13\xb2\xdb\xb2\xcb\xc2\x9a\x08\x58\x60\xfa\x92\x0f\x92\x2d\xcc\x97\x1e\x4c\x6b\xd8\xd2\x3e\x95\xde\xfd\x55\x28\xaf\x27\x5e\xbd\xc3\xa4\x23\xdf\xc4\x29\x60\xd3\xc4\x41\x7c\x66\x87\xd3\xe1\xea\x74\xbe\x12\xea\xcd\x3a\x0c\xeb\x62\xd9\x6b\x3f\x30\x93\x70\xe5\xe4\x25\x50\xf9\xd3\xb5\x7f\xf4\x09\x23\xee\xc7\x81\x52\x16\x77\x07\xef\x59\x79\xaa\x2d\x98\x63\x98\x99\x30\x2c\x26\x4c\x77\x20\xd1\xd6\xbf\xf5\x5a\xf5\xaa\x27\xdf\x33\x9c\x70\xf4\x9b\x9a\xd7\xac\x6a\xce\xfb\x8f\x01\xf3\x2d\x33\x9c\x5a\xa7\x6a\x6f\x1f\xb7\xf5\xd7\x1f\xda\xc0\xfc\x8b\x79\xc5\x59\x6a\xe3\x57\xc8\x61\x8a\x17\x30\x5c\x24\xd8\x5c\x8c\x62\xf8\x5b\x07\x4e\x2a\xf3\xbc\x83\x0c\x4d\x66\x17\x37\xd2\x32\x8d\x61\x82\x6d\xaf\x26\xef\x34\x4d\x44\x1a\x62\xda\xa1\xd2\xaa\xd4\xa0\x2f\x98\x58\xfd\x40\x1e\x60\xca\x6b\x27\xde\xc0\xb6\x99\x77\x97\xd0\x06\xf7\x60\xeb\xc1\x61\x3c\x68\xd9\x13\xbf\x78\xbc\xd4\x58\x89\x50\x0b\x98\xb2\x2c\x3c\xdd\xc5\x84\xe4\x16\xd4\x7b\x38\xe6\x7b\xcb\xa4\xfe\xc5\x65\x64\x6a\xf9\x57\x5d\xa3\x37\x88\xc3\x97\x34\x5b\x46\x02\x43\xb3\x57\x0b\x03\x77\xa2\x1e\x22\xcf\x8c\x04\x9d\xc2\xc8\xc2\x3e\xbd\x8a\x1a\xd6\x85\x86\x4f\x3f\x46\x31\x8b\x1b\x13\x5a\xf7\xef\x7b\xf2\x82\x94\x48\x13\x2f\x41\x59\xa9\x7f\x36\x5f\x77\xbb\x8f\x9f\x43\x4b\xdb\xa0\x60\x9c\x0f\x37\xa8\x26\x18\x13\x08\x87\x64\x1c\xe6\xba\xba\xa3\xa1\x65\x50\x3c\x58\x1a\xd4\x42\xcf\xb1\xba\x5e\x56\xc5\x8c\x61\x02\x3b\x9d\xee\x17\x0f\x8b\x69\x2f\x97\x31\x32\xd4\x8e\xc1\xf7\xde\xae\xb3\x4d\x79\x2a\xa6\x56\xc3\x40\x42\x03\x4f\x76\xb9\x3d\x8a\x8f\x02\x0b\x7e\xd3\x4f\xf5\x25\xdb\x16\x0f\x02\xaa\x0d\x38\x17\x62\x2f\xf4\xc1\x1b\x6b\x1e\x10\x10\x58\xe9\xc9\x45\x1b\xf0\xdc\x95\x4d\x53\x76\x87\x8c\xf6\x04\x26\x0f\xf0\x31\x58\xa6\x3c\x08\xc3\x84\x39\x8e\xfa\x6a\xbf\x15\x5a\xe7\xe0\x33\xa3\x3c\x08\x69\xea\xfb\x39\xb7\x98\x79\x1a\x7d\x3b\x1e\x84\xc2\x0a\x05\x1f\xb2\xe2\xd1\x2c\xaa\xaa\xe7\x07\x70\x2f\x8d\x07\x51\x68\xb7\xed\xa6\xbc\xf2\xc4\xdc\xee\x48\x9c\x5a\xae\x78\xd4\x61\x5d\x6d\xc2\xdf\xba\xbf\x73\xcc\x7e\x2f\xf4\x7b\xbb\xf6\x3a\x52\xea\x39\x6e\x2e\x1e\xc4\x4a\xe1\xfd\xd7\x96\xda\xfe\x62\xf2\x8c\x5d\xda\x2e\xe1\xd7\xdb\x67\x1e\xc4\x5a\xa0\xb8\xaf\xca\x33\x63\x1c\xc0\xa6\x6f\x3e\xea\x6e\xcb\x28\x04\x7c\x2c\x1f\xef\xef\x9f\x1f\xd6\xbb\x3f\xc7\x3d\x21\x3c\x48\xa4\x01\xe3\x19\x7e\x2e\xd8\x4b\x67\x3f\xed\xd8\x99\xe7\x01\x8b\x25\x32\x66\xca\x53\xa1\x51\x5a\x1f\x8a\xcc\x6f\x8d\x3c\x60\x49\xca\x2d\xde\x40\xe5\xa7\xac\x7a\xae\x4f\xa2\xca\xca\xc9\x27\x61\x2c\xc5\xc6\x78\x9b\xa2\x68\x17\xed\xd5\xe9\xfc\x0f\x38\xd7\x4f\xeb\xeb\xf9\x5d\x85\x07\x0c\x04\x6e\x40\x05\x7c\xdc\x97\xc8\xbd\x9a\x35\x76\x1b\xda\xfb\xdf\xe6\x91\x64\xb1\x8f\xcb\x7b\x24\xa6\x47\xab\x7e\x9b\xcf\xe1\x01\x8f\x53\x34\x75\x9e\x48\xef\x38\x30\xcd\x3c\x48\x93\x44\x92\x51\xcf\x83\x55\xa6\xec\xc5\x4c\x7e\x1b\x5f\x4e\xd0\x00\xeb\xa2\xed\xfa\x43\xec\x87\x83\xca\xac\x0a\x3d\x08\x51\x79\x20\x52\x88\x5d\xde\x04\x13\x8b\xdf\x53\xeb\xf3\x40\x28\x83\x24\x67\x4e\x1a\x64\x0b\x79\xde\xa5\x13\x78\x20\x00\x12\x4b\xa3\x64\x2f\xd6\x91\xc5\xba\xe3\xd2\xd8\x4c\x41\xe3\x78\x6d\x3a\x11\xad\xf6\x90\x91\xdd\xa1\xfa\xd1\x60\x8b\x82\x3b\xa6\x68\x90\x82\x3f\xb6\x3e\x38\x1e\xe1\x2f\x5b\xc8\x78\xa0\x78\x8a\x09\xcf\x4d\x69\xeb\xd3\x8e\xc4\x75\x28\xd7\x36\x97\xa3\xe0\x81\x0e\x8d\xe7\xf7\x7c\x02\xa8\x5c\xec\xba\xfc\x32\x43\xc4\x03\x1d\x5b\x7e\x27\x44\x59\x4d\xa8\x80\xfd\x10\x11\xe0\x6a\xdd\x1e\x4f\x55\xfd\x5e\xff\x14\x55\x95\x95\x55\x1d\x7b\x20\x22\x0f\xb4\x4c\xf1\x6b\x15\xf0\xd9\x6c\x1b\x10\x79\xcf\x26\xe5\x47\x28\x91\x38\xc6\x6a\x4c\x9c\x0d\xfd\x4b\x1e\x68\x48\x70\x5b\xcf\xcb\xa6\x01\x07\x32\xe2\xee\x18\x44\xd4\x4a\x2b\x40\xdd\x5c\x67\x75\xeb\xb3\xe8\x0d\x08\x8d\x51\x9f\xbf\x3c\x50\x15\x38\xa4\x31\xe2\x48\x5c\x6f\xdd\x2f\xe6\xac\x49\x62\x25\x46\xf5\x92\x8e\xf8\x71\xfe\xbb\x98\x14\x10\x2a\xb3\x11\xc5\x5b\x56\xbc\x5c\x89\x3c\xc7\x6c\x1d\x42\x8e\x2e\x79\xb9\x78\x60\xc0\x86\xa9\xb7\xa5\x78\x05\xe1\x6f\x97\x04\x91\x65\x0a\xd3\x5e\x01\xea\x49\x9c\x61\x70\x94\x7b\xfa\xe3\xab\x5c\x8c\xde\x14\x09\x22\x85\x39\x91\xed\xf6\xc7\xff\x26\x0b\xc3\x49\xc0\x18\xa2\xca\x4e\x35\x54\x75\xcf\xd5\xdd\xfd\x9a\xb0\xc4\x69\x9d\x0c\x6b\x6f\x36\x49\x20\x15\x82\x44\x56\xbb\xe5\xab\xa8\xdc\x12\xdc\xbf\x87\xe3\xa7\x24\x51\x68\x41\xae\xaf\x56\x53\x6b\x3d\x6c\x16\xe4\x24\x0e\x54\xda\x5a\xbc\x47\x05\xa2\xd8\x2a\x71\x04\x8c\xab\xbf\xce\xfc\x70\x92\x04\xd6\x0f\xb2\x4e\x21\xb6\xd1\x3d\x9a\x31\x21\xf8\xf8\xcb\x90\x24\x06\xc2\x1c\x3a\xf3\xd9\x55\x87\x7b\x57\x86\x93\x44\xf0\xc4\x45\x77\x96\x61\xf5\xd4\xb9\xc4\x9c\x24\xc6\x10\xd7\xe6\x39\x97\xb2\xe4\x84\xc6\x02\xbb\x42\x76\xaf\x9f\xf7\xf5\xcb\x04\xa3\xe5\xc7\xf0\x14\x17\x79\xa6\xca\x4e\x1b\x7e\x7c\x15\x46\x2c\x79\xc7\x95\x93\xe5\xfd\x52\x50\x9f\x13\xa6\x14\xa6\xca\x30\xf3\x39\x94\x71\xe4\x84\x69\x2b\xf1\xef\x4a\xfa\x61\x30\xca\x1a\x72\xc2\x8c\x65\xf1\x37\x59\xa1\x1d\xe7\xe3\xf8\xda\x9c\x70\xdc\x3e\xb4\x38\x2e\x45\x35\xfa\x54\x3c\x54\x3a\x72\xda\xc1\x50\x59\x25\x08\x6b\x09\x6f\x87\xa4\xb9\xe3\x57\xcf\x45\x88\x99\x11\x6b\xd0\xb5\xbe\x14\xfc\x9d\x9c\x90\x26\x96\xe7\xd8\xee\x5f\x4f\xa2\x75\x2c\xb1\xd3\x6e\xf7\x0a\x65\x05\x0d\x92\xfd\x0f\xba\x66\x39\x49\x39\x41\xd1\xe4\xfa\x03\xe0\x88\xd4\xc9\x7d\x71\xf5\xb7\xc9\xc5\x55\x84\xc8\x82\x65\x2e\x46\x5b\x10\x11\x11\x60\x15\xea\x55\x20\x87\xdf\xe2\x78\xcc\x33\x25\x2e\x7a\x0d\x38\x11\xc6\x9a\xaa\x1a\xf2\xdc\x65\x02\xbe\xa1\x16\xe0\x44\x45\x52\x1b\xcb\x19\xd2\x3a\xff\xde\x97\xf1\x47\xb9\xed\x72\x15\x5a\xef\xca\x2e\xd7\x7b\x75\xca\xdf\x26\x7d\x4a\x9c\x68\xc2\x35\x1b\x88\xc0\xde\x43\x4f\xb4\x37\xef\x5d\xf8\x13\xa3\x38\x74\x56\xdf\x6a\x7a\xcd\x98\x22\xa2\x85\xc1\x84\xc2\x6a\xf7\x03\xaa\x22\x6b\xce\x07\x24\x26\x9e\x8e\x32\x1a\xc5\x0a\x97\x57\xde\xe9\x09\x03\xc2\x3d\xe5\x4f\x1b\x05\xb8\x3d\x02\x03\x46\xf7\xdf\xeb\x31\x1b\x31\x0f\x03\x19\xe3\xbb\xce\x10\x4a\x0f\x03\xc5\x79\x1e\x06\xda\xca\x19\xdd\x23\xa6\x1d\x3d\xa0\x77\xc8\xcb\x23\xa2\xb7\x07\x2a\xc6\x3c\x0c\x43\xa1\x8d\xfb\x10\x50\x3d\x9c\x0e\xed\x77\xbb\x06\x91\xfb\xb5\x10\x46\x2c\xc1\x8e\xe8\x5d\x79\x5b\x2e\xcb\x42\x41\xf5\x1d\xa5\x2e\x0f\xa3\x54\x07\xd2\x53\x77\x65\x6a\xb6\xea\xc9\xc3\x38\x32\xc6\x3d\xb0\x50\x4d\xde\x4d\xa1\x30\x96\x1a\xf7\x4a\x71\x6a\x4a\xdc\xdf\x67\x27\x44\x18\x03\xb5\x7c\xe3\x18\xe9\x0e\x5b\x63\x67\xe1\x99\x3c\x4c\x42\x8b\x4d\x75\x40\xe3\x09\x6e\x82\x87\x94\xc5\x48\xcb\x7e\xa8\x8f\xdd\x9f\x64\x1c\x7a\x02\x0c\x39\x15\x26\x73\x99\xd5\xd1\xff\xf5\xe7\x01\x30\xd7\x0e\x74\xc8\x9a\x71\x89\x73\x3a\xaf\x42\x46\x35\x0a\xa0\x6f\xa1\x51\xa2\x7e\x7d\x3c\xd9\xbb\x1a\x3f\x2d\x03\x83\x39\x9a\xd5\xfb\x5d\xf9\x8e\xb9\x6c\x6b\x03\xbe\xe0\xd5\x9f\xe6\x84\x47\xdf\x87\x87\x09\x32\xa5\xbd\x97\x03\x8a\x94\x2f\x8a\x8e\x17\x65\xd2\x61\x92\xd9\x5f\x8f\x59\x5a\x4c\xa1\xb5\x63\xd9\xbb\xf8\x12\x73\x2d\xc3\xfe\x6c\x00\xcc\x41\x1f\x4f\x15\xdc\x4c\xec\x4c\xc8\x4d\x1c\x93\x4e\xd2\xac\x0d\x2f\x57\xb5\xaa\xca\x8f\xdf\x06\xc5\x67\x1e\xa6\x2c\xd0\xee\x0d\x62\x02\xef\x7a\xc0\x9d\xf9\xab\xfa\xaf\xbf\x84\xb2\x5d\xff\x4e\x81\xc0\xcb\x90\xcf\x10\xae\xfa\x13\x34\xc7\x46\xa8\xdf\x9f\x9f\x6c\x53\xef\x7e\xfb\xfc\xf4\x74\xf7\xe7\x7e\xb7\x5e\x6d\x62\x3f\x81\x84\x08\x59\x8f\xc6\x1c\x6a\x06\x4d\x2e\x27\x23\x1a\x3b\x90\xc5\x75\x25\x3e\x9e\xfc\x05\xa4\x08\x31\x9f\x58\x41\x51\x9e\x0a\x05\xff\x00\x38\x76\xee\x70\xa8\x64\x80\xa8\xb4\xab\xd3\xf9\xba\x3c\xc9\xbc\x3f\xa2\x89\xc6\x34\xc6\xee\x23\x2b\xde\x46\xfd\x8f\x3c\xd4\xb1\xc0\x86\x31\x0c\xbd\xcd\x04\x97\xfe\xff\x13\x32\x7a\xfc\x74\x10\x68\x65\x37\x5a\x58\x9e\x65\xe7\x31\x8f\x9c\xae\x10\x48\xc4\x7a\x4a\x7a\x8b\xc0\x15\x5f\x44\x2e\x21\x44\x04\xe7\xdc\xbf\xb3\xe2\x25\x9f\x24\xea\x78\x68\x54\x1a\xdb\x3c\x78\x7d\x72\x99\x72\xdf\x04\x30\xd9\x0e\xa2\x80\x53\x0f\x5c\x48\x1e\xe0\x63\x57\x89\xac\x99\x02\x64\x67\xff\xe9\x1d\xb8\x88\x10\x21\x5c\xb5\xf8\x49\x54\xbd\x62\x19\x8f\x08\x4b\x88\x4b\x0a\xb4\x47\x2e\x85\x4a\x78\x44\xd2\xd8\x92\x4d\x5b\x45\xa8\x21\x57\xdd\x64\xa0\xb1\xba\xa5\xaa\x3c\x1c\x45\x05\xb6\x44\x3b\x6e\x7d\x1e\xfd\x4b\xdc\x79\x21\x89\xad\x6b\x5f\x1e\x9f\x8f\x8b\x77\x91\xe5\x3d\xb8\x84\x47\x61\x6c\xc9\xa1\x30\x91\xb2\xc1\x60\x1b\x7e\x82\xbc\xcd\x4c\x73\xf1\xae\x42\xcd\xb4\xf1\xbc\xdf\xae\x37\xfc\x0b\x4d\x0f\x1e\x45\x91\x9d\xb9\xf8\xfa\xb3\xdf\x1f\x2f\x34\x24\x86\x1f\x3f\x8a\x22\x4e\xa5\xcd\x6e\x38\xe9\x31\x7f\x40\x31\x04\x5a\x64\x85\x82\xa2\xc9\xde\xb3\x1a\xa7\xc3\x20\xa4\x75\x03\x63\xca\xc4\xd0\xdb\xef\x8b\xf1\xdd\x08\x66\xb0\xfd\xf3\x20\x3e\xbb\xac\x53\x87\xa7\xe2\x51\xac\x62\x24\xa4\x94\xa7\xf3\x42\xa9\x89\xc0\x3e\x8f\x92\xc0\x0a\x0c\x63\xb3\xb5\xcb\x0c\x82\x9e\x8c\x21\x56\x71\x08\xd9\x5a\x27\x99\x2d\x1e\xd1\xd0\x12\xbe\x3a\x63\x30\xe0\x0a\xe0\x11\xa5\x36\xe7\xe1\x4c\xc9\x6e\xf1\x70\xbd\xd8\x5c\xef\xad\xec\x99\x1b\xc3\x82\x38\x0d\xbd\xe0\xc1\xb4\x6d\x8e\x47\x2c\x4c\xb0\x5c\xb1\xdd\xfd\xca\xf3\x8f\x98\x00\xdc\x0a\x91\x79\xd3\xb6\xc2\xb6\x31\xc9\xd0\xb6\x7b\x4f\x37\x62\x2a\xc2\x38\xc9\xe1\x8a\xd0\x77\x40\x43\xfc\xc7\xe3\xe6\xa6\x27\xb2\xfb\x36\x62\x8e\x78\x62\x35\x90\x6a\xf0\xb4\x4b\xdf\x53\x89\xf1\x28\x35\x2a\xa1\x1e\xaa\x21\xf2\x85\x7a\xcd\xe0\x7d\x58\x60\xe6\x91\x24\x10\x5a\x9b\xdd\x3a\xb1\xb3\x37\xaf\x0c\x33\xb6\xdb\xab\xb5\x73\x97\xfa\x36\x3c\x02\xa2\x3d\xba\xed\xb9\x86\x0a\x11\x1a\xeb\x89\x64\x1a\x8f\x4c\x1a\xa3\x5b\x07\x28\x57\x46\x7e\x02\xf8\xdc\x48\x1c\x50\x82\xa4\x7c\x77\xe5\xcb\x3f\xce\xaa\xfd\xa1\xfa\xd2\x37\xf7\x63\x75\x88\x86\xe2\xd6\xb7\x47\xf3\x98\x70\x8d\x31\xf5\xd5\x6a\xf9\xab\x5a\x3d\x8f\x89\x16\xc8\xaf\x95\x97\xea\xcd\x09\x47\xd7\xdd\x85\x0c\x41\x58\xe2\xab\x28\x74\x0e\x63\x50\xdc\xfc\xdd\xb4\x8e\x1d\x74\xaa\x8c\x33\xde\x6c\x1c\x9a\xc0\x58\x7a\x94\x17\xc7\xd7\x3f\xe5\xad\x74\x03\x23\x95\x90\xa1\xbc\x97\x1f\x36\x2f\xbd\xd4\x8e\x4f\xf1\xa5\x89\xa6\x11\x97\x7b\xe2\xd4\x45\x8a\xe3\x24\xb6\xfc\x14\x8e\x3c\xe7\x3e\x2b\xfa\xb6\x40\x1e\x27\xa1\xe5\x50\x42\xa6\x25\xab\x17\xf8\x54\xe6\xb9\xf5\xbb\xbe\xc8\xd5\xc5\xd4\x51\xe4\x1f\xa1\x72\x76\x02\x33\xee\x8f\xc6\xa1\xb1\xc6\x37\x4c\x53\x85\x90\xc0\xfb\xf5\xc3\xfa\xe1\x76\xbf\x59\xfd\x5c\x6c\xae\xfd\xef\x53\x15\x22\x2e\x7d\x28\xbf\x33\xf8\x21\x63\x0b\x91\x1f\x22\x6b\xfe\x79\xea\x93\xc2\x31\x8b\x05\xf6\x3a\xee\x5d\x91\x68\x73\x2a\x26\x0c\x28\x3c\x66\x82\xa0\xfa\x44\xbb\x48\xa5\xa8\xc1\x6d\x63\xe3\x56\x98\x2f\xa8\x77\xda\xb3\x19\xb1\xbd\x9d\x8f\xc5\xae\x12\xb8\xd1\x0f\x3d\xa7\xd8\xe7\x13\x75\xb9\x98\xa9\x70\xf7\x17\xe2\x10\x42\x07\xcd\x74\x5d\xa4\xdb\xd2\x34\x03\x6a\x5c\x1e\xa7\xa1\xc1\x04\xc5\x31\x53\x6f\xbb\x4c\xbd\x41\x33\xd4\xe1\xe7\x71\x9a\x04\xda\x8c\xd0\xc7\xd9\xc1\xd6\xb2\x2e\x1e\x3b\xa5\x71\xe8\x60\x69\x98\x97\x58\xeb\xee\x47\x14\x20\x9a\xea\x90\x15\x1d\xc9\xc4\xf8\x5c\xc1\x02\x21\xdc\x22\x01\x7d\xe9\x4b\xc7\x32\xb5\xd1\x97\x6e\x7d\xbd\x13\x58\xcf\xc9\x5f\x5f\x25\x51\xd4\x83\x46\x1e\xe0\x63\x8a\x0c\x18\xba\xbe\xb1\xa2\x11\xb2\xcc\xac\x97\x8f\xfb\xe5\xe2\xc9\xfb\x7d\xb1\x0e\x58\x24\x86\x22\xe6\xed\x8c\xfd\x2e\xbe\x8d\xb5\x8e\x50\xd9\xb0\x01\x71\xb0\x5f\x77\x1f\xf9\xab\x41\x62\x99\xe1\x96\x9b\x3f\x9f\x76\x8f\x0f\xab\xcd\xea\xf9\xbe\x3b\x26\xd3\xb4\x2f\x64\xf6\xc5\xf4\xc9\xde\x1d\x83\x94\x5e\x14\xe6\xf7\x7b\xef\x30\x74\x14\xdc\xed\x62\x8b\xfd\x50\x13\x59\x31\xd3\xf2\x1d\x2a\x5d\x09\xd3\x3c\x63\x16\xbe\x4b\x66\xc5\x86\xd9\x14\x0b\x3e\x90\x2f\x0d\x55\x70\x59\x10\x1e\xad\xa1\x84\xc4\x04\xf3\x5c\x7b\x38\x64\xcd\x52\x34\xf0\x52\x56\xe7\xd5\xbb\xc8\x4f\x58\xb7\x9e\x33\x56\xf3\x5a\x25\x3c\x21\x34\xe9\x37\xe3\xed\x49\xda\x38\x73\x64\xfb\x13\x02\x21\xd6\xe7\xee\xca\x17\x4b\x07\xf9\xb0\xda\xcd\xbf\xfc\x24\x4c\x53\xb4\x2f\x88\xb3\x26\xb8\x21\xae\xbc\x48\x22\x4f\x42\x9d\x48\x2b\xa9\xef\xe4\x8f\xf6\x5d\x16\x6f\xfc\x80\x91\x0e\x3d\x9b\x70\xbb\x97\x5c\x9d\xdb\xff\x2d\xc4\x01\x46\xa8\x12\x9e\xc4\xa1\x41\xa1\xb4\xc5\xc3\x9f\xfe\x37\x12\x1d\x23\x2e\xb6\xbd\x2f\x0f\xbe\x1d\x3f\x0e\x4d\x12\xec\xf5\x5d\xfc\xe7\x24\x9e\xc4\xf9\xb7\x19\x07\x7d\x9c\x92\x4c\x5a\x87\xc8\x6a\xa2\x6a\x0d\x95\xe5\x05\xbd\xea\xb2\xb9\x09\xe5\x1c\xd3\xdf\xfb\xca\xf1\x82\x6d\xbb\x23\x32\x55\x1e\x85\x63\x79\xdf\xfc\x11\x46\x18\xa6\xae\xca\x23\x0c\x80\xea\x3c\x61\x09\x09\x5c\x49\xf5\xba\x10\x43\xb6\x35\x9e\xa4\x01\x89\x12\xe7\x8c\xb7\x3e\xae\x13\x4d\xe8\x0e\x87\x11\x2e\xd7\xff\xcb\xe4\x93\x6f\x5c\xe4\x49\x2a\x82\xd4\x35\x92\x0e\x63\x97\x24\x05\x89\xde\xb2\xa5\xe9\x68\x63\xad\x7d\xbc\xbf\x5b\xdf\xaf\x77\xdd\x08\x63\x70\xcb\xdf\x7e\xc0\x35\x7c\x4e\xd4\xff\x79\x22\x58\x88\x7d\xe2\x0f\xf0\x81\x65\x2e\xff\x67\x29\x48\xea\x51\x08\xf0\xbc\x59\x8f\x1c\xbb\x44\x68\xc0\xdc\x80\x2b\xb1\x6d\xf7\xbf\xaf\xb6\xbb\x76\x23\x18\x73\x84\xe0\x40\x74\x57\x1d\x97\xd3\x30\x3b\x9f\x48\x12\x61\x23\x12\x52\x50\x5e\x65\xcd\x83\x38\x35\x99\x1a\x96\x54\x79\xa2\x02\xdb\xf0\xbc\x3f\x0a\xf5\xb6\x11\xae\x7e\xf1\x3f\x45\x59\x89\x26\x76\xaf\x78\x87\x2a\x33\x56\xa3\x6b\x36\x76\x4d\xb4\x0b\x9e\x5e\x90\x13\x0c\xf9\x0f\x27\xf4\x02\x3c\x81\x80\xf5\xf0\x91\xfa\xcb\x5b\xf0\xa3\x93\x14\xe2\xa9\xbc\xe7\x18\x16\x39\xbf\xf2\xc0\x58\x72\x05\x71\x3c\x42\xa1\xaf\x45\xf5\x56\xb4\xf7\xfd\x6d\x16\xe2\x8b\x7b\x30\x11\xa3\xce\x1d\xb4\x2c\x05\x93\x8d\x21\x31\x89\x45\x9a\x34\x76\x27\xc4\x37\xeb\x0f\x19\x1b\x2e\xd7\xd0\x2c\x4e\x4d\xd9\x11\x35\x67\x65\xf1\x7b\x26\x56\xbb\x1f\xc3\x5a\x5d\x3d\x69\x77\x68\x4f\x07\x8c\x37\x0f\xd8\xca\xf1\x75\xd2\x8a\x06\xd2\xd8\x2e\x98\xcd\x72\x38\xad\x69\xa0\x09\x4e\xbf\x36\x68\x39\x15\x59\x63\x09\xdf\x2c\xdd\xb0\x1f\x43\xa4\x00\xd1\xe7\xaf\xf6\x62\xe4\x82\x51\x02\x84\x3a\xf0\xcb\xea\x80\x1d\xe9\xb0\x15\xb9\xa8\xce\xdf\xe7\x89\x29\x31\xa9\x97\x1e\x19\x82\xc6\x76\x93\x7a\x28\x0d\x99\xc2\xf4\xfd\xdd\xfa\x61\xbd\xec\x94\x6a\x38\x8d\x4c\x82\x85\x87\xab\x46\xfd\xd7\xd6\xea\x7e\x59\x2c\xa1\x31\xa1\x38\xb9\x96\x9b\xc7\x9f\xd7\xdb\xc5\xdd\x6a\x28\x60\xc6\x69\x1c\x2b\x0c\x1d\x3d\x56\x64\x0f\xcd\xeb\xbe\xdd\x27\xc0\xb2\xb2\x77\xe3\x98\x45\x55\x94\x4e\x65\x62\x6c\x59\x68\xcc\x05\x1e\xb6\x1c\x0f\xa7\x62\xc8\xca\xcc\x69\x92\x86\x84\x8e\xc8\x59\xef\x4a\xf5\x96\x15\xd7\xe2\x3c\x99\x38\x94\x06\x02\xd3\x79\x8e\xea\x7d\x9a\x39\xa4\x94\x52\xdc\x30\x97\x65\x51\x97\xa3\xef\xca\x02\x86\x31\x59\x56\x2f\xf3\xb2\x86\x1e\x5a\xc1\x29\x27\x04\x79\x91\xfc\x5e\xd2\xeb\x99\x8d\x7f\x9c\x47\x8c\xcb\x8e\xa6\xf7\xd1\xac\x0b\x55\x7e\x55\x25\xa0\x3c\xd2\x88\x98\xb5\x99\xed\xf3\x73\x91\xa9\x5f\xc4\x82\x94\x2b\x4d\x5d\xfc\xf2\x54\xe6\x99\x3a\xdb\x7e\xa4\x27\x6c\xd0\xf8\x6d\x92\xfe\xf3\xe7\x80\xe2\xae\x94\x33\xc2\xbc\x8c\x6f\x46\x48\x89\x01\xb5\xc8\xf3\x9b\x2c\x3f\xd4\x17\x6a\xc7\x9c\x4a\x16\x99\xa0\x0b\xfb\x87\x15\x49\x2a\x95\x15\xe1\x5a\xfd\xf1\xb4\x5a\xee\x56\xd7\xfb\xd5\x83\x77\xb8\xa9\x4a\x23\x7c\x27\xae\xc6\xfb\xe8\xd8\x96\x27\x4e\x3b\x85\x28\xc1\x4e\x85\x1a\x9b\x9f\x27\xf3\x19\x74\x62\x4d\xd6\x6b\x56\xe9\x7b\xf1\x39\xca\x8a\x53\x00\x86\xbe\x6c\x65\x33\x22\xcb\x53\x93\xc1\x38\x64\x8d\x83\xc9\xaf\x19\x16\x22\xc6\x63\xef\x85\x33\x6c\x5d\xc8\x87\xbb\xf3\x5f\x8c\x05\x22\x40\xfa\xd0\x76\xf9\xbd\x8a\xa2\x80\xbc\x9d\x29\xed\x2c\x83\xa6\xc9\x7b\xe6\x0f\x3f\x5c\x82\x6b\x1c\x6b\x7e\xb7\xaa\xf1\xdb\x06\x8e\x0e\x5b\xfd\xad\x8d\x66\x81\xd6\xb8\xab\xb7\x7e\xa2\xbd\xa9\xd6\x4a\x5b\x76\xb4\x8e\x4c\xf8\x0b\x86\x0a\xce\x88\x16\x98\x6a\xdc\xfe\x78\xdc\xf8\xbd\x96\x11\x63\xb0\x63\xeb\x16\x9a\x0b\xe5\x1d\xce\xc2\x24\x52\x8e\x51\xa9\xf5\x24\x4e\xfd\x76\xcb\x22\x49\x10\x9f\x71\x6b\x77\xa0\xc3\xe9\x70\xe5\xd1\x6a\x9c\xc5\x81\x60\xbe\xcc\x5c\x81\xce\x9a\x3b\xd0\x53\x32\x7c\xce\x92\xd8\x36\x38\xf8\xe6\xd6\xea\x5e\x1c\x8f\x17\xa5\x16\x96\xd0\x28\x62\x23\x74\x95\x03\x32\x97\x55\x7d\x07\xc5\x4b\xf3\xea\x90\xb7\xf7\xe5\xd2\xdf\x40\x92\x26\xca\x31\xfc\x17\xe5\x87\xf5\x2d\xfd\x21\x19\x82\x43\xc9\xac\xeb\x2b\xd1\xa8\xd7\x81\x1b\xc4\x68\xc0\x84\xed\x17\x2a\x3f\xbc\x7d\xde\x9b\xb2\xda\x97\xc7\xd6\xf6\xec\xaf\xfc\x65\x68\xc8\x11\xb9\x69\xe5\xc7\xd6\x9e\x62\xcd\x1f\xa5\x01\x96\x59\x17\x9b\x21\x05\x14\x67\x54\x70\xec\x51\xdc\x57\x65\xc7\x53\xc3\x19\x93\x09\x56\xd2\xbc\x23\xee\x5e\xe8\x0d\x38\xcc\xea\x8c\x5f\x3e\x58\x67\x8c\x69\x89\x00\xdf\xa2\x2c\xba\x1b\xe0\xc2\x6a\xa0\xd8\x20\xc8\xba\xf9\xa5\x6d\x1d\xea\xf3\x69\x8c\x0b\x80\xa1\xe2\xeb\x22\x9f\x94\xf0\xdc\xb8\x34\x48\x50\x81\x41\x0f\x76\xd5\x41\xe8\xfa\x0b\xd4\xf6\x17\xb3\x39\x15\x06\x49\x83\xbd\x54\xd7\x44\xfa\xc8\x8f\x32\x0a\x73\xa6\x02\xd9\x43\x2f\xec\x0f\x13\x26\x61\x72\x50\x0c\xbc\x29\xab\xad\x98\x91\xbb\xee\x8a\x3c\xfd\xb7\x96\x44\xa1\xfb\xfc\xd1\x77\x96\x5c\x81\x29\x2b\xdb\x7a\x37\x53\xf2\x64\x92\xd9\xf5\x60\x95\xa8\xac\xc2\xd9\xf8\x76\x14\x68\x74\x95\xb1\xf7\xdf\xc1\x30\x2e\x2a\x33\xa3\x33\x74\x18\x61\x0e\xec\xf6\x74\x38\x78\xe7\x99\x69\x2e\x31\x99\xfa\x21\xf2\x37\xbb\xa7\x63\x10\x3d\x0e\x3d\xa7\x7a\xe7\x9c\xe9\x34\x0e\x3b\xc6\xb9\xde\x16\x62\x4f\x0e\x52\x6a\x5c\x5f\xcf\x5b\x7a\x06\x81\xc2\x2f\x5c\xc0\xc7\xe2\xc5\xe5\xea\xc7\x1d\x82\x9c\x41\xa2\x23\xe3\x3d\xec\xcc\xeb\x14\xdc\x60\xc1\xa5\x50\xe7\xc9\x9b\x00\x96\x24\x03\xcd\xa4\xdf\xa6\xaa\x75\x9c\x81\xdb\xdd\xad\x54\x99\xe8\xee\x16\xa4\xf2\x52\x2b\x2e\x45\xe6\x16\xc4\xb8\xcd\xd9\x8d\x36\x91\x6d\x4b\x2e\x3f\x8a\x9b\x2c\x87\xf9\xcc\xbf\x1f\xcb\x63\xe4\xbf\xe8\xf2\xb7\x75\x89\xb2\x5b\xc3\xf2\xc4\xe4\x0c\xa3\x89\x55\x6c\x43\x90\xb8\xf3\x33\x5c\xd5\x7d\x36\x48\xe6\x41\x64\x79\x8b\x84\x9e\x90\x61\xce\x31\x88\x5d\xbc\x15\x1e\x24\x11\x31\x3e\x71\x22\x54\x9e\xfd\x17\xfa\xca\xa5\x1b\x43\x58\x1c\x38\x79\xf7\x1b\x71\x40\x36\xb7\x6a\x2e\x9c\xec\xde\x12\x27\xc6\x62\x65\x90\xdb\x73\xe7\xd1\xd7\xe3\x57\xc9\xc3\x84\x62\x57\x6f\x9d\x0f\x62\xf1\xaf\x52\x53\x3c\xa4\x34\xe8\x41\xb8\x4b\xc8\xf3\x75\x17\xa4\xf1\x50\xc7\xa9\x71\x99\x5d\xa1\xc0\xb7\x9b\x8d\xd7\x13\x8f\x62\x21\xdc\x7c\xf5\x54\xcc\x03\xc3\xc6\x23\xca\xe3\xb8\x73\x9c\x9e\xc4\x19\xba\xba\x0c\x8f\x84\xc0\x50\xe9\x36\x2f\xa5\xc8\xed\xcc\x58\x8a\xe3\x0f\x51\xe9\x6e\x88\x0c\x54\x5f\x8e\xda\xcc\x68\x8f\xf9\x81\x46\xa6\x81\x47\x83\xe1\x96\xec\x05\xac\xdd\x80\x24\x09\xf8\x40\x3d\xae\xcb\x37\x7a\x91\x97\x49\x3f\x8f\x3f\x4b\x0b\x49\x87\x2c\x1f\x4f\x50\x0d\xf4\x4e\xdd\x28\x1a\x1a\x65\x33\x7c\xab\x5a\x89\xa3\x4f\xf0\x8d\x69\x70\x39\xa7\x89\xd4\xb6\xf4\x51\x37\x50\xb5\x21\xd6\xda\x2d\xac\xf1\x2b\xa5\x9a\xa2\x33\xd8\x49\x33\x5d\x3a\xa4\xad\x23\x81\x63\x0e\x36\x09\xdb\x86\x51\x76\x2d\xeb\x45\x33\x44\x0d\xb6\x76\x88\xd0\x29\x3d\xed\x06\x50\x3a\xd9\xc6\x67\xb3\xae\x06\xe7\x10\x2b\x9b\xd2\x42\x04\xe9\x16\x4b\x7c\x0b\x9f\x83\xe0\x69\x24\xa8\xc3\x4b\x3f\x9c\x0e\x8f\xa6\x9d\x8a\x75\xbb\x89\x6f\xc5\x01\xd6\xda\x53\xc3\xb8\xd1\x32\x4c\x30\x43\xb7\xf8\xbf\xbb\xdd\xca\xb3\x9a\x71\x2e\x29\x11\x96\x7c\x71\xed\xa4\xe2\xf4\xaa\x28\x4f\x2f\xaf\x93\x17\x22\x21\x45\x53\xba\x59\x6d\x57\x9b\xdf\x57\xfb\xd5\x1f\xcb\x1f\x8b\x87\xdb\xd5\x7e\xb3\xd8\xf9\x78\x85\xab\x40\xe0\x74\xbd\x5b\xdc\x3f\x75\x7f\x4b\xc0\xd8\xf6\x93\xcf\xc6\xf9\xd2\xfe\x48\x6a\xf5\x4a\xf7\xf2\xd4\x3a\xe8\xd6\x26\x64\xff\x05\xfd\x94\x7d\x42\x3e\x6a\xc3\xfa\xaa\x59\xd9\x5d\x09\x22\xcb\x07\xd4\x86\x7c\x9b\x65\x18\x88\x19\x00\x3e\xe7\xa0\xac\x5c\x54\xfd\x5a\x7e\x3c\x17\x47\x91\x79\xf0\x8c\xef\x20\x98\x0c\x37\x21\xa6\x78\x96\xa2\xca\xcb\x7a\xe8\x7f\x70\x23\x62\xc4\x3d\x3a\x4d\x0c\x1f\x06\xd9\x80\x21\x9f\x4e\x4d\x03\x71\xa8\x07\x06\xff\x17\xfe\x29\x37\x60\x73\xa6\xda\xb5\x16\xa1\x53\x4b\x7c\xf5\x2b\x0d\x82\x18\x71\x02\x87\x52\x67\xe6\xfc\x4f\x6c\x0f\x55\xcb\xbc\x3c\xe9\xf5\xe3\x6e\x2e\x4b\xe2\xcf\x0b\xa9\x88\x5c\x62\xd5\xf2\x19\x8d\xcd\x61\x1a\x48\x86\xcc\x43\xc6\xb1\xdd\x5c\xd2\x0d\xf0\x34\xd0\x21\xfa\x58\xeb\x7a\xf7\x9a\xd5\x4e\xb3\xc2\x5f\x80\x24\x0a\x39\x0e\x8f\x58\xd1\x7b\xaa\x60\xbd\x7b\xdc\x7f\x40\xf6\x34\x62\xd0\xe7\x29\x61\x04\x69\x62\x70\x3d\xfc\x10\x75\x96\x5f\x4d\xa8\xc8\x79\x4a\x52\x8a\x69\x60\xa8\x04\x36\xf9\x8f\x79\x68\x78\x4a\x84\x41\x96\xd2\x03\xbc\x88\xa5\x28\x3c\x37\x26\x4f\x89\xd1\xc8\xda\x03\xa2\xca\xcf\x32\xab\xf4\x0a\xb5\xb0\xdc\xd1\x90\x5b\x89\x05\xef\xaa\xed\xb3\x89\x44\xdf\x5f\x3d\x81\xe1\xf8\x3f\xbf\x3c\xf0\xbf\xff\xa7\x4f\x2c\xa7\x61\x4a\xb0\x9f\x14\x95\xe8\xe1\x73\x96\xec\xd9\x0d\x8d\x39\xe3\x3d\x9b\xc1\x53\x55\x1e\xca\x7b\xb8\x0c\x7b\xe7\x3a\x2c\x79\x4a\x99\xf5\x88\x33\x5f\xf5\xc7\xe0\xbb\x7b\x19\x54\xa7\x38\x31\xb3\x7a\x03\x2f\xa7\x5c\xcc\x36\xae\xf0\x94\xb1\x00\xb1\x27\x4f\x39\x14\xa7\xc3\x6f\xa7\x0b\xce\x4e\x9e\x32\x6e\xf5\xcc\xea\xd2\x34\x1b\xa8\xcb\xfc\x1d\x2c\xcd\xd7\x78\x29\xa4\x9c\x46\xe8\x4f\xfb\x6c\x66\xeb\x66\x7a\x4b\x91\xa6\xae\x5b\xb9\x12\x19\xd2\x51\x67\x65\x7f\xc4\xf2\xf1\x1e\x11\xbc\xd7\x89\x42\x76\x0f\x22\x62\x13\xa4\xfe\x25\x95\x95\x73\x81\x51\xa6\xa5\x0b\xb5\x52\xa1\x94\xf0\x80\x73\x6f\xd5\xaf\x45\xf3\x45\x67\x14\x4f\x05\xc4\x98\xed\x2e\x5b\xf7\x01\x26\x6b\x45\x25\x12\x6c\xe7\xc6\x1f\xfb\xdd\xe3\x6e\x71\xe7\xb0\x2f\x8b\xfb\xc7\xe7\x0e\xc0\x9f\xaa\xd6\xfa\x0d\xbc\xea\x8b\xaa\xc4\xe4\x63\x2b\x2d\x70\x05\x22\xb0\xd9\x3d\xe5\x20\xbf\x92\x6a\x02\x98\x38\x35\x65\x29\xc7\x58\xca\xd4\x10\x16\x39\x3e\xe2\x01\x85\xf2\x24\x2b\x7e\xea\xc9\x2f\xa6\xb9\xd0\xd4\x24\x06\x53\x19\xea\x70\xc9\xa5\xd0\x1b\x00\x11\x10\x85\x4d\x89\xea\x5d\x0d\x78\x5e\xb8\x20\x3a\xc4\x00\xc2\x64\x55\xdd\x60\xa3\xca\xcf\x7b\xaf\xdc\xde\x97\xc6\x44\x1c\x44\xda\xd2\x95\x1c\x3d\xc6\xfe\x9b\xd9\x2f\x62\x69\x08\x19\xd0\xe9\x0d\x11\xe3\x9d\x5f\xfd\xb7\x19\x2f\x5b\x24\x21\x8b\x3b\x09\xde\x5c\x9c\x41\x6f\xad\x4e\xad\x27\x4c\x1b\xbc\x91\x90\x0f\xdd\xc8\x89\xb0\x09\x17\x49\x1c\x20\x03\x93\x6f\x73\x9f\x5d\x25\x22\x51\x21\x06\x0d\x15\x98\xac\x80\x5e\x48\x85\x0b\x4a\x38\x96\x4c\xd1\xde\x54\x58\x46\xd8\xab\xd6\xc1\x1a\x38\x69\x82\x42\x8a\x2f\x46\x43\x9e\xbd\x43\x75\x1e\xd7\xc0\x47\x9f\x4a\x30\x96\xf2\xd8\xeb\x53\x58\xda\xd4\x81\xeb\x2b\x52\x61\x65\xc2\x2d\xea\x77\x08\xc9\x9d\xbc\x5d\x41\xa4\x15\x7c\x13\x59\xf7\x1d\x05\x03\xe2\x7a\xc9\x77\x20\x0e\x3f\xb0\x88\x3e\xaa\x01\x08\x21\x42\x34\xcd\x16\x78\x73\x2f\x8e\x3d\x10\x4b\x48\x20\xc6\x41\x1e\x97\xab\x5d\x8c\x04\xdc\x57\xe7\xb5\x76\xce\x58\x37\x8a\xfa\x54\xeb\xa0\x8b\x7a\xad\x2f\x77\xc6\x49\x82\x59\xa8\x90\x5a\x81\xab\x57\x71\x09\x2c\x11\x10\x31\xb4\xee\xe0\x6a\x69\xe3\xde\xe0\xc9\xd3\x43\x04\xb1\xec\x1c\x6f\x4c\x54\xd9\x48\xc3\x42\x89\xa6\x99\xf7\xc9\xc9\x09\xa0\xb6\xb5\xa3\x4a\xdb\x89\xc2\xab\x9f\x72\x01\x69\x80\x29\xb3\xcd\xcd\x70\x85\x0a\x00\xa5\xd3\x8e\x57\xbb\xb9\x69\xed\x54\xd3\xe4\xb0\x1c\x0a\x2e\xcc\xbb\x04\xc2\x84\x11\x3e\xb6\xdf\xb6\x76\xe5\xf1\xd9\x97\x53\x84\x89\x8d\x49\xfc\x54\x47\x22\x2a\x8c\xc4\x66\x5a\x5c\xb9\x30\x14\x90\x4f\x04\x0e\x59\xf3\x43\xd4\xaf\xdb\x41\xab\xd8\xfc\xec\x37\xcc\x92\xe4\xa3\x46\x50\x25\x5a\x8b\xba\xbc\x8c\x1f\x85\x51\x09\x16\xd0\x8f\x08\xd4\xf5\x99\xe4\x49\x87\xc7\xf8\xa9\x64\x10\x11\x5c\x32\x8e\xd7\xac\xbd\xdb\xd3\x80\x7d\x76\xf0\xbf\xfe\x84\x84\xd0\xd0\xd1\xfc\x17\x2f\xb0\xcb\xf2\x81\x2e\xc9\x64\x4f\x92\x24\x21\xc6\xb6\x1a\x16\x8d\x18\xd0\x66\xfa\xc3\xdc\x96\x3a\x73\x30\xcd\x9d\x6b\x04\x71\x87\xc2\x24\x40\x06\x04\x14\xdf\xe8\x48\xdf\x06\xf9\x2d\x19\x52\xc7\x95\x51\x3f\xaf\x5b\xa3\x83\x21\xc4\xba\xa0\xf1\x08\x55\x20\x23\x62\x82\x76\xa1\xfe\xf8\xf1\x23\x9a\x51\xf5\xe2\x32\x0a\x43\x8c\x6d\xde\x2d\xf9\x8a\xfe\x99\x15\xc5\x58\xa4\x89\xcb\x98\x24\x96\x90\x5f\x14\x79\x26\x8a\x97\x9e\x26\x80\xcb\x38\x34\xc4\x0c\x4d\x53\xbd\x28\x1e\x8f\xc7\xb2\x80\xfe\xfc\x24\x00\xe8\x68\xab\x8a\xa2\xc8\x8a\x17\x97\xf0\xeb\x46\x30\xdb\x90\xf0\xfb\xfa\xa9\xd3\x5a\xfb\xaa\xf0\x34\x7e\xc7\x34\xb0\xc2\x36\x42\xbd\xdd\xd7\x2f\xb3\xb1\xbf\xe4\xa1\xc2\x7e\xfd\x2b\x51\x43\xc7\x19\x39\x01\x2a\x4a\x4e\x15\xb6\x85\xfc\x9f\xed\xd7\xf9\x25\x02\x48\x72\x96\xfa\x76\x7c\xdb\xb8\xba\x9e\xe4\x90\x64\x1b\x5a\x77\xa2\x20\x2b\xef\x0d\x4e\x06\xa5\x2c\x42\xb0\x1c\x96\x53\xee\xad\xc8\x50\xd6\x99\x33\x99\x72\x82\x31\xc0\xcd\xe3\xf3\x66\xf7\x63\x18\xeb\x48\x21\x52\xa6\x87\xd2\x5a\xd7\xd0\x80\x6a\x90\x8a\x71\xbc\xe8\xa4\x64\xd4\x76\xfe\x62\x91\x1e\xd3\xd9\x87\xc1\x07\x92\x90\xa0\x63\x82\xa1\xcb\xef\x65\x73\x91\xbb\x95\x2a\xa2\x58\xb0\xfb\x47\x0e\xe7\x62\xf8\xfd\x55\x24\xa8\x1a\xe7\xde\x9e\x72\x51\x14\xae\x83\xab\xab\xd3\xf9\xe1\xd2\xa0\x93\x70\x14\x67\x1b\x73\xb7\xb7\x71\x55\xea\xf3\x5c\x4a\x48\xea\x54\x39\xfd\x8f\x37\xb0\x98\xa0\x9d\x47\xc7\x4c\x5f\xa3\x16\x11\x38\xdb\xb6\xdb\x0c\xf2\xac\xf3\xb3\x06\x64\xa8\x6c\xa5\x45\xbd\x9d\x8e\xf4\xb0\x0f\x03\xc2\x03\x1e\x90\xc9\x63\x1b\x9d\x30\xd3\x95\x67\xa1\x7a\x34\xa6\xee\x16\xb0\x0a\x0c\x49\xa0\x43\x5b\xa3\x86\xfe\x38\x46\x50\x24\xd0\x58\xae\xba\x42\x0e\xf1\xd9\x06\x0e\x45\x42\x8d\x6a\x02\x4f\xed\x2b\x99\xc8\x15\x73\x45\x18\x60\xa9\xa0\xa3\xfb\x15\xf9\xf4\x7c\x11\x60\x9d\xfa\xea\xe4\xb4\xa9\x56\x9f\x13\x31\x80\x81\x67\xce\x1c\xab\x96\xb3\x6a\xce\xac\xa9\xd0\x11\x73\x8e\x72\x7c\x3d\xc4\xfc\x5b\x34\xbf\x0a\x19\xc7\xc4\x9d\x35\x21\xaa\x93\x12\xf0\x87\x95\x15\x4f\x3a\x88\xac\x58\x2f\x1f\x57\x43\x69\x25\xae\x22\x12\x60\x81\xb1\x27\x60\xb4\x33\xe1\x6b\x95\x73\xae\x22\x1d\xe2\xf6\x76\x27\x0e\x62\xb8\xc1\xa9\x08\x14\xf2\x79\x94\x2e\xdf\xb6\xff\xcf\x09\x7a\x0a\xef\xf1\x2a\xfe\x2b\xf4\x97\x8b\xd3\x14\x73\xf9\x79\xa5\x5c\x38\xde\x05\x28\x2a\x56\x1c\x19\x5f\xaa\xec\xe5\xb5\x71\xc6\xb5\x7f\xf5\x34\x21\xe1\x48\xdf\xf1\x01\x3e\xad\xeb\x39\x32\x6f\x8a\xa6\x21\x75\x8e\xbf\xcb\xa4\x38\x3e\x57\x7c\x57\xd7\x53\x6a\x7c\xae\x28\x50\xf4\xaf\x84\xd6\x56\x0c\xd4\xba\xcd\x3d\xcf\x28\x57\x18\x01\xd8\x95\x24\x64\x3e\x81\x72\xa8\x34\x8c\xb0\xac\x8b\x39\x0c\xa4\x8a\xba\x86\xf7\xc1\xba\x55\xa9\xe1\x48\x09\x71\x2a\xb6\x3e\x6f\xef\x17\xa9\x12\x34\xc5\x9a\x9e\x90\xf5\xf6\x24\xe7\xb7\x4e\x25\xa4\x85\xe9\xdb\x06\x1c\x7f\xaa\x64\x96\xe5\x1e\x29\x09\x5c\x82\xa9\xbb\x29\x29\x24\xce\x54\x94\xe0\x98\xba\x4e\x4a\xca\x44\xbb\xd5\x74\x2f\xde\xa6\x6f\x44\x81\xa1\x2e\xba\x58\xe6\x27\x08\x47\x0e\xa1\xd2\x81\xe8\x78\x78\xa1\xf3\x7b\x95\x56\x80\x8d\xda\x9e\xb9\x72\xad\x6b\x2c\x9e\x14\xed\x0f\x38\x34\xdb\x17\xce\x99\x82\xc0\x32\x83\xfe\xf3\x04\x35\x5e\x74\x34\xd3\x80\x4a\xec\xb7\xef\x00\x74\x9e\x8f\xf1\x7f\x03\x88\xe8\x20\x00\x3c\x5f\x8b\xf3\x68\xaa\xe8\x80\x73\xd9\xf5\xdc\x63\x52\xd2\x7f\x16\x4d\x02\x23\xb9\x4f\x28\xbf\xd8\x1d\x7a\xf8\x16\x34\xe1\x31\x76\x11\x42\xdd\xfc\x2c\xf3\xb7\x5d\x79\x75\xaa\xe6\x99\x17\xda\xb1\x12\xc9\x51\x7f\x64\x15\xdc\x96\xcb\xa9\xfe\xfb\xf8\x65\x68\x62\x94\x31\x1d\x32\xfe\x01\x3e\xae\x5a\xcf\xc4\xbf\x67\x1d\x06\x44\xf4\x6c\xd8\x0f\xa5\x46\xd2\xdd\x0b\xc1\x7b\x37\x3a\x8a\xa1\xab\xb3\x96\x87\x63\x03\xfb\x2e\xb5\xa4\x23\x41\xb1\x50\x7d\x3c\xe5\x39\x76\xe8\xb6\x17\xea\x90\xae\xa6\x01\x14\x14\x75\x83\x63\xce\x30\xe8\x5e\x2d\x36\x77\x7f\x5e\xad\x37\xd7\x16\xbb\xb0\xbf\x7f\xbe\xdb\xad\x9f\xee\xd6\xab\x4d\x37\x32\x05\xbf\x00\xbb\xbb\x42\xc4\xf5\xe4\xd6\x62\x11\x20\x9c\xee\x15\xaa\x72\x8a\x84\xd4\x31\x80\xe7\x34\xc1\xc0\x73\xf5\xd9\xbd\x80\x84\x18\xcc\x3b\xdd\x66\xa6\x99\x41\xef\xea\x24\x0a\x50\xb7\xcb\x8a\x8f\x1f\x5c\xb6\xd9\x1f\xa4\x96\xcf\xb5\xf1\xb9\xe5\x5d\x36\x38\x08\x06\x73\x66\xcb\xc5\xce\x29\x7e\x7c\x0f\x25\xd6\x89\xd1\xd8\x45\x81\xfa\xe5\xfe\x2a\x3c\x96\x6c\x48\x3f\xdc\xce\x56\xcb\x6a\x31\x3f\x3d\x79\x6c\x54\xe4\x59\xe8\x7b\x41\x1c\xae\x39\x27\x98\x3e\x01\x9b\x11\x73\x27\x8f\xcf\x85\x20\x49\xbc\xaf\xe1\x22\x55\x5b\x9e\x9d\x00\x21\x75\x9a\xc4\xa9\xcb\xab\xff\xc8\x5e\x5e\xa1\xb6\xd9\x49\x7c\xb9\x8b\x89\x2f\xa0\xd3\xc4\x20\x50\x1e\x21\x5b\xb3\x1d\xa9\x3a\x4d\x03\x0c\xbe\x50\x2e\x6c\x0b\x79\xde\x06\x36\x56\xf1\xd0\xdf\x7f\x2a\x78\x2a\x9c\xbe\x41\x26\xf2\xf5\xf2\xb1\x6f\x3b\xd0\x29\x70\x11\x39\x68\xfc\x0d\xc0\xda\x4c\x5b\x34\xb4\xa0\x1c\x97\xed\xde\x40\xa3\x5e\x2d\x96\x51\xdb\x8a\xde\x4d\x59\x3d\x5d\x36\x9f\x6a\x21\x19\xb7\x14\xde\x4f\x8b\x2d\x6a\xf8\x8e\x02\x51\x2d\x09\x8f\x3a\x19\x2a\x9b\xcd\x5d\x14\xfa\xd6\xf7\xeb\xf9\x51\x61\xdc\xe9\xb2\x96\x87\xe3\x40\xf4\xcd\x0d\x50\x3c\x44\xef\xf5\x54\xb4\xb6\x75\xd4\x4c\xaa\x75\xc0\x1c\x99\x6b\x23\xf2\xab\x01\x6a\x47\x6b\x30\x62\x18\xd4\x3d\x08\xf5\x00\x8d\xd9\x4c\x8c\xaf\x36\x11\x20\x40\x06\x75\xd9\xbf\xf2\xcb\x47\x9f\xc2\x30\xdb\x43\x69\x89\x60\xae\xb3\x0a\x2e\x5b\xd1\xfc\x50\x6e\x79\xa8\x90\xf5\x49\xfa\x5b\x33\x69\x8a\x29\x04\x44\xa8\x6e\xdf\xb2\x3c\xaf\xb7\x5f\xf3\xb3\x8d\x2f\x09\x41\xa8\x30\x1b\x6f\xa7\xef\x52\x4c\x04\xab\x38\x04\xb1\xc1\x6c\xa1\xd3\xc2\xf5\xd5\xc0\x01\x37\x06\x90\x34\x40\x4f\x75\x03\xef\xe5\x1b\xcc\x55\xd3\x81\xc8\x04\xeb\xa8\x8b\xf5\xf2\x2b\x8a\x1b\x0e\x51\xc4\x10\xcf\x06\xfa\xb4\xf4\x0a\x6f\x5f\x84\x14\x10\x09\x8a\xc1\xd8\x18\x7b\x56\xf7\x53\x14\x62\x2e\xd0\xd0\x3c\x89\x13\xde\x79\x67\xb8\xd7\x87\x63\xfe\x5c\x1c\xad\x64\xcb\x57\x7b\xd0\xf8\xf6\xe3\x94\x4a\xdb\x8d\x74\x51\xcc\x82\xd8\x55\xd2\x8e\xd8\x94\xd8\xad\x1f\x48\x92\x08\x23\x7d\x0d\xaa\x3a\x1f\x1b\x37\x97\xff\x0a\xe9\xbf\x5c\x4e\xaf\x4b\x31\x43\xc2\x62\xc7\x2b\xd8\x3c\xbe\xcc\x18\x45\x48\x20\xc4\x44\xcf\xbf\x4b\x39\x88\xbd\xfb\x7b\x48\x20\x16\x03\xe2\x52\xdb\x80\xf3\xad\xf1\x03\x0a\x0c\x73\x80\xe8\x43\x14\x67\x34\xf1\x17\x00\x6c\xa0\x00\x58\xd1\x7e\x99\x12\x8f\xfa\xe3\x26\xd5\xee\xce\xf7\x47\xe7\xd8\x77\x18\xbf\xc9\xf7\x9b\xaf\x09\x8f\xbe\x2a\x0b\x34\x86\x70\xa7\x02\x1d\x1f\xd7\x71\x57\x0f\x19\x7a\xdc\x48\x4e\x6c\x9d\xf4\x16\x0a\xb8\xda\x79\x10\x0c\x70\x43\x99\xf5\xa0\x3f\xaf\x7b\xa3\x00\x29\x89\x52\x0f\x9b\x5b\x3e\xa2\xbd\x10\xcd\x75\x99\xe7\x13\xed\x33\x0e\xa9\x0c\x51\xfd\xfc\xdd\x56\x43\xb7\x90\x83\x42\x2a\x97\xd9\x84\x0b\x08\x9e\x24\x7d\xbd\x75\x84\xc6\x02\x01\x46\x5b\x58\x5b\x23\xf2\x01\x45\x5e\xf7\x72\x55\x6a\x30\xff\xd6\xcd\x4c\x5c\x55\x13\xd2\xf8\xff\x0d\x59\x02\x4a\x31\xab\x8b\x2f\x85\xf2\x37\xa0\x89\x04\xe4\x93\x69\x6a\xff\x4d\x7c\x87\x1a\x00\x04\x91\xc5\x99\x2b\xab\x1e\x3c\xfa\x0e\x26\x96\x88\xf5\x7e\x5a\x6d\xee\xd7\xdb\xed\xfa\xf1\xe1\x7e\xf1\xb0\xb8\x5d\x6d\xf6\xff\x58\x79\xf4\x37\x18\x6a\x29\xd6\x5a\x7b\xbc\xab\x4e\xf5\xa0\xb9\xc5\x04\x61\x82\x3b\xdb\xf5\x1f\x37\xfb\x91\xc7\x6c\x82\x88\x62\x7d\x15\xdd\x5e\x5b\x95\x6f\xb7\xdf\xa7\x2e\xbd\x60\x02\xca\x11\x00\xb7\x5c\xed\x7e\x99\x5a\x30\xad\xc1\x56\xb6\x48\x91\x1d\x4e\x87\xbd\xb5\xa2\x83\x88\xdd\x04\x3a\x12\x2e\xb9\x8c\x1c\x45\xbe\x55\x6f\xf4\x21\x4d\x00\x16\xdc\x59\x43\x6e\x09\xcf\x5c\x4b\x4d\xf7\x86\x4d\x00\x12\x5b\x95\xda\xf5\xdc\xc6\x25\xcb\x76\x77\xad\x27\x08\x9e\xbf\x4d\xce\x31\x12\xbd\x6a\x54\x9e\x1d\x7a\xc5\x86\xb8\xea\x80\x18\x02\x77\xfd\x7c\x35\xa1\x14\xb8\x47\x49\x68\xf6\x1f\x5d\x24\x62\x42\x6d\x5b\x18\xb2\xda\x36\x9a\x76\xa0\x86\xcd\x09\x53\x45\x7e\x5c\x1c\x51\xdd\xa9\x61\xba\x5e\x85\xc1\xe1\x84\x52\x24\x20\x3c\x94\x1a\xf2\xbd\x50\xea\x54\x09\x75\xde\xab\x2a\x6b\xa0\xca\x44\x37\x4c\x4a\xcc\x81\x5a\x07\xa0\x81\x01\xf2\xdc\x24\x8a\xe2\xee\x5e\x8b\x77\x78\x82\xe3\x64\x17\x34\x34\x89\xb0\x7a\xeb\xab\x93\xc3\xed\xc2\x50\x95\x62\x47\x05\x54\xaa\x57\x29\xed\x0e\x3a\xed\x19\xf7\x3d\x9d\x00\xd5\xf3\xf6\xba\x1f\xc0\x63\xdd\x03\x24\xa6\x44\x4d\x86\x1a\x82\xe0\x4c\x9b\xbb\xbf\x75\xbc\xbd\xf7\xd0\xbc\x76\x7d\x8b\x86\x41\x18\x71\xcf\x4d\xde\xda\xbd\x9b\xb2\xba\x15\xd3\x96\x1b\xc3\x0c\xc7\x92\xdb\x7a\xf9\xb8\xc7\x57\xb9\x37\x27\x94\xfc\x18\x0f\xe3\xdc\xde\x91\x2c\x9b\x6f\x13\x2f\x86\xbb\xe8\xf9\xae\x7c\xb9\x3a\x9d\x6f\xca\xca\x13\x45\x7d\x51\x20\xf4\xa7\x29\xaa\x3d\xd5\x5a\x6b\xb2\x64\x59\x89\xa9\xaa\x04\x37\x1c\x42\xe1\x59\x91\x6f\x44\x96\xaf\xcd\x06\xde\xa1\xea\x5a\xed\x4c\x1a\x32\x9f\xf6\xb9\x13\xc5\xcb\x69\xf0\xce\xd2\x50\xa2\x95\xbf\xcf\x0a\xfd\xab\x36\x4c\x93\x72\xca\xc1\x43\x3c\x5a\x37\xc9\xae\x80\x01\x95\xa9\x1b\x28\x48\x2c\x83\xde\x73\xf0\x5f\xfa\xd9\xb5\xe5\x65\x68\x76\xfc\xd8\xd0\x28\x3a\x02\x3c\x5e\xc3\xbb\xd3\x92\xf2\x43\x12\x8a\xdd\x0c\xba\xa8\x6d\x12\xf1\xa2\x81\xf8\x34\x08\xfa\x8d\xa0\x40\x5c\x1c\x73\x27\x6a\x27\x23\x3f\xec\xab\x9a\x2c\xd5\x76\x17\x75\xc2\x79\x27\x98\x14\xc1\x8d\x50\x01\xef\x3c\x6a\x47\xec\x7d\x0d\xff\x0f\x69\x6f\xd2\xdd\x38\x8e\xe5\x8b\x7f\x97\xb7\xca\x45\x2d\x38\x81\x04\xfe\x3b\x59\x96\x23\xf4\xd2\x53\x59\x8a\x8c\xcc\xee\xd3\x47\xe7\x02\xb8\xb0\x59\xa6\x48\x15\x49\x39\xec\xfa\xf4\xff\xc3\x0b\x80\x93\xe8\x88\xec\xf3\x7a\xd1\x19\x65\x42\x14\x45\x82\xc0\x1d\x7e\xc3\xf1\x5c\x13\xe5\x65\x76\x22\x93\xd2\x04\x24\x23\xf5\x95\x35\x6d\xf0\xe7\x51\x21\x44\x16\x54\x03\xc5\xc5\x0f\x54\xb1\x55\x6f\xe9\x62\xea\x39\x03\xc4\x28\x08\x8c\x8d\x4c\x9f\x5a\x35\xfb\x46\x1d\x06\x8e\x77\x76\x7c\xc4\x7a\xe4\x84\xc9\x8d\x96\x11\x05\x27\xf4\xc7\x5f\xaf\xa6\xda\x08\x02\x59\x1d\x48\x87\xeb\x2e\x2f\xdb\x7b\x7c\xb7\x69\xda\xbc\x64\x6b\x30\x89\x95\x9b\x07\xb6\x0e\x6a\xa5\xe6\xcf\x97\x40\x1e\x83\x2c\xa1\x44\xeb\xf1\x69\x73\x20\xe0\x7c\xc8\x0e\x96\x0b\x73\xd7\x43\xf2\x0d\x6a\x60\xe1\x60\x3d\x67\xc9\xaf\xfd\xef\x37\x10\xdb\xf2\x22\x1c\xd1\xd9\x78\x34\x55\x71\x9e\x34\x2c\x3e\xa9\xbd\xcd\x1e\xb4\x01\xa1\x9d\xf0\xc3\x1a\x4a\x4d\xa8\xda\xf1\xee\x27\x82\x30\x14\x1e\x1b\xf5\x50\xa2\x2b\x74\x3d\xe1\xf4\xb6\x13\x41\x88\x56\xd9\xd3\x73\xe5\x4d\x45\x9d\x45\xd9\xb8\x79\x21\x82\xee\x35\xb0\xbc\x7e\x6b\x8f\x39\x6e\x3b\x88\x20\x74\xa2\xf2\x35\x9a\x1a\x9b\x97\xc1\x3d\x78\xea\xc2\x2b\x82\x10\x80\x56\x8f\x55\xee\xc4\x77\x8f\xf0\x6e\x4d\xe8\x47\x29\x8c\x08\x42\x85\xc4\x41\x32\x63\xff\x78\x97\xb4\x94\xa4\xd1\x98\xf8\xa1\x71\x60\x3b\x34\x96\x4a\x7b\x93\x37\x2f\x8b\xdb\x58\x37\x30\xf3\xe2\xcf\x94\x71\xee\x11\xa6\xf1\x98\x08\xe2\x54\x26\xb1\x5d\x42\x46\x62\xf1\x3f\x0d\x5a\x44\x10\x67\x89\xd5\x7b\xd8\xac\xee\xec\x84\xf0\x97\x96\x28\x45\xb2\x90\x3e\xdd\xa2\xf9\xeb\xf7\xda\xe9\x49\x12\x64\x44\x89\xdd\x3f\xdd\x85\x94\xb2\x39\xb1\x37\x77\x98\x31\xcb\xbd\x3a\xc2\xeb\x50\x66\xfb\xbd\x54\xbb\x16\x5e\x71\xf6\x23\x98\xb0\xc0\xdb\x0b\x6f\xf3\xe9\x37\x32\x93\x50\x41\xe8\xfa\xdb\xc3\xed\xf6\xfe\xcb\xc3\xf2\x2b\x35\xfb\x50\x1a\x26\xa1\x2b\xe5\x74\x31\xc6\xb1\x2a\xf1\x63\xf6\x4b\x52\x63\x13\xdc\x1a\xbd\x4c\xc0\xee\x47\xee\xc1\xda\xff\x98\x5e\x6a\x96\x1a\xef\x25\x7f\x95\x6b\xe2\xc8\xf6\x2d\x2f\x11\x70\x13\x11\x68\xe7\x06\xce\x6a\x59\xb8\x4a\x04\x22\x52\xd4\xae\x2f\xcf\xc7\xf5\x4b\x45\x50\x27\x7f\x44\x5b\xbe\x9c\xad\x51\x59\x33\x88\xa5\x82\xbc\x08\x3c\xdf\xfd\x38\x42\x31\x4c\xbf\x05\x12\x50\x4e\x8c\x66\xd7\xd6\x67\xd5\x86\xd3\x77\x0d\xd2\x24\x72\xc2\x46\x8f\xf0\xa1\xe1\xa3\xc7\xd6\x6e\x07\x52\x0b\xef\x07\x0b\x5a\xa3\xed\xd5\xbc\xe1\x86\x9c\xda\x16\x11\xa7\xe7\x11\x7f\xe7\x1f\xd3\x6f\xe4\x88\xae\x9f\xdd\x7d\xc1\xb6\xfc\xcb\x3b\x20\x87\xfe\x67\x01\x72\x9e\xf9\xe5\xde\xd7\x92\x2e\xba\xdd\x7d\x17\x5f\x04\x92\x61\x1a\x8d\xb0\x23\xcd\x9c\x71\x3e\xbd\x29\x3a\x56\x1a\x7c\x99\x61\xd2\xfc\xb9\xfa\x58\x2c\x2b\x8a\x00\x83\x94\x70\x0d\xb9\xaa\xbc\xc1\x99\x9e\x3d\x0c\x0c\x04\xba\x5b\x3d\x36\x0e\xf0\x47\x53\x06\xee\x05\xad\xea\xc7\x3a\xff\x0f\x3a\x80\xdf\xd2\xab\xea\x6f\x38\xca\x48\x0a\x5f\xe6\xe9\x96\xe3\x7d\xd5\x6d\x08\xeb\x0f\x75\x09\x37\x77\x1f\x31\xdc\x8a\x06\xd6\x68\xe9\xb5\x57\x1f\xb3\x1f\x6f\x94\xb1\x7c\x00\xef\xa9\x40\x64\x9c\xa5\x27\x65\xb4\xc8\x9c\xbe\x68\xf7\xea\x16\xd0\x8c\x1c\xe5\xba\xc3\x26\x0a\x7c\x3d\x48\xce\x90\x15\x22\x0c\xa3\x30\x09\xfa\xd4\xec\xa7\x7c\x32\x11\x46\x81\xc5\x0f\x5a\xe4\x16\x45\xba\x4b\x09\x5f\x37\xd0\xa4\x7a\x80\x79\x1e\xe4\xc7\x61\x52\xa3\x14\x61\xac\x92\xd8\x5c\xba\x70\x1c\xfe\x95\xa3\xce\x61\x56\x19\x11\x61\x8c\x92\x04\xba\x0e\xd4\x8c\x3f\x50\x65\xf3\xb0\x5d\x3f\x44\xfe\x7c\x49\xc4\xe9\xc9\x17\xd5\xf3\x4d\x55\x14\xd5\x0f\x32\x24\xee\xde\xf8\xfd\xfb\x6f\xd3\x8b\x4b\x32\x8c\x22\xcf\xf3\x20\x44\x95\x0d\xbc\x87\x95\x21\x64\x19\x0b\xf9\xa0\x1c\xb3\x6b\x6b\xb4\x74\xa8\xbf\x23\x1f\xe3\xce\x91\x85\x9a\xde\x7a\x5f\x22\x5d\x3b\xab\xc4\x87\x72\x45\x8e\xbd\xab\x2e\x7e\xe9\x53\x9a\xd9\x7c\xbe\x68\x52\x89\x90\x73\x9e\xf1\x1e\x73\x79\xac\x6a\xed\x55\xa7\x97\xe1\x5e\x22\xe4\x2a\x20\x1f\x9a\x86\xb6\xbe\x9b\x33\x4e\x3b\x7d\x22\x84\x30\xf0\x5d\x8e\xf5\xc8\x43\xce\x1f\x8d\x05\x58\xbd\xb7\x37\x27\xdd\x3c\xf4\x7b\x44\x08\x80\x24\x97\x7b\x9f\xbf\xe4\xc5\x52\x38\x7c\x9e\x73\x03\x45\x08\x52\x3b\x93\x4b\x2b\x81\xbe\xf6\xc8\x59\x11\xca\x08\x7d\xf3\xdb\x39\x53\x4e\x2f\x46\xaa\x98\xf8\xd7\x25\xbe\x7b\xd0\x7f\x37\xcb\xab\xd1\x19\x90\x67\x4e\x5a\x96\x5a\xe3\xe3\x46\xc1\x40\x45\x71\x83\x55\x2c\xbc\xbf\xc5\xa6\xc4\xfa\xf9\x83\xd0\x4d\xd3\xaf\x54\x28\xf8\xe0\xa8\x48\x45\xd9\xfe\x7c\xf1\x05\x04\xb2\x1b\xaf\x88\xaf\x91\x97\xf8\xe4\x11\x90\xfe\x90\x41\x6a\x0f\xdf\x54\x55\x23\xc1\xeb\x9a\x8a\x50\xa7\x8a\x42\xbe\x2e\x79\xb4\xaf\xc1\x55\x4f\x7b\x9b\x5e\xb0\x16\x82\xa4\x93\x7f\x0c\xdd\x06\x07\xbc\x5b\x56\x3f\x12\x21\x6a\xae\xfc\xae\xe3\x22\xae\xd9\x39\x11\x03\x5f\x96\xea\xed\xde\xa6\x23\x0c\x63\xc2\x32\xaa\x6f\xcf\x25\x8c\x1f\xbf\x01\x2b\x2d\xf7\x7f\xab\xe6\x65\x9a\x9d\x8a\xd0\x48\xeb\xfd\x7a\x57\x95\xd8\x56\x3b\xf8\x44\xf6\x48\x84\x46\x71\xba\x63\xf3\x6f\x5f\x44\x28\x89\x28\x88\x6d\xaf\xff\x19\xdb\x1b\x7a\xc3\xa7\x0f\x2c\x0a\x83\x40\x59\x09\x15\x9f\x4b\x88\x28\x94\x90\xe9\xbe\x56\x4d\xe8\x24\x59\x41\x2f\x0a\x2e\xa2\x28\xcc\xc8\xb9\xf3\xe0\xc3\x99\x55\xa9\xc7\x05\xde\x9f\x78\xbf\x88\x28\x62\x19\xc5\x73\x07\x52\x24\x6a\x5d\x13\xeb\x33\x7b\xaa\x61\x81\x89\x22\x26\x28\x51\x59\xfd\xb1\xda\xde\xae\xae\x6e\x37\x0e\x72\x69\x85\xc6\xfc\xb5\xc5\x28\xc1\x16\xe1\x65\x5e\x6a\x8a\xee\xf0\x7c\x5c\x14\xab\xf3\xab\x5b\x14\x1b\xe5\xf5\x7c\x89\x14\xb5\xb0\x34\x45\x49\x80\xb1\x5b\x01\xe9\xa4\x84\x4c\xbd\xa9\x6a\x0b\x7f\x9c\xde\xd4\x44\xc7\xde\xa1\xf5\xae\xdb\x22\xea\xfe\xce\x25\xd8\x5b\x1d\x76\x99\xab\xe5\xa5\x8e\xd5\x5b\x44\xc4\x02\xcb\x9b\x3c\x59\xc5\xaf\xc1\x54\x6e\xfa\x60\x59\xc4\x28\xe1\xb3\x56\xe6\x0e\x61\xe5\xa4\xf5\x7e\x92\xf4\x8b\x88\x69\x4b\x5e\xb9\x50\x9d\x9d\x9e\x3f\xe5\xd6\xe8\xc2\x5d\xe9\x54\x61\xc5\x8d\xc9\x4c\x42\x6c\x00\xba\x21\x3f\xbc\xb9\xb3\x88\x78\x96\x7a\xf4\xe0\x9f\xdd\x27\x96\x23\x8f\x48\xc4\x48\xd2\x04\x7d\xff\x76\x87\xd0\x54\xa5\x4d\x54\x46\xf4\x2e\xee\xc7\xb3\xc0\x2b\xcc\xe7\x94\x79\x2c\xaf\xe1\x91\xe0\xd6\x51\x04\x9a\xd7\x9b\xaa\x5e\xdd\x56\x70\xd1\x17\x98\x7d\x02\xc0\x50\x41\xc1\x96\xee\x0f\xa1\xff\x21\x20\x63\x2a\x29\x6e\x7c\x32\x29\x22\x15\x07\xde\x1d\xe2\x2a\x9f\x48\xeb\xf5\x03\x9c\xb6\x53\xb7\x41\x8e\x1b\x5f\x22\x52\x10\xd1\x8b\x85\x9a\x8c\x07\x2f\x08\x78\x22\xd2\x2c\x26\x3c\xbb\x43\xb6\x55\x67\xd2\xcb\x28\xdb\x3d\xbc\xaf\x8e\x63\x07\x49\x11\xe9\x14\xe8\x57\xba\x07\xb4\x3a\xb7\x2f\x58\xb6\xf9\x58\x05\x4c\x44\xa8\xd2\xd4\x12\xae\xa9\x6f\x3b\xa3\x6a\x8b\xc8\x04\x56\xd9\xd7\x22\x1e\x2d\x9f\xfb\xa7\xb0\x1d\xfa\x88\x1c\x13\xb5\x6f\x48\x60\xe8\xa1\xd0\x36\x81\xf3\x2b\xc2\xa8\x60\x2d\x22\xa3\x0c\xed\xaa\x64\xe5\x41\x15\x96\x65\x0d\x39\xb7\x08\x8c\xb2\xd8\x38\x0a\x59\xe6\xd8\x59\x9b\x77\x55\x9c\x47\x4a\xaf\x7e\x44\x12\x52\x5e\x6a\x95\x2f\x1f\xce\xad\x7f\x7c\x71\x84\x3a\xd0\xe3\x0d\xe0\xc9\xda\x5b\x4c\x3f\x9f\x26\x49\xd2\x3d\xd1\xc7\x87\xef\x5f\xe3\xd8\x7f\x36\x55\x51\x60\x53\x95\xdb\x0a\xf4\x9f\x5e\x27\x44\xc4\x99\x8a\x2c\x30\xe3\xdc\xbe\x54\x75\xde\xe0\x48\x95\xdd\x0f\x31\x21\xe1\x34\xf7\xb9\x46\xa7\xe3\x3a\xfb\x4e\x11\x24\x54\xdd\xbf\xc6\x37\x2b\x3b\x49\x89\xf2\xf2\xab\x18\x8b\x38\x61\x9e\x1b\x76\x76\xac\xfd\xf3\x00\xde\xf6\xcb\x58\x2c\x52\x08\x1d\x6c\x81\xa2\xb3\xc1\xae\x59\xc4\x90\x65\x24\x72\x08\xbe\x9b\x7a\x38\xcd\x0a\x9c\x22\x96\x21\xd0\xce\x7a\x70\x11\x76\xbd\x87\xa1\x37\x3d\x2c\xc4\xb1\x64\x31\xcd\x70\xda\x1f\x5c\x1d\x75\x52\x2a\x88\x55\x18\xf1\xee\xbd\xf9\x2b\x5a\xaf\x76\x5f\xfd\x5f\x75\xa6\x08\x1a\xf1\xef\x73\xae\x5e\xd7\x93\xc5\xe7\x13\x5e\x9c\x88\x35\x6a\x42\xc5\x3d\xbe\xe4\x05\x94\xed\x4b\x5d\x9d\x3e\x96\x32\xb2\xbf\xdb\xcf\x10\x31\x06\x31\x5d\x9b\x33\xd9\xa5\xc4\x3e\x99\x4c\xd7\x18\x23\x49\xad\x9a\xbf\xae\xfe\xd9\xff\x29\x09\x92\x64\x44\x06\xb5\xc9\xd8\xd5\xc7\xed\x48\x3c\xbc\x7f\x10\xc8\x33\x2b\x62\xd6\xc5\x88\xa5\xc2\xe2\x13\x05\x34\x11\x1b\xcd\xa8\xb9\x52\xd5\xcf\x50\xe6\xff\xc1\x9a\xb9\x2f\x4c\x02\x96\xd2\x32\xdd\x45\x92\xdb\x2b\xc4\xf2\x1e\xce\xcf\x2f\xed\x2c\xda\x48\x02\x26\xa2\xb8\xd7\x5a\x9c\xd3\x97\xba\xe3\x26\xb1\x36\xa6\xcd\xcb\xbe\xba\xc9\x8b\x71\x52\xe4\xc7\xe8\xc0\x96\xcd\xbb\x65\xfc\x70\x1a\x99\x9c\x8b\x24\x4c\x94\xf2\xe7\xaf\x1a\x5a\xb6\x9a\x95\x17\xad\x5b\xcf\xc0\x82\x22\x09\x25\x52\xb8\xe1\xf9\x34\x23\xbf\xb8\x85\x2d\x3d\x09\x15\xd7\xe9\x14\xc1\x43\xed\x86\x4d\x97\xb8\xf6\x65\x83\x24\x34\x26\xf2\x0c\x78\x38\x9e\x20\x7f\x2e\x37\x65\xb7\xf6\x5a\x50\xf9\x64\x33\x4f\x22\x69\x08\xdb\xac\xaf\xf1\x54\x54\xa4\xd9\x4c\x6d\xdc\x59\xa0\xb1\x58\xe2\x75\xdc\x5f\x91\x44\x1a\xe9\x09\xda\x38\x76\x87\xed\xf9\x92\x0e\x31\x0b\x1e\x93\x38\xb0\x91\xfa\xee\x05\xe4\xd9\x5f\x7a\xcc\x19\xe5\xa4\xba\x2a\x89\xde\x5b\x39\x35\xab\xd9\x7d\x8b\x79\x46\x60\x7a\x22\xbd\x5c\x9d\x3f\x28\x72\x76\xd0\x86\xc9\x0d\xec\xdf\x79\x9b\x2b\xf4\x7e\xa2\x16\x96\x16\xf8\xd3\xa9\xc8\xd3\x5e\x6d\x05\x75\x1a\x18\xb8\x51\x09\x4b\x28\xe6\xfc\xaf\x13\xd6\x77\x90\x97\x93\xa8\xf3\xa7\x2f\x51\x92\x98\x90\x80\x6f\x4e\x05\xf1\x7c\xe9\x7f\x36\x35\x59\xf5\x67\x70\xfc\x8c\xe9\x41\xf7\xc7\xe1\xec\x2c\x0c\x28\x7e\xea\xe9\x59\x12\x74\xbf\x4c\x25\x2c\xd3\xc2\xa2\x5d\xa1\x4b\x46\x6d\x51\xbf\x6f\xcf\x8b\x84\x29\x46\x53\x96\x96\xa7\x6d\xdf\xb5\x6b\x66\xb7\x9c\x19\x41\xc5\xd3\x13\xd4\x6d\x89\x75\x33\x29\xad\x26\x69\x0a\x9c\xf7\xb4\x80\x9d\xaa\xf3\xd3\xc5\x19\x52\x9d\x49\xc7\x37\xbc\x43\x0d\x45\x43\x8d\x3b\x57\x3d\xf1\x25\x9f\x24\x8b\x62\x0f\xb0\xb1\xe4\x73\x57\x9b\x9f\x9e\x8b\xc7\x09\x21\x90\xab\x13\x96\x5f\xe0\x88\x4f\xb4\x3a\x2e\xdf\x7c\xae\x33\xea\x1e\xfd\x17\xb6\x2f\xf5\x15\x94\xaf\x75\xd5\xa7\x47\x89\x48\x2d\xa8\xad\xcd\x8f\x68\x09\xf8\x8e\xf6\xdd\xe5\x33\xfd\xcf\x13\x2a\x8d\x9d\x81\xce\xa2\xb7\xf3\x74\x07\x4a\x84\x89\xc1\x43\x70\x3f\x6e\xa1\xa1\x76\x11\xaa\xf6\x6b\x75\xae\x27\x4b\x5f\x02\x41\x8a\x5e\x08\xde\xd1\xc9\x46\xf1\x46\x02\x32\xb2\xa2\xb6\x55\x8d\x8f\x03\xe0\xe1\x62\xb6\x2d\x15\x3a\x13\x15\x5b\x4d\xb8\xd5\xf9\x3d\x2f\xf2\xf3\xd1\x9f\x54\x25\x29\x91\xe3\xec\xee\xfe\x04\xe5\xb2\xaa\xb0\x48\x54\x66\x53\xc7\x22\x3f\xe6\x2d\xea\xc7\x3a\xff\xc4\x1b\x5b\x24\x98\x21\x81\xb5\xf3\x86\xd4\xd8\x0d\x69\xef\x7e\xf8\xf6\xdb\x82\xbb\x9e\xfb\x9c\x41\xa0\xae\x31\x15\xf8\x5c\x89\xbc\xd4\xd5\x8f\x87\xde\xb7\x5f\xb0\x20\xb2\xcc\x99\x2f\x55\x45\x7d\xa3\x5f\x34\xc6\x04\x0b\x18\xeb\x05\x75\x09\x64\x7e\x45\xe9\xd8\xf6\x7a\xc4\x46\xe8\x46\x21\xd1\x51\x8f\xf0\xbe\x6c\x9a\xd3\xc5\xcf\x92\x7c\x9f\x65\x9a\x58\x0f\xf8\x71\x5d\x8b\x85\x81\xe1\xc2\xbf\x38\x76\x47\x74\x3e\xa9\x7e\x25\x66\xa1\x62\x84\xd9\x39\x74\xe9\xde\x4e\xbd\xa0\x3e\x17\x33\x0b\xd1\x6e\x90\x10\xde\xe9\xb2\x5b\x39\xd7\x4e\xa6\xb2\x3f\x89\x89\xa8\xcf\xa7\xe1\x63\x0c\x1d\xee\x0e\x00\x71\x1c\xac\x9d\xcb\x9f\xcb\x4f\x91\x45\x91\x21\x71\xfb\x6d\xe3\x7b\x59\x0e\x22\xd6\x7f\x41\x14\xa7\xa4\x4a\x72\x8d\xd7\x36\xc5\x5a\xf4\xbf\x15\x2c\x4a\x2c\xa7\xfd\x48\x86\x70\x84\x16\x18\x71\x2e\x04\x8b\xb8\xeb\xf8\x3a\x5e\xc5\x63\xb5\x9a\xe9\xaa\x0e\x15\xa7\xd1\xbf\x16\xdf\x21\x16\x19\x4b\x44\xb8\x5b\xfd\x75\x69\x80\x2c\x58\xcc\x62\xaa\x39\xee\x7f\x54\x7f\xba\x37\xb6\x3f\xc4\x43\xcb\xdf\x74\xd4\x6c\x3b\x0b\xa1\xb8\xfa\xb8\xc5\x67\x50\x9f\x1a\x5b\xf9\x8f\xeb\x80\x6b\x57\xd4\xb8\x22\xec\xe3\xf2\xdc\x65\x49\x16\x53\x05\xd2\x02\x4c\x77\x58\x14\x8f\xd5\xd4\x89\x58\xb0\x44\x18\xee\xb6\xe2\xeb\xd5\xc3\xac\x75\x27\x58\xa2\x22\x42\x83\x3e\x77\xfb\xc2\xec\x18\x0b\x50\x79\x54\x6d\x55\x76\xf7\xf3\x1a\x0d\x96\x0d\xed\x8a\xd7\xe5\x32\x61\x59\x30\x16\x6b\x5a\x32\x88\xeb\xb5\x7f\x59\xf4\x7b\x13\x8c\x09\x4d\x90\x18\x8b\xde\xf3\xfd\x1c\x77\x30\x0d\x84\x02\x97\x77\x8d\x8b\xe2\xbf\xda\xec\x66\x57\x92\x45\xa0\xbc\x91\xe7\xb9\x70\x4e\xbc\xd3\x21\x3c\xb0\xc8\x15\x7d\x59\xa5\xfc\x59\xef\x50\x30\x1e\x59\x2e\xf9\x1b\x6d\xd7\xe3\xd5\x82\xc7\x29\x61\xbc\x3d\xe2\x61\xbb\x7e\x98\x4d\x63\x6e\x0c\x4d\x63\xa7\x5d\x7e\x7d\xb6\xcc\xaf\x6d\xd9\x2d\xcf\xfd\xab\x2b\x62\x29\x78\x9f\x5a\xfe\x51\x7d\x22\xe0\x20\x58\x37\x11\xba\xb7\x70\xf7\xb0\xf6\x9f\x85\xd8\xb6\x2d\xba\x8d\xa6\x3a\xb7\x43\x0f\x79\x7a\x21\x52\x09\x18\xb2\x57\xa7\xdf\xf4\xf7\x22\x0a\x26\x8d\x26\xd8\x10\x59\x8f\xad\xb4\xb6\xe1\xda\xc3\xa9\xef\xc3\xf6\x4c\x08\xf7\x01\x15\xdb\x5d\x90\x50\xa0\xfe\x42\x55\xa2\xd3\x68\x54\x40\x9e\x2c\x2f\x8a\xc5\xb1\xf0\xa0\x58\xda\x64\xf1\x39\xc7\x66\x6e\x41\x2d\x98\x0e\x42\x4f\xea\xf1\x72\xa7\x84\xe1\x77\xd9\xfc\x92\x8a\xa0\x60\x9a\xf1\x60\x6c\x69\xb3\x81\xba\x9c\x58\x58\x8d\x96\x6a\xcd\x99\xe6\x13\x22\xdf\x45\xab\x79\xbc\x30\x6b\xa1\x08\x71\xf0\xad\x54\x45\x05\xaf\xfe\xf7\x18\x93\x69\xab\x24\x79\x8d\xdd\xbb\x70\x35\xa2\x34\xbb\x31\x69\x90\x44\xf4\x9b\x8f\x5e\xd1\x8b\x98\x11\x3b\xec\xdb\x37\xa9\xb7\xf5\xfc\x0a\xa7\xd3\x07\x55\x72\x72\xf5\xb5\x3a\x0e\x67\xe0\x9c\x90\xe2\x6f\xa4\xdd\x39\xbe\xa1\x69\x18\x19\x8b\x75\x3f\xe6\x83\xb4\xf1\x7a\xb1\xaa\x34\xad\xb8\xa5\x21\x33\x24\xc2\x7e\x2a\xc0\xe7\xb4\xfd\x49\x51\x50\x04\x41\xb8\x18\xef\x5b\xe9\x0f\x46\xcc\x80\x5d\x44\xef\xbf\xae\xf6\xfb\xd5\xfd\xe3\xd3\xc3\x9f\x7f\xc5\x4f\xd7\x5e\xca\x42\xa4\x11\x64\xda\x21\xf2\x0e\xf2\x5c\xcf\x55\x85\x44\x1a\xa7\x56\xe1\xc9\xc1\xb5\x48\x17\x66\xaa\x2e\x2a\xd2\x44\x4a\xea\x35\xa9\xaa\x34\xf9\xf3\xb9\x46\x4b\x5f\x9e\xc4\xae\xfd\x50\xa4\x49\x4f\x5d\x11\x0b\x54\x9d\x4e\xa7\x94\x89\x44\xc7\xae\x0e\xef\xf2\xc5\xfd\xfe\xce\x61\x1f\x3c\xec\x5e\xa4\xac\xcb\x74\x9c\x90\x47\x35\x63\xa3\x88\x94\x21\x53\xce\xcc\xcc\xf6\xa2\xe7\x15\xcd\x7e\x76\xa5\x29\x4b\x10\x47\xcd\xe6\x1a\xf5\xa5\xd2\xbe\x48\xb3\x50\xf3\xa1\x7d\xa0\xed\x53\x98\x17\xd1\xbb\x51\x04\x6a\x40\xe2\xb6\x58\x24\xc6\x6c\x84\x89\x31\x73\xb3\xe0\xb1\xae\xfe\x85\xaa\xf5\x99\xcb\x27\x6b\x9f\xfb\x20\x8f\x03\xaa\x94\x9f\x8a\x73\x5b\x51\x51\xcf\xdf\x0a\x2e\x44\x28\xfd\xed\xaf\x8f\xc3\x64\xe5\x42\x07\xbd\xb0\xb6\xe5\x0b\xdf\xe0\x78\x1f\x4d\x39\xe8\x00\x9d\x67\x69\xeb\xd5\x94\x67\xdf\x2b\x05\x01\xf1\x07\x61\x50\x47\xff\x18\xaf\x2f\xa9\x48\x6c\x2f\x40\xbd\xa0\xf9\xa4\xc3\x90\x0a\x96\x59\xc8\x18\x89\x32\xa0\x65\x56\xf9\x2b\x11\xc6\x76\x8a\xfe\xf9\x6d\xfb\xfb\xef\x0f\xc3\x5f\xad\x73\x89\xb2\x11\xf4\x5c\xb7\x5e\xa4\x90\x08\x5a\xa7\xaf\x37\x37\x4f\x0f\xbb\xfd\xe1\x66\xb5\xde\x3f\x3c\xf9\x8f\x03\x03\xcb\x38\xfa\x31\xdc\x2d\x30\x01\x59\xc7\x10\xd0\x73\x5c\x87\x49\x65\xc8\x23\x12\x58\xbf\x7d\xb8\x5a\xdd\x6e\xf6\x5f\x37\xfd\x89\x64\xa4\x55\xdf\xc7\x2a\x8a\x71\xdc\x93\xca\x18\x3c\xc9\xe5\xba\x7d\xd9\xbd\x54\xa7\xd9\xef\x56\x31\x7a\xcd\x19\x1b\x90\x76\xb3\x71\x7a\xfb\x54\x82\xc4\x33\xea\x9d\x71\x3f\x37\x53\xf1\x9f\x48\xa5\x71\xc0\x03\xe7\xce\x33\x16\x03\x1a\xa6\xb7\xc2\x8c\x20\xc9\x16\x66\x3f\xfd\x56\x93\x30\xda\xa2\x37\xfb\xaf\xfb\x39\xd4\x62\xf9\x5b\x0d\xb7\xce\x55\xae\xed\x3a\x09\x77\x53\x23\x05\xed\xca\xad\xa7\x1e\xad\xdc\x91\x2c\x80\x68\x50\xb4\x2e\xa1\xb0\x92\x3f\x4f\xd0\xf7\x8a\x93\x4f\xbd\x36\x45\x16\xa0\x49\x7b\xb2\x89\x8f\x4d\xaf\x49\x31\xc0\xcf\x9e\x2c\xe4\x9a\x85\x23\x72\xbc\xc1\x9a\x18\xe9\xf2\x63\x55\xd7\xb3\x12\x68\x16\xaa\x28\xd6\x23\x6c\x23\x5e\xf8\x4c\x8a\x2c\x62\x40\x3f\x94\xd4\x81\x0f\xbb\xfd\xea\x89\xf5\x87\x52\x45\x0e\x38\x43\xbe\x6d\xc3\x44\x7f\x18\x12\xba\x94\xe6\xdf\x75\x3b\xc9\xf6\xb2\x18\x23\x7a\x93\x08\x1a\x98\xf7\x53\x3f\x4b\x02\x43\x9d\xae\xdd\x0f\x38\xd1\x5a\x30\x0e\xb6\x3e\x8b\x07\xa6\x3f\x29\x89\x55\xca\x87\xf9\xe9\x20\x05\x93\x55\x3a\x4b\x52\xa0\x16\x21\xa9\x4b\x57\xe7\x05\x07\xdf\x9f\x07\x1d\x59\x82\xb6\x4e\xf2\xf5\xf7\xed\xfd\xcf\x32\xb0\x8c\x05\xa1\xc5\x38\x40\xf9\xed\xad\xd9\x77\x8b\x78\xf9\x02\x3e\x03\xcd\x18\xb7\xee\xd7\x7d\x43\xec\xea\x83\x9c\x4f\x26\x86\x39\x9f\xa4\xd8\xd3\x26\xd9\x78\xdf\xcf\x18\xb7\x6a\x56\x6b\x17\xd1\x3d\xe5\xcf\x2f\x6d\x33\x56\x18\x5f\x4c\x35\xb2\x34\x09\xa9\x60\x6c\xab\x33\x5e\xea\x75\xa9\xad\x95\xa5\x99\x05\x33\x0e\x4a\x58\x77\x79\x39\x7d\x0b\xb2\x2c\x49\x84\xa5\x29\x4a\x28\x9f\x5c\x6d\x78\x36\x03\x33\x95\xd1\x14\xb2\xa1\xdf\x3f\xcf\xd5\xbc\x2f\x92\xf1\x48\x50\xc9\xfb\xe5\xdc\xbd\x32\xf3\xa5\x34\x13\x61\x4a\xbb\xb2\xf7\x67\x53\xaf\x23\x00\xe4\xf4\x9a\x45\x08\x56\x7d\xff\x19\x77\xd8\xcd\x3b\xf2\xe9\xf5\x57\x2b\x32\x46\xc5\x42\x59\x86\x11\x3f\xe4\xcd\xa1\x2a\x0f\xea\x5c\xbf\xe1\x58\xdb\x67\x72\x65\x90\xf6\x2e\xb6\x63\x78\xcb\x45\x04\xd3\x2f\x41\x99\xe4\x92\x7a\x2f\xb7\x0f\x5f\x0e\xde\xa4\xd8\xe5\x23\xd3\x1f\xdd\x0d\xa4\x94\xaa\xa8\x1a\x1c\xf3\xf5\x44\xa6\xb8\x4d\xd7\x9f\xf6\x9b\x71\x50\x95\x29\xc9\x5c\xcb\xa6\xef\xa5\x3c\x2f\x30\xce\xfc\x68\x15\x86\xae\x2e\xbd\xcf\x67\x1a\x74\x22\xd3\x09\xb7\xe2\x07\x58\xf6\x66\x9e\x0e\x6d\xf3\x33\xbb\x11\x91\x21\x53\xc2\x32\xa6\x5c\x78\x34\x3d\x6c\x54\xcc\x6d\x07\x60\x37\xa8\xdb\xf9\x63\x98\x11\x7f\x06\xf2\xfa\xba\xae\x4e\x97\x40\xc2\xcc\x18\x6d\xf5\x70\xc0\xe0\xbe\xea\xad\x73\xfa\xcb\xe6\x41\x02\x94\x29\x7e\x45\x28\xda\x97\x8f\x75\x95\x97\x73\x10\xc9\xec\x03\x52\x5a\x1b\xc4\xe6\x3a\x6f\xba\x7b\x7d\xae\x71\x44\xf4\x1a\x06\x86\x89\xa6\xdb\xf5\x70\x6e\xd5\x10\xe3\xf2\x50\x83\xf5\xe4\xc4\xa6\xdd\x96\xed\x23\xd4\x0d\xd6\xf7\xf8\x0c\x23\xbc\x1f\x8f\x02\x24\x6c\xc7\xb4\x90\xfc\xdf\xff\xf3\x8f\xfe\x5f\x7e\x60\x12\x51\xed\x70\xbd\xbf\x5b\xf7\x1f\x66\x96\xfc\x47\x0a\x03\xdf\xca\xa6\xf2\xbe\xfa\x82\xc7\x61\x12\x67\x5e\x91\xc8\xae\x95\x83\x9c\xc5\x70\xe9\x71\x88\xb4\xa6\xda\x6d\x8f\x9e\xe2\xaa\xd4\x8f\xd0\x34\x23\x5c\xae\xe0\x71\xc4\x1c\x7d\x89\xe2\x0b\x9f\xaa\xf5\x87\xd3\x98\xb8\x4b\x57\xab\xf5\xd7\xcd\xed\xc3\xd3\xfa\xeb\xaa\xef\x6d\xf2\xd8\x25\xd1\xf8\xae\x5e\xa6\xe2\x03\x82\xc7\x4a\xc4\x23\x05\xca\xbe\xa2\x32\x59\x91\x79\xac\x13\x8b\x8d\x06\x83\xd0\x34\x58\xb7\xa3\x0a\x15\x8f\xb5\x52\x81\xdf\xe1\x0d\xb9\xcf\xcc\x3e\x8e\x21\x55\x54\x2d\xc4\x7e\x12\x3e\xfa\x78\x9b\x27\x0a\x3d\xee\x8f\xd6\x57\x28\x1c\x9a\x63\xde\x86\xe3\x2c\x40\x42\x2f\x77\x33\x6c\x5f\x7d\xdc\x5d\x02\x23\x39\x4b\x02\x87\xc7\xab\x1a\x5c\xb5\xfd\x27\x53\x4d\x95\x90\xbc\xcc\xdb\x25\x2c\xc6\x62\x67\x9d\x33\x4c\xd5\x44\x00\xd6\xbe\x01\x97\x3d\x2e\x37\x3e\x55\x82\x18\x7d\x4d\x0b\x33\xb7\x3e\x3e\xcc\xaa\xfe\x7f\xf7\x7f\xaf\xaa\x62\xd4\x2e\x5b\x04\x93\xf1\x14\x0d\xf5\x34\x4b\xcf\x85\x5f\x57\x55\x91\x97\xcf\xa3\x5c\x8a\x67\x51\x4c\xef\x78\x0d\x0a\x27\x62\xd4\x0e\x86\x34\x7d\xfe\x19\xd3\x64\xdd\x46\x6d\xed\x64\x64\xae\x28\x78\xa6\x13\xfa\xdd\x87\xe3\x42\x3d\x75\x7a\x8b\x32\x9d\xb2\x64\xd0\x91\xde\xb6\x78\x9c\x3d\x91\xcc\x08\x42\x30\xf6\x61\xc3\x6c\x5b\x9e\x5e\x15\xe7\x21\x2d\xc4\x9e\x9b\xf0\x84\x34\x2b\xef\xab\xd6\xfd\x6b\x20\x8e\x76\x83\x13\x06\xbd\x5b\xb9\xa3\x80\xd9\x9c\x3e\xfa\x6d\x71\x5d\xe1\xda\x90\x38\x90\x7c\x96\x87\x13\xd6\x07\xac\xfa\xc9\xc5\x31\x26\x08\x61\x0b\xef\x8f\x30\x13\x8e\xec\x8e\x02\x85\x87\xf7\x9b\xfd\xd7\xf6\x17\xe0\x78\xc1\x45\x10\x11\x81\xe2\xf6\xdb\xfd\xa5\x27\x93\xe0\x90\x6a\x82\x53\x6c\xd7\x0f\xdf\x31\x7f\x82\xbc\x17\x6f\x13\x1c\xb8\xf5\xa6\x90\xe7\x8f\xf0\x12\xb9\x35\x89\x41\x47\x8b\x34\x07\x1d\x8e\x6c\x52\x48\x83\xb3\x6d\x47\x86\xcf\xb3\x0b\x30\x96\xd5\xd2\xad\x50\xeb\xaf\x07\xd4\x79\x7b\x08\xd3\x49\xe4\xcd\x55\x12\xd3\xfe\x2d\xbd\x02\xc6\xaa\x68\xb1\x56\x55\xfe\x89\xc5\x8b\xe0\x0a\x6c\x95\x05\xdf\xb1\x56\x79\x73\x51\x8e\xfa\xef\x78\x86\x40\xe3\x4a\x5a\x5c\x89\x8f\xb2\x9c\x8e\xec\xec\x6a\x35\x13\xb4\x81\x9e\x72\xf5\x6a\xed\x3a\xc8\x0b\xdf\xb7\x2f\x7f\x0e\x6f\xe0\x98\x60\xe6\x49\x5d\x8a\x84\x17\xc7\xa9\x11\x47\xb4\x42\x1f\x87\x67\xab\x93\xef\x8a\x17\x3b\x54\x55\xcf\x29\x10\xdc\x70\x2b\x3a\x74\xb5\xf9\x73\x75\xd7\xff\x51\x08\xcd\xfb\x7b\xee\x16\x40\xab\x22\x5d\xd5\x57\x1f\xdd\x6e\xaf\x5e\x2e\xf4\x8d\xed\x87\x45\x10\xaa\xd4\x15\x4f\xb7\x4d\xb7\x21\x3e\xe1\xf3\xd8\x4e\x48\x88\x40\x6b\x0a\xfa\xce\x65\xde\x36\x0f\x25\x6e\xda\x97\x35\x94\x57\xe7\x0f\x49\x5d\x20\x77\x15\x22\xe4\xda\xa8\x09\xf1\x3f\x4e\xfb\x63\x10\x25\xda\x2b\x38\x94\x30\x92\x21\x9e\xde\x24\x11\x2a\xe9\x93\xec\x53\x55\xce\x36\x59\x11\x1a\x30\x62\xc4\xe3\xe9\xcb\x85\x93\x2e\xbb\x88\x83\x14\x5d\x0f\xea\xf1\x8f\xc7\x6e\xea\x59\x69\xb6\xc5\xd9\x22\xe2\x2c\x8b\x8c\x17\x31\xdc\x12\x56\x39\x6f\x5e\xfa\x73\x61\xe8\x51\x99\x37\xa8\x5e\x60\x0f\xef\xfe\x50\xc2\x9d\x2c\x00\xb6\xf7\xf2\x63\x61\x67\x15\xa9\x4e\x95\x47\xbc\x9f\xeb\x8b\x42\x89\x48\x75\x46\xda\x00\x36\x14\x22\xe1\xa2\xbf\x67\x83\x2d\xba\x34\xc6\xbf\x39\x57\xc1\xfb\x02\x12\x44\x64\x86\x47\x66\xa6\x47\x68\xb1\xb5\xd3\x8b\xe4\xa1\xc5\x5a\x81\x53\x15\xf7\x3f\x8f\xb3\x28\xed\xb1\xca\x0d\xb6\x77\xf0\xbe\xcb\xff\xd3\x3f\x6e\x2e\xac\x34\x53\x3b\x15\x1e\xf4\x47\x8d\x96\xe8\x45\xa1\xdc\xa6\x75\xfc\xd4\xb7\x5d\x08\xc1\x02\x72\x87\x5b\xc3\xe9\xe4\xf0\xad\xa3\x62\xa3\x80\x98\x11\x8b\x70\xf7\x7d\xf5\xf8\xc9\x19\x20\x36\x04\xab\x79\xbc\x5d\xfd\xb5\x79\x3a\xec\xb7\x77\x9b\x87\x6f\xfb\xe1\x04\x86\x6a\x1f\xfd\xbe\xfb\x8b\x34\x6e\xf9\x1d\x16\xdd\x5e\x2c\x2d\xc9\xf1\xa1\xfc\xed\xb2\x6d\x7e\x11\xef\x0a\x80\x38\x4d\x07\x33\x91\x6b\xa7\xb9\xea\xaf\x4b\x0a\x8c\xdd\x0a\x4c\x99\xf3\xfe\x70\xdd\x6b\x40\x09\x21\x31\xa5\xbb\x62\x27\xa6\x37\xf3\xf4\x07\x4d\x42\x84\xc5\xc7\xaa\xc5\xb2\xcd\xa1\x38\x0c\x71\xca\xf4\x1a\x14\xc6\x54\x4d\xfd\x63\x7b\xbf\x39\xac\x57\x8f\xab\xf5\x76\xff\xd7\xe1\x71\xf3\x74\xb8\x5d\x79\xaf\x87\x6e\x09\xd1\xc9\x50\xc6\xf7\x29\xc2\x68\x9b\x13\x1a\x52\x6a\xd6\x1a\x7a\x43\xae\x71\x26\x56\x24\x84\x56\xd6\xe3\xf2\x25\xef\x3f\x62\x04\xb5\xcc\xab\x12\xd7\x58\xb6\xdb\xf2\x3b\xf6\xc7\x30\x00\x47\x73\x79\xdf\xae\x1f\x6e\xf2\xba\x69\x27\xe1\xbc\xc0\x34\xf1\x96\xa1\xfb\x1c\xeb\xe8\x8e\xba\x69\xb3\x1f\x87\x19\x46\x62\xd4\x4a\x9b\xba\xe1\xb8\x41\x26\xd0\xb4\x87\x1c\xc0\xd7\xff\xff\x06\x2e\x54\x18\x07\x57\xed\x41\x24\x8f\x05\xb4\xa6\xaa\x8f\x9f\xd8\x75\x0b\x61\x14\x03\x1b\xee\x1f\x4f\xeb\x17\xa8\x7b\xba\xa0\x10\xc6\x48\x22\xaf\xb7\xbd\x5b\x91\x55\x8a\x74\x81\x15\x04\x99\x5d\xdb\xf2\x52\xdd\x74\xd9\xf8\xbe\xba\x46\x68\x5f\xbe\xe7\xb3\xef\x80\x80\x27\x5e\x57\xb0\x9b\xc9\x7f\x54\xc5\xb9\x0f\xbd\x20\x90\x89\x60\xbe\xf4\xea\x32\x95\xaf\xd0\xbc\xb8\x15\xfd\x7f\xe1\xf3\x23\x20\xec\xfe\x8f\x34\x72\x40\xd7\xd0\xe6\xca\x69\x87\xf9\xc3\x5c\x0f\x8c\x90\x4d\xfb\xf2\x84\x0a\xf3\xb7\x3e\x80\x80\xd0\x48\xc7\x12\x1b\xd5\xbf\x6e\xaa\x7a\xe6\x1f\x26\x20\x4a\x05\x29\x94\xdb\x89\x77\x75\x96\x9f\xa0\x42\x21\x12\x60\xc0\x77\x4f\xc8\x4a\xf1\xbd\x57\xa2\x12\x10\x27\x31\x49\x8d\x3f\x9e\xff\xf3\x9f\x31\x2e\x6a\xfa\x65\x31\x08\x52\x37\x7e\x7b\x6f\x7b\x29\x21\x01\xb1\x42\x2a\x74\xde\x6e\x77\xbf\xaf\x0b\x68\x9a\x5c\xf5\x87\x34\x24\xfd\x97\x1e\x21\x2f\xbf\xb5\x6a\x80\x5e\x43\x12\x28\xef\xa1\x61\x03\xbe\x07\x33\xf3\xf5\x16\xc0\x42\xdb\xfe\xf6\xd8\xcb\x51\x09\x04\x18\x5a\x00\x84\xdd\xbb\x6d\xaf\x63\x8e\x1e\x87\x34\x64\x28\x2e\xea\x08\x53\x01\xc6\xd9\xc3\x4b\xd1\x16\x18\x87\x7e\xe1\xed\xfa\xfa\xb3\x84\x01\x78\x9a\x89\x11\xf4\xf0\x3f\xe8\x22\x94\xd9\x03\xe0\x46\x91\x70\x55\x17\x5d\x2f\x61\x88\x86\x13\x0a\x6d\x0d\x3a\xac\xd9\xf9\xed\x5c\x26\x48\x80\xc0\xc4\x38\xff\xad\x8f\xa2\x02\x3d\xd6\x5e\x13\x00\x2a\xc6\x64\xf4\x52\x7f\xcf\x4b\x9c\xc2\x49\x16\xa2\x5d\x00\xcd\x48\x87\xe7\x71\xf5\x6d\xb7\xb9\xee\xcf\x85\x41\xe6\x82\xf3\xbb\xbc\xfc\x02\x4d\xb2\x52\x6a\x0e\xb9\x01\x30\x21\x01\x72\xaf\xf2\xa2\x80\x97\xf5\xa8\x67\x00\x52\xc8\x24\x9d\x04\x6e\xdd\xef\xff\xec\xc6\x4b\xcc\xa4\xdb\xf3\xb7\xaa\xb2\xe1\xdb\x77\xc4\xd7\xa7\xb9\x0e\x98\x00\x15\x45\x8c\xae\xd7\x79\x83\xef\xa1\x28\xf2\x85\xe6\xc6\xb0\x24\x81\x4a\x14\x33\xbe\xd3\xe8\x58\xbd\x23\x01\x5c\x01\x4a\x25\x99\x5b\x00\xa8\xb3\x68\xc5\x46\xdd\x41\x0d\xa8\xfc\x82\xb6\x6b\xab\x13\xc5\x2c\xae\xdd\xec\x87\xe8\xcc\xd3\x10\x36\x6f\x55\xf1\x36\x12\xc0\xec\x41\x6c\x80\x3c\x26\x6c\xa0\xdf\xd4\xa0\xc5\x49\xd4\x04\x28\x03\xea\xc2\xd9\x9a\xdb\x1a\xf3\x62\x58\x38\x64\x90\x59\x2e\x7f\x77\x87\xb4\x85\x93\x2c\xa7\x76\xb3\x92\x8c\x7f\x1d\x64\xa0\xac\xa0\xe1\x69\x14\xaf\xf5\xeb\x8e\x0c\x90\x53\xf3\x72\xdd\x28\xdb\xfa\xf9\x49\x82\x24\xc3\xb0\xf7\xbf\xdc\x1e\xe1\x19\x17\x40\xf7\x32\x8c\xac\x76\x24\xe9\x7b\xb4\x43\x9e\x2b\x43\xcd\x82\xcc\xf1\x34\x27\x20\x2f\x19\x1a\xa3\x7b\xc0\xcb\xfa\x05\xff\x7d\xc6\xf1\x83\x90\x91\xb2\x56\x7d\xd6\x3a\xf3\x2f\x84\xbe\xb6\x20\x23\x05\x04\x42\xb3\x8b\xc5\x75\x0d\xcf\x55\xf9\xe5\x52\xaa\x77\xcc\x79\x93\x91\x52\x81\xf7\x99\x83\xf7\x31\x10\x61\x12\x18\xcb\x98\x45\x89\x45\xa3\x53\x11\x74\x41\xf8\xbc\x9b\xea\x01\xf9\x72\x76\x01\x6b\xb7\xf9\x77\xab\xd9\x5c\x9b\x6a\x7a\x7f\x12\x2e\xa9\x4f\xf9\xbd\xaf\xf7\xc8\x44\x66\x3e\x6a\xfe\x8e\xdd\x6e\xe6\x0f\xb0\x24\x92\xba\xf7\x2f\x0c\x67\x77\x9a\xb1\x50\x47\x23\x91\x03\xab\x35\x5b\xd5\xb6\xc0\x32\x59\x40\x24\xeb\x66\x21\x41\x6c\x28\x2a\xba\xa9\xea\x47\x04\x35\x05\xa0\xca\x54\x20\x15\xc7\x34\x21\x36\xa7\xca\xa7\x42\xa6\x4e\xfe\x8f\xbe\xce\x16\x2d\xc7\x9e\x06\x42\x66\x29\x0b\x7a\x6c\x6e\x49\xbd\x1a\x84\xe3\x12\x44\x5a\x66\x2a\x96\xf4\x62\x56\xbe\x00\xea\xc1\xe2\x92\xa7\x91\x88\x7a\xe1\x2a\x52\x0e\xa9\xaa\x62\x38\x2a\x88\x4c\x27\xcf\x1f\x4e\x6f\xf9\xbe\x37\xb2\xec\xcf\xce\x35\x50\xeb\xb9\xc0\x37\x2c\x0e\xb1\x87\x58\xf7\xe7\x30\x19\xb5\xd5\x1e\xeb\xaa\x45\xd5\xee\x5f\x70\x0d\x4d\xdb\x07\x6e\x12\x22\x19\x8c\x8c\x1e\x6e\xf2\xb2\x3f\x24\x83\x98\xde\x25\x8d\xa7\xd6\x27\x5d\xf3\x9a\xd4\xdc\x88\x5d\x48\x19\x5b\xb4\xdd\xb7\xf5\xfa\x61\x7b\x4f\xa1\xe4\xb8\x07\x28\x15\xd3\x72\x40\xb9\x7e\xc5\xe2\x93\x7d\x42\x9a\x50\x51\x60\xb6\xb9\xdf\x1d\x9e\x1e\x1e\x7c\xbc\x2e\x0d\xda\x76\xdb\xc4\x72\xc8\x1e\x53\x01\x8f\xb9\x57\x46\xdd\xda\x9a\x81\x07\xd7\xab\x90\xf7\x32\xe5\xf4\x51\x2b\x2e\x30\x9d\x66\x2a\x34\x11\x61\xa3\x35\x2a\xf8\x18\xb5\x78\x55\x04\x2a\xf6\x14\x8c\x6e\x71\x9a\x6d\x12\x2a\xc2\x38\xf5\x9c\x27\x5a\x35\x3f\x26\xb2\xed\x42\xc5\x91\xa2\xf7\xfa\x1e\x7f\x4c\xa0\x58\xd3\xd3\xc4\x3c\x21\xb5\x98\x2e\xa4\x6c\xda\x8d\xad\x36\x3e\xd9\x67\xe3\x97\x31\x95\x24\x91\xd7\xb0\x1e\xa0\xa6\xae\x7b\xb1\x2d\xbb\x28\xf4\xd2\xae\x5f\xa8\x84\x19\x2a\x70\x5b\x23\x69\xdc\x57\x9e\x40\xf5\x13\x14\x08\x41\x5b\xc8\xc9\x33\x62\xbd\xfe\x9e\x50\x4c\x59\xc5\x70\x78\x83\x8b\x8f\xbb\x21\x29\xa4\xd1\xe0\x53\xe1\x40\x2c\x93\xeb\x49\x55\x46\x65\xdb\x33\x15\xa6\x07\x33\x79\xef\x99\xf3\x05\xc6\xfa\xed\x42\x65\x01\x82\xfb\xd5\x24\x33\x3f\xfd\x75\x59\x8c\xdc\xed\x1c\x7b\x7c\x6f\x97\xfa\x4e\x2a\x4b\x13\x6e\x26\x81\xcf\x24\x39\x9e\x87\x3e\x2a\x4b\xad\xaf\x2f\xbd\x9d\x8e\xed\x38\xfd\x95\x3c\x8b\x69\x4e\xa9\xaa\x26\xa1\x33\xff\x67\x6d\x68\x33\x75\x85\x9a\xcf\x90\x09\x8b\xb1\xb5\x12\x2c\x8e\x6c\xc9\xa6\x84\x23\x8e\xe3\xa3\xe9\xaf\x81\x28\xc8\xa2\x49\xec\x61\xf7\x91\x11\x5e\x64\x2c\x61\x2d\x14\xa4\x01\x41\xfa\x24\x34\x38\x22\x37\x2a\x19\x45\x51\x36\x6e\xac\x53\xf1\xb6\x5b\xce\x5c\x7f\xf3\xe7\xd7\x2b\xb5\x75\xcf\x1b\xb8\x1d\xfb\x8a\xba\x03\x6d\xd5\xa2\x6b\xaa\x77\x13\x74\xb2\x0d\x2a\x15\x64\x14\x7a\x59\xef\x02\x2b\xdf\x78\xbd\xb9\x7f\xb8\xeb\x07\x24\x19\x51\x7b\x0d\xe4\xfd\x95\x2a\x65\x23\xe2\xdc\xb6\x1f\x76\x27\x50\x68\x05\x58\xfa\xf7\x54\x47\x92\x0c\xd1\x1c\x88\xbe\x4b\xe7\x96\x2f\x5b\x0b\x0c\x2c\x64\x47\x9d\xeb\x4b\x15\xcf\xe9\x73\xd6\x26\x25\xfe\x20\x49\x3b\xdc\x6d\xee\xae\x36\x4f\x87\x3f\x56\xb7\xfe\x4b\x4d\x10\xd3\x8f\xd9\x6c\xfe\x52\xd5\x4c\x5b\x52\xe8\x20\x91\x9a\xf7\x14\x99\x57\x42\xc6\xf7\x06\x3c\x54\x1c\x5f\x5c\x00\x75\xc0\x04\xe5\x06\x9b\xfd\xcd\xf7\xdf\xfc\xdf\x32\x16\xf6\x02\xfb\xcd\xbc\x24\x32\xfb\xbc\x0c\xd3\xc4\xeb\xa2\x3f\x98\x4d\xfb\xf2\x50\xf6\xd2\x43\x42\x07\x5a\x2b\x57\x0a\xf3\x25\x58\xab\x0e\xb9\x4c\x46\xd4\x81\xd1\xd4\xb6\x70\x62\x85\x4e\xae\xdb\x7a\x71\x2e\x40\x0e\xc7\x11\xea\xf4\x6e\xea\x28\x12\x84\x1c\x28\xa0\x69\x09\xbe\x3e\xb2\x2c\x12\x3a\x8a\xc1\x2b\xb1\x5c\x9d\x4b\x5d\xe0\xe6\xfd\x94\xd7\xd6\x45\xfc\xc1\x6c\x8e\xdd\x7c\x18\x17\xbf\xfc\xc7\x34\xa7\xfd\xdc\x3a\xe1\x1c\xee\x3e\x85\x59\xeb\x58\x03\xed\x50\xbb\xfc\x78\x2a\x70\x8a\x04\xd3\x49\x20\xa9\x14\x2b\xcf\x1f\x5d\xde\x71\xaa\xc7\x76\x8c\x3f\xe7\xfe\xf8\x33\x44\x09\xba\xea\xf8\xaf\xe0\x07\xfe\x13\x3c\xa0\x36\xd7\x11\xde\x77\x27\x74\x44\x97\xfe\x82\x84\x71\x62\x0c\x50\xab\x97\x6d\xd9\x60\x4d\xdd\xba\x2a\xbf\x54\x71\xf0\x1f\xd1\x29\x05\x2f\xdd\xfd\xa5\x5b\x7b\x30\x3e\xe2\xd0\x0c\x23\xeb\xfa\xb8\x5a\x7f\xee\xf3\x20\x74\x9a\x5a\xb9\x4f\x0b\xcb\x7d\x84\x1f\x97\xba\x34\xc3\x9e\xaf\xd3\x34\x66\xd1\x48\xb6\x4c\x5b\x91\x99\x03\x8c\x43\x4c\x9d\x45\x86\x64\x87\xa0\x68\xb1\xbe\x41\x68\xcf\x35\x3e\xa2\x05\x2c\x5c\x40\x92\x74\x96\x58\x82\x90\xb2\xfc\x86\x7d\xa5\xbd\x33\xb5\xd0\x3c\x32\x21\xf7\xc2\x43\x9b\x3f\x27\xf7\x8b\xb3\x28\x75\x50\x3c\xbb\x1e\x2e\x91\x6e\x86\xaf\x11\x86\xd1\x2a\x4a\xb8\xfc\xa2\x5c\xe2\xbd\x7c\x3a\xab\xc7\x51\x9e\x16\x26\x25\xb2\xd6\x5b\x8e\x3f\x6e\x2b\xf5\xfa\xed\xb4\xe0\x82\x20\x34\x04\x06\x9c\x23\x93\xef\x07\x5f\xac\xd4\x1a\xc2\x84\xcc\x27\xaf\x37\x7f\x7e\xdd\x7e\xf9\xfa\x19\x51\xe2\x17\x13\x11\x64\x98\xda\xce\x6a\x8b\xa5\xee\xae\x69\x19\x45\xaa\x65\x90\xa2\x5b\xc1\x1d\x5e\x73\xdc\xee\xd1\x52\x28\x4c\xa7\x7e\x76\x5f\xa0\x19\xc9\x94\x0a\x2d\xc1\x44\x94\xb4\x58\x4c\xdb\x24\x42\xd5\x12\x33\x6b\x68\x66\x81\x75\x3b\xca\xfb\x3f\x99\x77\x2a\xd4\xd4\xab\xeb\xd6\x95\x73\x01\xf5\xf5\xfe\x0f\x5a\xde\x1c\xcc\xd8\x7f\x9f\x4a\x44\xd8\x83\x65\xc9\xf3\xc7\x67\xa9\x5a\x87\x51\xc4\x96\xdb\xb9\xc3\xd7\xe8\x94\x53\x2d\xcc\x12\x99\x47\x46\x20\xb3\x49\xa8\x21\xd1\xc6\x7b\x52\xd3\x80\x39\x04\x72\xfa\x74\x91\x59\x21\x5a\x47\x90\x56\x63\x2c\x4e\x3f\x84\x87\xb6\x9e\x42\x47\xad\xed\x82\xab\xdf\x52\x39\xce\x8d\x33\x21\x90\xb8\xba\xdf\x99\xa0\xb8\xef\x02\xbb\x65\x57\x6b\x81\x41\x92\x90\x60\xda\x0e\x3d\x1e\x72\x0f\xcf\x93\x8c\x07\xc3\x40\x1a\x2b\x90\xa4\x72\xec\x21\x06\x18\x49\x45\x10\xb8\xaa\xc4\xa7\x81\xd3\x83\x11\x06\x54\xd0\x39\x38\xfb\xa7\xaa\xfa\x6d\x59\x14\xde\x8d\x8f\x03\x43\x35\x3d\x1b\x5b\xff\xfe\xeb\x3e\x05\xc6\xc6\x39\x9c\x52\x17\xa6\xfd\x5a\x39\x19\xe0\xe9\x0d\xc3\x24\x48\x29\x69\x3f\x90\xa0\x46\xf5\x96\x6b\xac\x5d\x31\xf8\xa7\xf3\x1f\x13\xd7\x62\xb1\x30\x39\x2b\xb3\x35\x32\x59\xff\xe4\x77\xb0\x2c\xa4\x1a\x6a\xef\x17\xe1\x6f\x48\x16\x47\x84\x13\x50\xd0\xbc\x8c\x6c\x99\xfd\x51\x11\x5b\x70\x31\x61\xc6\x6e\x2a\x62\x20\x15\x5d\x36\xb5\x7c\x71\x99\x8a\xe8\x9d\x1b\x38\x3b\xf3\x13\x2a\x49\x05\xfe\x3b\xd4\xf9\xa5\x93\xa9\xc0\xcc\x64\x94\x8c\xdf\xd4\xf8\x51\x8f\x14\x1f\x90\x3c\xab\x6c\x95\xa0\xe8\xde\x47\xbc\x41\x9c\xdb\x4b\x08\xe4\x90\xd2\xaf\x39\xd5\x55\x51\x95\xcf\x96\xde\x40\x45\x93\xd9\x75\x70\x13\x19\x97\xaf\x1f\x2c\x63\xf8\xf0\x56\x29\x84\x92\x44\x38\xfd\x12\x3f\xfd\x8c\x88\xad\x2c\xb8\xa5\x5e\x27\xb7\xfc\xe9\x93\x59\x2b\x12\x3b\xc9\x77\xa7\xaa\x6c\xfa\x4a\x13\x8a\xd4\x3a\xf0\x37\x14\x31\xcd\x93\x24\x84\xd0\x8a\x8c\x51\x60\xb3\xf7\x5b\x1b\x42\x02\x94\x20\x6c\xca\xd6\x9b\x18\xf9\x23\xa9\x65\x3e\x4b\x68\x72\xb5\x7f\xa9\xb1\x79\x19\xb0\x30\x08\xc2\x4a\xdc\x8d\x31\xa0\x4d\xef\xf7\x78\x09\xb0\x42\x10\x9a\x96\xe7\xc7\x6f\x4f\xeb\xaf\xab\xdd\x66\x37\x51\xfb\x42\xd0\x22\x74\xc4\xf3\xee\x27\xef\xab\x55\xa3\xf2\xdc\x5a\x16\xcd\x1e\xa2\x44\x49\x8b\x15\x41\x26\x1c\xc8\x6d\xab\x0f\xfe\x4c\x2a\xb3\xd2\x55\x56\x1f\x73\x11\x14\xf2\xbf\xda\x12\x50\x07\x01\x45\x5e\x8d\xed\x87\xf8\xbf\x0a\x25\x3d\xab\xbf\x28\xaa\x1f\xb3\x8b\x44\x40\x44\xdf\x55\x28\xbb\x90\xba\x99\x8f\xd0\x2c\xb6\x9c\x25\x7d\x56\x56\x81\xe5\x9f\xed\x27\x7d\x5c\x13\x04\x11\x61\xe5\x08\x2c\x4d\xb7\xf9\xc1\x2c\x0a\x4b\x99\x20\x4e\xa9\xe0\x08\x4a\x79\xf1\x6b\x7f\x04\x18\x69\xda\xf5\x5a\x20\xe3\x92\x50\xf3\x92\xcf\xb0\xc3\x26\x8c\x34\xd9\x7f\x3e\x41\x91\x9f\xc7\x86\x8a\xc2\x84\x29\xa3\x26\x51\xfb\x92\x37\x7f\x54\x2d\xd6\x8d\xd5\x0f\xf3\xc7\x23\x2d\x09\x29\x65\x21\x50\x53\x39\xe8\xe9\xea\x6f\x98\xc6\x24\x1a\x3b\x77\x92\x40\x9d\x3f\x51\x2a\x90\x94\x61\xa8\x3e\xfb\x54\x5d\x4a\xee\xcf\xee\x53\xaa\x91\xa6\xe5\xd7\xaa\x24\x25\xed\xe1\x92\xb2\x58\x53\x2d\xec\xd0\x6d\x7f\xb6\x93\x34\x59\x65\x47\xa1\x84\xc9\x84\xa1\x46\xd5\xcd\x9f\xfb\xd9\x3d\xc9\x54\x48\x8c\x7a\x1b\xce\x5f\x43\x8b\x0f\xe6\xc2\x83\x67\x7a\x49\x99\xb6\x2a\xf9\xc4\x97\x39\xb4\x1f\xa7\x0b\x74\xba\xc9\x30\xa5\xa4\xc3\x3f\x99\xd9\x0d\x5b\x9e\x12\x99\xc9\x68\x31\xac\x0e\x50\x3c\x57\x75\xde\x1e\x67\xab\x90\xe1\x49\x42\x1c\x0c\x47\x45\x5c\x96\xa9\x9d\x9d\x95\x67\x82\x6a\x17\x6f\x83\x9e\xe3\x4c\x01\xc7\x70\x54\x54\xb5\x59\x15\x50\x1f\xd7\xf4\x80\xf3\x93\x93\x99\x73\x43\x44\x12\x28\xa7\x05\x61\xb7\x83\x85\xdc\xc8\x08\x16\x6a\x57\xfd\xb9\x1f\x6a\x2f\xfe\x19\x08\x9e\x91\x1d\xf2\xb7\x9b\x87\x51\x7f\xc8\x08\x11\x51\x25\xec\x6a\xbf\xe6\x41\x10\x54\x65\x12\x79\x5e\x86\xf1\x9c\x55\x79\xae\xcb\xd5\x59\xe7\xad\xe7\xdf\xf5\x03\x30\x89\xa2\x31\x07\x7f\xfe\xf2\xc8\x30\xa4\x9e\xd7\xa9\x6a\x57\x5a\x9f\x3d\x53\xd9\xc8\x24\x26\xb5\xa4\xbe\x14\x4c\xb9\xaf\x77\xa8\xf3\x61\xed\x0c\x89\x65\x24\x37\x3e\x06\xbc\x41\x6c\xae\x3e\x08\xde\x32\xff\x4a\x95\x52\x45\xa7\xa8\xaa\xd7\xf3\x69\x9f\xab\x57\x6c\xbf\x56\x85\x9e\x97\xcd\x8d\x12\x2c\xb0\x0a\x4c\x1a\xdf\xf7\x2f\xf8\xbd\xaa\x5f\x55\x8d\x5e\xcb\xc5\x28\x93\xa5\xd2\x6b\xe3\x58\x9d\xe3\xdf\x46\x3a\x1d\xa3\x82\xbf\xd1\xa1\xa4\x25\x72\x5f\x83\xc6\x95\x31\xa8\x16\x2a\x2d\x7e\x6c\x6c\xe8\xfd\xec\x57\x0d\xcf\xac\x1d\xa4\x39\x85\xd1\x68\x8d\xdc\xfa\x09\x4c\xd5\x85\x9f\xc6\x0c\x06\x15\xd0\xc3\x20\xcd\xfa\x07\x6f\xda\x38\x17\x0d\x31\x26\x02\x86\x17\xef\x06\xf1\xf3\xbb\x47\x90\x3f\x97\x94\x13\xfd\x6f\xc3\xfd\x69\xc7\x96\xbe\x0b\x82\x10\x94\x9d\x1f\xc7\x49\x1d\x12\x82\x10\xed\x82\x60\x3b\xf5\x4e\xeb\x94\xf6\x97\xc5\x97\x1e\x82\x08\x2c\x67\xfd\x08\xff\xea\x5e\xcd\x8f\x3b\xa8\x9f\xfd\x24\x86\x20\x8e\x42\xea\x80\x28\x28\xd4\x25\x47\x12\x82\x38\x8b\xd0\x15\x97\x08\x78\x37\x8e\xed\x20\x88\xb5\xa1\x2d\xdb\xc6\x98\x9e\xbc\x37\x07\xaf\x4f\xaf\x27\x49\x99\xe4\x23\x4f\xdb\x0b\xdf\xd9\x70\xa9\x13\x02\x41\x22\x52\x11\x0e\xe2\xe6\x0b\x5d\x4c\x08\x12\x64\xa9\x9b\xe6\xdf\x5f\xaa\xc7\x1c\x2e\x2b\xde\x7f\xf7\xbf\xd3\x8b\x66\x91\xd4\xbd\x9b\xe4\xa3\x55\x01\x19\xc9\x48\x43\xc0\x52\x4d\xd2\x4a\xaa\xa8\x4a\x7a\x23\x1f\xab\xd3\xaa\xd4\x57\x55\xdb\x7e\x22\x4e\x08\x01\xe3\x40\xb4\x7b\xeb\x51\xf4\xdb\xec\xa0\xe4\x94\x93\x37\x71\xe2\x5a\x17\xee\x40\xca\x02\x5b\xfe\xe8\xbe\xde\xc9\xef\x8c\x76\x44\x08\xb2\x30\x20\x2c\xdb\x6d\xf5\xec\xee\xd2\x5d\xa5\xc9\x23\xee\x33\x82\xdd\x67\xff\xf5\x27\xcc\x84\x88\x26\xa4\x2f\xc7\x53\x1c\x13\x3b\x20\xe0\xcc\x12\x4a\x6c\xe7\x6b\x7d\x6e\xda\xea\x38\xc3\x74\x40\xc0\x95\xf0\x0b\xd1\xba\x7a\xc3\x9a\x5a\x73\x97\x5a\x55\x10\x70\x6d\xb4\x03\xd8\xdf\x20\x3e\x42\x0d\xc7\x4f\xad\x0e\x17\xdf\x20\x21\x2d\x21\xe9\xdc\xa0\xbe\x00\x94\x43\x20\x8d\x20\x8f\xd6\x1e\x01\xf2\x04\x3f\x1e\xab\xaa\x58\xf0\x33\x83\x40\xe9\x94\xd4\xd6\x0f\x43\xe9\xb9\x1b\x3b\x55\x65\xf8\x64\xea\x28\xa3\xa4\x03\x39\x96\xe7\x63\x33\x3b\xb3\x8e\x03\x43\x7e\x42\x5d\xe8\xd5\x1e\x4c\x6f\xb0\x0e\x81\x16\x86\xb6\x9d\x03\x58\x04\xc1\xd5\xc7\xc4\x5e\xd2\x8d\xc2\x98\x13\x1a\xe0\xae\x92\x79\x91\x97\xaf\xfe\xd3\x26\xd0\x04\x6e\xa0\xb6\xd6\xfc\xf9\x2e\x01\x28\x20\x0c\x94\x15\x6c\xb4\xb2\x49\x13\x4a\xa6\x1f\x81\x5c\x45\x1e\x68\x8b\x2b\x6a\x76\x5d\xee\xa7\x10\x86\x42\xa0\x6b\xcc\xbb\x45\x7a\x80\x74\x43\x18\x85\x92\xfa\xe8\xab\xab\xad\x25\x7e\xea\xc5\xc2\x06\x84\x11\xd3\x24\x36\xd9\xe6\x47\xfc\x0e\x79\xfb\xcd\xb2\xb7\xa6\xd7\x14\x65\x80\xb1\x07\xb3\x89\x03\x85\x67\xd7\xd8\x90\xbc\x6b\x5e\x95\x0f\x6f\x58\x9b\xa2\xfa\x71\xe8\xb2\xbe\x42\xef\x5f\x6a\xaf\x39\x06\x61\xac\x20\x1b\xfb\xc3\x3b\x95\x47\x7f\xd4\xfd\xd8\x1f\x90\xb7\x13\x18\x34\x84\x49\x88\x56\x9f\xff\x04\x75\x0b\x65\xff\x91\x44\xc5\xd4\xd9\x69\x7a\xcf\x38\xa7\xd7\xdc\x0f\x30\x40\x70\xe2\xed\xfa\x41\x0e\x86\x2e\x10\xb2\x34\x4d\x2c\x2d\xb7\xdb\x4b\xe7\x6f\x4d\xc8\xb8\x95\x51\x74\x8e\x1a\xb7\x08\x6f\xbf\xf2\x71\x9e\x3d\xdb\x34\x4c\x68\x06\x63\xfb\xf2\x84\x6d\x3d\x14\x10\x20\xcc\x84\x6d\xac\xd9\x45\xdc\xa1\x5f\xdb\xea\xd8\x1f\xc7\xcc\xb3\xaa\x6c\xa8\xb2\x9d\xce\xe1\x90\xc7\xdc\xc3\x5f\xef\xaa\xf2\x15\xfd\x3b\x16\x72\x2e\x29\x36\xdf\x41\xb7\x12\xbe\x5b\x23\x10\x7f\x4c\x05\x84\x90\xd8\x3f\xad\xee\x77\x37\x9b\xa7\xc5\x98\x1c\x42\x6e\xb2\x14\x06\xab\xd5\x1f\x5e\xc0\x74\x76\x83\x04\x8b\xad\x84\x06\x90\xea\x67\xbf\x5d\x86\x02\x35\x5d\x9b\xa9\x11\xff\xd3\x43\xdf\x9a\x6f\x65\x9b\x17\x4b\x4c\x21\x08\x25\x0b\x03\xcb\x4a\x42\xe8\x9f\x9b\x84\x14\xfa\x56\xd2\xf7\x7e\xfb\x0c\x55\x6c\x39\x5e\x57\xd0\xae\x61\xb8\xa5\x4a\x2b\xe2\x23\x5b\x3c\xda\xf4\x6e\x29\x13\x52\x73\x49\x9f\x8f\xa7\x9b\x1a\x97\x1c\x6a\xba\x41\x11\x69\x5c\x1f\xf2\x66\xab\x2f\x15\x76\xdc\x28\xcd\x03\x92\xe2\xdc\xec\xd6\x57\xd7\xf8\x46\x55\x82\x26\x7f\xf6\x57\xa1\x05\xa7\x76\x4b\x97\x0f\x57\xde\x86\xf1\x12\x06\x01\x21\x26\x19\x15\x9f\xee\x3e\x86\x42\x04\x84\xc8\x13\x6d\xd5\xa4\x3c\xc8\xcc\x1d\x30\x69\x60\x3b\xbb\xfb\xaf\x9b\xa7\xc3\xdd\xf6\xfe\xb0\x7e\xb8\xdf\x3f\x6d\xaf\x0e\x8f\x4f\xdb\x3f\x7a\x90\x23\x44\x41\x34\x50\x64\x1c\x73\xfa\xb6\xdf\xa7\xa2\x00\x43\x1c\x5a\x8c\x77\x44\x26\x9b\x0a\x76\xbb\x81\x61\x6a\xd9\xad\xdb\xfb\xed\x7e\xbb\xba\x3d\xec\x56\x8f\xb7\x5e\xbc\x11\xa2\x28\x8d\xc0\xda\xc7\xe2\xdb\xba\x3a\xd7\x3e\x63\xeb\x8e\x58\xa8\x42\x3b\x0e\x01\xff\x3b\x0c\x07\x80\xbb\xff\x37\xff\xef\x68\xa0\xe4\x4c\xfe\xe9\x4f\xc5\xad\x46\xb2\xcd\x90\xef\xce\xc5\xa1\xff\x12\xc9\x3c\xc8\xfa\x7a\xf5\x70\xa1\x2d\x05\x51\xcc\x12\x12\x06\xdb\x9d\xb0\x54\x13\x25\x7f\x88\xe2\x0c\x23\x47\xd0\x1e\x62\xf7\xfe\xb9\x44\x31\x0f\xc3\x60\xe2\x43\x30\x82\xec\xf4\x83\x94\x9c\x00\xdc\xbb\x78\x94\x9e\xf5\xc2\x7e\x3f\x3b\x3d\xda\x6a\x42\x17\xdb\x69\x2c\xdb\x91\x97\x0e\x44\x89\xb6\xc1\x09\x4d\xaa\xc9\x45\x27\xc8\x29\xe8\x2b\x1d\x28\x8e\x40\xfb\x25\xd1\x9e\xfc\x6b\x17\xb1\x48\x50\x61\xc8\x82\xf9\x2c\x4c\x86\xee\xcd\xf8\x55\x8b\x18\x0f\xd4\x3c\xaa\xa2\xe6\x65\x7f\x1a\x2e\x29\x05\xdc\xe7\x6d\xe1\x3b\x56\x9f\x00\xd3\x20\x62\x2a\xf3\x72\x6b\xd7\x58\x56\xc7\xbc\xa4\x54\x6e\x8c\xba\xe0\x7e\xa8\x61\x19\x7a\x9d\x6f\x92\x72\xda\xec\xbf\xda\xdd\x7c\xb1\x66\x04\x51\x16\x22\x89\xc3\xe7\xcd\xe2\x14\xcd\x22\xed\x91\x9b\xf7\x95\x46\xba\xff\x7e\x26\xf8\x21\x22\x25\x7c\x7f\x5f\x61\xbc\xcb\xcb\x71\x73\x6a\xf6\x7d\x4a\x53\xb1\x57\x63\x81\x2d\x12\xb4\x44\xfb\x98\xf7\x67\x1d\x11\x88\x78\x8c\x59\xda\x83\xe2\xda\x09\x78\xfd\x1f\xd3\x91\x89\xc5\x3f\x3e\xd6\x55\x65\x6c\x0e\x41\x12\x1f\xd3\x9f\xc6\x85\x0c\x59\x7f\x25\x0f\xe7\x76\xd7\xd6\x08\xc7\x59\xe5\x00\x22\x2e\x39\xad\x0a\x27\xe2\xb4\x8f\x83\xe3\x48\x64\x9c\x6e\x37\x6d\x79\x21\xc3\xe1\x01\x43\x10\x10\x69\xca\x6a\x97\x51\xb3\xaa\xf8\x24\xff\x83\x08\x42\xe5\x8d\xd9\xf7\x56\xab\x9c\xe8\x6a\xa8\xc9\x91\xe9\x6c\x55\xc1\x16\xb7\x91\x48\x32\xed\xd5\x39\xec\x6d\xff\x0e\xb5\xf3\xde\xed\xd2\x8f\xd9\x60\xb4\x76\x97\x36\x59\xb6\x5a\x4c\x57\x1f\xfb\x1e\xdd\x3b\xbd\x2a\xcd\x14\x69\xc7\xdd\xe4\x45\x61\xc5\x8b\x7f\x1a\x0f\x46\x1a\x53\x35\xf2\x94\xe9\x4b\x36\xfe\xb0\xe1\x24\x15\x79\x18\x71\x39\xed\xc6\xf7\x8b\xb7\x19\x33\x24\xd5\x38\xd7\x39\xff\x01\x0e\x86\x1c\x05\x3f\xb5\x81\x85\x08\x8d\xa4\x96\x16\xbd\x32\x8d\xc7\xfa\xde\x54\xce\xbb\x63\xfa\x2d\x26\x4b\x48\xa7\xc9\x7e\xcb\x5d\x25\xa9\x10\xb9\xdc\x58\xf5\x1f\xe1\x22\xb2\x22\xe5\xff\x3e\x63\xd3\x3e\xa1\xc6\x19\x83\x0b\x22\xa3\x42\x8a\x7f\xca\xf3\x91\x66\xce\x13\x76\x71\xf9\x7c\x90\xeb\x78\xf7\x86\x08\x3f\x69\x68\x40\x1c\x44\x91\x76\x65\x61\xda\xb5\x7f\x9b\x1d\x4e\x75\x26\x6c\x75\x09\x6f\xaa\xda\x9b\x6f\xe0\x61\x11\x42\x00\x71\x00\xd2\x9a\x99\xfb\xe2\xe0\xd5\xb9\x2e\xa7\xb9\x79\x1c\xc8\x8c\x42\xd1\x17\x68\x36\x65\x75\x7e\x7e\x21\xda\x63\x5f\x18\x70\x18\xb4\x81\x95\x77\xc9\x06\xbd\x24\x61\xb9\x53\x87\x80\xc8\x07\x1d\xf7\x31\xec\xc0\x8f\xc0\x04\x02\xaf\xa0\x55\x98\xaf\x1f\xb2\xce\xb5\x73\xaa\xbd\x64\xb0\x40\x1c\x87\x19\xf1\xd8\x4b\xfc\xf1\x58\x57\xc7\xea\x92\xee\xfd\x37\xb5\x32\xfd\xf9\x22\xdb\x05\xbf\xc7\x1f\x76\x0d\x9f\xaa\x5e\xf9\x51\x20\xbd\xde\x68\xb7\xd6\xe8\xd9\x45\x25\x31\xf3\x6c\x4f\xab\x75\x32\x82\x43\x5d\x5e\x94\x5b\xce\x63\x16\x2a\x63\x6b\x3e\xf9\xf3\x33\xd6\xbb\x97\x73\xab\xab\x1f\xe5\xec\xdc\x2c\x52\x84\x87\xf3\x54\xcb\x07\x63\xfa\xed\x2e\x4e\xe3\x98\xf2\x30\x4f\x21\xb4\x0a\xb5\x9b\xb7\x05\x6c\xe4\x24\x5c\x8c\xd3\xd4\x7a\xda\x98\xaa\x36\x98\x8f\xe5\x76\x21\x4e\x33\x5b\x4c\x75\xdd\xcf\x3b\x78\x27\x3d\x75\xa8\x09\xf9\xd5\xf3\x25\x20\x4e\xb9\xa2\x3d\xdc\xbd\xbb\x24\x66\xfc\xbf\x7a\x06\x3f\xd3\xc9\x9f\x5d\x2f\x00\xf2\xa1\x71\x34\xe3\xe3\x40\x9c\x4a\x6b\x6a\xea\x60\x22\xf7\x88\xfa\x17\xae\xdc\x10\x67\x49\x22\xb5\xeb\x4c\x9e\x72\x2c\xbd\x9a\x2e\xc4\x3c\x08\x3d\x76\x66\x3f\x62\x13\x8d\x37\xc6\x58\x84\x71\x98\xf5\x1e\x5a\x96\xe7\xbc\x03\x83\x77\xa8\x7b\xc1\x3e\x88\x41\x27\x14\x2d\xbe\x75\xaf\xd4\xaf\xda\x80\x10\x03\x1a\x16\x8c\x45\x9d\xa8\x9a\x39\x15\xe3\x71\x45\x48\x88\x65\x97\x04\xd1\xcc\xd0\xed\x4b\x0d\x3e\x3f\x8c\x35\x28\xd2\x05\x6f\x72\x8d\x57\xe8\xe9\xfa\x87\xbb\xd5\x9f\x7e\x04\xca\x2c\xf5\x96\x14\x8f\xf4\x0b\xc7\xee\x80\xcb\x0b\x6e\x8c\x2a\xa0\x64\x42\x79\x81\x60\x88\xd1\x44\xc4\xd0\x39\x55\x0d\xe1\x0f\x3d\x5a\xf5\x1f\x0b\xd0\x31\x88\x0d\xb3\x0c\xe4\xd5\x59\xb5\xd4\xf6\xdb\x59\xfe\xd1\x20\x52\x66\x07\x26\x41\x62\xcd\xeb\x9e\x50\x5f\x15\x67\x9b\x6a\x44\xfe\x60\xa8\x53\xda\xb8\x0e\xd8\xb4\xf9\x11\x5a\x74\x78\xde\x5f\x4d\xb5\xc9\x8d\x4e\xa2\x50\x24\x4e\xb8\xef\x0e\xde\xff\xc0\x3a\x1f\x55\x50\xfc\x6b\x9f\xc4\x41\xef\xe3\x4b\x5b\x37\x75\x56\x66\xb5\x90\x84\xc5\x99\x8c\xc6\x66\x1d\x5d\xb8\x30\x80\x38\x21\x61\x09\x0a\xe5\x49\x77\x1f\xf3\xbd\x29\x61\x32\x0c\xd1\xeb\xec\x5b\xe7\x03\x37\xdf\x28\x7e\x9a\x8d\x4e\x23\x9b\x8a\xff\x78\xb1\xea\x99\xd7\xbd\x78\x2c\x24\x9c\x09\x63\x5d\x10\x7e\x5c\x55\xd5\x6b\x5e\x3e\x1b\xf5\xd9\xb6\xfe\xc9\x7d\xe1\x99\xa1\xb0\xff\xf1\x69\x43\x26\x53\x8f\x9b\xa7\xf5\xe6\x7e\xbf\xfa\xb2\xf1\x52\xe1\x90\x88\x88\x11\x77\xbe\x39\xcb\x46\xd5\xb9\xfc\x54\xf8\xcd\x8f\xcf\x24\x89\x1f\x35\x4e\x44\x71\xa2\x9f\x3f\xc9\xfb\x17\x2f\xce\x2d\x4b\x09\x48\xcc\x4c\xff\xc8\x2e\x50\xac\x90\x80\xe2\x84\x75\xc5\xf7\x53\x55\xb7\x7b\x28\x5f\x49\x08\x74\xa9\xea\x97\xc8\x44\x07\xd2\x97\x5f\xde\x7c\x7a\x9f\xc8\x34\xa2\xf5\x34\x2f\xf3\x76\x1c\x62\xcd\xee\x92\x14\x9c\x92\x6d\x12\xea\x3b\x84\x87\x71\x51\x24\x91\x5a\xc7\xd2\xc1\x84\x28\x16\x59\xc3\x69\x80\x58\x40\xa2\x24\x4b\x06\x6d\xbd\x36\x1f\x12\x55\x1f\x1c\xfb\x81\x2a\x08\x7b\x6a\xc5\xd6\x0c\x71\xe6\x64\x6f\x4a\x94\xe6\x94\x6e\x81\xd6\x77\x48\xd2\x8d\x63\x10\xda\xe4\xba\x15\x46\x44\x5f\x27\xe2\xc0\x75\x65\x61\x5a\x5f\x47\x36\xb1\x6e\x9c\x4e\xa2\xd0\x49\x21\x3f\x58\x90\xec\x8f\x49\xe7\x6b\xfa\x7c\x75\x22\x02\x39\xe2\xc6\x74\x89\x0b\x89\xe1\x93\xda\x21\x9c\x4e\x73\xe6\xd3\x25\x98\x0b\x12\x04\xc8\x5c\x15\x6f\x5f\xb9\xb5\xe1\xc2\xd1\x7b\xf6\xc5\x88\x16\x8c\x40\xde\x74\x79\xf3\x3a\x02\x07\x41\x62\xd2\x20\xf4\xa6\x49\xb6\x84\xba\xfc\x2c\x8d\x0a\x48\x8e\x76\x4f\x4d\x5a\xf7\x69\x16\x06\x8a\xbb\xd6\xda\x6d\x5e\xbe\xee\xab\xc7\xaa\x69\x67\x89\x20\x0b\x63\x4b\xb5\xb2\x7b\xce\xb6\x34\xc5\x99\x92\xe5\x4f\x22\xbc\xe9\xd5\xb3\x30\x13\x56\x40\xba\xb9\xad\x9a\xbc\x7c\xbe\x9a\x49\x25\x03\x8b\x98\x22\xd4\x9c\x2d\xa4\xde\xe5\x05\x36\x6d\xe5\xb0\x1d\xdc\x8f\x81\x88\x14\x8b\x7c\x74\xb9\x2b\xab\x1f\xa6\x80\x57\x2f\x0c\x49\x0b\xfb\xe7\x82\x22\xc0\x22\x23\x49\xfe\xf5\x84\x75\x5e\xe9\xa8\xcf\x41\x3d\x2e\x02\x58\x9c\x84\x69\x38\x80\xf5\x09\xa3\x3b\xe6\x8c\x01\x8b\xb5\xa5\x25\x5c\x8d\xc4\x94\xba\xbf\x66\xda\x65\xb6\x14\xca\xfa\x18\xdd\x6d\x6a\x6e\x54\xe2\x00\xf7\xe7\xd2\xd4\xd5\x7f\xf0\xa0\x26\xcd\x52\x60\x09\x48\xe9\x8a\x0d\xb7\xbb\x4d\xd3\x05\xb2\x3f\x33\x86\xea\x3e\xa0\x63\xe6\x79\xc0\xdd\x34\x22\xc5\x2e\x7f\x10\x83\x91\xa1\xd1\xa1\xbe\x58\x45\x18\xe3\x21\x01\x59\x7e\x60\xee\x22\x9f\x11\x1e\xbc\x3b\x1c\xd3\xe2\xb7\xae\xca\x12\x9d\x42\xbd\x3f\x04\x21\x55\x0f\x9e\xf3\xb7\xee\x3b\x9d\x64\xc7\x72\x2b\xda\x7f\x44\x32\x66\xbc\xf4\x53\xad\xf7\x1f\x27\xbc\xb0\x4a\x00\x96\x2a\x4e\xdd\xac\xbc\xe9\xe3\x9e\x29\xc7\x08\x18\x67\xd6\x4e\xc8\xb7\xa7\x7e\x1e\xfa\x30\xae\x2d\xc2\x6c\xa2\x46\x8e\xe4\xdf\xd9\x5d\x43\xb4\x9c\xca\x32\x11\x58\x3b\x28\x07\xb8\x1b\x4d\x43\x91\x65\xce\xac\xbe\xd4\x14\x8c\x56\xf5\xd5\xc7\x94\x20\x37\x3b\x95\x0c\x08\xa9\xbf\x7e\x7a\xd8\xad\xb6\x4f\x87\xdd\xd7\xed\xe3\x81\x04\xbb\xfc\x4f\x12\x46\x52\xf2\xbb\x7e\xc1\x23\xf9\xbf\xac\x7b\x6e\x3f\x30\x08\x43\x35\xbc\x1a\x7b\x02\xf7\xdd\x55\xda\x2a\x0c\xcc\x26\x04\x44\x01\x3a\x37\x73\x07\xdb\x9e\xca\x0c\x8d\x37\x06\x26\x33\x6d\x38\xf5\x1d\xeb\x57\xec\x9b\x54\x13\xc9\x6c\x60\x52\x30\x6d\xf9\x1a\xd0\xbe\x58\xe2\xc5\xc1\x47\xc5\x4c\x05\x11\x15\x57\x6f\x37\xfb\x3f\xfb\xbf\xc5\x20\x2d\x7d\xf0\x07\xd4\x7a\x42\x1f\x01\xa6\x38\x57\xae\xed\x70\x43\xf5\xde\x71\x2d\xc7\xdf\x60\x9d\x64\xa1\x98\x8a\xa4\x11\x13\xda\x25\xcb\x7e\x54\xaa\x69\x3e\xe9\xba\x3a\x4d\x2f\x59\x2b\xa4\x52\x33\x58\xc6\xc3\xf0\x76\x6b\x1d\xd9\x42\x49\x75\x29\xe2\x32\x7b\x74\x3e\xf2\x64\xda\x58\x97\x34\xf2\x1f\x6e\x56\xf5\x2c\xa4\x61\x18\x31\x22\xd4\xa9\x02\xa1\xf6\x64\x42\x6b\x90\xe5\x47\x48\x9d\x0d\x2c\x53\xf7\x22\x53\x4f\xfa\xe7\x6b\x7e\x1a\x84\x89\x95\x63\xb7\x10\xe1\x02\xf5\xbc\xdd\x93\x06\x21\x64\x6e\xc5\xa0\xad\xcb\x76\x6b\x1c\xc8\xaf\xdf\x71\xd2\x20\x44\x72\x47\xb0\x80\x6c\xda\x8a\x77\xf9\xf3\x94\xe7\x3b\x4f\x68\xd3\x30\xb6\xbd\x01\x18\x3c\x48\x26\x0c\xaf\x6e\x84\xa1\xf2\xf5\xb7\x24\x1a\xd7\x1f\xd3\x30\xd5\xb4\xcf\x74\xfb\xd1\x6b\x5e\xb8\xdb\x31\xdb\x19\x67\x4e\x54\x90\x86\x99\x85\xb8\x12\x23\xec\x5b\x3d\x2b\x07\xa4\xa1\x88\xa8\x16\xb6\x7e\xda\xac\xf6\x9b\xc3\x1f\x9b\xa7\xdd\xf6\xe1\xfe\xf0\xf4\x70\xbb\xe9\xbf\xd7\x28\xe6\xe5\xdd\xad\x91\xea\x05\xf9\x15\xd2\x28\x08\x1d\x23\x4c\xcf\xbc\xd9\x21\x8d\xc2\x0c\x65\xcf\xe5\xeb\x16\xc4\x31\x9f\xef\xb1\x6a\x9a\xbc\xa7\xe4\x43\x1a\x71\x65\x1d\x33\xf2\x23\x8e\xdb\x5e\xb3\xfb\x18\x6b\xb4\x2c\x2f\xaa\xa1\xe7\xe5\x48\x65\x07\xd2\x24\x45\x42\x09\x2e\xab\xec\x9c\x47\xcc\x4f\x48\x93\xcc\x9a\x28\x3f\x63\xfb\x7b\x5e\x3e\x53\xf0\xd3\xf4\x27\x52\x49\x3c\xf6\xa2\xa4\xce\xdf\x4f\x33\xb0\x34\x31\xb1\x4a\x47\x06\x80\xb7\x13\x85\x34\xff\x06\xa4\x2c\xb5\xaa\x37\x76\xeb\xef\xd6\xcd\x89\xe6\xd2\xcf\xa3\xec\x94\x65\x29\xe3\xbe\xd8\xf9\x6c\x15\xef\xbe\xc0\xbc\x86\x99\xb2\x8c\xd3\xab\xd9\xc2\x2b\x56\x94\xf6\x7f\x72\x3a\x48\xbd\xc0\x65\x6f\x55\x3a\xd3\xab\x86\x94\xa9\x90\x2a\x41\xce\x77\xc2\xc1\xc0\xaf\x51\x15\x50\xbb\x54\xd9\xdf\xd3\x34\x13\xa4\x0c\xf0\xb4\xd9\x6d\x9e\xfe\xd8\x4c\x6c\xa7\x20\xcd\xb2\x98\x8d\xa9\xd0\x9f\xbc\xa8\x99\x54\x14\x13\x60\x0d\x0b\x0c\x42\x48\x33\x25\x68\x41\x73\xa8\xfd\xb9\xf5\x31\xa4\x3c\xb2\x5e\xc5\x54\x66\xbf\x3a\x7f\x8c\x3a\x99\x29\xe7\x82\x0a\xd7\xb4\x00\xf5\x7a\x1e\x4b\xe0\x8a\x54\x44\x21\x05\x48\x46\x2e\x78\x96\x43\x0a\x0a\xfc\xa3\xb8\xc6\x02\x9f\x41\x57\xd7\xb8\x69\xd4\x19\x0b\x20\xa3\xfe\x8f\xc5\xc2\xf5\x18\xee\x06\xa9\x64\x56\xcd\x61\x53\x7c\x4c\x8d\x34\x47\xcb\x8d\x4c\xe3\xd0\xb5\x04\x77\xd8\x92\x6e\xc1\x64\xdd\x90\x18\x07\xb6\xa5\x2e\x2f\x14\x33\x20\x95\x26\xb5\xea\x5d\x7e\xc3\xa6\x2c\x73\xb9\x01\x9d\x2a\xb0\x6e\x87\x7e\x3e\xf4\xef\x83\xee\xb6\x81\xee\xc5\xea\x75\xbb\x8a\x62\x04\x43\x82\x54\x67\x9a\xca\x15\xa3\x7c\x25\xc5\x84\xd3\x1d\xfa\xa3\x6a\x71\xa5\xdf\xb0\x6e\xf3\x06\x27\x6e\x9e\xd3\x4b\xc5\x94\x39\xed\xe9\xd7\x6f\x0d\xd6\xd7\xd8\x42\x5e\x2c\x83\x17\x21\x45\xe7\xf9\xe7\xbb\x32\xd7\xab\xd3\xe9\xbe\xd2\x5e\x15\xb1\xbf\x30\xc3\xa4\x4c\x47\xca\x71\x78\x9d\x3f\xe7\x2d\x14\xab\xba\xd7\x95\xed\xd7\x84\x2c\xca\x90\xf8\xf1\x77\xab\x3f\x0f\x8f\xdf\xae\x6e\xb7\xeb\xc3\xcd\xb7\xfb\xeb\xed\xfd\x97\xe9\x54\xce\x22\x13\x51\x0d\xc7\x8a\x80\xde\xbd\x4e\xd8\x62\xdd\xe1\xcc\xf2\x0b\xf2\xa6\x25\xe4\xd9\x75\xa5\xce\xd6\x60\x63\x2e\xd6\x31\x3c\xe8\x2c\x66\x9a\xa8\xb1\xff\x75\xb5\xda\xb5\x50\xea\x2e\xae\xfb\x5b\x1a\x3a\x90\xc5\xa9\x61\xe3\x52\x31\x99\xfe\xcd\xde\x8b\x2c\x89\x15\x41\xe9\x9a\xfc\xfd\x0e\x5a\xf5\x62\xf5\x42\xb7\xe5\x14\x02\x95\x25\xca\x7a\xc8\xf5\x78\xe0\x6f\x4f\xdb\xf9\x99\x0c\x50\x99\x4b\x9e\x3f\xee\xf1\xc7\xb6\x34\xf5\x54\xc9\x12\x32\x16\x66\x18\x0e\x55\xff\xab\xaa\xef\x81\x64\x69\x68\x59\xed\x73\xa9\xfe\x5e\xe5\xe3\x33\x9c\xe4\x34\xb9\x1f\x67\xbc\x59\x1a\x45\x54\x2a\xef\x2d\xef\x49\xac\x60\xdc\x94\xc9\xd2\x48\x10\xc8\xdb\xcf\xe0\xeb\xa7\xc7\xdd\xec\xa2\x53\x21\x48\xdb\xa9\x3c\x1f\x1f\xba\xe9\xfa\x52\x57\x3f\xfc\x44\xca\xb2\xc8\x3a\xa7\x7a\xfb\x9d\x71\xa9\xf4\x32\xe2\xf1\x1f\x62\x11\x99\x6b\x6a\x74\xe1\x13\xce\xb0\xa0\x7e\x9c\x89\x52\x2b\xb7\xdc\x6d\x1a\x3f\xd1\x17\x82\x8c\x03\x27\xb6\xf8\xd5\xf5\xa3\xbf\x34\x11\x67\xa4\x95\xeb\x98\x6e\xd4\xe7\x69\xd6\x55\xf5\x9a\xcf\xbf\x47\x08\x43\xc0\xcf\xff\xc2\xba\x7a\xbf\xce\x4b\xa8\xfb\x73\x48\x15\x38\x52\xd7\xbe\xae\x4e\x2f\x43\x75\x28\x83\xcc\x36\x1a\xf3\xe6\xc9\xad\xdc\xa8\x1f\x21\xff\x64\xfd\xce\x40\x2a\xae\x9d\x60\xc6\xf7\xaa\xd4\x9f\xed\x3e\x99\x4c\x15\xb3\x65\xc8\xba\xb5\xb0\xb8\xc9\x9c\x96\x2a\x54\x43\x83\xc7\x16\x1b\x9d\x4c\x6b\x7f\x69\x12\xad\x9a\xfe\x8f\x6e\x3e\xff\x91\x6b\xac\x56\xb3\x5f\xac\x20\x49\xad\x7a\x88\x7e\xc2\x37\xfc\x84\x90\x02\x99\x56\x9a\x7b\x19\x63\xcb\xc0\x58\x59\x05\x91\xf6\xc3\x3e\x6a\x37\x0e\xa5\x21\x6a\xa5\xe5\xaf\x87\x53\xfe\x3a\x64\x26\xb5\xba\x41\x0b\x11\xd3\x85\xf7\x2a\x8d\xa6\x04\xb9\xc4\x1f\x8b\x50\x66\x3e\xfa\xff\x7e\xe3\xe1\x41\x02\xd4\xe6\xff\x97\xae\xce\xf2\x73\xfd\x27\x3f\x1a\x51\x79\xf5\x3f\x2b\xbf\x5e\xbd\x4e\xb2\x6d\x1e\x86\x29\xc1\x93\xcc\xb9\xd4\xd6\xf0\x45\xe5\x27\x8f\xdc\x05\x1e\x1a\x4e\x84\xbe\xf2\x7c\x74\xe0\x9e\xc6\xbd\xa6\x93\xfd\x90\xc7\x31\xd0\x9a\xb7\x7f\x71\x7e\x22\xfe\x04\x09\x77\xe0\x21\xca\x30\xdf\xa0\xc5\xcb\x38\x92\x27\x3a\xa1\x64\xbd\xb7\xa1\x7b\x30\xa6\x3f\x01\x6a\x42\xb6\xdd\xfd\x75\x7d\x3b\x8e\x8c\x39\x0b\x12\x82\xc9\xdb\xee\x68\xaf\x0c\x36\xc6\xbd\x71\x26\x52\x0f\xcd\xfa\xd2\xad\xd1\xf5\xc7\x4d\x3e\x96\x02\x19\xee\x54\x1a\x67\xcc\x59\xd3\xb7\xd5\x1e\xd5\x8b\xd5\x9d\xfb\x1b\xb2\xcc\xfe\x04\x09\x26\x4e\x30\x10\xa8\xe9\xda\x45\x8d\xd6\x9d\xc1\x4f\x58\x9e\x66\x36\x01\x6c\xf2\xf2\xb9\xc0\xed\xf5\x9f\x77\xff\x1c\x9e\x44\x6a\x24\xe5\xa6\x5f\x37\xfb\xf5\xfa\x7f\xb9\x05\xf0\x2c\x8c\xb5\x7d\xed\xbc\x4e\x8b\x3f\x6d\x96\x25\x24\x4b\x99\x37\xdb\xb2\x39\xd7\x97\xcb\x0f\xcf\x44\x48\x21\x15\xd1\x29\x1c\x82\x0d\x17\x62\x11\x9e\x81\x09\x2d\x46\x3d\xaf\x27\x22\x5e\xc0\xb9\x94\xcc\x16\xf3\x88\xe0\x76\x9d\x37\x27\x6f\xed\x31\xaa\xeb\x4f\x66\xb7\xfb\x64\xb7\x7c\x11\x11\xe6\x1d\xba\x84\x2a\x9a\x2c\x03\x1c\x82\x80\x16\x26\xb2\xfd\x1a\x57\x54\xb8\x8c\xac\xd7\x65\x97\xa0\xbc\x41\xdb\xaf\x65\x5c\x66\xf6\x99\xd7\x48\x74\xa5\x5e\xdf\x75\xfa\xb8\xa4\x10\x44\x4b\x70\x35\x89\xe9\x41\x15\x85\x44\xcf\x1d\x53\x42\x81\x2b\x16\x47\xc9\xd0\x4c\x1a\x4a\xf5\x5c\x87\x21\xb5\x42\xf7\x2f\x79\xad\x1f\xa1\x6e\x3f\x88\x9c\xd1\x1f\xce\x42\x46\x62\xa9\x2d\x1e\x17\x77\x00\xae\x35\xa3\x2c\xef\xcb\xd3\x4d\x55\x7f\x81\x7e\xc2\x68\x8d\x14\x44\x3d\x75\xef\xde\x2f\xb0\x10\x5c\x23\x50\xf1\xd1\xe4\xa7\x66\xa5\xf5\xbe\xba\xed\xb2\xdc\xfa\xa2\x31\x3e\xda\x3a\x39\x72\xeb\xeb\x79\xbb\xff\xfd\xde\x7f\xa9\x09\x22\x6a\xf3\xec\x54\x4e\xea\x94\xbd\x96\x02\x1d\xa2\x10\x3f\x6f\x36\xc7\xea\x5f\x79\xff\xe7\x38\x65\x5e\xe5\xfc\x90\x97\xd4\xb5\xf2\xf9\xfb\x48\x2f\x06\xb8\x49\x12\xb4\xc5\xcb\xbe\xc2\x36\xb9\x11\x22\x54\xca\x16\x0d\xab\x31\xb1\x18\x44\xa8\x99\x7d\x39\xc8\x83\x63\x44\xaf\x04\x11\x45\x09\x41\xcc\x7e\x8c\x59\xf1\x7e\x61\x12\x51\x92\x52\x5d\xee\x70\x82\xba\xc1\x6d\xd9\xee\x54\x6e\xd1\x3f\x6a\x49\xd1\x14\x44\x1c\xc4\x5c\xf6\x35\x97\x83\xed\xa6\xfb\x63\x61\x2a\x32\x1b\xd7\xdc\x83\xea\xff\x1a\xc7\x56\xc2\xba\xd7\xb9\xce\x2b\x4d\x99\xe9\x88\x2a\x0e\x22\x49\x04\x81\x5c\xf6\x38\x5f\xff\x44\xc2\x12\x39\x86\xf1\xaf\x4a\xbd\xe4\x0b\xb8\xb8\xf0\x08\x96\x70\x87\xa6\x5c\xf7\x66\x10\xa3\x47\x2c\xd2\x54\xa8\xd0\x59\xd3\xfc\x36\xe9\x9b\xb8\x01\x59\x82\x86\x30\xf3\xe7\xa2\xcd\x5b\x1b\xf9\x4f\xbf\x82\x33\x20\xfd\xef\x01\x10\xfc\x1d\xf3\xe5\x7d\x5d\x70\x48\x42\xbf\xe4\x5a\xf5\x51\x57\xa6\x99\x28\x24\xcd\x2b\x16\x82\x6b\x96\x49\x97\xa9\x0c\x50\x97\x19\xd1\x1a\x84\x48\x32\x72\x6b\xec\x05\xbe\xf4\xc1\xd6\x64\x7b\x77\x95\x9f\x27\xea\x42\x24\x16\x28\xdd\x2b\xa4\x6e\xef\x7e\xf5\x09\x21\x89\x34\x70\xcc\xdf\x17\x3c\x98\xe6\x83\xd1\x26\x1c\xb4\xd9\xf6\x20\x9a\xe6\xfa\xdc\xcd\xb4\x87\x12\xaf\xe1\x63\xf6\xec\x85\x49\xb4\x95\xa7\x84\xe3\xfe\x47\xb5\xf5\x91\xb2\x80\x40\x50\x27\xe2\x78\x2e\xae\xf3\xb7\x5f\x7c\x2f\x44\x8a\xf8\x57\x2f\x55\xd3\x5e\x18\x97\x82\x80\xcc\xce\xbd\xdd\x59\x5e\x41\xf9\x8a\xf5\xb0\xd1\x0f\x31\xc6\xe8\x6c\xda\xfa\x97\xde\x6f\x1e\xfc\xaa\x20\x24\x93\xbd\xc5\x1a\xe4\xfa\x7a\xfb\xc7\xb5\xb7\x37\xf3\x43\x94\x06\x63\xbd\xeb\xf2\x72\x35\xaf\xaf\x09\x4c\x02\x0c\x06\x66\xf5\x35\xca\x59\xe3\x42\x98\x38\x25\x42\x83\x53\xae\xb3\x0b\xc0\x02\x10\xe2\x1f\xf3\x8f\x65\x66\xdc\xfd\x9e\xf2\xa6\x40\x18\x96\x10\x2a\xf6\xfe\x5c\x37\xf9\xc0\x69\x02\x61\xc0\xf2\x96\x08\x02\xde\xd6\xe0\x3a\x0d\xcb\x6e\xcc\x00\x41\x90\x52\xc7\x96\xca\x05\x36\xce\xfe\xcd\x1f\x4a\xb8\xb5\xa4\xb6\x42\x62\x9b\xf6\xc5\x46\xf1\xcd\x63\x5d\x29\x6c\x7a\x7e\x3a\x40\xc0\x90\x5c\xcc\x54\xde\x7e\xf8\x8a\xec\x13\x36\xd5\xb9\x5e\xb0\xdc\x5f\x7e\xd8\x10\x70\x14\xbe\x0b\x79\x35\xea\x21\x42\x60\x18\x55\x6b\xcf\x0d\xd6\xab\xa2\x46\xd0\x1f\x56\x15\x65\xd3\xbe\x4c\x9f\x06\x44\x89\x8e\xfb\x5a\x74\x17\x7e\x1f\x4c\xe6\x4f\x13\xc9\x8c\xa4\x67\xc0\x42\xb1\x7a\xb9\x91\xfe\x30\xa7\xa0\xb2\xae\xaa\x76\x8a\x09\x82\xc8\xa0\xef\x00\xde\x39\xc5\x32\xee\xe3\x5d\x88\x35\x7a\x8d\xb2\x2e\xc3\x6f\x06\xf7\x5d\x80\x24\x90\x56\x27\xe9\xdb\x58\x20\x01\x20\x49\x90\xa9\x1e\x11\xbd\xed\x4b\x0e\xc0\x42\x54\xa9\x67\xdd\x56\x35\xfe\x8c\xea\x0e\xc0\x20\x70\x84\x15\xc8\x7b\x8b\xff\x49\x04\x0b\x0c\x74\x1a\x8e\xab\x1f\x2b\x6f\x04\xec\xbf\x32\x4d\x79\xaf\xe9\xd3\x60\x4d\x02\xc0\xed\x56\xcf\x6e\x6c\x2a\xad\x55\xba\x2d\x51\x8f\x64\x0e\xbb\xcf\x5c\xee\x78\x90\x05\x29\x59\x21\x9f\x2a\xd7\xb8\xf7\x7f\x0f\x91\x96\xf5\x23\x05\x93\xa3\x8d\x84\x12\x32\xaa\x73\x36\x67\x49\xdc\xf9\xea\x06\xf1\x93\x56\x51\x97\x5c\x52\x33\xf0\xc7\xf9\x3d\x07\x0b\x3b\xf6\xe7\x11\x82\x93\x9a\xd6\x4d\x01\xd4\xfd\xe9\xf2\xda\xf7\xa1\x3c\x33\x04\x7e\x00\x71\x44\x12\x16\x9b\xe3\x29\xaf\xf1\x42\xc2\x65\xde\xa9\xfc\x7b\xa0\x01\x90\x71\x60\xc5\x0f\xf0\x54\x80\xc2\x95\xcc\x8b\x7c\x44\xc4\x1d\xa9\x75\x5d\xa4\x43\xfc\xb3\x53\xb2\x50\x09\xaf\x56\xff\xdb\xe7\x20\x81\x4f\x00\x69\xfe\x2c\xda\x84\x56\xf1\xf3\x74\x6e\xad\x53\xdc\xd3\xfd\x7d\xa5\x71\xf2\x80\x54\x14\x50\xc8\xfb\x5f\x88\xe5\x08\x49\x0e\x8a\x05\x84\x0f\xf2\x3b\xcc\xb5\xb5\x1f\x9f\x4d\x37\xc5\x03\x37\x4d\x1c\x76\x63\xc2\xc4\x19\xdf\x7c\x25\xac\xb6\x90\x13\xbb\xf3\x5f\xa3\x03\xab\x61\x99\x37\x24\x7f\x87\xf3\x79\xa8\x15\x77\x76\x04\x16\x83\x38\x44\x4c\x80\x01\xa3\x85\xcc\x11\x2c\xfa\xd2\x0b\x6d\x5a\xbf\x4a\x77\x3e\xaf\xc3\x00\x66\x99\xb0\xd2\xaf\x0d\xd6\xf4\x8e\x4c\x1f\x41\xff\xe3\x11\xc2\x78\x2c\x4a\x7f\x75\xae\xcb\xef\x2f\x58\xee\xda\xea\x74\x1a\xd6\x4a\xc3\x81\x4d\xae\x33\x3f\x56\xb5\xce\x67\x86\xe1\xb3\x29\x60\x04\x23\xb5\x8c\xc3\x33\x96\x5d\x06\x87\x3f\xeb\xa4\xca\x20\x16\xf4\x10\x6f\x61\xa2\x64\x03\x32\x48\x19\x21\xc7\x6e\x73\xe3\x98\x7e\x9f\x9d\x22\x4c\x34\x55\xac\xab\x5a\x93\x7f\x7c\x3b\x7b\xd4\x32\xca\xc0\xb5\xfd\x28\x81\x86\x35\x9c\x15\xf8\x95\x4f\xc6\x91\xd5\xc2\x18\x62\xbf\x0f\xa2\x8e\x2c\xfe\xc6\xe9\xb2\x26\xe3\x48\x91\x90\x2c\x55\x9c\xf3\x6e\x23\x79\xa6\x96\xe7\x27\x57\x9a\x04\x56\xc6\xa1\xad\x9e\x9f\x0b\x82\x4a\x8c\x1a\x5b\x32\x09\xac\x13\xfe\xc1\xe4\xcd\xcb\xea\xdf\x67\xa8\xf3\xf3\x0c\xb9\x2a\x59\xa4\x62\x0f\x74\xa1\xae\xaf\x97\x11\x74\xd9\x9c\x4c\x03\x24\x35\x1f\x0a\x9b\xa9\x0e\xa9\x1d\xd2\x7c\x0e\xa1\x96\x69\x1c\x53\x35\xea\x64\xcb\x02\x87\x06\xdb\x23\xbc\x3f\x55\x33\xb3\x13\x90\x69\x1a\x50\x81\xcb\xa5\x4e\xdd\x5e\xe6\x8e\x64\x11\x23\xda\x70\xae\x2a\xfb\x94\x77\xbd\x52\x02\xc8\x8c\x45\x2c\xb6\xd4\x41\x63\x1e\x73\xf5\xda\xf4\x47\xb8\x24\x04\xa5\xaa\x8e\x27\x2c\x1b\x68\xf1\x96\x14\xec\xee\xaa\x12\x6a\xf5\xb2\x1c\xd8\x4a\x6e\x52\x8a\x5f\xc0\x16\x77\xae\x3e\x82\xd1\x95\x08\x91\xd2\x5a\xba\x3a\xc1\xea\x5f\x30\x99\x49\xc4\xda\xb7\x69\x63\x17\x0a\x78\x0d\xca\xf1\x97\x5c\x88\x6f\xbb\x8f\x42\x64\x28\x58\xfd\x56\xe6\xaa\xaa\xcb\x27\x28\x55\xff\x8d\x10\x63\xec\xe5\x93\x3f\x8e\xb2\xe7\xa6\xb9\xc3\x32\xb6\xdb\xd9\x1d\xe4\xe5\x55\x9d\xeb\xe7\x0b\x06\xff\xa5\xa3\xfc\xec\xdb\xa5\xb4\x0d\x66\xc2\x6f\xb6\x58\x1b\x50\xb8\xed\x72\xf4\xee\xfa\xc7\xce\x63\x93\xd9\x2e\x75\x40\xcd\x02\xf7\xd2\xde\xe3\x8f\xdd\x4b\x55\x5f\x90\x08\xa4\x8e\x45\x90\x38\x74\x02\x42\xeb\xa1\x56\xc3\xd7\xeb\x24\xc5\x21\x96\x68\x9f\x2c\xa0\xda\x2a\x53\xdc\xc1\x69\x86\xf2\x9f\x94\x43\xa4\x66\x92\x0c\x66\x0e\xcd\x68\x42\x68\x61\x1d\x98\x5c\x90\xd6\xd3\xa3\x1e\xe1\x3c\x04\x68\x52\x43\x42\x36\x9b\x24\x1e\xd2\xff\xd1\xd8\xa6\xd2\xcd\xf6\x7e\xff\xf4\xed\xcf\x83\x6b\x71\xf9\xc3\x18\x58\x9b\x5c\xeb\x97\xd7\xad\xa7\xe7\xd3\xa9\xaa\x67\xf1\xad\xc4\xc8\xd0\x2f\x72\x89\xa2\x05\x4f\xf4\xe7\xc8\xb4\x4a\x7a\xe9\x06\xfb\xd2\x5c\xca\xe1\x83\x44\x25\xb9\xd3\x50\x7e\x82\x16\xc3\x60\xf6\x25\x26\x60\xca\xe1\xdd\x0e\xee\x97\x1e\x72\x55\x95\xf9\xbf\x0f\x50\xcb\xbc\x6d\xac\x4f\x07\xa1\xdd\x97\x97\x09\x13\xf3\x68\xa4\xbd\x78\x8b\x6f\x58\x4c\x5e\x72\x23\x02\x4a\xf1\x7a\x10\x66\xf5\x49\xc8\xac\x02\x6d\xcd\x37\x9c\x22\xc6\x13\x36\x58\x5f\x92\xf9\xfc\x60\x4c\x94\xd7\xfc\x46\x4a\xf1\x7b\x30\xf9\x82\x3a\x15\xa8\x30\x8e\xd9\xe0\x72\xd5\xcd\xa0\xe6\x0e\xde\xa9\xec\xef\x5f\x75\x15\x4a\xeb\x46\xd1\x80\xc1\x39\xcd\x73\x39\xdf\x53\xa1\xe2\x81\x9c\xf8\x3f\x84\x1e\x45\xaa\xa2\x24\xce\x12\xef\x31\xf9\xfe\x37\x20\x33\x2a\x52\x59\xe8\x24\xda\x08\xdc\x66\x55\xeb\xde\xf2\x16\xd7\x95\xfe\xec\x4e\xc4\x18\x87\x89\x2f\x9a\xe2\xdb\x82\xc3\x14\xa8\x04\x63\xca\xc7\x7e\xf8\x76\x73\x5e\x3e\x93\xb2\x88\xbf\x56\x96\xc9\xd8\x3a\xdc\xfc\x58\x3d\xde\x7d\xc6\x8a\xf5\x83\x41\xd2\x72\x31\xc4\x76\xb3\xe3\x0a\x89\xeb\xb9\x6b\xe1\x15\x5f\xac\x4c\x82\x3b\x94\x66\x92\x90\xb5\xf6\xe6\x3a\x3d\xd1\x6f\xa4\x65\x3b\x4f\xdf\x55\x2a\x21\x71\x18\x8b\xbb\x4a\x0f\xd6\xb7\x97\xd5\x71\x95\x25\xa9\x17\x72\xb9\x87\x23\x01\xd2\x16\x81\x5b\x2a\x4b\x54\x4f\xd8\xf6\x32\xaa\x1e\x99\xa9\x32\x96\x7a\xfe\xfd\x7b\x7e\xd6\x50\x5d\x22\x48\xfb\x1d\xb0\x0b\xc9\xbc\x48\xe5\x1d\x94\xf0\x6c\xe3\xf5\x91\x07\x98\x1f\x17\x5a\x8f\x9e\xbc\xb9\xaf\x36\xc7\x53\xeb\x9d\x49\xfa\x59\xc7\x33\xce\xc1\x4b\x42\x28\xab\x9d\xf8\x70\xc2\x92\x96\x51\x6c\x46\x96\x4f\x34\x96\x70\x12\x6e\xbd\x5c\x90\xf7\x1a\xc7\x58\x0a\x20\x0d\xa2\x09\x4b\xce\x46\x8e\x03\x7c\x78\x7a\xad\x32\x64\x44\x41\x3f\xf4\x50\xf2\xbf\x95\x63\x2a\x99\x24\x89\x85\x27\x9f\x20\x2f\xdb\x3f\xaa\x77\x1c\xd7\x0a\xf8\x65\x3b\x5b\x49\x4c\xa4\x23\xb1\x1f\x8e\xf0\xfe\x6d\xb3\x6f\x1e\xbb\x98\xa4\x3d\xd7\xe5\x2d\x36\xcd\xfe\x05\x66\x2c\x05\xa5\x62\x08\x9d\x38\x52\x39\xc7\xe5\xcd\xdd\x6d\x40\x29\x06\xa1\xa3\x2a\x59\xe2\xae\xbf\xdf\x9a\x59\xeb\x93\x51\x28\x71\x97\x97\x5d\x28\xf1\xad\x9c\x0b\x7a\x74\xa3\x81\x3a\xa1\x14\xb0\x59\xc5\x8c\x9f\xdf\x0b\x2d\x32\x6f\xd7\xfe\xad\xcc\xff\x7d\xc6\xdd\x89\x96\xee\x85\x3e\x82\xd2\xd2\x56\x48\xbb\x57\x37\xf7\xf7\x6c\xba\xbf\xfb\xfb\x85\x2a\xa3\x85\xc6\xe9\x49\xd4\x1f\xbb\xaa\x78\xa0\x8c\x6e\x89\x62\x14\x4e\xfe\x33\xbd\xf3\x26\x36\x44\x63\x50\x23\x84\xcd\xb6\x5c\xc3\xb9\xd0\x75\x55\x5a\x82\xca\x79\x2c\x94\x32\xe9\x29\x29\xe3\x44\x5c\x1b\x6c\xa9\x8b\xb6\xbd\x5e\x2c\x8d\x2a\xa3\xad\x72\x22\xe1\x80\xaf\xc8\x34\x67\x53\x52\x35\xe4\xe2\x1e\x1b\xa3\x94\x99\xe8\xbd\x5a\x54\xdf\x24\x56\xd0\x41\x10\x38\x3f\xfd\x57\x2c\xb7\x4d\x73\x9e\xdd\x4d\x1d\x48\x49\x7c\x93\xfd\xe6\x0e\xda\x8b\xc0\x6c\xf4\xee\xea\x30\x0a\x08\x61\x65\xa9\xcf\xee\x3b\xe7\x0e\x04\xa0\xc3\xd8\xf2\xfb\x4c\x3e\xf6\xc2\x1c\xc7\x0e\x3a\x92\x19\x89\xc2\xdb\xf5\x8c\x32\xa3\x59\xec\xa2\x63\x54\xa4\xe9\x45\xe5\x84\xe5\x35\x5c\x27\xa1\x5d\xea\xa8\xaa\xda\x60\xa9\x3f\x5f\xeb\x74\x12\x09\x02\xd9\x1c\xe4\xf9\x63\x5d\x1d\x8f\x55\xb9\xdf\x7f\xff\x55\x76\xed\x3e\xcb\xa2\x98\x90\x4c\x7f\xb8\xf7\x7b\x55\x6a\x2a\x88\xfc\x36\x77\xcb\x04\xcd\x58\x16\xa5\x83\x0c\xf8\xd8\xc7\x6a\x76\xf1\x2c\x8d\x23\x1b\xfa\xd9\x1c\xea\x1e\xdf\x7d\x39\x4d\xa7\x91\x06\xdb\x39\x31\x2d\x17\xb3\x07\x96\x85\x63\xa0\xac\x95\x30\x20\x04\xce\xe2\x9b\xa5\xb3\x90\xb9\x50\xa3\x57\xbd\xeb\x79\x80\x4b\x8b\xbd\xe6\x31\xd0\x1a\xd3\xbd\x81\x7b\xef\x39\xeb\xaf\x8c\x33\x93\x39\xc6\xc4\x4a\xbd\xe4\xf8\x86\xfa\x7a\xbe\xe2\xa5\x89\xfb\x8f\xfb\x8c\x88\x19\x0c\xae\x9a\xd6\xd2\xdf\x41\xd3\x46\xb3\x4b\x08\x34\xe1\x08\x27\xbb\x75\xe8\x85\x9d\x9a\x2b\xd9\x82\x16\x60\x68\xe3\x7a\xa5\x80\x64\xd2\x26\xd3\x10\x2a\xba\xfc\x6e\x81\xef\x56\xaa\xc9\x72\xd2\xf4\xa3\x12\x69\xd5\x7e\xa1\x40\xfb\x56\x2c\x3f\x25\xd0\x99\x95\x54\xa1\x52\xd3\xae\x0b\xad\x66\xef\xa1\x96\x60\x93\x2c\x2b\xa0\xd3\xe5\xd8\xfe\x4b\xa4\x62\x44\x54\x1c\x29\xea\x4e\x7d\x69\x96\x23\x85\xee\x73\x10\xf8\x4d\xb2\xa5\x5d\x6f\x3e\x41\xa7\x97\xa0\x02\xb0\x3c\x8e\x12\xe1\xf5\xdb\xe9\xa1\xbf\x02\x15\x02\x35\x26\xbc\xce\x43\x35\xdf\x1e\xb4\x8a\x25\x6d\xc8\x2f\xd0\x58\xfe\xdc\xf2\x25\x29\x6e\xe8\x8d\x7d\xaa\x9e\xcf\xf8\x58\x57\x6d\xa5\x06\xc0\x9e\x1b\xa3\x43\x69\x71\x52\x55\x09\xed\x28\x87\xd4\x18\x5a\x0f\x88\x83\xcb\xcf\x6c\xfb\xff\x06\x47\x1c\xfa\x74\x06\xe7\xd4\xc8\x62\x52\xa1\x3c\xd8\x3b\xbf\x86\x5a\xef\xb0\x5d\xb5\xc4\x84\xfe\x64\xaa\x23\xb7\x79\xfe\xbe\x3a\x6d\xdf\x3e\xfa\x6f\xe7\x9a\x2a\xb6\xda\xf9\x29\x79\xb1\xf7\x11\xaa\x40\xa3\x90\x84\x02\xce\x55\x65\x37\x53\x5b\xf3\x9d\x9e\xde\x04\x21\xb1\x8e\xfd\xcf\xf8\x24\xd4\x9e\xdd\x39\x13\x62\x66\xb7\xec\x02\x95\x4b\x48\xfa\xe0\xa9\x4b\x7a\x62\xde\xf3\x39\x76\xea\xa5\xaa\x0a\x6b\x35\x6a\x07\x60\x90\x71\x11\xf4\x1b\xe3\x2c\xdd\xc1\x20\x53\x7a\x8c\x2f\xbc\x25\x64\xca\x7c\x90\xb1\x3d\xe5\xbc\x54\xb7\x67\xf5\x6a\x35\x19\x16\x27\x12\x86\x86\xa9\x78\x48\xa4\xaf\xe9\x49\x4e\x1f\x33\x46\x71\x4c\xf7\x4a\x15\x08\xe5\xb7\x53\x17\x3d\xe7\xd5\xb9\x19\xf3\xec\x31\xd6\xb6\xee\xe8\x2b\x2e\x6b\x2a\x16\x0e\x07\xa9\x2e\x6e\xdd\xdc\x7f\xff\xcb\x03\x19\x30\x09\xb4\x57\x4d\x73\x81\x17\xa9\x41\x63\x4d\xf2\x99\xc5\x54\xa7\x00\x93\x2e\x1a\xfa\x3f\xff\xdf\xff\xd9\xb8\xca\x84\x3f\x4b\x1a\x59\xab\x8d\xe7\xee\x8e\x81\xaf\x30\x53\x8f\x74\x3f\xdd\x1c\x31\x63\x76\x65\x3a\x1e\x5c\xbe\xf8\xad\xd1\x2b\x92\x6a\xed\x93\x55\xcc\xd2\xc4\xbe\x42\xe4\x24\x7a\x03\x45\x63\x97\xad\x69\x4e\x8e\x3c\x0e\x23\x1c\x44\xbd\x5d\x00\x3f\x0a\x35\xad\x26\x91\xfd\x64\xbf\xea\x21\x47\xab\xca\xe6\x3b\xab\x37\x05\x5c\x30\xf8\x67\xcf\x48\x08\x45\x2d\x9c\x1e\xc9\x31\x0f\xea\xfe\x67\xfc\x05\x02\x12\xaa\xfa\x3b\x3c\x84\xb3\xfd\x5a\xc3\xc9\xff\x3e\xa1\x33\xec\xd6\x8e\xc3\x41\x41\x51\x48\xf8\x44\x15\x18\x10\xc2\x24\xd1\x5e\xe3\xc0\xd6\x49\x2d\xa9\xf0\xbf\x13\x2f\x6b\x81\x10\x8b\xb4\x77\xb5\xcf\x51\x17\x17\x40\x14\x84\xc4\x66\x00\xb7\xb9\x41\x0f\xd0\xf7\x5d\xee\xee\x20\x65\xe8\x4d\x5b\xaf\xab\x52\x81\xeb\x20\xfc\x63\x4c\xfd\xf5\x43\x99\x23\xd8\x3a\x91\xb0\xe5\x09\x0d\x60\x6d\x18\xf2\xe6\xaa\x5b\x49\x5d\xd1\x60\x78\xba\xa0\x03\x6a\x6c\xe5\x65\xde\xe6\x84\x6c\xdb\x96\x3a\x7f\xcb\xf5\x19\x8a\x35\x9c\x9a\x9b\x73\xa9\x09\x18\xf1\x09\xc6\x0a\x65\x6c\xf5\xb3\xa9\x82\xe3\xc0\x1f\xdb\xeb\xe6\xea\x63\x5d\xe4\x38\x87\xbc\xa2\x0a\x14\x2d\x91\x37\x79\x8d\xa6\xf8\x70\xc5\x44\xf8\xc5\x86\x80\x2a\x32\xe0\xbe\xe4\x4b\x5e\x17\x8d\xd3\x1e\x5e\x08\x8e\x51\x29\xa1\x7a\x6a\xda\x17\x38\xe2\x43\xaf\x85\x0c\xa8\x23\x15\xf7\x32\xc9\x3f\xa0\xd6\x4b\xfa\xb7\x7e\x6c\x1c\xd2\xc4\x71\xa1\xf3\xd8\x43\xb3\x1f\xa1\x88\x06\x42\xa1\x25\xf1\x27\x27\xe6\x8a\x80\x98\xf2\x14\x87\x76\xe4\xe8\x65\xb8\x48\x5b\x11\x81\x51\xc6\x70\x7d\x37\x79\x99\x4d\x9c\x4a\xab\x4e\x58\xbf\xe5\xe5\xb9\x19\x75\x01\x4c\x90\x24\x59\x38\x6d\xe9\xaf\xa1\x28\x2c\x58\x78\xc9\x3c\xfb\xf3\x66\xc5\x27\x9a\x5f\x26\x60\x86\x6e\x98\x89\xfd\x97\x86\x81\xd5\x0c\x24\x17\x20\x57\xa8\x83\x11\x45\xd6\x84\xb1\x26\xd2\x9f\x05\xac\xf6\x9f\x8b\x82\x84\x38\x0d\xa4\x8d\xf1\x60\x6e\xab\xf2\xf9\x6b\xa5\x3d\xec\xc1\xc4\x98\x50\x5f\x97\x22\x3e\x3e\xbd\x37\x26\xc9\x2c\x7d\xd2\xaa\x48\x5f\x91\x12\xbd\x9b\x90\xf3\xb7\xd4\x24\x42\xd0\xd7\x37\x50\xde\xe5\xe5\xad\x85\xde\xf8\x63\x26\x44\xdd\x2b\x79\x5c\x43\x5e\x7c\x3c\x62\x3d\x6e\x22\xb8\x81\x2c\xcc\xa8\x7a\xfb\x05\xad\x71\xef\xb0\xe9\x72\x3f\x42\x44\xd2\xb2\x44\xa8\x9f\xdb\xab\x51\xce\xc2\x6e\xc3\x50\x92\xd6\xd3\xe3\xd3\x66\xbd\xdd\x6d\xfb\x5e\xb7\xc9\x62\x34\xd9\x08\xab\x8e\x7a\xe4\x83\x06\x26\xc3\xcc\x1b\x3f\x11\x55\xf4\xad\xb7\xb2\x18\xae\x92\x07\x82\x08\x41\x87\xbc\xb1\x41\xde\xf0\xed\xb3\x9b\xc2\x39\x33\xdc\x67\xb5\xff\xd9\x96\x4d\x4b\xaf\xe9\xa5\x35\xca\xec\x73\x22\x09\x85\xee\xdd\x57\x48\x88\x40\xbd\xde\x54\xf5\x6e\xe0\xb7\x1b\xa1\x43\x52\x56\x22\xcf\xd9\xd3\x75\xf5\xfc\xc9\xb9\x20\xe1\xa4\x6e\xfd\xfb\xc3\xf6\x61\xb7\xf7\x0c\xb8\xbf\x05\xc5\xbd\x08\x2a\x0c\xc8\xd0\x92\xee\x6d\xa5\x7b\xec\x55\x04\x06\x8c\xa4\x95\x91\xd2\xa2\x1d\x96\x7a\xd4\x9a\xee\x1f\x8c\x0c\x38\x47\x6f\xa5\x7c\xed\xbc\xfd\xfd\x19\x24\x84\x3c\x19\xa2\xde\x17\xa8\xdd\x7e\xe6\x8a\x60\xb3\x07\x21\x65\x18\x05\x83\xcd\x20\x35\x9d\xa7\xd7\x2b\x75\xac\x07\x5d\xc7\x0b\x41\xc7\xbf\x25\x27\x67\x24\x5a\xbc\xea\x3d\xaa\x16\x6a\x8a\xa8\x2b\x92\x8e\x5f\x5c\xc0\x8c\xce\x32\x86\x83\xc2\x05\x7a\x72\xd7\x4d\x65\xa7\xfc\xf2\xa7\x4c\x20\x48\x40\xc6\xab\xe0\xd6\xaf\x65\xa5\x71\xde\xf5\xf1\x83\x23\xe0\xb1\x6f\xc5\x3c\x79\x54\x62\x6f\x5f\xd8\xdd\x8c\x7e\x46\x1b\xd0\xc6\xc9\xb4\x8c\x59\x3a\xfd\x61\x95\x58\xcb\x74\x1b\x88\x38\xbf\xec\xfe\xa9\xca\x20\x48\x40\x64\x5e\x7c\x4a\x1f\x68\xd1\x3d\x34\x88\x7a\xe2\xaa\x20\x83\x28\xe4\x3c\xe9\x5f\x72\x52\x84\x21\xeb\xb6\xf3\x85\x07\xa5\x0c\xa2\x48\x3a\x6b\x99\xa6\xe7\x20\xad\xa6\x67\x33\x11\xe5\x7b\x9b\x73\x5d\x9d\x7a\xf5\x04\x19\xc4\xca\x24\xa9\x63\x15\x5a\x9e\xc2\x3c\x43\x19\x96\x51\x19\xc4\x3a\x40\x3e\x4a\x59\xf3\xb6\xe9\x1e\x81\xb5\x06\x26\xc8\xe1\xdc\x79\x49\x06\x49\x10\x52\x18\xa7\x51\x15\xbd\x09\x95\x0c\x92\x24\x25\x4d\xc1\xe6\xa3\xd4\xc4\xf1\x72\x2c\x40\x17\x3f\x95\xfd\x38\xc6\x69\x73\xe8\x96\xae\x63\x99\x37\x34\xbf\x0f\x91\x3f\xcc\xc2\x8c\xbc\x10\xce\x0d\xd6\x45\xf5\x5c\x9d\xa7\x3b\xb5\x0c\x18\xa4\x54\x8d\xdd\x96\xb2\x6a\x49\x2b\xf8\x62\x3b\x59\x9a\x40\x32\x60\xd2\x18\xe3\x57\x2e\x6b\x67\x39\x4a\xce\xdd\xa0\x34\xb2\xfe\x31\xd6\x0a\xd2\x69\x8b\xf7\x72\x54\x7e\x10\xd3\xde\x42\xca\x49\xf8\xbb\x98\x62\xfc\x5a\xc8\x20\xcd\x80\xfa\xab\x96\x26\x3c\x9a\x73\x32\x48\x25\x82\xcd\x5e\xbb\xa8\x67\x32\xed\x96\xc2\x25\x19\xa4\x1a\x22\xd7\xf9\xf8\xb6\xff\xd4\x96\x4a\x06\x59\x62\x4d\x15\xae\x6e\x1f\x1e\x46\xfb\xb5\x0c\x32\x6e\x5f\xf4\x23\xf4\x53\x28\x33\x01\x73\x64\xe3\x5b\x28\xb5\x0d\x5a\xec\xd6\x35\x54\xc8\x64\xc0\x03\x20\xfa\x80\x65\x16\x5c\xe5\xd0\xbe\x14\x55\x39\x6d\xd1\x4e\x8b\x49\x73\x29\x93\xe9\x73\xe0\x3a\x20\x05\x8c\xdd\xe3\xea\xaf\xc9\x25\x72\x93\x31\xd9\xab\x0b\xe2\xc7\x78\x76\x09\xb4\xae\x51\x33\x4f\xe9\x9f\x16\x72\x65\x00\x82\x53\xfb\xd1\xae\x6e\x5f\xb0\x0c\x46\xdb\x80\x1b\x23\x23\x41\x21\x1c\x9c\x4e\xc5\xc7\x8e\x08\x7b\x37\x88\xfb\xc1\xaa\x48\x06\x52\x29\x5b\xb9\xb7\x5a\xb0\x75\x7f\x07\x95\x04\xa2\x10\x6f\xd7\x0f\xbf\x14\xd3\x98\xde\x04\xa5\x99\x1c\xa4\x18\xef\xf2\xb2\x5b\xfd\x2e\xdd\x05\x64\xa0\x50\x7b\x91\x42\xf5\xba\x34\x51\xfc\x38\xc3\xa9\xd9\xf3\xbd\x2a\x8c\xbf\x3c\x2d\x22\xad\x07\x5b\xac\x9e\xe9\x2f\x03\x0d\x0c\x2c\x60\x9b\x4a\xae\xd3\x53\x69\x19\x45\x03\xfd\xe0\x0a\x96\x84\x6d\x07\xe4\xc8\xec\x96\x63\x9a\xa5\x8e\x39\xbc\x39\x5a\xc3\xbe\x4f\x66\x89\xff\x80\x06\xe1\xb4\x3c\xfc\x42\xb7\x50\xfd\x92\x81\x01\x45\x9b\xcc\x08\x0d\x3d\xfd\x66\xa3\x6d\x31\xf0\xd8\xe5\x13\xfb\xa9\x43\xef\x4c\xe9\x56\x06\x06\x39\x35\xb3\x7a\xdc\x9c\xcf\xbb\x64\x18\x70\x11\x0e\x93\x66\xb2\x23\x79\x34\xf1\xa8\x8a\x26\xc3\x50\xc4\xd6\xc3\xf9\x69\x73\xb7\xbd\xdf\x1c\x56\xb7\xb7\x0f\xeb\xd5\x7e\xfb\x70\x7f\x58\x5d\x5f\x6f\xae\x97\xdf\xe8\x30\x44\xa9\x75\x2f\x86\xb3\xf5\x5d\xfc\x4f\x46\x47\x19\x04\xaa\x37\x17\xba\xc2\xa6\xfd\xa5\x43\x86\x0c\xe3\x2c\xb3\x1a\x4b\xdd\x9c\xdd\x21\x8e\x69\x41\x32\x4c\x20\x09\x6d\xa4\x88\x65\x17\xa9\xab\x8f\xaf\x58\x9c\xe6\xbf\x76\x76\x4a\x16\x44\x54\x46\xa5\xe9\x38\x6a\xb9\xc9\x90\x25\x19\x81\xca\x4b\x7c\xa7\x7e\x8f\xeb\xe2\xe6\x47\x3c\xf4\x43\x74\x46\x3f\xc2\x6e\xe1\x37\xb9\x69\x5f\x36\xef\x9f\xac\x64\x21\x33\xb6\x14\x7d\x82\x73\xd3\xbd\x20\x9e\xa2\x2a\xc3\x94\xa5\x74\x64\x0f\x05\x96\xed\x46\x9f\xad\x1d\xdd\x78\x2d\x09\x53\xc6\xe3\x70\xf2\xda\x7c\x22\x7e\x20\xc3\x54\xd9\xfa\x26\x68\x7d\x95\x3f\x93\x42\xd6\x65\x91\x49\x86\x59\x98\xd1\xa2\xff\xc7\x7a\xbd\x48\x4c\x18\x4f\xea\x30\x8b\xac\x4e\x15\x89\x14\x38\xbd\xb1\xab\x8f\x49\x89\xcc\x8f\x14\x48\x3c\x48\x1f\x5e\xd8\x9d\x69\xe2\xb6\x2a\xc3\x4c\x82\x57\x38\xfb\x02\xcd\xba\x2a\x9b\xf3\x7c\xe7\x0a\x39\x98\x28\xf3\xac\x4c\x02\xdb\x2c\xff\x5c\x6e\x52\x92\x3a\x22\x4c\x78\xff\x9a\xec\xab\xbf\xee\x66\x27\x14\x3a\xb6\x85\xfe\xea\x7c\x72\x77\x77\x0d\xc7\x13\xe4\xcf\xe5\x20\x0f\x21\x43\x61\x8c\xe9\x8d\xce\x6e\x6a\xf0\xc2\xc4\x32\x04\x9e\x68\x18\x34\x18\x48\x1f\xb2\xea\x52\xb3\x3e\xcd\x97\x21\x28\x41\x4c\x86\xab\xed\x7e\x77\x3d\x79\x82\x32\x54\xd2\xdd\xc2\x9d\x55\xcd\x21\x3e\xc9\x2d\x34\x84\xc1\xed\x87\xc5\x9c\x04\x4d\x36\x5b\xb2\xa5\x1e\xd2\x50\x19\xca\x8c\x99\xc8\x49\xf3\x7f\x2b\x4f\x90\xeb\x31\xb5\x53\x86\x12\x4d\xe2\xe2\x50\x4a\xb9\xac\xc8\xc6\xfc\x7e\xe9\x18\xe8\x3d\x85\xa6\xc9\x9f\x4b\x4f\xee\x98\xc9\x95\x4c\x1e\xbe\x76\xc6\x41\x34\xf7\x1e\x9d\x44\x49\xbf\x5c\xa0\x48\xc9\x07\xfa\xe8\x59\xcc\x16\x33\xef\x2f\x0a\xa5\xa4\x62\xce\x43\x89\x77\x79\x51\xcc\xe7\xb5\xc9\x84\x8f\x03\x7a\x1a\xf4\xc8\x08\xce\x8e\x8a\x82\x2c\x8d\x3c\x81\xdd\x98\xbc\xc8\xa1\xc5\x05\xb9\x6b\x19\x05\x02\xe9\x55\xba\x83\x32\x37\xd8\xb4\xd5\x62\x8e\x24\xa3\x50\x58\x9d\x8e\x1d\xb4\x50\x36\xde\x1a\x5e\x46\xa1\x0c\x7c\x91\xc5\xdf\xbd\xc9\x85\x74\xf7\x02\xfa\x8a\xe2\xc4\x4d\x5d\x46\x11\x43\xaa\x2a\xba\xe9\x7a\xd3\x97\x29\x65\x14\x41\x9a\xb8\xc4\x85\xba\x72\x54\x2f\xb9\xd0\xb3\x95\x51\xa4\x98\x07\xae\x3a\x81\xf4\x75\x91\x1b\xb3\x98\x42\xc8\x28\x0e\x19\x99\xa1\x17\xd0\xb4\x3e\x2e\x1d\x28\xd2\x32\x8a\x15\x0b\xb4\xa5\xb0\x5d\x77\xfb\xd0\xcd\xfe\xf7\x78\x87\xa7\xd6\xa9\x1a\xfb\x61\x2c\x56\x90\xda\xc4\xb2\x0b\xe4\x2b\x47\x19\xe0\xee\x70\x9a\xc4\xc4\x67\x51\xd5\xf1\x98\xb7\xeb\xaa\xe8\x92\xd4\x1a\x8a\x7d\x35\xe1\xd2\x4f\x7f\x48\x16\x07\xd4\x0c\xee\xe6\x98\x67\x8f\xcc\x7e\x6b\x26\x2d\x7a\xfa\xd8\x85\x45\x9f\x9c\x45\x67\x8c\x0d\x75\x1d\x2b\x52\x39\xb6\xc3\x95\x11\xcf\x12\x62\x0f\xcb\xf3\xc7\x6e\x2e\x59\x2c\x23\xae\x32\x0b\x4c\xb2\x55\x37\x57\x95\x9b\x64\x1e\x11\x47\xee\x6c\xc1\xeb\xb7\x5c\xb9\x30\xff\xea\x5c\x5f\x44\x83\x6e\x3c\x24\x86\xe6\x40\xdb\x23\xbe\xdf\xb0\x3c\xff\x62\xef\x8a\x80\x65\x59\xd4\x5b\x70\x7f\x85\x5a\xaf\xe1\x34\xbb\x5a\x48\xb5\x72\x38\xee\xa2\xf9\x82\x6d\xfb\x09\xac\x47\x46\x60\x62\x22\xa8\xad\xa1\x28\x96\x45\xa1\x64\xa4\xb8\x0c\xd3\x41\xc3\xef\xb6\xfa\xa1\xe0\xf4\x84\xa0\x7a\xcd\x18\x19\x21\x03\xda\x33\x4f\x05\xfc\xdc\xd4\x4a\x46\x28\x15\x6d\x2b\xe4\x7d\x44\xce\x88\xee\x65\x6d\xb1\xee\xed\x41\x64\x64\x02\x24\xae\x7d\x5f\x0f\x9f\x28\x9d\xc8\x38\xca\x32\x66\x45\x48\x08\xd2\xde\x6d\x65\x90\x0f\x24\x95\x4b\x20\x9b\xfb\x5c\x1c\x42\x9c\xf4\x39\xca\x09\xeb\xde\x7b\xc6\x0f\x50\x92\xea\x91\x79\xf9\x3e\x93\x06\x94\x71\xa2\x15\x85\xe8\xc7\xaa\x44\xf2\xdf\x1e\xaf\x41\x31\x0b\x23\x62\xd5\x15\x55\x77\xc7\x97\x01\x97\x32\x66\x09\x43\xb7\x34\xb8\xde\xda\xec\x78\x9a\x11\x63\xab\xdb\x99\x5f\xc7\x09\x75\x9c\x26\x81\xe2\x97\xa0\xc1\xc5\x62\xa1\x7f\x7a\x71\x8a\x09\xbd\x94\x47\x2f\xf9\xd4\x4c\xce\x99\x31\xab\x7e\x60\x35\x50\xe8\xc5\xb8\xfa\xb8\xc3\x2e\xf8\x2b\xdb\xe9\x8d\xe1\x31\x78\x9d\x67\x7f\xe7\x1c\x7b\xf3\xae\xd2\x78\x85\xaa\x3a\xa2\xf3\xe1\x18\xb5\x3d\x64\xcc\xd3\xc0\x91\x59\x9a\xf6\xd0\xfe\xa8\xa8\x29\xbd\xf9\x37\x59\xe0\xba\x21\x10\x47\xca\x96\x6f\xba\x49\xb6\x2a\x8a\xcd\x3b\x29\x2a\x17\x73\x0e\x6c\x3f\xde\x42\xc8\x1a\x05\xc7\x1d\x3a\xec\xef\x84\x76\x20\x63\xc9\x33\xe3\xe2\xe7\xcf\xc5\x83\x64\x2c\x35\x77\xca\x68\x5d\xbc\xb5\x3f\x97\x68\xf9\x99\x0b\x18\x0d\x8f\x2e\x18\xe0\xe7\x61\xc4\x87\xff\xe1\xba\xc8\xa3\x53\x1b\xa0\x5f\x65\xe1\x07\x9f\x58\xfe\xb8\xb1\x2a\x48\xc8\xec\xe1\x6a\xf5\xfb\x66\x32\xa9\x94\x06\xaa\xf7\x3f\x3e\x6d\x0e\xdb\xf5\x83\x35\xea\x3a\xec\xb7\x77\x9b\xbe\x36\x10\xeb\x08\x33\xeb\x74\x57\x20\xd4\xf3\xd2\xa6\x1f\x94\x20\x71\xd8\xec\xa4\x6b\x5e\xf2\xd3\x67\x5e\x49\xb3\x4b\xd3\x3a\x25\xf1\x71\x87\x71\xbd\xee\xf6\x91\xe1\x2d\x9b\x96\xe9\x64\x8c\x42\xb1\xd4\x75\x39\x9e\x51\x6f\xed\x82\x79\x59\xf8\x97\x31\x6a\x41\xbf\xec\x1a\x55\xde\xcc\xf6\xf3\x18\x8d\x2f\x54\x51\xdd\xd1\x20\xb9\x3f\xfe\xad\xec\x36\x36\x51\x44\x72\x02\x9e\x60\xff\x8b\xdf\x67\x52\x21\x94\x77\x87\xb4\x8a\x10\xf7\xf8\x3e\x08\x1f\x7f\x87\xa6\x5b\x1e\xfb\xc5\x2e\x09\x02\x4d\x95\xf1\x31\xb9\x7e\x54\xb1\x5c\xce\x6c\x93\x20\x4e\x02\x47\x41\xad\x6a\xfd\x99\x5d\xef\xf4\xda\x92\x40\x5a\xdd\xbe\xc1\xc5\x7d\x55\x36\x3f\xb0\xfe\x1d\x95\x82\xd7\x88\xa5\x17\x9f\x9f\x7d\xa9\x4c\x19\x0c\x55\x6f\xf0\x53\xe3\xe7\x97\x1a\xc6\x90\xf9\xd6\xa0\xaa\x6a\x5c\xf9\xca\xde\x74\x58\x14\x5a\x66\x11\xc5\x89\x2d\x3c\x98\x2e\x1a\xf1\x37\x29\x0e\x74\x22\xe6\x56\x41\x87\xb6\xb2\x0d\xbd\x9f\xbe\x0c\x49\x12\x59\x19\x80\x67\x6c\xb7\xeb\x49\xb9\x26\x49\x98\xa0\xfa\x80\x13\x90\xb3\xbc\xf5\x49\xf8\x9a\x24\x59\x10\xb8\x80\x9f\xba\xb1\xd7\x17\x39\x54\xc2\x30\x22\xbc\x82\x5f\x49\x17\x57\x99\x24\x4d\x20\xb1\x2e\xb4\xe7\x52\xbd\x1c\x74\x4f\xee\xed\x0e\x19\x5a\x55\xfd\xaf\x23\xc9\xa7\xeb\x51\x84\x75\x01\xe8\x91\x49\xaa\x54\xe2\xe4\x80\x0e\xd0\xb6\xd6\xaf\xca\xae\xb0\xfd\x98\x2c\x30\x41\x9f\x1f\x51\xa9\xd8\x1f\x88\x0d\xed\x3c\x44\x62\xb9\x71\x5e\xa2\xd3\x1f\x95\x99\x50\xba\xb9\x72\x93\x77\xf3\x75\x29\xb2\x4d\x78\xca\x88\x6d\x2b\x2b\x8f\x25\x6e\xa6\x0b\x67\xc2\xd3\xd4\xb7\xa3\x6f\x11\x34\xd6\x34\x74\xdc\x98\x91\x09\x17\xc6\xfa\x92\x54\xe4\x6a\x30\x2b\xd6\xcb\x84\x9b\xc8\x78\xb7\xb3\x7b\x6f\x37\x22\x13\xc1\x98\xb2\xa2\xf8\x04\x44\xb0\x1d\x27\x0b\xae\xb8\x68\x7e\xb9\x8f\x40\x84\x32\xf6\xcd\xf1\xa2\x52\xaf\x5d\x2c\xb0\xe0\x18\x21\x13\x99\x68\x62\xf5\x7e\xdf\xee\xbf\x5e\x3f\xad\xbe\xaf\x6e\x0f\xbb\xf5\xca\xab\x57\xc9\x44\xaa\x84\x00\xb4\x32\x6f\xe5\xb3\x9a\xcc\x2a\x69\x02\xaa\xbc\x83\x1e\xb4\xaa\x7d\x2a\x33\xc9\x66\xdd\x78\x95\x24\x3c\xf3\x38\xfb\xa6\xc5\xe3\x0e\x0a\x1c\x7b\xa7\xc8\x44\x07\x8a\x2a\x49\xd4\xd3\x58\xe9\xb9\xec\x93\x4c\x30\x0a\x69\x77\x78\x28\xf1\xaa\xa8\xa6\xd7\x83\xdc\xa6\xde\x83\xd0\xd6\x74\x8a\xa3\xb1\xee\xaf\x77\x57\xfe\x2f\x26\x4d\x48\x01\x92\x36\xe0\xe6\x05\x6b\xf2\x0b\x42\xeb\x06\x68\x1d\x66\xa6\x77\xcb\x40\x90\x59\x2e\x4b\xd3\xae\x8a\x62\x97\x97\xf3\x05\x9a\x05\x31\x52\x0a\xb9\xc3\xf6\xe8\x42\x9d\x66\x3e\x44\x2a\xdb\x24\x3c\xcb\x41\x09\x64\xfa\x4d\x2c\xc0\x8c\xd2\xcd\xf6\x25\xaf\xf5\xc1\xbd\xb8\xb3\xf3\x84\x59\x20\x5d\x93\xb2\x69\xfd\xa4\x67\xa1\x08\x6c\xc1\x0d\x0a\x35\x11\xb0\xfd\xc7\xec\xd3\x22\xb6\xf8\xca\x16\xea\xf6\x64\x0d\x9a\xfa\x4e\x45\x77\x58\x06\x96\x54\x82\xa7\xf1\x49\x7e\xda\x6d\xf5\x9f\x95\x41\xea\x34\xfd\xbb\x67\x3c\x62\x56\x4a\x16\x87\x48\x1a\xb9\x07\x2c\x55\xa5\xed\xa4\xdc\x2e\x4b\xf7\x4b\x16\xa7\x29\xa5\xcb\x27\x8b\x62\xa7\x90\xc4\x6f\xe0\x2c\xc9\x32\xa6\x7b\xdf\xb9\x5d\xfe\x4c\x22\x57\x8b\x2f\x04\x63\x22\xa3\x16\x9f\x83\x22\xb6\x30\x97\xf5\x91\x8c\xe9\xb0\x5f\x98\x57\xdb\x69\xe0\xcc\x52\x61\x79\x09\x36\xf5\x1c\xcc\x79\x97\x69\x92\x92\xa5\x2a\xa0\x3a\xe4\x63\x01\x6a\xa6\x83\xcd\x67\x43\xb3\xc0\xc2\xb3\x1b\x6c\xaf\xa0\xc1\xdd\xf9\x78\x5c\xea\xf9\x4b\x96\xf1\x58\x59\x07\xaf\xea\x44\x9b\xc6\x28\x4f\x64\xdc\xbd\xf1\xaf\xb9\x7a\x9d\x44\x6e\xfe\x78\x12\xd2\x7c\xb2\xdb\xef\x12\xa6\x29\x8e\xfe\x71\xe1\x25\x22\x99\x08\xac\x3c\x3b\xc1\x80\x48\x83\xc9\x5a\xfb\xf5\xcf\x13\xb2\xc0\x6a\x45\x83\xce\x5d\x8f\x63\xf6\xd5\x24\xaa\xdf\x3d\xf1\xdd\x7e\xf5\xb4\x3f\x5c\xf7\x4e\x2f\x92\x01\x02\x27\x6e\x0d\x96\xe7\x20\x9b\x7d\xae\xdb\xb7\x52\xdb\xbc\x99\xdd\x09\x2d\x83\x38\xed\x23\xdf\xed\xfa\x61\xf6\x49\x8c\xb8\x1a\xe3\x92\xfa\x8b\x45\x16\x7a\xb1\xb1\x7b\xfc\xe1\xa0\xe9\x9f\x3c\x42\xd4\x21\x73\x55\x83\x87\xbe\x75\xc0\xd0\x68\x6a\xae\x3f\x1c\xf1\x19\x16\xdb\x16\x6e\xa0\x89\x63\xde\x17\x1d\x4a\xfc\x80\x5a\xff\xcc\x78\x40\x32\x93\x4a\xd1\xc3\x5c\x6d\x44\xf5\xf3\xa4\x90\x19\x88\x3c\x73\x77\xbb\x9f\xdd\x83\x34\x48\xac\xf4\x9e\x9d\xf1\x96\x28\x71\x59\x18\x4d\x03\x86\xa4\xf1\x41\x30\x5e\xac\x9d\xdb\x8f\xb7\x48\x9c\x0f\xc6\xc4\x0b\x79\x7e\x47\xf9\x25\x37\xed\x43\xa9\xf0\x0e\xde\x97\x36\xcd\x34\x30\x86\x2a\x76\xf8\xee\xab\xe1\x69\x98\xf1\x0c\x6c\x08\x51\x19\xab\x95\xff\xf3\x38\x33\x0d\x05\x32\x47\x97\x18\xc9\xb8\x2c\x54\x49\xd3\x28\xb6\xfa\x7a\xd6\x3b\x06\xf5\x66\xff\x75\x39\x52\x4a\xa3\x24\x26\x56\x36\xd9\x6d\xb5\xdb\xe3\xa9\x4b\xcb\x8f\x64\x93\xe3\x6a\x25\xd3\x07\xd5\x7f\x4c\xf5\xd0\x55\xa8\xdb\x8f\xd5\xec\x8e\xc7\x81\xa1\xf7\xf3\x35\x3f\x36\x0f\xe5\x6a\xb2\x9c\xa6\x31\x93\x36\x14\x19\x54\x98\x7c\x8d\x69\x06\x20\x76\x1f\x48\x62\xe5\x03\x8a\x55\x51\x50\xc8\xd6\x6b\x49\xc9\x34\x49\x43\xaa\x0a\x5e\xe5\xed\x11\xea\x57\x97\xd5\x7e\x81\x16\x7f\xcc\x74\x11\x64\xca\xc2\xa0\x6f\xa2\xec\xd6\x57\x13\x5c\xe0\x67\xab\xf9\xf4\x86\x31\xc5\x28\xfd\xdf\xfd\xfb\x4c\x76\x58\x2f\xf8\x7f\xcf\x43\xff\x27\x65\x4a\x83\x43\x43\x5f\xe7\x50\x44\xfb\x8f\xd3\x64\x71\x4a\x99\x89\x28\x8a\x3f\xe6\x25\xc9\xec\x36\x97\xa9\x90\x1b\x99\xf2\xa0\xd7\xff\xf6\x77\xf0\x57\xbd\xb0\x8b\x96\xb4\x87\xc5\xc9\x34\x03\x2b\x2e\x38\x36\x39\xfa\x39\x5e\xc8\x7d\x90\xa7\x3a\xe8\x25\x61\x2b\x62\x98\xe9\x99\x43\xb2\x4c\x81\x69\x31\xf0\x75\xae\xba\x80\x6f\xb1\x4a\x9e\x82\x30\xd4\x76\x7b\x2d\x2b\xf5\x5a\x9d\xdb\x9e\xec\x79\x79\xab\x41\x27\xc4\x0c\xb0\xe4\x35\x9c\x4a\xd5\xca\x14\x30\x21\xe5\x1c\x30\x66\x2c\x95\x27\x53\xc9\x98\x45\x7f\x36\xbb\x5c\xa3\xe5\x29\x4e\xe5\x1b\x64\x2a\x33\x6b\xd4\xf7\x5c\x43\xd9\x3a\xf1\xaa\xe5\x37\x44\x1a\xa4\x38\xe7\x6b\x55\x3e\x37\x2f\x50\x52\xd9\xe6\x67\x3d\x8a\x54\x45\xc2\x1b\x74\x7c\xb7\xf0\x08\x3f\x09\x86\xb3\x2a\x66\x18\xef\xf1\x26\x4e\xf7\x61\xb2\x35\xfa\x81\x20\xa9\xab\xff\x58\x7d\xff\x9a\x5c\x8f\x85\xa8\x64\xaa\xa4\xed\xc5\x7c\xbb\xdf\x2e\x74\x38\x53\x65\x12\x22\xb0\xe4\x0e\xb7\x6b\x5d\x39\xce\xde\xe0\x5e\xa6\x9a\x83\xb0\x80\xfc\xe3\x0d\xc8\xfe\xaf\x10\x50\x8d\x7b\xff\xf0\xfb\xe6\xfe\x70\xf3\xf0\x74\x58\x3f\xdc\x75\x5f\xf1\x57\x3f\x42\x86\x44\xc9\xd6\x39\xf4\x6f\xa1\xd6\x86\x98\x63\x16\x35\xb3\x24\x48\x24\x53\x8d\x26\x74\x42\x3d\x5d\x30\x36\x8e\x58\x53\x0c\x2d\xb6\xf5\x19\xdb\x7d\x7f\x52\x4c\x04\x1b\xe9\x72\x36\x0f\x66\x8a\x26\xf7\xc3\x32\x81\x0e\xe4\xd7\x85\x0d\xfb\xea\x9f\xe7\xaa\xdb\xd8\xdb\x73\x3d\xbf\x27\x28\x02\x27\xed\x7e\xcc\xcb\xc3\x8f\xc9\xbc\x41\xc1\xa9\x70\x76\xa2\xa7\xf1\x07\x9c\x8b\xf9\x42\x84\x26\x20\x49\x31\xdf\xdc\xbc\x85\x92\x12\xf1\xf5\xda\x31\x61\x16\x5b\xb7\xa9\xc9\xb8\x71\x71\xf0\x13\x25\xef\xb3\xd3\x1a\x81\xa4\x9c\xfb\x56\xb5\xd8\x3c\x62\xed\xec\xb7\x47\xd3\x20\x0b\x82\x94\x26\x7b\x5b\x7d\xcf\x75\xfb\xe2\xac\xd4\x17\x08\x35\x32\x0b\x42\x45\x10\x88\x83\xa3\x5a\x82\x95\x40\xb0\x91\x90\x1f\x13\xe9\xc4\x2d\x06\x79\xb9\xac\xb0\x2d\xb3\x40\x4a\x52\xc2\x7b\x68\xdf\xc7\x8f\x2a\x0b\x74\xa0\x1c\x19\xbe\xdd\x38\x5d\xb0\x4f\xce\x80\x56\x68\xe3\xb1\x2a\xaa\x12\x7d\x48\xe4\x0e\x86\x92\x53\xbf\xec\x08\xef\x0b\x59\x78\x16\x65\x81\xb0\x25\xbd\x9c\x32\xfe\xeb\xfc\x6d\x58\xf4\xb3\x38\x34\x24\x6c\x49\xa2\xab\x3b\x6c\x1f\xde\xb0\xae\xf3\x05\x9b\xe2\x61\x05\xcc\xe2\x54\x32\xed\xdb\x47\x16\x3f\x67\x61\x52\xf4\xc5\x5e\xa7\x65\xf8\x0a\x8c\xa9\x6c\x5d\xe2\xfb\x6c\x1e\x64\xb1\x09\x08\x4a\x66\xf2\x52\xdb\x6a\xdf\x4c\xb1\x43\x66\x49\x16\x87\xe4\x51\xe8\x94\xc2\x7c\xb1\xd5\x1d\x66\x90\x50\xdf\xa7\x5b\x2d\x8b\xef\x2f\x88\xc5\x4d\x5e\x42\xa9\x86\xde\x64\xc6\x30\xa5\x6a\xed\xf5\xfe\xcf\x19\x29\x45\x66\x59\xc2\x29\x9e\x20\x2d\x28\xac\x0f\x35\x52\xe3\x72\xf4\x63\x33\xc1\xa8\x10\x70\x6f\x49\xac\x0e\x33\x7c\xc1\xd0\xf9\xc5\xe6\xe7\x4f\x26\x43\x5a\x03\xf3\xa6\x39\xe3\xa7\x60\x7a\x99\x71\x11\x9a\xc1\xe8\x6c\x97\x77\xb3\x73\x41\x00\x58\x66\xc2\xe8\xc8\x85\x6b\x57\xf8\x9c\x97\xfb\xfc\x88\xfb\xdd\x6c\x10\x84\x69\x64\x46\x54\xf1\x75\xfd\x71\x6a\xab\x31\xdc\x22\x03\xe7\x68\xdc\x2d\x71\x94\x16\x4e\xd4\xd4\xfd\x20\x48\xad\x52\x9a\xaa\xf6\x2f\x35\x36\xdd\x12\x45\x79\x58\xd4\x9f\xc6\xd8\x6f\x6a\xb0\x5d\xb5\x2d\xa8\xd7\xab\xaa\x6a\xac\x23\xc6\xa9\x98\x17\xd8\x33\x19\x27\x84\x10\xbb\xca\x5b\x55\xe5\xe5\xb5\xf7\x28\x18\x29\x2c\xf8\x91\x49\x46\xe2\x2e\xbd\x6c\x84\xaf\x66\x42\xdb\x62\xdd\x0f\x53\x32\xa2\xf6\x19\x49\xe3\x5c\x9d\x3f\xfa\xbf\x2b\x15\x3a\x2c\x8b\xce\x2f\x5c\x65\xdc\x20\x6d\x38\x09\xed\xed\xf2\x63\x33\xe8\x10\xc9\x0c\x59\x40\xee\xbc\x5f\xbc\xd5\x8e\xcc\x50\x68\xcf\xbd\x7f\xac\xf3\xb7\xbc\xc0\xe7\x61\x57\x9d\xde\x33\x94\x52\xe1\xc8\x57\xf0\x82\xbd\x2b\x33\x54\xa9\xb0\xf2\x44\xf9\xb1\xb2\x13\xab\x6d\x2b\xff\x5d\x86\x1b\x2b\x34\x05\x4d\xae\xba\x75\x6d\x32\x81\x79\x10\xb1\x40\x0c\x16\x7b\x0b\x8f\x8d\x07\x8a\x53\xd4\xf7\x04\xf5\x64\xce\xb9\xc3\x21\x5a\x9e\x52\x81\xa6\x4d\xc3\xe9\x23\xe2\x91\x16\xe0\x18\x63\x45\x81\xe5\xf3\x6c\xfb\xe5\x71\x18\x92\xfe\x28\xf5\xea\xa9\x91\x30\x69\x7a\xf0\x38\x91\x04\xcd\x82\xb6\x3a\xe6\x8a\x28\x49\x87\x81\xba\x93\x8c\xec\x2f\xb9\xb7\xbf\xe4\x0e\xb8\xf3\x8b\xff\x7f\x9e\x7b\x65\x32\x57\xcf\xe1\x49\x60\x95\x92\x6d\xff\x1a\xaf\xba\x1b\x77\xe1\xec\xfd\xff\xf0\x5f\xff\x35\x11\xd3\x2e\xef\xf3\x38\xca\xd9\x00\x6d\x01\xcc\xae\xd0\xb2\xaa\xfd\xae\xc1\x59\x60\x39\xae\x5d\xec\xfa\xa5\x2a\x66\x2f\x35\x67\x71\x40\x35\xbb\xbb\xfc\x52\x69\x76\x76\x11\x69\x14\x68\xdd\x73\x47\x9e\x71\x57\x15\x53\x0c\x01\x4f\xa5\x15\x35\x27\x3b\x9b\xb8\xff\x2b\x06\x14\x5e\x1f\xa8\x42\xf0\x93\x12\x30\xcf\x34\x0f\x53\xcf\xfb\xaf\x9b\xbe\x1f\xe3\x0e\xf3\x58\x53\x90\xd3\x13\x29\x37\x63\xed\x82\xcb\xe2\x2b\xe7\xdc\x2a\x49\x37\x13\xa7\xcf\x25\xd8\xae\xe4\x5c\x68\x42\x6e\x5c\x57\x35\xe8\x6a\x32\xef\x45\x9a\xf8\xd8\x70\x6f\x55\x22\x59\xd0\x1f\xd3\x9c\x72\xd8\xef\x5f\xbe\x4f\x3f\x63\xac\x12\xf1\x40\x12\xa2\x7b\xe6\x45\xdd\xba\x01\x3c\x0b\x46\x2e\x3e\xa7\x62\x3e\xdf\x21\x88\xd3\x80\xec\xae\xfa\x12\x2c\x87\xd0\x6a\xda\x50\x5b\x2d\x62\x07\x4b\xf7\xf9\x02\x0d\xd1\xec\xc3\x24\x08\x28\x8c\xef\x9f\x08\x44\xd6\x56\x91\xb6\x4f\x62\x83\xea\x9b\xbc\x98\x38\x0e\x48\x2e\x31\x8a\x7b\x2e\x3e\xed\xad\x17\x50\x50\xae\xc0\x02\x35\xba\x70\xad\x7b\xba\xfb\xdc\x2d\xb1\x2e\xd8\xe1\x3a\x08\xe5\x3c\x55\xd9\x57\xdf\x06\x3a\xe7\x2f\x66\x97\x0e\xb5\x75\xed\x05\x1b\x53\xfc\xa4\x7d\xc7\x75\x6c\x5b\xdd\x96\x23\x77\x51\x14\xe7\x18\x18\x62\x74\xdc\x1d\xd5\x2f\x23\x7f\x8e\x4c\x06\xa1\xbb\xa5\x5f\xb0\xbd\x85\xa6\x1d\xc1\x20\x38\x1a\x49\x55\xdf\x6f\x5b\x3a\xc5\x6f\x93\x2f\x32\xa1\x20\xbd\x6d\x1b\xed\xa0\xb6\xe8\x95\x59\xbd\x94\x9b\x58\x51\x2f\xcd\x13\xef\xaf\xea\x0a\xb4\x22\x05\xae\x5d\x3e\x0f\x08\xa7\x28\xf3\x69\x7a\xc9\x0d\x4a\x2a\x45\xf5\x1a\x9d\x52\x04\x69\x10\xa9\x11\x43\xc1\x21\x4f\xf6\x15\x61\xf5\x7e\x56\xb1\x11\x01\xd8\x60\xce\xd9\xef\x41\x5f\x62\xf7\xc7\x0d\x27\x00\xc5\x11\xde\x09\x08\xb6\xaf\xaa\xe1\x60\x18\x06\x34\x3b\xed\x0c\x7c\x28\x8b\x8f\xde\x8e\x74\xf8\x86\x30\x64\x04\x2a\xa2\x88\x6f\xa5\xf5\x0e\x4a\xc2\x59\x2c\x5f\x4f\xa8\x32\x92\x20\xfd\xf7\x19\xcf\x38\x69\x3d\x88\x28\xb4\x34\x2a\xd0\x3e\x45\xf5\x56\x67\x63\x42\xd9\xac\xda\x2e\xa2\x34\xa3\xbc\xf5\xa6\x86\x52\xf5\xa7\x12\x86\x54\x42\x6d\xf5\x64\x55\xb7\xb9\x2a\xe6\xb6\x83\x43\x4c\x26\x22\x63\x8d\x0e\x41\xeb\x7b\xfc\xe1\x35\x64\x67\x8f\x58\x24\x3c\xa6\xb7\xf9\x77\x0f\xac\xff\x6d\x74\xc0\xa6\x48\x65\x60\xd5\x4a\xc7\xb1\x90\x60\x92\x71\xb7\xe2\x91\xbc\x34\x41\xd0\xfc\xc1\x34\x0c\x8d\xc3\xc8\x5b\x98\x06\xc8\x02\x57\xb3\xa5\x5f\xa4\x4a\x25\x6a\xe8\xf6\xe9\x91\x1e\xbf\x14\xa9\x4e\x6c\x1b\x57\x6b\xdb\xa5\x77\x5d\xa4\xde\x9a\x62\xde\xa1\x10\xa9\xd6\x24\x32\x86\x50\x17\x1f\xb4\x66\x75\x6f\x44\x7f\xc2\x2e\xec\x52\x03\x26\xe6\x73\x05\xb8\xbf\x59\xed\xf0\xa7\xd5\x4c\xe8\x11\x43\xd4\x97\x36\xfd\x61\x0c\x85\x2d\x98\xbe\x55\xaf\x0e\xbc\x45\x9e\xbd\xa3\x15\x48\xf0\x84\x71\xd7\xc0\xec\xa2\x03\x1e\x0c\xc0\x12\xc1\x85\xbd\xcf\xdf\xef\x7e\x8d\x57\x14\x82\xa7\x34\xb5\xbb\x44\xe3\x0e\xd5\x0b\x94\x79\x73\xfc\x99\x1b\x51\xf7\x11\x41\x3b\xcd\x13\xfe\xfb\x9c\xd7\xa4\x7a\x5c\xcd\x5b\x8b\x42\x68\xa4\x25\x72\xf3\x7e\xaa\x11\xfc\x4e\x20\x04\x26\xdc\x0c\x46\xb1\x77\x58\x3f\xe3\x8c\xa1\x24\x05\x30\x45\x51\xe9\x6a\xb3\x6b\xc7\xf3\x0b\x32\xae\x8d\x07\xd6\x3c\x98\xc9\xc2\x2e\x80\x87\xc4\x93\x2d\xcf\xc7\x07\x43\x69\x47\xb3\x2d\xef\xf2\xf2\xdc\xf7\x34\x05\x88\x30\x1e\xf3\xfb\xf5\xe6\x6d\x38\xd6\xe5\xf7\x03\x64\x71\x67\x01\xdf\x2d\x3a\x77\xb5\x7e\x98\x09\xd3\xb4\x37\x09\x5f\x5f\xcf\x59\x73\x52\x48\x9e\xc6\xa4\x96\x8b\x3a\x97\x79\x7b\x51\xf0\x16\x2a\xcc\xa8\xb2\x62\x01\x29\x77\x50\x3f\xe7\xe5\x1a\x8a\xe2\xa1\xbc\xc2\x17\x28\xcc\x83\x79\x42\x45\x1e\xe7\x17\xa9\xe2\x78\x13\x17\x2a\xb2\xa8\x13\xa7\xff\x4f\xc5\x93\xdd\x99\x9c\xf1\xbf\x56\x95\xc7\x62\x0a\xa5\x63\x6a\x75\x4f\x84\x82\x79\xe0\x8e\x6a\x2e\xed\x9e\x99\xd7\x64\x95\xd1\x73\x65\x7e\xeb\x07\x20\xc1\x67\xf6\x2f\x50\xbe\x9a\x73\x51\x0e\x7d\x54\xa1\xa5\xf6\x65\xcf\xed\x75\xff\x47\x34\x04\x99\x7f\xb1\xc0\x2d\xd7\x80\x1d\xe3\xc8\x84\x41\x8b\x93\xcb\x8f\xa7\xaa\xf6\x61\xd2\x45\x77\xc6\x4f\x07\x08\x02\xee\x8a\x2c\xea\xa7\x21\x15\x04\xa1\xcd\xe6\xf3\xe3\xa9\x70\xa1\xe3\x83\xf9\x5e\xd5\xaf\xa7\x2a\x2f\xdb\x7f\x76\x2b\xed\x6f\x7e\x28\x86\x5c\x8c\x39\x99\x4e\x6b\xc9\x1d\x0e\x83\x90\xfa\x6d\x1a\x9b\x13\xfc\x28\xbf\x14\xa0\xf3\x2e\x83\x5a\x95\x7a\xf5\xa3\xfb\x61\x17\xdc\x4b\x09\x61\x1c\x53\x75\xfe\xcb\x1f\x8f\x9b\xc3\x78\x5d\x84\x30\x06\xca\xde\x0e\x44\xea\xd9\xe7\x03\x1d\x04\xc2\x14\x68\x93\x23\xc7\x9a\x7d\xd5\x8b\xee\x4d\x7f\x58\x14\x45\x68\xed\x9b\x7b\xde\x13\x3d\xee\x0d\x75\xb8\xfc\xcb\x05\x51\x6c\xc1\x9f\x5d\xf8\xeb\x1c\x11\x2c\x50\x29\xe2\xbf\x90\x3d\x93\x10\xeb\x80\x54\x66\x7e\x50\xf1\x74\xbe\xf0\x42\x92\x82\xe8\xde\x2e\x6c\xc1\xa3\xf4\xb1\x19\x29\x93\x4b\x48\x32\xed\x2d\x5b\xbe\xd4\x70\xc2\x66\x5f\x5d\x9d\xf3\x42\x7f\xcf\x4b\xac\x7d\xc6\x08\x69\xc8\xc2\xc4\xbf\xc2\xfb\xa4\xff\x33\xb7\x48\xfa\x4d\x2b\xd5\x28\x47\x84\x2c\x88\x29\x77\xbc\xa9\xf1\xc3\x02\x2c\x9c\xcb\x87\x3f\x0e\x3a\xd0\x03\x20\xed\x06\xf1\x8f\x7e\x1d\x04\xce\x03\x7a\x13\xaf\x57\x4f\xbf\xdf\x3f\x5c\x6f\x0e\x37\x9b\xcd\xee\x70\xff\xed\x6e\xf3\xb4\xda\x3f\x3c\x0d\xc3\xb2\xb4\x97\x35\xe9\xee\xe7\x57\x28\xde\xf2\xf2\x79\xae\xdd\x27\x81\x8b\x50\xf0\x29\x19\x1e\x4e\xa0\x06\x60\x2b\x70\x6d\x48\x05\xd3\x31\x66\x46\xbd\x54\x10\x29\xb3\x74\x0e\xeb\xc8\x62\x0b\x86\xcb\xfd\x04\x00\x66\x88\xc0\x58\x93\xde\xcf\xf5\xee\x40\x3e\x38\x4d\x93\x57\xe5\xe3\x59\xfe\x8e\x1f\x83\xe5\x8c\x04\x10\x82\x12\x89\x1e\x0c\xe4\xfe\x2e\x21\xa1\xea\x58\x2f\x1a\xdd\x1f\x90\x96\x1c\x72\x68\xeb\x0f\x8b\x38\x58\x4c\xb1\x41\xa2\x88\xf5\x44\xff\xfa\xaa\xb2\xd4\xb2\xfe\x4c\x26\xa3\x64\xe1\x0b\xb6\xbb\xf3\xf1\x68\x81\xff\xb3\x99\xa3\x8c\x35\x40\xa5\x60\x1a\x6a\xed\xa2\xe4\x8b\xa8\x1b\x74\x9c\xd8\xe7\x40\x37\xa8\xfd\x44\x06\x79\x34\x1e\x8c\xe8\x13\xb0\xc9\x02\x03\x1a\xad\x94\x48\x8b\x70\x74\x61\xea\x3d\x79\xe6\xf8\x01\xa8\x05\x55\x2b\xf1\x1d\xd5\xb9\x45\x42\x05\xce\xd9\xfa\xe3\x1c\xeb\x1f\x17\x3d\x90\xc5\x7f\xf1\xff\x19\x0d\x4d\xff\xe7\xe2\x0c\x3f\x13\x60\x95\x60\x42\x8d\x2e\x83\xb3\xf1\xcb\xa2\xd2\x9a\x1f\xcc\x38\xb5\x2c\x7f\x1d\x94\x4c\x1f\xaa\x11\x09\x45\xf1\xdd\x5c\x29\x1c\x20\x77\xa2\xbc\x21\xc1\x80\x95\xa7\xc2\x63\xde\x5a\x21\x96\xb9\x81\xcf\xe4\x94\x32\x08\xd2\xc0\xd1\x28\xbe\x95\x44\xda\xd0\x53\x63\x38\x37\x2e\x64\x21\xd5\x0b\xd7\xeb\xed\x08\xac\x2f\x43\x88\x69\x57\xde\x61\xfb\xb5\x6a\xbb\x38\x6d\x0a\x25\x97\x51\x98\x86\x03\x55\xd1\xc1\x45\xfe\xb8\x60\x1f\x4b\x19\xb1\x44\x23\xad\xda\x6f\x58\x54\x27\xac\x7b\xeb\xa6\xc3\x66\xff\xd5\x7f\x5f\xc4\xad\x98\xfa\x35\xfe\x67\xbc\x4a\xcb\x48\x18\x0a\x6b\xf7\x79\xf9\x61\xb5\xe7\xba\xc8\x06\x5a\x2f\x3e\xd9\xbd\x36\x01\xed\x85\xf8\xff\x73\xf6\x25\xdd\x8d\xe3\x58\xd6\xff\xa5\x57\xb9\xa8\x05\xc0\x99\xdf\x4e\x93\x1d\xaa\xf4\x54\x96\x1c\x91\x59\x7d\xfa\xe8\x60\x78\x90\x58\xa6\x08\x15\x49\xd9\xa1\xfa\xf5\xdf\xe1\x03\xc0\x49\x94\x33\xba\x17\x5d\x19\x6d\x80\x14\x09\x62\x78\xc3\x7d\xf7\xca\x0c\xd9\xd9\x86\x8f\x19\x50\x13\x73\x65\x52\xbe\xea\xdc\x12\xc4\x38\x1e\xe8\xa6\x59\x61\xc4\x66\x67\x29\xf6\x8f\xe8\x13\x35\x3b\xba\xbb\x7d\xe0\xfb\x69\xdc\x96\x8e\x7c\xb0\x0a\x13\x86\xa7\x41\x5c\x80\x07\x51\x84\x3b\xe2\x72\x33\x32\xee\x86\x63\x1d\x28\x40\x9e\x9b\x47\xcc\xef\xbc\x66\xfb\x57\x28\x6a\x96\x57\x83\x37\x0e\xbd\x00\x75\xe5\x5e\xd8\xe9\x52\x9e\x51\x9c\x00\x45\x9b\xe9\x74\x9a\x9c\x87\x89\x44\xb4\xca\x15\xe1\xea\xf8\xbf\x83\x71\x09\x13\x85\xc0\x4f\xb3\xae\x1f\xb2\xe2\x7d\x18\xcb\xe2\x51\x92\xa2\x6e\xd2\x89\x5d\x5e\x41\xc2\xf1\x54\x5f\x95\xc5\xf2\x28\x65\xb4\x65\xe5\xfc\xd0\x99\x80\x6a\x7e\x19\xf2\x23\xfe\x6d\x22\x3b\xc5\x63\x42\x1c\x18\x7a\x71\xd0\x15\x14\x66\x1f\x98\xbe\xa8\xfb\xb9\xd8\xa3\x46\xfb\xcb\x26\x76\xdc\x88\xa1\x9e\x94\x2d\xc6\xcc\x8a\xfa\xb7\xc9\x8b\x13\x91\x62\x0e\x77\x77\x05\xcc\xed\x5c\x2d\x9e\x02\x41\x2c\x5b\x73\xda\xe1\x22\x93\x33\xf9\x91\x55\x4e\x6a\xb2\xe9\x00\xe8\x10\xfd\xf9\xf6\xf4\xc7\xfa\xc9\xfb\x35\x49\x14\xce\x59\x12\x63\xb8\x00\x59\x30\xeb\xac\x2d\xfa\xe2\x4c\x1a\x4a\x6c\xad\x79\xf6\x6f\xad\x47\x6b\x93\x07\x51\x6a\xf3\xce\x4f\x7a\x18\x3b\x72\x3d\x54\x10\x5a\xc4\x16\x56\x42\x93\xc7\xac\x18\x16\xa9\x73\x2e\xc2\x80\x77\x3c\x58\xb8\x7d\x99\xed\xfe\x07\xcb\xd0\xb4\xbc\xda\xf5\xb9\x08\x25\x72\x6e\xe5\xf0\xb1\xd5\x6d\xe6\x8f\x8b\x84\xa1\x41\x80\x3b\xb8\xd6\xf9\x9d\x2e\xef\x4a\xfd\x1f\x28\x06\xd6\x29\x17\xdc\xc3\x15\xf9\xb0\xba\x9f\x3d\xec\x56\x7f\xbc\xac\x9e\x36\xab\xcd\x6e\xb6\x5c\xbe\xb6\xe0\x61\x2e\x85\x87\x29\xb5\xbe\xad\xd7\x56\x72\x72\xf0\x89\x11\x83\x6d\xdc\x3f\x6f\x09\x4c\xf6\xaa\x4f\x39\x28\x2f\xb0\x54\x02\x4b\x96\xfd\xc8\xea\xc3\x55\x59\x34\x57\xb1\xe7\x75\xfb\x93\x71\x3d\xa6\x77\x6d\xae\xd2\xc0\xa1\x06\x6b\x5d\x64\xe7\xe1\x7a\x54\xca\x28\x1d\x3e\x7f\xa2\x5d\xe7\x82\x8a\x82\x8a\x14\x81\xde\xd6\x69\xba\xd3\xa5\xc1\x4d\x0c\x9f\x43\x78\x34\x26\x23\x4a\x48\x2f\x74\xf7\xf0\x58\xe0\xd2\xfa\x16\xa0\xba\x5d\x74\x6d\x3c\x0e\x91\x02\xc5\x28\x89\xb9\x52\xa7\xc1\x04\x10\xbe\x1f\xc7\x46\x95\xa5\x3a\xe7\xf5\x15\x61\x40\x1b\xd2\x69\xe7\xb8\xf0\x13\x81\x38\x26\x13\x7d\x78\x82\xcf\x45\x9e\x39\x78\x89\xf0\x79\x4b\x60\x69\xc2\x1b\x37\x92\xb2\x22\x20\xc6\xa1\xe0\xcd\x56\xfc\xa3\xcc\x26\xa0\x36\xfd\x15\x20\x82\xd0\xb8\xc6\xbb\xd2\xf8\xa7\xaf\x50\xc0\x67\x33\x9e\x2f\x06\x37\x37\x1a\xb5\x20\x34\x0c\x47\xf3\xd9\xd3\xef\xcf\x6b\x17\x6a\x12\x41\xc2\xd0\xb2\x3c\x36\xe6\x2b\x8a\x2d\x0d\x52\xdb\x22\x10\x1c\x77\xb5\x36\x04\xa8\x4b\x44\x0a\x4c\x7a\x26\x22\xa2\x1e\x9e\x39\x46\x97\x60\xbc\x8c\xc7\x43\x38\xe1\xa7\x8b\xc8\x97\xc8\xbe\x81\xb8\xac\xf5\xd3\x3d\x02\xe4\xdd\xc3\x44\x11\x20\x51\xaf\x84\x8f\x9d\x1a\x7b\xa4\x22\x62\x4a\x61\x35\x3a\x1a\x15\xf7\x86\xc7\xff\x5b\x56\xd5\xfa\x56\x09\x87\x88\x94\x51\x7c\x97\x59\xc5\xd1\x15\xb5\x7f\x4f\xd2\x58\x05\x3d\x91\xed\xa2\x86\x72\x7e\x31\x67\xf1\xf0\xab\x25\xdc\x44\x6a\x98\x94\x73\x7d\xe4\x36\xfd\x3c\xd8\xa2\xfb\x1b\xb5\x48\x44\x6c\x78\x9f\x50\x4a\x18\xa9\xf1\xdd\x8f\xa6\x3e\x43\xd0\x1d\x26\x52\x82\xd1\xcb\xa5\x90\x60\xa5\xab\x82\x5a\x1c\x8c\x1d\x77\xa7\xcb\x17\x76\x19\x6f\x60\x82\xc5\x26\xb8\xa5\xc0\x59\xdf\xee\x07\x98\x32\x32\xc6\xa7\xc6\x4a\xb6\x75\xfd\xb7\x18\x48\xb8\xe0\xb1\x12\xd0\x0b\xdf\x58\x77\xa8\x31\xc9\xb3\xe2\x8a\x29\xca\x5d\x94\xa6\xbe\xe5\x39\xce\x5c\xa6\x69\xf8\x78\x82\x52\x4c\x7b\xe4\xac\xaa\xed\x12\x73\x2d\x09\x43\x58\xf5\x83\xde\xaf\xce\xa5\xee\x22\xc6\xa6\x0e\xf0\x1a\x96\xe5\xae\xe3\x04\x19\x0d\x8e\x5a\x66\xea\xf2\xc8\x7e\x3a\x6f\xc3\xad\xb3\x51\x77\x21\x11\x3b\xc0\xf6\x60\x58\x49\x5d\xf5\xae\x90\x44\xba\x80\xd5\x13\x7c\xae\x0a\x39\xc5\x6d\x38\xfa\x71\x19\xa7\x18\x57\x82\x7f\x9f\xbb\x42\x8d\xe9\x05\x2b\x9b\xff\xc3\xf2\x8b\xfb\xbb\xbf\xbb\xdf\x04\xe2\x63\x74\xe3\x77\x5d\x02\x7b\x05\x33\x77\x3f\xaa\x7b\x28\x8f\xac\x68\x57\xa1\x22\x3e\x82\x82\x2b\xa6\x7a\x40\xcf\xbb\x52\x1f\xa7\x29\x7d\xb9\x50\xd4\xb0\x7e\x3a\x52\xda\x79\x57\xb6\x2a\x49\xc8\xf0\x41\xac\x8b\xf6\x9e\xa3\x5c\xd3\x34\xb2\xc9\x5d\x12\x09\x9f\xb7\x0b\xc2\x56\xdc\x19\xcb\x9e\xda\x2e\x94\x00\x46\x49\x14\xcb\xf2\x0d\x53\x30\x93\xf2\xc7\x01\x8a\x7b\xfc\x91\x72\x7b\x60\xc5\xba\xa8\x1f\x99\x2b\x32\x94\x94\x9a\xb2\x9e\xfb\x3f\x16\x1b\x28\xea\xad\xee\x6c\x57\x49\x93\x84\x59\xfb\xe3\xf7\x0b\x87\xf2\x09\xea\x4f\x5d\xbe\x4f\xbb\x91\x92\xb2\x24\x6d\x65\xac\x71\xda\x7c\xeb\x71\x18\x73\xe9\x79\x21\x98\xe4\x34\x9e\x88\x63\x08\xa1\xf4\x7c\x83\x99\xb2\x64\xc4\xf3\xcb\x57\x72\x23\x5c\x7a\x4c\xa2\x12\xb1\xd0\xf9\xf9\xd8\x9e\xd1\xd2\x13\x22\x54\x1d\x01\x39\xf2\xce\xc9\xb6\x11\x04\x37\x6a\xed\xcf\x85\x23\xb7\x98\x5f\xc6\xe9\x78\x19\xf8\x31\xc2\x09\xb8\x99\xb9\xcf\x6a\xc1\xf2\x7c\xf4\xb6\x41\x10\x3a\x55\x77\x24\x16\x5b\x42\xcd\xc4\xc1\xaa\x2a\x65\x3c\x87\x6a\x1c\x68\x94\x41\x1a\xe1\xca\x3a\xb2\x77\x28\x97\xb3\x67\xf7\x54\x21\x25\x44\x5e\xc9\x54\x98\x73\x73\xf4\xab\xa1\xf2\x31\xf7\x75\xd2\x7a\x40\xb4\x20\x23\x4e\x88\x71\xd0\x2e\xa7\x5a\x6f\xd8\x9e\x21\x61\xe2\x27\x3b\x3d\x42\x29\xce\x3d\xf7\xe8\x6b\xf6\x12\x19\x09\xee\x1b\x32\xcb\xb2\x32\x89\xb5\x57\x96\xf5\x86\x30\x52\x2a\x01\x47\xbb\x5c\x9b\xbd\x78\x80\xec\xb7\xfd\x62\xc2\x98\x33\x0f\xb4\xce\x87\x60\x35\x19\x07\x10\x7a\x8e\x12\xa4\x32\x7c\x9f\x77\x00\x12\xef\xd7\x7e\xcb\x38\x8d\xd0\x6a\x65\x52\xce\x8c\x4c\xce\xd7\x53\x22\x56\x89\xf1\xc8\xf4\xea\x78\x0b\x20\x20\x93\xd0\x8f\x95\xfd\x0a\x9b\xa3\x7e\x87\xcb\x51\x17\xfd\x4c\x51\xe2\x3a\xa6\xe0\xa8\xec\xd7\x8b\x67\xd4\xbb\x3e\xf7\xb4\x6c\xb9\x4c\xa4\x89\x4c\xf3\xf3\x65\x7b\x28\x9b\xb3\x76\x40\x13\x63\x7b\xa5\x7e\xc4\xb8\x05\x81\xec\xff\x72\xa1\x4f\x91\x21\xc8\x34\x4c\x9c\xcc\xb7\x8d\x04\xa1\xd9\x87\x83\x35\x2b\x24\x12\xaa\xe2\x08\x5e\xb3\x24\x72\xc9\xfc\x50\x1a\xf2\xc7\x47\x96\x61\x51\x67\xff\x43\xb0\x38\x71\x58\xb1\x59\x5e\x1b\x47\xb4\x1d\x7f\x1e\x02\x4b\x2c\x3f\xf5\x65\xae\xcb\xb2\xc3\x39\x8e\x9e\x90\x43\x84\x50\x0a\xdc\x07\x97\x25\xb0\x4e\x0a\x85\x4b\xae\x02\x44\x60\x59\xd1\xcf\xea\x4a\x78\x7c\x74\x33\x11\x4a\x3c\x81\xbf\x9d\x8f\xac\xc8\xfe\x3d\x71\x7c\x49\x49\x04\x02\x16\x8e\x13\xf1\xec\x71\x16\x7a\x74\x77\x49\xa9\xdb\xd4\x9e\x4f\x50\x4c\xfa\x09\x52\xd2\x54\xda\xe0\xc8\x22\xab\x2f\x37\x76\x3c\xe9\x05\xbe\x49\x23\x1b\x82\x47\xdc\x63\x7f\x4d\x5c\xf7\xfa\xad\x25\xf8\xd2\x7a\x3c\xab\xfa\xb0\xb5\x07\x6f\x29\x5b\x9e\x37\xdb\x0f\x7c\xdf\xf0\xa6\x65\xfb\x43\xed\x45\xa3\x07\x07\x19\x29\xcb\xf0\x36\x7b\xda\xde\x5a\xf3\xb6\xb3\x4a\xc3\xc8\xee\x61\xa8\x4e\x45\xa3\x41\x8c\x41\xaa\x94\x9b\x7d\x10\xf1\x68\x2f\xa5\xde\x33\xc7\xff\x04\x24\x49\x98\xd3\x03\x2e\x44\xc6\xf2\x67\xa5\x32\xd1\x51\x0a\xdb\x6e\x54\x86\xb8\x0d\x7c\xcf\xe0\xf3\x95\x7d\x3a\x53\x68\xf0\xd0\xe0\x05\x0c\x43\x7f\xc7\x73\x3e\xbf\xdc\x95\xec\x4b\x70\xaf\xbb\x86\x51\x4c\x44\xdf\x81\xc1\xae\x77\x7f\x36\xd2\xb8\x35\xab\xc1\x54\xea\x20\x98\x66\x14\x3e\x07\xdf\xa3\xa9\x3b\xca\x1f\xbb\xa8\x08\xf8\x92\xa0\x7c\x44\xae\xf7\xbf\x56\xce\x09\xbe\x54\x92\xba\x0d\x11\x33\x77\xd7\x58\x7a\x08\xa8\x1f\x59\xec\xd6\x53\x26\xde\x8b\xae\xb0\x0f\x82\xd4\xf7\xba\x54\xf1\x8b\xae\x6a\xae\x2f\x96\x5b\xfb\x4e\x97\x1b\x7d\x04\x5d\x5c\xdb\x3f\x83\x6a\x7b\x08\x2d\x01\xdb\x75\xd1\xd0\xd7\xb3\x0e\xa2\x10\x50\xcc\x69\x67\xad\x90\x8c\x1d\x75\x71\x55\x8e\x30\x0c\x8c\x4e\xfd\xc7\xdd\x4e\x84\xc8\x2a\x61\x10\x6f\x2d\x25\xc9\x78\xf4\x1b\x07\xc2\x01\xcc\x3a\x66\xfd\xdb\xda\x6c\xf6\xb2\x98\x10\x97\x86\x7c\xb1\xa0\x54\x17\x96\x73\x29\x87\xc4\x75\x0d\x23\x9c\xba\xa6\xa4\x05\x91\x3b\xe9\x6f\x6d\x5b\x62\xd0\x4e\x26\xd9\x76\xd7\x9c\x74\xab\xc2\xd0\x58\xbb\x2e\xdc\x64\xd7\x4b\x60\xf2\x07\xe4\x8a\x95\x30\x12\x4b\x77\x1d\x45\x0b\x7d\xcc\xaa\xc3\x77\x7d\x45\x8e\xd7\x74\x11\x98\xdd\x79\x78\x5e\xfc\xbe\x5b\x3d\x2d\xdb\xdf\x50\x94\xf5\x8c\xb9\xc9\x8d\x15\x62\x15\xa1\x79\x06\x45\x75\x2e\x01\x4f\xc1\x41\x4a\x6a\xfa\xaa\x84\x50\x44\xd0\x22\x21\xd3\x0f\xc8\xcc\x11\x6e\x04\x12\x5f\xf0\x38\x73\x0f\x91\xc6\x14\xcb\x2e\x66\xde\x6c\x5c\x9d\x0f\xa9\x0a\x51\xa3\x54\x37\xa7\x42\xf6\x1f\xd8\xed\x2d\x33\xf7\x24\xd0\x16\x18\x49\x90\xd3\xa1\x68\x33\x36\xee\x46\x2c\x91\x71\x87\x6e\xcb\x8a\xbd\xa9\x83\x1c\x0d\x25\x0f\x15\x32\xd4\x1c\x58\xf5\x8f\x73\x26\xde\xe7\xe7\x0b\xa2\x90\xfa\x41\x0b\xe0\x3c\x46\x1b\x6a\xa7\xb2\xdc\x94\xd7\xdf\x04\xed\xff\xda\x02\xe0\x3c\x56\x86\x99\xa4\xf1\x04\xab\x11\x30\x1e\x04\x61\x68\x57\xcd\x1f\xbe\xff\xee\xfe\x26\x53\xa3\xdd\x62\xd0\xb2\x6f\xa7\x69\x02\x3a\x90\xc0\xb8\xe3\xb8\xd8\x19\x16\xfb\xe1\x4f\x43\x1a\xc5\xbd\x84\xbf\xcd\x67\xd8\x46\x05\xb1\x41\x90\x30\x7b\xae\x5c\x91\x3f\x73\x45\x7c\xc0\xe8\x2c\x14\x72\xd7\xa3\x06\x73\xad\x51\x84\xb5\xce\x3b\x7e\x2e\x8b\x3b\x5d\xba\xbd\x77\x72\xca\x28\x22\x42\xe4\xa1\xfe\x70\xd0\x44\xf7\xf5\x14\x8d\xdb\x3c\xd4\xe6\x90\x9d\x6c\x5c\x63\xc5\xca\xe6\x4b\xce\x2f\x46\x63\xa4\x6f\x72\x28\x9a\x26\x18\xa2\x37\x7b\x8a\x2d\x66\xf9\xe5\x63\x11\x4b\xcd\x06\x53\x43\x79\x51\x8c\x18\x83\xac\x86\xae\x3a\xa2\xe3\x60\x76\xbd\x78\xc8\xd3\x2e\xd5\x5d\x8f\x80\xaa\xca\x03\x62\xf1\xf6\xab\xdc\xf8\xdc\x03\x4a\x1c\xe5\x7b\x11\xc1\x09\x98\xed\x0f\x50\xd5\x2b\x99\x35\x7d\x06\xa9\x1c\x15\x84\x3e\x66\x87\xed\xde\x61\xd9\x8a\x5c\x98\x49\x85\x9e\x0a\x4d\x91\x8a\x84\x13\x14\x12\x8a\xba\xb1\xce\xa0\xfc\xbb\xce\xa6\x74\xf7\x87\xaf\x19\x46\x46\xd2\x1f\xf5\x16\x59\x59\x5f\x39\xbe\x8e\xdc\x47\x45\x81\x8f\xe1\x2c\x97\x71\x58\x17\x0e\x01\x35\xf2\x65\x54\x1c\x98\x54\xea\x29\xab\xef\xc0\x2d\x6d\x15\x07\x02\xb7\xc7\x1d\x42\x98\xbf\x62\x04\x53\x71\x20\xd1\xa1\xe2\xe7\xf2\x32\xbe\x37\x27\x51\xcb\x7e\xb9\x39\x9f\x9a\xd3\xff\x98\x15\xd5\x23\x3b\x9d\x3a\xfb\x4f\xc5\x5c\xc9\x64\x48\x74\x36\x08\xc9\xab\x58\x25\xbe\xab\x73\xb4\x07\x41\x17\xd7\x6b\x6c\x7a\xe4\xc9\xd8\x96\x5a\x30\xf3\x0b\xc3\x9d\x43\x25\x8a\x23\xfa\x63\xbe\x98\x7f\x85\x3e\x51\x3c\x4c\x52\xb3\xe3\x7e\x00\xcb\xe7\x70\xc3\x45\x50\x3c\x09\xb0\xd6\xd8\xc9\x24\x94\x20\x5f\x4a\x50\xd9\xcf\xf1\xb9\x38\x7c\x0c\xe1\x4b\x2c\xba\x7d\x5c\x3f\xed\xde\x5e\xb0\x98\x71\xf8\x9e\x22\x4d\x9d\xe9\xd9\x13\x30\x1e\x0d\xaa\xe0\x91\xe1\xd7\x32\x64\x54\x1c\xa6\x51\x95\x4d\x3f\x95\xb8\x38\x33\x52\x33\x4d\x4f\x2a\x21\x62\x1c\x7d\x28\x64\x27\x52\x32\x91\xb1\x1b\xa4\x18\x7b\xc3\x2f\x84\x42\x87\xf0\x75\xf5\xfb\xf6\x9a\xb5\x76\x7a\xce\xc8\x50\xa4\x4e\xf4\xb5\xa8\xcb\xcb\xba\x58\xb2\xcb\x5f\x64\x41\x94\x14\xc2\x91\x13\xcf\xb5\xce\x3b\x42\xbd\xee\x59\xa4\x24\x51\xd2\xa9\x83\x5a\xbb\x7b\x2d\x47\xa7\xb2\x92\x8a\x43\xe4\x28\x38\x0b\x47\x4a\xf8\x02\xe5\x92\x8d\xe7\x30\x58\x3d\xa2\xe6\x6c\x62\x59\xf1\xa0\x45\xc7\x07\xdc\xca\xc1\xb8\xbe\x7e\xc8\x3a\x98\xee\x7b\x56\xec\xa7\x72\xd0\x0a\x02\xc2\x92\x4e\x29\xe7\x31\x1b\x63\x8a\x15\x30\x1f\x4b\x46\xd6\x25\x7b\x69\x29\xc6\x14\x70\x85\x4e\x87\xca\x54\x7d\xf8\x01\xf0\x6e\x40\x98\x3d\x37\x5f\x29\x42\x91\xdc\x99\x97\xba\xc3\x25\x28\xe5\x2b\xcc\xc2\xc0\x47\xb3\xdf\xb0\x1c\x56\x6d\xd2\x5c\x29\x91\xe2\x39\x22\xe1\x46\x28\x50\x29\x50\xaa\x33\x40\x7f\x2d\x4c\xa0\x94\x62\x18\xd8\x52\xcd\x94\x82\xd2\x64\x16\xaa\xa5\x0d\xe0\xda\x5f\x17\x84\xd0\x18\x69\x42\xef\x75\x2e\x33\xd1\xfe\x55\xf8\xe0\x12\xe6\x36\xbe\x67\x38\x14\x6d\x3b\xf5\x23\x74\xd1\x4d\x30\xe3\x43\xff\x84\xbc\x1a\x91\x0b\xf5\x17\xb6\x20\x34\x62\xbe\x21\xdc\xe2\x60\x27\x0e\xf5\x5c\x1b\x4f\xfc\xd6\xc3\xcd\xfb\x40\x15\xf7\x3d\x04\xf1\x42\xa2\x0c\x8a\xaa\xd9\xeb\x47\x70\x14\x41\xbc\x24\x06\xac\x4e\x29\xcb\x72\x14\xd5\x11\xc4\x13\x26\x1f\xdd\x6c\x16\x0a\xca\x5b\xb5\xa5\x82\xf8\xca\x48\xdb\xbb\x18\xfe\xae\xea\x81\x80\x04\x09\x42\x86\x2e\x74\xa5\x73\xb9\xd1\xe7\xfc\x4e\x0f\x0d\x24\x41\x82\x34\x72\xc7\xc3\xba\x86\x89\x82\x6a\x41\x02\x15\x1a\x14\xc6\xe9\xd4\x53\xc3\xb1\x8d\x21\x98\xb7\xdc\x43\x3d\x3f\x97\x85\x15\xfb\x7b\xcb\x8a\xba\x2f\xf5\x37\x18\xd8\x10\x68\x68\x82\x25\xc5\x99\xe5\xf9\xa5\x99\xcb\xd3\xa7\xc5\xe8\x65\xa3\x88\x18\xd1\x0b\x77\x8e\xb9\xa2\x09\xd7\x0e\xa6\xf2\x7b\x03\xf5\xf9\x74\x13\x55\xd0\x76\xe6\xa6\x16\x7c\xb9\xfe\xde\xb3\x06\x05\x49\x88\x61\xf1\xd8\x43\xbd\x04\x5e\x62\x64\xb1\x19\xd2\xbe\xe7\x9f\xb8\xbe\x01\x91\x66\xf3\xaf\xce\x79\x5d\x39\x62\x07\xd9\x21\x92\x05\x49\x13\x81\x98\x08\x26\xe5\xac\x28\x7e\x1b\x0c\x05\x23\x01\xee\xee\x55\xb6\x2f\xda\x32\xe8\x99\x34\x38\xfd\x7e\x61\x82\xeb\x1f\x7b\x48\x79\x87\x72\x43\x55\xed\x7e\x82\xf1\x20\x8e\x06\x3c\x2e\xb7\x64\x82\xc6\x06\x8e\x20\x9c\x1a\x33\xe8\x11\x32\xce\x8a\xfd\x4c\x88\xf3\x11\x61\x74\xba\x68\x9e\x07\x44\x66\xfe\x6d\xa0\x39\x7d\x1f\xfa\x56\x06\x57\x10\xce\x52\x6e\xd3\xe1\x6f\x9b\xe5\x62\xab\x5f\x4a\xfd\x91\x7d\x61\x57\xdb\xeb\x04\x25\x88\xa3\x60\xbb\x13\xcb\xd9\x47\xc9\xcc\xa0\x87\xae\x39\x34\x7e\x78\xdf\x4e\xea\x84\x43\x05\x11\xcd\xf0\x18\x04\xbe\xb6\x95\x15\xdb\x32\xdb\xef\xd1\x75\xb5\x7d\x24\x8f\x30\x11\xf0\x60\xb9\x74\xdd\x97\x54\xbe\x61\xdb\x7d\xd0\xfb\xb1\xe9\x3d\xfd\xac\x2a\x35\x4e\xbd\x21\xe9\x74\x93\xcd\xc8\xc8\x8e\x7a\x4a\x86\x65\xec\xc3\xba\xc4\xc1\x88\x51\x4a\x24\xba\x7c\x5b\xf6\xee\x26\x0e\xf5\x7c\xc3\x13\x8f\x75\x94\x2f\xec\xa2\xcf\xa3\x3d\x84\x7a\x89\xc2\x9c\x5c\xd9\x6c\x98\x26\xe3\x52\x8d\xbb\x70\x95\xda\xa3\x08\xad\x9c\x69\xc0\x81\xeb\xac\x7c\x9c\xaa\x27\x56\xd6\x05\x94\x74\xf7\xa1\x6b\x90\x3b\x43\xe2\xb0\x3b\x95\x50\x9c\xdd\x7e\x4a\x7d\x4f\x22\x58\xf5\xa5\xd4\x35\x6a\xfe\x1b\x1c\xd6\xd7\x5f\x98\xfa\x7e\x4c\x52\x07\x66\x40\xa0\xe0\x0b\x2b\xeb\x4c\x64\x27\x56\xd4\x7d\x8a\xf7\xc1\xd1\xd0\x5c\x27\x7d\x13\xf0\x3c\xe5\x1a\xab\xfc\x7a\xf3\x9f\xfa\x81\x20\x26\xa6\x88\x8a\xb5\x53\x35\x37\x82\xfa\x32\x65\x51\x57\x4f\x5f\x40\xe9\x16\xc9\xf0\xa4\x17\x34\xf0\x02\x25\x07\x22\x5a\x9f\x06\xa6\x3f\xee\x17\xca\x84\xb4\x51\x3f\x83\x23\x40\x1a\xaa\x7b\xf6\x97\x8a\xf0\x5f\x7a\x90\x82\x06\x22\xc2\x38\xb1\xdd\xe1\xa6\xc8\x17\x6f\x5c\x19\x52\x53\xcf\x6b\x54\x79\x4f\x57\xc4\x1e\x82\x86\x61\x8a\x64\xb7\x68\x61\x5b\xf9\xdd\x16\x3b\xd5\x34\x33\x84\x8c\x3f\xb2\xba\xbc\xf4\xab\x52\x05\x8d\x29\xc5\x63\xe9\x7e\x76\x3f\x7b\x75\x89\x66\x41\x63\xc1\x99\x91\x99\x38\xea\xa2\xea\x31\xd6\x2f\x4b\xdd\xce\x97\x58\x86\x24\xea\x53\xea\xe1\xf6\x36\xfd\xb5\x93\x30\xc2\x60\x0a\xd6\x21\x34\x7b\xe9\x03\xab\xb0\x86\xad\x5d\xc7\x34\x89\x02\x5b\xbf\x02\xac\x3a\x97\x17\x8b\x40\x1f\x4f\xff\x24\x0e\x51\x58\x43\xe9\x52\x34\x16\x4c\xc7\x7e\x25\x68\x22\x21\xe8\x54\xb8\x46\xec\x1c\xb6\x4f\x1a\x70\xcc\x7c\x9d\x4a\x58\x0b\x8d\xa6\xf5\xbc\x93\x74\x17\x34\x15\xb1\x2b\xb2\xfc\x1d\xe0\xb4\xaa\x0f\x9d\x97\x21\x28\xa3\xbe\x1a\x11\xf7\x0d\xe6\xc5\x35\x75\xdd\x60\x53\x60\x34\xc1\x28\xde\x4e\xb0\x5c\x20\x59\x44\xd9\x41\x55\x04\x65\x7e\x12\x59\xd2\x00\x03\x56\x9b\x62\x03\x10\x94\xc5\x14\xa1\x11\xcd\x63\x37\x06\xee\x95\x90\x82\xa0\x8c\x19\x68\x92\x60\x79\x6d\x26\xfa\x70\x14\x99\x8c\x31\x1c\x89\x8d\xe5\x3f\xce\x2d\x1a\x56\x50\x4e\x03\x65\x52\x63\xfa\xe7\x05\x53\x5a\xc3\x4b\xb9\x88\x91\xa4\xdf\x2a\x1f\xd8\x78\xd7\x84\xbd\x45\x05\x0d\xf0\x73\x34\x26\xa5\x8d\x07\x8c\x5f\x45\xf8\x46\xb1\x7b\xa0\x10\xee\x9e\x44\x70\x1f\xd9\x65\x9d\xfb\x3a\x3f\x5f\x4c\xc9\xa3\x6b\x97\xa9\x15\x83\x04\xb9\x13\x3a\x2b\xaa\xdd\x07\x3b\xe7\xb5\xe7\x3a\x48\x62\xa4\xa0\xcd\xa3\x5e\x95\x5c\xfc\xad\xf7\x61\x65\xa4\xc0\xeb\xf0\x7c\xdd\xd9\x38\x78\x77\x09\x80\x15\x92\xaf\x8d\x87\x7a\x1a\x38\xd2\x93\x79\x04\x41\x81\xc6\xd2\x26\xa7\x6c\x9e\x73\x38\x00\x10\xc4\x98\x83\x7f\x7e\x5d\xcc\xdc\x63\x43\x1c\x85\x6d\xcd\x18\xf2\x36\x66\x9d\x45\x3b\x79\xd8\xa8\x58\x20\x78\x1d\x37\x00\xac\x3f\x99\x39\x02\x4f\x7b\x53\x8f\xa4\x04\x85\xa7\x9e\x74\x79\x44\x40\x0d\x92\xda\xb7\xad\x96\x9a\x6d\xfb\xbc\x9d\x3d\xec\x90\xc4\x60\x31\x7b\x71\xad\x94\x08\xcc\x27\x7e\x96\x8d\xc5\x58\xb6\x7f\x8e\x98\xc3\x86\xa2\x5e\xbd\x81\x16\x77\x83\xea\xd1\x44\x44\x56\xd8\xae\x79\xe6\xf5\xe2\x79\x50\x56\x22\x3c\xca\x4d\x72\xbb\x73\x61\x1c\x6d\xd6\x60\x14\x3d\x8f\xa7\x08\x83\xdc\x1d\x41\xb2\xfc\x0e\x99\x1d\xc7\x5d\x04\x20\x0a\xce\x4d\x16\x64\xa6\x6e\x0f\x14\xcf\x27\x6d\x2a\xf1\x1b\x94\xfa\x89\x1d\xc7\x37\xf0\x3d\x3f\xb1\x94\x67\xb3\x0b\x2b\xea\x65\xa9\xb3\x7a\x25\x74\xa1\x8f\xd9\xbf\xcf\xb0\xb3\x0a\xc4\x91\xbb\x63\x10\x09\x0c\x47\x20\x29\xe4\xf6\x79\xb7\xd9\xce\x1e\x56\x8f\x2d\x37\x91\xf0\xc2\x08\xb0\x98\xfd\x35\x83\xf7\x0e\x5b\x2a\xbc\x50\x79\x91\x63\xa4\xab\xf5\xae\xd5\xe7\x1a\xce\x0c\x2f\xa2\x86\x01\x2a\x37\x5a\x32\xc3\x28\xe6\xf0\xd1\xa3\x38\x40\xe1\x9f\x0f\x9d\x9f\x8f\xb0\xbd\x9c\x20\x76\x3f\x16\x13\x81\x78\x73\x61\x4f\xc6\x37\xb7\x7d\x7b\x09\x11\x18\x07\x7b\x9c\xfd\xd1\x3c\xfb\xd3\x72\xf6\xba\xdc\x6d\x66\x0f\xab\xdd\xcb\x6c\xf1\xfb\xa6\xed\x46\x0d\xbd\xb0\x21\x50\x9c\x92\x4c\xbf\x3a\xb1\xbc\xc4\x0b\x30\x55\xed\xac\xd7\x39\x13\xef\x8f\xb3\xa7\xd9\x8d\xc7\x4f\x7c\x85\xf3\x7d\x55\x96\xba\x9c\xda\x49\xbc\x24\xf1\x13\x3e\xa8\x4b\xed\x47\x39\x84\x97\x28\xcb\xd3\x67\x12\xeb\x2d\x59\xdd\x20\x9f\x2c\xbc\x34\x96\x1e\xc5\xe8\x65\x21\x97\x59\x25\xae\x6a\x3e\x85\xc7\x44\x12\x59\xe1\xca\xcd\x11\xe9\x79\x4f\x3f\xdc\x07\xea\x19\x36\xd5\xcd\xa2\x57\xe1\x31\x50\xd2\xb3\x25\x5f\xd9\xfe\xab\xe1\x1a\x8d\x83\x48\x38\x6f\xe9\xab\x87\x09\x5a\xe1\xc9\x20\x8c\x6c\xdc\xc3\xe4\x5f\x17\x56\x86\xed\x9e\x55\xd7\x64\x5f\xc2\x93\xb1\x70\x54\x4b\x4f\xf0\xb3\x7e\x30\xc5\x08\xdb\xed\x0f\x4b\x98\x66\x30\x4b\x36\x54\x28\x3c\x20\x01\xfa\xbf\xed\x6c\xc4\x9a\xd8\xa9\xb7\xbc\x7a\x5f\x20\x51\xc0\x3b\xb1\xe1\xc5\x8f\x45\xf5\x02\x28\x6a\x33\x29\x35\x2c\x3c\xf0\x04\x5a\xe6\x7f\x7f\x7b\x58\xcf\x50\x96\xe0\x75\xb5\x69\x27\x9c\x22\xc4\x68\x21\xe8\x7c\x54\x73\x22\x7c\x12\x9b\xf2\x75\x8c\x93\xf7\xea\xec\x84\x4f\x24\x43\x39\x1b\x43\x8a\xf1\xcd\x08\xe1\xda\x36\xea\x11\x66\xca\xc9\xf6\x5f\x69\x9b\x7c\xfd\x75\x7c\x9a\x18\x5f\x65\x8e\xcc\xce\xbb\x39\x2b\xde\x77\x8d\x4b\xb1\x6b\xa5\xa4\x6d\x47\x9f\x1a\xee\x5f\x0c\x9a\xf6\xb8\x32\xc6\x2f\xe3\x47\x2a\x1e\xe6\xeb\x17\xba\xa8\xa0\xa8\xce\x03\xac\xb9\xf0\xc3\x10\x10\xd6\xb7\x6b\x0c\xc7\xea\xd4\x45\x7a\x84\x1f\x72\x89\xd9\x83\xea\xcc\x77\x95\x29\xc6\x98\x4a\xbb\x08\x3f\x14\x06\xaf\xe6\x96\x64\xf3\xe4\x08\x71\x84\x89\xd2\xa5\xc1\xe2\xf3\x23\x22\x31\xb4\x87\x2f\xf1\x63\x70\x04\xf8\x71\x18\xe3\xc6\x2c\xb3\x8e\x5b\x75\x72\x91\xfb\x71\x1c\x62\xcc\x5b\x65\xb9\xc1\x42\xb5\x4c\xe4\xa3\x61\x49\xc0\x18\x68\x46\x89\x58\xde\xe9\xf2\x1b\x2b\x64\x0e\xc3\x25\xef\xa7\x94\x60\xca\x98\xb3\x3c\xd7\xed\xd8\x0b\x2f\x16\xa6\x94\xaf\xd2\xf9\x87\x03\x8d\x9a\xe0\xfa\xa4\x9f\xe6\x8b\x20\x85\x56\x44\xb5\x7c\x6f\xfe\xf7\xbd\xcd\x4f\x9b\x1a\xea\xab\x00\x8a\x2f\xd2\xd4\xc8\x2f\xa3\xb8\x87\x1d\xd2\xf1\x8b\xbb\x05\xe2\x0b\x1e\x7b\x16\x76\x38\xbb\x41\x05\xeb\x7a\x4a\x65\xe0\xac\xb3\xa7\xfb\xd5\xea\x69\xb9\xa3\xc4\xbd\x99\x24\x61\x2c\x7b\x14\xac\x67\xb9\x87\xe9\x2c\x8d\xf0\x65\x48\x92\x1e\x6f\xba\x05\x29\x77\x11\x0c\x5f\x26\xa1\xa3\xb1\x5b\xfd\xcc\x8c\x12\xe5\xe8\x33\x48\x61\xa0\xd5\x5b\x5d\xea\xa2\xd6\xaf\xe7\xfc\x66\x35\x5c\xd3\x39\xc5\xe2\xc8\xaa\x35\xa7\xc7\xd1\x3a\x1f\x22\x8e\xc9\xdc\x1a\xaa\x7a\x83\x80\xee\x57\xc0\x13\xa9\x67\xa4\xf8\x10\x4b\xcf\x46\x84\x17\x07\x96\x15\x17\x74\x29\x06\xdf\x4b\x89\x00\xf9\x04\xf1\xe6\x16\x4b\xd1\xe3\xd6\x16\x01\xf1\x13\x2c\x1a\x33\xcf\x68\x44\x2e\x6c\x13\x4d\x0c\x2f\x6f\x9b\xa1\x9c\x74\x56\x02\xca\x03\xd4\xe0\x41\x52\xd2\x3c\x2b\xf6\xae\xa4\x6d\x72\xb4\x03\x4f\xf8\x60\x29\x79\xcc\xa1\x03\x16\xf0\xe4\xda\x81\xd9\x2f\xf7\x2f\x10\xfd\x98\xda\x64\x30\x2d\xf0\x94\x4f\xa8\x03\x36\xfe\xac\xef\x74\xd9\xb8\xc0\x68\xe7\xcb\xf6\x96\x2a\xc0\xfc\x26\xd7\x35\x16\x47\xb8\xbf\x07\x44\x52\x14\xbb\x6c\x9c\xe6\x19\x96\x5d\xba\xa6\x90\x50\x83\x55\x39\xe5\x59\x3d\x90\x5a\x77\x1d\x28\x4d\x9c\x78\x24\x3b\x5e\x67\xd9\xdb\x6e\x49\xd8\xc6\x30\x36\xb5\xf1\xcf\x0f\xd9\xa9\x3d\x2a\xbc\xee\x84\x88\x6d\xb6\xbd\xad\x2a\xb2\x02\xa0\x22\x08\x63\xa3\x44\xbc\xfa\x79\xd2\xd5\xb9\x84\xe7\x13\x14\xd7\xa2\xc2\x93\x3b\xf2\x50\x36\x5a\x04\x11\x91\x0e\x9e\x62\xb6\xd9\x5b\x74\x3d\xae\x3f\x33\x13\xfb\xf9\xe4\x28\x78\xa7\xa8\x5a\x45\x10\x29\xe6\x39\xbd\x8e\x55\x25\x4a\xfd\x79\x63\x44\xe2\xc0\x40\xb7\x56\x2f\xcf\x8b\x6f\xbb\x87\xd5\xd3\xbd\xc3\x46\x8a\x20\x0e\x13\xe4\x04\xdd\xb2\x77\xa6\xce\x0e\xa9\xdd\xfc\xdd\x54\x85\xa2\xdd\xdc\xac\x15\x7d\x6e\x27\x70\x1c\x31\x24\x21\xea\x6d\x47\x37\xb3\xd7\xa3\x27\x49\x13\x9b\xba\xac\xce\xb0\x80\xb2\xce\x14\x6a\x9f\xfd\x36\x09\xc9\x18\xdf\x73\x30\x0b\x13\xc2\x54\xda\x13\xc7\x29\x2b\xa7\xe3\x32\x3a\xc6\x82\xc4\xe3\xca\x6e\xb9\xe7\x23\xec\x5e\x5e\xd7\xdf\x67\xdb\xd5\xa6\xa5\x00\x16\x41\xc2\x25\x2e\x3b\xa8\x0f\x6f\x9b\x65\xfb\x57\x25\x90\x53\x1a\x59\x6e\x0e\x60\x39\x38\xb2\x96\x4b\x4a\x04\x29\xe1\x24\xb1\x7c\x33\x07\xd6\xfe\x55\xca\x50\xb4\x4e\x7e\x33\x76\xfd\x28\x95\xed\xc4\x62\x63\xce\x80\xd0\x8d\x99\xd0\x87\xc9\x8b\x80\x71\xe3\xc4\x1f\x58\xf5\xaa\xf3\xe9\xcc\x59\xd3\x8b\x61\x1c\xbd\xb9\xbb\xc5\x86\x74\xd8\x0f\x11\x70\x8f\xa3\x88\x74\x01\x9f\x1d\xe9\xef\xa8\xf6\xe6\x6f\x93\x5f\x89\x33\x53\x93\xdb\xec\xce\xce\x1f\x9a\xfe\x9e\x5c\x86\x18\x3d\xb5\x6a\x3c\x16\x0f\xe1\x1a\x41\x46\x49\x8b\xa4\xfe\xa6\xcb\x0a\x2e\xe3\xe4\xde\xc0\x29\xed\x63\xdb\x45\x20\xbc\x10\x03\xd5\x1f\x3a\x6b\xb7\x15\x91\x18\x45\x48\x56\xee\x17\xe7\xb2\x85\xff\x8a\x40\x40\x4b\x14\xea\x42\x12\x53\x69\x44\x11\x08\x65\xc8\xbb\x05\xcb\x85\x2d\x7f\x1c\x76\x90\x1e\x20\x7c\xd7\x04\x82\x8c\x02\x62\x09\xb0\x64\xed\xd7\x91\x09\xf3\xda\xac\xdc\xc9\x6a\xbc\xcf\xea\x5a\x8f\x8b\x5c\x44\x20\xd3\x08\xa7\x42\xa1\xeb\x7f\x42\xa9\x67\x85\x7c\xd2\xf5\xc6\x50\x7c\x8f\x7e\x56\xca\xd4\x4c\xd2\xba\xcc\xe0\x63\x8a\xca\x5a\x04\x52\x11\x2c\xea\x40\x61\xf2\x4c\x17\x7d\x54\xb0\x08\x20\x8a\xe3\x01\xcf\x47\x39\xa1\x81\x7c\x25\x51\x79\x95\x9e\x14\x01\xc4\xbe\x32\xe0\x00\x7d\xd2\x15\xbc\xc2\x07\x94\xd5\x58\xc3\xc7\xf5\x05\x25\xdc\xa6\xac\x73\xd9\x1c\x87\x83\xa8\x59\xa0\xb8\x67\xc1\x1d\xcd\x11\xd5\x58\x9b\x28\x0d\xdd\xfd\x5c\x48\x62\x43\x30\x80\x39\xb8\xac\xd8\x6f\x81\x1d\x4d\x74\x69\xb4\x92\x43\x92\x12\x47\x58\x6b\x12\x60\x98\x09\xae\x7e\xcf\x6a\x64\x0e\x9d\x9c\xa3\x21\x61\xa6\x42\x96\x43\xad\x74\xd9\xa3\x46\x68\x9a\xd4\x20\x89\xb1\xfa\xd9\x1c\x48\x66\xe8\xb7\xda\x51\x08\xbb\xce\xdc\x73\x02\x1d\xbd\x1f\x77\x95\x71\x93\xb3\x2d\xa4\xc4\xb8\xc8\x56\x1a\xee\x8a\x0f\x4f\x84\xd4\xa3\xe8\x5a\x5a\xb2\xba\x51\x89\xe0\xe0\x45\x28\xf3\x31\xf8\xb6\x3b\x17\x27\x86\x4a\x49\xd7\xe9\x9a\x90\x32\x83\x6b\xee\x9b\xd1\x26\xec\x31\x69\x1b\x84\x54\xfa\x68\x4a\x54\xc7\x2c\x87\x4b\x3f\xba\x15\x7a\x71\x8c\x31\xd6\x1a\xd8\xd1\xec\x4f\xd1\xa3\x2e\xea\x43\xfb\xec\xa1\x67\x2a\x95\x3a\xff\x60\x79\x7e\x07\x54\x9b\xea\x6f\xd5\x61\x18\xfa\x58\xfb\x71\x6a\x2c\x81\x61\xf5\x5b\xd3\x18\x32\x36\x10\xae\x1e\x0a\xcd\x88\x30\xf2\x22\xfc\x80\x46\x2f\xa3\x17\xa8\x08\xa3\x28\x0d\x7d\x57\xdf\xa8\xca\xf1\x58\x44\x22\x44\x80\xd3\x91\xbd\xc3\x12\x58\x7e\xa7\xcb\xed\xa7\x9e\x74\x3f\xc2\x48\xa5\x49\xab\xd3\xcb\xf2\x09\xb1\x4b\x11\x26\x49\x88\xa4\xcc\x12\x72\x76\xb1\xd9\x11\xd7\x94\x86\xca\x86\x9a\x37\x3a\xcb\xbf\x9d\x8f\x18\x13\xb3\xda\xae\x58\xf2\x5f\x8d\x5e\x2b\xa5\x10\x18\xfa\xc8\x1c\x04\x12\x30\xff\x6a\xdc\x7e\x6a\x21\x86\xa9\x97\x62\x00\xbb\xd9\x5d\x5e\x4a\xc7\x7f\x2d\x5d\xa8\x31\x4c\x01\x80\xdb\x30\xc9\xc7\xc0\x7f\x70\x7e\xd1\x23\x54\x15\xdb\x5f\xf3\xa0\x0f\x76\x0e\x77\x37\x45\xa4\xcd\x30\x7e\xa5\x6c\x69\x7b\x33\x66\x94\x3d\x6b\xbd\xd5\x35\x3c\x64\xff\x3e\x67\x92\xd5\xba\xec\x13\xbc\x8a\x90\xfb\xa9\x61\xa2\x41\xe5\xb0\x81\xd4\xed\x8d\xc9\xcb\x7d\x53\x3b\xf1\x98\x89\x03\x83\x9c\x12\x4a\x07\x33\x58\x24\x21\x86\x9d\xaa\x5a\x97\x80\x8b\xa5\xff\x0e\x22\x31\xb8\xb5\x0a\x0a\xd9\x66\xd3\xc6\x3f\x38\xfd\xc3\x22\xa5\x0e\x4c\x54\x38\xa8\x8f\x6b\x02\xe2\x9b\x49\x57\x96\x19\xdb\x03\xea\x64\x2f\xb5\x68\xdb\x55\x2b\x5d\xfe\x58\xed\x6d\x89\xe7\x68\xa2\x49\x4f\x62\xc1\x40\x7d\x39\x0d\x02\xce\xa1\x8c\x62\x0c\x68\x36\x47\xbe\xad\x7c\xad\x86\xfb\x89\x4c\xe2\x20\xb4\xa4\xa3\xcd\x87\xdd\x9c\x40\xa0\x82\xbd\x39\xec\xaa\xab\xf3\x60\x7a\xd3\x84\x38\x8d\xe3\x8e\x32\xa8\xdc\x1e\x4a\x68\x77\x42\x48\x28\xe2\x8a\x0e\xa6\x1a\xce\xae\x84\xe1\x74\x04\x91\x82\x83\xc6\xa2\xda\xb7\x0b\xcc\xf5\x36\x7e\x95\x52\x2b\xb7\x01\x1f\x99\x3e\x57\xa6\x32\xce\xbd\x4a\x44\xa2\x04\xa3\x4d\x59\xf5\xa4\x6b\x54\x84\x6a\x4f\x95\x88\xb0\x08\xe3\xb2\x27\x76\xb1\x95\xcd\xc3\x21\x8c\x08\xe7\x08\x43\x38\x57\xf6\x14\xdf\xd4\xac\x9e\x2e\xb8\x10\x11\x11\x69\x64\x11\x77\x68\x48\x3e\xb6\x1a\x44\x22\x22\x92\x21\xe8\xd3\xf0\xe6\x36\x56\xa3\xef\x9a\x28\xa4\xb8\xbf\xd8\xdd\xfd\x1a\x87\x35\x89\x09\xb4\x17\x7b\x81\x42\x0f\x5d\x38\xe2\x9c\xfe\x87\x8e\x3c\x69\x30\x58\x0e\x0e\xd7\x89\xd7\x55\x2f\x46\x29\x60\x2a\x0c\x19\x79\xe0\xe1\x01\xd9\x99\xd6\x99\x2e\x36\x50\x7f\xc5\xf2\x25\x22\xdf\x23\x18\x38\xda\xbc\xbc\x0e\x1e\xc2\x8f\x05\x82\x6a\x5d\xc9\xc7\x76\x94\xc4\x89\x02\x9a\x62\xd4\xf3\x75\xf3\xf2\xb0\xdd\xdd\xbb\xeb\x82\x30\x92\x06\xb1\x09\xf5\x1d\xcb\xf2\x9e\x6a\xc6\xc4\x40\x04\x51\x8c\x15\x48\xc8\x81\xe0\xb6\xab\x28\x8c\x22\xdf\x31\x6e\x1b\xb3\x1e\x99\x5c\x4f\xbd\x6f\xd8\x1b\xdb\xc4\x5d\xc5\x3d\x0c\x1b\xf4\x73\x98\xb7\xb6\xb3\xe1\x18\x44\x71\x6c\xca\x69\x90\x9b\x9e\xe5\xf9\x36\xdb\x1f\xea\xfc\xf2\xc2\x9a\x6d\xe8\xb7\x21\xeb\x84\x88\xe2\x24\x44\x7e\xa0\x59\x59\xf7\xa4\xfc\x45\x94\xc6\x0a\xe7\xec\xe6\xfd\xb2\xf9\xb4\x3c\x3e\x6d\x9b\x20\x88\xd5\x37\x19\x1c\x83\xb1\x1e\x46\x2d\x86\x8f\xc4\x3c\x43\x6c\xbb\xfb\x1c\x89\x02\xb9\xf6\x40\x46\xc6\x6e\xd2\xeb\x6e\xbe\xb2\x88\x38\x7a\x55\x9b\x10\xf0\x83\xb6\x4d\x79\xed\x21\x87\x70\xf6\xe9\xb1\xe0\xc4\xc8\x6e\xad\xef\x16\x0b\x77\x29\x4f\x00\x01\xc4\xce\xae\x78\xe8\x27\xde\x27\xbe\x2a\x6f\xf6\xde\x56\x4b\xf5\xd4\x8d\x90\x08\x3d\x57\x11\xff\x03\x9a\x31\x1e\xcd\x29\x49\x0c\x3f\xef\x09\x4a\xa5\xcb\xa3\x49\x62\x35\x1f\xe4\xc5\x09\x80\x34\x7d\x94\x61\xf6\x41\x4a\x3d\x5c\xb2\xa3\xb1\x91\x49\x2b\x6d\x30\xce\x08\x0c\x16\x8c\x64\x29\x26\x02\xfe\xfd\x09\xa5\xe8\x7d\x47\xa0\x1e\x66\x25\xda\x73\x61\x55\x48\x90\x96\x28\x0a\xfd\xe4\xe9\xa1\x03\x4f\xa2\xfa\x39\x9a\x99\x18\xfc\x69\xcc\x74\x76\x6a\xf5\x15\x44\x04\xdc\x68\x95\x2f\x32\xdd\xcc\x9c\xd5\xeb\xc2\x8b\xbe\x60\x1c\x1b\xff\x00\x24\xa1\x91\x8d\xfd\xbc\x67\xc5\x35\x3f\x78\xd3\x83\x99\x1a\x6b\x60\x47\xab\xae\x7e\x32\x54\x25\x6c\x0f\x3b\x4c\xc0\xb9\x47\x51\x40\x70\x1c\xb1\xf2\x4f\x96\xfa\x34\xfc\x16\x31\x21\x51\x14\x3a\x09\x2c\x5b\x24\x3c\x3f\x8f\x8b\x84\x9b\x7e\x10\xf5\xb4\x67\xf7\x03\x0b\x2f\x26\x89\x22\x43\xf9\x6f\x90\x18\x82\x43\x3e\x9e\xc1\xc3\xc7\x84\x51\xb0\xb3\x77\x6b\xd2\xec\xed\xc9\x1a\x13\x88\x84\xc9\xf9\x7f\x40\xbe\x4b\xdd\x5b\xb9\x66\x4a\x02\x27\x93\xff\xac\x26\xa2\x9d\xae\x1b\x15\x68\x33\xb8\x45\x85\xd8\xfc\x99\xe3\x50\x10\x31\x65\x5c\x5a\x42\x12\x5b\xbd\x32\x96\x31\x12\xb1\xe7\x99\x4a\xc7\x3d\x0c\x21\x02\xb1\x27\x4c\xfd\x4a\xe3\xb8\x5b\xaf\x69\x60\xf4\xc5\x9e\x90\xb8\x6f\xcc\x11\xf8\xb8\x1e\x7b\x9f\xb1\x0f\x29\xb6\xe7\x06\x7d\xe0\xaa\xba\x6c\x6b\xc0\x85\xa5\x6a\x51\xec\x9c\xd7\xc6\xf7\xf8\xfb\xb9\x74\xfc\x17\x22\x0e\x94\x87\x98\xcd\xb9\x6e\x5e\x0b\xce\xc7\x2f\x80\xc4\x22\x8e\x62\xc3\x7e\x5a\x43\x85\x1b\xf5\xba\x86\x23\x52\x80\x62\xf0\xb3\x2d\xc1\x71\xbd\x59\x80\xfc\xf0\x02\xc5\xdb\xab\xd9\x07\x94\x58\x56\xd9\x47\xc5\xbb\xae\x8a\xa3\x90\xc4\xbd\x91\x22\x75\x77\x88\x89\x51\xe9\x42\x3e\xaf\x23\xc8\x36\x30\x3d\xb9\x98\xe2\x38\xe1\x48\x7b\x67\xce\xd7\xbf\x0a\x17\xb9\x8b\x80\xa3\x03\xf4\xcf\x21\xcf\xa2\x88\x13\xaa\x90\xab\x6e\x5b\x9e\x2d\x80\x14\x99\x9d\xbf\x1c\xa0\x24\x05\xb4\xf3\xe6\x79\x56\xc8\x5b\xa5\x8e\xc3\x57\x4f\xa4\x30\xfb\x17\xbb\x20\xb5\x81\xfd\x73\xea\xb3\x88\x4c\xd9\x0a\xae\x3d\x31\xcc\x08\x82\xe5\x48\x29\x07\xb3\xb2\x6e\xb6\x87\x41\x60\x28\x4e\x13\xe9\xac\x2a\xcc\xb5\xec\x58\xc9\xb3\xba\xda\x55\x63\xda\x5e\x11\xa7\x2c\xe0\x76\x9f\x35\x41\x68\x13\xad\xc3\x7f\xeb\xb2\x1f\xff\x8d\x19\xe5\xa1\x31\x59\x7f\xb6\x39\x12\xd7\x14\x7b\x98\x94\x37\x51\xb6\xd5\xf6\x9b\x0d\x77\x2c\xa0\x15\x98\x16\x31\x4b\x43\x19\xb6\x95\xee\x9b\x43\xa9\x47\x34\x9f\x22\xe6\x69\x82\x85\x63\xb9\xae\xcf\x95\x31\xfb\xe3\xf0\x45\xb4\x8b\x97\x73\x8f\x77\x14\x09\xe8\x95\xb4\x60\x88\xf3\x95\xa4\x90\x88\x85\x64\xa1\xdf\x9e\xa5\x6e\xae\xce\xf5\x78\x3d\x49\x61\x52\xdc\xf3\xca\x9a\x04\xbb\xcd\xd3\xf3\xf7\xaf\xad\xfb\x18\x28\x38\x69\x0c\xdc\x1d\x5e\x4a\x2d\x00\x30\x5e\x7d\x1d\x30\x8a\x15\x31\xe2\x9f\xed\x97\xfb\xd1\x1e\x23\xb1\x4a\x0d\x40\x64\xf6\xb6\xfd\xb6\xdb\xac\xb6\x8f\xeb\xa7\xed\xec\xf1\xf9\xed\x69\xdb\xf6\x10\x1e\x6e\x9d\xc7\x5e\x74\x71\xf8\x34\x4a\x31\x44\xfd\x9d\x4f\xf2\x8a\x03\xe3\x86\x67\x38\xe5\x20\x26\x84\x70\xcc\x4b\xb8\x13\x7c\xc1\x0a\x56\x1a\xca\xca\x7e\x78\xdc\xf6\xf6\x3c\x1f\xe3\x51\x26\x6c\x63\xc4\x75\xdc\xb2\x1b\x6c\x69\x89\x17\x18\xb8\xf7\xe6\xdb\xea\x8f\xbf\x06\x6a\x26\x5e\x44\xb1\x52\x4f\x23\x61\xd1\x4b\xa9\xf7\x65\xbb\x4a\x12\x2f\xf1\xd0\xca\xd8\xc9\x7c\x5f\xbf\x0e\xa5\xa0\x45\xe2\xfb\xe6\x97\x90\xda\x38\x2b\x2a\x28\xeb\x9d\xca\x8c\x56\xc3\xb7\xac\xc0\x6c\x84\xb1\x17\xbe\xb5\xe4\x99\x22\xf1\x93\x38\xb6\x29\x1b\x66\x57\xf0\xaf\x96\xf0\x7c\xb1\x35\x24\x7e\x92\x60\xe0\x44\xb0\x3c\xaf\x0f\x59\xd5\xfe\x1c\x03\x64\x0c\xba\x9f\x3d\xf6\x15\x3b\x45\xe2\x43\x82\xa4\xf6\x73\xfd\xfe\x7e\x79\xd1\x7a\xce\x0e\xd5\xec\x5c\xeb\x42\x1f\xf5\xb9\x32\xdc\x34\xac\x3e\xe8\xa2\xe3\x8a\x13\x49\x00\x12\xe1\x96\xdb\x12\xa3\x7d\xad\x15\x91\x84\x91\x47\x6d\x10\xf2\xe9\x6c\x39\xe4\x9a\xe3\x79\xfb\xb8\xc2\xca\x14\xdb\x2d\x22\x0c\xa1\x79\x3b\x27\x94\x0c\x65\x7d\x99\x5f\x06\xc4\xec\x93\x4c\x99\x22\x89\x02\x0a\xd0\xd3\xd3\x6a\x9e\xef\x0b\xd0\x57\x12\x05\x09\xe6\x3b\x8f\x59\x51\xdf\x81\x0b\x60\x4e\x6d\xec\x49\x94\x0a\x47\x56\x6e\x52\x7f\x13\x80\xa7\x24\x89\x08\xc2\x3f\x9c\x64\xd1\xca\xb0\xce\x49\x64\xc1\x1d\xae\x91\x24\x11\x89\x34\x55\x5f\x65\xa6\x2e\xb3\x42\xba\x18\xc3\xed\x3a\x80\x5f\xca\xa9\x27\x89\x52\xe8\x87\x29\x68\x99\x32\x56\xf5\x61\x42\x0c\x4a\x24\x29\x31\xdc\x2d\xe7\xa2\x42\x88\xbe\xfe\x04\x89\x39\x83\x3e\xff\xc1\x68\x4d\x32\xcf\xa8\xb8\x9a\x31\x46\xf9\x94\x83\x15\x1f\x1b\x75\x0c\x93\x80\xb5\xfb\xa3\x81\x7e\x8e\x81\xf5\x09\x63\x1e\xfa\x4c\x83\xa4\xef\xf7\xf5\xcb\x6d\x28\x48\xc2\x80\x0d\xc0\xfc\x6f\x45\xe5\x38\xdb\xdd\x14\x6a\xfc\x7d\x4b\xe6\xf4\xa0\xbb\x93\xbe\x9f\x46\xf3\xc7\x69\x34\xdf\xdd\x5f\x46\x04\x4b\xcb\xcd\x73\xbb\xb4\xe2\xf0\xb1\x65\x14\xf9\x16\x8e\xf2\x88\xf4\x6e\x4f\x5a\x5e\x3b\x45\xa3\x0f\x23\x45\x84\x39\x8a\x9d\x04\xa1\xe5\x55\x70\x27\x81\x24\x41\x49\x49\x8b\x24\xde\xe8\xfc\x03\x0a\x71\x19\x7d\x33\x15\xfa\x58\x49\x05\x47\x28\xf7\x4d\xfb\xb2\x64\x37\x64\x30\x44\xa2\x98\x81\x88\xb6\x85\x0f\x1b\x76\x84\x9d\x8d\xab\xec\xb4\x42\xaa\xf5\xba\xda\xd5\x7a\x77\x64\xc5\x65\x67\xef\x02\x13\x50\x1c\x77\x47\x2e\x11\xfe\x67\x36\xad\xc6\x5b\xdd\xb2\x72\x3f\xb6\x0d\x52\x42\x04\xd2\xd2\x9d\x0b\x17\xda\x1f\xe2\x05\x6c\x37\x4f\x05\x98\xf0\x69\x76\x24\xc9\x6a\x26\x4e\x5f\x6b\x6e\x37\x57\x48\x87\xe7\xd9\xb0\xdc\x64\x8f\x6c\x41\xf6\xa8\x67\x40\x12\x53\x05\x00\xf5\x73\xf1\xa0\x3f\xbf\x65\xfb\x3e\xec\x34\x0d\xe3\x34\xec\x8f\xcd\xd2\x66\x28\xaa\x71\xc6\xd4\xf5\x67\x9e\x91\xd0\x30\xf6\xd0\x73\x99\xed\xb3\x82\xe5\x2f\x2c\x2b\xfa\xf1\xb0\x1b\xcf\x1d\x72\xc0\xcf\xd6\x1c\x04\x99\xb0\xe2\x14\x22\x8d\x7c\x82\xf4\x67\x27\x53\x13\x71\x5f\x32\x79\x66\x46\xe4\x9e\x55\x43\xc8\x4a\x1a\x05\x0a\x91\x56\xc5\xf9\xd8\x22\x3f\x5d\x53\x48\x64\x2b\x22\xd0\x0c\xa6\x79\x07\xb7\x66\xd2\x28\xf2\x11\x3e\x63\x54\x73\x61\x7e\x59\x4c\xfa\x96\x69\xc4\x08\x0a\x16\xde\xff\x79\xdf\xde\x5a\x44\xa1\x61\xf6\x30\x74\xdd\x43\xef\x20\x8d\x54\x8a\x05\x22\x2d\xf9\xa8\xcd\x90\x8f\x22\x1e\xc3\xa1\x8c\x13\x81\x2b\xa1\xb1\x36\xbf\x3d\x3f\x3e\xbb\xdf\x8a\xd3\x28\xe9\xd3\xed\xcf\x8a\x4b\x27\x65\xb2\xd5\x73\x28\x40\x65\x22\x63\x13\x8c\x84\xc3\xd1\x8e\x99\x4c\xd2\x1e\x75\x13\x06\x8d\x5b\x8e\xf5\xfa\x5c\x16\x37\xe2\x6a\x69\x12\x2a\x62\xea\xb7\x3f\x8b\xaa\x57\x36\x91\x26\xb1\xe1\x7f\x31\x36\xc8\xf7\xb8\xfd\x7b\xc2\x91\x56\x6c\xe7\x14\x24\xfa\xe8\x88\x34\xa5\x1c\xdd\x51\xa9\xcf\x3c\x87\x1d\x6f\x8c\xf2\x5d\x75\x60\x5e\x18\x7d\x55\xd1\x28\xd2\x34\x82\x18\x3a\xd0\xcd\x4b\x0e\x72\xdf\x16\x76\x8a\x34\x65\x0c\xc3\x7f\x36\x34\x8e\x36\x5f\x3b\x1b\x52\x20\x38\x53\xe7\x59\xbd\x3e\xb2\xfd\x20\x4c\x97\xa6\x2a\x46\x22\x9e\x5d\x65\x9f\xb7\x0b\xa9\x0c\x86\x90\x79\x21\xf2\xf5\x69\x67\x6d\xf5\x4a\x32\x47\xab\x98\x45\x21\x75\xfa\x0d\x1d\x69\x55\x73\xcd\x4c\xd5\x50\x3a\xb6\x39\xf7\x04\x3c\x8c\x62\x5b\x4c\xf5\xbd\x39\xfc\xb2\x29\xe2\xc4\xa6\x9b\xf0\xc9\xb5\x37\xa0\x00\x5e\xf0\x85\xd7\xc5\x0f\xc8\xfa\x4e\x41\x2a\x7c\x8e\xc1\x3f\x3b\x5d\xba\xa8\x41\x2a\x12\xc2\x94\x43\x35\x33\x69\xca\x8b\x59\xbe\x03\x47\xc6\x2f\x52\x21\xfd\xd0\xc9\x7e\xd9\x37\x5d\x17\x4a\x5f\xab\x45\x8b\x54\xc6\xc6\xd8\x2e\x59\x56\xc1\x87\x6e\xf3\xd7\x29\xa8\x04\x21\xc3\xc6\xc4\xc7\x93\xb4\xca\xf6\xb7\xa6\x9a\x22\x9e\xe7\xb5\x35\xc7\x35\xf4\x37\x27\xe5\xf1\x98\xdb\x8d\x71\x5c\x3d\x3e\x3d\xe5\x55\x2a\x51\xe6\xe6\x6e\xb6\xf8\x36\x5b\x3f\x0d\xa5\x19\xff\xd2\xc6\x65\x84\xa4\x46\x52\xd4\xb9\x04\xa8\x5f\x36\x00\x51\x30\x1a\x46\x91\x3f\x28\xa0\x72\x4c\x4e\x63\x72\xa0\xc1\xa3\x31\x9a\x7a\x18\x2e\xdd\xe5\x7a\x8f\x19\xc8\xd5\xcf\x1a\x8a\x2a\xd3\xc5\x77\x04\xd7\x0e\xcf\x0e\xe6\x35\x46\x73\x33\xf3\x0a\xd8\xd5\x9f\xba\x5f\x80\xc4\x7c\x0a\x11\x6d\xfd\x9c\x17\x47\x51\x30\xbc\x81\x1f\x08\x4a\x3b\x02\x24\x07\xa7\xb7\xad\x91\xc7\x42\x43\xc8\x59\x7c\x40\xd9\x98\x3d\xcf\xf9\x08\x4c\x38\x7a\xfe\x28\x62\x08\x46\x5a\x36\x86\x89\xfb\x5b\xcc\x12\x27\x09\x55\x3d\xdd\x6d\x51\xad\xe9\x30\x06\x59\xb3\x48\x49\x97\x6f\xfc\xbb\xe6\x3f\x74\xf9\x0e\xe5\x35\x4e\x9a\xc5\x1e\xc1\x99\x6b\x46\x73\xd1\x3c\xb4\xfe\x2c\xae\xf3\x79\x2c\x96\x02\x49\x29\x4c\x90\xac\xfa\x64\xa7\x5d\xd5\x77\xb7\x59\xac\xa4\xec\xc3\xd4\xac\xbe\xf6\x97\x73\x87\x25\x51\x8c\xdb\x7e\x05\xe2\x5c\xde\xc8\x5c\xb1\x44\xca\xc8\x9d\x60\xbb\xfa\x50\x02\xd8\xd2\xf7\xd5\xbf\xad\x08\x9c\xeb\x08\xa9\x74\xd5\xc4\x59\x9e\xa3\xe6\xf6\xe0\x24\x63\x2c\x4e\x84\xc5\xb0\x77\xbb\xca\xc8\x36\x60\x8c\xd3\xc4\xb2\x0d\x6f\xf4\x11\xee\x59\xfb\x05\x39\xf1\xa8\x8d\xce\x6d\x9f\x37\xa3\xcb\xb8\x0f\x18\x82\x6e\xbc\xfe\xac\xd8\x6f\xea\x92\xd5\xb0\x6f\xc7\x87\x73\x2e\xec\xae\xb2\xc9\xf5\xde\xe2\x68\x9d\xbf\xc6\xb8\xa4\xdc\xc2\xef\xef\x00\xfc\xd1\xe8\x0b\xc2\x53\xe5\x2a\x96\x7f\xbe\x60\xf6\x1d\xbf\xd8\xb8\x5f\xca\xb0\xdf\xb9\x90\xa5\x3e\x9d\xda\x78\x14\x93\xa9\xb1\x77\x0e\xe7\x23\x2b\xdc\x12\x9d\x5f\x6a\x58\xb4\x44\x38\x82\x49\x66\x0e\xf3\xcd\xdb\xd3\x3f\xfa\x5b\x37\x53\xc4\x8b\x93\x1e\xee\x1c\xeb\x42\x7b\xac\x4b\x83\x81\xe0\xc4\x0b\x6d\x19\x48\x33\xf5\x96\x50\x89\x32\xbb\x66\xdc\x6d\xfa\x29\xcc\x29\x7e\xd7\x35\xbc\x9c\x8f\xa7\x85\xce\x0a\xe2\x0e\x30\x4e\x52\x89\xf1\x3b\x05\xe2\xd0\xf4\x78\x3a\x1f\xef\x74\xd9\xd2\xcb\xb4\xdd\xb8\xa9\x73\xcb\xaa\x17\x9d\x67\xe2\xb2\xfa\x99\x55\x43\x29\x2b\xc1\x29\xf1\x43\xbb\x76\xcf\xa7\xe5\xb9\x16\x87\x76\xf8\x6e\x79\x3c\xbf\x04\xd1\xe2\x34\xa4\x18\xa9\x61\xc2\xe8\x93\xa1\x19\x37\xd4\x67\x1c\x8d\x4d\xb3\x8b\xa8\xde\x4e\x86\x78\xc9\x61\x17\x8f\xc9\xa8\xdf\xa5\xa5\x70\x10\xdc\x93\x46\x56\xde\x21\x13\xc7\x57\x2a\xc0\x22\x06\x2c\x35\x99\xe7\x4c\xbc\xa3\x32\xf9\x94\x07\xca\xfd\x54\xe2\x21\xd7\x05\xdf\xdb\xc9\xc2\x7d\x61\x0b\x79\xa1\xde\x7c\xb2\x51\xb4\x83\x07\x11\xc5\x8c\x55\xcd\x3e\xa0\x1c\x7f\xd3\x10\x42\x84\x10\x3b\xf6\xf9\x9c\x65\xc7\x5e\x59\xcd\xe4\x02\xe7\x91\x27\x71\x22\x88\x1c\x58\xb9\xd0\x85\xca\xdc\x92\xe6\x11\x8b\x86\xf2\x71\xaf\x48\x58\x6f\x09\x3a\x26\xab\x74\x78\x24\xa2\xd4\x42\xd8\x31\x7e\x09\x72\x81\x51\xd8\xd1\x7b\x44\x82\x61\xc1\xd1\x93\x3e\xb6\xa0\x29\x1e\x41\x84\x78\x25\x34\x5f\x30\x59\xf5\x45\x5c\x83\x47\x60\x0a\x69\x9b\x9d\xc9\xc2\x17\xbe\x0c\x0b\xf3\x48\xc5\x46\x0d\x12\xeb\xd5\xfe\x62\x58\xe2\x20\xc1\x04\xf6\xeb\x39\x87\xfa\x9d\x6d\xa1\xaa\xd7\xce\x7e\xe7\x71\x00\x06\x3c\xcf\x90\x9c\x01\xab\xc6\x6c\x53\x12\x7b\x98\xeb\xea\x58\xf5\xb7\xec\xe7\xaf\x55\x2d\xf0\x24\x49\x93\x0e\x3f\x32\xd8\x90\xdd\x56\xc5\x93\x34\xc0\x92\x08\x65\xae\x1c\x14\x55\xf1\x94\x78\xca\xc4\x5a\x84\x2e\xe4\x37\x43\xab\x32\xef\x06\x38\xf5\x95\x11\xeb\x6e\x9c\x38\x28\xbf\xe9\x73\x89\xf6\x54\xdb\x1e\x85\xae\x64\x63\x80\xb6\x1f\x7e\xbb\x54\x46\x2d\x84\xa4\x31\x25\x59\x21\x7b\x9c\x09\x82\x33\x30\x95\x68\x5b\xad\x6b\x2b\xeb\xd0\x69\xac\x08\xce\x83\x18\x57\x21\x5a\xaf\xc7\xec\x7c\x9c\x29\x95\xe5\xd9\x15\x6b\x95\xe0\x3c\x8c\x31\x26\xb4\x81\x7a\x36\x19\x0f\xb3\xfd\x84\x17\x63\x7a\xbb\x80\xcf\x09\x4d\xea\x71\x67\x5f\x21\xc7\xed\x3b\x5c\xee\x34\x46\xb2\xba\x0c\x10\x17\x91\x87\x3b\xf5\x56\xbf\x67\xf5\x12\xeb\x69\x6f\xee\x26\x82\x99\x33\xe5\xc4\x8a\xba\xbc\xb8\x38\x29\x97\x69\x18\xd9\x32\xf4\x17\x56\xbb\x08\x90\x2b\x3e\xe1\x92\x1b\x40\xb9\x55\xd7\xc1\x6a\xdd\xa9\x42\x2d\x2e\x2d\xd4\x1d\xb5\x21\x9a\xcf\x69\x88\x58\x5c\x2b\x98\x42\x54\xc1\x0a\xe3\x93\xcf\x99\x78\x37\xca\xc8\x33\xf9\xaf\x73\x55\x37\x37\x7e\x6d\xde\xcd\x5d\x01\x5e\x8c\x4c\x61\xf5\x21\xab\x76\x08\x15\xaf\x77\x1d\x2d\x9a\xe0\x2a\x35\xfc\x72\x50\x48\xac\xef\x6e\xff\xce\x19\x73\x49\xb1\xe7\xe7\x07\x43\x3c\xed\x93\xae\x59\x22\x70\xcc\x54\x38\xef\xa6\x26\x8c\x20\x1e\x35\xa4\xf6\x59\x09\xa2\x5e\xc2\x51\x8b\x92\x09\x77\x38\x0b\x12\x0a\x44\xf6\xda\xbd\xd2\x70\x3a\xba\x36\xe6\x21\x3c\xdb\x8e\xcd\xcc\x9e\x2e\xc3\x6f\x2a\x28\x51\x68\xfa\xd9\xa2\xa5\xaf\x23\x32\x82\x7a\x14\xe1\x9e\xba\xd8\xf1\x5e\xbd\xaa\xf0\x42\x82\x20\x81\x13\xc2\x44\x9e\xb4\xcb\x2d\x08\xdf\x93\xc8\xa7\xe8\x30\x0e\xeb\x93\xaa\x96\x5a\x5c\x67\x95\xbb\xb0\x8e\xf0\xb9\x8f\xd3\xa0\x25\xe5\xfd\xf6\x7d\xd1\xde\x4f\x10\x4c\xbe\x19\xa9\x35\x44\xc6\xb8\x98\xdd\xba\x1e\xc9\x7d\x0a\xe1\x83\x97\xf8\xa3\x60\x32\x1c\x4f\x75\x3b\x46\x8d\xe9\x63\x04\x74\x58\x7d\xb8\x63\xa2\xd6\xe5\x2e\x73\x6b\x5a\x84\x89\x29\x04\xd8\x99\xc8\xd6\xa6\x66\xe2\xfd\x30\x51\x3f\x29\x42\x46\xd0\xa5\xbd\x47\x48\x7f\xeb\xb8\x89\x28\xe1\x38\x11\xcf\x15\x94\xd5\x2b\xa8\xd1\x65\x51\xea\x45\xd6\x60\x5b\xe8\xe3\x89\x15\xd3\xa4\xd3\x42\xc4\xa9\xc2\xf0\xb6\x3e\x41\xf1\xc8\xb2\x51\xb1\x8a\x88\x95\xe1\xbe\xed\x61\xf4\x58\x0d\x75\x97\x54\x14\x89\xe7\x2b\xc7\x8b\x75\x2e\x7b\x73\x57\x24\x89\x20\x86\x05\x4f\xb0\x4b\x8b\xc5\xba\x65\x23\x89\x44\x70\x54\x9c\x38\x9d\xab\xc3\x16\xca\xe3\xc0\x4c\x15\x29\x89\x59\xda\xca\x67\xdf\xd2\xc9\x12\x22\xa5\x7e\x02\x1d\xb9\x51\x36\x42\x03\x8a\xd4\x4f\x7c\x77\x12\xec\x2c\x35\xcd\x80\xca\x67\x74\x3b\x5f\xa4\x7d\x4e\xa6\x56\x2a\xb6\xaf\xd0\x3e\x8a\x8a\x8a\x34\xe5\xe8\xd6\xb3\x3c\x7f\x2b\x7e\xbf\x08\x90\xab\x76\xe5\x0a\xe6\x09\xcf\x9a\x82\x77\x59\x79\xc4\x60\x88\x89\xd7\xd4\x97\xd1\x47\x64\xa9\x07\x3d\xb1\x29\x63\xd9\x76\x98\x5b\xdb\x8b\x7b\x11\x62\xad\x6c\x9a\x93\x8d\x20\x5d\x82\x07\x06\x41\xfb\xba\xde\x7c\x9b\xcd\xbf\x4d\xe2\xed\x5c\x57\xa9\x90\xff\x79\x5d\x2d\xcd\x41\xf9\x7a\x2e\x8a\xac\xd8\xdf\xb1\x7c\xbf\x73\xf7\x13\x01\x73\x6e\x9f\x4d\x8a\x59\x02\xd1\x45\xae\xab\x11\x8f\xe8\x68\x34\x65\xea\xe3\x91\x90\x09\x6d\xb0\xc7\x8f\x96\x50\xe5\xb7\xb6\x43\xe4\x71\x67\x82\x21\x71\xb1\xab\x67\xd3\xe3\xc4\x96\x80\x80\x53\xe2\x10\x50\x4d\x5f\x13\xfc\x7c\x05\xe3\xfb\xd9\x5e\x2a\x21\xcc\xec\xec\x39\x3b\x17\x4d\xcb\x15\x49\xf5\xff\x2e\xa6\x2f\x54\x12\x27\xc8\x15\x68\xb8\xd3\x4a\xa8\x60\x44\x8b\x2c\x84\x62\x81\x55\xc5\x34\xf9\x45\x44\xd7\xd3\xe4\x78\xd5\x0d\x50\x8d\x77\xa4\xa4\x40\x4d\x81\xb2\xab\x18\x94\x84\xb0\x50\xd8\xd2\xb2\xbe\xe6\x4e\xd3\x62\x74\x2a\x77\x70\xcc\x6a\x0c\x8f\x94\x97\xc6\x7d\x19\x1d\x5e\xd3\x6f\x22\x89\x67\xa2\x3a\x8e\x70\x7e\x72\x6a\x5c\xcf\x6f\x49\x02\x93\xaa\xd8\x99\xa8\x51\x75\xe5\xc7\x48\x4a\x42\x69\x90\xe6\xfa\x58\xc9\x16\xfb\x2e\x69\x4a\x63\xeb\xf1\xb1\x72\xef\xd4\x22\x84\xa4\xb6\xcc\xcf\x44\xdb\x1f\xb3\x22\x3b\x9e\x8f\x83\x5a\xc6\xe1\xfd\xbd\x30\x92\xbc\x57\x2c\x9a\xfd\x07\x1a\xcf\xad\x1a\x77\xb3\xda\xed\x15\x56\x2c\x65\x72\xfe\x69\xb3\xd8\xec\x3a\xfe\x2d\x3d\x48\x90\x75\xa0\x04\xa5\x1a\x03\x75\x3e\x5a\x8e\xd2\x27\x21\x06\x06\xfe\x95\x55\x87\xac\x3e\x67\x87\x33\xbb\x61\xfb\x48\x5f\x98\xf4\xa7\xc2\xf4\xd4\x28\xf1\xdb\x0b\xac\xc9\x20\xe6\x86\x3f\x46\xca\xd9\x59\x66\xf5\x73\xb9\x42\xfd\x47\x61\x22\x50\xe3\xa2\xfb\x51\xbd\xc3\x08\x84\xdf\xdd\x13\xfd\xbf\xc5\xf3\xa3\x51\xe8\xdf\xcd\x9f\xdf\x9e\xb6\x7f\xee\x36\xdb\xd9\xef\xae\x68\x45\x06\x31\xa4\xad\xe3\x74\x45\xf2\x7a\x6b\x49\xf4\x1f\x3d\x09\x31\xfc\x31\x67\x79\xd6\xc3\x3e\xc9\x80\x9b\x82\xea\x0f\x56\x70\xf8\xb9\x6d\xd1\xdf\x6d\x3b\x18\xf2\xae\xd9\x51\x97\x83\xeb\x20\x40\xbf\x66\x93\xe5\x1f\x50\xde\x65\xaa\x1e\xe0\xc9\x65\x98\x12\x84\x38\x58\x2e\x1d\xef\x0e\xb9\x46\xdb\x95\x2e\x43\x1e\x9b\x70\x41\xad\x4f\xb3\x76\x85\x84\x8a\x7b\xc6\x19\xfe\x27\x94\xfa\xb7\x89\x40\xbb\x8c\xac\x4a\x47\x73\x94\xbf\x15\x75\xe6\x22\x95\x32\x52\x24\x8d\xda\x0a\x9e\x52\x7f\x56\x6b\x85\x9e\x45\xf5\xa4\x4d\x70\xd5\x7a\x38\x79\x9b\x31\x95\x71\xe2\xf1\x76\x77\x44\x9e\x19\xdc\x24\xae\x10\xa6\x32\x4e\xc0\x67\x2d\xc4\x6c\x2d\x67\x85\xfc\x06\x63\x18\x86\x4c\x02\xc0\xd3\xe2\xe5\xc1\x71\x97\xc8\xd4\xb3\x50\x43\x9c\xca\xbb\x25\x88\x9c\x95\x70\xa7\xb1\x22\x79\x7a\xe3\x95\x69\x20\x04\x6f\xe7\xe3\x92\x5d\xaa\x3b\x5d\xb6\xfc\xa7\x42\xa6\xa9\x4f\xec\x7a\xfa\xa6\x3f\xa0\xdc\xc2\xcf\x36\x8b\xd4\x16\xb5\xc9\x54\x49\x0c\xa0\xab\x73\x41\x47\xcf\xc9\x08\x55\x8e\xaa\xc6\x00\x4c\x4d\xae\xb7\xf1\xd4\xa7\x97\x08\xf3\x4c\x7c\x96\x33\xd1\xcb\x58\x4b\xe6\x03\xce\x0e\x63\x3f\x5b\xfc\x44\x26\xa0\x33\xfc\x24\x8b\x62\x04\xd7\x6d\x67\xcb\x97\xe7\x87\xd5\x6e\xfe\xfc\xbc\xd9\xb6\x8d\x8c\xa0\x27\x76\x1a\xb0\x0f\x0d\x58\xfd\xc6\xdb\x19\x67\x31\xe6\xfa\x5c\x28\x67\x57\x9c\x1d\xa2\x40\x72\x96\x52\xd5\x2b\xbe\x5b\xfd\x3c\x21\x00\x6d\xe2\xbd\x86\x67\xa9\xc4\x42\x47\xab\x40\xd0\x1b\x69\x49\x03\x0c\x6d\x1f\xb3\x2b\x4c\xe1\x94\x3f\x2d\x65\x2a\x70\xef\xdf\x40\xdd\x17\x21\x9c\xa4\xe2\x16\x52\xf2\xc8\x17\x3d\xa5\x4f\x5d\xd6\xfb\x1e\x26\xff\xbf\xa3\xff\x99\x82\x7e\xdc\xda\x48\x24\x07\x8c\xed\x55\xfa\x08\x77\xe7\x02\xa7\xb2\x43\x2f\x4b\xf0\x0d\x37\xb8\x08\x84\x6a\xc3\x31\x12\x44\x4a\xac\x35\x38\x87\x7a\x2d\x67\xf5\x24\xdb\xa2\xed\xad\x02\x85\x26\x1f\x3f\x5f\x1a\x4f\xc9\xdd\x44\xd9\x10\x28\xfa\x01\xce\x06\x9f\xc3\xbe\xdb\x2b\x54\xec\x47\x5e\xe7\x12\xff\x5a\xf9\xa0\x54\x8c\xa0\xd3\xc4\x10\x51\xfe\xc4\x8e\x60\xd9\xea\xda\xdb\x72\x3f\x34\xf8\xbb\x32\xfb\x9d\x95\xce\x5a\x07\xaa\x18\x2e\x6a\x07\xfa\x1b\x96\xf6\x80\xe7\xc7\x2a\x44\xcc\xa9\xab\x06\x06\x9f\x24\xe8\x1e\x30\x5e\x3d\x66\x45\x17\xaf\x02\x3f\x92\xcc\x73\x9c\x22\xfd\x64\xf1\xa4\x45\x06\x81\x97\xf8\xbc\xef\x6f\x56\x5b\x8d\x58\xf6\xbe\x83\x0c\x41\x18\x22\xaa\x13\x0a\xb9\x5e\x3c\xa3\xfb\xef\x68\x3c\x20\xa4\x0c\x41\x73\x07\xc8\x4f\x50\x62\x92\x07\x95\x0c\x77\xbb\x51\xae\xe9\x6f\xed\x52\x19\xed\xf9\xd3\xcd\xee\xf6\x9e\x8f\xa8\x4a\x63\x7d\xda\x8a\x7b\x79\x3e\x4e\x7b\xfb\xc3\x0f\x02\x09\x01\xf4\x10\x70\xda\x3d\xc2\x51\x97\x97\x59\x59\xb6\xe6\x02\x30\xe6\x1b\x51\x2f\x13\x4b\xec\x00\xe4\xa3\xfb\xf0\xc4\x30\xc6\x5a\x42\xcc\x79\xa6\x07\xce\x03\x08\x62\x60\x5c\x15\xd4\x42\x17\xea\xff\xca\x74\xf5\x7f\xfd\xaf\x7b\x0a\xdf\x4f\x98\xab\x69\xa8\xb3\x8f\x7e\x92\x09\x44\x60\x58\x77\x6b\xc7\xa3\x37\xd0\xda\x1b\xdf\x29\x48\x12\x47\x6f\x5f\x14\xfa\x5c\x08\x0c\x59\x0c\x5f\x5a\xd2\x08\xed\xf4\x77\x80\x8e\xd0\x00\x64\x98\xfa\xa1\xc3\x77\x63\x58\x71\xaa\xe4\x06\xa4\xf0\x1d\x17\xed\x12\x84\x89\x88\x34\x66\x7e\xcb\x05\xd1\x7b\x74\x08\xcd\xe8\xb3\xac\x5c\x96\xfa\xf4\xc2\x2e\x8c\xe7\x03\xfa\x1d\x00\xc1\x91\xbc\x46\x66\x55\xd3\xb6\x81\x3c\xef\x92\x14\xa0\x68\x8a\x3f\x66\x13\x24\x8d\xc3\x9a\x43\x7d\x6d\xbe\xba\xee\x91\x91\x18\xed\x52\x5f\x5f\xa6\xbc\x40\xf1\x18\xf5\x41\xff\x7e\x96\x7b\xc3\xc3\xd6\x6e\x24\xa0\xa4\xef\x77\xb8\xca\x41\x24\x75\x70\x13\x45\xa4\x0c\x63\xa7\x9c\xb5\xcf\x74\xf1\x56\x8e\x7c\x65\x45\xd3\x18\x77\x89\xb5\xd0\x8d\xdf\x74\xe5\xdd\x28\xca\x89\xa1\xbf\xba\x54\x35\x1c\x27\x6a\xfb\x15\x85\x14\x21\x08\xfc\x7c\x79\xca\x8a\x7f\xb1\xe1\xf6\xae\x3c\x15\xc4\x9d\xe8\xd9\xb6\x64\xb2\x19\xcd\x3b\x91\xad\x0b\xab\x54\xda\xfb\x2e\xca\x0f\x0d\x29\xfb\x2e\xab\x1e\x58\x9d\xd5\x67\x09\x83\xc0\xa4\xf2\xed\x40\xe2\x5c\x40\xdf\xe1\xba\x22\x50\xf9\x11\x84\x56\x18\xfd\x85\x95\x57\x31\x63\xe5\xc7\x1e\x62\x4a\x37\x50\x1b\xf8\xcd\x84\x0c\xa5\x50\x01\x21\xdc\x73\xfb\x98\xa5\x2c\xaf\x30\x1e\x6f\x2d\x72\xfb\xcd\xdd\x40\x04\x5e\x82\xa0\x6f\x7e\xce\x72\xb9\xdc\x38\x5a\x89\xe5\xdc\x75\x08\x89\x51\xd6\xb3\x2c\xa0\x5f\x9a\x3f\x2a\x0c\x43\x6e\xd8\xf6\xf6\x4e\xf6\xec\x0a\x95\xad\x42\x11\x25\xa9\x2b\xe1\xc3\x30\xa0\x81\x99\xe3\x32\x29\x8f\x16\x8f\x32\xba\xb1\x50\x58\x69\xb5\x41\x9e\x51\x13\x12\x9e\xac\x61\x53\x51\x6c\x18\xdb\xdb\xf2\xcf\xbe\x70\x99\xeb\x23\x53\x3c\x0e\x17\xd6\x6b\xac\xcf\xe5\x0d\x07\x43\xc5\x0c\xd8\xf0\xd3\x19\x5d\xe0\x51\x2f\x41\xd1\x18\x32\x6e\xd5\xdf\x99\x78\x3f\xe9\x7a\xc8\x19\xa4\x12\xae\x3c\x97\xee\x2c\x20\x1f\x4c\xc7\x34\x00\x44\xe6\x2a\x4b\xc5\x33\xe6\xa6\x54\x69\x1c\x4a\x4b\xf5\xb4\xb8\x88\x7c\x9c\x7b\x6e\x7b\xb1\xc8\x78\x56\x5d\xfc\xfd\x6a\xf8\x19\xe7\xd0\xb9\x80\x36\xd8\xd4\x67\x26\x17\x8a\xd3\x10\x6b\xdf\xd0\xa4\xe8\x01\xdb\x15\xf7\x4c\x8c\xb0\x9f\x1f\x3a\x77\xcc\xc5\xdd\x37\x69\xfb\x1b\x8d\xa5\xec\x1b\xfb\x80\xd9\x1c\x5f\x6a\x99\x89\xf7\xa9\xa2\x28\xc5\x03\x8e\xf9\x8f\xe5\xfa\xfb\xfa\xed\xf1\xa7\xf3\x59\x95\xa4\x09\xd6\x8c\xdf\x3d\xbf\x3d\x2d\x67\xdb\xf5\xf3\x98\xe9\x47\x49\x3f\x64\x64\x90\x75\xe8\x2a\x40\x16\xec\x78\x62\xd9\xbe\xb8\x2a\xfa\x56\x32\xf1\x4c\x9a\xba\x64\x45\x7d\x03\x5f\xab\xa4\x92\x54\xb4\xec\x92\x37\x0c\xc9\xe1\x25\xe0\xc5\xa8\x09\xbc\xc9\xa7\x45\xd3\x86\xc6\x9f\x82\x98\x22\xc3\xde\x46\x64\x50\x20\x72\xde\xbd\x96\xf2\x8c\x16\x1b\x32\x14\x3e\x6d\xee\x7e\xfc\x76\xed\x1d\x2a\xa5\x7c\x53\x01\xa8\xf3\x7c\x39\xf6\x7e\x24\x21\xd4\xc3\xb8\x1a\xea\x08\x3f\x7f\x40\x49\x09\x69\x25\xb7\x24\x21\x5e\x8a\xae\xf6\x89\x5d\x6e\xf0\xf5\xf7\xc2\xba\x92\x10\x9f\x81\x75\x5f\x9a\xf3\xdf\x88\x69\x0a\xbb\x62\xaf\x60\xaa\x46\x66\x18\xdd\xeb\xf3\x95\x66\x86\x24\x24\x25\x91\x2d\x91\xf9\x9e\xd5\xcc\x72\x5b\xf7\xc7\xb2\xe9\x13\xb1\x41\x42\xd2\xd6\xc1\x2e\xce\x55\xad\x8f\xc6\x3c\xfc\x22\xd5\xff\xb7\xe1\x60\x50\x90\x18\x4f\xa9\xfc\xdf\x7a\x22\x66\x92\x78\xd4\xc3\xb4\xa2\x60\xa7\xac\x66\xf9\x13\x80\x74\x4b\x4f\x12\x2f\x34\x2c\x4c\xf3\xac\xbe\x47\xc9\xef\x96\x66\xcd\x76\xf0\x3d\x43\xc8\x59\x9d\x4f\x27\x5d\xd6\xaf\xc0\xfb\x0b\x5f\x12\x9f\x71\x2c\xbd\x37\x10\xed\x57\x60\xf9\xa2\xc7\x7f\x3c\x7c\xc2\x20\x50\x41\xda\xe7\xdf\xeb\x9e\x23\x08\x53\x84\xf8\x23\x36\x69\x28\xdd\x2a\x49\x20\x4d\x7a\x03\xd9\x7f\x4b\xc4\xc0\xfe\x4a\x85\xac\x24\x61\x4c\x10\xe1\x65\xbf\x68\xc1\x8e\x8d\x87\xeb\xb6\x97\x29\x50\xa0\x24\x31\x21\x08\x03\xc9\x84\x5e\x66\x15\x86\x5c\x5e\xda\xca\xa5\x07\xf8\x80\xdc\x73\xcf\x15\x7b\x1e\x5a\x5b\x38\x85\xb7\x2d\x8b\xdb\xaf\x3c\x59\x1c\x46\x89\xc9\xa3\xd5\x2c\x77\xc5\x61\xae\x2d\x32\x96\xc6\xeb\x6a\xf1\xfc\xba\x7c\x69\x05\x4f\x9b\x16\x43\xe5\x68\x10\xc6\x7f\xf5\x13\x11\x57\x66\x71\xf3\xf3\x7e\x77\x60\xd5\xc1\x0b\xa3\xa5\x41\xad\x09\x5d\x08\xe6\xf2\x2d\xbd\xff\xb5\x97\xa6\xc4\x30\xf0\xf6\xc5\x4a\xac\x5e\xdd\x53\x1b\x9a\x97\x24\xf5\x88\xd9\xf4\xcd\xd9\xb6\x6c\x3e\xbe\x39\x81\x33\x5d\xcc\x2f\x4b\x2d\x6a\x5d\xb6\x58\xce\x76\x59\x4b\x92\xfa\x81\x63\xc3\x35\x04\xb3\x46\x6b\x77\xf8\xfc\x2c\x4c\x44\xcb\xc9\x3f\x2b\xa4\x0d\x51\xd8\xb8\xfd\xb9\x93\x71\x92\x84\x45\x02\x63\x55\xac\xae\x9b\xf3\x25\xcb\x9b\xcf\x8c\x80\x85\xac\xd8\x23\x12\xbd\xb7\x8f\x0f\xb6\x18\x49\xb8\xc7\xc1\x38\xbb\x12\xe0\xd8\xdc\x3d\x2b\xf6\x95\x7b\x45\xee\x27\x4e\x79\x6d\x76\x3a\xad\x07\xa8\x17\x49\x78\x44\x90\x48\x68\xb9\xba\x9b\xbd\x3d\x6c\x57\xcb\xdd\x66\x3b\xdb\xbe\x6d\xda\xab\x45\xdc\x96\x36\x2d\x70\xc8\x8d\x7b\xf2\x4f\x28\xf5\x03\x14\x7b\x17\xcf\x97\x84\x03\xc5\x04\xca\x7f\xbe\xfd\xa3\xaf\x91\x21\x89\xf0\xa5\xb2\xd3\xd1\x2a\xfd\xcd\xda\xe9\x20\xfd\x98\xfa\x6e\x18\xeb\xfa\x32\x35\x8a\x32\x30\x95\xde\xdf\x58\xf6\x83\xf5\x30\xad\xd7\x67\x94\x24\x52\xc6\x06\xe4\x52\x41\x69\x79\xa0\xe1\xd3\xfd\x18\x90\xd0\xf9\x90\x2f\x1a\x6b\xa4\xbb\x9f\x73\x9b\x1e\x50\x9f\x9b\xc0\xfb\xdc\xf7\x06\xb3\x6b\xb8\xc6\x20\xe1\xb8\x2e\xf7\xd9\x07\x9c\x9a\x9b\x4d\x1b\xdd\x92\x40\x4a\x42\x0b\x98\xd8\x61\x5d\x9f\x35\x67\x7a\xdf\x4f\x79\x46\x43\x5f\xe8\xac\x4f\xef\x2f\x29\x49\x4c\x9d\xe9\x7c\xb5\xd8\xfe\xef\xb0\x73\xcd\xb5\x09\x9a\x11\x32\x93\x2f\xa5\xfe\x68\xef\x49\xa9\xc2\x23\x62\x79\xb7\xe9\x45\x15\x25\xa5\x42\xa0\x6b\x88\x8c\x7b\x0b\xda\xfe\x59\x41\x60\x0a\x8a\x3e\xf4\xfb\xb5\xe0\x90\xed\xe5\x51\xf0\x7d\x13\x10\x93\x77\x46\x02\xc0\xdd\xc0\x4b\xcc\x1a\x50\xba\x7c\xdf\xf6\x4e\x89\xbf\x84\xd7\x0c\x86\x91\x7a\x42\x90\x4e\x1d\xe9\x21\xe3\x25\x2b\x33\x36\x9d\xbf\x91\xd4\x07\x4e\xbc\xd6\x9b\xd9\x08\x56\x5c\x4d\x2b\x1a\x12\x03\xa0\x6b\xc1\x85\xdf\xc0\x42\xee\x96\xce\x4c\x69\x23\x0b\x92\x86\x91\x44\xfa\x56\x4b\x18\x6b\x39\x48\x66\x85\x5c\x09\x6d\xdc\x98\x89\xdc\x72\xe3\x79\x32\xcc\xd8\x3f\x5e\xb6\xd7\x3c\x60\x53\x9f\x2d\x21\x46\x21\x74\x87\x7b\xc6\xd7\xfb\x23\x4d\x12\x8e\x79\xb1\x66\xb6\xcf\xa1\x9e\xe2\x3c\x74\x3d\xd3\xc8\xb1\xdd\x43\x3d\x25\x77\x23\x69\xd2\x2c\xd5\xff\xfa\x7f\xff\xf5\xef\xb3\xae\xbf\x8e\xe9\x49\x9a\x7a\x1e\xb7\x05\xd0\x6b\x9b\xc2\xba\xc2\x05\x4a\x9a\x72\xe9\x59\x53\xff\xbb\xae\x61\xa1\x8f\x7d\x19\xc6\xd1\x1d\x21\x45\x5d\x9a\x9d\x60\x79\x6e\x99\x7d\xc6\x24\x61\xb7\x8c\x88\xab\xdd\x9f\x32\x1a\xf3\x60\x50\xb6\xbc\xb8\xaa\x34\x91\x94\xf9\x09\x56\x32\x5a\xf0\xfc\x13\x2b\x85\xfe\xed\xb6\xe5\x28\x29\x8b\xa5\xab\xc0\x9d\x6b\x3d\x54\x92\x97\x94\x31\x2f\xec\x8b\xf0\xbc\x15\x15\x38\x79\x84\x3b\x6d\xf7\x1a\xdb\x97\xfb\x29\x1e\x1f\xcd\x92\x67\xfb\x76\x71\x72\x30\xfa\xe9\x95\x56\xf5\x82\x9d\x70\x60\x5d\x9b\x08\x13\xcf\x24\x6c\x3f\xde\x5a\xa9\xcd\x29\x94\x53\xd3\x55\x22\xfc\xa2\x57\x0e\xb3\x28\x2f\x55\x8b\x3d\x96\x54\x12\x89\xf4\x89\xf0\x53\x4b\xa7\x39\x21\xa9\x04\x85\x94\xdb\x65\x0b\x4e\x9a\xf2\x63\x24\x05\x65\x2c\x2a\xa9\x8b\x77\xb8\x18\x65\xd2\x11\x00\x5b\x7a\xc4\xe7\xd2\x32\x56\x5a\xba\x9b\x49\x93\xca\x23\xb1\xd9\x90\xa0\x3e\x74\x8c\x45\xf6\x89\x3c\x1a\x1b\x02\xfe\x0a\x59\x27\x86\x17\x7a\x44\x60\x71\xac\x25\xcd\x7a\xe9\xe5\xb0\x5d\x0f\x4a\xd1\xbd\xe9\x02\x24\xef\x50\x4c\x6e\x3e\xa3\x3b\x07\x21\x46\x8f\xe7\xaf\xb3\xa7\xe5\xa6\xbd\x5b\x44\x11\x1a\x6d\xa5\x64\xef\x58\x9e\x63\xb0\x76\x74\x6d\x9a\x10\x83\xf7\x3e\x61\x5c\x73\xa1\xb3\xe2\x31\x2b\xea\x61\x96\x46\x7a\x9e\x10\x88\xcf\x11\xb8\x2a\x6a\x80\xbf\xeb\xac\x68\x96\x49\x39\x0d\xcd\x96\x9e\x27\x03\x77\x90\xef\x72\x56\xd5\xbb\xac\x86\xe3\x2e\x2b\x50\x38\x64\x58\x20\x2d\x3d\xdf\x0f\xd0\xe5\xaa\x4e\x68\x6c\x3c\x6a\x79\xce\xdb\x0f\xed\xf9\xb1\x99\x67\x78\x20\xe1\x91\x83\x92\x70\x6d\x33\x93\xa8\x3c\x30\x53\x65\xf6\x0d\x58\x5e\x1f\xba\x50\x91\xf4\x7c\x69\xaa\xd4\x33\x47\xab\xd7\x96\x98\x5e\xcd\x01\x1f\x08\xaa\x88\x7d\x83\x3c\xd7\xbf\x78\x72\x79\xbe\x32\xb0\x4d\xd9\xec\x18\x27\xdd\x32\x66\x75\xcd\x60\x34\x6f\xa0\x8b\x8c\xf5\xab\xa8\xbc\xff\x19\x7d\xce\x20\x96\x18\xa1\x3f\x41\x79\xcc\xaa\x4a\x17\x70\x55\x92\xee\x7a\xca\x10\xf1\xea\xdb\xd5\xe2\xdb\xd3\xf3\x7c\xbd\xed\x1f\x91\x5e\x28\x00\x43\x5f\x3c\x93\xcf\xc5\x84\x68\xab\xed\x16\x45\x46\xd0\x7b\xf6\x3a\xfb\x85\xb7\x8d\x94\x51\x71\xd9\x40\x9f\x76\x18\x6d\xd4\xf1\x24\x1d\x5c\x17\x73\x8a\x1e\x85\x21\xa8\x9f\x43\xfd\x5b\x5f\x02\x52\x7a\x89\x52\x58\xb6\xc2\x73\x26\xde\xfb\xac\xd3\xa3\x59\x95\x86\xdc\x1b\x12\x84\xac\x8b\xaa\x6e\x6e\xda\x8b\x80\x48\x2f\x15\x0c\x59\x89\x41\x57\x2d\x6e\x60\xa0\xed\x29\xbd\x54\x4a\xd6\xd5\xd6\x0d\xd2\x1d\xb6\x07\x23\x0c\x0b\x08\x76\x26\x6e\xb7\xaa\x1b\x87\x26\xdf\xd4\xba\x44\x44\xa5\xc9\xe4\x4c\x6e\x39\x1e\xf3\x53\xd9\x61\x07\x3b\x39\x34\xd7\x9c\x1a\x99\xe7\xc7\xf5\xd3\x6e\x31\x7b\x5d\xee\x5e\x5e\xd7\x8b\x55\xdb\xaa\x42\x23\x7e\x30\xa0\xbb\xbc\xfd\x4d\x9a\xa1\xed\x4a\x26\xa6\xc5\xbc\x9b\x5e\x40\x7c\xab\xeb\x94\xe5\xb0\x07\x39\x3f\x97\xe3\xc9\xc0\xbd\x88\x18\xee\x17\x91\x1d\x59\xfe\xe4\x32\x6a\xd2\xe3\xcc\x47\x2d\x24\xe4\xe9\xdc\xd4\xa5\xb7\x6e\x03\xd7\xa3\xa7\xe1\xb4\xcb\x02\x4d\x8f\x0e\xe7\x0a\x29\x51\x76\xc6\x05\x98\x5f\x1a\x4b\x4b\x1c\xe0\xe6\x11\x7a\xf3\xe8\xf4\x04\x35\x55\x84\xb3\x12\x0a\x76\xca\xd9\x65\xb0\x04\x24\xf3\xfc\xb4\x6f\x34\x35\x3b\xd6\x97\xe8\x8a\xe6\x1a\x86\x85\xdd\xa5\x8b\x56\xb5\x32\x13\xed\x5d\x81\x1a\xfa\x78\xcc\x47\x6d\x7f\x6e\x59\x35\xde\x56\x81\xca\x20\x75\xb4\xee\x59\xc9\xc4\xe1\x32\xda\xf1\x20\x62\xe8\x66\xb4\xf5\xa5\x46\x91\xb0\x9d\x9e\x90\x88\xd4\x5a\xff\x43\xee\x34\xe9\x81\x88\x91\x42\x0c\x27\xcd\x2e\x75\x7f\x56\x4c\xfa\x0e\xeb\x7c\x62\x9f\x85\x81\xfe\x19\xb7\x6d\xaa\x86\x4c\x7a\x0a\x58\xdc\x51\x56\x1a\x1e\xa6\xdf\xa6\x7a\xfa\x34\x16\x98\x8e\x3f\x66\x39\xb0\x3d\xa0\x3f\xd2\xb7\xfd\x7d\x9a\x72\xd6\x12\xda\x61\xc1\xd9\x6c\x5c\x1f\x37\x98\x26\x3e\x85\x04\x19\xab\x76\x35\x1b\xfb\x48\xb6\x87\x97\x44\xca\x22\x19\x87\x08\x97\x9e\x03\xe4\x7b\x2c\xc0\x88\x00\xe6\xa2\x7f\x11\x02\xef\x2e\x55\x29\xce\xe8\x23\x7b\x87\x91\x2c\x81\xf4\x7d\x3f\xe4\x2e\x4e\xfd\xf4\x34\x5f\xe0\x13\x4c\xce\x66\xdf\x0f\xa9\x6f\x38\x1c\x1b\x7f\xa2\x0f\xf4\x91\xbe\x0f\x1e\x95\x2e\xfd\x60\xf4\xd1\x0d\x2d\xdf\x60\xba\xf8\x81\x97\x72\xc3\xf0\xf1\x01\xb9\x3e\x1d\x5b\x43\xcc\xdd\x27\x08\x02\x0c\xc5\x9a\xca\x40\x5d\x5e\x36\x50\x66\x50\x39\xc1\x76\xbb\xa9\x27\x6d\x6f\x8e\xb7\xab\xf6\xb5\x2b\x0f\x70\xa6\x1c\x32\x73\x13\x34\xa5\xea\x92\xf5\x11\x1e\xd2\x0f\xa5\x40\xa4\xc6\xec\x7e\xf6\x7d\x35\xb5\xb6\xfd\x48\x84\xa9\xf5\x7f\xd1\x3e\x7c\x56\x2e\x1e\x3a\x9c\xdd\x7e\x4c\x02\xc7\x0f\x39\x3b\x9d\xf2\x4c\xb0\xa2\xae\x06\x0e\xb8\x1f\x07\x86\x5d\xdf\xc4\xb1\x10\x5e\x6f\xdf\xb9\xf3\x35\xfd\x38\xa2\xd4\x66\x31\x96\xf0\x31\xa1\x57\x27\xfd\x38\x25\x89\x65\xf1\xda\x40\x5d\x8f\x08\xb9\xa5\x1f\x8b\x80\x72\x77\xb2\x34\xc7\xbe\x63\x4d\xb6\xed\x09\x35\xaa\xfa\x1d\x54\x12\xcf\x82\x75\x65\x93\x7d\xae\x5b\x12\xc5\x6d\x45\x82\x0d\x89\xb4\x4d\x49\x6a\x41\x14\xa6\xa1\xf1\xb3\x0a\x5b\xb1\xde\x27\xda\x1c\x0e\x66\x92\x4a\xac\xb2\xc9\x2a\x04\x39\xcd\xe4\x07\x94\x15\xb3\x32\x95\xc9\x60\x96\x27\x5c\x79\x5d\x42\x60\xee\xce\xc8\x11\x16\x4a\xfa\x89\x8c\xd0\xc6\x6c\xd9\xf2\x07\xe6\xa9\x9f\x28\xce\xfa\x06\x26\x2a\x75\x4f\x07\x02\xfc\x34\x34\xf2\xf0\xce\x3d\xe8\x21\xfa\x5e\x74\x7b\xc7\x34\x34\xac\x43\x1d\x81\x87\x3b\x17\xd7\x4b\x93\x12\x1e\x3e\x20\x23\x21\xf2\xb3\xe1\x2b\xf4\xb7\x6a\x9f\x53\x1e\xc4\xbd\xdf\xbb\x83\x1b\x0c\x59\xd2\xe7\x8a\xe2\x5b\x9a\x05\x67\xdc\xc2\xe7\x8f\xee\x7b\x08\xc2\x31\x98\xb6\x78\x7d\xfe\xb1\x44\xe5\x88\xe5\xdb\x2b\x46\xfa\xdb\x1e\x09\xf7\x6c\xed\xf9\xe6\x3d\x3b\x5d\xe3\x7c\xa4\x2f\x52\xe2\x0a\xa4\x2c\x32\x66\x7e\x59\x8f\xe7\x9e\x90\x06\x2e\xe0\x6a\xce\xcc\xab\xa3\x35\x34\xf8\xd4\x12\x68\x20\x1c\x99\xfb\xc9\x3d\x05\x10\x90\x2e\xd4\xe5\x50\xfb\xc6\x97\x7c\xd1\xd5\x04\xd9\x80\xf4\x81\x1b\xb4\xff\x29\x17\xa5\xc1\x26\xb7\x8b\x17\x54\x80\x87\x12\xd2\x58\x36\x16\xf6\xb3\x00\x56\x58\xe6\x25\x3a\xfa\x0c\x2a\x8d\x3d\xe8\x84\xae\x0f\x59\x7e\xb5\x79\xba\x9e\xca\x47\xd3\xfb\xa0\xcf\x15\xcc\xf2\x4f\x76\xa9\x7e\x64\xed\xbe\x14\x10\x9a\x04\x5e\xab\xc1\x0e\x8f\x0c\x75\xbf\x46\xaa\xa0\x32\x20\x5e\x18\x99\x2d\x12\xe3\x35\xcd\xfa\xeb\xfb\x97\x01\x4d\xc0\x70\x65\x9b\x4a\xb3\x4c\x58\xa4\xc6\x60\x7f\x0a\x28\x8f\x30\xd8\xf0\xf8\x6d\xd1\x9f\x3a\x41\x10\x33\x6a\x0f\x5b\x1b\x0b\x76\xf9\x46\x19\x04\xa9\x91\xff\x2d\x31\x8c\x35\xd7\x65\xa9\x3f\xc7\xb1\x95\x20\x48\x7d\xd5\xae\x6d\x3c\xdb\xec\x1a\xec\x19\x08\xb4\xed\x2c\x3c\xa4\xc1\x7e\x3a\xcb\xd6\x13\x0e\x02\x88\x31\x56\x77\x2e\xae\x64\x53\x6c\xa6\x4c\x06\x21\xe1\xa8\xd5\x69\x5e\x0a\xf3\x7e\x37\xf0\x9e\xee\x02\xcf\x43\xcc\xd1\xdc\x20\x83\x0d\x87\x8d\x6b\x4b\x19\x4e\x4f\xbb\x65\xcd\xb2\x72\x50\x26\x27\x83\x28\x09\x92\xb4\xe7\x1c\x5f\xd9\x56\x37\x18\x81\xed\xe5\x31\x49\x92\x96\xd1\x6c\x67\x6b\xde\xbf\xf6\x43\x83\x38\x48\x55\xe0\x8a\xd3\xcc\xb2\xbc\xd3\x25\xf2\xb4\x6d\x6a\xb8\x91\xa3\x08\xe2\x80\xa7\xcd\x96\xb0\x2a\xf6\x25\xfb\x80\xb1\x6c\xdd\xdf\x26\xd8\x67\x64\x10\x87\xe6\x5c\x78\x79\x45\x46\xef\xdd\xfc\xf9\xe9\x6d\xb3\xfb\xfe\xbc\x5d\x3f\xdd\xbb\x11\x88\x13\x29\x59\x5b\x18\xd0\x9c\xa9\x6f\xa7\x13\x94\x73\xdd\xe9\x73\xc8\x20\xf1\x69\x62\x39\x49\x16\x8b\x6f\xa6\x1e\x83\x7a\x83\xd5\x1b\x24\x91\x6f\xe5\xaf\x1a\x63\x1e\xcf\xef\xc6\x9d\xaa\x56\xfd\xfb\xc4\x71\x4a\x5a\xfc\xfa\x74\xa6\x23\x48\x62\x23\x46\xfb\xa0\xf7\x56\x2b\xc8\x35\xc8\x08\x4b\x2e\x0c\x36\x70\x30\xb9\xd3\x20\x02\x68\x77\xd8\x1e\x7f\xeb\x93\x2e\xfe\x03\xa5\xb6\x33\xbe\x32\xbb\xed\x64\xb4\x2a\x48\x13\x81\x4e\xdb\xeb\x6c\xbb\xda\x3d\x3d\xef\x96\xeb\xcd\xa2\x63\x23\x92\x41\xaa\x42\x0c\x3c\x98\xc0\xff\x08\x94\x31\xbc\x15\x8b\xb9\x74\x54\xa4\x6d\xac\x68\x76\x9d\xad\xfb\x3f\xfe\xd7\xfd\x8a\xf0\xb1\x62\xf2\x41\x7f\xf4\x98\x7f\x65\xc0\xbd\x00\x97\x19\x3f\x5f\x9e\x8b\xc6\x60\x3d\xd7\x60\x15\x64\x06\xb3\x2b\xe9\x80\x83\xbd\xcc\x43\xc0\x3d\x81\xa0\x72\x3e\x26\xbe\xbb\x42\x17\xca\x80\x87\x21\x62\x90\x8f\xba\x68\x96\x0f\x32\x12\x6c\xf5\x44\xc0\x3f\x10\x24\x54\xd4\x01\x10\x2a\x7d\x2e\x05\xa2\x3a\x6b\x66\x43\xf5\xff\x1d\xfe\x8f\xdd\x41\xdc\xbf\x7c\xef\xbf\x43\xf7\x3b\x42\x12\xe3\x29\xd6\x32\xcf\xb8\x7b\x51\x29\x81\xf4\x13\x95\x6d\x3e\xf9\x59\xad\x6b\x38\x56\xd6\x09\x1d\x6e\xeb\x01\x78\x2a\xb6\x12\x13\xcb\x92\xed\x6f\x53\x1e\xb9\xfe\x7e\xaa\xac\x39\xf7\x60\xce\xb8\xe6\xe6\x03\x71\xc4\xe1\x05\x8a\x18\xf0\xeb\x12\x3e\xaa\x23\x33\x54\x65\x77\x9d\x91\x14\x12\xe2\xbb\xe2\xde\x2d\x08\xc3\x40\xed\x4d\x5a\xf7\x21\xf1\x3c\xb4\x45\x1a\x8f\xac\x6a\xaf\x8f\x08\xee\xd6\x3f\xf4\xe7\xe3\xb9\xca\xc4\x32\x63\x47\x5d\xc8\x6b\xa9\x13\x19\x92\x54\x58\x6c\xd8\xa8\xfd\x0b\xcc\xa8\x0c\x89\x94\xd4\xf0\x5b\xc9\x5e\x00\x0e\x91\x77\xee\x19\x7c\xdf\xc3\x5a\x06\xc7\xb6\x6e\x0e\x62\x53\xd9\x37\x7c\x04\x3f\x90\xe8\xc6\xe6\x7a\xdf\x0c\xc4\x6c\x0f\x23\xe1\xcd\x2b\xf7\xb5\x9d\x8a\xa1\xcf\x0d\xb4\x0d\x55\x73\x1e\xe0\xd5\xad\xc5\x30\x08\xa4\xe0\x03\x3d\x12\x84\xd4\xf6\x7c\x93\x30\x48\xa1\x97\xa3\x69\x83\x30\x8e\x15\xee\xfd\x22\xae\xc5\xbb\xfa\xbf\x1d\x52\x8a\x43\xbf\x73\xe8\xd8\x4d\x2f\x34\x35\xfc\x4a\x61\xaa\x6c\x1c\xa3\xc6\x02\xc8\xd2\x49\x51\xdb\xf4\xec\x70\x29\x84\x91\x97\x3a\xe6\x48\xcb\xdb\xfa\xaa\xf5\xb0\x86\x59\x86\x91\xef\x19\x79\xeb\x5a\x97\x30\x3b\xd7\x07\x28\x9a\x57\x68\xa5\xe4\x5c\xb7\x24\x71\x6c\x51\x16\x2a\xf3\x92\x89\xfa\x5c\xc2\xf4\x93\xc6\x96\x9e\x02\x2b\x6f\x97\x4f\x9b\x7f\xea\x62\xe4\x09\x84\x31\x33\x79\xf9\x73\x51\x42\x73\xad\xe3\xa1\x93\x61\x2c\x00\x03\xf0\x50\x1f\xee\x74\xf9\x98\xe5\x50\xd5\x2d\xeb\x96\x0c\x13\x16\xcb\x16\x05\x55\xd7\x58\x12\x3f\x56\x5f\x95\x61\xaa\x94\x34\x9b\xf8\x4f\x33\x67\x8c\xa7\x67\x5b\x19\x35\x3a\x39\xa7\x52\x1f\x75\x0f\x64\x27\x43\x96\x28\xcf\x3a\x30\xab\xc6\x03\x9f\x92\xe0\xb4\x5d\x79\x4c\xf1\x50\x3f\xb0\x6a\xae\xf5\xb5\x03\x10\xf2\x24\x8d\xa0\x35\x8d\x1f\x7b\xf5\x63\x13\x8b\x81\x2b\xd1\xf2\x00\x41\xf9\x91\x09\x14\x95\x9d\x5f\x9a\x13\xe0\xb7\x09\x00\x8e\x0c\x05\x8d\x92\x66\x83\xd1\x4a\x89\x03\xcb\x8a\xb7\x53\xae\x99\xfc\xe2\x27\x44\x10\x61\x30\xe5\x47\x07\x12\x09\x45\x44\x31\x41\x7a\x72\xc5\x0b\xbd\x78\x4e\x28\x64\x0a\x71\x4b\x20\xbb\x7d\x76\x17\x49\x2f\x89\xbc\xae\x8e\x0c\x23\x25\xc3\xb1\x91\x91\x8f\xe0\xca\x63\x56\x18\xa4\x43\x8f\xd7\x44\x86\x92\x71\x74\x7b\x59\x55\x41\x59\xff\xa9\xcf\x8d\x4f\xec\x90\x03\x93\xbb\x63\x73\x09\xfa\x2a\xff\x60\x35\x2b\x7b\xa7\x50\x08\x9e\xc0\x72\x2b\x26\xa5\xd3\x85\x9e\xfe\x5c\x10\x44\xc2\x0a\x7a\x18\x0d\x39\xfb\x77\xe5\x07\x26\x52\x73\x3e\x7e\x63\xa5\x5c\xb0\x93\x83\xff\x06\x6d\x17\xee\xea\x11\x40\x1a\x86\x17\xab\xfb\xd8\x9f\xf4\x11\x09\x03\x4c\x33\x3e\x6a\x21\x58\xef\x11\x23\x12\xc6\x5e\xea\x32\x4a\xed\x0e\xd1\x0f\x91\x46\x24\x12\x68\x8e\x4a\xf8\x18\xd2\x3f\xca\x88\x86\x2a\x68\x69\x63\x74\x85\x97\xb5\xc6\x7a\xe4\x51\x4e\xd1\x2c\x65\xfa\x91\xf5\x6d\x95\xc8\xf3\x24\xb1\x24\xaa\x06\x8a\x70\x2d\x4e\x3b\x78\x7c\x8f\x4b\x66\x83\x2c\xe8\x73\xdb\x00\x41\x1f\x69\x10\x79\x8a\xe2\x57\x40\x7e\x39\x5d\x4e\x5b\x38\x91\x4f\x19\x46\x3c\xe6\x0f\xcf\xbb\x97\xd5\xeb\xee\xc7\x6a\xed\x1e\xca\x67\x41\xd4\x62\x60\xde\xaa\xb6\x0c\xdb\x36\x07\x0c\x02\xde\xb3\x93\x31\xf5\x30\x3a\x58\xa3\x40\x99\x4a\xae\xc7\xf5\xd3\x7c\xb5\xdd\x29\x5d\x3e\xbf\xce\x16\x0f\xeb\x7f\xba\x98\x6d\x14\x7a\x02\x09\x3b\x10\x68\x5b\x38\xcd\xae\xb6\x35\xb4\x1c\xf7\x52\xce\x1c\xc9\x93\x5c\x63\xf5\xe9\x80\x93\xcf\x75\x97\xb1\x89\x5e\x37\xfe\xb9\x61\xe2\x69\xe9\x74\x4e\xe7\x6b\xbe\xf1\xe1\xd5\x91\x34\xb5\x27\xd9\xf1\x94\xef\x1a\x3b\x2d\x58\x66\x58\x9c\x34\x2d\x14\x25\xa3\x08\x0c\x4d\x11\xd4\x87\x6e\x4d\xd8\xb6\x38\x96\x38\xc3\xfe\xd5\x4c\xae\xc1\x76\x1a\x25\x11\xa1\xb4\x75\xad\xc6\xa5\x48\xae\x13\x70\xa3\x4d\x8f\xf4\xc0\x37\x16\x4a\x94\x46\x81\x93\xea\x9b\x43\x55\xcf\x8a\x3d\xe4\xc3\x69\x90\x0a\x86\x53\x05\x7e\x9e\x1e\xf5\xd7\x05\x72\x32\x62\x24\x44\xd0\xa6\x30\xac\xa7\x95\x29\xbf\x77\xaf\x84\x0e\xdf\x7f\xfd\xbf\xff\xfa\xa6\x65\x0e\xe5\x63\x3f\xb4\x1b\x31\x50\x88\xa7\x98\x03\xab\xad\xf8\x67\x2b\xc7\xdb\xdd\x81\x7b\x22\xb5\xeb\xe3\x21\xab\xfe\x42\x52\x7e\xf4\x6c\x3c\x34\xf5\xfc\x46\x39\xda\xb1\x4a\xb8\xc6\xd4\x70\xed\x1a\x94\x77\xcd\x44\x6d\x2d\x8a\xc1\xb2\x11\x49\x1c\xd9\x5a\x19\x57\xf1\x5e\x40\x5e\x0d\x56\xb7\x90\x34\x00\xc3\x0b\xf0\xa0\x8b\xfd\xea\x27\x94\x22\xab\x3a\xef\xaa\x9f\x81\x4a\xfe\xe7\xc6\xb3\xca\x94\xe3\x71\xd3\x7c\xf7\x66\x6e\x3c\x7f\x1f\xe6\x50\x22\xa9\x8c\x5c\x54\xb3\xcd\x98\xe0\xdc\xfa\xd6\x24\x03\x1a\x86\xe0\x8e\x73\x13\x27\x69\xc6\x76\xf1\x3c\x9a\x30\xc0\x0d\xef\x4b\x73\x28\x65\xc5\x3e\x87\xcd\x99\xa3\x3e\xd9\xe5\x2b\xb4\xb8\x8c\x40\x99\x10\x99\xad\x25\xd8\x5e\x4e\xd3\x32\x6a\x32\x52\x09\x51\xed\x2f\xec\x0b\x56\x77\x6c\xd3\x32\x26\x09\x25\xac\x95\x0d\xcf\x8a\x65\xc9\x3e\xaf\x0f\x9b\x98\x28\x03\x8c\xff\xc7\x39\x13\xef\xa6\x20\xc4\xb6\xd0\x80\xd0\x01\x09\xd4\x63\xe3\x6c\x3c\x9f\x6b\xa1\x8f\xd0\x38\x4b\x26\xba\x28\x7f\x1b\xdc\x8f\xc6\x51\x04\x2d\x3d\xfa\x06\xc9\x18\xe5\x38\x7a\x16\xd3\x18\xd0\x27\xd9\x39\x98\xd8\x3f\xce\x70\xb6\xa9\x2b\xd7\x85\x51\x24\x7e\x42\xf5\xd4\xb7\x97\x97\x87\x3f\x77\xcf\x77\xa6\x2e\xb5\xed\x22\xcc\x21\xde\xb2\x0a\x22\x1e\x64\x5a\x8b\xab\x3f\xef\x62\xcf\xf3\x04\x6d\xab\x7c\x8d\x8d\x83\xe9\xe9\xe1\xd8\x78\xbe\xc2\xc4\xda\xe3\xe2\x90\xb9\x58\x57\xec\x49\x81\x0c\x20\x08\x0c\x77\xa1\xab\x2e\xd0\xd9\x5d\xed\x53\x09\x5d\x59\xf4\x4b\x63\x2d\xb9\x28\x37\xcf\x6f\xaa\x94\xb8\x8b\x3d\x00\x66\x9d\x02\xb3\x5b\x79\xc4\xd9\x22\x71\x40\x29\x7a\xc1\x06\xc0\xff\x04\x65\x9d\xb1\xe9\xc9\x14\x07\x3e\x41\x12\x85\xd7\xd5\x62\xb5\xfe\xbe\x7a\x75\x6f\x11\x28\xc3\x64\xdd\x7e\xdc\x45\x9b\xcc\x1f\x07\x10\xe3\x30\x0c\xa4\xc5\xa5\x1b\x0c\xa0\x59\x20\x2b\x0b\x81\x3e\x77\x3c\x24\x32\x8e\x7c\x0f\xf3\x81\x0a\xb3\xee\x8e\xfa\xd4\x68\x05\x8c\x6e\x1b\xf9\xa9\x82\xff\x75\xfd\xe7\xe0\x3b\x46\x81\x87\x75\x1b\x4b\xc8\x4f\x87\xac\x7f\x82\xc7\x51\x10\x23\x84\xeb\xf9\x34\x28\x92\x1c\x4e\xc3\xd8\x4f\x90\xed\xbe\x99\x63\x46\x98\x79\xb6\x7c\x7e\xd9\xae\x96\xbb\xd9\x1f\xeb\x95\x03\x20\xc4\x89\x14\x46\x93\xa8\x39\x78\x7f\xb0\xa2\x60\xf3\xf3\x65\x90\x1e\x89\x13\xe5\x23\x58\xd9\x68\x81\x1b\x0a\xac\x1e\xcd\xa0\xa9\x0d\x9e\x8c\xa5\xc4\x69\x64\x64\x12\xac\x40\x87\x99\xea\xb3\x75\xfb\xa9\x52\x91\x7a\x6d\x9d\x6c\x9f\xfb\x67\x3a\xe4\x10\x33\x1a\x40\x3b\xb9\x4d\xca\xef\xe5\xcc\xf3\x4c\xf4\x10\x1a\x31\x0b\x15\x4a\x64\xb1\x73\xad\xfb\xb0\xab\xef\x19\x5b\x6d\xbf\xf5\x01\x4d\xed\x86\xc2\xa2\xd8\xe8\x4b\x36\xa3\x30\x3c\x5c\x63\x4e\x52\xcc\x92\xac\x8b\x0c\x81\x49\xb7\x06\x9c\x47\x09\x62\x57\x41\x66\xf5\xa0\xb2\x7e\xc2\xf0\x1e\x9b\xe0\x31\x8f\x8c\x95\xcf\x11\x02\xb6\x59\xad\x96\x9b\xac\xef\xcc\x8e\xe8\x49\x65\xcc\x99\x12\xb1\x2b\x75\x9c\x5e\x6e\xe3\x2b\x94\x44\xa6\xd2\x05\xab\x0e\xa2\xbf\x19\x8a\x28\x92\x06\x78\x95\xe7\xb3\x3c\x7f\xcc\xf2\x77\xd7\xd4\xf8\x4b\xa2\x8d\xb9\xe6\xac\x1b\x15\xa9\x48\x62\xa0\x26\x45\x75\x76\x10\xa0\x18\x08\x35\x3a\xda\x3a\x7f\xbf\x87\x02\xaa\xec\xda\xb8\x1c\x6f\x0e\xc3\x51\x04\x2f\x42\xea\x8d\xc6\x1a\x3f\x1a\x32\x9a\xc7\xac\x30\x44\xf6\xd5\x80\xa3\xf0\xc6\xee\x02\xcd\xfa\x37\x56\xdc\xdf\x35\xdf\xbc\x67\x79\x3e\x45\xed\xd0\x74\x14\xf8\x6e\xa6\x18\xf6\x91\x65\x45\x0d\x05\x73\xc5\xe1\xae\x53\xe3\x58\x36\x2f\x84\x29\x9a\x87\x96\x3a\x45\xc6\xc0\x43\x24\x8d\xc7\x0c\x7a\xd8\xfe\x55\xfa\x58\xee\x0a\x86\x10\xd9\x85\xbd\x46\xef\x28\x53\xcc\xd3\xae\x72\x38\x65\xfb\xc1\xd2\x06\x00\x83\x35\xc5\x87\x5a\xe3\x8b\x55\x9d\xc2\xc9\xdf\x46\xd3\x46\x11\xcf\x4c\x9b\x31\xfd\xc7\x7f\xd3\xe8\x7f\x46\x23\xab\x02\x42\x79\x67\x6f\x35\xd3\xb9\xb5\x69\x62\x95\xca\x38\x72\x6a\x5d\x86\xa2\x05\xc5\x24\xda\x15\xa2\x58\xe0\xdb\x6a\xff\x3a\x87\x3b\x00\x53\x31\x89\x30\xec\xe9\x0f\xa1\x98\xc4\x75\xc3\xcf\x57\x90\x6c\xd7\x43\x19\x42\xb6\x03\xab\x7e\xe8\xf2\x7d\x28\xc2\x25\x13\x62\x59\xbc\xff\x90\x4c\xf4\x07\x29\x21\xcc\x20\xf1\x8c\xb3\x50\x74\x15\x20\xd2\xd9\xd0\x55\xdb\x15\x54\x1a\xb8\x0d\xc3\xa5\x59\x47\x76\x42\x42\x89\x42\x40\x98\xe1\x88\x31\xb4\xa6\xa3\x1e\x09\x31\x4c\x9e\x07\xfd\x69\xc4\x8a\x5c\x83\x90\x68\x64\x7e\x64\x79\xce\xf6\xd0\x23\x52\x95\x09\x95\x11\x06\xee\xcc\x21\xb9\x34\xba\x10\x0f\x8d\xb9\xa4\x8b\xfd\x82\xdd\x56\x24\xfa\x72\x1d\x27\x54\xf9\xc6\x8b\x62\x65\x01\x97\x2a\xf8\xc6\xc4\x3b\x94\x9b\x13\x13\x30\x18\x25\x8f\x19\x06\x49\x04\x0c\x14\x2c\x37\xe7\xdb\x95\xde\xf0\x0d\x50\xe6\xe8\x47\x3d\x29\x98\xd3\xdb\xc4\xc2\xad\x03\xab\x0e\x0b\x5d\x96\x20\xea\xb6\x00\x57\x26\x7e\x42\x91\x30\xce\x20\x4d\x97\x50\xd5\x99\x89\xcf\xdd\x8e\xb6\x75\x61\x85\xc4\xe7\xa6\xf6\xe5\xde\x21\xdf\xfb\x07\x62\x12\x84\x66\xff\xaa\xb5\x39\x71\xdc\x9f\x81\xf2\x4e\xc6\xaf\x23\x0e\x18\xd7\x6f\x63\xb5\x3f\x8b\x9c\xc3\xcc\xf8\xe8\x13\x07\xc0\x10\x1b\x71\x34\xfc\x18\xee\xd0\x1e\x1c\x85\x49\x94\x02\x1e\x85\x3b\x0c\x4e\xfb\xbb\x4c\x68\x2b\x40\x33\x92\x2c\x96\x49\x24\x28\x96\xdf\xde\xb3\x23\x96\x5d\x66\x53\x1c\x5d\x89\xeb\x0c\x40\x0c\x0f\x53\x55\x3d\x77\xcf\x6f\x5b\x63\x6a\xf8\xb2\x8d\x4d\x34\x39\x6d\xda\x45\x13\xfb\xbe\xf1\xc4\x91\x93\x15\xae\xf1\x16\xd7\x87\x4f\x12\xa7\xcc\x78\x62\x0e\xf6\x35\xbf\xcc\x46\xa3\x93\x44\x3e\x22\xba\x76\x59\xd5\x98\xe3\x20\xcd\x07\x1a\x2e\xd8\x24\x55\x08\x5e\x7a\xdb\xac\x5e\x77\xdb\xf5\xe3\xea\xf9\xcd\x45\x4c\x93\x44\x26\x36\xab\x7d\xd9\x9d\x3a\x9b\xd9\x7c\x7f\xda\xde\x41\x85\xae\x32\xd6\x66\xa4\xd8\xbe\x19\xdd\x6a\x36\x4a\x56\x26\x29\x18\xdd\x78\xcb\x21\xfe\xc0\x0a\xd4\xb7\x74\x47\xe1\x84\x45\x95\xb0\xd4\x98\x3a\x58\x4c\xb3\x71\x73\x6c\x38\x47\x18\xf8\x88\xad\x3e\xe9\xf7\x69\x69\x57\x99\xf0\x20\xc2\x30\xc1\xe2\xf9\x71\xb5\x7d\x9b\xbf\xb9\x37\xe4\x51\x14\xc6\x1d\xf2\x77\x59\xea\xe2\x1a\xf2\x6c\x78\x47\xda\xf3\x25\x11\xbe\x90\x36\x35\xbb\x65\xc5\xfb\xe8\x69\x04\x10\x64\x22\xdd\xb3\xea\x05\xca\xed\x4f\x33\xde\xd6\x1e\x4d\xa4\x6f\x02\x57\x8b\xc5\xb7\xdd\x6a\xb9\xde\x3a\xc6\x17\x99\xc8\x50\x61\x40\xaf\x39\x85\x86\x6f\x31\x5a\xd6\xd0\x38\xed\xdd\xe2\x01\x76\x9c\x52\x60\x94\x09\x48\x1f\x0b\x9b\x77\xbb\x13\xe2\x95\x86\x8f\xa9\x42\x82\xbc\x04\xcd\xa5\xef\xed\x5e\xa0\x52\x62\xf8\x49\xb5\xce\x0d\xbb\x56\x0f\x32\x71\x63\x6f\x53\x42\x18\x5e\x07\x4c\xbc\x21\xaf\x70\xcf\x02\xea\x8e\xc1\x09\x43\x6a\x3c\xab\x53\x12\x45\x8e\xa5\x6b\x57\xeb\x5d\xcb\x45\x2e\x53\xea\x47\xbe\x03\xc8\x58\x72\xf3\x7e\xa2\x3b\xa5\xb1\x61\x9c\xc4\x00\xb9\x85\x95\x99\x0a\xd0\xc9\x73\x2c\xf5\x20\x88\xac\x83\xfd\x74\x3e\xce\x4d\xf0\xd9\x6d\x50\xa9\x1f\x19\xf0\xd3\xf6\x75\xf6\xb4\xb9\x5b\xbd\xee\x5e\x5e\x9f\xff\xf8\x73\xf7\xdd\x7d\xad\x34\x90\x29\x22\x09\xf5\x67\x51\xcd\xf2\xab\xa8\x72\xfb\x42\x51\x18\xab\x8e\x0d\xa0\x25\x8b\xa4\xc3\x69\x9e\x46\x11\xc3\x55\xb8\xb3\xc3\xb5\xd5\x96\xb5\x76\x30\x8d\xd3\xd8\x97\x4e\x7a\xc3\x14\xd6\x8d\xd7\x42\x1a\x47\xa2\x2d\x53\x67\x35\xdb\x79\xc1\x60\x43\x4e\xe3\x34\xa0\xb6\x8c\xac\xf9\xc6\x3d\x40\xc5\xf0\xab\xa6\x09\x70\x8c\xfa\x5b\x9c\x83\x93\x2d\xb6\xad\x69\x10\x21\xdb\x3b\x2b\xaa\x4f\x28\x97\x90\x67\x1f\x50\x5e\x16\x87\xc6\xe2\xea\x51\xa6\xba\x58\x48\x14\x7c\x39\x0f\x26\x31\xbb\x3d\xed\x03\x3b\xfd\x86\x9a\x71\x32\x65\xa9\xc2\x77\xd9\xac\x9f\xee\x1f\x56\xbb\xf9\xc3\xf3\xe2\xf7\xdd\x43\xeb\x8e\xa7\x8c\x2b\xdf\x46\x73\x3a\x1b\xe3\xcb\x18\x52\xca\x04\xe5\xc2\xc9\x70\xda\x12\x8f\x4c\x17\x0f\xfd\x7c\xcf\xf0\x0a\x1e\x18\xbd\xde\x1f\x23\x99\x83\x64\xfc\x1e\x57\xcc\x45\xa3\xfb\x24\x04\x63\x8b\xa7\x81\x4c\xfd\xa8\x8f\x04\x8c\xa1\x65\x95\x21\xd0\xea\xa5\xae\x52\xe1\x25\x44\x39\x02\x90\x0f\x78\x2b\xf3\xe1\x87\x97\x01\x67\x06\x4c\x8d\xd8\xde\x55\x7d\x18\xcd\x1c\xa9\x08\xd6\x8f\xa3\xcc\x3b\x46\xcf\x2c\xf4\x61\xd4\x0f\x7c\x40\xd5\xf8\xc7\x8b\xd7\x37\x5d\x52\x10\x34\xb6\x33\xef\xbe\x1c\x28\xdf\xca\x54\x79\x04\x4f\xf1\xc7\xf5\xd3\x00\x90\x9b\xaa\x94\x21\xc7\xa1\xc3\x26\xed\xce\x85\x30\x81\xbb\x1d\x1f\xa6\x10\xdc\x05\x3c\xc6\x60\x57\x0d\xec\xd8\x89\x73\x4b\x46\xa8\xc1\x01\xe1\x09\x54\x75\x8e\x25\x23\x34\x01\x9b\x43\x9e\x9f\xcb\xe2\x0e\x60\xc6\x47\xb6\x24\x23\x11\x45\x1e\x8a\xc5\x6c\xbb\x79\x99\xb5\x4f\xc7\x48\x24\x8d\x01\xe5\xb8\x41\x17\xba\x6a\xcd\x48\x46\xed\x99\xd2\x78\x2b\x9b\xcf\xac\x16\x87\xb6\x25\x6d\x39\xa6\x6d\x11\x94\x65\xa0\xb3\xe9\xbd\xd1\xcf\x53\xe6\x07\x6d\x4d\xce\x77\x5d\xc3\xef\x59\x21\x0b\xa8\xaa\x55\xb3\xa8\xda\x9b\xb2\x04\xe3\xbd\xdf\xdf\x5e\x30\x10\xbf\xda\x7e\xdb\xad\x17\xcf\xbb\xed\x7a\xf5\xea\xed\x5e\x67\xdb\xf6\xb1\x29\x8f\x31\x42\x89\x2c\x79\xe6\x87\xd7\x55\x75\x86\x1e\x4e\x9a\x51\xe5\x33\x03\x6a\x32\xd8\xc9\x5b\x12\xfa\xc3\x5d\x93\x79\x81\x44\xff\xeb\x77\xe0\x50\x9e\x8b\xfa\x5c\xec\x59\x31\x13\xcc\x79\x58\xcc\x13\x02\x64\xbb\xad\x72\x28\x11\x93\xd3\x69\xbc\x4b\x16\x04\x24\xb5\x08\x31\x4b\xb9\x3b\xd8\xe3\x58\x20\x88\x0b\x37\xb6\xd8\xd1\x36\x31\x35\xfd\x54\x21\x67\xc4\xb2\x9d\x3c\x69\x69\x34\x0e\xd6\x72\x74\xdf\x50\x28\x53\xad\xd0\xe9\x22\xcf\x3b\x5a\x4d\xc9\x22\x3f\x42\x43\x56\xe8\xe3\x89\x95\x60\xd5\x07\x26\xa2\x75\x2c\x0a\x63\x44\x4b\x59\x76\x8e\x9d\xcd\x5c\xee\x94\xfd\xff\xeb\xec\x08\x3b\x68\x23\x87\x2c\x4a\x0d\xc3\xc8\x8b\x2e\x32\x51\xdd\xa2\x7e\x1d\x85\xeb\x58\xc4\xa9\xa1\x13\x32\x31\x3a\x90\x8b\xae\xae\x96\x45\x10\x22\x51\xc5\xec\x2c\xea\x73\x65\x6a\xd0\x26\xaa\xd5\x58\x4c\x22\xf4\x1f\x9b\xf3\xf4\xc0\x4a\xb9\xcb\xaf\x48\x11\x24\x8b\x53\x8a\xde\xf7\x68\xbd\xdf\x72\x71\xec\x55\x49\xea\x63\x71\xf1\x51\x83\x1c\x24\xab\x58\xc2\x62\x24\x49\xb0\xf5\x31\x58\x17\x6c\x26\x83\x09\x19\x75\xee\x16\x4b\x84\x42\xae\x75\x83\xc1\x79\xcb\xc6\xbe\xb3\xeb\x06\x21\x52\x6a\xac\xab\x05\x2b\x9a\x6d\xb9\x9e\x21\x5e\xd5\x36\xa7\xa9\x99\xcc\x7f\xf1\x02\xb6\x37\xa3\x29\x86\x20\xb7\xf7\x8f\x75\xff\xb1\x99\x2f\x90\x2d\xd9\xc0\x66\xe7\xd0\xad\x74\x16\xfb\x98\x7d\x7b\x75\xa5\xfb\xbf\x94\x90\x60\x8c\x99\xb0\x68\x73\x98\x1c\x7a\x87\xf9\x08\x78\x35\x9c\x5c\x8c\x33\x8c\xf1\x22\x0f\xc0\x0a\x0d\xe4\x76\xd1\x72\x11\xab\x01\xdb\x09\x7a\x85\x2d\x02\xcc\x3a\x26\x4c\x70\x23\xdb\x82\x55\x63\x36\x87\xf1\xdb\x97\x3c\x79\xa3\x07\x17\xc2\x98\x19\xcd\x7a\xca\xc4\x7b\xd1\xab\x41\xb1\x3d\x24\x15\x98\x44\xfd\x9e\x55\x27\x28\x6d\x3d\xb5\x7b\x4c\x19\x24\x38\x90\x9d\x8f\x3f\x4a\xe6\x5e\x1b\x7e\x4c\x46\x12\x89\xa6\x7e\x3f\xff\x2b\x2b\x59\xc7\x7f\x26\x9b\xa3\x0d\x77\xb3\xac\x68\x6c\xa8\x0a\x1e\xd9\xcf\x5e\x59\xbe\xeb\xc4\xa9\x63\x25\xfb\x3b\x86\x6f\xc6\xcf\x2b\x0c\x45\xdc\xb9\xd0\x9f\xed\x07\x07\x92\xe0\x36\x6d\x6c\xb3\x75\x0d\xc7\xe9\x7c\x35\x03\x66\x94\xb3\xd4\x14\x14\xbe\x73\x0c\x98\xf2\x12\x69\x41\xc2\xe2\x60\x8b\x2a\x27\x4f\x72\xa6\x62\x81\x71\x47\x93\xa8\x19\x57\xb1\x30\x95\x08\xd4\x48\x16\x07\x56\xee\xe1\x79\x9a\xf3\x44\x72\x9a\xc4\x68\x0f\x20\xe1\xaf\xd3\x82\xea\x0c\x2d\xfc\x57\x38\x5c\xb6\x9c\x32\x89\xb8\x52\xac\xc4\xba\x6f\xb5\xa9\x46\x9d\x84\x8c\xad\xb1\xfd\x56\x9c\x98\x63\xe6\x96\x9c\xaa\xc8\xe5\xaf\x37\x42\xf7\x10\x23\x83\xbd\x96\x7b\xb1\x04\xe9\x0e\x4e\x43\x13\x9b\x1d\xc7\x21\x1c\xee\x81\x51\xd6\x75\xc1\x0e\x47\x85\xbe\x80\xb2\x87\xee\xbe\xf6\x80\xb8\x1f\x7b\xb1\x35\x62\x7f\x00\xaf\xb2\xfa\xca\xdc\xe1\x3e\x33\x9a\x42\x12\x98\xcc\xb3\x02\xb6\xfa\xae\x04\x90\x8d\xb7\x84\x28\x10\xdb\x2d\xf0\xa8\xdf\xa6\xb0\xbb\xfa\x1e\xd7\x1a\x30\xbf\x03\x87\xdb\xdd\x69\xba\xd4\x92\x07\x4c\xf9\x36\xcf\xf4\xc0\x90\x38\xf1\xd4\x49\x10\x48\x1e\xc8\x34\x25\xad\x16\x7b\x1b\xc3\xe3\x21\x89\xf0\x39\xef\x66\x8b\xed\xf3\xeb\x2e\x6c\xff\x1e\xfb\x98\xff\x6b\x41\xdb\x7a\x9a\xdf\xbb\xe9\x19\xc7\xd6\x91\x59\x96\xec\x13\xcf\x34\xb3\xdb\xce\x2f\x43\x62\x60\x77\x01\x0b\x10\x55\xd7\x18\xb5\x16\x0d\xfc\xc2\xb2\xeb\x6a\xc3\x89\x19\xce\x43\x16\x62\xb1\x19\x08\x61\x88\xd3\xbe\xde\x57\xdc\x55\x92\x61\xcd\xf4\x6e\x0f\xb5\x39\xf3\x5f\x58\x26\xdf\x4e\x23\xfd\x6b\xc9\x23\x4a\xd0\x48\xb5\x95\x9c\x4f\xba\x0b\xe9\xf3\x28\x16\x41\xf3\xd8\x7f\x64\xba\xd8\x2f\xb3\x87\xcc\xa9\xf5\x4e\x0f\x4b\x94\x84\x08\x55\x97\x48\xe6\xad\xcb\x76\xb7\x3c\xb0\x12\x1c\x9d\x51\x7b\x6f\x48\x90\xaf\xee\x1e\xea\x65\x56\xe5\xd9\xfb\xa0\xe6\x8d\x47\x2a\xf2\x55\x5b\xa2\x79\x84\xe2\x86\xf0\xb9\xe4\x71\x10\x21\x39\x35\xcf\x31\x52\xd1\xfe\x40\x1c\x87\x18\xaa\xc5\x64\xef\x03\xb0\xf7\x11\x8f\xba\xe4\x89\x17\xa4\xfd\x6d\xce\x11\x3c\xbd\x94\x60\x82\x37\xbf\x0d\xd8\x07\xbe\x3e\x7a\x78\x12\x24\xe8\x0d\x3f\xfd\x73\xb9\x7b\x3e\x16\x99\xd4\x79\xce\x9c\xf7\xc6\x93\x44\xf0\x76\xd6\x1b\xd0\xf4\xba\xf5\xb4\x79\xe3\x84\x03\xc6\x4a\x1e\x96\xeb\x1e\xb6\x9f\xb3\x30\x00\x57\xa9\xca\xb0\x3c\xa0\x93\x0b\x96\x5c\xa4\x1c\xda\x82\x9c\xaa\xc6\x5a\xd0\xe9\xfd\x94\xcb\x34\x0e\x4d\xe1\x68\x75\x76\xaa\xb2\x7d\x67\x9e\x4b\x16\x22\xc9\xf6\x87\xae\x61\xab\x7f\xcf\xc4\xbb\x56\xea\x09\x3e\xef\xb2\x4a\xb0\xfc\x4f\xe8\x5e\x45\x42\x8c\xa4\xad\x66\x89\xa2\x94\xc3\x2b\x2b\xde\x51\xda\x69\x53\xeb\xf2\x82\xdc\x80\x76\x9a\x52\xcf\x85\xae\xdc\xb9\xc3\xc1\x53\x46\x9d\x83\xeb\x12\x8b\x52\x86\x4f\x0a\x4a\x29\xbb\xaa\x5d\xe6\x0c\xea\xea\x4e\x97\xc3\x12\x94\xe1\x24\x50\x5e\xaa\x64\x9f\xd9\xaa\xf1\xc4\xef\x74\x79\xdf\x93\xd6\x19\x5f\x12\x06\x58\x2a\x63\x8d\x53\x9b\xcd\xba\xd3\xa5\x41\xbb\x64\xc5\xbe\x2d\x07\x32\x57\x08\xe2\xb1\xc8\x86\x02\x66\x55\x75\xa5\x48\xef\x7a\x05\x1e\xd2\x71\xf5\x33\x4e\x18\x7f\xf0\x12\xd7\x23\x12\x68\x81\x61\x70\xd4\x84\x9b\x1d\xf0\x79\x8c\xb3\x17\xd4\x4b\xc0\x94\xa2\xb5\x0c\xc6\x52\xd0\x20\x42\xe4\xea\x3f\x1f\x9c\xb8\xb9\x14\x94\xa7\xa8\xa9\x94\xb3\x6a\x04\xc4\x10\x54\x1a\xe4\x03\xc6\xbe\x7f\x5f\x3f\xf6\x2d\x47\x41\x55\x8c\x74\x0d\x0f\xac\x60\x8b\x03\x2b\x73\x80\x22\x71\x8d\x1e\xe1\x08\xcc\xb7\x52\xce\xa3\x48\xb1\xf0\x7c\x13\xc8\x14\xac\x30\x7b\xcc\x16\xca\x63\x56\x5c\x55\x44\x0b\x2f\x25\x9e\xd3\x97\x9d\x15\x72\xd3\xf2\x8f\xe1\x19\xd0\xb8\x33\x02\x4e\x37\xdc\x7d\xe1\x89\x14\x5d\x45\xe8\x4a\x14\x84\x9f\x70\x73\x8e\xd5\xa8\x3e\xb2\x75\xc5\x9f\xae\xb0\x41\x04\xb1\x9f\x5a\x9e\xc3\x1f\x0f\x93\xa5\x6e\x22\x50\x11\x56\x24\x2c\xf0\xc4\x5f\x15\x50\xee\x87\xda\x8a\x52\x84\x81\x55\x63\xe9\x91\x67\x7c\x89\x92\x13\x91\x0c\x70\x0f\xdc\xd9\xcc\x16\xee\x81\x6c\x28\xba\x3c\x7c\x8c\xd8\x97\x43\x52\xb6\xea\x59\x4d\x84\x5c\x45\x2c\x83\xc0\xb0\x53\xe4\xc0\x4a\x94\x97\x7a\x7f\xd0\xa3\x8c\xba\x48\x02\x86\xb6\xc6\xe6\xfb\x6a\xf0\x99\x93\xd8\x4c\x8f\xc6\x89\xff\xee\x64\xd9\xba\x68\x4b\xdb\x8d\x07\x86\x9b\xe0\x78\xd2\x9f\x50\x1a\x61\x89\xe1\x73\x24\x2a\x0d\xac\x89\xbd\xfa\x29\xf2\x73\x95\x69\xac\xeb\xc7\x3b\x1a\xad\x87\xeb\x69\x9c\xc6\xa6\x46\xa7\xaa\xd9\xfb\xad\xa1\x63\xbe\x07\xb1\x0b\x6a\x37\x9b\xce\xcd\xc4\xcf\x70\x72\xb1\x84\x89\xc8\x05\x90\xdc\x99\xd3\x49\x2f\x4f\x9e\x1a\xa2\x31\x30\x71\x7e\x64\x47\xc4\x3e\xc8\x5d\x75\x35\xbd\x39\x31\xbc\x18\x0f\xeb\x07\xe7\xe8\x0b\x21\x38\x6e\x5e\xcf\x3c\x2b\xdb\x7a\x62\x21\x3d\x53\xb8\x8b\xbe\x17\xb0\xe3\x10\x59\x24\x64\xc0\xac\xda\x5c\x21\x9f\x60\xcf\x9a\x5d\xef\xc7\xe1\xac\x54\xd6\x2b\x0b\xeb\xdb\x52\x42\xa6\x24\xb4\x18\x32\x2c\xee\xbf\x9e\x0e\x12\x08\xa2\x2c\x98\x91\x30\xff\x3d\x3b\x6e\x58\x0e\xfd\x32\x56\x01\xd4\x14\x66\x43\x51\xbd\x1a\xd5\xc0\xb2\x6d\x4a\x08\xfa\x8b\xc7\x4d\xdd\x2f\xb4\x11\x2a\x48\x7c\xda\x83\xd3\x18\x3e\x70\x83\xf7\x19\xc7\xf9\x7b\x46\x8a\x50\x61\x8a\x85\x1d\x59\x65\x4a\x29\xcb\xe7\xd3\x78\xb9\xa9\xd8\x90\x33\xc8\xac\x62\x79\xae\x3f\x5b\xc6\x2b\xa8\x3f\x01\x8a\xb7\xaa\x0b\x58\x48\x12\x7a\x8e\x43\x04\xc1\xc9\x4e\xb5\xcc\x35\x27\x0a\x41\x3f\x42\x67\x05\x1f\x27\x9f\x1a\x3f\x09\xc3\x83\x06\x4c\x31\x0a\x27\x2f\x9e\x9f\xb6\xaf\xb3\x85\xcb\xb7\x48\x8f\x29\xab\x9b\x88\xf4\xf8\x7d\x6d\x9b\xf9\xc5\xa4\x38\x27\x67\xab\xf4\x63\x4a\x88\x0b\x8e\x4b\x28\xbf\xb1\xea\x70\x8b\xb9\xe5\xaf\x32\x96\xc3\xb9\x29\x7d\xae\xd0\x42\x3e\x22\x75\xe7\xb6\x4f\xa0\x51\x6d\xf5\xda\x9a\xee\xbf\xe6\x11\x4b\x5f\x31\xbc\x59\x75\x60\xcd\xfc\xda\x59\xb6\xad\xf6\x93\xcb\x80\xb4\xe1\xa3\xdf\xe1\xb2\x5e\x3a\xa8\x51\x3f\xf1\x26\x03\x5f\xa0\xde\x0e\x72\x61\x6f\xf5\x69\xa9\xdb\x8f\x11\x44\x11\xd6\xa1\x88\x83\x42\x45\x75\xa7\xc1\xf7\xe3\x90\xe5\xd0\x47\x8d\xcb\x80\x2b\xde\xf1\x9c\xda\xa2\x8e\x71\xb2\xe3\x57\xfe\x97\x0e\xab\xd8\x64\x20\xe2\x24\x68\xed\xa0\x73\x3e\x8a\x6f\xc9\x30\xf0\x89\xad\x31\x30\xf1\xa7\xaf\x10\x45\x32\xb4\x04\x46\x55\x63\x80\x1c\xb3\xe2\x3b\x2b\x33\xc6\x73\xb8\x0d\xd1\x18\x8e\x78\x94\x48\x5c\xed\x06\x14\xf9\xac\xe6\x99\x94\x63\x49\x74\x29\xe3\x28\x35\xa9\x4c\xf4\x59\xc9\xaa\xf5\xbe\x9b\x16\xb4\xc8\x5f\x9e\x9f\xfb\x5b\xb8\x4c\xbc\xc4\x24\xd7\xeb\x72\xf5\xef\x33\xcb\xa7\x02\x65\x32\x09\xa4\xea\x8a\x38\xef\x35\xcb\x47\xbf\x9b\x06\x0a\x0b\xc5\xd7\xcb\xd9\xcb\xd7\x91\x47\x99\x26\x22\xb6\xd4\x91\xa7\xf3\xf8\x4c\x97\x8c\xca\xc0\xc4\x91\x04\x64\x1f\xb8\xd7\xf6\x03\x2e\x83\x4c\xde\x97\xd1\x21\x0c\x49\x05\x56\x25\xfb\x03\xaa\x9a\xb9\x37\x66\x02\x1c\x4e\xfe\x4f\xa8\xfa\xc5\x35\x92\x49\x82\x80\x85\xef\x0f\xcf\xf7\x0e\xa4\x25\xb9\x17\x60\x1e\xf0\x71\xfd\xb4\xdb\xac\xb7\xab\xdd\x7a\xd9\x36\x85\x54\xa9\xae\x02\x6a\x61\xc0\x1d\xae\x55\x86\x04\xa1\xaa\x08\x45\x1c\x89\x4d\x49\x29\x63\x23\xca\x73\xcc\x3a\x45\x2c\x29\x25\x67\xa2\x95\x09\xd9\x40\x8e\xcc\x85\xb6\x0d\xfc\x08\xa3\x04\x1c\xea\xc6\x6a\x6d\xff\x1c\x51\x8c\xa9\xed\xb2\xca\xb8\xaa\x1d\x7e\xfa\xc6\x2e\x03\x32\xf0\x23\x7b\x72\x34\x87\xec\x5d\x9f\xc7\x7c\xf8\x94\x8a\x24\x58\x45\xe8\xdc\x57\xe4\x2d\x98\x4f\x45\xf4\x81\x84\x1c\xa3\xa3\xe8\x5c\x21\x65\x2f\x22\x4c\x5d\x6b\x1c\xa3\x58\xff\xaa\x13\x46\x90\x40\xc0\xd0\x23\xbb\xbb\x33\xa7\x9f\x29\xc1\x53\xa6\xb8\x3a\xd7\xfa\xfd\x7c\x9a\xe5\xf9\x26\xbb\xfe\xc9\x20\xf2\x91\x4c\xb3\x67\x49\xfd\xa7\x1d\x18\x08\x7d\x13\x70\xba\x87\x62\x71\xc8\x4e\x15\x12\x25\x5e\x33\x7a\x4a\x08\x99\xa1\xe8\xfa\xf3\xcf\x3f\xfa\x6b\x03\x42\x20\x58\x90\x82\x4a\x48\x74\x87\xd1\x19\x3c\x89\x76\x0c\x49\x06\x5e\x6d\x8d\x4c\x67\xea\x40\x44\x00\x2d\xc4\xa3\x96\x99\xba\xf4\x7d\x21\x88\x82\x50\xb5\x01\xc1\x97\x03\xab\xc0\x6b\x9b\xc0\x88\x3e\x03\xfa\x38\x63\x34\x03\xc4\x34\x42\x88\x4c\x63\xf1\x7d\x34\x66\xc5\xac\xe4\x99\xa5\xcb\x9f\x22\x29\x83\x98\x99\x38\x6a\x6d\x98\x1c\x6d\x75\x43\x57\xaa\xd5\xde\x58\x4a\xa4\x6f\xc1\x3a\xa3\x75\x5b\x04\x3a\x3d\x6d\x80\xb1\x24\xa4\x4e\xee\xb8\xb9\x71\xa7\xda\x24\x81\x27\x12\x7a\x52\x6e\x93\xc0\x3b\xd7\x95\xf9\x88\x46\x38\xb1\x4b\x5b\x56\x31\x7c\x7e\xae\x22\x24\x8a\xcd\xaa\xbb\x73\xb1\xef\xa3\x5a\x6d\x07\x41\x62\x47\xa2\x89\xc6\xc9\x9b\x43\x6c\x41\xf9\x31\xde\x9c\x40\xf8\x0c\x13\x15\x66\x34\x74\xf1\x9f\x6c\x5d\xdc\x77\x94\x91\x20\x98\x11\xbc\x3a\xb1\x0b\x40\x8f\xa5\x5d\x02\xf8\x2a\xe0\x0e\x6c\x2e\x01\xe7\xf3\xf0\xde\x4a\xf8\x66\x04\xcf\x7c\x88\x7e\x70\xed\xd2\x10\xd5\xe4\x56\xf2\x7e\xe3\xd4\x0e\xa5\x22\x51\x6a\x90\xb8\x35\x2b\x6b\x23\x81\x36\xb1\xf7\x2a\x12\xc7\xa9\x91\x1d\x2c\x58\xfb\xe5\x14\x11\x46\xe5\x92\x49\xd9\x2f\x70\x73\xcd\xd4\xf7\x50\xd5\xf4\x98\x15\xd0\x8f\x38\x0d\x36\x5b\xe5\x05\xed\x37\x5b\xc2\xf1\x5c\x22\xb6\x14\x5a\x31\xa6\x3e\xb4\x45\x79\xb1\x87\x08\x9d\x81\x66\xff\x95\x09\xdd\xae\x29\xe5\x09\x60\xd2\x39\xac\xa3\x9f\x95\xc4\x1b\x50\xce\xe0\x81\xb8\xfd\x89\xc6\x8e\xeb\x03\x0a\xf7\xce\x57\xc8\xc4\x81\x2d\x9e\xd7\x4f\x6d\x8b\x4a\xe3\x91\x6e\x17\x9e\xf9\xf7\x59\x99\x5b\xc4\xdf\x80\xad\x52\x05\xc4\x2c\x06\xcb\x35\x6b\x23\x65\x03\xda\x07\x15\x44\xc6\x9e\x71\xd9\x7d\x93\x43\x5b\xb2\xe2\x7d\x10\x8d\x54\x01\xa3\x48\x9e\x88\xdf\xec\x15\x2b\xc8\xda\x5b\x28\x46\x2c\xf4\xd1\xc1\x97\x6e\x97\x39\x0e\x26\x91\x0a\x03\x30\x94\xe0\x63\x0d\xf9\xfe\x80\x86\xa9\x19\x91\x7f\x9f\xfb\xa5\xbc\x53\x33\x26\x6c\x8c\xd5\x66\x3b\x3b\x1f\xa1\xcc\xce\xc7\xfe\x9e\xa6\x42\x08\xb1\xfe\xf0\xa3\x17\xf5\x9b\x7c\xbc\xe4\x9a\x4a\x48\x45\x24\x30\x4a\x8b\xdf\x4a\x80\xe5\x7c\x70\xe3\x28\x09\x30\xc7\xfa\xf6\x30\x54\x7f\x18\xbe\x6a\x04\x01\x16\xcd\x9f\x8b\x17\x76\xae\x06\x98\x39\x15\x5b\x65\x09\x61\x19\xd3\x8d\xdb\xd7\x0b\xa7\xab\x38\x50\x22\x1d\x24\x24\x56\x0f\xdb\xc5\x23\xc8\xec\x7c\x1c\x7b\x87\x2a\x61\x06\x72\x09\xc7\xac\x46\x24\xea\xea\x83\xe5\x67\x56\xdf\xf8\x2c\x57\xa8\x98\xd1\x93\x27\x2a\x46\x1f\xfc\xe1\xf9\x7e\xe7\x26\x48\x63\x17\x76\x46\xaf\x4a\xa3\x18\xf9\x02\xeb\x92\xc9\x2e\x47\x42\xfd\x6e\x0b\xa4\xb6\xbc\x39\xf9\x6f\xaf\x43\xd4\x0c\xfe\xe9\x6e\xc5\x62\x0c\x23\x28\x5d\x7e\xb2\x52\x36\x27\x74\xe5\x6a\xab\x5d\x17\x21\x3b\xe6\xe2\x1f\x90\x75\x96\x82\x4a\x95\xc2\xad\xa5\x19\xbf\xf3\xe9\x79\x28\xa1\x27\x15\xa3\x0a\xe7\xdb\x4b\x86\xd4\x0a\x83\xc9\xc3\x12\xcf\xd2\x5b\x35\x9f\x00\x0d\xdb\xcd\x35\x1b\x9d\x62\x49\x10\x3a\x65\x21\xab\xf4\xb7\x2b\x74\xbd\x36\x08\x0b\xd7\x89\x01\x3a\xb0\x36\xd0\x03\xf2\xb9\xfd\xd6\xc2\x8f\x98\x4d\x4c\xcc\xaa\x0a\x8e\x3c\x1f\x45\x49\x94\x00\x43\x7a\x80\x98\xa7\xf9\xf9\x32\x1d\xa3\x53\x32\xf4\x11\x0a\x7d\x2a\x61\xbb\x1f\x78\x06\x4a\xc6\x26\x5d\xdb\x18\xe8\x65\x26\xf7\xf0\xa4\x25\x4c\x54\xfb\x2a\x69\xb1\x08\x58\x9e\x2e\x01\x8e\x36\x05\x83\xb0\xa3\xe9\x43\x45\x49\x41\x31\x56\x64\x99\x26\xe1\xf3\xbe\x87\xc0\xb9\xad\x07\x2a\x15\x50\x9a\xda\xe0\xeb\x49\x17\x18\x82\xee\xbb\x1d\x0a\x22\x8e\x2f\x64\x8e\xe3\x99\x6c\x67\x17\x88\x50\x39\x48\x2f\x8e\x85\x75\xa3\x94\xf2\x82\xd0\x39\x8d\xe7\x0f\x28\xeb\x73\x09\x3b\x50\x0a\xfa\xec\x3c\x4a\x85\x46\x8b\xf5\x85\x15\xec\xc8\x3e\xaa\xed\xb9\xc8\xaa\x8c\xb5\xcd\x10\x38\xdd\x31\xeb\x17\xbf\x9e\x7b\x46\x6b\x47\x2a\xfe\xab\xaa\x20\x52\x29\x15\x60\x01\xf7\x71\x87\xe0\xc0\xaf\xf6\x40\x20\x24\xa0\xcc\x84\x4e\xf6\x05\xeb\x73\xf5\x03\x21\x21\x43\xc7\x7c\xf5\xba\x88\xe3\x78\x09\x47\xfd\x85\xea\xea\x70\x0f\xb3\x77\xa0\x9e\x1f\xf5\x99\x73\xb6\xfa\x74\xa7\x07\x3a\x05\xa3\xa7\xa1\x81\x72\xa4\x54\x48\xbb\xce\x8e\x30\xbf\x4c\xc8\x3f\x00\xa1\x2c\x51\xc6\x60\xc7\x2c\xed\xf7\x56\xa7\xbf\x69\x32\x7c\x3d\xcd\x90\x96\xac\xb1\x7b\x1d\xbd\xa0\xeb\x20\x68\x60\x04\x26\x0a\xd9\xaa\xe6\x02\xa1\x52\x92\xe6\x4b\x15\xba\x86\x25\xe0\x80\xd4\x20\x5f\xe1\xa4\xcb\x76\x4c\x28\x48\x0c\x5f\x1a\x6f\xfe\x47\x6b\x3f\xdf\x59\x3d\x83\x1b\xef\xe5\x05\x02\xd3\x7e\x59\xb5\xd5\xa7\x4c\xd8\x68\x7a\xe8\x5a\x43\x22\x1c\xd0\x1a\x41\x65\xe7\x9b\xe2\xd6\x4d\x67\x53\xc3\x54\xc0\xe7\x7d\xa9\xcf\x27\xf7\x64\x5e\x94\xe2\xdf\xbf\x67\x65\x7d\x86\x17\xfd\x0e\x65\x57\x1f\x02\xc4\x03\x08\x0d\xd8\x56\xbc\x8f\x4e\x9f\xc9\xdd\xd8\x5e\xe6\x87\x09\xc6\x33\x57\x4f\x4b\x04\xb7\xee\x36\x33\x17\x3e\x03\x82\x1c\x4b\x6e\xa0\x33\x28\x64\x75\xd7\xec\x6c\x65\x35\xf9\xc5\x7c\x65\xb6\xd6\x7b\x5d\xec\x5f\x5c\xee\xc9\xb6\x05\x84\xbb\xef\xbe\xd3\xa5\x84\xf2\x46\x45\xdd\x8d\x49\x1c\x50\x8e\x6b\xfb\xc7\xeb\xc3\x28\x07\x09\x24\xf0\x7d\x5c\x7f\x52\xe7\xaf\xac\x9b\x24\x81\x0c\x42\xd9\xd9\xcd\x57\xa4\xbb\x40\xc2\x28\x70\x94\x15\x6d\x75\xc0\x88\xcf\x7d\x78\x41\x14\xa4\x41\x07\xca\xfe\xf6\x54\x5f\xbb\x08\x40\xa2\x30\x76\x52\x33\x12\x5e\x4a\x18\x72\x79\xfe\x05\x3e\xdd\xdd\x43\x50\x1e\xb7\x32\xf6\x37\x28\x0f\x80\xc4\x61\x68\xe4\xed\xf4\xa9\x1f\xb8\x76\xad\x09\xc1\x71\x39\x61\x06\x7d\x57\xf7\x4a\x8f\x81\x24\x3c\x41\xa6\xc4\xf9\xdb\x1f\x8d\x0d\xf8\xf8\xfc\xb4\xfa\x73\x18\x6c\x03\x92\xfa\x60\x9f\x02\x35\xa2\x6c\x98\xcd\xf1\xb8\xba\x04\x09\x90\x34\x35\x64\x79\x7b\xa8\x1f\x2f\xab\xe7\xcd\xef\x8e\x5f\x00\x08\x8b\x38\x3a\x80\x95\x2b\x76\xfc\x6d\x82\x52\x07\x08\xe3\x2c\xe9\x54\xb6\x06\x0c\xf9\x40\x78\x00\xb2\xa3\xef\x6c\xa5\x60\x46\x66\x09\x10\x1e\x73\xdc\x68\xeb\x4f\xfd\x03\xe0\xbd\x7d\x55\xce\x01\x23\x1f\x96\x48\xe8\x15\x44\x76\xea\x0b\x99\x77\x07\x16\x10\x0e\x01\x66\x50\x4c\x98\xe7\xa5\x84\xf5\xf6\x19\x61\x41\x0b\x76\xea\x09\x6c\x03\x91\x9c\xfa\xa2\x2d\xad\xca\x3a\xb5\x56\x20\x10\xfa\xb8\xab\x16\x06\xf3\x61\xcd\xe2\x0e\xb0\x01\x04\x92\x18\x83\x3a\x8b\x03\x88\xf7\x0e\xa2\xd8\x34\x28\x4c\xa3\xb6\x5c\x54\x0f\x68\x67\xb4\xcd\x4c\x62\xae\x2a\xab\x3a\x18\xb9\xf9\x2a\xc8\x9f\xd8\xde\x5f\x45\xd4\x50\x5a\x9d\xb9\x81\xac\xf5\x67\x0d\x25\x54\xf9\xd6\xc3\xd9\xf4\x27\xd5\xd7\x4b\x90\x92\xc0\x43\xfb\xb6\x75\x2e\xae\x0b\x0f\x81\xd2\xb8\xcd\xf1\xdf\x6d\xb6\x83\x92\x33\xa0\x54\xa8\xd8\x24\x35\xbf\x43\xa9\xb2\xf6\x79\x29\x05\x96\xf6\xb5\x58\x6e\x93\x82\x01\xf5\x42\x45\xc8\x58\x0c\xef\x2a\xd4\xdd\xff\x6f\x60\xaf\xf4\x83\x50\xb8\x04\x52\x0d\xe5\xc2\x78\x2d\xee\x19\xfc\x48\x46\x46\x8e\xbd\xac\x0c\x7b\x46\x47\xb1\x04\xd4\x07\x65\x98\x74\x59\x2d\x0e\x77\x03\x55\x77\xab\x0b\x62\x3b\x86\x9e\x09\x8e\xb5\x62\x0a\xc6\xab\xb8\x6d\xb7\x00\x0d\x03\x53\xa2\x81\x55\x12\x4a\xb9\x9f\x0c\x81\x27\x76\x28\x17\x50\x5a\x75\x92\x76\x2c\x23\x1a\x19\x4e\x09\x03\xe8\x9a\xf0\xbd\x80\x46\x29\x43\xf3\x05\xf1\xa2\x13\xfc\x85\x40\x13\xe2\xfb\xfd\xe3\x7b\xce\x2a\xc0\x40\xd4\x70\x4f\xa3\x09\x4d\xb1\x5e\x6c\x57\x41\xfd\xa4\x0b\xe4\xff\x93\x28\xb5\x30\xee\xa7\x30\xb2\xdb\xbc\xca\xf6\x50\xea\xf3\xfe\xb0\x1d\x21\x91\x80\x26\x89\xa9\x28\x6c\xb6\x95\xe7\x02\x6c\x8c\xba\x31\x63\x4b\xf7\xe4\x89\x32\xe7\x4e\x56\x55\xe7\x2b\xb6\x5b\xdb\x27\x25\x49\xcb\xbc\xb6\x19\x18\xd1\x40\x19\xe1\xc4\x24\x42\xcf\x85\x38\xf4\xb9\x1f\x81\x32\x1a\x62\xbc\xcc\x26\x06\x9b\x75\x69\x8b\x7c\xf5\x95\x40\xf4\xe8\x4b\xb1\xd0\x50\x65\x59\xd5\xfd\x55\x7d\xe8\x47\x9b\x80\xb2\x94\xe1\xec\x17\xac\xaa\xb7\xfa\xad\xcb\x28\xbb\x76\xa6\x78\x6a\x15\xe5\x4b\x90\x99\xa8\xef\x74\x79\x85\x2b\xed\xd9\x57\x94\x49\xce\x06\x15\xdd\x9b\x9a\xbd\xc3\x3d\xcb\x46\xb2\x52\x40\x79\xc0\xc1\xd2\x53\x99\x12\x67\x2c\x5f\xee\x9d\x07\x94\x47\x01\x09\x5b\xc5\xbf\xce\xfb\x03\xca\x81\x42\x30\x99\x55\x71\x3d\x44\x60\x04\x6e\xaa\x5a\x9f\x7a\x8c\x45\x40\x45\x1a\xe0\x0c\xda\x99\xa9\x5d\xdd\x0a\x75\x03\x15\x4c\xfa\xa6\xde\xf6\x34\x4a\xa2\x4d\xc5\xf5\x81\x4a\x6a\xea\x9a\x7e\x1c\x2e\x3f\x0e\x97\x6b\x0c\x16\x50\xe9\x93\xc0\xb7\x49\xd2\xe6\x75\x9a\xe7\x6e\xbf\x85\x0c\x38\x46\x98\xee\xd9\x91\xe7\x66\x92\xb5\x4d\x32\xb6\x12\xbf\x85\xc4\x86\xa1\xe8\x1a\x50\xf0\x8c\x88\xeb\xe3\xec\x7e\xbd\x68\x8e\x47\xb3\x26\x6e\x87\x06\x80\x42\x1a\xa1\x69\x50\xc0\x67\xcb\x97\xd5\x1c\xdd\xb6\x9c\x7a\x8a\x37\x08\xa8\xa2\x81\xa9\x6a\x62\x19\x82\xa7\x77\x3f\x20\x43\x76\xf1\x76\x67\x54\xa9\x31\x04\x5a\x91\xe3\x47\xf6\x73\x0e\x43\x8a\xfe\xd1\x24\x55\x3c\xa2\xcc\x15\x1f\xbb\x6c\x54\x4f\x8a\x1f\x3c\x42\x0c\x8c\xf3\x5f\x3a\xc3\x70\x1d\x9a\xeb\x03\x94\x92\xeb\xe8\x79\xc2\xfa\x3f\x16\xda\xf5\xc8\x7e\x0e\xa6\xb4\x47\x7c\xea\xd2\xe1\x96\x28\xbc\xcf\x7e\xe0\x3a\xc5\x81\xb0\x14\x24\x6d\xa2\xf7\x06\xd5\xdb\xf0\x65\x3c\xc2\x15\x0d\xff\x3f\x67\xef\xd6\xdd\x28\x8e\xb5\x8f\x7f\x97\xdf\x55\x5d\xcc\x85\x90\x00\xc1\xff\xce\x71\x9c\x2a\x77\xe7\x34\xb1\xab\xaa\x7b\x66\xcd\xf2\xd2\x61\xcb\x61\x82\xc1\x03\x38\x89\xe7\xd3\xff\x17\x5b\x12\x27\x93\x54\xcf\x7b\xf1\x76\xbd\x13\x09\x0c\x42\x87\x7d\x78\xf6\xf3\xf8\x2d\xac\xdd\x77\x57\x7b\x5f\x82\x02\x94\x86\xb6\xe0\xe5\x35\xd3\x50\xf6\x7f\x55\xb6\x72\x6e\xf3\x5c\xbe\x39\x15\xed\x79\x73\x8e\x52\x60\x78\x10\xee\xfa\x88\xd7\x46\x3d\x5b\x9d\xc1\x01\xb1\x01\xd0\x30\x35\x96\x96\x0b\xea\xa6\x2a\xcf\x3f\x9f\xa1\xc0\xf6\x9e\xf8\x13\x68\x08\x36\xd4\x8d\xe5\xe4\xd5\xdf\xdb\x5d\x1f\x9d\x33\xd7\x1c\x45\x8c\xba\xdd\x1c\xbf\xc5\xba\xbb\x79\xc4\xad\xd4\xca\x5b\x96\x6b\x25\x2a\x5d\xa3\xa4\xef\xf0\x89\x03\xff\xc0\x91\x89\x11\xdf\x70\x5d\xbe\x15\x16\x7c\xe0\xf2\x67\x63\x64\xcb\xe7\x07\x39\x8d\x69\x10\x84\x5e\x04\xbd\x9d\x76\x36\xcc\x37\xc8\x45\x03\x8d\x19\x67\xd6\x9d\x79\x38\x82\x8d\x87\xa3\xa0\x49\x37\x33\x69\x1c\x59\x9d\x6c\x1b\xa2\x40\x58\x11\xe8\xcf\x88\xc9\x81\x72\x1e\x25\x3d\xfd\xc8\xb6\xdc\x40\x3f\xc4\x1c\x18\xa2\x02\x2a\xc8\x4f\x3b\x17\x8e\x6f\xf7\xae\xd1\x93\x27\x32\xb6\x0b\x57\x98\xcb\x8a\xcf\x59\xd4\x81\xbf\x10\x52\x24\xc6\xc0\x9d\x02\xa1\x14\x83\x68\x3d\x50\x41\x14\x1e\x09\xbf\x9d\xea\x26\x2b\xea\xe1\xce\x47\x65\x08\x41\x3c\x22\xf8\x5c\x17\x4f\x70\xc8\xde\x27\x2f\x27\x23\x8d\x9f\x71\x2a\xab\xbe\xd0\xfa\x17\xa2\xea\x40\xa5\xa6\x52\x7b\xfe\x30\xef\xca\xfe\x95\x08\x27\x50\x15\x44\xc4\x3d\x1e\x4e\x49\xeb\x59\x3e\x18\x04\x67\x7f\x70\x49\x4a\xd1\x74\x7d\xc8\xcf\x87\xe3\xa9\xbe\x15\xb2\x5e\x96\xd5\x74\xcd\x2a\xa9\x30\x3a\xee\x15\x23\xfd\x78\x68\x11\x79\x76\xe5\xdb\xdb\x1f\x96\xb4\x92\x92\xae\xd5\x58\x19\xde\x1a\x9a\xf5\xa1\x75\xab\xa1\xba\x12\xc5\x8b\x6f\x06\x12\x61\x0d\x8a\x6a\x3d\x7a\x6b\xc5\xcf\x3a\x40\x14\x52\x86\xa3\x69\x00\x7a\x30\x2a\x50\x13\x58\x2c\x5a\x6f\x83\x22\x78\xcc\x09\x88\x8d\x5e\x93\x11\x6e\xf9\xfc\xd4\xee\x2e\x2b\xfa\x14\xcc\xba\xc0\xb4\xf7\x17\xdf\x4b\x33\xf4\x12\x17\x4f\xbf\xef\xb6\x4f\x0f\x5f\x6f\x1f\xf6\xbb\x60\x47\xfc\x0b\xb1\x80\x46\x96\x49\xe3\xb9\x7c\xdb\x76\x45\x2e\x79\x59\x67\xc5\x7e\x70\x84\xb2\x20\x35\x58\x37\xef\x0a\x37\x5d\xa0\x7a\x96\xad\x0d\x58\xa0\xc1\xd9\x01\x55\x31\x75\x67\x19\x8d\x29\x0d\x66\xa9\xd4\x83\xc9\x28\x31\xca\x19\xb5\xd6\x41\xd1\x6c\x3c\xcb\x77\xb7\x25\x31\x2a\x14\xd6\x1b\x6d\x57\x8b\xbb\x1d\x96\x7e\x79\x2e\xe2\xdd\xe3\xe2\x69\x4b\xbb\x7e\x8a\x61\x00\x3c\x17\xae\x0a\x7a\x67\x02\x94\xfb\x75\x4f\xed\xfb\x45\x2c\xc0\xfd\xf2\x2a\xfb\xcf\x69\x56\xa1\x62\x78\xb8\xb1\x88\xdb\x1c\x5f\x6d\x49\xc2\x27\x6a\x9b\xbe\x93\xa6\x78\x58\x0d\x68\x56\xae\x32\xed\xa3\x2e\xc5\xaf\x6a\xc9\xdd\x5d\xe2\x98\x63\x3c\x72\xf5\xf7\xef\xeb\xc7\xbb\xd5\xfd\x76\xf7\xb4\xfa\xb9\x78\xba\xde\xfd\x5c\xdc\xde\xae\xbc\x3f\xcb\x62\x15\x0f\xa4\x8e\xd0\x3e\x42\x48\xfb\xbc\x35\xe2\x2f\x32\x31\x96\x7e\xd8\xda\xe8\x70\x57\xf5\x46\x38\x4b\xa8\xc4\x88\x4c\x6b\x8f\x2d\x07\x8a\x7f\xc3\x04\x0f\xb0\x94\xf2\xd4\xc3\x89\xba\xa2\x72\x60\x92\x06\x5e\x49\xf5\xa9\x2c\x0f\x1b\x98\x11\xde\x01\x26\x79\xe8\x65\x7b\xef\xda\x1f\x39\x4e\xdb\xd3\x10\x45\x52\x77\xae\xc0\x7b\x48\x30\x06\x4c\x0a\x13\xfa\x5c\x51\xbb\x88\x47\xdb\x1e\x53\x71\xca\x3b\xbf\x7d\x58\x49\xd4\x3d\xa3\xa6\x1c\xc1\x26\x96\x03\xf8\xa6\xac\x76\xcb\xac\xc2\x95\xd7\xdb\x95\x4c\x47\x24\xe4\xbd\x54\xc5\xe6\x7c\x90\xe5\x08\x6b\x0e\x4c\xf3\x20\x26\x7d\xe5\xd0\xd5\xb9\x81\x39\x1b\x91\xe9\x24\x40\xd1\x55\x61\xcf\x9a\xdf\x4e\x55\x56\x6b\x9b\x07\x1e\xd3\x28\x00\x33\xa1\x88\x7d\xe9\xfe\x8e\xed\x0e\xd0\x3c\x7b\x81\x26\x60\x26\x09\x8d\xd5\x9b\x28\x4b\x33\x4e\x0f\x02\x33\x2a\xc1\xe9\x8e\xde\xb7\x27\x4f\x18\x3d\x6f\x48\xc2\x14\x0d\xc0\xcf\xbc\xb8\x7f\xb2\x31\x79\x09\x84\xc4\x38\xba\x95\x61\x78\x19\xc2\x20\x4c\x10\x3a\x92\xe1\x86\x88\x06\xe7\xe4\x64\x0c\x5b\x3b\x2b\xb5\x2a\xbf\xfe\x2a\xaa\x6c\x11\xa1\xdd\x4f\x90\x75\x09\x4b\xb2\x7c\x3b\x8b\x65\xe4\xd1\xf4\xd9\x21\xeb\xe2\x98\xe0\x00\xb1\x43\x4a\x2e\x08\x43\x0d\xe8\x47\xe0\x18\x6e\xcb\xef\xeb\x62\xa4\x07\xe8\x47\x35\x0c\x21\x09\x89\xaf\xb1\x5c\x7a\xec\x51\x6b\xe7\x44\xdd\x9e\x18\x46\x2c\xc1\x3a\x30\xcb\x1e\xb2\x6c\xbf\x69\x71\x1e\xe9\x9b\x43\x18\xf1\x84\xb9\x98\x7a\x47\xd5\x3b\x5a\x1e\x71\x38\x97\x14\x9b\x00\xe3\xdb\xfb\x68\x74\x8e\x7d\xb1\x4f\x4d\xfb\xc7\x48\x22\x1c\xd7\x5a\x3d\x83\x3e\xe5\x7d\x48\xb1\x6b\x17\x48\x15\xe4\x09\xa4\x4f\x97\xac\x92\x10\xc6\xb1\x96\x43\x0f\xf8\x11\x0a\x91\x37\xe7\xd1\x32\x0a\x63\xa0\xce\x63\x6d\x1e\xcb\xaa\x31\x65\x9e\x95\xd3\xba\x0e\xaf\x08\xea\xc3\x51\x21\x4f\x05\x56\xd3\x49\xa1\xbb\x45\xe1\x9b\x04\xb5\x99\x0a\x9c\x7a\xd6\xa4\x1f\xaf\xeb\x30\xe1\x5a\x68\x5f\xf1\xf8\xab\x08\xcd\xbc\x6d\x10\xa6\x41\x1c\x39\x3e\xb1\x45\xa1\x30\xbe\xe9\x9f\x20\x15\x1c\x0b\x83\x57\x3f\x3c\x13\x33\x84\x82\x5b\x45\x9f\x76\xb3\xe8\xc2\x7d\x37\x55\x79\x58\xbd\xcf\x43\xd8\xfc\x75\x89\x42\x1a\x6b\xb4\xd1\x6f\xcb\x72\x5e\xb7\x0c\x42\x21\x34\xa2\x6c\xf0\x28\xf5\x91\x1e\xd4\x13\xef\x06\x5a\x48\x8e\x33\xeb\xf1\xd4\xec\xae\x57\xd7\xeb\xdd\x3e\x33\x93\x28\x73\x28\x54\x8c\x4e\xf6\x66\xbb\xb8\xbf\x6e\x37\xf9\xab\xef\x7f\xfa\x24\x36\x84\x32\x90\x36\x0a\xde\x9e\x9a\x9e\xa9\xd8\xb7\x45\x0a\x77\x17\x57\x2f\x78\xed\x48\x76\xeb\x0f\x9e\x57\xf2\xd8\x0c\x34\xcf\x1e\xb3\x4a\x14\xcf\xe2\x33\x5b\x3b\x99\xf9\x5f\xce\x97\x0a\x15\xb5\x1c\xb1\xbe\x7a\x61\xbd\x7c\x50\xd3\xdd\x3c\x54\x11\x84\x2e\xb1\xb6\x69\x44\x75\xef\x9c\xc9\x0f\x1e\x50\x29\x8e\xd4\x0c\x68\x4d\xad\x44\x95\x9f\x3b\x4e\x2e\xd7\x43\x13\x63\xec\x19\x53\x10\x2c\xa1\xca\x8a\xfd\xd0\xce\x0f\x75\x20\x4c\xec\x69\xd3\x3f\x92\xc0\xf1\x7d\x43\x8a\xc3\x77\x6c\xde\xb7\x22\xeb\x26\xb3\x8e\x88\xf3\x5f\xec\x0a\x7a\x68\x37\xb8\x39\x34\xd3\x07\xb7\x05\x6e\xb4\x0d\x6a\xde\xd9\x08\xb1\xff\xbb\x14\xbe\x60\xed\x21\xd7\xab\x70\x3e\x1e\x18\x9a\xc0\x92\xec\x1f\x91\x30\x0b\x3f\xe8\x0d\xc0\x30\x56\x1b\x9a\x20\xe4\xf6\x25\x45\xa5\x9e\x91\x70\xd8\xb7\x48\x8d\x41\x93\x5b\x51\x37\x28\x84\x21\xfa\x28\x6a\x44\x02\xc5\x23\xcb\x98\xee\xe0\x0f\xce\xdb\x1a\xa0\x38\x26\xdb\x96\xbf\x52\xc7\x31\xf1\xd0\xe8\x76\x8f\xec\x43\xa5\x1d\x16\x72\x2e\x19\x13\x05\x84\x41\x62\x43\xf6\xad\xb1\x74\x53\x9e\xaa\xe6\x79\xf8\xc1\xa2\x20\xb6\x04\x92\xed\x75\x4b\xc8\x3e\x04\x5d\xfb\xee\x2a\xb4\x2e\x57\xcf\xfe\x04\x51\xa0\x25\x72\xb8\xfc\x80\x5a\x60\x30\x87\x3a\x36\x44\xd7\x4e\x09\x8d\xbd\x0a\xa9\x55\xd7\xeb\x5a\x1c\x47\xa4\x67\xfe\x7f\xfa\xc3\xd5\xc6\x0c\x86\x3b\x62\x24\x22\x6e\xb7\x74\x75\xbf\x73\xfc\x09\x10\x31\xcd\xb1\x9e\x67\xbd\x7c\xb0\x25\xef\xdc\xdf\x21\x24\xa9\x91\x8e\x80\xd6\x67\x66\xea\xf1\x01\x13\x45\x2a\x49\x1c\x5a\x05\xfd\xec\xe1\xf9\x1d\x45\x26\xb0\x98\xce\xaa\xf9\x59\x56\x2f\x56\xea\x60\x31\x38\x07\x66\xb1\x35\x10\xc5\x10\xc7\x8e\xf7\xd9\x62\x24\xa6\x51\x8a\x41\xdf\x34\xa4\x58\x16\x62\xf3\xf9\x8f\x56\x30\x6d\xa8\x1e\xed\x4f\x82\x28\x95\x3a\xf2\x34\xb2\x5d\xa8\x69\x76\x2f\x8d\x44\x10\xe2\xcc\xb9\x87\xb7\xeb\x6c\x9f\x35\x22\xb7\xa5\x2b\xb3\x73\x3f\x12\x01\x17\x7d\x74\x68\xf9\x2c\xaa\xac\x99\x52\x55\xfa\xae\xa1\xc0\xf2\xce\x83\x78\xbf\x6a\x0d\xd9\x05\x56\xd9\x0d\xd2\x2c\x91\x48\x25\x82\xb8\x4b\x74\xf8\xfb\x72\xb0\x4b\xb2\x97\x09\x7a\xa5\xbd\x54\x07\x9d\xb2\xbc\x85\x98\xe8\x41\x42\xaa\xee\x7e\x42\x8b\x8e\xdd\x6d\x5d\xb4\x93\xc8\x96\x80\x0e\x4d\x95\x48\xd2\x28\x74\x8b\x67\x71\x3c\x7e\x99\x86\xf4\xc7\xaf\x25\x63\x6d\x05\xf8\x4f\xf2\x90\x35\x9b\x06\xc4\xcb\x2c\x24\x0b\x22\x15\x24\xe8\xc7\x5b\xb6\xa1\xdf\xb3\xa6\x39\x5f\x2a\x3b\x4d\x78\x87\x20\x52\x34\x94\x2e\x6d\x89\x29\x97\x55\x0e\xc3\x31\x53\x8c\x63\x1d\x93\x1a\xb2\xef\x5d\x9d\xd7\x45\x03\x63\x58\x43\xdb\xd5\x04\x0e\xf4\xfc\x23\x3b\x5e\x55\xe5\x0b\x54\x9d\xc4\x19\x44\x8a\x47\x42\xf8\x30\x83\xde\xc3\xd5\xf9\x77\x4c\x90\x4f\x64\x5f\x00\xa7\xbd\xb6\xc8\xd8\xe6\x39\x26\x76\x9a\xfa\xbb\x68\xaa\xac\x4c\xa7\x17\x49\xc2\x57\xfc\x0c\x19\x0f\x91\x16\x1c\xe5\x0f\x77\x7b\x28\xb0\x3a\x07\xf1\x16\x1f\x0c\x7b\x8f\xb7\x21\x7e\x76\x6b\xa9\x43\x1b\x85\x83\xb7\xf6\x77\x77\x76\x97\x1c\x04\xbf\x22\x88\x6d\x52\xc4\x66\xf0\xec\x42\x16\x17\x72\x80\x10\x81\xa2\x60\x91\xf4\x8d\x7a\xee\x0a\x08\x20\x32\x11\xa1\xe0\x45\xfc\x37\xed\xa7\xc6\x95\x36\xbe\x3a\x26\x81\xcd\xf3\xad\x17\xd7\x58\x4a\xe6\xa7\x5d\x4c\x28\x45\x62\xba\xba\x11\xe8\x81\x61\xe9\x5b\x6f\xcf\xc6\x01\x91\xa1\x4f\x52\x8e\x02\x4e\x71\x60\x94\x95\xf1\xa8\xd1\x6c\x2f\xc4\xa9\xa9\xc7\x46\x45\x4c\x83\x48\xbb\x7d\x08\x7d\xe7\x6f\x90\xed\x9f\x9b\x01\xaf\x38\xc4\x94\xaa\x50\xfa\x8a\x97\x75\xf1\xfe\x73\x4a\x90\xef\xfb\x19\xcd\x1d\x6a\x70\xe9\x63\x73\x83\x7d\x3b\x66\x29\xa3\x69\x27\x3b\xf0\x79\xe4\x34\x66\x32\xc2\x35\xb9\xb8\xfe\xb1\xde\x3c\x3c\xfd\xb9\xbb\x7a\x68\x8d\x25\xac\xb2\xd8\xf8\x87\x0f\x89\xa5\xec\x3b\x62\x30\x71\x55\xe8\xae\x00\xaf\x3b\xdf\x4e\x63\x2d\xed\xb1\xd1\x7b\xc1\xd8\x32\x5a\x7b\xfe\x47\x58\x8a\x79\xb7\xf6\x38\x11\x39\x8c\x8f\x94\x38\x22\xd6\xbf\xee\x63\xb0\xdb\xcc\xb3\xd5\xb9\x2e\x71\x64\xc5\xaa\xee\xca\x72\x7f\x1a\x06\xe7\xe2\x58\xa7\x61\xe2\x99\xd9\x7d\xcc\x60\x3c\xa8\x3c\x0a\xa0\xb5\x6a\x57\x87\x2c\xdf\xa2\x32\x77\xd6\x5d\xce\x39\x41\x13\xe3\x1f\x47\xa8\x1e\xed\x91\xfb\xd7\xf0\x08\x31\x97\x21\x0a\x6f\xc2\x6b\x99\xbf\xc2\xe2\x3d\x9b\x2f\xe4\x84\x38\x51\xb6\x8c\x66\xa1\xf5\x53\xa9\x5e\x60\x64\x3d\x38\x1f\xa8\x43\x84\xfe\x8f\xff\x74\x97\xfb\xdf\x32\x32\x71\xcc\x7c\x3a\x6b\xb0\x8c\xf7\xb1\x2a\x5f\xb3\xe1\x5a\x99\x3c\x5e\x2a\x12\x2f\xaa\xf6\x0d\xb2\x6a\xb8\x11\xc7\xa9\x52\x58\xa9\xfb\xf5\x6e\xf3\xd7\xf4\x48\x21\x16\x41\x2a\x4c\xc7\xd2\xbb\x29\x73\x6d\x09\xa6\xba\x66\xc5\xfa\xad\xbd\x3d\x8c\xf5\x1c\x90\x24\x16\x34\x44\xe7\xf1\xdb\xc3\x66\xbb\x5b\x7a\xb6\x35\x88\x05\x27\x58\xb6\x64\xb1\x0c\x77\xd0\x08\xdd\xee\x32\xe3\x57\x92\x84\xa7\x03\x86\x6a\x4f\xcb\x34\x31\xdb\xe7\xb1\x4d\xee\x16\x8a\x48\x5f\x28\xe9\xa7\xd5\x55\x39\x91\xe8\x84\x58\x09\x81\x9b\xbf\x3c\x9d\xaf\xce\x57\xe5\xe7\xd4\xe8\x10\xeb\x44\x20\x86\xb1\xdd\x27\xad\x61\x77\x5b\x36\x0f\x66\x99\x8b\x53\x0d\xdd\x5e\xa5\x95\x40\x66\xfc\x9d\x70\xea\xd9\x9f\xa7\x24\x63\x08\x02\x6d\xc3\x20\xae\x94\x13\x3f\x55\xcf\xe8\x09\x31\x50\x6a\x02\x8f\x54\x18\xe6\xc1\x62\x13\x68\x74\x90\x8f\xe2\x2c\x64\x0e\x37\x59\x51\xc0\xf9\xc9\xd6\x87\xe8\xae\x53\x24\x91\xca\x6d\xa7\x10\xe1\x7b\xca\x1b\xab\xca\xbe\xae\x7f\x66\x1f\xcc\x2a\x4e\xa8\xc4\x1a\xa3\xac\xde\x9c\x64\xad\xaa\xec\x88\x09\x04\x8b\x9a\x9b\x23\x07\x00\x4e\x62\x92\x5a\xd5\x9d\xfd\xc0\xca\xfe\xac\x08\x6b\xb2\x23\x7d\xf0\x24\x09\xf0\x0e\xa6\xb1\x2c\x8b\x3a\xd3\x50\x81\xb6\x22\x0d\xc3\xc1\xe0\x81\x8e\x9c\x62\x53\xd6\x3c\x56\xa5\x02\xd0\xf3\x25\xec\xc0\x69\x60\xbd\x34\x03\x8d\x7a\xc6\x28\x76\x7d\x53\x56\x18\x8a\xbe\x3a\x5f\xd6\x60\x02\x0f\x93\x08\x3d\x89\xe5\xd7\xe5\xdd\x97\xee\x6f\x09\x73\xe0\xa3\x76\x5b\xca\x0e\x65\x71\x9e\x5c\x16\xa9\xd0\x58\xb2\xec\x37\x51\x69\x47\x90\xf4\x43\xb4\x83\xe3\x7b\x98\x14\xe5\x4c\x0e\xa5\x7a\xd9\x61\xa8\xc0\x32\x2b\x4c\xcb\x45\xe7\xdf\x23\x0e\x2c\x42\x6a\xb3\xfa\xa3\xaf\x1d\x01\x1e\xb3\xc8\xd6\x08\xa8\x72\x55\xe8\xef\x85\xa9\xca\xff\xc2\x28\x20\xc2\x63\x57\xb6\xb4\x5e\x3e\x8c\x20\x07\x9c\x47\x12\x99\x8f\x11\x70\x7d\x8d\x35\x23\x03\x27\x98\x73\x11\xa3\x21\xb0\x2f\x73\x3d\x06\x87\x70\xae\x28\x8e\x47\xa7\xcc\x31\xbb\x8a\x38\xd7\x11\x6e\xd9\x87\x9d\x7a\xce\xc0\x56\xde\xe2\x61\x71\xd5\x6d\x33\x3c\x49\x52\x2c\xad\x59\xac\xbf\x0d\x4f\x0b\x9e\x24\x12\x49\x16\xd6\xb7\x37\x6e\x57\x58\x8a\x42\x67\x3d\x09\x05\xf0\x34\x35\xa1\x18\x49\x89\xfe\x92\x87\x08\xb8\x08\x23\x29\xec\xa7\xfc\x07\x34\xcf\x3e\x0e\x05\x1f\xcd\x1f\x91\x30\x14\x21\x79\x3e\xeb\xaa\x1c\xb3\x62\x02\x17\x9a\x19\x17\xf0\xfd\x7e\xdc\x57\x42\x83\x90\x59\x9e\x35\xe7\xcb\x22\x63\xe0\x92\x30\xcc\x80\xba\xea\xe5\x11\x2e\xea\x83\x15\x21\x83\x18\xab\xa3\xaa\x53\xfd\xbc\xcd\x0e\xd0\x31\xd2\x59\x80\x48\x3d\xe2\x2c\x00\x2e\x59\x42\xad\xf6\x81\x0d\x56\xdd\x94\xd5\x6a\xfb\xed\xcb\xe4\x9e\xb1\x15\xe6\xb2\xcc\x1e\x59\x73\xd2\xdd\x80\xca\xd8\x2a\x1d\x17\x2e\x2f\xb5\x84\x3c\xc7\xa2\x53\x7d\x35\xcf\x9f\x0b\x5c\x11\x5b\x16\x26\x5a\xcf\x72\x91\xe7\xbd\x6b\xf5\xc1\x05\x9a\x10\x9c\x8d\xaf\xd6\x83\xcf\xc6\xb9\x4c\xae\x89\x25\x79\x15\x5a\xe3\x99\xf8\x8b\x01\x02\xca\x90\xfc\xa8\x6c\x77\x87\xd6\x5a\xa8\x1f\x47\x62\x31\x17\x5b\x17\x68\xe2\x05\x16\x6f\x45\xdd\x5c\x65\xfa\xa6\x6c\x67\xd6\xab\xa8\x87\x3a\x12\xc0\x4d\xa4\x71\x5b\x6c\xcd\x44\xeb\xf8\xf8\x14\x0c\x37\x22\x4a\x79\x97\x4d\xed\x79\x25\x83\x79\xe6\x5a\xe0\x46\x05\xb8\x5d\xed\x2a\x51\xe8\x19\x55\x0a\xdf\xcd\x08\x3c\x1e\xae\xb2\xe6\xcd\x57\xdf\x40\x12\x30\x5b\x27\x72\x10\x2f\x70\x95\xe9\x2f\x63\x1b\xaf\xeb\x64\xa9\xf4\xac\x12\xbc\x65\xcd\x77\xf4\x51\x03\x1b\x2a\x09\xa2\x04\xcd\xff\x4f\xaa\x27\xa6\x37\xe6\x1a\x39\x80\x34\x26\x80\x9d\x24\xde\xc8\x59\x4b\x82\x84\x79\x12\x9d\xc7\xaa\x34\x59\x3e\xa4\x5a\xf0\xf1\xf7\x7f\xf9\xce\x22\x42\xf3\xda\x08\xd5\x6c\x41\x1c\x1e\xcc\x97\xc9\x0f\x9a\x28\x70\x1c\xb8\x4e\x2f\x83\x7e\x3e\x07\x12\x4a\x2c\x46\x28\x43\x99\x94\xee\xbb\x8f\xfb\x18\xeb\xd4\x34\x20\x0e\x43\x91\x0f\x48\x18\x68\x4c\x9d\x7e\x13\xf5\xf3\x80\x40\x0d\x92\x90\x5a\xba\x2b\xdd\xe9\x3b\x41\x12\x11\x2d\xd2\x11\x1d\x1c\xaa\xb8\x7d\x90\xbc\x4d\x38\xb3\x20\x9e\xc5\x8f\xaf\x96\xce\x71\xb3\xa3\xe1\xb7\x2f\x5d\xab\xc1\x02\x30\x2f\x4d\x78\xb7\xf8\x63\xf7\xb4\x58\x6f\x56\x5d\x07\x63\x5d\x11\x8c\xd5\x6e\x1a\xd1\x78\x50\x7f\xdb\x64\xc1\xd1\x7b\x51\xe3\xf2\x41\xcb\x6d\xe7\x5b\x13\x1a\x06\x74\x50\xa2\x76\x9d\xbd\xd6\x8f\x55\xa9\x4f\xaa\x7f\xef\x84\x2a\xb4\x34\x30\x7b\xb3\x39\x82\xca\xa0\x9e\x04\xbd\x46\x0b\x37\x49\x63\x89\x7e\xdd\xf6\xd1\xc7\x6f\x93\x54\x50\xb4\x03\x0e\xe2\xfd\x1b\xf2\x56\x0f\x4d\xd2\x24\x15\x36\x71\xba\x87\x66\x55\xab\xaa\x7c\xbb\xbe\xb0\xff\x12\x11\x27\xb8\x27\xae\x2d\x51\xc8\x66\xc4\x5b\x0a\x89\xe0\x41\x42\xfa\x10\x6b\x6b\x81\x75\x19\xd8\xc9\x8d\x92\x38\xed\xeb\x9f\xad\xf5\xf2\x58\x59\xa9\x6a\xbd\xd2\xd9\x88\x24\xe2\x03\xea\xca\x0b\xc7\x68\xfa\xf7\xcf\xec\xd0\x44\xa6\xb6\x8a\x50\x9c\x9a\x72\xd3\x3a\x1a\x23\x7e\x94\x0f\xae\x51\x80\x4c\xf3\x47\xfc\x38\x4d\xb0\x3b\x96\xdd\xf0\x29\xad\xb1\x2c\x7c\x7d\xb5\xfd\x4c\x20\x1b\x12\x2d\x9c\x47\xdc\x1e\x42\x1f\xb2\x1e\xfd\xe2\x5f\x77\x2f\xa0\xd4\x72\x90\x1e\x44\xd5\xc0\xfb\x40\x68\xc0\x77\x60\x12\xeb\x96\x6f\xfa\x4d\x05\x0c\x20\xaa\xc8\xa6\xe8\x8a\x26\x6b\xce\x93\x1d\xc2\x04\x9a\xf6\x75\x65\x83\x23\x62\x12\xb0\xf0\x24\x5f\x61\xb7\x5d\x18\x6a\x81\x3a\x56\xef\x42\x4d\xd2\xef\x89\x89\xad\x76\xa9\xfb\xea\x85\xbe\x3a\xb5\x87\x90\xcd\x9c\x3e\x8a\xf3\x80\x16\xf4\xaf\x81\xb9\x53\xc2\x43\x33\x24\xf1\xda\x9c\xb0\xc6\x75\x00\x1e\x4a\x89\xa4\x41\x57\x28\xd9\xfd\x11\x52\xd3\xcb\xc7\x6e\x4b\xcb\x5c\xdf\x8e\x5f\x56\x9c\xba\x5e\x81\x8c\xd3\x5e\x80\xff\x09\xcc\x47\x68\xf1\x94\x4a\x4a\xc2\xde\xd3\xbe\x01\x18\xc0\xe5\x53\x06\x51\xc0\xba\x18\xcd\x83\x31\x50\xb5\xc7\x58\x3b\xf2\xe3\xdb\x84\x52\x1a\x57\xac\xba\x14\xd5\x35\x34\x22\xcb\xc7\x07\x5d\x1a\x82\xe5\x3e\xc9\x0e\x1d\x5c\xec\x6f\xe3\x7b\x80\xc2\x5d\xec\x98\x0b\x05\x57\x2e\x45\xd8\xe3\x41\xba\x1b\x45\xa1\x55\x36\xf5\x85\xd7\x03\x20\x4a\x1a\xc5\x29\xea\x3b\x3c\xde\x2e\xb6\xb8\x61\x3d\x60\x35\x78\xd7\x2c\x38\x1e\xb6\x5b\xa1\xca\x71\xa0\xef\xd3\xea\x16\x7f\xb5\xa2\x96\x52\xaf\xae\x4f\x70\x27\xc6\x0c\xaf\x90\xc6\xd2\x95\xb3\x43\xb5\x87\x6b\xe1\x89\xfd\xda\x06\x83\xab\x6f\x2b\x5e\xa0\x93\xaa\x86\x94\x47\x29\x4e\x01\xab\x9a\x7f\xf7\xfd\x76\xbb\x7e\xbc\x5d\xaf\x9e\x76\xeb\xe5\x03\xed\x3a\x25\x86\x24\x43\x7e\xb4\xed\x1b\x40\x7f\x0b\xad\x31\x35\xd0\x6e\xe9\xcb\x87\xbb\xbb\xf5\x66\xd3\x11\x4f\x41\x9a\xa4\x1a\xb1\xfe\xcf\xa5\x83\xf3\xb9\xbf\xa7\x49\x88\x3b\x88\x16\xe7\x4b\x5e\x4b\x48\xd3\x14\x14\xb8\x2c\x63\xf5\x3a\x4e\x82\xa7\xa9\x10\xcc\xc3\x03\xa0\x3d\x99\x50\x9c\x73\x72\x03\x43\xb0\xcf\xa6\x63\x7f\x1a\x9d\xd4\x9f\xfe\x7f\xee\x16\x82\xf0\x24\xea\x54\x8f\x8a\x02\xf2\xc7\xb2\x6e\x46\x9a\x18\xbe\x67\x4a\x51\x2a\xf6\xcf\xdf\x2f\x76\xaf\xcb\x58\x44\x2a\x40\xa0\x90\xd9\x41\xbc\xb7\x5b\xf6\xdf\x4f\xc2\xee\x23\xae\x59\x92\x28\x18\xd2\xc7\x6d\xca\x69\x7d\x48\xaa\x82\x14\x41\xaf\xbd\x0c\xf9\xe1\x70\x2a\xb2\xe6\x3c\xf8\xb2\x5a\x59\xe3\xaf\x6c\x17\xcc\xe6\xa5\xf5\x08\x1d\xd2\x65\x5b\xfa\x48\xfc\xa7\x71\x81\xd4\xa4\x31\x06\xc5\xdf\x30\x70\x58\x2f\x8e\xc7\xb2\x6a\x3e\x8c\xd8\x08\x12\x28\x4c\x00\xd9\x77\xdd\x3a\xd5\x80\x99\x4d\x5c\x90\x14\x62\xf0\x38\x3f\x73\x2a\xf4\x84\x44\x11\x04\x01\x16\xf5\xa5\x76\x43\xd9\x38\x10\x01\x4b\x6c\x41\xae\x30\xf0\x35\x7b\x85\xab\x73\xe7\xa9\xcc\xbe\x87\x08\x52\x86\x99\x57\xc7\x58\xb2\x2a\xf4\xcf\xb2\x7a\x19\x0f\xa9\x08\x52\x8e\x39\x55\x1b\x85\xc7\x52\x8c\xe6\xcb\x2c\x0a\xf8\xd3\x7f\xc6\x37\x65\x81\xe9\x6b\xd6\xcb\xd2\xcc\x8e\x06\x4b\x13\x34\x98\x5d\x58\xc8\xba\xad\x63\xc4\x80\x60\x42\x5b\x7c\xe1\x09\x3f\x82\x63\x55\xfb\xfb\xa9\xac\x4e\x87\xc9\x8b\x84\x84\x63\x91\x87\x23\xdc\xf7\x36\x90\x08\x99\xa0\xae\x58\xf9\x4e\xd4\xb5\xfb\x81\x6d\x79\x11\xf3\xf5\xf3\x5f\x84\x11\x95\x36\xc6\x7c\x95\x59\xda\x9c\xd3\x00\xf3\x29\x42\x67\x85\x64\x45\xbb\xab\x67\xaf\x59\x9d\x15\xfb\x95\x31\x65\xd5\xd4\x43\x89\x72\x10\x11\x97\x0e\xc5\x5d\x9f\x0e\xb0\x5e\x3d\x74\x0d\x32\xb6\x00\xa4\x32\xc7\x0c\xc5\xe5\x3a\x16\x31\xa1\x54\x75\xa7\xc8\xee\x30\x09\xad\x8d\x87\x32\x0e\x79\xcc\x1c\x18\x7c\x70\x74\x8a\x38\xd1\xe8\xb8\x6d\x9e\xc5\x0b\xe8\xf2\xad\x20\xef\x5d\x13\x04\x56\xfd\xf8\x74\x5e\x14\xe8\x59\x5d\x57\xa2\xd8\x77\x20\x22\xc1\x13\x8e\x00\x95\xfa\xb9\x7c\xcb\xe1\x15\x72\x8d\x07\xcb\x78\x07\x10\x49\x60\x33\x93\xbe\x50\xe4\x6e\x73\x37\x9f\xd5\x10\x89\x0e\xb9\x1a\x6e\xa6\xdd\xec\x1d\xd9\x11\x22\xd1\x4a\x39\xe2\x31\x3c\x25\xda\xb1\xb9\x13\xef\x68\xe3\xae\x0f\x8e\x61\x1b\x4b\x6f\x7d\xe6\xc3\x7f\xb7\x94\x26\x91\xb3\x88\xaf\xe1\x75\x94\x61\xf1\x3d\x62\x7b\xa4\xda\x03\x7c\x03\xaa\xb2\xe4\xd5\x58\x8e\x3f\x7e\xdc\x54\x86\xcc\x67\x11\xda\x63\x7e\x5d\xd4\x4d\xfb\xcb\xb3\xc9\x3c\x21\x18\x49\x03\xff\xd3\x22\x87\xca\xca\x8d\x9e\x9c\xfa\xf4\x20\xe2\x22\x84\x10\x24\xf1\x78\x08\x24\x9a\x9b\xe1\xb5\x00\x21\xa4\x65\xf1\x73\x59\xcf\xdc\x67\xf7\x85\xa4\xa1\xb6\xea\xf9\x56\xca\xbc\xb5\xfb\x7f\x66\xcd\xf3\xac\x18\x09\x08\xc5\x18\x96\x00\xb6\x8f\xf5\x29\x5d\x0d\x08\x15\x51\x2c\x43\xde\x56\x42\xa3\x12\x81\xe9\x26\x92\x8a\x98\x65\x1b\xcf\xb3\x83\x68\x60\x59\xf5\xf3\x44\x09\xea\x61\x4f\xf8\x8d\x7e\xc3\x22\x3b\x34\x75\xb3\x41\x2f\x1d\x47\x3e\xa3\xe3\x5a\x47\x67\x9b\xd0\x29\x84\xdc\xfb\x41\x8b\x42\x8f\x55\x48\x01\x69\x0f\xc3\xc1\xcf\xcc\x0e\x1a\x50\x2b\xd6\x71\x05\x0d\xbc\x42\xd1\x5c\x38\x12\x7f\xd5\x0b\x70\xf7\x33\x91\xb0\x95\x83\xed\x2f\xee\x72\x51\xe8\x5d\xdd\x31\x41\x83\x30\xad\xd3\xdf\x67\x7b\xbb\xd0\xd5\x07\xc5\x4f\xf6\x2a\x49\x88\xb1\x81\x82\x3d\x34\x4f\x42\x41\xb5\x14\x63\x11\x71\x90\x01\x8b\x22\x27\x0c\xf1\x8d\x8e\x20\x82\x92\xc6\x9c\x59\x20\x1d\xbc\x66\x79\xb6\x07\xbd\xf8\x0b\x72\xfc\x20\x29\xb7\x50\x4b\xa1\x35\xce\xf6\xe1\xe0\x4b\x6a\xec\x8b\xec\xa1\xf9\xfb\x30\x6a\xe0\x9a\x19\x27\x18\x2d\xf5\x8a\x04\x8f\x22\xd3\xd3\x2e\x20\xd1\xf6\xbb\x2d\xf7\x43\x4d\xb2\x47\x71\x2e\x4f\xf3\x24\x2b\x20\xc3\x90\x7b\xe9\x45\xe4\xab\xf9\x7e\x5c\x96\x1f\xf0\xcd\x81\x0c\x39\xa0\x2c\x69\x6b\x69\x7d\xbf\x5f\x6f\xff\xdc\x3d\x3e\x3c\xdc\xfa\x51\x09\x0d\xc1\xba\x4b\x4f\xc7\xbb\x7d\xbb\xc8\xc6\xb9\x9e\x51\x62\xd5\xa2\xda\xa3\xe9\xe1\xe1\xd6\x69\xfc\x47\xe3\xf1\x88\xe3\x14\x1c\x19\xca\x37\x97\xf9\x5c\xed\xf7\xbd\x9a\xa5\xeb\xc6\xa3\x10\xc9\x6a\xa6\x00\xf1\xf1\x6b\xf2\xd8\xd2\xfc\xcb\x4c\x7f\x19\x32\xbf\xfd\x6d\x60\x57\x4b\xae\x35\x3a\xc1\x3b\x55\x1e\x8e\xa7\x19\x29\xc1\x80\xba\xcc\x9f\xfb\x37\x24\xee\x1f\x77\x83\x24\xe0\x08\xcb\x83\x46\x8d\x0e\x21\x99\xa4\x36\xcd\xdd\x94\x4d\x77\x30\xc8\xc4\xa4\x58\x8f\xd8\x05\x60\x2e\xc2\x2f\xa3\x57\x48\x43\xe3\xb3\x7a\x37\x15\xc0\xa3\x50\x99\xe9\xc8\x0f\x40\xa6\x2a\x24\xe0\x34\x1e\x84\x3e\x6f\xad\x42\xea\x64\x86\x08\xa5\x91\x40\xf5\xf1\x69\xb5\xbb\x7a\xb8\xff\xee\x53\x9e\x52\x68\x26\xbc\x17\x24\x8e\x8d\xc8\x8a\x1e\x76\xdb\x8d\xcf\x00\x83\x70\x0f\x6f\x08\x20\xad\xb3\xfd\xe4\x7b\x28\xc2\x02\xd2\xad\xc7\x07\x7d\x29\x9d\xe1\x3b\x6a\x8a\xe1\xd1\x85\xd6\x9b\x52\x65\x22\x77\x95\x32\x17\x49\xf6\xf9\x15\xac\x99\x49\xe3\x9e\xb9\x6b\x7e\x00\xc7\x8f\xa6\x43\x4b\x1a\x5f\x3f\x97\xc7\x4d\x53\x56\xe0\x67\xaa\x1f\x05\x20\x14\xf7\xb7\x01\xee\xfa\x97\x12\x5a\xe3\x97\x82\x28\xc2\xd4\x31\x26\xb5\x5f\xa0\xb0\x06\xd5\xba\xf8\x20\xb9\x2d\x4d\x00\x4c\x3b\x08\xf0\xa9\xf1\xf9\x84\xd1\x3d\x15\xa1\x80\xba\x6f\x4e\x11\x7c\x40\x06\x62\xd9\x10\x47\x77\x54\x41\x1a\x60\xbe\xbf\xc6\xc9\xab\x27\xba\x4d\xa0\x02\xad\x93\x7e\xbf\xbc\x2f\x0b\x07\xdb\x77\x89\x07\x6b\x2a\x4e\x5f\xf6\x82\x0f\x6d\x44\xb2\x3d\x48\x6b\xab\x00\x00\x5d\xab\xcd\x76\xb1\xc5\x40\xdb\x8f\xc5\xed\x77\x1f\x68\x53\x94\x44\x22\xf2\xc8\x10\xa1\x9a\x5b\xac\x44\xec\xec\x44\x45\x63\x45\xc0\x57\xa7\x8b\xe2\x51\x54\xe2\x00\xcd\x00\x19\xfc\xcb\x88\xd2\x7c\x24\xc9\xdf\xde\xd8\x29\x87\xd5\xac\x3b\x04\xcf\xee\xf4\xa9\x1a\xe2\xb6\x15\x23\x5a\x05\x1d\x4f\xda\xfe\xb9\x79\x3c\x15\x99\x27\x0a\x02\xc5\x82\x04\xfd\x7c\x4b\xf6\x7f\x27\x70\xa3\x73\x73\xa4\x1e\xc0\x12\x14\x13\x12\x97\xda\xce\x9c\x9a\x53\x05\xa3\xfd\x40\x85\x40\x30\x8a\xec\xe3\xff\x8f\xa7\xe2\xc5\x43\xb9\xba\xc1\x88\x84\xf4\x9e\xef\x22\xcf\xaf\xc5\xf1\xe8\x4d\x72\x15\x47\x81\x91\x03\x69\x5d\x47\xf5\x88\xc2\xb6\xb3\x70\x7b\xc5\xa9\x46\x80\xcc\x66\xbb\xf8\xba\xda\x31\x7f\x23\xce\x65\xcc\x06\xd1\x14\xd4\xfc\x28\x86\x7a\xf7\x17\x84\x5a\xa0\xb8\x89\x10\x5d\xff\x5b\x79\xaa\x9b\x1e\xad\xa3\xb8\x71\x1a\x78\xe5\xe1\x88\x92\xba\x45\x03\x15\x4c\xe7\xbc\x4a\x8c\x80\x64\xe8\x41\x2f\x9a\xdf\x61\x72\xdc\xa9\x54\xa4\x49\x67\x8a\x8c\x13\x14\xe3\xbb\xa5\x2a\x4c\x9c\x27\x90\x9f\x34\xd4\x1b\x98\x18\xb3\x4a\x68\xbb\xe9\xed\x2b\x51\x60\x28\x7c\x98\xfe\x52\xc2\x84\x3e\x4d\x75\x57\x16\x70\xfe\x88\x99\xd2\x75\x97\x42\x88\xc0\x9e\xb1\xf3\xe7\xea\xb4\xbf\x8c\x70\xbe\xbc\x65\xae\xba\x2a\xf0\x3f\x2c\x0d\xc7\x6a\xdc\xdf\xb3\x5a\x88\xee\x71\x14\x00\x1e\xf3\x3b\x4f\x5e\xfa\xf9\x9e\xa6\xb4\xab\xdb\x1d\x60\x3d\x44\x3e\xca\x3e\x2a\x1d\x18\xd0\x1e\xcd\xfa\x31\xf5\x39\x28\x4d\x39\x32\xc6\xe5\x59\xf1\x82\xc9\x8c\x49\x73\x18\x5b\x26\x81\xd6\xe0\xb5\xc5\x45\x4b\x51\x48\xe8\x31\x26\xbe\xa3\x02\x70\xa1\x3d\xef\x89\xcf\x0f\x8e\xd1\x36\x7c\x8e\x84\x1e\x5e\xd1\x0c\x34\x0d\x42\xe3\xb5\xc7\xcb\x32\x07\x51\xdc\x89\xa3\x35\xe6\x27\x78\x85\x4b\x00\xa2\xa6\xa9\x26\x9d\xb9\x68\xb3\x77\xdd\x92\xd2\x14\xb8\x76\xe4\xd7\x5f\x61\x82\x94\xd2\x8c\xa5\x60\x3c\x3b\xdd\x37\x51\xb5\x86\x7d\x57\xe7\x77\x81\x02\xbe\x74\xbd\xfd\xae\x14\xfa\xb0\xfe\x70\xef\xd1\x2c\xb6\x52\xcd\xcf\xa2\xbe\x2b\xb5\x05\x13\xfa\xc7\x62\x69\xac\xe2\x2e\xfa\xee\x69\x85\x66\xc7\x4c\x33\xb0\xfe\xac\xc5\xb0\x2d\x97\x0f\x9f\x85\xac\x75\x98\x58\x06\xe9\x21\xf7\xf3\x7c\xa4\x42\x87\xc2\x16\x06\xb8\x03\x75\x54\xf0\x3e\x79\x86\x48\x59\x9d\x79\xc7\xa8\x77\x07\x95\x3a\xe5\x53\xb0\xbe\x8e\xa3\x80\xda\xba\xef\xdc\x96\x21\x8c\xe7\x93\x8e\x75\x82\x1f\xe3\x6b\xfb\xd6\x27\x63\xee\x4f\x87\xd9\xbd\x4b\xf3\x58\x78\xe3\xc4\xe3\x5e\xdd\xfc\x73\x66\xf9\xf8\xbe\x09\x15\x08\xc7\xad\xb3\x62\x87\xf5\x3d\x3b\x4b\xea\x38\x79\xbc\x84\x59\x8a\x17\x9b\x5c\xb4\xa4\xd8\x48\x77\xb8\x11\x39\x7c\x18\x98\xd0\x49\x6a\x57\xd3\xd1\xea\x9b\x4d\x12\xd5\x3a\x81\x34\x76\xa0\xcf\x55\xa1\x8f\x65\x56\xf4\x4d\x86\xb9\x58\x4b\x85\x04\xb3\x57\x59\x9e\x7f\x18\xd1\xd2\x22\x20\x08\x5a\x84\xe6\xb9\x86\xdc\x0c\xf7\x2c\x2d\x58\x84\x95\xb7\xcf\xa2\xbe\x9f\x6a\xac\x80\x16\x49\x84\x05\x37\xcf\x25\x42\x68\xc6\xb7\x95\x81\x42\xf5\x1d\x97\x1b\x9f\x3e\xbe\x4c\xac\x3e\xdb\x16\xa9\x4f\xba\xbf\xa6\x76\x41\xdf\x5e\xff\xb1\x1c\x81\x9e\x7c\xbb\xb4\x5c\x4f\x16\xf4\x7b\x5f\x36\x23\x31\x6d\xd0\x3a\x48\x2c\x1c\x27\x3b\xc0\x60\xcb\xf4\xad\x4c\x60\x6a\xd9\x89\x37\x6c\xb6\xcb\x61\xa2\x5a\x6b\x21\xd0\x69\xba\x86\xfc\xc7\x47\xec\x40\x5a\x0b\x99\x46\x9e\x89\xe2\x7b\x31\x9a\x16\xfd\xf9\x35\x19\x62\x6d\x62\x64\xba\x69\x9d\xfb\x21\x22\x4b\x43\x18\xe3\x99\x82\x76\xc2\x1c\x89\x84\x86\xc4\xb2\xb3\xbd\x3d\x8b\x66\x5d\xdf\x65\x75\xdd\x03\x33\xb5\x89\x18\xc2\x95\x33\x55\x76\xce\xef\x64\xa0\x81\xc4\x0c\x4d\xcd\xa6\xca\xd4\x4b\x0e\xdf\x8f\x5d\x83\xb0\xd5\x73\xc2\xb3\xaa\xde\x89\x1e\x02\x33\x7d\x05\x08\xc2\xc8\x38\xbc\x4c\x65\x19\x42\x07\x68\x70\x08\x64\x82\x87\xd5\x1f\x57\x9b\x46\x14\x5a\x54\xfa\x2f\x42\xd6\x20\xd0\x21\xfa\x72\x28\x78\x8c\x61\xc9\xac\x2c\x06\x89\x11\xa0\x51\x1c\x30\xcf\x16\x50\xa9\xc1\x56\xf1\xa1\xdd\x00\x34\xb5\x20\x5d\xd7\xe3\xa1\xb3\x67\x80\xb6\x53\xc8\x51\x65\x8b\xdc\x22\x36\xea\xab\xf3\x06\x2e\xa4\xb7\x01\x18\x4b\xc0\xc6\x5e\x0c\x54\x22\x5f\x68\x5d\x5d\x9d\x3f\xda\x3b\x80\xc5\x1c\xab\x33\xf1\x96\x1e\x5e\xf7\x28\xaa\xe6\xa1\x80\x8f\x2a\x3b\x7e\xc5\x70\x3d\xac\x63\x99\xfc\x6d\x60\x0a\x43\x48\x28\x66\xf0\x16\x5a\x7f\x1c\xf0\xf4\x7d\x55\x44\xe8\x98\xdf\xce\x8f\x0d\x27\x91\x67\x9d\xaf\x1a\x64\xd6\x18\x31\x77\x00\xe7\xb1\xb0\xed\x9d\xe6\xf1\xfc\xb6\x0d\x1c\x02\xac\xf8\x40\x7d\xb7\x01\x75\x1d\x40\xc2\x24\xca\x67\x6e\x17\x9b\x87\x6f\x0b\x44\xc3\x7e\x76\xac\x40\x12\x9a\xd8\x9d\xd0\x18\x39\x9f\xff\xbd\x44\x30\xe9\xbe\x37\xfd\xc0\x3d\xff\xd5\xbf\xee\x4e\x29\xd5\x18\x70\x71\x45\x6b\x57\xe7\x5b\xd8\x0b\x75\x01\x95\x99\x5e\x95\x84\x68\x40\xbf\x42\x55\x63\x80\x57\xc3\xfb\xd4\xbb\xf4\x5d\x53\xf0\x61\x4b\x2f\x8d\xe0\x5a\x64\x1a\x23\x78\xf3\x5b\xb6\x7f\xce\x05\x3a\x54\xae\x45\xa5\x12\x21\xe2\x5e\x53\xbc\xc8\x4c\x7b\x36\x8d\x18\x7f\x07\x96\x09\x68\x95\x22\x8e\x1b\xad\x9d\xab\x93\x77\x06\x00\x34\xd1\x8e\xa3\xe4\x8f\xf6\x45\x26\x53\xc3\xc8\xd4\x02\x43\x7a\x12\xca\xeb\xfb\xa7\xe9\xb9\xd4\x76\xc3\x70\xc9\x63\xf6\x0e\xf9\xf0\xb4\x30\x84\x10\x44\x6f\x95\xa7\xe6\x78\x9a\x04\xf7\x0d\x49\x62\xcc\x43\x63\x1e\x6c\x9b\x41\xc5\xba\x96\x94\x61\x16\xec\xba\xdc\x03\x1d\xdf\x10\x0c\x05\x3f\x59\x11\x5e\xb4\x79\x2e\x4f\xb9\xbe\x02\xd6\x19\x71\x26\x90\x29\x7a\xad\xd8\xa9\x79\xae\x00\xd6\x05\xf6\xbd\x11\x79\x0d\xab\xff\xdc\x7a\xf2\x75\x30\x34\x0a\x04\xf7\xf8\xd8\x65\xe3\x07\xd8\xb0\xc8\xf2\x24\x7e\x13\x85\xfe\x99\x15\xf5\x8f\x0c\xc6\xcc\xbd\x6d\x17\x88\x1d\xa9\xed\x1e\xe8\x80\xf8\xcd\x30\x4e\x07\x74\xea\xe8\x58\x59\xf7\xe6\x36\xc3\xaa\xa6\x75\xd1\xa7\x84\xbf\x17\x59\x33\xbd\xb1\x54\xbe\x78\xa3\x4f\xf3\x55\x87\x1e\x9f\x9f\xf8\x8e\xc6\x56\xdc\x2e\x6e\x9e\x3a\xd6\x58\x30\x61\x00\xcc\x15\x2e\xac\x1b\x38\xac\x75\xfd\x28\xf6\x42\x5e\x06\x41\x5d\xff\x48\x49\xc4\xf0\xfe\x58\x2f\x47\x43\x1d\x69\x4b\x99\xfb\x28\x8e\x97\x68\xdd\x0f\xb6\xa7\x7f\x8e\xc5\xe0\xc1\x70\x6a\xeb\x87\x6d\x42\x6b\xf3\xd6\x17\xd8\x5d\xec\x6c\xb3\xa7\xab\xe1\xb1\x46\xcb\xc5\x97\x88\xcf\x6a\x87\x4c\xde\x88\x0b\x9d\x2a\xaf\xf8\x35\xa4\x0f\x19\xe6\xc6\xfb\xee\x49\x22\xd0\x0d\xbb\xbe\xfe\x6d\xb1\x1d\x20\xa9\x4c\x22\x22\xb4\x2d\x36\xcb\xfb\x5f\x56\xd7\x9b\x34\xb2\xec\x06\x35\x34\xdf\xab\x79\x7a\x19\x93\x26\x4c\x3b\x14\x15\x16\x13\xb5\x96\x5f\xeb\xa4\x30\x3a\xc7\xf6\x62\x52\x67\xfb\xf4\x0c\xce\x60\x44\xc4\x99\xad\x7f\x29\x96\xa5\xee\xff\x1c\x27\x06\xcf\x7d\xb3\xf6\xbc\x20\x96\x9b\x7a\xfc\xaa\x82\x47\x48\x40\x55\x81\xd0\xbb\x13\xeb\x56\x8c\xe0\x3a\xf5\x4c\xc3\x13\xc6\x90\xc9\x0d\x84\xad\xbf\xb0\x3a\x9d\xce\xa6\x72\x6d\x32\x88\x11\x78\xe6\x75\xaf\x91\xf6\x56\x0f\x02\x13\x46\x52\x5b\x43\x8b\x94\x2c\xa8\x49\x34\xef\x10\x18\x19\x47\x48\xb5\x75\x74\x5a\x44\xe7\x55\xf3\xbc\x2e\x46\x00\x28\x23\xa5\xc1\x88\xf0\xd5\xe2\xfe\xf7\xa7\x87\xdb\xdb\xd5\x93\x6f\x51\xa1\x42\x56\x60\x51\xd7\xa5\xca\xc4\x80\x06\xa5\xeb\x91\x28\x04\x75\x9f\x8a\x1a\x90\x2d\xee\xe2\x3c\x9e\x84\x9b\xdc\x75\x9a\xd0\xd4\xe3\xf4\x7e\xf6\xe2\xc2\x60\x20\x02\xab\x33\x25\xea\xe7\x87\x93\xd5\xd8\x1e\x8f\x1c\xc4\x29\x9e\x5b\xf6\x98\x5c\x96\x79\x59\x3d\x66\x1d\x11\x87\x81\x54\xe1\x8e\x5e\x87\xc4\x51\x55\xfa\x06\x41\x30\x84\xd0\x1a\xb0\xad\x45\x34\x80\x1b\x1b\x42\x62\x0a\xb6\xb2\x2f\x47\xaa\x80\x11\xa7\xa0\x21\x44\x02\x3a\xb9\x3b\x5b\xa0\x32\x17\xa6\xec\xad\x06\x43\x02\x1e\xa1\xf8\xfa\x9b\xb7\x14\xe6\x8a\xed\x46\x6b\xcd\x90\x20\x09\x03\x97\xfe\x29\x3d\xcd\xd2\x30\x5f\xda\xf6\x88\x31\xed\x6f\xa1\x7b\x1b\x57\x1b\x3e\xf6\x31\xc7\x22\xcb\xee\x42\xca\x98\xab\x58\xaf\x8a\xcd\xb9\x68\x9e\x1d\x28\x31\x9c\x3c\x02\xd5\x16\x52\xe1\x8c\x78\xb4\x2e\x46\xa0\x59\x43\x18\xd1\x54\x79\xda\xdb\x11\x98\x7d\xee\x3b\x1b\xc2\x02\x2b\x1f\xe3\x94\x87\xef\xb2\xa2\xb1\xa4\xfc\xbf\xb0\x21\xfc\xe5\xa9\xb5\x8b\x1e\x6f\xaf\xb7\xdd\x23\x40\x82\x02\x42\x77\xa5\x7a\xe9\x70\xc4\xf9\x90\x16\xda\x90\x90\x07\xc4\xd2\x04\x1e\x6c\x01\x28\xed\x5a\x52\x40\x50\x62\x7b\xa4\xdd\x88\x2c\xdf\x21\x76\xc9\x08\x05\xbb\xd6\xc7\xed\xba\x69\x82\xfc\x50\xa3\x6c\xdf\xfc\x33\x46\x4c\xa2\x1a\xc6\xb2\x74\xe8\x74\x7f\x8f\xc8\x08\x17\x45\xc7\x87\xd4\x3f\xac\x09\xd3\x37\x2b\x0c\xdb\x1d\x4e\xf9\xb1\x7c\xa3\x5f\xc6\x77\x8d\x59\x82\xe5\xcb\xee\x5b\xdc\x89\xf7\x71\x05\xb4\x21\x3c\xed\x98\xd8\xbf\x89\x4a\xbf\x89\x0a\x66\x4a\x4e\x0c\xe1\x8a\x63\xe5\xe7\xa2\x6a\xba\x6b\x13\x42\x30\x97\x51\x08\x84\x49\xf7\x2c\x11\xc3\x6d\xb6\xb5\x2b\x74\xec\x0a\x95\xb7\xd0\x9e\xb8\xd5\xe4\x29\x13\x08\x84\xe7\x3e\x15\x95\xcc\x9a\x7a\xe7\x84\x5f\x77\xe5\x71\xc2\x6a\xd6\x1a\x23\x06\x8f\x93\xfa\x08\x2a\x33\x99\xc2\x72\x4d\x04\xc2\x4d\x6e\x9b\x86\x14\xf9\x0f\x76\x96\xc8\x51\xbd\x3c\x23\x60\x72\x72\x3b\x41\x38\xee\x6d\xcd\x37\x51\x7f\x3f\xbe\x96\x0d\xcc\x2b\x52\x98\xd6\x1d\x0b\x5d\x48\x1a\x25\xe1\xac\x27\xe4\x34\x33\xc7\x3f\x2d\x94\x15\x63\xb3\x65\x97\xf7\xf0\xde\x0c\x48\xe1\x0c\x91\xa1\x52\x8e\xa3\xd1\x89\x86\xf5\xa8\x13\x43\x24\xb7\xe8\xe3\xdf\xff\x5c\x4e\x92\x89\xdd\x5a\x94\xd2\xc8\x64\xa0\x6b\xd4\x05\x18\x2e\x8f\x39\x43\xa4\x96\x98\x3b\x6f\xca\x71\xec\xdc\x35\x2b\x92\x6a\x2f\x35\xf0\x5c\xd6\x50\x0c\x49\xec\x0d\x51\x29\x45\x4c\x24\x3e\xe6\x6e\xd3\xc9\x7d\xfa\x66\x03\x58\x6f\x20\xb4\x5e\x54\x4d\xa6\xca\xbc\x1c\x12\x67\x04\x64\xfc\xaf\xbb\x4a\x83\xcd\x82\xa1\x27\xf3\xb3\x6c\x6d\x69\xef\x16\xcc\x88\xd0\x19\xa2\x8d\x46\x4e\x03\xd9\x43\xc3\xfd\x03\x00\xb7\xaa\xe4\xb7\x20\x8a\x9e\x43\xd4\x10\x00\x4b\x38\x6c\xe5\x32\x7f\x8a\xaa\xca\xca\xaa\xde\x96\x57\xa2\x69\xf2\x0f\xd3\xb3\xe3\x55\x19\x10\x16\x0a\x57\x99\x68\x6d\xfb\xaf\x95\x28\x1a\x98\x77\x73\x4c\x40\x62\x89\x6b\xb5\xac\x84\xc2\xe4\xa9\xff\x3b\xe7\x88\x49\x3a\xec\xa0\x2b\x82\x9e\x5c\x29\x13\x65\x3a\xba\xd4\xb2\xf4\x38\x2c\x13\x10\x95\xe0\x3d\x9b\x53\x55\x74\xec\x97\x26\xa0\xcc\xa0\xba\x58\x7b\xf4\x79\x7e\xa7\xcf\x7c\x20\x13\xd0\x54\x2b\x6a\x33\x0d\x5e\x7b\xa9\xa3\xf7\x34\x01\x8b\x8c\x89\xa6\x56\xee\xd0\xbd\x34\x01\x8b\x35\x38\x28\x08\x2e\x37\xb4\x9b\xb3\x52\x4f\x5e\x85\x25\x04\x57\xf3\x0e\xb1\x01\xa7\xaa\xdd\x1d\x8a\xc6\x0e\xfb\xf4\xb5\x99\xb1\x2b\xdf\x58\x48\xd8\x30\x35\x62\x82\x30\x09\xb5\x67\x09\x40\x9e\xd8\xe3\xa9\xc1\x35\x77\x21\x03\x64\x82\x88\x2b\x4f\x76\x39\x4c\x78\xfb\x5b\xc5\x21\xc1\xe2\xe6\x47\xa8\xea\xd2\x99\x4a\x1f\x7c\xc3\x38\xe5\x78\x36\x1d\xb2\xc2\x63\x8d\x26\x07\x73\xc0\x43\x8e\x81\x19\xd5\x8e\xc2\x35\x78\x3a\x69\x6f\x2e\xfe\xf3\x5f\xe3\xe3\x2b\xe0\x1a\x90\xa9\xb1\x46\x92\x93\x9d\x7f\xa8\x34\x10\x98\x02\xcb\xea\x01\x7f\xa9\x4f\x44\x82\x5e\x14\x1a\x29\x17\xc6\xfb\x55\x90\x1a\xa2\xed\x41\x91\x15\xbe\x26\xf3\x57\x36\xfc\x5f\x71\xad\x4d\x20\x8c\x85\xb2\x18\x80\xab\x53\x55\x40\xf5\xb3\x12\xc7\xa3\xe3\x46\x1c\x9b\x6c\x26\x90\x91\x01\xb7\x32\x7a\x52\xc6\xf1\xfd\x24\xd7\x88\xcc\x42\x8d\xbc\xc9\x4f\xfe\x33\x74\x5b\x59\xa0\x48\x62\xd9\x87\xf5\x21\x2b\x2e\x62\x98\x26\x50\x3c\x0d\x6d\x04\x4e\x74\x31\xdf\x51\x16\xc8\xf7\xd3\xb1\x66\xee\x48\xa6\x13\x6b\xa6\xeb\x92\x1a\xc7\x05\xf7\xf5\xab\xf5\xae\x26\x7c\xd6\xae\xa3\x26\x31\xe6\xa5\x5c\xc1\x0c\xca\xa7\x5a\xee\x8d\xcf\x35\xb0\xc7\x77\x81\x20\xf5\x55\x3f\x4e\x09\xf1\xcb\x78\x5e\x00\x58\xba\xc2\x3d\x34\x57\xfa\xd8\xd1\x62\xfa\x02\x6a\xbf\xe9\x07\xb1\x1f\x2b\x63\x52\xb4\x93\x2b\xd1\xc0\x4d\x59\x59\x54\x82\x72\xd0\x6f\x1b\x62\x35\x94\xa4\x31\xba\x29\x77\x8b\x3f\x76\x8f\xdf\xaf\x6e\xd7\xcb\xdd\xe6\xe1\xd6\x29\x47\x19\x4a\x64\x8a\xaa\x9f\x07\xf1\x9e\x1d\x4e\x07\x47\xb9\xdf\x2e\xa9\x75\xb1\xda\x7e\xf3\xdd\x02\xc2\x90\x0f\x01\x29\xf7\x26\xc0\x48\x43\x69\x28\x31\x8c\x7b\x14\x55\x0d\x8b\x42\x63\x0e\x7d\x50\xd3\x6d\x28\x8d\x8c\x76\x63\xbd\xcb\x45\xdd\xec\x4e\x35\x54\xbb\x0a\x94\xa8\xc7\x59\x39\x43\xa9\xd1\x78\x02\xdf\x37\x43\x66\x41\x43\x19\x04\x26\xe8\x32\x92\x37\x65\x75\x97\x5d\x92\x7a\x8e\xe7\x30\x0d\x95\xe5\x83\xad\x6d\xad\xd1\x42\xcd\x21\x45\x07\x5e\x9d\xa1\xa1\xa6\x28\x93\xdc\x5a\x1a\x5d\x8a\xdf\xb5\x45\x44\x44\x30\xd2\x8b\x29\xf4\x58\xbf\x6e\x7e\x13\xa1\x51\x9a\x58\xb1\x11\x4c\xc9\xde\x9f\x0e\x3f\xb2\x3c\x17\x7b\x98\xcc\x00\x1a\x07\x09\xe6\xf8\x9a\xdd\xfa\x70\xc8\x85\x55\xe1\xc7\x3b\xbb\x3d\xbd\xac\xfc\x76\x48\x63\x06\x28\x41\xf2\xad\x3c\xc0\x47\x32\x04\xc9\xe4\x39\xe2\x94\x87\x51\x6f\x3c\x76\x2f\xc6\xa3\x14\x83\xc5\xad\x17\xf3\xbd\x68\xb2\x1c\x91\x6f\x8b\x76\xbe\x63\x68\x62\x34\x91\x29\x8f\x13\xb4\x11\xad\x78\xf1\x5d\xf9\x7a\x41\x7f\xe0\x3b\x26\xb6\xfe\xf8\x71\xf5\xb4\x7e\xb8\x76\xf5\x37\xdd\x6f\x2a\x4b\x7d\xb8\x01\x75\xaa\xb2\xe6\xbc\xfb\x26\xea\x47\x51\xd7\x6f\x65\xa5\x37\xcf\x82\x61\x35\x10\x40\x81\x84\x90\xed\x39\x5d\xbc\x78\x1c\x88\xbb\x43\x42\xac\x20\xb3\xb5\x35\xd7\x0d\x1c\x2e\x29\xb6\x0d\x4d\x12\x9b\x93\x76\x84\x6f\x2b\x5b\xa6\xe6\x95\xc1\xba\x7b\x89\xa8\xc7\x92\x59\xde\x04\x00\x3d\x04\x77\x19\x9a\xa6\x11\x1e\xbd\xdf\x44\x7d\x55\x96\xf5\x54\x13\xde\xd0\x14\xb8\xad\x15\x84\x83\xc0\xe3\xe2\xab\xa8\x87\x92\x66\xae\x9b\xe0\x06\x9f\xe8\xaa\x82\xb7\x4e\x15\xd2\x50\x19\x04\x18\x8d\xc3\xa0\xb9\x3d\xfa\xfe\x5a\x50\xbe\xbd\x34\xc5\xaa\xc3\x3b\x51\x1d\xca\xe6\x2f\x5f\x45\x01\xa7\xfa\x13\xfc\x28\xbb\x87\xe0\xb1\xb5\x70\xb2\xea\xba\x2a\x8f\xdf\xa0\x2a\x47\xfe\x22\x95\x86\x50\xc7\x49\x72\x27\x5a\x37\xa7\x68\x37\xcc\x3b\x51\xed\xb3\x62\x3c\x5c\x40\x93\xc8\xb9\x12\x57\x99\x1e\x69\xb7\x8c\x56\x1c\xd0\xae\xa2\xcb\x71\x0a\x95\xd5\xe5\xc6\x4f\x0d\x51\x98\x95\xdb\x58\xb0\xf1\xd2\xab\x96\x7c\x54\xf8\xec\x2f\x4b\x03\x2c\x9d\xd8\x1d\xa1\x32\x65\x75\x98\x0a\x7d\xfd\x6d\xf2\x2b\x22\x0d\xfa\x6a\x46\xbb\xa1\x66\x50\xa3\x81\xd3\xaf\x17\xa3\x5c\x0c\x30\x2f\xa5\xc8\xef\xb2\xc2\xbb\x51\x8b\x83\x7f\x7d\x46\x98\xc0\x54\x68\x2d\xf2\xd7\x8e\x77\x7e\x7e\x7f\x60\x24\x94\x42\xfa\x20\x73\xa6\xe0\xea\xbc\xac\x40\x43\xd1\x64\x22\xb7\x51\xc2\x59\x96\x16\xc3\x08\x84\xb8\xad\xde\x96\x7b\xfa\x21\x12\xe6\x33\x48\xb8\x33\xc7\xa7\xcf\x03\x6e\x3f\x70\x9b\x5b\x47\x6f\xf6\xd1\xf3\x03\x20\x0f\xff\xd7\x07\x7f\xae\xb0\x80\x18\xcc\x5b\xdc\x97\x96\x42\x62\x66\x73\xf2\x3d\xc3\x88\xa7\x68\xf7\x5c\x8b\x33\xb2\xc6\x74\xf7\x30\x61\x2a\xbd\x5b\xd0\x7a\x4d\x6e\x03\xc8\x8a\xfd\xc8\xe8\x67\x8c\xa4\x48\x2a\xf2\x0c\xa2\x6a\x24\x88\x66\x50\x05\x67\x18\x4b\x01\xc3\x30\xaa\x2c\x5e\xa1\x6a\x6e\xcb\xe6\xea\xbc\xd6\xe3\xad\x97\x31\x93\xa0\xf5\x85\xe9\x20\x2f\x6f\xfc\xd7\xdc\x02\x16\x31\xbb\x72\xd7\xf7\xeb\xed\x7a\x71\x6b\x49\x43\x76\x37\x4f\x0f\x77\xbb\xe5\xc3\xdd\xe3\xc2\x47\x7f\x0d\x8b\x62\xc0\x1d\xf1\x58\x41\xa6\xca\x59\xa6\x76\xc3\x22\x01\xd4\x33\x5d\xfa\x9d\x64\x58\x4f\x8e\x3d\x98\x73\x3d\x37\x42\xeb\x1c\x36\xcf\xe5\x11\x19\xb0\x60\xb2\xfd\xb1\x48\x32\x0b\x33\x79\x3e\x77\x57\x2b\x5b\x41\x61\x91\x4a\x3d\x46\xc9\x37\x6b\x81\x8e\x81\x1b\xae\x6d\xb9\xec\xb4\x81\x3e\x3c\x68\x59\xcc\x79\x82\xfb\xc6\x7e\x5f\xc1\xbe\x4b\x07\x1a\x16\x83\xe5\x5c\xb2\xa9\xab\xef\xb5\xd3\x2e\x9e\xc9\xa0\x1b\xc6\x83\x00\xd9\xab\x4d\x56\xe8\x21\x87\xff\xc0\x90\x60\x3c\x4a\x98\xe3\xc6\x6e\xad\xd2\xd3\xf1\xeb\xc5\x56\xc1\x78\xa2\xc0\x86\xa6\xa6\x9e\x38\x4b\xb4\xe7\x80\x13\xd9\xa1\x2f\x8f\x32\x2c\x4d\x63\x64\x28\x31\x48\x35\x81\xee\xf9\x50\x24\xc2\x30\x11\x5a\x0b\xf7\xf6\xe1\xe1\x6e\xbd\xd8\xb9\x7f\x9e\x56\x77\x8b\xf5\xfd\xf5\xea\x69\xb7\xb8\xbe\x7e\xf2\x7d\x95\x8a\x31\x45\x7f\x57\xbe\x67\xa2\xe8\x83\xd6\x86\xe9\x04\x42\xd6\x89\x8c\xb8\xa3\x3d\xcf\x5e\xa1\x9a\xa7\xb8\x32\x4c\x2b\x5b\x80\x09\xaa\xac\xcf\x75\x03\x87\xab\x53\x96\xb7\x36\xda\x30\xef\x6c\x18\x24\x22\xb4\xbe\xa6\x86\xca\xc2\xbd\xc6\x13\xdc\x10\xc0\x67\x52\xbb\x7a\x62\xbe\x31\x13\x50\xe9\x6a\x20\x8d\x25\x42\xc9\x8a\xfd\xc4\xc2\x0f\x49\xe2\xa8\xa3\xac\x68\xf1\xa9\x1e\x7e\x96\x90\x28\x70\x47\xdf\x6b\xf9\x02\xdf\x8b\x4c\x95\xd5\x18\x0c\x60\x42\xa2\x35\xc2\x0f\x16\x58\xcf\x37\xb4\xed\xc2\x20\x81\xb0\x8b\x00\xe2\xb7\x99\xf3\x25\x43\x4a\x95\xb2\xd5\xae\xd5\x0b\x34\x9d\xb4\x49\x3d\x76\xcb\xfc\x7c\x0a\xa9\x76\x01\x3b\xd4\xfe\x1d\x82\x88\x4d\xc8\x02\xe3\x45\x73\x87\xc2\x0c\x73\x15\x33\x26\x64\xc6\x96\x9b\x63\x44\x0a\x0f\xb9\xdd\x21\x2b\x4e\xf5\xae\x97\x18\x9d\x3c\x69\x98\x70\x6a\x8d\x55\x73\x2a\xf4\xdd\x07\xde\x65\x18\x42\x88\x60\xb6\xf2\x15\x2a\x5d\x09\xd3\xd8\xd7\xae\x47\x31\x97\x30\x0a\x82\x04\x86\x44\xbc\x96\x23\xff\x02\xe3\x64\xc2\x48\x03\x9e\x76\x3a\xab\xdb\xc9\xed\x29\x1b\xfd\x8d\x62\xa6\x2d\x4c\x1b\x8a\x46\x8c\x3e\x40\x9c\xc4\x09\xed\x34\x20\x17\xdd\x57\x8f\x5d\x3d\x04\x2a\x9b\x3b\xef\x68\x22\xe3\x66\x42\x1e\x59\x3d\x92\x76\x2c\x37\xd7\x8f\x70\x41\x79\x60\x42\xce\x23\xea\x96\xad\xe7\xa1\x79\x90\xff\x86\x71\x9d\x81\x09\xb9\xb2\x44\x74\x48\x8f\xdf\x3e\xb9\xe7\xe2\x1a\xdf\x2d\x09\x24\x3a\x64\x28\x6a\xf2\x99\xec\xd6\xc8\xe0\x09\x93\x44\x09\xe6\x65\xc7\xff\x73\xca\x6c\xf6\x63\x2e\xd8\x1e\x26\xa9\xe5\xa0\xdb\xb5\xbb\xd6\xac\x57\x18\xa6\x82\xe2\x2b\x5d\x43\xfd\x9c\x0d\xd6\x78\x98\x02\xa3\x0e\xaf\x6f\x6b\xb2\x2d\x84\x64\x7c\xb5\xa0\x69\x12\x0e\xbe\x69\xf6\x5f\xcb\xdc\x3d\x09\xb3\x87\x22\xa1\x54\x8f\xf9\x9e\x2a\x51\xa8\x67\x98\x1b\x17\xc9\x12\xec\xfc\x28\xfe\x73\x12\xbd\xe2\xe2\x2f\x4d\xc1\x50\x32\x25\x6c\x44\x3d\xb7\x4e\xc7\xe7\xc1\xa3\x50\x82\xa6\xb1\x8f\x7d\xba\x52\x5a\xd1\xc0\xd5\xf9\xc1\x31\x00\x5f\x18\x23\xa3\x9f\x53\x41\x08\xe0\x35\xa8\xb1\xdf\xc5\xa1\x30\x9c\xd5\x8a\x52\xcf\x5d\x78\x7f\x3a\x2c\x50\xf4\x68\xe6\x83\x28\xa6\x51\x33\xeb\xea\xb1\x34\x77\xe2\x05\xaa\xcf\x88\xdc\x4c\xa8\xe2\xc4\xc5\x41\x7b\xff\x0a\xf4\xf4\x9e\xa9\xec\xd8\x3a\xaf\x11\x42\x09\xc8\x82\x33\xb9\x95\x0e\x23\xee\xd5\xd2\x97\x42\x3d\x03\x5a\xb2\x59\x73\x46\x1e\x24\xd7\x4b\x73\x4b\x24\x7f\x9b\xc9\x4c\x97\x6a\x30\x63\x80\xe9\x91\xae\xcc\x38\x2f\xdd\xf5\x0a\x43\xac\xa2\xdd\x2e\xee\x7f\x5f\x3d\xed\xb6\x7f\x3e\xae\xba\xa6\x34\xd5\x2e\xcf\xd3\x9e\x87\x3d\x99\x9c\x09\x8d\x4e\xc1\x55\xfb\xe1\x43\xdd\x96\xea\x25\x2b\xf6\x0b\x27\x2a\x30\xde\x67\x07\x24\xcd\xff\x64\x6e\x0a\x46\x84\x18\xc9\x5d\x5a\xf2\xca\x7e\x4e\x17\xd3\x1d\x8d\x42\x44\xc0\x96\x79\x5c\xc3\xb5\xc3\x3f\xcf\x56\x3d\x99\x28\xe0\x5c\x06\xce\x8f\xbe\xc6\x42\x51\x9f\x2a\x35\x51\x90\x4a\x0c\x3c\xea\x12\x6a\x84\x9c\xaf\xde\x07\xd5\x64\x63\xf3\x37\xa2\x31\x41\x74\x50\x97\xef\xf4\x77\xa1\x46\x82\xa5\x03\x6e\xaa\x0c\x5e\x91\xa4\x1b\x07\x65\x7c\x3d\xd3\xca\x96\x7c\xba\xe7\x94\x42\xbd\xe4\x5d\xe9\x84\x89\x42\xb0\x58\x2c\xe7\x2f\xef\x6a\xc8\x27\x7b\x5f\x14\x49\x8b\xf5\xb0\xf6\x8d\x0d\xd7\x55\xe7\x9b\xaa\x3c\x6c\xc5\xbe\xbe\x2c\x73\x33\x51\x1c\x10\x6d\xc5\x7a\xb6\xcf\x59\xfd\x58\x81\x29\xab\x97\x71\x1a\x27\x8a\xb9\x95\xea\x38\x60\x50\xaf\x16\x39\x74\x84\xa1\x26\xe2\x21\xc3\xe0\xa6\xcb\x53\x4d\xcf\x03\xdf\x8b\x2b\x3c\x52\x4f\x58\xa2\x36\xc2\x7f\x99\x88\x6b\x6a\x73\xe7\x08\xfa\xa6\xa8\x64\xe7\xdb\x12\x97\x8d\x6b\x9d\x11\xe7\xd6\xa0\xbd\x3c\x5c\xc1\x51\x12\xf1\xd0\xc1\x18\xb6\x19\x54\x8f\xed\xe2\x19\xa0\x78\x7c\xaf\x34\xa4\xc1\x10\xe8\x39\x5d\x5f\x51\x92\x46\x9c\xf6\xf2\x9b\xcd\x5a\x6f\xab\xec\xd8\x07\x98\xc6\x33\x2c\x01\x2d\x1c\x17\x81\xf5\xcf\x2f\x04\xc6\x5d\xc7\x34\x91\xb6\x48\x38\x2b\x0a\xa8\x7a\x86\x93\xc9\x8c\x4d\x53\x81\xb8\xb3\x9d\xcb\x24\xce\x3b\x39\x7f\x9b\xdc\x5b\x71\x6f\x08\xfd\x00\x8c\x96\x39\xbf\x77\xfe\x37\x04\xd3\x32\xf1\x73\x34\x43\x61\xc6\x41\x20\xd9\x77\xe2\x31\x75\xe1\xf6\x1b\xc4\xc7\x9b\xf2\xcb\x78\xe7\x9c\x3c\x84\x24\x1d\x57\xf5\x9d\x0d\x6c\x4c\x32\x79\x91\x24\xb6\x56\xbd\x1d\x59\x7c\xbe\x2e\x10\x7e\x31\x5a\x52\x30\x34\x0b\x76\xe6\x23\xfd\x75\x13\xa9\xc0\xaa\xc4\xaf\x0b\x93\x15\x59\x83\x62\x2d\x56\x5f\xd7\x77\xa0\x69\xd4\x45\xc1\xef\xc4\xbb\xd7\x3f\x99\xdc\x26\x8c\x3c\x53\xcd\x8f\xb2\x19\xd1\x64\x99\x48\xc5\x06\x77\xe4\xfa\x5c\x34\xcf\x50\xf7\xa4\x3e\xff\x8c\xfe\x35\x19\x55\xe5\x4a\x05\xba\x50\xcb\x40\x34\xdc\x75\xd1\x21\x41\x20\x62\x53\x36\x60\x8f\xfb\x8e\xa6\x15\x23\x40\xc8\xbb\xea\x3b\x03\x70\x94\x49\xf3\xfc\xeb\x56\xae\xaa\x33\xc1\x62\x12\x06\x56\x8b\x4d\x95\x17\xf6\x73\x4c\x12\xe3\xe4\xb7\xb6\x0e\x06\x30\x79\xf9\xf1\x58\xc6\x44\x46\xc4\x58\x7e\xb3\x72\xac\x9f\x62\x62\xa2\x95\x95\xe2\x5c\xde\x3d\xfc\x31\x6a\x09\x68\xa2\xbc\xb6\x95\xcd\xd5\x8c\x86\x24\xa6\x82\xfb\xaa\x90\x65\x75\xae\x1b\x91\xff\x9e\x15\xda\x96\xaa\x4c\xbb\x2a\x83\x24\x75\x50\xe8\x2b\x68\xae\xf2\x53\xf7\x2a\x8c\xc4\xb8\x23\x9e\x6a\xa8\xac\xa6\xcf\xf8\xd1\x99\x63\x70\x3d\x8a\x53\x0d\x6a\xec\x22\xc4\x8c\x47\x4a\x77\x65\x60\x1f\x2c\xe2\x98\x69\x11\xb0\x61\x6a\xc9\x6f\x9a\xfe\x36\x21\xd1\x38\x3c\x5e\x88\xd4\xc4\x61\x9a\x62\x59\xa0\x25\x95\xb9\xce\xf6\xfb\xfe\xcb\x44\x2c\x41\x84\xa2\xa5\xbf\x2a\xf0\x7c\x1b\x93\xd8\x98\x38\x0e\x0d\x82\xae\xae\xb2\xe6\x45\x74\x8f\x1b\x27\x56\x49\x7c\x4c\xc5\x34\x7e\xd8\x58\x45\x4e\x89\x01\x9d\xe1\xfe\x0c\xf1\xed\x20\x31\xdf\x79\x5b\xee\x67\x25\xe4\x4d\xcc\x95\x46\x3a\xcf\x6f\x57\xa3\xaf\x99\x44\x21\x1a\xdc\x88\x87\xb0\x11\x4c\xbb\xf4\x86\x34\xe8\x26\x4e\xb4\x66\xc6\xf3\xdc\xd6\x70\x51\x8a\x6e\xe2\x94\x02\xf1\xdc\x4f\xa7\x3c\x77\x09\xe8\xcb\x08\x07\x26\xb2\x48\x97\x84\xf6\x5e\x27\x86\x42\x47\x62\xfb\xff\xa4\xff\x1a\x56\x2d\xc4\x61\x6b\x14\xf4\xac\xfd\x93\xe8\x92\xef\xfd\x11\xcb\xa9\x7f\x11\x41\x15\x46\x03\x7f\xdb\x2e\x97\xcd\x2f\xe0\x5a\x26\x16\xc6\x7a\xf0\x87\xcc\x33\xcc\x7a\x83\x38\x96\xc4\x42\x97\x47\xec\xa3\xd3\x1d\x7b\xc6\xd2\xfd\x3c\xdb\x15\x4b\x16\x07\x91\x2f\x25\x40\x26\x24\xab\x0f\x81\x02\x72\x9b\x4e\x48\xa2\xed\x68\xf9\x7b\x2b\x0c\x12\xbf\x65\xad\xa7\xed\x9b\x64\x82\xe6\xc2\xce\x49\x6f\x0e\x73\x71\xe3\x49\x21\xb5\x95\x84\xf0\x35\x66\xf5\x64\xd2\x28\x62\xe5\x71\x64\x31\x42\x7f\xc4\x8a\x11\x3c\x50\xef\xc4\xbb\xd3\xea\xd2\x57\x42\x75\xad\xdc\x20\x6c\xbd\x53\xaa\x9a\x26\x6a\x62\xa5\x29\xb2\x54\x58\xe1\xd0\x45\x51\xbf\x41\xb5\x28\xf4\x0d\x9e\x4d\xff\x9d\xc7\x20\x9a\x58\x13\x2b\x5a\xb7\x68\xca\x43\xa6\x36\x6f\xe2\xe8\x97\xec\xb2\x2c\xea\xa6\x3a\xa9\x3e\x4e\x12\x6b\x2d\x30\x16\x57\x3f\x67\xa6\xd9\xe5\x60\x3e\x38\x18\x63\x6d\x22\x84\xaa\xb4\x46\xef\xc7\x75\x2d\x26\x86\x38\x06\x1b\xe3\x54\x2f\xa7\x23\x8b\x0f\x93\xb1\x32\xcc\x52\x21\xd8\x25\x92\xa9\xa1\x60\xd5\xf8\x4e\x26\x8d\xbd\xbc\xcb\x13\x88\xbe\xbc\xd0\xc4\x46\x00\x2a\x03\x55\x65\x79\xe8\x94\x5d\x26\x9e\xe5\x04\x62\x6f\x62\xa3\x00\x4b\x68\x9e\xca\xb3\xc8\x9b\xf3\x00\x07\xea\xed\xde\xcd\x25\x15\xf9\xc0\xaf\x89\x0d\x24\xe0\xb1\xdd\x5f\x61\xf4\xa5\x79\xc0\x22\xac\x01\xc6\xba\x85\xfe\x8f\x16\x6e\xb9\xf9\xfe\xf8\x78\xfb\xe7\xee\xe6\xe1\x09\x95\x89\xee\x57\x4f\x9b\x6f\xeb\x47\x9f\x5a\xe1\x94\x02\xc6\xdc\x54\x59\x14\xa8\xd3\x38\xcf\xac\x68\x38\x4d\x63\x50\xc3\x53\xf4\x4a\x14\x2f\x55\xd9\x21\x96\x38\xe3\x5a\x70\x27\x64\xb9\xcc\x33\x28\x30\x8d\xf6\x28\x32\xfd\x34\xe5\x5a\x4d\xfc\x25\x89\x45\xec\xd7\xd0\xf4\x49\xab\x6b\xc8\x6d\x54\x70\xfc\xfb\x11\x25\x32\xf5\x51\x07\xaf\xb5\x30\xe1\xa3\x33\x3c\x12\x1a\xbd\x5a\xeb\x2a\x5f\x67\xf5\xf1\x74\x71\xa7\x38\x8e\x94\x2b\x8a\xc1\x9b\xdc\x74\xaa\x05\x86\xc7\xa9\x8c\xc2\x41\x34\xdb\x39\x90\x17\x89\x2d\x1e\xa7\x60\x69\x87\x10\x53\xeb\xff\xa8\x42\xed\xf2\x47\xa0\x77\x88\x38\xa9\xfb\x36\xa5\x79\xc7\x8d\x05\xba\xd3\x90\x5c\x5f\x4f\xa0\x0d\x9c\x13\x5b\x85\x8d\xb5\xa5\x6b\x27\x6a\x31\xe0\x9e\xf2\xdd\xe2\x30\xb5\xe7\xeb\x19\x09\xc0\xa6\x34\x1c\x7f\x9b\xdc\x55\x85\x68\x96\x1c\xdb\x0f\xd4\x7a\x7e\x53\x54\xa7\xe1\x1c\x2c\x80\xd8\xbf\x7d\xfd\x80\xb8\x91\xe1\x27\xe3\x26\x91\xee\xdc\xfe\xb1\x7e\x1c\xad\x45\xd7\x23\x49\x22\xc4\x6c\xb7\xce\xd1\xe6\x24\xef\x87\x94\xe7\xb3\xab\x96\x27\x46\x20\x82\xe5\x55\xe4\x27\x5b\xb6\x36\x45\x7b\xf0\x34\xa0\xb8\x93\xe3\x90\x6c\xc5\x4b\x37\x08\x69\xa0\x91\x51\xb5\x02\x55\xb6\x67\xd4\x75\xc7\xff\x67\x78\x1a\x0a\xb4\x8f\x9a\x53\x9e\x1d\x2f\xee\x28\xed\x46\x75\x97\x61\x92\xe0\xda\x46\xc1\xba\x89\x90\x1a\xa3\xbd\x71\xe3\x36\x79\xf4\x1d\x5c\xb3\x20\x56\xe8\xc8\x74\x62\xc1\xa3\x10\x2b\x17\x01\x8f\xfd\x46\x03\x8d\xb1\x99\xf2\x71\xec\x9e\x8b\x38\x88\x9d\x98\xc3\x9d\x78\xbf\x83\xba\x16\x7b\xa8\xbf\x62\x9e\xe8\xcb\x00\x7c\xc0\x25\xb5\x62\xd1\x03\x20\xe7\x88\x0a\x6a\x12\x07\xe2\x52\x19\xcc\x3d\xdf\x66\xfb\xf2\x57\x70\x67\xc3\xa5\xd1\xb1\xea\x9c\xfe\x13\x2c\x8a\xf3\x64\xa8\x54\x62\xab\xe4\x6d\xf0\x06\x4f\xe4\xab\x53\x55\xd8\x47\x99\xac\x0b\x4d\xec\xba\xa8\x6d\xcc\x15\x17\xd8\x74\xe8\x75\x90\x20\xba\x03\x71\x1b\x0b\xad\xd7\x83\xfa\xc3\xff\xe3\xbf\xfe\xce\xa1\xc4\x33\xef\xe9\x8f\xc7\x1e\xc6\x6f\xb8\x8e\x5c\x3c\xdb\x52\xf0\x1c\xc3\xe9\x03\xc5\x29\xaa\xb9\xad\x46\x59\x8e\xee\xea\xd8\x85\x02\x8f\x50\xe8\xf9\x00\x11\x87\x24\xc2\xe3\x74\xbb\x5c\x0e\xc2\x7b\x1c\x74\xaa\x2d\xd4\xea\xfd\xab\xe3\x7e\x1c\xe8\x79\x18\x6e\xb4\x76\xf2\x29\xcd\x5d\xa9\xb3\x5e\xb8\xd9\x24\x24\x8a\xa9\x17\xe1\x72\xc4\xd1\x48\xf7\xe1\x9a\x83\x54\x61\x89\xe0\x76\xbb\xfc\x2b\xdc\xea\x1f\xfe\x3b\xbb\xd9\x27\x81\xd4\x18\xf1\xde\xbd\x96\x88\x5c\x98\xc1\x48\x26\x81\x8a\x64\x3a\x60\x29\x98\x1f\x99\x84\x06\xa1\x2d\xfb\x5b\xdf\xad\x3d\x84\x36\xa1\x21\xf1\xfc\x67\xf7\xf0\xde\xdc\x97\x1a\xc6\x16\x68\x42\xa3\x08\x0d\x6e\xa7\xf9\x57\x95\xfb\x6a\x86\xef\xab\xeb\xac\x78\x6b\x47\x7c\xfb\xf7\xbf\x0f\xfe\x27\x18\x4f\x28\x74\xea\x6e\xad\xd7\xfb\x33\xab\x9f\xb7\xd6\xab\x9d\xbc\x0a\xe3\x09\x43\x5a\xe6\x1a\x77\xe5\xf9\x13\x30\x61\x86\x62\x79\xcf\x73\x56\xb7\xe7\xd4\xd3\x14\xb5\x94\x84\x9c\xda\x58\x55\x59\xd4\xa0\x4e\xe8\x7f\x80\x68\x9e\xfd\x8a\x4f\x42\x23\xd1\xfe\xf6\xb1\xbb\x99\x60\x80\x4f\x9e\x27\x11\xa3\xd0\xd9\x8e\xd7\x20\x74\xde\x89\xc7\x99\x24\x0a\xb5\x0c\x7a\x31\x37\x3f\x63\xaf\x4f\xed\xba\x1e\x2c\x27\xdf\x9d\x0b\x0c\x20\xa3\x81\xb0\xad\x84\x1e\x20\x84\xd8\xbf\x06\x3b\x48\x10\xfd\xab\x13\xdb\xa2\xff\xea\x2d\xf8\xcb\xff\xe1\xee\x1c\x53\x89\xa5\x33\xab\xed\xb7\x9d\x7f\xab\xc9\x8f\xf3\x50\xe0\x1c\xcf\xea\x11\x26\x6d\x32\xb8\x5c\x31\xb4\x61\xac\xf0\x99\x93\xde\x98\x76\xb1\xec\xa3\x19\x6e\xc7\x8d\x25\xe0\x1f\xea\x5c\x8e\x67\x50\x4a\x39\xd6\x4a\x7f\x85\xe6\x09\x44\x3e\x62\xa4\x39\x0d\xb6\xd7\x24\xe5\xa9\x57\x1a\x31\x59\x75\xc0\x4f\xe6\x07\x3a\x4d\x63\xe3\x14\x23\x1f\x47\x2a\x48\x93\x97\x4c\x53\x2b\x93\x78\xcc\xc5\xb9\x2f\xf2\x30\x89\x48\x42\x44\x1c\xf7\x84\xe1\x16\x06\x7a\x31\x0c\xbd\x63\xd4\x1d\xc7\x89\x30\xcc\xa9\x1b\x36\xad\x09\x15\x45\x91\xbf\xad\x24\xa0\x7a\xfa\xf2\xa7\x72\x80\xcf\x1d\x3f\x97\xe4\x91\x95\xc3\xb7\x64\x24\x8b\x42\x3f\x81\x3e\xa1\xcd\x33\xd9\x95\x13\x99\x06\xd4\x9f\xec\x18\x77\xba\x13\xea\xb9\x9d\x73\xe3\xaf\xa0\x82\xd4\x55\x3c\xb7\xa7\xda\x22\x1f\xf2\xde\x9b\x44\x47\xc2\xd2\x53\x22\xc1\x79\xeb\x4e\xd4\x8d\x38\x0c\x75\xad\x4d\xa2\xb9\x95\xfa\x46\xc9\xb7\xac\x68\xd6\x88\x5e\x30\x59\x5f\x9b\x34\x7a\x2e\x9d\x26\x08\x5e\xda\x8b\x03\xac\x0a\xfd\x98\x8b\xf3\x7d\xd9\xdd\x2b\x35\x6c\x50\xba\xda\x9a\x40\x22\x2b\xea\xf9\x60\x72\x02\x2a\xec\x19\x05\xbf\x0a\x4b\x55\xf1\x21\xa7\xe0\xfc\x88\x1a\x66\xa5\xee\x77\x46\xe4\xb9\x14\x9e\x81\xd8\x24\xc6\x89\x6d\x39\x52\x2c\x0b\xfa\xbd\xfc\xce\x93\xe4\xe1\xe0\x73\x1b\x43\x2d\x29\xe9\xa9\x70\x5c\xb8\xf3\x1f\x35\x25\xb1\x32\x6c\x40\xac\x36\xef\x38\xa6\x81\x4c\x91\x88\xeb\x7b\x51\x5b\x5a\x54\x73\xca\x17\x4d\x03\x87\xe3\x64\x5c\xd2\x40\x45\x46\xf7\x91\xb6\xaa\x5e\x3e\x97\x5d\xf1\xb4\x49\x03\x70\xa1\x73\x14\xe7\x1f\x72\x81\x9a\x94\x12\xab\xc0\xa8\xcb\xb7\x62\x9b\x4d\xd7\x6c\x4a\x45\x9c\x3a\x2a\x1b\xe7\x07\x8a\x09\x12\x2a\x65\x4c\x46\xc3\x84\x86\x9d\x4f\x93\x3e\x22\xb6\xc8\x55\xd1\xb4\xf6\xa4\x0b\x57\x44\xe3\x15\x9f\x32\x61\x69\xb5\x85\xfe\xf7\xa9\xb6\x55\xae\x57\xad\xdb\xfb\x50\x0c\xfc\xda\x94\x09\x83\x31\xf5\xcd\x73\x76\xc4\x58\xc6\x00\x73\x3e\xfa\xaf\xff\x42\xc3\xf4\xc5\x38\x7e\xf1\x41\xdb\xe8\xc2\x29\xbb\x8d\x49\x19\x30\x0c\xbe\x7d\x2b\xcb\x97\x59\x26\x8d\xc9\xe7\x0e\x83\x80\xfa\x8a\x91\x76\x56\x7c\x3d\x9d\x17\xa7\x6e\x8b\x4a\xc3\xd0\x52\x34\x5a\xca\xaf\x13\x16\xf6\x3e\x37\x5d\x6b\xaa\x4d\xda\xef\xbe\x98\xbf\x76\x4d\x71\x94\x60\x08\x4e\x9d\xea\xa6\xd4\x99\x28\x7e\x40\x95\x99\xf3\x64\xe8\x93\x84\x85\x81\xab\xd1\xbe\xcd\x8a\x97\x2f\x73\x10\x21\xdf\x37\x25\x56\xb4\xd5\x73\x42\x99\x34\x51\x16\xcc\xe9\x49\xee\xaf\xce\x48\xc2\x37\x7f\x90\xa7\x89\x71\x90\x0b\xa7\x66\x64\x0b\x24\xc6\x0f\x94\x0a\x46\x79\x17\x24\xff\x2f\x3c\x8a\xaa\x29\xa0\x1a\xd8\x7b\xa9\x60\x26\x75\xd4\x06\xcf\xe8\x7f\x8c\x9e\x52\x44\x81\x8a\x7b\x49\x2d\x44\x86\x8d\xc8\xb4\x27\x50\xc8\x54\xa4\x81\x76\x51\xfc\xeb\x4a\xbc\x41\x75\xb1\xff\xa7\xc2\x00\x3a\x57\xa7\xa2\x67\x42\xff\x60\xf5\xca\x20\xb5\x8a\x4b\xab\xcd\xea\xe9\xc7\x6a\xb7\xb8\x7b\xf8\xee\x95\x22\xdb\x56\x05\x43\x1a\x46\x8c\xb3\xd7\xbb\xa6\xdc\x39\xae\x88\xae\x63\x6c\xc5\x43\x64\xa6\x57\x77\x0f\xf7\xdb\xbb\xce\xea\x4c\xa5\x54\xb8\x45\x9d\x0a\x29\x0a\x87\x83\x9a\x4a\xa7\x99\x54\x45\xc0\x5d\x5a\x00\x33\xaa\x16\x68\x3c\x36\xc3\x52\x25\x13\x0c\x04\x3a\x3e\xef\x47\xcb\xf0\xf9\xd1\xab\x29\x99\x7a\xc9\xc3\xf6\xdb\x65\x15\xe8\xcd\x10\xc2\xed\xba\x69\xa3\x51\x99\xf8\xa6\x2c\xad\xe9\xb8\x72\xc0\x88\xd5\xeb\x20\xb6\x38\x7b\x32\x4e\x7e\x10\x20\xc1\x34\xee\xee\x54\x20\xea\x60\x32\x55\xc0\x68\xdc\xef\x77\xe2\x98\xed\x1e\x91\x10\xb9\x73\xd1\x52\xc3\x2c\x0c\xe5\x6a\xbb\xfc\xb1\x7a\xfa\xb1\xf6\x55\x87\x26\x6d\x7d\x58\xcb\x34\x5c\xbc\xfc\xfc\x88\xc3\xd6\xa4\x46\x25\x98\x61\xfa\xfe\x6d\xe9\xae\x14\x24\x50\xe8\xd9\x0c\xb8\xbf\x30\xad\x17\x76\x1d\x98\xc0\xc3\x4c\x97\x37\x22\xcb\xb3\x62\x3f\x71\x36\x04\x31\xee\xb4\x83\xe6\x7b\x56\x34\x16\xaa\xdf\x71\x30\x7e\xba\x51\x88\x80\x0a\xe4\x76\x44\x93\x71\x55\x68\x6f\x77\x8a\x80\x73\xb4\x02\x7e\x66\x79\x7e\x1e\xf8\x27\x22\xd0\xb1\xb2\x55\x90\x59\x61\x0f\xc1\x17\x28\x1c\x22\xdf\x75\xa1\x84\x0a\x0f\xb7\x29\x73\xf8\xe0\x68\x15\xd4\x15\xcd\x5a\xc4\x35\xe6\x2a\xc6\xc3\x25\x68\xca\xb4\xab\xa5\xb6\x3c\xfc\xfe\x17\x58\xc0\x1d\x1d\xae\x7b\x80\x7a\xec\x28\x0b\xc6\x6c\xc9\x92\x7a\x7e\xb1\x6a\x00\x57\xf3\xf3\x4f\x30\x11\xe1\x31\xb1\x81\x46\x67\xaf\x37\x03\xa1\xbd\x49\x3f\x0d\xb8\x3f\x38\x04\x52\x0d\xd5\x6d\xa6\xa0\xa8\x61\x02\xed\x71\xdd\x43\x22\x31\xe6\xf1\xfd\x7e\xbd\xb5\x72\x8a\xfe\xc9\xc2\xc0\x32\x78\xec\x06\xac\x32\xf6\x11\xc7\xa4\x32\xe3\x93\x59\x84\x8c\x2b\xe2\x72\x9d\x57\x42\xbd\xdc\x94\x95\xdb\xeb\x9e\x44\xa1\xcb\xc3\x78\x11\x8a\x28\x26\x92\x0c\xf6\x84\x6d\xb9\x5e\x2e\x1e\x97\x22\xcf\x3b\x25\x36\x23\x22\x20\xa2\x2b\x63\x41\x89\xfc\xc9\x4b\x47\x10\xa1\xa9\xae\x41\x79\x1c\xc6\x05\x48\x67\x32\x9e\x91\x09\xa3\x9e\xba\xf6\x1a\x54\x76\x10\xf9\xf4\xbb\xc6\x84\x30\x9f\x85\xc7\xbc\xac\x5d\xd2\xef\x53\x7e\x8a\xb6\xa7\x45\x30\xed\xa1\xb9\x2e\xd5\xa2\x46\x80\x40\x1c\x4e\xef\xa7\xac\x29\x6d\x09\xbd\x9d\xdc\x82\x7f\x4b\x4e\x25\x9a\xc4\xcb\xac\xd0\x0e\x48\xdf\x35\x09\x8a\x54\x9b\xd6\x63\x5c\x54\x4d\x56\x37\xb5\x87\x81\xcf\x5a\x48\x22\x25\x14\x13\xf2\x59\xbd\x38\x35\xe5\x4d\xd9\x1a\xd3\x1d\x05\x8b\x11\x29\x8b\x71\xde\x59\x46\x9a\x21\xca\xd0\x77\x48\x93\x98\x78\x2a\xd3\x17\x70\xda\x28\xf3\xdf\x3c\x15\x09\x66\xcb\x1a\x4f\x8f\x96\x7b\xd1\x10\x23\x52\x13\x20\xac\xb5\x29\x5b\x4f\xe5\x4b\xcf\x7a\x63\x84\x10\x71\xe4\x82\x44\xab\x42\xaf\x55\xe9\xf4\x44\xc7\x63\xd6\xee\x46\x29\xc2\x29\x30\x8a\x6a\x25\x10\xfd\xdd\x25\x95\x36\x47\x56\xb4\xdb\x6b\x59\x65\x50\x3f\x98\xeb\x81\x74\xfe\xd4\x80\xf1\x47\x84\x90\x9c\xe2\xf4\x5e\x15\x4d\x05\xc7\x0a\x0a\x38\x55\x9b\xe7\xf2\xd8\xdd\x19\x12\xd4\xb5\x5c\x2e\x6e\x6f\x7f\x19\x68\x12\x2a\x01\xc4\x7c\x54\xa2\x18\xe9\xa2\x78\x97\x57\x28\xb0\x72\x5a\xfd\x11\x3a\x55\xb6\xbe\xb0\x18\x04\x48\xe3\xe1\xad\xd7\x59\x7d\x6c\x1d\xdc\x5e\xad\x7a\xfc\x05\x8c\x93\xc4\x58\x9c\x74\xd6\x6c\x84\x81\xaf\x27\x51\x39\x53\x92\x12\xdf\x29\xe5\x08\x81\x39\xf6\x34\x4e\xc3\x59\x26\x49\x64\xb3\x31\x0d\x88\xc3\xf6\xad\xfd\x1a\x26\x7b\xef\x1a\xb5\xc4\x29\x58\xe1\x2a\x66\xfe\xcf\x41\x62\x0b\xee\x1c\x3f\xb6\x4d\x3a\x8c\xb6\x38\x49\x09\x43\x32\xa6\xdb\x93\x7a\x19\xa6\xca\x25\x73\x26\x55\xbb\xc1\xd4\x1b\x50\x65\xa1\xd1\xb0\x5d\x15\x1a\xf4\xd5\x79\x60\xd8\x4a\x26\x12\xa4\x06\xb1\x09\x9b\x49\x3d\xaf\x64\xc2\x1e\xf7\x9b\xc7\xd5\x72\xbd\xb8\x5d\x6f\xb6\xbb\x87\x7b\xbf\xae\x64\xc8\xa5\x1c\x70\xa3\x74\xe4\x62\x58\x04\xee\xfb\x68\x0a\x0e\x25\x70\xe7\xff\x16\x25\x3a\x48\x3c\x3f\x78\xa6\xe0\xa1\x80\xf1\x44\x18\x3f\x44\x9c\x24\xc2\x07\xc8\x3b\x0b\x56\xc6\x32\x45\x3c\xf5\x61\xf7\x2c\x2a\xdd\x09\x18\x1a\xc9\x21\x44\x42\x26\xa8\x4e\x28\x73\xb6\x7d\xae\xa0\x7e\xee\x78\x7b\x8d\x4c\x23\x40\xec\x4e\x5e\xee\x6d\xbd\xeb\x0c\x35\xf2\x68\x2f\x95\x29\x57\x78\xea\xe3\x32\xec\xe2\x26\x3e\xe5\xe0\x3a\x09\x08\x63\x3c\x16\x41\x67\xa7\xc3\x20\xa3\x27\x65\xaa\x43\x27\xb8\x18\x0c\xc8\x6f\x8c\x54\x21\x20\x2e\xf6\xe1\xe7\xfd\xea\xa9\x17\xd6\x33\x52\xe9\x00\xcf\x9a\xe5\xd3\xc3\xcf\xeb\xdd\xcf\xc5\x8f\x15\x1b\xb2\xa6\xb6\x1d\x52\xaf\xe9\x8b\x40\x89\x32\xcf\xc5\x8e\x90\xa0\xfd\xbf\xb9\xa2\x68\xa9\x99\xb4\x7a\xb3\x59\x71\xeb\xd9\xf2\x8d\xd4\x09\x41\x6d\xbe\xe5\x62\xfb\x84\xae\x39\xe8\x9b\xb2\xfa\x09\xd9\xfc\xde\x2e\xb5\x10\xc4\x96\x10\xae\x0b\x54\xd2\xb9\xc9\xf2\x8b\x32\x15\xa9\xb5\xb1\xd5\xea\xe5\x7e\x9f\xc3\x0d\x3a\x80\x6e\x69\xe6\x62\xdf\xfd\x36\x44\xaa\x17\xda\xd9\x96\xc7\x4c\x75\x03\x03\x22\x46\xff\x61\xb3\x5a\x8e\x16\x12\xa8\x04\xdd\xe5\xed\x33\x7c\xad\xba\xf4\xbd\x34\x5a\xa3\xc3\x78\x5f\x36\x65\x01\xfb\xb2\xf2\xae\xbe\x22\x81\xf2\x02\x35\x37\x98\x43\x19\xcc\x7d\x45\x64\x84\x7b\xcb\xb2\x3a\x1f\x9b\x92\x04\xa4\x6f\x30\x94\x0f\xca\x9d\x07\xee\xc0\x4c\x9a\xad\xed\x1e\xb2\x0e\x5c\x8c\x19\x85\x11\xc0\x66\x34\x86\x8a\x38\xcc\xd7\x48\x30\x20\xa0\x23\x77\x43\x05\xdc\x24\x36\xda\xad\xad\x69\x30\xe3\x1d\x24\xf3\xbb\x9b\xa2\xa1\xf4\x14\x9d\x4f\x1d\xd5\x42\xd2\x35\x02\xd3\x9d\xba\x83\x55\x1a\xb3\x69\xda\x2f\x93\xbb\x28\x57\x0e\xf3\x75\xd5\x49\x51\x1b\x45\x4d\x84\x31\x5e\x8c\x21\xae\x0e\xc7\xbc\x3c\x03\xdc\x65\xfb\xea\x63\x5d\x3b\xa3\x58\x1c\x48\xe5\x97\xcf\x4d\x85\x2a\x74\xbe\x49\x50\xa1\x7b\xc2\x80\x5d\x93\x41\x85\x24\xdb\x63\x2a\x0b\xc5\xda\x5d\xa0\xdd\x0d\xa1\x52\xf3\xdb\x84\x62\x8a\x05\xc6\x45\xfa\x3c\x49\xdf\xa8\x9e\x4b\x85\x09\x89\xbc\xa0\xbe\x43\xa1\xfa\x16\x91\x22\x58\xe2\x51\x34\xcf\x18\xf3\x1b\x9c\x34\x7e\x17\x50\x31\xb7\x19\x36\xdc\xb3\x1e\xa1\x5a\x0a\xd3\x4d\xa5\xd8\x00\x1e\x13\x77\xe2\x2c\xdb\xb6\x51\x25\x90\xeb\xc3\x23\x89\x7e\xc7\xe6\x2d\xab\xeb\x6d\x75\x1a\x13\x2f\x28\x9e\x72\xac\xda\xcd\x45\x8d\xc2\xc9\xb9\xe5\x9d\xf4\xad\x2a\xc4\x28\xf0\x63\x55\xae\x97\x0f\x03\x9a\x3a\xa3\x92\x20\x8d\x58\x97\xbe\xfc\xfa\x49\xea\x6c\x46\x1c\xdd\xa8\x84\x25\x84\xfa\xc0\x50\x23\xf2\x9f\x90\x6d\xcb\x2b\xb8\xee\x48\x9f\x26\x11\x6b\x95\x24\x01\x2e\xce\x9f\x13\x9e\x10\x87\x09\x1f\x6f\x06\x2a\x31\x12\x1d\xe7\x3b\xa8\x5e\x72\x58\xd8\xb2\xaf\x8f\xeb\x09\xe7\xd7\x8c\x60\x11\xc2\x35\xfe\x7e\x12\x23\x3a\x00\x25\x54\x14\x3a\xb7\xbc\x5d\x47\xb8\xeb\x8e\xf6\x6e\x25\x89\x46\x68\x0e\x4a\xdb\x7c\x19\xac\x04\x45\x22\xe5\x10\x59\x4f\xa0\xb3\x0a\x54\x33\xb0\x1c\x7c\xa7\x80\x62\x61\xa5\x6e\x0d\x29\xff\xa3\x2a\x89\x31\x38\xbd\xb9\x7b\xbc\xdd\x6e\xb6\xa3\x07\x52\xa0\x71\x70\x70\xe7\x46\xcd\xaf\xaf\x8b\x8d\xb5\x4a\xd7\xf7\xbb\x9f\xab\xf5\xee\x6e\xf1\x87\xef\xac\xa3\xd8\x9a\xca\xf8\xe5\xb6\x59\x0e\x97\x11\x85\xe1\x7f\xdd\xb8\xb8\x76\x27\x37\x1b\x87\x7f\x9b\x49\x93\x2b\x1d\x47\xb1\x03\x89\xf7\xb1\xd2\x9b\xaa\x3c\x6c\x40\x35\x1d\x27\xd9\x78\x98\x81\x6a\x4c\x40\x3e\x96\xde\x39\x55\x00\x21\xde\xe6\xfa\x54\xec\xa1\x2c\x9e\x4e\xc5\x22\x3f\x3e\x7b\xf0\xaf\x32\xd4\x60\xd4\x40\x8d\xb5\xce\x7d\xab\xd0\xb1\x3b\xfc\x7f\x2b\x65\x17\x07\x18\x7d\x20\x4d\x38\x24\xa4\x47\x1a\x16\xfb\x9f\xc2\x22\xc3\x1e\x8c\x8b\x2e\x8c\x3e\x89\x26\xa9\x74\xa8\x2a\xa1\xab\xd3\xb1\x13\xae\x32\x9a\x88\x04\x11\x82\xb7\x59\xdd\x64\xc5\x7e\x89\xf1\xa0\x1c\xe6\xb5\xf8\x8c\x26\xc6\xc2\xb9\x51\xb5\xc1\x79\x29\xc3\x4d\x58\x53\x02\x98\x3b\xb8\x7d\x58\xfe\x3e\x0a\xb8\x68\xca\xb8\x97\x21\xdf\xbe\x4f\x4a\x33\x34\x65\x1a\xa1\xab\x16\xfb\x1a\xec\x6e\xd6\xf7\xeb\xcd\xb7\xee\x52\x1d\x61\xb8\xe3\xe1\x98\x15\xad\x75\x32\x98\x3c\x9a\x19\x8e\x80\x8f\x5d\x56\x2f\xcb\xaa\x9d\x91\x7f\x3f\x89\xaa\x81\xea\xea\x74\xce\xa6\x3f\x13\x52\xa3\x5d\x94\x74\x99\x97\xa7\x89\x75\xfc\xb7\xcb\x89\xe4\xae\x8b\x02\x61\x11\x78\xe8\xf2\x0c\xd8\x27\x8d\x8e\x83\x0e\x99\x8b\x76\xca\x6a\xbf\x1f\xd2\x69\x1a\x1d\xcb\x98\xf0\x6e\xc2\x3a\xf7\x73\x51\x3f\xa2\x4c\x56\x9f\x5b\xee\xff\xbf\x0e\xd9\x32\x1f\xc9\x76\xb7\xe5\x92\x06\xe0\xe8\x9b\x45\x71\x5e\x8a\x63\xd6\x53\x45\x68\x2e\x53\xb4\xd7\x5a\x77\x32\x9f\x22\x8e\x34\x97\x06\x4d\x98\x62\xa2\xdc\x69\x34\xd7\x21\xa6\xca\x6f\x44\xe5\x76\x0d\x24\x20\x73\xad\x09\x25\x9e\x2e\x75\xa3\xca\xaa\xbb\x5f\x12\x05\x11\x74\xdb\xe1\xe9\x80\x86\xf3\xc4\x2b\xd0\x89\x4a\x70\xda\x63\x7e\xb6\x7c\x9f\x57\xce\x34\x3a\x31\x7a\xa0\xe7\x33\xb7\xe9\x8d\xfb\xa7\x34\xd2\x2e\x77\xd3\x2b\xa8\x79\xc1\xe4\x4f\x4d\x54\x9d\x26\x36\x1b\x5d\x79\xb5\x59\xbf\x08\xb5\xa0\x1a\x63\x31\xff\x16\xea\xe5\xb1\x6c\x96\xdd\xdf\xa3\x10\xfd\xd0\x3f\xaf\x47\x3b\x98\x16\x2a\x46\xcc\xf2\x7f\x2e\xa4\x20\x8c\x96\x24\xe5\xa4\x53\x3c\xb7\x41\x59\xdf\xa4\x43\x04\x37\x54\xb6\xbc\xea\x63\x12\x5f\xa3\x15\x4b\x90\xaa\xde\xce\xc0\x6d\xae\xb6\xf9\x38\xb6\x3b\x9e\xb0\x4a\xdb\x72\xf0\xa7\xc5\x3f\x56\xbe\xd0\x51\xeb\x50\x5b\xba\x7b\x7b\xa0\xe0\x59\x79\x81\x42\xfa\x90\x11\xd4\x68\x48\x62\xaf\x79\xf1\x4d\xd4\xcf\x17\xc5\xad\xbe\x9b\x34\xbe\xb8\xe1\x03\xda\x09\x6d\x04\x60\x97\xdd\xb1\x02\x57\x5f\x0c\x1d\x56\xfa\x53\xa4\xb7\x36\x32\xf1\x0a\x70\x3f\xa0\xd0\x65\x75\x59\x05\xd9\x9b\x99\x40\x08\x47\x9a\xe4\x5d\x8f\x33\xea\xd8\x06\x26\xd4\x65\x89\xbf\x04\x18\xb3\xf8\x2b\xcf\x65\x62\x79\xa9\x6f\xc1\xf8\x65\x02\x01\x05\x3e\x4c\xa5\xfc\xac\xca\x62\x3f\x4c\xae\x8f\x1f\x1a\x82\xd0\x52\x9f\xa8\x1c\xc4\x07\x16\x1f\x04\xdc\x65\x1f\xac\xee\x78\x93\xe5\xf9\xba\xb0\xf8\xba\xee\x67\x93\x30\x60\xfe\x5c\x9e\x17\xca\x9d\x9d\x3d\x10\xe8\x50\x75\xf4\x4e\xca\x22\xfb\xd8\x1c\xe1\x9e\x01\xaa\x80\x74\x65\xac\x39\x8a\xf7\xcc\x94\xff\x00\x4b\x04\xc2\x76\x8e\x48\xab\xfe\x13\x21\xfd\x17\x19\xbd\xcb\x39\x04\x21\xa7\x44\xf5\x7e\x0e\x20\x65\x87\x9e\x7f\x94\x38\x95\x18\x8e\xb3\x42\x5b\x17\x4a\x13\x1f\x25\xfc\x86\xbb\x2f\x70\x12\x7a\x60\x73\x4f\x30\x70\x53\x56\xdb\xf3\x71\x9c\xad\x80\x84\x48\x5c\xc3\x05\xbc\x2d\x0f\xa2\x9e\x7f\xa4\x44\x58\x20\x9d\x9f\x4e\xae\x10\xc4\x86\x61\xe7\xc7\x3e\x91\x71\x64\x4b\x77\x4f\x45\x53\x65\x50\x0f\xeb\xa0\x21\x0d\x6d\x98\xe3\xe1\xf7\xd5\x70\x47\x81\x34\x91\x10\x0c\x69\x2d\xd6\x17\x47\xf2\xd0\xbc\xe9\x7f\x2e\x55\x1c\x0d\xad\x3f\xd6\x5b\xbf\x6d\x81\x4a\x03\xe5\x9c\x69\x14\x65\xca\x7b\xfc\x15\x68\x1e\x63\x40\xa4\x29\x37\x79\x6b\x20\x8f\x5e\xd7\x10\x6e\x05\xc5\x55\x49\x1d\xd3\xb8\x1e\x52\x12\x81\x21\x40\xad\xa2\xdf\xd3\xef\xab\xed\xfa\xfe\xeb\xae\x1e\xf2\x03\x19\xc2\x12\x88\x1d\xdb\xde\x4d\x59\x3d\x74\x7a\xc4\xf3\x83\x65\x48\x6c\xd0\x48\xb0\x2c\x86\xd6\x1a\xb1\x00\xf3\xa1\x6c\xa8\xeb\x1c\xc4\x96\xfe\xba\x29\x37\xd9\x7e\x88\x00\x37\x01\xe7\xa8\x88\x65\x77\xcb\x99\xe2\xe6\xc1\x54\x36\x01\x10\xdd\x69\xcc\xd9\xd8\x78\xff\x86\x26\x30\x81\x0b\x35\x35\xe0\x03\x4d\x86\x06\x16\x5f\x92\x1d\x1e\x3c\x99\x63\xfb\x47\x15\x47\xa3\xf2\x8f\x55\xa1\xcb\xb7\x03\x4c\x31\xaf\x86\x32\x86\x97\x63\xe5\xf5\x0c\x93\x9b\x61\x82\x24\xbd\xc4\xdc\xcd\xe2\xf1\x83\xe1\x0a\xe3\xae\x52\xc7\x2a\xdf\xe1\xce\x30\x39\xd4\x4d\x28\x93\x30\x1d\x82\xfb\x2f\x99\x1c\x4c\xa8\x24\x12\x47\x6d\xbe\xad\x1f\x77\x9b\xdb\x87\xad\x0f\x9b\x98\x88\x73\x16\x0f\xc5\x7d\x6b\xb4\x88\x71\x9a\xcc\xb8\x23\xfe\x18\x30\x91\x36\x86\xfa\xd2\x07\xd0\x99\x25\xaf\x1c\x4e\x2f\x13\x81\x45\xd7\x68\xa8\x46\xda\x2e\xc6\xc4\x92\x41\xe2\x55\x10\x9e\x84\xfa\x00\x05\x6d\x78\xa8\x62\x3d\xd0\xb8\x72\xa5\xba\xfe\x36\xbc\x3d\x61\xed\x72\x55\x2f\x1b\xc8\x7f\xc1\xf0\x67\xb8\x11\xc8\x4a\xf0\xb5\xd4\xff\x6d\x0d\x9f\xf6\xdf\x51\x9a\x7c\x1e\xc6\x65\x12\x65\xa5\x84\xd6\x2f\xa7\x4a\xb8\x02\xa8\xce\x53\x36\xa9\xb4\x6a\xdc\x56\x6d\xf4\xfe\x72\x22\xa7\x90\x5a\x30\x6c\x79\x7c\x38\x36\x43\xea\xb1\xc9\xf3\xa5\x26\x24\xe8\x0e\x23\xc1\x80\x03\x54\x7c\xd0\x57\xc6\x14\xd3\xef\x7a\xa1\x2f\xb8\x3a\xbb\x2e\x9c\xda\xf4\x8c\xc8\xb3\xc3\xc1\x96\x3f\x4e\xba\xb4\x5b\xde\xff\xfb\xff\xfe\xdf\x62\x79\x3f\x0a\x2b\x19\x69\xa2\x94\x0d\xd1\x04\xef\xea\x22\x12\x6c\x14\x89\xd1\xf6\x29\x8f\x50\xb8\x1a\x2b\xdf\x22\x52\x44\x82\x39\x45\x76\xa7\xe3\x3a\x7e\x03\x25\x05\x66\xd3\xac\x29\x78\x0f\x6f\x77\x59\x81\x10\xe1\x61\x71\xb8\xef\xab\x00\x79\x60\x76\xa7\xe2\x28\xd4\x4b\x3b\x65\x2e\x74\x95\x8d\xd1\x44\x63\x6a\xcc\x31\x2a\xed\x5c\x4d\xca\xce\xe1\x46\x77\x4d\x76\x00\x5b\x4a\xe4\x9f\x13\x58\x8a\x36\x8f\x65\xea\xec\xfe\xaa\x09\x72\x97\x16\x65\xa7\xfe\x6f\x0c\x00\xb5\x15\xd7\x58\xcb\xb1\x6a\x9e\xb7\x65\xaf\x09\xfb\xf3\x9b\x27\x46\x9a\xca\x52\x8d\x35\xb9\x8d\x31\x8c\x99\xd0\x51\xd8\xda\x3c\xed\xdc\xd9\x9e\xf8\xde\x11\xf1\xd8\x56\x07\xe8\xbd\x29\x2b\x9b\x13\xab\xfb\xba\x65\xf7\x43\xfe\x14\x46\x8e\x2a\x17\x2a\xab\x06\x51\x1d\x49\x08\x89\x0c\xa6\x06\x90\x56\xcb\x9d\x6e\x4e\xdd\xae\xeb\xa2\x12\x94\x22\x5f\x17\x59\x73\xd5\xb3\xdf\x7e\x96\x33\x6d\xaf\xd2\x80\x95\x52\x56\x18\x0e\x8d\x9c\x5e\x19\x4e\x12\x12\x04\x0c\x3d\x40\x27\x57\xb8\x2e\xb6\x99\xdb\x0e\xb0\x31\x22\xa9\x3b\x0d\xed\x46\x37\x41\x06\xb4\x7d\x68\x88\x87\x1c\x1c\x4b\xe5\x54\x6e\xda\xbf\x86\x5d\x58\x1f\x51\x9d\xdd\x29\xd1\xb6\x25\xd2\xf4\x59\x37\xfc\x56\x13\x10\x83\x24\x84\xc5\x9a\x75\x01\xb0\xf3\x57\xd1\xc0\x9b\x38\x7f\x39\x0d\x6b\x71\x66\x1c\xb4\xf6\x42\xad\x31\x0c\x02\x85\x6a\x0d\xc3\x91\x21\x24\x09\x09\x09\x47\x91\xf0\xbc\xcc\x87\xce\x7d\xdb\xc2\x2c\x6c\xa5\x86\x46\x74\x64\xf4\xad\x7f\xbe\x6e\xe0\x80\x82\x39\xee\xec\x92\x84\xc4\x24\xf6\x12\x4d\x26\xab\x0e\x9f\x73\x9f\xf9\x6b\x68\x84\xc1\xfe\xdf\x95\xa8\x9f\xfb\x35\xdd\xb6\x48\x9b\x3a\xdb\x09\xad\x71\xdb\x83\xd3\xe1\x03\xb0\x96\xbf\x42\x03\xd1\x1d\x54\x30\x77\x79\xce\x9b\xb2\x5a\x8e\x34\xa9\xdb\x9e\x40\x6d\x6e\xf5\xfd\x79\x2c\xa6\x27\x09\xe1\x44\x20\xc9\x9a\x4b\x96\x42\x01\x26\x53\x99\x18\x14\x80\x8d\x7f\x95\xa7\x01\x4a\xdf\xa0\x20\xe4\x4e\xf9\x1a\xca\x49\xad\xab\x24\x24\x0d\x38\xa2\x45\x90\x80\x63\x85\xfc\x31\x59\x69\xa3\xf0\xe8\x0f\x8f\x07\x26\x55\x11\xbe\xcc\x35\xbc\xbe\x8f\xc6\x45\x10\x8d\x56\x1f\x46\x70\xdb\x17\xfc\x48\x67\xcc\xf7\x4f\xac\xe0\x93\x3c\x5d\x94\xb0\xfd\x05\x65\x58\x77\x13\x19\x50\x96\xf6\x99\xa2\x45\xa1\xa7\x1c\x92\xe3\xf9\x2f\x85\xe5\x36\xba\x16\x99\x2a\x5f\xcb\xb1\x86\xc4\x07\x4c\x3f\x78\x99\x46\x7e\xeb\xac\x0b\x78\xa1\x93\x5a\x9e\x9a\x0b\xe2\x2e\x49\x88\xd2\x1a\xf7\x38\x4b\x95\xb2\x2f\x9d\x9d\x24\x09\xd1\xa1\x42\x9a\xb4\x3a\x2b\xf6\x39\xdc\x66\x05\xa0\x53\xd4\x35\x73\x62\x35\x4a\xcb\x3c\x1f\xd6\x3d\xb7\x4d\x52\xc4\x43\x94\xdd\x70\xdf\x9e\x4c\x5d\x48\x62\x64\xb8\x55\xa2\xd8\x59\x5c\xa4\xbf\x09\xc8\x14\xc5\x3f\x0d\xc0\xd2\x99\xcc\x65\xb7\x7d\x98\x94\x77\xe1\x5a\x10\x87\x47\xa8\x4c\xd6\x2c\x26\xe4\xfd\x92\x04\x44\x27\xe8\xfb\x40\x51\x9f\x2a\x0f\x91\xe8\x2a\x8f\x46\x23\x11\x10\x9d\xe2\x7e\xa5\x44\xb1\x7a\xcf\x9a\xa1\x08\x97\xeb\x11\x50\x30\x74\xa0\x6a\x8e\x2f\xbd\x5c\x6c\xaf\xa1\x6e\x32\xcb\x01\x32\x93\x3f\x6d\x2f\x4c\x05\xb5\x96\x93\xd3\x13\xf7\x7f\x37\x0a\xf7\x66\x5d\x8e\xc2\xe4\x92\x04\x34\x51\x5d\x99\x29\x20\xdc\xc5\xb7\x30\xc9\x30\xc3\xb6\x83\xaa\x2a\x6d\x4c\xcc\xf3\x16\x0d\x67\x5b\xc0\x4c\xcc\x5c\x68\xe7\x3e\x53\x2f\x85\x38\xc0\xd5\x79\xfe\xf1\x98\x11\xa8\xdc\xfa\x9b\xd0\xe8\xf8\xd8\x08\xe4\xfc\xac\x0c\xc2\x28\x44\x2b\xe4\xb5\x52\xfe\x91\x22\x99\x20\x2a\x49\x38\xb6\x83\xad\x78\x81\x45\xfd\x34\x81\x2f\xb5\x1d\x15\x45\xdf\xe8\xe6\xf6\xe1\xe7\x70\x3d\x06\x71\x2c\x31\x06\x80\x02\xe3\x6e\x29\xb6\xef\x72\xf7\xd2\x8d\x55\x6c\x52\x1c\xfc\xed\x73\x56\xf9\x3d\xd4\x53\x86\xb8\x2e\x3c\x30\x22\x1c\xb1\x78\x7c\x85\xc2\x09\x48\xad\x75\xd7\x2b\xb2\xbb\x31\xae\x86\x2e\xe6\xe9\x1b\x15\x41\xdb\xb8\xca\xbb\xb7\xe3\x3a\xc1\xfe\xa2\xae\xa1\x6a\x56\xff\x19\x10\xd5\xcf\x6e\xc7\x41\x42\x88\x49\x86\x56\x0e\x5a\x37\x33\x9a\x7d\xf3\x24\x96\xed\x1d\x02\xc9\x1c\x72\xe8\xee\x6c\x03\xd7\xcd\x79\x5a\xaa\x3e\xfa\xda\x89\xb6\x95\xea\x07\xf1\xbe\x30\x26\xcb\x33\x9f\x93\x95\x24\x48\xa9\x49\xad\xa4\x0d\x86\x4a\x7c\x28\xcd\xb7\x1a\x5b\xa5\xdc\xb4\xe3\x7a\x9d\xd5\xe8\xd5\xfa\x4c\xb2\x24\x81\xe0\x81\xee\xf2\xd4\x16\x36\x1e\x4c\xe6\x8f\x90\x21\xda\xec\xd6\xc4\x98\x44\x7d\x7c\x1f\xa3\x45\x4f\xfd\x7e\x25\x6a\xe8\xe5\x81\xff\xc7\x6a\x15\x49\x02\x49\x18\xce\x97\x21\x2d\xca\xb0\xbc\x77\xe6\x0a\x9a\x7a\x44\x78\x0f\x38\xe9\x48\x1d\x7e\xf1\x6b\x4c\x62\x9d\xcf\xce\x29\x38\x7c\x26\xa6\x3b\x36\x20\xfc\x0d\x92\x84\xbb\x00\x9a\x33\x54\x6f\x4e\xe0\x5d\x76\x49\x02\x15\x13\xc9\x07\xcc\x74\xb3\xde\x82\x24\x81\x66\x1a\x4d\x8c\xd5\xfd\x76\xb4\x7c\x74\x14\x62\x70\xf8\xb1\xcc\xcf\x8b\xec\x57\x4c\x34\x78\x81\xd5\x1d\x3c\xba\x8f\x35\x45\x8b\x04\x93\x03\x3a\xd0\xdc\xf1\xec\x79\x12\xfd\x7a\x5b\xde\x64\x33\x8a\xbb\x9f\xc5\x70\xfa\x17\x81\xc4\xae\xc1\xdf\xca\x6c\x58\x7b\xdb\xb6\x08\x57\xf8\xeb\x14\x11\x1f\x7a\x33\xbd\x6d\x95\x02\x29\xac\xef\xd6\xf7\xbb\xed\xc3\x76\x71\xeb\x30\xa0\xbb\xaf\xab\xed\xce\x13\xa9\x4a\xd2\xba\xf8\x48\xec\x7e\x2a\x32\xd4\xfa\x5a\x39\xc8\x44\xdb\xc4\x02\xcc\xb8\x3f\x8b\x4a\x2b\x71\x5c\x17\x83\x40\xb1\x24\x94\x30\xc3\x3a\x4e\x68\x67\x76\x5f\x39\x5d\x38\x3a\xde\xce\x28\x91\x41\x62\x51\x4e\xaf\x90\x97\xc7\x0e\xa1\xd2\xdd\x4b\x73\x2c\x7f\xda\x79\x9d\xea\xb9\x64\xb8\x24\x34\x50\x02\xb7\xc5\xa7\x93\xec\x31\x86\x92\x50\x9a\x18\x44\x53\x66\xaa\x44\xe3\xcd\x15\x33\xe9\x3b\x87\x39\xf4\xfd\xc2\x90\xa3\xf3\x22\xfb\x2a\xf7\x2e\x39\xd0\x36\x0b\x89\xe9\xe5\xaf\xd6\x7b\xb9\x3e\x35\xea\x79\xaa\x07\xf4\x3f\x7e\xc6\xbf\xb6\x4c\x69\x28\x6d\x25\xce\xd7\x2a\xd3\xe7\xd1\xd0\x44\x01\xc4\xba\x27\x06\xb3\xe9\xfd\x8b\xb0\x64\xdb\x31\xb5\x1c\x2d\x9b\x6f\xeb\xc7\xf1\x1d\x84\xb4\xf5\x25\x0d\x1c\xc9\x53\xbf\xdd\xd1\x48\x29\xa4\x5f\xd5\xae\xf2\xa7\x9e\x7c\xb5\x98\x07\xc8\xaa\x24\xf4\x6b\x56\x97\xd5\xd9\x92\x80\x76\x1c\x80\xfe\x36\x3c\x20\x18\x5b\x7f\x45\x68\xf7\x4d\x96\x8f\xdd\x08\xca\x99\xc6\x78\x9e\xd0\xfa\xc7\xd1\x7c\x98\x6c\xfe\xe0\x5f\xef\x35\xb4\xe7\x3c\x32\xbd\xdb\xad\xc5\x52\xca\xcd\x5b\x96\x43\xcf\x72\x9c\xfa\xf4\xb7\xd2\x9c\x59\xcd\xfe\xce\x56\xf7\x0c\x19\xbe\x07\x80\x55\x0d\xa3\x72\xfc\x32\x29\x4b\xd0\x66\xc4\xac\x05\x66\x34\xda\x7d\xea\xc3\x54\xc2\xe4\x33\xa7\x8a\xaa\xa4\x37\x6c\x77\xa7\xe2\x0d\x2b\x75\x3c\x7c\xe1\x17\x57\xeb\xd4\xcb\x1a\x3f\xe6\xa2\xc9\x8a\xde\x45\x19\xed\x41\x54\x50\xa3\x83\x41\x80\xe2\x16\x0e\xa5\xc3\xcb\xfa\x1e\x9c\x89\x7e\x97\xba\x08\x0d\x0d\x5c\x45\x2a\x0c\x41\x16\x14\x69\x7d\xec\x4d\xef\xb8\x52\x19\xa7\x3a\x76\xe4\x87\x1f\x55\xcc\xb7\xdd\x4c\x88\xa8\x1a\x10\xd5\x6c\x05\x9f\x24\x54\x85\x56\xeb\xc6\x11\xdf\x4c\x67\xa2\x4a\x08\x46\x89\xfc\x0b\x4d\xd0\x89\x92\x50\x2d\x12\x3c\x7c\x75\x26\x0e\x65\xa1\x2f\x8a\x86\xdb\x2e\xd2\x09\x6e\x82\x38\x2c\xbc\x3b\xe3\x5f\x05\x92\x10\xeb\x4f\x8f\x55\xa9\xa0\xae\x37\xd0\x51\x57\xfc\x4a\xcc\x68\xb0\x04\xc1\x30\xc4\x85\x6c\x16\xb7\xab\x60\xb7\xba\xbf\xf6\x77\x37\x01\x20\x21\xb5\x85\xad\x62\xae\x6b\xc6\x36\xa1\x26\x62\xc2\xeb\x55\x2d\xcb\x42\x89\xc6\x91\x6d\xb3\xc0\xaa\x93\xda\x7e\x8c\xb0\x00\x4f\xc1\x9d\xa8\x5f\xfe\xde\x3e\xe3\x50\xf7\x73\x4e\x9b\xc6\x2d\x37\x6f\x78\x31\x12\x26\x38\xbd\xbd\xf0\x46\x96\x43\xdd\xf8\xaa\xe6\xb6\x3d\x62\x98\x3b\xb2\x6b\xcd\x25\xc8\x3f\x3f\xfb\x19\x0d\x34\xee\x26\xff\xf8\xed\xee\x43\xed\xd6\xb6\x5b\x6c\xe5\x22\x6b\x27\xed\x82\x46\xac\x18\x13\x61\x8f\x92\x6b\xfe\x3a\x63\x30\x36\xf4\x06\xd9\x9d\xe5\x06\x1f\xd0\xfb\x4a\xc2\x58\x64\x8c\x1a\x48\x93\xfe\x55\x7b\xc9\x5f\xce\x39\x02\xde\xa0\xd0\xde\x22\x16\xdd\xc1\xc0\x98\x20\x18\x2d\x3c\x8a\xf3\x75\xf6\x5a\x8f\x0d\xb2\xe1\x27\x64\x4c\x58\xde\x4e\xa7\xe4\x39\x3b\xdb\x19\x53\x02\x17\xc4\x6b\xd9\x40\x85\xd5\x0b\xdd\xa7\x0d\x49\x60\x37\x53\x0c\x19\x0e\xf7\x71\x16\x72\x85\x9a\x30\xed\xf7\x3e\x88\x06\x1e\xcb\xa6\xbf\x2c\x0d\x2c\x7d\x5f\x0e\xa2\x3d\xfd\xca\x4a\x77\xc0\x09\xbf\x83\xb2\x30\x4d\x91\x14\x75\xf9\x5c\x96\x35\x5c\xbd\x81\xe8\x2e\xd7\x11\x86\x8a\xac\x8a\xc6\xb5\x5f\x84\xbe\xd5\x30\x4c\xa1\x1d\xce\xb7\xa2\x9d\x9a\x57\x99\xdf\x01\x58\x14\x49\xfc\xe8\xb7\xa7\x6f\xa7\x91\xbb\x3d\xfe\xe8\x71\x68\xeb\xf5\x0f\xe2\x1d\x99\xd6\xbb\x5b\xc7\x42\x62\xe2\xa0\xdd\xa1\x3e\xb3\x16\x5d\x77\x0e\x21\xb2\xb1\xdd\x0d\x0e\x7f\x96\x24\x0c\xf1\x92\x15\x08\xbd\x15\xb5\x55\x81\x04\xfd\x50\x8c\x76\x6e\x96\x12\x86\x05\x68\xed\xef\xb7\x3e\x5e\xf7\x0c\x69\x68\xf1\x66\xba\x2a\x8f\x1d\x05\x6b\xfb\x77\x9e\x44\xd6\x16\x55\x65\xa1\x45\x75\xf6\xeb\xc0\xb5\x4b\x26\x88\x13\x9c\x78\x7c\x78\xb8\xdd\x81\xce\x9a\x5d\xc0\xc6\xbf\xaa\x42\xc9\x3c\xc7\xe3\xa0\xdc\x74\xb0\x6b\x30\x15\x73\xcc\x7e\x66\xc5\x41\xbc\xfb\x9b\x2b\x93\x62\x36\xa8\xc3\x41\xb5\x4f\x37\x97\x75\x96\x84\xe9\x20\x4e\x9d\x26\x04\x2c\x87\x6b\x42\x47\x0a\x53\x09\x8f\x3f\x96\xa3\x25\xe9\x9a\x0d\xb7\x22\xe7\xfb\xec\x15\x4e\xc7\x81\xae\x95\x6d\x0f\x49\x40\x10\x8b\x65\x4e\xb5\x1f\x94\x90\x50\x8d\x6e\xdf\x6d\xf6\x0a\xce\x34\x1a\x57\xd4\xfc\xa5\xe5\x16\x12\xce\x90\xde\xc6\x9b\xd5\x3f\x45\x05\x28\x03\xbb\x39\x8a\x8f\x85\x93\xfc\xc5\x8e\xcc\x54\x9e\xce\x3f\xca\x93\x7a\x1e\xa4\x5f\x7d\x0f\x1d\xe1\xb4\xb4\x08\xdc\xb2\x43\x73\x3c\xa0\xb2\xe0\x2f\xb7\x86\xd1\x30\x85\x41\x28\x7c\xd1\xaa\x4b\x6e\x7d\x15\xb5\x05\xc2\x8c\x7f\x35\xe0\x90\x26\x9e\x72\xec\x47\xd9\x19\x5a\x61\x90\x06\x78\xf2\xec\xf6\xd0\xdc\x37\xcf\xf7\x99\x94\x39\x3c\x98\xb1\xe2\xf4\x60\xb3\x0b\x29\xb3\x98\x39\x9b\x6a\xf2\x8a\x0b\xc3\x89\x15\xd2\x90\x83\x85\xe3\x17\x8d\x50\x65\x36\x42\x7b\xb7\xed\x89\xe5\xb3\xaf\x9f\x45\x05\xf5\x83\xb1\x4a\x60\xf3\x6f\xc8\x98\xc1\x7b\x61\x06\xb3\xac\x9a\x7a\xf5\xb4\x0c\xe2\x68\x3c\x5d\xc2\x30\x12\xe8\x9b\x3d\x3e\xad\xef\x56\xbb\x1f\xab\x0d\x26\x3d\xaf\x17\xdb\x95\xff\xcd\x30\x0e\xd5\x80\x01\xff\xd0\x3f\xf4\xe4\x0b\x86\x49\x92\x84\x83\xca\xfb\x4c\xb9\x80\x64\x40\xfe\x36\x8e\x2f\x0f\x8f\xad\x30\x0a\x88\x6e\x3f\xeb\xfb\x29\x6f\x06\x3b\x63\x18\xa5\x36\xd7\x75\x5b\x8a\xc2\x07\xff\x3e\x2c\xf1\xfa\x6b\x13\x34\xe6\x1a\x06\xc2\xf5\x93\x2f\xcd\x03\xed\x68\x93\xb3\x83\xa8\xce\xbb\xb7\x9e\x98\xa3\x6d\xd5\x1a\x79\x7e\xad\x51\xf7\x0b\x05\xc2\xb6\xbf\xa1\xa1\x67\x33\x19\x26\xb6\x82\xcb\x8e\xd2\x1a\x9f\x65\x39\xf9\xda\x09\x8b\xb8\x76\x68\x50\x8c\xf1\xee\x44\x10\xf5\x8d\x8a\x59\x21\xda\xbc\x14\x1f\xb8\xfd\x61\x12\x85\x28\x83\x75\x9d\xbd\x66\x7a\x36\xb1\x86\x9d\x38\x89\x07\x8a\x80\x3b\x51\x55\xc2\x27\x50\xc2\x34\xe4\xc8\x67\xe4\x90\x9d\x9b\x53\xa6\x32\xdd\x2d\x82\x54\x5b\x51\x57\x47\x46\x05\x79\xbe\x2d\xaf\x72\xa1\x5e\x6c\x56\xe3\x43\x28\x8b\x24\xa1\x08\xac\xcc\xf1\x57\x4c\xb9\xd4\x50\x34\xd7\x08\xc0\x6c\xdd\xea\xf1\x03\x0a\x66\x90\x2f\x7f\x55\xe8\xdb\xb2\x69\xa0\xea\x1e\x4e\x32\x83\xbb\x79\x56\x2f\x7d\x2d\xea\xbc\x85\x12\x2a\xc1\x51\x1d\x11\x4b\x7c\xf4\xa1\x3b\x68\x42\x1d\xc7\x68\x09\x1f\x30\x6f\x77\x2a\xf4\xc8\x02\x09\x81\x87\x18\x77\xfb\x0a\x55\x95\x35\xaa\x3f\xa1\x42\xe0\x2e\x76\x8b\x27\xd3\x52\xd4\x4d\x8e\x62\xf4\x97\x9c\x16\x7d\xd0\x6a\xe4\xb7\x7c\xf6\x8f\xff\x0d\x19\x63\xcc\xbc\x3e\x49\x47\xb7\x37\x6f\x7c\x84\x46\x85\xe8\x8e\xd5\xa7\xe3\x80\x11\xd5\x36\x46\x84\x44\x58\x3c\x81\xd4\x08\x27\x97\xaa\x9b\x42\xd9\x71\xa1\xc6\xa3\xa5\x19\x11\x69\x49\x08\x2c\x5b\xc0\x4d\x79\x2a\x34\x54\xf5\xa2\xd0\xae\x74\xb6\xee\x7e\xc1\x24\xcc\x25\x30\xda\xad\xe6\x23\xfd\x93\xee\x79\xa3\x40\x73\x6a\x1f\x49\x68\x57\xba\x36\xee\x40\x9d\x8c\xb8\xcf\x16\x74\x34\x08\xe3\xfd\x2b\x62\x94\xe1\x2e\xb1\xd3\x50\x37\x55\x79\x9e\xbe\x7b\x48\x22\x2c\x6d\x2c\x36\xd9\xbe\x98\xfc\x46\x18\xda\x30\x4c\x01\x6f\xb7\x2e\x83\x82\xa4\x03\xd3\x6e\x51\xc4\x9c\x88\x55\x6b\x3e\xd6\x9e\xd6\x51\x77\xbf\xc1\x35\x06\x2a\x6c\xb9\xd7\xe6\xb9\x3c\xde\x95\x7a\xe2\xbe\x45\x11\xb7\x0e\xbb\xdb\x1d\x45\x25\x0e\x1f\xf2\xdd\x4f\x06\x2b\x12\x31\xb5\xd4\xff\xcb\xa7\x3f\x1f\xb7\xdf\x56\xd7\x5f\x57\x1f\x17\x4c\xb5\x17\x68\x6b\xfc\xd8\x88\xf4\x63\xff\x51\x7c\xbb\xb1\xdc\x47\x59\xbd\x15\xd5\xbe\xdb\xe3\xa2\x98\xa4\xca\x2a\x07\x64\x0a\xf6\x15\x40\xb1\xaf\xe0\xdc\xb7\x02\x8a\xa4\x62\xf5\x93\x78\xac\xca\x57\x31\x79\xc7\x38\x8a\x31\x12\xde\x1e\x1f\x3b\x16\xec\xae\x57\xcb\x1d\x25\x94\x76\x77\x90\x32\x41\x96\x1d\xd0\x9b\xf2\xfd\x4f\x51\xbc\x00\xd4\xa1\xab\xb9\x90\x24\xe2\x4c\x43\xec\xd1\xb8\xa6\x3d\xdb\xda\x89\x96\x5d\x90\xd7\xb5\x5d\x23\x12\xdb\x6c\xd2\xb4\x21\x09\x9d\x4c\x5d\x53\x41\xd6\x65\x65\x22\x9e\x24\x48\xf5\x82\x48\xa7\x7c\x42\x13\x26\x49\x94\x86\xc4\xc3\x3b\x1e\x8e\x50\x38\x33\xa8\x9b\xe1\xa9\x0a\xf0\x9c\xdc\x91\x5d\x31\x01\x3c\x48\x12\x09\x42\x30\xe0\x76\xbd\xda\xfa\x0b\x44\xc8\xb1\xf6\xfb\x47\xa9\x86\x06\x7f\xa4\x13\x92\xc6\xde\xa5\xa9\x66\x4f\xd2\x08\x58\x4a\x44\xe7\x59\x22\x5e\x63\xee\x33\x83\x24\x96\x59\x36\xab\x6f\x41\x1c\xff\x04\x31\x39\xd2\x22\x23\x12\x66\x0b\xc8\x9a\xaa\x2c\xc4\xbe\x83\xd2\xdc\x94\xd5\x77\x67\x32\x8f\x2c\x90\xc8\x28\xfb\x91\x0f\xce\x5f\xf8\x39\x3c\x04\x23\x03\x26\x6a\x0f\xb5\x75\x5d\x9f\x3e\xca\x16\xc6\x84\x31\x1b\x61\xb2\x43\x38\x24\xf2\xf7\x3b\x4b\x4c\x42\x61\xb9\xbd\x9d\xc3\xf8\xa5\xff\x7b\xea\xc9\x8b\x96\xa2\x68\xae\x1c\x55\x6a\xbd\x2e\x36\x4d\x79\x3c\x82\x1e\x44\xfe\x62\x22\x79\xe2\x10\x4a\x3e\x83\xd4\x9e\x51\x0f\x47\x97\xf5\xb8\x01\xb8\x6e\x9d\x9b\xc5\x64\x57\x8f\x89\xb6\x02\xc9\x1d\x9f\x4e\x9e\x7b\xa0\x4a\x07\xa9\x72\x5d\x83\x14\xf0\x37\x9e\x45\xdd\xe3\x71\xe7\x6d\xf6\x98\x32\xc2\x43\xe4\xbb\x28\xff\x0b\xc5\x50\xf0\xcd\x75\x60\x41\x44\x6d\xf6\x1e\x13\x33\x96\x98\x69\x38\xfe\x71\x28\x25\xfa\x83\xbb\xbc\x29\xc5\x20\x33\x1e\x87\x4a\x60\xc1\x5c\xeb\xe9\xdc\x94\x95\x42\x00\xd9\x6a\xac\xfb\x23\x49\x1c\xf1\x18\x29\x3e\x30\x89\x3c\x0a\x98\x74\x6f\x14\x13\x85\xe5\x3f\x1d\x59\xdb\x38\x4c\x16\xc7\x5c\x61\x02\x07\xc1\xbf\x7d\x95\x49\xdb\xa2\x99\xe4\x03\x1e\x6a\x0f\x28\x9d\x3f\x94\xe2\x58\x2b\xac\x01\xbb\x5b\x3d\xfd\x63\x94\x98\x8f\x63\x30\xcc\xaa\x3b\x95\xb9\x2e\xdf\x3c\x7e\xd5\xb5\x72\xa2\x7c\x55\xd8\xae\xf6\x35\x74\xed\xdf\x03\x86\xdb\x87\xa3\xa4\xb0\x53\xf3\x52\x27\x6d\x26\xd0\x10\x73\xa6\x3d\x79\x3a\xa2\x0e\x7a\xed\xb0\xee\x57\x93\x38\x42\xf3\x35\x2b\xd4\xbd\x5f\xc5\x71\xc2\x39\x4a\xf6\xa2\xee\x89\x23\xe0\x9b\x8c\x78\x22\x23\xe9\x72\x95\x4f\xa2\x78\x21\x81\xbf\x36\x65\xa9\xb0\xa8\xf4\x66\xf5\x9f\x53\x7f\x74\x8f\xc0\xf1\xa3\x8f\x9f\x26\xdc\x66\x8e\x4f\x52\x97\x07\x91\x15\x18\xfe\x9f\x5b\xfb\x71\xaa\x5d\xfc\x17\x0a\x7d\x53\x95\x87\x8f\x50\x2b\x63\x42\x49\x49\x62\xa9\xa4\x27\x47\x76\xe6\x26\xd6\xa9\xcd\x2f\x65\xc5\x63\x4d\x7c\x3a\xe0\x2e\x2b\x40\x0f\xe4\x12\x25\x89\xb5\xb1\xa2\x11\x7e\x2a\xf9\x9a\xd8\xc9\x6d\xb4\xa1\x18\x02\xfb\x0a\xcd\xdd\xd9\xa9\x69\xb8\x26\x08\x80\xf4\x49\xe5\x2d\x88\xc3\x25\x80\xb0\xed\xd6\xce\x7f\x1b\x6b\xb0\xfb\xc1\xcf\x8e\xd0\xd3\xf7\x68\x7d\xdf\x76\x0b\xde\xac\x44\x7d\xbe\x3b\xe5\x4d\x56\x67\xbf\x08\x6f\xc5\x00\x24\x0c\x3b\x09\x4c\x51\x67\x6a\x5d\xa8\xf2\x62\xd9\x02\x68\x2f\x54\xf9\x04\x06\xaa\x4a\xe4\xf8\xdb\x97\x04\xa0\x92\xc4\x26\xd4\x08\x86\x5c\xac\x31\x9e\x31\x69\x4c\x34\xb3\x61\x0d\x0d\x70\x18\x6d\xae\xb1\xd1\x01\xa6\x0b\x96\x4f\x0b\x57\x36\xb4\xd9\x2e\x9e\xb6\xbb\xeb\xc5\x9f\x5d\x17\xb0\xdc\x64\x76\xb4\x6c\x56\xa4\x5d\x81\x37\x65\x65\xa7\xca\xe8\xd7\x38\x09\x13\x9d\x76\xeb\x15\x83\x34\xe3\x37\xe3\x24\x82\xd0\xe5\x8c\xef\xce\x9b\xb7\xb2\xf2\xbb\x00\x27\x52\x22\xb4\x4c\x97\x1e\x7f\x00\x4f\x65\x6f\xa6\x5d\x46\x4c\xe7\x72\x3b\x9c\x48\x8d\xd1\x06\x91\xe7\xbb\x52\xd6\x8d\x50\x79\x17\xa3\xe1\x81\x92\x78\xdc\xbb\x5c\x54\xf7\x67\x23\x70\x93\xdc\xac\xee\x97\xbb\x6f\x8b\xa7\xeb\xdd\x72\xf1\xe8\x1b\x29\x89\x31\xc8\xe9\x10\x6e\x77\x59\xd1\xf3\xe2\xb5\xcd\x52\x5b\xe5\xe2\xba\x9d\xaa\x87\xc3\x18\x9a\xc1\x19\xa5\x3c\xe9\xb8\x34\xd7\xcb\x87\xcf\x70\x90\x6d\x7f\xa0\x92\x7b\x06\x1d\xd1\x65\xd1\x38\x33\x11\xed\x49\xe6\x7c\x1e\x7e\x0c\x56\x1a\x8d\x43\x6b\x1a\x51\x5f\xcb\x69\x5d\x98\x11\xc6\x74\x2e\xa0\xcb\x23\x1e\x0b\x67\x57\xde\x75\x7e\x07\x8f\x52\xc5\xc0\x59\xf3\xeb\x02\x95\x88\xe1\xe2\xd8\xe2\x9c\x69\xd4\xfd\x3e\x8a\x33\x72\x77\xb5\x13\xc0\x13\x4d\xcc\xfa\xa1\x9c\x87\x81\xb1\x72\x06\xa6\x82\xfa\xd9\x92\xd5\xf8\x36\x45\x1c\xef\x85\xd0\x1b\xd1\x9a\xbf\x43\xe0\x19\x4f\x88\xd4\x89\xe7\x67\xb0\x48\x90\xf6\xd4\xef\x3e\x74\x12\x6b\x0c\x45\xdc\xc3\xb1\x39\x15\xa3\x2d\x84\x27\xc6\x60\x38\xeb\xca\x7a\x57\x5e\xd5\xc7\xb5\xa6\x34\x42\xc0\xa5\xec\x31\x54\x96\x18\xc6\xb7\xa7\x0c\x51\x3a\xad\x21\xd3\xd7\x4a\xb6\x0d\xca\x78\x1e\x4d\xeb\x5f\x5c\x57\x62\x5f\x4e\x96\x23\x17\xcc\xc6\x70\xb2\xda\x6b\x8a\x20\x13\x52\xb7\x08\x44\xec\xd8\xd9\x6c\x02\xe1\xd1\xd6\xf6\xbb\x24\xf6\x64\x29\x49\x09\x36\x14\x89\x73\xc2\x31\x62\xea\x59\xfd\xc8\xd1\x33\x48\x08\x4c\x2f\xbc\xb3\x7d\x86\x03\xe8\xcd\x11\x0b\x10\xa6\xb2\x33\xb3\xc7\x2c\x97\x40\x6d\x41\x96\x5f\xa7\x5b\xd4\xd6\x1f\x9e\xdc\x5c\x71\xab\x2e\x7a\x5b\xee\xf7\xa0\x6d\x38\xa0\x98\x96\x29\x8c\x52\xe5\x96\x35\xa7\x37\x40\x38\x84\x80\x5b\x97\x43\xa4\x2e\xcf\x2a\x1f\x83\x18\x7c\x3f\x6d\xeb\x68\x2d\x3b\xa9\x8d\xd2\xd9\x2f\x3e\xe9\x07\xc4\xf2\xc3\x57\x8a\x92\xed\xb0\xaa\x7e\xfe\x30\xe2\x86\x08\x8c\x9f\xc1\x3b\x54\x2a\xab\xa7\xbf\x6b\xda\x7d\xc3\x41\xf7\xfe\xcf\xac\x96\xf8\xd2\x93\x9f\x65\xc4\x32\xe1\x75\xd5\x9c\xab\xed\x37\x5f\xc8\x79\xf3\xfd\xfe\xba\xab\xe6\x94\x24\x09\x64\x2a\x3a\x47\xb8\x86\xdd\x60\xde\x8e\xa7\x4b\x12\x28\x83\x74\xf3\xbb\xc6\x73\x13\x3c\x74\xa9\x9a\x84\x72\x13\x52\x57\xc9\x55\x65\xaa\xf1\xb5\xdf\xd7\x7d\xa2\x37\xa1\x32\x55\x9d\x1e\xcc\x5e\x14\x59\xed\x68\xa1\x7b\x3b\x37\x61\x3c\xc2\x3a\xf3\x43\x56\xac\x95\x8d\x98\xf6\xc5\x7e\x92\x24\x21\x4d\x10\x0d\x8c\x52\xf2\x85\xc8\xdb\xad\x7e\x3c\xac\x49\x98\x10\x3c\x07\xec\x96\xb9\x81\xa6\xc9\xa1\x53\x40\x68\xdb\xd3\x18\x01\x51\xbb\x02\xde\x30\xce\x5b\x3f\x67\x47\xc7\x3c\xe4\x37\x1a\x6b\x15\xcc\xff\x33\xfe\xb5\x28\x20\x5e\x3d\x49\x67\x75\x5d\xe6\xaf\xa0\xd5\x0c\x71\x50\xdb\x35\x95\x18\xdb\x2a\xdd\xca\xb5\xec\xc4\xf5\x0c\xca\x2f\x89\x44\xe4\x15\x9f\xee\xce\x3f\xb3\x7e\x9c\x23\x47\x20\xb1\x7a\xb7\x9b\x9a\xfb\x73\xcc\x52\x60\xfe\xbc\x3f\x76\x88\xb9\x9b\xb2\x5a\xbd\x37\x95\xb8\x2a\x0b\xfd\x88\x75\x42\x75\x77\x05\x17\x58\xc5\xfb\xef\x32\x2b\x5a\xc3\x7c\x10\xd3\x48\x7c\x17\x97\x8e\xd9\x43\xf3\xbd\xca\x36\xd0\x8c\xbe\x14\x97\x89\x74\x98\xfa\x9f\x65\xf5\x62\xf2\xf2\x6d\xd4\x9e\x50\x15\x4a\x1b\xab\x58\x6d\xbf\x7d\xdf\x5c\xdb\xf7\x1c\xda\x84\x49\xc2\x02\x44\x41\x4b\xcf\xce\xd3\x17\xe7\xb5\xad\x91\xc6\xbc\xae\xee\x8a\xba\x31\x5a\xe5\xd6\x5c\x6b\x43\xfe\xd5\xd2\x39\x49\x92\x34\x30\xe1\x10\x4f\xb4\xd8\x0f\xa6\x44\x1a\x0a\xe1\xdd\x78\xd1\xc0\x83\x19\xa8\x29\xf9\x2e\x89\x15\xab\xc5\x8c\xfb\x4e\x83\xdd\x8f\x76\xa6\x9c\x98\x30\x89\x60\x71\x90\x0e\x68\x18\x7c\x55\xff\x28\x52\x9a\x08\xc3\xb4\x57\xf3\x3f\x8a\xaa\xc9\x54\x76\x14\x45\xb3\x2b\x4e\x87\x5d\x69\x76\xa7\x49\xf5\xa6\x24\x89\x64\x61\xe0\xcc\xe0\x4d\x53\x89\x6c\xff\xdc\x58\xb2\xfb\xf6\x43\x8f\x39\x98\xfc\x15\x22\xc6\xec\xfa\x6b\x06\x6f\x5d\x48\x23\x91\xd2\x18\xcb\x04\xd4\xfa\xd3\x53\x49\x8e\xd1\xe7\x51\x34\xc5\xf4\xc8\x6f\x8f\xbb\xb7\xac\x28\xb2\x62\xdf\xf1\xf2\xb6\xad\x9c\x23\x66\xd8\x00\x0c\x92\x94\x89\x4a\xa5\xf6\x1a\x6f\x35\x0c\x9c\xdf\x44\x19\x89\xfe\x8a\xd0\xba\x2b\x08\x02\x3d\xc1\x0e\x8c\xf7\xb2\x44\x53\x8e\x4e\xa4\xe3\xf5\x47\xd2\xe2\x8f\x88\x20\xdb\xee\xd2\x8a\x41\x35\x5d\x64\xda\xc2\xf7\xc6\xbd\x80\x58\xa1\x7c\x61\x81\x24\x23\x7d\x97\xfe\xfc\x48\x80\x98\xd0\x9a\xf0\xc5\x49\xe4\x9d\xbf\x9e\x4f\x3e\xb8\x49\x20\x70\x89\x19\xef\xd3\x7c\x2b\x73\xed\x6d\xac\x49\xe7\x34\xc6\x42\xdd\xcd\x66\xe1\x86\x25\x25\x8a\xc7\xee\xa4\xdb\x40\x0e\xca\xd5\xf2\x5d\x9c\xc1\xbf\x38\x21\xdc\xdd\x02\xce\xb0\x52\xbb\xfd\xe8\x0b\x63\xac\xc7\x31\x7a\xfd\x34\x10\xce\x87\x70\x2b\xc9\x26\x6a\x3f\x47\x7d\xa4\x34\x08\xf1\xc1\xdf\x2e\x24\xc9\xc6\x37\xa7\x5c\x63\x61\x69\x01\x6f\x4f\x70\x2c\x67\x13\xb1\x29\x63\x86\x5a\x49\xcb\xf7\x85\x7e\x1d\x0e\xd3\x28\x9a\x9c\xb2\x50\x73\xdd\xb9\x03\xed\x8a\xc7\x50\xfd\xed\xc7\x3f\x1f\xa6\x96\x39\xf7\x3e\x2b\x60\x0c\xc0\xfe\xc4\x72\x70\xd7\x46\x44\x62\x54\x54\x89\x62\x99\x97\xa8\x49\x04\x56\x08\xe4\x71\x54\x16\x3b\x8b\x22\x4d\x63\x92\x62\x56\xe8\xb6\xdc\x3b\xa2\xf5\xcf\xf3\x2d\x29\x97\x1a\x73\xab\x8e\xf7\xcb\xfa\x4e\xdb\xf5\xdd\x6a\xb3\x5d\xdc\x79\xf7\x21\xe5\xca\x2a\xe2\xd5\xd0\xac\x57\x0f\x9f\xd6\x02\xa4\x89\x4c\xd0\xf7\x2f\xdf\x8a\xfa\xa1\xda\x40\x9e\x4f\x34\x95\xb0\x8f\x96\x6e\x53\x5f\x1c\x8f\x30\x21\x39\x93\x24\x4d\x59\x82\xd1\x81\x1f\x65\x75\x10\xc3\x18\x48\x9a\x86\x96\x22\x40\x78\x7d\x29\x1b\xb6\x2a\x2f\xcb\x53\xdb\xce\x4a\x61\xe6\xea\x20\x5e\x90\x8a\x70\xd0\x24\x54\xec\x82\xb9\xed\x0e\xe4\x4f\xde\xf9\x51\x15\x3a\x41\xde\xb2\xd3\xf1\x08\x58\x28\xe3\x2d\xdd\x54\x18\xf0\xb5\xd0\x17\xa0\x75\xd7\x45\x06\x22\x72\x19\xda\x19\xed\xcd\xb6\x83\x62\xae\x98\xf4\xbc\x6b\xca\x5d\x1f\x58\x4e\x15\x31\x8c\x74\x89\x84\x9f\x00\x2f\xf9\xa8\xe6\xa4\x7b\x40\x45\x59\x64\x39\x54\xaa\xbd\x38\x0c\x00\x01\xa9\x96\x2c\xa5\x3d\x61\xef\xb5\x05\x1d\xf6\x91\x84\x54\x1b\x16\x8b\x4e\xde\xca\x86\x1e\x7d\x6c\xa8\xeb\x64\x02\x8a\x6c\xd1\xbb\xfa\x7c\x90\x65\xde\xff\x39\x4e\x3a\x8e\xb5\x07\x83\xbe\xf4\xd5\xf9\xa9\x75\xb2\x7f\x31\xed\x4c\x28\x30\x34\xe0\xc4\x7c\x11\x0e\xe0\x73\x29\xa3\xe9\x24\x48\x6c\xa3\xf8\x37\xeb\xa7\xcd\x16\xa7\xe8\xd5\x62\xb3\xda\x0d\x79\x41\xbe\xf8\xae\x49\xc2\x59\xc7\x47\x7b\x5b\x8a\xe2\xf3\x7c\x81\xbb\x2c\x90\x96\x73\xc9\x7a\x20\x37\x00\xb3\x9b\xa6\x08\x54\x8c\x63\x50\xc0\x5b\xbb\x1e\x3b\x26\xdb\x91\x80\x62\xdb\x0f\x28\x92\xb4\x69\x2b\x86\xb1\xf6\xc0\x27\x41\x99\xa5\x2c\x39\x5a\x65\x09\x0f\x88\x1d\x1c\x4e\x82\x46\xa1\x70\xf4\xca\x9b\x46\xa8\x97\x67\xd4\xa8\x1c\xef\x9c\x82\xc6\xb6\x1a\x17\x15\xeb\xb3\xe3\x11\x2e\x14\xa8\x27\x2f\x18\x39\x46\xf0\xed\xbd\xff\x9d\x48\x44\x48\x4e\x66\x9d\xa7\xd5\x01\xaa\x3d\x14\xea\xdc\x7a\x68\xee\x8c\xeb\x40\xce\xfe\x0a\x95\x22\x65\x1e\x32\xd3\x2f\x0e\x32\x83\xa2\xf9\x76\x3a\xe8\xe6\xbc\x7a\x6f\xad\x94\x21\xea\x6a\x38\x35\x45\x1c\x8b\x5e\x4c\xb3\xac\x86\x0e\xb0\x88\x85\x25\x9d\x5f\x97\x5b\x4f\xe7\xf1\x49\x7e\x46\xc4\xda\x12\x2c\x9f\x0a\xcb\x8c\x3c\xf5\xde\x05\xe7\x80\xda\xd8\xfe\x94\xdc\x96\x9b\x63\x59\xd4\x97\xa4\x76\xae\x7f\x12\x26\x88\x8c\x96\xcd\x59\xcd\x0a\xa8\x62\x9f\x14\x83\xd3\x47\x71\x06\x7f\x9c\xd6\xf3\x0c\x8e\x6d\x6f\x09\x98\x39\x78\x82\x3d\x92\x21\xb9\x3f\xa7\x41\x8c\x78\xcd\x9b\xec\xfd\x11\x85\x7c\xbb\x86\xd0\x3e\xf1\x75\x86\x48\xdf\xf1\xcd\x52\x49\xcc\x80\x03\x03\xc4\x61\xa6\x80\xe7\x93\xc3\xd9\xdf\x46\x71\x13\x7a\x28\x06\x5a\xd9\x50\x9f\xf2\x89\x9d\x26\x04\xb1\x95\x12\x9e\x9a\x74\xcc\x16\xd2\x76\x90\x34\x8d\xe7\x34\x04\x7c\x3b\x30\x5b\x8d\x25\xea\xda\xd7\xc7\xb9\x26\x29\x15\x97\x3d\xe5\xda\x8e\x8e\x81\x41\x42\x11\x57\x22\x63\xd1\x66\x7d\xa5\x77\xbf\x78\x54\xa8\x12\x67\xe8\xdf\x8a\xba\xe9\x54\x34\xdb\x26\x15\x31\x6b\xeb\x61\xd0\xea\xa7\xe8\x02\x57\x42\x69\x8e\x68\x02\x84\xe5\x58\x2c\xd4\xa6\x11\x4d\xa6\xc6\xb8\x75\x3a\xcb\x07\x86\xd7\x43\x30\xc2\x5a\x3a\x87\xef\x23\xbe\x85\x4b\x93\x5f\x68\x66\xf9\x4e\xe4\x29\xcb\xf5\x32\x6b\xce\x53\xe9\xa2\x5e\xa4\xeb\x9f\xb4\xbf\x48\x60\xb5\x79\x51\x0e\xcf\x2c\x01\x81\x8e\x5d\xd8\xd1\x83\x85\xaa\x45\x73\x41\x47\xd4\xf6\xd4\xb6\x26\x5e\x68\xfd\xdb\x69\x2f\xb4\x98\xb3\x3c\x2e\xdf\xd7\xf0\x38\x91\x03\xff\xe4\xea\x54\x15\xd3\xfd\x47\x12\xaa\x62\x07\xbd\xb5\xa4\xeb\xdd\x09\x3c\x6b\x10\xc8\x20\x89\xd0\xe3\x76\xe2\x09\x37\x65\xd5\x9e\x66\xf5\x28\x79\x21\x83\x24\xb5\x85\x61\x08\xc2\xed\x42\x6e\xb3\x33\x5a\xd2\x10\x90\x6c\x67\xf5\xb4\xfc\xe2\xff\x24\x2d\x87\x4a\x03\x75\xe3\xca\x4a\x8d\xc8\xf3\x5d\xc7\x18\x2f\x89\x64\x41\x04\xa3\x88\xcf\x9d\x78\x5f\x0e\xaa\x06\xbf\xd7\xba\xeb\xaa\x52\xf4\xc5\x56\xdb\x6f\xab\xa7\xc5\xcd\xcd\xad\xc7\xf5\xc8\x88\x30\xa4\xfe\xbc\x2b\x8b\xf3\xc8\x32\x91\x11\x13\xc8\xa2\xf6\x73\xf3\xfb\x9f\xa3\x86\x98\x48\x44\x8a\xfc\xe3\x8f\xaf\xa3\xbf\x73\xce\x70\x6a\xac\x36\x9b\x3d\x14\x50\x67\xfe\xbc\x95\x49\xc4\x2d\xa1\x76\xe9\xc3\xbb\x32\xa5\xb4\x2f\x8f\x6b\x44\xee\x0a\x10\xc6\x03\x93\xc6\x04\x25\x71\x7b\x6a\xdf\xee\xf2\x54\xf1\x5e\xa8\xe9\xb1\x6c\x44\x53\xfe\x6f\xd8\x2f\x29\x62\x8a\x69\xea\x4d\x29\x8e\x57\xa5\x47\xe7\x49\xc9\x38\xee\x6d\x7f\x3c\x2e\x90\x8e\x76\xfa\x4c\x2a\xd4\xb1\x65\xf8\xb4\xeb\xd3\xea\x2e\xff\x02\xdf\x2d\x95\x8a\xd1\xd1\x9c\x83\xc6\x8e\x1f\x4b\xe9\xc4\x38\xd9\xf6\x0e\xc1\x6e\xa3\xfa\xae\x83\x8e\x92\x24\x19\x78\x1a\xd5\x48\xbc\xb7\xed\x20\x94\x8a\xbd\xef\x94\xcd\x57\xe3\x49\x90\x36\x99\x01\x85\x5e\x2f\x1f\x8e\x3e\x5d\x25\x41\x13\x69\x27\x6e\x6e\xc6\x95\x65\x12\x74\x80\xf1\xdb\xcd\xdd\x66\x60\x92\x49\x43\x52\x97\xcd\x6c\x36\xa5\x69\x96\xe2\x88\xb1\xf8\xee\x71\x0c\x04\x98\xa3\xb7\xd9\x0a\x07\x77\x9c\xc1\xd8\x29\x12\x59\xb0\x87\x4b\xba\x3b\xac\xe7\xff\x86\x3e\x54\x01\xb3\x94\x87\x42\xeb\x6b\x8b\x05\x99\x2e\x78\x15\x08\xed\x29\xa9\x47\x61\xa2\x0b\x86\x70\x49\x14\x25\x10\x8a\x5e\x43\xa3\xd3\x0c\x19\xdf\x91\x8a\x20\x1e\x60\xae\xaf\x33\x63\x32\x75\xca\x9b\x73\x9f\x93\x50\x14\x24\x06\x86\xef\x45\xf3\x2c\xf2\x0c\xfe\xa2\x03\xa5\xa8\xb1\x94\x92\xb8\x09\x38\x1a\xc3\x71\xdc\x43\xb1\x48\x21\x17\xa7\x38\x35\xe5\x55\x56\x35\xcf\x7d\xcc\x5e\xb1\x54\x7a\xc1\x2d\x4b\xbf\xb9\x2e\x66\xf8\x42\x24\x51\x21\x8d\xb1\xfe\xd1\x66\xad\x6d\x4e\x8a\xfa\x23\x4f\x85\x92\xa1\x36\x42\xbb\x3f\xae\x54\xe9\xff\x1c\x05\x2c\xc4\xfa\x54\xbb\x09\xf6\x5a\x1e\x6d\x1b\xb7\x02\x2a\xc7\x76\x5f\x67\x7d\xbd\xd9\xba\xe8\x0b\x91\x54\xac\x39\xf2\x5c\x21\xb8\xf9\xae\x2c\xea\xa6\x75\x9d\x9b\x53\x55\x0c\xad\x56\xef\xbb\x2a\xce\xa4\xe7\xde\x5f\x17\xaf\x59\x53\x4e\xbf\x04\x0f\x43\x74\x31\x6a\x71\xae\xcb\x03\x34\xcf\x3d\xa8\x57\x71\xc3\xb1\xdc\x1e\x35\xa9\x4f\x4d\x79\x68\x4f\x4e\x47\xb5\x3e\x18\xb1\x84\xa4\xdc\x45\xae\x27\x96\xf3\x70\xb8\x12\x4d\x11\xf6\x6f\xad\xec\x3b\x18\x14\xf7\x8e\xbf\xa9\xef\x6f\x52\xec\x2f\xb4\x1e\x19\x0b\x2a\xf5\x5c\x90\xd0\x2c\xd4\x90\x6c\x62\x32\x13\x53\x63\x35\x5b\xae\x4e\x4d\x53\x16\xcb\x3c\x1b\x16\x0b\xb9\x3e\x82\x02\xa6\x3b\x7e\xac\xfc\x41\xa2\x04\x04\x88\x7c\xfa\x79\x7d\xef\x83\x23\x4a\x32\x9a\xa6\xde\x82\x5a\x9b\x87\xe2\x7b\xa1\xe6\x09\x37\xda\xce\xad\xa5\x84\xae\xcd\xf1\x8b\x35\x2e\x7c\x83\x4a\xa4\x63\x2f\xc8\x3b\x40\x89\x73\xb9\x2e\x8a\x6c\xa7\x40\xb3\xcf\x2a\x2e\xec\x7f\xc6\xa6\xe1\xac\x23\xab\x24\x50\xf4\x06\x77\xf0\xde\x40\xa1\xaf\x84\xde\xc3\xa7\x02\x2c\x92\x28\x45\x22\x6f\xf7\xb5\x9e\xf2\xc3\xb1\x79\x38\x7d\x10\xf8\x50\x8a\xa5\xe8\xeb\xda\x60\xd5\x0a\x59\xd1\xe7\x94\x47\x3f\x3c\x64\x94\x52\x52\xb1\xe1\xf2\x73\xf2\x27\x83\x99\xa4\x94\x42\x8f\x02\x0b\x47\x9d\x2d\xeb\x9a\x7c\x61\xf8\xfa\xb7\xee\x7b\x02\x44\x28\x11\xb0\x7d\xcb\x14\x2c\x5a\x1f\x7a\x98\x5f\xfe\x64\x1f\x31\x44\xab\x9e\xb4\x1e\x97\x23\x6a\x09\x7d\x7e\x70\x29\xc3\x22\x9f\xf4\xbe\x87\xb7\x1b\x27\x5a\xe3\x6b\xf6\x6d\x27\x4d\x12\xcd\xdc\x26\xb3\x7d\x5f\x8e\x98\xeb\x47\x77\xd3\x01\x0d\xb9\x97\xa2\xbb\x5b\x6c\xfc\xf5\x01\x4b\xc0\xd6\x21\x9d\x8a\xe6\xbc\x73\x1e\x65\xdf\x6a\x09\x53\xbc\xc2\xfa\x6a\x2a\x8b\xdf\xf6\x11\x34\x56\x7d\x3d\x5b\x6b\xe8\xa3\x13\xee\x9a\x69\x1c\x72\x57\xbf\xdb\x55\x12\xff\xff\x94\x7d\x59\x73\xe2\x48\xb6\xff\xd7\xe9\x87\x79\x50\x2e\xda\x1e\x01\xe3\x2a\xa6\x6d\xe3\xbf\xc1\x55\xdd\x33\x71\x83\xc8\xe5\x24\xd6\xb5\x90\x18\x49\x54\x95\xe7\xd3\xff\x43\x27\x17\x2d\xc6\xee\xbe\x0f\xbd\x84\x95\x08\x21\xa5\x32\xcf\xf2\x5b\xe6\xd3\xe4\x5a\xb5\x56\x53\x99\x23\x26\xfe\x50\xb4\xfb\x5f\x28\x4a\xdf\x27\x63\x8b\xe6\xd8\x5e\xa7\x31\x6a\x26\x18\x4e\xaf\xc5\xcd\xcd\x66\xbf\xd9\x3e\x2c\xee\xac\x5c\xf3\xe1\xe1\xf9\xde\x5f\x0d\x03\xc3\xac\x89\xf3\xf6\x8c\x06\x42\xd3\xd7\x58\x73\x63\xfc\x14\xbd\x17\x1a\xf6\x7f\xcc\x7e\x6c\xcc\x65\xd0\x3d\xb3\x22\x26\xef\x74\x43\x74\x9c\x68\x1b\xf1\x95\x70\x7e\x11\x55\xf7\x97\xe9\xa8\x4e\xfa\x3d\x0a\x25\xa1\x7e\x7e\xda\x0e\x98\xbc\x82\x3a\x89\x35\x32\x1c\xb0\xde\xfe\x71\x41\x57\x27\x09\xcd\xad\x38\xfb\xb1\x11\x1d\xc8\x37\x94\x9e\x99\xfd\xf0\x34\xe7\x79\x08\xad\xb7\xcd\x93\xeb\x7b\x05\x55\x61\xbf\xe3\xe9\xd4\x68\x64\x73\x3f\xc0\xcf\x0f\x18\x4c\x6e\x60\x46\x0c\xd6\xae\x51\x1b\xc3\x6b\xc2\xdf\x7e\x50\x18\xd7\x99\xc8\x10\x90\xb4\x6d\x4f\x45\x10\x5b\xd1\x99\x8c\x89\xeb\x1b\xf5\x81\x98\x8d\xb6\x36\x3a\x5c\x4c\x9e\x5b\x8c\x9f\x2c\xba\x2f\x98\x15\x4d\xc1\xa7\x3a\x37\x80\x21\xf6\x45\x9b\x6f\xcf\x8f\x23\x9d\x04\x3f\x40\x2a\x48\x49\x00\x03\x82\x38\x15\x5d\x40\xb0\x5e\x8d\xde\xb4\x22\xb6\x78\x73\x23\x26\xb0\x42\xad\x12\x86\x05\x42\x14\xfb\xf9\x5e\x54\x08\xdd\xc2\x52\xe0\xf2\xed\x09\x8e\x4e\x3f\xe2\x33\xb1\x8e\xc9\xdd\x53\xd2\x7a\x23\x9f\xc5\x5b\xff\x60\x1f\xef\x16\xfb\xd9\x63\xd5\x24\xc6\x69\x76\x16\x45\xd5\x1d\xce\xc5\x2f\x28\x67\x22\x17\xb3\x07\xa2\x69\x16\x67\x1e\xd4\xb8\xbc\xbc\x39\x31\x9e\x0f\xa3\xbc\xc9\x14\xd5\x3c\xcd\x84\x8f\x6c\x2f\x55\x17\x40\x63\x7d\xb6\x19\xff\x8f\x1f\x25\x34\xb6\x81\x90\x1e\xe1\xb7\xf0\xeb\xeb\x11\x44\xca\xc3\xa0\x7c\x2d\x04\xeb\xe0\xa3\x8e\x9d\x06\xa2\x10\xfd\x71\xbe\xc8\xb2\x68\x5f\x5c\x40\x32\xf2\x6e\xf2\xd1\x89\x06\x6d\x81\xb3\x06\xd4\xcb\xa2\x2c\x57\xa2\xd2\xa8\x01\x19\x66\x8a\x89\x0d\x42\xd7\x0e\xaa\x3e\x9d\xb1\xf5\x56\x1d\xff\xa2\x9c\xa7\x4d\x0e\x31\x0b\x32\x5b\x61\xd6\x41\xc4\x38\xaa\xda\x3c\x3f\xdc\x2d\xc3\xdf\x72\x81\x42\xc6\x98\x35\xe2\x7e\xb2\x7b\xa9\x2f\xa5\xde\xbf\x34\xf5\xcf\x30\x08\x0c\x86\x41\x3f\x43\x55\x09\x5f\x8b\x4f\x3a\x7f\xd3\x2b\x02\x42\x53\x12\xbb\x2a\xf4\xc4\x0d\xf0\xef\x75\x53\x80\x24\x4a\x41\x68\x40\xe8\xba\x53\x2f\x5d\x8d\x9e\x6a\xd7\x5f\x62\x20\x42\x88\x38\x68\xb5\x79\xf9\x26\xbc\xec\x65\x7d\x39\xbe\x7c\xb0\x7d\x03\x31\x31\xde\x3a\x6c\xaf\x78\x29\xe0\xe9\xcb\x09\x94\x33\xac\x41\xac\x04\x34\x97\xf6\x43\x27\x4a\x19\x01\x4b\x4d\x6a\xad\xb0\xb0\x68\x38\x5f\xbc\x80\xe7\x14\xeb\xa1\xcb\xd5\xc6\x47\x5a\x10\xf3\x14\x2c\x0c\x19\x13\xb5\xe6\x0e\x7e\x40\x49\x1f\x27\xfb\x1b\xc4\xa9\x65\x0e\xbb\x26\x64\x07\x47\x17\x65\x90\xd8\x8f\x10\x22\xcb\x3d\x4f\xd7\xb2\xf0\xad\x97\xc3\x4d\x28\x4a\x41\x12\xa7\x22\xf5\x96\xb2\xf7\x45\xd5\xa1\x72\x72\x34\x7d\x5f\x21\x49\x52\x61\xd7\x2a\x1d\xda\xf4\xb3\x21\x69\x9c\x22\x24\xe1\x8b\x38\xc1\x1f\x96\xee\xe3\xbf\x23\xe3\x56\x8e\x46\x5c\x54\x77\x69\xbf\xfb\xdb\x3a\x4d\x47\x20\x53\x12\x8d\x8d\xac\x18\x66\x58\xc8\x30\xb8\xbd\xad\x9b\xf5\x0f\x68\xde\x64\xad\xc3\x95\xe7\x82\x80\xdb\xce\xbe\xd6\xba\x84\x66\xee\xe4\x2f\x23\x10\xc4\xaa\xaa\x5b\x2c\xdc\xde\x47\x0e\x20\x32\x9d\x19\xdf\xa3\xd7\x00\xa7\xd0\xcc\x6c\x11\x21\xd4\x5c\xd3\x88\x93\x11\xc8\x98\x60\xa4\xac\xca\xba\x05\x2b\x90\x52\x8e\x2a\xd7\x20\x25\x4d\xc6\x34\xeb\x2f\x85\x09\xcf\x4b\x82\xb1\xa4\xc2\xd0\x42\xf7\x9c\x08\x2b\xa9\x7a\xd5\x5b\x77\x5e\x48\x03\x45\x25\xca\x55\xe0\xbb\x9a\x1d\x04\xde\x1e\xbf\xe3\x15\x75\x75\x78\xc6\x53\xaa\xba\x81\x85\xd6\x56\xe1\xf0\xd0\xbe\x7f\x9d\x95\xb2\x88\xf6\x50\x05\x42\x89\xb6\x85\xe9\xfa\x0f\xbf\xd4\xf5\x6c\x23\x06\xa5\x04\xde\xb1\xbb\xba\x7e\x5d\x60\xf1\xb1\xbf\xdd\x8f\xd0\xfc\xab\xae\xe6\x77\x5d\x73\x96\x7b\xcb\x0e\xf1\xcb\x56\x3a\xfc\xf7\xea\x24\xc6\x88\x0b\x7b\xf7\x9f\x8b\xc1\x80\xce\xd3\x94\x0f\xf0\x4e\xf1\x0a\xf5\xa5\xbb\x86\xf0\x04\x48\x2c\xf2\xe3\x20\xb4\x76\xa6\x4a\x7b\x68\x4e\xed\xfb\x2f\x18\xe5\xea\x57\x12\x77\x00\x30\xa8\xfc\xf8\xe7\xe2\xe1\xf7\xf5\x7a\x37\xff\x1a\x23\xa4\x93\x83\x5d\x34\xb2\xe8\x26\x1d\x37\x3b\xc6\x44\x29\x38\xee\xa9\xc3\x1c\x0c\x35\x5a\x13\xa9\x1c\xbb\x4c\x2f\x50\x96\xf5\xf4\xa6\x19\x42\x28\xf3\x60\x4a\x6b\xca\xbc\xaa\x4f\xa7\x4b\xe5\xcc\x3f\xb1\xdb\x7f\x75\x85\x31\x94\xe5\x90\x7b\x1c\xea\xea\x05\xfe\x13\x80\x6c\x86\x32\x8d\x34\xa9\x5d\xb0\x67\x5a\x79\xf9\x35\x32\xdd\x24\x0d\x95\x29\x75\x9b\xe4\xe1\xc7\x7b\x64\x96\x61\x14\x62\xeb\xe9\xe9\x72\x36\xa1\xba\xda\x89\x92\x8d\xe4\x96\x65\x64\x38\xd5\x56\x60\xb5\x7d\xbc\x34\x1f\xe4\x87\x86\xa7\xc4\x22\x7f\xfa\x08\xb0\xdf\x45\xde\xf9\xaa\x4e\x6f\x6b\x2c\x20\xa5\x23\x47\x3f\x8c\xe6\xb7\xd5\xd4\xd5\xc2\x8d\x4d\xf2\x98\x5a\x1d\x94\x6a\x92\xa5\x5d\xbf\x92\x94\x26\x48\x38\x3e\x5d\xca\xae\xd8\x15\xc7\x1b\xf8\x31\x05\x77\x9b\x54\xa7\x1e\xe7\x6a\x37\x8e\xf7\xe0\x7c\x93\xc5\x02\x2b\x75\xa2\x68\xd6\x95\xee\x86\x8e\x81\xc9\xb9\x24\xc1\x27\xff\xb6\x68\x5f\x16\xff\xb9\x88\xa6\x0f\x14\x87\xb7\x7c\x7a\xae\x5c\x0a\x9c\xf7\x8e\x95\xb4\xb6\xd5\x76\xcf\xf9\xf4\x83\x8c\xe5\xcb\x0a\x5b\xdb\x59\xf5\xef\x13\x68\xbb\x94\xf8\x31\x82\xe7\x48\x94\x90\x97\x37\xf7\x56\xf4\x0b\x69\x90\x7a\x31\x22\x8e\x90\x9c\x74\x73\x33\x0e\x07\x8d\x64\x11\x6a\xe2\xf9\x52\xa1\x47\xfc\x7d\x1a\x14\x19\x45\xb5\x95\x5f\xed\xd3\x43\xaf\x64\xa4\xaf\x3e\x20\x95\x4b\x2c\xdf\x94\x45\x59\x8c\x69\x9b\x46\x47\x2c\xb6\x95\x5b\x03\xdf\xaf\x18\xfb\xf6\x43\x72\x3b\xc4\xbf\x5f\x83\x41\x56\x51\x57\x37\x72\xf6\x4d\x86\x53\x7c\x2c\xcb\xc5\xad\xcb\x85\x49\x14\xf5\xef\x05\x2e\x16\x8e\x43\xed\xff\x2e\x34\x22\xa0\x8a\x4a\x35\x70\xc2\xf7\xc5\xaf\x5b\x24\xa2\xd2\x48\x18\xa2\xf9\x71\x07\x8f\x44\xd4\x21\x7a\xa1\xff\x84\x87\xe8\x8e\x0a\xfb\x24\x62\x52\xc6\x59\xc0\x35\x16\x27\x51\xda\xe2\xfe\x5c\x0f\xb7\x1f\xaa\xec\x9b\x81\x2b\xe4\xaa\x36\xfd\x26\x51\x8c\x25\xd9\xfb\x31\x60\x62\xa7\xa9\x67\xce\x57\xdf\x30\x12\xf1\x34\xf5\x44\x88\x45\xd5\xb5\xbb\xa2\x52\xd0\xaf\xdb\xae\x74\x35\xb9\x51\x24\xe2\xca\x8a\x4a\x82\x68\xca\x37\xdf\x78\x18\x83\x6d\x49\x14\x47\x1a\xe3\xa9\x0a\x7e\x86\xbe\xe8\xfc\xd5\x1a\xd7\x5d\xfc\xc7\x08\x4d\xbc\xad\xca\xf8\xde\x5c\x2b\xca\x4e\x7e\x40\x9c\x42\xae\x9c\x5c\x32\x9d\x5d\x6e\x2c\x01\x4b\x2c\xcb\xba\xae\xc6\xea\x38\x24\x8a\x95\x35\x36\x2a\xd0\x3d\xac\xd0\x9e\x0f\xde\xc7\x36\x1e\x9b\x4b\xa2\x84\x59\x0d\x72\x64\x70\x2f\xeb\x3e\x7e\xb0\x74\xe8\xe9\xd7\x24\x60\xb0\x08\xbd\xbf\x74\x75\x03\x3e\xb7\x23\x51\x2a\x85\x70\x9e\x61\xc5\xe9\x52\x2d\xf7\x2b\xdf\xad\x09\x23\x20\xc3\xd7\x53\x3a\x1e\xab\x47\x76\xff\x9b\xff\x4f\x18\x21\x88\x2b\x18\x3a\xbe\xda\xe2\xff\xdd\xcd\xe6\x42\xc6\x15\x8c\x5a\x82\x0f\x75\xd3\x82\x29\x9c\xd7\x40\x7f\x3c\x8e\x6c\xb3\x65\xf3\xf0\xe0\x9c\x24\x25\x89\xf2\x28\xc3\x8e\xe9\x62\xb5\x3d\x4c\xee\x4d\x4e\x00\xc5\x4a\xd7\xff\x0d\x7f\xc9\x19\x36\x93\xe5\xe5\xad\x9d\x4e\xb1\x5c\x06\x31\xe1\xe7\xb3\x85\xdf\x5c\x7c\xb3\x9f\xb8\x0d\x95\xf8\xe9\x9d\x43\x86\xf9\xb2\xc5\x23\x7c\x5b\x3c\x6d\x16\x4b\xdf\x2c\x22\x91\x4a\x63\xbf\x7e\xae\x4e\x7a\xf8\xab\xdd\x26\x6c\x65\xc9\x46\x2a\x21\xae\xcc\xfc\x20\x43\x11\x83\x7a\x69\xa1\xb1\xf6\xdc\x93\x8a\x84\x1b\xa5\x63\x86\x8d\xa2\x7b\x68\x8e\xe0\x28\x63\xe1\x90\x88\xe9\x20\xf6\xde\x6f\xa7\xa5\x0f\xa4\x67\x27\x49\xa2\xc4\x9a\x8e\xe2\x3a\x7b\xdd\x23\xf7\x5d\x88\xf6\x8f\x8f\xc4\x24\xfb\x13\x4a\x4e\x82\xf1\xe0\x65\x8c\x95\x70\x23\x80\x93\x94\x86\x94\xe6\x2a\xec\x86\x44\x20\x24\x26\x03\x8b\x9b\x9b\xed\xd0\x40\x21\x11\xa8\x0c\x01\x10\x77\xf5\xf1\xb1\x81\xb3\x68\x60\x75\x45\xfb\xf3\xd3\xa4\x8a\xf4\xb1\x1a\x9a\x23\xda\x89\x7c\x9a\xce\x61\x93\xc5\xd9\x60\xb3\xf0\x9e\x8e\x7d\xed\x72\x49\xc4\x28\x32\x58\xce\x75\x5d\xae\xbb\x97\xa0\x86\x47\x08\x89\x14\xcd\xa7\x66\x16\xcf\x4d\x31\x0e\x20\xfe\x31\x0f\x26\x08\x21\x34\x46\x7c\x3a\xe6\x30\xde\x90\xde\xbd\x2f\xfe\xc4\x94\x71\x1f\x6f\x1e\x4e\x6f\x07\x5d\x15\xfe\x08\x8b\x13\x44\x8a\xfe\xa8\x3b\x68\x37\xc3\x72\x4e\x98\xb6\x75\xf5\x77\x84\x7c\x77\x9c\x47\x19\x66\xef\xa6\x01\x20\x5b\x33\x9d\x2a\x84\x73\x95\x0b\xd7\xcc\x73\x4a\x51\x4a\xbc\x27\x9a\x12\xc2\x65\x8e\xd1\x6e\x09\xa6\xcb\xf3\xd9\x59\xe2\x24\x52\xf1\x04\x51\x17\x52\xa3\x19\xa6\x83\x90\x58\x53\x6c\xfc\x87\x2d\x59\xfc\xfa\x24\xeb\x24\x24\xe5\x96\x71\x7a\x57\x1f\x03\xbe\xd3\xf2\x38\x3e\xfa\x80\xb0\x1a\xe3\xaf\x45\x75\x5c\x8a\xea\xd5\xdf\xa8\x2c\x4a\xac\x03\x02\xce\xef\x3b\xa8\x8e\xdd\x84\x74\x48\x48\x96\x00\xb6\xce\x34\xa8\x00\x86\xf8\x5b\x5d\x37\x42\xb2\x94\x21\x3e\x75\xb9\xdd\xfd\x11\xbe\x30\xcb\x10\x69\x8c\x72\x96\x7d\xc6\xb2\x0d\xd0\xfe\xef\x2f\x50\x3d\xd4\x16\xc1\x50\x87\x47\x99\xe5\x1c\xf7\x39\xa1\xf5\xd2\x9b\x3b\x4d\x9f\x42\xce\x13\x9e\x0d\x2e\x0e\xdf\xa1\xc0\x3e\x62\x1f\x60\xd4\x97\xee\xf7\x3f\x57\xb3\x07\x93\x73\xa9\x1c\xce\xef\x4b\x59\x4b\x51\x3a\xa7\xbe\x79\xd7\x95\x90\x3c\x17\x59\xea\x40\x17\xdd\x3d\xcc\x9c\xec\x24\x21\x82\xe4\x60\x93\x5a\xa7\x11\x3f\x7d\x59\x04\x91\x59\x3e\xf4\x5c\x3f\xe2\xe1\xf9\xd1\x54\xe4\x4e\x0a\x71\x7d\xf3\x3c\x6d\x42\x5e\xbf\xc1\x82\x5b\xed\xdd\x85\x69\x6e\x25\x36\x5c\x8a\x6a\xbc\x23\x10\xc9\x23\xe1\xd7\xa8\x4a\xd0\xd9\x8d\x50\xdc\xe8\x6c\xa2\xba\xbb\x12\x65\x89\x8f\x79\xbe\xbc\x8c\x76\x7c\xa2\x54\x94\xdb\x52\x51\xf5\xd8\x04\x0a\x26\x21\x0a\xa8\x76\x4d\xd6\xcf\xea\x94\x84\xe8\x4c\x3a\x1a\xf6\x0f\x10\x25\xea\xa6\x7c\xfe\x3b\xb5\x8e\xf0\xce\xf4\x31\x86\x37\x95\xf3\xdf\x0a\x91\x50\x56\x89\xbc\x0f\x66\x06\x05\x5b\x7f\x98\x65\xb6\x48\x72\x29\x7d\x7f\x62\x5f\xcf\x68\xaf\xfd\x28\x89\xbc\x14\x07\x15\xfb\x31\xc6\xbd\x61\x1a\x39\x09\x60\xdc\x3a\xf6\x41\x09\x7c\x38\xa9\x62\x28\xc8\x72\xbf\x7e\xd8\x2d\xa6\xc2\xa0\x84\x46\xd4\x26\xbf\x85\xaa\xf9\xbd\x57\x01\x22\x34\x52\x24\xf1\x9d\xe5\xcf\x29\xb4\x84\x46\x10\x2a\x24\x96\x49\x23\xca\xc1\x95\xad\x98\xf1\x99\x08\x25\x71\x6c\x8b\x3c\x28\x1e\xd9\xaf\x8b\x74\x3e\x42\x10\x7c\xb0\xc1\x40\xe6\xd3\x2a\x3f\xa1\x54\x44\x78\x01\xff\x8b\x73\x1b\xb3\xd9\xee\x6d\x76\x4e\xc6\x78\x4c\xfc\x06\xdd\x9c\xae\x69\x68\x11\xca\x52\x40\x0e\x68\xa0\x5c\x3b\xb5\xdc\xab\xc9\x22\xa1\xcc\x58\x00\xcf\x5d\x7d\xbc\x3a\xc1\x68\x92\x32\x49\xfd\xf2\x4f\xa2\xfb\xb6\x83\x73\xe0\x09\xf6\x87\xe3\x34\x64\xd4\x83\x3b\x75\x68\xcb\x13\x9a\xe8\x08\x06\x35\xfe\x45\xa5\x77\x50\x96\x8b\xb2\xbc\x6e\xc0\xfc\xae\xc2\x79\xfd\x79\x25\x5a\xa1\x5a\x8a\xb4\xec\x3c\x8f\x67\x9a\xea\x7a\x10\x9a\x52\x8a\xad\xdf\xcd\x6a\x3b\xf2\xf4\xec\x0f\x30\x8a\xb5\xdd\x93\xe8\x13\x23\xbf\x6a\xb6\xeb\xaa\x9f\xef\x7a\x18\x65\x7d\x26\x30\x1f\xdd\xb9\x8e\x38\xfc\x8d\xe2\x13\xa1\x69\xec\xd4\x70\xb5\x7e\xef\xac\xd6\x1f\x4f\x04\x77\x30\x5b\x2b\x99\xa6\xde\xc6\x2a\xb3\x93\x97\xd8\x6d\xf0\x34\x63\xd6\x3d\xe8\x84\x9a\x2f\xed\x6c\x76\x64\x99\x42\xed\x54\x37\xaf\xf6\x7e\x19\xbd\x04\x07\xdf\x7e\x90\xb2\xfc\x19\x8b\x78\xed\x23\x8e\xbf\xb5\xfd\xd0\x9c\xe7\xa9\xe5\xdd\xbc\xf8\x05\x91\x8a\x8c\x0e\xc6\x43\xfd\x0b\xb3\xae\xf4\x80\xff\x23\x54\xa6\x04\xb9\x2b\x07\xa1\xf5\x07\xb3\x4f\x2b\x81\x7a\xc2\x7d\x30\x2a\xab\x62\xfe\x93\x34\xc4\xb1\x15\xf7\xfa\xe1\xcc\x9e\x2c\xa9\x79\x09\xa6\x6e\x3e\xd8\x9e\xa9\x36\x26\xb1\xb1\x42\x29\x7e\x39\x0a\xe1\x95\x1f\xea\x46\x03\xe1\x3c\x1f\xb0\x80\xeb\x56\x85\xca\x1f\xa1\xc0\x00\xe3\xdc\x1f\x75\xd9\x7d\x44\x9a\x9b\x9f\x8f\x07\xbe\xcb\xc4\x46\x78\xfa\xb6\x43\x6c\x3b\x04\xdb\x73\x6b\x75\x92\xc3\x94\x83\x5c\x59\xf1\xaa\x3f\x77\x93\x84\x84\x82\xce\x71\x81\xb8\x5d\x6d\x37\x0f\x84\x50\xfa\x49\xbf\x71\x76\x4d\x26\x07\x44\xcd\x9a\xa2\x12\x65\xf1\x5f\xd8\x79\xc0\x38\xa1\x06\x32\xa7\x52\xaa\xef\xeb\xeb\x4e\x41\xe1\x3c\x8c\xa4\x11\xc6\x1b\xb6\x64\x7d\x70\x5b\xdd\xa3\x78\x7b\x8f\xa4\x27\x8c\x12\xd0\xce\x53\x79\x7b\xe9\x5c\x1e\x11\x8a\x32\x84\xb1\xc8\x8a\x16\x60\x23\xcd\x79\x7c\x5c\x5b\xd0\x18\x33\x36\x63\x39\xb4\x2f\x17\x63\xca\xff\x8b\xa4\x0b\x61\x9c\x30\x74\x0f\x10\x36\xee\x04\x8f\xa1\xde\x83\x38\x2d\x2a\xfd\xd8\xd4\xff\x0b\xaa\xbb\x8e\x08\x21\x8c\x33\x80\x7c\xf0\x85\x6e\x97\x6f\xcf\x2d\x34\x9b\xa9\x32\x01\x61\x9c\x53\xdb\x5d\x2c\x45\x1b\xe0\x39\x84\xf1\x14\xd0\x9c\xfb\x54\x54\x5d\x7b\x91\xfe\xcf\x71\xc2\x33\xd7\x8c\x58\x57\x7a\x60\x1a\x12\x16\x4b\xeb\x5b\x55\xc1\x2f\x14\x50\xf4\x62\xe2\x84\x25\x89\xb6\x45\x8c\x2b\x52\x4f\x57\xf7\x13\x96\xa6\x11\x52\xf1\x74\x1f\x69\x9d\x8a\x6a\xbf\xb9\xb9\xfe\x06\xb0\x34\xb7\xa4\xbd\x2f\x37\x2b\xeb\xd3\xc3\xfc\xb7\x66\x3a\xb6\xf9\x89\x8b\xdd\x47\xd2\x1e\xfd\xc1\x8c\x79\xe9\x78\x17\xa1\xac\x45\x53\x61\xbf\xcd\x0d\xc9\xfb\x55\x70\x14\x89\x77\xf5\xec\xc6\xe5\x71\x12\xc9\x60\xf5\x83\xf8\xca\x7e\x65\x73\xeb\xc8\x88\x67\x4c\x58\x2e\x0c\x49\xfd\x74\x19\x1a\x2b\xfe\xa8\x49\xb1\x78\xfb\xf0\xb4\x3c\xf4\xbb\xa7\xef\xfc\x12\x26\x28\x60\xda\xaf\x5e\x44\x73\x84\xed\xcf\xa9\x1a\x05\x61\x92\x1b\xd4\xa7\xfb\x59\x9c\xc3\x77\xc9\xc4\x12\xe3\x0f\x1a\xfa\x4d\xab\x85\x77\xd6\xd5\x57\x57\x33\x26\xb5\x41\xe1\xcf\xa2\x5d\x74\xf7\x75\xfb\xfe\x51\x4d\xe6\xb5\x4a\x23\xac\x27\x58\xc2\xf4\xef\x45\x75\xdc\xc3\x7b\x82\xd0\x55\xc2\x3c\x61\x2a\x33\xa8\xc5\xbc\xdc\xdc\xdd\x6d\xb6\x0f\x87\xfd\xf6\xf7\xf5\x83\xdf\xdd\x98\x8e\x49\x16\x79\xf8\x91\x0b\x45\xed\x6f\xf8\x34\x1a\x65\x60\x18\x22\xe1\xbe\xc1\x48\xab\x91\x30\xa3\x29\xc6\x98\xbe\xb8\x79\xdd\xda\x80\xf0\x88\xd8\xce\x73\x09\x3f\xa0\xdc\x56\x30\xd2\x8d\x20\x3c\xe2\x24\x77\x7c\x31\x07\xe8\xbd\x82\x3c\x1c\x5d\x0c\x8f\x12\x81\x9c\x28\x79\x79\x7b\x10\x6a\xba\x7d\xf2\x48\x02\x06\x15\x7d\xea\x73\x2b\x8a\x72\x79\x79\xc3\x86\x0c\x32\xa0\xfc\x57\x92\x4c\x19\x87\xc4\xff\x5a\x5f\x86\xbf\xd3\x88\x68\xcb\x92\x41\x8d\xda\xdb\xba\x59\x34\x1d\x66\x7d\xc7\x3e\xe4\x13\x57\x15\x61\x27\xd3\x86\xd3\x3c\x43\x3c\x22\xf6\x96\xea\x0a\x6e\x45\xd9\xc2\x02\xa5\xfb\x1f\x6a\xd7\x94\xf0\x5f\xc7\xa8\x52\xd6\xfa\xba\xfe\x89\xb2\x3a\x07\xb7\x80\x3a\xa1\xed\x2b\x6d\x1a\xc2\x59\x0a\x68\x8b\xed\x44\x18\xbd\xb1\x58\x7f\x44\xa5\xd1\x60\x41\xbc\x14\xcd\xaa\xd6\xd6\xb3\x68\x7e\xc9\x57\x66\x1d\x67\x2a\x27\x0e\xf9\x82\x96\x16\x8e\x5e\x7b\x75\x69\xe0\x4c\x27\xc6\xa1\xbb\x9f\x2e\xd5\x20\x5b\x4d\x38\x17\x5c\xdb\x29\x31\xc4\xc8\x43\x77\xaf\x3f\xae\xad\x93\x89\xad\x83\x1f\x6a\x33\xfb\x7d\x31\x4b\x71\xad\x3b\x8d\x10\xd5\x21\x51\xe5\xb1\xb0\x5a\x2f\x45\xbb\xa9\x3c\x08\x8a\xf0\x58\x45\x56\x78\xb7\x9f\xd6\xf6\xca\xfd\xa1\x44\x8a\x6c\x10\xec\xf8\x7f\x17\x50\x1f\xe0\x72\xfb\xa1\x1a\x5d\xf2\xad\x94\xde\x4d\x71\x2c\x3a\x11\xe0\x75\x93\x7c\x9d\xa7\x09\x95\x0e\xc7\xea\xcc\x94\xc7\xd8\x92\xe9\x69\x53\xe7\xdd\xb2\xdc\xec\xaf\x33\x43\x08\xcf\x18\x61\xe0\x90\x3c\x15\xa0\x54\xa1\xdd\x8f\x42\x0b\xe0\xb7\x30\x12\xf0\x1a\x0f\xfb\xc5\x13\x6a\xce\x3f\x6e\x57\x5f\x0f\x8f\xeb\xa7\xc3\xe3\xfa\x66\xb3\xbd\xf1\xe3\xf2\x88\x23\x75\x68\xb9\x5f\x79\x45\x2c\xc2\xf3\xd8\x16\x6c\x5a\xe8\x6c\x29\x68\xe6\x90\xd5\x0f\xc9\xc0\xa9\xa6\xf6\x33\x76\xfa\xa3\x73\x50\xb8\xb4\xf4\x99\xc8\xa3\xef\x6e\xba\x10\x94\x0b\xce\x11\xd9\x7b\xb8\x54\xbe\xab\x60\xdf\x9d\xd9\x4f\x55\x26\x86\xc1\x99\xe7\x03\x5b\x55\x37\x56\xa7\x56\x51\x66\x59\x74\x6d\xdd\x47\x28\x61\x47\xe4\x1a\x24\xb8\x72\xe8\xba\x7b\x79\x7c\x29\x06\x05\x76\xc2\x21\x95\x08\x7f\x3d\x20\xca\x0b\x1b\x8c\xb7\x75\x13\x94\xcc\xde\xe9\x14\x4d\xbf\x15\x14\x45\x45\x0b\xe7\xb6\xf0\x15\x9a\xff\x1b\xbc\xbd\x3f\x83\x41\x92\x2f\x92\x3b\x77\x3f\x45\x15\x2e\x4c\x0b\x15\xfb\xa6\xd4\x45\x75\xb5\x3f\x60\xa8\x60\x03\x50\x7b\xdf\xef\x2d\x97\x99\x60\x01\xe1\x26\xe1\x38\xc8\x14\x55\xfb\x32\xb3\x43\x22\xdc\x64\x1c\xfb\x50\x2f\xc2\x8a\x33\xed\x2e\xb2\x55\x4d\x71\xbe\xf6\x8b\xed\x47\xe2\x28\xcb\xa5\x75\x29\xe8\x93\x25\x5c\x94\xa7\x5c\x80\xeb\xb1\x53\x4c\x54\x84\xa8\x89\xfb\x5a\x5f\x4a\xf0\x8b\xe3\x2c\x91\x89\x69\x44\x30\x3f\x44\xaf\x84\xcd\xfd\xfa\xb0\xfe\xe3\xf1\x6e\xfb\xe4\x2b\xda\x31\x65\x11\xd6\x7d\xde\x27\xc2\x57\xef\x6a\x4c\x53\x89\x58\xaf\xd5\x9f\xb7\xf7\xe1\x1c\x86\xf8\xaa\xe5\x6d\xd1\xb4\xdd\xce\x62\xfc\xfb\x2d\x08\xf5\x3a\x87\x71\x09\xc2\xf6\x70\x37\x3c\xec\x9e\x1f\x1f\xef\xfe\x1c\x8e\x59\x82\x77\x3f\xbe\xa8\x8e\x28\xe7\xe3\x8f\xb1\x24\x8a\x1d\x6a\xc8\x77\x6c\x2d\x0a\xf3\x43\xdc\xcd\x68\xa3\x8a\x39\xa5\x08\xd1\xf6\x90\xc8\xa0\x89\xf4\x61\x25\x3c\x7c\x50\xe3\x93\x76\x53\x70\xd5\x08\xf9\x97\x53\x70\x88\xb0\x63\x9e\x10\xec\x24\xf4\xdf\xbb\xac\xc7\xce\x53\x24\xe6\x1a\x10\x35\xf6\xf0\x7c\x77\x77\x58\x5b\x3d\xc3\x3e\x4e\x58\xdc\x7d\xd9\x3e\x6d\xf6\x5f\xef\x0f\x37\xeb\xdd\xea\x69\x63\xff\xfa\xfc\xb4\x39\x78\xe6\x14\x89\xb9\xe1\xa9\x95\xc3\xf9\xc1\x1c\x4a\xfd\xd1\xc3\x79\x48\x1c\xa7\x0a\xa9\x34\x25\xf6\xc7\xc6\x50\x1f\x12\xc7\x2a\xb5\xd2\x07\xf0\xc3\xa9\xc9\xa9\x9a\x86\x83\x9a\x63\xd7\xfe\x76\xf3\xb0\xdf\xdc\xde\x3d\xef\xbe\xfe\xbe\xf0\xc7\x92\x98\x60\x1b\x06\x9c\xee\xdb\x48\x53\x85\xc4\x89\xb1\xdc\x96\x5b\x40\x57\xd9\x70\xc2\x94\x4b\x36\xa0\x60\x2c\x07\x6c\xb2\x94\xc5\x69\x4c\x33\x17\x5f\x4e\x3d\x92\x3f\xcd\xe1\xe2\x54\x68\x74\xfb\xc6\xd5\xf3\x10\xbe\x4e\xc5\xca\x41\x70\xff\x79\xd1\xc7\x59\x19\x3c\xce\x92\x0c\x81\x81\x5f\xa0\xfb\x06\x4d\x3b\x60\x29\x49\x9c\xe5\xa9\x72\x0b\xb2\xe3\x21\x8e\x9e\x62\x26\x28\xae\x7e\xd2\xea\x21\x7e\x90\xd0\xcd\xb0\xda\xa3\x8f\xcb\x84\x39\x78\xce\xb2\x28\xcb\x11\x8f\x85\xc4\x79\x96\x5a\x45\x95\x4b\xd9\x5d\x1a\xd8\x37\xe2\x07\x94\x88\xa4\x09\x26\x52\x61\xa8\x54\xf8\x00\x56\xdb\xfb\xc7\xc5\xc3\x9f\x87\xc5\x6a\x15\x3c\xd8\xf1\x30\xe0\xb2\x7f\xbf\x79\xd8\xdc\x3f\xdf\x1f\xfe\xdf\xf3\xf6\xe9\x39\xbc\x9e\xb9\x4e\x88\x2b\x56\xee\xa0\x2c\xa1\xd9\x15\xc7\x2b\x62\x6a\x24\x16\x2c\xc1\x90\xb7\x43\x4c\xdb\x6c\x6a\xff\x9b\xfd\xcf\x3b\xbf\xa2\xd1\xd6\x13\x8b\x94\x62\xc8\xf1\xb3\xdf\x4a\xfa\x8d\x89\xf8\x44\x25\x16\x22\xf6\xc6\x36\xbb\xe2\x58\x0d\x86\x7d\x3e\x5e\x8b\x85\xd6\xe8\x6b\xdd\x87\xd8\xc4\x7f\x4c\x52\xdb\x65\xf9\x32\xa4\x30\xbb\x4e\x74\xb0\x16\x4d\xf9\xb6\xc7\xb4\x49\x74\xa0\x97\x6f\x7b\xa8\x44\xd5\xed\x40\xdd\x80\x4f\x39\x62\x9d\x18\x16\x0f\x41\xa4\x53\x6d\x46\x03\xb0\xf9\x12\xa9\x95\x05\x59\x9c\x8a\xea\xf6\x52\xe9\x4d\x35\x62\x71\xf4\x47\x15\x3e\x25\xeb\x01\x3e\xc9\xe6\xe8\x6c\x62\x1a\x69\xbc\x6e\xe7\x6d\x53\x3b\x0d\xff\x65\x5d\xbf\xce\x62\x9c\x24\xa2\x11\xf2\xcf\x77\xfb\xe5\x66\xbc\x2e\x24\x91\xb0\x5c\xfb\x16\xba\xdf\xdf\xd4\xfb\x1b\x95\x90\x28\xc2\xd4\xc1\x4e\x96\x87\xa0\xc3\xdd\x1f\xd1\xe8\x7a\xfe\x6d\x8b\xd2\xd5\x8f\xeb\xa7\x21\x10\x49\x28\xc9\xad\xda\x39\xc0\xf7\x31\xea\x71\x51\x96\x61\x08\xcd\x70\xbb\x6c\x6b\x13\x54\x24\x9f\x9c\xe0\xed\xec\x8e\x25\x54\x58\x2f\x08\xdb\x4e\x1b\xdb\xce\x4e\xe3\xf0\x84\x29\x85\x6b\x00\x76\x34\x46\x5c\x2a\x92\x70\x06\x08\xf1\x0e\x46\xa1\xeb\x6f\xdb\x29\xb6\x96\x24\x3c\x23\xbe\xe3\xb9\x44\x7d\xf2\x7b\xf1\xeb\x7a\x28\x9c\xf0\xdc\xea\x98\xdb\xa8\x71\xea\xa1\xfd\xd1\x7f\xa7\x97\x1a\x53\x89\xe4\x2b\x6b\x51\xfc\x54\x97\xe5\xcd\xb8\x2b\x31\xbd\x01\x71\x42\xad\x2d\x5d\x71\x6e\x9f\xbc\xc7\xed\xe4\xbc\x7e\xa0\x60\xcc\xe9\x6f\x0d\x35\x16\xdc\xe3\x6f\xeb\x66\xa3\x66\x19\x77\x92\x50\x1d\xc0\x15\xb8\xad\x5f\x29\xdd\x24\x49\x42\xa4\xaf\x45\x2f\x8e\x0d\xc0\xd0\x8f\x75\xe5\xfa\xab\x49\x51\x92\xc8\x38\x76\x6d\xd6\xe0\x73\xf3\x55\x94\x3f\x8a\xea\xd8\x87\x29\x85\x7e\x87\x66\xf0\x1f\x54\x44\x7a\x2e\xa7\xa3\x3b\x5f\x5d\x99\x93\x54\x59\x36\x54\x9f\xbd\xfc\xba\x46\x64\x25\x49\xaa\x63\xc4\x0a\x38\xf2\x28\x62\x39\xfc\x9c\x48\x8d\x6d\xea\xf7\xfb\xc1\xaf\x73\x59\x37\xb0\xe9\xe0\x34\x3b\x41\xa6\x45\x26\xbc\xbd\x9b\x13\xbb\x9e\x1b\x1f\x4b\x92\xe4\xb9\xc5\x4b\xae\x46\x8b\x79\x22\xb8\x6d\xa1\xdb\xdd\xef\xb9\xb2\x54\x2f\xff\xf5\x22\x4b\x70\x63\x6d\x2f\xa7\x93\xf0\xe2\xda\x24\x11\x92\x21\x22\x0f\x3c\xab\xde\xd1\x51\x7d\x05\xff\x7a\xd8\x9c\x08\x23\x50\x32\x65\xbb\x7a\x11\xa1\xd5\x9d\x48\x62\x8d\xb5\x07\xd9\xc9\xdb\x02\x4a\x4d\xc3\xf1\x8c\xa3\xcc\x6a\xdb\xdf\x02\xfb\x6e\x20\x71\x7b\xfc\x2b\xa4\x8e\x11\xc0\xe8\x45\x20\xcb\xba\x6d\xc7\xc5\x98\x44\x45\xb9\x89\x3c\xa7\x6c\xd3\xb6\x97\xfe\xa5\xc0\x14\x74\x7a\x89\x2a\x07\xac\xdf\x9a\x12\x7e\x15\xb2\x8f\x21\x07\xc8\x15\x49\x74\x94\x61\xf8\xf3\x54\xd7\x5d\x3b\x59\xa5\x74\x04\xf8\x56\x6f\x96\x5f\xae\x39\x50\xce\x26\x85\x26\x31\x8e\xae\xea\x7e\x61\xfd\x0e\x05\x76\x20\x86\xaf\xa1\x54\x38\xb0\xc2\xf9\x11\x0b\x79\xed\x70\xc8\x5b\xfd\x54\x15\x34\x56\xce\x2d\x1c\xcb\x12\x6a\xe9\xed\xbf\x36\xab\xed\x04\xde\x93\x68\x4d\x98\x15\x80\x6a\xe1\x77\x68\x2a\x08\x8b\x9c\x06\xcb\xe5\x5a\x41\xbf\x9f\x94\xe5\x1b\x2a\xf8\x4e\x5b\xad\xd7\x6b\xb5\xb3\x1f\x05\x42\x20\x39\xfe\x11\xba\xf6\x4a\xa3\x36\x31\x5c\xa0\xb2\xee\x97\x47\xe1\x0d\x45\x48\x1a\x45\x80\x98\x5a\xb4\xad\x76\x8f\x7f\xa6\xc8\x44\xd2\x28\x4d\xf0\x12\x6d\x8f\xfb\xb1\xa9\x6b\xe3\x94\x38\xb0\xa2\x36\x79\xa5\x53\x92\x71\x84\x32\x3e\x3c\xdf\x1f\x56\xdb\xcd\x03\xe6\xa0\x8b\x3f\x36\x3e\xbc\x4f\x89\x00\xc4\xf7\x43\xf7\x32\x98\x1b\x91\x94\x48\x92\xd9\xd2\x5f\x71\x3c\x42\x33\x42\x70\xf9\x01\x1a\xc0\x0a\x84\x40\xb7\x12\x1d\x1c\xeb\xa6\x80\x77\x75\xd8\xe9\x4d\x49\x29\x49\x90\x2a\x75\x2a\xaa\xce\x17\x91\x9a\xdf\xe6\x20\x8b\xe9\xcf\xa5\x8c\x22\xba\xa8\xdf\xf9\x1f\xa1\x69\x85\x73\x96\xf3\x17\xc2\x78\x82\xac\xd1\xa1\x38\x3e\xd6\x3e\x26\x29\x4f\x19\xb7\x22\x1c\xd8\x49\xc0\x1b\xe5\x23\x88\x34\x16\x56\x5b\xcf\x12\x90\xf6\x9b\xf5\xd3\x81\x1d\xee\x36\xf7\x1b\x1f\x39\xa5\x49\x64\x9d\x26\x54\xdd\x76\xe3\xaf\xed\x17\x59\x0c\x59\x84\x6d\x20\x3e\xd4\x77\x75\x75\x44\xc9\xe1\xb1\x95\x8b\x1f\x2d\x22\xcc\xf3\x9f\x84\x94\x45\xb7\x68\xa0\x9a\xbd\x6a\x69\x46\x35\xee\xae\xdd\xb1\xb1\x55\x5c\xff\x45\x39\xa5\xb8\x4c\xd4\x55\xf9\xf6\x54\x97\xb3\x7b\xec\x1b\x43\x69\x9e\x65\xb8\xbf\x3d\xad\x77\xeb\xa7\x6f\xeb\x9b\x83\xd7\xf7\x19\x7a\x7d\x69\x6e\x6c\xd1\xe7\x4b\xec\xff\x22\xf2\x0c\x2b\x9e\x23\x7d\xe7\x7d\x3d\x30\x94\x26\xb0\xf5\x7e\x34\x60\x87\xca\x99\x0e\xe3\xea\x7a\x9a\x11\xcd\x48\x2a\x04\xc1\x8d\xfb\xe0\xc5\x9b\x1f\xe0\xa7\x93\x79\xf3\x23\x94\xc6\x48\x5c\x05\x66\xe9\xac\x71\x94\xca\x9c\x63\x69\xa0\x83\xb6\xdb\xbd\xb5\xfd\x22\xef\x8e\x28\x66\x2c\x33\xd3\x5e\x83\x78\xdf\xdc\x4d\x55\x22\x64\x36\x78\x2d\x88\xd2\x76\x9d\x66\xa3\x74\x9c\xe3\xaa\x63\x5d\xbb\xc7\x36\xae\xb3\x49\xab\xb3\x84\x23\x4f\xec\x5c\xb4\xb5\xfe\xbc\x16\x92\x6a\xc3\x48\xe2\xc1\x76\xc8\xe3\xfa\x14\x4a\x4a\x52\xc8\x14\x37\x01\x9d\x73\x5b\x37\xe7\xf2\xd2\xd5\x55\xa1\xc2\x5d\x07\xe9\xca\x41\xd6\x9e\xe4\xa5\x28\xcb\xd9\x4f\x31\x91\x22\x6a\xdc\xc8\xfb\x0e\xc5\x00\x46\x4a\x4d\x6c\x43\x8c\x75\xd5\x41\xb3\x1a\x79\x52\xfb\xe3\x8a\x79\x93\x3d\x47\x4f\xf7\xe0\xa3\xe9\xc0\x2c\x22\xd6\x96\xe7\xe0\x44\x7c\xc6\x68\x05\x37\x84\x24\x06\x3b\x6e\xfb\xf5\xbd\x5b\x8e\x3f\x5d\x11\x32\x92\xc7\xd8\x07\x16\x5a\x2f\x3a\xc7\x15\xf8\x6d\x22\xac\xf9\xa1\x9b\x69\xff\xe1\xc4\x3a\xa6\x43\x05\xbf\x8a\xf1\xaa\x90\x11\x91\x19\xe5\xd1\x2a\xb3\x34\x37\x23\x9a\xa1\x66\xd6\x97\xfb\x5b\xff\x27\x9a\x00\xb8\x0c\x04\x19\x28\xcf\xe7\x5b\x80\xe5\x1b\xfe\xff\xec\x27\xd2\x3c\x65\xd9\x54\x78\xad\x6e\x5a\x1b\xf6\x5c\xad\x58\x66\x5c\x02\x92\x9a\x74\x23\x8a\x0f\x00\x0c\x59\x9c\x65\x66\x50\xca\xfd\xd2\x88\x1f\xa2\x13\xcd\xdc\x96\x9c\x64\xb1\xc8\xd0\xbc\xd6\xd9\x98\x4e\x31\xc7\xb3\x73\x26\x00\xd6\x16\x0e\x44\x09\x4d\x60\xc2\x90\x2c\x25\x56\x55\xf0\xd8\xd4\x3f\xbb\x97\x89\xf6\x2f\xc9\x52\x2e\xf1\x0d\xdb\x3c\x7c\x5b\xef\xf6\xf7\xeb\x87\xfd\xe1\x79\xb7\x7e\x22\xe1\x78\x9e\xe1\x8c\x75\x46\x27\xa1\xaf\xea\x0f\xcb\x44\x3a\x98\x0d\xd6\x76\x30\xf0\x98\xc6\xf6\x59\x2a\x35\xb5\x8d\x96\x47\x71\x19\xb6\xfa\x2c\x23\x14\x53\xa9\xdf\xd7\x7f\xee\xfe\x92\xb0\x4b\xb2\x4c\xa5\xe8\xdb\x6d\x00\xee\x6b\x1d\xce\x9e\xc7\x99\x4f\xd7\x3a\xac\xe5\x4c\xf6\xdf\x6b\x5d\x7f\xff\x41\xa1\xb1\x6f\xd4\xaf\x3a\xeb\xa6\xa9\x9b\xe7\x2a\x88\x8e\x69\x6c\x4f\xcc\x7f\x6c\x6e\x34\x6e\x2e\x68\x6d\x3e\x3d\x99\x88\xa8\x77\x19\xb6\x00\x82\x76\x5c\x88\xcd\x44\x4a\x7c\x24\xec\xee\xff\x7c\xa1\x08\x03\x33\x18\x29\x27\x2c\xa1\x9b\xf4\xf1\x32\x61\x38\x30\x07\x54\x98\x69\x9a\x7d\x56\x8a\x70\x9f\x96\x4a\x70\xbb\x14\x5f\xaa\x6e\x21\xdb\x0e\xaa\x11\x8d\x94\x64\x2a\xc9\x78\x1a\xf8\xdd\xcf\x63\x19\xe7\x30\x46\x47\x2a\x73\x2d\x73\x74\x3d\xfa\x5e\xe8\x6e\x7e\x37\x34\x24\xb8\xbd\xad\x2b\x1d\x3c\xfb\xdc\x21\x88\xec\x72\x7d\x5b\xd7\xd3\x4e\xca\xbb\xe7\x03\xdc\xc4\xce\xeb\x04\x2a\xfd\x3b\xbc\xd9\xa0\xf6\xda\xef\x02\x43\x10\x44\x68\x41\x6d\xe3\x08\x3b\x03\x63\x50\x3e\xe4\x8b\x55\x60\x59\x89\xae\x5d\x68\x0d\xce\xff\x2b\xfe\x37\x49\x1c\x06\x24\x33\x24\xc7\x76\x1a\x12\x71\x5b\x07\x08\xb4\xc7\xf2\x28\x4e\x69\x1a\xf2\x36\x57\xf6\x9a\xef\x0d\x93\x58\x2c\x8f\x92\x4c\x8d\x00\xa8\xdf\x07\x7b\x65\x92\x13\x6a\x6b\xbc\x08\x27\xb1\xdb\x6a\x57\x2f\xef\xae\xef\x32\x39\xc9\x18\xca\x27\x7d\xad\x75\xe9\xe4\xbb\xf4\x28\x01\xc8\x69\x64\x15\x52\xd0\x28\x18\x36\xaa\xb6\x36\x9d\xfe\xa8\xb6\xa9\xb0\xbc\x34\x61\x1a\xe5\x8c\x09\xdf\xca\x5d\x94\xe5\xee\x45\x34\xa0\x9d\x96\xc6\x0c\xfc\x90\x33\x4e\xb0\xda\x6a\xb7\x1b\x25\x4a\xb0\x04\x99\x70\xaa\x44\x21\x90\xd9\xb5\x9d\xb7\xd5\xb1\x1e\x3a\x4f\x39\x8f\xac\xfd\xe8\x11\xba\xe7\xd3\xab\xb8\xba\x62\xe6\x89\x10\xd2\xca\xf8\xa1\xd9\xe1\x52\xb4\x53\xc4\xaf\x1f\x66\x18\x32\xbb\x7e\x42\x71\x57\xfc\xe7\x12\x02\xe9\x3c\xa5\x31\x4a\xd0\xf4\x0b\xd0\x07\x71\x74\xde\x07\x65\xd6\xb1\x28\xdc\x84\x34\xcf\x53\x31\x71\x06\xff\x13\x44\x83\x7a\xfe\xb8\x86\x8c\x60\x28\xee\x13\x59\x6a\x55\x76\x1e\xea\x4e\x34\x6f\x8f\xa5\xe8\x4c\xdd\x9c\xc6\x5b\x51\x9e\xe5\x02\x19\x13\x81\x7e\x76\x2b\x34\xd4\x97\x6e\x5f\x87\xee\xcc\xf0\xae\xfe\x3b\xff\x1f\xff\x31\x30\xa8\x64\xe5\xfd\xd4\x8a\xea\x78\x5b\x5b\xe1\xd4\xd9\x2a\x94\xe7\x79\x8e\x1a\x64\xa5\x33\x37\xf1\xf8\x9a\xe9\xa5\x0a\x1e\xf3\x31\x94\x42\xaf\x87\xd9\x2c\x62\xab\x02\x7e\x2e\x85\x82\xed\x19\x2a\xdf\xd1\x9a\x14\x4a\xfc\x60\x19\x61\x92\xec\x83\x46\xac\x86\xdd\xe3\x02\x11\x52\xac\x5c\xc8\x9c\x3b\xd3\xc3\xe5\xa5\xa9\xf6\x5e\xbc\xd9\x1f\x97\x24\x46\x37\xaf\xdb\xa2\xea\x2c\x58\xbd\x7d\xbc\xc8\xb2\x50\x61\x00\xb5\xfc\x43\x6b\xf7\x7f\x2b\x8a\x12\xb4\xd3\xbd\x99\x2c\x80\xb9\x54\x11\x26\xf2\x5f\x9a\x42\x6b\x18\x7e\x93\x8a\x4c\x0c\x23\xf6\xcc\x6d\xdd\xac\xea\xd3\x19\x5c\x77\xe9\xaf\x8a\x3f\xd7\xe2\x96\x0f\x0a\x27\xb9\x26\x8c\x5b\xc1\xd0\x1f\x45\x0b\x0f\x97\xd3\xbb\x0e\xfb\x74\x25\xcb\x35\xcf\x49\x10\x20\x3a\x9d\x3b\x38\xd0\xc9\x36\x9f\xeb\x84\x59\xcf\x4d\x47\xa9\xbe\x26\xa5\x40\x72\xa0\x59\xe6\x0a\xd3\x87\x73\xbf\x93\xae\xbe\x8f\xcb\x19\xb9\x61\x11\x0c\xa6\x11\xbf\xff\xb9\xba\xfe\xb6\x19\xe1\xe2\x84\x7a\x77\x51\x0a\xa0\xcf\x93\x3c\xdc\xc0\x0f\xd1\x10\x8b\xb0\xa2\x4c\x91\xe0\xd3\xb3\x89\x28\xe2\x91\x2b\x72\x0a\xd5\x41\xa5\xcb\xf0\x2e\x88\x28\xb6\x3b\x76\xbf\x35\x2f\x37\x7f\xfc\x3d\xe4\xbe\x88\x5c\x70\x86\x72\x44\x10\xda\xae\xd7\xf0\x76\xfe\x13\x59\x84\x28\xae\xba\x9f\xbe\xc8\xc0\x6e\xa6\x8b\x98\x20\x44\xa1\x30\x4a\xd7\x88\xf6\x65\xaa\x0f\x45\x04\x61\x56\x12\xc6\xf2\x39\x67\xea\xa7\x7e\x8c\x64\x5e\x88\xfa\xa0\x5e\x9a\x11\x54\x42\x50\x69\x5b\x55\xd6\x7a\xdc\x36\xb3\x56\x8b\xc7\xc3\xf6\xf6\xd0\xa7\x64\x7e\x18\xa3\x39\x22\xac\x6a\x6c\xfe\xf5\x8b\xc1\x18\x27\x20\x18\x87\xc8\x85\xc6\xc8\x78\xfb\x1c\x38\xe4\xfe\x3d\x9e\x44\x82\xa9\xc4\x76\x97\xdd\x86\xfd\xae\x8b\x2f\xe2\x24\xc2\xf2\x80\xd0\xfa\xb0\x5d\xfb\x86\x80\x48\x92\x14\xd1\x95\x45\xdb\xbf\xbb\xae\x33\xe3\x8f\x65\x44\x59\xc0\x32\x82\x1f\xf0\xe5\x5f\x20\x0e\x4a\x8c\x89\x62\x22\x11\x06\x9b\x30\x1a\x54\x29\x9a\x91\x9a\x03\x11\xa9\x8a\x22\x67\x15\xf4\xe2\xf0\xe6\xa0\xdf\xe1\xf3\x3e\x9f\x13\x19\x05\x2c\x50\xfc\x53\x08\xdf\x3e\x14\x99\xa4\x38\x49\x9b\xb1\x3c\xd2\xbe\xbe\x17\x85\x97\x85\xf2\x23\xf3\x84\x60\xf1\xff\xe6\x7e\x7f\xc0\x9b\xbe\xbb\x0c\xe5\x21\xd1\xef\x02\x58\x32\xa8\x5f\x67\xd1\x98\xc8\xa5\xf6\x16\xfd\x4e\xdf\x7d\xd3\x4e\xa1\x15\x22\x37\x36\x42\x3f\xcc\x81\xf0\xff\xe6\x73\x2a\x8d\xfb\x84\x48\x34\xd6\x8a\x9c\xdb\x46\x55\x74\x63\x3b\x7b\x22\x84\x4a\xa8\x83\xfd\xef\xea\x4b\xa5\xd7\xc6\x80\x9a\xa2\x93\x32\x0f\x5c\x15\x32\xca\xf3\x7c\x48\x17\x7f\x2f\xd4\x6b\x6d\xcc\xff\xbb\xd4\x4d\xe0\x74\x09\xc5\x53\xbc\x79\x21\x45\x5f\x8a\xfe\xe7\xb8\xf2\xde\x65\x00\x78\x87\xd7\x45\x73\xc5\xb3\x20\x2b\x85\x8c\x39\x8f\x26\x6a\xaf\xa8\x80\x13\xa1\x15\x45\x1c\xa4\x7b\x0a\x37\x4b\xff\xdd\x90\x47\x24\x0d\xeb\x7a\x2b\x42\x83\x41\x40\x9e\x61\xa7\xb9\x14\x6d\xb7\x6f\x60\x80\xcf\x09\x03\xb9\xef\x7a\xdc\x8b\x5f\xfe\x02\xc6\x11\x81\x35\x37\x99\x4c\x11\x49\x05\x18\x8f\xf1\xd9\x20\x50\xc2\x05\xc8\x9b\xaa\xab\x57\xa2\xf1\xb3\x41\xb2\x28\x66\xc1\x0b\x4a\x28\x0b\xfc\x1c\xda\x20\xb7\x0d\xc0\x67\x79\x96\x64\xda\x8a\x5f\x63\xc9\xda\x9f\x34\x8e\x19\x16\x8b\x45\xff\xf6\x88\x0e\xd0\x07\x62\x76\x85\x49\x66\xd0\x72\xdf\xeb\x44\x8c\xc0\xfa\x32\x11\x09\x68\x1f\xd7\xc3\xa9\xa8\xae\xac\xb8\xb3\xeb\x48\x04\x20\xfc\x7f\x77\x77\x3f\x8e\x40\x64\x9a\x5b\xbd\xfb\x16\xba\xdb\xe2\xf8\xe2\xf8\xcc\xe3\x74\x44\xa6\x2a\xf3\x2a\x01\x6e\x89\xc5\x1e\xc4\xfb\xa5\x55\x66\x34\xc7\xba\xea\x01\x87\x5a\x22\x73\x3f\xec\x6b\xd1\x06\x92\xf4\xfc\xb5\xf5\xdf\x92\x27\x06\xc9\xb0\xc7\xe2\xc7\xec\x8e\xce\x63\x7d\x99\x43\x8a\x9e\x6d\x02\x25\xf1\xb7\xe6\xca\xca\xe0\x46\x8a\x44\x58\xa0\xaa\x35\x1d\xe9\xaf\x7d\x5a\xb7\x92\xfd\x6a\x64\x7f\x7f\xf3\xa3\x50\xf0\xa5\xa9\x2f\x67\x27\xdb\x70\x6d\xb7\xf7\x57\x2b\xb9\xf6\xa6\x26\xbf\xde\x26\xfe\x24\x93\xad\x44\xca\x38\x8b\x5d\xa8\x33\x29\x41\x4b\x19\x1b\x8d\x11\x88\x5d\x20\x6e\x40\x0e\x87\x52\x88\xfa\x3b\xf1\x03\x9a\xc0\xe8\x7d\x84\xa6\xa8\x75\x18\xa1\x6c\xad\xb4\xae\xca\xb7\x65\x7d\xa9\x14\x34\x3b\x34\x6e\x70\xca\xf1\xc3\x36\x2f\xa5\xe6\x56\xc5\x03\xcb\xe0\x57\xc9\xc4\x44\x2a\x65\x6d\xd3\x9d\xc9\xbc\x0d\xec\xdc\x31\x9d\x26\xc8\x7e\x3b\x89\x5f\x63\x13\x87\x51\x19\x55\xea\x54\x62\x92\x87\x28\x90\x71\xff\x53\x82\x64\x28\xa9\xf2\x50\xdb\x9d\x02\x7f\xcb\x48\xe5\xc8\x3f\xe1\x91\xec\x69\xfa\x3f\xd3\x70\x6a\x74\xcc\x9d\xd4\x44\xb1\x87\x61\xff\xb3\x96\xed\xb2\x1e\x2d\x4c\x76\x88\x8a\x20\xb2\x92\x82\x58\xe6\x0b\x5f\xc3\x86\xaf\xf1\xfc\x53\x15\x19\xaa\x5d\x43\xa4\xbf\xb0\x40\x13\x73\x3f\x41\x91\xc4\x86\xe8\xde\x44\x69\x0a\xc7\x54\x24\xb7\x64\x85\x3b\xe8\x36\x98\xcc\x3b\xa9\xbe\xfa\xe4\x11\x28\x8a\xb2\x14\xa9\xb8\xa7\xb7\x7b\xe8\x5e\x6a\x3d\xd1\xbb\xed\x0f\x2b\xac\x96\xf7\x81\xd3\x78\xd9\x6a\xc3\xe7\xe3\x18\x2b\x32\x83\x0a\xd3\xf5\xd9\xae\x58\x64\x59\xde\x2d\x74\xdf\x2c\xa6\xbe\xa8\x07\x11\x72\x67\x56\x44\x92\xf7\x24\xc3\xd1\xbf\x49\x38\x19\x95\x23\x7b\xa6\x45\x75\x84\xf2\xce\x7b\x9f\x26\x7c\xd4\x52\x54\x4c\xe5\xd8\x3c\x46\xc2\xb8\x68\x01\x37\xcd\xef\xd6\x9d\xc1\x1a\x0d\x4d\x2f\x93\x4b\x1b\xe8\xb9\x32\xed\x9d\xf8\x69\x2e\x65\x85\x40\xfa\x51\x55\xcf\x0d\x8e\x4d\x9e\xbb\x36\xee\xc2\x98\xa2\x2c\x44\x77\x25\xa8\x53\x09\x85\x6c\xd0\xb0\x76\x6b\x79\x51\x57\xcf\x55\xd1\x71\x7f\x23\x93\x98\xa4\x22\x88\x77\xd8\x52\xfa\xd6\xf8\x0a\x8c\x1b\x94\xb2\x98\x3a\xb9\x9c\xdf\x41\x29\xf1\x4a\xe3\x64\xf6\x65\x99\x50\x98\xe4\x9c\x8a\x0a\xe5\x42\xc2\x53\xf3\x6f\x84\xca\x23\x83\x64\x6f\x0c\xce\x8a\xea\x88\xf0\xa1\xc1\x34\x86\xa8\x5c\xa9\xc4\x45\x88\xbb\x25\xea\xb6\x85\x23\x06\x30\xbe\x42\xe1\x47\xff\x47\xc1\x24\x26\xc6\x87\xc2\x39\xd0\x84\xcb\x95\x91\x46\xf2\x14\xfc\x3a\x17\x41\xa3\x9d\x28\x49\x93\xd4\x77\x43\xc3\xdf\x38\xc5\xdd\x55\x0e\xc5\xc9\xe7\xc7\xe1\xa0\xd3\x9d\xb7\x98\xd4\xd0\x3f\xfc\x29\xce\x9b\xea\xff\x6a\x0d\x4e\x94\x8c\x53\xee\x76\x65\x44\x5c\x3c\x0e\x86\x22\xe1\x0d\xc3\xfa\xdb\xb9\x84\x99\xa2\xe6\x67\xd4\x1b\x25\x73\x4e\xe3\x61\x41\x3f\xbc\x16\x21\x46\x50\x8a\x68\xeb\xb2\xec\xec\x4d\x2a\xbd\xbc\xf4\x19\xc6\xec\xe9\x29\x96\x69\xf7\x96\xec\x5e\xea\xa6\x7b\xec\x07\x17\x75\xb5\xc6\x3b\xa8\xc3\xd9\x38\xc3\xa8\x06\xd3\xde\x71\x3d\x46\xa9\xd4\x4a\x1e\xf7\x89\x0a\x6a\x40\xcf\xc5\xba\x89\xd2\xd4\xaa\xe3\x5a\x8b\xba\x0f\xe4\x01\xfc\xd8\x34\xd7\x4e\x4d\xa5\x7f\xc3\xc5\x34\x0d\x9b\xbd\xe2\x5a\x02\x96\x21\xd7\x77\x7b\x2f\xe4\xa0\x20\x12\xb9\x74\xd4\x02\x8b\x9c\x1d\x03\xe7\x14\xc8\x14\x7b\x14\x76\xb7\xfc\x8c\x1c\xed\x3f\xa0\x35\x52\x01\x1f\xc5\xdb\x23\x34\xaf\xe3\x70\x41\x01\x30\xec\x8e\xa2\xbd\xf5\xd6\x38\x19\xa9\xb9\x5e\xa5\x1b\x6c\x78\xe4\x26\x81\xeb\xcb\xb5\xfb\x7a\x5b\xc1\x5c\xdc\x72\xf2\xed\x3a\x8a\x12\xc4\x99\x59\x51\xca\xcd\x6a\xfb\xdb\xfc\x78\xca\x86\x75\xe9\x5e\xfc\x7a\xb8\x9c\xee\x57\xf3\x41\x31\xc7\x40\x64\x07\x95\x5e\x9f\x44\x51\x5e\x2b\x04\xea\x28\x51\x78\x67\x4e\x88\x96\xf8\x2a\xfa\xc9\xd2\xcc\x39\xc7\x3a\x92\x16\x69\xd5\x42\x59\x4e\x48\xf5\x3a\x32\x12\xb1\xa0\x97\x46\x54\xc5\xe5\x74\x2e\x2f\x93\x56\xb7\x26\xc4\x2a\x6c\xf4\xeb\xb1\x43\xdd\xff\x45\x02\xf3\x09\x24\x50\x93\x54\x21\xc8\x7e\x10\x4e\xba\x22\x2a\x42\x34\x11\x04\xfb\xf2\xea\xd2\x3c\x81\x99\xf4\x0b\x35\x31\x80\xf8\xcb\x93\x43\x31\xde\xfc\xe1\x9b\x1c\x9a\xb2\x14\x97\xfb\x7f\x5e\x4e\xd2\x2e\x31\x9f\xcb\xcb\xfb\x8f\xa5\xc0\x1c\xb7\x72\x77\x12\x65\xf9\xde\x39\x8a\x68\x06\x02\x3b\xd7\xfd\x06\xd7\xce\xfa\x2d\x9a\xc7\x36\xcc\xfd\x5a\x57\xf0\x86\x12\xa4\xb3\x92\x92\x8e\x09\xc1\x3a\xfa\x57\xf1\xf3\x95\x7e\xa2\xc1\xd8\x8f\xd4\xa8\xfd\x7e\x16\x6f\x7e\x9b\x9a\x9e\x2a\x49\xa2\xc8\x7b\x52\x09\x0b\x10\x41\xe3\x4e\x7f\x58\x50\x13\xb9\x0b\x1d\x99\x31\x11\x9d\x02\xa0\x80\xba\x2e\x5a\x4c\x15\xdd\xca\x55\x0c\x77\x36\x27\x39\x46\xe4\x77\xf5\xd1\x29\xb1\x40\x73\x23\x5d\x23\xe6\x7a\xa5\x56\xe7\x09\xc7\x7d\x13\x54\xbd\xbc\x14\x83\x3a\x14\xd1\xfd\x8a\x8f\xbb\x83\x38\xc1\x17\xaf\xbe\x2e\xaa\xd7\xa6\x2e\xcb\xbb\x21\x36\xd1\x32\xb7\xa2\x93\xdf\xeb\x46\x8f\x34\x11\xb4\x94\x19\x6e\x74\x37\xeb\x6f\xeb\xbb\xed\xe3\xfa\xe9\x70\xbb\x5e\x1f\x1e\xd7\x4f\xab\xf5\xc3\x7e\xf1\x65\x1d\xc6\x81\xc4\xe2\xe0\xe3\x53\x58\x4d\xb4\x82\x88\x04\x89\xfa\x3d\x88\xd3\xbd\x38\x9f\xe7\xa6\x2d\x44\x6b\x63\xe5\xa6\x8f\xd0\xb9\xca\xdb\xf2\xed\x0a\x64\x47\x03\x37\x91\x9b\x20\x98\xb8\xde\x8b\x09\xdc\x69\x7a\x47\x20\xe5\xf8\xee\xdf\x6d\xbf\x1c\x76\xe7\xa2\xc2\xd9\x22\x8a\x0a\x1a\x7c\x4c\x73\xd0\xf7\xe4\x9b\x20\xe2\x31\xba\x27\xb4\xd6\xe5\x01\xf4\x3f\x85\x7a\x3d\xd7\xdd\xc0\x1a\x86\x28\xb6\x51\x02\xfc\xc2\x39\xb8\xb4\xe7\x9b\x72\xf5\xdd\x50\x92\x6b\xac\x51\x06\x73\xa1\xe5\xa5\xa9\x26\x32\x7f\xb3\xf1\xca\x82\x22\x84\xd6\xfb\xda\xd6\xfa\x4f\x30\xda\xec\xa6\x93\x1a\x88\x31\xb8\xa1\xe3\x76\x7b\x0f\x9d\xd0\x7d\x98\x36\x9e\xcd\x40\x63\x6e\x5b\x02\xb5\x7a\x3d\x20\x1a\xc7\xff\x0c\x2a\x08\x56\x08\x2d\xda\xac\xdd\xd7\x18\x71\x2d\xa1\x9b\xad\x05\x40\x95\xc4\xf9\x8e\xe6\xec\x23\xd3\x7f\x02\x14\x08\x36\x8e\xfb\x19\x35\xb6\x24\x0d\x87\xad\xce\xc2\x9f\xcf\x8f\x1b\x9c\x38\xe8\xd7\x37\x2a\x50\xf5\xdb\x80\xe3\x5e\x81\x7a\xbd\x2d\x85\x53\x62\x0c\x41\xa6\x1f\x16\x53\x4e\xbd\x9c\xd7\xf6\xd2\x6d\xcd\x57\x08\xba\x2d\xc0\xd2\x9c\x92\x89\xf6\x8b\xf3\x29\xba\xba\x9f\x00\xd3\xd6\x80\x58\xf8\x3c\xc4\x2e\x80\x93\x92\x2f\xc4\x51\x1a\xd1\xd0\x82\x35\xc5\x71\x07\xdd\xe5\x3c\x97\x14\xf0\x83\x9d\x37\x69\x7d\x86\x6a\x59\xcf\xe6\x2e\xa4\x69\x02\x6c\xb4\xd5\x34\xaf\xd0\xbd\x2b\xf3\x43\xc6\xb8\x0c\xfe\xbe\xe3\x1a\xa4\x85\x07\xf9\xeb\xca\x04\x58\x5d\x3f\x2c\x3f\x59\xa7\xfc\xf9\x99\x94\xc2\x21\xfd\xd5\x7c\xaf\x9b\xd3\x4b\x1d\x72\x2c\xc8\x69\x8e\xef\xdb\xa9\xa8\x46\x01\xe9\x6c\x12\xe6\xb9\xad\x0c\xa3\x66\xd2\xa2\xd2\xab\xba\xfa\x01\x4d\x37\xc2\x60\x8e\x14\x5b\xae\x06\x6e\x90\x4b\xcb\xaa\xb6\x3e\xfc\x8f\xf5\x2b\x9c\xe6\x20\x0a\xc8\x01\x12\x3e\xd8\x08\xd9\x55\xee\xc9\x62\x65\xe7\xcf\x4c\x28\x86\x8b\xdc\xff\xda\x97\x71\xfa\xac\x24\x55\x3e\x93\xbb\xad\x1b\x50\xa2\xbd\x6e\xba\x44\x40\x2a\x05\x9e\x1e\xff\x4b\xd5\xef\x11\xc6\xb3\x3b\xa1\xa4\x65\xbb\x35\xa0\xa0\xf2\x4d\xd6\x65\xb0\x7f\x20\xa0\xd3\x3c\x1e\x53\xe9\x0f\xa2\x2c\x0f\x43\x87\x00\x74\xa6\x72\x47\x61\x3d\xc2\x6d\x7d\x69\xd6\x55\x78\x94\x60\x94\x25\xa7\xd8\x18\x79\xc0\x57\x7d\x0a\x3d\x07\x43\xc1\xeb\x56\xfc\xf1\xf8\xb4\xbd\xdf\x1e\xee\x9f\xef\xf6\x9b\xc7\xbb\xcd\xfa\x69\xc2\xe4\x06\x23\x75\x62\x3c\x52\x04\x1b\x82\x98\x55\xc3\xe5\x14\xf4\x95\x66\xa7\x56\x29\x96\x19\x6a\xef\xda\x3e\xbd\xcf\x06\x00\x35\x43\x45\xdb\x16\xc7\x99\x01\x35\x31\x91\x48\xfd\x52\xbe\x43\xc0\x4b\x07\x1a\xb1\xd2\x4f\x75\xfd\x2e\xee\xf7\x9f\x01\x1e\x79\xda\x71\xe5\x82\x9b\xdd\x88\x02\x6c\x68\x6c\xeb\x5e\xdd\x0b\x84\x62\xe0\xd6\xfc\xf6\xce\x1b\xb4\x1f\x69\xac\x77\xab\x28\xd5\xed\xa5\xbb\x34\x80\xc5\x90\xab\xf7\xd0\xd0\xdc\x0a\x78\x5b\x49\x82\x4b\x59\x9c\x47\x0e\x8f\xc4\x50\x88\x99\xbb\xc5\x9b\x76\xe2\x87\x8a\xf8\xfb\x21\x9a\x32\x8c\x52\x8c\x15\xc4\xcf\x70\xc9\xfd\x5a\xe5\x1a\x2f\x0b\xd5\x5d\xac\x59\x77\x73\x75\x29\x32\x2c\x8f\xc1\x4b\x00\x88\x4b\x0b\xcd\x61\x3e\x40\x32\x24\xe3\xa3\xa3\x60\xe5\x3b\xfc\xc3\x0f\x61\xa0\xb0\xa0\xb9\x13\x06\x44\x3b\xd1\xee\x32\x9c\x5a\x19\xfe\x7f\x15\xdd\xef\xdb\xcd\xc3\xc0\x13\xfa\x8b\xdc\x6b\x76\x63\xb9\x31\x78\xaf\x4c\x51\x76\x43\x82\x6b\x62\x1a\x23\x9c\x5b\x39\x65\xb7\xe9\x75\xc5\x09\xc9\x6c\x29\x48\x5e\x8e\xcb\x4b\x98\x24\xb1\x4c\xb4\x18\x89\x68\xb4\xef\x3d\x28\x88\x49\xa4\x8e\x86\xc5\x63\x53\xfd\xa8\x0b\x35\x23\xe5\x9a\x8c\x44\x38\xc6\xb9\xbb\x3e\xc0\xcf\xed\x3b\x2d\x6b\x62\xb2\x84\x5b\x35\x9d\x42\x9c\xea\x4a\x63\x64\xb1\xaf\xdf\xfb\x73\x13\xe3\x89\xc8\xeb\x87\x7f\x1e\x9e\x1f\x02\x38\xcf\xe4\xb9\x42\x20\x0f\xaa\x48\xdc\xd4\x28\x2c\x23\x87\x94\xda\x88\x2c\xc3\x6c\xf1\xb6\xf8\x05\x7a\x0c\x02\x30\x2a\x4a\xb1\xe4\xb0\x59\x6d\x0f\x77\x7d\x04\x75\x88\xc3\xa1\x34\x4e\x82\x60\xaa\x75\x32\x9c\xc8\xd1\x12\xa3\x32\x8e\xda\xd2\xf7\x8b\x3f\x0e\x8b\x6f\x8b\xcd\xdd\x62\x79\xb7\x3e\xfc\x73\xbb\x79\xd8\x4f\x0a\x47\x46\x89\x3c\x4e\xac\x85\x48\xbf\x15\xa0\xde\xac\xc7\xd1\x18\x20\x12\x8d\x33\x7e\x7a\xc0\x6b\x9f\x07\xf9\x63\x0c\x50\x2c\x40\x5e\xde\x82\x26\xf7\x1c\x55\xf0\x79\x67\xf2\xb3\x7e\xa5\x81\xd8\x20\x8a\x7c\xb9\xb9\xb9\x59\xdf\x84\x2f\xcd\x99\x15\x5d\x47\x51\x40\xa8\x50\x2f\xf6\x74\xf6\x54\x93\x7e\x17\x18\xde\x43\x1a\x91\xc4\x1a\x9f\xab\xba\x2c\x45\x07\x8d\x93\x0f\x09\x87\x73\x89\x71\xd8\xfa\xd4\xe1\xe4\x9e\xd8\x5d\x7e\x1c\xe1\xd3\x88\x8a\x1c\x51\x5d\xeb\xa7\x15\xa5\xac\x0f\x16\x06\xfb\xcd\x6b\x60\xe2\xf1\xa4\xa2\x11\x93\x16\xbd\x24\x67\xa8\xbb\xe9\x28\x2e\x65\xdc\xff\xd4\x85\xd6\xe3\x92\x2d\x8d\xe2\x54\x38\x05\xbf\xff\x5c\x8a\xc6\x2f\x6b\x93\x2d\x8d\x46\xb1\x01\x99\x06\xa1\xa8\x7d\xfd\x5c\x54\x9e\x83\x79\x85\xb3\x4b\xa3\x24\x95\xda\x79\x0b\xb5\x7f\x09\x6b\xa2\x51\x02\xd2\xc7\x53\x88\xa7\xb9\x01\xcb\x10\x9c\x79\xbe\xd2\x28\x05\x1b\x0a\x74\x81\xbf\xf2\x14\xa2\x09\x1a\x65\x71\x8e\x81\xa1\xf3\xf5\x1c\xaf\xb5\x73\x1f\xf5\x7f\x4c\xcf\x9b\x89\x24\xb2\x15\xdd\x46\xfb\x86\x3c\x8d\xf2\x98\x39\xff\xc4\xdb\xa2\x55\xa2\x9c\xbc\xf3\x34\x12\x3c\x46\xb5\x84\x7f\xfd\xeb\x5f\x93\x79\x20\xb8\x85\x72\xf4\x59\x13\x22\x5b\x76\x9f\xad\x72\xd3\x0b\x11\x59\x6a\xc5\x69\xdc\x02\xff\xd8\xc0\x66\xb5\x75\xaa\x8e\x3e\xec\xa2\x91\x8c\xc0\x3b\x30\x84\xf2\xf5\x4a\xf4\xe9\xd2\xe8\xa1\xc9\x8c\x47\x43\xa0\x87\x45\xbb\xb9\x27\x00\x8d\xa4\x10\xf8\xcb\x3d\x65\x63\x8e\xfc\xfe\x6c\x31\xa6\x91\x34\x79\xec\x0a\x62\x7f\xa2\xb8\xe4\xf3\xee\x66\x27\xca\x91\xa7\xf5\xd5\xa8\x81\x46\x2a\x02\x8c\x64\x1e\xbf\x2e\x76\x6b\x72\x78\x5a\xec\xd7\xfe\xb2\x55\x6e\x9c\x41\x57\x59\xde\x5b\x34\xcc\x63\xdd\xb6\x45\x70\xdf\xf5\x05\x9a\xf0\x01\x65\x77\x4f\xc7\x9f\xb0\x90\xe1\xa1\xad\x41\x23\x05\x5a\x31\xcf\x30\x38\x8d\x00\x89\xd3\xe7\xa9\x59\x24\x72\x6f\xe1\x56\x94\x6f\xef\xf7\x82\x7e\x8c\x44\xe0\xe9\x0f\x1b\x1c\x04\x28\xd2\xdf\xac\x7c\xf8\xb3\x80\x45\x2b\xed\xd7\xab\xaf\x0f\xdb\xc9\xe4\xd1\x20\x91\x94\x77\x73\x51\xaf\x2a\x24\xbf\x34\x82\x58\xa4\x4e\xf0\x53\x83\x2a\x4e\xa2\x0c\xbf\xdf\x70\x22\x86\xda\x91\x45\x0e\x9d\xce\xa2\xc1\xde\xda\xf8\x7b\x49\x94\x59\x60\x6d\x33\x32\xfd\xef\x97\xbd\x47\xa1\x5e\xfb\x28\xe7\x32\x1d\xad\x85\x1a\x01\x8f\x47\xf6\x54\xbb\x62\xaa\x75\x46\x49\xff\x38\xd1\x0b\xdc\x99\xbd\xec\x5f\x1a\x2f\xd2\x45\x49\x64\x12\xa4\x4d\x78\xb0\xd0\xe2\xd2\xd5\x55\x7d\x7a\x1b\xe8\x7c\x94\x10\x6a\xfb\x05\x12\xa0\x99\x56\x53\x28\xa1\x59\x8a\x02\x51\x7e\xab\xf4\x7f\x16\x14\xc9\xe9\xd0\xbd\xb8\x94\x60\xe0\x5a\x53\xc2\xb2\x34\xe6\xbe\xdf\xf4\x36\xd7\x68\x9c\xc9\x75\x51\xc2\x74\x8a\xb0\x26\xd0\x45\xf7\x8e\x0d\x7f\x7d\x12\x13\x4e\x24\xf6\xbd\x05\xaa\x28\xd8\x9b\x3e\x77\xd6\x9c\x7f\x24\x4e\xbd\x7f\xb8\x6f\xea\x5e\xab\x30\x50\xc2\x93\x9c\x78\x22\x3f\x16\x6d\xde\x51\xb5\x7c\xd4\x47\x09\xcf\xb4\x17\x36\x59\x8a\xb6\x50\xd6\x8a\xbc\x7f\x1d\xba\x5b\x18\x84\xad\x28\xe1\xa0\xf4\xd0\x4f\x40\xfd\xf2\x4f\xf6\x25\xc2\x8d\xd5\xd8\x77\xa5\xe7\xd9\x23\x8f\x33\x82\x75\x50\x38\x75\xe7\xb7\x7d\x7d\x7d\xdf\x21\xb1\xc8\x70\xde\xaa\xa3\xbf\x88\x58\x53\x2f\x5d\xbb\x82\xa6\x13\x45\xe5\x1a\x1b\x1f\x72\x29\xfe\xba\x8e\x48\x49\x6c\x58\xa4\x02\xf0\xe7\x5d\x81\x62\x76\x55\x09\xe3\xc8\xd6\xeb\xa3\x28\xd0\x8b\x30\xd3\x12\x45\x62\xdb\xc4\x39\xbf\x3d\xd6\x67\x97\xfd\xf9\xa3\x69\xc4\x72\x3e\x18\x34\x3e\x8a\xb3\xb5\x43\xf9\x54\xd9\x8f\x92\x94\x09\xe3\xd0\xe6\xff\x0d\xd0\xbc\x45\xd3\x0c\x2a\x44\xde\x15\x91\x92\x2c\x8a\xb0\x8c\x3f\x44\xf9\xce\x10\xce\x1f\x8f\xa5\x74\xc0\xea\x9f\x6e\x9b\xf3\x47\x12\x89\x10\x93\x10\x57\x3b\x64\xfb\x13\x08\xf5\x02\x7a\x36\xbd\xb2\x9c\xa0\x8b\x90\x03\x5f\x8b\x21\x6b\xbf\x26\xc8\xd4\x8f\xd7\x08\x34\xf9\x62\x1d\x92\x1e\xd7\x77\xdb\xf7\x8e\xd7\x94\x64\xca\x90\x78\x84\x40\x73\x88\xbf\xe9\xa0\xdc\x09\x0f\x3e\x17\x95\xa9\xc7\x8b\x1f\xc9\x13\x12\x09\x1f\x88\x1e\x8b\x3a\x80\xf2\xfa\x47\x34\xbd\xa0\x5c\x65\xd8\xad\x42\x6b\x03\xcc\xd1\x3c\xaa\x25\xe4\x80\x94\x88\x4c\x82\xb5\x60\x47\x98\x57\xdb\x9a\x4b\xb9\xf1\x4e\x65\x94\x48\x05\x58\x83\xfd\x51\x77\x5e\xda\x72\x34\xa3\x14\xe5\xa9\xdb\x63\xbf\x43\x71\x5b\x37\xae\x0d\x1d\x0e\x0b\xbc\x83\x76\xc2\x2d\xff\xf5\x64\x99\x67\x57\x4b\x32\x94\x28\xb0\x1d\x1e\xe1\xb4\xed\xa6\x80\xc6\xfe\x38\xa4\x4e\x90\x97\x0c\x36\x28\x81\x52\x4e\x09\x70\x40\x26\x42\xd1\xc1\x29\xd8\x10\xdb\x85\xe3\xfa\xe2\x04\x9a\x23\xdc\xda\x19\x27\x4d\x9a\xdb\x94\x46\xb1\xc0\x25\xe3\x97\x82\xa6\xfb\xfd\xcd\x87\x3c\x94\x44\x0a\x2d\x79\x94\x68\x5f\xae\x8b\x82\x50\x4a\xd2\x58\x3b\xde\xf8\x5d\xf1\x0a\xe3\x98\x83\xd2\x98\x21\x52\xd6\xae\xba\xe3\x5d\x98\x52\x25\x23\xb7\xaf\x9b\x40\x10\x9d\x2c\x29\x94\xa5\x52\xb0\xe0\xac\x57\x4c\xa9\xa0\x94\x32\x4d\x33\xa7\x93\xd6\xef\xba\xdf\x44\x55\x74\x6f\xcf\x4d\x39\xae\x30\x52\xca\xa3\x18\x73\x95\xf5\xf6\x9f\xfe\xaa\x78\x62\xfd\xf2\x9c\x93\xd6\x67\x15\x57\x4a\xb9\xe2\x38\x09\x7f\x78\xae\xc7\x34\x58\xa5\x31\xcd\xbc\xc2\x47\xff\x2a\xa0\x5c\x64\xbb\x7c\xdb\xe8\x77\xeb\x97\xdf\x5c\x68\xac\x2c\x63\xde\x45\x62\x4d\xbf\xc9\xfc\x2d\xd4\x17\xa5\x31\x44\x98\x54\x04\xbf\x92\x41\xaf\x8e\xd2\x04\x1c\x1d\xbc\xfe\xf1\xd7\x51\x36\xcd\x22\xc9\xdd\x8c\x2d\x9a\x93\xa8\x66\xca\xb7\x94\x66\x84\x73\x1a\x40\x47\x0b\xd9\xfe\x5e\x54\x1a\x5b\xd8\xd3\x61\x59\x82\x02\x74\xa5\x2d\xbe\x4e\x98\x0e\x94\x8a\x54\x22\xb4\xcb\x99\x3a\x05\xe8\xfc\x6c\x6d\x0c\xf7\x46\x52\x99\xb8\xfa\xc4\xef\x7f\xae\x6e\x2f\x65\xf9\xdb\x7c\x88\x22\xae\x66\x7c\x29\xbb\xe2\x51\x34\xdd\xdb\x1c\x3a\xf7\xae\xa7\x4a\xa9\xce\x0d\xc2\x6d\xbf\x88\xb2\x84\xa6\xa8\xab\xa1\x95\x40\xa9\xd6\xc4\x22\x83\x5b\xf4\x57\x1a\x9b\x82\x84\x11\x14\xcd\x5a\x3d\x0b\x84\x52\x48\x0c\x78\x21\xe2\x73\x03\x87\xd7\x37\x75\x28\x54\x5d\x15\xff\x39\x58\xd9\x05\x0d\x55\x8d\x04\x7c\x0f\x0c\xa7\x2c\x4a\x38\x1d\x2c\x49\x27\xca\x27\x9f\x3e\x76\x16\xe5\x09\x04\xa5\xc2\x76\x0f\xe2\xb4\xb4\x7b\x55\xff\xf8\xdb\x4e\x9c\xce\xe1\x2b\x40\xa3\xc8\x2b\x96\xf4\xf6\x3f\xeb\xc9\x0a\xc8\x48\x1f\x1d\xdb\xe6\x51\xbf\x99\xb5\x1d\xe8\xdd\xe5\x1d\xb0\xd2\x0f\x06\xab\x17\xb1\xdb\x2f\xbe\xac\x0f\xb7\xdb\xe7\x87\x9b\xc5\x7e\xb3\x7d\xf0\x27\xa3\xd4\x3a\x23\x3d\x09\x89\x02\xbe\xa3\xa5\x9b\xc5\x4c\x27\x83\xc3\xf8\x53\x71\x7c\x09\x7a\xf0\x93\xd5\x83\xc5\xb1\xf4\x93\xec\x6b\x7d\x82\x8f\x22\x6d\x16\x27\x02\x93\xed\x2e\xb8\x99\xcd\x15\xf9\x28\x8b\x53\xeb\xfc\xfe\x00\x3f\xff\x9e\x75\x26\x65\x49\x14\x63\x7c\xfd\xb8\xb8\xc3\x8f\x0c\xc2\xcd\xd3\x5d\x9b\x25\xb9\x21\x2e\x27\xbd\xab\xd5\x6b\x60\x06\xf8\xc3\x82\xa9\xe1\xf7\x9e\x0a\x5f\x9b\x9c\xfe\x88\x44\x46\x49\xe6\x0b\x7b\x88\x66\xeb\x40\x4f\xee\x5b\x9a\x71\x64\x3f\xdf\x41\xd7\x4a\x57\x85\xfa\x08\xa9\xed\x3f\x62\x52\xcd\x27\x52\xae\xb3\x5b\x9c\xa5\xd4\xc3\x14\x1e\x2d\x07\xf4\xdb\xd8\xf3\x63\xf6\xd4\xb3\x5c\x63\x7d\x5e\xfa\xe5\xfe\xb6\xbc\x34\xb2\x9e\x9f\x53\xe8\xc8\xcd\xfe\x1b\xf1\xd6\x6e\xaa\xfb\xba\x72\x9c\x97\x09\xc4\x86\xb2\x9c\x47\x38\x4b\xfa\xb7\x7f\xff\x52\x58\x53\x7f\xff\x73\x73\xa0\xc6\xb2\x3e\xfa\x65\xf3\xd2\x84\xfe\xb4\x3b\x2e\x22\x89\xb9\xdc\x57\xa8\x4c\x73\xf1\xc8\x12\xca\x04\x23\x7e\xd1\x5d\x36\x85\x7a\x0d\x56\x6b\x94\x49\x96\xe4\x0e\x14\xe2\x0a\xfb\xef\x39\x6c\x94\x49\xae\x35\x1f\x97\x7a\xd0\xb6\x6d\xd1\x80\xb8\xbe\x7f\x32\xa9\x92\xd8\xad\x4b\xdb\x1f\xd0\xe8\x46\x98\xeb\x65\x63\xca\x14\x31\xe8\x37\x70\x2a\x9c\xa7\xde\xcc\xf3\x67\x36\x5c\xf7\xd3\x62\x30\x8d\xda\x8d\x67\xb4\xe6\x59\xcc\x47\x05\xc9\xcf\xa4\x94\x29\xd3\x92\x58\xcb\x9a\x8b\xec\x3e\xd4\x0b\xa7\x0c\x58\x8c\x28\x98\x06\x84\xbe\xab\x7f\xc0\x0e\x61\x8b\x56\xe4\xdf\x8f\x31\x2c\xc6\xd8\xd6\xce\x67\x34\x62\x9f\x7c\x17\x8f\x08\x10\x70\x78\x8c\x9b\xa2\x95\x97\xa6\x85\x81\x1e\x4d\x79\x94\xe4\x91\x6d\x2d\xd6\x5f\x45\xbb\x7f\x81\x65\x71\x3c\x42\xdb\xdd\x14\xbe\x3d\x41\x79\x94\xe6\xd9\xb8\x3d\xb1\x0c\x65\x28\x4e\x44\x84\x88\x4d\xd3\x00\x86\xa3\x77\x76\xb5\xfb\xf8\x57\x71\x22\x99\x74\xf1\xd9\x57\xd1\xf4\xb9\xd4\xd6\xf7\x09\x7e\x9b\x3a\x8b\xfa\x0f\x18\x83\xf5\x90\xb3\x68\xdb\x31\xf2\x90\x72\x9a\xda\x46\xc3\xa9\xa8\xac\x79\x99\xff\xbb\xca\x43\xe1\x00\x5f\xef\xa1\x4a\x12\x86\x40\xcc\xf8\xa8\x60\xf3\xbe\x6d\x32\x84\x94\x9c\xa5\x5c\xf4\x6b\x4a\x7d\xf2\xd9\x10\xe7\x5c\xa4\xae\x59\xf4\x28\xd0\x19\x7e\x3a\x71\x39\xcf\x35\x8a\xc3\xfe\xb9\xde\x85\xcf\x48\x8a\xab\xca\x0e\xa0\x84\xa0\xd1\xf7\xf9\xaa\xc1\xb9\x62\x58\x73\xd0\xda\x74\xb7\x97\x4a\x4f\xec\x3a\x29\x8f\x23\x49\x5c\xaf\xa5\xda\xd5\xe5\x84\x1e\x40\x79\xcc\x72\xe1\x72\xb6\x8d\xaa\x47\x21\x08\x8f\x73\x9b\x84\x23\x77\x62\x33\xcb\x11\x79\xac\x6d\x7d\x5d\xd5\x85\x6b\x1c\x0e\xe1\x37\x8f\x8d\x25\x24\x98\xa2\xd2\x0f\xf0\xab\x1b\x56\x94\xa9\x5e\x15\xe5\x09\xb1\x17\x77\x39\x1f\xfb\xc7\x33\xd0\xcf\x40\xef\x56\xd7\xb3\x2e\x9e\x50\xbb\x83\xf6\x09\xf4\xf6\x06\x7e\xa0\x7e\xea\x9c\x18\x35\xff\x4c\x9a\xe2\xde\xb4\x6a\xde\xce\x5d\xfd\xf8\x52\x43\x55\xfc\x82\x76\x55\xfc\x28\xca\xef\xe2\x7a\x7f\x9f\xf2\x94\x00\xce\xea\x5b\x31\x15\xa6\xa3\x3c\xcd\x94\xb1\x84\x1c\x55\xff\xe8\x67\xcd\x24\x60\xf7\x83\x54\x3c\x4a\x0d\x1e\xa0\x9f\xf5\xcb\x91\x53\x29\xe5\x29\xe8\x9c\x8e\x98\x6a\xc5\x79\xd7\x89\xce\xbb\xcb\xfb\x88\x87\x67\x24\xc2\xf8\xae\x82\x9f\x81\x04\x58\x29\x78\x08\x37\x3c\x03\x8e\xc6\xa5\x9b\x76\x59\x17\x25\x34\x16\x1b\xf6\xc1\xeb\x95\x01\xc7\xde\x24\x12\x4a\x1e\x9b\xa2\x6e\x8a\xee\x6d\xf6\x78\x73\xae\x3d\xeb\xce\x6a\xb3\x84\x09\x93\x67\xd6\x28\xbe\x0d\x22\x2f\xe4\x83\xef\xc9\xa5\x89\x88\x83\x53\x75\xf5\x6a\x36\xfb\x45\x6c\xf3\xa6\x43\x9f\x12\xd4\x25\xac\xc4\x59\xc8\xa2\xf4\x4a\xe3\xd9\x94\x12\xc2\xc7\x2f\x9b\x8c\x72\x4c\xbb\x6d\xda\x66\x55\xdd\x3f\x88\xb9\xfd\x27\x4c\x92\xc7\xd3\xe2\x4c\x3b\x4c\x19\x37\x48\x45\xc2\x93\xa1\x5d\x5b\x1c\xe5\x7d\xa1\x1b\x75\xc3\x3e\x8f\xe9\xb9\x62\xb1\xdf\xcc\xb0\x41\xb2\x84\x6e\xdb\x14\xc7\xe2\x2f\x82\x42\xae\x64\x46\x06\x47\x11\x24\xc6\xad\xaa\x01\x7b\x34\x4f\x6b\xa6\xcf\x4a\x41\x8c\x71\x79\xd7\x6f\xc9\xb8\xf1\x9c\xeb\x62\x58\xbe\x75\x64\x1d\x87\x85\xd6\x37\xa2\xbb\x02\x2c\xa3\x5c\x67\x1a\xb9\x55\x06\x99\x69\x7b\x38\xe1\x72\x7b\x69\xa0\x75\xd9\xb9\xdf\x4c\xb8\x56\xa0\x59\x30\xa3\xb5\xb6\xb1\x00\xf7\x45\x35\x7b\xba\xa0\x22\xdc\x09\xef\xea\xe3\xae\xbb\x68\xa8\x3a\x0f\x33\x7a\x2f\xb4\x7a\xf5\x57\xc5\x91\xb2\x18\xa6\xd5\xbd\x83\xfa\xd0\x98\x80\x2d\x84\x58\xd3\x19\x4b\x74\x9d\xbc\x71\x31\x65\x32\x49\x43\xbf\x0b\x1a\xa8\x14\x84\xe7\xbc\x35\xab\xe0\x74\x11\xbe\x86\xa6\x14\x73\xd7\x17\x10\x65\xf7\x82\x77\xcf\x7f\x1d\x35\xc6\xb6\x24\x5e\x1a\x80\xaf\x75\xf7\xb5\xbe\x34\x4e\xad\x30\x28\x12\xd0\x98\x45\x56\xd3\xe2\x7b\x51\x81\x8d\xd0\x6d\x73\x6e\x7a\x61\x8c\xd8\xfb\x71\xa3\xeb\x31\xe6\x8e\xc6\x3c\x21\x28\x06\x66\x91\xdf\xae\x2c\x85\x2d\xda\x30\x22\x4f\x89\xeb\x11\xaf\x44\x39\xe2\x3b\x84\x96\x87\x1b\x18\x47\x22\x76\xc8\x77\x24\x68\x38\x14\xc1\xaa\xae\xda\x42\x8f\x76\xb6\x38\xa6\x06\x8d\x32\x44\x55\x5d\x44\x19\x20\xa1\xee\x68\x42\xb8\xff\x3e\xd7\xcc\xff\x52\xcf\x0c\x7e\x69\x9c\x30\xe1\xd5\x8b\xdc\xa0\x11\x5c\x98\xc6\x89\x8c\x72\x36\x28\x99\xeb\xdb\xba\xf1\xae\x89\x61\x88\xd6\x88\x1b\xfe\xfe\x52\x63\x4c\x51\xb7\xed\x83\x67\x9c\xd0\x38\x8d\x6c\x35\x1e\x0b\x9f\x5d\x67\x7b\x20\x08\xaa\xfa\xf4\x45\x8a\x33\x10\xca\xf8\xb0\xdc\x3e\x8e\x4d\x78\x15\xe2\x9c\x13\x5c\x73\x76\x97\xc6\x3b\x05\xf9\x23\x89\xb0\x24\xdb\x3e\xc0\x6c\x67\x3f\x36\x4f\x84\x57\xdb\xc3\x62\x51\xf5\x21\xba\xd8\x7d\x40\x44\x11\x2e\x50\x95\xe8\x90\x1d\xb2\x6e\xd4\xb2\x29\xf4\x11\xda\x85\xed\x64\xf8\xaf\x15\xa9\xc8\xf5\x98\x4f\x3b\x04\x19\x7e\x44\x16\x61\x07\x71\xd7\xd5\xe7\xb3\x90\x25\x20\x9d\x19\x1b\x00\xd7\xe9\x26\x34\x16\xc6\x3a\x77\x89\xfe\xd7\xdf\xd6\xcd\xb7\xa2\x7d\x67\x57\xef\x86\x4a\x91\x88\x81\xc0\xf4\x97\x58\x5b\x1a\x4b\xc9\xf0\x03\x96\x46\x6e\xad\x34\x47\x55\xcc\x58\xf5\x69\xff\x60\x3d\x72\x5f\xbf\xd3\x34\xa1\xb1\x62\x29\x75\x81\x45\x59\x57\xc7\x39\x38\x9e\xc6\x4a\x2b\x7c\x88\xc6\x0a\xe6\x23\xb6\xc3\x7f\x01\x24\x04\xf5\x27\x9e\x2b\x51\x15\xa7\xfa\x82\xd3\x7b\xb4\x01\xf8\x3d\x33\x86\x2c\x4f\xfb\x29\x78\xb7\x7c\x08\x9f\x95\x12\xb1\x9b\x87\xa2\x0f\x58\x96\x45\x77\x12\xcd\xeb\xbb\x56\xf4\xd5\x1b\x65\x62\x96\xeb\x51\xf9\xf3\xb9\xbd\xa2\xb9\x76\xad\xbe\x1a\x9b\x24\x47\x04\xb4\x77\x0d\x58\x54\xfa\x0b\x04\xa3\xbd\x19\x3f\xe2\xfa\x4d\x37\x99\x35\xb1\x7f\x7c\x5e\xde\x6d\x56\x08\x6b\xdb\x1d\x88\x53\xbd\x3b\xac\x1f\x6e\xfc\x0f\x34\x22\xa7\xd6\x51\xe1\x84\x8a\xc3\xd8\x42\x9d\x5e\x9d\x1d\x99\x44\x9c\x60\x6d\xe1\x66\x7d\x77\xf7\x9b\xff\x9b\xe2\x78\xa5\x9e\xe5\x35\x7d\x2a\x09\x51\xd6\xd7\x6d\xd3\xee\x5f\x8a\x09\xc1\x99\x26\xc4\x64\xd4\x0c\xf5\xbb\xc5\x20\xeb\x32\xfd\x29\x09\x8d\x72\x5c\x2d\x1b\xaf\xc9\x86\x6c\xfe\x7d\xbd\xae\x3c\x21\xda\x9f\x92\xa6\x80\x54\x1c\xe9\xca\xa5\xa1\x94\x9f\x30\x15\x45\xae\x81\xf2\xed\xf0\x44\x67\x97\xc9\x4c\x82\xbb\x38\x2a\x13\x88\xd2\x26\x6c\x30\x55\xe4\xeb\x47\x65\x18\x7b\x5f\x5a\xfd\x08\xcd\xd7\x4b\xa5\x9b\x11\x89\xbc\x3f\x2e\x47\x75\xbd\xa5\x68\xc1\x5e\x44\xa5\xdf\xc1\xea\x66\xbf\x30\x49\x15\xd6\xf9\x9d\xc6\xc5\x5c\x6d\x8a\x26\x89\xcc\xb0\x2e\x70\xb0\x30\xf3\xbf\xd2\x01\x9d\x50\x62\x87\x20\x28\x49\x54\x92\x10\x2f\x42\x7f\x83\xbe\xd3\xd3\x0b\x49\x4d\x9e\x67\x03\xea\xad\xbf\xd1\x23\x11\x74\x9a\x64\x4c\xa0\x2c\x6b\xe5\x78\x25\xc8\x19\x68\xf7\xf5\x6d\x51\x89\xb2\x4f\x04\x82\xa4\x35\x4d\x32\x6e\x19\xf0\x97\x76\x9a\x90\x4c\xbf\x31\x4b\xac\xf7\x4d\xff\xc3\xac\x4a\xc3\xd5\x02\x4c\x92\x27\x99\xc3\xec\xcd\xcc\xd1\x69\x92\xeb\x38\xe3\x41\x0c\xfa\xdb\x3b\x43\x53\x9a\xe4\x20\x50\x1d\xb4\x38\x89\x23\x0c\x0b\x50\xbf\xb5\xdf\xdf\xc4\xfe\x3c\x92\x1b\x1a\x87\x1a\xbe\xad\xb7\x4f\x5e\x00\x95\xdb\x76\xbc\x1d\xf0\x4e\x54\x7f\x74\xa3\x75\x6e\x37\x2a\xdc\x27\x4f\xa0\x0b\xd1\x4d\x4d\x07\x67\x77\x01\xb8\x18\xac\x7e\x5b\xe8\x0e\x47\xe8\x0e\x48\x7b\xbc\x9c\xec\xee\x1d\x1e\x01\x08\x03\xde\xaf\xfe\xb9\xea\x8a\x72\x56\xe6\xf2\xc3\x80\x20\x36\xab\xe8\xaf\xc0\x08\x05\xb7\xa8\xdc\xfa\x09\xb7\xaa\xff\x4c\x6c\xbc\x3a\x61\xbf\x17\xde\x72\xff\xa5\x26\xb5\x62\x2e\x3e\x55\xff\xe7\xf6\xcf\x49\x4a\x98\x98\x14\x50\x6f\x08\x67\xd6\xa4\x81\x34\x7d\x9a\x7e\xa9\x4d\x23\x49\xd1\x41\x04\x0b\x99\xf8\x9a\xf9\xc8\x75\x6c\x22\xdc\x47\x5a\x04\x2b\xaf\x05\xbe\x13\xa0\xc7\xf0\x64\x3f\xc4\x58\x3d\x8f\x3e\xae\x78\xfb\x5a\x9c\xdb\x6e\xf8\x38\xcb\x63\x6b\x85\x50\xb4\x68\x7d\x51\x59\x83\xd5\x51\x3e\x95\x72\x92\x23\x64\x71\xb9\xd8\x3c\x85\xea\x66\xca\x81\x67\x30\x18\x89\x39\x52\x84\x25\x6f\x85\xe7\x9c\xc6\x19\x27\x0e\xb2\xd9\x9f\xfe\xa6\x68\xcf\xa5\x78\x9b\xab\x16\xd1\x34\x16\x39\x36\xb9\x5c\x6b\x7d\xd6\xd2\x4e\x63\x69\xc5\xf0\xfe\xc6\x4e\xe1\x3e\x91\x72\x89\x01\x97\x2d\x25\x6f\x9b\x1d\x84\x28\xfd\xda\x74\x48\xd3\x58\x46\x36\x69\xac\xfa\x85\x69\xc8\x18\xc3\xd3\x4f\xb3\x14\x46\x3d\x53\x1f\xa9\x63\xbb\x79\xb5\x98\xdd\xf2\x2c\xb3\x5a\x1a\x27\xa7\x7a\xb1\xb2\xa0\x80\x9b\xba\xba\xca\xcf\xfd\x0c\xef\x94\x66\x32\xd3\xc3\xb2\xf9\xad\xee\x00\x63\xb6\xe9\x17\xe6\x84\xe1\xc2\x73\x07\xfa\x08\x8d\xd5\xe1\xb9\xce\x39\xa0\x69\x4e\x33\x42\xbc\xca\x2c\x00\x4e\xae\xa6\xfd\x67\x2d\xfd\x6d\xff\x88\x75\x4b\x53\x41\x0c\x72\x2a\x5f\xea\xa6\x85\xdb\xdd\xec\x0e\xc9\xc8\x16\x86\x10\xdb\xb2\x2c\x1a\xdd\x4e\xca\xeb\xa9\x4c\x35\xea\x1e\xd8\x8c\xcc\x56\xf2\x46\x3d\xaf\x54\x66\x1c\x0b\x17\x5a\x14\xe5\xdb\x57\xd1\xbe\xac\xc7\x84\x36\x9a\x4a\x25\x10\x70\x89\x2f\xd1\x12\xba\x65\x90\xac\xa4\xa9\x8a\x14\x72\x9b\xd7\xfb\xc5\x6e\x1c\x85\xa6\x8a\x4b\x2c\x07\xc8\xcb\xdb\xea\x23\x53\xa1\x7e\x94\xd2\x0e\x1d\x81\x18\x5b\xfc\x81\xfe\x14\x9a\x11\x3c\x28\x2f\xe5\xab\x7f\xee\x96\xe2\xfa\x61\x43\x25\xd5\x42\x83\x83\x38\x2a\x68\xdb\xba\x99\x70\x8e\x69\x0a\x29\xe5\x3e\x83\x1c\x96\x6c\x9b\xe6\xe0\xbe\x34\x03\xae\xa5\x20\x22\x24\x3c\xdb\x1e\x47\xd0\x5f\xb5\xfa\x3d\xe1\xac\x92\xa1\x6d\x86\xb0\x6e\x06\x93\x3c\x33\x35\x19\xcd\x21\xdc\xfe\x07\xe8\x7e\xd6\xcd\xab\xcd\xfb\x66\xb3\xc9\x38\xb1\xb1\x7e\xcf\x29\x4c\xf7\x32\xaa\x49\x67\x51\x14\x5b\xd3\xe1\xba\x04\x84\xd5\x4f\x3f\x9b\x45\x22\x45\x31\x0e\xc7\x1d\x84\x6a\x2e\x10\xd3\x0f\xc9\x13\x08\xab\x02\xe2\x5a\x66\x03\x8c\xf5\x37\xb1\x9d\x4d\x8f\x4f\x1a\xf3\x54\xdd\x40\xc2\x6c\x2d\xd9\xaf\xbb\xc8\x5a\x1e\xed\xff\x93\x87\x9c\x91\x34\xb6\x66\x86\x43\xcf\x29\x23\x8a\x5b\xf3\x77\x1b\x5a\xac\xca\xcb\x68\x79\xcc\x28\x27\xc6\xa3\x2f\x8a\xee\xed\xb1\x3e\xf7\x19\xc5\xbb\xf0\x3b\x63\xc6\x15\xea\x95\x7d\xd8\x6f\x37\xa2\x13\xb3\x55\x2c\xe3\x3c\xc3\xb4\xe3\x01\x7e\xfa\x72\xe2\x47\x15\x90\xe9\xed\xe0\xb9\x55\xe1\x40\xb1\xba\xd0\x67\xc6\x8d\xbc\x0d\x27\x37\xca\x39\x3e\xb8\x52\x8c\x73\x9e\x18\x23\x53\x69\x16\x47\x1c\xa3\x84\x9d\xe8\xea\xf6\xa5\x08\x7f\xa6\x12\x13\xe6\x56\xfc\x80\xd5\x47\xee\xea\x34\x8b\x63\xc9\x5d\x99\xca\x69\xb5\xcf\x9e\x5b\x9c\x70\x2c\x6f\x96\x20\x34\x34\xb2\x16\x8d\xbe\x76\x23\x92\x88\xe5\xae\x59\x80\xaf\xf2\xec\x66\x26\x82\x21\x06\x7b\x57\x9c\xce\x25\x2c\x36\x7f\xb3\x59\x95\x25\x52\x20\x61\xe5\x05\xc4\x79\x57\xbb\xd3\x26\xdc\xbf\x92\x59\xea\xe8\x3c\x2d\x74\x37\x4f\xbb\xd5\x07\x06\x22\x34\xcb\x74\xca\xad\x82\x89\xbe\x28\x2c\x2d\x3a\xf6\xee\xec\x3a\x73\x26\x9d\x09\xf4\xaf\xee\x20\x27\xb1\x70\x96\xf3\x58\xb8\xef\xf2\x71\x90\x55\x67\x5a\xbe\x7d\x84\x7f\x19\xed\x9b\x99\x64\x02\xdf\x10\x23\x4e\x88\xc3\x47\xa1\xbf\x7d\xbd\xd1\x53\xad\x2d\x9a\x49\x69\xc5\x6f\xb1\x31\x6b\xcd\x7a\xdf\x5f\xa8\x34\x89\xf3\x8a\xb2\xe4\x6c\x04\x37\xb6\x73\xdd\xc9\xeb\xcf\x5c\xf1\x04\x8b\x06\x56\xa5\xe6\x69\xb1\x5f\x1f\x96\x8b\xdd\x7a\x8c\x41\xcc\x14\xcf\x10\xc2\xf9\x00\x4a\xb4\x2f\xe3\xd5\x37\x53\x29\xf7\x48\x8d\x1d\x54\xa1\xbe\x35\x41\x0a\x67\x10\x5b\x9f\xea\x3f\x4c\x19\x92\xf4\x0c\x40\x63\xb9\xe3\xae\xdf\xf1\xf5\xe1\xa1\xf6\x7c\xf6\x11\x7e\x70\xf2\xf8\x0d\xe1\xa8\xd2\xb1\xfc\xfa\xe0\xd6\xb6\xdf\xc2\x11\x80\x51\xe5\x64\x07\xa3\xcd\x7d\xbe\xc5\x65\x86\x5b\x66\x6f\xd1\xae\x4f\xe7\xee\xcd\x49\xb4\x5c\xd9\x98\x33\x13\x33\x03\x93\xa2\x4e\xc0\x62\xfb\x54\x74\xf6\x20\x4c\x62\x10\xb1\x51\xb4\xdb\xca\xa7\x66\x97\xc1\xcf\x90\x66\x46\xd9\x04\xdb\xfa\xa1\x7c\x00\x29\xc9\x8c\xe6\xa9\xe5\x9e\x8b\xba\xff\xc7\xfd\xce\x3c\x12\x80\xca\x4a\xed\x4b\x33\x7e\x08\x79\x24\x73\x05\x7e\xfd\x58\x94\x23\x0f\xd7\xd9\x74\xca\x23\xe0\xb8\xb8\x63\x52\xe3\xb8\x4b\x57\xe7\x45\x4e\x22\x6b\x2c\x67\xa5\xa5\xac\x7d\xda\x21\x6c\x76\xd3\x0b\xce\x09\x8d\x7c\xe0\xfc\x15\x44\xd3\x8d\xb1\x3a\x39\xc9\x6c\xb5\x10\x77\xd4\x42\xf9\x74\x31\xa7\x84\x4a\x8b\xa7\x2b\x17\x97\x31\x04\x64\x7a\x6e\xca\xac\xb3\xc1\x7e\xf1\xc7\x68\x4e\xe6\x8c\x44\xb8\xc6\xbc\x88\x16\xa7\xfb\x87\x3f\x84\x65\x29\xb8\x9e\xbf\x85\x88\x79\xa5\x32\xea\x4f\x15\x8b\xc8\x37\x73\xc7\x05\xb9\x3c\x61\x1a\xc5\x71\x55\x59\xb7\xb6\x33\x3f\xf6\x8c\xa6\x79\x9a\xc6\x48\x11\x2a\xda\x1b\xc7\x19\x1d\x89\x6c\xd3\x3c\x15\x0c\xd1\x73\x07\x47\x10\xff\xc0\xce\xe6\x5a\xce\xea\xce\x90\x51\x4b\x1e\x3d\x8e\xa0\x89\xfe\x10\xa3\x58\xd2\x29\x45\x73\x84\x95\x38\xe3\x85\xcf\x27\x52\x9e\x71\x6b\xe8\x55\xa8\x9a\xa8\x50\x7e\xcd\xf3\x48\x83\x97\xe8\x7c\xdb\xd7\xab\xf7\xad\xfa\x3c\x4f\x6d\x34\xa2\xdb\xb3\x33\x8e\xf1\x51\x5e\x2e\x22\x16\xa1\x4b\x58\x7d\x5c\x54\x75\xf5\x76\xaa\x2f\xed\x6f\x93\x84\xfb\x1d\xd5\xb2\xff\x50\x86\xc4\x4d\xbf\x38\xde\xbb\xc6\x95\xa8\xa0\x9a\xb6\x89\x72\xc1\x94\x71\x4b\xca\xe3\xe6\x00\xba\xe8\x0e\xde\x29\x82\xe6\x22\x21\xf6\x9e\x7b\xb8\xe8\x0c\x50\xe3\x87\x01\xf5\xae\x1a\x7d\x9a\xbf\x35\xbb\xe2\x58\x61\x75\xde\x9f\x48\xb2\xd8\x07\xc9\xc1\x8d\xee\xd9\x36\xd4\x2c\x74\xae\x2e\xf5\xf2\xed\xbe\xd6\xae\x77\x4e\xc6\x4a\x36\x34\x97\x31\xf3\x38\x9d\x27\xb0\x0c\x85\x81\x79\xd4\x1f\x96\x5e\x4e\xf6\xbe\xa8\x2c\xce\xfa\x5d\xbe\x3c\xbd\x64\x99\x64\xe8\x76\x5b\xb4\xdf\x45\xd3\x88\xaa\x7b\xc3\xf5\x70\x56\x8a\x9a\xac\x50\xb9\xa2\x1c\xd7\xd0\xee\xef\xed\xa0\xb9\x4a\xa8\xb1\x2a\x25\x13\x3d\x2c\x9a\x2b\xa9\x30\x40\xb8\xab\x8f\x96\x48\x80\xec\xe7\x5d\x71\x95\xa4\x49\x73\x9d\xe6\x84\x87\x96\x81\xc5\x91\xcd\xd2\xa9\x1c\xfa\xcc\x15\xa9\xba\x0d\x88\x77\xa9\xca\xfb\x88\x3a\x87\x3c\xc7\x8c\xb8\x5d\x7d\x13\x21\xdd\xcf\x4d\x94\xa1\x08\x8f\xae\x37\xe1\x6a\x0d\x05\x27\xc2\x55\xe9\xfe\x66\x15\x75\xf3\x17\xe5\xc0\xdc\xa4\x0c\x03\xa3\xc3\xa1\x2b\xaa\xb7\x6d\x23\x54\x09\x2b\x6f\x12\x74\xa5\xc9\x9a\x9b\xd4\x8c\x82\xe9\xed\xcd\xfa\xde\x8a\xb0\x5d\x6d\xbc\xe4\x26\xd7\x56\xb0\xa0\xb2\x06\x31\xee\xf6\x7e\x2f\xba\x97\x4f\x9a\xf6\x22\x4a\x29\xd2\xb4\xce\xa2\x6d\x9f\xab\x81\xf4\xaf\x47\x02\x3b\x54\x44\x19\x95\x56\xd1\xab\x50\xc2\x8b\x62\x51\x41\x38\x47\xa4\xc7\x50\x72\x12\x44\x44\xd4\xb5\x46\xbf\x88\xf6\x7d\x05\x47\x10\x65\xf3\x56\xb4\xf0\xee\x13\x83\xcd\x07\xcb\xa6\x20\x1a\xf0\x54\x81\x1b\x0d\x13\x3a\x85\xa0\x79\x42\x2c\xc0\xb6\x38\x77\xf5\x09\x74\xa1\x8a\x4a\x90\x70\x58\x70\xab\x3c\x58\x9f\xce\x65\x31\x2e\x6f\xf8\x11\xcc\x68\x6c\x4c\x7d\x1f\x54\x24\xa7\x33\x48\x70\x95\xe5\x43\x8e\xbf\x1f\xc4\xb1\xfa\x93\x1b\xc4\xaf\xdc\x2f\x76\xfb\xf5\xd3\x9f\x87\xfd\xd7\xa7\xf5\xee\xeb\xf6\xce\x57\x75\x45\x2c\x22\x42\x47\xc8\x91\x27\x94\x84\x7b\x27\x2a\x43\x45\x2c\x15\x22\x0e\xac\x67\xc3\x1d\x98\x70\x81\x89\x63\x79\x6d\xff\xb5\x7e\x98\x84\xa8\xfe\xb8\xa6\xd8\xce\xf1\x96\x3b\x4e\x79\xdd\x7f\x3c\xa5\xb6\xfa\xdd\xbe\x4e\x78\x51\x22\xcd\x22\xac\x5f\x2d\x37\xfb\xd5\xdd\xe2\xdb\xfa\xb0\xb8\x1f\x9c\x7a\xa8\x48\xb5\x95\x69\x5a\xb4\x7d\xf4\xec\x5c\x2e\x66\xfb\xad\xc8\x78\x84\x75\x5e\x40\xbb\xe3\xdf\xae\xd5\xd0\x45\x96\x1a\x44\x6b\x74\xfd\x0e\xd1\xed\xeb\x85\x7a\x29\xe0\x47\xb8\x83\x99\x48\x0c\xf3\x75\xc7\xbb\x77\xb0\x81\xf9\xc9\x8c\x15\x23\xb5\x01\xd0\xe1\x11\x9a\xc3\x4d\x5d\x96\x22\xcc\xd1\x9c\x70\xa4\x6d\x6f\x37\x8b\xf0\x27\x21\x73\x35\xaa\xa6\x2d\x1b\x71\x3c\x82\xfe\x56\x97\x97\x00\x98\x10\x22\xa3\x88\xb0\xbd\x5f\x6c\x1e\xa6\x72\xf5\x54\x88\xdc\xca\x0a\x4c\x34\x87\x5c\xc5\xe1\xfa\x65\x0a\x15\x63\x9f\xbd\xac\xeb\xd7\xcb\x19\xab\x48\x93\xe9\x2f\xc0\x0a\x0f\x1e\x47\x69\xd6\xec\xa9\xca\x98\xa2\x18\xba\x6b\xc6\xf4\xe7\x68\xe7\x7d\x12\x21\x63\x86\x11\x83\x77\xaf\x7c\x02\x9c\xda\x77\x7d\x2e\xdb\x3d\xc1\x8f\xa2\x2d\xea\xea\xa1\xee\xb0\x4e\x33\x9e\xb7\x32\x8d\xa4\x83\x74\xdf\x8b\x5f\x9b\xce\x15\x62\x5b\x6c\x91\x61\x1b\x33\x10\x69\xfd\x47\x14\x91\xd2\x16\x27\xde\x7c\xf5\x6e\x36\x1b\xfa\x77\x3a\x45\x39\xf3\x27\x7c\x3e\x33\x15\x62\x3f\x4a\x2a\xe2\x62\x53\xa4\x8d\x5c\x2b\x42\x08\x4d\x72\xdc\x50\xdc\xdd\x79\xf0\x92\x81\x54\x68\x16\xe3\x94\x0b\x8b\x54\xdd\x1c\xc4\xa4\xe4\x21\x34\xd3\x7c\x00\x4d\xad\xc2\x9b\x8f\x16\x15\x57\x39\xdf\x54\x80\xa4\x4e\x9a\xad\xfb\x5a\xf4\x4f\xea\xa6\xae\xde\x7b\x9c\x4e\x2f\xd2\xe4\x2c\xb1\x44\x34\xeb\xa0\x17\xb6\xf6\x2b\xeb\xb8\x8c\x28\x89\xf2\x6b\x9e\x8d\x33\x77\x7c\x2a\x23\x01\x58\x14\xb1\x60\x6d\x07\x15\xc4\xce\xe1\x95\x64\xe2\x3d\xc7\x7e\x72\xec\xc3\x40\x48\x12\x27\x7d\x73\xf6\x62\x49\x1d\x1c\x8a\xea\x20\x1a\x59\x60\x80\x8d\xda\xaa\x07\x85\x90\x1b\x7f\x65\x24\xce\x20\xf3\x20\x51\x54\x24\xbd\x82\xae\xec\x13\x64\xcf\x89\x1a\x12\x80\xcd\xcd\xf5\x70\x43\x32\x61\xa9\x13\x6e\x7f\x6b\xb4\x25\x6f\xa0\xf2\xc8\xe4\x11\x49\x1e\x6b\x64\xd7\x15\xd5\x28\x46\xbf\x12\x8d\x48\x2e\x00\xfb\x07\x45\xbb\xae\xba\xa2\x2b\x3f\x2a\x50\xca\x58\xe7\x4c\xb9\xfe\xec\xec\xcb\x62\x13\x61\x1b\x73\xb3\x5d\xfa\x25\x51\xc6\x26\xf3\x84\xdc\xbb\x5a\x09\x84\xbb\x84\x43\x12\xaf\xad\xbd\xc8\x9b\xa6\xae\xac\x1d\xd0\xa7\xb0\x16\x99\x80\x15\x2b\x38\x7c\xa2\xb2\x40\x65\xca\x39\xae\x14\x8f\xc5\x7f\xff\x2b\x1e\x45\x53\xce\x73\x1e\x99\xea\x08\x93\xae\xaf\xe2\x15\x4b\x20\x01\x4e\x2d\xb3\x34\xc5\x18\xf5\xbe\xe8\x5e\x9a\xa2\xfc\x26\xca\xd7\xb7\xa6\x08\xf3\x2c\x8f\x05\xd2\xce\xbc\x61\xc9\xd4\x79\xcc\x0f\x4a\x2c\x3f\xd9\x31\xa8\x77\x41\x6e\xf4\x83\xeb\xcd\x33\x40\x23\x93\x09\x0b\x46\xe6\x39\xa8\x7c\xa8\x08\xd6\x1a\x66\x3f\x42\x44\x96\xd3\x64\x00\xda\x47\x68\x48\x14\x45\x91\xff\xb0\xc8\x53\x6d\x17\x39\x71\x3a\x88\x4a\x1f\xfa\xcb\x2c\x0f\x12\x2a\x30\x85\x2a\x82\x01\x12\x95\x42\x46\x34\xd4\x6d\x31\xab\x0c\x47\xc0\x46\xd9\xfd\xdc\xd9\x15\x1d\x78\x28\xe8\xf4\xe2\x05\x68\x8f\x00\xea\xe7\x5f\x51\x1d\xe7\x40\x4f\x37\x50\x72\x92\xf7\x33\xc1\xe9\x0c\x7a\xb7\xf7\xe9\xd9\x64\x4a\xa5\xf1\xb8\x25\x0d\xbf\x06\xf5\x1f\x2a\xa5\x50\xa8\xaa\x82\x3c\x99\xef\x00\xaf\x96\x51\x8a\xe9\xf0\xba\xed\x8a\xd3\xd0\x35\x97\x52\x40\xe2\xcc\xc3\x6f\xeb\x06\xbd\x2e\xe6\x6d\xef\xd9\x17\x43\x8a\x72\x13\xbb\x4b\xd5\xbe\x14\x55\x38\x91\xa2\x06\x01\x8a\xbf\x17\x9d\xaa\x8b\xd0\x33\x92\x2a\x51\x58\xdc\x7c\x7c\xda\xac\xd6\x07\x42\xc2\xdf\x0d\x47\xe0\xd5\xc1\x76\x86\x45\xa0\x7a\xce\x1e\x9e\xce\xad\x11\xd0\x02\x45\xbf\xda\xdb\xe7\x87\x9b\xdd\x7c\x88\x4a\x24\x1b\x35\xb7\xef\xeb\xca\x12\xff\xae\x08\x3e\xf9\x3a\xb2\xd4\x46\xa0\xae\xdc\xa1\x1e\xf1\x0b\x25\x64\xb6\x66\xbb\xaf\x4f\x12\x0b\xed\xe1\xef\x22\xd2\x03\x01\xc4\x4a\xf8\x3b\x35\xa3\x4f\x28\xd8\x12\x44\xae\xc8\xd0\xfe\x0e\xdc\xa6\x8f\xaa\xbb\x12\x54\x6e\xbb\x8f\xa2\x7d\xd9\x5e\xba\x95\xf0\x88\x1e\x77\xdc\x87\xf8\xbb\xc7\xf5\x6a\xff\xb4\x3e\x2c\xfb\xb0\xea\xcf\xc3\xe2\xe6\xdb\x66\xb7\x7d\xfa\xf3\x70\xb3\xfe\x76\xd8\xaf\x17\xf7\x87\xc5\xdd\xdd\xd6\xe3\xa3\xa4\xd1\xb9\xa3\x81\x80\x7a\xb5\x4a\x5a\xae\x1c\xfd\x6f\xe6\xb6\x7b\x45\x62\x43\x07\x74\xfb\x9d\x70\xb4\x93\xab\x3b\x9a\x22\x3a\xc5\xd7\x7b\xf9\x65\x1c\xf6\x29\x4a\x72\x5c\xc4\xee\x7f\x3d\x81\xaa\x1b\xed\x65\xa3\xae\x99\x1e\x51\x45\x13\x33\xc2\x1f\x07\x48\x9d\xad\x2f\x5c\x9d\x7d\x8a\xe6\x56\x8e\x0e\xd9\x11\xf5\x2f\xff\xbd\x8c\x53\x0c\x43\xbf\xd5\x17\xf5\x32\x5a\xa5\x14\x4b\x22\x4c\x1f\x1e\x4b\x31\x61\x26\xa9\x38\xb2\x0d\x95\x06\xba\xc6\x95\x4c\xfc\x94\x55\xb1\xa4\x98\xfb\x1f\xac\xc4\xb2\x8d\xaa\xad\xf4\x73\x48\x7e\x55\x12\x11\x66\xf5\xe1\xab\x63\xeb\x2c\x1d\xc2\xa1\xc4\xc9\x55\xd8\xb5\xcf\xea\xda\x4f\x27\xad\x4a\xa8\xe6\x4e\x35\xc1\xe6\x5c\xfe\xef\x31\x0d\xf8\x4a\x04\x14\x0c\xfb\x32\xa1\x99\x7f\x58\x89\x4c\xb4\x6d\xcc\x20\x1c\x71\x96\x76\xa8\x54\xe5\x38\x5d\xa5\x7d\x19\x0f\xcd\xe0\x23\x4b\x95\x60\x19\xd6\xb1\xbe\x84\x20\x54\x09\x06\xb6\xa7\x00\xea\xd2\x14\xdd\xdb\x97\x4b\x70\x40\xa3\x4a\xe8\x5c\x8e\x5d\x63\x26\x13\x52\xc9\x48\xa0\x9e\xc2\xb7\xf5\x0e\x1d\x17\x71\xf2\xdd\x3c\x3f\x8d\x59\x24\x4a\x12\xcb\x64\xdb\xbf\x9d\x5f\xea\xd0\xd3\x57\x92\x26\xca\xf9\x41\x38\x35\x2d\x87\x5e\x1b\xbd\xb8\x24\x79\xef\xaa\xf6\xb1\xe4\xe7\x3f\x6c\x21\xf2\x1f\xe3\x7a\xa4\x92\x4c\x78\xb6\x80\x33\x3c\xc0\x80\x67\xf6\x40\x24\x03\x8c\x0a\x57\xdb\xdd\xee\x06\x4e\xe1\x76\xc9\xdc\x44\x36\x2b\xe8\x44\x79\x70\x3d\x8f\x00\xd4\x52\x2a\x02\x5c\x7c\xb0\xbe\xd2\x4f\xbd\xff\xab\x8b\x1a\x55\x8a\x25\xde\xc6\xa7\xab\x1b\xb0\xf4\xd2\x52\x4f\x27\x95\xe2\x24\x71\x51\x3d\xc6\x31\xd3\xc5\xf2\x5d\x9d\x6d\xfa\xdb\x94\xb0\x69\x1a\xca\xe7\xeb\x11\x96\x5b\x29\xc5\x85\xbb\x37\xb7\xe2\x04\xd7\xdc\x59\xa8\x52\x5a\x44\xe0\xf1\xaf\xc5\x49\x34\x6f\xde\xca\x7a\x36\x50\x27\x29\x2a\x7a\xfc\x5e\xc2\xf0\x0e\x6a\x11\xa1\xee\xee\xa3\x68\xdb\x55\x7d\x42\x59\x1e\x40\xa9\xae\xe9\x87\xc1\x68\x84\x0a\xdd\x15\xdd\x04\x82\xa7\x4c\x9e\x11\xcf\xb9\xee\x5c\xdc\xbf\xa9\x54\x7d\x9a\x5f\xa7\xd1\xc6\x4a\xbb\x38\xc9\x0a\x4b\xb8\xbd\x12\xc5\x69\x42\x08\xa2\x8d\x4e\xe2\x97\xaf\x21\x8c\xcb\x9a\x9a\xd0\x0c\xa7\x8c\x7b\xdc\x57\x93\x0d\x4d\x58\x86\xe1\x48\xd3\x9e\x77\xaa\x80\xa1\x71\xa2\x09\x8f\x31\x93\x34\xd6\x20\xd5\x2e\x66\xd4\x1f\x8c\x53\x5f\xb6\xeb\xf7\x92\x27\x51\xbd\xce\x4f\x6c\x72\x9f\x0d\xed\x3a\xd1\x7c\x46\xd8\xd6\x94\xc9\xd4\xda\x03\x75\xea\xa5\xdf\xbf\x1d\xe1\xd1\x1f\x4e\x33\x5c\xa6\x9c\x78\x81\xe5\x40\x8c\x26\x80\x66\xc4\xd6\x2c\xbf\xf5\x4b\xaf\xb0\x8c\xb9\xab\x93\x48\xb3\xd4\xce\x40\x0c\x80\x9c\xbc\xd9\x68\x45\xd4\x2c\x85\x3c\x0e\x71\xd8\xa1\x0e\x76\x64\x7e\xad\xd0\x0c\xb2\xd8\x2a\xee\xdb\xeb\x40\x23\xb6\x3e\x4d\x41\x53\xbe\xc9\x4b\xa1\x39\xe7\x08\x18\xd8\x6f\xee\x93\xbf\x2e\xfa\x69\x9e\x51\xe6\xf0\x8a\x06\x1a\x51\xa2\xa8\xf7\x18\xd5\xa4\xb9\x00\xfc\xf2\xc3\x41\xf9\x92\xd8\xc7\xb6\x5b\x54\xc7\x2c\xa1\x7a\x2e\x97\xee\x5f\x8f\xe9\x48\x01\x7c\xa8\x13\x0e\x74\x61\x1d\x43\x86\xd9\xc7\xb7\xc5\xdd\xf3\xfa\xb0\xbd\x3d\x3c\xef\x3d\x9f\x43\x27\x52\xe1\x4b\x81\xe8\x4a\x71\x2e\x82\x25\x02\xd5\x89\xd1\xd8\x4a\x28\xf4\xc1\x8c\xf2\xcf\x4f\xa9\x1e\x3a\x03\x63\xad\xec\x3d\x15\x1c\x65\xa2\xdc\xc1\x3c\x91\x99\xd5\xad\x34\x80\x25\x97\x20\xa5\x3c\xdc\x6f\xc1\x22\xc4\x34\xef\xfb\x68\x3e\x5c\x8b\xd0\x04\x9b\xb6\x5d\x53\x9c\xa6\xbf\x5a\x68\x1a\xbb\x88\xe8\x41\x9c\x60\x6b\xae\x16\x51\xb5\x80\x0c\xf9\xbb\xbb\x33\xa8\x42\x94\xf8\x46\x86\x47\x82\x6a\x9d\x16\x11\x73\x29\x45\x73\x2f\x7e\x3d\x42\xf3\x08\x4d\x1b\xb6\x08\xad\x63\x15\xa5\x23\xd0\xcc\x1c\xd8\xad\xb5\x48\xb0\xc1\x82\xb8\xde\x75\xf7\x12\xe4\x39\xdc\x71\x20\x82\x59\xcf\xe8\x87\xfd\xd3\x62\xb5\x3f\x3c\x3e\x6d\xbf\x6d\x6e\xd6\x4f\x87\xc5\xcd\xcd\xd3\x7a\x17\x9e\x88\xc9\xb8\x25\x7f\x9d\xeb\x6a\xd0\xc5\xf0\x56\x35\xfd\x71\x8b\x11\x9d\xe8\xaf\xf4\x91\xee\x6d\xdd\xf8\x6d\x65\x44\xeb\xd2\x46\x30\xd4\xe8\xf9\xd7\xd3\x1f\xce\x1d\xa3\xff\x42\x77\x14\x22\xa7\x8c\xa5\x8b\x1f\x23\x05\x0b\x88\xa8\xf1\x3b\xa2\x9b\x4b\xe3\x2d\x23\xf3\xa3\xa4\x00\x17\x83\xfb\x9d\x7f\x64\xa2\x3b\x9d\x19\x40\x59\xac\xd0\xfd\x11\x45\x2e\xfc\x93\x05\xaa\xc8\x88\xcc\xb8\xaa\x2b\x5d\x7c\xc6\x51\x9d\x6e\x59\x40\x95\xd5\xaa\xc2\xbb\xfe\x3c\xdc\x6e\x60\x11\xc7\xda\xeb\xcd\x45\x09\xd1\x85\xbf\x32\xe5\x85\xf7\xb1\xbe\x6a\x01\xe8\xcb\xb7\x7d\x23\xd4\xeb\x66\xf6\xea\x03\x8b\x53\x74\xf4\x28\xda\xbb\xa2\x7a\x9d\x35\xbe\xfc\x98\x14\xd0\x6a\x0b\x7e\x75\x37\xd0\x76\x4d\xfd\xf6\x50\x54\xff\x2b\xe6\x67\xd2\x14\x0b\xa4\x98\x22\x8d\xe2\x42\xe0\x8a\xe0\xeb\x77\x1e\x32\xa3\x29\xc8\x00\xb8\xb6\x8d\x2d\x8f\xce\xfd\x4b\xb9\x97\x0f\xfd\xc7\x28\xc4\x3c\x46\x15\x54\x5c\x43\xbe\x34\x00\x15\x8c\x08\xb9\x1f\x2e\x6a\x10\x6b\xe6\x0b\x69\xcb\x4e\x8d\xe7\x49\xa2\x00\x29\xad\x9d\x78\x1d\x21\xc3\xa7\x3f\x3e\x8d\x29\x82\x89\xee\x37\x0f\x73\xb5\x77\x0a\x69\xca\x31\xb1\xd7\x50\x16\x3f\xae\xf8\x91\x4c\xc2\x7d\x48\x15\xcd\x9c\x1d\x4a\x71\x2e\x70\xa6\x37\xc1\x0c\x84\x42\x16\x07\x72\x85\x7d\xb2\x0e\x48\x77\x35\xc5\x81\x9c\x03\x82\x55\x90\xbd\x4c\x0e\x16\x3c\xe1\x8e\x89\x28\xf5\x2a\xbc\x5f\xa0\x02\xb7\xad\xce\x75\x96\xa7\x53\x41\x44\x59\xa6\x83\x21\xca\x73\xd5\x06\x03\xa6\xfe\x98\x60\x03\x98\xf3\xbe\xa8\x3c\x78\xed\x0a\xfd\x18\x84\x4e\x11\x01\x80\x96\x1d\xdb\xcb\x70\x51\xc6\xaa\x75\xe2\x02\x3f\xb5\x73\x75\x23\x24\x10\xa4\x5c\x1f\x74\xbf\x8b\x9e\x8a\x0a\x56\x2f\xa2\x7f\x2d\xa1\xd9\xbf\x9d\x67\xd5\x78\xd0\x34\xb1\x4e\x1a\x9e\x7f\xc2\x66\x03\x20\x8f\x11\xb0\x83\xb4\x6a\xbb\x9e\x25\xfe\x62\x40\xd3\xdc\x15\xc0\x1e\xb7\xdb\x3b\xdb\x3a\xa4\x99\x3f\x6c\xa2\x2c\xb7\x0d\x36\x04\xc7\xdb\xed\x75\x10\x81\x00\xc3\x33\x6c\xb3\x04\xcd\x35\xb4\x0a\x80\x62\xfa\x7a\x99\x28\x26\xcc\xb1\x79\x0e\x9d\x75\x16\x9a\x0f\x48\x11\x79\x7a\x5b\xd7\xf7\x9e\x02\x3b\x91\x0c\x30\x51\xce\xb1\xb2\xb2\xec\xe3\x3d\xf5\xe2\x0c\x95\x66\xa7\x21\x51\x62\x0b\xae\xfe\xbe\x39\x77\x96\xc9\xf4\x33\x44\xca\xd8\x4a\x80\x95\xe5\x3d\x2c\x76\xa0\x1a\x98\xf6\x53\x0d\x31\x90\xe7\x81\xaf\x70\x2f\xaa\xb7\xb1\x92\xca\xac\x0b\x67\x28\x8b\x10\x8a\xb9\x6c\x40\xbc\xca\xa2\x6b\xd7\x4f\x2b\x1a\x8d\x83\x4e\x43\x39\x75\x62\xd9\xdd\xe1\x54\x54\x37\xeb\x7d\xbf\x42\xd8\x5c\xf0\xbe\x6e\x60\xff\x22\x66\xbd\x12\x43\xe3\xcc\xaa\x58\xd5\x4d\x77\x3d\xc9\x36\x54\x46\x58\x78\x3f\xd8\x76\x4f\x9f\xde\x4f\x79\xab\xd3\x77\xc5\x30\x46\x72\x2b\x83\x74\x3c\x96\xb0\x87\xb6\x43\x0f\xc8\x21\xea\x32\xcc\xcd\x87\xb2\x16\x7a\x64\x80\xd7\x1f\x00\xec\x1e\x89\xb2\x74\x89\xe4\xad\xcb\x47\xfd\xdb\x61\x78\x14\xa3\x74\x64\xfb\x72\xe9\x74\xfd\x73\x2c\x3e\x33\xdb\xc7\x0d\x97\x5a\x46\xa1\x4d\x35\x8e\x20\x4d\x2c\x62\xae\x66\x14\x3a\x7f\x2c\x85\x1c\x15\xd8\xdb\xfa\xd2\x28\x98\xa0\x89\x8d\x20\x2a\xb7\xd1\x20\x56\xd1\x21\xac\x6e\x46\xe4\x14\x21\x20\x96\xfa\x34\x20\x03\x8d\xd0\x0a\x97\x8e\xc3\x31\x20\x85\xfc\x21\xc9\x2c\x8b\xdc\x7e\xc6\xba\x39\x39\x74\xca\xf7\x17\xa8\x9c\x05\x67\x7f\x77\x79\xe4\x3e\xa2\x24\xc3\x80\xf5\x4b\x5d\x6a\xa8\x96\x97\xd2\x5a\x28\x4e\xa6\x81\x02\x8e\x68\x4d\xed\x1c\x9c\xb0\x42\x76\x6d\x9f\x35\xa0\x59\xec\x14\x99\xfa\x38\xeb\x14\xbc\x3a\xa9\x31\x69\xee\x31\x5b\x8b\xa7\xa7\xc9\x9d\x65\x51\x44\x6d\x17\x5d\x5e\x9a\xea\x61\xf7\x78\x7d\xd5\x64\x51\x14\x73\xe9\x58\xe2\x3e\x24\x3c\x7c\xd9\x5c\x67\xc2\xb2\x28\x4a\x35\xf6\x5c\x1b\xd1\xc1\xad\x2f\x03\xfe\xe6\x0e\x52\x10\x04\x3c\x30\xb1\xa8\x74\x53\x9f\xaf\x05\x6f\xfd\x40\xc5\xad\xaa\x9d\x7a\xb5\xdd\xd1\x49\xa9\x92\x45\x2c\x8a\xd0\x95\xe6\xe0\xbb\x57\xc8\x62\xfa\xd0\x08\x98\x45\x8c\xb3\x94\x60\x0b\xb9\x70\x72\x8a\x4f\x97\xd2\x6b\x72\x67\x57\x83\x0d\x16\xb1\x2c\x75\x26\xa3\x55\x34\x6a\xcf\xb2\x88\xe5\x91\x1a\x9b\xdf\x8d\x7d\xf2\xe7\x3b\xd9\x55\x91\x48\x16\x31\x65\xc9\x24\x42\x7b\x23\xc8\x27\x78\xb7\xdc\xb1\x88\x69\x85\x05\x0c\x54\x10\x08\x5f\x6f\x72\x93\x0e\xc5\xbd\xaf\xfb\xed\xb4\x6f\xe7\x86\x71\x96\xa2\x43\x86\x84\x63\xa8\x8b\xb2\x88\xa7\x31\xe2\x6e\x30\x82\xfa\x0e\x85\x0f\x73\xfc\x61\x49\x11\xbd\x12\x7c\x0c\xfd\x81\x38\x63\x58\x62\x33\x00\x83\x79\xd3\x2b\x54\x8b\xb2\x9c\x7d\x6f\x92\x68\x9e\x4f\x2d\x7c\x3f\xcf\x22\x58\x94\x46\x0a\xe3\x25\x57\x4e\x3c\x3c\xad\xbf\x2f\x9e\x6e\xfc\x57\xa7\xdc\x8a\x5d\xee\x9e\xa7\xb2\x47\xfe\x70\x6a\xdd\x3d\xcf\xe2\x0d\xd3\x7c\x64\x6b\xfb\x83\x19\xd5\xd4\x76\xd2\xdd\xba\xa7\xff\x92\x39\xfb\x5e\xf2\x8b\x45\x19\x27\x3a\x0f\xd1\x7e\x23\xc2\xed\xcc\x53\x81\x35\xbb\x17\x28\xf5\xc8\x60\x8e\x45\x42\x32\xee\xc1\xaf\x75\xd5\xc1\xac\xc0\xcc\x22\xa9\x84\xc5\x9b\xb9\x90\xcc\x9b\x8c\xb1\x48\x19\x8e\x75\x87\x4b\x85\x75\x93\x41\x34\x9c\x45\x9a\x48\xb4\x73\x45\x54\x54\x9f\x09\x8c\xb0\x0c\x2c\xd2\x79\x8c\x78\x46\xa7\x13\x85\x59\xe8\xdf\xfd\xb1\xd3\xa9\xaf\xa5\xc2\xc8\xea\x06\x1e\x60\x2c\xbe\xc2\x22\xe0\xd6\xce\x6b\xb1\x5c\xae\xc6\x07\x08\x61\x1a\x43\xa8\x17\xd1\xf4\x99\xe5\xa3\xf5\x17\x09\x47\xb5\xa4\xc6\x4b\x03\xe3\x7c\xc7\x00\xe5\xea\xdb\x4a\x08\x58\xb2\x80\x23\x01\xf6\x33\x74\x22\x21\xc0\x08\xd5\x4e\x3b\xca\x26\x40\xd6\xb4\xe3\x63\x4c\x28\x23\x2c\xe7\x18\x94\x1e\xb0\x14\xbd\x7f\x19\x74\x8d\x3f\x6d\xce\xf7\x1f\xb4\x82\x77\x36\x5f\xd9\x95\xa2\x7d\x99\xbf\xa5\x84\x13\x95\xd8\xbd\x50\x89\xb2\x7d\x82\xf3\x27\x90\xa1\x8f\x6b\x2a\x8c\x70\x91\x67\x5e\x6d\xc5\x62\xd4\xfd\xef\x8d\xb9\xdb\x06\x91\x0e\x7c\xf5\x25\x22\x71\x92\x22\x13\xfa\xae\x3e\x3e\x61\x29\xe4\xbb\xd7\x71\x9a\x65\x31\x8c\xc4\x79\x2a\xf4\xe0\xae\x72\x75\x89\x22\x31\x58\xe3\x2b\x94\x42\xf2\xef\xfc\xd4\xc5\xce\x4f\x59\x92\x90\x48\xcb\x51\x5b\x68\xf6\x7d\xa9\x8e\x70\xc3\xdf\xed\x17\xfb\xe7\xdd\xe1\x71\xb1\xf1\x2f\x37\xc9\x55\x82\x55\x5e\x55\xd7\x25\xc6\x02\x61\x87\xef\x43\x90\x1c\x79\xe4\x03\x76\xe7\x8a\xe3\xcd\xfc\x52\x04\x49\xd1\x83\xe2\xb6\x5b\xf9\xf3\x08\x1e\xa1\xcf\xf2\x41\x59\xed\xc6\x65\x79\x81\x73\x53\x4c\xb1\x71\x76\x98\x18\xe3\xe1\xab\x87\x3a\xa4\xdc\x8f\xa5\xa8\x86\xf3\x39\xf3\x48\xb7\x48\xba\x18\xf3\x3a\xfd\xe9\x4a\x69\x98\x11\x21\x09\xe2\x47\xd0\x0f\xa3\xaa\x40\xd9\xe2\xea\x55\x6a\xce\xfc\x4d\xbd\xfe\xf4\xa5\xb0\xca\xa4\x36\x11\xb2\xcb\xdd\x75\xf8\x11\x23\x2a\x56\x28\x3f\xff\xda\xaa\x1b\x87\x6a\x7e\x87\x9f\xbb\xbc\x47\x09\x33\xa2\x52\x2b\x9a\xe7\x45\x3b\xfc\x0d\x51\x12\x72\xe1\x55\x23\xe6\xfe\x25\x8c\x28\xed\xb4\x63\x30\x80\xde\x8b\xfe\x93\xd3\xb9\xa6\x8c\x9d\xf9\xd6\xf6\xee\xd8\x88\x93\x3f\xb5\x4e\x08\xce\xfc\x00\x95\x9a\x85\x0c\xe1\xb9\xeb\x34\xc5\xca\x86\xeb\xf2\xfb\xa0\x73\x64\x43\xc2\x88\xce\xac\x00\x71\x30\x1d\x9c\x50\xf6\x67\x77\x49\x2b\x81\x2f\x49\x57\x9c\x60\x5f\x3f\x57\x28\x83\x7d\xf3\xf5\xeb\xfd\xbd\x3f\x1d\x04\xbf\xa4\x51\x90\x36\x7d\x2c\x90\x51\x2c\x6f\x15\xed\xd4\x5c\x78\x3e\x2a\xcb\xdc\x96\x79\xcd\xe7\x69\x34\xdb\x47\x4b\x9a\xc9\xcc\x80\x4f\x6c\x07\x70\x15\xa3\x11\xa5\x08\x69\x08\x24\xee\xdf\x41\x0a\xb9\xbc\xbc\x59\x52\xc0\xf4\xe9\xd0\x88\xcb\x4c\x86\x2f\xbf\xa2\xff\x19\xc6\x29\xe5\x72\xb3\xbb\xa2\x82\xe7\xf3\x1a\x01\x52\x87\xf3\x48\x76\xf1\x1f\xb3\x53\xc7\xdc\xdb\x13\x78\xe3\xed\x77\xf4\x2b\x46\xa3\xc4\x2e\x34\x63\xf6\xa5\xd7\xd8\x08\x60\x13\x46\xa3\x9c\xa0\xa4\xc8\x77\xf1\x2a\xfa\x7f\x86\xba\x0a\xa3\x91\xe1\xf1\xd0\x8b\x5f\x16\x7a\xf6\x1b\x09\xb7\x48\xff\x61\x7e\xf9\xb2\xcb\x6c\x5c\xcc\xad\x3d\xff\xb4\x38\xc3\x7e\x0e\x61\x2c\x25\xb9\xb6\xec\x38\x7f\x77\x7d\x77\xf5\xea\x86\xeb\x3e\x44\x69\x82\x49\xc7\x17\x71\x82\xdd\x98\xb6\x31\x1b\xc7\x32\x82\x25\x36\xa1\xf5\xa9\xae\xe0\x1d\x16\xeb\xfa\x7e\x4d\xb9\x4a\x10\x24\x60\x84\xd3\x4a\x1b\xeb\x40\xfb\x31\x90\x45\x23\x77\x2f\xd7\xde\xbf\xfe\xe0\xb8\x91\xd6\x13\xb4\xbf\xd4\x7e\x49\xb6\xad\x7c\x7f\x0b\x62\x66\x0d\x16\x4b\xd1\x76\x3b\xf5\x02\xfa\x52\x82\xde\xd7\xe7\xe7\xb3\x1f\x91\x10\xab\x0b\xd6\x3d\xc1\xd1\x51\x1c\x9b\x30\x3f\x13\x45\x70\xba\xbf\x88\x76\x7b\xee\x03\x3a\x1f\xb5\x41\x33\x06\xf6\x13\x9a\xb9\x0f\x64\x51\xc6\x5c\xb4\x7c\x57\xc8\x46\x34\x85\x78\xa7\x5c\xe6\x86\xe6\xd4\x18\x37\x74\x77\x39\x43\x33\x51\x61\xf6\x63\xa4\x89\x07\x89\x8b\xf0\x4e\x4e\x96\x24\x2a\x69\xe6\xe1\x6c\x8b\xe6\xf4\x76\x7b\x29\xcb\x77\xe5\x6b\x46\x65\x92\x20\xab\xe7\xa7\xa8\xba\x4d\x77\x5b\x37\xfd\xd2\x32\x1f\x93\x01\x92\xe0\x95\xf5\xe2\xf9\x88\x3d\xc1\xa8\xe2\x44\xa7\xe3\x62\xfa\x1e\xe1\x85\xcf\xcb\x70\xe3\x55\x12\xa3\x3f\xb0\xef\x0e\x1c\x7e\x40\x33\x0a\x77\xa9\x4a\x04\x86\xbb\xce\x7e\x7f\xbc\x48\x53\x25\xa9\x37\x02\xc4\xa7\x31\x77\x06\x63\x54\x81\xc2\x7c\x71\xf5\xb4\xfd\x7e\x83\x80\xc1\xc5\x6a\x35\xe0\x27\x19\xd5\x52\x69\x97\x6b\x3e\x5c\x4e\xbf\x57\xc5\xf1\xc5\xcb\xd4\x31\xaa\x55\x8c\x98\x64\x6b\xe3\xd2\xbf\x10\xc4\x57\xbd\xc2\x18\x88\xec\xca\x74\x70\x06\x52\x8f\xe5\xa5\x7d\x12\x8d\xd7\xd8\x09\x37\x1f\x38\x8d\x9c\xe4\xc7\x7f\x27\x24\x12\x77\xdc\x90\x1c\x2b\x55\xed\x4b\xfd\xd3\x72\x8f\xf5\xc4\xca\x66\xfa\xbc\x0d\x97\xb8\x3d\x2d\x45\x23\x3d\x54\x88\x51\x23\x24\xaa\x96\xe2\x7b\x26\x83\xb3\x09\xeb\x43\x59\x44\xb5\xed\x8a\x0a\xfb\x03\x45\xf7\xb6\x87\xb6\x8b\xfd\x71\x16\x83\x37\xcc\xdd\xac\xb6\x3b\x4f\x77\x9f\xde\x4c\xc6\x32\x12\x5c\x39\xec\x55\x4d\x58\x8f\xd7\x5f\x64\xc6\x84\x36\x76\xae\x5c\x9a\x16\xda\x3b\xa8\x8e\x5e\x03\x80\x31\x26\x23\x5c\x1c\x0e\x2d\x9a\x42\x5e\xb3\x2a\x98\xd7\x07\x18\x63\xca\x06\x2b\x85\xaa\x6f\xd1\x02\xd9\x9f\x8d\xf3\xd8\xee\x1f\x8d\x40\x92\x96\x17\x6f\x62\x8c\x43\x1e\xd9\x2a\xaf\x3e\xd7\x25\x3c\xc1\x7f\xc2\x11\xa3\xa3\x01\x35\x7c\x5b\x54\x6a\xa6\x08\xe4\xc6\xc5\x91\xd5\x3f\x33\x75\x23\x0b\xad\x01\xcd\x4b\xc3\x34\x65\x31\x4d\x35\x0d\x59\xd9\x72\xb1\xbf\xbe\x0c\xb1\x24\xcf\x10\x25\x5c\xf4\x31\xa5\x43\x93\x12\x9a\xb9\x17\x87\xd0\x6c\xb4\x1f\xb2\x44\xe8\x8c\x79\xe2\xc5\x9c\x25\xcd\x58\x62\x32\xa4\x0f\x7d\x81\x60\x5c\xf9\x54\x1c\xfd\xcc\x64\x29\xa1\xd6\x8a\xce\x26\x5d\xb3\x24\x93\xa5\x82\xe2\x5d\xb4\xf8\xc5\xbb\x5a\xbd\x0e\xc8\xc8\xbf\xe2\x9e\x5c\xad\x08\xb8\xf3\xe6\x34\xc1\xbc\x04\xd1\x40\x87\x9f\xd7\xdc\x65\x19\x13\x24\xd2\x76\x2a\x35\xba\x3d\x74\x45\x87\x6e\x79\xf3\x41\x14\x70\x8b\xeb\xd7\x64\xe4\xbd\x1f\x7e\x90\xec\xab\x68\x5f\x0e\x6e\x9c\xff\x29\x22\x13\x9e\x56\xee\xd0\xdb\x4e\x97\x68\xfa\xd6\x30\xa1\x04\xb6\x36\xef\xd5\xb8\x37\xfb\x51\xd7\xa0\x9f\xb9\x12\x69\x9c\x5a\x34\x28\x2e\x10\xa6\x93\xe2\x12\x81\xc3\x50\xe9\x43\xe5\x15\x75\x18\x53\x32\xc3\x72\x74\x50\x91\x76\xb5\x32\x7f\x18\x24\xae\x9a\x0b\xad\xbf\xd4\x6d\x3b\x52\xb9\x9b\x7c\x2b\x64\x80\x0c\x24\x70\x7e\x9b\xde\x50\x71\x33\x6b\x61\x8d\x1a\x59\x8c\x19\xa5\xd0\xde\x0d\x53\x9b\xb0\xfe\xcf\x32\x09\x1e\x89\x3c\x75\x80\x7f\x31\xa2\x6b\x8e\xcf\xc4\x23\x9d\x29\xfb\xdb\x54\xad\xad\xac\xc3\x2d\xfc\xb5\x48\xbf\xff\xb4\xa1\xb6\xb8\xf6\x52\xff\xb4\x0d\x52\xe8\x44\x51\x4e\x89\x65\x8c\x13\xa6\x11\x99\x77\x30\x75\xd3\xa7\x5f\xa3\x7a\x2b\xe3\x24\x8f\x71\x5e\x6f\x56\x56\xdd\xbf\xdd\x38\x31\x83\xeb\xef\x14\xa7\x0c\xc0\x26\xd7\x08\x89\x0e\x86\xc6\xfe\x30\xe7\x1e\x0e\xbb\x5a\x7e\xd0\x03\xf6\x43\x63\x86\x61\x3d\x5e\xce\x44\x80\xc2\x0f\xd0\xa9\xb2\x51\x57\xb5\xde\xee\xfc\x37\xb0\x84\x4a\x18\x82\xdd\xbf\x5a\x12\x39\x4f\x4c\x36\x16\xfa\xb6\x19\xce\xe4\xe5\xe6\x3c\x15\x5e\xe8\xdd\x79\xd2\x39\x82\xef\xf4\x46\x72\x88\xac\xb5\x99\x28\x61\x5a\x51\xe0\x69\x64\xbd\xa5\x84\xd6\xfd\x4b\x03\x2d\xf1\xcd\x0d\xc6\x53\x0a\x3e\xbb\xbd\x17\xbf\x1e\x9b\xda\xcc\x7a\x38\x8c\xa7\x29\x45\x69\x39\x67\x9f\x2b\x34\x1a\x88\x4e\xae\x31\x8b\x18\x56\x09\xfa\xbd\xef\xbb\x28\xba\xa2\x3a\xe2\x7b\xda\xce\x4e\x95\x11\x40\x1d\x95\xf7\xf2\x98\xff\xb8\x0c\x22\x5b\x7e\x11\x0c\xa2\x7c\x8c\x67\xb1\x46\x35\x0b\x2b\x60\x30\x18\x49\x66\xff\x18\xef\xad\x3c\x4b\x45\xea\x09\x6a\xf6\x4a\xd6\xd5\x98\x13\xc3\x78\xa6\x35\xae\x37\xeb\xfd\xd7\x34\x8e\xea\x2a\xe6\xfe\x48\x1e\x49\xdc\x9e\xc4\xc7\xc9\x0c\xcf\x59\x8a\xcf\xc2\x00\xe8\x7b\x68\xdb\x91\xdb\xc3\xb5\xaa\x07\xcf\xa5\xa5\x6d\x1e\x10\x03\xed\xff\xa8\x25\x02\xfd\x2a\xd3\x3e\xd6\x75\xf9\xae\x58\x33\xbd\x65\xb9\x49\x50\xb5\x59\x74\x1d\x9c\xce\xdd\xee\x0c\xd5\x2c\x03\xe0\x88\xfb\x0b\xbc\x68\xcc\x99\xfc\xae\xc6\x25\x37\xf8\x64\xfe\x28\xaa\xa3\x7a\x81\x71\x25\x9e\x71\x45\x33\x0d\xe3\x70\x7f\x79\x69\xaa\x2f\x75\xa9\x47\x06\x27\x57\x4a\x86\x5c\xb1\x84\x44\xc1\xb1\x81\x84\xd3\x65\xc2\xc8\x60\xa0\x70\x0d\x7b\xca\xb8\xe6\x29\x82\x2d\xe5\xa5\x7c\xb5\x5b\xe4\x9d\x38\xc9\xfa\x33\x6f\x17\xff\x49\x90\xc2\x45\xb6\xcf\x2d\x3c\x81\xed\x7f\xcc\x4e\x0f\x91\xe2\xe9\x00\x04\xda\xa9\xba\x79\x37\x24\x95\xb9\x03\x1d\x1c\xc5\x09\xfa\x8d\xa7\x1c\x87\x22\x1c\xf2\x14\x1c\x4f\x31\x64\x61\xdc\x44\x39\x06\xc3\x9b\x87\xfd\xdf\xa3\x9d\xf7\x1f\xb1\xe8\x98\xd5\xdd\x62\x73\x7f\xd8\x0d\xde\x9a\x8c\x1b\x1e\xa5\x3a\xe8\x3a\x9a\xba\x39\xbd\x9b\x6a\x86\x33\x7c\xee\xbb\x6f\x03\x28\xff\x5b\x44\x22\x72\x20\xf3\x91\x71\xee\x75\x8a\x1f\xfc\x42\x3d\x9b\x21\x26\x95\xa8\xe2\x7d\x38\x5a\x0d\x1f\xb8\x29\x5a\x55\x9c\x4b\xf8\xdb\x9e\x3a\x2c\x8e\x52\x4b\x8d\x3c\x1c\x2f\xa2\x11\x55\x07\xfa\x5d\x2e\x1a\x47\x59\x12\x3b\xf1\x0a\x8c\x32\xea\x72\x64\x9a\x3b\x9a\x41\x71\x94\xa5\x18\xd0\x58\x14\xc7\xfd\xe2\x0f\x77\x67\x62\x92\x26\xc8\xff\xea\xb7\x8d\x83\x55\x4b\x3a\xd4\xe6\xa0\xc5\x5b\x7b\x68\x8b\x4a\xc1\x41\x8a\xea\xf5\x50\x9f\xa1\x0a\xdd\x72\x16\x53\x92\x60\xec\xf6\xc7\x9f\xab\xd5\x7e\xbd\xdb\x87\xbf\xa7\x56\x39\xf4\xb6\xee\x5f\xea\x39\x9a\x63\xf6\x03\x69\x46\xb0\xdb\x74\xb3\xd8\x7d\x5d\x2c\x37\xbf\xcd\x8f\x26\xa9\x13\xc2\xea\xa3\xf2\xf5\xaf\x0e\xaa\x36\xa4\xf3\x7d\xe8\x33\xfc\x3a\x16\x1b\xfc\x11\x07\x44\xf7\xd5\x3f\x0a\x6d\x8b\x03\xb7\x05\x94\xfa\x9d\x93\xd3\x55\xf9\x99\x7f\x5c\xd9\x91\x63\x96\x26\x5e\xab\xf7\xc6\x7a\x9f\x4d\x96\xe1\x98\xe5\xca\xc3\xa6\xee\x8b\xca\xea\xe7\x9d\xeb\x06\x51\x6a\x43\xed\xc5\x66\x5e\x16\x9b\x37\xf9\x89\x3c\xa7\x88\x46\x53\x75\x59\x7b\x07\xa3\x71\x73\x28\x8e\x73\x9e\xb8\x52\xc3\x20\x06\xb5\x2b\xfe\x3b\x9b\x6e\x71\x42\xad\x4d\xf9\x11\xba\x10\x01\xed\x8b\x59\x8b\x9f\xc5\x89\x60\x48\x22\x78\xbc\x5b\xec\x6f\xb7\x4f\xf7\x87\x2f\x4f\xdb\xef\xfb\xaf\x07\x8f\x7b\x1d\x13\xdc\x58\x9c\x46\xd6\xd8\x14\x9d\xb5\xcd\x03\xa8\x7e\xfd\x6d\xde\x66\xe7\x4c\x45\x84\x82\x5f\xbb\xd5\x66\xb7\xdb\x3e\xed\xc2\xa7\x45\x8c\x46\x17\xd6\xfd\xd2\x66\xe2\x83\x4b\xe8\xfc\x24\x32\xf5\x15\xfd\x7b\xf1\xcb\xb6\x7a\xb7\xc6\x40\x83\x12\xfe\x7e\xb7\x89\xb3\x84\xf8\xfe\x21\x36\xbb\x3f\xc0\x54\x7c\xf0\x3e\x65\x69\x1c\x7b\x2e\x18\x34\x2b\x51\x3d\xd4\xdd\x13\x40\x1f\x9b\x0f\x77\x3c\xcb\x99\x63\xdb\x75\xeb\x5f\xfd\xa3\x0c\x3b\x59\x9c\x01\x43\x63\x8d\x7f\xd6\xb2\xbd\x06\xa6\x64\x71\xae\x40\xbb\x95\x0e\x4b\xcf\x93\xb9\x22\xc0\xae\x72\xdf\x8a\x7a\xd2\x05\x89\x21\x0d\x6a\x18\xab\xa6\xe8\x0a\x25\xca\xe5\x05\xad\xce\xa6\xd7\x0f\x20\x11\x6d\xfd\x05\xaa\xaf\x50\x16\x75\x3b\x2a\x5a\x25\x24\x32\x2c\x75\x75\xaf\xa6\x7e\x5b\x79\xc2\x1f\x4b\x08\x49\x91\x7c\x60\xa3\x09\x92\xdd\x16\xe5\xa9\x1d\x77\xb1\x59\x42\x49\x82\xd5\x7e\xe1\xb1\x8c\x37\xce\xaa\xc9\x93\xb6\xbf\xc3\x38\x3b\x4f\x28\x01\xe2\xfc\x16\x3f\xa8\xa0\x26\xb4\xdf\xec\xfa\x88\xbb\xec\x9a\x4b\xd1\x9e\xee\x47\x94\x96\xeb\xcf\x27\xa1\x39\x45\x3c\xd0\x1e\x1c\xb3\x64\xf8\x75\x34\x37\x9e\x31\x75\xb0\x44\x1b\x51\x1e\xe4\xdb\x61\xce\x29\x61\x09\x67\xc0\x06\xab\xa0\x0f\xe5\xdc\x58\x92\xc6\xd4\x17\xc7\xfa\xa3\x5e\xc0\xd3\xa2\xaa\xfd\x98\xc4\x8a\xe5\x1f\xea\x9f\xf5\xd8\x58\x8e\x25\xa9\x91\x98\xf7\x9c\x9d\x35\xd4\xf4\x7e\x66\xa9\x8d\x5a\x6e\x1a\x71\xac\xab\xdf\xc7\x56\xe3\x93\x55\xe6\x0a\xf8\x3b\xdc\xc0\x4c\x49\x32\x54\x19\xdd\x8a\xf6\xa3\xe8\x40\x63\x61\xff\x6a\x7e\x9e\xe4\x39\xc7\x66\x17\x02\xfa\xd7\xfb\xaf\x8e\xc5\x33\x81\x85\xf5\xa3\x2c\x38\xd3\x67\x88\x80\xce\xd2\x2b\xe7\x40\xe9\x07\x09\x93\x12\x2f\xcb\xf6\x43\x94\x33\xfe\x25\x4b\x44\x64\xd7\x46\x07\xdf\xc7\x0e\xfd\x08\xac\xda\x0f\xb0\xea\xd7\x47\xe8\xfa\xfc\xd6\xa7\x23\x93\x4c\xca\x0f\xd5\x22\xa3\x6e\xa9\x29\xaa\xa3\x65\x7d\x87\xf3\x98\xc8\x09\xe3\x56\x97\xc8\x47\x8f\x89\xcc\x0d\x8a\x0f\xc8\xfe\xb2\xdf\xfc\xfb\xe8\x0f\x0a\x1a\x53\x2f\x76\x52\x96\x5b\xa7\x05\xad\x20\x5c\x9c\x22\x14\x9b\x04\xf7\xe2\xd7\x58\x1a\xab\x3f\xc0\xbd\x42\x46\xa8\x99\x8f\x5b\x29\x7e\x58\x66\x09\xdc\xcf\x53\x1e\xf9\x7c\x54\x9e\x5a\x95\x71\xf1\xb6\xbd\x74\x53\x7f\x3f\x37\x44\x67\xd4\x03\xfb\x7f\x16\x55\xbf\xc7\xba\xe3\x91\x0f\xf3\x12\x6d\x12\x84\xbe\xae\x7f\x81\xba\x20\x4b\x75\x19\xac\x33\x59\x02\x42\x60\x1d\xcd\xce\xf8\xfe\x52\xef\xe1\xf4\xfe\x5d\xbb\x42\x3d\x66\x89\xa1\x8a\x59\x75\xb4\x5f\xdf\xa1\x78\xae\xb0\x22\x51\x84\xbc\x39\x31\x19\x58\x1f\xed\x7e\x37\x9f\xdd\x63\x03\x26\x4d\x2c\xf1\xed\x54\xdf\x16\xed\xcb\xbb\x86\x79\x4a\x22\x81\x4c\xa4\xa2\x32\x8d\x58\x77\x2f\x63\x36\x00\x4b\x09\xcb\x21\x09\xea\x3e\xab\x9b\xeb\x55\xec\x94\x12\x8f\x9c\xe8\x9e\x44\xa5\xeb\x93\x73\xd1\x9f\x8d\x92\xd6\x6d\x1e\x5b\xe4\xfe\x3a\xdc\xf2\xf5\x7d\xbd\x19\xa8\x65\x2c\x65\x82\x67\xee\x8e\x6f\x2b\x68\xa1\x34\xc3\x11\x2b\xb1\x73\xee\xa7\x8a\xfd\xb2\xdb\x7e\xe1\xa3\x37\x20\x42\xb8\xda\x8f\x72\x82\xb9\x95\x9e\xb6\xe9\xfc\xcb\x9b\x32\x43\xb0\xe5\xdd\x7d\x90\x6a\x38\xc2\xa9\x7b\x26\x43\x20\x93\xf2\x58\x60\x97\xd2\x09\x37\xda\x9e\xe0\x8c\xa2\xc0\x52\x9e\x64\x7c\x02\x80\x9b\xf2\xdd\xfc\x28\x6d\x2b\x95\x2d\xa8\xba\xd2\x6d\xbf\x23\x59\x77\x02\xe7\xee\xed\x7f\x4f\xcc\x08\xc6\x72\xc7\x9f\x50\x2c\x97\x37\xf8\x9e\x6c\xaa\x60\xbf\xc6\xd2\x38\x89\x90\x05\xda\x08\x63\x4a\xf0\xba\x06\x2c\x8d\x45\x4a\x95\x77\x32\x68\x5f\x1e\x0b\x35\x2e\x61\xf9\x41\x32\x8f\x07\x22\xf5\x93\xa8\x5e\x8b\xea\xb8\x3b\xd7\x61\x37\x49\x93\x48\xe1\x2c\x41\xb0\xfd\xbd\xe8\xd4\xcb\x87\x01\xf2\x07\x7f\x9e\x2e\xaa\x63\x4a\xef\x64\x8e\x24\x24\xf2\xe8\xe7\xdf\xe1\x6d\x2c\x16\x42\xc2\x90\x8c\xe0\xaa\xb2\xf3\x28\xd0\xcd\xcd\xa4\x34\x3a\x0c\x34\x80\xb0\xd6\xc3\xa5\x6a\x85\x81\xcf\x73\xca\x34\x03\x4b\xc5\xb0\x09\xd8\xc7\x42\x13\x2c\xcd\x33\x86\x91\xec\x51\xb4\x4f\x80\xce\xa6\xe1\x76\xe7\x9a\x32\x17\x27\xdc\x96\xf5\xcf\xd0\xdf\xb8\x8a\x7b\x4a\x05\x63\xc9\x98\xd3\x74\xb3\xf9\x36\x92\x8a\x62\xa9\x88\x35\x42\xb6\xba\x97\xa6\xbe\x1c\x5f\xce\x97\x6e\x5f\x6b\xf1\x16\x0e\x27\x82\x7a\x3e\x8f\xd5\x09\xfa\x21\x3a\x78\x2c\x85\x1a\xb9\x67\xb0\x54\x2a\x8d\xf4\x37\xed\x74\x75\xc6\xfe\x14\x2c\x55\x24\x47\xe1\x85\x46\x54\xaf\xb3\xf7\x55\xa5\x1a\xcb\x39\xed\x45\x7e\xc4\xed\x65\xa9\x52\xd4\x44\x73\xcb\x2a\x57\xc6\x9e\xfe\x5a\x9d\x10\x13\xc8\x81\xf7\x53\x6f\x27\x96\xea\x3c\xc5\xad\x0a\x39\x5a\xd5\xdb\xbb\xd7\x55\x2b\x85\x37\xbd\x6b\x9c\x6c\x2f\x78\x70\x40\x11\xd6\xbb\x14\xb4\x35\x7c\xba\xb5\xba\xcd\xc8\x9c\x7e\x1b\x0e\x1a\xab\x40\xd4\x7f\xff\x6a\x30\x22\x5f\x34\xc7\x0f\xba\x78\xa9\x21\x29\x06\x20\xd6\x70\xaa\xa8\x8e\x36\xc2\x58\xd6\xf5\xeb\x07\x45\xb2\x2c\x62\xd6\xa5\xb8\xcf\xd5\xec\xf4\xbc\xbd\x94\x25\xe6\xdc\xb3\xc7\x9f\x45\x32\xd2\xdc\xd3\x9d\x6a\x53\x74\x23\x17\xa2\x6b\xb4\xc4\xfe\x13\x20\x94\x2f\xe5\x76\xa2\xfc\x5e\xfc\xf7\xbf\x8f\xa2\xd2\x62\xd8\xf9\xe7\x9f\xd0\x2c\x71\x6a\x78\x75\xf9\xa3\x4f\x71\xcf\x97\x0e\xfa\x0d\x77\x56\x52\xcb\x88\x32\x58\x58\x2d\xea\xee\xdc\xcf\xdc\x71\xfc\x9b\x51\x6a\x8d\x7c\x06\x74\x53\x3b\x2f\x9f\x66\x34\xb1\xba\x55\xd6\x90\xa8\x3a\x42\xb9\x12\x8d\xde\x41\x53\x84\x2d\x3d\xa3\x32\x42\xc2\xbe\x83\xa5\xfa\xa2\xfb\xfb\xca\xed\x27\x00\x88\x8f\xfe\xeb\xbe\xa2\x7f\xa7\x7c\x9e\x55\x5f\xf5\x4e\x62\x19\xe3\x16\xb3\x1a\xa8\x34\xe1\x0d\xce\x78\x14\x19\x47\x21\x58\xf7\x7f\xff\x22\x4e\xc3\xe5\x73\x12\x7b\xd2\x24\x8a\x94\x1e\xb1\xf8\xf8\xdb\x68\x45\xcf\xb8\x90\x48\x4d\x0b\x16\x6f\xef\x9f\x09\x87\x5c\x3a\xbf\x20\xa8\xba\xe2\x47\xd1\x62\xce\xd8\x4f\xda\x29\xee\x31\x8b\x23\x89\x6d\x5e\xbc\xa5\x87\x06\x23\xc5\x83\x18\x47\xb9\x59\x0c\x29\xce\xea\x33\xce\xb5\xc7\xa6\xf8\x2f\x7c\x00\xed\xcc\x52\xd0\x89\x0e\xfb\xef\x19\x3a\x64\x62\x58\x0c\xfd\xd6\x7c\xad\xcf\x60\x2e\x65\xf8\xee\x14\x0c\xb6\x0f\x1d\xe4\x6a\x64\x8f\xca\xb2\x2c\xe6\x58\xd2\xad\x7f\x56\x83\xe8\x03\xcb\x72\x9a\x61\x4f\xe5\x5b\x51\xc1\x9b\x68\x66\x28\xa4\x4c\x52\x9a\x38\xd2\x89\x53\xa7\x1b\x95\x0a\xfc\x18\x93\xf9\x66\x85\xab\x25\xb6\x3b\x74\xe0\xbf\x52\x52\xc8\x14\x89\x51\x0a\x6f\xbf\xdd\x2f\xee\x0e\x77\x4b\x5b\x38\xd9\x3d\x3f\x3e\xde\xfd\xe9\xaf\x49\xa5\x36\xd9\x40\x24\x6f\x53\x87\xf2\x48\xa6\x80\x81\xcd\xc6\x40\x6f\x66\x2c\x7a\x96\x69\x26\xf0\x19\x89\xae\x13\xea\x15\x00\x6f\xec\xd2\xb9\xce\x7f\xd0\x00\xf2\x1f\x85\x0c\xd1\xa2\x37\x50\x7e\xa9\x6b\xdd\x4e\x3a\x9d\x99\xc9\x53\x04\x1d\xc9\xcb\xdb\x6d\x5d\xeb\xd9\x41\x99\xa1\xac\x48\x68\x08\x6f\x86\x12\x69\x66\x14\xa0\x20\xac\xf0\x10\xa5\xfd\x0b\x9c\x40\xef\xce\x63\x56\x31\xcb\xa3\x4c\x23\xb5\x67\xf3\xf8\xc7\xf8\x15\xce\x23\x15\x21\x03\x53\x5e\x9a\x77\xec\x1b\x37\x84\xe4\x19\x53\x23\xed\xb6\x45\xa5\xaf\x14\xce\x72\x4a\x15\x5a\xd9\xd8\xdb\xbd\x79\xe8\xb7\xaf\xa1\xaa\x90\x53\x2e\xb0\x64\x84\x04\x94\xfb\x62\x54\x92\xca\x69\x6a\xe9\x24\xeb\x5f\x67\x18\xbd\x74\x39\x8b\x95\x10\x96\xfe\xf5\x03\x2a\xf8\xd9\xce\x3c\xe0\x58\xce\x12\x83\x18\x6a\x29\xda\xe2\x83\xd5\x3a\x67\x19\xe8\x41\x73\x78\xbd\xff\xfa\xbc\xbb\x99\x5d\x3a\x13\xb1\x74\xfb\x73\x9f\xf2\xe9\xfa\xf4\xff\x29\x7b\xb7\xee\x46\x71\x74\x7f\xf8\xbb\xec\xab\xbe\x98\x0b\x04\x92\x80\xf7\xce\x71\x9c\x54\xba\x73\x1a\xdb\xa9\x9a\x9e\xff\xda\xcb\x4b\x87\x47\x0e\x1d\x0c\x1e\xc0\x49\x79\x3e\xfd\xbb\x78\x24\x71\x32\x49\xf5\xbe\x99\xea\x09\x32\xc6\x20\xa4\xe7\xf0\x3b\xe0\x76\xdf\xbe\x7d\xe8\x66\xbb\x7e\xbe\xf8\x40\x8c\x40\x93\xec\x68\xea\xcd\x98\x0c\x10\xa5\x91\x11\x98\xed\x1b\x9b\x97\x8e\xa1\xb5\x29\x0d\x2d\x96\x77\xe0\x54\xe2\xcd\x17\xfa\x39\x9c\xd2\x58\x11\x67\x40\xa8\xb3\xf7\xaf\xcb\xbd\x29\x53\x32\xf2\x16\xd1\xbf\x42\x8a\x4c\x3f\x6a\x42\x84\xb4\xbf\x67\xf0\x81\x82\xe0\x68\xf3\xef\xe9\x03\x6e\x10\x67\x8e\x42\x5b\x3a\x65\xdf\xaf\x0a\xf9\x29\x67\x56\xe7\xcc\x2e\xa1\x36\xac\xc0\xee\x78\x7f\x0f\x38\xd7\x2a\x9d\xca\x9d\x7c\x76\xc1\x5f\x02\x33\x53\xae\x2d\x86\x71\x24\x58\x3a\xd8\x7f\xd2\x38\x30\x61\xdc\xf5\x51\xbe\x1d\xe5\x63\xa9\xe1\x0a\x63\xd5\x01\x9e\xca\x7b\x33\x4f\x5c\x9a\xa3\x34\xe6\xcc\xba\x34\x17\xba\x7d\xeb\x32\x91\x67\xff\x1d\x28\xc3\x47\x69\x6c\xac\xb7\xec\x61\x67\x5c\x21\xc2\x91\x4a\x87\x04\x81\x28\x4d\x58\x88\x50\x05\x67\x84\x3c\x54\x2f\xff\x3b\xff\x26\xfe\x34\x69\x88\x58\xb3\x75\x3b\x97\xdb\xb3\x3c\x5b\xb9\xc8\xf9\xb5\x3d\x4d\x20\x48\x93\xae\x3a\xb7\xda\x7e\x5b\x9c\x9a\x72\x68\xa7\x31\x59\xe0\xd2\x34\x8e\x03\x8b\x1e\xed\x85\x9d\xc6\x8f\x37\x15\xa9\x71\xa7\xbc\x39\x15\xfb\xcc\x17\x06\xbf\x62\x49\x45\x69\x2a\x03\xa9\x86\xfe\x0a\xe3\x4d\x20\x15\x9c\x2a\xdd\x41\x4a\x96\x6d\xb6\xd9\xcd\x16\xc1\x53\x6c\x6d\xfa\xa2\xc7\xf3\xfa\xe9\xfb\xe4\xb2\x45\x6c\x7c\x33\xd1\xda\xb2\x5c\x83\xca\x34\x54\xb3\x01\x76\x2a\x34\x47\xb6\x2a\xe2\x52\x4a\x2b\xd8\xde\xc6\x1b\xa3\xdf\xa9\xc2\x14\x0b\xc4\x95\x8b\xe5\x17\xa7\xe6\xb5\xac\xb2\xa6\x0f\x5b\x52\x95\xc4\x48\xef\xda\x34\x55\xf6\x36\xf8\xb3\x08\x59\x32\xd0\x4d\xd7\xc3\xba\xfe\x84\x0e\xf0\xb7\x70\x5d\xa9\xa6\xa9\x53\x49\xcd\xf3\x47\x71\x7c\xcb\x2e\x9e\x9b\xe6\x1c\xdd\x1d\xee\xb3\xec\x38\x28\xbf\xa5\x9a\xcb\xd8\x9a\xbb\xbf\x89\xf1\xd2\xa9\x95\xc4\xee\x52\x1b\x91\xba\x26\xe8\xb0\xfb\x97\x02\x09\xb1\xa5\xad\x3a\x35\xc9\x61\x0d\x21\x05\xa2\xb8\x1a\x3c\x94\xeb\xac\x02\xd5\x5c\x83\xcc\x26\x95\x94\x14\x62\x89\x3b\xcf\x1a\x44\xbe\xaa\x9b\x0b\x88\x4c\x6a\x28\x89\x49\x27\x02\xf3\xd4\x5c\x20\xab\x53\x43\x69\xe2\x4a\xbb\x23\xd6\xd9\xf0\x81\x89\x80\x43\xec\x74\xbb\x75\x55\x1e\x37\x59\xb1\x9f\x8a\xba\x8c\x6f\xab\x08\x24\xc1\xa0\xac\xdd\x3d\xd4\x5d\x61\xca\x5b\x68\xfa\x3a\x9a\x08\x80\x20\xed\x10\x85\x6c\xd6\x56\xf7\xd6\xa7\xe2\x7e\x0c\x89\x2c\xe2\xae\x0f\x4c\x7e\x1b\x2d\x8d\x7e\x18\x4b\xa8\x8d\xd8\x50\xf1\x79\x10\x19\x0a\x92\x70\xa4\xc8\x23\x98\x67\xf1\xe4\x59\x02\x17\x2d\x45\x2b\x25\x36\xdf\x0f\xf9\xb5\xcc\x43\x24\x88\xf3\x77\x75\xc0\xd8\x51\xe9\x4c\x10\x25\xb0\xea\xe6\x4b\xaa\xa7\x42\x5f\x67\xfb\xac\x11\x8e\xbc\xe5\xc7\x85\x3c\xc0\x47\x75\x9f\xfd\xe7\x04\x9d\xdd\xaa\x3f\x18\x27\x34\xf4\x31\x72\xe3\xc1\x5c\xfd\x15\x84\xc2\xb2\xed\x6a\xec\x10\x64\x2a\x13\xf9\x0f\x90\x75\xd6\x8c\xcb\xed\x22\x14\x29\xa2\x2f\x0b\xf8\xd9\xe1\x12\x44\x3e\x72\x8f\x8c\x44\xa4\x28\xc2\x46\x32\xdd\x06\xcb\x26\x6b\x33\x93\x35\x74\x69\xec\xf8\x9b\x23\xcd\x63\x17\x62\x76\x14\xa1\x76\xb8\xca\xe0\x7d\x9c\xd3\xfb\x75\x5f\x50\xa2\x30\x43\xc2\xa4\xe7\x6f\x2d\xd5\x6e\x89\x16\x8c\x07\xa8\x9c\x39\xd2\x3c\x18\x21\xb8\x04\x27\xb6\x6e\xd2\x54\xe7\x47\xf8\x89\x1d\x07\x5c\xd0\xbb\xe3\x3a\xc0\xbe\x6b\xb3\xaf\x36\xd0\xb4\x67\xa9\x9f\x45\xd5\x74\x0b\x77\xd9\xcd\xd1\x58\x49\xbc\x0d\xff\x5a\xaf\x7b\x9e\x65\x24\x12\x12\x20\x37\xa8\x29\x4f\x55\x21\xbc\xf9\x68\x55\x2f\x4f\xdd\xa3\x4c\x28\x15\xe0\x71\xc3\xcb\xbc\xec\xca\x92\x22\x15\xc6\x2b\xae\xfc\xf3\x94\xa9\xb7\xab\xd3\x19\x57\x86\xe1\xf2\x21\x52\xc9\xac\x84\x85\xcd\xb6\xcf\x5f\x87\x28\x42\x88\xd0\xde\x14\xcf\x67\xf6\xf7\x9b\xfe\xef\x74\x0d\xfc\x7f\x84\xfc\xef\xa4\xda\x36\x39\x17\x58\x18\xa8\x86\x63\x5e\x9e\x9f\xab\xf2\x2f\x18\x24\x8b\xa3\xa9\x24\x09\x33\xae\xdf\x3b\xab\x19\x12\x09\x19\x13\xe6\xfd\x48\xb2\x1c\xee\xae\xe5\xf9\xb9\x5d\x0b\x3b\xf4\xe9\xf8\xe1\x2a\x42\xbd\xe0\xe2\xf2\x54\x55\xe3\x6a\x85\x50\xb1\x35\xe4\x42\x18\xd7\x66\x00\x13\x59\xf8\x42\x7e\x9b\x50\x9d\xea\xa1\x65\x43\x24\x34\xe5\x01\x9a\x1c\x83\x5e\x8a\xea\x38\x66\xda\x08\xad\x62\xec\xe5\x65\xf5\x4e\x8a\xa2\x98\x92\x38\x84\x86\x38\xb6\x5d\xe0\xec\xf8\x5c\x95\xfa\xa4\x9a\x7a\x6e\xe3\x16\xda\x08\x6b\x4f\x74\x3a\x1c\xee\xa1\x7e\xcb\x3c\xd8\x47\x00\xd1\x0e\x99\x6a\x89\x90\x43\xee\xaa\x1f\xc2\x19\x62\x52\x33\x1b\x03\x5d\xf5\x51\x62\x37\xc2\x48\x6f\x5e\xbf\x14\xc7\xc9\x45\x1a\x4a\x11\x76\xf1\x97\x50\x6f\x47\xd7\x44\x6b\x43\x0c\xdb\xe5\xe8\xa9\xe5\x91\x30\x49\x62\x82\x4e\x94\x4d\xe4\xcf\x15\xd4\x13\xf9\xe2\x48\x18\xa0\xd8\x32\xdb\x3c\xaf\x96\x77\x8b\xfb\xbb\xcd\x76\xb7\xfd\xe1\xd1\xb1\x32\x50\x09\x76\xdf\xfd\xd6\xb4\x2a\x06\x84\xd1\xf6\xb0\x49\x38\x32\x83\xab\x81\xf9\xe7\x8c\x7f\x6b\x24\x03\x10\xc0\xbc\x55\x6a\xa6\xdd\x66\x32\xbc\x14\x49\x78\xa4\xbc\xae\x1a\x4a\x53\x7e\x77\x50\xdc\xe9\x8e\x3f\xf9\xff\xee\xe3\x61\x4a\xd1\x73\x04\xfd\xbc\x9f\xfc\xed\x46\x18\x6d\x60\xa1\xd1\x1b\x10\x93\x3a\x45\x1b\xd7\x21\x32\xf5\x26\xcb\x33\xd1\xc0\xce\xeb\x5c\x8d\x2f\x9e\xca\x10\x79\x96\xff\xfe\xf7\xbf\xdb\x88\xe0\xda\xb3\x67\xfa\xa7\x2a\x29\x28\x8b\x41\x40\x75\xb3\x65\x99\x9f\x50\xfc\xcf\x49\xbf\x4f\x3c\xdf\x22\x49\x8d\x46\xbc\xb7\x30\xc6\x7e\xf3\x98\xa4\x21\x19\x11\xc2\x0a\x6a\xa8\xb3\xca\x61\xf3\xd6\x03\x06\xff\x1f\x9b\xa0\x9c\x25\xa3\x09\x26\x7d\xf5\x49\x1e\xb2\x66\x94\x50\x4e\x47\x32\x85\x5f\xbb\xba\xdf\xa2\x17\x94\xf5\x67\x99\xfc\x5a\xa6\x2c\x28\xd6\x64\x79\xde\x35\x8e\xbe\x5e\x94\x24\x03\x7b\xbd\x3a\x7b\x87\x70\x7a\x3e\x50\x48\x70\x2b\x8b\xe7\x32\xcf\x1d\x64\xb6\x4f\xd0\x24\x33\x0a\x7b\x28\x7b\x68\xee\x0e\x62\x0f\xed\xfa\x5c\x5f\xaa\x7c\x47\x32\x26\x01\xda\xbd\x5c\x65\xcd\x33\xd4\xbe\x95\x21\xe3\x58\x30\xe2\x2c\x96\xe6\xcb\x7a\x32\x4e\x52\x5c\xbc\x6e\xdb\x9d\x76\xef\xc2\x8b\x41\x3b\x44\xc6\x89\x52\xa1\xaf\x0b\x6c\x44\x0e\xff\xfe\xa9\x46\xfb\xba\x4c\x88\xa5\xad\x75\x02\x04\x23\x2b\xbd\xf1\xd7\x25\x0c\x62\x63\x4b\x10\x8b\x66\xb0\x02\xc9\x24\xb5\x60\x0f\x27\xfd\x6f\x29\x30\xc3\x37\x2a\x51\x1c\x9d\x94\x33\x55\xae\x7b\xa9\xaf\x48\x4a\x96\x22\x35\xdb\xa9\x3c\xcc\x2b\xca\x46\x52\x26\x0a\xcb\x6e\x03\x54\xa8\x94\x89\xd5\x39\xc5\x39\x78\x0d\x26\xeb\x89\xaf\x52\xa6\x12\xaf\xa7\x0d\x42\x32\x7d\x0d\x87\x52\x55\x42\x9d\xa7\xa2\x57\xe3\x2f\x51\xcc\x36\x65\xdb\xd0\xd1\x9d\x6f\x94\x84\xcd\xc7\x4e\x9f\xb4\x2d\xdc\x39\x75\x12\x23\x0f\x6a\xa0\x33\x3a\x7d\x09\x4d\x10\xa3\x9f\x9d\xb3\xb6\x28\xcd\x66\xbb\xbc\x9e\x70\xb0\x55\xc0\x0d\x0b\x06\x3d\xa7\xa1\xff\xd4\xfc\xba\xa1\x02\x19\x63\xc2\xe3\x73\x0c\xec\xba\xce\xb6\xaa\xba\x8f\x90\x80\x22\xbc\xed\x35\x6b\x57\xe1\x65\x5e\x16\x5d\xca\xa2\x48\xc2\x84\x83\x3d\x3e\x7e\xdf\x36\xe5\x5c\x7e\xea\x87\xa6\x56\x53\x50\x3b\x11\xdd\x9b\x72\x24\xb3\x14\x29\x22\x18\x86\xcd\x47\x51\xd5\xf0\x50\xef\xad\x74\x5d\x1f\xf1\x2a\x02\x90\xf4\x5c\xca\x6b\xa8\x55\x95\x1d\x87\x26\xda\x93\xeb\x36\x80\x70\x32\xed\x58\x04\x17\xf5\x7d\x15\x06\x89\x93\xed\xc8\x73\x2b\x7d\x5c\xb7\x61\xd5\x7c\x2a\xaa\x42\x66\xd5\xce\x85\xd6\x23\xa2\xdd\x6c\x10\xed\x3f\x93\x26\xc8\xc3\x47\x79\xce\x89\xcc\x40\xa4\x42\x48\xb0\xf5\x07\xcd\xeb\xc0\x21\xb5\xfd\xbb\x50\xa4\xa3\x5a\x5c\x7a\x7b\x45\x2a\xe2\x29\x42\x7a\xed\x63\xb4\x3d\xbe\x81\xad\x64\xa4\x22\x29\xb1\x5a\x24\x31\x33\xe9\xbe\x91\x8a\xc8\x73\x0f\x4e\xc7\x51\x00\xeb\x07\x48\x86\x09\x47\x77\x8f\xc7\x94\xaa\x89\x18\x62\xa4\x28\x00\xd6\x9b\x4e\x35\x54\x08\xdf\x59\x22\x29\x66\x35\x2f\x88\x3a\xb9\x3b\xd4\x24\xa8\xcc\x7e\x5d\x9a\x51\xec\xa2\x58\x18\xe0\xcf\xcb\xb3\x43\xd6\x0c\xab\x26\x8a\xa5\x29\xaa\xa6\x94\x17\x04\x5c\x37\x80\x47\x1c\xf5\x20\x9f\xb7\x9b\xeb\xbf\x89\x22\x54\x9c\x26\xb1\xf4\x8e\xb4\x5f\x6d\x29\x2a\xa6\x96\x14\xbf\x7d\xda\xdc\x67\x4d\x93\xc3\xb7\x52\x0f\x24\x51\xfd\x55\xc6\x9c\x24\x2e\x38\x44\x6d\xb3\x5e\x2c\xe0\xf3\x9b\x11\xeb\x20\xb5\xdd\x39\xb8\x86\x89\x3f\x6d\xa4\xd2\x34\xf1\x75\xe7\x67\x51\xcd\xdb\x9f\x46\x4a\x04\x31\xd6\x74\xd1\x15\x03\x0d\x9b\x47\x5b\x44\xe2\x87\x49\xc1\x84\x37\x48\x30\x50\x55\x22\x9f\x2d\x78\x28\x99\x58\x19\xac\x36\xa3\x7a\x29\x34\x54\xba\xdc\x3b\xb2\xb4\x1f\x21\x92\x28\xea\xcc\x1c\xc4\x8e\x78\x9e\x80\x52\x84\x23\x48\x5e\x66\xfa\xae\x50\xd5\xb0\x87\xa8\x54\xc4\x30\x58\x6b\x50\x3a\x4b\xf9\x3f\xeb\x94\x21\x28\x29\x2b\xd4\x5a\x14\xfa\xb1\xec\x43\x64\xa5\x85\xc4\x36\xad\x39\x15\x6d\xb2\x3f\x68\x1f\x28\x10\x21\xce\xc1\x8e\x15\xac\x40\xa4\xd0\x03\xa0\xd6\x42\x5f\xaa\xd1\x7d\xfd\x30\x8c\x51\x88\xae\x53\x7e\xdb\x83\xab\xed\xd2\xbf\x45\x9a\xd0\xd8\x87\xac\x7d\x59\xc1\xfb\x60\x44\x9a\xb0\x14\x45\x6e\x37\x20\x2a\xf5\xfa\x70\xbe\xc9\x72\xa8\x47\xd1\x9f\x26\x31\x57\xe9\xb4\x30\x11\x45\x93\x41\x29\xc3\xb9\x6e\xf2\x53\x3d\xd6\xdf\x8f\x34\x91\x49\xe0\xc0\x0f\x78\x2f\x96\x9d\x2d\x43\x7b\x4c\x7b\x8d\x5a\x55\x56\xfa\x06\xe0\xd9\x9a\xc4\x4c\xce\x11\x4a\x4a\xf1\x1c\x95\x70\x52\x38\x93\xe7\xaf\x23\x0a\xd8\xcd\xf5\xd9\xf4\x35\xbc\x8f\x7c\x30\xfd\xb0\x14\x78\xe4\x88\xac\x18\xdc\x61\x04\x3e\x6e\xc5\xe8\x48\x5b\x6d\xe7\x46\xbc\xc1\xa6\x10\xc7\xfa\xb5\xf4\xf3\x41\x53\x08\x11\xec\x65\xcd\xeb\x84\x7a\x83\x0a\xc5\xae\xbb\xc3\x91\x41\xac\x90\x78\x83\xef\x50\xe8\xb2\xb2\xf6\x1b\xdd\x7e\xd5\x2d\x8c\x9a\x02\x45\xb2\xc8\xf3\xcb\x7a\xe1\x3f\xce\x43\xcb\x6a\x3b\x88\x46\xbd\x5e\x77\x0d\x6f\xcd\x81\x10\xc7\xbb\x7f\x03\x3d\xea\x63\xeb\x38\x8a\x69\x84\xf1\xf5\x4f\xb2\x69\x44\x45\xbb\x03\x9c\xb8\x5d\xea\xfc\x35\xf5\x5f\xc7\x42\x71\x31\xd8\x9d\xb1\x49\x56\xd8\xe6\x1c\xe6\xc5\xdd\x03\x4b\x02\x86\x9d\x34\x93\x15\xda\xd1\xd5\xc6\xf7\x2e\xa1\x02\x11\x97\x96\xab\xe6\xb2\xb5\xc9\x43\x48\x09\x50\xeb\x80\xbb\xbc\x7b\x58\xdc\xdf\x2c\x96\xdb\xa7\xb5\xff\x06\x41\x25\x46\xfe\x87\xac\x68\x56\x05\x54\xfb\xf3\xa2\xe9\xe2\xb9\x59\x70\xc2\x68\x85\xd4\x82\x03\x3a\xea\x2d\xf2\xfc\x74\x10\xdd\x59\x05\xc7\xea\xcf\xf2\xfe\xee\xe6\x66\xa2\x9e\xda\x1e\xb5\xba\x1b\x76\x2b\xb1\x9b\x9f\xcf\x7b\xc7\x97\x2e\x14\xc3\x08\xd2\x12\x2a\x5f\x8e\xaa\x3c\x64\xc5\xde\xfa\xe0\x8f\x47\x4a\x4a\x82\x0b\x02\x41\x1b\x52\xd6\x8d\x38\xf8\x7c\x43\x4b\x1a\x22\xdc\xc7\x51\x55\x6f\xca\x5f\xa8\x34\x68\x15\x00\x62\x1a\xfc\xa3\xda\x94\xb9\x46\x91\xbc\xf9\xc8\x53\x2b\xc5\x30\x07\x69\x6f\x27\xca\x6f\x77\xa8\x9f\x19\x78\x4a\xff\x31\x1d\x46\x88\x07\xbd\xda\x2e\x77\x9b\x97\xbb\xcd\x66\xb5\xdb\xde\xad\xd6\xbb\xd0\x5f\xb8\x66\x12\x51\x96\x3f\xc4\x3b\xd4\x57\x56\x05\x77\xb8\x31\x6a\x08\x48\xaa\x26\x36\xb0\xb3\x2b\x98\x06\xa6\x94\x83\xa3\x63\x9d\x68\x40\xf0\xd6\xc0\x2d\x1c\x6a\x82\xef\xd3\xa0\x2d\xb1\xf5\x6a\xb1\x1c\x7f\x2b\x44\x98\xf9\xaa\x32\xcf\x7d\xc9\xa4\x83\xd1\x0c\x77\x16\x6d\xc2\x18\x4d\x6c\x10\x14\xe1\x60\x13\xe8\xb6\xee\x8f\x33\x89\xc0\xd7\xf2\x67\x0e\xe7\x61\xb2\xa0\x4d\x12\x47\xd6\xb0\xdc\x34\x2c\x98\x5c\x98\x51\x1a\xb9\xe3\x9f\x67\x21\x40\x12\x40\x89\x15\xd3\x66\x5c\x18\x86\xfa\x03\x86\x85\xae\x06\xfc\x62\xc9\x79\x5e\xa2\xf6\x12\x33\x0f\x21\xe3\x18\xfe\x88\x03\x14\x7a\xd0\xeb\xbf\xf4\x3f\xc4\xb1\x1e\xca\x9d\x0b\x59\x56\x38\xc9\x1f\xa0\xda\xf7\x01\xf5\x28\x19\x70\x1f\x8b\x22\x81\xa6\xc2\x0e\xf8\x38\xb8\x3b\x10\x71\xee\x55\x6d\xef\x45\xdd\x3c\xb4\xfb\x46\x53\x16\xdd\x4f\x69\x37\x4e\xea\xe2\xd5\x6d\x79\x95\x0b\xf5\xe6\xca\xac\xb3\x73\x00\x22\x9d\x58\xf0\x74\x23\xaa\xe6\xa9\xfa\xd6\xce\x6a\x9f\xf2\xf5\x21\xa5\xfd\x9f\xcb\xb5\x14\x58\xa4\xf1\x05\x3e\x88\x9f\x4e\xa2\x62\x78\xff\x87\x45\x7f\x60\x8c\x78\x48\xe3\xd3\x11\x8a\xab\xac\x37\xcb\x1b\xdd\x33\x1e\x13\x44\x47\xde\x97\x7b\x6c\x6f\x7e\x61\xf9\x1b\x01\x57\x56\x51\xfe\xe9\xf7\xd1\x74\x84\x58\x59\xb2\x54\x1b\x36\x57\xe5\xa1\xfc\x06\xf9\x71\xe0\x04\xd2\x8f\x92\xba\x8f\xc1\xe6\xe3\x57\x48\xa2\x18\x41\x04\x7f\x38\x0d\xd9\xf1\xd1\x34\x31\x08\x52\x7d\xcf\xe0\x03\xaf\x57\xc8\x1c\x7c\x18\xef\xdd\x40\x9e\xcb\xb2\x7b\x82\x69\x2a\xad\xfb\xd1\xb9\x6e\xe0\x80\x1f\x59\xd8\xb6\xc2\xa5\xf4\x88\xff\x88\xb6\xe5\x35\x79\xaa\xb3\x02\xea\x1a\x1b\x81\x8d\xc8\xc7\x25\x42\x10\x51\x1a\x52\xec\xa5\x66\x45\x93\x43\x6d\xa1\xe0\x93\x20\x66\x26\xc4\x9d\xfc\x5e\xc1\x18\x86\xdc\xbf\x97\xe7\x41\xbb\x07\x04\xeb\x04\x34\xee\x2c\x59\xd6\x32\x18\x06\xad\xce\xc9\x79\x84\x88\x47\xb4\xa6\xe5\xb7\x5b\xfb\xbe\x6c\x4b\x3b\x33\xc6\xcf\x52\x40\x8a\x50\xa3\x1f\xa2\x7e\xcd\x8a\x7d\x53\x16\x2b\xc7\xb8\xf4\x97\x20\x23\x91\xb8\xc2\x08\x56\x95\xf5\x72\x96\x1b\x0c\x52\x45\xa8\x96\xfc\x01\xd9\x5a\x64\x28\x4a\xdf\xeb\x26\x41\x1b\x34\xb5\x0f\xe0\x65\x73\xfd\x30\x9a\x34\x3a\x0c\x10\x51\x6b\xb2\x9f\xa0\x57\x3f\x8f\x5b\xa8\x9b\x39\x60\x32\x68\x20\x98\x14\x0a\xad\xb7\x25\xe2\x34\x86\x0f\x18\x28\xe3\xb4\xa3\x65\x6d\x9a\x2c\xcf\x47\xb1\x88\x1f\xc6\xa2\xc0\x5a\xaa\x21\xc2\xba\xf6\xa6\xc0\xf3\xef\x29\xc4\x21\x4d\x7a\x47\xb4\x51\x5a\x0c\x00\xd6\xff\x3d\x53\xa5\x55\xcc\xf0\x8d\xe2\x87\xac\xe8\x5b\xe3\x60\x82\x80\x5a\xc7\x3e\x55\x6a\xd0\x6b\x2f\x79\xd9\x1d\x8f\x63\x2a\xbb\x46\xe9\x93\x71\x44\x57\x5b\x3e\x9c\xb5\x4c\x8c\x4c\x10\x70\x5c\xaa\x0c\xc0\x1a\x14\xa0\xe2\xa6\x3f\xc4\x24\x66\x2b\x66\x2c\xce\x17\x99\x20\x09\x10\x18\x20\xcb\xf2\x6d\x29\x8a\x77\x51\xf7\x89\xfe\x78\x0e\x19\xc2\x2c\x3d\x7b\x59\x95\xc7\x71\x25\xc2\x0f\x68\xdf\x74\x67\x7d\x5f\xec\x9f\xba\x85\xd0\x10\x15\xf8\xf0\x19\x2d\x2d\xaa\x09\xc5\xd1\x0f\x33\x11\x91\x8e\xfe\xb1\x06\x75\xaa\xda\x17\x62\x54\xc0\x30\x61\xa8\x3c\xbf\xe4\xfe\x65\xf9\xc7\xd4\xdb\x62\x7c\x3d\xa1\xb2\x17\xdc\x59\xd4\x3f\x19\x27\x4e\xb1\x47\xe7\x81\xee\xa4\x60\x5d\xf2\xa0\xd0\xde\x7d\x70\x50\xf6\x32\xa1\x11\xd8\xa7\xb2\x18\x2b\xcb\x3f\x70\xb8\xdf\x3e\xd3\x35\x11\xe7\x89\xeb\x18\x1c\xdb\x59\x38\xc2\x69\x99\x48\x48\xa6\x3a\xc5\x92\x61\x83\x67\x7c\xc9\x91\x56\xc6\x22\xae\xad\x2b\xdf\xe6\x24\x75\xf6\x5e\xcf\xc1\xd8\x4c\xbb\x3c\xe3\x4e\xf9\x91\x35\xea\x75\x14\x0f\x9b\x08\xec\xf6\xbc\x41\x5b\xb7\x76\xfb\xbc\x01\xf8\x85\x2e\x9b\xa1\x0e\xbe\xea\xc4\x7a\x8b\xf3\xaa\x79\xbd\xb0\xf9\x8a\x0c\x0b\x82\xb0\xdb\xba\x5f\x6d\x7d\x6d\xc2\x2b\x6e\xf7\x70\x44\x0c\x6a\x78\x3f\x41\xfe\x0e\xdb\x52\x8b\x7a\x71\x3c\x76\x0f\x92\xc5\xb2\x6f\x4b\xdd\x15\x2a\x3f\xe9\x69\x51\xcd\xb0\x84\xe2\x86\x62\x5b\xfd\xf1\x60\x79\x30\x4c\x48\x9c\xb6\x45\x9b\x73\xfe\xf4\x7f\xe5\x29\xc1\x42\xa9\x33\x9c\x72\xbe\x43\xcb\xb2\x6e\x4e\x87\xe9\xaf\x48\x28\x41\x78\xf0\xc1\xda\x91\x7a\x91\x80\x11\x4d\xc4\x24\x9c\x39\xed\x3d\xf9\x37\x1c\x60\x23\x93\x48\x40\x52\x7c\xb3\x07\xdf\xd0\xb3\x8f\x6e\xe9\x42\x31\x37\x2e\x8d\xb8\x71\x2d\xd4\xed\xf9\x08\x8f\xbe\x0c\xd7\xbd\x0a\x69\x62\x8d\x6d\x3a\x1c\x61\xe2\x0f\x48\x0e\x64\x04\x30\x9d\x03\x97\x1a\x11\x52\xf0\xea\xef\x58\xc7\xdd\x68\x9f\xb6\x1b\x21\x08\x6a\x8e\x23\x04\x68\x2e\x8f\x34\x42\x5b\xb2\x97\xee\x6c\x08\xbe\xca\x36\x8c\x0c\xac\x31\xfe\xe3\xf6\xfb\x4b\x5f\xc3\xb9\x44\x72\x7e\xf6\x2f\x06\x34\x73\xdb\x9f\x91\x84\x7a\x3c\x78\x3b\xcb\x86\xa2\xf3\x91\x91\xcc\x56\x28\x77\x58\x07\xaa\xf4\xdd\xa7\x3c\x7c\xf7\x01\x15\x58\x35\xf4\x5a\x18\xdb\xdc\xff\x64\x58\x44\x2d\x30\xd7\x8a\x89\x6f\x44\xf1\xd0\x8b\x87\x4d\xb9\x88\xe3\xeb\x55\x32\x41\x09\xd9\x36\x21\xd9\x0d\xf7\x33\xa3\x55\x6a\x2d\xec\xb2\x7d\x21\xf2\x6d\x25\x34\xdc\xcd\xe8\x04\x1a\xd0\x02\x39\xeb\x8b\xcd\x66\xb5\xdd\x3d\x2c\x1e\x17\xb7\xab\xf5\xee\xc7\xe2\xfe\x7e\xe5\x69\x7f\xa6\x5d\xe8\x51\xb8\xe5\x76\xd9\xfd\x89\x10\x12\x76\x12\x6f\xa3\xa4\xff\xf2\x76\x0f\xf7\x67\x63\xc2\x38\xd6\x9d\x42\x64\xbf\x9e\x99\x44\x62\x57\xe2\xea\xe9\xf1\x65\xb3\x63\xbb\xeb\xc5\x9f\x0e\xe3\x47\x83\x20\xb2\x26\x43\x76\x35\xbb\xa9\xca\x03\x3a\xa5\xd8\x57\xe4\x61\xd2\x15\xa4\x41\x10\x2b\x0c\x01\xe0\xd0\x46\xdb\x85\x3a\xdf\xe4\x62\xdf\x9d\x4b\x13\xcb\x94\x80\xe6\xa9\x18\x10\x47\x12\x77\x9c\x84\x56\xe0\x4d\x42\xdd\x58\x8d\x24\x7f\x80\x05\x18\x5d\xdb\x2c\xd4\xba\xfb\xe1\x8a\x7c\x75\xde\x4c\x65\xaa\x69\x40\x8c\x30\xc4\x93\x1d\x7f\x58\x1a\x4f\xed\x4f\x15\x86\x29\x16\xe6\x5d\xc2\xd4\x2e\x95\x77\xc5\x65\x58\x44\x83\x90\x5a\x69\x06\x04\x28\xba\x1c\xf2\xb1\xf4\x42\xbd\x23\xf1\x7e\xff\x09\x66\x1d\x60\xe6\x9b\xd8\xc3\x47\x41\x83\x90\x83\xc6\x0c\x25\x07\x51\x2d\x4e\x13\x08\x3d\x0d\xc2\x34\xb6\x5e\x5f\x4e\xce\xec\x0b\x78\x1e\x0d\xa2\x38\x46\x82\xcb\x12\xed\xcf\x5e\x8a\x0c\xb5\x83\x9a\xf3\xf6\x94\xf5\xdb\x16\x0d\xa2\x04\xbc\x31\xf3\x77\x8f\xba\xec\x37\x37\xb7\xaf\x5e\xee\x1c\xfe\xd3\x2a\x4c\x83\x39\x6a\x14\x0b\xfc\x17\x50\x08\x30\xfa\x5f\x3e\x3d\x3c\xdc\x6d\x36\x77\x4f\x8f\xbb\xe7\xd5\x7a\xb9\xf2\x2c\x56\x1a\x30\x12\x61\x6c\x82\xdf\xbd\x6a\x94\xfc\x65\x09\x98\x06\x4c\x31\x9c\x35\x1f\x56\x59\xc1\x9f\x8a\x13\x86\x82\xb4\xb5\x97\xac\xab\x07\xd1\x26\x0d\x78\x12\xe3\x94\x69\x77\x2a\x47\xf5\x72\x91\xce\x60\xc2\x71\x65\x10\xed\xe5\xed\x23\x50\x0f\xab\x8d\x1f\xf5\x64\x32\x70\xed\xd3\x6c\x94\x19\xbc\x29\xab\xe7\x2a\x43\xe8\xd8\x7f\x41\x47\x97\x9a\x85\xb3\x64\x98\x0b\x74\xc9\xac\x82\x2c\x0d\xe2\x28\xf0\x3c\xe3\x76\xe9\xba\xcf\xea\xe6\x1e\xe6\x55\xb1\x68\x10\x6b\x82\x82\x3b\x5e\xb1\x30\x76\xf3\x6e\xb0\x22\xd1\x20\x11\x0a\x1f\x0c\xbe\xf8\x4b\x51\xe8\xb3\x97\x04\xa2\x41\x9a\x1a\xdc\xf7\xfe\x73\x82\xea\x8c\x7d\xcf\x19\xfe\x12\x0d\xda\x5c\x88\x59\x59\x80\xeb\xf2\x84\xb9\x96\x86\x9f\xbf\x30\x30\xa6\x81\x60\x1c\xa1\x9a\x32\x1b\xfa\xa0\xd2\x40\xa4\x51\x40\x07\x97\x7d\x0d\xed\x06\xa7\xbf\x48\x3a\x69\x20\xc3\x08\x65\x9d\x10\xc6\x94\xfd\x17\xfa\x2c\x89\x06\xd2\x68\x8c\x67\x16\x39\xfc\x6c\xf3\x87\xe1\x31\x9d\x68\x6c\x2e\xbe\x96\x3a\xb7\x25\xa9\xf4\xc1\x1f\x03\x6a\xb1\x22\x87\x53\x1b\x29\x16\xe1\x8d\x98\x5a\xae\xb6\x63\x24\x78\x2c\xc5\xa9\x81\xa5\x38\xce\xee\x26\x34\x80\x98\x1b\x17\x67\xc0\x73\xf9\xfc\x25\xc3\x96\x06\x00\x11\xfa\xfc\x3c\xc2\xc7\xe6\x20\x2a\xb4\x10\x1a\x36\x2c\x3e\xa9\x86\x7f\x89\x0f\x1b\xbd\x38\x00\x89\x0f\xa0\x97\x15\xe8\x4b\x5c\xae\x1b\x67\x82\x88\x85\x9d\x28\xeb\x74\x9e\xb9\x6c\x98\x06\x86\x1b\x6a\xb3\xe1\xf3\xd3\x71\xa4\xe8\x3d\x3e\x1f\x09\x28\x45\xfc\x84\x6c\x94\xb5\x87\xfd\x6c\x9c\xb0\xab\x7a\x56\xd7\xa7\x76\x1d\x1d\x34\x9a\x29\x21\xce\x9d\x08\x11\xb8\x1d\x6b\xa2\x27\xe5\x0f\x38\x71\x94\x10\x60\xd8\x4f\xb4\x9b\xd4\x73\x99\x67\xea\x3c\xea\xb8\x0e\x76\x19\x42\xc0\x56\x14\x5f\x45\xfd\x3a\xac\xea\x53\x12\x46\x42\x76\x0a\x1e\x03\x34\xf1\x6c\x04\x48\x49\xc8\x02\xec\xd8\x35\xa7\xaa\xb8\x11\x27\x85\x18\x38\x7f\x49\x61\x12\x21\x3a\x16\x5b\xa6\x18\x03\x2c\xcb\xc3\x51\x34\x19\x5a\x5e\xf7\x2f\x16\x09\x45\x88\x30\x9c\x4e\x6d\xec\xab\x84\xb4\x1d\x4e\x11\xc9\x25\xea\x4c\x43\x9f\x6d\x5e\x77\x0d\x46\x4a\x42\x49\xc0\xf1\xb3\x6f\xda\x78\xb1\x19\xbe\x79\x24\x94\x14\xb3\xd1\x4c\x95\x98\x62\x46\xdd\x01\x4d\x91\xb1\xb3\x14\xa6\x7d\x1d\xdb\x4d\xc4\xe7\x8e\xed\x41\xfb\x1e\xe3\x37\xfe\xc8\x2e\x6b\xd2\xe3\xab\x8c\xa8\x95\x40\xc0\x05\x67\x8d\x81\x0a\xe8\x81\x1f\x12\x25\x91\x4a\x7d\xed\xcf\xe1\x30\xf5\x58\x8c\xe0\x53\xcb\x6b\x4a\x28\x95\x9e\x80\x8e\x77\xb6\xbe\x3a\xcf\x65\x85\x94\x50\x4d\x91\x32\x63\xaa\xf2\xbf\x50\xcc\xb1\x82\x29\x61\x81\xb1\xb0\x7c\xf4\x0b\xc3\xad\xd8\x1f\x51\x54\xf5\x9c\x1c\x79\xaa\x0a\xd0\xc8\x73\x47\xe6\xa5\x1f\xc5\xa5\x42\xb1\xb5\x6e\x3b\xfd\x18\xc4\x04\x24\xa6\x0a\x45\x4e\xab\x6c\xff\xda\x30\x32\xde\x56\x48\xcc\x1d\x82\x5c\x1c\xef\x9c\xde\x79\x77\xc7\x53\x6e\x39\x63\x36\xcc\xbb\xcd\x4c\xf3\xdb\x4c\xdc\x4c\x49\x2a\xad\x68\xa5\x83\x59\xf7\x4e\x89\x94\xa4\x5a\x63\xf4\xff\x8a\xb2\x47\x2f\xc3\x93\x1b\x8a\x42\x31\xff\xce\x8e\x93\x42\x76\x7b\x2c\xc6\x3a\x14\xe6\x55\x77\xcd\x14\xf5\xe4\x46\x09\x6e\x59\x7a\xb6\x52\xe4\x33\x20\xfc\x7d\x9d\x24\xee\xe8\xb5\x13\xa9\x41\x8e\x76\x37\x25\x0e\xb8\x88\xdc\xb9\x69\x31\x9c\x4f\x4e\x4c\x97\x12\x19\x06\xd8\xac\xbd\xbe\x7f\xf6\x57\x27\xa3\x14\x63\x9d\xc3\xee\x15\x3d\x5d\xeb\xc9\x2d\x95\x46\x60\x6b\x67\x71\x75\x7f\x29\x95\x48\x89\x4e\x13\x8c\xcd\xb1\xeb\x5f\x5f\x8b\xf3\xd2\xa9\x13\xaf\x8a\xee\xe6\x00\xe7\xd4\xb5\x40\x1f\x44\xf7\x49\x88\x53\x7c\x1e\x08\x1d\xb6\xf0\x2c\x84\xcc\xf9\xe3\x86\x11\x2b\x92\xd8\xce\xc8\x9e\xb2\xf0\xf5\x8e\x3f\xdc\x62\x89\x51\x16\x64\x2e\xbd\xc7\xf2\xb3\xc8\x72\x04\x45\x8c\x9e\x78\xd8\xe6\xe4\xb4\xa3\xdf\xd9\xfc\x57\x0f\x15\x11\x68\x18\xc4\x21\x50\x9f\x72\xfb\x72\x9e\xee\x8e\x1a\x40\x11\x0a\x68\x5e\x1d\x4c\x7c\xc4\x46\xa3\x21\x09\x42\xe6\xb0\x23\x96\x21\x31\xad\x5e\xd0\x90\x50\x95\x38\xeb\xfb\x01\xa0\x77\x76\xa1\x0c\xc3\xd0\x52\x7d\xad\xef\xb6\xbd\x77\xed\xff\x16\x90\xf7\xf8\x2b\x1a\x86\x51\x8c\xdf\x7a\x28\x75\x66\xce\x5d\x89\xfd\x72\x21\x1f\xce\xab\x30\x52\x11\xb1\xe5\xce\x46\xbd\xfe\x59\x9e\x3e\xb9\x86\x48\xa7\x58\x3b\xcc\x54\xf9\x52\x77\x77\x82\xca\x4e\x59\xf0\x5e\xd4\x56\xaa\xf9\x4e\x4f\x7e\x2a\x0b\x93\xd0\x65\xa6\x56\x3a\xb6\x2c\x47\xd7\xcd\x78\x82\x7d\xc7\xf2\x08\x03\x91\x6b\x1a\x32\xa9\x69\x34\x12\xb9\xc6\xa9\xb8\x2d\xbb\x50\x7b\xe1\x3b\x19\x68\x9a\x52\x9e\x9a\x6f\x65\x7d\x81\x71\xb9\x5c\x00\xc3\x98\x26\xd8\x8d\x7f\xde\xfc\xe9\x43\xeb\x30\x4e\xb5\x89\x7a\x38\xa7\xa7\xb4\x7c\x55\x06\xa2\x61\xac\x08\x1d\xe9\x09\x63\x0d\xbb\xb6\x13\x7b\x50\xa5\xa0\x61\x92\x58\xcb\x5b\x6c\xfd\xd9\x2a\xcd\xe4\x9d\x1d\xff\xe3\x3e\x96\xf2\xc8\x58\x57\x25\x50\x27\xbf\xb7\xf9\x74\xea\xc1\xd6\x63\x6e\xa0\x6f\x4c\x8f\x1f\x5a\x9a\x50\x0c\x39\x4e\x35\x54\x57\x97\x48\x59\x1a\xa6\xc2\x60\xf8\xe6\x75\xf1\x67\xab\x83\x38\x0c\xa4\x33\x06\x99\xea\x32\xf9\x21\x86\x33\x31\x70\xfd\x82\x6a\x59\x96\x6f\x19\xb4\x9b\x93\xa8\xd4\x6b\x5f\x69\xa6\xa1\x08\x42\xd9\x17\xcf\xae\xef\xae\x67\xc0\xb9\x34\x14\x84\x98\xde\x40\x66\x91\xe7\xcb\x32\x77\x16\x15\xdd\x89\x42\x6b\x7d\x2b\x45\xf1\x36\x7e\x81\x45\x22\xf1\xc3\xbb\x7e\xf2\xac\xe1\x1d\x8a\xd3\x3c\xc7\x68\xfc\x4a\x48\x62\x03\xb0\xeb\xe5\xe3\x4d\x59\xdd\x8a\xee\xbd\x96\x09\x63\x3d\x63\xe9\xb9\x9a\x15\xc0\x72\x63\x15\x97\xd4\x95\x95\x9e\x4f\x87\x63\x0f\xe8\xa5\xa1\xe6\x12\x73\x8e\xcd\xa9\xf8\x7b\x38\x1e\x1a\x6a\xe3\xed\x6e\xfd\x82\x1a\x02\x4d\xb1\x6e\x55\x21\x18\xf3\x1d\xe6\xde\xf1\xcb\xff\xf5\x1f\x4e\x6c\xf8\x70\x3c\xd5\xaf\x57\x8b\x97\xf0\x82\xa9\x39\xfa\x31\x51\x10\x93\xd4\x5a\x96\x75\x24\x56\x1a\x05\x5a\x60\x8e\x6d\x39\xdf\xf0\x0d\xaa\x79\xc7\x33\x1a\x11\xd7\x08\xfa\x5d\xbc\x0b\xc4\x74\xac\x7e\x0a\xd4\xdb\x76\xc7\x43\xc2\x11\x56\xa2\xde\xeb\xff\x9c\x44\x35\xb3\xfc\xfb\x81\x09\x60\xd1\xe8\x42\xc9\xf9\x6f\x17\xd0\x66\xdf\xe3\x28\x0a\x20\x1c\x76\xc9\x2b\xd0\xbb\x66\x90\x0e\x47\x51\x62\x65\x32\x9a\xbe\xd3\xbf\x30\x0d\x54\x23\xad\x44\x1a\x51\x9a\x70\x8f\x65\x42\xd9\x8d\xac\x86\x45\x81\x38\x95\x19\x55\x6d\x1a\xd1\x54\x0b\xd3\xf1\x72\xbf\x2d\x7e\xfc\x71\xf7\x78\xeb\x4f\xc6\x02\xeb\x04\xbd\x58\x5f\xdd\x6d\xd7\x8b\xdb\xf6\xd0\xf8\xb2\x19\x65\xb2\xd3\x48\xfd\x3e\xe1\x11\xb8\x31\x5c\x4b\x2c\x41\xdb\xaa\x8a\xc3\x31\xcf\x27\xc3\x51\x4c\xb8\x17\x03\x7f\x10\x7f\x95\xa8\xef\xfb\x5a\x41\xfd\xda\x19\x78\xd1\x28\xa6\x81\xb2\xb6\x3e\x35\xb2\x28\x20\xab\xca\x61\x88\x10\xc5\xcc\x32\x19\xd1\xfc\x79\x03\x8d\x6d\xed\x0c\xa8\x9c\x34\x4a\x82\x98\x77\x3b\x30\x7e\xf8\x9b\x0b\x46\xfc\x00\x11\x22\x77\x6b\x9d\xed\xef\x74\x3f\x4f\x12\x1d\xa0\xc7\xdc\xfe\x04\x75\x3d\xa3\x9c\x42\xa3\x94\xd1\x44\x7b\x12\xf3\x49\x77\x5d\xa2\xf6\x48\xea\xa9\x36\x0f\x80\x5c\xce\xd7\xec\xe8\x30\x88\x7e\x08\xd7\xc8\xd6\xd9\x2c\xfe\x58\x2d\x9f\xee\x1e\xbb\xbf\x4b\xc0\x78\x79\xf1\x6d\x39\xfa\xa5\x52\x07\x3c\xed\x42\xc7\x67\x51\xd7\x68\x72\xfa\xa9\xd7\x41\x7f\x99\x8a\xa4\x88\x71\x3f\x94\x85\x8d\x9a\x07\xcc\x02\x1a\xa9\x88\xe1\x5e\x71\xdc\xd9\x15\x72\x37\x36\xcd\xfa\x54\x4e\x77\xb8\x62\x44\x2a\x4a\x11\xbf\xba\xc3\x0c\xa1\x80\x0f\xe4\x9f\x5f\xf4\xc2\x69\xa4\x69\xe8\x64\x4f\xdf\xcb\x37\x9b\x44\x7e\x1f\x97\xd2\xdb\x31\x09\x42\xb3\x3b\x14\xc9\xa5\xad\x0e\x8d\x74\x0a\x1a\x3c\xb3\xf2\xe8\xfc\x83\x27\x43\xa4\x41\x95\xcc\xab\x53\x9e\x43\x93\x15\x57\xe5\x94\xfc\x4e\x23\x93\x08\xd7\xff\xd9\x67\x35\x5a\x59\xfe\xab\xe8\x35\x8b\x47\x3f\x92\x06\x61\x8a\x6e\x27\xed\x06\xd7\x5e\xf4\x10\x0f\xf3\x55\x81\x9b\xd2\x40\x32\x14\x48\x5c\x35\xaf\xcf\xe7\x4a\x1c\x32\x1d\x04\xff\x72\x3a\x82\xed\x51\x5b\xd8\x6a\x7f\x4a\x59\x40\xf3\x2a\x6e\x45\x03\x1f\x62\xf2\x93\x69\x60\x62\xe3\xa4\xde\x90\x32\x89\xdd\xf3\xaf\x9f\x3d\x0d\x89\x65\x3b\x67\xf5\x73\x05\xdd\x42\x66\xfd\xb1\x7e\xeb\xc6\x40\xac\x7a\x23\xa3\x9b\x2e\x89\xff\xfd\x61\x72\x05\x21\xa7\x18\x90\xdf\xe5\xf9\xe9\x90\x15\x03\xed\x7f\x4a\xc3\x38\xe4\x51\xb7\x5d\x0d\xdb\x35\x94\x46\x22\x40\xfc\xa3\x2c\xcb\xb1\x5e\x32\xa5\x91\xb2\x72\x88\x56\xd1\x79\x09\x75\x93\x99\x4c\x0d\x56\x96\xc9\x0f\xa2\x92\x07\xae\xbd\xfd\x58\x5a\xef\x23\x0b\xdf\xf1\xc7\x8d\xa1\x0e\xf3\x8b\xba\x5a\x88\xde\x6c\x47\x0c\x90\xa3\x6e\x28\x8b\x08\x06\x66\xed\x32\xbb\x3b\x3a\x68\x9f\x3f\x46\x43\x34\x43\x68\xfa\x22\xa3\x3b\xc2\x25\x13\x5e\xc1\xcd\x52\x52\xff\x0b\x17\x75\x18\x3f\x16\x62\xb4\xdb\x2b\x4f\x4d\x03\x15\xb6\x7b\xbc\x92\xbf\x3f\x5d\x1c\x5a\x35\xac\xc5\x6a\x39\xaf\xd6\x39\x9a\x82\x71\xa2\xb1\x29\xe0\x44\x69\x4f\x55\x51\xbe\xf7\x92\xf9\x93\x5b\x15\xa7\xb6\xf3\xd9\xae\x9b\x55\x1b\xb3\x7a\x90\xea\xfc\xc6\x49\x63\xa1\xac\xcf\x0b\x96\x0c\x37\xe5\x01\xbe\x7b\x2d\x3c\x4a\x63\x65\x30\xa3\x6a\x53\x8c\x7f\x9e\x84\xe5\x17\x0e\xed\xba\xdd\xb8\x24\x20\x88\x01\x3e\x62\x8d\xf6\x79\xbd\xea\xfc\x0a\x28\x4d\x49\x32\x40\xb2\x2d\xb3\x0a\xc3\xd8\x7e\x2d\xa2\x29\xb3\x6e\xc6\x0f\x77\x8f\xbb\x97\xcd\xf5\xee\xe6\xe5\xf1\xba\x3b\x96\x72\xd5\x41\xa2\x9e\xab\xb2\x34\x63\xc3\x9c\x3e\xee\x1e\x56\x38\xfd\x87\x15\x47\xab\x83\xf6\x51\x6b\xd1\x08\x7f\x52\xc1\x00\xf7\x06\x2b\x8a\xd0\x3f\x64\x19\x24\x91\x9b\x65\xab\x85\x87\xf8\xc1\x48\x33\x82\x52\x29\x62\x6c\xeb\xef\xe0\x67\x56\x37\xcf\x27\x99\x67\xea\x0f\x38\xcf\x22\x64\x28\x95\x9a\x11\x3d\x14\x29\x19\x95\xb3\xa8\xd4\xdc\x7b\x6c\xb6\x8f\xf4\xbe\xbc\x94\x12\x70\x23\x95\x50\x18\x4d\x09\xad\x7f\x2f\xe5\xe6\x58\x16\x75\x69\x69\x42\x5f\x2f\xd5\x73\xc8\x7a\x4a\x75\x1c\x59\xa3\x43\x94\xf3\xd8\x0e\x18\x10\xdf\x44\x7d\x59\x54\xfb\xec\x2b\xe6\x57\x1f\x6d\xe2\x50\x77\xde\x28\x23\x21\x06\x4a\x21\x14\xf6\xe5\x28\xf2\x33\x8a\x89\x54\x0f\x7d\x86\x4e\x41\xa5\x21\xf1\x86\x33\xf7\x59\xdd\x99\x98\x4d\x96\x24\x50\x0a\x03\x00\x3b\xdf\x06\x93\x0d\x74\x82\xb2\x66\x59\x7d\x2d\xb2\xfc\xfc\x72\x44\x10\xfc\x1a\xc4\xaf\x4a\x85\x14\x4c\x4c\xc2\x4e\xfd\xcb\xca\x28\xe0\x32\x62\x59\x48\x13\x98\x24\xa5\x26\x8e\x31\x0e\xdb\x42\xdd\x84\xe1\x70\x4d\x34\x71\x3a\x28\x75\xa2\xdd\x77\x39\x49\xc5\x12\x3f\x34\xb1\xbd\xb8\x4c\xa1\xc0\xf0\x38\xd4\x63\x24\x60\x58\x04\x38\xb6\xd3\x62\xd2\xe9\x1c\x4e\x23\x46\xc2\x14\xa5\x4a\xde\xcb\x06\x3c\xe7\x61\x6e\x71\x60\x84\x59\xd7\xf9\x0e\x83\x11\x76\xdf\x15\xa7\x58\xb9\x2f\x5c\xe7\x1d\xf3\x6c\xbf\x94\xb3\x28\x49\xb0\x29\x74\xb7\x7c\xda\x3d\x7f\x5b\x6c\x56\xd1\x48\xfb\x94\xb2\x28\x4d\xb0\xc4\xe5\xc8\xfd\xdd\x69\x23\x61\x64\xd2\x09\xbe\x5e\x67\xf5\x31\x17\xe7\xe1\xd2\xcd\x22\x23\xb1\xf1\x31\x80\xc9\x4c\xaa\xfb\x8c\x86\x22\xf6\xdd\x96\xfb\xef\x0e\x30\x9e\x76\x47\x15\x45\xd9\xc4\xaa\x6b\x98\x30\x0a\x3c\x74\x5a\x95\xb6\x12\xf0\xf7\x78\xff\xe3\x77\x97\x71\x6d\x71\xf0\x6d\x68\xf4\xde\x2e\x5d\x1d\xfa\xcf\x0f\x00\xa5\xac\xe1\x07\xea\xb9\x0d\x6b\xc6\x2c\x21\x49\x3a\xf6\x5c\xbb\x1a\xcf\x61\x96\x06\x0a\xc9\x44\xd6\xc6\xa2\x8f\x11\x59\x4a\x15\x2e\x43\xfe\x51\xfc\xf3\xd4\xee\x8f\x9d\x91\x07\x65\x29\x07\x0c\xed\x6a\x2f\xba\x66\xb5\x6e\xf3\x76\xc9\x5a\x68\x3d\xac\xf0\x8d\xe4\xc7\x29\x4b\x55\x84\xfd\x45\x5f\x0f\x7a\x29\xd4\xe8\xf5\x64\x22\xb4\x6f\xc1\x21\x2b\x9a\xa5\x38\xde\x15\x2f\x9b\xeb\xee\x98\x31\xc8\x89\x3d\x9e\xf2\x31\xbe\x8e\x32\x19\xa6\x81\x1e\x00\x9a\x9e\x2b\x68\xf6\xfd\x51\xc7\xba\xb3\x91\xc8\xc0\xf6\xfd\xeb\x94\x89\x49\xa7\x02\xd7\x94\xb7\xd9\xfb\x40\xc3\x91\x32\x45\x13\x6d\x7b\xaf\xea\xd4\xa6\x10\xbb\x85\xd6\xed\x86\xfd\x51\x56\x7a\xf3\x2a\xa2\xf6\x71\x6c\xcb\xab\x36\x67\x77\x15\xe5\xe1\xb3\x51\xc6\xa0\x91\xf5\x6b\x79\xaa\xa1\x1d\xb4\x2e\xbd\x47\x36\x65\x5a\xa6\x88\x65\x59\x42\xd1\xd4\xc7\xb2\xcc\xc5\xa8\xf0\xc6\xb4\x4e\x10\xe7\x63\x2b\x65\x57\xa7\xaa\x18\x59\xe2\x53\x66\xb8\x46\x34\x89\x2b\x3d\x08\xab\x53\x84\x80\x9f\xf1\xcb\x68\x64\x18\xb8\x08\xf0\x11\x3e\x1c\xd3\xd0\xa5\x1c\x73\xab\x36\x0f\x68\x42\x7a\xe7\x38\x44\x3e\xf9\xcb\xe2\x01\x0f\x85\x1e\x87\x89\x83\x7a\x00\x0f\x84\xc1\x82\xe4\xd4\xe4\x62\xfe\xce\x73\x12\x6a\x7b\x13\xae\x7f\x5d\x38\xe0\x21\xb1\xbe\x24\x28\x53\x74\x55\x36\x4d\x79\xf0\x5f\x1b\x26\x0a\xf7\xfe\xd5\xe3\x66\x8d\xb1\x76\xd5\xc5\x16\x3c\x0a\x02\x50\x4e\x16\xb2\xfb\x1b\x09\x0c\xf7\x8a\x22\xae\xc4\x3a\xbf\x21\xf2\x48\x58\x33\x62\xa1\xf5\x50\xa6\xdf\x1f\x95\x4a\x7b\xed\xe2\xed\x6b\x55\x7e\xd4\x9b\x36\x74\xec\x60\x02\xed\xb3\x7b\x2c\x87\x42\x5a\x94\x53\x16\x22\x6b\xd0\x75\x90\x87\x9e\x36\xd8\xca\x5a\x34\xeb\x19\x4f\x70\xff\x61\x6e\xd1\x72\x03\xd8\xe7\x74\x84\x66\x49\xe8\x43\x99\x6f\x28\x0f\x7a\xb6\x64\xdf\xdf\xa6\x03\x53\xb4\xab\xea\xfc\x9f\x56\x48\xec\xc8\xaa\xee\x36\xb1\x28\xc0\xd8\x1d\x79\xfd\xcf\xe2\xbc\x38\x34\xdd\x21\xaa\x51\x7b\xa6\xe9\x0b\x78\xa7\x7a\x84\x36\x1b\x5e\x3f\x09\xbd\x8e\xae\xff\x38\x30\x27\x2c\xdd\xef\x82\xcf\x25\xba\x2f\x75\x73\x89\x47\x44\x39\xcd\x47\x6f\x4e\xfc\x4d\xcc\x40\x5c\xfc\x70\x19\x5b\xf3\xd2\x36\xcb\xf7\xe7\x88\x03\x6b\x06\x61\x5f\x92\x55\xd1\xa0\x30\x5d\x5f\x4e\xed\xdf\x27\x1e\xa7\x32\x18\x6a\x1e\xb4\x6b\xd7\x5c\x62\xce\x93\xc0\xe2\xcd\x5c\x71\xde\x16\x32\x1d\x3b\x78\x3c\x3b\xd2\x48\x63\x30\x65\x6b\x92\x4f\x56\xaa\x7d\x99\x97\x98\x5c\x67\x9f\x90\x30\x29\x4f\xa5\xc0\x12\x8e\xbd\xe8\xe7\xf2\x0d\x0e\x9f\x9b\xe7\xfb\xcf\x68\xae\x7a\xe1\x1e\x9d\x15\xfb\xfb\xf2\x43\x89\x23\x86\x24\x53\x10\x03\x17\x89\xc0\xf8\xa7\x3e\x1d\x8f\x65\xd5\x6b\x37\xfb\xdb\x26\x95\xc6\x34\x04\xdc\x0d\xb3\x4e\x6d\xee\x20\xb8\x2c\xbb\x86\x66\x99\x9f\x80\x8e\x42\x4d\x0e\x00\x58\xc8\xb1\x42\x61\x37\x2f\xdb\x97\xf5\x6a\xb7\x5c\xf8\xae\x4d\x1c\x70\x23\x88\x8f\xda\xda\x5d\xae\x5e\xf6\x57\xe9\xc7\x08\x81\x6f\x95\x0d\xbb\xae\x4f\xd5\x30\x8e\x8f\x89\xb1\x47\x3b\x27\x9d\xee\xba\xe3\x48\x47\xd8\xe5\x5b\xfd\x25\xaa\x6c\x7d\x6a\x4f\xee\x0f\x51\x96\x5a\xb7\x76\xfb\xd6\x39\xcd\x8b\xeb\x93\x07\x84\xd2\x98\x26\x44\xa4\x08\x3c\xfc\xeb\x43\x0c\xab\x23\x31\x0b\x54\x57\x4c\xca\x8a\xec\x74\xb8\x2b\x8e\xa7\xa1\xa0\x0e\x8d\x19\x23\x88\xd4\x38\xbc\x61\x33\x79\xfa\xb0\x7c\x64\x30\xbc\x55\x31\x4b\x20\x09\xfd\xad\x58\xd4\x6d\x90\xdc\xe1\xad\x67\xdf\xed\x98\x09\x82\x4f\x79\x71\x7f\xff\xb4\xdc\x6d\x57\x0b\x8f\x5e\x88\x39\xd3\x32\x9e\xb0\x8c\xc7\x94\xa1\xf9\x33\x72\x0d\xa1\x83\x88\xe7\x2f\xeb\xfb\xdf\xbe\x90\x9e\x71\x9f\x88\xe3\x14\xa5\xee\x6e\xb2\x77\x5f\x0a\xa4\xab\xf7\xfe\x4e\xc4\x09\xd5\x3e\x1b\x72\x35\xf6\xeb\xac\x2e\x3f\x8a\xc9\x3a\x18\xc7\x10\x6b\x47\xd0\xbb\x39\xe5\xf9\x36\x53\x6f\xbd\x39\xce\x57\x93\x3d\x4e\x88\xe1\xfd\x7b\xb5\x53\x25\x8c\x49\x32\x34\x4e\x62\x8d\x21\x53\x9e\x15\x6f\x2b\xaf\x15\x3b\x4c\xda\xe2\x24\x49\x90\xce\x75\xac\xca\x03\x34\xaf\xcb\xb2\x9f\x08\x89\xa1\xa4\xdb\x1d\x6a\x58\xa2\x18\xa2\x9a\x14\x4c\x62\x11\x0b\x6c\x3f\xfa\xe6\xe8\xe8\x26\xc9\xd0\xfa\x2d\x54\xd0\x54\x22\x6b\x36\x8d\x28\xb4\xa8\xf4\x8e\xfa\xef\x90\xdc\x8a\xf8\x3b\x68\xb0\x38\xde\x54\x00\xb3\x2d\x8b\x58\x42\x04\xd4\x63\xdd\x2f\xfc\x22\x3f\xb9\x45\x8a\x10\xb0\xf2\x46\x7a\xb0\x55\xb8\x83\x3a\xa6\x18\x11\x68\xeb\x2f\xdc\x01\xcb\xfd\xe1\x24\xc5\x3d\xde\x3f\x0b\xff\x67\x69\xdb\xb6\x87\xac\x83\xa2\x8f\x3a\x15\xb1\x06\xab\x54\xf7\xd1\x83\xac\x2e\x2f\x4c\x9b\x80\xba\x9b\x7b\x5b\x89\xc2\xd5\x54\x07\x81\x4d\x0c\xd4\x8a\x4f\xed\xed\xba\xdf\x21\xca\x69\x6c\x12\x12\x3b\xc2\xa7\xc9\xaa\xc3\x22\xcf\xaf\x4e\xe7\xba\x3f\x1a\x45\x23\x0b\x3e\x0c\x21\xfa\x2c\x28\x36\x22\xb6\xca\x60\x36\xfd\xc1\x38\x62\x3c\x6f\x92\x20\x08\x22\x87\x45\xf8\x6d\xee\x9d\x4d\x02\x12\xa2\x20\xcb\x60\xe1\x48\x02\x10\xbe\x1e\xeb\x08\x19\xe3\x93\x12\x2e\x11\x85\x01\x85\x7e\x32\x4e\xfa\x7d\x69\x7f\xc2\xa8\x98\x9c\x90\x14\xbc\xec\x04\xbe\xbb\x43\xf6\xfc\xec\xeb\x9b\x10\x25\xf1\xab\xfd\x52\xf8\xbb\xf8\xab\xdd\x95\x66\xf0\xbd\x34\x09\x49\x18\xd8\xb6\xe0\x3b\xd4\xcd\x5d\xf1\xcf\x13\x9c\x3e\x59\x68\x92\x48\x05\xcc\x01\x86\x50\xb2\xeb\xa6\x3c\x94\x93\xd3\x51\x6d\xed\xd6\x31\x81\xc5\xda\x0f\x7c\xd2\xf5\x4d\xa8\xb6\xf6\x74\x2e\x81\x01\xfd\x50\xbe\xcf\x56\x41\x13\x0a\x2c\x72\x10\xe9\x87\xf3\x43\xed\x21\x7e\x09\x4b\x18\x6a\xb5\x2c\xb6\x0f\xbf\x8e\x14\x13\x4e\x14\x56\x9d\x1d\xff\x43\x14\x30\xa1\x34\xce\xbf\x34\x09\xe7\x1c\x65\x46\xea\x2c\x7f\x87\xaa\xdd\x9c\xec\x1c\x71\x87\xe3\x48\x28\x67\x58\xb8\x5c\x3d\x7d\x25\x89\x47\x93\x58\xf2\xd4\xb6\x0e\x34\x4a\x24\x7c\xda\xc1\x4d\x12\x21\x51\x62\x70\xf1\xb8\x18\x64\xf7\x49\x62\x82\x00\x57\x90\x53\x81\x1e\x97\xcf\x55\xf6\x9e\xe5\xb0\x87\xfb\x93\x7a\x3b\x5f\x77\xa8\x7b\x9a\xa4\xd4\x6a\xbd\xed\xc5\x71\x12\xe2\x25\xa9\xb4\x4a\xc0\xc2\xd7\x12\x37\xcd\xd4\x07\x88\x26\xa9\x62\x98\x74\x63\x09\xc3\x71\xc8\xfc\xb9\x05\xa4\x36\xa8\x72\x09\xd7\xda\xd7\x58\xdd\x3b\x95\x48\x1a\x06\x74\x60\xdc\x75\x61\x58\x38\x2e\x24\x4c\x6e\xb8\x8c\x23\xe1\x38\xee\xd7\xd9\xfb\xc8\x5b\xd5\x8f\x50\xd6\x0e\xc2\xef\x6b\xee\xdd\xad\xb7\xe5\x23\x7c\x5c\x8b\xe9\xa4\x54\x3c\x09\x5c\x2d\x1c\xaa\xfb\xac\x78\x1b\xee\xe3\x89\x8e\xac\x73\x0f\x6a\x9d\xbe\xc3\xf2\x55\xe4\x39\x14\xfb\x69\xc6\x94\x00\x08\x6a\xe1\x68\xdd\x72\x0b\x23\x87\x19\x9a\x18\x6a\x59\x98\xd6\x33\x15\x93\x38\xff\x2d\x46\x69\xbf\x1c\xd8\x5a\x9c\x8f\x5f\xfe\x8f\x0d\x3e\x7b\xba\x34\x48\x2d\x4b\xc9\x91\xf7\xe7\xe7\x5b\x1a\x40\x9c\xba\x9f\xb6\x7c\x2d\x6b\x28\xda\xfd\x04\xe7\xbc\xdf\x6f\xd3\x90\xd8\x8a\x22\x0a\x20\xb7\x61\x5f\x7d\x75\xb6\xff\x31\x6d\x6e\xa4\x61\xaa\xb1\xdb\x7e\xc4\xb2\xe3\x06\xba\xb4\x35\x0d\xa5\x8e\x9c\xc1\xe8\xc3\x29\x9f\x79\x62\x69\x24\x03\x6c\x78\xdd\xae\x36\xc3\x9b\x9f\xd2\x50\xe8\x61\xe3\xe5\x0a\xb9\x6d\x36\x22\xf8\x32\x46\x49\x29\x8d\xbc\x7c\x81\xad\x43\xac\x44\x75\xa1\x32\x49\x53\x2a\x6d\xff\xe0\x5d\x54\x19\xde\xf0\xe7\xaa\x94\x42\x7a\xbd\x1c\x9a\x52\x43\x8c\xec\x71\x47\x03\xa8\x99\xc3\x3e\x77\x11\x68\xca\x62\x2b\x99\xb2\x7c\x5a\xaf\x1e\x3d\x06\x9f\xa6\x2c\xb5\x75\x8d\xe7\xf5\xea\xe1\xee\xe5\x61\x87\xfe\xa9\xcf\x8b\xe5\x1f\xbb\x81\x85\x2a\x4d\x39\x89\x62\xab\xc6\x87\x05\x9d\x5d\xbb\x8a\x22\x75\xea\x66\xe2\x1b\x4b\x53\xce\xac\x4a\xe1\xcd\xe2\xb9\x8d\xdb\xfd\x19\xe2\x30\xc2\xf4\x6a\xb9\x5d\x5e\x0a\x80\xd0\x34\xd6\x04\x4b\xd9\xdb\x2c\x9f\x82\x04\xdd\x88\x24\xb0\x70\x0e\x5f\xdc\xd9\x34\xa2\xaa\xb7\xa5\xfb\xd5\xfe\x6b\x12\xca\x10\x5b\x80\x50\x8e\x65\x0e\x5d\xd6\x9c\x26\x2e\xe8\x78\x04\x5b\x28\x33\xbd\x6d\x23\x4d\xd3\x14\xb0\xe3\x02\x85\xbe\xd0\x0a\xa3\x69\x2a\x42\xee\xa6\xa2\x4b\x3f\xef\xc1\x34\xdb\xb2\xd3\xa8\x9a\xde\x83\x54\x86\x18\x51\xea\xb2\xcd\x9c\xdb\x2c\xfa\xa9\xc0\x16\xf0\x75\xf6\xee\x4f\xaa\x80\x20\xfb\xdc\xe1\x96\x8f\x75\x1b\xdc\xfb\x83\x3a\x12\xd8\x4f\xa9\x9b\xd2\xea\xa5\x74\xb2\x23\x6e\x00\x44\x92\xbb\x6d\xe5\x19\x8a\x36\x26\xfb\xea\x85\x74\x1f\x32\x54\x18\xdd\xbb\xb8\x0d\xab\x89\xa9\x61\xb1\xa7\xa8\xdc\x8b\xba\xb9\x87\x77\xf0\xaf\x88\x08\x52\x29\x2c\x94\xaf\x58\x28\x05\x75\xbd\xfa\xa9\xf2\x53\x3d\xc0\x35\xf8\x81\x82\x63\xd1\x72\xb3\x87\x5f\x4b\xef\x52\x11\x40\x48\x95\x57\xee\x2b\x1b\xb1\x6c\x13\x7c\xff\xa5\x24\xb6\x56\x41\xb6\x6f\x07\xae\x0a\xe2\xa7\xbe\x08\x43\x46\xc0\x53\x7f\xfd\x1f\xa3\x30\xc0\xaa\xc9\xe6\x65\x71\x3c\xfe\xb2\x3d\x24\x22\x16\x8b\xd0\x9b\xfd\xf4\x2e\x5a\x93\x1f\x15\xa5\xda\xdf\xb5\xe5\x6b\x96\xeb\x3b\x3d\x5f\x23\x16\x94\x58\x23\x84\xab\xbb\x87\xbb\xdd\xf5\xe2\x69\x17\x11\x7f\x61\x8c\x70\x2c\x3c\x0a\xad\xd7\xdb\xa7\xf9\x86\x92\x60\x8e\xa7\x7f\x40\x86\x25\x22\xfe\xf3\xf3\xd5\xf9\xaa\x6a\x23\xde\xc9\x45\x31\x30\x6c\x28\x4a\x84\x3e\x1b\x6d\x06\x5e\x9e\xe6\x34\x25\xa9\xe0\x9c\x63\x61\xea\xf1\x74\x68\x86\xcd\x46\x11\xc7\x12\xb7\xe5\xac\x7e\xa9\xa1\xba\xb2\xaa\x14\x93\x6f\x8b\x85\xed\xba\xed\xe4\xe9\x7c\x57\x5c\x8d\x9c\x33\x3e\x89\xda\xa7\xf0\x10\x91\x68\x8d\xf0\x10\xd7\x8b\xf3\x5d\x81\x61\x3c\x22\x12\x13\xa1\x51\x4b\x93\x1d\xe0\xc9\x0c\xbc\x50\xa8\x48\x23\x6d\x4b\x9a\x7e\xb1\x15\x75\xa6\xbe\x5e\x66\x45\x1a\x1b\x64\x56\x39\x7f\x75\x2c\xb0\xbd\x1c\xf1\x21\x7e\x9d\x6c\x88\x34\x15\x58\xd4\x1f\xa6\x77\x22\xd5\x84\xf1\x2e\x49\xfb\x21\x32\xbc\xe1\x2f\x45\x93\xe5\xbe\x2c\xfc\x54\x4d\x7d\x59\xdd\x67\x45\x48\xd1\x8c\xf3\x54\x60\x15\x0b\xf4\xcb\x71\x8f\x60\xca\xf1\x8d\x96\x61\x8c\x40\xcb\x7d\x66\x9a\x3b\xbd\x2d\x11\x1a\x3b\x3e\x93\xd4\xc2\x19\xdf\x17\xba\x93\xbc\x5b\x14\x7a\x29\xf2\x8b\x68\x75\x98\x1f\x0a\x09\xb6\x08\x73\xf5\xf4\x78\xed\x29\x50\x42\x31\x8a\xf8\x78\xf8\x09\x95\xca\x6a\x58\xbe\x6c\x56\xf3\x31\xaf\x50\x89\xd0\xa9\xdf\x6d\xdb\x3c\x0a\xbc\x9e\xe4\x27\x21\xa3\xd0\x01\xc1\x17\x62\x53\xaa\x4c\xe4\x99\xf1\x8b\x8d\xd0\x5c\x32\x79\x91\xdb\x7f\xda\x90\x1b\xfe\x0a\xe0\x14\xef\x90\xa8\x2a\x71\x1e\x4e\x1e\x19\xf0\x48\x3b\x06\xf5\xa3\xe3\xcd\xff\x2d\x9e\x41\xf7\x71\x2b\x90\xd0\xde\x72\xdf\x7a\xfb\x72\x92\xc8\x20\x8d\x11\x79\x67\xbf\xd0\xea\x60\x8d\xbf\xd0\x87\xc4\x32\x10\xd6\xfb\x70\x71\xfd\x72\xbf\x5d\xbd\xf8\x22\x87\x24\x94\x62\xca\x6d\x55\x05\xfb\x95\xde\x81\x4a\xbe\x9c\xde\x92\xc4\xa9\x76\xcb\xa7\xe7\xc0\xdf\x0e\xb1\x66\xff\xc7\x26\xe4\xa7\xff\x5e\xf0\x60\xfc\xf7\x4b\xde\x4f\x08\x55\x56\x56\x0a\xcc\x9b\xc9\x58\x28\x6c\xdd\xfd\x52\x9d\x2a\x1f\xf4\x5d\x26\x81\x6e\x50\x18\x4a\xc4\x0c\x66\xaa\xdc\x89\x09\x35\x99\xca\x30\x8d\x70\x75\xbf\xc9\x0a\x71\xec\x92\x7b\x19\xea\x08\xd3\x8d\x63\x9b\xbf\x47\xc3\x4d\x4d\x46\xd2\x5a\x06\x2e\x74\x7b\x39\x59\x31\x6c\x66\x48\x6a\x4c\xe0\x43\x75\xd1\x58\xaf\xff\xf9\xb7\x57\x32\x1a\x85\xae\x19\xb7\x50\xcd\x49\xe4\x43\x96\x32\x95\x2c\xb5\x5e\x09\xdb\xd5\xe2\x61\xd8\x84\x97\xac\x0d\x9e\x7d\x3d\xec\xc2\x87\x9f\x4a\x9e\x50\xe4\x9d\xf5\x58\xab\xa5\xf0\x9b\x99\xe4\x89\x46\x59\x0e\x07\x68\x84\xca\x79\x4d\xd5\x57\xe5\x64\x8b\x92\x31\xa1\x48\xfc\x43\xd7\x9c\x75\xbb\x82\x37\x37\x25\xa6\x7b\x56\xcd\x66\xf8\xe4\xbd\x34\x46\xe0\x3f\x1b\x5b\xdb\x56\xec\x7f\xbc\x0b\x8d\x35\x9b\xc9\xf9\x13\x16\xe3\x2d\x1e\x09\x6f\x8f\x87\xa4\x4a\x63\x40\xe2\xd6\xb5\x75\xb6\x1f\xb0\x67\x7d\x95\x5c\xa6\x9a\x18\x2b\x23\x59\xbe\x9d\x3e\xa1\x1a\x49\x11\x0a\xe2\x30\x11\x0a\x8a\x06\x31\xd2\xc3\x91\x49\x37\x0e\x30\xd7\x6a\x17\xf7\x61\xe9\x52\x8a\xc8\x12\xae\xeb\x9e\x52\x27\x45\x0a\xa4\x23\x4e\xce\x48\xf3\xf8\x61\x26\x45\xd0\xd0\xb7\xb3\xac\x32\xed\x31\x47\x52\x12\x89\x73\x25\xab\x57\xb5\xaa\xca\x8f\x11\x22\x48\x4a\x96\x18\xab\xcb\xf3\xf3\x93\x9f\x24\x8d\xc4\xce\x04\xbe\x21\x38\xc9\xb2\x5f\xc7\x6b\x52\x45\x56\xf5\x41\x97\x3b\x44\xd5\x4d\x66\x8f\x52\x61\x24\xbb\x27\x07\x97\xe8\x6a\x37\x4e\x33\x15\x33\xaf\xbe\x67\x21\x26\xe3\x10\x61\xf2\xb5\x3a\x05\xe4\xc3\x64\xf5\x53\x5f\x05\x95\xc0\x89\xe7\x48\xf6\x99\xd8\xb7\xf2\x54\xe5\xe7\xb5\x68\x2e\x6a\x8a\x93\x6b\x00\x6d\x03\xec\x0e\xa4\x06\x85\x86\xea\x59\x9c\xeb\x36\x83\xf8\x62\xc1\x97\x00\x09\xf6\xb0\xed\x7a\xf2\x5c\x96\xf9\xe3\x27\x88\x33\x09\xc6\xe0\x02\x71\x8b\x55\x6d\xa8\xee\x96\x4f\xa3\x04\x73\xf4\x33\x55\x40\x99\x4d\x08\xbe\x0d\x25\x3b\xa8\x22\x3c\xc5\x2f\xbc\xca\xf6\x6b\xd0\x83\x0a\x86\x22\x1c\xb0\x0a\xb3\x5c\xaf\x16\xdb\xd5\xf5\xee\x79\xfd\xf4\xe0\x01\x14\x2a\x14\x02\x3a\x25\x00\x5c\x85\x1e\xfa\x4f\x86\x10\xa2\x64\xf1\x0e\xd1\xa0\x4f\xe6\x5e\x14\xda\x57\x84\x47\x17\x45\x93\x00\x95\x87\x6b\x61\x46\x14\x0c\x45\xc1\x7a\x13\x0e\x29\xbb\xdb\x72\x81\x4a\xb8\x5e\xeb\xdf\x07\xc7\x8a\xb1\x4e\x1f\x73\xd9\xcb\x04\x6d\xcb\xa5\x38\x1c\x45\xb6\x9f\x77\x4e\xa1\x8a\xa9\xd4\xeb\xd6\x3f\x88\xac\xf8\xb3\x3c\x39\xbe\xff\x44\x9f\xe2\x73\x05\x86\x29\xb1\x4e\x71\x2a\x90\x23\x74\x5b\x7a\x8c\x81\xe2\x4c\x43\xd4\x4b\xa1\x9f\x47\x65\x08\xc5\x99\x41\x40\x14\x2a\x0c\x43\x7d\x75\x6e\xd7\xe6\xc9\xcc\x57\xb1\x90\x08\xcd\xfd\x70\x31\xd8\xfc\xa4\x53\x89\x62\xca\x56\x3d\x3a\x26\xc9\x5c\x3d\x5a\xa5\x84\xe3\xda\xf0\x01\x59\x9f\xd2\xf9\xd5\x5d\xa5\x91\xe9\x74\xe0\x0b\xb8\xad\xca\xd3\xf1\xf7\x32\x43\x79\xf2\x0b\x35\x0b\xaa\xd2\x84\xa6\x56\x5d\x04\x74\xd6\x2c\xea\x6c\x88\xfa\x53\xc2\x24\xd2\x56\xd1\x3f\x44\x85\x10\x8b\x11\xf2\x4f\x49\xad\x13\x2f\x09\xd9\x2e\x54\x16\xe8\x33\x7f\xd5\xd2\x98\xd0\x51\x30\xd0\x0d\xcb\x7a\x96\x58\xad\xb6\x91\x78\x0d\x55\x2a\x24\x09\xe9\x3c\xba\x8e\x50\x35\xe7\x2b\x50\xe5\x01\x2c\x0a\x6b\xa8\xac\xd5\xff\x12\x1d\xc5\x88\x2f\x41\xda\x84\x17\xc7\xb8\xdb\xde\x7e\xf2\x3a\xe9\x24\xe1\xae\xf9\xb1\xa8\xaa\xab\xb2\xcc\xd1\x13\xd9\xa7\x40\x4a\xeb\x08\xfb\x39\xf2\x74\x5e\x42\xd5\x88\xac\x98\xd5\x3c\xf6\xa3\xc1\x0a\x63\xdc\x8b\xaa\xbe\x05\x79\xaa\x9a\xba\x11\xfb\x7a\x5f\x9d\x3a\x40\x81\x82\x44\x60\xf5\xdb\xe1\xe3\xbc\xdb\xd0\xca\xe5\xf0\x93\x07\x03\x8a\x45\xdd\x5e\x7b\xd3\x86\xaf\xfa\x29\xb7\x11\x74\x67\x6c\x63\xf9\x2a\xfe\xfc\x86\x71\xac\x38\x3c\xaf\x57\x9b\xc5\xfd\xaa\xfb\xb3\x4e\xb1\x60\xbe\x7e\x7a\x79\xbc\xde\xd1\x9d\x3b\xbc\x43\x85\x81\x6e\x90\x49\x0d\xeb\xa5\x27\xda\xdb\x31\x7e\x7c\x3a\x08\xac\xa1\x5d\xbb\x7a\xab\x72\x40\xbc\xf5\xc7\x09\x24\x28\x71\x5a\xa1\x3d\xe4\x7c\xce\xa9\x83\x58\xc5\xae\x10\xfd\xa3\xac\x72\x3d\x96\x38\x6c\x8f\x43\xd2\x69\xba\xf6\x12\x7f\xfe\xa8\x52\xd2\x95\xe7\xbf\xb7\x09\xa4\x07\x40\x3c\x43\xd5\x09\x16\x52\x1d\x80\x35\x58\xae\x44\x65\x67\xd9\x30\xc6\xd2\x84\x98\x88\xf9\x28\x30\xb7\x34\xbf\xf1\x2f\x25\xa1\x44\xa0\xa4\x2f\xe9\x6f\x9a\x93\xce\xca\xba\x3b\x01\x8d\x43\xd7\xe8\x6d\x37\x92\x31\x5d\x4b\x13\x9e\x98\xd8\xf7\xd4\x0a\x3d\xf2\xae\x9e\xeb\x67\x68\xa2\x28\xee\x34\x27\xd4\x0b\xb1\x12\x12\xfe\x90\x8e\x51\xa1\xf2\x79\xb5\xbe\x7b\xf2\x41\x9a\x8e\x08\x45\xd8\x49\x86\x44\xa5\xac\x70\x7b\xe3\xf8\x37\x44\x8a\x60\x06\xbc\xfc\xd7\x3d\x26\xe6\x43\xdd\x6a\xaa\x23\xb0\xb8\x98\x5e\xb7\x53\xaf\xba\xd4\x55\xd3\x80\xa7\xd4\x13\x0f\xe0\x90\x4d\xad\x59\xa9\xa6\x3c\x44\xba\xb4\xbd\xe6\x76\xc5\x8b\xba\x0f\xa7\xb6\xd0\xb3\xc6\x1c\x56\x0f\x00\xf9\x93\x73\x30\x12\xa0\x25\x34\xa2\x76\xac\x42\xd0\x68\x6d\xd1\x3c\xb0\xf2\x40\x47\x54\x52\x75\x96\x56\x5f\xa2\x59\x34\x67\xb1\x52\x1d\x6b\xcd\x6e\xf1\xcd\x37\xa8\xca\xcf\x25\x00\xa9\xe6\xd2\x4a\x31\x5c\x9d\xce\x37\x65\xf5\xed\x8f\xdb\xb9\x8c\xe6\x6f\x55\x8a\x35\xd7\xd4\x27\x0d\xcf\x42\xbd\x89\x3d\xf4\xea\xcc\x7e\x71\xd3\x09\xe1\xc8\xc7\x2d\xca\xaa\x79\x15\xfa\x3d\xab\xbd\xdf\x04\xd5\x09\xe3\xa8\x6d\xa0\x41\x9f\x50\x10\xc3\x1f\x48\xc3\x18\x6b\xba\x28\xc5\xe1\xd6\x4c\x7f\x48\x29\xd4\xbc\x3d\xa2\x15\xc2\x75\x56\x1f\xa1\xaa\xbb\x38\x48\x0b\x1a\x78\xf7\xbc\x2b\xa1\xaf\xa0\x99\x6c\x4e\x5a\x50\xbb\x39\x3d\xfd\xb0\x9a\xb5\x8b\x4a\x76\x9f\xe5\xdc\x86\x01\x56\xc1\xde\x4b\xb9\x5d\x9c\x41\x5b\x49\xea\xe2\x74\x70\xda\x3f\x6d\x52\x05\x75\xb7\x34\x69\x61\x0c\xf1\x58\xec\xd1\x63\xe8\xee\x8a\x24\xb6\xf6\x61\xc5\x51\x97\xa2\xd0\x48\x40\xa9\x27\x56\x52\x7e\xb4\xe1\xc8\xae\x90\xa7\xf3\xc2\xb6\xad\xdb\xa8\x7b\xea\x6c\xe8\x06\xab\x48\xe3\x53\x39\x15\xf2\x54\xe8\x4f\x7c\xaf\xa9\x06\x4e\x11\x4b\xbf\x11\x95\x67\x8e\x6b\x30\x04\xed\xea\xbc\x75\x43\x87\xa0\xf5\xbf\x0c\x02\x26\x93\xb4\x57\x98\xd5\x9b\xd7\xec\xd8\x1f\x14\x22\xf2\xe0\xa4\xa5\xc8\xf3\x2b\x31\x5d\xe6\x21\x90\x96\xbe\x72\xc8\x8a\xcd\xe9\x60\x21\x82\x7b\x60\x3d\x1a\x0f\x48\x6a\x22\x57\x39\xbc\x82\xba\xb9\x6d\x23\xeb\x0d\xa2\x76\x30\x7d\xda\x42\xd1\x88\x36\xba\x77\xea\x2a\xf6\x21\x0e\xed\x08\x10\xb2\xe8\x4f\x26\xe2\xc4\x36\x70\xab\x0a\x54\xe3\xd1\x0e\xed\x42\x76\xb5\x5d\xfe\x5c\x6d\xbf\x4d\xae\x2f\x4c\xac\xc1\x38\xa2\xe8\xb7\x65\x55\x16\x4d\xb9\x1e\x94\x7e\x21\x0a\x63\x04\xa3\x3c\x88\xbf\xee\xb3\xba\x79\x2c\x9b\xef\x1d\x1c\x04\x22\xa1\x91\x9d\xb6\xf3\xd6\x93\x18\x9e\xf5\x5a\xe4\x7e\x98\xa2\x89\x2b\x37\x8e\xd8\x87\x64\x5a\x02\x71\xe3\x59\xa0\xb0\xb8\x36\x58\xbf\xe8\x78\x79\x01\x46\xac\x33\x53\x2d\xba\xee\x35\x30\x0e\x41\x67\x73\x58\xb5\xbf\xdc\x02\xbd\xfa\xd6\xe0\x20\xf7\x03\x9e\xb0\xc0\x95\x4b\x6c\x6a\x18\xb8\x44\xf4\x1f\x33\xe9\xe9\xf8\x9f\xfe\xf6\x71\xe7\x0b\xb8\x5a\x2f\xe3\x90\x60\x11\x70\x18\xbc\x03\x37\x69\x28\xed\xe2\xb3\xad\xca\xf2\x93\x14\x13\x62\x03\x48\x7a\x3b\xda\xd7\x0b\x7b\x19\x59\xb7\x04\x40\x42\x42\x04\x92\xee\x2c\xcd\xc2\x4a\x42\xb4\xd1\xda\x5d\xd1\x46\x4d\xf3\x13\x1e\x12\x15\xe0\xa7\x10\x6d\xff\x64\x7e\x80\x78\xbb\xe9\x13\x04\x48\x43\x13\x06\x5e\xec\xd0\xf1\x58\xc1\x09\xda\xc0\x50\x3f\x00\x52\xa1\x88\x5b\x62\xdc\x6e\x68\xf1\x64\x23\x36\xb9\x1b\xab\x64\x82\x6c\x77\xe1\xf8\x2a\xf5\x20\x82\xbd\x29\xe7\x43\x47\xd0\x11\xc7\xdd\xac\xa3\xc6\x5e\x83\x12\x67\xd0\xd3\xa6\xf2\xe4\x53\x31\xa8\xa8\x97\xb6\xb4\x77\xe5\x93\x1b\xac\x13\x69\x92\x89\x6a\x45\x47\x0c\x18\xeb\x6a\xb9\x4f\x00\x35\x18\xa9\x6c\xca\xe6\xcd\xe7\x0a\x00\x4a\xda\xae\xfd\xee\xf8\xe1\x03\x72\x30\x86\x63\x26\x6a\xd5\x5e\x73\x31\x8a\x69\x0c\xa1\x12\x67\x80\xb5\xc4\xaf\xaf\x50\xda\xe0\x37\x7f\x90\x45\xc4\xfa\x84\x7b\x67\x9f\x6f\x33\xe0\x26\x3f\x38\x21\xa8\xc2\x03\xcd\xeb\xb6\x7c\xa9\xf5\xf0\xe5\xf6\x27\x0c\x03\x81\xad\x11\xcb\x01\xce\xca\xe2\xe9\xd8\x4d\x46\x13\xc6\x21\x66\x3a\xdb\xa7\xe7\xbf\xc9\x25\x35\xa1\x94\xde\xdd\x14\xe7\x5b\x17\xbc\x98\x50\xdb\x48\xcf\x89\xc2\x7d\xb2\x77\x98\x10\x12\xe9\x61\x73\xf0\xc9\x93\x34\x11\x0f\xb1\xce\x66\x4e\x90\x4f\x30\xe3\x26\x92\x94\x45\xbd\x7d\x46\x9b\x5e\x0d\xf2\x50\x43\x03\x85\xca\xa5\xfd\x1f\x12\x08\x12\xbb\x5d\xfe\x05\xaa\xb9\x71\xae\x82\xbe\x1b\xd9\x0d\x03\x6b\x83\x2f\xb4\x5e\xe8\x43\x56\x5c\xc0\x7e\xfc\x5e\x64\x98\x08\x89\xe8\x3d\x8b\x3a\x93\x2c\x2b\xca\xd3\x0d\xb2\x0d\x95\x01\x74\xe7\xa9\x87\x55\x1b\x26\x53\x24\x4b\x78\xeb\x97\x8e\x29\x19\x75\x23\x74\x98\x84\xde\x10\xe5\xd0\x3b\xb3\xba\xc3\x9c\x73\xe4\x17\x28\x71\x1c\xae\x2f\x86\x0b\xc1\x78\xa7\x3f\xd2\x06\x59\xce\xed\x7f\x58\xe6\x32\x49\x00\xd2\x6d\x62\xcf\xd9\x4f\x98\x50\xbf\x4d\x12\x5a\x89\xee\x0a\x84\x46\xe5\x94\xe2\x3c\x84\x20\x98\x94\x5a\x7a\xf2\xae\xef\x2c\xbb\x0e\xcf\xb3\xa8\xac\xdf\xed\xe7\x19\xf8\x4c\xd5\xd6\x9f\x96\x85\xa9\xea\x42\x49\x4b\xb4\x9c\xcf\x9c\x4d\xca\x35\x82\xff\x76\xdd\x0a\x31\x6a\x8c\x4f\x5e\x94\x54\x5a\xa8\xe6\x5b\x96\xe7\x93\xfb\x28\xb4\x12\x16\x79\x9d\x8b\xf3\x03\x34\x62\xfb\xd3\xbd\xfd\x9f\x59\x0b\x0e\xaf\x58\x05\x11\xa5\x7e\x21\xb4\xe9\xf6\xd5\x79\x39\x31\x18\xa2\x46\x45\x10\xf5\x95\xd2\x8d\x7a\x05\x7d\x9a\xf1\x17\xf9\x32\xd6\x34\xca\xa4\x91\xf5\x98\x7e\x07\x91\x5f\x5d\xaa\x1b\x3b\xd5\xe2\xd1\xcf\x83\x28\x40\xf6\xc6\xcc\x6c\x9e\x9c\xde\x50\x13\x69\x6f\xf6\x60\x95\xf8\xba\x5f\xdc\x9e\x77\x3c\x38\x89\x31\x25\xd9\xb9\x97\x7d\x18\x41\xcf\xbf\xd1\x46\x80\x82\x39\xc9\x99\x36\x86\xb8\x14\x01\xbe\xec\xd2\x75\xaf\x9f\x31\xd6\x5b\xef\x90\x15\xbb\xf7\x7e\x57\x62\x41\x10\x50\xac\x40\xed\x33\xd3\x55\x47\x58\x10\xb4\x19\x57\x6f\xb0\xfc\x5c\x36\x9b\x63\xee\x9b\x32\x2c\x08\x94\xc2\xd5\xa1\x29\xaf\x44\x0d\x2c\x19\x2c\xd5\x2c\x20\xdc\x76\xbb\xfe\xc8\xf2\x3c\x2b\xf6\x58\xa2\x9f\x87\x78\x0e\x7f\x2c\x0b\x88\xb6\x95\x8f\xf6\x2e\xe6\x65\xd9\x7d\x59\x24\x42\x69\xfb\xd4\x0d\xec\xcb\xea\x7c\xd7\x5d\x65\x64\x14\x06\xed\xae\xd0\xde\x73\x51\x58\x40\x03\xdb\x06\x70\x8d\xef\x0d\x60\x91\xfd\xfb\xd0\xf8\x7a\xfc\xed\x94\xda\x52\xe6\xd5\x62\xfb\xd4\x9d\x84\x87\x24\xf5\x90\x96\x2c\x1f\x12\x75\x58\x40\x85\xc6\xb5\xe4\xfe\xe9\x76\x77\x05\xcd\x1c\x57\x6d\x0a\xab\x75\x9f\x64\xc2\x3a\x10\xb4\x9f\x74\x06\x18\x73\xa1\x07\x0b\x98\xe2\x56\x6f\xc0\x66\xe0\x13\x9e\xf3\xfc\x67\x62\x13\x63\x75\x6c\x57\x43\x83\x05\x93\xe1\x56\xe8\xc6\x24\x01\xc7\xc0\x30\x3b\x1c\x73\x5b\x80\x5d\xc3\x7f\xea\xdf\xc6\x57\x99\x08\x2d\xad\xd2\x1c\x96\xb7\x7b\xb7\x67\x16\xa4\x91\x41\xbc\xfd\x37\x51\x3f\x96\x83\x1a\x3d\x0b\x52\x66\xe5\x8b\xac\xec\xe1\x0f\xab\x7f\x77\x53\x56\x4f\xc7\x63\x59\x74\xcc\x52\x16\xa4\xd2\x7a\x9a\xb5\xfb\x6a\x9b\xcc\xdf\x08\xd5\x94\x1e\x06\xc0\x82\x54\x05\xbe\x2a\xdd\x6e\x16\xab\xe6\xf5\xfb\x70\xce\x8a\x20\x49\x2d\x53\x04\xfe\x5d\x1e\x64\x06\xd7\x85\x98\xfc\x44\x91\xa4\x38\x35\x1e\xce\x5f\x00\x06\x06\x7d\x07\x16\x48\x93\x28\xe9\x79\xec\xe2\x0d\xac\x58\x8f\xc3\x3f\x8a\x4b\x9b\x5a\x16\xa8\xd8\xbe\xcf\x59\x91\x35\x56\xc6\x36\x2c\x4d\xe4\x2f\x52\x87\x12\x57\x1e\xf7\x0a\xd9\x87\xb7\xee\x9c\x67\xdd\x28\xa0\x14\x37\xf6\xd5\xbf\x96\xdf\x16\x8f\xb7\xab\xfe\xef\x1c\x43\x9a\x0a\x50\x4e\x6c\x2c\x34\xe5\xc7\x48\x6b\x87\xf7\x07\x9c\x2f\xd5\x19\xc6\xb3\xdb\x84\x89\x87\x43\x0d\x31\x11\xbb\xe2\x74\xd8\x95\x66\x77\xaa\x27\x84\x08\x7f\x53\x8c\x48\x31\xba\x7f\x87\xca\x42\x9a\xfc\xf5\x19\x13\xe2\x75\xbf\x66\x5a\x63\x7f\x6b\x5b\x65\xfb\x7d\xaf\xbf\xc5\x48\xc0\x88\xa6\x3d\xb2\x10\xeb\x8d\x23\x32\xfc\x30\x44\x62\x24\xd0\xca\x7b\x98\xde\xa9\x72\x0a\x5a\x1c\xfd\x70\x12\x00\xc5\x84\x1b\x9a\xd7\x27\xf3\x87\x17\xdd\x64\x24\x30\x40\xad\xc3\xcc\xc7\x1d\xa6\x98\xfe\x00\xe1\x22\x8d\x3c\x5c\xf3\xe9\xe3\x13\xaa\x32\x23\x61\xa0\x22\xab\xb4\x50\x5c\x81\x15\x0e\xf7\xa7\x08\x19\xc5\x53\x94\xd5\x5e\x14\xd9\x7f\xc1\x9b\x78\x30\x12\x26\x06\x85\x9c\xdf\x33\xf8\x88\x92\xee\xaf\x90\x58\x6c\xc8\xbe\x59\x34\x85\xa3\xf2\xf5\x67\x33\x29\xb2\x92\xb7\x9b\x9b\xbb\xc7\xc5\xbd\xff\x73\x14\x11\x4c\x93\x45\x81\x26\xd7\x58\xc6\x0c\xfd\x41\xca\xac\xff\xae\x12\xc5\x58\xd0\x98\x11\x1a\x6b\xee\x77\x54\x4b\xf0\x5a\x96\x65\xa5\xc7\x09\x02\x23\x8c\x87\xc8\x66\xd9\x79\x5d\x20\xff\x79\x1e\x68\xee\xd8\x79\x37\x15\xb4\x41\x44\x77\x84\x52\xea\x05\x02\x77\xf5\x09\x71\x42\xe3\x85\x82\x70\x05\x28\x3e\x75\x40\x6f\xde\xf6\x71\x7c\xb5\x25\xb7\xe3\x0d\x42\xf9\x1f\x84\x73\x82\xeb\xc2\x54\x46\x62\xc6\x10\xac\xab\x9c\xe2\x12\xd8\xba\xd9\x6f\x23\x57\x81\xf1\xe9\x62\x66\xfd\xcf\xee\x96\x4f\xd6\x00\xe3\xe6\x6e\xbd\xd9\xfa\x13\x26\x22\x46\xa8\x72\x73\xe8\x26\x43\x1a\x13\xec\xda\x59\xd4\xad\x45\x27\x75\xe0\x66\x46\xd2\x94\x7b\x4d\x05\xfb\x52\x77\x37\x7b\x7c\x33\x53\x15\x0c\x90\x2f\x0b\xad\x31\x82\x13\xf9\xca\x35\x74\x67\xa3\xaa\xf6\x63\x06\x19\xb9\x95\x68\x2c\x6a\x17\xaa\x9d\xbf\x32\x21\x00\x15\x7d\xda\xbd\xbe\x71\x52\xff\xe3\x77\x9e\x08\x69\x90\x6c\x74\xb5\xbc\x42\xbd\x8c\xcf\xb1\x0f\x8c\x08\x15\xa1\x0c\xa9\xd3\xb4\x58\x54\x4d\x56\x37\xf7\xd8\xa3\xfd\xb4\x81\xc6\x88\xd0\x14\x63\xe1\xbb\xda\xa9\xed\x78\x35\x11\x77\x5c\x6a\xc1\xac\xce\x4f\x67\x88\xb2\x46\x72\xfd\x27\xe7\x93\x40\x10\x23\x93\x15\x66\x68\xd2\xc1\x88\x8a\x74\xe8\x1c\x21\xee\x0e\x87\xb2\x6a\x44\xde\x4d\x48\xd5\x06\xab\x9e\x27\xae\x61\xd3\x66\xf1\xe3\xdb\xaf\x69\x88\x28\x2f\x75\xaa\x9b\xf2\xf0\x0c\x7a\x20\x85\x33\x5c\x65\xfc\xf0\x34\x02\xd9\x43\xf2\x1f\xe1\x63\x84\xe8\xf4\xa3\x8c\x40\x68\xa6\x3c\x9d\x87\xa5\x60\x46\x4c\x62\x5d\x83\xdb\xeb\xa9\x94\x9f\x11\x9e\x4c\x69\x07\x85\x81\xb4\x52\x03\xbe\x22\x7e\x53\x56\x90\xed\x27\x20\xf7\xc1\x45\x85\x81\x8a\xc1\x15\x42\x7f\x00\xbc\xe5\x67\xeb\x1b\xe7\xcf\x47\x62\x85\x54\x20\x2c\x4d\x77\x8d\x90\xb1\x71\xba\x1f\xaa\x48\xd0\x39\x78\xf6\xe4\x34\x16\x12\x1d\x59\x81\x48\x75\x1c\x9b\x9c\xb0\x30\x8c\xa3\x54\x0c\x20\xd1\xbb\xa2\xd4\x23\x13\x64\x16\x46\x41\x84\x8c\xeb\xbe\x35\x79\x41\xfc\xf9\x0a\x4c\xc3\xc2\x28\x94\xce\x8c\xd3\x7e\xc7\x4b\x0d\xd5\xc4\x30\x65\x50\xdf\x64\x61\xa4\x09\x72\x23\xbe\x43\x55\x88\x43\xc7\x30\x1e\x24\x6b\x2c\xa4\x31\x49\x53\x97\x67\x3d\xb7\x29\xe2\x05\x04\x83\x85\x54\x48\xd5\xc1\x30\xdd\xa3\x1c\xad\x5a\x21\x0b\x19\x2e\x79\x57\x79\xf9\xb3\x2a\xbd\xd2\x99\xff\x0e\x26\x24\x8a\xda\xb4\xe1\xb2\xe3\xcf\xed\x4c\x59\xed\xe4\x60\xd5\x0c\x79\x62\x04\x8a\x56\x59\x7a\xca\x18\xcc\xc9\xc2\x58\x06\x9e\x96\x8c\x72\x23\x27\x75\x81\x8d\x61\x61\x42\x24\x2e\x07\x47\x97\xee\x3e\x9c\xdb\xdb\x94\x95\xa7\x7a\x75\x90\x79\xb7\x0e\x87\x69\x18\x89\x0e\xac\x7d\x38\x36\xb0\x23\x64\xfc\xac\xd2\x54\xe1\xd7\xed\xb3\x36\x0b\x14\xdd\xac\x14\x91\xc6\x9f\xd2\x46\x29\x4b\x71\xec\xae\x5e\x50\x1e\x3b\x71\xd4\xdb\x32\xd7\x93\xb6\xcb\x3f\xc6\x2e\x88\xd3\xbf\xf6\x73\x58\x30\xab\x53\x23\x4f\x55\xf1\x52\xd4\x9d\x6c\x11\x0b\x05\x17\xe8\x35\x21\x30\x02\xef\xa8\xd5\x37\x70\xe1\x4f\xc0\x42\x01\x91\x51\x43\x1c\x60\x2e\x7c\x97\x67\x7c\xbf\x64\x1a\x32\xdd\x91\x43\xca\xca\x3a\x1b\xfb\xd3\x48\xc9\x65\x3a\x12\xab\xfa\x45\x3e\xed\x3e\xa7\x02\x15\x39\x2c\xc5\xb3\x38\x3f\x21\xd8\x52\x41\xd1\x88\xfd\x50\x94\x87\x85\x8a\x58\xb4\x63\x97\x3f\x6f\xa0\x47\x34\x4f\x92\x43\x16\x2a\x6e\xfb\x1c\x16\x49\x76\x57\xd4\xa7\x0a\xeb\x70\x53\xea\xc1\xb8\x32\x3a\x9e\xa6\x5a\x46\xf8\x8b\xec\x12\x6e\x01\x59\x17\x3f\x6a\xf0\x38\x20\xd0\xca\x61\x9a\xb0\xed\xd6\x4c\x5e\x0c\xa3\xb5\xf4\x09\xab\x5f\x51\xe6\x77\xaa\x88\xd0\x04\x93\x7c\x17\xc0\xda\x36\xaa\xf7\x20\x40\xd6\x69\x39\x0c\x22\x22\x92\x46\x78\x13\x8f\x55\x79\x28\x97\x6d\xd2\x9e\x95\xc5\x00\xcb\xc7\x22\x22\x12\xec\xb1\x66\xaa\xdc\x34\xa5\xdf\x90\xa3\x30\xb0\xf2\x9d\xd6\x7b\x6e\x6c\x23\x3c\x0e\xd0\xa2\x30\x50\xa8\xf8\x8a\x75\xf6\x30\xdc\xd9\x3d\xfc\x56\xd4\x2f\xb5\xd8\x03\x09\x02\x94\x37\xea\x2e\x29\x04\xaa\x5c\x71\xfa\xa1\xd4\x33\xd6\xdb\x2c\x8a\x12\x8a\xa9\x6c\x1b\x0a\xa3\x4c\xf3\x24\xca\x8e\x22\xc7\x8e\x77\xda\xd6\xa0\x37\x4d\x75\x52\x08\x50\xd8\x96\x28\xd4\xff\xe5\xdc\x8a\xa8\x64\x32\x76\x9a\xc1\x9d\x62\xac\x3b\xc6\x42\x83\x88\x8e\x87\xd3\xc3\xe9\x57\xc0\x66\x16\x31\x4e\x41\x0c\x91\x41\x65\xcf\x95\xee\x3d\x75\xe6\xca\x00\xfe\x04\x92\x61\xa9\xf7\x55\xd4\xaf\xab\x9f\x59\xdd\x4c\x42\xb9\x88\xa9\x18\x75\x83\x0e\xe2\x0d\x9e\x72\x7d\x73\x52\x6f\x23\xb9\x17\x16\x71\xca\xb0\x84\x64\x55\xe0\xb1\x8e\x21\xf2\x9b\x12\x25\x17\xee\x85\x9c\xdc\x3b\xae\x6c\xa3\xce\x2a\xd1\xce\xb0\xbd\x58\xc4\x8d\xe0\x1e\x13\x7f\x5b\x09\x05\x43\x10\x1e\x8b\x62\x9a\xe0\x9e\x7a\x2b\x8a\x21\xd7\x95\x45\x71\x6c\x99\xd9\xcd\xc4\xb9\xf3\x53\x3c\xe4\xd8\xf5\x94\x45\xb1\x61\xd2\xbd\xf3\x4d\x0e\x57\x03\x22\xdd\xf8\x9e\x24\xa9\xf5\x8d\x69\xf0\x81\x5f\xc1\xb0\xf4\xcc\xa2\x44\x31\x70\x42\x48\x3f\xca\xea\x0d\xaa\xe7\x01\x26\x60\x32\x79\x13\x05\x56\x6d\xe4\x24\x31\xe8\xbd\x16\xd5\x5b\xbb\xe7\x4e\xd9\x16\x2c\x4a\xb4\x95\x62\x16\x5a\x2f\x2a\x99\x4d\x89\x2f\x2c\x4a\x95\x66\xcc\xbb\x69\x0d\x56\xc0\x48\x08\x49\xd5\x40\xe4\xb6\x7a\xcf\x14\x4c\x56\xb3\xfe\x7b\x64\x20\x10\x43\x66\x51\x26\x3f\xfd\x49\x24\x31\xa8\x7a\x61\xb2\x42\xaf\x45\xf1\x76\x75\x1e\x61\x62\xbe\x2c\xb9\xb1\x48\x46\x56\x7c\x0a\x09\x60\xdb\x0a\x7e\xa9\x18\xe8\x3e\xa7\x62\x22\x5d\x7b\xeb\x3e\x33\x0e\xe3\xf8\x29\xc1\xb7\x1d\x1f\x52\xf7\x00\x77\xed\x3e\xad\x3e\xf3\x73\x63\x91\x36\xda\x57\x6e\xb7\x20\x0e\x3d\x83\x85\x45\x90\x6a\xc7\x80\x75\x00\xd7\xe1\x59\xfc\x18\x41\x62\xdf\x58\xb9\xca\x0a\x0d\xfa\x2a\xcf\x0a\xfd\x4d\xd4\xaf\xd1\x9c\xc4\x31\x7e\x42\x5a\xda\xec\x31\x17\x0a\x93\xa2\xf9\x39\x01\x32\xf2\x7c\x28\xdb\xad\xac\xb7\xe5\xd2\xb5\x51\xed\x84\x24\x9f\xab\xcf\x8d\x7f\xa4\xa1\x1d\xf4\x64\x60\x03\x1a\x8e\xa2\x84\xc8\x18\x89\x71\x04\x22\xd6\x76\xed\x32\xda\xc9\x08\x33\x1a\x84\xb6\x15\x64\x33\xb9\xaa\x23\xae\x77\xc7\xa3\x40\x33\x27\xcf\x54\xe9\xc7\xaa\xfb\x3b\x0b\x50\x69\xc0\x25\x1a\xb6\x5e\x64\x56\x3f\x8f\x59\x5f\x0f\x40\x0d\x6c\x0b\x79\x50\x90\x1d\xbf\xe6\x05\x33\x4a\x62\x5b\xaf\x44\xf0\xed\xf7\xd5\x66\x7b\xf7\x78\x3b\x32\x1a\x61\x94\x88\x18\xc1\x44\x1b\x14\xb6\x44\xbf\xe0\xdf\x46\xe5\xe6\xc9\x16\x7b\xf9\x25\x51\x68\x94\xf2\xc8\x38\xfc\xc9\x8b\xfd\xd4\xf4\x84\xd1\x28\x0d\xf0\x6d\x40\x1f\xdc\x51\x50\x31\x39\x9b\xa6\x92\x7a\x29\xc7\x36\x8a\x1b\x07\xba\x6e\x14\x8d\x02\xe5\xb2\xf8\x4d\xb6\xf7\x53\x8c\x52\x0a\x58\x4b\x92\x08\xe0\x5a\x96\x65\x4f\x51\x60\x94\x72\x8a\x32\xc3\xb6\xeb\xbf\x2e\xcb\xc3\xd5\xd9\xf6\x4d\xc6\x57\x40\xa5\x41\xa4\x9f\xb7\x46\x1f\x08\x34\x31\xda\x86\xbc\x0a\xf7\x21\x64\x24\x9e\xbb\xbf\x6b\x8d\x98\xa6\x2e\xa6\xe9\xf0\x3e\x7e\x80\x09\x85\xad\xe9\x55\xba\xde\xc9\xfc\x34\x59\x45\x68\x2c\x62\x44\x37\x36\xa7\xaa\x78\x32\x66\xf2\x83\x63\x01\x58\x27\xad\x8f\xe2\xa3\xfb\xb9\xb1\x8c\x9d\xb6\xc8\xe1\x90\x35\x0d\x40\x3d\x35\x66\x61\x34\x21\x16\x55\x8c\x05\x46\x38\x78\x93\xe6\xb2\xba\xb4\x25\xff\x9b\xff\x76\x27\xb6\x76\xac\x30\xe8\xfc\xd9\x07\xef\x07\x44\x26\xec\x0d\xeb\x5d\x2d\xea\xf7\xf2\x6d\xba\x0c\xd3\x44\x71\xd4\x67\x19\x54\xf2\x89\x3f\x49\x1a\xa7\xb6\x35\xe0\x1a\x17\xc8\xe4\xb0\x02\x15\x63\xad\xb6\xd1\xbf\xc9\x64\x52\xa5\xd2\x56\x99\xff\x25\xde\xb3\x36\xff\xea\x77\x40\x9a\x2a\x8e\xf0\xa2\xae\x9f\xe4\x83\x82\x4f\xe6\xa7\x88\x53\x84\x9e\xdd\x97\xfb\x5b\x68\xbc\xb6\xd6\xf4\x35\x1c\xae\x16\x54\x12\x92\x38\x26\xb1\x6e\x40\x1c\x10\x4e\xd6\xde\x0f\x3a\xb9\x11\x92\x9a\xae\x35\x56\x65\x28\x53\x33\xfe\x72\x09\xe0\x59\x0d\xcb\xe5\x37\xa7\x59\x15\xf8\x9f\xa2\x62\x82\xd9\xf9\x07\x64\xfb\xd7\x06\xf4\xf7\xb2\x01\xdc\x72\xea\x8b\x13\x29\x11\x7b\x8b\x08\x2f\x40\xff\xc7\x74\x88\xa6\x98\x92\xd8\xd5\xe8\x26\x6f\xcf\xf9\x85\x0c\x18\xa3\x9a\x87\x51\x32\xa9\xb3\x4f\xce\x09\xb1\xc0\x3a\x58\x2d\x0a\x74\xf2\x18\xad\xaa\x14\x64\x12\x3a\x83\xa3\x01\xa2\xc4\x11\xb7\xfc\x8f\x04\xc3\xb0\xed\x25\x4f\x67\x2c\x30\xb7\x21\x74\xbb\xf1\x22\x92\x74\xb6\x6c\x4b\x4d\x48\x45\xea\x97\x94\xe3\x31\x2b\xf6\xbd\x72\xf3\xec\xdc\x66\x41\x18\xe3\x27\x0e\xe2\xe7\x43\x56\x9c\x1a\xa8\x9d\xcc\xca\x28\xac\x62\x01\xf0\x88\x7a\x06\x7f\x23\x9c\x9b\xfc\x01\x8a\xa6\x46\xea\x75\x37\x90\xa8\x28\x8e\x06\x03\xd7\x70\x3c\x59\x13\xf5\xb9\xac\x9a\x85\x21\x24\xa9\x87\x28\x8f\xa5\xea\xc6\xf7\x9c\x45\x84\xe3\x43\xc2\xd0\x43\x74\x1a\xc7\x8c\x45\x32\xb6\xfa\x65\x08\xa6\x1d\xe0\x1e\x5e\x8a\xcc\x43\xa5\x18\xa3\x2c\x45\x96\xee\x4b\x0d\xd5\x8e\xf5\x7f\xb5\xfa\xc8\x98\x6a\x5a\x74\x45\x77\xc8\x24\x76\x8a\xf9\xda\x4d\x9e\xff\x80\x6c\x3c\x8d\x59\xfb\x9c\x47\x0c\xde\xdf\x85\x7a\x3b\x96\x9f\xfd\x06\x96\x30\xde\x09\xa3\xcc\x97\x09\x19\x27\x09\x42\x89\x2c\x33\xbd\x86\x5e\xf6\x92\x31\x1e\x69\xac\x52\x5c\x65\x79\x6e\xb1\x7d\xdd\x11\x26\x84\x55\xad\xd4\xe8\x4a\x7a\x19\xd3\x30\x9e\x70\xe2\x22\xcf\x5d\xf3\xb9\x09\x0d\x63\x5c\x24\x88\x8f\xcc\x0a\x65\x21\x71\x96\x05\xe1\xe4\xd6\x67\xe0\xce\x8c\x71\x63\x70\x45\x7f\x84\x8f\xab\x4c\x7f\xa9\x54\xcd\x58\x4c\xe3\x44\x74\xaa\xe1\x13\x92\x95\x1f\x23\x88\xd7\x7d\x5c\xc3\x31\x3f\x8f\x90\x9e\x7e\x8c\x4a\xb1\x9c\x52\xe7\xe2\x1d\xec\xde\xd9\x23\x6a\xba\xe7\x98\x10\x8e\xf9\x82\xc8\xaa\xeb\x81\x13\xaa\x53\xf8\x98\xc9\x81\xfc\xe7\x28\xc3\x5a\x9b\x55\x4b\x1f\xd9\x85\x32\x96\xf0\x18\xa3\xf8\xdd\xbe\xcc\xf5\x4b\xe1\x90\x83\xe3\x9f\x99\x08\x16\x58\xfb\x80\x62\x0f\xef\x59\x73\xee\xf3\xe7\xf9\xfb\x92\x68\x02\xbd\xd0\xe7\xfa\x33\x35\x57\xc6\x12\x13\x39\x57\x99\xde\x64\x02\x89\x41\xcd\x9c\xb9\xdd\xf8\xb3\x29\xb5\x4a\x73\x47\x71\xfe\x9e\xd5\xf3\x56\xfe\x8c\xa5\x32\xc0\x20\xb7\xab\x4c\x56\xe5\xa1\x6b\x45\xcd\xf5\x96\x98\x88\x35\x06\xd7\x4e\x65\x2a\x83\xca\xcb\x69\xfb\x01\x3a\x8c\x3d\xde\x2e\xcf\x2c\x9c\x62\x04\xf2\x65\x4c\x06\x56\xaf\x4e\x66\xee\x3b\x9e\xa1\x1a\x76\x0b\x99\xd2\x56\x32\xbe\x86\x66\xf5\xb3\xa9\xc4\xd5\xc4\xc6\x70\x7c\x49\xca\x98\xd0\x0b\x82\xef\x9a\x8f\x12\xa9\xd7\xab\xff\x5c\xb5\x93\xc8\x9f\x51\x8b\x04\xe9\x7e\x16\x33\xb0\xf3\xc4\xf6\xaa\xf4\x1a\x6c\x8c\x41\x44\x4c\x6f\xba\xea\x74\x1d\x27\x71\xa3\x1b\x6a\x54\x84\xd5\x86\x97\xc2\xd7\x2f\xef\xc7\x60\x80\x3e\x9d\xe4\x81\xb4\xd0\x12\xab\x83\x67\x97\x2d\xd5\x04\x3f\x9d\xfc\xf7\x88\xee\xed\x2f\x97\x07\x8a\x6a\xf0\xc2\xdd\xae\x15\xec\x0f\x69\xe6\x11\x93\xed\x1a\x37\x76\x3c\x1f\xbd\x5c\x9c\x68\x86\x81\xc0\x53\xb5\x3f\x55\x62\x32\xb7\x79\x18\x0a\xcc\x25\x57\xa7\xaa\xbc\x2d\x73\x3d\xf4\xaa\x75\x43\x22\x19\x33\xed\x01\x19\x87\xac\xf0\xba\xfd\xee\x30\x65\x9c\xc0\x8c\x76\x86\x7f\xb7\x38\x4d\x29\x56\xc7\x3d\xfa\xca\x6a\x4c\xfb\x37\x30\x21\x7e\x1c\x8b\x62\xec\x67\x67\xf5\x6a\x81\x1c\x08\x3d\x2a\x2e\x70\xae\x03\x1f\x41\x0f\x4c\x48\xbb\x89\xea\x34\x3f\xc6\xaf\xba\xfb\x68\x4c\x15\x4f\x7c\xe5\xef\xf6\xf1\x69\xf2\x0b\x63\x06\xc8\x0a\x92\x65\xf9\xf6\x06\x70\xf4\x20\xe9\x64\x2e\xe8\xe2\x71\x1a\x7b\x6e\x78\xbb\x28\x7f\x2b\x4f\xd5\x63\xe9\xb3\x20\x1e\x0b\x8b\x76\xdd\xbc\x96\x47\xd7\x23\x1c\xfd\x8a\x04\xb8\x7f\x72\xdd\x12\x71\x29\x87\x34\x9a\x69\x3c\x0d\xad\x48\x93\x05\xd6\xad\x7e\xba\x55\x60\x0e\xe7\xc7\x78\x2a\x22\xac\x48\xfd\xb9\xd9\xfc\x79\xf5\xcb\xb2\x11\x17\xa9\xc1\xc0\xff\x15\x44\xd5\x5c\xf5\x95\x61\x2e\xc0\xe0\xf6\x55\x63\x02\xb5\x3d\x1f\xc7\xda\xbe\x8c\xcb\xd0\x5a\x28\xb5\x5b\x8c\x4d\x48\x66\xc3\x14\x2e\x23\x8e\xb6\x52\x07\x91\x67\x0a\x9c\x56\x87\xbe\x29\x2d\xef\x7c\xfe\x75\xe6\x92\xa5\xa8\x2c\x6f\x81\xc9\x6e\xb3\x9e\x9c\x7f\xfa\x11\x6e\x25\xbb\x2c\x37\xa6\xef\xa2\x73\xa5\x34\x36\x67\x45\x75\x59\x07\x1a\x5f\xaa\x8e\x94\x4b\xf9\xd0\xf1\xf4\xc2\xdc\xa6\x7f\xa1\x35\x8d\x11\x04\xd4\xfe\x84\x99\x5e\x11\x07\x22\x95\xf0\x8b\x97\x7d\xe5\x86\xe1\x39\x87\x50\xc7\xbc\xf3\x0b\x6e\x63\x99\xcd\x66\x14\x35\x72\x10\xcc\x5e\x8b\xb5\xf2\x74\x6c\xa6\xdf\x26\xa0\x91\x01\x74\x8a\x71\x90\x06\x11\xdd\xb7\x28\xfc\xed\xbe\x2a\x26\x51\x48\x11\x93\xfd\x2a\x2a\x58\x55\x2a\x0c\x7e\xfb\x5c\xed\x98\xc5\x61\x98\xe0\xf4\xb6\xa5\x56\xdf\xaf\xbc\xad\xca\x8f\xe6\x75\x59\x82\x31\x99\xca\xa6\xc6\x09\x2c\x0e\x19\xf5\xe5\x16\x8b\x11\x15\xf9\x0d\x80\x85\x05\xcd\x3e\xae\x38\x4a\x84\x4b\xd0\x9b\xf2\xa1\xec\xa9\x95\x2c\x8e\x04\x09\x68\x27\xab\x88\x58\x6e\xbc\x77\x3d\x06\x93\xc5\x34\x50\x58\x54\x38\xda\x2e\x24\xa6\x1e\xdd\x31\x4a\x22\x6f\xb4\x2c\x4e\x85\x7a\xbd\x9e\x1a\x01\xb3\x98\x51\xe7\x61\x8d\xa2\x6e\xb3\x65\x9a\xb8\x5d\x72\x1c\xac\xd2\x82\xa2\x66\xde\x9f\x38\xe6\x11\xb6\xe1\x7c\x9a\x75\x7b\xfd\x3c\x63\x30\xcd\xe2\x84\x1a\xee\xed\x37\x7d\x58\xe2\xf8\x0d\x7e\xc1\x8f\x93\x98\x2a\xa7\xc4\xdb\x7e\x72\x5b\x3e\x8b\x7a\x56\xe7\x91\xc5\x09\x58\xc8\xfb\x62\xf9\xf8\xe8\x3f\x9e\x92\x84\x9a\x41\x78\x3d\xe3\xd2\xcc\xe2\x34\xa2\x60\xdd\xe2\xf2\x66\xa2\xd1\xcb\xe2\x94\x86\xa1\x75\xfc\xac\x9b\xaa\x3c\x2f\x0a\xbd\x81\x42\x6f\xcb\x36\xea\x17\x7b\x18\x28\x23\xb0\x38\x4d\x6c\xa9\xe2\x58\xc1\x51\x54\xa3\xc6\xe3\xd7\x2d\xfe\x38\x95\x5c\xb1\x4b\x1f\xa1\x2f\x1a\xb4\x71\xaa\x63\xdc\x0a\xed\xab\xd2\x17\xa5\x62\xa1\x01\x22\xaf\x72\x57\xbc\x5d\xf6\x99\x27\xdf\xad\x58\x42\xdc\x26\xe2\xd4\x97\xeb\xa1\xee\x0b\x8b\x35\xd3\x76\x55\xc3\x00\x60\xa4\xdc\xcb\x62\x2d\xb5\xf2\x4c\xcd\xfd\x49\x54\xdd\x65\x00\x63\x4e\x4d\x12\x16\x79\x6e\xb3\x83\xee\xb1\x02\x87\x5e\x2c\xd2\xaa\x0f\xb7\x77\xe9\x41\xf8\x92\x6a\x6c\x0c\x4d\x2d\x53\x16\x61\x32\xcf\xe2\x54\xbb\x0a\xa7\x1d\x90\x04\xa1\x00\xdf\xf1\xee\x35\xe1\x97\xd3\xaa\x48\x12\xa4\x16\xd4\xbf\x7c\x7a\x7e\x5e\xad\x9d\xec\xf4\x6e\xfb\xbc\xed\x4e\x24\x62\xd1\x39\x67\xba\x5f\x37\x12\x1d\x67\x49\xa0\x43\xc4\xfc\x2d\x7b\xe0\xf3\xdf\x2a\xd1\xb6\xb1\x37\x56\xa9\x72\x51\x37\xeb\x1e\xa2\x97\x10\x19\x87\x43\x1e\xb0\x7d\xda\xb8\x70\x25\xf3\x6b\x79\x12\x82\xc2\x4d\xec\x2f\x7f\x0e\x9a\x58\x53\xff\xac\xf6\x9d\xd2\xe1\x5b\x98\xd0\x44\x63\x6c\xe0\x63\x0c\xcc\x1b\x1f\x60\x2f\x64\xf9\x73\x7e\xfd\x49\x58\x48\xb1\x5b\xb7\x53\x22\xcf\x2d\x35\xf9\xff\x8c\xaf\x65\x09\x27\x31\x6e\x3a\xcb\xe5\xba\x8f\xf8\xfd\xb1\x28\x46\x6d\x17\x0f\xe8\x2c\x51\x82\x6a\x7c\x15\x3c\x02\x1d\x4f\xde\xd9\xff\x2b\x67\x8a\x25\x3c\xe5\x68\x08\x8e\xc1\xef\xe6\xb5\x3c\xe5\x28\xf0\x7c\x75\x6a\xb0\x0b\xa7\x37\xe5\x8d\xc8\x72\x7f\x5d\x31\xb1\xea\xe5\xf8\x1c\x1e\xd0\x2c\xe8\x33\x6d\x3e\x86\x12\x94\xb1\x33\x03\xeb\xa4\xe3\x59\x12\x43\xe4\x59\x5a\x6b\x51\xbc\x05\x1e\xef\x94\x24\x84\xe2\x12\x72\x2a\xda\x97\xe4\xae\x5e\x35\xaf\x43\x9c\x34\x4b\x12\x69\xb0\x71\xf8\x51\x65\x0d\x38\x1d\xe7\xf1\xc3\x4c\x8c\xe5\x7b\x34\xe2\x0d\x1c\xf3\xcf\x16\x0b\x3a\xe9\x13\xff\x65\x42\x70\x09\x9e\x15\xd0\xdb\xb6\x0d\x05\x1d\x59\x22\x53\xcd\x94\x8f\xd7\xde\xe1\x53\xf9\x31\x96\x48\x61\x4d\x9d\xb4\x55\x5e\x77\xe4\x49\x77\x50\x85\x1a\x7b\xf1\x08\x66\xc7\x4f\x3d\x88\xe2\x24\xf2\xc9\x1b\xa8\x03\x5b\xb9\xc0\x4b\x42\xfb\xc4\x8e\x81\x7c\x53\x6e\x3f\x69\x47\xf9\xcf\xd2\x04\x51\xa6\xb6\x25\xbc\xad\x44\xd6\xb5\x38\xfa\xb5\x30\xd1\x40\xb0\xce\xfe\xfb\xe6\xe9\xf1\x28\x9a\xd7\xdd\xa5\xc3\xf7\xf8\x11\x6a\x63\x10\x12\xb1\x2f\xa6\xa4\x6e\xff\xdb\x80\x85\xa8\xe3\x29\xda\xeb\xc5\xb0\x6c\x20\x4c\x36\xb9\x48\xe0\x01\x22\x76\x9a\x57\xf8\x51\x76\x2b\x60\x02\x90\x22\x96\x43\x59\x6c\x7b\x17\x96\x5f\x74\xf3\x13\x43\xad\x26\xcd\xfd\xd3\x76\xbb\x5a\xff\x89\xe2\x19\xbb\xc5\xf5\xf5\x7a\xb5\xd9\x74\x63\x04\xc1\x25\xc3\x56\x80\x77\x50\xe8\x5d\xd3\x97\x46\x12\xa3\x22\x0c\xb2\xfb\x1d\xc4\x92\x74\x86\xf9\x63\x4a\x62\x8a\x01\xc6\xf6\xcf\xe7\xd5\xee\x66\xbd\xba\xbb\xfd\xb6\x5d\xad\xbb\xa3\xa9\xa4\x0e\xa4\x7c\x3a\x23\xa7\xcc\x1f\x30\x0a\x4d\x84\x86\xc6\x69\xc5\x98\x1f\xce\xd2\x30\x14\x48\x38\xb9\x7b\xbc\xdb\xde\x2d\xee\x77\x8b\xbb\xf5\xf5\xfa\xe9\xb9\x3b\xcc\xac\xec\xe1\xfa\x6e\xb9\xba\x5a\xdc\xdf\xff\xbb\x3b\x90\x50\x5c\xc6\x4e\x45\x9e\x15\x6f\xb3\x01\x7c\x1a\x4a\x89\x8f\x6b\xb3\xb9\x1e\x86\x8c\x69\xa8\x21\xb2\x21\x65\x8f\xb8\x1f\x3f\xe9\x34\x0a\x6c\x0b\xdd\x26\xc1\x50\x63\xe9\xac\x76\xb2\xad\xca\x09\x01\x5c\xa3\xf1\xd4\x01\x8a\x66\x51\xe8\x17\xaf\xa9\xc2\xd2\x88\x58\xdc\x6e\xfb\xde\x5e\x67\xef\xf3\xc5\x82\x34\x0a\x01\x55\x6d\x7c\x0e\x5b\x2f\xcb\xaa\x3f\x05\xd7\xc2\x02\x49\xa1\xdd\xa4\xfb\xfb\x45\x4d\x90\xf4\x32\x4a\xd7\x13\x2d\x41\x37\x88\x05\x0c\x9d\xb1\x96\xdb\xcd\x72\xf4\xcb\x19\x49\x88\xb1\x11\xec\x11\xea\xd7\xcc\x34\x57\xdd\xee\x92\xb2\x88\xc5\x72\xe2\x77\x10\xa6\xdd\xd1\x38\x4c\xbc\xa5\x82\x68\xd4\xeb\x95\x35\xf6\xf4\xa2\xb0\x03\xf8\x46\xca\x12\x5b\x34\x44\xda\x42\xf7\x79\x99\x60\x1f\x18\x2d\xde\x97\x65\x5e\x56\x93\x8b\xe6\x21\x41\xc0\x1b\xd2\x2b\xb2\xa2\x03\x02\x0f\x73\x47\x9f\x32\xa5\x3c\x06\x7c\xcf\x9c\x26\xb6\x0d\x13\x6e\xcb\x72\x32\x03\x62\x12\x8a\x09\x3e\xe9\xc9\xb4\x19\xd8\xe4\xbb\xe3\x90\xe2\x06\xf3\x08\x1f\xae\x8e\xfb\xcb\x3e\xf7\x6c\x8a\x96\xc6\x09\x45\xb0\xdd\x36\x3b\x40\x9f\x39\xa4\x31\xc4\x89\x0b\xa4\x7b\x17\x21\x6b\x54\x3c\xbe\x90\x24\x30\xd6\x73\xa7\xb0\xe4\xb9\xf9\x89\x9d\x08\x83\x78\x8b\xd2\x31\xef\x76\x68\xd1\xfd\xdb\x10\x4b\xf4\xff\xd8\xff\xfa\xc1\xda\x0a\xa3\xb5\x0f\xce\x6e\x12\x9f\x54\x30\xd3\xc4\x24\x49\xaf\x8e\xde\x65\x0a\x93\x9a\x55\x9a\xa6\x8a\x84\x1d\xcb\xea\xb5\xde\x64\x85\x82\x7b\x51\x37\xdf\x86\xec\x58\x3f\x58\x08\x8c\xe7\xb6\xaf\x70\x95\x35\xaa\xcc\x8a\x25\xa2\x18\x47\xd3\x32\x15\x46\x25\x5d\x2c\x05\x43\x5b\x62\x96\x0a\xc2\x50\xfb\xb0\x5f\xa2\x6e\xef\x17\x2f\x97\x25\xc8\xc9\x8f\x11\x44\x47\x4e\x31\x81\x4c\x7e\x80\x70\x0b\xef\xc1\x01\x63\x2d\xad\xce\x1d\x94\x81\x41\x60\xbf\x65\x6d\x0f\x3c\x9f\xe6\xbf\x46\x52\x8a\x6d\xbd\x53\xed\x66\xe1\x4d\x26\x87\x3f\x4d\x72\x81\x8f\xea\x16\x9a\xeb\x73\x21\x0e\x99\x5a\x8a\xca\x79\x7b\x0e\xab\x5c\x7e\xb8\x64\xe0\xa9\xc9\x6a\xa0\x49\xe6\x0f\xab\x28\x09\x3d\x51\xa5\x4d\xff\xb3\x62\x7f\x03\x48\x67\xab\x2f\x5e\x28\x25\xac\xab\x81\xaf\x27\x5d\xdf\x3d\xd6\xd6\x99\xa9\x2e\xf3\xf7\x5f\xc8\x6c\xb2\x54\x73\x6b\x25\xb2\xaf\x44\xd1\x6c\x9a\x99\x0a\xc3\xf4\x03\xb1\xc1\xd0\x1a\x97\x7a\x59\x36\x75\x6f\x9d\xc1\x52\xad\x13\x84\xbb\xde\x42\xd3\xde\x80\xbb\xc2\x94\xa3\x35\xc3\x10\x8e\x6b\xc6\x66\x00\x10\x99\xdd\x36\x53\x63\xb4\x8e\x7a\x29\x9d\x45\xd1\xbc\x66\x5e\x90\x94\x89\x80\xa4\xa9\xbb\x43\xd7\xd7\x37\xe3\xdb\x27\x82\x50\xcb\x2e\x66\xff\x56\x9e\x6a\x4f\x53\xae\xbb\x8f\x47\x01\x66\xaa\xed\xa6\xd2\xd7\xdf\xfe\xd1\xff\xd7\x78\xda\x25\xa3\x63\x93\x7a\x9d\x08\x68\x12\xa6\x3e\x7d\xae\xf6\xb0\x14\xc7\xae\x40\xf5\xdc\xb3\x03\xea\x4f\x68\x4f\x4c\x04\x2c\x45\x72\xbe\x06\x95\xb7\x99\xe1\x2b\x88\x66\x50\x46\xed\xbe\x88\x84\x31\xd2\x3c\x0e\x59\xf1\xcf\x53\x59\x9d\x7c\x11\x56\x10\xc1\xa9\x74\xc5\x15\xd0\x4e\x6b\x7a\xe0\x6d\x31\xbe\x3d\x61\x6c\x6d\x00\x72\x10\xef\xb0\x1b\x1b\x56\xfa\x21\xa9\x26\x43\x1c\xe5\x72\xbd\x99\x8c\x88\x48\xa8\x1c\xb7\xb0\xc9\xdf\xf3\xed\xa7\x36\xef\x4c\x50\xae\x91\x48\xf9\xf1\x5a\x0e\x13\x62\x41\x05\xa1\x36\x47\xc3\x0c\x0f\xd6\x85\xeb\x8d\xcc\x4f\x3c\x41\x21\xa0\x96\x6e\x58\xdc\x38\x61\x62\xf4\xae\xf0\xe7\x63\xd4\xd6\xd7\x50\xc0\x25\x3b\x88\xea\x7c\x2b\x0e\xe0\xa0\x08\x93\x29\xc2\x64\x62\x3c\x44\xd1\x56\x44\x66\xbd\xa0\x98\xe0\x41\xe0\xeb\x34\xbf\x97\xf2\x0b\xe2\xcb\xa5\xd9\x73\xd7\x84\xf6\xb3\xc8\x82\xa6\xa6\x4f\x95\xc7\x09\x66\x34\x7f\x96\xa7\xf5\xf9\x34\x6a\x5f\x7e\x4a\xaf\x11\x5c\x31\x8c\xf7\xe0\x27\x5e\xf4\xcd\xd0\xdf\xfc\x1e\x8a\xbd\x17\xd6\x60\x22\x4e\x6d\x68\x55\xb4\x43\xcb\x53\xa1\xeb\x32\xd7\x19\x54\x15\x1c\x73\x28\xb2\xfa\xb5\xea\xab\x44\x22\x49\x03\xaf\x4f\xf3\x52\x43\x35\x0a\xfd\x87\x29\x87\x48\x8c\x48\x82\xff\xf9\xff\xfe\xe7\xfb\x7a\x40\x48\x9b\xb9\xdc\xc9\x23\x4c\x83\x18\x2b\x8b\x2e\x7d\x9c\x6c\xae\xdd\x2d\x49\x13\xab\xd8\xdc\x64\x50\x45\x83\x16\x9f\x48\xb5\xb5\x95\x3f\x64\x05\x2e\x3f\xdd\xeb\xd5\xff\x04\x21\x03\x44\x20\xfe\x28\xe5\x70\xf3\x11\x02\xac\x39\xd5\xae\xee\x28\xb3\x1b\x50\xd5\x44\xb6\xbd\x1d\x97\x62\x23\xf0\x55\x14\x3a\x87\x9d\x76\x14\xe2\x4f\xde\x25\x19\x58\xa7\x4b\xdb\x32\xfc\x26\x2a\xdd\x89\xd3\x31\xd1\xa6\x12\x5e\x7b\xb0\xa8\x3f\x26\x8a\x79\x4c\xa8\x38\x41\x88\xd1\x51\x54\x4d\x01\x55\xbb\x58\x22\x2c\xfa\xd9\xfe\xff\x51\xcc\x7a\xc1\x05\xed\xce\xa1\x70\xd2\x1f\xc5\xf9\xa6\xac\xc6\x6a\x41\xf3\xaf\xa3\xd6\xb6\x12\x8b\x5d\xdd\xbf\x57\xa9\x10\x1a\x12\x54\x9b\xdb\x5d\xdd\x3f\x2d\xff\xd8\xec\x9e\x57\xeb\xdd\x7a\xb5\xb8\xfe\xfd\x65\xb3\x7d\x58\x79\x09\x64\x26\x80\x32\xe2\x34\xef\xcb\xaa\x86\x43\x2f\x90\xcd\x04\x70\x8b\x58\x3a\x66\x13\xc3\x42\x26\x40\x2a\x9c\x4d\xba\x2c\x7a\x7d\x48\x7f\x4c\x01\x7a\xb9\x58\x75\xf6\xab\xf2\xa7\xdd\x54\x1d\xb1\xd8\x9f\xc1\x50\x82\x11\xef\xe3\xbf\x56\xdb\xd1\x63\x37\x92\x84\xbd\xfe\xd1\x06\xd9\xb7\x7f\xef\x37\x1b\xcd\x89\x2d\xc3\xff\xbc\x29\x2b\x05\x4f\xc6\xd4\x5e\x44\xd2\x9d\x5d\x92\x10\x10\xf1\xd7\x8b\x67\xdd\x94\x9f\x94\xf5\x25\x89\xa8\x57\x23\x6e\xdf\x2d\xab\x90\x23\x72\x98\x44\x7d\x92\x18\x15\xb0\x41\xfb\xe8\xa6\x2a\x0f\x0f\xa8\x76\xbb\x14\xc7\x23\xe8\xe7\xaa\xfc\x79\x9e\x7c\x26\xe4\x0c\x3f\x73\xfd\xb2\x5e\x6c\xef\x9e\x1e\x51\xa2\x7a\xb3\x5d\xdc\xae\x7c\x86\x28\xa3\xc8\x01\x87\x86\x00\x9a\xd9\x19\x22\x23\xa3\x50\x7b\xfc\x36\x77\x6e\x98\xfe\x1c\x54\x07\xd8\xc1\x5b\x3e\xdd\xdf\x2f\xb6\xab\xf5\xe2\x7e\xf7\x6d\x75\x7f\xed\x0f\xb3\x30\x40\x9a\x89\xc9\x7e\x22\x30\xfd\xae\x58\xfe\x58\x76\x07\x45\x80\x75\x11\x9b\xd1\x38\xe7\x6f\x2c\x29\x5e\x24\x36\x92\x53\x8d\x19\xef\x2d\x34\x16\x58\xbb\x7c\xcd\x8e\x18\x46\xb9\x01\x71\xa4\x78\xd4\xdf\x4b\xdb\xfd\xba\x2e\xd5\x69\x38\xe3\x64\x1c\x6b\x54\x8f\x76\xde\xe3\x1b\x9b\xca\xd4\xb6\x4e\xf7\xab\x59\xf0\xf7\x2a\x49\x32\x4e\x09\x97\x3e\xec\xf6\xae\xbc\x98\x7a\x8c\x9f\x50\xac\x63\x6c\x49\xbd\x1f\x61\x77\x84\x6a\x07\x65\x77\x99\x09\xb7\x06\x66\xd8\xcd\xb7\x6e\x9a\xb3\x9d\x49\x99\xc4\x29\xd6\xf0\x0f\x8b\x1c\x7c\xfa\x2d\xd3\x40\x84\x0e\xe7\xd9\xdb\xc4\xf5\xd1\x89\x14\x71\x10\xdb\x76\xf8\x15\xe4\xe5\xc7\xc5\xcf\x1e\xbe\x6c\x52\xa4\x0c\xf1\x8c\xab\x1c\x54\x53\x95\x45\xa6\x1e\x4e\x75\xa6\x7e\xeb\x0e\x0b\xdf\xa5\xf6\x57\xea\x4a\xf2\x7f\x64\x7e\xf3\xf6\x43\x25\x4f\xdc\x4a\x8d\xa0\xf5\x67\xa7\x29\x8f\x1d\x8a\xfe\xc5\x95\x32\xb0\xb6\x3e\x62\x5f\x01\xae\x17\x73\x48\xea\x36\x5c\x86\xa1\xc1\x58\xfb\x3e\xcc\xfb\x14\xbb\x0f\xe8\xc8\x8a\x0b\x58\xe1\x70\x94\x99\xeb\xee\xb7\x21\xd6\x55\xc2\x38\x15\xb8\xae\x52\x24\x0d\x55\x78\xaf\xd6\xa8\x26\xf6\xc3\x1a\x9a\xf8\x63\x1c\x10\x83\x9a\x15\xaa\xc2\x0b\x1d\xd2\x97\xa5\xd1\x3a\x76\x06\x9a\xd7\x9b\xf2\x54\x29\x18\xa5\x69\x64\x7c\x79\x2a\x60\x2c\xb6\x3a\x6b\xfb\x7d\x0e\xf7\xa5\x7a\xbb\xf3\x2f\x99\x0a\x62\x40\x49\xd3\x03\x34\xa2\x0d\xad\x5f\xaa\xbc\x3b\xa4\x92\x84\x76\xd8\x90\xfb\xb2\x86\xaa\xbe\xca\x26\xf2\x16\x4c\x91\x50\x05\x69\x47\x1b\x76\xb2\x48\xae\x17\x39\x7a\xde\x8a\x84\x86\x3a\xfe\x42\x17\xb2\x7a\x6d\xda\xc1\x8d\x51\x84\x0a\xed\x24\xf7\xda\x98\x0a\xeb\xed\xe3\x01\x2c\xb0\xf4\xd4\x77\x91\xe5\x42\x76\x6d\xe5\xc9\x85\x71\x1e\xba\x86\xcb\x00\x2d\x34\xbf\x4f\x29\x92\x80\xb0\x30\xb2\xbf\x40\x59\x99\x7a\xec\x5a\x67\x0a\x36\x27\xe9\x69\x81\x17\xe4\x8d\xb9\x3a\x8f\x22\xa9\xc6\xa2\x83\xb4\xfc\xf5\xc1\xde\xa3\x88\x50\xc4\x5a\x79\x5f\x79\xba\xb0\x0a\x65\x82\x3d\xe7\x7f\x6d\xbf\x8f\xf0\xe9\x2a\x54\x3c\x40\xa5\x46\x31\x91\x75\x67\x2a\x12\x84\x90\x5e\xcc\x6e\x09\x9f\x2d\xaf\x8a\x12\x1a\x3b\x90\xf2\xbf\xcb\x02\x36\xaf\xe5\xd1\x4e\x77\xb7\xb7\x93\x6e\x60\x6c\xb0\xb2\x76\x80\xbd\x18\xf4\xf2\x14\xb6\xd4\xff\xe7\xff\xfb\x9f\xc5\xdd\x50\x94\x93\x29\x26\x78\xc4\xc6\x53\xb4\xdc\xb7\x17\xf0\x64\x5c\x81\x61\x51\xe8\xbb\x4b\xc2\xcb\xb0\xe4\xa2\x98\xe1\x58\x12\xfb\x98\x00\xb0\xe6\xd7\x3f\xc5\x09\x20\xb7\x7c\xbe\x36\xee\x07\x51\x26\x75\x87\x74\x1e\xbf\xdb\x8a\xb7\xf9\x06\x2a\x16\xd7\xaf\x37\xa2\x3a\x74\xaf\x9c\xe2\x10\xeb\x8e\xb6\x78\x2a\x9a\xfa\xea\x8c\xb2\xa6\xe3\xcf\xc7\x51\x82\x35\xa2\xc5\x66\xe3\x37\x1b\x15\x0b\xdb\xb4\xf3\xed\x0d\x0f\xc2\x9d\xc1\x22\xaa\x58\x12\x4b\x04\x6e\xe3\x21\x0b\x2c\x99\x61\x56\xa8\x24\x62\x98\x71\x96\xc6\x40\xe5\x16\xa9\xf1\x89\x12\x19\x60\x5e\x85\x1d\xcb\xac\xc0\x5a\xe2\xe8\xf9\x24\x26\xc2\xc8\x6b\x93\x1d\x8e\x39\xac\xd6\xcb\x30\x18\x1d\x4f\x83\x14\x8f\xdf\x42\xb3\xc8\x73\xbf\xc2\xf6\x7a\xa2\x7e\x98\x92\x12\x46\x36\x86\xbf\x78\x93\x52\x23\xbc\x88\xf3\x55\x7b\x1f\xcf\x36\x43\x9c\x73\xf4\x67\x4a\x08\x6b\x30\x89\xe4\xad\x4a\x1c\x7e\x2d\xa2\x32\xf9\xbc\x24\xaa\x93\x78\x7d\x80\x46\x68\xe1\xd6\xb1\xf5\x9d\xff\x05\x42\xab\x74\xe0\x85\x78\x53\x56\x7f\x4f\x7d\x63\xf0\x5f\xe3\x87\x23\x0c\xe5\xbd\x88\xfd\x22\xef\xba\xff\xee\xb8\x0c\xac\x78\xe9\x90\xa7\x65\xb5\xc8\xfd\x00\xc2\xbc\x82\x62\x1b\x50\x0c\x2b\x53\x4a\x72\x61\x03\x66\x71\xbc\x16\x67\xaf\x48\xa0\x54\x0c\x98\xf6\x9f\x0a\xbb\x91\x8c\x2d\x28\x06\x6b\xa3\x4a\x6c\xed\x08\x05\x24\x9b\xf2\x60\x93\xe0\xd1\x3a\xac\x52\x82\xe6\x57\xcb\xbb\xed\x9f\xbb\xe7\xf5\xdd\xb2\x5b\x8a\x34\x49\x6c\xb2\x2e\x6a\x2b\x40\xb1\x13\x41\xbb\xcf\xef\xdc\xad\xf0\xe3\x20\xb2\x2b\x53\xf3\x9a\x55\x16\x02\x30\x36\xd0\x63\xca\x24\xcc\x02\xbe\x6c\xcf\xf4\x9b\x97\x1a\x70\xc7\x75\x40\x88\xe9\x7d\xc0\x97\x0e\xbf\x3e\xed\x87\xeb\x20\xb4\xe2\x3e\x6d\x3e\xd9\xee\x93\xe3\xe9\xa3\x83\x28\xc6\x60\xe6\xcf\xf2\xd4\x9c\x24\x7c\xcf\xe0\xa3\xee\xbe\x41\xc5\xd4\x25\xe8\x8b\x63\xd6\x06\xa0\xf5\xb4\xbf\x32\xf9\x2e\x43\xb8\x8b\x37\x6e\x45\xbd\x51\x22\x17\xf3\x5a\xa8\x4c\x13\xa2\x11\x56\xe0\xdf\xf8\xce\xdd\x6c\x3a\x0c\x52\xaf\x2c\x37\xd0\xe0\xd0\x24\x0c\x03\x9b\xf5\xd5\xcf\x15\xbc\x67\xe5\xa9\xce\xcf\x2b\x54\xfa\xd4\x58\xc8\xd2\x03\x6e\x58\xf7\x19\x66\x48\x17\xfc\x43\xd1\x64\x0a\x96\xaf\x17\x78\x30\x4d\x18\x45\xd2\xd5\x72\xf9\x6d\xb7\x5e\xed\x48\xf7\x9d\xa9\x05\x1b\x16\xa7\x83\x65\x22\x76\x37\x8a\x08\x0b\xef\x5e\x3e\xdd\x3f\xad\x77\x7f\xae\xee\xef\x9f\x7e\xf8\x63\x61\x6a\x70\x42\x78\x73\x27\xeb\x79\x33\x74\x9a\x67\x3a\xa2\x31\x20\x24\xa5\x3a\x1f\x9b\x72\x99\x35\xe7\xe1\x3a\xa3\x23\x9a\xa2\xc4\x82\x55\xd2\x5c\x8a\x63\xd6\x88\x4f\x36\x2b\x1d\x09\x6b\x6a\xb3\x14\x85\xa8\xce\x5b\xa8\x9b\x02\xfa\xef\x11\x29\x16\x81\xf6\x55\x59\x5a\x19\x5e\xbd\xe8\x0e\x52\xca\x6d\x1c\xd3\x7e\xf5\xaa\x9a\x70\x8a\x35\xe3\x44\xda\xea\x6c\xbb\x67\xc0\xb8\x37\x38\x68\xdf\x69\xce\x0c\xbe\xdb\x28\xb4\x21\xf2\x35\xda\xd3\x4e\x61\x3d\x7e\xac\x92\xb8\x96\xdf\x6c\xbe\x79\x94\x87\x8e\x79\x80\x91\xf7\x22\x6f\xa0\xda\x6d\xab\x53\xdd\xe4\x50\xd7\x73\x72\x41\x83\x6f\x8d\xb5\x49\xed\x5a\xdd\xb1\x4a\x74\x0c\xaa\x4f\xf6\x77\x1f\xa2\x76\x0a\x83\x3e\x3c\xd0\x09\x23\x58\x87\x5b\x54\xcd\x6b\x76\x80\xa6\x8b\x9c\x75\xc2\x15\xf6\x73\x9c\xb4\x35\xae\x2f\xd5\xf9\xd2\x3d\x94\xe9\x24\xb5\x55\x2c\x5c\x2d\x70\x2e\x4f\x2b\xbe\x3a\x15\xca\xca\x23\x96\x57\x51\x38\x2e\x99\xf9\x11\x26\x09\x6c\xbc\x56\xbd\x43\xb5\x2a\x74\x1b\xb5\x2d\xcb\xc2\xe4\x99\xea\x22\xc1\xd3\x40\x7a\xbe\x5b\xcc\xe7\xd0\x52\x33\xbe\x5e\xf6\x4b\xa7\x41\xd7\xf8\x61\x88\x80\x10\x9b\x79\x3c\x9e\xba\xca\xad\x16\xa1\x46\xc0\xe8\x41\x54\x6f\x8b\xfa\xee\x60\xd1\x6d\xf3\xe5\x15\x2d\xb4\xc4\xa5\xf7\xc3\x07\xa7\x9d\x46\x99\x3f\x9d\x0c\x39\x2a\x38\x1c\x70\xfe\x3c\xbd\x43\x55\x65\x1a\x56\x56\x3e\xe2\x2a\xfb\x05\x06\x4e\x4b\x11\x21\xa8\xa1\x2c\xf2\x33\x26\xd9\x03\xc3\x78\xa6\x15\x0d\xbc\x98\xdf\x17\xca\x35\x5a\xa5\x11\x2e\x2a\x06\x1a\xf5\xfa\x2c\x32\x6d\x61\xb0\x37\x65\xf5\x2c\xce\x50\x5d\x9d\x31\x8f\x9f\x3c\x67\x25\xa5\x6d\x9b\x8a\x37\xf4\xed\x71\xd3\xd0\x07\x7f\x5a\x87\x01\xda\x07\xda\x29\x76\x57\xe7\xa2\xb8\xf0\xd4\xf9\x7a\x2b\xd6\x90\x68\x6f\x1d\xf4\x50\x0e\xd5\xbe\xfc\x71\x61\x15\x16\x76\xb6\x7f\x6e\x55\xfb\xbf\xdc\xee\x13\xff\x49\x29\x8c\x2d\x3f\x5e\x88\x47\x4e\xaf\x41\x6a\x8b\xd4\x69\x13\x31\x4f\x7a\xc6\xb2\xad\x5f\xa1\xeb\xbb\x62\x59\xf8\x22\xae\x06\x50\xc8\xe1\x6d\x23\x86\xb1\x9d\x11\xd3\x26\x02\xd4\x4b\xfc\x91\xe5\x9d\x99\xcc\xe4\x51\x18\xa1\xad\x89\xa7\x05\x01\x6e\xde\xb2\xc2\x71\xac\xef\xa6\x3b\x95\xd1\x04\x35\xfc\x2e\x4c\xab\xbf\x9c\x31\x10\x84\x80\x39\xd8\xea\x67\x59\xc9\xd3\x4f\xd5\x41\xa1\x81\x90\x84\x0c\xfc\x35\xbb\x82\x72\xbf\xaa\x00\x09\x2d\x1b\xc3\x83\xd8\x8b\xb7\xcb\xe6\x10\x10\x03\x56\xb7\xb6\xdd\xca\xf1\xda\x2f\x45\x15\x19\x84\x21\x41\xd0\x87\xb5\xdd\xbc\x6a\x77\xf3\xaa\x3b\x96\x86\xd8\x3b\x39\x56\xa5\x82\xba\xfe\x26\x0a\x84\x80\x0d\x2e\x24\x62\xb6\x96\xfe\xed\x74\x10\xc5\xbf\xfc\x96\x04\x11\x0b\xb1\xc9\x5f\xb7\x01\x44\xf8\x58\x36\x23\x8b\x5e\x06\x11\xa7\x64\xe8\x37\x3b\xdd\x13\x81\x6a\xee\x11\x79\xb6\x16\xd9\x49\xcd\xb8\x59\xdb\x79\x42\x87\xbe\xd5\xfb\x8f\xd1\xed\xa5\xa0\x80\x38\x35\xaf\x5b\x51\x63\xed\xc0\x93\xd8\x67\x67\x18\x30\x4a\x51\xac\x43\xb8\xc9\x75\xd7\x74\x3a\x0f\xc0\x62\x8a\x2f\xd1\xc6\x06\x10\x17\x70\x22\x60\x69\x84\xb0\xd9\xcd\xfd\xf3\x72\x77\x11\x91\x43\x4c\x78\x12\xf7\x4c\x57\x5a\xf4\xae\x0a\x7e\x44\x14\xa2\x2a\xcc\x21\x2b\x2e\xd9\x5f\x83\x1f\xef\x86\x27\x41\x8c\x98\x81\xdd\xa9\x38\x0a\xf5\xf6\x43\x54\x55\x56\x56\x77\x9f\xfd\xb6\x24\x4c\xbd\x2b\x45\xbb\x3a\x5d\x97\x45\xf7\xfc\x93\x38\x44\x61\x77\x1f\x71\xde\x00\x4e\x8f\x95\xad\x75\xfd\x62\xdd\x83\x44\x99\x20\x74\x54\x72\x9b\x0d\x4c\x6e\x4c\x4a\x92\xb4\x97\x0e\x1a\xf5\x05\xfd\x88\xc4\x9a\xd5\x48\x91\xe7\xa5\x03\xb1\xd6\xc3\xbd\xa5\xfb\xd1\x82\x11\x0c\xae\xfe\x7c\xba\xda\xfa\x14\x0d\x84\x52\xa8\x8b\x9b\x7d\x42\xb3\x9b\x5c\xb0\x4a\x98\x71\x92\x31\x4f\xb9\xbe\xb0\x6f\x77\xa3\x74\x98\x26\x4e\x96\xfa\x58\xd6\x30\x03\x34\x06\xe0\x56\x63\x30\xab\xbf\x97\x4d\x56\xec\x51\xf3\xa4\xf7\xf0\x60\x00\x60\x7b\x0c\x2a\x07\x51\x6c\x00\xf4\xcb\x04\x34\x08\x26\xe0\x3a\xe8\xc1\x19\xf0\x0e\x79\x79\x84\x6a\xb5\xfd\x76\x0d\x75\x93\xd9\x92\xe6\x6c\x44\x0b\x86\x5b\xb7\xc2\x5b\xf4\x49\x3b\xbe\xd4\xa0\x1f\x9d\x01\x9c\xbf\x5d\x26\x48\x05\x86\xb2\x6d\x70\x86\xda\x42\xfe\x99\x9b\xc0\x50\x2c\x49\x0b\x0b\x93\xea\x75\x64\xc6\xdf\x62\x48\x18\xa3\xc8\xee\x12\xd5\x7c\x7e\x25\xd9\xd6\xdd\x64\x43\xb8\x75\xcb\x6e\xd3\xa3\x31\x6b\xa1\x0d\xc4\xa9\xc3\xf6\x22\x2e\xfa\x75\x24\xaf\x3e\x88\x9c\x0c\x49\x62\x2b\x30\x88\x77\xe7\xe6\x54\x68\xcb\x3e\x22\x93\x8b\x0c\x03\x46\x5d\xe5\xd4\xb7\x67\x67\xcb\x9e\x26\x0c\x6d\x83\xec\x3e\xfb\xcf\x29\xd3\x59\x73\x1e\x92\x40\xfc\xf5\x85\x3c\x60\xcc\x39\xe1\x55\x99\x6a\x40\xe3\x9c\x45\x38\x2e\x1a\xa5\x4d\x4e\x1a\xd1\x04\x2b\x5f\x2e\x72\xb6\x84\xc6\x76\xe4\x06\x59\xbe\x93\xc1\x10\x7b\x72\xd8\xc2\x43\x8d\x71\x4f\xcf\x2f\x56\x6f\x43\x19\xa0\xc3\x56\x1b\xdf\x38\xe4\x84\xbf\x46\x16\x00\xaa\xe8\x61\xa5\x61\x77\xac\x3a\x31\x65\x66\x58\x98\x22\x77\xad\x6c\x17\xcd\xc7\xb2\xb1\x9e\x25\xdd\xc2\x6b\x58\xca\x11\x70\xb2\x5c\xdc\xdf\xef\x6e\x17\x9b\xdd\x72\x75\x77\x7f\xf7\x78\x3b\x7e\x6b\x0d\x4b\x05\x16\x29\xee\x5f\xbe\xef\xa6\xf0\x4a\xc3\x34\x43\x54\xc1\xf6\xb9\xac\x9a\xd1\xcd\xe3\x92\x18\x6f\x7d\x5d\x16\xa7\xba\x8f\xb2\xc6\xa7\x8f\x43\x8d\xe0\x20\x09\xfb\xac\x78\xb6\x5a\xb6\xeb\xf2\x54\xe8\x4f\x3c\xc4\xfc\xc7\x92\x71\x37\xd9\x41\x59\xfd\x51\xc3\x71\xb2\xf6\xfe\x4e\x9b\x3e\xbe\x33\x29\x49\xd0\x6b\x08\x5b\x97\x4f\xc5\xc8\x7b\x9a\x99\x34\xb2\x0f\x06\xb1\x91\x95\xeb\x7f\x8e\xb4\xa6\x4c\x2a\xad\x6f\xff\x55\xe9\x75\x80\xbb\x17\x2d\x55\xc2\x6e\xd8\x25\xd4\x6e\x1e\x60\x61\x67\x3e\x18\x35\x22\x0c\x90\x71\xba\x81\xe6\x59\x34\xb6\xbc\x76\x84\xaa\xc9\x60\x5e\xf3\x95\x19\x11\xc7\x56\xdd\xbd\xd3\xa8\x9e\x05\xce\x1b\x49\x52\xcc\xd7\xdc\x5f\x57\x4a\x75\x5a\xe7\xcc\x48\x65\x8d\x9a\xb2\x7a\x51\x81\xf0\xf2\x61\xc3\x4d\xc8\x28\x23\x91\xfa\xb0\x43\xc2\x70\xf9\x9e\x69\xa8\x6c\xcc\x39\xbe\x1e\x1d\x73\xcc\xb9\x16\x5a\xdf\x7b\x90\xe1\xe8\x44\x1a\x64\xe8\x95\xfd\xbc\x0d\x33\x33\x10\xa7\x5a\x7a\x51\x6e\x53\xa2\xed\x65\x77\x79\x20\x18\xe2\x57\x8f\xa7\xe6\xaa\x51\x96\x85\xab\x2e\xa1\xe9\x5f\x2b\x08\x5c\x8c\x1b\xb5\x3e\xfd\x37\x29\x2b\x27\x58\xe3\x8b\x6d\x1f\xf2\xf8\xf7\x19\x11\xe0\x0c\x77\xf0\x7b\xef\x91\x3a\xbc\xd9\x3c\x20\x81\xd5\x7c\x6b\x7f\x4d\x1b\x2a\x0c\x6e\x00\x0f\x48\xa4\x60\xe8\x7c\x3c\xfb\x60\x79\x40\x98\xf7\x3f\x46\x21\x42\xaf\x2a\xc8\x03\x92\x10\xf4\xa6\x29\xbc\x22\xda\xf8\xec\x90\xa0\x05\x59\x5e\x8a\xe2\x41\x34\xa7\xea\xe2\xe2\xc2\xd8\x5a\x1b\x2d\x9e\xfe\xf0\xa7\x0c\x85\xad\x0a\x3a\x52\x8c\xf7\x86\x6a\x44\x53\xf7\x11\x1d\x0f\xa2\x40\x63\xf1\xb7\xf0\x62\xf6\xe3\x2c\x85\x07\x51\xa4\x85\x2b\x3b\xb7\xb1\x44\xbb\xf5\x95\x1f\x36\x3b\xb9\xdc\xa9\x78\x10\xd1\x14\x09\x13\x3b\x28\x10\x69\x0d\x75\x73\x67\x1e\x01\xf4\x25\x89\xd2\x7f\x22\x8e\x59\xea\x6d\x54\x4e\x1a\x8a\xc6\x31\x05\x26\xc3\x94\xc6\x66\xef\x5b\x96\xe7\x0f\xe0\x7f\x25\x15\x09\xee\xba\x15\xd6\x6e\xb0\x57\x64\x6b\x74\xfb\xc1\x10\x6d\x75\x43\x30\x23\xfa\x0a\x6d\xf0\x8f\xf1\x4f\xa1\xa0\xc9\x90\xac\x7c\x75\xbe\xcd\xf4\xe4\xaa\x18\x23\x8e\x32\x86\x4f\x74\xf5\xb3\x81\xaa\x10\xb9\x95\x83\xa9\xfd\x25\xf0\xd0\x7a\x32\xa2\x3a\xe2\xd3\x1f\xab\xc7\x8d\x3f\x12\x07\x36\x97\x42\x4d\x4c\xaf\x3b\xde\xc7\xeb\x3c\x88\x49\x80\xac\xbe\xfb\x72\x6f\x73\x17\xb8\x28\xad\xfb\x91\x9c\x20\x34\x0d\x8d\x66\x0a\x68\x66\x68\x34\x3c\x88\x41\x20\x2e\xc5\x56\xad\xb3\x1c\xda\x74\xf3\x11\x3e\x5e\xea\x01\x70\x60\x00\xbf\x9f\xbc\x53\x64\x5a\x43\xe5\x41\xc2\xad\xed\xd2\x1e\x9a\x9b\xac\x7e\x5d\xa0\xfd\xed\xe4\x2e\x25\x2a\x1d\x52\xfb\x1f\xe1\xa7\x8d\x06\xa6\x73\x2d\xe5\x0a\xe3\xee\x55\x5e\x22\x41\xd2\xff\x59\x07\x08\x1d\xcb\x45\xed\xac\x91\xed\x2b\xea\x8f\x8b\xd8\xaa\x27\xb7\x09\x29\xbe\x3e\xbb\xc9\xa4\x14\x89\x0d\x7a\x85\xd6\x9b\x63\x59\xd4\xa5\x45\xb7\x7f\x15\x3a\xf2\x40\xe8\x14\x25\xdb\x2c\x8f\x72\x52\xb3\xf0\x63\x8c\x40\xb6\x74\x8f\x3e\xbc\x5f\xfe\x78\xfe\x05\xfa\x90\x07\x32\x52\x38\xe5\xcb\x46\xf9\x74\x76\x51\x68\x97\x48\xcf\x4f\x46\x19\x07\x89\xd5\x2d\xc8\xf2\xe6\xa9\xf0\x3f\x5d\xa6\x16\xeb\xf9\x57\x99\x15\xb7\x6d\x96\xf1\xc9\x17\xa6\xc6\x78\xb6\x64\xa7\xf4\xce\x03\xa5\x38\x2e\x3b\x0f\x77\x8f\xbb\x76\x6e\x6e\xee\x9f\x6e\x1f\x77\xcb\xa7\xfb\xfb\xd5\x72\xbb\xba\xee\x86\x01\x58\x42\x7f\xbb\x4d\x2e\xf2\x7c\x73\x10\x15\x3e\xc0\xac\xd8\x8f\xb5\x43\x79\xa0\xa9\x05\x02\xf7\xac\x7f\x1e\x40\x10\xc8\x41\x86\x8b\xbe\x2e\xfe\x50\x68\xdd\xba\xdb\xeb\x6f\x53\xa5\xcf\xf2\x8f\xc9\xef\x01\x2e\x55\xe0\x4b\x6a\x77\x7a\x5b\x7a\x1c\xc5\x1a\x54\x76\xbc\xe0\xcd\xf1\x00\xe2\x10\xb7\xba\xbc\xdc\xff\x36\x13\xc3\xf2\x00\x64\x12\x04\xfd\x5e\xba\x59\xba\xa7\xe1\x0e\x1b\x46\xb1\xfc\xb4\xb1\xa8\xca\x65\x99\x15\x75\x7f\x4c\xa6\xb6\xa0\x6b\xfd\xdd\xbb\xbf\x1b\x91\x2a\xef\x57\xef\xe7\xc7\xa5\xb6\x0d\x27\x01\x09\x85\x75\x00\x6f\x3f\x7e\xec\xc1\x49\x7a\x3a\x50\xc5\xd6\xc3\xd3\x77\xea\x7a\x7d\x99\xd1\xaf\x21\x44\x73\x4c\x2f\x6f\x1b\x40\xa0\x15\xa6\xa8\xee\xba\x48\x48\x89\x0d\x1b\x9c\x8f\xf9\x7c\x47\x7c\x3c\xff\x48\x28\x14\xb6\x2d\xd0\x89\x6b\x47\xd8\xee\x7a\xf1\xa7\x5f\xc5\x48\x14\x51\x49\x3a\xe5\xbe\xf2\xd4\xd4\x33\xaa\x3b\x9c\x44\x5c\x23\x59\x53\x78\x0e\x21\x27\x51\xc2\xd1\xde\xd1\xa3\x50\xbf\x21\x7c\x6a\xb4\xfd\x91\x28\xb5\xa0\x4d\xd4\x6e\xfb\xb2\x67\xc5\x49\xa4\x0d\x16\x72\x76\x26\x2b\xb2\xfa\x15\x05\xc5\x06\xe8\x39\x37\x8a\x86\x24\xd2\x5e\xb8\xcb\x63\xad\x6f\xaa\xf2\xf0\xd2\x99\x11\x71\xc2\x42\x1a\x39\xf1\x72\xe4\xc5\xcf\xb4\xf7\x38\x89\xc3\x38\xb0\xc5\x4a\x57\xe9\x6b\x13\x88\x4e\xb7\x7a\xf2\x54\xe2\xd0\xd6\xd7\x77\xcd\x45\x06\xf6\xc9\xcf\x89\xb9\x88\x1c\x3e\x60\x70\xda\x39\xd3\xa7\x7e\x4b\x27\xb1\xa0\x9d\xa9\x76\xde\xbe\x0b\x4b\xa7\xd9\xee\x7f\x59\xac\x2c\x7f\xd5\xf3\x9c\x27\x62\xa2\xe3\x4b\x48\x42\x42\x7b\x4a\xbd\xd3\x32\x9b\xdc\x85\x24\x4a\xe2\xa1\x88\xe9\xd5\xe9\xdc\xc5\x30\xa3\xfd\x87\x24\x4a\x22\x83\x6a\xf5\x7e\x5f\xee\xb3\xc2\x94\xf3\xa3\xb4\x15\xa1\x40\x72\x8f\x13\x8d\xf9\xfa\x46\xa5\xcc\x72\x51\xbd\x58\xd0\x21\x2b\xb6\x13\xbc\x3f\x27\x69\x1a\x42\x8f\xf4\x44\x45\x36\xec\x8d\x5d\x42\xed\x39\x11\xa9\x15\x22\xb7\x25\xb7\x07\x51\x55\x99\xd8\xc3\x7d\xa6\xa0\x50\x70\x77\x10\x7b\xb8\x7b\xbe\xd9\xbc\x8a\xfa\x75\x3c\x59\x55\xc0\x82\x08\x23\xc1\xca\x52\x0b\xef\xcb\x3d\xf1\x37\x5e\xc9\x80\xb9\x6c\x78\xf1\x2e\x1a\x51\x4d\x45\xe7\xda\x21\x0a\x6b\x70\x05\xfc\x6c\x6e\xa1\x28\x3d\xe2\x80\x13\x1d\xc6\x98\x6d\x39\x58\xd2\x65\xd5\xa8\x83\xd1\x70\xa2\x29\x23\xc4\x4f\x70\xb8\x53\xe5\x50\xf1\x90\x13\x3d\xf4\xd3\xec\x71\xd8\x9c\x40\xca\x05\x73\x3a\x6c\x80\x2a\x03\xee\x40\x9b\xc8\xbb\x08\x7f\x25\x2a\xcc\xba\x51\x63\xcf\x1f\x8e\xb8\x89\x87\xf2\x55\x3f\xf4\xcf\x9b\xcf\x35\xe7\xfc\xa7\x44\xac\x2c\x7e\xcf\xc9\x2c\x87\xd3\xa7\x3c\xc1\x3c\xf3\x30\xe0\xc0\xad\x3f\x56\xd6\x5c\x89\xa6\xc9\xe1\xf9\x7e\xb1\x5d\x96\x93\xee\x19\x0f\x49\x64\xed\x7f\x33\x2b\x5e\x72\x5d\x79\xa5\x4b\x1e\x12\x16\xe0\x7a\xdd\x86\x18\xe1\x20\xa1\xe5\x21\x91\x1a\xeb\xac\x08\x83\xdb\xad\xbc\xd9\x30\xaa\x37\xe0\x4b\x20\x4f\xe7\x36\x0a\xbb\x39\x15\xf6\xed\xb3\x4a\x52\x6e\x50\x14\x58\x97\x6b\x14\xd6\x6c\xe7\xec\x24\x91\x18\xcd\xf1\x30\x32\x16\x4e\x64\xe7\x38\x34\xcb\xb2\xfe\xd4\x90\x92\x87\x94\x24\xc2\xc2\x44\xdc\xca\xff\x74\x84\xc2\x5b\x0a\x4e\x7e\x3a\x35\x0a\x8d\x7d\x2a\x61\x3a\x06\x2f\x0f\x59\xc4\xb0\x48\x53\x00\xe8\xba\x93\x74\x19\xb4\x7a\x79\xc8\x52\x8e\x90\x8a\x76\xef\x76\xb9\x50\xa7\x35\xd5\x8d\xd1\xda\x97\x36\xed\xcf\xdb\x2e\x9e\x30\xce\xb7\xc5\x10\xd8\x64\xfb\x02\x53\x94\xa9\x78\xfc\xac\x17\xc9\x97\x28\x55\x1e\x72\xa2\xb1\x02\x68\x2d\xdd\x46\xe2\x72\x7e\x04\xb7\x95\x67\x0b\x6d\x1a\x8b\x40\xf0\x90\xa7\x04\x01\xc1\xf2\x74\xde\xc9\xde\x69\x87\x87\xb1\x32\x91\x95\xba\xca\x55\xff\x8a\x85\xb1\x31\xb8\x9a\x6f\x5e\x01\x8e\x73\x2b\x53\x98\x84\x1a\x9b\xaf\xed\x2a\x93\x3f\x15\x76\x0a\x4a\x2b\x77\xda\x7e\x35\xf7\x93\x21\xe1\x71\x28\x47\x48\xf1\x6f\xed\xb6\xd7\x2f\xd3\x61\x92\x30\x6c\x24\x68\x50\xd9\xc1\x5f\x41\x4a\x25\xe2\xda\x70\x05\xbb\x85\xde\x56\x8f\x87\xa9\xb6\xb2\xa0\x7e\xf3\x78\x29\xca\x8f\x02\xf4\x73\x2e\x0a\x98\x27\xff\xf3\x50\x05\x12\x3f\xd3\x66\x6e\x57\xe7\xab\xed\xd2\x71\xa6\x3e\x19\x1d\x06\x68\xa9\x6d\xfb\xbf\xff\x3c\x89\xa2\x39\x1d\xb6\x95\xd0\x59\xb1\xef\xd5\x1a\x79\xa8\x22\x81\x04\xf8\x9b\xac\x10\xb5\xdf\x19\xfd\x41\x4d\xa3\xc0\xc3\x59\xb2\x62\xbf\x81\xdc\x5c\x43\x8d\x6a\xad\xfd\x10\x5b\xac\x57\xa2\xb8\x17\xe7\xd5\x7e\xef\x6e\xdd\x3f\x2e\xab\xc0\x3c\x04\xa1\x88\x35\x7d\x75\x75\xa9\x4b\x20\x2b\x0f\x4d\x20\x10\x4e\xf9\x67\x79\xda\x9e\x24\x1c\x50\xf9\x6f\x0d\xff\xf1\xdf\x68\x94\x5d\x69\xe4\xe9\x1c\x0e\xa2\xf3\x39\xd4\xc8\x94\x7b\xcc\xa3\x20\xb0\xa4\x73\x9f\x07\xfe\x7e\xaa\xbc\x0b\x22\x8f\x82\xf6\xb5\x77\x21\xf4\x72\xfd\xf4\x03\xed\x4a\xb7\x77\x0f\xab\x6e\x00\xb5\x96\x0a\x7f\x3c\xdd\x3d\x2e\x9f\x1e\x57\x7f\x6c\xbb\x23\xb1\xb1\x10\x7b\xd4\xe8\xfc\x5e\x36\x1d\x97\x9d\x47\x81\x10\x8e\x36\xd9\xae\xdb\x1b\xac\x1a\x41\x5f\x95\xe3\x51\xa0\x63\x6c\x5f\x34\xaf\x59\x9d\xd5\x26\x2b\x26\x1b\x49\x44\x54\x82\xc4\xae\x9d\xe7\x49\x2c\x45\xdd\xe4\xb0\x99\x91\x1a\x9e\x5f\x9e\xa3\x50\xdb\xac\x69\x93\x15\xfb\x53\x2e\xaa\xac\xc1\x46\x7e\x17\x48\x46\x11\x0f\x03\x97\xbc\x7e\x12\x88\x46\x51\x4a\x89\xed\x0c\x95\x15\xcc\xe5\xf5\x51\x24\x43\xe1\xaa\x44\x6d\x5e\x88\x75\xc1\x89\x6c\x22\x8f\x22\x1d\x62\x0e\x0f\x87\xac\xf9\x51\x56\x6f\x6b\xa8\x4f\x87\x4f\x5a\x3b\x3c\x8a\x80\x62\xa9\x06\x93\xdc\xb9\xe2\x30\x8f\x68\x18\x09\xcf\xa4\x42\xf3\x81\xf2\xd4\x2c\x45\xe5\xa7\x68\x44\x43\x2b\xeb\xf7\xf4\xf3\xbc\xef\xe6\x76\x44\x8d\x8a\xdb\xc5\xef\x46\x34\xaf\xbe\x40\xfe\x19\xbc\x69\xfc\x7d\x8c\x87\x96\xae\x2c\xf2\x7c\xfb\x9a\x75\x00\x96\x91\xf0\x41\x3b\x2c\xfd\xff\x69\xfb\xb3\xe6\xc6\x71\x25\x7d\x1c\xfe\x3a\x7d\x31\x17\x5c\x01\xf0\x52\x96\x65\x5b\xd3\x5e\x34\x96\xaa\xea\xcc\x9c\x38\xa1\xc0\x92\xb0\x79\x4c\x91\x1a\x92\xb2\xcb\xf3\xe9\xdf\x60\x26\xc0\xcd\x92\xbb\x7f\xf1\xc6\xff\xa6\xdc\x2d\x80\x1b\x08\x02\xb9\x3c\xf9\x3c\x9a\xd6\x04\x97\x1c\xd8\xbb\xd3\x20\xc0\x7f\x39\x7b\x88\x54\x12\x34\xc7\xe4\x8d\xae\xca\x12\x34\x11\x29\x11\xc2\xf4\x5b\x7b\x29\x4e\x95\xf4\x7c\xca\x5e\xd7\x65\x1c\x22\x65\x31\x8b\xb5\x53\x6e\x7d\x3a\x4e\x29\x9b\x67\x4f\xc6\x84\x30\x8e\x19\xc2\x01\x0f\xbc\x52\xdb\xf4\x8a\x5c\x45\xcc\x71\xe2\xe5\x87\xd3\x01\x2f\x79\x7d\xea\x96\xd6\xdb\x93\xac\x65\xd9\x02\x98\x31\x3d\x5e\x77\x04\x89\xe8\x5c\xfd\xcf\x5f\xd1\xeb\xb0\x58\x58\x8e\x5f\xd9\x9e\x7c\xa8\x8b\x04\xa1\x2c\xce\xb8\x44\xe3\xb7\xa8\xda\x16\xea\xcf\xdb\xfc\x1d\xee\x46\xcf\x9d\xe9\x0c\xb4\xcb\x70\xb9\x34\xdb\x79\x8f\x3c\x96\x71\xaa\x70\xb5\xdc\xfd\x63\xdf\xe3\xa1\x58\x2c\x59\x88\xe3\x21\x4f\xed\x2b\xd4\xfb\xd3\xe0\x51\xc4\xd2\x28\xa7\x7e\x0a\xb9\xae\xfe\x9e\xab\x1b\x2b\x95\x22\x58\x66\xfb\xf8\xd7\xa3\xa0\x23\xa9\x3d\xf9\x6c\xf5\xe1\x2a\xaa\xe7\xc5\x49\x2c\xd6\x29\xb7\xc4\x16\xff\x79\x53\xd5\xae\xf0\xf2\xc2\x70\x69\x99\x79\x91\xe3\xbb\x3f\x6f\x27\xb5\x8e\xbe\x87\x8d\xd1\xab\x73\xe7\xb9\xce\xe5\xa1\xea\xf7\x8a\xd8\x80\x8a\xdc\x2d\x6d\x89\x47\xcf\xe6\x6d\x73\x26\x77\xc8\x62\x63\x23\x44\x91\x3b\x1e\x07\xbc\xf9\xaa\x28\x86\xc7\x18\x70\xa2\xee\x08\x08\xb4\x71\x79\xe7\xba\x9d\x6c\xfd\x31\x64\x31\x62\xa1\x10\x39\xb3\x2c\xe4\x87\xea\x6b\xcf\x59\x0c\x26\xf1\xb5\x12\xbf\x20\x9f\x7d\x83\x36\x30\x58\xfa\x51\xc2\x07\xda\x66\xe3\xdd\x2d\x89\x34\x47\x86\xab\xfd\x88\x54\x05\xe4\xe1\x2b\x40\x94\x25\x91\x49\x71\x37\x5d\x3f\xae\x77\xfb\xeb\xc5\xce\xef\x08\x49\x9c\xda\x20\x18\x40\x83\xcd\xe2\xa3\x57\x68\x22\x33\x7d\x57\x1d\xc3\x34\x18\xd9\x0a\x49\x2c\x02\x74\x81\x1f\x64\x99\x5b\x68\xda\x6a\x84\x34\x64\x49\x6c\x23\x9d\x39\xf6\xee\x6b\xb0\x75\xd5\x87\xce\x92\x04\x00\x0d\x00\x2f\xa4\xbd\x7a\xbc\x9e\xdc\x0b\xcb\x98\x17\xce\xdc\x40\xdd\xe4\xb2\x6c\x9c\x59\x5d\xe5\x7d\x49\x44\xd7\x8d\xbc\xa1\x7d\x4d\xd5\xa1\x8b\xff\x3d\xc9\x3a\x3f\x1d\x66\x8f\xcc\x74\x98\x79\x21\x42\x7a\x89\x33\x7b\x2d\xe1\x59\x86\xdb\x25\x86\x92\xba\x2d\xaf\xbf\x84\x08\x29\x07\x75\x8b\xe9\xd5\xc9\xa0\x67\x8c\x34\xfd\xdc\xa9\xee\x7f\xec\xb6\x7d\x0e\x8c\x25\x32\xc8\x38\x05\x45\x6c\x35\xc1\xf8\xb2\x44\x5a\x85\x36\xf6\x28\xa4\x72\x7e\x9a\x27\x2a\xc8\x0c\x61\xa0\xdf\xab\x37\xb8\x91\x45\x81\xf3\x65\x7a\xf3\x4a\x19\xd4\xac\x71\x65\x84\x03\x5f\x26\x4b\x74\x98\xa2\x83\xf0\x67\x21\x9b\x26\xd7\xbd\x2c\x7d\xd7\x02\xbc\xc7\x09\xdf\x54\xf5\x9c\xf2\x75\x7a\x09\x9d\x64\x41\xea\xc8\x07\x48\x87\xa4\x71\x55\x67\x97\x0e\xc8\x62\x8c\xfc\x3b\x89\xc8\xea\xe8\x58\x6f\xf6\x0a\x4a\xb0\xb9\xce\x65\xef\xf7\x27\x26\x49\x2c\x39\x3e\xf2\x70\x4f\xe4\x13\xb4\xe2\x86\xd1\x43\x55\xb6\xaf\xfd\xbb\x30\x5a\xa0\x69\x5a\x95\xcb\xea\x70\x84\xb2\x91\x67\x38\x10\x5d\x5f\x88\xa8\x22\x1a\xb3\x3c\xba\x38\x99\x79\x54\x37\x01\x21\xf1\x2b\xed\x66\x45\xcf\x52\xb1\x91\x75\xbb\xfb\xa8\xe6\x5d\x41\xab\xde\xc6\xa5\x08\x87\xab\x43\x18\xe8\x0f\x58\xd2\x2d\x38\xce\xee\xb8\xde\x6e\xa6\x70\x1f\x96\x58\x9b\x60\xa4\x4a\x57\x65\x03\x03\xbf\xa5\xc3\x9a\x74\xed\x82\x09\x5f\x28\xf5\x0e\x75\x9b\x77\x1f\xe1\x59\xa6\x07\x96\x06\x41\x82\x11\xd2\x53\x79\x94\x7d\x11\xb7\x5f\x8f\xce\xe7\xef\x58\x1a\x30\x1b\x39\xf8\xc5\x40\x95\x10\x4c\xe2\x04\x28\xff\xc6\x5d\x4c\xfb\x8b\xea\x39\x4b\x03\x57\x45\x4f\xb4\xcb\xa7\xc3\xbe\xfd\x80\xe2\x1d\xf6\x4a\xbe\xbc\xf4\x1b\x4a\x1a\x28\x85\x69\xa7\x46\x5a\x68\x3f\xd7\xe5\xbb\xac\x73\x59\x3a\x35\xa5\xe9\x3d\x85\x9c\xa3\xcb\xbf\x7a\x5e\x8a\x88\x3b\x25\xac\xfe\x44\xa1\x26\x5d\x6d\x69\xcc\xbe\xe8\x6c\x8f\xa9\xdb\xe6\x7a\x45\x9a\x08\x76\xbd\x07\xb2\xe9\x26\x72\xef\x06\x0f\xbe\x9d\xef\x6e\x34\x96\x6d\x6c\x9f\x6e\x76\xfb\xe5\x62\xe3\x2f\x96\x84\x91\x4a\x7b\x9f\x6d\x82\x41\xed\x1a\xa9\xc2\xb6\x96\x79\x03\x66\xad\xab\x91\xe6\x1c\x4b\x93\xcc\x72\x27\x24\x59\xbd\x0d\xbf\x2a\xa3\xba\x45\xec\x6e\x7d\xb5\xf0\xbf\xa5\x26\xf0\xd3\x12\x31\x61\x43\xba\x20\x4d\x21\xc4\x6c\x44\x53\xe4\xba\x77\x53\xbf\xc2\x21\x59\x9a\x5a\x7a\xde\x2b\x84\xaa\xf4\x87\x5b\x22\xdf\xa0\xc8\x50\xb7\x82\xdf\x9c\x8a\x02\x2b\x0c\xce\x26\x09\x52\x26\xd2\x40\xba\x34\xeb\xb6\x95\xdd\x67\xb7\x3a\x56\xfa\xd5\x9f\x90\x41\x66\x29\x86\xb8\x2e\x3b\x03\xfb\xa1\x32\xfd\xbd\x72\xa6\x8c\xed\x61\x9d\x27\xf8\x63\xfc\x3e\xb8\x04\x2c\x67\x03\x62\x0f\xbb\x58\xd7\xc4\x52\xae\x33\x2c\xb1\xd3\xb4\xa7\x4e\xd7\xb5\x54\x84\x29\xba\x58\xba\xae\x9a\xe6\xa6\xaa\xdf\xc6\x8a\xdc\xfe\x4e\x84\xb0\x18\x55\x34\xe0\xa3\x3e\xa9\x0c\x63\xcc\x4b\xa2\x8a\x96\x6c\x50\x3e\xa9\x6f\x8b\x09\xbd\xbe\x04\x6b\x3f\x8b\xf1\x72\x9e\x4a\xe0\x68\x09\x7a\x2c\xde\x96\x40\x77\x97\x6b\xc1\x59\xaa\x62\x8b\xc9\x3f\x4f\x16\xbe\x28\xcd\xf6\x38\x2e\xaf\x3d\x6b\xa2\xa5\x2a\xd1\x19\xb1\x9e\x63\xd2\x07\x0c\xc2\x14\x7a\x42\x30\x96\xaa\x8c\xd8\x74\x9c\x18\xf5\xf5\x28\x41\x38\xbb\x01\x0d\xb8\x0e\xf8\x4f\xdf\xa9\x0d\x19\x62\x0f\x9b\xf5\x05\x86\x31\x02\x47\xc4\x7f\x5f\xcd\x4a\x3e\x58\xaa\xa3\xbe\xae\xe0\x87\x2f\x03\x38\xef\x40\xa5\x3a\x52\x49\x30\x0e\xf9\x63\x21\x92\x43\x26\xfa\x3e\xb1\xc4\xca\x20\x2d\x0b\x4d\x56\xfc\xe2\xa2\x4c\x84\x3f\x44\x09\xf4\xd2\xb7\xa5\xcc\x8b\xbf\x27\xa0\xcc\x52\x13\x08\x2c\xf0\x5c\xca\xfa\x98\x57\xfe\xea\x46\x0b\x24\x72\xd7\xde\x41\x77\x69\xe2\xc1\x26\x4e\x8d\xb1\x91\x53\x80\xd9\xe5\x47\xdc\x04\x9d\x7f\x33\x7b\x5a\x08\xa5\x57\x58\xbe\xad\x0a\x73\xc8\xcb\xf6\x06\xc0\x2b\x7c\x4d\x6e\xc6\x76\x96\xf1\x10\x0e\xa5\x32\xdb\x4b\xf3\x61\xf6\xf4\x36\x0b\x88\xcd\x0e\x79\x13\x47\x11\x28\x36\x42\x0e\xb0\xd4\xda\x84\x80\x1e\xc8\xf8\xff\x98\xf7\x06\x24\x0b\xb8\x46\x6a\xbd\xc5\xc3\xfd\x7e\x77\xf7\xbc\xda\xde\x3d\xf9\x7a\x56\xc6\x02\x91\x50\x8c\x92\x6a\x87\xcf\x24\x3a\x59\x60\x08\xcf\xd7\x7c\xe4\xad\x7e\x7d\xd8\x3c\x9d\xdf\xdd\x59\x98\x4a\x42\x68\xe4\x8d\xe3\xb8\x3a\xff\x81\xb0\xd0\xa6\x48\x1e\xdb\x78\x9d\xae\xe6\x4e\xbe\xc3\x15\x40\x49\x35\xc0\xfe\xde\xa2\x48\x07\xb6\xbf\xb7\xeb\xaa\x9c\x15\x6a\x30\x16\x65\x06\x09\x55\x50\x32\xe3\x0a\xdd\xc3\xf1\xa2\xc3\xa2\x0c\xd0\x62\xf4\xa8\x9c\xee\x2b\xf6\xe4\x63\xc3\xfd\x44\x92\x63\xca\x90\x26\xf7\x8f\xe3\x4b\x2d\xfb\x45\x8d\x45\x86\xd8\xf3\x9e\x7e\x3d\xae\x9e\xf7\xdb\x1f\x9b\xcd\xfd\x7f\xf7\x6d\x60\x31\x69\xd6\x0b\x35\x91\x8a\xc3\x2c\xcd\xd8\x39\xb0\xe0\xa0\x47\xa7\x63\x2f\xd5\xe1\x1b\x8d\xc6\x05\xf7\xe9\x71\xb5\xff\xaf\x1f\xeb\xc7\xdd\xfa\xfe\x7e\xfd\xf4\xe8\x9b\x93\x24\xc0\xc5\x64\x71\xfd\xb0\x7e\xdc\xdf\xae\x76\xfb\x1f\xdb\xeb\xd9\xfd\xa7\x9c\x6a\xf0\x4b\xf8\xdd\x6e\x01\xb0\x46\xf6\xca\x9f\x80\x05\x12\x17\xec\x46\xbf\x02\xaa\xeb\x7e\x2d\x27\xec\x4d\x77\xc6\x13\x81\xaa\xe3\x57\xd0\x12\x4f\xed\x63\xe5\x70\x6b\x98\xef\x3c\xff\x3a\x79\x42\x82\xc9\x87\xbc\xdc\xf4\x3b\x0f\x13\x09\x71\x11\x60\x2d\xd9\x94\xe6\x6e\x76\xbc\x00\x8b\x99\x8e\xcd\x7a\xbf\xba\x5e\xef\xf6\x1e\x68\xc2\x32\xb7\x90\x1e\xbb\x57\xb7\x8f\xf6\xb5\xe7\x0f\xf3\xec\xe5\xae\x9f\x0c\x80\xe6\x53\xe7\x59\x0d\x85\xb7\x8c\xc9\x88\x85\x2e\xa9\xb9\x3d\xd6\x20\x67\x4e\x1c\x93\x71\x34\x90\xbf\xef\x5e\xeb\xaa\x9c\x66\xf3\x98\xcc\x12\xb4\x59\xa0\xd6\x51\xb0\x5a\xde\xed\x46\x44\x2f\x8c\x49\x09\x2c\xed\x53\x53\x77\x55\x61\x2e\x00\x4d\x98\xb4\x20\x5d\x46\xe2\xa9\x46\xa1\x2b\xb8\x01\xf8\x95\x97\xa6\xfa\xb8\xfa\xbc\xb0\x9c\x32\x0d\x1c\x3f\xa8\xf5\x4b\x99\x0f\x13\xc6\x08\xca\x5f\x75\x0f\xb5\xbb\xfd\xae\xb8\x88\x31\xa3\x8c\x4e\xa7\xa4\x51\x77\x79\xd3\x56\xf5\xe7\x98\x40\x83\x31\x63\x88\xb7\xa0\xa8\xf4\xdb\x4d\x5d\x1d\xb6\x50\xd8\xd9\x1a\xeb\x7b\x82\x12\xc1\x90\x8e\x2b\x3b\x5b\x76\x7a\x4d\x60\xc2\x7a\xbe\xb1\x9b\xbc\x6e\xda\xc9\x17\x09\x3c\x8d\x92\x9e\xd6\x9d\x12\xd4\x33\xae\x04\xc6\x2c\x97\xb8\x81\xe5\xcd\xaa\x8f\x93\xf7\xc3\xc2\x83\x20\x8b\x87\x5b\x18\xb1\xec\xf8\x76\x49\x09\xde\x13\x6a\xcb\x4d\x92\x49\x3c\x90\x19\x8a\xe4\xda\xba\x2a\x5b\x1a\x7f\xdf\x14\x46\x14\x28\x7e\x91\xa4\x5d\xef\x7d\x1f\xd7\x1c\x85\xca\x87\x2b\x1e\x72\x5f\x8c\x74\x53\xd5\x67\x58\x2f\x18\x8f\x52\x12\x13\x54\x79\xdb\x7c\xe4\x76\x38\x89\x4a\xb0\x84\xb8\x1b\x9b\xdd\x84\xf9\xd2\x77\xd0\x16\xad\x14\xd5\x83\x7f\x4f\x04\x24\x77\xed\xb1\x50\x98\x82\x3e\x52\x80\x75\x43\x3c\x13\xfe\xe8\x58\x72\x64\x35\xec\x77\xb7\x51\x32\x84\xc7\xc6\xa0\xaa\xd8\xab\x6c\x16\xc4\x84\x7f\x07\x4e\x01\x33\x9c\xd9\x22\x3c\x01\x4e\x88\xef\x4a\xbf\xa1\x4a\x92\xcc\xbf\xca\x48\xbb\xbe\x69\xc4\x91\xeb\xbb\x17\x53\x82\x6e\xcf\xd4\x55\x7d\x9c\x2a\xcb\xfb\xee\x69\x80\x06\xed\x1e\xe3\x3e\xce\x50\x3c\xbb\x30\xf0\x94\x2b\x1c\x8c\xe7\x4a\x13\xcc\x74\x62\x9a\xf1\x34\x0b\x24\xe6\xb9\x64\xab\x5f\x77\xb8\x66\xfb\x18\x79\x18\xfe\x6b\x14\x27\x1f\xfe\x4f\xfc\x33\xfa\xd7\x88\xdd\xe8\xcb\xff\xb8\x33\xb3\x90\xe8\x43\x8e\xa7\x82\xd8\xfe\xba\x6f\x62\xb6\xaa\x73\x1e\x66\xb8\xc0\x79\xcb\x70\xa2\x3d\x78\xde\xc6\xe3\x59\x18\x47\x03\xbc\x8b\x80\x0e\x7f\x69\xca\xf0\x2c\x94\xc6\x93\x9c\xbf\xca\x19\xe2\x91\x71\xc9\xb9\xe9\x96\xbf\xc5\xf3\x2e\x9c\x0d\xb6\x94\x51\xca\x47\xfb\xdf\x66\xa6\x0e\xcb\xb8\x0a\x25\x62\x84\x7d\xbe\x00\x1f\xf7\xa9\x2c\x3e\x47\x34\x46\x8c\x2b\x16\x20\x0e\xbe\xdb\x61\x36\x75\x7e\x80\xf9\x59\x78\x48\x12\x0b\xae\x24\x75\x72\xfb\x4a\x86\x68\xfc\xbc\xe5\x45\xe1\xa0\x16\xae\x45\x47\x02\xa9\x72\x7e\xe6\xad\x2c\xee\xab\x97\x97\x9e\x5a\x93\x71\x2d\x62\x8c\x48\xa1\xbf\xb9\xdf\xc8\xdc\xec\x9f\x4e\xc3\x91\x2a\x4e\xa9\x1c\x09\x4c\x38\xbb\x19\x93\x50\x95\xba\x03\x3f\xfe\xa8\xf3\x79\x87\x34\xf0\x3e\x1d\xd4\x35\xd4\x03\xd2\x7e\xba\x90\x74\x76\x4f\x4a\xea\x6b\x17\x66\xa8\x11\xc4\x0b\x89\x90\xe6\x3d\x1a\x7e\xc3\xa0\x75\x86\x64\x40\x7a\xa1\xfa\x6d\xbd\x7c\xea\x8c\x98\x81\xb0\x92\x71\x88\x02\x44\x1f\xe6\xe5\xbf\x41\xb7\xfd\x3c\x5b\xeb\xaa\xef\x91\x2a\xcc\xfc\x61\xc1\xa7\x07\x5f\x91\x82\xe2\xf4\x3e\x6c\x02\x96\xd4\x98\x3b\xdf\xea\x7b\xac\x18\xb7\x42\xe1\x26\x4f\xc6\x8a\xbf\x96\x95\xe4\xbc\x79\xee\x94\x73\xb8\x8d\xb9\x99\x3e\x5a\xd8\x45\x10\xa7\x58\xd4\xb4\x7c\x7a\x78\x58\x6f\xb7\xeb\xa7\xc7\xfd\xf5\xfa\xe7\xfa\xda\xb3\x6b\x32\x11\xc6\xca\xef\xc6\xba\xba\xf0\xcd\x8b\x90\xa5\x98\x0a\x3f\xba\x0a\x55\x5c\x8a\xa1\x9e\x3d\xb0\x08\x6d\xe6\x08\xe1\x9a\xd3\x01\xbe\x2a\xb0\x31\x11\xc5\x92\x11\xe4\xfa\x54\x97\xb2\x5b\xac\x1d\x67\x58\xdf\x41\x07\x68\x30\x1f\x73\xd0\xf0\x4b\x8e\x0c\x4f\x11\x19\x19\x03\xcd\xae\x06\xf9\xa1\xfc\xef\x20\x89\x22\xc8\xe6\x2f\xed\xeb\xaa\x84\xc3\x6c\xf3\x13\x71\x92\x62\xee\x67\xf5\xe4\xf1\x46\x22\x09\x03\x14\x32\x81\x43\xde\xf6\x95\x2b\x97\x46\x74\xfa\x94\x89\xd6\xd2\x81\x63\xae\x91\xc0\x1e\x9a\x5d\xb5\xad\x0a\x5f\xf4\xcd\x44\xea\x54\x8f\x47\xe5\xd9\xb3\x91\x62\x42\x52\x0d\xde\x2b\xf4\x48\x00\xdf\xe4\xb8\x14\x36\x55\xd3\xcc\x56\x37\xc1\x74\x86\xc2\x60\xc4\xaf\x71\x5f\x49\x1f\xdb\x5a\xb4\xa8\x23\x76\xf5\x79\x55\xd5\x75\xf5\x65\xeb\x13\xcc\x08\x64\x5d\x7e\xad\x0a\xd3\xd9\x8d\xf2\x37\x66\xfe\xdf\x65\xd1\x9f\x1a\x12\x2c\xd9\xdb\xde\x2d\xa2\x94\x55\x76\x51\x63\xa9\x83\x6f\x16\x69\x84\xfb\xf0\x3e\x6f\x96\x30\x43\xc5\x08\x91\x72\x84\xa0\x22\xef\xcf\x3e\xde\x6f\x77\x8b\xe7\x5d\x7f\x64\x46\xf5\x1b\x2f\x45\xa5\x64\xb1\x7c\xed\x6e\xfd\xb1\xea\x5b\x65\xcc\x3c\x7a\xcf\xff\x96\xc5\xc4\x51\xd9\xbd\xe4\x6e\x04\x30\x4e\x76\xa9\x38\xf0\xec\xf6\x27\x32\x21\x10\xa4\xfa\xbc\xa1\xa0\x35\x42\x66\x9d\x9f\xb0\xbf\x5f\x3f\xac\xfb\xdb\xcb\xb4\x64\xa1\x0b\x97\x36\x38\x28\x07\x30\xb9\x6c\xe1\xb6\xaa\x4c\xb7\x8b\x5c\x43\xe7\x19\x9c\xfb\xe0\xce\xb9\xf9\x22\x33\x29\x46\x16\x5f\x65\x3f\xa7\x33\x43\xe0\xeb\x1b\x40\xe9\x52\x30\x84\x40\x45\xc1\x13\xe1\x7c\xc7\x91\x05\x2b\x64\xe0\x38\xa2\x9d\x2d\x82\xfa\x7d\x7b\x24\x5c\xdb\xbf\xc8\x0b\x01\x1a\xa1\x99\x44\x8f\xf4\xd0\xea\xce\xc1\xef\x95\xe1\x98\xd0\x3a\xc0\x19\x85\xa2\xc7\x24\xe4\x3a\x3b\xd4\x12\xd0\x1f\x4b\x1d\x1c\x7b\x63\xff\xd9\x99\x50\x04\x99\xe7\x61\xef\x4c\xfd\xa1\xc1\x24\xa3\xda\x81\x75\xb9\xa8\x6b\x39\xff\xf4\x20\x4c\xcd\xf0\x29\x18\xe7\x87\x37\xf3\x5e\x51\x88\x83\x76\x83\x90\xbb\x7b\xca\xab\xf9\xeb\x00\xb7\x08\xd0\xc6\x44\xab\x6c\x30\xe6\xdf\xb7\x89\x34\xed\xf9\x2a\x5f\xf2\xaa\x7c\xea\xe5\x2d\xc2\x0b\xae\xbb\x00\xc1\x99\x93\x60\xbe\x2a\xbf\x28\x47\x8c\x37\x49\x01\x86\xc8\xbd\x9c\x76\xc1\x76\x6e\xb9\x66\x01\xa3\xc7\xf3\xd1\x88\xea\x2f\xad\x87\x99\x7e\x29\xcb\xc2\x84\xa3\x65\x7e\xa8\xca\xf6\x95\x6a\x81\x87\x0d\x37\x8b\x98\xc2\x07\x7c\x96\xd6\x16\x70\xdd\x8b\x38\xb2\x2c\xd2\x22\xf3\x52\x4c\x18\xe9\xf4\x0d\x71\xa4\x09\xa3\x56\x15\xb9\xce\x5b\xb9\x91\x2f\xb8\xd2\xfa\x6f\x2e\x4b\x0c\xc5\x3d\x6c\x5d\x1d\x70\x12\xee\xaa\x2b\x7a\xfa\xb1\x53\x90\xa5\xa0\x31\x5c\x77\x57\x95\xd0\xb4\x77\x30\x98\xb4\x19\x93\x4c\x9a\x1e\x4f\x79\xd6\xaa\xca\x78\x44\x24\x8b\x87\x53\xf1\x87\x2b\xbb\x1c\x1b\xcd\x19\x4f\x08\x06\x44\x6b\x59\xf7\x52\x6f\xaa\x7a\xd9\x39\xc9\x43\x9a\x2d\xe3\xa9\xc1\x02\x10\x92\x53\xdc\x96\xf2\xcd\x21\x33\xfa\x0e\x56\xa3\xb1\xb2\x79\xda\xed\xaf\x9f\x17\xeb\xc7\x31\x72\x22\x13\x91\xe6\xd6\xfb\xf8\xfb\x5a\x5e\x60\x59\x65\x99\x48\x02\xac\x4a\x5c\xfd\xd7\x8f\xef\xd2\xa3\x59\x16\x45\x89\xc3\x2e\x8d\xd0\x94\xfd\x74\xc8\xa2\x04\x93\xef\xb7\x84\x44\x70\x40\x2f\x73\x21\xca\x9f\x65\x89\xd1\x64\x4a\x1f\x64\x79\x2f\xcb\xe6\xad\xfa\xb7\x3f\x95\x8c\x49\xcb\x47\xfb\x44\xd2\x39\xc7\x2f\x93\x22\x0c\x1c\x1e\x71\xfb\xa6\x17\xa6\xbb\x99\xd9\xc7\x95\xa9\xb4\x0f\x15\x0e\xb4\xec\xf3\xe8\xd6\xec\x10\x99\xa0\x31\x72\x3c\xa9\x22\x6f\x5e\x1f\xa0\x95\xb8\xe3\x7e\x91\x59\x41\xd6\x20\x77\x90\x0e\x04\xee\x7a\x57\xb2\x81\xad\xb3\x57\xbe\xe7\x80\x65\x99\x8e\x42\x84\xcb\x39\x13\xd5\x33\x46\x9d\xcd\xa4\x64\xc0\x0d\xa7\x60\x71\x69\xaa\xaf\x04\x82\xe7\xaf\x00\x99\xf2\x8a\x65\xdb\x56\xb6\xb9\x5e\x15\x18\x04\x9d\x29\x6a\xb3\x0c\x64\x08\x14\x53\x2e\x61\x7b\xcc\xeb\xbc\x5d\x0e\x7b\x52\x06\x9a\x79\xaa\xd5\xab\xe3\x24\xce\xec\x3b\x40\x8a\xa4\xf3\xb7\x57\x8f\xcb\xf3\x1c\xef\xe3\x35\x3e\x03\x2b\x90\x63\x4a\x4d\x32\xc7\x99\x4d\x25\x72\xe5\x61\x68\xe0\x47\x03\x13\x5d\x74\x96\xd9\x2c\xe4\xc6\x6b\x10\x34\xbb\xea\x1c\x5e\x7f\x3a\x41\xac\x04\xf4\x6d\x5e\x65\xf3\x7a\x89\xd3\xfe\x3f\xce\x64\x2e\x64\x20\xc3\x30\xf3\x69\xd6\x51\x75\xa9\x9f\xeb\x32\x8c\x2c\x8b\x47\x94\xd3\x0f\x58\x76\xf8\x20\xdf\xbe\x51\x67\x98\x0c\x99\x8c\x54\x88\x6e\xff\xf6\x69\xf9\x8f\x2d\x94\xed\xae\x5a\xed\xee\xfc\xe9\xe3\x28\x41\xe8\x90\x3d\x95\xa6\x2f\xd6\x91\x09\x23\xdb\x7b\x52\x89\xe3\xdb\x04\xc1\xa4\xa4\xd2\xdd\x0e\x52\x0d\xd9\xff\xfe\xe8\x2c\x93\x24\x24\x51\x1d\x3a\xbb\x6d\xf3\x73\xe3\x00\x1a\x8b\x53\x7d\x5e\x73\x8d\xc9\x44\x12\x1d\xc2\x6d\xf5\x22\x27\x8b\xbf\x4c\x03\x22\xec\xbc\x3b\xc9\xf2\xee\x94\x8f\xdd\x60\x99\x66\x21\x67\x7d\x86\xde\x2c\xab\x1a\x26\xe9\x39\x99\x3a\x9d\x14\xcf\xa6\x32\x83\x17\x49\x96\x32\x4f\x88\xda\xbd\x65\xfc\xfc\xa6\x37\xc6\xb3\x24\x20\x38\xa6\xae\xab\x63\x55\xe4\x73\x73\x51\x72\x95\x44\x7d\x69\xd0\xae\x3a\xc8\xb6\xea\xb3\xe5\x52\x64\x31\x0e\xe5\xea\x1f\xcb\xbb\xc5\xe3\xed\x6a\x3f\xf8\x08\xbe\x4b\xc6\x00\xad\xa8\xab\xd3\xe7\x52\xd6\x3e\x46\x7a\x21\x80\x2c\x33\x20\xd9\x85\xce\x92\x5a\x0c\x99\x7f\xa9\x4c\x02\xe3\xd2\xfd\x3d\x0a\xf0\xfa\x56\x1d\x25\x66\x08\x27\x6f\x28\x6a\x00\x53\xaa\x2d\x26\x75\x92\x89\xc4\x83\xd9\x7a\xf9\x35\x5f\x92\xe8\x3b\x31\xe2\x46\x6f\xa0\xed\xdd\xff\x39\x3a\x5a\x6a\xa9\x90\xbd\x00\xa3\x31\x9e\x8b\xdd\xb7\x69\xe2\xcb\xe9\x8b\xac\x46\x39\x47\xa9\x4d\x16\x13\x1b\xcc\xe7\xf5\x62\xb3\xf9\x3e\xa6\x20\x4d\xc2\x1d\x61\x5e\x93\xbf\xd0\x1d\xeb\xca\xcc\xe3\x2e\xd2\xa4\x44\x34\x76\x94\x9f\x58\x12\x33\x50\x37\x4c\xf3\xa1\x5f\xf1\x85\xfd\xd0\x18\x13\x50\xee\xaf\xcc\xc7\xcc\x80\x4c\x1a\x08\x11\x24\x52\x56\x6d\x6e\x3f\x8b\xf7\x82\xa0\xfc\xcd\x39\x54\xaa\x84\x2c\xc0\x10\xd6\xcd\xa9\x3d\xd5\xe3\x28\x83\x04\x95\x60\xb2\x12\xa3\xad\x3f\x17\xcf\x8b\x71\xb4\x55\x02\x68\xe4\xf4\x5f\xde\x2d\x76\xbd\x66\x03\x93\x36\x66\x49\x3c\x7d\x15\xb2\xd8\x7d\x09\x51\x48\x6b\x22\x44\xfe\x14\x79\xe3\x59\x2c\xdd\x29\x54\x00\x12\x9b\xb6\x0f\xeb\xfb\xd5\xdd\x6a\xf0\x28\x54\x60\x39\x5e\x33\x47\xbd\x23\x54\xfe\x98\x0c\x89\x0a\x05\x39\xde\x96\xdc\xd4\xfe\x0e\x54\x01\x58\x74\xef\xd1\xf4\x2a\x04\x0a\x58\x50\xee\x6e\x3d\x06\xd7\xaa\x28\x0a\x03\xed\xa2\xaf\x18\x27\x1f\xb5\xc5\x11\xf1\x94\xfa\x80\x9f\x2f\x2f\xfe\x82\x0b\xf5\xfd\x53\x02\x1f\xe6\x4d\x4f\x76\x78\x81\x79\x86\xa9\xd8\xc4\x98\xfa\x7f\xcf\xe1\x23\xf1\x40\x49\x95\x44\x29\xc6\x7a\x4c\xb5\xcd\xcb\x97\x02\x06\x20\xd3\x64\x40\x55\x9a\x12\x70\xc0\x91\x01\xce\x5b\xb9\xce\x60\xc4\xba\x78\x9f\x37\x5f\x84\x46\xa6\x77\x93\x72\xc0\x42\x62\x5f\x96\xfa\xab\xaa\xdf\x88\x5f\x63\x0a\x49\x3f\x67\x2d\x29\x1e\xc4\x11\x09\x0e\x96\xad\x2c\x16\x5a\x9f\x0e\x08\xed\x37\xe3\x79\xaa\x38\x70\x54\x74\x6d\xab\xe7\xfb\x0d\x16\xc6\x8e\xac\x50\xc5\x81\xca\xe5\xb7\xb7\x3b\x5f\x66\x42\x4c\x39\xdf\xee\x2d\x4a\xe8\x98\xd8\x79\xf6\x9a\x4a\x57\x72\x68\x30\xc4\xdf\xe3\x6e\x55\x66\x52\x0e\x8e\xb2\x01\xea\x96\x94\xb8\x77\xd5\xd7\x95\x56\xc9\x50\x62\x42\xeb\x71\xfd\x70\xb3\x40\x0a\xe2\xd5\xee\x0e\x99\x6e\xfd\xb9\x24\x0b\x30\x5f\xd4\x4d\x96\xb9\x6a\x21\x53\xd2\x5a\x5f\xfa\x70\x9d\x5b\x9b\xeb\x53\xd1\xfa\x8d\x40\xa9\x98\xf2\x44\x1e\xb3\x06\x6d\x6e\x73\xfd\x95\xcc\xb0\xeb\x49\x8c\xa5\xa8\xe5\x39\x66\xd1\x1d\xe6\xdb\xb0\x4a\xf8\x63\xa4\x48\x98\x5b\x94\x69\xf7\xba\xa9\xea\xeb\xa1\xe6\xe4\x7b\xe8\xa0\x52\xd2\xe2\xc7\x3f\xe2\xae\xab\xca\x31\xb7\x20\x53\x4a\xdb\x94\x4c\xf4\x52\xbf\x1e\x64\xfd\x46\x1c\xa6\xbe\x59\xdb\x38\xf5\x61\x52\x28\x1b\x84\x6b\x8e\xf9\x86\x98\x32\xae\xf4\x07\xc5\xa8\xd0\x89\xeb\xf3\xd2\xca\x00\xd5\x7b\x3d\xc8\x97\x52\x52\x98\xd5\xb5\x40\x18\x09\x57\x5b\xb5\x79\xad\xda\x19\x0c\x48\x81\x4a\x70\xf1\x7b\x3c\xbd\xbc\x40\xdb\x4c\xee\xd8\x86\x04\xa2\xc4\xdc\x70\x55\xbb\x20\x0e\x3d\x22\x32\xa8\xce\xa2\x27\xca\xc6\x4a\x79\xe9\xb2\x42\x6a\xa4\xce\x21\x47\x6f\xfa\x82\x2c\x27\x4e\x17\x5d\xfc\x1f\x4b\x26\x60\x7e\x1d\xa4\x11\xb2\x44\xa8\x53\x5d\x4e\xc8\x41\xa6\x03\xae\x83\x94\x84\xe5\x6a\x68\x3a\xff\xe2\x8f\x69\x23\x68\x34\x1a\xef\xab\x17\xa7\xb3\x78\xfe\x24\xa1\x56\x58\x41\xe4\x77\xdc\x9b\xba\x3a\x74\x8b\xe0\xb2\x3a\x1c\xce\xe0\xc0\xce\x5a\x8e\x3a\x04\x29\x4d\x8f\xb1\xc1\x8c\x46\xbf\xd5\xea\x28\x26\xb1\x15\x4c\xee\xcd\xd6\x0c\x1d\xf1\x0c\xc0\x4b\x7b\x1f\x4f\xed\xf6\x62\x39\xbb\x8e\x23\xc3\xc3\x3e\x49\xe8\xe4\x6f\x46\xc9\x42\x1d\x73\x48\x47\x76\x72\xf3\x9c\x37\x6f\xba\xca\xe7\x55\x74\x3a\xce\x04\x5a\xc6\x9e\x85\xef\x4e\xd6\x4b\x39\x0b\xab\xeb\x18\x04\xa6\xee\x72\x27\x38\x4e\x08\x43\x59\x50\xbd\xf3\x05\x26\x3a\xa6\x93\x44\xa1\x74\xc4\xff\x74\xde\xa9\xbf\xb1\x84\x1b\xe9\xbc\xaa\xed\xe9\x08\xf5\x41\xce\x3e\x57\x9d\x18\x89\xae\xbb\x34\xe6\x27\x55\x32\x3c\x8f\x98\xb0\xbe\xff\xf0\x74\x2a\xa2\xd8\xd9\x8f\x43\x48\x63\x4a\x59\xc4\x34\x03\x6d\xfa\x75\x45\x16\x71\x2f\x3c\xe3\x76\x67\xcd\x05\xe9\x3f\xdf\x41\x51\xc8\x2b\x59\x7a\xbf\x5a\x0b\x91\x21\x0c\xdd\x2f\xeb\x38\xf9\x47\x05\xb7\x3a\xb3\x9c\x80\x1a\x6e\x77\xc0\xb5\xf3\x0c\xed\xad\xeb\x2e\x05\x45\x00\x3b\xc7\x44\xd6\x17\x95\xa6\xbf\x8f\xac\x6a\x29\x08\x63\xb4\x84\xee\xa2\x45\xf1\xb9\x6e\x9a\x93\xe7\x4e\x3d\xbf\xdf\x7c\x7f\x42\x15\x73\x7c\x4c\xdd\xb9\x01\xba\x5d\x7c\x89\x3c\x69\x95\x04\xa9\x1a\x49\xd5\x4a\x3d\xec\x10\x5a\xa5\x54\xf7\xff\x78\x33\x5e\x3f\xb4\xe2\x16\x11\xb1\xdd\x78\x35\x23\x3d\x4b\xa6\x95\xa4\xad\xac\x06\x5d\xbd\x43\x3d\xd0\x3a\x5d\x08\xda\x69\xad\x29\xd4\xd7\x19\x89\x3f\xc7\xac\x36\x67\x58\x2b\x2e\x94\x38\x69\x0d\x29\xea\x3c\x39\x88\xd2\x6c\xce\x9b\x80\x8a\xc4\x46\x7a\xe9\x74\x47\x4f\xbd\x58\xdb\x97\x23\x94\x70\x08\x9a\x0d\xd4\x4d\x55\xca\x62\xe0\xf7\xf6\x7d\xb4\x40\xbf\xfd\x20\xf3\xdf\xb9\xac\x5e\xa1\xfd\x7b\x00\x20\x0d\x69\x8a\x60\xf0\xf3\xca\x42\xf4\xe7\x9f\xe9\xac\x66\x4f\x83\x4a\x90\x16\xf9\xe9\xd7\xe3\xbe\x5b\x41\x67\x77\x6c\xc3\x04\x49\x4c\x1d\xf9\xd2\x43\x3e\x07\x54\x75\x9b\x10\x12\x17\x6e\x9e\x9f\x7e\xae\x3b\x17\x67\xfd\x78\xbb\x6f\xc6\x0e\x99\x09\x4d\x6c\xdc\x07\xbd\xc8\xeb\xa9\xcc\xa0\xef\x62\x7b\x9d\xeb\x7f\x6c\x56\xcf\xdf\x5a\x4e\x26\x92\x99\x72\x0c\x60\xa7\xe3\x25\x99\x8a\xfe\x0e\x4d\x1c\x9a\xcc\xc9\x0b\xee\xaa\x0d\xe9\x5d\x6f\xcf\x29\x0e\xfb\xad\xdd\xc4\x31\x55\x68\x2e\xfe\xdc\x41\x43\x99\xaa\x6f\x29\xf4\x2e\x7e\x26\x26\x4e\x2c\x41\x45\x3d\xb7\xf5\x5f\x74\xb7\x12\x71\x13\x2a\x47\xe8\xca\xa4\xea\xc3\x24\x11\xe8\xd8\x53\xad\x7e\xb5\xf8\x4d\x0a\x82\x0c\xb3\xbc\x6c\x7f\x94\xf9\xff\x9e\x1c\x7d\xed\x97\xfc\x98\xeb\xcf\x42\x96\xc8\x9e\x8c\xfb\x7c\xc9\xea\xfc\x10\x2e\x91\x83\xf2\x55\x36\x84\xb6\xfd\xe5\x1e\x49\x5c\x62\x7b\xf1\x07\x8a\x80\xe9\x21\x11\x3c\x65\x25\x3c\xeb\xe7\x19\x1e\xc4\xd2\xe5\xd9\x6d\x5e\x1f\x76\x3d\x95\xd0\x8c\x2f\x92\x19\x2e\xd2\x54\x7a\xbe\x6a\xc4\x7a\xfa\x06\xa3\x10\xe6\xb1\x5d\xb4\xd5\xe1\x1f\xfe\x57\x11\x71\x64\xcc\x19\x1c\x86\x7a\x39\x2d\xb2\x1e\xfc\x11\x23\x6c\x8a\xb1\xe0\x5f\x8b\xc7\xfd\xee\x69\xb7\xb8\x9f\x42\xa2\x4c\xc6\xa3\xd0\x07\x02\xa0\x7e\x2b\xe0\xb9\xaa\x50\x53\xae\x24\xe1\x1e\xf7\x0a\x47\x5f\xb8\xc9\xc0\xfa\x28\x39\xa5\x2b\xbe\xb8\xd2\x46\x1a\x4a\x4e\x3a\x32\xd2\x8d\xaf\xa0\x10\xff\x4c\x66\x0e\x90\x91\x06\x7a\x45\x70\x54\x67\x72\xd0\xac\xf9\x19\x41\x32\xb7\x8d\x2c\x5e\xa0\xd4\xb3\x6c\x82\x51\x9c\x54\x02\xf2\x86\x48\x86\xdc\xcf\x3a\x0c\x11\xbe\xe2\x65\xe2\x91\x44\xe0\xd4\x38\xa2\xe5\xd1\x38\xe9\x94\x7b\x1a\xf8\xed\x49\x35\xba\xce\x8f\xd3\x12\xf8\x73\x71\x47\xa3\x05\x38\xc9\x1b\xf2\x3f\xdc\x70\xed\x2a\x87\x81\x9e\x3d\x84\xd1\x26\x74\x45\xbc\x1e\x76\xe8\x5a\xc0\xa4\x9e\x39\xd1\x54\x1f\x04\x9c\x1f\xea\x6b\x8d\x4d\xb2\xc0\x6b\xd6\x3e\x11\x5d\xeb\xf4\xd4\x10\x08\x0a\x17\xdc\x9e\xca\xb1\x31\x0c\x61\x48\x81\xad\x1e\xa0\xb2\x2a\x29\x1f\xe1\xbd\x69\x88\xb3\x40\x52\xe1\x41\xdd\xb4\xfb\xa3\xfc\xdc\x2b\x24\xe4\x3e\x38\x91\xa2\xbe\x1b\x31\x16\x2c\xfe\x4c\x70\x41\xb9\x86\xe2\xab\x06\xe7\xdf\x5b\x55\x20\xd6\x12\x71\x5c\xae\x86\x79\x42\x25\x39\xef\xa9\x89\xe5\x0c\x63\x61\xe3\xc2\x14\x48\x52\x22\x8e\x7a\x81\xf6\xc7\x7a\xf4\x73\x66\x51\xcc\xf5\xbe\xd2\x4e\xfa\x11\x4e\x07\xfa\x60\xfb\x47\x4e\x13\xe5\xf8\xd0\xfe\x5d\xd5\x79\xef\x70\x01\x67\x82\x3b\xab\x69\xa1\xbf\xba\xd0\xc0\x4d\x86\xcb\x87\x81\x02\x5e\x70\x5e\x37\xcd\x79\x7c\x3a\x08\x46\x84\x99\xee\x03\xa8\xab\xdf\x9f\xeb\xc3\xf1\x2c\xf4\x1d\x84\x92\xe8\xc1\xcb\x52\xe6\xc5\xa3\x6c\x5f\x6b\xa9\x5f\x9f\xea\xf6\x55\x5e\xbd\xca\xbc\x59\x37\x57\x20\xdb\x57\x79\x5d\x2d\x5f\x41\x16\xd7\xd0\xf5\x3b\xbc\x7e\x25\x82\xf1\xeb\x3f\x64\x59\x84\x69\xbd\x6e\x57\xa7\xba\xc8\x59\x3e\x1e\x32\x1d\xf9\x2a\x87\x1f\x4d\x8f\xa8\x98\x06\x4b\x40\xb2\x08\xbd\xca\xb7\x4f\xed\xb9\xcb\xa7\x0f\xa9\x42\x0a\x3d\xbc\xbc\x13\xd5\x22\x2e\x60\xa1\x8f\x4c\x80\xe2\x06\x67\x96\xad\x01\xcc\xaf\xaa\x21\x44\xd0\xaf\xaa\xd9\x7e\x36\x3d\x21\x66\x67\xa9\x0a\x5c\x82\x7e\x0e\xd4\x2d\x60\x02\x16\x47\x7d\x0a\x68\x2a\x21\x34\x7d\x12\x13\xc7\x81\x18\xf1\x2e\x3c\x59\xda\xef\xce\x79\x2e\x60\x32\x8b\xc6\xc9\xe6\x66\x52\xef\x7d\x3e\xdc\x3d\xf9\xdb\x67\xa7\xc0\x48\x12\xbc\x90\x66\xb8\x5b\xcd\x10\xfb\xe2\x75\x64\x74\x5d\x6d\xe6\xf9\x4e\x30\x86\x27\xf1\x5c\x41\xb9\x99\xf1\x24\x32\x80\x44\x48\x17\xaa\xf4\x56\xc4\xf6\xcf\x73\x81\x39\x00\x41\x32\x42\x35\xa0\xa1\x6e\x56\xbb\xbb\xf9\xb9\x14\x7d\x22\x9b\xe7\xd5\xe6\xc7\xf3\xf2\x6e\xb1\xed\xe3\x70\x60\x93\x04\xbd\x6f\x3b\x09\x84\xf5\xad\x5c\xe8\x61\xfc\x97\x04\x94\xd9\xb6\x52\xbf\xcd\x33\x3d\x74\x80\x0d\xa2\x00\xb7\x2a\xac\x6a\x23\x29\x82\x75\x0b\x87\x66\x12\x88\xb7\x41\x9c\x85\xae\x70\xfd\x41\x9e\x2d\x82\xb7\x81\xa0\x39\x75\x6a\x00\x71\x20\xee\x03\x8b\x02\xdf\xee\xaa\x78\x3a\x2b\xe2\xe1\xfe\x5c\xd0\x6c\x58\xd5\x6d\x28\x33\x24\xae\x5e\x6e\x16\x13\x24\x93\x8d\xd2\x00\x24\x7e\xc9\x2d\xd4\x87\xbc\x84\x5f\x90\xbf\xbc\xf6\xf3\xcf\x46\x99\xc1\xc4\xbc\x44\x55\x7f\x28\x8a\x21\xfc\x68\xe3\x94\xe1\x9e\xa2\xaa\xd3\xcb\x6b\xeb\xf9\x83\xa7\x43\x6f\x63\x66\x88\x3c\xb1\x5b\xad\xe3\xfe\x50\x1d\xa0\x53\xbb\xfc\x5c\x56\xfd\x6f\x26\x42\xf2\xfa\xa2\xfa\x80\xa6\xbd\xca\xfd\xa2\x6f\x13\xa6\x10\x7f\x40\x95\xc6\x00\xb5\x1e\x11\x03\xd9\x84\x11\x91\xf2\xf3\xcd\x7f\xcd\x99\x0e\x27\xe3\x99\x70\x81\x1f\x71\x91\x5b\x70\xce\xe6\x98\xc1\xcc\x26\xc6\xc6\xc9\x14\x72\xea\x98\xaa\xa7\x4b\x86\x4d\x6c\x86\x3b\xb0\xa5\xc8\xf8\xdc\x8a\xb1\x69\xa0\x7d\x1e\x6c\xbd\x7c\x9a\x0d\x47\x1a\x65\x2e\x9a\x7d\x6a\xc0\xf4\x90\x61\x9b\x02\xb1\x6f\x35\xaf\xd5\x07\x26\xb4\x0a\xf0\xb2\xae\xae\x07\x13\xa4\xdd\x40\x26\xce\x34\x40\x72\xd6\x2e\xb4\x4c\x70\x49\x0c\x34\xdd\xcb\xfb\xb3\xea\x61\xb3\x96\x81\x90\x30\x12\x92\x1d\x91\x24\xd2\x6c\x76\xfd\x78\xac\x88\x53\x0a\xde\x4f\x50\xbc\xc3\x73\x55\xc0\x54\xfe\x87\x59\xce\x82\xc0\xf4\xc2\x18\x4b\xaa\x07\x1b\x81\x8f\x2c\x57\xc4\xe9\xb7\xb8\xfe\xb9\xde\x3e\x3d\x6f\x51\x1e\xd9\x37\x8a\x84\xa4\xff\x11\x56\xeb\x50\xd2\x3f\xbc\x73\x22\xc6\xbb\x83\xcd\xa2\x10\xa3\x2d\xf8\x65\x4d\x3f\xa7\x4c\x40\x1a\x7b\xda\x0d\xc4\xf0\x77\x9f\xeb\xb4\xe8\xc9\x66\xd6\x10\x43\x7c\x7e\x80\xea\xd4\x3a\x10\xc7\xf9\x44\xaa\x95\x9a\x76\x0e\xd4\x53\x27\xea\xc4\xab\xff\x4f\xa8\x13\x99\x95\xc0\x68\xd7\x1b\x55\xe4\x8e\xf2\x1b\xae\x97\x4a\x24\x9a\x4c\xb4\x8f\x3e\xc2\x87\xdb\x3b\xbe\x50\xec\xf9\xd3\x2a\x0e\x18\xd6\x04\x9c\xa5\xd3\xf2\x5b\xab\x32\x8a\x81\xd7\x48\xd8\x3f\xe4\x1f\x96\x50\xbb\xd8\xea\xbc\x44\xe7\x3f\xce\x6c\xd8\x56\x87\x01\x2e\xe5\x07\xf9\x06\x03\x9b\xb4\x38\xff\xf8\xe1\x05\x2b\xc8\xea\x88\x33\x57\xb1\x7d\x94\x14\xb2\x77\x86\xdf\xff\x9e\xf2\x23\x32\x70\xd5\x34\x33\x6e\x00\x9c\x18\x49\xde\x1b\x64\x56\xcb\xc0\x78\x0c\xa1\x03\x08\xcf\x1c\x4d\x6b\x24\x57\x72\x4e\xc6\x75\x53\xd5\x0b\x43\xa2\xad\xae\x1b\x08\xee\x78\xb2\x0e\x55\x0b\x4e\x5d\x79\x39\x4a\xc5\xd9\x6e\xb7\x98\x84\xc7\xea\xce\x9e\x9e\xa4\x6d\x66\x0f\x67\xd3\x00\x31\x1c\x94\x62\xba\xee\x0c\x98\x25\xee\x25\xc5\xa8\xc8\x9a\x07\x41\xc6\x42\x07\x5b\x9b\x88\xbf\x4d\x46\x3d\x19\x3a\x73\x52\x6f\x30\x23\x92\xf7\xaf\x44\x78\xce\x0e\xea\x0e\xd0\x24\x98\xd0\xca\x76\x4c\x9f\xc6\x83\xc0\x32\x0f\xca\x6f\x0b\x17\xed\x9b\x62\x0c\x3c\x57\x87\x7f\xbb\xfe\xd1\x78\x10\x66\x01\xa6\xb7\xbd\x71\x79\xbd\xbe\x9e\x96\x89\x76\x5d\x78\x42\x2a\x8a\x24\x4b\x7e\x6e\xa1\xe2\x41\x68\x48\xe6\x09\x45\x73\xf4\xdb\xaa\x34\xe7\xe2\x05\x3c\x88\x82\x5e\x59\x6e\x7b\x84\xfa\x50\x54\xb5\xe9\xf9\x47\x78\x10\x09\xc2\x69\x12\xb3\xca\x73\x6e\xe0\x9c\x60\xe7\x97\x88\x0b\x0f\x22\x29\x30\xf4\x31\x61\x9a\x9f\x5e\x3a\x96\x92\xf4\xca\xdb\xea\x78\x53\xd5\x7e\xdb\xe0\x41\xac\x79\xea\x83\xec\x94\xea\x72\x04\x1c\xae\x3d\x51\x0c\xcd\xb2\x0f\xc8\x77\x9e\x20\xea\xdc\x4c\xe1\x41\xca\x38\xa6\xb3\x51\x80\x08\xb5\xf2\x56\xcf\xcb\x90\xa5\x18\x7a\xb5\x52\xc3\x63\xb5\x94\xfa\x75\x56\x00\xe9\xe7\x04\x53\xb4\x90\xde\x41\x71\x1c\x50\x19\x3c\x60\x96\xa3\xd6\xdb\xfe\x30\xc8\xb2\x7d\x83\x06\xe1\x01\x8f\x4d\x44\x95\xde\x0d\xd4\xed\xf2\xfe\xb1\xad\xce\xe0\x16\x5c\x67\xd1\x2d\xef\x6e\x58\x2e\xd2\x41\xf0\x20\x0b\x22\xa5\x71\x1f\x51\xa7\x97\xe4\x8f\xfe\x57\x02\x59\x7d\x7c\x7c\xec\xe1\x37\x26\x98\xf6\xbe\xe2\x8d\x07\x59\x92\x61\xbd\x3d\x98\xbc\xed\x71\xb2\x55\x7d\x46\xa9\xf7\x9f\xff\xc2\xd9\x79\x5e\x8c\xc8\x9f\x4d\x48\xb4\xa3\xaf\xa0\x7f\x73\x99\xb1\x1e\x6e\x4d\x60\xfe\xef\xd2\x65\x3c\x90\x3c\xc5\x4c\xff\xed\xfa\x66\xf7\x37\xe6\x94\x84\x04\xab\x22\x5d\xe5\x5c\xe7\x4f\x1e\x46\x55\x8c\x13\xab\x91\x07\x2a\x23\xe0\xfe\x7b\x95\x9f\x29\x2c\xe1\x81\xce\x24\x5a\x51\x4d\x5b\x83\x3c\xfc\x31\x3d\xd8\x04\x84\xf8\x40\x13\x6b\x65\x86\xb9\x69\xe2\x00\xc9\x33\x6a\x68\x4f\xb5\x53\xce\x8a\x2e\xbc\x22\x63\x15\xee\x08\x5b\x28\xa0\xcc\x4f\x87\xe7\x5c\xbf\x4e\x40\xfb\xdf\x3c\xab\x0d\x88\x71\x6d\x3f\x48\x6d\x12\xbf\x81\xbf\x11\x9b\xa8\xb0\xaf\x5e\xec\xec\xa6\x29\x0c\x83\x07\x96\x91\x9e\xdc\x0b\xa0\xe9\x80\xbc\x08\x17\x3e\x13\x2b\xa9\x1c\xe4\xa5\xe7\x6d\xc6\xc2\x1f\x39\x61\x4b\xe6\x81\x55\x94\x7c\xb8\xad\x0a\x33\x5b\x95\xc2\x20\x0d\x31\x1c\x7c\x24\x91\x2d\xf9\x02\x43\x18\x61\x7a\xb5\x30\xe0\x26\x08\x3c\xb3\x46\x71\x06\xad\xe5\xfb\x81\x40\x71\x9b\x3d\x66\xa5\xea\xb6\x19\x79\x76\x3c\x0c\x21\xc4\x4c\xdc\x5e\x76\x66\xe5\x33\x58\xaf\x7a\x78\xf6\x5d\x84\x71\x6c\xa5\x17\x42\xea\x57\x77\x27\x26\xcf\xc3\x38\xb1\x18\x41\xcf\x75\xf5\x20\x7f\xf7\x05\xa0\x3c\x8c\xc1\x26\xd9\x84\xd7\xc6\x6f\x53\xfb\xe3\x17\x4a\x11\x1e\x26\x01\xf1\x5c\x7a\x3f\xec\x1a\xde\xe7\x92\x65\xb3\x03\x20\xc6\xdc\xd0\xa0\xa3\xfe\xdc\xed\x61\xb3\xd3\xa6\x41\x8c\xe5\x25\x88\xea\xbb\xee\x36\xee\x59\x21\x14\x0f\xd3\x2c\x14\x29\x19\xbb\x44\x71\xea\x27\x4a\xc8\x02\x83\x79\xb1\xe5\xcf\xe7\xfe\xa7\x50\x63\x44\xe8\x67\xde\xca\x83\x53\x33\x7e\x84\x8f\x6f\x30\x88\x3c\x64\x69\x2c\x7d\x85\x6b\xe7\xee\xd4\x9f\x9d\x95\x0e\x5f\x89\x55\x78\xc8\x38\xe1\x1b\x86\x2a\x20\x33\x2d\x46\xe1\x21\xcb\x84\x76\x68\xd1\xd3\x57\x89\x19\x1e\x32\x88\xad\xcb\x62\x4d\x69\x6c\x67\xa7\xb1\x09\xf1\x52\x4b\x0d\x4f\xa7\x76\x76\x12\x1e\x0b\x1b\x8e\x92\x10\xd7\xed\xeb\x6e\x32\xe1\x7c\x3f\x4d\x0a\xef\x9d\x95\x30\xd0\xf7\xf2\x90\x1b\x69\x06\xae\x21\xa7\x92\x76\x53\xcd\x0f\x17\x91\xca\x1c\x66\x0a\x47\x72\x84\x63\xe1\x61\x16\x67\x88\x05\x5d\x4f\x38\x56\x79\x98\x99\x00\x17\xcf\x63\x67\x2e\x6a\x68\x7a\x93\xa9\x6b\x0a\x4d\xe0\xed\xf7\x17\x94\x94\x9f\x5e\x50\x76\x4b\x9b\xdb\x1f\x31\xd2\xec\x98\x0d\x67\x8f\xaf\x13\xf2\x55\x1a\xe4\xe1\x30\xc3\x3d\x69\x60\xf8\x7e\x6e\x97\x0b\xff\x93\x09\x65\xe0\xd5\xa2\x37\x64\xde\x7e\x15\xf1\xe1\x21\x04\x14\x16\x28\xf2\x43\xde\x5e\xd5\xb2\xd4\xaf\x98\xfd\xf3\xcd\x69\x38\xc2\xc9\xdd\x0e\xe2\x21\xe3\x85\xce\xd9\xac\x2e\x47\xcd\x43\xc8\x74\x44\xf2\x2f\x43\x18\x8d\x87\x36\xd6\xe8\x5a\x56\xa5\xcb\x39\xcf\x6d\xe6\xe9\xb3\x5a\x6e\xd1\x4e\xc1\xa4\xe8\x4d\x7d\x1a\x30\x28\x67\x27\xb3\x15\x41\x18\x4c\x03\x21\xf1\xf4\x51\xa3\x40\x46\xdc\xf3\x81\x3f\xd9\xe1\xcd\x45\x61\xac\x0c\x61\xac\xa4\xb9\xaf\x66\x83\x1e\x85\x3c\x43\x10\xd0\x7b\x0e\x1f\x18\xf5\xbc\xaf\xda\x27\xdb\x47\x5b\x06\x0d\x3e\x1e\x45\xa1\x40\x7c\x86\x63\x7a\xbc\x23\xe6\x55\xdf\x28\x38\xf1\x5c\xe5\xef\xae\xca\xe7\xec\x83\x47\x91\xcc\xc0\xf6\xb6\x12\x96\xc9\x9c\xd1\xab\x70\x9d\xe3\x30\x91\x6e\xe2\xdc\xd6\xd5\xe9\x78\x0d\x43\x30\x7a\x7a\xda\x38\xd2\x86\x84\xad\x5b\x14\xdb\xb9\xa9\xea\x6e\x03\x9d\xf7\x52\x71\xe2\x44\x6f\xdb\xdd\x17\x5e\x28\xd7\x29\x09\x63\xe8\x41\x74\xd7\x79\x83\xb1\xe9\x4d\xbf\x4d\xcc\x6e\x31\x11\xa1\x15\x3e\x64\xe0\x75\x32\xfc\xa0\xa4\x46\x60\x39\x08\x2a\x06\xee\x7d\x30\x90\x47\x29\xa4\x18\xe6\xf8\xd1\x40\x8d\xc1\xb7\x99\x95\x1b\x31\x96\x60\x07\x9f\xeb\x1f\x25\x56\x79\xc4\x04\x20\x94\xad\x36\xf9\xbb\x2f\xb1\x9c\xc4\xe5\x78\xd4\x19\xab\x7a\x18\xe5\xd9\xd9\x79\x1a\x9b\x41\xe5\x08\xb1\x44\x67\x36\xf8\x68\x2c\xb8\xc6\x23\x9e\x69\xc9\x06\x7a\xda\x0f\x80\xa3\x4b\x63\x0c\x65\x88\xe3\xff\x9a\x5d\x52\x11\x61\x91\x9b\x3b\x98\xb1\x9e\x60\xf8\x79\x24\x04\x49\xde\x50\x0d\x84\xcf\x09\x8c\xee\x20\x0b\x99\x9f\x3a\x0f\xcd\x0b\xda\x6b\x57\x60\x7b\xba\x1a\x1e\x65\x5c\xa3\x7e\xc7\x8b\x3c\xf4\x62\xd2\x7d\x9b\x49\x50\x03\xcc\x9c\x9a\x76\x03\xc7\xf3\x70\x7c\x1e\xc9\xc0\xf1\xfb\x6f\x36\x93\x31\x97\x19\xc7\x25\x97\x86\x6c\x07\xf2\xf0\x73\x36\xa8\x2a\x25\x06\xe1\x47\xf8\xc0\x1d\xe0\x4c\x01\x29\x8f\x14\x18\x5c\x2a\xdf\x7b\x02\xb7\xd9\x0c\xd5\x92\x96\x11\x17\x08\xb8\xfa\x5c\x9c\x0b\xde\xf2\x48\x03\xf1\x37\xc8\xe2\x43\x7e\x36\x4e\x12\x98\x98\x4d\x91\x14\xd4\xdf\xb7\x09\x88\x98\xa9\x86\xf7\x4a\x77\x2f\x6e\x3e\xd3\x80\x13\x56\xda\xd6\xd5\xe1\xac\xc7\x15\xd9\x00\x30\xdf\x82\x94\xbc\x0d\x8c\x1c\x8b\xc8\xa6\x09\xef\x8b\xd7\x3d\xde\xf4\xd6\x47\x16\x79\x64\x05\x60\xcc\xd5\x49\xcd\xd4\xd0\x39\xd4\x93\xaa\x59\xea\x18\x07\x52\x62\xa0\x17\x77\xac\xbc\x7c\xd9\x2f\x65\x6d\x26\x16\xa0\xef\x08\x80\xdb\xd3\xa2\x84\x43\x95\xbb\xeb\xc4\x61\x18\x41\xea\x97\x47\x54\xee\x7b\x96\xe5\xbc\x16\x60\xba\x10\xc5\x61\x98\x60\x5c\xcb\x97\x97\x2e\xa1\x6c\x4f\xf5\x97\x37\x12\x87\x11\x41\x3c\xba\x01\xba\x83\xdf\xcb\xd7\xf9\xaa\x12\x87\x3c\xcd\x84\x8f\x4d\xae\xfb\x7b\xe2\x22\x70\xc4\x09\x2b\xbf\x22\xcf\x8e\x03\x81\x25\x5f\x05\xd8\x36\x8b\x67\x8d\x51\x62\xd1\x67\x73\x0e\xe5\xb2\x3b\xf7\xdc\x88\x8a\x63\x60\xf8\x4d\xde\xcb\x53\xa9\x5f\xe7\x24\x74\xa3\xaf\x37\x4e\x82\x14\xcd\x49\xac\x5d\x7a\xa8\x4a\xf8\xbc\xae\x3e\xca\xc7\x5c\xc3\x4c\xa4\x83\xc7\x89\x63\x8e\x6e\xa0\x5d\xeb\xea\x5a\xb6\x5f\xe5\x53\xbe\x4d\x69\xf1\x98\x69\x89\x32\x1f\xb9\x27\xbf\xbd\xe8\x57\xfd\xe5\xdf\xbf\x77\x41\x9e\x4a\x64\x45\x76\x83\xf5\xa3\xc4\xfd\x1e\x7a\x38\xd6\xac\xb7\x93\x9b\xc0\x92\x20\x04\xe1\x4d\x7c\xa9\x98\x5b\x52\x43\x96\xc6\x3c\x15\x66\x8d\xfa\x57\x13\x40\xd8\xf9\x9b\x10\x21\x43\x42\x0d\x05\xed\x53\xf9\x64\x90\xb1\xe6\x8f\x69\x19\x53\xd7\x49\x22\xd6\xbc\xac\x2e\xd1\xc1\xfb\x8e\x89\x45\xa2\x55\x37\x86\x4f\x0e\x08\x32\x5b\xd6\x62\xc1\x01\x2b\x45\x9f\x8e\x50\x5e\x55\xbf\x67\x4f\x2a\x44\xc8\x9d\x4b\xb5\x6e\xb6\x6d\x55\x23\xe3\xc0\x78\x21\x89\x33\x4e\x5b\xec\xdd\xfa\xf6\xce\x9f\x54\x66\x06\x5d\x75\x64\xb9\xea\x16\xa9\xe5\xa7\xee\x1d\xb9\x58\x5a\x48\xc8\xa3\xa4\x40\x9a\xff\x5d\x31\x81\x1f\x61\x51\x39\x2a\xbf\xaf\x05\xe5\xa3\x81\xd0\x4e\x81\xa2\xaf\xdd\x76\x64\xd7\xfe\x6c\x9a\x87\x98\x43\xe9\xec\xdb\x70\xb4\xe6\xc4\x5a\xa5\xe1\x20\x5f\xb5\xd6\xd5\x1c\xc0\xc6\x63\x03\xc6\xab\xb2\x39\x89\x64\xd7\x60\x83\x08\x5c\x90\x69\xa1\xdb\xfc\x1d\xee\x64\x43\x06\x61\x1f\x9c\x1d\xee\xd0\x86\x80\xc0\x34\x5b\x9d\xea\xf6\xd5\x29\x54\xf7\x67\x82\x28\xd3\x3d\x9d\x5f\x5e\x99\x5c\xcb\x62\xf1\x3c\x34\x67\x18\xa5\x2a\xab\x27\xfb\x4b\xbe\xc3\x70\x07\x60\x61\x10\x4d\xf7\x52\x30\x8b\xe6\x6e\x4e\xac\xcd\x93\x20\x16\xf8\xf2\x1c\xb9\x11\x48\x03\x75\xb3\x3f\x3f\x5d\x92\x50\xab\x98\x79\x6d\x17\xf9\x02\x43\xf4\xe0\x5c\x6c\x9b\x27\x51\x9c\x21\x4b\x45\x3b\xa6\x1e\x98\xc1\x45\xce\xfe\xea\x8e\x8f\x2d\x47\xb5\xfd\xce\xdc\x5b\xb5\xaf\xdd\xaa\x98\xb7\x3d\x81\x88\xeb\x94\x48\xaa\xe8\xec\xdc\xf4\xc6\x17\xc0\x5c\x11\x82\x78\xf6\xb0\x89\x89\x70\x7f\xfd\x35\x2e\xe5\x9f\x6e\x44\x49\x62\xa8\xe2\xfe\x3a\x7f\xc9\x11\x60\x3a\x9a\x16\x09\x8b\x04\x6e\xbf\x57\xc4\x9f\xfb\x57\x45\xca\xe7\x2a\x06\xfc\x99\x52\x52\x9d\xea\x86\xb2\xbb\x0a\x52\x47\x7e\x99\x64\x09\x03\x9d\x59\x9f\x8a\x40\x40\x8b\x53\x64\xf0\x77\xd4\x75\xe1\x94\xac\xa9\x8b\x7c\x8c\x06\xe6\x09\x87\x00\x23\x2d\xc8\x33\x22\xf3\xa2\x33\x85\x1e\xab\xc5\xc9\xa7\x67\x78\x22\xa2\x34\xc8\x46\x08\xf5\x29\xae\xcf\x75\xca\xba\x4d\x06\xa1\x25\x9e\x0e\xfe\x11\x3e\xee\xa0\xae\x36\xe3\xe2\xe6\xbf\xce\x4c\x7c\x89\xeb\x26\x59\x68\x30\x10\x79\x95\xcb\xf6\xb5\xa8\xca\xc7\x6a\x34\x4d\x2e\x62\xd9\x79\x92\xa9\x28\xa2\x22\xda\x53\xd9\x7e\x22\x19\xfc\xe5\x91\x96\x71\x84\x8b\x97\x87\x57\xee\xe0\x70\x2c\x86\x15\x25\x51\x9a\xa3\xd7\x83\xb4\xcd\xd7\xd5\x49\xf5\x45\x4a\x3c\x51\x26\x40\x8c\x7e\x5d\x9a\x5b\x79\xdc\x0f\x3f\x13\x1b\xb8\x96\x83\xd4\xf7\x69\x8c\x09\x9d\xda\x7b\x89\x02\xc0\xbc\xc3\x43\x6e\x7c\xd4\x31\xd1\x61\x6c\x43\x4f\xa5\xbc\x68\x5b\xa9\x5f\x71\xf9\x9f\x3c\xa8\xb6\xb1\x72\x1f\x1c\x12\x4a\x13\x1c\x63\x3a\x88\x26\x8c\x31\xdb\xe4\x05\x47\xbb\x99\xb2\xa8\x41\xfa\x0b\x99\x24\x0c\x5c\x2c\xfb\xa6\xaa\x3f\x64\x6d\x08\x04\x72\x03\xd0\xec\xfa\xdb\x31\x82\xb0\xbd\x2f\xd0\xfe\x99\xb7\xed\xe7\xf6\x2d\x2f\x8a\xad\xee\xec\xde\xd9\xe5\x14\x79\x80\x3f\xa1\xfe\x9c\xcc\x36\x88\x02\x34\xc3\x7e\x63\x54\xfc\x6f\x95\x9d\xf1\x04\x92\x34\xa2\x7a\x03\xe3\x6b\xa4\xbb\x1f\x79\xef\x57\xc8\xba\x6d\x9e\xec\x57\x09\x47\x9e\x80\x88\x30\xaa\x44\x1c\x0a\x8f\xd7\xfb\x9b\x1f\xdd\x3f\xcf\x8b\xe5\xfe\xea\x69\xe7\xcf\x65\x83\x10\x19\xb2\xae\x6b\x90\x87\x73\x51\xfa\xc9\x78\xdb\x38\xc4\x90\xb4\x53\xd9\xea\xbe\xb7\x41\xeb\x65\xb6\xc3\x27\x36\x8e\x28\x1a\x43\x6a\x07\x5f\xa7\xe0\xf9\x2d\x3c\xb1\xa0\x42\x37\xd4\x48\x8f\xfd\x0b\xb5\x5b\x37\xd5\xfc\xc5\x5a\x4b\x22\xb8\xaa\xaa\xde\x96\x52\x4d\x5b\xd3\x20\x4c\x74\xe0\xad\xe2\xb5\xae\x1e\x64\x5e\x0e\x60\x6d\x9e\x06\x59\x22\xa8\x66\xb5\xec\xd6\x16\xb7\xb3\x78\x26\x81\xb3\x6f\x23\x0d\xa4\xc6\x70\xd9\xfd\xd3\xed\xfe\xae\x3a\x35\x9e\x4e\xd1\x4b\xaf\x9e\x3f\x2a\x04\x8d\x71\x38\xaa\x48\x5f\x3f\x9d\x0f\x70\xa6\x11\x53\x3c\x1b\xa4\xbe\xaf\x4f\xe5\x0b\x7c\x85\x37\xba\xce\x71\x22\xd0\xd1\xd7\xc4\x96\x7a\xdb\x4f\xb3\x34\x16\x36\x1e\xb2\xd3\x54\x46\x35\x9d\x19\x69\x2c\x33\x04\x40\x1f\x4f\xcd\xeb\xf9\x9d\x2c\x4d\x02\x83\xeb\xaa\x2b\x85\xf7\x27\x67\x59\x88\xd8\xbd\xfd\x2b\x0a\xd7\xac\x4a\xa8\x5f\x3e\x77\xd5\xf1\xf4\xbd\xba\x14\x4f\x45\xa8\x91\x24\xee\x9d\xf2\xfd\x8e\x93\x63\xe0\x47\xf5\x17\xc8\x52\x13\x3b\xef\xf2\xaa\xaa\x8a\x9b\x1c\x0a\x13\xf6\x8d\x42\x63\x81\x45\xf7\xf5\x4e\x22\x88\x17\x2e\x9a\xd9\x0c\x01\x25\x9e\x53\x66\xda\x2a\x03\xa9\x59\x8f\x0e\xf8\x5a\x26\xcb\x53\x25\x25\x4e\xc4\x8f\xbd\x3d\x75\xee\x9c\x2b\x9c\x1f\x52\xd9\x3c\xd5\x51\x80\xec\xaa\x58\x78\x45\xd4\x77\xbe\x85\x13\x7b\xae\xa3\x9e\x03\x59\x0c\x1a\x31\xe7\xc7\x5c\x73\xa3\xd9\xc0\xf6\x39\x31\x87\x53\xcd\x81\x21\x25\x32\x18\x82\x02\x8f\xd7\x96\xd4\x70\xf0\x7b\x3c\x8a\xf7\x8c\x38\x47\x78\x0a\x1a\x48\x98\xa9\xfb\x12\x5c\x15\xe1\x28\xa5\x91\xda\x84\xb4\xb6\x48\x43\x88\x2c\xed\x21\x22\x90\xda\x4c\x61\xf4\x4e\x57\x07\x07\xb9\xdd\x2c\x77\x7d\xa3\xb1\x31\xd5\xc4\x39\xd5\xd1\x9e\x63\xc9\x0f\x04\x0b\x78\x82\x96\xea\xc3\x67\x9b\x17\xba\xca\x4b\xa7\xb5\xd1\xb7\xeb\x0c\xe7\x3d\x1e\x75\x5b\x13\x8d\xca\xd9\x11\x62\x01\x10\x43\xe9\x21\x2f\xf3\xc3\xe9\xe0\x4b\xd9\x48\xd0\xc6\xf7\xb1\xd2\x8e\xb6\xec\x19\x9a\x89\xb3\x30\x31\xc4\x38\xd0\xca\x37\x30\x57\x9f\xa8\x81\x34\xeb\x22\x24\x56\x4f\xd6\xef\xfe\x3d\xb3\x30\x63\xe8\x31\x34\xf2\x70\x2c\x28\xf5\xed\xbc\x0a\x67\xd8\x0d\x20\x89\xc4\x1f\x22\x43\xf4\x1d\xfe\xf3\xd4\xb4\x07\xf9\xd6\x19\x05\x9e\x51\x02\x03\x2f\x7e\x13\x65\x51\x66\xb4\x1a\x69\xfc\x36\x53\x03\x8e\x45\xc0\xd0\x5a\xc5\x78\x59\x7e\x80\x7b\x84\xc1\x7e\xff\xc1\xb1\xc8\x2a\xdc\x23\x9c\xd3\xdf\x5d\x56\xe6\xe5\x77\x28\x70\xce\xe2\x30\x0d\xcc\x48\xd7\x88\x84\x71\x2f\x65\x5a\x58\x12\x52\xc5\xdc\xf2\xa4\xe4\x7d\xae\xfa\x70\x07\x4b\xe2\x10\xcb\xd8\x9f\xd7\xbb\xf1\x2c\x65\x49\xac\x91\x5c\x6c\x54\xd2\xbc\x81\x76\x5c\xce\xec\x3b\xa6\x60\x06\x79\x23\xca\xad\xcc\x49\x0b\x39\x4b\x18\xc7\x7c\xc4\x9d\x2c\xda\x81\x9c\x9a\xb3\x04\x22\xc4\x4c\x5a\x99\x17\x5b\xf0\x90\xd5\xee\x77\xc7\xb5\x0b\xd2\xec\x11\x03\xed\xe7\x38\x4b\x59\x42\xce\xe6\xf1\x38\xfc\x24\x02\x3f\xea\x17\x27\x64\xca\x1c\x3b\xde\xa8\x78\x69\x53\xa3\x2a\x0c\x91\x28\x9e\x63\x4b\xfc\x3b\x88\x54\xce\x58\xac\x82\x9e\xec\x7d\xbd\x7c\xda\x7f\x44\xfe\xd6\x18\x67\x68\xb1\xdc\x56\x85\xe9\x4c\xb5\xbc\x94\x7d\x93\x70\x52\x52\xa4\x87\x5f\xbe\xe7\x2d\xac\xaf\x67\xef\x99\xa9\x94\x45\x23\x21\x5b\x07\x0d\x3e\x83\x57\xe3\x4c\x04\x31\xa1\xe8\x5e\xaa\xd9\xb4\x14\x91\x14\x8e\x56\xff\x56\x96\x5f\x89\x83\x38\x13\x2c\x42\x10\xa2\x63\x66\x00\xe3\x22\xb3\x68\x36\xcd\xd0\x5a\x9c\x09\xa1\x85\xcb\xa6\xed\x8f\x23\x65\x04\xce\x84\x36\x48\x2f\x71\xa8\x4c\x6e\x3f\x07\xa7\x6a\x76\x35\x0d\x2c\xf0\x09\x95\x56\x3a\x3e\xf1\xc9\x04\xcc\x22\x4a\x9f\xdc\x48\x0d\x9d\xd5\xd0\xff\x0e\x09\xbe\xc6\xfb\xea\x85\x20\x21\xde\x06\xf6\xae\xe1\xb7\xf8\x2e\xce\x54\x4c\xfc\x69\x6d\xe5\xe8\x60\x50\x2c\x6a\xde\x07\xe2\x01\x8c\xa6\xe6\x34\x8f\xf3\x33\x26\x00\x8e\x01\x5f\xbe\x40\xbd\x81\xda\xad\xbd\x6e\x81\x24\x22\xde\x73\xee\x08\x53\x5c\x58\x17\x58\x59\x14\x85\x63\x90\xf0\x4f\xaa\x2c\xc7\x45\x69\xc4\xe7\x3f\xec\x04\x4c\x47\x74\x8f\xf7\xff\xf5\x8f\xfe\xa7\x98\xd0\x0c\x84\xa5\xb8\x95\xa3\xce\x29\xb9\x5e\x88\xf6\x21\xf8\xce\x5c\x9a\xfa\xab\xb7\xc1\xb4\xa0\xd0\xcb\xf6\x28\xeb\x56\xee\xbc\xd1\xe9\x5b\xb3\x04\xfa\x6a\xa5\x19\xa2\x9c\x33\x0d\x11\xe2\xfd\x68\x4b\x6d\xaa\x42\x9d\x3e\xeb\xc1\x53\x61\x26\x00\x7c\x0d\xa8\x41\x76\xa9\x3a\xe9\x7c\x49\x16\xe1\xa2\x66\x2f\xc1\x58\x15\xf5\x59\x05\x02\xc5\xad\xcb\x6e\x7f\x2c\xdb\x5e\x5e\x8e\x33\x08\x63\x92\x7c\xe8\xe6\x25\x95\x9e\x95\x2f\x8b\xa6\xf9\x86\x58\xe3\xeb\xd7\x0e\x89\x40\xd2\xb2\xdd\x48\x86\x8c\x33\x48\x29\xe8\xdb\x59\x43\x8b\xa9\x41\xc0\x83\xc0\xc6\x5e\x84\xd8\x4d\x92\x93\x7a\x03\x7f\x5b\x3c\x88\x03\xe9\x92\x55\x3b\x79\x9a\xae\x00\xdc\xa3\x5e\x1f\xf2\x12\x16\xd6\x82\x6e\x2f\xa8\xcb\x70\x1e\x38\x4b\xb3\x21\xda\xea\x19\x5e\xa0\x6b\x66\xb6\xdf\xbc\xba\xa9\x76\x7b\xca\x0d\x38\xc9\x8b\xc6\x47\x12\xca\xbe\xbf\xe6\x94\x3e\xc8\x6d\xeb\xb4\x9c\x2e\x04\x05\xdc\x01\x61\x06\x96\x8a\xc4\xdf\x07\x74\xdc\x85\x7b\x4d\x22\x81\x09\x9b\x83\xb3\xf5\x8f\x43\xe9\x36\xe7\x89\x89\x51\x20\xfd\x4a\x96\x6f\x24\x9b\x7a\x0b\xed\x75\xe5\x98\x42\x26\xb0\x3c\xce\xd3\x34\x45\xc9\x44\x14\xb3\x24\x99\xda\xe5\x69\x9c\x7f\x9a\x5e\x38\xd5\x94\x4f\x83\xf6\xf7\x74\x95\xec\xcc\x1b\x5c\x03\xdb\xb1\x1f\xfc\xf5\x29\x59\x92\x60\xb0\x6c\xb5\xbb\xfb\xc7\xd5\xae\x3f\xd8\x6a\x62\x9c\x31\xe6\x9b\xfc\x90\xeb\xcc\x55\x18\xba\x4a\xd6\xab\x53\x5d\x12\xad\xe7\xb0\x92\x73\xae\x25\x3e\xbf\xab\xa2\xd8\xd4\xf9\xa1\x17\x4b\xe0\x5c\x44\x09\xd6\xfc\x9e\xca\x5c\x57\x75\x39\x7b\x0a\x11\xa5\x26\xf2\xaa\x07\x06\x7e\x23\xfc\x3d\x9a\x0d\x82\x10\x41\x36\x04\x4b\x5b\x98\x4f\x15\x61\x12\x95\x0c\xb2\xb8\xbb\x91\x4b\xcb\x05\xb0\x0c\xbc\x4b\xdb\xb4\xe4\xf2\xad\xca\xb6\xce\x7b\x8b\x9a\xcb\x48\x20\xe4\xcf\x0f\xe5\xa2\x34\x4b\x59\x14\x5f\x8a\xce\x5c\x77\x65\x19\x02\x46\x46\xe2\x0a\xa3\x6a\x0d\xce\xb5\x09\x35\x69\x19\xdb\x6e\x27\x3a\x27\x9c\xc4\xb9\x09\x08\xfb\xf4\x22\x0f\x70\x9b\xdb\x75\xf3\xd4\xcb\x08\x70\x6e\xc2\x14\xc1\x7c\xff\xb5\x18\x14\x30\x38\x37\x89\x40\x36\x15\x4a\xc7\x90\xa0\xd5\x45\x40\x16\x37\x32\x91\x81\x5f\x63\xae\xe1\x7d\xb4\x1a\x72\x48\x08\x9d\x71\xac\xab\x43\x85\xb3\x74\xf1\x2e\xf3\x62\x64\xeb\x70\x60\x81\xdb\x79\xba\xeb\xc8\x02\xb6\xa0\xab\xd2\x34\xbb\x6a\x44\xeb\xca\x39\x28\xad\x94\xcf\xec\xd4\x9f\x7b\x5d\x19\x18\x17\xb6\x73\x6e\x83\x00\xcb\xc6\x8f\xa8\x9f\x88\xcc\x13\xd8\xd9\x54\xc3\xb7\x6b\xe3\xcc\xc2\x50\x31\x3a\x31\xf3\xb9\xd5\x69\x32\x0e\x25\x2f\xac\xcd\x0b\x9a\x06\xde\x6f\xe8\xbb\x5a\x69\xd3\x21\x78\x8c\x2b\xc7\xe3\x4c\x5d\x85\x8b\x40\xd0\xfb\xc3\xa4\xcb\x20\xd3\x3f\xeb\x24\x09\x94\xa0\x11\x69\xe8\x08\x36\x7c\x1b\x58\x02\x43\xf9\x09\xf3\x5c\xa9\xea\x62\x41\xb9\x3b\x28\x8c\xe3\x34\x1d\x59\x11\x4b\xaa\xc6\x05\x33\xb8\x18\x22\x94\x06\xb3\x98\x8b\xfb\xfb\xa7\x25\x52\x2b\xec\x97\x4f\xcf\x8f\xab\xe7\xed\xee\xe9\x71\x35\xf4\xb2\x18\x9e\x58\xbd\x43\xfd\x7a\x6a\xde\xbe\x3c\xc2\xa5\x68\xa8\x3b\x3e\x4a\x29\x6c\x20\x8d\xd9\xc9\x66\xa8\x72\x18\x6f\xf6\x22\xb2\xc4\x2d\x8e\x72\xd4\x75\xe3\x02\xea\xd7\x27\x28\xbc\xb5\x28\xe2\x58\x6b\xb7\x51\xfc\xca\xdb\xb2\xfb\xaa\xa7\x8f\x1c\xa7\x01\x86\x03\x9c\xa8\xf7\xe2\xf4\x3d\x65\xe7\xec\x60\xce\x30\x83\x20\x8d\xd9\xc8\xcf\xb9\x2b\x25\xe2\x8c\xa1\x91\x70\x0b\xe5\x5b\xbe\x21\xd1\x96\xb1\x49\x26\x62\x43\x98\x6b\xfd\x2a\x8b\x02\xca\x17\x70\x10\x31\x39\x56\xda\x70\x7d\x93\x80\xa3\x5f\xf6\x8c\x58\x69\x9f\x8c\x99\x3d\x4d\x92\x84\xdc\x99\x81\x5b\x28\x8a\x1f\x65\xde\x36\xeb\xd2\x56\xf5\x61\x4c\x09\xd5\xf5\x93\x08\xb9\x78\x84\x53\x5d\x4d\x6e\x29\x49\x09\xa3\x9b\x37\xf8\x19\x9c\xdf\x6b\x44\x9a\x10\xe5\x7b\x23\x27\x94\x76\x5c\xf0\x80\xe8\x1c\xb1\x7c\xd0\x05\x84\xcd\x0d\xf4\xeb\x98\xe0\x2a\x0b\xc7\x6e\x96\xaf\x81\x70\x34\x64\xff\xaf\xfe\xc2\xec\xbe\x44\x67\x8d\xfa\x88\xb8\xb7\xec\xbf\x3a\xb9\x22\x8b\xa3\x90\xb0\xde\xb9\x06\x8c\xb3\x79\x38\xa8\xc8\x78\x22\xfc\x13\x50\x7c\xe9\xaa\xcf\x26\x0b\x29\xb9\x4d\xc6\x2f\x6c\xf9\x2a\xcb\x12\x8a\x29\x46\x79\x48\x52\x08\x09\xa4\x07\xd2\x9d\xad\xfe\x6c\x5a\x59\x34\x57\x9f\x7f\xe6\x17\x08\x21\xb8\x50\x69\x84\xf8\x29\x0f\x11\xbf\xd4\x8d\x11\x9c\xdb\x87\xad\x67\x6a\x59\x5c\x20\x1e\x85\x66\xe6\x0d\x80\x59\x7f\xd5\xae\xfb\x76\x1c\x95\x48\x50\x6d\xee\xed\x53\x41\xfd\x08\x23\x82\x51\x2e\x94\x49\x30\xa4\xac\x6a\x90\x6f\xcb\xaa\x7a\xcb\x27\xf4\x5e\x5c\x28\x10\x01\x09\xf8\x41\x8d\xb5\xa1\x7b\xbf\x2c\x9e\xdf\xff\x85\x02\x2a\x0b\xfa\x9f\xff\xfe\xab\x18\xac\xd0\x61\x1a\xd2\xbe\xd5\x40\xfd\x8e\x8f\x3c\xa8\x55\x76\xcd\xc2\xe9\x6c\x16\xd0\xc2\xd3\x47\xb9\x01\xa8\x9f\xe1\x3d\x87\x0f\xdf\xc5\x44\x1c\x59\x5c\x54\xf5\x15\x21\xe5\xbb\xc4\x11\x96\x8a\x5c\xad\x76\xfd\x51\x32\x16\xcc\x2d\xf0\xd7\x3d\x5b\xb5\x6b\x84\x44\x21\xff\xe2\xbf\x91\xf0\x07\x3f\xb8\xd9\x77\x09\x29\x20\xa6\x63\x5a\x6c\xd6\x39\xcc\x57\x98\xa5\xf8\xd6\x1f\x12\x56\xc4\x82\x34\xd5\x3b\x63\xec\xc7\xf1\x8c\xa2\x1a\x17\x36\xa3\xd0\xce\x28\xcc\x2b\xac\xe1\x6a\x6c\x34\xf4\xb5\x2d\xbe\xd8\xad\xfb\x34\x16\xa6\x42\x38\xd3\x57\xb7\x2d\x0b\xe2\x00\x3f\x93\xcd\xfd\xe3\xfe\xe9\x50\xe6\xa6\x2a\x0a\xe9\x2d\x80\x2c\x48\x88\x5f\x9f\xf4\x95\x6b\x30\x39\xae\x9d\xae\x60\xe1\x76\x24\x92\xe3\x0f\x48\x83\xd4\xd9\x95\x18\x05\x81\xb2\x69\xcf\x20\x50\xb2\x80\x11\x46\xea\x05\x5a\xc7\x22\x3f\x48\xfa\xf0\x2c\xc8\x44\x26\x46\x9f\x88\xd3\xb7\x75\x26\xcc\x18\x98\x3d\x20\x81\x66\x8e\x58\x16\x48\x22\xa6\x1a\x66\xe6\xd9\x91\xcf\x02\x1d\x47\x13\xab\xeb\x64\xf2\xb6\xaa\x9f\x41\x57\x97\x00\x96\x59\x98\x92\x1f\x49\x2e\x68\xf5\x01\xe6\xb1\x6a\xe5\xc8\x96\xcb\x42\x10\xe0\x18\x23\xf5\x0a\x1d\x90\xfc\x1d\xa8\x64\xb3\xb9\xa9\xea\xd5\xe1\x58\x54\x9f\x30\xfd\xf6\xfd\x3e\x90\x85\x36\xc6\x77\xea\x22\xe5\x54\xef\x76\x55\x55\x6f\xb3\x80\x56\x16\x09\x95\x58\x8f\x89\x94\xcd\x97\x51\x8e\x4c\x80\xf1\x44\xe4\x7f\x27\x51\x05\x62\xac\xda\x02\x18\xbf\x0f\x9e\x1c\xbc\x6a\xfc\x77\x06\x6d\xff\xfa\x5f\xfe\x02\xc0\x40\x3b\x93\xf8\xfc\x97\x96\x45\x36\x75\x3c\xd4\xed\xbe\x38\xbd\x15\xfd\x3e\x94\xc5\x41\x8a\x98\x97\x1f\x8f\xf7\x4f\xcb\x3f\x57\xd7\x23\xb6\x50\x9e\xc5\x11\x31\xe2\xe5\xba\x5a\x7d\x51\x10\xe5\x59\x9c\x5a\x5c\x74\xfb\x05\x68\x0b\xed\x35\x61\x33\xcf\x55\x07\xf3\x2c\x09\x02\xa4\xae\xfa\xef\xa7\x1f\xfb\xab\xd5\x6e\xff\xb0\x7e\x5c\xed\xaf\x9f\x96\x3f\x1e\x56\x8f\xbb\xfd\x66\xe1\xc9\x0e\x79\x96\x44\x06\x33\xe2\xcf\xf0\xf2\x8c\xe9\xf0\xd9\xa0\xa7\x69\xa0\x46\x56\xe2\x78\x99\xc8\x52\x63\xd1\x82\xf4\x70\x9f\x3f\xe1\x73\xba\xc7\x67\x4c\xc6\xb1\xb3\x27\x3c\x58\x7c\x5d\xb6\x15\x3a\x6c\x94\xb2\x3e\x3f\xe5\x98\xce\x10\x8a\x35\xf8\x88\xc5\x7c\xc0\xfb\xa9\xcf\x03\x43\x0a\x14\xe5\xcb\xd2\x31\x96\xde\xca\xfe\x1e\x79\x6a\x42\x3b\x10\x11\x4a\xd3\x37\xa8\x94\xa8\x8e\x5f\xc0\x6d\x8b\x1b\x59\xb7\x6b\x17\xb5\xf5\xbd\x84\x0a\xb1\xe8\xd0\xef\x4b\x2b\x59\x17\x9f\x57\x79\x3d\x0c\x42\x16\x69\xac\xd9\xf6\x3d\xe2\xbe\x41\x49\x24\xf9\x5a\xca\xa2\xaa\x73\xc2\x78\x7d\x6b\xad\x66\x32\x25\x95\xeb\x63\x4d\x81\xae\x6e\xe5\x6b\x96\xf2\xf8\x0c\xb2\xb3\x26\xfc\x89\x25\x8b\xd0\x70\xda\xe5\x50\xef\xaf\x64\x93\xeb\xbe\xc5\x66\x43\x88\x63\x7b\x84\x12\x05\x70\xa6\x43\xab\x53\x4b\x60\x64\x94\xbd\xc6\xa2\xea\x9b\x4b\x7c\x4e\x3c\x03\x15\x63\x04\x72\x51\x38\x1d\x1b\xa9\x5b\x17\x99\x98\x87\x64\x2e\xfc\xf5\x27\xd2\x41\xe4\xa0\xe3\xf7\xf0\x0e\xc5\xe9\xd8\x13\x36\x50\x0f\x19\x44\x29\x86\xfa\xd5\xff\xfc\xde\x55\xc1\xef\x99\xbf\x29\xc3\x38\xc3\xa2\x0b\xdb\x19\xc6\x68\xe1\x38\xff\xbd\xef\x20\xad\xed\x5e\xe8\xf5\x62\xf9\xe5\x58\x4d\x94\x46\xf7\xd5\x0b\x25\xd2\xd6\xcd\x46\x7e\x76\x9e\x97\xe7\x71\x1c\x3c\x6b\x19\x9a\x00\xe3\xb1\x5b\x40\x37\x87\xea\xd4\xfe\x66\xda\xdf\x9d\x22\xd2\x4a\x7b\x02\x3f\x30\x3d\x69\xa4\xbf\x9d\xc8\x64\xd9\x58\x63\x61\xd1\xdd\x08\x82\x33\x7c\x07\x08\x31\xd7\xaa\x4e\x9f\x17\xe2\x4e\x7f\x85\xf1\xa2\x9a\x66\x77\xba\x38\x0c\x71\x3b\xdf\xe5\x87\xca\xdb\x3e\xdf\xd8\x24\x32\x4e\x88\xd4\xa6\x2a\xcc\x20\x85\x30\x99\x45\x32\x09\x6c\x14\x8e\x85\x24\x26\xc1\x1f\xd7\x29\x4d\x93\x98\x80\x39\xa8\xc7\xf4\xad\x16\x2f\x97\x2c\xa3\x88\xce\x83\xfc\xbd\x95\x65\x2b\xc9\x28\xd8\x4c\x04\x51\xb8\x64\x8a\xa1\x1f\xb6\x58\x3f\xaf\x36\xfe\x47\xce\xc2\xc8\x29\x09\x5c\xb5\x7a\xd5\xbe\x7e\x61\x7a\xe0\x92\x8b\x2c\xf4\xd2\xde\x98\xf1\xf1\x5b\xa0\x77\xad\xa4\x10\x01\xea\x5a\x55\x47\x28\xa7\x49\x35\x99\x05\x1a\xe7\xe6\x55\xde\x2e\x1a\x98\xc5\xc7\x2f\x57\xf0\xc8\x2c\x89\x13\x35\x72\x0e\xb6\x47\xf9\x51\xf6\x42\xef\xff\x31\xb9\xc1\x8c\xc7\xca\x78\xc0\xe5\xe1\xd8\xc2\x3e\x8c\xff\x98\x9e\x8d\xcb\x88\x64\x70\x50\xac\xd8\x9b\xea\xd3\xe7\x54\x89\x51\x69\x5f\x7e\x95\x1b\x89\xc5\x5d\xbe\x91\x13\x8f\x5f\xd3\x6f\xe5\x73\x80\xa3\x5f\x56\xa5\xb2\x0c\xa3\x95\x14\xa6\x47\xb6\x8b\xbc\xfd\x9c\xde\x90\x4e\x0d\x6e\x5b\x07\x2c\x64\x73\x42\xeb\xd3\x60\x93\xd4\xca\x20\x65\x15\x7a\x30\x54\xeb\xd3\x6b\x26\xcf\x26\x95\x36\x04\x87\x96\xc6\x5c\xc1\x85\x1d\x56\x9a\x28\x41\x47\xc0\x83\xc3\xcd\x50\x30\x20\x8d\x0a\x59\xe6\x11\x64\x98\x19\xed\xec\xc1\x22\x6f\xda\x51\x97\x0c\x01\x1d\x45\xfe\xf2\x8a\x5a\xad\x97\x98\x89\xcf\xf9\x69\xf3\x55\x4d\x02\x4f\xf0\xcb\xba\xa9\x61\xba\xc0\xff\xbf\xad\x17\xa0\x19\x7a\x20\x5e\x6b\x63\x52\xaa\x7a\x99\x33\x42\x7c\x3d\x8d\x0a\xfb\x3a\x4e\x9d\xdb\x5c\x13\x31\xc9\x39\xed\x8e\xb3\xeb\xbd\x0a\x92\x08\xfd\xa4\xb1\x89\xe3\x9a\x42\x1e\x29\x2a\xa5\x6d\x5e\xab\xd3\x79\xd1\x7e\xae\x42\x95\xc5\x63\x66\x9e\xfc\xb7\x9b\xa1\xbe\x3a\x7b\xf2\xef\x78\x36\xa9\xd0\x70\x4b\x9e\x3a\x06\x57\xba\xdd\x8f\x02\x20\x7f\xf8\x0e\xae\x50\x0a\x11\xf8\xc4\x9c\xd9\x53\x66\x5e\xa8\x82\xe6\x2a\x92\x81\x17\x11\x58\xca\xda\xf8\xea\xff\x53\x5f\xd2\xcd\x55\xa4\x14\x82\x4b\x28\x4e\xb9\xfd\xab\x20\xb6\x8a\x34\x71\xe1\xa0\xa1\x79\x93\x17\xc4\x1f\x32\x18\xea\xe9\x58\x6c\x88\xfd\xeb\x4b\x45\x65\x6f\x7c\x9e\xc1\xf8\xfb\x4b\x40\x8a\x12\x87\x07\xf9\x86\x79\xbf\x26\x57\x2e\xd4\xd4\x17\x24\xa8\x38\xa6\xc2\x56\x0f\x54\xcb\xab\xf2\xc9\x4e\x8a\xf3\xb9\x8a\x65\x8a\x0a\x06\x9d\xed\x66\x8b\xea\x63\x5f\x20\x8a\xcd\xb7\x2a\x91\xc9\x7e\x9f\x1a\xf1\xc9\x71\x15\x03\x11\x8f\x82\x2b\x2a\xcc\x95\x6f\x49\xd2\x14\x97\xc9\xfb\xea\xa5\xf7\xd2\xd7\x2e\x48\xfc\xc5\x85\x98\x8d\x5c\xc2\x01\x4d\x17\x1c\x39\x7a\xb9\x25\x34\x8d\x97\xd8\x3b\x63\x82\xfb\x03\x45\x2c\x9c\x0c\xef\xee\x75\x44\xbb\x3b\x13\x4f\x98\x4e\xa8\x44\x03\xce\xd8\xe5\x66\xb9\xea\x55\x74\xb8\x4a\x2c\x51\xe7\x78\x2a\xda\x6e\x7d\xb8\x86\x43\xa5\xcf\x64\x4c\x55\xca\x03\x1c\x22\x82\xce\x74\x0e\xee\xf9\x5e\xda\x03\x5d\x3a\x2b\xb2\x84\xfa\x01\x9a\x66\x54\xd9\x72\xe1\x73\x4b\x41\xf8\x5a\x59\x17\x4e\xa3\x3a\x1f\xd7\xcc\x78\x80\xb6\x65\xe7\xee\x53\x95\x17\xe1\x21\xa7\xeb\xa6\x62\x90\x11\xaa\x15\x39\xb5\x6e\xaa\x7a\x4a\x93\x3b\xbd\x24\x4f\x48\xc4\xa8\xdb\x07\x9d\x33\xfa\xa3\xc9\xcb\x97\x6b\x40\x27\x6d\x5e\x42\xaa\x44\x1a\xc7\x54\x70\x7b\xcc\x6b\x58\xd8\x21\xa1\xa5\x32\xc6\xb1\x6a\xab\xee\xd6\x52\x3e\x5b\x2e\x32\x03\x48\x2b\xf1\xf0\xb9\x30\xef\x9d\x0d\x31\x29\xb8\x51\x32\x50\x94\xd0\x7a\xad\x3e\x10\xc8\x4a\x39\xd0\xb3\xc8\x5a\x25\x59\x80\x80\x18\x87\x8f\xa2\x0a\x3b\x6b\xa1\x7b\xd7\x93\x70\x9d\x92\x90\x61\x15\x2b\x20\x43\xcc\x1f\x5f\xe2\x57\x4a\x05\x21\x02\xc5\x68\xac\xf2\xf2\x05\xd5\x98\xfc\xe1\x2a\x0a\x30\x6b\xfd\x9f\x95\xca\x27\x91\x4d\xa5\x23\x2d\x48\xe7\xf6\xe6\x04\xc5\x70\x41\xcd\x59\xea\x26\xd3\x1e\xc9\x47\xae\x57\xbb\x91\x35\xa9\x34\xd7\xe8\xc9\xd8\xfc\x37\x98\xd5\xef\x19\xe2\x55\x19\x49\xcc\x3e\xad\x9c\xa5\x9a\x94\x71\xa9\xb5\xc6\x8b\x9f\x10\x46\xea\xfc\x00\x81\x91\x36\xf4\x24\x45\xa4\xf2\x36\x9d\x22\x36\x4e\x11\x93\xd9\xca\xc6\xb1\xe7\x4c\x3d\x35\x1d\xc4\x14\x68\x75\xbe\xd0\xb8\x48\x4d\x87\x89\x41\x32\x83\xa3\xfc\x7c\x3a\xb5\xff\x29\xf5\xdb\xd1\xeb\x3a\x72\x1d\xa5\xa1\x0f\x48\x53\x24\x17\x0c\xa1\xb7\xbf\x30\x57\x4d\xef\x59\x47\x5a\x2b\x97\x0e\x7d\xac\x8c\x2c\x14\x82\xdc\x7b\xd7\x77\xfc\x25\xeb\x58\x98\xc0\x6b\x08\x3a\x72\x7d\xe7\xe0\xcb\x03\xac\x8f\xb6\xb9\x93\xcd\xeb\xa2\x34\x8f\xd5\x90\xf5\xd3\x49\xa4\x6d\xd0\xab\x39\x62\x80\x68\x4e\x1c\xc3\x75\xa2\xb8\xc7\xb5\x3f\xc8\xdf\x9d\xe3\x78\x76\x1b\xd1\x89\xb2\x2e\x4e\x27\xcd\xe7\x0f\xef\x99\xeb\x34\x12\x08\xa7\x92\xc6\x6c\x89\x50\xc3\x9c\x57\x52\xe6\x3a\x4d\x34\x73\x6b\xc4\xdd\x9f\xb7\x4f\x68\x07\xfa\xa6\x34\x4a\xa9\xd2\xce\x4c\x74\x15\xbe\x5d\x4c\x75\xaa\x42\x84\x6c\x78\xb6\x30\x73\xd1\x96\x39\x9f\x69\x9c\x7a\x6a\xb3\xe7\xe5\x81\x8e\x09\xd6\x8f\x2b\xfc\x28\x91\xa5\x79\xa2\x31\xc6\x31\x20\xa4\x37\xa3\x22\x7c\xe1\x7b\xb1\xd8\xdb\xa1\x2e\x91\x33\xbb\x40\x26\xfc\x70\x10\x0f\xc2\x7e\x59\x1d\x0e\xa7\x32\x6f\x7f\x94\xa7\x06\x26\x6a\x37\x5c\x73\xd0\xca\x19\xae\xbb\xbc\x3d\x15\x32\xaf\x61\xef\xcc\x64\x36\x3b\xb3\x48\x59\x68\x7b\x3d\xc8\x6b\x68\xda\xba\xfa\x92\xcb\xd0\x82\x91\x13\x46\xf6\xed\x6d\xf5\xde\xfa\xf2\xb8\x59\x3f\x49\xa2\xff\x4e\xe0\xf2\xb7\x2e\x4e\x9d\x5b\xd8\xed\x04\x78\x8b\x44\x64\xd8\xcc\xed\x67\x9d\xc5\x31\xaa\x52\x3e\x03\x31\x3b\x23\x94\x6e\x8c\x07\xd0\x59\x12\xe0\x38\x6e\xab\x42\xd6\xd7\x92\xd2\x16\x43\x5e\xe9\xff\x09\x60\xa4\x33\xee\x45\x30\xc9\xd3\xc0\xe0\xe7\x79\xb0\x42\x7f\x84\xc5\x15\xf8\x6a\xf5\xd8\xdf\x91\xa1\x7a\x3b\x75\xfa\xdc\x9d\x8a\xfc\xd8\x8c\x2d\x37\x9f\x5c\xd4\x32\x0e\x04\xeb\x73\x32\x76\x9c\x86\xd5\x32\x0d\xc1\xe3\x9c\xc6\xeb\xa7\x96\x96\xf2\x06\x6d\xae\xdf\xa0\x6d\x1e\x4f\xbe\x88\x5f\x77\x7b\x3b\xf2\x65\xaf\x9e\x7f\xf8\xdf\x74\x14\x23\x2d\xa8\xaa\x14\x26\x0c\x1b\x3f\xc3\x2e\x11\x03\x9d\xf7\x7f\x03\x7f\x3a\x9d\x20\x28\x7e\x44\xc8\x3e\xbe\x69\xad\x35\x0a\xc8\xab\x3a\x37\x2f\x30\x78\x4d\xc8\xaa\x37\xae\xe4\xd6\x1a\xa2\x94\x88\x79\x7e\xe7\x87\xd3\xc1\xa3\x90\x71\x0f\xf2\x7d\x8c\x21\x00\x20\x2e\x3b\xab\xbe\xfa\x40\x83\x25\x10\xee\x4d\x21\xdb\x95\xac\xfb\x06\x13\x44\x01\x92\xb9\x18\xdc\x81\x2f\xf1\xb5\xce\x8c\x7d\x13\xb0\x48\xa8\x41\xa5\x63\xbc\x60\x9b\x30\x0e\x30\x1b\x96\x37\x0b\xaf\xf1\x61\x9c\xe4\xee\x64\x72\x9b\x28\x83\xac\x5b\x42\x1e\xe5\x01\x3c\xec\xf9\x5c\x66\xd2\xc4\x92\x32\xe7\x63\x9b\x69\xf1\xf2\x05\x8c\x6c\x62\xad\x48\x5a\x09\x85\xbc\x8b\xc2\x43\xae\xfc\x87\x6c\x92\x34\x91\xae\x5c\xe8\xb1\xea\xeb\x1b\x31\x09\x3e\x59\x2e\x4d\x62\x74\x40\x1b\x75\x43\x2a\xf8\x13\x7b\xc6\x57\x8e\x9b\x04\x52\xeb\x44\x76\xfe\x31\x83\x30\x98\x34\xa6\x3a\xac\xee\xc0\x5e\xaf\x61\x7a\xbf\xa9\x21\x5c\xf9\x31\x7f\x79\xf9\x1c\x68\xaa\xbb\x06\x8e\xf0\x04\xc7\x6b\xb9\x68\xc9\x4e\x38\xbb\x95\x99\xd4\x18\xed\x82\x5b\x68\xcb\xe0\x9c\x9d\xae\x7a\xe7\x0c\x54\x93\x82\x20\xea\x02\x5c\x5b\xfe\x38\xcd\xc8\xa6\xba\x0e\x16\xe3\xb8\x57\x0b\xa2\x56\x42\x8e\x68\x0f\xb3\x30\x2c\x35\x21\xf7\x4a\xec\x24\x1a\xb4\xa9\x2b\x43\x91\xee\x11\xa1\xd3\x5f\xad\x24\x83\xb9\x62\x98\x25\xef\x5a\xa1\xee\xca\xd9\x62\xb3\xf3\xdb\xb9\x61\x96\x21\xde\xf9\xd7\xdd\xe2\x7e\x35\x1b\xe5\xce\x4b\x96\x5e\xab\xec\xef\x91\x07\x19\x2e\x35\x90\xdd\x49\x0c\xe9\xb7\xb9\xfd\x1a\xcd\x34\x22\x4b\x50\x96\xd0\x19\x4f\xf7\x79\xe3\x6b\x4a\xc6\x4f\x25\x54\x48\x95\xec\x87\xbc\xfd\x55\xd5\x6f\xb3\x1a\xc6\xd9\x93\x64\x69\x92\xe9\xb1\x6a\xfd\x14\x9d\x3e\xbd\x81\xcc\x70\xd5\x17\x81\xee\x3e\xaa\x31\x25\x31\x37\x32\x64\x08\xd0\x43\x96\xa0\xef\x7d\x01\x23\x53\x85\x13\x7e\xd7\x19\x36\xff\x37\xda\x70\x8d\xd4\xca\x5b\x77\x57\x52\xbf\x0d\xf0\x7c\xd7\xae\xb8\x0d\x7c\x8e\xf5\xe3\x6f\x07\x34\x46\x56\xb1\x51\x82\xe3\xb2\x8d\xb5\x53\x55\x45\x72\x7a\xae\x4d\x47\x12\xd7\xad\x0f\xc8\x1f\x08\xa9\xdd\xb7\xc4\x54\xda\xa1\x4e\x9f\x67\x2b\xaa\x8d\x4e\x35\xba\x37\x98\x95\xee\xa3\x3e\xa6\x3f\xde\x91\x07\x61\x48\x17\x97\x5d\xfc\xc8\x26\x44\x4f\x46\x67\x06\xd3\xd7\x4f\xcf\xd7\xab\xe7\xfd\xf5\xd3\xe3\xea\xe2\x93\x8d\x6b\xae\xce\x6f\x7a\x46\x5b\x26\xb3\x31\x6d\xea\xa1\x72\x98\x90\xde\xc1\x16\xd3\xe5\xf6\xef\xed\xbf\xc6\x84\xf4\x2d\x52\x92\xec\x19\x3a\x97\xbd\x2a\x47\xcf\x33\x33\xb8\xbb\x4d\x02\x73\xc4\x48\x43\x25\xd1\x15\xee\xf7\xfe\xbf\xa2\x9d\x9f\xef\x05\x90\x70\xcf\xc6\x3f\x29\x04\x9c\x77\x93\x31\x82\xff\x5e\x3b\xef\x7b\x0b\x60\x66\x19\x36\x03\x3a\x44\xef\xe9\x76\xf5\xb8\xda\xae\xb7\xfe\x15\x80\xa1\xbc\xa8\x0f\xf6\xf6\x3a\xd1\xc3\xa9\x6d\xc0\x25\x1b\x50\x27\xe4\xac\x8e\x69\x4b\xa6\x13\xc3\x72\x40\x86\x07\x67\x72\x79\x32\xe8\xd9\xed\xd8\x2c\xc2\x34\x71\x0d\xfa\x7d\xfb\x5a\x8f\x8c\xf7\x0b\x2f\xc1\x6a\x21\x07\x12\x06\x1c\xc5\x0d\xd4\x13\xbe\x56\xea\x09\x41\x1c\xa0\x1b\x88\x33\x73\xdb\xc2\xd1\x47\x81\x21\x48\x23\xce\x47\x8c\xce\xd7\x50\x74\xfb\xeb\xd5\xbc\x44\x1d\x82\xd4\x60\x3a\xb2\x84\x0f\xbf\xcb\x15\xd5\xcb\xc4\x6f\x81\x20\xe3\x9c\xd2\xf7\xef\x3b\x90\x87\x67\x20\x60\xa5\xbf\x56\x98\x85\x18\x4a\x41\xbc\xd7\x88\x57\x9a\x43\xe8\xc2\x94\x64\x3d\xcf\xae\x1c\x2a\x92\x59\x74\x78\x90\xfa\x7c\xdd\x92\xef\x0c\x1a\x1c\xf1\xf4\xa2\x6d\xa1\x34\xb2\x6c\x17\xe5\xe0\x2b\x4c\x67\xd7\xb0\x68\x42\x14\xb1\x58\x8d\xb0\x53\x9e\xd1\xd2\x37\x27\x54\xe8\x31\x8d\xc8\xf8\x46\x21\x89\x04\xa6\xe7\x3d\xec\x76\xa4\x31\xe1\x33\x87\xc8\xa6\x01\x79\xd4\x1b\xd2\xb8\xbc\xc1\x0c\xda\xe0\xcc\x43\x9c\x51\xc2\x17\xd7\xbd\x2f\xc9\xf0\x59\x88\x08\x92\x58\xa2\x87\xee\x6c\x33\xaa\xca\x78\x46\x58\x05\x18\x04\x0e\xf9\xf3\x26\x69\x8c\x56\x9c\xad\x6a\x95\x1b\x2c\x21\xfc\xe2\x9f\x40\x22\x53\x4c\x03\x5d\x7b\x06\xd7\xfd\x33\x34\xa7\xe2\x02\x7d\x16\xa4\x5a\x12\x2d\x43\x2f\xe5\xd0\x90\x80\xde\xd4\xad\x07\x16\x91\xbb\x8c\xd6\x61\xe7\xc0\xc8\xf2\x73\xe2\xea\x00\x53\x26\x4e\xfc\xb8\x1f\x73\x4d\x03\x1b\xa6\xbe\xd9\x90\xa2\xcf\x2d\xb4\x8b\xe3\xb1\xc8\x75\xf7\x3e\xa7\xd7\x10\x51\x8a\xe0\x8c\xdb\x5a\x7e\xaa\xd3\xef\xb1\x1d\x0e\x22\x8e\x31\xa1\xb9\xfa\x7d\xac\xea\x76\x2c\xf9\xcc\x21\x0b\x22\xac\x24\xa8\xab\x02\x70\x36\xce\xce\x9b\x45\x80\xd9\x83\xee\x83\x7a\xae\xaa\x2f\xc9\xdb\xbf\xb7\x54\x42\x66\xc3\x2c\x76\xe2\xe1\x23\x10\xb0\x6b\x55\x11\x85\x99\x91\x23\x9b\x0a\x6c\x50\xc5\xc5\x37\xa7\x80\x7e\x04\xc5\x6f\xce\x56\xbe\x80\x8e\xc8\x41\xc1\x8f\x7b\x40\xfa\x81\x4e\x08\xb2\x2a\x9b\xcf\x52\x7f\xd9\x27\xa7\x37\xa9\x95\x94\xd0\x9b\x66\x83\xcd\x7b\xf6\x82\x10\x91\x16\xec\x7a\xf9\x44\x04\xb4\xfe\x8a\x20\x23\x4c\xa2\x54\x47\x28\xef\xc1\xbc\xf4\xdf\xaa\xef\x60\x53\x4b\xc8\x89\x6e\x3a\x78\x41\x6a\xf2\xb6\xe6\x7c\x2f\x60\x75\x88\x28\x9e\x5e\xb7\xef\xc1\x53\x0f\xf6\x67\xb3\x94\x19\x3e\x2f\x71\x81\xf3\xe8\x9f\xf1\xbf\xfa\xce\x36\xc4\x59\xb2\x78\x5c\x6c\x16\x3b\x4f\xb2\x61\x83\x50\x21\x52\xb1\x1d\xac\x61\x1b\x26\xc2\xab\x77\xdd\x57\x0d\xf8\xcc\xeb\x64\xc8\x6c\x08\x4c\x3a\xc9\x5a\xd4\x51\xc7\x08\xbe\x83\x33\xf8\x13\x45\x36\x8e\x27\x00\x9e\xfc\xe5\xb5\x5d\x5b\x4f\x6f\x37\x0d\x9d\xb8\x63\x62\x4e\xd2\xd3\xb8\xbb\x79\x5c\x3a\x21\x56\x3a\x7b\xef\x1e\xca\x97\xde\x99\xb2\xb1\xa5\x01\x75\xa2\x7e\xf8\x09\x42\x37\xa1\xcf\xbf\x67\x9b\xc4\x12\x59\x05\x3a\xdf\x0f\x7e\x56\x1e\x55\x65\xd3\x58\xa3\x67\x44\xa4\x97\xdb\xbc\x18\x90\xc2\x36\x4d\x52\xad\xa7\x0e\xdb\x5c\xd0\x64\xb4\x90\x5a\x16\xc4\xe8\x8d\xdd\xe7\x07\x35\x7e\x5d\x96\xc5\x24\xb4\xd8\xb6\xd3\x9f\x25\x51\x5f\xfe\x63\xb3\x98\x1a\x02\x7f\xeb\xf3\xb2\x0c\x78\x42\x8e\x13\x06\x77\x5d\xac\xe2\x7b\xe3\xd3\xf2\x2c\xc6\xfd\xe6\x3a\x2f\xcc\x04\x3f\x69\x45\x22\xb1\x76\x25\x77\x38\xe2\xee\x6d\x4e\x15\xbc\xb9\xcd\x02\x52\xf1\x30\xe0\x2c\xe6\xb1\x7b\x6d\xb3\x88\x78\x7e\x36\xcf\x4f\x0f\xab\xdd\xdd\xea\xc7\x76\xff\xf3\xe9\xc7\xf2\x6e\xf5\x3c\xd6\xc3\xee\xfa\x29\xa4\x34\x23\x28\x1c\x8c\x60\x70\x36\xd3\x09\x86\x4a\xf2\xce\xcd\x91\xc7\xe6\x34\x87\x0e\x5b\x19\x31\x1c\xb4\x01\x00\x35\x7a\x03\x4a\x26\xde\x3e\x42\x9f\x7e\xfa\xf9\x5a\xcd\x18\xde\xbe\x9f\x94\x0f\xb2\xfc\xbc\xbc\xd1\x58\xad\xe3\x68\x98\x1a\x77\x55\x31\x29\x4b\xb2\xda\x92\xc0\xba\x44\x4f\xc0\x63\x36\x31\x5e\x34\xab\x1a\x70\x07\x98\x84\xa4\x25\x28\x57\x37\xb0\x8c\x59\x23\x05\xda\xc7\x34\x97\x6f\xa1\xc4\x0c\xcd\xa2\x34\x0f\xb2\xb9\xe0\x8a\x5a\x03\x99\xf1\x0a\x63\xcb\xb1\x5a\xd5\xac\x9f\x0d\x43\x0c\xa8\xe5\xcd\x42\x6b\x38\xb6\x60\xae\x75\x55\x1f\xcf\x31\x2c\x59\x1b\x49\x18\xe3\x15\xa6\x4a\xab\xe7\xfc\x22\x11\x04\xa9\xc5\xdc\x3f\xfc\x06\x4d\xec\x7d\xbe\x41\x45\x08\x1a\xba\x5a\xfd\x8f\xd7\xc4\x17\x41\x60\x14\xe2\xb4\xf7\xfb\xbc\x21\xfd\x9b\x75\xf9\x5c\xcd\x5e\xb2\x08\x42\x1e\x45\x2e\x5d\xb2\x3f\xca\xba\xfd\x8c\xf6\x13\x15\x5b\x11\x24\x46\xa7\xcc\xab\x72\x6b\x59\x14\xe7\x96\x2a\x11\xa4\x41\xa6\x3d\x26\x16\xb7\x98\xab\xcf\xb5\x99\xf7\x49\x02\x0c\x0d\x2c\xcc\xbf\x4f\xa6\x33\x61\x06\xe4\xc2\xd7\xa2\xf7\xfe\x18\x86\xb4\xf6\x50\xba\x20\xf8\xc2\xdf\x58\x2a\x53\xac\x76\xbe\x85\x76\xe9\x55\x90\x9d\x2f\x20\x02\xc6\x14\x86\x8c\xa0\xb3\x54\x47\x93\x49\x04\x4c\x48\x34\xd9\x97\x8b\xdd\x16\xea\xf7\xbc\x67\xdf\x76\x5e\xcb\x8c\x88\x50\x04\x3c\x65\x76\x4a\x5f\x41\x05\xa6\xe7\x0a\x22\x44\xc0\x39\x07\xe9\xb8\xbb\x47\x88\xb3\xae\x01\x22\x57\xb5\xbf\xfb\xfd\x54\xe7\x2f\x79\x7f\x4b\x3c\x33\x8e\x0e\x53\xe5\x2d\xb1\xde\xdf\x3f\x3c\x7e\x31\xcd\x7d\x6f\x30\x58\x3f\xb1\x5d\x3c\xfe\xb9\xfa\xef\xed\xd3\xfd\x8f\x5d\x2f\xf3\x2a\x02\x11\xa5\xb8\x34\xee\x5e\xe1\x2a\x6f\xdb\x3a\xef\x6f\x40\xf0\x24\x1d\x6f\x14\x17\xa5\x30\xba\xae\x12\x5f\xd4\x4b\x25\x8b\x07\x0f\x6d\x16\x41\x16\x90\xba\x39\x26\x26\x8e\x27\x02\x66\x4e\x06\x37\x0b\x23\xee\x60\x99\xff\x75\xca\xf5\x1b\xba\x83\xe8\xb2\x4d\x17\x38\x11\x64\x31\x09\x9a\x12\x13\xdf\xa9\x6c\x3f\x2f\xc5\xe8\xdd\x01\x32\x0e\xd0\x93\xda\xf7\x9b\x56\x45\x2f\xd6\xc5\x07\x66\xbd\x35\x47\x90\x34\x89\x81\x6e\xea\xaa\xb2\x7f\x7c\xc9\x0d\xfb\xbe\x60\x6c\xaf\x3b\x4f\xc6\x2d\xd9\x8f\xf7\xa3\xa2\x99\x8b\xb8\x83\x7e\x51\x14\x81\x36\x14\xc6\xa7\x42\xf1\x21\xee\xec\x9b\x81\xb4\x64\xee\x37\xdd\x32\x32\x19\x37\x13\x53\xe2\x41\x96\xe5\x49\x16\x23\x45\x4d\x11\x00\x8b\xf1\x49\x14\x96\x04\xbd\x41\x79\x7e\xde\x01\xc4\x6c\x70\xc3\x97\xb2\x36\x37\x55\xbd\xd0\xc8\xb8\x66\xc8\x79\x3c\x1b\x6f\x11\x81\x8d\x53\x5c\x13\xe1\xb7\x7e\xed\xdc\x89\x01\x48\x2b\xc2\x20\x03\x44\xf7\x3e\x00\x82\x51\x9a\x55\xd9\xf6\xe2\x2b\x22\x0c\x14\xc9\x80\x6c\xf2\xdf\x48\xab\x3d\xfc\x6e\x31\x22\x79\x7b\xbd\xfc\xbb\x94\x5a\xfe\x48\x13\x21\xba\xe7\x74\x34\x0f\x79\xe9\xeb\xd7\xef\xf3\xc3\x0c\x3b\x21\xc2\xc0\x2a\x24\x74\x97\xa3\x30\xd5\xb4\x47\x18\x85\x29\x0c\xdc\x54\x3d\xfd\xac\x08\x43\x26\xd0\x6a\x5d\x3e\x3e\xba\x11\x1d\xe1\xd1\xce\xc4\x06\xdc\x61\x51\x18\x13\x19\x6c\x5b\x1d\x09\x79\xd5\xa3\xe9\xbb\x46\x8b\xa4\x4d\x98\x58\x86\x16\xad\x04\x2c\x73\xae\x67\xb7\x15\x31\x89\xfc\x13\xd2\x98\x6d\x6e\xc0\xad\x41\xe7\xbf\xf5\x30\x92\x0c\xa5\x14\x0a\xd9\x50\xb8\x74\xff\x1e\x86\xfe\x92\xb1\x66\x11\x1f\xea\xc5\xcc\x58\x93\x5a\x84\xb1\xc9\x62\x4f\xcd\xbb\xb7\xd5\xa9\xc6\x70\xd0\xea\x7f\x51\xb3\x60\x72\x91\x24\x91\xdc\x7d\xd6\x57\xb2\x7c\x7b\xc6\x02\xcd\xe9\xf4\x0a\x13\xc6\x02\x40\xd4\xe2\x28\x20\x86\x10\x26\x7f\x3d\x16\xb3\x01\x95\xe4\xc5\x94\xa6\x27\xe1\x09\xc3\x01\xdc\x8f\x6c\x73\x1e\x85\xe7\x02\x1a\x22\xe4\x40\x8c\xfd\xff\x59\x29\xca\x66\xf9\x0b\x09\x9b\xe1\x48\x2b\x92\x97\x1e\x0a\xcb\x47\x7b\xc9\x25\x53\x43\x84\x99\x10\x98\x9d\xdc\x22\x3f\xf5\xd7\xaa\x6c\x11\x4a\x1b\x67\x24\x19\xa4\x8b\xbc\x84\x87\x41\x1d\x7a\xd2\x4d\x05\x0a\xf3\xbf\xf8\x2c\x7f\x9c\x05\x4d\xfc\xc7\x25\x40\xe7\x78\x56\x29\x25\xd2\xa1\x22\xdd\x13\xda\xcf\x3e\x8f\xc9\x23\xf5\x90\x8e\xb3\xe3\xa6\xa3\x14\x1d\x8b\x0d\xfc\x1e\x24\x2e\x45\xa8\x59\x82\x1e\xfa\x7b\xd5\xfa\xa0\xdc\xf4\xe5\x68\x49\xd0\x03\x87\x95\xef\x96\x28\x0f\x08\x18\x2f\x55\xa1\xd6\xc6\xa4\x0e\xb4\x94\x17\xa4\xa2\x3e\x9d\x79\x1a\x04\x02\x0a\x51\x55\xc7\xb1\x89\x37\x93\x0a\x11\x11\x1a\x45\x46\x95\x34\x58\x7b\x83\x6c\x8b\xa8\xa3\x36\x4e\x33\x89\xd0\x58\x9e\x38\x42\x8b\xab\xd3\x27\xad\x03\xae\x09\x62\x85\x04\x58\x4a\x96\x6f\x48\x15\xd8\x37\x24\x44\xeb\xfc\xe2\x10\x10\x83\x3c\x9b\x08\x41\x13\x41\xc6\xe6\x79\x45\x75\x69\xd1\xaf\xd5\xea\xcf\xfd\xd5\xd3\xe3\x0f\x6f\x39\x85\x36\xce\xa4\x07\xc6\x54\x6e\x43\xe8\xdb\x6c\xe2\x15\x26\xdd\x32\x7c\xf5\xe9\x93\x9c\xe3\xb7\x10\x05\xa9\x41\x55\x8e\x75\xa9\x61\xe2\x52\x8a\x28\xd0\x09\xae\x9a\xb9\x86\xc9\xef\xa1\x63\x16\x27\xa5\x8b\xa9\xc5\xec\xbb\x18\x49\x62\x3c\x27\x75\xc8\x51\x78\xe6\xac\xd1\x14\x85\x96\x14\x1d\x8f\xf2\x73\xff\x81\x10\xac\xe9\x1c\x8f\xa2\xd4\x00\xc1\x3b\x0b\x8b\xe9\xdc\x93\x6e\x07\xc4\x91\xef\xa4\x48\x95\x77\x58\x7c\xa4\xb8\x93\xcd\xeb\xde\x9d\xcb\xf7\x8b\x25\x89\x61\x41\x69\xd6\xcb\xa7\x19\xd4\x5e\x44\x31\x64\xe4\xf7\x55\xa7\xba\x81\xe5\x38\x7e\xe5\xbb\x24\x81\x44\xb7\xcd\xa9\x8b\x7d\x65\xbf\x16\x51\xc2\x52\xac\xa3\x73\xd5\xb9\xeb\x52\x57\xb3\xe2\x11\x11\x25\xc2\xb8\x24\x1d\xae\x75\x5f\x49\x9f\x44\x94\x26\xa4\xa0\xf9\xef\x93\x79\x81\x5f\xf9\x79\xfa\xa0\xae\x9b\x40\x04\xfc\xf6\x54\xd7\xa7\x99\x14\xbf\x88\x58\x68\x11\x62\x72\xf8\xa4\xfd\xf0\xeb\xe6\x13\x31\xc3\x10\x7a\x7b\x9d\xbf\xe4\x9b\x53\xd1\x4c\x5f\xb5\x48\x23\x18\xc8\x47\xdc\x1c\x5b\x2f\x1e\xae\xb1\xd2\x0d\x87\xe6\x5c\x58\x44\x44\x82\x25\xe0\x8a\xf7\x90\x5f\x69\x65\x5e\x7a\x2d\x3f\x31\x7b\x06\xa1\xad\xa1\xb9\xfe\x73\xf7\xf7\xd0\xb5\x22\xca\x42\x85\x9f\xe5\xa6\x3a\xfc\xdf\xf0\x7a\xb2\x34\x42\x96\x4f\x47\xde\x70\x5f\xbd\x9c\x5d\xb2\x23\x19\x68\xcc\x79\xa8\xaa\x3c\x35\x43\x8c\x42\x44\x92\xa5\x6a\x30\x1c\xab\xba\xed\x17\x95\xd9\xf2\x1c\x49\x1e\x63\xfc\x56\x3b\xe4\xc2\xe7\x38\xfb\x23\x22\x15\xc9\x80\x3b\x10\x5f\xcf\x3d\x31\x4f\xf2\x89\x08\x58\x82\x81\x18\x53\xed\x48\x42\xe7\xa6\xaa\xaf\xc1\x52\xa8\x76\xf6\xa6\x40\x65\xa8\x3e\xb3\xf7\xa4\x84\x67\xac\x8d\xc8\x2a\x8e\x35\x8b\x0d\xc5\x5f\x7c\xee\xd2\xb7\x6a\xe3\x44\xcf\x3b\xab\xd1\x91\x36\x41\x67\x80\xed\x40\x1e\x16\xa5\xf1\xab\xc8\xf4\x65\x5a\x13\xf1\xb4\x0f\x88\xdd\xd4\xd5\xff\x41\xe9\x43\x1f\x36\x7f\x39\xd5\xae\x20\x73\xbe\x0a\x58\x30\x6a\x0c\x81\xfe\x82\x0a\x3a\x57\x2f\x20\xe2\x20\x25\x8b\xe9\xae\x32\x0e\xea\x73\x91\xfe\x7b\x3a\x93\xe2\x80\xf5\xbe\xdd\xb6\x85\xc3\xd8\x3c\x8d\x03\x15\x07\xae\xed\x88\x02\xb3\xa3\x40\x85\x88\x03\x9d\xc6\x84\xa3\x93\x4d\x93\xbf\x90\x07\x3a\xbf\xcd\xc9\xa8\xc4\x61\xa2\x71\x89\xfe\x78\x95\x05\x3c\xc8\xdf\xfe\x54\xa1\x09\xb1\x6e\x13\x8b\xb8\x91\x49\x6a\xdb\x93\xa3\x88\x38\x72\xe5\x39\x9e\xbf\x71\x5d\xda\x0a\x59\x35\xa1\x85\xba\x79\x06\x69\x3e\xfb\xae\x8c\x67\x0e\xda\xfe\xe7\x61\x83\xe1\xc1\xe9\x1d\x44\xd6\x60\x50\xf6\xf1\xe9\x71\xff\x73\xb5\xdd\xad\xae\xf7\xbb\xd5\xe2\x61\xdf\xcb\x42\x6d\xef\x16\xcf\x2b\x7f\xba\x58\x6a\xb4\xc2\x36\x95\xe7\x9c\x9a\x9e\x2d\x09\x59\xe4\x79\x72\xf2\xf2\x65\x83\xf5\xe3\x37\xe8\x21\xf8\x53\x24\x96\x59\x42\xa1\x3f\xc8\x7c\x2c\x06\x29\xe2\x34\x60\x28\xa7\x61\xc0\xca\x53\xd1\x5e\x9d\x3e\x1f\xab\x8f\xc9\x0b\x48\x23\x2a\x4c\xc7\x54\xe5\x5a\x57\xab\xdf\xf9\x88\xd6\x40\xc4\xa9\xe4\x18\x1d\x78\x3e\xa9\xfc\x6d\xac\x9d\x2e\x62\xc6\x48\x0b\x7b\x59\xd5\xf5\xe9\x48\x04\x00\xc3\xa5\x79\x42\x81\xc5\x6f\x9e\x9d\xcb\x58\x09\x47\x71\x42\x81\x41\xc7\x6b\x71\x95\x1f\x9b\xbe\x93\x4e\x71\xf5\x38\xca\x4f\x4f\x17\xd8\xfd\x98\x61\x22\x62\xb1\x5d\x5d\x4d\xee\x49\xa4\x54\xdf\xe4\x8b\x7f\xb6\x5f\xd8\x24\x44\x2c\x98\xc5\x5c\xc8\xfe\x45\x1e\x54\x31\x86\x04\x9c\xc3\xf2\x89\x58\x08\x89\x91\x02\x9b\x97\xe6\x0a\x1a\x2a\x15\xfc\x2e\x7a\x27\xe2\x0c\x02\x1c\x1a\x27\xa9\x4a\x9f\xf4\x40\x2c\x20\x62\x19\x2a\xac\x11\xed\x36\xc7\x87\xbc\x84\x5a\x16\xb4\x7b\x8d\xd6\xbd\x58\x26\x86\xe4\x31\x10\x59\x0f\xf9\x50\x78\x29\x62\xa9\x81\xb9\x14\x74\xbf\x94\x7f\xcb\xd7\x26\x62\x95\xa4\x98\x69\xc0\x92\x31\x6f\xf9\xd6\x9d\xb7\x8a\xd0\x84\x26\x7f\x39\xef\x46\xc4\x3a\xca\xc4\xc0\xb5\x76\x55\x55\x85\x63\xe8\xfd\xe3\x2c\x0c\xe1\x2b\xb0\x42\xc4\x26\xb6\x58\x10\xe2\x03\xe1\x5b\x84\x60\xf9\x87\x31\xd6\x78\x30\x8b\xf7\xcd\x11\x47\xfe\xfd\xba\x02\x21\x39\xc4\x4b\x52\x60\x7d\x83\x72\x5c\x87\x7d\xc6\xc3\x8e\x21\xe1\x98\x22\x7b\x2a\xdb\xaa\xa8\x5e\x3e\xcf\xee\x6b\x93\xfb\x86\x8c\x61\x06\xa6\x5b\x0c\xfa\x68\xa1\x6b\xb3\x9a\x21\x5e\xb2\xf7\xd4\xb1\x32\x69\x16\xb5\x4a\x02\x46\x55\x67\xbd\x1e\xab\xdb\x06\x1f\x4f\x87\xe9\xa7\x9e\x04\x32\x34\x13\x99\xdf\x39\xef\xe1\xf0\x24\x49\xa0\x12\x0c\xbc\x51\x24\x48\x16\x3f\xf3\xba\x3d\xc9\x62\xee\x57\x26\x61\xaa\x82\x9e\x9c\x6e\xe0\x92\xec\x9b\x19\x69\x20\xc1\x6f\xd0\xe7\xeb\xc7\x7c\x47\x1e\x81\xcb\xa6\xdf\x85\x57\xb9\xe9\x45\x11\x44\x12\x09\xa2\x0d\xba\x3a\xe5\x1e\xad\x2e\x92\x08\xc0\x7a\x7c\x68\x10\x5d\x9d\xc6\x7c\x7a\x22\x89\x53\x07\x1f\xf6\x23\xa7\x69\xe4\x7c\x73\x16\xfa\xa2\x98\x2b\x24\x16\xff\x42\x47\x25\x92\x24\x54\xe0\xf9\x77\xfa\xd2\xd9\xf6\x75\x60\x72\x3a\x37\x6a\x49\xa2\x43\x97\x67\xd4\xf0\xb3\xca\xcd\xb3\xec\x27\x61\x92\xaa\x14\x09\x5e\xd6\xeb\xcd\x19\xbf\x2e\x49\x75\x86\xc2\x1d\xbf\x56\x6b\x7f\x04\x0f\x03\x74\x48\x37\xcf\xeb\x9f\x8b\xdd\x0a\x3d\x82\xed\x6e\xf1\xbc\xdb\x5f\x2f\x76\xab\xbe\x57\x4c\xfa\x9e\x5e\x2b\xb4\xdc\xc8\xcf\xd9\xb9\x85\xca\x08\x70\x56\x51\x3d\x0e\xb1\x64\xfd\xe1\xd5\xe4\xbe\x4b\x37\x84\x53\xb5\x52\x91\x64\x19\x27\x21\x4b\xe2\x8c\xba\x1f\x0c\x8d\x44\x32\x91\x0c\x41\x1e\xdc\x05\xcf\x3d\xa9\x94\xc4\x23\x87\xc9\x03\xd9\x38\xb1\x34\x59\xf4\xcc\x6b\x7f\xab\xa8\x46\x4c\xe6\x8f\x0a\xc8\x84\x7b\x84\xf6\xf3\x54\x7c\xc5\x54\x5e\x3a\xd3\xd9\x38\x4f\xa2\x22\xce\x68\xbb\xd6\x55\x69\xf6\x1f\xfe\x83\x41\x47\x32\x1f\xa6\xa6\x12\x0a\xa9\x37\xd4\xe9\xf3\xb6\xaa\x7c\x89\xa8\x48\x74\x18\xa2\x9d\x4a\x03\x31\xc7\x75\xcc\x21\x8d\xd3\x6b\xeb\x38\x55\x2e\x72\xb4\xac\xcc\x5c\x3d\xd0\x77\xe2\x89\x4f\xd5\x3f\x83\x85\x1a\x4a\xed\x44\x79\xce\x3f\x90\xee\x3c\x14\x47\xc7\xfc\x79\x50\x3d\x52\xd4\x37\xeb\x00\xb1\x2c\x87\x4f\xaa\x46\x98\x5e\xcc\x44\x21\x91\xf0\xbf\x9e\xa6\x62\x8a\x22\x31\x46\x22\x88\xbc\xfd\x00\xf9\x36\x42\x24\x8a\xc4\x58\x65\x28\x6a\xa9\x4f\x75\xde\x4e\xbf\x4f\x08\xe3\xa8\x27\xb9\x58\xf7\x42\x29\xce\xec\xbb\x83\x7a\x66\x8b\x26\x90\x24\x52\x79\xb8\x7b\xf5\x9e\x1b\xa8\xef\xa5\x7b\x1f\x9f\xeb\xeb\xf3\x6e\x52\x02\xca\x60\xe5\x2b\xbd\x86\x07\xd0\xaf\x57\xbb\xe5\xf9\x30\x63\x02\x10\x7a\x98\xa2\xff\xde\x29\x73\x74\xba\x48\x7c\x2c\x12\x1b\xc6\x88\x87\x5a\x18\xf3\x08\x1f\x84\xa4\xd7\xf3\x0a\xce\xc9\x48\x5b\xe0\xf8\xe2\xde\xab\x16\x16\x33\x74\x66\xd7\x6a\xb0\xe8\x25\x6f\x1e\x30\x9b\x33\xad\xd4\xa3\x4e\x69\x10\x40\x3a\x2e\xc2\xa6\xc4\xe8\x00\xb0\x15\x69\xc0\x24\x16\xa7\x90\xc1\xbf\x81\xfa\x17\xe4\xbc\x6f\x94\x80\xa5\xb1\x79\xf3\x0c\x2f\xa7\x62\x86\x72\x11\x69\x08\x26\xe3\xde\x4b\x72\x35\x83\xfe\xd8\x28\xa2\xa0\x97\x13\x79\x46\xc7\xd2\x35\xc5\x09\xa0\x45\xe2\xe1\x10\x93\x34\xb0\x48\x13\xce\xf1\xaa\xdd\x7a\x7d\x25\xcd\xaf\xbc\x7d\xed\xbe\x98\x5e\x92\xef\x52\x72\x69\xfa\x46\xbb\xd3\x68\x62\x13\x93\x45\x37\xdd\x7c\xe5\x8c\x48\xb9\x64\x38\x74\xab\xf6\x75\x3f\x71\xca\x52\xa1\x62\x84\xb3\x6d\x5e\xab\xb6\x5a\x18\x73\x81\xe8\x57\xa4\x59\xc4\x70\xc9\x77\x46\xf5\xe2\xe1\xe9\xc7\xe3\xce\x9f\x25\xe3\x31\xb2\x55\x56\xef\x50\xab\xdc\x3c\x0e\xac\x0f\xc2\xf7\x10\x36\x23\x79\x7e\x64\xc7\x7c\x3a\x62\x36\x76\xa4\x95\x15\xfa\xa7\x90\x4c\x62\x0d\x41\x79\x3a\x2c\xab\x03\xc6\x9f\xfc\x65\x94\x25\x8f\x04\x25\xe8\xb6\x14\xf1\x84\xba\x39\xe3\xf4\xa5\x3a\xb2\x3c\xea\xa3\x2d\xab\xb2\xad\x3f\xff\xaa\x6a\xd9\x1f\x69\xd3\x04\x7a\x3d\xdb\x4d\x55\x15\x23\x66\x34\xd7\xc7\x30\xf2\xfe\x9e\xd1\xfb\x7b\xa8\xcc\xb4\x94\xd7\xf7\xb2\x0a\x03\x11\x4a\xea\xb7\xb9\x00\x8f\x48\x21\x48\xb0\x88\x63\x71\x44\x25\xc5\x66\xbd\xb8\xfa\xa3\x6f\x22\x9b\xb7\x80\x17\xa9\x3f\x9f\xe1\x38\x0b\x62\xa4\x90\x66\x18\x23\xea\xfc\x85\x4d\x91\x97\xa8\x1c\x7b\x5f\xcd\xd8\x8f\x44\x0a\xdc\x8c\x0a\x61\xba\x35\xbf\xbb\xd7\xfe\x2c\x82\xd0\xbe\x18\x4f\x21\xb8\x51\xdb\x53\x16\xfc\x33\x8c\xcf\xab\xee\xf4\xed\xc1\x10\xa0\x75\x55\xeb\x22\x05\x49\xe0\x04\x52\x34\xaa\xea\xd6\x56\x45\x5e\x7d\x79\x74\x15\x65\xa9\x5f\xe1\x30\xd2\xd3\xbc\xe6\xc7\x45\x69\x1c\x05\x58\x5e\x9c\xe1\xd7\x1f\x5d\xc4\x90\xa0\x0c\x06\x52\x0a\x03\xf5\x8c\xf0\x7f\x36\x73\x2d\x8f\x30\xd8\xbb\x94\xcd\xeb\xb0\x3d\xb1\x50\x41\xd4\x4b\x68\x0f\x96\x4b\x73\x7e\xfe\xb3\x28\xe4\x58\x94\x92\x37\xcd\x09\xba\xf5\xec\x62\x36\x59\xb0\xc8\x08\xc4\xae\x1e\xf2\x92\xd4\x68\xfc\x35\xe3\x8c\xa3\x21\x77\xb8\xf9\xf1\x78\xbd\x7e\xbc\xdd\x2f\x7f\x3c\x3f\xaf\x1e\x77\xfb\xeb\x1f\xcf\x8b\x51\x26\x90\xc5\xca\xa0\xc3\x5c\x93\x7a\xc8\xf4\xf4\x49\x24\x32\x86\x7c\x7a\xdb\x33\x4e\x2b\x4b\x2c\x09\xb1\x50\xfa\xec\x62\x15\xa1\x60\x29\xcf\x70\x55\x78\xf8\xef\xed\x8f\xcd\xea\x79\xf7\xf4\xe7\xaa\xbf\x01\x16\x42\x64\x7a\x00\xe7\x0e\xe4\xa1\x59\xf7\x5b\x38\xe3\x82\xfc\xd6\x1a\x1a\xc7\x02\x77\x75\xaa\xfb\x0a\x1e\xc1\x38\x08\xc4\x38\x48\xad\xeb\x13\x78\x92\xc1\x6e\xb1\xfd\x07\x76\x5f\x79\xc6\x0d\xc1\x04\x8f\x30\xa5\x82\x5e\xe8\xe0\x1a\x33\x21\x23\x8c\x07\x92\xdb\xf3\xe5\xdb\x9d\x56\x88\x0a\x96\x71\xa3\xdc\xfd\x76\x46\xd7\x39\x09\x08\xc1\x32\x4b\x8a\x8c\xc4\x6a\xb6\xd8\xec\xd7\x8f\xfb\x1f\xdb\x6b\x7f\x49\x19\x5a\x45\xa4\x4a\x87\x9c\xe8\x72\x7c\x43\x9c\xa2\xda\xcc\x6a\xb7\xbc\x8b\xcd\xcf\x7e\x18\x54\x98\x68\x17\xb8\xe8\xdc\xd2\x70\x76\x39\xa5\x39\xfa\xc9\xcb\xd5\xf3\x6e\x7d\xb3\xf6\x62\xf0\x82\xe9\x24\x83\x70\x5c\xec\x83\xe2\xed\xf3\x94\x3b\xd3\x4c\x71\x35\xaa\x68\x85\x25\x14\xc5\xd5\xe9\xcb\x42\xe6\xbb\x67\xc4\xcd\xf5\x90\xb7\xaf\x75\x5e\x6c\x3f\xaa\x1e\x66\xc0\x8c\x54\x09\xf3\x71\x71\x0f\x2f\x3a\x1b\xa6\x64\xc6\x66\xe8\x08\x51\x30\xe0\x19\xf4\xa7\x2e\xfe\x3a\xda\x34\xbb\x17\x08\x58\xca\xfb\xf0\xd8\x16\xea\xf7\xe1\xc3\x83\x38\xc2\x18\xba\xc7\x4f\x38\xba\xa3\xe9\x5d\x80\x8e\x31\x4c\xfb\xbc\x5a\x3f\x5c\xfd\x78\xde\x2e\xae\xee\x57\xfd\x09\x40\x61\xba\x94\x14\x20\x76\x83\x92\xba\xef\x60\x59\x40\x04\x08\xb8\xf8\x53\xf9\xe7\x50\xd5\xc5\x92\xf1\x9f\xcb\xcf\x60\x99\x94\x9e\x8b\xaa\xed\xa9\xf2\x06\xb2\x33\xc1\x83\x90\x39\x44\x6e\xf7\x94\xb7\x45\xa5\x90\x43\xb4\x69\x6b\x99\x97\xdd\x8a\x3b\xd7\xc0\x3d\xb7\x3e\xf1\x00\x88\xbf\xb0\xdb\xfd\x1f\xab\xfa\x20\x8b\x31\xbe\xae\xbf\x96\x25\xe9\x66\x75\x49\xe0\x58\xf0\x90\x11\x5f\xf9\xbe\x05\x79\xf8\x16\xd0\x27\x78\xc4\xe2\x8c\x26\x4b\x9f\x51\x9c\xf5\x88\x45\x82\x15\x69\x88\x7e\xdf\xc8\xa6\x71\x89\x08\xf1\xcf\xec\x5f\xbe\x0b\x64\x38\x42\x6d\x7d\x6a\x5a\x30\x7d\x78\x78\x23\xeb\x36\xd7\xf9\x51\x96\xed\x5f\x15\xe1\xb9\x33\xa5\x32\x45\xeb\xa2\x96\x2d\xec\x5e\xf3\xda\x20\xa5\x89\x7f\x76\x16\x48\x04\x2c\x1d\xe5\xe7\xb6\x95\x6f\x24\xd1\x7d\xd6\x7b\x11\xc1\xf8\xcf\xd7\xb1\xc6\x53\x75\xab\x0a\xb5\xee\xaa\x66\x06\x27\x16\x5c\x44\x04\xe8\xd8\xdc\x2d\xb6\xab\x68\xff\x3c\x38\x93\x5c\x88\xc4\xd5\x3b\x51\xa1\xd3\x1e\x2b\x27\xae\x07\xc3\x9e\x4b\x30\xda\xd3\x0d\x96\x4e\x8a\xb2\xb9\xa9\xab\xde\xe0\xe2\x2a\x93\x88\x78\xed\xde\xf6\xea\xb7\x4b\x22\xcc\xf9\x39\x04\x57\x92\x80\xa9\xdd\x12\x01\x87\xaa\xfe\xdc\xd5\x52\xc3\x03\xb4\x72\xd6\x51\x07\x21\x01\x60\x7f\x6e\x56\x7b\x39\x86\x53\x76\x6d\x31\xe2\x6f\x0e\xa7\xa2\xcd\x17\x5a\x43\xd3\xd0\x6e\x3b\x3f\x07\x37\x89\xab\xda\x5d\xb5\xaf\xce\x40\x9c\x75\x51\x12\x13\x73\xaa\x0c\x23\xb1\xc7\x3d\x73\x7f\x94\xf9\xb8\xa6\xe7\x9f\x61\xe4\x27\x86\x11\x1c\x21\x64\xcf\xa7\x02\x1a\x1f\xeb\xdf\xe2\xd7\x78\xa6\xd0\xe4\xff\xdf\xbf\xfe\xa2\xca\x22\x0e\x83\xe4\x1b\x7a\x8a\xce\xef\xe3\x72\xdc\x18\x83\xb8\x8f\x96\x2a\x8a\x88\x31\xe9\x6b\x18\x0b\x57\x8f\x73\xde\x26\x87\x84\xe1\x72\xd6\xe8\x5a\x1e\x27\x24\x3c\x82\x03\x4b\x10\x02\x70\x8d\xd3\x01\x6d\x81\x53\x31\x73\x59\x38\x40\x66\x9c\xfb\x79\x7f\xff\x73\x0f\x26\x6f\xf7\xc9\xc4\x05\xe5\x36\x53\x48\x3f\xb0\xa7\x5f\x77\xd5\xd5\x67\x0b\xb3\x2e\x2a\x36\xca\xc7\x9a\xf6\x6a\x94\xe2\xe0\x56\x71\x0c\x57\xdd\x57\x2f\x8f\xf0\xd1\x4b\xe0\xcc\x57\xf4\xe9\xe9\x6c\xd4\xaf\x0f\x7f\xad\xe7\x2d\x44\x10\xf3\xb8\xe7\x5a\xda\x9f\x1a\xa8\xf7\xd0\xbe\xee\x75\x0f\xdc\x10\x01\x4b\xf0\xd3\x3b\x62\x14\x06\x69\xbf\x9b\x3e\x54\x26\x42\x46\x39\x00\xb7\x61\x20\xf6\x69\x7a\x85\x24\x30\xb1\xdb\xe1\xaf\xeb\xd3\xcb\xbc\x95\x71\x1d\x4d\xa8\x03\x08\x3f\xe8\xf7\xb8\x89\x67\x2e\x12\x0e\x58\xed\xfa\x2a\x8b\xf6\x19\xde\x41\x16\x84\x4f\x9b\x75\x4b\x03\x12\xd1\x5c\x74\x9b\xcb\x62\x60\x4c\x73\xe1\x89\xaf\x51\x8a\xe9\x6a\x23\xd2\xd0\x52\xd1\x56\x69\xba\x45\x62\xc4\x5a\x2b\x44\x1a\x71\xf4\x8e\xdb\x01\x8f\xf1\x06\xa6\x5b\x39\xcf\xaf\xd8\x22\xe5\x19\x3a\x89\xa6\xdd\xe2\x67\xfa\x9d\x8a\xb2\x10\xa9\xd4\x46\xf4\xd2\x62\xbf\x00\x48\x30\x6d\x6c\x62\x89\xd4\xa4\x48\x2a\x2f\xf3\xfa\x1a\x8a\xfc\x1d\x6a\x12\x03\x2d\xaa\xf2\x32\xcb\xb9\x10\xcc\x31\x68\x1e\xb1\x1e\xd4\xce\x5e\x04\x0f\x2d\x4d\x55\x8a\x2b\xac\x4c\x3e\x66\x00\xfc\x12\xde\xb9\x14\x72\x9a\xff\x7e\x49\x35\x54\x08\x1e\x59\x45\xdb\xb4\xab\x26\x99\xbe\x03\x1e\x07\x58\xc0\x72\xd7\xb9\xab\x7f\xb5\xa0\xcc\x0e\x4d\x98\x0a\x08\xc1\x8d\x2a\xb2\xd7\xb5\xfc\xc8\xcb\x97\xe5\x38\x5c\x2a\xb8\x08\x7b\xe5\x61\xa8\x9b\x5c\x96\x0d\xa9\x92\xa3\xb6\x64\x73\xf5\x39\xbb\x1f\xc1\xa8\x80\x9a\x28\x2c\x3d\x2f\xc6\x74\x0c\x85\x4c\x32\x04\x19\x37\x8f\xf0\x41\x1c\x17\x9b\x91\x68\x40\xd7\x81\x0a\xe9\xda\xb7\x76\xf2\x46\xb3\x20\x46\xce\x18\x7c\xd7\x63\x69\xac\xd9\xec\xc8\x12\xaa\x9a\xe8\xd5\xfa\x77\xd5\xd5\xe9\xf3\x4c\xf8\x7e\x76\x98\x49\x92\xc0\x11\x1c\x11\x76\xa4\x2a\x66\x46\xab\x90\x31\x55\x8a\xae\x64\x5d\xae\xca\xea\xf4\xf2\x3a\x06\x78\x08\x99\x46\x9e\xd3\xd7\x71\x2b\x7c\xdd\xfc\x84\x14\x41\x64\xa7\x65\x00\xfd\xf1\x8a\xa1\x26\xcd\xee\xea\x1f\xe3\xa0\x99\xd0\x59\x98\x38\x84\xe6\xcd\x8c\x49\x49\x08\x13\x10\x11\xd2\xfa\x71\xbd\x5b\x2f\xee\xf7\xab\x87\xf5\x76\xbb\x7e\x7a\xdc\xdf\x2c\x96\xbb\x27\x6f\x96\x0b\x93\x58\x8a\x7c\x4b\x0b\xe7\xb0\x49\xdf\xd4\x0c\x0a\x61\x7a\x6b\x11\xb5\x99\x27\x68\xa1\x0b\xc3\x09\x22\xc5\x25\xe0\xa6\x38\x51\x88\x12\xeb\x7e\xbe\xdf\xaf\x04\x64\x0c\xc7\xa6\x79\xad\x3e\x7a\x26\xc9\xbf\x38\x04\x6c\x1a\xf7\x39\xe7\xfa\xd3\x27\x90\x5d\xb3\xcd\x32\x2f\xec\xf7\x90\x97\xbb\xc3\xcc\x3a\x10\xd6\x84\x48\x9a\x63\x06\x85\xa0\x2f\xc4\x56\x22\x0b\x42\x89\x10\x32\x79\xd8\xaf\xf7\x67\xea\xd7\x44\x16\xa4\x0c\x0d\xab\xbf\x8e\x3f\x9f\x5d\x4d\xb3\x80\xf1\xd4\x01\x63\x7c\x98\xf3\xcb\xab\xce\x02\x03\xf4\x65\x74\x46\xe4\x7d\x5e\xc2\xaf\xba\xf2\xac\xd9\x22\x0b\x80\xaa\x27\x5d\x19\x83\x7c\x91\x4b\x59\x9b\xed\x87\x3c\xfe\x84\x3a\xfa\x2b\xbc\xa3\x3b\x49\xc8\x88\x44\xa8\x7d\xcd\x9b\x83\x2c\x3f\x71\xaf\x6d\xda\xbc\x28\xda\xd7\xe6\x78\x32\xa4\x33\xfd\x91\x97\xfd\xd8\x84\x82\x54\xe6\x6e\x64\xf9\xb2\x93\xe5\xcb\x65\x1a\x5c\x1f\xbc\xff\xa6\x74\x73\xfa\x72\xb3\xd8\x80\x67\xb9\x5a\x56\x25\x5a\x95\x93\xe0\x62\x96\x06\xb1\x75\x61\xc9\xeb\x5c\xc3\xaf\xbc\x9c\x1a\x78\xb3\xf3\xa5\x59\x82\xec\x26\xff\x29\x4b\xd3\x93\xf4\x89\x2c\xd5\x22\x1c\xe6\xd0\x5a\x57\x67\x9d\xc7\x8c\x85\x54\x2c\x7c\x75\xff\x63\xd5\xe3\xd9\x33\x1e\x11\x09\x5b\x03\xe5\x98\xf6\x46\x64\x3c\x26\x66\xe0\x91\xe8\xf8\x8c\xda\x5f\x64\x9c\x85\x8a\xa8\x97\x74\x65\xc0\xec\x4d\xaf\xfe\x24\x32\xae\x12\x24\x5b\xef\x0c\xdc\xc5\x25\x25\x36\xd7\x37\x0b\xad\x55\xbd\x2e\xe6\xfe\x38\x22\xe9\x18\x6d\x4c\xbe\x33\x50\xe9\xe7\xbe\xc1\xba\xb2\x2f\xfc\x4a\xd3\xa7\x96\x3c\x26\x91\xa3\x8b\x42\xe3\x22\x53\x96\x23\x31\x76\xb7\xb8\x0c\x65\x5e\xc9\xac\x97\x4e\xb3\xb8\x87\x33\x23\x9a\x10\x83\x9b\x3d\x00\x7b\xfa\x48\x9a\x13\x26\x7f\x08\x10\x54\x88\xb5\xbb\xf0\x6a\xb5\x21\xd5\xd9\x5c\x57\x8e\x96\xe9\xfc\xf6\x90\x41\xc0\x48\xb2\x70\xfd\xb8\x5c\x6c\xf6\x18\x18\xda\xee\x37\xcf\xab\x7d\x5f\x8e\x21\x32\x10\xe4\xb6\x62\x96\xc5\xf1\x0e\x6f\xa1\x28\x26\x5c\x81\x22\xb3\x31\xe9\x50\xd2\xe6\xbc\xfa\x7d\xc1\xbc\xc9\xac\xee\x6b\xaa\xfa\x4c\xe9\x25\x28\x55\x66\x0d\xe0\xa6\x4b\x7a\x87\x07\x95\x43\xd9\x76\x76\xed\xea\xb7\x86\xe3\x98\x5c\xdd\xd9\x69\x74\x98\x0c\x53\x85\xef\x40\x55\xea\x41\xbe\x41\xb3\xaa\x75\x14\x5c\xe2\xd2\x98\x24\x64\xa3\x60\xb2\xf8\x3b\xbe\x05\x21\x43\x20\x46\x7d\x53\x5d\xcd\xf8\x1e\x85\x0c\xad\x51\x6c\x2a\xe9\x70\x53\x03\xfc\xdf\x58\x36\xe9\xbb\x6f\xdc\x85\xce\x65\x94\x44\x69\x1f\xa8\x3c\xa2\x55\x31\xbb\x52\x94\x86\x5e\x4f\x74\x1c\xe6\x1d\x3e\x22\x19\x31\xa1\xfd\x2a\xd1\x99\x2f\x37\x85\x1c\x97\xa8\x0a\x19\x47\x1a\x13\xe5\xc4\x0e\x94\xff\xd5\x36\x24\xe3\x54\x20\xa4\x4f\xcb\xb2\x73\x11\x7e\xb4\x67\x63\xb6\xbe\x73\x46\x50\x93\xea\x08\xe5\xb2\x3a\x1c\x1d\xc4\xfa\x0f\xdf\xac\x19\x9a\xc9\x7f\x6e\x96\x5b\x2c\xb4\x24\x8e\xfc\xaa\x9e\x78\x38\x32\x91\x01\x73\x8a\x77\x85\x3c\x35\xb0\x94\x5f\x71\xfa\x32\x51\x02\x75\x11\xd6\x8f\x3f\x57\xdb\xdd\xd3\x73\xd4\x37\x18\x25\x1c\xfb\x05\xe9\xba\x8f\x73\x79\xb3\xfb\x4d\x6c\x26\x1d\xcc\x7b\x5d\xde\xa0\x3c\xde\xea\xf7\x51\x96\x0d\xd5\xed\x4e\x09\x07\x84\x4c\x63\x86\x58\xcb\x17\x22\x1e\xa9\xe7\x13\x21\x4d\x04\xe6\x65\xb6\xcb\x71\x69\xab\x90\xa9\x88\x30\x50\x8b\x15\xd9\x63\x2b\x09\x5b\x2c\x22\x58\x5e\x72\xfd\xb3\x33\x2b\xab\x59\x94\x57\x32\xae\x70\x17\xba\xcd\x27\x0c\xff\x5d\x83\x46\xe8\x0f\x31\x94\x8d\x82\x13\x92\x89\x04\xcb\xcc\x87\xdd\xaf\xdb\xf9\x36\xf7\x8b\xdd\xdf\xdb\xf9\x24\x67\x36\x75\x69\xc0\xf5\xe6\x66\x7b\x27\x9b\xd7\xe9\x2b\xe2\x9a\x0b\x12\x59\xf7\x08\xc0\x89\x91\x20\x45\x20\xbd\xb8\x27\x6a\xbe\x9c\x9f\x2e\x82\x33\x2c\xb0\xfa\xaf\x53\xde\x0e\xe2\x23\x42\xca\x40\xfa\x52\xe0\x2d\xc8\x62\xfc\x68\x32\x31\x1e\xf7\x4b\x35\x5b\xbb\xea\x6a\x3b\x1b\x31\x29\x01\x77\xb6\xcd\x3f\x26\xa6\xa3\x94\x9a\x34\x54\xc9\x61\x59\x94\x66\x9b\xbf\x94\x57\x57\x4f\xd7\x95\x3e\x0d\x2b\xc3\x54\xb1\x78\xbe\xbb\x48\x95\x45\x41\xdc\x27\xc5\x31\x7a\xf5\x20\x3f\x7d\x29\xca\x00\x7d\x96\x2a\x13\x22\x1e\x3e\x34\x44\x38\xae\x4a\x03\x98\xf5\x7b\xa8\xde\xbf\x70\x9a\xcd\x2f\x24\x85\x26\x69\x87\x0f\xbf\x72\x9d\x1f\x45\x65\x42\x91\x8c\xeb\x44\xab\x7a\xc4\x48\x3d\x59\x61\xb4\xcc\x90\x58\xcf\x59\xe4\x83\x10\x96\x90\x26\x92\x0a\x7c\xe0\xd8\x6b\x18\x5e\xb8\xa2\x89\xac\xee\x51\xf5\x0f\x30\x3a\x89\x94\x61\xd8\x6f\xbd\xb3\xaf\xc3\x86\x14\x67\x6c\x4e\xaa\x39\x5c\xf8\x20\x6d\x14\x2a\x4a\xbe\x38\xfc\xce\xc4\x07\x93\x96\x29\xed\xd9\x26\x5e\xa0\x6c\x9b\x49\x8e\x53\x5a\x09\x48\x08\xb8\xde\x3c\x44\xcb\xa7\xf5\x63\xff\xbb\x21\x89\x1b\x02\xf4\xe1\x3b\xbb\x95\x87\x01\x27\xa6\x82\x24\x40\xc6\x9c\xdf\xf2\x58\xf5\xbf\xd9\xd4\x4b\x53\xed\x15\xcd\x4f\x38\x1d\xf6\x3e\xb3\x3b\x0b\xc1\xa9\x30\x26\x7b\xf4\x81\xca\xf0\x49\x22\x72\x08\x03\xa8\x50\x50\x26\xcf\x07\xc3\x69\x59\x9a\x4c\x5c\x15\x66\x19\xe2\x9e\x31\xac\xd2\x4d\xce\x1f\xc7\xb9\xd8\xe6\xb0\xd4\xab\x30\x23\x4c\x23\xc2\xca\x9e\x3e\x90\xd1\xb9\x37\x8a\x42\x36\xf8\xf3\x21\x73\x1e\xbd\x8a\x82\xd4\x13\x06\x5f\x24\xdc\xf2\x5d\xe3\x30\x72\x20\xe6\x6e\x0f\x19\x7b\x9f\x2a\xe2\xc4\xc0\x79\x94\x9f\x44\x6e\xd0\xcd\xce\xab\xca\x7c\x9e\xad\x3a\x54\x91\x32\xd2\x78\xa5\xbe\x81\x9e\x6b\xf4\x28\x91\x49\x50\x38\xcc\x02\x6c\xa0\xde\x82\xf6\x57\x8a\x8d\xf0\x50\xfe\x1b\x14\x5b\x3d\x5b\x57\xa5\x92\x34\x43\x2e\x7d\xcc\x00\x38\x7c\xfa\xec\x26\x12\x1b\x12\xf1\x62\xfe\x52\xce\xb2\xac\x2a\x8d\x18\x6e\xbc\xa4\x2d\x9a\xbf\xbc\xb6\x8b\xf3\x79\xa8\xc4\x1f\xc0\x03\x4c\xb7\x8e\x65\x83\x5d\x13\xcb\x02\xcc\xfc\xed\xf7\xad\xac\x51\xc9\x94\x42\xbf\x9e\xa3\x7d\x76\x5b\x3c\x13\xca\xd5\xe2\xfd\x37\xc8\xba\xf8\xfc\xb1\xbd\xde\xca\x02\x65\x06\x30\xe1\xe1\xcf\xcb\x3b\x63\x75\x60\x1a\xb9\x14\xf5\x9f\x5a\x33\xfe\x58\x30\x98\xef\x7a\x95\xcd\xeb\x78\x45\x54\x22\x10\x9e\x59\xd6\x2d\xe0\x9d\x1b\xec\x88\x68\xa6\x37\x2a\x52\x81\x94\x1e\x1e\x6f\x41\x5c\x39\xb3\x3e\x26\x16\x04\xa0\xf9\x05\x39\x6e\xbe\xfd\x85\xac\x8e\x9d\x7c\xca\x66\x4d\x91\xcf\x28\xf0\x8d\x32\x89\x30\xcd\xfb\xdc\x59\x84\xfd\x62\xa2\x64\x1a\x47\x76\x70\x47\xa1\xa6\xe3\xca\x6e\xd1\x1a\x6f\x46\xaa\xdb\x8d\x06\x80\xcb\x2d\x94\xc1\x58\xf5\x20\x9a\xb0\x06\x4f\xfe\xf5\xc7\x83\xc1\xaf\xa2\xb3\xae\x91\xc9\xf0\x06\x9c\x38\x6a\x1f\x11\x9b\xc7\xc6\x94\x8a\x39\x1e\xb3\xd8\xac\xef\x40\xbe\x0f\x43\xaa\xa5\xc4\xca\x9b\x3d\x65\x74\x37\x5f\x5f\xb9\x06\x66\xba\x99\xd8\xcd\xd2\x95\xae\x9c\x66\x73\x18\xf5\x67\xb0\x0c\x61\x9a\xb9\xae\xa2\x69\xae\x54\x99\x98\x40\xe5\xc8\xda\xf8\x46\x6e\xf1\xf4\xe4\xc6\x08\x43\xc4\x0a\x55\x03\x63\xc3\x4f\x19\xcb\x91\x5a\xb7\x17\x36\x73\x44\x92\xdf\x48\x39\x4d\x4f\x0d\x3c\xc6\xdd\xba\xb2\x56\xbf\xca\xbc\xfc\x71\x2c\x2a\x69\x66\xd4\x0e\x42\x81\xb4\xc4\x12\x7c\xfa\x24\xf1\xca\x0b\x89\x76\x65\x03\x8a\x10\x15\x7f\xa7\x80\x73\x7a\x2b\x36\xb0\xa1\x9d\xb9\x24\x08\xf6\x6f\x7e\x94\x6d\xee\xd4\xf3\x7d\x58\x5c\x07\x69\x88\xf6\x40\x73\x2c\xf2\xce\xed\x7c\xfb\x4b\x75\x22\x77\x60\xc4\x0c\x6d\x97\x6e\xbd\xe8\x76\x6e\xc4\xab\xcf\x16\x6e\x1d\xc9\x3e\xcf\x7b\x95\xbb\xf4\xd8\xcc\x76\xd7\x31\x4f\xd1\x4b\xf8\x25\xdf\x61\x82\xf0\xd6\x89\xb0\x42\x7b\x5c\x2e\xd6\x75\x6d\x64\xb7\x3d\xfb\x40\xfc\xe4\x8f\x3b\x26\x0d\x04\x6e\x15\x0f\x4f\x57\x4f\xf7\xfe\x44\x69\x94\x60\x08\x74\x0f\x6e\xd1\x39\xbf\xcb\xea\x94\x73\xeb\x08\x66\x6e\xeb\xea\xa3\x7d\x9d\x94\x65\xeb\x54\x84\xbd\x66\xc1\xa8\x68\x66\xfe\x0d\x68\x96\x26\x88\xda\x3d\xd6\xb0\x5e\x3e\x75\x33\x69\xbc\xe3\x69\x26\x19\x7a\x1a\x07\xf9\xdb\xb1\x92\x8f\xd2\x85\x4d\xdf\xcb\x44\xe8\x5f\x5c\xd5\xd0\x8e\x80\xed\x9a\xd9\x94\x3b\x57\x67\xa6\xe5\xe5\x3a\x70\xc6\x08\xd6\x3e\x40\x82\x7d\x8b\x88\xb3\x70\x28\xb9\xec\xf6\xc5\xf3\x7c\xfe\x42\x23\x39\x14\xad\xfc\xbd\x1e\xc6\x76\x26\xe2\x26\x34\x87\x18\xcd\xe1\xb6\xfe\xdc\x55\x9d\x5f\x53\x00\x72\x6c\xa0\x91\xe3\xfa\x08\x26\xa5\x63\x87\xc4\xa5\xd1\x61\xb7\x1d\x79\x8e\xef\xc4\x65\xe0\x01\x88\xdd\x15\xe3\xbe\xc1\x2a\x5c\x5d\x9b\xaa\x78\xff\x9b\xdf\xa3\xce\xa2\x14\xa1\x23\x12\x89\x0c\xae\x72\x73\x53\xd5\x73\x52\xaf\x73\x67\x99\x9e\x24\xa6\x68\x05\x49\x16\x52\xd6\x70\x9a\x1c\xd1\x19\x8b\x89\x9e\xbe\x9d\x89\x53\x08\x9d\xe9\xc4\x10\x6d\x5e\x5d\x7a\xc2\x4f\x07\xf2\x9a\xdf\xac\x89\xd1\x64\x78\xed\x0f\x85\x04\xcc\xc0\xf4\xd4\xff\xca\x32\x67\xcb\x3e\x4b\x0d\x0f\xa7\x91\xae\x50\x7f\x43\x2a\x4a\x30\x41\x04\x03\xc9\xfb\x25\x4d\x4a\xa1\x55\x12\xf8\x62\xac\xd1\x6e\x3d\xde\x5a\xb5\x62\x29\x0c\x9c\x37\xce\x75\x9b\xde\xbe\x8e\xb5\x63\xfa\x70\x7a\xdc\xdb\x93\xa2\xcc\xf5\xac\x9f\x32\xe1\x00\x87\x18\xc1\xa4\xc7\xe6\x83\xd6\x9a\x21\xcc\x44\x23\x84\xe0\xa4\xdb\x1f\x75\x71\x96\xe1\x58\x68\x6d\x13\xcd\x7d\xf1\x06\xf2\x9a\xbc\xc3\xaf\xd7\x93\xb5\xf9\x68\x5d\x1d\xef\x86\xda\x04\x0a\x87\xf0\xba\x9a\xc0\x92\xb5\x49\x24\x96\x17\xfc\xbb\xca\xcb\xa5\xac\xdf\xe1\xc7\x71\x37\x07\x25\x6b\x23\x42\x7c\x2b\xb5\xb4\xd6\xf1\x7b\x4c\xc2\xf2\x1a\x18\x47\xc4\x53\xf7\xc6\xbf\xa7\xc2\xd0\x36\x4c\xd0\x12\x22\x60\x0f\xe1\x14\x5d\x8d\xbb\xef\x11\xa5\x68\x13\x3b\x7e\xeb\xce\xc2\xab\x7b\x46\x51\x61\x82\xc0\x24\x44\x41\x8b\x01\x32\x0c\xe2\xfc\x3d\x98\x81\x09\x12\xeb\x95\xa7\x9e\x89\x95\xa7\x3e\x1b\x60\x32\x81\x20\xd3\xc8\xad\x15\xe3\xba\x28\x13\x68\x8b\xd7\xf7\xe5\x4a\xb8\x15\xcf\x15\xbc\x85\x09\x43\x6e\xb5\x87\x8a\xae\x4a\xd3\x24\x7f\xf4\x2d\x59\xd2\xf3\x9c\xdd\x56\xfd\x8c\x33\x21\x33\x68\xaf\xe6\xcd\x3d\xc8\x63\x67\xf8\xcd\xce\x19\xd9\x14\xeb\x7c\xcb\x6a\x2f\xad\xf5\x87\xc5\x2c\xc1\xed\x5f\x16\x45\x37\x97\xf3\x72\xa4\x5f\x91\xfe\xcb\x77\x52\x94\xf2\x79\x00\xd9\xde\xd6\x39\x06\x77\x17\x4d\x53\xe9\x5c\x7e\x27\x84\xf0\x7d\x8a\xcc\xc4\x26\x40\x87\x1f\xe1\x21\xed\xea\x7f\xa3\xcc\x15\x01\x67\x2e\x6e\x96\xb9\x8e\x49\x10\xe0\x92\x60\xeb\xea\x80\xf1\x8e\xd9\xa7\x64\x92\x30\x45\xf3\x46\x95\xed\x27\x16\x1f\x93\x18\xd9\xd8\xce\x31\x09\xd3\xbe\xfa\xeb\xc9\xd9\xf3\x84\xef\x8d\xce\xa2\x8a\xe7\x95\xdc\xa7\x01\x18\x3f\x2f\xb0\x33\x89\x62\x49\x34\x52\x24\x1f\x05\x17\x4c\x02\x16\xc3\xd7\xef\x44\x85\x0b\xfb\xe3\xc8\x9f\x71\xd6\xa2\x49\x53\x49\x95\xb2\x9b\xfb\xf1\x2e\x6e\x52\xc5\x6d\x30\xf0\xb0\x4d\xda\x78\x1c\xa2\xed\x85\xa1\x1a\x7c\x0d\x63\x91\xcf\xae\x9d\x4a\x06\xee\x2b\xaa\xb8\x74\x04\xf5\xe7\xd1\x09\xfe\x98\xc4\x26\xaa\x27\x0c\x43\x2a\x9b\x8b\x4c\x1b\x46\xa4\x26\x8a\x3d\xe2\x6d\x0b\x67\xf9\xbc\x84\x11\x3c\xc0\xf4\xd9\x9e\x96\x2f\x27\x80\x70\x6a\xab\xf9\xf4\xcc\x92\x00\xeb\xbf\x3e\xea\xbc\x85\x8d\xa3\x5b\xfa\xe3\xdc\x06\x63\xb2\x44\x21\xbe\x40\x9d\xf2\xc2\x5c\x6f\x1f\x4f\x45\xf1\xd0\x63\x05\x4c\xa6\x95\x8f\x3a\x4c\x29\x78\xbe\xdf\xfb\x8c\xb4\x21\x26\x43\x34\x96\x70\x60\x31\x5e\x91\x97\x6f\xbe\x30\x7f\xfa\xca\x95\x25\x2d\xdb\xb1\xbe\xfd\xa4\xec\xf8\xc2\x22\x62\x62\x8d\x31\x5f\x54\xd9\xaf\x0f\x6e\x47\x77\x7c\x83\xb3\x11\x31\x5c\xa2\xa3\x5a\xa2\xef\xf4\x64\x7f\xc9\x17\xa8\x9b\x5d\xe5\xa8\x43\x5d\xfc\xc7\x3f\xb6\xd1\x09\xd2\x85\xdc\x6d\x16\x7b\xc2\x49\x3e\x2f\xa3\xe0\xbb\x12\x29\x63\xc0\x22\xc9\xc7\xda\x80\x1c\xd9\x49\x06\x62\x91\xb8\xca\x42\x7a\xf3\x63\x61\x00\x61\x40\xa4\x08\x0f\x38\xee\x1b\x82\x51\x3f\xd9\x55\xfb\x7a\xfe\xf5\xdb\x90\x66\x30\xe1\x49\x1d\x2f\xc6\x34\xbf\x79\x8e\x23\x21\x9a\xcb\xb2\x8c\x3c\x7b\x63\x53\x8d\xab\x51\x45\xd2\x67\x63\x85\x3f\x77\x8b\x10\x84\x81\xaf\x43\xea\x7f\x4a\x18\xc2\xe8\x1f\xf2\x12\x7e\x57\xd7\xf9\x4b\x3e\x6c\xd7\x10\x18\xe2\xb0\x44\x9e\x5a\xd9\xc0\x9d\xac\xcd\x52\xce\x50\x24\x10\x58\xab\x7a\x2d\x66\x62\x37\x18\x33\xa6\x09\x88\xb4\xf5\xf9\xb4\x87\xbc\x7c\x90\xbf\xd7\x23\x8e\x4a\x01\x71\x08\xc0\x07\x90\xe5\xad\x3c\x95\x6d\x31\xdc\x61\x2c\x42\xb4\xbf\x9b\x93\x6a\x74\x9d\x1f\x47\xaa\xac\x02\x62\x23\xb0\xc4\xfa\xbe\x37\xcd\x21\x06\x66\x48\x4b\xc0\x99\xc0\xed\x40\x7b\xba\x28\xfa\x67\x4b\x42\x91\x0d\xe2\xf0\x77\xf9\xcb\x2b\x34\xed\x43\x5e\x40\xb3\x3f\x6f\xdf\x40\x12\x05\xff\x3f\xd6\xde\x6d\xb9\x71\x1d\xc9\x02\xfd\x9d\xfd\x30\x0f\x24\x48\x90\xc4\xa3\x2c\xcb\x55\xee\xed\xdb\x58\x72\x55\xf7\x4c\x4c\x28\x12\x40\xc2\xe6\x98\x22\x35\x24\x65\x97\xfa\xeb\x4f\x30\x01\xf0\x26\xba\xf6\x3e\x27\xce\x43\x77\x75\x9b\x20\xc5\x0b\x90\xc8\xcb\xca\xb5\x62\x1b\xd6\x79\xab\x65\x55\x59\xae\xd0\x54\xf3\x06\x12\x8c\xe3\xcc\x55\x18\xa0\x7e\x75\x9e\xce\x4d\x55\x0f\x49\x1c\x7f\x1f\x49\x10\x27\xdd\xd3\xdf\x3d\xaf\xef\x73\xbd\xc3\xfa\xf0\xbd\x2a\x3a\x17\x7e\xde\x8d\x31\xbb\x9b\x04\xe2\x28\x72\xa1\xb4\x65\x6d\x5e\xd0\xb8\xcc\x50\x30\xfb\xc9\xe5\xe9\xbc\x23\x62\xf4\x1d\x36\x2d\x1b\x87\xab\x28\x62\x6e\xfc\x16\xd0\xcd\x9d\x87\x5c\xcd\xd5\xbb\xfc\x48\xb0\xd4\x4f\xa0\xb5\xc5\xd6\x78\xae\x87\xd3\x98\x40\xe3\x3f\x66\x77\x00\x8a\x0a\x4b\x57\xb7\xeb\xbf\x6c\x4f\x44\xa1\x18\xf3\xde\xc4\x82\x96\xeb\xa4\x8a\xeb\x4e\x01\x63\x7c\x66\xa5\xac\x34\x1e\xbb\xa8\x71\xf6\x31\x64\xe8\xa9\x6f\xec\x3c\xbe\x76\xbd\xe4\xb3\x77\x25\x23\x1e\x5b\x39\xf8\x5f\xc4\x64\xee\xff\x2c\x04\x39\xc1\x4f\x2f\x57\x77\xb7\x4e\xbf\x99\xea\x77\xfb\xf5\xea\xa9\x1f\x84\x56\xe5\x90\x94\x4a\x6e\xaa\x9a\xca\x8b\xd8\x2c\xd0\xf5\x65\xa8\xb8\x65\x6c\x71\xe9\xaa\xaa\xa8\xea\xc7\x9a\x2c\x9d\x1b\xa0\xb5\xa6\x20\xd7\x93\x85\x3c\x7e\xce\x2b\xff\x68\x02\xeb\xf2\xed\xe9\x4d\x95\x7a\x9e\x4b\x9a\xbd\x24\xc3\x2d\xcd\x77\x89\xbf\x2c\x99\x3b\xe2\x54\xdd\x2e\x43\x23\xec\x7b\x54\x50\x7b\x20\x82\xd3\xf1\x98\xfc\xb2\x61\x81\x22\x3e\xf4\xc3\xb9\xa7\x4c\xf5\x47\x62\x81\xbe\x47\x72\xf7\x56\x57\x9f\x24\x64\x6e\x09\xbc\x6e\x4b\x55\xd5\x35\xaa\x96\x44\x97\x26\x79\x0c\xc3\x12\x61\x79\xa9\xb1\xe9\xd5\xf3\x07\x6e\xbe\xcc\xb0\x8c\x13\xe9\x64\x59\xb5\x9b\xff\x3b\x41\x71\xb1\x99\x8c\xa7\x90\x61\x82\xd3\xa3\x82\xd6\xd4\x73\x7b\xd1\x66\xf1\x5b\xd3\xfa\xe5\x46\x68\x98\x94\x54\x68\xb1\x72\x0e\x9d\xc3\x72\x68\x2e\x8a\xd8\x93\x33\x22\x99\x72\xeb\xc1\x9f\x7f\xe6\x5f\x6c\x05\x26\x4e\x63\x2a\xa2\xf9\x6c\x35\xf9\xde\x37\xd5\xdc\x89\x5e\x5e\x5c\x26\xce\x2c\x82\xcf\x8a\x8b\x50\x9c\xb4\x9d\x6b\x5c\x67\x86\x47\x26\x72\x13\xfb\xc9\x92\x0e\xbb\x14\x42\x3f\xe5\x0c\x47\x4e\x4d\xaf\xd7\xb8\x2e\x4e\xf2\x77\x6b\xd4\x24\x8a\x51\x69\xd4\xe7\x27\x3b\xbf\xae\x59\xe8\xbb\x34\x89\x8e\xd0\xcc\xf5\x57\xe8\x9b\x4c\xaf\x87\x36\x47\xe2\xfa\x49\x09\xbd\xef\x7a\xad\x46\xde\xa0\x49\x43\x43\x9c\xb3\x5e\xc2\x6c\x2c\x39\xb6\x68\xb0\x4d\xca\xad\x70\xa6\x05\xb5\x4f\xa8\xed\x33\x93\x26\x3c\x71\xb0\x80\x1e\x3b\x30\x4a\xeb\xfb\x51\x69\xe0\xe9\x1c\xfe\xf3\x84\x27\x9c\x6c\x6c\x26\xcd\x42\x5a\xf4\x36\x1d\xfa\x00\x07\x5c\x75\xb1\xe3\x08\xff\xbd\x08\x6e\x30\x29\x58\x5a\xce\xbc\xb9\xeb\xc5\xc7\x32\x93\x9a\x98\xfa\x75\x75\x7d\xec\x37\x2c\xeb\x8b\x0f\xe4\x7a\x6e\xa8\x60\xc2\xe6\xf9\xbb\xf5\xe5\x91\xed\xfe\x20\xa4\x69\x6a\x71\x8a\xf5\xfe\xa3\x6a\x87\xf5\x29\x65\x4a\x0d\x28\xeb\xc7\xfb\xfb\xc7\x87\xfd\xcf\xdb\xdd\xf7\xeb\xe7\xd5\xcf\xfd\xf6\xe5\xe9\xe9\xee\x5f\xc3\xa8\x8c\x72\xc4\x79\x1f\xcb\xf4\x6d\x0d\x37\xd5\x45\xec\x3f\x7b\x32\x89\x31\xe5\xce\xd7\xe7\xd7\x5e\x65\x2a\x33\x2a\x95\x3a\x18\x8a\xe9\xdd\x02\x6f\xf1\x1a\xef\xb1\x81\x1f\xb6\xa3\xe6\xaf\x96\xe2\xc4\xcd\x34\xca\x88\xc8\x66\xbf\xc7\xbe\xbf\xd1\x21\x12\x26\xc8\xb5\xf5\x3b\xeb\xb4\xdc\xd5\x68\x74\x68\xc5\x3c\xdd\x5f\x77\x15\x85\x50\x97\x96\xd6\x60\x62\x88\x4c\xb8\xad\xf3\xd7\x57\xac\x97\xa6\xdd\x74\xda\x1b\x25\x12\xe6\xe8\x2b\x7e\xd9\x2e\x0a\xbb\x5b\xfa\xfb\x34\x9a\x7b\x2d\x2f\x5a\x83\x94\xcb\x23\x80\xc7\xf4\x31\x8d\x4e\x28\xee\x78\xaa\x3e\x07\x5e\x36\x3a\x26\x82\x80\x61\xc2\xc6\xd2\x3c\x37\x9f\x33\x6e\xdb\xc9\x5d\x89\x20\x80\xcc\xeb\xdc\xaf\x8e\xc7\x1a\xcb\x36\x57\xb8\xee\x9c\x9e\x51\x3c\x28\x82\x40\x43\x28\xc6\xf8\x17\xaa\x9e\x8d\xda\xf5\xa6\x57\x0d\x45\x4c\x5f\x02\xf3\xee\xed\x7d\x87\x0f\x5c\xb5\xbe\x25\x7f\x6e\xb9\xc6\x0f\x27\x02\xc6\x90\x5a\xc4\x3d\x8d\x2e\x4e\xe7\xf2\x50\x14\xee\x37\x4e\x11\x30\xe1\xa8\xad\xc9\x52\xfc\x44\xd9\xe4\x53\xcc\xb6\x08\x98\xca\xc8\x2d\x6a\x3e\xf3\x56\xbd\x19\xaf\xb3\x2b\x82\x28\x48\x68\xc9\x5c\x9d\xea\x72\xf6\x10\x51\x2a\x09\xe8\x6c\x19\x9f\x7b\x5f\x6d\xc9\x5e\x8b\x20\x02\x46\xa5\x6d\x2a\x5b\xcc\x73\x24\xb3\x1a\xb6\x08\xe2\x20\xcb\x70\x44\x19\xde\xb3\x0b\xfb\xdb\x8a\x23\x16\xf1\x01\xdb\xbb\x68\xc9\xba\x51\x09\x49\x09\xdf\x5f\xed\xfa\x13\xb9\x22\xc2\x48\x7b\xc9\x21\x4e\x11\x41\x8c\x36\x99\xa2\xb1\x78\xb9\x2d\x5b\x5b\x1d\x9a\xbe\xfc\x24\xd3\x84\x0c\xd2\x7d\x9e\xce\xca\x2e\x7f\xb1\xb8\x67\x77\x93\xc8\x94\x90\x5c\xf2\x54\x97\xc3\xcc\x08\x83\x83\xbf\x83\x34\x4b\x88\x6f\x08\x7f\xa1\x3a\xb5\x38\xd5\xac\xfa\x1d\x1e\x56\x04\xa9\x10\x84\x93\xba\xa9\xea\xce\x9b\xc5\xfe\xfb\x65\x82\x65\x81\x8f\xab\xf7\x1a\x8b\xd9\x77\xc9\x64\x10\x64\x7d\x48\xb5\xeb\xfb\xd4\xfe\x9b\x0d\x25\xa5\xc9\xff\xfc\xf2\xc0\xdf\xff\x9f\xe1\xff\xb8\x1f\x17\x91\x51\xae\x17\xec\xb6\x33\x6e\x23\xdc\x8e\x1f\x91\x49\x9a\x97\xef\x1e\xff\x27\x02\x88\x6d\x27\xe9\xea\x78\x6a\xde\xfe\x51\x9d\x9a\x76\x42\xf7\x31\x3d\x1f\x90\x43\x38\x00\x4e\x81\xc8\x21\xfc\x95\x64\x10\xd2\xb3\xe7\xaa\x2a\xd5\x24\x71\xdc\x1d\x13\x2a\xe8\xdb\x1e\xf7\xd2\x4b\xd6\x67\xfe\x78\xc8\x62\x4b\xa3\x4b\xa7\xd9\x18\xd9\xd5\x29\x86\xcf\x22\x05\x10\x9e\x68\xf3\xf8\x97\x4e\xbc\x08\x54\xa8\x3d\x8c\x8d\x4a\x5f\x79\x55\x0e\xb9\x1f\x11\xa8\x8c\x27\x56\x95\xea\x70\x2c\xe0\x7d\xf8\xb3\x15\xce\xb8\xab\x5e\x1f\x1d\xa9\xca\x7a\xac\xca\xbd\xa0\x1a\x24\x02\x25\x18\xb9\x9c\x37\xe7\x26\x57\x50\x8c\xb6\x03\x11\x28\x54\x44\xaa\xb0\xd2\xfa\xd1\x98\x5c\xe5\x50\xac\x8e\xc7\xf9\x7a\xd6\x91\x26\x42\x11\x3d\xe2\x67\xf1\x87\xb2\x84\x20\x12\x70\x6a\x2b\xd2\x26\xf8\xa3\x3f\x20\x6c\x85\x9b\x1a\x43\x1a\xa2\xb8\x58\x9c\xdf\xfd\x82\xd3\x10\x8b\xc4\xc7\x35\xe5\xfb\x2e\x6f\x8b\xb9\x29\xd5\x4a\x11\xcc\x6a\xbb\xba\xd9\xfc\xe6\x1d\xff\xc7\xf8\xe3\x61\x22\x29\xe7\x70\x6a\xb0\xb6\x49\xf2\x25\x37\x51\x04\x26\xb4\xea\x7d\x56\xfd\xfd\xa5\xcc\x7f\xf9\x47\x31\x09\x27\x16\x10\x05\xa5\x25\xe9\xb8\xf2\x91\xb7\x08\x83\x28\xcd\x5c\xe1\xe0\xea\x76\x6a\x41\xc2\x20\xca\x28\x5b\x3e\x8a\xb2\xa7\x6f\x2f\x0c\x22\x74\x22\x69\xe6\x54\x6a\xd7\xea\x31\xbb\x48\xa2\xb5\x18\x89\x05\xdb\x7e\xaa\x4b\xa2\x13\x11\x06\x69\x40\x71\xfe\xb1\xae\xba\x21\x1b\x2f\x53\xdf\x99\x2d\x57\xd6\xb5\x90\x13\xbf\xcb\x8a\x30\x14\x56\x28\xca\x26\x91\xb6\x9f\x70\x3c\x2e\xa7\xa6\x45\x18\x1a\x66\x5c\xb1\xb7\x2d\x70\x0d\xa5\x3e\x7f\xc3\x76\xda\xea\x2a\x42\x26\x78\xe0\x42\xe9\xdb\x16\x0f\xcf\x36\x71\x4f\x41\xf5\x6c\x64\x94\xd8\x2e\x87\x93\x55\x1d\x7d\x46\x72\x3d\xfd\x8d\x45\x19\x27\x14\xd1\x35\xa2\x1e\xb0\x58\x22\x8c\x83\x98\x31\x27\x00\x78\x0f\x79\x71\x75\xb6\x82\x1d\x93\x05\x10\xce\xb6\x86\x30\x8e\x15\xcd\x2c\x9a\x32\xf7\x79\xd9\x5e\xd2\x99\xf8\x91\xdc\x92\xb2\xf4\x49\xa7\xdf\x10\xe4\x88\x30\x56\x86\x98\xe7\x0a\xfc\xc0\x70\xf6\xbe\x78\x62\x05\xd5\xde\xa0\x79\xaa\xf3\xaa\xbe\x3e\x91\x4c\x44\xbb\x48\x1e\x22\xc2\x24\xb1\x6e\x72\xee\x30\x53\x36\x22\x9c\x5d\x33\x51\x96\xa8\xd9\xd2\x3d\xae\xab\xd3\xb1\x1a\x6a\x43\x93\x45\x1f\x26\x1a\xb9\xf0\x5d\xa4\x33\x3a\x38\x11\x26\xc8\xb5\x25\x6b\x2e\xb4\x23\x90\xbb\xed\x27\x45\x62\x32\x0a\x5e\x35\x79\x19\xf7\xce\x87\x73\xd8\x53\x11\xa6\x4c\x8f\x88\x08\x07\xae\xad\xcc\x1f\x8f\xad\xe4\xde\xab\xaa\x96\x77\xea\x30\x4b\x74\xda\xcb\xbe\xcc\x3a\x79\x44\x28\x24\x92\xe9\x3b\x35\xe8\xd4\xb3\x90\x40\x7b\x7f\x11\x81\xce\xde\x27\xa0\x26\x72\x92\x69\x9f\xd3\x45\x73\xff\x1c\x4a\x21\x42\x29\x23\x4b\xb5\x59\xe6\xad\x43\x7d\xfd\x16\x93\x2a\x42\x69\x22\x72\xa9\x3d\x69\x30\x65\xb3\x6e\x90\xb4\x06\x67\x1f\x50\xa5\xa9\x5b\xef\xa4\xc5\xee\x74\xc2\xfe\x16\x0c\x52\x84\x3a\xb4\x04\xf0\x4e\x35\x09\x9a\xe6\x58\xd5\xcb\x48\x72\x11\xea\x08\x94\x4b\x65\x5f\xe3\xc7\xec\x36\x74\x1c\x04\xa3\x92\xf4\x80\x9b\xee\x0e\x01\xa9\x58\x99\xba\x2a\x5b\x2b\xec\xbd\xd2\xff\x7b\x72\x72\x0f\xdd\x3e\xd5\x8f\x44\xa4\x68\xf8\xb9\x9b\x61\x2f\x7d\x55\xad\xbf\x12\x46\x76\xa9\x1e\x6b\x3c\xe4\x27\xca\xd8\xf5\x87\xe2\x80\xcc\x0e\xe5\x08\x9d\xb9\xc1\xb9\xc1\x31\x98\xf8\x8a\xc2\x1d\xf4\x2a\xb9\xa3\x4d\x92\x05\xb1\xa6\x4f\xb5\x43\x38\xfc\xc0\x86\xc2\x83\x11\xe8\x51\xb0\x40\x20\x39\x14\x79\x43\x21\x54\x3e\x8b\x5b\x04\x0b\x54\x4a\xa1\xd8\x6d\xd9\x9c\x88\x8d\x7a\xf1\x0b\xb3\x90\x59\x42\xb0\x26\x8c\x1c\x3f\x93\x3f\x80\x21\xe9\x56\xf8\xa4\x99\xeb\x07\x9f\x9e\xcd\x22\xcb\x16\x89\xa5\xfe\x51\x0d\x77\xcf\x62\x4b\x0d\x7d\x57\xb9\xb2\xfc\xcf\x09\xeb\xea\xd7\x3a\x71\x83\x01\x62\x2c\x13\x4e\x9e\xb6\xd4\x05\x9a\xf6\x40\x68\xde\xc5\x55\xc7\x22\xae\x03\xdb\xf6\x93\x1f\x8f\xa8\x17\x85\xd2\x27\xf7\x1d\x49\x16\xf0\x99\xda\xa0\xbf\xf9\x38\x4d\x52\xa7\x51\x79\x47\xb5\xbf\xd7\xc5\x8a\xb1\x60\x3c\x31\x04\xbb\x28\xf1\x93\xb6\x81\xfa\x3f\x4f\x58\x9f\x1d\x0e\x61\xca\xbd\xe4\xcf\x00\x13\xa7\x7e\x9a\x57\xb5\xc5\x9d\x4d\x62\x7b\xc1\x12\x16\x50\x4b\x81\x05\xb5\x39\x5b\xe9\x8f\x49\x4d\xa8\x86\xa7\x1a\x7d\xf6\xe5\xf7\xe4\x55\x21\xcb\x66\x37\x9d\x32\x0b\x1c\xdd\x5b\x43\xbb\xd2\xd5\xb1\x0b\xf0\x7f\x8d\xab\xdc\xa7\x0b\xfa\x54\xc1\x52\x34\x54\xfd\xf8\xf0\xe2\x95\x5b\x2b\x0f\x74\x1e\x51\x7f\x76\x2e\x3a\xa3\xe4\xdb\x98\x09\x88\x22\x48\xc6\x03\x3f\xa6\xdb\x49\xbd\x11\x3c\x3f\x16\xfa\x61\x06\x33\x13\x4c\xb0\x90\x7b\x6d\x00\x4f\x9f\x3b\x5b\x42\x4c\x38\xd9\xec\x57\x6c\x9f\x1e\x1f\xef\x2c\x62\x2d\xec\x7f\xc3\xe1\xb2\x2d\xc0\xb6\x07\xdf\x0a\x06\x91\x20\x9a\x41\x57\x08\x27\xa7\xe9\xea\xa4\x5f\x87\x77\x0c\x3c\x91\x16\x0c\x07\xed\xdb\x35\xb4\xb0\xff\x08\xfb\x7b\x07\xcc\x52\x5b\x4e\xde\xda\x72\x84\xbc\x58\x77\x52\xe8\x44\x8d\xec\xe0\x49\x16\x9d\x5f\x52\x3f\xbb\x56\xb1\xd9\x70\x25\xb9\x74\x30\xeb\xab\xfa\x32\xf3\x3e\xef\xd2\x9c\x4e\xab\x79\xbc\xc9\x94\xb2\x50\xe6\xdc\xe6\x6e\xe7\xa2\x53\x82\x29\x9d\x91\x27\x58\x75\x1e\x31\x14\xae\xd6\xe0\x1f\x4f\x61\x08\xe9\x40\xbe\x4d\x21\x43\x67\xf3\x41\xf5\x22\x4e\x82\xe9\x44\x11\x5a\x70\xf7\x73\x3d\xf6\xb7\x99\xd6\x96\xff\x80\x72\x91\xc4\x4a\xfc\x54\x7d\x62\x6d\x4e\xc5\xd0\x36\xd1\x8d\x42\x1c\x80\x39\x36\xef\x71\x3b\xda\x4e\xa7\xb7\x8b\xc2\x72\x1c\xd5\x04\xf4\xfa\x09\x4d\x17\x12\xf4\x3e\x1e\x43\x6d\xe3\xae\x07\x57\x0b\x74\xf8\x25\x1f\x62\x31\x13\x0a\xd2\x69\xba\xbd\xbf\xde\xfc\xf3\xf7\x75\x9b\xe9\x0f\x47\x81\x8b\x90\x6d\x7a\x82\xa6\xe8\x42\xb6\x59\x44\x61\x66\xf9\x08\xf7\xb2\xaa\x97\x13\x42\x22\x0a\x65\x4c\x0e\x9f\x27\xd7\x20\x00\x3b\x1a\x3f\xe3\xa2\x50\xa2\xe2\xd3\x96\x2d\x8b\xc0\x58\xd2\xe6\x71\xe7\xb0\xd8\x76\xc2\x38\x17\x93\x7a\xee\xde\x72\x9c\xf5\x8e\x8a\x28\x0a\x32\x66\x79\xa2\x7f\xbd\xd8\x03\xfe\x57\x79\x98\x52\x76\x14\xb4\xde\xbe\x55\x47\x5b\xa6\x5d\x08\xe7\x22\xce\x2c\xe4\x97\xd6\xb4\xf5\x77\xc7\x29\xa3\x88\x67\x12\xac\xcc\xda\xaa\x73\xb1\xa7\xf3\x3b\xe2\xc2\x36\x8a\x7e\x83\xb3\x6d\x4f\x87\x62\xe5\x59\x6f\x44\x94\xc4\x59\xe4\x65\x52\xc0\x96\x9f\x66\x0f\x90\xf0\x90\x82\xc9\xfd\xbe\xf3\x41\x6e\x4e\x7d\x0a\x2c\x4a\x32\xdb\x83\xef\x88\x28\x9b\xe7\xbc\x79\x57\x55\xdf\x23\x28\xa2\x2c\x48\x3c\x89\x5b\xb7\xff\xe4\xe5\xab\x17\x4a\x5c\x72\x2b\xa3\x2c\x34\x91\xf2\x4d\x41\x6b\x38\x36\xab\x52\xbf\x2c\x52\xe5\xf8\x13\xa2\x68\x94\x8e\xb2\xe5\xb7\x05\xa6\x07\x11\x65\xb1\x55\x2f\xea\x19\x13\xd7\x70\x9c\xa3\x5b\x44\x94\xc9\x98\xde\xd4\x16\x5b\x7b\x2d\x72\x11\x57\x97\xc3\x8c\x85\x55\x60\xa9\x9d\x52\xc8\x64\x93\x89\x44\x16\x11\x30\x75\xdb\x56\xbf\xb6\x87\x6e\x89\x51\x5f\xf1\x6f\x14\x9f\xdd\x89\x10\xc7\x41\xd6\x77\xad\xb6\x37\x84\x06\x2a\xd5\x6c\xcf\x8f\x80\x07\x14\xdd\xb8\x46\x3e\xa2\x52\xbc\xa9\xea\x11\xbb\xdc\x28\x72\x8b\x40\x86\x09\x9f\x74\x27\x93\x68\xa3\x3b\xaa\xc2\x40\x18\xcf\x71\xe0\x6b\x66\xfd\x07\x54\x91\x46\xc7\x40\xf0\x3d\xef\x22\x87\x33\xd9\xeb\x81\x06\x4e\x44\x2a\xd5\xee\x6d\x14\x85\xaf\x1d\xb9\x9c\x14\xc5\x71\x7e\x9c\x06\x19\x78\xa6\x7a\x1c\xab\x47\x89\x48\xab\x2c\x60\x3d\x55\xc7\x1f\x6e\xdb\xfc\x6f\xc7\xbc\x21\x22\x0c\x90\x20\x18\xcf\x8f\xeb\x3f\xfd\x39\x08\x59\xe8\xb8\xd0\x6c\xb6\x65\xc1\xc9\x88\x50\xa6\xe4\x41\xfd\x5a\x3c\x6a\x84\x0c\x60\x82\x08\x9f\xbd\x67\xa3\x99\x1c\xc0\xd6\xeb\x53\xd3\x56\x87\x55\xeb\xa8\xab\x1c\xd5\xce\x25\xd4\xda\xef\xf8\xfe\x5f\x3f\x2d\xe2\x20\x8b\xc8\xad\x79\xd9\x5e\xef\x9f\x36\xcf\xfb\x9e\x30\x4a\xc4\x81\x96\x21\xb8\x97\xb8\x2a\x8a\xeb\xaa\x58\xb5\x8f\x83\x4b\x12\x87\x91\x22\xb7\x85\xbe\xd2\x33\xb6\x44\x4c\xb5\xae\xbb\x2d\xd7\x0f\x61\x81\x0d\x14\xda\x7e\xae\xf9\x03\x91\x88\x75\xdf\xcc\xdf\x7d\x17\x36\xb5\x10\x31\x4b\xfa\x1d\xd0\x23\xc8\x96\x8d\x5e\xcc\x84\x45\xcd\xe4\xcd\x0d\xd4\x87\xb9\xa9\x89\xa3\x34\x44\x57\x09\xee\x9d\xba\x91\xb8\xb6\x88\xe3\xd4\x3a\x6c\x8a\xde\x25\xb5\xe7\x53\xa9\x76\x4e\x6b\x25\xe2\x18\xad\x2d\x70\x71\xcf\xae\xb6\xc8\x67\x7f\x21\x1e\x32\xca\x7e\x5c\x8d\x75\xeb\x45\xcc\x85\xf4\x39\x76\x37\xd7\xef\x4e\xea\xfd\xbc\x6d\xab\x12\xc7\x26\x33\x4e\x02\x1d\x0c\xc9\x6f\x6b\x53\x2d\x8f\xc9\xa2\xa5\x89\x93\xc4\xb6\xab\xe4\x9e\xbe\x70\xf7\x06\x9f\x0e\x3e\xb9\xb8\x96\xe3\x24\xb3\x8f\x2a\x47\xa2\x08\xc3\xaa\x8c\x13\x15\x12\xfa\xa1\x86\x92\x2a\x72\x53\xb8\xa9\x88\x13\x03\x04\xd9\x38\xc0\x2f\x6b\xd1\x5c\x82\xde\x1f\x4f\x63\x41\x21\xf8\x3e\xb7\x95\x3f\xcb\xd3\x5b\x2d\x77\xbf\x8a\x38\x4d\x42\x52\x98\xd9\x62\x7b\x3a\x52\xaa\xe7\x4b\x9e\x0d\x11\xa7\x69\x42\x90\x85\x43\xee\x75\x5b\x29\x88\xfb\x6d\xde\x38\x4e\x33\xa0\x93\xae\xcf\x05\x94\x5f\x37\x83\xbb\xd1\x59\x14\x67\x63\xbd\xd9\xa5\x2c\x4e\x9c\xc5\x31\xd9\xd1\xd5\x6a\x35\xf6\x73\xe2\x2c\x16\x9c\x4f\xbb\xc0\x46\x72\xc6\x22\xce\x32\x0b\x23\x20\x20\xce\x58\x07\x5e\xc4\x42\x28\x42\xec\xdf\xe7\xfa\x33\x37\xfd\xdb\x94\x01\xf8\x9e\x8d\x9b\x53\x61\xf2\xa2\x98\xf4\x51\x4f\x6f\x4b\x82\x55\x54\x6f\x70\x92\x2f\xf6\x41\x7e\x2c\x95\x25\x38\x3f\xd6\x55\x65\x1e\xcd\x16\x8a\x76\xa1\x43\x4d\xc4\x2a\x8a\x79\x48\xd5\x7a\xf5\x76\x75\xf2\xd0\x47\x11\x2b\xc5\xc9\xbd\x3b\x40\xfd\x3e\xcf\x10\xb9\x21\x18\x71\xca\xef\xef\x56\x7f\x8e\xa7\x3f\x8a\x84\x81\xa3\x5e\x57\xfd\xbc\x9e\x99\xb5\x18\x31\x20\xb8\xc9\xae\xce\x4f\xe5\x47\x5e\x8f\x32\x87\xfd\x33\x18\x0e\xd4\x89\x89\x1f\x58\xb6\x4f\x79\xfd\xef\xe9\xe7\xf7\x8f\x60\x44\xe2\x74\xb4\x7d\x59\xe5\x6a\xb7\xf6\x77\x63\x20\x88\x8c\xc3\xb4\xe6\x35\x6a\x4b\x92\xbf\xab\xae\x90\xd4\xe2\x1c\x08\xce\x0f\x96\x31\xa1\xd3\x7f\xc2\xf9\x3d\x1f\x3f\x93\xd1\x00\x56\x81\xa9\xa8\x40\xef\x5f\xeb\xea\x74\xdc\xbf\x0f\x81\xa8\xa7\x50\x14\x44\x6c\xe3\x31\xac\x6f\x79\xf9\x4a\x9a\x1b\x63\xf4\x41\xbf\xfa\x78\x00\xc8\x64\xef\x0f\xec\xaa\xe3\xa4\x02\x3d\x79\x5d\x3c\x30\x01\xf4\x34\x5e\x39\xd6\x0e\xc8\x2e\x38\xe3\x56\xb1\x90\x24\xe1\x5d\x36\xe7\xf9\x54\x8e\xc1\x76\xa3\x9f\x64\x60\x89\xef\x4e\x25\xb5\x12\x7a\x49\x2f\x32\x7f\x76\x0e\x4f\x8d\x29\x8f\x42\x4d\x1c\x07\x45\xf5\xd9\x2d\x3f\x0a\xe2\xc6\x09\x08\x1e\x81\xf0\x8d\xa7\xbe\xad\xd3\xd3\x52\x8d\xe7\x3c\x8f\x43\xdb\xa6\x43\xd9\x3a\x4b\x1e\x3c\x4b\x15\xf3\xd8\x01\x62\x0e\x95\x3e\x15\xd8\x07\x4a\xfe\x68\x12\x18\xdf\xea\x3c\x3f\x51\x59\x3a\xe0\x06\x5b\x05\xc7\xce\xbf\xbe\x6c\x40\x9e\x2e\x1f\xce\x45\x4c\xa6\xb4\xc8\x4b\x7c\x34\x8e\x4e\xec\x8f\xf9\x18\x2b\xcc\x44\x39\x1f\xcb\x87\xe9\x6f\x86\x4b\xc1\xdd\x53\xff\x99\x97\xfa\xd1\x3c\x81\x7a\x87\xd7\xf9\x13\x71\x4c\x08\xd2\x42\xa2\xed\x04\x79\x98\xfe\x42\x02\x19\x21\xfd\x11\x9a\xf3\x7d\x5e\x8e\xe5\x50\x04\x4f\x03\x45\x29\xac\x51\x97\x3b\x55\x42\x16\x31\xaa\x7e\x51\xf2\x14\x50\x26\x03\x57\x2e\x25\x9d\xe7\x18\x27\xc1\x53\x99\x51\x44\xd4\xb4\xa0\xde\x1f\x8d\x69\xe6\x66\x8f\x67\x2c\xa4\x30\x6e\x7b\xf3\xcf\xc9\x5d\x65\x99\x20\x56\xc9\x7f\xee\x7e\xac\xf2\xfa\xba\xae\x8e\xc7\x3e\x10\xe3\x59\x06\x5a\x8d\x4a\xda\x7d\x15\x78\x8c\xe1\x10\x3c\x03\xee\xbb\x77\x9e\xde\xaa\x12\xaf\xce\x8b\x09\x79\x9e\x81\xd4\x2e\x22\x5a\x4d\x52\x03\xbc\x0b\x09\x9d\xb3\xf6\xed\x7e\x76\x96\x10\x96\xac\xcf\x60\xab\xde\x5e\xca\xa1\xb8\xe9\xc4\x18\xfc\xcd\x42\x2c\xa9\x15\x5c\xc3\xb9\xd9\xe6\xa5\xc2\x3b\x38\x95\x7d\x75\x87\x43\x66\xc9\xa2\x0f\x84\x44\xf9\x56\xc3\xd1\x43\x28\x04\x07\x93\x11\x3d\xa1\xab\x43\xf8\xfa\xef\xae\xba\x5d\xaf\x9e\x5c\xe6\x67\x9e\x55\xbf\xdc\x7e\xb9\x94\x36\x3d\x71\x9c\x73\xf5\x0a\xae\x58\x4a\x84\x40\xf2\x74\xfe\xe3\xb2\xc3\x50\x70\x25\x91\xb6\x10\x97\xc0\xd8\xfc\x3a\xe6\xf5\x79\xaa\x26\x28\xb8\x66\xc0\xad\x2a\x38\xea\x97\x3a\x9f\x7d\x61\xc3\x24\x15\x53\xf6\x2e\x47\xfa\xa3\x3a\xa9\xb7\x11\x9b\xee\x74\xc5\x24\x01\xc4\xa4\x10\x79\x2a\x49\x7a\x78\x57\x9f\xb0\x67\xf8\xec\x8e\x26\xba\x5b\xbb\xb7\xbb\x5d\xaf\xba\xe0\x0e\x85\x71\x6c\x06\x02\xb2\x6e\x52\x96\x43\x26\x26\x09\x79\x96\xba\x24\xcf\x77\x04\x3d\x6b\x86\x11\x49\x98\x86\x49\x8f\xba\x6e\xf3\x0f\xb2\x7e\xfd\xc9\x32\xa4\x5e\x93\x16\xe1\xf0\x00\x87\xbc\x7c\x75\x0a\x48\xee\x38\x13\x29\xe1\xcb\xdf\xf3\xa2\x38\x43\xff\x57\x8d\x94\x33\x7a\xaa\xab\xa6\x73\x58\xfe\x9e\x0c\x90\x48\x22\x66\x49\x29\xcb\xd3\xc1\xf6\xc6\xfa\xf9\x90\x44\xdc\x5a\x8a\x7f\xac\xfe\x31\x5e\x2c\x49\x84\xa1\x76\x9e\xe0\xd3\xa9\x3e\x56\x43\xd8\x9a\xc4\x49\xe0\xab\x6a\xfb\x9a\x7c\xe9\xbd\x3c\xef\x0b\xfc\xc0\x29\x17\x89\x48\x62\x81\xdc\x13\xb0\x91\x9d\x7a\xaa\x7c\x20\xfb\x7b\x23\x97\x70\x66\xcb\x1c\xc7\x93\x9c\x60\xed\x44\xc2\xa3\x88\x1a\x62\x4c\x5e\x37\x8e\x01\x6b\x63\xa9\xd4\xfa\x11\x99\xa5\x02\x7e\xb9\xda\x8e\x36\xc2\x84\x0b\xdb\x22\xd2\xe4\x56\x62\xc4\xfd\x39\xc9\x50\xb2\xbe\x74\xf6\xe2\x77\x97\x27\xa7\x32\x6a\xfb\x03\x97\xfb\x12\x45\x92\x98\x88\xf7\x41\xc3\xbd\x15\x84\xd9\x50\x77\xb5\x37\x2c\x49\x1a\x31\x2a\x11\x0e\x2b\x6d\xbb\xda\x55\x9b\xd9\x9b\x4a\x13\x24\x6a\xea\xed\xd3\x6e\xf2\x19\x52\xe0\x0c\x87\xcc\x0a\x28\x0a\x3e\xeb\x83\x45\x7f\x4e\xbe\x71\x16\xc7\x14\x8e\xdd\x38\xa1\x95\x65\x2d\xb1\x6e\x5c\x96\x60\xdf\x37\x5f\x51\x0e\x6b\xb8\xdd\x4c\xd8\xf6\x76\xb0\xcc\x39\xed\xf8\x66\x32\x61\x81\xcc\x43\xc0\x87\x23\xe1\xf1\xee\xb8\xa2\x1d\xb7\x17\x91\x70\xf4\x3b\xb3\x2f\x98\x01\x8f\x9c\xa9\xbd\x3a\xd5\xe5\x50\x62\x70\xc7\x85\x8e\x84\xf0\x9a\x6c\x54\xcf\xac\xaa\x42\x57\x9f\xd3\x52\x57\x02\x91\x90\xa3\x8a\x8b\xed\x16\x9a\x25\x1b\xa7\x4f\x2e\x33\xd4\x03\x4e\xcf\xdd\xdc\x7f\xb6\xb3\xf4\x40\x22\x0d\xa3\xa5\x87\xbf\x8e\xdd\x8d\x3d\x63\xe7\x38\x3d\x9c\x0e\x5b\x54\x5f\xcd\xda\xcb\x52\x55\xa2\x82\x8c\x2a\x65\xca\xf5\x00\x5a\xc6\xd9\xc9\x17\x53\x61\x40\xa0\x98\xbd\xd5\x52\xfa\xaa\xd2\xe4\x46\xeb\x24\x36\x03\x99\xe3\xff\x9d\xf2\x7f\xef\x5f\x87\xc4\xf3\x74\xbd\x6b\xc5\x98\x25\x19\xec\xe6\xe2\x1d\x1c\x64\x35\x7b\x48\xad\x44\xe2\xea\x88\x83\x82\xdb\x34\x8b\x9d\xa0\xc8\x32\x39\x20\xcc\xae\xf2\x42\x56\x75\x75\x7a\xf5\x1b\x4d\x62\x78\x4c\xd8\x7b\x93\xff\x42\xfd\x8c\x1f\x58\x0f\xba\x9b\xff\x1d\x06\xfe\x55\x98\x0c\x28\xff\xf0\xa3\x6a\x87\x85\x97\x06\x18\x91\x85\xf9\xc7\x6a\xd7\x33\x08\x89\x34\x4c\x92\x54\x8d\xe1\x5b\x1b\xd7\x16\x37\xed\xb5\xfb\x7d\x81\x31\x0d\x53\xc9\x1c\x79\xe9\xa3\xfe\x92\x5b\xd4\x0f\x86\x90\xf6\xb2\x1f\xf9\x07\xbe\xef\x3c\x7b\x75\x7f\x43\xd2\xba\x5b\x0d\xb6\x0f\x55\x4f\x5d\x4b\x7e\xee\x58\xda\x50\xa4\x2c\xd5\x33\xb6\xc9\x75\x91\xcf\x19\x0e\xba\x61\x86\x4c\x46\x03\x1f\xd8\xbd\xb2\xf2\x64\x75\x3f\xc6\x04\x47\xcb\xfb\x58\x1a\x65\xb6\xd5\xa1\xee\xb5\x7a\x9f\xea\x4a\x16\x78\x68\x96\xc3\x9c\x34\x92\xcc\x66\x8f\x0f\x2d\xc2\xbf\xfd\x13\x51\xb4\xe6\x5a\xc3\x7a\xde\x2c\x91\xc6\x5a\x2b\xbf\x5d\x95\xf9\x01\x8a\x0b\xc1\x67\x91\xf2\x00\x94\x19\xcb\x0c\x56\xde\xc9\x4d\x79\xc6\xb5\x53\xe1\x78\x2c\xf4\x43\xae\xde\xcb\xaf\x72\xce\x29\x57\xc8\xbc\xa1\x28\x07\x39\x47\x91\x72\x2d\x94\xe7\xfe\x5a\x7f\xb7\x25\x91\x88\x4d\x66\x65\x9a\xc8\x88\xdb\x80\xa6\x2a\xff\x56\x8b\x9f\x48\x13\x13\x5b\x96\xa0\x53\xfb\x56\xd5\x79\x83\x1e\xf6\x3f\x59\x61\x69\x1a\x1b\xcb\xad\x6d\x9b\x78\x9c\x5a\xdb\xf4\x52\x69\x12\x59\xd7\xb6\x9b\x27\x96\xe2\x78\x42\x0b\xe8\x86\x65\xc2\x56\xd1\x2d\x76\xe3\x1a\x81\x78\xe7\x2e\x26\xe2\xe4\xc1\x20\xb1\x8d\xa3\xb6\xae\x75\x53\xd5\x4b\xdc\xc9\xfe\x07\x20\xd5\xcc\x75\xbf\x0e\xdd\x82\x22\x05\xc3\x54\x36\xea\x43\xbc\x46\xd5\x7d\xca\xf9\x53\xc8\xd8\x2a\xeb\xf8\xd2\xe8\x85\xa0\x0c\x91\x68\xfd\xed\xfe\xbf\xd3\x4c\x5d\x46\xa4\x52\x68\x5a\x53\xab\x97\xd5\x68\x0f\x4e\x15\x48\x4b\x9f\x50\x95\x1f\x58\xb7\xec\x09\xab\x72\x66\x7e\x53\x85\x56\x89\x5e\x8f\x16\x44\xe7\x25\xcd\xe0\x31\xa9\x8e\xac\x5a\xee\xae\x6a\x26\x0b\x56\x9b\x34\x18\xb7\x62\x4e\xa9\xc4\xa7\x46\x35\xc5\x48\x7a\x96\xe3\x6e\xfb\x26\xa6\x98\x4b\xdc\x67\xef\xf7\xa6\x46\xdb\xee\x7d\xe7\x78\x2e\x01\x41\xb2\x90\x69\x5f\xd8\x7b\xc0\x5f\x83\x40\xa2\x2d\xd8\xff\xe1\x47\x25\x9c\x9c\xd2\x6b\x94\xbe\xda\xd4\x1f\xca\x24\xfd\x88\x41\x1c\x67\xff\x32\x86\x5c\xf9\xb9\xb7\xd2\xda\x75\xca\xfb\xa3\x71\xa4\x52\xd7\x05\xf3\x52\x82\x15\x4d\xe8\xf3\x5d\x59\x1c\xeb\x64\xa0\xce\xdf\x76\xeb\xb7\xae\x8e\x1e\xbd\xfb\x35\x23\xf2\xef\x0d\x6d\xc6\xb9\xa2\x7e\xb9\x1a\x69\x5b\x1a\x33\x92\x8a\x8c\x67\xc0\x32\x2f\xcc\xf3\x9b\x5e\x20\x91\x25\x32\x09\xc7\x3d\x04\xce\x27\x70\xc5\x8b\xf9\x58\x49\xfd\x46\xdb\xdd\x6a\xf7\xb2\xdd\x5f\x6f\xb6\xbb\xe7\xc7\x7f\x6d\xbc\x3f\x9f\xa5\x21\x8f\xdd\x12\xd8\x93\xfb\xd2\xd3\xef\x2c\xd9\xa2\x2c\x15\x31\xd9\xe3\xf5\xf3\x66\xb5\x7b\x7c\xde\x8f\x14\x0f\x44\x96\x02\x52\x66\xdd\x9c\x4a\x3d\x10\xf4\x4d\x27\x6c\x96\x4a\x4d\x79\x04\x8a\x61\x2c\x8f\x56\x7f\xbe\xb1\x1a\x2b\xaf\xd8\x52\xea\x79\x4d\xea\x84\xee\x60\x16\xc9\xc8\x38\xe6\xf0\x71\x27\x7c\x36\x49\xb3\x67\x59\x26\x84\xf1\xda\x5b\x65\x4e\x38\xc0\x79\x11\x36\xcb\x14\x27\x38\x40\x89\x9f\xbd\x8c\xe6\x7c\xd5\x8e\x2b\xaf\xff\x31\x76\xa5\x3a\x9f\x2f\x8d\x5d\xb2\x98\xf2\x24\xd8\x4c\x6c\x6e\x26\x44\xc8\xbd\x38\xde\x4b\xd3\x39\xc7\x9b\xf6\xcd\xd9\xb6\xc1\xf3\xce\x84\x4a\x5d\x77\x7c\x17\x15\xdc\x96\x6d\xc4\xfe\x18\x65\xf0\x33\x61\x0c\x78\x4e\xa6\xba\xcd\x67\xdd\x97\x22\x03\x1e\x13\xf9\xa9\xf5\x87\xd0\xd5\xa2\x76\xd5\xaa\x7c\xc5\xe2\x02\x7a\x9c\x01\x28\xea\xe6\xaa\xb1\xad\x31\xff\xc0\xef\x75\x3b\xbd\x6d\xc9\x0d\xa5\xd7\x8a\xbc\x69\x9f\xea\xb3\x6a\x2b\x5f\x5f\xcf\x24\x58\x5e\xd7\x67\x32\xb6\xce\x59\x9e\xf5\x39\x88\x4c\x2a\x13\x26\x3e\x0a\x92\x7f\xe2\xf9\xea\x4c\x04\x67\x76\xe7\x77\x49\x81\x4c\x89\x80\x76\xfe\xcd\xfa\x71\x3b\xfb\x2e\x4a\x72\xca\x62\xd7\x79\xf9\x8e\xd2\x6f\x96\x99\x8e\x05\x78\x01\xce\x63\x55\x36\x15\x89\x9d\xac\x2f\xf7\xa4\x4c\x4b\xc9\x87\x96\x80\xa3\x75\x2c\xfa\xf6\xaf\xc5\xed\x2e\xd3\x98\xfa\x5d\x74\x68\xcf\x10\x19\xb2\x94\x8a\x0f\xcd\x3b\xb6\xea\xed\xa1\xba\xab\xca\x57\xaa\x1f\x8c\x89\x5d\xfc\x58\x13\x50\xfa\x47\xe7\x8d\x2a\xaa\xe6\x54\xe3\x85\x26\xae\xc8\x4c\x20\x28\x95\x61\xcd\xec\x9f\x3c\xf8\x2f\xff\x53\xc6\x51\x56\xba\x54\xce\xe6\xd7\x71\xf6\x58\x06\x38\xd5\x0f\x56\x5a\xef\xaa\x4f\x57\x33\x75\xa9\x86\x70\xa2\xa3\x76\x01\x08\xf1\xff\xf8\x2b\x49\x0b\xe0\x7f\xc5\x16\xdb\xb7\x53\x33\x87\x33\x64\x46\x2b\xea\x1d\xba\x55\x55\x59\x1d\xf2\xbf\x0c\x99\xa7\x2f\x53\x04\x41\x14\xb9\x08\xec\x01\x3f\x9f\xbd\x44\xeb\xb2\x32\x99\x3f\x87\x21\x21\x7f\x9e\xa1\xc5\xec\x0f\xff\x47\xc7\x8d\x49\x48\x7a\x28\x6e\x4b\x9d\x7f\xe4\xfa\x44\xea\x10\x83\xe7\xe7\x06\x87\x81\xa2\xdd\xe1\x1f\xf9\xaf\xea\xaf\x8a\x01\x22\x8c\xb8\xc3\x74\xac\xac\xc4\x9c\xdd\x10\x1b\x2b\x9a\xe0\xc4\xe4\xfb\x2b\x73\xa6\x83\xb1\xfa\xe1\xa5\x5c\x8c\x10\xa1\x54\x24\xe4\xa8\xf3\x1a\x55\x17\xe5\x1b\x42\xd7\x5f\x34\x09\xf8\x68\x47\x84\x26\x21\x1d\xdf\x2b\x28\xdf\x97\xe3\x4e\xc1\x12\x4d\xf4\x21\x45\x7e\xc8\xdb\x11\x21\xa9\x3f\x9c\x85\x14\xe9\xbe\x41\x73\xdb\x34\xa7\xf9\x67\x14\x51\xa8\xa3\x60\x9c\x4b\x18\x3e\xa4\xb7\x1f\x22\x8a\x25\x61\x1e\xa8\x70\xf1\x8c\xcd\xe9\x80\xb3\xba\x90\x88\x52\xcb\xed\xf5\xcd\x76\xf2\xb4\xf9\x2b\x52\x39\x77\x7a\x33\x11\xf0\xc8\x96\x20\xa8\xd1\xcc\x77\xe2\xcc\x38\x61\xba\x71\x82\x20\x83\x87\xfc\xd5\xae\x48\xe7\x58\xd2\x4a\xee\x37\x6e\x11\xa9\x8c\x3a\x48\x1f\xbe\x8d\x3d\x15\xc1\x65\x40\x6f\x79\x8f\xbf\x8e\x45\x55\xe3\x4b\x93\x97\xaf\x9b\x43\x75\x49\xa6\xb7\xbc\xfb\x0a\xde\xf9\x4a\xbd\xbd\xb5\x2d\xfd\x4b\x95\x58\x91\x84\x91\xf7\xed\xbb\x97\x67\x9b\xb2\x1e\xaa\xdd\xa9\x2e\x27\xb2\x9e\xd3\xa7\x4b\x85\xed\x4d\x06\xa5\x6e\x2a\x4a\x1b\xf9\x3b\xcf\x82\x88\x60\x5c\x2e\x8b\xb8\x7a\xfe\x78\xc6\x8f\x9b\xaa\x46\x05\x7d\x65\x5b\x64\x21\xd0\x46\x4d\x99\x9a\x65\x56\x1d\x21\x44\x9a\x51\xbb\x8e\x97\xef\x9a\x4a\xa7\xfa\x55\x2e\x04\x48\x82\x70\x6c\x8f\x55\xef\xd3\x08\xc8\x80\x3a\x48\x3c\x85\xd1\x5e\x55\x48\x38\xf9\x61\x8f\x10\xa0\x32\xa2\xeb\xa7\x3c\x76\x3e\x9f\xe7\x92\x59\x79\x88\xc3\xd9\x16\x6e\x3b\x4f\xd9\x1f\x12\x3c\xd4\x3d\x27\x23\xad\xa7\xcd\x38\x15\x2c\x14\x93\x54\x7e\xda\xbf\x12\x3a\x63\x84\x9b\xb8\xac\x69\xb3\x2f\x75\x65\xbe\xf8\xb2\x1a\xc3\xd0\x29\x20\xd1\x2a\xfe\x89\xe8\x21\x6a\x42\x1b\x0c\x33\xdf\xae\x6e\x73\xf7\xd3\x93\x51\x09\x72\x40\x57\x27\x9d\x53\x5b\xb5\x2d\x47\x3c\x5b\x3c\xd7\x17\xae\xb0\x40\xa5\xc8\xbb\xdc\x1e\x8b\xbc\xfd\x89\xf9\xeb\xdb\x9c\x19\x4f\x08\x13\x6a\xf2\x87\xe8\xa5\xac\x8b\x2e\xfc\xe9\x53\x89\xc2\xb0\x98\x62\x9e\xcd\xf3\xb7\x81\x51\x51\x08\x13\x67\xda\x49\x03\x1c\xf2\x06\xf5\x53\x75\xec\x0f\x25\x01\x55\xf4\xc9\x4d\x7b\xea\xf1\x80\xf6\x28\x04\xa1\xdd\x3b\x1b\x47\x93\x44\x65\xee\x49\x33\xd0\x72\x21\x01\x02\x48\x09\x06\xd2\xf9\xc9\x16\xf0\xeb\xc8\x1f\xbd\xc8\x51\xff\x0b\xca\x41\x73\xc0\x1e\x78\xae\x64\xd5\x2e\x23\x34\x21\x94\x3a\x4b\x46\x22\xdd\xae\x0f\x75\x62\xbc\x17\xb7\x63\x60\x61\x14\x8e\xa9\xc1\x76\x5b\xdf\x03\x05\x4c\x58\xf0\xc7\x2b\xb6\x7f\xe2\x47\x1f\x27\x01\xd3\x18\x39\x91\x88\x19\x3f\x9d\x1b\x10\x05\x40\xc9\xa0\xef\x58\x14\xd5\xb7\xaa\xd0\x8b\xe8\x98\xc5\x0f\x0d\x71\x18\x07\x94\x5f\x53\xc7\x59\x55\x07\x62\x6e\xb9\x58\x3f\x47\x62\x43\xf5\x72\x47\x03\xc4\x60\xa9\xd7\xc1\xb4\x58\xbb\x37\xbb\x5a\xba\xd7\x58\x23\xd5\x73\x5d\xb1\x90\x50\xa1\x8b\x55\x13\xe0\xcc\x11\xa6\xc2\x07\x3e\x3f\xcc\x2e\xc3\x59\x2a\x2d\x08\xad\xfa\xcb\xc8\xd4\x9f\x12\x07\x09\xf3\x9a\x5a\xd4\xbf\xf6\xb3\xce\x5b\x6c\x9e\xb0\xde\xb6\xe8\xa7\x21\x70\x21\x33\x8b\x44\xde\x94\xaf\x79\x89\x58\xcf\x76\x0d\xe0\x60\x93\xb8\x9e\xb2\xc3\x4f\xa4\x6d\x8b\xf0\xde\xf4\xa3\xd0\x4e\x67\xdf\xc1\x84\x93\xf4\x28\x24\x41\x30\xc8\xa1\x8c\xba\x30\xfb\xf3\x93\x2c\x22\x7b\x66\x61\x76\x8f\x65\x91\x97\x38\x81\xcf\x42\x82\x96\x25\x88\xc8\x10\x0a\xfc\xa3\x57\xda\xec\xe7\x7e\x62\x52\xc2\x36\x5d\xed\xbe\x5f\xf9\xb3\xb2\xc0\x66\x0e\x57\x75\x5d\x7d\xee\xa6\xcd\x76\x90\x31\x93\xb9\x72\xcd\x13\x1e\x67\xa6\x04\x44\x10\x1b\xe1\x96\xd2\x4b\xe9\xf2\x27\xff\x46\xbd\x25\x14\x12\x78\xfb\xe3\x46\x43\xc6\xa2\xa4\x7f\xdf\xab\xd7\x6a\x68\x5c\x00\x00\xa4\xd8\xe0\x58\x1d\x29\xaf\xb7\xcb\xdd\x16\xde\x3f\xbe\x0a\x38\xa5\x34\x72\x65\x5b\x59\x9f\x2d\x7d\xe5\x98\x80\x4b\x80\x72\xda\xbd\xdd\x0d\xed\x47\xd1\xce\x8a\xf0\xdb\x43\x38\x0c\x0a\x25\x61\x97\xae\x3c\x6f\xc4\x4b\x83\x13\xa5\x9d\xd9\x5c\xd1\x91\xed\x95\x3a\xd6\xd5\xf1\x0d\x55\xde\xcc\x5a\x0e\x41\xa7\x69\xa8\x46\x06\xe0\xfb\xcf\xf5\xcf\x7c\x1a\x70\x00\xc6\x52\x3b\xea\x23\xd7\x78\xfc\x74\x92\xef\x78\x9e\xed\xc7\x80\x69\x44\x09\x29\xaa\x47\xf9\x15\xee\x8e\x99\x2c\x10\xd8\x93\x8d\x58\x5e\xa4\x8b\xd8\x07\x8c\x4e\x5c\x22\xa2\xdb\xfa\xd7\x6f\x79\x31\xea\x71\x76\x9c\x80\x93\xc5\x25\xc3\x84\xa9\x68\x9c\x59\xdd\x55\x47\xfe\x1d\xeb\x0a\x1b\x82\xb9\xfe\x3e\x87\x26\xc3\x2e\xca\xa1\x12\xf7\x07\xee\xaa\x2d\x18\x6c\xcf\x93\xc9\x29\x59\x64\xe5\x76\xac\x6a\x52\xe7\x2f\xe8\xfe\x50\x62\xb5\x6d\xfd\xbb\xbb\xaa\xab\xf7\xde\x9b\x90\x0c\xa2\xc8\x01\x42\x56\x4a\x0d\xf2\x9f\xc3\x8f\x33\xc8\x44\xd0\xeb\x6f\x5e\x43\x5e\x9c\xc7\x11\x83\xff\x46\x92\x49\xae\xb4\x5f\x62\x37\x88\xbd\x42\x9b\xff\xa9\x48\x23\xdd\x88\x2d\x1a\x78\xbc\xdd\xb2\xc7\x2a\x63\x96\xd0\x6e\x87\xed\xdb\xf3\xd4\x03\xf6\x03\x22\x03\x83\x6a\xf1\x2d\x9d\xdb\x8c\x10\x13\x53\x27\x59\xc6\x89\x85\x73\x1e\xce\x77\xd5\x07\x12\xec\x7c\x0c\x34\x90\x89\x10\x1e\xe2\xd7\x45\x4d\x57\xd8\x36\xb7\xe5\xea\x19\xfe\x7d\x5b\x36\x2d\xe1\x8d\x96\xef\x33\x51\x4c\xbb\x5c\xa0\xdd\xe7\xa8\x09\x7c\xa9\x73\x5f\xc8\x94\x45\x3e\xa7\xef\x71\x13\x14\xf1\xdf\xfa\x46\xd8\x25\x9c\x8a\x4c\x79\x22\xac\x98\xc1\x37\x38\xe0\x5d\xf5\x9a\xab\x99\x89\x94\xa9\x4c\x32\xe5\xdd\x7b\x59\x23\xbc\x5b\xfe\xe3\x5c\xfa\x11\x59\xcc\x7c\x26\x9d\x90\x8d\x77\x50\xce\x9c\x7c\x99\x81\xa1\x37\xf0\x06\xc5\xe8\xa3\x65\xca\x6a\x31\x4f\xb5\x7c\x66\x2f\x21\x43\xc6\xf5\x8c\xe7\xd3\x85\x41\xd5\x40\x86\x22\x08\xc3\x94\x3a\x40\x76\xd3\x60\xd3\x5c\x55\xd5\xfb\x02\xfd\xbe\x1b\x0e\x4c\xb0\x64\xe0\xd2\xd5\xdd\x8c\x82\x16\xeb\xde\x22\x49\x50\x9c\x52\x9d\x56\xdf\x84\x48\x45\x47\x3d\x3b\x52\x99\xcc\xf3\x8f\xee\x0a\x22\x5f\xe8\xc1\xf8\x52\xc7\x86\xb2\x67\x25\x7e\x7e\x49\xae\x3a\x6b\x63\x90\x1a\x18\x35\xc1\x35\xa7\xc3\x50\x36\x91\x5a\x4a\xf2\x64\x6e\x6e\xef\xee\xff\x66\x51\x58\x22\x68\x62\xb4\x27\x37\x09\xca\xd6\x6b\xc2\x37\xb7\x25\x91\x8f\x8f\x40\x90\x12\x51\x52\xcd\xf7\x1a\xda\xdc\x6a\x95\x8c\x23\x19\x69\x82\x24\x73\x36\xeb\xa5\x54\xd5\xe1\x88\x65\xd3\x59\xbf\x11\x2d\xd8\x32\xaf\xbe\x50\x41\x20\x28\x89\x63\x41\xcb\xc3\xf8\x25\xf6\x66\xa1\x02\xcd\x28\xe9\xab\xd1\x74\xb6\x7c\x37\xea\xd2\x70\xf7\xa2\xc2\x80\x2b\xff\xc2\xa1\x79\x77\xa8\xe6\x52\x3b\x46\x8e\x89\x51\x57\x21\x24\x94\x2c\x46\x55\x95\xcf\xd8\x60\xfd\x81\x2b\x0b\xfe\x1a\x2c\xb2\x62\x2a\x71\x2a\x21\xa4\xec\x6b\x71\x57\xd3\xeb\x30\x44\xaa\x4a\x7b\x34\x7b\xf7\x1c\xd5\xb8\xab\xd6\x8d\x8b\x22\xc1\xfd\xcd\x0d\x0c\x6c\x97\x1a\xe2\x42\x45\xdc\xa6\xdc\x3e\x68\x57\xb3\x00\x82\xd9\x8f\x46\x22\x20\xf3\xd3\x19\xe3\x7a\xa3\xba\xa8\xae\x97\xd4\x14\x2a\x82\x8c\xc2\x84\xdd\x66\x75\x3f\x61\xc8\x10\x2a\xd6\x01\xe5\xe1\x3a\x9b\x66\xeb\x92\xd3\xdf\xe6\x91\x45\x77\x6e\x37\xeb\x91\xab\xa0\xb8\x44\xc2\x0a\x78\x78\x9c\xf7\xd8\x7f\x8f\x6c\x54\x1c\xa5\x18\x52\x58\x0e\xab\x71\xdf\xbe\x5d\x88\x3c\x09\x95\x2a\x24\x72\x3b\x8b\xa6\x6e\x9a\x13\x4d\xb6\xd9\x8a\x53\x59\x68\x28\x34\xb3\x5f\xa2\x79\xcb\x8f\xfd\x91\x38\xa1\x80\xd8\xf5\x82\x93\x2e\xe7\xf4\x17\x32\xce\x49\xe5\xed\xb9\xa2\x36\x80\xaa\x2a\xdc\x67\xbf\x39\xcd\xad\x91\xca\x84\x31\xa9\x9f\x49\x35\x19\x96\xa3\x65\x77\x59\xc3\xb1\xdb\x3b\x9a\xbe\x27\x56\x89\x14\x68\x59\x5a\xbc\xe7\x62\x7d\x49\x09\x61\x75\xc8\x5d\xb7\xdc\x4b\x69\xea\xea\xdf\xf8\x45\xd8\xa0\x00\xa5\x89\x6d\x85\x76\x76\x1d\x19\x65\xdc\xb2\x9a\x7d\xe4\x2d\xea\xdb\x32\xff\x22\xaf\xae\x24\x97\x34\xdd\xbe\x43\xab\xde\x36\xaf\xaf\xde\xd7\x52\x52\xca\xc4\x33\x1d\xdd\x96\xf8\x7f\x27\xd2\x79\xee\x3c\x08\x3f\x42\x65\x92\xd2\xe8\x95\x6b\x65\x7f\xec\xa7\x81\x02\xbb\x87\x92\x0c\x65\x03\xfd\x35\x15\x5a\x9e\x6b\xd0\xda\x4a\x89\x54\x55\xd1\x83\xd0\x15\x86\x01\x85\x81\x37\xe7\x62\x56\xb3\x5e\x32\x73\x0a\x53\xbb\x50\xec\xd6\xfa\xa3\x6a\x67\xc5\x73\x85\x8e\xe7\xc3\x21\x90\xbb\xc5\xe4\xf8\x6b\x26\x7a\xfd\x13\x93\xa7\x4c\x10\x12\xba\x61\x0d\xb5\xce\xab\xa2\x7a\xf5\x19\x59\x65\x84\x55\xf8\x74\x45\x1b\xcb\x0e\xbf\xc0\x66\xf0\x1f\x8b\xd1\xa1\x0e\x20\x21\xdf\xfe\xaa\xf6\xb9\x7f\x1d\xea\x98\xf6\xcc\x83\xa5\xf5\x9b\x36\xc9\xe9\x10\x2d\x1a\x05\xdb\x37\x37\x1d\x66\xce\x85\x0e\x8d\x26\x25\x3e\x43\x89\x8b\xd7\x7b\x0f\x64\x9e\x0d\x63\x06\xa8\x01\x45\xe7\x0d\xc8\x82\xa6\x71\x5e\xbe\x5a\xcf\x6c\x7e\xc9\x88\x87\x9e\x59\x6a\xf3\x81\x65\xbb\xab\xc6\x8f\xe8\x07\x25\x29\x95\xc4\x08\xda\x45\xac\x84\xb3\xbc\xaf\x8e\xc3\x58\x3a\xce\xa6\x2d\xaa\x53\x9d\xfb\x9e\xa0\xa5\x72\x98\x8e\x53\x43\x7d\xd1\x87\xf3\xf6\x24\xb5\x97\x7d\xf6\xef\x81\xb3\x80\xcc\xdc\x76\xb5\xfd\xde\xff\x2d\x36\x89\xe9\x8b\x72\xde\xca\x5c\x2a\xba\x0b\xcd\xb5\x85\x0a\x13\x34\xb3\x7b\x96\xa7\x5c\xb5\xa7\x7a\x8a\x63\xd0\x09\xe3\x94\x98\xb8\x26\x79\xbd\xa7\x41\x57\xc0\x1f\x4f\x53\x0a\x72\xf6\x5d\x0c\x54\x57\xc7\xdf\xe3\x05\x74\xd2\x85\xdf\xbd\x72\xd5\x97\x13\x64\x54\x0e\xd5\x29\x8b\xb0\xc7\x6e\x3c\xe0\xe7\xa4\x4e\xa6\x53\xa3\x4d\xec\x59\x61\xbb\xb8\x68\x14\x35\xea\x2c\xb2\x4d\xfb\xaf\xd8\xfe\xc4\xfc\xa6\xae\x0e\x2f\x8d\x5e\xe3\x5c\xf0\x47\x68\xc1\x34\x65\xeb\x7a\xff\x7e\x76\x1c\xe2\x80\xfa\x6d\x89\x6d\xfe\xea\xbc\xc5\x79\x76\x47\x43\x1a\x10\x32\xa8\x73\xcc\xb6\xbf\xd3\x62\x9b\x9d\x96\x45\x89\x6f\xa7\xf1\x80\x9d\xdf\x55\xfb\xb4\x0c\xb9\x8c\x7b\xa4\x04\x35\x59\x4f\xaf\xd8\xc5\xb1\xda\x7f\xd6\x55\x51\xf8\xf2\xb4\x7f\x27\x8a\x71\xea\x37\x73\x69\x1b\x4d\xb3\xd8\x1d\xd3\x90\x52\x33\xc6\x9e\x78\x32\x67\x5e\xaa\xc6\x50\x11\x05\xa2\x3c\x9d\xbf\xa6\x3f\xd0\x28\x53\x66\xdb\x34\x7c\x6d\xdf\x82\xba\xfa\xab\x68\x65\x91\xd2\x6f\x50\x5f\xca\x2b\x2c\x9a\x73\x6d\x98\x66\xac\x77\xa1\x9f\x4f\xe5\xa8\x1d\x43\x9b\x2c\x14\x66\xf0\x32\x6f\xc6\xb1\xc6\x57\xd7\x03\x8b\x15\x6d\x5c\x33\xdb\xfa\x0d\xca\x12\x8b\x7b\xf8\x75\xc1\x9f\x26\x30\x08\x81\xe6\x9f\x3c\x9d\xb7\x47\x50\xd8\xed\x99\x2f\xd6\x55\xf9\x63\xa1\xb8\x92\xf9\xd3\x62\x24\xd2\x14\x5f\x96\xdd\xb6\x27\xf5\x6e\x69\xa6\xcc\xd4\x18\x4d\x6f\x0e\x43\x6e\x53\xbf\xaa\xca\xcb\xd5\x2b\x7e\xcd\x06\xe7\xc7\x27\xd2\xf1\x89\x35\x27\xbc\xc6\x9e\x26\xf3\x0f\x7f\x1c\x20\x88\x06\x4e\xed\x65\xb8\x0b\xb2\x80\xc3\xd0\xf2\xf8\xa5\x90\xb2\x40\x26\x02\xe3\x68\x3b\xa6\xf9\xc4\xe9\x5d\x45\x2c\xa3\x1a\xe1\xb7\xdb\xeb\xdb\xeb\xd5\x3f\xfd\xcd\x44\x60\x75\x13\xf2\x66\x5d\x1d\x8e\x8e\xd1\xf6\xb1\x2c\x88\x23\xef\xaa\xb3\x54\x16\x92\xed\x87\x23\xd3\x72\x80\x0c\x8c\xea\xa5\x18\x21\x06\x4e\x7f\xea\xa1\xd2\xb8\xab\x2e\xe8\xa3\xdc\xc0\x38\xce\x08\xb9\xf6\x78\xb4\x91\xf5\x1f\x4b\x5c\x32\x18\xeb\x40\x64\x7d\xa9\xca\xa3\x22\xa7\x8f\xce\x33\x90\x3d\x93\x59\x75\xc4\xba\x3d\x13\xc6\xa0\x5b\xef\x34\x8f\x5c\x5e\xf3\xbe\xd2\x56\x10\xcc\x4d\x8b\x0b\xeb\xe6\x79\x2c\xfd\x5c\xe1\xc8\x54\xec\x60\xfe\xd6\x21\xbf\x2d\x9f\x88\xed\xdf\x3f\x6d\x12\x72\x6a\x1a\x70\x45\x83\xd9\x23\x26\xa0\xac\x88\x27\x48\xa2\x5b\x72\x45\xac\x2f\x26\x4c\x82\xda\x02\x91\x42\x3e\x69\xfa\xc7\xc4\x84\xda\xed\xe3\x7b\x18\x29\xfe\x08\x4c\x03\xec\x25\x95\x2b\x28\x49\x9c\x01\xdb\x31\x6a\xf8\x6f\xd2\x29\x2e\x9b\x41\x4c\x19\xa3\xdc\x83\x82\x09\xdc\x11\xd3\xd4\x4a\x5c\x3e\xfe\xb8\xdd\x5e\x3d\x3e\xfe\xb9\xb9\x76\xe2\x79\xfd\x00\x30\x04\xeb\xda\xef\xed\x86\x5a\x63\x0b\xf5\xf9\x1b\x96\xe4\xf3\x4e\x9f\x3b\x55\x41\x62\x21\x20\x87\xe3\x37\x6c\xaf\xa1\x85\x5d\x65\xc1\x3a\x5f\xdc\x15\x32\x9a\xea\x57\x88\xf5\x88\xab\x05\x33\x9e\xc6\xbd\x2c\x06\x39\xc0\xfa\x1a\x9b\x36\x2f\x29\xf2\xa1\x92\xd8\xf4\x97\x05\xb7\xb8\xdb\xa6\xad\x6a\x9c\x94\xdd\x50\x08\x46\xf9\x9b\xcd\xe6\xde\x5f\x5e\xe8\x90\x42\x13\x43\x42\x69\x63\x14\x0b\x76\xb3\x39\x1c\x55\x6d\xac\xeb\x30\x00\xe9\x67\x0e\xd6\xec\xc3\xcb\x20\x26\x8c\xe9\x1b\x34\x6f\x13\x36\x69\x9b\x07\x4d\x62\xcf\x32\xe3\xc7\x73\x1e\xba\xdc\x92\x57\x93\xe1\x93\xdd\x1f\x15\x04\x04\x99\x7a\xbd\xbd\xde\xfb\x7b\xd4\x89\x85\x2f\xf5\x9c\x96\x9d\xcd\xeb\xf6\xde\x9e\x9c\x6a\xfa\x96\xb5\x88\xd0\x19\x94\x9f\x90\x53\x4b\xb8\xd5\x18\x99\x8f\x33\x82\xee\xc6\x6d\x5c\x57\xa7\xe2\xfd\xeb\xa2\x2a\x9a\xd4\xf6\x16\xe7\xa5\x41\x35\xc3\x4a\x98\x30\x60\x84\x3e\xa7\x5b\x7b\xaa\x51\xe7\xaa\xf5\xa4\x48\x26\x8c\x39\x27\x3e\xfd\x52\xc2\xac\xe6\x65\x42\xe3\x5c\x7f\xb7\x6f\xb9\x05\xef\x67\xc1\xcb\xcd\x6e\xd9\xa8\x1b\x16\x64\x84\x67\xa7\x27\xfb\x09\xfe\x83\x1a\x16\x5b\x22\x3c\x53\x23\xfe\x1b\x89\xab\x60\x76\x22\x4f\x94\x9e\x82\x53\x6e\x6d\x62\xf3\xb7\x18\x15\x7f\x76\x16\x50\x92\xe4\xcd\x36\xd0\xde\xea\x5f\xb3\x07\x62\x9a\x13\x0c\xe1\x00\xbf\xa8\x33\x0f\xb5\x7d\x96\xbc\x7c\x1d\xd1\xfe\xb9\xc1\x51\x90\x19\x17\xbc\xd8\x8f\x5a\xd5\x0b\x2a\x0e\xc2\x44\xa9\xa2\x72\xcf\xb3\xa7\x2b\xf3\x17\x88\x13\xeb\x4c\xba\x4f\xb8\x6f\x7f\x2d\x75\x39\x98\x38\x53\x4e\xd9\xbc\x36\x55\x7d\x58\x4d\x64\x49\x96\xf8\x0d\x4d\x2c\xb9\x62\x3d\xdd\xd4\x48\x1e\x45\x98\x24\xe4\x9a\xf8\xea\xa0\x7c\x7f\xae\x8a\x62\x4c\x3f\x2d\x4c\x22\x12\x3d\x20\x54\xf1\xb7\x7c\x63\x26\x0d\x05\xe9\xe5\x1d\xeb\xea\x50\x51\xf5\xe1\xd1\xac\x0b\xc8\x0f\x30\x8f\x2c\x4c\xaa\x59\xcc\x1c\xb6\xab\xaa\x71\x55\x14\x24\x66\xdd\xb4\xd8\xcb\xbf\x4f\x9f\x20\x13\x29\x9f\xa0\xb8\x9a\xb5\xa5\x09\xf1\x77\x2a\x12\x46\x6d\xb8\x5b\x2c\x8a\xb9\x6a\xd2\xf4\xb7\x85\xb6\x00\x19\x4a\xf3\xe7\x65\x83\x75\xbb\x37\x79\xa9\x1f\xaa\xef\x79\xd9\xae\xda\x7e\xe9\xbb\xf1\xc0\x02\xcb\xbf\x0e\xc7\xa1\x2d\xd8\x80\xe2\x24\x4c\x76\x75\xfb\xe2\xff\x24\x03\xab\x15\xe3\xbd\xb6\x7d\x65\xf6\xae\xac\x31\xa7\xbc\x33\x32\x32\x64\x05\xae\x1e\x1f\xff\xb5\xfa\xbe\xdb\xf4\x75\x3b\x23\x53\x99\xa9\x21\x92\xdf\xd7\xae\x7a\xdc\x1f\x47\x9b\xd1\xb6\x1e\x3d\xc1\x63\xa0\xc5\x3b\xfc\xc0\xe2\xb1\xec\xe7\x22\x42\xe4\x25\x9a\x3a\xb7\xe1\xd2\xe8\x1a\x44\x49\xb0\xae\x6f\xc4\x2e\x80\xaf\x55\x7d\xb6\x19\xe3\xc9\x37\x35\xdc\xf8\x8c\x17\x49\x3d\x5d\x61\x7b\x8d\x2d\xe4\xc5\x85\x31\xf5\x27\x28\x9e\xda\xc9\xfd\x01\x45\x55\xb5\xdb\x4f\x4f\xb3\x0f\x41\x10\x6a\xb4\xa2\xbe\x1f\xd5\x3b\x5e\x8d\x18\x1f\x16\xcd\x02\x04\x41\x92\x10\x29\xd1\xf1\x24\x8b\x5c\x79\x94\x5c\x7f\x39\x90\x49\xd0\xb3\xef\xaf\x5c\x01\xc9\x41\x6b\x67\x26\xde\x19\x3e\x08\xc2\x54\xc8\x11\x9b\xfe\x1f\xd3\x1f\x64\x01\x0b\x75\x8f\x93\x9d\x3a\xf0\x93\x07\x85\x80\x09\x45\xc9\xde\x4f\xcc\xbd\x86\x18\x04\x4c\x59\x0e\x9b\xfb\xc7\xe7\xdd\x4b\xff\x47\x14\x64\x17\xd6\x55\x5e\xaa\xbc\xa6\x08\x2a\xaf\x4a\x52\xaf\xea\xc7\x98\x80\x50\x0f\x7b\x55\x95\x0a\xda\x85\x0c\x03\x04\x51\xa0\x68\x66\x60\xa9\x6d\xcd\x20\x2f\x5f\x27\xea\xb7\x10\x44\x91\x41\x17\x83\xac\x4a\xfd\x95\x26\xcd\x82\x3a\x1b\x04\x71\x18\x98\xa1\xef\x72\xf3\x6b\xea\xe0\x66\x7e\x54\x6c\x89\x93\x1a\x6c\xaf\xeb\xea\x68\xb1\xea\xbe\x70\x0b\x01\x4f\x33\x4a\x69\xdf\x5f\x8f\xfb\xe3\x20\x48\xb8\xe5\xbb\xb3\x22\xa1\x7a\xf6\xd6\x93\xd4\x70\xe1\x61\xb5\x5b\x2c\xf5\x40\x00\x02\x41\xca\x35\x58\x02\x52\x8d\xf5\x21\x2f\x91\x3c\xe3\xd2\xa3\xdf\x67\x12\x3f\x10\x64\xa1\x4d\x27\x3f\x7d\x7f\xdc\x3c\xdc\xfe\x73\xff\xf4\xe8\xe9\xef\x21\xc8\x12\xab\x80\x6e\x19\xce\xc6\x30\x10\x08\xb2\x54\x52\xf6\xae\x07\x2f\xad\xda\xdd\xf9\xf8\xfb\x04\x24\x04\x59\x16\xd0\x59\xcd\x9b\x6d\x05\x25\xa9\x9b\xe9\x44\xc9\x0c\xa3\x57\xa6\x3b\xf7\xeb\x40\x06\xce\x65\x20\xb1\x1e\xd5\x68\x20\x10\x5c\x84\xe8\x73\x1f\x45\x71\x53\x54\x33\xc5\x0b\x08\x80\xa5\xe4\xe7\xce\xeb\x98\x4f\x35\xde\xe4\x75\xd3\x0e\x79\x75\x08\x20\x56\xc4\x19\xb9\x6f\xc0\xe0\x37\x68\xb6\x2d\xb4\xb9\x9a\x34\x4b\x8e\xbf\x3f\x88\x08\xb2\x81\x85\xf1\xb1\xc4\xb1\x4a\x0e\x04\x52\xa4\x99\x87\x7f\xe7\xed\xa9\x80\xbc\xc6\x7d\xf7\x2d\x5a\xdc\xa7\xb3\xdb\x94\x60\x28\x0a\x77\x7d\x78\x63\x74\x32\x04\x52\x42\xec\xc2\x84\x53\x6f\x1a\xa4\x62\x26\x1e\x71\xa9\x41\x3d\x96\x9c\x83\x40\x9a\x80\x42\x80\x4f\xcc\x7b\x8d\x84\xa1\x66\xd9\x1d\xb7\xb4\x67\x87\x89\x10\xe4\xa4\x3b\x08\x02\x15\xa6\x24\x4c\x86\xaa\xea\xbe\x53\x18\xf5\x07\x84\x24\x65\xad\x83\x1a\xc6\x1a\x9e\xd9\xfe\x93\x52\x5f\xe7\xcd\xf1\x34\x03\x0b\x43\xa0\x99\xb0\xd8\x0b\x68\xde\xee\x7d\x9e\xd0\x9f\xae\xe3\x84\x7c\xc9\xab\x6a\xd6\x49\xe7\x8f\x8b\x98\xde\xf6\x95\xca\x5f\x61\xe4\x3d\x43\xa0\x4d\x6c\x35\xca\x4f\x87\x81\x22\xaf\x37\x5f\x18\x18\x3e\x12\x89\xb2\x5d\x02\x4b\x29\x61\x08\x30\x51\x4a\xf4\x43\xe7\x44\x68\x33\x6b\x86\x22\xa2\x62\x85\xf7\xdc\x3c\x6c\x7c\x3a\xca\x70\xe9\xd5\x38\xaf\xa1\x7e\x2f\x2b\x8d\x57\xd5\x2c\xb7\x0d\x81\x91\x86\x00\x9e\xfb\x06\x0a\x1c\xd7\xe1\xa1\x73\x2c\xa9\x72\x8e\xdd\xe4\xb5\x6b\xdd\xa7\xf9\x28\x77\xe6\x87\x25\x56\x91\xf7\x68\x61\xe8\x63\x79\x55\x08\x03\x2d\xe3\xb1\x8e\xca\xa6\x7d\xfb\x0e\xa5\x2e\x6c\x28\x40\x29\xfb\xa5\x98\x1b\xc2\x90\x69\xee\x26\x5e\x17\xdc\x6c\xfe\xef\x94\x4f\xb1\xa3\x10\x86\x09\xd3\x2e\x2d\x7f\x73\x18\xf3\x99\x43\x18\x0a\xe4\x54\x11\xd9\x5c\x8d\xa9\x9d\x20\x0c\x51\xe9\x11\xa0\xaf\x8b\xa3\xfd\x21\x16\xc7\x14\x84\xdf\x50\x32\xfe\xdb\xa9\x57\xb0\x82\x30\x02\x4e\x5d\x79\x85\xa3\x1a\x74\x7f\x8e\x75\x42\xfb\x40\xfb\x55\x35\x12\x42\x1e\x02\x85\xa1\x9e\xab\x64\x84\x2a\x87\x90\xa7\x3a\x76\x91\xe8\x4f\x94\xdf\x72\x63\x5d\xd1\x05\xe6\x1d\x08\x39\x72\xaf\x27\x41\xfe\xc1\xb8\xe7\x08\x42\x6e\x14\x85\x59\x3b\x32\x5a\xba\x3a\x35\xed\xf8\xa9\x13\x40\xe2\x4b\xff\x79\xb5\xd9\xf5\x7f\xd3\x09\x81\x4c\x0e\xf9\x44\xae\x0b\xc2\x04\x03\xcb\x0e\xea\xb4\xa9\x02\xee\x8f\xa4\x68\x1d\x6c\xe7\xcb\x12\x86\x26\xf4\x07\xb3\x20\x52\xa1\xd7\x89\x3d\x1f\xdb\xea\x1f\x79\xf9\x5a\x7c\xc1\x5a\x0e\x61\x16\x82\x4a\xe6\xbc\x75\x8b\xd3\x3d\x04\xc6\x7c\x6f\x86\x6f\xc5\xec\x6c\x86\xe5\x91\xe9\x6d\x5e\x08\x3a\xa6\xd4\x7b\x89\x9f\x73\x8d\x4b\x08\xc1\x64\xd6\x39\x79\x83\x06\xe3\xb1\xb5\x0a\x65\x1c\x6b\xd7\xa6\x41\x7c\x0a\xcf\x54\xda\xfc\xe2\x7b\xca\x84\xb1\xd0\x25\x57\x5f\xca\x7b\x68\xde\x51\x7f\x3b\x6d\xa0\x2e\xf3\xf2\x75\xb9\xb4\x09\xa1\x0a\x98\x95\x72\xfa\xb0\xae\xc0\xc5\x36\xb5\x94\x54\xf1\xe7\x46\xd2\xb7\x89\x53\x6a\xc6\x26\x8c\xbf\xf8\x1d\x25\xd1\xcd\x91\xed\xe9\x78\xac\xea\x16\xf5\x73\x45\xdf\x60\xb4\x24\x95\x16\x84\x72\x3a\x95\x79\xcf\x6a\xdc\xbd\x30\x77\x58\x67\x3a\x1e\x0a\x2e\xab\x53\x5b\xd5\xb9\x06\xbd\x29\x50\xb5\x55\xe7\xda\x2e\x69\x64\x41\x68\xb2\x94\x32\x97\xc7\x41\x96\xc1\x5f\xd1\x68\x41\xdb\xc5\x67\x4e\x0e\xe1\xfc\xa1\x27\xd7\x61\x81\xb0\x94\xa0\x56\x0e\x7a\x68\x49\x9c\xc3\xc9\x80\x05\x5a\x43\xec\x89\x90\x4a\xf4\xfd\x10\xd3\xcb\x85\xda\x32\x79\xac\xab\xc3\x61\x04\x33\x18\x6f\xa6\x2c\x0a\x33\x92\xa6\xa6\x62\x23\xe9\x49\x10\x41\xe4\xba\xf7\x85\x59\x94\x80\x17\x06\xba\x3f\x0f\x18\xcf\xc9\x34\x65\x9c\x2b\x4a\xdf\x14\xf9\xff\x9d\x72\xed\xaa\xc7\x43\xb6\x18\x18\x07\x4e\x65\x53\x2a\xb9\xb8\xac\xeb\x0e\xca\xf7\x45\xaf\x25\xf3\x27\x69\xcb\x75\x5b\x54\xe5\xeb\x45\x42\x14\x58\x9a\xa1\x67\xba\x1a\xc8\xf7\x17\x67\x07\xcb\xb8\xa1\x6a\x21\xd5\xa1\xa0\x70\xab\xe8\xb6\xec\x4b\xe6\xc0\xb2\x04\xc9\xe7\xef\x0c\x9a\x47\xb8\xcf\x96\x19\x13\x01\x73\x45\xf0\x37\x28\x47\x7b\x21\x83\x34\xf2\xa8\x15\xb7\x95\xdf\x41\xd3\x4e\x5b\x77\xa6\x2b\x9b\x81\xb0\x41\x38\x29\xcf\xfe\x57\x55\xe2\xf6\xad\x72\x1b\x82\xff\x80\x20\x03\x8a\xd3\x9c\xa7\x4b\xe2\xb6\x1f\x33\x11\x5a\x3f\x14\x91\x39\xee\xf2\x6f\x90\x7f\x15\xa7\x30\xcd\x15\xf9\x46\xf7\xb7\x0f\x57\x9b\xdd\xfe\x88\xf5\xee\x9f\xfe\x19\x30\xb3\x30\x37\x1b\xc3\x74\x5b\x62\x33\x9a\x06\x28\xb9\xd5\x4d\x6a\x36\xce\x35\x9e\x3e\x0e\x22\x27\xc7\xf9\x76\xfd\xe8\x52\x7b\xfb\xd5\xfd\xe3\xcb\xc3\xae\xbf\x00\x26\x54\xe4\xb2\x8e\xcf\xf0\x57\x29\xe3\xd1\x1e\xe9\x40\x03\x23\x57\x9d\x19\x10\x7c\x60\x72\x68\x17\x32\x1a\x10\x05\xa1\xa0\xad\xcd\x7c\x6a\xf7\x6d\x57\x8e\xb1\x63\x61\xd2\x47\x01\xe3\x84\x15\xc2\x63\xde\x5d\x07\xeb\xfd\x67\x55\xbf\x37\xd4\x23\xe5\xaf\xc8\xa2\x38\x73\xc4\xd7\xe6\x65\xb6\xfb\x46\x2c\xb1\x10\xc4\xb7\xea\x73\xc0\x06\x40\x14\x81\x15\x4e\xfb\x71\x35\xde\x77\xa3\x98\x71\xf2\xbf\x4e\x8d\x26\x81\x8a\xb1\x05\x8e\xe2\x38\x22\x98\xc1\xdd\x59\xe7\x30\x9c\x12\xdb\xfa\xe3\xbe\x86\xcf\xbf\x55\x5b\x81\x28\x4e\x34\xa5\xd5\x56\x35\x96\x30\xf2\x51\xa2\x58\x59\xb2\xc8\x06\xdb\x7a\x9e\x0b\x87\x88\x47\x82\xf1\x41\xa5\xe8\xda\x56\x50\xfd\xb9\x3c\x8d\xa9\x79\x48\x53\xd5\xf0\xd1\x98\x91\xc2\xd9\xf4\x95\x70\x19\x52\xc7\xe2\xee\xd7\x3d\x36\x0d\xcc\xb4\x74\xb3\xd9\xcd\x72\x15\xc8\x01\x0e\xbb\xc5\xce\xc0\x92\x90\x38\xbb\x46\x68\xdf\x96\xf7\xcd\x88\x9b\x88\x22\x26\xcc\x8f\x83\xb2\x25\x75\x9c\x7e\x05\xfa\x9d\xfe\x6a\x12\x44\x44\xa8\x70\xa2\xee\xad\xfb\x4d\xef\x33\x45\x89\x89\xad\xde\x5f\xeb\xb7\x8a\x28\x0d\x53\x15\x78\xeb\x52\xdf\x84\x37\x6c\x29\xd6\x8d\xd2\x44\xd0\x99\x6b\xfc\x77\x7f\x66\x9a\x46\xe1\xb0\x15\x15\xe7\x19\x8c\x67\xf6\xe6\x52\x05\x64\xcb\x7d\x2e\x78\xdb\xc2\xb6\x95\xcb\x86\x2c\xca\x12\x0b\x0e\x3b\xba\xba\xc5\xad\xde\x55\x4b\xe8\x68\x88\xb2\x34\x8e\xba\x91\xdf\x6a\x90\x2f\xa5\x87\xab\xe8\x91\xcc\x38\x44\x99\xe2\x14\xf1\x41\x59\x56\xa7\x52\x79\xb4\x19\x44\x22\x94\xd2\x79\x3b\x83\x94\x67\x7f\x50\x80\xb6\x55\xbc\xdb\xb2\x0b\x4f\xb6\xe3\x95\x28\x93\xc0\x29\xa2\x7e\xfe\x18\x64\x6b\x20\x52\x41\x90\x78\x1c\x49\x75\x5c\x62\xec\x81\x48\x07\x4a\x5a\x92\xa1\x16\xcb\xee\x91\xee\x87\xb5\xa5\x95\xed\x89\xa7\xea\x71\x67\x03\x48\xa0\xc7\x1d\x44\xc9\xc9\xc3\xf1\xba\x07\xbd\xc5\x8e\x10\x0d\x55\x49\x0f\xf0\x8e\xa3\x60\x6c\xfa\xbb\x26\x0e\xc9\x0b\x92\xf8\x9a\x97\xeb\x4a\xa3\x33\xdc\xfe\x30\x4f\x28\x05\xe6\xe4\xee\x4b\x28\xe8\x89\xd9\x70\x1c\xc2\x1e\xf3\xe9\x18\xc1\xf3\xe1\x16\x4c\x66\x98\x1a\xc1\x9d\xbc\x2c\xea\xcf\xcd\xed\xfc\x3e\x32\x43\x13\xc7\xb6\x2b\xe5\xe5\xeb\xd6\xa9\x24\xdd\xe5\x25\xc2\x00\xc8\xfe\x5d\x0d\x06\x22\xa3\x42\x4a\x03\x52\x37\xc9\x65\xc3\xe6\x6c\xf6\x19\x9d\x11\xbe\xa7\x8b\x80\xd7\x6f\x70\x38\x0e\x1b\x6c\x64\xb4\x24\x1b\xe8\x64\x4d\x56\xf5\x17\x29\xa6\x38\x00\x00\x67\x62\xbe\xe5\x1f\xb8\xfa\x9c\x49\xdd\x43\x1c\xc6\x86\xa8\x92\x0c\xe4\x3d\x2f\x08\xc4\xa1\x56\xdc\x25\xff\x3e\x09\x36\xf1\x58\xce\x82\xd7\x98\xf1\x88\xf6\xc0\x5b\x55\xed\xad\x5f\x84\x7a\x9c\xf9\x83\x98\x09\x43\x35\xfd\x57\xcf\xb8\xd9\xbb\xdd\xd4\xa6\x38\xbb\x9c\xb2\x3a\xe0\x35\x92\x74\xf4\xf6\x74\xc4\x9a\x30\x4c\x3f\xaa\xb9\x69\x8c\x99\xd1\x84\x86\x7e\xa3\xa0\xad\xdb\xd0\xfb\xb6\x52\x37\x22\x4a\x25\xb9\x15\x7f\x3e\xfe\xb9\xf6\x7f\x8b\x43\x4e\xc9\x3e\x22\x00\xd5\x88\x87\x8b\xda\x2b\xc4\x71\xcc\xc8\xd1\x7b\x46\x68\x9a\x1e\xa3\xb9\xbc\xe4\xe3\x98\x8b\xc8\xf5\x34\x2f\xdb\xde\x38\x96\x56\x22\xeb\xa5\xc1\xda\x6a\x33\xf6\xd2\x53\x5f\x5d\xd3\x24\x64\x73\x9e\x37\xbb\xef\x9b\x07\x1f\xc7\xc4\x9c\x09\x8b\xea\x68\xab\xa3\xf3\x35\x9e\x0a\x50\x23\xa9\x43\x88\x79\x6c\x21\x39\x5e\xe8\xeb\xd7\xa6\x6c\xeb\x7c\x86\x31\x83\x98\xa7\x9a\x3c\xc2\x2b\x2a\x88\x8c\x76\xc9\x98\xcb\x80\xc0\x09\xed\x17\xfb\x9a\x1b\x96\x84\x7d\x11\x93\x72\xf3\x63\x3f\x3e\x4e\x22\x50\x63\xa6\xf9\x49\x07\xd0\x45\x8d\x72\xa1\xa7\x11\xe2\x24\x0d\x68\xd1\x57\x65\xe1\xaa\xbf\x9d\xef\xf6\xb1\x00\xdf\x81\x38\x01\x4d\xd0\x01\xfc\x85\xb5\xca\x1b\xbc\xab\x86\x20\x69\x2c\x25\x93\xfe\xcf\x98\x06\x20\x62\x1e\xf9\x05\x71\x1a\xa4\x14\xa0\x79\x96\xd9\x6e\x22\x3b\x81\xd4\x3f\x2e\x23\x9f\x38\x75\x78\xda\xbc\x74\xc1\xfa\x18\x2c\x03\x71\xc6\x22\xca\x9e\x6e\xab\x53\x49\xea\x13\xcd\x65\x03\x23\xc4\x19\xcf\x6c\x4d\xea\x54\xaa\x7d\xb0\x0e\x36\xfd\xe9\xa9\x95\x9d\x2a\xf1\x73\x0d\x87\x23\xe4\xaf\xe5\x18\x49\x2e\x96\x9a\x4c\x21\x16\x81\xc5\x1f\x6c\x8f\x27\xbd\xab\x9e\xab\x16\xda\x4b\x25\x31\x3f\x16\x99\x07\xfc\xae\xda\xb6\xb2\xf3\xdb\x71\x50\x5a\xa0\xea\xf4\x63\x00\x4f\x85\xad\x1b\x97\x57\x9d\x15\xb8\xd4\x0a\x87\x58\x2a\x4d\x89\x08\x97\xab\xb3\xb2\x1a\xee\x98\x62\x16\xb5\xe3\x84\x78\xc7\x91\x93\xa7\xb5\xa3\xce\xf4\x12\x8a\x45\xdc\x04\xc4\x2a\x63\x94\xaf\xda\x7f\x35\x2d\x17\x02\xd4\x58\x07\x8a\xf6\x4f\x4b\xe5\xd0\x5c\x6c\xc2\xb1\xe6\x29\xb5\xb7\x83\xd6\x5b\x2c\x26\x3e\xce\xef\xad\x78\x8c\xa1\xa2\x09\xe3\x38\x88\x28\x15\xfb\x9f\xad\x4f\xbf\xc4\x06\x61\x44\xfc\xb3\x69\xd4\x09\x0b\x58\xfe\x18\x3c\x30\x82\x80\x25\xa0\xb5\xb5\xe4\xa7\x7a\x59\xa2\x0a\x78\xc8\x04\x99\x3c\xb4\xc8\x54\xdb\xdd\xee\x77\x32\x1e\x42\x32\xe2\x0e\x7a\xb6\x94\x8c\x97\xfb\x29\x0f\xa5\x25\x0a\xf5\x49\x8b\x09\x18\xd1\x8d\x61\x51\xe4\x29\xa7\x9e\xa0\x6e\x4b\xac\xff\xf3\x54\x8d\xfc\xf5\xe9\x15\x59\x92\x65\xa3\x82\xe3\xfa\xac\x26\xe9\x7c\x1e\x69\x61\x22\xdf\x4b\x0e\x75\x0b\x65\xf3\x58\xee\xde\xd0\x42\xb1\x0c\x51\x6a\x4f\x9f\x94\xc7\x51\x3a\x22\x6f\xad\xa1\x54\x13\x30\xee\xec\x06\xb8\xb0\xcc\x2e\xa5\x53\xaa\x6e\x9c\xd3\xd5\xef\x65\x3c\x49\x2d\x8f\x74\x67\xaf\xde\xf2\x42\xd7\x58\xba\xbc\xdc\x64\xa2\xf1\x24\x4d\x22\x17\x4f\x5f\xe5\xba\xef\xbb\x75\x3c\x04\xc0\x13\x93\xd8\x44\x46\xbf\xdc\x79\xca\x2c\xac\xff\xae\x7a\xed\x0d\xfb\xa6\xd4\xe3\x17\x90\x72\x4b\x2f\xf4\xe7\xe3\xf3\xe6\xcf\xf5\xf7\x95\x6f\x3d\x04\x2e\x20\xa5\x89\x2d\xcb\x90\x65\xfb\x03\x1c\xf7\x6d\xb5\xff\x16\xce\xee\x4a\x98\x94\xd8\xcd\xd7\x6f\x5d\xec\x5a\xb5\x9e\xbe\x81\xba\xbe\x68\x7b\xc5\x5f\x79\x7b\x21\x18\x02\x1c\x24\x8c\x9d\xa3\xd7\xb7\xf6\xea\x62\x66\x8f\xc4\xfc\x81\xcb\x00\x89\x99\x70\xfd\xb4\xde\xdc\xaa\xca\x4b\x77\xbb\xa3\x2a\x02\xa1\x67\xc4\x27\x17\x5d\xf7\xc0\x95\x90\x7a\xd4\x7b\xfb\x8c\xcb\x6d\x11\xcb\x6b\x8b\x2b\xc9\x28\x65\x6e\x6d\xde\xca\x6d\xab\x17\x83\x04\xad\xed\x67\x84\x82\x56\x9f\x93\xce\x70\x87\x91\x65\x9e\xd8\x6e\xfb\x96\x1f\x1d\x86\x6f\xbc\x49\x71\x54\x96\xcb\x51\x56\x75\x5d\x7d\xe2\x22\x9a\x1f\xb8\x89\x30\x4e\xc6\x3d\xdd\x57\x36\xeb\x3b\x1d\x96\x84\x81\xb5\xa8\x0a\x0a\x65\xa1\xf2\xfe\x00\x8b\x45\x34\xa1\x2b\xf6\xc2\x2b\xd4\xa2\xf2\xc3\xd9\x25\x3f\x3a\x0b\x03\x35\x80\x30\x7f\xb5\x4f\x6f\xbd\x1e\x21\x24\x21\x08\xda\xdb\x2d\x95\x62\x3f\xb7\x13\xc6\xb2\x2c\x76\x62\x88\xe5\xc9\x00\xe1\x4b\xeb\x69\xd1\x22\x61\x4c\x7b\xf6\x48\xfb\x20\x96\x41\xa9\x99\x3d\x08\xe3\x86\xa4\x03\x7e\x52\x85\xac\x37\xe1\x09\x13\x61\x38\x6e\x1c\x0c\x59\xb7\x6f\x75\xdf\xdf\x3b\xda\x49\x94\x84\x94\x7e\xa1\x58\xb5\xff\xa3\xd0\x94\xee\x6e\xe8\xf3\xd0\xc6\x11\xf6\xc7\xc0\x4e\x93\xee\x96\xac\xf7\x8f\x7a\x7b\x3a\x5c\x9d\x27\xfb\xcb\xd4\x06\x26\x91\x46\xfa\x95\x51\xea\xff\x1f\xa0\xde\x8f\x95\xff\xb0\x49\x9c\x89\x9e\x03\xce\x56\x34\xe6\x94\xd7\x6e\x20\x37\xc0\xb8\x47\x89\xd7\x9d\xd9\x6c\x49\x49\x42\x11\x8b\x86\xdd\xc1\xa6\x67\x24\x3a\x05\x5b\x97\xfc\xf3\x76\xfd\xf8\xa5\x47\xb3\xe8\x32\x75\x96\x85\x6a\x4b\x1e\x7b\xe0\x26\x5c\x17\x21\x6f\xdb\xaa\x86\xd7\x19\x13\x00\x24\x59\x22\x68\x7f\x7a\xca\xcb\xff\x7a\xcb\xc7\x9f\x43\x44\x16\xfb\x01\x5a\x37\x07\xa8\x7b\x4d\x83\xd5\x04\xc2\xe8\x07\xbb\x14\xbc\x4d\x13\x58\xad\xfe\x4b\xc5\x42\x48\x20\x45\x2a\x19\xad\x1e\x57\x57\xab\x87\x3f\xfd\x6f\x81\x51\x3c\xf0\xf9\x7d\xd5\x85\x7e\x1f\xd8\x8c\x52\x18\x89\x64\x19\x7d\xe3\x12\x4f\x75\x45\xea\xf5\xcb\x9a\x3c\x90\x48\x6e\xbc\x44\x1b\x59\xe1\xbf\x4a\x37\xfb\xd3\x24\x7a\x36\x68\xfb\x81\xb6\x7d\x45\x68\x35\x65\x11\x82\x44\x25\xb1\x6d\xe5\xb0\xac\xd6\x08\x6e\x47\x18\x95\xb7\x13\x05\x09\xf9\x4a\xab\xbb\xeb\xbf\xd7\x89\x04\x89\x52\x09\xed\x1f\x44\x90\x3b\xf3\xf3\xc7\x0d\x7e\x90\x68\xc5\x6d\xe9\xe5\xad\xae\x3e\xb7\x05\x1c\x0e\x58\x53\x5e\xf5\xe2\xb4\xd9\xc3\xf6\x74\x74\x90\x98\x28\xc0\xd8\x91\xc5\xaf\xb1\x6c\x4f\xf5\x57\x52\xa8\x90\x98\xd8\xc2\x25\xe5\xa9\x2e\xd7\x50\xcb\xce\xa7\x2a\x0a\x58\xa6\x09\x87\xc4\x98\x8c\x50\x3f\xcf\x83\xdc\xe9\xec\xe9\x2f\x34\xf0\x20\x0d\x74\x40\x00\xc1\xeb\xaa\xec\x22\x4d\xad\x2f\x0b\x80\xd3\x9f\x49\x03\xcd\xa9\x79\x60\xb5\xde\xdd\xfe\xd8\xec\x2d\x13\x92\x7b\xff\x69\xa8\x52\xc3\x47\xc0\x60\xb2\x5b\x50\x14\xe7\x89\x13\x92\xb2\xc8\x58\x90\x40\x5b\x1d\xaf\x72\x6f\xee\xba\x3f\x7b\xc5\x82\xce\xc9\xc1\xa6\x1d\x08\x6f\x16\x60\x4b\x90\x32\x65\xe9\x55\x5a\x84\xc3\x5d\x2f\xa4\x03\x69\x14\x20\xf7\x6e\x09\x16\xc5\x65\x57\x27\xa4\x51\x18\x13\x5e\x77\x55\x2a\x82\x18\x7d\xc7\xa2\x78\x18\x25\x4e\xd2\x88\x71\x69\x69\xca\x34\xfe\x7a\x34\x0b\x6d\x23\xa3\x8b\x25\x40\xcf\x43\xdc\xb9\xd4\xbe\x71\x75\xbe\x25\xd2\xa6\xee\x3f\x4f\x63\x76\xc8\xc9\xb2\x49\xa3\x34\x22\x40\xd7\xaa\xd4\x79\xd5\x2c\x91\xad\x5c\xce\xd8\x34\x8e\x38\x45\x68\xef\x65\xb7\xed\x6f\xfe\xef\x94\xf7\xfe\x69\xca\xa5\xd5\x34\x24\x95\xae\xfe\x8f\x3a\xf0\x9c\xf0\xf9\xe1\x74\xf8\x7e\xd6\x75\xb5\x6d\xe1\x1d\xaf\xbd\xfe\xed\x00\x62\x87\x34\x09\x6c\x2d\x6e\xa5\xf5\xfe\x09\xda\x7c\x81\x4c\x7d\x36\xa1\x26\x77\x97\x04\x29\x09\x2f\xdc\x55\xaf\x57\xb9\x5e\x29\x85\xc7\xf6\xb2\x23\x74\xae\xed\xbc\x48\x66\x03\x69\x22\x6c\xc7\xa8\x85\xf7\x79\x9f\x65\x36\x46\x1a\x12\x54\xa5\x26\xbe\x21\xef\x32\xd8\x8f\xe9\x2b\x4f\x30\xa4\xd6\x18\x4a\x57\xe1\xe9\xe0\xe2\xed\x71\xe6\x38\x4d\x83\x90\xc7\x43\x33\xac\x6b\xec\xb8\x3a\xf7\x2c\xbc\x93\x27\x4e\x03\x0e\x0e\x0d\x7f\xfb\x74\xb3\x9d\x51\x7d\x4d\xdf\x4e\x1a\x59\xce\xed\x5c\x55\x34\x2b\xf7\xfd\x4f\x6a\x4d\xc5\x78\x27\x15\x70\x41\xa4\xea\x86\x65\x41\x4a\x48\x18\xba\xfb\x6d\xe7\x6d\x7c\x99\x72\xf8\x2d\x13\x03\xa4\x19\x88\x8c\x2a\x50\xf9\x01\x3b\x83\xba\x29\xf5\xc8\x92\xa6\x99\x4a\x53\x8b\x7a\x57\x45\x5e\x62\xb7\x4a\x47\x33\xd2\x7b\xcd\x29\x64\x21\xd9\x0f\xba\x02\xa1\x41\xa1\x9f\x8b\xd2\x29\x80\xfe\xf9\x76\x3a\xfd\x39\x6c\x71\xa9\x74\x51\x7d\x89\xbf\x5a\xef\x26\x2d\x06\x87\xa9\xd4\x0c\xc6\x3d\x00\xbf\xcb\xd7\xa4\x52\xdb\xbd\xa4\x1d\x9c\x46\xcb\x5a\xdf\xff\xae\xb1\x52\xe9\xa0\x29\x76\x37\x7d\xfd\x31\x55\xb1\x75\xa6\x2d\xee\xec\xfe\x7c\xab\xa7\x1b\x68\xaa\x54\x42\x19\x42\x1b\xf6\xfd\x99\x97\xaf\xba\x3a\x2c\x9b\x84\x4b\xe6\x3e\x48\x15\x66\xf4\x96\xba\x67\x78\xf2\x1a\xb2\xc3\x9d\xeb\x40\x52\xa6\x69\xb3\xf3\xa9\x82\x54\x27\x4e\x62\x62\x60\xd7\x69\x3a\x7f\xe2\x7b\x45\xbd\xf6\x84\x3f\x84\x62\x89\x70\x07\x52\x0d\x29\xb3\xcd\x7b\x1f\x3f\x5e\x9e\x46\xc8\xea\xfe\xe2\xca\x72\x52\xef\x6d\xd8\x6e\xe5\x27\xe6\x02\xa3\x90\x62\x6c\xe5\xc8\xf2\xe6\x96\x94\x4f\x7b\xbf\x34\xc5\x54\x81\x1c\xe4\xb0\xab\x0f\xcf\x5a\x3f\xbd\x11\xd4\xcc\x0c\xbd\x54\x5f\xa5\x81\x53\x34\x4a\xeb\x89\x10\xc1\x88\x2a\x1f\x52\x23\x43\x6d\x26\x35\xbe\xf1\x5a\xcd\x02\x26\x3c\x90\x91\xaa\x91\x97\x45\xba\x2c\x10\x11\x79\x0e\xbd\xd3\x08\x9a\xbc\xe8\xaf\xc0\x2e\x59\xa0\xd3\x2c\xf5\x3e\xb1\x6d\x09\xee\x7f\x0e\x03\x52\x57\x2b\x80\x90\x27\xd7\x79\x43\xd7\xdc\x1f\x8f\xca\x0f\x09\xc3\x8c\xe4\x3f\x5e\x2b\xa2\x60\x24\x97\xd7\x1f\xe2\xcc\xc9\x43\xfc\x22\x24\xf3\x75\x9d\xf7\x40\xb6\x2c\x4c\xac\xcc\x6d\x01\x4d\xcb\x83\x63\x71\x6a\x48\xf3\xbf\xec\x7f\x3b\xcc\x8c\x8d\xc6\x8d\xc9\x8b\x1c\x5a\x1c\x4a\xe8\x19\x4b\x2d\x60\xe1\x5f\x50\xbe\xde\x43\xf5\x5f\x6f\x27\x28\x5f\xff\x75\x82\xbf\xb1\xa1\x64\x4c\x5a\xa5\x20\x99\x97\xfa\xd4\x60\xdd\x56\xc7\x2f\x5e\x0c\x53\x19\x61\x1a\x6d\xf4\x6e\xd3\xbe\xd3\x56\x89\xe9\x9b\x67\x86\x53\x04\x8d\xed\x5b\x53\x29\x85\x75\x9c\xf9\x1b\x8e\x32\x49\x00\x85\x8d\x9e\x75\x74\x43\x16\x29\x41\x46\x92\x4a\xb4\x43\xff\x3c\x64\x91\x4e\x22\xdd\xc7\xf0\x37\x35\x22\x39\xda\x33\x10\x5c\x16\xa7\x9c\x33\xc7\x49\xa6\xeb\x35\x94\x6b\x28\x8a\x2d\xd6\x1f\x5f\x6c\xc3\x59\xac\x2c\x1b\xe2\x7d\x25\xf3\x02\x57\x47\x5f\x7d\xcd\x38\xb7\xbc\x1b\x7d\x6c\x75\x5b\x9a\xea\x82\x77\x7f\xf6\xd0\x49\x12\x12\x20\xb1\x57\xdf\xf3\xe5\x84\x59\x98\x92\xa5\x91\x49\x02\x2f\x42\x61\x49\x3b\x16\x6c\xe1\xd4\x26\x66\x69\x9c\xca\xc8\x0b\xfe\x4c\x74\x3e\x17\xf6\x9b\x2c\x8d\x85\xe7\xb3\xfe\x06\x07\xb4\x1c\x33\xd3\x00\x32\x4b\x51\x92\x98\x3f\xe9\xbc\x35\xe8\x54\x7f\x66\xb7\x6a\xb4\xa7\x79\xe8\x02\x33\xac\xd7\x79\x9b\xcf\xa3\x80\x2c\xe3\xb1\x45\x5e\xf9\xd6\xf8\x79\x3f\x3b\x64\x99\xe6\x44\x99\xb7\xef\xaf\xe4\x7a\xe3\xa7\xef\x10\xc2\x98\xc2\xee\x0d\xf1\x5a\x0e\x9b\x47\x06\x59\x42\x48\x75\x62\x09\xba\xcb\x09\xdd\x66\xef\xc1\x8b\xec\x4c\x6f\x09\x74\x64\x19\x4d\x6a\x20\x36\xc7\xa2\xa8\x3e\x69\xe9\x8d\xf1\x36\x83\xa9\xce\xc0\x24\x9c\xf7\x86\xd7\xa5\x4e\x0b\xd4\xaf\xf8\x45\xdc\x9a\xc9\x34\xa4\xd9\x46\x57\x7d\x34\x77\xb9\x99\x38\x13\x99\x14\x29\x95\xa9\x48\x7b\xdd\x82\x71\x7e\x87\x69\xce\xa4\xb4\xfc\xd9\x77\xb7\xcf\xab\x7f\xce\x5e\x8b\x0a\x94\xd0\x7d\xf7\x22\x55\x22\x07\xc0\x43\x3d\xc1\xab\x66\x2a\x11\x99\xd3\x19\xfe\xd6\x3d\xfc\x54\x1f\xda\x0f\xd2\x48\x78\xb6\xab\x59\x1f\x22\x64\x3a\x88\xb9\x45\xa8\xc8\xd3\x85\x72\xe8\xec\x96\xd1\x58\x5e\x88\x57\x6c\x37\x1f\x50\x9c\x06\xe8\x8c\x77\x14\x32\x23\x39\xd5\x21\x2d\x55\xeb\x1b\x34\xc8\xa6\x3f\x28\x82\x18\x71\x10\x3c\x18\x7a\x1f\x26\x37\x2c\x82\x94\x21\x78\xfa\x66\x1c\xbb\x2c\x22\x48\x65\xea\x39\x25\x6e\x20\x2f\x08\x68\x84\xd6\x03\xaf\xb1\x6c\x9b\x2d\x1c\x48\x31\xd8\x13\x03\x81\x08\x34\xf7\x81\x82\x0f\xb4\x9b\xab\x33\xc1\x7a\x67\x37\x67\x02\xea\xa0\x3c\x54\x3a\x37\x8e\xc3\xee\x8b\xf0\x6a\xc6\xce\x38\x7a\x09\x22\x8c\x02\xf0\xd2\xfe\x16\xe3\xb2\xdc\x95\x31\x7d\xbd\x22\xd4\x59\xea\xba\xb9\xdb\x9b\xaa\xfe\x59\xd5\xef\x97\xed\x2b\x6e\x2c\x63\x48\xb8\x86\x3f\xa1\x3e\xc0\xec\x21\x98\x76\xf2\x05\xa4\xa8\x7d\xee\xb9\x69\xdd\xe1\x28\x4c\xa4\x2b\x15\x6f\x7e\x5d\x34\x22\xfb\x41\x51\x0c\x81\x27\xee\xa8\x0e\xb2\x73\x2d\xaa\x7a\xb8\x86\xc8\x70\x00\xb3\x74\x7b\xb1\x85\x21\x43\xde\x93\xab\x81\x88\xb4\x9d\x99\xcd\x27\x1c\x47\x68\x48\x11\x87\xd6\xed\x2e\xf1\x73\x07\x47\x5f\xf4\xeb\xdc\x9e\x75\x75\x38\xc2\x8c\xad\x19\x44\x1c\x87\x96\x65\xe2\xfe\x9f\xdf\x8a\x4a\x7a\x05\xfb\xdf\x07\x2b\xa3\xe8\x57\xf0\x48\x52\xfb\xd5\x9f\x50\x12\x71\x46\x6f\x66\x04\x97\x8c\xda\x9f\x1a\x38\x3f\x54\xfd\x1f\x75\x42\x6d\xaf\x05\x9a\x96\x5c\x4b\x72\xe1\x9f\xa1\xc5\x47\x73\xeb\xd8\xac\x87\xb1\x46\x64\x43\xe7\x25\x85\x11\x36\xd2\xb8\xea\xfb\x32\x2e\x2c\xc0\xd4\xb2\x88\x24\x05\x4a\xff\x11\x5f\xce\x25\xcf\xc2\x57\xe9\x86\xc9\x0e\x20\xd2\x04\x90\xf7\x30\x1e\xfa\x5d\x16\x84\x7e\x1b\x16\x19\xb3\x4d\xc9\xd6\x64\xbf\x94\x4d\xaf\xc6\x0c\x42\x24\xa0\x60\xbc\xfb\xdd\x5d\xe8\x6c\x80\x10\x3a\xa4\x39\xfd\xbc\xda\x6d\xf6\xd7\xab\x7f\xed\x7d\xaf\x83\x80\x20\x21\x61\xbc\xed\x6e\xf5\xbc\xeb\xff\x18\xeb\xc4\x51\x6d\x3a\xbb\xfd\xa3\x22\x1e\x89\x2b\x28\x0a\x47\x80\x37\x2f\xb4\x0a\xc8\x64\x94\x0e\xd4\xdd\xb9\x74\x49\xa2\x71\xda\x57\x80\x08\xa9\x6d\x67\xbb\xba\x1b\x7e\x4d\xa0\xad\x9d\xd9\x34\xdc\x44\x1e\x03\x04\xa8\x28\x25\x6f\xec\x54\xfc\xb1\x50\x79\x13\x52\x66\x94\x36\x5b\x3f\x3e\xec\x9e\x6f\xaf\x5e\x76\xb7\x8f\x0f\xfb\xfb\x3e\xc5\x2f\xa4\x49\x79\xda\xbf\x9f\xd6\x54\xf5\x94\x69\x01\x84\x8a\x13\x4f\x10\x7b\x7f\x26\xe8\x44\xbf\x52\x74\x60\x59\x1b\x06\x72\x9f\xd1\xb3\xe8\x38\x48\xc1\xf6\xde\xb8\xb7\x74\x75\x26\xae\xfa\x89\x2f\x20\x74\xac\x02\xdb\x39\xf0\x71\xc2\xe2\xa3\xf3\x5c\x08\x4b\x35\x1d\x85\x81\x20\x7e\xd4\x7f\xfe\xe3\xc6\x5f\x1f\x05\x50\x96\xb1\x5b\xbe\xf5\x79\x8b\x50\xab\xb7\x9b\xaa\x5e\xbf\x41\x51\x60\xb9\x50\xd2\x9d\x9a\xa7\x9e\x65\xca\x5f\x0e\x62\xca\x21\x7b\x45\xb8\x75\xd5\xb4\x37\x39\xcc\xb6\x14\x08\xc2\x2c\xb4\x1d\x14\xad\x7a\x5b\x53\x53\x8e\x15\x93\xed\x6b\xba\xfc\x7f\x46\xad\x88\xc9\xff\x5c\xf4\x25\x02\x04\x32\x0b\x12\xe7\x9a\x5f\x84\x12\xc0\x22\x70\x3c\x92\xa8\x72\x28\xae\x6b\xf8\xcc\xcb\xd7\xe7\xfc\xf5\xcd\xbf\x5a\x60\xb1\x51\x96\x15\xf9\xf5\xad\x1d\x43\x65\x80\x65\x29\x6d\xe4\x45\xde\xb4\x17\xb9\x39\x3f\x46\x04\x94\x7b\xb9\x5e\x3d\x6c\x17\x7b\x84\xbf\x6c\xd8\xfd\x2b\xfc\xed\xa2\x39\x07\x86\xdc\x47\x22\x26\xaf\x0f\xcf\xa8\x70\x8c\xc5\x04\x86\x1a\x4c\xbf\x7c\xaf\xa1\x85\xa7\xba\xfa\xc8\x07\x95\x1d\x00\x66\x4c\xe0\x60\x51\x7b\x0a\x28\xde\xa0\x79\x9b\x3d\x56\x14\x58\xf5\x81\xff\xb5\x09\xf7\xf1\x5c\x84\x28\xb5\x6a\x3c\xd7\xf9\x6b\xfe\x74\x2a\x7a\x13\x07\x91\xb1\x8c\xdb\x4e\xb5\x66\x46\xaf\xda\x1d\x57\xf1\x84\x14\x62\x7f\xec\x4c\x7a\x6d\x63\xd7\xbd\xe5\x53\xfb\x7d\x39\x16\xe2\x40\x91\xdf\xe9\xb6\x3e\x67\x42\x69\x6e\x2d\xbf\xb0\x38\x40\x2f\x31\x46\xd0\x92\xb1\x2d\x84\x38\x4c\xa8\x32\xb4\xae\xea\x06\xea\xfc\x74\x58\x8f\x34\x8c\x17\x26\x5b\x9c\x48\x8a\x4c\xf7\x9e\xb2\xad\xbb\xda\xd7\x40\xa0\xf9\xad\xa4\x89\xb0\x6c\x59\xf2\x90\xb7\x56\xe9\x7b\xb2\x32\x81\xa3\xe4\x96\x3c\xf9\xba\x39\x7a\xf0\xeb\x1c\xe2\x09\x49\xa8\x4d\x2f\xf4\xe3\xdd\x94\xf5\x40\x0d\x3b\x1f\x0e\x92\xaa\x6c\xc4\xa1\x72\x75\x9e\x20\x18\x20\x0d\x80\x12\x6a\x77\x57\xdd\x6e\xf7\x8f\xdf\x65\x35\x21\x15\x5a\xbb\x5e\x8c\x47\x9d\x53\x17\x21\xeb\xaf\xa3\x43\x2a\xfc\xde\xbf\xdc\xed\x6e\xb7\xb7\xdf\x06\x41\x54\x80\x2c\xe2\x49\xe6\xb4\x03\xc9\x4b\x28\x4e\x77\x95\x82\xe2\x01\xdb\xcf\xaa\x7e\xef\xbb\x30\xe6\x00\x4b\x7f\x3a\x67\x94\xfa\x78\x1d\x91\x4e\x4d\xf7\x03\x10\x41\x44\xfa\x36\x79\xb3\x7b\xc3\x1a\x49\xe6\x61\xd5\xae\xab\xaa\xd6\x9d\x3f\xe2\x40\x31\x33\x73\x0e\x82\x41\x30\xb8\xf6\x0d\x05\x1f\x72\x62\xaf\x41\x44\x92\x18\x7b\xc9\xbb\xbc\x35\x37\x94\x76\x9c\xdd\x9f\x80\x0c\xfa\x14\x9c\xac\xda\x86\x26\x91\x3f\xa8\x21\x24\xbf\xa1\x2a\xc6\xdc\x91\x00\x02\x79\x14\xf6\x04\x9c\xb6\xed\xbc\x3a\x8d\xec\x12\x61\xe6\x5c\xf3\x49\xde\x58\x6e\x88\xe6\x8f\x45\xd7\x72\x21\xd0\x83\x2e\xce\x20\xf6\x47\xd5\x9e\xa0\xf8\x56\xb5\x8b\x73\x03\x14\xa7\xa2\xe5\x5d\xf5\xfa\xb3\x8b\x18\x76\x35\x5e\x40\x12\x66\xb3\x40\xa6\x56\x5e\x33\x6f\xb6\x27\x8a\x20\xae\xab\xd2\xc9\x36\xf8\x11\x99\xd0\xae\x88\x73\x47\x3c\x74\xdb\xb6\x3e\xa9\x76\x46\xd2\xb1\x7c\x75\xc5\x42\xea\x24\xbf\x7f\xb8\x1b\x8b\x4f\x75\x07\x52\xaf\x7c\xeb\xd1\xe0\x8b\x75\x5c\x50\x71\x14\x26\x3d\x23\x8e\xe5\xdc\xbb\x5f\x56\x47\xed\x1e\xdf\xb2\x9c\xda\xf5\xec\x60\x81\xd5\xaf\xf3\xec\x9a\x3a\xc8\xd8\x80\x1a\x1a\x08\xd5\x6e\xcb\x2b\xdf\x91\xba\x0c\x95\x05\x1d\xf2\xa8\x67\x7d\x6d\xd5\x9b\xcb\x3a\x4c\xef\x42\x27\xca\x0b\x6b\xdd\x96\xa6\x22\x69\xb6\xc9\xc7\xd4\x52\x91\x93\xdd\x39\xc2\xb9\x7a\xc7\xfa\x3f\x4f\x58\x9f\x67\xbc\xef\x6e\x2c\x86\x96\xf9\xca\xea\x43\xd6\xd8\xbc\x75\x1f\x61\xf9\x5d\xe1\x00\x0f\xea\xc2\xc6\x07\x47\x5f\x31\xf6\x89\x01\x51\x49\x57\x14\xbc\x60\xbf\x01\x40\x83\x5c\x7a\xe3\x72\x5b\xfa\x9c\x17\x18\x66\x3b\x38\x3c\x8a\xe7\xb1\x5b\x1c\xc4\x82\xf3\x9b\xf4\x10\x98\xd8\x71\xd5\x6f\xb6\x9b\xe7\x1f\x9b\xed\xfe\xfb\xe3\xdd\xf5\xe6\xd9\x5d\x54\x86\x5a\xd8\xc6\x97\xa2\x6a\xd0\x15\xd9\xc7\xa0\x57\xc9\x38\x27\x12\xf3\x6f\xcf\x2f\xe3\xc9\x23\x99\x53\xd1\xea\x9c\x04\xc8\xcb\xe6\xb1\x2c\xce\xab\xe2\xf8\x06\x0f\xa7\x03\xd6\xb9\x9a\x28\x4c\x74\xc3\x6d\xbe\xc8\x21\x9c\x2c\xca\xc5\x1d\x8b\xc3\x90\x1a\xd1\x5b\x78\xef\x99\x86\x67\xc9\x0a\x19\x87\xcc\x43\x01\xac\x1c\x70\x51\xc0\x3e\x08\xc2\x7d\x10\xb0\xe9\x2f\xc5\xcc\xf6\x11\x52\x6b\xb9\x72\x18\xb0\xe7\x53\xd1\x3b\x21\x32\xc6\x48\xba\xdd\xfa\x91\x02\xdc\xaf\x5f\x9f\xe4\xb1\x49\x9c\x8e\xf0\xe6\x97\x2a\x4e\x7a\x5e\x2e\x90\x3c\x0d\x63\xe5\x17\x07\xc2\xc1\xa6\xc5\x7f\x7b\xcd\x0c\xa9\x0e\x71\xa4\x6d\xe3\x76\xf7\x68\x75\x4c\x3c\x78\xd6\xdf\x26\x97\x49\x4c\x53\xf8\x48\x66\x74\x9a\x51\x92\x1c\x19\xf8\x1a\xd0\xee\x3b\xf1\xb7\x53\x4a\xc0\x82\xfc\x2c\xba\x69\xb6\xcb\xc9\x44\x87\xe4\xa6\x58\x2e\xc6\x7e\x77\xbb\x3a\x5f\x2a\x4c\x83\x4c\x8c\x90\x76\x22\x97\x58\x53\x26\xf2\xa3\x7a\x47\xaa\x69\xdd\x54\xb5\x2b\x6b\xe5\x55\xb9\x55\x6f\x78\x80\xef\x23\x87\x67\xf6\xb8\xa9\x64\xd1\x48\x9c\xbb\x18\x85\x70\x32\x4b\x10\x3c\x95\xf7\x12\x06\x5d\x66\xd2\x52\x15\xaa\x02\xa1\x5e\x15\x85\x2b\x5a\xf6\xaf\x21\x33\x18\x07\xde\x41\x02\x39\xeb\x75\x94\x82\x01\xf3\x74\x31\x04\x1a\xde\x1f\x0b\x28\xe7\x9a\xbf\x20\x45\x6c\x77\xbb\xd5\xf1\x68\x13\x3d\x7a\x5e\x62\xfa\x1a\x2a\x27\x05\xd7\x56\xe7\xed\x15\xdb\x1b\xc4\x55\xa9\x1f\x3c\x53\xeb\xfc\x67\x84\xe5\xb9\x5d\x3f\x55\x45\x51\xf5\x37\xa9\x02\x02\xae\x90\x16\xfe\x36\x7f\x2d\x2d\x8c\xcd\x1f\x35\x2a\x89\x7e\x93\x72\xb1\xff\xfd\x50\xb5\xb7\xe5\xcb\xf0\x62\x21\xce\x42\xcb\x1f\xac\x72\xf4\x8c\x53\xee\x98\x0c\x42\xca\x70\x61\x09\xaa\xdd\xdb\xbe\x26\xfa\x94\xfb\x62\x21\xe3\x3a\xfb\x9a\x32\xc2\x40\x0e\x24\x4c\x8e\xe6\x71\xe9\xd3\x49\x99\x52\x2a\xbd\xf5\x30\x82\x31\x9d\x30\x48\xa5\x82\x58\xf9\x2d\xed\xb5\x79\x38\x1d\x86\x23\x3c\xb2\xf4\x5c\x8e\xef\x63\x36\x8d\x35\xb3\x19\x7e\xf0\xa5\x8a\x3b\xa8\x71\xa0\x97\x9f\x0d\x4e\x03\x9b\x1a\x24\x86\xcd\x09\xd0\x49\x6a\x2d\xe9\x16\xba\xb7\x63\x55\xe3\x2f\x1e\x7e\xf4\x99\x51\x44\xe4\x6b\x6e\x26\x92\xb8\x7f\x91\x30\x70\xe7\x1a\x26\xa9\x53\x73\xd3\x74\x6e\xcf\xfd\x99\x1c\x9b\x4d\xd9\xe6\xed\xf9\xfa\xca\xdf\x8e\xe1\x68\x43\x70\x5a\xbc\x37\xf5\xbc\xdb\x51\x05\x2c\xa1\x58\x54\x9e\xce\x1b\xa8\x8b\xf3\x32\x9d\x14\xa8\x20\x52\xba\x5f\x71\x7e\x17\x9d\x86\xcd\x2a\x90\x01\xad\x8c\xab\xdc\xd4\x38\xc9\xa6\xaa\x40\x32\xea\xf5\xf1\x8d\x15\xbf\x6b\x64\x53\x21\x4b\xa9\x02\xb9\x45\x55\x95\x3e\x4f\x3c\xfb\xad\x90\x5b\xde\xf7\x53\xf9\x04\xa7\x66\x8e\xd4\x51\x61\x66\xc8\xaf\x7a\x83\xce\xbd\xb8\xca\xdb\x03\x1c\xc7\x0c\x44\xa0\x42\x64\xe8\x33\x62\x57\x79\xdb\xac\x4a\xed\x3c\xa5\xfe\x1a\x28\x4c\x0f\x8e\x21\xa6\x34\xa2\x49\x5b\x34\xc0\x8a\x85\xc0\xd8\xb4\x8c\x39\x2e\x87\xa9\x28\x65\x34\x01\x41\x6b\xcb\x07\x4a\xb4\x1b\xbf\xa3\x38\x03\xc5\x83\x84\x6e\xb1\x36\xfe\x2a\x9c\xa3\x76\x34\x8a\xd7\x65\x73\x5d\x1d\xa8\x79\xed\x6b\xff\x52\x25\x81\xa5\x58\xce\xcb\xff\x45\x35\x0d\xbe\x42\xe6\xdf\x77\xc2\x6c\xd6\xfe\xae\xaa\xde\x9f\xf1\xe3\x37\xfb\x8c\x4a\xb9\xe5\x10\x77\x59\xfb\xc5\xcc\x9d\x1f\x2a\x12\x1e\x8e\x60\xad\x5f\x24\xce\x55\x2a\xa5\x30\x7e\x07\x99\xe6\x36\x55\xaa\x98\x4d\xd2\xef\xd6\x61\xf0\x5e\x95\x3c\xf6\x47\x44\x9a\xc4\xa9\xd3\xf6\xc6\x2d\x18\x7c\xa8\xfb\x43\x5a\xda\x76\x81\xc7\xbb\xcd\x7e\xfd\xf8\xe8\xff\x2e\x91\x11\x84\xdd\xf2\x8a\x5c\x76\x30\x28\xc5\x52\x4a\x2b\x7f\x90\xa0\xe3\x17\xb7\xab\x98\x22\xcf\xe2\xe8\x05\xf6\xfe\x3f\x0a\xa1\x81\x52\x3c\x73\x14\x3d\xea\xfd\x1e\xca\x53\x33\xe2\xbc\x02\xa5\x94\x60\xb6\xe9\xe1\xb5\x8b\xc2\xab\xfa\xd6\xa8\xd9\x9a\xd4\x0c\xc8\xf4\x1f\x68\x55\x5d\x9d\xf4\x2b\x7e\x11\x5f\x2b\xcd\x90\x2a\x80\xf8\x0b\xd5\xa9\x9d\xa6\xad\x94\x4e\x03\x0b\xc5\x80\xa2\xd8\x56\x87\xce\xb2\x13\x92\xf0\x47\x0e\xb7\x65\xd9\xcb\xaf\x83\xd2\x99\xb6\x5c\x11\x55\xa1\x3d\xf7\xb7\x3b\x84\xb1\xa2\xc5\x32\xd1\xa4\x3c\x4d\x35\x99\xa6\x77\x8f\xc6\xca\x08\x8f\x9c\xfa\x66\x31\x8f\xa8\x4c\x64\x12\x0b\x4f\xea\xec\x81\x8d\x8c\x1f\x4d\x4f\x13\x07\xca\x70\x43\x19\xd7\x3d\x68\x7d\x05\x0d\xc5\x39\x53\xbc\x41\xf6\xdf\xd9\xff\xf8\xc1\x5a\x4b\x17\xbd\x5b\x60\xca\x92\xb0\x04\xe8\x40\xc4\x94\x25\xec\xec\x43\x34\xca\x74\xf5\xd9\x06\x3e\xeb\x5e\x98\x3a\xf8\x3a\x4c\x82\xc8\x76\x80\x5e\x15\xa0\xde\xff\x17\x7a\x9c\x93\x0e\x05\x12\xe4\x4b\x55\xc7\x33\xd5\xb6\x5e\xca\xbc\xfd\x4b\x9d\xd2\xe9\x17\xd5\xa1\x09\xa8\xdb\x88\x00\x70\xe3\x21\x73\x34\x8e\x66\x3a\x71\x4c\xfa\x07\xe2\x90\x07\xf5\xfe\x75\x0b\xbd\x8e\x75\xe2\x75\x50\x57\x45\xbb\x88\xdd\xd1\x3c\xb1\xa5\xf2\x6e\xde\x7d\x76\xab\xe9\x4a\x55\xa7\xe3\x02\x3d\x8f\x1b\x9f\x08\x1e\x0c\x3a\xa7\x94\xe7\xea\xb6\xf8\xef\x96\x9e\x6b\xd9\x7e\xe8\x44\x46\xa3\x76\xde\xf5\xcb\x76\x03\x8b\x1f\x2a\xe5\x21\x7d\x4f\xd7\xdc\x82\x58\x3f\xe3\x47\x8e\x9f\x17\x8c\xa2\xa3\x9e\x56\x9d\xa6\x2c\x51\xde\xe8\x78\x4e\x7f\xdf\x0b\x3b\x83\x30\xea\x54\xc7\xc4\xdd\x69\xdd\x24\xdb\xd6\x39\xda\xaf\x74\x16\xc7\x14\xcb\x62\x91\xbf\xe6\xb2\x40\x9b\x9e\x9c\xde\x65\x16\x73\xc2\xf1\x5a\xcc\xa7\xc3\x3f\xf7\x4d\x16\xd3\xa9\x93\xc5\xca\xcb\x39\x3c\x9c\x88\xad\xc8\x1b\x44\x2d\x12\xdb\xa6\xe8\x12\x20\xfb\xcf\xbc\x9e\x90\x27\x69\x90\x40\xc9\xef\x23\xa8\xf7\x1d\x3d\xc4\xf4\xad\x02\x0a\xe9\x8a\x13\xab\xfa\xf5\x64\x79\x6b\x9c\x07\xfc\x92\x97\xed\x1f\x4b\x19\xe4\x8b\x29\x25\x99\x25\xcd\x70\xad\xe9\xcf\xf9\xeb\x66\xf7\xdd\xbe\x93\xf9\x48\xe1\xd1\x3b\x87\xbc\xbc\xea\xdc\xa1\xd9\x71\x00\xdf\xae\xb5\x9e\xa8\xcb\x82\x96\xd2\x10\xef\xd8\xf3\xd5\x6a\xdd\xf9\xa6\xe3\x16\x16\xad\x04\xf0\xbe\x3c\x3b\x0b\x4d\x66\xb3\x4f\x41\x48\x2b\xf1\x3d\x2f\x8a\x3d\x94\x7a\xef\x71\x49\xb3\x4f\xa4\x4c\x24\x42\x17\x75\xdd\x43\xee\xbe\x4a\x38\x76\xd8\xb4\x32\x92\x78\xb3\x7a\x7a\xd3\xb2\xfa\x34\x05\xbc\xe3\xbc\x69\x75\xfa\x94\x1a\x91\xe8\x89\xbb\x75\xe7\x5a\x1e\xa9\xa4\xd9\x8c\xd8\xcc\x16\xad\xa4\xc6\x50\x71\x47\xbe\x76\xac\x1a\x7c\xc6\xa3\x27\xa1\x74\x94\x58\x7f\x2c\x25\x01\x35\x86\x68\x39\x1c\xbb\xf9\xf1\xf7\x70\xfe\x1a\x13\xcb\xf6\xeb\x7e\x6a\x09\xe6\xaf\x31\x4d\xa9\xaf\x94\x7c\x98\x4b\xcc\xe9\x5f\x65\xd5\xa7\xf3\x1c\x95\x25\xf5\xfd\xfe\x67\x98\x64\x23\x7e\x00\x6d\x22\x4d\xe5\x48\xed\x44\x0b\x6f\xaa\xfa\x6a\x39\xfc\xd1\xc6\xd5\x98\x76\x9f\xd5\x0d\xd5\x47\x57\xa7\xf6\x6d\x29\x76\xd0\x06\x78\xda\x1b\xb6\xa2\xea\x1b\xc5\x7b\xbc\xc7\xfc\xca\xa8\x1d\xed\x5f\xb9\x69\xdf\x9a\xe7\x4b\x29\x6f\x3b\x10\x83\xd4\x2e\x7f\xea\xc6\xfa\x01\x45\x6e\x83\xbd\xd9\x20\xc5\x23\x07\x10\xdf\x42\x81\x13\xd5\x58\x37\x24\x0c\x33\xe3\xfa\x80\x48\xd2\x6c\x20\x6f\x19\x11\x8c\x2e\x25\x93\x30\xcc\xb2\x2c\xf0\x08\x5c\x85\xf9\xf1\x0b\x37\x00\xc3\x0c\x94\x7b\x07\x6e\xe9\x5e\xf0\x9f\x60\xa8\x42\x12\x74\xd2\x84\xe5\xef\x16\xde\x10\x3f\xfe\xf6\xbb\xce\xfe\xdf\xb0\x6a\x30\x54\x8a\xba\x87\x0e\xdd\xd4\xdf\x9e\xe4\xcf\xd9\x02\xf4\x99\x7b\x64\x69\x48\x9b\x5a\x37\xe0\xa1\xf2\x06\x6a\x5d\x95\x0d\xe5\x26\x7b\x3c\x17\x32\xad\x29\x55\xf4\xcf\xab\xef\x9e\x91\x01\xa3\x34\xf3\x75\x3d\x87\x8a\x7c\x34\x5b\x6c\x9a\x05\xa8\xf6\xb0\xdc\xfa\x73\x2d\x47\xd7\x27\xe6\xcd\x77\xa8\xf5\x40\xe5\x80\x91\x0a\x12\x9f\xa9\xf4\x06\xbb\xf8\x62\xd3\xc2\x48\x31\xaa\x4d\x7e\x62\x3e\x76\xff\x31\x36\x71\xd2\x6b\xca\xfd\x89\x67\x6f\xd0\x91\x63\x42\x49\xa8\xa3\xed\xea\x6a\x2e\xa0\x37\xc8\x8d\x20\x9f\xdf\xa6\xb2\x2e\x31\x64\x98\x84\x69\xe8\xe6\xcd\xed\xfa\xf1\x27\xe2\x7b\x74\xa9\x0e\x01\x98\x28\x46\x5e\xc7\xff\x9d\xf0\x84\x03\x5d\x38\x60\xa2\x13\x66\x55\x26\xcb\x13\x14\x8f\x1f\x58\xd7\xb9\xee\x8f\xa6\x41\xe6\x59\x65\xee\xcf\x56\xd1\x74\xce\xeb\xf2\xd5\xbf\xfe\x0a\x8c\x27\x36\x81\x0f\xfa\xb7\x10\x2c\x4c\x99\xf5\x2b\x48\x8f\xf8\xad\x2a\x2e\xd9\x88\x01\xd3\x4c\xa7\xd2\x7f\xe5\xb6\x9e\x81\x0b\x30\x0b\x62\xd2\xa9\x68\x47\x7c\x07\x16\xb0\xf4\xc5\x6f\x76\x2e\x6d\x36\x90\xd8\xd4\x2d\x9a\x39\x59\x2b\xa0\x88\x63\x4a\xc7\xbc\x12\x5e\xc1\x0a\x36\x8c\x30\x2c\x28\xd2\x10\x1d\x92\xe6\xe7\x98\xff\xd5\x9a\xac\x31\x89\x00\x0a\x81\x46\x39\xe6\x8f\xfb\xd5\x3f\xf7\xeb\xd5\x93\x3f\x04\x41\xec\x99\x10\xee\x9b\xd7\x6e\x2b\x5c\x99\x5e\x12\x12\x10\x22\x60\x8e\xfa\x79\x44\xfb\x3c\x6f\xd4\x74\x83\x65\x90\x86\x99\x77\x70\x7a\xcb\x8a\xd2\x71\x8c\x5a\x37\xe4\x5b\x5d\x9d\xbe\xc0\x0c\xa2\x14\x21\xe0\xa0\xa0\x33\x89\x18\x51\x2a\x30\x41\x8f\x24\xfd\xe2\xcd\xaa\x50\xa1\x1e\x18\xb8\x5d\xc8\x48\x8c\xd7\x34\x3d\x7f\x9b\x14\x42\xc5\x38\x95\x29\xff\xeb\x5f\xdf\xc7\x99\x04\x54\xda\x2e\x98\xa1\x70\x40\x2f\xe9\xea\x74\xfe\x8b\x0b\xea\x4c\xfa\x14\xad\x87\x30\xd8\x62\xcd\x74\xb6\x62\x28\x08\xac\xe8\x8b\x08\xa7\x6e\x92\x4d\x84\x04\x66\xd7\x45\xad\xe9\x83\xbe\xc8\x02\x9a\x81\x9f\x74\x29\x1c\x47\x93\x5a\xd2\x5f\xe2\x4b\x3c\x0f\x3c\x70\xf6\xb0\x09\x02\xe3\xa4\xb1\x3b\x4f\x7d\x55\x14\xdb\x93\x7c\x69\x86\xa2\xb0\x09\x22\x9e\x25\xe3\xda\x6c\x17\xed\x7c\xc3\xcb\xd2\x66\xcf\xb5\x3d\xba\x38\x07\xaa\x49\xbf\x55\xba\xd8\xe7\xdd\xac\x19\x0a\x04\x26\x0c\x2d\x34\x98\x08\xca\x0f\x79\xdb\x7e\x85\x9b\x33\x21\xe3\x89\x99\x80\xbb\x1d\x9f\xe0\x74\x58\x14\x04\xbc\x07\xa8\xec\x73\x2b\xcf\xea\x8f\x65\x11\xf9\x6e\xf2\x74\xde\x9b\xea\xe2\x4c\x88\x75\xec\x7a\x1a\xaf\xf3\x8f\xe7\xa1\x64\x65\x22\xcd\x12\x0b\xd1\x54\xef\xd8\x36\xfb\x6d\x55\xe8\x45\xff\xc7\x44\x68\xc2\x68\x90\xb8\x78\xa8\x7a\x83\x66\xe2\x38\xa6\x28\xff\xe6\x54\xce\x19\xf6\x96\x33\x6d\x26\x16\x49\x30\x6a\x9f\xa7\x6c\xef\x57\xe5\xb7\xbf\x17\xbd\x99\x18\x15\xdd\x84\x95\x64\xa2\xea\x48\xd4\xdf\xa0\x49\x2c\xb9\x37\x96\xa4\x86\x84\x4d\x7b\x6b\x1e\x10\x35\xea\x6d\x0b\x05\x1e\x46\x6f\x84\x47\x02\x07\x66\x98\x6f\xd0\x5c\x4a\x5e\x80\xe1\x46\x92\x0f\xfe\x54\xe3\xad\xaa\x3c\x59\x5b\x3f\xa9\x12\xce\x4c\xcf\xe2\xb6\x7b\xab\xb1\xe9\x4c\xef\xc0\xf5\x64\x12\x23\x08\x50\xd4\x2d\xdf\xbc\x19\xf5\xd1\x9a\xc4\xe8\xc8\x6d\x0e\x34\xa3\xda\xcb\xbe\x7a\x93\x46\x8a\xd8\x46\xba\x8b\xe6\xe5\x6b\xf3\x68\xf6\x57\x2f\x77\x77\xf3\x51\x02\xc9\x17\xb4\x53\xff\x1a\xa1\x98\x06\x47\xbe\x1c\x6c\xb2\x2c\x10\x23\x6e\xfc\x65\x72\x4e\x93\xa9\x84\xd2\x71\xfb\xed\xcb\xb4\xee\xe7\x8e\x0b\x19\x51\x0d\xe6\x58\x79\x45\x71\x7f\x40\x71\x42\x01\x3b\xc2\x4a\x9b\xc9\x7b\xba\x60\x2a\x33\x42\x07\xa9\x13\x45\x9b\x30\xd4\x2e\x5b\xd3\x6e\xb8\xe7\xdb\x25\x64\xf9\x8a\x20\xd8\x34\x8d\x1f\x4e\x33\xb6\x5a\x03\x81\xa0\xf9\x46\x92\x68\xa7\x2f\xcc\xab\x01\x61\x41\xa5\xd4\x45\x8c\xb5\xaf\x31\x4c\x07\xc9\x0c\x89\xc1\xcd\xc2\xc8\x26\xa9\x6a\xa3\xc2\x5e\x06\x7b\xc8\x74\x4f\x4f\x57\xa9\x21\x7b\xf5\x6f\xac\xab\xbd\x41\xb4\xed\xfe\xa0\x96\x9e\xf4\x8b\x99\xae\x10\xc8\x5e\x68\x68\x61\x5b\x9d\x6a\xd5\xd9\xab\x7f\x61\xe7\x81\x8f\xa4\xed\xc1\x68\x16\xc7\xae\x90\xbe\x3a\x48\x68\x1a\xd0\x17\x12\x10\x7e\x28\x58\xb2\xcc\x7d\xaf\xb2\x64\x51\x1a\xd3\x1f\xd6\x28\xfb\x26\x77\x2a\xe7\xfa\x8b\x8d\x2d\xb2\xc1\x24\xa6\x8a\xc2\x15\xd6\x79\xfb\x36\x6e\xe5\xf2\x03\xb4\x6d\xd6\xec\x8c\xbb\x13\x06\x1b\xd3\x56\x1a\x13\xdb\x04\x3a\xb9\x04\x24\x63\x58\xd5\x64\x6e\x7e\x6f\x00\x0c\x88\xc0\xdf\x1d\x61\x6b\x07\xca\x20\x19\x04\x31\x48\xe5\xc4\x4c\xea\x0f\xf4\xa4\x9d\xfe\x28\xd7\xfe\x4d\x59\xd3\xfb\x8c\x0d\x41\xc1\x16\x27\x8a\x0c\x82\xd4\x12\xb3\xbc\x12\x2f\x20\xd4\xe7\x11\x08\x6f\x69\xb6\xca\x20\x50\x99\xe9\x15\x96\xef\xf3\xb2\x1d\x3f\xb2\x0c\x02\x63\x01\x86\x64\x30\x02\x36\xfc\x59\x11\x06\x5b\x56\xd5\x7b\x4f\x73\xe8\x8e\x85\x11\x0b\x5c\xf8\xf3\x80\x9f\x03\xe3\xc4\x25\xf5\xf8\x78\x37\x96\x41\x98\x70\xef\x11\x0e\x2d\xb5\xf6\x33\x2e\x6d\x4f\x32\x08\xc1\x76\xf6\x9f\x4a\xf7\xf2\xc6\x59\x7f\x19\x84\x46\x5a\xde\xb5\x6e\x43\x72\x50\xe7\x45\x8c\x83\x0c\xe2\x48\x93\x89\xbe\xef\x49\xf0\x46\x7e\x9c\x0c\x78\x14\x67\xb1\xef\xc2\x25\x5b\x91\xff\xbb\xf3\xca\x9f\x88\xb9\xf4\xb6\x5c\xb5\x6d\x85\xed\xdb\xf4\x9c\x24\xb5\x18\x1f\xb7\xdc\xbe\xc1\x97\x92\x2d\x8b\xff\x2e\xe7\x1a\x65\xc0\x53\xc5\x71\x88\xdc\xf5\xed\xe1\x58\x10\xd3\xc4\x28\x90\x90\x01\x57\x36\x65\xf2\x8f\x09\x68\x56\x06\x49\x68\xa4\x23\xbc\x20\xaf\xf2\xcb\x44\x64\x6f\xf8\x65\x90\xf2\x94\xe4\x76\x3e\xaa\x16\x77\x95\xb5\x3d\x4f\x35\x96\x9e\xf9\x57\x06\x59\xa4\x28\xaa\x68\x4e\xb2\xf1\xca\x6a\x8b\x1e\x94\x0c\x32\x69\x39\xde\x9b\xb7\xea\xd3\xb3\x73\x8d\x16\xa9\x0c\x32\xdf\xec\xbb\xd7\xd8\x80\xc9\xa1\x6c\x5d\x7a\x22\x8c\xdd\x10\x11\x25\xa6\x57\x0e\xdf\xd3\xcc\x9c\x88\x79\xc8\x40\x80\x96\x0e\x03\xf1\xf1\xad\xf2\xae\x8f\x0c\x20\x66\x44\x91\x7b\x5a\x90\xee\xf2\x43\x92\xd8\x52\x13\x40\xab\xde\xe6\xf8\xa7\x31\x00\x6d\x76\x9e\x54\x76\xe3\x5d\x69\xfd\x54\x55\x85\x93\x01\x9c\x56\x81\xfd\x50\x34\xa4\x4d\xf6\xe1\xf2\x07\x37\xf9\x82\x98\xd2\x10\x58\x8f\xbf\x85\x0a\x32\xe9\xea\x54\xd7\x28\xf3\xf6\xa1\x2a\xd5\x14\x72\x2a\x03\x95\x31\xc2\x35\xbb\x5e\xd2\xe9\x7a\x56\x59\x46\x2e\x35\x15\xbc\x5f\xca\x1a\x3b\xcf\x72\xde\xed\x30\x7d\x32\x85\xa9\xe5\xaf\xab\x5a\x28\xbe\x57\x85\xee\x42\xd7\xc9\x45\x75\x62\xe8\xae\xca\xea\xb2\xc7\x4c\x06\x3a\xb5\xf5\xb9\x2e\x82\xd9\xad\xd7\xfd\x49\x92\x73\x17\xe2\xec\x23\x36\x66\xd9\xe9\x9f\x04\x83\xd0\xd8\xf6\xb6\x4d\x5d\x57\xe3\x44\xac\x0c\x03\x06\x08\xd3\x22\x5c\x1f\xc8\xcb\x30\x90\x8c\x98\xfd\x9e\x9e\x37\xfb\xed\xea\x6e\xb3\xbf\x7a\x7c\x78\xd9\x12\xd7\xee\x7a\xe3\x99\x17\x65\x18\x0a\x93\xb8\xc5\x64\x73\xb4\x33\xa9\x7f\x19\x86\xa8\x53\x27\x21\xa6\x4e\xe8\x05\x30\x7d\x5e\xef\xa9\x2a\x8a\x51\x5e\xcf\x9d\xc3\x32\x9e\x72\x0b\x69\x3e\x0e\xbd\x51\x32\x8c\x98\x6d\xea\xd3\xa8\x88\xfe\x61\x4e\x88\x26\xc3\x28\xb2\xc2\x00\x2d\x91\x42\xcf\x2a\x9d\x32\x8c\xb3\x8c\x5a\x87\xf7\x25\x7e\xce\xa8\xed\x7e\xeb\x83\xca\x90\x67\x91\xb1\x85\x90\xab\x6e\x5e\x7b\xff\xbc\x3b\xa0\x35\xf7\x81\x26\x3d\x9e\x05\x88\xcd\xd2\x35\x32\xe4\xa0\x32\x74\x91\xfd\x55\x55\x4d\xf3\xd8\x32\x4c\xa2\xc0\x0b\x67\x74\xb1\x4c\xde\x6f\x07\x61\x22\x34\x81\xbe\xaf\xf3\x63\x51\x1d\x60\xef\xda\xf2\xf6\xc7\x1e\x25\x24\xc3\x94\xa7\xe4\x32\xd1\xac\x5c\x48\xe2\xcb\x30\x05\xe1\xd4\xb1\x9f\x8b\xe3\xec\x1b\xa5\x2a\x53\xca\x27\x5c\xd8\x40\x78\xea\x0f\x63\x40\x1c\x0a\x0f\xa7\xa2\xc8\xcd\xf9\x6f\x95\xdc\x65\x98\xa5\x56\x79\x6e\x2f\x4f\x79\xa1\xb7\xd8\xb6\x05\xfa\xa6\xd3\xc9\x9d\x09\x1e\x99\x41\x56\x8a\x74\xd3\xdc\x11\x88\x53\x4a\xe0\xff\x78\xbc\x7b\xb9\xdf\xec\x19\xef\x0f\x70\xa0\xc8\xdc\x14\xf9\xb1\x6f\x23\xde\x7e\xe6\x9d\xc5\xa9\x06\x9f\x5b\x86\xa0\x13\x8a\xe3\x5e\xa1\xc5\x3f\xf1\xdc\x9f\xaf\x0d\xf9\xc5\xd7\x2f\xcf\x2b\x42\xbc\x5f\x6d\x6e\x1e\x9f\x37\xfb\xe7\xcd\x76\xd7\xfd\xfb\xf2\xb0\x7d\xbc\xbb\xee\x47\x9b\x8c\xac\xf3\x8e\xaa\x5b\xee\x8f\x92\x85\x14\xb0\x3f\xa3\xa1\x28\x70\x31\x75\xe6\xc7\x0a\x41\x78\xec\xbc\x71\x08\xaf\x2e\x4e\xa5\x0c\x3d\xf5\xff\xf4\xa9\x3a\x19\x2a\x11\xf1\xb0\xd7\x5e\x78\x80\x36\xff\x70\x75\xe3\x25\x94\xa8\x0c\x95\x0a\x28\x5d\xd4\x45\x87\x45\xf5\x41\x5d\xce\x94\xb2\xbf\x7b\xfc\x31\x13\xb1\x5a\xe8\x11\x19\xee\x50\x87\xca\xea\x90\xe7\x58\xef\x6b\x68\x71\xdf\x3f\xa8\x8e\xb9\x71\x45\x07\x42\xbc\xcd\x58\xd1\xff\x63\x6c\x53\x74\x6a\xa8\xcd\xee\x13\x75\x37\x45\x07\xa6\x43\x19\x6a\x83\xd6\x0f\xea\x66\xc3\xad\x8e\x96\xfd\xaf\x10\x79\x4c\xde\x9c\x75\xbb\xfa\xbe\xef\xe9\x53\x23\x4a\xde\xcb\x98\xfe\xc4\xdc\x1a\xd3\x2e\xe2\xf0\xfe\x55\x68\x92\x80\xf0\x87\x37\x90\x17\x79\xf9\x7a\x8d\xc7\xa2\x3a\x0f\x5c\x73\x92\x05\x5c\x79\x97\xe4\xba\xfa\x2c\x7f\x54\xad\xcd\x5f\xb8\xad\xd2\x79\x0d\xa1\x5b\x9e\x2c\x0c\xa2\xb4\xaf\xca\x61\x33\x6f\xc0\x95\x8c\x85\x8a\xfa\x6c\xbe\x83\xc6\x86\xf2\xf3\x93\x7b\x66\x2c\xc4\x98\x14\x84\x4f\x58\x8c\x72\x34\x92\x31\x9d\xd2\x3a\x79\x7a\x7e\xbc\x7f\xa4\xc9\xf8\xf4\xfc\xf8\xed\x79\x75\xef\x07\x44\x18\x11\x18\x17\xea\xfa\xb7\x7e\x72\x37\xd2\xa4\x2e\xb9\x49\xe5\xf1\x6e\xc2\x5a\x9f\x6a\xf4\x91\x58\x1c\x64\x54\x5d\x7b\xda\x3c\x77\xa6\x7c\x7f\xbd\xb9\xbb\xbd\xbf\xdd\x79\x4c\xa2\x64\x31\x67\x99\x73\xb7\x49\xd8\xf4\xda\x55\x16\xc8\xdc\x5e\x39\xe5\xac\x91\xb3\xc4\x62\x13\x10\x3d\x4f\xe5\xbb\xac\x9b\x31\x6d\xbc\x64\x9c\xdb\x98\xd8\xc5\x89\x8e\xbc\xc3\x12\xc8\xe0\xd8\x9a\x32\x9e\x18\xc2\x55\x93\x92\xfc\xda\x71\xba\x3d\x39\x41\x33\x3f\x46\x86\xd4\x06\x7c\x5d\xc3\xe7\x33\x82\x3e\xef\xaa\x27\x38\x57\xa7\x76\xbc\x05\x66\x0b\xff\x3d\x31\xb8\x8c\x4b\x1d\x7a\x4f\x2e\x5f\x86\x70\x48\xc6\x8d\xa6\x14\xf5\xf6\xf1\xfa\xf6\xe5\x7e\xc4\x32\x2f\x59\xc2\x02\xaa\x23\xfc\x03\xea\x6a\x5b\x20\x2e\x87\x9e\x92\xa5\x18\xfa\x02\x65\x31\x5a\xc7\xd3\x9b\xc9\x02\x45\x39\x53\xaa\xc9\xab\xf7\xb1\x6a\xda\xf2\xa7\xce\xd2\x84\x0a\xbe\x07\xc8\xcb\x1b\x90\x75\xae\x26\xf8\x44\xc9\x32\x15\x19\xe6\x55\x8b\x3a\x1f\x67\x69\xdd\x33\x21\x44\x86\x33\xaa\x7d\x77\x08\x78\xa8\xc3\xa9\x0a\xa9\x25\xef\x9f\x0d\x4b\x75\xe0\x54\x69\x7f\x50\x1b\x7e\xcf\x2c\x3a\x7f\x82\x8b\xe6\x03\xc9\x00\x25\x11\x63\xbb\x7c\x72\x43\x8c\x6d\x43\x0b\xc1\xcc\x56\xfd\xf7\xff\x0c\x5d\x39\xb3\xe7\x90\x1a\xa9\x81\xa3\x1b\x9f\xb7\x67\x0b\x51\x9d\xec\xfd\x4c\x71\x20\x04\xc9\x1b\x34\xcf\x50\xea\xea\xd0\x1f\x40\x46\x84\x2e\xd7\x88\x7a\x5d\x54\xcd\x30\x1b\x15\xea\xd0\x7a\xc1\xf8\x91\x57\xa7\x86\x50\x9e\x7d\x86\x91\x8e\x13\x07\x93\x6d\xf8\xac\x46\xa2\x22\x93\x1d\x78\x94\xec\x5f\xfe\x98\x3a\x0d\x23\x74\x8c\x39\xcd\xcc\xae\x68\x95\x25\x63\xee\xb7\xcb\xe8\x5d\x32\x8d\x21\x55\x98\x5d\xaa\xcf\x81\xee\xed\xa4\x9f\xa0\x98\x86\x37\x8f\x89\x20\x5c\xe7\x5b\x75\xc4\x25\x4e\x96\xb1\xbf\xcd\x50\xc6\x04\x8a\x78\x7c\xd8\xec\x9d\xd5\xf8\xa3\x3f\x24\xa8\xdf\x32\x3f\x1c\x7d\xbb\x4b\x63\x6b\x8b\xc3\x08\x43\xd6\x64\x5d\x35\xdd\x13\x4c\x97\x49\xbf\x00\x4c\xc8\x5d\xa6\x0a\xf4\x3e\x8f\xbc\x1d\x67\x26\x62\x04\x53\xdf\x3c\xae\xb7\x8b\x74\x47\xe3\x1b\x8d\x02\x8e\xde\x89\xba\xaa\x4a\x6d\x31\x42\x93\x77\x15\x05\x59\x4c\x72\x91\x36\x93\x58\xcf\xb3\x40\x32\x0a\x74\x2a\x92\x21\x67\x36\xaa\x31\x4d\x26\x7e\x14\x26\xa6\xef\xd2\x22\x10\xcf\x82\x0c\xa7\x1b\xca\x64\x62\x26\x7d\x70\x3f\xd7\xcb\xc6\x22\x8a\x82\x94\x99\x5e\xa4\x6c\x57\x59\x42\x89\xfe\x65\x46\x91\xb6\xca\xa9\xa7\xf2\x08\xa7\x66\x94\x64\x93\x51\x84\x29\x11\xac\xde\x57\x1f\xb8\x1c\x8e\xcc\xea\xa2\xee\xbc\x38\x10\x94\x93\xe9\x16\xce\x13\xaa\x93\xf7\xb6\xa3\x98\x47\xb1\x1a\x60\x9e\x8f\x66\xea\xb1\x46\x31\x72\x2a\x6f\x13\x74\xec\xea\xe5\xd9\x5b\xc6\x88\xa7\x19\xb9\x6d\x87\xea\xe3\x82\x98\x7a\xf6\xbc\x5c\xda\x46\x98\xfb\xbc\x6c\x6f\x1f\xae\xff\x6a\xb4\xeb\xc6\xaa\x49\x5c\x7c\x57\xc3\x07\x16\xa4\x05\x78\x7e\xc6\x86\xd2\x65\xcb\x0e\x58\x94\x84\x21\x52\x0b\x78\x17\xea\xfe\xf4\x6d\xf5\x17\xb4\x32\x7e\x34\x30\xaa\xed\x2b\x6a\xca\xb8\x20\xed\x9c\x0d\x46\x4e\x96\xc7\x76\xdc\x6c\x7e\xd9\x3c\xac\x43\xc7\x34\x93\xf6\xfb\x51\x1c\x1a\x25\x68\x7c\x4a\xf4\x1e\xca\xf3\xae\xfa\xf3\xac\xe6\x21\x43\x94\x06\x92\xdc\xdc\xaa\xd6\x58\xff\x84\x86\xea\xe5\x7f\x2f\x60\x89\xd2\xd0\x78\xf4\xe3\x3d\xfc\x5a\x82\x26\xc9\x28\x85\x30\xb1\xf0\xbc\xf3\x4a\x53\xd7\x29\xd5\x4f\xa6\x9f\x39\x13\x82\xb3\x9e\x93\xcc\x99\x40\xff\xa9\x33\x89\x21\x75\x71\x54\x6d\x6e\xce\xeb\x37\xa8\xfb\x98\x24\x12\x69\x98\x0c\x84\x32\x0f\x55\xf9\x8c\x47\xb4\xd2\x0d\x3f\x8e\xc6\x1a\x89\x79\xc3\x47\xff\x30\xd3\x8d\x22\x12\x8e\x3d\xb0\x25\x49\xdd\xf9\x7c\x5e\xfe\x32\x42\x65\xdc\x78\x72\xec\x16\x8a\xc7\x4f\x17\xa7\x3f\xe3\x11\x72\xbd\xab\xee\x6c\xa9\x73\xfa\xb8\x02\x81\x7e\xe9\xfe\xf6\x61\xbf\x5a\xaf\x37\x4f\xbb\xfd\x66\xf7\xbd\x77\x8e\x22\x88\x02\x9f\x50\x74\x5a\xe0\x94\x51\xa7\xef\x3b\x5d\xf5\x90\xa6\x54\x14\xa4\xf5\xb1\x7a\xbe\x1a\xb9\x58\x91\x64\x56\x55\xdc\x17\x86\xf6\x71\x7f\x24\xd3\xbe\x21\x79\x94\xf9\x1b\x48\xc2\xdc\x30\x85\x56\x99\xdb\x7d\x58\x9b\x55\xf0\xd7\x50\x86\x93\xc6\x93\xd7\x8b\x20\x0a\x89\x2f\xe6\xaf\x0e\x23\xe5\xdc\x20\x07\xc7\xf8\x8a\xab\x48\x46\x9a\x03\x99\xd7\x6f\x97\xbc\xc9\x32\xd2\x22\x22\x99\x88\x7f\xed\x7c\x86\x22\xc2\x38\x10\xe0\xf0\xd2\xaf\xaf\x5f\x64\x21\x23\x8c\x2d\x4c\xeb\xc6\xaa\xad\x0e\xae\x71\x84\x5c\x06\x30\x15\x17\x8d\xe2\x49\xb6\x2b\x32\x81\xe5\xbd\x39\xe4\xe5\x3e\x2f\x3f\xfc\x99\x86\x47\x91\x5d\x95\xdd\xb4\x1e\xa1\xef\xbb\x43\x92\xf8\xc8\x6c\x97\x9a\x5f\xdc\xfe\xa0\x09\x88\xfb\x76\x77\xbb\xdb\xae\x1f\x7d\x1b\xb4\x8c\x43\x13\x53\x39\xf9\x08\x67\xac\x27\x68\x4e\x19\xb3\xd8\x16\xfd\x5d\xba\xa8\xdb\xe7\xfa\x43\x1a\x05\xf3\x74\xfd\xb2\x51\x75\x2e\xad\x0e\x05\x01\x35\x86\x97\x17\x47\x10\x86\xe8\x5d\xee\xe6\x6d\xd6\x67\x2a\xe3\x38\x90\x96\xd6\xe0\x54\xae\xab\xc3\xf1\xd4\x22\x55\x46\xc6\x89\xf0\x38\xe6\x81\x8f\x68\x9e\xaf\x7b\x1d\xf8\xd9\x75\x44\x9a\x31\x9f\x22\x3e\x1c\x4e\x9d\xb3\xb4\xa4\x9c\x25\xe3\x18\x03\xca\xf5\xdb\xa8\x9c\x7a\x98\x1f\x4e\x94\x92\x9b\xcc\x9f\x98\x33\x24\x0c\x41\x25\xff\x17\x55\x7b\x5d\x9d\x64\xdf\x63\x20\xbb\x1d\xc4\x84\x7e\x0b\x51\xf5\xe9\xaf\x1b\xfc\xfb\x13\x2d\xf3\xe6\x7a\xa2\x33\x25\x63\xae\x03\xa1\x07\x46\xd2\x6f\x70\xb0\xc8\x1f\x77\x38\x0d\x75\xda\xf3\xb5\x43\x61\xe3\xc2\x09\xbe\x63\xd9\x5a\xc6\x29\x63\xa1\xf0\x8a\xe8\x24\xb1\xda\x1f\x50\x94\xee\x93\xd8\x32\x8d\x45\x0b\xb3\x3a\xb4\x8c\xd3\xc4\xf6\xbf\x6b\x2c\xf2\x0f\xa7\x69\xd0\x4c\xf8\x37\x67\xbf\x95\x85\x9c\x10\x92\x8e\x7e\x7b\x44\x9e\x24\xe3\x2c\x65\x44\x63\xd7\xb4\xd5\xf1\x38\xc0\x2a\x65\x9c\xe9\xd0\x32\x43\x3a\x7d\x9b\xea\xa9\xc6\x43\x7e\x3a\x4c\xad\x57\x2c\x59\x64\xd1\x97\xcb\xce\xd2\x69\x4e\x8c\x24\x63\x99\x4a\xda\xbf\x8a\xbc\x69\x6f\xaa\x7a\x4c\x2d\x35\x5d\xfd\xb1\x0a\x82\x11\x0c\x14\x0b\x6c\x2f\xa8\xe7\x64\xac\x84\x15\x91\xb0\xe8\x25\x2c\xf5\x97\xad\xc7\x32\x56\x52\x5b\x65\x9b\x1a\x94\x63\x21\xdf\xb6\xd5\xd1\x7a\xb8\x6e\x8c\xd7\x6d\xb8\xd9\xae\xa3\xfe\x6f\xb1\xf4\xfd\x27\x2e\xe4\x98\x97\xa6\x97\x3f\xb2\x4e\xad\x92\x50\x0b\xaf\x7f\x2c\xb9\x42\xb1\x16\x48\x85\xd0\x1e\x76\x61\x6f\xca\x9b\x8e\x18\x23\x43\x0d\x9b\xa0\xf5\x08\xbf\xe9\xe2\x6a\x1e\x30\x49\x58\xb0\x4d\xfb\x26\xb1\x7d\xac\x41\x15\xe3\x16\x88\xc5\xc9\xc0\x03\xa6\xb5\xf0\x2f\xd5\x4b\xaa\xf7\x2a\x53\xd3\xaf\xcb\x83\x38\x0a\x69\xaa\xe5\x4b\x8c\xc4\x7e\x90\x4a\x52\xcf\x1e\x43\xde\xcd\x44\x0b\x5f\xf2\x30\x00\xda\x1c\xec\xb6\xec\x9a\x35\xbe\xb8\x56\x98\x24\xe8\xab\x9e\xd6\xa3\x59\x92\x83\xf4\x83\x45\xe2\x05\xc0\x49\xfc\xfb\xff\x5d\xb9\xe6\xff\x87\x7f\xfd\x7d\x68\xa4\xaa\xd6\xed\xf5\x66\x75\xd7\x3f\xb5\x89\xa8\x01\xa8\x47\x62\x20\xf8\x00\x90\x33\x05\x5e\x45\xe3\xb1\x7e\xa5\x9d\xad\x59\x5f\x9a\x44\x1e\xa5\x16\xa3\x73\xa0\x0c\x70\x73\x8d\x85\x27\x02\x94\x3c\x0e\xd8\xd0\xfb\x7c\x03\x75\xdb\x78\x59\xca\x7e\x04\x43\x13\x8c\x92\x33\x0b\x6a\x00\x92\xf3\xc8\x4a\x3c\x5a\xab\x3b\x61\xd0\xff\x92\x85\xe7\x2b\x8b\x3a\x9e\xda\x3c\x81\xc4\xe6\x74\x4e\x50\x43\xd9\x22\xea\xab\xd3\x19\xeb\x49\x83\xb6\xe4\x29\xcb\x84\x8b\x69\x9a\xca\x2a\xb4\x3a\xdd\x0b\xc7\xc8\xae\x6f\x20\xef\xf3\x3a\x3c\x8d\xac\x84\x8f\x55\xb1\xe8\x4c\x87\x75\x0b\xa0\x28\x24\xa8\x0b\x01\x2e\x7f\x16\x8f\x22\x0b\x4a\xa2\x9c\xe9\x84\x94\x51\xf2\x8c\x69\x2a\x85\x1c\x5e\x0f\x97\xf2\x95\x92\x67\xb1\x6d\xd5\x26\x52\xda\xb5\x13\xbd\x9d\x26\xf2\xa7\x6f\x54\xc8\x98\x9a\x7a\x8e\x70\xee\xcc\xd5\x4f\xcc\xe7\x1f\x46\x68\xdb\xf6\x73\x0d\x75\x0e\xcf\x55\xfb\x5e\x8d\xb7\x1c\x0e\xa1\xa5\x7f\x3c\x9c\x89\x89\x19\xfb\x3b\x85\xd8\x50\x7c\x74\x2c\x40\xe1\xd5\x02\xae\xe8\x6f\x54\x23\x39\xa4\xb6\x0d\x1a\x7f\xb5\x58\x6a\x7a\x2a\x0a\x4b\x2d\xe5\xef\x12\xa0\x5c\x72\xd0\xc6\x63\x18\xa9\xb3\xfb\xbe\xd7\xfb\x5c\xec\xd8\x96\x5c\x46\x48\xf9\x39\x3c\x60\xfd\x8a\xa5\x3a\xf7\x98\xd2\xcb\x6a\x25\x97\xdc\xb2\x8f\x5b\x25\xa3\x3f\x47\x92\x37\x92\xcb\xc4\xea\x09\x1d\xce\xd4\xeb\xe2\xa3\x74\xae\xa2\x8c\xf5\xb3\x7f\x7f\xbb\x7e\xdc\x37\x23\xf4\x84\xe4\x3a\x92\x4a\x0e\xa4\x69\x5e\x1b\xbb\x3f\x1c\x07\x68\x01\x55\x36\xc2\xf1\x7f\x4e\x04\xb8\x15\xb3\x19\x3a\xb7\xa6\x8f\xa6\xb5\x0c\x8c\xc7\xa1\x3b\x75\xa8\x85\xf2\x07\xc7\x20\xa1\x99\x7d\x57\x95\xaf\x3b\xac\x0f\x4e\x8e\xbd\x8b\x3b\xbf\xa6\x03\x9e\xbd\x77\x8c\x34\x39\xaa\xba\xda\xbd\x75\x06\x75\xb2\xc0\x90\x67\x54\xb3\xba\x2d\x1b\x1c\x57\x8c\x39\xa6\x19\xbd\xb3\xef\xd0\x6c\xf3\xd7\xd2\x6a\x8c\xf9\x7a\xc1\xf4\x61\x50\x68\x74\x86\x28\x0a\x56\x35\x51\x49\x34\x63\xc6\xb3\x6e\x08\x12\xf6\xac\x7d\xcb\x6b\xfd\x13\xd1\x6f\x94\xdc\xc4\x09\x65\x06\xaa\x09\xdb\xcc\x6c\xb6\x19\xc1\x29\x6a\xb8\xdb\x6e\x46\xb7\x98\x04\x0c\x29\x95\xf9\xa3\x2a\xde\x1b\x35\x3a\x10\x8a\x4c\x6b\x6f\x19\xd7\xa0\xde\xd0\x42\x48\x2c\x2b\x1f\xd6\xdf\xa0\xe9\xdc\xdd\xe6\x27\x34\xdd\xa2\xef\xd7\x54\x12\x31\xcb\x96\x26\x5b\xaf\x26\x2b\x93\x98\xf9\xce\x24\xd4\xb6\x3b\x64\xdc\x59\x25\x93\x58\x59\xb0\xd2\x9f\xb7\xf7\x9b\x7f\x2e\x97\x52\x93\x58\xa5\x94\x4c\xb5\x74\x3e\x14\xfb\x13\x7f\xa4\xf5\x4c\xc7\x1f\x24\x89\x31\xf6\x3a\xad\xbb\x01\x88\x73\x75\x1e\xfd\x9f\xdb\x59\xee\x27\xe1\x51\x4c\xa9\x76\x2b\x2f\xb7\xf7\xed\xe4\x55\xdd\xdf\x64\x2a\x91\x1e\x62\x75\xf3\xf2\xb0\x6c\xdf\x92\x4c\x66\x89\x23\xc0\xf4\x64\x0d\x7d\xa3\x97\x37\x1e\x89\xe0\x31\x95\x84\xae\xaa\x53\xdd\x8c\xdb\x3f\x65\x22\x44\x42\xf5\xbe\xe6\x13\x8e\x3f\xf3\x72\x94\xc2\xba\x44\x2a\xca\x04\x82\x8c\x90\x17\xdf\x6a\x44\xfd\x94\xf7\x37\x0a\x81\x21\x46\xa4\x16\x9a\xf7\x66\xf2\x9e\x21\xb4\xe2\xba\x2d\x36\xed\xee\xad\xae\x3e\x9f\x91\x12\x98\x9b\xd2\x54\xb5\xc2\x67\xfc\xc8\x1b\x92\x0f\xf7\xe3\x39\xa7\x98\x68\x7f\xc8\x9d\x30\xfd\x17\x0f\x0e\x3a\x41\x33\xa7\xb2\xbd\x78\xc7\x60\x22\x6d\xab\xd9\x87\xbc\x15\xfd\x8f\x18\xee\xc5\x48\x1d\x23\xfe\x13\x9c\x2f\xe4\x8d\x64\x22\xc3\x88\xe4\xa0\xda\x1c\xeb\xd0\x9f\x2c\xa3\xcc\xf3\xa3\x92\xe3\xed\xf6\x8c\x9b\xaa\x5e\x57\x6e\xa5\xcd\x02\xa1\x44\xc6\x49\x68\xdb\x66\x4b\xbd\xd9\xad\x67\x47\x55\x68\x29\x3b\x9e\xbd\x14\xbf\xff\x25\x15\x5b\xba\x2c\x79\xaa\xcb\xdd\x5b\x3e\x4b\xd6\x26\x3a\x08\x09\xe2\xb7\x29\xf5\x7e\x6e\xe5\x12\xcd\x02\xdb\xbd\x73\xc4\x05\xad\xd2\xc5\x4d\xe2\x77\x5b\x47\xa2\x33\x95\xa6\x23\x55\x83\xa7\xea\x13\x6b\xd4\x2f\xbe\x86\x9f\x60\x6a\x3b\x43\x1c\x34\x72\x94\x0c\x4f\x4c\x60\xc8\x6c\x12\x9b\xf7\xaa\x28\xd6\x50\x6a\x82\x52\x34\x57\xe7\x6d\x09\xc7\xe6\xad\x5a\xc0\x89\xc9\xc4\x84\x29\xe5\x54\xb6\xf9\xe1\x58\xe0\xea\xff\x4e\x40\x21\x28\x39\xbb\x5f\x24\xdf\x12\x93\x28\x2a\xb4\x1c\xeb\xaa\x25\x8d\xad\x6b\x2c\xab\x83\xe3\xeb\x7d\x34\x8f\x75\xfe\xda\x5b\x9c\x34\x60\x82\x56\xe0\x2b\x1c\x90\x48\x26\x8e\xbe\xa7\xbe\x3b\x66\x2b\xe8\x3a\x6f\x54\x2f\xac\x2b\xd3\x20\x0d\xa8\x1a\xe8\x04\x5c\xee\xa1\x3c\xcf\x33\x69\x69\x00\x96\xff\x73\xaf\x6c\xf4\xfc\xf4\xe3\x69\x24\x6e\x3a\xef\xeb\x90\x69\x98\x65\x94\xbb\x6a\x5c\x2d\x63\xac\x18\xfe\xdf\xcc\xd5\x21\xe2\x51\x2b\x47\xe6\x12\xec\x7d\x90\x93\xf8\x9f\x0e\x21\x55\xd1\xa5\x4c\xdc\x5f\xf9\xc6\x93\x09\x99\xb2\x24\x0b\x54\x9f\x1f\xb8\xdc\x40\x96\xb2\xe1\x29\x93\x21\xf9\xbc\x55\x61\x33\xe1\x4f\x75\x65\x7a\x03\x91\x46\xa1\x65\xef\xdb\xfc\x52\x50\xe4\xf2\x54\xf7\x07\xd2\x20\xb2\x28\x8b\xe2\xb9\x2a\xf0\xa6\xaa\x5f\x9a\x2f\x90\x38\x69\x1c\x25\x90\x0e\x2c\xe2\xcd\x75\x5d\xe5\xba\xb9\xed\x43\xa6\x34\x06\xde\x73\x29\x0e\xf9\xa5\x47\x63\x13\x05\xc3\x30\x19\x53\x4d\x92\x2a\x6c\xfb\xed\xcb\xd3\xd3\xdd\xbf\xf6\x8f\x3f\x1f\xfa\x8c\x59\x1a\x6b\xa5\x2d\x47\x8f\xe5\x17\xfd\xa2\x83\x4d\xa6\x3c\x60\xb4\x06\xa9\xdf\xd2\xf9\x7a\x53\xd8\xb4\x4c\x39\x30\x9a\x65\x24\x73\x70\xdf\x4f\xb0\x44\x67\x64\x79\x7b\x9c\xac\xfb\x7b\x9a\x06\x54\x84\x78\xfa\x7f\x68\x7b\xb3\xe5\xc6\x91\x24\x0b\xf4\x77\xea\xa1\x1f\xb0\x04\xb6\x47\x8a\xa2\x52\x9c\x92\x44\x36\x49\x65\x56\x75\xdb\x18\x2d\x16\x0f\x11\x2d\x10\xe0\x00\xa0\x94\xac\xaf\xbf\x06\xf7\x08\x6c\x04\x95\xd5\xd7\xee\x9d\x87\xc9\x6a\x21\x00\x62\x89\xf0\xf0\xe5\xf8\x39\x9b\x05\x3a\x37\x84\x85\xd9\x2d\x9f\x17\x6d\x99\x3c\x8a\x22\x96\x0c\x98\xc0\x96\xea\x76\xaf\xb9\x88\x22\xe1\x62\x8b\x13\xd1\x61\x58\x17\xd6\x1e\x54\x11\xc2\x54\xe6\x45\x7e\xce\xff\x66\x20\x1f\xc5\xcc\x45\x26\x8e\x59\xc9\xdf\x0a\x3a\xab\xf1\xc8\x9f\x7b\x8b\xf8\x2a\x61\xfa\x55\x60\x16\xdb\xeb\x06\x09\x46\xe0\xc4\x96\xb2\x3b\x74\x1e\x70\x14\x07\x9a\x68\xf4\xd3\xf2\xbe\x2c\x4e\x6b\x7e\xb9\x4b\xeb\x6a\xe3\x5e\x2d\xbf\x58\xb9\xfd\x25\xda\xa1\x8c\x8b\xec\x1a\x32\x14\x25\xcc\x43\x87\xbc\x31\xff\x46\x2e\x71\xc4\x3f\x3e\xf5\x46\x93\xd0\xc7\x5a\xe2\x81\x57\xb3\x52\xa4\x35\xa0\xee\xde\x34\x32\x5f\x44\x3c\x24\xce\x90\x0f\x4a\x20\x34\xce\x99\xa9\x06\x99\x01\xd2\x0d\xd0\xd1\x32\xb4\x68\xc5\xdb\xb4\x75\x8b\x64\xe8\x49\x61\x53\x4e\xa4\xd4\xd2\x67\xbf\xb4\xa3\x44\x8c\xa9\x0e\x55\x16\xa7\x95\xd6\x55\x9b\x22\x8b\x94\x13\x62\x3e\x99\x9f\xeb\xe2\xd8\xf8\x44\x43\xc6\xe3\xf6\x15\x2a\x46\xde\xd3\x72\xbe\x7a\x78\xd8\x3e\xae\x36\x8b\xf6\x0a\x91\x4b\x4a\x87\xb8\x89\xd7\x87\x5d\x31\x87\xbc\xae\xba\xb7\xd7\x23\xfb\x11\x91\x52\x11\x1a\x05\x9d\xe6\x69\x75\x68\xfc\xdf\x34\x7f\x23\x36\x2b\x3b\x44\x73\xc6\x65\x2b\xe0\x81\xf8\x89\xf6\x90\x70\x62\xd1\x23\x93\x35\xc4\xe1\x93\xfe\x40\xa4\x15\x44\xae\x21\xb6\xbb\xd9\x0d\x37\xf8\x86\x1a\x02\x64\xe6\x79\x22\x41\xf8\x6b\x15\x1b\x11\x69\x9d\x24\x5e\xc7\xbc\xb6\x85\x2c\xd3\x45\x69\x3b\x6a\xdb\x1f\x8f\x9d\x90\xc4\x06\x0c\xe6\xc0\x3c\x40\xec\xfa\x9c\x9c\xcc\xf7\xf7\x76\x89\x4c\x4f\x91\xd8\x65\x11\x32\x3d\xa3\xec\xf0\x8f\x55\x7b\x05\x06\xe8\x82\x1a\x55\xb6\xc5\xcf\xb4\xaa\x47\x35\x93\xd8\x8d\x81\x13\x82\xf7\xa3\x09\x51\xd5\x4b\xef\xfe\xa6\x26\x6f\xec\x26\x1e\x42\x44\xf7\x1c\x71\x78\x57\x80\x22\x33\xcc\xf3\x42\xa4\x77\x6b\x8d\x8c\x95\x87\x81\x2b\x68\x88\x3d\x23\x84\xc0\xe9\xb1\xb1\xcf\xd0\xd0\xd8\x79\x19\x7b\xb1\x76\x2d\x64\xd8\x12\x63\x9a\x88\xdf\x66\xb9\x87\xd7\xf3\xb9\x83\x98\xe0\xe7\xcb\x6e\xf6\xd4\x77\x8d\x62\xe6\x53\x0a\x55\x66\x45\x95\xe6\x6f\xf7\xbc\x06\x53\x20\x69\x47\x28\x1f\xcb\x4d\xd5\x29\x4b\x6b\xda\x8c\xbe\x2f\xd7\xfb\x22\xcf\x2e\xfb\x7b\xb0\xb9\xfb\x38\x70\x00\x59\x92\x5a\xb9\xbc\x96\x4d\x6f\x95\x4f\x75\x2e\x0d\xbf\x5a\x90\xf8\x58\xb3\x87\xed\x6e\xb6\x5b\x6c\x26\x49\x62\xcc\xd0\xd0\x0b\xb0\x9b\xad\x99\xcc\x8b\x5d\xb8\x95\x45\x09\x77\x17\xe3\xb0\xb6\xdf\x32\x54\x31\xc6\x4c\xf3\xf5\xb7\xf5\x62\xb3\xf8\xb6\x59\xbe\x2c\xf6\x0f\xbb\xa7\xfd\x76\xbd\x58\x58\x8c\x58\x1c\xc5\x1a\x19\xad\x2d\xa3\x2f\x51\xef\x7f\x35\xd9\xe3\x48\x90\x10\xe3\x1b\xd4\x6b\x28\xab\x82\xc4\x5f\xeb\xf3\xc8\x55\x8d\x23\xe9\xf6\x90\x81\xc5\x27\x49\x99\x4c\xb7\x05\x8a\x38\x4e\x7c\x24\xbb\xfd\x57\x2a\x4c\x32\xda\xde\x62\x2c\x1d\x97\xba\xea\x89\xc6\xb7\xe5\x3d\xfb\xb2\x8c\x16\x27\xb1\x67\x35\x50\x67\xad\x8d\x88\xb9\x49\xab\xdc\x65\x67\x90\x87\xd4\xfa\x9c\xb1\xf0\x04\xeb\x39\x04\xad\x91\xb8\x0a\x76\x63\x21\x24\x71\x31\x19\xd7\x74\xf1\xb0\x6b\x2f\x22\x25\xb3\x14\x85\xd8\x01\xdc\x01\x53\x63\x01\x4e\x48\xe1\x74\xa9\x3e\x79\x39\x08\x9d\x62\x01\xb4\xe8\xb1\xe8\x59\xd5\x50\xe6\x85\x82\xd6\xb7\xb5\xa3\xa4\x47\x09\x78\x90\x36\x91\xfb\xcb\xa4\x62\x2c\x23\x89\x4d\x8b\xfd\x07\x6a\x13\x49\x83\x22\xef\x2f\xae\x13\x87\xa4\x46\x49\xbd\x4a\xab\x8f\x36\xb9\x12\xcb\x24\x42\xda\x11\xc4\x70\xd2\x22\x1c\x44\xb4\xb1\xf2\x03\x8c\x19\x8f\xa0\x52\x91\x0e\x02\x93\x58\xc9\xc8\x37\x04\x85\x08\xf7\x41\x36\xe9\x12\x56\xed\x7b\x83\x58\xb3\xd0\x88\xac\x83\xc4\xfb\xb7\xec\x4e\x66\x84\x76\x14\xa2\x3c\xd6\x45\xfe\x57\xda\xd8\xd5\xee\xd6\x74\xe4\x7a\x7d\x2e\xb2\x6f\x3d\x9e\xde\x2b\x99\x9b\xff\x5f\xb2\xba\x89\x13\xba\x11\xa5\x90\x5e\x97\x2f\x3b\xd7\x1d\x52\xab\x8b\xc4\x91\x20\x2d\xde\x09\x3e\xfb\x45\x95\xc4\x75\x43\x0c\x85\x4f\x64\xd1\xa6\xc5\x55\x44\xe2\x7a\x2c\x30\x69\xb5\xdf\x5f\xe6\xd4\x9a\x70\x1d\x81\x26\xae\xaf\x71\x81\xed\x2b\xa8\x47\xbd\x03\x83\x09\x9e\xb8\x3a\xc6\xfa\x2f\x36\x86\xd8\x42\xe3\x2c\xcb\xfa\x19\xb5\xc4\x0b\x24\x5a\xcd\x7d\x85\x42\xe5\xc3\x78\xdf\x8c\x61\x7e\xe2\x81\x75\x31\x8e\x3c\xcd\xad\xac\xef\x43\x51\xce\xca\x3a\x6d\x76\xf7\xfe\x44\x49\x58\xe0\x62\x64\x48\xa8\xec\x31\x1a\x64\xfa\xe9\x59\xe0\xa3\xef\xcb\xab\xaa\x25\xde\x1f\xab\x1f\x88\x24\x50\xb4\xfb\xb6\x24\xbb\x23\xa2\x40\x91\x84\xbe\x24\xcd\x1d\xf3\xc0\x4f\xa9\x68\xed\xb7\x01\xff\x0e\x2f\x19\x26\xae\xa5\x93\x7c\xe2\xb9\x5a\x54\x35\x39\xcf\xa3\xcb\x26\x0c\x1b\x94\x5a\x61\x75\x91\x44\xae\x83\x7c\x60\xe4\xc9\xcc\x48\xcc\xb4\x6a\x8f\x26\xd2\xea\x68\x3c\x16\x35\x64\xd5\xdd\x65\x84\x5c\x35\x03\x13\xdf\xc3\x10\xc6\xfc\xd5\x24\x06\xfb\xdd\x5f\x22\x49\x42\x07\xb3\x13\x04\xf2\x58\xd7\x5b\xae\xe1\x8f\xa7\x1e\xd8\x21\x69\xfe\xaf\xc5\xad\x3e\xa5\xf9\x7b\xbb\xae\x92\x44\x01\x12\x36\x3f\x17\x99\x1a\x40\xad\x86\xf7\x21\x1c\x0f\xa9\xf8\xe0\xa3\x09\x3d\x9a\xad\x73\xda\xc2\x27\xc2\xf5\x55\xdc\xc3\x35\x60\xef\x1f\x54\x23\x32\x52\x3b\x98\xc7\xe8\xee\x3d\x64\x45\x99\xfe\xe7\x4b\xf4\x54\x22\x7d\xed\x19\x0e\xfe\x1f\xbd\x1e\xaa\x44\x86\xd2\x37\x1e\x4f\xaa\x2f\xc3\xa9\x06\xae\x49\x2d\xd7\x87\x3b\x5e\x8d\x99\x3d\xec\x20\x3f\xa0\x9e\x15\xc3\x6e\x85\x25\xf2\xe1\x43\x81\x1f\x61\xea\x73\x97\xd6\x99\xd9\x99\xc6\xc8\xac\x04\xb4\x22\xb9\xd1\x73\xf6\x7e\xbb\xac\xd8\x0c\x93\x8d\xa5\xfb\xe7\xeb\xec\x77\xfb\x08\x5a\x26\x58\xba\xb1\xb3\x72\x5b\x1f\x4f\xd5\xae\xc0\x99\x79\xa3\x78\x48\x67\x72\xc7\x13\xb8\x4b\x3f\x5d\xce\x3b\xa4\xba\xea\x8c\x2e\x77\x18\x6d\x37\x58\x35\x5e\xfc\x3c\x65\xa9\x4c\x6b\xe2\x8d\x25\x17\x82\x94\x11\xfe\xd1\x5b\x70\xf4\xbf\x4c\x6c\xc5\x3d\xdf\x45\x8b\xbe\x4f\xab\x35\x1f\xbf\x13\xee\x01\x91\x9a\x9f\x4a\x38\x51\xf5\xad\x25\x32\x10\xdc\xf7\xb9\xb4\x98\x41\x28\xe7\x67\xbb\x33\x73\x16\x90\x1c\x74\x05\xf5\xea\x08\x6f\x7c\xba\x26\xc0\x99\xa1\x5c\x7a\x5a\x3d\xac\xda\x53\x79\x1c\x85\xad\xce\x90\x25\x83\x6e\x36\xbb\xd6\x89\xe3\x4c\xf8\x88\x54\x10\x69\x59\x1f\xfa\xa5\x5a\xce\xa4\x87\xd8\x82\x0d\x4f\xd1\x3c\x54\xf3\x8c\x57\x55\x2a\xdb\xe3\xc0\xa4\xd3\xa1\x52\x1e\x8a\xd2\x70\xfe\xb5\xc7\x13\xa1\xda\x84\x6d\x3a\x00\x48\xf0\xc0\x0b\xdc\x56\x76\x65\x67\xf4\xbc\xda\x83\x91\x63\x63\xb0\x7b\x5e\xbf\x6e\x9e\x06\x73\x94\x07\x5c\x61\x13\x40\x89\xec\xd3\x2f\xfc\x08\x7f\xa4\x93\xad\xd0\x82\x07\xc2\x63\x34\xc5\x2e\x3d\x92\x2d\xfb\xb9\xc2\x00\x14\xd1\x54\x89\x1b\x1d\xee\x82\x47\xdc\xb5\xba\x51\x78\x85\xef\x45\x76\x3e\x82\xe0\x15\x28\x8c\x0b\x9b\x1d\xe5\xa1\x28\x51\x1e\xc4\x1d\x7d\xf0\xd8\x49\x90\x4e\xea\x58\x9d\x85\x25\x11\xf8\xc7\xb9\x47\x26\x20\x78\xcc\x09\xf0\x9f\xe6\x15\x94\xf5\x75\x15\x9a\xc7\xc2\x47\xca\x35\x83\x52\x7f\x4e\x15\xfc\x1c\x4c\xda\xc4\x71\xb0\x2d\x9e\x4a\x8c\xb3\x5c\xed\x7a\xec\x0f\x57\x9b\xc4\x28\xf0\x1e\xde\x6f\xe2\x82\xcd\xfe\x3c\x16\x47\xe0\xea\xe3\x9a\xc8\x14\x15\x0a\x90\xed\xec\x2f\x28\x8b\x07\x80\x6a\xdc\x13\x36\xed\x77\xf2\x44\x6a\x64\xcf\xab\x8a\x4c\xdd\x81\x2e\x4a\x20\xe5\x86\x31\xe9\x87\xe0\x89\x92\x08\xd9\x52\x80\x24\x93\xd8\x5d\x47\xc4\x59\xa3\x39\x9f\x68\xe2\xc5\xef\x95\x00\x1e\x78\x9a\xfd\x42\x0f\x52\x70\x1e\xf9\x2c\x68\x1b\xc7\xef\x53\x9b\xc4\xb3\x79\x43\xb7\x1b\xc8\x2d\xab\xca\x23\x94\xc5\xac\x36\x59\xff\xd1\x26\xc9\x39\x37\xe2\x5b\x96\x35\x75\xe0\x42\xda\x41\xd2\x85\xd8\xf4\xe0\x99\x86\xea\x49\xd9\x50\xa4\x71\x8d\x4c\x8b\xc6\xf6\x2c\x46\xbd\x9f\x70\xa3\x2d\x8d\xcb\x88\x48\xbe\xd1\x8f\x39\x9e\x11\xcd\xd1\x6d\xd5\xc3\xb1\x8a\x25\x98\x2f\x3e\x35\xd3\x76\xef\x53\xcf\xa0\xfd\x79\x15\xba\xd8\x1b\xb1\x9c\xaf\xfe\xd5\xfe\x4d\xc4\xf8\xca\xce\xa6\xdb\x11\xdb\xc3\xa6\xb2\x58\x37\x3d\x3e\x0e\x1a\x90\xeb\xb0\x71\x1a\xfa\x40\x27\xae\x0d\xd9\x19\x5d\x1b\xfb\xb1\xba\x9e\xa5\xc9\x6b\x09\xc7\x95\xb8\x3d\x9b\x77\xb9\x94\xc5\xb3\x45\x6b\xf5\x02\x14\x3b\x58\x3a\xe8\x08\x6a\x03\xf7\xfe\x8e\xe2\xbe\x06\x00\xd1\x0e\x52\x01\x26\xa3\x0d\x6f\xfe\x0b\xa4\x6f\x07\x51\x94\xd5\x6f\xad\xe1\xb7\x11\xa4\x70\x1d\x86\xcd\x59\x0f\x67\xf9\x4e\x79\x21\x5b\xf6\x10\xae\x24\x9b\x68\x4b\x26\x0f\x45\xf9\x90\x7e\xc0\x9f\xc0\xed\xee\x2b\x3c\x57\x22\xe8\x04\x7e\x9e\xb2\xa2\xbc\xf5\x80\x5e\xcc\xc3\x60\x28\xe7\x56\xed\x65\xcf\x82\x0a\x3f\x22\x25\x2e\xdb\x4f\xfb\x84\x12\x71\xc3\x89\xd9\x0c\x32\xa4\x1a\x44\xd4\xbf\x4b\xa1\xf4\x06\xe1\xa6\xdd\x66\x05\x63\x49\x9c\x58\x8f\xc7\xfb\x76\x37\x9c\x31\x22\x70\x04\x96\x50\x3e\x4a\xde\xe7\x9d\x15\x22\x0c\x02\x2c\xf0\xef\x11\x69\x55\x5d\x0b\x97\x0a\x11\x79\x01\x7e\xad\x16\xa0\x3b\x49\x29\xf2\xff\x6d\x80\x21\x22\x1f\xd0\xcb\xf9\x06\xf5\xdd\xf9\xd2\x9f\x70\x22\x52\xbe\xeb\xd8\xac\xd7\xf1\x54\xc3\xde\x6d\xbf\x60\x04\x22\x6c\x05\x6c\x3e\x20\xaf\x8b\x32\x85\xaf\xf9\x09\xad\xb9\x10\x71\x12\x72\xd5\xef\x0b\x9b\x48\x78\x35\x91\x0f\x36\xeb\xee\x8a\xe3\xb6\x25\xa7\x69\x22\x87\x10\xed\xfc\x5d\xd1\xec\x96\x0a\xfa\x8a\x81\xe8\x1e\x10\xc6\x82\x6b\x28\xf7\x4d\xc0\x2f\x8b\x8f\x0e\xeb\xfa\x55\x5d\x49\x48\x47\x63\x6b\xfa\x1e\x09\xd0\xf7\x75\xf1\x9e\x63\xd6\x1b\xbb\x85\xed\x0f\xc8\x30\x52\x8e\x45\x06\x19\x72\xcf\xbc\xbe\x12\x62\x14\x42\x46\x91\x51\x3e\xac\xa1\xac\xce\xa2\xbe\x5d\x40\x14\xca\x4b\x88\xe8\x83\x14\xc4\x3f\x49\x62\xff\xef\x45\xe8\x42\x81\x46\x45\x3d\x14\x34\x28\xf2\x41\x62\x40\x80\x4b\x30\xd1\x37\xa8\x17\xc7\x53\x56\x5c\xa0\xfc\x9f\x42\x34\x3e\x48\xa7\xb0\xb7\xcc\x3f\xd2\xfa\x1a\xaf\x35\xfc\x1a\xc0\x25\xce\x7a\x4a\x2f\x1c\xd3\xbc\xd9\x8f\xd2\xe6\x7c\x14\x77\xae\x0e\x69\xfe\x86\x4c\x41\x83\x9f\xd7\xb1\x16\xf4\x12\x28\xf5\xf2\x03\x52\x23\x17\x35\x7c\x06\x9d\xf8\x08\xe1\xbc\x9b\xed\x76\x4f\x8b\xfd\x7c\xb6\x7d\x9d\x3d\xed\x96\x8b\x6d\x7b\x21\x49\xdd\x0b\xc7\x73\x56\x1d\x6f\x98\x02\xad\x99\xee\x18\xa2\x9f\x53\xa3\xf0\xf6\x03\xd2\xf1\xaf\xe9\x20\x72\xdb\x6d\xed\x77\x18\xba\xf6\xd2\x71\x5c\x2c\x5c\x21\x61\xea\x6f\xf6\x8f\x92\x84\xff\xb8\x52\xab\xf2\xed\x8b\x0a\x87\x74\x40\x20\x7f\x79\xb3\x67\xa3\x59\xeb\x66\x8f\x74\x1d\x85\xb2\x49\xad\x14\x3f\xc0\x5d\x5a\xcb\x22\xcd\xe7\xbc\x3a\x6c\x8f\xfd\x6a\x9b\xb1\x37\xd2\x63\x0e\x46\x32\x38\x39\x6e\x40\xf7\xa5\x97\xc4\xa1\xec\x89\x33\xff\x36\xac\xca\xd9\x51\x5a\x62\xc7\x0f\x55\x9b\xd6\x8b\x4d\x27\xed\x21\xa4\xef\x70\x1b\x5e\x7d\x6b\x0c\x57\x89\xdd\x44\xa3\xdf\xf1\xbd\x18\xc1\x05\xfc\x5c\x17\xad\x1c\xac\x90\x7e\xc2\x45\x68\xba\x58\xe6\x07\x5e\xa6\xf5\x08\xbf\x24\x99\x47\x32\x8c\x08\xd3\xd8\x15\x76\xaf\x2e\x46\x86\x58\x32\x5f\x31\x03\x38\x6e\x3d\xc1\x01\xa6\xc3\xb5\x03\x13\x97\xda\x3e\xd2\x0c\xaa\xba\xc8\x61\xbf\x3a\x41\xbe\x3b\x34\x7b\xdc\xf0\x7b\x06\x3e\x39\x7e\xb2\xfa\x98\x17\xb9\xe4\xf5\x57\xca\x1b\xf6\x1c\xce\x03\x61\xb0\x0c\x36\x83\x71\xcd\x2c\x28\x64\xa0\x7c\x65\x7c\x89\x7f\x9e\x53\xf9\x3e\x27\x15\xab\xb1\x07\x26\x43\x87\x25\xca\x0a\xe0\x6f\x4f\xad\x39\x93\xa1\xe7\xf0\xb8\x4d\xdf\x58\x7c\xd2\xad\x44\xb8\x0c\xfd\x00\xa3\x90\xe7\xe7\xe7\x79\x7b\x09\x16\xc4\x5e\x27\x8b\x33\x84\xf0\xb5\x46\x63\x60\xeb\x64\xa8\xb4\xef\xf4\xa8\x66\x48\xfb\x72\x79\x3f\xfe\x39\x10\x56\x54\xe2\x1e\x34\x3f\x67\x35\x8a\x89\x77\x66\x4e\x46\xca\x11\x49\xcb\x1d\x93\xe6\x6f\x9d\xc6\xbc\x90\x91\x76\xd0\x19\xfa\x57\x13\xfa\x76\xcf\x1c\x33\x5a\x05\x1f\x45\x0d\x3f\x8a\xb2\xcd\x6c\xc8\x38\x8a\x11\x05\x48\xad\xf9\x50\xf2\xd3\x21\x3d\xb6\x53\x28\x4e\x18\x42\x20\xbe\x9d\x8b\xc1\xd5\xc0\xc7\x20\x48\xa5\x15\xef\x53\x36\x5e\xed\xdc\x32\x61\x5a\x71\x2b\x70\xb1\x2e\x8b\xb7\xd2\x10\xff\xd9\xe3\x9a\x60\xfb\x27\x7e\x59\x1b\xa6\x3d\x7b\x88\x3b\x1c\xcd\x9f\xdc\xc3\x00\xb6\x27\xb9\x24\x63\xf1\x91\x9e\xee\xca\xe2\x1d\xca\x2e\x54\x95\x82\x01\x62\xf6\xd0\x24\xa2\x60\x86\x0d\x8f\xa7\xa6\x9c\x90\x80\x8e\xd5\xf3\xf2\x65\xff\x6d\xf5\x74\xbf\xdf\xad\xf6\xaf\xeb\x6f\x9b\xd9\xfd\xa2\xbd\x20\x04\xe8\x70\xde\x28\x01\x4b\x01\x5a\x91\x8c\x7e\x57\x68\x93\x32\x4c\xae\xd1\x29\xd5\xdd\xc5\xb6\x58\xb5\xcf\x28\x63\x89\xc4\x08\x5b\x9e\x6e\x79\xfa\xcb\xa6\x33\xa9\x1c\x8d\x84\xbd\x90\xab\xa2\xac\x08\x02\x39\xbd\xb4\xbe\x42\x68\x4a\x15\x08\x01\x83\x24\xc9\x54\xdc\x2e\x95\x72\x7d\x5b\xd7\x5a\x34\x2e\x61\x5b\xd1\x47\x9d\x4b\xab\xdd\x17\xf9\xa3\x29\x0c\x9e\x44\xec\x70\xc6\xab\xfa\xae\x8b\xba\x25\xf8\x5a\x7a\x9d\x5e\xca\x5d\xf7\xc2\x20\x8c\xa4\x25\xf3\x59\x67\xfc\xd2\xff\xdc\xa0\x1c\x65\xd5\x5b\x8a\x53\x2a\x87\x96\x06\xb4\x8b\x58\x38\xc8\xd5\x9e\x3a\xd9\xf7\xa7\x9e\x44\x93\x50\x8e\x4c\xf0\x21\x2c\x1a\xa3\xef\x03\x0e\x6d\xb5\x72\xc1\x8d\x0d\x19\xce\x73\x81\x6d\xa5\xfd\x9f\x6a\x0e\x63\x77\x3a\x90\x5e\xf4\x0c\x55\x06\x86\x8f\xae\x3c\x70\x28\x65\x01\xf5\xb0\x31\xb9\x39\x82\x75\x69\xec\x5e\xb4\xb9\xa1\xe7\xed\xf2\xeb\x78\x50\xf9\xae\x42\x7d\xda\xe2\x04\xf9\xac\xa5\xa7\x50\xbe\xa7\x80\x6a\x6d\xd5\x55\x90\x3b\xee\x58\x55\x7e\x18\xb3\x1e\x6d\x91\xaa\x81\x1f\xeb\x9e\xcf\xa0\xfc\x88\xd4\x08\x36\x2d\x77\x37\xfe\x4d\xb7\xfd\x0d\x28\x33\x96\xbf\xf5\xdc\xaf\xd1\x73\xfb\x09\xc7\xe0\xa2\xd9\x57\x4d\x62\x6e\xdc\x58\xa2\x7c\xe1\x61\xe8\x98\x15\x1f\x80\xe8\xd3\xdf\xba\x03\x44\x72\x97\x97\x86\x17\xd4\x2e\x10\xc5\x5c\x6a\x20\x27\x7d\xcc\x66\x27\x31\xda\x83\xec\xee\xd2\x6a\xcd\x09\xc5\xbc\x00\x45\xad\x05\x54\x75\x27\xbe\xdf\xfc\x3d\x72\x4d\x07\xd5\x86\x32\x10\x18\xbd\x7d\xdd\xa1\xa1\x58\xe8\x23\x07\x94\x41\xc8\xa3\x44\xce\xb9\xcf\xa1\x7c\xeb\x3c\x88\x31\x47\x97\x9f\x8f\xa6\x57\xaa\xbb\x41\x50\xc8\x97\x64\x94\x9e\x79\xf3\x36\xad\x10\x53\xdb\x97\xd6\xc6\xe3\x8a\xe9\x18\xc3\x42\x71\xb6\xa2\xeb\x43\x6f\x7a\xfa\xf7\x03\xdf\x41\x23\xbf\x57\xf0\x51\x77\xa0\x73\x15\xf8\x82\x38\x78\x78\x5a\x36\x8e\xcc\xde\xc0\xa3\xd2\x22\x5f\x3d\x3c\xb4\xa3\x94\x8b\x1d\xfd\x4f\xc5\xdb\xb7\x4e\x94\xff\x8b\x1d\x5b\x85\x4a\xb1\xb8\x2b\xc0\x11\x06\x2f\xd7\xc5\x28\x05\xa1\x22\x16\xe1\xb8\x45\x7d\x28\xb9\xd6\x19\xec\x3f\x98\xb0\x3f\x1b\x8b\xd0\x72\x90\x13\xb4\x6b\x75\xae\x65\x71\xb4\x8f\xfc\x8f\xd1\x8e\xa2\x92\x40\xfa\x44\x04\x37\x2b\x4b\x7e\xe9\xc0\x0b\xa3\x97\x91\x44\x0c\x89\x46\x8e\xfc\xa7\x29\x3e\xed\xf8\x3b\x94\x77\x50\x57\x6b\x28\x9f\xcd\x7f\xdb\xbb\x48\x78\x80\xa0\x2d\xd4\x35\xbe\x89\x79\x32\x83\xb9\x0b\xb8\x69\xdd\xa5\xf2\x22\xb3\x81\xf7\xaf\xb8\x4f\xde\x89\x51\x88\x7e\xe9\xfa\x7b\x14\x07\x81\xba\xe0\x7d\x0a\xd4\x31\x4b\xe8\x0d\x2b\x20\x7c\x17\x37\x5c\x79\xa5\x28\x79\x9d\xcc\x51\x22\x20\x14\xd8\x80\x15\x69\xb5\xd9\x6e\x6f\x27\xb2\x55\x63\x68\xc8\x6e\xb5\x48\xb5\x59\xae\x88\xa5\xba\x27\xbd\x7b\xe5\xd5\x28\xe9\x78\x18\x25\xbc\xf1\x23\x60\xc3\x46\xfb\x77\x66\x5d\xdb\x7b\xe0\xc4\x1f\x3e\x3a\x33\x8a\xb0\x19\x18\x9d\xec\xfb\xb4\x3a\x75\x90\x55\xa5\xfc\x10\xcb\xa6\xf7\x8b\xf9\xf2\x79\xf6\xb4\xdd\xa3\x30\xde\xfa\x69\xd9\x82\xb4\x94\xe2\x92\xfb\xad\x50\x17\x82\x61\xa6\xb7\x68\x05\x5a\x20\x64\x73\xf6\xe3\xf9\x7b\x71\x96\x5d\x45\x4c\x69\xa1\x11\x99\x63\xfa\xa9\xda\x3a\x0a\x38\x0e\x47\xaf\xbd\x7b\x1d\x76\x25\x83\x1b\x2b\x66\xba\xb4\x06\x1d\xfc\xe0\x89\xa8\xc5\x6b\xfe\x38\x14\x19\x0c\x94\x51\x04\x30\x2f\x8a\x5a\xf9\xad\x7b\x18\x07\x64\xc0\x7c\x07\xfb\xb1\x78\x9b\x72\x9b\x7c\x1c\x60\x7e\x84\x08\x76\xc8\x55\x13\x2a\x7f\x7a\xed\x0f\x68\x15\x38\xb6\x2e\xfb\x69\xff\x1a\x84\x1e\x0a\x90\x1d\x0d\x81\x91\xe4\x53\x54\x44\x76\xb0\x4a\x94\xc9\x30\x6c\x4f\xfc\x7a\xa3\xec\xe3\xdc\x21\x74\x23\xeb\xd0\xee\xd1\xac\xf0\x52\xa4\x75\xb5\xaf\x3b\xa1\x3e\x01\x91\x4b\x68\x24\xc8\x3f\xd2\x62\xaf\xd2\x1c\xca\xa2\x3d\xe6\x79\x38\xe9\x30\x40\x11\x45\xf1\x3e\x82\x8e\x42\x1c\x42\xc8\x47\x62\x74\xab\xfc\x46\x53\x10\xc4\x3c\x11\xfd\x84\xd2\x16\x64\x09\x35\xe6\xec\x7e\x1b\x4a\xac\x0a\x48\x7c\x85\x9c\xf2\xc7\x73\x66\x99\xf5\x07\xd7\x4a\x64\x84\x0d\x46\x35\x7f\x6f\xdc\xd6\x63\x9a\xdd\xc2\x9c\x42\xa2\x93\x84\x32\x2b\x3b\xe0\xc7\x21\x97\x98\x19\xc2\x15\xb1\xfb\xa6\xb9\xa5\x11\xfb\x5e\x60\x2f\x59\x3d\x91\xc4\x06\x11\x50\x6a\xfe\x3f\x45\x9a\x3f\x00\xec\xed\xdb\x10\x51\x28\x4c\xc0\xd9\x72\x5a\x75\x1b\xf2\x95\x40\xd0\xbf\xff\x17\x8d\xc2\xf5\x62\x07\xe9\x47\x61\x47\xad\x8c\xfd\x96\xc3\x12\xc0\xb8\x9f\x64\x78\x7f\x32\x01\x84\xbd\x58\xc9\x84\x54\xc2\xbc\x71\xbd\xf2\x3a\xe5\x99\x11\x04\x1f\x2c\x75\x90\x20\x31\xfd\x8b\xde\x62\x3c\x7a\x5c\x15\x51\x05\xd9\xe0\xbc\x20\xaf\xa7\x99\xdf\x05\x80\xcb\x51\x0f\x45\x17\xe5\x5b\xfa\x01\xcb\x91\xbf\x0a\x3a\xf6\x2d\x99\xa7\x9d\x49\x8d\xfd\x45\x9c\xcd\xf0\x86\x74\x1c\x0a\x44\x59\xf2\xcb\x43\x51\x6e\xa1\xfc\x68\x1e\xe2\xf1\x69\xf8\x83\xda\xf1\x04\xea\x1b\x66\xf0\x01\xd9\x3e\xde\x9f\x06\xdd\xb8\xda\xd1\x54\x20\x79\x07\x38\x75\xc5\x62\xed\x32\x85\xda\xec\x75\x0a\xa5\xdf\x3d\x8b\x3d\x0a\x21\xba\xb3\x5b\xa8\x9f\xb1\xbc\x4e\x2a\xca\xf6\xb0\xc7\x13\xde\xf9\x1e\x33\x29\x3b\x91\x13\x3b\x02\x00\xeb\x46\x08\xb1\x32\x11\xff\xf0\xb6\x7d\x0e\x24\xcb\x28\x6d\x97\x5f\x47\xd6\x2b\x34\x8b\x15\xf6\x0c\x18\xf5\x67\x83\xfe\x30\x07\x83\x98\xda\x0e\xdb\x7c\x74\x13\x80\xb6\x07\x13\x4e\x89\x02\x03\x21\xea\x04\x1b\xcc\x80\x90\x85\xe8\xe0\x43\x7d\x68\xee\xcc\xfe\x39\x0a\x62\x2b\x22\xdb\x97\xa1\x99\x8d\x9c\x48\x1d\x85\x31\xba\x02\x36\x6d\x6c\x6a\xb3\xa3\xe7\x8f\x62\x07\x9b\xbf\x9b\x17\x88\x8b\x0d\x61\x9d\xe3\xfd\x73\xf0\xbd\x75\x9c\xc4\xe8\xd1\x71\x45\xbd\x68\xa3\x4b\x26\x52\x21\xd4\x70\x31\x9b\xf7\xc2\x5c\xcd\x43\x37\x68\x5d\x60\xa3\xf6\x43\x9a\xdd\xc3\xd3\xb9\xf2\x82\xae\xcc\x35\xb2\xeb\x5a\x78\x3a\xe2\x2d\xfd\x7d\xdd\x45\x36\x5a\x70\x6e\x51\x59\x3f\x8a\xf2\x9d\x64\xb5\xaa\x65\x6e\xe3\xe4\x76\x1c\x90\xce\xae\x4a\x2b\x4c\xb3\x83\xa2\x99\x73\x9f\x6a\x9d\xca\x73\x56\x5f\x46\x37\x24\x25\xf5\x55\xbd\x41\xfd\x98\x56\xf5\x24\xb8\x44\x43\x28\x28\x72\x32\x3c\x12\x7d\xdc\xf9\xd0\xde\x4f\xba\x9b\xd2\x71\x5d\x17\xf3\x28\x18\x1e\xe6\xd5\x26\x7d\x43\x8a\x31\xf3\xd9\xa5\xe3\x32\x81\x79\x0a\xe0\x65\x76\xb1\x54\x43\xf6\x58\x02\x60\x0a\xb0\x2d\x75\xfe\xe0\x21\xa4\xe3\x8a\x08\x97\x91\x46\xd5\xd8\x36\xc5\xf0\x9a\xd7\xe9\x50\x34\x5d\x3a\x5e\xcc\x30\xc0\x31\xb2\x83\x06\xb7\x32\x1a\xe4\x7b\x49\x18\xd9\xaf\x59\xf3\x34\x83\xf2\xee\xf2\x95\xd0\x97\x74\x7c\x4e\x5e\x51\x75\x3e\x5d\x91\x91\x99\x21\xcc\x21\x80\x17\x31\xf1\xdd\xf3\x0b\xa1\xf1\xbe\x02\xc0\x34\x27\x91\xde\x22\x12\xf9\x61\xe9\x77\xaa\xfb\x4e\x3a\x2c\x08\x3d\x22\x7e\x23\x51\xe8\x21\x81\x84\x74\x98\xa4\x8e\xb4\x87\xc5\xe2\xde\xb5\xaf\x96\xa9\x08\xd1\x4b\x8a\xd7\xbc\x82\xfa\xf1\x2c\xec\x91\x20\xf0\xd0\x43\x41\x94\xd0\x4a\xaf\xd3\x92\xe7\x07\x3e\x7a\x4d\x41\xe0\x21\x6a\x75\xcb\x33\xb8\x07\xae\xb2\x34\x87\xf6\x02\x71\x82\x1b\x07\x4d\x74\xec\x4c\xeb\x3b\x76\x57\xa4\x49\x71\x6c\x4f\x54\x4e\xaf\x2c\x8e\xed\x01\x13\x45\x3a\x33\x38\xf4\x01\xc3\x98\xe7\xd9\x1f\xfb\x87\xc5\xc2\xfe\x78\xc8\x5a\x76\x22\xa3\x8b\xd3\x72\xe0\x40\x3b\xaf\x22\xc7\xf0\x2a\x53\xc9\xed\xee\x7c\x59\xe6\xf6\x58\xcc\xa8\x47\xa5\x4d\xe8\x5a\x82\xe8\x6b\xc2\x95\xbf\x55\xc7\x91\x4e\xcc\x35\x3a\xfb\x3f\x40\xac\xf4\xae\x3c\x57\x5f\xf4\x2c\x49\x27\x11\x01\xe2\x4e\x34\xb2\x29\x60\xd2\xd4\x1c\xe1\x5c\x5b\x02\xad\xbf\xee\xe8\x0d\x8e\xbe\x34\x97\x3c\x34\xe0\xd9\x07\x00\x03\x23\x71\x47\x73\x91\x43\x88\xd3\xf5\x1b\xff\x0b\xee\x9a\x01\x97\xce\x9a\x49\x47\x30\x0a\x71\x56\xdb\xf5\x8b\xfd\x9b\x8c\xa9\x1f\xb5\xaa\x0b\xf9\x5e\x8d\xf8\x06\xa4\x23\x55\x8c\x6c\xa2\x77\xab\x55\xc7\x50\x21\x1d\x88\x38\xfa\xfc\x6d\x57\x57\x75\x9f\x56\xc5\x67\xfe\x52\xd4\x3d\xa9\x34\xe9\x00\xd7\x0e\x37\x10\x62\x4a\xe5\xce\xa6\xa1\x0c\xd2\xd1\x09\x91\xbd\x36\x9f\x64\x7b\xa6\xb6\xa5\x36\xa4\x91\x8e\x16\xd4\x9e\x79\x2a\x41\xa5\x63\xe8\xda\xf4\xc7\x71\x1d\xd7\xa7\xfa\x05\x39\xa4\x8d\x85\x85\x72\x5d\x14\x59\x0f\xec\xd1\x8c\xd2\x08\xb9\xad\x3f\x21\xaf\x2f\x06\x88\xdc\x69\x21\xd8\x51\x4c\x7b\xcc\x24\x91\x78\x89\x12\x41\xdb\xac\xb8\x01\xef\x93\xae\xc3\x43\x34\x35\x70\x2e\x0b\x2a\xbe\xb4\x89\x15\xe9\x3a\x12\xb0\xf0\xb2\x83\xca\xaa\x3a\x99\x23\xae\x47\xec\x94\x69\xf5\xba\xc4\xbf\x63\x17\xcb\x32\x0f\xd9\xf0\xbb\xb8\xae\xa7\xd1\x49\x98\x3d\xcd\xf7\x0f\xaf\x2f\xf7\x44\x2c\x39\xbb\xbf\xdf\x2c\xb6\x5b\xfb\x3b\xae\x26\x25\xe3\xfb\xd9\x5d\xd7\x67\x29\x5d\xcf\xd1\xd8\x67\xff\x69\xfd\xc5\x1b\xdd\x2d\xd2\xf5\x42\xc1\xdb\x4e\x5b\xc4\xf9\xb7\xd7\x48\x3c\xfc\x1c\xf8\x8e\x48\xe4\x69\x74\x87\x5e\xc2\xb1\x45\x85\x4b\xb3\x63\xb5\x08\xf8\xee\x22\x8a\xa4\x49\x8f\xfc\xe7\x9c\x9f\x8c\x78\x34\xd1\x1d\xda\x11\xe0\x2b\x63\xb1\xfb\x8d\xd7\x21\x33\xc7\xfd\xc0\x15\x24\x26\x59\xed\x6d\x67\xda\xbe\xea\xf7\x56\x48\xd7\x07\x9f\xb7\xd4\x59\xa8\x3a\xed\xd9\x43\xcc\x71\x43\xd1\x57\x75\x58\x9d\xda\x9b\x63\x31\x01\xfe\xd6\x45\x55\x0f\x2c\xba\x39\x1e\x04\x31\x66\x50\x9f\x67\x2f\x8f\xb3\xdd\x6e\xf6\xb2\xde\xac\xfe\xf8\xd3\xdf\xdc\xcf\xbe\x5b\x83\xe5\x06\xdc\xc3\x72\xe4\xdd\x62\xf6\xc7\x9f\xed\x1f\x9b\xd8\xc3\xf2\x21\x63\x1d\x60\x5e\x54\xc7\xa2\x59\x41\xb2\x3f\x2f\x03\xa0\xf6\xd9\x26\xb8\xca\xe1\x67\xbd\x27\x89\x93\x3d\x3f\xab\xb4\xde\xab\x42\xa2\x02\xcf\xd0\x4a\xb8\xa1\x47\x0d\x17\xa6\x61\x81\x24\xf0\x0d\x7f\xe2\x68\x64\x4c\x88\x68\x44\x96\xae\x1f\xb6\x1d\xe9\x4f\x9b\x2a\x37\x23\x23\xa6\x30\x0f\xb8\x2e\x8b\x42\xaf\xf4\xbc\xbc\x9c\xea\xe2\x25\xb5\x88\x28\xe9\x46\x49\xe2\xd2\x8f\x36\x16\xd9\x46\xbd\x5d\x29\x20\x74\xba\x08\x64\xf4\xdf\xf6\x0a\xdc\x41\x8d\x81\xf5\x6c\xbb\x6b\xaf\x2a\x88\xcb\x77\x0b\x99\xbe\x07\x92\x19\x4a\x6f\x05\xc5\xd2\x8d\x20\x0c\x49\xc0\x23\xad\xe1\x7f\xce\x6f\x5c\x8d\xf4\x2b\xa4\x1b\x9b\x2e\x0d\x22\x97\x32\xb7\x39\xa5\x87\x2c\xdd\x58\x53\x28\xff\x46\x45\xb9\x87\xf4\xa3\x9d\x93\x49\x24\x91\x2a\xbc\xc8\x17\x9b\xb9\xeb\x06\x01\xc6\x97\x57\xf0\xec\xd1\x0e\x30\xe0\xa2\xee\x62\x68\xe9\x26\x42\x52\xe5\xf2\x2c\x8e\x69\x7d\xc7\xb3\xac\x40\xeb\xb3\x7e\x9f\x64\x6f\xc4\x13\x80\x44\x7b\xaa\x22\xfb\xa0\xfc\xd2\xe0\x7b\x71\x3f\x46\x00\x41\x7d\x80\x2c\xff\xe4\x05\x96\x81\xda\x79\xcd\x75\xe4\x52\x83\xad\xe9\x18\xde\x16\x19\x6e\x46\x9d\x7d\x92\x8e\x83\x76\x43\xf2\x2c\x6b\x97\xd5\x8d\xd7\x2e\x13\x12\xe9\x99\x13\xbc\x71\x3b\x22\x99\x90\x2e\x24\x94\xa5\x79\xdd\xde\x23\x99\x33\x56\x40\x7b\xdc\x96\xd2\x05\xee\x84\x46\x43\xdf\x06\x6d\x2d\x32\x88\x4c\x0b\xd1\xb8\xd7\x57\x6b\x50\x47\x2e\xa2\xb6\x8c\x8e\xcd\xef\xb9\x7c\x28\xb0\x16\x34\xb9\xfd\x7a\x8e\xeb\x60\x42\x50\x03\x54\xa6\x90\xd7\xfc\x31\xd2\x14\x18\xfc\xe7\x5c\x51\x1d\x77\xa5\x8d\xb8\x0c\x91\xf8\x93\x8c\xcd\x8f\x91\xfe\x40\x73\x26\x4f\x0c\x41\x8b\xed\xdb\x1e\xdc\x9e\xe7\xc4\x0e\x02\xb4\x20\xaf\x7f\xb5\x57\x79\x6e\x20\xd1\xc3\xbf\xbb\x23\xc2\xd2\xe2\xa7\xbd\x41\x57\x02\xfe\xcc\xec\xed\xad\x34\x2a\xdc\xf6\x90\xa7\xb4\x6b\x28\xaf\x30\x59\xd3\xbc\x31\xa3\x1e\x46\x93\x27\xe8\x47\xf3\xb1\x3d\x4b\x07\x88\x5d\x38\x15\x45\x56\xed\x0a\xea\x8e\xb7\x97\xf4\xdd\x04\xdd\xa7\x1d\xd8\x80\x55\x7a\x8c\x49\xea\xdb\x39\x9c\xeb\xc9\x5e\xff\x66\x88\xa6\x5e\x88\x4b\x55\xc3\x71\x8a\x98\x50\x7a\x2c\x74\x69\x5a\x59\x1c\xda\x10\x43\x6c\xda\x5c\xdb\xc1\x1c\x5b\x16\x0f\xbc\x3a\x10\xc8\xf5\x17\x0e\x9a\x3d\x4f\xc5\xb1\x45\x95\xf2\x2e\x4c\xf8\xef\xdc\x3a\x2f\x60\x6e\x20\x3b\x4c\xfb\x60\xd3\xf1\x02\x4e\xeb\x2b\xeb\x89\x9b\x8c\x5e\x47\x00\x1e\x52\xa1\x9f\x8a\x66\x4a\x15\x85\x1e\xac\x50\x2f\xf4\x3c\x2b\xf5\xf8\x3b\x18\xf1\x82\x5f\xf2\x26\x4b\x2f\x8c\x18\x96\x10\x9e\x8a\x37\x1b\xd6\x7f\x99\x35\x96\x5e\x24\x23\x4c\x7c\x8a\xf3\xe5\x5f\x05\x32\x9e\x0e\x9b\xc7\xa4\x17\x4b\x6d\xf5\xb1\x88\xd0\x73\x7b\xad\x54\x3b\xba\x68\xac\xe2\x88\x08\x26\xff\x03\xb2\xb6\x3d\x48\xa3\xc5\x91\x30\x6e\x51\x82\xf3\xc5\x6a\x7a\x42\x70\xa6\x30\xc5\xa6\x8a\xe9\x82\x91\xf4\x44\x98\x90\x58\x50\x91\xf3\x1a\x10\x91\x64\xd2\x54\x1d\xa3\xff\xad\x2c\x97\xf4\x84\xe0\xd6\x7b\x78\xbe\xbc\x14\x16\x19\x19\xb2\x7f\x0c\xbe\xa7\xf4\x39\x8a\x86\xa3\xaf\xd5\xc3\x33\xfe\x02\xa9\x29\x3d\xe5\x3a\x48\x38\x46\x3d\x01\x8b\xfa\xf0\xcd\x96\x13\xa4\xa7\xe2\x08\xf3\xc7\xcd\xeb\x9c\xac\xcb\x9a\x71\x20\x7c\xc3\xd6\xd9\xb8\x20\x28\x4f\x32\x69\xf6\x3d\x0d\x24\x6b\x63\x6b\x07\x73\x5e\xaa\x2b\x00\x65\x7f\x9d\xfb\x8e\x03\xca\xe4\xc7\x29\x16\x18\xbe\x5c\xdf\x61\x10\x10\x45\x46\xf9\xd1\xf5\x8c\x7c\xfd\xcc\xbe\x63\x1a\xb4\xf8\xb9\xd9\xea\x5b\xa1\x9f\xdf\xec\x61\xa0\x6e\x4e\x2e\xe4\x53\x51\xd7\x45\xfb\x77\x4d\x8f\x79\x2c\x54\xaa\x1b\xbb\x5a\xeb\xa2\x44\x3b\x31\xba\x29\x5f\xc7\x40\xb9\xa9\xe3\xb1\xc8\x37\x20\x3a\xdb\xe4\xb3\x00\xd0\x0e\x8d\x45\xfb\x07\x6b\xb0\xab\x83\x48\x9f\x85\x0e\xfa\x38\xf7\xe9\x5b\x7a\xe2\x97\x5e\x99\xa6\x39\x46\x20\xcd\x59\x5d\xf3\x91\x48\x91\xf4\x99\xf6\x1c\xb3\x2a\xd6\xfe\xfd\x20\x8d\x2f\xfd\x20\x04\x2c\xd9\x7f\x6f\xb7\x30\x3f\x88\x98\xc9\x9a\x37\x9b\x88\x69\xe7\x18\xbe\xb8\x20\xa6\x88\x9f\x60\x40\x0f\xcb\xcd\x76\xb7\x5f\x6f\x96\xf3\xc5\x7e\x33\xdb\x2d\xda\x0b\xc5\x1c\xa9\xd1\x51\x3f\xae\x86\x2b\xd4\x95\x49\xc7\x0e\xef\x36\x90\x41\x64\x6a\x9c\x2d\x00\xcb\xa3\xa6\xa4\xe1\x3d\x84\x2e\x09\x16\x16\x39\x62\xe9\xb1\x7a\x31\x7a\xf2\x90\xa9\xa8\x25\xcf\xb1\x84\x67\x7d\x54\x91\xf4\xc3\xc8\x8f\xfa\x0d\x16\x77\xe7\x32\x37\x89\xba\x0d\x54\xf0\xf7\x58\xf7\xa4\x1f\x85\x04\x41\xb0\x54\x9f\xd3\x8d\xbd\xd2\x8f\x62\x6e\x69\xf6\xac\xad\x19\x14\xd6\xa5\x1f\xa9\x48\x18\x38\xcf\x77\xc0\x26\xd0\x09\x45\x93\xd1\x55\xe3\x44\x60\x0f\x6c\xe3\xe3\x8c\x09\x8a\xec\x10\x9e\x60\x85\x00\x65\xbe\x08\x01\x6f\x8e\x24\x8a\x61\x87\x5a\x95\xbe\xf5\x40\x88\x03\x68\xbb\x19\xc9\x23\x0f\x1b\x9d\x16\xbb\xc7\xc7\x5f\x81\x3b\xa4\xcf\x85\xc0\x80\x15\x01\x4b\x6b\x14\xf8\x69\x63\x69\x5f\x38\x0a\x7b\x28\xb6\xbb\xf9\x5d\xfb\x37\x19\x23\x39\x13\x6d\x06\xbb\x22\x83\x92\xf7\x24\x46\x46\xcf\x2c\xbd\x98\x85\x5d\x70\xf0\x0c\x2a\xe5\x3d\x30\xd8\x3f\x46\x15\x45\x73\x96\x4a\x08\xcd\x78\x2a\xd3\x9c\x68\x3a\x30\x54\xb0\x47\x15\xe0\xab\xf8\xf9\xf3\xe7\x68\x26\xe9\x88\x68\x98\x8e\x45\x06\xf2\x9c\x35\x31\x99\x3c\xe4\x45\x56\xbc\x5d\xfa\xfd\x4e\xd2\xd7\x89\x6f\xf1\x4e\x7d\xe9\xf7\xe1\x6d\x30\xc7\x09\xd1\xa0\x42\x29\x23\xcf\x7d\x86\x9a\xab\x56\x91\x58\x32\x27\x0a\x31\xb3\x63\xa2\x4d\xcb\x87\xd6\x78\x19\x8f\x90\xa9\x76\x58\x0c\x88\x75\x5a\x64\xe9\xcf\xb4\x7c\xdd\xde\xb7\x07\x44\x80\x1d\xb5\x44\xae\xdd\xf7\x86\x99\x23\xb8\x34\x22\x2e\xf3\xf2\xa2\xca\xef\x29\x7c\x4e\x08\x56\x49\xe6\x6a\x52\x72\xb1\xfa\x84\x36\xdc\x9c\x49\xd9\x4f\x30\x76\xf6\x89\x79\x91\x90\x66\xe2\x22\x90\x14\x1a\xf7\xb5\x30\x7d\xcc\xe3\xfa\xee\xe0\x5b\x32\x2f\x06\xf0\xec\xbe\x7d\x84\xd5\xb9\x9e\x9d\xeb\x03\xe4\x75\xda\x6f\x57\x90\xcc\x77\xe9\x9b\xbf\x41\x7d\x67\x60\x8a\x23\xc0\x99\x64\x8c\x45\x60\x3e\x00\x6a\x90\x3f\xa5\x55\x3d\x6c\x0e\x1e\x7d\x0b\x16\x71\x5c\x3c\xf9\xf9\x78\x4f\x04\x10\x97\x53\x1b\xd6\x33\x16\x77\xb4\x9f\x6d\xa2\xed\xab\x2c\x2b\x63\x10\x59\xa2\x4d\xc4\x5a\x50\x76\xa7\xea\x41\x2e\x86\x2e\x2c\x63\xc0\x13\xc3\xd5\x7a\xc7\xf3\x69\xee\x37\xc9\x02\x37\x46\x5e\x28\x62\xd0\x68\xe5\x37\x6c\x9e\x94\x05\xa1\x44\x54\x33\x7d\x30\xab\x31\xfe\xe5\x9d\x06\x2a\x8a\x93\x56\xf5\x4a\xa7\x6f\x7d\x65\xee\xc9\x55\xc7\xc2\x90\x8b\xae\x57\x74\x31\x36\xca\x2c\x8c\xb8\x6f\x3b\x37\x47\xd4\x39\x92\xc5\x8d\xbf\x4e\xb3\xde\x73\x7a\xea\x60\xf6\xb0\x66\x02\xba\x76\xc6\x61\x21\x73\x74\xeb\x49\x42\xb6\xc2\xb6\xd5\xae\x4b\xd0\xe9\x4f\x68\x62\xbf\xf4\xc8\xdf\x86\xba\x44\x38\x9c\x72\xf7\xf5\xc1\x7b\x7e\xd9\x0d\xa7\x3a\xf7\x1c\x5b\xf8\x35\x60\xf2\x7e\x79\xe1\x6b\xe7\x9a\x71\xed\x25\xe8\x77\x9c\xf8\x67\x8e\x4e\x69\x63\x80\x31\x0c\xb9\xde\x04\xae\xfe\x1d\x3e\x14\xd7\x1c\xf3\x6c\xcf\x77\xbb\xf9\x17\x99\x57\x26\x7c\x3f\x34\xc4\xc3\xc4\xcf\x7b\x6b\x18\x0b\x4d\xc3\xb4\x4e\xcb\xe3\x3f\x1b\x33\x69\xdf\x75\xe3\x4d\x76\x00\x9e\x79\x51\xd5\x63\x1e\x08\xc9\x64\x90\xb0\x76\xf7\x34\xe5\x82\xe1\xee\xc9\x54\x14\x62\xf8\xbe\x68\x91\xbc\x92\xa9\x44\x04\x86\x57\x18\x4a\xaa\x23\xf4\x25\x9b\x24\x03\xdf\x45\x2a\x06\xda\x2b\xcd\x15\xef\xcf\xcd\x17\x59\xee\x56\x37\xe6\xaa\x0e\x03\x6e\x4a\x5e\xf3\xb4\xbe\x5c\x09\x56\x0f\x6f\x5d\x4b\xc9\x78\x2b\x06\x03\x6a\x36\x4a\x2d\x31\x0d\x2e\xe6\x63\xcc\x8f\xec\x8a\xd7\x5b\xb2\x5c\x32\x70\xa4\x83\xb4\x15\xa7\x8c\x5f\x66\xf9\x65\x57\xa6\xa7\x6c\xd4\x97\x24\x03\x37\x22\xf5\xf7\x4f\xec\xd8\xf8\x4e\x0c\x17\xe6\x89\x03\xcf\xf5\xb1\xd2\xbb\xaf\x26\xa7\x98\x1d\xe5\x7b\xc8\x43\xb7\x3d\x14\xa7\x7b\xf8\xd9\x9e\x1c\x84\xc8\x22\x5e\xc3\xf1\x94\xf1\x71\x47\x94\x0c\x3c\x61\xb4\xfa\xcf\x97\x34\x9f\x8d\xc2\x92\xc0\x8f\x04\x37\x8b\xea\xb9\x31\xac\x2b\xfd\x08\x25\x6c\x31\x41\x6e\x7f\xc1\xe7\xa4\x45\xbb\x60\x7d\xa7\x32\x60\xdc\xc5\xf2\x48\xdb\xd1\xb7\xca\x2d\xe2\xf3\x0e\x0e\x3c\xd3\x84\x45\xb8\x85\xc2\x91\x01\xd3\xa4\xe1\xda\x98\x75\x73\xf3\xf7\x58\xaa\x6a\x7f\x39\xf4\x44\x42\xc5\xdf\x0a\xb6\xa7\x22\xaf\xcc\x06\x6e\xbf\x53\x10\x72\x0f\xa9\x79\xe8\xb5\x62\xff\xf7\x30\xab\x1a\x84\x10\x31\xb3\x59\xc2\xe9\x2a\x80\x1b\x7d\xca\xc8\x8b\x10\x94\xbd\xa8\x0f\xf3\xbc\xdf\xa9\x22\x83\x28\x71\xb1\xa6\x8a\xe9\xe1\x35\xbf\xb4\x39\xd7\x20\x52\x01\x6e\xd6\xf5\x54\xb7\xdf\xdf\xac\xb4\x98\x4b\x25\x91\x4a\xf4\xd0\xfd\xeb\x01\xae\x47\x63\xb9\x46\xac\x60\x25\x79\x3e\x64\xe6\x32\x30\xf6\xf6\x3d\x27\x8a\x21\xe5\x73\x89\xb9\xf9\x56\x51\x55\x06\x22\x0a\x50\xea\x1d\xdf\xdb\x8f\xa2\xcc\xd4\xdc\x2a\xe7\xc9\x40\xe8\x40\xe8\x4e\xad\xc1\xb8\xc7\xc3\x8e\x77\x33\x54\x3a\x32\x34\x4e\xf2\x7d\xf1\x99\xd7\xbd\x6e\x31\x3b\x42\x93\x58\x24\x62\x64\x8b\xfc\x5c\x19\xc6\x6b\x73\x58\x39\x61\x08\x3d\x6f\xe2\x78\xe2\xf9\x65\x48\xe3\x3a\xfa\x52\xca\x21\xd2\x1e\x01\x6f\x69\xde\xf2\x2e\xb4\xd7\x93\x66\x6a\xda\x50\x9b\xec\x8c\xf7\xe7\xe8\xc6\x95\x56\x91\x1a\xb4\x1f\x79\xbe\xbd\x06\x30\x81\x79\x8b\xfd\x81\x57\xdb\xf7\x34\xcb\xaa\xf9\x01\x46\xb4\x6d\x32\xd0\x3a\xc0\xac\x5c\x61\x48\x89\xf7\xff\x77\x86\x8e\x7b\x9f\xfe\xf9\x37\x1b\xa2\xf5\x64\xe8\x78\x04\xed\xa0\x40\x98\x44\x53\xb0\xa7\x77\x30\xbb\x43\x27\x22\x29\x03\x7d\xce\x65\x33\xab\xe6\x36\x99\x1f\x3a\x71\x44\xea\x32\x48\x0b\x6a\xd5\x2f\x06\x52\x83\x32\x74\xb8\x6f\x14\xcf\x31\xe3\x8f\xfc\x7d\xa6\x23\x7b\x72\xfa\x87\x0e\xa7\x76\xcf\x6d\x0d\x7a\x10\x40\x86\xae\x9f\xa0\xc1\xd4\x69\x96\x11\x82\xc6\xce\xb6\xa0\x97\xe2\xfe\xdf\xae\x90\x6e\xf9\x3a\xa6\x5b\xa1\x64\xe8\x46\xae\xb2\xec\xa2\x8b\xdd\xe3\xae\x40\x8c\xcf\x36\x1d\x95\xb1\x43\x4f\xc6\x09\xef\x5a\x97\x73\x28\x17\xbc\x1c\x36\x72\xc9\xd0\x53\x24\x3e\x77\xe2\x65\x35\xcc\x0f\x87\xbe\x47\x6a\xe5\x08\xfe\x69\xe2\x96\x66\x6e\x0e\xcf\xf6\x19\x17\xb6\xc7\xd9\x14\x1a\xda\xd8\xcb\x3e\xbf\x1f\x46\xd8\x30\xbe\xa7\x5e\xc1\xee\x52\xe7\xb1\x16\x92\x3d\x41\x52\xc5\xa1\xf1\xb1\x71\xf5\x56\x0f\x05\xd1\xed\x8c\x7e\x9d\x39\x24\xcf\x02\x26\xc9\x85\x6b\xf1\xa1\x28\x1f\xf9\xc7\x07\xe4\xd5\x6c\xd2\xd9\xb0\xe7\xfa\x4a\xbb\x56\xfc\x53\x66\x67\x75\xdd\x1e\x67\x47\x26\xc4\xa8\x4b\x80\xcf\xa9\x1e\x5e\x19\x06\x2c\xd6\x6d\x40\xd6\x43\xc2\xc8\x30\x08\x74\xc0\x5a\x4c\xc7\x3d\xaf\xc1\x6d\x0f\xc9\x00\x71\xde\x27\xac\xf0\x4e\xb0\xf0\x4d\xdf\x4f\xa0\x42\x1d\xde\xa0\xef\x7f\x24\xf2\x0b\x3b\x12\x12\x5c\x60\xeb\x7e\x87\x87\x0c\x43\xdf\xd7\x91\x4d\x7d\x66\xd0\x51\x03\xb8\x3d\xca\x5d\x19\x46\x91\xc0\x88\xe0\x23\x85\xcf\x7e\xb1\x36\x8c\x74\x6c\x25\xa3\x0d\xb9\xed\x50\x9e\xdf\x0c\x8b\x5d\x37\x36\xfc\x97\xf7\xf0\x01\xe5\xc5\x14\x99\xc6\x48\x0a\x3b\x5c\x73\xac\x90\x8b\x73\x99\x0f\x13\x29\x61\x12\xf9\x48\x47\x62\x4a\xf5\x9d\xf4\xa7\x0c\x13\x45\x9d\x6f\xc8\x9b\x78\x99\xf3\xea\x40\x6b\xef\x3a\x3d\x1a\x8f\x5e\x23\x67\x04\x9f\x7a\xe2\xe7\x5c\x1e\x36\x28\xde\x42\x58\xf3\xfe\xeb\xef\xb3\x25\xd8\x44\x60\xc8\xa5\x8b\x89\xc0\x96\xf0\xaa\x79\xb2\x22\x37\x22\xb2\xcd\x3b\x5d\xa7\x3f\x21\xa3\x3d\xd0\x2e\x76\x37\x1c\x5b\x32\xe1\x7a\x04\xd8\x57\x60\xf3\x00\xa1\x74\x88\xdb\xfc\x5b\x51\x28\x9d\x42\xa6\x08\x80\xf2\x55\x36\x20\x94\x4c\x21\xb6\x03\x0d\x1a\xee\x79\x0f\x45\xd9\xf1\x0b\x0d\x7f\x54\x85\x31\xf4\x74\x0d\x69\x02\x9d\x26\xd5\xa0\xaf\x78\x5d\x65\xa8\x62\x47\x1b\x93\x42\x3a\x25\xe4\x7e\x3e\x14\xe5\xd2\x34\x11\xae\x8b\x8a\x7a\x1e\xea\x29\xae\xe8\x7f\x0c\x6c\x34\x84\x21\x66\xcf\x30\xd5\xb5\x1d\xb6\xbc\xc9\x50\xbb\x61\x62\xa8\xbb\xe4\xfb\xa9\x68\x67\xb5\x8e\x5c\x0c\xc1\x67\x75\x0d\x95\xe1\xb8\xe9\xe1\xe2\x47\x76\x59\x27\x0e\x1a\xb1\x5e\xed\xb8\xbb\x92\x0a\x71\xca\x3d\x2f\x5f\x96\xcf\xb3\xa7\xfd\x8f\xc5\xd2\x1c\x8a\x1c\xae\x70\xca\x2d\x9f\x17\x7f\xfc\x61\xff\xe8\xfa\x1a\x4b\x62\x46\x0c\xd6\x94\xb2\xa6\x28\xa0\x65\xe4\x0a\x07\xab\xc9\xf7\x30\xc7\xb2\xce\x24\xe5\xd7\x97\xd4\xce\x32\x72\xa5\xc2\xcc\xc8\xdd\x6c\xa8\xb8\x24\x23\xcf\xf1\x30\x63\xbd\x37\x9f\xb1\x99\x72\x53\xed\x2a\xa3\x9b\xf2\x19\x11\xac\xe6\xf0\xb3\xde\x02\xaf\xda\x5d\x3f\xf2\x03\x95\x58\x1e\x78\xd4\xcb\x2b\xae\x13\xbc\x9d\x6d\x88\x7c\x1e\x61\x35\x60\x7f\x2a\xc1\x10\x68\x82\x55\x20\xff\xda\x7c\x45\xbe\x4c\x10\xdc\xbc\x4b\xa1\xbc\xe3\x55\x2a\xad\x2a\xc8\xa4\x59\x88\x98\xeb\x0a\x13\x7b\x97\x6f\x80\xfe\x4f\x6b\xe0\x22\x16\x70\x94\x59\x6f\x9e\x07\x0f\x6d\x6b\x38\x51\x5b\xb6\x19\x11\x78\x02\xd1\x30\x8d\xa3\x8d\x65\x8b\x1b\x5d\x00\x32\x0a\x15\x71\x9e\x7f\x2b\xc8\x79\x5a\x97\xc5\x7f\xa0\x0d\xb0\xa3\x48\x24\x44\x89\x74\xbc\x6c\x2f\x47\x61\xdb\xe8\x64\x14\x69\x86\xcd\xe9\x8b\xef\xf3\xf9\x81\xb7\x56\x36\x8a\x39\x95\x7f\x2b\xa8\xd7\x6d\x6e\xdf\x1c\xe3\x21\x20\x2f\x16\x41\x10\x2c\x62\x61\xb0\xcb\x47\xc2\xd7\x58\xa0\x7a\x81\xcf\xc7\xf4\xed\x00\x55\x7d\x97\x5e\xa3\xc5\x06\x97\x15\xa1\x0a\x3d\x0b\x74\xc7\xa2\x6f\x39\xed\xad\x44\x22\xa6\xe6\x23\xde\x38\x36\x94\x26\x47\x1f\xd6\xb2\xec\xda\x87\x90\xbe\x87\xa5\x38\xcc\x03\x40\xd9\xf9\xbf\x91\x0c\x02\x84\xe5\x65\x69\xd5\x11\xb1\xc8\x48\x46\x9e\x2d\xa5\x1c\x69\x6f\xd0\x65\x71\x54\xc5\x47\x6a\xad\x79\xa4\x62\x89\xce\xe1\xe2\x75\xb3\x1d\xac\x0a\x7b\x5c\x48\xfc\xa8\x17\x44\x03\xb6\x1d\x7b\x32\x52\x12\x1c\x53\xb2\x5b\xec\x1e\xaf\x5b\xf4\x65\x04\xb1\xf2\x49\x0f\xf7\x1e\x0e\x45\xa6\x3a\xb8\xac\x8c\xb4\x17\xd8\x02\x96\xed\x02\x18\x97\x91\x22\xed\x0b\x8b\x8b\xbf\x87\x0c\xde\xba\x9a\x42\xa4\x83\x58\x18\xd1\x98\xd9\x5b\x09\x30\xd8\xa8\xfb\x56\x6e\xa8\x76\x2c\x63\xc7\x93\x58\x28\x3d\x57\x2d\x30\x70\x94\xbc\x89\x1d\x01\x10\xb7\x90\xad\xb2\x67\xb4\xff\xed\x9b\x40\x24\x76\x03\xc2\xe8\x10\x12\x1b\x69\x9c\xb7\x12\x7a\x08\xf7\x2b\x55\xc2\xc1\xab\x89\xdd\x88\xf8\xbf\xb9\x52\x86\x09\x74\x9e\xa5\x5f\x51\xfe\xf6\x67\x56\xec\xca\x84\xbc\x69\x12\x2e\x25\xb2\xdb\xe9\xdc\x48\xec\x6a\xd7\xf2\x2a\xed\x53\x59\xe4\xe9\xff\x59\xb8\xff\x09\xca\x3d\x7a\x48\xbf\x8d\xcf\xf0\x4c\xca\x96\x57\xf0\x8c\x91\xef\x70\x80\xa7\x19\x56\xa8\x88\xeb\x69\x71\xe4\x69\x36\x4e\xbf\x0d\x6e\xd7\xe7\x21\xb9\x63\xef\xef\x05\x66\xa2\xdd\x29\x92\x8f\x78\x74\x92\x72\x90\xe1\xd1\xda\xa3\x07\x2e\x5b\x8a\x4e\x19\x33\x27\x41\xc2\xfc\x14\x2d\x71\x9f\x3c\x42\xc6\xcc\x0f\x1c\x52\x7e\xbd\xbb\xb4\x33\x26\x66\x3c\x12\x66\xaf\xac\x8a\x23\x60\xaa\xe7\x46\xda\x29\x0e\xdc\xc8\x8d\x4d\x15\xfb\x89\xb7\xb9\xa4\x38\x08\x1c\x9c\xf2\x5b\x9e\xd7\xb6\xeb\xd3\x1e\x92\x0e\x56\xe5\x30\x68\x5a\xac\xb6\x7d\xfd\xd2\xe9\xc0\x2f\x0e\x0c\x4b\xe1\x11\x1a\x4b\x9d\x8f\x9e\x22\xe4\x9e\x6f\xd4\x3e\xd7\x65\x7a\xe4\x8d\xc3\x26\x8b\x72\x9a\x30\xf8\xab\x7f\xcc\xf5\x22\xd7\xf1\x79\x1b\x42\x3d\x9c\xfb\x2e\xe2\xe8\xc6\x22\x97\x14\xc1\xdf\xc0\x00\xf6\x86\x85\x9b\x38\x12\x11\xee\x5b\x45\xa6\xa0\xaa\xbf\x75\x2f\x21\xe6\x4a\x9a\x45\x8d\x68\x6d\x0b\x29\x5a\x69\xcb\x5d\x71\x36\xd4\xa2\x5d\x84\x7f\xf5\x5f\xe6\x5a\x49\xe2\x20\x23\xf8\x9c\x9f\x4e\xa0\xda\x8c\xf4\xf2\x78\xba\x8d\x0e\x98\xfe\x9a\x9c\xc7\xe8\xb9\x7c\x22\x4f\x45\x77\xb7\xc2\xf7\x31\x6b\xf8\x92\xe6\xd0\x03\xda\xc5\x42\x01\x7e\x17\x62\x6d\x69\x77\xf9\x58\x72\xce\x22\xcb\xe4\xd5\x8a\x67\xcd\x8d\xd7\xd9\xc5\xec\xb1\x14\x3e\x56\x03\x95\xe5\x02\xab\xd0\xc4\x75\x41\x58\xac\x22\x1e\x50\xb8\x73\xac\x56\x7a\x22\x98\x8a\xc1\x25\x01\xdb\x13\xe9\xda\xf6\xd8\x88\x7e\x1b\x42\xbb\x07\x46\xcf\x73\xec\xe9\x89\xc4\x9e\x24\xb2\x4f\xdf\x20\x77\x1e\x8b\x26\xa2\xfc\x2f\x71\x15\xa3\x6f\xa2\x8d\x44\xc7\xbf\xa0\x2c\xee\x8b\x2c\xe3\xe5\x63\x71\x84\x75\xab\x31\x2e\x63\x2d\x88\x09\x2d\x3f\xbf\xdb\xbf\x25\x8e\x2f\x45\x3c\x4c\x05\x5d\x11\x3a\xcb\xc4\xf5\x08\x3c\xfc\xe3\x71\xb9\x5b\x3c\x2d\xb7\x3b\x92\x94\xc7\x5a\xab\xbd\x92\xcb\x22\x5c\xf5\x58\x6c\xe9\xbf\xf2\xc4\x0d\x39\x6e\x15\x07\x5e\x75\x82\x9e\xae\xbd\xb6\xe7\x2a\xcb\xda\xb8\x3c\xf2\x37\xe8\x93\x35\x8c\x1a\x67\x6c\xaa\x29\xf1\x04\x70\x43\x96\x49\x59\x8d\x65\x0d\xc7\x69\x03\x97\x30\xa6\x30\xb9\x97\xc3\xe7\x53\xf1\x09\x55\x3d\xab\xde\xa7\xb7\xfa\x24\x70\x22\x27\x6e\x11\xef\x04\x31\xcd\xfb\x18\xcd\x24\xd0\xa4\x2b\x70\xe4\xef\x37\x40\x05\x49\xc4\x62\x04\x78\x9e\x8a\x76\xab\x4f\xa2\xd8\xb7\x40\xe3\xb2\x06\x7e\xc4\xb0\xf7\xba\x52\x9f\x44\x3c\xc6\x52\x7f\xa7\xa0\x50\x58\x5e\x38\x99\x44\x5a\x39\x5d\x43\x84\x6d\x56\x42\x6e\x1f\xd3\x6e\x72\x33\x07\x9a\xc4\x22\x16\x56\x4b\x63\xb7\x9b\xf8\xc2\x89\xc3\x10\x46\xdd\xd2\x3d\xe9\x34\x9b\x12\x62\x91\x49\xe2\xb1\xc4\x30\xac\x4d\xd4\xdf\x92\x24\x8c\x91\x5f\x44\x59\x05\xdf\xa2\xe3\x21\x95\x49\x22\x09\xe1\x59\xf3\xf7\x36\x8b\x3f\xea\x58\x69\x06\x49\x6c\x9c\x3e\xf2\x9f\xa3\xde\x7e\x99\x24\xca\xc1\x0c\xc3\x9f\x9b\x7f\x7e\x15\xe8\x25\x5c\x40\x18\x19\x6c\x71\x06\x35\xa8\x87\xcc\x88\x86\xb5\x13\x8f\x03\xf5\xa7\x90\x15\x58\x56\xd5\xf9\x76\x8b\xc1\x75\xc6\xa9\xbb\x5d\x11\x51\x12\x9f\xc0\xb6\x63\xcf\x7e\xd2\xec\x25\xd2\x8b\x50\x9c\x6f\x29\x8b\x31\x4d\xc0\x7f\x97\xcb\x4d\x64\x10\x6b\x82\xe2\x9e\xf3\x9a\xa4\x18\xda\x97\x25\x85\xb4\xb5\xd0\xe5\xd1\x24\x29\x1b\xb7\xff\xe1\x9c\xcb\x41\x18\xdb\x3a\x42\xb7\xff\xc3\x5e\x52\xba\x5a\xb4\x5c\xc6\x02\xea\xbb\xcb\xb7\xfa\x72\xea\x0b\x94\xcb\x44\xc5\x2a\xe4\x1d\x25\xc1\x60\xef\x4c\x14\x0f\x99\x85\x00\xec\x8a\xd7\xe6\x34\x7b\x08\x9c\xd8\x01\x0b\x3a\x28\x53\x9d\xde\xe8\x0f\x49\x20\xa4\x16\x8d\xfd\x1b\xd4\xe4\x9b\x35\xbf\xb3\xe6\xa9\xda\x5c\xb5\xbc\x24\xda\x77\x91\x57\xfe\x58\xc8\xf7\x3d\x0a\x06\x2c\xf5\x4b\x51\x6f\x70\xaf\xbd\x01\xd3\x4e\xb4\x0e\x70\xfe\x50\x2b\x31\xd4\x3f\x80\x67\xf5\xc8\xd7\xe2\x6e\x92\x60\x4b\x18\xee\x5c\x8f\xbc\x54\x92\x9f\xcc\x3c\x6a\x47\x50\xa4\xb4\x9b\xcd\xb6\xfb\xf9\xea\x65\xb7\x99\xcd\x77\xed\x41\x1d\xbb\xd2\x80\xde\x56\xa7\x76\xef\xe3\x9e\x48\x98\xdb\x03\x83\x4c\x87\xab\xc3\x5b\xf1\x84\x40\xaa\x00\xcc\xeb\x3d\x17\x8a\x5e\x5e\xd1\xf2\xa9\x4a\xee\x87\x49\x8c\x45\xb2\x9f\xa7\xa2\x3a\x97\xb0\x85\xba\xce\x3a\x85\xba\xe9\x89\xca\xfd\x58\xf5\x58\xf4\xbf\x9d\x7b\x7d\x71\xd3\x7e\x4d\x2f\x1b\x7b\x6b\xe6\xf6\x3b\x5a\xec\xcf\x80\xf0\xcc\x26\x30\x9f\xad\x86\x1f\x90\x07\x4e\xe0\x8e\x2b\x1f\xeb\x12\xb6\xe9\x5b\x6e\xef\xff\x6f\x09\x22\x74\x4f\x15\xb8\x1c\x8b\x0e\x7b\x05\x35\xc8\xba\x23\x23\xe8\x0d\xf1\x35\x7e\xb9\xd9\xf2\x71\x07\xfc\xf8\x54\xc8\x51\x23\xad\xe4\x41\xac\x78\x07\x4e\xd8\x8b\x8e\xd1\x52\xf2\xd0\x21\x86\xa2\x66\x9d\xb4\x31\x90\x3d\xe6\x83\x2d\x4d\x12\x01\x6c\x7b\x20\x60\xd8\x3c\xf6\x9f\xf3\x5b\xdb\xf0\xc5\x43\x88\x41\xb6\xed\xba\x63\x3d\x8c\x1b\x9f\x2d\x72\xa8\x96\x66\x7b\x09\x79\xb6\xee\xf1\x77\x48\x1e\x79\x22\x48\x8c\xbc\x2a\x25\xc2\xc6\x0a\x0d\xa3\xeb\x85\x54\x57\xfc\x56\x10\x54\x5d\x14\xf5\xbc\x28\xa1\xbd\x5c\x24\x11\x75\xf8\xe7\xeb\x5d\xdf\xf1\xe6\x11\x4f\x10\x51\xd1\xbc\x99\xe1\x01\xa1\xe2\xa0\x35\x23\x58\x36\x29\x3b\x1d\x50\xc9\x23\x48\xb0\x8b\x20\x07\x50\xd5\x43\x9a\xf3\x2c\xfd\xab\xef\x53\xf0\x38\x4c\x62\x4b\x61\xb1\x85\xba\xad\x27\xf1\xc4\x0d\x64\x34\x0c\xfe\x08\x72\xfc\xdf\x76\x23\xdd\x78\x13\x49\xc4\x10\xc6\xaa\xd2\xea\x94\xf1\xcb\xbe\xee\xa5\xee\xec\x10\x1e\xc8\x60\xc0\x55\x36\x9e\x5c\x09\x57\x88\x0e\xf9\x40\x62\xc2\x96\x0e\x72\x04\xde\x1d\xae\x82\x04\x02\xd6\x23\xed\x68\x36\x56\x82\x19\x23\xb2\x9d\x37\x1e\x3c\xfd\xff\x97\xa2\x5e\xe6\xaf\x55\xfb\x71\xb8\xe7\x62\x11\xe7\x78\x79\x28\x8b\xbc\x5e\xd8\xae\xef\xf6\x78\x4c\x34\x1f\xa4\x2e\x40\x58\x9f\x89\x9d\x9d\x8b\x88\x23\xbd\xf8\x2e\x3d\xc2\x3d\x48\x7e\xb1\x75\xba\x3b\xf4\xf8\xca\xcb\x2f\x1d\xd8\xe1\x03\x09\x11\xe0\x56\x4e\xf8\xc5\x56\xcd\xb6\xef\x9c\xfc\x3a\x74\xe2\x42\x68\x4c\x36\x10\xe1\xc1\x80\xd4\x49\x72\x70\x13\xac\x3c\x0a\x5e\x41\x10\xdb\x38\xb8\xe7\xcd\x70\x48\x88\x78\xa0\x3e\x00\x4a\xf1\xb5\x67\x2a\x8e\x3e\xfa\x76\x37\x7b\xb9\x9f\x6d\x2c\xa8\x89\x6b\x48\x5a\xce\x4d\x93\xc6\xdd\xc0\xa9\xfd\x82\x0f\x45\xb9\xf8\x59\x97\xfc\xae\xc8\x15\x79\x6f\x55\xaf\xe3\x4a\x38\x9e\x40\x36\x90\xe6\x1b\x3e\xf0\x34\x5b\x9f\xab\xc3\x8f\x03\xe4\xdb\xba\x68\x02\xa9\xdf\xec\x30\xc3\x2e\xba\xaf\xa0\xde\xca\x03\x64\x98\x48\x68\xde\xf2\x14\x0c\x52\x38\x92\x12\x49\x14\x3d\x6e\x1b\xdf\xea\x40\x72\xd2\x83\x17\x2e\x1c\x19\x49\xd2\xfa\x3e\xde\xe2\x9c\x91\xc2\xd1\x81\xdd\x7c\x16\xd8\x62\x9a\x96\xea\xfe\x5c\x0e\xf8\x0d\xcc\x50\x17\x18\x16\x47\xbe\x01\xaa\x78\xd8\xe9\xf0\x9a\xa7\x75\xbf\xa6\x2d\x7c\x2f\x46\xf5\x1d\x30\xfc\x1f\x43\xf4\x86\xf0\x93\x90\x6a\x67\x14\x86\x0e\x92\xad\xc2\x17\x81\xf2\x5a\xe6\x0f\x91\x01\x8a\x61\x8f\x6e\x24\x48\x7c\x2c\x50\x55\x67\xb1\xca\xc9\x98\x4f\x9a\x45\x11\x3a\x1a\xbf\x1e\x9a\xea\xdd\xcf\xfe\xa7\x09\xfd\x18\xc3\x27\x2c\xee\x2d\x8f\xa7\xd2\x72\xe6\x9c\xa9\xa8\xd1\x9b\x34\x22\x12\x0e\x42\x53\x51\xc2\x7f\x39\x5f\xb5\x8f\x12\xe9\x18\x75\xf8\xee\x77\xf3\xf9\x7e\xf9\xb4\xfa\xb1\xb7\xa5\x54\x11\xfb\x0c\x8d\x3e\xd9\xa5\x67\x5e\x96\x69\x17\x9a\x89\x24\x16\xbc\x83\x4d\xcd\x0f\xfc\x78\xaa\xb0\x0b\x65\x2a\xc5\x24\x9a\xcd\xa9\x0b\x82\x61\xa0\xf3\x75\xb5\xe8\xa6\x52\xee\x82\x87\xc4\xdf\x64\xb7\x54\x24\xf5\xfa\x02\xec\x83\xca\x7d\xb8\x41\x17\xba\x9e\xf3\xd3\x32\xef\x9b\x73\x21\xdd\x20\x26\xc6\x49\x7e\xd9\x14\x17\x9e\xd5\x97\xf6\x50\x14\x20\x9d\xfc\x36\xfd\xb9\xad\x79\x63\x27\xd4\xdf\x13\x44\x92\x4d\xe4\x18\x91\xee\x18\xa1\xaa\xfa\xed\x54\x66\x88\xf2\x85\xc4\xce\x1b\x50\x69\x2b\xc2\xf1\x72\xbd\x9d\xd9\xe1\xb1\x47\x7d\x3e\x86\xc3\xb9\x0f\x4a\x14\x2a\x89\x6d\x16\xfa\xa1\x4c\x21\xc7\x8d\xe7\xad\x89\xae\xae\x4a\x43\x42\x09\x8d\x80\x10\xd4\x7f\x86\xea\x7c\xec\x16\x2f\x70\x97\xab\x11\xa8\x7c\x77\xd5\x4a\x6f\x06\xeb\x40\x24\x4e\x4b\x14\x87\x8b\x9b\xee\xab\x87\x2d\x11\x3a\x22\x44\x0e\xe6\x36\x9a\xbd\x7a\x02\xa7\x21\x34\x30\xcc\xe7\x16\x27\xea\x08\x9c\xdb\xc0\xc7\x5c\x45\xba\xbe\x72\x55\x9f\x60\x36\x2d\xf2\xe7\x36\xb1\x82\xcd\x79\xd4\x56\xda\x82\x6e\xa7\xb8\xe0\xa5\x74\x8d\xe0\xe9\x1b\xd4\x1f\x3c\x3b\x8f\x81\x40\xd2\xf3\x5c\x4b\x2c\x8a\xd9\x53\x6a\xc5\x30\x07\x7d\x87\x39\x49\x97\x39\x99\xac\x83\x8c\xaa\x8f\xd2\x8f\x14\x01\xc1\x0d\xa9\xfc\x94\xdc\xb9\x94\x7e\xec\xb8\x04\xfa\x47\xfa\x20\x13\x11\x8f\xae\x14\x2b\x53\x45\x2e\x7e\xa6\x6d\x69\x44\xfa\x9c\xfa\x50\x0f\xbc\x42\xc5\xa9\x55\x3e\x2f\xf2\xaa\x4e\x6b\x7c\x47\xeb\x22\xcb\x4c\xfd\x7d\xf8\x8b\x8c\xf1\xc8\xeb\x5a\xf4\x70\x56\x77\xdd\x03\x76\x50\x48\xad\xd3\x5c\x29\x54\xc3\xab\xa1\x1c\xf7\x75\x48\x06\xcc\x32\x8e\x1b\xf8\x4b\x7b\xb6\x76\x40\x75\xba\xaa\x77\xe7\xab\x3d\xd6\x0c\x0c\x42\x07\xd9\x43\xee\xf8\x7b\xfd\x80\x74\x94\x97\xab\x8c\xfb\xf0\xee\x03\x45\x2d\x6f\x55\xdd\xac\xaa\xe1\xd5\x42\x27\xc1\xb2\xe1\xf3\x05\xc3\x09\x84\x83\xda\x43\x91\x8f\x44\xa8\xdf\x10\xf1\x98\xdd\xac\x20\x9b\xe1\x91\x93\x20\xf9\x04\x19\xaa\x5b\x2e\xd8\x38\x03\x2f\x23\xc6\x7d\xd2\x93\xed\xcb\x41\xa2\x52\xd3\xe8\xb3\x47\x89\x83\xba\x7a\x5b\x6c\x92\xda\x75\xd8\x42\x19\x29\x81\x70\x24\x99\x01\xcf\xcf\xa7\x45\x59\x16\x28\x37\xff\x75\xcd\x4d\x26\xae\x32\xa9\x9a\x5c\x91\xd0\xc7\xcd\xac\x8a\x4c\x98\x2b\x42\xbb\x7a\x2d\xc0\xb6\x3d\xe6\xe3\x4c\xb7\x85\x6f\x03\x29\x9b\x66\x19\x93\x32\x01\xe2\x0f\x79\x9e\xfd\xb1\x5f\xcf\xfe\x5c\xbd\xee\xf6\x0f\x9b\xd9\x7c\xbf\x5b\xad\xed\x15\xb9\xab\x55\x47\x62\x42\x5c\x37\x9b\x73\x36\xc1\x55\x3c\xb8\xb2\x08\x5d\xec\x98\xdb\x80\x82\x23\x56\xaf\x29\x1e\x1f\x75\x7c\xd8\xd1\xb1\x46\x1f\xe1\xa3\x4d\x8f\x5e\xbd\xaf\xbf\x93\x22\x31\x57\x93\x71\x00\x84\x8e\xc7\xa8\x85\xb4\x35\x8a\xe2\xbf\x63\x82\xbe\x81\xed\x91\xaa\xed\x19\x7b\x4b\xe5\x88\x33\xdd\xbe\x33\x08\xdc\x40\x19\xc5\x89\xe7\x34\x1f\xab\xb2\x49\x09\x10\x60\x5d\xfd\xb8\xb7\x75\xb2\xa7\x54\x43\xc7\x27\x22\xa5\x76\x12\x5c\xe6\xf0\xd6\x57\x63\x92\x52\x07\x24\xa5\x9c\x36\x01\x3f\x1e\xe9\x51\xf1\x0f\xdf\xaa\x72\x84\xe7\x99\x84\x08\x96\x0d\x07\x29\x7b\xe5\x48\x40\xff\xc8\x30\xe8\xbe\xe6\x4d\x80\x57\xb5\x61\xa1\x72\x1d\x97\x87\x2d\x94\xbb\xac\xef\x79\x4b\xd2\x27\x95\x17\x11\x15\x14\x57\x6a\xd0\x6c\x35\xba\x03\x4f\x83\x46\x2e\xbf\xb4\xa8\x8b\xf2\x2e\x2d\x90\xe3\xb0\xf7\x3c\xca\x4f\x42\xe5\xda\x3a\x27\x32\x52\xf7\xea\xbf\xc3\x35\x10\x5f\x47\xf0\xca\x57\x31\x92\x4d\x36\x56\x0e\xe4\x54\x4d\x7c\x30\xe1\x95\xaf\xb5\x45\x7d\x37\xab\xd2\xc0\x2e\x07\xac\x33\xc3\x13\x98\xcb\x10\x07\xfc\x96\x7e\x00\x6a\xe5\xda\x1b\x67\x01\xc7\xaa\xf2\x23\xfa\xbc\xdf\xb9\xbc\x9e\xd6\x8a\x45\x89\x6f\x4c\x7c\xf3\xec\x50\x97\x56\xd6\x42\xaa\xc0\x89\x62\x43\xa4\xb3\x7f\x4f\xf3\xb7\x3d\x1f\xcc\x21\x15\xf8\x3e\x37\x09\x64\x2a\xe6\xb5\xe8\xce\x76\x00\xb3\x70\xca\x39\x3f\x71\x99\xd6\x23\x0f\x5d\x05\x89\x17\xba\xb6\x58\x8a\x7d\xb5\x3d\xe1\x8d\xe6\xb0\xf0\xa9\x5a\x8b\x5c\x35\xd8\x1b\x4b\x94\x8a\x66\x40\xe8\x68\x64\x45\xfe\x4c\x73\xd4\x9f\x9e\xec\x0f\x54\xa1\x2b\x6d\xda\xed\x5b\x51\x28\xf2\xc1\x07\x6b\x46\x45\x71\x82\xed\xba\xd4\x19\xdd\x5e\x67\xd8\xa3\x7e\x2b\x99\x62\xae\x11\x07\xd4\xe6\xd3\x6c\xf0\xc8\x3f\x33\x21\x7a\x26\x55\x1c\x13\xb7\xc6\x47\x0a\x9f\x36\x8b\x6b\xeb\x32\x1d\xb5\xae\x54\x89\x24\x30\x20\x75\x3e\xce\xa1\x4e\xb5\x6d\xb7\x18\x5e\x90\x87\x24\x5c\xb7\xe6\x79\x2a\xdf\xaf\xbe\x30\x97\x21\x1a\x50\x14\xd1\xb5\x17\xe7\xc0\xcd\x8b\xad\x57\xa7\x6f\xfc\x6b\x56\xf7\x2b\xa3\xac\x04\x63\x86\xcb\x00\xc9\xd7\x17\xdd\x92\x55\xa1\x8b\x31\x8b\xe5\x03\x6f\xa5\xd8\xbe\x7e\x75\xaa\xf1\xdc\x87\x44\xba\x37\xac\xab\x3d\x41\x85\x48\x4b\x35\x7f\x5c\xcc\x7f\x5f\xaf\x96\x2f\xbb\xfd\xef\x0b\x4b\x7b\xa0\xc0\x8d\xa9\x59\x92\xda\x5b\x06\x53\x06\x62\x22\xb4\xc3\xbd\x89\x12\x0b\x2b\xbd\x03\x4e\x0a\xee\x46\xbe\xbb\x1d\xcc\x43\x9d\xf4\x9a\x45\x8c\xb6\x42\x3f\xa9\xab\xb4\x17\xe2\x1c\x5c\x9c\x0e\x65\x91\xef\x30\x0b\xd1\xba\x8f\x4a\x33\x1f\x65\x84\xb8\x52\xfb\x13\xb9\xaf\xb6\x94\x5d\x15\xd9\x8d\xfa\xb7\xd2\x41\x88\xa8\x44\x4d\x19\x9e\x1b\xc5\x58\xa5\xc1\x51\x8d\xaf\xf2\x08\x59\x66\x53\x44\xe0\x40\x1c\x19\x92\xe3\xe2\x5c\xaf\xae\x33\xef\x83\x9f\x02\x47\x0b\xec\xfa\x68\xa2\xe3\xd6\x4b\xfb\x91\xd6\x87\x01\x55\xc1\xe8\x24\x57\x2a\xe9\xf7\x94\x9a\xd0\x21\x58\xe9\x59\x96\x61\x34\x6e\x4d\x04\x78\x8c\x88\x12\x28\x02\xef\x7b\x19\x76\x80\x20\x04\x9d\x25\xe1\x5a\xbc\xbd\xb5\xe7\x0a\xc1\x6c\x6b\x4f\x91\xe6\xf8\x3b\xd5\xb4\x15\x07\x4f\xb9\xb8\xf4\xde\x0b\xd0\xf6\x7c\xdf\x53\xb8\x0f\xcd\x72\x75\x28\x79\xdf\xa4\x83\x2f\x09\x30\x6d\xeb\x9c\xc4\x77\x34\xf2\x8a\x81\x31\x7a\xbb\x34\x6a\xb4\x91\x6e\x6f\x41\xa3\x81\x25\x1c\x43\x97\xdf\x7f\x9f\x4f\x40\x53\x80\x29\x87\xf5\x5a\x3b\x9a\x40\x22\xbb\xd1\x22\x02\x01\xf7\xd0\x57\x42\x0a\xa5\xca\xab\x27\xfd\x0e\x3b\x56\x4b\xa4\x0f\x7b\x5d\x12\x7b\xce\x2f\xc3\x48\x08\xdd\x00\x6b\x2d\xeb\xab\x76\xdc\xe1\x95\x43\xe6\x73\xe2\xad\xfc\x80\xac\x38\x41\xb9\xcf\xe1\x73\x5f\x11\x82\x69\x70\xc5\xc8\x89\x4d\x4b\x42\x9a\x35\x0b\x6f\x59\xa1\x76\x80\x1c\xbd\xd8\xd8\x57\x9e\xe9\xa8\xba\xe2\x11\x9c\xa2\x90\x96\x90\xb0\x90\x25\x6d\x5d\xf3\x0d\x5e\x37\xcb\xd1\x35\x13\x0e\x98\xd8\x7d\x81\xcf\x7b\x98\x90\x7e\xfc\x9b\xa8\xb9\xff\x77\xc9\x4f\x48\xa4\xc4\x06\xa6\x6f\x50\xcf\xd3\xba\x15\x1a\xbf\xf1\x42\xb9\x1f\xe2\xbd\xbe\xa7\x59\x76\x63\x42\xf3\x08\x30\x98\x44\xc8\x5a\x9a\xbf\xf5\x6c\xb4\x1d\xa1\x42\x6c\xe5\xca\x08\x37\x6b\xff\xaa\x09\x05\x31\x7f\x5a\xbd\xde\x3f\x34\x8e\x7d\xbb\x16\xa5\x4b\xd4\x2a\x9b\xd5\xd3\x62\x7f\xbf\xdc\xee\x36\xcb\xbb\xd7\xdd\x6a\xd3\x1e\x17\x32\x34\xd9\x59\xc2\xe2\x56\x8d\x5d\x1f\xde\x96\x04\x40\x9e\x98\xa1\x54\x81\x33\x1e\xa5\x89\x90\xe8\x5c\xa9\x5d\xb1\x18\x57\x87\x40\x79\x12\xfd\x0a\x2c\x21\x71\xd9\xb6\x35\xcc\x6e\x18\x1b\x95\x48\x42\x76\x9c\x71\xdd\x5d\xad\x53\x25\x48\x1a\xe1\xc4\x2f\xff\x3c\xf3\xb2\x86\x12\x13\xe3\x13\x8a\x83\x12\xc0\xa3\x98\xf9\x0d\x61\x52\xc6\x27\x6b\xed\x3d\x40\x08\xf8\x1d\x2d\x71\x26\x39\x02\xa0\x76\x8d\x69\x87\xe9\xa0\x62\xfa\xa6\x41\x78\xcc\xef\xd8\x8a\xb7\xdb\x39\xa8\x33\xed\xdf\xb6\xc9\x66\x30\xc3\x01\x9c\x80\xd8\x98\xb6\xe7\x13\x94\xe7\x6a\xec\x2b\x03\x80\x40\x28\xfe\x16\x78\x29\x0f\xcb\xf5\x66\x12\x34\x0a\xda\x4f\x10\x32\xd3\xf6\x5e\x10\x94\x7c\x72\x1b\x05\x1d\x13\xcb\xc3\x1b\xd4\xcf\xfc\xe7\xcd\x30\x1a\x34\xd7\x5c\xf4\x79\x22\x91\x5e\x8b\x2e\xf5\x50\x94\xe8\xa4\xc2\xc8\xb6\x6b\x47\x29\xca\xaf\xa3\x72\xc0\xdf\xeb\xf9\xd7\x0e\xb8\xd8\xf0\xbe\x83\xb2\xe4\x65\x7a\x3e\xf6\x36\x53\xed\x46\x01\xd6\x6d\xdb\x6e\x0f\x29\x86\x71\x8d\xf6\xc0\x47\x36\xd3\xaa\x28\xeb\x5e\x16\x53\xb3\x44\x12\xb1\x3e\xb4\x4c\x54\x5f\x36\x5f\xea\x20\x49\x34\xd1\x51\xbd\xe6\xe9\xcf\xeb\x62\x86\x0e\x5d\x07\xf9\x51\x5f\xf3\x0a\xea\xd9\x1b\xe4\x8a\x4f\x7e\x10\x1d\x06\x41\x2c\xbb\x46\x9e\xe7\xd4\xce\x36\x1d\xc6\x84\x7f\x34\x17\x18\xd9\x00\x1d\xc6\x1a\xb3\xdd\xd8\x3e\x6f\x05\x63\xdb\x73\x85\x8f\x09\x3e\xfa\x22\x77\xbc\x02\xca\x27\xfd\xad\xd9\xa9\x23\x83\x88\x9d\xdf\xfd\xd1\xdf\x18\x75\x24\x42\x2c\xd9\xc3\x31\x6d\xd6\x47\x35\x37\x1b\xe3\xf4\xb7\x8a\x84\x72\x84\xe9\xf1\x4e\x4b\x58\xe4\xc5\xf9\xed\xb0\xf8\x79\x7a\x28\xca\xbb\x26\x10\xb9\x62\x45\xd4\xb1\x1f\xfa\xb6\xee\x20\x8b\x36\x27\xa1\x79\x1c\xd9\x6c\xf6\x5d\x71\xce\xab\x05\x2f\x1b\x7f\x7e\xe4\x3b\x6b\xce\xa9\x77\x97\x0a\x84\xd7\x9d\x50\x5a\x38\x24\x15\x6f\x35\xea\xb0\x57\xe6\x9e\xd7\xfc\xb1\x97\xcc\xe9\x12\x16\x57\xa1\xfb\xe8\x6a\x0c\x10\xb1\xf2\x9c\x66\x59\x57\x3c\xd1\x22\x21\x3c\xf0\x47\x61\x0d\x44\x6f\xbf\xe9\xcd\x39\xa1\x18\x0b\xda\xde\x99\xb1\x24\x95\xd4\xb2\x09\xb0\x9a\x97\xd1\x2c\xa6\x14\xaa\xdf\xc1\x26\x87\xb5\x14\x0e\x1a\x77\x4e\x92\x70\xf0\x40\x04\xa9\x83\xfa\x94\x56\x10\x59\x07\xe9\x91\x97\x6a\xce\x4f\xf3\xc7\x87\xd1\x6f\x80\x43\xa8\x37\x64\xe7\x26\x67\xe3\x76\xde\x46\x43\xac\x11\x56\x3b\x2b\x3b\xb6\x05\xfb\x6b\xc0\x7d\xc4\xbe\xde\x3d\x3d\xcf\x2d\xbe\x5e\xeb\xc8\x41\x61\xcd\x66\x17\x58\xf3\x73\x5b\x5b\xd3\x5a\x73\xa2\x49\x38\x14\xa7\x6d\x5d\x94\xf0\x02\x3f\xeb\xa5\x99\xf9\xca\x71\x84\x23\xbb\xb4\xfe\x3d\xa8\x71\xd3\xb6\x19\xe7\x3a\x8e\xd1\xa1\x24\x26\xc7\x61\x2f\xfc\xe4\x67\x53\x8e\x2b\x23\xf4\xdb\x5a\xbc\xf6\xae\xb8\xef\x31\x2e\x4c\x46\x14\xca\xf1\x02\x1e\x25\xb6\x89\xee\x0d\x46\x37\xe2\x25\xc4\xc2\x60\x3f\xc8\x4c\x7d\xa4\x55\x71\x43\xab\x5a\x39\x9e\x72\x6c\x95\x1b\x9b\xb6\xfb\xa6\x43\x39\x1e\x30\x82\xa6\xf0\x4c\x12\x4c\x8b\xda\xf1\x66\xb9\xfa\x06\xf5\xba\x84\x2c\x3d\xa6\x39\x2f\x2f\x8d\xc3\xbc\x81\xaa\x6f\xbf\xcf\x5d\x13\x49\xe3\x48\x92\x82\x5a\x33\x13\xaf\x2b\x93\xca\x61\x9e\xc4\x04\xc9\xb7\xf4\xad\x9f\xd3\x50\x0e\x4b\x3c\x8c\xb7\x86\x89\xea\x49\x63\xa1\x1c\x8b\x12\x6d\x8c\xe0\x1d\xd4\x9f\x00\x79\x73\x63\xd5\x6f\xed\x71\x81\x77\x41\xb9\x4c\xeb\xd0\x20\xa3\x48\x6f\x8b\x53\x4e\xc8\x39\x52\x11\xfe\x68\x6b\xef\x43\xe0\x80\x72\x42\x88\x90\xed\x63\x3b\x5f\x6d\x16\xfb\xcd\x62\xbd\xda\xec\xf6\xdb\xdd\x6c\xb3\xdb\xef\x96\xcf\x0b\x3b\x2c\x0a\x04\x5e\xa8\x2f\xbf\x6f\xe6\xb0\x72\xa2\x84\xc5\x66\x87\x3f\x16\xa8\xf4\xbb\x4d\x73\x09\x4f\xbc\xaa\x1f\xfb\x0d\xb1\xed\x70\x8e\xe9\xf1\x3f\x77\xeb\xd9\x9f\x5f\x20\xa7\x94\x13\xc7\x91\x67\x7f\xf5\xbe\xb0\x34\xa5\xca\x49\x22\xf0\x6c\xb0\x39\x7e\xa0\x44\xbb\xa8\x4d\x02\xa9\x2a\x4c\x4f\xc0\xde\x1e\xe3\x0e\xc4\x44\x89\x53\x93\x62\x9d\x28\x7a\x99\xf9\xd1\x37\xe0\xc0\xb0\x29\xbb\xf9\xd2\xe5\x10\xd5\x36\x1e\xa9\x63\xcc\xec\x9d\xf8\x65\x72\x6b\x53\x8e\x08\x09\xc5\x5e\x9d\xc5\x7e\x5a\x2e\x54\x39\x32\xf4\x9d\xc8\x16\x45\x16\x3f\xd3\x71\x82\x50\x39\x92\x4b\xa4\x4b\x3a\x9f\x28\x6d\x71\x5d\xa1\x50\x8e\x94\x0c\x1b\x85\x4a\xf8\x80\xb2\x82\xed\x29\x33\xe2\xde\x94\xca\xe9\xd3\x33\xff\x36\x3c\x13\x02\x85\xbf\x6f\xd8\xd6\x98\x7d\x69\x10\x72\xb4\x67\xe8\x80\x2e\xe7\xab\xdf\x7a\xb3\x5d\x2b\x4e\x7d\xd2\x79\x9d\xd6\x97\x1e\x77\x81\x72\x1d\x8f\x21\x87\x80\xc8\xb8\x7c\x47\x1a\xca\xb2\x3b\x94\x20\x45\xa2\x01\xfb\x62\x98\xff\x3a\x41\xad\xac\x5c\x37\x21\x4a\xdf\x26\x94\x2f\x51\x53\x63\xfa\x63\xb9\x2e\x24\xc8\x5b\xf4\xd9\x6c\x61\xf8\xbc\xf4\xc5\xaa\x75\x9f\xd1\x5b\xb9\x5e\x22\x48\x73\xba\x99\x97\x0f\xb6\xb5\xb3\xea\xed\x53\x68\x37\xec\x2b\x77\x3d\xee\x38\x2d\xf6\x4a\x73\x09\x4b\xb5\x5f\x6c\xe6\x57\x14\x25\xca\xf5\x5d\x8e\x5b\x0b\xf2\x3e\x5a\xfc\xf2\xe2\x67\xdd\x78\x29\x22\x83\xb6\x6e\x6d\x86\xb3\xc4\x48\xe6\x16\xc6\x15\xbf\x81\x33\x18\x3e\x26\xd3\xa4\x2b\x68\xe1\xab\x43\xee\x11\x33\x28\xf0\x25\xe2\x92\x1b\x8f\xa2\x75\xb4\x95\x1b\x40\x82\x0e\xe5\x81\x57\xcf\x69\x7e\x77\x56\x6f\xb7\xa9\xc0\xda\xe7\x0f\x9d\x08\xfd\xa5\x66\x33\xdf\x9c\xab\xc3\x2f\x3b\xf4\x94\x1b\x2a\xc0\xd8\xb5\x30\x84\x81\x8d\x97\x0b\xf5\xe8\xc3\x86\xda\xc5\xc8\xe8\x9c\x13\xfb\xf3\x14\x4d\xa3\x72\x23\xcf\xc7\xc2\x10\xce\xa1\x96\x33\x4f\xb9\x51\xc8\x90\x11\x89\xf6\xb2\x56\xad\xec\x8b\xaa\x86\x72\x23\x9e\x60\xc7\xac\x30\xd8\x92\x01\x67\x4b\x7f\xaf\x70\x23\x15\x76\x12\x53\x46\x8d\xe6\x26\x32\xf2\x6a\x67\x1f\x17\xbb\xaf\x2a\x51\xca\x8d\x7d\x5a\x1a\xb3\xb2\x5e\x5a\x93\xee\xc6\x41\xe8\xf6\xca\xee\x50\x9a\xec\x23\xa0\x1f\x35\x2e\xa0\x0d\x9f\x2d\x8e\xc0\x17\x3d\xa6\x13\x03\xa8\x40\x4d\x5a\x80\x87\xa2\xdc\xf0\xbf\x6e\x2c\x9c\x38\x09\x43\x6a\x78\x43\xc6\x6c\x85\x99\xc0\xe7\x42\xbe\xdf\xac\xa4\x29\x37\x71\x7c\x4c\xee\xa6\x6d\xef\xeb\x9c\x9f\x96\xb2\x40\x1d\xe2\xdd\x67\xb1\xee\x25\xa4\x94\xcb\xa3\xc8\xa8\xb1\x65\xd9\x0b\x97\x5f\x12\xdf\x28\x97\x37\x9b\x1b\x91\xe0\x6d\x28\xd5\x79\x21\x92\xc8\x6b\x3e\xb0\xe1\xac\x17\xbe\x87\x10\x9e\x17\xf8\x7c\xee\x77\x72\x2b\x57\x44\x61\x6c\x71\xa2\xb6\x6e\x4b\xa7\x42\xb5\xd2\x4f\x43\x45\x85\xd1\x45\x39\x20\x63\xd3\x36\x7d\xcb\xcf\xc7\xe1\x55\x25\x47\x08\x34\xe2\x3e\x4b\x2e\xae\x84\xfd\x94\xab\x7c\x86\x1d\xb7\x0f\xab\xd7\x97\xfb\xc5\xc6\xf2\xf7\xba\xf6\x12\x0a\x2c\x66\xb3\xe6\xd9\x4a\xeb\xce\x42\x6a\x26\x90\xe1\xc2\x62\xe6\x16\xa5\xbc\xce\xcf\xda\xb1\x91\xc2\xb1\xdf\x1a\x47\xbe\x68\xec\xec\x7d\xcf\x2c\x69\x2e\xf1\x37\x88\x97\x6c\xbe\x7a\x7e\x7e\x7d\x59\xee\x4c\xda\x56\x79\x6e\xcc\x12\xdf\xc2\x46\xb1\x05\x6f\x0d\x65\x1f\x24\xab\x3c\x97\xc7\x68\x4e\xee\xd3\xb7\xb4\xe6\x59\xe3\x57\xa7\xf9\x1b\xc6\x88\x83\x97\xe5\xb9\x9a\xfa\x1e\x0c\x49\x53\xcb\x13\x6b\x0e\x7b\x82\x24\x6e\x8e\xe4\xda\x53\x5f\x40\xcf\x54\xb7\xe3\x94\x13\x59\x8e\x0c\x9e\xbf\xdf\xd1\xc7\x1c\x89\xf8\x2b\xcf\xd3\x2e\x46\x63\x88\xba\xc3\x12\x42\xc7\x5b\xa5\x3c\xdf\xf1\x50\xca\xcb\x22\x1f\x86\x75\x92\xe6\x78\x84\x29\xfa\x27\x7e\x14\x45\xff\xbb\x7a\x3e\x08\x82\xa3\x34\x7f\x7c\xe0\x59\x26\xb8\xad\x8e\x28\x8f\x79\x24\x69\x93\xe6\x69\x7d\x57\x88\xe9\x35\xe5\xb1\x44\x6b\xcb\x20\x09\xea\xae\xf1\x31\x10\x7e\x30\x08\x9c\x95\xc7\x04\xe9\x9e\xfd\xeb\x71\xb5\x99\xb5\x7f\x54\xe0\xb5\xb0\xa0\xfb\x33\x64\x77\xf0\x96\xb6\x37\xc7\xb4\x83\x08\x96\xb4\x5a\xda\xa6\x21\xea\x9b\x9c\x9c\x1a\x5e\x10\x3a\x98\xd2\xda\x37\x2b\xb5\xac\xe0\x9b\x89\xd1\x46\xe0\xbe\xe1\x49\xa1\xc7\x3d\xd3\x53\x6a\xf8\xd3\x2d\x82\x46\x79\x91\x47\xa0\xa2\x95\xe9\x3e\x6c\xdb\xfc\x94\x17\x07\x0e\x6e\x2f\xc4\x74\xf5\x4b\x04\x79\xdf\xcf\xf3\xe2\x00\xd0\x44\x60\xfb\x4b\xaf\x89\xa7\xbd\xb6\x0a\x91\x85\x76\xf7\xb0\x9a\x7d\xe5\x30\x7a\xb1\xa6\x12\xea\xde\x8a\xc1\xc1\xd7\x52\x60\xca\x4b\x1c\x42\xde\x1b\x58\xc3\x13\xe4\xf5\x61\xe0\x43\x7b\x49\x40\xb2\x8e\xdf\x8a\x42\xed\xca\x22\x9f\x6c\x09\x36\x63\x05\x23\x96\x0b\xb3\x56\x4c\x7b\xff\x20\x10\xf0\x44\xc8\x18\x1b\x35\x71\x1e\xd2\x1a\x9e\xa6\x52\xb2\x9d\xaf\xe5\x49\x07\xb8\x6a\x13\xfb\x8f\x03\x54\xdd\xe8\xa1\xa4\xc7\x30\xb3\xd5\x29\x54\x1b\xdc\x6a\xeb\x0d\x78\x12\x88\x4d\x44\x9a\x19\xbe\x7f\x28\x4a\xd3\xe3\x31\xaa\xc0\x75\x68\x33\xe5\x29\x00\xd9\x41\xb0\xaf\xf0\xda\x57\x66\x74\xb8\xb3\x7a\x5a\x6b\x6c\x9d\x7f\xc8\xd2\xd3\x8b\x9d\xf2\xbe\xeb\x31\x94\xba\x43\xb1\x84\x0e\xe0\xa1\x7c\xcf\x51\x08\x7c\x44\x97\x8a\xe4\x0a\x50\xc6\xe9\x32\xfd\xd8\xbe\xe7\x89\x88\x08\x79\x11\xc1\x7a\x4a\x87\x06\xca\xf7\x38\x67\xcc\xac\xde\x94\xd7\xd0\xa7\x9e\xb6\xbf\xe9\x87\x01\xc6\x32\xf8\x9b\x7b\x93\x40\x1a\x9a\x1e\xdf\x8f\x09\x31\x7c\x01\x5e\xae\x72\xdb\xfe\x92\xb6\xe6\xdb\xf7\xa5\x44\x6a\xc1\x96\xa6\xbb\x0d\x54\x48\x4d\xdb\x8e\x63\x01\x58\xa5\xd3\xc5\xee\x71\x32\x2c\xf0\x03\x5f\x82\xdd\x0a\x4a\xfe\x79\x0f\x1f\xf6\xec\x20\xd0\x98\xef\xe4\xa6\xa2\x76\xc7\xdf\xaa\xf6\x58\x18\x8a\xa8\xc7\x06\x36\x89\xa7\x9b\x5a\x42\x7e\xa0\x88\x3e\xf8\xdb\x6c\xbb\xdf\xad\x9a\x1d\x63\xfd\xb4\xd8\x2d\xf6\x8b\x3f\x16\xf3\xd7\xdd\x72\xf5\x62\x7f\x22\x0c\x95\xa2\x24\x1b\xd6\x72\x16\xf5\x21\x95\x8f\x67\xb1\x03\x7e\xec\xcc\x82\x1f\xf2\x00\xcd\x74\xd7\xf1\x6e\x4a\xb4\xf6\xb8\x24\xa4\x1b\x4e\x94\x5d\x31\xc0\xc5\xf6\xa7\x9e\x1f\x4a\x89\x3b\x95\x38\x97\xf9\x30\xab\x32\x5c\x83\x7e\xa4\x01\x13\x18\xeb\xb2\xa8\x81\xdb\x65\xe7\xc7\x9e\xb0\xa9\xa1\x1f\x69\xae\x8a\xcf\x99\xfa\xcf\xa6\x71\x91\x1e\x08\x8b\xd3\x6d\x30\xbd\x45\xe7\x73\x0f\x10\xde\x48\xb7\xbf\x52\xaa\x9a\xfe\x4a\x3c\xf0\x9c\xb8\x27\x72\x97\xfe\x05\x58\x96\xfb\xc6\xab\xde\xcb\xe0\x09\x35\x3a\x1b\xb0\x64\x9f\xf3\xde\xbb\x52\xb2\x37\xe7\x08\x13\x96\x1d\xf7\x27\x22\xbf\xb4\x17\x13\xa0\xb1\xaa\xf5\x02\x9f\x43\xf9\xf5\x2f\xe9\x09\x94\x2f\x25\x71\x39\x37\x2f\x02\xe0\x3d\xbb\xf4\x7a\x06\xbf\x17\xd9\xf9\x88\xbc\x20\xbd\x1f\x92\xe0\xfa\x7d\x59\xbb\x67\x9e\x9f\x79\xd6\x41\x7f\x47\xef\x5f\x39\x64\x23\x72\xf8\x7c\xb9\x92\x19\x34\x63\xc0\x4d\x6c\x4d\x60\xde\xe6\x24\x95\x0f\x11\x73\x0c\xec\xf1\x7c\xda\xf6\x14\x99\x47\x3f\xa1\x9d\x04\x8d\xd7\x2c\x2d\x39\xb1\xc7\xa0\xc3\x39\xf5\x4b\x1a\x82\xd0\xb3\x65\x2c\xc5\xcb\x6a\xd9\x7a\xa6\xcc\x89\x98\x6e\xb7\x7a\x64\xdf\x18\xa6\x7c\x15\xf3\x5d\x86\x67\xdf\x9d\x2f\x77\xdb\x5d\xdd\xcb\x05\x2a\x16\xb8\x44\x22\xbd\xfe\xb6\xee\xdb\x77\x16\x44\x0a\x17\xec\xef\xb3\x35\x76\x8b\x7e\xb1\xd8\x58\x14\x6b\x29\x8c\xc6\x33\xd2\x1d\xf1\xf2\xc6\xb6\xcc\x22\x23\x96\xdd\x78\xb1\xe4\x60\x35\x1b\xc6\x13\xe4\x6f\x07\xfb\xfe\x58\xa4\x8c\x68\x6b\x21\xdf\xb7\x00\x6a\xd4\xb2\xa6\x58\xcc\x42\x87\x80\xfb\xf2\x30\xf0\xf2\x58\xac\xb9\x43\x74\xad\x88\x24\xde\xfb\xf6\x40\x92\x70\xed\x77\x2b\x00\x51\x5b\xd5\x57\x9c\x30\x8a\x25\xda\xa1\xbe\x5f\xac\xa1\x12\xd2\xaa\xbf\xb9\x0d\x1f\x8c\xfb\x81\x65\x87\x7c\xe2\x8d\x37\x67\xa9\xe2\xa6\xa0\x56\x8a\x89\x50\x88\x3e\xa6\x75\x2b\x8b\xf3\xa9\xb8\x51\xa3\x55\x4c\x98\xf4\xba\x1d\x4e\xb9\x90\xe6\x5d\xff\x9e\xe6\x6f\x3f\xd2\xfa\xd0\xf8\xf6\xbc\x3e\x97\x37\xd5\xda\x7f\x59\x98\xec\x99\x29\x26\x9d\x08\x33\x77\x3b\xa8\xea\x30\xb6\x2f\x51\x6a\xae\x8c\x4f\x8b\x2f\xa5\x8f\x2d\x32\x43\x94\x74\x30\xd7\x95\xf1\x5c\xd9\xd7\x6b\x4f\x07\x87\xd2\x7d\x9b\xc5\xc3\x62\xb3\x99\x3d\x11\xc1\xfe\xb6\x3d\xac\x42\x83\xa4\x39\x9a\xac\x34\xa1\x89\x0d\xe0\x5b\x05\x8e\xe7\xf2\x36\x85\x63\xc3\xaa\xe1\xef\x07\x8e\xcf\x10\x95\xb5\x41\x82\xc0\x5f\x75\xa8\xd8\x93\x84\x8f\xd9\x6b\xfb\x76\x67\xb9\x7a\xea\xd3\xa6\x0f\x47\xbb\xbe\x80\x96\xd9\x0a\x78\xd5\xbc\xf3\xc1\xc7\x0d\xdc\xc0\x43\xc7\xa5\xbe\x9c\x7a\x6c\xe1\xe3\xcb\x84\x01\xa2\xaf\xaa\x43\xf1\xd9\xc2\x42\xaf\xe1\xc1\xcd\x40\x70\x98\x05\xbc\x1e\x05\x27\x5f\xb0\x15\xc1\xf3\xe2\x7f\x8c\x7e\x3d\x09\x51\x5e\xce\x34\x98\x5d\x6b\xa4\xde\x08\xf1\x6f\x6c\xab\x16\x96\xe6\x11\x83\xf9\x60\xe5\x07\xae\x0a\x94\x69\x44\x1e\x77\xff\x8f\x9e\x56\x73\x66\xb8\xea\x4f\x45\x35\x4d\x24\x6f\x86\x7a\x51\xe0\x19\x0a\x87\xa7\xa7\xef\x88\x43\xdf\xbb\xfe\x6f\xc3\x31\x2a\x26\x09\x59\x38\xa6\xf5\xa6\xc8\x60\xdc\x7b\xd8\x0b\xf4\x03\xdf\x61\xd8\xae\xd8\x73\x5d\xcc\xcd\x8e\x63\xf2\xe1\x3d\xfb\x52\x24\x61\x9b\x8f\x78\xcd\xd3\xba\x7a\xad\xa0\x9c\xf3\xfc\xee\x7c\xa1\x80\x65\x78\x02\x6b\xe2\xfe\x2e\xf7\xb8\xa8\x24\x3f\x81\xa1\xf2\xb4\x43\x02\x8d\x60\x0b\x89\x7b\xff\x6c\x9c\xb9\xb3\xa3\x84\xc4\x7c\xd5\x53\xf1\xf6\xb2\xd7\xb9\xbc\x95\x38\x19\x7c\xa3\xe1\x42\x76\x47\x0f\x13\x38\x31\x2e\xcc\x7d\x05\xf5\x9a\x5f\x76\xa3\x85\x1b\x04\xa1\x87\xf1\xf7\x7a\xb3\xd8\x2f\xe7\xab\xfd\x7a\xb1\x59\xae\xee\xed\x6d\xc7\xae\x1b\x0f\xaa\x18\xf9\x1b\x64\xd3\x68\x56\x7b\x86\xe7\x22\x7a\x71\x5f\x0e\xe8\x3a\xba\xa3\x58\x24\xb5\x65\xe1\xfa\x6c\x90\xcf\x83\x5a\xa4\x1d\xec\x0b\xad\x7b\xb5\x9c\x51\x07\xeb\x70\x57\x0d\x12\xe6\x33\xd5\xc1\x20\x27\x80\xe6\x2a\x48\x34\xb9\xe4\xcb\xdd\x59\xd8\x5d\x32\xe0\x52\x28\x2b\xc1\x93\xe6\xe7\x09\xc1\xc9\xee\x96\x38\x24\xe8\x86\xbd\x14\x0a\xb6\x9f\xfc\xd4\x6d\xb9\xbf\xb2\xb2\x37\x0a\x87\xbf\x82\x99\x98\xdf\x15\x11\x21\x6f\x56\xa2\xe6\x69\x3e\x3f\xa4\xa7\x3e\xf1\xa0\x0a\x44\xc2\xf0\xf8\x7c\xfe\x48\xdd\x32\x36\x4b\x13\x48\x06\xf8\xfd\x77\xcb\xe7\xc5\xea\x75\xb7\xbf\x5f\x6c\x77\x9b\xd5\x9f\xed\xe1\x80\xd9\x70\x79\x20\xc6\x38\x7d\x1b\x92\xfb\xa4\xfe\x68\x5b\x02\x7f\x5e\x90\xa9\x62\xf8\x96\x55\x24\xb0\x3f\xe2\x61\xb1\x78\xea\x74\xb9\x54\xa0\x40\x22\x05\x75\x2b\xcb\x38\xaa\xc4\x04\xe0\x73\x8c\xcf\xbf\xad\xd7\x8f\xb3\xcd\x33\xe9\xb0\x4c\x9a\xee\xd0\x09\xbc\x48\x0c\x3a\x03\x5b\x82\x9b\xab\x99\x79\x55\xb7\x54\xa1\xeb\x4a\xa4\x6d\xdf\xad\x76\xb3\x27\x9c\xf7\x83\x3d\x29\x74\xb5\xc6\x86\x19\x79\x3c\x4d\x6b\xd1\xaa\xd0\x73\x42\xec\x26\xa5\x70\x2c\xbb\xe7\x97\x49\xa6\x76\x15\x7a\xae\x63\xab\xae\xaf\x39\xf2\x28\x13\xd1\x75\xbe\xf8\x59\x98\xa5\xd4\xff\x05\xfb\x4d\x43\xcf\x57\x88\x8d\x82\x5c\x16\xaa\x23\x73\xe8\x4d\x4a\xfa\x97\x04\x23\x98\x33\x3a\x3b\xd0\xae\x21\xc2\x83\x11\xab\xb3\x0a\x9b\x50\xd6\x37\x9c\x20\xd6\x44\x85\xbe\x07\x88\x02\xc7\xe2\x02\xf9\x5e\xd7\x95\x5f\x3b\xd6\x0f\xf1\x99\x9e\x21\xad\x2a\x3e\xb7\xb2\xcf\x7d\x4f\x32\xf4\x13\x2f\x30\x9e\x3a\x65\xfb\x1b\xdb\x31\xbf\x6a\x38\x51\xa1\x2f\x7d\x3f\x26\xdb\x68\x76\xf7\xd1\xed\xb2\xd0\x0f\xc2\x3e\xf5\xdd\xbc\x38\x9a\x0e\xb8\x5d\x31\x78\xeb\xed\xe3\x07\x8e\x8b\x38\x15\x93\x18\x69\xbb\x06\x42\x36\x34\x09\x61\x10\x2a\x74\x2e\x1e\x8a\x63\xe1\x59\xbb\x17\x06\x49\x14\x33\x1b\xd4\x3f\x8d\x9b\x25\x54\x18\x68\xc9\x48\x98\x4e\xd8\x53\xc2\xc0\x8b\xb9\x15\x90\x19\x3a\x06\x61\x14\x48\x07\xda\x26\xe1\xe7\xe2\x63\x68\x2f\x06\x30\x3b\x15\x46\x09\x71\x72\xdb\x27\xfb\xc6\x5b\x26\x02\x3c\x88\xd6\xaa\x09\x24\x89\xde\x7c\xb4\x89\x84\xb1\xeb\x71\x66\xa9\x5b\x1b\x5f\x7a\xcf\x1d\x7b\x76\xcc\x62\x0b\xd9\x9a\x9d\xeb\xc3\xdd\x65\x7d\x28\xf2\x01\x03\xa7\x0a\xe3\xd8\xa5\xf2\x44\x06\xbc\xdc\xcc\x9e\x67\x59\xd6\x9e\x0e\xc2\xa7\xcd\x04\xd9\xb1\x7f\xa6\x37\x42\x9c\x90\x27\x44\xd1\x79\xe0\xd5\xbc\xb9\x0c\x42\xad\x7b\xc4\x84\x43\xd7\x25\x14\x42\x62\x39\xa9\xb9\x65\x03\xb1\xea\x8a\x4d\xa1\xd0\xd4\xcc\x2d\xb9\x49\x38\x19\xbe\xd9\x29\xf4\x8c\x0a\x25\x0b\x11\x6c\xa1\xa1\x05\x30\x64\xa0\x68\xbb\xa5\x2c\xd1\x08\x28\xa5\x42\x19\x46\x66\x7e\x95\xaa\xea\x97\x01\x43\xc9\x25\xd2\xe0\xa6\xd5\xba\x4c\x9b\x93\x47\x62\x1c\x2a\x54\x40\x3c\xd6\xea\x05\x7e\xd6\xfd\x2c\x78\x08\x41\x14\x73\x4b\x08\x83\xb9\x83\xc6\x23\xe8\x8e\x02\x89\xf8\xf3\x4c\x2e\xe7\xab\xaf\xf3\x7c\x21\x28\x61\x69\x5a\x1a\x57\x64\x94\x9c\x0e\xb5\xf2\x1c\x65\x51\xf1\xa0\x3a\x51\xdf\xfe\x87\x8d\x9c\x98\x09\x13\x83\x35\x37\xfb\x52\xb4\x6c\x97\x2a\x72\x92\x00\x4b\x05\xdf\x88\x58\x17\x6a\xe4\x53\x24\x17\xa6\xbf\xb0\x22\x47\x06\x58\x5e\x7a\xfa\xf3\xa1\xbf\xda\x23\x47\x4b\x48\xba\x32\x05\x72\xfd\x43\x5b\xaf\x05\x45\xb0\x85\xe1\x54\x8d\xdc\xd0\x13\x06\x55\xde\x23\xaf\x3c\x77\x54\x35\xee\xe8\x45\x44\x6e\xe4\x2b\x23\x6b\xf5\x74\x96\xef\x17\xd1\xef\xd8\xb4\x63\x12\xdf\xa7\xcf\x99\x77\x37\xb0\x01\x54\x92\x19\x74\x6c\xab\xc8\x05\xe2\xd1\x6b\xab\x7d\x69\x7e\x67\x85\x8f\x47\x57\xf5\x98\x8f\x18\x8c\xcf\xf4\x04\x77\x6d\x55\x78\xb2\x87\x4e\x45\x5e\xa0\x91\x1f\xf9\xf5\x6e\x3b\x78\x4b\x5e\xec\x60\x13\xdb\xf6\x50\x7c\x5a\x98\xb5\xba\x09\x3d\x9d\x9c\x0b\x91\xef\x2b\x4b\x1c\xf2\x9a\xe6\x35\x95\x52\xe7\x37\xfb\xdd\x55\xe4\x27\x1c\xa1\x28\xf0\x33\xad\xea\x8a\xbc\xa8\x0e\x78\x30\xb9\x80\x23\x9f\x27\xc2\xd0\x48\x34\xb3\x89\x4d\x3b\x04\x11\xf3\x22\x24\x42\xd2\x45\x29\xc1\x10\xb4\xd9\x43\x11\x43\x47\xf0\x4c\x92\x5f\xf7\xd0\xec\xd2\xa4\x61\x70\x4c\x47\x38\x2c\x15\x31\xc9\xc0\x38\xff\xb3\xda\x7c\xb2\xeb\x74\x72\x3f\xa4\x1e\xdf\x89\x92\x89\x32\x7a\x41\xa9\xb4\x7a\x09\xc8\xdd\x7f\xe0\x65\xda\x6a\x67\xde\x6a\x69\x56\x51\xe8\x6b\xdc\xaf\xb8\x52\xc4\x73\x70\xc5\x9f\x74\x9d\xe5\x32\xe8\x9a\xe1\x3f\xf6\x7a\x01\x73\x8c\xfe\xd9\x32\x9f\x42\x3b\x44\xa1\xd0\x6e\xd2\xa6\x8e\x9b\xd8\xa2\x9a\x16\x20\x55\x51\x14\x6b\xf4\x5c\xe7\x45\x9a\x37\x8b\xd7\xbe\xe5\x88\x4b\xcf\x90\x28\x88\x73\x39\xce\xf5\x46\xb1\xa3\x1c\xd5\xf1\xc7\x18\x39\xa1\xe9\x9f\x88\x63\x89\x65\x0a\xeb\xeb\x7f\x59\x04\x31\x31\x56\x94\x78\x4a\x18\x19\xa7\xa5\x2c\x26\x13\x2a\x51\x12\x01\x66\xe0\x28\xea\xb2\x44\x0e\xd7\xba\x69\xf1\xf0\xca\x9c\x79\x04\x22\x97\xe9\xb1\x89\x12\xd6\x25\xc8\xb4\x82\x7b\xfa\xdf\xa3\x07\x4d\x54\x98\x78\xbd\x10\xac\x09\xab\x77\xc5\x00\xc9\x6a\x46\xf2\x44\xab\xe6\xba\x39\x42\xa5\x4c\xa6\x62\x78\xc3\x5c\x0b\xac\x62\x75\x3b\xa8\x76\x23\xfb\xc6\x85\x93\x20\x18\x86\x64\x47\xd3\x3a\xfd\xab\x67\x4f\x44\x14\x33\xf3\x45\x1f\xb8\x9c\xcc\x1e\x46\x02\x5c\x97\x3a\x9e\x3f\xa0\xc3\xaa\xaa\x48\xba\x3e\x4a\xb9\x9c\x1a\xa3\xe0\x3e\xf3\x9f\xf8\x10\x73\x7e\xb2\x03\x94\x1f\xa3\x5d\xc3\x14\xd7\x38\xd9\x17\x3b\x2e\x60\x52\xf2\x92\x56\x87\x34\xeb\xd3\xf6\xa9\xd8\x51\x0c\x6f\x2b\x87\xcf\xd5\xef\xf6\x8f\xae\xe7\x86\xb6\x19\x0e\x99\x02\x5a\xbe\x08\xdf\xfb\x77\x92\xfc\xaf\x1d\x16\x70\xbc\xdd\x0d\xb5\x03\x97\xbf\x12\x0a\x52\xb1\xe7\x50\xbd\x2b\x3f\x1f\x2d\xad\xab\x7d\x41\xb1\x17\x6a\xc4\xff\x19\x8a\x82\xbc\xc7\x2a\xaf\x62\x3f\x12\x78\xd0\xf4\x27\xef\x8a\xf5\x39\xcb\x56\xe7\x71\xfb\xe4\xe4\xf2\x8d\x7d\xe0\xb1\xba\xa6\x05\xf8\x8a\x39\x70\x78\x01\xa6\x88\xff\xc9\xca\x9b\xa7\x1f\xb0\xcc\x55\xfa\x91\xaa\x33\xcf\x46\xfc\x7c\xd3\x4b\x28\x0e\xfc\x04\x5b\xb0\x78\x55\x41\x59\x2f\xfe\xcf\x65\xe4\x08\xba\x86\xf5\xc0\xfe\x6b\x77\xd3\x38\x88\xbd\x98\xf0\xc9\xaa\x89\x6f\x7b\x24\x94\xed\x6a\xfb\x45\x1c\x79\x9e\xea\xeb\xfc\xc7\xf0\xae\x12\x66\x54\x94\x79\x59\xbf\xc0\x27\x89\x6f\xd9\x83\xc2\x31\x05\xe3\xb6\x6f\xfe\xb7\xd1\x43\x81\x8b\x0a\x98\x0f\xab\xd7\xcd\xee\x71\xff\xba\x5d\x6c\xf6\xf3\xd7\x9d\xbd\x40\x18\x28\x5c\x2c\x90\xab\x3d\x3f\xf7\x1d\xb7\x38\x4c\x22\x2c\xaa\x1e\xf9\x3b\x3c\x20\x3e\xa3\x87\xbe\x8a\x63\x1d\x3a\xfe\x98\xae\xce\x06\x1c\x3d\xe2\xea\x91\x23\x60\x63\xb8\x38\x89\x42\xe4\xf4\xfd\xfd\xcf\xcd\x72\x35\xd8\x66\xe3\x44\xc5\x98\x28\xbe\xec\x77\x69\xdd\x2d\x11\x1e\x25\xca\x78\x51\x0f\x45\x96\x15\x9f\x69\xfe\xd6\x51\x56\xdb\x41\x3c\xc2\x20\xf4\x73\xdc\x68\xd2\xfe\xb0\x60\x81\x87\x98\x67\x5e\xbf\xe6\xa9\x2c\xca\x76\xfd\xc7\xd2\x55\x3e\x75\x16\x83\x7c\xef\x4b\x6e\xed\x8a\xe5\x7c\xb6\x6e\xb6\x23\xaa\x12\xe7\xd7\xbe\xf0\x64\x71\x39\x96\x41\x88\x65\x32\x95\x56\x5c\x64\xf0\x5c\x7c\x74\xb5\x8d\x58\x72\x62\x5f\xaa\xa0\xfe\x9e\x96\xf5\x99\x67\xc6\xcd\xb1\x49\xb9\xe1\x97\x94\x22\x94\x1d\x39\xe6\x3a\x3b\xbf\xa5\x37\x4a\xc1\xb1\xf2\x19\xe2\x51\x9b\x1d\xfd\xa1\x28\x77\xc0\x8f\xf6\x47\x55\x10\x63\x96\xf3\xc5\x12\x3e\x34\x7f\x92\x18\x32\x18\x8b\x55\xd6\x90\xf5\x0e\x41\x57\xe6\x9b\xf4\xc2\x62\x15\x87\x96\x50\x33\x83\x0f\xb8\x62\xbe\xb4\xc3\x12\x0f\x7b\xc8\x4c\x5d\xf2\x3e\x3d\x65\xc5\x91\x2f\xf2\xfa\x9a\x30\xc7\x9c\x01\x4e\x82\x20\xc8\x4f\x48\x77\xc5\xc0\x70\xd9\x01\x2c\xf2\x9a\x01\xcb\x9f\x69\x9e\x9e\x8f\x0f\xed\xac\x06\x66\xa9\x2b\xeb\xf9\x6c\x85\x95\xb6\xf6\x50\x18\x53\x85\x0e\xf5\xf1\xb6\xbb\xd9\xb7\xc5\xbe\x59\x1b\xf6\xb8\x0e\x5d\x84\x6a\xad\xa1\xd4\x20\x7b\xbd\x7d\x2a\xd6\x49\x12\xc9\x5e\x17\xdc\x3f\xeb\xcb\xf2\xa4\xab\x91\x4c\xbc\x4a\x1c\x4f\x61\xb1\xdc\x18\xc2\x6d\x9a\xbf\x11\x3f\xe1\x70\xa3\x4a\x1c\xa5\xb1\xda\x59\xf3\x12\x6b\x51\x03\x2c\x69\xe2\x86\x0c\x53\x7b\x18\x91\x5a\xfa\xe1\x9e\x6e\xb8\x4a\x3c\x97\xf4\x44\x0e\xc4\xf5\xbc\x17\xa9\x6a\x5b\x83\x54\xe2\xfb\x01\x76\xb0\x57\xf2\x00\xea\x9c\xc1\x23\xcf\xdf\x90\x87\xc7\x1e\xd7\x84\xbe\x79\x9a\xbd\xbe\xcc\x1f\xf7\xf7\xad\x52\xa0\x4a\x58\x40\x18\xb1\xd5\xeb\x6e\xf9\xf2\x6d\xb3\xd8\x2e\x36\xdf\xbb\x83\xc2\x71\x82\x36\x17\xda\xcf\x9e\xd9\x01\x9a\x23\xfc\x65\xbd\x59\x20\x3b\xe6\x7c\xb6\xb6\xe7\x06\x9e\xdb\x93\xf7\x9c\x91\xab\x32\x6e\x71\x6d\x86\x85\x26\x3e\x2f\x26\x2a\x23\x63\x6b\xf9\x5f\xfe\x6b\x7f\x23\x22\xaa\x16\x05\x32\xe3\x25\xb4\x7b\xc3\xa2\x35\xae\x49\xa0\x12\x27\x31\xe0\x31\x22\xa0\xc3\xde\xd7\xee\x15\x07\xda\xe6\x86\x72\xb5\x81\x63\x13\xe8\xef\x8a\x9e\xee\x81\x4a\x42\x9f\xe1\x88\x03\xcf\x55\x66\x5c\xec\x0d\x2d\x80\xd1\x33\x87\x31\x60\xf2\xb8\x3c\xe7\xb0\x2b\x7e\x40\xda\x9f\xb5\x49\x28\x7c\x16\x63\x80\x77\x67\x20\xb5\xf6\x48\x24\x01\x23\x3a\x93\xfd\x33\xf3\x64\x74\xf1\x38\x72\x1c\x43\x80\x68\x22\x9e\x65\xf5\x52\xd4\x0f\x65\xf1\x17\xe4\x0f\x45\xb9\x81\xfa\xdc\xc9\x7c\xf4\x6a\xd0\x49\xe2\x6a\x69\x50\xcb\xdf\xca\xe2\x7c\xda\xa4\x6f\x87\xb1\xea\x68\x7f\xb8\xcf\xa8\x13\x17\x81\x38\xe3\x96\x9b\xe1\x3c\x49\x7c\x8d\x04\x9a\xf3\xd5\x66\x51\x1f\x06\xf9\x4b\x3b\x22\x56\xd8\xff\x83\x62\x92\x3d\x6f\x29\xe1\x8e\x1b\xc4\x5d\x7c\x83\x34\x25\x3c\xbf\xa1\x98\xaf\x12\x6e\xb8\x82\xb1\xbd\xb6\xaa\x7b\xbf\xc0\x03\x66\xe1\x79\x18\xbd\x56\xdd\x81\x10\x53\x8c\x5f\x0a\xcd\x04\x66\x4f\x49\x04\x4b\x08\xf1\x50\xf0\xac\x25\x9c\xe9\xb5\xb6\xab\x44\x84\x2a\x0e\x3b\xf5\xaf\xc1\x24\x11\x21\x21\xc3\xb1\xc4\x8b\xdb\x4e\xd6\xbb\x45\xe9\xfb\xd8\x78\xb4\x57\x56\xc4\xbd\xe7\x67\x27\x32\x20\x6f\x4d\xb5\xa1\x72\x5f\x9f\x72\x38\x0b\x24\x67\xd8\xfa\x3b\x5b\x12\xeb\xfc\x17\x5e\x60\xa2\x42\x81\xdc\xa3\x33\xa5\x5e\xe0\xd3\x10\xf1\xac\xb9\x7c\xb7\x0c\x81\xe3\xd8\x3e\x51\xa1\xc2\x5d\xe4\x08\x47\xb8\xc6\x23\x26\x10\x0a\xb4\x0a\x8d\x37\x71\x77\xbe\x50\xae\xa5\x9f\x9b\x48\x80\x2b\x6c\x6c\xef\xf2\x84\x56\xcc\x79\x04\x80\x1f\x3e\x15\x08\x2d\x44\xdb\x76\xb6\x05\x5b\x9c\x79\x29\x76\x87\xb2\xe8\xda\x40\x06\xd8\xea\x04\x24\xc3\x88\xe3\xc8\x7f\xa6\xc7\xf3\x71\xb0\xac\x41\x33\x9f\x72\x05\x75\x0e\x55\xb5\xd2\xa3\x47\xd1\x71\x82\x28\x7f\xdb\xad\xbd\xc8\xe9\x26\x75\xaf\x64\x94\x68\x01\x36\xc5\x7d\x0f\x1a\x79\x6e\xff\xf9\x64\x0e\x72\xc7\x89\xad\xf3\x6e\x5b\xd2\x5f\x73\x42\xec\x4d\xf4\x39\x29\xee\x78\x24\x7b\x28\x46\x7f\x77\x03\x87\xf5\xfc\xf1\x6d\xfa\x97\x9d\x36\xdc\xd5\x3e\xee\xf3\x0f\x19\x9c\x6d\xbf\xbe\xe2\x1e\xe7\x58\xc8\xaa\xa1\xaa\x5f\xf3\xea\x92\x4b\x50\xbd\x15\xc7\x3d\xa0\x40\xec\x3e\xcd\x8b\x8a\x9f\xcb\x07\x5e\x1e\xa1\x7c\x81\x4f\x3b\xc0\xf7\x1d\x4d\x1c\x6b\xfd\x66\xfb\x8e\x27\x44\x71\x3f\xf1\x55\xab\xdc\xa5\x2c\x03\xb5\x3d\xca\xa4\x46\xff\x6c\x7f\xd2\xe9\xb8\xbe\xc4\x99\x56\x71\xeb\xcd\x62\x43\x89\x39\x10\x48\x43\x1a\x66\xa7\x86\x65\x50\x98\xc8\xc0\xb7\xdf\x89\x07\xc0\x49\x43\xec\xfd\xb3\x4b\xc1\xf2\x30\x64\xc4\x8a\x8f\xe6\x06\x6f\xdf\xe6\x37\x2b\x2c\x0f\xfe\xa2\x3f\x86\x87\x92\x25\x11\xf6\x71\x95\x65\xf1\x09\xc6\x78\xde\xf7\xde\x62\xe4\x28\x13\xce\x56\x75\x59\x5c\x56\x99\x22\x99\xfc\xe9\x5a\xad\x3d\x29\x0a\xfc\x5e\x71\x4d\x9d\xb3\x9a\x32\xc4\x1d\x2b\x67\x6c\x87\x4a\x1f\xfb\x2c\x94\x11\x1c\xf8\x55\xaf\xe5\xe8\x01\x62\xd7\x41\x5b\xf4\x9f\xaa\xc8\x37\xc0\xd5\x54\x9c\xcb\x63\xa1\x3b\xc8\x12\xae\x83\x1f\x90\xf6\xf0\x32\x3c\xe1\xd4\x26\x84\x5c\x09\x70\x9a\x10\x4d\x53\x3c\x11\x44\x12\xd9\x7a\xe3\xcf\x30\xa8\x82\x4c\x53\xda\x28\xce\x63\x47\xa2\xe0\x47\x59\xe4\x7f\xd8\x1f\xe4\x92\x0b\xe2\xb0\xb9\xfc\xd1\x84\xff\xdd\xdf\x49\xec\xb7\x9d\x1c\x98\xa2\x7a\x18\x91\x4d\x2a\xce\xc1\x85\x68\x58\x61\xff\x45\xb9\xcf\x9c\x28\x02\x8d\xa4\xd1\x3a\xad\x0e\x4f\xd6\x63\x19\xde\xb0\x04\x9f\x12\x3c\x07\xa8\xaa\x79\x76\x16\x4f\xe9\x07\xd0\xff\xe8\x1c\x48\xae\x7c\x85\x29\xdc\x3d\x35\x34\x7e\xc1\xf6\xa5\xb8\x62\x44\xb9\x30\xce\xe7\x5c\x97\xc3\xb8\x8a\x49\x5b\xe8\xc0\xab\xc3\xac\x7c\x43\x49\xad\xe1\x64\x33\xe5\x25\xf3\xcf\x55\x61\x94\x83\x20\xac\xee\x71\xdf\xbc\x96\xc7\xc6\x8f\x6c\x6f\x5a\x7b\x1a\x69\x5f\xb0\x1d\xac\x38\x37\xdb\xff\xf0\x64\x1d\x91\x90\x15\x99\x04\xf4\x73\xa7\xbf\xaa\x96\x0a\x59\x07\xb3\xe2\x0d\xd5\xd7\x52\x39\x59\x03\x10\x8e\xe3\x72\xe2\xbd\xce\x2d\x94\x5c\x38\x8e\x16\x89\xed\xc6\xf8\xcf\x44\x1a\x6c\x7c\x0d\x93\x2d\x1f\x76\xae\xff\xe9\x0e\x2d\x8e\x70\x9d\x18\x23\x88\xe7\xd5\xea\xfb\x35\x89\x42\x7f\x41\x08\x37\x20\x72\x06\xcc\xbf\x7f\x4e\x72\x11\x9b\x91\x5e\xe4\x46\xa6\x2a\xfb\x54\xc8\xf7\x74\xac\xd6\x39\xbc\x05\xdf\x8f\x90\x6f\xe8\x8d\x1f\x61\xf5\xd1\xee\x42\x82\x29\x19\x1a\xa9\xc8\xbb\x32\x95\xef\x3d\xe3\x2e\x98\xf6\xb1\x07\xad\x6d\xfa\x26\x05\xc9\x99\x5d\x9c\x22\x88\x00\xf1\x91\x06\xe2\x3e\x85\xaa\xb1\x23\x15\xc7\x50\x71\xf5\x91\x8e\x30\xe2\x22\x0c\x3d\xca\x58\x9d\xab\xc3\xfd\xc8\x90\x8b\x50\x48\x14\x20\xc9\xd2\x26\xa4\xed\xab\x2e\x2b\x11\xbb\x1e\x1a\xde\x1c\x3e\xbf\x95\xfc\x0b\xc1\x90\x5b\xff\x76\x1e\xa5\x48\xa4\x8b\x5e\xc1\x35\x86\xea\xef\x59\x3b\x91\x68\x2f\x36\xc8\x02\xe3\xc6\x4c\x7f\x07\xce\x01\x13\x25\xc7\x4e\x75\xd7\x1c\x11\xb1\x87\xc9\xe9\x03\xcf\xb0\x07\x6d\x78\x9e\xd0\x8c\x32\x28\x95\x2c\x8b\xcf\xc7\xb4\x1a\x90\xce\x4d\xdf\x93\xd0\x12\x23\xc4\xaa\x31\xed\x7d\x39\x56\x25\xa4\x91\x14\x31\x84\xbe\x58\xff\x6c\x15\xe4\xda\x31\x2e\xee\x2f\xc8\xf1\x43\xde\xc7\xcd\x0e\x95\xd1\xba\x00\x15\x79\x5e\x4b\x38\x6c\xba\x1b\xda\x8f\xaa\x99\x83\x2b\x94\x3a\x80\x6e\x40\x9d\x85\x8e\x14\x86\x67\xf7\x0b\x04\xe7\xbe\xcc\x9e\x17\xfb\xcd\xea\xc9\x46\x88\xd2\x09\x42\x8c\x3c\xef\x78\xfe\x9e\x73\xd5\x0f\x57\xa4\x13\x2a\xcc\xbf\x6e\xbf\xed\xac\xc7\x7f\xbd\x6d\x0d\x6e\x59\x3a\x82\x23\xaf\x80\xcd\xa1\xf0\x34\xaf\x21\xef\xc4\xde\x94\x74\x74\x82\xd0\xd6\xbc\x50\xb0\x97\xd7\xfb\x90\xf4\x62\x12\xbc\x7c\xe6\x88\x44\x49\x73\x35\xcb\xb2\xb4\x7f\x09\x4f\xbb\x38\x9d\x8f\xe7\xac\x4e\x3f\xa0\xaa\xef\xce\x57\xfd\x94\x5f\x6d\x59\xd2\x77\x69\x3d\x6c\x8a\xba\xf0\x3a\xa5\x0e\x25\x7d\x3f\x41\x56\xb3\x53\xc6\x25\x60\xa3\xd9\xae\xb0\xad\x40\xa3\xdb\x64\xcc\xb5\x25\xbe\xc6\xfb\x99\xd8\x51\x25\x8b\x99\x6f\x51\x96\x56\x37\x40\xd7\x50\xde\x92\xea\x55\x32\x54\xd4\x7a\x67\xf3\x00\xa3\x82\xb3\x8c\x18\x75\xab\x9c\x4f\x6a\x86\xa2\xad\x48\x1e\x0c\xbd\x5c\x9f\x8c\x18\x20\xcb\xc2\xde\x0a\x7d\x50\x4f\x67\x55\xf5\x33\x50\xc3\xab\xc6\x81\x83\x85\xee\xd9\x13\x66\x53\xed\xcb\x88\x21\x08\xa8\xb0\xbf\x9c\xaf\x7a\xd6\x4e\x26\x81\xf0\xbd\x1e\x5a\x68\xa9\x00\xdb\x3a\xbf\x80\x9c\xc9\x24\xf4\x95\xc1\x3d\xbf\x2e\xf3\x9a\x40\x48\xc3\xaf\x92\x24\x2e\x26\x51\xf0\x8e\xf7\xee\xfe\x2b\xb1\x1b\x25\xb9\x88\x12\xa3\xe4\x8c\xe2\x80\xa9\x4c\xf9\xed\xb5\xfc\x85\xd5\x92\x5c\xcb\x20\xe8\xf4\x12\xaf\x9c\x11\xd9\x04\x4c\xcd\x8b\x38\x14\x9f\xcf\x67\xac\x74\xff\xd1\x02\xdd\xe0\xa5\xf8\x1c\x1a\x19\x89\x3e\x70\xf3\x3a\x29\x7a\xb7\x0e\x5f\xb5\x3b\xf0\xcf\xde\xda\xef\xdd\x81\xf4\x99\x6f\x6a\x19\xfb\x23\x4e\xfb\xd1\x25\x65\xec\x58\x9d\xf3\x0d\x75\x1a\xd8\xc2\xfc\xc4\xf3\x48\x45\x20\x4e\x7c\x8f\xa6\xfd\x63\x72\xe3\x95\xca\xf1\x10\xb5\xcc\x95\x32\x5a\x40\x57\x79\x98\xee\xb2\xca\x73\x91\x71\x01\x01\x09\x1b\x2e\x81\xe0\xdd\x57\x7b\x7b\xff\x14\xdf\x89\xa8\x77\xf5\x0d\x93\x61\x4f\xab\x5d\xc7\xe8\xf8\xb5\xd9\x95\x8d\x2d\xe9\xc4\x3d\x30\x87\xd7\x32\x56\x4f\xef\xe5\x12\x58\x88\xce\xa5\x01\xfd\x10\xcb\xd9\x98\x23\x7e\xf8\x06\x40\x79\x98\x9c\xf8\x0e\xf9\xed\x92\xc3\x64\x25\xa0\xf7\xb3\x40\x54\x1b\x6f\x1f\x03\xeb\x09\x5a\xe0\xcb\x7d\xd8\x6c\x77\xfb\xf9\xe6\xc7\x3d\x26\xd8\x50\x7b\xde\x0e\xd1\x82\x44\x43\x66\x2f\xcf\xcb\x5c\x93\xe6\xcf\x80\x4d\x55\x29\x27\x8e\xb1\xd8\x9f\xa5\x75\x9d\xc1\x73\x91\xf7\xfa\xa3\x95\xc7\x09\x71\xc6\x95\x95\x14\x98\x7a\x2f\xca\x53\x1e\xc6\x10\xaa\xe4\x9f\x23\x5e\xf9\xc1\xdb\x50\xbe\xc3\x48\x81\xed\x8c\x6d\xaf\xfa\x9c\xb5\x90\x1f\x3b\x22\x6c\x51\xf2\xf8\x45\xef\x2c\xb2\x7b\x96\x2b\x6a\xcc\x9d\x7c\x47\xca\xe7\x82\xa4\x18\xff\x53\x64\x79\x5a\xfe\x00\x51\xa5\x6d\x0c\xa6\x7c\x4d\x8c\x4a\x15\xd4\x7b\x5d\x94\xfb\xea\x2a\x51\xa9\x98\x4b\xfb\xd8\x9a\x63\x9c\x45\xac\x63\x63\x06\x2f\xa5\x02\x27\xc1\xe4\x99\x49\xe7\xda\xdb\x1f\x3a\x4b\x2a\x10\x80\x65\xfa\x13\x94\xba\x28\x8f\xbd\xed\xe3\xdf\xf1\xa4\x66\xef\xa0\x1e\x3b\xbd\xa9\xa8\x40\xc7\x58\xed\xfc\x84\x74\x0d\xe5\xf6\xcd\xa6\x26\x55\xe8\x09\xcc\x2e\x28\xd0\x20\x9b\x0d\x6b\xac\x9a\x69\xc6\x45\x81\x87\x3d\xec\xab\xf5\xeb\xd3\xe2\xc5\x8a\x14\x29\x15\x25\x8e\xcd\x7b\x3d\xa4\xd5\xa1\x79\x03\xc7\xdb\x54\x47\xc3\xf7\x11\x49\x0f\x41\x87\xa8\x80\x00\x55\xc5\x9f\xd2\xff\x3b\xa7\xaa\x17\xe8\xa8\xd8\xe7\x8a\xf8\x7a\x4d\x8e\x17\x94\xeb\xb5\x07\xb9\x4f\xc9\x0f\xb7\xfd\x8b\x76\x70\x57\xd8\x1e\x79\x59\xaf\xfa\x33\x5e\x25\x9a\x90\x05\x06\xd6\x96\x43\x39\x0e\x76\xaf\x58\x39\xaf\x89\x74\x95\xe2\x92\x88\x19\xb6\x36\xe1\x32\xd9\x49\xa3\x38\x30\x2b\xbc\x82\x20\xb5\xba\x1e\xb1\x1c\x29\x25\x38\x43\x3e\x41\x94\xf6\xdd\x14\xd9\x58\x4d\xcf\x0e\x03\x8f\x99\xa2\xc8\xfe\x23\x95\xb0\x3f\x19\x5a\x34\x13\xc3\x2b\xa9\xa9\xa3\xee\x99\xbf\x83\xa1\xae\xfa\xd2\x78\x29\xe5\x50\xf8\xbb\xf8\xc9\x8f\xa7\x0c\x26\xea\x21\x4a\xb9\x80\xfd\x06\x3f\x96\xbb\xc7\xfb\xcd\xec\xc7\xec\x69\xbf\x78\xb9\xef\x73\x69\x28\xe5\x7b\x48\x44\xbc\xaf\xcb\xcb\xae\x4c\xdf\xde\xc0\x76\xde\x4d\x25\xf5\x9a\x45\x86\xcc\x8f\x55\x0d\x27\x5b\x43\x57\xa0\xa5\x13\xf6\x90\xa0\x13\x72\x41\x83\x77\xa1\xc3\x50\x6b\x5b\xc9\x78\x4e\xdf\xca\x2e\x55\x02\x6e\x1c\xe3\x36\xb5\x7a\xfc\xf6\x3d\x6d\xb6\x7c\x9e\x77\xc7\x34\xa5\xe8\xfb\x76\xd4\x56\xa6\xc0\xf3\x43\xc4\x54\x61\xad\x0e\x33\x85\xc8\x03\x91\xf5\x14\x46\x14\x78\x91\x26\x1d\xed\xa2\xfc\x44\xfa\xf1\xc7\xc2\xaa\xf0\x0c\x9e\x13\x3c\xa5\x34\xbe\x16\x33\x92\xa0\x53\x83\x2f\x0f\x0c\x22\x24\xb1\xc1\x34\xed\x4c\xa9\xae\xb7\x0a\x02\xc9\xb0\x3f\x66\x5f\xd5\xc0\xb3\x39\x2f\x15\x32\x2a\x8e\xfc\x3b\x08\x1d\x8e\xb5\x27\x45\x1e\xd6\xf9\x1a\x76\x02\x61\xe8\xa3\x31\x34\x5d\x5a\x2f\x69\xfe\x9f\x6b\x14\xcb\x97\xeb\x13\x42\x1e\x70\xab\x8a\xdc\xd3\x1f\x50\x10\x01\xc9\x83\x6e\x2f\x64\xe7\xc6\xad\xae\x10\x69\x1e\x75\x5d\x9e\x6d\x63\xe8\xd8\x4f\x85\x98\x79\xdc\x14\xc2\xfe\xa7\x10\xa6\xa7\x6e\x72\xd6\x42\x1c\x2a\xe5\xda\x97\xb6\xf8\x79\x4a\x47\x62\xde\xbd\x91\x3c\xf1\xcd\xda\x6b\x02\x87\xb2\xc8\x46\xc8\x64\x88\x25\x69\x26\x36\x11\x9a\xf5\x0f\xf1\x41\xac\xf0\xe6\x75\x10\xf4\x85\x71\x85\x58\x2a\x84\x9c\xa7\xb2\xe8\x88\x58\x15\x24\x11\x43\xd7\x6d\x3b\xa7\x8c\x6e\x4f\x9a\x5b\x81\x70\x7d\xa4\xd9\x56\x85\x81\x28\x7d\x9d\x86\x00\xc1\x02\xe4\x45\x82\xe6\xc9\x61\xa9\x5f\xa0\xd9\x04\x79\xdb\x5d\x03\x22\x21\x0a\x26\x6a\xef\xea\xeb\x67\xf4\xea\x1d\x20\x03\x29\x01\x9d\x9e\xba\x86\xf2\x82\x10\x80\x8e\xd8\xbe\x6f\xfa\xcd\xc3\xb2\xd1\x67\x50\x8a\x1a\x10\x2b\xa8\x9f\x2f\xcb\xf9\x6a\x92\x86\x50\x01\x78\x2e\xae\xd4\x26\xf8\xdc\x17\x39\xe9\xf4\xce\x10\x0e\xf1\xc0\xb3\xaa\xbd\x1f\x1d\x11\x07\x31\x4e\xaf\xdd\x67\x71\x4f\xa1\x99\x39\xac\x5d\xcf\x75\x4d\xea\xc2\xe0\xb6\x3a\x66\x29\xa5\x5d\x88\xa4\x6e\xa5\xf6\x30\xb0\xfd\x8a\xe1\x46\x7b\x11\x29\xac\x36\x01\xfc\x6a\xf5\x44\xad\x25\x9e\x3b\x40\x47\x6a\x8f\x3b\x6d\xc5\xfb\x9e\x17\x0f\x45\x39\x3d\x21\xb5\xef\x27\x68\xe2\xd1\x6e\xac\x3f\xf3\x1e\x5f\x81\xf6\x63\x86\xad\xe0\x27\x80\x77\xcb\x09\x63\x0f\x25\xae\x34\x53\x7e\xcd\xd3\x11\xc4\x59\xfb\x92\x71\xe2\x49\xec\x4a\x3e\x9a\x31\x87\x58\x47\xe7\xb3\xed\xe3\xcf\xf6\xaf\x09\x09\xac\xdf\xf3\xd3\xe9\xb1\x8b\xfb\x35\x13\x02\x0b\x4e\xf7\xbc\xde\x15\xf7\x75\x29\x5f\xce\x47\x23\xaa\x6c\x47\x40\x84\x08\xa3\x1d\xaf\xde\x37\x26\x4c\xfa\x3a\x74\xd6\x81\x16\xe8\x5f\xb7\xd4\x0b\x7b\x7c\x83\xb3\xfb\x7b\x5b\xef\xd6\xa1\x2f\x51\x54\x6a\xb3\x5d\x3f\xed\xf6\x0f\xed\x9f\x13\x0f\x6b\xcb\xeb\xb2\x38\x41\x59\xa5\xed\xfd\x87\x5a\x04\x61\x57\xc6\x6f\xf9\x4f\x46\xeb\xc1\x8c\x8e\x1c\x27\x8e\xac\x64\xbe\xd1\xa3\x1e\x4c\xd7\x76\x9c\xc2\xb7\xb2\x3d\x15\x65\xdd\xe7\xa8\x53\x3a\xf2\x3c\x47\x5b\x57\x25\xe7\xd9\x0e\x1a\x57\xc5\x1e\x0c\x38\xb2\x81\x50\x35\x7f\x33\xdb\x2d\xf6\x0f\xcb\xcd\x76\xd7\x1e\x8f\x5c\xcb\xd1\xfc\x52\x28\x78\x04\x2c\x5f\x0e\xec\x80\x8e\x12\xc2\x1e\xce\x14\x3f\xfd\xfa\x95\x46\x3c\x46\x2a\x77\x9e\x96\xaa\x2c\x4e\xe3\x28\xc8\x26\x65\x75\xa4\x3d\xf2\x07\xcf\x25\x1c\x79\x6a\xcd\x8b\x8e\x3d\x81\xc0\xb8\xf7\x34\xcb\x1e\xca\x2e\x9f\xae\xe3\x90\x93\x5b\xd4\x78\x73\xc3\xdf\x8c\x63\x85\xc0\xed\xaa\x2e\x4e\x1d\xb5\xbf\xd2\x09\x63\x08\xdf\x33\xb0\xb9\x99\xd6\x69\x96\x8e\x45\x3a\x94\x4e\x12\xa1\x88\x19\xb7\x5e\x43\xbd\x83\xce\x7d\xb0\x03\x74\x88\x92\x4a\x2a\xad\x4c\x66\x62\x74\x03\x9c\xfb\x18\x54\x10\x89\x72\xe3\xd2\xd9\x53\x05\x8b\x49\xdf\xfc\xee\x7e\xf1\xb4\x9f\x3d\x3d\xad\xe6\xb3\x5e\xa3\xb6\x16\x5c\xd8\x4a\x57\xab\x2f\x3a\xbc\xb6\x74\x02\xcc\x48\x11\xa1\xcb\x5d\xe3\x9c\xdd\x48\x3c\x69\x15\xc4\x88\x30\x7b\xe0\x69\x86\x35\x61\x63\x9c\x7f\x95\x5e\xbc\x71\xb5\xd0\x0b\x0c\x68\xb5\x89\x8e\x5e\xf8\x11\x48\x59\x61\x2a\x29\xad\x95\x08\x08\xed\x89\x39\x92\x29\x95\x30\xb7\xbd\xb0\xd0\x66\x89\x70\xb5\x3f\xbb\xe1\x9e\x97\x25\xb7\x16\x5f\x43\xa4\x98\xa1\x95\x32\xb0\x91\x81\x21\xd3\x71\x80\xd6\x71\x56\x96\x5f\x95\xea\x87\x8f\xa2\x13\x2d\x79\x0b\x5c\x6a\x3e\xd2\x9a\xa7\xad\xed\xd2\xca\xc3\xea\xe1\x76\xf9\x2f\xe3\x07\x82\xe3\x30\xaa\x2a\xd3\x56\xff\x9c\xe6\x35\x94\x53\x3c\x48\xe0\x38\x91\x4f\x5a\x3e\xfc\xa4\xf8\xe9\x25\x3d\x8b\xd4\x5e\xc4\x15\x12\x57\xb7\xe4\xe5\x8e\xff\x4c\x5b\x7f\x62\x10\x1a\x81\xe3\x09\x49\x12\xdb\xa8\x21\x88\x2c\x2e\x7f\xbf\x5c\x05\x8e\xef\x08\x4c\xf3\xec\xad\x0e\xe0\x60\x02\x81\xe3\xc7\x0c\x41\x25\xa6\xad\x09\x4a\xd3\x5c\x72\x13\x38\x32\x3a\x5d\x86\xe8\x11\xe3\x9e\xf7\x66\x9b\x92\xc1\x61\x0e\x55\x7d\x4a\xca\x9e\xdb\xbf\xba\xa1\xcb\x2c\x34\x45\x35\x9b\xc7\x32\xbf\xbb\xb4\x3a\x04\xe0\xb0\x58\x39\xcc\x36\xe3\xbf\xf1\xdc\xe8\xb5\xf1\x6c\x0e\xa5\xe5\x20\xbd\xbb\x2c\xef\xfb\x5f\x1d\x9a\x25\x80\x34\x14\xa9\x0d\xd9\xed\xe5\x42\x3f\x44\x94\x0e\xbe\xbb\x23\xa8\x94\xab\xa2\x9c\x21\xc9\xfa\x9a\xbf\xf1\xc6\xe4\x16\x5d\xaa\xae\x19\x1f\x63\x7e\x95\x74\x1a\xb7\x07\x6e\xc5\xe9\xc0\x09\x39\x60\xad\xe3\x7b\x5a\x56\x97\x1e\xcf\x2a\x38\x21\x30\xcc\x5d\xa6\xf9\x01\xca\xb4\x46\x78\x39\x02\x2a\xec\x80\x38\xf2\xb0\x91\x70\x8f\xc9\xa2\x63\xf1\xc1\xb3\x6b\x2d\x75\x70\x62\x15\x61\xd0\xb3\x7b\xf8\x45\xf3\x39\x38\x49\x02\xe8\x6a\x42\xae\x3a\xe1\x28\x70\xb8\x62\xe8\x2e\xb6\xb5\x3c\x0a\x4e\xbe\xf3\x32\x6d\x1c\x8c\x76\x9c\xe4\xa4\xf3\x82\x52\x40\x6d\x03\xd3\xe8\x76\x14\x23\x46\xf0\x53\x59\xa8\xb3\x84\xc6\x79\x2a\x88\x79\x71\xd2\x37\x00\x47\x71\x0f\xe3\xd0\xf9\xec\x65\xbe\x78\x7a\x5a\xdc\xef\x1f\x16\x8b\xfd\xc3\xd3\xec\x9b\xfd\x5d\x48\x14\x36\xb3\x18\x0f\xb9\x28\xdf\x6f\x24\x3e\xc0\x01\xa9\x30\xa3\x59\x5d\xf2\xfa\xb0\x34\xac\x1f\xca\x26\xbd\x87\xf0\x41\xf6\x8f\x01\x4a\x81\x8d\x2e\xa5\x1d\xde\x7a\x40\xcd\x6b\xdf\xd6\x70\x0a\x46\x0f\xab\x3d\xf2\xaa\x08\x5a\x45\x66\x74\x52\x85\x03\x1c\x1d\x92\x42\xf2\x22\x57\xae\xe9\x2d\x02\xd7\x61\x84\x7d\x9e\x9d\xeb\xa2\x4c\xff\x1a\xb4\x03\x80\xeb\xc4\xa1\x67\x54\xc1\xea\x16\xb9\x02\xae\x23\x7d\xdf\x74\xbc\x5a\xac\xf0\xa6\xab\x34\x99\x41\x6e\x28\x7d\xd1\xe1\x16\x51\x5d\x6e\x34\x42\x52\xee\xe4\x98\xe6\x8b\xfa\x30\xef\x09\x33\xd9\x1f\xf2\x22\x57\xb2\xde\x1b\xe8\x85\xd2\xe0\x32\xc7\x47\x1a\x0f\xa4\x4d\x59\x34\x8e\x6d\x2e\x61\x57\x58\xbe\x0f\x78\x7d\x59\xfe\x61\x2f\xc4\x20\xc0\x6c\xf7\x62\xf7\x18\xf8\x4e\x91\x33\xaf\x7d\x03\x01\x23\x6a\x48\xa4\x30\xe3\x59\xdc\xbe\x3d\x73\x3c\x74\x38\x56\x5d\x90\xa5\xac\xfe\x5b\xda\x5d\xe0\x86\x9e\x83\x98\x62\x64\x98\x1e\x05\x5c\xe0\x86\x3e\x4d\x27\x3c\xda\x12\xf7\x0f\x3e\xac\x1b\x06\x41\x18\xf6\x54\x50\x6d\x70\x64\x8d\xec\xf9\xaa\x53\x16\xdc\x30\x89\x83\xd0\x1a\xa1\xf4\x2d\xcd\x27\x4d\xbb\x1b\x2a\x49\x34\x56\xc5\xb1\x30\x7a\x1c\xf6\xce\xa2\x88\x34\x34\xb8\x52\xff\x53\xa4\xf9\x8c\xbc\x9d\x7f\x5e\x01\xd7\xc0\x8d\x78\x8c\xbd\x7a\xaa\x98\x9f\xab\xba\x38\x9a\xa1\xe3\x55\x71\x55\xb7\x06\x37\x12\x10\x28\xeb\x55\x60\x4d\x1c\xda\x09\x17\x27\x8e\x1f\xb4\xa2\x88\x03\x24\xf7\xa4\x73\x00\x6e\xcc\x29\xa5\xa5\xd3\x3c\xad\x0e\xaf\x27\xc2\x49\x5f\xe7\x23\xc0\x4d\x1c\x87\x38\x45\xd2\x23\x54\x27\xde\x4e\xb2\x44\x25\x5e\xf3\xd6\xee\xca\xb4\x4e\xab\x43\x57\xc4\x01\x97\x0b\xea\xe0\x3a\xf1\x4b\xa1\x75\xbf\x62\x07\xae\x88\x04\xa6\x11\xd1\xf1\xdc\xbf\xbe\x3c\xad\xe6\xbf\xdb\x63\x32\x0a\x43\x93\x67\xeb\x6b\xdd\x80\x0b\xa0\x11\xfb\x7b\x28\x6a\xe4\xcb\x6d\xff\xae\x03\x44\x3e\x8c\x92\x8d\xd3\x36\xc6\xd5\x9c\x63\x5a\xde\x38\x80\x73\x64\xa3\x68\x13\x63\x5e\xf7\xca\xa3\xff\x1d\x86\xc2\xff\xf6\xec\x47\xd0\x9a\x5e\x5b\x25\xa6\x36\x57\xcf\x51\x1e\x76\xfd\xce\x7e\xa6\x30\x90\x63\x03\xcf\xd1\x89\xcd\x02\x6c\xb3\xa2\xbe\x12\xd3\x06\xcf\xf5\xa5\xa7\x6c\x11\x9e\xb0\x03\xc8\x2d\xda\x6a\xe6\x0c\xcd\x5e\xab\xa2\x03\x9e\xe7\x78\xc8\xdf\x7d\x28\xce\x15\x0c\x13\xc6\xe0\x79\x9a\x14\x40\x15\xef\xf7\x49\x34\x7f\x0f\x91\xfc\xf1\xe9\xf5\xcf\xd5\x78\xa9\x79\xbe\xf2\xfa\xb4\x48\xeb\x32\xbd\x41\x42\x06\x1e\x73\xe3\x88\x8a\x54\xbb\x9f\xe4\x11\xf6\x03\x06\xf0\x98\xef\x10\x2b\x3e\xe4\xea\x3b\x31\xea\x9a\x23\x81\x47\xf4\xcb\x07\xde\xb1\x55\x0e\xaf\x1d\x28\x47\x1a\xd5\x70\xec\x0e\x79\x4c\xdf\x0e\x3d\xf0\x19\x78\x61\xe4\x5a\x86\x1c\xec\x15\xc4\x8c\xf8\x04\xc3\x44\x33\xd2\x47\xb7\xea\xf7\xd4\xb6\x78\x82\x17\xc6\xd2\x6f\xf9\x9f\x89\x99\x6e\x04\x80\x07\x2f\x0a\x42\x74\xe8\x50\xfb\x06\x3d\x25\x14\x5d\x1e\xde\x67\x24\x3c\x42\x49\x75\xfd\xb0\x3d\xaa\x11\xf0\x62\x4d\x1d\x87\x47\xfe\x0e\x7d\x38\x38\x78\x89\x1b\x33\x3d\x62\xeb\xb5\xb0\x13\x3b\xc4\x0b\x02\xd3\x53\xdd\x78\x9e\x5f\x31\xb3\x83\x97\x44\x01\x82\x91\x1b\x87\xa5\x83\xfd\x80\x97\xa8\x18\x81\x01\x77\x9b\xa7\xfd\xea\x98\xa7\x0a\x39\xfd\xec\x51\xee\x69\x3d\x64\xac\xb9\x23\x7c\xdd\x75\x66\x0f\x3c\xe1\x3a\xe8\x92\x1f\x0a\x95\x41\xb9\x4b\x8f\xd0\x93\x90\x01\x4f\x04\x09\x32\x4a\x28\xa8\x90\xae\x85\x00\x46\x37\x6e\x57\xc5\x02\xe7\x3c\xd6\xe6\x07\xd3\x53\x09\x22\x0e\xde\x70\xad\xbb\x79\xa9\xa4\x42\x35\x03\x71\xbe\x3c\x3f\x4c\xc2\xc4\xcc\x40\xe0\x1c\xa3\x38\xf8\x79\x42\x0d\x83\xae\xbb\x73\x50\x21\x03\x0f\x74\xa2\x9d\x56\x45\x89\xd2\x9d\x03\x26\x5a\xf0\xb4\xef\x60\xb3\xdc\x46\xaa\x6f\xd0\xfd\x55\xb9\xb8\xae\xb8\x52\x48\x2b\x36\x02\x2a\x7f\x99\x76\x04\x4f\x6b\x86\x69\x47\x9b\x15\x46\x32\xb5\xc1\x23\xf8\x0e\x90\x50\xf4\x2d\xc6\x96\xc9\x07\xf7\x1b\xf7\xc7\xb6\x99\x9a\x2d\x72\x1a\xa7\x67\xc6\xbb\x11\x65\xc1\x97\xf3\x95\x69\x58\x68\x7e\xe4\xd5\x34\x62\x81\xef\x8a\x10\x59\x29\xe7\xb3\xcd\xae\xfd\x9b\xd6\x88\xbe\x9e\x0d\x5a\x51\xc0\xf7\xa4\x8e\x89\x81\xfe\x67\xfb\x27\x00\xc1\xbb\xd2\xc9\x52\xdd\x5d\xd6\x45\x35\x7a\x52\xe6\x38\x98\xf7\x33\xdd\x8b\x73\x5e\x1d\x7a\x0e\xb7\xcf\x14\x17\x46\x0d\x11\xb1\x3d\x37\xa8\x5e\x46\x5c\x2e\x66\x01\xfb\x01\x4b\x58\x62\x2b\xb7\xf8\x80\x15\xea\xed\x92\x67\x49\xab\xd1\x64\xb9\x07\x9f\xc8\x0f\x02\x2f\xb0\x50\x18\xac\xd9\xcd\xb4\x5e\xde\xdf\x78\x8d\x41\x14\xba\xfd\x2c\xff\xb8\x86\x0d\x7e\xe8\x6a\x23\x59\x55\x97\x29\x7c\x18\x5e\x16\xfb\x8c\xa1\x0f\x46\x73\x2a\x57\xcf\x45\x0e\x97\xbb\x96\xcb\x12\xfc\x10\x42\xec\xdc\xdd\x42\x3d\x09\x16\x03\x3f\x6e\xec\x30\xc6\xdb\x75\xfa\x81\x21\x91\xb5\x30\x7e\xe2\x7a\x9a\xf7\xb0\x02\x6b\xf4\xef\x6f\x8b\xe9\x5d\x59\x2f\x3f\x61\x44\x89\x4d\xb2\x20\xbf\x98\x7f\x49\x20\x95\xc9\x9d\xae\x8b\x2c\xad\x53\xd9\xbc\xee\xff\xe1\xf2\xfd\x54\xd4\x3d\x01\x61\x52\xe4\xed\x16\xa2\x2f\x7d\x92\xa7\xfd\x17\x94\xc5\x1f\xfd\xcf\x2f\x63\x86\xa0\xed\x53\x09\x1f\x69\x71\xae\x10\xe1\xb9\xac\x46\x3c\x89\xe0\xcb\xc4\xb3\x33\x1f\x67\x3c\x35\x21\x8c\xdc\xc4\xd1\xdd\x4a\x1e\x5b\xe9\x9c\x07\x42\xe8\x4e\xdb\x13\x5f\x0a\x81\x81\x6a\xfa\x83\xe7\xf5\x1f\xff\xd3\xd3\xb9\x33\x03\x14\xd7\x84\x61\x38\x14\xe7\x4c\x51\x91\xef\x0b\xe2\xc5\xff\x96\xb9\xca\xfe\x8a\x22\x45\xf5\x23\xd5\x85\x06\xe6\xb9\x9d\xf1\x0a\x14\x87\x16\x1b\xdb\x89\x8b\xde\xa0\x46\x9a\xb4\xcc\x3e\xf8\x3e\x7e\xc7\x53\xc6\x2f\xa6\xb1\xcf\x1e\x61\x44\x37\x21\x9a\xcd\xf6\xa1\x89\x22\x76\x9f\xc5\x3d\xbf\xb4\x33\x0e\xb8\xc4\xd0\xd9\x7a\x22\x16\x73\x65\x0f\x43\xe2\x1b\xdc\xc8\x3c\x4b\x21\x1f\x37\x48\x7c\x4d\xe4\x74\x1e\x35\xcf\x82\xaf\x7d\x16\xb9\xad\x63\x5c\x97\x5c\xb5\x2e\x46\x73\x0c\x53\xba\x92\x88\x16\x96\xb9\x2c\x46\x2a\x5b\xc0\x1c\x87\xe0\x65\xbf\x9f\x55\x51\x4d\x49\x93\x0e\xe2\x95\xd1\xb9\x01\x43\xa0\xa5\xc4\xfa\xe7\x06\xf8\xd4\x14\x9a\xaa\xf3\x01\x73\xe2\x18\x63\xfa\xea\x7c\xbc\x87\x93\xd1\x01\x6a\x77\x7d\xe6\xc4\x3c\xd0\x46\xbc\x0f\xca\xfd\xa9\xeb\xe8\x36\x03\x5c\x87\x31\x83\xe7\xc1\x18\x6b\x79\xd5\x5b\x6f\x06\x7a\x91\x70\xa5\x51\x28\x4e\x73\x05\xe5\x95\x6d\xfa\x7f\x58\xfb\xb3\xee\xc6\x71\x64\x0b\x14\xfe\x3b\xf5\x70\x1e\x38\x80\x20\xf8\xa8\xc9\x4e\x75\x79\x50\x4b\xca\xcc\xaa\x3e\xeb\x2c\x2d\x0c\x01\x9b\x65\x8a\x54\x73\xb0\x53\xf5\xeb\xbf\xc5\x00\xc0\x49\x74\x66\x7d\xf7\xde\x97\xce\x6a\x13\xa4\x38\x00\x81\x18\x76\xec\x4d\x82\x24\xc1\xa5\xf3\xc8\x7f\x54\x03\x6c\x22\x10\xe2\x87\x18\x00\x22\xca\xa9\x28\xc3\xee\xef\x31\x11\xa4\x57\xe4\xbd\xbd\x22\x81\x40\xd9\x98\x4a\xc1\xa5\x2e\xe1\xbf\xb6\x1d\xc3\x1e\x8f\x62\x0f\x4b\xcc\x4e\x4b\xc8\x04\xd0\x3d\xc1\xdb\xc0\xff\x9e\x3c\x4e\xc4\x03\x6a\xd4\x19\xc6\x59\x0e\x12\x71\x43\xb2\xb9\xcd\xf3\xe2\xbd\x23\xd2\x74\x07\xa5\x12\x26\xed\x65\x3d\x5d\x1b\x1d\x66\x3d\xac\x0d\x48\xa4\x08\xee\x85\x08\xc0\x7e\xe5\x8e\x7f\xad\x3b\xac\x15\x1d\xb2\x2b\xde\x7c\xe7\x81\xd1\x24\x34\x30\x22\x25\x58\x6c\x3d\x1d\xf7\x8b\xd5\x29\xf1\x5c\xf4\x4c\x28\x0d\x71\x5e\xbe\x3b\x59\xfe\xae\x95\x0d\x08\x15\x09\x46\x48\x28\x45\xf5\xfb\xd3\xf3\xf7\xa7\xd3\xf3\x7e\x7b\xef\xb8\x85\xda\x01\x1a\x21\xc4\xef\x50\xa6\xfa\x6a\xab\x5c\xbf\xcd\x14\xef\xdc\x78\x48\x30\xdf\x59\x59\xf4\x7e\x77\x1d\x00\x9c\x62\x97\xa2\xaa\x9f\xe0\x63\x91\x57\x1f\x9f\xa0\x91\x81\xc4\xbe\x87\x84\x65\x59\x6b\x59\x61\xd0\x8c\x0d\x24\x56\x92\xdb\xf6\x41\x93\x2f\x7a\xd6\x66\x5d\x77\x5f\x86\x05\x52\x5a\xf7\xd2\x0a\x09\xd8\x9b\x6e\x83\xe5\x4e\xfd\x16\x08\xe3\x12\xf3\x16\x28\x67\xbb\xd9\x1f\xb6\x0b\xc7\x52\x04\x84\x29\x86\x55\xb2\x1a\xf8\xf9\x64\x79\xab\x27\x7e\x04\x49\x3c\x8e\x46\x7a\xc9\xf3\x7c\x0e\xe7\x05\x24\x21\x51\x6c\x15\xf5\x5c\xdf\x68\x4f\x5e\xe7\xc6\x44\x3e\xd8\xec\xc9\xb2\x2c\x3e\x4d\x59\x11\xee\x25\xbe\x67\xb7\x6c\xe3\x46\xe0\x5b\x99\xdd\x3f\x08\xf7\x84\xef\x9b\x4d\x6c\x51\xb5\x8e\xf1\xe4\x47\x39\x89\x71\x91\x9e\xe1\x5c\x94\x57\x23\xc6\xec\x1e\x9d\x53\x81\x06\x2a\x87\x0f\xc3\xd7\xf5\xd3\x0c\x30\xe1\xb1\x8f\x8e\x86\xcc\x8a\x0a\x46\x2a\x12\x83\x17\xc1\x13\x0f\x81\x19\xf7\x45\xc9\x4d\x76\xf3\x97\xd9\x19\xc2\x05\xf7\x3a\x12\xce\x3d\x75\xb7\x27\xfc\x38\x1e\x32\xa0\x8f\x9b\xe6\xc7\x8f\x29\x44\x88\x9c\x76\xdf\x17\xe7\xcc\x51\x93\xdb\x43\x32\xe4\x9e\x74\x44\xa3\x66\x45\x98\xbe\xaf\xd1\x3d\x48\x12\xa9\xa8\x57\x76\x6a\xae\x1d\xdb\xce\xf8\x25\xc8\x04\x30\x0a\x39\xee\x9f\x9f\xb6\xab\xee\x37\x04\xc7\xd6\xb6\x7d\x2a\x5f\xef\x8b\x4c\x8d\x4c\x84\x94\x01\x26\xc6\x2c\xfe\xdc\x94\x34\x3f\xf9\xf6\x12\x0c\xf7\xfd\xbf\xbe\x3e\xfc\xe9\xce\x57\x9e\xe5\x76\x1c\x72\xfa\xd1\xf1\xed\x2b\x21\x22\x18\x57\xf8\x96\x57\x03\xc5\x1c\xff\x40\x1b\xfe\x58\xfb\x89\xa1\x18\x4e\xd5\x8e\xf6\xcb\x62\x0a\xed\x58\xe0\x91\x63\x83\x5b\x3b\x15\xc2\xd9\x78\x9a\x80\xf0\x60\x10\x2e\xdf\x95\xc5\x79\x02\xbb\x68\xc7\x28\x24\xf9\x59\x3e\x7f\x7d\x3a\xfe\x79\x3a\x7c\x59\xec\x5d\x1d\x84\x68\xa2\x95\xb6\xe2\xe5\x65\xda\xc6\x55\xc3\x9c\x79\xe4\x71\x8d\xcd\xe2\x38\x41\x6e\x92\x31\xa3\x9f\x89\xfc\x84\xa1\x31\x6d\x37\xb6\x75\xf1\x31\x89\xa8\x23\x5f\x48\x24\x14\xb9\x6b\x72\x39\xfc\x4a\x51\x10\x4a\x44\xd7\xaa\x26\x7f\x81\x22\xdf\x95\x70\xe1\x03\x94\x84\x1d\x15\x7a\x0c\xf9\x2b\x97\x69\x7d\xc9\x9a\x6a\x3c\x25\xc7\xbf\x14\xb2\x18\x23\x70\x38\x43\xf9\x02\xb9\xbc\xde\x61\xd7\x29\x62\x3c\x55\x77\x3d\x9d\x50\x36\xe2\x37\x1a\xc6\xbc\x11\x91\x11\x1e\xee\x2c\xec\xf8\x27\x88\x0e\xb0\x0c\x72\x2e\xf2\xfa\x75\x92\x9f\x89\x68\xc8\x10\x45\x90\xda\xf9\x70\x92\x45\x5e\xf3\x29\x6b\x0c\x44\x94\x30\xa7\x2a\xba\x87\xaa\x38\x5e\x2f\xdd\xd3\xc6\x3e\xe0\x7b\x5f\xa6\x2f\xa2\x38\xcf\x3e\xec\x3f\xe6\xe2\x9b\x9d\xef\xed\x2f\x30\x3d\x90\x0e\xbb\x11\xe4\x98\xbc\xd4\x38\x30\x4a\x07\x5c\x29\xec\x4c\x9b\xf3\x80\xa2\x98\x86\x28\x57\x30\xce\xf9\xdf\x41\x57\x1d\x9f\xcf\xfa\xdb\xb3\x93\xc0\x84\x05\xce\x83\x40\x06\xe3\xc1\xb6\x17\x25\xb1\xc6\x04\xd7\xc9\xe4\x38\x8f\x9d\xeb\x14\x25\xc2\x08\xfb\x9d\x8b\xaa\xdd\xe3\x51\x15\x23\xcb\xba\x05\x15\x71\xad\xad\xa8\x35\xfe\x7e\xc8\xdd\x01\x91\xc8\x18\x37\xa8\x36\xe0\x3f\xa4\x2f\x26\x6e\x7c\x1c\x44\xe5\x13\x2c\x1d\x44\x82\x0b\xdc\xfb\x10\xff\x57\xdc\x83\xab\xc6\x43\x24\x03\x82\x33\x59\x23\x5b\xc4\xb7\x76\x33\xb7\x1a\xc6\x87\x8c\x57\xaf\xa3\xb4\x69\xa4\x34\x95\x36\x5f\xab\x1e\xd0\x29\x19\x7f\x20\x88\x4d\x49\xcc\x80\x75\x97\xbc\x82\xd9\x9e\x9b\xf9\x2d\x23\x02\x1e\xa2\x4b\x2e\xac\x2f\x39\xda\x3a\xa7\x63\x05\x71\xda\x8d\x07\x59\xa6\x97\x7a\x21\xfb\x16\xaf\xe9\x58\x30\xe9\x9d\x76\x6c\x21\x53\x98\x48\x5c\x43\xa4\x43\x85\xcd\x58\xae\x6f\xeb\xe8\xf8\x9d\xad\x84\x98\x7d\x7c\xea\x79\x01\x46\xc0\x67\x47\x27\x67\xcb\xc7\x78\x04\xdf\x2f\xfc\x80\x09\x85\xa8\x1b\xe0\x7b\xda\x49\xea\x77\x42\x77\x1d\xfe\x67\xfa\x5e\xc6\x19\xd6\xf9\xd9\x4d\xbd\x84\x31\x6b\xc5\xad\x23\x83\x35\xca\xa6\xef\xcf\xc5\x31\x89\x25\xef\x5a\xf1\x72\x24\x24\xc5\x66\x23\x1d\x77\x9e\x00\x7c\x52\x7c\x13\x06\xfe\xd7\x57\x76\xa8\x07\x31\xc6\x3a\xff\x59\x3c\xfe\x67\xe1\xfe\xe8\x53\x40\xa2\x2d\xeb\x8c\x3b\x02\x01\xa0\x81\x1f\xe3\x02\x43\x81\xbd\x0e\x04\xe3\x0e\x42\x82\x0f\xf1\xb8\x7d\x3a\x59\x7a\x87\x85\xeb\x4a\x01\x1a\x7a\xb1\xb4\x06\x6f\x3d\xa5\x79\x04\x1a\x12\x93\xb0\x31\x55\x88\x75\x5a\x82\xac\xbb\xa0\x81\x86\xd2\x88\xba\xef\xa1\x4e\xbb\xcd\x81\x86\x3a\xc6\x45\x77\x2c\xc4\x1b\x1f\x6c\xfc\x94\x78\x49\x60\x72\xcd\x2f\xad\x11\x70\x24\x63\x3f\x79\x47\x91\x0a\x10\xe1\x81\xfe\xc1\x69\x42\x70\xdb\x8f\x41\x82\xed\x77\xde\x64\xf5\xb8\x5c\x43\x69\x98\x24\x96\x4a\xe4\xb9\x79\x87\xb2\x8d\x38\x4e\xa0\x1d\x38\x78\xfc\xac\x31\xe5\x08\x24\x72\x5e\xff\x49\x38\x42\xba\x49\xdc\x4d\xe3\x76\x7b\xc4\xb6\x83\xba\xe1\x19\xee\x8c\x8e\xc6\xd5\x8e\x60\x71\x80\x15\x08\x0c\x55\xbb\xb9\x7e\x28\x32\xd5\x8d\x48\x28\x5a\x79\x44\x12\xb5\x36\xe9\x15\xb8\x3a\x34\x97\x4b\xd1\xed\x36\x34\x09\x24\xf6\x0c\x43\xc9\x2b\x38\xf5\xca\x56\x40\xb9\xa2\xa8\x14\x79\x57\x94\x12\x86\x89\x72\x2a\xa8\xe0\xd6\x9f\xb0\xf8\x76\x4c\xa3\x74\xfc\x63\xd5\xb0\x46\x48\xa5\x17\x6a\xcb\x42\xfd\x06\xea\xae\xe8\x45\x59\x3e\x43\x09\x8c\xa2\x05\x2a\xa3\x08\xf7\x54\xac\x31\xae\x5e\x41\xbe\x5d\x8a\x34\xaf\x07\xf8\x4a\xa0\x92\xfa\x88\x41\x6b\xf2\x0a\x3a\x80\xe2\xbc\xbb\x45\x25\x8b\xd1\x03\x4e\x6b\xf8\xbc\x91\x0d\x6d\xd5\x70\xe5\x4b\xd0\xe8\x43\x9c\xab\x97\xcd\x0f\x7e\x4e\xfb\x52\x2c\x55\x5e\x14\x71\xb3\x64\xfa\xfa\xea\xe8\x64\x95\xf8\xe0\x1c\xb0\xae\x6f\x70\xa0\x26\x0c\x54\x4b\x9f\xf9\x5d\x5a\xcc\x82\xc2\xcd\xb1\x36\x5a\xc2\x74\xfb\xa9\x8d\x37\x73\x2b\xb4\x32\x9a\x57\xb1\xef\x33\x6e\x04\x48\xb2\x66\xae\x1b\xc3\x0d\x0b\x08\xb3\x82\xe5\x16\xf8\x6c\x0f\x84\xb1\x8e\x0d\xc0\xf6\x70\x6e\xb7\xa1\xaa\xc6\x19\xf7\x35\x9f\x50\x36\x43\x1c\xb2\x08\xac\xc5\x36\x89\xcc\xc3\x85\x4b\xa8\x5e\xd3\xcb\xc4\xc7\x88\xc3\x84\x85\xdc\x02\x05\xca\x77\xd8\xed\xbb\x1f\x53\x0c\xf5\x1f\xff\x2a\x52\x0b\xe0\xb8\x49\x13\xc6\x24\xa0\x44\xf5\xef\x63\x94\x43\x8f\x49\xc8\xc6\x74\x05\xf6\xf8\xf4\x0e\x48\x28\x71\x9f\x7b\x5c\xad\x76\xce\x8e\xc5\x11\x11\x08\x4d\x10\xcd\x35\xf0\x86\x93\x28\xa6\x9e\x71\x02\xf8\x28\xa6\x9a\xbc\x42\x16\x68\xc7\x7f\x81\xca\xab\xad\xa3\xe8\x30\xdc\x6e\xca\xc6\x8c\x86\xe8\x43\xe5\xd5\xc4\x5a\xc4\x8c\x41\xec\x75\xbd\xdd\x46\x9c\x51\x64\x30\xce\x1d\xc4\x4c\x08\xb4\x37\xce\x4c\xb4\x1e\x45\xa7\x2f\x0d\x31\x03\x1a\x51\xdb\x8e\xdd\xde\xa5\xfb\x7b\x22\x39\x0a\xa1\x5c\x8c\x57\x89\x05\xac\x70\xb4\xf5\xc7\xdc\x8f\x88\xc5\x33\x64\xef\xd9\x93\x9e\xe6\x5a\x62\x1e\xfa\x94\xf4\x5c\x97\x8b\x46\xa5\xb5\xab\x46\xb8\x21\x3c\xc6\xc6\x1c\x44\x0c\xb6\xae\xeb\xd0\xa7\x8e\x05\x61\xf8\x82\xd2\xea\xf9\x02\xf9\x30\x64\x34\xb8\x31\x37\x4e\x7a\x54\x18\x35\xb1\x74\x40\xc9\x01\xb1\x0c\x12\xe9\x77\xcd\xbe\xeb\xc5\xf3\xb0\xda\xde\xdf\xa7\x94\x2a\x06\xa7\x19\xf1\x98\xe6\xe9\x5c\x57\xb9\x1b\xab\x14\x92\x2d\x1e\x3f\x8a\xb5\xfb\x19\x08\x18\x66\xbc\x0e\x28\x0d\xfe\xca\xd3\x7c\x08\x7e\xe8\x5e\x35\x28\x10\xf6\x67\xbe\xee\xb7\xcb\xbe\x03\xc9\x1e\xd7\xed\xf6\x31\x84\x94\x99\xb2\xc0\x8d\xdb\x1e\x6b\xc5\x85\xd9\x98\xea\xa6\xcc\x31\x2b\x3f\x9e\xad\xcc\xf3\xe2\xd0\xa8\x4e\x8f\x3a\xd4\x27\x83\x02\xed\xd9\xd6\xff\xad\xb4\x2c\xc8\x03\x93\xcf\x3c\x65\x14\xbc\x75\x56\xf0\x7a\x23\x8b\xbc\xc8\xdd\x56\xca\x7c\x15\x61\xe1\x7b\xb5\x7f\xfe\xbe\x3e\x7d\xdf\x6c\x7e\x0f\x47\xac\xe5\xd0\xce\x6d\xac\x99\xab\x92\xa7\x3f\x11\x3c\x6a\x07\x6a\x6d\x55\x73\x77\x45\x96\xb9\xd7\xc5\x42\xea\x21\x67\xcd\xe9\xcc\xd3\xbc\x3e\x6d\x72\xb5\x2b\x8b\x73\xd1\x1d\xe6\x14\x33\x7d\x87\xd7\xb4\x5e\x65\x45\x0e\x55\x56\x94\x6a\x0f\xff\xed\x06\x08\x43\xe5\xf7\x50\xbc\xdc\xa1\xa3\x3d\x68\xfa\xfd\x79\x54\xc1\x42\xad\xd1\x71\x79\x4f\x2f\x3d\xad\x06\xb0\x88\x28\xc0\x28\xb3\x10\x3b\x9e\xd7\xe5\xf5\x38\xbf\xb0\x59\x24\x34\x62\x65\x06\x04\x98\xed\xea\xbc\x49\x3e\x4c\x4f\x03\x02\xda\xb2\x59\x6f\xf2\x97\x34\x87\x6e\x2a\x33\xaa\x22\xdb\x4d\xff\xd6\x37\xcf\x98\x9d\x74\xfe\x62\x54\x99\x72\xe7\x61\xfb\x74\xff\x60\x7c\xa8\xd3\xe3\xd7\x87\xe3\x76\xf7\xb0\xdd\x38\xfb\xc9\x62\x6a\x10\x41\x69\xfe\x9e\x22\x99\xb8\x4e\x27\xe5\x26\x16\x0b\xa9\xa5\x8b\xef\x70\xbb\x9f\x5d\x19\x2c\x96\x3e\x17\xdd\xac\x9c\x14\xbb\xff\x11\x8a\x81\xb1\x40\x25\x56\xbc\x05\x31\x2a\x46\x7c\xf0\x93\x07\x64\x4c\x28\x23\x36\xfa\x5e\x03\x3f\xdb\x1a\x9a\x7b\xb0\x24\xf1\xb0\xf5\x6e\xb7\x7d\x76\xbe\x23\xe3\x24\x46\xfc\xeb\x47\x27\x65\x7b\x24\xc7\xee\x60\x14\x21\x4b\xe7\xcc\x2c\x71\x23\xa4\xc2\xaa\x3c\xf2\x04\x56\x23\x20\x08\x13\xc4\xf0\x6c\x7c\x69\xaa\x6a\x28\x1d\x08\x4c\xa8\x10\x53\x13\xdb\xac\x39\xff\x31\x3a\x22\x7d\x81\x79\x19\xac\xf2\xaf\x07\x60\x9b\x5b\x90\x0d\x93\x2a\x46\xc7\xf6\xd2\x09\x33\x3a\x1c\xc7\x53\xe1\x22\x76\xa6\x44\x28\x0d\x8e\x84\xab\x2c\xcd\x01\x13\x34\x4f\x03\x76\x47\x60\x4a\x91\x84\x0f\xe2\x65\xd4\x54\x68\x8d\x7a\x3f\x04\x24\xe8\x01\xc3\xdb\x42\x29\x63\x53\xdd\x4b\x19\xda\x2c\x06\xa0\x99\x53\x13\xbd\x40\xde\x99\x64\xa6\x43\x1f\x91\x47\x35\x54\xf5\xb9\x72\xa9\xdd\xa4\x8d\x22\x3a\x5e\xeb\x5d\x51\x64\x55\x2f\xca\x0b\x89\xef\xc7\xf8\x46\x64\x53\x96\xd7\xd5\x6b\x2a\xdf\x20\x1f\xbe\xb2\xc4\x0f\xb8\x67\x6f\x7f\x71\xe5\x79\xbd\x2e\x8b\xd4\x98\xa6\x73\xfa\xdf\x06\x4e\xab\xe2\x7c\xa9\xe1\x14\x77\xe3\x43\x81\x39\xf9\xcd\xf1\xcb\xe9\xee\xeb\xd3\x7a\x3c\xb5\x13\x9f\x1a\xb2\x16\x04\x8d\x3e\xbf\x43\x79\x48\x7f\x74\x24\xb5\xdd\x35\x14\x20\xd9\x8e\x46\xec\xee\x27\xc9\xd9\xc4\x07\x81\x3a\xa3\xf5\x4b\x79\x30\x48\xe4\x6a\x65\xb9\xbc\xcc\x86\xf7\x8b\x80\xf7\x9f\xd5\xd9\x92\x40\x1a\x9b\x5c\x41\x6d\xbb\x35\xa6\xc2\xa8\x90\x04\x3a\xc4\x28\x84\x57\xf5\xd0\x85\x4f\x88\x1f\xa2\x09\x39\x19\xce\xb7\x51\xd7\xdb\xf8\x61\x22\xf0\x7c\xeb\xdb\x39\x7f\xe4\x26\x65\x9a\x50\x2f\xc4\xc4\xf7\x05\x5d\xb7\x74\x2a\x47\x03\x09\x15\x46\x28\xf7\x94\x56\x77\x4d\x96\x3d\x97\x4f\x4d\x36\x4f\x2b\x08\x09\xd5\x1c\x09\x89\x16\xdf\xff\x7c\xe4\xf9\xef\x00\x17\x43\x6e\x65\x0f\xc7\x91\x46\x90\xf7\x0a\xc1\xc1\x87\xe3\x7e\xde\x26\x24\xcc\xd7\x7a\x28\x26\xd3\xd5\x18\xef\x8a\xf2\x1b\xcf\xd3\xfa\xfa\x75\xff\x30\xb9\x4d\x46\x8d\xfa\xc2\x7f\x1b\x5e\xd6\x7d\xd2\x3f\x69\x0d\x9a\xef\xba\x63\xd6\xf0\xeb\x9e\x61\x48\x18\x53\x08\xc7\x5e\x96\xc5\x20\x90\x4c\x92\x24\xf6\x6c\x61\x71\x04\xf7\x70\x87\x79\x9c\x58\x04\xfb\x13\x7c\x74\xe1\xf0\x1c\xec\xf6\x7f\xa6\x67\x26\xcc\xe9\x2c\x5a\xcf\x66\x5a\xd6\xed\x53\xeb\x49\x22\x23\xcf\xf6\x32\x60\xe9\x79\x6b\x81\xdc\x9f\x7c\xdf\x04\x14\xd5\x2e\xef\x8d\xcb\x8a\xf8\xee\x89\x38\x8d\x4c\x51\x79\x90\x6c\x4c\x78\xc2\x03\xe6\x36\x0a\x9c\xf4\x3f\xe9\x29\x83\x84\x73\xc6\x65\xdf\x5c\x7f\xab\x1c\x31\x3f\x37\x85\x17\x63\x2f\x88\xc9\xcb\x99\x42\xfb\xf8\xc2\x22\x34\x40\x79\x59\x14\x6f\x5f\x2f\x5d\x7f\x5f\x7b\x00\x18\x1f\xc9\xcd\x4d\xcf\xe4\x89\x21\x3f\xe3\x3f\x86\x1e\xdc\xae\x27\x7d\xb1\x03\xa5\x6f\x3a\x63\x5f\x21\x53\x9f\x59\x04\xc5\x12\xf4\x5f\x0c\xa0\x1d\xcd\xd8\xb1\x78\x44\x7a\x33\x77\x19\xa5\x0c\x5e\xe5\xa5\x7d\x05\x98\x27\x7e\xe0\x55\x3d\x94\x26\xb0\x03\xc1\xf7\x0c\xdf\x96\xa1\x27\xb1\x7e\xc5\x86\x97\xf9\xb0\xac\x3b\xe5\x30\xfd\x2c\xc5\x3a\x98\x13\x10\xc6\x98\x38\x54\xc0\xeb\xd7\x35\xaf\xf9\x49\xfb\xcc\xdd\x1e\x10\x9a\xd8\xb6\x9f\xb5\x65\xad\x6b\x3d\x0f\xf9\x0a\xeb\x5b\x12\x3b\x48\x74\xa0\x90\x30\xe4\xb5\x68\xca\x5d\x51\x7f\x49\x5f\x5e\x2b\xd9\x83\x22\x13\x1d\x77\xaa\xa0\xdb\xbc\x82\xb2\x5e\xf1\x72\xda\xf0\x3c\xfb\xaf\x3f\xaa\xae\xdf\xfe\xaf\xbb\x3e\x67\xc8\x96\xd3\x7a\x45\x3f\xfe\x1f\x75\x93\x00\xf7\x08\x35\x75\x79\x5e\xbd\x3e\x37\xf5\x61\x22\xf2\x02\xdc\x8b\x08\x06\x3d\xbd\xf0\xb8\x9b\xe1\xf6\x36\xb8\xef\x85\xb1\x95\x65\x32\x39\xdc\x91\xe8\x82\x1b\x14\x10\x4c\x7b\x18\x3e\xc2\x41\xcc\xfa\x3f\xa3\xdb\xf1\x95\xc4\x68\xa3\x6e\x27\x24\x22\x05\xba\xd4\x23\x0f\x48\x1c\xf6\xf3\xeb\xc4\x4f\x39\x7c\x9c\x0c\x7d\xde\xaf\xb8\x2e\xdc\x15\x18\x47\x4c\x5e\x93\xab\xe2\x38\xb4\x98\xee\x27\x42\x3f\xc0\x15\xfd\x2c\xd2\xb2\x39\x6f\xab\xaa\xe9\x36\x78\x1e\x4a\x86\xe0\xa7\x1d\x2f\x55\x53\x3d\x41\xfd\x51\x94\x0e\x18\xc4\x89\x67\x2a\x83\xb2\x38\x5f\x8a\x0a\xfe\x85\xdc\xa9\xa3\xbb\x0a\x83\xff\x8d\xfe\x6f\xf0\x5f\x33\x90\x86\xff\x0d\xbc\xff\x73\xd7\xb3\x58\xa1\x3d\xa8\xe5\xd7\x3f\xba\x5f\x09\x43\xc4\xaa\x1d\xcb\xb4\x39\x7f\x29\xb2\x5e\x71\x10\x38\xe1\x80\x01\x78\xeb\x22\xad\x1b\xe8\xfe\x6c\xb5\xed\xdb\x39\x68\x17\x2e\xf9\x29\x51\x1c\xf0\xc8\xe3\x10\xba\x6e\x72\xa4\x7d\xe4\xd6\x28\xa4\xc5\xc4\xf4\xf0\xc8\x07\x4c\xfa\x1e\x9a\x3c\xbf\x76\xf7\x19\xf9\x9a\xf9\x8e\x62\xfe\xf7\x3f\x57\x37\x5a\x26\xc0\x23\x9d\x48\x5b\x4a\xdd\x15\x6f\x70\x2e\x6e\x0b\x25\xe3\x5f\xa2\x71\x8c\x16\xe8\x71\xe5\x2a\xd1\x9c\x26\x02\x31\x1f\x4b\xa7\x51\x0c\x3c\xf6\xa2\xd8\x95\x87\xba\xa6\x4b\x9f\x76\x87\x03\x53\xcc\x52\xd5\x42\xa9\x79\x33\xcd\x63\x6a\xda\x7e\x54\x5a\x5d\x9a\xda\xfa\x94\x53\xa4\x1c\x8f\xa5\x8f\x01\xe7\x0b\xaf\x70\xba\xdf\x15\x25\x4a\x58\xe4\x15\xbe\xac\x45\xfd\xa5\x38\xc3\x21\x55\xdd\x87\x60\x42\x61\xdd\xde\xd4\x05\xbe\x19\x97\xe9\xa6\x9f\x18\x78\x42\x98\x34\x94\xa9\xf5\x7d\xaa\x9d\xe5\xe4\x9c\xc4\x34\xea\x5a\xfc\xb1\x83\x76\x50\x45\xe6\xc2\xa3\xa8\x66\x63\xa4\x8a\xa7\x5c\xfa\xe3\x5f\x10\x61\x84\x51\x41\x5a\x21\x24\x62\xd0\x89\x3b\xf4\x74\xb9\x48\x6c\x90\x0f\x99\xce\x32\x28\xaf\xc8\x08\x53\x34\xb9\x1a\x71\xdf\xfe\x63\x72\xac\x7f\xf2\xaf\x33\x29\x82\x4b\xc9\xe6\x00\x1e\x9f\x3c\x91\x30\xa5\x07\x4c\x22\xce\xd0\x5a\x02\x17\xca\x10\x4f\xa4\x15\x36\x5a\xd5\x83\xfe\x63\x3b\x42\x12\x81\xf9\x5e\xe4\xb9\xff\xba\x71\x61\x12\x97\xda\x54\x25\xd1\x65\x4e\xd1\x8c\x9f\x74\x9a\x63\xa7\xfc\x17\x4c\xa5\xc2\xbb\x73\x96\x3a\x5b\xa1\xbc\xc8\x6f\x2f\x96\x01\xd2\xed\x9f\xcf\x4d\x3e\xc8\xa9\xba\x41\x81\x8f\x26\x11\x39\x91\xea\x41\xd1\x94\x2b\x12\xc9\x01\x3e\xfe\xc4\x87\x69\x28\xae\x94\xa1\x29\xb3\x9c\xac\xdf\x79\x59\xf2\xfc\x67\x94\x43\xc0\x95\x4e\xa2\xb8\x23\x3f\x36\x3d\x2f\x53\x36\x40\xe0\x10\x18\x15\x71\x74\x72\x16\xe3\x46\x51\x3b\x44\x47\x94\xf7\x2a\x75\xdb\xbc\x6a\xa6\xac\xbd\xc0\x35\x0f\x70\x5b\xaa\xb8\xfc\x15\x6d\x3f\x08\x8f\x71\x5c\xc3\x97\xb2\xf8\x0b\x64\x3d\x14\xd8\x04\xe1\x71\x62\xb0\x9c\x43\x8e\x14\x10\x7e\x10\x63\x7e\x13\xfb\xca\xf2\xb4\x4f\xe8\xba\xe8\x51\x04\x22\x42\xc4\xa8\xad\x10\x7c\xe1\x62\xda\x21\x20\x02\x61\x24\x8d\x0e\x5f\xb6\x47\x97\xdf\x14\xa1\xcf\x78\x5f\xbc\x43\xad\xe3\xb2\xb8\x60\x82\xde\x28\x47\x4c\xa9\x83\x41\x84\x4c\x10\x6b\x2d\x2d\x3a\x6f\xd2\xa9\x27\x42\x1e\x32\x93\x71\xbd\xac\xf9\xd5\xb9\x94\x82\x78\x0a\x73\x7d\xb8\x23\x9a\xea\xfd\xf8\xbc\x48\x53\x1c\xd0\xee\x29\xfc\x96\x50\xda\x8e\xa2\xc4\x34\xec\xb6\x86\x21\x6b\x60\xd4\x5f\x0e\x22\x56\xe0\xf7\x4a\xa4\x2b\x7e\xf9\x9c\x2d\x65\xf4\xa1\x45\xac\x15\x01\xdb\x3a\xf7\xc8\xf3\x4f\xd9\xa4\x46\xe4\x25\x83\xd7\x92\x04\xda\x31\x49\xd9\x92\xee\xf8\xb6\x93\xc8\xc0\x6c\xda\x78\xdc\x09\xa7\x82\x48\xa8\x09\x2a\xad\x86\xf4\x5d\xf1\x49\xb2\x47\x24\xb6\x41\x5a\xf2\xfc\x31\xed\x96\x86\x48\x64\x82\x39\x8d\x0f\xfe\x0e\xd5\xfd\xf7\xee\xcf\x2a\x88\x8d\xb6\x37\x5c\x8a\x0b\x66\xbd\xa7\xb7\xa3\x0c\xc7\x84\xfe\x50\xc7\x62\xf3\x74\x18\xd6\xaf\x85\x83\x0c\x1d\x24\xcf\xb2\xe2\xf2\x39\x39\xd2\xfc\x17\xe2\x01\xc3\xc9\x68\x95\xc5\x77\x19\x97\xc8\xf6\xe1\x78\xc4\xf3\x97\x61\xc8\x2f\x38\x27\x81\xcd\x09\x1d\xcb\xa6\x9a\xb6\x19\xd8\x51\x22\x36\xea\x51\x7b\x90\x29\xbc\x83\x42\x5c\xe0\x1c\x95\xd4\x68\x3a\x88\x18\x10\x91\xf4\x56\xc9\x65\x53\xe6\x23\x3a\xc2\xd9\x13\x64\x28\x2c\x49\x26\xc6\x37\x5d\xda\x3d\xfb\xc5\x69\x89\xb2\xc2\xd3\xd7\x55\x71\xb9\x96\xe9\x80\x7e\x73\xd6\x0c\x48\xe9\x11\x43\x6b\x5e\x61\x29\xfb\xc6\x38\x09\x15\x30\x02\x03\xf4\x74\x1b\x6f\xb6\xfe\x7b\x70\x73\x27\xe3\x17\xa5\x78\x84\x06\xe6\xbb\xe3\x72\x75\x0c\x09\x93\xdb\x99\x9c\xa5\x22\xac\x9c\xde\x43\x0e\x65\x2a\xfb\x4f\xfe\x8f\x1c\x4d\xc4\x4a\x63\x35\xc4\x14\xcf\x2b\xe3\x3b\x8d\x32\x68\x02\x88\xc6\x29\x7c\xa8\x79\xae\x78\xa9\x4e\x51\x77\x44\xc4\x61\xaf\xa9\xba\x2f\x7a\x05\xab\x29\xc4\xfe\xff\x93\x1c\x8b\xd0\xbe\x87\x50\xae\xef\x45\xf9\xa6\xb3\xe2\xe3\xd0\x53\x8d\x83\xd0\x8c\x24\xac\x2f\x9f\x1f\x8b\xa9\x7c\xcd\x7c\x69\x5e\xe8\x76\x37\xc1\xe0\x5b\x64\x69\xf5\xfa\x08\x55\xd5\x2b\xa3\x98\x31\xd2\x53\x71\x92\x74\x2d\x96\xcb\xa2\x98\x74\x5e\x48\xdf\x93\xc8\x4f\x9b\x5a\x06\xb3\x43\xcd\xdf\x3e\x29\x54\xb4\xfe\x98\x36\x0d\x7d\x4b\xd3\xa4\x84\x7a\xe7\xc6\x24\xff\x5c\xe5\xca\xc9\x7e\x39\xc8\xaf\xf4\x63\x4d\x13\x2b\xc0\x06\x5b\xe9\x52\xf0\x32\x20\x1c\xcd\xcb\x85\x5f\x2d\x8e\xde\xef\x0e\xc5\x01\x52\x5e\x6d\x8b\x9a\xf7\x80\xb6\xd1\xa4\x92\xa1\x1f\x21\x87\x07\x66\xb1\xa1\x39\x2f\xcb\x14\xe9\x1c\x9d\xf9\x92\x21\x50\xcc\x44\x16\xef\x50\x4e\xe9\x93\x41\x86\x9a\x23\x52\x77\x4c\x29\x3a\x6f\x20\x65\xe4\xc5\xd8\xb0\x55\x7d\xa4\xb5\x7c\xd5\x8d\x33\x2f\x32\x82\x18\xc9\x1a\x2f\x9d\xda\x94\xe5\xbb\xfb\x7f\x35\x87\x24\xf5\x04\x16\xbc\x8d\x63\x70\x42\xe0\xd9\xe9\x72\x8b\x07\x94\x54\x48\x6a\x78\x04\x0a\x5c\xe6\x36\x73\x62\x13\x39\x91\x1b\x05\x02\xe9\x3d\x44\x73\xbd\xcf\xb8\x4a\x79\x5d\x94\xab\xd7\x41\x5a\xd1\x8e\x8b\x63\x29\xfc\x81\xdc\x63\x3b\x45\x27\xa6\x52\xc6\x5c\x68\xe5\x88\xda\x9a\xbc\xb2\x59\x84\x6a\x9b\x9b\x5e\xcb\xf9\x17\xc8\xbc\x04\x95\x36\xeb\xe2\x5c\xac\x8a\xfc\x1d\xca\x7a\x50\x1a\x91\xcc\xf7\x30\x73\x0f\x3f\x40\x36\xb5\x29\xf1\xaf\x21\xab\xf9\xb2\xb9\x11\x79\xff\xf4\x15\x0e\x8f\xdf\xca\xe9\xcc\xae\x2b\xc9\x02\x53\xe5\x59\xa6\xb5\x2c\xd2\xfc\xbe\x84\x6e\xeb\x90\xdc\x8f\x12\x31\xb0\x91\x43\xf1\x8e\x5f\x98\x0c\x77\x05\xe2\x61\xf2\x7e\xb7\xd9\xaf\xac\x3a\xe9\xe9\xf8\x7c\x5a\x6f\xbe\x75\xbf\x41\x0c\xad\xe9\x11\x32\xb8\x1f\x54\xda\x25\x8f\x4d\xa2\x00\x8d\x7d\x14\x4c\x3e\x94\xf0\x35\x06\xef\x69\x75\x57\x94\x6f\x7d\xdc\x2a\x05\x21\xb8\x70\xcc\x8c\x69\x6d\xec\x09\xfd\xcf\x93\xe8\x75\x08\x40\x4a\x25\xb0\x3a\x9b\xf1\xaa\xbe\x03\xa8\x6c\x72\xa0\xf3\xb8\xa5\x54\xa6\x92\xe2\x3c\x37\xb9\x83\x72\x79\x23\xd3\x07\x52\x79\x11\x26\x96\x2e\xfc\x6a\xe5\xba\x6c\x31\x7f\x76\xf7\x90\x2a\x60\xa1\x23\xfd\xb1\x59\xc4\x81\x54\x23\x48\x15\x1b\x34\xb6\xab\xb0\x74\xf2\x7a\xa3\xe6\x42\xa9\xb8\x87\x28\xc8\xba\xc9\xa7\xeb\x01\x7c\x81\x3c\x22\xf7\xfc\x3c\x12\x23\xea\xdb\xa7\x06\xff\x35\x76\x73\x25\x04\xc0\x3b\x96\xaa\x9e\xea\xb1\x75\x2e\xba\x90\x58\x82\x34\x9e\x9c\x0b\x3c\x07\xe8\x36\x93\xcb\xb9\xcd\x92\x49\x80\x08\xa3\xcd\xfb\x42\x19\xb5\xb0\x59\xcf\x46\x6a\x8f\x04\x74\x30\xdf\x7a\x26\x17\x37\xc0\x12\xea\x61\x87\xca\xb8\xcc\x20\x75\x62\x14\x3f\x6d\x95\x1b\x13\xc5\x7b\x90\x90\xbe\x4f\xb3\x8f\x52\x27\x12\xfc\x6e\x9f\x68\xbd\x96\x81\x9c\xff\x64\xb5\x6b\x61\x6c\xf7\x05\xe0\xed\x81\x57\x43\xc1\x49\x50\x5e\xa8\xb1\xfd\xd3\xf4\x72\x1c\xa0\x9d\x43\xe3\xef\xa1\xbc\xc4\xc3\x48\xda\xbc\xae\x47\xc0\x62\xd2\x4f\xc3\x4f\xe5\x71\x66\x4a\x21\x50\xd5\x2e\x9b\x7d\xf8\xe0\x25\x26\x5c\xdd\x18\xe5\xa3\x1b\x82\x20\xc9\x1b\x26\x91\xf1\xf5\x7c\x96\x38\xf2\x99\x8e\x2d\xeb\x2e\xe3\x2f\x43\xae\x3b\xbf\x1b\xcc\x93\xa0\x53\x86\xdb\xae\x9e\x87\x94\xd6\xa0\x7c\xc1\x6c\x5b\x0c\x5a\xb0\x63\xb1\xed\x00\x5d\x6e\x84\xd4\x52\xb9\x5c\x4d\xdf\xa2\x34\x7a\xa9\x2a\x08\x3d\xd4\x1a\x17\x0d\x9a\xce\x47\x9e\x0f\x15\x4b\x41\x05\x51\x84\x7a\x31\x45\x6e\x99\xbb\xf1\x33\xde\xf2\xeb\x0d\xbc\x6a\x15\xb0\x04\x3b\x86\x57\xbb\x22\xcb\x8a\xa1\x0b\xac\x42\x3f\xd2\x16\x27\xb2\x77\xbc\x40\xdd\x03\x87\xa1\xe4\x16\xf3\x67\xf6\xf8\x36\xdc\x5f\x4c\x3f\x63\x48\x04\x22\x24\x6c\xf0\x74\xc0\x47\xae\x66\x24\x03\x40\x85\x54\x03\x4c\x22\xfc\xbc\xe9\x9a\x93\x15\xf1\x7d\x0c\x0a\x11\x3e\xb5\x2b\xdb\x78\x73\xfc\x76\x48\xa8\x31\x59\xd7\xae\x14\xf4\x14\x47\x0f\x43\x62\x40\x1e\x98\x6a\xeb\x8c\x95\x8a\x3c\xc0\xe7\x83\x73\x8a\xd6\xac\xaf\x97\xcf\x4f\x88\x28\x34\x42\x30\x66\xcf\xae\x0c\x2a\x65\x92\x91\x52\x11\xe1\x38\x11\xa0\x2b\x50\x28\x1a\x7b\x88\xf5\x69\xad\xe6\x07\xc0\xdb\xc9\xcc\xfb\xc0\x1d\x8f\x49\x18\xdb\xd8\xf1\xcb\x55\x95\xe6\x23\xcc\xc6\x1b\x8a\x51\x8a\x3a\x75\xca\xc6\x19\xd5\xd8\x3d\x57\x09\xf1\xc8\x08\x56\xd4\xad\xd0\xff\x36\xa9\xba\x49\x7e\xa8\x24\x62\x6c\xa0\x27\x1a\x44\xf4\x91\xbb\x5e\x55\x95\x24\x2c\x72\xd3\x6d\xb0\xe9\xaa\x24\x51\x60\xd8\x7f\x90\x95\xfa\x00\xb2\x29\xd3\xfa\x6a\x61\x42\xb3\xba\x8a\xa0\x12\x15\xfb\xd6\x33\x29\x5f\xe0\x5f\x4f\xc7\x5f\xac\xe6\x44\x31\x94\xf2\x75\x26\xdd\xf8\x9c\xf6\x20\x0f\x29\x02\x1d\xd4\x35\xe7\xe7\x54\xee\xe1\x1d\x06\xfa\x97\xce\x30\x2b\xce\xa8\xe8\x1d\xdb\xae\xb4\x52\xf4\xda\xfb\xfd\x50\x4e\x03\xd7\xe4\xf2\x9f\xfd\x8f\x19\xbf\x51\x09\x46\xb5\x55\xd5\xde\xf1\xa6\x1a\x26\xfe\x94\x10\x3e\x32\x3c\x54\xbc\x91\xb0\x2b\x8a\x0c\x69\x94\xdc\xed\x4a\x3f\x06\x57\x94\xbe\xe3\x69\x76\x80\xfa\xa9\xef\x45\x57\x32\x8e\x93\x4e\x88\x76\x65\x04\x5d\x56\x9f\x49\xd6\x80\x92\xdc\x8b\x08\x16\x25\xa7\xd1\xd0\xfc\x9b\x94\x82\x68\x5b\x9f\xc0\x34\xcc\x2c\x7b\x1f\x28\xa9\x3d\xcc\x67\xe1\x5d\x8c\xc1\x5c\x4a\xf9\x01\x8f\xfa\x4c\x58\x51\x76\x96\x4d\x71\x3f\xb4\x73\x17\xcb\x38\xe3\xc4\x87\x52\x4a\x60\x07\x93\xe2\xe5\xdb\x80\x11\x43\x29\x1d\x61\x26\xec\xe9\xf9\xe1\xe1\x4f\xd4\x89\x1f\xdf\x0c\x04\x12\x8b\x74\x7f\x15\x69\x3e\x90\x5e\x9c\x2e\x36\x20\x86\xdc\xa9\xf5\x30\x9a\xcb\x44\x6a\x07\x14\x48\x43\x35\x5a\x01\xaf\xc7\x96\x12\x2c\xf8\xc7\x39\xac\xf8\x39\xc6\xb7\xa0\x3d\xc3\xfe\x79\xa8\x0b\xd7\xfc\xad\x34\x03\x64\x5c\x79\x82\xfa\xda\x64\x3f\x0b\xa5\xc1\x0b\x0d\x12\xcf\x50\xe5\x1f\x0e\x2e\xb9\x05\x1e\xa5\xd8\xc6\x8e\x8e\x55\xf5\x35\xaf\xd3\xec\x7b\xf7\x62\xc0\xf7\x69\xec\x00\xe0\x1f\xcb\x26\x57\x59\x6b\xe8\x9b\xac\x4e\xeb\x1b\xca\x56\x00\x3f\x8c\xb0\x16\x7e\x7a\x81\xfa\x5f\x7f\xee\x56\x03\x81\x37\x00\x9f\x88\xb0\x13\x86\x7e\x1f\x7f\x51\xf0\x69\x6f\xbe\x0b\x35\xc3\x07\x0b\x10\x78\x1e\x42\x0f\x9b\x5c\x41\x89\x1d\xc4\xf3\x76\x11\x02\xdf\x88\x05\x5d\x4a\xd0\xe9\x0f\x50\x5f\x7a\xfe\x0a\x37\x22\x94\xc4\x94\x46\xb1\x95\x63\x00\x38\x19\xbd\x73\x08\x98\x91\x44\x7b\xf8\xe6\x8a\x18\x10\x80\x8f\xa8\x02\xa8\x5f\xa7\xde\x26\x84\x54\x63\x0a\xdd\x71\xfb\xa7\x79\x7a\xf8\xe0\x97\x87\xde\x63\x05\xe2\x71\x4e\xfa\x04\x18\x76\x89\xcc\xfa\xdc\x40\x62\x8a\x93\xa5\x40\xca\x1b\x4b\x51\x55\x2d\xaf\x87\xcb\xc8\x33\x75\xa3\x85\x00\xd1\xa1\x75\xab\x65\x73\x5d\x5e\x17\xf5\x44\xe4\x1a\x80\x48\xe9\x18\x5c\x96\x8b\xe5\xb4\x4a\x6e\x07\x45\x96\x51\xbb\xcb\xa9\xb4\x7b\xc7\xe7\x7a\xc7\x00\x91\x54\xb2\x53\x17\xc7\x84\xed\xf2\x3a\xed\x5b\x82\x08\x38\x26\x36\x76\x4d\xf9\x32\xd0\x9a\x05\xa0\x1e\x01\x4b\xce\x73\x3f\x98\xf6\xb3\xa5\x7e\xa0\xa1\x85\xdb\x1a\xd4\x0f\x72\x7d\xd8\x43\xb1\x6f\x62\x6d\xd1\x5c\xff\x53\x4c\x1d\x6a\x48\xa8\x42\x4c\xb9\x71\xe0\xda\x58\x7c\x56\x5d\x0e\x20\x61\x4a\x5b\xdf\xde\xf9\x05\xa3\x0b\xf1\xd8\xe4\xbe\x72\xf8\x38\x34\x42\x15\xe7\x76\x02\xcd\x36\x24\xcf\x9a\x4b\xe0\x8c\xc5\xd2\x79\x66\xdf\x56\xc3\x37\xc1\xc1\xb4\xf9\x2e\x10\xcf\xf6\xb3\xd5\x2c\x6c\x41\xcb\xf5\xf7\x9a\xde\x78\xa3\x6b\x6a\x50\x7e\xfd\xac\x14\x1e\x37\x84\x79\x30\x84\xf5\x83\xf0\x05\xe6\x1f\xad\x18\x26\x4f\x2b\x50\xdb\x4a\x76\x87\xa9\x62\xc3\x10\x06\x4f\xb5\x8d\x3e\xb3\x21\x28\x08\xd0\x3a\x76\x61\xc7\x4d\x8b\x08\x48\x5f\x62\xbb\x4f\x5a\x55\x0d\x18\x49\x8e\x54\x0e\x92\xe7\x73\x8f\x09\x11\xc3\x36\xa5\xe2\x72\x29\x72\xc8\xeb\x11\xf0\x16\x20\xe1\xb8\x14\x8f\xdb\xcd\x9e\xd8\x3f\x6a\x3f\x06\xf4\x49\x0d\x84\x1f\xf8\x79\xb0\xcd\x76\xda\x20\xa0\xfd\x84\xa3\xa3\x91\xf3\x52\x16\xd5\xf2\x6a\xc2\x0d\x39\xaa\xe4\xeb\x20\x34\xdd\xfc\x96\xbe\x78\xd9\x94\xf9\x43\xf1\x89\xd5\xd1\x01\x8b\x91\x21\xe2\xab\xd1\x18\x37\xa2\xe6\xc5\x6d\x8e\x5b\x07\xe0\xe1\x26\x81\x34\x70\xdd\xd3\xe8\x30\x32\xc8\x6a\x9b\x53\x45\x64\xaf\x25\x55\x76\x23\x92\x84\x86\x7d\x1a\x7c\x1c\x4c\xea\x90\x1b\x39\x77\x05\x5c\x3d\xa4\x1d\x98\x4c\x13\xa2\xfd\x61\xd1\x6c\xf5\x9a\x66\xbf\x94\x79\x77\xe7\xb2\x98\xf6\x2c\x54\xdd\x94\xd2\x44\x27\x66\xee\x64\xbc\x3c\x4f\x36\x41\x1d\x05\x41\xa8\xa7\xfd\xa6\xc7\x02\x6b\x84\x5d\x4d\x5d\x47\x91\x83\xd7\x71\xd5\xb3\xd6\x82\x8e\x28\x35\xe0\x52\xf3\x1a\xee\x8a\xb2\x6f\xb2\x19\xbf\xc7\x48\x18\x16\x60\xa4\x89\x44\x1b\x3f\x07\xcd\xd3\x71\xa0\xb9\xb3\xf5\xe6\x7b\x3c\x14\xc5\x5b\x73\x19\x78\x3c\x3a\xe6\x01\x92\xcc\xf4\x20\x19\x1d\x4b\xa3\x7b\x50\xa7\x98\x74\x2b\xeb\xdb\xa2\xac\x66\x5e\x88\x6b\xe4\xf7\x3f\x57\x37\xce\x8f\x1b\xa2\x63\xf4\x54\x9a\xaa\x0b\x5f\x17\x4a\x4d\xbb\x61\x74\xe2\x89\x84\x98\xf2\xee\xe1\x35\xbd\x54\xcb\xeb\x08\x6c\xe8\x46\xc5\xa1\x23\xfa\xf8\x9a\x4b\x53\xa5\xbd\x1b\xd4\x33\x75\x12\x1b\x0a\x4b\xf7\xad\xab\x31\xb5\x83\x4e\x80\x48\xe8\xda\x24\x91\xad\xc3\x62\x5d\xc7\x0f\xc6\x7d\x43\x61\x87\x8b\x68\x09\x5d\xa7\xb8\xe6\xb1\x8a\x78\x8f\xcd\x6e\x7f\xbc\x6b\x69\xed\x07\x81\xe1\x81\x3b\x40\x96\x9d\x7a\x69\xc4\x4f\xd3\x4b\x5a\x50\xc0\xaa\x85\xe4\x59\x2f\x81\x3c\x7e\x74\xc1\x01\x5b\xc7\xa5\x8d\x7c\xb7\xb2\xd8\xf1\xb2\x76\x31\x8b\x96\x21\x04\x62\xd8\xb8\xdb\x3f\xb4\x8c\x64\x18\x0c\x7c\xab\x6a\x5b\xc3\xf9\x36\x45\xa0\xa5\x0c\xb1\x7e\x68\x73\x45\xe9\x4b\x0e\x6a\x0d\x3c\xb3\x9e\xda\xfc\x0a\x51\x3c\xd0\xae\x47\xbf\xbd\xa7\x2e\x15\xa4\x8a\x0f\x67\x6a\x35\x78\x80\xdd\x19\x69\xde\x2e\xa4\xfa\xda\xfd\x9d\x06\x89\xe1\x36\xbf\x1e\x76\xdb\xdf\x37\xdd\xdf\x15\x41\xa7\xeb\xf0\xfb\x2f\x2b\xa5\x5a\x53\x25\xb4\x7b\xf0\xaa\x41\xb6\x40\x7b\xc7\xa3\x50\x4c\xeb\x38\x66\x4e\xb5\x7f\xc9\xff\xe6\xbd\x9a\x3b\x68\x9d\x78\x58\x9b\x4d\xab\x6f\x50\x56\x69\x91\x77\x1d\xde\xe5\x43\xf1\x92\xca\x6e\x9c\x34\x95\xd7\x0a\xea\x93\x7d\x1f\xc1\x7c\x54\xa0\xb5\xa6\xdc\x3a\xe2\x5f\x2b\x58\x6f\x1e\x36\xf7\x8b\xe3\x66\xb5\x78\x78\xe8\xe3\x14\xed\x05\x4a\x18\x9e\x47\x9e\xab\xa7\xc6\x65\x0d\xb5\x17\x82\x87\x98\xc9\xd6\xdf\x76\xbf\x74\xba\xf0\x9b\x1c\x6a\x37\x5c\xc7\x0e\x0e\xca\xd3\xcc\x20\x8f\x8d\x8b\x38\xfc\x5c\xda\x23\x2c\x40\x38\x34\x4e\xec\x87\xa2\xd7\x39\xd6\x5e\xe4\x19\xb8\x68\x09\x55\x91\xbd\xc3\xda\xe2\x3c\x9a\x6b\xdf\xac\x3d\xfe\xd1\x28\xe0\xcc\xe4\x12\x9a\x7c\x04\x89\xa9\x26\x3f\x1a\x25\x0a\x71\x08\xa7\xbc\xc8\x25\xf8\xdd\x0f\x4a\x81\x1d\x4c\xaf\xbc\xba\x2b\x9a\xf2\x50\xc3\x65\xdc\x7b\xac\xbd\x48\x51\xc4\xdc\x42\xae\x9c\xea\xc9\xf8\x1e\x28\x31\xd4\xe5\x48\x84\x90\x8f\x99\x2a\xb4\x17\x73\x8e\x72\x13\xab\x7f\x1f\x7f\x49\x1f\xa0\x3d\x16\x00\xa6\xb8\xee\xb7\xab\xa3\xbb\x02\x23\xc4\x48\xed\x22\xf9\xda\xae\x2c\x0a\x3d\x9a\x56\xda\x63\x71\x00\x9d\xa9\x18\xe1\xe1\x3e\x61\x56\x69\x4f\x89\x8d\x06\x3c\xc0\x22\xcb\x0c\x30\xbb\xfb\x0c\x09\xa1\x08\xb7\xe4\x4a\xa1\x9a\xf6\x36\x27\xdf\x01\xde\x4c\xa9\xec\x56\x74\xf2\xa6\x01\x56\x7b\xdc\x8b\x85\x8d\x33\xbe\xf0\x52\x75\xd3\x5c\x7b\x3c\x0a\xb1\xa5\xed\xa9\xa8\x39\x26\x6c\xc6\x8f\xc2\xb9\x15\x8f\xfb\xfe\x64\x9b\x16\xb1\xe4\x75\x32\x54\x6b\xc3\x69\x2b\x3c\x89\x7e\xc9\x8e\xa7\x15\x1f\xa4\x75\xb4\x27\x48\xec\x2c\xec\xf7\x34\x7f\x28\x2a\x2b\x88\xb6\xbc\x2e\x0d\xb6\x07\x4d\xd0\x36\xbf\xe7\x67\xd1\x86\x52\xad\x11\xfb\x6c\x56\x0b\xc6\xd0\x63\x5a\xf1\xfc\x4f\xbe\xe6\x45\xf7\x1b\x22\x08\x4c\x39\x1c\xe9\x4f\xec\xb6\x72\x57\x16\xe7\x9e\x9f\x65\x8a\x27\xfc\xac\xd0\xf5\xd9\xdf\x67\xab\x0e\xf6\xf7\x25\x09\xad\x0c\xbc\x55\xd1\x3b\x89\xeb\xa9\x6e\x23\x99\x9b\x9c\xb1\xf6\x24\x18\x72\xb6\xb4\xda\x17\x45\xbd\x68\xea\xd7\xa2\x9c\xe6\x7d\xb4\xa7\x08\x51\x2e\x57\x6a\x1d\x27\x83\x71\x6e\x57\xc4\x8e\x97\x90\xd7\xd5\x5d\x51\x42\xfa\x92\x3f\x15\xf5\x36\xff\xea\xd8\xfb\xdb\x53\x35\xe6\x09\x36\xef\x90\xd7\x0f\xed\x66\xf4\xf5\x32\xec\x21\xee\xfe\x71\xe3\x23\x5f\x18\xa1\xe6\xed\xd3\xc3\xe2\x7b\x77\x19\xe9\x23\x6a\x73\xbb\x5d\xfd\xca\xe8\x6a\x4f\x69\xa3\xe8\x89\x8e\x41\xe8\x2e\x01\x24\x41\x2a\xb6\xd6\x98\x15\xe7\xf6\xce\x4d\x96\x79\x3c\x3d\x81\x86\xd8\xaf\x71\xc7\xab\xfa\xbe\x2c\x3e\xea\xd7\xd1\x04\x82\x44\x51\xbf\x8b\xa5\x0a\x3d\x93\x9b\xd4\x9e\x8e\x08\x4a\x7b\xbd\x17\x59\x93\xd7\x00\xe5\xf7\xb2\x03\xc2\x68\x4f\x33\x86\xb1\xf4\x7d\x51\xbc\x38\x1a\x18\xed\x7b\xbe\xd1\x24\x4b\x2b\x97\x67\xb6\x1f\xe3\xef\x5b\xa5\x09\x77\x4a\xe8\x2b\x8b\xc2\xb9\x14\x15\x20\xd7\xfa\x67\x9c\x1b\xda\xf7\x84\x61\xbd\xef\x5b\x08\x87\x49\xd1\xd9\xad\x5f\xfb\x7e\x14\x60\xea\xfd\x52\xfe\x52\xf7\xd5\x9d\xa1\x09\x26\xee\x44\x73\x5d\x95\xa0\xd2\xba\x5a\xe4\xea\x70\x81\x5c\x2d\x72\xe5\x18\x81\x66\xaa\x5a\xec\xb3\xb9\x6f\xaf\x1b\x78\x1c\xd3\xf5\x46\xec\x7b\x66\x2a\xfb\x81\x4f\x31\xaf\xa0\xd3\x2c\xfb\x7a\x39\x64\xc5\x7c\x0b\x90\xf6\x83\x48\x22\x6b\x99\xc5\x19\x6d\xab\xff\x40\x59\xcc\x79\xa7\xda\x0f\x84\x26\xbd\x20\x64\x51\x9e\x27\x36\xdc\x0f\xa9\xe1\xc5\xac\xa0\x7e\x37\xec\x9c\x3f\x63\xe3\x9a\x99\x2c\x7e\x18\x1b\x1d\x38\xc9\xf3\xc3\x85\x7f\xe4\x8b\xca\x2d\x8f\xd9\xf7\x40\x98\xc1\x98\xbe\x40\x6d\x59\xa5\x9c\x6d\xf6\x89\xf4\x91\x35\x1e\xb9\x94\x47\xb6\xd3\x27\x4a\xa2\x1b\x62\x89\xbc\x0e\x35\x7f\x4b\x73\xa3\x69\x36\x0c\x53\xb4\x1f\x05\x06\xb1\xd8\x3a\xc4\xa3\x1c\x90\xf6\x23\x4e\x89\xed\x0f\x38\xe5\x76\x57\x18\xbf\xd8\x48\xb1\x20\x76\x31\xe4\x71\xbd\xf9\x49\xad\x5b\xfb\x11\x90\xa0\xcb\xbf\x23\xf1\xe7\x0c\xb8\xb6\x1b\xcb\xe3\x61\x13\x79\xd9\xba\xcd\x3d\xf6\x4e\xfb\x14\x12\x24\x15\xdf\xc9\x21\xdd\x49\xfb\x77\x89\x2e\xdc\xa9\x75\x4c\x9b\x1a\x56\x4e\x7b\x28\x70\x97\x8e\xa9\x0c\x2d\x15\x97\x4e\x11\xb6\xe3\xce\x8d\x93\x40\x18\x6d\xe9\x2f\x13\x32\x63\xed\xb3\xd8\xd0\xc0\x57\xaf\xa9\xae\x4f\x19\xe8\xda\xc6\x82\x93\x87\x64\x4a\x1b\x45\xb7\x57\x9e\xd7\x8e\x5b\xc4\x1e\x4b\x3c\x89\x1e\xdf\xfd\x62\x35\xfa\x3b\x0f\x00\x77\xaf\xa7\x46\x66\xd0\x54\xdf\xd2\xd6\xe3\x33\xaf\xf2\xd1\xd0\x16\xcf\xbf\x50\x11\xfa\xe8\xc7\x1c\x5f\xd3\x52\xe1\xc6\xb5\xcb\x78\xdd\x4e\xda\xe1\x53\x89\x48\xfb\x43\xe6\x4c\xd7\xf8\x63\x27\xdb\xf8\x8a\xa2\x53\x5d\x5e\xad\xbe\x58\x58\x2e\x71\x57\x92\xa1\x51\x41\xe1\x97\x4b\x66\x6b\x93\x6d\xd0\x76\xe4\x3d\x05\x9c\x1b\xc9\x3c\xf4\x4b\x91\x52\x09\xc9\xaf\x86\x88\x41\xed\x4b\x65\xfc\x56\x63\x6f\x77\x45\x91\x9d\xc6\x0c\x32\xda\x57\x44\x62\x75\x2d\xe3\x55\x57\xd3\x6d\x27\x40\x55\xf3\xf3\xa5\x1b\xa4\x05\xe3\x5d\x5c\xc4\xeb\xba\xa3\x37\xd3\x3e\xc4\x49\x62\x23\x90\xf6\xbc\x6c\x40\x3a\xe2\x46\x30\x23\xb5\x7d\x29\x01\xc3\xc5\xc7\x71\x83\xac\xbb\x90\x06\xe2\xfa\x03\xee\x2d\x8c\x78\x3c\x39\x02\x2f\x02\xec\xaf\xc9\x1a\xf9\x76\x1d\x36\xb6\xe9\xc0\x63\xe0\x79\x1d\x19\xad\x91\xc0\x04\x65\x7c\x90\x6d\xee\x38\x8f\x27\x97\x4b\x22\x9b\x93\xcc\x32\x23\x59\x98\xcd\x6b\x56\xe8\xc0\x0f\x68\x68\x5b\x21\x1e\x79\x5d\x16\xf9\x24\xcd\xa7\x03\x1f\x08\xa6\x06\x0c\xe2\x03\x9f\xb3\xfd\x1e\x6b\xde\x71\x18\x4c\x2e\x19\x48\x12\xc5\x9d\xfc\xd2\xe4\x6a\x81\xa2\xd8\x44\xd0\x5a\xe1\x15\xcf\x50\x6d\x6f\x81\xfa\x13\xed\x5f\xfe\x97\xfc\x9f\x1b\xa7\x29\xe6\x96\x77\xbc\xaa\x3e\x8a\x52\xf5\x24\xfa\x68\xa6\x02\x6f\x44\x80\xa0\x83\x50\x10\xc4\xee\x41\x51\xed\xf6\xdb\x6f\x8b\xe3\x66\xde\x94\x07\x84\xc7\x89\x0d\xb9\x1f\x8b\xaa\xfe\x56\xd4\xa0\x9e\x2f\x83\x7e\xe6\x76\x08\x57\x4e\x9b\xef\xcc\x7f\xac\x37\xc7\x6a\xe7\x74\xd4\x1f\xa0\xaa\x8e\xaf\x3c\x9f\x3c\x16\x51\x80\xb7\xdb\x63\x76\x26\x64\x15\x3a\x88\x7c\x81\x80\x0e\x6d\xd2\x26\xae\x4c\xfe\xac\x07\x95\x9c\x76\x94\xe9\x23\x3c\x3e\x1f\x17\x0f\x27\xec\x42\xc6\x0e\x57\x6c\xf2\x73\x63\x48\xe2\x5b\xcc\xe5\xe9\x9e\x4f\x4c\x6a\x10\x45\x09\x76\xbe\x98\x8c\xe8\x4c\xa9\x4c\x07\x91\x30\xb4\x51\xd0\xba\x2a\xb6\x92\x7b\xdb\xc9\xe7\x06\xcb\x08\x27\xf9\x37\x28\x73\x7e\xbe\xcd\xe3\xeb\x80\x7a\x5e\x18\x0f\x73\x08\xad\xc3\x6a\x82\x76\x77\xcb\x34\x49\x30\x70\x69\xa3\xe5\x6f\x86\x3f\xa8\xf8\xb9\x94\x8d\x0e\xa8\x30\x2c\x02\x8f\x48\xf1\xf4\x7b\x31\x14\xf7\xb4\x43\xe2\x38\x41\x4e\x2b\x31\x90\x43\x75\x0e\xee\xe8\x16\x63\xab\xd5\x86\xeb\x7c\x08\x41\x50\xdd\xa5\x34\xc7\x2c\xee\x73\x9f\x52\xd5\x01\xf3\x3a\x22\x07\x1b\xae\x39\x30\xe7\x27\xf4\x11\x3a\x60\xd4\xc3\xb5\xe7\x08\x76\xd0\xe7\x1b\xed\x98\x01\x53\x31\x38\xcc\xed\x73\x53\x23\x43\xe6\xe8\x1a\x09\x67\x58\x80\xe3\xa2\x68\x6a\x43\x4d\x77\x35\x62\x0e\xd3\x8f\x9d\x88\xc4\xe3\xbd\x2a\x7f\x55\x15\x32\xbd\x4d\xad\xe9\x40\xc4\x11\x56\x1f\x4d\x2a\xa4\xb5\x97\x36\xc8\x58\xf1\xcb\x31\x85\x32\x98\x5c\x57\xfa\x06\x98\xef\xe2\x6f\x5b\x7a\x9d\x89\xc0\x03\x19\x2a\x6c\x89\x71\xde\xde\x01\xb2\x6c\xf1\x02\x79\x7d\x48\x6b\xd8\xc3\x3c\xbf\xab\x0e\x64\x2c\x71\x9f\x2b\x79\x0d\x5d\xb7\xb2\x0e\x54\x02\x7d\x3c\xbf\x87\x77\xc8\x5d\x8f\x8b\x0e\x80\x26\x44\x8f\x93\x5d\x53\x0e\xe8\xf1\x53\x43\x1c\x60\x37\xc0\xf2\xf9\xe9\xeb\xe1\xf4\xb0\xf9\xb6\x79\x38\xb9\x68\x3d\xf4\x42\xe5\x93\x1e\x32\x81\x19\x96\xf2\x6a\x15\x90\x0d\xe5\xc6\xb8\x86\xab\x43\x4f\x25\x18\x27\x99\xb7\x8d\x5c\x2b\x01\x71\x70\x97\xd1\xe3\x85\xbe\x9f\x60\xd4\x5b\x68\x0d\xe5\xae\xc9\xdf\xac\x64\xda\xb1\x98\x50\x35\xcc\x3b\xaf\xa1\x4f\x28\xa2\xac\x72\xf8\xd8\x43\x55\x58\xc6\x92\x19\x6f\x30\xf4\x95\x61\x58\xac\x20\x57\xa7\xba\x38\x29\x5e\x56\xaf\x4e\xd0\x49\x87\xbe\x96\x56\xee\x15\xe7\xaf\x91\x98\x9e\x56\x68\x07\x4e\x71\x18\xd0\x00\x27\x5f\x93\x9b\x30\xd9\xc8\x26\x4c\x52\x97\x3a\x0c\x38\x11\x43\xfe\x65\x0c\x83\x27\xd3\x28\x0c\x84\x4e\x62\xab\x88\x74\xdf\x5c\x8f\xae\xf4\xaf\xc3\x30\x62\xb8\xb9\x9a\x44\xfc\xf6\xcc\x5f\xa0\x97\x8e\xd2\x61\x28\x20\x89\x87\x0a\xf2\x86\x87\xd1\x1e\x25\x1e\x41\x7c\xe6\xc9\x96\x8b\x1d\xd0\x72\xf2\xeb\x24\x26\x98\x62\x84\xfc\xa5\xe4\xef\x30\x84\x6b\xe8\x90\x80\x11\x13\x3c\xf3\x37\x58\xf2\x5a\xbe\x4e\x38\xd0\x6e\x7a\xd5\x75\x18\x91\x90\xb5\x8e\xd0\x06\x29\x7a\xdd\x1f\x2d\xc0\x01\xb9\x00\x0d\x3e\x61\x2a\x71\xa5\xc3\x88\x6b\x2c\x25\xbc\x9b\x8f\xf0\xfc\xd1\x01\xe3\x74\x18\xa9\x08\xb1\xaf\x77\xe9\xcb\x6b\xfb\x69\xf0\x85\xdc\x42\x6a\x26\x17\x54\x09\xe6\xf1\x1f\x06\xc8\xb7\x5f\x31\x1c\xdb\x53\x69\x28\x46\xe5\x83\xcf\x88\x08\x74\x48\x59\x88\xae\x70\x06\x5c\x41\x29\x0a\x5e\x4e\x7c\x83\x90\xca\x08\x45\x88\xcc\x2c\x4f\x41\x76\xca\x80\x93\x71\x4a\xa1\xbb\x96\xca\xa2\x4b\xbd\x0f\xfd\xb0\x30\x0e\x08\x26\x17\xf5\x74\x06\xc5\x91\x16\xb8\xd7\xa5\x2f\xf9\x5d\x51\xf6\x0f\x3b\xda\xfe\xc3\x98\xb2\x44\x1a\x32\xe8\x0f\x74\x27\x86\x18\x6c\x1d\xc6\x82\x19\xcc\x30\xbc\x3f\x7f\x74\x36\x3f\x64\xbe\x4e\xfa\xf5\xec\x2c\xfc\x18\x17\x33\x59\x97\x2c\x92\x9e\x6d\x82\x3c\x34\xba\xdd\x73\x20\xaf\xed\xd4\xe9\xfa\x8e\xe7\x5f\x67\xe2\x85\xe8\x1b\xb7\x7b\xe0\x8a\x57\x69\xee\xf2\x3f\x61\xe2\x47\x24\x72\x45\xdc\xaf\x5f\x6f\x7a\x9d\x27\xd7\x89\x94\x2b\xbb\x1f\x5e\xd3\xcb\x90\x5e\xbc\x7b\x1f\x09\x33\xc4\x31\xd8\x59\x90\xb5\x3e\x4b\xfb\xb5\x39\x12\xc7\x55\xa7\xc1\xff\xb1\x92\x73\xee\x34\xc1\xb1\x17\xcc\xba\x50\xe8\x79\x1c\xbe\xee\x76\x8e\x73\x53\x87\xc2\xf7\x8d\xfe\xbf\x9d\x3d\xc6\x2d\x9f\xc7\x93\xe9\x50\x84\x49\x2c\x3a\xf9\xc8\x63\xe1\x16\xea\x69\xf2\x95\x45\x62\x32\x95\x9f\x6a\x89\xba\x71\x52\x12\x23\x7d\xf1\x58\x74\x5f\x51\xfa\xbe\x73\xaf\xd1\x6c\x1b\x76\xcf\x21\x39\xbd\x1b\x48\x59\xd4\xfb\x56\xdf\x16\x0f\x5f\x37\xee\x1a\x8a\xfa\xc4\x77\xd0\x9b\xa1\xd8\xb0\x35\x03\x6c\x4e\xbc\xb7\x33\x0c\x2a\x49\x30\x20\x2f\x70\x42\xf0\x6c\xa4\xf5\xac\x43\xc5\x99\xe9\xe9\x93\x48\x93\xdb\x3a\x66\xd8\xa1\x63\x0f\x43\x98\x20\x70\xd3\x59\x52\xe3\x39\xf5\x3a\xb1\x3a\x84\xd6\x69\xc5\xc0\xb7\x84\x23\xf0\xf3\x22\x57\xb6\xf8\x56\x8d\xc2\xa2\x10\x68\x8c\xa0\x81\xc3\x1b\xeb\xc1\x30\x3a\x04\x30\x9f\xd5\x76\xa6\xb4\xfe\xcf\xa8\x8e\xa4\x43\x4d\x12\x4c\x4a\xa0\x74\xc4\xa8\x9e\x35\x9e\xff\xc4\x13\x89\xd3\x0f\x33\x6d\xb3\x06\x7c\x3b\x5a\x8d\xc4\xd3\xdc\xd1\x13\xb9\xd5\x34\xdc\xb2\x88\x1f\x0b\x2c\xdd\x3f\x6e\x9f\xb6\x4f\xf7\xe3\x19\x46\xfc\x24\xc1\x62\xd3\xe3\xf2\x61\x68\xb0\x89\x0f\x3e\xed\xbf\xde\x80\x25\x55\x93\x80\x49\xdf\x3a\xa0\x38\xe1\x6d\xad\x96\xcb\xd9\xa6\x1a\x4d\x42\x46\x11\xe9\x77\xe6\x3f\x0c\xf0\xd3\x7d\x0b\x12\x26\x80\xb0\xe1\x73\x9a\xd7\x77\x45\xb9\xe1\x65\x76\x75\xbc\xb1\xd5\xe7\x5b\x03\x09\x21\xc1\x36\x27\xf7\x0d\x17\x5a\x1b\xed\xbf\xd1\xfc\x25\x21\x18\x4d\xd7\xd6\x09\xdb\xe6\x8e\xf1\x4a\x93\x50\x1b\x82\x69\x14\x6d\x40\x95\x28\x69\xb8\x4b\xb6\xea\xae\x2c\xce\x6b\x7e\x9d\x5c\x88\x70\x1e\xdb\x39\xdf\xfa\x5b\xa8\x06\x6d\x54\xe5\x26\xe3\x40\x60\x2e\x35\x73\xf0\x3c\xcb\x26\x33\x9a\x36\x24\x52\x02\x23\xfc\x45\x59\xdf\x63\x13\x97\xdb\xdd\x08\x0d\x43\x5c\x17\xf7\x50\xb7\xf7\xdb\xd7\x75\xdb\x43\x31\xa6\xd7\xfe\xb2\x4a\x03\x43\xd4\xaf\x6e\xbd\x97\xc4\x73\x71\x25\x52\xf2\xad\x9a\x4f\x22\x0c\x42\xa9\x41\x51\x61\xc5\xab\xc6\xe5\xbb\xbc\xfe\x0e\xd7\x39\x77\x87\x50\xae\x50\xd1\xd1\x2a\x10\x1d\x2e\x45\x5e\x15\x98\xdd\x69\x83\xcd\x5f\x64\xc3\xbb\xef\x45\x2d\x79\x8d\xe4\xf9\xe1\x83\xdf\xc8\x64\xda\x51\x31\x89\x31\x85\xf0\x57\x91\xe6\xf7\x1d\xdb\x69\x37\xcd\x59\x04\x89\x35\xdb\x1b\x23\xec\xfc\x30\x89\x0d\xdc\xc0\x98\x79\xfe\x98\x69\xb9\x27\x57\x70\x63\x14\x13\xae\x91\x0e\x5b\xf0\x2b\x18\x74\xe1\xce\xcf\xe3\x84\x12\x74\xa2\xee\x79\xc6\x6b\x5e\xf1\x4e\xc6\x51\x93\x44\x19\xa3\xc8\x95\xda\xc3\x7b\x0a\x1f\x3f\x23\xf8\xd0\x84\xfb\x2c\x12\x48\x9e\xde\xee\x67\xe8\x6c\x61\xfa\xfd\xb7\x71\xeb\xc2\x28\x11\x46\x78\x44\x8c\x00\xf6\x8f\xf6\xc1\xdf\x96\x93\xf4\xa9\xef\xbe\x2f\xa7\x21\xc2\x60\x3b\xa4\xe5\xf3\x6a\x32\x4d\x79\x9c\x60\xe5\xac\xf5\x0b\x06\xfc\x28\x9a\x70\x6e\xfa\xf5\xd6\xa0\xdb\xe5\x64\x98\x4f\xd7\x90\xf1\x6b\x67\xbb\x08\x07\xa3\xa5\x63\x48\x5d\x4c\x5d\x69\x93\x77\x87\x45\x1c\x60\x0c\x77\x86\x9a\xbb\x18\x65\x04\x2e\xf8\xe9\x96\x43\xa4\x67\x89\x13\xd0\x47\x78\x28\x5e\x6e\xeb\xf8\x9a\x28\x8f\x63\x30\xf3\xc4\xeb\x62\x24\x74\xe2\x6e\x42\x45\x1c\xf9\x5b\x34\x4f\xb3\xa6\x9c\xc0\x0c\x35\x51\x2c\x11\x46\xbf\xab\x44\xfa\x92\x39\x32\x69\x4d\x20\xa1\x7e\x64\xf3\xf1\xa6\x19\xbd\x2c\xce\x96\xb9\x7c\x3c\x52\xc7\x12\x6b\x1f\x45\x9e\x5d\x51\xbf\xcb\x19\xb8\xc8\x0b\x39\x05\x47\xcb\xdf\x7a\x6a\xbb\x89\xce\x81\x8e\x3c\x2a\x50\x6e\xc8\xa1\xc5\x8e\x7f\x1c\xe6\xd7\x47\xe4\x7b\x86\x54\x7f\xf1\xf5\xf8\xe5\xb4\x5a\x3c\x3d\x6e\x9f\x5c\x20\x17\xf9\x01\xc1\x24\x8a\x4a\xab\xd6\x5d\x5e\xdd\x38\x8f\x51\x40\x42\x9c\xbd\x4b\xf8\x9b\xe7\x86\x06\x77\xca\x1d\xa7\xa3\xd0\x4b\xa8\x15\x93\x79\xe0\x02\xb2\xc9\xd1\x20\x42\x98\xee\xd3\xe2\xb8\xfd\xb6\x39\x2d\x0e\x87\x4d\x77\x03\x61\xec\x83\x8b\x8b\x9e\xf3\x11\x3d\x9f\x8e\x42\x26\x90\x3f\x7a\xf9\x3c\xa4\xae\x6a\xff\xae\xa9\x53\x87\x42\xba\x74\x27\x62\xed\x8e\x27\x31\xa6\x99\x44\x63\x4a\xd2\x95\x4b\xc0\x8d\x5f\x4c\xa8\x14\x7e\xa9\x2f\xcb\x9f\x94\x9e\xc6\x5f\x37\x0a\x21\x44\x97\xed\x95\x97\xed\x7e\xf3\xef\xa6\x28\x9b\xf3\xd8\xaa\x46\xa1\xe6\x58\x4b\x1a\xfa\x67\x9b\xa7\xf5\x69\xbd\x38\xba\xcd\x30\x22\x31\x4b\x86\x54\x41\x18\xdc\x4c\xee\x8f\x08\x81\xfd\xa1\xcb\xb4\xae\xa4\x43\x74\xe9\x28\x0a\x02\xe4\xcd\x38\xd9\x74\xc2\x98\xab\xf4\x66\x6d\xb4\xe3\x0d\x40\xaf\xdd\xac\x52\x18\x63\xc5\x75\x14\x11\x86\x41\xca\x91\xe7\x57\xde\xfd\x46\xa2\xf0\x0d\x62\xf3\xcf\xb1\x68\xca\x9c\x0f\x5c\x9d\x88\xd2\x08\x63\x0e\x73\x07\x8f\x57\x04\xf5\x8c\xbe\x39\x8d\x0d\x48\xde\x8c\x38\x80\x9c\x59\x90\x11\x65\x1c\x25\x1d\x20\x57\x5b\x59\x2c\xaf\x7d\xcd\x38\xa2\x5c\x32\x7f\xbc\x55\x9b\x66\x96\x39\x19\x33\x1d\x51\x29\x3d\x36\x64\x2b\x5f\x65\xfc\x43\x70\xf9\xb6\x19\x62\xfa\xec\xe0\x38\x0e\x10\x0f\x0e\x95\xe4\x16\x07\x3a\xa9\x56\x46\xac\x8d\x03\x0c\x64\x9c\xa7\xb9\x6b\x0a\xee\xd6\x27\xe3\x5c\x0d\x5c\x35\xcb\x7d\xee\x8e\x26\xb2\x83\x32\x7e\x19\x91\x56\xea\x88\x93\x08\x25\x47\x75\x51\xc2\xbb\xed\x89\x32\x09\x6d\xbb\x77\x58\x7a\xfd\x6e\xb8\x42\x4a\xdb\x26\xcf\xd2\x49\xb7\x9d\x8e\x5a\x73\xec\x50\xbf\x07\xf9\x0a\x59\x96\xe6\x2f\xd8\x44\xb7\x86\x9a\xa7\x59\x35\x1d\x2f\x34\x2e\xb5\x43\xda\x2e\x97\x55\x91\x57\x03\x91\x99\x59\x3f\x32\x12\x81\x11\x57\x7c\xdc\x3e\xad\x4f\x77\xcf\x5f\x9f\xd6\xa8\xcb\x7c\x5a\x3c\x3e\x7f\xed\x8d\x88\x20\xd2\x49\x14\xec\x00\x11\x91\x9b\x1f\x97\xac\x28\x47\x1d\x54\x6e\x2c\x35\x25\x03\xae\x3a\xef\x6f\x16\xe6\x11\x09\x6a\xc8\x8c\x75\x9a\x65\xad\xf3\x34\x96\x78\xf8\x47\xbb\x42\x24\x44\x68\x48\xf1\x6d\x9b\xc4\x63\x3f\xbf\x64\xac\xd1\xac\x81\xf5\xc8\x9c\x88\xfc\x10\x1f\xae\x23\xc9\x0c\xce\xa3\xc8\xe1\x03\xe0\xad\xfb\xb3\x8e\xb1\xbd\x6d\xb1\xdd\xaf\xf7\xcf\x3b\xd7\x9a\xf7\xf4\xf5\xf1\xe0\x86\x40\x44\xb0\x03\xd3\xa4\xf2\x70\xf6\x6c\xcf\x17\xd4\x0b\x9c\xd6\xfa\x47\xb7\xac\x3d\x1f\x2d\xa9\x82\x2c\x7d\x87\xb2\x8d\x23\xc6\xd5\x36\x37\x2e\x10\xd4\x42\xce\xda\x17\x7e\xc3\x02\x35\x79\x9b\x9a\x80\xb2\xf0\x8e\xc7\x22\xc7\xe4\x52\xc6\xab\x6a\xf3\xa3\x86\x5c\x0d\x57\xc0\xa7\x2c\x47\xb7\xff\xeb\x2e\x9d\x84\x98\x34\xae\x3f\x8a\x2f\x98\x1c\xa9\xea\x65\xaa\xaa\x75\xaa\x35\x94\xd0\x2e\xd5\x91\x61\xd0\x32\x70\x14\x38\x98\x64\xa8\x26\xcd\x42\x9a\x7a\xc4\xf3\x4d\x97\x54\x9a\x23\x45\xf7\x40\x53\x40\x53\x8f\x9a\x84\xa0\xd9\x30\xc0\xb6\x0d\x7e\x29\xba\x9a\x21\xf5\x7d\x89\x35\xbc\xe7\x73\x9e\xae\xe1\x47\xf7\x67\x11\x61\xf8\x71\xb7\xd9\x9c\x0e\xdb\x87\xe7\xee\xef\x40\xb0\x05\x77\x51\x35\x7b\x9e\x9e\x1b\xf7\xf7\xc0\xe3\x18\xee\x23\x21\x88\x25\xdf\x9e\x0d\xf5\x69\xe0\x9b\x7a\xfd\xa1\x2e\xd3\xcb\x6d\xcb\x88\xa6\x01\x09\x30\xf9\x07\x3f\x2e\x69\x79\x5d\xf6\xad\x94\x9a\x86\xbe\x29\xee\x9d\x2e\x65\xf1\x62\x60\x8a\x33\xa5\x27\x1a\x06\x80\x9f\xbb\xaa\x79\x0d\x03\x88\xab\x3d\x1c\x85\x31\x86\x4a\x9d\x8c\xcf\x72\x90\x6a\x77\x63\x08\xc7\x5e\x8a\x33\xff\xd1\xf3\x10\xf7\x0e\x05\x8d\xa8\x99\xd4\x2f\x58\xc2\xb2\x15\xb2\xee\xa0\x22\x08\x0c\xbb\x4b\x33\xe8\x11\x9c\xed\xdf\x8d\x3e\xf1\x09\xd1\xa0\x8b\x5c\xad\x78\x96\x4d\xe4\xdf\x67\xfa\xcd\x34\xa5\x84\xe1\x05\x77\x8b\xfd\x61\xb3\x3a\x9c\x76\x9b\xfd\x69\x73\xfc\xb2\xd9\x9f\x96\x8b\x83\xdb\x25\x29\xe5\x91\x36\x08\x3e\x53\xcd\x1a\x32\x10\x6b\x1a\xfb\xa1\xb6\x11\x09\x92\xf3\x8c\x5f\x59\xec\xc7\x88\xbf\x7e\xe5\xb9\x42\x06\x1a\x28\x87\xc2\xf1\xf3\x26\x83\x32\x4a\x10\xfa\xb5\x5b\x3c\xb9\x9f\x61\xcc\x70\x00\x7d\xdb\x1c\x8e\x9b\x75\x7b\xa7\xab\x4d\x67\xfc\x28\x4b\x28\x06\xf3\x55\xfa\x92\x2f\x5e\x4a\xc0\x08\x63\xbc\xc5\xd2\x44\xc5\xb6\xfb\x3e\x7f\x6b\xd7\x86\x3b\x97\xfb\x9e\x1a\xaa\x3d\x0d\x30\xd3\xb3\xb7\x79\xd3\x95\xdc\x5d\x87\x20\xaf\xc8\x2b\xaf\x0c\x7e\x72\x32\xff\xb8\x0a\x31\xcc\x30\x0d\x67\x03\xa6\x68\x73\xc8\xc6\xb4\x2f\xed\x45\xbb\xbf\x6b\x81\xa9\x3e\xa4\xf0\x4e\x6f\xf2\x0c\x93\xb7\x26\x88\x71\x31\x1b\x03\xc2\x5e\x95\xd7\xaa\xe6\xd9\x63\x07\x87\xd6\x54\xd0\x08\x73\xab\x07\x6e\x37\x1f\x83\x73\xec\xb9\xd8\x35\x95\x41\x1c\x77\xe4\xa0\x35\xcf\x16\x52\x42\x55\x15\xe5\xf5\x00\x65\xda\xf9\xc6\x54\x12\x85\x6d\x12\x39\x7c\xec\x1e\x56\xfb\xef\xa9\x43\xf2\x34\xbf\x82\xda\x51\xc9\xfd\x90\x39\x1c\x83\x6a\x8d\x5f\x99\xf3\xcc\xe2\x16\xbb\x1f\x50\x89\x41\x2a\xf5\x42\x6c\xff\x68\xb7\xa1\x2a\xe1\x08\x80\x33\x29\xf9\xb1\xf0\xb3\xa6\x0a\x8c\x8e\xb8\x49\xa5\xa3\x8c\xf8\x88\x78\xcd\x50\x23\x78\xe3\x7f\xed\xb9\xc0\x65\xd0\xf1\xce\xff\xe2\x53\x80\xf0\x30\xe7\xf0\xb8\xf8\xe3\xb4\x78\x78\x78\xfe\xbe\x59\x9f\x0e\xc7\xc5\xfd\xe6\x14\xb8\x5b\x01\x19\x63\xfb\x76\x7b\xb5\x81\x44\xd9\x78\xcb\xa0\xa0\x04\x5a\x35\x4c\xb2\x20\xf9\xe8\x27\xe6\x4f\xc7\x31\x66\x4c\x7b\x57\xb6\x1a\xa8\xeb\x99\x41\xb1\x17\x46\x4e\xa6\x65\x48\xb7\xb8\x1e\x94\x06\x1e\xd3\x89\xdd\x8c\x3d\x9e\x60\xe8\xba\xdb\x5b\x27\xfa\xf8\xe5\xb4\x7d\x3a\x7d\xdf\x6c\xb1\xd2\x7a\x7a\x5c\xfc\xd1\x5d\x5f\x18\xf0\x73\x55\x17\x17\x43\x13\x71\xaa\x6a\xb8\xb8\x67\x8e\x7d\x1a\xa3\x83\x88\x5b\xb5\xcd\x65\x9d\x0e\x9b\x76\x3d\xdb\x8b\x3f\x6c\x1f\xb7\x6e\x55\xc7\xa1\x97\x60\x65\xc3\x28\x47\xdf\x37\x73\xa5\xa0\xd1\x5b\x88\xc3\x10\x82\x04\xfb\x86\xb8\xcc\xd2\xbf\xe1\x94\xc3\xc7\x1e\x11\x69\xeb\xc3\xbf\x1b\xa7\x44\xd6\x99\xc1\xe9\xd9\x91\xc0\x15\x6c\x66\x07\x3a\x93\x73\xdd\x1e\x3a\x0e\x2d\xd4\xdc\x32\x5e\x7c\xff\xac\xc2\x19\x13\x8f\x61\xc1\xe2\xb8\xf8\x97\x7b\x28\x12\x28\x8b\xf7\xce\x37\x86\x28\x61\x51\x8a\xb4\x2e\x79\x79\x5d\x15\x8e\x1b\x4d\xc7\x84\x51\x93\x01\xaf\x6c\xc6\xdc\x75\x51\x4f\x58\xba\xda\x91\x40\x2c\x86\xe0\x74\x29\xe1\xf4\x76\x95\xa7\x54\x16\x79\xfa\xdf\x13\xf6\x98\x9f\xf2\xe6\x6c\x04\xdd\x27\x1f\x36\x22\x9e\x0a\x5c\x79\x3f\x87\xeb\xd0\xe9\x8a\x23\x12\x59\xa6\xa5\xfc\xdd\xc0\xa2\xc7\x78\x7a\x1d\x47\x51\x84\x74\x6f\x15\x97\xbc\xfc\xbe\x59\x74\x7f\xd7\x0a\x03\x74\xcb\xd3\xfa\x5a\x94\xf5\x22\x4b\xf9\x24\xe2\x89\x63\xce\xfd\xbe\x27\xe9\x21\xad\x86\xda\x44\xb3\x5d\x36\xed\x39\xa6\x57\xdd\x98\x0a\x9b\x9f\x9b\xc4\xca\x71\x12\x98\x46\xa2\x12\xe9\xce\x2c\x0d\xb2\xbb\x39\x2e\x00\xac\x5a\xe9\xa2\xa9\x27\xb1\x5e\x2c\xa8\x71\xe6\x2f\xfc\xba\x06\x51\x4f\x8f\x72\x1f\x31\x55\x0f\xcd\x05\x90\x9c\xea\x93\xc2\x47\x2c\xe3\x90\x40\x87\x43\x69\xfd\xe6\x4f\xa6\x87\x8c\x63\x04\xd5\xed\x37\x87\xcd\xfe\xdb\x66\x7d\xb2\xff\x61\xa5\xc7\x4f\x8b\x6e\x29\x40\xe0\x63\x3d\x97\x77\x18\x52\x77\x80\x78\xc8\x37\x70\x49\xff\xfe\x9b\x9f\xce\x5c\xbe\xa6\xf9\xa7\xca\x3a\xee\x9c\x58\x23\x14\xe0\x91\xff\x30\x3a\xe3\x6e\x8e\x7d\x3d\xac\xbb\xeb\xf2\x00\xb3\xb4\x5c\xa9\x8e\x26\x68\xdc\xf9\x7f\x9b\xda\x8d\xb5\x6f\xe4\xb4\x7b\x98\xe5\xe1\x35\xbd\x0c\x62\xd6\x58\x87\xd2\xf5\x7a\x7e\x2b\x6a\xa8\x76\xd0\xcb\x77\xb8\x21\x4c\x98\xd2\x61\x6b\x8e\x72\xa8\x57\xbc\x7a\xed\x8e\x69\x23\xb4\x27\xd2\xfa\xa3\x28\x55\xd7\x25\x9e\x8d\xd8\x11\x34\xf3\x23\x03\xbc\x35\x93\xeb\x6b\x9e\xa2\x84\x87\x4e\x0d\x3e\x6a\xa6\x34\xcf\xfc\x98\x46\xe6\x79\x4d\x56\x1f\xd1\x19\x48\x60\x68\x42\x93\xee\xd2\x61\x1c\xe2\x40\x13\x53\x67\x17\x3f\x19\x4f\x13\x46\x42\x8e\x84\xae\xcb\x46\xbe\x5d\x07\x08\x09\x16\x45\x44\x5b\xe1\x11\x78\xce\xb1\x37\x24\xcd\x5f\x9c\x42\xcc\x27\x33\xdf\xbd\x5b\x16\x49\x19\x58\x86\xe0\x3a\x83\x95\x56\x63\xa8\x1d\x8b\x80\x06\x9d\xcc\x97\x03\xcc\xcf\x7e\x7f\x46\x15\xc5\x84\x73\x5a\x1d\x5e\x9b\x41\xb3\x86\x66\x14\xbc\x81\x05\x44\xae\xfd\x61\xaa\x72\xfc\xa0\x71\xc0\xc1\xd0\x4f\xbd\x17\x6f\x30\x6c\x02\xf8\x6d\xc6\xd9\x64\x31\x0b\x51\x05\x4a\xb6\xce\x69\xae\xee\xa1\x36\x30\xa1\x31\xbb\xc7\xe4\x56\x19\x91\xda\xe4\x4d\xd3\xfa\xf8\x9a\x56\x5b\x59\xdc\x15\xe5\x17\x9e\xe9\x67\x83\x14\x19\xfa\x51\x8c\x45\x86\x08\xc6\x4a\xc8\x61\x91\x11\x26\xbd\x2e\x9a\x31\x6a\x32\x88\xf7\xa8\x9e\xd2\x9d\xcb\xa9\x36\xbd\x57\x1f\xbc\x54\x28\x74\x36\x80\xa2\x32\xa6\xa5\x97\x74\x0f\x6b\x76\xd6\xc9\x75\x93\x00\x38\xef\x3a\xdc\x27\xd5\x95\xe9\x58\x4a\x51\x7c\xca\x18\xa9\xd6\xae\xba\x1f\x4a\x98\xc1\x62\x67\xa0\xeb\x90\x4e\x66\x29\xd7\x91\xab\xbd\x3d\x14\xf2\x6d\xdf\xbe\xed\x4f\x3e\xb2\xa0\x04\x13\xf2\xdc\xcc\xb4\xef\xb0\xe2\xed\x26\xa2\x9b\x0e\x3d\xce\x44\x6c\x98\x4a\x9f\x2f\x90\xf7\xc4\x9a\x9a\x09\x1e\x3a\x51\x88\x76\x4b\x3a\xd4\x45\xe9\x88\x97\x06\xd7\x97\xe0\x94\x28\x1f\xf9\x8f\xb9\x25\x25\x94\x29\x6d\x61\xe1\xa5\x7c\x9f\x12\xe0\x6a\x86\xb3\x16\x61\x87\x86\x26\x04\x41\x89\x48\x29\x51\x35\x67\x77\x33\x32\xf2\x8c\xdc\x8f\x7c\x05\xd5\x64\x30\x28\xc8\x76\x43\xa8\xc0\xde\xc0\xb4\x3a\xa9\x94\xbf\x14\x39\xcf\x7e\xeb\x63\x63\x26\xc1\x30\x3a\x9f\x5a\x57\xcb\xfb\x81\xd1\xec\x67\xd5\x8f\xff\x8d\xfe\x6f\x60\xd7\xe8\xff\x39\xaa\x19\x7b\x29\x15\x29\xc7\xc2\x71\x4c\xe5\x1b\x94\x87\xeb\x59\x14\xe3\x4c\x2b\x53\x0a\x88\x1a\x62\xc1\xd5\x1e\xe7\x94\xbb\x5d\xf0\x00\x9d\xd0\xac\x78\xb9\x4f\xdf\xa7\x3d\xbf\x6e\x10\x07\xdc\xff\x8d\x79\xb8\xe7\xd5\x1e\x9a\xb4\x9c\x6e\x76\x0c\x89\x60\xec\xbe\xe0\x0c\x69\x67\xaa\x40\x29\xe6\xe4\xae\x0d\x13\xce\x80\xee\x7a\x32\x5d\xb4\x97\x60\x07\xa6\xa5\xc3\xbc\x91\xf2\x74\xfb\x36\xd3\x9c\xe3\x2f\x2e\x1e\x1f\xe6\xf4\x88\xa7\x3b\x4f\x8f\x96\x61\x5a\xd2\xb8\xd7\x24\x5d\xbc\xbc\x94\xf0\x32\x32\x17\x66\x5c\xe2\x79\x11\x52\x5a\x1c\xa1\xaa\xa9\xf3\x9b\x12\x2f\x36\xc2\x1b\xa2\xb9\xde\x17\xd9\x94\xa0\xf5\xd7\x50\xf0\xc4\x93\x04\x53\x24\xbb\x3f\xf7\x58\x5d\x77\x17\xf6\x43\xe9\x64\x2f\xef\xf8\x19\xd4\xa1\xe6\xe5\xf2\xfa\xc8\x27\x12\x31\x3a\xf1\xa5\x40\xbb\x71\x4e\x73\xd8\x56\xcb\xf4\xa5\x13\xcf\xd2\x89\x0f\xa6\xd1\x14\x33\x9f\xcb\xa2\xa8\x4c\xfd\x6f\x7c\x81\x20\x08\x30\xcf\xbf\xee\x02\xd7\x24\xe4\x4c\xcc\xc9\x61\xcf\x3a\x16\x09\x89\x4d\x4b\x30\xd2\x15\xb8\x5a\xeb\x6f\x93\x31\x0a\x0c\xb7\x87\x31\xe1\xc5\xc0\xf9\x98\x75\xaa\x92\x28\x32\xec\x3e\xff\x6a\xd4\x8b\x89\x9b\x7f\xea\x3d\x24\x34\x08\x3d\x27\x9f\x98\xd7\x47\xfe\x32\x84\x11\xba\x69\x92\x50\x0e\xb8\x26\xdb\x88\xdc\x09\xf6\xeb\x84\xf9\x49\xd2\x59\x16\x0b\x22\xd3\xc5\xe4\x35\xb1\xd0\x68\xb6\xb6\x21\x8c\xab\x10\xed\xdb\xc0\x7c\xbc\x53\xba\xd1\x49\x4c\x3b\xaa\x1a\xd9\xa0\xa3\xbb\x2e\xa0\xfa\x06\x75\xd1\xfd\x6c\x22\x28\x74\xf4\xcd\x3f\xa7\x98\x9f\xbc\x72\xc6\x8d\x24\xc8\xbd\x61\xf2\x4e\x2f\x13\x4b\x9e\x24\x94\xa2\x96\xde\x1a\xde\x71\xbf\x44\xd8\x88\xa1\x78\x4f\xf3\x97\x21\xf5\x90\x4e\x12\x69\x48\x9b\xba\x92\xc8\x7c\x76\x26\x0c\xdc\xae\x9f\xf0\x48\x2b\x18\x10\x4f\xbf\x34\xe5\x68\xc9\xdc\x3a\x61\x09\xa7\x89\xf1\xdc\x71\x02\xb4\x5e\x56\xf9\x9c\x6f\x32\x90\xa3\x9d\x79\xfa\xd4\x3f\x59\x38\x5c\x78\x2e\xb3\x7c\x04\x7e\xde\x41\x39\x6d\x9a\xd5\x89\x60\x02\x27\xd1\xaa\xbc\x5e\xde\xd3\xca\x32\xf1\x4d\x5e\x95\x10\x80\x02\x81\xc7\x0e\x8e\x90\x08\xd0\xa2\xd3\x47\x47\x5a\x19\x67\xbd\x12\xe9\x29\xd2\x9a\x49\x13\xbf\x3d\x80\x7a\x81\xd2\xed\x23\x6e\x48\x98\x60\xaf\x89\x79\xd4\x3b\xde\xc8\xae\x50\x9f\xc8\xc8\xc3\x42\xb2\xf1\x98\x27\x7b\x75\xa2\x42\x15\xba\x5a\x59\x9a\xc3\xd7\x8b\x09\x6e\x26\x4f\x05\x54\x20\x3b\x21\x3e\x0c\x16\xbf\x67\xfd\xf8\x04\x62\x81\x71\xef\xda\xe4\x8b\x41\x2d\x8f\xab\x4f\x86\x6a\xcf\xc7\x1d\x44\x34\x57\x83\x2f\x7c\x2a\xd4\x67\x45\xa3\x44\x4b\x02\xc1\x10\xda\xb7\x2f\x44\x31\x91\x25\xd3\xdc\x13\x7e\x18\x1a\x9a\x73\xf7\xf4\xdc\xd3\x32\x09\x7b\x3f\x7b\x0f\xd5\x0d\xc2\x82\xfb\x89\x87\x5d\xe8\xe7\x7f\xd6\x7c\xc4\x7d\x61\x24\xc6\x31\x01\x62\xb9\x90\xbf\xbf\xa6\x19\x3c\x98\x1e\xc1\x9f\xb6\xd3\xd9\x6b\x84\xd2\x28\xd7\x3d\x5e\x0f\x73\x6c\xb1\xbf\xfa\x77\x6a\xc9\xe6\x6f\x34\xf2\x95\x49\x58\x56\xf6\x2e\x2f\xd3\x64\x1c\x8f\xc2\x48\xc6\xb6\xbd\xe2\x3a\x5b\x42\xe6\x11\x11\xd8\xca\xbf\x7c\x58\xba\xb7\x1a\x69\x5f\xdb\x50\xfb\x81\xe7\xea\xcc\xcb\xb7\xc9\x3b\x65\x3e\xc1\x3d\x42\x37\xb9\x74\x67\xb1\xd8\x00\x65\x6a\xc8\x32\x07\xc6\x9d\x77\x0b\x39\xe3\x0a\x13\x74\x9d\xff\xdd\xb7\x9c\x8e\xb3\x8d\x9c\xfb\x31\xda\xd7\xbb\xc5\xd1\x45\xde\x9c\x2b\x46\x84\xbb\x3d\x54\xde\x28\x9f\xf5\xa2\x42\x09\xc3\x11\xe6\x8d\x8b\x50\x89\x64\x44\x70\x31\x82\x5a\xb8\x0b\x0a\xe2\x4b\x2b\xc9\x7c\xe4\xa5\x93\x7b\xee\x8f\x6a\x26\x2c\xc2\x0c\xab\x19\x8b\x66\xe8\x96\x71\xa1\x62\x44\xc7\x3a\xa6\xd2\x9f\xe5\xaf\xb8\x00\x2a\x8d\x94\x17\x7f\xe3\x59\x5a\x54\xc3\x5a\x33\x97\x9e\x47\xe8\x50\x25\xd0\x82\x72\xc6\xd7\x50\x3e\x45\xe4\x40\x0e\x1f\xa7\x62\xae\xf5\xde\x8e\x83\x40\x7b\x36\xb7\x58\x22\x8a\xcb\xfd\x0c\x30\x46\xdd\xf7\x2d\xe4\x5b\x0f\xbd\x1c\xda\x43\x0e\xd2\xc3\xf0\xde\xd2\xb8\x8e\xe0\x73\xdd\x1b\xd6\x9c\xe1\x44\xe7\x8d\x4a\xeb\x23\xfc\xb0\xe4\x1a\x23\xcb\xca\xb5\x30\x50\x28\x5b\xc1\x6d\xc3\x71\xd0\xe6\x01\xef\x8a\x72\x33\x8b\x53\xe2\x1a\x12\xcc\x43\x9e\x44\x73\x45\x1a\x9d\x02\x89\x60\xfe\xe1\xd2\x31\x17\x11\x9e\x6f\x04\x1a\x45\x73\x6d\x63\x68\x07\x5c\xde\xaa\xd1\xa3\x0a\x8f\x48\x2c\x7e\xdb\x26\x48\xd3\x52\xd3\xce\x90\x45\x65\x93\x01\xa3\x7b\x13\x5e\x64\x20\xe9\x0a\x64\x96\xe6\x80\x38\x5d\x53\x88\xe8\x25\x66\xdc\x50\xc5\xb0\xb1\xe2\x74\x6a\x03\x42\xc1\x7b\x64\xdc\x14\x81\x24\x7c\x6d\x82\x40\x75\xce\x3e\x86\x60\x2c\x11\x68\xae\xe2\xae\xff\xda\x64\x31\x1d\xdd\xbf\x1b\x43\x02\xca\xac\xbb\x62\x01\x08\xb3\x3a\xf5\x6e\x34\xf5\x2c\xfd\x8f\x61\x5d\x3c\x80\xe5\x5d\xd9\xc3\x7f\x67\xfc\x6f\x41\x62\x88\x7b\x05\xe5\x43\x53\x5e\xca\xb4\x0b\xb0\x04\x51\xa6\x9f\xfb\xd0\xa8\xbf\x9a\xdf\xfb\x54\x80\x20\x60\x5a\xff\xef\x0a\xe7\xa3\x88\xc8\xe7\xb8\xd6\x30\x7e\x1f\x89\x0f\x8e\x26\x96\xa0\x91\xc9\x1b\xf3\x2c\x6b\x57\xed\xd0\x95\x71\x23\x98\x01\x68\x5a\x26\x26\xe3\x69\x4c\x32\xe1\x22\x8e\x3d\xc4\x2f\x2c\xf7\x8f\xdd\x9f\x58\x82\x24\x45\xcf\xff\x1e\xae\x3d\x11\x27\x1e\x8a\xec\x7d\x00\xbc\x65\xd7\x5b\xc4\xb6\x88\x65\x80\x99\x09\x47\x86\x51\x7c\x82\xe1\xf8\x85\xc3\x75\x2b\x4d\xa3\x45\xac\x12\x2c\x2e\x99\x2b\xf0\x5c\xe1\xbb\x70\x77\xc6\xbc\x08\x33\x9f\x4d\x6e\xfa\x56\x67\x91\x5f\x82\xf1\x70\xd4\x93\xc7\xb3\x59\xea\x27\x2d\x98\xa4\x21\xf4\x22\x02\x6b\xe0\x1d\x57\xb2\x1d\x91\x78\x09\x36\xb8\xe3\xae\x71\x07\x83\x0e\x85\x59\xe7\x51\x24\xda\xb3\x9c\xd7\xca\x79\xeb\x43\xee\x8d\x6e\x82\x73\x1f\x18\xc2\x94\xf9\x19\x76\x43\xc0\x96\xe0\x91\x42\x4a\x7e\xf8\x6f\x33\x23\x70\x3b\x5a\xab\x3c\xf1\x30\xf7\xfd\xca\xab\xd7\x25\x06\xe5\xdd\x45\xac\x06\xff\x63\x5a\xbf\x96\x69\xf6\xc8\x3b\x0b\x2f\xb8\x62\x56\x6b\x00\xf3\xdd\x98\x73\x33\x74\x48\x6e\x84\xa0\x1c\xcb\xf7\x1f\x29\x46\x8f\xf3\xcb\x46\x28\xc2\xac\x3b\x35\xde\x0b\xe6\x3f\x49\xbb\xa6\x55\x47\x14\x60\x9a\xf8\x96\xd7\xcf\x9b\x8a\x85\x0c\x63\xdc\x78\x7f\x7f\x3e\x7c\x71\xc2\x85\x5a\xc8\xd8\x20\x71\x6d\xfb\xe9\x13\x3f\xc3\x5d\xf3\xf7\xdf\xd7\x29\xe7\x99\x16\x32\x21\x88\x71\x71\x2c\xd4\xa3\x80\x5c\x48\xa9\xb1\x67\x5c\x1a\x3d\x9f\x55\x91\xe6\x95\xed\x2d\xf0\xd9\x1a\x64\x7a\xee\x83\x6a\x21\x75\x90\x38\x29\x98\x57\x7e\xbe\x6c\x56\x9f\x7c\x7c\x15\x79\xb1\x85\xff\x7e\x4b\xb3\x8c\xa7\x13\x43\xde\x86\x5e\x68\x04\x06\x7a\x7e\x43\xe1\xc1\xc9\x60\xce\x30\xdd\xf2\x36\xde\xa2\xa5\xc7\x43\x43\x33\x8a\x72\xd3\x59\xc1\x87\xa4\x38\x5a\x7a\x52\x46\xd2\xc6\xdc\x1b\x59\x54\xd7\xca\x44\x24\x63\x31\xce\xd1\x4f\x49\x0f\x18\xe9\x2c\xd1\x13\xfc\xa8\x37\x25\xbf\xe1\x54\x18\x9d\xe1\x6b\xc2\x0c\x85\xca\x8a\x5f\xee\x4a\x98\x24\x7a\x64\xc0\x69\xdc\x97\x04\x56\x25\xa8\xe2\x93\xdf\x0e\x38\xc7\x1c\xbb\x25\xf8\x19\x85\x4f\x32\xf4\x42\xec\xce\xb6\x9d\x59\xed\xf6\x2b\x87\x61\xf6\x68\x3d\xc8\x90\x45\x58\xdc\x36\x19\x8d\x6d\x0d\xe7\xdb\x6e\x0b\x19\x72\xd0\x4e\x3d\x0d\x05\xb6\x5b\xa7\x69\x3a\x46\xaa\x40\x0f\x18\x23\x57\xc8\x9a\xf9\x58\x94\x70\x7c\xe5\xb9\xad\xb3\xab\xee\x26\xad\x13\xd6\xf1\x88\x48\x12\x73\xee\x75\xc8\xfe\x9e\x2c\xc9\x1d\x56\x3e\x3a\x01\x55\x23\xfe\x55\x08\x0b\xd2\x45\x01\xe4\x09\xca\x6a\x3e\x1e\x97\x11\x61\x81\x69\xec\xfb\x45\xe4\x2e\x23\x1a\x20\x8b\x62\x0e\x1f\x4b\xae\x16\xbb\xc7\xa9\x6f\x39\x63\x82\x25\x95\x4a\xb5\xbb\xc9\xba\x79\x83\xf7\xea\x77\x9e\x57\xbc\x9b\x5d\xb1\x67\xb4\x41\x4a\xd4\x04\x7d\xe4\x59\x2a\x5b\xe7\x76\xf2\xf5\xe3\x24\xc2\xf7\x57\x34\x75\x55\x73\x84\x26\xed\x10\x7f\xda\x5d\x87\x85\x06\xf2\x59\x19\x3a\xf2\xda\x4c\x4f\xeb\xe3\x8d\x2f\xc6\x48\x84\x69\xee\xbf\x9a\x54\x5e\x07\x14\x8b\x5a\x32\xa1\xd1\x38\x5b\xfa\xf1\x61\x9e\x70\x36\x7c\x18\xc6\x25\x32\x49\x74\x64\x29\x04\xb9\x06\x64\x94\x98\x36\x9f\x8d\xef\x83\x87\x21\x5a\xa4\x55\xd1\x94\x3f\x69\x84\x92\x5c\x58\x6e\x00\x74\xf1\xee\xc0\x52\xa2\x1c\x5f\x4b\xa8\x5e\x8b\x6c\xe2\x4f\x48\x0e\x11\xba\xf5\xca\x16\x20\x37\xb9\xea\xa7\x96\x24\x5c\x0c\x09\xe5\xd3\x33\x12\x83\x9f\x2f\xf3\x56\x53\x4a\x26\x70\x43\x47\xdb\xf0\x6c\x1d\xcb\xc9\x0f\x2a\xc1\xc1\x6e\x00\xdb\xd5\x73\x4f\xf6\xe5\x0e\x4b\xd3\x0e\xb1\xe2\xa6\xff\x77\x40\x04\x23\xc1\x13\x56\x29\x2f\xcd\xbb\xcd\xa3\x47\x0f\x4a\x20\x31\x1e\xd7\x45\xd9\x5a\xdb\xb9\x0f\x32\xfc\x04\xc0\xcc\x9b\x2a\x41\x01\x9c\x17\xaa\xc0\xe6\xed\x1f\x29\x7c\x8a\x16\x99\x3c\xae\xf6\x88\xec\x2b\x8a\xdb\xee\xb5\x69\xcf\xa0\x28\xda\xf5\x7b\xc8\x52\x09\xc7\xc2\x70\x1f\x77\x03\x68\x88\xad\x59\x4e\x11\xf0\x33\xef\x50\xea\xd8\xa0\xac\x0c\x5d\xe8\xb1\x78\x48\x9d\xd8\xac\x56\x5e\x2c\x31\x03\xf2\x50\x7c\xd8\xb2\xf0\xa8\xff\x56\x79\x3c\x42\x4c\x4b\x75\x01\x39\x6a\x29\x50\xbe\xc7\xb0\xb6\xb7\x4c\xeb\x27\xde\xd4\xa9\xec\x0a\x6e\xe3\x6f\xa5\xfc\x30\x40\xf0\x14\xd4\xaf\xae\x25\xd7\xb9\xb4\x5d\x85\x53\xf9\x31\x43\xde\xbe\xfd\x66\xb5\xd9\x7e\xdb\xec\x4f\x8b\xf5\x7a\xbf\x39\x38\x4c\x9c\x0a\x3c\x23\x6d\x8f\x5a\x2a\x5d\x5b\xdb\x2f\x0a\xeb\x2a\x08\x4d\xaa\x1e\xa9\x50\x67\xa4\x0e\xb5\x0a\x08\x43\x8d\x16\x5c\x93\x9f\xea\xc1\xb8\xc1\xa0\x30\x39\x83\x68\xd8\xb1\xd8\xaa\x56\xa1\x8c\x34\xef\x6a\x23\x83\x69\xb3\xd0\x35\x94\x1b\x84\x6f\x4d\xde\x4c\xa8\x39\x2a\xcd\x0a\x90\xc5\x19\xee\x78\x5a\x5e\xcf\x98\x5d\x71\xd7\x24\xa1\x8f\x56\xcc\x68\x60\x1d\x8d\x1e\x46\xd5\x1d\x8d\x8c\x8a\x79\x1b\xde\x7e\x49\x2f\x45\xf7\x77\x15\x23\x64\x27\x75\x6d\x2d\x96\x9a\x63\xf2\xeb\x44\x49\x30\x7a\x2a\xbc\xde\x56\xc7\x57\x58\x22\x79\x5f\xa1\xb6\xf9\xf1\x15\xbe\x17\xa5\xd3\x5f\xd5\x2a\x0a\x22\xa4\xbd\xa8\xea\xe2\x82\x5a\x8f\xc3\xde\x3b\x45\x41\x87\xc6\x84\x21\x72\xf3\x17\xdf\x24\x26\x51\x48\x46\x5a\x9b\xf3\x9e\x88\x8a\xa3\x90\x18\xed\x2c\xcb\x56\xd7\xb1\x8a\xe9\xa2\x3c\xad\x7f\x9b\x8e\x36\x18\x99\x63\xd9\x40\x5f\x10\x56\xcc\x0f\xc0\x6c\x53\xd5\x05\xf2\x21\x23\x94\x62\x41\x60\x36\xed\x57\x90\x6f\xd6\xb5\x9a\xbf\x65\x16\x7a\x9e\x72\x86\x3e\x6f\x2a\xac\xd0\xdd\xc4\x86\x8a\x45\x0c\x71\x22\x46\x6e\x77\x0e\x7a\xa9\x18\xf7\xa8\xcb\xda\xa7\x39\xcf\xbe\xa7\x79\x9e\xe6\x2f\x46\x9d\x7a\xac\x1f\xa4\x15\xeb\xb3\x61\x26\xc5\x6e\x5f\xfb\x28\xb2\x52\x89\x47\x42\x4b\xc1\xd2\x7a\x15\x15\x7c\xf6\x3e\x13\x22\xd1\xdd\x71\x58\x9b\x6d\xb5\x68\x97\xc5\x34\xc9\xa4\x92\x38\xa0\xd6\xcd\x7d\xcc\x4d\x60\x3a\x0b\x9c\x56\x3c\x14\xa8\xb5\x5b\x41\x8d\xc0\x02\xe5\x4a\x6e\x93\x61\x2a\xc1\x2f\x63\xe0\x65\x2e\x67\x63\x9a\xa7\x86\xae\x8f\xe2\x4a\xfa\x3d\x32\x7c\x46\x73\x44\x2b\xc1\x0c\xcf\xf5\x0b\xd4\xbb\xa2\xc8\x5a\xdf\x79\x79\xdd\xae\x27\xa3\x64\x18\x69\x43\x62\x3f\x76\x3b\x95\x94\x09\x12\x4b\xe6\xcd\x79\xd9\xc8\xb7\x8e\x25\x51\x2b\xa9\x88\xcd\x76\x21\x75\x3c\xa2\xea\x5c\x65\x6a\xed\xb2\xd7\xdd\x58\x61\x6c\x51\x23\xde\xe0\x13\xda\x0d\xa5\x7c\x23\x19\x3a\xd6\x2f\x8c\xdd\x35\x80\x18\x30\x43\x87\x51\xcf\xb2\x4d\xfd\x6a\x79\xfb\xbb\x41\x52\xe3\x17\x73\xb2\xb7\x06\x0a\xdc\x51\x82\xb8\x51\x4a\x61\x01\xd7\x7e\xcd\x21\x3f\x09\x56\x25\x47\x93\xda\x56\x17\x95\x8e\x4c\x76\x4f\x3a\x49\xbb\x5d\x51\x9f\xec\x15\xc1\x93\x46\x65\xeb\xc5\x75\x2a\xc9\xeb\x18\xa9\x00\xbe\x97\xa0\x3f\xa3\x8c\xe4\x43\xd3\x89\x7b\x6a\xf0\x83\x04\x97\x55\x77\xa8\xb5\x16\x0a\xca\x65\x31\xe3\x70\x8c\x5f\x1a\x84\xd4\x10\x42\xb4\xa1\x50\x1b\xcf\x0c\x97\x03\x84\xb1\x87\xa0\x32\x9c\xfe\xb6\x81\x3f\x0c\x06\xfa\x5e\x1a\x42\xa6\x74\x34\x80\x01\x2e\xbb\xed\x0a\x42\x4e\x69\x8f\xa1\xfb\x54\x06\xea\x7f\xd9\xff\xb9\x13\x64\x88\x15\x92\x7f\xfd\xf9\xfb\xf8\x36\xc0\x43\x00\xd1\x39\x55\xf7\x25\x57\xf0\xa5\xd3\xa9\xd6\x40\x88\x74\xa9\xcc\xaf\x15\x94\xa6\x4f\xd5\xd1\x99\x8c\x1f\x95\x30\x82\x25\x92\xbf\x1a\xf5\x32\x48\x9a\x14\x45\x36\xce\x9c\x00\x01\x85\x94\x40\x7b\xfe\x77\xd1\x8b\x7c\xd9\x83\x51\x08\x18\x28\xbd\xe2\xa6\x6d\x81\x25\xc5\x47\x35\xdd\xe7\x20\x4a\x62\x8b\x60\xc9\xa1\x4a\x2b\xcc\x88\x0e\x91\x53\x40\x59\x82\x6e\x88\xa1\x04\xc0\x3b\xaf\x16\xb9\x42\xaf\xea\x1f\x39\x32\x40\x85\x8f\x20\x61\x8e\xe9\xb6\x9e\x44\xd4\xbf\x19\x28\x3d\xcc\x62\xbf\xa7\xf0\xc1\xfd\xc9\x8d\xc6\x5e\x10\xf9\x1d\x2a\x78\x48\x3a\x3c\x02\x5a\x98\x97\x44\xdc\x49\x7e\x88\xed\x09\x75\xd9\xc0\xa0\x2d\x16\x62\x08\x10\x60\xbb\x5c\x2d\x57\x7f\x0e\x40\x2d\xc0\xa8\x10\x5d\x32\x54\xde\x77\xed\x7d\x3f\xdf\xbb\x80\x25\x21\xb5\x35\x25\x4c\x50\xdb\x66\x89\xaf\xfb\xed\x6f\x93\x81\xd2\x47\xd4\xae\x80\xfa\x39\x5f\x63\x02\xd9\x7c\x5a\xf7\x3f\x76\x5c\x22\x62\x65\x84\xad\x5b\x53\x52\x39\xea\x0a\x48\x20\xc6\xd0\xe2\xc2\x7b\x4a\xa2\xa1\xdb\x09\x89\x0e\xb0\x4b\xd7\x11\xfa\xad\xae\x72\xc4\x7e\x05\x3c\xa0\x0e\x11\x6b\x8d\xe0\xb1\x40\x81\xbd\xf1\xeb\xe6\x2c\x46\x50\x0d\x60\x21\xe9\x60\xd1\x0a\xdd\x62\xe6\x8a\x60\xa2\xe5\xcc\x7f\xb4\x73\xab\x68\xea\xce\xcb\xdb\x59\x55\x22\x3b\x52\x78\x04\x0b\xec\x48\xaf\xf1\xac\xad\xc8\xf0\xba\x67\xc6\x04\x21\x12\x9b\xf7\x12\x19\x97\x6f\xe8\x29\x8e\xa7\xba\x64\x21\xa6\x8d\xf6\x05\xf6\xb4\x0c\x8a\x33\xc3\x7d\x02\x24\x13\xe8\x86\x19\x85\x8f\x83\x2d\x11\x8e\x2f\x05\x61\xe4\xba\xca\x8e\x1d\xcf\x66\x91\x6d\x07\x5a\xef\xbf\x98\xce\x3a\xa1\x0e\xb9\xe4\x48\xb4\x9b\x69\x03\x83\xf6\x88\x51\x1a\x6f\xb7\x8d\x5d\x51\xd5\x97\xa2\x73\x69\xb5\x17\x71\xd0\x0e\x9b\xe5\x3c\xb8\xd9\xf2\xe9\xe8\x87\xb5\xa7\x85\x60\x43\x20\xc6\x23\xf0\x89\x4f\xad\x7d\x8f\xf9\x46\x4d\x21\x83\x1a\x86\x6b\xcd\x0d\x88\x13\x69\x63\xd3\x7f\x71\x23\xfd\x33\x64\xb4\x73\xa3\x98\x69\x77\x50\x70\xc9\x8a\xab\xe5\xa1\x71\xf7\xef\xeb\x04\xba\x22\x67\xfb\xa9\x9d\xf5\xd7\x81\x34\x98\x71\x53\xda\x1e\x37\xaa\xff\x34\xfe\xd4\x61\x44\x7d\x36\x76\xe3\x91\xe0\xa2\x5f\x12\x9a\xf8\x80\xc5\xa4\xef\x9b\xed\x69\xbf\xd8\x1e\x36\xeb\xd3\x6a\xb1\x73\x3f\x4d\x88\xf6\x54\x9f\xed\x74\x1c\x37\x78\x23\xf3\x7e\x8f\x26\x89\xcf\xbc\x81\x6c\x52\xae\x8a\x12\x19\x8a\x7e\xbb\x45\x7b\xe8\x08\x3c\x8c\x07\x76\xcd\xf9\x32\x34\xfb\x3a\xd2\x02\xf7\x0f\x7e\xb9\x3c\xa5\xf2\x2d\xef\x1b\x19\x74\xa4\x25\x0a\xef\x9c\xaf\xdf\xd3\xea\xb5\x4b\xf4\x6a\x1a\x51\xca\x9c\xf8\x5c\xbb\xd9\xd8\xd0\x6a\x7c\x7b\xb1\xd2\xb1\xec\xe2\x86\xf5\x88\x0a\x5c\xeb\x18\x7c\x24\x06\x38\x37\x59\x9d\x3a\x92\x33\x5b\x15\x9b\x30\x17\x0c\xff\x1d\xae\x17\xcd\x42\x83\xc2\x3c\x60\x7a\x75\x57\x54\x7f\x88\x1b\x3d\x2d\xad\x19\x0f\xd1\xed\x53\x56\x02\xd7\xe2\x54\x27\xa3\x92\x98\x00\xeb\x1b\x9d\x11\xe1\x7b\xc9\xd2\x69\xbf\xab\x4e\x12\x49\xa5\xcb\x1e\x8d\x02\x47\x9d\x00\x23\x81\x83\x73\x9f\x2f\x19\x54\x77\x45\x39\xd3\xe2\xa7\xb9\x17\xa8\xc8\x66\x01\x77\xe1\x7a\xde\xd1\xd2\x9c\x00\xe9\x7b\x4f\x6c\xdd\xa3\xab\xde\xcc\x4f\x09\x1e\x45\x78\x65\x0c\x9d\xcd\xd2\x9c\xfe\x76\x62\xb8\xc4\x79\x55\x59\xd0\xc7\x64\x80\xf0\x3d\x65\xab\x71\x86\x6b\xbe\x29\xe7\x31\x51\x5a\x00\xc5\x4c\x59\x5e\xa8\x89\x6b\xac\x65\x10\x46\xdc\xe2\xe4\x41\x3d\xdc\xc4\xce\x5a\xaa\x18\x6f\x23\xe7\x95\xe2\xff\xfd\xa4\x44\x61\xc7\xaa\x24\x42\xc7\xcb\xf9\xf7\x8f\x3c\x45\xa9\x8c\x9b\xf7\xaa\x74\x88\x5c\x29\x47\xa8\x6a\xc7\xdc\xd7\x9a\x7a\xb4\xbd\x67\x27\xe1\xcf\xc6\x5b\xed\xcf\x9a\x48\x34\x00\xf5\xac\xb5\x3d\xbc\xa5\xd9\xe7\x9d\x32\x93\x6f\xa7\x83\x10\x1d\xf5\x15\xbf\xb4\x77\xfa\x7b\x5a\x77\x10\x61\xad\x43\xa3\x0d\xdc\x69\x02\xd5\x4d\x99\xc3\x0d\x0d\xbe\x1b\x0d\x06\xa5\xf5\x91\xe6\xaa\xf8\xf0\xc7\x19\x21\xe9\x79\x9e\x17\x0b\xcf\x45\x9d\x1f\x03\x65\x1c\x77\xdc\x8f\x59\x27\xa0\xb3\x1c\xe2\x3b\x07\x77\x2c\x3d\xcf\x0f\x3c\xac\x63\x75\x32\x05\x0e\x6c\x29\x3d\x2f\x90\x44\x51\x47\x27\xd8\x46\x17\xee\x40\x18\x25\xc8\x41\xf8\xc7\xe6\xa9\xfb\x13\xf5\x91\x51\x0d\x7f\xcf\x10\xba\x0f\xf3\x09\xed\x08\xe1\x31\x87\x73\xbf\x9a\x24\xd8\x76\xdd\x1d\xd4\x26\xf4\xaf\x64\x71\x93\x26\x1c\xdf\x30\xa1\x11\x17\x43\xa9\x9f\x71\xc3\x4b\x33\xa2\x59\x45\xf7\x64\xfc\x62\x08\x67\xf8\xc0\xc8\x6a\x89\xed\xe4\xce\x08\xd9\x01\x11\x35\x82\xdc\xc6\xbc\xba\x6e\xb7\xc9\x6c\x99\xb8\xb5\xed\x69\x92\xe2\x0b\xef\xfb\x97\xce\x97\x76\x23\xe9\x5e\xea\xf8\x31\x22\x25\xf1\x57\x5e\x8b\x3c\x10\x5c\xbe\x35\x17\xf7\xfb\xb1\xef\x99\xf4\x7a\xd5\xb3\x5e\xb5\x06\xf7\x86\x60\x69\x8e\xe0\xc5\x5d\x23\x32\xd8\x2d\x84\x1c\x16\xe7\x62\xe8\x32\x4c\xd4\x20\xa4\xe7\x31\x6a\xc8\x34\x96\xab\xdd\xaf\x1a\x87\xa4\xe7\x25\xc4\x74\xf8\xad\x8b\x73\x8a\xdc\xac\xee\xc6\x13\x41\x22\x0b\x34\x45\x26\x06\x93\xc9\x37\x7e\xe2\xe8\x0a\x5c\x19\x0b\x67\xab\xbb\x6e\xe3\x1c\xf7\xc9\x48\xcf\x13\x1e\x75\x88\xa7\x45\x59\x2e\x8b\x22\xbb\x4b\x21\x53\xa1\x3b\x2e\xfd\x18\x6d\xf2\x7d\x71\xff\xdc\xfd\x2d\x90\x60\xd0\x10\x7b\x93\xc0\xb4\x29\x01\x77\x98\x40\x82\xc8\xf5\x61\x8b\xf9\x34\x5f\xdc\x8e\xe3\x21\xb3\xa9\x8a\x89\x0e\xc2\xe4\x4d\xab\xc8\x80\x74\xbb\x56\x97\x0a\xea\x27\xa8\x3f\x8a\xf2\xcd\xfd\xa6\x62\x3a\x54\xbd\x50\xca\x43\x51\xd7\x50\x5e\x07\xb5\xaf\x76\x0c\x07\x6d\xf9\x0d\xa1\xbc\x1b\x70\xdb\x8e\xdf\x1c\x90\xd0\xf1\x8e\x58\x87\xd4\xd4\xd9\x71\x8f\x68\x77\x1d\x6c\x02\x75\x17\x05\x6e\x74\x2c\x76\x45\xc6\xcb\xb4\xb2\x7f\xf6\xfd\x80\xa2\x93\xc4\xcb\x01\x8f\x6c\xfb\x77\x2a\xb1\x8e\xa7\x0a\xa7\xb0\xfe\xe9\xfb\xf1\x7d\xa9\x7c\xfb\x69\x56\x59\xfa\x63\x74\x9d\xc0\x6d\xf1\x69\xee\x7a\x9a\xdc\x2a\xb2\x23\x42\x8f\x63\x03\x09\x57\x8a\xab\xbf\xb8\x84\x5c\xba\x1d\xd7\x77\x93\x79\xf4\x1f\xf6\x3c\xe2\x69\x4c\x1f\x8a\x54\xfd\x8c\x71\xaa\x1d\x49\x28\x01\x97\x0b\x33\x2d\x9e\x69\xa1\xf6\x45\x96\x21\x37\xb3\x1b\xc5\xe2\xc8\x71\x27\x7c\x76\xc1\x3e\x4a\x91\x9e\x1f\xd1\x44\x5b\xb5\x04\xe4\x0e\x73\x17\xa2\x2c\x52\xad\x33\x75\x77\xfc\xfd\x38\x7a\x17\xb1\x47\x95\x1a\xb9\x17\xcb\xeb\x9e\xe7\x6f\x3f\x73\x99\xdb\xd3\x7c\x1f\xd1\xa3\x75\x07\x7d\x69\x3a\x15\x16\xe9\xf9\x4c\x79\x60\xa7\x41\x57\xca\xb8\x25\xb7\x6d\x07\x6a\x30\x89\xbe\x46\x9c\x2a\x40\x18\x0b\xcc\xc0\xac\xa4\xe7\x73\x5f\x46\x1d\x87\xfe\x01\x21\x52\x83\x6c\xd5\x74\x30\x93\x8c\xf4\x4e\xeb\x4c\x49\xc1\x0d\x84\x08\x7b\xf6\x7f\x31\x9b\x44\x68\x14\xa9\x0e\xc7\xc5\xfe\x88\xfc\x4a\x4f\x0b\x2b\x45\xd1\x1e\x95\x09\x0b\xec\x92\x36\x0a\x39\x30\xd9\xed\x7c\xe9\x4b\x1e\xf6\xfe\x8f\xe5\x29\x70\x17\x90\x9c\x74\x52\xa9\xb8\xef\x18\x19\xe9\xf1\x25\x94\x6f\x30\x36\x2f\x36\xc0\x1a\x42\x5e\xdd\x85\x14\x0b\x98\x1d\x73\x12\x93\xaa\xe0\x70\x9d\xfa\x0a\x88\xa9\xf7\xd6\x45\x09\xcb\x9f\x57\x04\xa5\xe7\x43\x68\x51\x4a\x4a\xd9\xea\xd0\xcf\xa7\x07\x84\xa6\x17\xf0\x50\x37\x17\xe4\x48\x1a\xcd\x39\x60\x02\xb3\xf0\xff\x49\x5f\xd2\x6e\xc9\x69\x62\xa6\xfa\x09\xd5\xf8\x81\xb7\x37\x6b\x3e\xf1\x0c\x1c\xb9\x1d\x1f\x51\x04\x49\x63\x28\x76\x2c\xd6\x69\x25\xd3\xcb\x7c\x21\xa1\x1d\x9d\x40\x18\x77\x00\x25\x9e\xad\x5d\xbf\xd7\x68\x58\xe0\x11\x81\x7b\xf7\x86\x57\xd7\xe7\xea\x9c\x36\xe7\x71\x19\xb6\x1d\xa2\x34\xe9\x45\x4e\x27\x5c\xb1\xd2\x0b\x82\xc0\x8f\xe4\x20\x23\x36\x6c\x83\x6e\x0f\xc7\x02\x27\xdc\xa9\x2e\x8e\xfc\x07\xdc\x9c\xcd\x4d\x9a\xe4\x1e\x6a\x87\x92\x6b\x3a\x40\x5e\x7b\x1c\x34\x09\x7b\x02\xe5\x07\xd0\xf5\xb1\x78\x32\x6c\x41\x3c\x33\x45\x51\x2b\xb9\x36\x08\x4f\xa5\x17\x84\x3c\xc0\x72\xcf\x32\xad\x0f\xc7\xf5\xb7\x14\x3e\xc6\xd3\x2b\x88\xfc\x88\xdb\xc4\xc3\xd1\x8a\x53\x75\x89\x36\xe9\x05\x34\xf4\xb1\xe0\xb8\x38\x1e\x27\x27\xd2\x30\x88\xfb\x76\x96\x25\xcf\xdf\x6e\x08\x6d\xa5\x17\xc4\x21\x53\xdc\xa6\xc3\x90\x9f\x14\x71\x82\xbf\x0e\xcf\xa5\x17\xb0\xc4\x54\x8f\x2f\x45\xcd\xeb\x41\xbe\xb6\x3d\x24\x29\x62\x27\x50\x38\x99\x05\x93\xdf\x64\x4a\x1b\x75\x38\xad\x07\xa7\x40\x28\x0d\x61\x41\xa9\xfe\x98\x9c\x90\xc4\x02\x9b\xc7\xd7\x25\xf0\xf3\x1f\xee\x0c\xce\x9d\x54\x70\xcd\x33\x73\xc7\x96\x92\x71\xdd\x98\x59\x8a\x78\x0c\x3b\x5a\x78\x04\xd9\x46\x4a\xa8\x64\x03\x0f\x45\xd5\x3a\x38\x17\xf8\x44\xc1\xa2\x3d\x21\x0a\x11\xeb\xfe\xb4\x78\xec\x2f\xa2\x09\x3a\x16\x88\xd1\xb0\x33\xe8\x73\x02\xcb\x4f\xde\x9b\x64\x09\x6e\xd9\xbb\x12\x52\x59\x18\xad\x2c\x77\x48\x26\xc8\x27\x8d\x7c\xab\x6b\x5c\x86\x43\xf3\x10\xa8\x76\x2b\xb3\xfa\x01\xae\x4a\xc3\x3e\xc5\x7e\xb7\x27\xf8\x60\xc0\xfe\x27\x55\xc8\xe6\x3c\x21\x6f\x95\x5e\x00\x11\x43\x2c\x65\x59\x20\x53\x5e\x37\xaf\xb4\xc7\x4c\x49\xa3\xf5\x76\x97\xa9\x13\x33\x1f\xed\x12\x81\x56\x11\x32\x44\x6e\xc8\x03\x7f\xe7\xf6\x54\xa4\x31\x8a\x4d\xf5\xc2\xf0\x58\xcf\x81\x65\xdb\x71\x8a\x09\xe6\xe4\x04\xcb\xd9\x4e\xab\x76\x94\x0e\x11\x43\xdd\xe9\xe5\xcf\x35\x00\x4a\x2f\xf4\xb9\xef\x4c\xac\x61\xb4\x1d\x79\xd9\xa1\xcf\x63\x04\xbb\x22\x0f\x9e\xe2\x59\xb5\x34\x41\x94\x3d\x1c\x10\x19\xc7\x73\xa4\x88\xe3\x6f\x17\x06\x8c\x38\x0d\x42\x77\xbf\x56\x72\xda\x0d\x48\x38\x96\x00\x11\x7c\x63\xdd\xa1\xbb\xb2\x4f\x57\xff\xcf\xcd\x66\xe6\x4e\x54\x12\x01\x7d\x16\xfe\x30\x3f\x29\xc3\x90\x71\x6f\x58\xba\x3a\xa6\x19\x52\x63\x99\xd5\xd7\xb9\x3f\xe3\x93\x48\x28\x5c\x50\x6a\x95\x81\xb0\x6e\xa7\xb9\x9c\xec\x65\x61\x14\x9a\xf9\xed\x8a\x31\x96\x42\xb8\x3d\x02\x86\xbb\xa2\xc8\x5f\x8b\x4c\xd9\x44\x6a\x35\x39\x9d\x06\x51\x60\xb1\x55\x4e\x49\x6e\xec\x02\xcf\x24\x21\xda\xd3\xa4\x8f\xd3\xa8\xb5\x97\xf7\x90\x7f\xb9\x5e\xdc\x82\x08\x63\x66\x3a\xde\x1f\xaf\x26\x39\x61\x8a\x65\xe3\xd3\xe3\x24\x42\x36\x29\x05\x17\x5e\x22\x99\x64\x39\x29\xa7\x3a\x84\xaf\xcd\x6e\xb5\xe7\x70\x88\x06\x74\x14\x86\x8a\xe7\x84\x7c\x8b\xdd\x4f\xab\xc4\xa9\xe1\xd8\x9c\x38\xca\xd4\x60\x5a\xf7\x96\xee\x48\x7a\x21\xe3\x21\xd6\x27\xd0\x1e\x75\x13\x82\xf5\x2d\x7f\x9d\xc1\x99\x6f\xb9\xba\x01\x41\x49\x2f\x4c\x22\x83\x58\xbf\xe3\xd2\x12\x19\x0e\x77\xec\x30\x89\x4c\x4b\x53\x5a\x59\xaf\xfe\xb9\xdc\xf1\xaa\x36\xa0\xe8\xf1\x5b\x4a\x04\xc3\x12\xda\xe9\xcc\xdf\xe0\x70\x01\x99\xf2\x6c\x7b\x0b\xfa\x1f\xaf\x9a\x44\x8c\x85\x14\xcd\x0e\x54\x16\xe7\xdd\xdb\x2c\x8f\x4b\x7b\x8a\xa2\xe8\xa2\xef\x1a\x43\x48\xd0\xdd\xaa\xe2\x08\x05\xc5\x3c\x18\x02\xc9\xd2\x22\x7f\x4c\xbb\x47\xe1\xc4\xf3\x6d\x3e\x0d\x99\x02\x30\x41\x3d\x7a\x17\x9c\xcb\x98\xf7\x44\x90\x6b\x9b\xf0\xef\x49\x58\x1c\x0d\x03\xb3\x27\x88\xd8\x53\xae\x08\xd6\x94\x39\x3a\xf0\xe3\x97\x22\xb8\x87\x1f\x67\xf9\xb4\x9a\x1e\x51\x82\xdb\xc6\x9d\xbd\x1a\xf2\x3b\x8c\x9f\x56\x86\x46\xe8\x37\x75\x22\xf5\xbf\x8d\x0f\xc7\x81\xd5\x8d\x34\xfc\x54\x6b\x90\xa9\xea\xdf\x89\x04\x1f\xf7\xa4\x65\x81\xa8\x2a\xcb\x1e\x39\xb9\x13\x09\xa6\xd2\xdb\xd1\xd8\x1d\x3a\xc2\x99\xf6\xa8\xf6\x3b\x51\x83\x2b\x36\x72\x74\x57\x57\x9e\xe9\x0f\xe1\xa7\xf7\x14\x50\x03\xd3\xc0\xf1\x16\xb9\xb2\x9a\x9b\xbf\x0d\x56\x84\xf2\x0d\xa6\xf3\x1d\xca\x54\x5f\x57\x50\xd6\xdf\xd3\xfa\x75\xbb\xbe\xc1\x98\xcd\x80\x6f\xdb\xd3\x99\x81\x10\x5a\x8a\x71\x2c\xe1\xae\x60\x22\xe9\x2d\xbd\x10\x02\x83\x12\xea\xaa\x27\x83\xed\x73\xa8\x87\x35\x79\xcf\x10\xb2\x60\xa4\xc5\x8d\x75\x76\xfb\xa4\xed\xcc\x61\xba\x47\xc1\xb6\xaf\x61\x63\x2b\x76\x6e\x04\x0d\x8c\xac\x7f\x93\x77\x7f\x02\x2a\x6c\xc3\xf5\x4b\x3f\x0e\x04\xc8\xbe\x6e\x79\x48\xff\xee\x0e\xf9\x41\x88\xc4\xa5\xd2\x68\xa6\x1b\x7f\x15\x29\x1f\x3e\xc9\x3b\xcd\x05\x82\xc4\xa7\x51\xa0\x1c\xcd\x7e\xae\x8a\x72\xd1\x0b\x84\x98\x9d\xe4\x58\x72\x57\x91\x1c\x4e\x7f\xe2\x27\x4c\x5b\x17\x73\x93\xab\x75\xaf\x3e\x6a\x8f\x07\x91\x71\xd4\x37\xc7\x2f\x98\x23\xbf\x64\x69\x37\x17\x48\x18\x19\x62\x0d\x2c\xd5\x21\xbf\xe4\x5d\x99\x42\xae\xaa\xbb\x34\x7f\x81\xb2\x9a\xc2\xc2\xdb\x53\xa4\xa9\x32\x77\xcd\x0d\xe9\xb9\x39\x9b\x28\xa3\x1a\x39\xbf\x24\x54\xa6\x3a\x6f\xa6\x8e\xeb\xe9\xef\xf5\xbc\x6e\xca\x76\xd2\x23\x84\x11\x6d\x1a\xa8\x2b\xe8\xd9\xa4\xc7\x77\x10\xc5\x61\x20\x3b\xe8\xff\x56\x16\x8e\xc1\x76\x84\xbf\x6e\x07\x26\x0c\x99\xf4\x2c\x51\xea\xae\x84\x31\x83\xcf\x4f\x1d\x33\x36\xba\x2f\xea\x45\x66\x56\x14\xba\x7b\xcd\xee\x50\x00\x32\x1c\x23\x15\x8e\x8e\xec\xd9\xc6\x7c\x3f\xeb\xc0\x6a\xaf\x10\x1a\x4a\xc5\x8c\x57\xf5\x80\xa3\x0e\x8f\x30\xdf\x43\x0d\x90\xec\x3c\xb4\xf0\x84\x46\x1a\x8b\xec\x46\xd6\xb1\xaa\xa1\xfc\x9e\xe6\x55\x77\x54\xd2\xc4\x77\xb8\xed\xf6\xc1\x91\x1f\xfb\x58\x7c\x7f\x1d\x78\x1c\xb3\x9e\x04\xa1\xca\x74\xd1\x8b\xa2\x2c\x8b\x8f\xcf\x06\x8f\xde\x4d\x1c\x30\x44\x89\x5b\x9c\xf5\x76\x9d\xf7\xf2\x2d\xed\x61\x69\xac\x59\x3d\xe0\xdf\x36\x53\xda\x3e\x6b\x6f\x6d\x08\x4b\x8c\x5c\x9d\x53\x08\x71\xaa\x33\xce\xdf\x20\x4c\x69\xfc\x0e\x17\x57\x4b\x1c\xbf\xc9\x84\x42\x64\xfd\x35\x23\x88\x57\xe1\x0a\x1a\x18\x6a\x37\x90\xf9\xa1\xd5\x5c\xde\x22\x23\xfb\x8b\x4d\xe9\x4c\xc6\xf1\x88\x20\x23\x9a\xc5\x58\xb5\xa6\x7c\x50\xac\x69\x07\xf0\x04\x6f\xa8\xbc\x14\x1f\x8e\xba\xe1\x7f\x86\xc9\x15\x22\x44\x12\x19\x11\xc6\xbf\x4c\x25\xd6\xb4\xf7\xdb\xa3\x32\x4a\x1c\xcd\xcb\x3d\x3f\x43\xf7\x09\x25\x65\x20\x7a\x59\x8b\x2c\x2b\x3e\x3a\xf2\x8d\x7a\x30\x43\x24\x03\x8c\x30\x0f\x4f\x07\xd4\x78\x77\x7f\xe6\x46\x16\xf0\x64\xc2\x3c\x54\xa3\x18\x6f\x20\x44\x4a\xc3\x4d\x69\xe5\xad\xea\xdb\xf0\x96\xa8\xc4\xc3\xa0\xdd\x24\xfd\xaf\xbd\x8f\x33\x18\x02\xa1\x29\x58\x66\xbc\x7a\xb5\xd5\xc6\x87\xf4\x0d\x5a\x33\x99\x8f\x99\x2b\xa5\x47\x40\x2a\x61\x35\x9e\x6f\x93\xc8\x76\x8c\xf6\x7c\xd4\xd2\xbf\x14\x1f\xf3\xad\x5e\xed\x18\x69\x38\x22\xb7\x4f\xdb\xe3\x76\xf1\x70\xb2\x8c\xd8\x3d\x8b\xb6\xf4\x22\x8f\x1a\x8e\x32\xab\x74\xbc\x28\x4d\x12\xf5\xd6\xc9\x9a\x6e\x5a\x91\xa7\xa9\x72\xa4\x21\x68\xef\xc7\x6f\x2e\xf2\x63\x89\x55\xa9\x3f\x34\x94\x48\xb1\xd3\xf5\x05\xbb\xdf\xf6\xb5\x31\xba\x95\x61\x8f\x3c\xf3\x39\x19\x1a\xe9\x45\x01\x0b\xb5\x01\x95\xbc\x18\x1e\xa3\xd9\x5d\x34\x0a\x43\xab\x6b\x7d\xb9\x58\x31\xd3\x87\x01\x38\x60\x3a\x38\x26\xe8\x1b\x2e\xd2\x72\xf5\xea\x0c\x46\x14\x26\x1e\xfa\x59\xbb\xfd\xf6\x3f\x9b\xee\x8f\xca\x48\xa7\xa3\x47\xb6\xe4\x2f\x55\x77\x00\x84\xee\x28\x06\x0c\x79\x23\x06\xa4\xb3\x00\x40\xe9\x45\x34\xa6\xc8\x7e\x54\x35\x02\x83\x9f\x9b\x05\x17\xc5\x54\x20\x4d\xdf\xd9\xf4\x91\x54\xd3\xc3\xc2\xe8\x59\x1c\x2e\x3c\xcd\xdf\xab\x7d\x53\x55\xa9\x8b\x1c\x23\x46\x00\xeb\xc4\x03\x0a\xb7\x6a\xd0\x42\x20\xbd\x28\x89\x79\xe4\x84\xee\xd4\xf7\xa2\xda\x15\x45\x76\x57\x94\xa8\xea\x35\xf4\x8b\x22\x1e\x7a\x88\xd7\x38\x0d\x54\xc6\x3f\x09\xea\x22\xce\x80\x39\xd9\xc2\x36\xa2\x77\xd9\x1d\xf6\xbf\x7e\x4c\x27\x71\x5a\x24\x62\xa9\xad\x8c\xac\xf3\x62\x6f\x65\x88\xdb\x71\xcc\xa3\x6e\x5c\x71\xbe\xd4\x70\xf2\xd9\x68\x8d\x44\x12\x3c\x36\xf2\x69\x76\x45\x3a\x70\x98\x26\xbf\xab\x7c\xd3\xf4\xe8\x98\xb6\xfe\xf5\xbc\x7d\x3a\x1a\xce\x4c\xf7\xcc\x4a\x45\xca\xf0\x02\xd5\xf2\x75\x21\x8a\xb2\x86\x89\x99\x8b\x20\x8a\x51\x2b\xee\x25\x7d\x87\x7d\xfa\xf2\x5a\x1f\x0b\x84\x85\xcf\x06\x66\x91\x26\x0c\x41\x9a\xeb\xcd\xb7\xf1\x9a\xa3\x1e\x97\x88\x86\xb6\x90\xae\x0e\x91\x6d\xff\xbf\x1d\xe5\x47\x1a\x03\xcf\xd5\xee\x7e\xb7\xd9\x6f\xee\xf7\xdb\xa7\xcd\x69\xf3\xc7\x71\xbf\x58\x21\x03\x6a\xc7\x52\xd8\x8e\x4d\xa4\xa3\x79\xdf\x95\xe9\x99\x97\xd7\x59\x77\x98\x06\xd4\x64\x86\x2d\x7c\x6d\x10\x84\x8f\x4d\x10\x0d\x94\x49\x4c\x5b\xc5\xf1\x01\x85\x6c\x7b\x10\x0c\xd9\xf6\xc9\xe8\x5d\x9e\xe0\x7c\xa9\xaf\xa7\x4e\xef\xc8\x8d\xd2\x46\xa9\xde\xaa\x2a\x0f\xe6\x17\x0d\x7d\x81\x89\xf6\x73\x6b\x16\x46\x3b\x05\x25\x91\xe7\xbb\xe9\xc4\xab\x1a\xc9\x64\xc7\x9f\x81\x92\x98\x80\xd7\xe5\xe6\x8c\x2f\x3b\xeb\x32\xd0\xc8\x63\x68\xa2\xfe\xbd\x3c\x22\x6c\x6b\xfc\x32\xa2\x40\x62\x59\x61\xa3\x20\xdb\x17\x55\xdd\x9a\xd9\x2e\xa4\xa2\x51\xe2\x23\x0c\xb7\x97\x8c\x4a\xa1\x1a\x20\x96\xdb\x21\x20\x91\x42\xe6\xbf\xad\x51\x42\x75\xf5\xc9\x71\x2d\xb5\x3f\x64\xb8\xda\x2d\xf6\xc7\xa7\xcd\xfe\x70\x3a\x6c\xd7\xdd\xb7\xa3\x42\xf9\x56\x59\x7b\x5b\xc3\xf9\x26\x69\x3d\xbe\xe9\xd8\x0b\xd4\x80\xd5\x78\xf8\x56\x63\x4f\xa1\xc7\xd7\x2d\x89\xb5\xc3\x4e\xb6\xcb\xcc\xca\xe8\xba\xb1\x91\x88\x6d\x73\xde\xd2\xf1\x31\x38\x1c\xf5\x5c\xa5\x82\xc6\xb1\x16\x96\x3b\x6c\xdb\xf1\x49\xdd\xc8\x03\x8d\xef\x95\x25\x80\xee\x7a\x0e\x1f\x98\x71\xb6\x81\xd3\x8a\x9f\x2f\x3c\x7d\xf9\xa4\x36\x4e\x19\x70\xfc\xbc\x17\xf4\x96\x4f\x76\xe3\x3d\x7d\x18\x8c\xf3\xc4\x24\x52\x1e\x04\x08\x71\x53\x45\x96\xf1\xb2\xba\x2b\xca\x61\xe0\x4c\x85\xa7\x1c\x30\x5f\x8d\xdb\xbe\xe6\x6f\x59\x44\x01\xb3\x24\x15\x7f\xb4\x1b\xf3\xbf\xf7\x3f\x23\x10\x91\x1e\x95\x84\xb8\x46\xb7\x93\x30\x59\xb1\x51\x16\x80\x4a\x4a\x65\xc7\x7d\x7d\xc5\x22\xa3\x3d\xa2\xfc\x20\x0e\x5c\xb6\xcb\xf8\xe8\xfd\x21\x82\x78\xba\xe2\x62\xb2\xa4\x8b\x3c\x2f\x9a\x5c\xc2\x6d\x0e\x92\xaa\x38\x26\xf6\x06\x16\x59\x86\xae\xfb\x90\x42\xb8\x1d\xc1\x05\xb2\x2e\x9c\xa0\x6a\xc3\xe0\x2f\x45\xe5\x84\x68\x36\xbc\xcc\x07\xd2\xd2\xd3\x47\xbc\xf5\x67\x27\x9a\xcb\xd2\xa3\xda\x37\x39\xbd\xd6\x97\x6c\xce\x5b\x03\x79\x36\x3b\xfd\xf4\x53\x69\x5f\xc8\x5e\x5b\x0c\xb9\x39\xb0\xc9\xfc\x93\x79\xa0\x89\xf4\xdd\xec\x71\x33\xe6\x17\xe1\xf4\x3f\xe9\xff\x6e\xaf\xcc\x42\xe2\x75\xcd\x71\xb6\x24\xb1\xbc\x9a\xc4\xcf\xe4\x26\xb8\xc2\x6c\x7b\x5a\xc3\xb9\x5b\x3c\x5a\x6b\xdc\x07\x6c\x63\xf8\x8e\x37\x95\xe5\x67\x19\x78\xe9\xed\x42\x4d\x4c\xce\x28\xed\xbe\x45\xec\x25\x31\xf2\xf3\xc9\x22\xcd\x55\x59\x5c\x2a\x1b\x6e\xa7\xf9\xcb\xa2\x1b\xe4\x47\x56\xba\xa2\x42\x64\x22\xd7\xa3\xeb\xfa\x3a\x14\xba\xe7\x67\x76\x40\x0a\x35\xa0\x10\x95\x5e\x1c\x90\x00\xd7\x5e\xcf\xb6\x32\xf7\x71\x67\x91\x38\x78\x76\x12\x77\x9d\x88\xbb\xac\xa8\x1f\x4d\x50\x8c\xaa\xcc\xc3\xae\xc3\x01\x06\xfb\x17\x24\x44\xed\x55\x95\xc4\x20\x7c\xf3\x63\x44\xc1\xea\x6e\x39\xe4\x3a\xb2\xd4\x64\xb6\x89\xa8\xcf\x70\xc5\xc4\xf3\xb5\xd5\xa9\x38\x16\xad\xe3\xd2\x1f\x90\x48\xe7\x9d\x37\x67\x97\x69\x7c\x56\xaa\x3b\xea\x9b\xad\x16\x01\xf9\x88\xc2\xb2\x3e\xe6\x70\xab\x8a\x49\xe8\x11\x62\x9b\x51\x7b\xe1\xbe\xc9\xfc\x8d\x49\xe8\x87\x26\x51\x92\xca\x36\x0e\x42\xc6\x96\xee\x12\xdc\x80\xdd\x9d\x62\xf2\xa0\x38\x3b\x5b\xda\x1e\xbf\x19\x1a\x85\xd8\xa5\x75\xcf\xdf\xd3\x7c\xac\x51\x36\xfb\x26\xa9\x64\x18\x0f\x3d\x15\x65\xfd\xba\x2b\x32\x58\xdc\xb9\x1b\x89\x89\xc2\x97\x2c\x79\x7e\x67\x7a\xcf\xe6\x52\x08\x71\x1c\x1b\x29\x29\x5b\x50\x5d\xac\xbb\xf3\x85\xa7\x2d\xed\xc5\x62\xef\x90\xbc\xee\x60\x42\x7c\x27\x62\xd6\x3e\xa1\x7c\xfd\x0e\xe9\x6f\x93\xba\x72\x9c\xc4\x1c\x7c\x47\x95\x52\x6e\x73\x59\x9c\xed\x2e\x3d\x9e\x64\x89\x34\x41\x11\x57\x7f\x35\xd5\xad\x33\x1c\x73\x5f\x7b\x3d\x41\xc4\x97\xa2\xa9\xb0\x85\xd0\x22\x43\x47\x4b\x3a\xe6\x61\x80\xb6\x05\x9b\xdf\xaa\x07\x78\x99\xe6\x43\x5a\xd7\x17\x73\x7d\x8f\x69\x5e\x77\xcc\x00\xed\x74\x46\xe5\xdb\xb2\x5b\x38\xc2\x67\x68\xaf\x77\x4d\x96\x59\x33\xf9\xe8\x78\x3f\xda\xc3\x41\x84\xbe\xcf\x61\x71\x87\x91\xe4\x2f\x91\x3b\xb1\x90\x1a\x9d\x10\xc7\xf5\x79\x46\x8c\xd6\x9a\x5f\xe7\x6b\xc0\xb1\x92\x51\x32\x2c\x23\xec\x8a\x71\x2e\x2b\x56\x92\x25\xc6\xd9\xcb\xb4\x23\x46\x5d\x6f\x9f\xa6\xd3\x55\x29\x03\x90\x14\x8d\x85\xe4\xba\x47\x80\x30\xec\xf3\x1e\x39\xd4\xaf\x7c\xda\xc8\x3f\xb0\x36\x9a\xc4\x88\xb1\x30\x34\x75\x36\xae\x72\x57\xd2\x71\x1c\xf2\x71\x11\xd1\x2e\x9f\xae\x38\xc4\x3c\x6d\x1d\x75\x94\xc8\xf8\x61\x00\x78\xc7\xeb\xc5\x49\x59\x0e\xeb\x0b\xa3\x17\xc7\xfc\x24\x41\x11\x8b\x81\x42\x68\xfb\x57\xd0\x48\xac\xf7\xca\xab\x03\xb4\x11\xf1\x12\xa0\x93\xbb\x1d\xcf\x0a\x16\x92\x08\xbd\x58\x03\x8f\x6b\xea\x8e\x13\x71\xf4\xa6\x58\x18\xf9\xc6\xc8\x57\xdf\x0a\x9c\x1b\xe3\x89\xca\x88\x1f\x21\x4f\xd3\xf3\x7e\xbd\xd9\x9f\x76\x0f\x8b\xd5\xe6\x36\xf5\x3f\x93\x7e\x1d\x7f\x58\x46\x22\x40\xfc\x9e\x6c\x23\x0c\xcb\x14\x30\xa1\x99\x1b\xbf\x00\x42\x4d\x41\x13\x3d\x9a\x35\x64\x35\xff\xac\x8d\x4a\x7a\x2c\xf2\xc1\xb3\xeb\x16\xd5\xa8\x46\x28\xdf\xfe\x26\x28\x31\x40\xbc\xda\x95\x7c\x87\xa5\x67\xc6\x3c\xcf\x49\xc6\x3d\xa6\x79\xd7\xa7\xfb\xac\x71\xb7\x9e\xcc\x30\xc6\xe2\xc4\xf1\xb5\x3f\x5f\xa0\xbc\x51\x34\x6a\x87\x28\x8d\x86\xea\xb0\x59\xed\x37\xc7\x93\x11\xd8\xbc\x5b\xac\x8e\xcf\x7b\xf7\x9b\x9c\x51\x7c\xbb\x90\x2b\xa3\x9d\x74\xe3\x64\x30\x29\x3d\x97\xf7\xed\x73\xc7\xbd\x87\xc3\x94\xaf\x51\x62\xaa\x4e\xcf\xb6\xbc\xe9\x0e\x28\x1f\xd7\xde\xf6\xf9\xeb\x67\x1a\xe0\xd2\x63\xe0\x45\xa6\xd0\x20\x8b\x7d\x93\xc1\x0a\xdd\x82\xc9\xb3\x02\x70\xa3\x02\x9a\x15\xf9\x08\x9e\xd8\x0d\x49\xbc\x48\x83\x05\xbc\x1c\x6a\x2e\xdf\x6c\x37\xcd\x6f\xee\xb0\x20\x46\x4a\x0a\x63\xaf\x3d\xc8\xa2\x54\xb7\xca\x55\x38\x90\x21\x84\xda\x0c\xfc\x3d\xcd\x5f\x54\x71\xfe\x44\x25\xe3\x97\x9e\xcf\xec\x54\x4c\x3c\xc5\x91\x4a\xf6\x3f\xaf\x90\xe7\x45\xef\x01\xda\xc3\xbe\x47\x90\xb2\xc0\xda\x3f\x9b\x5a\x4f\xcf\x6d\xbc\x71\x9e\xe5\xe7\x6b\x4f\xa2\x24\xec\x09\xab\x57\xaf\xc5\xa4\xef\xae\x1d\x22\x4d\x93\x61\x39\xc2\x4a\xdf\x42\x93\x12\x1f\x48\xc4\x6d\x3b\x74\x6e\x10\x8f\x6e\x0f\x4a\x02\xaa\xd0\x7b\xfb\xb2\x7c\x1e\x26\x7b\x93\x20\x09\x11\x9e\x63\xe1\x51\x28\x9b\x36\x7d\x4b\x63\xb6\xa2\xc9\x4b\x09\x40\x62\x28\xe1\x1a\x9c\xbf\xf5\x56\x27\x09\x89\x74\xca\x8b\x4f\xf0\xa3\x6e\xa7\x49\xf7\x61\x43\x26\x5d\x03\x23\x42\xc7\x5f\xfa\x4a\xd6\x0d\xa7\x80\xf4\x12\x12\x28\x9b\xbc\x37\xa6\xfb\x89\x9f\xe1\x8f\xed\xda\xe8\xb7\x5d\x2e\x9f\x3a\xe3\xc3\x4b\x50\x85\xc9\xd2\x45\x5d\x9c\x07\x31\x6b\x42\x64\x8c\xf5\xf3\x6f\x50\xa6\x35\xaf\xa0\x19\xa5\xc3\x13\xa2\xb4\x11\x40\x7c\x4d\xf5\x27\x15\xc8\x24\xa2\x5a\x25\x0e\xe1\x6c\x8d\xba\x8d\xfe\xc7\x03\x69\xa8\x92\x78\x80\xdc\xaa\xc6\xa3\x26\x93\x83\x52\x8a\x4d\xa8\xfb\xa2\x38\x3f\x15\xad\xc3\xa1\xd4\xb0\xdc\x98\x50\xce\x31\xf0\xd2\xf8\xc7\xd1\xa1\x58\x51\x57\x7e\xd9\x6d\x4d\x07\x64\xe8\x8d\xb6\xc4\x84\xf9\x01\x7e\x7b\xd1\x5c\x3b\xd2\xe2\xaf\x79\x5a\x77\xdf\x88\x05\xde\x80\x70\x1b\x0d\xea\x22\x57\xf5\xed\xd3\x4d\x5e\x47\x12\xd3\xc8\x64\xb6\xab\xda\x24\x76\xc7\xcf\xc5\x09\xe8\x7e\x7b\xdc\xd4\xaf\xc7\x1f\x43\x05\xa9\x76\x04\x4b\x90\xde\xe6\xb0\x3b\xba\x5c\x53\x22\x02\x8e\x91\xfa\x07\xa4\x8f\x86\x3e\x60\xf2\x72\x85\x32\x61\x87\x0d\xd9\x7e\x5e\x19\x49\x14\x33\x72\x01\x83\x5c\x58\x93\x2b\x5c\xb0\xd5\x8d\xfa\x90\xf4\x12\x1d\x06\xd8\x7d\x81\xa2\xf9\xff\x6e\x6f\xf6\x06\x43\x98\x68\x50\xc1\x90\x52\xbf\x9d\x9e\x6e\xe3\x99\xfd\xc4\xdc\xa3\x80\x24\xaa\x69\xae\x0b\x57\xc6\x22\xbf\xb9\x83\xc2\xb4\xb5\xbf\x40\xfd\x7b\x9a\x65\xa0\x8c\x96\xfb\xe8\x37\xb9\x4f\x4c\xf3\x75\x5a\x1d\x81\x9f\x1f\x90\xe6\xd3\xe4\x2d\x9e\xdf\xa1\xdc\x6a\x94\xb4\x9c\xb8\x2a\xe3\x7b\xf0\x23\x4f\x98\x69\xf6\xce\xff\x53\xe4\xb0\x1c\xce\x7f\xee\x73\xc3\x98\xf8\xc3\x8f\xba\x3f\x89\x38\xe8\x3c\x18\x93\x2d\x6d\xef\xfd\xb9\xa9\x7b\x7a\x8d\x76\x18\x44\xf8\x36\x8c\x49\x5e\xf3\x62\xf7\xfc\x70\xf8\x7d\x51\xdf\x34\x67\x4b\x8f\x07\x81\x87\x8b\xd0\xf4\x95\x7d\x72\xa3\x41\x98\x60\xab\xe1\x3b\xcf\x1a\x8c\x25\x06\x15\x59\x1e\x30\xcf\x0a\xcc\xd4\xc7\x12\xe0\x50\x97\x8d\x1c\xd5\x02\x27\xd7\x52\x09\x3e\xf4\xa6\xaa\x20\xaf\x53\x3e\x7a\xe6\x30\x32\xbc\x85\xa2\x29\xf3\x09\xe5\xf4\xf8\xe5\x87\x11\x30\x31\x5c\xcf\xe8\x17\xab\xc5\x64\xdd\xf3\x90\x86\x24\x1a\x8c\x43\xff\xc1\xc0\xaa\xc7\xad\x07\x3c\x4c\x34\x36\x4b\x88\x91\x18\xc5\xf8\x6a\xc4\x37\x44\xcd\x88\xc0\x3e\x60\x87\xef\x27\xf7\x47\x02\x85\xce\x46\x57\x19\xb5\xb9\x06\x47\x07\x2f\x3d\x1e\x09\x29\x54\x2f\x02\x68\x2a\xe8\xf6\x58\x4c\xc3\xa4\x83\x26\x6f\xb5\x9d\x46\xdb\x0a\x4b\xe9\x0f\xa3\x52\xba\x3b\x43\x1b\x7d\xb4\xc7\xc5\x37\x64\x61\xff\xa5\xa7\xcf\x99\xd5\x20\xe9\x71\xe2\x5f\xab\xf6\xdd\xe8\xd1\x5c\x62\x34\xc1\x8e\x94\x27\x7e\x6e\x7d\xcd\xae\x1a\xd4\x67\xde\x7a\x4b\xcf\x59\x92\x60\x6b\x8b\x5b\x86\x8b\x0a\xf3\x8c\x9f\x56\x1c\x7f\x52\x3d\xe7\x4c\x9b\xe2\xc2\x5d\x96\xbe\xbc\xd6\x28\x8e\x78\x53\x57\xe2\x89\x47\xad\x60\xf4\xcb\x37\x9e\xb5\xf3\x29\x07\x6b\xd1\x9c\xe2\xf4\x6c\xa0\x3f\x3f\x35\x93\x88\xf9\xca\xf6\x5e\xdd\x04\x78\x3c\xa1\x06\xb5\x98\x17\x35\x96\xbe\xf3\x4f\x01\xff\x3c\x49\x38\x76\x06\x14\xb9\x6b\x5f\xff\x5a\xa9\x36\xf8\xb4\xc7\xb9\xcf\x90\x9c\xe4\x4b\x5a\x75\xcd\x87\xed\x9f\x43\x81\xe9\x3f\x0c\x00\x46\x09\x12\xce\x63\x08\xa0\x67\x48\xca\xdf\x8b\x01\x2c\xd7\x8d\x91\x03\x91\xf9\xdf\xd3\xba\x4e\xbb\x5d\x9f\x8b\x28\xf6\xec\x22\x75\x84\xf3\xff\xa0\x5b\xa9\x3d\x91\x51\x9c\xa5\x87\xe5\xc1\xca\xb5\xf7\xd7\xd4\x0c\x77\xba\x29\xcc\xe7\x31\xcd\x20\x70\x83\x64\x68\x9a\x00\x76\xfb\xcd\x69\xbb\x7a\xb6\x3e\xf5\xde\x29\xfb\xb5\x23\x92\x04\x5f\x16\x5e\xe6\xeb\x7e\xbb\x2b\x41\xa7\x3f\xdc\x51\x15\x13\xd3\x91\xea\xba\x78\x46\x45\x22\xae\x44\x8c\xa6\x6e\xd1\xd4\xaf\xd6\x13\x9e\xff\xb6\x4a\x12\x1a\x8d\x66\x3b\x4e\xf3\x01\x72\x9b\x03\xe5\x18\x1f\x36\x59\x9d\x9e\x79\x0d\xcf\x4d\x2d\x8b\xb3\x83\x17\xba\x41\x60\x10\x68\xc7\x2f\x8b\xef\xa7\xd5\x9f\xab\x87\xcd\xe9\xeb\x61\xe3\xc2\x03\xe1\x13\x05\xb1\x13\x76\xcc\xd5\xd0\xbd\x17\x81\x47\x30\x9b\xd6\x6e\x0c\xb6\x6f\x74\x58\xa8\x10\x01\xf1\x91\x22\xb1\x75\xec\xfb\xdb\x12\x61\x18\x60\x08\x79\x2e\xde\xc1\xf0\x59\x75\x47\x22\xc3\x67\x5c\xd9\xce\xec\x5d\x59\xfc\x98\x54\x23\x45\xc8\x62\x8f\x0f\xe2\x73\x9b\xab\xea\x2e\x91\x98\x32\x5c\x93\xeb\x34\xe7\x59\x8f\x81\x11\x21\xd7\x98\x99\xd9\x3e\xad\xf6\x9b\xc5\x61\x33\xfc\x66\x22\x54\x1c\x8d\xf8\x1a\xde\xd3\xac\x12\xbd\x03\x21\x88\x22\x6e\xa2\xdd\x97\xc5\x07\xaa\x4d\xe2\xaa\xc5\xee\xb4\xa9\x7d\x16\x04\x28\x06\x8d\x5f\x8a\xfc\xe5\xad\xc8\x5f\xa0\x1c\x78\x88\x82\x68\x8e\xb1\xc5\xa9\x1c\xb5\xaf\x39\xc7\x5b\xd0\x98\xa2\x67\x72\xd8\x3e\x20\x7d\x8e\x81\xf6\xfd\xb1\xeb\xbf\x07\xd5\x1e\x16\x3d\xd0\x0d\x6e\xfd\x8c\x45\xae\xb0\xf1\xa8\xea\x47\x44\xd4\xb7\xfa\xe5\x69\xfb\xd5\x5d\x87\xd1\x94\x6a\xd7\x8e\x8f\x23\x11\xab\xce\x7f\x1e\x12\x4f\xcc\x39\x9e\x22\x06\x81\x5e\xc2\x0b\x3f\xc3\x89\x67\x93\xb2\x93\x60\x41\x84\x3d\xcd\x2f\x7f\xc3\xd7\x4a\x75\x7f\x25\x42\x5b\x44\xda\x14\x8f\xc6\xdc\x10\xce\xb0\xb8\xba\xfa\xb6\xc8\xe0\x2f\x9e\xab\xd2\xa5\xe3\x45\x12\x50\xbf\xe7\x9e\xda\xa5\x93\x78\x49\x24\x22\xa4\x7d\x8e\xdf\xd8\x99\xe5\x67\xbd\x4e\xa3\x3d\x43\x24\x82\x49\xe8\x0b\x6d\xc7\x62\xa1\xde\xd3\xea\x56\x7d\xcb\x0d\x07\x29\x2d\xd0\xef\x89\xcf\xe4\xce\x27\xc3\x39\xe5\xca\x84\xa4\xe7\x35\x68\xc8\x2b\x58\x75\x92\x36\xee\xe1\xb8\xf4\xb9\xe9\x2f\x7e\x4c\x5f\xca\x5b\x0b\x6f\x87\x89\xc0\xe3\x74\xc0\x5e\xf3\x33\x0a\x63\x77\x0a\xed\x54\x3b\xb0\x6b\x60\xd7\xfe\x70\x55\xcf\x00\x90\x85\x60\xc6\x0f\x70\x8e\x23\xb2\x32\xd9\x63\x2a\xd4\x18\xf0\xa9\xe6\x7c\x19\x31\xde\x8d\x2f\xa1\x58\x18\xf9\x3d\x46\x64\xdb\x7d\x7b\x08\x21\xe9\xb1\xfc\xcf\x5a\xa3\x72\xb0\xdd\x77\xe1\x06\x10\x25\x80\x08\x7b\xa1\xfc\x3b\xd2\x7e\x1e\x40\x16\xb9\xda\x95\xe9\xdf\xf0\x3b\x5c\x6d\x75\x9b\x74\xc3\x63\x8e\x35\x55\x4b\xc3\x69\x52\x03\xeb\xb4\x84\x41\x5d\xac\xdf\xd1\xa5\xef\x53\x87\xab\x34\x65\x5f\x43\xef\x31\x7a\x16\xe9\x87\x21\x7e\x93\xf5\xe2\x68\x8c\xfc\xe6\xc9\x25\x68\xa5\x9f\x28\xdc\x24\xce\x85\x7c\x3b\x65\xc3\x82\xa3\xf4\x85\xe1\x8b\xb0\x84\xfa\xb6\x39\xee\x9e\x57\x37\x82\x7e\x66\x30\xb3\x10\x5d\x0b\xc6\x47\xc0\xde\x68\x66\x4b\x5f\x9a\x9c\xbc\x05\x56\x2f\x66\xda\x8d\xa4\x0f\x20\xa4\x4b\xcd\x0f\x4b\x6c\xa3\xcd\x54\x06\xd2\x63\x36\x60\x44\x12\x5a\x03\x52\xb5\x07\x43\x65\x84\x15\x06\x7e\xb8\x21\xd6\xf6\x5d\xd5\x5c\x12\x42\xbc\xce\x55\x37\x96\xe1\x59\x77\x9d\x2c\x2e\xdd\x55\x75\xc3\x63\x23\x05\x80\x8f\x37\x26\x33\x6d\x8f\x2a\x86\x2f\xf8\xae\xc9\x55\xc9\xd3\xea\x1f\x08\x7b\xce\xa6\xf1\x67\x8a\x65\x3f\x5d\x13\x32\x0a\x85\xe1\x8d\x46\xe3\x98\x0d\xde\xf8\xbc\x0b\x25\xa9\x17\xa8\xce\x27\x58\x54\x95\xc1\xe6\xb9\x83\x81\x51\xb1\x5a\x97\xce\x31\xfa\x59\xd9\x40\x52\x4e\x0c\xef\x2d\x57\xc7\xb2\xc8\x67\x0b\xa2\xdd\x50\xca\x5c\x52\x03\x3f\x04\x72\xbd\x3c\xdd\x30\x80\x49\x4f\xc6\x34\xc1\xf5\x79\xa8\x8b\xcb\x65\xb4\xdd\xc8\x38\x0e\x42\xea\x80\x8a\x96\xb7\x60\xb0\x16\xe2\x58\xc4\xbd\x66\xf6\xb0\x32\x63\x52\x4e\x77\x45\x79\x5f\x64\xaa\xf3\xd1\xe7\xd6\x13\xf3\x8d\xf0\x73\xdd\xb9\x32\xe9\x14\xa1\x25\x59\x28\x3d\xe5\xe6\x82\xa8\x97\xd7\xad\x9a\x8e\x60\x81\x3f\x48\x01\x5a\xcc\xdd\xff\x7f\x9f\x96\x89\x88\x0e\xf5\xb0\x07\xac\x33\x23\x1d\xf1\xf1\xb2\x60\x52\xe2\xc6\xbf\x2b\xe1\xcb\xe6\x61\xeb\x1a\x74\x64\xe2\x03\xed\x53\xb1\xb8\x80\x0f\x7d\xc7\x96\x4c\xa2\x04\xe9\xf0\x96\x65\x9a\xbf\xfd\x3d\x72\xe1\x64\xc2\x0c\x9d\x88\x71\x60\x0a\xfd\xdb\x64\xca\xda\x61\x5c\x04\x08\x47\xfa\xcf\x7f\xbe\x7f\x19\xc6\x8c\x92\x2b\x23\x72\xd1\x37\xd5\x3e\x4d\x31\x6a\x52\x86\x34\xb2\x9b\x36\x92\xd2\xe1\x57\x43\xd0\xf0\xf8\xa5\x48\x0a\xc2\xef\x70\x7d\x36\xa1\x68\x16\x23\x73\x43\x24\xc3\x2e\xac\x27\x2e\xa7\x6d\xdb\xbf\x5c\x84\xe3\x1f\x53\x3e\x48\xdb\xe2\x5c\x94\xea\xa1\x78\xf9\x25\xba\xb8\x19\x73\xb1\xb4\xd7\x08\x20\xb4\x7b\x7d\xf9\x02\xdf\x7b\xde\xe7\x59\x1c\x99\x54\x11\x41\xd5\xa5\x7b\xb3\xeb\x60\x61\x63\x3c\x42\x7b\x34\x36\xb4\xe0\xdc\xd4\x4e\x4f\xef\xb1\x7b\xd3\x3a\x08\xc0\x31\x1e\x40\xae\xee\x53\x5d\xcf\x99\x6a\xcd\x63\x88\x1c\x52\xc0\x76\xa1\x8c\x87\x28\x8f\xfa\x98\x88\x72\x1d\x30\x9f\x58\x2b\x37\x9a\x73\xa3\xf1\xcb\x0b\xac\xec\x56\xa9\x03\xe5\x29\x3f\x48\xb0\xe0\xb3\x6c\x5d\xab\xba\x0d\x1d\xa0\xc4\xb4\x42\xd6\x8d\x08\x8d\x0f\xf9\xb8\x7d\x3a\x2d\xbf\xfe\x69\x44\x53\xdd\xc1\x80\x26\x48\x56\x6f\xa0\x41\xd6\x5e\xcc\xfa\x32\x2a\x60\x21\xd2\x5c\xb5\xef\xe4\x50\x34\x65\xd7\xd8\xab\x42\x1d\x22\x3a\xa5\x32\x9d\x16\x16\xcb\xd4\x5a\x80\x47\x7e\x99\x3c\x38\x89\x3b\xbf\x64\xb5\xfa\x62\xd2\x83\x41\x38\x9a\xac\x8a\x68\xd3\xf8\x03\xe7\xb4\xee\xda\x92\x1d\x1f\x9b\x59\xeb\x13\x83\xa0\x68\x44\x31\x6d\x77\xb7\x59\x1c\xbf\xee\x37\xa7\xe3\x7e\xf1\x74\xb8\xdb\xec\x5d\x0e\x4f\x51\x69\x34\x5e\x2e\x4d\xfe\x56\xed\x7b\x91\x6e\x63\xa2\xdd\xa8\x38\x22\x58\x84\xb3\xa2\x8f\x8b\x07\xe7\xf0\x2b\x46\x24\x7e\xd3\xe3\x20\xc1\xf6\xf3\x3c\x9f\x62\xc2\x73\x3d\x5f\x3b\xa8\x17\x4d\x69\xfb\x34\xe9\x88\x53\x68\x38\x9b\x55\xe2\x7b\x52\x39\x11\x83\xfc\xad\xef\x74\xea\xaf\x9a\x68\x23\x34\x89\x29\x86\x0b\x94\x3d\xca\x5f\x71\x11\x59\xa9\xec\x73\x9a\x8f\xb3\x3b\x4a\x10\x85\xb1\x15\xbe\x18\x0b\x49\x6b\x67\xc4\xf6\xa9\x9d\x10\xdd\x28\xa6\x10\x82\x8a\xd4\x99\xc7\x02\x59\x7a\x66\x37\x1c\x25\x35\x0d\x4d\xb7\xc7\x03\xaf\xea\x3d\x97\x70\x97\xe6\x55\xfa\xda\x6d\x76\x0a\x42\x65\x14\x54\xfa\xda\xba\x09\x50\x33\x50\xdb\xd5\x62\x77\x83\x70\xb8\x55\xf5\x96\x9e\xd2\x71\xac\x3a\x0a\x0f\xfd\xc4\xa7\x16\x0b\x3c\x6a\xba\x9a\x3f\x5c\x93\x85\xf5\x14\x27\x0a\xfe\xff\x33\x39\x2b\x31\x6c\x28\xff\x3f\xd2\xde\x6c\xb9\x71\x1c\x5b\x17\x7e\x9d\xba\xe8\x0b\x02\x20\x09\xf2\x52\x96\xe5\x4c\x77\x7a\xda\x92\x32\xb3\xea\x74\x74\x28\x30\x2c\x58\x6c\x53\xa4\x36\x07\x0f\xf5\xf4\x7f\x70\x01\xe0\x24\x3a\xb3\xcf\x7f\x62\x47\xec\xec\x32\x41\x8a\x23\xb0\x86\x6f\x70\xac\x35\x8f\x97\xb8\x4c\x00\xdc\x78\xc2\x55\x6c\xd5\x53\x8a\x5d\x03\xe7\x3d\xd4\xcd\x68\xe1\x04\x92\x44\xc8\xe6\x7f\x7c\xd8\xec\x6f\xef\x37\xbb\xc7\xbb\xeb\xd9\x69\x92\x94\x91\x41\xba\xeb\xa6\xb2\x37\x64\x68\x7b\x2f\x4f\x91\x40\x80\x7a\xef\x83\x21\x5e\xe8\xc9\x58\x8b\x48\x5f\xa0\xd4\x20\xcd\xd6\x2a\x52\xda\xa5\x79\x2a\x0d\xa7\x02\x60\xc4\x59\xce\xbc\x8a\x46\x5c\x52\xa9\x47\x19\x3f\x30\x12\xa1\xe4\x81\xc3\x1e\xec\x5a\xf9\xeb\x17\x1f\x18\xe1\x46\xfa\x08\x73\x2c\xc6\xd8\x6d\x63\x14\x7b\x55\x67\x57\xe0\xb1\x91\xa1\x17\x80\xef\x06\x70\x49\xc6\x95\xec\xb1\x25\xfc\xe2\xe9\x45\xa9\xb5\x30\xcb\xf1\x3d\x6c\x5c\x30\xd0\xad\x6d\x37\x65\xe5\x95\x0c\xff\x18\x94\xe3\xba\x5d\x8c\x44\x74\x9c\x35\xde\xbd\xb0\x42\x77\xa3\x38\x31\xd8\x4c\x68\xca\x6f\xf0\x61\xc3\xfe\x85\x28\x0d\x38\x4b\xb0\x8f\x58\xb7\xa7\x93\xcb\x06\x7d\x54\x0b\x3c\x49\x95\xc2\x47\x31\x26\xa0\x4c\x20\x94\xc0\x53\xa6\xc6\x35\xc3\x41\xe1\x63\xe9\x83\x00\x9e\x0a\xe2\xe0\x00\x0b\x4a\x9e\x2a\x80\x44\x68\xcc\x87\xee\x3e\x74\x26\xc6\x18\x49\x48\x89\x4d\x21\x5e\xb2\x3c\x5f\xe5\xf9\x9f\xab\xdb\x3d\xca\x8f\x0c\x35\x59\x48\x89\x35\x7e\x36\x59\x91\xd5\xc7\xa7\x1f\x1b\x9b\x17\xcf\x1a\x7e\x90\x12\x2b\xb4\xf6\x65\xbb\x1e\x87\x22\x20\x82\x54\xdb\x98\xaa\x2f\x88\x80\x88\x18\x2e\xa8\xc2\xe5\x00\x36\xdf\x7e\x2a\xcb\xfc\xba\x1f\x12\x1b\x44\x66\x37\x50\x37\xec\x50\x83\xa8\xd4\xb1\xdf\xa6\x01\x63\xe6\x93\x78\x01\xcc\x0c\xfe\xcb\x28\x6f\x5e\xe9\x9c\xfd\xe7\xf2\xe7\x26\x29\xc3\x6a\xda\x92\x81\xdf\x24\x1e\x9c\xef\xa7\xac\xee\xde\x2e\x3b\x9d\x91\xb4\x66\x1d\xc0\x0a\xf0\xab\x30\x48\x2d\xc5\x80\x8e\x00\x8d\x46\xd6\xd6\x89\xe3\xd7\x45\x01\x50\x51\x24\x5c\xb3\xec\xa9\x7c\x81\xd3\xb2\x81\xaf\x0a\x40\xa7\x71\x3a\x48\xce\x5f\x09\xf5\x02\xc5\xfc\xe5\xd0\xdd\xe1\xac\x30\x90\x68\x32\xf1\x5a\x5f\x43\x81\xd6\x40\x6e\x3b\x04\x32\x11\x3e\x3c\xbf\xf1\x66\x27\xbf\xfa\xfc\x20\xe2\x78\x7a\x88\xb2\xb6\xea\x61\xfb\x45\xc5\xfc\x6e\x6c\x6c\x99\x12\x07\x6c\x31\x7c\x26\xeb\xaf\x02\x30\x82\xc4\xc4\x67\x00\x4e\x08\xd8\x5b\xe8\xba\xcf\x75\x5c\x59\x34\x81\xb2\x0e\xb0\xf6\xd2\xef\x9d\x7c\xc0\x42\xe5\xc2\x04\x90\x52\x97\xcf\xbb\x15\x92\x4d\x6f\x91\x21\x44\x10\x37\x7b\x75\x7f\xc5\xce\x17\xba\x97\x64\xc5\xa8\xf8\xf0\x8f\xd9\x4e\xb1\x11\x3d\x61\x6e\x41\x93\xf5\x97\xe9\x6a\xe2\x0f\xc2\xb5\x53\xd8\x83\xba\xee\xad\x64\x55\x60\x58\x4c\xe9\x70\x79\xdd\x24\xf7\x4b\x0d\xec\x6e\x0f\x21\x11\xf3\x78\x45\xaf\xba\x19\x60\x86\xdd\x33\x61\x40\x9c\x0b\x65\xdd\xc2\xcd\x20\xa7\x30\x3b\x4a\x98\xc6\x28\xee\x09\xe8\xc6\xd0\x58\xa1\xa0\x49\xfd\xce\x84\xd2\x60\x79\xaf\x90\x16\xde\x53\xf7\x1b\x34\x4d\x65\x6f\xff\x39\xb5\x5a\x9d\xfd\x8a\x09\x09\x8c\xd2\x4a\x53\x41\x7d\x44\xa5\xef\xd9\xb3\x8b\x78\x84\xa5\x14\x68\x8e\x87\x1a\x40\x1f\xc4\xb8\x7c\x6c\x22\x61\x6d\x21\xad\x3c\xe2\xfe\xd8\x63\xf4\xbd\x47\x5d\x37\x46\x46\x86\xfb\x08\x5e\x95\x85\xc6\x9a\x68\x17\xc4\x8f\x2c\x68\xfd\x58\xad\x52\x3e\x2d\x72\x7c\x2f\xac\x52\xaa\xff\xc9\x38\xb4\x52\x18\xa2\x69\x84\x3a\x62\x0d\x7a\x76\x90\x38\xe2\x6c\xd0\x41\x46\x99\x03\x91\xdb\x81\xe3\x55\xc4\xc4\x49\x12\xa5\x7d\xfe\x98\x9d\xda\xd3\x97\x4a\x28\xcf\xdf\xf2\x83\x04\x33\xa9\xcb\xcf\xab\x57\x40\x82\x78\x17\xee\xf4\xdb\xbb\x20\x70\xdc\x14\xec\xa2\xd4\x91\x8f\x66\x3f\x8c\x4b\x57\x95\xbc\x75\x9d\xdd\xf9\x6b\xb9\xb0\xd0\x19\x1e\x68\x44\x79\xdc\x3e\x7e\x9f\x24\xb0\x86\xab\x30\x1d\x5c\xfc\x0e\xe7\x5c\x14\xfd\xf2\x66\x12\x6a\x7d\xa3\xb5\x55\x4d\x7d\x34\xb3\x93\x49\x52\x4b\xc3\xd7\xa0\xbc\xa5\x78\xf7\x57\x6d\xd3\xba\xfa\x58\xb6\xb9\xde\x1f\xab\xf2\xed\xb1\x58\x35\x0d\x9c\xce\xcd\xbe\xf4\x41\xf8\xbe\x7c\x68\xf3\x89\x9f\xb2\x0a\x4c\x1a\x13\x14\x9b\x1a\x5b\x80\xab\xc0\xe8\x90\xc9\xd0\x85\x09\x08\x69\x98\x7d\xf6\x5a\x0a\x04\x2d\xfd\xb5\xbe\xba\x1d\xaf\x69\x06\x62\x95\x5a\x65\x1d\x6b\xee\x8f\x1a\xa5\x57\x60\xca\xcf\x3a\xbc\x06\xa4\x35\xcc\x35\x6d\xa1\xad\x41\x8d\x13\xe9\x40\xdd\xd9\x51\x59\xc0\x00\x00\xe6\x1b\x9b\xaa\x2a\xab\x69\x37\xcb\x18\x66\xeb\x74\xb7\x77\x37\x9e\x1d\x82\x5b\x48\x10\xa4\x06\x67\xa8\x06\x51\x0e\x58\x98\xb2\x96\x83\x93\x58\x8b\x04\x84\xc5\x23\x77\xc5\xc9\xdb\xb9\x88\xa9\x21\x01\x25\x01\x92\x4b\xaf\xaf\xae\x7f\x8c\x6e\x02\x09\x58\x4a\x31\x2a\x73\x51\xf5\xe6\xbd\x01\x74\x7b\x98\xee\x1e\xb2\x08\xc3\x9d\xee\x1e\x6f\xaa\xf6\xec\x8b\x0c\x56\x9d\xc9\x0d\x8a\x89\xed\x37\xd4\xc7\xb6\x39\xf4\x86\xce\x8a\x04\x9c\x52\x0c\xa2\xdb\x22\x53\x65\x55\x5c\x55\x00\xba\xa7\x9f\x91\x80\x47\x8c\x8e\xbd\x91\x2c\xcb\x69\x69\xe2\x22\x01\x4f\x63\x2c\xa4\x1f\xce\x50\x99\xb2\x3a\x0d\x2f\x4c\x97\x79\xfc\xcc\x9a\xe3\xd6\x26\xca\x97\xd2\x3e\x4b\x69\x08\x09\xb8\x10\xb1\x95\x75\xd5\xab\xba\x2e\x55\xd6\xe5\xa0\x9f\x80\x1b\x26\x73\xfc\x05\x64\x7b\x7e\xa6\xd2\x52\x2d\xd7\xfb\xf5\x55\x7f\xa5\x40\x10\x1b\x28\xb4\xf6\xea\xac\x8b\x27\x95\x50\x85\x5a\x12\x7f\x5d\x89\x42\x14\x62\x08\xf5\x48\x90\x08\x2d\x64\xef\xfc\x53\x0c\x7a\x01\xc3\x2f\x27\x3a\xc2\x77\x4f\x8f\x68\x27\x37\x18\xf6\xf9\x8f\x86\x04\x69\x62\xbb\xae\x8e\x6c\x7e\x93\x55\x75\xe3\x5d\x33\xba\xcd\x10\xd0\x1e\x82\xa5\x33\xe3\xff\x2e\x82\x04\x4b\x8c\x36\xbe\x59\x7b\x6d\x14\xbf\x59\xb2\x00\x6d\xa3\x6d\xf8\x3d\x43\xc4\xaf\x73\x91\x9d\xfa\x91\x29\xc3\x37\xb8\xb6\xf6\x22\xfd\x9f\x21\xc2\x3e\xf1\xb3\x38\x8f\xb1\xb2\xdd\x06\x83\xfe\x32\xeb\xb2\xd0\xc8\x6d\xab\xa7\x8a\xc2\xd3\x3b\x80\xcd\x0a\x4b\x54\x44\x1a\x99\x16\x1f\xd6\x7c\xb2\xfe\xc3\x2a\x58\x8f\xa6\x3f\x12\x28\x16\xe2\x9a\x89\x0c\x6d\xe4\x1e\xff\xf1\x89\x8f\xf0\xff\xe3\xbf\xfd\xef\x45\xa1\xab\x94\x6c\x26\xb0\x22\xbf\x1d\xa8\x0c\xa6\xfc\x21\x63\x7c\xd6\xbf\x7c\x48\xdd\x45\x37\xf8\xc8\xb5\x7d\x2b\xd6\x65\xde\xed\x59\x5d\xfa\x8c\xcd\xf7\xd4\xa1\x77\x2b\x77\xdd\xc3\x7e\x65\x9d\xbd\x94\x10\x19\x6c\x00\x7f\x81\xd3\xf8\x85\x04\xae\xb1\xa3\x27\xad\x95\x42\xd6\x0c\x2f\x19\xa4\x52\x04\xa3\x09\x16\x09\x4b\x5b\x2c\x40\x82\x9e\x65\x65\x24\x00\x49\x30\xdd\x3b\xf8\x79\xa0\x3f\x8c\xb1\xd6\x47\xaa\x3c\x9d\x45\x05\xfe\x49\xba\xad\x86\x08\x9b\x77\x56\xe5\xfb\x44\xf3\xb8\xdb\x16\x05\xb8\xed\x5b\xab\xcb\x1a\x5d\x88\x17\xc0\xa7\xbf\x79\x5a\x46\xc4\x88\x95\x54\x36\xec\x7f\xf2\x3e\x59\x85\xd3\x91\x6d\x07\xf6\x74\x37\x98\x27\x53\x9b\xb7\xfa\x47\xd9\x7c\x42\xad\x21\x81\x91\x96\x0e\x59\xc1\xf5\x70\xbd\x24\x10\x06\xc5\x82\x7e\xf9\xc8\x49\x00\x31\xde\xdc\xaf\x20\xf2\xe6\x38\x7a\x22\x84\xb0\x18\x5b\x1b\xaf\x16\x0e\xe1\x8a\x62\x4b\x68\x65\x42\x68\x48\x30\x44\x3b\xa8\x5c\x54\x99\xf9\x78\xfa\xf1\x34\xe5\x1a\x10\x42\xe3\x80\x8c\xd5\x7a\xee\x32\x39\x64\xb2\x4b\xc5\x58\x42\x28\x37\x88\x8c\x77\x8b\x0a\xd2\x44\x7e\x95\x0b\x11\x42\x45\x80\x50\x09\xdf\xab\xb7\x6f\xf1\x83\x97\x65\xee\x46\x68\x63\x45\xee\x70\x4b\x6f\x88\x36\x84\xd9\x84\xb0\x80\xe8\xd0\x4b\x11\x0f\xbc\x16\xab\x06\x86\x00\xbc\x7b\xf1\x3e\xbb\x01\x4c\x13\x14\xc8\xfa\x73\xb3\xfe\xcc\x49\x3c\x99\x9d\x6b\x18\x30\xa4\x7c\x9f\xc4\xfb\x5d\x86\xb7\xd8\x46\x9c\xfe\x95\x24\x21\xb3\x77\x2c\x53\xe5\x53\x2e\x9a\x6e\x9d\xf2\xfd\xd4\xe9\x54\x4d\x22\x19\xa0\x86\xe7\xfa\xaf\x9b\xf1\xaa\x4c\xe2\x30\xea\xdd\x82\x0e\xcd\xb1\x02\x8f\xb2\x5a\x21\x15\xe9\x46\xe4\x75\x7f\x63\xe2\x88\xa3\xad\xdc\xe1\x60\xb3\x88\x83\x17\xe3\x9c\x5d\x69\x1c\xf1\x84\x4c\xa3\xde\xc7\xa2\xe7\xba\x11\xc2\x19\x57\xdc\x9b\x99\x54\x75\x83\xee\x34\xb3\x63\xf0\x90\xa0\x8e\x5b\xdd\xca\x53\xd6\x6c\xe1\x35\x83\xb7\x21\xf2\xf0\xcd\x20\x42\xb8\xb2\xaf\xf0\xfe\xad\xbc\xce\x4e\x50\xd4\x03\xba\x86\x90\x24\xf0\x6a\x6d\xcd\x4d\x5e\xf6\x73\x3c\x49\x42\xcb\x0c\x51\x6e\x06\xfb\xbf\xf0\xc8\xee\xf6\x16\xa9\xf6\x6d\xd4\xac\x56\xb6\x24\x31\xbb\xdd\x29\xb1\x2d\x00\x2b\xf9\xf0\x68\x36\xef\xea\x78\x5b\x6c\xea\x2e\xad\x7f\x10\xf5\x55\x29\x97\x3f\x54\x92\xea\xc0\x7a\x99\x58\x12\xa4\x6f\x9f\x2c\x0f\x16\xa1\x44\xac\xfd\x63\x95\x3d\x0f\x5f\xa5\xa4\x14\x6d\xd3\xe1\x7f\xdb\xec\x3c\x4d\xdb\x08\x91\x3a\x8c\x3c\x70\xfe\xd1\xdc\x89\xba\xf9\x2a\xf2\xd7\x21\x46\x22\xd2\x84\x88\x53\xfc\x44\x58\xeb\x42\x0c\x37\xf9\xd7\xbf\x07\x1b\xef\xa9\xa1\x37\x1e\x2d\x41\x69\xe3\xf5\xdd\x9f\xbf\x6b\x56\x12\xa2\x02\xa5\x5c\xca\xee\x1a\xf0\x96\xe1\xed\x36\xeb\x54\xa7\x4e\x45\xd4\x7a\x6f\xd9\xe4\xb8\xdf\xac\xc1\x9b\xed\xdc\x8b\xa2\x35\x02\x11\x94\xf3\xf7\x0a\x88\xf1\xb2\x30\xf7\xfd\x8b\x0d\x46\x69\x27\x63\x63\x83\xed\xbe\xec\xd7\x8c\xf8\xb6\x84\x98\xd0\x62\x38\xb1\xff\xf1\xb0\xd9\x8f\x49\xde\x84\x18\x49\x10\x06\xda\x54\x6d\xdd\x40\xef\x02\x33\x6d\x4d\x12\x1a\x84\x4a\x38\xb9\xed\x41\x0c\xe7\x5f\x84\xf4\xab\xe0\xbf\x42\x7f\x67\xe9\x70\x43\x1d\xf8\x80\xd0\x80\xc7\x58\x76\xb6\x5c\x83\x2f\x55\xd9\x9e\x1f\x46\xba\x22\x84\x06\x9a\x60\x3a\x5d\xb6\xdd\x84\xe1\xf2\xbc\x69\x58\x4f\x89\xb4\x05\x4f\xa7\x82\x61\x7f\xb7\xbb\x6b\x83\xf2\xb9\x1b\x49\x79\x84\x37\x1d\xd3\xfc\xaa\xe7\x17\x83\x1e\x81\xad\x09\x65\x94\x21\x98\xe3\x59\x9c\x60\x9d\x97\x05\xc6\x8a\x7e\x5b\x62\x9b\xc5\xf2\xf4\xf1\x5b\x44\x25\xa1\x4c\xd8\x84\x43\x96\x65\xdd\xe0\xa1\x2c\xb5\x74\x76\x13\x43\x66\x7d\xf1\x84\x2d\xbe\x3b\x6e\xc5\xf4\xd4\xc3\xd8\x99\x9e\x67\x27\x8b\x91\x16\xcd\xf1\x4d\x7c\x20\xae\xb9\xa7\x78\xfb\x15\x9c\x86\x40\xa1\x77\x75\xba\x82\xc6\x9a\x6f\x8c\x26\x7d\x1a\x71\x29\xb4\xf7\x6c\x10\x75\x9d\x15\xcf\x2b\xff\x90\xfd\x51\xa2\xc4\xd8\xde\xf4\xfb\x85\xf6\xbb\x22\x34\x66\x36\x05\xea\xe3\xad\x47\x89\x42\xeb\xfa\x9f\x8f\x7f\xcd\x2e\x30\x8e\xad\xcb\xec\xb9\x7c\xa3\x57\x08\xee\xfe\x63\xba\x3d\xa5\xba\xd7\xc9\xc7\x97\x76\x79\x8e\xa0\x9c\xa4\xc2\x51\x8a\xb0\xd1\x78\x0d\xe7\x2e\xef\x2a\x96\x4c\x75\x86\x79\x95\x72\x16\x63\xf5\xc7\x58\x06\xb7\xad\x5a\x0c\x12\x51\xdd\x00\x1b\x72\xe5\xd9\x0b\xac\x21\x07\x59\x65\x23\x6d\xc8\xd9\x39\x88\x5e\x6a\xbf\x07\xf3\x7e\xed\x8b\x53\x84\x72\x45\x71\x1e\x13\x5a\x3b\x9f\xe5\x69\xc9\xd5\x0f\x03\xc0\xca\xf2\x0e\xab\xbb\xdf\xeb\x81\x0a\xbb\x50\x55\x27\x34\x51\xa9\x0b\x23\x9b\xab\x36\xcb\xbb\xcb\x58\xea\x04\xb8\xd1\x29\x55\x28\x57\xd4\x25\x9e\x1e\x49\x44\x68\x1a\x52\x6a\x79\xa2\x1f\xa5\x99\xc5\x91\x34\x8d\x42\xe7\xdc\x86\x6d\xda\xfb\xac\x18\xb4\x4e\x08\x4d\x13\x8a\x4b\xc0\xa1\x86\xc6\x09\xc8\x65\x8d\x6d\x02\x50\x32\x7b\xda\x22\x30\xae\xe8\xdd\x7d\x8f\x5b\x78\x85\xaa\xb6\x8a\xb8\x53\xa8\x12\xa1\x02\x22\xec\x1f\x5b\xca\xca\x6d\xe1\xf3\xa9\x71\x95\x87\x50\x61\x08\x62\xcc\x4c\x76\xae\x3d\x61\xf0\x8f\xcb\xd2\x2b\xa1\x92\x46\x58\x2f\x14\xd8\xc3\xdc\xb5\xf2\xaa\x2a\x5f\x46\x63\xa7\x17\xac\x68\x40\xdd\x3c\xf9\xa5\x12\x67\xa8\x77\x59\xa1\xc0\x2e\x22\xd5\xeb\x48\x42\xb0\x1f\x0f\x88\x74\x10\xb2\xc6\x45\xa8\x17\xdf\x20\x54\x31\x82\x0b\x03\xb6\xdb\xf2\x1c\x99\xd8\xfd\x74\xa2\xb9\x35\x6a\xb1\x35\x8d\x76\x10\x80\x25\x54\xa7\x1c\x17\xdf\x6b\x78\xfd\x92\xbd\x02\x62\x54\xc6\x12\xdf\x84\x6a\x50\xf8\xd9\x1f\x0c\x34\xea\x68\x81\x47\x37\x65\x75\x0f\xdd\xab\x72\xf1\x49\x02\x8f\xad\x39\xfa\x73\x05\x28\x0d\x89\xc0\x1a\x7f\x2c\x90\x04\x21\xe8\x8e\x44\x82\x2c\xbb\x21\x2c\x1f\x8c\x0b\x97\x5f\x29\xd0\x1a\xe5\x86\x37\xdf\xb7\xb6\xf7\xe3\xfe\x6e\xc2\x04\x97\x91\xd5\xc0\x4e\x86\xea\xc2\xb4\xe6\x1f\x8b\xb2\x87\xfe\x10\x42\xe1\xa4\x5a\x16\xf0\xb5\x2d\x74\x05\x7a\x7f\x2c\xdb\x5a\xf4\x09\x2e\x0b\x68\x6c\x73\x3b\x8b\x60\xb4\xf1\xf1\x7a\xd6\x4c\x27\x2c\x88\x2c\x60\xf6\x19\x9a\x35\xe4\xf9\x08\xa2\x45\x58\x90\x0a\x70\xe1\x13\xca\x13\x97\xd5\x6c\x67\x12\xa4\xd8\x27\xb2\xd5\xa1\x07\x78\x73\xb0\xb2\x45\x2d\x7e\xc2\x88\x50\x58\x52\xe9\x3e\x48\xa8\xbd\xbf\x4e\xaf\xfa\xef\x46\x51\x42\x7c\x77\x0a\xd5\xe9\x2c\xde\xed\xbf\x4a\x78\x19\x95\x0a\x09\xc6\xae\xcf\xf8\xb9\xe2\x0d\x61\x54\x6b\x34\x37\x11\x6d\x73\x2c\xab\xec\x6f\xd0\x16\xed\xee\x35\xca\x9e\xaa\xec\x55\x5c\xc2\x2a\xdc\xde\x8c\x48\xe5\xa4\x3b\xaf\xbc\x29\xd1\xee\x3c\x61\x33\xf8\x91\xcc\xe2\xdc\x6a\x68\xfc\x6c\xe5\xcc\xd5\x4f\xbd\xde\x5f\xb2\x14\x5d\xb9\xfd\x43\x69\x6b\x87\x47\xc8\xfd\x2a\xc3\x22\xc2\x61\xb8\xef\x33\x78\xc8\xf8\xfb\x66\x91\xa0\x3a\xf1\x6e\x4e\xea\xe5\x19\x75\x6b\x2f\xf1\x87\x84\x45\x2a\xc0\x17\xea\xf9\x6f\x78\x82\xaa\x17\xb7\x27\x8c\x87\xb6\x64\x8b\x21\xd7\xf7\xdd\x35\x2e\x22\x93\x92\x09\x4b\x48\x1a\xb9\x2c\xc4\xe6\x3e\x59\x31\x54\x78\x58\x42\x00\xd3\xa9\xeb\xb6\x51\x47\xaf\xfc\x76\x09\xb3\x26\x2c\x89\xed\x0a\x8c\x78\x53\x51\xe9\xad\x68\x46\x15\xf5\x7f\x8c\xdf\x91\x34\xa1\xd0\x73\x3b\x46\xbf\x95\xa6\x14\x2b\xb4\xf7\xd0\x08\x9d\xb5\xbe\x08\xc4\x04\xb1\x7e\x29\xd6\x81\x1b\xed\x61\xb1\x06\x31\xa9\x97\x12\x26\x64\x80\x15\x86\x9f\x8f\x77\x37\x61\xbf\xaf\x11\x38\x07\x94\xf2\x3f\xa0\x9a\xc3\xb2\x56\x00\x61\x92\x52\x30\x23\xe3\xa8\x91\xdb\xe8\x4a\x5e\xa6\x16\xb3\x9d\x5d\x46\xe4\xbc\x5c\x6b\x5c\x01\x1a\xd0\x4e\x96\x71\x0b\x42\x0d\x25\x35\x26\x59\x92\xba\x06\x14\x8a\xbf\xce\x8e\xc5\xa9\x48\xc6\xa0\xb4\xeb\xa7\xd9\x08\x15\x27\x38\xe9\x1f\x84\xd6\x5e\x49\xee\x93\xf7\x5c\x09\xc6\xc3\xa1\x2b\xd9\xd7\x9d\x09\x03\x9a\x20\x1c\xec\x24\xde\xf7\x55\x26\xf2\xeb\xaa\x3c\xfb\x09\x9c\x99\x50\x60\x8f\x04\xd5\x24\x26\x87\x26\xd4\x3f\x43\x23\x03\x2c\x1e\xc8\x0a\x40\x3f\x16\x63\x9d\x70\x1f\x8b\x4c\x02\x93\xa5\x94\x21\x0c\x62\x86\x46\xc6\xa2\xd5\xd9\xec\x69\x86\x41\xa2\x7c\xf6\xd7\xad\xfb\xdd\xe4\xbe\x24\x25\x40\x42\x02\x31\x0e\xdc\x6c\xd7\x9c\x12\xe7\x35\x5b\xa1\x06\x80\x33\xf0\x1a\x02\xa3\x90\x80\xc6\x3b\xd2\xc7\x70\x08\x48\x5d\xc0\xad\x93\x90\x86\x09\xba\x46\xe6\x95\xda\xf5\x38\x1a\x12\xd2\x54\xe1\x04\x87\xa0\xe4\x5d\x23\xaa\x71\x42\x1e\x32\xc1\x10\xae\x31\x7d\x89\x7e\x07\x15\xea\xf6\x93\x56\x0b\x68\xd0\x3d\x2d\xcf\xfd\x41\x0d\x0f\xc8\xc4\x3b\xf5\xa6\x2d\x34\xce\xf5\xd3\xa3\x84\x01\x41\x44\x23\xb2\xbf\xad\x1e\x8f\x3f\x46\x48\x88\xf7\x3a\xc1\x29\xef\x26\x17\xcf\x9e\xf9\xb8\x38\x1b\x87\x21\x67\xa1\x57\x07\x3d\xe7\xa5\xd0\xfb\x8f\xf3\x0c\xa9\x49\xc2\x30\xa1\x49\x38\x88\x51\x7e\x52\x68\x0d\x43\x11\xa1\xe2\xe3\xea\xfa\x7a\x7b\xf8\x79\xbb\xff\x7a\xbd\x5d\xfd\x5c\xdd\xd1\x3f\x86\xed\xa8\xa3\x7b\xf5\xd1\x40\x0e\x56\xae\xf5\x17\xb9\x66\x18\x6a\x8e\xf1\xb3\x6c\x3f\xee\xbd\x80\xbe\x7b\x33\xc3\x98\x59\x67\x65\x2c\xe6\x59\xc2\xcc\x02\x0c\x68\x1a\x1b\x85\x71\x12\x21\xd8\xf9\x24\xb2\xe2\x6d\x84\xce\x20\x61\x0c\x12\xc1\x95\xdf\x1f\x1e\x9f\x36\x0f\x9f\xa8\x19\x5f\x86\xe0\x61\x12\xd8\x68\xcb\x32\x4d\x6d\x04\x3e\x5e\xc2\xc2\x04\x28\xc6\x2e\x37\xeb\x4f\x2b\x4a\x9f\x1c\x3a\x8d\x12\xec\x73\x3e\x67\xaf\xf0\x7d\x99\xde\x4d\xc2\x34\x25\xd8\xc9\x39\xb4\x85\xaa\x40\x4f\x25\xff\x66\x8f\x47\x50\x5b\x56\x90\x22\xbf\x16\x59\xfe\x71\x57\x36\x8d\x8f\x23\x42\xc1\x24\x0a\x9e\x9e\xb2\xa2\xf1\xf3\xcd\xe7\x6a\xa3\x7e\xa7\x38\xc0\xda\xf5\xb9\x7b\x07\x67\x55\x8c\x50\xa4\x0c\x0b\xb5\x16\x1b\x3d\xfe\x4a\x76\x1e\xd7\xd8\x0d\x32\x41\x34\x16\x56\xff\xdd\x2f\x4a\x8e\xf8\x8a\xa7\xee\x62\x55\xb3\x3f\xc2\x4d\xdb\x65\x2a\x6b\x31\xf6\xf2\x19\xaf\x43\xa1\x14\x46\x7a\x85\x52\xbf\xba\x8f\x92\xa4\x50\x1a\x8b\xdc\x3f\x8a\x7a\x95\x57\x20\xf4\x47\xf7\x61\x2d\x7a\x51\x29\x12\x2a\xa2\x30\x2e\x74\x7a\xdc\x53\x48\xb2\x1f\x13\x45\x38\xfd\x7c\x29\xf3\x4b\x35\xea\xe5\xa3\x72\x89\x11\x9e\xeb\x63\x6d\x41\x68\xe2\xcf\x4f\x53\xdb\x1c\xc9\xc6\xd4\xf9\x69\x7d\x67\x8a\x99\x9d\xbd\x47\x9a\x09\xe4\x21\x3b\x17\xc8\xf6\xec\xbc\x1d\x2f\x50\xdb\x24\x84\x28\x50\x8e\x8f\xf3\xc3\x59\x37\xcd\x42\xa5\x10\x62\x82\xbc\xb0\xf2\x15\x2a\x5d\x09\x63\x39\x24\x7f\xf4\x5b\x95\x1e\x02\xda\x45\x17\xc0\x6e\x14\x17\xcc\x78\x1d\xc1\x32\xc7\xe6\x60\x3b\x98\x89\xf6\x8b\x03\xa4\xd6\x31\xd6\xd6\x17\x31\x8d\xf8\x0a\x02\xd1\xea\x43\xf8\x14\x82\x16\x88\x1c\x6a\x40\x9c\x86\xda\x87\x3f\x23\x13\x52\xe4\xf5\x9f\xee\x4a\xa1\x57\x85\x76\x6c\xdb\xe9\x2a\x64\xa4\x46\xff\xbf\x5a\x34\x65\x7d\xcc\xee\xcb\x3e\x4b\x8b\x48\x12\x79\xd7\xd9\x55\xb7\x7e\x5d\x02\x81\x49\x44\x84\x45\xdb\x38\xb5\xce\xfb\xf2\x35\x83\xb9\x32\xc4\x6c\x0f\x15\x09\x3d\x24\xdb\x50\xed\x51\xe0\xc4\x6d\xa5\x69\x28\xfa\xd0\xf1\x8b\x38\x4d\x5c\x53\x26\x67\x1e\x51\xcd\xc0\x35\x00\xbf\xfd\xb5\xde\x83\x38\x4d\x9f\x57\xc4\x08\xa8\x41\xae\xe7\x16\x2b\x44\x0b\x8f\x3e\x8a\x88\x41\x0a\xd3\xff\xb4\x42\xaf\xcb\x0a\x70\xe1\xf3\x27\x14\x85\xae\xc3\xec\xaa\xed\x98\x40\x94\xd5\x25\xf0\x86\x44\x51\x62\x9d\x06\xef\xda\xf5\xc7\x14\xfa\xb3\x50\x4f\x9a\x4c\xf7\x51\xa4\x0c\xa6\x8d\x87\x73\x05\x5e\xb0\x66\xd9\xb5\xc3\xed\x10\x07\x56\xfd\xe3\x28\x2a\xbd\x16\xe7\xdb\xc2\x7b\x83\x77\xdb\x68\x14\x72\x1f\x7d\xf6\x5e\xa6\xdd\x06\x30\x48\xa5\x75\x0f\xeb\x49\xb8\x8a\xc0\x7f\x81\x45\x5f\x9e\x93\x22\x2e\x13\xc7\x75\x40\x2f\x4d\x1b\xba\x3f\x9a\x5e\x4b\xd9\xff\x32\xd7\x1c\xd7\x8a\xac\x81\xd3\xa2\x57\xe9\xe8\xad\x8e\xd2\xd8\x3a\xa9\x0b\xad\xbd\x59\xe3\xac\xdf\x3c\x3c\xbb\x34\x31\x48\x74\x2b\xe0\xed\xa7\x70\x86\xc3\x3e\x19\x8f\xd2\xd4\x4a\x37\xaa\x9e\x62\xb6\x15\x0d\x3c\x1a\x2b\x2f\x39\xbd\x92\x34\x95\xc8\x6a\xf9\xd3\x9f\xb2\x88\xb9\x8d\xab\x0b\xd8\x1d\x4b\x1b\x34\x6f\xd1\x93\x20\xbb\xa0\x1c\x91\x48\x00\xc3\x7a\xd4\xa1\x3e\x8a\x0a\xd0\x28\x67\x40\x46\xcd\xa6\xd3\x4f\xee\xa5\x00\x15\x86\xfe\x5e\x7e\x11\xf5\xf7\x26\xcb\xb3\xbf\x87\x8a\x4d\xa4\x02\xab\xf1\x8c\xe0\xe7\x43\x0d\xcd\x01\x5c\xba\x72\xa8\x2e\x2f\x48\x07\x92\x38\x58\xf1\x5d\x29\x0a\xe7\xd9\x3c\xdc\x39\x4d\x22\x8c\x2a\x0f\x59\x8d\x13\x5e\x5f\xf9\x5a\xa1\x4e\xb6\xb8\x14\x14\x1a\x3d\x22\xcd\xa5\x72\xb9\x10\x6a\xc3\x7b\x4d\x60\xcf\xe4\x9b\x9e\x0a\x84\x5c\x85\xe3\x86\xca\x98\x89\x38\x5d\x0e\x22\x88\x09\x76\xce\x57\x2e\xef\x1d\x41\xb1\x48\x64\x82\xc8\xc8\x51\xd1\x00\x85\x45\x57\x95\xcc\x9a\x0a\x1d\xe8\xa6\x87\x32\x31\x41\xa4\x9f\xb7\x19\xf7\xd8\xc2\xe9\xc9\x99\x38\x41\x1d\xb7\x2d\x34\x59\xd5\x27\x31\x91\x49\x08\x72\x40\x0f\xd9\xe9\x5c\x56\xcd\x21\xab\x73\x51\x5c\xd8\x8d\xfd\x8b\x0d\x19\x31\x1f\xfe\x67\xf2\xef\xfe\x28\x9c\x3b\xcc\x53\xf7\x69\xbf\x66\x65\x5b\x1f\xba\x8f\xe0\xd0\x3d\xc1\xee\x35\x3c\x98\xaa\x3c\xe1\x9f\xe6\x5a\x82\xf6\x10\x31\x09\x53\xec\x56\x39\x62\x29\xdc\x2d\x46\x27\x7e\x70\x94\x86\x4e\x00\x78\x65\x4c\x96\x67\x23\x51\xd5\xe9\xdd\x89\x49\xa4\x30\x20\xbc\xde\xdc\x6c\x1f\x77\xfb\xc3\xd3\x66\x7b\xfb\xe8\xe7\x90\x98\xe8\x08\xf5\x3e\xb0\x7d\x2e\xa7\x9e\xe5\x8a\xc4\x54\x0a\x0c\x70\x6c\x24\xd9\xd7\x23\x63\x2a\x55\x60\x0d\xb8\x40\x54\x7d\xf1\x79\xfa\xc3\x4c\x4a\xac\xf8\xa2\x47\x75\x7d\x5c\xaa\x8d\xc6\x0c\x34\x26\x68\x8e\x9f\x6d\x93\xe1\xa5\x4a\x53\xdc\xe5\x69\xe0\x08\xf5\x1a\x25\xd9\x66\xe9\x53\x1c\x06\x29\xa6\x93\xdb\xcd\x7e\x75\xfb\xb0\xb9\x3e\x8c\x65\x76\x49\x1c\x33\x82\x42\x2c\xa6\x02\x70\x9e\x7c\xd3\x2e\x66\x1c\xab\x30\x4a\x06\x17\x01\x2f\x3e\x70\x59\x40\x8f\x63\x00\x86\xab\xf6\x1b\xc0\x79\x62\x76\x47\x62\x1e\xd0\x88\x3b\x05\x21\xe8\x3d\x36\x77\xde\xbb\xef\x93\x89\x3e\xe6\xa1\xc4\x80\xca\x4a\x2f\x76\xd1\xd1\xc7\xde\xb9\x0c\xcd\x06\x6a\xe2\x89\x15\xab\x57\x91\xe5\x2e\xe2\xe9\x41\x6c\x24\x4e\x42\xab\x57\x7f\xb2\xac\xda\xfd\xa5\x56\x48\x37\x26\xc5\xcf\xcf\x92\xd7\xd6\xfd\xae\xdc\x8a\x74\x0d\xe2\x8d\xf3\xb5\x62\x76\x18\x08\xbc\x8f\xc5\xba\xad\x9b\xf2\x04\xd5\x53\x05\xa7\x6c\x50\x11\x74\x03\x53\x62\x94\x83\x9c\x1c\x10\x38\x31\xdf\x1e\x4a\xec\x64\xfb\x78\xca\x39\x93\xcf\x71\x29\x9f\xa4\x14\xb3\xea\x74\x9c\x46\xa9\xa4\x36\x65\x38\x0b\xf5\xe2\x38\x1d\x59\x3d\x51\x90\xf4\x63\x53\x81\xe9\x05\x8a\x06\x4e\xca\xd7\x71\x9a\x4a\x2f\x1a\xed\xe7\x20\xf7\xac\xa7\x77\x21\x05\xe5\x5b\x7e\x57\xed\xdf\x7f\xaf\x85\x99\xb5\xa2\x63\xa1\x02\x04\x5d\xad\xef\xfd\xb1\x05\x30\x8c\x43\x0f\xce\x15\x73\x92\x5a\x4f\xcf\x50\x86\x11\xbe\xb9\xd6\x52\x7e\xc8\x33\x7e\x9d\x89\xc7\x32\xb5\x35\x93\x0a\x9e\xdb\x5c\x54\x1b\xa7\x72\x36\x1e\xec\x30\x5c\x76\xd5\x1f\x7c\xee\xff\xf1\xcb\x67\x2e\x95\xc0\xef\xec\xfe\xf6\xe1\xb0\xfa\x7e\x7d\xbb\x3f\xec\x6f\xef\x37\xfe\xba\x50\x10\xce\x26\x59\x59\xf1\xfc\x58\xc0\x0e\x72\x8f\xa6\x8a\x35\x61\xf8\x7a\xdd\xee\x0e\xeb\x87\xeb\xc3\xfa\xf1\x01\x45\xa5\x0f\xf7\xab\x2f\xb7\xeb\xc3\xc3\xf7\xfb\x2b\xcf\xe7\x22\xb1\x66\x2c\x0c\x7b\x72\x7e\x76\x6a\x4f\x58\xfc\x5d\x08\x4e\x63\x1d\x11\x2c\xab\xb9\x78\x67\x0d\x45\xd3\x56\x73\x49\x38\x12\x43\x14\x60\x69\xcc\x5b\xb6\x8e\x43\xec\xd8\x84\x7d\x4f\x61\x73\xce\xea\x52\x43\x3f\x2f\x18\x48\x03\x2f\x38\xb5\x24\x26\x43\x78\xc0\x8d\x55\x0d\xef\x66\xfa\x1d\x8a\xd2\x4d\x9c\xe6\x08\x0f\x8c\x15\xce\x92\xce\xb6\x3b\x0c\xdc\x06\xc2\x43\x2e\x67\x0e\x2c\xf7\xf3\x3e\x23\x27\xdc\xa0\x4d\xd6\xd5\x9a\x8e\xe7\x67\x4e\x94\x11\x0e\xcc\x74\x85\x09\x4d\x0b\x57\x1f\x5f\xc4\x49\xe6\x63\x13\xe4\xc4\x8f\x36\x32\xb5\x2c\x45\x03\x55\x05\xd5\x1d\xbc\x42\x4e\x26\xf4\x2a\xc2\x69\x90\x44\x30\xe6\x09\x8f\x57\x66\x4e\x13\xa2\x83\x5e\x48\x0d\x9b\x10\xe2\x53\xa8\xcb\xf4\x85\xe4\x54\x08\x88\x3c\x58\xd7\x29\x39\xcf\xef\x24\x35\xa9\x4a\x07\xaf\xd8\x0b\x1f\xec\x79\x88\x35\x59\x43\x39\x63\x1c\xa9\xd7\x7d\x31\xfd\x13\xdc\xc2\xec\xc4\x18\x33\x71\x32\x02\x1b\x8f\xf1\xcc\x84\xb3\xc8\x16\x08\x6d\x53\x6c\x5d\x16\x05\xa8\x45\x20\xfc\xec\x5c\x62\x8a\x00\xbe\xc6\xd9\xff\xed\x9e\x76\xbd\x01\x20\xe1\x2c\x95\x18\x50\xdf\x16\xa6\x12\x8f\xe6\xc2\x3e\x5c\x75\xef\x45\x94\x78\x2a\x09\x2e\x8c\xbe\xc8\xc4\x23\x92\x06\x16\xed\xa7\x5e\xae\x2a\x10\x2f\xfd\x86\xd8\xca\x7b\xd5\x50\x68\xab\xbf\xb5\x38\x35\xf0\x28\x31\x58\xb7\x7e\x85\xba\xa1\xa7\xbc\x27\x26\x2c\xab\x5b\x11\x1e\xc7\x56\xda\x43\x68\x8d\x12\x0c\x37\x65\xe5\x79\x66\x5f\x9d\xd6\xe0\xa7\x9d\x03\x1e\x4b\x6b\x30\x62\xc1\xec\xf8\xfd\xde\xea\xd7\x69\x7a\xca\x63\x1d\xa2\x1c\xd6\x83\x78\xfd\x92\x97\x52\xe4\xfb\xb2\x1d\x11\xba\x09\x8f\x21\xc6\x76\xda\x59\x7c\x94\xed\x42\xd3\x78\xf8\x39\xe0\xac\x7b\x5c\xe7\x97\xfe\x95\xe6\x8a\x06\x38\xfb\xe6\xd9\xe4\xeb\xe1\x90\xa0\xc0\xc9\xcf\xcd\x66\xdf\x4c\x36\x18\x4a\x6d\xdf\xb2\xd0\x4e\x06\x11\xab\x2f\x7a\xfa\x66\x24\xa1\x40\xd7\xd9\x5a\x18\x78\x81\x8f\xd9\xab\x9c\xc4\x02\x17\xa1\xf3\xdc\x4b\x67\x1e\xfa\xf1\x44\x50\x5c\xfc\xbc\xf0\xce\xac\xcc\xc4\x13\x63\x43\x38\x5f\xd3\x1f\xdb\xfe\x4c\xe2\x29\x9e\x06\x16\x91\x7c\x40\x52\x88\xd5\xcb\xa0\xb3\xf3\x4a\x89\xb5\x07\x70\xd0\x9e\x9f\x33\x79\xf3\x4f\xbe\x91\x34\xa2\x08\x6e\xb7\x00\xee\x69\xcc\xc3\x45\x90\x22\x43\xe2\x6c\xdb\x7b\xf8\xb3\x36\x7e\x18\x21\x35\xfa\xc1\x49\xea\xf0\x29\x4e\x59\xea\xfb\xfe\x11\xef\x3e\x99\x77\x99\xb9\x8c\x44\x6a\x29\xea\xa5\xc9\x9a\xde\xae\xc7\x6f\x4d\x39\x7a\x0f\xe4\xe5\x33\xb5\xb8\xaa\xc9\x19\xab\x20\x8c\x7a\x4b\xf4\xf5\xe6\xd1\xef\xa6\x98\x85\xdc\xa2\x30\x40\x5b\x39\x92\xf5\xf4\x6a\x95\xb2\xf6\xff\x1e\xd6\xe8\xd9\x12\x93\x6c\x97\xeb\x84\xd3\xa0\xc7\x6a\x88\xe2\x65\x11\xdc\xcc\x35\xb0\xd0\x52\x54\x76\x8d\xa8\x26\x4c\xd8\xd9\x48\xa0\x42\x10\xa7\x99\x36\xcf\xad\x39\xc4\x09\xe1\xee\xe3\xde\x8d\x42\x8c\xd9\x83\x82\x94\x3a\x46\xa0\xef\xbc\x20\xd2\xc4\x77\x07\x67\x93\x0c\x68\x8e\x9a\x50\x3e\x77\xda\x65\x79\x6f\x98\x4c\xb8\xa1\x0c\xdc\xc4\x88\xec\x12\x6f\xe0\xde\x2d\x47\x89\x97\xf2\xc5\x89\xe6\x06\xe0\x7e\xa6\x61\x4e\xb8\x31\x42\xd9\x53\x71\x0d\xe6\xb2\x70\x56\x9f\xcb\x95\xfa\x24\x00\xbb\xba\x7c\x59\x3f\x8d\x3f\xd4\x84\x10\x8e\x60\xc9\x9b\x0a\xe0\xef\x5e\x43\xb9\xdf\x4a\x2d\xcf\xb2\x82\xb2\x7a\x16\x45\xf6\xb7\x13\xfe\xf1\xdb\x69\xac\x79\xe2\x72\x1c\xe8\xbf\xaa\x84\xa6\xb6\xb4\xd2\xcd\xaf\x37\x22\xcb\xf7\x65\x79\x03\x6f\x6b\x2b\xe2\x39\xec\x6c\x22\xa4\xa0\x7e\x81\xa6\xfb\xf5\x91\xc6\x3f\x49\x58\x6c\x0d\xcb\xad\x92\xd7\x3f\x4b\x79\xa1\x22\x30\xfe\x38\x13\xc6\xad\xf3\x6a\x0d\xfe\xd1\x7e\x1e\xf4\x25\x2c\x09\xc1\xf5\x6b\x3f\xb1\x41\xee\xc6\x40\x4a\x47\xd2\xdf\xbd\x2a\xde\x7c\x5c\x4a\x31\xb1\xb9\x2b\x9f\x71\xcc\x5c\xa1\x77\xf6\xd3\x61\x20\x2d\x72\xc1\xbb\xcb\x6e\x91\x52\x3f\x9d\xb1\x93\x88\x4b\x33\x36\x19\xbc\xe9\x5e\x10\xb1\xa4\x3b\xee\x77\xd0\xd6\xa4\x1e\x9c\x4c\x26\xf6\x10\x66\x79\x40\xe2\x0d\x2b\x1d\x4c\x1f\xfb\xe5\x36\xe4\x73\x03\x62\x6d\x9d\xe8\xac\xd6\x6d\x93\x29\x64\xfd\xec\xfa\x1e\x6b\xc2\xbb\x6c\xdc\xde\x94\xbc\x2c\x9e\x85\xf3\xa0\x38\x65\xcd\x30\x07\x25\x9c\x81\x35\x96\xb3\xe2\x47\xeb\xb2\x02\xd4\x78\x9c\x4c\x6b\x49\x92\x1a\xd4\xc0\x3b\x8b\x2e\xf0\xdf\x8b\xf7\xd9\xc9\x26\x26\x0c\x1d\xbf\xee\x3c\xc5\xd1\x2f\xa6\x2d\x6e\xaf\x94\xd8\xaf\xc2\xd9\xbd\xc1\xd3\xa8\x34\xe7\x67\xbe\x24\x4d\x95\xe0\x43\x0d\xfe\xa0\x9d\x6d\xe2\xec\xc9\x8a\x30\xc0\x86\x2d\x1e\x0b\x53\xe3\x4b\xa0\xa4\x1b\x2a\x43\x82\x8a\x28\xab\x95\xcf\xf6\x12\x19\x59\x9a\xca\xb7\x9b\xaf\x93\x0f\x4a\x26\xda\x12\x8c\x2c\xd8\xb7\x9e\x3d\x79\x99\x72\xb4\xce\x46\xac\xae\x15\x9b\x3c\x74\x2b\xe5\xcf\xac\x39\x7e\xcd\x8a\xe6\xa9\x82\xd7\x6b\xb0\xbe\xaf\x7a\x32\x27\x27\x52\x89\xa8\x2f\x8b\xe3\xd7\x98\x95\xc5\xaf\x94\x35\x49\xa2\x44\x84\xdd\xbb\x3e\x0c\xfa\x63\x39\x49\xf9\x45\x97\x2d\xd1\xdc\x92\x5a\x07\xd9\xd3\xb1\xeb\x05\x49\x20\xb1\x01\x15\x96\xe4\x7e\x42\x36\xa6\x3a\xdd\xae\x1f\xc3\x7e\x5c\x1a\xe2\x8d\xf9\x06\xd9\xdf\xc3\x34\x00\x5a\x5b\xd9\x79\x91\x43\x79\x06\x54\x63\x18\x9a\x2f\x89\x09\x13\xe6\x27\xf5\x1b\x80\x6b\xaf\x2b\xdc\x03\x17\xd2\x20\x61\x78\x43\x6d\xfa\xb2\x29\x9a\xea\x63\xa9\x5a\x92\x06\x92\xd8\x36\x0e\xc6\x5c\x23\x9f\x31\x92\x12\x1a\x32\xcc\xaf\x51\x8f\x7c\xd5\x85\xe6\x17\x32\xef\x13\xcc\xec\xf8\xb1\xa4\xdd\x95\x05\x76\xef\xee\xfd\x77\x0f\xa4\x9b\xab\xcf\x65\x51\xc3\xf0\x2b\xca\xf6\x70\xba\x6f\x65\xae\xba\xde\x4e\x8f\xa8\x19\x96\xd5\x36\xb5\x12\x67\x2c\xfc\xff\x12\xcc\x9c\x52\x4e\xf1\xbb\xdf\xdf\x6e\xb6\xc4\x2a\x0b\xfa\x1f\xa5\xa9\xc6\xb6\xdd\xea\xfa\xc7\xed\xee\x71\x7b\xd8\x7f\xdd\x6e\x36\xfd\x46\x25\x52\xab\x21\xb6\xde\x4d\xbf\x8d\x94\xd1\x04\x6f\xc9\x49\xbc\x3b\x6d\x84\x11\x66\xca\xcf\xef\x29\x8b\x12\x29\xa7\x46\xaf\x77\xbd\xcf\x9f\x07\x7d\xcd\x4e\x96\x19\xeb\x6b\x72\x6e\xeb\xa3\x25\x1d\x2e\xb2\x02\xd2\x30\x8a\xb0\xe1\x30\x6d\x0f\xae\xbb\x68\xe1\xb7\xa2\x4f\xb3\x5e\xc8\xec\xc8\x51\x04\x28\xae\x5a\x9f\x61\x70\x29\x9a\x46\x95\x69\xa4\x55\x8f\x76\xec\xa6\xda\x89\x2f\x22\x49\x63\x9e\x68\x0b\x02\x2d\x5c\x39\xec\x0a\x36\x16\x6c\xad\xfb\x31\x32\x42\x70\x92\x1c\x9b\x21\x4d\xa7\xf5\x94\x13\x6a\x45\xd2\x44\x96\x7f\x7c\xa9\xca\xb7\xe6\xe8\x84\x4d\x0e\x7a\xf4\x73\x5c\x70\xe9\xce\xa6\xbb\xbf\xbb\xa6\xac\xc4\x73\x97\x9f\x8d\xcf\x89\x2b\x0d\x23\x92\x96\xa5\x3e\x83\xf1\x13\x72\x9a\xa4\x14\xab\xef\xf7\xe2\xfd\x76\xf0\x45\x21\x69\x4a\x1c\x6a\xa8\x57\x84\xfc\x51\x76\x33\xd7\x35\xd4\xaa\xca\xce\xa3\x04\x36\x15\x49\x80\xa0\x15\x9b\x8d\x7c\x5f\xd0\xdf\x72\x03\xa5\x34\x51\x5f\x57\xc7\x8e\x77\xd3\x7e\x32\x47\xa5\x2a\x15\x18\x52\xae\xd7\xfb\xaf\xa3\xa4\x25\xd5\x3c\x41\x2b\xa7\x7b\x71\x12\x57\x30\x45\x58\xa4\x3a\xb5\xce\xa4\xf5\xf8\x3b\xd6\x22\xc6\xa4\x41\x89\xe2\xaa\xfd\xf8\xe4\xe7\xb4\x52\x98\x51\x7d\x13\x45\x53\x95\x0d\x28\x64\xc3\x90\x5f\xf7\xdd\xfd\xbe\xda\xca\x22\xd8\x98\x65\x96\x1b\xa4\xc0\x6c\x55\x6a\xfd\x78\xfb\xe0\xbc\xc3\x50\x05\xee\xe9\xeb\x6a\xb7\x39\x04\xfe\x2c\x81\x4b\xa4\xeb\xfd\x84\x6c\x2d\xce\x96\xba\x32\x9b\x01\x44\x10\x6b\xec\x22\xa3\x98\xab\x7f\x52\x82\x50\x1d\xf7\xb6\xb8\xdd\x84\x89\xa5\x92\xa1\x5d\x21\x28\x91\x86\xb9\x20\xa9\xa7\x81\x7e\x8a\x5b\x9a\xde\x18\x41\x45\x62\x85\xd4\x4b\x51\xf5\x75\x5d\x41\xa5\x90\xca\x63\xed\x4f\x12\x2a\x84\x8b\x4e\x67\x0b\xc1\x12\x8e\x35\x80\xdd\x7e\xb5\xdd\x7f\x7f\xf2\xfb\x32\x29\x83\xd8\xaf\x0c\x07\x09\x4d\x4f\xd6\x2a\x86\x21\x1a\x65\x03\xac\xf0\x10\xfa\x04\xf6\x71\xb2\x88\x41\x61\xdf\xca\x4d\x5e\x7f\x1d\xf6\x9b\xd5\xfd\xe1\xe9\x71\xbb\xbf\x7d\x7c\xf0\x83\xb8\x96\x58\x03\xba\x6f\x94\x45\x2d\x64\xa7\xcc\x91\x1d\x67\x37\x35\xa1\x4a\xdb\x5a\x04\x02\xe1\x3f\xf3\xfb\xbd\x94\x70\xff\x6f\xb6\xfa\xdf\x88\x00\xb5\x77\x3e\x5b\xde\x1f\xe0\xdd\x4d\x8f\x7b\x91\xf9\xb6\xb8\x48\xd3\x08\x1b\xde\x98\x0b\x6d\xcb\x17\xec\xd3\xba\x6d\x22\x08\x53\x57\xb2\xbe\xad\x7b\x92\xe4\xec\x01\x08\x12\x60\x32\xdd\xbd\x10\x5b\xac\xfe\x4e\xa2\x69\x32\x5c\xc4\xc2\xd2\x28\x44\xa4\xd3\x64\xac\xc1\x78\xf5\xb1\x08\xb2\x12\x82\x53\x14\x06\xee\xf2\xb9\x95\x69\xa0\xb2\x74\x83\xfc\xe3\xbe\x37\x4b\x22\x42\x08\x8e\xa9\xd6\xc1\xea\x6a\x4e\xca\xeb\x42\x12\x89\xa5\xbc\x2d\x48\xec\xba\xf4\x9f\xbb\x90\xd2\x36\x29\x85\xd6\xff\x29\xb3\xa2\x0b\x9f\x0e\xf0\xfa\x89\x34\x04\x11\x8a\xa7\x08\xc8\x39\xe7\xe2\x63\xa2\xe5\x4a\x84\x8e\x24\x58\x4d\x22\x6d\x3b\xd1\xfd\x06\x6e\x45\x1f\x3c\x6d\xcc\x5b\x42\x4f\x2f\x52\xcb\x04\x53\xec\x07\x50\xa2\x3e\x3a\xef\x8e\x9e\x40\x25\x80\xc5\x16\xc2\x20\xaa\xb9\x9c\x0e\x11\x10\x5a\x4b\x22\x4f\x40\x58\x97\xb9\x03\xdc\xba\x32\xa2\x30\x11\xc7\xc2\x14\x14\x0d\x54\x6e\xed\xf0\x87\x36\x5a\x87\xd6\xbc\x2e\x2f\xdf\x76\xdd\xc5\x5f\x41\xbf\xd8\xca\x20\x22\xa8\xa4\x68\x4b\x3c\x57\x6d\x9d\x15\x50\xd7\x3b\x14\x64\x18\xc6\xc4\xf8\x80\x9e\xae\xf7\xe3\xe9\xb2\xfb\xbb\x74\xf3\xf1\x43\xa9\xa1\x5b\x16\xac\x22\xf5\xa8\x8a\x2b\x83\xd8\xe2\xc8\x7d\xea\x3b\x41\x57\xfa\x50\x58\x06\x5c\x12\x31\x14\x19\xab\xc7\x1e\x69\x2d\x83\xc4\x66\xcf\xf8\x79\x79\x85\x97\x7e\xa3\x56\xd8\x0d\xbb\x2b\x9f\x9f\xca\xfc\x03\xf9\xbd\xb3\x16\xdd\x6f\xc8\x95\x92\x44\x80\x77\xf7\xe0\x45\x6f\xc6\xba\xf6\x7e\x4c\xac\x64\x6f\xeb\xba\x42\x9a\xf6\x54\x63\x81\x48\xaa\xad\x17\xcd\xb3\x38\xc1\x97\xcc\x34\xf7\xe2\x7d\x2c\x40\x4c\x24\x8b\x43\xe4\x65\xfe\x4f\x9b\xa9\x97\xef\x45\x97\x03\x89\x8f\x31\xe0\x41\x32\x88\x91\x57\x2d\x6d\x65\x63\xc8\xa0\x64\xc8\x84\x2b\x34\xa8\xb2\xd0\x5f\xb3\xe7\x23\xd4\xcd\x55\xa6\x7b\x0b\x74\x1c\x82\x11\xd0\xed\x93\x72\xe8\xc1\x42\x8b\x4a\x2f\x72\xab\xda\x0b\x76\x8d\x0c\xe3\x18\x51\xf7\x3d\x78\x31\x78\x97\x8d\x72\x88\xc7\xd9\x42\x22\x43\x21\x22\x1f\x3f\xfb\x29\xa1\xfb\xea\x66\xa9\xa3\x8c\x12\x83\x35\x1b\xcb\xc5\x5e\xa1\x30\x90\x03\xc9\x0e\x92\xab\x6e\x6c\x1c\x87\xda\xa1\x80\x30\x36\x5a\x5f\xc2\x26\x65\x1c\x27\xc2\xf5\x74\x11\x07\x3c\xc1\x33\x4c\xbe\x19\x19\x27\x82\x2b\x64\x03\xc8\xac\xb1\xd4\xdf\xc7\x8b\x25\x46\x72\x16\x90\xc1\x3e\x12\xcd\xdb\xaa\xc3\x7c\x4c\x68\x9d\x73\x5d\x4a\x7f\x21\x72\x30\x1b\x2d\x12\x8c\x9a\x57\x75\x36\xe6\xcc\xcb\x24\xb1\x4d\x05\xe4\xa0\xbd\xdf\x00\xfc\xec\xe9\xb9\xb3\x8b\x4c\xa4\x15\x13\xb7\x88\x5f\xfb\x5d\xde\xcf\x13\x5d\x99\x06\xca\x73\x48\x0a\x3d\x6b\x0c\x4e\xcf\x28\x4d\x13\xec\x3d\xfa\xe2\xde\x53\x95\x9d\xca\x4a\x67\xce\xd0\x63\x79\x26\x94\xa9\x21\xb6\xed\x88\xd3\xad\x07\x83\xb8\x8d\x22\x65\x98\x5e\x69\xf9\x72\x3d\x99\x0c\xa5\x4c\x23\x9c\xc7\xfa\xc8\xda\xd6\x6e\x7e\x87\xe9\x93\x52\x49\x6c\x04\xdd\xdf\xae\xbf\x61\x93\xf8\x57\x10\x4d\xa9\x68\x8c\xc8\xa9\x75\x0e\xa2\xfa\x91\x81\xa7\x2d\x4b\x4d\x00\xe7\xc1\x97\x2c\xcf\x6f\xa0\x8f\x9a\xa5\x66\x71\x12\x0d\xcf\x70\x57\xe6\xaf\x9f\x94\x5a\xa4\xe6\x31\x95\xd8\x5f\x2f\x9a\xfb\x8f\x71\x71\x49\xea\x84\x24\x93\x48\xe9\xec\xa4\x5d\x96\x6f\xa1\x4e\xbc\x09\x86\x97\x77\xed\x15\x6a\x3f\xdb\x23\x95\x5e\xa7\x16\x4d\x20\x7c\xd6\x57\x95\xa7\xdb\xf9\x37\xa8\x8d\xc1\x7a\x49\x59\x3c\xc0\xdb\x5d\x29\x2e\xb0\x2e\x6e\x1c\x84\x01\xe6\xba\x7f\x8a\xb6\x6a\x4f\x88\xae\xdf\x6c\xd7\xd4\x07\x8e\x12\x24\xc1\x67\x79\xdf\xbd\xfb\x53\x97\x18\x22\x0d\xd1\xca\xf8\x92\x97\x55\x64\x5d\xc2\x71\x49\x43\x29\x7e\x98\x7f\xae\xbe\x8f\xf7\x57\x01\x15\x08\xd5\x5c\x35\xb9\xa8\xfb\x3f\xb2\x00\xcd\x14\x70\x25\xb8\x12\x4d\x93\xc3\xe3\x50\xe1\x54\x01\x58\x78\x67\x05\xb5\x6a\x67\x65\x6d\x15\x40\xaa\xbc\xb4\xa5\xff\x1b\x71\x36\x05\xcf\x68\x10\x8c\xdc\x89\xf5\x78\x1f\x42\x54\x1a\x7b\xf2\xe8\x92\xab\xc4\xef\x32\x3e\x7f\x1c\x4d\x91\x42\x72\xf5\xe8\x05\x98\x89\xa2\x89\xc6\xa4\x5a\x89\xfc\x01\xde\xa6\xdf\xa1\x1b\xc2\x78\x2a\x7a\x3e\xde\xfe\x2d\xeb\x16\x67\xbf\x3b\x03\x85\xf7\xd7\xd1\xe4\x6d\xaf\xfb\xb6\xb8\x2f\x8b\xe6\xd8\xdf\xaf\xb0\x5b\x39\x9c\x3c\x88\x5a\x92\x3a\x72\x9c\xd0\xf8\xdf\xd3\xff\x41\xe2\x8b\x3f\x5d\x5e\x54\x18\x73\x6c\x3d\xb8\xd9\x46\x9c\x60\x5d\xce\x4c\xd1\x88\x8a\x92\x14\x0d\x0d\x57\x8f\xf7\xaa\xcc\x8a\xf1\xfb\xa3\x22\xc1\x70\x79\x5e\x8b\x73\xd3\xad\x3b\x03\x19\x45\x45\x1a\x42\xcb\x67\xfd\x98\x4e\x13\x2a\x0e\x41\x39\xc2\xae\xc5\x36\x5e\xb5\xc6\x0c\xb7\x25\x56\x1c\xcd\x59\x6c\x73\xa1\x27\x53\x39\xe2\xcd\x2c\xef\x1b\x5e\x43\x15\xeb\x10\xdc\x9d\xea\xbe\x08\xaf\xa4\xd1\x2e\xc9\x1a\x8e\x6f\x47\x17\x86\x0f\x47\xe1\x94\x61\xca\xe2\x9b\xd2\x16\x4c\x03\xfa\xbe\x2c\x44\xa5\x8e\x28\x08\x30\x8a\x70\x14\x0f\xb5\x45\x10\xd6\xd0\xfc\x42\x37\x46\x71\xa9\x62\x77\x76\x37\x15\x16\xe7\xa1\x12\x39\x76\xed\x66\xcd\xb3\x21\x30\x52\x09\xe5\xdc\x9a\x2f\x23\x63\x62\x50\x3d\xf0\xdb\x65\x82\x81\xfc\x16\xe3\xca\x5f\xcd\x9a\x4a\x4a\x5b\xc0\x54\x5e\x3a\x6c\x16\xe5\x28\x29\x21\x56\xa3\xde\x42\x0f\x66\x99\x04\x11\x7e\xb0\xb6\x74\xe9\x53\x59\xc1\xfe\x28\x8a\x5d\x69\x9a\x91\x6c\x1a\x51\x2a\xf0\xdf\x71\xd3\x56\x05\x22\x05\x26\x42\x15\x4a\x05\x9c\x4f\x38\xaf\x37\x00\xd7\x1f\x85\x38\x65\x6a\x79\x6e\x56\x2a\x4e\xb1\x6a\x9e\x03\xbc\xec\x1a\x10\xf9\x97\xb2\xff\x35\x01\x28\xb7\x72\x16\xcf\x70\xd5\x7e\x58\xda\xef\xd5\x1c\x1d\xf2\xc9\x47\xa0\x09\x47\x7d\xac\xdd\x39\x53\xf0\x24\x3e\xaa\x32\x9f\x41\xa7\x94\x16\xa9\xd7\x41\xde\x57\x42\xc3\x08\x39\xab\xb4\x10\xae\x27\x63\x8b\xf3\xbf\xd4\xec\xb9\xfc\x75\x88\xac\x96\x43\x05\x06\x9b\x21\x93\x87\x06\x51\x0c\xd2\x7f\xfc\x8b\xd7\xe2\x07\xc6\x31\x42\x4f\x4f\x99\x93\xbd\xdc\x97\x5f\x60\xec\x5c\x44\x94\x91\x69\x2a\xbc\x3f\xf1\x84\xf6\xad\x03\x96\x48\xbf\xf2\x74\x8b\x67\x97\xad\xa1\xc7\xd5\xaa\xd0\x88\x49\xb8\xc4\x2e\x68\x42\x2c\xd2\xc8\x4e\x1d\x17\x1a\xfa\xd3\x75\x48\x13\x13\x21\xbc\xe9\x2a\xf3\x41\x69\xbf\x41\x98\xc1\x87\x7c\x4c\xf6\x09\x03\x4f\x0c\x9a\xfc\x1b\x06\xb3\x43\x53\x1a\x62\xad\xf8\x50\xb7\xb2\x5b\x2b\x11\x74\xf1\x15\x16\xac\x71\x86\xaf\x5c\xd3\x48\xa1\xbd\xa1\xb3\x66\x9a\x54\xb0\xfd\x90\x34\xc1\x78\xdc\x49\x05\xd7\xd7\x65\x21\x9a\xcf\x00\x80\x9a\x51\x81\xd5\xbb\x11\x1a\xfc\x93\x81\xa1\xc4\x44\x60\x6c\xa7\xb5\x2a\xf4\x5a\xe4\x17\xf6\x2a\x4b\x20\x5d\xcd\x22\xde\x17\x4f\xb2\xc2\xe9\x01\x5e\x65\xb3\x00\x41\x87\x71\x4a\xc4\x44\x07\x66\xef\xbf\x16\x1d\x72\x5b\x1d\xb3\x18\xf7\xa9\x12\xf7\x04\x0d\xaf\x43\xa9\x30\xd4\x2a\x51\x48\x42\xe4\x93\xa5\x55\x87\x86\x07\x2e\xc7\xbf\x7f\x1b\x1b\x9e\x13\x1d\x45\x36\x1f\x91\xed\xc7\xa7\x28\xdc\xd1\xe3\x88\x38\xc5\x36\x44\xaf\x45\xfb\x4b\x24\x95\x8e\x20\x09\x9d\x64\xd6\x03\xbc\x8d\x6b\x86\x6e\x40\x1c\xb0\x58\xfa\xc9\x4e\xa8\xbe\x53\x3d\xa6\x4e\xfb\xa1\x4c\x21\x19\xd7\xd6\x1f\xb1\x7a\x7c\x65\x63\xfb\x45\x57\x56\xa2\xe3\x38\x4c\x50\x1c\xa7\xac\x9b\x93\xe8\x5f\xe4\x58\x48\xe6\x30\x01\xb7\xb5\x13\x75\x84\xea\xa6\xb4\x86\x5e\xf6\xaa\x46\x57\x1c\x2b\xe9\x09\x98\x4f\x48\xa7\x42\x4d\x8b\x09\x46\x49\x73\x57\x74\xb8\xbd\xf2\x28\x35\x9d\x02\x45\xe7\xa6\x02\xde\xb1\xfd\x39\x79\x1e\x82\xa5\x14\x6d\x65\xd6\x8f\x48\x3c\x1f\x35\x3d\xb4\x94\x06\x29\xd7\xfe\x7d\x58\xe5\x79\xf7\xe6\x6d\xcb\xbe\xc6\xa1\xbb\x00\x74\x02\xd6\xf9\xe4\x0d\x96\x26\x02\x33\x80\x81\xf7\xbb\xab\xc5\xca\x8e\x86\xc0\xda\xce\xfe\x6f\x2b\xaa\x06\x2c\xd5\xd6\xff\x16\xa4\x0c\x29\xbf\xce\x98\x78\x21\x43\x18\xbf\xf3\x90\x82\xf1\x37\xab\x0b\x24\xb2\xb2\xe8\x3e\x70\x77\x53\xc7\xc5\x32\x6d\x84\xf2\x53\xd9\xff\xb4\x22\x47\x48\x53\xed\xf4\x42\x6c\x58\xe4\x80\x5e\x10\x40\x3c\xca\xb4\xbe\xd7\xfa\x09\xaa\xfb\xb9\xa2\x21\x01\x12\x18\x34\x37\xea\xb5\xcc\x00\xae\xb2\xa6\x0b\x84\xd6\xa2\x3e\xde\x03\xd2\x49\x67\xbd\x3d\xc0\x86\x80\x3d\x0b\xb7\xc9\x94\xaa\xad\x95\xa8\x74\xa6\xe9\xf2\x1c\x09\x44\x32\xca\x3d\xcc\x7c\xed\x75\x5e\xea\x66\x77\x2c\xcf\x83\x5b\x3c\x01\x46\x00\x27\xa6\xdd\x66\xfb\x63\xb3\x45\xb0\xdf\xe3\xf7\x7d\xbf\x55\x6a\xe6\x7e\x7a\xd2\x5e\x99\x5e\x55\x48\x0c\x02\x66\xd7\x8f\xf7\x4f\xab\x87\xbf\xa6\xd0\x5c\x08\x23\x8e\x7d\x12\x78\x3f\x43\x95\x41\xa1\x00\x3d\xc2\xfa\xcd\x9c\x4a\xe8\xd7\xf6\x87\xb2\x99\x77\x8d\x21\x4c\x92\x50\x8f\xb5\x30\x31\xa9\x47\x9b\xa2\x7a\xe6\x53\x44\x20\xd4\x46\x8b\x1e\xd5\xa9\x60\xe4\x24\xed\x46\x44\x81\x41\x99\x68\xf4\x67\x2e\x44\xbe\xd2\xda\xeb\x16\x4e\x6f\x61\x44\x03\x6a\xcb\x74\xdd\xa4\x70\x2f\x5e\x10\x08\xe1\xe5\x1a\x17\x5f\x67\x88\xa8\x0d\x44\x84\xd6\x7d\x2b\xb0\x5b\x83\xdc\x7c\x38\xfb\x01\x16\x60\x50\xbb\xee\x99\xed\x23\x49\xa5\xf1\x3b\x0b\x51\x2a\xb0\x5d\xe1\x2c\xce\xc3\xc9\xc2\x0e\x31\x09\x30\xcf\xbc\x6b\x8b\x8f\xea\x97\x53\xde\xec\x6c\xe3\x48\xc9\x6e\xf9\xb8\xda\x6f\xfb\xc7\x15\x27\x31\xa7\x7d\xb7\xd4\xc7\xcb\xa0\x7d\x2d\xb2\x1f\x06\xa1\x15\x31\x75\xe8\xb2\x83\x3d\xa5\xc3\xf5\xec\xdc\x94\x85\xa0\x5b\x68\x02\xc2\xc3\x8a\xd1\x33\x99\x9d\x10\x0f\xac\xfa\xbd\x95\xba\xc0\xda\xad\x03\xed\xce\xc6\x39\x8c\x1c\x52\x4d\xad\x7e\xda\x52\x37\x1e\x38\xb3\x25\xc9\x3a\x7b\x2e\x36\xab\xc9\x84\x08\x3c\xb4\xba\xef\xa7\xac\xf0\xc2\x05\x23\x21\xdc\x71\xb6\x0e\x69\x2a\x10\x9e\x9e\xd5\x4e\xc6\xd2\xaa\x23\xcf\xb9\x0a\x90\xaa\x08\x3f\x17\x5f\x36\x6d\x2f\xe5\xb6\x40\x24\x12\x51\x4f\xe7\x6a\xc8\xe1\x27\x85\x48\x10\xca\x9a\x9a\xae\xaa\xac\x1e\x17\x7e\x40\x12\x2b\x57\x88\xed\xa3\x6a\xf8\x33\xb3\x4c\x1b\x89\x06\xd0\x59\x17\xae\xa1\x44\x99\x0b\x74\x2e\xc4\x94\xf0\x6f\xc3\xbe\xa1\xfb\x5c\xf2\x52\xbd\x74\x71\xc3\xf4\x74\x65\x14\x60\xa4\x7f\x97\x15\x62\xa4\xaa\xbb\xfc\xf6\xcb\x48\x6b\x74\x4a\xdc\xfc\xe8\x4f\x2e\x51\x4e\x42\xee\xd8\x8c\x54\xf0\x40\x91\x00\x33\xa3\x6d\xf6\x5c\x22\x31\xae\xdf\x10\x0a\xfc\xea\xbc\x64\xc5\x0c\x2e\x07\x3a\x24\xa8\x87\x22\xd0\x92\x45\x7b\xf9\x7c\xbf\x35\xb2\xcc\xb3\xac\xbe\x72\x14\xc0\x8b\x0c\x77\xfc\x5d\x01\xa5\x78\xc2\x9b\xfb\xdb\xdd\xee\xf6\xf1\xe1\x70\xf3\xb8\x45\x3b\x85\xdd\x7e\xf5\x65\x13\xf9\xa3\x02\x63\xf6\xab\x6e\x9b\x5e\xd3\x75\xe5\xa9\xc4\xcb\x6f\xb2\x09\x52\x6b\x69\xdf\x94\x15\x38\xe1\x92\xde\xcd\xfa\xea\x63\x8b\xb0\xed\xee\x0d\xfa\x54\x87\xc3\xc5\x0a\x0e\xb8\x3d\x53\x79\x34\x41\x68\x67\x31\x91\xe7\x3f\x21\x7b\x3e\xf6\x65\x78\x13\xc4\x90\x0c\x19\xef\x5f\xdf\xef\x1f\x17\x57\x54\x13\x68\x81\x55\x66\xec\x04\xe5\xa2\x7a\x86\x6b\x78\xcd\xf0\xfc\x1e\xca\x66\x0e\xaa\x31\x01\x50\x35\xc4\xd6\x5d\x76\xbf\x1d\xf7\x8d\xdd\x28\x12\xc4\xf1\x24\x32\x50\xaa\xb5\xc2\x48\x1a\xbd\xb7\xa6\xa7\x40\x62\xe9\x25\xb1\x7e\x42\xb6\x28\xe9\x67\x48\x62\xd9\x18\x59\x8d\x86\x30\x30\x69\x09\x18\x92\x52\xeb\x3d\xdc\x9e\x4e\x88\x51\x82\xaa\xf6\xc4\x53\xd3\xe5\x15\xf1\x68\xa6\xff\x51\x5e\xfa\xad\x2c\xcf\x8c\x86\x05\x1c\x91\xca\x87\xac\x1e\x05\x3e\x26\x8c\x20\x09\xbc\xf1\x64\x59\x3d\x55\x70\xbb\x7e\x5c\xfe\x18\x4c\x44\x6d\x48\xf0\x66\x21\x98\x63\x9c\x93\x89\x38\x43\xe6\x95\xcc\xf4\xed\x85\x28\xc1\xf2\x19\xc5\xd4\x3a\xa0\x58\xdd\xb2\xaa\x9b\xf8\x5e\x41\xe4\x8e\x54\xda\xbd\x01\xd3\xe0\xc5\xc4\xa1\x6d\x34\xd4\xed\xf9\x5c\x56\x0d\xe8\x6d\x99\x5b\xbb\xa3\xe9\x81\x39\x67\x56\xc5\xd5\x99\x40\x3d\x21\x06\x77\x22\x56\x4c\x0c\x57\x11\xa2\xc6\xb2\xc2\x31\x48\xfd\xdc\x68\x92\x20\xb2\xd1\xb1\xcd\xb9\xa6\x36\x0d\x4b\x64\x1f\x93\xf2\x54\xb8\x3c\x14\xf9\x11\xf3\xda\xbc\x11\x04\xb0\xf2\x6b\xd9\x32\x9b\xff\x9d\x73\xaa\xa6\x5f\x82\x00\x1a\xc9\x11\xa8\x3c\xab\xae\xab\x5e\x94\xc0\x48\xae\x70\x72\x3c\x9e\x1c\x80\x71\x94\x02\xfa\x21\xa9\x4c\x61\xb2\x94\x7d\x2d\xdf\x0e\xfb\x72\xb2\x90\x19\x65\xac\x9d\x50\x77\xff\x4b\xd3\xbc\x89\x0a\x01\x15\x4e\x14\x6c\xbc\xb2\x18\x4d\x23\xfb\x96\x9c\xa1\xd0\x5d\xb4\x70\xa8\xc7\x3d\x46\xa3\x43\x86\x37\xd3\xb1\x6d\xad\xf4\xd8\x67\xbe\x5f\xd3\xaf\x01\x22\x9a\xf8\x45\xcb\xb5\x5a\x1f\xfa\xde\x8e\x31\x49\x80\xee\x32\xf6\xd3\xbf\xba\x64\xe2\x18\xa3\x02\x6c\x67\x3b\xd2\x05\xae\x72\xd0\x9e\xec\x7a\xd6\x65\x6e\x33\xdb\x9a\xc9\xa3\xa3\x41\x10\x0b\xe2\xac\x62\x0e\x26\x7b\xc7\x8f\xfa\xb6\x58\xff\x5c\xff\x31\x1d\x47\x68\xca\xe4\x80\x04\xb3\xd2\xad\xdd\xa2\xe4\x67\xf3\xa5\x29\x89\x06\x24\x8a\x30\x90\x87\xe6\xd8\x25\x57\x0e\x12\x4f\x03\xa2\x0d\x2a\x9c\x7f\x2f\xee\x4a\xf5\xb2\xbc\x2f\x25\x1a\xc5\xa6\x4f\xe2\x7d\x0f\xe2\x84\x17\x7f\xe5\xc5\x42\x68\xc0\x98\x05\x89\x6d\x0a\x6d\x0b\x71\xa3\x65\x83\x06\x2c\x89\x62\xfb\x5d\x37\x8e\xac\xf6\xc7\xa8\x99\xee\x07\x69\x5b\x3f\x73\x9a\x41\x96\x73\x74\xe1\x4d\x45\x83\x30\x0a\x90\xb0\xe2\xa1\xa7\x5b\xc0\x4b\xbe\x43\x85\x85\x2d\xbc\x66\x75\x56\x16\xd7\x25\xd4\x45\xf3\x55\xa0\x30\x5e\x66\x3d\x56\xfc\xb6\xfe\xa4\xc3\x38\x44\xc4\xbf\x13\xa0\xbb\xc4\xc5\xfb\x71\x92\x26\x49\x6f\xda\x50\x56\x1e\xb3\xb1\x94\x1a\xd0\x20\x34\x29\x8a\xfb\x1d\xc6\x55\x03\xab\x38\x7d\x01\x65\x9f\xfe\x4e\xe4\xaa\x23\x67\xf1\xf1\xd8\x36\xfe\x2c\xa3\x90\x4b\x36\x74\xe7\x17\x54\x4a\x68\x10\x09\xa3\xad\xe1\x39\x92\x53\x34\x92\xee\xc7\x61\x0f\x0d\x22\x88\x43\x5b\xbb\x7a\x2d\x5f\xe0\x16\x6b\x29\x68\x7a\x3f\x25\x91\x4e\xaf\x25\x26\x11\x68\xdf\x4d\xfd\x39\x05\x6f\xd0\x20\x8e\xa8\xb7\xe7\x5c\x9d\xb3\xe5\xf7\x26\x61\xd6\x8a\x30\x17\xea\xa5\xb6\x35\x57\xb7\x25\x25\x3a\xe8\x93\x9f\xa6\x9a\x71\x4e\x69\x90\x1a\x09\xc3\x42\x7b\x28\xca\xa6\x9b\xe1\x47\x93\x06\x0d\x04\x0d\xb4\x77\xb7\xcc\xb3\xb3\x75\x92\x59\x3c\x0d\x11\x0b\x3c\xd8\xe6\xfa\xfe\xf3\x5e\x1a\x0d\xd0\x32\x01\x3b\xf0\x4d\x7d\x53\x56\x43\x3d\x6d\x34\x84\x68\x84\xeb\x17\xf0\xe6\x6f\xc8\xba\x3c\x39\x58\xee\x6c\x2c\xb0\x10\x99\x6b\x6d\x71\x83\x26\x3c\xbf\xfa\x69\x50\x11\x2e\xd6\x5e\x6d\xf4\xc6\x7a\xc5\xf8\xbb\x65\x52\xdb\x3a\xf9\x8e\xe9\xac\xfb\x2b\x09\x12\x91\xd2\x71\x61\x76\x6e\xf6\x3e\xf9\x0d\x12\xa8\x98\xba\x57\xe9\x1b\x7c\xd4\xe3\x69\x95\x12\x92\x12\x01\x08\xd6\xc6\xb6\xf4\x7a\xf4\x33\x94\x83\xcf\x07\xee\x3f\x76\xc7\x2a\xf3\x32\xee\x94\x50\x69\x6b\x69\x68\x9f\x54\xa2\x12\xf0\xdc\x0f\x9b\x12\xaa\x0c\x06\x95\x0f\xdf\xbf\x3c\xde\x5d\xfb\x5d\x23\x9a\x62\xf6\x60\x0d\x8a\xbe\x17\x4d\x36\x2d\xe5\x52\xd2\x85\x03\x18\x91\x3b\x1d\xcf\x56\xda\xa0\xc8\x6d\x8e\x89\x62\x64\x6c\xca\x89\x7a\x84\xe3\x37\x84\xc4\x09\xa8\x41\x24\xb3\x8b\xde\x17\x99\xbe\x94\xc4\x2a\xd0\x8e\x63\xb9\x46\xa1\x94\xd9\x1b\x44\xb8\xe0\xa8\x22\x88\xab\x4e\xf7\xe4\xbf\x88\x7a\xce\x02\xff\x3c\x16\xa6\x84\xab\x00\xbb\x77\xeb\x3c\x53\x2f\x5f\xc0\x76\xef\x46\xfd\x19\x4a\xd2\x40\xa5\xe1\x08\x7f\xb1\x83\xa6\xc9\x51\x61\xcc\x55\xe3\x17\xe1\x9f\x94\xa4\x8a\x22\xc6\xf3\x15\x61\x7b\x93\x8f\xc0\x8f\xd0\x8c\xc6\x83\x8a\xd2\x81\x84\x7e\x8b\x10\x14\x42\x2c\x90\x7d\x15\xd5\x7f\xfa\xbf\x4a\xab\xba\xd2\x88\x46\xe4\x9b\xe6\x88\x24\x88\xb6\xd7\x11\xa2\x44\x18\x11\xb9\x75\xae\xfb\x4d\x97\xe0\x6f\x71\x6a\xd1\xb3\x1b\x27\x8c\xb5\xf4\xf4\x66\x3a\x18\xdf\xd8\x75\xb0\xde\x96\x79\x3e\xd7\x07\xbb\x7c\x6d\xa5\x04\x24\xa3\xec\xa0\x69\xcf\xd7\xbd\xb4\x1f\x25\x2a\x8c\x10\x26\x97\x29\xab\x5a\xd0\xff\x3d\x02\xbc\xd7\x26\x7b\x47\xd5\x46\xaf\xf6\x35\x7a\x25\x55\xaa\xb0\xae\x8a\xad\x23\x8b\x74\x71\x5b\x74\x40\x31\xb0\xdc\x41\xb3\x79\x15\x79\x3b\x72\x11\xf4\x72\xb9\xff\xb0\xcf\xc3\xa5\x79\x94\xe8\x48\x48\x57\x4f\x7c\x28\x35\xcc\x6e\x80\x96\x01\x63\xfd\x3b\xe8\xcc\x2e\x97\x91\x93\x94\x68\xa0\x48\x3c\xf5\x8b\x87\xd3\x91\xc4\x6e\xb0\x05\xf4\x8b\xaa\xf9\x58\xa2\x70\xb9\xfe\xe1\xe7\x4a\xbe\x94\x40\x64\x29\x7e\x27\xf1\x02\x77\xd9\xff\xb6\x99\x5e\x97\xfd\x33\x05\x61\xf3\xe2\xaa\x5b\x4f\xb3\xc6\xc3\x52\x0e\xac\x1f\xa0\x52\xcf\xf2\x44\x54\xcd\xed\xd9\x4c\xe3\x1f\x4a\x40\x13\xd7\x16\x2f\xa0\xce\xea\x1f\x59\xd5\xf6\x2f\xa1\x91\x04\xd1\x57\xf8\x44\x4c\xa6\x2e\xe8\x89\x8b\xf3\x62\x17\x19\x22\xd2\xf3\xfa\xf6\xaf\x7d\x2b\x47\x90\x31\xda\xad\x69\xf8\x98\x0f\xae\x0a\xea\xfd\xab\x28\xa5\x54\x62\x88\x88\x9d\xb8\x5d\x2b\x7b\x24\xab\xef\x6e\x4e\x7e\x83\x52\x30\x28\x4a\x72\xc6\x62\xc8\x14\xb2\x4f\x29\x0b\x0d\xea\x69\xad\x1f\x1f\x7e\x6c\xb6\x98\xc7\x5e\x6f\x1e\x1e\xef\x6f\x1f\x56\xfb\xc7\xad\xff\x49\x16\x01\x0f\x3d\x0f\x72\xec\x75\x7b\x14\xcd\x3d\xd4\x35\xf2\x35\xfc\xd8\x58\x52\xb7\x6e\xdd\xae\x1f\xd9\xd3\xb1\xc7\x97\x51\xca\x52\x2d\x5c\xc9\xa0\x86\xdc\x74\xf3\xaa\x58\x58\xf2\x69\xb7\xae\x72\x9b\x01\x9f\xb7\x48\x97\xef\xcb\x47\x94\x86\x89\xa5\xa2\xa3\x64\x60\xb5\x2e\x35\x74\xdf\xbd\x2d\x40\x4f\x2f\x2e\x4c\x14\x1d\x4c\xb2\x1f\x5d\xa1\x76\x3b\xf1\x19\x77\x43\xa3\xc0\x92\xbd\xfd\xab\xb9\xeb\x72\xef\xa1\xcd\x39\x1b\xcc\x23\x7c\x59\x1e\x0b\x54\x67\x57\xf6\xc1\x2d\xc9\xa5\x2f\x7e\x07\x34\x4a\x13\x54\xed\xb9\xca\x9a\x75\x0e\xa7\x93\xbf\xb2\x48\x9a\x80\x79\x6f\x5a\x3f\x97\x5f\xc3\x39\x2f\xb1\x33\x32\x00\xa2\x29\x8d\xb5\x65\x68\x38\x12\x74\x17\x1f\x6f\x74\xd6\x1c\xf8\x64\x89\xa0\xb1\x4e\x11\x37\xad\xcb\x7d\x6f\x57\x46\x29\x8f\x83\xd4\x85\xac\x4d\x8e\x02\x3b\xc3\xe4\x41\xb9\x02\x08\x9c\x77\xc9\xfe\x28\x9a\xdd\x31\x6b\xae\x7b\x0b\x13\x4a\x93\x34\x42\xa8\xf5\x4a\xeb\x7d\xd6\xe4\x73\xbe\xe1\x2f\x54\x41\x29\x4d\xa4\xf2\x16\x0b\x37\x59\x9e\xff\x28\xf3\x16\xbd\xf7\xcb\x32\x9f\x7a\x8e\xcd\xf6\x4b\x53\xc0\x59\xa6\x3b\x27\x5d\xbe\x15\xd3\xbc\xc7\x0d\x12\x24\xc4\xbe\xb1\xa5\xe4\xcd\xf3\xc8\xd9\xd8\x94\x31\x47\xa2\xba\x12\x35\x2c\x7f\x39\x42\x86\x10\x0c\x56\x44\x7a\xec\x69\x47\xa9\x30\xdc\x20\x77\xb4\x3c\x9d\xdb\x06\xae\xda\x8f\xd9\xee\xca\x19\x27\x75\x3b\x67\x6a\x56\x9a\xa6\x54\xc7\xca\x9f\xc2\xaa\x82\x42\xdc\x16\x0d\x54\x46\xcc\x8a\x18\x94\x9a\x00\x60\xec\x9d\xe7\xd6\xa3\x7a\x3e\x8c\x28\x04\x9f\x1e\x06\x9c\xcf\xbc\x53\xfb\xab\xb2\x05\xa5\x26\xa1\x58\x27\xb6\x6d\x08\x3f\x43\xf6\x02\x83\x83\xb7\x20\xa5\x46\xb1\xc4\xc2\x5f\xb2\x66\xa7\x3c\x9c\x97\xb2\x20\x54\xa1\x83\xb9\x6e\xde\xcf\x79\xa6\xb2\xbe\x4d\xe2\xd1\x0f\x43\xe7\x9d\x32\x12\x4a\x5c\x9f\xd7\x8f\x0f\x37\xb7\x5f\x0e\x37\x9b\xcd\xee\x70\x7d\xfb\xc3\x1f\x8d\x48\xe1\x05\xb9\xac\x0d\x7c\x56\x16\xd6\xc0\x60\x7a\xe9\x8c\xd2\x00\x93\xf0\xc3\x2b\x54\x99\xf9\x98\x3d\x79\x3f\x28\xb1\xc6\xa1\x3a\xab\xbb\xb4\xda\x81\x38\x86\x76\x06\x65\x34\x05\xec\xfd\x1d\xb2\xfa\xa1\x6c\x1e\x8b\x31\x1d\xd1\x0d\x61\x90\xf0\xc0\x39\x82\x5a\x95\xed\x46\x1d\xf7\x15\xc0\xa2\x74\x0b\x65\x11\x4b\x49\xe2\x31\x41\x17\xd3\x1c\x8b\x62\x8d\x21\xeb\xa9\x0b\xdd\x8e\x30\xd3\xe9\xf5\xb2\x0b\xe1\xf8\x9f\x71\xef\x9b\xb2\x48\x44\xde\xa8\xa0\x4b\x9f\xb0\xaf\x31\xff\x0d\x48\x10\xac\xf0\x03\x0a\x5d\x56\x9f\xbc\x64\x2c\xa6\x5a\x47\xde\xd5\xe8\x5c\xaa\xe3\xa8\xae\x4a\x59\x9c\x32\xfc\x10\x90\x4c\xb6\x52\x0a\xea\xda\x49\xc4\xea\x61\x08\x17\x89\x07\x07\xcf\x0f\xae\x54\x6c\x0d\x89\x11\x6a\xb2\xec\x64\xed\xc6\xf2\x40\x20\x7f\xa5\x3c\x43\x81\x85\x42\x2c\xd1\x2f\x55\xe8\x29\xe3\x49\x9a\x38\xf4\x38\xce\xd4\x2e\x3f\xb8\x2d\xee\xb3\xdc\x11\xba\xfd\xaa\xc4\x12\x42\x11\x7d\x25\xe1\x39\x2b\x9e\xfa\xd9\x8c\x25\x91\xd5\x49\xa8\xb2\xe7\x63\xc3\x93\xd9\xcd\x4b\x52\x4b\x5f\xd6\x59\x9d\x67\x2f\xb0\xaf\xc6\x4e\x81\xd3\x47\x9d\x6a\x83\xf7\x08\x8b\x9f\x98\x2f\x4d\x6c\x79\xdc\x28\x41\x23\x29\x46\xd8\x96\x2b\x68\x9c\x37\xc2\xf2\xed\x10\x3c\xc4\x56\x9c\x2b\xf7\x38\x62\xe0\xcf\xec\x25\x7b\xc2\x35\xd7\xde\x0f\x1f\x03\x31\x19\x4a\xac\x67\x39\x74\xfa\x51\x54\x7e\xc1\x60\x2a\xe1\xf8\x84\xcf\xb9\xf8\x18\x4d\xf7\x4c\x0b\x26\xd2\x01\x1e\xb8\xb3\x2e\x44\xa3\xa5\x86\x69\x48\xf1\x91\x5c\x83\x41\x33\x36\x67\x73\x9b\xe7\xc3\xd3\x07\xa2\xb0\x41\xbc\x9b\x35\x24\x28\x03\xc5\x50\xd8\xf3\xdb\x6e\xa7\x32\x6d\x31\x95\x6e\x93\x09\x02\x54\x2f\x91\x9f\x50\x39\xfc\x30\xd0\x5e\xd1\x08\x39\x63\x30\xd6\xf4\xb4\x33\xca\x00\xa0\xb2\xfb\x84\x01\x0f\xb0\x8e\xbd\x6e\x2b\x6f\xba\xe4\x7e\x35\x24\x81\xf5\x99\xee\xde\xef\x75\x59\x37\x4f\x50\x7d\x2d\xdb\xaa\xdf\x4c\xad\xac\xfc\x64\x1f\xca\x0d\xf7\x62\x1a\x99\xbe\xbd\xfe\xac\xd4\xf1\x4b\xe4\x1e\x0d\xa9\x30\x68\x65\x22\xe1\x53\x37\xf1\x91\xa6\xe1\xe2\x6b\x16\xb2\x90\xa1\x4b\xcd\xaa\x10\xf9\x47\x93\x29\xab\x53\xec\x37\xc6\xb1\x09\x7a\x41\xbc\xa7\xaa\x7c\xcd\xe6\x7a\xcf\x34\x64\xd2\x52\xa9\xb2\xda\x2a\x34\x3c\xbe\xf5\x19\xd5\xbc\xbe\x3d\xdd\x31\x0a\x42\x4c\x04\x7c\x49\xfc\xaa\x97\x02\xfa\x65\x90\x1b\x46\x8a\x20\x50\x04\xeb\x2c\x57\x6d\x55\x4c\xee\x2d\x67\xd6\x58\x5b\x95\x45\x5d\x56\x4d\xd6\x9e\x9e\x72\xa1\xc0\x32\x19\xfb\x41\x31\xf5\x6e\xf9\xab\xaa\xc9\xea\x66\x0c\xb9\x76\x63\xd2\x40\xc4\x83\x44\xfd\x5a\x54\x7a\x20\xd4\xfb\x25\x27\x4c\x69\xe8\x8b\x2a\xc8\xc7\x99\x5b\x86\xd1\x30\x0d\x35\xd2\x88\x7b\xab\xda\x62\xb2\xec\x87\x29\xe7\xca\xfb\xd1\x78\x09\x6e\xbf\x29\x91\x88\xe0\x50\x65\xf1\x9f\xb6\x02\xc7\x2d\xf4\x5b\x45\x60\xb0\xab\x03\x93\xaf\x2b\x14\x49\x8a\xd8\x15\xc4\x65\x1e\x5c\xb5\xee\xa0\x8a\xe6\x70\xf2\x86\xc1\x34\x14\x69\x8c\xf1\xb7\x27\x77\xa0\x1f\xf5\xa8\x5a\x10\x0a\x6d\x8d\xbb\xb6\xa8\xbe\xd2\xf3\x45\x68\x28\x41\x79\x3b\x91\x6e\xa7\x7d\x36\xdc\x54\x45\x22\x84\x1e\x09\xad\xb7\x4b\x34\xbe\xdf\x31\x0f\xdd\x61\x34\x23\x08\xdd\xfc\xfe\x70\xbb\xbf\x6e\x4f\xa7\x0f\x87\xe3\xf9\x22\x1a\x78\x13\x1f\xb3\xa7\xa4\x21\x00\x2b\x5b\x88\xa6\x2e\x5d\xfa\x92\xe9\x59\xe4\x14\x6a\x50\xc9\x60\x51\x7e\xf5\x7d\x77\xfb\xb0\xd9\xed\xfc\x79\x03\xb1\x14\x07\x64\x62\x68\x4b\xc1\xd9\x76\xd1\x81\x1f\x60\x80\x5a\xef\xc0\x91\x04\x67\xeb\x9f\x43\x14\x50\x8d\x55\x7d\x4c\x9f\x0e\xe7\x2e\x61\x3f\x9c\xca\x02\x3e\xfa\x01\x31\x80\x8b\x3b\x1e\xa7\xc6\xa9\x34\x0a\xb8\xf0\x0e\x30\x23\x6b\xe7\xe9\xe9\x47\x01\x07\x24\xc0\xf7\x2a\x8b\x85\x16\xbf\xbb\xb9\xff\xa2\x53\x93\xb1\x2e\x21\x61\x56\xb2\x46\x35\xd9\x2b\xf4\xec\xb2\x01\xf1\x47\xa3\x00\x8c\xc3\x36\x1a\x47\x95\x59\xaa\xfc\xd3\x88\xa4\x0c\x15\x37\x73\x75\x5a\x40\x98\xd1\x88\x88\x10\x0b\x88\x5f\xe8\x77\x33\xbc\x54\x11\x55\xd6\x4f\xec\xd9\x01\xf8\xbc\x1e\xd0\xf4\xe0\x54\x27\x61\xe8\x4c\x26\x0e\x4d\xdf\xf0\xa2\x11\x0b\x83\xa0\x7b\x0c\xdb\xa7\xdd\x6c\x17\xd6\x25\x3a\x18\xf8\x3d\xde\xad\x1f\x6f\xfd\x8a\x10\x85\x10\x22\x89\x6d\x77\xb3\xf7\x7f\x8a\xba\x2f\xae\x7b\xd8\xa7\x73\x7e\xb0\xd2\x51\xd3\xd9\xd7\x8f\x63\xa1\xd5\x0e\xc1\x00\x71\xd0\xbc\xa4\x51\x64\x44\x38\xc4\xb5\x23\xc5\xd6\x6e\x93\x24\xbc\x37\x5e\x5f\xea\x21\xd2\x28\x26\x16\x30\xf8\x9f\x32\x2b\x1e\x0b\x98\xb0\x9a\x68\x14\xeb\x88\x27\xc3\xe7\xe5\xda\x71\x3f\xb3\xa2\x1e\x7d\xe3\x51\x0c\xc2\xeb\xc7\x79\x55\x2f\xe7\x8b\x2c\x45\xf1\x32\x7b\x7b\x38\x11\x58\x39\x3c\x43\xa5\xbe\x9f\xe7\x1b\xa9\x42\xca\x8b\x70\x26\xdc\xab\x42\xbb\x46\xa2\x1f\xa0\xac\xca\x56\x5f\x34\xc5\x36\xcd\x22\x81\x86\x46\x1c\x04\x52\x9c\xa1\x1b\xf3\x24\xb2\xfe\xc9\x73\xc3\x84\xc3\xb2\x3f\xb8\x92\xed\xee\x98\x9d\xeb\xab\x0f\x3b\xa7\xba\x61\x89\x31\x38\x2d\x61\x67\xd0\xfd\x2d\x8d\x25\xf1\xe6\x53\x95\x78\x2e\x8b\x89\x2e\xd7\x74\x69\x88\x04\x4f\x63\xf7\xa9\x7d\x15\x95\x56\xed\x79\xe4\xe7\x45\x23\x21\x13\x6c\x43\x66\x8f\xbb\x51\x69\x24\x12\x4a\x20\x4e\xe7\x2a\x73\x2d\xa8\x7e\x03\x04\xe8\x05\xd4\x5d\xb3\xc8\x1f\xca\xea\x64\x03\x9a\xdf\xc9\x50\xfd\xf6\xdf\xe9\x2b\x21\x59\x88\x4d\x9a\x1f\xd9\x2b\xbc\x6c\xcb\x63\xd6\xfc\xc8\xe4\x51\x7c\x8c\xd7\xb5\x48\x51\xeb\x00\x50\x37\xe2\xd9\xc6\x44\xf7\xed\xac\xdc\x1e\x29\x43\x46\x8a\xc1\xdd\x34\xb5\x80\x58\xa1\x91\x0e\x5c\xb7\xfd\x19\x76\xd0\xa0\xf0\xc2\x93\xa8\x9a\x1e\x48\xe2\x86\x41\x6c\x57\x92\x2e\x48\x3c\x89\x06\x5c\x37\x6a\x56\xf1\x89\x0c\x49\xad\x2b\xbe\xd6\x13\xff\xe0\xc5\xfc\xbd\xdf\x47\x60\x33\x04\x59\xff\x65\xb5\x10\xd9\x46\x86\x47\x08\x1f\x3e\x0b\x54\x29\xf0\x7f\x05\xeb\xf5\x64\xaf\xb0\x0b\x38\xb2\xe2\x79\xae\x97\x41\xe3\x20\xd6\x58\x7d\xb9\xba\xdd\xef\x37\xeb\xb1\xe6\x04\x8d\x83\x84\x11\x57\x7b\xfa\x67\xd1\x5c\x18\x23\xd1\x38\x30\x31\xf6\x35\x6f\xeb\xab\x32\xcb\xa1\x9a\x40\x37\xdc\x18\x12\x58\xa9\x7d\xdb\xfe\x1e\xfb\x51\xd1\x98\x24\x04\x23\x77\x05\xdd\xb5\x2d\xcb\x43\xd3\x98\xa4\x02\x1f\x3a\x1a\xc1\x20\x05\xa5\x99\xdd\x88\x7f\x2c\xec\x45\xd3\x44\xf4\xb5\x2a\x67\xc1\xbf\x85\x3a\xd3\xad\xc8\xaf\x54\xd9\x9e\x87\x8e\x5d\x4c\x05\x63\x72\xe0\xb8\xa3\xc4\xe3\x00\x20\xa0\x31\x95\x29\x2e\x08\x4e\xcb\x4e\x9c\xce\x22\x7b\x2e\x66\x42\x88\x63\x3d\xd2\x0b\xb2\xc5\xc5\xbf\x6e\xdf\xc9\xad\xa2\xda\x60\xbc\x9d\xd5\xdf\x8a\xf2\xad\xf0\xd1\xf6\x62\x4c\x18\x33\xc2\x75\x77\xef\x31\x80\xb0\xa8\x02\x4c\x42\x3f\xeb\x02\xc7\x2c\x21\xa8\x9c\x92\x67\xa7\xac\xd9\xec\xbf\xfa\x8b\x0b\x79\x82\xdd\xa4\xb3\x68\x6b\x6b\x9a\x33\x7d\x48\xa1\x08\x26\xe0\x90\xcd\xbb\x1a\x7a\x00\x71\x28\x38\x57\x1e\xe6\xd7\x34\x39\xde\xb7\xb2\x9d\x2d\xcc\x71\x14\x87\x08\x5a\x5d\x6f\x1f\x7f\x5e\xef\x56\x77\x9b\xc3\xdd\xed\xfd\xad\x5f\x6b\xe2\x48\xc4\x38\xd5\x7f\xdb\xae\x9f\xdc\x33\x98\xcb\xf6\x2c\xdf\x85\x98\x30\xcc\xad\xee\xca\xe7\x2d\xc8\xe9\x32\x32\x27\x27\xff\x32\x45\x88\xe3\x30\x0e\x06\x57\xc1\x5d\x23\xd4\x8b\x8d\x84\x17\x5d\xfa\x87\xf7\x8c\x87\x1c\x6b\xc2\xa6\x02\x50\xe5\xe9\xd4\x16\x59\xf3\x31\x6a\xa6\xc5\x3c\x06\xc4\x0d\xfc\x58\x4d\x3e\x2e\x0e\xa1\xb4\xac\x42\x2b\x4d\x3b\x82\xd2\xb8\x11\x09\x8f\xc4\xd4\x4e\x02\xf2\x2e\xf4\xb7\x86\x1b\xb3\x1b\x9c\x00\xe7\xae\x57\x80\x7c\xf5\x2e\xb3\x1a\x84\xb2\x5d\xd5\x22\x4e\x03\x12\xca\x31\xed\xfe\x76\x36\x99\xc4\x69\x24\xb0\x9c\xbe\xed\x56\xca\xf1\x65\xa4\xa9\x24\x7a\xea\xcc\x68\x8f\x3f\x99\xe3\xe2\xd4\x50\x7c\x5b\x9e\xb6\x9b\xfd\xf5\xc6\x85\x88\xe8\xfd\x39\xd4\x91\x63\xc1\x18\x1e\x0b\x55\x47\xfb\x64\xc9\x6f\x14\x4c\xf9\x34\xf1\xbb\x35\x6b\x9e\x5d\xab\x0c\x09\xf4\xd6\xe9\xdf\x37\xfb\x7a\x50\xf1\xa3\xb1\xe4\x0a\x23\xaa\xb5\xa8\x8f\x7b\xc8\xe1\x7d\x72\xd7\xa5\x50\x9a\xf4\xa9\xca\x75\xd5\x5d\xe5\xec\x0e\xa0\xb7\x93\x87\x0f\x97\x55\xbf\xc6\xc5\x8a\x87\x88\xb1\x74\xd6\x28\xfb\x12\xa1\x4d\xb3\x08\x3a\x56\x83\x48\xd4\xd5\x6d\x3f\xc3\x4f\x86\xe8\x20\xc4\xe9\xc4\x01\x26\xc8\x1f\xfd\xdf\x15\x16\xb7\xe1\x94\x35\x3f\xcb\xea\x05\xe9\xa8\x9f\x7d\xce\x3a\x4e\xb1\x4b\xf1\x58\x80\x8b\x0e\xbf\x64\x5e\x95\x83\xc6\x5a\x13\x4c\xc3\xff\x33\x32\x12\x74\x9b\x0c\x70\x05\x83\xce\xd2\x0f\xa8\x1b\x2f\xa2\x76\x33\xc3\x46\x52\x1e\x28\x89\x37\xe3\xaa\x51\xfb\x63\x7b\x92\xbf\x25\x12\x77\xbb\x00\xfa\xef\x55\xda\x01\x98\x71\xb2\x1e\xf5\x0d\x79\xa0\xb9\x92\x63\xe0\x3b\xce\x61\x4e\xf4\x6e\xec\x3c\x32\xfd\xd8\x39\x09\x52\xcb\x0a\x13\xb9\x42\x8a\xc7\x13\x58\x68\xfd\xf2\x2d\xe2\x24\x14\xa9\x97\x48\xdc\xae\x66\x57\x46\x94\xc0\x4a\x7c\xd1\x9e\xee\x4b\xe4\x0c\xce\x9c\x3a\x29\xa7\xd4\x8a\xd8\x63\x23\xb8\xec\x0b\x3a\x9c\x32\x8d\x52\x84\x36\x71\x6c\x7e\x23\xfd\x3a\x0e\x96\x39\x35\x1c\x83\x65\xd9\x56\x45\xaf\xfa\xed\x50\x2b\xff\x25\x69\xe8\x57\xed\x60\xce\x12\x8a\x52\xea\xb2\xfd\xe8\x02\xd4\x5c\x7c\xa0\xc0\xec\x2f\xa3\x2a\xce\x64\x60\x15\xa0\xce\x50\x34\x4f\xa2\xaa\x41\xf5\xcf\x2a\x0a\x52\x4c\xba\x33\x0c\x79\xae\xb3\xaa\x57\x6b\xa3\x3c\x0a\x53\x9d\x7a\x72\x68\xf7\x89\xa3\xea\xe4\xf2\xb3\x88\x03\xbb\xca\xb8\xc4\x0c\x89\x79\x50\x5d\xe0\xa7\x26\x93\x09\x8f\x89\xa5\xae\xbe\x7c\x76\xd0\x48\xfa\x49\xef\x0e\x9e\x67\x7c\x66\x3f\x26\x8d\x51\x04\xa3\x11\xb2\x7e\x2c\xba\xa0\x7c\x8d\x3a\x2e\x43\xe4\xce\x79\xc4\x90\x39\x75\x14\x79\x53\x23\xb9\xab\xbf\x7c\xce\xad\xef\x86\x83\x0a\xd8\x90\x5e\x34\x70\x5b\xac\xa1\x57\x2c\xa2\x9c\x1b\x82\x14\x4f\x73\x49\xd4\xed\x36\xda\x3e\x33\x2e\xb0\x7f\x8c\xfc\x8a\xdc\xf6\x84\x01\x6a\xb0\xbe\x66\xf0\xb6\xf6\x16\x3d\x77\xd9\xab\x1b\x3b\xac\x35\x3c\x09\x53\x2c\xe7\xee\x5f\xca\x0b\x83\x39\x37\x24\xd5\x41\xe8\xf4\xe7\x74\xab\x9a\xf0\x50\xf7\x7c\x4c\xca\x45\x1c\x61\x38\x6b\x63\x42\x6f\xfb\x88\xe5\x18\x8b\xee\x9f\x9e\xb8\xe0\xa1\xd3\xa4\x68\x9c\x7a\xdf\x74\xbb\xa4\x8a\xea\x41\xb5\x72\x23\x2a\xab\x5a\xe9\x37\xab\x18\x43\x03\x55\x16\x26\x7b\x6e\x2b\x18\x81\x43\xfe\x31\x7d\xde\x93\x72\xde\x98\x8c\xd9\x1d\x85\x23\x9b\xc3\x94\x55\x93\x19\x2b\xf0\x50\xcf\xaa\xf5\x4b\x3e\x95\x94\x2b\x46\x39\xf4\x57\xfb\x00\x6f\xdb\x56\x42\x8d\x80\x10\x8b\x96\x9c\x5d\x8e\x26\x16\x00\x88\x6a\x16\x55\x0d\x26\xab\x60\x84\xff\xa4\x5c\xc7\x01\x52\xee\xb1\x54\x8f\xda\x6f\xa3\x6d\x9c\xd3\xc1\x77\xcd\x1f\xf9\x5f\x24\x20\xff\xf6\x35\x62\x0e\x9c\x79\x41\x14\xab\x24\xdf\x2d\x23\x5d\xd4\xfb\xa9\x8c\x01\xe5\x46\x31\xc4\x4c\x18\xbf\x4a\x24\x41\x14\x12\xf5\x09\xaf\x6a\xf2\xf9\x24\x41\xa2\x91\x00\x76\x9f\x15\xbd\x94\x04\x4d\x08\x35\x0e\x0a\x90\x3d\x3f\x4f\x1d\xd9\x68\x42\x98\x6d\xe8\x18\x80\xbd\x78\x81\xfe\xcf\x5d\x6e\x69\x67\xd2\xdb\xd3\xc9\xb7\x84\xa6\xaf\x5e\x42\x44\x80\x42\x1f\x37\xb6\x54\x26\x64\x3e\xe2\xbb\xb7\x8b\xdc\xdb\xd9\x01\x34\xc1\x1f\x57\x72\xba\x60\x24\x8c\xd2\x58\x0f\x1c\x58\x57\xfb\x5c\x48\x97\x12\x46\x43\x16\x4c\x14\x10\x2b\x03\xd9\x9c\xb3\x97\xcc\x7e\x38\x64\x56\x76\xb2\xbb\xbc\xe2\x35\x6b\x30\x93\x69\x3f\x9d\x36\xe7\x7b\x87\x0a\x61\x88\xdd\xb2\xfd\xcf\x52\x5a\x6f\xba\x2f\xd9\xeb\x6f\x08\x1d\x89\xdf\x3d\x22\xd8\xd2\x73\xd2\x4e\x37\x8f\xdb\xc3\x76\x73\xb3\xd9\xae\xee\xfc\xe5\x87\x42\x22\x2c\x06\xee\xfe\xfa\x9f\xeb\xfe\x8f\x4a\xab\xc8\x8a\x60\x7a\x49\xad\x49\x03\x3a\x89\xa8\xe5\xf7\xe0\xb4\xb3\x68\xbb\x48\x93\x28\x56\xd8\x82\x38\x57\x50\x97\xb9\xbe\xef\xeb\x9e\x49\x24\x68\x68\x05\x13\x1c\xf6\x0f\x1b\x0c\x77\x7f\x9d\xa1\x1a\x72\x87\x24\xd2\xc2\x20\xed\xbf\x34\x79\x66\xfa\xd7\x25\x36\x0c\x17\x86\x9d\x7d\xd1\x17\xb1\x73\x09\x4f\x28\x56\x5b\x5e\xb2\xa6\x81\x62\x1c\xc3\x25\xdc\x08\xee\xf1\x67\xd7\xd9\x6b\xb6\xe8\xe8\x31\xbd\x92\x44\x48\xaf\x67\xd4\x7d\x51\x4e\x72\xec\xde\x8a\x61\xdf\xf6\x47\x4e\xc0\x56\x18\x8b\xf2\x6d\xac\x2b\x4f\x93\x94\x5b\xcb\x8e\xba\xe9\x8d\x32\x69\x92\x0a\x6d\xc4\x08\x9a\x32\x14\x54\xe6\x78\x64\x9a\xa4\x5a\x22\x07\xd8\x74\xc1\xf1\x50\x33\x9c\x15\x1e\x12\x11\x59\x8f\x66\xab\xc9\x04\x0a\xb2\x73\xf3\x54\x95\xa5\x99\xa9\x45\x0d\x99\xe4\x05\xa4\x35\x11\x29\x89\xac\x23\x40\x9e\xd7\x27\x51\x37\x68\x8c\xe0\x4f\x5a\x38\xe3\x29\xa1\x7d\xdb\x7c\xa9\x2b\x9b\xc8\x90\x61\x37\xe6\x39\x33\xcd\x5a\x54\xcb\xc6\x53\xdd\xb0\xc8\x2f\xb1\x43\x7f\xed\xea\xc3\x2d\x72\xc9\x6c\xc6\x91\x06\x26\x20\x5a\xcb\x91\xda\x89\x13\xdc\x9e\x4d\xfd\x55\xd4\xc7\x55\xa1\x1f\xca\x61\xde\x4c\x14\xe7\x81\x98\xcc\x89\xf8\x71\x3f\x4d\xdd\xa2\xfc\x60\xd0\x58\x52\xbf\xde\xdc\xfb\xc5\x3b\xd1\x2c\x11\xbd\x48\xd8\xed\xc3\x97\xc3\x6e\xb3\xb9\xde\xf5\x5b\xa3\x18\x4b\xa4\x77\xe5\xf3\xbd\xd3\x26\x58\x6c\x95\x24\x5a\xc6\xa1\x25\x50\x59\x15\xb6\x3f\xe6\x9b\x15\x7e\x4c\xcf\x95\x28\x1a\xdb\x87\xbd\x29\xc7\xda\x71\x34\xd1\x40\x11\x13\xd8\x9e\x9f\xbb\x10\xa2\x7f\x89\x20\x0a\x2c\x14\xc6\xae\x92\xab\x42\xbb\x36\xec\x94\x31\x48\x13\x70\x89\xe2\x16\x74\xab\xb0\x42\xdf\x25\x4f\xa3\xf2\x5b\x02\x42\x26\xd1\x44\x7f\xdf\x5a\xd0\x81\x23\x00\x11\x7f\xba\xa0\x52\x67\x1a\x5c\x9f\xcb\x42\xef\xcb\x75\x6f\x74\xe6\x5f\xac\xf4\xdf\x53\xe5\xb1\x7f\xfd\x5f\xfd\xf7\x1c\x03\x96\x98\x88\x23\x37\xe2\x76\xfd\x68\x1d\x06\x45\xe5\xe3\xc4\xc4\x24\xc4\x23\xbc\x9e\xc4\x87\xea\xc2\x84\x46\x0c\x1b\x01\xf3\xee\x4c\x95\x37\x6d\x31\xba\x6f\x26\xd5\x86\x0c\x72\xab\x3f\xac\x42\xc6\x1e\x1d\xd4\x07\x7c\xd0\xdc\x78\xc1\xee\x9c\x06\x2c\x46\xd4\xf7\x39\x17\x1f\xd7\x99\x82\x75\x79\x92\x8e\xd5\xf7\x6b\x55\x6d\x9a\x06\x3a\x46\x19\xe5\xf3\x3c\x1e\x4a\x89\xd0\xd8\x12\x7e\x28\xbb\x48\xe4\xe0\xca\x24\x4b\x70\x9b\x94\x48\x0b\xfd\x5a\xb5\xcd\xf1\x5a\x9c\xcf\x53\xb5\x8a\x7f\x8c\x82\x95\x51\xc4\x92\x12\x6d\x30\x52\x14\xc6\xb8\x9c\xee\xe0\xee\x46\x4a\x69\x88\x7d\x5e\x74\x69\xed\x3e\xad\xee\x4b\x19\xdf\xe5\x94\x0a\x81\xa1\xea\xbd\xaa\x6e\xca\xea\x8b\xa8\xed\xa8\xe5\xf7\x3d\x65\x81\xc1\xab\x94\xa2\x86\xef\x45\xd6\x1f\x85\xb1\x04\xe3\x7d\x55\xfe\xfd\x31\x46\xc9\x2f\x2f\xd9\x29\x33\x2a\xb0\xd5\xbd\xe6\x4a\x14\x2f\x28\x2e\x54\xa8\xec\x2c\xf2\x05\x1a\x1d\x4d\xc3\x80\xba\x67\xda\x85\xae\x5f\x2c\x9c\xaf\x7b\x5f\xea\x45\xa6\x35\x4d\xc3\xd0\x9a\xa6\x1f\x10\x00\xb1\x83\x42\x8f\xcb\xe0\xdd\x66\x2e\x7a\x6c\xeb\x57\xa7\xc1\x0a\xe7\x5f\xad\xf6\x69\xa8\x2c\xcd\xa1\x4b\xeb\x56\x0f\x13\xed\x6f\x37\x22\x0a\x8d\xb1\x58\xcd\x05\xe5\x88\xd1\x4c\x9c\x46\x91\xd4\x8e\x5c\xd0\x4d\x57\xbd\xa2\x37\x68\xa7\x51\x32\x7a\xb8\x31\xb3\xc4\xd4\x1e\x82\x59\x96\xb3\xe0\x3d\x8d\x8d\x0d\x22\x0f\xb2\xfd\xb8\x13\x48\x56\x5a\x8b\x42\x7f\x7c\xf2\x0c\x39\xb5\xe5\xd3\x1a\x0a\x8d\x40\xa6\x4f\xf1\x9b\xbe\x0b\x9b\x72\x23\x50\x76\xff\x7a\x73\xb3\xfa\x7e\xb7\x3f\x5c\x7f\xdf\xae\x06\xd9\x43\x9a\x26\x91\xed\xaa\x98\xd2\xf7\xf4\xd2\x94\xb2\xc0\xb5\xb6\xd7\x2e\x79\x9b\xdb\x7d\xd0\x34\x4d\x12\x2d\x27\x14\xe9\x4d\x77\x9f\x3e\xe3\x3e\xa4\xa9\x60\xa9\x2b\x2d\x3f\xc0\x7b\xb3\x15\xc5\x0c\xba\x92\x8a\xb8\xa7\x04\x5b\x38\xf3\x74\xb3\x66\x11\x5e\x48\xcf\x72\x9f\x89\xe6\xd1\x54\xa7\xd6\x8d\xd5\xb2\x52\x11\xbf\x21\xea\x7a\x99\xb9\xb7\xac\xd2\x39\x3d\x1e\x24\x96\x4a\x54\x43\x73\x7b\x3a\x5b\x04\xf5\x88\x26\x3c\x4a\x62\x16\xa3\x71\x11\xd0\xd4\x43\x04\x6e\xaf\x0f\x28\x4b\x50\xce\x96\x19\x41\x22\x2d\xad\x4b\x9c\x8d\x5f\x6e\x55\x89\x28\xce\x91\x8a\x47\x37\x08\x30\xaf\xb1\xc0\xec\x4d\xa1\xeb\xdb\xe2\xeb\xd7\xfb\x7b\xbf\x9d\x86\x12\x21\x7b\x4f\x65\x3d\x5f\xfb\x27\x21\x80\xa0\xce\xe7\xe4\xec\x73\x0b\xc1\x58\xe8\x17\x98\x2d\x3c\xb3\xd9\xd9\xb1\x34\xc4\xba\x8d\xeb\xb5\xed\x5a\x5c\x07\xcd\xd0\x5c\xf9\x2c\x50\x9e\x3e\x7c\x11\x26\x8a\x07\x3d\x67\x04\x7d\x9d\xca\x1c\xe6\xdd\x90\xc9\xdd\x17\x61\x4a\x51\x5b\xe1\x64\xd5\x42\xbd\x5c\xfb\xec\x0c\x23\x88\x94\x17\x69\x71\x42\x4b\x93\x2b\x8e\x19\xf8\x4f\x7f\x73\x3a\xe7\xe5\xc7\x44\x3e\x81\x8a\x24\x61\xd8\xb1\xbc\x06\xec\xfd\x0e\x8d\x44\x91\x80\xc2\xe4\x50\x5a\x8d\xf3\xfe\x61\xa4\x91\xc2\x6a\xa5\xeb\x71\x76\xab\x93\xef\x14\x2d\x7f\xb5\x22\x8d\x03\x24\xbb\xa2\xab\x3e\x14\xfa\x26\x2f\xdf\x46\x95\x90\xe9\xab\xb8\x04\xa5\x24\xf1\xc5\x11\x15\x16\x10\x36\xb5\xaa\xca\xb7\x1f\xa2\xcd\x67\x13\x8b\x48\x13\x89\xba\xc3\xa7\x8f\x13\x34\xc7\xa1\xcd\x35\x7d\x1f\x84\xb1\xda\x5a\xae\x51\x3a\x17\x42\xa0\x42\xc6\x31\x12\x6f\x8f\xa2\x5e\x35\xee\x3b\x27\x57\x6d\xf3\x50\x36\xfd\x7f\xd3\x8b\xf2\xfb\xf4\x33\x50\x81\x44\xa4\x62\xd6\x45\xe7\xef\x7f\x4c\x8e\xaf\x98\x30\x4e\xd4\xa3\xb7\x19\xa7\x42\x85\x09\x26\xbc\x3a\xab\xc5\x38\xe2\x12\x4a\x45\xbd\x88\xd4\x14\x0f\x73\xe1\x41\x42\x85\xd6\x31\x1f\x27\xdf\xd5\x25\x90\x45\x68\xc3\xf0\xdc\xb0\x2e\xfd\x13\xb2\xb1\x7e\x23\x15\x40\x44\xc4\xdc\x74\x3b\x6e\x0a\xcc\x6b\x58\x93\x4b\x02\x0e\x64\xe4\x61\xfc\x24\xb2\x7c\x02\xd3\x9f\x3c\x00\x90\x0c\x13\xbd\x2f\xdb\xd5\xfd\x6a\xdf\xcf\xca\x32\x88\xad\xdc\x5d\x0d\xcd\xf5\xac\xa3\x2f\x03\xc5\x43\xc7\xee\xda\xec\xbf\xee\xcb\x39\xf6\x68\xf9\x1b\x94\x84\x0a\xee\x5d\xea\xa7\x5a\x27\x6e\x00\x35\x12\xf5\x2b\xc0\xf2\xdc\x36\xef\x59\x3d\x93\x90\xa0\x92\x71\x26\x6c\x72\x00\x1a\x49\x32\xee\xef\x61\xc8\xd1\x84\xe1\xe6\xf6\xe1\x6e\x75\x75\x78\xda\x6e\x76\xab\xbb\x4d\xbf\x95\x73\xe1\x84\x8a\xac\x60\xd4\xd5\xc7\x1e\x4e\xe7\x7c\x6e\xf9\x41\x65\x28\x64\xa8\x47\x20\xce\x4b\x6e\x24\x95\xa1\xd6\x5e\x36\xd2\x89\x1d\x78\xad\x87\x61\xed\x95\xb1\x8c\x90\xcb\x92\xd5\xd8\xdb\xf3\x31\xa6\xe4\x41\x82\xc8\xdb\xff\x69\x45\xd1\x64\xf7\xa5\x2e\xc7\x2f\x98\xe4\xd2\xca\xee\x0a\x8d\x60\x17\xe4\xe3\x2e\x2a\x35\xb8\xf1\x89\xd1\x58\xd8\xbf\xff\x6b\xdb\x3f\xbb\x34\xa1\x69\x34\x60\xed\x1e\xcd\x43\x59\x7c\xfb\x6b\x3d\x7b\x8a\x22\xe4\x56\xe1\x55\x14\x28\x7a\x3b\xdb\x1a\x49\xaf\xa5\xfd\x24\xd4\x8b\x78\x46\xdc\xfd\x64\x6a\x93\x22\x89\xb8\xbb\x0f\xff\x2c\xe5\x0a\x35\xe7\x87\x0b\x15\x22\x49\x7a\xe7\xa3\x2e\xbb\x5a\x7f\xbd\xf1\xdb\x14\x05\xe3\xc2\xf3\xd9\xef\x6a\x99\x20\xfe\xd0\xa2\x7b\x31\x4d\x7d\x34\xf8\xea\xe3\x3b\xb1\x7a\xae\x00\x2e\xbc\x9c\xe2\x70\x5e\xcd\x1d\x23\x6d\x06\xc0\xf9\xac\xea\xe7\xf2\x68\x69\x08\x97\x76\x71\x50\xe5\xeb\xac\x42\x9c\x2c\xcf\x29\xd2\x10\xeb\x29\x6f\x2a\x80\xbf\xbb\xcc\xc9\x06\x5f\x76\xab\x0a\x62\x83\x6c\xf3\xc7\x5c\x6f\xcb\xf3\xd8\xa7\x84\x2a\xc2\x04\x2e\x45\x77\x8f\xeb\x6f\xdf\x9f\x0e\x3f\x57\x77\x77\x1b\xdf\x95\x54\x4c\x6a\xd4\x0e\x3e\xbc\xfa\xbf\x84\x82\x51\x37\x89\xdc\x7a\x4e\xf5\x1f\x0b\x57\xa1\x42\x61\x01\x69\xab\xdd\xee\x69\xf2\x83\xa1\xf2\x25\x58\x50\x2f\xe7\xb2\x17\x38\xa6\x2a\x22\x21\xb3\xc2\xee\xf2\x5e\xbc\x40\xbd\x69\x8e\x1e\x1c\xbf\x18\x58\xd0\xc0\xef\x48\x03\x9c\x35\xd6\x47\x71\x3a\x67\x65\xd1\xe3\x91\x3f\xeb\x1d\xa9\x28\x8c\xa5\x75\x38\x3e\x75\xf9\x5a\x23\x9e\x21\xee\x4d\x6c\xa9\x8a\xa4\xa5\x9a\x76\x91\xca\xe0\xfd\x38\x3d\x02\x58\x21\x7b\x67\x60\x3a\xad\x60\x8c\xdf\x4b\x15\x99\x04\x91\x21\xf8\xed\xae\xde\x04\x9a\x66\x2b\x27\xa3\xb0\xf8\x19\xa9\x98\x68\x8b\x93\xe8\xde\xaf\x7d\x89\x15\xf9\x3f\x66\x43\x68\x14\x53\x1f\x94\xba\x1a\xe3\xd8\x48\x70\x39\xb7\x53\x71\x62\xa9\x3d\x56\x8f\xb6\x3b\xf0\xd0\x95\x54\x5c\x09\xec\x4a\xc2\x7b\x53\xd9\x85\xa6\xee\xbe\x45\x6f\x3a\x31\x25\x1f\x2b\x6e\x0c\x66\x3e\xfb\xf2\x0c\x23\x57\x2c\xaa\x12\xa3\xf1\x63\xcd\x0a\x6b\xb7\xf1\xb3\xac\x72\x3d\xf1\x2c\xfe\xe4\xe4\x44\x10\x59\x1e\x78\x0e\x62\x48\x25\xee\xc5\xf9\x3c\x3a\x49\x99\x24\x68\x0e\xf4\x9c\x19\xcf\xff\xe9\x37\xa5\x29\xb5\x49\xff\x98\x65\xf3\x09\xf2\xc0\xef\x23\xd8\x20\xf4\x32\xad\xba\x2a\x29\x29\x42\x43\x3c\x32\x52\xb4\xcd\x27\x55\x6a\xa5\x44\x8c\x19\xbe\xcf\xc6\x51\xda\xb0\x76\x74\x1f\x3f\x46\xda\x42\x4d\x56\xbb\xe2\x9c\x23\x49\xe0\x3d\x9e\xe5\xef\x4a\x07\x10\xf4\x48\xc3\x07\x78\xb3\xe2\xc2\xf3\x4b\x9a\x5c\x8a\xe6\x31\xa3\x56\x72\xc2\x85\x76\x9f\x9c\xac\x16\x86\xf6\x89\x01\xf1\xf8\xba\xac\xf4\xde\xe7\x54\x69\x69\xf0\xd7\x77\x1f\xf9\x64\x41\x50\x86\x5b\xc6\xe3\x51\xd4\x83\xb0\xed\x92\x0e\x30\x55\x26\x95\x18\xca\x3f\x95\xcd\x53\xd9\x08\x6f\x79\x4f\x75\x90\x12\xec\x84\x21\x73\x14\x1a\xa1\x17\x0c\x7f\xdd\x50\x12\x69\xcc\x07\xb1\xd1\x7d\x5b\xd7\x6d\xb7\x82\x20\xda\xed\x15\x2a\xf1\x0c\x53\xc0\x80\xa6\x0c\x42\xe7\xb9\xdc\x64\x45\x5b\xb6\xf5\x95\x50\x2f\xc3\xcb\xa3\x69\x44\x10\xa8\xab\xba\x45\xf0\x56\x95\xbd\xc8\x36\xd5\x8c\x87\x38\xb3\x8d\x0a\xe7\x3f\xb3\xe2\x22\x35\xd6\x21\x89\x90\x13\xb3\x3e\x66\x6a\xb8\x31\x3a\xa4\x80\xe0\x12\xdb\x57\xf7\xf4\x97\xd9\xae\x21\xc5\x09\x0e\xde\x55\xde\x6a\xf8\x79\x1c\xe1\xc3\xfa\x21\x76\xb2\x38\xbb\x20\x86\xf6\xc7\x37\x33\x70\xdd\x14\xdb\x36\x3d\x4a\x44\x63\xe4\xba\x1d\xaa\x0b\x8c\x9f\x8e\x18\xa0\x5d\x4c\x56\x64\xcd\xb8\x94\xa0\xa3\x38\x10\x4e\xfa\xe5\xfc\x58\x09\x95\x67\x7f\xf7\x37\x27\x92\xb6\xcc\xfd\xcf\x7f\xfa\x9a\xbc\x4e\x18\x47\x7e\x89\x75\x18\x18\x94\xf5\xbb\x2d\x80\x7e\x6f\x5d\x5e\x83\x8a\x3e\xcb\xcf\x36\x89\xad\x6b\xf5\x03\xbc\x5d\x97\x45\x79\xa9\x49\x3b\x3d\xef\x44\x03\x92\x8c\xce\x55\x79\xca\xea\x1e\x7a\xa6\x53\x16\x63\xa9\xdd\xd2\x06\xbf\x7d\xef\xff\xae\x08\xb2\x2e\xce\x15\x64\xaa\x3c\xe0\xbb\x3e\x78\x7f\x50\x2d\x62\x8b\xd4\xad\xa1\xb9\x87\xc6\x6b\xcf\xf9\x73\x98\xfc\xb4\x90\x04\xe7\xda\x53\x56\x40\xb6\xac\x3e\x49\xb5\x0c\xac\x24\xde\x33\x34\x28\x6d\xbe\xa0\xf6\x3f\xbb\x01\x92\xc6\xc6\x6a\x83\xdb\xf0\x62\xc9\xc7\xb5\x1b\xa5\x6c\x3f\xd3\xe9\x66\x2c\x64\x7d\x5a\x46\x09\xb6\xf2\x65\x05\xa0\x57\xef\x19\xfc\xa6\xc4\xd7\x85\x35\x78\xef\xaf\xf2\xb2\x9c\x70\x14\xb4\x4c\x81\x46\xbd\xb4\x22\x54\x5f\x2d\x58\xba\x0b\x6e\x47\x4c\x60\xad\x82\x10\xc3\x86\x6f\x59\x9e\x83\xde\x67\x79\xfe\x50\xbe\xf5\x1b\x53\x61\x46\xfe\xf0\xa3\xc0\x58\x2b\x6d\x64\x78\xd1\x55\xc1\xa5\xe6\x0e\x4c\xe3\x9d\xd8\xfc\x68\xd0\x98\x8d\x5b\xee\xfe\x35\xa8\xec\x24\x72\x92\xf8\xcd\x40\x53\xac\x9c\x76\x9f\xab\xb5\x03\x73\x5f\xac\xdf\x9e\xa4\xd2\x1b\x01\xe7\x90\xe9\xfe\xb8\x60\x98\x74\x2a\xea\x8f\xce\x9d\xad\xdf\xc9\x24\x09\x1a\xb7\xad\x74\x31\x10\x5f\x21\x10\x06\xc3\x53\x5d\xde\x97\xaf\x97\xf2\xa6\x93\xbb\x0b\x84\x1a\x6f\xe6\xe7\x88\x2b\xdd\xb2\xa0\x8e\x43\x91\xcf\x27\x65\x40\x38\xc1\x3a\xf5\x4e\x78\x6d\x71\x0a\x34\xd1\xda\xed\xbe\xcf\x9a\x36\x17\x59\x05\x87\x75\x79\x3a\x37\x70\x98\xb1\x84\x80\x0a\xc6\xc6\xb3\xd6\x16\xfe\x03\x6a\x08\x7b\x71\x3b\x0c\xdd\x0b\x51\x80\x4b\x39\x6e\xca\x6a\xff\x71\x9e\xb4\x25\x87\xa3\xb2\x30\x46\xce\xc3\xaa\x78\x7f\xcf\x7c\xa1\x1a\xc2\x38\x20\xbe\x19\xe4\xfd\xbd\x2f\x6c\x0a\xbb\x61\x8c\x8f\xe9\xac\x57\x48\x08\xfa\x5d\x7a\x0a\xa1\x4c\x90\x8f\x6c\x07\x7e\x77\x3d\x84\x4f\xcd\xe8\x28\x44\x94\x06\xf1\x18\x44\x33\x2e\x64\x40\x14\x69\xc1\x06\x18\x00\x3b\x0c\xc4\x04\x88\x74\x8a\x49\x8f\xa7\x34\x68\x4b\x5d\xe8\x37\x83\x0a\xc2\x41\xe8\x76\x31\xa1\x82\xc8\x00\xfa\xe1\x7f\x83\x8f\x2d\x9c\x73\xa1\x3e\xd3\x2d\x81\x98\xc6\x08\x65\x5f\x3f\x8e\xbd\x23\x28\xf0\xc4\x60\xae\xa4\xe1\xc7\x84\x3b\xe8\x36\x27\x41\x80\x12\x21\x59\xed\x5b\x97\x96\x6f\x33\x1b\x95\x10\xfc\x42\xd6\x1f\x12\xaa\xfb\xb6\xce\xd4\xe4\x37\x52\x23\x50\xe3\x64\xd7\xca\x11\x2e\x1d\x04\x35\xa9\xb2\x78\x0f\x63\x8d\x89\xe7\xc7\x15\x91\x4a\xc1\xc7\xf9\xaf\xd6\x4f\xca\x6f\xea\xb2\x74\x5c\x64\x91\x7c\xba\x7f\xbf\x20\xb2\x80\x50\x09\xb7\x55\x34\xd5\x56\x8b\xae\xa0\x14\x24\x09\x84\xe7\xcc\x5f\xb5\x85\x9e\x03\xfa\x40\x69\x93\x40\x6f\x95\x39\x60\x25\x41\x53\x89\x88\x00\x5d\xaa\x16\x71\x4b\xb3\x1d\xb5\x36\x48\x71\x7e\xb1\xf7\x24\x6f\xb2\x5d\xf6\x3c\x61\xd2\x80\x06\x15\x78\xa1\x9f\xa3\xa8\xb2\xe6\x03\x95\x6d\x2f\x94\x46\x00\x02\x11\x79\x10\x6d\x17\x31\x8f\xe0\xe6\x00\x4c\x20\xe8\xf9\xf1\x61\xd3\xff\xc9\x04\x09\xb8\x35\xf4\x4e\xa0\xdf\xed\x68\x3e\x33\x01\xb5\x85\xc9\x3e\x62\xe7\xbf\x85\x87\x2f\xbe\x53\x26\xe8\x42\x53\x37\xb3\x89\x4a\x7b\x63\xf2\x76\xa0\x6e\xce\x1a\x0f\x26\x50\x01\xba\x55\x8a\xe2\x19\xf2\xc7\xe2\x0e\x84\x86\x0a\x2d\x89\x26\x2c\x25\x13\xe8\x14\x63\x94\x4c\x95\x2b\xd9\xcd\xa9\x45\x3f\x99\x98\x40\x4b\x0c\x7d\x10\x83\xe0\x2d\xd5\xfd\x17\x4d\x87\x4f\x9a\xff\x7b\x9a\xac\xfe\x8b\xba\x8f\xdc\x10\xc6\x6d\x62\xf5\x26\xce\xdd\xe2\xe8\x8f\xcc\x14\x60\xf3\x79\x75\x7d\xbd\xdd\xec\x76\x13\x6c\xac\x61\x9a\xa3\x4c\x50\x05\x42\x1f\xac\xe7\x91\x5d\x10\x0e\xa5\x39\xf8\x65\xd1\x07\xed\x26\x24\x11\x7e\x98\xeb\xfd\x55\x29\x9a\x89\xbb\xf8\xe2\x3c\x62\xc2\x34\x00\x07\xaa\xcb\xa1\x3a\xf4\xc7\x49\x79\xec\x85\xff\xb1\xe5\xd4\x4d\x16\x3b\x55\xba\xf7\x99\xcc\xa0\x5a\x26\x34\x76\xd1\xdb\x43\xdd\x3c\x56\x17\xdc\x37\x13\x13\x91\xba\xe3\xf9\xe8\x0a\x71\x47\x38\x0b\x8f\xbf\x0c\x13\xc7\xb1\xb0\x06\xb3\x28\x3b\x69\x93\x28\x7f\x5a\x5c\x45\x98\x75\xdd\x64\xc5\x88\x0d\xe8\x36\x8a\x38\x46\xbc\x5f\x37\x9b\x55\x22\xab\xa1\x5a\x8b\x3c\xc7\xb4\xd0\x8f\x48\x24\x22\x96\x9e\x4a\x6f\x2b\xed\x37\x08\xdb\xf4\x5b\x97\x45\xdd\x54\xad\x6a\xca\x6a\x99\x5d\xef\xc6\xcb\x88\x25\x83\x6a\xfe\x8d\xe8\x76\xf8\x58\xd6\x80\x31\x32\x31\xe8\xf2\xb8\xcf\x8a\x8f\xaf\xed\x49\x5c\xc2\x42\x66\xe3\xc1\xca\x3b\xf7\x42\x4f\x30\x3c\x5e\x15\x84\xc9\xb8\x89\x84\x21\x2c\x16\xfd\x7a\x2e\xa2\x51\xd2\x60\xa9\xdc\xe5\xe6\xc8\x83\xaa\xc4\x09\x9a\x4f\x9a\x95\x46\x01\xf7\x5c\xe9\x27\x51\x35\xb5\xf3\xbe\xfe\x99\x35\xc7\xac\xd8\xa2\xe5\xd5\x2f\x83\x53\xa3\x03\x0b\xfa\xcd\xea\x7d\x95\x9d\x73\x70\x9d\xd1\xe9\x20\xa0\xb6\x0f\xfe\x0c\xcd\x4d\x89\x9a\xd5\x73\x26\xbd\x01\xc6\x30\x72\x78\xda\x6e\xd0\xe2\xac\xaf\x80\x1a\x90\x10\xa6\xbe\x50\x37\x6d\xbc\x77\xdb\x4c\x34\x32\x03\x6f\x91\x06\x31\xfd\x71\x13\x18\x0c\x6b\x1e\xe0\xcd\x22\x46\x47\x6a\x42\xd3\x27\x6b\x18\x43\x92\xda\x7f\xda\xd3\x79\x7e\x10\x2e\x98\xd5\xef\xff\x4f\x5b\x7b\x56\xc1\xba\x2f\xe4\xcc\xaf\xc6\x28\x6e\x6d\x0c\xbb\x7c\xe5\x93\x06\xa7\x31\x46\xc7\x7e\x2a\x46\xe0\xc1\x7c\x39\x61\x41\x90\xc6\x56\x6c\xd9\xe5\x3e\x59\x59\x74\xf9\x86\x4b\xaf\xfb\xe9\xdf\x85\x12\x2c\x20\x9c\x06\x83\xa7\xcd\xaa\xae\x4b\xd5\xc5\x2a\xda\x87\xe3\xbf\x9a\x5b\x59\x40\x79\xe4\x23\xe0\xc7\xb7\x7e\xf6\x63\x01\x15\x61\x24\xc7\xde\x27\xbb\xa6\x3c\x9f\x47\xdb\x0d\x47\x10\xe5\xb9\x2c\xf3\x49\xa9\x84\x05\x2c\xb2\x7d\xa3\x1f\xdf\x9f\xac\xca\xb0\xb7\xb1\xdb\xdf\x6e\xb6\xac\x1f\x95\x10\x99\x7a\x26\x41\x9e\xaf\xcb\xb6\xaa\xe7\xb7\x82\x29\x0b\xf7\xb7\xb2\xc3\x88\xc6\xdc\x97\x9e\x8d\x53\xf7\x47\x52\x11\x13\xd3\x5c\x76\xff\x56\x62\x5f\xd8\x8d\x08\x25\x43\x27\x06\xfb\xf9\x6a\x67\xa6\x3b\x7a\x0f\x58\x10\x1a\xa3\x7a\x03\x70\xb8\x5d\x6f\x16\xe3\x30\x16\x44\xa9\xc2\x77\x5f\xb6\x1f\x2e\x6a\x1b\xa3\x69\xdc\xa0\x38\x61\x68\xa4\xf6\xb4\xbd\xfd\xb1\xda\x6f\x0e\x73\x06\x04\x0b\x62\x25\x53\xdf\xcb\xbd\x86\xd7\x31\x95\x9b\x05\x9c\x44\x3e\x24\x7e\x68\x4f\xee\xb9\x7f\xaf\x41\xdf\x0c\xd8\xea\x5f\x3f\x55\x4e\x12\x44\x27\x35\x50\x37\xb7\x0e\xe4\x5b\xf5\x87\xe7\x8a\x78\x51\x92\xf7\xf3\x0c\x24\xc6\x02\x6e\x62\x39\xbe\x9d\x3f\x65\xf3\xb9\xe2\x18\x0b\x12\x0a\xa9\xa7\xbb\x43\xf5\xd8\x36\xe7\xb6\x59\x35\x5d\x7e\x34\x3d\xa5\xc4\x44\xf8\x42\x19\x91\xe7\x52\xa8\x97\x8b\x2b\x98\x1e\x56\xa4\x56\xd6\xcb\x33\x3b\x91\xe9\xba\x3e\x8a\xa2\x80\x0b\x4c\xcf\x6c\x57\x19\xc4\xd6\x15\x24\xb7\x66\x1b\xcd\xe4\xe6\x4a\x92\x50\x70\x77\xfe\xc7\xc3\x66\xff\xc9\x65\xc9\x24\xc1\xda\xc9\x49\xbc\x3b\x6c\xc6\x13\x54\x36\xf2\xee\x8f\xa4\xac\x2a\x3a\xe6\xa1\xdd\xec\x89\x97\xe4\x4c\x0c\xc2\xc0\x8f\x32\xa1\xb6\xd6\xd7\x1a\x36\x79\xf6\x9c\xc9\xe1\x4b\x51\xdd\xff\xf9\xea\x70\x17\xb2\x2e\x27\xcf\x2c\xd0\x01\x20\x99\xf7\x7c\xcc\x86\xbc\x94\x05\x5a\x18\x3c\xf6\xc1\x26\x4f\xcd\x87\xcf\x28\x71\x9e\x9b\x5e\x90\x36\x04\x95\xfb\xf2\xf2\xb9\x37\x9f\x5e\xbe\x74\x6d\x22\xb4\x3d\xfa\x3f\xab\x5b\xff\x43\xa0\x03\xe4\xa6\x7c\x81\xe6\xad\x1e\xec\x3a\xdc\x56\x13\x5a\xc6\x96\xd3\x55\xdf\xde\x4e\x3e\x2d\x12\xd0\x44\xdb\xf8\xbb\x46\x2a\x89\x2b\x18\xd4\x8b\x52\x1e\x8c\x04\x11\x41\x0a\x5c\x03\xe2\x64\x0b\x75\x63\xa3\x81\x6e\x3b\xc3\xea\xff\xc3\xc3\xbe\xff\x93\x4c\x11\x97\x61\x9d\x5b\x50\x2d\xfc\xb2\x18\xbe\xa4\x4f\xc3\x08\xd1\x41\x98\x8e\xe9\x4e\xb3\x2e\x28\x23\x54\x87\x71\xe2\x5e\x98\xa7\x5f\x7c\x09\x84\x1a\x83\x39\x4c\xaf\x50\xfd\xb9\x0b\xd6\xff\xdf\x7f\xdd\x2f\x85\x94\x0a\x35\x2e\x8f\xcd\xe4\x01\x66\xa3\x99\x81\x68\x40\xad\xac\xc5\xf9\xb3\x81\x91\xed\xef\x1d\xda\xe2\x2c\xd4\xcb\xaa\x69\x84\x7a\xc1\x60\xa2\x9e\xdd\x93\x30\x4e\xb0\xcd\x79\x86\xe7\xcd\xfe\xeb\xf7\xdd\xf5\x6c\x7b\xc4\x12\xe6\x0b\x1f\xd9\x7b\x97\x72\xda\xee\xce\x62\x57\x67\xfa\xae\x93\x28\x64\x4e\xd1\x7d\xdc\xd9\xf0\x1b\x23\x8a\xa5\xda\x3f\xdb\x7c\x0a\x36\xfe\x1d\x99\x94\x91\x28\xa5\xc2\xd9\x96\xff\x35\x92\x27\x66\x24\x12\x01\xd6\xb2\xbe\x6d\xfb\x17\x2a\x4e\x7d\x7d\x13\x01\x75\xf3\x5f\xf8\x57\xf8\x6f\x3f\x50\x59\x05\x69\xfb\xea\xf7\x0c\x98\xe9\xdc\x47\x38\xe3\x3c\x1c\x9a\x82\xfb\x63\x05\xf5\xb1\x07\xc0\x32\xc2\xc3\x18\x1b\x9f\x96\xaa\xfc\x15\x44\xd5\x1c\x77\x4d\x2f\x51\xc7\x08\x8f\xa8\x0a\x26\x40\x86\xea\x9f\xa5\x9c\x3e\xf0\xc4\x8d\x4d\xa8\xb5\xb2\x7e\x06\x04\xca\x5c\x36\x51\x19\x49\x89\x61\xc4\xe5\x18\x3f\x21\x37\x83\xf5\xd8\x7c\x20\x55\xbe\xcc\xa7\xda\xaa\x7a\x68\x4f\x8f\xc6\x2d\x7b\x7e\x42\x25\x69\x4c\x12\x77\x5f\x57\x79\x7e\xff\xe1\x5a\x96\xb7\x7a\x18\x91\xa4\xf8\x61\xec\xab\xb2\xf8\x32\xba\xec\x54\x04\xd8\x46\x40\x49\x98\x34\x99\xff\x36\x58\xda\x94\xe8\x82\xc7\xb1\xea\xbb\xdf\x5d\x04\x29\xc2\x86\x1f\xab\xf3\x11\xda\x7a\x5b\x7e\x88\x7c\x97\x89\xd3\x56\x64\xf9\x9b\xf8\xe8\x7f\x5e\x68\xae\x9d\xb2\x21\xfc\xd5\x4b\xb9\xb8\x8d\x92\xa6\x48\x8f\xfa\xb2\xba\xdf\xcc\xe0\x51\x8c\x48\x49\xb1\x4a\xf3\xe7\x66\xdc\xd5\xeb\xfe\x9e\xa0\xb8\xc5\xd9\xae\x0c\xfb\x72\x2f\x5e\x60\x55\x6f\x7b\x08\x3d\x23\x2a\x90\xb1\x6d\x4f\x58\x7a\xe3\xe9\x9c\x43\x33\x6c\x8d\x28\x46\xbe\x0e\x26\xb0\x73\xe9\xc9\xda\xa2\x84\x10\xaa\xe0\x47\xc6\x49\xe4\x80\xd9\xdd\xbb\x8e\x4f\xd3\x7e\xed\xde\xfb\xd2\x0f\x84\xd4\xbb\x40\x78\xef\x93\x2f\x55\xd9\x9e\xeb\x61\x80\xc4\xef\xca\x4b\x83\xae\x9a\x06\x0a\x0d\xc3\x83\xd4\x81\xa5\xdf\xe0\x87\x75\xd3\x16\xfa\x7a\xf5\xf8\xc7\x67\xc4\x2f\x46\x34\x0b\x52\xa7\x41\xe5\xa8\xab\x43\x74\x32\x7d\xfd\x35\x13\x56\x18\x4f\x7c\xcc\x83\x37\xa2\x19\x60\x66\xd5\xad\xb3\xad\xcc\x33\x35\x54\x10\x18\x81\x20\xc2\x20\xf3\x7f\xdb\x4c\xbd\xac\xcb\xe2\x15\xaa\xde\x4c\x8d\x11\x88\xa1\xc7\xc3\xd9\x5b\xb2\x2f\x77\x56\x02\x6c\x76\x02\x86\x45\x6c\x50\x2c\xb9\x2a\x17\x95\x8d\x19\xe9\xd6\x3d\xdd\x1b\x33\x77\x27\x32\x53\xfd\xf6\xe3\x84\xad\x2e\x78\xf5\xc2\xf1\x6d\xa1\x01\x21\x88\xfb\x6a\x0b\x6c\x4f\x43\x17\xbb\x6f\x41\xc1\x39\x83\xa2\x19\x89\x3d\x31\x1a\x84\x29\xd6\xf8\x95\x6d\x2d\x8d\x30\x26\x57\x1f\xf7\xa0\x33\xd1\x94\xd5\x45\x7a\x40\x03\xc5\x29\x9f\x5a\xf4\x75\xbb\x5c\x0e\x24\x01\x60\x3d\xd8\x79\x20\x8e\xea\x85\x8c\x92\xc4\x3a\x6b\x63\x9f\x60\x2a\x90\xee\x47\x68\x65\x45\xa4\x8f\xe5\xdb\xc8\x55\xe4\x27\x64\xb3\x81\x94\x12\x44\xe5\x1c\x0a\x78\xdb\xc2\xd9\x0b\x72\x4f\x27\x5f\xca\x38\xd7\xce\xd6\x0c\x5e\xcb\xcc\x0a\xf3\xcb\x45\x9b\x82\x8b\x3d\x2d\x38\xd3\x99\x32\xd9\x88\xc0\xc1\x3a\xa6\x17\x1c\xd2\x18\xb1\x59\x0e\x12\x33\xfe\x62\x69\x18\x07\xd8\xdb\x77\xf7\x7a\xd7\x88\x17\xb8\xe4\xfb\xce\x8e\x27\x62\x04\xa3\xfa\xa2\xcb\xae\xcc\x75\xf6\x19\xe5\x8d\xd1\x48\x00\x06\xfd\x12\xf2\xb2\x78\xae\xf7\xe5\x05\xa2\x9d\x21\xe7\x5b\x0f\x4b\xf1\x60\x1a\xed\xb6\x27\x4c\x27\xac\xd7\xa2\x15\x85\x5e\x24\x72\x30\x9a\xc4\x76\xa5\x86\x57\xa8\x3e\x48\xe4\xaf\x32\x65\x91\xf6\xf5\xbb\xf6\x03\x2b\x2a\xdd\x12\x50\x5f\x7d\x5c\x28\x60\x33\x9a\x42\x88\x2a\xe3\xe8\xac\xea\x3e\x88\x4f\x34\xa9\x67\x8f\x44\x78\x2e\x01\xce\xf8\x3b\x74\x3b\xa9\x6f\x4a\x5b\x9d\xf8\x63\x3e\x56\xf1\xc1\x39\x66\x5d\xbe\xcc\x4f\x43\x44\x81\xe9\xf3\xc0\x8b\x67\x2a\x62\x0b\xac\x6e\xca\xef\x59\xd1\x4c\xbf\x34\x91\x24\x02\x06\xe8\x88\x97\xc3\xb9\xce\x9e\xa1\xbe\x90\x6a\xef\xf7\x01\x8b\xe0\x2d\x4f\x70\x8f\xd8\x38\xf2\x3b\xc1\x18\xbf\x67\x6a\x0d\xd7\x75\x79\x40\x56\xc0\xa1\xf9\x45\xcc\x45\x85\x10\x89\x2b\xd7\x3f\x88\x13\xfc\xac\xb2\x06\xd9\xd7\xd3\xc7\x2d\x93\x38\xe9\xed\x1a\xca\xca\x4d\xa3\xdd\xd4\xdb\xe3\xdc\x7f\x99\x25\x51\xb4\x87\x71\x65\x36\xef\x5b\x31\x9b\xd5\xa8\x52\x31\x26\xd1\x96\xd2\x79\x53\x56\x84\x3a\xbf\xc9\x5f\xa6\x51\x54\x81\x24\xe1\x48\xc1\xe9\x76\x9c\x7e\x2e\x86\x6e\x54\x27\x09\x96\x40\xec\xf2\xe3\xe0\x2c\x0b\xca\x3d\x8c\xea\x34\xf4\x5a\xa9\xa6\x74\x73\xdf\x7f\x47\xaa\x65\x54\x03\x30\xd1\x9b\x23\x1f\x10\xbd\x77\x10\xa7\xf1\xfc\x06\x24\x46\xca\xf8\x76\xf3\x3f\xdf\x37\xbb\xfd\x61\xbd\x7a\x58\x6f\xee\x36\xd7\x87\xab\xbf\x0e\x77\x9b\x87\xeb\xcd\xf6\xb0\xdb\xaf\xf6\xdf\x77\xfd\x0e\x54\x62\xdf\x11\xc1\xe9\x28\x68\xbe\xc5\xb5\x42\xcf\x6e\x26\x40\x94\x12\x57\xfa\x72\x16\x23\xd6\x8f\xed\xb3\x4f\xe6\x93\x07\x67\xe2\x34\xf4\x12\xff\xc5\x33\x2a\x84\xb7\x17\x61\xf9\x7c\x1f\x19\x81\xf0\x20\xea\xb7\xde\xba\x7a\x4c\x6c\x62\xd4\x98\x10\x4f\xb0\x5b\x08\x7b\x09\x4b\xb7\x11\x73\x2b\x3e\xd2\xd9\xb4\xab\xe6\x35\x52\x2d\xec\xbb\x73\xd7\x4f\x99\x8c\x44\x12\xc5\x03\x36\xa2\x76\xcb\x36\xf5\x13\x0d\xa3\x49\x82\x48\xb9\x6e\x71\x5b\x39\x85\x9c\x71\xcf\x81\xb1\x6e\xae\xc3\x1a\xc6\x31\x43\x40\xcb\xa0\xd2\xd3\x6d\xe3\xcc\xa1\x79\x1e\xe0\xbd\x59\xa4\x2c\x2f\xde\x02\xc6\x62\x15\x8c\x35\xc3\xbc\x4e\xdf\x6e\x54\xf8\x9e\x81\xcf\x19\x0b\x03\x6b\xd1\x7c\x57\x22\x52\x0c\x46\xb6\xfe\x89\x1f\x12\x5a\x68\xb4\x7b\xad\xf7\x16\x06\x32\xff\x5e\x59\x08\xb6\xd3\x73\x16\x1f\x57\x1f\x9b\x4a\xd1\xe0\x8f\xd9\x4f\x81\x48\x8c\x77\x7d\x6e\x60\xa5\xbb\x88\x25\xab\x11\x35\x77\xd1\x3c\x64\x2c\x0a\x2d\x86\xe5\x70\x76\x91\x89\xf5\x60\x9c\x8f\x32\x36\xf9\xde\x7e\xfb\x32\x5e\xd3\x58\x9c\x32\x6e\xad\x40\x27\x82\xd9\xd3\x6f\x92\xc5\xa9\x0c\xb4\x87\xd6\xcc\x8c\xa3\x97\x6f\x72\x0c\x1c\xa3\xde\x87\x52\x42\x3e\xf9\xc5\x24\x90\xdc\xa5\x03\xd7\x60\xa0\xa8\x2f\xe4\x38\x67\x87\x4a\x48\x62\xfa\x94\xb8\xc4\x8e\x83\x9b\x41\x68\x7f\x4c\x9a\x70\x97\x3e\x7c\xdf\x5d\x8f\x08\xb8\x8c\x25\x69\x80\xf8\x60\xcc\x01\x1f\xe0\xed\xb6\x71\x53\x9c\x1f\x90\x52\x83\xc5\xcb\xa7\xed\x7a\x4f\x82\xe0\xb0\x3d\xec\x37\xab\x7b\xbf\x55\x84\x0a\x3d\xcd\x5c\x79\xf2\x57\xa6\x19\x8c\x89\x48\xa2\xad\xed\xf6\x6e\xfd\x34\xe2\x3c\x32\x26\xe2\x18\x06\x55\x2b\x3c\xbf\xcd\xf5\xe6\xcf\xd9\x33\x12\x89\x95\xe0\xb2\xe5\xaa\xaf\x90\x6b\x0b\x61\xf2\x9b\x05\xb7\x1e\x07\xa8\x36\x72\x95\xe9\xc9\x4a\xc6\x84\x61\x11\xbe\x07\xcf\x88\x6a\xbd\xb0\x43\xfd\xe4\x41\x49\x1e\xa3\xc8\x6f\xd5\x65\x1f\x63\x30\x17\x63\x52\x02\x46\xce\x77\xc3\xed\x50\x06\xb0\x2f\xf1\xad\xcc\x5f\x8e\xe2\x12\x58\xc1\x98\x96\x1c\x55\x24\x0e\x8e\x2b\xec\xcc\x33\xca\xb6\x2a\xc4\xa9\xd7\x36\x67\x4c\x9b\xd0\x6b\x6b\x62\x46\xb8\xcd\xd4\x8b\x25\xe3\xf4\xbf\x0f\xc4\x6a\x95\x5d\xed\xef\xd7\xfd\xdf\xc2\x40\xb0\x41\x0a\x78\x64\xd1\x37\x9c\x02\x84\x69\x68\xdb\xc4\x06\x75\x32\xcb\x62\xf6\x09\x1a\x69\x35\xa9\xcf\x55\x39\xe8\xd2\xb0\x30\x60\xda\x9a\x92\x14\xfa\x07\xf2\x24\xfa\x0d\x11\xb5\x9a\x43\xd6\x9f\x71\xf6\x7b\x21\x09\x18\x76\xf9\xf7\x50\x37\x23\x85\x2b\x16\x12\x99\x9a\xd8\x63\x4c\x3d\xc2\x69\xdc\xd1\xef\xbb\xe3\x2c\x64\x81\xc4\x1c\x12\x55\xe0\x91\xa9\x7f\x87\xa4\xa0\x79\x9d\xcd\x0f\x0f\x93\x84\xcd\x18\xdd\xfd\x3a\x37\x3a\x2a\x07\xec\xf8\xbb\x1c\x51\x5b\xe9\xfc\xe9\xa1\xc2\xc0\x36\x59\x46\x16\x70\xd3\x17\x21\x0c\x53\x2a\xf8\xc8\x67\xb3\xbe\xfa\x78\x3c\x4f\xc2\x84\x25\x78\x1d\x0b\x43\xa9\xf0\x05\xfa\x5a\x16\xdd\xf2\x50\x3f\x40\xf3\x56\x56\x2f\x78\x8c\x9f\x59\x05\xec\x8f\xd1\x40\xb4\x02\xdb\xac\xee\x86\x92\x8c\xdf\xa8\x34\x36\xa7\x4b\x63\xa0\x72\xbf\x6b\xf3\xb8\x7a\x4e\x28\x67\x61\x94\x24\xd2\xc6\xe8\x28\x79\x7e\x0d\xd0\x97\x10\xc2\x28\xd1\x98\x8e\x28\x91\xe7\x5b\x50\x19\x66\x53\x9f\xae\xb9\x93\xa8\xc1\xff\xff\xe1\xce\x46\x32\x42\x53\xb9\x43\xdd\xca\x6b\x91\x2d\xc2\xca\x58\x18\xa9\xc8\x9a\xe7\x95\x3b\x61\x60\x07\xc5\x32\xb7\x8e\x85\x31\x4d\xf0\xdc\x9e\x6e\xd6\xb3\x2b\xe2\x71\x68\x19\x0b\xe2\x65\x30\x3e\x41\x7a\xd3\x2f\xea\x88\x21\x37\x40\x1c\x2d\x62\xbd\xd9\x87\x0b\x5c\x7a\xff\x35\x84\x29\xb5\x4a\x64\x57\xab\xdd\x06\x6d\x21\x0f\xfb\xc7\xc3\xfa\xf1\xf1\x9b\xbf\x6f\x82\xda\xde\x88\x12\x95\xbe\x11\x0a\x5e\x7b\xa2\xbb\x5b\xfa\x42\x19\x0b\x97\x45\xa3\xbd\xe8\x3c\xac\x19\xdd\x36\x29\x18\xa4\x63\x4d\x8f\x53\x76\x59\x43\x9e\x5d\x8b\x0a\x12\xac\x3d\xc2\x3b\xa8\xb6\x97\x50\x63\xa1\xa2\x1c\x85\x12\x67\x14\x3f\x16\xaa\x30\x74\x21\x8a\xb5\xaf\xc0\x76\xee\x28\xfa\x0b\x55\x6c\xad\xf9\xac\x0b\x05\x8c\xf5\x63\xdc\x08\xed\xc2\x8b\xfb\xd5\x9f\x87\xf5\xe3\xfd\xfd\xed\xc0\x7b\x3b\xdc\x3e\x1c\x76\x9b\xf5\xe3\x83\xa7\x0c\xb3\x50\x0b\xc2\x2d\x57\xe0\xaa\xad\x86\x06\x58\xa8\x25\xb1\xd5\x90\x9d\xd7\xa8\x9a\x06\x53\xa1\xd6\x04\xe1\x97\xae\x08\x74\xa8\x40\xbb\x6a\x81\x1f\x00\x94\x5a\x3a\x43\xf1\x0d\x3e\xea\x2d\x2c\xdb\x5c\x77\x03\xa5\x1a\x8c\x95\x6d\x93\xe1\x67\xf6\xd9\xeb\x01\x31\x20\x94\xef\xb1\xc8\x3f\x46\x93\xcd\x85\x1f\xb3\x1f\x6e\x52\x61\xe6\xd1\xb2\x6e\x27\x0b\x69\x68\x88\xc1\xd0\xf2\xbb\x2b\x5a\xb8\x98\xfd\xd7\xcf\xd6\xc4\xd2\x6b\xc5\x3e\x55\x3d\x7c\x92\x85\x86\x27\x56\xee\xd4\x3a\x11\xc2\xe4\x5d\xbf\xe0\x2a\x8e\x5a\x99\xa1\x49\x62\x54\x81\xfe\x51\x8e\x17\x6a\x6c\x66\x2c\x10\x68\x58\x68\x64\xa4\xec\xdb\x5d\x94\x45\xf6\x37\xe8\xbe\xf3\x3d\x60\xdc\x58\x14\x04\x3c\xb4\x5d\x44\xd3\x16\xfa\xae\x54\x2f\xa3\x60\x34\x0a\x88\x31\x56\xda\x53\x83\xf3\x53\x59\x9e\x10\xa2\x80\x46\xd8\x37\xb3\xc6\xb1\x9b\xe6\xe8\xb3\xe5\xc5\xdb\x13\x05\x89\x8e\x92\xfe\x67\xbd\xa0\xe3\xec\x90\xd2\x45\x1d\x65\xad\x84\xe5\x3d\xb6\x9f\xc2\x10\x58\x44\x18\x61\x56\xa9\xb4\x5b\xfb\xf0\x5c\x2f\xea\x3e\x11\x31\xda\x53\xf8\xbf\x88\x1a\x03\x96\x27\xd5\x3c\x1a\xeb\xb5\xd8\x2e\x0c\xf7\x25\x89\x2b\xd1\xa8\xa3\x6b\xe6\x7f\x06\x5d\x63\x11\x25\xd2\xfa\x4c\x97\xf9\xcb\xa0\xea\xce\x22\xaa\x05\xb8\xe0\xd0\xa6\x02\xa3\x32\x66\x44\x8d\x44\x7a\x27\xa6\xce\xd6\x54\x20\x2b\x9e\x17\x61\xde\x6e\x0f\x26\x92\x74\x90\x73\xb1\xf2\x65\xcb\x21\x6e\xc4\x14\x45\x4e\x50\x5b\xa0\x84\x96\x25\xc9\x0f\xab\x50\xc4\xb4\x44\x89\x04\x6c\x20\x3f\xe5\x6d\x3d\x08\x9d\xb1\x28\xa4\xca\xce\x44\x96\xc6\xfe\x0c\xdf\xcf\x7f\x2c\x3e\xcf\x30\xb1\x86\xeb\x35\xa0\x32\xf7\xeb\x72\xd9\x2d\x8a\x02\xab\x6d\x67\x75\x01\x46\x70\x3a\xbf\x5d\x92\x00\x41\xd9\x0f\x99\x82\x2f\xed\x47\xff\x77\x10\x9e\x2f\xba\x69\x8e\xd8\x27\x70\x22\x90\xf6\x6e\x2e\xa2\x4d\x58\xc4\x43\x5b\x3e\x39\x8b\xaa\x29\xa0\xa2\x87\x2e\x54\xf3\xc7\xe4\xb1\xe5\x01\xd6\x4e\xb7\xbd\xfe\xc4\x63\x8a\x45\x9c\x5b\x4b\x4e\x34\xe1\x9a\x39\xaa\x0c\xdf\xeb\xb0\x18\x44\x3c\x49\x51\x2c\x0b\x2b\x71\xfe\xf7\x92\x50\x27\xde\x1e\x5c\xbc\x4f\xfa\xf5\xfd\x10\x65\x6d\x03\xb3\xda\x8a\x18\x8e\x5c\x4b\x58\x94\x0a\x2a\xc2\x11\x97\x62\x52\xf5\x5f\x7e\x4d\x44\xa8\x51\x99\xf7\xba\x95\x22\xfb\x52\x01\x14\x58\x63\x5d\x1f\xc5\xf0\x88\x55\xe0\x48\x14\x9e\x3d\x52\xb6\xd5\x48\x8d\xca\x8f\x62\x14\x6b\x29\x45\xf9\xda\x9e\xa6\x51\x54\xa4\x84\xc4\x22\x64\x9e\x35\xcd\x3a\xef\x62\x8f\xdb\xfe\x81\x6a\x62\xb9\x0b\xdb\x0d\xda\x33\x4f\x8c\x95\x59\xa4\x95\x49\x5d\x37\xa6\x0f\xd2\xfa\xc3\x02\xb1\x08\xb9\xfb\xdd\x66\x3b\x9d\x79\x96\xbe\x7e\x30\x36\x8f\xed\x0e\x55\x65\x8d\x2d\xed\x35\xe2\x74\x9e\x5d\x88\x09\x2d\x15\x61\x0c\x9e\x3f\x95\x95\xce\x44\xee\xf2\xe5\x6c\x54\x58\xfa\xaf\x52\x8d\x38\xa0\x56\xb4\x4a\x43\xb7\x3a\xf9\x82\xff\x12\xbe\x88\xa1\xf4\x57\xe0\x30\xf7\x4b\x6a\x8a\xb3\xd1\x2a\xb6\xa5\x84\xac\x69\x3e\x2e\x3a\xd3\x93\x97\x3d\x26\x91\x95\xcc\xa8\xa1\x39\x88\x5f\xa0\xcd\x59\xcc\xe2\x60\x50\xbf\x74\x10\x6a\x16\x87\x8c\x01\x9d\x44\x30\xe5\x75\xd5\x3e\xff\x57\x76\xa3\x2c\x0e\x23\x1e\xa5\xa3\xb7\xd3\xca\xd4\xa8\xe6\x27\x7c\xb6\x06\xc4\x5d\xfc\xa5\xbd\xec\x6e\x7d\x5c\xc2\xd2\xb1\x38\x0a\xac\x39\xbf\x16\x85\x73\x30\xb1\x65\x95\xf1\x1b\x18\x47\x9c\x6a\x47\x45\xd9\x14\x7a\x5e\x27\x8d\x23\x6e\x52\xef\x61\x57\xbe\x0f\x16\x18\xbd\x31\xad\x1f\x27\x62\xfc\x5c\x0e\x35\x34\xdb\xac\x7e\xe9\x17\xcc\x4f\xaa\xda\x71\xa4\xc3\xfe\x61\xfe\xcc\x74\xdf\x86\x8f\xe3\x20\x04\x7b\x69\x73\xa1\x57\x16\xc7\x34\xa2\x96\xfb\xd3\x1b\xf0\x2e\x2a\xbf\xf9\xe1\x8c\x62\x3c\x7e\xab\xca\xc1\xac\x8e\xc5\xb1\x24\x68\xa6\x76\xd5\xe6\x2f\xe3\x32\x44\xcc\x63\x11\x58\x30\x6d\xf1\x0c\x3f\x8f\x99\x73\x4c\xf5\x4f\x6f\x98\xa5\x62\x0e\x8a\x0c\x1c\xa9\x55\xab\xb3\x31\xd2\x6f\xf9\x85\x4c\x82\x00\x35\x10\x6f\x35\x14\x4d\xd6\x7c\x58\x44\xd0\x6f\x0b\x7c\x7e\x6f\x12\x20\xd8\xf8\x54\x16\x5d\xf8\x7a\x38\x9e\x67\x4f\x2a\x21\xc0\x06\xfb\xcf\xc3\x99\xcd\xb7\x53\x6b\xc6\xd2\x64\x27\x38\x40\xa1\x0f\xa3\x7c\x2a\x4e\x22\xab\xf0\x2f\x33\xfd\x58\xfc\x2c\x0b\x3d\xdc\xf3\x24\xb2\x8e\xc2\x42\x6b\x4f\x14\x9b\xc6\x4c\x93\xc9\x24\x4e\x52\xcb\x79\x6a\xa0\x6e\x5c\x75\x66\x07\xcd\x43\xd9\x38\x23\xcc\x6e\xcd\x7a\x28\xc7\x9c\x19\x16\x27\x92\x60\x67\x59\x67\xb5\x6c\x2b\x5b\xd5\xf2\xdb\xd2\x84\x98\x70\x84\xa3\x78\x10\xea\x01\x1a\xb3\x85\xa1\xf4\xb3\x1c\x56\xc5\xa9\x0a\x94\x63\xdd\x3a\x00\x63\x56\x16\x5d\xc8\x8d\x46\xb7\x17\xf4\xf2\x65\x08\xc1\xf4\x8b\x12\x5c\x86\xd1\xa0\x0e\x85\x52\xe4\x9b\xe6\x68\x5d\x90\x76\x22\xd7\x53\x26\x38\x8b\x85\x4e\xd0\x9c\x44\x43\x0e\x68\xc9\x53\xcd\x9e\x8a\x30\xa1\x6f\xaa\x5b\x43\x1a\x7f\xdd\x2a\x20\x91\xfb\xa9\xc3\x39\x17\x05\x34\x87\xec\x22\x25\x89\x55\x90\x82\x17\x2a\x40\x45\x1b\xdd\x25\x3e\xf3\x70\x30\x56\x0a\xb0\x53\xed\x52\xfe\x3e\x08\x23\xf1\xbf\x3f\x79\x59\x35\x30\x24\xa9\x7b\x8f\xd8\xfe\xbc\x34\x44\x98\xbe\xd4\xa7\x2e\x7a\x40\xd0\x0d\x76\x22\xfc\x76\x88\x2d\x28\xe4\x4f\x95\xb7\x75\xf6\x3a\x72\x44\x63\x31\xa4\x11\x4e\x12\xbb\x1f\x77\xfe\x4f\xc6\x90\xb8\xd7\xf2\x47\x0f\x67\x0b\x4c\x1c\x7f\x96\xc6\x18\xcc\x77\xc4\xab\xc8\xf2\xee\xfd\xf1\x85\x86\xc9\x29\xf3\x20\xe6\xa8\xb2\xa5\xcb\x62\x64\x8a\xe7\x37\xca\x00\xf1\xcc\x57\x63\x8f\x36\xc6\x03\x65\x3b\xb3\xb5\x6b\x94\x3f\x8c\x81\xce\xe3\xf7\x9a\x07\x3a\xc1\x4a\xdb\xe6\xfd\x2c\x0a\x2d\x0a\xed\x6c\xbd\x67\x27\x41\x03\x6a\x97\xe5\xec\x15\x5f\xb4\x47\x63\xfc\x6f\x51\x67\x7a\xde\x25\x98\x0e\x73\xdf\x8d\x58\x9e\x1f\x39\xa5\x12\x93\xf5\x55\xdb\x94\xbb\x5e\x7b\x91\x71\x16\x5b\x2d\xb1\x43\x7d\xcc\x4c\xb3\x1d\x5b\x3f\xcf\x8e\xc0\x78\x10\x0d\xca\xdd\x2e\xc9\x1c\x4b\xd1\x32\xce\x54\x00\xde\xd4\xb6\x11\x95\xf5\x27\x1b\x17\x02\x78\x44\x38\x42\xe4\x4f\xd6\xfa\xe7\xd7\x88\x20\x1e\x49\x91\x78\x15\x2e\xf1\x2a\x9e\x84\x7a\x81\x66\xff\x71\x86\x63\x4f\x5e\x62\x3c\x52\x14\xcc\x08\x67\xbb\x14\x7e\xf2\x98\xa6\xc8\x1e\x81\xe6\x88\x10\x6c\x1f\x15\x71\x9e\x52\x19\x39\x0f\xbf\xee\x7c\x76\xa0\xda\x2a\x73\xcc\x98\x65\x55\x96\x61\xde\xe6\x09\x4f\xe2\x11\x8b\xde\x7a\xdf\x5e\x14\x2c\x79\x22\x12\x66\x5b\x14\x55\x73\x1c\xbf\x8b\x3c\x01\xe1\x8d\x64\x90\x54\x33\xdb\xcf\x10\xcc\x89\x6d\x8f\x67\x35\x3c\xb5\x34\x21\xc8\xf6\x38\x89\xf7\x9b\xec\xdd\x7b\x5e\xf4\x5b\x53\x02\x6c\x04\x33\xdb\x14\x8b\xca\x1a\x8c\x8b\x98\xa3\x41\x9a\x40\x5a\xfe\xfd\x45\xd9\x91\x8b\x18\x90\xfb\x8b\x66\xde\x15\x39\x9c\xdd\x11\xfd\x2f\x89\x84\xb9\xd2\x81\x85\xe3\xa3\xda\xd0\xcc\x94\x75\xfa\x20\x64\x20\xac\xca\x42\xa9\x91\xbb\x8f\x22\x58\x13\x68\xf4\xec\x1d\x90\xca\xda\x07\x58\x6e\xf4\xf5\x20\x4c\xcc\xb8\x92\xd6\xc3\xd5\x31\x81\xeb\xdf\xb0\x99\x18\x57\x5a\x19\x6b\x7e\x77\x9d\xd5\xe7\xb6\xe9\xd2\xb5\xb2\xfa\xd8\x82\x18\x65\xf1\x8b\x2f\xbf\x26\x0a\xf1\x53\x8d\xc3\x6f\xa0\x1a\xc2\x6c\x48\x22\xb0\x83\x9c\x15\x1a\xde\xb7\xd0\x45\xaf\x3e\x44\xe0\x3a\x0d\xac\x8e\xc2\x20\xc3\x99\xf8\x4d\x92\x46\x16\xa4\xfe\x50\x36\xff\x07\xaa\x72\x89\xaf\xce\xb8\x36\xca\xc2\x52\xb3\x3c\xb7\x44\x86\xe5\xdb\x05\xdc\xf2\xbc\x06\xc5\x23\x8f\x7a\x9e\x3e\x07\xe0\xa1\xea\x9d\x2e\xfc\x6c\xcc\x21\x51\xa8\x6a\xda\xad\x1c\x9b\xf7\x73\x59\xf5\x7e\xc9\xc3\x17\x63\xba\xff\xb3\x0e\x82\xae\x06\x77\xfb\xa9\xa2\xa4\xdf\xc5\x09\x2f\xd6\xc7\x0b\x26\xbc\x1d\x91\x04\x01\x45\x46\xcf\x4a\x6b\x2b\xa5\x33\x83\x67\x5c\x96\x4c\x47\xc8\xd1\xd1\x17\x99\x04\x81\xc1\xa5\xc9\x91\xb9\x2f\xa5\x77\x59\x12\x90\x94\x25\x1e\xbc\x20\x1a\xf8\xff\x68\xfb\xb3\xe5\xc6\x75\x2c\x7b\x1c\x7e\x9d\x73\x51\x17\x24\x01\x70\xb8\x94\x64\x39\x53\x95\x9e\xca\x92\x33\xeb\x74\x45\x85\x02\xc3\x86\xcd\xb2\x44\xaa\x39\xa4\xad\x7e\xfa\x2f\xb8\x31\x70\x10\xe5\x53\xbf\x2f\xe2\x1f\xd1\xd1\x59\xc7\x04\x49\x08\xc4\xb0\x87\xb5\xd7\x42\xc6\xab\x71\x77\x48\x10\x9b\x32\x5a\x50\xad\x04\x44\x61\x4c\x5b\x50\x95\x5a\x13\x1f\xed\xf3\xaf\x63\x50\x29\x11\xa1\x01\xdd\xb7\xc7\x63\x59\x84\xc1\xf6\x3d\x2f\x16\xa7\x13\xf0\xea\x42\xc0\xd8\x71\x37\x92\x94\x40\x80\x0c\x11\x30\xc0\x57\x8c\x7f\x0a\x65\x11\xee\xea\x38\x2d\x57\xfc\x84\x5e\xea\xee\xc3\x85\x33\x52\x2a\x42\x2c\x08\x6d\x80\x1f\x8d\x7b\xee\xf2\x59\x29\x4b\x01\x21\x73\x6d\x61\x42\x98\xcd\x46\x96\xb3\x70\xa3\x34\x4e\x22\x1e\x0c\xf0\x3f\xdd\xbb\xae\xa2\x51\xd2\x38\x49\xa5\x95\x16\x5e\xb6\xb9\x91\x77\x28\x4d\x96\x77\xf4\x33\xd3\x7f\x85\xc1\xbf\x67\xff\x97\xab\x4f\xf2\x7f\x75\x4f\xd6\x3a\x51\x0e\x85\x7c\xdb\x16\xb3\x34\x37\xb6\x6d\x92\x66\x18\xa3\x87\x4f\x3e\x64\xa5\x1f\x6f\x46\x69\x22\x4c\xd2\x61\x69\x54\xfb\xcc\x6c\xbe\x32\xd4\x69\xac\x63\xcf\x90\xf1\xab\xe7\xd1\x9c\x9b\xa0\x97\x76\xdf\xec\x5f\xdd\x93\x53\x93\x96\x71\xc9\x62\x33\xc0\xa5\xcb\x19\x5f\xcb\x17\xa7\xa9\x34\x65\xf3\xb5\xc1\x6e\x2c\x0a\xb5\xcb\xe5\x7b\xbf\x74\x86\xfb\x47\x9a\x4a\x89\x96\x63\xb7\xb2\x97\x79\xb3\x30\x6c\x7d\x98\xc6\x7d\x7c\x5c\xba\x49\xc1\x03\xc3\xbb\xa0\xe0\xf7\x2d\xc0\x77\x7e\x51\x00\xd8\x35\xd1\x58\x35\x71\xff\xed\x6e\x20\xde\x46\x52\x9e\x72\x8c\xcf\x1d\x0d\x03\xe4\xd2\x6f\x2a\x29\x57\x51\x62\x8a\x3e\x73\x09\x7d\xc6\x32\xe5\x2a\x66\x96\xf5\xea\x3b\x54\xe5\x53\x59\x5b\xbc\x9b\x6b\x20\x84\x81\xc3\x75\x6b\x8c\xb7\x35\x4c\xc9\xeb\x48\x2a\x03\xed\xd4\x34\x9e\x78\x85\x34\xe1\xe7\xb2\x6d\x86\xc4\xac\x7d\x9d\x33\x49\x25\x4b\x43\x32\x08\xda\xa3\x74\xc7\xe4\x3b\xcb\xcc\xa8\x70\x63\xcd\xb2\x9f\x0b\xa3\xb1\x94\x9c\x0b\x8b\x66\x41\x32\xb3\xd1\x45\xb0\x10\x58\x63\xa2\x3f\x01\x8a\x1a\xe7\x30\x29\x33\x48\x21\x36\x44\x71\xc6\x9a\xc2\xc3\xd3\xc5\xed\xc7\x0d\x75\x90\x98\xd8\x58\xc1\x4f\xf5\x5b\x69\x64\x14\xbe\x95\xe5\x33\xd4\xc0\x2b\xf9\x66\xd9\x85\xdc\x4f\xd4\x21\x47\xb5\xb2\x0f\x9e\x37\x9e\xb3\xb4\xc7\x5d\x64\xa1\x0c\xb1\xef\x26\x86\x3f\x8a\xf5\xce\x6f\xde\x59\xa8\x58\x6a\x15\xae\xfe\xf9\xf4\xfc\x78\xff\xb8\xbf\x7f\xb9\xdb\x6d\x9e\xee\x36\xeb\x67\xf7\xd4\x28\x48\xb2\xa1\x0d\xe6\xc5\x6f\xdd\x75\xa9\xa9\x01\xf2\xfe\x06\x3e\xd6\x3d\x27\x59\xa4\x43\x57\xe7\xd5\x59\xa6\x3d\x51\xce\xb8\x1f\x91\x66\x3c\xf0\x68\x2e\x8b\xde\x7d\x36\x6a\x01\xdd\x47\x9e\x20\x66\x33\x92\x9a\xd4\x0d\x2e\x58\x4f\x6f\x8a\xa1\x53\xd7\x6d\x1a\x9b\x52\xf5\xce\x5c\x7f\x83\x1f\x79\xf1\x5a\xff\xa3\x2d\x1b\x18\x3f\x88\xea\x18\x67\x7c\x5b\x48\x03\x65\x1d\x55\xc1\x64\x2c\x24\x36\x71\xd1\xdc\xc0\xa9\x02\x89\x5e\xf8\x1c\xba\x30\x63\xcc\x08\xd2\x72\x7f\xa8\xee\xca\xed\x09\x7c\x6c\x3a\x63\x3c\xc4\xb2\xab\x03\x16\x82\x2e\xf3\xfe\x82\x26\x24\xee\xd3\xc9\x3e\xfe\x34\x7b\xda\x64\x31\x25\x88\x7f\x40\xd8\xe4\xac\x94\x9b\x6d\x98\x70\x93\xa3\x79\x2b\x0f\x65\x7d\x5b\x56\xbf\x20\x9f\x8c\x7a\x1a\x50\x2e\x07\xf6\xf1\x53\x05\xf9\x91\xbf\xce\x03\x61\x52\x77\x53\x96\x59\x41\xb6\x1b\xe0\xea\x90\x17\x30\x7d\x2a\xcf\x10\x10\x51\x1b\xfa\xaa\x7a\xfd\xbc\x0a\x63\x36\x99\x17\xa9\x0e\x90\x34\x1b\x3e\x4f\xf9\x44\x4c\x21\xbd\x24\x7d\xb5\x37\x65\x84\xb8\x64\x0f\x62\x90\x2d\xa4\xd0\x5d\x55\x89\xb4\x5e\xb0\x4d\x95\x9b\x20\x3c\x52\xe7\x8d\xdf\x9e\x81\x74\x31\x62\xc7\x77\x64\xaf\xf0\x4c\x65\x89\x2b\x39\x43\xa6\x84\xf3\xc9\xbf\x81\x6b\x81\x00\x8b\x65\xde\xc8\x32\x37\xb5\x60\xee\x9a\x48\x32\x85\x8a\xbc\x2e\xc9\xbf\x9f\xbc\x53\x8a\x00\xcb\x7c\xd7\xcf\xab\x34\x4a\xfe\x32\xd2\x9a\x49\x01\xba\x27\xce\x7f\x18\xe2\x93\xc6\xed\x20\xc5\xf4\xcd\x6d\xc5\x8b\xf7\x43\x5e\xe0\xbf\xae\x57\x52\x1b\xd5\xbf\x02\x09\x86\xb4\x3e\x40\x31\x0c\x92\x65\x90\x18\x4e\x4c\xae\x94\x85\x19\x0f\x09\x74\x48\xa6\xb5\x44\x1f\xe8\xdb\xcf\xdb\x7f\xda\xbf\xf1\x20\x51\xda\xb1\x00\x78\x7a\xe6\xda\x5f\x15\x86\xe4\x0d\x23\xe0\xb7\xf9\x01\x6a\xb3\xf5\x0d\xe2\x34\x3c\x0c\x8d\xae\x99\x51\x22\x33\x35\xb7\x2f\xb5\xf2\x97\x59\xa8\x60\x40\x33\xa0\xbe\xf1\xa3\xcd\x48\xfa\xd7\x84\xa9\x42\xc9\x13\x5f\xdd\x66\xaa\xfb\x6c\x35\xb3\x6f\x05\x09\x26\x08\xb0\x84\xf9\xd7\x7a\x63\xd2\x00\xde\xdc\xe5\x11\x93\x54\xf6\x85\xf5\xab\xa2\xa9\x4c\xd6\xf1\xa5\xce\x8b\x57\x74\x49\xc7\xab\xcb\xc5\x30\x79\x14\x27\xa2\x97\x6a\x5d\x37\x6f\xdf\x0e\xa5\xe0\x87\x1b\x38\xc0\xeb\x18\x51\x3c\x9a\x05\x3c\xe2\x71\x6c\xab\x09\xab\x1c\x7e\x5f\x29\x7f\xe2\x11\xcf\x08\x77\x2c\x74\xe6\x98\xf2\x3f\x3d\x92\x01\x1a\x61\xb5\x7c\x03\xd5\x1e\x60\xc5\xbd\xef\xc8\x09\x4b\x5d\x25\x25\x62\x55\xe7\xdc\x0d\x4e\x32\x46\x69\x2f\x02\xbb\x2a\x8f\x27\x5e\x9c\x8d\x87\xb5\x30\xf9\xd2\x3e\x2d\xcb\x09\x40\x1a\xb8\x83\xba\x6a\x10\xdf\x7e\xb8\xa0\xdf\xb4\x8d\x69\x6a\x0e\xb4\xde\x43\xd9\xfd\xb8\x7b\xb8\x66\xe5\x70\x0a\x02\xcb\x68\xf7\x48\x31\xfc\xf8\xdb\x4f\x4c\x4e\x75\x8a\x47\xd9\x5b\x2e\x26\x4a\xdd\x84\x33\x2d\xb1\x52\x65\x23\xcb\xa2\x0f\x03\xb9\x3b\xe3\x88\xc7\x69\x9f\x9b\x37\x43\x10\x06\xee\x6a\x66\x54\x0e\x55\x8e\x62\x0a\xaa\xf6\xe6\x84\xc7\x05\xf0\x18\x8c\xe5\x68\xc5\xa3\xcd\x52\xed\x0d\x13\x9e\x50\x40\x1c\x37\x72\x50\x74\x83\x71\x2b\xf3\x91\xdb\x66\xdb\xa5\x84\x3b\x5d\x3d\x73\xaa\x2c\x5c\x50\x6a\x57\xde\x4f\x7c\x36\x9e\xc6\x19\xb2\xb7\xbd\x96\x07\x05\x05\x1a\x7b\xcd\x25\xeb\x2d\xe1\xa9\xe2\x4c\x0f\x82\x6d\xf7\xbc\x72\xab\x9d\xa7\x9a\xe1\x41\x52\xd5\xad\x51\xcd\x99\x52\xc6\x13\x9e\x89\x10\x37\xc9\x9a\x9f\xbf\xc3\xe1\x50\x8e\x4e\x43\x9e\x09\x85\x9e\xf0\x91\x7f\x7a\xa6\x6f\x3f\xef\x32\x01\xae\x6c\x18\xf9\x4c\xbe\x5d\xdb\x92\x78\x26\x33\xdc\xdc\x51\x1d\x68\x1a\xe8\x1e\xff\x6c\x1e\x68\xb0\x39\x83\x4d\x03\x47\x7c\xb0\x15\x8e\xbb\x32\xc5\x04\xa4\xa9\x2b\x85\x43\xdb\xbe\x9f\x5d\xb6\x85\xcc\x08\xe2\xb0\xfe\xb1\x7a\x9c\x65\x4e\xfc\xab\x7f\xed\x63\x14\x03\x27\x19\xb4\xfb\x00\x98\xce\x42\xa0\x04\x4d\x16\xd1\x9e\xc3\x20\x68\xf0\x83\xf9\xb1\x02\x2e\xd5\xc0\x02\x6c\x0f\x53\x48\x04\x07\x61\x29\x67\x98\x9d\xa1\xee\xef\x4a\x61\x82\xcd\xd8\x70\x9b\x1a\x99\x4a\x72\x50\x9b\x62\xd9\x1e\xde\x27\xd8\x2f\xff\x93\x35\x49\x31\xd2\x67\xde\xb7\x29\x74\xf9\x52\x1d\xe6\x3f\x8e\x4e\x02\xab\x24\xd4\xf0\x83\xb6\x34\x83\x44\x04\x3a\xc3\x6a\xf5\x1f\xb9\x1c\x25\x3a\x44\x18\x10\x84\xa5\x22\x29\xc8\xb6\xcf\xe7\x8f\x87\x43\x84\xa9\xc6\x63\xc8\x0a\xca\x9f\x0e\x97\xdc\x73\x7d\x4b\x1d\xb9\x0e\x98\xe0\x96\x17\xc6\x21\x22\x54\x2c\x12\x06\x50\x6f\x00\x56\xbb\xb2\x9b\x46\x1b\x75\x25\x8e\x28\x42\xad\x11\x8b\x63\xe2\x5c\x23\xf6\x89\x49\xd8\xc7\xde\x10\x51\x81\x60\xa3\x3b\x70\x86\xb5\x88\x18\xc3\xd0\xee\xa1\x2c\xdf\xdb\xd3\x10\xea\x23\x22\x45\xd0\x4f\x71\x4a\xfb\xa3\x68\x9c\x20\x51\x12\xaa\xa1\x8c\xfe\x57\x14\x0e\x44\x10\x66\xc2\x48\x2e\x41\xb1\xbb\x20\xb7\x9b\xfc\x38\x22\x63\x64\x67\x7f\xcf\xe5\xfb\x63\xdb\x60\x31\xd5\x95\x71\xa0\x4a\x44\xac\xaf\x65\x9f\xee\x46\x82\xb1\x98\x30\x53\x7b\xfb\xc7\x45\xb0\x53\xb0\x84\xeb\x3e\x6e\xf2\x0a\x63\xc0\xfc\xfc\x0a\x11\x71\x2c\xc0\x83\x6f\x4c\xf0\xf0\x67\xd9\x60\x8a\xff\x02\x6d\x2f\x62\x9d\x61\xde\xf4\x38\x9a\x5d\x09\x4b\xb0\xfc\xce\xd5\x2e\x7a\x68\xc0\xa8\xe6\x6b\x60\x7f\x8a\x84\x09\x07\x6f\x46\x0d\x4d\xc3\x36\x84\x68\x08\x74\x22\x3d\xc1\xd2\xe0\xd7\x25\x60\x64\xa7\x3d\x73\x37\xfe\x46\x17\x2e\x11\xa8\x21\x31\x70\xd2\x37\xfa\xa1\xfc\x7e\x3b\x5e\xb0\x22\x0b\x95\x61\xa9\xca\x97\xbd\x81\x25\xb2\x84\xa2\x91\x7d\x5f\x2a\x5c\xa6\xff\x8f\x05\xa1\x22\x83\x08\x87\xf0\x54\x7e\x18\x74\xde\x7d\xa9\xda\x43\xfb\x17\xf0\x68\x91\xe9\x08\x03\xa7\x27\xea\x3a\xc2\x23\x43\x2f\xe0\x7e\xc3\xfa\x79\x95\x44\xe1\x6c\x7e\x42\xf0\x98\xf5\x62\x76\x23\x56\x3d\x22\x78\xc2\xb0\x4c\xf4\x98\x17\xcd\x6d\x59\x21\xb8\x66\xdc\x65\x9e\x11\x8c\x1b\xff\xfd\xe9\xcf\xfd\xe3\xb1\xc8\x55\x79\x38\x70\x77\x78\x0a\x11\x1b\x32\xff\x0f\xc8\x6b\x83\x50\x82\xfe\x5a\xaa\x41\xf4\x32\x70\x43\x3b\xc2\xb6\x90\xc2\x94\x7d\xd7\xe5\x41\xa1\x74\x93\xfd\xbb\x0a\x04\x46\x83\x57\xfc\x84\x75\x0a\x43\x88\xb6\x50\x32\x8c\x07\x8c\xf8\x48\xec\x3d\xcd\xd8\x8d\x22\x38\xf6\x3e\x88\x18\x3a\xb6\xab\xb2\x28\x40\x36\xb9\x2d\x6a\x9c\x74\x09\x88\x44\xea\xc6\xbd\x93\x14\x3e\xbd\x9c\xfc\x41\xee\xba\x00\x36\x96\xbe\xb5\xc9\x11\x14\xeb\xbb\x7b\x0a\xa7\xcf\x4a\x8d\x98\x48\x67\x6e\x6b\x3d\x0d\x4b\xbb\x46\xdc\x80\xe5\x8c\x69\xf9\x0d\x8a\x60\xb6\x02\x50\x68\x12\x61\x26\xc0\xd5\x52\x7e\x87\xaa\x5c\x1d\x78\xed\x99\x79\x88\xd0\x2c\xa0\xdc\xd1\x8b\xca\xe6\xa2\xae\x5c\x06\x61\x96\xca\x5e\x6d\xa6\x9e\x45\x88\xc9\x40\x00\x82\xf1\x55\x7b\x3c\x0d\x51\x76\x32\x24\x11\x86\x94\xf7\x18\x17\x47\x46\xd6\xcd\x18\x56\x2e\x43\x65\x62\xd1\xfd\x96\x67\x82\xec\x93\x57\x44\x71\x8a\xde\xb3\x95\x43\x35\xf1\xcc\x49\x94\x40\x46\x3a\x40\x2d\x32\x81\x15\x8c\xa3\x51\x93\x84\x25\x88\x41\x6a\x1c\xf0\xca\x95\xbb\x3a\x63\x5f\xb2\x20\xc2\x57\x28\xe3\xf1\xfd\x5a\x6f\xfa\x2b\x04\x8d\x79\x01\xb2\x3c\x82\x11\x95\x30\x1a\x37\xbe\x45\xc8\x1d\xc8\x4f\xc2\xc1\x53\xc1\xf7\x56\x9f\x65\x73\x22\x92\xc5\x04\x33\x77\xbf\x2d\x0f\xce\x5c\xe5\x91\x64\x19\x47\x0d\xa4\x0f\xfc\x99\x33\x52\x02\x44\x32\x6e\xca\x4e\xf3\xfa\xd9\x06\xb4\xa6\x75\x40\x92\x09\x1a\x58\xa6\x39\xac\x13\x55\x6a\xfa\xe1\x62\x62\x72\xb9\xdd\x62\x5e\x72\xf5\x3a\x39\xb4\x65\x0c\x11\x82\x18\xf0\xf3\xa1\x62\xfc\x5b\x05\xdc\xa3\x1f\x64\xac\x03\xe9\x48\xaf\xda\xba\x29\x8f\x50\xed\x3e\x3d\xe4\xc7\xd6\xba\xfd\xf8\xf5\x36\x5d\x6e\xf6\xf6\x84\x30\xb4\xa0\x96\x9b\xdd\xcd\xf3\xe6\xe7\xda\x3d\x36\xa1\x12\x53\xe3\xbc\x3b\x4a\x6f\xcb\x6a\x05\x55\x93\xeb\xdc\xfa\x1d\x5f\xb2\xd1\xcf\x81\x7d\x64\xc2\x80\x59\xfd\xcb\xb5\xa1\x0e\xef\x5c\xb7\x6d\x37\x51\x2f\xce\x0f\x99\xa6\x86\x72\xd7\x59\xf7\x93\x22\x37\xd7\x4a\x86\x91\x35\x76\x7f\xe6\xa7\x91\x58\xda\xb8\x61\x16\x80\x49\x4a\x1b\x71\xa5\x21\x0d\xae\x6b\xc1\x64\xe2\x04\x50\x11\x74\x38\x99\xb9\x9c\x48\x74\x27\xb6\x79\xf1\xda\x1e\x90\x1a\x6d\x07\x75\xe3\xc0\xed\xb2\x33\x44\x13\x6b\xf0\x42\x75\xbf\xd9\x4d\x9e\x2f\x68\xc8\xec\x47\xda\xac\x1e\x07\xb2\x0d\x44\x0a\x16\x80\x4b\x59\xe7\x36\x96\x31\x07\xff\x91\x22\x95\x58\x67\xe7\xf8\xf9\x0c\xa1\xbf\xbb\x28\x23\x9c\x05\x08\xa0\xdf\x72\xd9\x19\xa4\x7e\xf7\x95\x42\x11\x3a\x50\xa1\x9b\xda\x5e\xb3\x96\x83\x54\x59\x86\x50\xa1\xd5\xdd\x62\xbb\xdd\x2f\xfe\xf1\xb2\xd8\x6d\x5c\x8d\x86\x04\x61\x2c\x85\xdf\x39\x7c\x30\x87\x9b\x92\x1a\x02\x0c\xaa\xae\xd7\xcb\xa9\x8d\xd5\x5e\x14\x86\xab\x20\xa4\xca\xfa\x15\x9d\x03\x0d\x03\x5f\x78\xf4\xcb\x55\x90\xea\x20\xbe\x14\x9b\x1a\x52\x11\x8c\xc5\x5c\x88\x0a\xb8\x51\x11\x7b\x80\x8f\xb1\x7f\x31\x63\xf2\xa9\x80\xb3\x98\x8e\xa2\x52\x2e\x87\x3a\xb0\x32\x55\x44\x0c\x1b\x1b\xce\xa2\x3e\xbc\xae\x22\x69\xd8\xf9\x6b\x68\x7e\xc0\x79\x3c\x71\x14\x89\x8c\xc8\xe3\x53\xfe\x09\x87\x95\x17\x0b\x25\x8a\x50\x26\xed\x3b\xbf\xf3\xe2\xb5\x6c\x9b\x31\x90\x4b\x91\xd4\x1c\xb3\x05\x7c\xac\xca\xf2\x3d\xf7\x77\x52\x95\x30\x1f\x77\x38\x76\xbe\x18\xaf\xdf\xe6\x0b\x2d\x15\xa3\x12\x6b\xef\x4f\x3c\xc7\xe8\x8e\x65\x27\x9e\xd5\x27\x71\xb7\x30\xae\x46\x9c\x21\xcb\xf6\xfc\xad\x3c\xa8\x01\x82\x75\xbc\xbc\x14\x4b\x15\x32\xfb\x54\x6d\xd1\x3b\x09\x8a\x65\xa6\xf8\xb7\xf3\x1a\x65\x79\x93\xd7\x38\xb0\x96\x23\x87\xbf\x42\x3d\x5c\xf7\x97\x36\xa4\x62\x5a\x11\x57\x3c\xac\x8e\x79\x31\x40\x09\xab\x38\xe5\xc8\xef\xd8\xc0\xf1\x54\x56\xbc\x3a\xff\xc8\x0f\x93\xa8\xb6\x8a\x33\x15\x74\x47\xef\x03\x6a\xa9\xba\xc8\x98\x4a\xb8\x95\x7f\x81\xc2\xd7\xdd\xa8\xaf\x40\x10\x2a\x01\xc2\x82\x6b\x1c\xc6\x93\xf1\x4e\x65\x80\xdc\xd8\x50\x28\xc7\xa0\xee\x6a\x21\x55\x96\x70\x2c\xc8\x97\xdc\x19\xdf\xee\x42\x1a\x05\xa6\x3e\xcf\x24\x97\x87\x24\xc3\x44\x65\x92\x22\x37\x6c\x3d\x54\xb4\xb5\xd7\x38\x8d\x90\xb0\x5d\xba\xc6\x9c\x85\xcc\x16\x3d\xac\x9b\x37\x5e\x35\x8b\xaa\x19\x45\x0b\x15\xe7\x02\x57\xb5\x3b\xeb\x97\x03\xda\x12\xd7\x44\x66\x88\xf1\x45\x64\x99\x28\xdb\xd7\x37\xdf\x55\x41\x32\xcc\x3d\xb7\x45\xdd\xf0\x77\x78\x32\x3a\x7a\xd3\xd5\x3b\xb5\x8b\xf1\xef\xe9\x64\x58\x05\x03\x4c\x0f\xbc\x54\x6d\x31\x00\x4a\x29\x19\x18\xd2\x04\x8d\x45\x65\x37\xc0\xaf\xc4\xb1\x94\x0c\x03\x24\x54\x2f\xbb\x03\x7e\x53\x34\x50\x15\x83\xb6\xe3\x49\xad\x22\x82\x53\xf4\xc8\x3f\x57\xfc\xb4\x6e\x9d\xd1\xa0\x20\xe4\x86\xf3\x96\x1f\xc1\xea\x2a\xbb\x2b\x89\x14\xba\x3f\x34\x14\x1c\x11\xa5\xf4\x2b\x2f\x54\xf9\x71\xa5\x4b\x00\x46\x5e\xcc\x98\xa1\x8b\xc3\xc1\x56\xbb\x21\xb7\xdc\x70\x02\x83\x16\x49\xe0\x63\x01\xf8\x62\x77\x49\x67\x99\x75\xd2\x7f\x97\xc6\xdb\x9a\xd9\x18\x27\x3f\x4f\x0b\x93\x51\xc7\xa9\x79\x5b\x56\x4d\x5b\x78\x03\x53\x69\x01\x58\xb3\x61\xf4\x39\x1d\x1c\xc1\xee\x70\x17\xb8\xd8\xbf\x4d\x22\x35\x4a\x2b\x6e\x82\x5e\xfc\x38\xa2\x4a\x80\x20\x4c\x50\x54\x47\x3d\xc0\xa7\x71\x48\x47\x50\x23\x08\x18\xc1\xcc\x85\xad\x7b\x59\xb6\xe7\x25\x97\xef\xdd\xf9\xd6\x27\xc8\x21\x88\x85\xa9\x15\x32\x41\x18\xa3\x30\x33\xd6\x27\x74\x2d\x39\xc4\x86\xc5\xb1\x5b\xcf\x26\x1a\xb9\x3f\xf9\xed\xc4\x3f\x50\x08\xae\xfa\xa8\x6c\xf7\xe2\x33\x06\xe6\x87\x3b\x3e\x84\x2a\x62\x83\xbe\xd5\x8f\xfa\xa9\x2a\xff\x03\xb2\x99\x10\xb0\x40\x14\xa4\x4e\xc7\xbe\x8f\x91\xdb\x68\xec\xf8\x91\x51\x92\xd1\xd4\x43\xf7\xe0\xa5\x56\xb7\xbc\x36\x79\xd3\xc9\x2f\x89\x74\x14\x83\x21\x13\x05\x35\xd4\x92\x21\x40\x52\x0e\x8e\xe4\x60\xfd\xe3\x65\xbc\x30\x81\x64\x81\xf3\x04\xf6\xa7\x0a\xf6\xef\x67\x69\xeb\x74\x8a\xf6\x08\x15\xbf\x20\x14\x02\x22\x2d\x67\x24\xf0\x71\xa4\x10\x58\x10\xe0\x6e\xa4\x00\xd7\x6f\x77\x2a\x4c\xde\xc6\x52\xc0\xf0\xbd\x38\x70\xc3\xf0\xba\x45\xca\xa2\x81\xe2\x4b\xea\x26\x09\xc4\xc0\x11\x45\xb8\x7c\x7c\x78\xd9\x3a\x7c\x10\xa4\xda\xe8\x93\xd4\xc7\xce\xdd\x1a\xce\x9d\x2c\xd2\x58\xb4\x71\x53\xf1\x8f\xbb\xb2\x69\xa0\x3a\xcf\x62\xc4\x21\x23\x1a\x6b\x41\xad\x43\xf0\x1d\x0e\xa7\xc9\x26\x08\x3c\xd0\x68\xf7\x9f\xaa\xf2\x58\xae\x9b\xb7\x41\x80\xc2\xb5\xc8\x02\x13\x01\xea\xee\xdb\x95\xdb\xc6\x5b\x92\x8e\x83\x95\x80\x08\x92\x88\x98\xe2\xef\x07\xf8\x98\x45\xa1\xfd\x55\x15\xe1\xe0\xf4\x02\x25\x28\x2e\x0e\x67\xac\xad\x6c\xd0\xaf\x6e\x11\x70\xd2\x73\x77\x12\x80\x98\x84\xa1\x15\xb6\x5f\x14\x0a\x53\x05\xa3\x99\xa5\x69\x42\xba\x0f\x81\xbb\x88\xd9\x51\x4c\xe1\xd3\x1c\x26\xc7\xdd\xc3\x52\x34\x58\xbf\xf1\xa3\xf0\x99\x33\xd0\x29\x41\x6e\x75\x53\x65\x97\x97\x85\x75\x6b\x46\x03\xaa\x83\x30\x40\xe2\xb4\xa2\x3d\x7e\xe3\x47\xdf\x51\x1d\x10\x8d\xa7\xcd\xff\xb6\x50\x9d\xb7\x27\x90\x39\x3f\x3c\xf3\x06\x6e\x2f\xf8\x7c\xc6\xa7\xa2\x0e\x12\xc1\xad\xe0\xfa\x50\x50\x02\xea\x69\x58\x58\x07\x8a\x23\x50\x29\xaf\x2d\x3e\xd1\x47\xfc\x75\x98\x70\xb0\xd1\x2f\xb3\x66\x76\xe5\xa6\xae\xa7\x65\x4a\x3a\xe4\x49\x18\x78\x8a\x66\xa8\x9b\x41\x52\x4b\x87\x22\x00\x3e\xd8\x6d\x4c\x71\xc2\x95\xbd\x75\xc2\x03\x37\x0f\x4c\xd3\x84\x84\x41\x0f\x4c\x7b\xd4\x98\xec\x98\x7a\xe7\x9a\x50\x8e\x36\xc4\x0d\xbf\x0a\x54\xfa\xef\x0a\x2c\x34\x11\x29\xa2\x40\x8f\xfc\xf3\x01\x51\x1e\xfe\xf3\x50\x6a\x34\x17\x2b\x38\xf0\xf3\x3d\x34\x7c\xf7\xf9\xc7\x3c\x18\x66\xe4\x09\x4e\xbe\x15\x0b\xcd\x6a\xca\x8b\x1c\x25\x38\x30\x82\xf2\xd5\x8c\xef\xbb\xc6\x08\x60\xa2\xd2\x50\x53\xf7\x8a\xcc\x8b\xc2\x52\x89\xdf\x96\x97\xea\xad\x44\xb3\x2c\x4e\x93\x21\x57\x03\x7a\xf5\xf5\x5b\x7e\x9a\x34\x8c\x23\x23\xd9\x2e\x0d\x37\xf5\xaa\x6d\x2e\xa6\x6e\x9c\x48\x35\x0c\xde\x6e\xb1\x98\xd1\x8d\x50\x0c\x06\x73\xdf\xd9\x7e\x8f\xc5\xe1\x8c\x86\xf3\x70\xa9\xe9\x04\x64\x66\x67\xea\x5d\xf9\x3a\x34\xff\x75\xa2\x43\x63\xcf\xba\x22\xdf\xf1\x9b\x53\x4a\x94\x55\xaf\xfa\x09\xd5\x48\x22\xac\xbb\x28\x03\x9f\x51\x9c\xe8\x15\x8f\x7f\x63\x16\x18\x6f\x5f\xbb\xa0\xa1\xce\x02\x93\xb4\x36\x07\x9a\xce\x5f\xfd\x05\x1a\x18\xea\xe4\xfc\xb5\xb0\xd9\xee\xff\x42\x15\x89\x68\x4e\x75\xe4\x7c\xd5\xa7\xf2\x03\x86\xac\xb9\x44\x73\x66\x42\xf5\x98\x1b\xde\xda\xf4\xe5\x95\x82\x3a\x2d\x48\xc8\x0d\x33\x55\x79\xb8\x69\x8b\x57\xf0\x7b\xae\x16\x0c\x58\x1f\x21\xfb\x69\xe9\x6a\x6e\xaf\x0b\x5a\x4c\x26\x93\x90\x86\xf2\x62\xb3\x7a\x7c\x6e\x8b\xa2\x47\xd8\x68\x49\x13\x9c\x2f\x6e\x6b\xbd\x2d\x7d\x76\x4d\x2b\x01\x18\x22\x37\xca\x28\x05\xee\x98\x0a\xd5\x36\x6c\x03\x20\x60\x94\x9a\x7a\x88\xbb\xd6\x81\xa1\x51\x7d\xed\x6b\x62\xfe\xa7\xe7\xd7\x48\x5d\x2b\x92\x62\x7c\xda\xa0\xdf\xca\x0a\x6b\x10\x7a\xfd\xdc\x39\xdf\x81\x06\x21\x8f\xec\xf1\x55\x37\x55\x79\xd6\x65\x65\x99\xf7\xa7\xa1\x42\x1a\x84\x2a\x46\x81\x2b\xec\xba\xa7\x29\x1b\x64\x32\x68\x10\x85\x12\xe1\x53\x4d\x79\x6a\x4f\xeb\x02\xaa\xd7\xf3\xf2\x3c\x5b\x21\x3e\xe9\x46\x14\xab\x44\x78\x17\xe6\x06\x7e\x8f\x56\x16\x0d\x22\xa0\x08\xe4\x5f\x7f\x9e\xba\xbf\xee\xb7\xbc\xc9\x6b\x6d\xe0\x85\x7b\x43\x31\x06\xea\x1a\xe4\x90\x06\x84\x2b\x99\x0e\x32\x5b\x86\x5a\xf4\x8b\x6d\x93\x06\x44\x1a\xbe\x26\x5b\x0c\x77\xb3\xdf\x3d\xee\x16\x77\xfb\xc5\xfd\xe3\x8b\xa3\xeb\xa4\x41\x37\xf9\x75\x8f\x2f\xee\x81\x24\x34\xa0\xa1\xc0\x1c\xe9\xef\x1c\x3e\xf8\xec\x78\x52\x42\x31\x8b\x7f\xff\xe7\xfa\x9f\xab\x01\x52\x8e\x06\x54\x10\x04\x47\x58\x31\x4d\xab\x42\xe1\xae\xb2\x88\x61\xa8\xe6\x8d\x57\xfc\x47\x5e\xe5\xfd\xdf\x39\x7e\x7f\x9e\x57\x77\xb9\x6e\x06\xd1\x6d\x1a\xb0\xc4\x68\xbb\x98\x7c\x36\xdf\x53\x7f\x21\x0d\x14\xf8\x81\x37\xb5\x95\x91\xbf\x28\x0c\x03\x1c\x57\xea\xef\xa5\xf8\x8b\x4f\xc8\x14\x09\x1c\x1d\x6d\x74\x74\x85\xb1\xb3\xeb\x92\x06\x0c\x42\xcc\x78\xec\xb9\x52\x8b\xa2\xc6\x35\xfe\x3d\xaf\x9b\xb2\x3a\x5f\x55\x25\xbd\x30\x22\x68\x10\x67\xd2\x31\x61\x5a\x68\xc7\xf2\xbc\xab\xb8\x7c\xdf\xa8\xc9\x60\xc7\x8a\xfa\x96\xf9\x27\x0c\x45\x38\xa9\x6d\x92\xc4\x49\x60\x60\xcb\x45\x39\x14\xa5\xe8\xae\xa4\x88\xc1\x3f\xf1\x79\x45\x5b\x1a\x24\x32\x56\x66\x82\x95\xa7\xe1\x86\x4d\x83\x94\x09\x6d\xeb\xd4\x2e\x35\xbc\x07\xc0\x24\x1a\xa4\x71\xea\xf8\x00\x8c\xa2\xb8\x8b\xf1\x8c\x87\x2e\x05\x2d\x0c\xab\xe8\x3d\xfa\x4b\x79\x59\x20\xa8\xf7\xf1\xe4\xf6\x48\x1a\x64\xd4\x54\x7e\x20\xa0\xf2\x09\xaa\x97\x22\x97\x65\xd5\x5f\xe6\x0a\xc9\x16\x3a\x2b\xeb\x8f\x21\x4e\x6a\x6c\xed\xd0\x80\xeb\x28\xf3\xe8\xe1\x1d\xf0\xa3\x53\x13\xac\xdc\xa3\x44\x94\x60\x3e\xff\x8d\xd7\x5b\xfc\xd9\xf6\xd7\xff\xeb\xdf\x7f\x1b\x0d\x83\xa0\x06\x6e\x71\xcc\x8b\x6d\x7b\x34\x44\x7d\x5e\xb9\x8d\x06\x22\x09\x63\xeb\xc5\xdc\xdd\xfd\xdc\x83\xca\x9b\x7d\x48\xc7\x23\x29\xd2\x34\xee\x17\xf1\x04\xb4\x3e\x41\xf2\x77\xad\x15\xa6\x90\xda\x5a\xed\xca\xef\xfc\xf7\x68\x39\x08\x65\x8e\xbb\xbd\xd5\xe8\xbe\x2b\xf9\x95\xe8\x0a\x0d\xa4\xa6\x98\x6f\x32\xa8\x73\x8f\xf7\xb4\x57\x55\x98\x71\x87\x17\x33\xb7\x6f\x7d\x68\x84\x06\x8a\x86\xc8\xb1\xbd\xf0\x55\x1d\xe3\x67\xab\x38\xc2\x72\x03\x4b\xfc\xd9\x17\xfc\xae\xf2\xe6\xbc\xcd\x9d\x36\x13\x0d\x94\x4c\xc1\xa4\x1d\x66\xd0\x72\x34\xd0\x4a\xa2\x61\x73\x63\xa9\x53\xa6\x97\x41\x22\x10\x48\x97\x95\x84\x47\xad\x6b\x68\xd6\x68\x60\x77\x66\x7e\x4f\xc3\x4c\xc3\x20\x4b\x51\x93\x13\x53\x12\xf5\x3d\x6f\xba\xe3\xf5\xea\x82\xfc\x2a\x43\xde\x3d\x4b\xa1\xbb\x29\x9c\xf8\x51\x6d\x61\x41\x2e\x82\x41\xc3\x10\xa8\xb2\xe2\x91\xab\x4b\xf1\x7a\x1a\x46\xa9\x88\x07\xca\xf4\xc3\x35\x19\x92\xc0\xb0\x7d\x38\xa4\xee\xfa\x37\x0c\x2e\x72\x1d\x39\xf9\x1c\x9c\x6a\x83\xe2\x6c\x1a\x12\x6d\x12\x68\x0d\xd4\x16\x0e\xec\xae\x50\x05\xb8\x1b\xa2\x51\xd9\x5c\x99\x11\x21\x0b\x53\x53\x92\xdb\xca\xf7\xf3\x9f\x65\x3b\x30\x4f\x68\xc8\x58\x86\x38\xfe\xf5\xee\xbb\x57\xce\x1c\xaf\xe0\x90\x89\x0c\x7d\x7b\x0d\x03\x9e\x5d\x7b\x2d\x26\x2c\x4c\xed\xea\x2e\x06\xfb\xa7\xbb\x4c\x49\xdc\x53\xe0\xd9\x0d\xe2\x9e\x7f\xfa\xdb\x63\x40\xad\xba\xc7\xe5\xb7\x01\x08\x6b\xf2\x0c\x1e\xa0\x21\x08\x47\xa8\x5e\xa1\x90\xe7\x2d\x34\xcb\xe5\x2d\xb7\xfe\xf5\x38\x50\x4d\xc3\x24\x4a\xad\x56\x6a\xd7\x4f\x3c\x21\x56\xfd\x88\x25\x84\xe1\x57\xb6\x29\xb7\xe7\x41\xe9\x14\x0d\x13\x01\x12\xcf\xd0\xd5\x68\x88\x52\xaa\xb0\x1e\x6b\xb9\x5a\x8e\xff\x2e\x53\x4c\x11\xa0\x6e\xe2\x17\x41\xf1\xf9\x03\x28\x4c\xa5\xe1\x8d\xe5\x4a\x3d\x16\x26\xdc\xf3\xe5\x89\x15\x66\x69\x18\x87\x1e\x94\xe6\xaa\x87\xe7\xbf\x39\x27\x71\xc0\x7b\x75\x81\x6a\x32\x53\x79\x66\x2a\xda\x85\xaf\x9f\xe8\xfe\xa6\x70\x71\xbf\xf1\x7a\xff\x9f\x32\x2f\xfa\x71\xe1\x4a\x21\x2e\xad\x80\x8f\xfb\x52\x0d\xbd\x48\x1a\x8a\x80\x43\xe2\x29\xa9\x04\x54\x8f\x05\x2c\xaa\xd7\x71\x72\x8c\x4e\xbe\x91\x0c\x33\x65\x95\x37\x90\x5e\xd6\x1b\xf1\xd7\x7e\x0e\x52\x75\x79\x1a\x2f\x6f\x24\x9a\x54\xa4\x39\x0b\xda\x5e\x12\x75\xa0\x8c\x3a\x3f\x92\x92\x08\xa7\x65\xbb\x6c\xcf\x79\xf1\x3a\xa7\xc0\xef\xda\x66\x1c\x47\x7d\x80\x31\xb0\x2c\x42\x97\xa1\xbe\xf1\x9d\x10\x2a\xaa\x2d\x1d\xce\xc3\xcb\xfd\xfe\x61\xf1\x73\x33\xe4\x28\xa0\x21\x68\x08\xac\x0b\xbe\x84\xba\x19\x9a\x79\xb6\x85\xa6\x29\xda\xbb\x37\x79\x51\xd6\xbc\xad\xba\x69\xef\xe5\xfa\xba\xcb\x12\xb1\xf9\x0d\x7f\x87\xca\x82\xcc\xc7\x43\xad\x33\xaf\x17\x77\xc3\x0d\x75\xc1\x64\x2e\x68\x21\xf0\xeb\x72\xa5\x26\xbe\xf6\xfc\xe8\x45\x41\x16\x61\xde\x7f\x5d\x48\xa4\xcd\xde\x8d\xc8\xea\x68\x14\x68\xc3\xb9\xe6\xad\x9c\xed\x5b\x7e\xea\x26\xce\x61\x79\xde\x8c\x74\x80\x68\x14\x46\x14\xf3\x29\x75\xeb\xec\xc2\x28\x64\x24\xc3\x25\xea\x59\x89\x47\x89\x1c\x1a\x85\xa9\x42\xf2\x86\xd2\x06\xf6\x47\xea\x8c\x34\x0a\x35\x1f\x48\xc6\x20\x36\xa5\xf3\x95\x7b\x98\xcc\xb5\x0a\xf4\xee\x56\x89\xd6\x81\x35\x64\x71\x51\x7a\xb5\xd3\xd4\x36\x8a\xa2\x8c\x08\x1f\x4f\x77\x6a\x91\xee\xed\x91\x0a\x90\x49\xc7\x86\x00\x07\x65\xdc\x34\x8a\x40\x85\xb6\x52\xfc\xb6\x02\x58\xc2\xbc\xc8\x1f\x8d\x48\x2c\x6d\xca\xa8\x91\x6f\x86\x88\xbd\xf2\x3f\x9f\x51\x93\x5a\x5d\x95\x15\x0c\xa9\x1f\x69\xc4\x32\x88\x7a\xe6\x16\x7c\xf5\x90\xa5\xe9\x6f\xed\x1c\x4a\x6b\x26\x81\x47\xa3\x98\x26\xa4\xa7\xd0\xd9\x72\xed\x7f\x5f\x2c\x42\xc3\x69\xff\x56\x7e\x58\x18\xb9\x81\xbb\x8c\xa6\x5d\x14\x4b\xe2\x38\x69\xd6\x9f\x48\x77\xad\xbc\x72\x79\x7d\x5b\x3a\x41\x87\xf1\xcf\x8e\xb5\x21\xe5\x19\x8a\xcd\xe2\xaf\x37\xec\xcd\xe3\xc6\x49\x60\x30\x3b\xad\x41\xbf\x1c\x6e\xae\xe9\x54\xd2\x28\xc9\x4c\x59\x25\x72\x34\xb4\x45\x33\x83\xf7\xa0\x51\xc2\x63\x84\x81\xae\x3f\x9b\x0a\x8e\xb0\x85\xa6\x3d\x8d\xa6\x75\xc2\x35\x7e\xd9\xb2\x6d\x64\x79\xb4\x18\x87\x7e\x0f\x18\x77\x0e\xe2\x2c\x9b\x40\x99\x1f\xb5\x7b\x52\x9a\x1a\x10\x4b\x37\x38\xbc\x3a\x9c\x17\xc8\x2a\xf4\x23\x6f\xea\x67\x38\xf2\xbc\xf7\xcd\x69\x94\x66\x81\x1f\x12\x5e\x37\x87\xf9\x72\x60\x1a\x65\x81\x70\x65\xb7\xa6\x63\x33\x05\x5d\xa3\x9d\x25\xca\x58\x8c\x24\x0f\x05\x7c\x7a\xde\xf2\x67\xe4\xf5\xea\x1c\x75\xd7\x28\xd5\x58\x14\xb8\x58\xdd\x4d\x5f\x08\x14\x37\xa6\xdd\x7a\x71\xbf\x5f\xdc\xdd\x3d\xfe\x5a\x3c\xac\xd6\xee\x3e\x1e\x24\xc8\x2d\x02\x48\xd5\xf9\x5f\x9c\x86\x91\x60\x1a\xc2\xa1\x7d\xf4\x69\xf3\x4f\xee\xba\x08\xc1\x72\x76\xe3\xef\xdf\x43\xf3\xb6\x37\xa4\x6a\xae\x85\x0a\x30\x8d\x5b\xb8\x0c\xb5\xfd\xbb\x8c\x48\xc2\xcd\x7a\x69\xe0\xb3\x2f\x6e\xa7\x91\xcc\x32\x1b\x45\x32\xef\xfc\xc3\xea\x3d\xff\xcd\xa4\x5d\xf0\x93\xd2\x7f\xd1\x7f\xf7\xff\xc3\x5c\xe8\xfe\xd7\x58\x61\x91\x46\x52\xa4\xb8\xb6\x5f\xcb\x83\x5a\x96\x9f\xe6\x23\x8c\x74\x26\x69\x24\x25\x24\x1e\x85\xba\x1f\xa1\x67\x69\x24\x95\xc1\x90\x61\x7d\x80\x81\x92\xce\xfa\xa2\x91\xd4\x8c\xd8\xf4\xf8\xb7\xf2\x37\x54\x45\x39\x9d\xca\x10\x50\x3c\x15\xf0\x51\x5e\x7b\x96\x46\x10\x1a\x86\x8b\xdd\x8f\x27\xff\x27\x95\x66\x74\x50\xef\xbc\xe3\x95\xd3\xa0\x1b\x26\x9f\xba\x86\x0a\x8f\xc1\x13\x3f\xdf\x02\xd4\xbb\xf2\xf5\xb5\xff\x61\xa0\x34\xc2\x93\x0f\xf0\x1b\x9e\x7d\xee\x88\x46\x3a\x36\x44\x22\xcf\x6f\x5e\xf1\x7d\xdc\x53\xad\x0c\x80\xef\xd9\xb3\xc3\x5e\x55\xee\x30\x77\x90\x80\x71\x04\x07\x7c\x60\xda\x10\x81\x1f\xf7\xfe\x8b\x92\x40\x48\x64\xbb\xfa\x70\x8c\x3f\x8e\xf6\x7e\xfc\x5e\x12\xd2\x04\xeb\x79\x36\x06\xdf\x9a\xff\x1f\xdc\xf3\x22\xd7\x5d\xd3\x2b\xb3\xd5\xe8\xa9\x7b\x57\x9e\x84\x34\xc5\xb0\xee\x91\xbf\x83\xc3\x81\xfe\x31\x3f\xc3\xaf\xa1\x21\xff\x36\xe9\x53\x26\xd0\x27\xf7\x6a\xef\xdf\x79\xfd\xb6\xf6\x3f\x2d\xd4\x69\xca\x5c\xcc\xff\x52\x95\x81\x92\x28\xe4\x4a\x78\x5b\x7b\x53\xec\xde\x60\x7b\xae\x1b\x18\xa7\xa1\x28\x89\x32\x6e\x80\x9f\x06\x08\x89\x83\x8e\x31\x06\x37\x15\x09\x49\x32\x2c\xa0\x31\x41\x96\x4b\xaa\xbb\xc9\x60\x12\x30\x43\x51\xe1\xe6\x75\x9f\xdb\x1a\xa4\x61\xc4\x96\x12\x1a\x45\xc8\xb4\x8a\x1a\x5d\x8d\x8b\x83\xda\x1a\x36\xdf\x28\x66\x28\xcb\xb3\xc7\x98\xe0\xa5\xbc\x1d\x25\x2c\x93\xa1\x01\xeb\x57\xef\x86\xb7\xdc\xf7\x9a\x71\x08\x7c\x66\xf1\xf3\x5b\xc9\x27\xee\x19\x61\x2a\x42\xc8\xe4\xb7\xe7\xf5\xfd\x70\x87\xe8\x2e\x98\xc4\x6a\x67\x71\xd4\x6f\x16\xbe\x60\xd5\xd9\x1c\x35\xf0\xec\x49\x4d\x98\x8a\xd1\xd8\x70\x78\xc4\x49\xe1\x0a\x25\x71\x1c\xa2\xcc\x4d\x89\xc9\xee\x11\x0c\x66\x02\x2e\xa1\x48\x37\x81\x5f\x26\x97\xef\xcf\xf0\xbf\x6d\x5e\x01\x46\xcd\xbf\x34\x5a\x48\x92\x1a\xa2\xd5\xff\xc9\x47\xe7\x15\x49\x44\x86\x05\x47\xcb\x73\x03\xf2\x6d\x07\xf2\xad\x28\x0f\xe5\xab\x0b\x7e\x92\x34\x0a\x39\xb7\xfc\xc4\x28\xb0\x66\x8c\x1e\xdb\xc5\x6d\xaf\xb9\xe8\xdb\x13\xdc\xa1\xff\x53\x97\xc5\x0f\x38\xdb\xb4\xe5\x8c\xf5\x40\xd2\x24\xc3\x92\x0c\x50\xaf\xf0\x94\xbf\x76\x73\x79\xe9\xde\x9a\x71\x8d\x46\xf1\xaf\xc5\xcf\xf5\x21\x6f\x60\xd4\x65\x1e\x73\xac\xf5\x37\x9c\xf5\xf5\xee\xa3\x7c\xe0\xc7\x2b\x1c\x4f\x94\x70\x4e\x70\xcb\xf5\x00\xe7\xbd\x7f\x0e\x64\x08\x79\xf8\xf6\xfc\xf8\x6b\xf7\x7d\xbf\x7c\xb9\x77\x1b\x1e\x11\x49\x46\xac\x28\xf9\x2b\x5c\x62\xfa\x29\x11\x82\x59\xd3\x07\x43\x2d\x26\xc4\xf8\x96\x9f\x2e\x98\xd2\x47\xc7\x29\x91\x31\x41\xab\xb0\xa9\xb0\xd0\xf1\x0a\x18\xc0\x35\xce\xc0\x28\xac\xf8\xfc\xdd\xa0\x6c\x77\xd2\x56\x05\xcc\x88\x9c\x0e\x2b\x9f\xac\x57\x35\xee\xb9\x62\xf1\x80\x04\xfe\x70\xa2\x93\x0f\xa8\x32\x6e\xfc\xd5\xd5\x7a\xe7\xf1\x21\x94\x40\x00\x58\x5b\xb9\x77\x39\x9e\x2b\x1d\x81\x8c\xc6\xd1\xe0\xa8\x18\x8b\x0f\x4e\xfa\x02\x22\x00\x57\xdb\xfa\x9b\x37\x7c\xcc\xf9\x46\x09\xa8\x48\xf6\xc2\x70\x83\xbc\x10\x25\x3a\x8a\x10\xc8\x95\xd7\x6e\xf3\x9e\x30\xbd\x9b\x76\x34\x08\x8c\x08\xaa\x36\x4e\x4b\xdd\x53\x22\x76\xd7\xc0\xe5\x78\x9e\xaa\x52\xdb\xb2\x8c\x31\x62\x86\xd2\x80\x99\x62\xeb\xbd\xa1\xcd\x7b\x36\x59\xb0\xb7\x81\x39\x4f\x83\xd4\xf0\x68\x1b\x1e\xab\x97\xa2\xb3\xd1\x78\x03\x4f\x50\xfd\x09\x0e\xff\x4d\x69\x60\xe9\xc9\x15\x28\xb0\x7c\xbd\x63\x9f\x85\x86\x19\xc1\xfa\x35\x84\x13\x3e\xb5\xc5\xbb\x33\x0d\x66\x87\x8f\x46\xc4\x28\xe7\x60\x94\xc8\xea\xfe\x6c\x07\x09\x3c\x67\xa1\x0c\xfc\x12\x1a\xc5\x1c\x0f\x61\x5e\x89\xbc\xa9\x86\xb0\xc4\x29\x2e\xbc\x3f\xc6\x68\x94\x65\xd2\xb0\x3a\xc3\xe2\x70\x7a\xe3\xc3\xb0\x23\x25\x91\x51\x2b\x7a\x22\x37\x93\x9f\x43\x78\x86\x6e\xdb\x7d\x2e\xcb\xbc\x18\x52\x14\x7f\x51\x0a\x42\x29\x0d\x8d\xe1\x5b\x21\x71\x3a\x1e\xde\xab\x0a\x54\xde\xf4\x31\xa7\xc9\x40\x30\x22\x54\x30\xf4\x25\xef\xf3\xc2\x53\x1b\x4d\x06\x80\xd1\x0c\x8b\xf6\xb4\x29\x3d\x6f\xf9\xe1\x70\x25\xfe\x4d\x59\x62\x58\xba\x0f\xa5\x25\x4a\x49\xfb\x32\xbd\x4b\xb4\x55\x3f\x5c\x0c\x0c\x35\xcf\x73\x77\x64\x1e\x46\x6e\x2f\x8d\x53\xed\xf0\x79\x0f\xf0\xf1\x54\x36\x43\x95\x70\x4a\x93\x84\x23\x2a\x61\xc9\x8b\xf7\xa2\xbc\x04\x8d\xba\x66\x59\x8a\x5b\x83\xe8\x5c\x3f\xc7\x98\x30\x66\x85\xbd\xe0\x81\xa1\x34\x8d\x52\xe1\x2d\x4b\x2f\x50\x30\xbf\x90\x69\x9a\x85\x98\xd1\x5f\xbe\xfc\xf9\xf8\xb2\xdb\x3f\x3d\x6f\xbc\xe1\x4e\x53\x6d\x80\x80\x79\xdd\xf9\x41\x7c\xc8\x3b\xe0\x9a\xf0\x88\xe3\xed\x26\x2b\x8d\x9f\xcf\x87\x8a\xa8\xb0\xf4\x4e\xae\x50\xa5\xac\xbb\x5b\xc3\x59\xa3\x2e\xfd\xff\xf7\xbf\xdc\xbb\xc2\x40\x19\x06\xce\x73\xd9\x36\x8f\xca\x9b\x02\x54\x46\x80\xab\x56\xb4\x55\xf1\x74\xf7\xb2\x7b\xd9\x9a\x7c\xd5\x78\xa8\xa5\x48\x11\xbc\xf1\x3b\xef\x3c\x86\x86\x1f\x4c\x70\x75\x57\x5a\xe7\x74\x3c\x6a\x52\x51\x23\x60\x02\x85\x7a\x86\x09\xb3\xe2\x14\x8b\x4b\xa9\x04\x85\xb6\x7e\xf9\x7f\x7e\x06\x28\x12\x03\x18\x5c\x4d\x83\xea\xe9\x17\x47\xca\x6c\x64\x9a\xaa\x58\x63\x7e\xf6\x69\xf1\xe4\x08\x0a\x28\x85\x38\xa6\x6e\x83\x35\xe9\xba\x61\xb8\x99\x42\x62\xc8\xfd\xeb\x5c\xc1\x12\x9a\x27\x3e\xc6\xd1\x52\xaa\x93\xd4\x41\x74\xbd\xd3\xd9\x9d\xa1\x9b\x62\x98\xe2\xa7\x2c\xe0\x01\x32\x56\x21\x46\xc5\xe4\x79\xc6\xc1\x2f\xdf\x2e\x62\x7a\xa0\xbe\xb4\x97\xe3\xcc\x03\x0b\x94\x11\x6c\xb3\x28\xdb\xb6\xc8\x9b\xf3\x33\x9c\xda\x66\x26\xe6\xcb\xa2\x48\x66\x91\xb7\x40\xb7\x0d\xd7\x7a\xda\x82\x05\x78\x80\xe4\xb2\xc4\xd3\x88\xb8\xf7\x10\x12\x20\xbc\xb3\xf2\xbf\xaa\xfb\xb4\xb8\xd7\x38\xe4\x0d\x65\x44\x2a\x77\x3e\xdc\x9f\x7f\xe6\x45\x7f\x85\x12\x82\x28\xe1\xdd\xcb\x66\xb8\xba\x19\x65\x80\xb1\xfd\x7d\x65\x64\xd8\xb1\x64\x69\x92\xeb\x62\x2c\x4a\x50\x03\xe4\x54\x95\x9f\x39\x4c\x87\x28\x0e\x8d\x0b\x65\x03\x47\x0e\xd9\x4b\x59\x4c\x18\xb5\xf1\x89\x75\xa1\x6c\xa9\xd6\x44\x15\x97\xb2\x38\x63\x81\xed\xf3\x8f\x56\x95\xf5\x34\x4e\xdf\xf9\xf3\xce\x97\x43\x7b\x7e\xc6\xba\x61\x49\x6c\x54\x67\x7f\xad\x57\xee\xed\x89\x16\x24\x19\x54\xec\xce\xdd\x96\xd2\xcc\x40\x13\xcb\xd1\x8e\xf0\xa5\x61\xca\x52\x60\xda\xcb\x90\xdf\x96\x95\x84\xce\xec\x18\x8d\x6a\x16\x28\xa2\x07\xe5\xb5\xf3\x64\x98\x94\x65\x31\x45\x53\xef\x98\x17\xcd\xb6\x3c\x7c\x85\x2f\xa6\x2c\x4b\x23\x84\xa0\x1e\xb9\x52\xb3\x15\xc1\x94\x65\x22\x40\x2c\xf3\x62\xb7\x7b\xde\x3f\xad\x9f\xef\x17\x0f\x6b\x9f\x26\x67\x99\xc8\xf0\x98\xba\xe7\x9f\xdb\x86\x57\x68\xff\x4f\xaa\x9f\x28\xe3\x96\x7f\x50\x1b\x4d\x6a\xff\x67\x1a\xe0\xc9\x22\x2c\x03\xcf\x70\x7d\x5f\x9e\x31\xee\xa6\x58\x63\xc8\xd3\x50\x82\x5d\xf2\xe4\xb8\x66\x3c\xc0\xca\x7d\x83\x17\x7b\xe3\x95\x55\xd2\xaa\x07\x21\xf0\xc1\x43\x95\x51\xde\x32\x01\x85\xbc\x90\xc0\x02\xd7\x4b\x41\x43\x06\x1e\x4c\xe2\x70\x5b\xee\x7d\xf4\x82\xf4\xf0\x5f\x61\xf8\xef\xb9\x24\x30\x93\x54\xb3\xb4\xe7\x8b\x0b\xdd\x0b\xa4\x32\xca\xa4\x79\x91\x37\x7b\xdd\x5b\x66\x4c\x85\x99\x1a\xf2\x8e\x2d\xe1\x19\x8d\xfd\xa9\x79\xc7\x14\x89\xa4\x9e\x6c\x50\x9d\x2b\x53\xdf\x01\xb2\x3b\xff\x4f\x3d\x04\x63\xf9\x9b\x4c\x21\xb1\xf4\x52\x07\x9e\xfb\xd7\x77\x80\x19\xba\x1f\x54\x2a\xe6\xaf\x70\xbd\x78\x71\xd2\x9f\x94\x3b\x76\xc2\x5f\x79\x81\x73\xe2\xb6\x2a\x8f\x08\x79\x9a\x75\x09\x98\x4a\x0d\xc5\xda\xb7\xea\x7c\x7a\xf3\xe7\x27\x53\x4a\x19\x78\x16\x86\x5a\x1c\x8e\x1f\x19\xc2\xa9\x6f\xa3\x0d\x7b\xff\xea\x71\xbb\xf9\xf6\xb0\xbf\x5f\xfc\x13\x45\x06\xdc\x65\xa0\x1c\x43\xc0\xdb\x8f\x5c\x37\x37\x3e\x5c\xc7\x40\xa6\x88\x67\x7d\x6a\xc7\xf5\x36\x94\x81\x36\x95\x55\xa5\xd6\x87\xbc\x80\xee\xad\x28\xdf\x53\x1e\xd4\xd7\xab\x38\x0e\x12\xa3\xfa\x7a\xf7\xb2\xfa\xd3\xe5\xbf\xe3\x20\x23\x98\x40\xd9\x07\x9f\xf7\x65\xc1\x3b\x23\x70\xb8\xae\xe3\x30\x0d\x6c\x12\xce\xf9\x93\x8f\xda\x54\xab\x5e\xd7\x5f\xe8\xee\x32\xcc\xe3\x8f\xef\x77\xf9\xef\x69\x99\xfd\xe8\x78\x8d\xc3\x34\x43\xf0\xc8\xfd\xe6\x61\xbf\x79\xf8\xb9\xde\xee\xf6\x8b\xd5\xce\x97\x5b\xd1\x38\x0a\x18\xfa\xdd\xff\xdb\xf2\xf7\xe9\x59\x1e\x47\x31\x60\xf7\x9e\xda\xe3\xe9\x7b\xa9\x0e\xfe\xa6\x94\x21\x3f\x99\xe4\xf5\x5b\xd9\x36\xeb\xc7\xed\x12\x6b\x1b\xdf\x27\xfa\x3d\xae\x39\xa7\x98\xbe\x39\xf2\xcf\x81\x52\xdf\xf0\x1c\x8e\x23\xa1\x42\x9b\xb3\x6b\x4f\xa6\x24\xde\x5e\x21\x71\xe4\xe8\xdf\xf7\x98\xd9\xdc\x77\x9b\xdb\xbe\xf1\x12\xa5\xe3\x77\x11\x6e\x98\x13\x57\xfc\x94\x37\xfc\x80\xb9\xee\xd1\x90\x13\x11\x04\xa6\x16\x16\x25\x64\x9c\x6d\x61\xf2\xcc\x5f\x26\xaa\x62\xaa\x9d\x98\x99\x35\x69\xaf\xec\xac\x31\x83\x04\x45\x62\xac\xa2\x8f\xd1\x6a\x2a\x74\xf9\x55\x01\x0c\x8d\x63\x12\x22\xdc\xf6\x5b\xe7\x65\xe5\x03\x82\x78\x1a\xc7\x34\xc6\xaf\x74\xbb\xf9\xe7\xfa\xe6\x79\xfd\x6b\xf1\x7c\xb3\xbf\xbf\x77\x57\x93\x24\x30\xe4\xa3\x9d\x83\x6f\x22\xe5\xaa\x3c\x0d\x72\x21\x71\xc2\x09\xd2\x0c\xf7\x8a\x8f\xfe\x8a\x30\x12\x46\xfb\xd3\x81\x5f\xaa\xbd\x7c\x99\x1e\x8c\x33\x0a\x48\x8c\x0b\x72\x8c\x17\x8b\xb3\x24\x46\xc8\x3c\xa2\xb2\xf7\xbf\xee\xfc\xdf\x41\x60\xb8\xdf\x50\x64\x75\xdb\x82\x0f\x9a\xcd\xdb\xe0\x31\x8f\x08\x8f\x1c\x0f\xa5\x5a\xfc\x86\x8a\xbf\x82\xa3\xbf\x1f\x75\x86\x47\x99\x2b\x71\xbf\x47\x8a\x3d\xe4\x88\xbf\x2c\x36\xa7\x31\x27\xdc\x08\x4e\xc9\x12\xf1\x03\xa1\x35\x26\x5c\x2f\x79\x1c\xa1\x03\xdf\x8d\x08\xe6\x6c\x7c\x46\x22\xe6\x5c\x63\xd0\xe3\xe9\x8d\x57\x47\xfe\x0d\x8a\xb2\xbf\x4d\x44\x2a\xc3\xda\x41\x28\xce\xcb\xb6\x50\x87\x3e\x3d\x11\x8b\x98\xa2\x54\xcb\x03\x7c\x18\xf6\x8e\xf1\x74\x6b\x67\x4b\x91\x68\x2c\x89\x34\x61\xdf\x56\xeb\xd1\x24\x96\x5c\x72\xe8\x59\x5a\xf6\xcd\xa0\xfb\x12\x98\xd3\x59\x7d\x2c\x00\xad\xba\x5b\x80\xda\x42\x12\xa6\x20\x92\x58\x45\x91\x0d\x93\x57\xbf\xa1\x5a\x17\x48\xa8\xb3\x2a\x0b\x7d\xc8\x65\xb3\x39\x9e\x0e\x23\x17\xd2\xd8\x07\xfd\x84\x18\x1b\xe2\x57\xff\x9d\x3d\x2a\x62\x45\x25\xb2\x18\x35\x6f\xfc\xc3\xb1\x32\xd9\xe5\x38\xb1\x09\x63\xa5\xcd\xaa\x35\x45\xb1\x98\x6b\x1c\x37\x00\x02\xe8\x90\x75\xf6\xf2\xb7\xb2\x7c\xba\x82\x76\x8c\x21\x0e\xa9\x89\xe6\xad\xee\x57\xce\x92\x89\x41\x51\x3c\x86\x35\xc0\x45\x69\x07\x8d\x35\x01\x9c\x5a\x07\x5e\x37\x26\xec\x31\x92\x4c\xa0\x49\x10\x06\x68\x1a\x72\x3e\x94\x82\xa1\x49\x10\xa5\x18\x3e\x47\xaf\x6a\xff\xbc\xd8\xad\xf7\xab\xe7\xc7\x5f\x37\xdb\xc5\xdd\xda\xdf\x4b\x42\x47\x04\xf3\xa3\x9b\x54\xee\xef\x61\xac\x0c\x4f\x5c\x2f\xd6\x3d\x10\xc6\xb6\x8d\x22\xc6\x92\xc4\x2b\x9c\xc8\xff\x4e\xa5\x8e\x26\x91\x4c\x1c\xb1\x0a\xce\x8f\x5f\xd3\x88\xd6\xf4\xa8\x9b\xd2\x6d\xd1\x84\xb0\x30\x32\xdf\x2e\xaf\x94\x49\x89\xf4\x73\x30\xa1\x01\x37\x95\x79\xa3\xd2\xb5\x71\xdf\x69\x16\x60\x10\xd3\x54\xd4\xdc\xe4\xbf\xf3\xa1\xec\xc3\x95\x9e\xd3\x4c\xa0\x52\x42\xfd\x56\x7e\x6c\x86\x60\x19\xff\x66\x48\x2c\x18\xbd\xb3\x96\x6e\xdb\x42\xd5\xb7\x65\x75\xcd\x54\x4c\x58\x94\xf4\x14\x85\xdb\x06\x4e\xce\x3f\x4a\x18\x17\xda\x30\xdb\x15\x30\x5f\x76\x45\x13\x26\x95\x66\x4e\xba\xee\xa1\x6f\x66\x2f\xc7\x4a\x51\x83\x65\x3a\x95\x55\x73\xcf\x0f\xb9\xcc\xcb\xf6\x52\xd7\x6a\x38\xae\x89\x8a\x88\x2f\x19\xde\xe8\xc5\xa1\x02\xae\xce\x18\xe2\x87\xce\x39\xb8\x19\xec\xd2\xe3\xf1\x4c\xa9\x56\x56\x0e\xf3\xbe\x7e\x1d\x61\xec\x92\x34\x05\x0d\x56\x57\xd1\x7c\xf2\x9f\x65\xe3\xcf\xd8\x24\x15\x2c\x42\x79\xfa\xbb\xc5\x6e\xf3\xf0\x72\x6f\xe1\xb0\xfb\xdd\xd3\xce\x37\xd1\x12\xa7\x38\x6e\x88\xbf\xde\x00\x2e\xaa\xe3\x86\x3b\x57\x92\x85\x34\xea\x09\xca\x56\x65\x79\x50\xe5\x47\xe1\x36\xda\xae\x25\x35\xe9\x43\x1a\xb8\x3b\x58\x8a\x99\x70\x23\x32\x33\xea\x7d\xc6\x25\xc4\x63\xea\xc2\xfa\x1a\xfb\xc8\xc4\x77\x48\xff\x35\x48\x41\x4e\x93\x91\x09\xd7\x0c\x6d\xe7\x95\xed\xe5\x84\x85\xbb\x6b\xe0\x85\x20\x9f\xad\x24\x65\x6f\xc4\xfa\x70\x57\x22\x64\x10\x58\xf4\x3e\x1a\xf1\x7e\x60\x25\x95\x8e\x6c\xd7\xa6\xd0\xec\x74\xed\x8b\x88\x67\xcf\xbd\x44\x6a\xe6\x68\xce\x46\x8a\xa6\xf6\xb2\x62\x42\xa4\x76\xb7\xab\x8d\x66\x7e\xb1\x6c\xcf\xe8\x1b\xae\x9d\x04\x02\x4d\x20\x11\x68\xc3\xd7\xa5\x6e\x24\x3f\x91\x67\xe0\x88\xfc\x73\x97\x33\x66\x75\xbc\xfe\xd3\xd6\x98\x29\x9e\xfc\x7c\xc8\x8c\xea\xd2\x30\x8d\x66\x2a\x2a\xae\xcc\x41\xd0\x26\xc0\xcb\x7b\x1b\xd6\x8f\x85\xb6\x85\x5f\x96\xb5\x74\xfc\x89\x75\xe0\x55\x48\x5c\x71\x6c\x7f\x23\x07\xcc\xd9\xf3\xb6\xc1\x90\xd3\xb2\x6c\xfc\x25\x19\x21\x5b\x19\xaa\xf6\x78\xe9\xee\x29\x1d\xb4\x69\x9c\x06\x91\x29\x68\x58\x28\xaf\xc6\x3d\x51\xed\x19\xfe\xf8\x34\x88\x95\xee\xa9\x9b\x4d\xaa\x6b\x80\x52\x49\x03\x60\xa9\x0d\xd2\x42\xd5\x5c\x8b\x51\xd9\xc6\x61\xc8\x03\xab\x22\xbe\x59\x3d\xee\xba\x4d\x73\x64\x32\xa5\x21\x11\xc8\x75\xb3\x6d\x5e\x1f\x0b\xc0\xe2\xba\x75\x3f\x91\xd2\x90\xc9\x2c\xb6\xf5\x74\x0b\xf5\x7b\x34\xb2\x69\x98\x72\x93\x71\x2a\xf3\xe2\x29\x47\xc2\x95\xd9\xa8\xa0\x6f\x6e\x50\x33\xfb\x0b\x20\xe3\xf8\x6b\xa6\x51\x94\x65\x43\x31\xd3\xc5\xcb\xee\xd1\xf8\xa3\x61\x70\x31\xba\x91\x04\x6e\xf6\xcb\xce\x28\x71\x5d\x23\x54\x92\xc0\xd7\x01\x36\x63\x8a\x24\x9a\x12\x91\x84\x12\x23\x08\x93\x93\x2d\x25\x02\x34\xbf\x0a\xe2\x9b\x45\xe6\x7c\x99\x10\x4f\x69\x68\xca\xc2\x4f\x86\x98\xa2\x5e\x7a\x2d\x97\xea\x8f\x51\xd0\x23\xa5\xc4\x80\x31\x3b\x8f\x1a\x53\x1d\x43\x0b\xa8\x7f\x20\x0b\x09\xa7\x5e\x0a\x1b\xc5\xa2\x8a\xba\xe1\xde\xa7\x49\x59\x94\xa1\xf7\x89\x5c\x6a\x36\xc5\xec\x2e\x65\x01\x96\x5b\x3e\x2d\x9e\x77\x0f\xeb\x67\xcb\x50\xe8\xaf\x72\x99\x59\x53\xd6\x00\x97\x6e\xcb\xca\x7e\xf1\xd9\x84\x68\x1a\x93\x00\xb3\xbd\x0b\xa4\xb9\xaa\x1d\x4c\x65\x32\xa4\x31\xd5\xc8\xac\x61\x2e\x9a\xb6\xbe\x69\xbf\x9b\xa5\x71\x4a\x31\x05\x7d\xaa\x60\x23\x4b\xe3\x8e\xba\xae\xc5\x2a\x44\x4c\x19\x9e\xd9\xa1\xdb\xd3\x7a\x5a\x09\x9a\x26\x61\x40\x32\x4f\xab\x08\xb9\x81\x8e\xde\xb4\xdd\x08\xa1\xb9\xed\x40\x79\x69\x1a\x01\x2e\x5e\x4b\xb6\x81\x46\x44\xe0\x2f\xaa\x58\x1b\x26\xd3\xf2\xf4\xa8\x35\x54\xbd\x35\x9d\x66\x89\xb1\xa6\x5d\x24\x6e\x02\xa8\x9f\x0c\x4e\xc6\x8d\xef\x64\x6b\xa3\x4d\x49\xc7\x64\x68\x78\xa0\x10\x09\x62\x04\x21\x86\xa6\x76\xca\x89\x29\xc7\x36\xd2\x06\xf2\xfd\xa9\x99\xc0\xb1\x52\x27\xc0\xea\x69\x9c\xf3\x23\x1c\x30\x02\xfc\x35\x46\x23\xe5\x09\x8b\x03\xeb\x4f\x6e\x25\x3f\x4e\xfc\xe6\x54\x84\x52\x07\x16\xd0\xbc\x67\x7b\x23\xaa\xf6\x0c\x46\xd4\x27\x2f\x8b\x3d\x4a\xa9\x74\x3b\xd8\xbe\xf3\xc3\x0f\x6a\xf7\x56\x95\x1f\xae\xe3\x32\x4e\xc1\xe2\x66\xbb\x3e\x58\xcc\x62\xed\x62\x27\xa9\x62\x1c\x2d\xe1\xfd\x9c\xcc\xe7\x97\xb1\x8e\x54\x65\x04\x21\x18\x7f\x6f\x2b\xfe\x97\xd9\xac\x54\x65\x19\xe2\x1e\x3a\xab\xfd\xa6\x3d\x9e\x06\xe3\x32\xae\x74\x74\xed\x05\x41\x26\x9f\x85\xae\x72\xc9\x7b\x29\x34\x9a\x2a\xc9\x90\x6b\xe8\xef\x5c\xbe\x9f\xca\x66\xf1\xc1\xab\x81\xd2\xd0\x95\xce\x42\x68\x4a\x14\xf2\x23\xd2\xda\x9b\x36\xc3\x12\xd0\x69\x79\x44\x0a\x0c\x1c\x45\x86\xdb\x23\x6e\xa0\xe1\xf9\x3c\x21\x00\x4d\x21\x0d\x33\xe9\xbe\x53\x79\x82\xc2\xb0\xf2\xf8\x60\x67\x0a\x5c\xc8\x60\x00\x73\xb3\x47\x69\x5f\x1f\x46\x53\xd0\x46\xe5\x51\x1f\xca\xb2\x72\xda\x5d\x34\x0b\x32\x9e\xd8\x52\x1d\x5b\x84\x37\x1b\x3b\xc8\x02\x1e\xe1\x98\x35\xe5\xcb\xc6\x55\xed\xbb\x4b\x4a\x23\x01\x78\xee\xe9\x02\xbf\x34\x3d\xb2\x50\x1b\x25\xd3\xdb\x03\x7c\xe6\x8e\xe2\x72\xcb\xbf\xa8\xc6\x1c\xdf\x4f\xb8\x46\xa3\x4a\x1e\xca\x1a\xac\xb5\x60\x2f\x51\x1e\xa4\xbe\xd4\xcc\x66\x8f\xdc\x25\x69\xc2\x67\x0d\x1c\xd0\x5a\xfe\x51\xa0\x22\x49\x3b\xc0\x56\x65\x54\x27\x28\xec\x77\x07\xea\x15\x0c\xfb\x58\x7b\x21\x3d\xea\xb1\xcd\xf6\x26\x96\x1a\xe0\x7e\xc5\x1b\x78\xd9\xde\x48\xcf\x43\x4e\xb3\x38\xf3\x6c\x71\x86\x15\x6f\x51\xa8\xc5\xf1\x0a\xd8\x34\x4b\x92\x34\x48\xbc\x62\xc7\xff\x41\x31\xeb\xd6\x64\x29\x31\xac\xb8\x56\x2b\xd3\x68\x08\x4f\x9a\x68\xa9\x2d\x55\xc0\x4b\x91\x3b\xa5\xea\x8d\x55\xed\xfa\x0b\xb8\x74\xc6\x43\x53\xcc\x60\x69\x05\xdf\x78\x05\x46\x36\xf1\x4a\x73\x22\x30\x1d\xe2\xe8\x3d\xec\x24\xa8\xa6\x6b\x70\x76\x6a\x67\x3c\xd5\xd2\x24\x6b\x65\x5b\x59\x85\x6a\x74\x46\xd0\xb3\x1a\xd9\xc2\x7f\x9b\xa4\x10\xa6\xff\xda\x27\x8a\x8c\x42\x36\xd8\xbc\x77\x9f\x13\x17\x3d\x93\xc4\x90\x11\xbe\xda\x30\xc9\xa3\x01\x92\x6e\xea\x2d\xcc\xd3\x46\xd2\x4c\x11\x81\x96\x8a\x29\xe6\xc1\xf0\x80\xbb\x92\x69\x6d\xab\x8b\x1a\x2b\x3b\x35\xd9\x66\x33\x00\x26\x3c\xbf\xd1\x4b\x71\xea\x49\x31\x68\xa6\x33\x83\xcc\x5b\x6f\x9e\x92\x30\xba\x79\xbc\x5f\x6c\x1e\xf6\xbb\x3f\x9f\xd6\xdf\x17\x5b\x3f\x8f\x34\x70\x27\x68\xf9\x93\x57\x79\x77\x98\x5d\x25\x99\x99\x74\x5c\x83\xc6\x75\x7b\xe4\x9f\x8b\x22\x3f\x72\x0f\x2e\xe3\x41\x6c\xea\xc9\xf3\xfa\xc7\x9f\xab\x27\x5e\xd7\x57\x04\xd4\x29\x0f\x14\x57\xae\x86\xa1\xf3\xce\x7a\x15\x25\xca\x43\xa2\x91\x5d\x80\x6b\x9d\x1f\x72\xde\x18\x30\x81\x25\xc3\xf1\x8d\x00\x4c\x66\x8b\xd7\xe8\x41\xb8\x70\x80\xa3\x67\x70\xcd\x34\x60\x66\xd7\xc9\xcb\xfd\x02\x78\x3f\x9c\x07\xd5\x99\x46\xbe\xca\x70\x69\x0c\x38\x5a\xed\xed\x91\x8c\x71\x98\x2d\x77\x4b\x44\xb6\x9e\xff\x9c\xf2\x48\xc5\x31\x75\x24\x16\xe6\x18\xbd\x05\xac\x80\x99\x3c\x04\x62\x43\x28\x65\x25\x29\x2e\x4b\x43\x87\xde\x34\x8f\xb4\x01\x10\xd5\xd0\x38\x49\xe7\xf1\xf3\x48\xc8\x50\x7e\xe4\xc4\xe5\xfb\x25\x84\x9e\x93\x34\x14\xe9\x40\xd6\xe9\x79\xa2\x6b\x44\x39\x95\x02\x73\x92\xb8\x15\xdc\xe7\x87\x77\x77\x2b\x85\x08\x63\xa0\x1f\xc0\x4f\x9d\x49\xe1\x85\xe6\xc6\x1d\xa0\xda\x88\x3a\xa2\x7a\x82\x61\xb4\x99\x00\x09\x38\x0b\x28\xda\x5c\x6d\x61\x49\xe0\x41\x19\xb0\x8e\xef\x26\x23\x0c\x23\x9a\xc6\x55\x79\x80\x8f\x89\x7c\xc1\xe8\x3c\xe6\x4c\x84\x18\xc4\x74\xba\xdd\x5f\x47\x7d\xec\x4d\x49\x16\xcb\xd0\x79\xc2\x1a\x2a\x98\x58\x97\x3c\x0d\x99\xe3\x08\xb9\x3f\xef\xda\xaa\xf1\xd1\x6b\x9e\xb2\x0c\x11\x48\xcb\xc5\xc3\xea\xf1\x79\xff\xcf\xfe\xef\x02\x9f\xc9\x0f\x87\xf2\xc3\x80\xbb\xa7\x0f\xcd\x00\x33\x1d\x07\x28\x5e\x9b\xb7\xbe\xea\x7e\xbc\x8a\x78\xca\xe3\x24\x18\xec\x18\x73\x94\x1e\x94\xa7\x82\x25\x16\x73\xa1\x3a\x7f\x04\x79\xcc\xba\x0f\x4e\x26\x6f\xcd\x68\x24\x0d\x40\xac\x2d\xde\x07\x75\x7f\x3c\x8b\x13\xe6\xea\x50\xce\x26\x80\xdd\xfd\x4b\xa2\x71\xfd\xbb\x6d\xcd\x33\xca\x87\x8c\x47\xd7\xc6\xf9\x12\xa7\xc2\x15\x89\x04\x0c\xc8\xf7\x77\x15\x4c\xb7\x2d\xae\x04\x45\x72\x32\x24\x13\xbc\x81\xba\xc9\x0b\x7e\x29\x67\x46\x39\x84\x31\x4f\x87\xd0\xa0\xcd\x24\x85\xc8\x81\x84\x86\x1e\x14\xc1\xca\x03\x52\x20\x2a\x02\xa6\xa9\x2d\xc5\xd8\xbd\xf5\x65\xa0\x5f\xd4\x44\x88\x20\x96\x98\x83\xde\x02\xa8\xed\x54\x7f\x88\x8a\x90\x42\x60\x8d\xf7\x6d\xfe\x5a\x20\x49\xd6\x38\x09\x27\xc2\x8c\x61\x48\xb4\x8a\x26\xf7\x46\x94\x63\xb9\xf8\x90\x4f\xcf\x5d\x4a\x29\x7a\x92\x7b\x54\x27\x52\xd0\xed\x61\xeb\xe6\xed\xda\x98\xbb\xbb\x32\xa2\x6c\x67\x96\xed\xf9\xb9\x1b\x3f\xff\xc0\x2c\xe6\xc9\x90\xcf\xa3\xac\x86\x90\x7f\x11\xf1\x18\x07\xed\xdb\x81\xff\x5e\x55\xe7\x53\x83\x47\xbd\xbf\x0a\x52\x5a\xb2\x6c\x03\x4a\x9a\x57\xbf\xa6\x82\x30\x8d\x18\xe2\x9b\xcd\x4f\x77\x2f\x49\x32\x34\x85\x80\x57\x45\x5e\xbc\xd6\x8f\x7a\x64\x2a\x09\xc2\x59\xd8\xb3\xd2\xd9\x58\xf5\x80\x3e\xfc\x82\x3a\x95\x0a\x1a\x68\x24\xb1\x6c\xde\xe5\x78\x87\x13\x54\x69\x8c\xc1\x3f\xf1\xf3\x40\x92\x96\x0a\x46\x19\xa2\x62\xef\x17\xff\xdc\x6f\x3b\x37\x75\xe1\xcb\xb1\x04\x93\xca\x84\xea\x7e\x1b\x7a\xa5\x0b\xc4\x9d\x4d\x10\x38\x1b\x4c\x30\x9d\x22\xde\xe3\x6e\x37\xaa\x0c\x14\x71\x64\x84\x60\xad\x6b\x66\x9e\xb0\x85\xa6\x19\x32\x7c\x4f\xad\xa1\xb9\x39\x17\x27\x60\xf5\xe2\xcc\x7a\x79\x46\x1b\x32\xfa\x63\x80\x58\xeb\xc3\x7e\x22\x16\x0c\xed\xaf\xbc\x18\xd4\xc8\xf9\x3e\xc9\x08\xd1\x18\xa2\x91\x46\x9a\xba\x2a\x7f\xe7\xaa\x1f\xfd\x58\x83\xb5\x88\x0a\xf5\xd3\xd7\x5d\x88\x24\x94\x58\xc9\xbb\x59\x3d\xee\xef\xd6\x3f\xd7\x77\xfb\xd0\x5f\x4a\x43\x9e\x8e\xbe\x57\x5f\xc3\x79\x8d\xdc\x8e\x8a\x44\x1a\x69\x7e\xe9\x40\x40\x3f\xcb\x66\x40\x6e\xe0\xdd\x75\x91\x06\xda\xb0\x3a\x15\xd2\xcc\x93\xc7\x8f\xcb\x3d\xdd\xb6\xcd\xa2\xc8\xe1\x48\x7e\xe2\x8e\xf1\xea\x10\xe6\x7f\x45\xb5\xf2\x05\xda\x4f\x64\xa9\x09\x74\x6c\xf8\xeb\xd8\x79\x16\x9c\x33\x1b\x5e\xc7\x83\x2b\x9a\x32\xb5\xb9\x98\xac\x6b\xae\x29\x86\x54\x36\xff\xd8\xed\x6f\x5f\x1e\x6e\x8c\x24\xfe\x48\xb7\x81\x0a\x11\x84\xf8\xcc\x37\x5e\xbf\xed\xeb\x37\x4e\x66\x77\x7b\x21\x99\xe2\x26\x05\x51\xb7\x47\x98\xd4\x77\x0b\x99\x08\x77\x16\x18\x71\x06\x5b\x6e\x37\xfc\x59\x2a\x05\xe4\xb0\x2a\xda\xe3\xde\xaa\xa5\xfa\x65\xa3\x80\x61\xc8\x0d\x3d\x19\x4b\x24\x35\x94\x98\xa5\x02\x84\xb2\xf1\xa6\xb6\x86\x3b\x5e\x1b\xee\x5f\x77\x55\xeb\x30\xb2\xda\x1a\xcb\x03\x97\xef\x58\x83\xd1\xc0\x04\x4b\x2e\x83\x38\xc3\x12\x42\x77\x84\x6c\x8a\xb5\xab\xee\xb5\x4f\x92\xa1\x20\x08\x31\x6d\x3c\x26\xc9\x46\x65\xf6\xbe\x85\xcc\xa8\x09\xf3\xaa\x69\xd4\x4e\x86\x2a\x45\x5b\xbb\x33\x99\x1d\x93\xf0\xac\x95\x29\xa3\x08\x10\x7b\x83\xfc\xba\xc8\x7a\xf7\xdb\xcf\x7e\x19\xd1\x08\x8f\x89\xa6\xad\x8a\xee\xb7\xfa\xbf\x43\x82\xac\x32\x86\xf7\x69\x6c\x3a\x49\x12\xa4\xf6\x90\x6b\x96\x50\x80\xce\x65\xce\xab\xf3\xca\xcb\x36\x51\x49\x92\x10\x91\x21\x35\x6f\xca\xfa\x2d\xdf\x8b\xe6\x6d\xaf\x40\x0e\xed\x64\x49\x32\xc3\xf1\xb4\xfd\xb5\x78\xda\xaf\x16\x0e\xc0\xde\x39\xa2\x4e\x9a\x62\xc5\x4f\xfe\xaf\x3c\xc5\xe2\x34\xd1\x9e\x1f\xe0\xe3\xa6\x2a\xa7\x35\xf7\x92\xaa\x00\xcf\xa7\xd5\xf3\x72\x87\x73\xf9\xae\x0f\x7f\x49\x0a\x04\x1d\xf9\x6f\x8f\x77\x37\x2e\x49\xb2\xfd\x71\xd7\x5f\xa6\x68\x59\xb9\x8a\xcb\x3d\x22\x90\xa6\xc1\x11\x9c\xf1\xff\x22\xee\x13\xb0\x80\x1b\x00\x4f\xae\x9b\xaf\x50\x05\x92\x65\x12\xdd\x0c\x68\xde\x36\x8e\x53\x44\x76\xc7\x87\x41\x77\x57\x20\x39\x2e\x69\x54\x3c\x77\x07\xa3\xec\xdc\x08\x83\xf1\x3c\x9b\xd4\xf3\xd7\x19\x36\x19\x27\x31\x76\x67\xf7\x3c\xda\xab\x65\x9c\x0a\x4a\x9d\xdf\xe6\x03\xb9\xb7\x65\xe5\x89\x63\xfb\x67\x24\x94\x89\x78\xa0\xc5\x73\x8b\xd8\xaf\x2b\x3f\x2b\xa5\x11\x1e\x77\x7b\x38\xe6\xcd\xdf\x4b\xb1\xcc\x87\xf2\xd1\x33\xfb\x8d\xcc\x02\x85\x8b\xd7\xad\x8a\xef\x65\x5b\x43\xb7\x93\xfa\xeb\x9a\x4a\xb7\x24\x5e\x6a\xa8\xea\x2d\xff\x3d\xb1\x43\x24\x87\x34\x8d\x3d\xc1\x5e\xcb\x0f\x3b\xa3\x86\xef\x40\xf4\x83\xf7\x89\x28\xb3\x4a\x94\x27\x9e\xfb\x81\x15\x82\x65\xa1\xd5\x87\xf1\x19\x09\x29\xac\xb6\x59\x5e\xef\xca\xb6\x7a\xb1\x28\xcf\x89\xd5\x2f\x85\xe6\x46\x65\xa5\xc6\xa0\x71\xd5\x0e\xb8\x02\xa4\x0c\x63\x8c\xe6\x76\xe7\xf8\xb6\x18\x84\x9d\xdc\x75\x66\x04\xc9\xb9\x52\x5b\x84\xd4\x8d\xe7\x97\x6b\x15\x03\x32\x72\xee\x5e\x01\xbd\x42\x23\x98\x35\xd8\xf1\xfd\x96\x38\x3f\x0f\xa4\x8e\x81\x0f\x2b\x25\x4d\x94\x77\xdc\x48\xa7\x1c\x33\x9c\x36\x47\x62\xd8\x1c\xc6\x85\x97\x7f\x79\xa0\x4c\x2a\xc6\xa4\xce\x08\x66\xf2\xef\xa1\xe1\xf7\x65\x75\xf2\xbb\x81\x96\x0c\xf7\x8b\xa7\x6f\xeb\x20\x7c\x70\xd1\x72\x15\x84\xd4\xc9\x94\x3d\x55\x60\x30\x70\xab\x32\xf7\xe9\x11\x15\xa6\x02\x03\x5a\xbd\xdc\x7c\x59\xbe\x2d\x2f\x83\x9e\xb6\x79\xc4\x22\x4c\xea\x1a\x3a\xef\xb1\x69\xaa\x22\x96\x71\x8b\x46\xda\xd4\xe3\x72\x94\xfe\x27\xa8\x28\x49\x0d\x92\x67\xb7\x9b\xc4\x9b\xc7\x9b\xaa\x8a\x84\x29\x35\xc1\x14\xc1\x70\xb9\x29\x92\x45\x88\x4a\x94\x03\x39\xcb\x8d\x1a\x1d\x31\x8a\x46\x11\xa2\xf8\x9e\xa1\xce\x55\xcb\x0f\xdb\x21\x53\xeb\x9c\x9d\xa4\xa8\x56\x2e\x10\x89\x9f\xd3\xb2\xe8\xed\xf2\x23\x2c\x79\xbf\x69\xa8\x38\x56\xc8\x79\x97\xfb\xba\xbf\xf1\xea\x51\x49\x12\x60\xbe\xae\x28\x15\xf4\xa6\xed\x78\x20\x13\x91\x61\x78\x0d\x8b\x5b\xdd\xb4\xd8\x7e\xe4\x03\x59\x96\xf9\x10\x97\x4a\xb9\x59\x1e\x3f\xa1\xe0\x83\x42\x54\x95\x85\x41\xa4\x5d\xe9\xc0\x67\xb3\xb9\xf1\x3f\x76\x74\x7b\x96\x50\xdc\x1f\x8c\x00\xde\x33\xd4\xd7\x37\xbd\xc9\x8b\x39\x8f\xd0\x65\xc3\xf4\xc6\xed\x85\xcf\xa5\x84\x8e\xa3\xc8\x6c\xa6\x33\xf0\x5f\x25\x43\x86\xa4\xcb\x8e\x21\xec\x69\xa4\x9a\x4b\x95\xe4\x2a\x74\x52\x89\x03\x0e\xa5\xf1\x43\x14\x11\xe8\xee\xa3\x93\xd3\xed\x5e\xbd\x9b\x34\x13\xb2\xeb\xe9\x02\xbf\x60\x0d\x4c\xdd\xa3\x19\x47\xc9\xab\xbc\xee\x0e\x69\x24\x7d\x5f\x5f\xab\xad\x51\x4a\x81\x52\x7d\xfe\xc0\x05\x8f\x47\x79\x5b\x05\x8a\xba\x02\x6e\x93\x28\x5a\x42\x53\x8f\xcb\x30\x6c\x4b\x4d\xc2\xc0\x00\x6f\x3a\xd7\xcc\xe2\x20\xd1\x10\xc6\x98\xd3\x78\x24\x21\x0c\x25\x6e\xae\x5e\x3b\xe5\x1a\xe4\x19\xc2\x08\x06\x2a\x2b\xf7\x79\x81\x14\x95\x73\x38\x44\x08\x63\x81\x3a\xa2\xbe\xea\xf5\x0b\x90\x25\x84\x49\x86\xa6\xf2\xbe\x2c\x1e\x7f\x83\x5d\x22\xd6\xb1\xba\x16\xd7\x4b\xff\x45\xfe\x8d\xff\x17\xda\xc3\x1d\xa2\x0c\x62\x7b\x12\x62\xd8\x74\x04\x83\xbd\x92\xb7\xb8\x96\x84\xb1\x8f\x24\x54\xa1\x13\xdc\xd9\x61\xb8\x88\xc7\xbf\x75\x7e\x49\x01\x49\x02\x97\x53\xdc\x1a\xba\x80\x66\x98\xf4\x03\xc2\x63\xcb\xd6\x50\xd5\xcd\x50\x39\x92\x02\x0d\x45\x14\x5d\x9c\xfc\xee\x2a\x13\x09\x26\xea\xcc\x11\x60\xb2\x8a\x8b\x42\x3d\xf1\xb3\x0b\x8f\x38\xd8\xf5\x4c\xb8\x63\x1a\xf8\x00\xa6\x15\x26\xd5\xf7\x35\xd7\x9e\x7e\xbf\x7b\x90\xe7\x59\xbe\x76\xac\x0c\xfc\x08\x88\x23\xc3\x10\x7c\xe4\x9f\x38\x38\x43\xa8\x29\xc4\x9c\xf3\xd8\x97\xde\xa0\x17\xb6\x51\x23\xcb\x14\x62\x19\x63\xcc\xbc\xec\x0e\xce\xb1\xc3\x0c\x49\x60\x92\xe2\xc7\x52\xbe\x7b\x30\x8b\xbf\x33\x09\x0d\x89\x39\x0e\xa3\xd5\xa8\x1c\x00\xa3\x20\x51\x21\x9a\x26\x08\x48\xb2\x12\xfb\xe3\x0f\x95\x32\x81\xdc\x52\xfa\xd0\xd6\x6f\xa3\x3c\x3f\x64\xc4\xb0\xab\x89\xbc\x50\x7f\x2f\x45\xb7\x8e\x96\x25\xaf\xae\xd4\x7d\x42\x96\x1a\x82\x90\x6d\x7e\x3c\x1d\xc0\xe6\xa4\xfa\x0a\xc3\x69\x6b\x48\x03\x2b\x6a\xe0\xa5\xe2\xc7\x2d\x38\x37\x58\xe2\x3d\x82\xa5\xf6\x68\x5d\xed\x37\xab\x47\x97\x51\x04\x11\x09\x62\xea\x83\x9b\xce\xe0\x1a\xa2\xf4\x26\xde\xbb\xbb\x21\x05\xfc\x4e\x2e\x73\xba\x87\x21\x45\xc6\xa4\x83\x52\x0b\x3c\xfe\xef\x8d\x2b\xb6\x7a\xe3\xc7\x53\x5e\x16\x17\x7c\x9d\x14\x00\x40\x64\x56\x1e\x03\xab\x76\xc5\x94\x2f\x06\x74\x68\x6a\x9a\x30\x9c\x59\xf4\xa5\x41\xe6\x90\x9a\xad\xdf\x06\x9d\x45\x98\x0b\x78\x3c\xe6\x35\x7c\x7b\xfc\x56\x1e\xfc\x12\xd1\x56\xb9\xcf\x3a\x27\x4f\x15\xc8\xbc\x27\x02\xa6\x3a\x88\x05\xcf\x6c\x15\x7c\x35\x21\x0f\xa5\x3a\x48\xa4\xd6\x0e\x32\x6f\x95\x50\xfa\xc0\xf6\x46\x5d\x0a\xfe\x4c\x6c\x26\x1d\xf0\x00\x09\xbe\x96\xbb\xd5\xb0\x32\x51\x87\x51\x88\x94\x54\x47\x53\xe8\x6d\xf1\x3f\x8b\xc6\x5f\xa7\xa1\xb6\x07\xea\x2f\xc8\x9f\xa0\x5a\x7d\xbf\x9d\x74\x2e\xa4\x12\x93\x9b\x95\xcd\x3b\xcf\x5b\x32\x3a\x94\x80\x68\x3e\x79\x00\x5e\xad\xda\xca\x48\xc1\xcc\x7e\x49\x1d\xf1\x18\x1d\x52\x74\x25\x7f\x71\x8f\x16\xd1\x11\x4f\x10\x43\xf2\x0d\x0a\xd8\xca\x1c\x2e\x58\xf2\x34\x61\x0a\x09\xe5\x7a\xda\x8e\x19\xfe\x35\x4d\x62\x22\xec\x80\xfe\x34\x61\xff\x6e\x1f\x9a\x36\x92\x41\xe6\xb1\xf7\x75\x2e\x9f\xf9\x45\x13\x46\x59\xec\x7d\xde\xa6\x15\xb0\xe3\x63\x60\x9d\x66\x52\xa5\x91\x5b\xef\x53\x7d\x44\xaa\xe3\x28\x20\x8e\x8a\x0a\x63\x33\xb3\x28\x4d\xdb\x38\xd1\x21\x86\xd5\x6a\xc9\x0f\xa0\x4c\x78\xf3\x69\xc4\x92\x4a\x75\x1a\x85\x88\x23\x1a\xed\x8f\x57\x86\x39\xe5\x0a\xc1\x67\xb2\x2c\xea\xf6\xb0\x2f\xfc\x2e\xa4\x53\x91\x61\x1e\xbd\x01\x54\x5e\xfe\xda\x23\xd4\xa9\x26\x4e\x10\xc1\xc6\xaf\x26\x15\xd3\x3a\x63\x61\xe0\xc8\x6e\x5e\x8a\x13\x3f\x83\x72\x29\xa6\x49\xc3\x34\xe1\x3d\x2e\xf4\x57\x59\x5d\xd4\x1c\xe8\x2c\xe3\xd8\xc4\xd0\x1a\x39\xd4\xdd\x78\x13\xd6\x3c\x33\x04\x44\xaf\x3d\x2e\x0f\x87\x69\x10\x06\x1f\x81\xca\x47\x8b\x5f\x73\x9e\x21\x29\xf2\xb2\xca\x8b\xf9\x6a\xdc\xf6\xa2\x50\x51\x0b\xc5\xcd\x22\xcd\xc5\x1d\x3f\x8a\x72\x62\x5c\x68\x49\x38\x1e\xa0\x27\x43\x60\x68\xb2\xe6\xc3\x93\x52\xcb\x34\xc3\x98\x91\x68\xc5\x00\x3c\xac\x25\xb0\xcc\xb0\xf8\xb5\x55\xf3\xe6\x58\x80\xf0\x64\xef\x4e\xea\x21\x0c\x4c\xab\x28\x8e\xb8\x2b\x15\xf3\xb4\x3f\x33\xde\xf2\xfc\x97\x54\x3c\x22\x30\x2a\x60\xd8\xc8\xb2\x5b\x4a\x98\xd2\x99\xe8\x33\x77\xbe\x42\x8c\xd9\x2f\x0c\x61\x6d\xa4\x0b\x8d\x6b\x88\xe2\x84\xf9\xaa\xf1\xa6\xdc\x28\xcb\x06\x3b\xa5\xe7\xd4\xa0\x12\x9c\x68\x5c\x29\x74\xd2\x4d\x19\xec\x95\x00\x87\xd6\x24\x46\xa1\x99\x31\x0d\xff\x95\x6a\x30\x16\x04\x49\x84\x80\xc2\x9b\xdd\x60\x89\xb0\x20\x00\x8e\xac\x0a\x6d\x0d\xd5\x13\xa0\x46\xf6\xaa\xe2\x0d\x58\xdf\x69\xf8\x13\x59\x10\x06\x11\x15\xbe\x6a\x60\xd5\x9a\xfa\xa2\x3f\xc6\x2f\x0a\x59\x80\x0e\x24\x72\xf8\xdc\x3f\x3e\xec\xbe\x3b\xac\x16\x0b\x42\x61\x0b\x48\xa1\x31\x3f\xee\x5e\xce\x9d\x1e\x2c\x20\x61\x10\x82\x8b\x47\x15\xc8\x52\xdd\xdb\x5f\x2c\x20\x49\x12\x29\x8f\x5b\x7e\xe9\xe6\xdf\x80\x4d\x8b\x05\x84\xa7\x4e\xb9\x74\x07\xfc\x78\x3b\xc9\xbf\x61\x8e\x90\x12\x2b\x4d\xb2\x05\x57\x54\x3d\x67\x42\xb2\x80\x52\x81\x15\x0e\x79\x7d\x03\xb5\xac\x72\x44\x3d\xdd\x5a\xa7\x45\xb9\x9f\x46\xb3\x04\x8b\x0c\x86\xe0\xb4\xee\xaf\xa6\x30\x4d\xc1\x6f\x38\x94\x27\xa8\xf6\x66\x99\xf8\x42\xd6\xfd\xef\x19\x4f\x81\x05\x54\x18\x12\xf7\x55\x79\x28\xab\xfa\xde\xa7\x1a\x58\xc0\x82\x54\x0d\x8a\x19\xec\x59\x7c\xd3\x56\x83\xad\x94\x05\x4c\xa6\x08\x90\xfc\xbf\x4f\xb9\xf5\x27\x2f\x0b\x18\x18\x0d\x7d\x28\x54\xcf\x78\xc9\x82\x98\x2b\xec\xbb\xd5\x9e\xf0\xd0\x50\x2c\x45\x9b\xe2\x7c\x59\x90\x44\x21\x72\x3b\xfc\xa7\x45\x99\x2b\x07\xa2\x62\x41\xca\x88\x66\x9e\xb6\xef\x09\xf7\x24\x9b\x65\x73\x2d\xd2\x18\xdf\x84\xe0\x9f\x55\x59\xd4\x50\xd4\xe7\xfa\xa1\x6c\x46\x60\xdb\xee\x37\x1a\x76\xc9\x0a\x40\x41\x05\x47\x63\x63\xd7\x93\x8e\x64\x31\xc7\xa8\xb1\x06\x18\x52\x56\xcf\xad\x17\x16\x64\xd2\x14\xaa\xe0\xf4\x77\x22\xf2\xee\x9a\x12\xc4\xee\x90\xf8\x3d\xce\x58\x22\x32\x9e\x06\x1c\x38\x66\x10\x51\xdd\x1c\x83\x07\xf3\x4e\x16\x0b\x84\x30\x3c\xcd\xdd\x30\x40\xdb\x54\xfc\x70\xef\x0a\x92\x07\xe6\x2f\x0b\x84\x8a\x90\x7d\xaa\x31\xd4\xc6\x37\x50\x94\xc7\x6e\x3f\x2e\x7d\xbf\x04\x04\x68\xde\x1e\xcf\x4f\x07\x5e\x40\x33\xda\xa6\x27\x2f\x05\x4f\x1e\xfb\x64\x0f\x03\xb4\xa7\x27\x43\x26\x29\x75\x05\x90\x76\xea\xcc\x48\x5c\xb2\x40\x66\x89\xea\x95\x4f\xb6\x4d\x59\xf1\xd7\xe9\x80\x48\x91\x99\x6f\x69\x0f\x56\x23\xca\x71\xc1\x69\x33\xe9\xa7\x4a\x8c\xa6\xc7\xcd\x62\x35\xda\x88\x54\x4a\xb1\xb4\xfd\xe9\x71\xbb\x72\x7f\x03\x19\xda\xf2\x84\x53\xb9\x38\x9d\x36\x7e\x7a\xe8\xd0\xe4\x50\x2c\xc7\x3c\x12\x5b\x8d\x60\x1a\x2c\xd0\x69\x84\x4c\x6e\x9b\x5f\xbc\xbe\xed\xec\x8d\x2d\x54\xbf\x73\x09\xa3\x97\x6a\xcd\x70\x7c\x25\x2f\xb6\xad\xb8\x24\x0b\x1d\xf7\x3d\x0c\xc2\x14\xfb\xf8\xfb\xa4\x47\x6a\x4e\xb3\xbf\x34\x0c\xa8\x24\x36\x7e\xe1\x80\x71\x8b\xa3\xeb\x5f\x18\x30\x43\x90\x88\x4e\xe2\xfa\xe6\x65\x78\xfa\xb1\x30\x90\x59\x10\x5f\xa2\x7a\x1e\xda\x23\x54\xb9\x9c\x9f\x77\x61\xa0\xb8\xe3\x52\xa9\xa7\x0e\x49\x77\x55\x60\x19\x62\x6b\x00\xf0\xdb\x26\x3f\x1c\x96\xed\x79\x90\xf6\xf5\x0d\x8d\xb6\xa4\x29\x77\x75\xe6\xfd\x2d\xd6\xe3\xf9\x63\x26\xfd\xb7\x6b\xad\x13\x93\x65\x36\xf2\xdd\x07\x90\x73\x45\x7b\xff\x72\xcd\x43\x12\xe2\x19\x27\x79\xb1\x84\xed\x44\xc1\x8d\x85\x21\x27\x66\x91\x3a\x74\x28\x96\xb3\x5e\x8f\x3c\xb0\x30\x14\x01\xc6\x77\x9d\xe6\xdb\xcd\xee\xe7\xbc\x54\xf1\x75\xd9\x3b\x16\x86\xa0\x4c\xe5\xf2\xa1\xac\xc1\x4a\xcb\xd9\x4b\x51\xc8\x10\xc7\x63\xb9\x5d\xbb\x15\xd8\xbb\xa8\x2c\x8c\xa2\x58\x10\x03\xf9\x2a\x91\x0e\xf2\x15\xee\xf3\xa2\xc9\x8b\xd7\x9b\x7e\x83\x0d\xa3\x8c\x20\x41\xec\x16\xc0\xf8\x83\xfe\x82\x0a\x91\xd4\xbe\xdb\x0f\x57\x2e\xe2\xba\x69\xe0\xe8\xe7\x7a\x48\x22\xce\x2c\x54\x64\x85\x63\x6c\xfa\x77\x03\x35\x46\xba\x3a\xdb\xd7\xb0\x51\xdb\x0f\xf5\xb3\xa7\xaf\x63\x21\x21\x29\xa6\x94\x50\x83\xb4\xe2\x26\xd2\x3b\x3f\x90\x84\x09\x6e\x88\x4e\xe4\xfb\xb9\x68\x8f\xfe\x11\x36\x7f\xfd\xe3\x26\x1c\xae\x9d\x90\x28\x86\x20\x7b\x43\x7e\xb8\x50\x6a\x40\x92\x3c\x3c\xcb\x42\xa2\x63\x4c\xb9\xae\xef\x9f\x76\x7f\xee\x9f\x16\xcf\x8b\xfb\x7d\x0f\x08\x63\x21\x65\x81\xe4\x03\x8c\xdb\x46\x2d\x9a\x9e\xd8\xbf\xef\x60\x67\xf2\xa0\x6c\x1d\xaf\x9b\xbc\x2f\x0e\xbe\x1e\xc1\x65\x21\x8b\x02\x66\xb1\x83\x38\x2c\x91\x7b\x27\x8b\x23\x5c\xc9\x6a\x86\x6c\xf2\x4b\xb3\x90\x85\x71\xb7\x0b\x38\xd6\x80\xce\xa0\xa4\xee\xa1\x71\x04\x88\xb8\xfc\x0d\x85\x9a\x88\x80\xb1\x30\x26\x0c\xe3\xbb\xc2\x0d\x57\x6f\xa1\xb3\x30\xc9\x4c\xb5\x47\x03\xfc\x18\x58\x14\xa4\xbd\x94\x86\x91\xa1\xad\xce\x0b\x5e\xc8\xbc\x78\x1d\x86\x9b\x58\x98\x05\x19\xd6\x51\x62\xa9\x43\xe1\xb8\x56\xfd\xdd\x59\x67\xe1\xa1\x28\x6e\x83\x9b\xe4\x7e\xd2\x2b\x1e\x65\x10\x8c\x29\x25\x31\x43\x65\x2f\x0b\x30\xd4\xfe\x98\x99\x43\x2a\xa7\x6f\x16\xf5\x36\x3f\xec\x93\xa1\x12\xda\xd0\x62\xad\xd6\x9b\xbb\xcd\xc3\x37\xf7\x54\x29\x59\x16\x8d\xe1\x6b\x3d\xbb\x4c\x6f\xe5\x85\x52\x31\x54\x1e\xec\x46\xf9\x17\xaf\xea\xe7\x5d\x2d\xbd\x36\x5f\x77\x39\x76\x1a\x52\x77\xa5\x7c\x9f\x00\x4c\x27\x5d\x91\x10\xe2\x89\xb1\x83\x03\xbc\xf2\xc7\xb6\x99\x6c\x7a\x52\x87\xc6\x23\xe7\x07\xb9\xe4\x98\x20\xbb\x2d\xab\xf1\x31\x6f\x9b\xaa\x30\x16\xb1\xa7\xba\x73\x85\xa2\xbf\x20\x77\x1d\x53\x32\x43\x0e\x7b\xf8\x3c\xe5\xd5\x79\xf5\x06\xf2\x7d\x64\xdd\x45\x01\x8d\x8d\x0d\x57\xdf\xc0\xe9\x50\x9e\xbd\xdd\xd3\xf9\xab\x48\x8d\x89\x75\x5d\xdb\x86\x17\x6a\x18\xb1\x9a\x80\x4f\xa7\xda\xd3\x2c\x0a\x69\xa8\xb8\x8b\x86\x6f\xf3\xd7\x31\x03\x0a\x8b\xc2\x98\x62\x0d\x72\xd5\x53\xa4\xb8\x2b\x89\xc9\x8c\x7e\xae\xcc\xae\x7f\xdd\x9f\xf8\x52\x69\x87\x45\x24\x34\x47\x2a\x57\x6a\xa8\xfc\x78\x61\x56\x47\x44\x31\x65\x93\x43\xc8\x0c\xf9\xc4\xab\xc6\xe1\x0a\xc6\xff\x8c\x5e\xe8\xee\x06\x8d\x25\xf0\x3f\x1f\x6e\x30\x07\xfe\x57\x2e\x29\x8b\x68\x08\x51\x36\xe6\x1f\xb4\x3c\xf1\xae\x41\xc4\xa5\xf5\x6e\x5c\xc0\xe4\x92\xd2\x95\x45\x34\xa6\xcc\xd5\x53\xe4\x47\x03\x11\x9d\x91\xa6\x65\x51\x12\x98\x7c\xfc\x7f\x14\x3f\xc0\xef\x1a\x4b\x5a\xea\x1e\xa0\xcf\xa2\x84\x18\x85\xb1\xa7\x5b\xac\xd9\xb8\xca\xac\x35\xb7\x1f\x39\x88\x30\x8b\x92\x44\xe1\x38\xe6\xf5\x93\x65\x1a\xac\xae\xe8\xdc\xb2\x28\x8d\x74\x32\x44\xfe\x18\xb7\xf6\xb6\xac\xac\x90\x80\x5d\x43\xd3\x6a\x30\x16\xa5\x1a\x90\x90\xfb\x66\xc4\x62\xce\xa2\x2c\x92\x71\xe2\xc5\xce\x1d\x62\xa3\xfb\x3b\xa8\x6c\x98\x45\x5c\xbf\xbe\x0e\x83\xa4\x93\x49\x93\xa5\x09\x5a\xa5\xdd\x07\x7b\x87\x41\x50\x8e\x45\x99\x30\x91\x56\x67\x65\x76\x9f\x66\x14\x2b\x9d\x4c\x4b\x7b\x1b\x17\x49\x92\x0e\xb0\x14\x5f\x1a\xa5\x11\x57\x1a\xd7\xcd\xb2\x14\xf5\xc3\x4f\xfe\xea\x5e\x2e\x54\x4a\x6c\xf4\xfb\x86\x9f\x4e\x66\x3a\xcc\x55\x15\xb1\x48\x66\x24\x96\x7e\x7a\x2d\xcf\x1b\xe5\xcf\xaf\x7e\x0d\xb9\xb6\x96\x28\x06\x9f\x67\xb9\x6f\x8c\xfd\xb7\x77\x6f\x96\x0a\x1c\x78\xf2\x19\x14\xc0\x91\xbb\xe2\x82\x1a\x85\xe1\xaf\xf4\x02\x68\xa0\x82\x41\x3d\xd1\xfa\xf3\x64\xca\xd8\xed\x75\x1d\x44\xe8\x00\x2e\xef\xb6\xfb\xa7\xe7\xf5\xde\xf3\x05\xb1\x48\x67\xa6\xf2\xc1\x22\x8e\x3d\x45\xe1\x05\x95\x89\x69\x4f\xc2\x28\xc4\xa4\xd3\x2f\xc8\xf1\xe8\x28\x0f\x33\x0a\x44\xd7\x75\x4b\x18\x09\x65\x84\x15\x56\x60\x38\x1f\xc7\x0f\x57\x0c\x45\x83\xb7\xbb\xe7\x97\x51\xc0\x82\x90\x24\x73\x87\xc7\xb2\xac\xeb\xef\x4f\x37\xa0\x51\x62\x77\xdc\x3b\x92\x18\xae\xbe\x8a\x17\xaa\x3c\x46\xfe\xee\x2c\x24\x91\x2d\x4e\xc7\x18\xa3\xf2\x57\xb4\x74\x21\x03\x7b\x9a\x0c\xa5\x8a\x6d\x23\x1a\x28\x69\xe2\x0e\xa8\x80\xa8\xf6\x1f\x90\xe3\xb1\x68\x04\xfe\xdc\xb3\x68\x6c\xa6\xb3\x55\x67\x37\xfe\x98\x53\x74\x1c\x24\xa1\x2e\xf6\x58\x7f\xbf\x16\x61\x8f\x39\xde\xe3\xa6\x71\xb1\xdb\x13\x2a\x38\x15\xbd\x6c\x91\x87\x46\x7d\xa9\x94\xca\x08\x0b\x08\x8e\xfb\x3d\x7f\x85\x4f\x2f\x3b\xc7\x08\x0b\x63\xa6\x6d\x89\x26\x3f\x98\xac\x54\xe9\x38\x5f\x86\x9b\x2f\x89\xa9\x40\xde\xc1\x6f\xd0\x23\x02\x7f\x41\xfe\xfa\xd6\x80\x32\xb0\xf6\xc9\x99\x49\x62\x99\x31\x47\x18\x5f\xe7\xb6\x44\xff\x4a\xff\x62\x50\xd8\x0f\xd1\x9e\x6f\x8e\x07\xcc\x68\x8f\xbf\x42\xc2\x23\x04\xfb\x9f\xaa\xbc\x90\xf9\x89\x1f\x1e\xdb\xa6\xee\xce\x4a\x5f\xf5\xc6\x48\xa2\x33\x46\x7d\xb5\xae\x39\x66\x9f\xb1\x76\xef\x4b\xeb\x8e\xa4\x84\x38\x9a\xf9\x3b\x5e\x37\x63\x24\x1c\x23\x59\x1c\x24\x4e\xdb\x31\xb7\x49\xb6\x3d\x06\xbc\xf7\xc5\x00\x6d\xc0\x08\x0f\x0c\xda\xc0\xc1\xff\x1f\x4a\x5f\x76\xcf\x08\x17\xe6\x28\xc2\xa4\xd0\x63\x71\x38\x9b\xfe\x19\xd1\xca\xda\xbf\x8c\xab\x04\xa9\x65\x7f\xf0\x4a\xf1\xfa\x2d\xe7\x45\x7f\xc5\x84\x57\x07\x4e\xcf\xaf\xb2\x7a\xaf\xdf\xca\x93\x6b\x22\xc2\x08\x55\xdc\x8f\x9d\x87\xe7\xe9\x72\xfc\xd5\x4c\x06\x56\x9f\xae\x3b\xc4\x0c\x0e\xc4\x5f\xe4\x5a\x08\x27\x1c\x92\xe3\x6d\xb3\xb5\xa3\xb6\xb9\x8c\x4c\x1e\xbf\xb7\xdf\x6f\xab\xf2\x28\x96\x4f\x6f\x13\xe1\x36\x46\x64\x1c\x62\x75\x19\x7a\x7f\xc3\x23\x78\xdc\x0a\x02\x34\x1b\x71\x13\xbb\xa9\xb8\x8b\x2f\x11\x15\x4b\xb0\xe0\x95\xc5\xe1\x30\xa5\x43\x75\x8d\x52\x9a\x12\x9f\x64\x6f\xf9\x61\xd7\x4b\x75\xf9\x07\x09\x8d\x89\x08\x95\xd7\x9d\xcb\xd7\x56\x60\xfc\x97\x6b\x26\xce\xe8\x5f\x27\xf9\x1d\x8e\xff\x73\x52\x65\xc6\x88\xd2\x51\xe0\xc8\xf4\xaa\xea\xa5\xf3\xc0\x72\x38\xa8\xd0\x77\x42\x67\x58\x48\xd2\x16\x28\x1a\x6c\xe3\x13\xf3\x1b\x3b\x01\x4a\xd0\xeb\xd8\x7c\x7f\xbc\xb9\x1b\x6d\x88\x00\x04\x53\x00\xfb\xda\x97\xcd\xaf\x78\xa5\xfa\xdc\x89\x37\x15\x88\xce\xa2\xd8\x7e\xd8\xe5\xb9\x2d\x5b\x8b\x42\x18\xd8\xdc\xdd\x2e\xc8\xbc\xd8\x51\x7d\xe3\xc2\x96\x7e\xe4\xb4\x36\x29\xfa\x1f\x79\xb7\xdd\xff\x7a\xf3\xb4\x3b\x8c\x06\xa1\x91\xe4\xaa\xa1\xf9\x47\xcb\x8b\x26\xef\xdc\x9c\x63\x8e\x13\x7c\xfe\xdc\xa7\x01\xd3\xc8\xb4\xe3\xb8\xd2\x5f\x6a\xa8\x0c\x72\xea\xca\x39\xe2\xee\xd3\x19\x1e\xa0\x76\x5d\xc3\x81\x9f\x7d\x2f\xb4\x88\x7b\xfa\x83\x65\x7b\x7e\x68\x8f\x33\x05\x07\x8c\x86\x61\x80\xde\x85\x2d\x03\x7e\x58\x6c\x6f\x16\xff\x18\xcf\x25\x1a\x86\x09\x72\x38\x3f\xaf\x6f\xbe\x6d\xee\xee\xdc\x3b\x42\x8b\x58\x9a\x8a\x54\x5d\xa9\x0d\x67\x34\xe4\x4c\x28\x5f\xfd\xbe\xb8\xbf\x9b\xbc\x27\x8a\x0d\xc0\xd5\x9a\x51\xe3\xcd\x93\x46\x71\x82\xd1\x09\x3d\x41\x94\x31\x4a\xb2\xc4\x28\xfb\x99\x22\x65\x57\xb6\x34\xbf\xb1\x52\xc2\x0d\xc8\x0d\x7e\xf3\x43\xcb\x1b\x58\x54\xc0\x67\x58\x75\x06\x37\x08\x8a\x6e\xe9\xa6\x68\xc0\xaa\x6c\x3d\x6a\x13\xb8\x77\x43\x41\x64\x86\x70\x07\x05\xbf\x3d\x2f\xca\xf8\x21\x34\x0a\x6d\xc8\xd7\x89\xdb\x3e\x94\x8d\x27\xfc\xf3\x07\x30\xa5\x91\x4e\x94\x2b\x24\xef\x0e\x6d\x33\x79\x5d\x55\xfe\x78\xc0\x28\xd5\xb8\xbb\x89\xf6\x3c\x73\xd6\xb9\x3a\xba\x41\x27\xe2\x34\x12\x9e\x71\xf7\xb6\xac\x96\x6d\x55\x4c\x3b\xaa\x53\xb4\x59\x31\xe0\xf6\x8c\x66\x1c\x82\x32\x78\xd3\x4c\x24\xb6\x2c\x54\x9f\x51\x46\x0d\x11\x97\xcb\x06\xb8\xdf\xc2\x64\x90\xa9\x11\x88\xee\x4b\xbe\x99\xf1\x6f\x8b\x03\x48\x42\x67\xfa\x75\x06\x44\x67\xfa\x8d\x3d\x8c\xe9\x1d\x8c\x63\xdd\xda\xef\xb2\xc9\x8b\xd7\xba\x67\xe3\x61\x34\xe6\x59\xe4\x02\xee\x3e\xa8\x86\x23\xf6\x52\xe7\xc5\xeb\x33\xff\x40\xea\x67\xdb\x3a\x09\x28\xf4\x68\x8f\xf7\xad\xe3\xc0\x9e\x8c\x54\x12\x64\x91\xcf\x03\x1d\xa0\x6e\xa6\xc0\x60\x46\x13\x6e\x76\xd8\x7d\x63\xf8\x53\x5a\xf9\x06\x55\x3d\x0a\x72\xd2\x44\xa5\x3a\x1c\x18\xab\xe6\x37\x6e\xf9\x01\x88\x6f\x02\xe6\xc0\xa8\xa1\xf9\xce\x1b\xf9\xe6\xf2\x1c\xcb\x73\xd7\x2d\x47\xd8\xeb\xdc\x14\x9a\x12\xb3\x1e\xe0\xb3\x1b\x88\x36\x77\xe0\x68\x46\xd3\x24\x8e\x1d\x89\xe6\xb9\x1f\x88\xcd\x6a\xf1\xe4\x53\x7a\x30\x24\x51\x1f\x3b\x94\xf6\x29\x19\x15\xf8\xab\xb6\x2b\x17\xbd\xa2\x59\x0a\x8e\x66\x73\x67\x62\x30\x0b\xf5\x3b\xaf\x4b\x2c\x8f\x35\x70\xc6\x8b\x6a\x96\x2b\xbb\x5a\x96\xc5\x22\xf1\xfa\x28\x43\xc9\xf7\x69\x43\xa0\x56\x7f\xfa\x60\xf8\x38\x17\x13\xf3\x97\x66\x10\x23\xa8\xe3\x66\xf1\xe7\xd6\xf7\x14\x12\x0c\xf0\x59\x00\x2f\xa6\x41\xf2\x6e\xa6\x23\x27\x7c\x6d\x8b\x8f\xe7\xb7\x0e\x1e\xc4\xae\x5e\xcd\x32\xba\x1b\x55\x8f\xa1\x9c\x46\xd7\xca\x70\x25\xe3\x89\xbb\x5f\x17\x4d\x95\x3b\x62\x12\x46\x45\xc4\x50\x39\x13\xf3\x27\x46\xe9\xec\x60\x8f\xdc\x70\xfa\x03\x05\x8b\x99\xa9\xb1\x1a\xf1\xb9\xfc\xed\x92\x91\x92\x51\x99\x06\x18\xae\x7e\xfe\x34\x3c\x63\xee\x7d\x52\x91\xcc\x76\x79\xcb\x0b\xf5\x91\xcb\xb7\xce\xa2\x5f\xf1\x43\xd9\x75\xeb\x12\x91\xc8\xa8\x62\x46\x52\xbf\x2e\x9a\x3d\x76\x73\xea\x40\x53\x95\xc6\x81\x3d\xe3\x56\x25\xba\x48\xd1\xa4\x05\x24\x04\x88\x57\x5d\x43\xbf\xa9\x3f\x5e\x29\x64\xa1\x1c\x88\x5a\x62\xcc\x63\x7e\x32\xe8\xc0\xa9\x16\x60\xd0\x77\x24\x5b\x70\xad\xa6\xfc\xeb\xc8\x25\xd5\x84\x06\x16\x9a\xf0\x8d\x1f\x61\x7d\xf5\x6b\x6b\x46\x10\x51\xfa\xa8\xb1\xcc\xe0\x60\x52\xcc\xdd\xa7\xb0\x83\xcb\x02\x62\xe2\x54\xdc\xaa\xd9\xd9\xfc\xb8\x9d\x0f\xfd\x79\xef\x9a\x33\x43\x9b\xd6\x94\x26\xd2\xfa\x65\x3f\x59\x14\xab\x70\xaa\xd8\x33\x23\x36\xcf\x18\x09\x02\xc4\xf8\x7f\xe4\x07\x25\x79\x65\xf3\x83\xa1\x7b\x0e\x49\x28\x3a\xc3\xae\xc0\xe0\x66\x60\x27\x30\x1a\x31\xdc\xea\x70\xae\xe2\x97\x1c\x6d\x4e\xdd\xe1\x87\x07\xdb\xa9\xfc\x80\xea\x86\x9f\x9f\xa0\x7a\x82\xaa\x2e\x8b\x15\x3f\x6d\x8a\x3e\xda\xc7\x68\x6c\xf4\xdd\x9a\xd1\xee\xba\x2b\x07\xe4\x8d\x97\x90\xa4\x2f\x4f\x00\x46\x33\x23\xc0\x75\xcc\x8b\x1b\xa7\x75\xe8\x2e\xf1\x18\x8d\xca\xbc\xc8\x2d\xb1\xae\x51\xa2\x9c\x9d\x44\x2c\x8e\x15\x97\x23\x1d\x35\xbd\x2a\xdb\xaa\xf6\x8f\x4b\x18\xe8\xc0\x05\x0c\x87\x08\xc2\xaf\x93\xa9\x2c\x11\x99\x61\xf4\x96\x3e\x84\xc8\x12\x15\xe1\x82\x5b\x9e\x1b\x40\xb3\xc8\xcf\x96\x04\x18\x7a\x7f\xfb\x57\x68\x7e\x61\xde\x75\xdc\xcd\x94\x03\xda\xa5\x13\xf8\xf7\x05\xe2\x91\xb1\x2c\x08\x08\xf1\xfc\x22\x4d\x3b\x27\x15\xc1\x58\x16\x09\x88\x3c\x0f\xc4\xa8\xb6\x77\x7e\x9c\xb2\x84\x12\x43\x2c\x2b\x0f\xad\x9a\xae\x7a\x96\x49\x82\x70\x50\x91\x37\x1f\x65\xa5\xea\x55\xdb\x3c\xb6\x4d\xa9\xc3\x20\x70\x3f\x91\x07\x11\x6e\xae\x5b\x47\xf8\xcb\x98\x88\x85\xb0\x90\xa9\xeb\x52\x0c\x8c\xc9\x50\x62\x38\x19\x63\xec\x0f\x5f\x06\xd9\x67\xb6\x3f\x26\x69\x18\x76\x7d\xbb\x5d\xaf\xf7\xab\xef\x8b\xe7\x6f\xeb\xe7\xfd\xcd\xfa\xe1\xf1\x7e\xf3\xb0\xd8\x3d\x3e\xff\xe1\x9b\x69\xa4\x6a\xcd\xeb\x1e\x0d\xd3\x62\x11\xb1\x6e\xdd\xfe\xcd\x54\xa0\x9d\x27\x67\x77\xf9\x99\x5d\x92\x29\x62\x04\x2b\xad\xde\xef\xb7\x5f\xfe\x76\x0e\x18\xfa\xf5\x62\x97\xfe\x82\x32\x32\xf7\x79\x7d\x07\xaf\x9e\xcb\xe2\x8a\x92\xa6\xbd\x07\x02\x40\x21\x11\x61\x4b\xf0\xf3\x52\xb9\xc3\x7f\x53\x7c\xef\x26\xb1\x7b\x3a\xd0\x18\xe3\x19\x77\xeb\xdd\xe3\xa0\x94\x81\x31\x27\x43\xe4\x2a\x5f\xf6\x4d\xb9\x2f\x7b\x52\x2a\xc6\x00\x22\x3c\xd5\x0a\xf8\x6c\xb6\x50\xf7\x18\x44\xc6\x74\xa8\x91\x94\xb4\xc9\x8f\x38\x99\xb1\xfc\xfe\xaf\xd1\xb4\x8c\x69\x22\xa8\xe5\x25\xdd\x14\x9d\x25\x59\x56\xf3\x7a\x01\x8c\xe9\x38\x30\x82\x6c\xdd\xe2\x5b\x14\x56\xb6\xe6\x12\xe0\xcd\x98\x16\x04\x61\xb4\xdb\xc5\xed\x7a\xff\xb4\x7e\xde\x3c\x5a\xd2\x5c\x16\x47\x81\x82\x6e\xfb\xb9\x2b\x5f\x97\xed\xc5\x9b\xe6\x77\xd8\x98\xb0\x50\xf6\x25\xf0\x7d\x84\x6f\x78\xf7\x25\x11\xe5\xd8\x12\x1f\x7f\xaf\x98\x64\xa0\xd0\x34\x7a\x59\xce\x3b\x7b\x31\x63\x21\x4e\xf4\x53\xe9\xbe\x50\xcc\xb2\x04\x65\x7c\xf7\xbf\x23\xff\x27\x10\x96\x80\xc5\xf0\x24\x7e\x94\x9d\x41\x68\x93\x5e\xe3\x07\xc6\x8a\x12\x39\xf0\x1e\xc7\x0c\xfb\x63\x6f\x3c\x4e\xc2\x10\x53\xb0\xc7\xf6\x10\xbb\x8c\x5d\x9c\x48\x15\xc5\x03\xe0\x7c\xab\x06\xf5\xf0\x73\xc9\xcc\x38\x01\xb3\x53\xd4\x6f\xe5\xc7\xfe\x08\xfb\xe6\x0d\xf6\xc7\xb2\x80\xb3\x7f\xa4\x26\x18\x59\xb1\xb1\xbb\x85\x52\x16\x73\xe7\x25\xff\xfa\x1f\x90\x46\x86\x90\xcd\xb8\x6f\xbb\x5c\xbe\xcf\xac\xb7\x38\xcd\x88\x16\x03\x6f\x73\x28\xcb\xdc\x5d\x85\xc4\x10\xa9\x7a\x76\xd8\x59\x35\x37\x16\x67\x84\x19\xc4\xe4\x5b\xf9\x61\x39\x81\x1e\xe0\xb3\x79\x76\x1e\x58\x9c\x65\x1c\x01\xc6\x92\x17\xcf\x08\x00\x82\x97\xa2\xee\x79\xd1\x7d\x2b\x85\x81\xd2\xbd\x2c\x8f\x27\x5e\x79\x7e\x59\xb3\x39\x8d\x7a\x9e\x09\x2b\x4f\x9b\xbf\xbe\x35\x19\x99\xfc\xae\x4c\x0b\x1f\x5c\x37\x69\x58\xa4\xf8\x19\x77\x9a\x07\x1a\xe3\x71\x75\x7b\x3c\x5e\x44\x23\x62\x4e\x20\xb5\x42\xb1\x23\x40\x4f\xec\xa8\x08\x57\xbc\x28\xb8\xe0\x85\x83\x94\xc4\x22\x52\xf8\x1b\xad\x9a\xee\x53\x59\x5c\xd2\x39\x0d\x96\x73\x2c\x68\x84\x7b\xc8\xde\xe2\xad\xee\xf3\x7e\xe8\x85\x50\xdc\xd4\xa5\xf9\x34\xa6\xf9\xe8\x93\x1f\x2a\x80\x3b\xba\x8e\x41\x8c\xf6\xa5\x9e\x9e\x83\xb1\x4c\x33\xe4\xef\x5d\xbd\x41\xa1\xe0\x57\x59\x79\xe4\x56\x2c\x75\x24\x22\x1f\xfa\x42\xf2\x8d\x21\x03\x0a\x8b\x55\xa0\x30\x13\x63\x02\x37\xdb\xf2\xa0\x26\x24\xe5\x2c\x06\x92\x62\xdd\xa9\x45\xf9\x4e\xc2\x6e\x31\xc4\x06\x2d\xfb\x0a\xcd\xba\x96\x55\xf9\x31\x22\x0b\x65\x9d\x99\x83\x24\x73\xfb\xbc\x7e\x2c\x26\x60\xa0\x18\x74\x80\xcf\x86\x4f\x90\xcb\xf6\xbc\xe4\x13\x69\x45\x16\xeb\x90\x61\x46\xe6\xe5\xff\x78\x3e\x84\xe9\xb2\x58\xcb\x0c\x99\x2d\x9e\x0c\xc4\xe2\x32\x36\x90\x04\x60\xc2\xc7\xab\xb6\x6e\xca\xe3\xd3\xe3\xc2\xdc\x3f\xcf\x68\xf7\x5f\x6d\x81\x49\xc8\x4c\x98\x50\x58\xb1\xb7\x4b\x2e\x11\x96\x84\x71\x64\x44\x31\x71\x7d\xde\xf3\xbc\x98\x33\x43\x93\x28\x36\xc9\x0a\xe5\x3b\xde\xb9\x94\xdd\x5a\x6d\x4f\x7f\xb5\x21\x4f\x7a\x15\x49\x23\x83\x62\x35\x13\x4a\xd9\x56\xa8\xda\xf6\x57\xf5\x81\xee\x76\x25\x25\x71\xac\x4b\x00\xf7\x79\x7f\xd8\x25\x11\x64\x98\xde\xdc\x2b\x90\xa5\x82\x65\x7b\xc6\x1d\x69\x30\xd9\x13\x92\x06\x3c\x1a\xa0\x01\x30\xa5\x33\x86\x2a\x24\x24\x0b\x22\xe5\x98\x1e\x74\xf9\xc4\x0b\x38\xf8\x6b\x10\x63\x98\xab\x1f\x88\x8d\x7e\x00\x50\x57\x2a\xec\x59\x42\x29\xc1\x29\xf5\x3f\xcf\xff\xdc\xaf\xff\xb9\xfa\xbe\x78\xf8\xb6\xc6\x0a\x76\xf7\x44\xca\x19\x6e\xf1\x5c\xa9\xbf\xb7\x55\x5e\xab\x7c\x04\x2f\xfa\xd7\xbf\x31\x1f\xe2\xcc\xc3\x84\xaa\xd0\x19\x30\x9d\x87\x33\x9e\xc0\x09\x8b\x82\x40\x39\xd7\xac\xdb\x47\x9a\xf3\x12\x64\x79\xb4\x09\x9a\x35\xaf\x8a\x97\xa2\xb1\x15\xa4\xe1\xb5\x4f\xc4\x64\x44\x52\x4b\x69\x70\xa9\x3e\xc8\x92\x38\xc9\xb4\x39\x95\x64\x7e\xca\xa1\x68\xee\x37\xce\x24\x4c\x12\xca\x2d\xa3\x00\xa8\xa1\x92\x1d\x4b\xd2\x44\xa3\xf2\xe5\x29\x97\xe5\xa9\xde\xe7\xdd\x41\x94\x37\x57\x2c\x87\x24\x15\x91\x93\x0d\x30\x5b\x4f\x59\x1d\x0d\x54\x6a\xaf\x6c\x3a\xcc\xb5\xd4\x46\x12\x6b\x0b\xcd\x2a\x6f\xce\xc8\x76\x34\x7b\x40\x26\x19\xc9\x12\x47\xd5\x60\x30\x0b\x5f\x66\x58\x93\x8c\x66\x78\x9c\x78\xe8\x86\x21\x1a\x9b\xb7\x72\x93\x2c\x0d\x85\x35\x53\x5d\xd7\x78\xc0\x70\xbf\xd1\x3c\xaf\x78\xa1\x80\xd7\x67\x7f\x89\x72\x0c\xfb\x18\x2a\xe8\xa7\x97\xe5\xdd\x66\xb5\xdf\x2e\xee\xd6\x7d\xcd\x3a\x4b\x78\x9a\x46\x3d\x77\x98\x63\x91\x9b\xc5\x13\x27\x3c\xcb\x8c\x3c\x21\xd4\xcd\x2d\xcf\x0f\xcf\x80\x27\xe4\x1d\xea\x06\x3e\x83\x61\x53\x5e\x17\xa8\x0d\xef\xfe\xd3\x4f\x79\x49\x0c\x8d\x32\x57\x0a\xe5\x87\x0c\x5b\xf6\x0c\x9b\xda\x90\x6a\x82\x25\xb2\x33\xf0\xac\xab\x86\x15\x4c\x9d\xed\xa9\xae\x25\xfd\x12\x99\x18\x98\xf1\xf1\xbd\xd9\xd4\xf5\x15\x86\x32\x96\x28\xa2\x9d\x57\xf1\x0c\xb7\x6d\x31\x2b\x9f\xc8\x12\xc5\x34\x38\x2a\x9a\xf2\x0a\xe5\xe3\xf4\xc9\xc0\x51\x12\x5d\x40\x53\xdf\xf5\x69\xa8\x44\x0b\xc3\x36\xdb\x78\x4e\xa7\xd1\xab\xd2\x20\x4e\x95\xcd\x9c\x9a\xd4\xcf\xb6\xa9\x46\x27\x4b\x1a\x64\xc4\x11\x4b\xdd\xdd\xfd\xdc\x83\xca\x9b\x7d\x94\x8e\xdb\x84\x2c\xb6\x52\xf6\x48\x82\x3d\xaf\xdb\xce\x52\x42\x09\x78\x01\x0f\x23\x30\x32\xfa\x15\x29\x49\x92\x10\xf1\x27\x7b\x38\x62\x75\x81\xd9\x2b\x98\xbb\x2c\x04\xc6\xc0\x9f\xff\x7c\x70\x99\xef\x94\xd1\x10\x6f\xf1\xb1\x4c\x5b\x82\x7f\x9e\xbc\x9b\xa5\x81\xd1\x36\x94\x2e\x2c\x15\xfa\x47\x08\x91\x91\x81\x29\xba\xa8\xcd\x26\xf3\x79\xf1\x0c\x05\x68\x0b\x74\xe3\xe8\xa2\x9c\x69\x9c\x52\xee\x12\x6e\xbc\xad\xc1\xd1\x56\x40\xdf\x20\x61\xc6\xd2\xd8\x1b\x6e\x7f\x77\x21\x01\xa2\x3c\x16\xe9\xb9\x97\x9d\x67\x69\xa2\x8d\x10\x7c\x5d\xea\x66\xc5\x4f\x68\x33\xde\x94\x1f\xc5\x2e\x3f\xfa\x33\x21\x4d\xad\x62\xcb\xe9\x8d\xd7\x40\xd7\x85\x32\x1a\xad\xee\x6a\x66\xb8\xf1\xa1\x50\xbd\x9e\x26\x4b\x53\xc1\x43\x6f\x8f\x7e\x40\x8d\x5b\x6d\x77\xe2\x95\x6d\xf3\x8f\xb6\xac\x3c\x74\x30\x4d\x25\xc7\x85\x83\xf5\x3e\x97\x5c\x6a\x2c\xcd\x88\x51\xd5\x7e\x2c\xec\xd9\xbf\x6c\xcf\x06\x48\x0c\x45\xcd\x9b\x6b\xe7\x46\x9a\xe9\x10\x69\x67\xbc\x7c\x7a\xf3\x06\x55\xbd\x2b\x6f\x78\x39\x99\x0e\x9c\x90\xc8\xd6\x14\x19\xce\x2c\x7b\xb0\xcd\xae\x85\x74\xb0\x7c\x53\x4e\xa8\xb4\x80\xea\x6e\xcc\xca\x76\x3a\xd3\x78\x2c\xc1\x1d\x04\x4f\x86\x27\x77\x3e\x5e\x9b\x72\xce\x6d\x58\xfd\xa0\x6f\xc0\x30\x18\x0c\x48\x3c\xdc\x68\x08\x46\xdd\xdc\xc6\xf9\xd3\x6b\x5b\x4f\xde\x2c\x65\x80\x3b\x8b\x19\xd7\x6e\xc8\xdc\x5e\x95\x4a\x88\xa2\xc0\x19\xd5\xd6\x5c\x1e\x2f\x34\x15\x88\x1e\xf2\x77\x3c\x41\x93\x23\x0a\x1c\xa3\x29\x8f\xda\x15\x3e\xf6\x08\xc4\x54\x65\x31\x26\x18\x3f\x9c\x7f\xb1\x7e\x5e\x45\x11\x99\x4c\x6c\x1d\x19\xee\xab\x37\x5e\xbf\xed\xce\x27\xc7\xe9\xe7\xae\xb2\x08\x81\x84\xf5\x1b\x47\x6a\x5b\xcf\xe5\xc9\xb2\x20\xe1\x98\xed\xfd\xc1\x8b\x7c\x80\x8e\xca\x02\x99\xa1\xe5\xed\xb4\xbf\x86\x5e\x4f\x16\x26\x31\x46\x64\x7e\xc0\xef\xd5\xe0\x9e\x50\x10\x84\x92\xe6\x0d\x1c\x57\x1c\x8b\x9b\xe7\x67\x50\x16\x4a\x23\x81\x6f\xec\xe9\xbf\xe7\xc5\xeb\x01\xea\xc7\x81\x8c\x08\xcb\x22\xc6\xac\x7b\x8e\xd6\xdf\x28\xd1\x91\x7e\x6d\xc7\x65\x91\x24\xe8\xd8\x72\xa5\x1c\x1f\x44\xfb\xfa\xd6\x2c\xea\x09\x87\xf6\xf8\x2e\x42\x4c\xd8\xdb\xcb\x55\x1f\x79\x7e\x98\xf2\x8f\x0e\x3f\x66\x46\xe2\x50\x64\xce\x1a\xab\xdb\x6a\xb4\xcd\x4f\x1e\xae\xb4\xf0\x58\xce\xce\xf4\xc3\x42\xe1\x2b\x2b\x2c\xa3\x54\x13\x6f\x88\x5e\x6b\x93\x48\x15\xbb\xbd\xf8\x54\x56\xc8\x90\xd4\xf4\x3b\x45\x46\x79\x88\xb6\x22\xaf\x80\xab\xff\x70\xe9\x56\x88\xb5\xad\x5c\xa0\x36\x73\xe4\xd0\xb6\x2a\x1d\x73\x3b\x9d\xa3\x35\xb6\xdf\x32\x96\x0a\xc5\xfd\x11\x71\x9b\x1f\x86\x12\x9f\x2c\x63\x1a\xc0\x30\x7d\x1c\xf3\xc2\x25\x23\x4d\xbc\xd9\xb6\x88\x03\x19\xd9\xac\xe1\x0f\x38\x1b\x56\xf9\xf1\x34\xce\xe2\x24\x74\x1a\x43\x7b\x55\xe4\xe3\x85\x97\xa5\x81\x70\xac\xa6\x37\xcf\xdb\x6e\xe6\xdd\xe4\xbf\x3b\x5b\x4d\x4d\x1b\x86\x69\x16\x0d\xf3\x93\x17\x31\x16\xdb\x30\x4b\x4d\x24\x06\x73\xaa\x73\x73\x6a\xae\x7a\x7e\x34\x05\x32\x91\xb8\x9a\xaa\xce\xa5\xfc\x56\x95\xed\x3c\x81\x06\xcb\x32\x65\x30\xc8\xf7\x8b\x7f\xee\x1f\x5e\xee\xf7\x4f\x0b\xd4\x6a\x5c\xec\x76\xeb\xfb\xa7\x9d\x4b\x14\x65\x3c\xa3\x51\x3a\x8c\x68\x57\xc0\xeb\xb6\x32\x70\xb0\x49\xff\xb9\xe4\x58\xc3\x72\xa8\xa4\x1b\x72\xbf\x1a\x45\x04\xb8\x17\x3d\xac\x7f\x2e\xfc\xdf\x18\x8b\xed\xc0\xf4\xd8\xb3\x4c\x86\x21\xa5\x6e\xd7\x42\xfb\xf5\x07\x9c\xaf\x6d\xd1\x73\x60\x8b\x4c\x45\x09\x9e\x24\xbf\xe1\x2d\x97\x07\xb8\xe9\x0c\xbb\xe5\xb9\x33\x79\xff\x98\x34\xa4\x29\xed\x11\x8b\x7e\x97\xcb\x14\x63\x5c\xf5\x98\x2d\x5f\x2d\x3a\x82\x0e\x5c\x7b\x39\x8b\x09\x19\x53\x20\xcf\x04\x72\x32\x15\x73\x47\xe1\xb4\x28\x5e\xe1\x80\x65\x6d\xf5\x1f\xc3\x8c\x72\x06\x81\x48\x13\xc7\xb2\x2b\xcb\x42\x19\x8f\xd3\x9d\x9b\xe3\x07\x02\x4b\x22\x43\xd6\xbd\x98\x4e\x40\xe0\x91\xd1\x0d\x2d\xca\x0f\x7d\xe0\xef\xde\x17\x1a\xcd\x1d\x80\x10\xb7\xb8\x0a\x69\xc7\x47\x1e\x49\xa6\x09\x77\x50\xa7\x55\x59\x28\x3c\x25\xea\xd1\xf2\xd6\xb1\x11\x44\xc6\x42\x3e\xfe\xb9\x69\xe0\x38\xda\xf5\x33\x9d\x12\xc4\xc1\xed\x5f\xa1\x79\xd0\x57\xe2\x52\x3c\xe0\x8c\x59\xb2\x85\xcd\x91\xbf\xa2\x25\x5f\x0e\xaa\x23\xc7\xbb\x0e\x0f\x24\x4f\xb5\x35\xab\xe7\x32\x05\xf3\x39\x15\x1e\xa8\xd0\x68\xd2\x7a\x12\xc0\x7f\xb4\xbc\x6a\xa0\x72\x36\x1c\x0f\x03\x8a\xf9\xff\x43\xb1\xd7\xf9\x27\x28\x72\xa5\x03\xa1\x4a\x30\x67\x72\x84\x86\x2b\xde\xf0\xef\x9e\x83\x8b\xf1\x48\x11\xc3\x06\x6f\xa0\xb8\x53\x40\x91\x6d\x45\xe2\x4c\xd0\x11\x46\x7a\x50\x59\x38\xfa\x42\x9c\xc6\x66\x53\xfb\x7d\x59\x69\xc9\x29\x08\xcc\xaa\xd9\xd0\x94\x21\xe0\xe3\xf9\x64\x2a\x70\xc6\x42\x16\x8d\xbc\x72\x53\x2d\x7d\x81\xf2\xe5\x71\xa0\xb0\x5a\xf1\x34\x00\xfe\x5d\x2b\x6f\xe2\x71\x42\x30\xea\xb1\xcf\x6b\x0f\x02\xac\x16\x4d\xc3\xe5\x3b\xd6\x5b\x5d\x19\xbd\x24\x8b\xb9\x35\xab\xf6\xf6\xfd\xfb\x45\x95\x17\x17\xe4\x07\xb6\x7d\x4a\x64\x24\x1c\x65\x2c\x9a\x45\x6e\xc9\xf2\x34\x35\x80\xa3\x01\x13\xc0\x83\x37\x3e\x79\xca\x23\x2e\x06\x25\x6c\x98\x2d\x1a\xed\xac\xae\xa1\x32\xea\x2b\xcf\xa5\x7c\x87\xe6\xb6\x85\xa1\x02\x2f\xe3\x59\x4a\x88\x29\x73\x6b\xeb\x06\xc0\xf3\xa0\xf6\xd7\x53\x69\x22\x5f\x4d\x67\x08\x1a\x3b\xd6\x66\x2c\xba\x6e\x4d\xbe\x06\x0f\x0c\xe4\xc9\x08\xfa\xda\x38\xec\xc5\xce\x3f\x1e\x03\xae\x88\xdb\x38\x3c\xab\xbe\xbd\x24\x68\x1c\x44\x3d\xdc\xe9\x6b\x47\x6f\x60\xde\x72\x19\x46\x16\x8a\x57\xbf\xed\x4a\x2f\x83\xc2\xb8\x4c\x8d\xef\x7d\x00\xdd\x60\xfd\xc3\x10\x8e\xcd\x25\x27\x18\x87\x7c\xf8\xf3\x9f\x37\xd0\x2d\xa4\xca\x94\xc1\x6e\x30\x60\xa1\x6d\xbd\xa7\x73\xcd\x66\x92\x73\x5c\x02\xa5\x5e\x44\xe8\x16\x40\x6d\xcb\xb6\xea\x5f\xa0\x32\xca\xb3\x9e\x48\xc7\x54\x60\xac\x2e\x28\x72\x18\x87\x18\x30\x7c\xf0\x63\x08\x41\xe0\x90\x30\x47\x6e\xdb\x7d\x87\x5b\x53\x35\xc3\x0f\x3d\xcb\x35\xe3\x9a\xa4\x81\xa5\x98\xfc\x7b\x31\x32\xc4\xc7\x6f\xd0\x59\x80\xb9\x56\x57\x12\xe1\xfe\x2c\x03\xb4\x87\x0d\xf2\xff\xb2\x66\x70\xae\x14\x86\x6b\x09\x58\x0c\x00\x9d\x95\x06\x1b\x47\x87\x3e\x2c\xe8\x34\x2d\x45\x40\x19\x08\x5f\x51\x86\x49\x90\xb1\xd7\x24\x02\x4b\x69\x66\x48\x81\x2c\x0f\xa1\xbd\x16\xb2\x00\x29\x9a\x6d\x46\x03\x9a\xe6\x80\x01\x44\x3b\xff\xfb\x09\x20\x42\x26\x8d\xf6\xdf\x66\xf9\xb8\xf5\xb7\xdb\x78\x9b\xad\x8b\xfa\xc3\x22\x1c\xed\xae\xea\x4e\x29\x11\xaa\x0c\x3d\xe1\x02\x3e\xb0\x83\xfe\x76\x48\x10\x16\xf0\x52\xd4\x30\x4d\xb9\xda\x26\x11\x21\xc4\xad\xff\x1a\x3b\xb5\x6f\xeb\xb9\xe2\x87\x11\x69\x07\x13\x11\x8d\x10\x52\x75\xc2\x85\xf5\x54\xc1\x66\xf7\xb8\xef\x69\x1c\x5f\xb6\x2e\x23\x26\x08\x33\x78\x54\x91\x7f\x0e\x17\xb2\x20\x9c\xe2\x69\x69\x61\x19\x1e\xdc\x64\xa2\xbb\x93\x5d\x53\xd0\x30\x41\x8a\x52\xd1\x9e\x9f\x0e\x97\x2b\xd4\xb5\x22\x12\xd9\x1e\x56\xe7\xd3\x1b\x54\xff\x74\xaf\x62\xc4\xf8\x34\x7b\xc3\x0f\xf3\x56\x56\xdd\x1a\x79\x2a\x3f\xa6\x85\xb6\x22\xa1\xa9\x34\x61\x0f\x05\x47\xdc\xff\x87\xcb\x4d\x24\x2c\xc5\x9c\x3a\x8a\x15\xde\xe7\x45\xfe\xcd\xd3\x95\x33\x91\x08\x40\x2e\xb7\x5d\xd5\xca\x77\x94\x54\xf1\x9e\x90\x48\x24\x0b\xcd\x56\x6e\x51\x08\x0d\x8c\x54\xf4\x5c\x33\xcd\x84\xee\x79\x18\xf6\xd0\xbc\x0d\x84\x55\x99\x48\x19\x60\x1d\xfa\xcb\x72\xbb\xf1\x7f\x53\x09\xa2\x64\xe4\x59\x1e\xa0\xc6\x61\x44\xc4\x80\xbb\xac\x93\xc4\x94\xcb\x23\xaa\xe2\x8a\x08\x3b\x13\x19\x09\x10\xc2\x57\xa3\xef\xd5\x94\xc5\xb0\xa4\xd6\xb5\x91\x0a\xf9\xe8\xb7\xf7\x8b\xe7\xdd\x6a\x35\xfc\x81\x5c\x9a\x5d\xfb\x54\xb5\x45\x5f\xb1\x7e\xe5\x33\x71\x2d\x50\xa3\x02\xca\x7a\x52\x77\x2c\x84\x55\x60\xdd\xdc\xdf\xac\xff\x89\x10\x5a\x94\x63\x42\x1d\x69\x83\xde\x9f\x49\x3d\x0a\x29\x29\x42\xd7\x4e\xbc\xea\x16\x57\xc1\x4f\xdb\xb7\xb2\x19\x46\x4f\x84\x4a\x29\x4e\xc3\x1d\x7f\x87\x47\xad\x31\x9b\xf3\x2b\x57\xfe\xeb\xa9\x2c\x48\x33\xfb\xe5\xe1\xb8\x2a\xdb\xd3\x94\x8d\x9a\x09\x25\x0c\x77\xe3\xb1\x3d\x34\x97\xe5\xe1\x02\x12\x43\xa5\xbf\x47\x00\xf1\x0d\xfc\x5e\x4d\x83\x14\x02\x74\x8c\xc1\xbb\x3d\x60\x4a\x67\x40\xca\xdc\x5d\x4b\xa8\x3d\x56\xba\xb1\xbf\xd4\x53\xff\xaf\x32\x29\x42\x47\x86\xce\xd4\xa8\x0d\x0e\x5d\x32\xa1\x89\xc7\x60\xdd\xf1\xba\x79\x28\x0b\x57\xa3\xe4\x67\x98\xe6\x99\xb2\x87\x38\xa2\x7f\x2d\x92\xb6\x18\x95\x64\xba\xb6\xb6\x64\xcc\xb0\x97\x54\x1e\xec\x2e\x34\x68\x5c\x86\xc8\x51\xdc\xed\xab\xd5\x15\xc4\xb1\x0c\x02\x8e\x00\xac\x02\x40\x79\x92\x36\x77\x2d\x0c\xd1\x66\xc6\x7c\xfc\x48\xb5\x62\x12\x5d\x95\x01\xe1\x18\x7f\xda\x1f\x4b\xff\x41\x65\x90\x99\x02\xeb\x1d\x86\x94\x65\xf9\xfb\x0a\xd0\xe9\x8a\x17\x21\x03\x91\x32\xcf\x81\x7b\xcf\xeb\xc6\x3b\xae\x32\x50\xc2\x08\x3a\xbe\xf9\x75\x26\xc3\x34\x41\xb2\x85\xbb\xf2\xd5\xe9\x77\x7e\x1d\xe0\x95\x91\x8e\x5d\xe4\x67\x57\x9e\x4c\xb6\x7c\x2b\xcb\x8b\x0a\x47\x49\xa9\xf1\xdb\x57\x07\xe0\xc5\x92\x17\xef\x50\x99\x6d\x7e\x60\x36\x49\x9a\x50\xcb\x1b\xda\xf0\x83\xd1\x2d\x72\x5d\x63\x21\xc1\x92\x65\x59\x9d\xeb\xc6\x1a\xa6\xfe\x5a\x9c\x20\x09\xe6\xf3\xe3\x72\xb3\xde\xf9\xbf\x66\x04\x91\xfd\xe5\x09\x8a\x6e\x8b\x7b\x86\xba\x33\xb3\x0a\xf5\x00\x1f\xb8\xe5\x5d\x4b\x9f\xcd\x68\xe2\x30\x19\xa7\x81\x09\x0f\x42\x8d\x93\xca\xbd\x25\x16\x61\x64\x70\x28\x3d\x49\x79\x9f\x25\x1d\x7f\xe2\x24\x64\x30\xc8\xe3\x2f\xf9\x80\x88\xf1\x12\x98\x24\x93\x48\xe0\x36\x52\xf3\xf3\xa2\x38\x37\x03\xf6\x77\xd7\x20\x4e\x51\x3e\x0e\xb9\x3c\x26\xaf\x4a\x23\x0c\xfb\xfc\x59\x5a\x5a\x4b\x7b\x42\xe1\x98\x47\xff\x2d\x76\x6c\x7c\xce\xca\x34\x08\x11\x22\xdf\xfd\xb4\x5b\x2e\x61\x57\x76\xff\x7f\xd1\x74\x46\xea\x20\xba\xd7\xb5\xb3\x14\xac\x0f\xe5\x15\x0f\x4d\xa6\x49\x34\x62\x7a\xe8\xb6\xfb\xe7\x52\x94\x5f\x4b\x00\x77\xf7\x29\xab\x9a\x9f\xe3\x78\x1b\x51\xee\x2b\x05\xa1\x32\xe5\x81\xa5\x25\x6f\xd6\x9f\xa7\xdc\x60\x7d\xba\x03\xba\x7b\xdd\x6c\x96\x43\x66\x91\x81\x34\x6c\x9b\xb2\x82\xb1\x8e\x10\x93\x19\x11\xe8\xdc\x2e\xf3\xaa\xb7\xc2\xe7\xf7\x30\x99\x31\x89\x3e\xa8\x2b\x5c\x78\xf1\xaa\x6c\x4c\x66\x60\xac\x6f\x83\xe8\x3c\x71\xd3\x31\x73\x2c\xec\x2a\xa3\x21\x7e\x0b\x60\x55\x33\xf3\xe9\x11\x2f\x33\x1d\xa3\xc5\x6f\xf6\x47\x97\xfe\x92\x5c\x12\xa4\xd4\xfd\x47\x67\x29\x0f\xd2\x4d\x52\xb2\x08\x13\x88\xdd\x5e\x7d\x2c\xf2\x1a\x5f\xb7\x67\xfe\x32\x08\x24\x56\xab\x8f\xdd\xf3\x0c\x47\xd6\x0a\xa1\x18\x78\x34\xcc\xff\xbe\xce\x81\x90\x2e\x54\x67\xd2\x5b\x08\xa0\x6e\xf8\xf1\x64\x76\xec\x28\x98\xde\x92\xa6\xe8\x0c\x1e\xf3\xba\x3b\xa2\x51\xc2\x66\x57\xae\x0b\x35\xb6\x38\x25\x90\x2c\xb4\xc8\x6a\xd5\xca\xc6\x13\x17\x48\x9d\xca\x04\x46\x68\xb2\xef\xf9\xeb\xdb\xb0\x84\x5b\x05\x44\x1b\x25\x31\xdd\x40\x81\x8c\xfa\xc3\xb3\x59\x05\x32\x4e\x2d\x21\x92\xdd\x0f\xdb\x39\x12\xcf\x51\xcd\xef\x57\xff\xdf\x33\xed\x8f\xac\x59\x15\xd2\x0c\x3f\x3e\x66\x41\xf6\x91\xe5\xea\x1b\xf2\x34\xa8\x28\x02\x0c\x46\xa3\x66\xfa\xe3\x6e\x71\xe7\x45\x3f\x1f\xf7\xcf\xeb\xd5\x7a\xf3\x73\xbd\xf7\x5a\x49\x4c\x45\x2c\x49\x0c\xb0\xec\xa3\x0f\x24\x75\x06\xed\xff\x13\x46\x41\x45\x99\xa9\xe6\x7c\x7e\x79\x68\xfe\x8a\xeb\x40\x91\x8c\x63\x10\x2a\xaf\xd7\xbc\x19\x10\xa6\xda\xcb\x94\xc5\x18\xac\x3d\x96\xbf\xe1\x52\x54\x75\xfc\x5e\x1a\x2b\x9c\x81\xb2\x3c\x9e\xda\x06\xf0\x8c\x98\x3c\x8e\x85\x2c\x35\xbc\x9a\x17\x30\x16\xc5\xb2\x2c\xe9\x03\xe7\xdb\x56\xbc\xcc\x18\xf8\xb6\x6d\x1c\x72\xfc\x89\xc5\x64\x9f\xf7\x1a\x49\x7d\xaf\x62\xa6\x90\x5e\xc1\xee\xc8\xdb\xce\x5e\x2a\x2b\x2e\x0e\xf0\xf7\x52\xfc\x31\x69\xcb\x13\xb4\xcf\xbe\x55\xc0\x1b\x59\xe6\x05\x16\xd4\x8f\x26\x57\x2c\x13\xe4\x86\x78\x6a\x0b\xf9\xb6\x1a\x58\x6e\x2a\x49\x03\xac\x99\xf8\x3f\xff\x07\xa5\x90\x87\x06\xed\x3b\xd9\x57\xb5\x7d\xa5\x06\xc5\x54\x1a\xa6\xa6\xc6\x2e\x2f\x9a\xed\x72\xf3\x45\x24\x5d\xa5\x24\xc9\x7c\xfc\xb3\xce\x5f\xa7\x5f\xda\x35\xe3\x0a\x21\x1c\x68\xc9\x4f\xd2\xd0\x63\x96\xdb\xbf\xfa\xe7\xfa\x9c\xcb\x3a\xdf\xc5\x82\xaf\xcd\xaa\x35\x7c\x23\x17\x84\x7f\x4c\x65\x5c\x61\xd3\xcd\xe2\x61\x34\xb2\x99\x4c\x62\x9b\xee\xdd\x9f\x2a\xd8\xbf\x9f\xe5\x3e\x97\x65\x91\xff\xaf\x29\x93\xdd\xab\x81\x29\x3b\x3f\x20\x5c\x6a\x57\x8d\x8b\x5e\x44\x1f\x9f\x50\x22\x8a\x30\x0b\x70\xe0\xb5\x35\xb8\x47\x8b\x59\xf0\x14\xb7\x23\x55\xda\x2a\xa2\xfe\xcc\x9e\x7f\x95\x8c\x05\x63\xae\x5e\x50\xf6\xdc\xdd\xf3\xf3\x55\x42\x8a\xa4\x3e\xb6\xe2\xea\x69\x77\x59\xfb\x6c\x5b\x2a\x61\xf8\xd9\xb0\x8f\xdd\xee\xb9\x29\x64\x2b\xba\xdf\x3c\x1a\x2c\x25\x78\x10\x39\x0f\xef\x86\x37\xe0\xe2\x91\x0a\xa4\xc2\xfa\xc0\x5c\x96\x04\xed\x2b\x77\x41\x47\x09\xe6\x09\xd7\xbb\xef\xd2\x91\xf5\x33\x08\x52\xc3\x9a\xf9\x0a\xcd\xbe\x2c\xf7\xa5\x1e\xf7\x07\xc2\x28\xc5\x2c\xb7\x68\xab\x62\x71\x38\x38\x0b\x68\x5c\x3e\x65\xdb\x46\x59\x80\x59\x09\x4c\xd5\x6f\x0a\x5d\xa2\xb4\xf9\x70\x2e\x42\xc4\x13\xd5\xab\x91\xdc\xdb\x58\xe8\xf4\x39\x9a\x22\x17\x9c\x15\xad\x34\x9e\xb6\x3b\xe8\x80\x30\x83\xb1\xfd\x06\x48\x98\x23\x51\x51\xe5\x8b\x2d\x0e\x48\x2c\xf0\x44\xe9\x46\xf4\x9e\x17\x13\x38\x25\x10\x6e\x04\xa6\x51\xc8\xda\xbf\x44\x84\x86\xa4\x1a\xb0\xa2\xc3\x97\xb5\xff\x31\x4b\x04\xed\x6e\x02\x82\x06\x64\x1d\x85\x36\x04\x62\x2f\xd0\x30\x42\x1c\x89\x01\xce\x6e\xf9\xe1\x92\xc1\x7d\xba\xbc\xfa\x18\x06\xd0\x88\x10\x87\x94\xb0\x75\xc1\x86\x23\xb8\xe1\xef\xb0\xe2\x07\xcf\x73\xc8\x80\x32\x23\x43\xd1\x79\x7e\x39\x16\x00\x5c\x33\xff\xc6\x3d\x8f\x09\xf5\x9c\x62\x88\x48\x6c\x55\xfe\x95\x50\x02\x83\x44\x50\x6d\xcd\x9b\xf6\xf4\x84\x2a\xa6\xf3\x46\x04\xa4\x22\x45\xec\xc2\x1b\xaf\xd7\x45\xd9\xbe\xbe\x2d\xb7\xbb\xaf\x4b\x9a\x20\x63\x21\x66\xf6\xf8\x2b\x14\x86\xd3\xb9\xbe\xa2\x4b\xc5\x20\x4b\x28\x5c\x14\x52\x5c\x43\x89\x4f\xef\x4d\x39\x3a\x23\x66\x36\x6e\x0a\xd9\x4d\x29\xab\xa9\x3c\x03\xa8\x86\x2c\x33\x2a\x33\xa8\x2d\x8c\xae\xa6\x69\x65\x2f\xf3\x20\xc4\x98\x2e\xc2\x85\xa2\xc9\xbd\x3c\x10\x28\x05\x2a\xda\xf3\xf6\x7f\x5b\x47\x22\x9f\xce\xc7\x6e\x81\x5b\x85\xc3\x23\xff\xf4\xa6\x11\xf0\x38\xc2\xd8\x00\xa0\x32\xfe\x16\xe5\x02\xef\x7b\x57\x12\x78\x6a\x68\xba\x9f\x41\x1b\x50\xf8\x1f\xf3\x27\xcd\x64\x14\xb8\x88\x53\x3a\x2c\x3b\x74\xd9\xc9\x2b\x71\x11\xe0\xd2\x68\x2b\x7a\x8e\xef\xce\xcc\x5e\x14\x6a\x39\x5b\x56\xd9\xdf\x27\x80\x9b\xe0\x58\x59\x55\xe5\xa4\xe0\x13\x64\x60\x04\x83\x6a\x2b\x9d\xb0\xe5\x57\x58\xd3\x19\x48\x62\xaa\x8d\x5f\xdb\x5c\xd9\x20\xce\x11\x0a\x04\x3e\x70\xd9\x80\xc2\xe8\xef\xae\x7c\xf2\x65\x3b\x20\xb5\x8c\xc3\x21\x48\xd5\x42\x87\xc7\x9b\x93\x4a\xc2\xd8\x13\xcd\x0e\xe3\x7d\xee\x31\x2a\x95\x99\xe1\x27\x29\x2c\x83\xcf\xe4\x47\x28\x45\x91\xf5\xf4\xc4\xcf\xb7\xe5\xc4\xa2\x07\x60\x71\x9a\xba\x2a\xb0\xe3\xa9\x81\x7d\xc4\xc6\x1d\xd0\x54\x5a\xee\xd0\xbf\x24\xd3\xff\xff\xfa\x5f\xd7\x23\xce\xf1\x5c\xf4\x73\xc3\xf0\x84\x0d\xda\xba\x23\xb4\x6b\x8a\xc0\x16\xd1\x9e\xbf\xa2\x20\x65\xa0\x81\xbb\x53\x1a\x2b\x5c\x6c\x90\x79\xb4\x00\x74\xa0\x88\x45\x09\x14\xf0\x23\xf7\x1b\xb3\x26\x61\x60\x23\x9f\x06\xec\x60\x37\xda\xc8\x5d\xce\x24\xa2\xd1\x2a\x0c\x63\xcb\xb2\x50\xbb\xdc\x7b\xf2\x9a\x06\x86\x6e\x5f\xe5\x35\x1e\xd9\xa0\x6e\x80\x1f\x46\x09\x4c\x4d\x05\x41\x43\xc1\x72\x03\x97\xe5\xf4\xba\xcc\xd2\x3e\x41\x74\x63\x9f\xb4\x6d\xe0\x34\xfe\xdc\x9a\x49\xc0\x50\x23\x37\x85\x9d\xb8\x32\x2c\x10\xd8\xb6\x88\x83\x18\x43\x3f\x60\xe9\x56\x26\x24\xf3\xfd\x11\xa0\x93\x20\x4e\xa3\x61\x09\xfe\xea\x92\x39\x48\x27\xa1\xc9\x9b\x9e\xda\x61\x0a\x71\xf0\x10\x50\x58\x68\xf3\x00\xf2\x7d\x10\x13\xd5\x59\x68\xc8\x2b\x24\x3f\x1c\xd6\x9f\x39\x86\x65\x5f\x8a\xf7\xa2\xfc\x28\xe6\x3d\x7b\x9d\xb1\x98\x1b\xd1\x72\x4c\xf1\x4f\x78\xc9\x74\x96\x1a\xbc\xea\x11\x5e\x5d\xf6\x44\xf3\x30\xc3\x5a\xf5\xfb\x7b\x97\x35\xd0\x02\x92\x88\x58\xf5\xa8\x43\xb3\x3f\xf1\x73\x53\xba\x6b\x92\x12\xb4\x59\x1f\xe0\x03\x2a\xff\x10\x99\x99\xa4\x99\x01\x78\xee\xbe\x6f\x9e\x6f\xf6\x37\x9b\xed\x0a\x7d\xaa\xfb\x97\xbb\xdd\xe6\xe9\x6e\xb3\x76\x30\x60\x0d\xdc\x40\x29\x9f\x9e\xd7\x06\x06\xba\xdd\x2d\x9e\x77\x4e\x34\x8c\x69\x80\x04\xb3\x1e\x96\xed\x07\x0f\x9a\xc9\xb6\xad\x75\x14\x60\x74\xef\xbe\x2c\x7b\x91\x5e\x7f\x2d\x32\xc5\x7e\x07\x7e\x7e\xb0\x5d\x8f\x83\xc0\x66\xc7\x0d\x73\xaf\xce\xc7\x83\x17\x07\x61\x18\xbb\x62\x34\x94\x06\x81\x2b\x8c\xa0\x71\x10\x26\x1c\xa1\xaa\x27\x8c\xb9\x3d\x97\x03\x22\xa4\xc9\x23\x45\x82\x01\xef\x5c\x96\x28\xff\x1d\x0e\x76\xad\x38\x88\xc2\x10\x45\xaa\xef\xf3\x02\x6e\xf3\x62\x10\x47\x8d\x83\x28\x95\x68\xb2\x60\x2d\x93\xd9\xee\x5c\x15\x78\x1c\x44\x19\x24\xc2\x42\xd5\x96\x4f\xeb\xed\xa3\x11\x93\x2d\x31\x66\x31\x44\xc1\x5c\x44\xb6\xe2\x80\x70\x0a\x64\x20\x68\xf0\xfd\xe9\xea\x8e\x36\xfa\xcd\x84\x03\xda\xbf\xff\x29\xe5\x3b\x9c\x6f\xb7\x7f\x8c\x87\x84\x08\x95\x18\x13\x73\xf0\xcd\xae\x1b\x51\xd3\xe2\x92\x38\x20\xd2\x70\x80\x3e\xc0\xc7\x53\x0e\xea\x29\x3f\x41\xb5\x1a\x10\xe5\x5c\x44\x05\xfa\x5b\x69\x48\x8c\x68\x88\xdb\x0b\x7f\x14\xe5\xc7\x01\xd4\x2b\x2c\xdb\xb3\x11\x00\x98\xf4\x96\xc6\x3a\x71\xa4\x7f\x8b\x42\x5d\xe3\x12\x1f\x94\x8e\xc4\x01\xcd\x32\x64\xc6\xec\x0e\x1f\xa7\x1c\xff\xdc\x1b\xf8\x71\x40\x85\x11\xc7\xeb\xec\xa9\xcf\x06\x8a\x7a\x0a\x77\x8d\x03\x0a\x19\x56\x75\x28\x38\xdc\xe6\x87\x66\x12\x5b\x8a\x03\xa6\x13\x64\x9d\x7a\x83\xc3\xa1\x1c\x14\x8c\x74\x1b\x92\xe1\xe8\xa9\x91\xde\xd5\x16\x77\xcf\x4f\xba\x24\x49\x71\xbb\x31\x8d\x26\xb0\xda\x59\x83\x2b\x0e\xd2\x40\xe0\xce\xf0\x23\xbf\x79\x73\xb1\xa0\x38\x48\xd3\x00\x23\xcc\x8b\x3e\x78\x1d\x07\x19\x17\x51\x3c\xc0\x77\xb8\x02\xf2\xaf\x60\x1e\x71\xc0\xb9\x51\xe2\x2a\xe0\xe3\xb6\xac\x5e\x3b\x3b\x7b\x32\x36\xc2\x6a\x4b\x18\x38\xd8\xd0\x3f\x9d\x3c\x4a\x24\x09\x9a\x45\x88\x7c\x5b\x3f\x6e\x3d\x16\x6b\x06\x64\xe4\x6e\x51\x72\x08\xaa\xaa\x67\xb7\xcf\x38\x90\xa1\x71\x96\x91\x01\xc8\x7a\x8f\x63\xad\xe7\x71\x4f\x24\xe1\x88\x4f\xec\x36\xe8\xdb\x4b\xe7\x77\x76\x1a\x49\x6e\xc8\x82\xcc\x04\xb2\x61\xc7\xfc\x32\x24\xee\x9a\x4b\x81\x69\xf1\xce\xa5\xa8\x96\xed\x19\x21\x13\xee\x53\x48\x88\x90\x5a\x42\xe7\x85\x7a\x80\xcf\xe6\x3e\x2f\xda\xc1\xb0\x8d\x5e\x0b\x0a\x13\x88\x77\xd0\xd4\xdf\x4a\xa3\x76\xf9\x65\xd4\xe3\xbf\xb2\x43\xe2\x40\xb3\x18\x01\x04\x98\x36\x58\xc8\xb2\x72\x81\xcf\x38\xd0\x31\x8d\x0d\xe9\x73\xb7\xa3\xe6\x2e\x20\x13\x87\x81\x30\xb0\xbb\xce\x33\xb8\xc6\xe0\x1f\x87\x21\x89\x02\x36\xe0\x21\x5a\x9e\x4d\xb6\x6b\x5c\xc7\x37\xbd\x89\x72\x3c\x00\xad\xe3\xf0\xf4\x78\x09\xdc\x8a\xc3\x30\x31\x9e\xf8\xa7\xd1\x98\xb8\x05\x23\x24\xee\xba\x17\x2a\x30\xa6\x8a\x29\xf4\x33\x87\xff\xe8\x24\x8d\xc3\x28\xe3\x8c\x9b\xb2\x50\x5b\x7e\xe5\xaf\x48\x69\x35\x91\xb1\x9c\x0e\x91\x6b\x16\x4d\x7d\xfd\x33\x87\x24\x48\x33\xed\xe4\x00\x9b\x7a\xfd\x1b\x8a\x45\xa1\x1e\x6f\x6e\x26\x5d\x27\x11\x20\x3f\x6d\x93\x1f\x61\x09\xcd\x07\x40\xe1\xd0\x3f\xae\x45\x92\x19\xa1\xbc\x43\x8e\x31\x19\xd8\x1e\x79\xe5\x33\x01\xcb\x73\x03\x2b\xef\x99\xc4\x21\x15\x2c\xea\xeb\xd0\x7a\x93\xfd\x89\xcb\x77\xfe\x0a\x9b\xfe\xb9\x54\x71\xdc\xba\x74\x05\x30\xb2\xed\xe2\x90\x59\xb3\x7f\xdd\xbc\x2d\xa1\xe9\xb7\x8a\x90\x65\x9c\xd8\xb2\xf2\x2f\xe5\x1a\xe2\x30\xce\x00\xd3\x29\x28\x5a\xd3\x56\x05\x37\xe4\x59\x05\xea\x01\x54\xbe\x13\xb1\xa6\xa1\x9f\x6d\x2e\xb8\xef\x2e\x26\x29\x47\xd7\xac\xaf\x71\xec\x6d\x82\x38\x4c\x34\xc4\xe0\x72\xf8\x9e\x9e\xf4\x2b\x37\x34\x0e\xd3\x40\x21\x61\x4e\x9d\x1f\x7e\x43\xb5\x2c\x3f\x07\xa9\xaf\x38\x4c\x23\x43\x67\x2d\xdd\xfe\x73\xaa\x72\x39\x23\x6d\x35\x7d\x28\x0f\xd1\xa5\xff\x8d\xcc\x6a\xfe\x61\x2a\xc4\x31\xb4\xe0\x14\x53\xde\x5f\x0f\x8b\x1d\xe2\x30\x63\xca\xf0\x0c\x3e\xac\xf7\x37\xeb\xd5\xe6\x7e\x71\xb7\xff\xc7\xcb\xe2\x61\xf7\x72\xbf\x5f\x2c\x57\x7b\x5b\x5e\xf3\xbc\x59\xad\xff\xe8\x6f\x71\x45\x99\x28\x68\x3e\xaf\xbb\x15\x87\x59\x26\x62\xe5\x82\xfb\x75\x53\x1e\xa1\xb2\x04\x56\x93\x89\x9f\x09\x93\xae\xf8\x06\x8d\xc1\x3f\xd8\xbf\x8b\xc0\x30\xc1\x4b\xe3\x7e\xe5\xe2\x00\xb8\x5c\x77\x86\x56\x63\x32\x8d\x45\x6a\x34\xce\x0c\x7f\xcf\x37\x43\x5f\x89\x1a\x34\xdd\x61\xdd\xf8\x51\x91\x44\x52\xab\x58\xd9\xcd\x48\xd4\x35\xde\x7d\xef\x61\x2f\x71\x08\x34\xb2\x5c\xf7\x03\xb8\xfe\xe8\x5d\xc0\x04\x42\xee\x24\xaf\xd4\x16\x9a\x7a\x53\xac\xf2\x0a\xed\x84\xa9\x22\x7a\x1c\x02\x4f\xf0\x00\xc0\x23\xa5\x3b\x3d\x3d\x4d\xe3\x7c\x20\x6b\x00\x3c\x8b\x43\xd0\x0a\x5f\x74\x5f\xbf\xae\x8b\x57\x17\xe3\x71\x57\x75\x68\x12\x78\xda\x52\xfa\x76\x9b\x41\x77\xcc\x44\x7f\xf8\x06\x84\x87\x9e\xaf\x54\x55\xfc\xe3\x1b\xaf\xff\x7f\xac\xbd\x59\x73\xe3\x38\x96\x3d\xfe\x75\xea\xa1\x1f\x48\x82\x04\xc0\x47\x59\x96\x9d\x9a\xf4\x36\x92\x32\xb3\xaa\x3b\x3a\x14\x58\x2e\x64\xb6\x29\x52\x4d\x52\x76\xba\x3e\xfd\x3f\x78\x01\x70\x13\xed\xcc\xf9\xc7\x6f\x22\x26\x2a\xdb\x04\x29\x2e\xc0\xc5\x5d\xce\x3d\x67\x72\x7f\x86\x08\xd4\x01\xd0\xd5\x69\x90\x75\xa4\xa1\x91\x04\xf3\xe3\xf7\x65\x67\x88\xa2\x80\x45\xd8\xc1\x5d\x98\x72\xdf\xcc\x48\xc5\x4f\x1d\x82\xb9\x36\x32\x1a\x05\x32\x31\x8e\xdb\x56\xbc\xdb\xc0\xad\xfb\x01\x50\x08\xc1\xfc\xfa\xd7\x72\x07\xe2\xe8\xff\x1c\x46\x11\x02\x9e\x16\xed\x0c\x1e\xde\x65\x14\x9a\x94\x5a\x96\xe6\xf6\x1b\x5f\xaf\xaf\xbf\x94\xb9\x9e\x24\x5a\x69\x14\x05\xc6\x75\x1d\xda\x64\x47\xd7\x3f\x6a\xdb\x1a\xaa\x01\x5f\x37\x8d\xa2\x90\x63\x17\xea\xa9\x2a\xff\x03\xaa\xf1\xf3\xa7\xbb\xc7\x28\xb6\x91\x44\x56\xd7\x67\x70\xc0\xe7\x4b\x24\xf2\xe4\x06\x84\x91\x41\x07\xc2\x87\xca\x8a\x5b\xdf\x94\xd5\xc3\xf9\xf8\x49\x1a\x85\x46\x24\x31\xdc\xf6\x6e\xe7\x36\xc9\x7e\x2f\x5e\x3e\xa8\x94\xd0\x88\x50\x86\x19\xc1\xec\x64\xea\x1e\x72\xda\xfe\xdd\xf2\x83\xfb\x74\x0b\xf2\x39\x8d\x98\x22\x26\xe8\x83\xf1\x3d\xc4\x01\xc1\x69\xb6\x85\x66\x71\xfe\x79\x49\x78\x4b\xa3\x84\x18\x74\xe4\xff\x74\xff\x17\xf0\xf1\x24\x8b\x12\x69\xad\xde\xb0\x3c\x7c\xb5\xf9\xf3\x49\xcc\x43\xb8\x07\x27\x42\x2a\xc3\x11\x8b\xd7\xac\x83\x1a\x51\x12\x22\xe2\xee\x2e\x53\xad\x97\x5c\x1c\x46\xb3\x84\xd2\xc8\x78\x3a\x69\xa4\x64\x16\xa7\xac\x11\x79\xf6\xf7\xcc\x82\x8d\x28\xa5\xa9\x2f\x6f\x94\xd5\x45\xf6\xd6\x8f\x52\x49\x64\x27\xf1\xad\x98\x08\x41\xd0\x88\xa5\x02\xef\xfa\xb5\x6c\x00\xd5\x63\xfd\x8d\x30\x1d\x18\x9f\x16\x12\xc7\x93\x18\xd6\x71\xc6\x77\xc1\xb5\x46\xe7\x7c\xb7\x58\xdf\xf9\xb3\xd3\x80\x62\xce\x0f\x7e\x3a\x5a\xc9\x4e\x17\xd7\x72\x98\x5e\x6f\xf7\xa7\xaa\x2c\x0d\xa2\x56\xde\x87\x84\x48\x1e\x49\x32\x4c\x96\xd3\x28\x0d\x23\x0c\xca\x5b\xab\xb4\x1b\x90\xe7\x5e\x12\x91\x4c\x6e\x2e\x55\x1a\xa1\x0c\xce\x32\x3b\x16\x50\x7f\x10\x18\x22\x92\x74\x59\x94\xd5\x5d\xd7\x5c\x4e\x23\x21\xa8\xa7\x6f\x7b\x28\x35\xac\xf5\x1f\x63\xbb\xa0\x12\x4b\xb1\xdb\x46\x01\xaa\x44\x84\xf0\x0f\x80\x97\x8b\xb2\x12\x8d\x94\x11\xa1\xbb\xd2\xfd\xfb\x43\xe9\x8e\xbb\xec\x14\x8d\x34\x8b\x03\xeb\x57\x94\x7f\x43\xe1\x29\x2d\x69\xa4\x95\xf6\xbc\xcc\x5b\x28\x9a\x81\x26\x58\xdd\x0d\x01\x60\xad\xc1\xfd\x72\x3e\x8a\x02\xeb\x32\xa3\x89\x04\x42\x39\xd8\x0a\xcc\x90\xe8\x75\xef\x7a\x74\xb3\x46\xc0\x88\x61\xfe\x82\x34\x96\x92\x20\x8c\xbc\x9d\x6e\xd7\xed\x53\x86\xea\x94\x73\xe9\x7b\x4a\x02\x63\x99\xd5\x94\x28\x56\x45\x03\x55\xdf\x28\x85\xc7\x90\x25\xe7\x9f\xbf\x27\xc2\x44\x49\x18\x4b\x44\xd8\xa1\x67\x59\xbc\x4f\x05\xb7\x28\x09\x99\x41\xbf\x16\x2f\xb8\x6f\x9d\x1f\xdd\x1d\x92\x96\xbf\x14\x15\x11\xbe\x23\xaf\x5c\x77\x08\x18\xc2\x55\x50\xbc\x6c\x53\x4e\x5a\x5a\x28\x89\x42\xdb\x48\xec\x57\xf5\xd3\x94\x0b\x80\x92\x08\x28\xf6\x33\xee\xdb\x28\x65\xa3\x07\xba\xee\x6e\x00\x09\x78\x6c\x5c\xc2\xe2\xb6\x02\x18\x16\xb4\xc7\x0f\x49\x12\x17\x5d\xb6\x96\x7e\x5d\xbc\x8a\x7a\x66\xcf\xf2\xc9\x0c\x42\x40\x3a\xa2\x45\x2f\x7d\x8f\x2e\xbb\x7f\xb4\x38\x4e\x8c\xb3\x0e\x37\x00\xf8\xf2\xc7\xf7\x15\xeb\x80\x78\x3d\x85\x4b\x2d\x35\x4a\x62\xa7\xc8\x88\x3d\x48\xdb\xae\x9b\xe5\x23\xe1\x7a\x4a\x92\x38\xc1\x3e\xdd\x5e\x20\x08\xbb\x63\x1b\xf8\xd9\xec\x0d\x40\xfd\xc7\xe8\x61\x93\x58\x62\xce\x14\x89\x8d\xce\x43\x7e\x35\x4a\x12\x26\x6d\x8f\xe8\xf1\x94\xef\x4d\x59\x1d\x7e\xe9\x59\x92\x44\xa4\x68\x39\xef\xb3\x22\x3b\x9e\x8f\x3e\x95\xee\x8f\x4a\x83\xd5\xaa\x17\x78\xbf\x6d\xa6\x82\x1e\x7e\x8c\xa6\xd8\x40\xea\xa9\xea\xc7\x45\xee\x4f\x32\x31\x7d\x3a\x93\x12\x1a\x46\xd4\x27\x57\x1e\x0b\x68\xcd\x82\xbf\x07\x4a\x15\xd8\x3c\xe1\x6e\x71\xb7\x5f\x2f\x1f\xfb\x06\x70\x4a\x28\x0f\x31\xc9\xae\xb3\xda\x63\x02\x10\x4b\x7a\xc1\xac\x41\x09\x4b\x9c\x02\xbd\x33\x84\x9e\x9a\x6d\xd6\x02\x12\x1e\xd2\xd8\x95\x52\x97\xcf\x5d\x8f\x10\x25\x3c\x0e\x58\x67\xf9\xfb\x54\x32\x25\x3c\x89\x2c\x3f\x0f\x66\x0a\x5b\x37\xa4\xea\x0e\x71\x40\x12\xdf\xfd\xa2\xc9\xdb\xf0\xa3\x1e\x9a\x1c\x92\x12\xb0\x4d\xdf\x99\xe3\xd7\xdc\x42\x63\x55\x2a\xa7\xd4\xb3\xa3\x97\x38\x7e\xb8\x34\xe5\xd0\x8b\xba\x7e\x2b\xb2\xa6\x7e\x2c\x60\xd5\x3c\x2f\x45\x31\x50\x6e\xee\x46\x1b\xc5\x3c\x5f\x6c\x03\xc7\x87\xb2\x75\x55\xb6\x53\x82\x6f\x4a\x44\x0c\x3e\x9e\x5e\x8a\xaa\xb9\x83\xe2\xe0\xab\xf0\x94\xa8\x50\xe0\x9e\xaf\x44\xae\x6e\xb2\xc3\xf3\x1c\x75\xff\xe5\x84\x53\xca\xea\x2c\xf9\x64\xbb\xbf\x9a\x0e\x62\x14\x59\xb1\x32\xcb\x60\xa0\x1a\x70\xd7\x7f\xca\x79\x41\x89\x76\x12\x5b\xc2\xc2\x92\x1e\x3a\x80\x34\x25\x10\x81\xf4\xba\x95\xad\x17\x6d\x93\xa9\xf3\x97\x81\x24\xf2\x5a\xf7\x33\x6d\x0b\x94\x80\x54\x48\x8a\xec\x78\x01\xf1\x2d\xfb\xdf\x31\x71\x8a\xad\x26\x77\x67\xf5\xf2\x7e\xdd\x47\x7c\xc4\x68\xeb\xf1\xe2\x49\x93\x1e\x61\x3f\xc4\x70\xac\x64\x28\xab\x71\xd6\x67\x60\xe2\x76\xdf\xa0\x18\xe1\xb5\xa6\xe4\xb2\xb9\x78\x74\x7f\x71\x10\x73\x9b\x4f\xb5\x79\xa2\xbb\xf2\x90\xa9\xcf\x14\x3a\x69\x1c\xb0\x24\xea\xa7\xcd\xbc\xd7\x19\x87\xc2\x66\xac\x84\xd6\x4f\x55\xf6\xea\x8a\xde\xab\x42\x5f\x5f\x6c\xdc\x71\xc4\x62\x94\x5c\xaa\xcf\xf2\x98\x0d\x37\xe0\xcf\xd2\xa4\x71\x24\x6d\x9c\xe3\x4b\x10\x3e\xce\x19\xc7\x91\x71\x64\x02\x8b\xc0\x7a\xdc\xf9\x3f\x91\xc0\x66\xc6\x0e\xd0\xec\xb1\xd2\x87\x97\x9d\x3c\x25\x89\xa9\x65\x61\xa8\x77\xe2\x05\x9e\xa0\x3a\x66\xcd\x67\x1a\x80\xbf\x42\x68\x4d\xae\xce\x19\x3a\x8a\x27\xfb\x6d\x77\xe5\x78\x5f\x9f\x8c\x8e\x03\x69\xab\x82\x67\x39\x66\x8f\x70\xc7\x13\x16\x21\xda\xfe\x98\x15\x56\x18\x75\xd8\xd8\x40\xe3\x04\x94\xb2\xf5\xf7\x42\xe7\x60\xc1\x94\x57\xd6\x3c\xf8\x21\x34\xa4\x91\xef\xa5\xfb\xbe\xdf\xc4\x93\x2f\xc4\x62\xa2\x13\x8f\x49\xb9\xcf\x3a\x22\x01\x1a\x33\x6a\xf9\x22\xb2\xda\x6d\x06\xeb\x62\xd0\x3a\x4b\x63\x26\xa3\xc0\xd3\x9c\x8a\x9f\x1f\x15\x3a\x62\xa6\x08\xa2\xb9\x9b\x7d\x58\x37\x7b\xac\x41\xac\xba\x00\x30\xe6\xdc\x92\x67\x39\xf6\xcb\xfd\x5b\x6f\xe9\xe3\x34\xe0\x8e\x22\xb2\x11\xb9\x85\xe0\x75\xdf\x5e\x44\x04\x3d\x8e\x7d\x83\x1c\x27\x03\x98\x3d\x8d\x05\x89\x48\xda\xcd\xe2\xd5\x4f\x50\x93\x09\x20\x84\xc2\x9c\xb4\xa3\xab\x5b\x96\xc5\x7f\xce\x55\xff\xe0\xd2\x44\xb8\x0a\xb6\xe7\xe3\x11\xaa\xd6\xd7\x28\xfa\x43\x04\x05\xd4\xfb\xc6\x39\x7b\x5f\xfe\xb8\x66\x04\xb1\xe4\xff\xd3\xd7\xe0\x68\x0c\x01\x41\x0e\x9d\x9b\xc5\x93\x1a\xfd\x99\x23\x3f\xa0\x0f\x0c\x9e\xc4\xb9\xd6\x93\xaf\x03\xdc\xee\xee\xae\x22\xf2\x30\x39\x6c\x22\x8e\x54\x2e\xd6\x3d\xc5\x54\xfa\xec\xfe\x1e\xce\xff\xc7\x5f\x25\x8d\xb1\x21\xc0\xbe\x2f\xcb\x89\x50\x56\xef\x77\x3d\x90\x6a\xb0\x35\xc7\x46\x38\x89\x3a\xa4\x62\x77\x01\xb6\x53\xc5\xf1\x43\xa4\xd5\x14\xdc\xb7\x5b\x81\x25\x92\xcf\x8a\x83\x25\x6f\xeb\x03\xef\x24\x88\x12\x5b\xd9\xaa\x31\xbf\xb8\xb5\x44\x00\xab\x62\x20\x1b\xd5\x8d\xd4\x88\xcd\x90\xa2\x06\x6f\x33\xdd\xa1\x30\xb2\x18\xc7\xe5\xc3\xf2\xd7\xfe\x6f\x12\xc7\x80\xfe\x7c\xa6\xca\xed\x09\x14\xe6\xb3\xaa\x63\xf7\xe9\x93\x98\x07\xcc\x52\xcd\x61\xe7\x41\x4f\xcd\x35\x6f\x0b\x93\x84\x70\x44\x3d\x08\xd3\x40\xb5\xdd\xad\x2e\x88\xaa\x68\x92\x68\x26\x6c\x8b\x3a\xe2\xff\x47\xec\xb5\x23\x05\x1b\x9a\x24\x46\x47\x6e\x73\xda\xe6\xe5\xdb\xf5\xf9\x38\xae\x3b\xd3\x84\x06\x3c\x19\x90\xc5\xba\x5e\xc1\x01\xf9\x28\x4d\x28\xb3\xab\xc6\x1a\x7d\xec\x4d\x9c\xa1\xa8\xa2\x09\x0b\x80\x3a\x75\x5b\xdc\x11\xca\xca\x87\x84\xfb\xad\xc2\xd6\x93\x79\x57\x28\x61\x69\x8a\x00\x1e\x6b\x6d\x5c\x6d\xe8\xc3\x37\xc4\x03\xdb\xfe\xfa\x05\xaa\x12\xa1\xd1\x70\x51\x73\xfa\xed\xb2\xc1\x05\x02\xb4\xbd\x3c\xf7\x6c\x07\xdb\x93\x57\x93\xe9\xe6\x0d\x4f\xac\x4b\x62\x67\xf6\x43\xd9\x88\xac\x82\xd9\xad\x2f\x49\x15\x78\x02\xeb\xab\x91\x1e\xd7\x64\x98\xb6\xad\x8a\xe7\x2a\x9f\xcc\xd1\x54\x2b\xb0\xa8\xf9\x5e\xc0\xd3\x1d\x12\x81\xd1\x7d\x45\xe1\x29\xfb\x09\x79\xaf\x66\x36\x59\x8d\x89\x88\x03\x4b\xa6\x87\x38\xaf\x3a\x3b\xcc\xea\x8d\xd3\x44\xa8\x04\xa1\x72\xad\xd3\xfa\xad\xc0\x0e\x91\xee\xf7\x34\xb7\xb3\xbc\xde\x80\xd0\xef\xbb\xd2\x7a\x39\xe3\xfb\x95\x61\x94\x98\x2e\xad\x8b\x6a\x73\xf3\xbe\xc1\xe4\x83\xca\x38\xf5\x9c\x70\x57\x42\xbe\xdf\x8b\x97\xac\x98\xa9\x90\x24\x8a\x82\x00\x8f\x2f\x17\x98\x05\xbd\x24\x54\xa3\x89\x4a\x13\x2b\x17\xd4\xb5\x78\xcc\xef\x23\x89\x52\x2a\x70\x5d\xb2\x77\x8d\x7e\x12\x95\x38\x7e\x48\xa2\xeb\x4f\x01\x45\xa2\x8e\x3d\xdb\x15\xb8\x7d\x6e\xfa\x43\x5f\x72\xfc\xb8\x3a\x4c\xa4\xed\xc9\xf2\x74\xe0\xfe\x80\x00\x34\xdf\x9e\xef\x58\xd3\xfb\xb2\x68\x9e\xbd\x11\x4c\x8c\x24\xdc\x7a\x19\xdb\xae\xda\x46\x83\x30\xf2\xbd\xa8\xf7\xef\x6b\x05\xd7\x95\x38\x74\xef\x82\x06\x31\xc3\xfa\xf5\x2d\x34\x17\xd4\x90\x94\x86\x81\x46\x5b\x83\x7c\xa5\xb6\xbf\xcb\x9f\x18\x6a\x90\xb1\x4f\x51\x7e\x11\x95\x56\xe2\x34\x2f\x79\x38\xb9\x24\x00\x36\xf6\x62\x16\xa9\xef\x60\xa6\x34\x34\xa0\x2d\x72\xdc\x51\x97\x8f\x97\x01\x8d\x82\x84\x07\x83\x26\xc1\xd1\xe6\x4c\x49\x0c\x88\xba\x54\x50\x35\x99\x99\x44\x1b\x94\x70\x8d\x39\x88\xbb\xf2\xb0\x83\xe3\x29\x47\xba\x51\x10\x33\x26\x64\x64\xbb\x69\xcc\x13\x19\x8d\x18\x21\x36\x50\x97\xf9\xeb\x34\xb2\xa3\x09\x09\xe2\xd0\xcb\x16\x59\xba\xe5\x71\x23\x08\xa5\x54\xb1\xd4\xe5\xe5\xbc\x60\x34\xbe\xaf\xa5\x98\x58\x5c\xca\x58\x12\xa6\xfd\x0e\xbc\x85\x06\x09\xf5\x2d\x6e\xf5\xff\x2f\x90\xcb\x5f\x5b\x48\xcf\xcc\x83\x25\xe2\xee\x2e\xc7\xcf\xc3\x13\xea\x24\x31\x54\x59\xcd\xb3\xb3\x50\xca\x79\x8c\x94\xb7\xf6\x95\xed\xca\x6d\x76\x28\x56\x3f\x05\x02\x17\xfc\x10\x6d\xb0\x28\xa9\xcb\x09\xab\xf2\x3f\x2e\xa0\x1e\xfe\x0c\x00\x84\x36\x97\x27\x2c\xae\xd8\x96\x8f\xb1\x17\x4e\xb9\x61\x58\x15\x86\x9f\xea\xf9\x06\xba\x1f\x4b\x53\x89\x5b\x76\x1b\x25\x88\xf7\x5d\xbb\xfc\xff\xf8\xc4\x15\xf9\x8d\xff\xf8\x0b\x2b\xdb\x9a\x91\x79\x44\x67\xbd\x2e\x3e\xc6\xaa\x50\x11\x93\x50\x4f\x88\x9f\x3f\xd5\x72\x19\x00\x4b\x47\x06\x93\x0a\x61\x2c\x61\xd1\xd9\x3a\x48\xfe\x49\xa5\xa6\xb8\xc1\x3b\x77\xb3\x79\x5e\x2f\x1f\x77\xcf\x15\xd4\xcf\x65\x7e\x09\xb3\xfc\xc5\x94\x50\x51\x82\xc5\x36\xdd\x55\x3b\x07\xc2\x84\x1f\xac\x62\x45\x99\xe3\xfe\x1f\x8b\xb9\xd7\x73\x14\x21\x94\x42\x1c\xa4\xae\xa2\x3a\xd6\x32\xa2\x14\xd2\x08\x23\xa3\xd5\x76\xd9\xb3\xd3\xf8\x63\x9a\x1b\xe6\x90\xd6\xb7\x50\x40\x9d\xd5\xeb\xe3\xa9\xac\xba\x98\x97\x05\x91\x95\xc1\x5c\xde\x2d\xd6\xf7\xfb\xed\xfa\xf6\x61\xb5\xd9\x7f\x5d\xfd\xd5\x1d\x4f\x04\x36\xcf\xd7\xd9\xa1\x38\x9f\x10\x44\x61\x85\x07\xf2\xc9\x8c\x67\x61\x68\xa9\x43\x3d\x4d\xb3\x17\x68\x3e\x5f\x10\xc9\xb7\x63\x6d\xd3\xe3\xba\x78\xc5\xfc\xe8\xa9\xca\x6a\x18\xd8\x32\x16\xc6\x96\xac\x0a\x7b\x38\xf7\x12\xe6\x71\x2c\xdc\x8f\x4e\x0c\x76\x50\xe7\x60\x9a\x38\x9e\xfe\x16\x4d\xd0\x53\xbe\x2e\x5f\x33\xb8\x12\xd5\x7d\xd6\xfc\xfd\x2a\x7c\x06\x84\xc5\x61\xe0\x69\x79\x2d\xa8\xfc\xae\x14\x13\x88\x0a\x8b\x43\x9b\x4f\x3c\x66\x05\x2c\x6d\x33\xe4\xa4\x42\xc7\x62\x08\x94\xfb\x9e\xa3\xc2\xfb\x80\xb0\xc2\xdf\x2d\xe5\x09\x22\xfc\x5b\x4f\xec\xd1\x98\xa5\x28\x2c\x38\xb8\x23\xfa\xba\x47\xd7\x7b\x58\x66\x65\x2c\x66\xc2\x51\x97\xdf\x9e\xb3\x7c\xb2\x9e\x19\xa3\x36\x7a\xba\xca\x3a\x4a\xcc\x61\x7e\x8a\xb5\x61\x1f\xb3\x0b\x6a\x65\x75\x2e\x27\x04\x56\x43\xa3\xcd\x38\x05\x04\x39\x38\x41\xb2\x09\xbf\x08\x65\x5c\x89\xd0\x25\xa4\x5b\x4f\x7c\x8d\x9a\x18\xe3\xd7\xc1\x81\x86\x9e\x54\xad\xe3\x56\x72\xc7\xd2\x84\x07\xb6\x2a\x73\x5f\xea\x73\x0e\x5f\x30\x0e\x9e\x6c\x08\x2c\x4d\x24\xda\x46\x4b\x1c\x2e\x9a\x06\xaa\x62\xfa\x2b\x29\x4b\xf1\xad\x3c\x89\x97\xac\x6e\x44\xb1\x39\x9f\x3a\x63\xc6\x52\x6e\x39\xe6\x35\xe8\x0c\xf7\x7a\xe4\xf1\x9b\xbc\x38\xa1\xac\x03\x88\x79\x07\x1f\xe7\xd6\x0b\xbf\xb8\x98\x07\x27\xd9\x60\xed\x87\x13\x28\x98\x83\x71\x7b\x5b\xc7\x64\x92\xa6\xa2\xdf\x66\xef\x7b\xd9\xe8\xee\xa2\x52\x79\x99\xa0\xef\x43\x30\x00\x6b\xdd\x2f\xf4\x67\x9b\xd2\xea\xf5\x0d\x80\x0c\x4c\x01\xc5\x35\x73\x93\x67\x87\xe7\x06\x45\x10\x1e\xe0\xed\xa9\xcc\x33\x35\x5d\x8a\x9a\xb0\xae\xaa\x9f\x97\x35\xe8\xa5\x28\x74\xd6\xce\xb1\xee\xc1\x21\x26\x2a\xf4\x9b\xa9\x45\xbb\xae\x26\xf4\x57\x94\x19\x22\xb1\x2c\x7e\x2b\x8a\xbb\xec\xcf\x4c\xfc\xd1\xfd\xdd\xa2\x36\x5c\x38\xd9\x85\x4f\xd9\x20\xa6\x61\x86\x69\xaf\x22\xef\x32\xd2\x33\xfc\x1f\x94\x07\x84\x22\x12\xe5\x4d\xd4\xc3\xd6\x09\xca\x83\xd4\xea\xf8\x9c\x50\xae\x01\xeb\x81\xab\x42\x77\x9f\x86\x87\xb1\xc0\x08\x5d\x95\xa7\xf7\x27\x71\xfa\x08\x62\xc2\x43\x4d\xb1\x3a\x2b\x85\x3e\xc0\x85\xc2\x93\x1b\x14\x85\x5c\x87\x5e\x90\xa0\xba\x09\x6f\xa2\x1b\xf2\xc7\x5c\x7b\xa2\x1f\x1f\x11\x8c\xe9\x9c\xac\xc7\xa2\xae\xff\x18\x77\x6e\xfd\x06\xd0\x9f\xf2\xc8\x81\xe3\xec\x45\x36\x65\x39\x47\xb5\x42\x79\xa4\x03\x69\x53\xa3\x9e\x82\x62\xef\x78\x41\x44\x6e\x2b\x55\xf3\x97\x27\x41\x8a\x24\x68\x48\xd2\x95\x97\x67\xbd\x05\x55\x2f\x0e\x22\x2b\xea\x66\x98\x15\xe2\x84\x92\xc0\x6a\x8f\xce\xb7\x51\x53\x4e\x98\xe0\x6c\xf4\x31\x61\x37\xd0\xd6\x9f\xfe\xb0\xe6\x98\x6e\x70\x7d\x11\xfd\x24\xe6\x71\xc4\xe9\x90\x1a\xef\xaa\x2a\x5f\xa6\x4b\x9f\x27\x21\x47\x4a\x85\xed\x87\xa9\x7d\x9e\xf0\x10\x5c\x3e\x13\x09\xe4\x66\xb2\x08\xf3\xdd\x47\x94\xd3\x24\xf1\x74\x09\xc3\x2a\xdf\x38\x84\xe0\x8c\x27\xac\xef\x44\xb1\xe8\xbb\xd9\xab\xce\xe2\xd1\x38\x53\x90\x3a\x8e\x62\x27\xe6\x36\x2a\xc9\x7f\x30\x1f\x38\x37\x58\x62\x3c\xda\x1e\xe4\xc9\xae\xc9\x79\x1a\x60\x1a\xda\x4a\x9d\xdd\x9e\x45\xa5\x33\x51\x58\xd1\xd9\xf1\xc8\x34\x0c\xd0\xfc\x36\xe2\xe5\xa2\x44\xe9\xcd\x38\x17\x44\x85\x2e\x17\x38\x4a\x05\x71\x91\x10\x34\x1f\xb7\xd0\x60\x2a\x7c\x8c\x34\xe3\x42\x07\xe8\x25\x7e\x29\xf3\xcf\x93\xfb\xdc\x9f\x00\xd6\x17\x6e\xe7\x6f\xeb\xfe\xa9\xb9\xb2\xec\xfc\x1b\x91\x3c\xb2\xac\x4c\xcd\xf3\x9d\xa8\x1b\xd7\x45\xe3\x0f\x1a\x82\x93\x00\xc6\x15\x2f\xae\x74\x8c\xfd\x65\xcb\xc7\xf5\xc3\x7e\xfb\xed\xe9\xe9\xee\x2f\xac\x39\xed\xd6\xab\x8d\x07\x9b\x53\xae\x00\x02\xcf\xde\x55\x35\x59\xdd\xec\xca\xce\x97\x9f\x3a\x95\xf3\x37\xa7\xc1\xf6\xb1\xd5\x36\x95\xde\x77\x62\xbb\xe3\x40\xac\x54\x12\xa6\x16\xde\x87\xbc\x28\x2e\xcd\x35\x5b\x8c\xe3\x90\x44\x3a\xed\x19\x4b\xb7\x78\xc9\xd9\x59\x06\x90\x2a\x3b\xcb\x44\xa5\x2e\x7a\xe3\xbb\x41\xd2\x03\xbf\x1d\x64\x77\xd7\xd1\xed\xac\x8b\x25\x74\x24\x02\x94\x9b\x48\x68\xd7\xba\x7f\x5d\xaa\x59\x5b\xd4\x5a\x75\xe5\x5a\xaa\xf6\xcf\xa2\x46\xf2\x3b\x5c\xe5\x38\x85\xf6\x7f\x43\x55\xf6\x7f\xc3\xf9\xe7\xcf\xd4\x24\x60\x3e\x2b\x7e\x3e\x0e\xf3\x0a\xae\x8c\x67\xa1\xf2\xdd\x78\x08\x94\x15\xa6\xb5\x7b\xd8\xba\xf0\xdd\x08\x34\x0d\x88\x65\xda\xc5\xbb\x88\xc2\xbd\xa8\x6b\xa8\x9a\x5b\x51\x7f\xab\xc5\x01\x92\x00\x6b\x6f\x75\x37\x5a\x59\x37\x61\x71\x2a\xf3\xbc\xbb\x46\x18\x09\x62\xbd\x18\xcc\x27\x6e\x40\xcb\x73\x9e\x63\x1b\xff\xd8\x1e\xa5\x91\xb2\x9e\xed\xe9\x5c\x3f\xf7\x04\x54\x34\x8d\x74\x8a\x62\xdb\x77\xe5\xe1\x01\xce\x47\x51\xbd\xd4\x48\xf9\x7c\x11\xee\x8d\xbf\x48\x1a\x99\xd8\xe9\xca\x16\xe5\xb9\x50\xb0\x38\xf4\xb9\xd1\x34\x4e\x09\xa6\x28\xea\xb3\x1c\x18\xce\x34\x09\x02\xa3\x3b\xe4\xdc\x10\x93\x33\xbe\x76\x62\xac\xa0\xb6\x05\x9b\x2c\x9e\xd6\xfb\x73\xe5\xa1\x07\x29\x0d\x34\xb6\xd7\xbd\x65\x45\x01\x55\xa6\xbb\xbf\x33\x85\x0b\xf4\x1a\x5e\xb3\x1a\x66\x0a\xe2\x69\x7b\x2e\x5a\xf4\x63\x66\x0b\x9b\x3e\xfa\x9f\x18\x97\x8b\x70\xec\xb3\xb4\xa0\xbb\x36\xa3\xae\x74\x66\x13\xe2\xc5\x0b\xec\x2a\xa1\xad\xde\xd6\x07\x6f\x90\xa5\x0a\x21\x98\xdd\x76\x35\x09\x8a\x52\xa6\x2c\x51\xc2\x1e\xf1\x04\xa8\x8f\xd1\x13\x5c\xd1\x34\xe5\x5e\x3e\x02\x93\x7b\xa2\x6a\x0a\xa8\xc2\xfd\x6b\xf9\x36\xae\xd4\xa7\x22\x08\x3a\xd2\x08\x38\x1c\x40\xcf\x67\x68\xe6\xbf\x85\xe0\x80\xad\xba\x50\xa9\x28\x70\x9e\xc7\x4d\x59\xcd\x26\x29\x53\x49\x52\x42\x3b\x8d\xa7\x6d\x76\xa8\xc7\xb9\xbf\x54\x26\x1a\xab\xfc\xa7\x0a\x5e\xf7\xcf\x3d\x72\x0c\x0f\xc8\xce\xcc\xf4\x1c\x4a\x13\xb7\x3d\x95\x8c\xa2\xd7\x86\xa0\x86\x3d\x32\xa3\x3a\xbb\x39\xbe\x13\xc5\x6c\x87\xcd\x31\x2b\x1a\xeb\x58\xcd\x18\x82\x54\x69\xab\x8d\x28\x2b\x68\x1d\xbf\x43\x9f\x46\x48\x21\xa0\xba\xd3\xfa\x76\xd8\x1d\x27\x51\xea\x47\xe8\x04\x9f\xc5\x25\x68\x86\x35\xc6\xf1\x43\x9b\x38\xe6\xe1\x44\x73\xc3\xd7\xdc\x06\x53\xc8\x70\x8a\x20\x29\x65\x51\xb4\xdb\xec\x50\x88\x7c\x57\xde\xdb\x02\xdc\x64\x2e\x1b\xc1\x85\xb3\xaf\x1d\xa9\xd7\x07\x1f\xc5\x48\x83\x6a\x33\x12\xb3\xcb\x4f\x55\x79\xa8\x3a\xc0\xa3\x08\x02\x82\xef\xe9\x6e\xb3\xbc\x69\x27\x97\x15\x35\x52\x20\xcb\x9f\x17\xdd\xc4\xa3\xcb\x8a\x20\x51\x01\xb5\xe5\xc6\x47\x47\xf5\x34\xc1\xf3\x89\x20\xd5\x18\xf0\x1f\x2a\x51\x38\xca\xeb\x8f\x2e\x26\x43\x6c\xe1\x50\xa8\xc5\x67\xb9\x8f\x97\x95\x18\x53\x29\x50\x11\x38\xc8\x0c\x9a\xcc\xe6\xb9\x02\x58\x17\xaf\x22\xcf\xf4\xea\xbf\xae\xf8\x78\x0f\x75\xdd\x37\x1b\x89\x30\xe4\xba\x03\xa2\x78\xc0\xc5\xfd\xf6\xf3\xbc\x86\x08\x99\xc6\x94\xfc\xa9\x7c\x0b\x83\x3f\x66\xbc\x01\x11\x45\x94\xbb\xd6\xcf\x41\xb2\xaf\xcf\xad\xd3\x78\xf2\x80\x51\xc2\x6c\x42\xab\xb0\xa6\x69\x5d\xac\xce\x55\x1f\x68\x88\x48\x18\xd1\xc1\x9f\x56\xcb\xe5\xe2\x37\x8a\x4a\x22\x66\x01\x78\x25\xeb\xac\x46\x7a\x8c\xe6\xa2\x14\x2e\xe2\x94\x22\xaf\xda\xa2\x6a\xde\xca\xea\xe5\x03\x55\xc9\x79\x4f\x70\xf2\x14\xb1\xb6\x72\xdd\x35\x34\xf7\xe2\xa7\x6d\x7a\x9d\xfe\x9a\x89\x85\x19\xeb\x76\x95\xd6\x47\x75\x03\x92\x28\xb5\x4c\x99\x52\x74\x7f\xd2\x89\xee\x13\x59\x58\x52\xad\x9f\x50\xe9\x6e\x72\x71\x9a\xa6\x24\xec\xac\xc4\xb2\x3c\x1e\xb3\x71\xb3\x7b\x1c\x4c\x00\xa6\xb3\xde\x89\x60\x61\x82\x7d\x06\x3f\x56\x5f\xbf\x5d\xea\x66\x50\xc1\xa2\x04\x65\x04\xdc\xb6\xba\x9b\x41\x20\xf7\x0b\x57\x30\x4d\x84\xf1\xa0\xcf\xf6\xf3\xfd\x54\x98\xa3\x9d\x9f\x5c\x3c\xe4\xae\x3f\x30\xab\x5d\x34\x59\x5f\xbd\xaf\x27\x61\xab\xe0\x29\x57\xa8\x28\xe1\x5f\x52\xca\x14\xa6\xc8\xb6\x65\x7e\x1e\x01\x77\x44\xca\x13\x2c\x0d\xad\x97\x8f\x0f\xeb\xe5\xfe\x61\x7d\x31\x77\x46\xb3\x46\xc6\x49\x18\xbb\xb4\xc6\xa6\x94\xe7\xfa\x43\xbe\x00\x7f\x42\x62\xc9\x0a\xbf\x96\xcd\x6a\xe7\xcb\xfb\x42\x26\xca\x52\x92\xb7\x8e\xcd\xd5\xf9\xbd\xff\xbb\xc6\x54\xd5\xdb\x50\x82\xd7\xaf\x1b\xc9\x63\x2e\x7c\x51\xa3\x12\xf9\xba\xa8\x9b\x9e\x56\x9b\x0a\xa9\xa2\x94\x77\xad\x24\x8b\x8b\x3b\x73\xc3\x54\x42\x6c\x5b\xf7\xaf\xd1\x1d\x48\xdd\xd8\x97\x3a\x85\x0e\xc3\x14\xd1\xe6\xef\x8f\x6f\xc5\xa0\x58\x2e\x74\xa2\x31\x58\x82\x9f\xa7\xac\x82\xab\x4c\x4f\xe6\x04\x10\x89\xdf\xcd\xb6\xe8\xc3\xf9\x98\x97\x4d\x03\xd5\xfb\x03\x7c\x64\x21\x81\x32\xa4\x71\x36\xe7\x42\xab\xea\x3c\xfa\x66\x86\x84\x28\x0d\x8d\xb9\xc1\xeb\xf2\x2c\xa7\xd0\x45\x61\x62\x62\x7a\x30\x41\x97\xd7\x7d\x80\x37\x4f\x7a\x34\x7e\x27\x26\x66\x9e\x23\xf9\x8f\x19\xb9\x30\x2a\x8c\x4e\xdd\xbb\xc7\xc2\xa9\x6d\xd6\xa8\x2f\x2e\x24\x83\x88\xfa\x7e\x71\x2b\x46\xb3\x14\x27\x21\xb3\x7c\x28\x01\x83\x3f\x30\xac\xce\xcb\x40\x84\x28\x9f\x83\x0f\xe4\xe9\x7f\xe7\x29\xa0\xa8\x0c\x34\x60\xd0\x51\x75\xca\xc6\x9d\x60\xd8\xfc\xbb\x94\x81\x31\x3a\x70\xaa\x13\x56\x2b\xd0\xbd\x49\x19\x05\xd6\x0d\x6a\x77\x02\x95\x95\xdd\x9f\x85\xe5\xe7\xb3\xaf\xcf\x99\xa2\xa1\xac\x26\x95\x44\x30\x74\x61\xdf\x4e\xf9\xf9\x03\x10\x89\x24\x42\xbb\x6e\xd5\x66\x77\x91\x57\xb8\xcc\xfa\xcb\x58\x68\xac\x4f\xa9\xe6\x3c\xd4\xf7\xa3\x32\x89\x19\xd0\x2e\x2c\x39\x1f\xa1\x68\x1e\xc4\x44\xcd\x98\xca\x24\x85\x14\xfa\x06\x3b\x51\x89\x23\x34\x30\xe1\x92\x9c\x6c\xb3\x92\x06\x01\xa2\x8d\x77\xf7\xdb\xbf\x3e\x77\xed\xe6\xdf\x2d\x95\x21\xf6\xd8\xaf\x97\x8f\x2e\x8d\x3f\x7e\x4f\x54\x2a\xa2\x1c\x5b\x4b\x97\x06\x1c\xdf\x02\x4f\xec\x8e\xb9\x68\xca\x63\xa6\xfe\xf4\x67\x4a\x49\xc1\x0c\xf5\x89\xea\x5d\xc9\x7e\xf7\xee\x3e\x77\x4c\xa5\xe2\x1a\xbc\x9a\xb4\x4b\x4f\x44\xa5\x21\xfe\xa7\x95\x4e\xb0\x6a\xb0\x7e\xd8\xad\x6e\x37\x8f\xc3\xc5\x27\x15\x18\x64\x4e\x29\xdb\x95\xfc\x54\x96\x56\x96\xdf\x1f\xd5\x49\x1c\xda\x72\xcb\xe9\x54\x56\xa8\xa4\xfc\x79\xb9\x57\xea\x44\xa0\x8f\xec\xbb\x3e\xea\x27\x91\xe9\x27\xa8\x6c\x67\xde\xf8\x65\x6b\x1a\xf9\x8c\xe2\x1e\x8d\xff\x22\xcf\x6d\x2b\xc9\x4d\x59\xb9\xd6\x6e\x3f\x34\xb5\x65\x0d\xb4\xb0\x96\x31\x75\xb4\x8d\x49\x50\xa9\x15\x00\x6c\xe3\x83\x3b\x6b\x8e\x26\x1f\x06\x0c\xe8\x3e\xf7\xfb\x54\xe6\x13\xf4\x80\x34\x01\xd1\x3d\x89\x90\xe3\x19\x75\xed\xa3\x1f\xac\x45\xc3\x62\xee\xd5\x99\xee\xce\xfa\x7c\xdc\x95\xf7\xa2\x78\xff\x78\x55\xa8\x20\x8d\xbc\xe8\xaa\xc5\x3a\x0f\xda\xf8\x54\xc8\x01\x37\xf5\xa7\x21\x19\x2a\x55\x21\x44\xe8\xb6\x3a\x6e\x29\x2f\x83\xe3\x8e\x46\x81\x60\xc9\xa0\x13\x7c\x29\x2a\x6d\x59\x24\xfc\x80\x44\xdb\xcc\x48\xd5\x7c\xab\xf2\x41\x77\x80\x8a\x98\x42\xe4\xec\xbe\xce\xab\xab\xf7\xea\xee\xd8\x2c\x9f\x2f\x05\xa6\x66\x1d\x20\x15\xa5\x94\xea\xbe\x70\x8a\xa8\xa1\xd7\xcf\x67\x87\x22\xc4\xf6\x84\x38\x56\xd1\x55\xf3\x6c\x13\xe6\x5b\x91\xeb\x0f\x32\x77\x8a\xa4\x56\x5e\xe2\x3c\x05\xd0\x22\xde\xc7\x3f\x09\x91\xb6\x3b\x0c\xfb\xc7\x3e\x5d\x2d\x8a\x18\xbb\x9b\xd4\xd0\x7c\x7d\x97\x50\x5d\xea\x01\x51\x15\x53\xdb\xc0\xad\x7c\x53\x74\xdd\x89\x77\x51\x15\x4b\x13\x77\x95\xfe\x9b\xf2\x42\x32\xd5\x0d\x4b\x12\xc6\xb0\x9b\xa4\x3c\x9d\x3a\x85\x63\xaa\x92\xd4\xca\xea\x39\xaa\x2a\x8b\x90\x9e\xa4\x4c\x15\x4d\x42\xdb\xef\x77\xca\x34\x54\x1b\xf8\xaf\x3f\x9b\x72\x90\x2e\x71\xbb\x78\x17\x45\x73\x5d\x95\x59\xb3\x52\x65\x51\x1e\xb3\xff\x9e\x61\xef\x89\x4f\xba\xf1\x92\x20\x08\x79\x8e\xed\x65\x72\xbf\x4c\x87\x31\xe9\x02\x8f\x4d\xc7\x7c\x3c\x27\xe8\x44\x15\x33\x89\x55\x5d\x6a\xc3\x09\x81\x0c\x1e\x8f\x06\xd9\x02\xfe\xf7\x0c\xfd\xdc\xe3\x89\x12\xbd\x1a\xd8\xae\xd3\xaa\x1a\x5f\x8c\xf3\x88\x28\x4f\xf6\xd5\xb3\x2d\x0f\xf7\x6c\xc5\x95\xc6\x6c\xe9\x5d\x89\x15\xf0\x8f\x7b\xfd\xbb\x8d\x58\xa5\x29\xc3\x0f\xd5\x04\x61\x1b\x1f\x7f\x85\xb1\xea\x04\x55\x42\x58\x07\xbc\x86\x3c\xdf\x94\x7d\x3f\xc4\x64\xc6\x48\x26\x52\x8a\x8a\xd5\x1a\xaa\x7b\xd1\xa8\xe7\x1d\x5c\x32\xe9\xff\xe3\x83\xd4\xc8\x47\x29\xd5\xe9\x4f\x48\xef\xed\xb5\xb7\x88\x0b\x78\x92\x32\x50\x52\x25\x91\x75\x5b\x5e\xcb\x17\x58\x22\xb2\xc3\x66\x5f\x27\xe3\x74\x82\x52\x08\x42\x8a\x42\x97\x05\xe8\xb5\xf2\x62\x63\x93\x88\x58\x29\x6a\xb1\x5b\x57\xe7\xf7\x6d\x53\xaa\x17\xcb\xb6\xef\x51\x02\x93\xb1\x10\x01\x56\x9f\xa7\x41\x82\xd2\xa1\x9d\x0c\xb6\xf9\x07\xf1\x6e\xde\x29\x51\x9a\x59\xd6\x5a\x0d\x39\x1c\x44\x03\xdd\x97\x5b\x14\xfa\xa1\x44\x6c\xca\xaf\xc0\xbd\xb3\x49\xa9\xc9\x37\xd2\x12\x12\x4b\xb2\xd2\xc0\x01\xa5\xe4\x27\x73\x4c\x2b\x6a\x28\xea\xda\xd5\xcd\x7a\xf9\x38\x3d\x6a\x18\xba\x61\x4e\x80\xf4\x07\x34\xcf\x93\x67\x84\x88\x76\x72\xa1\xa2\x50\x65\x35\x8f\x14\x51\xc0\x43\xab\x43\x81\xa5\xf2\x6d\xb7\xdd\xff\xc2\x2a\x81\x30\xce\x3f\x68\x6e\x00\x66\xe5\xe3\xa8\x02\x99\x04\x08\xd4\x07\x35\x50\x19\x6d\xff\x0e\xd2\x15\x08\xf7\xd9\xa0\x80\xe4\x0f\x6b\xab\x09\x71\x80\xe6\x47\x59\xbd\x20\x71\x42\x0f\xf3\x57\x26\xb4\xac\x0a\x5d\xf7\x0d\xe6\x1a\x9f\xa0\x32\x65\x75\x1c\x84\x24\xca\xc4\x56\x51\x73\xe0\x67\x2c\xfa\x63\x5a\xa7\xfd\x0b\x7c\x2c\x00\xdb\x2d\xff\x09\x55\x3f\xf5\xec\x50\x1d\xc4\x14\x69\xd8\xaf\x44\x9d\xa9\x4b\x95\xe3\xd1\x23\xeb\x40\x5a\xf5\x6a\x70\xe2\x6b\xef\x4b\xe8\x4b\xaf\xba\xf5\x85\x85\x15\x2b\xcc\x41\xef\xe0\x88\x20\x99\x73\x05\xf5\xa8\x2f\x42\x87\x3a\xc2\x9c\x03\x56\x38\x9f\x90\x53\x44\xdf\x00\xd4\x8b\x89\x59\xd3\x91\x92\x54\x78\x6a\xec\x57\xb1\x7b\x3f\x81\xbe\xf6\x6a\x22\xbf\xf0\xc6\x3e\xaf\x7d\x68\x12\x71\x6c\xdc\xd1\x20\x1a\xcc\x3b\xef\x3b\x17\x4d\x13\x21\xd3\xde\xf5\xb0\x44\x38\xef\x47\x59\x8e\xd8\xfd\xa8\x8e\x43\x86\x19\xea\x07\x78\x1b\x49\x46\x8e\x07\xc5\x80\x0a\x69\x7b\xcf\xb8\x80\x1f\x7b\x57\x5e\x9d\xdf\x51\x06\x10\x99\x47\x26\x8f\x1d\x27\x14\xf3\xab\x3f\xb2\xa2\xc8\x8a\xc3\x7e\x55\xf4\x40\x2d\x1d\x73\x08\x7c\x33\x9d\x0d\x93\x46\xf3\x47\xd3\x54\x90\xa0\x03\xa1\x5f\x9a\x77\xcd\x68\xa8\xe3\x6e\x67\x59\xd5\x4a\x9c\x60\x04\x12\xd5\x8c\xa5\x3e\x24\xb0\x6c\x50\x96\x94\xee\xa6\xbc\xcc\x7c\x68\xc6\xad\x02\x9c\x85\x62\x34\x68\x56\xc6\xeb\x44\xf3\x30\x89\x99\x5b\x27\x48\xaa\xdb\x31\x0b\xcd\x6e\x7d\x9a\x8b\x28\xe8\xda\x4f\x7d\x2c\xd8\x3e\xc8\xec\x32\xd4\x5c\x5a\x40\x05\x52\x0f\x23\x57\xc0\xb6\x69\x17\xce\xa1\x7b\x65\xdc\x04\x2a\xee\xc5\xa1\x27\xb6\x48\xa7\x01\x20\x04\xd1\x56\xfe\xea\x6b\x91\xe5\xef\x9b\x32\x9b\xfc\x4c\x1a\x5a\x5e\xec\xfb\xc5\x9f\xfb\xeb\xc5\xfa\xee\x2f\xc7\x0c\xb0\x7c\xdc\xae\x6f\x1f\xf6\xdb\xa7\xd5\x83\x6f\x42\xd0\x69\x92\x20\xa3\x82\x67\xb4\xb1\x35\xa1\x33\x52\x11\xcd\x1a\x1c\x2d\x74\x80\x94\x57\xc7\xbe\xa6\xa3\x05\x58\x75\xf7\xdd\xfa\x7e\xb5\xdf\x3d\xee\xbf\x2c\x76\xcb\x2f\xfb\x70\xfb\xd0\x37\xc4\x6a\xa9\x0d\xb5\xc4\xc2\xd9\x51\xf4\x93\x44\x11\x8a\x04\xe2\x8b\xac\xba\xae\xca\xd3\x93\x78\xbf\xca\x9a\x7a\x13\x4d\xd3\xd6\x5a\xc5\x04\xc3\x48\x99\xe9\x7a\x9f\x1d\x8a\xb2\x02\xbd\x1f\xb6\x1d\x69\x25\x42\x6d\x33\xe3\xe5\xa9\xac\x5d\xb1\xf6\x13\x4e\x57\xaa\x75\x12\x60\xae\xe4\x1a\xfd\xe9\xac\xe8\x8d\xca\x47\x4b\xf3\xb7\xc2\x41\xad\x13\x8d\xf2\xa8\x98\x58\x15\x1f\xb1\x21\xfd\x02\xc4\xfa\xd1\x3d\x73\x5b\xd3\x5d\xbe\x1f\x3a\xa1\x14\xaa\xb5\x32\x18\x80\xa2\x52\x91\x6a\xd7\xea\x30\x12\xd0\x5a\xdb\x52\xfa\x4d\x59\x41\x76\x28\xae\xaa\x4c\x1f\x2e\x26\x75\xf7\xaa\x21\xb4\xdb\x45\x5d\xe6\x7a\xad\x41\xf4\x49\x56\x0d\x09\x0b\x52\xd7\x28\xb6\x3f\xd9\x82\x89\x87\xaa\x8d\xdf\x01\x80\x33\x4d\x83\x02\x9f\x9d\xb7\x1d\xb6\x43\x1b\x4a\x31\x65\x6b\x89\xfd\x5a\x67\x77\xb6\x30\x6a\x47\x43\x10\x04\xf8\x56\x8f\x45\x33\xa2\x3f\x80\x80\xd8\x7e\xbd\x3b\x51\x7e\x39\x67\x5f\xce\xd9\x67\xc9\x3b\x08\x62\x0b\x04\x6b\x57\xde\x17\x51\xe9\xee\x2a\x8e\x71\x75\x95\x67\x87\xa3\xe8\xa6\xc2\xa4\xa4\x04\x81\x4a\x91\xbc\x1f\xb3\x34\xbb\x41\x8f\xfc\x8f\xac\x79\xde\x74\x48\xe3\x8f\x3e\xee\xf8\x56\xb4\x42\x46\x04\x8b\x48\xf5\x17\x73\x58\x31\x37\x26\x54\x21\xb3\xdc\x96\x80\x55\xf8\xc7\x62\xa8\x93\x47\x81\x88\x14\x29\x61\xf6\xb6\xd5\xa6\xfd\x66\xfe\x54\xa2\x43\x84\x16\x9f\xaa\xf2\x58\x62\xf9\xe5\xd1\x7c\x29\xa7\x75\x4d\x20\xc0\x8d\xef\xd0\x46\xe7\xe3\x6a\x0a\xa0\xff\xc7\xe4\x04\x63\x94\x85\x54\x35\x50\x1d\xb3\x02\x9e\xd6\xde\xa0\x40\x1c\x52\xfc\x48\xee\x8c\x5b\x91\x4d\xe8\x68\x29\x24\x49\x8c\x41\x52\xdf\x88\x33\xa1\x0b\x18\x4d\x78\xa0\x3c\x40\x67\xfb\x1a\x7a\xed\x95\xc9\x15\x29\x07\xec\xad\xb3\x21\x7a\xcf\x20\xf3\xa9\xe6\x15\x05\x2a\x24\x9a\x6f\x0f\x03\x5f\x8a\x42\xbf\x8f\xd2\x3f\x97\x81\x38\x50\xc9\xf1\x24\x5b\x91\xe9\xa6\x05\x0b\x6d\x4b\x6a\x05\xea\x59\x54\x87\x09\x16\x01\x78\x68\x39\x8f\x2a\xdf\x51\xe3\x32\x90\x88\xad\xf5\x63\x64\x8c\xf0\x42\x97\x68\x40\x98\x5a\xa1\x91\x00\x62\x3a\x9b\x86\x13\x20\x8d\xa9\xb6\xd4\x31\x48\xef\xfd\xf4\x2c\x2a\x51\x3e\xf7\xb1\x1f\xa4\x69\x8c\xd8\x61\x84\x9d\x7b\x69\xad\xee\xa0\x02\x2c\x14\x3f\xfc\xf3\x7a\xbf\xbc\x5b\x2d\x36\xdd\x01\x63\xb0\x01\xd9\xee\x0b\xd8\xca\x39\xa4\xe2\x98\xdd\xe1\x40\x90\x00\x5b\xd0\xf7\x3d\xa3\xee\x2f\x41\xb4\x93\x2b\x68\x6e\x29\x0c\x71\x4a\x5c\x9d\xab\xce\xbe\x83\x80\x00\xf3\xf9\x79\x76\xcc\x9a\x8e\x42\x9a\x82\xf4\xc4\x3f\x8d\x38\x40\x74\x05\x87\xac\x18\xb4\x2a\x81\x26\x96\xb5\xd8\x02\x51\xb3\xa2\x79\x2a\xbb\xd9\xaa\x79\x9a\x06\x5e\x57\x79\x38\x07\xbb\xe3\xe0\xc5\x71\x5d\xc4\x6d\xe1\x83\xdd\xea\xd4\x82\x60\x77\x3c\x2e\xbe\x7f\xee\xbe\xa2\xd4\xb6\x75\x45\xba\x31\xc0\x82\xb0\x43\x1a\x0d\xff\x6c\xc9\x5c\xee\xb2\xe2\x45\xc8\x8f\x1c\x59\x00\x90\x98\x85\xc9\x3c\xc5\x70\x76\x84\x2b\xbf\x7d\x9a\x20\x64\x60\xc9\x2c\xf5\x63\x75\x98\x22\x56\x4d\x40\x84\x10\xbe\x91\xc3\x11\x73\xce\xd8\x44\x13\x24\x09\xb3\x2a\x7c\x35\x54\x8d\xa8\xee\xa1\xa8\xc5\x7f\x2e\xf0\x54\xe3\x73\x28\x43\xac\xdc\xfd\xf7\xa7\xa1\x35\x36\x44\x70\x2c\x59\x42\xa1\x91\x17\xa2\xe7\x38\x1b\xa2\x62\x4c\xcc\x62\xee\x5c\xb7\x2f\x59\xdd\x94\x55\xa6\xbc\xb6\xc8\xe8\x1b\x98\x98\x47\xc2\x32\x84\x57\x07\x58\x8a\x13\x42\x1e\xbb\xab\x70\x4e\x69\x47\xed\xf1\xf8\xda\x4b\x3c\xfa\x01\x20\xd1\x3c\x96\xfb\xd6\x50\x55\x42\x4f\xe8\x5f\xa9\x49\x62\xdb\xb4\x5d\x0e\x37\xe9\x7f\x45\xfd\xca\x8f\xff\xed\x47\xca\xa0\xd7\xda\x75\xbb\xda\xe5\xe5\x74\x1a\x7a\xd9\x5f\x7b\xad\x3e\x31\xef\x86\xd0\xd0\x36\x29\xfa\x6a\x6a\x05\xba\x03\x48\xfb\x21\x34\x16\x1d\xb4\xb2\xd3\x82\xbd\xc9\xcb\xb7\xba\x1b\xa2\xad\xd4\x8e\x2b\xa2\x0c\x5d\x6b\x43\x4d\x14\xd2\xae\xca\xf8\x04\xd5\xee\xe7\xe4\x36\x59\x40\x5c\x37\x8b\x0b\xde\xca\xf2\xf8\x90\x1d\x9e\xc7\x3c\x08\xbf\x6c\x8a\x18\xbf\x6c\xce\x25\xe2\x31\x10\x11\x54\x56\x15\xa8\x66\x4a\xba\xe3\x46\xa6\x3c\xd4\xae\x23\x68\x57\x4d\x1b\x37\x4c\xaa\x01\x59\x87\xcc\xb9\x8d\xc9\x56\x3f\x4f\xa2\xa8\x07\x8d\x47\x46\x68\x4b\x83\x66\x40\x3d\x2f\xf2\x7c\x7b\x3e\x3e\x9c\x8f\x37\x65\xb5\x2a\x54\x79\xae\xc4\x61\x3a\x85\x84\x61\x98\x16\x73\x38\x8f\x76\x3b\xb4\xac\xf0\xe3\x61\x2a\x92\xd8\xf6\xb4\x58\xae\x56\xff\x3d\x67\x1e\x3c\x3d\x5f\xe5\x1d\xd4\xe4\x8c\x8e\x6c\xd3\xb3\xed\xf2\x58\x1f\xe5\x44\xb8\xef\xb3\xf8\xce\x68\x80\x84\xba\x7e\x9d\x4f\x76\x5d\x03\x24\xc4\x35\xea\x9b\x03\x8b\xac\x79\xff\xb6\xb9\x1b\x45\x7a\x06\x58\x94\x52\x4f\xba\x87\x40\xaa\xcb\x2e\x86\x11\xa0\xa6\x4f\x7b\x19\x43\x04\x22\xc4\x56\xcd\xf3\xbd\xa8\x7c\x4b\xae\x31\x71\x80\x85\x7a\xa7\xce\x56\xaa\xa9\xd9\x67\x41\x90\x18\xb4\x51\xfd\x8e\xbe\x2e\x2c\xed\xcd\xaf\x26\x92\xbb\x40\x48\x19\xf6\xe6\xee\xed\x1b\xf4\x40\x30\x5f\x29\x99\x8b\x44\x58\x10\x85\x2a\x85\xae\x84\xf9\x84\x8f\x3c\x4d\xef\xf9\xa1\xb1\x4c\x79\x47\x3d\xf5\xe5\x5d\x56\x99\x9e\x63\x14\x62\x41\xc4\x48\x64\x3b\xa7\xaf\xca\xba\xfe\x21\x8a\x42\x2c\xdb\xc5\x35\x74\x02\x59\x10\x71\x83\xaf\xd9\xb1\xef\xdf\x81\xf1\xac\xec\x7e\x80\x26\xe8\x7a\x7d\x2b\x3c\xc4\xf5\xd7\x0c\x08\x1f\xbc\x1b\x42\x58\x14\xba\x95\x5a\x67\x35\xc2\x83\xfd\x21\x4e\x30\x4b\xda\x88\x17\x40\x60\xe9\xf6\x39\x3b\x4d\x1e\x28\xa6\xa1\x53\xa8\x2c\xf4\xa2\xbe\xcd\xcc\x7c\x45\x98\x05\x31\xb3\xf8\x09\x2f\x84\xfa\xad\xca\x9f\x2a\x30\xd9\x4f\xff\x6b\x31\x04\xb1\xe8\x66\x79\x56\x1c\x6c\x7a\xbb\x7e\x34\x57\xd0\x69\x0b\xfe\x63\xac\x31\xc8\x9d\xdf\xc4\x82\xd8\x30\xcc\x28\xe7\xa5\x7a\xe9\x59\x1d\x58\x90\x08\xcb\xdd\xde\x7a\x9f\xd0\x7e\xef\x42\x67\x93\xe2\x18\x0b\x12\x08\x85\xf7\xd4\xde\x3e\xed\x8e\xeb\x95\x06\xff\x31\x9e\x02\x2c\xb4\x1c\xde\xb6\xab\xc2\x62\x59\xe7\xb4\x02\x59\xc0\x52\x82\xb9\x9c\x2d\x54\xa7\x0e\x91\xc7\x02\x26\x05\x74\xf5\x92\x53\xfb\x08\xdd\xd7\xe6\xa0\xbd\x30\xda\xd3\xda\x52\xbe\x84\x89\x3f\x98\x86\x0a\x33\x8c\xeb\x87\xf5\x6e\xbd\xb8\xdb\x6f\x77\x8b\xdb\x55\x77\x90\x71\x4c\x44\x7d\x2b\x32\x55\x56\xc5\x95\x43\x51\x4d\xa6\x6f\xca\x0c\x6e\x51\x79\x56\xbc\xcc\x39\x5e\x2c\x48\x39\x60\x4d\x5e\x83\x2a\xb5\x8d\x37\xad\x9e\x64\xa1\xd7\xf5\x94\x35\x84\x05\xa9\x62\x92\x7b\xd5\xce\x6d\x03\x27\xe6\x6f\x48\x44\x76\xe3\xd9\x3c\xde\xad\xf6\x0f\xab\xd5\xf5\xfe\xee\x71\xf9\x75\xff\xed\xa9\x1b\x40\x0c\xea\xb6\x20\xc9\xfc\x17\xd1\xbd\x1e\x91\x46\xc8\x8f\x7b\x8b\x9b\x63\x0d\xc5\x65\x1f\x24\x0b\x84\xb6\x75\xd6\x0c\xf5\x45\x9b\xf7\x7d\xbb\xf1\x77\x60\x23\x16\x48\xa9\x2c\x54\xee\x98\x35\x1b\xcc\x56\x5f\xb8\xf0\xe3\xe7\x56\x2a\x41\x48\x47\x7b\x1d\x78\x12\x75\xfd\x56\x76\x7d\x19\x7e\x88\x16\x88\x44\x79\x16\xf5\xf3\x95\x50\x2f\x0d\xd4\xcd\x53\xeb\x9b\x67\x5e\xa1\xcf\xb2\x40\xd1\xb8\x9b\xab\x0a\x0c\x56\x05\x7f\x88\x5c\x1c\x45\x0f\x71\x60\x81\x0e\x29\x46\xb5\xa2\xa8\xdf\xb0\xc0\x32\x22\xd7\xed\xdd\x72\x16\x68\xcd\xa5\x15\x46\x2d\xd5\xb9\x82\x19\x61\x0e\x16\x00\xb7\xc9\x0f\x5b\x07\xc1\xf2\x44\xc7\xa4\xc7\x02\x30\xa9\x17\x36\xf5\xb3\x8a\x90\xf1\xb3\x99\xc4\x26\x5e\xe4\xf9\x7d\xd9\x86\xb2\xe3\xb7\x6d\x84\x41\xef\x76\x55\xe8\xd6\xef\x6d\xe7\xd5\x64\x00\x50\xcc\xff\x5a\xbe\x1a\x98\xa0\x22\xc6\xaf\x3a\x0c\xa2\x14\x42\xdf\x3c\x5c\xbc\xb8\x67\xaf\xe7\x20\xc9\xed\x60\x8d\xb5\xe3\x7d\xfb\x85\x4f\x03\x8a\x07\x16\x06\xc2\xfa\x73\x47\xe4\xc8\x3b\xe5\x42\xc1\x5e\xf5\xb2\x2b\x6e\x54\x18\x04\xd8\x0a\x8f\x18\xf8\x6d\x76\xf0\x71\xcb\x40\x16\x6f\xfc\x8b\x51\x20\x11\x2a\x82\x6b\xc4\x15\x5f\xcf\x03\xc0\xd7\xd0\x79\x6d\x47\x6b\xe6\xad\xe2\x2c\xc5\xef\xef\x19\xe7\x30\x32\x04\xbf\x32\x42\x55\xbd\x22\x04\x0b\x09\x31\x89\x4b\x0c\xba\x7b\xd9\x8e\x3f\x7d\x48\x04\xc5\x74\xd6\xb1\x44\x1c\x43\x69\xbb\x51\xe6\x7f\x84\x08\xe1\xf5\x84\x56\x85\xee\x55\x72\x06\x23\x64\x88\xfd\x8d\x59\xbd\x15\x47\xd8\x66\x87\xe2\x8f\xcb\x6a\x51\x3b\x4c\x77\x2d\xcc\xf8\xf6\xa1\xda\x74\x40\x7a\x16\xc6\x44\x61\xf3\x6d\x51\x36\x78\x19\x00\x3d\x13\x2d\xb0\x30\x8e\x23\xda\x73\x18\xfb\xb6\xda\x7d\x59\xe4\xef\xfb\x6b\xf8\xb0\x98\x3b\xe9\x93\xfa\xf4\x30\x1f\xf8\x57\x2c\x4c\x08\x0f\xad\x3c\xd5\x1b\x54\x0e\x59\x31\x7e\x01\x49\x62\x65\x9d\x45\x9e\x5b\xa9\xc7\x3e\x02\x64\x21\x4d\x23\x69\x29\x40\x51\x11\xc5\x0b\xd5\xb3\x90\x4a\x2b\xbd\x2b\x74\x79\x6a\x66\x38\x5c\x58\xc8\x22\x16\x62\xb3\x74\x79\xae\x61\xd2\x57\xc9\x42\xc6\x23\x62\x21\x35\xd7\x70\xaa\x00\xdb\xcb\xba\x63\x90\x62\x4b\xd9\x6b\x99\xe9\xc7\x6a\x03\xa8\x39\x3c\xbe\x69\x2e\x23\xd4\x56\xbd\xc9\xcb\xb2\x13\x43\x1b\x4f\x13\x2e\x23\xec\xf9\xf9\xeb\x5c\x5c\xa2\xec\x58\xc8\xb5\x8d\x48\xf6\x35\x34\x37\x15\xc0\xdf\xa0\xa7\xa2\xd1\xf3\x53\x2a\x8d\x14\xee\x3b\x88\x89\xb0\xed\x14\x3f\x44\xbd\x81\x8e\x5d\xba\x1d\x02\x5e\xc5\x1f\x65\xc8\xc7\xbf\x9c\x92\x18\xe5\x16\x6a\x61\x00\x83\xde\xc9\xb3\x09\x26\xb0\x29\xa3\x77\x09\xf5\xb8\xc1\xf5\x1a\xea\x26\x2b\xd0\x05\xab\xef\x7c\xf4\xc8\x42\xa1\x39\xb6\xb5\xbf\xc2\x73\x05\xf5\xa9\x2c\x2e\xb9\x7d\xba\x24\x88\x77\x5d\x59\x28\x13\x4e\xa4\xc7\x79\x78\xab\xec\x8f\x89\x30\x08\xba\xea\xe7\x47\x9a\xda\xe3\xa7\x93\x00\x88\x90\x7f\xbc\xb7\x42\x5f\xc8\xa7\xf2\xc1\x50\xc3\xa5\xe8\x9b\x75\x32\xa8\x1e\xcd\x80\x27\x98\x85\x2a\x90\x68\xe4\x91\x8d\x7d\x20\xac\xd9\x3a\x24\x06\x29\xb9\x64\x2e\xd4\xcb\x1d\xc2\xd7\x8f\x27\x51\x74\x2c\x70\x2c\x54\x3c\xc5\x80\xea\x0d\xe0\xe5\xa6\x3c\x57\x03\xfd\x00\x16\x2a\x19\xa0\x8f\x29\xcf\x59\xae\x77\xd9\x6c\x93\xb6\x57\xca\xeb\x4e\xb1\xb2\x02\x9e\xd0\xe4\x13\x90\x0a\x0b\xb5\x50\x4a\xfa\x4c\xa7\x7f\x6f\xfe\x98\x96\x8e\xad\x1d\xd1\x2e\x13\xff\x38\x84\x98\x6b\x17\x7f\x3e\x9e\x1b\x55\x1e\x61\xda\xb8\xed\xf7\xda\x10\x38\x43\x1e\xc4\xef\xab\xed\x6e\xfd\x70\xbb\xbf\xfe\xb6\x59\xec\xd6\x8f\x0f\xfb\xe8\xaf\xee\x6a\x60\x90\x30\x48\xb4\x0b\xff\xc6\x49\x76\x3c\x16\x70\xed\xf3\x00\x2c\x34\x3e\x74\xd3\xfa\xf1\x04\x85\x4d\xb8\x8f\x56\xb2\x21\x61\xe8\x08\x5a\x6e\x16\x57\x0b\xc7\xa2\x68\xe7\xe2\x0c\xc9\x0a\x0b\x4d\x1c\x25\xa4\x43\xe2\xcb\xf6\xbb\x7e\x2f\x9b\x49\x7d\x98\x45\x21\xb5\x5c\xc6\x1d\x30\x67\x5f\x9f\x40\x65\x22\xdf\x3f\x97\x55\x7d\x49\x49\x3f\xdb\xa1\xce\xa2\x50\x92\xd8\x73\x98\x88\xa6\xc9\x67\x4b\x48\xed\x30\xbb\x63\x63\xf6\xf1\x3b\x92\xb7\xcc\x73\xd2\x7e\xda\x71\x31\x91\xe3\x66\x51\xa8\x0c\x58\xb6\x0d\x6c\xda\x19\x7f\xec\x28\x34\x01\xb6\x4e\xa2\x94\xb2\x4f\xeb\xb9\x63\x11\x89\xf0\x58\xdf\xee\x7d\xef\xb9\x4f\xfc\x08\x08\x43\x9b\xa0\x76\xb1\xd9\x75\xf6\xfa\x39\xfb\x47\x7b\x8e\xe5\x8e\x6f\x5d\xaf\x3f\xfd\x85\x08\x17\xe8\x53\x00\x16\x02\x07\xf6\xc3\x0f\x88\x19\xc3\x8c\x1a\x76\x54\x17\x6b\x55\x76\x07\x38\xc5\xca\xd0\xb7\x02\x7e\x9e\x90\x31\xa2\x3b\x22\x94\xf4\xc4\x77\xd7\x99\x31\x99\x3a\xe7\x9e\x52\x9c\x45\x09\xd7\x36\x2d\x86\x94\x42\x1d\x78\xf1\x03\xc2\x1c\x16\x51\x15\x79\x46\x1b\xef\xb1\x45\xb1\xbf\x18\xd5\x80\x81\xce\x11\x5b\xae\x17\x55\x35\xa9\x50\xb2\x88\xb1\x30\x4c\x50\x54\xb6\x10\x5d\x8f\xc9\x47\x59\x07\x16\xb1\x94\xa3\x71\x38\x89\x77\x9f\x6d\xfe\xa0\x84\xe4\x4e\xe0\x01\xc1\xeb\x7f\x2b\xba\x16\xd2\xdd\x05\x33\xbb\x1f\x4b\x45\x14\x76\xf8\xd2\x11\xfb\xcb\x78\x60\x1a\xda\xee\x37\x0d\xb5\xaa\x32\x44\xfe\x7c\x11\xf5\xb3\xcd\xe9\x4d\x9f\x30\x15\x96\x31\xc6\xcf\x16\x74\x79\xcb\xf9\xa9\x2e\xda\xa9\x85\x5c\xf7\x50\xed\x71\x61\x85\xfe\x55\x8a\xd8\xb6\x8e\x5f\xdf\x8a\x23\x5c\x4a\xf6\x79\xdb\x12\xc9\x24\x64\x2e\xc7\x78\x5b\x95\xe7\x93\xb7\xab\x91\x4c\x00\x09\x49\x4f\x50\xb5\x91\xca\xc0\x09\x8a\x24\xd8\x72\xfb\x41\x60\x19\x79\xf9\xe0\x0f\xa8\x30\xc4\x46\xf2\xbb\xf2\xf0\x59\x55\x91\x45\x8a\x25\xac\xe7\xb9\xde\x63\xcc\x7a\x81\xcc\x98\xcc\x1c\x08\x13\x46\x5d\x17\xa2\x3d\xf0\x91\x96\x31\x8b\x20\x61\xca\xb3\x39\x40\x6b\xf8\x73\x7f\x8b\x40\x2d\x43\xfc\x69\x8f\x7c\x12\x66\x42\x22\x31\xb9\x4f\xe0\x12\x43\x3d\x64\x8c\xdf\x93\xee\x22\x29\xf8\x0e\x85\xd5\x01\x2a\x38\xcc\x7f\x1e\x13\x58\xe0\x86\x15\x9e\xde\x7f\xc9\x9a\xc7\x0a\x79\x43\x2f\xf1\xfd\x8c\x04\xc4\xea\x7c\x79\x0c\x65\x3d\x52\xf8\x62\x24\x88\x2d\x75\xad\x03\xed\x7a\xa6\x56\xce\xfd\x71\x29\x31\x86\xab\xd0\x4f\xc9\x7a\xfe\x5a\x46\x02\x6d\xd0\x43\xfa\x01\x6d\x40\x31\xc8\x44\x33\x12\xaa\x24\xb0\x34\xf3\x18\x1e\x8e\xfd\xfc\xd9\x25\x42\x42\x08\xa3\x9e\x99\xbe\xce\x07\x68\x10\x46\xa2\x20\x32\xed\x0b\xfb\xcf\xc9\xbd\x58\x71\x40\x4d\xb6\x8e\x50\x84\x91\x48\x47\x41\xd8\x03\x00\x07\x49\x59\x46\x48\x20\x0d\x1d\x37\x4f\xcf\xb4\xc2\x33\x12\x13\x96\x78\x10\x00\x20\x42\x72\xdd\xc0\xd1\x01\x53\x26\x43\x19\x47\x96\x24\x51\xbf\x17\xea\x02\xda\x36\xff\x88\xb1\x49\x31\x21\xe4\xe0\x0d\x9f\x2a\x33\x30\x42\x93\x14\x3b\xdf\x36\xf0\x73\x9c\x0d\x1d\xdf\x08\x85\x10\x8b\x2c\xf2\xf0\x73\xa8\xa5\xc5\x08\x63\x16\xcd\x7d\x55\x9e\xab\x02\x10\xf5\xff\x49\x55\x81\x11\x26\x99\xa2\x03\x54\xea\x2e\x53\x2f\x30\x51\x6c\x67\x84\x87\x09\xf2\x7e\xe3\x5e\x73\x1c\x71\x58\x4c\x88\x70\x18\xe1\x89\xb1\xa4\x8e\x55\x59\x9a\xb5\x9e\xec\xdf\x84\x0b\x4e\x68\x37\xf5\x56\x58\x91\xf3\x6b\x70\xac\x80\x36\x9c\xd0\x69\x12\x26\x61\xaf\x97\x29\x7e\xfa\xd2\xb6\xe7\x38\x98\xfc\x4a\xca\xb5\x8e\x87\x02\x0b\x03\xa4\x2d\x23\x69\x6a\x79\xf9\x9e\x45\xed\xcb\x4c\x93\x07\x4e\x53\x26\x7b\xf4\xe7\x95\xa8\x9d\xe0\xdb\xa7\xdb\x28\x49\x35\xf1\x3e\xcf\x80\xee\xd3\xf6\x99\xce\x3c\x94\x88\x34\x26\x53\x74\x56\xa3\x61\x9c\x4d\xb4\x5d\x94\x44\x19\x11\x02\x7c\x29\x67\xef\xe0\xcf\xfe\xc9\x64\x68\x79\x4c\x3d\xfb\xf9\x7d\x56\x2c\x45\x9e\x4b\xa1\x5e\x6e\x45\xdd\x8d\x22\x81\xff\x44\xff\x01\xd5\xd4\xa3\x65\xa3\x22\x26\xd5\x88\x8a\x7c\xfc\x90\x2a\x12\x68\xaf\x7e\x54\x59\x03\x57\xd9\xaf\xc8\x8a\x46\xb3\x4d\xa5\x04\xf1\x5d\x36\x11\x78\x75\xae\x8a\xab\xb2\xb5\x12\x8f\x27\xa7\x48\x61\x31\xe3\x9f\xbf\x65\xdd\xde\xbf\xab\xf8\x60\x93\x47\xef\xc0\x13\x0d\x06\xe9\x14\x57\xbb\xe5\x17\xf7\x02\xfd\x21\x10\x84\xba\x12\xc8\x43\xe6\x72\xa2\xa3\x9b\x03\x65\x95\x14\x8e\x19\x0a\x63\xb8\x94\x55\xd7\x60\xc9\x88\x09\x54\x18\xba\x2c\xf4\x6d\x5e\xca\x9b\xb2\x40\x18\xcb\xe4\x05\x99\x28\x00\xe2\x71\xc7\xe2\x38\x7c\xb7\x46\x01\xfa\x7d\xcb\xbb\x07\x2b\x5d\x3a\xe8\x5a\x60\x71\xc0\xac\x24\x05\x46\x55\xe3\x09\x19\x07\x52\xa5\x0e\x77\x78\x57\x16\x87\x06\xaa\xe3\x7d\x56\x34\x1f\xd9\x91\x38\x0c\x02\x4c\x3d\x58\x80\x8a\x44\x17\xb7\x1e\x44\x33\x71\x18\x5a\x1e\xb4\x4e\xc5\x6b\x51\x34\x83\xc4\xe5\xf4\x72\x8c\x62\x80\x56\xe6\x7a\x15\x77\x97\xd0\x2c\xb0\xcd\xd1\x4d\x95\xc1\x2b\x60\x3b\x66\xdd\x1d\x05\xee\xd1\x57\xfb\x93\x6f\x0b\x99\xcd\x5e\xc5\xa1\x09\x8c\x15\xd7\x7d\xbf\x5a\xdf\xdd\xf9\x2b\x44\x81\xb0\xcf\xdc\xee\x26\x7f\x8c\x28\x61\xe7\x89\x0f\x86\xee\x5a\x1c\x11\x0b\x1c\x30\x28\xf5\xb6\xb1\x11\x58\xf7\xae\x23\x62\x1c\xf1\x79\xd5\xee\x53\x23\xf8\x00\x8b\x23\x4a\x31\xcd\xf4\x45\x14\x7f\x8d\x54\xd5\x59\x1c\x49\xab\x5f\xf0\xfd\xdb\x93\xc3\x79\x39\xaa\x83\xdd\x7a\xb5\xf1\x1e\x53\x4c\x82\x14\x57\xd8\xf0\x8d\xfe\x9f\xca\x10\x48\xcf\x8b\x65\xf4\x2a\xcb\xf3\xac\x2c\xb2\x9f\xf3\xae\x4c\x4c\x42\x93\xf4\x7a\xe1\xab\xdd\x9f\xb3\xfe\x43\x4c\x92\x08\xbd\x8f\x9b\x2c\x87\x2d\x54\xaf\x50\x59\xb7\xb7\xea\x6e\x99\x05\xd8\x3e\xfc\xe9\xb6\x16\xf3\x61\xd2\x35\x8e\xe3\x08\xf1\x80\xde\xbf\x7c\x80\x9f\xd9\xf9\x38\xfd\xe9\x38\x51\x5e\xf5\xe8\x49\xd4\xf5\xa9\xac\x9a\xf5\x07\x2e\x7d\x1c\xd3\xc4\x83\x0b\xaa\x0e\xee\xc1\xe2\x24\xb5\x6b\xea\xae\x3c\xf4\xaa\x49\x1f\x4c\xfd\x44\x09\x64\x02\xf2\xf1\xcf\xd5\x80\x41\x7f\x3e\xff\x10\x27\x5a\x60\x20\x81\x0a\x22\xde\x59\xb0\x6d\x73\xe3\xc5\x1d\xd3\x18\xb0\x25\xad\x7e\x2e\xdf\x2c\x00\xf7\x07\x76\xf5\x77\xd3\x9e\x0a\xcb\x0b\xdd\x0e\xb8\xd4\x9f\x9a\xdc\x2a\x95\x11\x0a\xa9\x3e\x6d\x97\xa3\x49\x46\x15\x37\x9e\x24\xc3\xba\xb3\x5b\x54\x66\x9a\xbc\x58\x06\x06\xbd\xd8\x85\xcc\xd0\xdb\x9a\x3a\xe4\x31\x33\x21\xb2\xe6\xd9\xb2\x76\x6b\x8f\xaa\x65\x99\xb7\xab\xbd\x12\x79\x56\x0f\xa3\xb9\x98\x07\x04\x41\xab\xfb\x0c\xf5\xda\x2c\xfd\xe8\x18\xca\x3d\x0a\xa1\x63\x9e\xc6\x71\x67\xae\x86\x0a\x2c\xe3\x67\xe4\x32\xc1\x48\xfb\x09\xa0\xb2\xbe\x4a\x3d\x95\x93\x67\xb1\x88\xe2\xd8\x29\xca\xb6\xa1\xdf\x02\xd3\xfd\x48\x0a\x31\xd3\x22\xe9\xcf\xa1\x69\xa0\x7c\x51\x65\x9f\x15\xfb\x37\x8f\x9b\x63\xb1\xe0\x11\x73\x3b\xf1\x7d\x59\xd4\x0d\x54\xc8\x9c\x70\xc1\x02\x30\x99\x07\x22\xa5\xe0\xb2\x02\x5f\x6e\x77\x93\xb7\x2d\x24\xc4\xc4\x13\x52\xda\x2c\xc0\xd0\xab\x88\x65\x08\xe8\x8b\xe2\xd4\x75\x25\xd5\x41\x5a\x34\x96\x89\xc0\x9c\x69\x79\x82\x22\x59\x3e\xf7\x29\xb3\x58\x45\x89\xa3\x08\xd0\x5b\x61\x20\xff\xc8\x0a\x2b\x9e\x60\x2d\x28\x6b\x7f\x38\xd3\xbf\x5c\x09\x4a\x58\x06\x8d\x73\x81\x58\xa4\x41\x63\xc5\xe4\xb9\x15\x30\x5c\x75\xbb\xd5\x76\x87\xff\x7f\x99\xfb\x8c\x21\x0d\x30\x83\xae\x2e\x7b\x98\x2f\xef\xd4\xa8\x00\xf3\xfd\x87\x33\x32\x82\x4c\x0e\x6a\x81\x35\xdf\x7d\x9f\xac\x74\xd4\x99\xf5\x25\x09\x06\x4b\x02\x6a\x9f\x62\x7f\xb2\xc5\xf0\xed\x2f\x4b\xd5\x49\xc0\x41\xb1\x3e\x9a\x46\x72\xf8\x4f\xf3\x41\x49\x90\x12\x8e\xc5\xed\xe7\xcc\x34\x4a\xd4\xcf\xc3\xe9\x99\x04\x8a\xa0\xd1\xf7\xc8\xb5\xd5\x90\x9d\xb9\x3d\x2c\x59\xea\xb1\x35\x87\xf6\xcb\x5e\x65\x5a\x4f\x57\x42\x12\x68\x83\x9d\x46\xb6\x80\x3e\xa5\x58\x74\x83\x42\xaa\xb1\x2c\xbc\x5c\xef\xfe\xda\xaf\x1f\x96\x9b\xd5\x62\xbb\xda\x6f\x16\x3b\x5f\xc3\x4c\x42\x08\x90\xa9\x17\xdb\x00\xfb\xfa\x55\x12\xb1\x18\xd1\x8d\x08\x1c\xb0\x0d\x7a\x96\x27\x66\xea\xdd\x26\x91\x48\x53\x2b\xe6\x5a\x80\x53\x19\xa9\xca\x63\xf9\xcb\xfe\x7d\x96\x44\xc6\x56\x46\xd1\xa0\x7c\xb3\x3d\x04\x3e\xb9\x93\x10\x4a\x30\xef\x7f\xb5\xba\x5d\x3f\xec\x77\xeb\xfb\xee\x96\xe3\xc8\x20\xb3\xe4\xed\x72\x64\xe7\x92\x76\x9e\x38\xe6\x4b\x4c\x18\x7c\x6e\x2e\x93\x24\x8c\x11\x75\xeb\x45\x4f\x4f\xb6\xa6\xf8\x09\xe6\x93\x25\x49\xaa\x91\x82\xd9\x1d\xdc\x95\xd8\xb7\x33\xf9\x32\x8c\x00\x8f\x06\xfc\x58\xdb\xe6\xac\xa7\x10\x5b\x96\xb0\x98\x3b\xea\x9a\xe3\xf1\x5c\x64\xcd\xfb\x28\xf4\x4a\x18\x05\x6e\x50\x6d\xe3\x6a\xf4\x90\x8c\x02\xc6\x22\x26\x2b\x84\xf5\xc9\x9d\x5a\xc5\xbc\x11\x4a\x18\x8f\x2c\xf9\x49\x6b\x47\x06\xef\x64\x3c\x8a\x53\x85\xe6\xda\xaa\xff\x7e\xdb\xae\x36\xfb\xe5\xb7\x9d\xff\x4d\x2e\x39\x26\x01\xc5\xb9\xc6\x17\x3b\x55\xaf\x61\x49\x1a\x44\xd8\x4a\x9c\xbd\x35\xe6\x5c\xe8\x21\x2b\x2d\x4b\xd2\x50\x93\x8e\x07\xf2\xf6\xdc\x7b\xd1\x49\x4a\x0c\x1a\xb9\xed\xd7\x3b\x5f\xbe\x74\x47\x84\x34\x51\xec\x95\xf0\x7f\xf1\x21\xa5\x8a\x8d\xf4\x78\xa9\xd6\x8d\x2d\x44\xa1\x00\xb3\xfe\x7d\x7c\x94\x48\x45\x91\xf4\xfc\x5b\x91\xbd\xb6\xf1\xd1\xf6\x39\x83\x7c\x9e\x0a\xc6\x9d\xa1\x53\x1d\x59\x83\x97\x97\xea\x65\x4c\x00\xc8\x12\xe0\x3a\x49\x3c\xf9\xa7\xca\x4e\x19\x14\xcd\x16\xe7\xca\x28\x10\x48\x8c\x64\x58\x41\x58\x55\x95\xef\x1a\xf4\x47\x54\x84\xb8\x19\x53\x01\x0c\xa8\xdc\x18\x0d\x02\xfb\x35\x0e\x1d\xf1\xd8\x06\x5a\x3f\xa7\x67\x38\xf1\x03\x23\x82\x25\x30\x0d\xa7\xbc\x7c\x1f\xfd\x2e\x0d\xe3\x18\xbb\x67\xef\x17\x7f\xee\x97\x9b\xc7\x1f\xd7\xfb\x9b\x6f\x0f\xd7\xeb\x87\xdb\xfd\x6a\xf7\xc5\x5f\x20\x14\xb6\x1b\xb7\xc2\x0a\xd7\x0d\xc0\xd2\x3b\xf0\xfa\x26\x17\x87\xc1\xfb\xa3\x51\x12\x33\x3d\xa0\x2d\x77\xe4\x41\xc3\x68\x8f\x46\x2a\xc6\xbe\x9d\x23\x72\x8c\x8e\x27\x3c\x8d\xb4\x65\xfa\xea\x62\x84\x8d\x23\x41\x18\xa1\xb9\xc6\xdf\x96\x46\xae\x8d\x19\xd9\xc1\xab\x0a\xe9\x34\xc7\x97\x25\x71\x80\xe9\x44\x28\xf4\xa9\x82\xb5\x2a\x87\x37\x4d\x20\x11\x2e\xf2\xee\x60\x00\x34\x8e\xed\x76\xde\xfb\x43\x9f\x52\xbd\x30\x1a\xeb\x18\x1b\x3b\xbc\x63\xda\xe9\xfd\x0c\x57\x26\x8d\x01\x90\x20\xe1\xfb\xfa\xc7\xe3\x3f\xfd\x1f\x13\x6a\x28\xf4\xdb\x38\x46\xc8\xdd\x31\x0d\xc6\x35\xd3\x5e\x41\x01\x26\x53\x99\xa8\x26\x1c\x03\xde\x92\x53\x4a\xad\x30\xb0\xf7\x43\x6d\xd9\xee\xd3\x64\x11\xa5\x29\xc1\xc4\x5c\xbb\x24\x3d\x86\xe0\x83\x91\x0a\x82\xc8\x51\xf1\x09\xd5\x09\xe7\xec\xca\x8b\x34\xe6\xe4\xd5\xf0\xc0\x3a\x11\x87\x5c\xf8\xc7\xe2\x22\x56\xba\x6f\x0a\xdb\xbe\x0d\xb8\x93\xbb\x21\x2a\x08\xbd\xe1\xb7\xe0\x00\x78\xf3\xe7\x8b\x58\xe2\x72\xae\x20\x17\xef\x1b\x50\x90\xbd\xba\x8e\x59\x71\x89\xa5\x9e\x01\x6f\x50\xc1\x9c\x82\x4d\xd6\xd4\xbd\xee\x03\xa3\x92\x13\x6e\xfb\xf8\xf3\x97\xad\xa7\xac\xe7\xff\xfa\xb7\x3d\xd9\x83\x9e\x48\x34\xf8\x87\x3b\x53\x85\x52\x38\xcd\x70\x05\x57\xf0\x61\x4e\xe1\x23\x84\xe5\x3f\x46\x9d\x11\xfe\xa2\x94\x6b\x2b\x43\x91\xab\x5d\xa9\x3e\x37\x72\x54\xa5\xb6\x6c\x0f\xcd\xf3\xf7\xde\xd9\xa3\x3a\xb0\xe9\x46\x93\x89\xa6\xf5\xea\x3f\xf7\xa4\xa8\x06\x82\x8c\xc5\xb6\x14\x39\x93\xc2\xa3\xda\xc4\x9e\xd9\x67\x51\x1d\xdf\x2f\x05\x40\x19\x05\x66\x48\xd4\x77\x09\xec\xca\x27\x64\xf7\x5c\x4f\xbf\xb2\x09\x34\x6e\x1b\xcb\x47\xef\x03\xfa\x03\x3c\x40\xf5\x0c\x07\x34\x5f\x8a\x53\x1b\x20\x8c\x4d\xf1\xf0\xfe\xbb\xba\xfe\x67\xff\xb1\xd7\x66\x51\xc8\x10\xfd\xf3\x54\x95\xf5\x69\xa4\x61\xc9\x58\x94\xc4\x5e\xfd\xba\xeb\x46\xb8\x9f\x55\x0f\x63\x2c\x12\x06\xb7\x67\x59\x76\xe6\x96\x11\x2a\x90\x49\xe8\x2d\x2b\x74\xf9\xf6\x78\x1a\x01\x15\x58\x12\x33\x34\x55\x47\xf1\xb3\xfd\x33\x82\x28\x5f\x45\xfe\xe5\xca\x0f\xa0\x81\x0c\xdd\xab\xcd\xe1\x15\xf2\xf1\xeb\x62\x94\x50\x64\xe5\x7b\x12\xe7\xda\x02\x02\x17\xfa\x98\x15\x03\x73\xc6\x28\x8f\xb1\x8b\x7d\x99\x67\x27\x2f\xb1\xfe\x49\x3e\x96\x51\xa5\x50\xaa\xe0\x66\xb3\x5a\x5d\x3f\xde\x0f\xb0\x50\x8c\x25\x41\xe8\xc9\x52\x73\xf1\x0a\x73\x55\x54\xc6\xc3\x00\xdd\x9d\xa7\x0e\xb5\xc8\x78\x1c\x59\xe8\x8b\xf7\x3b\xec\x0e\xd5\x4c\xdd\x42\xc6\x69\x84\x0c\x05\x57\x59\x23\x8a\xfa\x5c\x76\x17\x10\x31\x96\x8c\x75\xf9\xd4\x91\xeb\xce\x59\xa6\x11\xf8\x85\xa5\x9c\x23\x44\xce\x46\x4a\x2e\x4f\x39\xdf\xe5\xc6\x98\x08\xac\x98\xeb\xcf\x29\xa9\x26\x63\x22\xa4\x60\xb3\x4c\xf5\xf9\xd8\x35\xed\x74\x5f\x58\x40\x2a\x4d\x27\x7b\x2d\xfe\xfe\xbc\x26\xc7\xa4\xe6\xd8\x95\x28\x30\x7f\x8c\x9f\x6b\x57\x76\x4f\x2a\xb5\x4d\x1f\xca\xac\xf8\xcc\xcf\x60\x2a\xb0\x5a\x95\x6d\x28\xf7\x00\x6f\x57\xf0\x8b\x78\x88\x69\xe7\x37\xd7\xcf\x55\x76\x3c\xbd\x57\xe2\xe8\x69\x00\x19\x83\x76\xe7\x1f\xa4\xe0\x3d\xf4\x6a\x31\x4c\x1d\x32\x30\xa9\xe4\x1d\xc4\x09\xea\xba\x93\x4a\x1b\xdf\x9a\x49\xac\xce\x4d\x47\x1d\x96\x15\xe7\x7a\x59\x1e\xb3\xba\x9e\x63\x1b\x1a\xdf\xa6\x81\x18\x71\x04\x9e\x30\x3e\xab\xb3\xe2\x30\x4a\x52\xf2\x50\x33\x64\xd7\x1c\xe6\x0d\x3b\xd3\xdc\x5d\x89\x87\x26\x65\x72\x44\xaa\xb5\xac\x84\x1c\x02\x35\x78\x94\x28\x64\x50\x7b\xaa\xce\x20\x45\x9e\x75\x24\x91\x8c\x47\xc6\x32\x47\x1d\x50\x73\xa0\x12\x13\x14\x89\x1b\x45\xb4\x05\x24\x9f\xce\x79\x3e\x93\xab\xe1\xc4\x48\x04\x13\x61\x5b\xe0\x3c\x05\x31\xe3\x31\x8d\xb9\x23\xbd\x5f\x6b\xac\x12\xaf\x1b\x38\x7e\x10\x53\xcc\xb1\xce\x32\x1e\x33\x6d\x89\xb9\x2d\x29\x71\x51\x94\xbf\x60\x52\x64\x3c\x61\x4e\xea\x1a\x55\x3a\xa7\xa9\x68\x4e\x05\xb5\xb2\x77\xae\xaf\xc7\x89\xd3\xfe\x2e\xe8\xc0\x5f\x05\x24\x76\x8c\xdc\x95\x87\xa7\x0a\x4e\xa2\x02\x2f\x6f\xf2\x01\x4d\xf2\xec\x64\xe7\x8c\x02\x9a\x14\x54\x14\x1a\x7e\x40\xc6\x8d\x70\x0d\xc5\xa8\x09\x9a\x35\xef\xc3\x2c\x94\x1b\xc5\xb9\x08\x3a\x15\xb7\xed\xf9\x04\x95\x55\xf2\x58\x1d\x0e\x7e\x11\xf3\x34\xb4\x04\x5f\xa6\xac\x9a\xe7\x1f\x00\x2f\x6d\x54\xb0\x5e\x3e\xa2\x9f\xb9\xaa\x9b\xec\xd8\x57\x8c\x79\xca\x62\xef\x6b\xef\x91\x56\x4f\x8b\x46\xec\x47\xa5\x43\x9e\xf2\x48\x27\x5d\x0f\x10\x5a\xf5\x65\x09\xa6\x75\xd8\xba\x3e\xb5\x68\xf2\xba\x52\xb0\x64\xcb\xd6\x34\xf4\xdc\x82\xe3\x4f\x23\x08\x41\x58\xe6\xb5\x65\x69\xb7\x05\x8b\x59\x5b\xd3\x7a\x55\x88\x82\xcf\x54\x39\x02\x22\x71\xc1\x35\xf6\x5b\x7c\x15\x95\x16\x45\x57\xcd\xe4\x42\x33\xe6\xca\xe4\xae\xdc\xd9\x1d\x31\x91\x61\xc3\xee\x4e\xb8\x7a\xc7\xce\xa8\x0b\x3f\x78\x7c\x0b\x32\x0a\x30\x47\xe6\xad\x81\x90\x39\x92\x57\x0d\x11\xa2\x5c\xd2\x10\x1b\x04\xd1\xb7\xbb\xcb\x6a\x84\x17\x76\x07\x75\x40\x03\xd7\x7f\x3c\x48\x38\xb9\xa3\x2a\x08\x09\x77\x02\xf9\xd8\x6e\xb4\xf7\xc1\xc6\x7e\x58\x6d\xe0\x8a\x08\xee\x72\x67\x4f\x15\xe8\x6c\xa8\x2c\xcb\xb8\xd2\x86\x7a\x56\x18\x2f\x60\xf7\x01\x9d\xab\xf7\x1a\xb8\x66\x56\x33\x66\xf9\xb8\x7e\x58\x2d\x47\xde\x0a\xd7\x3c\x46\xce\x9b\xa7\xdd\x72\xfc\x77\x45\x5d\x03\x62\xb3\x97\xe7\xf7\x65\x2f\x9e\xfe\x01\x49\x88\x3b\x0f\x42\x92\xba\x52\x86\xcf\x79\x7c\x26\x0e\xc8\xb8\x21\x60\x79\xf8\xdb\x77\x00\xfd\xb4\x34\xca\x46\x78\x59\xa1\xe1\x27\xe8\xab\xf7\x59\x7a\x6a\x3b\x38\x0d\x49\x48\x9d\xd6\xba\x63\xee\x19\xed\x08\x69\x28\x35\x42\x46\x16\xc5\x01\x86\xed\xc7\x2c\x0d\x95\xb2\xba\x04\x8f\xab\x39\x87\xe3\x32\xaf\x93\x86\x10\xe2\x16\x7f\xca\x05\xf6\xca\xc3\x63\x25\xd4\xb4\x19\x97\xa5\x51\x10\x61\x4b\x42\x93\x59\x24\xeb\x24\x8f\x92\x92\x98\x20\x66\x3f\xab\xb7\x7f\x3d\x20\xbf\x88\x3f\x93\xa4\x06\xc9\x24\x4a\xad\x6b\xcb\x5d\x35\x6b\xb3\xd2\x38\x20\x18\xde\x22\xcb\xda\xb9\x2a\x84\x02\xc4\xb5\x8f\xab\xa1\x5d\xbf\x03\x96\x45\xb1\xa6\x7a\x59\x27\x4d\xe3\x50\x04\xa9\x57\xc1\xc9\xe1\x20\x74\x79\x0d\xab\x5a\x9d\x21\x17\x17\xc2\x26\x17\x05\xa4\x34\x4e\xe2\x14\xfc\xe9\x75\x76\x28\x04\x82\x2a\xdb\xb0\x7e\xe0\xe1\xa5\x31\xe5\xe8\xb1\x7d\xdb\xdc\xf5\x88\x62\x7f\x0c\x8c\x85\xb3\xba\x4c\xc4\xb2\xf4\x14\xf0\x93\x71\x26\x41\xcf\xab\x5d\x64\x8b\xa2\x38\x8b\xdc\x2e\xb5\xc9\xb0\x84\xf2\xd8\x17\x7e\x51\xce\x67\x62\x6b\xd3\x44\x6b\xcc\xc1\x88\x57\x91\xe5\x9d\x98\xbe\xdf\x3d\x47\xb5\x32\x77\x06\x25\x02\x53\x6a\x3b\x21\xfd\xee\x9b\x52\x1e\xf6\x62\x82\x1e\x8b\x77\x63\x75\xf4\xfd\x18\x2e\x13\xe5\xba\x60\x6d\x2e\x6c\x34\x01\xd3\xc0\x60\xf5\x11\x35\x7c\x5f\xbd\x7e\xaf\x87\x45\xa6\x69\x22\x90\x0b\x7e\xef\xf3\x6d\x76\xbf\x1c\x04\x07\xfd\x33\x0b\x17\x45\x3b\x12\x87\x99\xfe\xaa\x19\x37\x3a\x95\x22\xc2\xd4\xc7\x4b\xad\x86\x3d\xe3\xbf\xd3\x26\xce\x52\x29\x6d\x47\xe5\xf6\x76\x31\x85\x20\xa7\x52\xcb\x98\xfa\x1c\x12\x72\x42\x7f\x86\xf9\x49\x55\x1a\x22\xe4\x54\x59\xe2\x25\xcb\x4e\x38\x25\x38\x62\x29\x08\x81\x15\x32\x2f\x6d\x99\xda\xeb\xa4\xfe\x32\x26\x21\x51\x0f\x7f\xc0\x0d\xcf\xdf\x90\x61\x0a\x09\x69\xf6\xa7\xb2\x6e\xbe\x3b\x02\x84\xcf\xd3\xe3\xa9\xe1\x12\xbd\x51\xc0\x04\x97\xff\xa3\xa2\xb8\x5a\xdc\x29\x4b\xf7\x77\x11\x44\x01\xed\x22\x7f\x9c\xbc\xce\x6e\x76\xfb\x99\x08\xb8\x35\x6b\xfb\x31\x35\xcd\x75\xe1\xef\x52\x84\x94\x23\xd3\xc7\xd6\xbf\x36\x44\x92\x8c\xa7\xb7\x08\x69\x8a\x55\x88\x76\x53\xff\x96\x4d\xc4\x78\x98\x08\x39\x4d\x9c\x8d\x9a\xbc\x3f\x11\x9a\x28\x1a\xf4\xcc\x4d\x29\xd6\xdb\x01\x12\x51\x27\x4f\x9b\xd5\x7e\xbb\xb8\x5b\xf5\x42\xc8\x4c\x44\x71\x8c\xbb\xc2\x3a\xcf\xcf\xc7\xac\xe8\xc9\x00\x98\x88\x78\x84\xb7\x8d\x4d\x15\xe7\x77\xaf\x9d\xdf\x1f\x17\x94\x7a\x92\xf7\x52\xc3\x62\x7e\x3b\x10\x24\x22\xc6\x36\x3a\x22\xd2\xd6\x77\x26\x5d\xad\xaf\xaf\xd7\x0f\xb7\x7f\x74\xa3\x18\xc6\xba\xe8\xa2\x4d\x27\x9e\x20\x8c\x26\x8e\x51\x6c\x69\x2c\x26\x23\x8c\x78\x77\x90\x61\xea\xb9\x93\xa6\x2b\xf3\x0d\xa0\xe5\xbe\x6b\xad\x74\xb3\x81\x57\x24\x58\x79\x28\x2d\xf8\xbc\x6f\x83\x67\x22\x16\x26\x4c\x06\x0b\xec\x8f\xde\x12\xf6\x3f\x10\x2b\xc3\xb5\x4f\x08\x3f\x62\xf1\xf8\xa7\x9a\xf4\x91\x32\x11\x43\x8c\xd0\x91\xef\xeb\xa7\xe5\x97\xc5\xfa\x61\x68\x13\x44\xa2\x23\x9e\x58\x85\xfe\xa1\xc3\xe2\x8e\x52\x15\xdb\xf6\xf7\x4b\xfe\xda\x6e\x04\xc5\x34\x7a\xeb\x13\xeb\xac\x99\x87\xe1\xba\xb1\x9c\x6a\xdd\x13\x8d\xaf\x0a\xa8\x0e\xef\x7f\x5c\xa6\x20\x86\x27\x00\x82\x0d\x5b\x33\x0f\xda\x81\x82\x3e\x4d\xd8\xcd\x27\x8e\xc6\xae\xb3\x48\x69\x1a\xb9\x76\xa9\xd3\x7a\xf9\xb8\x8f\x82\xfd\x3d\x6a\x06\xf8\xe3\x82\x62\x6d\xd4\x31\x82\x3f\x40\x63\x36\xf0\x0a\xc5\x79\xd2\x90\x27\x52\x4d\x75\x97\x94\x5c\x2f\x1f\x27\x6f\x4f\x44\x0c\xab\x57\xa7\xb2\xcc\x7b\x26\x72\x7f\x50\x70\x62\xe5\xa1\xcf\x45\xf3\x1e\xfc\x1c\x7d\x15\xa9\xe2\xc8\x75\xac\x1f\xc4\x11\xd4\x45\x57\x93\x50\x41\x8a\x76\x61\xa1\x35\xe8\x19\x3a\xa3\x8b\xe8\x61\x72\x7a\x18\x63\xe9\xcc\x33\x4d\x2e\xcf\xcd\xd3\xd4\xbd\x15\x4a\x40\xe4\x5c\x7a\x8b\x4d\x18\x67\xcd\x85\x26\x21\x06\x9d\x77\xe5\xe1\x4b\xa9\x73\x5c\x21\xdb\xcb\xa0\xdb\x8f\x96\x96\x71\x3d\xb3\x99\xf8\xec\x6f\xd8\x55\x80\x48\x1d\x9f\xce\xfd\xe8\x5b\xce\x06\x40\x42\x83\x89\x5c\xcb\xe4\x32\x6b\x84\x25\xdb\x43\x7d\xb9\x39\xb9\x49\x26\x80\x08\x0c\x3e\x4c\x96\xe7\x57\xe7\xf7\x1e\x1c\xff\x61\xa8\x26\x80\xc5\x89\xe3\x15\x18\x45\x14\xfe\x70\x4a\x31\x7f\xf7\xf3\x97\x70\x43\x61\x42\x6e\xb0\x40\x03\xfa\xa9\xdc\x8e\xbe\xb5\x21\x5a\xf7\xbb\x48\xeb\x8b\x74\x47\xc0\x4a\xd9\x7b\x3e\xe8\x4f\xab\xe4\xc2\x98\x40\xb3\x8e\x3a\x2d\x7f\x77\x4d\xca\x9f\x90\x1a\xdb\x13\x65\x10\x11\xb4\xe0\xd7\x4f\x4f\x53\xfb\x26\x03\x13\xa0\x54\x76\xeb\xfb\x8f\x25\xd9\xba\x01\xb6\xaf\xf3\x5c\x83\xc6\x10\x7d\x7c\xed\x30\x34\xca\xb6\xb9\x65\xc5\xbd\xf8\x79\xa9\x9f\xc9\x64\x48\x2d\xc2\xc5\x27\x5a\xbc\x6b\xe3\x9e\x16\x6a\x97\xba\xd6\x8e\x1c\xa9\x3b\xcf\x68\xec\x68\x39\xd7\xed\x6e\xbf\x6a\x9e\xef\xca\xc3\x36\xfb\xbb\xbb\xf5\x88\x80\xa2\x6e\xbe\xe1\x74\xb3\xd4\x10\xfe\x28\x13\x28\x2a\xbd\x7e\xc4\xcb\x9f\xba\x4d\x49\x92\x10\x74\xd7\x4c\xf9\xa9\x9d\x71\x8e\xe9\x30\x67\x2e\x89\x0c\x3a\x88\xa3\x6d\xae\x40\xce\xf2\xd1\xc6\x28\xe3\x50\x08\xaf\xf9\x6a\xf5\xd1\xb2\x6e\xf7\x92\x31\x31\x81\x95\x03\x38\xb5\xbf\x78\x75\x7e\x7f\x38\x5f\x0a\x85\x7a\x77\x5a\x26\x2c\xa4\xbd\x60\xc4\x16\xf2\x7c\x9e\x67\xe9\xd3\x99\x2e\x69\xc0\x11\x49\x26\x85\x7a\x81\x42\x5b\xe4\x5f\xe7\x85\x48\xaa\x94\x70\x20\x89\x66\x38\x79\x25\x35\x1a\xbb\x84\xeb\xb3\xbc\x16\xef\x1f\x14\x9f\x24\x4b\x53\x3c\xdd\xdd\xd3\xcd\xb9\x50\xf3\x93\x58\x32\x4d\x95\xf0\x9c\xe2\x60\xa5\x5c\x16\x85\x76\x6a\x70\x83\x18\x57\xf2\xd0\xc4\xb6\x2b\x61\x75\x2a\x15\x52\xc2\x6d\x61\xe2\x9c\x48\x9e\x04\x48\x4a\xfb\xd6\x37\x2d\x0c\x38\x2b\x26\x0e\x81\xe4\x4c\x33\x57\x2b\x7d\x74\x15\xcd\x59\xcf\x41\xa6\x2c\xe2\x7c\x40\x98\xb2\xf2\x79\xbc\xcf\x5f\x72\xca\xad\xfe\x69\x95\x1d\x9e\x9b\x70\x72\xab\xa9\xb4\x69\xb3\x59\xb6\x85\xf3\x47\x2d\x9c\x32\x55\xc4\x57\x4f\xb7\xa0\xca\x42\x63\x72\x66\x4e\x37\x91\x49\x11\x59\x47\x00\x73\x3e\x8b\x42\x5b\xb6\xb6\x19\x16\xea\xc9\x7d\x8b\x34\x42\xf2\xc6\xaf\x8b\xbb\x78\xf4\xf5\x25\xe1\xe0\xf2\x65\x2e\x08\x9e\x35\xbd\x52\xc6\x36\x4f\xb2\x5b\x2d\xee\x03\x7f\xb2\x62\xb6\x0e\xea\x71\x8a\x36\x28\xfa\x45\xea\x44\x2a\x88\x10\xee\x73\x0f\xc5\x39\xf0\xdd\xe5\x52\x4b\x89\xb1\x81\xed\x8c\xf7\xba\x93\xa8\x60\xf8\x9c\x9d\x06\x71\xa1\xd4\x4a\x63\xe1\x66\xfd\xd7\xe2\xeb\xda\x77\x35\x48\x88\x63\x24\x1d\x97\xa2\xb0\xc5\xd4\x69\x02\x57\x02\xb3\xb4\x10\x96\xa4\x73\x94\x7c\x95\xa0\x48\xc8\x3b\x5c\x8b\x6b\x27\x9b\x9d\x39\x2a\x88\x53\xac\x4d\xb4\x36\xf6\xb6\xf4\xcc\x65\x4c\x05\x2a\xc1\x7c\xf9\xb1\xd4\x99\x79\xbf\x17\xd5\x4b\x56\xcc\xeb\x26\x33\x15\x52\x82\x2d\x59\x6f\x90\xed\x6c\x0a\xcb\x5f\x25\x12\xd6\xa8\xfd\x10\x55\x95\x95\x55\x7d\x25\x5a\xab\xfd\xa5\x3c\x7e\x68\xc7\xba\x13\x01\x9f\x6e\x20\x2f\xe7\xaf\x49\x22\xca\xbb\x96\xac\x1a\xbe\x55\x23\x56\x45\xa6\x08\xb5\x2c\xb0\xb7\x67\x29\xa1\x6a\x57\x68\xeb\x88\x36\xcf\x55\xf9\xf6\x41\x9e\x5e\x11\x19\x5a\x12\x5f\x51\xec\x90\x3a\xab\x4f\x23\x2a\x22\x23\xad\x3d\x44\x0c\x3b\x3b\x90\x95\xb9\x8b\x6d\xc6\xf7\x1d\x07\xb6\xed\x01\x35\x5a\x2d\x86\xf1\xae\x3c\x64\x9d\x5a\xd3\xf8\x77\x63\x63\x62\xda\xfb\x75\x9d\x79\x53\x49\x6c\x55\x84\x9b\x67\x58\x5d\x2d\x7f\xad\x98\xc1\x54\x62\x12\xec\x80\x37\x65\x65\x1d\x38\x7f\x29\x1a\x25\xc8\x26\x5e\x89\x69\xca\x55\xd1\x94\x20\x3f\xc2\x5d\x59\x1c\x9e\x72\xd1\x27\xce\x87\x34\x3b\xfc\xdf\xc3\x4d\x85\x44\x83\x63\xee\x32\x8c\x44\x1d\x8f\xe8\x12\xc5\x42\x6c\xdd\x68\x5d\x28\x4b\x36\x33\x68\x4c\x53\x0c\x52\x70\x8e\xa4\x2b\xd1\x7f\xf0\x4d\x78\x40\xb1\xcd\x51\x1c\xa5\xa8\x6b\xa1\xcb\x89\xb3\xa7\x78\x60\xb7\xa5\x06\xc4\xf1\xae\x54\x2f\xdf\xba\x19\xc2\x09\x0f\x9c\xd9\xbc\xc9\x0a\x51\xa8\xac\x38\xd4\x0b\x3d\x7d\x7c\x2e\x2d\x52\xed\x6b\x96\xe7\xdb\xb7\xac\xe9\xfc\x6d\xc5\x55\x8c\xf9\x11\xe4\xb9\xaf\x3b\x4e\x2b\xa6\xb8\x31\xc4\xe5\x8b\x1f\xe0\xdc\x54\x22\xbf\x3f\x5b\x4f\x0f\xdd\xa4\x41\xc6\x44\x89\x80\xe1\x4c\xf8\xdf\xb3\x40\x4e\x85\x85\xcf\xb5\xf8\x6b\xc9\x34\xc6\x29\x7e\x0b\x85\x6d\xd6\xd9\xb4\x17\x9a\xb7\x32\x4a\xca\x74\x58\x58\x5d\x54\xe0\x63\x66\xa5\x08\x43\x03\x34\x90\xe3\xed\xb5\x5a\x99\x52\x31\xa0\x7d\x41\x34\x67\xf7\x47\x4a\x3c\x01\xd5\x15\x34\xbb\xac\xe9\x6f\x4b\xa9\x24\x19\x30\xbf\xee\x55\xbf\xf2\x34\x09\xb5\x33\xed\x77\x77\xdf\x5d\x23\xdd\x98\xfa\x40\x41\x40\x91\xa4\xd0\x02\xca\xaf\x41\x9f\x95\x6f\xab\xf9\xe0\xd1\x40\xa8\x34\x1d\x56\x8a\x6c\xa3\xe5\x55\xe9\xdf\x68\xf8\x81\xc3\xad\x40\x31\x2c\xaf\x39\x86\xcf\x31\xbf\x32\x53\x60\x24\xba\xb8\xeb\x6b\x8f\x8a\x51\x26\xe2\xc6\xd2\x0a\x17\x08\x79\xdb\x65\x47\x28\xcf\x4d\x77\x98\x0a\x8c\x72\xee\xfe\x67\xe4\x11\x2b\xc3\x03\xcf\xc9\xde\x7d\xc6\x6b\x78\xbd\xe9\x34\xab\x98\x0e\xe2\x18\xd1\x58\x8b\x73\x53\x2e\x9f\xc5\x18\x0d\xae\xc3\xc8\x0a\x58\x56\x20\xf4\xc8\xa7\xfc\x56\x43\xe5\xb3\x30\x13\xd3\xac\xa3\xc0\x70\x57\x8d\xbf\x87\x06\xaa\x53\x39\x64\x43\x1f\xbe\x43\x1d\x45\x29\x02\x9a\x24\x34\x8f\xa7\x0f\xb9\x91\x66\xb6\x6b\x1d\x51\x48\x7d\x97\x84\xb2\x2a\xcc\xef\xf8\x6a\xac\xeb\x44\x63\x37\x2e\x36\x94\x7b\xed\xf9\x52\x96\xcd\x4d\x59\xb5\xf7\x7e\xf5\x6e\xa5\x81\x66\x3f\xad\x4e\x38\x45\x7d\xc0\x93\xad\x41\x3e\x55\x65\x69\x1e\xcd\x8f\xb2\x9a\xb4\xa5\xeb\x44\x52\x13\x76\x94\xb2\xe8\x33\xa2\x6e\xa2\x3f\xac\x02\x04\xa5\xff\xf9\xfd\x11\xb1\xf4\xdd\xdf\x75\x88\x84\xf7\xaa\xac\x9b\x8d\x63\xf8\x9b\x5e\x59\x6b\xcc\xe8\x78\x96\xfd\xd9\x99\xa4\x29\xa4\xe8\x3f\x99\x73\xa1\x71\x97\x1e\x41\xf6\x34\x35\x02\x6f\x0f\x44\xdd\x46\x31\xa7\xf2\xa3\x94\x99\x66\x2c\x65\xc1\x00\x21\xd8\x06\xc2\x7f\xb6\x43\x6f\xaa\xf2\x78\x2d\x4e\xa7\x29\x08\x68\x72\x23\x4c\x26\x48\x99\xd8\xc6\x84\x23\xb7\xf9\x5f\x49\x6f\x92\xe9\xc4\x24\x8f\x01\x45\x3a\xa5\x24\x70\xfc\xbc\xf7\x28\x8b\xdb\x3c\x7f\xcf\xc4\x94\x45\x64\x7c\xdf\xa9\x89\x71\x82\x0e\x0b\x40\x1f\x94\x42\xb5\x48\x09\x36\xe7\xba\x86\xea\x0f\xa9\xdb\xe7\x7f\x49\x08\xc0\xf6\x58\x24\x17\xbd\xa9\x00\xba\xc6\xca\x76\x1e\xf9\x41\x32\xc6\xaf\xf6\x8a\xdd\xc4\x87\x01\x18\x43\x0b\x05\x16\x63\x8b\xe5\xb7\x36\x18\x29\xdf\x2e\x45\x36\x99\x96\x81\xa5\x57\xdc\x42\x6e\xb0\x08\x77\x56\xcd\xb8\x95\x41\x4b\xa9\x30\x6d\x57\xc0\xcf\xc6\x36\xb4\x75\x47\x94\xc5\x56\x3a\x35\xc4\xa7\x52\x0f\x02\x39\xad\x63\x89\x9e\xfe\x41\x1c\xc1\x53\x6c\x32\xad\xb5\x15\x33\xcf\x1a\x38\xba\x36\xdb\x69\xa2\x5f\x43\x64\x81\x33\x3f\x86\x2a\xdc\x17\x2f\x6e\xfc\xba\x41\x30\xc4\x48\x8b\x0a\x1e\x73\x6d\x79\x92\xbe\xc2\x7b\xfd\xbd\x1c\x2a\xfc\x4d\xce\xd1\x36\x51\x7c\x5d\x9e\x7d\x47\xa6\x36\x81\xb0\xa4\x8a\x79\xbe\xef\x6b\x4d\xda\xa4\x81\x6f\x6b\xbc\x3a\xbf\x7f\x2b\xb2\xa6\x6e\x03\xc4\xea\x28\x86\xb5\x37\x6d\x84\x44\x40\x84\xef\x54\x19\xbb\x1f\x10\xc4\x74\xd0\x47\xd4\x6e\xf8\xbd\x8c\xe5\x1f\x7e\x0c\x25\x49\xeb\xa2\x2c\x6e\x57\x0f\xbb\xfd\x76\xb7\xd8\x7d\xdb\xce\x03\xcd\x21\x48\x3b\xe6\xa6\x6d\xa6\xa7\xf5\x23\x08\x23\x86\x82\x72\xab\x4a\x45\x01\x92\xf7\x7f\xd8\x8e\x0d\x51\x18\x20\x2b\x6a\x89\x28\xe0\xa7\xb2\xcc\xad\xb8\x76\x7d\x87\x19\x84\x46\xe4\xd3\x09\x0e\x51\x24\x94\x0f\xbb\xb0\xbe\x75\x2b\xa6\x77\x10\xf1\xd8\x13\xfc\xb7\x93\xf3\x0e\x8c\x9f\x3b\x10\xa5\x04\x3b\x70\x3d\x08\xfc\x37\xfa\x5b\x81\x24\x02\x9b\x73\x90\xd4\x69\xbb\x5b\x6c\x3c\x42\x17\x88\xa4\x58\x78\x11\x59\xa5\xab\xf2\xb4\x28\xf4\xb0\x5e\x06\xc4\x18\xcc\x0c\x9e\x2a\x38\x14\xa2\xf0\x5d\x0c\xfe\xb3\x41\x1c\x48\x04\x4d\x6d\x1b\xd1\xfc\x39\x40\x09\x41\x1c\x52\x64\xed\xbc\x7b\xbc\xdd\x6f\xad\xee\x90\x39\xe7\x73\x40\x33\x7f\x82\x89\x13\xe2\xc3\x41\x67\x4d\xd7\xc7\xd3\x04\xeb\x04\x49\xa0\x95\x25\x6a\xbb\x7b\x5c\x4e\x8f\x45\xb1\x95\x10\xb2\x61\xde\x5f\xe5\xb9\x1a\xe5\xc9\x21\xa1\x16\x51\xbb\xc7\x7a\xfc\x70\x5f\x99\x5c\x88\xd3\xd8\xcd\x59\x2b\x6c\x3a\xc4\xaa\x42\x92\x12\xac\x21\x36\xe5\xe1\x90\xc3\xa2\x69\x84\x7a\x06\xbd\x6a\x27\xb5\x02\xcb\x3f\xdb\x85\x5f\x90\x18\x85\x14\x25\xb7\x79\x29\x45\xbe\x03\x35\x42\xf4\x03\x65\x04\xcb\xda\xb7\x8b\xed\xfe\xea\xdb\xcd\xcd\x6a\xd3\x1d\x49\x23\x2c\xbb\xee\xdd\x97\x19\x28\xed\x30\xa0\x3a\x40\x0b\x81\x0e\xe4\xb2\x2c\x4c\x76\x89\x82\x1a\xbf\x5e\x46\x84\x36\x17\xba\x7b\xdb\xf2\x5c\xf5\x0b\x88\x13\x9b\xfd\x3b\x8a\x46\x3d\xdf\x5b\x62\x13\x4b\x2a\xe6\x37\x6b\x17\x31\xf7\x9c\x59\x90\x46\x0c\x2b\xef\xf7\x99\xaa\xca\xab\x9d\x2f\xd7\x40\xca\x12\x4b\x35\x66\xc9\xa2\xa3\xfd\x6b\x6b\x4e\x9c\x72\xf5\xfe\xd8\xc6\x6b\xe2\x00\xfb\x7a\x40\x7a\xcc\x20\x15\x02\xf7\xe1\x7d\x56\x6f\xb3\x76\xa5\x3d\xb5\xd1\x52\x33\xb4\x43\xe3\xa7\xf2\x4e\xf0\x16\x44\xde\xb3\xb6\x4f\xd7\xc2\xff\x29\x33\x04\x82\x0b\x14\xa9\x5e\x3d\x8e\x9c\x34\x90\xca\xfa\x76\x07\x68\x1c\xef\xfd\x87\xec\x1b\xee\x0c\x1d\x76\x0d\xb2\x0f\xe5\xa3\xb9\xaf\x0f\x13\x17\x0c\x74\x9c\x60\x32\xc3\x79\xb0\xdb\xbc\x6c\x2e\x46\x68\x3e\x66\x4d\xfe\x7e\xff\xab\xfc\x05\x68\x61\xb0\x8c\xb0\x7b\x86\xdb\xf2\xfa\x90\x0d\x66\x8e\x36\x1c\xaf\x77\xfd\xf8\x63\xbf\x5d\x74\x66\x00\x82\x20\x01\x47\xd3\xde\xcd\x07\x08\x95\xd7\xca\x7e\xaa\xe0\x35\x2b\xcf\x35\x92\x43\xf9\xc3\x29\x47\xfd\xb0\xa6\x3a\xd7\x0d\xe8\xab\x73\x55\xcc\xb0\xe9\x32\x30\x31\xc3\x9d\x32\xab\xbf\xf6\xa4\x05\x60\x04\xe5\x3e\x25\x28\x72\x98\x12\xf7\x33\x30\x32\xa4\x51\x07\xe4\xff\xcd\x6f\xda\x9d\xcb\x51\x21\x18\xa5\x1b\xaa\x79\x60\xb4\x09\x62\xc0\x3a\xdf\x69\xa8\xcc\xd5\x1d\x0d\x89\x85\xee\xfc\xef\x59\x54\x8d\x43\x4c\xfa\x43\x5c\x63\xfe\xd8\x4e\xe6\x21\xdf\xdd\xef\xc1\x7a\x87\xf9\x53\x13\xc5\x1d\xb6\x73\xb9\xfc\x62\x83\x1e\xee\x7f\x29\x52\xd6\xd6\xaf\x44\xed\xa4\x5d\xc3\xa0\x3b\x06\x54\xd8\xd2\xb7\xc7\xe2\x38\x3c\x51\xe0\x06\x90\x20\x40\xc4\x22\xe6\xb8\xdb\x77\xbc\xbf\xc7\x64\xcb\xaa\xd0\xd7\x53\xd5\x05\x86\xb2\x7a\xba\x0b\xd9\x3e\xd4\x95\x6f\x07\x1a\xec\x2e\xff\x22\x0a\xfd\x63\x4a\xf3\xcd\x0c\xa1\x41\x18\xf8\xcf\x66\x5b\x9e\xc6\xe7\xc7\x11\x51\x2e\x87\x76\x07\xc2\x8c\x59\xf4\xba\xd7\x1f\x47\x8a\x5a\xb4\x57\x1b\xac\xf5\xdd\xcf\x26\x76\x6a\x82\xbb\xf5\x6a\x13\x0d\xea\xa7\x26\xa6\x1a\x23\x7f\x5b\x68\x7c\x13\x95\xbe\xda\x8e\x23\x36\x93\x18\xab\xd7\xd6\x31\x5a\xc3\x03\xfc\x6c\x1e\xe6\x66\xad\xa1\x26\x0e\x7a\x09\xf8\xaf\x7f\x2d\x1d\x2b\xc0\x74\x94\x40\xfb\xbd\x5a\x5f\xdb\xc4\xe8\x66\x19\x75\x5f\x88\x85\x96\x1f\xd6\x9c\x9b\xea\x3e\xeb\x24\xed\x98\x61\x31\xc3\xed\x18\x71\x9f\xb6\xe3\x68\xe8\xed\x18\x96\x70\x4f\x8e\x69\xc3\x81\x89\x8a\x2d\x33\x4c\x42\xe2\x1a\x0b\x6f\x7f\xa2\x86\xc1\x24\x8b\xe8\xc6\xf1\x98\x62\xe1\x7f\xbf\xdf\xbb\x80\x7b\x57\x4e\x87\x50\x45\xa6\xe4\x2c\xf5\xa6\x7b\xad\xdc\xd8\x55\x82\xfc\x7f\xe8\xb0\x77\x18\x5a\x37\x42\x84\x1a\xdd\xdc\x2f\xed\x62\xeb\xfe\x98\x44\x1a\x3c\x40\xc1\x2a\xdf\x60\xd6\x60\xfc\xdb\x42\x70\x5b\xcf\xb5\xe9\xae\xa1\x8a\x1b\x33\x32\x15\xb8\x88\x75\x56\x9f\x72\xf1\x7e\x1c\x13\x0c\x19\x29\x2c\x76\xb1\x82\x57\x10\xf9\x90\x22\xcb\xa8\x54\x20\x7e\xf6\x47\x59\xe5\xfa\xa1\x53\x4c\x63\x46\x29\x4d\x6c\x0e\xbd\x27\x95\xf7\xcc\x52\x1f\x99\x18\x77\xaa\x06\x1e\xf6\x3c\xbc\x4f\x8f\xeb\xc9\xa3\x40\x18\x76\x75\xe1\xff\x47\xd0\xf4\xfe\x73\x03\x58\x65\x49\x3b\x19\x07\xbc\x35\xc6\x84\x09\xb7\xea\x62\x5f\x44\xde\x63\x21\x8c\x09\xa5\xc3\xcb\xfd\x5c\x8a\xd3\x06\xd0\x47\xe9\x0e\x46\x81\xdf\x98\xda\xf9\x05\x55\xf3\xbe\x2c\xf3\xb2\xaa\x1f\xcd\xc6\xe9\xd2\x86\x43\x7c\x0e\x0f\x82\x38\x42\xe6\x8d\x5c\xd4\xcd\xd7\xa2\x7c\x2b\xfc\x79\xa3\xa4\x19\x0f\x82\x34\xc6\x8e\xf5\x76\x11\xae\xfe\x7b\xee\x44\x87\x78\x10\x52\x85\x75\xf7\xfb\xc5\xfa\xc1\x62\x1f\xae\x1e\x1f\xbe\x6d\xf7\x4f\xab\xcd\x72\xf5\xb0\x5b\xdc\xae\xf6\x4f\x5f\x16\xdb\x55\xe8\x4f\x88\x58\x84\x86\xe4\x5e\xe4\xe2\xbd\xce\x04\x61\x41\x77\x88\x4b\xcc\x39\x8a\xb3\xce\x9a\x81\xb4\x92\x3b\x4c\x62\x4e\xe5\x24\x9d\x32\xf2\x92\xfd\x38\x01\x98\x8e\x79\x79\x57\xcb\xf2\x78\xca\xc1\xbf\x56\x1e\x10\x93\x72\x9b\x30\xa8\xc6\x86\x92\x07\x71\x92\xc6\x3d\x27\xc7\x75\xcf\x7f\x34\xd3\x15\xc1\x83\x98\x72\x37\x4b\x6d\xc0\xde\xee\x92\xd3\x0b\x8a\x84\x43\xe7\x4f\x6e\xc0\x58\x94\x9d\xbf\x95\x24\xe4\xdc\x82\xd9\xda\xa8\xce\xad\x74\x57\x52\xdc\xa0\x5c\xae\x1f\xc8\x03\x34\xcc\xdf\xcb\xec\xb4\xeb\x1c\x17\x1e\x24\x69\x18\x0b\xbf\x14\xdb\xa0\xba\xd9\xc0\x7f\xcf\x59\x05\x7a\x57\x6e\x40\x55\xe7\xac\x99\xdc\x51\x22\x29\xd6\x4d\x9e\x36\x2b\xfc\x52\x96\x60\xe0\xcb\x62\x73\xdd\x1b\x5c\x1e\x24\xa6\x4b\x94\x6f\x90\x9c\x7d\xfc\x76\x69\xc4\x3b\xc5\x3f\xe4\x28\xbc\x64\x08\xe2\x01\xa5\x0c\x93\x94\xe2\x74\x82\x42\x7f\xc3\x96\x8a\x51\x2f\xdc\x3f\xc6\x77\x46\x59\xe2\xcc\x4a\xa1\xaf\x33\x71\x2c\x07\xf1\xc4\x58\xbb\xd5\x33\x12\x4f\x2f\x20\x52\x6c\x01\xb5\x8f\xb4\x7b\xdc\x2d\xee\x86\xcf\xc4\x62\xa2\x2c\x02\xee\x67\x1b\x98\xdb\x92\xd8\x00\xee\xc8\x83\xd6\xf2\x72\xdb\x35\xd6\x46\x66\xed\xbe\x1a\x75\xc7\x94\x0c\x2c\xe1\x58\x56\xfc\xc7\xa6\xef\xc7\xef\x84\x01\x45\xd2\x92\xff\x59\x2d\xbf\x2e\xac\x5f\xef\xcf\xe5\xa1\xd4\x51\x2f\x32\x7b\x7f\x6e\xce\x22\xff\x9f\x52\x2e\x31\x65\x95\x8b\x5e\x1e\xfd\x32\x5f\x39\xeb\x05\xf1\x80\x73\x8e\x0c\x25\x7b\x25\x8a\x27\xf1\xfe\xe8\xc8\x58\x26\x1f\x9b\x2b\x83\xc6\x00\x9c\x16\xd0\x17\xc8\xa1\xc8\x06\x7c\x3d\xe3\x47\x48\xe3\x18\xb1\x95\x48\x3f\xb8\xc9\x0e\xcf\xf3\x79\x57\x1e\x88\x84\xa7\x72\x44\x11\x37\x83\x01\x1c\x5f\x5b\x4a\x89\x1c\x45\x8e\x32\xb2\xcf\x7f\xf2\x40\x82\xc2\xa6\x5e\x40\xa6\x9e\xa7\x6a\xc0\x46\xc7\x03\x15\xc6\x22\xe9\x39\x6a\xdd\x8f\xfc\x58\xad\x7b\xf9\x6c\x1e\xa8\x88\x8b\x68\x4c\xec\x37\x88\x84\x3a\x3b\xa5\x09\xb5\xac\xab\x22\x87\x1f\x90\x75\x85\x21\x1e\x68\x69\x5d\xe7\xd6\x63\x55\xcf\x90\xe7\x59\x71\xb0\x24\xf5\x53\x3e\x71\x1e\x40\xa0\x6d\x55\x47\xbc\x5a\xc9\xce\xf3\x25\xc2\x8f\x07\x40\x00\x25\x22\xb6\x59\x71\x38\xe7\xa2\xca\x9a\xf7\x1d\xd4\x4d\x44\xfc\x4f\x82\x4a\x30\xcf\xe2\xdf\x61\xb7\xa6\x4d\x2a\xe2\x61\x53\xdf\x53\xf9\x02\xc7\xcb\x56\xde\xf1\x27\x09\x83\x24\x80\x4e\x3b\xf9\xaa\x12\x85\x7a\x5e\x17\xab\x53\x56\x0f\xef\x70\x7c\x4a\xc8\x24\xfa\xba\x0e\x2e\xd5\xe5\xec\x86\x82\x69\x3c\x0c\x53\x8a\xbc\xa2\x85\x7b\xb1\xf7\x59\x0e\x75\x53\x16\x9e\x11\x87\x87\x24\x91\xd8\x4f\x89\x3a\x4e\x1a\x54\xf5\x7e\x6a\xc6\x4a\x4e\x3c\x24\x8a\x04\x5e\x98\x76\xf7\x5c\x95\x6f\xdb\xf2\x08\xad\xc9\x3b\x74\x23\xc0\x32\x06\xed\xb3\xfa\x0e\xc4\xe9\x2f\x10\xd5\x10\xd2\xc9\xc3\x98\x44\x58\xd6\x6f\xb2\x23\x5c\x95\xe7\xc1\xec\xf4\x03\x92\x00\x9b\x05\x36\xc2\x98\xd6\xd8\xa2\x52\xe7\x47\xf8\x9b\x59\xef\xdd\x79\x93\x3c\x8c\xb9\x25\xa3\xb1\xfd\xac\xcb\xe7\xec\xf4\x21\xbf\xe1\x3f\x2e\x4d\x5f\x18\xa7\x4a\x7a\x6e\x08\xdf\x12\x35\x6e\x3d\xe6\x61\x92\x6a\x07\x60\xad\x32\x81\x3a\xd2\xfe\x80\x4a\x11\x6e\xb9\x83\xaa\x12\x2b\x55\x0e\x22\x55\x1e\xd2\x28\xa0\xae\x47\x67\x07\xe2\x78\xe1\x77\xb5\x23\xe2\x94\x61\x8b\xfc\xee\xcf\xee\x2c\x2a\x90\x52\xa4\xa3\xbb\x70\x7f\x67\x9a\x61\x5a\xed\x57\x3c\x63\xf3\x46\x28\x64\x60\x99\x5d\x85\xd6\x73\x4c\x8a\x83\x87\xe5\x4c\x99\x70\xa8\x2f\x64\xbd\xf8\xf1\xca\x0a\xb9\x50\xb6\x05\xc1\xbe\xf5\xbc\x2c\x60\xde\xc9\x9a\x43\x12\x5c\x10\xc4\xf3\x90\x1b\x01\xbd\x9f\xaf\x27\x12\x7f\x3c\x4c\x09\x8f\x1d\x24\x6a\x5b\x9a\xe6\x4d\x54\xe0\x64\xed\x26\xe0\xab\xb9\xda\x35\x0f\xd3\x34\x22\x3d\x05\x9e\xf7\xd2\x77\xe5\xb4\xf9\xa5\x1b\xce\x23\xab\x30\xf0\xee\x29\xd0\xfc\x11\x43\x6d\x9d\x0d\x5e\x47\x1f\x5b\x24\x31\xa6\x10\xba\x25\xb7\x5f\xe6\x65\x0d\xbb\x67\xec\x68\x1e\x9a\x9b\x50\x30\x8d\x1e\xd5\xf2\x5c\x55\xef\x7d\x40\xdb\xee\x3c\x61\x40\xed\x2e\x5c\x95\xaf\xf0\x00\x6f\x8f\xbd\x02\x37\x0f\x55\x92\x7a\x45\x3f\x04\xde\xba\x0d\x71\x7c\xe7\x4a\x08\xe8\xdb\x56\xee\x47\xe4\x6c\x33\x95\x21\x1e\x2a\xa9\x30\x84\xb9\x5f\x6f\x77\xdd\x2f\x19\x46\xe3\xa1\xb0\x1f\x36\x89\x9c\xdf\x2f\x67\x9d\x3b\x41\x87\x36\x14\x6f\x3d\xd9\x73\xf1\x32\xb9\x27\x08\x12\x24\x07\xff\xfa\x78\xfd\xe8\x7f\x02\x34\x20\xff\xd6\xa9\xcc\xf3\xd6\x19\xfb\xdf\x7e\x51\x99\x76\x49\x0e\x80\x59\x43\xfe\xe3\xf1\x77\x8a\x42\x6a\x33\x2c\x07\x68\xee\xb2\x02\xbe\x9d\x2c\x83\xdc\x5e\x83\xe9\xd3\xa7\x3c\x8a\x28\x20\x68\xd9\xdb\x6f\xcb\xac\x38\xbe\xcb\x28\x92\x9a\x0c\x75\x61\xb0\xd4\x3b\xeb\xbd\x44\x91\x66\xc6\x32\x4f\x6f\x7a\x7d\x89\xe1\x5b\x8d\x48\x2c\xb0\x90\xeb\x35\xb1\x5e\xa0\xf8\x56\x65\x93\x5f\x8c\x29\xc3\x24\xaa\xd3\x8e\x9a\xa6\xd2\x79\x14\x73\x8b\xb3\x75\xbc\xd9\x1f\x25\x5f\x66\xbf\x49\x14\x8b\x08\x37\x2d\x61\x2b\x42\xf5\x24\xff\xcd\xa3\x84\x58\x59\x07\x57\x6b\x9e\xa7\x9f\xff\xd0\x84\x4e\xae\x25\x52\xec\x31\x71\x4e\xf3\x06\x85\x5e\x7c\x67\x8f\x85\x06\x21\x18\x75\x7d\xb5\xf4\x0f\xc7\x84\x4d\x1a\x62\x8c\xf2\x73\x2c\x58\xf2\xaf\x28\xf8\xb7\x1b\xc6\xa3\x14\x5c\x22\xa3\x5d\xf8\x5f\x44\xa5\x97\xe2\xd2\xc4\xfb\xd1\x84\x79\xb5\x27\x0c\x45\xfb\x92\x12\x8f\x38\x50\x80\x51\x13\x62\x6e\x6b\xa0\xed\x94\x71\x8b\x69\xfc\x54\x69\x60\x1b\xfc\xff\xee\xd6\x79\x94\x86\x1a\x29\x80\x51\x10\x6a\x44\xb6\x33\x39\x35\x4d\xd0\x4b\xc9\xea\xf5\x11\xa9\x1f\xe6\x01\x10\xed\x40\xdb\x96\x78\x28\xfd\xc4\xeb\x7e\x2a\x05\xa4\xdd\x44\xc9\xec\x51\x0a\xe7\xb7\x52\xa8\x3c\x4a\xa5\xa5\xc9\xba\x5f\xfc\xb9\xbf\x5b\xfc\xb5\xda\x6c\xfd\xa5\x85\xb0\x25\x31\x0b\x74\xbb\x7a\xdf\x89\xc3\x28\x47\xc3\x23\xc9\x01\x3d\x70\xb4\x34\xd7\xa2\x3a\x1f\xc5\xff\x35\xa1\xeb\xaf\x24\xad\x74\xe4\x53\xd9\x6c\x4f\xf9\x0c\x4d\x6e\xbf\xf7\x44\x52\x47\x98\xe5\x58\xce\xc9\x16\x7e\xea\x65\x47\x8a\x11\x04\xf7\x74\x42\x3e\x5b\x98\x7e\x4e\xa5\x39\xfa\x5d\x3d\x67\xed\x06\x9a\xac\x9a\x86\x07\x91\xe6\x21\x7a\x8d\xb7\xeb\xe5\x62\x68\xe4\x23\x2d\x63\x0c\x2c\x30\xdf\xbf\x75\x65\xa3\xec\xef\x61\xe1\x68\x72\x57\x26\xb2\xf2\x67\x56\x19\xc4\x52\x67\x7f\x2e\x0f\xc2\x23\xc3\x35\x22\xf2\x26\x0a\x7d\x9f\x3b\x95\x24\xa0\xdc\x93\x55\x3d\x55\xbf\xd6\x7d\x9b\x9e\xac\x9c\x22\x7e\xb3\x17\x95\xcc\x9a\xcf\x2b\x59\x9c\x04\x92\x23\x0e\xc9\x25\xa1\x50\xc2\xd3\xc9\xb9\x7c\x70\x82\xa2\x09\x1d\x08\xa9\x61\x49\x21\xcf\x3b\xd4\x37\x27\x61\x64\x3b\xbb\x7d\xd7\xc8\xf7\xb2\x81\x9b\xb2\xb2\xbd\x5a\xed\x44\x68\xbd\xfd\xa3\xd5\xf4\x3d\x8f\xf1\x22\x73\xd5\x45\x4e\x42\x12\x60\xe9\x26\x53\x25\xca\xb6\xa1\x15\x7a\x16\x35\x44\xab\x2e\xa0\x21\x21\xb1\x81\x68\xbb\x73\x95\x65\xfe\xf8\x0a\x55\x2e\x4e\x7d\x19\x98\x93\x88\x86\xb8\xe2\x11\xbd\x68\xcb\x62\xe5\xc4\x91\x23\x11\x0f\xd1\x2b\x40\xb6\x32\x47\xeb\x3e\x75\x48\x3e\xf8\xaf\xbf\x82\x0c\x02\xed\xe5\xf5\xf0\x75\x56\xe5\x9b\xfe\x01\xf0\xe2\xa3\x10\x42\x12\x2b\xf5\xbe\xc8\xe1\xa5\x86\xec\x9f\x22\x6b\x14\xbc\x0e\xa8\x45\x3f\xfc\xe8\xe3\x9b\x6d\x63\x00\x67\x51\xd7\x45\xd6\x6c\x2f\x62\x51\x42\xb4\xe5\x3b\xbd\xca\x0e\xb2\x3c\x0e\x90\xab\x13\x31\x35\x4e\x62\x1d\x10\x2b\x18\x50\x65\xe6\xbd\xd7\x39\x1b\x42\xcb\x46\xff\xfc\xf0\xc0\xef\xff\x93\xb8\xad\x81\x24\x01\x13\x03\xfc\xa3\x7e\x9d\x7c\x15\x1a\xa5\x0e\xb1\x26\x8e\xae\x1a\x3c\x1d\x01\x06\x5d\x8d\xfd\xa9\xab\x70\xb9\x23\x8c\x07\x18\xa6\xaa\x5e\x89\xf4\x5c\x74\xd0\x2a\x4e\xb8\xb2\x81\xf0\xc1\x77\x13\x36\x5d\x90\x45\xd2\x20\xe0\x2e\xe9\xfa\x94\xfd\x84\xbc\x4f\xee\xcd\x24\x87\x39\x49\xc3\x10\x5b\x06\xff\x13\x8e\x70\x4a\x9c\xa4\x91\xcd\x82\xa0\x38\x93\x95\x85\x6a\x17\x59\x01\x23\x28\x64\x3b\x8e\xe1\x07\x3d\xe9\xb2\x3b\x95\x58\x39\xd5\xcc\x81\xf4\x7e\x21\xe0\xc2\x49\xca\x53\xdc\x11\x1c\x75\xf2\xb6\x69\x5d\x02\xd5\x64\xaf\xdd\x3a\x48\x55\x80\x39\x1f\x1b\x67\x39\xe7\xdb\xf1\x70\x8e\x6e\x47\x30\xc0\xd0\x7d\xb1\x1a\x1a\x4f\x22\xd2\x18\xf5\x36\x7a\x25\x6d\x11\x86\xfd\x41\x8e\x49\xb3\xf2\x04\x45\x4f\x40\xed\x0f\x4a\xab\xe1\xd0\xa1\x6d\xca\x66\xc8\xb3\xf3\x21\xec\x89\x13\xa1\x12\xac\x52\x58\xdb\xd4\x75\x27\x5a\x3a\xb4\xf9\x0d\x99\x48\xe0\x08\x12\xaa\xb3\xe2\x90\xc3\xbe\x9d\x5a\xe3\x5e\xc9\x61\x46\x96\x28\x69\xbb\xa5\xf7\x45\x39\x28\x38\x73\x02\x22\xc5\x2e\x81\xba\xcc\xf5\xf5\x6a\x77\xb1\x79\x8d\x56\x7f\x1c\x84\x96\x99\x5d\x42\x23\xcf\x6d\xbc\xb1\x7b\xf3\x9f\x32\x0e\x64\x88\xed\x74\x87\xb2\xd4\xf5\x43\xd9\xf8\xb6\x84\xf1\x9a\x8d\x43\x6d\x71\xe9\x87\x8e\xe3\xb0\xfd\x86\xf5\x64\x54\x14\xe8\xc8\x56\xab\xba\x66\x67\xac\xc0\x27\xfe\xd7\xa2\x48\x21\x61\xa5\x2c\xcb\xba\xa9\xc4\xe9\x49\x54\xcd\x3c\x9c\x8a\xc7\xad\x21\x89\x6c\x2c\x04\xf9\xa3\x0b\x00\x1f\xce\x47\x7f\x2d\xa2\x2c\x4d\x0c\x52\x24\x2e\xf2\xac\x9b\x0b\x71\x4c\x8c\xd0\x9d\x2a\x88\x97\xbf\x9e\x58\xd5\x38\x4e\x25\x7a\x03\xb7\x9d\xaa\x2e\x8f\x69\x1c\x18\xa7\x70\x8b\x2d\x88\x4b\x51\xe9\x59\x32\x66\x3f\x9e\xa6\x08\x54\xf4\xdd\x3f\x9e\x57\xd9\x1d\x66\x51\x92\xf6\x74\xa9\xcb\xfc\x2c\x27\xf7\xc0\x62\x8e\x8c\x2d\x15\x34\xe7\xaa\xb0\xea\x36\x37\x15\xb8\x44\xb6\x1b\xc4\x45\x80\x39\x84\xa2\x6c\x32\xf3\xde\xeb\x3f\xcf\xda\xdf\x98\x1b\x21\x2d\x64\x09\xf2\xdf\xd9\xda\xe3\x34\x0a\xd0\x4a\x7d\x93\x59\x5d\x7a\x04\x0a\x8f\x05\x0d\x71\x59\x5c\x09\xf5\xa2\xcb\x12\x73\xda\x83\xd6\xa2\x8f\x40\xc4\x3c\x16\x9c\x51\xda\x17\x85\xca\x62\x7d\x14\x07\x2c\xa0\x2e\xf3\xf2\x7c\x29\xf9\x32\x97\x34\x8b\x85\x14\xa9\x6d\x56\x3b\x9e\xab\x4a\x1c\x3e\xd2\x76\x71\xc3\x65\x60\x4b\xec\xcd\xe8\x79\x67\xd6\x6c\x2c\x43\x85\x11\xec\xd3\xb7\xab\xbb\xf5\x72\xbf\x59\x6d\x1f\xef\xbe\xaf\x36\xfb\xbb\xc5\xd5\xea\xce\x3f\xbb\x8c\x19\xa2\xb0\x30\x2f\xde\xd7\x2e\xba\xc3\x82\xc7\xa2\x63\xfb\x05\x3d\xe6\x7e\xe3\xb1\x0a\x02\xbc\x79\xdb\x6f\x32\x75\x00\x63\x95\xa4\x94\x78\xf1\x9d\x73\x0d\xcb\x73\x53\x1a\x83\xb1\xc4\xf8\xcb\x28\x9a\x46\x96\x82\x73\x57\x09\x8d\x05\x0e\x95\xad\x8b\x2d\xd8\xb6\x0c\x3f\x2a\x05\x9c\xb3\x77\xa2\x6e\x7a\xf1\x3d\x1e\x2b\xc1\x29\x1b\x05\x24\x18\xfd\x2d\x9a\xa6\xec\x7a\x9e\x3a\xf5\x6f\x1e\x2b\x2d\x02\xd7\xfb\x8c\xa5\xa7\xb9\xcc\x45\xac\x13\xea\xc3\xa5\x0d\x88\xfc\x38\xe7\x17\xb8\xa1\x20\x53\xdb\x9e\x6f\x9b\xcb\x47\xce\x94\x1b\x62\x12\x8d\xcc\x23\x9b\xf2\x4d\x14\x83\x54\x45\x12\x04\x11\xfa\xa8\x76\x59\x58\xbf\xb6\x6b\x7b\x70\x63\xc2\x98\xd9\x24\x3e\xe8\xec\x7c\x1c\x60\x77\x78\x12\x32\x19\xa3\x8c\xfa\xc3\xb5\xe5\x6a\x18\x31\x2e\xf3\x24\x94\x14\x5d\x9d\x1c\x0e\x50\xe8\x21\x4d\x1b\x4f\x42\xd0\x96\xcc\xb5\x8d\xef\x1e\xe0\xad\xf5\x13\x67\xf3\xba\x49\x14\x84\x98\xf4\xe9\x36\xbf\x0e\x96\xcd\x93\x88\xc4\xb6\xfc\xed\xe8\x59\xd7\xcb\xc7\x6d\x23\x0e\xe0\xbd\xad\x84\x28\xeb\xd9\x14\xf0\x76\x5d\x89\xb7\xf1\x16\xf0\x2f\x72\x81\xf9\x98\xf7\xac\x93\x38\x06\xee\xf2\x56\xb7\x56\x42\xf2\x49\x64\x1e\xb8\xc5\x93\x58\x4b\xa4\x45\x7a\x15\xe7\xbc\xd9\x57\x58\x74\x1a\x4f\xc6\x24\x09\x42\xe9\x88\xc8\x77\xcf\x15\xd4\xcf\xbd\x35\x4c\x12\x6d\xd1\x1b\xf6\x33\xdc\x95\x45\x27\x17\x31\x2b\xe5\xfe\xaf\xe8\xdf\xfe\x44\x70\xc1\xb7\xf3\x67\x77\x20\x8e\xb7\x95\x28\x7a\x0f\x28\x61\x3c\xed\x18\xd2\xe1\x0d\xbb\x5f\x3f\xda\x33\x13\x26\x6c\x4e\xde\xa6\x12\x5a\x4b\xe2\x65\xa0\x7e\xab\x44\x92\xf0\x28\x41\xdf\x40\x18\x93\xe5\x19\x66\xe8\x8e\x13\x8e\x22\x3f\x92\x08\xe4\x24\x1a\x4a\x7b\x3a\xa1\xcc\x99\xde\x8b\x76\x3c\xd0\xb4\x4b\x9a\x7d\xab\x75\x5f\xb5\xe5\x09\x57\x01\x16\x3a\x1a\xa8\x9b\xfb\xfa\x60\x59\x95\xd7\x45\x3b\xa3\xfa\x4f\x94\xaa\x18\xf1\xd9\xed\x7b\x9f\xc7\xca\xf2\x44\x18\x83\xf3\x19\x5f\xe7\xc3\xe2\x3b\xc2\xb0\xbe\x6d\xaf\xfd\x35\x24\xb3\xc5\x4a\xdf\x35\x7f\x25\x8a\x97\x36\x02\xed\xf6\x72\x3f\x4e\x06\xce\x9e\x74\x35\x91\xa1\x70\xe0\xe4\xd9\xa4\x0c\xad\xcc\x9f\x2e\xef\xc5\x69\x71\x6e\xca\x89\x61\xf5\xe3\x94\x55\x3c\x46\x5f\xd5\x54\x65\xdd\x58\x60\x9f\xff\x55\x15\x86\x18\x3a\x3a\x02\xf3\xd5\xf2\xf1\xe1\x7a\x6f\x75\x49\x7a\xa6\x59\x9e\x28\x96\xc8\xc8\x12\x9e\x62\x91\x76\x59\x6a\xb0\xe2\x65\x7e\x84\x96\xc2\x1b\x34\xf7\x4d\xce\x9d\xc0\x63\xff\xb1\x21\x60\x48\xaf\x3d\x10\xa4\x6e\xff\x28\xc1\xc1\x8c\x2e\x44\xf2\x79\x02\xa1\xe5\xca\xc5\xf7\xb7\x01\x25\xf2\xbc\x7f\x69\x00\x31\x22\x67\x6f\xb2\x1c\xdb\x7a\x97\x6d\x84\xe8\x8e\x19\x2a\x10\x8b\x08\xf3\xb3\xc9\xe8\xd8\xf0\x8e\x7f\xf3\x43\xc9\x9f\x7f\x8c\xa7\xd6\x4c\xfe\x9a\x06\x24\xd5\x56\x9e\x55\x03\x1c\x41\x0f\x3b\xb5\x38\x0d\x23\x19\x19\xff\x86\xb7\xfb\x9b\xc7\x0d\xd6\xde\xbb\xc3\xc6\x36\x97\xed\x0f\xd0\x5c\x4a\x23\xb7\xc7\x09\x3a\xf8\xcf\xe5\xb9\x86\x6d\x23\x5e\xfc\x1b\xa7\x11\x27\xe8\x62\xf5\xd5\xbd\xf9\xb9\x42\x23\x11\x22\x5a\xd2\x00\xb8\x26\xbd\xbd\xbf\x46\x4c\x24\x02\xc8\xee\xb3\xa2\x99\x48\x2f\xfc\x56\x86\x87\xc6\xc0\x68\xd0\x49\xd3\xf6\x4b\x77\x25\xaa\x62\xea\xa7\xd2\x24\xb4\x4d\xee\xed\x63\x64\xc5\x01\x77\xbc\x1b\x98\xd1\xe7\x1d\xdf\x7f\xa2\x22\xdc\xb1\xbf\x94\x27\xdc\x4c\xba\xad\x88\x26\x4a\x68\xe9\xa9\xd0\xda\x80\x05\xdd\x41\xfb\x1a\x7b\x87\x9c\x52\x1a\x09\xd7\x3f\x83\x3b\xd5\x7e\x3c\x15\x28\x63\x29\xf2\x5a\xe5\xa2\x6e\x90\x0f\x69\xff\x1a\xc6\xfe\x37\x98\xb2\x62\x6c\x73\x4a\x4c\x9f\xa7\x61\x29\x03\x81\xbe\x44\xeb\xc4\x2e\xcb\xa2\xe8\xf8\x43\x39\x65\xc6\x32\x5f\x5f\x95\xe5\x0b\x22\x96\x56\xcd\xf3\xf7\xf0\x14\xfa\x26\x06\x37\x8c\x87\x04\xc3\xdc\x27\x51\xd7\x3e\x84\x2c\x3d\x83\x79\x37\x28\x31\x51\xe8\xd9\xcd\xbe\xd5\x50\x15\x13\x1a\x31\x4e\xb9\x48\xa8\x63\x55\x47\xa5\x5b\xfc\x30\x71\x30\xfa\xa8\xfd\xff\x74\x27\xa5\x41\x84\x19\xf6\xd3\x59\xbe\x4c\x88\x4a\x38\x4d\x43\xe9\xe9\x02\xe6\x14\xa7\x38\x4d\x13\xc0\x2e\xa3\xcd\xd3\x3c\x04\x9c\x53\x91\x06\xc6\x23\x09\x46\xec\x44\xd3\x61\x16\x55\x96\xd5\x5f\x33\xf5\x52\x1a\xe3\xa4\x62\x26\xbf\x27\x59\x80\xbc\xa4\x15\x32\x8e\x3c\x56\x87\xc5\xd3\xfa\x2b\x74\x6f\x52\x25\x81\xe9\x85\x8e\xb0\x31\x6d\x40\x62\x35\x98\x2c\x3a\x88\x10\x82\xdb\x2e\xc8\x76\x6b\x6c\x57\x73\x59\x35\xe3\x8a\xcb\xe4\x4d\x69\x25\x12\x7b\x8b\xab\x9f\xa7\xbc\xac\xa6\x82\xaf\x9c\x42\x94\x20\x02\x13\x77\x89\xe5\xa8\x12\xe5\xee\x90\x05\x51\xa4\x89\x77\x4b\xee\xcb\x42\x54\xea\xf9\xfd\x56\x4c\x1d\x4f\x16\x24\x09\x42\xa3\x4f\xe2\x7d\x84\x8b\x60\x01\x18\x86\x40\xe0\xf5\xc3\xfa\xe1\x76\xff\xf4\xf8\x78\xb7\xff\xf2\x78\x77\xed\x11\xcd\x9c\x85\x84\x22\xcb\xf6\x97\xd5\xdd\xfa\xcf\xee\x8f\x09\xc7\x46\xd4\xbd\xd0\x56\xe2\xf4\xa9\x2a\xf5\x59\x0d\xc2\x89\xd1\xf7\x60\x11\x49\x30\x33\x2e\xcf\x55\xb1\x81\xa3\xc0\x76\x85\x3f\x26\x63\xb4\x20\xad\x53\xf0\x75\xfd\xe0\x37\x42\x46\x38\xb1\xca\x3d\x59\xd1\xf4\xc2\x9b\x17\x2f\x93\xc5\x71\x4c\xfc\x6a\xf4\x15\xcf\xff\x3d\xc3\x19\x06\xfd\x23\x9c\x25\x81\xe6\x1e\x6b\xf8\x25\xc3\xfa\xc0\x12\x55\x46\x7b\x2a\x01\xce\x12\x6a\xc2\x68\x50\x4e\xda\x9e\xca\xa2\x2e\x87\x9e\x2a\x4b\x64\x68\xe4\x28\xe3\x8a\xe6\xa3\xcb\xe8\xb0\x44\x87\xe8\x07\x2f\xaa\xe6\xf9\x6c\x85\xb6\x44\xa5\x7f\xd9\x32\xed\xce\xa6\x89\x41\x3e\x85\x36\xd4\xe8\xf4\x4f\x39\x63\x71\x8c\xa8\xd2\xbd\xab\xf7\x21\x04\xee\x77\x54\xa4\x38\xe3\x21\xc1\xd2\xb2\xb1\xaa\xa3\xf7\x65\xdf\xa1\xce\x19\xe7\xd6\xd4\xeb\xac\xc6\x4c\x64\xeb\x20\xf5\x45\x25\xc6\x79\x12\x3a\x40\x90\x9d\x83\x83\x89\xcf\xb8\x16\x78\x4f\x88\xf2\x73\x78\xa1\x1e\xe6\x6c\x99\xb5\xdc\xd0\x94\x5a\x9f\xcd\x81\x06\x6f\xa0\x7f\x5d\x82\x84\xc8\x20\xdc\xb7\x37\x4d\x16\xff\x6f\xb7\x39\x71\x26\x89\x4d\x0b\xeb\xac\xc6\x6e\x25\xab\x77\xeb\x7f\x49\x26\x14\x53\xf5\xb8\xa4\xbe\x6d\xd6\x93\x65\x22\x21\x14\xa6\x57\xdc\xfc\x22\xea\xe7\x6d\x76\x28\x06\x37\x34\x88\x76\x98\x0a\x98\xb6\xd2\x71\x4e\x4e\xf6\x1e\x72\x80\xed\x59\x36\xef\x27\x18\x66\xa4\x98\x32\xe0\x03\xc4\x21\xee\xb8\x7b\x37\x90\xd0\x90\x78\x46\x73\x4b\xb1\x82\x84\x41\x93\xdb\x03\x2e\x91\xf2\x21\x53\xe5\xa6\x3c\x17\x9a\xfa\xc7\x32\x29\xe1\x9e\xe8\x36\xcf\xd7\x0d\x1c\x5d\x2e\x6e\x3a\x2d\xfa\x4f\xc7\x83\x58\x62\x9d\xe5\x7a\xeb\x4b\x6c\x3c\x48\xb9\x27\xf2\x18\xf8\x93\x56\xc5\x68\x74\x27\x3c\x30\x56\xc7\x46\x23\x19\xe3\xae\x02\x51\x7b\xd9\x6c\x7f\xb1\x90\x18\xa3\x3d\xf9\xc0\xf7\xf5\xd3\xdd\x80\x54\xda\x3f\x38\x0f\x25\x51\x01\xe6\xa8\xb1\xe9\xf7\x56\xd4\x38\xf7\xac\x9b\x38\xb1\xd6\x3c\x0a\x13\x60\xc3\x96\xd0\xd5\x4f\x05\x75\x3d\xd2\xbf\xe4\x3c\x12\x4a\xf1\x4e\xd0\xcf\xe6\x71\x1f\x8d\x85\xeb\xce\xae\x0e\x1e\x01\x60\x34\xd2\x31\x47\xcd\x99\x18\x1e\x81\x49\xdb\x97\xd3\x5a\xd7\xc7\x13\x5c\x78\x2a\x9c\x04\x1a\x7b\x35\x56\xcb\xea\xfd\xd4\x8c\xb0\x1d\x9c\x10\xab\xae\xb0\xb7\xd8\x4d\xa4\x5e\x5d\xd7\x37\x65\xb5\x99\xd2\x1f\xb4\x63\x4d\xe2\x3e\xe6\x2e\x83\xaa\xee\x40\xdd\xbc\x5b\x03\xff\xfe\x8d\x7f\xf1\x2e\x7a\xe3\x44\x13\xb4\xd6\x42\xeb\x7b\x71\x3a\x65\xc5\xe1\xa6\xac\x6c\x77\xf1\xfa\xfa\x73\x75\x4f\xce\xe3\x38\x15\xdd\xde\xe6\xd9\xd0\x60\x52\x00\x9d\x9c\x93\x44\xd2\xd7\xf7\xaf\xb2\xaa\x79\x5e\x9e\xa7\x0f\x99\x30\xad\x9c\x55\x71\x49\x95\xfb\x0e\xf0\xcb\xdb\x10\x24\x19\xba\xa9\x0e\x52\xe2\x8f\x42\x1a\x79\x66\xfa\x21\x71\x27\xe7\x34\x30\x71\x38\x6a\xf6\x58\x3e\x97\x99\xfa\x20\xa3\xc1\x69\x92\xc6\xba\x17\x2b\x73\x3e\xc2\x58\x47\xae\x1b\xaa\x02\x18\xb4\x6f\xe9\x28\xbe\x2f\x8b\xe6\xb9\xee\x7e\x1a\x94\x47\x5b\xf8\xe5\xf0\x54\x95\x52\xa0\xc6\xd8\xfb\xae\xb5\x08\x23\x43\xc5\xb9\x11\x76\x4b\x14\x45\x2f\x1b\xf4\xd4\x55\x0c\x38\x37\x4a\x79\xd2\x4b\x0c\xfd\x86\x98\x27\x37\x26\x8d\x05\xa2\xdd\x7f\xdc\xcf\x82\x69\xfc\x28\x1a\x62\xac\x61\xa3\xed\xaf\x59\x71\xd0\xe5\x71\x12\xfe\xce\x7b\xa3\x3c\x4d\x29\x86\xcf\xf7\x50\xd7\xe2\x00\x4b\x91\xe7\x43\xa2\x1e\x9b\xcd\xff\xa0\x7c\xf4\x8f\xcb\x2c\xf8\xe5\x27\x48\xc1\x56\x09\x6c\xe6\xcd\x81\x2b\xaf\xde\x83\x55\xff\x51\x25\x65\x49\x27\xf7\xf0\xb3\x83\x06\x6f\x4f\xe5\xf4\x75\x48\xc6\x30\x99\x85\x7a\xbb\x16\x43\x85\xc2\x30\x97\x82\x34\xed\x58\xe5\x8b\x2e\x96\x5f\xa4\x9e\x35\x74\xd2\x30\xf4\xd2\x50\xcd\x18\x49\x2c\xea\xa9\xf5\xe6\x2a\x09\xd1\x8b\xcc\x1c\x77\xd6\x5e\x62\x30\xe1\x8f\x2a\x2a\x1c\xfe\x70\x09\x55\x93\x99\x4c\x89\x0b\x65\x56\xce\x81\x52\xc4\xc8\x81\x83\x36\x6c\x45\x0e\xf3\x04\x65\x9c\x1b\x4d\xa0\xcf\x42\xaf\x55\xb9\x99\x36\x86\x70\x6e\x20\x34\xa2\x43\x92\x23\xeb\xf9\x18\x2f\x90\x06\x94\xe0\xa3\xd9\xea\xb4\xb8\x24\x08\xf6\xe3\x4c\x84\x0a\xa9\xb7\x50\x2c\x9f\xb3\xd3\xd5\xfb\x0f\x40\xfc\xe8\xec\xe7\xf5\x2f\x25\x0d\x45\x94\xba\x05\xde\x11\xdf\xfc\xaa\xca\xfc\x41\x67\x14\x4f\xa3\x28\x48\x9c\xb6\xc5\xb7\x7b\x27\x99\xe6\x1f\x23\x22\x21\x62\xd7\x8f\xad\x8b\x58\x56\x9e\xc0\xec\xf3\xf2\x7f\x1a\xd1\x94\xf8\x49\x55\xce\x92\xa0\xf0\x34\x52\x06\x0d\xba\x55\xe1\xdb\xf4\x1c\xbc\x3c\x25\x61\x47\x67\xf3\xf8\xb0\xf3\x05\x89\xcb\xcf\x90\x12\x01\x96\xf8\xa0\xd9\x95\x4f\x4d\x57\xa5\x49\x63\x08\xc1\x5d\x60\x60\x54\x67\x2e\x90\x90\x00\xe3\xdf\x02\xde\xae\x45\xb9\x39\xe7\x50\x4f\x9b\x4b\x7e\xdd\xbe\x34\xc8\x3f\x7c\xf0\x3e\x92\x98\x19\xcb\xdf\x78\xcc\x8a\x2d\x34\xbb\x9f\x37\x00\xeb\xe2\x35\x6b\xe0\x32\x9c\x48\x93\x24\xc0\x10\xf3\xea\x7e\x8d\x41\xd8\xac\xf1\x48\x69\x90\x60\xbd\xe7\x7a\xb5\xb8\x5b\x6d\x7e\x78\x1a\x9b\xd6\x1e\xd9\x46\xcd\x73\x71\x25\x26\xeb\x20\x4d\xa3\x18\x8d\x15\xa6\x6e\x6c\x5a\xfb\xa6\xc4\xe9\x79\x7d\x6e\x0d\xd6\x7a\xf9\xe8\x81\xdb\x69\xca\x42\x0c\x62\x4d\x59\xb5\xfb\x83\xad\xb1\x8c\xef\x34\x35\x02\x93\x3d\xcf\xa5\xce\xa1\x42\x87\x1e\xe3\x7d\x72\xef\x2f\x22\x48\x24\x64\x2f\x8e\xbe\x13\xd5\x01\x66\x14\x02\x78\xda\xfa\x15\xd4\x85\x9e\x73\xd9\xef\x54\x26\x81\x72\x18\x47\x9d\xcd\xd0\x15\x75\x6b\x43\x32\xed\x84\x29\xde\x97\xe5\xf1\x58\x16\xbb\xdd\x8f\xab\xf7\xd5\xee\xcb\x7c\xf4\x94\xca\x94\x63\xf6\x3c\x77\xe4\x66\xe3\xee\x8d\x54\x0a\x63\x7c\xdd\x0b\x8a\xdb\x3e\xc1\x96\x2a\x10\x69\xda\x55\xd4\x7a\xb8\x74\xaa\x69\x80\x0e\x29\x82\x14\xa6\xfc\x3d\xa3\xa9\x72\xe1\x67\x4f\x34\xe1\x79\xaa\x95\xa5\xbd\x3f\x0e\x79\x28\x66\x61\x95\x29\xc4\x84\x86\xce\x37\x3b\x0c\xee\x13\x92\x88\xdb\xf2\x00\xe6\x37\x97\x43\x84\xd9\x4d\x55\x1e\xad\xfe\xf6\x07\x31\xce\x87\x56\x03\x14\xb5\x6a\x7b\x6d\x70\xdc\x49\x38\xce\xcf\x55\x13\x29\x14\x75\x35\x83\x3a\x5d\x6a\x92\x10\xe1\xba\x4e\x08\xb9\x2a\x8f\xe5\x46\x48\x79\x89\x49\xf2\xe3\xb9\xc1\x50\xb9\x75\x24\x6f\xa1\x19\x68\x5d\xfb\x01\x42\xb8\x18\xa8\xe7\xa9\x34\x50\x8d\x38\xe3\xe7\x52\xb2\xa9\x91\x09\x22\x08\xa1\x79\x3e\x17\x27\x71\xee\x4a\x53\xa9\x51\x56\x6e\xbf\x6e\x7d\x98\xd7\x4c\xc1\xf5\xb9\x38\x00\xaa\x73\x8c\xde\x86\x08\x25\x58\xec\xc2\xb1\xf5\x5b\x76\xa5\x45\xd3\x8f\x52\x3e\x22\x84\xd0\x35\xf9\x15\x1a\x99\xcf\x0b\x91\xe7\xef\xf3\xfb\x82\x88\xda\x38\xc0\xed\xa0\x22\xcf\xb7\xcd\x50\x29\x71\x3a\x54\x05\x36\x4d\x51\x65\x2f\x50\xd5\x1e\x9e\xf0\x87\x3f\x0e\xb6\x20\x2a\xb4\xb6\x82\xbb\x50\x6d\xe0\xbf\x8b\xe5\xf2\xf7\x92\x66\x22\x4e\x54\x1c\xfb\xb0\xee\x5e\x34\xe7\x2a\x6b\xde\x9f\xa0\xca\x4a\x6f\xb1\x45\xcc\x35\xeb\x25\xd2\xb7\x0d\x9c\x3c\x58\xd3\x0f\x10\x0a\x4b\xbb\xc7\xf3\x3c\xbb\x34\x17\xb1\x62\x98\xae\x7e\xc9\xd4\x0b\x66\x2d\x9b\x06\x10\x76\xf4\xc7\xe4\x6e\xb4\x46\xcf\x0d\x45\x25\xae\x44\xa3\x9e\x61\x9e\x0c\x91\x8b\x18\x6c\x02\x6a\x25\xaa\xfc\xdd\x57\x1d\x17\x47\xab\x7a\x3f\xfe\xf5\x04\xa8\xcd\x06\xf9\xed\xe2\x5c\xe8\x45\xa1\x57\x85\xbe\xed\x6b\x84\x82\x92\x44\xba\x2a\xcc\x0f\xc8\x2e\xf7\x13\x41\xb5\xad\x26\x23\xf7\xbd\x2d\xe7\xd8\xb0\xdd\x1d\x67\x21\x20\x99\x3e\xfa\x30\x5e\x1d\xaa\x5d\x86\xc3\x12\x80\x60\x04\xd4\x50\x25\x13\xe9\x65\xfc\xb1\x98\x44\xa6\xcb\xea\xaf\x55\x39\xe5\x13\xf6\xe3\x68\x8c\xb8\x8f\x2b\x4f\xb0\xc1\x05\x0f\x38\xba\x9b\xe2\x55\x34\xe2\xd7\x90\xf5\x81\xf1\x15\x3c\xb4\xd4\x0b\x48\x20\x82\x84\x05\x23\x77\x5b\x70\x12\x48\xe7\x0f\x4d\xde\x08\x27\x04\x7b\xf1\x90\x94\xed\xea\x5c\x79\xe2\x01\x2e\xd2\xc0\x2a\x64\x3e\x8b\x42\x63\xf7\x4a\x2d\xa6\x15\xf8\xf1\xa5\x52\xe8\x50\xe7\x7e\x1e\xb7\xe6\xeb\xeb\x5f\xcb\xc9\xb3\x0b\x23\x71\x8a\xb4\x61\xc7\x97\xbe\xfe\x20\x14\x0b\xf0\xed\x3b\xa5\x6a\x68\x5f\x5c\xd1\x5c\xbd\x5b\x65\x98\x4f\xca\xe0\x42\x47\x0c\x68\xe7\x48\x3f\x55\xdd\x07\xd5\xa9\x6d\x5e\x5a\x17\xad\xd3\xfe\xda\xc1\x59\x36\x76\x76\x5e\x4a\x63\x70\xa1\x41\x27\xce\x77\xbb\x76\x49\xa1\x81\xd7\x3b\xdd\xce\x04\x70\x86\x7c\x84\x96\xb4\xff\x1e\x0e\x42\x96\xd3\x97\x0c\x26\xc1\x0c\xc7\xa9\x82\xf6\xe3\xec\x3c\xe5\x40\x7b\xc4\x0a\xef\x64\xb5\x55\x01\xf5\x7f\x37\x61\x82\x14\x05\xc6\x29\x50\x3f\x89\xf7\x1e\xeb\x24\x4c\x4c\x9d\x00\x71\xb1\x28\xde\xcb\x02\xe5\xa0\xdd\x41\x19\xf0\x30\xea\xc0\x03\x75\x9f\x6f\xf4\x87\x81\x72\x17\xaa\x2d\x57\x3e\xbd\x26\x43\x6e\x63\xd6\xb2\x00\x8c\xec\xba\xbf\xa7\x06\x7d\x9d\xac\x1c\x72\xdf\x72\x19\xb6\x6b\xcd\x0b\x88\x3e\x0d\x5b\xcd\xb9\x8c\x42\x63\x61\x9c\x3e\x41\x98\x61\x7e\xb0\xba\x71\xf8\x82\x6e\x1c\x65\xac\x4b\xdf\xae\x8a\x76\xb3\x18\x64\xe6\x64\xa4\x94\x74\x71\xfb\xb6\xa9\x86\x6a\xfd\xd3\x6d\x76\x38\x15\x24\x89\x02\xac\xf2\xe2\xed\xde\x65\xff\x3d\x67\x3a\x6b\xde\xdd\xdb\xfd\xad\x12\x8d\x24\xb1\x75\x8a\x30\x80\x9f\x54\x98\x25\x49\x14\x6b\x6f\xeb\x6a\xf1\xb0\x78\x58\xf8\x9b\x25\x29\x48\xe7\xd1\xae\xf4\xb2\xac\x60\x1e\xbe\x26\xe3\x90\x08\x3d\xe2\xd7\x1d\x92\x19\x4d\xf7\xf6\xb0\x07\xf2\x0d\x97\xbb\x8c\x89\x0a\x03\x57\xf9\x3c\xd7\xa0\x27\x8c\xb0\x5c\xc6\xca\x32\x59\xd8\xc7\x1e\xa7\x5e\xc7\xcf\x1a\x83\xc4\xdc\x8c\x4f\x36\xf8\x7c\xf0\xf8\xb6\x93\xc8\xaa\x94\x79\x68\x58\xfd\x41\x5e\x5f\x26\x54\xa2\x03\x7b\xee\x2a\xce\x9d\xaa\xc5\xd8\x24\xc9\x44\x0b\xc4\xd5\x38\xfe\xd4\xa6\xe9\x20\x20\x92\x0a\x2b\xac\xb7\xd8\x7a\x55\x46\x2e\x59\x60\x29\xd8\xf6\x58\xfa\x28\x5a\x03\xbe\x36\x0f\x00\xba\x9f\x4f\x4c\x11\x84\xac\xdf\xaf\x77\xc3\xe9\xc8\x80\x2b\xdf\xde\x7b\x2f\x5e\xa0\xb7\xb8\x92\x47\x51\x34\x65\xa6\x5a\x3f\xcd\xf5\xc4\xca\x34\x4c\x10\x1e\x71\xbf\x7e\x78\xdc\xec\xbf\xaf\x36\xdb\xf5\xa3\x77\xe9\xa5\x64\x04\x4c\xef\xfa\x5c\x65\x4d\x7d\x23\xb2\x1c\xd3\xef\x8f\x8f\x57\xfd\x30\x6d\xf3\xf9\x45\xd6\x6c\x44\x05\xb7\x55\xf9\xd6\x2f\x35\x15\xc5\x49\xeb\x1e\xdd\x9d\xff\x27\x13\xff\x3c\x67\xa3\xf5\xa6\xe2\x28\x15\xdd\x06\x7e\xed\x08\xa1\x9f\x44\xf3\xfc\x26\x3e\x70\x51\xa4\xa2\x56\x63\xc6\x06\xc1\x7d\x4e\x41\xea\x30\xb6\xb7\x8b\xd2\xc6\xc5\xeb\xa8\xfc\x2a\x75\x68\xf9\x98\xbe\xaf\x36\xeb\xfb\xd5\x64\x22\x68\xc2\xb0\xbe\xff\x58\x3f\x43\xe5\x70\x38\xeb\xe5\xe3\x30\x67\x2e\xb5\x34\x72\xa8\x6c\xfd\xad\xa8\x4b\xc7\xd4\x5a\x77\x63\x94\x8d\x16\x36\x88\x69\xbb\x7e\xdc\xcd\xe5\x98\xa5\x21\x84\xf3\xee\x46\x37\xcb\x85\xcf\x3f\xf9\xcb\x18\x23\xb0\xc5\xbb\xc9\xa0\x0a\x7b\xa0\xb2\x0a\x42\x91\x24\x7d\x63\xea\xfc\x0b\x52\x01\x17\x68\x2a\xf6\x59\xfd\x88\xfa\x36\x22\x5f\x9c\x4e\x93\x40\x58\x05\xd2\xf2\xc8\x4a\xa4\x90\x6c\x1d\x8f\x11\x65\x16\x57\x81\x92\x52\x7a\x7d\x79\xf5\x02\xfa\xff\xe3\xed\x5f\xba\x1b\xd7\x91\x2d\x71\xfc\xbb\xf4\xe8\x0c\xee\x80\x04\x1f\x20\x7a\x26\xd9\x72\xa6\xfa\xf8\x75\x2d\x39\xf3\x56\xf5\xba\x4b\x2b\x00\x04\x2c\x96\x29\x52\x4d\x52\xce\x74\x7d\xfa\xff\x62\x00\xa0\x48\x8a\xf2\x39\xf7\x3f\xf8\x4d\x2a\xeb\x98\x20\xc5\x07\x10\x88\xc7\x8e\xbd\x1d\xa8\xb9\x07\xa0\xbc\x36\x13\x77\x46\x85\x10\x13\xe0\x31\x2f\x4d\xb5\x90\x9d\x4b\x76\xf4\xa2\x63\x99\x62\x61\x42\xae\x81\x8b\xc9\x96\x9f\x84\xb5\x99\xdc\x15\x43\x9d\xf4\x4e\xdf\xa2\x69\xf2\xb7\xb2\x33\x9e\xce\xeb\xee\x2f\x65\x30\x3d\x4b\x76\xd9\xfb\x1e\xd8\x58\x15\xa5\x89\xb1\x58\xbc\x5f\x1a\x3e\xfb\xbf\x66\x16\x1d\xff\x82\x6f\xcb\xa1\x12\xc2\x6c\x51\x52\x45\x52\xb0\xf4\xdc\x5b\x5e\xc3\x5b\x75\x0b\xd5\xe4\x76\x93\x30\xf2\x09\x91\xd7\x06\xeb\x5b\x4b\x8f\x30\x8b\xc0\x50\x29\x57\x30\xe4\x5d\xa3\x90\x55\x5e\x52\x31\x64\x8a\x87\x82\xfa\x8f\x1f\xa0\x7c\x03\xb5\xbf\xe0\x2e\xf8\x5b\xfe\xb3\xe2\x4c\xd2\x6e\xba\x5d\x2d\x1e\x76\x2f\xab\xcd\xea\xe5\xc7\x6a\x77\xd7\x37\x19\x2a\x1e\x0b\xb4\x62\xd9\xb8\x7d\xc3\xc9\xc7\xe7\x49\xea\x9a\x43\xda\x1f\x58\xe7\x26\x9f\xe2\xe3\x14\x17\xa9\xe7\xa2\xec\xb6\xe9\xbc\x7c\x7b\x80\x2b\x2e\x14\x05\x49\x76\x1b\x51\x35\x6d\x3e\xd3\xc9\x28\x64\x48\x18\x8c\x66\x5f\x9d\x0a\x4d\xbf\xf8\xb9\xc1\xb7\xc3\x8c\x8c\xc6\xff\x9d\x6e\x1e\x2e\x20\x75\xf4\x85\x99\x12\x9a\x93\x6f\xd4\xed\xcd\xf7\x55\xf5\x7e\x3a\x4e\x66\x29\xa4\x71\xe2\x7c\xd9\x81\xce\xd6\x7f\xcc\x41\x87\x14\x68\xa0\x52\x6a\xe5\xba\x3c\x76\xff\xef\x84\xe7\x0a\xf7\xa8\xbf\xbd\x4f\xcd\x2b\x99\x06\xb4\x72\x2c\xc5\x61\xb7\xd7\x8e\x91\x58\x16\x0f\x73\x2e\xdb\x28\xc9\x35\xd1\xf8\xfd\x59\x93\xd4\x92\x0f\xa1\x94\xcc\x52\x4a\x74\x78\xf0\x9a\x17\x19\x3f\x1f\x07\x9e\x0c\xca\x78\x97\x19\x32\x3f\x50\x64\x89\x93\x6d\x2d\xbc\x95\xf5\x17\x51\x89\xd2\x23\xbf\x06\xff\x91\x63\x31\x5d\xda\x4a\x28\xe5\x2a\xa8\xab\x62\xd4\xf4\xe4\x07\x00\x52\xb8\x87\xbf\x5b\x8a\x74\x88\x2b\xad\x97\x94\xca\x94\x0e\x2c\x0f\xb7\x8f\x8f\x2d\x66\x8b\x1a\x0a\x1b\x57\x0a\x98\xbf\x77\x9d\x26\x68\x7d\x32\xe2\x94\xff\x8a\x61\x34\x53\x5a\x6b\x2b\x4d\xd2\x45\x42\x84\x83\xd8\xd0\x94\x5a\x62\xb4\xf3\x6d\x27\xd4\x08\xf2\x19\x05\x41\xe0\x59\x2c\x14\x86\x96\xd7\x96\xba\xb1\xff\x0f\xa8\xf7\x63\x35\x7d\x3e\x64\x86\x96\x4b\x91\x1b\x6c\xf3\x03\xba\xfb\xe8\xbf\x05\x46\x01\x09\x12\xc8\xa2\x52\xef\xcd\x5d\x45\xa8\xcd\xf1\xcd\x21\x00\x31\x45\x53\x52\xc5\x4f\x89\xf9\xfc\x7a\x7f\x06\x52\xdd\xba\x85\x0f\xac\xcb\x09\x50\x40\x99\x98\x33\xf7\x4d\x1c\xd4\xae\x19\xf5\x82\x2b\x93\x72\xdb\xe9\x7d\xfa\x24\xae\xf7\xcd\xb1\xe7\x8c\xca\x94\x91\x41\xe4\xce\xb6\x65\xa3\xe5\x9c\x2d\x32\x3a\x26\x2a\xc1\xd7\x47\x22\xac\xeb\x8c\x89\xbb\x80\x0e\x50\x05\x0e\xee\x74\x52\x16\x49\x31\x07\xfe\x1d\x3f\x92\x0e\x39\xd3\xa9\x2f\xc5\xbf\x63\xb9\x2e\x4d\xf5\x58\x9d\x6b\x7d\x3a\x74\x80\x3c\xd0\xfa\x75\x5d\xb6\x16\xd8\x3d\x9b\x7a\xd2\xa1\x32\x56\x7c\xaa\xef\x9a\xbc\xab\x6a\x27\x14\xe7\x2f\x17\x69\x99\xb1\x3e\x72\x25\xad\x4a\xf8\x3d\x50\xe9\xcf\x74\xcc\x0d\x09\x30\xd7\x48\xd2\xb0\x96\xc4\x79\xf4\x16\x74\x2c\x23\xda\x52\x5d\x95\x7e\x51\xea\x1b\x28\x8a\xe7\x1a\xa9\x92\xec\xd6\xf7\xbc\x9e\xed\xbc\x33\xae\x93\xc0\x82\x2d\x68\xa2\xe6\x65\x83\x75\xbb\x33\x79\xa9\x1f\xab\xef\x79\x69\x25\x59\x70\x0b\x79\xf1\xc7\xe4\x2c\x8b\x7b\x2d\xf1\x77\xbb\x04\xf5\xfe\x93\x44\x4c\x17\xfa\x5f\x27\x8b\x5f\xb1\xbc\xc2\x7e\x30\xb3\xc4\xda\x16\x51\x7a\x8d\xbb\xd3\x0d\x4e\x43\x91\xf5\xa6\xe4\xf3\xd8\x56\x8b\xb7\x8b\x35\xae\xd3\x4c\xc8\x70\x24\xba\x4c\x2b\x7c\x7c\xa5\x2c\x0e\xe8\xc9\x08\x3d\xb6\x3a\x60\xfd\x86\xa5\xa2\xbe\x97\xbc\x3c\xbf\xf4\x2c\xc5\xc8\x72\x57\x14\x43\xa5\xb2\x4c\x67\x59\x46\x80\xa8\xaa\x29\xf2\xf7\x7c\xa0\xb9\xe7\x8f\x2b\x63\xf9\xef\x8f\xc7\x21\x0e\x44\x8b\x98\x51\xa8\xb2\xad\xe1\x03\x0b\xac\x07\xaa\xc1\x99\x16\x2a\xa0\xf6\x1a\x97\x7e\x74\xb2\xd7\xff\x03\x8a\x00\x2d\x50\xaa\x5e\x92\xf3\x00\x6d\x35\xc4\x02\xe8\xce\xb7\x67\x36\xd3\x68\x7f\x00\x88\x92\x62\xf2\xfa\x64\x0a\x46\x9c\xf5\x19\x5a\xdc\xf5\xe8\x32\xad\x52\x2b\x76\xf1\x81\xfb\x5c\x15\xd8\x2c\x3f\x6f\xf2\x76\x82\xb5\xd2\x8a\x63\x28\x7a\xb9\xf2\xaa\x54\x04\x94\xcd\xab\xf2\x82\x44\x2c\xd3\x3a\x8d\x09\x2d\xa5\xe1\x47\x5e\xaa\x7c\x9c\x5e\xd6\x3a\xb5\x00\xfb\x7e\xf1\xdf\x62\x0b\x79\x31\xd9\x97\xb5\x86\x88\x52\x59\x3f\x9e\xb6\xeb\xc7\x6f\x96\xae\x72\xb7\xec\x2c\xc1\xe3\x4b\x7f\x29\xe0\x96\x84\xcc\xa2\xbf\x7c\x99\x7f\x8c\x4c\xf7\x79\x05\xad\x8d\xd5\xb1\x7c\x78\x98\x52\x27\x67\xda\x24\x9a\x3c\xfb\xe5\xd3\xe6\xfb\x7a\x10\xeb\x60\x60\x6c\x31\xae\xdb\xd2\xbb\xdb\xf5\x7f\x0f\xc3\x84\x6a\x05\xdb\x3a\x3f\x2e\xf3\xa1\x3a\x44\x86\x61\x64\xdd\x9f\x9e\xc5\x2a\xc3\xd0\x60\x64\xfc\xfb\x77\xea\xdf\x4f\xe6\x06\x0e\x47\xc8\xdf\xca\xf1\xbb\x46\x16\xda\x4e\xfb\x9d\xdd\xc5\x7b\x50\xe4\x3c\x86\x0d\x99\x51\x60\x15\x41\xbe\xd6\xed\xf8\xea\xdf\xa1\xbb\x88\x11\x0b\x78\x3c\x6c\x3a\xb9\x50\x20\x75\x03\x63\xc1\x03\xdb\xed\xdf\x52\x17\xe0\xea\xf7\xb1\x22\x19\xf8\xf1\xb7\xc4\x18\xac\x2c\xd8\x71\x60\xec\x2f\xea\x63\x98\x24\x3c\x98\x71\x78\x46\x3e\xd2\xff\x0d\xff\xdb\x8f\x4e\x53\xd2\x39\x91\xd8\xae\xcb\xe3\xa9\xdd\x56\xcb\x4f\xaf\x01\xe8\x60\x84\x57\xfe\xe9\x2f\x20\x20\x3b\xcb\x21\xfd\xd1\xff\x19\x28\xaf\x7d\xb7\x78\xee\x22\x13\xb7\xd7\x86\xfd\x61\x93\xc4\x16\x8a\xa5\xa0\x84\xd1\x67\x4f\x59\x4a\x9e\x24\xed\xe4\xb7\xf9\xc7\x04\x49\x82\xa9\x64\xf4\x83\x45\x45\x54\xc3\x84\x3f\x9e\x6a\x77\x74\xa3\x20\xfe\xff\xba\xa5\xd1\xbf\xd3\x54\x71\x82\x5f\xe5\x87\xbc\xf4\xa8\x95\xd1\xcd\xf1\x20\x45\x36\x10\xf1\x1f\x12\x58\x67\xc8\x43\x4b\x68\xff\x50\x51\xd7\xf6\xe3\x82\x68\x53\xfb\xa3\x59\x46\x1d\xd2\x2f\xab\xfb\xd5\x62\xb3\xda\xad\x9e\x9f\x6e\xbe\xf7\x07\x15\x78\xcd\xa5\x87\xe6\xed\xf6\x9c\xcb\x47\x8e\x89\xe5\x38\x21\x92\xa6\xc7\xd7\x07\xcb\x43\xe5\x7b\xc9\x31\x53\x16\x0b\x55\x9d\xda\x86\x78\x4c\x6f\x6c\x31\xe4\x71\xc0\x66\xe3\x87\x6a\x8b\x3e\xd8\xee\x6d\xd6\x75\xd5\x5f\xc3\x58\xc9\xb8\x43\xde\x34\x68\x63\x00\x57\x55\xdf\x14\xbe\xdf\xf7\x6a\x72\x0b\x85\x51\x99\x67\x12\x78\x03\x6f\xe7\x10\x02\x45\x9b\x51\x67\x4d\x0e\xf0\x3e\x42\x33\x21\x84\x86\xc4\x55\xbd\x26\x58\xdb\x59\xdc\xb9\xd8\x62\xe6\xbf\xfd\x25\x62\xdb\x03\xa3\x8a\xaa\xc1\x1b\x7d\xfc\x8b\xbb\x04\x99\x10\xc1\x9f\xc5\xa6\x7a\x47\xf3\xe4\x02\x82\xc1\x2f\xf4\x66\x48\xf2\xd8\xe6\xe5\x62\x36\xba\x77\xc5\xd0\xa6\xc2\x5e\x97\xab\xff\xea\xff\x98\x70\x3c\xb7\xd4\xb9\x6f\x30\xb1\x6b\x3a\x65\x44\xee\x6b\x03\x3e\x3d\xba\xa8\x46\x4e\xee\x66\xf7\xa6\xea\x66\xf1\x81\x35\x50\x01\xfc\x62\x2b\x43\x6d\xd2\xc4\xe2\x07\xda\x45\xa9\x5f\xc8\x03\xbc\xc3\x6e\xdb\xba\xab\x61\x44\x22\xe1\x4e\xc0\x40\xa5\x43\x0a\xaa\xe5\xe7\xe6\x24\xcf\x7c\x6d\xb3\xae\xd3\x24\x07\x8a\xc8\x34\x64\x7e\xfb\x3b\x3a\x35\x86\xf5\xcb\x63\x37\xcb\xec\x2c\x1f\xff\xa6\xc9\x24\xa5\x23\xac\xd4\x3b\xb3\xc8\xcf\x61\x52\x08\x8d\xe6\x60\xbc\x07\x4d\xfa\x99\x75\xcf\x6f\x99\x99\x80\x73\xa2\xfc\xe9\x76\xf5\xed\x1e\xda\x17\xfc\xc0\xba\xf7\xf8\x4d\x20\x52\xc2\x58\x7e\xe4\x0d\x10\x2d\x79\x5e\xbe\x79\x07\x7c\x74\x23\x26\x10\x96\xcd\xc4\xf1\x3e\xae\x3e\xf2\xe2\xa1\xba\xda\x53\x69\x02\xcd\xa9\xe2\x40\xed\x92\x77\x50\x1f\xfa\xb8\xdc\xb0\x50\x93\xcb\xbf\x85\x37\xd0\xb0\x6d\xaa\xbc\xa4\xff\x19\xec\x96\x86\x65\x51\x32\x24\xa4\xea\x1c\xc5\xf9\xbd\xc3\xb0\x2c\x83\x73\xe7\xfb\xe4\xae\x23\x10\xe8\x80\x57\xf7\xd0\xb4\x2f\x55\x51\x3c\x9d\xda\xe3\x69\xe2\x15\x9a\x08\x6d\x1d\xd3\xf2\x19\xc3\x01\xdb\x6e\x7b\xb1\x4a\x13\xa3\xb9\x67\xe2\x90\x13\xb9\x0d\x15\x3b\x9f\x07\xcd\x78\x26\xe6\x19\x5a\x8d\xb2\xd6\x26\x63\x9f\x0b\x68\x4d\x55\x1f\xee\x0a\x78\x1b\x80\x53\x4d\x2c\x6c\x3f\x69\x79\x3a\x3c\x99\x25\x14\x45\x55\x95\xcd\xf6\xf3\xd8\x03\x4f\x4d\xa2\x22\xf2\xb2\xee\x1f\x6f\xbe\x5f\x74\xbe\x85\xec\x02\xb4\xd4\xff\x7d\xe0\xb1\xfc\xff\xf9\x9f\xfe\x0e\x74\x46\xa1\x20\xe5\xf7\x76\xea\x2c\xb0\x95\x99\x2c\x88\x8c\x9b\xc2\xaf\x65\xde\xfe\x1f\xd0\xb8\x69\x11\x3a\x67\xd1\xb1\x3c\xe7\x7f\x83\xd6\x69\xf0\x3e\x32\x6e\x45\x0f\x7a\xe1\xd4\xf9\x32\xb6\xc9\xb2\x80\xca\x5e\xbe\x09\xe6\x01\x9a\xa7\x12\x09\xc2\x36\x83\x69\x38\xe3\x01\x26\x13\x26\x73\x0c\x54\x8e\xe8\xda\xe6\x33\xc6\xbf\x24\x32\xed\xf9\xd2\x1d\x5e\xef\x6e\x28\xdb\x98\x19\x29\xb5\x76\x1d\x03\xdf\x9e\x37\x53\x8a\x16\xa3\x20\x4a\xb0\x2f\x53\x7c\x9f\x33\xfd\x7f\xf1\x7e\xdc\x85\x74\x24\x08\xe9\xff\x8d\xda\xbe\x36\xfb\x9e\xe0\xcf\xe8\xd4\xca\xac\x9d\xca\x86\x1a\x69\x66\x8a\x11\x46\xab\x8c\xba\xf2\x7a\x1e\x35\x0b\xc4\xef\xbf\xa4\xd6\x92\x2a\xe5\x76\xf3\xb8\xc7\x43\x45\x8b\xf0\x5c\x99\xda\x56\x67\xc5\xb8\xcc\x68\x93\x92\xe2\xd4\xbe\x2a\xf4\x10\x6d\xf7\xe5\x7e\x61\x90\x05\x9e\xf1\x75\x43\xad\xe8\x4b\x6c\xd7\x2d\xba\x46\xca\xc9\x58\x60\x54\xcc\x70\x58\xec\xaf\xc3\x70\x83\x3a\x32\xc3\x6c\xf6\x0d\x34\xfb\x4b\xae\x3f\x63\xb2\x80\x32\x08\x4d\xdf\x51\x7e\x53\x40\xd3\xf8\x2d\xeb\xea\xc4\x14\x41\x10\x58\xed\xd2\x2e\x54\xa5\xca\xbc\xfb\x7b\x18\x08\x73\x4e\xf9\x6f\xaa\x03\xde\xfc\xbc\x69\xae\xfa\xb7\x22\x08\x33\x61\x51\x1c\xa8\xf6\x8b\xa2\xf8\x51\xb5\x8e\x2b\xae\x0b\xbf\x5b\x78\xc3\xe5\xa7\xd5\x2e\x1f\x9f\xc6\x54\x44\xf9\x26\x89\xed\x58\x2d\x46\x04\x4c\x87\x94\xc9\xdf\x91\x93\x78\xd3\x59\xd9\xb6\x0b\xe4\x2f\x32\xc2\xe7\xf9\x20\x82\x2e\x98\x4e\xfb\xfa\xe3\x59\xe2\x67\x38\xf9\x45\x10\x05\x48\x61\x00\x09\xb9\x8c\x78\xb7\x06\xaf\x26\x06\x86\x0e\x5c\xe3\xc2\x68\xfb\xe6\x2d\xcb\xfa\x48\x08\x53\x04\x29\x24\xe0\x13\x05\xb7\x04\x7f\xa6\xd6\xc4\xfe\xb0\x04\x6a\x69\xfa\xb6\xb8\x39\x7f\x37\x11\xa4\x2a\xa3\x22\x24\x51\x89\x4c\xea\x68\xdd\x51\x4d\xad\x03\x77\x15\xb9\x6a\x79\xf9\xb7\x5a\x0e\x44\xc0\x93\xc4\x35\xe8\xa9\x1a\x5b\xa8\x3f\xbf\x11\x4f\x4b\xe1\xaf\xcb\xd3\x88\x76\x82\xe6\x24\x5d\x4d\x63\x8a\x89\x14\x01\x17\x29\xf7\xf4\xb5\xbb\x23\x7c\x1e\xb0\x6c\x77\xbd\x58\x7c\x7f\x25\xc1\xd1\x6a\xfb\xe5\x2a\xd7\xf3\x65\x47\x11\x70\x9d\x44\x9e\x25\x0c\xde\xb1\xef\x3e\x9e\x42\x3e\x45\x90\x25\x19\x73\xb8\x96\x1d\x61\x23\x1d\x50\x64\x1c\xc6\x89\x20\x33\x51\xc0\x7a\x52\xa4\xe7\x53\xdd\x74\x3e\xcd\x5c\xa8\x24\x02\x11\x28\x72\x1f\x89\xfa\xe0\xce\x2b\x1c\xf4\xdc\x07\x22\x10\x22\xca\x1c\x4f\xc1\xe2\x78\x2c\x3c\x46\xf4\xaf\x94\x7a\x44\x20\xa4\xd5\xf8\xe9\xbc\x4a\xa7\x89\x62\x81\x2f\x3d\x25\x84\x08\x20\x05\x82\x57\xfd\x15\x89\x6f\xec\x4f\x50\x2c\xa0\x5a\xf8\xcd\xfd\x62\xfd\xb0\x5b\x3c\x3c\xbd\x3e\x6e\x77\xab\xed\xf7\xfe\x78\x92\x51\x2d\xee\x69\xf1\xd2\xff\x49\xc4\xa2\x4f\x8b\xde\x55\xb5\xef\x88\x99\x33\x56\x22\x50\x46\x06\x0e\xd5\xd8\x59\xfc\x99\x7a\xa3\x08\x74\x90\xb9\x9c\xa1\xdd\xad\x6c\x8b\xe1\x70\x9d\xe9\x30\xb6\x15\xc9\x7f\xdc\x2f\x36\xdb\x81\x06\x90\x08\x34\x53\x14\x19\x59\xe8\x16\x6d\xfe\x97\x4c\x52\xb3\xbf\x8a\x8c\x04\x8d\x6f\x3a\x3b\xe1\x49\xce\xfe\xce\x26\x22\x02\x13\xc5\x34\xa5\x97\x79\x4b\x05\xfd\x7c\x9a\xfb\x1f\xfd\x90\xe1\x82\xc8\xa1\x1d\x83\xca\xe2\xad\xc6\x41\x61\x4a\x04\xa6\xf3\x62\x2d\x2c\xe5\xc2\x1b\x15\x81\xd1\xe0\x44\x33\x4e\x65\xfb\x32\x86\x97\x88\x30\x08\xa4\xa7\xc4\xbb\x19\x22\xfc\xfc\xe1\xd0\x50\x4d\xcc\x67\xb9\xad\x62\xf1\x00\x50\x3a\xbb\xa4\xc3\x80\x05\x34\xd5\x76\x3e\x1f\xeb\x36\x38\x11\x86\xa9\xa4\x56\xc1\xc3\xe7\x28\x84\xee\x0e\x20\x65\x5d\x3f\x11\xea\xed\xbe\x46\xa4\xdb\xf1\x89\x65\x11\x86\x32\xb1\x9c\x4b\xcd\x00\x2c\x37\xe7\xe9\x8a\x30\x92\x49\xe2\x92\xb3\x3f\x46\xca\x5e\xfe\xb8\x89\x88\x84\xb0\x33\xa7\x55\x55\x3e\xd7\xf9\xbf\xb1\xa7\x86\xb9\xf8\x58\x61\x8c\x86\xaa\x87\x1b\xa7\x38\x37\x79\x83\x49\x1c\x98\x74\xc4\xb5\x70\x53\x1d\x8e\xd8\xe6\xdd\x7c\xa0\x94\x70\x33\x84\xce\x89\x30\x31\x4a\x58\x80\x0b\x09\x41\xbd\x5a\xf7\x7d\x72\xd5\x34\x0c\xd4\x90\x33\xd0\x51\x01\x4d\xf8\xa1\x44\xc8\x13\x46\xad\xd3\x6f\x79\x5d\xac\xf5\xb6\x9a\x90\xed\xb9\x51\x59\x18\x29\x6f\xee\xb7\xd5\xb2\x7b\xd6\xe1\x0b\x11\xc2\xb5\x49\x90\x93\xbc\xac\xab\x77\xac\xd7\x87\xe3\xe4\xa7\x64\x10\xc6\x2e\x4f\x78\x26\xfa\x9c\xdb\x8a\x42\x19\xdb\x04\x0e\x61\x46\xbf\x63\xed\xcd\x4b\x28\x55\x96\x8c\xfc\x03\x2f\x50\x21\x42\x95\xda\x6a\x9e\xef\x01\x1f\x4d\xe2\x50\x41\xaa\x46\x0d\x3d\xcf\x88\xf5\x78\x66\x29\x2d\xc8\xfd\x72\x92\x4b\x0e\xb4\xe8\x0e\x6a\x8e\x5e\x0f\xa8\x33\xe3\x63\x60\xaa\x08\xb5\x48\xd2\x9e\xaa\x75\xca\x61\xec\xc6\x60\xac\x3c\xe7\x4c\xe7\x2c\x35\x4b\x6a\xd5\x58\x38\xbd\xaf\x39\x8e\x00\x11\x1a\x95\x86\x62\xd0\x21\xf8\x34\x09\x73\x04\x0b\xc2\xc4\xcf\x1e\x57\x09\x7f\x2d\x49\x9a\x38\x3f\xe0\x74\x68\x6a\xbb\x86\x1a\x12\xd4\xf8\x80\x37\x1c\xba\x0a\x83\xf7\xcf\x42\x01\x1c\xfa\x44\x13\xa9\xa6\xcd\xe7\x9a\xae\x24\x8d\xb2\xff\xf6\x17\x32\xb6\x60\xfb\x2d\x37\x16\x29\x77\xcd\x57\xfe\x82\x9a\xdb\xc1\x82\x59\x6c\xc3\x9a\x74\xf8\x4f\xff\x76\x19\x4b\x43\x8f\x09\x9a\x14\xb1\xfc\x00\x13\xc7\x36\xd4\x70\xb9\xff\x9f\xde\x34\xb0\x28\x50\x14\x3e\x40\xd3\xe0\x80\x06\x45\xb0\x98\x07\x89\x45\xf6\x74\x33\xb5\xac\xb4\x63\x9c\x25\x89\xf1\x6d\x65\xff\x63\xb8\xf2\xfd\x79\x2a\x61\x56\xbf\x49\x55\xa5\xbe\x80\x08\x0a\x16\xeb\x98\x62\x69\xdb\x07\x44\xf3\xf0\xcc\x83\xe5\x67\x24\x4b\x82\xd0\x23\x2c\x37\x6d\x75\xbc\x60\x79\x11\x2c\x8d\x23\xa2\x48\x25\x08\xe5\x99\xcb\x5a\xb0\x14\x80\x30\x7a\xef\x8d\xda\x60\x51\x5c\xdd\x56\x86\x86\x85\xf1\x20\x4d\xd8\x80\xb3\x03\xca\x99\xbc\x81\x60\x9c\x65\xb6\x4d\x4b\xd2\x5e\xd7\x59\x8d\xee\xa5\x35\x47\x98\xce\x79\x26\x12\xa9\xdc\xec\x7c\xaa\xdf\xe8\x06\xc7\x73\x52\xa4\x9a\x50\x88\x8d\xda\xa3\x3e\x15\xf8\x85\x36\xf7\x17\x98\x4c\xc1\x84\xd4\xe0\x78\x8e\x20\xaf\xdc\x4a\x68\xa6\x3f\xa6\x94\x89\x06\xea\xe1\x13\xe0\xb2\x60\x42\x27\x14\xe4\x55\x1f\x58\xd7\xb9\x63\x45\xb4\x18\xc6\xe6\x2a\xc8\x5e\x30\x08\x41\x67\xfe\x2b\x50\xc1\xef\x16\x8b\x16\x9e\xb1\xfe\x5e\x9d\xbc\x09\x61\x10\x22\x73\xcd\x76\x6d\x2f\x65\xeb\x8f\xa1\xa2\x3a\x8e\xda\xe7\x7e\xb8\x84\x4c\x3a\xf1\xc5\xd1\x9b\x70\xf1\x8d\x4f\x19\x84\x2c\xeb\x4f\x90\xa4\xa0\xb7\x59\x6f\x1f\xaa\x73\x6e\xc5\x1d\x55\x3a\xd6\x91\x17\x0e\x1d\x51\xad\x4f\x28\x43\x04\xd3\xcc\x3a\x88\x3d\x75\xb8\x2f\x28\x76\x51\x6f\x5e\xbe\x75\x33\xd5\x91\x68\xfc\x0f\x6b\x0a\xfe\x07\x22\x24\x0a\xb8\xc5\x01\xfe\xed\x03\x70\xc1\x48\x30\xef\x7f\xfd\xef\xff\xf5\x03\xca\x87\xbc\xdc\x8f\x5a\xee\xaf\x75\x30\x0b\x86\x51\x9a\xb8\xfa\x81\xc2\xe5\x25\x1d\xef\xfc\xac\x19\x9b\x06\x13\xd9\xde\xb6\x6f\x70\x38\x77\x41\x0b\x66\x32\x41\xfb\xb6\xdf\x6c\xa6\x97\xf6\x74\x7f\x22\x62\xca\x72\xbb\xbe\x6e\x6e\x87\x8c\x40\xdd\x01\xf0\x12\x45\xcb\x53\x4e\xf3\x68\xd6\x6b\x8f\xa2\xc0\x62\xfe\xb0\xdd\x6f\x6d\x3f\xe7\xb9\x55\xcc\x5f\x2c\x8a\x83\x24\xec\x19\x3b\x17\x9d\xb1\x6a\xa6\x3b\x51\x14\x25\x16\xa4\xff\xab\xaa\x0b\xfd\x2b\xd7\xf8\x96\x9b\x56\xf5\x0d\x8f\x22\x4a\xc2\x84\xd0\xe9\x24\x7d\x72\x73\x3a\x8e\xee\x37\xcd\x12\x9f\x25\xf9\xcf\x53\x55\x9f\x0e\x23\x6d\x7b\x11\x71\x19\xd0\x97\x3b\x16\xd0\xe6\x65\x1f\x53\x44\x5c\x43\xc8\x7c\x07\xee\x33\x49\xf0\xf5\x5b\xfc\xe4\x49\x39\x06\xc2\xe6\xd4\xba\x58\xe6\xb5\xc1\x7a\x7d\x3b\xf2\x6f\xa2\x2c\xd0\xe4\xae\xde\xa2\xca\x1b\xb7\x4b\xfb\x1f\xca\x5c\xcb\x2d\xf9\xfe\xab\xdf\x79\xd3\x36\xdd\xf6\xa9\x9f\x5d\xb1\xc4\xe1\x6d\x44\x24\x22\x45\x6f\xfe\x11\x7f\x11\x63\xe0\xa0\x30\x2a\x22\x91\x32\x0a\x3a\xee\x4f\xea\xfd\x06\x9a\xfd\x39\x14\xbd\x36\x6b\x66\x1d\xc5\x48\x18\x9d\x58\x48\xa3\xcb\xae\xac\x9b\xe6\xd4\x59\xf4\xc7\xea\x30\x15\x3e\x12\x11\xa4\x2a\x73\xaa\x7e\xb7\x96\x05\xfa\x22\x22\x8c\x00\x54\xd6\x27\x93\x0b\x84\x2e\xd0\xda\x38\xdb\x38\xbd\x9c\x8c\x09\x6a\x49\xaf\x62\x5b\x23\x36\x3f\xc1\xf2\x3d\x4f\xec\x53\x24\x05\x4f\x3c\xc2\x83\x0a\xe8\xcd\x1f\x33\xd9\x38\x11\x29\x96\xa6\x67\x11\x19\x5b\xc0\x99\x9f\xae\x0a\x45\x60\xb5\x6e\xd0\x58\xb9\xd2\x33\x8b\x63\x3f\x04\xed\x97\xb2\x89\x1f\x8f\xef\xb9\xb8\x92\x31\xf4\x52\xce\xd0\x18\x1f\x55\x8f\xfd\xfb\x48\xeb\x28\xa4\x92\x43\x01\x87\x03\x0c\xea\xe8\x22\x42\x96\x44\xb6\xbf\xd5\x19\xb4\x25\x34\x13\xb0\x84\x88\x90\x87\x99\x1c\x50\x72\xd2\x31\xa4\x14\x8f\xd7\xf6\x6f\x26\x4d\xe3\x22\xc2\x2c\xa3\x59\xe4\x72\x32\x70\x9c\x5e\x34\x93\xa1\xd7\xe5\xa5\x36\xf8\xe5\xe9\x73\xa0\x87\xd7\x7f\xd7\x38\x48\xad\xd2\x5b\x4f\xda\xb9\xea\x9b\x7f\x44\x1c\x28\xbb\xcf\x0f\xb0\xfc\x94\x60\x9c\xa3\x1d\x10\x71\x18\x48\xca\x99\xce\x86\x8d\xe3\x5f\x65\xc2\x4a\x54\x6d\x4e\xef\xf0\x09\xfe\xe7\x62\x88\x28\x46\xbf\xd9\x43\x5d\x7c\xde\xe7\x06\xef\xab\x5e\x4d\x65\x74\x7e\x92\x26\x91\x67\x13\x27\x5d\x98\xce\x05\xb9\xab\xcf\x1e\x52\x9c\xc8\x84\x8a\xd7\x45\xd5\xb6\xd5\x5a\x63\xd9\xe6\x26\xef\xdd\xe6\x38\x35\x11\x55\x32\x3c\x2f\xc5\x2e\xf2\x47\x38\xe3\x3e\x3d\xff\x33\x2f\xbf\xe8\x9d\x16\x31\xd7\x32\xb3\xe2\xb7\x75\xf1\x79\x9e\x68\x77\x88\xcf\x1e\x75\x24\x62\x91\xb1\xd4\x36\x50\x34\xfb\xdd\x11\x9a\x86\x6c\xde\xf8\xcd\x09\x47\x0c\xe8\x76\xbf\xa6\x7f\x0a\xa1\x02\xa2\x3b\xdf\x11\x8d\xd1\x74\x43\x8c\x21\xcc\x08\x1c\xff\x7e\xfc\xfc\x56\x41\x31\xd2\x4a\x12\x31\x24\xb6\x13\x63\xb9\xde\xfe\xb0\x6a\xb1\xfe\x88\x0c\x80\xca\x9a\xae\x4b\x7f\xa0\xf0\x2d\xe2\x2e\x1a\x8d\x6c\x2f\x42\x5e\x4e\x05\x98\xba\xc3\x8a\xa6\xb4\x02\x29\xe1\x6d\x58\x20\x14\xb1\x34\x5a\x86\x03\x37\x66\xa8\x30\xf4\x95\x7f\x17\xab\x94\x67\x03\xdd\xdc\x39\x87\xdc\x8f\xe4\x82\xc8\x2b\x88\x63\x7b\x5b\xb5\xfd\x54\xd5\x01\x52\xaa\xa0\xd2\x7a\xf5\x71\x85\x47\x52\xc4\xda\xed\x87\x1b\x68\xab\xb3\x4b\x13\x63\x1a\x13\xed\x8a\x6d\x9a\xb6\xc1\xd7\xfc\xc4\xc5\xd4\xb2\x8e\x1a\x6c\xd5\x9e\xf2\xa8\x13\xbb\x11\x23\x97\xe4\xf9\xe6\x4e\xda\x62\x14\xee\xc5\x86\x69\xca\x12\xac\xef\x9f\xb6\x63\x7c\x9a\x88\x0d\x17\x59\x44\x73\x32\x2f\x8a\x6d\xf5\xad\x9a\x2c\x55\x23\x75\x6c\x01\xb9\xe8\x60\x82\x22\x09\x43\x99\xb8\xd0\xd5\x59\x8e\x59\xec\xab\x1b\xcd\x04\x23\x6f\x6e\xd5\xee\xc9\x20\xdd\x2e\xfd\x75\x22\x16\x68\xcb\x98\xe7\xf4\x3c\x06\xe5\x26\x91\x44\x3c\x8b\xdc\xee\xbb\xfa\x7d\x24\x79\xa0\xb9\xae\x19\x91\x24\x91\x95\xd0\xa3\xec\x6b\xdf\xf8\xd1\x4f\xbc\x24\x89\x13\xee\xb5\xb2\xa9\xa6\xbb\xa8\x65\x7e\x4e\xcf\x26\x89\x4c\x42\x97\xc0\x70\xea\x41\xa8\x67\xc1\x6c\x22\x49\xb9\xa4\xba\x55\x75\xc4\x72\x5b\x83\x1e\xfc\x4a\xaa\xad\x46\xc8\x1e\x8b\xe3\x25\x8b\x6f\x3f\xc8\xaa\xf1\xfd\x7c\xba\xbf\xf3\x8b\x3f\xe1\x41\xc8\xac\x0a\xfa\x71\x92\x05\x4f\xb2\xa0\x97\xce\xb7\x72\xe0\x1e\x02\x3c\xbe\x6c\x16\x07\x41\x36\xc8\xd8\x91\x16\xc6\x15\x39\x89\xb1\xfd\x4c\x44\x9c\x72\xe9\x49\xa6\xbb\x0d\xb3\x69\x6f\x97\xf3\xf3\x30\x11\xa8\x12\x57\xac\x79\xa9\xd4\x3b\xc5\x61\x2e\xa7\x1f\xfa\x31\xa0\x80\xd6\x0a\xb6\x7b\x6f\x8d\xfd\x11\x0c\x32\xb7\xc6\xb1\xdd\x57\x1e\x9d\x66\x9f\xd8\x39\x2a\x89\xd4\x56\x09\x9f\x6a\xf5\x53\x57\x7b\x9a\xfb\x77\xe7\x28\xc7\xfe\xdf\x38\x52\x36\x1b\xf2\x4f\x94\x49\xba\x61\x86\xfb\x44\xf4\x39\xae\x5a\x4f\x3a\x97\x45\xa2\x42\x2b\x14\x99\x4f\xf4\x00\xfc\xe1\x94\x6b\x12\x23\xbc\xfd\xb1\xde\x3c\xbd\x6c\x5c\x57\xfc\xee\x7e\xfd\xb0\xf6\xe9\x97\x44\x09\xc8\xac\xa2\x68\x5e\xbe\x0f\x7d\x77\x77\x5c\x67\x48\x94\xb0\xea\x5c\xd7\x70\x47\x30\x10\x81\xf0\x3d\x8c\x16\xf6\x35\xb9\x01\xcc\x42\xca\x31\x3e\x7c\x2e\x9d\x9b\x97\x4d\x56\x9c\xe1\x42\xf6\x2f\xf1\x1e\x41\x63\x2d\x2b\x2f\x0d\xd3\x7f\x29\x93\x59\x4a\xcb\xed\xa0\xaf\xf1\x8a\x05\x4a\x8c\x48\xa4\x3c\x2b\x60\xe8\x6f\x90\x97\x0d\x35\x39\xce\x8e\x4f\x03\xc6\x89\x1b\x00\xdb\x3d\xd5\x91\xbd\x25\x4f\xc3\x88\x47\xd1\x99\x14\xf4\x77\xbb\xaa\xe1\xa2\x0d\x7a\xe2\x6d\xce\xfe\xa7\xbf\x9e\x36\xb4\xd1\x79\x9c\xcd\xee\x38\x68\x3e\x15\x29\x0b\x2c\x3a\x40\x57\xc3\x76\xd1\xf9\x40\x2c\xed\xfc\x3d\x67\x70\xa8\x95\xa0\xbc\x1b\xd2\x2d\xb8\x41\x51\x10\xd3\x20\xe7\x5d\xf9\x00\x66\xb0\xeb\x38\xaa\xc5\xe1\x5e\x93\x46\xb1\x89\x58\x8f\x29\x71\x4d\x44\x70\x85\xa2\x4c\xa4\x71\x2c\xb9\x55\xc1\x6b\xf3\x1a\x17\xbf\xf3\x19\x31\x38\x91\xc6\xce\xb0\x6e\x9a\xa3\x33\x0b\xd3\x12\xcc\x78\x5e\xa4\x31\xc6\xc2\x45\xbd\x9b\x23\x28\x24\x6a\xad\xf1\x2f\x27\x21\xa7\x54\x33\x75\x73\xde\xe7\x25\xfe\xac\xab\xde\xc6\xa5\x49\x24\xa9\xe2\xf3\x00\x79\xe9\xb9\x17\xfa\x63\xc2\x72\x1f\x6e\xf7\x18\x06\xab\xed\xf7\xe7\xcf\x1a\x0e\x79\xff\x25\x12\x0c\x29\xe2\x56\x55\x69\xc5\xdf\x17\xcf\x6b\x42\x22\x9c\x07\x68\x5a\x9e\xe4\x40\x0f\x79\x67\x44\x9a\x06\x9a\xd0\x73\x5e\xce\x61\xa5\xdf\x90\xa4\xfc\x16\xa5\x76\xdd\x89\x5f\x86\xd8\x69\x9a\x59\x24\x4c\x59\xb9\x1d\x60\xf2\xd4\x5c\x58\xc8\xcf\x77\x30\xf9\xbf\x87\xde\x45\x9a\x89\x80\xea\x47\xb4\x49\x77\x0e\x0d\xea\xf9\xad\xfa\x2f\xff\x1d\x7c\xb8\x0c\xc0\x32\x67\xc0\x3b\xbe\x76\x5f\x8c\x18\x89\x87\x31\x59\x9a\x81\x4a\xcf\x05\xfa\x51\x30\x97\x8a\x28\x0e\x5d\x33\x7f\xfe\x41\x09\x89\xce\x85\xbe\x3b\x61\xe1\xf6\xc7\x2f\xb2\x33\x29\x68\x19\x38\xc0\x48\x17\x6d\x2e\x27\xe2\x1b\x22\x55\x49\x0c\xfc\xac\x70\x7e\x79\xa9\xff\x18\xde\xa7\xca\x80\x48\xca\xe8\xd3\xdc\xe7\x4d\xfb\x00\xd3\x29\xa5\x74\x4c\x68\x52\x57\x26\xf4\x6f\x56\x21\xf0\x73\x6d\x7e\x8e\x09\x51\xa4\x9a\x69\x03\xbd\x4a\x4c\x4b\xdf\x9b\xd2\xaf\x23\xd4\xb6\x1b\x8c\x49\x4a\xd2\x91\xe5\xe9\x30\x50\xfb\xf1\x07\x79\x96\x98\x69\xb6\x7d\x5e\xea\x45\xa4\x98\x45\xe4\x97\xd0\x22\x18\xa8\x2a\xac\xcf\x97\xcb\x0c\x39\x7e\xcb\x53\x3d\xdf\x02\x27\x52\x13\xb1\xa8\xff\x82\xd6\x1d\xf8\x82\x96\x50\xa4\x26\x09\x7c\x0b\x33\x85\x3b\x33\xac\xd1\x82\x87\x71\xcc\x5c\xe2\xfd\x76\xe9\xdd\x50\x1e\x02\x10\x97\xcf\xdd\xfa\x71\x71\xbf\xd9\x6e\xb6\x2b\x2f\x11\x25\x78\x28\x43\xea\x9a\xd8\x91\xfa\xe5\x60\xea\x8f\x37\x51\x1e\xc5\x48\xea\x19\x3f\xa1\x55\xfb\x7b\x68\xda\x61\xdb\xaf\xe0\x51\x92\x51\xb6\xfc\xdb\xb7\xe7\x9b\xe1\x02\xe1\x91\x63\xa9\x7b\x7f\x80\xdf\x03\xc6\x53\xc1\x23\x61\x0b\x08\xbb\xbc\xb1\x29\xfd\xd9\xd7\xc4\x23\xc5\x30\x3a\x07\xc6\x55\x3d\x02\x41\x0b\x1e\xc7\xb6\xf6\x65\x5b\x03\x0e\x79\x9f\x65\xe1\x71\x1a\x85\xd2\x65\x5f\x4c\x55\x1f\xce\x4e\x97\xe5\x69\xe9\x3f\x3e\x8f\xbb\xa8\x89\xa0\x24\xe4\x18\x8c\x63\x78\xbf\x32\x78\x17\xde\x69\x1b\x9d\xd5\xed\x4d\x2f\x1e\x27\x78\xca\x4c\x46\xc0\xca\xaa\x5a\xe6\x96\x08\xf5\x36\x37\x66\xfe\x3b\xf2\x54\xc6\xe4\x22\x36\x45\xf5\xeb\xf6\xd4\x57\xcb\x79\x2a\x6d\xab\xde\x4e\x55\x87\x23\xd4\xf8\xc7\xf0\x33\x8c\xb3\xf3\x3c\x55\xb6\xbe\x72\x3c\x6b\x86\xdc\xe7\x87\xbc\xff\x1a\x1c\x38\x70\xdf\xd2\xa6\xb7\x15\x05\x26\x57\xc9\x70\x04\xcf\xb2\x94\xea\xb5\x12\x4b\xa4\x66\xc3\xfa\x73\x08\x48\x15\x3c\x03\x2e\x6d\x61\xf2\x23\x1f\x0a\xe6\x0a\x9e\xa9\xd8\xb7\xa4\x3f\xe2\x2f\x47\x47\xc5\x46\xcb\x94\x67\x68\xd9\x43\x4d\x75\xaa\xdb\x3d\xe1\x3d\x1e\xf2\xb2\x73\xc1\x6f\x07\x57\x12\x61\x18\xa9\x1e\x6c\x02\x6f\xb8\xf2\x5c\xbf\xfd\x00\x0c\xf4\x99\xa4\x63\x59\xc9\x75\xa9\xf3\x1a\x55\x37\x17\x27\x4f\x04\x41\xaa\xd0\xe9\xf8\xd6\x5a\x4d\x23\x46\x0e\x80\xd4\x51\xf2\x78\x2a\x9a\xff\x19\x0d\xa4\xe0\x20\xb9\xb2\x04\xa1\xeb\x9b\x27\x52\x87\xeb\x2f\x2b\x13\x46\xad\x66\xff\xf5\x8f\x7f\x6e\x50\x9d\xea\xbc\xcd\xb1\x9f\xaa\x32\xd5\xe1\x19\xaa\x4a\xfc\x13\x7f\xd8\x9c\xb4\x33\x9e\xe7\xff\x97\x8d\xe0\x5b\x83\xff\xd7\x6f\x12\x5c\x62\x48\x85\xe6\xa2\xba\x44\x06\xce\x6f\x73\x5c\x85\x49\x60\x5b\x4f\x41\xbf\x4c\x7d\x10\xae\xd2\x28\xf1\xcd\xc8\xdf\xb1\x28\x7c\x75\x84\x53\xb3\xdd\x39\xd1\x85\xf9\x33\xd6\x3f\xf7\x95\x67\x5c\x98\xfc\x86\xea\x85\xbb\xbc\xe3\xf8\x02\xbf\x46\x6c\xe6\x7e\x24\x1a\x4a\x54\x6c\xf6\x58\xb4\xe7\x92\xde\xe8\x9e\xb4\x0a\x2d\x17\x22\xb4\x50\xa3\x13\x90\xf5\xf7\x85\x59\x4c\x6f\xc0\x93\xd6\x5c\x6d\x8f\x99\xfd\x77\x9e\xa7\x52\x70\x54\x41\x14\xf5\xd5\xd9\xa7\x0f\xac\x57\x2f\x37\x8c\x65\x57\xb3\xf7\xa3\xbd\x81\x9b\x2c\xf2\x8c\x92\x14\x6c\xcc\x66\x04\xb3\x20\x94\x94\x0a\x35\xbb\x23\xa5\x7f\xff\xf0\x7f\x8f\x42\xd9\xbd\xbd\x7d\x5e\xb6\xaf\x2f\xf7\x7f\x8c\x4d\xf1\xe8\xdd\x64\x81\x4a\x7d\x85\x84\x74\x1f\xfe\x98\xcb\x62\x64\x61\x9a\xc8\xf4\x2c\x60\x47\x24\x4a\x7f\xf4\xc7\x52\xe5\xc8\x6b\x86\xe4\xb3\x22\x0b\x33\xce\x32\xdb\xfc\xa8\x3f\x7b\xc9\x56\x91\x85\x42\xd3\xc7\xfd\x76\x82\x5a\x83\xd3\x89\xae\xc6\x31\x69\xc6\xd0\xce\xa3\x89\x1a\xc2\x1f\x33\xee\x41\x16\x65\x22\xea\x55\x0e\x0c\xd6\xb5\xa3\x96\x9a\xc7\x0a\x65\x89\x62\xcc\x39\x27\x3b\x28\x8a\x1d\xa1\x76\xfc\xfa\xca\x52\x65\xa8\xb1\x4a\x5b\x6e\x74\xc7\x31\xd7\x8c\xea\xd6\x19\x07\x4e\xdc\x43\x8b\xf5\x66\xdd\xff\x4d\x25\xe0\x5b\x53\x16\x7a\x12\xd0\x65\x99\xb6\x12\x15\xdd\x9e\x0a\xf9\x39\xa7\x36\xb4\xb8\x99\x08\x2d\x57\xc9\x33\x92\x6e\x5e\x91\x97\xd8\x6c\xab\xce\x41\xee\x7f\x99\xd2\x54\xd4\x07\x38\x6c\x5d\x13\x19\x70\x61\x64\xaf\x08\x5f\x54\xed\x7d\xf5\xf6\x38\xb9\x07\xc9\x03\xf2\x5d\xe4\x9b\xec\x22\x98\xdd\x9f\x58\xf5\xd7\x95\x9a\x6b\x70\x82\xd6\xe5\x50\x38\x64\xb4\x30\x33\xa9\xad\x62\xcc\x27\x42\x9d\xdc\x0f\xf6\x39\x77\x5c\x45\x36\xfc\x7e\x3a\xb5\xaa\x3a\x8c\x72\x68\x99\x4a\x91\xf2\x07\x3d\x4b\xf1\x5d\x55\xdf\x57\x50\x2e\x5a\xdb\xbe\x35\xff\x8b\xca\xd8\xa4\xdd\xcd\xd3\x72\x74\x35\x1d\xc5\x94\x26\x80\xa2\xc8\xaf\x2a\x8d\x88\x4c\x0b\x99\x45\x83\x26\xc3\x9e\x33\x7b\x72\xe3\x18\xf7\x40\x09\x47\xa1\xe8\x79\xb7\xc7\xd7\x33\x81\xa5\xc4\xed\x3c\x5b\xda\xe8\xfb\x7c\x91\xfd\x92\x93\xd1\xca\x92\xfa\x7a\xde\x35\x07\x96\x9d\x1a\x81\xc9\x49\x68\xd0\xed\x50\x1f\x58\xb7\x03\x7d\xb1\x4b\x2e\xac\xf1\xa9\x22\x48\x42\xad\xbc\x3b\x58\x68\x05\xb5\x1e\x10\xa4\x0c\x03\x73\x11\x32\x46\x05\x8a\x37\x78\xf3\x36\x5a\xb0\xc4\xf2\x4d\xff\xab\xca\xcb\x21\x2f\x9c\x33\x75\x83\x35\x27\xa2\xcc\xa6\x6f\xdf\xb0\x3d\x2b\x94\x58\x71\xdf\xf5\xb9\xe9\x52\x88\xd8\x60\x14\x7a\x22\xc6\xc3\x11\xca\xcf\xd9\xe4\x92\x48\x52\x16\x59\x8e\xb0\x0f\x84\xe2\xa1\xfa\x98\xef\xf4\xec\x06\x4a\xda\x7e\xee\x1e\x46\x2e\x62\xe7\x7f\x51\x4b\xc0\xb1\xc6\xce\xf1\xf9\xd9\xd3\x7d\x58\x36\xbd\x6f\xf9\x07\x96\xa4\x38\xe8\xff\xd2\xfb\xd9\xdd\x96\x46\x60\xc6\xc3\xa9\x08\xb3\xf9\x69\x28\xb2\x98\x19\x31\x54\x08\x51\xd5\xd7\xe1\xa0\xc8\xd0\xe6\x73\xed\x16\xd0\x85\x1e\x7f\xe2\xe7\x5d\x5d\x1d\xa6\x5c\x65\x6e\xbc\x08\x43\xaa\x31\x80\xd6\xc4\x07\xd4\x59\xc5\x4b\xf0\x90\x00\x61\x71\xd7\xd5\xb1\x5d\x97\x77\xaa\x7c\xe8\x3e\x95\x9f\xc6\x02\x30\xf3\x3e\xdb\x1d\xaa\x3d\x6c\x27\x7c\x48\x42\xc8\xd0\x90\x55\xce\x55\xf5\x13\xf1\x3d\x5e\x9e\xd9\x2c\x85\x90\x8c\x53\x17\x80\xdd\xa4\xef\xba\xc8\xc4\xb9\x70\xe3\x9b\x50\xae\xd2\xd7\x59\x67\xa8\x2d\x3b\x78\x3b\xd0\x74\x11\x42\x67\x82\x88\x17\xc8\x6a\x3f\x95\x8e\x7d\xb5\x3f\x2a\xd0\xf4\x7a\x2b\x6b\x55\x0d\x3c\x38\xa1\x65\x48\x79\xa5\x5d\x8f\x1b\xb2\xa4\x13\x03\x40\xec\x70\x22\x6a\xa5\x7c\x2b\x65\x4f\x0e\x39\x7e\x62\x13\x45\x64\x29\x6e\x5f\x16\xeb\xc7\xdd\xed\xea\x7e\xf1\x0f\xff\x5b\xc6\x58\xaa\x42\x9d\x17\xa7\xa9\x3f\x0b\x41\x8c\x49\x32\x30\xd9\xab\x76\xff\x5c\x57\x66\xba\xc8\x21\x40\x46\x10\x8e\xf5\xcd\xd3\x48\xbb\x7c\x3c\x2a\xd4\x59\x26\xfb\xa2\xb9\xcb\xa9\x9d\x91\x35\x67\x9f\x0c\x18\x48\x02\x20\x01\xa5\x87\x6e\xf1\x83\xfa\x01\x9a\xdc\x27\x48\x20\x0a\xac\x06\xc9\xf2\x54\xd3\x5b\xed\x4b\xa9\xd7\x24\x2b\xce\xcf\x14\xa5\x09\xcd\x0f\xd3\x77\xd3\x16\x7d\x67\xbe\x80\xc8\x30\x9a\x1b\x9b\x9b\xfb\x73\x79\xf6\x8a\xb1\x9a\x5c\x38\x8e\x24\x45\x80\x87\x5d\xe3\x04\x99\x27\x6f\x33\x36\x00\xdd\xf4\x5e\x68\xfc\x7d\x2d\x83\xf4\xb7\x34\x44\x05\x24\x41\x40\x3e\x7e\x01\x63\x1f\x13\x12\xa6\x99\x83\x84\x51\xf7\xe1\xb8\x63\x7c\xe0\x36\x42\x92\xda\x6c\x6e\xb7\x5d\x62\xdb\x52\x8a\xa2\x0b\x25\xd6\xa5\xa9\xd8\xe4\xcb\xa5\x22\x25\x94\xe3\x99\xd2\xe8\xe9\x57\x79\x89\xf8\x06\xdf\x50\xd8\x2d\xe0\xd3\x97\x98\xfe\x79\xeb\x0d\x29\x5a\x57\xb4\x3d\x17\x57\x3a\x7b\x41\x62\x3b\xfe\x11\x79\xa2\x85\xf3\x75\x9e\xd7\x3b\xd4\x79\xbb\x63\xc1\xc8\x05\x07\x9e\xb2\x08\x6c\xaf\xbf\x97\xd4\xf8\x63\x30\xbd\x38\x47\xab\x6c\x5c\xb5\x50\xe0\x43\xd3\x4f\xab\x2c\x4c\xa4\x0b\xc2\x36\x47\xeb\x81\x8c\xf6\xb4\xc9\x57\xc8\x18\xd0\xe3\x1e\xa0\x7e\xbf\x19\x94\x58\xcf\xd5\x0a\xc8\x24\x10\xf2\xfe\xf0\x49\xa6\xe4\xbe\xf2\x5d\x10\x02\x20\x08\x23\xe9\xe3\xe0\xa4\xff\x6b\xac\x8c\xa7\x58\xfc\x0e\x63\xa7\x0b\x80\x87\x1e\x28\x71\x57\x74\x8f\xf6\x5a\xe6\xaa\xaa\xcb\xb1\xbc\x91\x4f\x60\x81\x4c\x18\x05\x4a\x0b\xad\x97\x55\xf5\x3e\x0d\xc9\xc6\xaf\x5e\x65\x51\x3a\x84\x6e\x3e\xe3\x7c\xdb\x44\x7f\x75\x05\x92\x5c\xb5\x02\x4d\x9b\x88\xc9\x5c\xd7\x89\x05\xc6\x59\x09\x1d\x07\xb0\x5e\xdf\x3c\xed\x36\xdb\xc5\xb7\x55\xb8\x7b\x7e\x59\x11\x50\xdb\x17\x67\x00\x13\xcb\x88\x43\x10\xaa\xef\x9e\x0a\x2c\xf3\x59\x03\x30\x41\x26\x8c\xc7\x74\xf5\xd2\xf6\x85\x7e\x2d\xf3\x0f\xac\x9b\x49\xd1\x15\xbc\xce\x2c\x55\xd0\x5f\x8f\xf3\x15\x0d\x19\xa4\x40\x45\xb7\xc5\x8a\x84\xde\x86\xbb\xa9\x0c\xb4\xe0\x8e\xb8\xc4\x89\x03\xf6\x47\x10\x4d\xec\xdb\x82\x71\xdd\xfe\xe7\x1c\x0d\xca\xac\x09\x1a\xcf\x1f\x19\x86\x81\x47\x31\x5b\x77\xf0\xc9\x0c\xf1\x78\xb3\xbe\x91\x0c\x21\x21\x4a\x88\xcd\xbe\xfa\xb5\xbb\xad\xd4\x85\xb5\x97\xa1\x64\x34\xe7\xb0\xdd\x63\xfd\xe7\x54\x76\x43\x48\x96\x98\x60\xd8\x13\x47\x59\x0d\xff\x70\x0c\x12\x5a\x81\xaf\xdb\x4b\x50\xb6\x64\x98\x78\x92\x8d\xcd\xe7\x41\x56\x93\xb2\x9b\x8c\x42\x5b\xc4\x3c\x87\x2c\x1b\xea\x8e\xf0\xe7\x47\xc8\xa3\x21\xdf\xc5\x06\x8b\x62\xc0\x2b\x25\x64\x1c\x67\x14\x98\xdc\xad\x5f\x56\xdb\x97\xc5\xed\x6a\xd3\x1f\x49\x65\xaf\x8e\x1d\xec\x40\x0f\x16\x99\x8c\x95\xb4\x44\x8b\xeb\xe5\xdf\xcc\x3d\xc8\x58\x6b\xc9\xce\x84\xac\x8e\xd4\xe9\x3a\xe5\xbb\x90\x09\x5a\xc1\x3e\xda\x37\x28\xbe\xe9\xdf\x59\xca\x6d\x46\xf4\xb1\x2a\x17\xb6\xf1\x3c\xaf\xca\xcb\xda\xe4\x18\xab\x3a\x0e\x9e\x07\xc7\xdc\x45\x39\xc8\xcc\x4b\xc8\x57\x54\x23\x98\x74\xf5\xc8\x2c\x60\x94\xc7\xe9\x5c\x08\x09\x23\x21\x47\x21\xb3\x54\xc7\x36\xf7\x5d\x9e\xa0\xb0\x60\x24\x77\x48\xc4\x48\x7a\x53\x45\xee\xc8\xdb\xef\xf2\x92\x8c\xfa\x04\x98\x28\x21\xd0\x84\x8d\xab\xc5\x24\xc8\x91\x10\x31\x5a\x02\x37\x4f\xcf\xcf\xab\x17\xbf\xbe\x1f\x6f\x6f\xfa\x01\x3c\x02\x17\x74\x1c\x3e\x8f\x03\x32\x39\x7f\x5c\x44\x12\xbd\xcf\xa2\xf1\x37\x91\xe0\xba\xdf\x98\xdd\x1a\xa4\x04\x46\xeb\xd1\x3e\x90\xcf\x69\x79\xd9\x1b\x3f\x48\x65\xca\xd6\xa1\xca\x77\xfc\x24\x50\xed\xf8\x2a\x2a\xc8\x28\x18\xea\x49\x46\xeb\xea\x70\x57\xd5\x2a\x97\xc5\x55\xfe\x5d\x7f\x2a\x93\xe6\x9c\xbe\xd9\x94\xf9\x91\xba\x85\xfe\x2a\x29\x28\x55\x62\x15\xd2\x1d\x51\xd9\x0d\xe6\x05\x29\xc2\xe7\xcd\x74\xa4\x66\x19\xd5\x8d\xcc\x20\xdc\x95\x28\xed\x76\x47\x99\xff\x45\x91\xf7\x9e\xae\x0a\x32\x69\x99\x4e\xa9\x0a\x3d\xfe\x42\x2a\x10\xe0\x54\x22\xca\xcf\xe5\xa9\xd4\x7d\x57\x65\x7b\x99\x6c\x52\x81\xe2\x84\xbc\xd6\x8e\x4f\x68\x18\x26\xa9\xc0\x30\xdf\x83\xb8\x28\x8a\x9f\x55\xfd\xde\x8b\xc1\x09\x15\x6a\x49\x9e\x41\x01\xa7\x52\xed\xa9\xeb\x6a\x7c\xe9\x10\xb5\xf0\xd9\x30\xd7\x02\xe1\xab\x06\xde\x07\x5a\xeb\xc5\x1b\xf4\xb8\xaa\xee\x0c\x0a\xfe\x56\xcf\xff\xb8\x79\xf2\x9c\xda\x42\x31\xa6\x51\x9e\x95\xec\x6f\xf3\xa6\xed\x62\xce\x75\x79\xff\xb9\xdd\x57\xa7\x06\x4a\xdd\xee\x9b\xa1\x63\xac\x58\x96\x7a\x1c\xf0\x2b\xf1\xf1\x19\x53\xa0\xad\xf5\x4e\x8a\xd1\x2a\x8a\xad\x06\x1b\x7d\x4c\x3c\x1d\xbc\x7a\xeb\x1f\x57\x4d\x88\x8a\x63\xd7\x43\x04\x75\xfe\x88\xed\x73\x9d\x7f\xe4\x05\x5e\xe4\x8f\xa6\x27\x39\x06\x7f\x6c\xbb\xf0\x92\x9a\x38\xe6\x0d\x8e\x8a\xb9\xa0\x6c\xfa\xc0\xa3\x5e\x9c\xda\x7d\x55\x9f\x53\xe6\x2a\x09\x13\xca\x93\xca\xd3\xe7\xb2\xae\xca\x7f\xcf\x43\x09\xaf\xa4\xe8\x54\x12\x31\xaa\x96\x92\x1f\x44\x45\x05\x3d\xad\xe6\xab\x24\xca\x6c\xcb\x5d\xb5\x93\x79\x09\x13\x45\x2b\xa1\x12\x99\x10\xb5\x88\xc5\x96\x8c\x53\xa1\x2a\x0d\x39\x35\x28\x2c\x73\xbd\x39\xc9\x89\xe4\xdc\xfc\xa6\xa8\xd2\x34\xb5\xc8\x04\xcb\x43\x09\xb5\xa6\x9a\xba\xf3\x74\x46\xf4\xe0\xa3\xa5\xad\xb8\xc8\x64\xe4\xd1\xa0\x77\x35\x22\xe5\x24\xea\xc5\xc7\xdb\xb8\x6b\x7f\xcc\xfe\xed\x4f\x56\xd2\x52\xbc\x4a\x2f\xdf\x79\xa5\x44\xaf\x38\x1a\xe2\x5e\xf5\xf8\xdc\xb6\x6f\xd7\x15\x2a\x0b\x20\x49\x7d\xb2\xa3\xd9\xe7\xc7\x7b\xfc\xc0\xb1\xc2\xb4\xff\xc1\x2c\xc9\x08\x24\x77\x80\x77\xa4\x86\xf9\xab\x64\x0b\xd7\x22\x82\x2f\xad\x95\xca\x12\xb4\xcd\x2c\x76\x1f\xee\x26\x1b\x71\x7a\xfa\xc3\xc6\x10\xad\x9e\xa3\x5c\xb2\x6d\x52\x04\x79\xb2\x1d\x28\x51\xc0\xbc\x18\xb5\x50\x82\x29\xcb\xbc\xe5\x8c\xe6\xcf\xbc\xc4\xce\x70\xfe\xc8\x4b\xfc\x84\x5a\xdf\x60\x51\x40\x7d\x1e\xad\xbd\x4a\x77\x4f\xe4\x3f\x97\x78\x55\x10\x64\xb4\x7f\x75\x1b\xc0\x00\x58\xa9\x64\x10\xd0\xd6\xd5\x58\x91\x31\xfb\xc9\x87\x79\x55\x25\x03\x24\x48\x1d\x1e\xf2\xf6\x11\x7f\x11\x9f\xd7\xa5\x06\x86\x50\x32\x35\xd4\x08\x72\xa6\x73\xbb\xcd\xbb\x77\x8d\x65\xef\x70\x8d\xbf\xf5\x65\x21\x57\x49\xce\x02\xcb\xe5\xdf\xf4\x42\xa3\x42\x49\xc5\xc8\x13\x7a\xce\x15\xb5\x65\x5c\x4c\xea\x59\x87\x53\x49\x93\x51\xce\x88\x02\x85\xc1\x96\xe1\xdd\x60\xa5\x82\x58\x64\x3d\x73\xfe\xa8\x6e\xa3\x54\x80\xda\x35\x9b\x50\xe2\x38\x87\xf2\xaa\x9a\xad\x50\x2a\x84\x60\x88\xa7\xb7\x0f\xba\xad\x06\x75\xd6\xc9\x52\xd6\xb1\x95\x78\xff\xb0\x78\xc2\x95\x25\x05\x9a\xbc\x52\x0d\x22\x34\xfd\xf2\xfc\x62\x39\x62\xa8\x58\xf7\x15\xff\x7c\x5d\xfd\x89\x8f\x56\x36\x7b\xf4\xf9\x31\x65\x44\x5c\xd3\xd9\x2e\x50\xef\x83\x8e\x5d\x65\x82\x48\x61\xcf\xd6\xf5\x50\x95\xf8\x79\x57\xd5\xaf\xcd\x59\xa7\xca\x0f\x64\x3a\xc6\x5e\x2e\xd6\x6d\x5f\x53\x28\x91\x32\x90\x52\x3e\xc5\xaa\x47\x4d\x5a\x71\xaf\xad\xaf\x99\xa9\x60\x40\x39\xca\xd1\xee\xb6\xac\x87\xab\x2e\xea\xd2\x93\xef\x60\x90\x3b\x25\x8d\x52\x5b\x9a\xd4\x79\xc3\xa2\x83\x80\x53\x7f\x1f\xbd\x53\x4f\x29\x3e\xe5\x8e\x9a\xff\x11\x1d\xf0\x94\xea\x20\x8f\xd8\xbe\x53\xbb\xfd\xdf\xf2\x82\x75\xc8\x34\x21\x1c\xce\xfd\x95\x7f\xaf\x97\x42\xb3\x88\x47\xd2\x45\xbe\xd8\xfe\x59\x56\xbf\x0a\xd4\x3d\x46\x45\xb3\x24\xa5\x08\xc4\x86\xf1\x50\xe0\x3d\x7a\x99\x6e\xa1\x19\x07\x52\x38\xfc\x18\xea\x14\x9f\xa3\x73\xcd\xb8\x54\x86\x7c\xb8\xdb\xbc\x39\x9e\x48\xe2\xaa\xaa\x3f\x2d\x2e\x6f\xd3\x39\x51\x83\x2e\xb7\xf1\xfa\xd2\x4c\x33\x0a\x8e\x6c\x74\xd1\x0e\x81\x53\xa3\x29\xa1\xa3\x38\xa5\xf5\xab\x73\x63\x6e\xe1\xf3\x4a\x1b\xaf\x8e\x53\x46\x40\x63\x2c\xdf\xf2\xb2\x7f\xbc\x84\x47\xcc\xc6\xfd\x25\xbc\x39\x87\x62\xbc\x96\x74\x9a\xa6\xe4\xb5\xbd\x90\xfc\xe9\xac\x78\xa8\x1f\x99\x39\x3a\x3d\x8b\x03\x39\xf6\xa1\x98\xe6\xda\xc2\xc0\xbb\x5d\x86\x40\x63\x0b\xd3\xe2\x59\x11\x6f\x18\x8c\xeb\x8c\x25\xa9\xfd\xbd\x5f\x50\x6b\xca\x68\x9e\x3b\xa5\xff\xe8\x07\x29\x91\xda\x34\xdd\xee\xf6\xf5\x65\xb1\xed\xf9\x8d\x85\x16\x69\x44\x7e\x9a\xf5\x6e\xbf\x61\xf9\x03\x06\x72\x4c\x93\x7b\x16\x8a\xd1\xa6\xaf\x11\x5a\x12\xbe\xd9\x41\xe0\x2f\x04\x32\x26\x3c\xc6\xe6\x24\xeb\xaa\x81\xfe\xcf\xae\xe4\xb4\x3c\x35\x4d\xe7\xde\xee\xba\x9d\x7d\x3a\xb9\xe7\x12\x13\x5a\x86\x52\x3a\x48\x49\xaf\x4b\x5d\xb7\x17\x2c\x6f\x42\x4b\x26\xa5\x13\x64\x73\xe5\xa3\x59\x79\xd2\xf9\x47\x92\x8a\x51\x6d\xdd\x5b\xe5\x8d\xc5\x4d\x0f\xe6\xa5\x02\x87\xf6\x3b\x5b\xbe\x87\xbc\x6c\xa7\x79\x7c\xad\x23\xe7\x04\x94\x5d\xa0\xe2\xc1\x9e\x8e\xc5\x70\x10\xa2\x69\x2d\xc2\xc4\xf8\x1c\x85\x07\x5d\x4c\xae\xa5\xc3\x73\x1a\xe3\x19\xeb\xa6\x2a\xa1\x98\xd7\x97\xa4\xc1\x5e\x97\xa0\xa7\xf3\x7a\xea\x66\xf7\x6a\xea\x95\x6b\x8c\xac\x0e\xc6\xea\x69\x74\x47\x28\x2d\x00\xda\x81\x44\xf2\x6a\x48\xee\xe0\xc6\x18\xe0\x54\xce\x28\xae\x31\x84\x0b\x0c\x42\x8b\xf8\xf6\x30\xd9\x85\x57\xb1\x9e\xa5\x57\x19\x5a\x24\x0c\x78\x42\x6e\x4b\xb3\xaf\x7e\x75\x41\xf9\x78\x0d\x4f\x7e\x86\x5b\x45\x00\x59\x9f\xe1\x4e\xc8\x02\x4e\x68\xcb\x9d\x6f\xaa\x9c\x73\x3d\x90\x25\x56\xcf\x54\x9e\x3e\x07\x9f\x18\x23\x30\x7c\xd0\xb2\xbe\xc4\x76\x58\x9c\xc4\x08\x53\xd7\x6f\xab\xaa\x52\x53\x52\xf2\x58\xe5\xbe\x2e\xeb\x06\xc5\x41\x18\xf8\xc6\xea\xaa\xb3\xf7\x16\x71\xdd\x39\xfa\x93\xf6\xbf\xf1\x3c\xc7\x38\xb2\x2b\xe4\x61\xfd\xb8\xfb\xd9\x53\x11\x60\xac\x33\x4a\x7c\xe4\xcd\x06\xeb\x8f\xfc\x5a\x99\x0f\x13\x96\x10\x72\xc8\xaf\x68\x4c\x12\x49\x7b\x23\x39\xa3\x77\xf9\xef\x07\xf8\xed\xb2\x39\xe3\xd7\x98\x4a\x9b\xce\xda\x61\x67\x62\xfa\x87\xe5\xc6\xe6\x72\x36\xd5\x87\x2d\x25\x4f\x88\x33\x30\x8b\x23\x6a\x6d\xa5\xfe\xc3\x7b\x5b\x41\x1e\x5f\x59\x04\xb1\xc4\x81\xca\x37\xc5\xbc\xde\x1a\xa1\x30\x31\x55\xea\x74\x55\xd2\xca\xb8\xaf\xda\x16\xbd\xca\x6f\x77\xd8\x50\x26\xfb\xe6\x79\x39\xc2\xd0\x20\x70\xc5\xcf\x5d\xcf\xf9\xe1\x74\xe8\x8c\x63\x5e\xbe\x7d\xab\x60\xd2\x12\x8b\x52\x26\xe8\x75\x41\x1f\xd0\x43\x9a\x50\xa2\x04\x5f\xf2\x7f\xbe\xdb\xf4\x4c\x4d\x73\xd8\x09\x54\xa9\x32\x69\xaf\xe4\x57\x12\x50\x85\x3a\x2c\x5d\x68\x75\x9e\x3e\x4a\x25\x04\x92\x75\x9b\x77\x5e\xbe\xf5\xd8\xeb\xf3\x20\x0d\x56\xd3\xa9\x73\x46\xea\x1a\x3e\x29\xfd\x31\x4b\xec\x3a\xbe\x0d\x64\x56\xef\xec\xdb\xab\xa7\x9a\x13\x88\xc0\xe9\x55\xec\xac\xd5\x1e\xcd\x43\x93\x24\x5e\xe8\xfd\x47\x55\x9c\x0e\x56\xc2\xd5\x77\xd6\x8d\x5f\x93\x81\x88\xa4\x1f\xe9\x53\x3e\xe4\x05\x36\x6d\x75\x4e\x41\xa0\xd1\x40\x9f\x42\x41\x49\xb6\x77\x0c\x38\x37\x81\x08\x68\xaf\x3b\x56\x47\x2a\x56\x75\x3b\x94\x72\x8c\x76\x4d\x3f\x08\x02\xe6\x05\x72\x27\xe7\x87\xa9\xa3\x29\x6c\xff\x1d\x31\xc7\xa6\xe3\x0f\x49\xdb\xaf\xb3\x45\x18\x61\x56\x0c\x0b\x2d\x03\x71\xf7\x16\x4f\x3a\x27\x83\x57\x4d\x44\x18\x85\x89\xc2\xd4\x17\x83\x09\x16\xd1\x79\x0e\x37\x95\xc6\xe6\xc9\xcc\x3a\xad\x26\xd2\xa9\x67\xfd\x3b\x57\xf5\x56\x50\xf7\xc5\xe3\xfe\xce\xd2\x2c\xa0\x30\x70\xf1\x30\xba\x2f\x1e\xc5\xe4\xc4\x11\x21\x7f\xa9\xf3\xee\xb3\x4c\x1b\x7e\x4d\x16\x63\x08\x3d\x4e\x6e\x43\xd6\xe4\xd9\x42\xd0\xfc\x75\xb2\xcc\x50\x4a\x31\x2f\x1d\x7b\x1d\x65\x4a\x46\xc0\x1f\x93\x29\xc3\x02\x7f\xb3\xe5\x07\x34\xd8\xfc\xcc\xdb\xfd\x06\x8b\xc2\x46\x94\xe7\x59\x67\x20\x0c\xad\x76\x67\xe7\x89\x10\xdb\xa8\xff\x25\x48\x04\xa5\x31\x2c\x7e\xbc\x6f\x95\x32\x90\x19\xa6\xbd\xc6\xfa\x1d\xe2\xf7\xaa\xd0\xd5\x47\xef\x9d\x18\x00\x4e\x61\x5e\xde\xb8\x9c\xe7\xd4\xed\x36\x52\x70\x02\x6a\xf8\x22\xc5\x66\xc6\xf7\x9d\xdf\x8d\x8d\xd4\x2a\xb2\x34\xc4\x16\xcc\xb2\x33\xd8\xbf\x1a\x89\x16\xaf\xb3\xfd\x85\xdd\x67\x25\xec\x8c\xb7\x1a\x46\x41\x46\x7c\x0c\x75\xfe\x81\xed\xbf\x5f\xa6\x3c\x60\x7f\x11\x43\xbb\x8b\xe8\x50\xf8\xb2\xa7\xeb\xad\xb2\x16\x68\x48\x28\x2d\x8c\xce\x22\xaa\x99\x17\xd0\xb4\x77\xe8\x5c\xad\x09\x83\x97\x30\x26\x8a\x71\x00\x31\x1c\x1d\x92\x16\xd7\x41\x7c\x13\xcf\xd4\xe8\x41\xa1\x8e\x3d\x0e\x41\x10\x0a\x12\x95\x5a\x94\x2d\xd4\xaa\xcd\xcf\xbc\x76\x10\x04\x00\x16\xe6\x4d\xad\x07\xce\x72\xce\xd8\x0d\x08\xc2\x84\x2b\x7d\xce\x38\xad\x27\xbd\x90\x10\x84\x32\x22\x23\x72\xbb\xd8\x0c\xa6\x72\xf7\x77\x88\xac\x01\x29\x49\xbf\xd4\xad\xe7\xe1\x87\xea\xd6\xb4\xa4\x67\x70\x9c\xdb\x47\x5b\x1d\x76\x07\x23\xee\xe4\xc5\x7d\x19\xfb\xa6\x3a\x1c\xab\x53\xd9\x37\x5b\xce\xfa\x0f\x10\x44\x1a\xe4\x30\xc5\xb2\x39\x49\x9d\x7f\x34\x63\x58\xaf\x1f\x6b\xac\xce\xea\x66\x5f\xfd\x5a\xdc\xfe\xf0\x3f\x1d\x6b\x96\x0e\x6b\x1c\x2f\xe8\xc0\xdf\x73\xae\x04\x04\x31\x5a\x46\xb8\x37\x6c\x09\x44\xfb\x9c\xff\xc6\xe2\x66\x58\x0d\x70\x03\x93\x30\x8b\x87\xdd\xd9\xbe\x53\xea\xaf\x92\x36\xd3\xff\xb6\xc0\xea\xf3\x6a\x86\xa0\x0b\x99\x7a\x39\xe1\xaf\x90\xef\x6e\x7c\xca\x18\xd5\xeb\x56\xaa\x3a\x82\x7a\x57\x83\xc9\xc1\x59\x98\x39\xe3\xb8\x9e\x3e\x00\xe7\x86\x14\xda\xbc\xce\x6b\xfc\x5c\x57\xff\x42\xd5\x8e\x3e\x3d\xcf\x42\x08\x7d\x27\x17\xc1\xc1\x6f\x7c\x27\xaa\x1f\x21\x14\x55\xfc\x5f\x8f\xfa\x4a\x59\xf1\xca\x6d\x67\x5c\x52\x0c\x72\x57\xe0\xef\xbb\xbc\xb5\xf1\x4a\xe3\x2f\x2b\xa2\x8c\x1a\x91\xdf\xba\x99\xda\x6c\x4e\xa5\xae\x7e\xf5\x77\x25\xe2\xd0\xb1\x18\x97\x7a\xad\x97\x9f\xdf\xab\xa6\x7d\xae\xea\x76\x0e\xc2\x0d\x01\x08\x41\xa6\x7c\xfd\xf1\xf9\x27\x91\x42\x0e\xfb\xf1\xba\xc3\x8a\xcc\x1b\xf5\x06\x34\xd7\x9a\xb8\xdc\x60\x19\x66\xdc\xd5\xb5\xed\x4e\x3d\x3f\x8b\x64\x6c\x69\xfd\x49\x8d\xf0\x06\xea\x66\xad\x7f\xfb\xdf\x53\x01\x10\xba\xaa\x7b\x32\xdb\xb4\xbb\x69\xeb\x17\x34\x7f\x8c\x7e\x48\x85\x98\x32\x47\x27\x43\x91\x6f\xfd\x5e\xe0\x98\xf8\xf6\x3f\x7a\xc7\x79\xfe\xcf\xfe\x4a\x2c\x60\x36\x2f\x5b\x5a\x09\xf8\xfe\x46\xd2\x20\xb4\x89\xc7\xdf\x9d\xc3\x34\x80\x2a\x41\xa0\xb8\x75\xd8\xe4\xe9\xf3\x0b\xa5\x51\x3f\x58\x58\x1c\x5e\x37\x64\xc8\xa0\x41\x5c\xb9\x7f\x91\x5c\xf1\x97\xd0\x5c\x05\x9e\x01\xb2\xdb\x0b\xef\xa1\x9d\x84\xd2\x10\xe8\x20\x24\x67\x6d\x47\x1c\x4b\xbf\xaa\x61\x49\xb2\x3b\xaa\x3d\xa5\x7d\xef\xb8\x9c\x05\xa5\xfd\xa0\x14\x63\xa7\x95\x94\xf7\x22\x44\x10\x68\x91\xa4\xf1\xa0\x39\xfb\x90\x97\x33\x22\xde\x10\x68\x65\x49\xf1\x0f\x39\xb1\xca\xf7\xaf\x12\x13\x45\x9b\xf4\x8f\x1c\x7f\xb9\x65\xd4\xcf\x64\x13\x5a\x9a\x2d\x07\x99\x70\xfa\x9e\x03\xf6\x76\x08\x0c\xa6\x0c\xfa\x46\xdd\x07\x3c\xe0\xf9\x6c\xe4\x14\x9f\x34\x14\x85\xbe\x40\xf9\x9e\x97\x6f\xae\xb8\xe1\xaa\xf0\x7f\xe3\x1f\x7b\xb1\x30\x8c\x85\x1e\xb4\xa2\xac\xca\xb6\xfe\xb4\x1a\xd0\xfd\x0f\x86\x51\x18\x7b\xf2\xd7\x87\x33\x60\xca\xbf\x81\x30\x92\x59\xe8\x08\x02\x1c\x8f\x65\xe7\x91\xf5\x27\x1b\x49\x05\xe5\x43\x5e\xda\x39\x73\x83\xbd\x14\x27\x84\x89\x6b\x9a\x24\xea\x88\xc9\x32\x0c\x13\x23\x3d\xa9\xe3\x0d\xb1\xda\xfc\xba\x02\xbc\x84\x30\x8d\xb8\x71\x43\xbf\xdd\xe2\xa1\x52\xcd\xa3\xbf\x4a\x2a\x90\x1c\xef\x1f\x55\xa5\xdf\xc1\xff\x95\x2b\xf0\xcf\xbd\xac\x7e\x5f\x82\x67\xcf\x97\xce\x92\x80\xb2\x41\xae\xb6\xdb\x90\xf4\xe0\xb0\x9e\x06\x61\x96\x86\x60\xb5\x36\xab\xce\x10\x92\x98\x89\xeb\xba\xff\x12\x05\x07\x61\xa6\x21\x72\xf9\x8b\x6f\x58\xfa\xf1\xa3\x4c\x1c\x84\x19\xda\x24\xc7\x91\x32\x1c\x03\x47\x1e\x42\xc1\x04\xfd\xf2\x7d\xf5\xb6\xc4\x6e\x27\xd3\x88\x07\xd4\x53\x48\xc3\xe4\x57\x45\x94\x91\x52\x08\xb9\x6f\x37\xa7\x76\x4a\xa6\x08\x21\x30\x24\x73\xda\xed\x03\xc5\x33\xe4\xe8\xc4\x85\x4c\x5e\x1f\xc6\xec\xee\xc3\x1c\x1b\x84\x10\x05\x44\x2a\xe0\xb7\xd6\x9b\x7d\xae\x48\x65\xb1\xba\xd4\xf8\x1c\xdf\x13\xc4\x82\x94\x01\x68\x63\x5d\xfd\x46\xd5\xbf\x5d\x10\x71\xe4\x6a\x37\xff\xcc\xf1\x1d\xcb\xfd\x29\x9f\xf8\x29\x21\x80\xed\x8d\x3c\x27\xf3\x1d\x47\xe7\x48\x77\x0a\x42\x90\x8c\xf8\xb9\x35\x71\x3f\x2c\x3f\xff\x89\xf5\xb8\xd9\x1a\x42\x50\x89\x95\x0a\xb5\x68\xee\x9f\xfb\x2e\xac\x9d\xdf\xbe\xfc\x19\x3a\xf2\xb8\xaa\x67\xa8\xdb\xce\x45\x70\x91\xd4\x70\x7c\xe8\x87\xcb\x20\x25\x78\xc1\x82\x2c\xa2\x8b\x77\x9e\x0b\x98\xef\x18\x84\x50\x26\x00\xdc\x4b\x34\x5a\x6a\x35\x22\xeb\xf1\x0e\x3c\x84\xd2\xa4\x84\x7f\x31\x75\x75\xa5\x62\x08\xa1\x8a\xa4\xf4\xb5\xd6\xc7\xaa\x24\xa2\x92\xbc\x7c\xfb\x51\x51\xb7\xc1\xdb\xbe\x5f\x75\x2a\xcb\x44\xe2\x53\x6a\xb9\x42\x57\x06\x99\xbc\x25\xcd\x02\x12\x74\x32\xd3\xaa\x2e\x84\x3a\x35\x44\x5c\xa9\xab\xce\x0e\xb8\x26\x94\xc9\xf7\xc2\xc4\x96\xa7\x3b\xab\xe9\xc0\xb1\x9f\xab\xed\xf7\x95\xd3\xff\xbe\xf2\x0c\x28\xb8\x6f\xe7\x7a\x76\xc2\x83\x43\xd7\x24\x44\x60\xa4\x53\xaf\xa1\x85\x07\xdf\xcf\x7e\x0d\x45\xd7\xdb\x2f\x94\x19\x6d\x6c\x36\x5f\x0d\xc3\x84\x02\xb0\x40\x58\xba\xf4\xe5\xa9\x28\xf0\x77\xee\xff\x1c\xc6\x16\x28\xd8\xb9\xdd\xdf\xab\x7e\x74\x98\x04\x41\xd2\x23\x17\xba\x39\x76\x02\x07\x62\x99\x7d\x22\x16\x26\xa9\xab\xff\x6b\x2c\xab\x43\x5e\x4e\x33\x97\xc0\x42\xce\x69\xca\x3e\x6e\x9e\xef\x9c\x1a\xe4\xd7\xde\x1f\x0b\x85\xa4\x2d\xe9\xbf\x2c\x39\xe7\xf0\x15\xb1\x28\xe4\x03\xd8\xad\x5b\x24\xdd\x77\x7a\x41\x85\xc7\x7c\x2a\x65\x02\x2c\x62\x4c\x59\xaa\xf3\x66\x72\x25\xc1\x1c\x43\x73\x51\xfc\x31\xa8\x24\xdb\xbb\x19\xd3\xb3\x03\x8b\x83\x88\x32\x46\xe7\xac\xf0\x47\xc8\xfd\xa5\x12\xc6\xc9\x1e\x49\x68\xd5\xde\xe7\xb0\xd9\x74\xab\x65\x49\xca\x89\x27\xe8\x17\x75\xc7\xbc\x6e\x6e\xf3\x72\xfb\x6d\xd5\x5f\x84\x87\x60\x5c\xaf\x0e\x6a\x17\x97\x37\x13\xe6\x0c\x60\x89\x34\xe4\xfc\xaf\x4b\x75\x92\xd0\x56\xf5\xb7\xa2\x92\x50\xf4\x20\x61\x60\x09\x0a\xe5\x17\x80\xab\xb4\x90\x5c\xcc\xf5\x42\x20\xb0\x34\xb2\x1e\x9c\xcf\x6a\xde\x56\x87\x2e\x8c\xa6\x17\x32\xb6\xe6\x2c\x4d\x94\x6f\x75\xf0\x38\xa8\xe3\x40\x54\xdb\x8f\xe2\x16\x87\xfc\x66\x15\x4c\x6a\x3d\x80\x0f\x03\xe3\x71\x26\x87\x78\xbc\x45\xa9\x9d\x90\xed\xdf\x2c\xd5\x4c\x66\x0c\x4f\x15\x35\xf7\xda\x54\xd1\x36\xc7\xda\x65\xcf\xe6\xf7\x44\xc6\xb3\x84\x76\x24\x53\x9c\x9a\xfd\x77\x97\x04\xe8\x5f\x20\xcf\x0c\xa1\x31\x7e\x40\x99\xb7\x9f\xaf\x2f\xf7\xfd\x01\xc9\x88\xe4\xe1\xfe\xa4\xde\x9b\xd1\x64\xe2\x28\xc9\xf1\xb4\x36\xf7\xde\xda\xa6\x6b\x81\x93\x3b\x27\x0b\x8d\xb6\xef\xbc\xac\x4e\x94\xbc\x19\x68\xdf\x01\xcb\xb4\x45\xba\x6d\x56\x7f\xde\xc0\x31\xf7\x82\xea\xfe\xb0\x60\xa9\x87\xab\x39\xe4\xfd\xa8\x7c\x08\x4c\x28\xb0\x4d\xe6\x27\x63\xb0\x1e\x5b\x05\x60\x46\x58\xe5\xc0\xd2\x46\xe5\xe3\xd7\x03\xca\x18\x33\xe4\x0a\xb5\xd1\xe9\xcf\xbc\xdd\x57\x27\xdb\xb2\x34\x39\x43\x9a\x80\x8a\xd1\xc7\x1a\x75\xae\xda\x67\x50\xef\xd3\x21\x2a\x8c\x3c\xdf\xa3\x9b\x37\xff\x79\xca\xd5\x3b\x09\x73\x0f\x50\xea\xc0\x94\x16\x3a\x3a\xdb\x33\x8a\x27\xfa\x63\x68\xc8\x77\x7c\xa0\x1a\xc1\x4f\xa8\x27\x3e\x17\xd3\x49\x12\xc1\x90\xec\xc2\xbf\xd5\xeb\x00\x09\x60\xda\xe8\xe0\x4c\x55\xed\x74\xf0\xea\xc9\x8c\xd6\xc6\x98\xd0\xf6\x7f\x9b\xaa\x7e\xf7\xb9\x5e\x60\xc8\x4c\xdc\xb7\xbb\xdb\xf6\xee\xfb\x4a\xbd\xbf\x1e\x87\x75\x7d\x60\x98\x29\x5a\x96\xdd\x63\x4d\xfd\x1c\x37\xc4\xb0\x8c\xba\x51\xef\x1e\x6e\xbe\x00\xda\x00\x33\x09\xd0\x74\x7f\x3e\xc9\x17\xfc\x17\xb1\x9a\x4c\x42\xbc\x7e\xa0\x22\x37\x68\x07\x5a\x93\xd4\xea\xf4\xa1\x4c\x6a\xb5\x38\xfe\x89\x6d\x0b\xdd\xfc\xf1\x77\x6b\x74\x92\xc5\xfd\xf4\x3a\x40\xe7\xdb\x3d\xf7\x1b\x45\x14\x24\x16\xbf\xb3\xac\xaa\x03\xa1\xfc\xa9\x85\xbc\x8b\xb6\xce\x36\xe6\x5a\x98\x74\xde\xf8\xa3\x00\x18\x77\x6d\x39\xdb\x37\x5c\x34\x5d\x24\x61\xf5\xa8\xdc\x80\x30\x4a\x28\x4f\xb3\x7a\x58\x6f\x36\xeb\xa7\xc7\xdd\xdd\xd3\x0b\x61\x6b\x09\x6a\xcb\xfa\x61\x89\xb2\x39\xef\x02\x9a\xfd\x66\x44\xf5\x3e\x7a\xde\x28\xcc\x42\x0c\xa6\x72\xf7\xa7\x11\xc7\x79\x3f\x92\x93\x83\x40\x09\xac\xeb\xd4\x34\x10\x31\x96\x91\xb4\xb7\xcf\x53\x5b\x08\xd6\x43\x5e\x8c\xf9\x02\x21\x62\x49\x4c\x49\x6b\x4d\x69\x37\xda\xdb\xc7\x7e\x78\xc4\xd2\xd0\x62\xba\xf2\x0f\x74\x70\xa8\x7f\x5f\x52\x6b\x43\x14\x05\x49\x1a\x39\x12\xa9\xb9\x89\x14\x45\x90\x51\xa9\x78\xf7\xe6\xb0\x14\x3f\x90\xb2\xb0\xd7\x82\x84\x28\x8e\x34\x73\x00\xb4\xf5\xcd\x93\x6d\x4a\xbc\xde\x68\x0e\x51\x0c\x81\xe5\x5a\x6a\x29\x7d\xb6\x2b\xf1\xf7\x24\x79\x15\xc5\x18\x92\xfe\xcb\xcf\xbc\xc4\xb1\x7c\xb1\x1b\x90\x30\xab\x27\x55\x9e\x0e\xb7\x28\x87\x64\x61\x7e\x80\x34\x86\x79\x8d\xfa\xe3\x45\x19\xfb\xeb\x3d\x21\xf2\x39\x24\xbb\xa8\xfb\x0a\xcf\x97\xf4\x16\x10\xa5\x49\x8c\xfc\x0c\x68\x1c\x1a\xa6\x28\x4d\x45\xa2\xfa\x8e\xe9\x67\x02\x17\x4f\x1e\x3a\xcd\xac\xee\x75\x0d\xa5\xf6\x11\x5c\xc4\x41\xa0\xec\x65\xdd\x9f\xb1\xbe\x99\x56\x29\x20\xe2\xda\x50\x6b\x8e\xaa\xab\x66\x2c\x65\x04\x11\x37\x5c\x7b\x3a\x97\xfa\x63\x62\xcb\xa3\x2c\x8d\x45\xea\xbd\xf7\xa6\xf9\x55\x9d\x4b\xcf\x43\x5b\x10\x09\xa6\x7c\x0b\x5c\xb7\x54\xb7\x4f\x93\xb7\x2d\x9c\xf4\x8f\x19\x12\x96\x4c\xde\x29\x44\xc6\x6a\x65\x1d\xe1\x93\xf8\x81\xda\xe5\xa7\xf7\x54\xae\xac\x38\x80\x94\x6c\xd5\x3d\x96\x43\x0c\x3a\x44\x32\x51\x54\xcc\xdc\x43\xf3\x82\xc5\x20\x28\xfb\x8f\x91\xc8\x9e\x1b\xad\x78\xe2\x69\x7b\x5f\xd0\x98\x0b\xf4\x2b\x44\x24\x13\xd6\x99\xa4\x97\xa7\xc7\x7f\xae\x2e\x60\xbb\x10\x29\x11\xc6\x3d\x03\x88\x13\x31\xa3\x7c\xc1\x95\x87\xd5\x3a\x24\xd1\x4d\xaf\x05\xd8\xe3\x13\xc7\xbf\x8b\xae\xb1\xeb\x16\xaa\x97\x53\x81\x8d\xc7\x85\x4d\xf6\xbf\x08\x43\xcb\x5a\x93\xab\x2a\x1c\x05\x75\x11\x26\x91\x3d\xd2\x5c\xa8\xf3\x42\x64\x54\x40\xe5\xab\x1b\x5b\x48\x77\x38\xcc\x85\x22\x52\xe6\xbc\xd9\x1f\x2e\xe6\x52\x1c\xb0\x8c\x9a\x3d\x97\x20\x3f\x97\x55\x5d\xce\xe6\x10\xe3\x30\x0e\x02\x37\x6f\xc8\x9f\x0d\xc3\x51\xba\x2e\x0e\x75\x48\x8e\xe6\xe6\x61\xdb\x05\x49\x84\xcf\x70\x36\xde\x8d\x60\xcc\x8a\x81\xdf\x2f\xb6\xeb\x87\x55\xff\x57\x30\xbd\xea\xc7\xaa\x56\x2c\xd8\x56\x36\xa3\x31\x7e\x6f\x71\x94\x05\x54\x28\xda\x60\x61\x6e\xb1\x51\x44\xe8\x92\x57\xd3\x64\x66\x1c\x89\x0c\x2d\xb9\x18\x21\xf1\xfe\x1e\xfc\x07\xe2\x48\x86\x34\xbd\xa0\x3e\x7c\x6e\xa0\xc5\x22\x6f\xb1\xb9\x94\xd3\x80\x38\x0e\x42\xda\xd7\x73\x97\x11\xec\xf6\xca\x17\x34\x76\xe5\xcf\x46\x3d\x71\x1c\x4a\xa2\x73\xb5\x4c\x3c\x84\x2c\xa4\xda\xc8\xf4\xca\xa9\xd6\x63\x8a\xb3\x59\x4d\x39\x88\xe3\x0c\xb2\xac\x97\x73\xa2\x5c\xd2\x6c\x7b\x24\xc4\xb1\xca\xd0\x73\x3b\x5a\xe8\xd0\xba\x6c\xf1\xad\x9b\x96\x34\x41\x62\x2b\xcb\xe6\x46\xa7\x18\x13\x9e\xed\xe6\xe5\x69\xb3\x58\xbf\xec\x7e\x3c\xbd\xde\x7c\x5f\xbd\x0c\x69\xa6\x20\xe6\x31\x33\x3e\x1f\xfe\x38\x79\x82\x8c\x31\x4a\x22\x7e\xc3\xd6\x09\x1b\x94\xed\xb0\x54\xd8\x8d\xc8\xc8\xaa\xec\x4c\x5e\x8e\x3b\x2a\x20\xce\x92\x8c\x22\x1a\xfc\x00\x75\x3a\x17\x59\xc6\xcf\x9e\xc9\x80\xa2\xd7\x06\x5b\xcf\x9c\x7a\x25\xe0\x75\x27\x88\x28\xa3\x56\x68\x2a\xbc\xdb\xa8\xc1\xbb\x62\xb1\x70\xb9\xae\x5f\x98\xdf\xd5\xd5\x61\x4c\x2f\x04\x31\x04\x4c\x58\x6c\xd3\xef\x45\x5e\x9f\x55\x5b\x20\xee\x3c\x58\x6e\xb9\x4d\xed\x5d\x52\x3d\xef\x4a\x81\xc3\x9f\x13\x69\xe2\x3e\xfe\x95\x97\x45\xd5\xf4\x3f\x22\x59\x90\xd9\x48\xf1\x03\x8b\xaa\x87\x3c\x41\x2c\x63\xa3\xd3\x7e\x43\xfa\xe3\x82\xba\xc1\x0f\x53\xa9\x4f\xb4\x2f\x4f\x75\x9d\xb7\x15\x25\x9d\xc7\xbf\x2d\x75\x42\x22\xe7\x04\x9d\x7a\x21\xc8\xde\xa4\xc3\x01\x62\x95\x19\xf2\x26\x9e\x4a\xdc\x12\x40\xbd\x2f\xa2\xc4\x4a\x9a\xd4\xa9\x42\xbe\x0e\x3d\xa1\xd1\x0a\xd2\x61\x4c\xca\x9d\xdf\x7e\x7e\xbb\xfb\xca\x1d\x8d\x31\x60\xc4\xd2\xf2\x7f\x4e\x67\x82\xfa\xf9\x4d\x39\xc6\x38\x4b\xad\x38\xfb\xcd\xf6\xe9\xe5\x9f\xeb\xfb\xfb\x85\x97\xac\xf6\xf7\x66\x02\x41\x76\xdc\x65\x0b\x4f\xcd\xfe\xca\x2a\x34\x26\x25\x5e\x80\xa3\xd3\x83\xdd\x4c\x9a\x47\xa1\x73\x30\xa8\xd4\x63\x4e\xa5\x72\xc1\xcb\xa2\x7e\x3b\x1d\x06\x19\xdc\x84\x29\x45\x19\x3f\xd7\x07\x95\xcb\xc2\x42\x96\xbf\x50\x0d\x9d\xbd\x9d\xa4\xf3\x55\xc1\xba\x96\x3b\xd9\x6f\xcf\x49\x24\xb8\xa3\xc9\x2f\x15\x16\xe7\xfa\xf5\x70\x15\x25\x71\x12\x10\x26\x14\xca\xcf\x9d\x72\x7c\xa5\x5e\x33\xa5\xd9\x7d\x9e\xaf\x16\x27\x31\xb1\x0a\x39\xa6\x06\x1f\x3e\xf7\xf2\x13\x57\x6e\xd5\x9f\x8d\x40\xa8\x19\x02\xf6\x3c\x99\xf1\x7c\x49\x92\x38\x24\x6e\xcd\xce\x97\x7b\xa9\x4e\xa5\x13\xab\xf1\x13\x3b\x49\x12\xe3\xd3\x84\xeb\x32\x1f\x6b\xc5\xf7\x63\x32\x49\xc8\x81\x6e\xca\x76\x86\x9c\xea\xfa\xe3\x9b\x48\x44\x12\xab\x41\x9f\x94\x25\x03\x9f\xdc\x4b\x1a\x06\x84\x46\xb2\x9d\x15\x47\x6f\x52\x92\x34\xb4\x5d\x3b\x7f\xe6\x78\xd8\xd6\xf0\x08\x87\xc7\xfd\x09\xca\x61\x53\x07\x24\x5c\xa4\x94\x8a\xfd\x56\x57\xa7\xe3\xf2\x34\xd9\xb0\x93\x2c\xe1\x04\x87\xb7\xe5\xb9\xbb\xaa\x3e\x1d\x26\xbf\x9e\x65\x26\xb4\x10\xc0\x82\x0a\x27\xf3\xbe\x62\x92\x81\xbd\x49\x0b\x95\xac\xff\xec\xab\xdb\x49\xa6\x2d\x86\xf0\xee\xf5\xf1\x76\x73\xfe\x23\x84\x30\x4d\x5d\x4d\xee\x4d\x98\x98\x00\x0b\xe7\xd2\xae\xea\xfc\xb9\xc9\xb6\x31\x99\x79\xc2\x40\x46\x5e\xd9\x39\x7b\xac\xb7\xd5\x6c\xf2\x36\x81\xc8\xf6\xb4\xe4\x8d\x83\xef\x9c\x49\xa5\x67\x57\x6c\x02\x91\xf1\x39\xcb\x5b\xf8\x6c\x3a\x17\x13\xf5\x26\x2f\x15\x92\x56\x1c\x99\x1e\xa7\xd0\xe2\xcf\xc8\x04\x05\xfa\xbe\xf3\xa2\xd9\xa3\x63\x58\xeb\x17\x1d\x68\xd0\xea\x2c\xf5\xbd\x6a\xf7\xcf\xa7\x22\x57\x0e\xeb\x34\x79\x27\x32\x66\xe4\x41\x16\xd5\x5b\x36\x5a\xde\x32\x66\xc4\xa9\xf4\x5c\x15\xb9\xc2\x9d\x8f\x06\x13\x99\x01\xd5\x6f\x5f\x56\xdf\x5e\xef\x17\x2f\xbb\x9b\xc5\x76\xf5\xed\xe9\xe5\x1f\xfe\xb8\x0a\x12\x7a\x5f\xae\x22\x62\x0d\xbe\x9d\xce\xaf\x65\x9b\x17\xfd\xb8\x30\xf1\x49\x8d\x2e\x30\xa5\x26\xd7\x61\xf5\x22\x51\x1c\xa2\xd8\x0b\xe7\x95\x7a\x46\xc4\xb3\x1b\x63\x19\x12\x6d\x5a\x6f\xb4\x41\x26\x3a\xc8\xa8\x1f\x11\x46\x9b\x51\x82\x32\xc1\xd0\xb3\x5a\x5b\xda\x9a\xc9\x2b\x31\x31\xa3\xc2\x20\xd8\xbc\x0c\x94\x6d\xbf\x07\xa6\x01\x57\xb4\xc8\xfd\x14\xda\x91\x3e\xe8\xd7\xd5\x8b\x34\x30\x31\x31\x46\xba\xcc\xcc\x5a\x0d\xf1\x56\x90\x86\xcc\xe2\x68\xec\xd6\x75\xf7\xb2\x18\xdf\x4f\x1a\x26\x69\xea\x3b\x2e\xee\x20\x2f\x6c\x0f\x6b\x67\x72\xef\xaa\x1a\xf3\xb7\xf2\x19\xba\xcb\x3e\x56\xed\xba\x7c\x6d\xce\x97\x4d\x32\x2a\x55\xe4\x2d\x1e\xd6\xfd\x03\x84\xca\x0a\x0f\x74\x17\xdb\x9c\x64\xff\x67\x14\x54\x00\xb0\x0a\x1a\xdf\xa1\xd9\x0f\x58\xf3\xc7\xba\xfb\xb3\xb5\x9d\x94\x85\x40\xec\xde\xb7\xab\x1f\xab\xfb\xa7\xe7\xd5\x8b\xdf\x79\x6e\xfd\x4f\xb0\xd4\xf6\x0c\xa1\xf3\x1b\x16\x1a\x8e\x2d\xd6\x63\x8f\x3c\x65\x99\xa2\x82\xb9\x87\x49\x0c\xa3\x9a\x34\x62\x36\xcb\x23\xbb\x0f\xf3\xf9\x0c\x79\xff\x58\x91\xb0\xa0\xaa\x37\x6c\x1f\x4f\xff\x82\x31\xb8\x07\xd2\x08\x92\xc4\x45\xe0\xdf\xab\x16\x8b\x91\xc2\x3b\xa4\x91\xb4\x34\xf2\xa6\x73\x78\x08\xfd\x7b\x81\xdf\x48\x23\x13\x58\x26\x84\xf5\xe6\x86\x82\x1f\x4a\x92\xec\x9e\x1e\xfd\xde\x9a\xc6\x22\x20\xf8\x39\x5a\x65\xff\x3b\xa7\x62\xdd\x1f\x76\x38\xb6\x09\x00\x64\x62\xc1\xbb\x61\x54\x61\xf9\xc8\xf1\xd7\x63\xb7\x59\x10\xad\x3a\x5e\x8c\xd2\x99\x8b\xd8\x1e\xab\xf6\x19\x3e\x49\x97\x63\x2a\xb8\x01\x69\xac\x74\x14\xf7\xe9\x3e\xe2\x6d\xee\xdf\x59\xc2\x32\x35\xd4\x3a\xf2\xfa\x0a\x3d\x39\xfa\xdf\xab\xc5\xa7\x69\x6c\x53\xe2\xf3\xcc\x27\x7e\x50\x86\x54\xd7\x7a\xf8\x5c\xbd\xdc\x74\x61\xcb\x55\xb6\x85\xe9\xd5\x41\xd0\x16\x2f\xbb\x35\xde\x9e\x24\x5e\x17\x5a\xf8\xc2\x8d\x4a\x79\x60\x75\x17\x9c\xf0\x5c\x8d\x77\x75\xf5\xef\xf3\xcc\xe2\xa9\xb5\x76\x47\x47\xd5\x88\x07\xdb\x90\xef\x8f\x67\x22\xb5\x1c\xe4\xbd\xca\xc1\x0b\xb4\x17\xdf\x2e\x03\x4b\xc5\xe6\x12\xd5\xd0\xb4\x3f\xf3\x81\x98\xc9\xdf\x6e\xf0\x86\x54\x64\x56\x79\x8e\xf6\xff\x7e\x17\xf1\x26\x3e\x15\x42\x5b\xa1\xcf\xce\x2b\xd3\x76\x9f\xb0\xb0\xfb\xf1\x0d\x09\x8c\x98\xcd\xf6\xfe\x1e\x2d\x24\xd0\xa1\x18\xea\x53\x13\xa7\xb7\x2d\x1f\x7d\x83\x66\x64\x9d\x40\x87\xe8\x08\x8e\x2d\xd9\x7b\x3f\x60\x7c\xc7\x92\x33\x62\x85\xf8\xaf\x2e\xbe\xac\x46\x9a\xe4\x90\x2a\x1e\x07\x81\x77\xbb\x3f\xb1\xde\xe4\x6f\x25\xb4\xa7\x7a\xd4\xf5\x07\xa9\x32\xdc\x66\x5b\xba\x78\xef\x67\x5e\x5e\x68\x66\xcf\x11\x73\x74\xa7\x69\x5a\x32\xae\x28\x3b\x9c\x5b\x6e\x84\x4e\x2c\x9c\xf3\x42\x50\xb0\x3f\xae\x03\xe7\x36\xd9\xad\xca\x6e\x5b\xeb\x92\xbc\x9c\xdd\xbc\x8f\x9c\x9a\x8c\xd1\xef\xbe\xdc\x0e\xc1\xf0\xc0\x83\xd8\x2a\x1d\x74\x4b\xb7\x6c\x0b\x9b\x27\x6f\x54\x8e\xa5\x42\x36\x1e\x99\xb1\xc8\x69\xe3\x96\x58\xf4\x7f\x15\xe0\x8d\xd9\x1d\xe2\xe8\x84\x30\x08\x28\x34\xd9\x83\x75\x31\xba\x05\xbb\xad\x5e\x50\xe5\xf8\x31\x09\x01\xc7\xfe\x14\x0f\xe3\x80\xf2\x09\x56\xb8\x9c\x34\x0b\xbb\xc5\xea\x11\xfe\x97\x82\xae\x5f\xe5\xff\x38\x63\x4a\x3b\x77\xb5\x2d\x7a\x4a\x96\x69\x5b\x0d\x70\x16\x05\x28\x26\x5d\xd3\x3d\xb6\x72\xf6\xad\x72\xc6\x13\x32\x4b\x9b\x63\xae\x08\x2e\x3d\x59\x65\x3c\x8a\x54\xe4\xa0\x4e\x07\x98\xc2\x2d\x78\x14\x87\x02\x3d\x15\x10\x1d\xc1\x66\x5b\x2d\x0b\x50\xef\xc5\x0c\x44\x87\x47\x22\x00\x69\x09\x8c\x6e\xf3\x8f\x1b\xcc\x2f\x64\xd1\x26\xf7\x17\x07\xb6\xe8\xbb\x76\x66\xd3\xfb\x55\x57\x46\x87\x2c\x76\x33\x8f\xc0\x62\xd7\xc2\x9e\x19\x9b\xc5\xe3\x28\x20\x32\x5f\xff\xf2\x4e\x03\xc2\x19\xe0\x49\x66\xc8\x11\x6f\x5a\xf5\x00\xbf\x67\xea\x46\x3c\x91\x56\x10\xe6\xf9\x65\x45\xd2\x86\xdf\x9f\xee\x6f\x57\x2f\xfd\xf9\x4a\x52\x37\x55\x73\x92\x87\xbc\xfd\x4a\xc8\x68\xfc\xfa\x13\x6d\x19\x9b\x0f\x3b\xcb\x1a\xea\xfe\x9c\x06\x01\xa1\xd3\x7b\xa9\xb3\x3d\x1c\x8e\xf3\x69\x4b\x9e\x86\x91\xc7\xee\xdc\xa2\xac\xf3\x31\x0b\x49\xe6\x47\x61\x42\xd8\x2b\x9b\xfa\x7f\x41\xdf\x83\xda\x1d\x51\xca\x45\xf1\xe4\x07\x2f\xab\x52\xdf\xe6\x1f\xd3\xe7\xe7\xcc\x4a\xd7\xee\x8e\x50\x37\xb8\x2e\xdb\x4d\xb7\x06\xdb\xdc\xe4\xea\x27\xe6\x23\x0b\xc1\x39\x58\x6a\xe9\x3d\x94\xba\xc0\xc5\xfd\xeb\x1f\x5f\xaf\x83\x2b\x93\x83\x83\x45\x25\xf5\xc0\xd5\x3f\xce\x07\x32\xf0\x7a\x46\xbf\xdb\xbb\xdc\xcb\x3a\xfb\xe3\x12\xa8\x39\x86\x9e\x87\x64\x59\x4a\x85\xce\x61\x74\x1b\xf3\xc6\x33\xab\x02\xe7\x68\x2d\xc4\xc0\xe0\x2d\x3f\x17\x83\x0d\x69\xae\x13\x00\x78\x86\x69\xe2\x80\x30\x9d\xbf\xf0\x40\x84\x08\xc5\xe7\x43\x8f\xb3\xf0\xd7\x17\x41\x44\xbe\xf3\xa2\x69\xa1\xad\x9a\xcb\x0e\x59\xe0\x82\xf1\xc4\x56\xbf\x9a\x66\xa8\xfa\x3a\x7e\x1f\x02\x19\x55\x19\x0e\x79\xd9\xde\x57\xe5\xdb\x16\xeb\xc3\x17\x4d\xd2\xc0\x85\x11\x94\x3c\x01\x59\xd5\xed\xba\xb4\x05\xca\x4b\x9a\x6f\xe0\x10\x64\x94\x51\x57\xd5\xe1\x88\x65\x73\xe1\xc6\x73\x19\x26\x1a\xfc\x8e\xdf\xed\xd6\x89\x7f\x3a\x69\xac\x7e\xda\x5d\x5e\xd2\x5b\x26\x50\xfb\x57\x0b\x51\xc5\x5a\xba\x8f\x47\x6d\xfe\xc3\x0d\xb2\x0b\x08\x28\x93\xf3\x74\xc0\xb2\x1a\x19\x6b\x95\x59\x56\xec\x07\xd4\x0a\x06\x99\x96\xf1\x7d\x92\xaa\xd8\x70\xca\xdc\x51\xbe\x89\xe0\xa2\x74\xb9\xf9\xbc\xdd\xdf\xca\x9b\x70\x25\x12\x7a\xff\x9e\x35\x67\xc7\x02\xa7\x70\xfa\xe0\x09\x12\x80\x53\xb4\xd7\x07\x20\x53\xc5\xdd\x91\x3d\xd7\x61\x46\x46\xe3\xe6\xe9\xe5\x19\x3e\x07\x59\x2f\xae\x55\x22\x43\xef\x81\x5b\xb1\x67\xc2\xd9\xf7\x73\x0a\x23\xcb\x29\x44\x9b\xfb\xd2\xb6\xee\xde\x0e\x56\x08\x66\x99\xef\xb5\x75\x0c\x88\x73\x56\x21\x0b\x64\x9c\x89\x1e\x14\x77\x45\x46\x15\xb2\x90\x71\x1d\x5b\xdb\xd9\x59\xe7\x3b\xc4\x87\x4a\x53\xe5\xf9\xca\x06\x99\x85\x42\x47\xc9\x19\xec\xb8\xbe\x5d\x7e\xce\xf0\xb7\x41\xc6\xba\x0f\x6b\x91\x05\xad\xbb\xe6\x24\x39\x98\x31\x69\xd5\x86\xbb\xbd\x76\x79\x1c\x52\x4b\x40\x16\x2b\x5b\xd1\xa0\x8e\x19\x9f\xf7\x3f\x77\x47\x41\x16\xeb\x90\xaa\xbf\x47\xf8\xb4\xca\x00\x8b\x52\xdf\xe2\x87\x3f\x9c\x24\x40\x71\x08\xb1\xdb\xe2\xea\xed\xad\x3f\xa0\x25\xb1\xc6\xfd\xbf\x53\xae\xde\x37\x96\xeb\xc2\x2b\x4d\xf7\x59\xeb\x2c\x65\x36\x4b\xbb\xcc\xdb\xce\x4b\x23\x55\xad\xfe\x98\x48\x20\xf6\xca\x06\x7d\xb2\xd6\x1f\xe5\x59\x4a\x1d\xe8\x12\x14\x94\xea\x73\x38\xd3\x33\x2e\x38\x31\x8e\xca\x53\x5d\x3e\xf4\x4f\xc2\x95\x24\x98\xea\xc3\xcb\xb8\x41\x20\xe3\x98\x72\xec\x95\x1d\x47\x71\xcb\xe4\x33\x72\xb4\x34\xad\x1b\xac\xe6\x0d\x46\x96\x45\x29\xf1\x11\xe4\x8d\x6b\xdd\x9c\x7c\x8b\x2c\x49\x98\xf6\xf0\xcb\xc9\xa7\xcc\xb8\x56\x71\x4f\x50\xd2\xb9\x43\x9b\x16\xda\xbc\x69\x3d\x1f\x2c\x64\x19\x70\x52\xa1\xdf\x35\x7b\xa8\xc9\xd5\x32\x58\x5f\x27\xb8\xf5\x67\xc9\x88\xa2\x1d\x8d\x8e\x4a\xbf\x28\xfa\x0b\x4a\x9d\x48\xd7\xfd\x42\xde\xfd\xd2\x26\x2f\xa6\xb7\xa6\x2c\xa1\xd8\xee\x8d\xb4\xfc\x8b\x02\xcb\x37\xdc\x9c\x08\x75\xf1\xb5\x83\x92\x01\x53\x04\x9b\xb5\x9b\xc3\xaa\xa1\x46\x48\x0f\x49\x3a\x83\xc0\xc7\xbf\x07\x52\x44\x7d\xc0\xb1\x76\x0a\x00\x55\xdd\x7f\x7d\x19\x09\xd5\x0b\x7d\xbd\xe5\x55\x49\xb7\x6d\x7b\x53\x07\xdc\x1f\x93\x5b\x91\x31\x43\xd7\xd4\xb4\xcb\x89\xa8\xd4\x1d\x40\xe4\x09\x38\x22\xe4\xdd\x29\xdb\x41\x5d\x83\x8f\xd6\x33\x93\x19\x63\x4b\x76\x04\x44\x9c\x7c\x50\x23\x52\x42\xa9\x7c\x54\x2d\xd6\x3f\xaa\xd6\x49\x3b\x8f\xdf\x9f\x60\x2c\xa0\x3c\x82\xb1\xde\x99\x4d\x5f\x8f\x6c\x99\x60\x02\x07\xe4\x14\x55\x7d\x18\x38\xc2\x99\x1f\x03\xa1\x6b\x27\x6a\x4e\x45\xbb\xdb\x77\x66\xdc\x1d\x8a\x03\xe9\x37\x85\x67\x68\xda\x81\x0f\xec\x07\xc4\x6e\xe6\xe1\x59\x3b\xfc\x1a\x41\xb2\x3f\x25\xb5\xc2\xb4\x20\xf3\x73\x88\xe4\x8f\x09\x4b\xe4\x2f\x3b\x57\xf6\x5f\xa0\xde\x6d\x43\xc1\xf0\x6e\x63\x10\x04\x2b\x77\x7d\x53\x36\xb5\x72\xb8\x80\xed\x89\x24\xb6\xa9\x88\xd5\xef\xa3\xcb\x94\x78\x12\x0e\x10\x69\xa2\xa2\x61\xff\xcb\xcd\x6a\x52\xcb\x16\xa9\xe6\x64\x68\xd4\x50\x3f\xf9\x3f\x66\x6c\xb5\xe0\x81\x84\x73\xa3\x26\x79\x68\xfe\x08\x53\x3a\x1e\x40\xe2\x1e\xf1\xd7\x38\xd9\x2d\x38\x30\x8b\xbc\xaf\x3e\xf0\x05\x49\xff\xf8\x6a\xd1\xc0\x9f\xa2\x19\xe5\x9e\x4f\xe7\x8e\xe9\x26\x9a\x43\x12\x08\x11\x64\x89\xe7\xac\xef\xe2\x21\x7d\x21\xf5\x09\x42\x70\xe6\x63\xd6\xbb\xaa\x46\x05\x0d\x95\x72\x2f\x1e\xd8\x4b\xa0\x0f\x1f\x1c\x82\x94\x9a\xe6\xba\x3d\x7d\x82\x35\x9e\xbf\x75\x10\x51\xe6\xda\x88\x1e\x73\xf5\x5e\x0e\x2a\xf0\xe3\x85\x4a\xdc\x44\x1e\x9a\x56\x7f\xea\x7a\xa0\x0e\xed\x47\xc4\x32\xb2\x31\x62\xab\xf6\xe7\x0d\x42\x28\xa5\x23\xdd\x37\x21\x53\x11\xe2\xdc\x54\x06\x42\x07\x5c\xda\x25\x69\xf2\xa2\x98\xbc\x30\x1d\x18\xca\xea\xba\x9c\x32\x9b\x77\xec\x85\x46\x23\x7b\x14\x80\x9f\xeb\xff\xdc\x7e\xbf\x32\xdd\x31\x14\x44\x1d\xb0\xf3\x93\xcd\xdf\x0b\xaa\x90\xf2\xe2\x6d\xb5\x6a\xf7\x56\x61\xc8\x11\xdb\x7f\x87\x66\x6f\xcb\xb0\x03\xef\x59\xa0\x51\x56\x0e\x1f\x4d\x9b\x85\x93\x7b\x37\x41\x46\xdd\x70\x0e\xe1\xa1\x7d\x77\xca\x24\xae\x14\x06\x62\x8a\x1c\xf7\x50\x98\x4f\xec\x36\x4f\x38\x74\x77\xa6\x71\xa7\xcf\x7e\x0a\x04\xcc\x52\x31\xff\x22\xae\xe7\x21\xf2\x12\x82\x28\xd1\x23\x96\xba\x6e\xc5\x7f\x1e\xcf\xa7\x46\x10\xe1\x60\xda\xd5\x6b\x3d\x8a\x42\x20\x30\x01\x15\x75\x35\x7e\x38\xbe\x11\xd7\xfa\x5d\x3e\xe4\xe5\x69\xce\xbf\x1f\x3d\x2a\x04\x46\xb0\x41\x94\xe1\xdb\xc6\xdd\xd1\x30\xc6\xc8\x81\x12\xbe\xe5\x1f\xb8\xcc\xeb\x76\x4f\xb7\x77\x06\x8d\x01\x4b\x78\x92\x0e\x16\x66\xcf\x4f\xfb\x15\xb0\x07\x22\x99\x92\x9d\xdf\xe6\x6a\x0b\x6a\x5b\xf5\x4f\x1c\xe9\x84\x16\xda\xf6\xe5\x66\x44\x74\xe6\x0e\xc7\x41\xec\xb9\xea\xdd\xf2\xbf\x64\x82\x06\x88\x55\x42\x25\x50\x68\x9a\xd3\x61\x82\xe4\x84\x04\x24\xd8\xd6\x80\xd2\xe4\x6f\xa7\xba\x0b\x6c\xfa\xb6\xec\x2b\xcb\x0d\xd2\x38\x93\xf1\x40\xa7\x7a\x40\x07\x0e\x90\x72\x9b\x7b\xb3\x79\xf6\x3f\x6f\xb7\xf3\xb3\x17\x52\x83\xe4\x2e\xf5\x0a\xcd\xfe\x02\x3c\x11\x04\xe4\x79\x58\x3f\xee\xd6\x8f\x3f\x56\x9b\xed\x6e\xf9\xb4\x78\xb9\xed\x8f\xf3\x98\x1a\xf6\x8e\xd8\x3e\x95\x03\xf5\xa7\x66\xc8\xcc\x01\xc0\x65\x4c\x59\xe9\xc5\xdf\xe4\x26\xec\xce\x40\xca\x0e\xdd\x90\x68\xd5\xb3\x2d\x71\x5e\x52\x88\xb8\x2d\x6e\x54\x4a\x01\x6e\x74\x90\xf6\xa5\xd4\x65\x7e\x69\x6c\x07\xb3\x24\x63\x40\xfe\x8d\xe3\x62\x2c\xf5\x1d\xe4\x13\x93\x01\x19\xb7\x10\xdb\x5d\x0b\xef\xb8\xb8\xae\xe9\xdc\x0f\xe7\x84\x0d\xb3\x1d\x64\x57\xe6\x59\x86\x41\x66\x39\x87\x3f\x5c\x8d\x77\x04\x24\x07\x60\x01\x09\x25\xb8\xb3\xb6\xd5\xe3\xe9\xb0\xad\x7e\x4d\x71\x11\x00\x4a\x86\x3d\x7f\xd9\x5d\x55\x5b\xc4\xab\xff\x3e\x32\x00\xe5\x6b\x24\xdb\x7d\x5d\xfd\xb2\x33\xe1\x05\x69\x09\xf4\x09\x74\x90\x2c\x24\xd7\xf3\xa9\xdf\xa4\x41\x62\x46\xd1\x49\x5e\x9e\xf9\x82\xee\x2b\x62\xe0\xe8\xe9\x54\x00\x54\xc6\x75\x70\x66\x6e\xe9\x6c\x81\xdf\x19\x41\x27\x32\xf4\x05\x90\xdb\x1a\x7e\x59\x8e\xcd\xf1\xbb\xd2\x68\xcb\x19\x0b\xad\x6b\xdf\x54\x42\x5d\xc0\xfe\x22\xa8\xa3\xc0\x92\x54\xfe\x0b\xd5\xb9\xbd\x6d\x72\x19\x44\x11\xfa\xd6\x94\xba\xfa\xfd\x39\x52\x81\x71\x63\x0c\xd3\x9a\xfb\xa6\x05\x6a\x48\x5b\x94\xcd\x2f\xac\x5f\xc8\x21\x9a\x5c\xd0\xa4\x9a\x72\x40\xe5\xe9\x70\x5f\x7d\x20\xc9\xc6\xfb\x5b\x32\x10\x50\x6b\xf4\xcb\xd3\xeb\xe3\xed\x8e\xef\x7c\x52\x8a\xa2\xd1\x7e\x90\x0a\x09\xc1\x70\x6d\x9b\x19\x4f\x07\x19\x84\x82\xb2\xf6\x78\xc8\x5b\xcf\x52\xf5\xd4\xbd\xaf\x71\xe0\x36\x6f\x2c\x65\x90\xda\x1e\x42\xcf\x4d\xdc\xe0\x75\x5d\xdd\x2b\xbf\x2f\x18\x8f\xfa\x90\x51\xbb\x05\x37\x2a\x43\xca\xc0\xa4\x36\x5b\x69\xc9\x61\x8e\x55\xd9\x20\xce\x71\x08\x80\x0c\x39\xa3\xb6\xfc\x1f\x55\x8b\xcd\x23\x76\x6f\x00\xfa\x1a\x96\x8c\x52\x14\x6c\x20\x3f\x34\x97\xe1\x91\x11\x4f\xc8\x8f\x38\xda\x59\xe1\x2b\x39\xd3\xf0\x42\x46\x42\x13\x6b\xa1\xc7\xd5\x92\xac\xe3\x79\x81\xcb\x08\x2c\x1b\xb4\xcd\x15\xac\x6f\x9e\x76\x3f\x57\xab\x3f\x07\xd5\x2e\x19\x73\x4d\x4d\x2e\x2f\x8b\xed\x8a\x80\xc3\xdd\x00\x5f\x25\x96\x49\xac\x09\xf7\x44\x64\xc4\x79\xeb\x42\x5c\xdb\x4f\xda\x2b\x40\x62\x3f\x5a\x05\x34\xda\xf2\xc9\xd1\x3b\x3c\xd3\x8e\x82\x4c\x03\xe6\x01\x35\xc4\x46\xe7\x13\x25\xba\x1b\x35\x49\xfa\xc9\x34\x4a\xd3\xd0\x37\x68\xc8\x22\x6f\xf6\xd3\x39\x2d\x53\xb4\x6a\x4c\x3b\x0a\xcf\xaa\xcf\x5b\xec\xd7\xb4\xe4\x18\x11\xac\xec\xe8\x9a\x3b\x6e\xe0\x72\x13\x19\x58\x42\xc9\x4d\xd0\xdb\x8a\x5d\x5e\x36\x58\xb7\x3b\x93\x97\xba\x7b\xf3\xdf\xf3\xb2\xb5\x25\xbc\x43\xf5\x81\xbe\x82\xdd\x9f\x98\xb0\xb0\xe7\x69\xf0\x3f\x9f\x09\xc7\x3b\x31\x62\xdd\x03\x29\x58\x42\xac\xa8\xcb\x53\x5d\xbe\xa0\xc2\xfc\x38\xcf\x0a\x05\x52\xa8\x88\x81\xeb\xbc\xb1\x9b\xe9\xfc\xec\x07\x16\x90\x37\x78\x5f\x7d\x42\xd1\xf6\xb3\x4c\x46\x10\x79\x08\xc3\x71\x0f\x8f\xa7\x03\xd6\xb9\x1a\x79\x29\x52\x05\x26\xb6\xf1\x99\xe3\x0f\x78\x3a\xf6\xb1\xbd\x54\xdc\x92\x02\xec\x40\xeb\x07\x68\xa6\x2c\x47\x20\x3b\xf3\xeb\x76\xf3\x4a\xe5\xbe\x92\xdd\xe7\x43\xbd\x2d\x97\x9a\x71\xfa\x4a\x0f\xd5\x25\x48\x5b\x6a\x1e\x11\x05\x9c\x35\x70\x93\x33\x31\x88\x93\x9e\x61\xff\x70\x84\xfc\xad\x9c\x8e\x60\x8a\x7a\x12\x48\xbe\x64\x55\xea\x41\x1e\x4a\x1a\xce\xa8\xdf\xe8\xe7\x66\x79\x33\x48\x70\x49\x93\x59\x6d\x3e\xaf\x2b\xb8\xb6\xea\x93\x75\xdc\x0f\x90\x22\xb2\x31\x0d\xf1\xd4\x4f\xee\xd8\xe8\x90\xba\x62\x60\xe8\xd7\x4d\x2c\x80\x0a\xb8\x6d\xe6\x3c\x63\x4d\xb6\x08\x87\x9b\x53\x4b\x6b\x73\xfc\x05\x55\xc8\x34\xd3\x3e\xc1\xf9\xcd\x72\x2d\xe4\x55\x79\xee\xb5\x57\x51\x12\xba\x6d\xee\x1d\x4b\x5f\x48\xf6\xc7\xb8\xb1\xf4\xaa\x95\x6f\x7e\x69\xbc\xb5\x28\xfb\x31\x68\xd9\xdb\xad\x64\xf7\x20\x83\xa3\x22\x63\x93\x41\x47\xac\xd5\xd3\x85\xd0\xd6\xe4\x46\x53\x96\x60\x3a\x25\x14\xa4\xcd\x86\xf4\x0d\xe7\xfc\x82\xb0\x3f\x57\x73\x27\xed\x85\xbf\x07\x5f\x43\xa5\xa8\x35\x65\xe1\xf2\xb7\x7d\x3b\x22\x00\x02\xc5\xb9\xb6\x79\xff\xdd\xb0\xec\xb4\xad\xd6\x37\x8b\xe7\xee\x19\x7b\x46\x97\x6b\x9d\xb0\x23\x9b\xaa\xb8\xb6\xa9\x7b\x57\xc2\xd9\x56\xf7\x53\x95\x78\x50\xdc\x28\xea\x3e\x83\xe2\x42\xe2\xef\x5a\x6b\xa1\xca\xb4\x85\xb3\x37\xd8\x52\x4d\x7c\x56\x72\x07\x94\x60\x86\x6a\xbd\x0b\xac\xab\x12\x4f\x17\xad\xb2\x7e\x58\x62\xdd\xad\xbc\xf9\x41\xaa\xe4\x0e\xe8\xb6\xfd\xed\x76\xa5\xce\xcb\xb9\xf9\x39\x9f\xd6\x55\x22\xd3\xa9\xa3\xfa\xb8\xb9\xf9\xee\xa8\xf1\xfd\xc4\x56\x02\x04\x81\x5e\xec\x16\x66\xf7\x56\xfa\x7c\xb3\xdb\x18\xf1\x93\x10\x02\x28\x2f\x0a\xe2\x28\x42\x3d\x70\x27\xcf\x83\x48\x9f\xef\x54\xf6\xd5\xed\xf9\xab\x41\x9a\x8e\xba\xd9\x9e\x9d\x98\xdc\x70\xea\xb8\xa1\x92\x71\xcb\x47\x75\xbb\x6b\x08\x10\xdf\x2d\x9e\x55\xbb\x9f\x80\x9e\x95\x62\x31\xca\x49\x51\xf2\x47\x0e\xe4\x03\x5d\xfb\x6a\x93\x29\xad\xa0\xd7\x0e\x5c\x42\x83\x73\x04\x23\x8a\x30\xb1\x67\x88\xfb\x88\x7e\x6f\x30\x4a\x73\x9a\xac\x3d\xa2\x75\x5c\xcf\x54\x4a\x67\xd4\x35\xaa\xa1\x7a\x7e\xba\xdf\xfc\xb9\x68\x87\x59\x59\xa5\x39\xa4\xbd\xba\x94\xcd\x5b\x8f\x8c\xb5\xc2\xd8\xe6\x5a\xcf\x10\xc9\xbf\x6a\xf5\xf0\x27\x72\xa9\x7b\x92\x19\x0b\xe7\xfb\x73\x72\xef\x98\x19\x52\xe5\xd4\xa4\xb6\xf1\x2d\xaf\x0b\xb7\x12\x6d\x05\xc0\xdf\xa3\x09\x31\xf0\x61\xaf\x83\x5d\x0e\xc3\x66\x65\x12\xb0\xb9\x47\xbf\xb1\xdb\x3e\xaf\x51\x87\x97\x32\x69\x0a\xd2\x91\xca\x34\x79\xd3\xf3\xd4\xf5\xc7\x81\x91\xad\xda\xe5\xcd\xf2\x94\x4f\x5d\x53\x65\x64\x42\xd9\xfd\x53\x79\x04\xf5\xbe\x98\x26\x38\x94\xd1\x19\x15\xaa\x8f\x05\x7c\x76\x31\xf1\xc4\xad\xd0\x01\x17\x14\xb3\x59\x20\x3b\xea\xd7\x8d\x0f\xe7\x74\x90\x09\xe2\x94\x6d\xae\x75\x44\xea\x50\xa5\xa9\x17\xe4\xda\xe7\x85\xb6\x02\xfe\xc3\x46\xf9\x8b\xcc\xa3\x0e\x75\x24\x3c\x8b\xbb\xa3\xef\x5b\xd8\x70\xc1\x12\x5e\x9c\x5f\xc0\xac\x3d\xd0\x2c\x88\x89\xd3\xef\x89\x3d\xcd\x86\x8f\xc3\x49\xa2\x19\x07\xb2\x31\xf5\x59\x80\xd2\x71\x41\xf8\xdb\x61\x99\x15\x8f\xa5\x70\x64\x89\xed\x7a\x92\x15\xd4\x91\x66\xb1\x1e\x7e\xc4\x65\x05\xed\x1d\x4e\x62\x0e\x1d\x87\x56\x50\x46\x43\xfd\x5e\x56\x1a\x97\xd5\xb4\xbb\x55\xc7\x69\x88\x30\xec\xe8\xe9\xde\xf5\xe4\x2a\x80\x34\xf1\x76\xc4\x79\x73\x51\xdc\x77\xa3\xd2\x40\x53\xa3\x16\xc1\xba\xf0\xab\xfc\x9b\x4e\x53\x4e\x52\x78\x8f\xa7\xc3\x93\xd9\xb4\x27\xdd\x4d\x52\x47\x4d\xe4\xd7\x9a\x4e\xb5\x95\x0f\x6c\x4e\x07\xdb\xab\x31\x98\x04\x9c\x85\xf4\xf8\x0d\x39\xff\x94\x5c\xf3\xf6\x53\x67\x81\x65\x54\x21\xbd\x8b\x6c\xf2\x28\x22\x4c\x89\xe6\xc9\x01\xe7\x76\x37\x8b\x67\x7f\x9e\x88\x52\xea\x5c\xd8\x62\xd3\xb2\xe9\x69\x69\x44\x1d\x74\xb7\xab\xff\xfa\xb3\x1f\x9f\xc6\xbe\xcf\xec\x05\x3b\xe7\x64\xb8\xca\xb4\xc8\xf8\x80\x85\x7e\x71\x3c\xd6\xd8\xb9\x5f\x79\x55\x6e\x5a\xf4\xcb\x48\x77\xa1\x31\x35\x20\x4f\xde\xa5\x0c\x43\xb2\x33\x87\x4a\xe7\xe6\x93\x6c\xf6\x98\xf1\x64\xe0\x14\x6b\x19\x05\xb6\x98\x6d\xb9\xd5\x3c\x36\x54\xcb\x38\x23\xe7\xda\x6b\x41\x53\x5c\xed\x6b\x09\x83\x5c\xa4\x96\x09\xa3\x4c\x55\xb7\xd6\xb6\x95\xb3\x88\xab\xdf\x63\xd4\x2d\xcb\x06\xcb\xc6\x6f\x65\x5a\x22\x68\xa7\x03\xd7\xc2\x80\xdb\x48\x2b\x91\x90\x27\xd1\x45\x57\x4f\xa5\xb7\xc6\xb6\x4a\x36\x9d\x82\x0a\xb8\x6f\xfb\xda\xec\xa1\x46\x0b\xa3\x6e\x46\x5e\xd8\x64\x06\x29\xa9\x28\x05\xd6\xc5\xe3\x37\xd5\xe1\x58\x60\xef\x52\x6a\x9d\x65\x59\xff\x61\x7e\x5d\x08\x5d\x8e\x2f\x84\x11\x50\x75\xda\xa1\x99\x88\x50\xca\x0e\x8d\x7d\x33\xe5\xf8\x66\x31\x36\xf4\xb6\x1d\xf7\x26\xea\x9d\xea\xe2\xd8\xdd\x47\xde\xf6\x7d\xeb\x1a\x39\x37\xbe\xe0\x32\xbb\xd1\x6a\x54\x21\xe5\x74\xce\x15\x81\xc9\x71\x9d\xda\xd9\x0f\x85\x6d\x79\xef\x2f\xad\x39\xf5\x14\x34\x27\xd9\x05\x02\x2f\x55\x75\x98\x01\x50\x6a\x13\x45\xf4\xfe\x3f\xa0\x38\xe1\x14\x1f\xaf\x0d\x8f\x89\x13\x6d\x77\x2a\x69\xc3\x41\xed\xd8\x41\xa6\x3d\xfa\x18\x44\xc2\xd3\xf9\xff\xcc\x9b\xfd\x25\xe8\x11\x03\xae\x29\x04\xb2\x12\x32\x9b\x9b\xc5\xbd\x8f\x5a\x31\x4c\x82\x24\x3c\x7b\xc4\x24\xe1\x31\x4f\xab\x0c\xc8\x02\xe9\x8b\x04\x8b\x32\x3f\x40\xb1\xd6\xe4\x22\xf7\x14\xb1\x4d\x7b\xea\xa7\x2c\xb2\x30\xb1\x50\xae\xce\x21\xfd\x27\xd6\xd5\x43\x55\x52\xf4\xe3\x8f\xf3\x40\xa6\x9e\x11\xe1\x4b\xe7\x02\xa3\x98\x11\x6f\xa4\xae\xca\x76\xb3\xaf\x7e\x3d\xe0\xba\x9b\xaf\x3d\xe4\x00\x23\xc5\x08\x7b\x61\xa5\x2b\x1d\x00\xe9\x62\x4d\xfa\xc1\xda\x2a\x5e\x7d\xe0\x3e\x57\x45\x5f\x09\xc6\x38\x46\x12\xb4\xf0\xc2\x05\x03\xef\x1a\x63\x9d\xf2\xd4\x51\x4f\x5b\x74\xe1\xe4\xa2\x09\x8b\x94\x8f\xef\x3b\x57\x50\x6f\xeb\xcf\xc5\xa9\xdd\xbf\x96\xe0\x5a\x6b\xfb\x90\x1a\x13\x2e\x42\x4f\xaf\xff\x6b\x42\xa8\x82\x89\xca\x08\x2b\xb7\x78\x7e\xde\x6d\xb6\x4f\x2f\xfd\x97\x4a\x83\x98\x74\xbd\xd7\x8f\x3f\x56\x2f\x9b\xd5\x6e\xb9\xd8\xac\x37\xbb\xe7\xa7\xf5\xe3\xb6\x1f\x12\x6a\x22\xea\xaa\xa8\xe7\xe3\x0a\xdd\xf5\xf8\xbe\x53\x69\xb1\xaa\x2d\x1c\x9f\xab\xbe\x28\x8b\xa9\x31\x94\x74\xdb\xfc\xf9\xdc\x5f\x9d\xf3\xd8\x69\x80\xff\x26\x2a\xde\x0f\xe8\x87\x67\xc8\x28\x0d\x59\x62\xaf\x91\x77\x05\x78\x33\xf6\xb3\x31\x43\x49\x9b\xb2\x6a\xeb\x11\x6f\x1a\x8a\x34\x0d\xbb\xd9\x43\xf5\xf8\x9f\xb9\xc9\xcf\x07\x04\x71\x16\xe6\x8d\xb5\x07\x13\x4d\x3b\x40\x91\x69\x1b\x09\x87\xd3\x03\x10\xf0\x33\x99\xc7\x18\x66\x8d\x42\x01\xad\x03\xdf\x7e\x59\xea\x1b\x28\x2e\x1f\x62\x50\x63\x41\x30\x98\x5a\x1e\x23\x78\xc3\x09\x5b\x21\xa0\x64\xb6\x97\xfc\xd9\xc2\xf9\x2f\x1a\x43\x50\x32\xa4\x8c\xd2\x0e\x0f\x79\xbb\x79\xcf\x8b\x62\x51\x23\x34\x9b\xcb\x34\x9d\x3f\xc1\x41\x07\xfb\xc4\x7e\xf7\xec\xfe\x98\x64\x54\xa5\xe8\x9e\xad\xc4\xc2\x3d\xdc\xf2\xd3\x76\xf7\xcd\x3a\x44\xa8\x22\xe1\xbd\xd0\xbc\x34\x55\x01\x66\x6a\x59\x54\xa4\xb8\xf0\x4e\xfd\x80\x6c\xe4\xda\x05\x95\x45\x79\xb4\xa7\xba\xb4\xc4\xee\xfe\xf6\x74\x6c\x88\x72\xe7\x16\x5a\xf0\xdc\xbb\xfe\x50\x16\x68\xd3\xd7\x57\x2e\x68\xf2\x01\x31\x88\x89\xc2\x70\xa1\xb5\x4d\x76\xb5\xf8\x56\xd5\x23\x06\x7c\x40\x0c\x35\xd5\x89\x94\xdb\x40\x5f\x80\xf6\xb4\xc1\xf7\x40\x96\xda\x7e\xa2\x6e\xfb\x6a\x5e\x50\xcd\xef\x36\x88\x51\x44\xe1\x45\xcf\xaf\x40\x5f\xb6\x67\xf3\x05\xc4\x18\x69\x69\xdc\x54\x87\xc3\xa9\xcc\xdb\x4f\xca\x4e\x4e\x56\x31\x72\x8b\xda\x27\x11\xfe\xc6\xa6\xcb\xfb\xb7\x61\x58\x48\xbe\xd5\x37\xcb\x2e\x4d\x5a\x32\xc7\x22\x9f\x46\x42\x68\x12\x8d\x0e\x84\xbb\x39\xc9\x67\xf8\x44\xdf\x53\x3a\x5e\x44\x26\x05\x5a\x7d\xab\xed\xf7\x87\xa7\xc7\xd5\x3f\xfa\xdf\x91\x5c\xe0\x5f\x77\xb4\xfb\xd1\x2a\x21\x4d\x84\x0d\x1e\xcc\x18\x1d\x8d\x46\x4b\x9a\x79\x77\x3f\x6f\xbb\x6f\xb3\xf2\x94\xca\x60\x82\x44\xd9\xce\xfc\x66\xd3\xda\xbc\x7d\x7f\x24\xcb\x68\xb5\x35\xc7\xe2\x32\xe5\x36\xfe\x69\x13\x0a\x4c\x2c\x32\x6d\x8b\xbf\xdb\x41\xda\xd5\x84\x52\x52\xf2\xac\xc6\x63\xb5\x3c\x27\x6b\x0c\x13\x9c\x60\x85\xcf\xab\x97\x9b\xd5\x23\x35\x1e\xdc\xae\x7f\xac\x37\x4f\x1e\xcd\x69\xa2\x20\x25\x26\x9e\xba\x73\x19\xb0\xfe\x89\xf9\xba\x7c\x80\x7c\xc0\xd1\x67\xe2\x48\x50\x43\x48\x67\x0e\x8a\xe5\xa9\xbe\x82\xd9\x33\x71\x9c\x66\x9e\x0c\x6a\xe2\x76\x9a\x44\x70\x82\x66\x74\x56\x79\x06\x15\x68\xd2\x34\xa4\x3c\x88\xcc\xdf\xc8\x07\x7e\x80\xdf\xf4\xef\x63\x8f\x5d\x34\xa9\x92\x04\x30\xb0\x2d\x09\xb7\x68\xe0\x54\x74\x81\xc2\xf7\xfc\x6d\xdf\x8f\xc1\x50\x39\x90\x97\x95\xf7\xf6\x50\xc5\xe1\xcb\x4a\x8d\x25\xc3\xb5\x41\x8b\x05\x83\xb9\x43\x3c\xe4\x94\xa1\xb4\x2e\x14\xf5\x05\x12\xdf\xda\x35\xf0\xdc\xc9\x29\x7e\x7b\x6f\x36\xf9\xef\x01\x8d\x4f\xfa\xdf\x23\xd6\xf1\xd3\x75\x75\x70\xff\xeb\xc2\x92\x56\x9c\xfb\xcc\xde\xbc\xa0\x61\x38\xd9\x90\x0c\xef\xbe\x7a\x67\x16\x0f\x76\x59\x7c\xde\xa2\xea\x7c\x0d\x7a\x6b\x7f\x31\x8f\xb2\x80\x53\x07\x26\x51\xb9\xae\xfa\x76\x16\x23\x42\x19\x0d\xca\x4b\x43\xfe\xa5\x09\x50\xe3\x7c\x2d\x21\x4d\x92\xf5\xe4\xe3\x3d\xf7\x7d\x33\xe3\xc9\x19\x08\x15\x65\x66\x9f\xe1\x5f\x9d\xd3\xc0\x58\xe4\x7f\x19\x18\xd3\x4e\x42\xf5\x1e\x4d\xbb\xbe\x79\x9a\xe3\x7e\x35\x20\x39\x85\x9b\x1f\x39\xfe\x7a\xc6\x36\xa7\x20\xa4\x33\x54\x7b\xf2\xb3\x3b\x27\x6b\xd6\x47\x35\x80\x9a\xb6\x2d\x8d\xa0\x8b\xbc\xc4\x5e\xe1\x68\xd0\x68\x63\x24\x63\x54\xfc\xf2\xa1\x7a\xff\x77\x15\x8b\x73\x77\x86\x2b\x6c\x4f\x58\xde\x67\xe1\x95\xd9\xe4\x5d\x49\xa5\x32\x2b\x6a\xb9\x2e\x4b\xac\x37\xaa\x3a\x5e\xc1\xaf\x19\x15\xd8\x5c\x58\xde\xbc\xe0\x9b\x2d\x5a\x4c\x1e\x49\x47\x3a\x71\x3c\x1c\xaf\xc7\x09\x55\x3a\x18\x0c\xd0\x4b\x56\x76\xb1\xf4\x5c\xfb\x83\x41\x66\x42\xe1\xa1\x59\xa0\xf6\x37\x70\x3c\x9e\x9f\xda\xc4\x32\xb0\xcd\x08\x0d\xd5\x9e\x66\x7b\xdf\x65\x10\x08\x5b\xf0\xf9\x13\x8b\xa2\xfb\x02\x45\x91\xc3\x61\x3e\x5a\x96\x41\x80\x9c\xd8\xbd\x1e\x6e\xb6\x3e\xb7\x36\x8e\x68\x86\x8f\x28\x83\x90\x73\xca\x1d\x38\xd8\xf1\xb9\x32\x6a\xe1\x93\xf6\xff\x37\x77\x55\xbd\xea\x59\xa2\x65\x10\x8a\x04\xcf\x49\xc7\x5b\x9f\x1d\xdb\xe2\xe1\xd8\xbd\x46\x9b\x1c\x1a\x15\x38\xfc\x89\x20\x2c\x21\x22\x7c\xbe\x60\x39\xfd\xc0\x7e\x90\xe2\xd4\xf0\x81\xc7\xbc\xa9\x34\x36\xbd\x7d\xea\x0e\xe9\xc0\x71\x9a\x35\x76\xaa\x5c\x79\x0b\xa1\x09\x89\xb1\xe4\x1b\xb6\xf7\xd5\x9b\xc3\xa7\xfc\x74\x94\xdf\xfd\x98\x98\x62\x33\xdf\x80\xd3\x6c\xab\xce\x3d\x5a\x5b\x32\x78\xed\xbc\x25\x3f\x9a\x85\x01\xbd\x28\x8f\x78\x3f\x9e\xda\xc1\xcc\x96\x01\x13\x9c\xa8\x11\x16\xc7\x7d\x5d\xe9\xbc\x3d\x9f\x28\xc1\xea\x8a\x74\x46\x64\x83\xe5\x45\x77\xbd\xb3\x4d\x32\x88\x30\x26\xfd\x15\x1b\xd1\xdc\x55\xd5\x90\x37\x44\x06\x71\x80\xc1\xa0\x05\xda\xbd\xec\x3f\xc6\xce\x2c\x85\xfa\x53\x9d\xa2\x79\x9b\x3a\x79\x65\x89\x14\x1e\x00\xd3\xdb\x2b\x19\x70\x29\xbc\xf8\xa3\x6d\x7b\xed\xcc\xa5\x87\xad\xc8\x40\x80\xb4\x5b\x1b\x36\x55\xf1\xd1\x2d\xdc\xe3\xe4\x93\x0b\x19\xe8\xb3\xd2\xdd\xf3\xda\x9f\x09\xcc\x36\x06\x7d\x87\x66\xdf\xc2\xdb\x25\x55\xa1\x0c\x20\xca\xb2\x01\x71\x8b\xaa\x2e\xb9\x26\x64\x00\x32\xf6\x0d\x39\xeb\xe7\xbb\xcd\xf7\x01\x98\xdb\x8d\x90\x69\x48\x55\xc7\x9d\x45\x7c\x0d\x2a\x2d\x32\x90\xdc\xae\xc0\x66\x6c\x5a\x27\x24\x6a\x6e\xb0\x42\xdd\x0b\xb5\xe6\x25\x92\x3a\xc2\x3c\xe7\xbc\x0c\x74\x14\x46\xee\xc2\xab\xa6\x8b\xf9\xbb\x09\x45\x64\xb2\x7d\x0d\x62\x7e\xe6\xea\x48\x64\xa1\xa7\xbe\xa5\xd2\x80\xcd\x17\xe5\xe5\xdb\x40\x33\x6e\x0b\xf5\x1b\xb6\x03\x68\x8c\x0c\xd0\x58\xe0\xc2\xfe\xad\xb5\xfd\x6f\xe3\xeb\x9a\xcc\xe6\x68\x49\x3b\x7d\x47\x40\xc5\xe9\x08\x19\xf8\x98\xda\xe6\x88\xb7\xbf\xaa\x45\xfd\xd6\x8c\xeb\x12\xf1\x6c\xbd\x5d\x86\x01\x06\x5e\x20\xac\x9b\x28\xb7\x27\x2c\x9c\xd4\x98\x0c\x03\x03\x36\x64\x05\x83\xdb\xea\xe1\x74\x91\xe6\x76\xe3\xc2\xc4\x32\x17\x1d\xaa\x8f\xf3\x3a\x0d\x43\x6e\xc8\x1e\x8c\xe3\xa1\x45\x73\x81\x7b\xba\x8c\x8c\x64\xc8\x18\x04\xe2\x6c\xa4\xcf\x69\x53\x19\x32\x19\x53\xd2\xc3\x3b\xe6\xdd\x5f\x30\xb3\x0c\x0c\xd5\x01\xdb\x3d\x9e\x9a\xcd\x3e\x3f\x92\x1e\x8c\xee\xc7\x18\x15\x5a\xee\x97\x87\xdb\xd5\xe3\xee\x76\x75\xb3\x7e\x58\xdc\x6f\xfc\xe1\x88\xc7\x04\x79\x3a\xb3\x67\x5d\x67\x1f\x94\x61\x9c\x66\xd4\x6f\x2f\xa1\xc1\xd5\xf6\xfb\x88\xfe\x48\x86\xb1\x90\x74\xef\xb6\xb7\xc8\x6a\x34\xce\xc6\x3b\x32\x8c\x21\x51\x16\x19\x8a\x78\x8b\x2d\xe4\x13\x16\x1e\x19\xc6\x32\xa4\xd6\xa0\xcd\x49\x36\xaa\xce\x8f\xce\xc6\x9f\x0a\x5c\x1f\x8e\x45\xff\x93\x5a\x44\xbe\x19\xb7\x5b\x49\x23\x46\xa2\xc9\xd7\x4a\xb8\xa0\x98\x80\x2a\x90\xe4\xc3\x51\x64\xe6\x7f\xf7\xff\xc6\x99\x7f\xcc\x44\x07\xdc\x5d\x95\x38\x20\x66\x4a\x32\x32\x4c\x43\x43\x3b\xf7\x42\xeb\xdb\xfc\xc3\xdf\x50\x1a\x5b\x39\x9d\x2e\x84\x6b\xb6\x95\x85\xc1\x4c\x4e\x4c\x02\x02\x8c\x39\xbb\xb8\xaf\x11\xe6\x88\xa0\x64\x98\x6a\xfb\x6d\x1a\x2c\xf5\x08\xba\x33\x79\x99\x29\xa6\xb4\x92\x10\xea\xe2\x73\xb0\xe8\xce\x8c\x01\xe3\xf1\x3c\xe0\xd1\xb9\xe3\x67\x59\x55\x45\x33\x24\x39\xa9\xaa\xa2\xff\xe0\x9d\x2b\x17\xb9\xb4\x31\xe5\xb9\x12\xff\xa0\x10\x31\x42\xac\x41\x35\x52\x24\x90\x21\x70\x19\xf6\xa5\xe4\x5b\x2c\x66\x78\xb8\xbf\x72\x9d\xcf\xef\x09\xc0\xb6\x31\x0d\xc8\x12\x76\xb6\x5b\xbb\xff\x29\x19\xc5\xde\xa3\xa1\xfe\x9b\x1c\xc6\x3c\x10\x6e\x9c\xcc\x98\x74\xa0\x8f\x53\x83\xb5\xab\xba\x5f\x99\x9a\x12\x52\xa2\xcd\xfc\xa0\xdc\xee\xca\x49\x10\x5d\x7d\x86\xf9\xb9\x26\x91\x59\x0a\x09\x97\x70\xc0\x99\xf6\x0f\x19\x2a\x66\xc9\xcb\x1f\xd6\x8f\xbb\xcd\x76\xf1\xe7\xca\x3f\x98\xca\x24\xe5\x47\x3c\x72\xe4\x16\x0d\x96\xfd\x2e\x10\xea\xcc\xea\x4a\x5b\x38\xf1\x7b\x5e\xbe\x39\xde\x36\x7f\x5c\xe8\xd4\x1b\xf3\xc7\x6f\x7d\xb4\x3d\x6b\xf9\x43\x8d\x41\xc6\xa7\x62\xb4\x9b\xed\x97\x79\x45\x19\x62\x6c\x05\xc3\xf2\xe6\x01\xfe\x45\x6c\x5b\x8e\xb4\x19\xf5\x1f\x43\x7b\x66\x80\x87\x8e\xe3\x74\x93\x97\x6f\x05\xf6\x0d\xe1\xe3\xeb\x19\x00\x4a\x02\x16\x68\x5a\x9b\x15\xf0\x07\x14\xe3\xe9\xd9\xd3\x86\xa6\xe9\x76\x97\xe5\x0c\xc0\xac\x1b\xcb\xe5\x99\xd0\xe2\xdf\x20\xab\x75\xb9\xcc\x3d\xb1\xbf\x64\x01\xb7\x85\x87\xfb\xdc\xe0\x1d\xa8\xb6\xaa\x77\xfd\xca\x65\x8c\x2b\x4f\xe7\xf3\xfc\xf4\x74\x6f\x0b\xd7\x61\xd6\x1f\x56\x01\xb8\x4a\xd2\xf2\xa4\xdf\x70\x96\x8b\x47\x32\xa6\xad\x88\xcd\xaf\xbc\xd4\xd5\x2f\xd2\x34\xa6\x8a\xc4\xf8\x71\x19\xd3\x31\x11\x48\x96\xa7\xc3\x12\x4b\x34\xb9\xca\x81\x12\x38\xfe\xb8\xd1\xc9\x79\x1b\xb8\xd9\x77\xdb\xe7\x10\xd1\x29\x59\x94\x19\x97\x84\x6f\x4f\x75\xd9\x19\xbf\xfb\x6a\x20\x2f\xea\x8d\x5a\xe4\x56\x32\x8b\xc3\x80\x50\x5a\x4e\xd1\xb4\x2a\x5b\x2c\xdb\x21\x61\xd1\x78\x3b\x72\x19\x12\xc9\xe2\xd8\x50\xba\xe0\xbd\xaa\x11\xca\x9b\xbc\xcd\xfb\x56\x77\xc9\x62\xcc\x28\xe2\xbc\xab\xaa\xfa\xe8\xff\x98\x68\x41\x66\xeb\xff\xdc\xdd\x0e\xfd\x41\xc6\xa5\xa6\x4f\x5c\xe3\x07\x42\x71\xeb\xc2\xae\x3f\xc6\x3f\xc7\x0d\x23\xab\x8a\xa5\xa6\x00\xe6\x2c\xc8\x28\x59\xc6\x58\x12\x0d\x94\x9c\x7a\x0f\x08\xcf\x43\x24\xd0\xc2\x59\xac\x67\x1c\x34\x96\x29\x1e\x9e\xe7\xd2\x9f\x9f\x6a\xa4\x12\xf0\x65\x2f\xfd\x7c\xc3\xbd\xfb\x67\xce\x7c\x31\x11\x21\x07\xd7\xdb\xd5\x05\x0f\x24\xfc\x31\x47\x2b\x26\x99\x88\xad\x58\xe9\xeb\xfd\xf6\xe5\xe9\x71\xf5\xfa\xe0\x1f\x47\xf0\x90\x1a\xe1\xd0\xf5\x4d\x8e\xea\xf9\xdd\x61\x24\x61\xa2\xdd\x11\x6b\x53\xd5\x87\x17\x2c\xf1\x17\x5c\xf1\x56\x98\xc8\xb2\x01\xf5\xed\xea\xed\x6d\xa3\xf6\x78\xd9\x2d\xf5\x97\xff\x92\xc7\xde\xe7\x4e\x24\x13\x88\x96\xaa\x13\x75\x33\x80\x2b\x4a\x26\xa3\x58\xa7\x7d\x6b\xd6\x54\xb5\x57\x32\x99\xa4\x69\x67\xc6\x56\x3f\x96\x03\x31\x20\xc9\xa4\xb0\x25\xbf\x1e\x79\x6b\x41\xfa\xb3\xe6\x9a\x49\x04\xa7\x6c\xd9\xae\x3c\x78\xda\xea\xbd\x5f\xf1\x58\x99\x0a\x12\xc2\xc5\x7d\xe4\xf8\xcb\xe1\x50\x3d\xc9\x37\x25\x0e\xfc\x6d\xa8\x8c\x33\x57\x6b\x78\x6d\x49\xa2\xdc\x31\x20\x8d\x6f\x00\x03\xeb\x13\xe5\x79\x3e\x3d\x12\x6a\x4a\xc4\xe7\xaa\x1a\x16\x71\x25\xc3\x38\xa5\xcc\x17\xda\xae\x89\xba\xff\xbb\xb2\x8c\xe8\x5e\x01\xfb\x0a\x9b\xd0\xf0\xe5\x1b\x2e\xb3\x33\xa1\xf2\x10\xc8\xec\x6b\x9a\x21\xcb\xfa\xb1\x96\x58\x72\x0f\xcd\xfe\x36\x37\x26\x57\xa7\xa2\xfd\x9c\x2c\x40\x83\x09\x01\x47\x6b\xaf\xef\x67\x3b\x82\x4f\xb5\xaf\xfe\xca\x28\x94\x29\xa9\xdd\x50\x84\xb8\x1d\x6c\x1b\xd3\x4f\x74\xe9\x41\x46\x2c\x88\xc1\x6d\x5d\x7f\x7e\xaa\x21\xf8\xd4\x0d\x88\xb2\x38\xb2\x05\xab\x0d\x51\xa1\x56\x26\x9f\x30\x53\xc9\x28\x42\x5b\x80\xd4\xd5\xb6\x06\x7d\xb1\x91\x8f\xbf\x77\x94\xa0\xa5\xc3\xd2\x78\xe8\x36\x96\xfe\x31\xd2\x8c\xdb\xc6\x9a\xaa\xfe\xcb\x45\xe0\x4f\x11\xb1\xef\xd3\xb2\x59\xc4\xbe\xff\x63\x50\x1e\x97\x11\x77\x29\xd6\xb6\x01\x27\x32\x36\xbe\x4c\x16\xca\xd4\x56\xbc\xe0\xb0\xda\x7e\xb7\x20\x0c\x1f\x7d\x44\x59\xa8\x22\x07\xa5\xfe\x06\x4d\x3c\x63\xc8\xa2\x2c\x93\x04\xe8\x20\xa4\xa8\x82\xa2\x58\xf7\xbf\x9d\x29\xee\xdb\x11\xce\xe2\xff\x17\xa5\x3c\x19\x89\x08\x29\x83\x7b\x9b\x2b\xdf\xcd\x2c\x23\xe1\x04\xf1\x35\x5a\x3e\x82\x05\x85\x30\x50\xfc\x75\x4d\x47\x46\x02\x80\xe8\xfe\x3e\xa0\xc8\x6d\xca\x81\x10\x0f\xbd\x67\x99\xfd\xf7\x50\x6f\x68\x74\x2a\x84\xa1\x11\x83\x7e\xff\xd7\x06\xeb\xcd\x11\x15\xf5\xc3\x12\x73\xde\x5c\x45\x2e\xf3\x67\x4b\x46\x79\xe2\x9f\xff\xf8\xcf\xbf\x42\xa7\xc8\x88\xca\xb6\xff\xeb\x7f\xff\xaf\xe7\x02\x3e\x4d\x55\xcb\x53\xf1\xde\x0e\x36\xa9\x48\x06\xb6\x6e\x73\x5f\x0d\x8b\x6a\x32\x92\x8a\x51\x3b\x9c\xd3\xbf\x58\x56\xa7\x21\xf9\xea\xf8\xd5\xaa\x6e\xa3\x71\xfd\xc2\x97\x44\xe9\x7f\xe5\x04\x4f\xae\x25\x03\x4a\xd3\xf8\xb7\xba\xfd\xf2\x9a\xd7\x66\xf1\xf0\xf8\xd5\xec\xed\xf4\x97\x91\xa5\xa4\x56\xb0\xa3\x54\x88\xdf\x74\x22\x65\x84\xb0\x32\xfd\xaa\xd2\x6e\x47\xfb\xdb\x7b\xc7\x78\x1a\xeb\x54\x26\xae\x45\x69\x8b\x70\xe8\x5d\x43\x77\x18\x23\x11\xeb\x89\x67\x4a\x00\x5f\xbc\xba\xe4\x27\x3f\x80\x69\x4c\x44\x32\xa7\x72\x0f\x45\xbf\x44\x50\x22\x25\x81\xe8\xb9\x6e\x49\xa0\xa3\x77\x32\x22\x44\xa5\x7c\x56\xa1\xdb\x1f\xac\xc0\xff\xf9\xa8\xb5\x25\x50\x14\x36\xbe\xed\x5f\x8b\x51\x32\xf1\x0d\x51\x75\xf5\xab\xb5\x1a\x06\xb3\x52\x87\x32\x0e\x93\x08\x3d\xc3\x74\x5d\x7d\x3e\xe6\xe5\xbf\x60\x32\x84\x85\xc0\x6c\x7a\xba\xc4\x03\xbe\x53\xee\xc0\x3f\x41\xcc\x62\x45\x28\xa0\xef\xff\x7c\xb9\xac\x9c\xc8\x98\x01\xa7\xf8\xd5\xce\xfc\x6d\xe5\x3e\xf4\xb0\xee\x27\xe3\x88\xa5\x42\x7b\x20\x89\xa5\xb8\xea\x22\x6b\x82\xcc\x0f\x33\x85\x71\x94\x06\x84\xb4\x19\xa1\x8d\xbf\xec\x87\x90\x71\x84\x01\x2d\x23\x5d\x43\x5e\xee\xe4\x99\x6b\x44\xc6\x31\x0b\x43\x4f\xaa\xe2\xcc\xcb\xe4\xf6\x63\x99\x10\x9c\xfc\x05\x9b\xaa\x38\x59\xe1\x52\x4f\xd5\xeb\x86\x24\x5c\x13\xe3\xdb\xa9\x2c\xf2\x43\x7e\x76\x00\xe3\x04\x98\x70\xe6\xcf\x4a\x1a\x0e\x1b\xcf\x65\xcc\x43\x4e\xc0\x94\x8d\x95\x85\xc7\xfa\xbc\xff\x7d\x3d\x57\x63\x1e\x59\xf6\x03\x6c\xda\xfc\x00\xad\xb5\x4b\x79\xf9\x36\xcf\xbe\xfd\x3f\x5b\x08\x31\x17\xc2\x78\xfd\x28\x6c\x41\x0f\xdd\xf2\xd1\x47\xe3\x90\x11\x5b\x09\x15\x3e\x89\x16\x65\xf0\xa1\x38\x48\xc5\x07\x9d\x68\x3d\x77\xc2\x99\x8f\xa5\x7f\x11\x19\x86\x24\x51\x68\x19\x37\x36\xb6\x21\xfd\xa2\xbc\x22\x63\x08\x13\x72\x4d\x29\x69\xb2\xa1\x5b\x71\xe1\xfe\x17\x9c\x53\x32\x96\x41\x48\xa5\xe0\xd7\x72\x7f\x4d\x6b\x5c\xc6\x32\xe2\xa1\x0b\xdf\x37\x6d\x75\xdc\x60\x51\x9c\xd3\x68\xb1\x14\x9a\x7c\xdf\x95\xda\x57\xe4\x1e\x0e\xed\x71\x2c\x15\x73\x64\x40\x9f\x70\x6a\xf7\x58\xb6\x79\x37\x37\x87\xb1\x67\x2c\x75\x96\x45\x83\x14\xb8\x99\xcd\xdf\xc7\x12\x03\xe9\xb2\x3d\xdb\x53\xdd\x16\x78\xa0\x56\x83\x17\xfc\x7f\xfe\xc7\x54\x96\x52\xfe\xc0\x35\x80\x9f\xff\x9c\x51\xc4\xf8\x80\x3a\xef\x66\xc4\x00\x07\xd6\x9e\x9a\x29\x9f\xc3\xc0\x6b\x8b\x55\x86\x04\xf0\xca\x9b\x97\xcd\xf3\xc6\xb2\x39\xf9\xab\xea\x48\x53\x87\x0a\x29\xfa\x0f\x89\x37\xe7\x5f\xa2\x46\x41\x4e\xf4\xfa\xe6\x69\xb7\x5c\x6c\x56\xbb\xe7\x97\xf5\xcd\x6a\xb7\x7e\xdc\xfd\x5c\xf9\xe4\x75\x8c\xdc\xaa\x16\x35\x07\x59\x9c\xff\x66\xc8\x0d\xce\x55\xb5\x6e\x5e\x4e\xe5\xa0\xd4\x10\x9b\x50\x67\x2e\x39\x4a\x9c\x8d\xde\xf3\x1d\xbc\xdd\x24\x88\x02\xa7\x1f\xda\x54\x05\xe1\xc0\xdc\xd9\x49\x18\xa0\xe0\xae\xb2\x3d\x45\x46\xc8\x24\x54\x36\x79\xb1\x6b\x2b\x3b\x9f\xa6\xc7\x0d\xe7\xbc\x47\x5c\xd9\xa7\x79\xec\x43\xa2\x84\xa5\x8c\x09\x32\x0e\x24\x7f\xbf\xef\xbc\x8c\xe5\xe7\xa5\x23\x99\x30\xc1\x52\xf0\xc2\x5b\xdd\x6e\x4d\x80\x0e\x2b\x78\x31\x1b\x4a\x24\x4c\xb1\x04\xcf\xa8\x46\x5a\xd8\xbd\xcc\xf5\x5d\x55\x6f\x06\xdd\x5c\xee\x94\x24\x02\x5b\x5c\xfe\x85\x78\xfc\x99\xff\x1b\x6a\x7d\x53\x1d\x0e\x79\xd3\x5c\x78\x7d\x49\x02\xda\xb8\x79\xb6\xe9\x8c\x39\xbe\x59\xe2\x8b\x45\xa9\xad\x30\xd2\xd2\xca\xf0\xce\x87\x2d\x49\x1a\x80\x8a\x5d\xaf\x70\x5e\xbe\x0d\xa0\x0f\x7e\x00\x33\x04\x32\x7a\x2d\xf3\xaa\xdf\xcf\x92\x54\x5b\xa1\x52\xcf\xf8\xb8\x2c\x2a\xb9\x69\xab\x1a\x1f\xab\xd6\xb3\x67\xe1\x60\xb4\xf6\xb0\x15\xca\x5d\xd8\xde\xa9\xc9\x8d\x60\x1c\xf8\xf5\xd2\x79\x23\xf5\x30\x4b\x9d\xf0\x58\x92\xec\xa3\x3c\x7d\x5a\x09\x29\x3f\xb1\x13\xce\xe3\xcc\xd2\x00\xe3\x11\xea\xe9\x55\x33\x26\x28\xdf\xff\x82\x1f\x79\x73\x36\x6a\x49\x96\x44\x14\x30\xd8\x04\x35\xfc\xbe\xfa\x7e\xb2\xc4\x76\x16\x38\x8e\xce\xcd\x1e\x74\xf5\x6b\x20\x65\x2a\x93\x2c\x65\x5e\x93\x84\xa2\x71\x7a\x85\x15\x21\xce\x86\x5b\xda\x39\x6a\x99\xcc\x0f\x99\x4a\x34\x03\xc1\xaa\x4d\x8b\xc7\x6c\xf2\x18\xd2\x08\xaa\xb9\x50\xbe\xb6\x19\x6a\x4d\xcb\x44\x99\xd8\x6a\xb0\x59\x5c\x2f\x82\xee\x6f\x4d\x07\x29\xc9\x58\xbb\xe6\x36\x46\xac\xd6\xee\x18\xc6\x16\xb5\xff\xf8\x41\xf0\xbc\x33\xb6\x4e\x26\xc8\x6d\xdb\x4e\x89\xbf\xe6\xa8\x76\x58\xf0\x1f\xc3\x9c\x51\x82\x99\x20\xd8\xe5\x8e\x44\x57\x48\xfe\xf1\x52\x8b\x5b\x26\x26\xcc\xb4\xfb\xc0\x3b\xe8\xb3\x67\x89\x81\x34\x72\x7a\x42\x14\xce\x4e\xa9\x10\x64\x62\x74\x40\xd7\xdf\x12\xd4\xf6\x0b\x86\xf0\xc9\x8b\x35\x18\x91\xab\xf9\x63\xb5\xd9\xae\x1f\xbf\xed\xd8\xee\x76\xb1\xf5\xc9\xd0\x34\x30\xb6\xc1\xba\xc1\xa2\x98\x60\xc5\x64\x1a\xc6\x8c\x16\xa0\xc5\x65\x2f\x8a\xc2\xf5\x7e\xaf\xcb\x3e\x1b\x70\xc6\x79\xc8\x34\x4c\x18\xb3\xed\xd4\xf7\xf7\xeb\x27\x4f\xf9\x2b\xd3\x50\xc6\xf4\x77\xbb\xf4\x69\x3b\xfc\x1a\xf4\x43\xa7\x10\x44\xa8\x7b\x99\x2f\x43\x7d\xf8\x59\x3b\x9d\x32\x11\x52\xbc\x45\x4e\xe7\x06\xcb\x39\x7d\xd5\x49\x89\x33\x8d\x02\x9b\x5e\x73\x95\xa4\x1f\x96\x2d\x72\x6c\x2f\xd3\x28\xe5\x24\x30\x68\xe9\x56\x7b\xaa\x8f\x09\x0f\xda\x17\x20\x13\x99\x46\xdc\x9a\x7b\x47\xa6\x6a\xdf\xe0\x44\xe8\xdd\x0f\x15\x11\xb3\x05\x54\x28\x46\xb4\xd3\x32\x8d\xb4\x25\xad\x5e\xdc\xdf\x3f\xdd\xec\x5e\x56\x9b\xf3\x01\x4d\x70\xd5\x03\xbc\x63\x8f\x71\x9c\x7b\xde\x98\x85\x64\x21\x5c\x27\xe9\x63\xa5\xf1\xbb\x95\x8c\x1b\xe5\x28\xd2\x38\x01\x74\xed\xab\x4f\x65\x1f\x68\x8e\x6f\x34\x86\x88\xcb\x01\x6c\x87\x9a\x24\xac\xe2\x8c\x1f\xa1\x39\x85\x17\xd8\x2d\x55\xab\x9d\xac\x7a\x45\x1b\x99\x26\x29\x38\xa8\xe9\x47\xde\xc5\xa3\xe7\x15\x99\x26\xa0\x29\x8f\xfc\x50\xc9\xbc\xe8\x82\xe4\x61\x9b\xae\x24\xdd\xad\xa1\x72\xf0\x0e\x7f\x2b\x6c\x9a\x5d\x3b\xe3\x60\xa5\xa9\x6b\xc9\x72\x48\xe5\xfb\x29\x49\x8d\x4c\xb9\x61\x54\x90\xe8\xb6\x1f\x5b\xea\xbf\x18\x20\x2c\xb9\x9d\x6d\xe6\xb8\x6c\x06\x94\x69\xc6\x33\xba\xc6\x37\x92\x8d\xb9\xe0\xa9\x97\x69\x26\x82\x5e\x02\xc1\x91\xa7\xcc\xcf\x63\xd0\x19\xe5\xdb\x8a\xea\x2d\x0c\x6e\x30\x27\x97\x6d\x3c\xc2\xc4\xea\xfc\xe6\x6f\x2c\xac\x72\x14\x7b\xa4\x32\x34\x64\xd2\x94\x61\xb6\x30\xc2\x9e\x55\xff\xe2\x25\x4b\x28\x3b\xf6\x51\xd9\x7c\xff\xc5\xf3\xca\x2c\x15\x9e\x71\x65\x6d\xf3\xf4\x49\x7f\xb2\x01\x2a\x90\x2f\x1f\xd7\x43\x7f\x31\x95\x46\x53\x32\xef\xe6\xb3\xa7\xd8\x9f\xa4\x09\x4e\x53\x0e\x04\x99\xaa\x30\xa5\x67\xb5\x1f\xee\xae\xaa\xc3\x55\xbb\x7f\xf6\x89\x9a\x54\xa1\xf2\x58\x83\xf5\xd1\x58\x02\xae\x6d\xde\x4e\xba\x4f\x65\xaa\x03\x95\x38\x65\xd2\xfc\x70\x3a\x78\x05\xd6\xb5\xed\x55\xf0\xf6\x35\xd5\x20\x2c\xc9\x1c\xbc\x8f\xb8\x40\x64\x8a\x91\x01\xfa\x38\xfb\xea\x54\x68\x4b\x94\x44\xcc\x6e\x93\x5c\x24\x0f\xb4\xa0\x46\x6a\xbb\x90\x5f\x1b\xac\x6f\xb0\x6e\x2d\x2e\x66\x72\x57\x3c\x64\xb6\x8b\x69\xd4\xd8\xf8\xb5\x11\xe3\x21\x13\x10\x0d\xe1\x13\x79\x55\x2f\x7b\x5e\x36\xc9\x59\x1c\x33\x4f\x2f\xfd\x0c\x9f\xa3\xd8\x8b\x47\x22\xa6\x4a\xce\xc3\xe2\xdb\x6a\xd0\x7f\xd9\x1d\xb0\x42\x75\x67\x4e\x8f\xfb\xaa\x99\xac\x13\x1e\x07\x8a\x72\x66\x04\x0b\xfd\x12\x7c\x37\x38\x87\x45\x04\x44\xfb\xc8\xeb\xf6\x04\xbe\x9b\x72\xd2\x05\x20\x79\xc2\x52\x72\x7a\xe4\xe9\xf3\xdc\xbc\xfa\x5c\x4d\xf7\x45\x9e\x70\xdb\x35\xff\xb2\xfa\xf6\xe4\xef\x3d\xc9\x80\xea\x60\xa0\x75\xb7\xaa\x9e\xab\xbc\x9c\xe7\x2f\x95\x3c\x15\xb6\x9b\xd9\x91\xc2\x75\xef\xad\xdb\xc9\x36\x2d\x1c\x8e\xeb\x72\xf1\x02\xff\xee\xb3\x0d\xf3\x8f\xc3\x99\xd5\x5b\x6b\xf6\x79\xe9\x8d\x0d\xe7\xb1\x8d\x84\x89\x0a\x2f\x2f\xdf\xd6\x67\x6a\x2c\xc9\x79\xa2\x13\x57\x86\x6c\x4e\x07\x1c\x09\xdb\xfa\x21\x68\x59\x9d\x77\xa4\x75\x59\x7d\xe4\x1a\xeb\x39\xaf\x80\x67\x12\xa9\xb8\xf6\xba\x59\xbd\xec\x96\xaf\xff\x18\x8a\x93\x48\x9e\x29\x41\xa5\x08\x53\xe4\xc7\xfe\x8b\x8b\x04\x48\x95\x04\x2c\x83\xfd\xf2\xd4\xdf\xb5\xd0\x09\x77\x80\x78\x27\x8a\x37\xc4\x86\x70\x81\x11\x95\xc7\x3e\x88\x92\xeb\xa5\xdb\x02\xa6\x02\x8b\x92\x43\x00\xa9\x19\x32\xe0\x6c\x8e\xa0\xb0\xd9\xe7\xc7\x25\xb4\x6d\x81\x0f\x95\xc6\xe5\xe7\x7a\x62\x3d\x38\x80\x0a\x71\xda\x41\xdc\x74\x93\xdf\x01\x5e\x86\xba\xbb\xf3\xcb\x00\x94\xd5\x8b\xd9\x57\x05\xf8\x5b\x96\x91\x09\x7c\x53\x8c\xeb\x4c\x74\xa6\xaf\x19\x0c\xa1\x12\xdc\x9f\x79\xf9\x76\xca\xcb\xb5\xaa\xfa\x23\xb1\x6d\x34\x52\x50\xde\x3c\x5b\xc8\xf3\xba\xb4\x15\xca\x8b\x2e\x52\x7f\x4a\x96\x72\x57\xe3\xa5\x27\x18\x51\xe2\x8c\x6f\x57\x3a\x0d\xfd\xce\xda\xc0\x5c\x0d\xb8\x1b\x91\x3a\x20\xc9\x07\xce\x61\x11\xb8\x0a\x12\xa2\x54\xb1\x5e\xc6\xee\x8c\x50\x97\x5c\x31\x1b\x36\x75\x4e\xcd\x6e\x5b\x9f\x1a\xa2\x29\xfe\x82\x04\xd6\x9f\x17\x05\x96\xcf\x73\x77\xbb\xeb\x6d\x81\x8e\x32\x50\x67\x8a\x8b\x6e\x52\x7b\x60\xdb\xf8\x6c\x9d\xa1\xd5\x1c\x3b\x42\xed\x73\x4b\x1c\x79\x40\x85\x81\x7e\x25\x3f\x95\x3e\x43\xbf\xc4\x3d\x14\xe6\xca\xad\xfc\xff\x48\x7b\xb3\xe5\xb6\x91\x2c\x7f\xf8\x75\xea\xa2\x2f\xb0\x23\xf3\x92\xa2\x28\x9b\x5d\x92\xa8\x21\x29\xbb\xea\xdf\xd1\xc1\xc8\xe5\xa4\x84\x11\x09\xb0\x01\xd0\xb2\xfa\xe9\xbf\xc0\x39\x99\x89\x85\x90\xab\x26\xbe\xb9\x68\xd7\x08\x20\x08\x02\xb9\x9c\xe5\xb7\x00\x27\x41\x76\x5d\x34\x67\xd1\xaa\x57\x9f\x54\xe5\xc0\xa5\xa1\xa6\xe5\xbb\xa8\xb5\x35\xa3\x7a\x10\xe7\xcd\xa7\x97\x32\x19\x16\xaf\xba\x05\xce\xd9\x9c\xfc\x9f\x0b\x42\xb9\xd1\x9c\xec\x43\x5e\x41\xbd\x7d\x83\x5a\xa8\xa2\x1d\xe1\xf6\x25\x0b\x22\xe5\x88\x60\xeb\xf2\x47\x55\xa8\xc9\x02\xcf\x02\xa9\xb3\x80\x4a\xd6\x94\x2c\x77\xe9\xdf\x27\x0c\x25\xc9\xc2\x00\x68\x8f\xf1\xa1\x29\xf5\xeb\xc7\x56\xf3\x9f\x36\x78\xdc\x55\x0c\x28\xe7\x8d\x6a\xe3\xb2\xe1\x4e\xc6\xa2\xd0\x04\x23\x7a\xee\xb2\x0b\x7b\x5c\xe2\x3b\x7f\x67\x91\x4e\xad\x00\x5a\xf9\x20\xde\xe0\xb1\xba\x83\x6b\xed\xbb\xd1\x78\x66\x09\x64\x0e\xbe\x6f\xb1\x94\x0f\xe2\xe7\xf2\x55\xa0\xe6\x4e\x3d\xd9\x5a\x58\x1a\xc5\xe8\xbf\x23\xb4\xb6\x5e\x1b\xe3\xe9\xc1\xd2\x2c\x72\x22\x10\xe4\x63\x84\x51\x9a\x3b\xc8\x55\xc0\x7b\x45\x11\xb4\x16\xf3\xc7\x0c\x39\x93\x79\x3e\x55\xaf\x18\x86\xe5\x9d\x59\x0c\x01\xcb\xb4\xc1\x36\xe0\xa9\xfa\x41\x33\xe0\xf6\x6a\x4e\x33\x16\x05\x2e\x17\xfd\x5e\x17\x2d\xca\x7f\x4d\x51\x94\xe3\xe1\xc0\xac\x3b\x47\x6f\x8c\x6b\x5c\xd4\xc4\x58\x2a\xb0\xe9\xd6\x63\x86\xff\x6e\x47\x61\xfe\x95\xf1\x94\x8c\x3b\xbc\xdf\xcd\x57\xd1\xbc\x6e\x2f\xee\xeb\x38\x27\x12\xab\x06\x53\x57\xcd\xa8\xd1\xc2\x44\x96\x23\x39\x9a\x9a\x0e\x77\x55\xbd\x1c\x38\x43\x49\x26\x13\x89\x35\x3d\xeb\x02\x84\x62\x07\x93\xb7\x25\x39\xc7\x1a\xef\x41\x68\x8d\xae\xf6\xa2\x6c\xef\x6a\xf1\x42\x6e\x42\xf3\x37\xac\x22\xee\x0d\xfc\x3f\x7e\x07\x29\x64\x5f\xda\x67\x2a\xc9\x49\xb4\x01\x53\xe6\x41\xf6\xc9\x94\x4c\x84\x25\x63\x7f\xa9\xc4\x71\xb2\xac\x32\xa5\x73\x35\x12\x07\x00\x38\xb8\x8f\xea\xc0\x60\xc6\xdf\x36\xad\x33\x14\x91\xcc\x98\x04\xb7\xb4\xb7\xaa\x28\x55\x55\xc2\x9b\x1b\x65\x3c\x60\x1a\x59\x31\x36\x35\x72\x44\xbb\x81\x7a\xb0\xe4\x61\x64\xac\xe1\xd6\x1b\x94\x4b\xca\xe1\xfc\x05\x42\x96\xc5\x56\x7b\xff\xb6\x16\xef\x4f\xe3\xf1\xc4\x43\x91\x39\xc5\xdc\x2f\x70\x7a\x42\x5f\xde\x69\xac\xc0\x43\x01\xae\xc0\xdc\xcd\x03\x8c\xa6\xbc\xb1\xeb\x27\x55\x35\x1e\x9a\x10\xbb\x2d\x67\x94\xad\x22\x47\xc3\x03\x0c\xf5\x02\x25\x8f\x82\x24\x52\x5e\x35\x98\xba\xf0\xe3\xab\x44\x31\xc3\x6c\xac\x1b\x9c\xda\x7f\x4c\x1a\x41\x48\xd9\xea\x74\xbe\xb4\x4e\xe3\x7a\xd6\x3f\x73\x7e\xa1\xe5\x91\x8a\x98\xf6\xeb\xfb\xea\x07\xd4\x1f\x61\x10\x04\xdd\x23\xca\x7f\x9b\x9e\x2a\x71\x15\xb0\x7a\xc3\x23\x70\xef\x27\x57\x8f\x03\x92\x71\xf9\xbd\x3a\x17\xaf\x45\x2b\x4e\xc3\xa1\xce\x63\x21\x71\xa0\xde\x3c\xff\xb9\xda\x1e\x76\xfb\xd5\xd3\x21\x1c\xaf\xe1\x3c\x86\x18\xa3\x3b\x1c\xc7\x55\xb7\xbe\x34\x23\xa8\x17\x8f\x0d\x99\x76\xbb\x5c\xf3\x16\x7e\xdc\x81\x7f\xae\x49\x02\x38\xd1\xac\x60\xd2\x73\xe3\x1f\x5d\x92\xc6\xa1\x8b\xd4\x57\xff\xb9\x38\x3e\xa2\xe4\x09\x8f\x1c\xc3\x92\xc0\x17\xce\x9a\x5a\xcf\x25\x96\x3c\xe1\x90\x86\xce\x2c\x98\x64\x42\x26\x67\xa4\x81\x8a\x7b\x84\x02\x0a\x8a\x3c\x2c\xe7\x10\x95\x3c\x65\x01\x02\x49\xb0\x79\xd1\x3b\xb2\xc8\x2e\x8c\x44\x12\xeb\x0d\xa1\xff\xc6\xd7\xcf\x82\x30\x02\x8b\x6a\xd8\x57\x51\x9a\x4d\x1e\x61\x96\x0a\xb0\xed\xab\xdf\xc1\x69\xa3\x49\x9e\xc9\x40\x53\x36\xf2\xc7\x61\xf5\xc7\xf2\xeb\xe2\xf1\xcb\xea\x70\xb7\x5a\x1d\x7a\x5e\x94\x3f\xd5\x84\x88\x68\xdc\xa0\x5d\x87\x77\xb0\x97\x3c\x4f\x33\xf4\x41\x90\x97\x8f\xe5\x11\xbb\x42\xdd\xae\xdf\x2c\x5e\x44\x51\x36\x24\xef\xed\x4e\x65\xa9\xc5\xd9\x12\x4a\x6e\xf7\xee\x94\x75\xba\x43\x39\x8a\x40\x3a\x5f\x43\xca\x88\xc7\x50\x1f\xce\x52\x8d\x55\x9e\x87\xc5\xf6\xf7\xd5\xfe\xb0\xfb\xba\xd8\xfa\xfb\xe3\x41\x82\xd1\x0b\x31\x5e\x1a\xdc\x4d\x8b\x19\xc4\xf6\xa0\x03\xc1\xb9\x22\x39\x55\x4c\x1b\x76\xe8\x56\x3a\x79\x1b\x22\x22\x20\xfc\xc3\xfa\x71\x7d\xf8\xb2\x78\x58\x1d\x16\xb7\xb7\x87\xfd\xfa\x61\x75\xb8\x5d\xdd\x2d\x9e\xef\x5d\xec\xcf\x45\x4c\x75\x55\x74\x16\x2c\xfe\x0b\x0f\xa2\xfc\xb0\x60\x35\x57\x62\xea\xce\xc1\x7e\xd3\xb9\xae\x4e\x15\x69\x39\x9d\x0b\x50\xe0\x08\x7e\xc3\x28\x81\x8b\x14\xd0\x3b\x5e\xfc\x10\xc5\x51\xc8\x23\xa0\x69\x93\x3b\x28\x14\x26\x15\x97\x06\x9a\xfb\x42\xd6\x5e\xd6\x4c\x72\x01\x39\x19\x50\x89\x6e\x58\xf7\x10\x17\x52\xcc\x73\xf4\x7c\x7b\xb2\x8c\x45\xac\x26\x3a\x35\x89\x3f\xa8\x4d\xe2\x33\xff\x5d\x65\x5a\x25\xce\xeb\xa6\xb9\xf4\x1f\x57\x2c\xc5\x12\x46\xfb\x5a\x57\xef\x6b\x43\x91\xaa\x68\x48\x82\xb9\x1d\xac\x6d\x3a\x23\x91\xee\xfb\xea\xe5\x16\x90\xc9\x3f\xbb\x05\x71\xcd\x32\x2c\x6a\xdd\x50\xec\x64\x9d\x02\xc7\x63\x5d\xeb\x50\xd8\x8e\xd9\xc3\x10\x73\xce\x21\xca\x53\x42\x0e\x75\xdf\xb0\x2a\xdb\x2e\x5c\x1c\x5d\x5f\x04\x21\x39\xc7\xdf\x5f\x4a\x51\xdf\x17\xa5\x0b\x9a\x45\x00\x9c\x67\x56\x22\x59\x1d\x2f\x57\xdf\x2a\x42\x23\x5c\x9f\xee\x50\xa8\xaa\x2c\xfe\x73\xb0\xde\x36\x87\xea\x3c\x28\xf2\xf6\xc3\x4b\x44\x29\x60\x4a\x6d\xcf\xfb\x2a\x6a\xad\xfc\x88\x17\x91\x1a\x02\x90\x9f\x2e\x75\x33\x32\x6f\x91\x22\x49\x9d\xe6\x6d\x53\x94\xd5\x2f\xc5\x74\xdc\x27\xa4\xc2\xbe\xef\xa1\x81\xf6\x6b\xf5\xde\x0d\x41\x52\x85\xba\x05\x55\xe8\x49\xf4\x24\x12\x93\x11\xa7\x0f\x63\x0b\x22\x6b\x5c\x27\x4e\x22\x0d\x8c\x0e\xad\x4e\x4c\x2d\x5a\x2c\xa8\x78\x0b\xdc\xd9\xb7\x28\x52\x26\xb0\xd6\x69\xf9\x49\x23\xc6\xae\x14\x29\x67\x88\x22\x21\x33\x70\xff\x57\x99\x20\x5c\x08\x4a\xfd\x19\x47\xc0\x9e\x99\xa5\x0c\xd7\xba\xd5\xf1\x58\x9d\x8a\x8b\xdb\x49\x44\x96\x45\x88\x6a\xb9\xdb\x7f\xfb\x7b\x25\x77\x91\x65\x80\xa8\xb5\xe6\x58\x28\xb8\xa1\x66\xc1\x18\xcb\xe1\x4e\x14\xb1\x05\xa1\xb7\xde\xc5\xb0\xa7\xe5\xff\x32\x0c\x14\x79\xa2\x85\x73\x2c\x85\xa6\xba\xd4\xea\x8a\x32\x36\x0e\x52\x05\x63\x2c\x8f\x9c\x74\xb8\xae\xde\xfd\x2f\x64\x3c\x08\xa5\xd7\xfd\xa9\x2e\xed\x60\x2d\x17\x4c\x82\x13\x9f\xa4\xa5\x6c\x06\x04\x2e\x78\x28\x70\xd0\xd5\x28\x56\xfc\x5e\x0d\xe2\x0f\xc1\x45\x8e\xa3\x87\x1c\x3b\xb6\x08\xa9\xbd\xa9\x9c\x30\xac\x14\x5c\xd1\xce\xe4\x86\x3d\xae\x9a\x23\x58\x83\x10\x01\x19\x2a\x92\x27\xce\xa2\x6d\x07\x84\x95\xc9\x63\x11\x81\x44\x22\x82\x38\x41\xa9\x29\xcb\xb2\x12\x98\xc4\xea\x1c\x4d\x05\x29\x72\x2c\x8e\xad\x16\xce\x20\x59\x0a\x15\x85\xd8\x64\x1a\x85\x54\x27\x51\x94\x4b\x71\x5e\x97\x5e\x49\x46\x0a\xc5\x18\x02\x5e\xbd\x6f\x45\x14\xf8\x43\x82\x86\x0c\x89\x88\xec\x86\x54\x63\x77\x86\x8c\xd0\x06\xbd\x0b\x50\xd1\x12\x06\x2b\x35\xc5\x8b\x7f\x27\xca\x18\xec\x62\xa3\x70\x0e\x72\xac\x6f\x26\xc8\xfa\xf1\x05\x75\x9c\xbb\xe6\xa2\x97\x53\x1c\xbb\xab\x49\xa1\x33\x2b\x6d\x71\x46\x5a\xc4\xa0\xb3\x28\x74\x2e\x31\x0a\x50\x57\x28\xe7\xf9\xe8\x4b\x68\x2d\x11\xb2\x7d\x33\x70\x12\x90\x02\x02\xd2\x05\xc5\x42\x4d\xd5\x14\x43\x7c\xde\x3f\x46\x9f\x87\x80\x63\xcc\xfd\x08\xef\x5b\x2a\x78\x7e\xc2\xc0\x10\x10\x26\x59\xee\x97\xdf\xc5\xf1\xb8\xf8\x21\x5a\xe1\x33\x08\x01\x42\x3b\x50\xde\x76\x58\x48\x98\x0c\x51\xd0\x9a\x90\x7f\x47\xd1\xbc\x76\x8b\x0d\x6a\x77\x0f\x9a\xee\xc2\x24\x39\x1a\xf5\x6c\x9e\x56\x28\x96\xb9\x7b\x7e\x7a\xba\xff\xd3\x7d\x8d\x49\xc3\x20\x21\xdd\x2a\xdb\x28\x18\x7d\x36\xcd\x32\x3d\x80\x43\x94\x2d\x2a\x95\xff\xfa\x19\x1a\x00\xe6\x9d\x4f\x9a\x7d\xf5\x50\xf8\x6d\x5a\x06\x21\x63\x2e\xa5\x20\xea\xb5\xed\xea\x8c\x7e\x95\x0c\x12\x85\xbc\x55\x0d\xb2\x1d\x44\x75\x32\x48\x53\x5c\x0c\x11\xce\x8d\x23\xf7\x3b\x14\xfe\xa0\xe2\xa9\x18\x16\xf7\x1c\x38\xcc\xba\x98\x8f\xc7\xaa\x0c\x03\x52\xcb\x7e\x84\xf7\x81\x0d\x85\x94\xa1\xce\xb3\xb0\x0f\xbb\x6e\xb0\x3f\xe6\x80\x0c\x53\x1c\xb6\x8c\x8c\x46\xb9\x9c\xfd\x76\x3f\x0c\xd4\x65\x1c\x6a\xac\x8d\x9c\xc4\xdb\x34\xbc\x95\x49\x1c\xa3\xc2\xd4\x2d\xc0\x79\xf4\xa1\x24\x0d\x11\x48\xbb\xdf\xec\x17\xf7\x87\xef\xeb\xc7\x5d\x7f\x24\x49\x9c\x37\xb4\xaf\xbe\x1f\xda\xea\xe0\xb4\x8c\x0e\xef\xe4\x81\x7b\x30\xd6\x48\xcd\x7d\x32\x0d\x34\xb2\xb1\x5b\x10\xa7\x9e\xfa\xea\x95\x93\xe7\xe7\x9d\xcc\x20\x55\x7c\x54\xf1\x3c\x23\x17\xf0\xb6\xea\xd6\x8c\x5e\x3c\x71\xfe\xa1\xe4\x81\x72\x5a\xb1\xf7\x9b\xe5\xe4\xd7\x33\x19\x62\x85\x7d\xbf\xda\x39\x65\x03\x29\x39\x0b\x11\x02\xd0\xad\xa2\x07\x73\x14\x2f\x87\xcd\xa3\x3f\xa6\xa5\xe4\x3d\xc4\x79\x59\x5d\xce\xfd\x5e\xfa\xaf\xa8\x07\x0c\xb3\x7f\x8f\xd1\x8a\xff\x8a\x6c\x28\x29\x45\x6c\xb0\xed\x72\xbb\xdc\x8d\x1e\xb8\x50\x3a\x21\xa4\x40\x61\xcc\x24\x4f\xe9\xe6\x16\xee\x1f\x45\xa9\xa0\xec\xd2\x78\xaf\x1c\x5b\x54\xa5\x53\x16\x70\xf3\x55\x76\x2b\x1f\x73\xe5\x37\x94\x04\x9b\x34\xc5\xec\x79\x2a\x94\xc6\xd3\x31\x1b\x1c\x5a\x36\x6e\xbf\xab\x6a\xf4\xe8\x9a\x9c\xcf\x52\x9c\xa0\x5f\xca\xaa\x29\x9a\xbd\x38\xfa\x37\xab\x18\x89\xa8\x34\xe4\x10\x50\xbc\x94\xb7\xa2\x38\x7e\xcc\x90\x92\xa5\xd2\x06\x01\x32\x42\x6b\x4a\x78\xd5\x24\xd4\x93\x9a\x05\x7c\xc0\x40\x74\xd5\xec\x75\x79\xff\xbc\x9f\x9e\x2a\x02\x54\x32\x79\x1a\x20\xa3\xa5\x56\x54\x0e\x22\x00\x07\x12\x17\xc6\xbf\x03\xa2\x10\x3b\x70\x0b\xd5\x5e\xac\xe2\xe7\x48\x14\xa6\x3b\x23\xc5\xcd\xe3\xa6\x7a\xa9\x7a\xe5\x2c\x29\x21\x0e\x10\x3c\x72\x57\x55\xde\x2a\xca\x1f\xe3\x39\xbe\x58\xea\x63\x3e\x97\xc5\xcf\x2b\x33\x0e\x29\x41\xc4\x89\x05\x90\x3f\x54\x1a\x50\xca\x65\xd1\x8e\x80\x33\xf6\x4c\xc3\x72\xae\x3c\x3f\x94\x8c\x4d\x3f\x51\xcb\x73\x9f\xe0\x49\x14\x8c\x18\x67\xdf\x56\xbb\x19\x58\xc8\xe4\x7b\x20\xcc\xec\x1d\x91\x32\xc4\xec\x1e\xa1\x02\x2b\x3a\xe8\x67\x3c\x9e\x4c\x00\x95\xf9\x4f\x84\x91\x0e\x6d\x93\x64\x5b\x94\x2f\xbb\xe2\xbf\x6e\x13\x53\xa1\x32\x28\x17\xee\xf5\xe2\x0f\xef\x63\xf0\xac\x8a\x92\x08\x53\xff\x87\x4b\x33\x94\x5b\x95\x2a\xca\x12\x2c\x9c\x97\x28\x68\x80\x5e\xb9\x8b\xe3\x71\x5f\x4d\x75\x0c\xbb\x33\x53\xa1\x3c\x61\x67\x07\xea\x0d\x26\x6c\x01\x15\xcb\x3c\x06\xbb\xf1\xbd\x88\x16\xbe\x0a\x92\x0c\x9d\x38\x8e\x48\x15\x1b\x19\x90\xe3\x48\x51\xea\x43\xf3\x2a\xba\x44\x7d\xac\x93\x60\xcf\x4c\x12\x86\x71\xda\x53\x97\xc5\x3d\x78\x31\x5d\xa9\x92\x8c\xa3\x54\xc4\x6e\xbf\x1d\xfd\xa0\x34\x22\x30\x1d\xe6\xdb\xeb\xe6\x28\xfa\x89\xac\x52\xce\x10\xbe\x58\x34\x54\x71\x98\xd4\x77\xc7\x6f\x52\x65\x56\x0a\xe7\x44\x44\x66\x5b\x69\xf9\xe4\x5c\xae\xb0\x70\xb4\xab\x54\x21\x8e\x08\x01\x1c\xdd\x55\xa6\x48\x68\x1a\xfe\x17\x4a\xf3\x3e\x62\xc6\xab\x3c\x4f\x53\x35\x74\x2c\x11\x27\xf8\xa3\xdb\xeb\xef\xea\xea\x74\x2b\xce\xe7\xcf\x4a\xb9\xff\xf0\xa2\x71\xcc\x5d\x8a\xa5\x09\x0c\xda\x40\x9f\x54\xe1\x14\x4b\x32\xd7\xdf\xbf\xa9\xaa\xa6\x85\x89\x65\x45\xb7\x34\x29\x9e\x7b\x03\xa3\xa5\xa8\x75\x83\xc5\x79\xa2\x8a\x69\x3f\xb5\x15\x13\x80\xed\x6c\x2b\x89\x86\x11\xc8\xc1\x6b\xc3\x48\xc5\x83\x08\xa3\x18\x53\xd5\x0a\xb6\x5e\x19\x4b\x2a\x1e\x02\x67\xa3\x16\x03\xb6\xcc\x6f\x2e\x1f\xab\x9f\xbf\xf6\xa3\x97\x8a\x2b\x86\x93\x19\x6f\xe9\xb0\xdf\x2e\x96\x87\x98\x05\x2e\x9a\x55\x22\x88\xb0\x35\xda\xd6\xa2\x29\x6d\x2f\x7b\xc4\x10\x9c\x5c\x4e\x08\x25\x7c\x7f\xc5\xe5\x35\xf3\x7a\xbe\x97\x19\x1c\xae\x12\x52\x85\x7d\x02\xf9\xa0\xdb\x7d\xb7\x23\xcf\xf5\xd6\x94\x8c\x49\xc6\xc6\xca\xc4\x0d\x21\x33\x4a\x65\x29\xea\xcf\x2d\x96\xf7\x87\xc5\xd3\xd3\x61\x7d\xeb\x8f\x18\x8e\x01\xcd\xae\x40\xf9\xbf\xe1\xe8\xd1\xa9\x46\xdf\x34\x0f\x63\xc3\x6a\xca\x68\x80\x69\x45\x5e\x49\x6e\xa9\xb1\x71\xf9\x2c\x1f\x59\x41\x64\x94\x6d\x25\xd0\x24\xb9\x11\x0d\xe8\x91\x09\xe4\x95\x68\xcd\x80\xd2\xa3\x4c\xa2\x31\xf3\x29\x54\x65\x77\xc9\xe9\x23\x30\x0c\x14\x8c\xc0\x25\x74\xf5\x5f\x66\x8f\xca\x70\x06\x59\xdf\x0a\x44\x34\xb7\xa8\xe7\x8c\xd4\xa4\x32\x46\xa3\x18\xda\xee\xb5\x7a\x1f\x45\xb5\xc3\xb7\xa6\x83\x3c\x43\xad\x11\x1b\x7c\x4c\xf6\xe8\xf1\xd7\xeb\x20\x37\xa8\x0a\x7d\x16\x85\x76\x24\x81\x71\xfb\xc0\xad\x82\x3a\x60\x0a\x03\x1e\x62\xfb\xfe\xbd\xca\xb3\x0e\x65\xce\x22\xcf\xe1\xe9\x86\x35\xd6\xbd\x0f\x65\x45\x89\xb6\xaa\xfa\x39\xa7\xa3\xd0\xa0\x81\xd0\x3f\x6f\x50\x12\x72\xa8\x41\x2c\x75\x94\xc4\x98\x5d\xec\xa0\xfd\xfe\xfa\xf1\xdb\xe8\xd6\x22\xa1\x70\x73\xb2\x01\xb0\xa7\x84\xa3\x8e\xbc\x38\x8e\x97\x73\x1d\x49\x6d\xb4\x5f\x03\x16\x97\x11\x66\x5c\x47\x2a\x47\xb2\x7d\x17\xe8\x74\x0f\xee\x77\xf8\xb0\xcd\x99\xd1\xcb\xd0\x11\x28\x1d\x0d\x46\x9f\x77\x97\xfd\xf5\x0b\xd7\xb1\x4c\x02\xdb\x4d\xb9\xbf\x4c\x0c\xd6\xa4\x8e\x8d\xc0\x4a\x37\x59\xa9\x6f\xde\x41\xdf\x55\xf5\xe2\x5c\xdc\x55\x35\xfa\x00\xcf\x6f\xa2\x3a\xe1\x09\x7a\x1c\xa1\x8c\x73\xff\x40\xd3\x90\x10\x06\x28\x64\x53\xd5\x76\xbc\x0f\x65\x82\xa5\x4e\xf3\x90\xaa\xf7\xfb\xe5\x70\x76\xe9\x54\x4a\xd4\x46\x6d\x2c\x10\x72\x98\xa5\xea\x4c\xa9\x2c\xb7\xdd\xf0\x5b\xd1\x8a\xbf\xe7\xb7\x22\x35\x4b\x15\x79\xf9\x75\x2f\xc4\x52\x1e\x93\xb9\x8a\x8c\x66\x2c\x27\xc7\xbb\x56\xbc\xc1\x43\x51\x2e\x7c\x77\x4c\x33\xc8\x9c\xc4\x0f\x41\x8b\xf1\xf7\x3c\x41\xfd\x15\xea\xa2\xbd\xb6\x42\x99\x5e\xd9\x98\xdc\xca\xe4\xf9\xd8\x78\x5f\x3d\xd5\xc5\x7f\x61\xc0\xc3\xd5\x3c\xe5\xa8\x4f\xf6\x05\xca\xe5\x6b\x41\xb9\xc4\x01\xf9\x5a\xd7\xdc\xd3\xc9\x37\x70\x1d\x61\x21\x65\x5d\x22\xa1\x69\x29\xd0\x6c\x6a\xfc\xc6\x84\x05\x9f\x5b\xb4\xfd\x97\x4a\x1c\xbf\x8a\x5a\x7b\x2d\x7a\xa9\x65\x94\x60\x70\x89\x98\x15\xa0\xc5\x64\xec\xd4\x24\xb5\x4c\x0c\x56\x92\xbe\x40\x4b\x16\x36\x63\xb1\x0a\xad\x52\x81\xfa\x05\x36\xb1\xad\x85\x06\x0c\x74\xed\x61\x1d\x47\x36\xa8\x43\x89\x68\x12\xe8\x6f\xc6\x62\xac\x52\xeb\x8c\xcb\x1e\x20\x66\xed\xc1\xec\x31\x88\x0c\x22\x62\x8a\xe6\xb9\x24\x74\xea\x04\x89\xa2\x4d\x10\x19\xe9\x8d\x07\x86\x48\xad\xd9\x3d\x5c\x9b\x98\x91\x32\x5e\x75\xd4\xf8\xd0\xf1\x87\xaf\x9b\xe7\x1e\x63\xac\x0d\xcb\x30\x5b\xbb\xaf\xd4\xdb\xc5\x3d\x30\x08\x44\x48\xf2\x82\x8e\x39\xfd\x2a\x88\xb2\x6f\x55\x5e\xfd\x79\x90\x20\xb7\xcb\xd6\xb9\xbe\xd4\xa2\x6c\x01\x9a\x07\x71\xc6\x72\xdb\xe8\xf6\x21\x0a\x43\x2a\x63\x69\x6c\xb8\x7d\x07\x70\xd9\x0c\x44\x71\xa0\x62\xeb\xfc\x80\x01\xd7\x0c\x4b\x09\xa2\x98\x64\xb0\x1b\x68\xd7\xaa\x72\x86\x27\xc8\x9d\x18\x40\x76\x21\x8a\x25\x4f\xbc\x10\x0c\x55\xde\xf0\x77\xf8\x2f\xe3\x26\x4e\x1c\x50\xb3\xaa\x9b\x11\x18\x13\x22\xe0\xce\x1f\xd2\x99\x32\x8e\xaf\x1f\x47\x09\xae\xf3\x87\x06\xda\xdd\xe5\xe5\x85\xf4\xc2\xf5\x6c\x13\xd1\x7d\x24\x4e\x55\x0f\xb9\xbd\xad\xd4\xe5\x34\x54\x87\xea\x27\x6d\xe8\x3f\x91\x03\xee\x91\x37\x7f\xde\x0c\x97\x12\x88\x45\x90\xdb\xe4\x7a\xb4\x6e\x43\x2c\x89\x43\xf1\x3b\x9c\x8f\x50\x0f\xd0\x72\x90\x04\x59\x64\x0b\xb2\x97\x79\xc3\x83\xfe\x46\x93\x38\x92\x96\x81\x1c\x8f\xc0\x78\x90\x24\xc6\x95\x75\xfd\x9e\x30\x89\x8b\xfd\xcd\xa7\x49\x90\x98\xd1\xf6\x6d\x0d\xef\xaf\x0b\xff\x90\x66\x31\x25\xa7\x27\x28\xf5\x7d\xf5\x59\x0d\x14\xd2\x2c\xd3\xe0\x2b\x66\x4b\xd1\x28\x31\xad\xd2\x43\x2e\x88\xab\x49\xf6\x74\xe7\xb6\x7a\x18\xea\xb5\xb8\x93\x24\x43\xf5\xfc\x3f\x2f\xe5\xef\xa2\x18\x3e\x28\x16\x24\xf8\xe6\xbb\x0d\xf6\x1b\xd1\x27\x7b\x5e\x01\xb0\x2c\x8a\xc9\x1e\xe3\xc7\xf3\xf9\x93\x9b\xe4\x60\x10\x38\x75\x23\x9a\x42\x8d\x30\xa3\xe3\x91\x2c\x92\x24\xb4\xe8\x81\x75\x0b\x27\xa7\xf0\x3c\xbe\x98\x4c\x73\xec\xbf\xec\x5e\xab\x1a\xfe\x1e\x00\x15\xa4\x4a\xb3\xd8\x1a\x13\x5f\x90\xfc\x59\xb4\xbb\x5f\xf1\x95\xed\xe7\x54\x40\x38\x50\x34\x86\x0d\x1c\x60\x15\x54\x92\xa6\xc6\x6a\x66\x17\xe5\x05\x26\x12\x71\x12\x54\x1e\x61\x3d\x03\xc1\x17\x5f\x05\x25\x00\x30\xe6\xd0\x81\xca\x19\x96\x70\x6a\xc2\xf7\xd0\x44\x99\x13\x44\xb0\xe7\xeb\x30\xc5\xa5\x14\x5d\xd4\x4f\x45\xf9\x89\x2c\x0d\x68\x69\x52\x61\xd3\x83\x21\x6f\x03\x40\x64\x18\x5e\x9d\xa1\x1e\x18\xba\x4d\x45\xc3\xec\xc9\x06\x28\xb7\x52\xe2\xa8\xf6\xae\xec\x6d\xaf\x64\x02\xce\x02\xa7\x6c\x39\xc5\x13\x9a\x40\x06\xe8\xe1\xf4\x56\x1c\x8f\xd3\x43\x46\x58\x7b\x94\x56\x1c\xbf\x8b\x17\xa8\x29\xfa\x98\x0b\xf8\x4d\x18\x07\x88\x2b\x97\x53\xf3\x8e\xd1\x3b\x32\x61\xcc\x30\x64\x35\x15\x22\x79\x77\x6d\x55\x8b\x17\xf8\x86\x65\x54\x77\x4a\xca\x43\xed\x0a\xac\xe5\x87\x8f\xfb\xfa\xf9\x66\xa2\x90\xc5\x96\x6b\x35\xa2\xcf\x99\x28\x53\x58\x68\xb9\x85\x1f\x85\x82\x81\xbd\xba\x34\x91\x20\x2c\xb4\x72\x8a\x2d\x37\x1f\xfe\x90\x8c\x82\x78\x16\x08\xf4\x57\x80\xa0\xff\xbf\xff\x0e\x7e\x53\x9c\x64\xe8\x83\x74\x68\xe0\x78\xc4\x3b\x99\x9f\x77\x26\x49\x63\x7c\x3e\xda\x85\xe7\x36\x7e\x1b\x9f\x95\x65\x22\x88\x06\x10\x89\xed\xa5\xf4\x03\x22\x33\x06\x99\xe7\x68\x1f\x36\x2a\xa6\x9b\x5c\xd1\x1c\x2a\x1a\x8c\x75\x3f\xd4\xe4\xb2\xb9\x52\x11\xad\x60\xe7\x63\xf5\x71\x57\x94\x45\xf3\xea\x77\x52\x93\x9b\x00\x51\x61\x77\x8b\xa7\x3b\x7a\xc1\xee\x08\xe3\x80\xfb\x8d\xcb\x29\x6e\x29\x19\xb9\x2e\x4a\xfc\x3a\x7f\x30\x3c\x48\xbd\xe3\x5a\xdf\x4d\x79\x17\xb5\x7e\xaa\xaa\xe3\xbc\x34\xa3\xe1\xb1\x42\xe1\x00\x4a\x38\x56\x3f\xcf\xc7\xaa\x46\x6f\xb5\xe7\xa6\x28\x5f\x56\x0f\xd5\x35\x95\xd5\x7d\x32\x4f\x71\xa7\xfa\x5a\x9c\xbb\x74\xf3\x4e\xd4\xbd\x70\x85\xe1\x22\xc4\xed\xed\x3f\x17\xa8\x3f\x96\xaf\x85\x2c\x16\x7a\x12\xed\x18\x2e\x33\xed\xf9\xc6\xaa\xaa\x75\x6f\x4f\x32\xdc\xf9\x8c\x08\x19\x88\x81\xb0\xbf\xc5\x2e\x4e\x9e\xaf\x88\x15\xd6\x03\x1a\x25\x86\xa3\x5e\x8a\x00\xd9\x14\xee\x5d\xdf\x81\xed\x9f\xd8\xf0\xdc\xa8\x30\x42\x9c\xd3\xae\x2a\x0b\xc7\xef\x34\x3a\x24\x70\x06\x69\xa0\xef\xc4\x11\x46\x31\x84\xd1\x39\xc7\xd6\xbc\x35\xcd\xb8\x13\x6e\x17\x31\x90\xe9\x04\x59\xda\x36\x06\x40\x93\xe1\x66\x9c\x55\x19\x90\xd2\x41\xaf\x56\xfb\xaf\xdb\x4f\x55\x20\x8d\x09\x49\xd7\xa2\x0b\x45\xac\x8a\xdb\xfc\xc0\x37\x91\x42\xdb\xdc\x83\x13\xd5\x1b\xcb\x83\x4d\xae\x9a\x59\x2c\xe9\x20\xaa\xff\xc4\x65\x59\x1a\x23\x43\xd1\x73\x20\x97\x55\x69\x8e\x85\x6a\x7b\x26\xf6\x68\x12\xa8\x20\x60\xd6\xaa\xc2\x0e\x42\x85\x7a\x69\x9f\x7b\x85\xa9\x20\x50\xe4\x94\xdc\x40\x7b\x10\xb5\x2c\xda\xe6\xd0\x23\x09\xfc\x22\xa0\x82\x10\x62\xd4\xbd\xf6\x18\x10\x9a\xdb\xfb\xca\x06\xad\xbf\x8d\x2f\x1b\xc5\x4c\x5a\xf5\xa6\xe6\x72\xd2\xa2\x15\xd1\xe8\x2d\xa8\x20\xca\x89\xd8\xef\x8a\x6e\x7f\x25\xcc\xe0\x3e\xa6\xf3\xd8\xb8\x12\xff\xb1\xaa\x67\x9d\x95\x54\x10\x27\x39\xe6\x44\xe5\x43\xf3\xd2\x7c\x17\x45\xeb\x07\xa5\x0a\x62\x15\x27\xf6\x27\x3b\xc7\xa1\xb9\x9d\x43\x05\xa9\x66\x58\x77\x87\x9f\xa0\x2e\x2d\x50\x35\x79\x28\x90\xf9\xaf\xb8\x2f\xbf\x24\xe3\x7a\xf4\x95\xac\x83\xbd\x66\x16\x49\xec\xd0\x40\x49\x78\x84\xc1\x26\xa1\x82\x4c\xc5\x29\x35\xb6\x7e\x62\x42\xe1\xff\x6e\x52\x10\xde\x30\xa6\xa8\xb4\xb3\x37\xb0\x49\xd4\x5d\x35\x9f\x6e\xab\x20\x0f\xc9\x14\xc1\x29\x97\x7d\xaf\x5c\x8f\x43\x05\x79\x6a\x44\x6e\x1b\xca\x7b\x10\xa7\x7d\xcf\x0e\x55\x41\x2e\x48\xec\xc1\x5a\x55\x3c\x54\x12\x5f\xd2\x2f\xa4\x74\xfb\x97\x9f\x6b\x0b\x31\x43\x7c\x86\x81\xba\x16\xc7\xe6\x3b\x14\xb3\x79\x94\x0a\x18\x50\x23\x99\x82\xca\x5d\x97\xd9\xfd\x3f\x77\x1b\x5c\x65\x48\xa2\xdd\xfc\xb1\xf9\x85\x8e\x88\x0a\x44\x94\x21\x34\xc4\x42\x0e\x1f\x8a\xd2\xad\x4d\x2a\x90\x91\xc2\xa1\x8b\x59\xe1\x5c\xcd\x4d\x05\x32\x15\xa9\xf1\x4e\x4a\xd3\x67\x39\xb9\x5f\xc9\x13\x27\x5f\x67\x29\x05\x2e\x8b\x19\xbd\x69\xc9\xb5\x31\x14\x67\xad\x7e\x16\xed\xbe\xfa\x9f\x0b\x5c\xe0\xb3\x6b\x7f\xf2\x28\xa5\x64\x60\x71\x5a\x95\x39\x54\xe6\x40\x6b\xe2\xe1\x0d\x3e\x22\xf7\xfb\x74\xa0\xb0\xca\x70\x73\xbc\xc0\xbe\x68\x45\x59\x5c\x4e\xcb\xa3\x68\x1a\x67\x75\xaf\x02\x08\x63\x5c\x31\x69\xd4\x3d\x88\x6e\x31\x2b\xfb\xf4\xbb\x3b\xc1\x20\x85\x0e\xf3\xb9\x8d\xd7\xea\x55\x01\x44\x09\xae\xe0\xcb\x57\x50\x6f\xb7\x9b\xfd\xe4\x47\x02\xcf\x15\x71\x19\x5e\xba\x90\x7c\x58\x08\x53\x81\x09\x73\x74\xac\x34\x00\x56\xfa\xba\xf1\x87\xb2\x14\xad\xb1\xbe\xe0\xca\x0a\xf5\x50\xf9\x8b\x4e\x09\x83\x30\xc1\x77\x82\xc1\xef\xf7\xab\x60\x41\x85\x41\x94\xe3\xac\x38\xf4\x12\x37\xdd\x58\x9b\x14\x30\x54\x18\xa4\x09\x6e\x0a\x0f\x0f\x9b\xbe\xf5\xa5\xc2\x40\x93\xac\xc5\xba\x79\x12\x6d\x31\x75\x52\x57\x61\x00\x49\x10\x7a\x54\x94\xd7\xc9\xf5\x4b\x62\x18\x46\x9c\xc1\x10\x45\x30\xaf\x70\xa5\xc2\x28\x24\x31\x3d\xa2\xe6\x53\xf4\x3e\x08\x2c\x55\x18\x71\x83\x93\xad\x76\x79\xe7\x54\x2c\x4a\x75\x41\x2c\x96\x27\x77\xcf\x8f\x7f\xb8\x8f\xc5\xa1\xa4\x77\x83\x77\xf8\x08\xef\xb7\x53\x21\x3f\x15\xc6\x69\x8a\x48\x34\x45\x13\xe3\x0b\xf4\xcf\x2f\x89\x62\x49\x7e\x05\xa8\x69\x7b\x73\x91\x83\x5c\x58\x85\x49\xac\x10\xa8\xf9\x08\xef\x7f\x6c\x49\x55\x1b\xd9\x48\x93\xa4\x74\x3c\x39\xc2\x24\x8f\x71\x73\x3d\x8b\x8f\xc5\xf1\xe8\x9e\x8b\x3b\xc8\x24\xba\xb8\x89\xee\xaf\x57\xf4\xaf\x41\x23\x45\x85\x89\xc8\x11\xca\x7d\x16\x85\x1e\x61\x2f\x55\x98\x86\x8a\x45\x03\x0c\x04\x6a\xc0\xf7\x63\x39\x4c\x25\x00\x45\x8a\x16\x2b\x8b\xda\xb7\x17\x5f\x95\x51\x61\xaa\xa2\x4c\x0d\x79\x29\xa3\x3e\x80\x0a\x53\x1d\x30\x9b\xe9\xae\x4e\x5d\x38\x09\xb0\x2e\xbb\x7d\x42\x5c\xa9\x47\xa9\x30\x0b\x22\x4d\x1c\x0b\xf4\x47\x5b\x56\xb5\xbf\x4e\x06\x19\xbe\x20\xc2\x1c\x6c\x57\xbb\xd5\xf6\xdb\xea\x70\xf7\xfc\x78\xeb\xcf\x30\x29\x06\x03\x9f\x6a\xf6\xab\x30\x17\x24\x00\x5d\x5e\x4e\x0b\x5d\x9d\x5b\xd0\x8b\x9f\x05\x4c\x99\xca\x83\x71\xc9\x42\x85\x14\xfd\xb7\x7e\x67\x09\x19\xd7\x58\xb0\xa6\x61\x37\xff\x45\x9c\xc5\xf8\xab\x49\xae\xb1\x3a\xea\xdd\xb1\x7a\x29\xfd\x63\x97\x59\xac\x9d\x74\x64\x2b\xde\x06\x3e\x21\xe3\xcb\x48\xa6\xb1\x4f\x60\x6a\x00\xfd\xbd\x6a\xba\xf0\x97\xfc\xfa\xfc\x95\x54\x9e\x58\xea\x83\xd5\xb0\x99\xdf\x19\x42\x15\x70\xdc\x48\x1e\xe1\x52\xdb\xbe\xb6\xbb\x86\x0e\x52\x6c\x60\xe2\x82\x85\x18\x4d\xd2\x26\xf3\xc7\x43\xf2\xb6\x38\x20\x12\x1a\xc7\x3e\x7e\x7e\x80\xd0\x57\xa1\x4e\x14\xa6\x22\x8a\x6a\x7d\x13\xa4\xa5\x0a\xc1\xd0\x38\x68\x1c\xef\x69\xbf\xe9\x35\xbd\x55\x14\x24\x0a\xa1\xf4\x54\x02\xb7\x1e\x9b\xf0\x3e\xbe\x48\x14\xe8\x20\x4f\x47\xdb\xc5\x7a\x1e\xa8\x67\x87\x7e\x14\x46\x02\x5b\xea\xba\x68\xe4\xa5\x6e\x80\x14\xb7\x46\x0f\x39\x0a\x05\x89\x3a\x1e\xde\x01\xde\x06\xdb\xbf\x3b\x0c\x1c\xb3\x83\xe7\xdd\x61\xfd\xb8\xdb\xaf\xf7\xcf\xfb\xf5\xe6\x71\x71\xef\xee\x3c\x4e\x00\x2c\xbc\x61\xbd\xdc\x38\xb5\x91\x7e\x0c\x45\xb1\xa0\xca\xb5\x5d\x1b\x30\xa8\x8d\xfc\xa7\x65\x8e\x1e\xd5\x5f\x17\xdb\xdb\xc3\x72\xf1\x74\x58\x3f\x1e\xb0\xfb\xe8\x4e\x48\x22\x83\x42\xb0\xd8\xb5\xdc\x82\xd0\xfe\x80\x49\xf3\xb0\xbf\xec\x1e\xca\x11\xcb\x5b\x45\x69\x2a\xb1\x7c\xd4\x42\xd3\xde\x88\xff\x3e\x40\xfb\x5a\xe9\xb5\xff\x7c\xaa\x01\xa5\xee\x76\xe2\x74\x3e\x02\x06\xb7\xe3\xde\xec\xff\x89\xd7\xa5\xa2\x8c\xc5\x3c\x76\x19\x7d\xa3\xa0\xd4\x62\xba\x0f\x44\x79\x16\x0a\x0f\x0f\x3a\xc1\x6f\xa3\x0b\xe4\x86\x23\xad\xfd\x7e\xf7\xe7\x93\xbb\x49\xc6\x89\x1e\x8c\xd8\x48\xf4\x6a\xb6\x0b\x98\x0d\x13\xc6\x97\xe7\xb1\x70\x96\x78\x56\x2f\xb2\x59\xd6\xa0\x8b\x76\x61\x4c\x71\x2c\x44\x0b\xcd\xf5\xfb\xe5\x49\x84\xdc\xe4\x1d\xb4\x8b\xd5\xd1\x78\x49\x59\x94\xd0\x68\x8a\x97\xf9\xf9\x14\x71\x11\x8c\xdd\x5a\xf7\xd6\x2a\x61\x4e\x51\x77\xfc\x8d\x82\x87\xb6\x90\xfd\xf2\xbd\x28\x4b\xa8\x11\x3a\x36\xbe\xbc\x10\x11\xf2\x51\x1e\x17\x0f\xeb\xc7\xcd\x76\xed\x1e\x88\x8c\x02\x43\x1b\x4d\xf7\xc2\xb0\x4a\x7e\x77\x29\xaf\x95\xf8\x54\xa4\xa2\x20\xb5\xb5\xa9\xdd\x19\xbf\x66\xaa\x6b\x34\x17\x2e\x0d\xcd\xe2\x98\xbf\x92\xc4\x2e\x2a\x59\x0c\x3b\xee\xe6\x9c\x5c\xa8\xfb\x40\x9a\xa4\x96\x68\x71\x68\xde\xab\xda\x6e\xc4\xee\xce\xb4\xd2\x58\xbd\xb4\x94\x98\x42\xc3\x44\x90\x61\xf2\xbc\x20\x60\x2e\x64\xdf\x82\x1a\xb0\x2f\xaf\xc8\xfe\x2a\x82\x30\x55\xce\x1d\x87\xfa\x5f\x5d\x94\xf6\xcf\x4a\x4e\xc7\x0a\x08\x25\x43\x37\x56\x28\xae\x1e\x0a\x9a\xf9\x9b\x35\x69\x80\xa2\x3c\x4e\xb7\xa1\x85\x91\x8c\x95\xf5\x7f\x1c\x9c\x1e\x62\x9c\xf6\x57\xf6\xb6\xee\x74\x4d\x48\xba\x4b\x59\x19\x54\xca\x3d\xa2\x40\x60\xf1\x52\x3e\x9f\x87\xb8\x71\x15\x07\x09\x47\xd0\x8b\x2b\xc9\x13\xc9\x6e\xa6\xce\xea\x9f\x45\x1c\xa4\x02\x87\x68\x97\x3b\x2c\x50\x0c\x6b\x45\x1a\x68\x57\x25\xd6\xd1\x4d\xc5\x01\x13\xe8\x9b\xf6\xee\xaa\x99\x3b\xbf\x31\xd8\x61\x18\x87\x69\x82\xed\x66\xd1\x22\x80\x02\x9a\x9e\x36\xa8\xe2\x28\x23\xcc\xb2\x8d\x93\xd0\x35\xbd\x2f\x55\xaa\x38\x62\x06\xcb\x83\x32\x8d\xc3\x2c\xc9\xa5\xff\xbb\x61\x62\x28\x8a\x87\x95\xd2\xbb\xaa\xde\x8b\xe6\x6d\x67\x93\xf4\xa9\x5c\xa2\xfd\x68\x2c\x34\x06\xa0\xb7\xbb\xa7\x5f\xe5\x36\x71\xac\x58\xee\xbb\x5a\xc3\x6e\xba\x3d\x9e\x84\x09\xa2\x10\x55\x55\xd5\xba\x28\x11\x81\xf5\x52\x43\x97\x15\xae\x9c\xf4\xd1\xf8\x61\x25\x11\x60\xd5\x65\x5b\x35\x30\xdc\x55\xe3\x24\x0d\x89\x85\xd3\xad\x23\x3f\xa0\x9e\x1e\xce\x43\x02\xe4\x88\x9f\x44\x14\x1d\x3e\xde\x84\x25\x38\xe8\x56\xed\xeb\x49\xcc\x18\xe1\xfd\x1d\x90\xb0\x8a\x13\x11\x61\x6c\x50\xa8\x6a\x45\xa4\x34\x74\x42\xdd\xb5\xe2\x05\x42\xff\x55\x86\x21\x03\x62\x71\x3c\x36\x6d\xa5\xde\x9a\xd1\x5d\x66\xa1\x52\xc9\x40\x77\x0d\x17\x9c\xb1\x9a\xac\x8a\xb3\xc4\x38\xdc\xda\x16\x7b\xe6\xe3\xdb\xc8\x58\x80\x39\xa3\x01\x38\x9c\x9a\x17\xff\x29\x11\x47\xcc\x02\x3e\x83\xff\xb9\x78\x63\x6a\x15\x67\x86\x11\x74\xa4\x6e\xfb\xa6\x87\x8a\xf3\x98\x04\x9c\x5c\x01\xac\x57\xa3\x9a\xec\xe8\x31\xcb\xa8\xc0\x52\xc2\xfb\xfe\x52\xc2\xe6\xec\x97\x47\x5b\x35\x1c\x82\xf4\x9d\xe4\xef\x3f\x86\xc9\x82\xd5\x15\x52\x31\x53\x0c\x69\x29\x45\xd9\x5c\xea\x6e\x46\x3b\xb4\xa4\x3d\xce\x63\x66\x48\x7b\xfa\xed\xbe\x52\x6f\xa0\x17\xf3\x8b\x58\xcc\x73\xd0\xce\xdc\x96\xe6\xc5\xdd\xc4\xa4\x4e\xc5\x22\x20\xe0\x95\xb2\x74\x33\x47\x7c\x9f\x55\xc8\x1f\x0f\x6c\xa1\xb9\xa0\xbc\xe8\x49\xa8\xb7\x27\x51\x0f\x6c\x69\xec\x29\x92\xb1\x20\xb3\x77\xd0\x37\x64\xbb\xd5\xac\x5b\x47\x47\x16\x62\xf3\x05\x97\x58\xca\x98\xa4\xdf\x5d\x09\x9d\x88\x82\xee\xa8\x06\x9c\x83\x14\xa1\x5b\xf0\xd4\x40\x49\x41\xc5\xd2\x70\xa0\x3a\x95\x06\x38\xcd\x82\x72\x55\xac\x22\x15\x58\x66\x05\xb6\xb6\x8a\xf6\xe3\xa6\x2a\xf5\xdd\xb1\x72\xc6\x76\x2a\x56\x29\xc7\x55\x1e\x3b\xab\xca\xff\x35\x0f\x08\xda\x4a\xee\x03\x54\xa2\x20\xa4\x5b\x14\x44\x61\x7f\x5a\x22\xac\x22\x00\xea\xf5\x3c\x56\x7d\xc2\x13\x2b\x65\x90\x70\x76\xae\xe1\x47\x51\x5d\x1a\x52\x08\x75\x47\x75\x94\xa3\x72\xe5\xa9\x28\xc7\x8a\x9e\x2a\xd6\x29\x21\x3c\x57\xd4\x76\xbe\xa9\x50\x2f\xad\x6c\xeb\x6a\x88\x03\xb8\x66\x97\x4f\x7e\xbd\xe6\x99\xf3\x67\xe8\x76\x02\x67\x20\x31\x39\xc9\x90\x18\x55\xd1\x34\x17\xb8\x16\xd1\x55\x31\xc4\x39\xb3\xc4\xc1\x55\x59\x5d\x5e\x5e\xef\xc8\xb3\x61\xf4\xbe\xba\x1d\xd0\x59\x41\xd4\x42\x1d\x8b\xff\x82\xe7\x57\xaa\x18\x8c\xce\xba\xa3\x4f\xcf\xbf\x0f\x27\xa1\x49\x12\x69\x1c\x2d\xf8\xa8\xad\x1e\x20\x15\x74\xc7\x37\x69\xd2\x90\x4c\x50\x8a\xf6\xa9\x6a\x9f\xea\x4a\x75\x79\xe7\x20\xf5\x9f\x4c\x10\x23\x02\x04\xe8\x3c\x56\xf2\x08\x28\x68\xd7\xcc\xb5\x12\x47\xa3\xde\x68\x9d\xd8\xe4\x73\xaa\x72\xa4\x92\x50\xc4\x48\xfe\xaa\x45\x0b\xb8\xe6\xc5\xfe\x88\x8e\x25\x29\x3d\x99\x4b\xa9\x89\x23\xe5\x8e\x45\x11\x25\x22\xaa\x02\x2f\x90\xb7\x70\x53\x76\xb0\x8b\x25\x51\xac\x22\xeb\x4b\xbf\x53\xaf\x54\x7c\x5c\xfd\x3c\x8b\x72\xa8\x8f\x37\xfe\x8d\x49\x04\x2c\x16\x83\x25\xec\x3b\x09\xde\xb9\xbc\x30\x89\xb3\x90\xf8\x6a\xa4\xdd\x8d\x6f\xcd\xda\xe4\xdc\x42\x59\x9d\x68\x47\xea\xcf\x06\x2c\xbe\x9e\x50\x1f\x6d\xdd\x90\xee\xd9\x00\xb2\xa3\x92\x24\x52\x58\xe2\x5d\x2f\x37\xa4\x37\x98\xb8\x0f\x27\x69\x16\x0e\xab\x99\xe3\x62\x54\x92\xc8\x30\x95\xae\x36\x3c\x90\xe5\x9d\xeb\xbd\xa8\x24\x31\x3a\x92\x13\x13\xcd\xd3\x55\x19\x28\x49\xc3\x94\x85\xa3\x35\xf0\xa6\x78\x79\xaa\xab\x53\x45\xa0\x39\x77\x1a\x0b\x94\x73\x8d\x87\xb6\x19\x7a\x70\xa8\x24\xe5\x19\x3e\x22\x45\x32\xff\x03\x72\xa5\x4a\xb2\x8c\xfc\x2e\x0f\xdd\xa4\xfb\xb4\xe7\x34\xbb\xc6\x7d\xf2\xc3\xf2\x28\xc0\x30\xdc\x8b\x3a\x0c\x8c\x89\xc7\x25\x2a\xf7\xc4\x73\x41\x12\x82\xb5\x2d\x83\xcc\xee\x06\x49\xae\x01\x25\x4e\x70\xc0\x68\xb7\x40\x26\x3c\x80\xcc\x49\xbc\x9e\x8f\xc5\xf8\xd7\xf1\x24\xe2\x36\x62\xfd\x67\x25\xaf\xd7\x16\x77\x1a\xe7\x2e\x5a\xde\xd7\x42\xa3\x6e\xce\x34\xce\x49\x38\x68\xb0\x75\xd7\x6f\xd0\xb4\x53\xa9\x4a\x95\x08\x11\x04\x36\xd3\xbe\x25\x25\x5f\x52\x8e\xc3\x8a\xef\x40\xd0\xa6\x3b\x33\x42\xe0\x3f\xe9\x15\xd8\x3f\x4a\xce\x89\x5b\x53\xb4\x47\x58\xfb\xaa\x55\x22\x4d\x86\xa5\xa8\x13\xe9\xaf\xfb\x40\x23\x51\xa1\xc2\xef\xdb\xbd\x7f\xb4\xea\x75\x18\x83\x24\x4a\x05\xb6\xb5\x8f\xdd\x91\xd1\x31\x1d\xc5\x08\xc8\xdd\x82\x15\x19\xf3\x07\x58\xc8\x55\x0f\x5f\x72\x44\x6f\x7f\x58\x30\xac\x9e\xad\x7e\x40\xd9\x7e\x2f\x4a\x7a\xad\x9f\xbc\x2c\x08\x02\x64\x31\xef\x0b\xf5\x06\xd3\x31\x6d\x04\x43\xb4\x1d\xd8\xbd\x7a\x69\x47\x4a\x75\xd5\xb3\x9a\x5c\xd5\x48\x85\x44\x4d\xa1\x14\x9c\x6d\x41\x85\x80\x42\x9f\xb6\x6f\x46\x17\x48\x83\x2c\xc4\xc4\xf5\x47\xd5\x82\xc3\x7b\xce\xd5\x11\xd3\x40\x0b\xd4\x6a\x90\x97\x8f\xa5\xa8\x87\x2d\x49\x95\x06\x86\x56\xb1\x53\x51\xb6\xe8\xdf\x5b\x8a\xe3\x6f\xbf\xfc\xda\x38\x67\xb8\x07\xca\xcb\xc7\x23\xfc\xec\x22\x3e\x17\xb6\xa6\x31\x07\x49\x25\x89\xf3\x51\xf4\xa1\xd2\x6c\xea\x93\xa6\x91\x62\x16\xbd\x64\x31\x70\x53\x03\x7b\x95\xa6\x71\x80\x91\x20\xca\xe5\xa3\x54\x0e\x2e\xe4\xee\xfb\xf2\xdc\xc4\x36\xc5\xb5\xea\x92\xe3\x2e\xf9\xe4\xce\x73\xa0\xa4\xa5\x28\x49\x02\xfe\xa9\x86\x97\x52\xd8\x35\xc4\x6f\xf2\x29\x93\xca\xb0\xd1\x2a\x45\x0d\xa4\x5f\xbe\xce\x54\xe4\xd4\x1d\xb2\x0d\x4e\xa4\xb8\x3c\x41\xff\x56\x86\x67\xb2\xc0\x96\x75\xab\xcb\x14\xda\xfe\xc9\xc5\xa5\x40\x3e\xd9\xb2\x2a\x9b\xb6\xbe\x74\x09\xf8\x1e\x9a\xeb\x3c\x6e\x66\x8f\x4c\x65\x18\x63\x04\xfb\xb4\xf8\x73\xf3\xbc\x3f\xdc\xae\xee\x17\x7f\x1e\xd6\x8f\xfb\xd5\xf6\x9b\x2f\x62\xa5\x32\x8a\xb0\x24\x71\xeb\xe1\xc3\x3d\x2e\x78\x7c\x2b\x32\x4d\x10\x1b\xd0\x56\x37\x3d\xd1\xc8\x4f\xac\x54\x05\x1c\x31\x2a\x27\x8b\xe0\x1e\x76\x9b\x55\xaa\x2c\x73\xa3\xb1\x6a\x33\x68\xef\x43\xe4\x9a\xf1\xe0\x50\x89\xc0\xe8\x43\xb4\xad\x50\xaf\xf6\xe5\x7e\x32\x90\x94\x90\xe8\xef\x46\x2d\xb2\x6e\x1e\x0f\x18\x00\xff\x18\x8d\x76\x05\x80\x4a\x56\x7e\x39\x77\x62\x23\xde\xe3\x7c\xfe\xf9\x9b\x80\x3b\x7d\xdb\x47\x69\x8d\x62\x9a\x7b\xcb\x51\x1b\xe5\xe9\xa9\x51\x81\xee\x35\x21\x48\x12\x67\x84\xcf\x54\x59\x10\x03\x56\x7f\xed\x82\x36\x54\xd8\xb4\x67\x84\x3a\x50\x83\xfd\x74\x10\x6d\x8e\xee\x2b\x8b\x82\x1c\x87\xd2\xff\x56\x45\xb9\xaf\xf6\xb5\x50\x6f\xe3\x7d\x3c\x8b\xb2\xcc\xf1\x94\xbf\x8a\xe6\x95\x58\x18\xad\x98\x06\xfa\xf6\xec\x38\x48\x41\x7b\x5e\x11\xad\x77\x83\xc5\xf3\x97\xbd\xbc\x2c\x4e\xb4\xb0\xa5\x97\xc3\x9b\x03\x4c\xaa\x2c\xce\x82\x84\x9e\x79\xb9\xa2\xe6\xef\xe4\x47\xc4\x0c\x10\x98\x53\x5f\xe4\x51\xfc\x73\xf5\x34\x58\xdf\xb3\x98\xf3\x0c\xdc\xed\x17\x76\xe3\x99\x7c\x5c\xc4\xce\x04\x97\x64\x28\x27\xcf\x32\xb1\x01\x5d\x79\xf1\xe8\x35\x77\x44\x19\x25\xdd\x1e\x87\xad\x09\xfd\x20\xea\xba\x10\x2f\xd0\x9f\x03\x91\x1e\xf8\x96\x90\xf6\xed\xe4\x1b\xd2\x3c\xe3\xae\x01\x27\x5a\xf5\x3a\x0a\x58\xb2\x34\x87\x2c\x1a\x52\x43\xe6\xc7\x58\x96\xb1\x14\xe7\x06\x21\x2f\x47\xf4\x5d\x97\x93\x8e\xff\x71\x9f\xd3\x31\x86\x28\xf2\xf2\xb1\x2a\x5f\x8a\x12\xfa\x05\xe7\x5f\xd6\xf6\x4d\x65\x19\x28\x2c\x05\xec\xa1\xae\x05\xf9\xe9\x8c\xc2\x13\x7b\x5a\x9e\x93\x5c\x60\x03\xed\xea\x61\x41\xfd\xf1\xc9\x02\x90\xe5\xdc\x20\x40\x63\xff\xfc\xb4\x74\xbf\x31\x97\xa1\xcb\x0a\x1c\xe3\xa4\x0b\xc6\xdd\x61\x1e\x30\x44\x59\x3e\x7d\x5d\xec\x56\x87\xe5\xfd\x66\xb7\xba\xf5\xc7\xc2\x1c\x71\x80\x7e\x74\x3b\xe2\xda\x64\x68\xaa\x20\xc4\x26\xc5\x62\xff\xd0\x25\x1e\x7f\x89\x30\x54\x99\x62\x80\x5e\x3b\x8f\x77\x7f\x2c\xab\x91\xc6\xba\xca\x94\xc8\xb1\xef\xdc\x10\xb4\xfb\x46\x34\x70\x2f\x3e\xa6\x4b\x75\xa6\x0c\xb9\xb0\xdd\xac\xb6\xfb\xe5\xfd\xf3\xcd\x72\xb3\x76\x85\xf9\x4c\xe7\x0c\x21\x9c\xf2\x52\x97\xeb\xfb\xbb\xf9\x3d\x27\xd3\x4c\x0a\x8a\xe8\x5f\xa1\x2e\x5a\x27\x91\x35\x65\x67\xbb\xb3\x45\x8c\xe5\xa9\x1a\x54\x71\x2e\xa0\x6c\xbf\xad\x9f\x26\xaf\x48\x4b\x02\x3a\x76\x51\xa0\x50\x6f\xe7\xaa\x45\xeb\xc0\x49\x80\x97\x41\x98\x42\xea\xaa\xf1\x47\xf1\x61\x91\x8e\x96\x59\x3b\xad\x3c\x64\x90\x19\x44\x39\xb9\x75\xc6\xa9\x8e\xaa\x0c\xf2\x00\xd0\xc4\x76\xb7\x1f\xfe\x7a\x60\x29\x56\xfb\x8f\xe2\xbd\x5b\xe2\xab\xba\xa5\x9e\xd1\xb8\xbf\x98\x81\x8a\x11\x75\xdd\xbc\x17\x18\xd6\x7d\x11\xa7\x91\x1e\x46\x77\x06\x68\x4a\xb8\x0b\x05\x1b\x83\xbd\xad\xf1\x4f\x31\x01\x60\x22\x79\x53\xd4\xed\xab\x16\x1f\x4b\x51\x3a\x75\xe9\x2e\xe3\xe7\x58\x74\x40\x83\xc0\x7d\x71\x82\xfb\xbe\x8c\x96\x07\x52\x86\xc2\x81\x9f\x9a\xd7\xd9\x92\xf5\x78\x11\xcb\x03\x4d\xde\x31\xcd\x6b\xf5\x3e\x62\xf2\xd8\xe3\x21\x63\x28\xf6\x72\x29\xef\x8b\xf2\xad\x5b\x4e\x89\xa3\x34\x43\xdd\x51\x79\x94\xc8\x88\xba\xa7\x7b\x1b\x64\xbb\x03\x8a\x63\x47\x0d\x41\x65\x18\x52\xf7\x22\xf3\x2a\x8f\x40\x21\xb4\xd9\xa5\x66\x57\xe5\xd7\x3c\x09\x95\xe3\x7f\xde\x16\x9a\xea\x87\x55\xd5\xeb\x07\x8d\x07\x61\x9e\xc4\x02\x8b\xd2\x94\x05\x6e\x1e\x36\x87\xed\xea\xfb\x62\xeb\x34\xa2\x55\x9e\x40\xa4\x04\xed\xda\x07\x4a\x8a\x87\x0a\x10\x2a\x4f\x83\x98\xa7\x4e\x9c\xa5\x6c\x5f\x37\xe7\xeb\x65\x6c\xd0\x38\xb8\x5a\xdc\xf2\x34\xa1\xc6\xeb\x7a\xb9\xf1\xbd\x4e\x22\xd8\x8c\xb1\x74\x2a\x4f\x53\x99\x0f\xba\x65\x04\xc7\x1e\x6f\xa0\x79\xca\x93\x94\x54\x81\x2d\xce\x73\xf2\xdc\x53\x6e\x18\xf3\x0d\x86\x89\x0b\xa4\x3b\x47\x28\xb4\x83\xf6\xec\xd2\x85\x31\xdf\x3c\xd1\x7f\x70\x3f\x2a\xc1\x98\x56\x48\x75\x75\x84\x00\x87\x3b\x28\xf5\xa9\x2a\xe1\x03\x7d\x84\xc6\xe7\x64\x09\xc7\x27\x6f\xa5\xcd\x4e\x02\xe3\xc2\x3f\x0b\x38\x4e\x7f\x77\x9e\x64\x8c\x2c\x90\xcf\x96\x8a\x51\x54\x25\xd9\x5c\xdc\x55\x1e\xb3\x31\xf9\xa1\xb9\x64\x08\xde\xbd\x59\xad\xee\xfe\x1c\x2e\x70\x39\x8b\x55\x6a\xa3\xeb\x1b\x51\xbe\x51\xa6\xe8\x40\x25\x9b\x72\x22\x7e\xad\x72\xa6\x14\xf7\xd6\xc8\x4d\x97\x95\x83\xe7\x3d\xaa\x9c\x27\x1c\xa1\x73\x28\x30\x72\x18\x16\x40\x73\x9e\x6b\x17\xc6\x3f\x88\x9f\x24\x0e\x82\xb4\x9a\x39\x7b\x18\x95\x73\xc6\xb0\x19\x8a\x23\xdf\x73\xea\xdc\x41\x21\x02\x9b\xfe\x7a\x31\xed\xd9\x40\x25\xe7\x20\x8c\xc3\xcf\x57\xc7\xaa\x1e\x01\x2d\x55\x2e\x02\x32\xba\x44\xfd\xeb\xc6\x73\x41\xfc\x17\x75\x29\x2b\x77\xb0\x6b\x2c\x21\x8f\x38\xde\x2a\x97\x91\xc5\x3d\x94\x45\x6b\xa1\x91\x8b\x52\xaf\xba\x45\x06\x97\x50\x7f\x5e\x12\x42\xaf\xe9\xb9\xad\x8e\xc7\xe7\x52\x4f\xb7\x91\x5c\x66\x01\xd2\x1a\x0f\x70\x2a\xda\xef\x55\xfd\xe6\x21\x9f\xf3\xb3\x45\x25\x0a\xc1\xf9\x2f\x55\x4b\x0d\x42\xf7\x75\x4a\x73\x4c\x4d\x2c\x7f\x68\xd5\xbe\x7e\xa9\x1c\x5b\xa4\x3b\x4a\xa6\xc8\xba\xf8\x01\xf1\xe4\xfd\xea\x50\x90\x10\x31\x65\x34\x5f\x8b\x97\xd7\x2e\x30\x75\x92\x15\x2a\x87\x50\x72\xdf\x3b\xd5\x70\xc2\x9a\xf9\x2c\x96\x2f\x87\x28\xc2\x7c\x98\x40\x7c\xee\x8f\x09\x8f\xa8\xa9\x67\x8a\xe3\x91\xe4\x7e\x11\xe9\xf9\xe4\xc5\x66\x54\x0e\x3c\x0e\x88\x4d\x78\x3a\x15\x2d\xaa\x16\x0e\x30\x2b\xe3\x6f\x31\x71\x86\x99\xc4\xb7\xfb\xc5\xed\xe2\x7e\xfd\xb8\x70\x17\x31\x29\x77\x26\x62\x5b\xf8\xcf\xa5\xa8\xbb\xb0\x8d\x8c\x3a\x27\xcf\xdd\x64\x01\xd3\xde\xa5\x0f\xf6\x1f\xd6\x80\x7e\xd8\xe4\xbc\x76\xc7\x71\x1f\x66\x11\xc2\xb8\x6a\x10\xfa\x50\xb0\x83\xa8\x6b\xe1\xb7\x1d\x23\x38\x01\x49\x24\xae\x87\xcd\xd3\xe0\x10\xc4\x4c\x8d\x92\x52\xb7\xe9\xff\x3a\xc9\x63\x81\x21\xeb\xbc\x6e\xeb\xf9\xcd\xff\x8d\xe3\xee\x8b\x55\xe8\x8d\x59\x4f\x12\x64\x16\x6a\x89\x2c\xad\xdb\xd5\xdd\x76\xb3\xdb\x1f\xee\x16\xcb\xfd\x66\x7b\xd8\xaf\x16\x0f\x8b\xc7\xdb\xc5\xed\x37\x77\xa1\x28\x32\xd8\xd3\xa3\x81\xfa\x67\x97\xb9\xcd\xbe\x5c\x16\x65\x61\xe6\x4d\xc2\x9b\xd7\xe2\x7c\x9d\xe4\xb1\x08\xf2\x08\xac\xd5\x90\x45\x7d\x0e\x31\x3d\xc3\xfd\x9d\xc5\x31\x20\xa1\x8d\x10\x89\x25\x9e\xf1\xdf\xdf\xae\x0d\x29\xd9\xa7\xf6\xb3\xb3\xc3\x83\xa5\xa1\xc2\x6c\x63\x07\xea\x52\x17\x6d\x01\x04\x03\xbb\xe9\xcb\x11\x2c\x8b\x49\x3c\xde\xad\xf0\x24\x26\x32\xe8\x5c\xb1\x2c\xcd\x10\xbc\xd4\xc2\xe9\xfc\x50\xbe\xd4\xfd\xdf\x99\x24\x0e\xf4\xdb\xc8\xe7\x65\x72\x0f\x59\x2a\xf3\x21\x24\x1b\x29\x93\x83\xc2\xdc\x6c\x89\x9f\xe5\x91\xcc\x32\x57\xbd\x9f\xbc\xcf\x3c\xd3\x98\x80\xc9\xaa\xfe\x24\x4f\x60\x39\x68\x84\x6c\x21\xbf\xfb\xf1\x72\x5a\x5e\xa1\xe5\xd8\xaf\x50\xb3\x8c\x85\xcc\x64\x6e\xfa\x60\x12\x60\x2e\xe5\x64\x37\x62\x4c\x02\x0a\x42\x3e\x5e\xaa\x1b\x31\xf4\x28\xfa\xcb\xb0\x9b\xf1\x30\x40\x0a\x86\xcd\x98\x30\x1e\x1b\x3f\x00\x9e\x25\x5e\xd0\xac\x0b\x08\x07\x18\x49\xc6\x33\xce\x94\x6b\x38\x9e\x0b\x35\xac\x80\x32\x9e\x03\x86\xe3\xab\xc7\xdb\xc3\xee\xf7\x4d\x78\x78\x7e\x5c\xef\x77\xfe\xa8\x4e\x79\x36\xe0\x54\xcd\x69\xa3\xba\x53\x81\xa1\xe0\x37\xa8\xaa\xf9\x68\x5a\x38\x0d\x69\x40\x8a\x09\x96\x61\xc9\xe4\xcf\xe8\x50\x0f\x4d\xea\x15\x13\x86\x56\x72\x4b\x65\x7d\x5e\xbb\x9e\xd9\xc0\xf4\x4f\x31\x19\x27\x48\xc1\x47\x82\xc7\xa0\x7b\xc2\x24\xcf\x2c\x04\x75\xe4\x13\xf3\xc9\x10\x97\xc2\x60\x6a\x74\xa2\xbc\xd6\x4f\x44\xdf\x01\x60\x52\x07\x99\x25\xc5\x3e\x97\x45\xdb\x6c\x4a\x58\xb5\xaf\x4b\x51\xde\x5c\x26\x6b\x21\x53\x81\x21\xe4\xae\xcd\xcf\xa8\x5b\x39\xbb\x24\x31\xf7\x91\x58\x25\xa9\x7b\x17\x6f\x50\xae\xf5\xb8\x16\xcf\x54\xc2\xc9\x38\x58\xfd\x15\x31\x7c\x32\x86\x95\x26\xeb\x2d\x2f\xed\x59\x8b\x97\xaa\x6c\xee\x8a\xe3\xc9\x5f\x1b\x22\x04\x89\xd0\xba\x81\x7e\x60\x4d\x7f\x8c\x61\x4a\x6d\xc5\xd7\xbf\x88\x66\x08\x45\x63\x90\x48\xcc\xf8\xef\x37\xcb\xdf\x17\x0f\x9b\xe7\xc7\x7d\xec\x0f\xc9\x04\xf3\x9c\x12\xde\x2f\xcd\x27\x1a\xcb\x8a\x99\x40\x8e\x16\x8e\x59\xb7\xd2\x4f\xe6\x17\x0f\x82\x14\x65\x67\xbe\xf8\xf2\xe1\xb6\xaa\x4e\x8b\x52\x13\xa1\x7a\xf4\x4d\x3c\xc8\x22\x6c\x1f\x3b\x7d\x49\x97\x3d\x2f\x5f\x8b\xa3\xae\x61\xa0\x60\xe4\x3e\xa0\x05\x22\x03\x90\xfe\xf6\x78\x39\xf9\xbf\x43\x8e\x3f\x0c\x77\x1d\xd4\x7a\x9f\x93\x20\x41\x9d\x0a\xc4\x66\x60\xf9\xad\x67\x05\x2b\x1e\xa5\x1c\x1b\x9f\xc7\xea\x65\xa1\x86\xad\xba\x39\xbc\x05\x8f\x24\xa9\xba\x53\x5c\xfb\x24\xd0\xa9\xfb\x4a\x66\x50\xf1\x08\x24\x42\x3a\xac\x61\x86\xa7\x5e\xfd\xd5\x70\xf9\xe5\xda\xcf\xe3\x5c\x21\x74\xed\xb6\xfa\xe1\x2b\x35\x3c\x06\xc0\xc4\xc1\x54\xf5\x3b\xf6\x5e\x8b\x29\x2e\x80\xc7\x26\xc3\x6a\x12\x56\x62\x2e\x28\x41\xf6\x09\x29\x48\xf1\x24\x4c\x75\xe0\x43\x95\xcd\x24\x53\xe7\x49\x94\x62\x01\x61\xb3\xdc\x2f\x68\x88\x0e\xc3\x6f\x9e\xf0\x1c\x4b\x42\x96\x28\xe7\xf1\x67\x13\x66\x9e\xe2\x89\xe6\x44\x58\xa3\x9e\xf5\xe7\xca\xf2\xff\x98\x8e\xc1\xf9\x47\x93\x80\x33\xd6\x6f\x89\x7c\x22\xc6\xbb\xfc\xe4\xf4\x34\x61\x88\x3f\xa2\xb0\xe0\xce\x6a\x72\xd9\x2a\xf0\xe4\x27\xa7\x9a\x21\x2f\xa0\x89\xad\x0e\x6d\x68\x0f\x64\x41\xc8\x2d\x26\x0d\x71\x54\xf8\x24\x6c\x42\xec\x4e\x91\x1c\x9b\x1d\x95\x31\x50\x13\x1e\xa3\xd9\x57\x0e\x10\x3c\x29\xd6\x4e\xfe\xe9\xa1\x94\x3c\xcf\x32\x82\x4b\x35\x9a\x18\xe9\xdd\x5b\x3e\x61\x87\x5f\x89\xf3\xa0\x3b\xcb\x73\x19\xb3\xee\x9e\x6e\x16\x8f\xcb\xcd\xf6\xf0\xc7\xe1\xf9\xe9\xcb\x76\x71\xbb\xda\xfa\x13\x40\x63\xc9\x4a\x9e\x0a\xf7\x27\xa6\x18\xa7\x9d\xeb\x07\x1c\xab\x33\xd4\x07\x37\x1d\x0f\x3e\x1a\x9a\xbc\x3e\x66\x4c\x34\x4c\xd5\xbf\x15\xc7\xa3\x98\x22\x60\x38\x0f\x35\x76\xc3\x6e\x7a\xf7\xa8\xbf\xdc\x47\x39\xcf\x48\xd6\x4b\x7a\x97\x77\xc5\x45\x1c\x5a\xe2\xde\x16\xce\x35\x34\x50\x5e\x95\x72\xb8\x60\x0c\xeb\xa1\x4a\x90\x70\xda\xf8\x61\x8e\xee\x4b\x48\x12\xf2\xb1\x1d\xa4\xa5\x28\x35\x82\xff\xc7\x35\x64\x2e\x54\x9c\x5b\x11\xf9\xe1\x6e\x3e\xbf\xb6\x73\x01\xb1\xc9\x9c\xde\xb8\xed\xab\xd9\x43\x32\x0e\xf1\xd6\x5c\xaf\xec\x0e\x60\x5d\x62\x46\x32\x89\x3f\xb8\xcc\xc3\x84\x34\x71\x40\xa0\x28\xe7\xe4\x47\xca\x9c\x94\xb7\xf7\xa2\x79\x1b\x6c\xb0\x5c\xe6\x2c\x72\x56\xa5\x17\x41\x1c\xff\x5f\x3a\x5e\x28\x2e\x45\x86\x60\x00\x79\xf9\xd8\x82\x71\x17\x52\x01\x8f\x3d\x89\x03\x74\x97\xb4\xf9\x48\x83\xab\xc4\xdb\x9d\x1c\x46\x6c\xbf\xbf\xc0\x65\x4d\xbe\x59\xe7\x69\x68\xc1\xad\xfb\x02\xea\xeb\x36\x2d\xd7\x8c\xc4\xe6\x2d\x10\x80\xf4\x24\xbb\x41\xf4\x15\x8e\xe7\x7e\xfb\xfa\x0c\x4d\xc2\x35\x44\xa8\xfa\xe7\xc2\x15\x3a\x69\x20\x9d\xa8\x38\xe4\xb1\x35\xaa\x55\x35\xf6\xec\x6f\x07\xb3\xc8\x44\x1e\x79\x49\x02\xbf\x7a\x0f\xe2\xe4\x87\xa3\xd1\x1c\x95\x97\xaa\x72\xd7\xc5\x5c\xa0\x8b\x4f\x5a\x6f\x22\xc8\x4d\x62\x1b\x3f\x56\x4d\x03\x89\x74\x7f\xd1\xf7\x12\x01\xd3\xc8\xb8\xa0\x6d\xa6\xa9\x8e\x8d\xa9\xea\xd7\xc2\x07\xf0\x22\x30\x20\xfb\xfa\xca\x5e\x8c\x85\xd2\x94\x08\x03\x29\x6c\x08\x83\x38\xbc\x5d\xf1\x32\xae\x25\x89\x28\x8c\x45\xd8\x8b\xc0\xaa\xd7\x21\x0c\xdf\x55\x8b\x44\x14\xf2\x44\x79\x47\x0a\xcc\xe6\x86\x4a\x22\xe3\xd1\x29\xa2\x8c\x87\xf9\xc0\x4e\x6e\xaa\x1d\x3a\xff\x8c\x62\x60\x31\xe2\xd0\xe5\xac\x99\x8f\x12\x49\x10\x22\x64\xe3\x50\x83\x7a\x15\xf5\xcb\x27\xe0\x02\x91\x84\x59\x3a\x30\x99\x7f\xaa\x8b\x1f\xa2\x85\x01\xda\x5e\x24\x79\x80\x32\x36\x58\xcf\x71\x3f\xa8\x1b\x7f\x37\x1f\x63\xe2\xaa\x5b\x36\x26\x37\x62\x62\x1b\xbe\x95\xe3\xb2\xd4\x27\xbf\x2c\x0d\xa2\x40\x3a\x36\xc4\xfd\xcd\xae\x3a\xea\xc3\xd3\x76\xfd\xcd\x3b\xe1\x29\x91\x6a\x25\x29\x29\x72\x6b\xee\x0a\xf9\x55\x6e\xed\x10\x59\x6c\xb0\x87\x20\x2f\x1f\xa8\x27\xf6\x49\xef\xd3\x9d\x2d\xc0\x19\x39\x7e\x79\xda\x3d\x14\xa5\x57\x2f\x51\x22\x4f\x48\x81\xf9\x05\xda\x45\x59\x5e\xc4\xb1\x47\x3d\x89\x9c\xe9\xd4\xa2\xf4\x08\x4d\x73\x5f\x34\xed\x28\xe8\x15\x39\x4f\xb4\xb3\x13\xf8\x2f\x60\x8d\x78\x53\x5e\x79\x9b\x29\xc1\xc3\x14\x7b\x29\x4f\x47\xa1\x60\xc6\x5e\x5f\x09\x9e\x07\x18\xb3\x1d\xce\x50\x77\xd9\xf3\x7e\x62\x06\x7d\x2d\xd8\x35\x9d\x2d\x73\x21\x9e\xe0\x3c\xc1\xfa\xc8\x3b\x14\x91\x2b\xe3\x0b\x91\x86\x28\x3d\x77\xbf\xbe\x5b\x0d\xea\xf8\x42\xa4\x0a\x05\x9a\xef\xab\x13\x1c\x8b\x61\x0c\x23\x84\x0c\x95\xb0\x0a\x0d\xa2\xfc\x18\xa3\xab\x84\x00\x92\x11\x77\x3b\x9f\xf5\x3a\x5a\xe8\x1f\xbf\x42\x6c\x09\x19\x4a\x2c\xac\xed\x2e\xd2\x56\xde\x16\x88\x7f\x98\xc2\xc7\x84\x64\x09\x6e\x7f\xba\xf8\x61\x1c\x20\x61\x76\x8d\x90\xca\xe0\x6d\xfe\xf1\x70\xff\xe7\x8d\xd0\x1e\x1d\x20\x54\x9e\xa3\x57\xdd\x97\xaa\xba\x17\x97\x52\xbd\x22\xd2\xa8\x17\xca\x50\x42\x87\x1c\x12\xdb\x9a\xc3\xce\x5e\xf7\xe4\x17\xfa\x4a\xaa\xda\x9d\xae\x33\x2c\x05\x4b\x68\xc3\x8d\x99\xbc\x6e\x0d\x26\x4c\x6d\x52\xbb\x59\x3e\xed\xc9\xa8\x62\xf6\x3a\x90\x73\xec\x88\x36\xaf\xd5\xfb\xdd\xd3\x30\xc3\x15\x00\x1c\xc3\xfb\x7f\x16\xaf\xd5\xc7\x84\x03\x28\x4c\x22\x03\xcb\xb0\x58\xd7\x30\xd6\x89\x55\x32\x08\xe2\xa4\xaf\xf0\xac\xda\x66\xb6\xbe\x23\x83\x5c\xa1\xd6\x94\xc7\x70\x5a\x39\x5d\x77\x98\x51\x3f\xa5\x68\xba\xdc\xd6\x2e\x1d\xee\x60\x18\x93\xdc\xed\x81\x30\x2b\x8b\x52\xbd\x56\x56\x90\xda\x9d\xa1\x02\xd7\x6e\xfe\x9f\x0b\x34\x57\xe5\x20\x19\x2a\x29\xd5\xd0\xb3\xf5\x52\x97\x8f\x15\xee\xf0\xf6\x8c\x28\x00\x2c\x28\xef\xda\xaa\x3e\xdd\xd4\xf0\x3e\xd8\xdf\x65\x14\x41\x4c\x74\xa7\x46\xd5\x05\xc6\x91\xb1\x3f\x06\x1c\xc9\x25\x45\xd9\x40\xed\xad\xfe\xc6\xbe\xc8\xbf\x42\x4a\xc8\x38\x21\xdb\xcb\x47\x78\x77\x70\x12\x2f\x44\x3b\xbf\xd4\xca\x34\xa0\x74\x6c\xb7\xfe\xf2\xb0\x38\x3c\x2c\xfe\x38\x2c\x17\x5b\x67\xa1\xa6\x64\x1a\xc7\x38\xbb\x30\x8a\x58\x2f\x37\x08\x85\x77\x07\xb3\x00\x62\x42\xc3\x96\xed\xe6\xd2\x5a\xd7\xdb\x4f\xfd\x69\xdc\x5e\x24\xb3\x50\x0b\x32\xfa\x5c\x6e\x37\x87\xdb\xcd\xfd\xfd\x62\xbb\x3b\x3c\xad\xb6\x87\x9b\xc7\xfd\x9f\x87\x87\xc5\xfa\x71\xb7\xb8\x5f\xf9\xaf\x49\xb8\xb5\x2c\xbe\x59\xde\x0e\xd5\xbe\x94\xcc\x94\xc4\xea\x62\xa1\xaa\x9b\xaa\x6d\xab\xd3\xba\x6c\xe1\x05\xea\x61\x36\x2d\xf3\x2c\x17\x63\x53\xb1\x59\x6c\x85\xcc\x59\x6c\x5d\x96\xba\x25\x77\xcc\x68\x0b\x67\xc8\x25\xd7\x44\x13\xd9\x85\xd3\xb6\xb2\x6b\x01\xeb\x93\x31\x2e\x14\xc7\x29\x5d\x8b\x52\x57\x27\xea\x8e\xb8\xfb\x14\x90\x92\x86\x36\x66\x52\xab\xa6\x1b\xe0\x7f\x25\xf1\x61\x3f\x2a\x13\x82\xaa\xee\x37\xae\xa3\x2d\x65\x1a\x19\x1b\x38\x7c\xa9\xab\x0b\xe6\x16\x93\x74\x52\x4a\x41\x64\x58\x44\xfc\xbc\x78\x98\xa9\xbb\x84\x4e\x43\xac\xa1\x49\xdb\x7f\xb9\x81\x12\x90\xe3\x51\x7f\x0c\xc5\xd8\x94\xd4\x8c\x54\x06\xd1\xbf\xa6\x3a\xcf\x18\x88\xd0\x39\xdc\xe1\xd9\x48\x82\xdb\x7f\x5c\x10\x93\xa0\x27\xc5\xdd\x7c\x3c\x4e\xfb\xac\x52\x43\x82\xd1\x05\xa9\x12\x1d\x94\x8f\xf5\x87\x2f\x00\x22\x91\x31\xa7\x13\x83\x07\xfe\x15\xe6\xd9\xbf\x47\x2f\x09\x12\x72\xe5\xc6\x96\x94\x78\x17\x57\x40\x4b\x7b\x9e\x51\x19\x90\xfd\xcc\x8f\xea\x0d\x7a\xd5\xd4\x41\xf0\xa9\x02\xc6\x51\x6b\x72\x0b\xdd\xbd\xf6\x72\x5d\x78\x24\x4f\x7a\x6d\x2b\x0b\x6d\xed\x53\x41\x15\x06\x0c\xfb\xc6\x35\xa0\xbc\x82\xfb\x6b\x68\x30\x44\x7a\x15\x0d\x42\x88\xc9\x5f\x6f\x8a\x5e\x75\x27\xc7\x0c\x8d\x02\x4e\xe2\xe7\x6f\xe3\x39\xa6\x62\x2e\x53\xaa\x30\x50\xc5\xda\xaa\x05\xf9\x80\xfb\xd7\x6a\xce\xf3\xc3\x4c\xa5\xa1\x40\x14\xd1\xb1\xaa\xde\x2e\xe7\xbb\x02\x21\xc3\xdb\x01\xf6\x72\x7a\x7e\xa2\xb1\x74\x7e\xbf\x59\xfe\xfe\xfc\x74\x88\x1f\x0e\xeb\xe5\x06\x6d\x4a\x76\xfb\xc5\x83\xe3\xc8\xa9\x34\x0d\xd1\xa7\xf1\x51\xcc\x71\xcf\xdc\x49\x9a\x40\x94\xdd\xba\xfb\x48\xb5\x8a\xe6\xb1\x5a\x8a\xa3\xe7\x91\xab\x2c\x24\x0f\x68\xea\x0d\x1f\xbe\xaf\x1f\x0f\x0f\xcf\xf7\xfb\xf5\xd3\x3d\x3a\xc7\xf8\xd3\x22\x89\x72\x14\xa2\xe9\x96\xd9\xd5\x7f\xac\x18\x85\x2d\x83\x4d\xaa\x61\x2a\x4b\xe2\x01\x1c\x0a\xbb\x30\xc5\x75\xf0\xe6\x4e\xd6\xda\xf4\xc5\x10\xdc\xae\x9f\x06\x93\x78\xde\x96\xff\x93\x87\x9d\x47\x31\xf2\x51\x17\xcf\xb7\xeb\xfd\xea\xf6\xb0\x78\xbc\x3d\x6c\x57\xff\x5c\x2d\xf7\x1e\x7b\xa2\x98\x24\xf4\xa8\x8b\x29\xff\x67\x3b\xde\x2c\x15\x8f\x12\x7c\x24\xf4\xbc\x9e\x4b\xa7\x05\x7c\x5d\x37\x9d\x7c\x2e\x8f\x71\xf8\xac\xb6\xcb\xdd\x59\x9c\x4e\xd7\x02\x26\x73\x1b\x90\xe2\x2c\xc7\xe6\xe8\x04\xe6\xa5\x44\x18\xa1\x3a\xe5\xbb\x28\x06\x0e\xd1\x5d\xa2\x41\x79\x28\xea\x2c\xe1\xdb\xc7\x41\xef\x0e\x4b\xce\xf2\xa1\x81\xd2\xfe\xbd\x5f\xd6\x95\x0a\xa2\x81\x33\xe9\xda\xd1\x5b\xee\x00\x9a\x5e\x49\xda\x9d\xcb\x0c\xb7\xbb\xfa\xad\x38\x9f\x3d\x87\xb4\x9b\x28\x59\xef\x87\xbb\xb0\x51\x41\x97\x70\x23\xba\x45\x1c\xd1\x7c\x12\x05\x1f\x87\x65\xf2\x31\xbf\xd4\x4f\x3a\x1d\x81\x60\xbe\xfd\xab\x2f\xaa\xbd\x96\x32\x50\x90\x84\xa4\xd4\xf9\x71\x92\xd5\x71\xb2\x24\x2b\xc8\x08\x19\x40\x37\xf4\x7b\x51\xbe\xe8\xea\x34\x5f\xc9\x1c\xd4\x95\x14\x00\x60\xc1\xf7\xe8\x5c\x6e\x0e\x3f\xc2\xaf\xa2\x79\x3d\xd8\x73\xdd\xef\x35\xb1\xc0\xce\xc5\x8b\x40\xfb\xb6\xfb\xcd\xb3\x1f\x4b\x26\x17\x8e\x72\x31\xbe\x27\x1d\xa6\x3c\xb2\xe9\x98\xb7\x19\x29\x51\x1f\x72\x5e\x2e\x4c\xe9\x50\x64\xee\x13\x2f\x17\x68\xa6\x17\x8c\x03\x91\x59\x4d\xb6\x81\xc0\x9d\x0d\xf7\xa6\xbb\x94\x8e\x63\xc2\x66\x49\x74\x98\x1a\xed\x3c\x3a\x66\xa9\xb1\xf1\x89\x31\x87\xd8\xff\x99\x27\x4c\x7a\xfc\x44\xb7\x38\x8b\x4b\x7d\xc5\xe6\xd5\x31\x4f\x29\x18\x2b\x8e\x97\x4f\xbc\x7f\x94\x4e\x82\x28\x20\xaa\x4e\x43\xd4\xb2\x2d\x60\x73\x6b\x7c\xa9\x24\x13\x18\x89\xdf\x5c\x3e\x08\x75\xf8\xdc\xc0\x08\x8d\x31\xb9\x6a\x96\x46\x43\xa2\x44\xf1\xdf\xbf\x5d\x52\xf6\x17\x48\x11\xbc\x51\xc2\xfb\x16\x83\x89\xd1\x6e\xa9\xb3\x54\x05\xde\x17\x0f\xc5\xba\x8b\x72\x90\x40\xeb\x8c\x19\x1a\x85\x2d\xf6\x25\x26\x37\x27\x14\x06\xa2\x67\x0b\x59\x46\x79\x5f\xaf\xf1\xa9\x74\x1e\x02\x75\x88\xeb\xd3\x47\x97\x07\x89\xba\x28\xa1\x59\x5e\xef\xfa\x3a\x4f\xe3\xcc\x4b\xe7\x57\xeb\xab\xe3\x8c\x13\x87\xdb\xe3\x59\x1f\x44\xf9\xd1\x0d\xdc\xcf\xf9\x46\x9f\x68\xbd\x2b\xcd\x84\x0e\x94\xb3\xc9\x2b\xaf\x83\x2f\xcd\x14\x51\x5b\x6f\x41\x16\xad\x47\xd4\x7d\x21\x15\xd1\xc9\xfb\x64\x10\x21\x65\x78\x51\x9e\x46\x49\xa5\x66\x20\x74\xee\x8c\x55\x96\xa2\x85\x97\xaa\x2e\x20\x9a\xdf\xb5\x34\x8f\x39\x77\xcc\x42\xdb\xea\x1f\xb8\xc0\xbb\x93\x52\x91\x06\x43\x80\xe5\xbe\xc2\x58\x1a\x21\x55\x33\xbf\xdf\x7d\x2c\x13\x88\xb2\x52\x45\x5f\xf0\x1c\x2d\xc7\x9a\x0b\x8a\x86\xce\xe8\xd4\xfd\xfb\x9f\xcb\xc9\x8f\xe4\x3a\xc0\x1a\xf3\xc3\xfd\x7a\xf3\xec\xee\x46\x24\xd2\x39\x78\x13\xe3\x9e\x30\xab\xa3\x0b\x8b\x8c\x67\xde\x30\xbf\xb9\x32\xfc\x1c\x3f\x76\x01\x74\x9f\x2f\xd0\xee\x41\xbd\x62\xc1\x21\x9e\xbc\x1a\x19\xa4\xd8\x8e\x79\xac\xde\x2e\xe4\x55\x47\x6c\x8c\xbf\xd1\x66\x77\x57\x88\x29\x9d\x2f\xe1\x7d\x0c\xe1\xd3\x52\x1a\x5a\x23\xa8\xd1\xee\x7c\xa4\x87\xe5\x7d\xad\xd2\x18\xd1\x46\x08\xfb\xbf\x81\xf6\x5b\xf8\x6b\xb4\xbc\xd6\x21\xc7\xe2\x08\xc1\x8d\x86\xfe\x1e\x57\x2f\xcc\x7d\x22\xe1\xa8\xed\xbf\xb3\x77\xf0\xc9\x88\xd1\x9c\xdc\x52\x6c\xdf\x76\x55\xfe\x6f\x51\xa2\x20\xd3\xb0\xc1\xab\x4d\x37\x7f\x31\x27\xda\x5c\x5a\x55\x9d\x60\xd7\xff\x16\xa3\x0c\xce\xde\x1a\xad\x92\xb0\xf2\x7a\x57\xd5\x0b\xa7\xf5\xae\x20\x88\x92\xc4\xa3\x4a\x0c\x5c\xf9\x5a\xf5\xfb\x0a\x04\x82\x4a\x28\x45\x63\x13\xca\x1d\x2a\x9b\xba\xa3\x8a\x2c\x7d\xc9\xeb\x7f\x00\x8d\x1c\xff\x74\x08\x14\xcd\x4c\x84\xe4\x7d\x83\xba\xe9\xb7\x66\x08\x03\xd2\xfd\x76\x12\x62\xf7\x45\xdb\xfa\x65\x0a\x42\x4d\x5e\x0a\xd6\x9e\x9d\xfa\xc8\xa8\x3d\xe8\xce\x88\x42\xc0\x6a\x96\x87\xfb\x3b\xa4\x99\xb8\x96\x6e\xfa\x5b\x81\x17\x44\x51\x1e\x08\x2b\xdb\xd8\x2d\x7c\x98\x13\xdd\xd9\xfe\xa6\xf6\xdf\x9b\xe7\x21\x78\x2a\xe8\xf3\xfe\x8f\xcd\xd8\xb6\x62\xdc\xf6\x72\xff\xeb\x2d\x02\xe6\x7b\xaf\x10\x71\x10\x79\xbf\xf2\xae\x86\x56\x9c\x0a\x22\xc3\x20\x76\xc8\x09\x3b\xca\x1f\x8a\x06\xd5\x6c\x46\xa3\x08\xe2\x34\x93\x36\xfb\xfb\x5a\xe9\x63\x8f\x19\x87\x98\x07\x38\x75\x5f\x85\x7f\x52\xe5\x56\xbc\xf9\xef\x48\x18\x60\xc6\xff\x05\xc0\xbb\xf1\xbb\x43\x52\xa7\xc4\x3a\x44\xae\xd2\x5d\xef\xca\xa2\x20\xd7\x24\x65\xd6\xbc\x17\xe7\x09\x34\x0f\x72\x20\x41\x7e\x79\xf9\x04\xdf\x09\x2c\xe4\x88\x33\xc5\x1a\xd6\x6d\x71\x5d\x30\xb4\xe7\xf1\x90\x7a\xbc\x6d\x77\xc3\x83\x3c\x0c\x78\x2c\x50\xc3\x84\x10\xdf\x13\x60\xe6\xe4\xcb\x64\x16\x67\x04\xae\x44\xca\xc4\x1c\x29\x0a\x24\x8f\x42\x9b\xbd\x59\xa5\xf5\xb1\xac\xd7\x30\xa1\x04\xa9\x04\xe6\x6c\x77\x55\x75\x45\x33\x1c\x5f\x56\x85\x49\x46\xd4\xa3\xe3\x1b\xfe\xd6\x1d\x09\x9f\x7f\xba\xc8\x83\x52\x79\x38\x32\x52\x47\x17\xfb\x89\xbc\x18\xe8\x48\x4a\xeb\x63\x88\x0d\x77\x54\x90\xbf\x1a\x14\x9a\xcb\xcc\x96\xdf\x6e\xa0\x69\x47\x8a\xbd\xf3\x51\x06\x68\x91\x22\xbe\x68\xb9\x78\x7a\x5a\xdd\x8e\x54\x38\x15\x68\x13\xeb\xc8\xe7\xed\x45\x89\x3c\xcb\xe1\x3e\x01\x10\x87\x60\x29\xa6\x8f\xd2\x06\xb3\x8d\x47\xb1\x0d\xa7\xe6\x60\xcd\x41\x71\x60\xfa\x50\x7b\x84\x21\x26\xf5\x93\x9b\x34\x99\xc6\xdf\x85\xd6\x5a\x05\x94\xe8\x64\xf5\x3c\xe9\x74\x9a\x20\x8d\x51\xe7\x80\xd8\xdd\x43\x83\x8c\xdf\xdc\x19\x99\x90\x56\xf8\x6d\x59\x9d\xce\x55\x33\x5d\xce\xfe\xf5\xef\x7f\x4c\xae\x99\x67\xc4\x12\xb4\x3b\xe0\x95\x17\x81\x3d\x2f\x8c\xe2\xc0\x0e\xa7\xc3\xa9\x98\x46\x41\x26\x4c\xd2\x44\xf4\xfd\x8e\x8d\x19\x3d\x45\x13\x0a\x89\xa1\xde\xa5\xb9\xd4\xe7\x61\x5e\x63\x42\x60\xd8\x25\xf8\xe7\xf3\xa3\x2b\x97\x99\x28\x20\x9b\x3e\x7c\x25\xbf\x0f\x0c\x6c\x66\x12\x36\x13\x25\xa4\xd0\x4c\xd9\xed\x48\x0d\x6f\x7e\x9f\x35\x51\x2e\x9c\xa9\x09\x56\xd9\xa2\xc9\x6f\x89\x24\xcb\xa5\x0d\x66\xba\x05\x86\x4c\xb9\xff\x5e\x1d\xcb\x24\x61\x82\xb1\x07\x6e\x76\x4e\xa7\xe5\x2f\x3b\xcd\x26\x11\x3c\x71\x8c\x7b\x28\x75\x55\x2f\xce\xe7\x63\x31\x43\x6e\x32\x89\xa4\xb5\x7d\xbb\xd8\xaf\x1c\x9f\xde\x24\x26\x09\xed\xbc\xd8\x5d\xa4\xed\x52\x8a\xa9\xbe\xa1\x3d\x39\x8d\x05\xb3\x10\xdf\xbb\xe2\x38\xaa\x3e\x99\x34\x09\x70\x4f\xc0\xf5\x19\xcb\xc7\x93\x71\x90\xaa\x54\x99\x81\xce\xe5\xb2\x2a\x9b\xcb\x69\x12\x39\xb9\x59\x6d\xb2\x24\x46\x87\x40\xb2\x2d\xdc\x56\xc7\x63\xb7\x34\x92\x29\xe1\xe4\xa9\x67\x79\x60\xec\x44\x43\xae\xdf\xf3\xf9\x0e\xae\xce\xe1\x80\xc3\x88\x6a\x8f\x93\xda\xbc\xc9\x24\x21\x06\x97\xcb\x9e\x6b\x32\x9f\x76\x7e\x32\x3e\x7e\x69\x3b\xae\x4c\x2e\x09\xbf\x5b\x83\xaa\x7e\xb8\x0a\xed\xfc\x10\xcb\x75\xa0\x93\x6b\x2f\x9a\x89\x22\xb6\x32\xb9\x01\x64\x4b\xff\xf3\xd2\xb4\xdd\xea\xe3\x77\x2a\xc3\x22\x81\x54\xfc\xef\xa2\x15\xf0\x73\x18\xbf\x1b\x26\x95\x89\x07\x53\x76\xf3\x6d\xbd\xbb\xa9\xaa\xb7\xb1\x92\xb6\x32\x0c\x08\x3e\xb3\xbc\x5f\x0f\xe5\xac\x0c\x03\x83\x2c\xa7\x8b\xaf\xa5\x7c\xab\x7c\x83\xc1\x70\x43\xcd\x68\x14\xb5\x6b\x86\x9d\x11\x23\x18\xe4\x36\x27\x46\x8c\xe7\x44\x3d\x73\x34\x4c\x85\xc8\x23\xe3\x75\xa0\x5a\x71\xc4\xc7\xf5\x04\xf5\xd7\xea\x32\xc1\x66\x1b\xa9\x25\x07\x87\xd5\xeb\x82\x86\x5b\x71\x5e\xfa\xe2\xaa\x51\x41\x80\x0d\x41\x57\x43\x79\x58\xdf\x4f\xd2\x3d\xa3\x42\xc0\x29\x6d\x83\x8e\xef\x50\xf4\xb9\x9e\x51\x2c\x0c\xe5\x60\xc8\x3e\x89\xba\x2d\x54\x71\x16\xfd\x2f\x53\x2c\x8f\x86\xea\xad\xdd\xb4\x1f\x87\xb8\xb3\xeb\xb6\x51\x3c\xc5\xf7\xf7\xbc\xbb\xc5\xc5\xea\x6f\xcc\x74\x25\x35\xd6\xee\x94\x28\x1f\xc4\x1b\xd4\x7b\xa8\x51\x53\x60\x82\xf8\x30\x5a\x09\x07\x06\x7f\x28\x1c\x2d\x79\xae\x2e\x6d\x20\xc9\xb0\x34\xb4\x6c\xcd\x68\x9c\x80\x8e\x91\xcf\xbd\x7c\xb8\x1d\xfd\xdd\xc4\x19\x6e\xc8\x8b\x42\x16\xad\x14\xe5\xdb\xf8\x68\x12\x21\x16\xa3\x20\xab\xad\x85\x16\xe7\x76\xd2\x36\xd5\x41\xc0\x4c\x68\x41\x09\x0f\x85\x93\x60\xd4\x41\x00\xd0\xab\xd8\x0d\xae\xaa\x83\x28\x97\x90\x7a\xeb\x97\xea\x7d\x46\x4a\x5b\x07\x71\x12\xc5\x89\xd7\x84\xd8\x92\x00\xbc\xbb\x42\xcc\x38\x4e\x88\x93\x95\x7e\x1a\x5d\x3e\x96\x01\xb7\x3d\x63\x4b\x85\x22\x77\x7f\xc4\xaf\x0e\xd7\x4f\x1d\x24\xa1\xb0\x02\x28\x5d\x80\xb1\xac\xaa\x63\x6f\x04\xab\x83\xc4\xaa\xfd\x35\xd0\x7e\xaf\x6a\x3d\xf9\xa8\x22\x5d\xe4\x12\xde\x1d\x37\x62\xd5\xbe\x3e\xef\x6e\x51\xbb\xc3\x3f\x85\x54\x51\xe4\x45\x1b\xf4\xdd\xe6\x79\xbb\xff\x4a\xca\x0f\x87\xad\x6f\xb7\xeb\x20\xd5\x21\x58\x9a\xd3\xf9\x49\x78\x0a\x86\x0e\xb2\x28\x8f\xed\xfa\xdc\x85\x0e\x8b\x9b\xf5\xa4\x72\x6f\xc7\x88\x0e\xb2\x24\x06\xb0\xc1\x24\x41\x08\x08\x69\xeb\x0e\x67\x46\x67\xbd\xbe\xff\x9a\x0a\x35\x23\xeb\x09\x77\x26\x27\x55\x98\xcd\x07\x4e\x90\x1a\x9e\x40\xd4\x47\x7f\x1d\x91\x5b\x65\x4d\x5c\x13\x06\x74\x62\x1d\x38\x38\x18\xc6\x04\xd3\xc9\x42\x6d\xa7\x5f\xff\xef\xf8\x46\x58\x92\x1a\x02\x5f\x57\xc7\xa8\x69\xeb\xbe\xdd\xa0\x03\x1e\xc4\xb8\xfa\x3f\x89\x8f\xbb\xaa\xbe\x3b\x8a\x97\xf1\xeb\xe1\x51\x86\x42\x1b\xb5\x68\xe1\xd0\x56\x7e\x05\xd0\x81\x88\xc3\x84\x8a\xb7\x5d\xc6\x3c\x42\x9f\xe8\x40\xa5\x0c\xeb\x58\x48\x54\x99\xc0\x44\xdc\x29\x2c\xc7\x71\xfd\xc7\xe2\xc9\x7d\x0a\xf2\x2c\xd4\x23\x86\x3a\x3a\x99\xfd\x1c\xb3\xef\x74\x00\x8c\xa3\x52\xe5\xed\x0a\x79\x01\xfe\xcf\x40\xb5\xaf\xc3\x59\x7c\xdc\x7c\xac\x6a\x15\x05\x93\x57\x62\xa2\x4c\x65\x53\x32\xc8\x55\xa2\x3b\xbe\x4f\x93\x0a\x6c\x0e\xdf\xee\x97\x4b\xf7\x4d\x46\xab\xc8\x11\x7a\x44\x51\xb6\x45\xf9\xb2\xa8\xdb\xa2\x69\xd7\x7a\xfa\x8d\x46\x63\x78\xf9\x78\x79\xeb\x41\x72\x74\x2c\x0c\x62\x89\x09\xf7\xd6\xa9\xfa\x8c\x3f\x1b\x86\x79\xec\xbc\x04\x28\xc8\xef\x36\xa4\xb9\xee\xb7\x0e\x43\xc5\xb0\x30\xdf\x16\x27\xd8\x17\xc7\xe3\x63\xf7\xd0\xc8\xd0\xd8\x9e\x11\x81\x71\xe2\x23\x0d\xe6\xaf\x13\x2c\x90\x0e\xe3\x48\x60\xff\x15\xa1\xb6\x3d\xb4\x66\x7c\x4f\x71\xac\x98\x83\xab\x14\x7a\x7a\x30\xe5\x11\x22\x2b\xba\x3c\x90\xf6\xcd\x9b\x0f\x54\x0a\xb0\x27\xa4\x11\x95\x1f\xb1\x12\x0e\xbd\x29\xf5\xdc\xca\x15\xa6\x89\xb2\x4a\xd7\x54\xa3\x74\xaa\x51\x3d\x1c\x52\x87\xa9\x22\x87\xc6\x87\xc5\xe3\xe2\xef\xa3\x70\xe7\xf6\x1d\x1d\xa6\x46\xe1\x4e\xec\xc6\xc3\x1d\x0c\xeb\x71\x3a\xcc\x40\x49\xbb\xfb\x3e\x5e\x4e\x93\x9f\x9e\xab\x04\x53\xad\xf2\x72\xda\x98\x61\xc8\xa0\x43\xd6\x0d\x97\x51\xa3\xb9\x3b\x4a\x90\x0c\xb2\xbf\xf9\x15\x90\x4f\x87\x2c\x4c\x34\x25\x3e\x47\x63\x35\x4b\xfa\xec\x5f\x87\x2c\x0f\x10\x82\x7a\x40\xa6\xa9\x2d\x85\xac\x97\x9b\xd0\x9f\xa0\xc8\xec\x72\x2f\xde\x60\xd5\x23\x0e\xa7\xdf\xa2\x53\x2c\x0f\x89\xa2\xbe\xad\xab\xf3\xe4\x5d\xf0\xdc\x18\x92\x69\x56\xaf\x5d\x60\xb3\x2e\x4d\x75\x57\xd5\xdd\x7f\x4e\xb6\xb1\x50\x24\xe0\xca\x48\x5f\x3f\xce\x5d\xf2\x43\x12\xa5\x56\xdc\x6f\x66\xf0\x8a\x54\xe1\xc0\xeb\x16\xd1\xa2\x7c\xd9\xb5\xdd\x62\xf3\xf2\xf1\xb7\x5f\xe3\xf8\x87\x08\x46\x95\xd8\xd5\x97\x2f\xbb\xc3\x7e\x73\xf8\xba\xd8\x2f\xbf\x1e\xc2\xdd\xe3\xe2\x77\xb7\x4d\x84\x92\xc7\x98\x9a\xab\xd7\x6e\xf1\x1a\x48\xbb\x0d\x1b\xa0\xa3\xff\xfc\xf4\xc0\xdf\xff\x4f\x37\xcf\x14\x64\x4e\x24\xd7\x0e\x80\x69\x50\xae\x43\xad\x52\xc7\xb0\xc5\xc6\x38\x3d\xaf\xc5\xb1\x06\xa1\x3f\xd6\x04\xcb\x1a\x3f\x44\x08\xe2\x34\x75\x58\x34\x32\x60\xf0\xf3\xca\x9f\x92\x7b\xf8\x1e\xc5\x01\xfd\xcc\x84\x84\x25\x03\x79\x9f\x5d\x2b\x70\xaf\xbf\x16\x42\xd7\xa1\xc9\x62\xad\x7c\x9c\x32\x60\x64\x4c\x5e\x84\xb1\xc2\xa9\xc7\xea\x65\x18\xf2\xea\xd0\x70\x91\xf6\x2e\xd2\x76\xb6\x8d\x34\x0c\x74\x68\x14\x75\xa4\x6e\x56\xfb\x47\x68\xdf\xab\xfa\x6d\x68\xd7\xe8\x4e\xd2\x0a\x83\x02\xb2\xc6\x20\x4c\x6e\x14\xfc\x36\x13\x3b\xeb\x28\x48\x73\x0c\xdc\x8d\x28\x8e\x83\x1a\x91\x8e\x02\x19\xe1\x2f\x6f\x44\xd5\x88\xca\x02\xcb\x74\x14\x29\x85\x10\xd1\x2f\xe2\x44\x8e\x98\x73\x29\x2a\x1b\x17\xf5\xdc\x47\x4d\xe2\x75\x85\x51\xe0\xfa\x47\xd1\x14\x55\xe9\x85\x0a\xc7\x65\x9a\xee\xfc\x34\xce\x3c\xc7\x41\x5f\x54\x7b\xf3\xb1\x85\x17\xab\xb6\xf3\x2b\x80\xcf\x4c\xf2\xae\xa3\x38\x00\xa9\xbd\x44\x10\x76\xf8\xd1\x8c\xc1\xf4\xaf\x3b\x8a\x63\x32\xb7\xaa\xac\x40\xda\xe1\x45\x34\x47\xb4\x80\xb0\x27\xa4\x79\x64\x11\x0c\x5d\x44\x67\x15\x33\xc6\x03\x21\x4a\x4d\x8a\xb4\x03\xc2\xbd\xaf\x7e\x42\xad\x8a\x66\xbe\x5f\xa6\xa3\x0c\x42\x6c\x82\xee\x56\xcb\xe7\xed\x7a\xff\xe7\x61\xb5\xff\xba\xda\x1e\x96\x7e\xf7\x8f\xf2\x30\x41\x76\x73\x09\xef\xdd\x72\x6f\xe9\x1e\x53\xbe\xc6\x4c\x25\x59\x47\x79\x0e\x99\xe5\x26\x3a\x41\xcd\x59\x6e\x8b\x7f\xe4\xc8\x1b\xf5\xec\xde\xad\x28\x1a\x98\x49\x03\x74\x94\x9b\x50\x13\xe8\xfc\x7c\xb6\xa9\xe0\x50\xf9\x45\x47\x5c\xe5\x18\xb4\xbb\x08\xfa\xd9\x47\x78\x91\x08\x14\xe6\x3f\x0e\x49\x88\x8c\xec\x03\xb4\xaf\x7f\xbb\x00\x3d\xaa\x1a\xba\xab\x86\x21\xa6\x3a\x04\x23\x25\x3f\x86\x3e\x9e\x8b\x44\x46\x66\x00\x2e\xaf\xbb\x29\x8e\xc7\xa2\x2a\x1b\xa2\x8d\xb8\x93\x72\x41\xf5\xc6\xba\x12\x5a\x09\x14\x42\x6d\x61\x34\x2b\x84\x24\xcc\x18\x5a\x96\x39\xa6\x35\x0a\x29\x19\x31\x0d\xe5\x22\x99\x0a\xa4\xee\xbd\x43\xb1\xaf\x7a\x5e\xa5\xfb\x3a\xa5\x35\x6a\xae\xe1\x2c\x75\xcc\x9f\xfe\x20\xb5\xa8\x85\x0b\x06\xd6\xaa\x42\xa5\x73\x7b\x5c\xa7\xa4\x0e\x46\x61\xa6\x5d\x30\xfd\x41\x46\x26\x4f\xaf\xe4\xcd\xef\x1a\xf8\x3a\x02\x15\x23\x9f\xad\xbe\x94\x84\x85\x5d\x97\xe6\x38\xa8\x91\xe9\xc8\x04\x79\x18\xf4\x06\x60\x37\x1f\xd3\xd0\x2d\x32\xa9\x21\xf1\xb7\x23\x88\xfa\xae\xaa\x16\x3d\x51\x56\x47\x26\x8f\xed\x1a\xf6\x06\xe5\x67\x9d\xae\xc9\x28\x35\xb9\xc2\xb1\xb2\x84\xb2\x71\xaa\x70\x3a\x0e\xb2\x30\xce\x07\x2d\xdf\x06\xbe\x1c\x2b\xe9\x7d\x10\x74\x1c\x06\x84\x86\xc0\x06\xfe\x4e\xbd\x82\xbe\xcc\x28\x2f\x8e\x83\x99\x38\x8c\x05\x0e\xdc\x63\xd1\xb4\x1b\x73\x2d\x0f\xae\xe3\xd0\xc4\xf8\x60\x77\xc5\xcf\xd6\x81\x60\xb7\x97\x23\x4c\x76\xe7\x38\xca\x52\x61\xcb\x60\x64\x2e\x0e\x7b\x51\xbf\x4c\x4a\xe3\x3a\x8e\xf2\x98\x33\x67\x65\xa1\x80\xa8\x30\x7d\x05\xdb\x9d\xc5\x63\x0d\x03\x15\x39\xfb\xe7\x38\xcb\x83\x1e\xf4\x34\x44\xa0\xfb\xa7\x90\x44\x84\x3d\xbf\x87\xa6\xf9\x04\xb6\xa8\xe3\x54\xa5\x98\x72\xad\x2e\x75\xd5\xd6\x4e\x53\x5c\xc7\x59\x4a\xfc\x12\x57\x07\xc3\x66\xe3\x3f\x9f\xfe\x5c\xfe\x55\x8c\xe1\x3e\x9f\x13\x6b\xa2\xdb\x55\xd7\xcb\xcd\xe4\xa7\xe7\x5a\x21\x3f\xfd\x0c\x7d\x7a\x14\x33\x46\x02\x3b\x4d\x2b\x5e\x20\xf1\x7f\x15\x82\xa1\xee\xde\x6b\x55\x35\x30\x24\xc1\xeb\x98\x27\x02\xcb\x95\xab\xfd\xd7\x30\xf8\xdd\xff\x35\x15\x98\x49\x79\x0f\xf2\x45\x39\x66\xab\xfc\x72\xcc\xc5\x22\xd4\xf8\xc0\x1f\xc4\xcf\x05\x45\x76\x7f\x0c\x14\x30\x74\x2c\xe2\x3c\x13\x03\xc7\xde\x2b\xe1\x3d\x1d\x8b\x3c\x45\xbd\x99\x63\x25\x74\x17\xf0\x75\x71\xc1\xa0\xdc\xf3\x0d\x75\x7d\xae\x14\x56\xfb\x02\xa8\x8e\x65\x10\xa3\xb3\xd6\xd2\xa2\x87\x5d\x45\x4e\xc7\x2a\x0e\x42\x5b\xa2\xb5\x8e\x58\x18\xda\x8e\xf6\xc7\x58\x41\x1c\x64\xbe\xa7\x46\xa2\xb1\x73\x8d\x14\x1d\x6b\x60\xf8\xd0\xcf\xe2\x63\x5f\x0d\x08\xcb\xf6\x30\x04\x21\xc6\x48\x37\x97\x6e\x3b\xb3\xb1\x34\xe8\x59\xe3\x2d\x1d\x43\x42\x64\x4e\xa2\xec\x86\xc1\x03\x34\x4d\x2f\xa1\xa4\x63\x93\x53\x7f\xde\xb2\xca\x1e\xf6\xcf\x93\x19\x66\x20\x72\xe9\x2c\x8a\x0c\x13\xae\x13\x53\xb9\xf9\x26\x94\x4e\x82\x30\xce\x8d\x9d\x1f\x08\x89\xda\x81\xd3\x41\xd0\x49\x10\x11\x20\xae\x9b\xd3\x07\x53\x1c\xfd\xad\x24\x81\xd5\x9c\x23\xe9\x35\x74\x9d\x1f\x3d\x98\x24\x10\x89\x55\x0c\x28\x75\xf8\x50\x1c\x27\x87\x43\xa1\xc5\x80\x59\xe1\xfa\x15\x23\xcb\x0b\x9d\x44\x61\x8e\x1e\x25\x64\x8d\x3a\xa1\x71\xe8\x24\x8a\x95\x43\x08\x0c\xb8\xf5\x9b\x1a\xa6\x9a\xe1\xee\xfc\x8c\x20\xd9\x3f\x0a\xd5\x56\x75\x01\x97\xd3\x30\x3b\x4e\x62\x0d\x58\x91\xb5\x08\x3b\x52\x52\xdf\x3b\xd7\xd6\x19\x56\xce\xf4\x05\x26\x31\x48\xc3\xbd\x59\xc5\x59\x94\x6f\x68\x4a\xa1\xfd\x37\x00\xe0\x0d\x17\x8d\xe7\x31\x3e\xd5\xd5\x4b\xed\x5c\x28\x74\x92\xc6\x79\x46\xd8\x91\xe3\xf1\x7b\x51\x4e\xa2\xf4\x24\x85\x14\xf7\xd1\xe5\xd7\xdd\xe8\xd6\x53\xa3\xd0\xb1\xe3\xee\xe7\xcf\xb7\x68\x74\x24\x13\x12\xf1\x40\x9e\xa0\x6d\x17\xde\x2e\x67\x6c\xfb\x37\x9d\xe9\x1c\x77\x71\x71\x3e\xd7\xd5\x0f\xb8\xf9\x58\x97\x1a\x7e\x4e\xbe\x3d\x4f\x64\x60\x81\xf1\x45\xd9\x6b\xe9\x0c\xd1\xc3\x3a\xc9\x15\xb9\xab\xa9\xaa\xda\x5a\xd4\xd3\x8f\x02\xde\xa7\x93\x3c\xc9\x4d\x6c\xcd\x1c\x1a\x75\x81\xfb\xaa\x69\x7f\xff\xd0\x1f\xb3\x4c\x7f\x9d\xb0\x48\x73\xdb\x7d\xbc\xbf\xff\x76\xe8\xde\xc4\x21\x72\xdf\xc8\xd2\x9c\xd0\x23\xe2\xa7\x27\xa7\xe8\x84\xa7\xb1\x13\xf9\x7c\xac\x4a\x42\x76\x0d\x9d\xbc\xdd\x69\x19\x20\x9d\xe3\x47\xd5\x82\xd3\x92\xea\x29\x09\x93\xf7\xcb\x73\x6e\xdf\x9f\x15\x5a\xfc\x52\x75\xa9\x8f\x50\xaf\xfd\x3b\xe6\x3c\x8d\x9c\x88\xde\x30\x6b\x9a\x5c\x4a\x80\x46\x7d\x74\xa8\x6b\x12\xa5\xb1\x93\xdd\x5d\x46\xc6\x0a\xb7\xfb\x2e\x36\xbd\x48\x5d\x9d\x44\x31\xed\x83\xcc\xee\xc3\x89\xcc\x78\x98\x78\x0d\x71\x5d\x4d\xea\x06\x89\x0a\x12\xac\x48\x2d\xce\xe7\x6a\xd0\x01\x9c\x5c\x45\x25\x2a\x50\x63\x81\x59\x5c\xc2\xdc\xed\xe9\x20\xcd\x6d\x30\x23\x2f\x1f\xe5\x40\xd8\xd6\x9d\x10\x66\x28\xc0\xba\x52\x55\x59\x9d\x3e\xb6\x20\x11\xed\xf9\x8b\x64\x62\x94\x53\x24\x3a\x91\x09\xca\xff\x6f\x1e\x9f\x77\x83\xa0\x3d\xd1\x19\x43\x05\x25\x52\x77\x5b\xad\x9f\xfa\xfc\xcb\x9e\x01\x11\x93\x36\xdd\x7d\x84\x9f\xed\x4d\xa1\x57\x3f\xcf\x45\x0d\x38\x58\x2d\x05\x69\xfc\x4c\x20\x26\x18\xd1\xf3\x6e\xb5\x3d\x2c\x96\xff\xf3\xbc\xde\xad\xf7\xeb\xcd\xa3\xfb\x4e\x93\x02\x8e\xd5\x87\xfd\x68\x6e\x19\x19\x63\x64\x5c\xc2\x7b\x17\x40\x76\xe1\xf1\xe6\x7c\x2d\x3e\x3a\xd3\xb6\x9a\x24\x70\x69\x10\x4a\x74\x9e\xc2\x12\xf1\xb1\xf9\xdc\x59\x73\xf6\x9d\xa7\x41\x4c\x3e\x9e\x04\x87\x00\x87\x11\x4d\xdc\x61\x9d\x20\xe3\x0b\xed\xb2\x3c\xdf\xf5\xe4\x39\x48\x3a\x0d\xa5\x12\x4e\xe4\xe8\xf2\x61\x73\xf5\x91\x43\x9f\x3b\xd1\x04\xd8\x75\x44\xc0\xd5\x81\xd6\xe5\x43\x0b\xb5\x5b\xc0\xd2\x88\x65\xda\x0e\x0c\x82\xd0\x0e\xdf\x6a\x1a\x8b\x18\xc9\xde\x27\xf1\xd6\xdb\x67\xd1\x79\xe3\xef\x89\x05\x29\x26\x3c\x2c\x1e\xbf\x2e\xf6\xfb\xc5\xe3\xd3\x76\xf3\xc7\x9f\x77\xb7\x5b\xf7\x3d\xdd\x66\x99\xf6\xe0\x09\x62\x1d\xb9\x83\x49\x90\x81\x9d\x03\x76\x2b\x58\xb4\xbb\x52\x9c\x9b\xd7\x6a\x12\x45\xa6\x89\x4a\x5d\x1b\x79\x59\xd4\x88\xfd\x2b\xaa\xb2\x0b\xab\x66\xe7\x6d\x9a\x06\x0a\xab\x9a\x7f\x38\x5b\x85\xeb\x2a\x41\x9a\x46\x01\xa6\x1f\xbf\x57\xed\x6a\xef\xff\xc8\x69\xe9\x46\xbb\xbc\xbe\xee\x90\xa6\x4a\x0b\xa2\x13\xb4\xd8\x43\x22\x84\x8f\x45\x53\x4d\x9e\x4a\x16\x44\xb8\xd2\x2d\xea\xff\x1d\x0e\xc4\x34\x0b\x48\xc6\x61\xf5\xff\xa2\xb4\xe7\xa4\xe9\x34\x0b\x73\xac\x11\xee\xf6\xcb\xfe\xc9\x65\x69\xea\x68\x77\x4f\xc5\x4f\x38\x92\x1e\xda\x65\x0a\x6a\x9c\xff\x2f\x7f\x0d\xa9\xd2\xe1\x4d\x2f\xcc\x40\x52\x67\xf2\xc8\x32\x16\x62\x8c\x74\x2a\xca\x76\x0b\x66\x52\x8c\x48\x33\xa6\xb1\x21\xdb\x5c\x64\x37\xde\x7a\x77\x60\xe6\xff\x27\x1c\x91\x12\x75\x9a\x99\xc0\xf1\x7d\x6f\xc1\x88\xcb\xb1\xc5\xa2\xc3\xe4\xd5\xe6\x91\xc0\x18\xff\x66\x73\xe7\x7e\x7b\x9e\xaa\xd8\xc2\xb8\xda\x2f\x70\x9a\x6b\xf4\x79\x2b\x83\xf1\x8f\xc8\x33\x8d\xe3\x7a\xfd\xb4\x58\xfa\xab\xe5\x39\x38\xf5\x0c\xe5\x4a\xea\xcd\xbe\x72\x3c\xd0\x4f\xea\xab\x69\x2e\x12\xcc\x40\x77\xef\xe2\x7c\xd5\x0b\x98\x9e\x9a\x61\xc8\x77\x23\x9a\xe2\x68\xeb\x52\xee\xeb\x59\x12\xe0\x1c\x21\xff\xbc\x05\xee\xdc\x7e\x47\x4f\x59\x46\xc1\xe2\xa6\x3c\x16\x13\xd5\x46\x9d\x32\xc1\x32\x4a\x01\x49\xa8\x98\x4c\x4d\x7e\xad\xa0\x3b\x1f\xef\xa7\x0c\xc8\x77\xe9\x2f\x16\xc1\xd9\xd5\x6f\xfc\x56\x79\xc8\xd0\xb4\x7c\x29\x4a\x51\x7f\x7c\xcb\xef\x84\xef\x1b\xa6\x5c\x9a\xd4\xe9\xc6\x56\xef\x77\x75\x75\x1a\xb8\x15\xeb\x54\x24\x8c\x6b\x4b\xb7\xb9\x76\x40\xd6\xa9\x48\x73\x35\x6c\x1e\x6f\xce\x45\x39\x14\x97\x1f\xdd\x87\xe0\xd2\x62\x1a\xed\xd6\xb7\xa9\x9f\x44\xe3\x78\x70\x28\xd1\x3f\x89\x22\x52\x21\xb3\xd0\x52\xdf\x57\xa7\x73\xfb\x81\x13\x6b\x51\x83\xf8\x7b\xe9\x5e\x2a\xba\x8d\x8d\xe6\xe4\xef\x70\x9d\xda\x0c\xea\x24\xa9\x4c\x04\x74\xef\xf5\xbf\x5f\xff\xc7\x2a\x39\xbb\x87\x20\x19\xb3\x28\x72\x17\x0b\x7f\xd9\xae\x56\x8f\x33\xdc\xf6\xf1\x97\x4b\x91\x23\x9c\xce\x14\x75\xd3\x22\xc9\xf6\xa9\xf2\x0f\x5e\x0a\x9e\xb3\xde\xed\xff\x00\x63\x45\x43\x9d\x4a\x43\x60\x2e\x32\x82\xd1\x1b\x33\x99\xde\xd2\x50\x00\x6a\xab\x0d\xdf\xa0\x69\x47\x45\xe2\x54\x45\x11\x62\x0c\x4e\xcd\xcb\x83\x38\x4f\x56\x3c\x95\x28\x8c\x33\x88\x6c\x45\xef\x7c\xfc\xe8\x75\xa6\xb0\x68\x22\xa1\x5d\x97\xa6\x5a\x37\x56\x8f\xc7\x1d\xe6\x29\xae\x2e\x7b\xf1\xb3\x18\x4d\x01\x2d\x05\x62\x64\x10\xf8\xbf\x3a\xc2\xf9\x55\xf4\xf7\xa4\x35\xf1\xd8\x9a\xd7\xea\xfd\xa1\x79\xb1\xe8\x38\x7b\x10\xa2\x80\xec\xc0\x0e\xeb\xd3\xe9\x48\x2d\x6c\x9b\x92\x55\xb5\x73\xc0\xd4\x29\xc4\x0a\x3b\x64\x28\xa1\xef\xfe\x26\x35\x56\xa8\x3d\xcc\xbc\xcb\xb8\xaa\x8b\xff\x5e\x50\x1a\x65\x88\xda\x57\x9b\xaa\x97\xc3\xd8\x3a\x35\x09\xc7\x95\xd4\x65\xe6\xce\xc9\xf0\x97\x19\x79\x6a\x52\x95\x10\x38\xec\xe3\x0b\x58\x1e\x67\x68\x5f\x4f\x16\x08\x81\x42\xa9\x24\x9b\xee\x2c\x0c\x7e\x79\xc1\x2c\x30\x14\x33\x3f\x2c\xfe\x38\x20\x8a\xcd\xde\x5f\x16\x72\x92\x5e\xc4\x89\x72\xe8\xa2\xc2\xc6\x1f\x12\xdc\x1a\xb7\x1f\x8f\x24\x77\x37\x7f\xed\x50\xc9\xd8\xee\x4e\x78\x4b\xb6\x02\x34\x79\xeb\x59\x24\x63\x72\x9e\xbc\x94\x5d\xf0\xd0\x4f\xf5\x2c\x4e\x78\x44\x6a\xb2\x1f\xf7\x20\x3e\xff\xa2\xd8\x4a\x8e\x61\x24\xb3\x7b\x2d\xce\xd3\x9a\x9a\x3b\x8f\x53\xa5\x77\xd5\xa2\xf7\x87\x3f\x6b\x72\x35\x4e\x4c\x04\xf7\x66\xba\x04\xca\x6a\xc0\xff\x0a\x8e\xa4\xb3\x58\x28\x4c\x19\xe5\xe5\x63\xf9\xda\x03\x25\xb2\x58\x73\xcc\x0f\xfc\x64\xb6\x51\x89\x3d\x9c\x48\x62\xa1\x1f\xac\x38\xd8\x2c\xcc\xc5\x9d\xab\x39\xd1\x27\x2f\xc5\x51\x2f\xab\xb2\x84\x79\x6f\x35\xf7\xef\xaf\x56\xaa\x2c\xcd\x32\x04\xd1\x4b\x81\xf0\x68\xf2\xcd\xa6\x05\x2a\xfd\xc7\xe8\xff\x73\x1f\xe0\x01\x83\x9e\x1e\xf5\x74\xb7\x1b\x85\x84\x59\x2a\x25\x6e\x45\xdf\x0a\x78\x1f\x4e\xd0\x2c\x4f\x73\x14\x58\x22\x8a\xf4\x27\xbf\x2d\xe7\x04\x99\x5b\xec\xbe\xde\xaf\xfe\x3c\x2c\xee\xef\x37\xcb\xc5\x20\x74\xcf\x72\x48\x11\x50\x7f\xbf\xdb\xa3\x5f\x28\xd4\xdf\x57\x6b\x7f\xd0\xc4\xc8\xa1\xee\x22\xdd\xf2\x65\x50\x26\xca\x58\x18\x60\xfe\x73\x14\xcd\x04\x0b\x90\x71\x96\x62\xa1\xba\xdb\xe3\x41\xbb\x8e\xaa\x3f\x2a\x72\x13\x52\x65\xfa\xe5\xb5\x6d\x16\x08\x63\x29\xaa\x72\xec\x35\xab\x33\x91\x2b\x2c\x10\xa2\xf2\xd6\xac\xa6\xc5\x6c\xa8\x9f\xa9\x44\x4a\xef\xfe\xb8\x43\x64\x6a\xb7\xcf\x3e\xa1\x0e\xda\xb0\xde\x9c\x29\x16\x27\x4e\x81\xa1\xb5\x1b\x02\x51\x28\xe6\x1f\xa5\xce\x0d\x4e\x5e\xc2\xb8\x90\xfe\xa1\xbb\x96\x56\x19\xcb\xc7\x2c\xa1\x4f\x2e\xa2\x04\x3e\x9c\x6e\x5f\x22\xa8\xfa\x00\x13\xfe\xc9\x14\x80\x20\x85\xc8\x55\x4d\x9e\xaa\x76\xf1\x2e\x3e\x7a\x67\x4e\x9d\x41\x42\x34\xed\xfb\x9b\xe5\xe7\x84\x05\x9d\x01\x63\xa9\x93\xd6\x05\x6d\x51\x97\xcd\x70\x69\x00\x49\x3d\x65\x09\x76\x0b\x5a\x74\xc1\x84\xff\x1a\x08\x50\x09\xe7\xfb\x7a\x77\xbb\x79\x70\x7f\x35\x09\x81\xa1\x74\x2d\x5e\xaa\x61\x53\x31\x33\xb9\xc2\x00\xeb\x0b\x94\xf0\x78\x79\x79\x81\xb6\x19\x8d\x5f\x93\x1b\xac\xc9\x88\xf3\xf9\xf8\xf1\xbb\xa8\x4f\xe2\xb6\x30\x66\xfa\xdc\xfe\x15\xfd\xdb\x9d\x2f\x0c\x26\x02\x7f\xd8\xff\x0b\x12\x7f\x25\x15\x69\x5b\x2c\x7b\x40\xbb\x8f\xef\xa2\x26\x65\xd8\xaa\x1a\xeb\xe4\xea\x3c\x48\x94\xb4\xa9\x4f\x77\x63\xb5\x38\x6e\xe1\x28\x06\xb6\x5d\xf6\xbc\x50\xc4\x48\x66\x77\x0e\xfa\x99\xb1\xe6\x87\xae\x8b\x9f\x87\x22\x19\x69\x32\x3e\xbc\x7d\x32\x09\xf3\x28\x22\xdb\x53\xe4\xa0\x4c\x97\xd1\x1e\xab\x7c\x9d\x47\xe4\x11\x63\x61\xea\x11\xaf\x2e\x72\xeb\x09\x78\xa3\x37\x9c\x47\x3c\xc2\x1e\x5a\xb7\x50\x36\xf7\xe4\x6c\xfb\x9b\x3f\x26\x38\xd9\x76\x1d\x71\xff\xc7\xb4\xcc\x8b\x0e\x8c\xf0\x11\x79\x24\x24\xd2\x81\x11\x2b\x84\xad\x38\x17\x2e\xe4\xb1\xb6\x26\xbc\xdd\x55\x9a\x27\xa8\x6f\xfb\x72\x68\x1e\x6b\x93\x33\x0f\x7f\x7b\x6e\xba\x2c\xae\x1f\x5e\x79\x12\xf0\xcc\x69\xfc\x88\x56\xd8\xfe\xf2\x16\xcc\xb5\xfc\xb5\xce\xd3\x54\x12\xe5\xfd\x22\xe7\x25\xc5\x74\x9e\x85\x12\xb5\xa9\xbf\xd4\xc2\xaf\x3e\x79\x16\x31\xec\xd3\xff\x6f\x55\x94\x48\x74\x99\x7f\x25\x59\xb7\xbf\x59\x11\x8d\x21\x7d\xcb\x1d\x16\x22\xcc\x06\x85\x62\x2f\xec\x8b\x83\x24\x4b\xa6\x77\x62\x04\x32\x97\x8e\x45\x63\xd5\x5c\x56\x2f\x2f\xfe\x96\xf2\x28\x51\x76\xa1\x59\xb5\xaf\x7b\xe2\x44\xaf\xcb\xf3\xa5\x9d\x01\xa9\xe5\x79\x1a\x85\x76\x83\xbf\xdb\xed\x67\xf1\x19\x79\x2e\xc8\xb7\xc8\x35\x32\xf7\x57\x6e\x04\x3a\x67\x41\x8a\x6b\xf7\xb9\x40\x8a\xc5\x5f\x24\x2d\xee\x43\x21\x85\xf6\xe7\xcb\xf1\xb8\x2a\xdb\xfa\x63\x72\x73\x2c\x21\xa9\xb0\xa2\xd9\x5d\xce\xd6\x73\x64\xf2\xb5\xb6\x82\x71\x26\x1b\x2e\xc4\xdc\x0e\xc6\x00\x37\x2c\xd3\x3e\x99\x7d\x7a\x7b\x41\x0e\xe1\x4c\x81\x2b\x17\x91\x42\xe2\xe3\x16\x9a\xcb\xa9\x97\x88\xd6\xb9\xcc\x72\x94\x1f\xe9\x46\x20\x35\xe6\x86\xcb\x4a\x2e\x05\x33\xba\xd7\x1f\xc6\xec\xbd\xfb\x92\xa5\x8f\x1d\x72\xc5\x23\xa4\xe7\xd4\x54\xc7\x99\x7b\x0b\x3a\x95\x68\x53\xb2\xdb\x2f\xb6\xfb\xf5\xe3\x97\xc3\xee\xfb\x66\x7b\xeb\x2e\xa0\x05\xc3\xcc\xb2\x7d\xad\xab\xf7\xe6\xfb\x2b\x94\x96\x76\xd4\xad\x3d\x45\xfb\xba\x2e\x55\x55\xd7\xa0\xda\x3e\x22\xc9\xb5\xa0\xba\x63\x0d\x65\x75\x29\x15\x2c\x6a\x59\x5c\x25\x4a\xb9\x36\x22\x0e\xbd\x5f\x73\x6d\xb5\xb0\x26\x37\x07\x71\xe8\xa0\xed\xb8\x61\xd1\xfc\x99\x9c\xc3\x0d\xda\x01\x6c\xc1\x54\xa5\xfe\x0b\x7f\x33\x9d\x83\x50\x18\x56\xbe\x56\x97\x06\x0e\x06\xe0\x70\x56\xfe\x79\x81\x0a\x71\xa5\xeb\xe5\xea\xe8\xb3\x87\xe5\x6f\xe3\x8b\x28\x8d\xeb\xcf\x4b\x2d\xba\x1d\xb7\x3a\x55\x4f\x62\xa2\xe2\x66\x1b\x50\xb9\x61\x29\x32\xd2\xe4\x45\x0f\x14\xb3\x66\xcd\x47\x74\x6e\x04\x39\xde\x35\xd0\x3e\x01\xea\x51\x53\xcd\xdc\xdd\x9f\x91\x24\x84\x6c\xc1\xbc\x0f\xa2\x45\xf3\xf0\xe2\x93\xd0\x36\x37\x86\x78\xd2\x74\xf3\x58\xc9\xf7\x54\x8e\xd1\x63\x61\x81\x16\xbd\x6b\x39\x09\xfa\x8e\xde\x17\x0b\xb9\xd4\x36\x31\xed\x0e\xdc\x7d\xbf\x9d\x9c\x10\x89\x1c\xd7\xc4\x03\x06\x32\x5d\x3a\x73\x9c\xe9\x15\xda\x93\xe3\x0c\x70\xb9\xdf\x7d\x5d\x6c\x6f\xbb\x51\x47\x0a\x09\xbf\xb9\xc3\xcc\x04\xb6\xca\xff\x28\x4e\x3e\x77\x60\xb1\x4c\xb1\x1f\xbd\x17\xaa\x1a\x04\x69\x2c\x51\x06\xbd\xa7\xde\xdf\xdd\x1e\xf5\x3e\x79\xb4\x2c\x8d\xe2\xd8\x66\x03\x77\x75\x75\xda\xd7\x97\x2e\xfd\xef\x16\xf5\xbf\x6a\x9e\xb3\x34\x09\x90\xbf\x22\x6c\xab\x66\xff\x5a\x43\xf3\x5a\x1d\xb5\xdb\x21\x59\x9a\x06\xd2\x92\x1d\x68\x88\xf6\x0b\x01\x4b\x81\xe3\x14\x5a\xb5\xe2\x58\x8d\x8a\x2f\x2c\xb3\x50\x18\x0c\xe1\xd0\x2e\xba\x28\x5f\x26\xf7\x9d\x65\xe4\x85\xfd\x20\x7e\x16\xa7\xe1\x6f\xce\x58\x96\x30\xaf\xec\x32\xec\xbf\x4c\x2e\x00\x00\xfe\xcd\xa2\x17\x7f\x51\x95\x0f\x45\xf9\x50\x1c\xc1\xff\x80\x3c\x94\xb8\x0d\x9c\x44\xab\x5e\x6f\x28\x6d\x7f\xaa\xc1\x14\x3f\xc7\x25\x88\x31\x87\xd0\x7d\x38\x25\x53\xd4\x8d\x31\x5f\xea\x42\x3f\x89\x5a\xe8\xa2\xa7\x2a\x8d\xc6\x19\x0b\x24\x26\xdb\x6f\x4a\xbd\x45\x69\xd6\xb4\xb5\xd0\x7a\x8e\xd7\xa2\x19\x0b\x73\xf4\xe2\x6b\x3d\xd7\xd4\xfa\xf6\xb9\x3d\x9a\xb1\x38\x8e\x81\x5c\x7f\xf4\xae\xad\xea\xc9\xda\xc6\x58\x9e\xc7\xb6\x3a\xb8\xfa\x79\x86\xba\x2d\x1a\x98\x62\x2d\x18\x93\x42\x25\xa3\xaf\xb9\xaf\x3c\x97\xd1\x7d\x13\xcf\x65\x3e\xc4\xb6\xec\x2e\x92\xb4\x67\xc7\xd7\x12\x22\xc2\x91\xb2\x56\xa2\xf6\x30\x0b\x26\x83\x08\x37\xb1\x2d\xfc\xa8\x3c\x4e\x99\xc9\x40\xe4\xb9\x97\x66\xf8\x5f\x50\xed\x3f\xbb\x25\x62\x72\x45\x15\x64\xb1\x1c\x89\xb8\x2d\x48\xa1\xd7\x5d\x46\x29\x66\x37\x09\x8c\x82\x06\x76\x94\x9a\x29\x4d\xa2\xae\x7f\x14\x85\x57\x53\xd7\x4c\xc7\xe4\x94\xa1\xc4\x51\xdd\x5f\xd4\xdb\x47\x37\xaa\x48\x49\x67\x52\x7c\x67\x9a\xd1\x3a\xd7\x12\xfb\x89\xa4\x4c\x1d\x18\xf6\x2f\x66\x8d\x96\x44\x34\x2f\x1a\x5b\x12\x19\x95\x97\xdd\x49\x86\x81\x1a\x88\x02\xdc\x8b\xa6\x1d\x54\xb2\x18\x44\x29\xa2\x76\xcd\xd0\xb3\xa2\x99\xf6\x7f\x19\xe8\xcc\x58\x18\xdb\x03\x09\xe7\x5e\x55\xce\x46\x5f\x6b\x98\x44\x95\x12\x6a\xf0\x3e\x58\x18\xf5\xcb\xb0\x4c\x39\x98\xc1\x46\x01\x5a\x1b\x2c\xab\xb2\x19\xe0\xf1\x79\x90\x6a\x43\x9e\xa1\x5e\xde\xc3\x87\x88\x3c\xc8\x48\xb3\xd3\x1a\xb7\xcd\x04\x2e\x3c\xc8\x32\x14\x01\xa5\xc7\x79\x3c\x87\xd3\xe3\x92\x63\x2d\xb3\x39\x8b\xf7\x92\xe4\xff\xaf\x0d\xbd\xe7\x9f\x3e\x0f\xb3\x1c\xe1\x49\x58\xca\x43\xbe\xf0\xad\x68\xa1\xed\xc1\xbb\x3c\x64\x19\x06\xa9\x07\x5c\x7d\x08\x6b\xd8\x8d\x68\x7b\x38\x0a\x73\x6c\x44\xc1\x0f\x28\xdb\xfb\xa2\x69\xa1\xaf\xb2\xf2\x88\x99\xac\x77\xf0\xb6\x23\xd2\x0d\xd0\x66\xe6\x19\xf2\x48\x83\x0a\x88\xff\x04\xf5\x03\xb4\x50\x2f\xd4\x54\xb3\x42\xa3\xb6\x31\xc7\xfd\x57\xb6\xf7\xa0\x5f\xa0\x1e\x0a\x05\x6a\x1e\x47\x64\xd2\x72\x16\x75\x03\x1e\xd4\xf8\x24\xea\x29\x40\x90\xc7\x71\x90\x0b\xc7\xdf\x85\xcb\x69\x77\xea\xe6\xc5\x2f\x02\x03\x1e\xa7\x09\x29\xd7\x5d\x50\xab\xf9\x7a\x94\xf1\x98\x05\x54\x74\x83\xa6\x4b\xb8\xed\x68\xdc\x41\xdb\x10\x30\x6f\x79\x39\x61\xd7\xe8\x07\x78\x90\x1e\x8f\xad\x03\xc1\x0e\xd0\xb5\x01\x43\xcd\x3b\x98\x65\xa5\x6b\x9e\xc4\x80\x8e\x02\x3d\x5c\xfb\x2f\xc5\x61\x35\x4f\x12\xc0\x15\x62\xf5\xc7\xd3\x6a\xbb\xdf\x1d\x9e\x36\x1b\x4b\x26\xdd\xb9\x9b\x48\x44\x24\xa8\x57\x37\x8a\x20\x79\x1a\x53\x80\xf9\x02\xed\xff\xdb\xff\x8e\x4d\xc1\xf9\xfd\x9a\xa7\x09\x53\x48\xe9\x22\x49\xc2\xe7\xed\xfd\xdc\xea\xce\xd3\xd4\xa0\x7a\xf9\xab\x68\x76\xa2\x6c\x05\x41\xff\xc6\x97\xca\x72\xae\xb5\xd3\xea\x7f\xda\xae\xf6\xb7\xab\x71\xbb\xc1\x9e\x97\x27\x29\xaa\x13\x58\x25\xdd\xa1\x8e\xf3\xf8\x01\xb0\x24\xf7\xfa\x77\xa4\xb3\x6d\xe1\x37\xee\x67\x32\x19\xb9\x46\x38\x59\x17\xe3\x2e\x58\xd5\x7d\xd1\x04\x55\x73\x17\x6d\x5b\x41\xfb\x4a\x2a\xc8\xee\xb3\x3c\x17\x22\xee\x53\xb9\x43\xec\xb6\x4c\x2e\x42\x2a\x77\x6b\xf8\x31\x66\xa0\x70\x11\x52\x44\x8a\xc5\xcf\x8d\x21\xd8\xa1\x3f\x18\xe5\xc8\xca\xd0\xd4\xae\xda\xc2\x4b\x97\x95\x8a\x9f\xfe\x78\x4c\xae\x31\xa2\xfc\xc0\x28\xe2\x5f\xf9\xbf\xdd\x91\x5c\xa4\x99\x57\xff\xa2\x25\xa7\xaa\x6f\x3e\x48\x63\x15\xe6\x71\x49\x5c\x46\x26\xb0\x2a\xe6\x1e\xdc\x36\x68\x48\xfd\xeb\xdf\xff\x18\xdb\xf8\x68\xae\x98\x66\xdd\x54\x45\x74\x55\x01\x7a\x5d\x9a\x0a\x93\x97\x51\x39\x9f\xeb\x30\xc2\xf7\x53\x28\xf2\x40\x7e\x2e\x0b\xff\x23\x74\x94\x83\xf6\x56\x59\xf0\x22\x74\x75\x6b\xad\x0d\xdb\xea\xaf\x51\x5b\x1c\x44\x6c\xb7\xfe\xa6\x7d\xa8\xb4\x7f\xb2\x26\x48\x31\xce\xb2\x72\xae\x38\xb9\x67\x13\x47\x11\xa4\x39\x76\x73\xe1\x54\xb4\x8f\xd5\xa9\x28\x9f\x71\xa9\xd2\xd3\xd3\x00\x70\xc0\xbe\x88\x53\xb7\x0d\xdc\xc0\xb8\x25\x21\xc2\x30\x26\xf7\x3e\x4c\xbf\x6e\x3c\xec\x41\x44\x99\xad\x62\x9f\xab\xb2\xf9\xdc\x87\x64\x3c\x57\x45\x9c\x92\x4d\x03\x4a\xcd\x8f\xb6\x1d\x77\x42\xc6\x30\x83\xee\x82\x91\x6f\xfe\x8f\x2a\x70\xf6\xdd\xcf\x65\x53\x1d\x35\x69\x0a\xb8\xc3\x49\x9c\x62\xaa\xfa\xad\x80\xf7\x1b\x68\x6f\x3e\x26\x96\x26\xdd\x19\xa0\x52\xaf\xbf\xf1\xb5\x9e\x22\x12\xdc\x69\x12\xac\x8e\x25\x4a\x4f\x5d\x46\x93\xed\x93\x5f\x94\x31\xc0\xde\xc6\x7d\xf5\x72\x0b\xe4\x01\xba\x9c\xf6\x6e\x44\x06\x44\xce\x41\xfa\xec\x2f\xf4\xd8\x27\xcb\xf3\x20\xc6\x14\x39\xd3\x88\x89\xbf\xc5\xcf\x9f\x2b\x1f\xe4\x08\x16\x07\x68\x0e\xe0\x85\xc5\x75\x37\x4f\x61\x28\x75\xab\x05\xcb\x21\x76\x56\xf1\x55\x69\x8a\x97\x9b\xaa\x3a\xfe\x77\x08\x3b\x16\x3c\xa5\x61\x3f\x46\x9e\x09\x99\xc7\x88\x21\x91\x47\xa1\xde\x10\xc6\xe3\x0e\x70\xe9\xec\x9c\x9f\xea\xea\x47\xa1\xa1\x7e\x1c\x8a\xe8\x8e\x1e\xad\x14\x39\xb3\x01\xca\xcd\x14\xe2\x20\x74\x6a\xb8\x63\x17\x0f\xe0\xd0\x93\x4e\xe9\xec\x7c\x99\x15\xed\xd0\x42\x67\xe9\x20\xb2\xb8\x21\x99\x2a\x9b\x86\xcf\xc2\x7c\x84\x96\x24\x9c\x52\x17\x2f\xaf\x6d\xca\x26\x77\x08\x32\xc9\xb5\x27\x59\xda\x19\xd7\x3b\xb5\x4d\x26\x95\x49\x82\x88\x39\x96\xc6\x0b\x05\x46\xc3\x82\xa9\x0c\x40\x65\xb6\x87\x7b\x5f\x94\x6f\xa0\x49\xfa\x66\x32\x87\x65\x60\x00\x81\xc4\xf7\xc5\x0f\x68\xfb\x8e\x88\x8c\xe2\x00\xd1\x36\xb7\x5f\x17\x0f\x8b\x6d\xff\x57\x15\x59\xc8\xe3\x43\x55\x8a\x5a\xbd\x7e\x38\xbe\xbe\x3b\x83\x91\x11\xbc\x12\x25\x56\x6b\x66\x9f\x84\x8c\xb8\x95\xfb\xef\x16\x35\x2c\xfa\xcd\x2e\xac\x32\x0e\x12\x16\x39\x3b\x30\x8a\x4b\x9f\x77\xb7\xbf\xae\x70\xcb\x38\x4e\xc8\xb9\x13\xa7\xd8\x97\x5a\x90\xec\xe4\xcc\x5e\x2a\x63\x46\xea\xcc\x67\xb4\x0d\xa3\x52\x5a\xb7\x65\xea\x21\x5c\x4f\xa6\x71\x24\xb9\x6f\x8b\x2e\x5f\xc5\x95\x67\x93\x96\x29\x03\xac\x02\xdc\x3e\xdf\xb8\x86\x87\xcc\x42\x92\x68\xbf\xab\xea\xb7\x5b\x38\xf6\x9a\x70\x9f\x32\x03\xc6\xbf\x3e\x8b\x72\xfc\x7c\xf3\x5a\xbd\x6f\x41\x89\xc6\xce\xab\xc6\x7f\x41\xa4\x5c\x61\x71\x29\x9a\xd7\xcd\x65\x8e\xec\xac\x65\x96\xa7\xb1\x9d\x45\x8f\xe2\xc7\xa8\x32\x2d\x73\x8b\x82\x7f\x84\x53\xf5\xc7\x1f\xc3\xc8\x45\xe6\x19\x47\x36\xf5\x49\x94\x17\x71\xdc\x8f\xe8\x6d\xfb\xea\x7b\xd1\xbe\x8e\x4a\xad\xbf\x5e\x96\x65\xce\x04\xae\x4f\x2f\xc5\x0f\x78\xfc\xa9\xe6\x2b\xa9\x32\x07\xe3\xac\xd6\x1f\x8a\x72\x71\xd1\x05\x15\xd4\x1e\xfc\xe6\x2d\x59\xa0\x9c\x63\x31\x62\x46\xfd\xdf\x99\xd0\xb6\xd8\xf5\x24\x2e\x68\x3f\x38\xaa\x16\x4a\xce\x32\xa5\x06\x99\x6a\x01\x7d\x3c\x21\x39\xe7\x88\x61\x36\x4d\x3b\x60\x47\x3e\x51\x3b\xe9\xf1\x72\xa2\x40\xc0\x9d\x2d\x40\xe3\xce\x74\xb0\x45\x22\x9b\x7d\xe1\x04\xac\xff\xcf\xcc\xb6\xc9\x33\x90\x41\xe4\x84\x51\xed\x2a\x30\x9a\xd8\x4a\x19\xec\x84\x5c\x4a\x0b\x08\x83\x52\x1f\x74\x4f\x9a\x94\x0a\x02\x04\xde\xa2\x1e\xc5\x10\xb8\x21\x95\x31\x99\x76\x32\xc7\x55\x2b\xfc\x40\xd2\x81\x09\xc0\xc1\x18\xdb\xa2\x9a\x86\xe5\x52\x87\x01\x56\x12\x55\x2d\x4c\xbb\x7f\xaf\xae\xdd\x9b\xfa\xfb\xd7\xb1\x41\xbb\x04\xd9\xbf\x33\x9d\xa7\x38\x50\xb1\x6c\x45\xa5\xfc\xc9\x54\x70\x91\x91\xd4\x2a\xc7\x38\xfa\x16\x7e\x80\x1a\x81\x08\xa4\xd6\x29\x66\x44\x3b\x68\xbb\x1c\x76\xce\x9f\x66\x82\x78\x19\xbc\x7d\x6d\xf9\x10\x47\x30\x6d\x9c\x4c\x66\x88\xe1\x0a\x63\xa1\x13\x89\x19\x7f\x84\xf1\xf4\x04\x4d\x20\xa2\x13\x9c\x24\xd4\xf7\x95\xb5\xc4\xd4\x2a\x48\x78\xd6\x97\x58\x5b\x68\x26\x00\x10\xd6\xff\xeb\x3e\x91\x66\x58\x1c\xb5\x18\x0f\x12\x17\xec\x5f\x9f\x0a\x32\x2a\x02\x2e\xeb\x8f\xf3\x8f\xa2\x81\x7a\xc0\x48\x98\xc8\x8b\x69\x15\xe4\xa4\x4b\x7d\xd0\x84\x76\x9f\x9f\x56\x2a\x64\x09\x12\x9a\x5d\x69\xc5\x0f\x09\x15\xa5\x54\x7c\x26\x2c\x22\xce\xb5\x49\x9a\xa7\xa2\x4c\x23\x9c\x47\x57\xb5\x12\xa3\xae\x9b\x8a\x18\xd9\x66\xbf\x00\x95\xd6\xdc\xdf\x63\x6e\x9c\xb4\x4d\x37\x52\x76\x70\xed\xf9\x3d\x2a\x72\xf5\x42\xd7\x33\xe5\x5d\x15\x43\x80\xe8\x54\x1b\x91\x3e\x88\x9f\x23\x92\x96\x4a\x73\xa3\xd1\x70\xaa\xd2\x85\x21\x99\xb5\x99\x2a\xbc\x4a\x55\x8e\x95\x1a\x4a\xa8\xbb\x4d\x11\x23\xee\xc9\x8d\xd8\x93\xb3\x48\x05\x36\x98\xb9\x03\xb0\x6d\x96\x65\x55\xfe\xb0\x3a\x66\xe3\x4b\x67\x91\x8e\x69\xc8\x1f\x8f\x55\x7b\x0b\xad\x28\x8e\x23\x6f\x47\xad\x32\x26\x59\xea\x77\xa5\x83\xf0\x30\x15\x95\x07\xb9\x9b\x95\x0f\xc5\xd1\x41\x7d\x14\x0b\xc9\x0e\x0a\x1b\xb5\xeb\x12\x65\x25\x1b\x7f\x30\x03\x2a\xa8\x4d\x0a\x8e\x0e\x08\xe6\x4e\xe3\x09\x62\xc8\xd1\x30\x21\xed\xc5\xad\xed\x61\x19\x13\x90\xdd\x8b\xaa\x8f\x9f\xab\xcc\x89\x0c\xae\x7a\xf9\x6f\xad\x24\xcb\x2d\x8d\xef\x27\xb9\x44\x78\x1b\x02\xad\xa4\x50\xd8\x9a\x3c\x77\x1f\x88\xf1\xeb\xba\xe0\xdb\xdf\x8e\x4a\x39\x32\xf8\xff\xbc\x94\x65\x31\xa2\x03\x28\x95\xea\x18\x06\xa6\x5d\xd4\xcf\xdb\x77\xa9\x54\x5f\xf0\x51\x3a\xcf\x15\xe1\x21\xfe\x6b\x9f\xee\x60\x8a\x77\xf1\x25\x72\x10\x6f\xab\x17\x58\x0e\x5f\xed\xcc\xd6\xaf\xb4\x4c\x32\xfb\x82\xb7\x45\xf3\xf6\x24\x6a\x71\x82\x16\x9b\x8c\xa3\x81\x00\x51\x82\xd8\x84\xef\x08\x76\xeb\x61\xe1\x97\x6b\x30\xa3\x1b\xaf\x90\x46\x81\xdd\x96\xbb\xb5\xce\xdb\x5d\x69\x65\x02\x02\x07\xe9\xa2\x39\x5f\x5a\x98\xad\xc9\x2a\x93\x90\xf0\x13\x12\xbe\x6f\xa1\xac\x50\xeb\xc4\x6f\x3e\xca\xa4\x39\x4f\xdc\xfa\xee\xc5\x38\x66\x6b\x0a\x3a\x0c\x25\x8b\xdd\x00\xc0\xa0\xe6\x7b\x51\x96\x45\xe9\x63\x08\x1d\xc6\x29\xa3\xa1\xdb\xaa\xd7\x9e\xd8\xd1\x6d\xef\x63\xda\xfe\x75\x43\x59\x87\x71\x96\xc7\x5e\xe4\x62\x0b\x9a\xd2\x99\xc1\x6a\xa6\xc3\x38\x77\x79\xd5\xea\x07\x94\xe8\xe6\xde\xaf\x30\xff\x8a\xd2\xcc\x5f\x4c\xa6\xae\x90\xbc\x83\xff\x5c\xba\xcd\x79\x5c\x6b\x9f\xfc\xb4\x28\xc8\x72\xe8\xe5\x9f\xba\x81\x86\xf7\xbb\xab\x26\x26\xb5\x5a\x47\x49\x8e\x25\x2f\xb4\x71\x5a\x7c\x42\xce\xd1\x11\x18\x52\x12\x6d\x45\x7d\x73\x71\xb3\x40\xc7\x69\x6e\xc3\x49\x37\x49\x26\xbe\xc6\x5a\xc7\x82\x64\xf0\x84\xd6\xb7\x03\x04\xd1\xae\xba\xd4\x0a\xae\x58\x72\x3a\x89\x23\x1d\xf8\xc7\x36\x0d\x2e\x74\x16\x93\x23\x02\x32\x73\xab\xc9\x4f\xc9\x74\x80\x0a\x94\x24\x04\xd0\xdc\x55\x58\x48\x99\xff\x41\x79\x14\x39\x57\x10\x64\xf2\xfb\x77\x9e\xc7\x1c\xeb\xa6\xb4\x7a\x88\xf3\x5d\x55\x0f\x8d\x73\xb5\xce\x65\x88\x6d\xcf\xa2\x2c\x3e\x5f\xb9\xc7\xaf\x83\xe5\xa9\x0b\x21\x6e\x2f\x70\x4d\xf3\xd2\x4c\x92\x48\x8e\x43\x85\x0e\x74\xe5\x7f\x9b\x5c\x4a\xa9\xc4\x56\x28\x2f\x2f\xb6\x3b\x38\xea\x0d\x6a\xa6\x13\x54\x98\x3b\xbd\x9c\x5a\x82\xe5\x59\xa2\x4d\xcf\xe9\xd0\x3c\x30\x52\xba\xea\x2c\xae\x54\xdf\x1f\x6e\x8b\x66\xe0\x02\xac\x35\x8f\xe3\x38\xf2\x06\xf0\x1a\xd5\x09\xfa\xda\xbe\xe6\x79\x8e\xe8\xcf\xee\xf6\x76\xa3\x68\x53\x8b\x2c\x12\x64\x71\xd4\x5e\x2c\xd9\x01\x35\xeb\xe6\x11\xb8\xbe\x58\x8b\x44\x81\x7f\x5c\xa7\x9e\xee\xdf\xf0\x93\xa0\x50\x0b\x9e\x29\x2f\xe9\x8d\xbb\xdb\x6a\xff\xd5\xdf\x8c\x89\x10\xde\xd0\x63\x51\x6d\x82\xed\xd4\xad\xc6\xd7\x92\x09\xb8\x92\xe4\xad\x68\xc5\xb8\x0d\xa3\x65\x4a\xaa\xdd\x94\xd7\xee\x41\x9c\xc6\x26\xe1\x93\xf7\x2e\x19\x50\xb9\xa5\x8b\x1e\x90\xdd\x3e\x1f\x83\x68\x09\xa4\x17\xf5\x22\xa6\x48\x7b\x2d\x8d\xc1\x96\xe3\x72\xfb\xe7\xd3\x7e\x73\xfb\x7c\xb3\x70\x39\x94\x56\x41\x84\x9a\xce\xd8\x57\x5d\x9d\xce\x45\x0d\xc3\x7d\x43\xab\x98\x48\x6b\x2e\xb2\xb9\xab\xea\xfd\x7b\xf5\x27\x08\x3f\x9d\x14\x30\xec\x01\x59\xed\xbf\xaf\x8b\xed\xea\xb0\xb9\x3b\xdc\xaf\xbe\x2c\xee\x5d\xf5\x56\x43\x4a\xc8\x36\x6b\xc8\x54\x90\xde\xfb\xae\x15\x27\xaa\xb3\x84\xee\x56\x21\xcf\xb0\x64\xff\x2a\x9a\x45\xf9\xb1\x68\xdb\xba\x19\x47\x10\x6e\xb8\x03\x8f\xf0\xb9\x88\x1f\x2f\x64\x2c\x57\x94\x84\x07\x73\xc7\x85\x74\x14\xf5\xeb\x88\xe5\xd7\x19\x82\x36\x52\x08\x52\xa3\x42\xca\xe7\xe2\x6e\xff\xfb\x0e\x7e\xf8\x87\x02\x41\x24\x23\x2f\x16\xa1\x8b\x1f\x45\x69\xd1\xf2\x94\xdc\xfa\xd3\x44\xe2\xe4\xe3\x7a\x3d\x82\xd1\xdb\x85\x90\x05\xc2\x71\x12\x1d\x60\xe8\xe6\x03\xad\xfb\x61\x3d\x96\x7a\x82\x50\x73\x6c\x07\x90\x0e\x27\x7e\x21\x06\x2d\xb3\xc5\x43\x88\x52\xc3\x2c\x7e\xe7\x7b\x51\xce\x81\x8d\x21\x52\x31\x66\x59\xb4\x4e\xde\x54\x52\xdc\x74\x81\xc8\xe8\x59\x40\xa4\xf3\x48\xf4\xd4\x94\x9b\xfd\x72\x4a\x05\x9a\x4e\xc9\xd1\x4d\x47\x40\x7e\x0c\x8b\xa8\x17\x98\x79\x12\x75\xdb\x67\x4d\x90\x04\x21\x62\x2a\x17\x2f\x75\x81\x8a\x65\x28\xef\xee\x0f\x4a\xec\x3b\x62\xb5\xf1\xae\x5b\x6a\xbe\x03\xbc\xf9\xa3\xb1\xc1\x2a\xcd\xa9\x28\xdb\xf1\x54\xfc\xc7\x78\x11\x1d\xbf\x60\x48\xc0\xe0\x63\x37\x47\x67\xa1\xa9\x21\xe5\x54\x4d\x78\x12\x93\xf5\x12\x52\x93\x32\x72\x40\xb8\x5f\x2d\x76\xab\xc3\xfa\x71\xbf\xda\x7e\xf3\x40\x61\xc8\x58\x90\x58\x77\x89\x27\xef\x1c\x3e\x3f\x9d\x21\x4f\x00\xb3\xeb\x63\xa1\xa0\x6c\x60\x12\x0d\x41\xae\x09\xc0\x8c\xdc\xa7\x85\x42\x68\x04\x6a\x17\x6d\x2e\xed\xc6\x5c\xa9\x6f\x6b\xc8\x0d\xc7\x8a\x5f\x23\x7e\x4c\xc3\x9d\xc9\x6f\xe6\x31\x60\x9b\xf2\x11\xde\x71\x98\xce\x2f\x23\xc0\x79\x8e\x90\x2c\x0f\xea\xde\x6e\xdc\x62\x01\xdc\x44\x58\xc0\xc4\xb2\xd2\x20\x25\x06\x91\x67\xa8\xea\x25\x2f\x1f\xf7\x55\x6f\x5c\x31\xa3\xe4\xd2\xfb\x61\xc4\x76\xbb\x06\x19\x26\x18\xb9\x9f\x44\x73\x25\x7a\x3d\xe2\xed\x8c\x1f\x95\xcc\x25\x3a\x3d\x3f\x08\xca\x62\x1d\x54\x1d\xa4\x61\x78\xbd\xed\x67\x8c\x8d\xab\x09\x0f\x4a\x87\x38\x4a\xef\x9e\x1d\xd4\x16\x74\x46\x16\xfd\x87\x17\x68\x6f\xea\x42\xdb\x19\x77\xa5\x35\x03\x3a\x33\xe8\x25\xf7\x4f\x68\x2e\xcd\x44\x4d\x51\x83\x16\x01\xe2\x38\x0f\xe4\x8b\x31\xa8\x97\x00\x44\x21\xd2\x2c\x96\x1f\xd2\x96\x7d\x7e\xf3\x47\x08\xcf\xd4\x5d\x48\x1d\xab\xa6\x28\x5f\x06\x69\x05\x80\x85\xc0\xd7\x42\x81\xd3\xd5\x1c\x95\xb9\xc7\x43\x0e\x18\xc7\x28\x72\xf7\x8e\x2a\x1c\x9f\xbc\xf7\x2e\x7d\x0f\xc9\xbf\xc3\x91\x67\x5c\x7b\x66\x32\x1d\x0c\x4f\x06\xde\xa4\x7f\x85\xf4\xfd\xa5\x90\x25\x1b\x2f\x16\x86\x1b\x62\x78\x15\xa7\x73\x17\x07\x5e\xa1\x21\xc0\x88\x00\x59\x50\x77\x55\xa9\x2b\xc7\x20\xfa\x45\x1a\x02\x46\x24\x48\xe0\xef\xf2\x8f\xdb\x68\xdf\x57\x60\xc1\x40\x1e\xd8\x5d\xfa\x7e\xb3\x94\x57\x1d\x07\x13\x84\x19\xaa\x74\x5b\x95\x6c\xaa\x40\xff\xe6\x0e\xa6\x42\x3a\xa6\xed\xf5\xb4\x34\x51\x00\xa4\x59\x4a\xb8\xb6\xdd\x47\x89\x18\x5e\x18\x6e\x51\x26\x8e\x94\x90\x7d\x06\x4a\x10\xec\xef\x50\xf8\xe3\x52\x65\xc4\x66\xff\x51\x34\xfd\xa7\xa4\xc6\x4f\x7d\x81\xf6\xe1\x83\x1a\xd0\xf6\x48\x92\x52\x4e\x7d\x57\x5d\xea\x7b\x10\x66\x79\xac\xbc\x85\xb6\x36\x49\x66\xc3\xde\xe2\x9a\xcd\x39\x43\xea\xcc\x92\xf1\x3f\xee\x2a\x3a\x93\xc9\x20\xca\x1c\xc8\xdf\xbb\xf8\xdb\xa4\x79\x82\xa8\x71\x07\x78\x1c\x6f\xe0\xb9\x3d\x2b\xeb\x02\x25\x07\x9b\xe8\x3d\x80\xd1\x0b\x2b\x9c\x3c\xce\x3c\x49\x64\xe4\x0c\x0f\x2e\xa5\x86\xda\xd9\xce\x8d\xcf\xe3\x01\xa0\xbb\xcb\xb6\x3a\x42\x13\xdd\x17\xb2\x16\xf5\xc7\xa2\xd4\x28\x7b\xef\xfe\xdf\xb1\x7a\xe4\x78\xb2\x18\x1e\x2b\x44\x6d\x61\x5b\x6e\x98\x84\x18\x6e\xc1\xf9\xfe\x4e\xff\x8e\x9a\x6b\x3f\xdd\x0d\x97\xb9\xcb\xa7\x88\x89\xa5\x26\x35\x6e\x23\x03\x11\x11\x66\xfd\xdb\x7e\xc4\x88\x37\x32\x92\xd4\x09\xc4\x8e\x50\xef\x0f\xe2\x0e\xa7\x64\x11\xd9\x00\x51\x07\xa7\x3b\xbd\x91\x2a\x89\x73\xaf\xd7\xd3\x77\x08\x67\x57\x43\x23\x15\xc3\xf7\xf7\xb0\x7e\x5c\x3f\x2c\xee\x0f\x4f\xcf\xdb\xe5\xd7\xc5\x6e\xe5\xbf\x0e\xa2\x88\x10\x7c\x8b\xd2\x01\x69\xa6\xdf\xa8\xa2\x40\xd8\x0a\x55\x97\x92\x7a\x75\xea\xf1\x8c\x37\x3a\xe2\x18\x0c\xdf\x6c\x9e\xf7\xbb\xa7\xed\xe6\x40\xc6\xdc\xee\x9b\x74\x1e\x81\x83\xf9\x74\x91\xf2\x4a\xd4\x94\x5c\xcf\xdf\xb8\xce\x13\x74\x87\xda\x6d\x1e\xd7\xcb\xd1\xeb\x99\xfb\x6a\x99\x6b\xf2\x0a\xa1\x96\xdf\xe2\x8a\xbb\x30\xbb\x9c\x1a\x88\x08\xe5\x4d\xcb\xdf\xb7\xe2\x8a\x5b\x3b\xbf\xc7\x18\x13\x12\x75\xec\x2c\x2e\x0d\x0c\xe4\xf4\xe7\xc7\xa1\x49\x59\xda\x1b\x24\x59\x87\x56\x1f\x2d\x5c\xd5\x0a\x20\x08\x74\x82\xb0\x12\x2f\x74\x82\x56\x91\x73\x0b\xf4\xf0\xb6\x20\x08\xf3\x08\x4b\xb3\xf4\x45\xeb\xe5\x66\xe0\xf2\x06\x41\x08\x21\x58\xf7\x8f\xb1\x24\x35\x04\x51\x18\x23\xae\x95\x48\x5d\x1b\xb3\xb5\x36\xcf\x4b\x24\x4a\x0d\x7f\x0d\x04\x49\x9a\x1b\x6b\xa1\x47\x81\xe8\xb4\x11\x38\x39\x5d\x30\xec\xf5\x16\xcd\xed\xe2\x7c\xde\x82\xd0\x1f\xee\x86\x12\x15\x62\x1a\xfc\x5a\xbc\xbc\x0e\x85\x6e\x16\x68\x28\x3c\xbe\x4c\x1a\x65\x49\xdf\x0b\x46\x0a\x93\x82\x73\x5b\xa1\x9f\x23\xd9\xc8\xb8\x33\xe3\x8c\x44\x9c\x09\x9c\x37\xa8\x90\xf9\x33\x98\xc6\xd2\x1b\x05\xdf\xf7\xab\x3f\x86\xc2\x72\x93\xef\xcd\xc2\x1c\x1f\x1a\x61\xf7\x9f\xcb\xb6\x38\xba\xcb\xe4\x51\x88\x55\x31\x45\x10\x75\x5b\x4e\x6c\xfc\x61\x1d\x49\xb2\x88\xa9\x7e\x7e\x5c\xc9\x22\x4d\xc7\x59\xdf\xf9\x85\x80\x33\x52\x9b\xa5\xdf\xda\xce\x2c\x4d\x33\xb5\x30\x08\x44\xc8\x1d\x7e\xdd\x52\x10\xbc\x44\xc8\xd5\xf2\x0a\x81\x4c\x25\x82\x87\x54\x37\x4d\x7a\x9b\x22\x54\xc6\xe8\x7b\x8c\xee\x64\xc9\x55\x62\x6d\xcd\x9a\x1e\xf4\x09\x81\xd4\x29\x6a\xfd\x4a\x51\x2a\xf4\xcb\xfd\x01\x75\x0b\xf5\xa8\xd1\x09\x81\x04\x63\x45\xbd\x4f\xa2\x18\x51\x1e\x20\xd0\x29\x51\x17\x84\x76\xf6\x46\xfb\xea\xe6\x28\xd4\xdb\xd0\x34\x69\xf2\x4b\xb5\x21\x87\x06\x52\x4e\x77\x36\x90\xe3\x73\x20\xe4\x88\x6b\xe9\xe2\xa4\x52\xef\xae\x0a\x23\x10\x18\x16\x60\x83\xf6\x41\x88\xff\x76\xa9\x90\xfb\x33\x8f\xa4\xcd\x5a\x5f\x89\x0f\xd8\x97\x20\xc6\x1b\xe9\x67\xeb\x03\x04\xc6\x30\xdd\xfd\xa8\xe5\x6e\xd7\xce\x79\x81\x0f\xef\x23\x0c\x18\x19\x61\xbf\x9f\xac\xb7\x71\x18\x51\x57\x26\x8c\x98\x3b\x85\x87\x28\x2d\xe1\x58\xd1\xb7\x15\x34\x58\x22\x5c\xfd\xec\x9e\xd2\xe8\x65\x85\x81\x32\x8c\x8d\x7a\x62\x73\xa2\x29\x10\x86\x26\xc2\xa2\xcf\x8f\x41\xef\xd9\x2d\x41\x61\x14\x90\x91\xdd\xa1\x11\x06\xdc\xe8\xed\x86\xf8\x75\x1c\x6e\x3f\x11\x73\xeb\xd7\xa4\x2a\xdc\xf7\x5d\xfd\xa8\xaf\x36\x59\xa8\x12\x84\xb1\x34\x32\xf7\x63\xef\xbe\x12\xa5\x07\x1b\xbb\xf8\x83\xf7\xab\x62\x4e\xff\x19\x47\xff\x4a\xfe\x3d\xf9\xce\x24\x01\xec\x36\x37\xe7\x42\xc1\xf3\x79\xf4\x7e\xc3\x24\xd3\xf1\x50\x73\xe8\xbb\x97\x7d\x83\x2e\x4b\x41\x11\x90\xfd\x7a\xb5\x8d\x57\x8f\xb7\xfd\xdf\x55\x48\x1e\x7a\xa7\xb3\x9f\x3d\x45\xa5\x37\xc6\x9f\x21\x12\x54\xfa\x23\x4e\xd8\x00\xf8\x02\x61\xa2\xa9\x83\xf0\x54\xd0\xaa\x73\xe3\x5b\x01\x10\x26\x00\x88\x14\xba\xe9\x92\xce\xaf\x8b\xed\xed\x61\xb9\x78\x42\x47\xcf\xed\xe6\x79\xf0\xfd\x26\x0c\xc8\x12\xb7\x21\xbc\xc8\xf8\xf7\xa6\x59\x92\x0b\x67\x14\x24\x48\x25\xc0\x8d\x91\x94\x49\xc4\x09\x58\xa1\x1c\x67\xd6\x7b\x65\x6f\x6a\x4f\xcf\x02\xb0\xf8\x79\x51\xab\xd7\x45\xa9\x6f\x8a\xf9\x62\x2f\x84\x59\xc8\xb1\xf6\x71\xe8\x16\x41\xbb\xcc\xfd\x9a\x91\xef\x3f\x28\x71\xe3\x5b\x94\x2f\x70\x9c\x68\xfe\x42\x98\xa5\x0c\xab\x3e\xb4\x5b\xad\x7e\x9e\x91\xe7\x63\xa3\x99\x31\xaa\x64\x74\xd5\xdc\x90\x87\xc0\xd7\xea\xff\xe3\xec\xdd\xba\x1b\xc5\xb5\xb6\xd1\xff\xf2\x5d\xd5\x45\x5f\x08\x01\x02\xf6\x9d\x4f\x49\xf9\xed\x38\xce\x1b\xbb\xaa\xba\xd7\x1a\x7b\x78\xe8\x30\xe5\xd0\xc1\xe0\x06\x9c\x94\xfb\xd7\xef\xc1\x94\xc4\xc9\x24\xd5\xfb\x5b\x37\xd5\x2b\x92\x31\x06\x69\x6a\x1e\x9e\xf9\x3c\x55\xdd\x6b\xf8\x06\x2f\x06\x41\x84\xe3\x19\xf3\x96\xc0\x55\xd6\x92\x87\x83\x97\x04\x1e\x9e\x0b\x75\x73\x1f\xd8\x3e\xb2\x83\xfa\xb1\xa8\x11\x88\xd5\x3c\xec\xc7\xa2\xee\x55\x80\xc1\xe3\x11\x41\xa8\x9d\x89\x60\x9e\x4a\xd8\xdf\xaf\x86\x9a\x00\xe0\x71\xae\xb1\xc8\xf2\x3d\xcd\x87\x34\xfa\xe0\x71\x2d\x10\x28\x7f\x18\x90\xdd\x7e\x7e\x82\x7b\x82\xc4\x98\xe9\x71\x29\x3a\x27\x4e\xd9\x2e\x5c\xa1\x22\x2c\x41\x38\xf6\x5b\xa7\x27\x0d\xd0\x33\xcb\x9e\xf4\x42\x3f\x76\x60\x87\x52\xcd\xaf\xb7\x29\x23\xf0\x64\xe2\x63\x66\x8c\x0b\x9e\xab\xa1\x0c\x04\x78\x52\x53\xa3\x7a\x8b\x3f\xbe\x6d\x13\xe9\x49\x42\x81\xa7\x18\x18\x34\x36\x54\xf5\x0c\xcd\xac\x81\xfe\xb9\x71\x50\x5e\x6c\x33\xc6\x0f\xbc\xaa\x37\x69\x06\x55\x5d\xe4\xa6\x28\x50\xcd\xea\x6e\x9e\x31\x44\x73\x40\x9d\xa6\xbf\x2f\x69\x59\x42\xb6\xbc\xbc\xb6\xef\x4e\x87\x0c\x3b\x6e\x5f\x8a\x4c\x35\x01\x34\xff\x39\xec\x5a\x05\x4f\x6b\xa9\x92\x4e\xe3\xbd\x53\x17\xef\xa2\x74\xa0\xc4\x37\x15\x9e\x42\x63\x32\x1d\x1b\xe5\x76\xe9\x31\x6f\x2d\xc7\xf0\x9c\xa1\x24\x10\x78\x36\x29\x30\x78\xef\x2f\x37\xc3\xe8\x5b\x9b\x6c\xe9\xc3\x76\xf1\xfb\xfa\xf1\xbe\xd9\xd3\xeb\xad\xdb\xd0\x94\x68\x85\x9e\xd5\xdf\x17\x28\xaf\x4e\x46\xb3\xff\xca\xa9\xc7\x4d\xe7\x57\x05\xb9\xb2\x70\xba\x1e\x08\x75\x5f\xec\x97\x2b\x77\x31\x4f\x0b\x6c\x2b\xb9\x2f\x32\xe8\x97\x04\x81\x52\x02\xd2\x69\x7f\xce\x94\x53\xa3\xbf\xe3\x69\x56\xcd\x44\xf1\x06\xdb\x37\x28\x75\xe6\x5a\x4a\x81\xd2\xc4\xc7\x78\x78\xb5\x9e\x4f\x2a\x88\x0d\x56\x25\xf5\x09\xf1\x49\xdb\xc2\x88\x0d\x68\x4d\x14\xab\x0c\x97\xe2\xf0\xa1\xf8\x7e\x80\x3d\xdd\x48\xa1\x6a\xdb\xf6\x7b\x5d\x24\xe3\x2b\x43\x6c\xfa\x9c\xd7\xff\xfb\x6d\xbd\xc4\xfe\x68\x8b\x15\x46\xdb\xd8\xe6\xed\x81\xfa\xda\x94\x44\x72\x78\x6f\x0e\x8c\x49\x4e\xd3\xff\xbf\xf8\x11\xa0\x81\xa7\x30\x9b\xfe\x50\x1c\x77\x50\x4f\xec\x12\x1a\xc4\x71\xe0\xb7\x50\xb3\x6d\x0e\xa3\xf1\x30\x14\xc2\x7a\x5d\xcd\x51\xf9\x0a\xc3\x48\x10\x28\x63\x1c\xad\x67\x5d\x9c\xdc\x6f\x61\x91\xc0\x44\x12\x48\x55\x71\x0b\x3f\x1d\x94\x3d\x3e\x01\xd3\x01\x8d\xa2\x08\xed\xd2\x3c\x3d\xca\x17\x5e\xef\xa7\x1c\x8c\x9b\x18\x09\x68\xc4\x69\xe7\x1e\x1e\x8b\xdb\xaa\x3f\xd0\x38\xa1\xb8\x58\x9f\xa1\x6a\x1c\x6a\xc3\xc7\x60\xc7\x78\xa2\x59\x5b\x62\x5f\xd5\x2f\x5d\x63\xa6\x9d\x20\x19\x57\x61\x4f\xeb\xe8\x0e\xa0\x47\x13\x0a\x54\x82\xaf\x2d\xfe\xe1\xc1\x1d\x49\x76\x48\x79\x91\x6f\xe9\xc4\x77\x90\xe9\xad\xd6\xed\x88\xaf\x91\x8d\xcf\x20\x45\x7f\xff\xbe\xdf\x17\x7d\x1b\x4d\x95\x56\x48\x7f\x6f\x5c\xe5\xbb\xa2\xa8\x45\x63\xa2\xca\xc6\xc4\xfc\xab\x02\x01\x50\x2d\xe3\xc8\x92\x7a\xce\xca\x3a\x95\x19\x7c\xbd\xad\x87\x77\x73\x51\x1e\xde\xf2\x50\x2d\xc6\xb1\x4f\x3b\x0d\x9c\xf9\x75\xc6\x68\x9d\xeb\x62\xda\x71\xf2\x49\x92\x20\xd4\x11\x75\x7b\xe7\x85\xc3\x89\x83\xef\x45\x81\xe4\x9d\xbc\x72\x2b\xa7\x3f\xed\x15\xfb\x34\x31\xcc\x67\xe2\xfa\x0f\xcf\xeb\x34\x37\xb2\xef\x56\x2f\x7a\xe8\x23\xfa\x41\xc4\x51\xc3\x4c\xbb\x9e\x21\xcf\xdd\x4d\x90\xc4\xe8\xa8\x2c\x9d\x0e\xee\x5a\x41\x5e\xa7\xf5\x30\x91\x0e\x7e\xc8\xc0\xb7\x49\x81\xc6\x15\xa1\x5f\xa6\x12\x4d\xbf\x0d\x2e\x1d\x79\x01\x02\xa3\xd0\x16\x4e\xd8\x0e\x3f\xf2\x05\xba\xb9\x2f\x50\x16\x5b\xbd\x7f\x81\x27\xc7\xc2\x0c\x7e\xc4\x0c\xf0\x5d\x5c\xae\x07\x6c\xa8\xb1\x7f\x8f\x89\x61\xf5\x3b\x15\x45\x8e\x84\xa6\xed\x80\x0f\x32\x42\x4e\x45\x78\x67\x71\xfb\xd7\x04\x5c\x9d\xd7\x45\x7d\x4d\x70\xe8\x86\x93\x80\xa1\x13\xdb\x66\xcc\x17\x45\x35\x9d\x5a\x01\x3f\x49\x42\xca\x3b\x5f\x6d\x07\xf2\x52\x42\x87\x0e\x6f\x26\xb4\x60\x95\x6f\x65\x36\xab\x5d\xbf\xe3\xa7\x2e\x80\xcf\x23\x82\x58\xd9\x05\x3a\xc7\xc5\x07\x31\x90\x2f\x48\x60\xaa\x0b\x18\xc4\x3e\x19\xfc\x83\x2c\xb9\xe9\x43\xa1\xb3\xdb\xce\x04\xf0\x05\x30\x3c\x68\x9d\x77\x61\x8e\x73\xe7\x96\xfb\x52\xfa\xbc\x23\x40\xdd\x17\x19\x94\x83\x1c\xca\x14\x37\x68\xf3\x29\xed\x18\x69\x2e\x99\x7a\xc6\x8d\x6a\xb9\xaf\x46\x8b\x0e\xdb\x17\x5a\xfc\xd7\xb1\xaf\x0c\x05\xbe\x04\x6d\xb5\x5d\x8a\xf3\x9e\xbf\xf6\x2b\x97\xe0\xab\x84\x62\xce\xeb\x94\xe6\xf5\x86\x97\xc7\x36\x88\x1c\x9d\x02\x2e\x56\xe8\x89\x76\x1b\xb5\x6e\xe4\xcd\xea\xe9\x0c\xda\xeb\x42\x6c\x1a\x51\x7e\x2f\xca\xd7\xc1\x17\xea\x98\xa1\x4a\x91\x8d\xed\x47\xcf\x51\x6b\x8d\x1c\x27\xdb\xc7\x3d\x46\x16\x7d\x28\x10\x04\x5e\x48\x50\x78\xe5\x64\x04\xe3\x4d\x8b\xc7\x3a\xbf\x2b\x8b\xd3\x2e\x15\x59\xb7\x76\x03\x2f\x89\x0d\xd3\xcb\x19\xf2\xdf\xff\x5c\xb4\x7f\x56\x11\x62\xd8\x1f\xe1\x7d\x9d\xd7\x8d\xe7\x2c\x5f\x36\xa0\xd2\xa1\x4e\x32\x04\x34\x0c\xb0\x09\xa6\xb6\x12\x3f\x96\x58\xdd\x5d\x86\x26\x81\x29\x22\x23\xdb\x42\x0d\x18\xcc\xce\xaf\x1b\x68\xce\xe4\x89\x72\xca\x87\x9c\x87\x10\x50\x21\x1c\x37\xad\x21\x31\x5a\xc2\x5b\xb3\x81\xfb\xcd\x09\x10\x50\xcd\x31\xf0\xdc\x43\x26\x1b\x67\x74\x78\xb7\x7e\xa8\xb1\x97\x78\x07\x75\x8f\x32\x77\x76\x2c\xa7\xc4\x6c\x87\x06\x35\xf0\x05\x91\xd6\xcc\xab\xb4\x2e\xca\x69\x21\x64\x08\x7c\x49\x1c\x46\xa1\xf1\xed\xf2\x1e\x0d\x41\x37\x03\xd7\xe0\xa2\xe4\x28\x1c\xd9\x6f\x68\xb2\x53\x82\x30\x42\xcb\x76\x0f\xf9\xe2\x25\x3d\xcf\xaf\x86\xad\xf2\x07\xf2\xa6\x7c\x19\x82\x15\x46\x61\x73\x10\x72\x8a\x34\x49\x8b\xf2\x7a\xae\x8b\x65\xef\x6d\x84\x3a\x41\xb4\xee\xa6\x28\x66\xea\x6d\xf2\xd0\x1e\x3c\x72\x16\x27\xc8\x39\xe6\xa2\x87\x05\xb7\xdb\x29\xfc\x54\x46\x0c\x02\x66\x11\x80\x69\xf5\xc4\xaf\xe8\x01\xdb\x81\xc8\xe3\xa8\xe6\xf3\x5a\x9c\xce\x69\x0d\xf2\xa5\xbf\xe2\x83\x48\x80\x6e\x91\xb0\xc5\xa5\x89\x1b\x06\x14\x89\x10\x44\xc0\x88\x6b\x0b\x98\x65\xa9\x84\xf9\x98\xb2\x65\x24\xb7\x03\x41\xec\x1b\xac\x68\x85\xd2\x90\xeb\x2f\xed\x9f\x01\x17\x0a\xa6\x6b\x9b\x68\x72\x7b\x86\x1c\x73\x7a\x50\x8d\xf6\x5a\x10\xf3\x30\xb0\x46\xf4\x2b\x94\x85\x31\xf1\x93\x26\x31\x48\x22\x53\x03\xef\xa0\x1d\xb3\x2c\x4b\xf3\x74\x90\x70\x0a\x38\xd3\xa4\x05\x38\x2d\x78\xfe\x86\x42\xdf\x28\x5b\x5f\xb8\x1c\xe0\x65\xc0\xa1\x3b\xfa\x1a\x9e\x18\xc8\xda\x09\x21\x84\x78\xdb\x2d\xbb\x1d\x04\x1c\x0c\x04\x0a\x81\x02\xef\xbc\x54\x43\x5a\xb6\xd1\x03\x92\x01\xc7\x2c\xf7\xbe\xbc\xc0\x5d\x96\x9e\x6f\xdb\x32\x21\x90\x3a\x90\x26\x43\x86\x84\x3e\x3d\xb8\x3d\x04\x8a\x78\x78\x2a\xbe\xf1\x2c\xc5\x22\xee\xf0\xf2\x8a\x31\xcc\x8f\x20\xa4\xed\x96\xac\xa0\x99\xa0\x15\x52\x9c\xf1\x32\x6d\x0c\x99\x91\xf0\x74\x83\xc2\xf4\x93\x0e\x64\x81\x6d\x91\xb2\xb5\x76\x4a\x19\x4d\x20\x87\x06\x39\xc1\xf3\xe2\xf3\xb4\x40\x00\x01\x45\x55\x4c\x53\x85\xdb\xf0\x9c\x8f\x6b\x0e\x10\x40\xc8\xd1\x32\xeb\x34\x57\x9d\x14\xa7\x1b\x8c\x03\x13\x99\x3b\x8e\x88\xc5\xd7\xf5\xa2\x55\xa0\x6b\xc6\x0d\xbb\xbc\xf1\x0a\x1f\xe1\x67\xfd\x54\xc2\x29\xbd\x9c\x5a\x15\x9f\x78\x7c\x4b\x82\xf5\x52\xf4\x7f\x2c\x9f\x9f\x6f\x1f\x26\xe8\x30\x6a\x79\xee\x2b\x9b\x58\x01\x75\x57\x94\xb3\x1b\x88\xf6\xff\xed\xbf\xed\x57\x01\x3a\xdb\x69\x8e\x85\xe6\xcb\x10\x76\x3b\x34\x8e\x21\x89\x02\x84\x0d\x3a\x01\x8b\x7b\x5e\xf5\xf3\xfe\x21\xd1\x91\x6b\x44\x99\xbd\xf1\x34\x6b\x6c\x82\x0d\x10\x6f\x9d\x91\xf6\x33\x09\x65\x6d\x6f\xc1\x43\x27\x87\x01\xa1\x47\x14\xda\x97\x1c\xa0\x95\x55\xe9\xaf\xc9\xd0\xf3\x05\x96\x3a\x9d\x97\x81\x36\x68\x78\x79\x4a\x03\x8a\xf5\xb3\xa2\x96\x2f\x69\xcf\x35\x6e\xc7\x35\xed\x0a\x19\x56\x6e\x6f\xf0\x36\x42\x2a\x83\x5e\x73\x98\xf5\x56\x27\x9a\xb8\xda\xe9\x1a\x43\x1b\xc8\x65\xa1\xd2\xfc\x78\xd0\x45\x79\xe2\xed\x8f\xf2\x01\xf0\x19\xbd\x15\x35\x3c\x62\x97\xeb\xfc\x3a\x53\xa7\xf4\x17\xf9\x9a\x30\x88\x62\x1e\xb4\xe5\x81\x05\x3f\x37\xbb\x68\xd4\x11\x00\x61\x90\x04\xa2\xe7\x11\x8c\x46\x43\xc6\xa4\xc9\xc4\x57\xd3\xe8\x44\x08\xc3\xc8\xb4\x14\x0c\x68\x67\xaa\xf1\x75\x22\x02\xa6\x94\x37\x04\xa1\xd9\x61\xe6\x13\x24\xee\x9f\xf3\x0a\x46\x69\xac\x90\x85\x09\x86\xe1\xd6\x99\x34\x98\x1e\x3a\xbe\x80\x0c\xc2\x3e\x30\xde\x10\xdb\x4e\xda\xc8\x90\x69\x1f\xd3\xc7\xa7\x22\x87\xeb\x47\xaa\xc6\x10\x46\x91\xa1\x7c\x76\x72\x77\x83\x03\x27\x8c\x62\xa9\x0c\x09\x44\x63\x21\x4e\x56\x03\xad\xc7\xc3\xe4\x6e\x3f\x52\xb1\x0b\x3d\x8d\xf6\xa7\xe3\x39\x1d\xfd\x82\xc4\x23\x86\x47\xdd\xb4\x83\xb8\x8f\x27\x34\x8c\xad\x14\x1a\x52\x69\xf4\x40\xb1\xa3\xfb\x4d\x58\x8c\x0c\xb5\x88\x1f\xaf\xbf\x7c\x82\x4b\x82\x30\x89\x3c\x4c\x31\xe7\xcd\x42\xcb\x96\x70\xba\x94\x25\x3f\x4e\x69\xab\x40\xc8\x43\x85\x48\x39\xb3\x98\xbf\xe5\xe9\x4d\x2f\x3a\x84\x9c\xf9\x68\x8d\xdd\x1a\x18\xd0\x17\x8c\xbe\x9b\x4b\x1f\x97\xf3\x5d\x5a\x9e\x78\x07\x72\x87\x50\x92\xc8\x57\xad\xea\x63\x3d\xd1\x2e\x07\xa1\xa4\x12\x7b\x13\xcf\x50\x36\x9b\xe4\xa3\x46\x67\x08\x65\xa0\xb1\xca\xa1\xad\xf2\xf7\x6e\x42\x70\xcc\x4d\x0d\x29\x31\x3d\x31\x8d\x5f\x74\xac\x46\x2f\x50\xc5\xc4\xc8\x22\xd6\xc0\xb3\x05\x2f\x51\x17\x77\xc4\x8c\x01\x21\x78\x26\x3e\xe9\x94\x9e\xcb\x42\xa7\xe3\x75\xde\xb8\xd5\x16\x2c\x68\x81\xbf\x87\x33\x94\x07\xe8\xaf\x56\x37\x95\x19\x59\xa6\xfa\x58\xee\xa0\xbe\x4b\xf3\xb4\x6a\xf9\xd2\x21\x74\xa7\x8c\xe3\x82\xe8\x65\x12\x43\x48\x34\xae\xef\xc5\xf6\xf9\x79\xb5\xe8\x68\xfd\x20\xd4\x89\xd9\x25\xf9\x10\xaa\x0c\xa1\xe6\x1e\x98\x0c\xa5\x2c\x72\xd5\x57\x70\x1b\x54\x11\x42\xad\x22\x5c\xa4\x58\x12\x19\x6d\x54\x46\x18\x20\xca\xd6\x91\xa3\xf5\x93\x21\x8c\xe8\x08\x95\x0d\xcc\x2a\xda\xf0\xb2\x4c\x9b\x28\xab\x2f\xaf\x3e\x38\x49\xfa\xa1\x10\xa3\xd4\xf4\xe4\xf2\xdc\xb0\x24\x59\x41\x8e\xfe\x86\x64\xd4\x37\x28\x9a\x23\x18\x90\x70\x9f\x0c\x01\x18\x8d\x04\xa6\x60\x4f\x69\x0e\x86\xa5\x0c\xf9\xbd\xdc\x68\xc2\xb1\x66\x77\xb0\x6a\x91\xfb\xe2\x82\xfe\x79\x5e\xcf\x8b\xa2\xfe\xb0\x0f\xcc\x7e\xda\x27\x8c\xb9\xfc\xe6\x81\x1d\x04\xaf\x52\xd9\x36\xd8\xba\xaa\x3f\xee\x88\x6a\x7e\xf5\x08\x21\xee\x6b\xfd\x80\x6a\xc7\x35\x28\xd2\x81\xb2\x3e\x30\x5f\x4a\x4c\xa6\x9f\x8b\xaa\xde\xf3\xea\xf5\x73\x00\x88\xfd\x50\x90\x08\xdf\x66\x9a\x1d\x99\xc3\xad\xb3\xc0\xc2\xd0\x50\x5b\x1e\x4c\x8d\xeb\x46\x3e\x10\x18\x0b\x15\xee\x9e\xed\xdd\xdd\xce\x91\x71\x03\x8b\x84\xc2\x5e\x7d\x4c\x06\x15\xe7\x2f\x43\x04\xe4\xf0\x0a\x31\x83\x00\x99\x9f\x65\xf1\x19\x7e\x65\xf0\x0a\x63\x66\x3c\x8b\x7f\xc3\x88\xdc\x27\x9b\x1e\x5e\x25\xf1\x0c\x60\xf7\xb5\x6b\x5f\x00\x96\xf8\x3e\x5a\x61\x0d\xb5\x7c\x79\xe2\xa9\xc2\x80\xd3\x48\xa4\x5c\xbb\x55\x9a\x84\x0a\x75\x3d\x0e\x5c\x29\x24\x22\x9e\x34\x9f\x2c\x49\x8c\x04\x8c\x2d\xe3\x7f\x47\x40\xd5\xd4\xb9\xc7\x12\xa9\x90\x57\x75\xb3\x7e\x3c\xcc\xd7\x2e\xf3\xce\x78\x22\xf0\xf4\x38\x97\x45\xa1\xf7\xd7\x33\x1c\x0c\x83\x87\x1b\x17\x7e\x80\xf4\x9e\xed\x71\xf6\x53\x62\xf1\xf9\xc6\x01\x67\x92\x08\xb4\xe4\x07\x97\x34\x32\xbd\x16\x5d\x57\xe7\xf0\xce\x25\x35\x5d\x22\x07\x38\xa5\xb5\x91\x6e\x9d\x52\x9b\x07\x26\x13\x8e\x13\x8d\x25\xd8\xa4\x79\x7a\xe2\xd9\x0f\x48\x47\xd7\x53\x7e\x88\xcd\x9a\xd6\x7b\xf8\x98\x69\x12\x98\x0a\x3c\x65\x71\x49\x03\xd5\x06\x60\xc0\x41\x87\x1d\x3b\x67\x63\x82\x3a\x5e\x9b\x66\x58\x23\xd9\xeb\x9f\xdb\x6f\x87\xf9\x6a\x7f\xd8\xac\x1f\x57\x87\xe5\x76\xf1\x6d\xb3\x7a\xdc\x1f\x76\x5f\x67\xa1\x47\xdb\xb9\x5a\x20\x6e\xcf\x9c\x64\xe8\x1b\x7e\xa8\x37\x69\x3f\xa2\x3d\x03\x68\xf9\xb1\x5a\xfd\xbe\x3b\x50\xe6\x2e\xa5\x63\xc3\x28\x83\xb5\xec\x87\xe2\xd8\xf3\xb7\xfa\xeb\x2d\x22\x89\xb4\x6d\x3e\xc6\x4f\xc0\x2e\xae\x5b\xac\x1e\x44\x44\x73\xf4\x81\xec\x41\x9a\xd5\xe9\x09\x33\x1f\xa8\x9f\x3b\x8d\x5a\xfc\xd4\xf0\x44\x9e\x88\x91\x99\x67\x9f\xf2\xfc\xef\x54\x70\xb3\xd3\x10\x83\xf6\x59\xf8\x1e\x79\xd2\x04\xdb\x7f\x5d\xca\x6b\x8b\xbd\xb4\x63\x94\x9b\x24\xe3\x7a\xb1\x3d\x3c\xad\x9e\x17\xab\xc7\xfd\xec\x7e\x75\x70\x79\xb8\xc8\xe7\xcc\x89\x9d\xb6\xb8\x0c\x14\x8a\xe0\xb7\x87\x70\xe4\x8b\xc0\xb3\x79\xd8\xf9\xe5\xea\x78\xa9\xfe\xee\x4b\xab\x7f\x6a\xcf\xa2\x80\x52\xf4\xb5\x77\x8b\xd9\xf3\x6c\xde\x87\xdf\x42\x14\x04\x02\xf1\xb0\x3b\xc8\x32\xd3\xb4\xf8\x11\x7e\xe5\xf3\xa7\x18\x30\x42\x83\x4e\xda\xbc\xbd\x3c\xa3\xf6\x48\x44\xce\xbd\xe6\x5b\x26\xa1\xfd\x6e\x7a\x62\x54\xe4\x14\x4a\x3a\xba\x8b\x44\x81\x29\x4e\x95\x3c\xad\xb0\x08\xda\x1c\x3b\x23\x68\xec\x38\x69\x19\x45\x52\x63\x62\xe2\x99\x6b\x9d\x81\xec\x4a\xa7\x51\x4c\x81\xa0\x53\x93\x15\x45\xf9\x50\x1c\x0d\xce\x74\xf8\xe9\x38\xa0\xd8\xa2\x5b\xc9\x92\x9f\x7b\x0d\xc7\x38\xa2\x0d\xb3\x85\x01\x50\x19\xfb\xd0\x0e\x1a\xd0\x41\x13\xd3\x3a\x45\x97\x75\xbe\xe1\x3f\x57\x3f\xcf\xa6\x54\x32\xfa\x1a\x61\xe8\xcf\x67\xd6\x01\x51\xb8\x4d\x7a\x6e\x48\x94\x78\x11\x62\x9d\xef\x57\xdb\x4e\x5d\x01\xa2\x24\x30\xe6\x19\x5b\x74\xab\x56\xdc\xd9\x8d\x26\x82\xf4\x74\xae\x6a\xfe\x6a\x74\x64\x27\xd3\xbb\x51\xc2\x15\x5a\x9f\x63\xfa\x36\x19\x38\xba\x69\xca\x43\x46\x06\x04\xfa\x56\x97\x93\xe2\x35\x9f\xa4\x54\xb1\xe8\x53\x88\x38\x61\x98\x89\x3b\x38\x50\xcb\xfe\x08\x3b\xa8\x1f\xd2\xb7\xf6\x4e\x39\x15\x08\x01\xb5\x94\x96\xe3\x73\x6a\x78\x07\x9c\x11\xc4\xd2\x9a\x22\xe5\x94\xd0\x32\x44\x3c\x09\x30\x35\xbb\xc3\xf4\xd5\xb5\x06\x9f\xf6\xd0\x3d\x2e\xa2\x8e\x38\x8f\x50\xd4\xe7\xe9\x8f\xcd\xe2\x5f\x96\xd7\x22\x2e\x98\xd3\x55\x3b\x94\x56\x73\xb4\xff\xaa\x04\x4f\x70\xcd\x1c\xd2\x3c\xad\xe7\x5c\x1d\xe1\xdf\xb1\x01\x40\x24\x29\x97\x86\xda\x80\x97\x63\x34\x5e\x24\xed\x69\xea\xd2\x84\xc8\x73\x7a\x2b\x55\x0a\x91\xe4\x0c\xa1\x8e\x88\xb9\x45\x43\x32\xf4\xc1\x9b\x09\x58\x12\x3a\x81\x6a\xd6\x6d\x51\xb5\x8b\x5a\x2a\x21\x2c\x33\x1c\x96\x30\x9e\x8b\x62\x94\xda\x8f\x94\x6f\x1a\x12\x67\xdf\x37\x4b\xd3\xaf\xf9\x64\xde\x99\xbb\x06\x50\x1f\xb1\x02\xdf\x72\x97\x48\xfa\x3c\x49\x14\x41\xe8\x21\x55\xa8\xfd\xeb\xbe\xb0\x10\xae\xe1\x2c\xcd\x00\x21\x06\xcd\xbe\x7f\xba\x64\xd5\xa0\x6c\x10\x69\x49\x89\xf1\xe0\xe5\x5d\x51\x76\xcc\xcd\x10\x13\x9f\x63\xad\x2c\x2f\xb6\x7a\x07\xbc\x45\xed\xc5\x84\x79\x91\x8d\x05\x7b\xc5\xeb\xee\x3d\xc6\x24\x01\x84\xef\xae\xf6\x5f\x0f\xcb\xd5\x62\xbd\x99\x3d\xec\x06\x9c\xd4\x10\x7b\xbe\xc2\x1e\x13\xae\xd4\xfe\x52\x96\x26\xdf\x6d\xbc\x04\xd7\xda\x0e\xb1\xc7\x22\xcc\x22\xfe\x11\xcc\xfb\xf7\x1c\x7b\x31\xa0\x17\xb5\x4b\x9b\x9f\xbb\x68\xd6\xb2\x63\xbe\x99\x74\x94\x62\x0a\x02\xc3\xb5\x54\x16\x41\xdf\xdc\xc4\x3e\x31\xca\x14\x07\xb3\x23\x26\x3c\x9b\x38\x08\x95\xd7\xa7\x6c\xed\xf3\x46\x41\x1c\x42\x8c\x41\xdb\x66\xf6\x87\xd5\x97\xdf\xcd\x1e\x56\xed\xa8\x16\xc8\xe3\xf8\x57\x51\xfc\x95\xe6\xae\xcb\x07\x62\x46\x38\xb3\x39\xf8\xdd\x4b\x7a\x5e\xab\xca\xc1\x4f\xdc\x84\x84\x1b\x33\x88\x8d\xdf\xf6\x8f\x11\xf5\xb0\xbc\xaf\x78\x61\xf1\x7c\xa3\x95\x1e\x37\xc7\x62\x8f\xdf\x16\x21\xaa\xe3\xd8\x35\x8e\x22\x23\xdd\xfc\x9e\x7e\x48\x14\x34\x8c\x84\xdc\xe7\x34\xa3\x3d\x76\xbc\x1f\xe9\x3f\xbc\x54\xcf\x4f\xa3\xab\xc7\x24\x90\x49\x2b\x57\x0c\xe5\x2d\x81\x31\xc4\x71\x6c\x50\x35\xe7\xa2\x1e\xf7\x97\x40\x1c\xf3\x44\x42\xcb\xd1\x63\x5b\x80\xdd\x23\x88\x85\x17\xd8\x2c\x86\x83\x34\x0e\x3f\x9d\x70\x8a\x08\x2f\x27\x50\x58\xd7\x37\xf8\xe9\xd8\x4d\x15\x21\x3a\x82\xe2\xd2\x44\x43\xee\x1b\x12\x19\x63\xd7\xae\xe4\x99\xfc\x1d\xae\xd5\xb3\x95\x28\x9a\x3e\x6f\x63\x2e\x89\x23\x29\x9a\x19\x5e\x98\xe1\x4f\xe5\x90\x98\xd8\x2a\x7d\x03\x93\xeb\xfe\x60\x89\x8a\x50\x30\xe2\xa0\x07\xf2\x15\xe5\x77\x37\xc8\x94\x92\x5d\x31\x91\x82\x91\xc6\xf0\x23\x91\x87\xbd\x55\x69\xf5\xf5\xee\x4b\xfb\x37\x83\xba\x96\x45\x5e\x5d\xb2\x9a\xe7\x75\xd5\x83\xb7\xb9\x49\x02\xb0\xcc\x24\x0a\xb1\xe1\xaf\x50\xa1\xf6\xbd\xe5\x1c\x19\x1f\x71\xc3\x6a\x13\x25\xc3\x13\x25\x16\x92\xa3\x09\xe2\x59\x86\xd5\xea\x05\xcf\xe7\xf0\xcd\xd2\x78\xbb\xef\x53\xc4\xc8\x34\x1d\x50\x1e\xf6\xb1\x58\x58\x56\xca\x6e\x3c\x61\xaa\x55\x6c\x6c\xc2\x18\x14\xab\x9d\xd8\x8c\xca\x4b\x50\x86\xd5\x68\x65\x95\xc5\x69\x07\x6f\x50\xf2\x6c\x9c\x62\x6b\x4d\x88\xf2\x63\x8c\xf7\x6d\x01\xba\xe5\xf0\x75\xc3\x91\x11\x18\x2d\x0e\x19\x17\x8d\x35\xa9\x8b\xd1\x82\x52\xd2\x37\x05\xbb\xed\x7e\xf6\x60\x80\x88\x3b\xf7\x69\x84\x80\x22\xd3\x32\x7f\xef\x98\x14\xdd\x20\x35\x99\x9f\x1d\x4f\xf3\x7a\x56\xe6\xc5\x25\x53\xff\xc2\xa8\xc7\x10\x7a\x06\xa2\x70\x29\x73\x50\xb8\x0e\x9a\x28\xa4\xef\x42\xc5\x90\x84\xaa\x83\x05\x1a\x3e\xba\x8f\xf6\xf2\x7f\x5d\x65\xd7\x45\xaa\xf1\x7f\x3d\x1a\xdb\x3f\x0e\x9f\x2e\x08\x23\xfa\x7f\xe2\xaf\xb0\x93\x2f\x45\x91\x0d\xcc\xae\xd6\x14\x23\x8c\x7d\x2a\xf7\x5c\xee\x0b\x98\xa9\xbf\x2e\xd8\xe7\x53\x7c\xa8\x2f\x3b\x9d\xf8\x4b\x08\x25\x18\x32\xd8\x44\x47\xe7\xd5\xba\x71\x26\x91\xe8\xb2\x71\xeb\x9f\xca\xab\xac\x9d\xd2\x36\x24\x24\x31\x1d\x80\x58\x84\x73\x0a\x2c\x83\xdf\x91\x10\xc1\x0d\x5a\xa4\x38\x7f\x3b\x9b\x38\x64\xc2\xd3\xf5\x12\x7b\x32\x27\x1e\x65\xd8\x7f\xe6\x6a\x21\xef\x1f\xfe\x9a\x4f\xbd\x90\xc4\x63\x0a\x3b\xf1\x52\x9b\x6c\xe8\x8c\xc7\xf0\xfe\x3c\x08\x84\xdf\x2a\x63\xf2\x21\x36\xbb\xeb\xa1\x81\x84\xfa\x11\x8d\x1d\x27\x1f\xcf\x36\xc8\x16\xf3\x71\x21\x65\x78\x37\x54\x49\xe4\xc1\xcb\xe1\x7d\x9e\xaa\xa1\x33\x92\xf8\x82\x40\xd0\x82\x86\x66\xae\x6c\x36\x05\x58\xb5\x9f\x08\xa9\x1f\xd8\x1f\x67\x04\xa7\x5c\x4f\xb8\x6d\x14\xfb\xe0\x53\x9c\x63\x1d\x2b\xad\xb6\xf9\xa2\xe4\x1a\x09\x3c\x2e\x13\x99\xd2\x24\x14\x06\xac\xd1\xc9\xbe\xcd\xaf\x33\xe3\x7d\x4d\x3a\xb3\x09\x93\xb1\x21\xff\x84\xda\x09\xa9\x1c\x4e\x53\x85\xb2\x84\x59\xee\x32\xac\x37\x8e\x45\x62\x20\x89\x28\x09\x5b\xc6\xdc\x43\x51\x2a\x28\x77\x2f\x00\x63\xb9\xd0\x76\xb6\x46\x8b\xbf\x81\xfc\x42\xbc\x0f\x7e\x76\xa4\x99\x01\x92\x21\x93\xfc\xbe\x31\xe2\x9f\x67\xef\x92\x98\x52\x84\xe2\x6c\xf8\x31\x95\x1e\x99\xae\x19\x24\x89\x17\x22\xae\xf7\x7c\x78\xef\xc3\x4c\x13\xee\x0b\x23\xc3\x76\x06\x99\xb6\x65\xa6\x84\x33\x6e\xa9\xf8\xeb\xed\xad\x81\x18\x5e\x9a\x03\x43\xdf\xe1\xe9\x85\x97\x27\xfe\x23\xed\xae\x0d\x89\x67\x41\x69\xb3\xe7\x8f\x0e\xc2\x84\x6b\x43\x6a\x96\x56\x6e\x5d\x8c\xdb\x73\xfb\x0c\x81\xed\xd3\x14\x81\x8f\x3d\x60\x3d\x30\xd1\xc9\x41\xb8\x86\x5f\x20\xfd\xc4\x38\x16\x35\x9c\xf7\xef\xc5\x88\x7c\x06\x12\x60\x11\xb6\x56\xe9\xa2\x6c\x62\x2f\x8d\x1c\x6f\x55\x2a\xef\x00\x7a\x19\xb8\x04\x98\x71\xd4\x0d\x05\x77\x73\x81\x35\x92\x61\x1e\x61\xd4\xf0\x93\x68\x1a\x28\x89\x5e\x66\x06\x79\xfd\x58\xd4\xbc\xbc\xfe\x5a\xdb\x71\x74\x0d\x41\xcc\xe9\x61\x4f\x87\xc6\xd0\x21\x79\xe4\x67\x9b\x86\x13\x1a\xa8\xc4\x2d\x48\xb4\x8b\x2d\xe7\x0b\x70\x12\x33\xf3\xc4\xd0\xc3\x59\xf2\x34\xbb\xde\x6a\x3d\x02\xf7\x08\xb7\xc4\x02\x25\x62\x50\xd3\xfc\x78\x5f\xb4\x2b\x83\x7b\xa1\x71\xad\x97\xbc\x7c\x2d\x21\xcf\xb8\xa5\xe1\x77\xc3\x4c\x22\x0a\x18\x72\x85\xe2\x01\xf6\x01\xb9\xd1\x24\xc6\x65\xf5\x50\x1c\xe7\xa9\x32\x20\x2c\x18\x59\x18\x4e\xa9\x30\xde\x89\x2c\x0e\x55\x47\xa4\x01\x9c\xc6\x09\xb2\x04\x21\x1d\xc7\x7a\xec\xc1\x71\x0a\x0a\xa9\xb1\x4c\xfe\x4a\x3d\x59\xae\x27\x17\x13\xf3\x40\x18\x35\x1b\x47\xbb\x54\xd5\x56\xd7\xc0\xea\x7c\xdd\x64\x68\xa7\x42\x76\x1e\x12\x1f\x0f\xa0\x83\x95\x59\xf8\xcc\xf4\xf1\x50\x18\x47\x0b\x41\xda\x02\xb2\x9e\x2c\x84\x9b\xa1\x98\x11\x01\x78\x49\x75\x7d\x28\x6f\x50\x30\xdd\xb5\x98\xef\x23\xc1\x57\xdd\x95\x8c\xec\x0a\xdd\xb8\x07\xc4\x42\xc0\xa8\xdf\xde\xcc\xba\x9a\xc0\xdc\x72\x16\xb5\x32\x0b\x5f\xaf\xaa\x2c\xd6\x37\x42\x3d\x76\x62\x14\x86\xa1\x18\x20\x3e\x70\x3d\xf0\x32\xe5\x98\xd7\x70\x0e\x0b\x8f\x3d\x2e\xbc\x1e\x16\x6a\x51\xe4\x35\x54\xf5\x5d\x51\x76\x95\xe3\x9d\x7c\x81\x13\x1f\xa0\x91\x46\xcf\xd9\x5d\x2c\x62\xc2\x72\x39\x1b\x58\xc2\xf0\x29\x24\x81\x0f\x36\x09\x6b\x9c\x9b\x5c\xa7\x0e\xf2\xc5\x93\x88\xb8\x0e\x8e\xcd\x75\x9f\xca\x57\x40\x32\xeb\x2f\x83\x5c\xfb\xe8\x7a\x09\xc5\xc3\xe3\x85\x57\xeb\x3c\xad\x37\xbc\xac\x3b\x33\xc8\x13\x11\x61\xbc\xb1\x5e\x6c\x0f\xab\xed\xee\x30\x5b\x3f\x2f\x9f\xb7\x4f\xed\xb0\xa2\xb6\xef\xb8\x92\x97\x51\xdd\x78\x7a\x5f\x23\xd0\xd7\xd2\xb4\x7d\xe7\xb7\x27\xb2\x9d\xc5\x43\xa2\x82\x0e\xdc\xff\x84\x72\xdb\x56\xbc\xc8\xc8\x65\x3b\x23\xcb\x39\x50\xc4\xb3\x9d\x78\x55\x99\x9e\xbb\x7e\xa7\xbb\xc1\x9c\xdc\x15\xe5\x7d\x91\x29\xcc\x77\xf6\xc5\x89\xad\x87\xe7\xae\xa4\x8d\x24\xd7\x2c\x2f\xf2\xeb\xa9\xb8\x38\x2a\xf7\x0f\xd6\xb6\x20\x89\xb2\x2e\xc6\xe1\xdc\x61\xce\x7e\x95\x77\xe9\xb9\x93\xee\x42\x01\x60\x72\xe7\xfb\x76\xbb\xdc\x6e\xdd\xef\x92\x94\x43\x27\xa9\x72\x38\xdb\xf4\xd4\x64\xbc\x39\xca\x82\xdd\x04\x1f\xed\xe2\x92\x32\x42\x42\x9f\xe6\xd0\xb0\x2a\x8f\x9b\x34\x6f\x9c\x1c\x3b\x41\x51\x69\x61\x7d\xf5\xe1\x5c\xcb\x83\x98\xca\x74\x71\x15\x30\x2c\x8a\x9c\x2f\xf5\xbc\x46\x02\xca\x5d\xe7\xfe\x7f\x64\x3f\x3e\x7e\x20\x1f\x72\x23\x03\x57\x2a\x41\x83\xa9\x8a\x9c\xd7\x30\xab\x9a\xef\x42\xea\xee\xea\x72\x1a\x42\x47\x9d\x95\x03\xdf\x30\xec\xd9\x3b\xdf\x15\x59\x36\xba\x7b\x88\x34\xa6\x08\xea\x97\xb4\x54\x68\x9f\x2d\x39\xb1\x7b\x08\x9a\x08\xac\xbf\x72\x75\x9a\x7d\xe8\x62\x72\xed\x19\xbe\x9d\x5e\x0b\xce\xa8\xcb\x73\xb4\x60\x74\x12\xa2\x7c\x6b\x0e\xa0\xf6\xc5\x3d\xd4\x77\x25\xb4\xb6\x5d\x0b\x2f\x56\x5d\x53\xcd\xf0\x96\x9b\xb3\xd0\xe1\xd4\x76\x45\x76\xb9\x49\xd8\xb8\x17\x2c\x3c\xa2\xd1\xe5\x38\x97\xcd\xe9\xdc\xea\xd4\x80\xa0\x5e\x80\xce\x97\x4b\xf7\xfe\x2a\xec\x70\x1f\xa3\x1a\x33\x6b\xc8\xc8\x06\x6a\xc5\xcb\x91\x77\x21\x68\x10\x25\x36\x7f\xf7\xfb\x55\x0e\x10\x74\x6e\x46\xe4\xa3\x4b\xe7\xb0\x05\x8b\xb2\xf3\x2a\x84\x1f\x1a\xff\xab\xeb\xd0\x9c\xec\x96\x11\x01\x89\xb1\xe1\xb5\x89\x84\x5d\x44\x23\x02\xcf\x8f\xad\xe7\xdb\x58\xd6\x07\xd0\xf5\x13\x57\xed\x68\xa0\x48\x4b\xcf\xb6\x3b\x67\x69\xe3\xb7\x8c\xee\x3e\xf4\x34\xb1\x80\x3a\xa3\x24\xfb\x01\xed\x05\x08\x46\x58\xe8\x14\xc6\xca\xe2\x32\x42\x0c\x09\xa6\x84\xe1\xb2\x4e\x4f\x70\x28\xb4\x01\x07\x1c\xaa\x77\x7e\x3e\x40\x5b\x4e\x10\x51\xe2\xa1\x7f\x82\x8c\x72\x3d\xe7\x4a\x44\x42\xc6\x2d\xfc\xab\xed\xbb\x2a\x8b\xd3\x87\x35\x91\x51\xbc\x2e\x22\x08\x7c\xd9\x36\x66\x6e\xf3\x45\x71\x3a\x67\x60\x4b\xc7\x0e\x25\x2f\xe2\xd8\x68\xc7\x54\x50\xf7\x9b\xa2\x3f\xf8\xcd\x31\x00\x72\x3e\xa9\x8b\xb1\xa6\xeb\x7c\x93\xe6\x97\xba\x3d\xf9\x44\x12\x2b\xf4\xbd\x2f\xb9\x70\x3c\x6d\x20\x12\x1e\x6a\xbb\x58\xef\xf9\x09\xac\x9d\xc1\x9a\xfe\x18\x75\x21\xb8\x67\x28\xf4\x36\xb3\x3f\x0e\x0f\xdb\xd9\xe3\xa0\xad\x1f\x04\xf7\x89\xd1\x34\x97\x2f\xa0\x2e\x19\x4c\xf1\x69\x0f\x32\x6e\x37\x5d\x9c\x82\x87\x04\x2d\xda\x66\x3b\xef\x68\x85\x47\x2b\x94\x4b\xc3\xee\xfe\xf0\xbc\x78\x28\xf2\xe3\x1e\xca\xd3\x57\xd3\x0c\x76\xa3\x53\x3c\xfa\x20\x84\x78\x7a\xde\x3f\xcc\xbe\xb9\x7b\x16\xb1\x91\x2a\x6c\x5c\x00\xcb\xcd\xff\x0c\x58\x19\x5d\xe5\xe8\x62\x3f\xc3\x5b\x5a\xf5\xda\xee\x84\x10\x12\x9a\xab\x20\x25\xc3\x2c\x2d\x55\x59\x4c\xeb\x70\x83\x90\x9e\x29\xc8\x29\x78\xeb\xe7\x35\x84\x4c\xb8\xeb\x86\x5b\x42\xd6\xf6\xc5\x08\x09\x06\x9e\xd7\x35\x0a\x3b\x77\x50\x28\xdf\x13\x76\xc1\x38\x82\xc8\x7e\x26\x41\x00\x31\x61\xc3\xdf\x97\xa2\xcd\xbf\x0a\xed\x9b\x20\xe0\x94\xe6\xa8\x20\xd7\xfe\x9d\x33\x0c\xaf\x4e\x45\x5e\xbf\x78\xb1\xb4\xca\x09\x79\xaf\x83\x52\x12\xea\x21\xb3\xe4\x57\xe0\x59\xfd\xb2\xe4\x35\xc7\x56\x9e\xcf\x2a\x9d\x92\xe8\xc8\x0f\x86\x9d\x77\x83\x9a\x89\x9d\xe6\x11\xe9\x59\xaf\x02\x75\xe0\x3f\x8d\x18\xa5\xe7\x33\x84\xf2\xee\x5e\x8a\x72\x42\xee\x1d\xa4\x17\x71\x43\xb8\xf3\x52\xa6\xd5\x1c\xb2\xec\xd7\x25\x1a\xe9\xfb\x3a\xb0\x8e\xd9\x13\xaf\x8d\xcc\xc2\x08\xbf\xfc\xdf\x70\xb4\x38\xa5\xcf\x7c\xb4\xfa\xdf\x8b\xe6\xf1\x2f\x5e\x9a\xd0\x34\x6f\x1d\x7e\xe9\x33\x69\x39\x54\xf4\x25\x57\x4f\xc5\x7b\x63\x83\xbf\x39\x9b\x2e\x03\xee\x49\xe9\x88\x22\x9e\x4d\xdd\xb2\x3b\xa0\x64\xc0\x8d\x90\xde\x7b\x5b\xe6\xcd\x7b\x88\x6d\xc9\x7c\x89\x1c\x4d\x8f\xfc\x54\xf4\xb3\x55\x92\xc5\x31\xed\x33\xb7\xdc\x5d\x1c\x45\x2a\xc8\x88\x32\x22\x2c\x25\xe2\xe1\x54\xe4\x95\x23\x59\xf7\xd8\xa0\x1d\x47\x46\x91\x69\xd8\x42\x69\xd2\xc3\x6c\xf9\x7d\xbd\x6b\x6b\x18\x32\x12\x86\x35\xd0\x39\x58\x63\xa7\xe5\x32\x01\x0b\x91\xb1\xa2\x88\x90\x55\x80\x38\xaf\xd1\xfe\x1f\x4c\x4d\x42\xce\x6d\xd8\x61\x55\x94\x9a\xe3\x01\xb1\x22\xf2\xb5\x09\xa8\x26\x04\x49\x40\x26\xc2\x80\x3e\x0f\xf0\x13\xe4\xa5\x86\x0f\xb1\x69\x32\x51\x3a\x4e\x86\x4d\xf0\x50\x23\x05\xa4\xa9\xa1\x8e\xba\x07\xa7\x16\x36\xf7\x28\x6e\xcc\x01\xfe\xab\xcb\x37\xba\x59\x11\x20\xe3\x59\xf3\x6a\xa7\xd4\x51\xdc\x34\xed\x63\x6b\x13\x4a\xdd\x1a\xa0\xd2\x17\x93\xae\xb3\xd4\xac\xd8\x6b\xe7\x66\x0b\xc2\xb0\xa7\xe6\x94\xe6\x03\x88\x97\x94\xbe\x0f\x91\x13\x2b\x31\xe1\xc3\x2f\x9a\xb0\xa5\xb4\x2c\x1b\xcd\x09\x6c\x84\x1f\x1f\xf9\x09\x7a\xd0\x2c\xa9\x08\x45\x6f\xcb\x3e\x54\x57\x66\x1d\x3c\x0c\x45\x0c\x47\xd2\xc1\x96\x5f\x30\x21\xde\x76\x95\x4e\xff\x66\x95\x28\x0c\x11\x0e\x69\xf5\x88\x60\xe1\x47\x78\x1f\x88\x63\x82\x54\x92\x21\xa4\x6f\xbf\x9a\xb9\x10\x51\x91\x24\x54\xac\xd5\x46\x40\xa2\xfd\xfe\xad\x28\xc2\x7d\x6e\x69\x98\xbf\x16\xc5\xab\x43\x57\x8c\xcf\x01\x37\x5b\x48\x3c\xf5\x37\x3c\x3f\xf2\x5e\x1a\x40\x11\x69\x54\x55\xab\x8b\xa8\x64\x99\x9e\x87\x6c\xac\xa0\x88\xf2\x1d\x0a\xc3\xa5\x59\x7e\xe5\x26\x4f\xbe\x00\xe5\x79\x06\xa6\xc5\x95\xda\xc0\xa9\x28\xaf\x5f\x6e\xf4\x24\x40\x79\xdc\xec\xda\x73\x51\xfc\xe5\x4c\xb9\xa2\x89\x91\x38\x7f\x28\x8e\x77\xd8\x80\xfc\xb1\xaf\xab\x7c\x2a\x88\x74\x3d\x94\xf9\x58\x97\x1a\x94\x9f\x84\xc8\xbb\x2a\x2e\xd7\x07\x3e\x76\xb2\x94\xaf\x8d\x21\x4a\x1d\x32\x73\x76\xa9\x5f\x8a\x32\xfd\x67\x9c\xdf\x55\x41\x10\x08\xed\xda\x27\x9a\x53\x69\xb2\x79\xe2\xc3\x54\x9c\x0a\x24\x61\x7d\x14\xf1\xbe\x98\xf4\x26\x55\xa0\x03\x2b\x61\x97\x65\x06\x69\x6c\x07\x58\x98\x08\x66\x6b\x08\x9b\xd7\xda\x48\xfa\xd8\xb1\x88\xea\x38\x6a\x99\xa8\xdb\xbf\xc6\xa0\xac\xad\x59\x9f\x8c\xf2\xd4\x50\xfe\xde\xed\x3b\x15\x29\x82\x52\x64\x25\x34\xeb\x7b\x7e\xdd\xe2\x17\x0f\x6f\x2c\x26\x1c\x41\x90\x56\xab\xcb\xb0\xa0\x8f\x49\x44\xbb\xe8\xb5\xab\x54\x4c\xfc\x97\xbb\x64\xc0\x23\x2b\xa3\x3b\x46\x2e\x7f\xb0\xa6\x12\xca\x22\xd2\x41\xc7\xcc\x4d\xa4\xe3\xa2\xbf\x4a\xb4\xe1\x80\x3e\x21\x6a\xad\x78\x1c\xd3\x89\x82\xe2\x01\xc7\x12\xf9\x63\xf1\x96\xa2\x84\xe1\x61\xbf\xda\x39\xe7\x4e\x71\x65\x7e\xeb\x2e\xcd\x8f\x97\x0c\xb5\x1c\xf6\x50\xd5\x0e\xbf\xa5\x84\x00\x4c\x75\x98\xe2\xc2\x14\x3a\x4f\x49\xe2\x71\x70\x55\x4d\x34\xa4\x63\x58\xb6\x92\x54\x82\xd7\x32\x5a\x75\xc5\xa6\xe1\x9d\xca\x88\x3a\x7d\x3a\xc7\xbe\x3e\xbe\x8e\x50\x09\x82\x10\x10\x90\x7b\x98\x7f\xfb\xf3\xb0\xbd\xbb\x5b\x3d\x1f\x66\x8b\xc5\xea\x69\xbf\x72\xd0\x40\xe4\xc6\x26\x98\x4e\x75\x58\x88\x49\xfd\x4b\x40\x62\x5c\xd6\x67\x3f\x1b\x59\x7f\xa5\x14\x41\xd8\x8b\x70\xb0\x98\xb6\x3c\x38\xbc\x35\x4d\x29\x35\xca\x80\xf9\xb1\xf9\xb3\xa9\x76\xb4\xc2\x8d\xf6\xc6\x80\xd8\xb4\xec\x11\xea\x47\x4b\xc5\xf4\xbd\xe8\x9c\x79\x20\x94\x23\x52\x7d\xb7\xbd\xdb\x2f\x66\x4f\x87\xd5\xfe\xeb\xe1\x61\xbd\x59\xef\xdb\x09\x22\x40\x72\xa6\xc5\xf3\x7e\xb7\x9f\x3d\x1c\x36\xeb\xc7\x1b\x4e\x02\xf0\x7c\xc0\xca\x4b\x8f\xa2\xfd\xdf\xd6\x84\x3e\x33\x74\x40\x03\xc0\x2e\x85\x23\x3f\x89\x0c\x4a\x87\x67\x03\xca\x0c\xa4\xa1\xd9\xca\x37\xef\x15\x28\x4f\xa4\x51\xad\x9b\x46\xed\x43\x40\x3c\x3c\xf4\x0d\x61\x5a\xcb\xbc\x0c\x10\x26\xae\x31\x4a\x75\xfd\xa4\x1f\xd9\xe3\x1b\xea\x1e\x7b\x11\x26\x08\xc6\x7b\x33\x14\x73\xaf\x76\x97\x3c\xbf\x8e\x3a\x1f\x80\x89\xb0\x27\xcf\xf7\xc0\xad\xd6\x70\xea\x28\x04\x01\x18\x98\x8e\x6f\xee\x20\xc1\x56\xfe\xf0\xb1\xcd\x82\x01\xd3\x26\x8e\xda\xad\x7e\x5f\x6d\xba\x3f\x26\x2e\x24\x34\x4d\xf7\x5b\xdd\x5c\xfe\xae\xe5\x32\x05\x88\x7c\xe6\x84\x42\xf7\x4f\xfb\xc9\xdf\xf8\x01\x53\x00\x44\x81\x69\xeb\xe8\x6c\x2d\x36\x70\xe9\x9e\x50\xe4\xd0\xea\x42\x4c\xfc\xd0\xf6\xb6\x05\x67\x4c\xe9\xb9\xdb\x88\x69\x02\xbc\x75\x74\x37\x3c\xbf\x7e\x19\xc5\xb7\x10\x6b\x8e\xe4\x39\x36\x25\x7f\xb0\x08\x85\x83\xe4\xd5\x8b\xe0\xf2\xf5\x80\x91\x77\x17\x6b\x43\xe2\x03\xb2\x4f\xa6\x95\xd1\x6e\x76\x7d\x77\x83\x17\x94\x30\x1d\x58\xd0\x05\x7a\x3d\xca\x74\xdb\xa2\xf6\xc6\x68\x29\x71\xdf\x28\xfd\x66\x45\xf1\x7a\x39\x7f\xab\xa0\x74\xfc\x29\x5f\xd3\x66\x61\x5d\xe7\xd7\x05\x3f\x9d\x79\x7a\xcc\xd7\xcb\xd1\x3b\xe6\x2a\x10\xcc\x85\xdd\xa7\x73\x0d\x07\x8f\x0c\xfc\x0e\xe0\x5a\x21\x58\xb5\xa5\x4f\x6e\x5c\xa0\x99\x7a\x6b\x36\x7e\x0f\x2b\xf2\xc1\xe6\x10\x11\x61\xf6\xfa\xff\x53\xa4\x37\xdc\xa3\x00\x02\x68\x6c\x80\x02\xe7\x02\x9b\x0a\x35\x97\x30\x04\xac\x83\x8c\x75\xac\x5b\x32\x0a\xc7\x21\x3d\xe1\xbc\x02\x04\x9e\x97\x74\x9d\xb0\xd5\x33\x57\xbc\xac\xd6\xaa\x35\x25\x90\x30\xf4\x07\xca\xa2\xe6\x35\x7c\x96\xd6\x07\xe0\x04\x5f\xbd\xb4\xf9\x8a\x59\x5d\x73\xf9\x3a\x2c\x89\x80\xf6\x63\xc3\xc4\xe0\x8a\x5d\x88\x45\xda\xa7\x50\xfe\xef\xa5\xa8\xd3\xae\x07\x05\xb4\xaf\x0c\xbd\x99\x95\x99\x8c\x46\x6f\x42\xb3\x20\x30\x9c\x20\x77\xab\xf5\xe3\xf7\xf5\x72\xf5\xdc\x7e\x54\x38\x4c\x37\x3c\x61\xfa\x6c\x95\xab\x96\x47\x46\x13\x3f\xd2\xaa\xcb\x9c\xa4\xf9\x05\x8b\xef\x5d\xda\x50\x13\x46\x91\x83\xa2\x34\xa7\x75\x9f\x37\x4e\x13\x48\xc0\xc6\xe7\x77\x3c\x93\x45\x7e\xc2\xe6\x98\x67\xf8\xdb\xcd\xa0\x81\x44\x96\x5a\xd7\xf3\x76\x37\x16\x5c\x05\x4d\x93\xd0\xd2\x3e\xae\x17\xab\xc3\xe6\xdb\xc3\x7e\xfd\xf4\xb0\x5e\x3d\x1f\xd6\x8b\x6d\xd0\x5e\x07\xc2\x30\x31\x4d\x97\xaf\x50\x23\xe0\xe8\xd0\x2c\xcf\xae\x8e\xa4\x03\x4a\x5d\x2a\x6b\x90\x04\x1a\x7e\x5b\x20\xc0\xb7\xf2\x93\x75\xca\x33\x4c\x4e\x4c\xfb\xe2\x3a\x0c\x39\x9e\xb1\x39\xbc\x37\xcb\xbb\xdf\x7a\xaf\x43\x50\x2c\xe9\xe1\x8a\x90\xbc\x7d\xa0\x3e\x6a\x27\x32\xee\x27\x5d\x5f\xe5\x26\xcd\xa1\x9c\x0d\x30\x4c\x9a\x49\x8d\x30\x2e\xae\xd4\xbe\xe8\x92\xf9\x53\x1e\x9e\x8e\x42\x85\x28\xcb\xd3\x75\xc1\x4b\xb5\x4c\xdf\x52\x05\x79\xbb\x40\x75\xc4\x03\x8c\x81\x1e\x8a\xe3\x1e\x4e\xe7\x66\x49\xed\x6e\x99\xd5\xc7\xd7\x84\x08\x91\x46\x69\x9e\xe2\x13\xe1\xe7\xf6\x7a\x71\x1c\x61\xd2\xa7\x79\xd2\xa6\x55\xa4\x39\xf4\x9b\x7d\x68\xc2\xd3\xc1\xe3\x8a\x95\x1f\x58\xb6\x09\x23\x3e\xdd\x2f\x0d\xd8\x39\x49\xe0\xe3\x77\x99\x53\x41\x1b\xa3\x67\xeb\xae\xa3\x17\x95\x30\x62\x68\xc5\xd2\x13\xec\xd3\x2c\x7b\x84\x9f\xf5\xae\x6e\x05\xfc\x41\x27\xd2\x74\xc7\x34\x1e\x01\x2c\x1f\xac\xac\x52\x3b\xaa\x04\x62\x88\x2c\x2d\xfb\xb7\xa7\xa7\x87\x3f\x0f\x08\xda\x71\x33\x38\xa3\x81\xe8\xb7\x46\xd9\x1c\xd5\x3d\x3f\x19\x77\x77\xf8\x98\x78\x4c\x70\x1f\x68\x43\xc0\x5a\xf5\xa0\x91\x9a\x0b\x1e\x19\x9d\x2f\x39\xfa\x15\x5c\xf9\x86\x46\xd9\xa2\x3a\xb6\xaf\xfc\x6a\x32\xfd\x5f\xa6\x10\xbe\x5a\x10\xe3\xa9\x23\xeb\x72\xf1\x6a\x49\x50\x86\xd7\x14\x3e\x43\x39\xc8\xb7\x66\x2b\xee\x8b\x01\xc1\x94\x96\xe0\x61\xd2\xaf\xf9\x15\x4d\xac\x39\xb0\xc7\x5a\x51\x8a\x98\x53\x03\x6f\xac\x27\xd9\xb5\x86\x3f\x5b\x29\xc5\x4d\x1d\xff\x1e\x72\xa8\xac\x20\xd5\xad\x47\xaa\x95\x96\xda\x1f\x27\x08\x31\xba\x7c\x2c\x6a\xfb\x5f\xbd\x44\x8d\x06\xea\x23\x99\xda\x57\x5e\xfe\xd5\x8b\x31\x35\x08\xc3\x80\xbf\x81\xea\xe5\xa9\xc0\x86\x3b\x83\xe1\x18\x3c\x03\x50\x21\x82\x0f\x67\x75\xc6\xf3\x3a\x55\x63\xcd\xbe\x81\x65\xd7\xda\x0b\x12\xd1\x6f\xc2\xba\xc8\xd7\xeb\x53\x31\x4a\x90\x69\xcd\x34\xb0\x96\x63\xcf\x66\xce\xef\x5a\xea\x84\xf1\x6c\xc1\xb5\x67\x11\x0e\x98\x8d\x69\x53\xed\x38\x41\x13\x42\x7d\x6c\xac\x38\xbf\xd5\x87\x73\x76\xaa\x0f\x27\xfe\xf3\x90\xe6\x87\x96\xe2\x58\x13\x12\x05\xb8\x1f\x72\xf8\x59\x0f\x4c\x91\x1b\x97\x9e\xa1\xff\x68\x7c\xb5\x6d\x0e\xab\xbc\xbb\xba\x34\x04\xff\x26\x31\xf2\xf7\x85\x97\x8d\x19\x4a\xa1\x9a\xb5\x33\x54\x20\x6c\x5a\xfe\x1f\x78\x2a\x8a\xcc\xb1\x5a\xda\x71\xcf\x13\xf8\x0c\xe1\xa7\xcc\x2e\x0a\x54\xc7\x10\x31\xbc\x09\x2a\x38\x1e\xe2\x05\xc6\xfb\xd5\x13\x94\x66\x7f\xdb\x61\x3f\x10\x18\xf4\xd7\xbd\xfc\xbe\x91\x66\x57\x37\x79\xe6\xfe\x13\xd4\xc4\x07\xd3\xf5\xf3\x6c\x53\x72\xbd\x2a\xc5\x84\xf5\xd3\xc4\xd7\xa1\x0e\x7a\xd9\x25\xd3\x8a\xf9\x3b\x5c\x47\x37\x1c\x28\x85\x54\xc3\xcb\xd9\xd3\x0e\xf7\xbf\xbb\xd5\x40\x0b\x2b\x6d\xd3\x58\x6d\x2b\x8e\x5a\x8e\x3e\x1d\x06\xc6\x1e\xbf\xf0\x52\x2d\xf8\xb9\xcf\xd7\xa1\x09\x8b\xa9\x71\x0f\x0d\x13\x6f\xfb\x67\xe1\x05\x96\x3d\x1c\xca\x7a\xf5\xb7\x17\x59\x26\xa8\xe8\xb7\xc1\xbf\xf6\xe8\x6f\x3e\xe0\x63\x3d\xfc\xf7\xed\x7a\xbb\xfb\x17\x4c\xca\xf6\x63\x91\x47\x70\xeb\x57\x2f\xc5\x3b\x96\x90\x8b\x22\x9b\x22\x61\xd5\x24\xd2\x02\x0d\xc9\xd7\x6f\xbd\x2c\xa8\x26\x31\x35\x58\xed\xd5\xfe\x6b\x13\xdf\xb4\x4f\x26\xf6\x43\x23\x5f\x96\x56\xf5\x2c\xcb\x66\x75\x0d\xb9\xe2\x2d\x35\xab\x26\x31\x8b\x58\xd8\x26\x82\xcb\x22\xef\xab\xc6\x69\x92\x04\x01\x2e\x54\x01\xf5\xf0\xef\x92\xe1\x2e\xcf\x78\x65\x34\x6d\x0e\xda\x23\x5f\x79\xf5\x72\xb0\x3f\xac\x9d\x08\x44\x75\xac\x54\xad\x87\xd2\x0c\x30\x3c\x85\x77\x50\xcf\xd3\x9b\xca\x45\x3b\x29\xc6\xd2\xad\x11\x62\x3f\x43\x59\x1b\xfc\x34\x8a\xec\xb5\xed\x31\x9e\x7b\x8c\x9c\x18\xe5\xc3\xc5\x4b\xf1\x71\x20\xe7\xe6\x86\x04\xd5\xbf\x96\xc5\x19\x06\x8f\x92\x83\x22\xd0\xf6\x05\x23\x45\xfa\xe5\x6a\x08\xce\x87\x2f\x4d\x0a\x86\xcc\xd9\xd8\xf3\x6b\x82\xdd\x96\xdb\xd6\x4e\x51\x42\x52\x1b\xa8\x7f\xa5\xf3\x54\xa9\x6e\x08\x02\xc3\x6d\xa4\xd3\x5c\x8d\x2b\xb1\xc3\x68\xa2\x99\x2b\xb0\xe4\x02\xc7\x63\xb5\x46\x62\x9b\x5d\x66\xad\x5c\xec\xa6\xc4\x44\x3b\x1a\x6e\xe4\xca\x56\x53\x6d\x1f\x9a\x68\x12\xa2\xc7\x59\xbd\x64\x71\x8f\xfe\xc1\x5d\x46\xfb\x81\x0c\xda\xfc\xc3\xf2\x32\xd1\x67\xa5\x89\x8e\x19\x16\x0f\x04\xaf\xeb\x0c\x1a\x8f\x65\xad\x9e\x79\x5b\x09\xd0\x44\xcb\x08\xa3\xdc\x03\xf6\x3f\x5a\xb2\x9d\x35\x76\x32\xb7\x94\x3b\x93\x96\x40\x2b\x2e\x9d\x41\xc7\x14\x0b\x7a\xce\x13\x0f\xdf\x23\x84\x62\x7a\xeb\xcc\xaf\xfb\xc2\x1d\x25\xc3\x29\x1e\x0d\x90\xdf\x4a\x72\xab\x30\xdc\xb8\x1a\xcd\xf9\xb9\xce\xd3\x9a\x67\x46\x53\x78\x97\xfe\xe3\x6e\xdb\xa3\x81\xc0\x2e\x67\x3c\x3f\x9b\x25\xb6\xae\x86\x8d\xd0\xda\xa3\xa1\x81\x51\x08\xae\x8e\x70\x28\xc4\x5f\xed\x40\x14\xa3\x3f\x78\x86\x52\x6e\xf5\x64\xf4\xa0\x3d\x2a\x22\x1a\x8e\xf8\x98\x07\xfe\x8d\xf6\xa8\x4a\xd0\x13\xfc\x59\x94\xf0\xb3\x6a\xff\x0a\x31\x66\x69\x8e\xe9\x1b\x18\x1d\xed\xe1\x6b\xf5\xfc\x80\x13\xe6\x28\xe9\x1e\x8c\x08\x87\x6d\xda\x80\xf6\x2a\x3e\x0b\xf0\x60\x58\xf3\x63\x91\x8f\x38\x48\xb5\x17\x90\x10\x57\x10\x0a\x1f\x2d\x5d\x51\x4e\x7b\x81\xf0\x12\xaf\x6b\x58\xb3\x6b\x75\xab\x77\xe9\x31\xff\x45\x17\xdc\x74\x30\xae\xbd\x40\x82\x1c\xd4\x7a\x36\xfc\xe7\xbe\x78\x9d\x0c\xc4\xb5\x17\x46\xb1\xcb\x04\xe1\xe6\x37\x74\x69\xed\x60\x82\xdd\x6b\x8d\xbb\x9c\x1e\x7b\xb6\xdb\x0b\x63\x6d\x3a\xea\x26\xaa\xb1\x9f\x65\xa9\xb5\x17\x8a\x18\x33\x59\x6b\x59\xb8\xba\x74\xbb\x00\x18\x91\xda\x7a\xf5\x9b\x42\x0d\x85\x24\xfa\xce\x89\xf6\x98\x30\x62\xb5\x87\x33\x97\xaf\xc6\x13\xed\xbb\x9f\xa3\xef\x64\xd2\x20\xf1\x9c\x2b\x63\x04\xa5\x46\x73\x20\x09\x4d\xe1\xe4\xba\xcd\xe7\xf0\xc2\x33\x3d\x5a\x06\x71\x44\x31\x9d\x75\x30\xe6\x76\xf1\xd2\x09\xd8\x4e\x7f\x6d\x1c\x29\x6d\xd3\xad\x26\xad\xee\xf4\x72\x3f\xb8\xcd\x38\xf6\x3c\xed\xe8\xfc\x1a\x5f\x00\x0c\x9d\xb2\x1b\x4e\x0c\xce\xbe\x31\x51\x73\x5e\xf5\x3c\x05\x3b\x21\xf1\xc2\xc0\x68\x98\xd5\x25\x4f\xeb\x5d\xcd\x73\xc5\x4b\x75\x08\xdb\x09\x01\xf3\x2d\x9a\xf9\xa9\x78\x85\x53\x91\x4f\x10\x33\x68\x2f\x09\x3d\xec\xc7\xf9\x8f\xc4\xa2\x6c\xfb\x57\xc0\xfa\x6b\x6a\xc5\x78\x97\xbd\x8d\xd5\x84\x05\x58\xfc\x58\x6f\xf7\x2d\xbc\x73\x1a\xd1\xa5\x3d\x41\xfc\x48\xf6\x8a\x8a\x6d\x27\xc3\x68\x9a\xe7\x41\xdc\xd2\xe0\x3c\x41\xf9\x03\xd2\xa7\xec\x52\xdd\xb6\x42\x6b\x4f\xf8\x1a\x9b\x29\xbb\x04\xd4\x79\x3c\x23\x08\xb1\x3c\xf3\xad\xfa\x40\xc6\x41\x7b\xd2\xf3\x5d\xd3\x0c\x7e\xc7\x73\xef\x07\x4a\xdf\x63\xb6\xfb\xf5\x83\x8a\x85\xf6\x64\xa2\xb1\x8d\x12\x6b\xb0\x4b\xd7\x6a\xaf\x3d\xa9\xa8\x4d\x2c\xc9\x4b\xe3\x6f\xe6\xe3\x0f\x2a\xea\x61\xf6\x1c\xfd\x8b\xc3\x6c\xb9\x7c\x5e\xed\x76\xee\xd3\x2a\x64\x91\x61\x88\xab\x4e\xa9\x5c\xb6\x55\x79\xed\xa9\x98\x5a\xf9\xec\xfa\xc9\xe8\x96\xf6\xf8\xce\x3a\xbd\x87\x09\x80\x9b\xf6\xc0\x17\xd2\x36\x3a\xff\x05\xb2\x1e\x68\x7f\x6b\x0f\x04\xc7\x7a\xd0\xb9\x2c\x4e\xc5\x86\x9f\xbf\x0c\x2d\x0c\xc8\x10\x33\x48\x97\x4a\x3d\x61\x27\xe0\x43\x71\x1c\x3d\x6e\x50\xda\xa4\x72\x9a\xb0\x6d\xad\x1f\x50\x8a\x2d\x9f\x4f\x36\xa8\x6b\x0f\xf3\x93\xff\xe7\xff\xf9\x3f\xdb\xef\xeb\xdd\xf3\x6a\xb7\x7a\xfe\xbe\x5a\x5a\x7a\xd6\xf6\x96\xc0\x28\xec\x9a\xc3\xa6\x79\x35\xb7\x89\x03\xed\x69\xdf\x0f\xc1\x52\x87\x3d\xa4\x7f\x5f\x52\x95\xd6\xc8\x00\xf9\xc1\x8e\xd3\xbe\xc2\xbe\xd6\x0c\x3b\xf6\xb1\x6c\x61\x46\x28\x21\x90\xe8\x01\x92\xbe\xda\x61\x5a\x79\xf8\x43\x29\xa1\x46\xfa\xe8\x74\x45\xd3\x5e\xf7\x8c\x3e\x25\x5c\xe2\x7e\x94\x69\xcd\x15\x64\x83\xae\x37\x4d\x3d\x02\x9e\x69\x05\x6b\x8c\x08\x52\x52\xcb\x76\x2f\x53\x8f\x51\xd2\x91\x40\xed\x8b\x0f\x89\xfd\x27\x21\xa4\xbd\x92\x9f\xa6\x5e\x12\xe1\x7e\x1b\x88\xb8\xfc\xaa\xb4\xd8\xb7\xb6\x94\x86\x1e\x69\x65\x20\x2d\xf8\x7a\xb4\x05\x29\x95\x31\x16\x78\x56\x19\x98\x63\xe0\x46\x76\x62\xfa\x40\xa0\xbe\x67\xfc\x99\xc6\x3a\x66\x45\x3d\x54\xb7\xd2\xd4\x0f\x23\x34\x2d\xef\x13\x0b\x7a\x58\xdf\xd2\xd4\x67\x1e\xeb\x24\x4f\x1a\x3b\xd9\xe7\xae\xb1\x93\x42\x30\x88\x03\x57\x28\x82\xf9\xa5\x4a\x73\x8c\xe1\x9e\xa0\x6c\x45\x47\xba\x0f\x30\x2e\x93\x9e\x6a\xfb\x2d\x90\x58\xd3\x28\xf4\x93\xe6\x8b\x1f\xe6\x0f\x9f\xc4\xd4\x9a\x46\x71\x80\x39\xf6\xea\x9c\xa5\x23\xd8\x42\xcb\x41\x3e\xfc\xf2\x28\xd1\x26\x60\xce\x2b\x28\xd3\x72\x7b\x79\x4b\x55\x51\xa6\xfc\xb1\x58\x70\xc5\xab\xba\x2c\x3e\xb8\xcc\x18\x4a\x39\xbc\xaa\x22\x1e\xb3\xb5\x90\xfb\x92\xcb\x01\x35\x8c\xa6\x31\x8d\xa3\xde\x49\xf7\xd8\x72\x8d\x6a\x1a\xc7\x11\x7a\xcb\x1d\xd2\xf1\xd6\xb1\x1e\xfd\x84\x58\x18\xad\xb6\xf3\xc1\x64\xb0\x2c\x5b\x8e\xe9\xe4\xeb\xf8\xcd\x46\x4f\x3d\x09\x79\xe8\x56\xed\x47\xc4\x4e\x9a\x26\x89\x01\xf6\xfd\x55\xa4\xf9\x53\x1b\x5e\x53\x1e\x33\x44\xed\xd4\xef\xc5\xe8\xb2\x5c\x6b\xd9\x35\xa5\x3f\xc3\xdf\x97\xb4\x6c\xa2\xf8\x53\x0f\x7d\xd4\x91\x78\xda\x0f\x09\x8f\x61\xed\xe6\x7e\xcc\xf3\xa8\xa9\xf0\x45\xd0\x31\x2a\x3d\x17\xc5\xe9\x7f\x2f\xa9\x03\x3a\x69\x2a\x62\x49\x42\x57\x77\xe1\x59\x5a\xa1\xcb\x7f\x00\xad\xc1\x54\x22\xec\x3c\x19\x52\xa3\xe7\x3c\xc2\x19\xf7\xef\x42\x11\x1f\x2b\x9c\xa7\x34\xff\x9f\xcb\xe9\xec\x3e\xaa\x7c\x4f\x8b\xde\x71\xfa\x65\xa8\xde\xec\x66\x85\x0a\xcb\x02\x8d\x67\xba\x83\x4c\x2f\xcb\xe2\xdc\xf7\x50\xa9\x0a\x01\x01\x46\xeb\xc5\xf6\xb0\x7f\x5e\xdf\xdf\xbb\x6c\xb8\xa6\x2a\xa1\x48\x9b\x6c\xa1\x3b\xbb\xc3\xec\x71\x79\x58\x6c\x1f\xf7\xcf\xeb\xf9\xb7\x3d\xfe\x61\x70\x66\x51\x20\x1e\x42\xc0\xb2\x34\x7f\xfd\x32\xb8\x0d\xf0\x0c\xc1\xfa\x72\xfb\xe3\xf1\xf0\x8e\x41\x42\xd5\x7e\xca\x07\x4c\x16\xde\x37\x26\x37\x7f\xb5\x18\x84\x91\xd5\x84\x98\xa0\x77\x7b\x30\xf8\x83\xfa\x19\xde\xe0\xb6\x75\xb1\x77\xd4\x51\x1d\x87\x68\x14\x8e\xdd\x3a\xdf\xa4\x08\xac\x74\xd7\xd4\x09\x47\x2a\xc5\x01\x81\xfe\xa2\xcf\x7c\x54\xbd\xf4\x24\x7b\x86\x0b\x40\x8b\x48\x5a\xd8\xe8\x72\xbd\xfc\x50\xe1\x45\xfb\x84\x30\xee\xb5\x7c\x3e\x18\x60\xaf\xf3\x65\x91\x65\x7c\x74\xa6\xf8\x24\x21\xb8\x7a\xfb\x0d\xa0\xda\xf7\x08\x43\x67\xfc\xa9\xc8\x52\x09\x8e\xc5\x43\xfb\x5e\x20\xd0\x35\x79\x43\x7e\xef\x0f\x91\x1b\xda\xf7\x22\xe1\xc4\xa4\xcc\x51\xb6\x1e\x13\xe2\x69\xdf\x83\xc4\x45\xba\xdb\x4b\x7d\xbe\x20\x98\xb6\xfd\x26\xad\x63\xd6\x07\x6f\x60\x5a\x73\x74\x05\x2a\x08\xb6\x65\x2b\x2b\x8b\xe0\x5e\xaf\x4f\x45\x82\xd4\x87\x8d\x2f\xb0\xce\xdf\x20\xef\x94\x5b\xb4\xef\x0b\x8e\x29\x22\x83\x7e\x43\xff\x7c\x6c\x11\xfc\xd0\x93\x3d\xa0\xcc\x27\x4f\x3a\xa4\xbe\x91\xb1\x2c\x8a\xe3\x50\x3f\x5b\xfb\x21\xd3\x18\x0a\x9c\x79\x29\x21\xbb\xff\x07\x5a\x76\x9d\x6d\xfe\xd0\xca\x63\x69\x3f\x8c\x7c\x66\x0b\x23\x18\x62\xe3\xb9\x30\x38\x99\xfc\x50\x28\xcc\xbe\xf0\xaa\x82\xf1\x71\xe8\x87\xda\x34\x53\xf4\x13\x7c\xd8\x2a\xa2\xd2\x4a\x5c\xca\x0a\x69\xe6\xf4\x87\x9e\x89\xcf\x7c\x22\xac\x73\x67\x92\xf8\xae\x53\x6b\x34\x4d\x1b\x54\x58\xdb\x85\x5c\xbf\x38\x58\xd5\x18\x7a\x66\x7b\x8f\xed\x07\xa3\xc0\x47\x46\xbc\xe5\xa5\xaf\x26\xa1\xfd\x58\x30\xd2\xc2\x92\x17\x2f\xa9\x70\x69\x57\x3f\x89\x0c\xb5\x1a\x57\xca\x70\xf3\x36\x9f\x9b\x0d\x6e\x7f\x74\x78\xf9\x89\xd0\xc8\x52\x82\x79\xfc\x7a\x5f\xec\x2e\xa7\x53\x91\x3f\x5e\x46\x19\x5b\x5f\x78\x09\xeb\xe4\x60\x5b\xb6\x83\x6f\xeb\xc7\x7d\xec\xbe\x5e\x44\x86\xba\xcd\xb6\x34\xad\x67\x9b\x0f\x9e\x9c\x64\x46\x79\xbe\xeb\xd5\xb1\xf2\x6f\x9f\xb4\x27\x69\x5f\x72\x82\xed\xae\x48\x28\xb6\x2c\xea\x7b\x5e\xf5\xd8\x28\xb5\x2f\x85\x8f\x36\x10\x7e\xca\x4e\x4a\xf5\x83\x6b\x29\xcf\x94\xcb\x2a\xc3\x66\x83\xe2\x20\x1f\xcc\xb4\xc5\xee\xdd\xe3\x7e\x33\x26\x08\xd6\xbe\xf2\xe3\x20\x69\x51\x1a\xeb\x1c\xc9\x57\x0d\xcd\x73\xbb\xab\x54\x4c\x21\x6c\x73\x4a\x08\x4f\xf0\xba\x66\xf5\xa7\x66\x93\x5b\xb0\xc3\xf0\x9b\xc1\x8b\xa8\xe8\xf1\x93\x0f\x78\xe3\x87\xeb\x1c\xbc\x04\x3b\x0e\xda\x8a\x6b\x07\x03\xc2\xce\xea\x09\x78\xc7\xe8\xbb\x42\x8a\x10\x2b\x5b\x05\x81\x1f\x45\x99\xa9\x5d\xce\xcf\xd5\x4b\x51\xaf\x2d\x2b\xcb\xf8\xfe\x42\x6a\xdb\xf7\xce\x86\x24\xc1\xfd\x60\xb0\xad\x13\x59\x29\x4d\x5a\xf0\x09\xca\x4d\x91\x3b\x7a\x38\x1d\x10\x61\x84\xbf\x2d\xd7\x04\x76\x27\xf6\xc2\xe8\x80\x68\x8a\xbc\x7d\x86\x0b\xea\x22\x5f\xaf\x06\x02\x63\x22\x8b\x9b\xd6\xcc\x7e\x06\x2f\xf0\x62\x26\xcd\x59\xdb\x44\x4d\x48\x29\x30\xe9\xd4\x06\x9e\x62\x3a\x76\x99\x5f\xd7\x53\xa3\x03\x4a\x63\x7c\xdf\x69\x85\x09\x1e\x35\xbf\xce\x1c\xa0\x56\x07\x34\x60\x48\xc9\x06\x16\xda\x41\xbf\xed\x96\xe7\x0e\x86\xdd\x4c\x10\x36\x62\xc0\x0c\xd7\x5d\x51\xee\xe0\x83\x26\x05\x1d\xd0\x48\x79\xa2\x7b\x0c\x4f\x90\xf3\x6c\x44\xae\xaf\x03\xdf\x0b\x91\x30\x74\xb3\x7e\x9c\xaf\xf6\x87\x33\x94\xcf\xdb\x87\x07\xf7\x7d\xbe\x0e\x0c\x68\xd2\x14\x26\x5e\x10\xac\xdd\xb7\x16\x41\xa0\x43\xdd\xf5\x11\xfe\x0e\xd7\x0d\xaf\x5e\x3f\xc4\x5c\x8f\xee\x30\x64\x31\xeb\x44\xf1\xac\x8e\xd0\x24\x97\x4f\xef\x33\x3a\xc6\x06\xd5\xcd\x6c\x39\xb8\x11\x46\x8c\xa0\x2a\xc2\x0b\x3c\x36\x5c\x4c\x01\xa3\xcc\xba\xbb\xdf\x01\x5b\x1d\x77\x23\xd6\x52\x1d\xb0\xc0\x72\xc6\x73\x0d\xb3\x91\xec\xaa\x0e\x58\x4c\xdb\xa3\xb3\xe6\xaf\x69\x7e\xdc\x40\x13\xb4\x55\xd3\x5b\x26\x60\x42\xd1\xa0\xd7\xb2\xfa\x2f\x9d\x89\x80\x29\x81\x7d\x86\x29\xba\xc5\xef\x76\x35\xc6\x37\xb3\xa4\xa3\x00\x32\xd0\x8c\x5e\x58\xd8\xbb\xe9\x28\xf6\x10\xa9\xa9\x00\xc1\x14\x86\x59\x63\xf8\x60\xa2\x38\xa1\xd6\xa6\xef\x4c\xd7\x73\x73\xb2\xf2\xd7\x5b\x3d\xc3\xd1\xe7\xa4\x6f\x69\x7b\x6d\x9b\x63\x79\x3d\xd7\xd5\x75\xf0\x4a\xe2\xd8\xc7\x6e\x8b\xf9\x7a\xbf\x98\xed\xbe\xfe\x52\xfe\x45\x07\xb1\xf2\xb8\x85\xae\x7c\x2f\x7e\x8e\x5e\x10\xf7\x8c\x4b\xff\x59\xc6\x71\xb2\x0f\xc4\x7e\x5e\x70\x8e\x95\xeb\x57\x38\xe5\xfc\x38\xb8\x53\xe9\x03\xef\xa1\x35\xd4\x0f\x48\xab\x76\x4c\xc6\xe8\x5d\xcf\xd3\xc6\x13\xcd\xba\xa2\xab\x0e\xb0\x81\x14\xa9\x64\x2c\x08\xe5\xf3\xcc\x67\xa0\x7c\x43\x5b\xff\x04\xc5\x39\x83\x66\xeb\x5a\x1e\xdf\xfe\x45\x15\x93\x88\xcf\xb5\x30\xb1\xaf\xd7\x33\x94\xcb\xf4\x6d\xe4\xe2\x04\x10\x26\x7e\x9f\xa2\x54\x35\xa1\xc9\xff\x70\xf9\x7a\x2e\xdc\x91\x15\x40\xc2\xd0\xad\x95\xbc\x54\xbb\xba\xbc\x48\xc7\x0d\xd4\x8e\x83\xb4\xfd\xc9\x0b\x9e\x65\x96\xcc\x6d\x39\x26\x0e\xd6\x81\xe6\x02\xf3\x92\x4f\xab\xe7\xbb\xed\xf3\x66\xf6\xb8\x58\x1d\xee\x56\xab\xc3\xf3\x6c\x6f\x59\x7a\x74\x48\x02\xd3\x71\x6c\x13\x4a\x3d\x9c\x55\xfb\x00\x42\x92\x08\xac\x89\xf6\x3c\xf1\x41\xa1\x30\xf4\x00\x22\xde\xc2\x8e\xb0\x32\xd1\x3d\xd8\xd8\x4d\xd2\x21\xf6\xb7\x3c\x5e\x64\x06\x97\xea\x3b\x36\xd0\x58\xd5\x75\x77\x21\xca\x4d\xad\xea\xdd\x21\x43\x26\x1d\xc5\x90\x72\x23\xe4\xd5\x67\xab\x98\x7c\x77\xa1\x4f\x7c\x04\x0f\x62\x3e\xab\xad\x33\x85\x3e\x31\xad\x5e\x0f\xdb\xfb\xc3\x23\xbc\xcf\xe1\xe3\x04\xcb\xc0\x40\x84\x7e\x12\x9a\xfa\x2f\x54\xf5\xa1\xec\x75\xa9\x36\xe7\x70\x79\x32\xbc\x59\x52\x5e\xba\xfe\x38\x1d\xfa\xca\x00\xf4\x8e\x50\xcf\xa1\x6e\x26\xce\xc7\x02\xc4\x3a\x0c\x38\xe7\xc4\x75\xff\x58\xe9\xaa\xe1\x8f\x66\x9e\x69\xf6\x68\x22\xc1\xdf\xfb\xfb\x20\x64\x81\xc1\xde\x1f\xa1\xfe\x0e\x2f\xa9\xcc\x90\x3d\x62\xea\xc1\x45\x9e\x8f\x85\xd2\xf7\x17\x5e\x57\x9b\x6b\x2f\x71\x16\xc6\x31\xa1\x36\x71\xb6\x7d\x83\xf2\x2d\x85\xf7\xe9\x33\x32\x8c\x39\x09\x0c\x11\x58\x73\xfc\x3a\x52\xc1\xf6\x3a\x5a\x80\x93\x51\x3b\x18\x7e\xf2\x83\x4e\x73\xac\x73\x7d\x4d\x73\xf4\x8a\x6d\x36\xd1\x9c\xdc\x7b\xee\x24\x33\x75\xc8\x21\x44\x83\xff\xc4\x2f\x55\x87\xe4\xd4\xa1\x08\x39\x62\x7b\x91\x7b\xec\x5b\x6e\x74\x1d\xdb\xc1\xd8\x80\xb2\xab\xcb\xe9\xd4\x04\x0d\x45\x59\xb7\x54\x34\x3a\x14\x09\xd1\xc4\xa6\x16\x07\xce\x9f\xcb\x3e\x85\x82\x87\x7e\xc7\x14\xfe\xa5\x17\xba\x87\x42\xc5\xe8\xbc\xae\xea\x17\x2c\xe8\xae\x7e\x9e\xb3\xa2\xec\xd6\x91\xf4\x44\xd8\x6a\x15\x97\x03\x7e\xe3\x7e\xc3\xb6\x9b\x4d\xb9\x69\xb5\xab\xd4\x02\xf2\xba\x1a\x86\xc8\xa1\x8c\x05\xc2\x93\x17\x17\x2c\xa0\x3c\x5f\x26\x52\xf1\xed\x4d\x4b\xe1\x39\x25\x8b\x0e\x51\x30\x33\x11\x8d\x9d\xa2\x02\x40\xff\x6f\xde\x04\x65\x65\xcf\x58\x85\x2a\x8c\x90\x85\xc0\x25\x53\x90\x9a\x69\x78\xaf\xe0\x33\x65\x97\xc3\x0f\x48\x5b\x8c\x19\x38\x35\xa0\xe1\xd1\x16\x6a\x6a\x82\x8c\x4b\xbe\x49\x73\x50\x4f\xdd\x96\xd6\x71\xa4\x3a\x14\xd4\xa2\xc8\xab\xcb\x09\xa1\x31\x9f\xf8\x6b\x8c\xf8\x0c\x91\x7a\x99\x21\x10\xee\x09\x4d\x69\x46\xa9\x49\x8b\xa2\xfc\xcf\xa8\x94\xc2\xa8\x0a\xa0\xc3\x0e\x1a\xfd\xe3\x65\x71\x11\x19\x2c\xc7\x72\x56\x9a\xf9\x8d\xf1\x33\x86\xf4\xa9\xb4\xe8\xf4\x96\xf3\x54\x33\x3f\x60\x36\xd7\x8e\x49\xfa\x4d\x9a\xf7\x14\xbd\x35\xf3\x85\x11\x8b\xcb\xe1\x7a\xe2\xe5\x57\x5e\xa1\x90\x83\x1a\x7f\x07\x28\xe0\x2e\x1f\xbc\x56\x46\x8f\x73\x38\x25\x90\x01\xd5\xd6\x9e\x0f\x95\xb1\x7b\xa5\x1a\x16\x28\x03\xbb\xfa\xba\xfd\xbe\x7a\x5e\x3c\xcf\xee\xf6\x87\xfd\x9f\x4f\xce\x8e\xb3\x90\x2a\x17\x64\x5b\x71\x9d\x79\xf1\xd3\x38\xc8\xa3\xaf\x0b\x83\x38\x66\x63\xc1\x8c\xd1\x94\x24\xa4\xc6\x03\x71\xe8\x93\x25\xbc\x8d\xf1\xf4\x9a\x31\x2a\x30\x6b\xff\x3f\xf7\xcd\xe2\xda\x3a\x98\xba\x66\x2c\x0c\x02\xdf\x22\x7d\xd0\xd9\x76\x7f\x67\x26\xe5\xd5\x04\x46\xbc\x39\x68\x70\xc1\xba\xd1\x28\x26\x98\x39\xdc\x5c\x4e\xd5\xfe\xa5\x89\x36\xda\x0b\xc6\x54\x60\x64\xf6\x7d\xf3\xbd\x6f\x6c\x58\xe2\x7b\x98\x31\xc8\x40\xd7\x8c\x8c\x7e\x45\xe2\x07\x68\x17\x0e\x35\xf0\x93\x3b\x63\x47\x53\x82\xb6\xe3\xd6\xf6\xb8\x7e\xab\xc0\x28\x68\xd8\x5d\xe1\x26\x2a\x4d\x6d\x5c\xb0\xe4\x35\xb7\x67\x6e\x9f\xdf\x5a\x33\x1e\x47\x48\x94\x6a\x4e\xc1\xb9\x39\x37\x86\xb9\x07\xc6\x55\x1c\xf5\x50\x57\xc7\x12\xa0\xa3\x5f\xd7\x4c\x78\x04\x45\x60\x50\x13\xf8\x1e\x19\x7b\x5a\x26\x53\xcd\x84\x1f\xe3\x17\xfc\xe0\xb5\xec\xf4\xd5\xee\x00\xaa\x75\xbe\xfb\x87\x8b\xa2\x9d\x18\x11\x69\x54\x3b\xf2\xab\xa3\x1d\xa8\xda\xc1\x58\x60\x83\xce\x1f\x7f\xee\xdb\x3f\xa9\x18\xc1\x53\x28\x85\x45\xdd\x5f\x95\x4d\x7c\x75\xa9\x10\xf8\x20\x1e\x66\x10\x04\xb1\x89\xdd\xaa\xba\x50\x29\xcf\x1d\x8d\xc3\xdf\xa3\xb2\x00\x03\x2d\x5c\x6c\xbc\x50\xbd\x4a\x1d\xd3\xbe\x46\x46\xa3\x26\xfc\x6f\x1e\xce\x41\x95\xe9\x5b\xf7\xa6\xb5\x30\x3e\xc8\xe6\xb3\x62\xc8\xf0\xab\xb4\x00\xb3\xf5\xf8\x2b\xcc\xde\xf9\x75\xda\x77\x67\x5a\x9a\x66\xdf\x36\x4c\x9e\xbd\x41\xc9\x8f\xf0\x94\xfe\x84\x4f\xe8\x66\x75\x44\xbc\x58\x05\x8e\xed\xef\xdb\xf3\xfa\xcb\x54\x0d\x26\x22\x82\xfb\xcc\x19\x80\xff\xb8\xbe\x68\x1d\x79\x44\x98\xb6\xd8\x97\xe2\xbd\x83\x57\xe2\xdf\x23\x07\x2d\x3c\xd8\xec\x40\xfa\x0f\xd8\x1c\xbc\x9b\x45\x49\x8c\xfa\x53\x0a\xb2\xf4\xcd\xa5\x48\xe6\x48\x36\xf2\x61\x99\x25\xa2\x24\x41\x0a\xf7\xdf\xaf\x02\xca\xaf\x3c\x57\xd9\xb8\x20\x12\xd1\x80\x20\xf5\x70\x8f\x2e\x74\x8a\x74\x6b\xf8\x20\xa8\x08\x9d\xfa\x93\xa5\x36\x6d\x39\xa9\x9a\x0f\x1c\xf8\xad\xa4\x81\x8e\x7c\x2f\x94\xcc\x15\xbd\xa5\x4d\x7b\xb9\x34\x57\xe4\x7b\x02\x0b\x7c\x7b\x38\x1d\xa1\xcd\xf8\x46\x3e\x37\x0d\xcf\x96\xea\x6a\xc0\x50\xaa\xa3\x90\x25\x28\xbb\xa5\xc0\x28\x5e\x01\x66\x09\xbe\x17\x3d\x77\x20\x62\xbe\x32\xec\x0a\xe8\xc6\xf6\x53\x45\x11\xe3\x3e\xee\x02\x7c\x98\xbb\x7a\xdc\xd0\x17\xbb\x69\x52\x20\x10\xa2\x4a\x4f\xeb\xbc\xaa\x79\x96\x99\xed\xd5\xf3\x1b\x22\x06\x42\x1b\x92\x8e\xb2\xba\x4f\x75\x07\x95\x88\x22\x9f\x68\xaf\x8b\x59\xee\x2e\xb9\x1a\x24\x3a\xa3\x28\xa4\x88\x67\x90\x48\x0b\x73\x29\x61\x59\x9c\x78\x9a\xdf\x15\xe5\x97\x69\xb4\xdc\x34\x94\x2b\x8a\x64\xac\x2c\xef\xd7\x4c\xeb\x34\x4b\x2d\xab\xcd\x87\xad\xf0\x3a\x8a\x49\x10\xa8\x36\x27\x75\x2b\x09\xad\xa3\xd8\x57\x68\x6f\x79\x96\xb5\x2c\x9c\x6e\x88\x07\x61\xa7\x01\x3a\x9f\xff\x3e\xfe\xa8\x34\xfa\x6d\xee\x1e\x6c\x3e\x70\xb4\xfe\x92\x90\x21\x49\xef\x6e\xbd\xfa\x98\xc7\x5c\x47\x89\x32\x54\x12\xae\xe3\xe0\x19\x85\xc3\xd3\xfc\xd8\x97\x72\xd2\x11\x8f\x13\x16\x3a\xd9\x88\xf6\x8f\x20\xa0\x5f\x35\x98\xe5\x75\xfa\xf7\xe5\x46\xc5\xce\xce\x16\x7e\xcc\x8d\x51\xaf\x2e\x27\xb0\x46\xb7\x7f\x06\x45\x22\x96\xb8\x15\xcf\x88\x66\x39\xc8\x5e\x60\x14\x09\xe1\x19\x72\x3d\x9e\x63\x12\x19\x8f\xff\x9e\x8c\xf5\x6f\x53\xb4\x3e\xd3\x66\x6d\x14\x74\x47\x92\x26\xb1\x4d\x20\x5a\x8c\x3d\xda\xaa\xdb\x5e\xf8\x66\xaa\x30\xea\x30\xe6\x24\x18\x71\x33\xeb\x48\x11\x1f\x8b\x71\x8d\x6d\x6d\x5c\xb3\x07\xfe\xcf\x75\x51\xb8\xcc\xab\xfb\x2d\x8a\xfa\x08\x04\x73\xad\x70\xb7\xe1\xfb\xf0\x5b\x95\x94\x48\x28\xdc\xe5\x73\x57\xf5\xb4\x7e\x8d\x8e\x80\x78\x88\x10\x5d\x2f\xb6\xde\xa0\xa4\x19\x01\x31\x4e\x58\x05\xf5\x82\x9f\xb1\xff\xbb\xc5\x4a\x4c\xb6\x51\xba\xcf\x31\xa3\x49\x6d\x1c\xc1\x45\x51\x64\xaa\x78\xcf\xbb\x35\x1d\x90\x7e\x67\xa7\x8e\x20\xa1\x81\xf5\xa7\xdb\x53\xb9\x5d\x47\xcd\xa1\x85\x6c\x68\xaf\x50\xcb\x17\x93\xc9\x75\x63\xda\xa3\x60\x23\xfa\x79\xaa\x10\x0f\xda\x84\x02\x38\x13\x90\xec\xc6\x74\x55\x0f\x9f\x79\x4c\x62\x82\xed\x30\xe9\x0f\x9e\xd7\x7f\xfc\x0e\xd7\x51\x21\x22\xf6\xfc\x08\xcd\x0c\x14\xd5\x72\xb6\xfb\x3a\xfd\xe0\x62\xcf\x07\x5f\x77\xc2\x7b\x6d\xa5\x21\x76\xe3\x49\x14\x9b\xc4\xa7\x4c\xcf\x29\xe4\xf5\x66\xbd\x1f\xdd\x89\xa7\x29\xee\xfa\xe6\x4e\x72\xfe\x90\x22\x0a\x1c\x5a\x16\x76\x1d\x53\x12\x18\xd6\xae\x9f\x6d\xcf\xac\x8e\x29\x23\x9e\x68\x9d\x9d\xc6\x10\xa6\x35\xb6\xa0\x18\x97\x6e\xa2\x88\x1e\xd3\xc8\x77\x30\xa9\xa7\x54\x8e\x7e\xae\x4f\x25\x76\xd7\x14\xef\x39\x94\xc6\xed\x31\xf0\xb0\x5f\x09\xf9\xba\xcf\x47\x9a\xab\x9e\xf0\xc9\x43\xcb\x5a\xa1\xe3\x80\x44\x48\x83\xd1\xb1\x21\xb4\x3e\x55\x1c\x06\x09\xf6\xb6\x34\x01\xbb\x2b\xcd\xc5\x8c\x29\x24\xc5\x42\xd4\xb1\x93\x14\xe0\xf9\x32\xad\x64\xe7\x13\xc6\x8c\x27\x61\xdf\x90\x18\x21\xb7\x7e\x96\xd0\x4e\x8c\x98\x88\x6c\x94\x68\xad\xe6\xb7\x72\x20\x65\xa4\xe3\x28\x81\xd8\xb7\xf8\xfa\xb7\xe2\xf5\x86\xdb\xc7\x4e\x8b\x3d\x8e\xd9\x75\xfd\xad\x82\x41\x0a\x26\x8e\x01\x44\x07\xa1\x98\x5f\xae\x73\x2e\x5f\x51\x6c\x74\x78\x85\x24\xf4\xb0\xd7\xb9\xb1\x64\xbc\x86\x92\x67\x2e\xd7\x39\x0e\x5d\xe2\x24\x0a\x02\x8d\x9d\xf1\x4d\x14\x65\x82\xf5\xf1\x94\xc4\xd4\x68\x51\xc9\x7e\x04\xa0\xb8\x8c\x09\x36\x74\xcc\x69\x80\x48\x38\x38\xa1\xa3\xe5\xb0\x98\x9f\xc2\x25\x6f\x5f\xb5\x90\x89\xe7\xc4\xcb\x5b\xcc\xda\xc0\x15\x8f\x65\x22\x65\xdc\x51\x50\x4e\x50\xce\x7c\xea\x42\xda\xab\x28\x66\xc2\x20\x74\xdd\xf0\xbc\x1a\x50\x00\xe8\x58\xc5\x12\x93\x36\x86\x8f\xb2\x97\x4d\x89\x21\x49\xd0\x8f\xda\x5c\xb0\x62\x7b\x97\x96\xa0\xc4\x35\x6c\x57\x18\x88\x10\xd3\xd6\x76\x3d\xac\xab\xbb\x5b\x01\x71\xdd\xbc\x53\x4c\x5f\x57\x17\x31\x02\x2e\x8f\x1e\x89\x0e\x54\xe0\xb6\x56\x67\x1f\x87\x52\x7c\x3a\xd6\xb1\xc6\x54\xac\x46\xfc\xee\x7a\xb1\x6d\x6b\x38\x6e\x02\x80\x73\xe4\x90\x3e\xf2\xb9\xcf\x32\xd5\x65\xa8\x13\x12\x00\xda\x26\x05\xd9\x02\x59\xae\x4f\x23\x35\x4f\x9d\x90\x30\xc2\x0a\x83\x4e\x73\xf5\x08\x3f\xeb\x3f\xa1\x27\xb8\xdc\x63\xfb\x6a\x66\xc6\x58\xf7\x79\xe1\xd5\x58\x4a\xf8\xb7\xd1\x35\x85\xc6\x7d\xbc\xe4\xf5\x13\x1f\x64\x9d\x12\x02\x11\xf6\x24\x58\x40\xdd\xa7\x1c\x03\x3a\x69\x7c\xef\xc8\x0a\xb6\x18\xf1\xce\x16\xf5\x64\xc9\x87\x62\x37\xd3\xe7\x60\x53\xf6\xbf\x17\xa9\x53\x9d\xfd\xe0\xaa\x01\x47\xf4\x35\x9a\xb0\x9d\x49\xa3\x95\xa9\x9a\x7c\x82\x1e\xf8\x78\x24\xbb\xcd\x67\xfb\x8d\x46\x0f\x91\x82\x87\x08\xa6\x13\xff\xd9\x18\xc3\x66\x67\x23\x54\xdb\x99\xa0\xc4\x0f\x14\xa6\xb2\x73\x78\x37\x47\xdb\x64\xf5\x25\xf1\x03\x6d\xb9\x12\x72\xb5\x2f\xe6\x90\x03\xea\xdb\x97\xd7\x51\xfa\x24\x09\xc0\xb0\x90\x54\x50\x1f\x5e\x8a\xea\x3c\x19\xd2\x24\xa1\x27\x11\x63\x97\xe6\x69\x6d\xcc\xfd\x24\x76\x6a\xf4\x21\xdf\xf4\x3c\xd4\x9d\x20\xee\xd8\x11\x49\xc2\x48\xa2\x7a\xd5\xf3\x76\xb7\x98\x0d\x38\x69\x68\x3c\x7e\x95\xf6\xcc\x77\x07\x78\xc2\x22\x26\xbd\x4e\xb9\xcc\x46\xe8\xdf\xb0\xa7\xaa\xfb\x1d\xb7\x26\xaa\x7b\x4a\x4c\x02\xf1\x1d\x6f\xc8\xa5\x82\x95\x3a\x82\xeb\x22\x1a\xce\x8c\xa2\x44\x2a\x57\x1f\xc7\xf3\x7e\xea\x1d\xc7\x81\xf6\x9c\x54\xd3\x1d\x4f\x3f\xa7\x90\xd2\x09\x32\x6a\xf7\xe3\x50\x2c\x0a\xf7\xf8\x9c\x74\x92\x78\x14\x1b\x43\xe7\xcf\xb3\xc7\xa5\x41\xef\xb4\x43\xdc\xd0\xa6\x8a\xcb\x55\x70\xf9\xba\xbf\x9e\x61\xff\x5e\xb4\xa3\x52\x21\xbd\x40\x5a\x63\xd9\x67\xff\x52\x16\x97\xe3\xcb\xee\x9d\x97\xd3\xfd\xa0\x3a\x49\x94\x89\xa5\x9c\x76\xdb\x5a\x3f\x82\x84\xaa\xe2\xad\x39\x49\x38\x33\x0c\x8f\xab\xfd\xd7\xc3\xb7\xdd\xf2\xb0\xfa\x63\xf1\x75\xf6\x78\x6f\xea\x0b\x87\xf5\xe3\x61\xb1\x7a\xdc\xef\xda\xd9\xd2\x00\x2e\xb3\xe2\x38\xe0\x66\x98\xf6\x1e\x13\x2e\x13\x4c\xb8\x08\xa1\x7c\x16\xc4\x81\xbb\x8c\x60\xa6\xbe\x8c\x15\xb9\xae\xa7\xc0\x8d\x26\x80\x5c\x70\x77\xcb\xc5\xc0\x3c\x28\xdf\xc7\x0e\x85\x7b\xc8\xd3\x8b\xe5\x11\x68\xc7\x74\x88\x09\x6b\xab\xa5\xf9\x11\x4e\x73\x7c\x60\x4c\xa1\xf7\xba\x1b\xd1\xbe\xc2\x42\x86\xb5\x47\x28\x7b\x8a\x8e\x28\xba\xa3\x37\xb5\xdf\xf1\xa7\x43\x40\x5a\x89\xcd\xec\xf1\x87\xbb\x4d\xcd\x35\x26\xf8\x9c\x75\xb9\xd1\x14\xd3\x9c\x78\x3e\xd3\x03\x60\xf1\x54\xb7\x69\x33\x4f\x18\x09\x82\x12\xce\xbc\x6c\xdc\xbd\x15\x2f\xb3\xeb\x9d\x79\xd5\x3d\xb6\x7c\xcd\x49\x98\x38\xae\xd2\x75\x55\x5d\x9a\x23\x68\xad\xaa\x11\xd3\xd1\x64\x14\xe3\x2e\xc0\x22\xf4\x73\x51\xec\xca\x74\x69\xcc\x87\x0c\x18\xc3\x80\x8b\x93\x38\x10\x64\x48\x17\x76\x53\x7d\xb5\x53\x3d\x1a\x7a\xa4\xe5\xf1\xee\x13\xb3\xfe\x97\x76\x11\x41\x64\x43\x02\x4e\x03\x00\xbb\xbf\xef\xd2\xe3\x0b\xe6\xc4\x4b\x98\x2c\x94\x70\x5f\x68\xc4\x94\x1f\x9c\x70\x6e\xe3\x4f\x5e\xce\xb8\x25\xdd\x8e\xe5\xbe\x34\x39\xf8\xe6\x21\x62\x58\x35\xfc\xe9\x41\xc0\xb0\x25\xb2\xc5\xf3\xbb\xcc\x1a\x0f\x58\x92\x90\x0e\xd1\x65\xf5\x1c\xef\x2e\x23\x79\x23\x37\x9b\x1b\x7c\x41\x73\xb8\x17\x45\x36\xca\xa8\xf1\x40\xfb\x10\x3b\x82\x6f\x04\x18\x8c\x3e\x1f\x7a\x91\x4b\xe5\xe3\x93\x9c\x5f\x67\xa8\x24\x36\x62\xf2\xd3\x3c\x94\x06\x81\x63\xc9\x4a\xd6\x39\xd6\x96\x75\x2a\xf7\x63\xe6\x18\xcd\x43\x15\x62\x41\x1f\x71\x37\xf5\x45\xc0\x0d\xd0\x79\x3c\xdf\xa8\x7b\x57\xef\xfc\x3c\x6b\x05\x0e\xdc\xa0\x26\xa8\x94\xef\x40\x3a\xab\xfd\x57\x37\xc4\xa2\x50\x5a\xae\xe2\x37\xe0\x59\x8f\xcc\xfd\xc3\x1d\xf9\x0b\x17\xcf\x5e\x38\x22\x11\xde\xd0\xfc\x72\x7d\x36\x5d\x21\xb8\x31\x3f\x98\x1c\x2a\x4c\x68\x2b\x78\x83\xac\x38\x43\x79\xe0\x4a\x1d\xcc\x29\x72\x98\x0f\x5c\x79\x1e\xfb\x24\xb2\x32\x87\x5f\xcf\x4b\x50\x17\xd9\xa5\x7f\x78\xcc\x62\xac\x9d\x3d\xa3\xda\x43\x9a\x1f\x51\x63\xbc\x97\x85\xe2\x89\xe6\x18\xd7\x9f\xcd\xc9\xc3\x8f\xf0\xf5\x72\xe2\xb9\xc3\xc3\xdb\x59\x9c\xfa\x18\x91\x1e\xd2\xea\xb1\xa8\x37\xe9\xcf\x9e\xf4\xcd\xe8\xde\x79\x14\x62\xe6\xf4\x6c\x7a\xaa\x0c\xe3\x77\x9f\x3e\x5c\x73\xce\xa9\x01\x99\xfe\x62\xc3\x71\xad\xf1\x5b\x67\xcb\xff\x88\xcb\x3f\xff\x2c\x8a\xd3\xe9\xd2\xe9\xf5\xd8\x49\xc2\x27\x48\x11\x72\xbc\x98\xfe\xda\xc1\xcd\x88\x20\xa2\x86\xcc\xe5\x5b\x05\xa5\x61\xb3\x53\x77\xb7\xe4\x5c\x43\xd7\x8a\x0b\x16\x22\xdd\x41\x75\x39\xad\x32\x1b\x9b\x9b\xd3\xdf\x05\xfc\x5c\xc4\x31\xe2\x17\xcf\x5a\xda\x8e\xec\xac\x0d\x61\xb9\x00\x16\x09\x73\x60\xc3\xb9\xb6\x60\x12\xdb\xab\xd3\xfd\x58\x3b\x59\x52\x1a\x9b\x4c\x56\xfa\xf7\x05\xfe\x07\x05\x63\xc7\x9b\x4e\x85\xd4\x6a\x3d\xd7\x3c\xeb\x7a\x89\xed\x28\x50\xc9\x6c\xea\xe3\x0c\xb9\x93\xe3\xdd\x17\x0e\xd3\xd5\x7e\x60\x6e\x7b\x28\x3f\xcc\x63\x70\xf0\xa9\x87\xcd\x92\x25\xb4\x39\x07\x0e\x21\x05\xaf\xad\x58\xde\x0d\x7b\xd3\x38\x28\x0f\x43\xe9\x53\x9a\x5b\x34\x0a\x96\x9d\x57\x6d\x78\xc4\x31\xfb\x6a\xd6\xfe\xea\x78\x6c\x6f\x5b\xc7\xdc\xf7\x2d\xfe\x6d\x9f\x8e\x04\x29\xb5\x20\xc4\x10\xf1\x6c\x45\x09\xaa\x45\x5a\x08\x12\x25\xa6\x67\xf4\x0f\xf7\x17\x1a\x11\xa4\xe7\xae\xde\xd3\x5a\xbe\xb8\x12\x7f\xe7\x19\x09\x9f\x05\xf8\x3a\x30\xb0\xb2\xfa\xe7\x6e\x88\x07\x89\xef\xf8\xaf\x2d\x51\xfc\xf0\x36\x7c\x61\xea\x57\x7f\x71\xf9\x7a\xc8\x8b\xae\x80\x2a\x82\xd0\xe0\xf7\xac\xa6\xa6\x21\x7e\xeb\xb5\x34\x0c\x37\x86\x08\x3d\xe3\x62\x98\xdd\xbb\x2f\x5c\xc5\xa6\xbf\x9b\x45\xc8\x43\x07\x08\x1b\x10\x3d\xd8\x61\x16\x28\xc4\x3e\x73\xa5\x16\x97\xaa\x2e\x4e\x06\x31\xfa\x54\x16\x6f\xa9\x82\x72\x22\x32\x12\x0c\x12\x3c\x7d\x1f\x8a\xe3\x27\xb8\x03\x3b\x39\x0a\x25\x26\x10\xab\x8c\xbf\x41\x3e\xeb\xa7\xbb\x45\x24\x12\xec\xe5\x7b\x7a\xde\x6e\xdc\xdf\x12\x2f\x30\x59\x23\x53\xa8\xbe\xe3\x55\x0d\xf9\x6a\xff\xb5\xcb\xdc\x88\x04\x0c\xe3\xb7\xc1\x44\xd5\xb0\xd5\x4f\x59\x9b\x61\x17\x9c\x50\xb4\x5e\x2f\xbc\xda\xbd\xa6\x1d\xf1\xf2\xe7\x31\xb9\xe0\x34\xe0\x86\x1f\xce\x90\xcb\xcd\xd3\xe2\x84\x48\xab\x87\x3e\x16\x5a\xf0\x40\xa3\x83\x8f\xaa\xed\x53\xad\xb8\x82\x27\x89\xeb\x6b\xfc\xdf\x4b\x51\x0f\x2a\x84\x42\x50\x62\x40\xfb\xa6\x56\xb7\x3b\xf1\xb2\xde\x9d\x01\x94\x2d\x74\xba\x69\x81\x40\x14\x97\x41\x2b\xb7\x7f\x8d\x94\x29\xc4\x00\x3f\x0d\xa5\x70\xb4\x10\x89\xc6\x80\x70\xb9\xfd\x71\xd8\x7f\xfd\xd6\xfe\x59\x28\x6c\x0f\x79\x9a\xb5\x18\xf9\xe6\x4f\x84\x5a\x37\xfd\x47\x6a\xa5\x3e\xab\xe1\xa2\x11\x8a\x5b\x15\x65\x78\x35\x44\x09\x6d\x8c\x2d\x54\x10\xc7\xa6\xdd\xf5\xad\x78\x85\xa1\xf8\xbf\x9d\x02\x54\xa2\x44\x8a\x49\x2b\x7c\x40\x61\x3e\x7a\x01\xa0\xa2\x30\xec\x91\x4f\x5f\x3a\xa2\x0d\x2d\x40\x33\xbb\x2a\x7a\xb5\x96\xd1\x05\x74\x42\xb9\x03\xad\x16\xca\xc8\xfe\x8d\xee\x4b\x27\xa6\x94\x65\x80\x2c\xcf\x20\x8b\x31\x6c\x40\x92\x50\x84\x4e\x2a\x1b\x8d\xde\xae\xc8\x14\x6a\x2f\x8c\xe6\x49\xe9\x07\x6e\x11\x36\x21\xc9\x71\xb4\xcd\xa5\x97\x44\x56\xed\xa8\xa8\x60\x53\xbb\x97\x2b\x29\x25\x08\x61\xd9\x9d\xa1\x3c\x3d\x70\x51\xb5\x03\x3c\x41\x6e\x5a\x65\x89\x62\xb0\x63\xb4\x9a\x83\x6e\xf6\x81\xe5\x31\xc1\x5f\xd5\xa7\xb4\x6d\x3e\x66\x44\x5a\x1c\x24\x0e\x81\x4b\x77\x05\x46\xe4\xa3\x5b\x0a\x3c\x69\x9b\x7e\x85\xfb\x74\x10\x12\x6e\x2a\xad\x3f\x8d\x71\x6f\xce\xa6\x75\xde\xb1\x5e\xc8\x20\x64\xf8\x3b\x36\xfc\x35\xcd\x55\xd1\xfe\x99\x6b\x6c\x30\x11\x8e\x60\x08\xff\x84\xaf\xb0\xe6\x97\xf6\x4f\xca\x48\xb6\x3b\x34\xfb\xc0\xc7\xed\xa8\x68\xff\xcb\xec\x71\x21\xc3\x20\x0e\x5c\xa4\xdf\x4b\xb7\xbb\x51\x6e\x92\x9d\xf8\xfe\xf7\xc5\xb7\x34\x1f\xea\xf4\x69\x19\x42\x24\xe3\xce\x33\x5d\xf4\x7b\x12\xec\x94\x88\x12\x62\x52\x22\x99\x56\x50\x21\x40\x6d\x3c\x05\xa8\x72\x22\x06\x69\x3e\x48\x54\xca\x44\x0a\xc4\x31\xdc\x15\xa5\x3d\x86\x6f\xa4\xae\xb4\xe4\x7e\x84\x50\x80\xc7\xa2\xe8\x54\x47\xec\x98\xa0\x26\x29\xe6\xe0\xa7\xed\x59\xff\x2f\xfd\xbf\xcf\x2d\x99\x14\x2c\xc1\x04\xe9\x1e\x32\x38\x96\xfc\xb4\x6f\x79\x23\xa4\xe0\x54\xc7\xae\x19\xdc\xe4\xa8\x71\x91\x99\x7e\xf8\xc6\xa1\xaa\x6a\xde\x36\xf8\x48\x49\x12\xdc\x51\x55\x7a\x3a\x1b\x5e\xba\x29\x28\xe5\xe8\x2e\x07\x3c\x90\x83\x1b\x93\x61\xc4\x8d\x4a\xc2\x4f\x6c\xf6\xde\xbf\xf0\x1a\x7b\x33\xdb\x82\x8c\xd5\xd1\x6b\x77\x84\x8c\x22\x6a\xe2\x23\xf9\xc2\xcb\x23\x3c\x17\x62\x8c\x80\x90\x52\x0a\x8c\x61\xa0\x92\x65\xf1\xde\x57\x56\xb0\x13\x54\x1c\xe0\xaf\x90\xa6\xf4\x95\x8a\xcc\xc0\xb2\xf7\xc5\x44\xac\x22\x55\x2c\x91\x13\x37\xcd\x3f\xb6\x58\xbf\xae\x77\xf5\xd4\xb9\x7a\x09\x15\xa9\x14\x78\x49\x4b\x9e\xf5\xf4\xbc\x9a\x7f\xfb\xf3\x30\xdf\x3e\x7e\x73\xc6\x59\x11\x12\x22\xd4\x2e\xad\x9c\x43\xe9\xf0\xda\xb6\x31\x7f\x8a\x60\x41\x11\x9e\x20\x91\x40\x13\xe6\x2c\x32\x5e\x55\xa9\x74\x6c\x53\x93\xd1\xa1\xf2\xa8\x29\x2e\x21\x53\xcd\xae\xd0\xb5\xe4\x7d\xc6\x2c\xad\x68\x9c\x30\xe6\x36\x00\xaa\x32\x6f\x2f\xf5\x12\xd7\x3b\x7a\x24\x7d\x20\x91\xa2\x60\x20\x11\x28\x8d\xba\x28\x9c\x02\xd0\x64\x1c\xa5\x7c\x6a\x70\x82\xa6\xee\x72\x87\x66\xed\x4b\x3b\x06\xda\x90\xff\x1a\xfa\xc8\xe9\x08\x5b\xf9\xd2\x48\xb1\xda\x53\x14\x8b\xe4\xbb\xba\xc8\x61\x70\x8a\xaa\x20\x30\xda\xb1\x46\x11\x7a\x0c\x6d\x73\x93\x2c\x2f\x95\x2b\xbb\x1c\x4e\x2a\x6c\x2f\x00\x0a\xfd\xc5\xa7\xb2\x28\xf4\x56\xbb\x3f\x87\x21\xc1\x3a\x22\x0a\x92\x3c\xce\xe6\x0f\xab\xe7\xdd\x61\x31\x7b\x6a\xc7\x19\x47\x06\x91\x43\xe3\x86\x7e\x7e\xea\xa9\x50\x8a\xc8\x20\xea\xa0\x34\xac\x73\x1b\x43\x68\xbd\x58\x1a\x0d\x6b\xb7\x17\x14\x0b\x35\x96\xc3\x5b\xd2\x9a\xc4\xa2\xca\x12\x4b\x5a\x93\xb8\x89\x00\x58\xf0\xfd\xdf\x65\x0f\x31\xa7\x22\x2e\xd0\xf4\xef\xf6\xb3\xe7\xfd\x7e\xbd\x59\xb5\x03\x02\x88\xd1\xaa\x90\xaf\x8f\xf0\xfe\xb5\x38\x43\x8f\x90\x59\xab\x48\x1b\xc8\xd3\x41\xbe\xbc\xce\x2f\x57\x28\x1f\x4e\x75\x35\x43\x9b\xf1\xab\x1f\x17\x73\x0f\x5b\x91\x04\xd4\xfd\x2c\xa0\x8a\x15\x93\xa4\x85\x91\xa3\x9f\x39\x5a\x9f\x89\x1f\x63\xc4\xdf\x04\xb5\x39\x0c\x4b\x4d\x2a\x09\x04\x42\xf5\xde\x10\x17\xf1\xd0\x06\x6e\x2a\x01\xe2\x2a\x99\xe8\x18\xde\x15\xe5\x6d\xf2\x48\xf1\xc8\x73\x52\x65\xb3\x52\xa4\x35\x94\x77\xe0\x6a\x51\x03\xb8\xc4\x74\xee\x5d\x71\x69\x54\x0c\x9b\x6f\xe9\x15\x49\x4d\x77\xfe\x97\xf1\x5c\xd3\x12\xb2\x83\x1a\x91\xea\xc5\x27\x70\x1c\xc5\xb5\x32\x92\x68\x53\x1c\x25\x4a\x50\x40\xd6\x7b\x5d\x02\x18\x92\xfe\x26\x34\x9a\x90\x2a\xd6\x4a\xf8\x21\x58\x18\xc4\xc3\xef\x8b\x95\xcd\x49\xdc\xe6\xdb\x94\xe0\xbe\x23\xe2\x31\x00\x04\xe3\xec\xde\x5e\x50\x1b\xb2\xbe\xcd\xec\x8f\xc3\x7c\xb6\x5f\x7c\x3d\xec\xd6\xff\x69\x57\x90\x0a\x42\xbc\x4a\xf5\x52\xbc\x5b\x10\xda\x3c\x55\x03\x0b\xd1\xf8\x76\x11\x16\xed\x2e\x79\xbd\xd5\xb3\x8c\x57\x35\xbf\xf2\x7e\xd8\xad\x54\x04\x31\x1f\xc6\x84\x4d\x7c\x5e\xe4\x8d\x33\xe3\x14\xb4\xb4\xd2\x7e\x28\x58\x6b\x3f\x1e\x8a\xe3\x60\x71\x00\xf1\x0c\xe3\x26\xcf\xaf\xb3\x8b\x4a\x5d\x1a\x1d\x65\x8c\xa0\x9a\xb0\xf8\x40\x78\xa8\xda\x22\xd9\xef\x05\xb8\x7d\x0e\x44\x05\x58\x0e\x69\x76\xc6\xe5\x7c\xb0\x45\x27\x59\xa0\x66\x90\x9b\x03\xe6\xad\x0c\x6d\x4c\xcb\x13\xf7\x5b\xdf\x8b\x05\x2f\x66\xa2\x2b\x5f\xdd\x8f\xb9\x8a\x9b\x09\x71\x64\x9a\x71\xb3\xe6\x20\x7b\x86\xbf\x3f\x80\xcc\xd8\xf9\x54\xf8\x91\x6d\x01\x5d\xe7\xf5\x9d\x37\x2b\xcb\x79\x51\x64\x77\xd4\x5a\xfd\x3b\xef\x4b\xcf\xe2\xfd\xf7\xff\x1d\xae\x64\xa0\x3a\xc0\x38\xfb\x31\x95\xaf\xed\x2f\xf2\x49\x82\xa4\x73\x2f\x58\x41\x30\xc4\x59\xdd\xa0\x30\x4d\x09\xd5\xfe\xf5\x83\x7e\x36\xf0\x95\x87\x54\x7e\x87\xb6\x2d\x78\x32\x23\x02\x3e\x30\x2c\x18\xdf\xff\x98\xf7\xec\x14\x04\x5a\x60\x5f\xe1\xf7\xd5\x62\xbf\x7d\xfe\xcf\xfa\xe1\x61\x76\xb0\xcc\x0c\x87\xef\xff\x71\xe0\x33\x08\xa9\x50\xca\xba\x89\x86\x39\x66\x78\xf5\xd0\x0f\x82\x8e\xc3\xfa\xb1\x78\xe3\x93\x07\x21\x30\x62\x34\x4f\x1e\x8a\xe2\xf5\x19\xde\xfa\x0b\x12\x58\xe0\x73\x47\x5d\x9b\x1e\x5f\x50\xf5\xa9\xc8\xda\x24\x09\xb0\x28\x74\x5c\xdc\x3f\x00\x5e\xb3\x6b\xe3\x70\x7e\x2f\xb2\x4b\x9b\x97\x02\xa6\x29\x6e\x8d\x05\x94\x75\xaa\x53\xc9\x6b\xe8\x72\x2d\x83\x43\x0d\x22\x61\x28\x9b\x3b\x90\xbd\xbb\x48\x04\x11\xef\xc8\xb6\x1e\xf8\x49\x14\xbb\x89\x12\xa1\x9d\x1d\xcb\x10\xeb\x1e\x48\x2a\x94\x1b\x1c\xfe\xe5\xb6\x97\x07\x12\x1e\x89\xb6\x51\x0c\x15\x09\x6e\xc8\xb3\x35\x70\xdf\xf0\x92\x55\xef\xfc\x7c\xd3\xad\xe7\xe6\x44\xa1\x43\x45\xac\xab\x59\xd6\x96\xe3\xab\x41\xe4\x0c\x9c\x87\xc0\x7b\x24\x27\xb7\x9e\x1a\x70\x2e\xb9\xa3\xf0\xb4\x2c\xb6\xbf\x80\x8c\xd9\x0f\x8a\xc4\xe7\xb1\xd9\x37\xb3\xb9\x1d\xba\x01\xf7\x8c\x3f\xc2\x13\x5b\x17\xdd\x5d\x04\xe2\xf1\x6d\x32\x73\x10\x79\x82\x48\x00\xcf\xaa\x39\xc6\xea\x68\xd4\x16\x69\x69\x71\x96\x7d\xb4\x3a\x08\x11\x3b\xa4\x0a\x6f\xd6\x41\x0d\xfb\xc2\xe0\xfc\x7b\x79\x4f\x10\x32\xf6\x3a\x7c\xf7\xea\xe7\x39\xe3\x69\x3e\x34\x61\xc2\xe2\x59\x0c\x83\xdf\xd8\x18\x83\xa4\xc6\x89\x3f\xa5\xf9\xae\x35\x8b\x20\x99\xe4\x7e\xbf\xf8\xf6\x54\x16\x3a\x45\x62\xac\xfd\xf5\x0c\xde\x07\xab\x45\xc6\xca\xec\x42\xc3\xa2\xfb\xb4\x7a\xd8\xda\xa3\x70\xf4\xa5\x89\x8f\xfb\xa9\xbc\xe4\xe3\x78\x06\xa4\x8a\x30\x59\x80\x50\xcb\x75\x2e\x87\xdc\x57\xa0\x12\x0f\xbb\x02\xea\xf4\x04\x4f\x8d\xf7\x32\x0a\xb9\x41\x49\x82\xd7\xce\xe1\x0d\x4a\x95\x0e\x32\xeb\x00\xb1\x41\x01\x62\x14\x8d\xe7\x5e\xfb\xc0\x35\xe7\xf8\xc0\x57\x46\xd5\x41\x4d\x29\x6a\x68\xd0\xc2\x47\x96\x0f\x4b\xf6\x3c\xdc\x74\x5a\x6a\xac\xd5\x34\x6f\x4b\xdd\x15\xa5\xc3\xca\x4c\x17\xc8\x41\x43\x80\xdf\xe8\x00\x33\xad\xd0\x71\xf5\xd8\x69\x44\xb4\x73\x43\x4e\x3b\x4f\x3e\x15\x06\x16\xf6\x7c\xc9\x7b\x74\x56\x48\xa0\x89\xad\xdc\x26\xc7\xd8\xcb\x69\x6b\xc2\x62\x7c\xa3\xa5\xa9\xef\x7f\xb0\x03\xfa\xc5\x7e\x4d\xa2\x28\xb2\xf0\x87\xd5\x1b\xcf\x2e\xe8\xaa\xf7\x19\xfe\x34\xe1\x02\x61\x1d\x67\x5e\xf2\xf6\x49\x6a\x8f\x46\x6e\x33\xac\x65\x81\xd0\x7d\x7f\x7a\xc1\x68\xcf\x07\x3c\x01\x70\x8f\x96\x03\xa1\x07\x2f\x72\x73\x04\x43\x3e\x73\x63\x7c\x31\x85\x38\x66\x83\xd6\x9a\x26\x0a\x3b\x24\x04\xf2\xe7\x55\xe3\x51\xcd\x11\xcd\x76\x30\xa5\xb1\xb1\x8e\x4d\x37\xd1\x8f\x29\x72\x53\xcc\xd6\xc6\xc1\x72\x3f\xc9\x57\x81\x6a\x23\x1c\x87\x5a\xd1\x81\x67\x9a\xdb\x57\x3f\xdb\x7a\x05\x76\xbe\xa9\x76\x81\x20\x74\xde\x0d\x85\x82\xe2\x61\x74\xf7\xf0\xcd\xe5\x86\x35\xf3\xb4\x51\x67\x68\x3c\x0a\xe7\x5b\x8d\x5b\x72\x74\x44\x01\x71\x0d\x56\xe7\xd3\x55\x5d\xaa\x67\x07\x63\x1b\xae\x16\x1d\x31\x83\x83\xc0\x74\xfc\xaa\x7e\x99\xf3\xfc\xb5\x2c\xb2\xac\x99\x0f\x1d\x4b\xa9\x8e\x29\x50\x8b\xf2\x33\xe2\x28\x13\x09\x0e\x9d\x50\xd3\xa3\xd7\x38\xc8\x7d\x7f\xc4\x2d\x7b\x9d\x04\x1e\x26\x7d\x17\x0e\xa2\x3b\x2d\x3f\xa9\x35\x0f\xfc\x00\x9b\xf5\xd7\xab\x7d\xef\x94\xd6\x32\x31\x4d\xab\x3b\xa8\xe7\x97\x14\x55\xaa\x6e\x34\x27\xfe\x2f\xfe\xb5\x57\x57\x32\xc1\x1e\x03\x97\x17\xe8\xf1\xc3\x0d\x27\x02\xa1\xd2\xd6\x8b\x5b\xab\x74\xeb\xe6\x6a\x88\x18\x56\x7d\xd6\x79\x75\x69\xa9\x5a\x34\x80\x6f\xb2\xe7\x17\x2c\xea\xea\x4b\xb6\x04\x9e\xb5\x7b\x42\x53\xd3\xa1\x6c\x7a\xe0\x2d\x4f\x55\x37\xca\x7c\x24\xdf\xe0\x28\xa6\xbc\x01\x95\xde\x90\xec\x6a\x8d\x08\x34\xcb\x24\xb3\x2f\xd6\xb9\xce\x2e\x90\xcb\x09\x95\xd3\xbe\xf9\xd7\x9a\x13\x4c\x01\x64\x3c\x97\x2f\x07\x5e\x73\x93\xe9\x53\x84\x90\x90\x73\x17\x20\x54\x86\x4a\xce\x8d\xc4\x1c\x9d\x2e\xae\xd4\x23\xbc\x8f\x82\xe7\xde\xc3\x68\xa6\xf2\x00\xe3\xbd\x1e\xd3\xfe\x0d\xda\x45\x11\xe2\x05\x14\xb1\x81\x82\xe7\xaf\xd4\x7d\x8d\x17\x86\x58\x0b\xb7\x25\xfc\x26\x3e\x75\x70\x0a\x45\x08\x0d\x18\x15\xae\x83\xe7\x9c\x15\x88\xd5\x1d\x6d\xfc\x66\x1a\x0f\x9c\x22\xf1\xb7\xfc\x19\xb0\xdb\x4d\x59\xff\xdc\x5d\x2a\x20\x31\xba\xd5\xae\xf2\x7c\x93\x62\x6b\xe6\x04\x1a\xb9\x19\x0f\x47\x30\x29\x80\x87\x5e\x67\x52\x67\x16\x9b\x99\xa1\x8f\xd8\x2a\xdc\x5c\x9b\x34\xaf\x7b\x09\xbd\x66\x38\xe2\xa6\xd9\xe4\xa3\xce\x0c\xb3\x6f\x9a\x99\x9a\x60\x7e\xa2\x71\x87\x3e\x78\xbc\x81\xf6\x63\xa7\x56\xcd\xeb\xcf\x65\xc0\x14\x21\x2c\x90\xf8\x44\x4f\xfc\xe7\x12\x44\x7b\x4b\x2c\xd6\x31\x71\xbc\x9f\xe9\x08\xbf\xa3\x08\x89\x28\x20\x8e\xc6\x02\x71\x1a\x13\x39\x7a\x3a\x91\x64\x41\x60\xac\x1a\x82\xe4\x60\xe8\x6d\x35\x33\xb4\x2d\x68\xbf\x14\xef\xb6\xb9\xa8\xdf\xcf\xa7\x08\x89\x13\xc3\x93\x5b\xbc\x81\x42\xcd\x7e\x53\xce\xe2\x1f\xab\xc3\x35\x1f\x52\x11\x9e\x7b\xf3\xa2\xea\x0e\x72\x45\x48\xe2\x99\xac\xc9\x15\x78\x99\x5d\xf7\xc0\x4f\xe6\xe4\x44\x96\x82\xe1\x25\x92\x50\x4a\xdb\xe4\xdd\xcb\xe8\x28\x42\x78\x42\xc2\xb8\x05\x02\xf4\xa0\xf2\x8a\x10\x29\x01\x6f\xb6\x2c\x32\x83\x52\xef\x97\x34\x14\x21\x8a\x12\x1d\xf4\x78\x27\xaa\xd6\x62\x28\x77\x09\x00\x8d\x84\x36\x38\x7e\x5f\xf2\xbc\x9e\x00\xba\x0c\x2e\x0a\x3a\x8e\x6d\x26\x03\x8b\x6b\x53\xdc\x30\xbf\x0d\x1e\xbb\x47\x13\x43\xe9\xc4\x95\x32\xfd\xa7\x53\xbe\x86\x22\x9e\x4f\x08\xf2\xa1\xec\x2e\x02\x13\x53\x13\x04\x97\x6e\x26\xf7\x9c\xee\xde\xae\x31\x52\xa5\x33\xc9\x3f\x80\x9f\x47\x9f\x8a\xfb\x1b\xc3\x0b\xa8\xc4\x72\xd4\xfa\x74\x86\x32\xe5\xd9\xa2\x04\x95\xd6\xfd\xd7\xe6\x05\xd2\x10\xbb\xc3\xb8\xcc\xd3\x8c\x29\x23\x3a\xfe\xc7\x62\xb9\x77\xf3\xc3\x58\x60\x50\x84\x1c\xb1\x46\x5c\x3a\x03\x85\xb9\xff\x26\x8e\x77\x44\xb1\xf3\xeb\x4d\x65\xb1\xf9\xb0\x8a\x5d\x65\xcf\xd1\x65\xd6\x55\x7b\x65\x6d\xc8\x89\x1f\x8b\xb2\x7e\x79\x2a\x32\xe8\x37\xcf\x28\xe2\xb1\x28\xc6\x3e\xd9\x92\xa7\x15\x2c\xf9\x95\xb6\x03\x89\x34\xa4\x50\x85\x7c\x35\xd5\xb8\x9e\x13\x88\xe3\x06\x14\x80\x31\xfc\xe1\x69\xbb\xdb\xbb\xc6\xdd\x66\x10\x0c\x95\xde\x5b\x7a\x36\x14\xef\x4e\xcc\x5b\x11\x2f\x92\x54\x74\x32\xfc\xae\x46\xde\x63\x78\xc7\x39\x26\x87\xc8\x25\x12\x7e\xdd\x8d\x62\xac\x66\x06\x50\x62\xe0\x0d\xa8\x3b\xd6\x6f\xae\xf8\xd4\x76\x78\x91\x36\x3c\xe9\xff\x73\xa9\xea\x6d\x6e\xd6\x5e\xfb\xa3\x63\x66\xd0\x8a\x69\x9b\x48\xda\xb5\xe7\x5c\x76\x6d\x67\x71\x42\x8c\xdc\x86\x02\x38\xcd\xa1\x43\xab\xbb\x09\x4a\x60\x4d\x8a\x1b\x45\x8c\xe1\xeb\x4a\x62\xe9\xdb\x52\xf7\xdd\x25\xc7\x25\x6a\x00\xb0\xc8\xd3\xdd\xdf\x28\x5e\xa2\x28\x32\x10\x6f\x9e\xdb\x95\xc2\x99\xd1\x76\x44\xab\xdc\x41\x3a\xd3\xf6\x14\xf0\x78\x62\xa8\x7e\xe7\x69\x3d\x4b\xcb\x61\x3b\xcd\x2f\xf9\xb7\x9b\xcf\x0b\x8a\xcd\xcf\xae\x9c\x5e\xaa\x4f\x98\x6d\xff\xdd\x33\xe7\xc2\xe8\xc8\xae\x17\xdb\xfe\x01\xec\x89\x30\x0c\x6d\xca\x0d\x59\xac\xf9\xc5\x6a\x29\xb9\x71\xa1\xa4\xd5\x78\xd9\x96\x5c\x66\xe0\xb8\x47\x5b\xba\x9f\xe1\xf7\x48\x92\xe0\x29\x7d\x77\xf9\x2b\xcd\xeb\x62\x88\xda\xfd\x00\x9f\xae\x88\xd7\xac\x8a\xd0\x66\xe2\xf9\xd1\x36\x2b\xdf\xec\x5b\xc5\x04\x02\x10\x4c\x5b\xdb\x56\xbb\xfe\xeb\xf6\xc1\x03\x55\xd8\xfd\xe5\xd4\x01\x78\x9a\x77\x63\xd2\xa0\x17\xd2\x53\x73\x72\x5b\x98\xde\x94\x8e\xab\x9d\xaf\x03\x83\xb5\x7d\x29\x2e\x65\xb5\x4b\x73\x09\x5d\x9d\x69\xf8\x9b\x75\xa0\x91\x02\xac\xaa\x8b\xb3\x71\x2e\x76\x2e\xca\x6c\x46\x99\xaf\x6d\xda\xb6\xa3\x18\x35\x63\x94\x04\x1e\xaa\x19\x70\xf5\x96\x56\x45\x59\xdd\x50\x3c\xe0\x1c\x6a\xc2\x29\xc8\x52\x9b\xe3\x6b\xfe\xca\x8d\x74\xdd\xb1\x89\x93\x9b\x85\x78\xdf\x9a\x3e\x4a\x94\xf4\x7b\x9c\x3b\x50\x55\x7d\x09\xa6\xfe\x73\xa7\x5e\xe0\x83\x72\x89\x54\xbd\x2f\x2c\x98\x7f\xf2\x04\xa0\x1e\x53\x08\xcd\xfb\xc3\xfe\x8f\x44\x5f\x46\x13\x54\x8c\xd5\xc7\xc6\xe3\x16\xbc\x72\x8f\x80\x52\x22\x3c\xe9\xdc\x5d\xcb\x04\x7c\x3a\xdf\x78\x58\x94\x86\x80\x55\x7f\x14\xb4\x7d\x5e\x1c\x96\xab\xa7\xed\x6e\xbd\x3f\x3c\x8d\x48\x5e\x15\xa1\x7e\xc4\x31\x0b\x84\xb1\xfb\x43\x5a\xf7\x49\xcb\x9a\x61\x45\x85\x93\xd1\xcd\xb8\x71\x72\x17\x2f\x50\xf5\xf2\xf9\x38\xcb\xa7\xf6\xbe\x56\xb9\x42\x6a\x26\xf3\xfe\x46\xf7\x15\x44\x2c\xd6\xb6\xe9\xed\x82\x19\x0a\xe4\x7e\xef\x09\xf2\x0f\x9f\x6a\x20\x15\x22\x15\xd0\x30\xdb\x1e\xb1\x65\x5a\x82\xbc\x95\x20\xef\xff\xcb\x82\xd1\x03\x0f\xa9\x21\x41\xb8\x07\x4b\x14\xae\xe0\x27\x54\xfb\xe2\xc9\x58\x5c\xf7\x33\x22\xea\x61\xa7\x96\xe3\xf2\x6d\x6b\x13\x76\x3c\x26\x04\x31\x16\xe2\x72\xb5\x9c\x8d\x93\x4c\xd8\xcd\x4c\xc6\x85\xed\x97\x59\xd9\x6a\xd8\xb8\x10\xd1\xcc\x8a\x42\x74\xc0\x5c\x98\x63\x99\xf5\x9a\x11\xce\xa8\xe9\x03\xe5\x46\xa4\xf6\xf0\xe6\x75\x83\x92\x62\x4c\x86\xbc\x45\x7f\xb7\x7f\xd5\xa1\x0b\xfd\xd1\x58\xdc\x15\x25\x36\xe5\x0e\x9f\x44\x12\x09\xf4\xac\x5a\x76\x81\xf4\x74\x39\x7d\xa4\xbf\xd3\xcc\x8f\xa9\x95\x2e\xb3\x31\x85\xfb\x3b\x0f\x9d\x64\x97\xc5\x7e\xa2\x28\x3a\xcf\xd5\x75\x74\x05\x1e\x68\x84\x52\x09\xd9\xee\x2b\xce\x14\x3a\xf7\x78\x9f\x0f\x45\x7e\x5c\xfd\x84\x52\xa6\x55\xe7\x6c\x0d\xd1\xaf\xbf\x0d\x1e\x75\x6f\xec\xb7\xd1\x57\x25\xb1\x53\x44\x5d\x22\x2c\x08\x6b\x08\x8e\x95\xce\x4e\x12\x1e\x0b\xfd\xb6\xcd\xc8\xa6\xaa\xda\x04\x5d\x33\x21\x89\x90\x7b\xaa\xb7\x0a\x4e\x45\xdd\xfd\x74\xa1\x3d\x84\xe9\x55\xe7\x34\xdf\xbf\xc0\x8f\x17\x80\xac\x1b\x8b\x31\xa4\xb4\xda\x68\xc6\x23\x18\xf8\x03\x54\x06\x86\x22\xd0\x32\xc5\x62\xa7\xae\xa1\xfc\xe8\x1d\x17\x54\xc6\x12\xeb\x5f\xe6\xe0\xc2\xe0\x68\xf4\x5c\xa5\x64\x89\x6b\xda\xfc\x31\xa4\x57\x52\x84\x2a\x12\x5b\x55\x8c\xce\xcd\x1d\x14\x94\x9a\x39\x9e\xef\xdc\x46\xd3\xa8\xd6\xc2\x6e\x62\x37\xc3\x8f\x11\xbb\x35\x3b\x17\x59\x56\xec\xe0\x5c\xc3\x69\x8e\xe2\xe9\x2e\x03\x38\x6d\xe0\x54\x60\xc0\x8e\x26\x61\xfd\x11\xf1\x75\x33\x31\x34\x82\xf3\x15\xd4\xb3\xb2\x5e\xbd\x4d\xb4\xdd\x35\xb3\xb8\xa9\x8b\x1d\xbb\x72\x21\x66\x3d\xba\x77\xa2\x94\xc4\xbe\x20\x8b\x80\x37\xd9\xa8\xdf\x3a\xd2\x0d\x45\x28\x78\x01\x02\xeb\x5d\x3b\x80\x7d\xf3\x55\x77\xc2\x50\x08\x25\xa6\xb6\x4e\xb5\x5c\xf2\x34\xbb\xee\xce\xbd\x75\x03\xb1\xc6\xf4\xfc\x66\xfb\xf8\x6d\xb3\x7a\xdc\x1f\x16\xeb\xfd\x9f\x87\xbb\xd5\xaa\x9d\xc0\x0d\x13\xef\xf2\x22\x5f\xfb\x1e\x34\x05\x29\x90\xdc\x66\x2b\xd2\x1a\x79\x05\xd2\xfc\xe7\x60\x82\x0e\x03\x86\xcc\x90\x69\x96\x71\xe3\xe6\xdc\x71\xd9\x92\x54\x36\x33\x62\x91\x38\xe6\xe0\xf3\x39\x4b\x0d\xc7\xde\x0d\x07\xd8\xe8\xe9\x6a\x69\x7a\xed\xde\x55\xfa\x66\xc0\xa6\xb6\x09\xc5\xa3\xf6\x0d\xfb\x84\x92\xd0\x00\x82\xde\x79\xa9\xfa\x8a\x33\x8a\xf8\x9e\x1f\x11\xd1\x75\x7a\xdb\x70\x6b\xb0\xd0\x7c\x2f\x64\x61\x1f\x5d\xb8\x74\xbd\xb2\x56\x72\xb2\x3b\xeb\xdb\xbe\xb4\xe6\x53\x82\x23\x83\xc3\x43\xfa\x3a\xb1\x98\x3e\xf5\xc0\x7c\x4f\xc5\xe8\x49\x1e\x5c\x12\xb6\x2f\xf6\x3a\x55\x1f\x50\xc4\xa7\x1c\x30\xa1\xa4\x0a\x87\xe5\x1c\xe4\xeb\x14\xf1\x7d\x19\x20\xec\x8b\xab\x1b\xd9\x8e\xfe\x5a\xf4\x7d\x2b\x00\x8d\x29\xa9\x47\x7e\x6a\xb7\x93\xef\x03\xc3\x46\x83\x73\x09\x8e\x59\xf8\xb3\xf2\x78\xf3\x09\x9d\x78\x03\x71\x00\x00\x85\x67\x61\x3f\xe7\xe0\x07\xa1\xcf\x4c\xf4\x72\xbc\x4b\x33\x58\x64\x05\x86\x08\x23\xc7\x77\x62\xdf\xf8\x21\xd3\x58\x15\x31\xdb\xd0\x62\x86\x31\xac\x75\x47\x9e\x1f\x0a\xc0\x0e\x18\x6c\x12\x98\xd4\xff\x69\xef\x23\x84\x00\xbb\xc4\xb1\x4c\x7a\x80\x4a\xf2\x33\x0c\x4f\x17\x9f\x11\x93\x95\x50\x25\x4f\xf3\x41\x67\x56\x33\x48\x19\x06\x92\xc6\xe9\xc4\x12\x10\x8c\x57\x13\x13\xa6\x87\xf6\xd0\x56\x31\x26\x17\x5d\xc4\x28\x16\x2d\x8a\x3c\xbb\x3a\x19\xa7\x6d\x69\x1b\x6a\x26\x1b\xdc\x7e\xeb\x6c\xab\x1f\xc5\x8a\x38\x0d\x6f\xe0\x95\x13\xb6\x9d\x0e\xae\xfd\x38\x21\x98\x13\xb8\xcb\x8a\x92\xdf\xa5\xb2\xbf\x73\xfd\x24\x11\xe8\x3d\x41\xae\xc6\xd5\x5c\x45\x7c\x11\x78\x08\x3c\x12\x98\x35\x19\xe6\x56\x7c\xa1\x8d\x7c\xe1\xf3\xec\xf1\x7e\x85\xa0\x8c\x43\x7b\xc4\xfb\x32\x36\x8a\x07\xcd\x6a\xcc\x8f\x90\x8d\x9e\xb3\xd4\x3a\x31\xbf\xe0\x6d\x83\xa4\x01\xcf\x6e\xfb\xae\xf6\x5f\xe7\x2d\x36\x50\x11\x5f\x85\x14\xbb\xf4\x4a\xae\x75\x06\x4b\x07\x18\x6d\x46\x12\x86\x01\xc6\x89\x57\xaf\xeb\x49\xc9\x27\x45\x7c\xf0\x08\xb2\xf4\x6d\x9f\x67\x8b\x87\xf5\x7f\x56\x87\xfb\xd9\xce\x60\x97\xee\x7f\xac\xfe\x74\x97\x02\x9f\xe0\x6b\xaf\x8a\x13\x6c\xa0\x7e\x29\xd4\x4d\xf1\x60\x7c\x5d\x16\x23\x26\xfc\x7b\x91\xbd\x56\x35\xb4\x8e\xbc\x0f\x89\xc0\x66\x89\x87\xe2\xf8\x0c\x12\x52\x03\x10\x1a\x96\x9a\xe3\xf1\xc5\x12\xad\xcd\x49\x78\xa9\xf6\xc5\xa5\xbc\xa9\xe5\x75\x53\xb5\x36\xc5\x0b\xb3\x23\x1c\x2e\xd5\x0c\x06\x5e\x10\xa3\xf4\xe2\xc9\xa9\xbf\xb9\x01\x4a\x18\x46\x17\x8b\xe7\xed\x6e\xe7\x8a\xd1\xed\x20\x8f\xb0\xe1\xf0\x74\xc9\xea\x74\x07\xb9\x9a\x4d\x2f\xa4\x80\x4a\x40\x27\xd9\x41\x7f\x6b\x6e\xb9\x5c\xab\x79\x71\x39\xbe\xd4\x1d\xe3\x99\xfd\x80\x4f\x8c\x36\xdc\x2c\xcf\xe1\x27\x1c\x76\xdb\xc3\x72\xfd\x7d\x76\xd8\xcd\x76\x56\x57\xa3\x99\xe3\x49\x0c\x8a\x0e\xc5\x19\xf2\x79\xf1\x73\xf8\x7b\x03\x3f\x94\x58\xde\xb2\x98\x22\x43\x2f\xdd\xda\xdb\x0f\x0a\xa4\xd3\xef\x2c\xf0\x1b\x27\x13\xf7\x3f\xc2\xcc\x83\x2f\x3d\xbe\xff\xd1\xd4\x10\x3c\x7c\x23\x87\x14\xf9\x59\xdd\x9a\x0f\x18\x61\x48\xb7\xc4\x95\x9a\xc3\xad\x0f\x3f\xb9\x06\x83\xc8\x03\x6c\x15\x78\x00\xc3\x6a\x53\x8d\x6d\x77\x10\xf9\x11\x06\x29\x7f\x5e\xfe\x79\xb9\x94\x3c\xfb\xa7\xc8\x8a\xba\x38\xb8\x54\x48\x10\x25\x86\xe2\x59\x5c\xca\xfc\x5b\x5e\x15\x99\x9a\xb2\x2a\x41\xc4\x4d\xc6\xe4\xd8\x38\xed\x50\x1e\x21\x97\x57\x57\xcb\x1e\xa9\xe2\x0c\x3f\x18\x93\x08\x61\xec\x5f\xa1\x2c\xf2\xb4\x4d\x0f\x05\xb1\xa7\x63\xeb\x84\x59\xed\x9e\x3d\x94\xa7\x6a\x4c\x34\xea\x66\x0b\x83\x44\x48\x73\xdc\xf2\x3d\x12\x89\x66\x50\x99\x7e\xdf\x23\xd4\x5b\xad\xad\xff\xe3\x06\x79\xe0\x39\x99\x80\x25\x1c\x4b\x80\x61\x0e\x27\xe0\x01\x13\xa4\xc5\x4a\xd4\x97\x12\x56\x3f\xcf\x3c\xaf\x9a\x33\xfa\x93\xae\x6c\x45\x02\x41\xbc\xc4\x36\xcf\x19\x2f\xf6\x19\xaa\xe2\x52\x4a\x98\x80\xbe\x37\xd3\xb5\x4c\xcc\x83\xbe\x42\x79\x38\x73\xe7\xbf\x04\x32\xf1\xbc\xd0\x91\x3c\x5c\x79\x56\x5f\x51\x2b\xb0\x1a\x7d\x5e\x8a\x00\xb9\x20\x9c\xeb\x7d\xe0\x59\x76\x98\x94\x3d\xb4\x1f\x50\x94\x61\xc6\xc0\x14\x1a\x77\x75\x69\xc2\xee\x89\x1a\x40\xa0\xa8\xa9\x8f\xcf\x33\x2e\x5f\xb3\xb4\xea\xb7\x99\x8f\x6e\x43\xc5\x26\xad\xc9\x5b\xbd\x95\x43\x89\x50\xf1\xa7\x8c\xd7\xba\x28\x4f\xae\x17\xa1\x99\x2b\x54\xcb\x69\x88\x77\x1a\xb8\x11\x08\x43\xcc\x93\x6c\x56\x33\x27\x64\x65\x47\x34\x31\x08\x8d\xa7\xb4\xaa\x53\x29\xd3\x85\x63\x3a\x6f\xc6\xc0\x23\x51\x5f\x23\x62\xa6\x9c\x41\x08\x49\x90\x60\x35\xd2\x21\x00\xa9\xdd\x83\x34\xf8\x6d\xf0\xaf\x7b\xf1\x21\x09\x43\xa3\xdd\x7d\xc9\x5e\x5d\x8e\xe7\xa9\x98\xdd\x30\xdd\x4e\xec\xe1\xd0\x0b\x02\x87\xa3\xde\xf0\x57\xe8\x2f\xb8\xd0\x63\x0c\x99\x72\xf4\x4d\xcb\x3f\x0e\x0a\x5c\xf5\x27\xfe\xd3\x26\x87\x06\x79\x98\xd0\x53\xa6\x47\x0f\x75\x0e\x6f\x50\x1a\x76\x12\xd5\x42\x3b\x8a\x37\x23\x6c\x3c\x51\xdc\x57\x24\xf4\x13\x4f\x19\xdd\xa6\x53\x9a\x1f\xfa\x94\xe7\x9f\x75\xe7\x2a\x12\x06\x24\x42\xc7\x67\x07\xf5\xae\x86\xb3\x4b\x5f\xfe\x28\xf9\xf9\xfc\x51\xb8\x12\x06\x94\x61\x22\xf9\xe0\xa0\xf6\xa6\xf5\xbe\x97\xbf\x70\x13\x99\xe1\x93\x3d\xa5\xd8\x5b\x6d\x8a\x5c\x69\x7e\xec\xaf\xb9\xcf\x8c\x5e\x18\x24\x8c\x7c\xc4\x39\xfb\xaf\xdc\xe4\x30\x90\xca\x82\xd7\xd4\xbc\xe0\xa5\xda\xb5\xcc\xec\x1e\xf9\x6d\x58\x11\x98\x5c\x0e\xbf\x9a\x65\xbf\x86\x25\xc2\x2d\x93\x1f\x69\x6e\x14\xbe\x47\x86\x35\x64\x4d\xac\x6a\xd2\x38\x35\x2c\x0a\x35\x3a\x95\xc3\x28\x36\xd9\xc6\xdd\xe6\x7e\xe1\x56\x49\x1c\x11\x44\x75\x23\x9d\x4f\x7d\xc8\x3a\x72\x0c\x45\xc2\x84\x08\xae\x7a\x1d\x0f\x36\x35\xb7\x2f\x1a\x33\x3d\x6d\xca\x42\x11\x49\xac\x9d\x5e\xb0\x16\x8b\x12\x5a\x13\xce\x44\x28\x78\xa0\xac\xdc\x92\x15\xaa\xda\x17\x56\x62\xb9\x0f\x58\x1a\x7d\x4a\x46\x26\x61\x57\x71\x0d\x9b\x4b\x36\xed\x01\x84\x32\xf1\x0d\xa6\xa1\xd9\xdc\xfb\x41\x0c\x18\xca\x84\x2b\xdb\x76\x82\xd5\x66\xa3\x50\xf2\xc6\xd3\xac\x79\x00\xb7\xaa\xa6\x53\xa8\xa6\xe6\x32\x22\x0c\xc2\x96\x28\xa6\x9c\x14\x2f\x51\x24\x54\x49\x82\x75\x96\xfd\x1f\xcb\xd5\xc3\xcc\x39\x72\x21\x48\x26\xad\x99\x46\xff\x3c\x18\xbd\x28\x00\xd3\x01\x5f\x03\x3f\xcd\x06\x3e\x52\x08\x5a\x61\x1e\x55\x61\x7a\xae\x28\x67\x76\x80\x11\x12\x22\xc0\x65\xb6\x6c\xff\xc2\x29\x32\x66\xab\x62\x77\xe2\x59\x86\xe1\xd8\xbf\xc0\x05\x28\xc2\x3c\xc2\x31\x89\x8e\x2d\x47\xe7\x22\x1b\x13\x9c\xfd\x8b\x2b\x44\x1a\xbb\x37\xb7\x9b\xf5\xaf\xfd\xa0\xc1\xa3\x65\x54\x46\x48\xec\xb5\xc8\x80\xe7\x73\x9e\xbf\x42\xb9\xe0\xb9\x4a\x5b\x52\x19\x7b\xd2\x30\x9f\x78\x68\xe0\x0e\x87\x12\xaa\x22\x7b\x1b\x2d\x77\xe6\xeb\xd0\x06\x52\x0f\x69\x5d\x63\x8b\x7b\xca\xf3\x1e\xea\x4c\x11\x16\x50\xa6\x2c\x87\xda\x1b\x94\xf5\xb7\x4a\xed\x0b\x4c\xd1\x8e\xae\x15\x44\x1a\xf3\x70\x07\xe7\xd1\x8a\xfa\x63\xbf\x8c\x85\x41\xe0\x3c\x9c\x45\x91\xb6\x75\xca\xbe\xe9\x62\x61\x1c\xa3\x6d\x7f\x30\x3c\x5f\xcb\xb9\xbd\xb1\xc9\xcc\x2a\x63\x32\xc6\xa2\xab\x65\xff\x98\x5f\xae\x98\x18\x76\x36\x7b\x72\xf5\xb1\x88\x11\x65\xb8\xe8\x1b\x7b\xb8\xd5\xdb\xf2\xf8\xa5\x1d\x62\x58\x90\x6c\x39\x8b\xb2\xa2\xfa\x80\x19\xff\xa6\xdf\x62\xf4\x25\x49\x8c\xde\xb3\x2e\x2e\xe5\x3b\xc0\x6b\xd5\x7e\x45\xa2\x0c\x6d\x21\x4c\x4b\x60\x28\xc2\x62\x3f\x40\x57\x17\x0c\xb0\xec\xf9\xd2\x6c\xff\xd9\xe8\xd1\x27\x34\x32\x30\x72\x7e\x82\xea\x01\xf4\xc8\x8b\x60\x49\x6c\x78\xf2\x1e\x8a\xe3\xd7\x42\x65\x56\xbe\xf3\xf3\x63\x89\x25\x31\x75\x89\xe3\x25\x9c\x2e\x65\xe3\xf0\xce\x6e\xc8\x07\x9b\x89\x89\xc4\x8c\x50\x13\x28\xdf\xc1\xaf\x60\x06\x8c\x13\x1d\x3a\x68\xc6\x35\xe7\xa7\x54\x2e\x20\xc5\x5f\x75\x8b\x8a\x6d\xa6\x87\x46\x49\x1c\x05\xe5\x66\x59\x66\xfd\x65\x7c\xcc\x83\xd5\xc2\xe3\x84\x9b\x28\xf2\xe7\x43\xdf\x44\x33\xe1\x83\x21\x16\x7a\xe1\xf2\xb5\x39\xf9\x8a\x22\x6b\xc7\x82\x00\x4f\xc7\x3f\x7f\x5f\x4c\xd6\xb5\xa6\x4e\x7a\x26\x98\x8e\x3a\xfd\x56\x57\x6b\xed\xe3\x60\xdd\x44\x6e\xb4\xe7\x7f\x94\x50\xd5\x19\xb4\xa8\x25\x45\x98\x0c\x03\xdd\x35\x51\x3f\xc2\xcf\xba\xeb\x74\x68\x86\x23\xc3\x81\x5f\xa5\xc7\x9c\x67\x7d\xf3\xcc\x64\xe2\x61\x0a\x12\xa3\xbc\x2a\x3d\x9a\xbd\xe8\x06\x39\x65\x1d\xa7\xa3\x32\x9e\x72\xbb\xde\xa4\x92\x48\x87\xd9\x13\x7c\xb0\x02\xf4\x6e\x86\x0a\x0c\xc1\xfc\x5f\x2d\xd2\x87\xe9\x16\x08\x5e\xd5\x65\x71\xdd\x5c\x07\x0f\xca\x4d\x4a\x22\xbb\x92\xeb\x7d\x09\xbc\xba\x94\x13\x74\xfc\x8a\x44\x24\x92\x48\x7f\xf6\x04\x65\xe3\xbd\x36\xbb\xba\x2c\x46\xc5\xb7\x88\xc4\x80\x99\x82\x65\x21\x2f\x27\xc8\xeb\x05\x94\x75\x81\xc9\xca\x36\x91\x33\xc5\x8d\x33\x58\x0e\x91\xa7\x23\xd1\x13\x15\x1d\xc6\x21\x91\x2f\x43\xfc\x8a\xf5\xc6\x89\x28\xb7\x03\xa6\xdb\x74\xf7\x6d\xb1\x58\xed\x76\x87\xbb\x87\xd9\xbd\x1b\x0b\x02\x13\x13\x2c\x81\xd7\x2f\x26\x2d\x7a\x48\xdb\xc1\x88\x27\x16\x4a\x74\x5f\x64\x0a\xdd\x2d\x80\xe1\xd1\x14\x05\xdc\x8f\x1d\xd0\xd0\xa5\x05\xdc\x90\x82\x58\x5a\xef\x3d\x95\x45\xfb\x67\x4d\x31\x5c\x79\xfa\x3a\xdb\xad\x0e\xde\x01\x53\x1e\x6e\x30\x94\x1e\x16\xe1\xde\x52\x78\x7f\x2c\x72\x59\xf1\x56\xf4\x64\xb4\x8d\xa2\x28\xd0\x88\xff\xba\x5f\x3d\xee\xd6\x3b\xa3\x67\x7f\x58\x6c\xbf\x3d\xba\x1a\x78\x14\xc5\x1e\x96\x80\x54\xfa\x36\xef\x0a\x7d\x51\x1c\x1a\x75\x40\x83\x3d\x13\x50\x62\x8b\xf3\x15\xca\x6a\x9d\xdb\x0e\x8b\x7b\xde\xfd\x8c\x98\x31\xf4\x82\xab\xf4\x1f\x18\x92\x78\x28\x12\x25\x89\x00\xbb\x71\x9e\x8b\x0c\xa6\x32\xec\x11\x8f\x0d\x59\xe9\x73\x5a\xb5\xfd\x8c\x6e\x48\x1a\xe9\xe0\xa2\xe4\x32\x4b\xff\x81\xc3\xdf\x17\x28\xaf\xe3\x2d\x8b\x2f\xda\x51\x4f\x75\xdf\xcd\x15\x17\x7e\x2b\xea\x34\x88\x03\x22\xa1\x35\xb1\xef\x0e\x09\x4e\x47\xb7\x2d\x43\x43\xf4\x5e\xbf\xa4\xb9\xa1\x81\xb3\x03\x10\xa9\xc8\x16\x1b\xf7\xfb\xc5\x47\x62\x4c\xcd\xc4\x44\x3b\x8e\x92\xff\x29\x44\xd5\x8f\x60\x22\x4d\x13\x14\xaf\xe1\x4a\xd9\xce\xda\x96\x0d\x74\xd2\x30\x37\x6e\x03\x06\x24\xf7\x25\x40\x8e\x32\x32\x77\xbc\x3c\xb5\x97\xf3\x39\x16\x36\x9f\x0b\x61\x3c\x83\xa1\x6f\xf9\xdb\x44\x40\x1a\xe9\xd8\x43\xa6\x64\x97\x86\xb4\x75\xaa\xea\xd3\x88\x3c\xd2\xca\x00\x96\xb7\xb2\x2e\x04\x94\x1e\x3d\x50\xe2\x45\xf6\x3e\x62\x4f\xb0\xd8\x74\x46\xbd\x57\xdd\xdf\x12\x4c\x11\xe5\x50\xbf\x17\xe5\xab\xa1\x85\x75\x63\xda\xe8\xe3\xcc\x9b\x35\xe9\xdc\xc0\x98\x7a\x02\xa5\xb2\x05\xd4\x7d\xc7\x26\xa6\x51\x88\x27\xda\x8f\x22\xd3\x25\x3f\xcd\xb2\xf3\x0b\x6f\x3f\x13\x25\xc2\x50\x4e\xe0\x99\xb1\x2f\x2e\x65\xce\x7b\x75\xb7\x98\x02\x8f\x5d\x8d\xd8\x82\x66\x27\x5f\x5b\xec\x27\x61\x68\x08\x09\xfe\xba\x54\x86\x09\x0b\x71\x74\x76\x38\xd0\xcc\xb5\x49\xd8\xfe\x02\x13\xae\xd8\x07\x14\x87\xb1\x6f\x38\x0d\xd3\x13\x3c\x74\x99\xd0\x38\x14\x31\x7a\x7e\xfb\xf5\x66\xb5\xd8\xae\x1f\x47\xdf\x1a\xca\x18\x9f\x04\x82\x3a\xfa\x45\x8c\xf6\xf3\xc0\x30\x0d\x7f\x6f\x08\xea\xa6\x18\x19\x14\x89\x99\x1f\x22\x1e\x0c\x49\x65\xaa\x96\xd4\xd5\x5d\x84\xc5\x94\xfa\x2d\x60\x68\xb6\xff\xc3\x90\xb6\xb4\x3f\x8e\x71\x43\x42\xdf\x7c\xec\xd0\x18\xa4\xc9\x45\x10\x47\x8a\xc6\xb1\xeb\x74\xef\x72\xca\x71\x4c\x22\xd2\x6a\x9f\xde\xe8\xb0\x8e\x2e\x12\xeb\x90\xa8\xd6\xc6\x40\x59\x2c\x20\x53\xbc\xbd\x95\x24\xa0\x98\x63\x5e\xcd\x9e\x1f\xfe\x3c\xac\x1f\xbf\xaf\x76\xfb\xed\xf3\xe1\xc7\xec\xe1\x61\xb5\x6f\x27\x45\x3e\xba\x6b\x90\x1f\x4b\xfe\x06\x23\x01\xc0\x81\x71\x70\xa7\x40\x9c\x80\x87\x08\x1a\x9b\x64\x1d\x50\xfc\x29\x12\xf3\x28\xc6\xed\x6d\x3f\xb4\x2f\x76\x78\x91\x61\xce\xc2\xce\x15\x71\xa2\xad\xe0\x56\x13\x25\xed\xea\xe2\x7c\xee\x3d\x6d\x21\x4d\x9f\x77\x56\x1c\x9f\x41\x7f\xf0\x18\x84\x06\x6a\xd4\xbd\x6c\x38\x80\x2e\xe7\x4d\xa7\xa8\x22\xb1\x64\x46\x67\xd4\xa8\xda\x3c\x41\x59\x8d\xcb\xe5\xb1\x62\x86\x30\xc9\xf5\xb8\x0c\x38\x98\xdb\x39\x11\x16\xa0\x4f\xaa\x36\x61\xde\xc0\x2c\xc6\x40\x7d\xac\x9d\x1e\x8b\xcc\xd5\xe3\xf8\xb1\x7d\xc3\x9a\x4a\x16\x0d\xf2\x22\xb3\x91\x67\x98\x10\x42\x10\x94\xb5\xd8\x3e\x6c\x1f\x57\xcf\x7d\x63\x9e\x78\x5e\x82\x80\xb5\x53\x51\xd6\x47\x7e\x1c\xe5\xef\x12\x2f\x90\x78\x52\x3e\x43\x36\x90\x11\x6f\x86\x44\x88\x61\x41\x0e\x06\x8d\xdd\x85\x3e\x76\x82\x1f\x85\xae\x44\x89\x9e\x0e\xee\x00\x3c\xd3\x06\xaf\x3f\xf1\x93\x18\x8f\x23\x97\xab\x59\x2c\x9f\xa6\xdf\x4c\xe2\x03\xc1\xb3\xf1\xcc\xaf\x13\xdc\xf7\x8a\x24\x01\xe1\x88\xb9\x12\x5d\x01\x21\x09\x98\x42\x3c\x6d\x65\x7a\x7a\x36\x69\x0e\x25\x1f\xd5\x4f\x92\x20\xd1\xd8\x91\xf2\x6d\xfd\xb8\xa7\x21\x3b\x6c\x66\x7f\xb4\x9f\x57\x8a\x5a\x18\xc5\xc3\xc3\xf7\x03\xa8\xb4\x3e\x78\x2e\xa7\x97\x84\x91\xa9\x61\xb9\x04\xe5\x23\xd4\xeb\x5c\x16\xed\x49\x9c\x84\x2a\x48\x8c\x88\x5d\xa1\xd3\xda\x07\xc7\x4d\xd3\x0c\x81\x21\x54\x4b\xf3\xb4\x4e\xb1\x04\xbd\x29\xd4\x25\xeb\xf5\x83\x8d\xf2\xda\x09\x8b\x0c\xed\xd5\x9e\xe7\xaf\x3b\xc8\x32\x2b\x99\xed\x46\xe3\x50\xb8\x74\x75\x5e\x97\x29\x0c\x4e\xb8\x84\x89\xd8\xaa\x86\xd4\x97\xf3\x33\x96\x7f\xdc\x50\xe4\x73\x6c\x20\x1a\xa8\x4e\x56\x77\x65\x71\x9a\xac\x00\x76\x0f\x3c\xf6\x0c\x6b\x4f\x05\x4d\xdc\x7a\x82\x9b\xdd\x9b\xc4\x54\x43\xcb\x8b\xd3\x98\xdf\xe5\xa5\xe4\x3d\x33\x9a\xc4\xbe\x01\x1d\xe3\x84\xe7\x66\xa8\x7d\x40\x71\xec\x61\x17\xf9\x66\xf6\xf8\x75\xb6\xdf\xcf\x1e\x9f\x9e\xb7\x7f\xfc\xb9\x99\x2d\xd7\xbb\xed\xe3\xac\xad\xb8\x24\x49\xe8\xe1\x4a\x33\x46\x74\x93\xe6\x63\x76\x0e\x9c\x23\x7c\x63\x68\xf5\xa5\x25\x6a\xb9\x7d\xc2\x9c\x71\xc4\x72\xb8\x27\xd1\x23\xd6\x50\x24\x11\x84\xa3\xd3\xff\x0c\x3c\x5b\x55\xbd\x73\x33\x91\x22\x26\xa6\x4f\xdd\x7a\x63\x03\x30\xeb\x30\x46\x4e\x14\x10\x44\x7c\xa4\xb9\x2c\xa1\x77\x24\x26\x40\x3d\xdc\x0a\xe9\x31\x2f\x4a\xbb\x4f\x82\x9e\xc5\x49\xc0\x0f\xa9\x4d\x0a\x35\x96\xe4\x52\xad\x47\x0b\x19\x38\x98\xf6\xe2\xc5\x6c\x33\xd8\xae\xa0\x34\xba\xda\x6d\x0a\xbb\x5d\x36\xa0\x69\xe0\xf5\x08\x39\x46\x0f\x4e\xc7\x21\xf6\x35\xa0\x46\x5d\x9a\xb7\xbf\x58\xc7\x11\x12\x9c\x7d\x87\xfc\x52\x7d\x12\xb5\xb5\xd3\x05\xa2\xe0\xb9\x52\x7f\xfc\xf9\xef\xb2\x3b\x09\xd2\x1f\x59\x30\x88\x2d\xea\xba\xf5\x58\x4d\x84\x35\x89\x16\x12\x1f\x1f\xb2\x8b\x19\x3f\xd0\x78\xe2\xc5\xc7\x4c\x1a\x93\x6f\x88\x93\x50\xbb\xd6\xc4\xf5\x61\x37\x7c\x22\x9c\x30\x8d\xa4\xfa\x32\x2b\x72\x40\x88\xcc\xe4\xe6\xe0\x1e\x57\x3a\xb0\x44\x02\x88\x97\x9c\x40\xa1\x70\x1a\x05\x56\x1b\x81\x9f\xcc\x62\x73\x35\x5f\x4e\x15\xc7\xec\xfe\x31\x7d\xbb\x05\x0e\x4c\x3c\x63\x4e\xb5\x81\xd4\x1e\xa1\x9e\x65\x99\x63\xe6\x72\xdb\x89\x07\xa1\x01\x5e\xa1\xa6\x12\x8a\x24\xae\x4f\x67\xb3\x6b\xf9\x20\x8f\x3c\x29\xd7\x39\x4e\xf4\xf2\x80\xc7\x9e\xcd\x20\xec\x91\x11\xb8\xf1\xc9\xcb\x71\xd3\x8b\x22\x3c\x64\x14\x4d\xe0\x3d\x18\x6a\xd5\xfd\xf5\xec\x04\x29\x10\x19\x3b\xee\xc0\x6e\x3e\x12\x25\x56\x48\xd8\xc9\x0b\x22\x9d\xe3\xba\x47\xc1\xf1\xdf\x51\x68\xc1\x43\x10\x81\xcb\x07\xf0\x34\xb7\x20\xab\xe1\xad\x30\x2f\xb1\x64\xb0\x59\x76\xf8\xe0\xb5\x31\x1a\x22\xd1\x05\x37\x4b\xce\x60\x03\x3f\x7a\xc7\xcc\x67\x88\xd4\x69\xb7\x32\x42\x77\xe7\x25\xcf\xa5\xcb\x7c\x70\xa6\x8d\x98\xd3\x43\x71\xb4\x76\x67\x31\x68\x11\x9b\x5e\xfd\x9c\x69\x1e\xb6\x20\xa7\x54\xc2\xfc\xba\x56\xc3\xa3\x93\x47\x22\x60\x91\x43\x4b\xf1\x63\x91\x2f\xe1\x6d\x63\x13\x12\xa3\x5f\x1e\x53\x53\xb2\xae\xa0\xfe\x91\x66\x4a\xf2\x52\x0d\xd2\xd7\xb7\xdb\x89\xc7\x7e\x88\xe4\x92\xe2\x72\xdd\xbd\xa4\xe7\x01\x08\x85\xc7\x32\x46\xc7\x54\x57\x48\x21\x66\xff\xca\x89\xef\xd9\x6f\x59\x14\xa7\x73\x0d\x07\x3f\x1e\x64\x13\x39\x0f\x48\xd4\x3f\x30\x4d\xde\x64\xe4\x3b\x8f\xff\x75\xe6\x99\x73\x19\x22\xfa\xb0\xd9\x2d\xd8\xce\x3a\x4e\xf6\x70\x41\x08\x63\x2e\x0d\x96\xc1\xcf\x54\x64\x13\x6a\x50\xcd\xc4\x20\x06\x03\x36\x9f\x3b\x49\x9b\x2e\x7b\x88\xff\x6f\xf8\x00\x45\x1c\xf8\xb4\x2f\xfe\xde\xd3\xa8\xba\xe9\x8f\x55\x84\x4b\xe2\x71\xeb\xf9\x61\x81\x76\xf5\xf3\x9c\x96\x23\x2c\x24\x97\x94\x86\xae\x51\xe3\x25\x3d\xdb\xe6\xfa\xe1\x93\x56\x91\x61\x3a\x16\x97\xab\x69\xf0\xfb\xd2\x3e\x95\xd1\x2d\x2a\x88\x90\xa9\xc6\x95\x03\x2f\xae\xd3\xfb\x76\x71\x41\xe0\x87\xcc\xc1\x93\x91\x0f\xc1\x9c\x27\xd3\x27\x16\x87\x84\x3b\x37\x76\x93\xe6\x96\x6c\x76\x78\x45\x6d\x09\xb9\x50\x25\xd8\xb4\xed\x3a\x63\x3d\x19\xd6\x09\xe2\x01\x43\x2d\xa3\x43\xe3\x1c\x77\x04\xce\xe3\x69\xd4\xd4\xea\x4d\x3e\xdb\x88\x4c\x36\xd6\xea\x5b\x9e\xd6\xfe\x17\x37\x89\x69\x74\xfc\x32\x5e\xd5\x4e\x3c\xd5\x0d\x49\x82\x89\x73\x23\xe2\xb1\xb4\x1d\xfd\x03\x50\xb3\xf0\x62\x8d\xe8\x33\x77\xea\xcf\xaf\x77\x45\xf9\x39\x9f\x6f\xf3\x29\x61\x68\x3f\xee\xfe\x18\x24\xaf\x04\x15\x61\x64\x90\xfd\xa0\x7a\x38\x52\xe1\xb3\x18\x33\xa0\x5c\xa9\x7d\x61\x0f\xb4\x71\xcf\x7b\x33\x4d\x71\x34\x97\x7f\x15\x23\x1d\x78\x3b\x1e\x44\x26\x1c\x46\x4a\xe2\xff\x8f\xb3\x2f\xeb\x6e\x1b\xc7\xba\xfd\x3b\xf5\xd0\x0f\x04\xc0\x09\x8f\xb2\x2c\x3b\xbe\xf1\xf4\x49\x4a\xd2\x75\x7b\xf5\xd2\xc2\x70\x60\xf3\xb3\x44\xaa\x49\xca\x8e\xea\xd7\xdf\xc5\x83\x81\x83\xe8\xa4\xfa\xbe\x94\x53\x22\x44\x71\x00\x0e\xce\xb0\xcf\xde\x9b\xc5\xfd\x6a\xb3\x5d\xdc\xae\xfc\xae\x21\x13\x4a\xfc\x9b\xbd\x3b\x9a\x66\x48\xaf\x35\x7e\xa9\x32\xe1\x39\xfa\xae\xd8\x48\xfd\x5c\xc3\xdd\xf2\xe9\xf9\x24\xf7\x85\xf2\xa7\x4a\x73\x0b\x8e\x39\x57\x95\x14\xa3\xbc\x8a\x1f\x20\x05\xfa\x00\x9e\xb7\x27\x1c\xc8\xe2\x3c\xc2\x55\x88\xb4\x24\xe1\xd3\x84\x39\x1b\x84\xea\x64\x9d\xf1\xb7\x9a\x8a\xf3\xd7\x97\x29\x81\x14\x21\xb6\x59\x72\x46\xe3\xf8\x1f\x83\xc2\x86\xfb\x4e\xce\xb4\xe4\x01\xf7\x39\x02\x9a\x8e\x4c\xa7\xcc\x53\x8d\x19\xbd\x1b\x51\x0b\xbd\x42\xa6\x28\x7f\x99\x9c\x38\x4d\xd3\xd7\xea\xe3\xea\x54\x97\x9d\xd7\x51\x4c\x53\x79\x92\xbb\xde\x84\x0f\x90\xec\x7b\x01\x1f\xeb\x6a\xbf\xff\x4c\x31\x76\xde\xc2\x4b\xce\xc1\x82\xdb\x7a\x3d\x91\x7b\x51\xea\x57\x14\xd7\xd8\x8a\x09\x76\x47\x72\x48\xd0\x85\xda\x34\xc7\xcf\xb8\x45\x2f\x10\x3b\x43\xdb\x2b\x39\x64\x9c\x06\x3f\xf9\xaa\xaa\xeb\xea\x03\xf4\x2a\xe4\xe8\xa5\x24\xb6\x66\xe7\xfa\xf9\x46\xf1\x83\x54\xc4\x6a\x86\x0a\xad\x1f\xaa\x12\x26\xa6\x4c\x2a\x9e\xb9\xf6\xa2\x1e\x5f\x7c\xda\x7f\x52\xf9\x94\x0a\x6c\x95\xd8\x51\x70\x5d\x09\xf5\x16\x16\x33\x72\xe9\xa1\x02\x83\xed\x78\xf6\x9f\x83\xe2\x99\x2d\x81\x9d\x90\x4f\x66\x98\x8a\x92\x26\xd6\xb8\xb3\x6f\x0e\xd5\x1b\xf8\x7c\xd2\x72\xb8\x84\x7e\x03\x6a\x9a\x5c\xa0\xe1\x09\xd6\xdb\x65\xab\xee\x83\x51\xf1\x57\x62\x8c\x05\xc9\xb6\x9d\xdd\x04\xdf\x24\x79\x2d\xdd\x71\x15\x31\xc3\x92\x41\x71\xe0\xbb\x38\xed\xdb\x70\x50\x31\x4c\x51\xe3\x6d\x8c\x71\x47\xe3\x05\xa0\x88\xca\x63\xe7\x01\xa0\x5b\x01\x3e\x6e\x19\x33\x40\x74\x23\x35\x41\xf8\x5c\x17\x9d\xba\x35\x7a\x0d\x8d\xaa\x8b\xe3\xc8\xb1\xbb\xa4\x0a\xd3\x91\xa2\x31\x70\xb7\x67\x3f\x56\xf6\x46\x51\xcc\x70\xa0\x5e\xa5\x23\xc5\x22\xe6\x64\xe5\x30\x7e\x76\x34\xa6\xfe\x20\xd5\x58\xe0\xac\x5a\x15\x04\x30\xe6\x6f\x89\x51\x40\x04\xe4\x06\x44\xad\x5e\x17\xf7\xf7\x37\xc5\x1e\x46\x85\x22\xc5\xb8\x21\x31\xba\x4b\x08\x99\x9f\xdc\x69\x4c\x28\xee\x44\xab\xc7\xeb\x27\xdf\x76\xea\x0f\xd1\x14\x9b\x3a\xe4\xa9\xee\x1c\xff\x90\x6b\xbb\xbb\x5a\x86\x21\x59\xe2\xb3\xbc\x96\xeb\x71\xd3\xd6\x85\x9a\x6c\x65\x2a\x51\x49\xee\xab\xde\xdd\xb9\x86\xe9\x18\x95\x28\x1e\xa7\x7d\x20\x79\x9c\x69\x44\x56\x59\x62\x09\xb7\xde\xa1\x2e\xcc\xd9\x72\x16\x0d\x01\x1b\x53\xf3\xf0\xd9\xd4\xfc\xec\xf3\x0b\xbb\xa7\x32\x19\x61\xc5\xe8\xb8\x17\x0a\x7a\xe4\x69\xfc\xbb\x2a\xf8\xe7\x05\xd4\x39\x9f\x5f\x65\x2a\xb5\x13\x1b\x4d\xf2\x16\xc4\x61\x51\xea\x85\xeb\xb1\xf2\x4f\x28\x17\x99\x15\xc0\x16\xa5\x7e\x09\xdb\xa2\xe2\x52\x3a\xeb\x83\x3e\xfd\x76\x79\xbf\x2e\xca\xbe\xeb\xd7\x0f\x13\x84\x7a\xdd\xa4\x1d\xa2\x60\xfb\x03\xdc\x77\x27\x04\x0b\xf3\x99\x54\x7c\x37\x3c\xb6\x15\x13\xec\x4c\xf7\x0d\x35\x13\xdd\xfd\xd9\x7d\x5d\x89\xc4\x4a\xff\x5a\x8f\x03\xbf\xb2\xad\xac\x42\x12\x8d\x68\x14\xae\x27\x63\x9e\x14\xbb\x5d\x83\x81\xba\x16\xfb\x11\x9f\xee\x67\xa7\x57\x1c\x7d\x3e\x14\x64\xb0\x40\x30\xef\x22\x28\x99\x67\xb1\x18\xf4\xec\x5c\x9d\x1f\x8a\x12\xee\x3c\x52\x42\x29\x13\x0f\x9c\x21\xd4\x6a\x2b\x15\x5c\x6c\x3b\xa3\x27\x72\x81\xe6\x99\x3f\x3a\x3b\x01\xdc\xcf\x42\x9a\x60\x6b\xc9\xe6\xa3\x68\xff\x82\x7a\x2f\x4a\xfd\xde\x2c\xab\xa6\x15\xeb\x42\xf9\x8c\xbf\x82\x8c\xa5\x81\xde\x34\xec\x50\xe3\x9b\x37\xb1\x25\xf8\xfd\xab\xea\xac\xea\x1a\x4c\x0d\x96\x66\xd2\x9d\x44\x47\xa0\x91\x44\xd4\xc7\x07\x43\xd3\xa9\x09\x03\x84\x30\x35\x07\x51\xb7\xfe\x17\xee\x9a\x89\x4e\xad\x1f\x0c\x22\x0b\xac\xfb\x48\x8b\x3d\x5e\xa5\x9a\x42\x66\x45\x7f\x45\x79\x12\xfb\x29\x71\xc7\xf8\xad\x69\x96\xcb\x34\xf1\x4c\xfb\x75\xd3\xae\x45\xf9\x76\x53\x59\x01\xc9\xde\x39\xd3\x8c\x47\xe8\x49\x7e\x39\xc9\x19\xc3\xa0\x99\xe4\x98\xc0\xbb\x33\x36\xd5\x67\x63\x88\xe9\x20\x93\xc8\x5e\x7a\xfa\xb1\xaf\x74\xe9\x38\x56\xca\xa5\x25\x9e\x9f\x9e\xee\x6d\x32\x92\xc5\xa3\x08\x4b\x27\x84\x18\xee\x4b\xa0\x62\x3f\xda\xc4\x75\x42\x39\xfa\x36\xd5\x11\xca\x1f\x45\xa9\x83\xd7\xa3\x93\x84\x6a\xdf\x79\x83\x2d\xd1\xe3\x8b\x4a\x73\x9b\x25\x92\xd0\x2e\x3a\x7b\xfd\x1a\x4e\x99\x33\x8a\xd8\xab\xce\x1c\x62\xa7\x75\x17\xdf\x87\x83\x5c\x59\xf1\xda\xd3\x01\x05\x92\x0a\xdf\x35\xb2\xa9\xf6\x7e\xd6\x6b\x9e\xe6\x2a\x72\x86\xfb\xa6\xae\x0e\x13\xfc\xbd\x1f\x95\xd3\x2c\x0d\x2c\xc3\x18\x53\x4d\xae\x91\x03\x45\x3d\x09\x38\x14\xed\x52\x1c\x85\x2c\xf6\x45\x7b\x5e\x68\x3d\x55\x66\x88\x87\x75\x37\xcd\x8d\x42\x0e\x07\x04\xde\x77\x36\x67\x3b\xc8\xff\x6a\xc1\xc0\x6b\xcb\x3e\xc2\xcf\x76\x51\xb6\xc5\x1a\x8e\x7b\x71\xde\x8a\x97\xc9\x15\x0a\x9d\x81\x2d\xd6\xfc\x5c\x8a\xe3\x83\x08\x38\x03\x2d\x93\x08\xfb\x13\x5e\xb1\x6f\xcb\x7d\xa8\x22\x81\x80\x7b\xb1\xdf\x5b\xb4\xce\xa9\x86\x66\x67\xaa\x7a\xd7\x1c\x41\x15\xd3\x5e\x08\xad\x12\x4b\xc1\x6e\xb1\xad\xdb\x5e\x74\xc6\x9f\x50\xb3\x5c\x04\xc1\x5c\x44\xb2\xdf\x0a\x5c\xa6\x43\x4f\x49\x43\x26\x51\x0c\xff\x01\x5a\xa1\x8b\xd3\xc1\xb5\x81\xfc\x0e\x45\x38\x08\x41\x34\x98\x04\x73\xe2\x23\x7e\x8c\xe1\x24\x84\x28\x4b\x50\x17\xfa\xaa\x68\x55\x55\x94\xcf\xa7\xfa\x18\xd2\xcd\x10\xe5\x04\xd9\x68\x8e\xb6\x91\x6e\xfc\x16\x21\x92\xc2\x0b\xf6\xdc\x4d\x82\x76\x88\x20\xc7\xa2\x6b\xe1\xa8\xc4\x2c\x5d\x8d\x3f\x2f\x95\x80\x19\xee\xa2\x2c\x5a\x0b\x0c\x18\x47\xfe\xbf\x76\xf9\x80\x6a\x95\xc6\xae\x81\x0e\xc5\x55\xdd\xe7\x2c\xd2\x98\x57\xd7\xa3\xee\x00\x60\x4c\x12\xaf\x0a\x8e\xba\xb6\x16\xe9\xe8\x8f\x2a\x29\x61\x24\xc3\xbb\x75\x44\x3e\x21\xf3\x0a\xcc\x04\xb8\xc6\xf3\x49\xbe\xc1\x79\xb4\x90\x21\x4e\x52\x04\xb8\xa0\x60\x31\xdc\xd6\xd5\xe9\x18\x4e\x1f\xa7\x14\x37\x62\x79\x3a\x2f\x11\x18\x58\xea\x0d\x94\xfa\xb6\x30\xed\x25\xb7\x5b\x37\x3e\x23\x08\xa8\x58\xae\xbc\x2f\x04\x49\x62\xb1\x7b\xd6\xec\xe1\x7a\x1a\x36\x48\x4c\x1e\x4e\xaa\x0c\xfa\x5d\xb6\x75\x05\xd7\xf0\xa8\x8d\x11\xb2\x88\x63\x79\xde\x55\x33\x3e\xd3\xce\x98\x9c\x36\x13\x09\x76\xd8\x76\x96\xec\x53\x26\x4c\x1d\x01\x4f\x34\x58\xad\xdc\xf6\xb5\x2e\xf6\x4f\x21\xe5\x04\xdc\x58\xc2\x82\xab\xc7\xed\xb8\xa1\x06\xa4\x96\x5e\xe8\xca\xe3\xad\xc7\x0f\x45\x45\x49\xe6\xde\xd1\x25\xe1\x67\x3f\xdd\x41\x91\x14\x93\xfb\xb6\xf7\xf2\xb9\xda\x4f\x8a\x0b\xa0\x13\x85\xa5\x64\xcb\x6e\x3e\xe9\x73\x02\x6d\x38\xfa\x66\xce\x9f\xf8\xfb\xc0\xdd\xc9\x33\x00\x16\xd2\xbb\x9b\xf3\x41\x56\xfb\xce\x56\xce\xe6\x56\xc0\x90\x08\x39\xb3\xbd\x1a\x98\xbf\x14\xc3\xd2\xd0\x5e\x19\x40\x2a\x9f\x12\x20\xcc\x5f\x86\x31\x39\xf2\xc6\x7e\x40\x31\x0b\x41\x34\x51\x1c\xe1\x75\x62\xd1\x19\x6b\x83\x81\x98\x74\x7c\x99\x26\x02\x83\x6f\x5f\x9e\xce\xcf\x35\xe8\x42\xb5\xff\x2c\x3b\xdf\x75\xe8\x93\x38\xb3\x65\x08\x4b\x99\x23\xb9\x2b\x0e\xa7\xc3\x73\x0d\x47\x51\x68\x07\xa2\x1b\xf7\x29\x1a\xe2\xda\xdd\xed\x0c\xed\x9c\xbf\x8b\xfe\x8d\x30\x34\xd3\xb8\xaf\xa9\x41\xcb\xb3\xeb\x82\xf6\x43\x68\x44\x30\x60\x7b\x15\xcd\xa7\x02\xae\x3a\x32\x8c\x32\xcc\x41\x05\xd0\xf9\x62\xcc\x8a\xd3\x27\xac\x87\xbe\x95\x61\x42\x20\x40\x40\x74\xcf\x68\x40\x6f\x60\xe2\x54\x45\xae\x89\xe3\x5b\x03\x75\x33\x99\x56\x26\x36\x1c\x2f\x0b\x11\xa5\xcf\xa7\xbf\xfe\x9a\x7a\x40\x26\x31\xb1\xd2\x5e\x9d\xf2\x27\xec\x97\xd5\xbe\xb2\x2f\xcb\x6b\x90\xf9\x91\xa9\xb1\x9c\x26\xff\x73\x12\xa8\x56\x67\xad\xe7\xe6\xf3\x96\x1c\xf7\xbd\x2c\xb5\xed\x6e\xab\x52\xfb\xf0\xdd\x64\x22\xc5\xcc\x30\x74\x53\x63\xdd\x47\xcd\x26\x27\x56\xa2\x1f\x0b\x4d\x2f\x03\x02\xcc\xe6\x82\xb2\xac\x1b\x9d\x2a\xae\xfb\xdb\xff\x63\x74\x67\x79\x0a\xc2\xf7\x22\xc0\xa1\xaa\xcf\x6b\x10\xb3\x42\x37\x38\xd6\xb8\x88\xf1\xeb\x30\x4d\x67\xf2\x4c\xa1\x79\xb0\xb2\xc9\xcf\x35\xdc\x6d\x9f\x76\x5d\xc8\xb8\x14\xc7\x9e\xee\xbe\x1b\xc8\x55\xea\x16\x0d\x42\x28\xae\x84\x7a\x83\xba\xb9\x3a\x0f\x93\x77\xff\xfa\xb7\x63\x54\xf5\x5f\x52\x19\x71\x0d\x7b\x17\xe1\xde\xc0\xf1\xf6\xb3\x3b\x87\x14\x61\x93\xd7\xb0\x87\x17\x5c\x95\x7e\xa2\x7e\x42\xc5\xa6\x23\xc3\x53\x8e\x4e\x85\xaa\x0e\xb8\x31\xcd\x43\x9f\xf3\x30\xda\x20\xad\xf5\x75\xf1\x52\xb4\x62\xff\x2c\x34\x56\x36\x87\x3b\x8e\x11\x3c\xc5\xc2\x64\x43\x5c\x23\x09\xf1\x07\x64\x8c\x93\xf4\x00\x7e\xb3\x35\x32\xe7\xc8\x46\xe4\xe4\xf4\x2f\xc1\x6e\x46\x42\x86\x19\xb2\x90\xb8\x6e\xfe\x98\xe4\xf3\x8d\x22\x56\x75\xb1\xb3\xc0\x35\xfc\xe7\xd4\xad\xd0\x71\x8d\xc3\x28\x9a\xd9\xee\x11\x97\x4b\x99\x78\x45\x46\x31\x5b\x12\xf0\xc4\x60\x37\x55\xdd\x79\x9a\xfe\x32\x55\xce\xb9\xf5\x35\xc0\x06\x8c\xae\x28\xb6\xda\x7e\x99\x5c\xae\x12\x11\x3a\xd7\x2f\xd5\x4b\x35\x82\x4c\x4f\x6a\xc4\x06\x18\x38\xb9\x0b\x1b\xc8\x3a\xe4\xe9\xe4\x74\x20\xb5\x17\x9f\xf8\xa4\x30\x66\x40\x42\xec\xba\xa3\x46\x31\xb0\x01\x93\x21\x7a\xec\x7b\x17\x57\xfb\x0f\x0d\x28\x21\xfc\x34\x14\x7b\x78\x98\x24\x08\x49\x14\x31\xea\x85\x46\xba\xf3\xf5\x6b\x8f\x44\x84\xd9\x45\x00\x56\x3d\xad\xb3\x33\x24\x1c\xd3\x0c\x71\x08\x6d\x71\x00\x9c\x13\x7f\xdb\x13\x24\x11\x4d\x05\x2e\xc4\x3f\x57\xc3\x1c\x38\x89\x68\x46\x90\xb8\xf5\xe9\xe7\x73\x5d\xb5\x95\xf2\x58\x5f\x12\xb1\x38\xe6\x4e\x5e\xe6\xdb\xfa\x7e\x38\xff\x48\xc4\x32\x81\x62\x9d\xc8\xa6\xf6\x59\x12\xe4\x77\xbb\xd5\xf0\xd5\xf5\x86\x96\x44\x31\xb5\x78\x56\x67\x50\x9c\x6b\x38\x57\xff\xea\xff\xe3\xbf\x9a\xc5\x5e\xda\xc3\xf5\xe1\x0f\x82\x2a\x82\x9d\x7a\xbc\x6f\x8b\xff\x8e\xd2\x56\xdf\xd6\xf7\x4e\xbc\x60\xce\x43\x26\x51\x2c\x48\x50\x1e\x09\x40\x4f\x12\xc5\x52\x09\xea\xb9\xf0\x8a\xb6\x59\x8c\x68\x96\x66\xb7\x64\x12\x25\x44\x60\x29\xc5\x21\xb9\x47\x6f\x22\xa1\x0c\xb9\x35\x6e\xab\xbd\x86\xf2\xbe\x78\x79\x6d\x11\xc4\xfb\xf7\x08\x84\x48\x94\xb0\xc4\x6f\x43\xd6\xe7\x9e\x83\x23\xe6\x7e\x70\x4c\xb0\x25\xc2\xfa\x94\x5e\xfb\x74\xd5\xbe\xce\xb9\x29\x24\x4a\x72\xdb\x1e\xae\x1c\x7b\xb9\xbf\xe6\x8c\x49\x2f\xf4\x7e\x55\xb4\x1f\x55\xad\x9b\xe5\xa9\x9d\xcc\xf6\xce\x75\x54\x8e\xfe\xfc\x2f\xb8\x70\x31\x26\x8f\x28\x27\x59\xd6\x07\xd5\xab\xc3\x71\x5f\x9d\x27\x19\x01\x12\xe5\x69\x22\x2c\x7a\x4d\x5b\xba\x9a\x1f\x00\x6f\xfe\xa2\x72\x69\x1b\xc4\xbe\x9e\x25\xd4\x81\x21\xa5\xaa\x27\xdc\x43\x24\xca\x8d\x51\x91\x47\xb4\x6c\xab\x6e\x27\x19\x5f\x0b\xa7\x12\x86\x70\x1b\x27\x69\x75\x8d\x30\xb2\xc9\x25\xf1\x94\x24\xd6\xd8\x20\x5b\xd8\x53\xf0\x6f\x49\x24\x12\xc0\x70\xd7\xe2\xaa\xec\x4b\x99\x59\xa2\x42\x65\x88\xc0\x91\x3e\x77\x8c\x7a\x0c\x45\x55\x5e\x57\xe5\xf4\xd7\x84\x36\x5e\x4f\xb0\xf3\xc6\x03\x74\x8e\x44\x02\x80\x2b\x07\x44\x74\x2a\xd6\xee\x88\x54\x9c\xda\x28\x06\x5c\xa4\x33\xd2\x33\x77\xa3\x14\xd3\x78\xb1\x4e\xe4\xa1\xae\x0e\x77\x36\x50\x70\x21\xec\xf8\x09\xa9\x24\x42\xf1\xdf\x57\xd1\xec\xde\xab\x89\xa6\x7e\x77\x1c\x64\x9c\xf9\x3a\x73\xd9\x54\x7b\xab\x63\x6c\x9b\xa4\x66\x04\x4e\x35\x89\x74\x4c\xc1\xee\x7f\x56\x06\x63\x72\x46\x2d\x18\x62\xf9\x5c\xdf\xcc\x7d\x51\xbe\xec\xab\xf2\x65\x29\x5a\x4f\x5a\xf1\xdb\x9e\x93\x5f\xaf\x51\x2d\x2d\x54\x4a\x68\xbd\x14\xf5\x4c\xff\x3a\xf1\x23\x81\x44\x92\x79\xae\x2d\x51\x3a\x0d\x4b\x58\x95\x1a\x06\xfc\x57\x24\x02\xca\xb0\x86\xb2\xdc\x57\xed\x6b\x51\xbe\xf4\x8d\x0d\x24\x82\x8c\x89\xbe\xaf\xfd\x57\x22\xc4\xdd\x60\xce\x71\xa3\xc6\x70\x7e\x9c\xff\x75\x23\x4c\xaa\x31\x6d\xb7\xab\x5d\xb1\xb8\x78\x29\x31\x5f\x11\x44\x86\xf3\x7f\x0f\x8d\x2d\x89\xa2\x14\x83\x84\xab\xaa\x7a\x5b\x0a\xe3\xaf\xb9\xb3\x6f\x58\x29\xd8\xdc\xaf\x97\xe1\x33\x13\x61\xde\xfe\x7e\x75\xbb\xb8\xf7\x1f\x76\x73\xc0\xd8\xbd\xf1\xa1\x50\x75\xf5\x15\xce\x56\x79\x5e\x94\x7a\x16\xb3\x4e\x08\xa1\x99\x8a\x5c\x11\x18\x39\x0f\x76\x86\xe4\xfe\x7c\xd4\x05\xf1\x4d\xf1\x17\xd0\xf0\xa1\xb2\xcd\x52\xcf\xcb\xc7\xc1\xc3\x23\x71\x96\x10\xdf\xe4\x0c\x9d\xc1\x44\x9d\xd3\x5f\x36\xd4\x10\x92\x30\x43\x6d\x44\xfe\xd2\x17\x7d\x09\x49\x78\x66\xfb\x97\xd6\xab\xbb\xe5\x53\xd3\x33\xc4\x11\x92\x28\x81\xd4\x4b\xff\x5b\x75\xd6\x38\xc0\xa3\x27\xa7\x35\x11\xd6\xf4\x6d\xd2\xe7\xa1\x28\x67\xc0\x0c\x84\xa4\xca\x52\xa0\x38\x97\x64\xc4\x70\x44\x48\x46\x88\x70\xa2\x9e\x76\x5d\x06\xbf\x80\xe4\x91\xed\x1a\xba\xaf\xda\x4a\xf6\x50\x37\x42\x72\x46\x14\x1b\x74\x54\x7e\x09\x2d\xc9\x84\xf0\xc8\xea\x1d\x59\x2b\x1f\x3a\xe2\x5b\x38\x22\xbe\xba\xb7\x3d\x84\x27\x2a\x1e\x5a\xba\x47\xd1\xbc\x3e\x9d\xe6\xd1\x84\x84\x70\x2d\x63\xe7\x1a\x6c\x54\x55\x7f\x62\xca\x89\xd4\xb6\x97\xb6\x81\x12\xf1\x60\x45\x89\x91\xdd\xa0\x00\x4d\x88\x04\xc0\xac\xc0\x66\xbb\xd9\xae\x36\xdb\xd4\x7f\xae\x74\x3c\xa0\xbb\x42\x6c\xf7\x25\xfe\x88\x10\x2d\x73\xe6\xc5\xc7\xa1\xc4\x26\x91\x3e\x6c\x0f\x3f\x02\x59\x66\xe1\x80\xab\xbb\xe1\x96\x4b\x0c\x61\x98\xe5\x2d\x7d\xa7\xc6\xc0\x1e\xfe\x10\x45\x77\xc1\x37\x55\xfd\x6c\xe9\xc7\xfd\x77\x12\xc9\xad\xcb\xd7\xf9\x17\x05\x9c\x0e\x8f\xf0\x71\xb7\x7c\x1a\x9f\xd8\x28\xb7\x19\xb8\x72\xc3\x20\xfd\x47\x68\x94\x0a\x4c\xec\x59\xa4\x83\x9d\x27\xf8\xf5\x07\x51\x9e\x27\x48\x47\x42\x23\x41\x3d\x1a\x0c\xe9\x1b\x3a\x93\xec\x95\xdf\xd0\x28\xfd\x8b\xf5\x43\x63\xe3\x7a\xd0\xbe\x95\xc8\xb5\x64\x85\xf6\x8b\xbf\x40\x3f\x77\x91\x47\x80\x73\x12\x4a\x88\x40\xd6\xb1\x4d\xb5\x17\x35\xfc\xf4\x1f\xd3\x34\x49\x2d\x53\x5a\x17\x91\xcf\x00\x66\x08\x65\x99\x55\x46\xb8\xaf\x5e\xee\xc6\x70\xab\x38\xf7\x43\x78\x86\xeb\xb5\x33\x54\x4e\x68\xd3\xff\x00\x93\x29\xd6\xd2\x01\x19\x9d\xd7\xf0\x82\x64\x31\x13\x2b\x4f\x63\x02\x1e\x2d\xed\x90\x24\x77\x7a\x82\x97\x26\x34\x11\x19\x84\xe5\x22\xf6\x56\x15\x6b\x32\x26\x8d\x00\xb3\xe5\xa7\x06\xea\x89\x9a\x9d\x1f\x21\x00\xab\xd8\xdb\xf5\xfd\xf2\xe9\xee\x71\x77\xbd\x5a\xde\x3d\x2c\xee\x37\xfe\x82\x53\x2d\x6c\x96\x44\x34\xaf\xd5\xe9\xb2\x92\x3f\xfe\xbd\x8c\xdb\x80\x77\xa1\x35\x16\x33\xe6\x97\x06\xcd\xa4\xe4\x03\x1d\x24\x27\x2c\xea\x7f\x32\xe7\x14\x5c\xbe\xf1\xb6\x30\x18\x96\x0c\x16\x2b\xcd\x0d\xd5\x10\xd2\x5c\x83\x46\xb8\xee\x90\xa2\x3e\x49\xa1\x02\x09\xcf\x4d\x55\xbb\x5e\x19\x3f\x8e\x27\x60\xc1\xa2\x8f\xd7\xeb\xaa\x6a\xfb\x8f\x0d\xc2\xc2\xae\xb7\xeb\xc5\xf2\x6b\xf8\x14\x00\x33\x3a\x96\x2b\x1b\xf4\x60\x89\xed\xba\xa8\x01\xec\x3f\x87\xaa\x47\x9a\x50\x11\x09\xab\xfb\xad\x2a\xd7\x0b\xea\x0f\xa4\x51\xec\x08\x35\x7f\x40\xd1\x59\xa2\xe9\x37\x33\x19\x4f\x10\x5c\x98\x3b\xa9\x27\x6f\x4e\x26\x04\xf7\x11\x6b\x23\x50\xd4\x55\x9f\x56\x3f\x8f\xa3\xc0\x94\x50\x99\xe7\x68\x86\x36\xb0\x2f\x0e\xc3\x65\x4a\x55\x94\x63\x11\x68\x75\x7b\xbb\xd9\x6d\x9f\x76\x5f\x50\x20\x87\x5c\x7d\xbb\xef\x5f\xbf\x22\x60\xc5\xc0\x85\x7e\x81\x66\x52\xd0\x27\x54\x65\x12\x8b\x84\x3f\x1c\xfd\x97\xff\x9a\x4e\x2c\x3f\xaf\x2d\x38\x82\x46\xfc\x8c\x7d\x1b\xab\x43\xd1\xce\xd0\x13\xfb\x2f\x72\x2b\x2c\x7d\x7d\xb3\xbd\x1a\x9d\x11\x22\x89\x18\x1e\xc4\x0d\x3e\x7d\xe0\xaa\xf2\xc7\x4c\xca\x99\xe5\x8b\xaa\x3e\xd0\xf5\x70\x20\x31\x7f\x38\x8b\xd0\xe0\x60\x99\xf6\xee\xf1\x76\xd8\x16\x47\x58\x44\x22\xec\x75\x7b\xa9\x85\xc3\x39\xcc\x6a\xf0\x76\x23\x39\xc1\xe4\x6e\x09\x1f\x88\xdc\x1e\x38\x12\x8c\xc4\x00\x5e\x04\x05\xd9\x76\xfd\xe9\x49\x02\x56\x73\x6b\xb3\x5e\x84\xcf\x84\x6d\xc8\xb8\x81\x56\xbd\x76\x6e\xc0\x17\x4c\xd5\xf4\x87\x25\xee\xeb\x0e\x21\x16\xe4\x4b\xea\x83\xcd\x83\xce\x38\x15\x8c\x08\xeb\x22\x1c\x6b\x50\xe8\x35\x3f\xd8\xfc\x63\x38\xa7\xb6\xe8\x3c\x5f\x17\x44\x16\x1f\xdc\x57\x9a\xa9\x61\x61\x34\xe2\xc6\x1a\xe8\xd7\x50\xfd\x22\x8c\x32\x4e\x44\x4f\x14\x3b\xa3\x6f\xde\x0d\x12\x39\x62\x89\x2d\x35\xee\x38\x5f\x40\x18\x05\x19\xd1\x41\x93\xb4\x13\xd5\xf8\xa5\x49\x61\x8c\x70\x9f\x4e\x1e\x6c\xee\x2c\xa6\x3c\xc9\x1d\xbe\xa1\x81\xaf\x67\x35\x79\x59\x71\x9c\xe1\x26\xfd\x51\x94\xbd\x10\x50\xf7\xb9\x89\x85\x6d\x35\x12\xfb\x3d\x94\x2f\x80\x42\x7e\x6e\x89\xe9\x51\x9c\xcf\x12\x02\x3c\x1e\xf0\x9c\xd9\x80\xa2\x73\xf1\x26\xb7\x9d\xc4\x26\xb5\x80\x7b\xa4\x7e\xda\x16\xc7\xf9\x76\x3c\xc2\x12\x01\xd8\x8d\x55\x34\x5e\x1e\x6f\x5b\x85\xad\x91\x25\x4a\xc5\x43\x22\xcf\x81\x10\x4d\x77\x54\x1b\x34\x0c\xcb\xa7\xc7\xd5\xad\xef\x7a\x23\x2c\x4d\x0d\x71\xaa\x90\x7b\xa8\x1d\x4c\xd2\x12\x58\xfb\x24\xea\xac\x3f\xcd\x52\x61\x01\x80\x18\xd6\x3a\xe0\xb2\xaa\x0e\x20\x3d\xa1\x13\xde\xf4\x27\x37\x92\x25\x06\xcb\x9c\xb8\x69\x6c\xbe\x3d\x3f\xdf\xff\xb9\xbb\x5b\x3e\xd9\x5e\x51\x7f\x69\x59\xaa\x85\xf0\x6c\xf0\x48\xff\x76\x1f\xa0\xf9\x84\x65\x39\xc5\x30\xb6\xf3\xa3\x5a\xf1\x3b\xcf\x95\x65\xb9\x95\x0d\x7f\x81\xf6\xba\x68\x06\x9d\xb2\x84\xe5\x34\xe2\x34\xb4\x84\x4d\xd0\x13\xe3\xb3\xe4\x31\xb8\xfa\x4f\xd3\x16\xed\xa0\x53\x8e\x30\xce\x2c\x29\x8f\xaa\xca\x12\x94\xed\x32\xb0\x5e\xd7\x6f\x72\x39\xfe\xfb\x99\x25\xd8\x2c\x54\xf5\xf4\x0e\xf5\x7b\x01\x1f\xfe\xd4\x82\x31\xac\xce\xfa\x17\xdb\xad\x20\x1a\x0e\xa6\xb1\x76\xcd\xa6\x7f\x8a\x72\x59\x81\x31\x85\x1a\x72\xe7\xe3\xef\x78\x83\xce\x44\xc6\x70\x41\x78\xb7\x6d\xa0\x8c\xaf\x09\x93\x49\x2c\x9d\xeb\x70\x2b\x0e\x30\x76\x61\x26\x17\x2c\x4d\x96\x5a\x32\x7e\xab\xd1\xda\xb9\xa6\x5b\x97\x5d\xa3\x23\x0c\x25\x61\xca\x71\x91\xfb\xad\xd5\x51\xe4\xcc\x3f\xeb\x4f\x1e\x90\x92\x56\x91\xaf\x73\x54\x70\x4d\x8e\x0f\x6b\x22\x90\x5e\xd8\x73\xc7\x2c\x85\x87\x2a\x0e\x48\x21\xc8\x54\xe3\xee\xef\x14\xa5\x08\xd3\x42\xe0\x5c\xdf\xfa\xfe\xb0\xd5\x7a\xe9\x31\x32\x84\x41\x94\x47\x39\x5a\xf6\x9f\x4e\xba\x6d\xbb\xb5\x7d\x29\x77\x3a\x0f\x83\xa8\x40\x42\xbd\x1f\x50\xec\x02\x68\x6b\xb7\xad\x70\xda\x2f\xc5\x31\x8c\x4b\x72\x44\x5e\x61\x5e\xe5\x0b\x82\x24\x87\x69\x38\x06\x19\xf7\xca\xb2\xdf\x36\xd7\x6b\x51\xf4\xce\x01\x03\xc1\x3d\x72\xe2\xa1\x28\xbd\xec\x9b\x3b\x68\x22\x4e\x7d\x43\x34\xf6\x45\x5d\xf2\x6f\x13\x66\xb8\x15\x8a\xe9\xbb\xb5\xfe\xab\xba\x59\x77\x02\x9d\xd8\xb6\xdb\x8f\xbb\xd6\xcb\x78\x4f\xf2\x6f\xb3\xc4\x3b\x7d\xfb\xe4\xec\x89\xe3\x28\x93\x78\xdf\xdb\x5a\x28\x18\x6b\x31\x69\x12\x13\xc2\x72\x18\x6a\x01\x20\x78\xf3\x6a\x02\x5e\x20\x31\xe1\x16\x77\x55\x9e\x0e\xcf\xa2\x16\x07\xe8\xe9\xbf\x49\x4c\xa4\x53\xfc\x45\xce\xdf\x6e\x0b\x47\x91\x86\xcb\x24\x46\x7f\x3e\x9a\x5b\x14\x15\xde\xe8\x4d\x55\xff\xda\x08\xc5\x54\x2a\x44\x35\x17\x25\x8a\x1d\x9f\xc4\xfe\x07\x14\x4b\x8b\x0e\x9d\xba\xf1\x31\xd3\xc2\xd3\x96\x74\x76\x6f\x73\x3a\x4c\x6e\x26\xa6\xe0\x25\xd7\x37\x6d\x7d\x53\xc0\x5e\x7b\xab\x10\x67\x34\x72\x6c\xc9\x78\xf2\xe5\xeb\xa7\x9b\x4a\x9c\x65\x76\x8b\x6c\x8a\x97\xd2\xd5\x4d\x26\xdc\x07\x61\xa0\xc9\xa4\x97\xdd\xb3\xf5\xef\x6e\x92\x5a\xc5\xc3\x53\xcf\xe3\x42\xe2\x8c\x27\x16\xc4\x8a\xc2\x0a\xaa\x2a\x4a\x9c\x6c\x77\xe5\x4d\x2d\x94\xbf\xc4\x9c\x66\x98\x3d\xb1\x41\x7f\x50\xeb\x08\x47\xf3\xdc\x69\xdc\x74\xab\xa0\x28\x5f\x1c\x35\xdc\xf8\xe2\x85\xca\x6c\x80\xe1\x9d\xb7\x3e\x45\xea\x46\x48\x6a\xb8\xeb\xc9\xea\xfd\xc8\x4f\x1e\x85\x4c\x39\x71\x22\x7e\xdd\x32\x71\xa5\x8f\xce\x51\x19\xbf\x1a\xa5\x29\xf6\xd9\xe1\x22\xdd\x1c\x6b\x10\x7e\x0d\xc6\x40\xb2\xdc\x09\x90\xa0\x0e\x4c\x55\x63\x7a\x75\xfc\x3b\x90\x52\xef\x4f\x2d\x2f\x58\x4e\x48\x0c\xd2\xf2\x07\x3c\xfe\x73\xb5\x1b\xa4\x6c\x62\x43\x32\xc4\xf0\x88\x8b\x9a\xeb\xf8\xf2\x4c\x92\x62\xc7\xfa\xa1\x7a\x07\xcb\xfc\x17\xce\xc0\x29\xb1\x2a\xf1\xde\xb7\x4b\x22\x93\x23\xc8\xc2\x45\x53\xd7\x55\x39\xe8\x5c\xec\x0e\x4b\xcc\x5b\x39\x4a\x9e\x6d\x75\x17\xd2\x3e\x09\x01\x45\x03\x59\x9a\x86\xed\x3f\x6f\x2e\x62\xc8\x84\xe6\x69\xe2\x33\xeb\xa2\x69\xaf\xef\xbe\x5f\x0f\x39\xfe\x48\xc2\x58\x8c\x40\x4a\x14\x67\xfe\x0e\xcd\x88\x2f\x81\x24\x2c\x4b\x71\x9b\x1f\xe6\xbb\xe2\x70\x90\x5b\xde\x18\xa7\x07\x83\xaf\x6b\xf2\xfb\x4c\xc8\xd8\xf5\x23\xa0\xf3\x7f\xdc\xc3\xb6\x80\x9a\xb8\x45\x3e\xcd\x18\x24\x4c\xa6\x18\xd1\x1e\xd1\xcb\x04\x3d\x8c\x10\x13\xa6\x09\x36\x39\x3d\x9c\xaf\x7b\xcb\x9a\xc4\x84\xa6\xb1\x7f\x0c\x08\xc1\xb8\xa9\xea\xcb\x6a\x2f\x49\x92\xc4\x58\x2e\x58\xdb\x16\xd1\xed\x15\x05\x0a\x8f\x4f\x71\x24\x7e\x7c\x2e\xb1\x29\xdc\x66\x42\xb0\x3a\x3e\x78\x32\x09\x8f\x7c\xb3\x61\x15\xdc\xa2\x24\x31\x60\x0b\xc1\xba\x68\xaa\x72\x30\x7b\x92\x34\x89\xb9\xf1\x54\x04\xc7\xa2\x06\xbd\x28\xf5\x48\x50\x5f\x93\x24\x23\x1c\x85\xd2\x7c\x21\x72\x74\xfb\x19\xb5\xa5\xbc\xa6\x67\x44\x9c\xb0\xa3\x8c\xaf\x3f\xcb\x52\xec\xd2\x38\x3a\xb8\xf4\xa4\x7c\x48\x92\x0c\x72\x82\x64\x81\xb8\x1b\xae\x7e\xb6\x50\xea\xcf\x79\x8f\xfc\x97\x0c\xcd\xbc\x06\xa6\x47\xe5\xda\x1c\xd1\x25\x18\xb1\x1b\x9d\xc6\x0e\x68\xe5\x12\x86\x68\x69\xde\x27\xbd\xb3\x24\xe1\x71\x8c\x61\x95\x05\x4a\x6e\x47\x4d\xc2\xdb\x0b\x4a\x82\x4f\xae\x4d\x26\x11\xd6\x9f\xf1\x6b\xeb\x27\x9f\xfd\x4d\x24\x4f\x70\x5f\xd5\xb6\xf2\x0d\xd7\x6f\xfb\xab\x42\x3b\x6e\xff\x8b\xfb\x1d\xf7\x69\x0d\xd3\xe6\x89\xe4\x29\x56\xdc\x6f\xa1\xbd\xaf\x5e\x1c\x03\xdc\xaa\xae\xab\xf0\x92\x14\x21\x88\xfe\x3e\x3a\xce\xf0\xf5\x84\x13\xcd\x0f\xcb\x29\xb0\xbe\x9c\xf7\x20\xca\xf3\x18\xa6\x3f\x40\x72\x4c\xbe\x69\x04\xe6\x80\x97\xaf\x75\x55\x56\x0f\xc5\x25\xa9\xdf\x6c\xc0\x90\x68\x6a\x91\xa8\xcb\xfb\xd5\xee\x0a\x5a\xb1\x7b\xb6\x59\x40\xbf\xff\x26\x3a\xb5\x1e\x3d\x6e\x78\xb2\x16\x93\x46\x32\x92\x68\x99\x38\x4d\x66\xab\xa4\x70\x25\xd4\xdb\x4b\x5d\x5d\x1a\x1d\x88\x52\x27\xb6\x6d\xbb\xd7\x82\xbf\xf0\xa9\xaf\xe9\xbf\x48\x22\x62\x89\x9d\xea\x37\x08\x22\xf7\xcd\x08\x79\x43\x12\xe0\xb1\x65\xfe\x6d\xab\x63\xe8\x63\xef\x15\xf4\xba\x11\x4a\x2a\x4b\x4d\x73\xb0\x29\x3a\x34\x5d\x43\x55\x27\x92\x00\x70\xe3\xd6\xa3\x85\xbe\x88\x72\x5b\x8b\x51\xb6\x2a\x31\x8a\x63\x7b\xa4\xc5\x5c\xed\xc6\x5e\x75\x1a\x25\x56\x2e\x1a\xb5\x4c\xcf\x18\x71\x7c\x9d\xb4\xac\x90\x94\xb0\x88\xa5\x93\x42\x7e\xb0\x37\xfd\x4f\xa5\x84\x65\xb6\x77\x5a\x1f\x8a\xf2\x16\xc6\xa2\x58\x24\x25\xb1\x36\x6c\xe4\xba\x3c\x20\x88\x24\x1c\x4f\x98\x65\x20\x68\x45\x8d\xba\xb0\xdb\x8f\x2a\x1c\x93\x09\xfa\xbe\xb8\x5d\x36\xdd\x8c\x01\x7d\x7d\xea\x0c\x46\x50\x1c\x22\x29\x23\x0c\xe9\x9a\x0e\x4d\x14\x3e\xa2\xc6\x32\x92\xa2\xda\x5c\xb7\xb9\xb8\x10\x79\x9e\x92\x96\xa4\x2c\xa1\xc2\x84\xcc\xe7\xb0\x22\x9f\x32\x99\xa1\x91\xae\xab\x8f\x61\xe7\x21\x49\x99\x51\x42\x8e\x30\x8c\x5f\xa0\x0e\x97\x9e\x44\x26\x33\xae\x4c\xb5\xab\x4a\xf8\x2e\xf6\x85\x5e\xfd\xc7\xb2\x73\x3c\x56\xf7\xd5\x4b\x18\x49\xb2\xdc\x92\xad\x97\xa2\x05\x27\x0f\x31\x09\x52\xd2\x84\xe6\x39\xf4\xd0\xb4\x0f\x6b\xf8\x86\xaf\x21\xd1\x99\xd2\x83\xa9\xfb\x28\x0e\x80\x78\xb1\x9b\xba\x3a\x5c\x8b\xe3\xf1\xa2\x81\x79\x94\xb0\x4b\xd3\xc8\x92\x3c\x34\xc2\xc0\x05\x3c\x71\xfe\xa9\xa5\x09\x43\x0f\x69\x77\xb0\x92\xf7\x93\x6b\xce\x08\xc5\xc4\xd5\x41\xfc\xbc\xad\xc4\x7e\x0d\x42\x05\x39\x05\x92\x66\x39\x45\xb0\x6a\xf7\x80\x1e\x00\x3b\x45\xfd\xa1\x9c\xa6\x38\x25\xc6\x6a\x76\xbf\x2d\xc6\xa7\x79\x92\x2a\xe1\x49\xe9\x87\x04\x03\xe3\x51\x69\x82\xa9\xb1\xe7\xf5\xdd\xd3\xfa\x6e\xfb\xa7\x97\x78\xd9\xdd\xdf\x6d\xb6\xe1\x12\x4c\x6a\xbb\xb2\xf7\xef\x7f\xe3\x87\x79\x1e\xb3\x28\x80\xaf\x3d\x01\x9c\xa3\x8e\x1f\x19\xb3\x94\x8b\x08\x73\xc5\xf0\xfe\xf0\x72\x68\xef\x9a\xe6\x04\x57\x3d\x68\xf4\xc2\xca\x5c\xf4\xb6\xf4\x2f\x9c\xab\x1c\xc3\x68\x28\xf5\x93\x71\x0d\x83\xfe\xf2\x45\x26\x30\x69\x61\xf5\x74\x3d\xc1\xd7\x10\xc5\xe1\x07\xe6\x06\x61\x5e\x6f\x85\x7a\x1b\xcb\x20\xfa\x01\x3c\xc5\xfa\xf5\x47\x51\x5e\x15\xd8\x0d\xf7\xb7\xb2\x12\xa9\x8c\x62\x2b\x12\x78\x46\xea\xc4\x97\x70\x69\x32\xb5\x2d\xfd\x2f\xd0\x3e\x95\x23\xa3\xb2\xad\x7a\x0d\xf4\x6e\x20\x64\x0e\x41\xec\x9b\x60\xae\x61\xdf\xad\xe1\x7e\xa2\xa8\xd8\xd2\x79\xdf\x3c\x7d\x7b\xbc\x5e\xad\x3d\x66\x27\x05\x62\xf1\xb0\xae\x1e\xeb\x7f\xe0\xae\x85\x4b\x9e\xdb\xd1\x8b\x84\x38\x76\xd8\x6b\x78\x2f\xaa\x53\xe3\x00\x67\x21\xcf\x91\x02\xa7\xba\xaf\x1c\x5f\x72\x62\xfe\x7f\xc3\x72\xfa\x57\x02\x5a\x61\xef\xa5\x7a\x15\xf5\x0b\xdc\x00\xf4\x5c\x80\x24\x35\x79\x8a\x2f\x5d\x8d\xe9\x77\xfc\x51\x63\x49\x88\x31\xa1\xe0\x19\x67\xee\xfc\xe3\xca\x22\xc2\x90\xa3\xe8\x66\x5f\x1c\xc9\x30\xcd\x9d\x51\x6a\xb1\x51\xcb\xc5\x76\x0c\xa4\x24\x19\x8d\xf3\x9c\x8c\x52\xcc\xa3\x09\x92\x51\x4e\x90\x4d\xbc\x50\xd5\x50\xab\x17\x8f\x88\x58\x38\x7f\xcb\xbe\xc0\x07\x74\x91\xf6\xf3\x44\x97\x24\xa3\x3a\x45\x99\xd5\xe3\x5e\x9c\x6f\x44\x08\xe9\x32\x16\x03\x36\x8b\x17\xcd\x5d\xf9\x08\x3f\xdb\x5b\x5b\x75\x9d\x6a\x67\x91\x8c\x65\x11\x7a\x78\xaf\xa2\x79\x7e\x3d\x37\x85\x12\xfb\x59\x68\x4d\xc6\x72\x99\x61\xb1\xa3\xae\xaa\xc3\x8f\xee\x3f\xe1\xb7\xb4\x25\xdd\x5b\x1c\xc4\xfe\x45\xf4\x1f\x43\x92\xe5\xa3\x10\xb6\x47\x08\xdf\x57\x13\xa5\x37\x92\x31\xa3\x72\x57\x13\x74\x9d\xc1\x33\x7c\x27\xf3\xee\x4e\x16\xa7\x96\xd2\x3a\xcc\x7b\xa4\x7d\xf1\x17\x12\x2b\x96\xe7\x61\x4b\xc4\x54\xd8\x53\xfb\x0a\x75\xb7\xca\x46\x0d\xbd\xe3\x47\x9b\x38\x69\xca\x83\x68\x9a\x55\xfb\x3a\xa8\xc1\x67\x09\x4f\xf2\x5e\x3b\xc7\x75\x5e\xdf\x54\xf5\x62\x02\xe4\x26\x59\xa2\x2d\x33\x60\x50\x9b\xb0\xfd\xc9\xc3\x5d\x31\x4b\x25\x60\xc9\xfc\xba\x2a\xab\xfa\xf3\xf5\xf1\x89\x7d\x73\x27\xc9\x52\xeb\x52\x9c\x9a\xce\x2a\xac\x2b\x59\x7d\x42\x34\x47\xb2\x2c\x07\x6c\x64\xfb\xb6\x6f\xeb\xe2\xe7\x20\x6c\xc9\x32\x48\xb1\x02\x65\x8a\xfd\x6f\xa4\xec\xc6\x67\xcc\x53\x9b\xcd\xf1\x5d\x66\x13\x56\x32\x92\xe5\x9c\x60\x0e\x7a\xf1\xd0\x53\x13\x92\x8c\x83\xc4\xd2\x2e\xf2\x9e\x68\xa4\xd4\x76\x47\x04\xb1\x3c\x99\x1b\x68\x17\x28\x29\x88\x2d\x40\xa3\xa7\x26\x32\xae\x82\xe2\xea\x63\x55\x1f\x5c\x2f\x44\x9f\xe2\xf1\x03\x45\x8e\xc9\xf8\x5b\x68\xaf\x8b\xf7\x67\xfb\xde\xef\x3b\x43\x11\x46\x48\x86\x35\x7c\x53\x03\xd0\x09\xbb\x21\xc9\x24\x10\x2f\x41\xb8\xd8\xef\xbf\x54\xa7\x66\x70\x63\xca\x50\x6e\xd5\x0d\xdb\xba\x80\x77\xf8\x21\xea\xba\xa8\xea\xf9\x8e\x40\x57\x75\xce\x74\xa4\x6d\x99\xeb\x6e\xeb\x9b\xc4\xea\x87\x21\x4e\x72\x7e\x96\x6b\x9a\x60\x39\x75\xec\x30\x8f\xfd\xd4\x0c\x62\xeb\xb7\x37\x94\x0d\x11\xb7\xdd\x01\x2b\x5d\xa5\x41\x55\x1a\x85\xd1\x26\x0e\x53\x66\x12\x8d\xb5\xde\xce\xed\x54\xb0\x7b\x2f\x4a\x55\xb4\x55\x1d\x1e\x93\xc9\x48\x4c\x07\xbd\x32\xbf\xb3\xe0\xfe\x6b\x3a\x61\x08\xf5\x29\xe1\x23\x64\x9e\xfe\x66\x4e\xf8\xd7\x21\x60\x1e\x51\x1d\x3a\x26\x57\xb7\x0b\x5f\x0b\xcd\xa3\x94\x8d\x1c\xbb\x01\x5e\x62\xf1\x02\xd3\x5c\x41\x1e\x71\x03\x79\xdf\x8f\x73\x5f\xfc\xe7\x84\xdb\xc0\xf6\x75\xb8\x91\xe4\x91\xb4\xf0\x38\xaf\x54\xd6\xd7\x58\x67\x77\xc6\x3c\xd2\x11\xf6\x56\xee\xb4\xdd\x84\xc7\x19\x78\x3f\x08\x24\x3a\x60\x56\x3a\xeb\xce\x33\x84\x92\x9c\x50\xdb\x6c\x52\xc2\xc7\xf2\xd4\xb4\xd5\xc1\xea\x2a\xf8\x26\xe6\xbf\x65\x15\x72\x92\x26\xe8\x31\x3e\xad\x1e\xc3\x79\x73\x01\xda\x23\xf2\xa0\x29\x34\x94\x2d\x5c\xc3\x03\x34\xe2\x77\xac\x29\xfe\x0c\x8a\x61\x97\xcb\x23\xa8\xba\x1a\xee\x89\x39\x95\x31\x86\x59\xd6\xb9\x57\xe7\x2f\xa0\xc3\x2a\xcb\xa9\xa6\xc8\x4a\x77\xb7\x7c\xda\x21\xed\x29\xd9\xdd\xdf\x3d\xdc\x79\x6b\x90\xb3\x98\xc5\xba\x67\xed\x6b\x02\xa5\xd6\x6c\x68\x9c\xb3\x44\x22\xdb\xe3\x1e\x4c\x4b\xc9\x78\x2a\xe7\x31\xe1\xe8\xcc\x6d\x0e\x3e\xdb\x92\xc7\xdc\x76\x53\xa0\x84\x85\x3c\xbd\x84\xcf\x85\xc6\x47\xd4\x53\x26\x6c\xab\x10\x68\x2e\x4a\xc7\xc5\xd2\x5c\x36\x5d\xf8\x34\x56\x1e\x4b\x1b\x68\x60\x5f\xa0\x6b\x23\x71\x15\xf4\x77\xf8\x44\xef\xf9\xf2\xa9\x26\x2a\xb1\x8a\x43\xc3\xf6\x62\xe4\x5d\xf6\x03\x0c\xc3\xfd\x74\x57\x7d\x94\xcd\x2c\x39\x24\xc9\x53\x42\xb4\x0d\x40\x1d\x8a\x3e\x3c\xfd\x34\x8d\x88\xe3\x4c\xf2\xa5\xfe\x61\x86\x2b\x4f\xd3\x84\xeb\x5e\x54\xfa\x4e\x55\x0f\xa2\x28\x2f\xba\x60\x49\x9e\x3a\xfc\x7b\xd1\xf9\xe1\x8b\x52\xdf\xcf\x00\xbc\xdd\xd0\x2c\x4e\x71\xaa\xe1\x9e\x67\x29\x8a\xf4\x9c\xc8\x02\xc9\x73\x63\xb9\xff\x1a\x2f\x14\x67\xfd\x95\xfd\xfd\xfb\x90\x1b\xdc\xd9\xcf\x9c\x33\x8d\x1c\x97\xd5\x5e\x9f\x1a\x68\xe6\xb5\x14\x48\xce\x25\xc7\xbd\x17\xb3\x9d\x4e\x8c\x6d\x98\x67\xf6\xc3\x14\x41\x20\x5f\x2f\x25\x77\x75\x5e\x1d\x44\xf1\x29\xf9\x86\xfb\x9e\x48\x92\x94\xf5\x56\xa3\xd9\x20\xae\x7a\x32\x46\xc7\x1a\x86\x02\x78\x0b\x33\x01\x66\xe4\x32\xca\x30\xaf\x1a\x3c\x04\x4c\x55\xa2\xa0\xe3\x6c\xff\x09\xc9\x25\x67\x56\x73\x16\x27\xc2\x2f\x77\xe6\x5c\x25\x1a\xf3\x3c\x37\x75\xf5\x72\x2d\xea\xd3\x41\xfc\x96\xe1\x63\xfe\x44\x9a\xc7\xb1\x2b\x48\x7c\x11\xb5\x5e\x8a\xe3\xe4\x56\xb5\xe1\x48\x51\xfd\x2e\x4e\xfb\x76\x67\xb5\x07\x2d\xd2\x29\xcc\x60\x6d\xac\x42\xed\x51\xd4\xf5\x84\x6a\x91\xe4\x10\x31\x2c\x5b\x5a\x8a\x83\x6b\x98\x94\xf8\x73\x20\x31\xe2\x16\x17\x65\x59\x9d\x4a\x85\x38\xa4\x66\x7a\x8e\x9c\x48\xd6\xe7\xd7\x87\x6f\xd9\x18\x99\xdb\xcd\xed\x1d\xea\xa6\xaa\xef\x9a\x0b\x24\x02\x8f\x22\x86\xe9\xbc\x9d\x8f\x0f\xfb\x94\x09\x8f\x5c\x6f\xed\x76\xbd\xbc\x68\x94\x25\x9c\x48\x86\x89\x9f\x05\x32\xca\x5e\x79\x40\xda\xe4\xfa\x38\xd1\x19\x82\x2e\x9e\x9e\x57\xeb\xc5\xf6\xee\xe9\x71\xb3\xdb\x7c\x59\xac\x57\xe1\x34\x40\x2c\xa6\x59\xb4\xb0\x39\x37\xc3\xd8\x6b\x7c\x22\xca\x52\x2c\x0f\xd5\xa8\x0e\xe2\xe1\x2a\x9c\x26\x12\xbb\x6a\xfe\x5c\x2c\xbf\x78\xbb\xca\x19\x13\x18\x14\xbe\x54\x62\x8f\x39\x73\x44\x70\xf5\xd1\x13\x67\x59\x24\xbd\x08\x5f\xfb\xf5\xcf\xe5\xe4\xa9\x30\xd7\xc6\xd2\x1c\xf7\xdd\x2c\x2f\xca\x97\x4b\xe7\xd4\x0d\x8d\x23\x81\x39\x66\xe1\xde\xd1\xe4\xf6\x13\x29\x91\x39\x69\x71\xfe\x10\x6f\xf0\x79\xeb\x1b\xe1\x09\x18\x34\x86\xdd\xc6\x8e\x81\x80\xf5\xb1\x43\xd2\x8f\x27\x46\x63\x39\xc4\x49\x65\x5d\xef\x2c\xbf\xf0\x6e\x73\x77\x1d\x9e\x66\x96\x8a\xd4\x6b\xc1\xee\xa1\x85\xa1\x7e\xda\x3f\x26\x19\x8a\xf1\xcf\xe7\x09\xc3\x66\x63\x70\xde\x99\x23\x27\x99\x7f\x17\x79\x26\x68\xee\x69\x01\x84\x06\xf4\xbd\x27\xcf\x30\xcf\x65\x2a\xfa\x5a\x7f\x90\xe0\xeb\xcf\xc2\x89\x6d\xa4\x54\xb6\xff\xf0\x57\xc8\x08\xce\x55\x8e\xd3\xc4\x12\x4f\xfd\x2a\x56\xf8\x2c\x27\x32\xbb\xa5\x72\x99\x5b\x41\x17\xcb\x44\xe2\xea\x2b\x53\xce\x2d\x3f\x96\x73\x94\x9c\xb4\x04\x99\x98\xcb\x7a\x32\xc6\x1f\x55\x8c\x27\x36\x40\x3a\xda\x65\xb4\xad\x85\xef\x3d\x73\x43\xba\xe9\x1e\x24\xe5\xf7\xc6\x76\x23\x87\x2e\x88\xee\x09\x84\x91\x39\x20\x9e\x09\xdd\x7b\x38\x1d\x24\x86\x50\xee\x20\x44\x5c\x81\x6f\x51\x37\x9d\xed\x71\xa9\x9b\x50\xc5\xdc\x40\xdb\x22\x86\xc1\xf2\xcf\xfc\xe3\x6f\xff\xf1\xbf\x40\x04\xb6\x69\xf4\x8a\x81\x8f\xf0\x31\x83\xf1\xe5\x40\x59\xea\x3a\xf4\xb0\xb2\x37\x2b\xd5\xef\xc7\xa6\x0a\x3b\xcb\xed\xae\x78\x0d\x42\x23\xde\xe6\xb3\xf7\x37\xb7\x69\x8a\x48\xd9\x0a\xb7\x53\x75\xf7\x18\xed\x5f\x26\x20\x45\x04\xb9\xf2\xf0\x32\x80\x35\x48\x81\x44\xc3\x6a\xea\xa8\xb8\xbd\x56\x10\x46\x0d\x0f\x62\xb2\x8f\x95\x76\x14\x13\x43\xce\x55\x22\x88\x04\xcb\xfa\x5b\xcc\xf8\x3b\xbd\xa9\x11\xc4\x31\x51\x08\xad\x37\x55\xf9\x72\x2d\x5a\xf1\x5b\xce\x7f\x22\x68\x66\x3b\xbc\x7e\xaf\xe3\xf9\x37\xf7\xb4\xc9\x33\xa1\xd2\x60\x2a\xdb\x76\xf7\xee\x5c\xb6\x62\x37\x32\xf1\x82\x6a\xa3\x6d\xf4\xb3\xfa\xe9\x84\x4b\x44\x2b\x06\x62\xf4\xa3\xdc\xb0\x60\x9a\x89\x21\x75\x1e\xb7\xc7\xb9\x9d\x5b\xdc\x8f\x32\x12\x53\x9b\xb6\x2e\x8f\x5d\x64\x98\xb9\x98\x5d\x9f\x22\x8e\x14\x76\x7c\xec\xac\x96\xea\xf7\x01\xd5\xc1\x27\x6f\x3b\x16\x1c\x9d\xe4\x2b\x70\xbc\x09\xbf\xcf\xcc\x8a\x94\x44\x58\x73\x6a\x3b\x63\x76\x55\x55\x6f\x53\x2c\xa9\x48\x59\x8c\x0e\xc8\xd3\x77\x5f\x74\x13\x29\x8f\x13\xc7\x70\xb4\x83\xb2\xd2\xb0\x93\xe7\x9d\xcf\xff\xf7\xd7\x93\x25\x80\x8c\xe0\xdf\x9f\xb6\xab\xdd\xcd\xd3\xfa\x8f\xf0\xb9\xa5\x47\xf5\x1d\xed\x20\xda\xb3\xc3\xc7\xfd\x31\xbc\xc4\xc9\xed\x65\x9a\x08\x5b\x23\x7e\x2e\x4a\x17\x60\x6d\xa1\x69\x3d\x34\x43\xe4\x3a\x8e\x5d\x99\x0b\x95\xde\x24\xb4\xbb\x77\xb1\x3f\x05\xaf\x5a\xf0\xd8\xf2\xdb\x6e\xff\xf9\xd4\x0e\x42\x19\xc1\x41\xa2\xbf\xfc\x11\x88\x7e\xbc\x21\xb4\x65\xda\xf1\x85\x70\x93\x20\x39\x83\xbd\xfe\x9b\x62\x0f\x28\x56\x5d\x95\x2d\x7a\x29\x13\xb4\x8d\x6f\x71\xf9\xf7\xe4\x76\x84\xb6\xbb\x04\x42\x15\xf6\xd5\x69\xc8\xf1\x9f\x8f\x56\xa5\x8c\x62\x64\xb2\x5b\x74\xeb\xc8\xb4\x1f\xa2\x9e\x56\x87\x3f\x01\xfe\xf8\xef\x6b\xab\xc9\x8e\xf5\x25\xb8\x06\x55\x1c\xc4\x3c\xb3\x1a\x11\x4a\xc6\x68\xd6\xac\x1e\xbc\xbe\xaf\xc4\xa7\x14\x68\xee\x1b\x10\xc5\xf9\xb0\x49\xe3\x0a\x94\x38\x35\xf0\x64\x16\x2f\x2f\x35\x26\x87\x7f\x99\xb4\xef\x3d\xed\xcb\x60\x4b\x00\x4f\x52\xe3\x94\x7d\xce\x30\x29\x46\x0a\xe0\x96\x58\xe1\xfe\x66\xb3\xfd\xf3\x7e\x18\x9b\x0a\x10\x49\xcc\x2c\x7e\xa1\x5b\x3c\x23\xd1\x4f\x37\xc4\xe4\x02\x89\xfd\xef\x8b\xf2\x0d\xea\xd5\x4f\x71\x08\x1c\x23\x44\x18\xe1\x00\x05\xba\x0b\x3a\xea\xf6\x02\xa9\x22\x8c\x96\xb9\xa5\x0b\x3b\xbb\x06\x3c\xf7\x5d\x49\xa8\x65\x92\x85\x9f\x4e\x55\xff\xaa\xfa\x7d\x0a\x64\x74\x72\x49\x04\xa5\xce\xff\x9e\x4c\xa7\xe1\x43\x1a\xfc\xcb\x36\x8f\x4f\x9f\x9f\x24\x32\x4d\x2c\x8a\xaa\x7c\x81\xd5\xf6\xcb\x08\x01\x22\x59\xb7\xb8\x71\x1e\x9f\x8f\x6d\x25\x45\xf9\x36\x2b\x25\xd9\xb9\xbb\x11\xf7\xf2\xb1\x98\xa0\xab\xea\xb9\xed\x43\x32\x26\x8c\x18\x6d\x9e\xd7\xe2\xfc\x2c\x82\x1f\x21\x19\x17\x60\x75\xe8\x71\x0e\x3e\x19\xd3\x40\xb8\x9c\xd8\x58\x45\x1e\x44\x48\xd8\xdf\x59\x63\xbd\xe8\xfa\x8f\x39\x3d\x6a\x22\x13\xa0\xb8\x0e\x5b\x68\xda\x1b\x51\xec\x3d\xa5\x6a\xa0\x76\xd2\x8b\x97\xc0\xa2\x43\x64\x1a\xe7\x98\x27\x52\xee\x30\x32\x9e\x88\x70\x6d\xa9\x48\xf0\x95\x1b\xcc\xcd\xac\xda\xd7\x5b\x18\x52\xd6\x13\x99\x6a\xcd\x06\xf4\x86\x13\x01\x26\x37\x28\x53\x12\x4b\x7e\x61\x35\x20\x65\xcf\x04\x0b\x23\xf3\xcc\xb2\xc7\xbe\x40\x5b\x23\xf1\xcb\x78\x66\x4b\xae\x6c\xbd\xec\xe9\x39\xa4\x72\xa4\x48\x13\x44\x40\x38\x06\x8b\x50\xb3\xe9\xb9\x06\x88\x14\x39\x45\x4b\xb1\xb9\xfb\x67\xf8\x48\x98\xc4\x52\x25\x1e\x0e\xa7\xb2\x68\xcf\x56\x1a\x1a\x65\x29\xfa\x8c\x81\x14\x32\xc6\x76\x58\xd9\x5d\xaf\xcb\x71\x4f\xd7\xed\xfc\xdc\xf3\x27\x50\xb6\x06\xe1\xda\x59\xae\xba\xd9\x34\xbb\x4d\x49\x19\xc5\xcc\x0a\x36\x62\x49\xce\x01\x01\x1c\x92\x25\xac\x22\x99\x28\x0b\xb5\xc2\xfc\x27\x12\xd3\x4d\x2a\x2f\x52\x66\x32\xe1\x21\xd5\xff\x0c\xf5\x0f\x28\x30\xfb\x40\xbc\xf2\x31\x91\x32\x4f\xd1\x3a\x21\x1f\xdc\x20\xfa\x92\x52\xa4\xd8\x23\x6a\x5b\xfa\x07\x7d\x2e\x52\x51\x85\xc8\x37\xff\x0a\x91\x15\x67\xd6\xf6\x49\x15\x13\x7c\xde\x5f\x45\xf9\x7f\x3b\xdf\x2e\x9c\x22\x51\x98\x24\xfa\x8a\x2b\x6b\x9c\x37\x93\x2a\xb5\x8d\x32\x56\x09\xc3\x95\xe6\x36\xbb\x6f\x9b\xeb\x30\x22\x4b\x85\x93\x3d\x2a\x8e\xc5\x65\xe8\x2b\x95\x34\x18\x7e\xef\x8a\x66\x0d\x42\x7b\xb7\x45\x6a\x46\x11\xb9\x84\x4e\x33\x36\x14\xf4\x39\x46\xa9\x93\x14\x73\xe8\xdb\x1a\xb1\x5a\xe1\x63\x93\x62\xc6\x56\x89\x5a\x37\x3b\xb9\x17\xea\x6d\x87\xdc\x2b\x93\x99\x0d\x99\x7d\x2c\x88\x6a\xa9\x9f\xab\x7a\xc4\x6a\x49\xa4\xe1\x31\x76\x82\xd4\xd5\x5b\xff\x91\xb0\xa0\x50\xf8\xd9\xae\x4f\x01\x4a\xa5\x22\x22\xc7\x1a\x19\x7f\xaf\xf2\xa0\xa2\x54\x22\x51\x8e\xf0\x3a\x86\xbe\x7d\xcc\x2f\x62\x45\x3a\x0f\xd6\x35\x35\xdf\x95\x4e\xc5\xea\x1c\x8e\x32\x21\x75\x60\x30\x5d\x43\xd9\x03\x4b\x14\x49\x04\xd6\x63\x9f\x7e\x3c\x76\x6f\x63\xf1\x78\xbd\x7b\x5e\xac\xb7\xf8\x3f\x16\x47\x1f\x46\x72\x83\x99\x5e\x9f\xb6\xfb\x94\x01\xc7\x8f\x37\x04\xab\x06\x5d\x20\xb1\x17\x17\x81\xe5\xc0\x63\x56\x54\x0a\x0c\xce\x91\x6e\x66\x7e\x87\x56\x8c\x18\x12\x0d\x25\x11\xbe\x1d\x07\xf1\xbd\x62\x8c\x62\x34\x7b\xf4\xda\xf9\xdb\x6a\xa1\xfe\x73\x2a\x44\x89\x64\x7f\x0d\xae\xfc\x41\xae\x44\xc5\x2c\xb1\x3e\xd1\x2b\xac\x7e\xb6\xb5\xa8\x6a\x5d\x94\xa2\x3e\x6f\x8e\x02\xf3\x2e\x61\x5c\xca\xc9\x00\xee\x72\x59\xd4\x53\x71\x1e\x63\x72\xd5\x23\xfc\xd6\x56\xb5\xeb\xfc\x15\xce\xae\x0d\xf2\x5b\xd9\x16\xe1\x89\xc7\x8a\x46\xa9\x17\x92\x3a\xb5\xc1\xa7\xb9\xac\xc2\xab\x04\xac\xb8\xf9\x0b\xb4\x0f\xe7\x45\x59\x75\xb1\xe1\x35\x52\x96\xfb\x93\xa5\x19\xb3\x7c\xdc\xbe\x29\xbe\xd4\x88\x53\xff\xb4\x9e\xdc\x37\x09\xa9\x94\x33\xd4\xaf\xb0\x7a\x5a\xdb\xa7\xaf\xab\xc7\x4d\xe7\xaf\x8e\x1a\x92\x54\xca\x39\x36\x4d\xc0\x4f\xa8\x55\xd1\x40\x10\xed\x25\x2a\x95\x91\x87\x87\xa3\xfd\x99\x51\xd8\x23\x2a\x35\x31\x36\xb3\x7a\x54\x2e\x86\x1d\xeb\x0b\x54\x88\xca\xa8\xc2\xd2\x4d\xd1\xdc\x95\x68\xab\xb7\x1f\xd5\x40\x64\x89\xa8\x8c\x31\x4a\x03\x90\x5d\xd4\x5a\x89\xe3\x18\x3b\xa2\x32\x91\xa2\x31\x5e\x04\x76\x15\x3f\x59\x7b\xed\x92\x7f\xd1\xde\x88\xe7\xff\xfe\x64\xc5\x65\x12\x30\x4d\xbf\x3b\x9e\x9a\x57\xd4\x61\x41\xce\xcc\xe1\xe0\xfc\x93\x69\x9f\x27\x31\x66\xb0\x6f\x6f\xd7\x95\x7a\x83\x09\x07\xf3\xac\x34\xdf\xf4\x0c\x90\x81\xeb\xb6\xad\x8b\xf6\x3c\x01\xd0\x2a\x11\x51\xc4\x8c\x62\x6e\x7a\x0c\x81\x99\x3f\x9f\x8c\x4c\x64\x42\x6d\x6f\x5b\x1d\x64\xb0\x1b\x92\x53\xe4\xa7\xfd\xf2\xed\xf1\x7a\xbd\xba\xde\xde\x3d\xac\x36\x93\xf7\x22\x39\x47\x0e\x34\x6c\x48\xfb\x0d\x5f\x84\x92\x46\xa5\xa9\x07\x71\x58\xb2\xbd\x1b\x80\x26\x08\x41\x4d\x7d\x59\x25\x0d\x78\x82\xc8\x35\x18\x73\x21\x32\x43\x94\xe2\x3c\xb3\xe4\x75\x5b\xa8\x0f\x45\xd9\xb3\x94\x13\xa5\x09\x57\xd6\x5d\x45\xd4\xe6\x32\x34\x06\x2b\x9d\x49\xe3\xdb\xc3\xbe\x59\xbd\xf6\x09\xf9\xb3\x1f\xa8\x0c\x96\x67\xad\x1c\x3f\x92\x82\x77\x7b\xd3\x7a\x77\xf5\xf4\xf8\x6d\x13\x4e\x67\x00\x41\xd8\x38\xcd\x77\xcf\x55\xf5\x29\x53\x9b\xfb\x02\x44\x24\x73\x5d\x15\x8b\xab\xbb\x2f\xa2\x79\xbd\xa9\xea\x87\x6a\x2c\x45\x40\x14\xb0\x14\x17\xd7\x09\x2d\xda\x9d\xf6\x9d\xbf\x0a\xd2\x04\x41\x64\x45\xb3\xc4\xbd\x74\x5d\x1d\x90\xe5\x7a\x89\xac\x45\x98\xa5\xb8\xd9\x86\xc1\x8a\x89\x90\x3a\x40\xdf\xa2\xc7\xbd\x2b\x43\x08\x9b\xb8\x97\x9b\xee\x61\xbb\x2d\x76\xf2\x38\x0c\xa4\x48\x9e\x8c\x45\x9d\xa5\xed\x3b\xdf\x7e\xea\xd3\x68\xd2\x6d\x1f\x1e\xcd\x66\xaa\x53\x7d\x57\xbe\x5b\x40\xdb\xb7\x1e\xc6\xe9\xc7\xaa\x5c\x00\x76\x10\x20\xf0\xdb\x77\x4d\x0f\x2c\x92\x26\xc6\x02\x9f\xbb\xb7\x76\x92\x81\x89\xd9\xf5\x4f\x5a\x7e\x99\xe1\xf3\xd3\x54\xda\xee\x90\xe0\x78\x23\xe7\xc0\x90\x19\x99\x68\x26\x72\x44\x1e\x38\x8e\x0a\xdf\xdd\x3b\x9f\x1b\x9d\x5f\x42\x9a\x39\x16\x5e\x47\x5d\xfd\xfc\xf6\x12\xce\xae\x6d\x3f\xeb\x43\x51\xb6\xf7\xd5\x05\x1f\xa4\x1b\x15\x53\x0b\x6a\x43\x6c\xe9\xa8\x60\xf6\xaf\xf4\xdf\x21\x54\x4e\xff\xed\x87\xa7\xda\xc7\x41\xcb\x57\x68\x06\xcd\xf6\x64\x7a\x65\xb1\xb2\xad\xf9\x8d\x30\x70\x5d\xbc\x7b\xe4\xec\x68\x4c\x42\x38\x42\xd0\x07\xed\xfb\xe3\x65\xa8\x13\x16\x7b\x36\x6b\xa4\x71\x13\xfb\xde\x3f\xec\x36\xcd\x6d\x0d\x0d\x76\x5f\x4e\xbe\x96\xa6\x76\xfd\xb9\x2e\x2c\xdc\x48\xe7\x2a\xc0\x3a\xc9\x69\xec\x30\x7f\x57\xd0\x6e\x5f\xdd\xf9\x9e\x83\x57\xab\x93\x5c\x62\x46\x06\x73\xc3\xd8\x4e\x3b\xfe\xad\x34\x4b\x7c\x1b\xb6\x63\x9a\x43\x7e\xf9\x67\x98\x4a\x3a\xfb\xf1\xda\xfa\x77\xab\xa6\x2d\x0e\xa2\x85\x3e\xe4\xd1\x29\xc4\x08\x40\x3a\x8a\xa2\x6c\x6f\x6b\x61\x4c\xd1\x16\xd3\x09\x31\x4c\x17\xe9\x3c\x32\xda\x41\x6b\xbb\x5f\x9b\xdc\x5c\x6e\x34\x1a\x31\x6f\x13\x46\xc4\xf7\xc3\x48\x51\x73\xc6\x48\x1e\x52\x28\x8b\x77\xd1\x8a\x7a\xb6\x58\xa8\x45\xc4\xc1\x45\xd3\x18\xd3\x1d\x8e\x55\xdd\xde\x00\x2c\x11\xfd\x35\x9e\xe1\x22\x8f\x59\xea\xaf\x0e\xd3\x8d\xbf\xba\x17\x49\xac\x43\x7b\x8f\x72\x6e\xb6\xf7\xed\xe9\x08\xe5\xd4\x36\x6b\xc9\x2d\x37\xe5\xdd\xe3\x7a\xf7\x74\x28\x0b\x5d\xed\xf7\xc2\xa3\x8d\xb5\x54\x3a\xb3\xcc\xf5\x8f\x95\x86\xed\xfd\xf5\x93\xf1\x49\xd3\x30\x46\xb1\x0c\x5d\x1d\xfc\x29\x04\xda\xea\x01\x83\xd8\xe4\x8e\x55\x46\x11\x63\xfd\xb0\xda\x2e\xbe\x2c\x36\x5f\x50\x5d\xd0\x1d\xd3\x34\xc3\x48\x5c\x9e\xce\x3b\x28\xf5\xae\xed\x1d\x39\xad\x25\xc5\xbc\x43\x8d\xd4\xe4\x96\x50\xf4\xd7\x20\x13\x0d\x49\x44\x1c\x76\xcd\x63\x20\xc7\x76\x05\x12\x4e\xc5\x84\x87\x6e\x32\xc2\x18\x64\x77\xd8\x81\x3e\xa9\xd0\x17\xed\xaf\xc9\x10\xab\x50\xd2\x3d\xf6\x2b\x08\x14\x4d\xda\xb0\x28\x55\x8e\xb3\xf7\x17\x7d\x43\xda\xe4\x24\x00\xb1\xb1\xa4\x8a\xee\x87\x3f\xa8\x15\xe6\x7f\x8e\xa2\x85\x12\xbb\x9f\xbb\x25\x7a\x0d\x7b\x4f\xbe\x4a\x20\x62\x29\x6e\xda\x9e\x97\xa7\x72\x45\xdb\x01\x8f\xf5\xe8\x07\x21\x8a\x23\xec\xf2\x70\xc6\xd9\x66\xe6\x40\x5f\xbd\x4d\xba\xce\x21\xca\x24\x92\x4f\x56\xe5\xfe\xbc\x44\x91\xff\x87\x9e\xff\x04\x48\x12\xb9\xe6\x88\x52\x5f\x89\xc1\xe7\x9c\x88\x78\xa8\x5f\xd3\xf9\xc7\x48\xbf\xd3\x8f\x10\x58\x21\xee\x11\x0a\x41\x2f\xd9\x65\x25\x2d\x6f\x94\x1f\x4f\x41\x26\xe0\xf5\x00\x3c\x3f\x9d\x3f\xc8\xe2\x0c\x43\xed\xdb\xe5\xd3\x3f\x17\x4b\x27\xe9\x75\xe9\x7a\x4d\x9a\xef\x20\x8e\x22\xac\x5c\x82\xaa\x6c\x61\x72\x5c\x0e\x82\x58\x5a\x79\xfa\x02\x17\xe3\x84\xd1\xcb\x8d\x49\x72\x4b\xa1\x72\xac\xe1\x4e\x55\x03\x32\x39\x48\xb9\xa5\x52\xda\x8b\xa6\xbd\xaf\xda\xb6\x1a\x44\x23\x90\xba\xb0\x7c\x0f\xa6\xf5\xc4\xdc\xee\x50\x06\x56\x70\xa4\x81\xbd\xb9\x1f\x3c\xeb\x9c\x59\x6d\x30\x5b\x5d\xf9\xdb\xa0\xa3\x3e\xbc\x80\x5c\x28\x2c\x68\x2c\xae\x96\xbf\x4f\x99\x03\xcf\x29\x55\x7d\x35\x72\x24\x61\x49\x80\x73\x0b\x14\xb8\x5a\x2c\xbf\xde\xaf\x16\x37\xe1\x73\x21\x91\xc4\x62\xf3\x51\x98\x36\x7c\xa8\x95\x34\x21\xa6\x46\xd5\x98\x5b\x71\x80\xd5\x67\xed\xdd\xc0\x4d\x96\x78\xd6\xe0\x2f\x45\xbb\xa9\x4c\xdb\xb7\x0a\x80\xa0\x16\x29\x5f\x75\x0e\xe4\xe6\x0d\x5a\xf5\x3a\x21\x37\x9f\x9c\x4e\xe4\x12\x63\x8d\xff\x79\xdc\x7e\x6b\xf4\xf0\x25\x09\xa9\xd0\xd0\x2c\x3f\x83\x97\x7f\x5e\xc1\x01\x99\xc6\x58\x3d\xd7\xce\x61\x47\x72\x98\xc9\xf4\x90\x82\x2b\xee\x01\x3a\xc8\xa6\xe6\x9b\x76\xc2\x2c\x53\x8c\x3a\xec\x12\xf2\x70\x6c\xab\x2f\x7d\xbf\x1d\x28\x91\x5b\x71\xb7\x6e\x13\xbf\x53\xd5\xa8\x7e\x0f\x4a\x03\x3a\x03\x87\x1d\xe6\xef\x07\xc0\x1a\xd0\x4c\x0b\x87\x0c\x42\x6d\xae\xf9\xcc\x0e\xe8\x2c\x16\x7a\x00\xf5\x1b\xdb\x45\x00\x2a\xb1\x50\x56\xa8\xca\x37\xbd\x0f\x67\x31\x30\x8a\xf4\x47\x7d\x68\xd2\xdc\x54\x75\x77\x81\xe3\xe7\x6f\x62\xc0\x4e\xcd\x77\xdf\xfe\xfc\x1b\x84\x07\x98\x2c\x41\x5c\xc4\x73\x35\x23\xbe\x15\x02\xe7\x4f\xda\x80\xff\x3f\xff\xfa\x9f\x96\x09\xa6\x4f\x77\x2f\x9d\x33\x26\x0e\xc7\xe9\xbd\x68\x16\xb9\xd7\x55\x87\xa4\xae\x89\xa4\xc4\x0b\x3e\x56\x47\xf4\x4b\x5d\xae\xfc\xa6\x86\x20\xb3\xe2\x5f\x8d\x21\x60\x02\xa1\xb5\x05\xf0\x0c\x96\xbf\x21\xc6\x18\xc7\xe0\xeb\x2c\xce\x4d\x55\x6f\x7f\xf6\x61\xb8\xa1\x59\xaa\x59\x9f\xa1\xb0\xe0\x3f\x7f\xcc\xb1\xf2\x14\xcd\xb7\x06\xea\xe7\x6a\x5f\xa8\xf3\x02\x65\xdb\x43\x14\x65\x28\x18\x44\x2c\x14\x4d\x40\x43\xf9\x23\x86\x5b\xec\x6a\xc8\x6b\x17\xef\x3e\xe9\x6a\x58\x2c\xb1\xb5\x69\xb7\x3b\xa1\xae\x05\xf2\x21\x8d\x1f\x8e\x61\x79\x84\xc8\xf2\xe5\xf6\x76\xb8\x3f\x9a\x38\x25\x3a\xe9\x59\x25\x7d\x3b\xca\x6c\x19\xd9\xc4\xda\xd8\xfa\x56\x17\x81\x0e\x9a\x22\xa6\xe3\x92\xc4\x76\xe4\xa0\xb6\xda\x24\x69\x6a\x12\xee\x24\x8e\x9a\x7b\x81\xad\x25\x45\x59\xd5\x5b\xd4\x21\x98\x7b\xed\x26\x25\x0a\x03\x21\x8c\x61\x8b\xbf\x20\x70\x97\x98\x94\x00\x5e\xbb\xae\xab\xa3\x4d\xe0\x9c\x06\x90\x5d\x93\xc6\x34\xb6\x80\x8c\xd2\x14\x2f\x4e\xb6\xf3\xef\x17\x75\x2f\x32\xcd\xff\x18\x27\x1d\xc6\xcf\x37\xe5\x3c\x72\xf8\x82\x2f\x50\x57\xcb\xbd\x68\x9a\x09\xfd\x3b\x31\xa9\x4e\x31\x82\xee\xf5\x7d\x3e\x91\x41\x9a\x5d\x7b\x26\x8b\xb2\x34\x0a\xbe\x2f\xe6\x1d\x5d\xa3\xb6\xd3\x3a\x3d\x1c\xaa\xb2\x0b\x89\x67\xb4\x03\x89\xc9\x44\x0c\x71\xdf\x18\xd1\xd3\x17\x0f\x03\x3f\x93\x0b\x1a\xe5\x81\xe7\xf0\xa9\x7e\x11\x65\xd1\xcc\x20\xf9\x0d\xa7\xb6\xb9\xaa\x73\x00\x6b\x38\x1d\xae\x61\xdf\x0a\xff\x66\x78\x42\xd1\x00\x1f\xeb\xea\x08\x75\x7b\x46\x43\xb7\xad\x66\x6a\x99\x86\x2b\x1b\x8f\xbc\x88\x03\x0c\xb3\x4c\x86\x1b\x86\x5e\xa8\x2c\x5a\x5d\x8e\x38\x41\x8d\x60\x16\xe6\x6e\x11\x29\x6d\x55\x4f\x95\x7f\x89\x11\x59\x8c\xf5\xf3\x4d\x71\x38\xee\x61\x28\x90\x45\x8c\xe0\xb1\x76\xcf\x11\x69\x96\xfa\xa0\x36\x0c\x50\x68\x7b\x9f\x45\xdd\x96\x3d\x8d\x80\x11\xc0\x90\x72\x7e\x59\x39\x66\x8c\xcd\x47\xd1\xaa\x57\x18\x07\x92\x6e\xb0\x64\x39\x96\x57\x77\xb5\x53\xea\x11\xcd\x2b\x68\xc7\x9a\x36\xff\x82\x65\x92\xc6\xa3\x86\xbe\xc9\x29\x55\xa4\xb5\x73\x69\xde\x9f\x6a\xa1\x7a\xfb\xa0\x72\x85\x3d\x7c\x50\xea\xeb\xa2\x39\x9e\xfa\xc7\xa8\x94\x41\x2e\x71\xcc\xc8\x83\xf6\x65\x8e\x70\x4f\x9a\xa6\x11\x78\x7e\xd4\xb6\x85\xba\x80\x66\x42\xfc\xea\x47\x32\x89\x10\x9a\x5d\x5d\x75\xef\x69\x29\x4e\x7b\x5d\x3b\xd8\xa0\x0b\xab\x0c\xc4\x0c\x13\xee\xae\xdf\xec\xba\xdb\x7c\x1e\xab\x35\x74\x6e\x5a\xf8\x49\x10\x4c\x87\x54\x13\xde\xa9\x1e\x3e\xfd\xce\x9f\x84\x20\x4b\xbd\xa8\x6b\x71\xbe\xb2\x16\x21\x9c\x40\x89\xd4\x13\xc4\x1c\x6d\x62\xd7\x97\xef\xc7\x97\x6c\x12\x86\x9b\xf4\xf3\xb7\xf5\xf2\xcb\x62\xb3\x5a\xef\x1e\x16\xff\xb4\x09\xd6\xdd\x72\xf1\xec\xcf\x67\x72\x92\x90\x9e\x26\x46\x94\x6f\xe1\x5a\x0d\x4f\xa3\xc4\xaf\xb9\x43\x51\xde\x00\xcc\xf2\x73\x1a\x23\x33\x6c\xaf\xde\xdd\x5b\xb8\xc6\x1a\x17\xd0\x38\xcd\x44\xa3\x28\x36\xb9\xcb\x46\x75\xde\xe2\x27\x7a\x01\x34\x8a\x92\x1c\x31\x22\xab\xcd\xf2\xca\xf1\xb0\x1f\xfb\xa5\x33\x72\x15\x68\x14\xe5\xb6\x77\x7d\x5f\xbd\x3c\xd7\xd5\xa1\x40\xf5\x1a\x53\xd4\x87\x49\x20\x49\x23\x4a\x12\x5c\x38\x6f\x70\xfe\x22\x9a\xe7\x53\x7d\xac\x1a\x98\x05\xf7\xd2\x88\xe5\x3a\xb6\x78\x56\xcb\xdf\xe9\x5a\xf3\x69\x94\x10\x83\xb5\x25\x9b\x47\x7e\x16\x4d\xf3\x51\x0d\x44\x2a\x3e\xf5\xcb\x68\x94\x08\x8d\xdd\x3f\x2e\x3f\x7f\x5d\x34\xc8\xae\x34\x30\x40\x34\x4a\xa4\x92\x36\x9a\x75\x29\x7b\x37\xd1\xc7\xb7\x9c\x18\x02\xe9\xa0\xf2\xba\x6b\xa0\xdd\x1d\xeb\x42\xc1\xae\x8b\x6c\xaa\x53\xbb\x1b\xe0\x2b\x68\x94\xc6\x40\x8d\x27\xd4\x98\xba\x0e\x34\xca\x32\x4b\xd2\x6d\xcd\xb2\xa7\x4a\xea\x4b\xd5\x34\xca\xb8\xb2\xd1\x04\x06\x81\xcd\x30\xec\xa7\x51\x06\x59\x12\xb4\x9a\x36\xd0\xe2\x25\x17\x7f\xc1\x46\x18\xcc\x76\x0c\xb6\x25\x1a\xe5\x91\x42\x37\xe6\x28\x4e\x0d\x4c\xc8\x77\x69\x94\x33\x4b\x94\x85\x6b\xc3\xb6\x77\xff\x4a\x86\x92\x46\xb9\xd1\x69\xe4\xa9\xe4\xb1\x67\x7c\x03\xe5\x54\x06\x99\x46\x5c\x58\x55\xd8\xab\xe7\xdd\xf3\x6a\xbd\xb9\x5b\x3c\xfa\x5f\x14\x40\x65\xe2\x4b\x1b\x3f\xaa\xfa\xad\x99\xdd\x88\x69\xa4\x98\x45\x17\x6f\xc5\x79\x5f\x0d\x69\xdd\x68\xa4\x74\x8e\x65\xf5\x8d\x25\xcb\x9a\xcd\xb1\xbb\xa1\x3a\xb5\x95\x94\x81\x3a\xd5\xb7\xba\xb8\x84\x9e\x5c\xc0\x50\x68\xa4\x65\x8c\x05\xa0\x9d\x63\x59\xf0\xb6\x6c\x3e\xf5\x4b\x23\x0d\xb6\x23\xa2\x84\x9f\x43\x4e\x5f\xeb\x75\xbb\x31\x90\xc4\x88\xe9\x41\x37\xfe\x0a\xda\xc9\x63\x33\x89\xa5\x88\x73\x79\x6d\x47\x55\x37\x8a\x46\x29\x89\xb2\x0c\x8d\xaf\xa8\xad\x8a\xa4\x37\x6a\xdb\x6a\x28\x0b\xea\x06\x93\xd8\x52\x73\xae\xab\x3d\x78\x1b\x31\xd3\xcf\x41\x09\x31\xda\x66\xa8\xc4\xb1\x08\x65\xc2\xee\x63\xab\xe7\x53\xa8\x6a\x55\xea\x3e\xfd\x42\x09\xa5\x11\x82\xaf\x71\xe2\x93\xf0\xa9\x48\x11\x40\xbf\x33\x21\x06\xa1\x84\xc5\xb6\xfe\x09\x3f\x8f\xdb\x9f\xbf\x2c\x5a\x50\xc2\x12\x2b\xb5\x5a\x34\xd8\x21\x3d\xc7\xc5\x41\x09\x03\x6d\xc9\x25\x10\xc5\xe9\xd5\xae\x1f\x0a\x04\x46\x5a\xad\xa8\xcb\xe6\x56\x4a\x98\x21\x11\x77\x6e\xed\xe2\xd0\xae\xa1\xcf\x39\x8e\x66\x39\x89\xa3\xcc\x88\x21\x19\x4c\xb3\x74\x30\x5b\xed\xef\x29\x66\x14\xa1\x3a\xb7\xd0\xfe\x28\xca\x7e\xdb\xa6\x24\x96\xa0\x1c\xab\x77\xb7\x8e\x3c\xdb\xc6\x04\x68\x46\x49\x4a\x52\x0f\x48\xdd\x83\x6a\xed\xe6\xee\x4f\x92\xc6\x2c\x72\x84\x24\x2f\xf0\x03\xc4\xb1\x2a\x9f\x4f\x35\x5c\x8b\xc3\x2f\x18\xca\x26\x8f\x32\xe5\x1c\x83\x67\x0d\x2d\x56\x50\x06\xed\x79\x73\x83\xb5\x37\x59\x0f\x55\xd9\xb4\x50\xdf\xc3\xbb\xa3\x6e\x73\x74\x3c\x38\xc8\x68\x4c\x05\x6c\xbf\xad\x1f\x77\xd7\x8b\xed\x2a\x5c\xb0\x88\xd1\xd8\xea\x2e\x1c\xea\xa2\x11\xfb\x52\x3e\xab\x4b\x0e\x6c\x30\x49\x45\x8e\xc9\xb1\x23\xca\xa9\xa2\x73\x83\x85\xbc\x30\xd5\x52\x9d\x60\x77\x0b\x6a\x64\x20\x28\x7c\xf5\x13\xd4\x2f\x3b\x18\x28\xc9\xa2\xc4\x18\x4f\x43\xb0\xc3\x3d\xa0\xee\xcb\x69\x94\x64\xb9\x8c\x1c\xe7\x0c\x0d\x9f\x49\x2b\xa1\x6f\xe7\x55\xfd\xad\x0c\x70\x1d\x8a\x18\xfd\x78\x52\x72\x78\x0b\x89\x2c\x4a\x72\xc3\x31\xf2\x43\x2c\x41\x51\xb6\x9e\x9f\x81\x12\x6e\x48\xc4\x7a\xf5\x4e\xd4\x10\x85\xfa\x22\x49\x40\x89\xd0\x96\xd9\x31\xfc\x84\x9d\x59\xcb\x4f\x3c\x38\x4a\x64\x1e\x8b\x5e\xe0\xee\x11\x3e\xae\x17\x4f\x93\x73\x4a\x6e\xd9\x75\xbf\x9c\x8f\xfd\x82\x94\x3c\x45\x6f\xba\x5b\xff\xaf\xa2\x79\xf5\xb6\x7f\x62\x69\xa4\x06\xf4\xe1\xaf\x8a\x16\x89\x71\xfc\xe7\x8a\x71\xc4\x6b\x08\x0c\x28\xa7\xd0\xdc\x4f\x22\x9b\xc9\xa5\xab\xcc\x0a\x11\x35\x6d\x75\x1c\x1a\x77\xa2\x84\xd2\x66\xc0\x55\x73\xb1\x6e\x94\x34\xc6\x39\x35\x77\xe6\x7b\x35\xa8\x2d\xfe\x63\x32\x10\x24\xba\xf4\xa1\x61\xd3\x9a\x53\x4f\xfd\x30\xb9\x59\x65\x6c\xfc\xd6\x40\x6b\xdb\x00\x7c\x09\x79\xaa\x1c\x41\x89\xa6\x4a\x77\xf7\xbf\x2f\x0c\x3c\x57\x45\xe0\x6d\xa7\x44\x67\x3c\xe9\xc9\x50\x6f\x45\x83\x74\x55\x4f\xa6\xdb\x9a\xbb\x8d\x72\x72\x22\x20\x19\x16\x91\x76\x47\x71\xf6\x00\xf0\xe9\x10\xa3\x90\x55\x09\x4a\xfd\xfc\x1a\x94\x0f\x28\x31\x22\x06\x32\x40\x77\xed\xc4\xbe\x78\x87\xdd\xa9\x6c\x8b\xfd\xae\x7d\x2d\x9a\xdd\x80\xa0\x9a\xd2\x88\x28\x26\x03\xce\xf1\xfe\xdb\xe3\x6a\xbb\xf9\x65\xee\x85\xd2\x28\xc9\x04\x1f\xf4\x19\xce\xa2\xd2\x28\x8d\xa4\x15\xc6\xf2\x6c\x9a\x5b\xb1\xdf\x17\x83\x77\xf2\x59\x1a\x92\x52\x9a\x58\x79\xcc\x17\xe8\xb6\xc2\x16\xea\xc7\xd3\xe1\xc9\xfc\xf0\x4c\x99\xe3\x9f\xa1\x3c\xc2\x4c\xb2\x01\xb8\x2a\xbc\xb2\x17\xb6\xa9\x47\x71\x4f\xf8\xaf\x2d\x9d\xe5\xf8\xd5\x52\x46\x38\x3a\x01\x03\xca\x5c\x5b\x01\x01\x7d\x75\xb6\x7c\xba\x97\x8c\x6b\xfe\xbb\x31\x11\x43\xa8\xec\x75\x67\x15\xbb\x30\xf3\x79\xd2\x07\xd1\x0d\x95\x2c\x1b\x0c\x15\x7b\x1a\xae\x20\xe1\xae\x16\x69\x9b\xaa\x4f\xf3\x8a\x56\x93\xf3\x71\xbb\xc5\xc8\xd3\xf9\xaa\xaa\xf0\x15\x8c\xaf\x2d\x26\x04\x3b\xb5\xb1\x2d\xaf\x86\xeb\x40\xbf\x44\x69\xac\x98\x23\x82\x2d\xa3\x4d\x0b\xc7\xf0\xb9\xb1\x26\xe6\x58\x57\x3f\x8b\x39\x29\x21\x4a\x93\xd8\x72\xbf\x5f\x5f\xaf\x86\x0b\x93\x26\x9c\xa8\xdc\xf3\x9f\x55\x6f\x7f\xcc\x34\x97\x50\x9a\x6a\x62\x51\x85\xb6\xe0\x59\x68\x08\xd4\x2f\x94\xa6\xc6\x60\xb3\x0e\xf6\xa5\x0f\xbd\x0f\x9a\x31\x83\x8f\x6e\xe7\x48\xd2\x4f\x25\x3c\x1d\x03\xa5\x91\xb3\xed\x43\x4d\xa0\xa0\x3b\x82\xc5\x51\x9a\xf7\xff\x93\xc6\x93\x37\x98\x53\xad\x5c\x4c\xf5\xcd\x1e\x98\x3c\xc6\x5c\x19\x15\x2a\x90\x5f\x2a\xbd\xb7\x64\xe0\x37\x13\x05\x1a\x4a\xb9\xe0\x58\x3f\xec\x16\x56\xc8\x72\x6e\x6b\xd1\xc5\x0d\x56\xf1\xf4\x22\xc5\x32\xfe\x25\x41\x08\xb6\x30\x75\x41\x4e\xe9\x74\x1b\x07\xca\x62\x7e\x94\x8a\xf0\xbd\x7b\xc7\xd3\xa5\x13\x66\xb7\x39\x2a\x89\xb0\x76\x14\xb3\xc6\xdf\xad\x34\xbd\xa5\xd3\xf5\x23\x18\x45\xa8\xd0\x6b\xf1\xde\x05\x93\x03\x4d\xbd\xee\x98\xc2\x5a\x02\x86\x12\x8b\xfa\x70\x9e\x9b\x10\x92\x69\x70\x65\xc6\x6d\xd1\x9e\xf6\xa2\xa8\x61\xd7\x39\x44\x2d\xec\x48\x34\x79\x98\x32\x8d\xbd\x22\x8b\x07\xb0\x5c\x9d\x27\xb1\xc4\x64\xce\x48\x4e\x32\x87\x63\xbf\xeb\xdc\x9b\x6e\x37\xaa\xca\x49\x3a\x8b\x52\xa9\x95\xd5\xff\x76\xda\x92\x96\xac\xd5\x1d\x54\x8e\x16\x18\x51\x08\x56\xf9\x1e\x31\x59\xdb\xd7\xba\x2a\x61\x7d\xda\xc3\x85\xe3\xf3\x6b\xef\x89\xaa\x2c\x37\x79\x28\xc5\x95\xd0\x5e\x43\x2b\x8a\xfd\x27\xfe\x13\xd5\x4e\xf6\xca\x82\x33\xef\xca\x6f\xc1\x54\xd3\x6e\x17\xcd\xfd\xfc\x7a\xae\x2b\x33\x61\xcb\xa4\x14\x32\x89\x2c\x1e\xe1\xea\x3b\x4f\xa8\x79\x1d\xca\xb1\x77\xd3\x7b\xb8\x64\x58\x94\x98\x28\x0b\xa4\xb6\xa5\xcd\x5c\xf4\x9c\x5b\x7e\x14\xe4\x48\xa0\xf8\x20\x7e\x0e\xc8\x54\x28\xa3\x19\x77\xd9\x6b\x64\xd3\xb3\x8e\xc6\xdf\x6a\xe6\xa5\xc8\xae\x1c\x88\xf6\xf0\x2d\x84\x9a\x0c\x65\x2c\x4b\x3d\xad\x68\x2f\xba\xea\x89\xf6\x28\x63\x90\x20\x5b\x78\xf5\x73\x42\xb0\x46\x19\x33\x56\xc1\xcd\x47\xc5\x16\x4c\xe7\xbf\x98\xd2\x1c\xf1\xb1\xcb\xb3\x84\x7a\x2d\x8a\xfd\xa3\xaf\x41\x51\x96\xe6\x96\xf7\xf8\xaa\xd8\xef\x3b\x8f\x6c\xfe\xb2\x33\x11\xe3\x46\xb5\x0d\xdf\xcb\x64\xcc\xac\xab\x81\xaf\xc6\x53\xd1\x39\x48\xef\x64\x07\x62\x99\x54\xd9\x80\x90\x71\x53\xfc\x05\x4b\x7f\xa6\x5c\x69\x62\xbb\x0c\x35\xc0\xe1\x7b\x75\x52\xaf\x50\x4f\xba\x09\x7f\x85\x9a\xa4\x2c\x07\xc5\xbb\x07\xf3\xe5\xc7\xed\x10\xda\x4f\x19\x4f\x34\x06\xf0\xbd\xec\xd5\x2f\xb7\x6d\xc6\x41\xe4\x8e\x86\x6a\xa3\x5e\xe1\x20\x9a\xa1\x00\x2d\x65\x42\x33\xdf\x0b\x6d\x53\xb8\xd3\xfb\x94\xb9\xc1\xce\x2b\xdc\xed\x44\xb1\x3f\xbb\xc9\xe1\x0e\x6b\x65\x29\xc6\x77\x5e\xeb\xc2\x06\xd5\xeb\xbb\x3f\xe6\x3b\x3f\x28\xd3\x86\xa2\xbb\xb4\x5e\x3d\xae\xfe\xb9\xdb\xac\xb6\xdb\xfb\xd5\xc3\xea\x71\xbb\xf3\x4a\xcd\x94\x41\xc4\x8d\x6d\xcb\x29\xaa\x71\x06\x9f\x32\xc8\xe3\x7c\x08\x75\xec\x79\xd1\xc7\x3f\x03\x82\x20\x3c\x1a\x6e\xab\xbd\x56\xaf\xa2\x28\x37\xbd\x7e\x08\x65\x60\x98\x4f\x67\xfb\x84\xb8\xd3\x3d\xa8\xea\x99\x0c\x36\x65\x26\xb2\xe0\xd4\x71\x51\xcb\x11\x0e\x4f\x7e\xdb\x10\x69\x91\xbf\xd5\x15\x04\x6f\x90\x99\x38\xb6\x8d\xdf\xaa\xaa\xe1\xba\xfa\x98\xcc\xf8\x98\x24\x89\xf2\x70\x04\x84\x50\x62\x80\xd6\x97\x25\xbb\x11\x39\xe2\x09\xb6\xaf\x58\x82\x29\xfb\x03\x20\x74\xee\xd9\xb2\x8a\x72\x8d\x08\xdf\xa8\x73\x59\xed\x3f\xfd\x38\x1a\xc7\x98\x01\x6c\x7b\x7d\xbc\x09\xe7\x2d\x8d\x69\x62\x95\x60\x24\x8c\x28\x33\x69\x4c\x33\x2d\x13\x1f\xd2\x60\x41\xc4\xe5\x93\xc7\xb7\x41\xa5\xd5\xf7\x77\x0c\x80\x3f\xc4\x3b\x02\x0f\x4e\xde\x26\xc4\x0c\x14\xc6\xff\x47\x71\xbe\x86\x77\xff\x69\x1c\x25\x98\x2a\x40\x81\x81\xfb\xa2\xb1\xaa\xfd\xfe\x68\x22\x22\x44\xde\xcd\xf8\x6c\x0b\xd3\x42\xed\xf3\xce\xb3\x8b\x20\x4e\x84\xe0\x56\xdf\xc2\x12\xe6\xe1\x83\x65\xe1\xdc\xda\x36\xb5\xda\x94\x22\x52\x8e\x3f\x8b\xda\xe5\x6b\xfa\x1c\xd9\x2f\x17\x6c\x9c\x66\x56\x20\xed\x16\x5b\x3c\xf7\x3e\xbc\x70\xed\x46\x7e\x0e\xc4\xa9\xc8\xb1\xf0\xbb\x17\x4d\xfb\x88\x62\x85\xef\xf0\xbd\x6a\xfb\xc0\x31\x4e\xa5\x55\x46\xef\x03\x4b\x78\x87\xf2\xf4\x6b\x1e\x72\x1a\xa7\x3a\x46\x2c\x0b\xea\xf7\x6b\xed\xd7\x67\x9c\x91\x34\x12\x3e\x58\x6e\xab\x16\x9c\xc7\x3a\xa4\x07\xf5\xd9\x0c\xff\x9d\x3c\x4b\xa5\xe7\x6e\x5f\x3e\x6c\xb1\x8d\xa4\x69\x2f\xd5\x4a\x69\x9c\x2b\xdb\x28\x74\xbd\xd8\x7c\x59\x5c\xdd\xfd\x02\x70\x44\x63\x9e\x67\x3e\x50\x7b\x04\x2b\x26\x7f\xd9\x59\x4a\x63\xce\x2d\xd9\xf4\x0b\xb4\x6f\xc5\x7e\xef\xc8\xce\x2d\x20\xa5\x29\xaa\x32\x54\x3c\x69\xcc\x45\x42\xfb\x5c\xf0\x1f\x23\x7a\xcb\x8b\x1e\x0d\x1a\x0b\x95\x79\x3e\xd5\x35\xfc\xaf\x15\xc8\xb8\xa4\xc9\xa5\xb1\x8c\xec\xed\xd7\x2e\x0c\xf6\x19\xd9\x53\xd3\x56\xba\x10\x61\x31\xc9\x28\xc7\xa6\x11\x25\xf6\xfb\xa6\xad\x6a\xd0\x62\x14\x68\xc4\x32\xa5\xc2\xa6\xc6\x91\xc7\xa4\xf3\xf0\xc2\x84\x96\x59\x84\x06\x3e\xc4\x7a\x0b\x2c\x9e\x38\xd0\xcb\xf4\x8a\x32\x4b\x07\xdd\x19\xab\xf6\x75\x00\x03\xa4\xb9\x1f\xa1\x24\xb2\x82\x9d\x1a\x40\x5b\x37\x94\x17\xee\x8e\x9a\xc4\xdd\xf9\x80\x51\xff\xea\xf7\x8c\xfa\x34\x56\xb9\xc1\xa0\x7f\xd7\xf3\x18\x0e\x3d\xad\x58\x13\x82\xd5\xaa\x2b\xd1\xb6\xfb\xce\xcf\x42\x72\xd0\xdf\xb9\x0e\x9f\x4c\x62\xad\x95\x17\xbd\xfc\x5a\x34\xcd\xd5\xd6\xef\xa8\x31\x28\x45\xbc\x3a\xb5\x25\x10\xff\x6f\x7a\xc1\xfd\x49\x4c\x8c\xa9\xd2\xe7\xfb\xc5\xf6\xe6\x69\xfd\xb0\xbb\x5e\x7d\x5f\xdd\x3f\x3d\x77\xbb\x8f\xff\x21\x93\x0b\xd4\x2d\x70\xbc\xc4\x9b\xd7\xaa\xf6\xa8\xae\x66\x5b\x79\xba\x9c\xa2\x1a\x4b\x00\xda\x2f\x27\x51\x14\x21\xe0\x68\x7d\xb7\xf1\x99\xb0\x24\xe2\x11\x26\x9e\x7c\x18\xb8\x1c\x68\xe5\x4e\xbe\x4e\x08\x57\xce\x87\x7b\x68\x5e\xb0\x71\xfe\x17\xc9\xec\x84\x92\x88\x39\x52\xd1\xba\xb0\xc2\x19\x41\x5f\x84\x26\x34\x8d\x49\x1e\xf4\x99\x27\x6d\xcf\x6e\x0c\x23\x09\x4e\xc2\xe5\xe2\x71\xb9\xba\xdf\xad\xfe\xb9\x5d\x2f\x76\x81\x5b\x88\x26\x2c\xcd\x3d\x1e\xd4\x2b\xbf\xf9\xec\xe6\xcc\x32\xb3\xe9\xf2\xe9\x7e\x9f\xc4\x39\xe3\xcc\x11\x96\xd1\x88\x70\x0b\xc3\xb6\x0d\x96\xfe\x87\x92\xd8\x86\x52\xb6\xf0\x7b\x57\xbe\x43\xd9\x56\xf5\x58\xcd\x94\x26\x49\x16\x21\xd8\x6e\xb1\x2f\x14\xcc\x3d\xff\x24\x37\x68\x3b\xf0\x18\xbb\x0e\x67\xe7\x09\xbe\x96\x1f\x5d\x9c\xa5\xa0\x19\x3a\x54\x49\x1a\x27\x44\xf5\x64\x30\xbd\x43\x7f\xe1\xbf\x78\x43\x92\xa4\x2a\x13\xc9\x80\xbe\xad\x09\x71\xd4\xec\xb4\x4e\x32\x12\xa5\x34\xb0\x73\x7a\x87\x26\xbc\xa9\x2c\xb3\xf2\xa2\xa8\x37\x5d\xed\xa1\xd7\x87\x9b\x42\x5a\xc6\x6f\x2f\xd7\x99\xf4\x65\xa8\x5d\x3c\x76\xc0\x9a\x85\x52\x75\xd5\x34\xb8\xdd\x35\x76\x8b\x84\xa6\xad\xab\xf3\xae\x28\x6d\x4a\xd6\x1e\xba\x3a\x93\x28\x8a\xfc\xa5\xe4\x86\x62\x01\x68\x0b\x5b\x18\x3d\x25\x4e\x22\x14\xc9\xdc\xde\x2f\x5d\x68\xfb\xdf\x72\xb7\x4d\x9e\x09\xa7\xd4\xb2\xff\x35\x4d\xdb\x86\x5f\xc9\x55\xac\xc2\x34\x40\x86\x89\x7a\x50\xe1\xa5\x09\xe7\x0c\xab\xc0\x9d\x19\xd8\xbc\x8a\x1a\x43\xb9\x18\xe3\x23\x55\xb4\xe7\x70\x1e\x9d\x21\xe7\xab\xf5\xeb\xb0\x74\x3a\x8b\xfb\xa7\x89\x20\x14\x4f\xe8\xa8\x39\x5b\x67\x7f\x6d\xde\x68\x8c\xdd\xfd\x4c\x57\x60\x90\xbb\x4e\x04\x61\x32\xf6\x00\xef\xed\x47\x75\x35\x48\xba\x25\x22\x91\x18\x79\xbb\x0e\xca\x0b\x6a\x15\x9a\x48\x06\x98\xc5\x5b\x28\xa1\xe1\x50\x2c\x43\x12\x20\x91\xb1\x41\x24\x6a\x78\xec\x5e\x01\x90\x26\x2a\xca\xb0\x1e\x5d\x34\xc8\x53\xef\x72\x49\xee\x20\x52\x35\x58\x72\xb9\xed\x6b\xad\x2f\x2b\xeb\x34\xd1\x69\xc4\x54\xaf\x5c\x55\xcf\x99\xef\xbf\x63\xce\x3f\x7b\x40\xfe\x67\x54\x84\x95\x9c\x36\xd0\x79\x4e\xa2\xcc\xd9\xfd\x27\x01\x16\xc7\x56\xa9\xe8\xfe\x17\x40\x3c\x37\xd8\x44\xb9\x0c\x5c\xc3\x0b\xad\x07\x90\xb3\xbf\xbb\x13\x5d\xf4\x15\xfb\x53\x13\x9b\x78\x5d\x3e\xdf\x3e\xaf\xd6\xab\xdb\xf5\xdd\xe3\x0a\xeb\xf9\xcb\xc5\xfa\xf6\xc9\x3f\x6e\x93\x5b\xf0\x72\xe7\xc2\x3b\x32\x7d\x7f\xc4\x30\x24\x94\x7b\x78\xfc\xe7\x70\x61\xa5\x11\xe5\xd8\xeb\xba\xae\xd4\xdb\xb3\x38\x42\xbd\x51\x45\xd3\x54\xa1\x7e\x94\x46\xcc\xaa\xc2\x1e\x5f\x45\x03\x74\x85\x55\xe9\x90\xcd\x49\x89\xb6\x32\x60\x8f\xdf\x97\xdb\xd1\x79\x89\x91\x98\xd9\x73\x4f\x75\x29\xf6\xfb\x2e\x1c\xb0\x69\x01\xdf\x74\xe0\x44\xea\x68\x4a\x23\xc0\x6a\xc5\x6b\xb5\xd7\x4f\x66\x6c\x76\x53\x9a\x18\xa4\x1d\x39\x0e\x4b\xe2\x57\xfe\x87\x18\x81\x78\x58\xbd\xfe\x10\xb5\xa7\x53\x19\x4f\xb4\x94\x49\xab\xa5\x8a\xd9\xa5\xce\xb7\x0b\xa7\x90\x36\x23\x72\x38\x5b\xb7\x25\xdc\x3b\xd3\x54\xb8\x7a\xf4\x8f\x62\xaf\x2f\xd0\x98\x6e\x58\x2c\xf2\x2c\xf7\xda\xe8\xb6\xf8\x6d\xe7\xd6\xb6\x38\xc0\xb0\xcb\x9a\xa6\xb1\x32\xc8\x64\xda\xad\x4b\x87\xf9\x9e\x56\x14\xd2\x18\x22\xc4\x6d\xb8\xee\x79\xff\xd5\x24\x32\x58\x66\x5e\x63\x50\xff\xb7\xe8\xce\xc6\x73\x39\x4d\x48\x9e\x24\xe1\x51\x59\xad\x97\xf1\x4f\x27\x31\xf5\x9d\x7e\x9e\x57\xee\x1a\xca\x6a\xd4\xef\x44\xd3\x24\x8d\x30\x3f\xb4\x39\x88\x3a\xe4\x18\x77\xbe\x0f\x7f\x72\xc6\xcc\xd6\x84\xba\xf8\x5e\xd4\xfa\x19\xea\xb7\x2d\xfc\x9c\xf6\xbd\xb8\xc1\x29\xe4\xcc\xc6\xb8\xae\xe2\x36\xbb\x26\xd3\x2c\xb2\xac\x19\xeb\xd5\xff\xf8\x4b\xca\xd2\xcc\x43\xe9\x97\xd5\xe1\x80\x35\x3b\x4b\x6d\x37\x02\x2b\xa4\x39\x17\x58\x15\x07\xa5\x1b\x61\xe9\xaf\xfe\xbb\x44\x5c\xca\x05\xe0\x43\xec\xd6\xde\xe2\xfe\xfe\xe9\xc7\xea\x7a\x28\xef\x44\x53\x95\x0b\xd4\x61\x57\x55\x80\x4a\x86\x43\x12\x88\xeb\x3d\x0a\x8d\x68\xff\xa5\xa7\xfa\x7b\x40\x35\x4d\x95\x01\x01\x41\x2f\xc7\x06\xd1\xf1\xfa\x82\x4f\x9e\xa6\x5a\x30\x6e\x75\xb7\x5c\x8c\x71\x53\x57\x07\xb4\xd1\x4f\x35\x92\x5e\x7f\x85\xf3\xe4\x7d\x6a\xa9\xa9\x98\xb6\x8f\x5f\x17\x8d\x3c\xd5\x4d\x3f\x43\x00\xa2\xd4\xa7\x12\x7c\xb7\x30\xa2\x03\x6e\xaa\x7a\xfb\x0a\x5b\xf0\xd4\xb5\x34\x35\x5c\x21\x43\xaa\x14\xea\xad\x32\xa6\x50\x60\x27\xf8\xe4\x52\x8d\xc9\x51\x22\xac\x39\xc9\x2e\x2c\x9f\x05\x69\x64\x51\x64\x61\xc9\x42\xeb\xc7\xea\x06\x60\x92\xe8\xed\x05\x45\xbc\x2b\x95\x45\x32\x87\xc0\x57\x1b\xe2\x9f\xa2\x2a\xbd\x92\x9b\x1f\xa7\xa4\x70\xc5\x8f\xc5\x62\x19\x3e\x85\x0c\x6d\xe3\x41\x0c\x36\x78\x77\x8c\x44\x96\x5f\xcc\xef\x37\xe8\xa0\x35\xe1\x68\x22\x52\x97\x16\x5b\x1d\xe4\x1e\x0e\x03\x41\x0a\x9a\x91\xdc\x48\xf7\x02\x2d\x82\x7a\x2f\xc6\x69\xc4\xdc\x0f\xe4\x11\xe6\x4d\xf7\x45\xf9\x36\xef\x61\x64\x84\x6b\xec\x57\x95\xad\x1a\xa4\x72\x32\x22\x23\xdc\xb5\xf7\xe5\x1f\xc3\x40\x2e\xa3\x19\xd8\xde\xf6\xaa\x04\xa7\xb1\x17\x18\x0e\x68\x46\x73\x83\x0e\xfb\x55\x75\x7a\x79\x6d\x2f\x72\x89\xa3\x57\x96\x31\x9a\x27\x3d\x19\xb5\x1e\xdb\xd6\x8c\x39\x52\x2b\x5c\xa5\x81\x04\x72\x13\x4c\x65\x16\x13\x9b\xba\x75\xab\x74\x58\x6f\xc8\xff\x95\xfc\x7b\xf2\xea\xe3\xdc\x9a\x6a\x4c\x9d\xce\xb8\x19\x59\x2c\x29\x1b\x6a\x27\x0c\xea\x29\x7f\x8b\x96\x8f\x66\xb1\x11\x08\x17\x17\x07\x28\xf5\x1a\x5a\x28\xe7\x54\x2e\xdc\xe0\x24\x05\x34\x48\x1e\x40\xe6\x34\x12\x26\x83\xf2\x84\xf5\x7d\x58\x4f\x25\x5c\xd7\x45\xf9\x36\xaa\x45\x65\x69\x24\x31\x6b\xb0\x2b\x9a\xab\xd3\xb9\x4f\xd4\x64\x29\x4d\x11\xfd\x70\x3c\x35\xaf\xa3\x26\x9e\x4b\xd0\xae\xff\x06\xd7\x98\xb4\x76\x60\x16\xdb\xc4\x59\x0c\x6f\x62\x1a\x3c\x65\xa9\x60\x56\xf8\xda\xba\x75\x08\x16\xf0\x17\x90\x73\x21\x12\xaf\x4a\x50\xbc\x17\x7b\x78\x71\x20\xd6\xd1\x0d\xf0\x9c\x45\x4e\x18\xf8\xa1\xd8\x43\xd3\x56\x9f\x93\x6f\xf9\xaf\x28\xc2\x89\x7f\x99\x63\xad\x7f\x37\x42\xc4\x0c\x3b\x19\x2d\x57\xc2\x8f\xe2\x82\x26\xc7\x8f\x4b\x0d\xe6\xd6\xfe\xef\xf9\xf9\x79\xf1\xdb\x98\xc1\x7f\x49\x10\xc4\xf8\x6d\x40\x9d\xea\xb0\x62\xa4\xb1\xca\x22\x7d\x22\xe2\x7e\x5c\x29\xcb\x90\x92\x22\x20\xfc\xc4\xbe\x19\x0a\x63\xd0\x4c\x33\x40\x32\x0c\x79\xda\xbf\x6d\x06\x22\xe6\x97\x11\x5e\x66\x62\x82\x59\xf6\xa5\xed\xbd\xbe\x2b\x9f\xeb\xea\xa5\x1b\x3b\xca\xab\x64\x46\x19\x04\x1e\xbd\x1c\xda\xce\xba\x8e\xeb\xcc\x99\x31\x80\xaf\xfb\xe9\xfe\xee\x66\x54\x3b\xcd\x69\x9e\xa6\x2e\xd7\xa9\x5e\xb7\xc5\x84\x4a\x93\xe6\x54\xcb\x08\xc9\xaf\x3e\x2e\xfa\xd6\xdd\x08\x96\x28\xa4\x2d\x78\x8e\x9f\xfd\x49\x59\xce\x98\x2d\x39\x81\xaf\x45\xf6\x66\x3e\x67\xb9\xe5\x3c\xb5\xa1\xd5\xd5\x5e\x4c\xf8\x0b\x68\x1e\x47\x0c\xa3\x54\x94\x47\xb0\x80\xb3\x5f\xd7\x16\xf2\x38\xa6\x60\xbc\x43\xe7\x2a\x59\xfe\x50\xaa\x32\xeb\x49\x3c\xd7\xd5\xcf\xf3\xc4\x38\xe7\x89\xcc\x30\x4e\xda\x57\x21\x9d\x96\xa7\x5a\x1a\x1b\xdb\xb5\x50\x97\x62\xff\x08\x1f\xa3\x3d\x73\xf2\xe3\x19\x21\x88\x8d\x75\x15\xb6\xa6\x39\x81\xbe\x3a\x6f\xb6\xde\x17\xcf\xb3\x18\xe2\x61\xa9\x7e\xd6\xda\x5c\x06\x2d\xb3\x9f\xfa\x53\x72\xdb\x82\x80\xc9\x30\x77\x4b\xf8\x62\xc7\x7e\x46\x9e\xa7\x20\x55\xdf\xd7\xb0\xe9\x9c\xdd\x49\x5d\x25\xcf\x95\x75\x5a\x91\x72\xe4\xbe\x68\xda\x19\x7f\x30\xe7\x42\x3b\x35\xe5\xf3\x0d\x4c\xb2\x82\x39\x07\x89\xb8\x51\x79\x3a\x7b\x09\xaa\xbb\x16\x0e\xcd\x30\x62\xce\xb9\x21\x08\x2b\xdb\x79\x9d\xb2\x79\x9f\x2e\x17\xb1\x45\x6a\x37\xd0\x7e\x3d\xcb\x4b\x2a\xc4\xf1\x75\x09\xe0\x60\x5c\x92\xda\x6a\x8d\x60\x34\x3e\xa1\x7e\x98\xfc\x84\x4c\x98\x93\x04\x6d\x97\xe2\x70\x14\xc5\x4b\xf9\x3b\x16\xe6\x71\x85\x7f\x92\x0c\x1b\x9f\x1c\x32\xee\x72\x67\x9b\xd7\xc2\xd6\x40\xf7\xd8\x08\xfa\x1f\xff\x56\x14\x4d\x90\xdc\xd0\xa1\x71\x6a\x40\x62\xf1\x91\xb1\xcc\x15\x15\xd8\x89\x6f\x8a\x9f\xbb\xa3\xa8\x87\xe4\x33\x03\x0f\x2f\x57\x32\xc3\xcd\x33\x50\xb1\xcc\x95\x8c\x72\x25\xad\xce\x04\xbe\xd9\xbf\xa7\x52\x42\x73\x1d\x5b\xe9\xeb\xff\x9c\xa0\x3e\x2f\xf6\x7b\xef\x47\xfb\xbb\xd0\xb9\xad\x01\xed\x4a\x11\xdc\xa3\x5c\x2b\x8d\x9c\x72\xaf\x62\xdf\x7a\x60\xaa\x3f\x06\x31\x43\x87\xd9\x66\xc9\x97\xb3\x7d\xd5\x34\x87\x3c\x47\x72\x18\x83\x92\x20\xd7\x48\x71\x39\xb9\x1d\xc3\x2d\xa1\x61\x6f\x94\xfa\xcd\x28\x37\x82\x63\x3d\xcd\x1f\x44\x0a\xba\x01\x23\x2e\xcd\x8d\xd6\xd0\x97\x59\x46\xa9\x7f\x6f\x77\x79\x44\x9c\x42\xf3\x62\xbb\xda\x6d\x9e\x3c\xb7\x01\xe5\x51\xe7\xd1\x86\x3c\x8d\x25\xbf\x73\x9a\xa0\xf3\x13\x9a\x13\x23\x72\x57\x90\x79\x28\x4a\xa8\x27\x82\xc2\x94\xd3\x28\xc7\xe9\xf0\x20\x2c\x6b\x96\xa7\xca\xa2\x9c\x26\x24\xd1\x9e\x6e\xff\xa1\x28\xdb\xc7\xd3\xa1\x09\x07\x25\x47\x1a\x43\x24\x64\x10\xa7\xda\x12\x82\xf6\x9d\x7b\x94\x53\x48\x11\xf1\xb9\x6b\xa0\xd4\x78\x9f\x8e\x2a\x68\xfe\x42\x63\x25\x11\xb2\xe1\xb8\xc0\xe7\xfa\x49\x29\x8f\x4d\x84\x49\x54\xdc\x91\xfb\x86\x3e\xca\x13\x66\xb0\x30\x26\x9a\x06\xda\xab\xf3\xb8\xa9\x6f\xfc\x43\x49\xcc\xd0\x87\xbe\xa9\xf6\x45\xf5\x58\x94\xff\x2b\x66\x69\x69\xe7\x8d\x3d\x4f\xf3\x84\x89\xa1\x00\xb8\xd3\x94\x99\x82\x39\xfa\x55\xc2\xb3\x88\xd0\xc8\xd3\x9e\xb6\x2d\x16\xc5\x8a\x03\x54\x27\xab\xb8\x37\x4e\x33\xf0\x2c\xe2\x46\x06\x7a\xa2\x89\x2e\xfc\xe4\x62\x32\x66\x7c\x62\xba\x33\xb0\xa8\x98\x30\x3f\x32\x67\x16\xa3\x7a\x5f\x09\x0d\xda\xc9\xd1\xcf\x0f\xe5\x5a\xd8\xc2\xe7\x5e\xbc\x01\x95\x17\x22\xaf\x1e\xf7\xca\x65\x62\xc1\xb1\x87\xa2\x6c\xd7\x70\x3c\xb5\x63\x39\xd2\x49\xd6\xd6\x7d\x49\xe5\x0a\x7d\x05\xe7\x8d\xe3\x13\x78\x2a\xad\x56\x5f\x63\xb1\x7c\xb3\x2e\x14\x57\xc2\xa0\x0b\xf8\x7f\x8b\xfd\xbe\xf8\x8f\xf8\xbc\x5f\x9c\x72\x25\x7b\x38\xbe\x45\xed\x5e\x89\x06\x7d\xc2\x66\x84\xdc\xe5\x3a\x8e\xb1\xcb\x65\x77\x59\x45\x1f\xff\xb8\x4e\x6c\x72\x50\x68\x6d\x45\x63\x67\x5d\x82\x7c\x72\x1d\x9a\x13\x5f\xc3\x7b\x14\xb5\xaa\xbe\x54\x07\x08\xce\xda\x64\xa8\xcc\x6c\x7d\xc9\x33\xbb\x7a\xeb\x35\x7f\x87\x5a\x67\x88\xab\x09\xb3\x10\x93\xbb\x93\xed\x89\x03\xcd\xb0\x95\x09\x79\xd3\x76\xf2\x74\xde\x55\xb5\x4f\x25\x93\x0b\xae\x8f\x99\x4c\x22\x07\x46\x90\x86\xd5\x76\xeb\xdc\x2d\x9f\xd8\x90\xc0\x9f\x72\x48\xad\x58\xba\x6d\xf7\xec\x25\xc0\x29\x07\xa9\xb1\x28\x79\xb4\x3d\x9c\x4f\xc6\x40\x77\xde\x51\xa2\x97\x9b\x24\x26\xae\x0d\xf7\x79\x12\x02\x8c\xdf\xbe\x88\xb8\xb4\x9d\x3d\xd6\x6c\x5a\x3e\x7b\xf1\x19\xee\x48\x90\x8c\x27\x7c\x94\x65\xf5\x0d\x7a\xdf\xc5\x90\x10\x61\xf2\x2d\xb0\xfd\xfa\x37\xa7\x2b\x1f\x6a\x0a\x6a\x00\x77\xc2\xcd\x76\x7d\xe7\x3f\x63\x54\x61\xb6\x1c\xdb\xb9\x76\x62\x88\x0e\x10\x2c\xe7\xf8\xc4\x8e\x4e\x31\xee\xd7\x3e\xbe\x60\x92\x60\x24\xbb\x59\x0c\x3d\x63\x91\xa4\x1c\x5b\x87\xb1\x23\x62\x9c\x42\x15\x69\x4a\xb9\x0a\x5d\x30\x36\x43\x75\x2b\x0e\x97\xe2\x7b\x7e\xbc\x32\x98\x8d\xf0\x0e\xa5\x55\xc1\xfb\xff\xc9\xeb\x7c\xd6\x63\xec\x7e\x28\x23\x39\x28\x97\xc6\xe9\xec\xcb\x50\x20\x9d\x8a\x2c\x61\xb6\xf5\x11\xf3\xeb\x57\x03\xe5\x5f\xef\xfc\x58\x30\x63\x6f\x38\x45\x96\xc6\x3a\xa0\x79\x31\x4f\x75\x57\x5e\x3d\x5e\x85\x33\x72\xc0\x8e\x9f\xb6\xf8\xe9\xf0\x27\xde\x5a\xfa\x01\x9a\x61\x0a\xec\xe1\xee\x71\x77\xf3\xed\xf1\xfa\xee\xf1\x76\x37\x94\xa3\xa1\x22\x03\xe1\x7d\xb1\x0d\xec\xcd\xa2\x5b\x77\x80\x3e\xdc\xab\x5d\xe6\xc3\xd5\x20\xf2\x94\xe7\x48\x16\xff\xb4\x5e\x7c\xf5\xa7\xe0\xd2\x2a\x1e\xbc\x40\x6b\x11\x0c\x17\x08\x49\x21\x68\x2c\x53\x9f\x15\x2c\xdb\xba\xda\xdf\x95\xa6\x7a\x10\x3f\x9f\xa1\x46\x03\x78\x77\x90\x76\xbb\xbb\xef\xbb\x90\x84\x4c\x25\x1a\xbc\x26\x30\xd4\xe4\xfe\x48\x96\x0f\x65\xc4\x1f\xc5\x84\x97\x94\x0a\x15\x19\x2b\xa1\xe8\x3a\x61\x67\x73\x32\x42\x11\x4b\x50\xd8\x85\x3a\xae\x5b\x64\xd6\xcf\x15\x8a\x6a\x7c\x90\xaf\x80\x79\xf1\xc9\x41\xa9\x22\xed\xa8\x03\x77\x07\x68\xc5\x7e\x77\x28\xca\xf1\xaa\x50\x4a\x60\x53\xb6\x47\xb2\x7e\x96\x7a\x15\x0a\x22\x04\x13\xec\x4a\xf8\x70\x80\x10\xbb\xf3\x8c\x46\x41\x62\x90\x62\x06\x6c\x15\xdf\xd2\x5d\x38\x15\xa8\x5e\xb1\x9b\x0a\xc8\xc1\x4b\xdc\xdf\x42\x09\xcd\x88\x4b\x82\x0a\x90\x3c\x32\x21\x18\x7c\xae\x3e\xa0\x3e\x35\xd3\x8c\x8d\x00\x88\x22\xaf\x60\x28\xca\x45\xdb\x0a\xf5\xe6\xb6\x95\xbb\xe0\xd6\x09\x23\x72\x65\x93\x1a\xab\xf5\x32\xa3\x24\x7c\x0e\x00\x7d\xf6\xe9\xaa\x12\xf5\x05\x87\xca\xaf\xf3\x3d\x32\x8a\xac\x30\xfb\xf3\x7a\xf5\x70\xf7\xed\x61\xb7\xfd\xf3\x79\xb5\x5b\x0e\x66\xb1\x8c\x28\xc5\x5e\x4e\x57\x99\xe8\x59\xde\x9a\x71\x40\x26\x23\x9d\x78\x00\xc4\x75\xd1\x58\xde\x79\x9f\x17\x90\x24\x92\x08\x8a\x5c\x14\xf5\x75\x5d\x1d\x3f\xeb\x8b\xf6\xa3\x93\x94\x43\xc0\xf6\xd9\xe4\x08\xe8\xc5\xcf\xe2\x33\x3b\x24\x99\xb1\x7a\xda\xce\x82\x77\x31\x2d\x62\x9b\xc6\x5d\xf2\x54\xc6\x34\x52\x36\x1b\x8c\x9b\xc6\x06\x91\x07\xd3\x31\x22\xf6\x3b\xfc\xff\x11\xea\xed\x58\xb5\x17\x71\xa1\x4c\xa2\x0c\x4b\x66\xd7\x4f\x3f\x76\x37\xc1\x78\xcb\x44\x51\x04\x3c\x2e\x9a\x42\xbb\xbc\xf1\x17\xf1\x0e\x57\x00\xa5\x03\x1d\x5f\x66\xc3\xfd\x57\x35\x07\x0b\xe9\xb2\xdc\x6c\x3d\x06\x47\x66\x4c\x81\xf0\x1c\x3a\x9d\x45\x9e\x06\x8e\xe3\x33\x65\xb1\xc9\x82\xf7\x5c\xdd\x74\x8b\xa5\xf1\x3d\xd4\x7e\x48\x22\x71\xc8\xee\x74\x6c\xa0\x9e\xa7\x58\xef\xf1\xdd\x83\x53\x67\x96\x35\xec\x58\xed\xf7\x0f\xe2\x38\xf6\x2e\x65\x96\x27\x94\x0f\x4c\x91\x50\xed\xe3\x44\x8c\x94\xca\x4c\xf3\xc4\x6a\x21\x80\x3a\xb5\xe0\xe5\xfd\xd4\x6f\x5a\x96\x64\x1e\x31\x24\x1a\xc6\x34\xc3\xfc\x64\xce\x39\x41\x18\x25\x92\x93\x5c\xec\xf9\xa7\x11\x9e\xdd\x7f\x45\xe6\x98\x22\xd6\x95\xef\xa9\x19\x1f\xe7\x8c\xa1\x0f\xb2\x72\xdb\xdb\x60\x1f\x95\x3c\xa5\x98\x4c\x71\xc4\x3f\x85\x90\xc5\xbe\x68\xcf\x43\x9f\xd6\x8f\xd4\x02\x03\x88\x27\xcc\xfd\xcf\xd0\xe3\xf4\x3f\x28\x62\xbb\xc5\xdf\x6d\x76\x9b\xbb\xdb\xc7\xc5\xf6\xdb\x7a\xb5\x1e\x1b\x0d\x29\x92\x04\xa1\xfb\xe5\xc9\xca\x46\xd9\x78\xb3\x8f\x5f\xa5\xc8\xa3\xcc\xc9\x5d\xc8\x42\x87\x4f\x9d\x1c\xb8\xa5\xf5\x5a\x56\x96\x86\x73\x0a\x84\x92\x32\xb5\x1c\x15\x6d\x71\x40\xb9\x6d\xdf\x51\x21\xa5\x16\x94\x4f\xe4\x4d\xa7\x8c\x9a\x43\x4b\x2a\xa5\x49\x3d\xb5\x12\xc6\x4c\x77\x17\xdb\xb2\x1b\xa8\x99\xd6\x1c\x75\x46\x7c\xa6\x4d\x82\xa2\x88\xa2\xc4\x0d\x6a\x59\x0b\xd3\x99\xeb\xcf\x44\x97\xe7\xa7\x83\xc9\x32\xee\x7e\xfe\x6b\x51\xbe\xe8\xea\xd0\xed\x8c\xf5\xc1\x45\x92\xa3\x4b\x35\x9a\x7a\x39\x9a\x17\x71\x80\x6e\xbb\xf9\xaf\xbd\x98\xd1\xaf\xab\x88\xa9\xc8\x66\x95\xdb\x6a\x37\xcd\x8f\xf9\x31\x10\x31\x07\x5a\xf9\x15\x0a\x49\x91\x1c\x70\x97\x10\x47\xef\x3a\x2a\x92\xdb\x4d\x18\x90\xc8\xb5\x54\x67\x5f\x0f\x76\xc7\x19\x03\x2b\x03\x84\xe9\x65\xdc\xb8\x7e\x40\x31\x6f\x6f\x15\xcb\x52\x4a\xfa\x5c\x5a\x17\x46\xec\x47\x39\xb7\xc9\x70\x41\xd0\x17\xb3\xc6\x16\xa1\x6a\x17\x9c\x9d\xfd\x83\x88\x09\xd1\x36\xac\xae\x1a\xb0\x64\xd5\x93\x01\x5c\x66\xee\x3d\x75\xa1\x2b\x32\xb8\xae\xa6\x75\x3c\x95\x10\x65\xf5\x22\x8b\xf6\xf5\x35\xd0\xf4\x50\x95\x28\x96\xe6\x23\x8a\x6e\x9c\x32\x8f\x95\x25\x0f\xc6\x34\x4c\x18\x6a\xf1\xa3\xa8\xc5\x56\x1c\x60\x80\xe1\x54\x19\x73\xc1\x7f\xdf\xb5\x3c\xaf\x14\xd6\x0d\x25\x38\x5b\xb7\x50\x1f\x9a\x27\xd3\xb7\x1d\xa8\x3c\xcb\x8c\x13\xc3\xb8\x46\x06\xb7\x0b\xf2\xd5\x6e\x8c\xc4\x36\xd3\x87\xab\x4f\xd9\x75\xe6\x5f\x12\x67\x29\x82\xdc\x9c\x18\x11\x26\x1a\x6d\xc3\xa8\x1f\x10\x03\x36\xd5\x2c\xe3\x9b\xa1\x9d\x52\x82\x58\xd4\x6f\x17\xca\x7d\x2b\x55\x55\x1a\xa8\x01\x95\xd0\xfc\x00\x4a\x88\xdd\xe2\xeb\xa2\xd2\xa3\x62\xb2\x12\x9a\x62\x66\xeb\x4a\x94\x6f\xbf\xcc\x17\x28\xa1\x53\xa4\xec\xc2\xc0\x65\xe9\x91\xb5\x93\xbb\x17\x00\x08\xd7\x14\xd5\xe1\xa4\xfa\x74\x50\x17\x7f\x23\x38\x42\xec\xf7\x8b\xa6\x81\xb6\x99\x7a\x82\x4a\x2a\x10\xce\xcf\xdd\x6c\x9e\x27\x07\x55\x16\xd9\x3b\xe8\x82\xd1\x87\xea\x1d\x86\x2e\xad\x52\x99\x6d\xda\x12\x4a\x9d\x9c\xa6\xf7\x5d\x79\xf4\x0c\xa6\x54\x29\xd0\xdc\x23\x4a\xca\xf2\x24\xf6\x53\x86\x2f\x37\x4e\xf3\x14\xcd\xaa\xcf\x59\xf5\x85\xaa\xee\x90\xd4\x21\xef\xf9\x3f\xa7\xaa\x9e\xb6\x15\x2a\x6d\x92\xdc\xa1\xe1\xbf\xfe\xb9\x3c\x8a\xa6\x99\x02\x09\x14\xe4\x1c\xe1\x0f\xfb\xea\xa5\xfa\xb6\xf6\xd5\x76\x65\xb2\x0c\x3b\xee\xae\xd0\x43\x84\xc3\xf1\x37\x40\x69\x65\x20\xc1\x46\xf1\x63\xd5\x34\x83\xa7\xac\x23\x0d\x9a\x0c\x1a\x3d\x71\x0e\x8d\x04\xd2\xa9\x8e\x20\x42\x1e\x01\x3d\xff\xb2\xff\x71\xea\x25\xed\xa9\x26\x11\x49\x3d\x56\xcc\x42\x46\x7f\x5b\x6f\x9c\x9d\xdc\x9a\x44\x12\x13\x97\xdb\xdb\xd5\x0c\x85\x9c\x1f\x94\x30\xac\x7f\xde\xd6\xa2\xd4\xbb\x4d\xb5\x17\xf5\xee\xc1\x72\xd5\xfb\xab\xa7\x29\x58\x15\xdd\x7d\x75\xd2\xc3\x5b\x67\x32\xc7\x1e\x0a\xcb\xcd\x7a\xc1\xad\xfb\x69\xf5\x5c\xc7\x34\xca\x3c\xae\x77\xc2\xea\x33\xae\x45\xe9\x38\xe6\xb8\x54\x96\x28\x78\x29\x02\x49\x1e\xd5\xb1\xd4\x99\xeb\xd0\x5a\xd6\x55\x63\xfb\x0d\x2e\xdc\x04\x9d\x88\xc4\xfa\x2f\x1f\x25\xd4\xdf\x6d\x63\x52\x7f\x92\x8c\x32\x62\xc6\xa0\xf5\x8f\xc1\x36\xe5\x47\x71\x82\x09\xb6\xa3\x38\x5b\x5b\x3b\x03\xb1\x9c\x0f\xb5\xdd\x09\xf2\x44\xa1\x57\x53\x57\x55\xdb\x3c\x0c\xb5\x05\x26\xaf\x2c\x57\x12\x5d\x27\x9b\xbe\x19\x10\x59\x53\x9d\x1b\x1d\x39\x2c\x75\xbb\x87\x61\xdb\xf5\xfc\x84\xd5\x9c\x1a\xea\x1e\x72\x68\x06\x58\x95\x6d\x7d\x9e\xdc\x1d\x67\xb6\x36\x0f\xed\xeb\xa0\xd0\xaf\x79\x66\x4d\xcf\x07\xc8\x63\xef\xe5\x6a\x9e\x69\x6e\xf9\xa1\xf6\x7a\xec\x00\x6b\x2e\x73\x95\x86\x96\x9c\x63\x0b\x3b\x1a\x8f\x3c\x02\x8d\xf9\xbb\xce\x68\x74\x0f\x79\x5b\xb4\xa2\x2c\x4e\x97\xb7\x31\x7e\x24\x82\x5a\x70\xf1\x6b\xd5\x4c\x27\x87\xa4\x1c\x13\xc3\x36\xb9\x8c\xd2\x9b\xfd\xc6\xa1\x55\x64\x85\xc4\x85\x9e\x0a\x1a\x4e\xd8\x56\xc6\xbf\xa7\x34\x67\xc1\x20\xd9\xec\xd7\xc2\xb2\xc4\x8d\x1f\x9b\xce\x2d\xa0\x45\x9c\xda\xd7\xaa\x2e\xfe\x02\xed\x52\x5d\x4b\x51\x6b\xab\x32\x31\xa5\x76\x9d\xfc\x92\xe6\x26\x1b\xe6\xbc\x46\x99\x2e\x3f\xc6\x10\x84\xe4\xb8\xf6\xcc\x9b\xaa\x9e\xf2\xf5\x50\x0d\xa9\xf2\x59\x4b\x84\xc9\x61\x87\xdc\xd5\xf9\x2b\x9c\x67\x57\x3c\xa4\x76\x4b\xd3\x17\xa8\xfd\x79\xaf\x4b\x03\xe7\xd8\xb9\xd4\xb4\x15\x2a\x85\x55\xca\x3f\x62\x43\x13\xc4\xbd\x7e\x40\xb1\xad\xbe\x6d\xae\x27\x8f\xc8\x70\x4a\xa9\xa3\x36\x7d\x87\x7a\xd3\x56\xea\xad\xbb\x2a\xab\x79\x4b\xc3\x28\xa5\x42\xda\xa4\x7b\xd0\x5d\xc4\xff\x58\x5d\xf5\x0a\x62\x14\x22\xc2\xd0\x3d\x58\x61\x80\xd3\xb9\xab\xbf\xe0\x33\x9c\x73\xf7\x20\x22\xd2\x13\x43\xdc\x57\xea\x2d\x44\x32\xa3\x47\x09\x51\xca\xb2\x81\x0e\x7a\x28\x95\xb6\xa3\x79\x0c\x24\xca\x33\xee\x3b\x32\x14\x14\xc7\x76\x5d\x4d\xc4\x12\x29\x10\x4d\xd1\x59\xed\x76\x5e\xfc\xf2\xdc\xdb\x00\x2a\xac\xd6\xfb\xee\x58\x57\x3f\xcf\xbe\xb3\xc5\xa2\xf4\x3e\x4d\xed\x0d\x1d\x7d\x60\x69\x8c\xc8\x9b\x0a\x3b\x8d\x1b\x47\x81\x1a\xbc\x56\x88\xb3\x18\x05\x17\x9f\xd7\x4f\x0f\x4f\xdb\xa7\xf5\x66\xf7\xfc\xf4\xe4\xf7\x41\xc8\x98\xc6\x72\x6e\xdf\x18\x8e\x5b\x54\x55\x8f\xc4\x77\xc6\x33\x02\xb2\x5c\x60\xc4\x8f\xd0\xec\x93\x6b\x48\x19\x55\xca\x21\x8f\x62\x1e\x7b\x63\xe0\x7b\x60\x2e\x5d\x37\xc8\x89\xa3\x64\x2c\x0b\xc7\x15\x3b\x79\x25\x39\x8b\xb8\x97\x8b\xd9\x1d\x86\x64\x3d\x2b\x5f\x21\x05\x1e\x69\xc7\xc2\xe0\xa6\x50\x20\x95\xa4\xc0\x89\xcc\x1d\xda\xa4\xc7\x53\x02\xa7\x2c\x95\x8e\xe9\x75\xd5\xbe\xda\xa6\xd2\x91\xe9\x9e\xdc\x32\xe7\xb6\x8c\xe4\x29\xad\x2e\xac\x56\x9f\x06\x05\x91\x19\x74\xbe\x97\x35\xe8\xa2\xbd\x5e\x3c\x0d\x8b\x37\x6e\x8c\x4c\x63\x54\x4f\x5c\x7d\x7f\xb8\xf6\x09\x52\x50\x32\x0e\x0f\x63\xa4\xc5\xee\x07\x74\x9b\xae\xf3\x77\x7e\x54\x75\x33\xca\x32\x82\x16\x11\x66\x01\x10\xda\x72\x55\x55\xfb\x3f\xac\xbe\x90\x3b\x0c\x20\x10\x30\xf7\x2c\xda\xba\x50\x6f\x5b\x24\x6b\x0a\x9b\x39\x98\xc8\x4a\xf0\x6b\x28\xcf\x96\x67\x7d\x7e\x8f\x02\xc3\x64\xa4\xfd\xc6\xdb\x2d\x13\x4c\xbf\xa2\x87\x61\x21\xf6\xc3\x0e\x5d\x30\x19\x43\xca\x00\xf5\x2a\xf6\x7b\x28\x5f\xfa\x03\x00\xd8\xd4\xd2\x59\xb6\x2e\xa0\x70\xe1\x81\x3d\x6a\x22\x26\x2d\xe3\xb8\x8b\x8b\x7f\x14\xed\xeb\x80\x7b\xd9\x8f\x92\xc0\xc3\x3a\x34\x17\x38\x45\x43\x0c\x41\xcb\x75\xb7\x7c\x1a\x6f\x1d\x86\x98\xcc\x2b\x1b\x7e\xaf\x5a\xdf\x18\x12\xe0\x6c\x86\x66\xca\x33\x4a\x2d\x61\x0f\xb2\x2e\xda\xf3\xa8\xf4\x3b\x9e\x1e\x86\xe6\x56\x88\x7e\x46\x43\xfe\xc2\xf0\x1b\xaa\x13\x44\x78\x2c\xef\x9f\xbb\xb7\xf0\x38\x52\x2c\xa2\x86\x51\xcd\xdd\xc6\xbd\x53\x3d\x90\xd7\xb0\xd8\x2a\x5e\xb6\xc5\x01\x7e\x14\xa5\xf6\xdc\x7c\xd4\x30\xc9\xad\xcc\xad\x68\xbb\xa9\xbf\x2a\x35\xf4\xdf\x02\x11\x3b\xf8\x91\xaf\x51\xcd\x08\x5d\x50\x13\x47\x96\x9a\xf0\x05\xda\x9b\x53\xd9\xad\xe9\xc7\xbe\x50\x6f\x62\x91\xa0\xf7\xf1\x31\x02\xe3\x99\x34\xb1\xa2\x2a\x0d\xb4\x0f\x95\x7a\xf3\x8c\x73\xb8\x80\xe2\xb1\x9d\x32\xa9\x49\x91\x5a\xe7\x60\xf9\x8d\x26\x06\xc3\x64\xd4\x8a\x5e\x79\x3d\xcf\xf0\xb9\x4a\xb4\x74\xd2\xf0\xd8\xba\x3e\x99\x03\x99\x61\xd8\x76\xdf\xd9\x07\x2f\x25\xf5\x58\xa8\x37\x8b\x6c\xe8\x2b\xfd\x26\x8f\x14\xc6\x33\x42\xeb\xeb\xe2\xbd\xe8\xec\xd1\xff\x39\xd5\x45\xa3\x0b\x9b\x00\xe9\x9d\xba\xe1\xb2\x31\x39\x8d\xb0\xeb\xf3\x3f\xa7\x42\xbd\x6d\xaa\xba\xbd\x2a\x42\x12\xd9\xe4\x5a\x63\x01\xea\xe9\xa3\x9c\x06\x1e\x46\x10\x83\x1d\xcc\x68\xd8\x7b\x06\xc1\xf1\x43\x11\xa9\xe5\xda\xb3\xf9\xa3\x5b\xd1\xcc\xb4\x16\x1a\xc1\x2d\x73\x5f\x10\x52\x1d\x88\x9d\xdc\x7c\x5b\x6f\xbf\xac\xd6\xbb\xed\x6a\xf9\x65\xa6\x2f\xcc\x08\x29\x30\xaf\xf0\xfd\x6e\x84\xb3\x37\xc2\x50\xa4\x05\xf3\x76\xff\xea\x34\x30\xbd\x43\x91\x91\xec\xdf\x63\x68\xd1\xbf\xe8\xbf\xc3\x29\xac\xfc\x5e\x13\x1a\x6e\x67\x77\x0b\x23\x19\x55\x34\x24\xf5\xa3\x27\xf9\xbf\x21\xb3\xe1\x0b\xbb\x46\xe6\x99\x63\x91\x52\x55\xad\x51\xbd\x71\xa8\xad\x40\x8d\x94\x0a\xbb\x73\x17\xd7\xdf\xef\x36\xdd\x26\xe6\x9e\xc1\xf3\x6a\xbd\x1c\xdc\xae\xd4\x91\x25\x06\xf9\xa4\x9a\xe7\x86\x99\x44\xc7\x8e\xf9\xff\xc7\x6a\xfb\x45\x7a\x19\xf3\x8b\xd0\xc5\x8f\xcf\x8d\x76\x7a\x54\x16\xb7\xb5\xe9\xb3\x25\xc6\x28\x61\x29\x93\x9c\xa2\x71\xe7\x38\xae\x7e\xaa\x81\xb5\x31\x3a\x41\xeb\x10\xa4\x72\x97\x58\x53\x9b\x35\xb0\x2c\x8a\xe2\x0c\x17\x95\xd3\xc4\x46\x7f\x68\x55\xea\x5e\xf7\x8b\x45\x51\x6a\x71\x33\x68\x6a\x6f\x1c\x54\xd4\xd5\x29\x72\x3f\x26\x8b\x91\x7f\xe3\x78\xf2\x4c\xe4\x3d\xa5\x39\x8b\x22\x61\x9b\xf0\x2a\xd7\x78\xb0\x43\xdc\xce\x1f\xc3\xde\x20\x77\xf7\xdd\x58\x9e\x5a\xc9\x16\x44\x36\x16\x8e\xc0\xf6\x8f\xf1\x65\x93\x8c\x60\xb6\x47\x68\xfd\xed\x33\x7a\x39\x16\x11\x95\x27\x01\x7b\xe7\xf3\xf7\xa1\x2d\xfd\x7e\xd0\xb0\xfc\x0b\xdd\x32\x16\xd1\x8c\xa2\x38\x62\x53\xbc\x94\x0b\xcc\xd5\xfd\x31\xfe\x1d\x2a\x4c\x6c\x25\xd0\x5d\x35\x76\x6c\x6f\x58\x44\x65\x84\x51\xed\xa9\xbc\x41\xe8\xd0\xe4\xfb\x4c\x66\xd8\xf4\xbe\xac\x4e\xc7\x19\x8a\x9b\xc9\x60\x60\x36\x31\xd8\xed\xbc\x0f\x85\x2e\x1e\xab\x16\xec\x36\xd8\x6f\xd0\x2c\x4a\x22\xc2\x13\x2f\x0a\x3e\x92\x20\x9e\x9c\x2f\x61\x9c\xbb\x26\x98\x6d\x75\xd9\xc9\x7d\xba\x54\xd2\x60\x51\x92\x64\xa8\xc3\x77\xbb\x19\x13\x36\xf8\xc3\x69\x86\xcc\x22\xd7\xa2\x1e\x68\x97\xce\xde\x4d\x92\xe5\xbe\x16\xef\xea\xce\x79\x67\x10\xfc\xfa\x8f\x47\x02\x44\xfe\x65\xa5\xfe\xcd\x24\x9c\x62\x14\xb8\x6b\xeb\xe2\xf0\x09\x3e\xb8\x1b\xa5\xb8\xd5\x89\xfb\x19\x5e\xfe\xb2\x3a\x1c\x44\xa9\xfd\x0b\x4a\x44\x9c\x68\xc7\x89\x04\x8d\x6f\xe4\x0c\xef\x2f\xa5\xd2\x87\xb7\x77\xa5\x2e\x14\x34\x28\xe7\xe9\x61\x62\xe1\xac\x68\xd8\x2e\x56\xf6\x6c\xcc\xcc\xa2\x34\xb5\x8e\xbd\xb7\x8a\xdf\xa1\x69\x2f\x58\x9c\x58\x94\x72\x2b\xed\x3d\x6a\x09\x3d\x5d\x42\xe4\xa6\x5b\x3f\x8b\x32\x4e\x11\xbc\x65\x89\x65\x9b\x07\x71\x7c\xae\xc6\x7b\x42\x37\x26\x45\xee\x19\xc4\xb6\x5c\x08\xf5\xcc\x5f\x78\xa6\x74\x82\xf5\x5a\x19\xcf\x09\x72\xb0\x28\xcf\x0c\xc6\x19\xe8\x22\x3f\x1d\xa1\x7c\x3e\xf6\x7d\x0a\x2c\xca\x73\x89\xe8\x3c\x1f\x8b\x76\xcf\xd2\x31\x63\x2e\x4a\xed\xba\x3c\xa6\x90\xa9\x59\xe0\xd0\xe0\x84\xe8\x03\x43\x23\x8a\x7a\xd8\x94\xc9\xa2\x9c\x5b\x2d\x14\x0b\x88\x20\xe1\x63\x25\x81\x0e\x1e\xfe\x43\x55\xc2\xf9\xea\x6c\xdd\xed\xf9\xc7\xc9\x69\xa4\x86\xf4\x61\x68\x7b\x6d\x7d\x19\xc2\x44\xe2\x79\x6e\x85\xca\xe1\x20\x91\x55\xde\x1f\x10\x84\xa0\xea\xe3\xd8\x69\x1b\xe7\xa9\xc3\x50\x46\x03\x87\x84\xe7\x08\xc3\x6d\x0a\x99\xa1\x06\x21\x1d\x8b\x44\x42\x10\x49\x23\xa1\x7d\x2a\x97\xd5\xfe\x74\x28\x9f\xea\xeb\xea\x2f\x28\xff\xe8\x6b\x80\x21\x5c\x60\x9d\x75\xc5\x5c\xf2\x1a\x5b\x27\x2f\xf5\x7f\x87\x98\x4b\xf7\x15\x99\xb0\x3c\xed\xf1\xb5\xd3\xba\xf4\xf8\x21\x49\x69\x01\x8c\x16\xf2\x5e\xd5\x6f\x45\xf9\x72\x57\x9a\x5a\xcc\x6e\x8e\x2c\x92\x60\x8c\x55\x75\x7a\xad\xf6\xfa\xb6\xdb\xe9\xe6\x27\x9d\x34\x8c\x3a\x34\xdb\x56\x34\x6f\x36\x77\xf6\x2c\x0a\x3d\x99\xd0\x4a\x68\x74\xd1\x50\x50\xb0\x3a\x95\xfa\xfa\x34\x94\xa6\x66\x11\xd0\x28\x1a\xf0\xb7\x56\xe5\xb7\x7a\xac\x74\x9b\xff\x8b\xd0\xfc\xdf\x61\x74\x8a\x8e\x55\xd3\xcb\x50\x42\xfd\xad\x2c\x82\x69\x00\x6e\x59\x27\xf5\xa0\x2f\x67\x18\x5e\xb0\xc8\xf0\x38\x71\xd1\xdc\x23\x7c\xcc\xb5\xfd\xb1\xc8\x08\x8e\x60\x2c\x73\xda\x9b\x62\xbf\xbf\x86\x7d\xf1\x0e\x35\xd6\x3e\xc6\xb7\xd7\x39\x1d\xda\x69\x18\x6d\x4e\xd2\xee\x32\xf3\x8f\xd6\xa8\x1c\x29\x07\x31\xb8\x5e\x68\x3d\xa9\x93\x33\x12\x45\xb6\xb3\xe3\xcf\xa7\xfb\xa7\xe5\x62\xf3\xe5\x0f\xff\x39\x17\x18\x2d\xe9\x5a\x14\x7d\x63\x0d\x23\x91\x54\x8c\xf6\xe4\xd7\x83\xf2\xa1\x1b\x40\x88\x46\x72\xa0\x9d\x4b\x7c\x80\x9e\xf8\x6a\xa3\x9b\x26\x24\x49\xd0\xaa\xee\xe4\xb1\x55\xff\x15\x4d\x01\x23\xc4\x49\xf3\xa2\xb6\xba\x9a\xc9\x76\x30\x42\xb8\xc6\x4c\xea\xa1\x28\x2d\x7b\x64\x55\x8f\x71\xc2\x8c\x10\x19\x23\x83\x32\xbc\x43\x7d\xbe\x2a\x74\xbf\x5e\x09\xcd\x63\x0c\xda\x4f\x65\xf1\x9f\x13\x0c\x54\x55\xc2\x97\x99\xa1\xd8\xed\xda\x7a\xad\xb5\x5e\x7e\xdf\x8d\x88\x23\x81\x48\x14\xd7\x3a\x73\xb4\x62\x8c\x8b\x52\x5f\x7f\x06\xb5\xef\x5f\x4e\x9c\x0a\x9c\x11\xb8\xc9\xec\xb6\xeb\xc5\x72\xc7\x53\xdf\x84\xce\x48\x0a\x56\x2d\xdf\x52\x70\xdf\xd6\xa2\x6c\x61\x5c\xe6\x63\x24\x67\x79\x3a\xa2\xdf\x74\x08\xf8\x02\x6a\x6c\x76\xbf\x3a\xd5\xf3\x20\x49\x46\x78\x42\x72\xa7\x71\x5f\x3e\x56\x1f\x61\x63\x08\x87\x55\x6e\x67\x42\x17\x08\x0f\xf8\x66\x86\x3c\x33\x53\xd0\x05\x23\x5c\x58\x10\x09\x36\xe3\x58\xb3\xe6\x3d\xa5\x2a\x00\x0f\x07\xf5\x09\x46\x44\xee\x60\x4e\x5d\x68\x5c\xb6\x17\x24\x02\x7e\x98\x89\xf1\x72\x6d\x52\x74\x44\x59\x3c\x01\x11\x31\x22\x19\xf3\x80\x5b\x84\xc5\xda\xfe\x31\x53\x4d\x1e\x9e\x22\x09\x82\x3a\xbd\xdb\x88\x52\x11\x56\x3f\x46\x5f\xe2\x78\x19\x51\x06\x74\xda\xa7\x53\x1e\xaa\xb2\x7d\xf5\x58\x9b\xc9\xd5\xea\x4c\x62\x7c\xfb\x50\x55\xe5\x52\xb4\x6b\x68\xd4\x29\xcc\x19\x30\x2a\xeb\x95\xc3\xbf\x40\x5d\x0d\xf7\xd8\xf0\x7c\xc6\x8f\xc9\x44\x06\x57\xf2\x5a\x1c\xa0\xec\x13\x2d\x8c\x18\x6d\x8c\x63\xae\xfa\x22\x0e\x87\xa9\xdd\x21\x06\x00\x6d\x84\x9d\x9b\xe5\x0b\xbc\x07\x86\x00\x46\x8c\x21\xac\xd7\x42\x1b\xcb\x9d\xcf\xe0\x05\x18\x8d\x84\xc2\xcd\xc5\xb3\xd8\xb9\xfc\x1e\xe8\x18\xeb\x10\x45\x39\xaf\xf9\xc6\x28\x31\xe0\x81\x27\x43\x3a\x25\x46\x69\x64\x19\x64\x4b\xf8\xc0\x60\xf5\xda\x51\xe5\x0e\x93\x7b\x93\x73\xd1\x34\xc6\xdd\xf3\xfa\xf4\x20\xca\x97\x6a\xf0\x34\x68\x4c\x38\xb1\xca\x4d\x1a\x7e\x36\xad\x28\x75\xc8\x78\x30\x9a\x10\x21\xa8\x47\xc5\xed\x8f\xdd\xf7\xe6\xf0\x6e\x8c\x26\x99\x8d\x66\x16\x2f\x75\xb1\x7c\x15\x45\xb9\xec\x96\xd5\xfb\x70\x93\xa1\x49\x2e\xb9\x4d\x5a\xbe\x5f\x57\x75\xd5\xbe\x9e\x87\xd7\x91\x28\x0a\x56\xc2\xe1\x1d\xea\x76\x8a\xe6\x75\x83\x52\x92\x20\x1f\x93\xae\x8b\x63\x5f\x2b\x61\x34\x65\xd4\xe8\x40\xe0\x5f\x54\xe5\xed\xe0\x60\x96\x50\xe6\xd2\xf3\xe8\x9e\x3c\x3a\x84\x09\x42\xcb\xbc\xe5\xa2\x5c\x01\xc6\xb7\xda\x13\x73\xee\xd4\x59\x5d\x0a\x6e\xb8\xd1\x22\xb3\xec\x65\x76\x71\xdd\x8b\xcb\x6e\xa3\xf9\x48\x85\x0a\xae\x34\x0f\x55\xa4\xd9\x76\x58\x46\x85\xa4\x88\xf2\x7d\xaf\x5a\xb8\xa9\x3e\x53\xb8\xef\xc6\x89\x98\x7a\xdb\x81\x78\xce\xcf\x74\x54\x19\x95\x69\x84\x8a\x92\xcd\xe9\xe0\x24\x0c\x3d\xc3\xbb\x8f\xe9\xa8\xcc\x13\x34\x45\x3b\x0b\xa2\x1d\xe3\x52\xdc\x18\xc5\x63\x66\x09\x57\x90\x04\x7f\x19\xb2\x8a\xe3\x3b\x50\x32\x32\x30\x50\x7d\xfd\x23\x7c\x6e\xc9\xd0\x16\x4d\x98\xce\x40\xe3\x44\x0e\x00\x56\x76\x47\x09\x64\xbb\x4b\x71\x9c\x5c\x02\x50\xae\x5d\xca\xc6\x81\x30\x2f\xac\x2a\x85\x38\xc7\x7d\xae\xdb\x5b\xba\x75\x3c\x99\x47\x60\x88\x6d\xc9\x7f\xad\x74\x55\xce\x04\xd3\x2c\xe2\x22\xb3\x68\xec\x4a\x9f\x54\xbb\xad\x0b\x39\xde\xd8\x19\x61\x39\x3a\x39\x68\x7b\x85\x31\x7b\x70\xdd\xd4\x93\x9e\x3b\xc6\x88\x00\xc9\x82\x80\xea\x4d\x21\xda\xc1\xee\xd0\x0c\x08\xfb\x19\x23\x32\xb5\x60\xff\xea\xd0\x6d\x17\x9d\x3b\x71\x73\xfa\xeb\xaf\xf3\x17\xd1\xbc\xae\xb6\xe3\x0b\xa0\x84\x63\x2f\x5c\xeb\xfb\x59\xdc\xe7\x4c\x67\xa8\xaa\xa8\x2d\x6f\x8b\x6d\xb0\x9a\x9f\xc7\x8c\x81\xb2\xa4\x61\x56\xda\x11\xea\xf7\x42\x81\xd7\xb4\x1b\xdf\x45\xac\xad\x86\x16\xfc\x3c\x16\x35\xdc\x87\x06\x3c\xc6\x52\xa6\x31\xb1\x5d\xa8\x2a\x28\x33\x0e\x99\xd2\x18\x4b\x63\xcb\x51\xfe\xbc\x5e\x6d\x16\xf7\xa8\x93\xba\xde\x86\x83\x49\x8a\x6b\xe9\x58\x17\x07\x51\x9f\x9f\x8e\x50\xf7\x25\x62\xc6\x52\xa1\x72\xb7\x37\x3d\x43\xdd\x54\xe5\x10\x96\xe3\xc6\x64\x29\x49\xc1\x51\xc7\x39\x41\x10\x6f\xb1\x59\x26\xad\x64\xd6\xe1\x6c\xf9\xcf\x9b\x70\x40\x59\x4e\x7a\xa1\xf5\x73\x5d\xfd\x2f\xa8\xff\x4a\xd4\x93\xb1\x0c\x32\x0c\x33\x70\x02\xe0\x1c\xa2\xfe\xd4\x39\x15\x58\x35\x0f\xdd\x06\x03\x63\xc5\x38\x4d\xac\xc8\xdd\x51\x7c\x94\x77\x6d\xdf\x31\x3f\xef\xd6\x31\x21\xb5\x2d\x88\xee\x68\xa9\x77\x88\x4c\x5a\x85\x28\x9d\xc9\x8c\x6b\x57\x65\xbd\x12\xfb\x7d\xd5\x2e\x4a\x8d\x19\xf5\xc7\xea\x79\xdc\x29\xc3\x98\x8a\x44\xac\xbd\x68\xc2\x12\xf6\xfb\xf0\x2c\x54\x1c\x3b\x58\x59\x23\x0e\xed\xed\xa9\x7d\x15\x32\xc4\x8b\x4c\x89\x88\xda\x57\x6f\x11\x83\x7f\x53\x22\x9a\x31\x65\x38\x46\x32\xe8\x64\x6d\x8a\x97\x87\xe2\x62\x5a\x69\x22\x84\x6b\x79\xfc\x01\xf0\xb6\x3f\x87\xc4\xc1\x0f\x90\xdd\x46\xd9\x8c\x76\x3f\xa6\x13\x83\x7a\xb4\xcb\xfb\xa7\xcd\x6a\xb7\xbd\x7b\x58\x85\x23\x69\xc6\xe8\xb8\x70\xdc\xfd\xde\xc4\x4f\x63\x3a\xb5\x50\x68\x17\x4f\x5c\x0a\x8b\x4f\x72\x33\xb3\x7f\xc6\xf7\x00\x44\xc4\x96\x47\xa4\x5c\x3f\xde\xce\x22\x29\xba\x95\x66\x00\x7c\x8c\xd5\x9c\x42\xe8\x1f\x47\x91\x20\x81\x96\x7e\xdd\x6d\x5f\x37\x55\x3d\xa0\x15\x60\x71\x14\x5b\xc2\xa6\xc3\xe0\xf1\x8d\x58\x84\xfc\x1b\x8e\x23\x21\x63\x4b\x64\xa3\x3d\xca\x1b\x57\xe2\x5d\x39\x4f\xfa\xe9\xbf\xa6\x2d\x5c\xbd\xb3\xc1\xcb\x2f\x8e\x6c\x95\x85\x9f\x87\x3c\x20\xc0\x06\x11\x9d\xc3\xd8\xfc\x42\x48\xc0\x7d\x9f\xd0\x1c\x53\x5f\x8b\x7b\x1f\x4e\xc5\x24\x37\x08\xc8\x57\xe2\xf8\x64\x2e\x08\x8d\x58\x4c\xb8\xc4\x70\x0b\xc5\x51\x9a\xfe\x53\x8d\xf0\x05\xbc\x97\x45\x31\x62\x44\xfb\x9b\xb8\xb3\x59\x90\x03\x8b\x09\x44\x98\x7e\xf9\x3f\xd5\xf9\x56\x1c\xe0\x1a\x0e\xd5\x7c\x80\x16\x53\x9a\xf9\x82\x81\xef\xed\x1e\x1b\xa3\x98\xaa\x04\x2b\x6e\x57\xd5\xe9\x8f\xc9\x77\x21\xc6\xa2\x56\x7d\x2a\xef\xca\xa7\x12\xae\x45\xb8\x61\x96\x49\x04\x14\x3e\xd7\x55\x65\x9e\xcc\x06\x31\x7e\xd8\x8c\xda\x8f\x30\x68\x26\x45\xd3\x40\xdd\xde\x0c\x63\xdc\xc1\x92\x8b\xe3\x34\xb7\x74\x49\xd5\x09\x75\xd1\xca\xf6\x59\x9c\x02\xc2\x9f\xc5\x31\x44\x48\x31\x8b\x84\xf9\xc3\x66\x1f\x3f\x20\x21\x96\x47\xd2\xb5\x5b\x56\x1f\xd3\xc8\x22\x4e\x52\x42\x2d\x9f\x82\x15\xcf\x9c\x64\x76\xe3\x94\x52\xcc\x5f\xbe\x56\x5d\x64\x7f\xfe\x05\xee\x90\xc5\xa9\x01\x99\xf7\xfe\x34\xd4\xed\xd5\x84\x10\x9d\xc5\x19\x89\x30\xa8\xfc\x2a\xea\x83\x18\x5d\x6b\xa6\xa8\xed\xe5\x76\x37\x32\xa8\x63\x0e\x27\xba\xab\x72\xb0\x38\xd3\xe0\xba\xaf\x5c\xad\xfb\x16\xb9\xcf\xf6\x4b\xed\xaa\x21\x0e\x50\xed\x86\xe7\x44\xa2\xe4\x96\x3c\x9d\x6d\xe3\xe1\xfc\xfc\xce\x63\x45\xfa\x9e\xaf\xcd\xb7\xe7\xe7\xfb\x3f\x77\x0f\x8b\xbb\x47\xdc\xeb\x06\xed\x5f\x2c\xce\x65\x1c\x8d\x48\x3a\x6d\xb9\xc9\x1f\x05\xe0\x96\x81\xa6\xae\x41\xb5\x4e\x8b\x76\x10\xd4\xc4\xdc\xe4\xb8\xe7\x3f\x54\xb2\xd8\xc3\x6d\x35\x7a\x1a\x82\xe6\x1e\xa1\xf4\x5c\xbb\x22\xe3\x7c\xbf\x17\x8b\x45\x4c\x50\x8d\xb3\x41\xb9\x10\xa7\x41\xd1\x0c\xe3\xcd\xfc\x1f\x83\x47\xf2\xeb\x3f\xfe\x9c\x4a\x63\xfc\x6d\x6c\xf9\xb2\xec\xb6\x89\xe9\xe2\x90\xc4\xc2\xbc\x0f\x45\x79\x73\x72\x1a\x58\x03\x0d\xfe\x6e\x80\x00\x13\xba\x39\xbf\x95\x4d\xb5\xd7\x1b\x61\xe0\x5e\xd4\x2f\xe1\x41\x49\x1a\xa3\xb3\x7e\x75\xaa\xeb\xa2\xad\x7c\xb4\x70\xa1\xe0\x30\xb9\x69\x99\x2a\x5c\x64\x57\x57\xd7\xbf\x14\xbe\x9f\x7e\x2d\x83\x3e\xf7\x38\xa0\xac\xf0\x8e\x73\x2c\x65\x86\x50\xb8\x55\xa9\x9b\x45\x08\x88\x27\x27\x81\x44\x06\xe5\x4d\xdb\xa8\xe3\xf8\xf6\x27\xb3\x5d\x29\x32\x58\x7f\xd7\xe2\xa2\x17\x69\x14\x5f\xc6\x3a\x07\x2c\x2f\x63\x1d\x09\xee\xda\xff\x19\x96\x91\x26\xa9\xf0\xf1\x15\x69\x4d\x4c\xe4\xd2\x66\x3f\x2e\xf8\x22\x26\x83\x21\x96\x3e\x43\x60\x29\xb2\xbe\x14\x0d\x32\x2d\x4e\x86\xe9\x88\xbb\x6c\xc6\xa6\x2a\xf6\x5b\x38\x1c\x57\x3f\x15\x1c\x87\x05\x5e\x3b\x34\x89\xd2\x14\x91\xfb\x75\x53\xbf\x6f\xab\xcd\x94\x0c\x99\x25\x84\x98\xdc\x45\x37\x98\xb4\xbc\x82\x76\x4c\xc6\x32\x7f\x5f\x09\x49\x65\xe6\x2c\x74\xe7\x08\x5d\xb6\xe1\xb3\x84\x26\xc2\xeb\x71\x3f\x40\x2b\xb4\x68\xc5\x7c\x28\x96\xd0\xd4\x52\x55\x60\x95\xa3\x3b\xcd\x43\x08\x59\x13\x9a\x6b\x3e\xe8\x54\x82\x76\x81\xd4\x89\x1e\x51\x6c\x51\x56\xce\x3a\xcf\xfc\x9d\xbf\x7a\x2a\x72\x44\x9f\x62\x7d\xee\xc9\x6c\x3f\x8a\x16\xfb\xa6\x26\x0f\x87\x25\x71\xe2\x38\x1c\x66\xa1\x54\x2c\x61\x82\x60\x37\xb9\x29\xca\xa2\x79\x9d\x7c\x3d\x89\x35\xf6\x43\x3c\x16\xb0\x79\x2d\xd4\xab\x18\x59\x92\x24\xe1\x11\x56\x8c\x9b\xce\x5f\x1e\xf0\x79\xf8\xc3\x86\x30\xde\x57\x86\x10\x93\xd9\x05\x04\x93\xc5\x9e\xa4\x09\xc7\xac\xc0\x9f\x8b\xc7\x5b\x7f\xea\x6e\x7b\x8a\x9c\x05\xbc\x1e\xf1\x66\x4e\xbe\x2b\x28\x26\x99\x85\xd6\x9b\xd5\x7a\xf1\xfc\xe5\xee\x61\x72\x15\xa9\xb0\xb5\x22\xdb\x8c\xe6\xbc\x2d\xdf\xc9\x3e\x3e\x59\x26\x04\x42\x0f\x6a\x51\x34\x40\x4b\xbd\x38\x1e\xc1\x8b\x53\xb1\x24\x33\xb6\x7f\xca\x72\xd2\x3c\x17\x3f\x61\x7f\x0f\xa6\x9d\x9e\xc3\x18\x8c\x61\x9a\x0f\x80\x23\x4e\x48\x4f\x76\x36\x98\x58\x5c\x46\x08\x11\xf9\x27\x94\xc5\x68\xab\x4a\xb8\x04\xec\x4e\xea\x51\x7f\x2b\xe7\x4d\x4f\x7e\x87\x9b\x9c\xf6\x8d\x08\xab\x2e\xda\x9a\xac\xb2\x44\x68\xc1\x1c\xe3\xca\x40\x21\x6c\xde\x61\x49\x24\xd7\xb9\x95\x0d\xd2\xb0\x98\x6c\xad\x89\x54\x26\x77\x62\x1c\xcb\xd5\x36\x76\x19\x81\xcf\x6d\xfd\x38\xd7\x36\x93\x93\x48\x54\xc6\xd0\x16\xb6\xaf\xb0\x84\xe2\x53\x1e\x7d\x96\x28\x2e\xa2\xa1\xcc\x89\xe3\x81\x99\x35\x3f\x89\x32\x9c\xb8\xe6\x1f\xa7\x91\xf7\x89\x2b\x9b\xe8\x88\x11\xcb\x01\xb4\xdf\x43\x3d\x4d\x4e\x8e\xef\x5e\xf3\x08\x89\x29\x1e\x9e\xbf\x8e\xde\x15\x50\xae\xb3\xa9\xbf\x3d\xf4\x0c\x12\x88\x73\x34\x5e\xcf\xf7\x57\xe3\x6f\xa6\x76\x7b\xbb\x7b\x7a\xbc\x5b\xa0\x3f\x30\x38\x62\x73\xe7\x8d\x6d\x32\xda\x8a\x1e\x11\xee\x86\x98\x58\x20\x9a\x0a\x7f\xf6\x57\x1b\x59\x62\xa4\xb4\x94\x07\x08\xd4\xf9\xa5\x39\x4c\xa3\x58\x62\xfc\x7b\x86\x66\xe2\xa8\xa5\x24\xce\x7d\x77\x23\x16\xf9\x50\x7d\xbf\xad\xea\xd5\xf6\x4b\x18\xe2\x18\xa4\x1f\xe6\x20\x07\x29\x11\x96\xe3\xaa\x81\x12\xb5\x89\x7f\x15\x64\xa4\x34\xd5\x91\x4b\x68\x9e\xbb\xc8\x44\x07\xef\x37\x65\x04\xa2\x28\xe4\xce\x6d\x3f\x87\x55\x82\xf4\x03\x32\x45\x5d\x8a\x61\x24\x50\xe1\x0e\x27\x91\x41\x2f\xd2\x29\x9d\xd4\xcd\xf4\xb8\x88\xb0\x6f\xf7\x80\x94\x1d\xe3\xc0\x2c\x4d\x8d\x25\x2f\x14\xfb\xfd\xa6\xd0\xd0\x3c\xef\x41\xbf\x84\x32\x4d\x18\x24\x85\xf4\xdb\xb7\xcf\x30\xfc\x37\x24\x34\xee\x3c\x59\x64\x35\xd3\xaf\x8a\x16\x79\x06\xf7\xc2\x69\xc0\xf8\x1f\xca\x08\xc1\x56\x05\xef\xd3\x6c\x4e\x88\x05\x34\xa7\x4f\x76\xe6\x34\x13\x16\xe0\xf7\xf8\x7d\xdb\xf7\xfe\xb0\x94\x27\x24\x25\xa1\x18\x32\x95\xca\x61\x29\x17\x19\x66\x91\x97\xcb\xd6\xab\x68\x4f\x5e\xae\x20\x06\xdb\x5a\x16\xf7\x5f\x17\xcb\xa7\x3b\x3f\x93\x53\xd1\xad\x5d\x7c\x14\x75\xf1\xff\x38\xfb\xb2\xee\x46\x71\xf4\xef\xaf\xd3\x17\x73\x01\x48\x02\x74\xe9\x38\x4e\x95\xa7\x93\x38\x13\xbb\x96\xfe\xcf\x99\xe3\xa3\xe5\x91\xc3\xc4\x06\x0f\x4b\x52\x9e\x4f\xff\x1e\x1e\x49\x6c\x26\xe9\x9e\xf7\xa6\xab\x4f\x90\x31\x06\x21\x3d\xcb\x6f\x79\x85\xb2\xba\x11\x15\x4c\x67\x96\x48\x2d\x68\xeb\xe9\xa5\x80\x3c\xfb\xd5\xfd\x19\x22\x7c\x09\x54\x71\x3a\xd9\x6a\x05\xc6\xbf\x7d\x3f\x2d\x16\x46\xe0\xc6\xf4\x22\xaa\xa9\x86\x21\x89\x25\x8f\xd1\x44\x49\x59\x4e\xf8\x11\xca\x3b\x91\x1d\xfb\x59\x22\x39\xd8\xe6\xce\xa0\x33\xf5\x84\xfc\x9f\x6a\x75\x14\xe7\x6a\x30\x12\xb4\x27\x87\xb5\xf9\x5e\xbf\x79\x4c\xf6\xd9\x58\x1a\xdb\x30\xf4\xe2\xc7\x7d\xa0\xb4\x7c\x69\x72\x5f\x73\x8b\x35\xb7\x50\x2c\xb7\x23\xee\x95\x38\x1e\xa5\x70\x19\x43\xea\x07\x49\xe5\x05\xd5\x7e\x64\x39\xf8\x52\xd7\x87\x68\xea\xe1\x34\x0a\xc7\x1d\x9b\x18\x02\x83\x5b\xf0\x6a\xfd\xe4\x25\x82\xfc\x11\x2e\x50\x09\x41\x62\xf8\x3c\x48\xfd\x62\xe0\x32\xb2\x7d\xee\xbc\x16\xc7\xc5\xa1\x04\xac\x03\x77\x87\x4d\x84\x4c\x72\xeb\xf2\xfd\x24\x8e\x8f\x50\xbf\x17\xe5\xeb\xb5\xf9\xf4\x47\x15\x93\xff\xcf\x7f\xdd\xf7\x9b\x00\x90\x25\x0a\xae\x31\xe9\x34\xd4\xfc\xe5\x19\xa6\xec\xfe\x5b\xa3\xc1\xe1\xb8\x1e\x33\x78\xc3\x4c\xcc\xc1\x2b\x34\xd6\x2f\xeb\x1c\x7b\x64\xee\x24\x49\x10\x1a\x24\x82\xec\x0a\xe7\xb3\xd0\x1d\x48\x42\xec\xb6\xec\x6d\x34\x81\x45\xd3\xbb\xb2\x38\xdd\x8b\x6a\xd2\xdd\x99\xbd\xf8\x24\x48\x69\xea\x74\x11\xd6\xb9\x29\x16\xb2\x3d\xc9\x79\x82\x49\x27\x49\xc8\xa9\x61\x83\x5e\x84\xf7\x88\xb1\x8b\x0d\x46\x1d\x7e\xa4\x66\x2c\xf4\xaa\x6a\xf8\xcd\xbb\x62\x29\xce\xe7\x4e\x71\x00\x26\x51\x59\x12\x81\xb5\x9e\xce\xaa\x65\x79\xd1\xe5\xf7\x0c\xde\x67\x9b\x35\x09\x89\x62\x6c\x1b\xdc\x89\xaa\x7e\x06\x71\xcc\xaa\x3a\x53\x4f\x97\x52\x9c\x3c\xaf\x96\x24\x84\x05\x89\xec\xa4\xc7\x8b\xf7\x76\x3b\x1d\x04\x3a\x09\x89\x03\xfc\x32\x30\xef\xfe\x23\x94\x0b\x6f\x25\x50\xee\xd5\x78\x41\x48\x98\xe4\xf8\xc2\xa1\x9e\xca\xb7\x6a\x68\x96\xf9\xcf\xb4\x07\x34\x79\x14\x53\x92\x30\x82\xd6\xf1\x2f\xa2\xda\x97\x80\xdc\x0b\x7f\xaa\x44\x2a\x44\xb6\x1c\xb1\x9b\x8e\x20\x15\x1f\x6b\xfb\x11\x1a\xf4\x00\x10\xf8\x98\x29\xf8\xd2\xf8\x89\x94\xa4\x86\x62\x21\xe5\x71\xb3\x79\xf6\x7f\xe3\xdc\x86\x80\x95\xd5\x3d\xb0\x6f\xe5\x16\x44\xe5\x80\xf5\xb8\xd8\x4c\x9e\x25\x97\x10\x75\xd2\x4a\x5d\xb1\x2e\x11\x5c\x4a\xbb\x97\xb5\x2f\xac\xea\xea\x8f\xdd\x1c\x14\xc6\x0c\x6c\x7b\x9d\xf8\x7e\x33\x84\x78\xba\x81\x92\x50\xab\xb0\xda\x6e\x12\xa8\x59\x33\x57\x98\x4f\x64\x2a\xb8\x23\xb7\x1d\x8b\xb9\xd4\x2f\x9d\x23\xda\x90\x44\x69\x47\xf9\x14\x47\xc8\x2d\x14\x7d\x3a\xc7\xe7\x69\x3b\xe3\xdb\xa0\x13\x86\x00\x87\xea\x7c\x7d\x02\x37\xc4\x38\x61\x2b\x07\xf3\xdc\x98\x1f\xd6\xed\x78\x2c\x6f\x65\x07\xa7\x41\x62\x50\x9d\xb2\x0d\x92\x6c\xf8\x36\xda\xb8\xd2\x00\x02\x62\x4d\x5b\xcb\x57\xa8\x6f\xc1\x88\xe6\x58\xdf\x01\xdc\x7b\x38\x36\x49\xc3\x50\x05\x93\xf4\xae\xdd\xa4\xc6\xe7\x09\x19\x97\x9e\x63\xfb\x24\xba\x70\x20\x0d\x53\x66\x95\x37\x64\x73\xf9\x99\x5d\xf7\xf5\x46\xcf\x28\x0d\xa5\x48\xbc\x0b\x40\x51\xd4\x23\xe0\x65\xff\xba\xa4\xa1\x8a\x13\x2f\xd8\x9b\xd7\x23\xad\x75\x92\x12\x63\x0d\xd4\xd1\x21\xc8\xff\x91\x06\x09\xa2\xb5\xf7\x48\x31\x9e\xfa\x63\xf8\x41\xc2\xe6\x24\x98\xb8\x9c\x8b\xb3\xe8\x3e\xad\xad\x17\xda\x8b\x78\x03\xe7\xb0\x5f\x82\xc9\x7e\x21\x0f\xf9\xff\xa0\x2c\xe6\xd3\xdd\x94\x45\x1c\xb5\x20\x5d\x00\x66\xf5\xd2\xba\x2a\xe1\x4d\x51\xbc\x76\x02\x23\x13\x21\xfb\x3f\x57\xe7\xf8\xdf\xb6\x83\x94\x11\xdb\xc6\xda\x21\x91\xcb\xdd\xb1\xb9\x19\x98\x32\x23\x30\x20\x91\xef\x5d\x6e\x9e\xc6\x01\x47\x26\x47\x93\xbf\x88\x63\x7d\xf7\xb3\xfb\x7b\x68\x45\x4d\x57\xb9\x2a\x2f\xe7\xc9\xf2\x9c\xc6\xa9\x35\x71\x6f\xf2\x76\x71\xf9\x72\x2c\xe4\x48\x1e\x81\xa4\x49\xa4\x99\x13\x92\xb9\x17\xb9\x9e\x58\xec\xf8\x41\x3c\x49\x75\x27\xdc\x73\x84\x79\x85\x00\x92\x26\x8a\x7a\xdf\x26\xc4\xaf\x4f\xa2\xe7\xf1\xa3\x4e\xa9\x22\xbd\xf4\x8a\xeb\xd4\x8d\x4b\x2a\x69\x9a\x30\x70\x01\xc6\x2d\x88\xe3\xd5\xd4\x9d\x0f\x2f\xe6\x1a\x09\x69\x0a\xd6\xb5\x1a\xe5\x39\x70\xd5\x41\x05\x29\x71\xac\xac\x2a\xd8\xf8\xe2\x78\x60\x39\x0e\xb7\xa2\x58\x8a\x2a\xcb\x8b\xcf\xcb\x6b\x93\x0f\x33\x0b\x45\xed\x20\x15\x1f\x91\x95\x48\x2a\x14\xc3\x66\xd1\x0f\x71\xb9\x99\x04\xce\xa9\xd4\x1c\xcb\x59\xb9\xf3\x08\x1a\x76\x50\x52\x09\x80\x55\xf1\xa7\xa3\x50\x80\x7b\xd9\x5f\x8c\x65\xdc\xe7\x15\x89\x10\xde\xe9\xbc\xd2\x8f\xc6\x33\xaf\xfc\x17\x28\x6a\x39\x80\xf6\xf1\xb4\x91\xc3\xe8\xdd\xb9\xcd\x2a\x61\x65\xd6\x3f\xd8\xbd\x53\x25\x05\x8a\x35\x38\x5b\x38\x8b\xe5\x73\xe8\xba\x32\x2b\x30\x12\x9a\xbf\x36\x1d\x98\x81\x0d\xd5\xf6\x7c\xcc\xa6\xd3\x1a\x98\xc0\x6e\xcb\xf0\x6a\x3a\x09\x01\x92\x82\xe4\xb8\xe2\x01\x1a\x44\x8e\x98\xad\xe3\xf3\x18\x22\xe3\xd4\xbb\xb6\x23\x1d\xb8\x97\x2f\x24\xa9\x01\x6b\x83\x87\xab\xee\x49\x5a\x59\xb8\x59\x21\x25\xc2\x83\x20\xf2\x3a\x66\x6d\x84\x85\x12\x09\x78\xf9\x3e\x00\xe1\x01\xa4\x18\x51\x6b\x7b\xad\x1e\x3e\x33\x49\x34\x78\x18\x84\x78\xdb\x9e\x37\xf7\xab\xfd\xe2\xf6\xa1\x4b\x53\x78\x28\x78\x12\x8c\x9e\xc8\xdc\x4b\x36\xfa\x81\x3c\x54\x36\xdb\xed\x42\xde\xe9\xd7\x45\x89\xe5\xb0\x94\x90\x9d\x50\x39\xbd\x3b\xa0\x98\xf7\xab\x7c\x6c\x4e\xd6\x74\x14\x81\x30\xfe\xf6\x70\x42\x42\x4c\xb6\x1f\xfe\xb8\x9f\x07\x98\xfa\x71\x2a\x4d\xc2\xa1\x5f\xee\x7c\x33\xba\x1b\xad\xc1\x76\x9a\x8b\x23\xdc\x67\x39\xfc\x28\x8b\x2e\x54\xe2\xc4\xc4\x51\xdf\x5d\xb9\x85\x53\x53\xb6\xe7\xba\x03\xb8\x56\xda\x26\x9c\x12\x9e\x78\x35\x82\x2f\xcb\x76\x2b\xab\xae\x46\x08\x49\x7d\x94\x5b\x2f\xca\x79\x7a\x47\x3b\x4e\x61\xcd\xc9\x8b\xb9\xf8\xac\xa9\x6b\x38\x73\x1a\x83\xb0\x1e\x44\x79\x23\x8e\xc7\xcb\x2a\xd7\xe3\x5d\x91\x53\x61\x51\xbc\xd6\x91\xd4\xe1\x5b\x06\x56\x7c\x84\xb3\x20\xb2\x60\x92\xf5\xcd\x7a\xb7\x5b\x2d\xbf\x76\x07\x48\x1a\xb9\x87\xb1\x7b\xc9\xc6\xc6\xf7\x84\x33\x00\x1f\x1d\xfc\xa3\xc9\xd4\xeb\x4d\x73\x79\x12\xf5\xcb\x6f\x63\xce\x09\xe1\x31\x55\x98\xfa\x15\x3e\x4b\xab\x56\xf5\xcb\x50\xc7\x99\xf0\x04\x38\xf4\xf2\x50\xe7\xa6\x06\x3b\x73\xd0\xff\xb1\xec\x46\x99\x14\x53\x71\x04\x2c\xda\xf9\xb7\x3f\xf6\xa1\x3e\x4f\x03\x8d\xbb\x38\xae\xb0\x90\x7b\x8b\xa2\xf9\xd5\xba\x27\x67\x8c\x1f\x4d\x9a\x06\x28\x70\x68\x57\x81\x87\x2c\xff\x7b\x73\x9a\x20\x67\x38\x27\x0c\x5f\x96\xdf\xff\x58\xee\xbf\x6d\x6f\xf7\xf7\x0f\xbe\x31\xc5\x85\xb0\x32\x43\xfb\xf6\x9e\xb9\x65\xe2\x0e\x60\x1e\xab\x3a\x79\xda\x32\x50\xf8\x1c\xf0\xe1\x84\x1e\x8e\xc9\x65\xa8\xe9\xb4\x6d\x3c\x47\x7d\x23\x5c\x26\xe0\x3d\xb3\x6f\x9e\x66\x73\x16\x2e\xa5\x41\x1d\xd7\x87\xc5\xcf\xfd\xfa\xf1\xfb\x6a\xbb\xeb\x82\x77\xae\x92\xd4\x8b\x50\xb8\x0f\x6f\xcc\x40\x3a\x77\x7c\x22\xc5\x05\x42\xc5\xf0\x05\xf8\xbd\x33\x13\x21\x5c\xc9\xd0\x3b\x51\xa0\x79\xd7\x7a\x82\xa2\xe6\x4a\x41\xa8\x86\xbd\xbb\xad\x38\x82\xb3\x49\x9c\xdb\x3d\xa6\x0c\x11\xae\x20\x45\xec\x94\x5b\xe2\x1f\xb2\x5f\xf0\x21\x6c\xac\xfb\x88\x55\xa3\x97\x90\xab\x97\x29\x15\xe1\x9a\x96\xc3\x75\xea\x2c\x57\x06\xaf\xcb\x3e\xde\xdf\x82\x82\x5e\xd1\x9c\x70\x0d\x31\x78\x6c\x61\x47\x9f\xef\x77\x26\x37\x0a\x68\x8c\x15\xda\xfb\xe2\xb0\x56\x85\x37\xfb\xeb\x56\x68\x90\x24\xf0\x37\x6c\x98\xc4\x0c\x4a\x1e\x1c\x24\x44\x2e\x3c\x6e\xce\x73\xc7\x55\x88\x38\x31\x4f\xdd\x02\x6b\xb6\x30\x3f\xcf\x0c\xb5\xb6\xfa\xe6\xd7\xf9\xa1\xb9\x8e\x6e\x26\x83\x19\x41\x52\xd8\x56\x18\xf8\x92\x99\x2b\x6c\xcf\x70\xcd\x15\x01\x4b\x94\x25\x58\x2d\xdb\xc0\xf7\xd0\x94\xdd\xcf\x14\x01\x4b\xb1\xa0\xbd\x68\xea\xe2\x4e\x94\xe0\x55\x60\x3a\x84\x92\x08\x74\x80\xb5\xc1\x67\x27\x2f\x34\x50\x64\x9d\x4b\xc6\xfa\xb4\x40\x44\x3a\x40\x92\x53\x1b\xb0\x89\x5a\x4c\x1b\x8b\x82\x04\xd6\x3c\x63\xa1\xea\x62\xa0\x34\x4c\x04\xe1\x71\xea\xc3\x33\xf7\xbe\xcc\x06\xf4\x82\x85\x31\xee\xed\x6f\x19\xbc\x6f\x9b\x33\x8c\x80\x25\x82\xc5\xa0\x2c\xcc\x02\x35\x54\x1d\xcd\xe4\xf3\x3b\x2b\x58\x62\xe1\xff\xd8\x03\x99\x77\xfc\xed\x46\x4a\x44\x15\x55\x2f\xc5\xfb\xb3\xfe\x51\xe4\x8f\x13\x01\x19\x22\x98\x56\x98\x2d\xaf\xfe\xf1\x6d\xbd\x7b\x5e\xdc\xae\xfc\x5b\x2d\xe2\x40\x62\x25\xd0\x0b\x94\x7c\x88\xd3\x99\xac\x8c\xe3\x75\x51\xc4\x61\xc8\xdc\xe2\xd0\xde\x62\x29\x2a\xb4\x50\x3d\x16\x42\x7f\x2b\x8f\xa3\x94\x50\xc4\x9c\xa3\x7a\xff\x13\x3c\x89\x5b\xe8\x2e\x44\x82\x15\x8f\x29\xf2\xa2\xfe\xf9\xf3\xe7\xad\x38\x9f\x87\x91\xa7\x88\x55\x84\x6d\x2e\x09\x23\xfb\x44\x22\x92\x40\x4b\xe1\xe9\xd1\x42\x63\x1b\x6f\xfc\x78\x12\x62\x5b\xe6\xa7\x42\x67\xe6\x82\xca\x47\x4b\x71\xae\xae\x26\x42\xca\x08\x52\x92\xdd\x7b\x62\x8b\x9a\x96\xfd\x54\x1c\x8f\xa0\xfa\xd7\x52\xa4\xb1\xa5\xa6\x9c\xac\x88\xcc\x4d\xd6\x1f\x49\x42\x7c\xeb\x9f\x57\xab\xfb\xd1\x0f\xe0\x61\x8a\xd9\xe9\x29\x6b\x5f\xc1\xd3\x79\xa8\x71\x34\x35\xde\x9f\xcf\x29\xfc\x89\x38\xc1\x76\xd2\xdf\x95\xa8\x5e\xbe\x9d\x0f\xa5\xd0\xd0\x61\x32\xc6\x0b\xb1\x10\x51\x64\xd9\xd4\x3e\xbd\xbc\x5f\xcc\x79\xc1\x13\x21\x52\xab\x11\xd3\x26\xea\x36\x84\x2b\x2f\xed\xaa\xe5\xaf\x5e\x81\xb0\x86\xde\x72\x46\xd8\x8b\x08\x88\xd2\x90\xda\x55\xac\x13\xb5\xf5\x54\x20\x3f\xc4\x58\xc9\xc9\xb3\x68\x2a\xf8\x96\xe3\x3f\x9d\x82\x01\x11\x86\x6a\xbc\xd2\xcf\xdf\x12\x3b\x58\x06\xda\x96\x1f\x6d\x2b\x63\x24\xe2\xe0\x46\x84\x4c\x23\x2a\xfe\x21\x1b\xcc\x15\x19\x72\x6b\xe1\xa6\xb3\xea\x98\xbd\xc2\xbe\x0d\x3b\x5f\x87\x65\x32\x37\x2e\x22\xd4\xbb\xa1\x2e\xea\xba\xf0\x06\x93\x37\x70\xd7\xbe\x8e\xdd\xab\x2d\x23\x1a\x6b\x8b\x50\xc6\xa7\xb0\x7a\xcb\x8e\x0f\x45\xd9\x95\x53\x65\xc4\x2c\xd2\x14\x49\x86\xeb\xbc\x06\x34\xb4\x72\x07\x49\x10\x41\x62\xfb\x29\xc7\xcb\x5d\x51\xf6\xf1\xfc\xe8\x85\x91\x24\x0d\xb0\x64\x6b\xad\xe5\xbf\x14\xc5\xb5\x62\xc5\xec\xbf\xd3\xad\x51\x12\x50\xca\x19\x48\x3d\xef\xfa\x68\xc1\x4f\x5d\x49\x25\x60\xf9\x70\x23\x6b\xc8\xa1\xdc\x5b\xf5\x6c\x75\xd5\xf5\x96\x8c\x04\xcc\x6d\x38\x1d\x16\x7d\x08\x5a\x9b\x0e\x8f\xb9\x1f\xee\x1d\xc0\x96\xae\x74\xff\x45\x54\xd6\x49\x78\x7c\xa5\x2c\x0d\x90\xa0\xf3\x0c\x67\x10\xd6\xdb\xf5\x34\x46\x50\x49\xa6\x02\xcc\x9d\xad\xe5\xd1\xb6\x38\x8e\x3c\x3b\x47\x6f\x8c\x64\x5a\x11\x4b\x52\x07\x85\x94\x78\x7f\x92\x98\xa6\xb1\x03\xf3\xdc\x83\xa8\xd0\x27\x64\x72\x29\x71\x1c\x23\xc5\xf6\xec\x5a\x45\xbb\xb2\x38\xbf\x5c\xa6\x83\x84\x42\x7f\x03\x0d\xa6\x0d\x2d\x1d\xf6\xfb\xe6\xb2\x6d\x64\x7d\x39\xc3\x4c\xb7\x5c\xc6\x46\x62\xf7\xff\x61\xf3\x7d\xbd\x5a\x3e\xaf\x6e\xd7\xbb\xad\xbf\xac\x84\x25\x71\xdf\x9d\xfe\x6d\xb6\x28\x26\x13\xa9\xd0\xc0\xe4\x5c\xc2\x54\x42\xa3\x3d\x68\x30\x87\x30\x16\xfe\x33\x0e\xce\x65\x02\x56\x7b\x79\xbb\x5c\x7d\xb6\x63\x4b\xc1\x19\x06\x3a\xf5\x4b\x59\xbc\x57\x3f\x5e\x20\x77\x2c\xec\x2c\x3f\xac\xcd\x63\x51\x23\xe4\xb4\xca\x7c\x2a\x24\x85\x8a\xc1\xb6\xc1\x9d\x44\x64\xc7\x7c\x1a\x02\xb0\xa5\x94\x11\x46\x02\x32\x24\xbb\x02\xe5\x14\x5c\x6d\x99\xb8\x01\x2a\xe5\x98\x4b\x7f\x81\xfa\x4b\xe3\x3b\x67\x8f\x85\xff\xbc\xe2\x42\x39\x0e\xd6\xb2\xc0\x04\xf1\x83\x5a\xea\x67\x3f\x4e\x89\xd4\x6a\xf3\x23\xa6\x77\x4e\xd3\x6b\xf2\xfa\x28\xd0\x18\x66\x75\x62\x02\xd7\xf2\xae\x44\x6a\x66\x2b\x0c\x08\x92\x6e\xb3\xbb\xa7\xb2\x38\x15\x23\x6f\x0f\x3f\x32\xb6\x95\xed\x1c\xde\x6d\x56\x7e\xc5\x7e\xf5\x03\x93\x24\x24\xde\x99\xe3\xbc\xa8\x3b\x5e\xe1\xe4\x9b\xa5\x46\xad\x3a\xd0\x59\xfd\xa7\x56\x42\x9f\xee\x30\x52\xeb\x08\x7b\x17\x59\xf5\x50\xbc\x65\xf9\x61\x95\x0f\x2a\x19\xd2\x04\x0a\xdb\xf2\x0b\xaf\xb9\x49\xa4\x81\x24\x16\xbd\x51\x27\x36\x88\xc5\x07\xcc\x7f\x15\x24\x21\x62\xdc\xdf\xa6\xb8\xa1\xd1\x45\xa8\x90\x28\x04\x84\x7d\x59\x6e\x7e\x2e\x9e\xee\x3f\x4a\xd7\xc6\xea\xf6\x44\x85\x29\xf1\x76\x83\x16\x7d\x58\xcd\x49\x51\x12\x15\xaa\x14\x99\x4b\x52\xd4\x73\x41\xbf\x1b\x45\x88\x42\x04\x50\x76\x76\x72\x50\x44\xd1\x80\x21\x63\xfb\xfb\x7a\xb7\xea\xfe\x16\x6a\x14\xb0\xba\xcb\x72\x37\x23\xdb\x00\x75\x93\xaf\xf5\xb6\x6e\xf4\x54\x1c\x96\x28\x16\x53\xa1\xbd\x3d\xce\xff\xdd\xfb\x04\x51\xb1\x38\xb1\x4c\x5f\x2c\x6a\x7e\xb7\xcc\x94\xa5\xc8\x75\xd6\x4e\x90\x9b\x8b\x35\x77\xfe\xb4\x49\xa6\x18\x08\x44\xbe\xaf\x97\x9b\xfd\xd3\xd7\xc5\x76\x45\xf6\x4f\xab\xe7\xf5\xe6\xd6\x7f\x49\x1c\xc5\x89\xdd\x1a\xc5\x29\x1b\xae\xa9\x2a\x66\x04\x5f\x89\x81\x03\xdf\xa8\x41\xaf\x62\x96\x20\xf2\xa2\x6a\x4e\xeb\xe5\x06\xaf\x86\x7e\xdb\xf6\x67\x4e\x09\xd6\x49\xee\x37\x5f\xf6\xb6\x69\x3c\xe2\x1b\x8e\xaf\x33\x16\xb1\x8e\x3d\xd8\xad\xce\xa1\x1a\x91\x34\x54\x12\x53\xe3\xb1\x57\xd9\x2f\x38\xce\x62\x43\xe7\xfb\x05\x2a\x49\x03\x9e\x78\x1c\x81\xdf\x98\xfa\xd5\x51\x25\x42\x63\xdd\xfa\xef\xd9\x49\x0c\xe4\x81\x88\x4a\x54\xe4\x3d\x9e\xb7\xcd\xf9\x3c\x70\x97\xee\x47\x08\x54\xd8\x5a\x1c\x8f\x59\xde\x03\x87\x55\xaa\x35\x0a\x0b\x3d\xa1\x2d\x4d\xf7\x57\xe0\xc8\xc6\xda\x57\x2f\xa2\x84\xdb\xac\xc2\xb5\x70\x2c\xb1\x33\x9e\x96\x5c\xe8\xd0\xaa\xa0\xdc\x2c\xee\x17\x8f\xcb\x6e\x8a\x71\x65\x7d\xf9\x0f\xde\xd6\x78\x32\xa5\x04\x00\x42\x8e\x95\x73\xa6\xdc\x15\x63\x2f\x8a\x29\x20\x6e\x00\x67\x56\x2a\xd5\x36\xe9\x3e\x8a\xec\xd4\x9b\x12\x6c\xe1\x0d\x4a\x71\x74\x25\xa3\x6a\x51\x8d\xe5\x53\x06\x8a\x87\x7d\x8a\x3c\xf9\x39\x0a\x42\xed\xb8\x6d\x9b\xa3\xf6\x85\x3e\x4c\xc3\xc6\x03\x75\x6c\xb1\xe1\x23\x86\x66\x3b\x1d\xc6\x4f\x56\x4b\x9e\xd8\x20\xb2\xb4\xca\xc0\xbb\xc2\xe6\x5a\xe3\x9b\xa1\x21\x14\xbd\xab\x8e\xb7\x65\xf8\x60\x22\x6a\xb0\xc2\x87\x5e\x6c\x78\x91\xeb\xe5\x0b\xa8\xd7\xb5\x71\xa6\x9d\xbb\x02\x3d\x8c\x7b\x7c\xdf\xf4\x04\x26\x46\xad\xb9\xae\x66\x61\xa1\xf3\xd7\x6e\x4b\x2e\x21\x57\x90\x84\xda\xf9\x25\x2e\x8b\xff\x5e\x7b\x6c\x0e\x5d\x0d\xba\x8f\x24\x98\xc3\x3b\xbe\xd1\x67\x05\x56\x05\x22\xf1\x6d\x72\x7f\xc7\xb7\x50\xbe\x41\x89\x40\x18\x54\xda\xb8\xcf\xaa\x1a\x7d\x59\xe6\x7a\x3d\x0a\x94\xa2\xda\x77\xbc\x9c\x3a\xc4\xb2\xc8\xf5\x0c\x02\x52\x81\x76\x8c\x8b\xea\x3c\x7c\x7f\x75\xe8\xea\x6d\xf8\x78\x3c\x42\x6c\xce\x2a\x9b\xe8\x30\x4d\xb1\xd9\x78\x46\xa7\xe8\xfb\x8f\x5c\x83\x88\x0e\x39\x47\x56\x89\x85\xdb\x2c\xcb\xa2\x39\x67\xd3\x02\xab\x8e\x42\xcb\x18\x42\x86\xca\xbe\x84\xde\x25\x96\x68\x92\x08\xe2\x58\xbd\x5b\x71\x84\x2b\xda\x5b\x9b\x5a\x58\x94\x79\xf1\xfc\x99\x36\xdd\xf8\x1b\x89\xa6\x5e\x66\xeb\x8b\xa8\xa7\x9e\x3b\x6e\x10\x25\x60\x44\x07\xb9\xbe\x2f\x44\x3e\xa8\xe7\xf4\x17\x40\x29\xa4\x0e\x58\x81\x2b\xde\x72\xce\xb2\x6b\xbc\xdc\x69\x46\x2d\xac\xa2\x82\xfa\x69\x39\xff\xed\x8c\x51\x2b\x52\xdc\x4b\x80\xb6\xa1\xe1\x27\x8e\x60\x44\xc7\x82\x27\xcc\xa5\x84\x3b\x8c\x00\xfd\x36\xf9\x58\xd4\x36\x24\xe8\x6e\x6c\x12\x28\xa2\x3c\x2a\x3e\x7b\x83\x23\x1c\xbc\xa7\xe5\xe4\x4a\x92\xc4\xf0\xd4\x4f\x4e\x30\x66\x50\xaf\x0a\x23\x8f\x75\x9c\x2d\xb3\xe8\x34\xb6\xb8\x8e\xac\x72\xa8\x76\x24\x1d\xfa\x83\xc2\xb2\xc1\xd6\x5f\xfa\xbf\x28\xd3\x29\x42\x3c\x5c\xdc\x3c\xb6\x59\xbd\x1f\xc3\x21\x41\x2a\x0f\x56\x6d\x06\x3b\x81\x16\x3c\x42\x75\xbb\xac\xf2\x72\x5b\x1f\x01\x1c\xb5\x10\x29\xda\x39\x20\x45\x0d\x4e\x45\xee\x05\xe1\xff\x27\x76\x8c\x96\x91\x05\x63\xdc\x7e\x5d\x6e\x87\xbb\xb2\x96\xca\x56\xb6\xd7\x48\xf0\xee\x28\x6e\x5a\xf1\x04\xcb\x15\xce\x5f\x61\xf7\xab\xea\x8e\xa8\x30\xb1\xef\xc9\x5b\xef\x32\xd8\xfe\x59\x5a\x49\xfa\xbe\x6c\xfb\x49\x3c\x75\xd5\xb4\xfb\xb0\x20\xaa\x95\x66\xa8\x89\xd0\xce\xae\x7e\xfb\x58\xd5\x13\x40\xb4\xd6\x5c\x84\x0e\x08\xfb\x20\xf2\x4b\x57\x15\x9d\x91\xff\xe9\xce\xad\x41\x62\x0e\xb2\xdd\x2d\x76\xab\xfd\xcd\x6a\xb7\xbf\x5d\x6f\x17\x37\xf7\x2b\x1f\x75\x68\x60\x29\x56\x86\x5c\x13\xeb\x0e\xd0\x51\xe3\x63\x75\x26\x0d\x60\x5d\xa7\x1e\x16\x8f\x5f\x17\xbb\xdd\xe2\xf1\xe9\x79\xf3\xf3\x8f\xe8\xf1\x76\xeb\x03\x31\x6d\x22\x1d\x38\xe5\x9e\x6f\x95\x9e\x25\x51\x40\x10\x18\xea\xd0\x8a\xa7\xf3\x4d\x56\xf6\x3f\x77\xfc\x64\x21\xe0\x1c\xa3\x63\x2f\xab\xa2\x1b\x55\x7f\x81\xbc\xc9\xf2\x3f\x49\x39\x20\xa4\x21\xa2\x68\x8e\x60\x6a\xf6\xdb\xe4\x18\x4b\xa8\x5b\xe5\xef\x8b\x89\x49\x25\x81\x28\x8c\x70\x4f\x92\x99\xee\x6a\x7b\xb3\xaf\x39\x44\xd4\x0a\x97\xed\x3d\x1c\xa1\xa7\xcd\x7e\xf0\x7b\xa2\x94\xe2\xef\xb9\x5f\x3f\xfe\x8e\x19\xb3\xfb\x3b\x89\x23\x4c\xb3\xd1\xff\xe4\x46\xa8\x57\x28\xaf\x31\x57\x10\x33\x1a\x8e\xf0\x83\x2e\xc4\x1a\xaf\x13\x10\x33\x89\x39\xb0\x6c\x2e\xbb\x4c\xbd\x42\x7d\x73\xd9\x0c\x05\x18\xae\x00\x11\xa3\xb5\x02\xe2\x58\xf0\x8e\x09\xb2\x2c\x4e\x67\xa8\xb3\x41\x82\x0c\xb1\xd6\x22\xe9\x1b\x97\xc5\x54\xbb\x92\x40\x6c\x2c\x5b\xb3\x5d\x01\x84\xbe\xec\x8a\x9b\x12\xa6\x84\x13\x48\x08\xc1\xa5\x5f\x78\x8f\x0e\x57\x20\xf2\xaf\x22\x24\xda\x0a\x7d\x58\x38\xf5\x4d\x53\x62\x77\xb4\xee\x70\xf1\x90\x46\x56\xbf\xfa\x80\x4e\x78\x4f\xd6\x97\xaa\xdd\x9c\x6e\x3a\x30\x15\xa4\x24\x51\x0e\x27\x86\x91\x49\xb5\x19\x56\xd6\x20\xa5\x29\x56\x02\xaa\x4b\x55\xc3\x69\x9c\xeb\x43\xca\xad\x04\xe7\xb9\x38\x66\x2a\x83\xc9\x7e\x03\xa9\x8c\xb0\xfd\xd0\x23\xe6\x7f\x64\xf5\x4b\x3b\xa1\x9a\xf3\x9f\x55\x99\xdc\x29\x78\x28\x70\x45\x77\xa1\xc9\xc2\x0b\xb1\x4d\xee\xa7\x20\x04\xfb\x85\xed\x76\x72\xd3\x64\x47\xfb\xd4\xb7\x78\xcd\xcb\xa2\xa3\xaa\x83\x0c\x43\xed\x54\x7f\x8a\xa6\x1e\x79\xba\x12\x90\xb1\x85\xf8\xdc\x64\x87\x9b\xa2\x90\xd5\x70\xa1\x04\x19\x9b\xd8\x9a\xdd\x7c\x29\xc4\x71\xf2\xb6\x4a\x1d\xa1\x12\x9a\xaf\x84\xde\x95\x33\x7c\xc6\xf1\x0f\x93\x86\x32\x5b\xd4\x44\x24\xb2\x15\xf5\x19\x26\x34\x56\x01\xd2\x8d\x56\x92\x23\x62\xee\xdd\x67\x8a\xa0\x03\xf0\xc2\x0e\x76\xa9\x9b\xad\x4e\x81\x56\x56\x95\x63\x8f\xed\xe5\xb9\x77\x41\x2b\xd9\xb1\xf7\x51\x6d\xb5\x28\xa7\x7d\x24\x80\x34\xc6\x6a\xe2\xe9\x24\x6c\xa9\xc9\xef\xa6\x5e\xee\x93\x00\x00\xc3\xac\xb3\x8d\x2b\xee\x8a\xf2\x56\x5c\x3e\xe0\x85\x80\x11\x96\xdf\x68\xbf\xed\xa6\xa3\xd6\x81\x91\x1a\xb7\x45\x6b\x44\xd9\x35\xee\x87\x86\x2f\x76\x17\xf9\x67\x2f\xa5\x36\xf8\x3f\x7b\x16\x13\x84\xc6\x6a\xde\xfb\xfd\xe2\x37\x7f\x80\x32\x4c\x17\xc6\x1a\xb9\x8e\x15\xf0\xf1\x3f\x57\x3f\xc0\x04\xb1\x46\x46\x51\x73\x3e\x16\x42\xdf\x65\x33\xae\xc6\x93\x75\x63\x74\xc1\xe3\x93\x85\x31\xc7\x4a\x44\x05\xf5\x2d\xbc\xcd\xd4\x2b\x4d\x98\x72\xfc\x41\xcb\xcd\xc3\xc3\xb7\xc7\xf5\xee\x8f\xfd\xe2\xf6\xf6\x79\xb5\xf5\x15\x3d\x13\x8a\x24\xed\x2b\x7a\xb7\x70\x14\x97\x2b\xb5\x6d\x62\xda\xdb\x92\x0c\x04\x2f\xaa\xda\x7a\x05\xcc\x0c\x8d\x08\x71\x96\xeb\x65\xde\x3b\x1e\x4c\x2e\x3c\xe2\x09\xbe\x4a\x98\xd7\xdd\x67\xff\x69\x32\x9d\xd5\x97\xe7\x61\x48\x6c\x22\xc9\xb1\x44\xfd\xb4\xfb\x3a\x57\x45\x1b\xf9\x9f\x12\x13\x81\xc5\x8b\x95\x4d\xde\x5e\x98\xb5\x00\x76\xc7\x88\xb4\xd3\x7d\x28\x48\x85\xc8\xd7\xff\x76\x6f\xa1\xa1\x81\xb0\xa2\x55\xbd\xfe\xee\xfc\x03\xa4\xc6\x4a\x78\xe0\xa5\xaf\x7b\xa5\xe0\x1a\x23\xab\x99\x7a\x9e\x89\x83\x38\x76\xad\x0e\x84\x1b\xdc\x88\x8f\xb8\xa4\x26\x0e\x34\x57\x43\x25\x65\xfc\x1d\x5e\x58\xc0\xc4\x22\x64\x6e\x67\xf5\xb6\xec\xb3\x21\x9b\x89\x25\xe0\x16\x71\x5f\x1c\x26\x0e\x17\x7e\x80\x22\x08\x0d\x59\x3c\x6c\x86\xd0\x4f\x7f\x54\xdb\xe2\xd2\x67\xac\xc2\xd1\x4f\x4c\x42\x50\xca\x07\x12\xeb\x6a\x93\x5f\x13\xfa\x4c\x42\xa4\xa6\x3d\xde\xad\x5c\xae\x7c\x8b\xc5\xa4\x69\xec\x73\x8b\x3b\xc4\xd0\x5f\x09\x4a\x9a\x54\x29\xa4\x16\xc2\xaf\x17\xd1\x54\x35\xaa\x2a\xdd\x35\xd5\x27\xd6\x39\xee\x83\x3c\x8a\xb0\x29\xd5\x65\x97\xfe\x4b\xb9\x14\x58\x18\x71\x7d\x9d\x4d\x0e\xcb\xe2\x24\x45\xfd\xdb\xe8\x35\xf6\x83\x8d\x22\x1d\x02\xec\xd9\x0a\xaa\x7f\x96\xea\x1a\x21\x00\x2b\xc1\x55\x61\xea\xa5\x38\xaf\xc7\x0a\x68\x46\x1a\xc2\xbd\x1a\xef\xe3\xdd\xee\xb1\xa8\xbd\xd7\xda\xdc\x4a\x6c\x14\x09\xed\x4a\x2c\xb4\x5e\xfd\xaa\x4b\x81\xba\xe7\x6f\xd3\x14\xd3\x28\x6e\xf5\xad\xae\xa8\x4b\x57\x67\xd4\x24\x44\xa2\x54\x6d\x95\xed\xf7\x1a\xda\xc8\xea\x6d\x80\xc1\x32\x9a\x03\xf6\x2f\xfd\xc6\xe4\x11\x3a\x9f\xee\x4d\x06\x42\x81\x9d\x2c\x87\x44\xb1\xc0\x83\xbf\xb4\x5f\x1b\x13\x70\xe1\x96\x33\x8c\x44\x76\xa2\x7a\xb5\xbd\xa5\xd1\x64\xa0\x41\x10\x25\x88\x74\x6c\xf7\x8b\xa2\xa9\x87\x99\x13\x0d\x42\x0d\x58\x90\x68\x13\x55\x51\x65\xea\x4a\xc9\x8a\x06\x51\x44\xc1\x6e\xb9\xd9\xe1\x00\xf6\xbe\x77\x61\x0b\x0d\x22\x69\x8d\x12\xd1\xa6\xba\xd0\xe0\xcf\x1c\x99\xd4\xa3\x7d\xf1\xfa\x3e\xe1\xac\xd1\x80\x04\x21\x46\x93\x48\xe5\xdf\x66\xff\xed\xce\x42\x38\x45\x2a\x30\xd6\x77\x17\x5a\x77\x19\x06\xe8\x0f\xaa\xbd\x34\xa0\x3a\xc6\x50\xf8\xdc\x54\x2f\x56\xed\xcb\x1f\x00\x81\xb5\xfa\x17\x51\xbd\xfc\x0e\x17\xff\x67\x26\x02\x9c\xdb\x87\x52\xe4\xf5\x7a\x2a\x67\x5e\x75\xc3\x74\x8c\x8a\x04\xa8\xe3\xd3\x7d\x38\x0e\x2d\x34\xda\xc9\x81\x55\x5b\x25\xf2\x1c\xca\xaa\x73\xef\xa3\x41\xcc\x12\x54\xbc\xb6\x35\x83\x4e\xad\xc7\xa2\xf1\xfd\x18\xa0\x98\xd4\xa1\x72\x3c\x2e\x68\x37\xbd\x4e\x0d\x0d\x12\x1d\x85\x9d\x9b\xd3\xdf\xfd\x5f\xd3\xc4\x46\xf0\x5f\xfa\x0a\x51\x4f\x6b\xa2\x41\x9a\x02\x21\x5d\x36\x7f\x2d\x07\x8e\xff\x3a\x46\x3a\x0d\x78\xa4\xb5\x2f\xdd\x6d\x36\xf7\x56\xd8\x22\xe2\xfe\x64\x5c\x58\x12\xfc\xef\xbd\xa9\x0a\x0d\xb8\xd6\xba\xcb\x99\xb3\xff\xe2\xfd\xfa\x56\x67\xc7\xee\xa7\x8b\xc4\xda\x0b\x56\x35\x9c\x43\xff\x47\xc9\x35\x52\xf7\x71\x61\xfb\x0a\xa2\xac\x25\x0c\x8d\xf1\xdc\x30\x15\x08\xb4\xdf\xaf\xc4\x1b\xb4\xf9\xef\xf6\x0c\x1f\xc8\x36\xd3\x40\x91\x20\xf5\x8d\x32\xd4\xb2\xed\xae\x40\x53\x8d\x65\x72\xb0\xca\x33\x5b\xc8\xf5\x8d\xc8\x5f\x9f\x0b\x8f\x66\xa2\x81\x56\x29\xa2\x1f\x1f\x16\x3f\x47\x0e\x9e\x34\x00\xc2\xf0\xf7\x79\x3f\xa0\x7d\xaf\x4d\x43\x03\xe0\x29\x76\x10\x34\xa8\xe2\x74\x2e\x2a\x98\xbc\x77\xc0\x25\x6e\x4f\xa5\x78\x05\xf4\x48\x40\x40\xad\xb5\xfe\x1c\x45\xf7\x34\x30\x22\x95\xed\x0e\xf4\x7f\xcf\x3f\xbb\x3f\xb5\xaf\x90\x15\x8e\x14\xe5\x65\xdb\x55\xa3\x69\x18\xf0\x04\xbb\x73\x3a\xab\xa4\xc8\xf5\x6e\xf2\xbe\x86\x6d\xca\x18\x77\x40\xc6\xf6\x71\x64\xf5\x65\x8e\x0e\x41\xc3\x36\xbd\x6c\x6f\xf1\x3e\xcb\x2b\x28\x6d\x45\xba\x23\x79\xcf\xac\x84\x34\x24\x49\x8c\x0b\x96\xef\x9e\x5d\x83\x83\x87\x09\x1c\x0d\x49\x6a\x2d\x93\xd6\xaf\x4d\x29\xc6\x1a\x1a\x9f\xad\x8c\x34\x24\x52\x23\x92\x64\x63\xcc\x31\xcb\xc1\xab\xe2\x7c\x54\x8d\x99\x44\x7b\x34\xa4\x5a\x44\xc2\xf3\x7e\xdb\xc0\x3f\x6f\x5f\xcf\xb1\x75\xf7\xf8\x52\x59\x4a\x11\x9a\x74\x5f\x1c\x96\x50\xd6\x99\xc9\xda\xcd\xab\xcd\x2b\x27\x33\x33\x8c\x15\xc7\xc6\xc4\xde\xde\x9a\x6a\xf5\x9f\x46\x8c\xe0\x31\x34\x8c\x75\x88\x6e\x55\x47\x51\xd5\x5e\x5d\xe6\x49\x64\x7a\xd3\x8c\x83\xce\x76\x24\x45\xf9\x96\x0f\xba\x97\x7e\x14\x18\x54\x96\xd7\x0e\xdb\x7b\xf5\xd4\x13\x13\xa6\xda\x37\x16\xce\x99\x7a\x14\x27\x70\xf2\x46\xd5\x62\xfa\x9d\x69\x2c\x11\x51\x8a\xab\x4d\x91\x03\x7a\x0d\xad\xfe\xb3\xce\x6b\xe2\x67\x19\x4f\x12\xa5\x07\x6a\xb5\x9d\xb4\x25\x0d\x39\x18\x8c\x97\x7e\x64\x33\x72\x60\x34\x94\x71\x8a\xf8\x6f\xc8\xeb\x4f\xad\xac\x87\xff\x25\xd1\x3f\xc3\xf0\x5f\xfe\x04\x4a\xa2\xab\xfc\xf9\x45\x54\xb0\xca\xf5\x55\xdc\x4c\x43\xa9\x01\xf3\x7e\x4b\x3e\xb8\xf2\x3c\x1d\x3f\x58\x09\xdc\x72\x0c\x50\x7b\xe0\x16\x64\xfd\x19\x68\xf4\xaf\xfe\x3b\xfe\xd1\x2a\x65\x58\x17\xde\xef\xad\x67\xa9\xbf\x57\x4a\x11\xdc\xd8\x70\x01\x70\x28\x9f\x9d\xc8\x5f\xe7\x92\xa2\xd4\x7d\x06\x48\x84\xbf\xff\xb6\x50\x0d\x82\x1f\x87\xce\x7e\x34\x0a\x02\xd3\xb9\x95\xd8\xc4\x2e\xab\x67\xa1\xe3\x34\x0a\x08\xc3\x54\xba\xee\x51\xaa\xe3\x1b\x19\x05\x60\x09\x5e\x37\x4b\x21\xb6\xdd\x37\x00\x43\x06\xf1\x4d\x73\xb1\x26\xaa\x3d\xad\x71\x2e\x16\xa1\x51\x18\x59\xf7\xd5\x76\x96\x83\xdb\x41\x51\x78\x74\xf4\x33\xc3\x81\xb4\x76\x8f\xec\xa3\x51\x48\x75\x28\x7b\x5d\xd8\x6f\xb9\x65\x89\xe9\x9b\x76\xc5\xba\x4c\x7e\x52\xc8\x42\x04\xc1\xdd\xdd\x2d\x87\x26\x01\x34\x8a\xb8\x44\xe5\x24\x71\x3e\x23\xac\x70\x34\x07\xa2\x48\x19\xdc\x4c\xf2\xe6\x74\x5f\xa8\xd7\xaa\xfb\x94\xfb\xfd\xb5\x78\x45\x69\xbc\x4f\xc2\xc0\x76\x70\x1a\x06\x03\xdb\x87\xbd\x2a\x4e\xa7\xac\x6a\xe3\xea\xfd\xfb\xa0\xc0\x41\x23\x92\xd0\xc0\x95\x7a\xea\x49\x5b\xab\x3d\xc8\x1c\xb8\x00\x8b\x56\x42\xd5\x9e\xb2\x74\x57\x16\xa7\x6b\x09\xf5\xf1\x0d\xa0\x0c\xb0\x8a\xe0\x9f\x69\x7b\x7d\x53\xb7\x11\x1a\x51\x87\x66\x77\xc8\x91\xab\x4a\x0a\x8d\x62\xce\x3d\x2c\xf2\xa9\xf9\xef\x7f\x8f\x43\xf9\x77\x1a\xc5\x32\x40\xf9\xa8\xa3\x28\x0f\x5e\xbd\xb6\x13\xac\xeb\x4e\x21\x25\xd6\x2e\x7d\xd9\xec\xae\x28\x07\x95\xaf\xc9\xaf\x4e\x02\xeb\x90\x77\x23\x6a\x4f\x72\x6e\xff\x68\xcd\xf4\x4b\xeb\xff\xea\xff\xaa\x94\x74\x42\x22\xf8\xde\x8c\x77\xcb\x28\x51\xe0\x1d\xd9\x6e\x2e\x47\xf1\x5e\x39\x49\xba\x5b\x2b\x47\xd9\xbe\x32\x03\xec\x3b\x8d\x52\x69\xb0\xa0\xb9\x85\x5a\x67\x6f\xf6\x22\xd5\xf4\xf2\x78\x08\x48\x76\xca\x9b\xd3\xfe\xa5\xa8\xea\xee\xdb\xb8\x34\x62\x08\xbb\x45\xbe\x8c\x31\x50\xf6\xb7\x52\xb0\x20\x74\xfd\xa8\x27\xa1\x5e\xfb\xd2\x42\xe8\xcf\x2e\xb8\xd5\x10\xe9\xba\xf9\xe1\xa8\x9b\x4f\x23\x21\x22\xe3\x9e\xc6\x57\x10\x47\x57\x84\x4e\xff\x19\x26\xf1\xbf\x86\x8b\x43\x24\x74\xec\xbd\x80\x1f\xb2\x7c\xd1\xe8\xcc\x06\x77\x9d\xd6\x0a\x8d\x24\x09\x25\xf2\x73\x6f\x41\xb5\x7b\xe7\x3a\xaf\x9a\xb2\xb7\xe0\xa5\x91\xd4\x29\x2e\xff\xa5\xcd\x8b\xf4\xb7\xd5\xce\xc6\xa6\xf3\xd1\x55\x24\x8d\x45\x2f\xeb\x62\x67\x73\x80\x11\xaa\x90\x46\x8a\x10\x6a\xd5\x4a\x31\x7b\x7e\x40\xe5\x80\x0f\x96\x24\xa5\x02\xb4\x20\x7c\x3a\x8a\x1c\x6a\x71\x28\x8b\xfd\x14\xb5\xea\x47\x6a\xcb\x91\x6d\x53\xe0\x1c\xd5\xe9\xda\xb9\xe8\x1c\x7b\x46\xd7\xa7\x8c\xa2\x93\x65\xee\x16\xf2\xe2\x64\xa1\x4b\xfe\x2a\x75\x64\xd1\x80\xa2\xbd\x67\x63\xb2\x0a\x8d\x34\x55\xf8\x6a\x3f\x2d\xb6\xdb\xd1\xb2\xa2\x53\x40\x93\x8e\x5a\xcc\x8b\xcf\xd2\x48\x3b\x97\x7d\x47\xc5\xea\x4b\x7a\xd3\x5d\x69\xfc\xf3\xb4\xb2\x9d\x2e\xc4\x95\x63\x31\xb0\x9a\x4c\x49\x88\x62\xdb\x28\xeb\xcc\x15\x1d\xb3\xe3\xae\xc9\x35\xca\xb3\x7c\x28\xef\x33\xb9\x44\x48\x13\x70\x95\xba\xe3\x26\xdf\x66\x87\xfc\xdb\xd9\xff\x40\xd0\x09\xae\x8c\x0f\xd9\xaf\xc9\x46\x03\x20\x91\x6a\x80\xd1\xfd\x6d\xd9\x1c\xfc\x3b\x41\x82\x20\xc2\x52\x9a\x6d\xf5\x7e\xe9\x3d\x9e\x47\x3f\x91\x04\x24\xc5\x85\xfd\x24\x2e\x45\xb9\xc4\xd4\xd3\xab\xe0\xb9\x11\x21\xe1\x94\x75\x0a\x71\xb8\x06\xae\xf3\xb7\xac\x06\x6b\xcb\x31\xed\x61\xf5\x9b\x06\x09\x65\x28\x7c\xab\x52\x34\x55\x7f\x46\x29\x52\x70\x81\x17\xa6\x50\xfb\xb7\xd4\x1f\x8b\x44\x8a\xf6\x5a\x3e\x78\x75\x75\x7e\x47\x96\x6a\xf2\xce\x88\x8c\x12\x12\xaa\xc8\xb7\x98\x1b\xb9\x2b\x9a\x12\x9d\x37\x86\x55\x3c\x9f\x39\x11\x12\x19\x84\x4d\xdb\x59\x7c\xf3\x24\x66\x7a\xb7\x94\x10\x26\x7d\x7e\xb5\x85\x37\xc8\x07\x6d\x76\x4a\x08\x08\xcc\xe4\x96\x0d\x58\xd7\x6e\x7f\x80\xc6\x41\xe8\x26\x57\x1b\x90\x76\x49\xef\x67\x9e\x8a\x9f\x4f\x06\xc2\x02\x82\x71\xee\xb6\xc9\x3b\x93\x31\x4a\x58\x12\x62\x07\xc1\x9d\x6b\x5f\x17\x4e\x3b\x66\x7f\x2e\xe1\x6d\xff\x0e\xf0\x1a\x4e\x7e\x11\x4b\x6d\xf6\x60\xf7\xb1\xc7\xcd\xb6\x5d\xfc\x06\x12\x87\x6e\x58\xcc\x24\x6e\x77\x3f\x40\xbc\xf5\x37\x38\x96\x31\x74\x92\xb0\x0b\xfd\x36\x58\x9f\x48\x12\x5a\x0f\x17\x24\xb0\x3c\x3c\x6c\x9e\x77\x8b\x7b\x1f\x9c\x90\x94\x86\x98\xde\x7c\x93\xf0\x6b\x44\x9d\xf4\xc7\x8d\xc6\x7d\xa6\xb0\x89\x43\xbb\x13\xcd\x57\x27\x29\xe1\x84\xe3\x9a\xff\xb0\x7e\xdc\x3f\x7d\x7b\x5e\xb6\x0b\xb3\xff\x1a\x4e\x53\x80\xc1\x9a\xf2\x45\x64\x39\xe8\x61\x39\x81\x70\x30\x8c\x4d\x2a\xa5\x23\x3b\x52\x4a\x44\x20\xd1\x74\xf0\xa5\xd0\xc7\x36\xef\xa9\xc5\x11\xd7\x2f\xfe\xd0\x8d\x48\x14\x02\x60\x8d\x33\xc6\x71\x1b\xe8\x5a\x75\x53\x40\x11\x29\x1d\x01\xe5\x56\xd4\x62\x4f\x82\xee\x08\x65\x72\xe8\x87\xb7\x6d\xca\x73\x99\x55\xf0\x34\x91\x05\xa4\x44\x31\x41\x1d\x42\xb6\x4d\xa5\x47\xee\x8d\xa3\xe9\xd3\x4d\x6a\x10\xd6\x8e\xfe\xd8\x6e\xaa\xbb\x77\x0b\x43\x7a\xec\x7f\x19\x98\xd8\x6e\x32\xfb\x53\x73\x3c\x15\x7a\x68\x67\x3a\x40\x25\x51\x62\x22\x2a\x7b\x6e\xa1\x53\x21\xd6\x53\xe1\xcf\xd1\xe5\xd2\x80\x50\xac\x5f\x6e\x7e\x3c\xee\x11\x68\x7f\xfd\x9c\x69\xa0\x62\xe3\x94\x82\x7f\x14\xe5\x2b\x94\x0b\x63\x40\xd5\xe2\x0a\xdc\x42\x69\x08\x02\x75\xc2\x96\x47\x10\x79\x9b\xfd\x23\x9e\xd3\x64\x43\x4b\x3a\x4a\x49\x20\x2d\xc8\xde\xcb\xf0\x6f\xf2\x43\xd1\x69\x29\x50\x4a\xc2\x84\x0c\x3c\x5e\xbe\x39\x2f\x9e\x49\x66\x3d\x8a\x18\x29\xa1\xc4\x8a\xf9\x16\xc7\x0b\x92\x82\xb2\xc1\x3c\xa7\xc4\x58\x50\xb2\xa5\x1e\x59\xa5\xd3\xfd\x53\xd9\xe3\xe9\xdb\x21\x0a\x97\x2c\xa1\x14\x9c\xeb\x2f\x8d\x28\x75\x26\xf2\xef\x30\x01\x38\x53\x4a\x03\xce\x9d\xa9\xdb\xf1\xca\x87\x65\x3c\x94\x85\x91\x85\xf7\xe2\x7a\xd5\xee\x29\x75\x36\xdd\x7d\x29\x13\x46\x5b\xbb\x4c\x78\x0d\x07\xca\x8b\x94\x32\xa5\x10\x9a\xd9\xe4\xb6\x7d\x34\x16\x8d\xa5\x34\x61\x01\x6e\x5b\x68\x1b\xb3\x3f\x0f\x3f\x9a\x46\x09\xe2\x4b\x4e\x59\xde\x06\x8b\x0f\x22\xbf\x0c\x70\x68\xe3\xfe\x12\xa5\x29\x89\x62\xd2\xb1\x1a\xb1\xb8\xff\x20\x2e\xc3\xd0\x8e\xf2\x48\xb1\x64\xac\xe1\x8a\x5e\x06\x7f\xa9\x86\x4a\x29\x4f\x6d\x5b\xf7\xa7\xcc\x6a\xf3\xae\x87\x1b\x3f\xe5\x22\x25\xb6\xc7\xa1\xb2\x93\x38\x4e\xa7\x28\x57\x80\xe5\x4d\x2f\x06\x35\x88\x07\xa9\x88\xd2\xb8\xbf\xc1\x5e\x09\x60\x9c\x67\x0e\x52\xa1\xd9\x72\x04\x15\x42\x9b\xc4\xed\xfe\xcf\x9b\x6d\x77\x6e\xb0\x24\xa0\x4c\x15\xa1\x2d\x14\xea\xbe\x26\x45\x65\x60\x9d\xd9\x87\x3a\x85\xab\xe7\x65\x12\x85\x57\x77\x64\x36\xbb\xa0\x52\x05\xa9\x2b\x67\xee\x44\xf5\xba\x9e\x4e\x33\x65\x08\x4e\x8b\xbd\x2f\x2a\xde\xf5\xe6\x0b\xd7\xf7\x57\x13\x4b\xc5\xf9\xb1\xbe\xf5\x32\x59\x94\x6a\x29\xb1\xe7\x25\xb4\xde\xe2\x2d\x69\x5f\x0c\x51\x66\x55\x2f\x7b\x38\x4e\xe4\x43\xff\x41\x1d\xa7\x96\xe0\x77\xc8\x72\xdb\x07\x1b\xa0\xe5\x29\x35\x91\x26\xda\x23\x00\x31\x64\xea\x15\x88\x6e\x3b\x90\x27\x65\x01\x89\xf1\x45\x7f\xcb\xe0\xbd\x5d\x0d\x87\xcd\x06\xca\x82\x34\xb6\x7d\xf0\x32\x7b\x83\xa5\xf0\xd3\x9a\x45\xd4\xfa\xcf\x5b\x16\x2e\x6e\x04\x9d\x3f\x83\x1f\xe2\x14\x6b\x94\x55\xe3\x59\x9c\xea\x5d\x31\x52\xe6\xa1\x8c\x84\x29\x2e\x9b\x95\x2a\xda\x9f\x3e\x36\x97\xa1\x8c\xa4\x01\x2a\xd9\xec\xe1\x94\xd5\x5f\x87\xa5\x42\x6b\xc0\x32\x09\x25\xc7\xb7\x9b\x51\xc3\x11\x33\x77\x7a\x6c\x4e\xce\x29\xd2\x1d\x61\x01\x18\x67\xd2\xb5\xca\x0f\x59\x0e\x50\xfe\xa3\x99\xba\xf3\x52\xc6\x24\x4f\xc8\x50\x6e\xe5\x00\xc3\x32\x34\x8b\x19\xc7\xcd\xca\x77\x3f\x9c\xe2\xfb\x78\x8e\xb0\x24\xb6\x25\xf1\xc7\x68\x12\x65\xb3\x34\x92\xb8\x77\x8f\xea\x2f\x57\xfd\x49\xca\x52\x9e\x12\x1b\x16\x1e\x91\x89\x93\x75\xf5\x5c\x96\x2a\x86\xf8\x83\x73\x2f\xe6\xb7\x14\xe7\x5d\xd6\x79\x33\x51\xc6\x43\x8b\x2e\xed\xc1\x10\x8b\xfb\xa5\xe3\x1b\xd6\xea\x65\x72\xb5\x9c\x09\xc4\x7d\xc9\xf6\x87\xa2\x84\xe0\xe8\x89\xf0\x98\xe1\x1a\x5d\x83\x7a\x71\x60\xe2\xee\x50\x42\xb0\x21\x50\xb7\x99\x61\xfd\xe7\x6c\x91\xf6\x13\x02\x69\xd2\xb8\xc5\x58\x6e\x15\xaa\x8c\xf4\xee\x56\x94\x89\x24\x4c\x2c\xf0\xf1\x8c\x24\xa1\xb5\x5f\x56\x98\x0c\x05\x32\xa8\xb7\xce\x79\xc2\x3b\x30\x5e\xb7\xb2\x29\x93\xcc\x24\x8e\x70\xba\x56\xc5\xb6\x86\xf3\x74\x80\x00\x8c\x02\x7d\xc7\x73\xb0\x13\x32\xa9\x04\xe2\xd7\x51\x47\xa7\x4b\x67\xe6\x60\xc2\xcd\x08\x42\x46\x99\x0a\x25\x52\x8f\xdb\x4d\x76\x54\x10\x65\x2a\xa2\xa1\x5b\xfa\x07\x6e\xc9\x94\x29\x4a\x89\x57\x79\xca\x4e\x80\x28\xac\x71\xed\x86\x41\xc0\x3d\x9c\xfe\xf3\x9d\x8d\x81\x53\x44\xb3\x4a\x1c\x88\x45\x47\x41\xa2\xd9\x50\xc7\xfd\xda\x38\x48\x02\xe4\x5e\xcb\xe6\x72\x57\x94\xab\x37\x28\x2f\xb2\xd0\xfe\x8d\x8d\x43\x16\x62\xcf\xff\xdc\x2e\x79\x28\x78\x3d\x47\xdc\xa0\x71\x18\xf3\x38\xe9\xa4\x85\x96\x85\x86\x81\x27\x24\x8d\xa3\x20\xa0\xee\x81\xdc\x65\x65\x65\x65\x5a\x9f\x6d\xc5\x6b\xf0\xf8\xe3\x88\x09\x24\x3e\xc3\x7f\x1a\xd1\xf5\x51\xe2\x88\x0b\x84\x85\x68\x6d\xea\x1e\xab\x45\x63\x12\x04\xc6\x2d\x79\x8b\xee\x6f\x61\x80\x6a\x10\x7b\x07\x9a\x1a\xe6\x35\x31\x49\x29\xa6\xf2\x45\x0e\xeb\xd3\x79\xdd\xdb\x33\xb5\x87\x0c\x56\x16\x0a\x67\x2a\xf0\x8c\x85\xcc\x1b\xf4\x79\x56\x2f\xf0\xd1\xda\x73\x1d\xf2\xc5\x44\x59\x80\xa0\xc9\x72\xbd\xad\xce\xe3\x45\x26\x26\x60\x2d\x1e\xb0\x14\x27\xba\x85\x37\xa6\x2c\x0a\xac\xa6\xda\xfb\xcf\xee\x6f\xdc\x68\xe8\x8c\x14\xc6\x28\xec\x4f\xa1\x63\x34\x66\x44\x60\xd5\x67\xf5\x73\xb8\xad\xc7\x4c\x48\x6c\x35\xe7\x45\xbd\xce\xad\x3e\xe2\xf8\xf2\x62\x11\xa0\x34\x87\xca\xea\xec\xbf\x90\x57\x13\x6d\xe8\x7e\x14\xea\x10\xdd\x17\x87\x9b\x4c\xe3\xb2\x01\x63\xc2\x6a\x3b\x46\xc6\x9d\xde\xc6\xcd\xe6\xdb\xe3\xd2\x33\x76\x69\x9c\x28\x15\x04\x23\x24\xef\x47\x8e\x34\x38\x16\xfb\xd4\xb7\x45\x23\x8f\xb0\x29\x1f\x8b\xfa\x25\xcb\x0f\xeb\xd3\xd9\x57\xcc\xe2\x94\x18\x54\x34\x58\xb4\x8b\xe2\xc7\xbe\x6c\x7e\x74\xcc\x10\x6a\x79\xff\xc7\xe3\xba\x9b\x36\x22\x08\xbc\x23\x56\xd7\xfd\x9f\x43\x5f\x4e\x2e\x4e\x30\x8d\xcb\xd5\x35\x0d\x68\x32\x4e\xc4\xa1\xd3\x07\x5f\x3b\xef\xe5\xc9\x2d\x95\x11\xc7\x58\xf9\xbe\x79\xab\x87\x4f\x4c\x72\x89\xbd\xbd\x63\x66\xe0\x71\xfa\x19\x11\xa0\x9c\x91\xf3\x03\xc8\x2a\xd0\x4f\x50\xce\x20\x96\x69\xac\x02\x43\x83\x4e\xe3\xd7\xa5\x59\xd8\x92\xeb\x85\xfd\x68\xac\xb4\xd6\xd6\xf3\xea\xec\x8a\x2d\xfe\x88\x0e\x08\x77\xf9\xc6\x23\xfc\x72\xde\x6f\xdd\xe2\x1c\xeb\x40\x44\x0e\x25\xf6\x7d\xbf\x9d\x5c\xa6\x4e\x38\xaa\x3e\xf8\x44\x6d\x71\x6c\x03\x88\xc9\x05\x6a\x69\x35\x34\x3a\x57\x1d\x4f\x2f\x76\xe0\x4b\x5c\xe5\xfd\x58\xcd\xf0\x84\xd5\x4b\xf1\xbe\xb4\x85\x49\xc7\x2e\x77\x03\x40\x50\x2c\xf1\xad\x7e\x3e\xed\xc3\xb4\xfb\xab\x0c\x71\x69\x78\x2f\x85\xaf\xff\xc4\x26\x05\xe9\xa5\x09\x50\x8b\xe3\x33\xbb\x7a\xff\x19\x13\x19\xf7\x99\xdd\x3b\x40\x5d\xdd\x66\x0e\x02\xde\xfd\xe6\x24\x08\x38\x06\xc8\x47\x51\xd5\x28\x48\x5e\xd5\x5f\x37\xb7\xf7\xdd\x2b\x90\x04\xa1\x22\x6c\x10\x4c\xec\x5f\xb3\xe3\x71\x6f\x45\xd6\x47\x7b\x47\x12\x44\x0c\x7b\xb8\x63\x66\xc6\x55\x56\x3f\x9e\x71\x49\x44\x05\xe6\x06\x23\x71\xa1\xbb\xa2\xf4\xe4\xdf\xbf\x14\x10\x27\x91\x8e\x7d\x2d\xda\x16\x44\x66\xa9\xd3\x34\x89\x8c\x40\x62\x4f\x1b\x45\xd8\x6f\x2c\x6e\x07\x82\x6d\x1f\x5d\xa3\x81\xa4\x63\x39\xd8\x5f\xb5\x5e\x6e\x7c\x24\x93\x10\xa6\xd1\xc3\xa9\xdb\xf6\x66\x4b\x89\x09\x49\x74\xd8\xf1\x21\x4e\xe7\x23\x58\xb0\x7b\x39\x59\xda\x12\x14\x84\x6b\x77\x86\x3e\xa7\xfe\x28\x4f\x1a\xdd\x7f\x1a\x48\x4f\xc6\xb3\x73\xd1\xba\x8f\xfc\x36\x00\xfd\xd0\x84\x26\x06\x51\x37\xeb\x7f\x2c\xfd\xe5\x53\x41\x10\x19\x65\xc9\xbd\x18\x49\x7e\x45\x6e\xff\x6f\xd7\xae\xf5\x34\x61\x61\x80\x04\x9e\x6f\x8f\xeb\xe5\xe6\xf9\x71\xbf\xf6\xc5\xf1\x84\xb1\x08\xdd\x81\xf3\xe6\x64\x65\xa4\xdb\x6d\xb8\xea\x8e\xca\x10\x23\x19\x6c\x17\xb2\x61\xaa\x9a\x30\x69\x65\x59\xd1\xd6\x7a\xd9\xd3\xa2\xe6\x5b\x2b\x49\x4c\x12\xe3\x15\xcb\xb2\xba\x16\x06\x6d\x33\xa0\xa7\x2f\x4d\xae\x38\x8e\xa3\xc0\xbe\xd6\xed\xab\xd7\x23\x4a\x92\x38\x61\x96\xc4\xf9\x0b\xc3\x5f\x21\x8f\x70\x55\xfb\x4c\xe2\x94\xdb\x3e\x5e\x71\xd4\x6b\x0d\xe2\x07\x64\x4f\x45\x55\xf7\x95\x9f\x24\x01\x62\x17\xa3\x17\x50\xaf\x0b\xad\x11\xf1\x3f\x79\xa6\x89\x09\x98\xe9\x50\x8d\x93\x83\x69\xc2\xb4\xe3\x44\x6d\x55\x51\x4e\xe7\x6c\x9a\x2a\x94\xb4\xf8\xfa\x65\xb7\x7f\x86\x0a\xca\xb7\xee\xe2\x52\xc3\x10\x3b\x82\x4a\x5c\xbe\xf4\x39\xf9\x38\x27\x82\xcb\x7e\x45\xfc\xd2\x40\xd5\x47\xab\x09\x4f\x49\x94\x78\x2f\x22\x6c\x42\xdd\x88\xba\x6e\xe7\xe6\xbb\x28\xb5\x63\x09\x8e\x4f\x28\x22\x5b\xec\x94\xb9\xb4\x6b\xb9\x3f\x97\xa4\x14\x2f\xf4\xae\x28\x8e\xdd\xdf\x64\xc2\x3a\x27\x09\x7b\x67\x3e\xd9\xf3\x12\x15\x18\xcc\x9b\x8b\x7c\x9d\xab\xa2\x8b\xb7\x12\xc5\xad\x6a\x0c\x88\xaa\x16\xba\x1a\x51\xb8\x69\xbb\x4b\x63\xf9\xa5\x12\x27\xe8\x8b\x5f\x89\x52\x56\xf4\x1a\x23\xac\x7d\xfd\x02\xfb\x52\xf4\xb3\x4e\x19\xe6\xb9\x31\xb7\xe2\xb2\x7b\xc9\xca\xee\x87\x68\x12\x05\x03\x0b\xcc\xf5\xe3\xc2\xad\x15\x3d\xc1\x83\x26\x9a\x29\xc4\x64\x55\xef\xa2\x3c\xed\xca\xae\xf1\x9e\x68\xce\x51\xe2\x44\x68\x8d\x1d\xd9\xeb\x2e\x5b\xa2\xa5\x06\xc7\xb7\x84\xf2\xae\x0f\x31\x67\x39\x00\x34\x81\x34\xc4\x94\x79\x5b\xc3\x1b\xf4\xc4\x19\x3c\x80\xd2\x0c\x98\x15\x6d\xd1\x80\xed\xe4\xa9\x54\x63\x2f\x0b\x9a\x80\xb4\xa5\xd2\x37\x71\xcc\x34\xfa\x1d\x8d\x42\x43\x3f\x4a\x89\xa0\xa3\x4f\xdc\x66\x6f\xdd\x37\x41\x8c\xd1\xbd\xd7\xbf\xba\xc7\x15\x42\x16\xa2\xd4\x8e\xf9\xeb\x47\x9a\x28\xe6\x0e\xab\xf6\x55\x4c\x0b\x60\x69\x90\x18\xf4\xb5\xee\xbb\x25\x03\x58\x2b\x4d\xc3\x40\x62\x2b\xfc\xe9\x79\xb5\x5f\x2f\x37\x43\x5b\x2d\x9a\x46\x61\x80\x2e\xe6\x67\x28\x6d\x7b\xa9\xfb\x3b\xc5\x1a\x10\xe4\xda\x13\x65\xfd\x5e\x9a\x52\x2e\x10\x86\x99\xc3\xfb\xaa\x7e\x41\x9e\x84\x46\xa7\xaf\xe1\xaa\x98\x52\x11\xe1\x04\xea\xbe\xf6\xfe\xcb\xe3\xfe\xbe\x83\x14\xd3\x94\x71\x0e\x0e\xa4\x85\x95\x0a\x7d\x1a\xbf\x14\x29\xe3\x1a\xaf\xed\x5b\x9e\xbd\x41\x59\x89\xe3\x9d\xb3\x0c\x41\x7f\x73\xf8\xed\xd3\x58\x78\x3e\x36\x6e\xcf\xa9\x58\xcf\xb5\x99\xf3\x94\xa5\x69\x9c\x30\xe3\x74\xe4\xbf\x14\x9e\xe9\xd0\xfe\x39\xe6\xbd\x57\x26\xea\x5c\xcc\xee\x6d\x69\x9c\x52\xdd\x0b\xaa\x8d\x92\xd4\xab\x91\xca\xb9\x51\xbd\x42\xee\x16\x22\x4d\x7c\x66\xea\x07\x69\x4b\x8f\x73\xaf\x8e\xe3\x81\x4d\xae\x39\x09\x19\xf2\x6e\x6f\x76\xcb\xfb\xa2\xae\x8b\xf9\x3c\x31\x4d\x12\x86\x1e\x4e\xa6\x28\x0f\xd9\x1b\xb8\x5e\xed\xdf\x46\x4f\x2e\x49\x15\x36\x98\xf6\xbe\x03\xb0\x7c\xc9\x8e\x57\xe4\xb1\xe9\x89\x65\x64\x41\x08\x55\x05\x75\xb5\xef\xc5\xb7\xfd\xaf\x48\xa9\xad\x80\xf8\xd6\xf6\xaa\x9f\xa1\x3c\x49\xbc\x89\xe5\x72\xb5\xa3\xeb\xdc\x14\x9d\xc8\x76\x77\x55\x5c\x04\x8e\x7b\x75\x42\x7f\xc9\x1f\x45\x79\xec\x84\x0f\xfc\x18\x99\x60\x8e\xd7\xae\x4e\xab\xfa\x65\x80\x59\x4b\xb9\x4c\x89\xd5\x87\x11\xa7\x4d\x0e\xce\xef\xce\x1f\x54\x81\x0f\x75\x6e\x9a\xcb\xcc\x02\x9d\x72\x08\x7b\x7f\x39\x5c\xd3\x9f\xda\x14\xb3\x14\x35\xdc\x43\x7e\xe8\x3a\xc2\x29\x37\x0a\x5f\x8e\x7d\x53\x81\x17\x0b\xf1\xc7\x44\x68\x9c\x01\x5d\xdd\x94\x79\xe7\x47\x33\x6c\xad\xa4\x82\x13\x0c\xd6\xb7\xe2\xcd\x35\xc4\x86\x49\x5c\x2a\x23\xc0\xb8\x68\xad\x21\xaf\x33\x73\xe9\xfe\xce\x18\x5c\x53\x78\x37\xf9\xf1\xb2\x85\xe3\x71\xa6\xed\x9f\xca\x44\x20\xb4\xd8\x7e\xc9\xc3\xe5\x47\xd1\x2d\xd6\xa9\x94\x04\x7b\x80\x39\xfc\x72\x11\x80\x7b\x8f\xfe\xc2\x3f\x74\x32\x31\xa4\x51\x22\xf1\x2e\xf9\x57\x98\xa9\x54\xd1\x10\x93\x0b\xf1\x29\xc2\x75\xbc\x78\xa7\x3a\xb0\x98\x81\x36\xab\xc8\x72\x8b\xd4\x99\xfc\x3c\x88\x49\x67\x56\x56\x82\x18\x54\x6a\xbb\x01\x02\x5b\xb4\xbb\xd5\xe2\x61\x8f\x5b\xe9\x76\xff\xb4\x7a\x5e\xae\x3a\x10\x64\x0a\x5c\x61\x51\x65\xf3\xf0\xa5\xfb\x93\x60\xdc\x4d\xd5\x1b\xc8\xc1\x64\x2a\x13\xe5\xe5\xc6\x92\x21\xe6\xdf\x0c\x13\xa4\x30\x58\x72\x9e\xe1\xe0\x84\xc1\xc6\xbf\xc9\x24\x21\xf2\x18\xf2\xe6\xf4\x15\x7b\x66\xdd\xec\x34\x32\xc5\xfd\xfe\x6e\xfd\x7d\xb5\xff\x63\xb5\x78\xde\xff\xbe\x5a\x3d\xad\x1f\xbb\x8b\x32\x10\xe1\xe4\xdc\xfc\xee\xfe\xc2\xc3\x48\x60\x6a\xb3\x7d\xdc\x61\xa2\x67\x0b\xaa\x0f\x43\x66\xf2\x07\xff\xfa\x13\xd0\x18\x5f\xe7\x2f\x79\x51\x65\xfe\x4a\x78\x14\xd9\x97\xc8\xa6\x2a\xc8\xda\xeb\x1b\xd3\x3c\x22\xd6\x78\xcd\x01\x82\xd1\x56\x67\x7c\x56\x22\xb9\x18\x72\x98\x16\xf9\xe5\x5a\x82\x6f\x7e\x81\xe1\x54\x59\xd5\xa8\x0a\xe1\x1f\x37\xcd\x65\x46\x24\x90\xf2\x38\x0a\xb0\x0d\x80\x3b\xa0\x13\x7b\x99\x90\xde\x28\x8f\x89\x85\x49\x57\xde\x9d\x92\xf2\x58\x50\x63\x2b\x6d\x15\xee\x68\x88\x1e\xec\x0e\x4a\x0d\x56\x86\x32\xc3\xf6\xd8\xa0\x6a\xc5\x63\xc3\x3b\xc6\x8f\xe5\xe9\xbb\xaf\xbb\x86\xfa\xa5\x93\x7b\x9c\x84\x31\xea\xa2\x7c\x6d\xbf\xd3\x22\xbe\xfc\x11\x96\x22\xef\xa5\xa9\x60\x2f\xf1\x88\xcd\xc0\xe6\x67\x18\x4f\x98\x4e\x7a\x6d\x5c\xac\x7f\x5f\xdd\xcc\x61\x48\xc8\xd3\x90\x23\x46\xea\x47\x51\xbe\x6e\x4a\x3d\x83\x37\xf8\xe8\xdf\x49\xa0\x39\x3f\x79\x38\x63\x9e\xee\x85\x15\x3f\x9b\xba\xdc\x36\xe0\xb7\x52\xce\x53\xeb\x22\x50\x01\x8a\x76\x6e\xbd\x29\xed\xb8\x2f\xe6\x07\xcb\xc8\xea\xcf\xbd\x4e\x5e\x72\x2e\x64\x84\xf6\x14\xeb\xe5\x66\xb0\x78\x4c\x26\x9d\xd0\xd6\xe3\xc2\x2f\x40\xb7\x50\x8b\xec\x78\x65\x35\x37\x5f\xdd\x9d\xd6\x79\xb9\x62\xa1\xf5\x24\xb4\x48\xbd\x87\xdf\x27\xdf\xa6\xc0\xca\x3a\xff\xc8\x0e\x87\xa1\xb7\x0f\xe5\x3a\xb4\x2a\x01\xc5\x19\x72\x38\xcc\x1b\xde\xb4\xa3\xe4\xe8\x15\x69\xdf\x8f\x88\x7c\xf8\x7c\x66\xe2\x4d\xae\x59\x88\xdd\xa2\x87\xc5\xcf\xee\xbb\xa5\x64\xbe\x06\x6d\xb7\xcc\x5d\x81\x02\xc7\xfe\xb8\xe6\x22\xed\x55\x1a\xa1\x30\x93\x06\x46\x3b\xc2\x96\xe0\x8b\x3c\x87\x81\xe6\x08\xe5\xa0\x25\x46\x3b\x47\x51\xd5\x4f\x65\xf6\x5f\xf8\x92\xbd\x75\xbf\x5a\x04\xc4\x20\xce\xcd\xb6\x71\x17\xba\x38\x5b\x5a\x95\x55\x47\xc3\xcb\x66\x7e\x28\x35\xd8\x55\xc8\x4e\xe7\xa2\xac\x51\x8b\x77\x26\xec\xf8\x53\x18\xb4\x7f\x54\x22\x8a\x62\xeb\x71\x81\x6f\x90\x0b\xf5\x86\x32\x5f\x93\xdf\x28\x22\x6a\xe1\xb2\x5e\x68\x71\xf8\xce\x88\x88\x5a\x6d\x51\x4b\x82\x86\xd2\xc1\x1f\xab\xee\xc3\x69\x8a\x14\x8b\xd5\x66\xbb\x9d\xe2\x45\x3d\x95\xf1\x4a\xe1\x2c\x1a\xb7\x7f\x44\x64\x88\x12\x5e\x5e\x34\x3b\x3b\x2a\xcd\x2a\xaf\xbd\xb0\xb3\x0f\x87\x04\xa1\xcc\x9a\xea\xb4\x89\x18\xc1\x97\xc7\xf2\x5b\x3c\x8e\x59\x10\x6a\x19\xc4\xb5\x9d\xf4\xb6\x97\xdb\x13\x99\xa9\x20\x60\x73\x39\x25\xce\x75\x1b\x4f\xbb\x3f\x53\x12\xe3\xbb\xb9\xc7\xee\xfe\xcd\xd5\xd6\x2a\x28\x0b\xd1\x5c\xd5\x9c\x55\xbd\x3f\xb7\xe1\x7f\xbd\xaf\xfa\x30\x47\xc4\xa1\xc6\x17\x6e\x93\x1f\xb3\x1c\xac\xd4\xf7\x60\xc2\x88\x98\xd8\xb2\x85\xbf\xfd\xf7\xc5\x01\x23\xc2\x89\x5b\xc7\x27\x39\xad\x88\x13\x4e\x02\xf7\x2e\x75\x3c\x63\x2a\x62\xa3\xf1\xca\x5e\x04\x82\x77\x2a\x71\x04\xdb\x0b\xe8\x12\x6a\x91\x6a\x2e\x2d\xb1\x41\x16\xbf\xc6\x4f\x98\x73\x1e\x9a\x1e\xe6\x70\x9b\xbd\x65\x1a\xf2\x8e\xcd\x22\x38\xb7\xbf\xcb\xd6\x51\x3b\x67\x58\x77\x54\xc4\x12\xfd\x2c\x6f\x9a\xba\x76\x2d\x92\x3f\xb1\x45\x1c\x2d\x1c\x42\x24\xb6\x63\xfc\x45\x9c\x9c\xdd\x83\x33\x3e\xe8\x77\x58\x21\x12\x8d\x9a\x4f\xcb\xa1\xce\xf7\xdc\xfd\x11\x10\xa8\xf6\x64\xaf\x50\xe6\xdd\xaa\x2b\x24\x15\x29\xb7\x55\xb0\x43\x1b\xb9\x3e\x17\xb2\xa8\xc7\xf7\x40\xc5\x02\x1b\xb9\x0f\x8b\x9f\xfb\xe7\xd5\xdd\xea\xf9\x79\x71\xef\xa2\x23\x7f\x16\x25\x0c\x12\xdb\x41\x95\x96\xe0\x86\x52\x3b\xd9\x61\xdc\xc2\xf6\x83\x8d\x08\x26\x7d\xbf\x6d\x96\xab\x51\x73\x55\xe8\x38\x49\x5d\x76\x8f\x4e\xc7\x43\xa9\x9f\xfe\x9f\xc1\x7d\x80\x30\x88\x43\x8f\xe0\x2d\x2b\x98\x2c\xe9\x6e\x54\x1b\x89\xc7\x36\xdc\x2e\x33\x78\x83\xd5\xf3\x72\xbc\x58\xcb\x80\x68\x42\xfb\x8d\xb3\x4d\x80\x6d\x8b\xae\x19\x09\x49\x8c\x4e\x2b\x83\x34\x45\xf1\xa5\x0e\xd1\x1a\x8d\xb9\x33\x32\x10\x56\x46\x60\x18\xd2\xce\x36\x11\xfd\x78\x15\x63\x80\x68\x1f\x84\x13\x94\x0b\x83\xd1\x83\x91\x01\xf0\xb8\xe7\xb6\x6c\x3b\x95\xeb\xf9\x6b\x0c\x99\x75\x9e\xbf\x2f\x0e\x56\x28\xe5\xf3\x6a\xac\x0c\x13\xa6\x1d\x21\xf0\x33\x7b\x2e\x2a\xc3\x34\xc2\x81\x58\x1d\x99\xa7\x93\xc8\x50\x50\x04\x1d\xdd\x17\x87\x9b\xa2\x39\xbc\x4c\x62\x34\x19\x2a\x8d\x0b\x4c\x56\x3d\x5b\x7f\xf8\xf2\xae\xb8\x8a\x40\xfc\x58\x1d\x72\x33\xab\xe1\xe2\xe4\xe9\xfd\x8b\x2d\x23\x4e\xb0\xcd\x6a\x41\x4c\xab\xd5\xad\xea\x2a\xfd\x32\xd2\x0c\x55\xff\xb7\xff\x78\xde\x0f\xfc\xd6\xa8\x24\x86\xc9\xd8\x7f\xa8\x03\x35\x7c\x7e\xaf\x58\x12\x21\x31\xef\x79\xb5\x5d\x3d\x7f\x5f\xf9\xdc\xc1\x3a\xba\xfa\x13\xc7\xd4\xf8\xe6\xee\x8d\xf7\x33\x79\x28\x34\x22\x19\x7f\x40\x97\x2e\xca\x24\x14\x68\x56\x75\x12\xbf\x5c\xd7\xa5\xef\x4b\xca\x84\x33\x2f\xec\xe4\x5a\x1d\x18\xd6\xae\xf2\xba\x5b\x76\x64\x4a\x38\x26\x84\x35\x42\x84\xbb\xbf\x8a\xd8\xb8\xba\xf8\x1d\xc0\x56\xbd\x80\x6e\x66\x28\xe4\xf3\x3f\x90\x03\xc5\x62\xa4\x2a\xb2\xbe\xaf\x22\x45\x68\xc9\xf7\x28\x8e\xf1\x24\xca\xcc\x83\x10\x7e\x40\x36\x2c\x3d\x4b\x91\xc4\x5c\x79\xd5\xfe\xf6\xb9\x2d\x8b\xd3\xb9\xc8\x7b\xda\xb3\x1f\xa7\x8d\xd3\x90\xab\x9b\xd3\x54\x01\x92\x4a\x19\x44\xd0\xbf\x9b\xcf\xe8\x82\x3b\x83\xae\x97\x32\xb4\xc6\x06\x77\xcb\xcd\xfa\x31\x24\x34\x1e\xbb\x4a\xcc\x52\x5d\xdc\x47\x55\xc0\x51\x26\xd0\x37\xa7\x30\x5f\x07\xab\xc6\xea\x87\xa4\x89\xa5\x71\x3b\x49\xdd\xf6\x87\x5a\x31\x28\xe7\x32\xea\xc7\x19\x83\x57\xbb\x90\xbf\x2e\xff\x2e\x2e\x83\xed\x4e\x6a\x26\x02\xed\xc5\x1e\x8f\x47\x21\x8b\x72\x98\x8e\x4e\x26\xbc\x96\xd6\xaf\xb2\xc3\xe2\x7d\x15\xd5\x1d\x6e\x38\xfd\x54\xd7\x8a\x62\xe5\x5b\x17\xef\xf9\xa8\xfb\x38\xfa\x75\x1a\x48\xe8\xb8\xc8\xe3\x32\x89\xd4\xc6\x1a\xe9\xad\x76\xcb\x8f\x12\xed\xc9\x9d\x02\x66\x10\x97\xba\xd8\xdd\xb7\x49\xf2\x7e\xb1\x7b\xf2\x27\x83\x98\x60\x5d\x47\x34\xf5\x0b\xe4\xb5\xf3\x7b\xb0\x6b\x78\xea\xc7\x24\x09\x72\x81\x64\x51\xe6\x77\xe2\x04\xba\x5d\xbb\x26\xcf\xd1\x18\x81\x5d\x58\xab\x93\xb3\x7e\x5c\xef\xd6\x8b\xfb\xfd\xcd\xfa\xf6\xb6\xcf\x74\x55\xa0\xac\x98\xce\x63\xf1\x26\xda\x7b\xfc\x39\x2a\x42\x85\x41\x8a\x75\x7a\xac\x15\x3d\x83\x2a\x4a\xfd\xdb\xc4\x8e\x66\x74\xf7\x55\x44\x35\x46\xf7\xb8\xb6\x3a\xba\xde\xb6\x6f\x85\xaa\x48\xc6\x98\x57\x57\xee\x8d\x1a\x6a\xcd\x8c\x16\xc3\x6e\x91\x67\x13\x7a\x9e\x22\x81\xf2\xce\x63\x77\x00\xe3\x27\xa3\x08\x00\x1a\x66\xd5\x1d\x5e\xd6\x1f\xa1\xb1\x41\x5a\x1d\x76\x3b\xce\xc7\x02\x15\x9a\x70\x3a\xfe\x01\xd3\x7b\xa9\x28\x0f\x2c\xfa\x2c\xab\x5f\x4a\xf1\x7e\x0b\x6f\xc3\x4c\x44\xb1\xc0\x04\xfe\x05\x7f\x82\x72\xd5\x2d\x47\x8a\x31\x83\x0f\xf3\xfd\x75\x94\xbb\xa8\x58\x73\xe1\xd0\x16\x12\xea\xd2\x5a\x4e\x8f\x56\x7d\x95\x44\x80\xca\x1a\xd8\x90\x2e\x8e\xc7\x41\x79\xc4\x9f\x25\x89\xad\x36\xd8\x83\xf8\x35\x3a\x7b\x1a\x00\xca\xc9\x59\xab\xf0\x1f\x6d\x98\xde\x4d\x76\x95\x1a\x2b\x4d\xd9\xae\x8d\xab\xbe\xd9\xed\x0f\xf3\xf6\xfd\x77\x65\x01\x91\xe5\x13\x54\xed\xe4\xf1\x8a\x38\x05\xab\x61\x76\x3e\x0a\x05\xd6\xc3\x6e\x37\xae\x95\xa6\x7e\xac\x24\x38\x77\x10\x7e\xf6\xd4\x86\x3a\xa7\x53\x56\x9f\x3e\x64\xe2\x2a\x01\x16\xd7\x7d\xe8\xfd\xa4\xbe\x3d\xdf\xcf\x35\xfc\x94\x30\x91\xf0\x44\xb6\x42\x5b\xda\xf7\x78\x84\x66\x0c\x6d\x30\x97\xcd\xb1\x6e\x4a\x71\x6c\x27\xfb\x87\x5c\xb4\x21\x95\x6e\x00\x53\xf9\x1f\x41\xf2\x93\x6b\xd4\x20\x89\xdd\xa5\xd7\xf9\x18\x10\xa0\x20\xa4\xa1\x95\xe7\xaa\xa1\xb7\x2e\x7b\x76\x56\x66\x7f\xc6\xfd\xa7\x0a\x18\xc5\x57\xbd\x14\xb9\x2e\x4e\x93\x79\x64\x82\xce\x4b\x79\xeb\x02\xa2\x6d\x76\xc0\xcd\xf9\x77\xe8\xd4\x25\x86\xe7\xd3\x81\x50\x96\xa9\xe2\xae\xe4\x49\x94\xf5\xc6\x58\x57\xf0\xcf\xa2\x19\x1d\x68\xeb\x2e\x2d\xb4\xde\x95\xcd\x75\xed\x40\x07\xc0\x49\xe8\xd5\x70\x17\xc7\xe3\xb0\x2c\xa4\x43\x99\x68\xd1\xfb\x89\xf6\xc2\x61\x8b\xfc\xd2\x5e\x6e\x7b\xd9\x02\x33\xab\xff\xdf\x27\x32\x88\xa4\x75\x14\x25\x08\x08\x7a\x1a\x7a\xc9\x52\x1d\x09\x83\x39\x6b\x05\xc7\x63\x07\x7f\xf1\xec\x2b\x1d\x41\x84\x0f\xb1\x8d\x03\xed\xcd\x1e\xf6\xaf\x34\x09\x24\xee\x6e\x5f\x4a\x80\xfc\xe7\x47\x97\xe9\x07\x13\x50\xde\x9d\x4c\x66\x65\xfd\xe2\xd4\x25\xe7\x43\x50\x4d\x92\x34\x25\xae\xc4\xb3\x6d\xca\xf3\xb1\xa9\x46\x70\x53\x4d\xa3\x98\xa5\x03\x41\xd0\x76\x8b\x1f\x96\xc2\x35\x8d\xac\xe5\xd3\x16\xea\xe6\xfc\x70\xff\xd7\xa2\x17\xcd\x34\x89\xac\x3d\x3e\x4a\xde\xf7\xec\x5d\x1d\x53\x13\x49\x2f\xb4\xff\x56\xbc\xb6\x5b\xeb\xcb\xdc\xfb\xa9\x63\xa1\x31\xf0\xda\x66\xc7\x4c\x15\xf9\xcf\xc1\x76\xae\x63\xa5\x15\xed\x4a\x25\x07\x18\x88\x61\x51\x1d\x6b\x82\x51\xfa\xc9\x2f\x00\xe5\x71\xdb\x18\xd3\xd1\xfe\x74\x6c\xac\x77\x98\x53\x80\x7c\x11\x79\x9b\x9f\x7d\x7e\xe3\x93\x20\xc4\x08\x07\x37\x85\x4e\xda\x16\x6b\x0f\xe3\xcb\x4e\xa2\x14\xdb\xa7\xeb\x6a\x69\xab\x53\xe3\x57\x4b\x27\x32\x44\xf9\x81\xac\xb2\xf5\xe0\xc9\x64\x4f\x43\x81\x01\xc3\xf2\x58\xbc\xe7\xcb\xa2\xab\x08\xe8\x34\xb2\x4b\xf0\xc3\xf2\x2e\xab\x3f\x5f\x85\xae\x02\x1a\x9d\x52\x8d\x6a\x1d\xbe\xfc\xb6\x7d\x29\xae\x84\xb9\xdc\x50\xee\xcc\x1c\x1e\xd6\x8f\xeb\x87\x6f\x0f\x1d\x33\xc5\xe5\x57\xfb\xf5\xe3\xfe\xc7\x6a\xed\xaf\x8a\x87\x52\x5b\xef\x3b\x64\x37\x6f\xce\x59\x3e\x30\x7f\xfb\xe0\x1b\x22\x19\x7a\xe1\x13\x94\x36\xc8\x3f\x50\x55\xa5\x9a\xc7\x02\x3b\x85\xe6\x28\x0e\xa3\xc0\x55\xf3\x84\xe2\x2b\xf7\x08\xa3\xde\x8c\xe6\x52\x23\x71\xdc\xad\x07\xfd\xec\xea\x1e\x00\x37\x0c\x6b\x04\x43\xa4\xd9\x42\xeb\x2d\x78\xb3\xbf\x8d\xfc\xf7\xe7\xd9\x87\x96\x24\xe1\x61\x2f\x47\x33\x58\x7c\x3f\x22\xb6\x8c\x39\xc7\x5a\xa5\x80\xef\xa5\xa5\xed\x62\x6f\x04\xb6\xb9\xf8\xa0\x97\xa9\x95\x88\x71\x1b\xac\xa7\x16\x49\x54\x2b\xa9\xb0\xb4\xa7\x2d\xd9\xb2\x53\xcd\x1e\x9f\x40\x87\x6c\xd0\x35\xbd\x17\xb9\xad\xad\x8d\x6b\x3d\xa3\xfb\xab\xa3\x18\xa5\x33\xb2\x3c\xab\x7f\xff\x63\x39\xe4\xc3\xf9\x11\x4c\x63\x17\xe6\x3e\xab\xc1\x82\x1c\x27\x4d\xd1\x3f\x5f\x59\xfb\x1b\xa2\x93\x20\x31\xbd\x07\xc2\x3e\x2f\xf4\xf5\x8a\x3d\xbe\x40\x1e\x61\xd2\xb6\x03\x71\x9d\xb8\x68\x30\xd6\x2f\xdc\x1a\xa5\x8d\xf5\x97\xa9\x36\x81\x8a\x75\xaf\xe0\xea\x9e\xfb\xa7\x61\x8b\x36\x61\x27\xb1\xb7\xda\x7d\x7d\x04\xd0\x4f\x62\xde\xe7\x8d\x6a\x13\x87\x5e\x87\xd8\xf3\x42\x26\x6e\xf7\xd3\x0f\xa4\x1c\xc3\x96\x13\x54\x95\x38\xc0\x4d\x21\x4a\x1d\x8e\x27\xbc\x11\xda\xb7\x47\x1d\x7e\x71\x72\x7d\x8a\x22\xb4\x1f\x29\x60\xe2\xf8\x20\xf2\xa6\x52\x65\x76\xae\x27\x1e\x90\x76\x38\x84\x91\x41\xb0\xbe\x7b\x4f\xba\x1f\x3d\xbc\x2c\x08\x13\xc0\xfb\x84\xc6\x96\x37\xcd\x65\x50\x06\x83\x90\x4b\x64\xd2\x7e\x5d\x3c\xef\xf6\x8f\xab\xdd\x8f\xcd\xf3\xef\x3d\x68\x0a\x48\x40\xb1\xcc\xf5\x08\xef\x7f\x14\xe5\xeb\x60\xf1\x06\x12\x71\x2c\xa0\x55\x8d\x6c\x3e\xd2\xd7\xa4\x40\x93\x10\x51\x57\xfb\x0a\xea\x41\x5f\x61\x88\x09\xf5\x23\x53\x1a\x76\xea\x88\xbb\x62\x55\x77\x4a\xec\x9b\xa6\x3e\x37\x7f\x4d\x80\x97\x42\x9c\xa4\x32\xed\xec\x40\x66\x04\x2c\xdd\xb8\x84\x11\xa4\xd7\x3c\xc2\xaf\x7a\xe4\x57\x31\x19\x96\x84\x08\x61\xda\x42\xae\xbb\x98\xe0\x4a\x78\x6e\x7c\x09\x49\x1a\x21\xc9\xe3\xb6\x67\x75\x40\x22\xb9\xea\xe3\xf2\xc5\x9b\xc8\x8e\xd6\xa7\x65\x29\xaa\x97\xa2\xf1\xd5\x06\x48\x23\x22\x48\x27\x33\xf1\xdd\xf6\xc7\xb1\x92\xf7\x3f\x85\x9c\x90\xca\x04\xad\x9b\xce\x58\xc8\x5e\xef\x36\xfb\x77\xc8\x9e\x46\xbe\x19\x14\x52\x08\x2c\x37\xaa\x4d\xd1\x90\xf2\xb4\x18\x67\x9e\xe3\xdf\xc5\x03\x88\xac\x83\xf9\xce\xa3\xf3\x80\x93\x88\x0f\xf3\xfe\x6e\xff\x06\x91\xc8\x20\xf5\x2c\x14\x14\xcd\x56\x4b\x71\x16\x12\x95\x64\x26\x92\x28\x43\xf5\x44\x0a\x42\x70\x33\x58\xfc\x17\xf9\x87\x78\x20\x90\xa1\x17\xf5\xc2\x2a\xec\xb6\x2b\xdb\x80\x8c\x42\x63\x10\x08\x9e\x6b\x28\x17\x59\xa9\xcb\xe2\x3c\xfa\xf5\x92\x86\xa9\x4b\x03\x6f\x82\x5f\x57\x14\x85\xcf\xbb\xba\x20\x29\x43\x70\xc1\xcd\xfd\x66\xf9\xfb\x6e\xfd\xb0\xda\x7c\xdb\xf5\x67\xb6\xf6\x3e\x56\xc0\xbc\x0d\xec\xbf\x16\x4d\x79\x38\x8a\x81\x6b\xd4\x20\x3f\x02\x29\xac\x5c\x9d\x5d\xd7\x6d\x42\xfe\x09\xb3\x11\xa4\x62\xf8\xdb\xde\x8a\x1a\xbe\x4d\x38\x19\xa0\x03\x49\xdd\xcf\x5a\x3e\x8b\xd9\xcf\xeb\x48\x59\x8a\x91\x77\x13\xd8\x65\xc7\x63\x47\xa0\xf7\x83\x52\xce\x83\xee\xa2\x9e\x8a\xe2\xe8\x2e\xa6\x63\xca\x8c\xbf\x17\x82\x88\x19\x1f\xdf\xfb\xa6\x94\x3f\x16\x6a\xee\xac\x42\x07\x76\x58\x14\x80\x5a\x3e\x83\xa5\x75\xde\x0c\x0b\xa1\x7e\x04\xb7\xf9\x91\xd0\xba\x03\x79\xcc\xaf\xbe\x00\xdc\xd8\xcd\xe2\x57\x56\xb9\x09\xf7\xbb\x77\xaa\xbe\x7a\x47\x41\x31\x61\x3b\x88\xf5\xa6\x7f\xfb\x8c\x32\xde\x5e\xd0\x31\x32\xd7\xb9\x29\xca\xd3\x0c\x55\xc3\x04\x34\xc2\xa5\xd1\x3b\x94\x1e\x17\xe5\xe9\x83\x9d\xc4\x04\x71\x84\x60\x3e\x67\xb9\x89\xd9\xf5\x9c\x96\x92\x09\x94\x40\x54\x40\x91\x1f\x2f\x3b\xa8\xea\xed\x90\xd0\x32\x39\x27\x48\xf0\x9e\x09\x20\xce\x45\xfe\x28\x3f\x90\x7b\x30\x61\x48\x85\xc3\x43\x6c\xcc\x0d\xb2\xd5\xcb\x9e\x0d\x65\xc2\x50\x20\xe8\xcd\x3e\x69\x24\xd2\xe5\x97\x39\xf8\xbb\x89\x20\x46\x38\x76\xa6\x3e\x00\x45\x99\xc8\x84\xbd\x98\x17\x34\xa7\x47\x91\x7b\x24\xaa\x21\x3c\x91\xae\x90\x7b\x5f\x14\xb5\x0f\xac\x67\xd7\x71\x43\x74\x2c\x7b\x93\xd5\x95\xd5\x9b\x47\x99\xfa\xf9\x5b\x4c\xb4\x46\x80\xff\xfe\xd0\xd9\x89\xfb\xef\x65\x81\x95\x19\x3f\x40\x3d\x6a\xe8\xbb\xc3\x31\xe1\xb6\x92\xd1\xe4\x91\xff\x48\x2c\x84\xff\x08\xc2\xce\x9d\x8c\x77\xdf\xd1\xe8\xbf\x38\x21\x11\xf7\x5e\x5e\xf5\x35\xc5\xd8\x24\x54\x1a\xe7\x24\x36\xf0\xc0\xf1\x5f\x94\x24\x12\x4b\xed\xff\x2e\xb2\xfc\x8b\xe8\xb0\x10\x86\xc7\x02\x8b\x16\x87\xec\x0d\xc4\xbb\xb8\x0c\x24\xd9\x8c\x48\x89\x72\x68\xbf\x6e\x4b\xdd\xfd\x9a\xfc\x2a\xc1\x03\xc4\x1d\xdd\x82\x6e\x54\xbd\xb8\xd9\x7e\x70\xdf\x84\xa2\x4c\x8f\xaa\xeb\xf3\x91\x93\x91\x81\x44\x88\xe5\x59\x5c\x36\xd7\xbb\x71\x37\x48\x63\xe7\x16\xf3\x2b\xc4\xf2\xfa\x8b\x96\xdc\x75\xaf\xac\xfa\xa1\x13\xbc\xf7\x07\xc1\x6a\x5b\x6b\x78\x1b\x04\x81\xf3\x33\x4c\x82\x0c\xf9\xc0\xae\x75\x0c\x78\x19\x46\x47\x46\x31\x6b\x4b\xda\xc6\x27\x3f\x20\x1b\x69\xbf\xb9\x21\x5a\x2a\x5c\x4a\xbf\x67\xf0\xee\xbb\x94\xed\x5a\xb7\xea\x0b\xd7\x06\x4c\x82\x78\xc0\xc5\xd3\xf2\xb3\x4e\xa1\x31\x71\x80\xd2\xcc\xdf\x9e\x6f\xfc\x47\x4d\x9a\x62\x1a\x66\xd3\xb5\x0f\x0b\x5e\xc6\xe8\x50\xf6\x66\xa2\xdb\xba\xdd\xcc\x0e\x1f\xf4\x25\x27\x80\x91\x11\xc4\x62\x98\x23\xb1\x20\x70\xd1\xe1\xc1\xa9\x27\x0e\x91\x7a\x2c\x08\x48\xe0\x0b\x91\x0f\x97\x49\x87\x96\x05\x01\xb3\xc4\x8a\xe5\x66\xfd\xf8\xfd\xb9\xfb\x2b\x67\x29\xf5\xe1\xeb\x40\xe7\x83\x05\x81\x12\x58\x08\x15\x55\x95\x1d\x72\xa7\x2b\x3b\xf7\x63\x59\x10\x68\xed\x34\xd0\xdb\x35\x26\x3f\x20\x08\xa8\x18\xcc\xa9\x2b\xcf\x0b\x16\x04\xce\xd2\x55\x36\x17\xd4\x37\xb2\xab\xd3\x28\x24\xe8\x7e\x76\xc8\x19\xe2\x91\xcf\x45\x71\x1c\xda\x6f\xb8\xc3\x51\xa0\x30\x05\xd0\xe2\x52\x3d\x64\x79\x53\x43\xb5\xcb\x8e\xc8\xbe\xba\xf4\x70\x24\x16\x44\x2c\x8e\xac\xe7\x41\x79\xea\x6e\x4b\xa4\x25\x4f\x7a\x1f\xc8\x61\x70\xcf\x02\xd2\xae\x7f\x7d\x9f\xc5\xf2\x27\x70\x2e\xdb\xe9\x3e\xcf\x7f\xf4\x1f\xd6\x04\x97\xfe\x87\x4b\x3b\xff\x46\xc5\x6c\x16\x10\xe0\x34\x1d\xd2\x7a\xac\xb2\x62\x0d\xbf\xea\xbd\xf3\x1d\xdc\xdb\x50\x6f\x72\x45\x60\xb8\x5b\x72\x97\xed\x94\x2a\xca\xcb\xea\x4d\x1c\x9b\xd9\x17\x6c\x36\xa2\x66\x01\xe5\xcc\x50\x5f\xd9\xeb\xc3\xe9\x3e\x0c\x63\x01\x55\x12\xcd\x38\x5c\x6b\xe7\x06\xba\x9b\x4d\x41\x78\xdf\x69\xcb\x93\x73\x7f\x6f\x4f\x4b\x7c\xb4\x3f\x10\x2d\x1e\x7f\x35\x53\x21\x46\xcd\xed\x79\xff\x2e\xd4\xeb\xb9\x68\xcf\xed\xd3\x13\x16\xc4\x84\x31\xe5\xcb\x50\x76\xb3\xee\x0e\xd1\x00\xed\x89\x6e\xb2\x5a\x15\x59\xfe\x7d\xe0\xf5\xc6\x82\x98\x05\xdc\x79\x54\xba\x10\x1b\xbb\x14\xb3\x02\x97\xee\x23\x49\x64\xbd\x59\x51\xf8\xc7\x4f\x58\x77\x2c\xe5\x84\x5f\x31\x92\x3f\xf4\xa5\x62\x01\x97\x21\xb6\xfd\x6b\xa8\xea\x31\xfd\x1b\x8f\x61\x4b\xfc\x98\xbd\x7e\xe8\x08\xf0\xb7\x19\xdb\x46\x16\x88\x80\xe2\x73\xd2\xa2\x16\x4f\x50\x7e\xab\xb4\x3f\xa7\x20\xd6\xad\xec\x3c\xd0\xd5\x9a\x7f\x35\x25\x09\xe2\x61\x85\x69\xba\x25\x4c\x46\xc7\xac\x67\x30\x60\xf4\xf6\x6f\xe1\xa1\x08\x2c\x90\x49\x18\x79\x35\xd2\x7b\x4f\x68\xaa\xee\x8a\x72\x67\xb7\x80\x6e\x9c\xb4\xde\x15\xed\x1c\xed\xda\x9b\x7f\x25\xcb\x61\x81\x92\x69\x6a\xcd\xfc\x32\x65\xd5\x1d\xcf\xc7\xac\x5f\x93\x34\xb5\xeb\xbf\xb5\x22\x7b\xf2\x64\xef\xab\xd4\x86\x05\x40\x52\xd5\x3e\xc1\xb5\x1c\x7a\xdc\xb3\x00\x52\xbb\xb9\x57\x50\x6f\xeb\xe2\x7c\x06\xdd\x27\xcf\x2c\x30\xb1\xc4\x5e\x78\x07\x30\x9b\x28\xa8\xb5\x23\x34\x71\x20\xa4\xf6\xeb\xa7\x16\xe0\x2c\x30\x89\x42\xb2\xfc\x40\x69\xc8\x1b\x3a\xb3\x30\x88\x92\xc0\x2b\x2c\x3e\x43\x8e\x68\x96\xae\x96\xc8\xc2\x80\x10\xed\x8a\xb0\xbb\xe6\x7c\xec\xfe\x1e\x72\xab\xfa\xf9\xf4\xed\xe6\x7e\xbd\xdc\x6f\x17\xf7\xab\xed\xde\x3b\x7f\xed\x57\x8f\xb7\xdd\x40\x09\x88\xf0\xf4\x73\x70\xbd\xdc\xac\x44\x99\x67\xb9\x17\x69\x62\x61\xa8\x14\xe6\x91\xb7\x8b\xf5\xfd\x1f\x7d\x15\xf1\x7e\xfd\xe0\x85\xe0\x59\x18\x9a\x18\x4b\xbc\x76\x1a\x34\x17\x6c\x34\x60\xa1\xe6\x4a\x0b\xbe\x7b\x74\x21\xa5\x56\xad\xd9\xee\x78\xdf\x2a\x28\x6f\xb2\x62\x46\xcc\x9b\x85\x4c\x86\x58\x2c\x47\x76\xcb\xe8\xee\x85\x4c\x02\xe1\x83\xba\xf7\xa3\xf8\x00\x3a\xcc\xc2\x38\x91\x51\xec\x29\xff\xe2\xd8\xce\xc1\x71\xa3\x88\x85\x49\x60\x10\x4c\x81\x51\x9e\x07\xbc\x2e\x0e\xc3\xe9\x38\xfe\xfa\x24\x64\x38\xc3\xa1\x69\xb3\x3c\x71\x92\xdd\xba\x17\x26\x52\x61\xdd\x43\x89\xa3\x7a\x2a\xb2\xbc\xde\xbe\x88\x53\xf6\xd7\xa4\xb6\x58\x98\x46\x12\xc5\x64\x11\x1a\x32\xc1\xdc\xb2\x30\x65\x21\xe6\x44\xa6\x28\xdb\x5d\x76\x9e\x8d\x36\x39\x23\x0f\x22\x5c\x49\x8d\x33\xdb\x1c\x85\xa1\x2c\xe4\x24\xc2\xdd\xbe\x0d\x62\xdb\x67\xe1\xc1\x85\xc3\x82\x1b\x0b\xb9\xd4\x6a\xac\x89\xb0\x7d\xb8\xbf\xde\xd2\xfc\x68\x63\xf9\x21\xe2\x58\x43\xf9\x25\x7b\x83\xdf\x45\x79\x12\x53\xf5\x48\x16\x0a\x69\x3b\x27\x4e\xbe\x5a\xfc\xda\xfd\xfa\x22\xaa\xc9\x20\x15\x59\xff\x85\xaa\x86\xf3\x26\x1f\x49\xb7\xb1\x50\x39\xbf\x03\x67\x39\xbc\x0f\xa3\xd1\x2e\x18\x62\xcc\x8c\x45\x1c\xd5\x94\x59\x9d\x41\xb5\x27\xfe\x37\x41\x68\x6d\xec\x54\x09\x30\x94\x75\xfd\x8b\xfd\x25\x7f\x16\x2d\xb0\x1d\xb0\x78\x58\xfa\x13\x1b\x26\xac\x54\xe1\xea\xe7\xc3\x27\x38\x0a\x3b\x3a\x8a\x88\x45\x99\x5d\x37\x26\x6e\x2e\x5b\xc8\xa7\x1d\x06\x16\x11\x26\x02\x3a\x90\x56\x1d\xfa\x32\xb2\x88\xc6\x56\x48\xfc\x3f\x0d\x94\x17\xd7\xae\x72\x87\x58\x40\xe2\x8e\x0f\xf8\xa3\x14\xe7\x33\x94\xe3\x68\x23\x62\x2c\xc0\x9e\x2a\x5e\x76\x1b\x8d\x7c\xda\x55\x61\x11\x13\x02\xa9\x37\xca\xfb\x82\x09\xab\x1e\x94\x0d\xa4\xaf\x59\x14\x07\xe0\x45\x07\x5d\xb3\xc6\x57\x37\x46\x77\x22\x96\xd6\x3f\x61\x8f\xac\xc1\xee\xc3\x2a\x40\x5c\x5b\xf3\xd6\xff\x85\x22\xd3\x7f\xaf\x21\xbf\x38\x53\xb6\x2d\xa8\xb2\x7b\x07\xa3\x58\x13\x12\xf9\x7c\xf3\x90\xa9\xf1\x94\x8a\x62\x10\x1e\x3d\xf0\x20\x7e\xb5\x21\xd4\x33\x08\x5d\x3d\x41\x89\x4a\x17\x6e\x54\x1a\x28\x2b\xdb\xdf\xd9\xb6\xdb\x3a\xff\xfc\x32\x13\x71\x11\x24\x8e\x3a\x37\x2d\x44\x5b\x18\xc7\x74\xbc\x06\xcb\xc1\x6e\xe4\x26\xff\x5a\x1c\x27\xef\x7a\x24\x08\x8b\x5c\xf0\xb5\x18\xc4\x5d\x03\x52\xd6\x44\x79\xf6\xe3\x25\x37\x12\xcc\xe0\x1c\x43\xad\x69\x0b\xb9\xf5\xbf\x52\x24\x56\x2c\xb3\xb3\x39\x08\x27\xd3\x4d\x24\x90\xc6\x7e\x7e\xda\xe8\x1e\xf4\xe2\x57\x06\xd5\x60\x43\x8c\x24\x49\x55\x9f\xc6\xb4\xa1\x55\x51\x2e\xce\xe7\xa3\xab\x27\xba\xa4\xef\x13\x6a\xf8\xec\xbb\x21\x99\x42\x03\xdb\xbd\xd0\xfa\x1e\x0e\x59\xfd\x2c\x26\xcc\x69\x16\xc9\xc4\xce\x9a\x9f\x3b\xbf\x2d\x45\x32\x15\x81\x83\x42\x7e\xcf\x72\xb8\x88\x52\xaf\xda\x0b\xaa\x60\xe8\x1b\x31\xba\x6f\xb3\xdf\xce\x81\x06\x03\x86\xb9\x4d\xe5\x2c\xc1\xdc\x0d\x51\xed\xec\xf4\x05\x4b\x27\xfb\xac\x06\x52\x0c\x6e\x18\xd0\x18\x6b\xc9\xa6\xa9\x9b\xd2\x12\x0b\xed\xfa\xea\xe9\x95\x6e\x9c\x49\x42\x0c\x5b\x4e\x17\x2b\xcd\xdb\xfd\x9d\xdb\x5a\x7a\xd5\x79\xd0\xf7\x0d\xc4\xd9\x17\x93\x04\x01\xb5\x74\x49\x9c\xb2\xee\x43\xd8\x4c\x9b\x83\x1b\x32\x12\x24\x32\xb0\x7a\x5d\xd9\xc0\xf7\xf3\xb7\xc9\x49\xd3\x04\xcb\x45\x7f\x5f\x3c\x7e\x73\x48\x56\x46\x42\x00\x14\xc0\xc9\x94\x35\xb8\x0d\xfd\x81\x28\x20\x41\xd0\x59\x7b\xda\x1a\xb1\x3c\x3a\x39\x82\xc5\xe3\xd3\x6a\x3b\x39\x7d\xc4\x63\xa4\x3d\xef\xd5\xcb\xeb\x16\x8e\x47\x28\xef\x4f\xf5\x3c\xea\x80\x91\x48\x1b\xef\x35\xb7\x2c\x85\xa9\xe7\x7b\x40\x7e\x30\x50\x04\xf3\xfb\x27\x69\x31\xb4\x73\x85\x38\x46\x88\x0e\x30\xb6\x72\xfa\xe7\x15\x94\xf7\x22\x3f\x2c\x6c\xf5\xfa\xb7\xf1\x5d\xa3\xa9\x85\x4b\x56\xcd\x69\x63\x7e\x40\x76\x78\xf1\xc2\xaf\x8c\x50\x1e\x07\x71\x57\xe1\xbc\x05\xa1\x77\x4d\xe9\xba\xcd\xa1\xff\x15\x2c\x8a\xb1\x0b\x7a\xf3\xed\xff\xfe\xcf\x7f\x90\x91\x84\x3b\x30\x8e\xbf\x6f\x5f\x44\x85\xe6\x48\x7d\x69\x8f\x11\x16\xcb\x44\x7b\x02\x33\xb2\xae\xf6\x9d\x09\x6b\x7b\xd4\x40\x0f\x19\x76\x5b\xff\xe7\x91\x02\x61\x3c\x40\x92\x99\x76\x0a\x35\x1e\x2a\xe8\x0e\xc7\x34\x42\x18\x87\x29\x4a\x05\xda\xca\xbb\x7c\xf0\x70\x62\x45\xb0\xd7\x8d\x52\x5b\x4f\x68\x98\xfd\x5e\x8c\xdf\x09\x92\x04\x3c\xf0\x15\xd7\xbe\x29\xf2\x3a\x52\xb6\x64\x24\x61\xc2\xe7\x79\x5f\xb3\xc3\x0b\x94\xeb\xbc\xaa\x07\x3b\x16\x49\x14\x41\x02\x2c\x06\x4c\x6d\xb2\x61\x79\x32\xdd\x61\x37\x4d\xac\xa9\xe9\x7b\x56\xd7\x50\xae\xf5\xda\x3c\xb6\x7b\xbe\xde\xbd\x40\xbe\xad\x41\x1c\x97\xa2\xd4\xed\xcd\xee\x46\x5c\x71\x45\x9a\x59\x9e\xec\xe4\x27\x41\x48\xc2\x21\x7f\xf0\x41\xd4\xea\x05\x73\xcb\x7d\x17\x2c\x85\xb4\xaf\x00\x84\xa9\x2b\xd7\xfe\x33\xfd\xd7\xdf\xae\x14\x10\xaf\xff\xeb\xbe\x27\x25\x0c\x73\x93\x65\x71\x86\xa3\xf0\x14\x50\x46\xd2\x44\x60\x94\x26\x9b\x0b\x1d\x04\x67\x1f\x96\x8b\x3e\xfc\x02\x2e\x02\xec\xf0\x6f\xb7\xb7\x6e\xd1\xf3\x30\xe0\xf6\x58\x84\xe1\xb4\xa8\x2a\x28\xeb\xd5\x7f\xc2\xc0\x41\xcd\x83\xbf\x8d\xfe\xed\x5e\x12\xc1\x25\x72\x98\xad\x1e\xe8\x13\x94\x4b\xc8\xfb\xd7\x44\x08\x40\x1a\x99\x7a\xda\x75\x7f\x92\xd6\xc4\xb6\xaa\x8b\xb3\x25\x61\xf7\x1b\x0d\x91\x51\x8c\xd0\xce\xce\x41\x65\xef\x3f\x26\xa9\x90\x36\x2e\x3a\x9d\x9a\x3c\xab\x2f\xd3\xae\x32\x23\x92\x5b\x58\xcb\xd9\xaa\x29\xf4\x3c\x0e\x46\xa4\x8c\x91\x32\xb4\xaa\x5f\x6e\xb2\x5a\x74\x7f\x56\x71\xe0\xed\x2f\x31\xcd\xf4\x19\x5f\xb7\xcc\x49\x00\xec\x1c\x64\xd5\xc6\x29\xc9\x87\xee\x88\x8a\x43\xbb\xb5\x1e\x45\xf5\x32\x31\x6d\x60\x44\x09\xa2\x7c\xe8\xea\x2c\x81\x27\x06\x2e\xe3\xca\xe6\xdf\x06\x37\x41\x01\x67\xae\xd3\xb3\x39\xbb\x9a\xf7\xfc\xca\xa7\x25\x60\xf4\x74\xb6\x61\x52\x9f\x22\x13\xe0\x31\x91\xde\x7e\xb6\xfc\xa0\xf8\x41\x4c\xa8\xa4\x2f\x12\x67\xfa\x2a\x84\x27\x26\x8d\x02\x2f\x14\x2e\xca\xcc\xdf\x37\x1a\x2a\x81\xc5\xe5\x9b\xcd\xe3\xb7\xed\xfe\x69\x89\xb8\x93\xf5\x72\xf3\xb8\xfe\x07\xa6\xa5\x7e\x5c\x14\x68\x5b\xba\x28\xc5\xfb\xae\x18\xf2\xf2\x87\x8d\xd6\xee\xfb\x68\xc4\x98\x15\x26\x13\x55\x91\xdf\x34\xc6\x4c\x85\x31\x18\x25\x86\xeb\xb8\x17\x2b\x7d\x82\xd2\x64\xb3\xed\x34\x46\x29\x89\xd1\x98\x27\xcb\xdb\x7d\xb2\xf2\x84\xe6\xd9\x9c\x8f\x52\xb0\xf2\x12\x4e\x89\xd4\x46\x85\x13\x81\x79\x46\x59\x2c\x55\x3c\x4a\xeb\x45\x48\xdb\x8d\x77\xef\xce\xea\x2f\x93\x25\x29\x96\x68\x6d\xc4\xd4\x81\xb7\x3e\x45\xae\x30\xca\x00\x22\x24\x1c\x37\x55\x5d\x9c\x66\xca\x4e\x6e\x5c\x1c\x50\xe1\x7a\x13\xfb\x81\x88\xbb\xff\xf2\x98\xc5\x9a\x75\xde\x57\x98\x11\xff\x4f\x69\x0f\x8d\x95\xb5\x85\xb5\x21\x7d\x9b\x86\x40\x69\xed\x85\xc7\x13\x84\x26\x91\x60\xe0\x2a\xf1\x36\x7a\x74\xdb\xee\x67\x3d\x87\xf6\x63\x46\xf5\x22\xf7\x1d\xce\xe7\x03\x32\x33\xa3\x49\xa2\x49\xe2\x4b\x49\x47\x67\x3a\x3b\x7e\xe3\x68\x4a\x38\xbe\x8f\x77\xab\xd5\xfe\x76\xf5\xdd\xff\x59\xc4\xd2\x38\xb1\xfd\xaf\x27\x35\x3f\x51\x84\x0a\xa8\x7b\x0d\xf6\x27\xd4\x27\x1f\x47\x02\x54\xe8\xc8\x49\xf3\xd5\xce\xbb\xc0\xa3\x6b\xdb\x63\xcc\x4b\x3f\x1d\xc4\x09\x94\x28\x75\x96\xd7\xe5\x64\x43\xa4\x32\x88\xc0\x85\x60\xbb\x62\x69\x81\x77\x37\x17\x8f\x3f\x99\x5c\x90\x0c\xe2\xae\xca\x30\xc3\xe1\x65\x54\x05\x04\xe1\x35\x8f\x9b\xcd\xf3\xb0\xb0\x45\x55\x24\xb0\xf5\x9f\x9d\xb0\xc7\xde\xee\x7c\x9f\x2a\x21\x31\xaa\x68\x12\x59\x22\xad\x38\x40\x6f\xd2\xc8\xa8\x4a\x02\x44\x10\xed\xbe\x8f\x49\x80\xed\x11\xab\xfd\xbd\x77\xae\x4f\xcb\xa2\x38\xea\xe2\x3d\x9f\x5e\x64\xaa\x50\xb3\x0b\x4e\x59\xbd\x98\x00\x59\x26\x71\xea\xf4\x9a\xc0\x9a\xb7\x29\x91\xf7\xf1\xaa\xbb\x11\xb3\x31\x09\x55\x60\xd4\x50\xe5\x7d\xbe\x78\x72\x5d\x9e\xa7\x5a\x31\xcc\x16\x9f\x57\x5f\xd6\xdb\xdd\xf3\x62\xb7\xde\x3c\xee\x97\x1b\x6f\x13\xcb\xa8\xd6\x96\xcb\x54\x1d\x33\x05\x74\x06\x0b\xc9\x28\xb0\x94\x88\xb1\xef\xe4\x87\xfa\xdb\x33\x97\x60\xa8\xc6\x25\x6d\x07\x55\xfd\x1d\x4a\x64\x46\xf8\x3a\x06\x0b\xc2\x04\x37\x35\xd4\xf8\xbe\x6c\xb3\xc3\x10\xa9\xe2\xdc\x1f\xfb\x47\x3b\xee\x9b\x4c\xef\xee\xf8\xae\xcf\x27\xfd\x2c\x20\x1a\xfb\xfd\x67\x71\x19\x97\x0f\x58\x10\xc7\x0e\x47\xdb\x2b\xe4\x7f\xf4\x0d\x93\x73\x9a\x80\x3a\x30\x37\x22\x62\xef\x0b\x25\x8e\x23\xc4\x12\x63\x61\x90\x22\x67\xe8\xef\x9b\xfb\xdb\xd5\xe2\xc1\xef\x21\x2c\x4c\x8d\x7d\x40\x16\x7a\xe0\x5e\x1d\x44\x26\x9a\xab\x7c\x91\x85\x26\xc6\x76\xe4\x5e\x34\xf5\xcb\xfe\xd4\x59\x8e\x31\x16\xa5\xd4\x5a\xf9\x66\x87\x7c\x57\x36\x70\x2c\xde\xe0\xe6\xb2\xdc\x6c\x26\x08\xac\xd1\x4a\xcb\x48\x14\x6a\x27\xe4\xf2\x65\x58\x84\xfc\x73\x7b\x98\x6b\x72\x7b\x37\x61\xda\xb8\x36\x70\x77\x12\x7d\xc1\xa6\x26\xe5\x8c\x11\xa1\xb1\x04\x6d\x30\x97\xb1\x7c\x9b\xf1\x2f\xa5\xd4\xf8\xf2\x3a\x1e\x5e\xe4\xba\x8b\xb4\xa7\x43\x13\x86\x2f\xe2\x33\xa0\xaa\xed\x5c\xd1\xaa\x19\xe8\xac\x4e\x1e\x1e\x95\x02\x4b\x04\x65\x1b\xac\xed\xe5\x1e\xc3\xfe\x7d\x2f\x2c\xcc\x18\x35\xa9\xec\x79\x48\xb7\x70\x8b\xf5\x6c\x71\x98\xb5\x49\x67\x8c\x85\x0c\x65\x4a\x96\xe2\x9c\xd5\xe2\xe8\xfc\x2f\x3f\x52\x7d\xfd\xff\xb4\xe0\xf1\xdf\x15\x33\x9c\x79\x85\x31\x9d\x9e\x3d\x63\x71\xc4\x83\xb0\x23\x98\x74\xdc\x2f\x7f\x94\x18\x1b\xe8\xdb\xec\xba\xb9\x86\x99\x31\x16\xab\xd4\x30\x2f\x37\x54\xbd\xac\x6f\xe7\x33\x6f\x96\x44\xd2\xd9\x73\x16\x15\x60\x5a\xef\xbf\x25\x8d\xa2\xc0\xef\xb1\xce\x51\x4a\x6f\xeb\x46\x43\x5e\x2f\xea\x6b\x7d\xd8\xf6\x03\xd6\x19\xbf\x0d\x9c\x1f\xb2\x2e\x89\x62\x22\x49\x22\x3d\xa2\xc0\x59\x2c\xce\x68\x1e\x0b\xc5\x51\x6b\x1e\xf7\xda\x9b\xe6\x78\x1c\xda\xea\x32\x26\x93\x04\x1d\xe6\xce\x9d\xc0\xfc\xb2\xcb\x09\x98\xe4\x06\xb7\xc7\xdb\xf5\x76\x89\x20\xe3\xa7\xe7\xf5\xf7\xc5\x6e\xb5\x7f\x7a\x5e\x0d\xa2\x3d\x26\x55\x60\x3d\xa3\x6f\x57\x3f\xbb\xbf\x69\xc5\x8c\x6f\x54\x9e\xce\x22\x3b\xe4\x98\x31\xa1\x78\xcd\xf8\x56\x29\x2a\xd0\xcb\x7d\x7f\x26\x1a\x15\x59\xfa\xd8\x6f\x7c\x23\x14\x4f\x03\xd3\x29\xc7\x59\xaa\x9f\x5d\xd1\x46\x3f\x59\x71\x95\xba\x4a\xaa\xc9\xca\xd3\x50\x02\x91\x31\xa5\x08\x42\x3a\xff\xbe\xdd\x3c\x9e\x45\xfd\xb2\x2f\xc5\xfb\x5c\xa8\xc5\x74\x68\x90\x38\xb1\xfa\xf2\x65\xbb\xdf\x6d\xf6\x5f\x17\xbb\xe5\xd7\x7d\x78\x5b\x8a\x43\x97\x79\x30\x88\x23\xd1\x07\x8f\x73\x3c\x09\xc6\x20\x89\x98\xec\x25\xa8\x06\x14\x3a\xc6\x40\xc5\x58\x05\x7f\x6f\x23\x49\xb4\xf7\x69\x06\xae\xbe\x78\x9c\x27\x3d\xfe\xb6\xfb\x98\x56\x08\xa8\x73\x4e\xbd\xf8\xf6\x55\xbb\x62\x4e\xfd\x88\x31\x03\x2c\x45\x09\xac\x6a\x51\x55\x85\xca\xae\x4c\xf5\x58\x1c\x98\x98\xc7\xbd\x8a\xd2\x73\x31\xd0\x48\x1a\x3d\xab\x38\x94\x80\x17\xec\xe1\x8c\xf8\x85\x7e\x53\x68\x53\xed\x65\x81\x99\xbc\x77\xf5\xf8\xb3\x96\xf4\xf8\xad\x8d\x43\xb0\x34\x84\x4e\xc8\xa4\x2f\x2d\x8d\xe7\x42\x1c\x89\x30\x0a\x47\xb6\xf4\xd3\x01\x1a\x02\x7b\xdb\x6d\xa4\xe5\xdc\xec\xe6\xc3\x88\x76\xb4\x67\xd6\x2c\x8c\xc9\x8e\xed\x5d\xea\xe8\x11\x2c\x26\x81\x15\x4e\x5e\x1c\xcf\x90\x2f\x45\xf5\xd2\x1d\x60\x94\x76\xbd\xce\xe6\xdc\x61\xec\xdd\x61\x16\x2b\xe5\x4e\xfb\x63\x00\xae\x88\xe3\x58\xe2\xdb\xe1\xdc\x61\x86\xd6\x54\xb3\xec\x3b\x16\xc7\x89\x4e\x07\xed\xb5\xed\xed\x8f\xd5\x7a\xf2\x8b\xe3\x54\x70\x6b\xf6\xfe\x02\xea\x75\xd0\xda\x9f\xac\xc3\x71\x12\x18\x84\xda\x7f\xcf\xaa\x46\x1c\x97\x2f\xc2\x5b\xb6\xf9\xe3\x2a\x80\xa1\xe0\x8b\x2d\x81\x4d\x4e\x92\x26\x56\x3c\xbc\x43\x2c\x6d\x51\xd8\x6e\xcc\x17\x9b\xdc\x65\x9e\xda\x90\xf3\xbe\x38\x6c\xa1\x7e\xca\x54\x51\x59\x8e\xdd\x34\xbf\x88\x45\x20\x50\xd1\x46\x66\x67\xd0\xe2\xf8\xef\xa2\x7b\x14\x82\x32\xe6\xcc\x61\xee\xb3\xbc\x73\x01\xfe\x67\xf4\x2f\x3f\x20\x8e\xfc\x3d\xf7\x08\xc3\x0f\xaa\x8d\xb1\xe0\xd6\x87\xcd\xc7\x6f\xfb\xab\xca\xd7\x68\x4d\x88\x65\x94\x22\x44\xd0\xaa\x1c\xf8\x2b\x92\x09\x4b\x10\x99\xf0\xb0\xef\x3c\x1a\xda\xbf\x26\x08\xdb\xec\x54\x35\x5d\x00\x93\x4d\xe7\x88\xd4\x21\xf5\x16\x9b\x16\x95\xe6\x97\x87\x58\xe9\x84\x3b\x0e\xd6\x23\xbc\x2f\x8b\xa6\xac\xb0\x53\xd6\x6b\x63\x7c\x52\x66\x8f\x75\x14\x21\x96\x36\x37\x13\x63\x23\x16\x6b\x88\x41\x77\x82\x61\x6d\x64\x36\x88\xf7\x62\x20\x41\x9c\x0e\x60\x46\xb7\x45\xde\x9b\xda\xb2\x18\x84\x35\x5b\x3b\x8b\xa6\x02\xa7\xf8\xd5\x1d\x33\x42\x5a\xd7\x64\xf5\xda\x95\xfe\xfc\x41\x13\x25\xdc\x21\x4a\xb3\x43\xbe\x79\xcf\x6d\x65\x04\xd5\xe2\xec\x90\x24\x48\x35\x13\xdd\x02\xf0\x59\xe4\x9f\x84\x69\x8f\xd3\xb3\x2b\xc0\xae\x58\x95\xe2\xd8\xe5\x56\xfe\x36\x26\xa1\xe0\x98\x34\x7d\x15\xef\x22\xcb\xba\xbf\x6a\xab\x26\x63\xcd\xb5\xf4\x00\x6b\x92\x84\x10\xa3\x01\x11\x6a\x17\x62\x8b\xfe\xa6\x31\xa6\x3f\xaa\xa5\xab\x80\x7b\x8c\xed\x97\xb2\x68\xce\xd5\x50\xed\x8c\x25\x51\xc0\x50\xd1\xac\x86\xaa\xee\xa5\x1b\xfc\xc1\xc8\x86\x42\x6d\x20\x98\xe5\x75\x65\xed\x9c\x47\xbf\x76\x3a\x13\xfb\x90\x39\x89\x88\x44\x49\x52\x3b\x0f\x31\x3e\x9d\x8d\x82\x92\xc8\x68\x2f\xc9\x65\x65\x13\xdb\xbc\xb0\x1a\xd2\xb3\x59\x42\xa5\xd2\xf6\xa9\xdc\x17\x42\xff\xcc\x87\x67\x1b\x2d\xfe\x09\x13\xc6\x5b\xac\x6d\x1b\x69\x69\x0c\x28\x39\x58\xbe\x65\x0a\xa6\xfb\x7a\xc2\x8c\x6d\xd7\x39\x18\xaa\x8b\x02\xc6\xcb\x48\x12\x47\x91\x55\x2b\x79\x83\x72\x5b\x8b\x57\x58\x1c\xe0\xa6\x29\xfd\x9c\x49\xe2\xc4\xa0\x0a\x01\xa2\xce\x7b\xbc\xb9\x35\x3e\x18\xa3\xcd\x07\x10\x59\x96\xc4\x5a\x21\x83\x0e\xeb\xe8\x58\x9b\x1a\x61\x1c\x92\x84\x19\x5f\x81\x76\xc1\x53\x2f\x06\xe7\x87\xa4\xb6\xf8\x70\x2e\xdb\xb8\x68\xd4\x39\x4f\x92\x14\x8c\x63\x64\x6f\xbf\x0e\x27\x79\x92\xa4\x26\x48\x86\x3a\x5e\xfa\x0d\x6d\xf0\xf4\x6e\xb1\xb9\x2f\x0e\xc5\x87\x78\x74\xff\x79\x2e\x91\x72\x93\x9d\xc4\x01\xbe\xa1\xc5\x3d\x7a\xc4\x40\x5f\x44\xfa\x67\x18\x4f\x7a\xf3\x49\x22\x2c\xc0\x40\xf8\xae\xa6\x35\x7d\x76\x8f\x66\x72\xcf\x13\x9d\xa4\x6e\x09\xfd\xfb\xd3\x1f\xcb\xc9\xd1\x34\xe6\x28\x63\x61\xb2\xdc\x33\x3f\xa7\xae\x6d\x93\x4b\x4e\x41\xc5\xaa\x33\xe4\x47\x0a\x93\x77\x6d\x09\x83\xe0\x5f\x7e\x94\xa1\x28\x28\x32\xaa\x1d\x7e\x7f\x5e\x6d\xec\xd3\x41\xb9\x90\x7d\xe4\x6f\x23\x37\x1c\x7a\x9d\xc8\x9b\x2c\x17\xe5\xd8\xcf\xbc\x1d\xa2\x71\xef\x75\xb4\x82\x47\xf8\xe5\x02\xe0\xf1\xd5\x89\xc0\x2e\xcf\x28\x66\xe7\xbe\x7c\xf5\xbc\xef\xc5\xec\x58\x22\xc2\xc8\xf8\x72\xf0\xb2\xdd\x3c\xb7\x59\x87\x98\x49\x04\x07\x2c\x7a\xdc\x2f\x76\xab\xe7\xfd\xe2\xdb\x72\xb7\xde\x3c\x6e\x3b\x16\xbe\xd3\xc5\x5b\x7c\x59\x75\x1f\xd0\x0c\xf7\xae\x17\x51\xbd\x58\x82\xee\x7e\xf2\x66\xc8\x94\xe3\x9b\x81\xd1\x96\x45\xc9\x7f\x94\xd5\xfc\x15\xe9\x4e\x96\x48\x0d\x58\x3e\x7f\xc9\x0e\x2f\x50\xd5\x37\x99\x5f\xac\x13\x15\x04\x96\x1a\x2b\x2e\x77\x45\xe9\xe6\xc3\xca\xfb\xae\xb0\x44\x85\xd6\xd8\x5f\x68\xbd\xae\xaa\x66\x12\x72\x27\x2a\x62\x18\x9b\x7f\xcb\x35\x94\x25\x4e\xe3\xe1\x64\x37\x71\x64\xfc\x5e\x8b\x68\xc5\x7b\xc4\xb7\xb8\xfa\xc1\x47\xd2\x25\x2c\x0d\x23\xeb\x70\x8e\x5a\x9e\xd8\x93\xea\xdf\xbb\x34\x24\xc4\xe2\xcc\xda\x90\x77\xb2\xa8\xa4\x24\xb6\xd9\xbc\x8b\x88\xb7\x75\x69\x17\xdd\xd1\x65\xa7\x24\xed\x84\x15\x7b\xe2\xc0\xf8\x12\x68\xa2\xb1\x79\xab\x8a\xdc\x45\x61\xcf\xa2\x86\x6a\xb2\x53\xa6\x4c\xa6\xc8\x19\xbb\x5d\x6c\x86\xbf\x3c\x8d\xa5\x15\xf4\x43\xeb\x5d\x78\x22\xb7\xdd\x01\xed\xb4\x39\xda\x3b\x70\xf4\xbc\x89\xd9\xe5\x39\x6d\x77\x5a\x5f\xee\xb3\xf2\xf1\x88\xb2\x75\x47\x13\x2d\xb1\x00\xe5\x6c\x45\xab\x33\xa8\xcc\x64\x6a\x2f\xb4\xbe\xcc\xef\x89\x69\x2a\x14\x22\x02\xb0\x2f\x66\xf3\xeb\xf1\x39\x53\x99\x5a\x49\x14\xac\xa8\x5c\x85\xd5\x69\xaa\xad\x3c\xeb\x8b\xa8\x7a\x8e\x66\x18\x0c\x97\xd6\x94\x13\x89\xfd\x62\x7c\x3e\x4e\xaf\x74\x20\x37\xc3\x52\x99\x46\x98\x71\x94\x56\x68\xf0\x6d\x20\x0a\x88\x07\xa5\x1c\x27\x86\xb7\x22\x3b\x5e\xec\x14\x18\x3f\x23\x69\x02\x6e\x35\x09\xb0\x2b\x39\xf5\x9a\x68\x77\xc4\x7f\x52\xb7\xbe\xa4\x8a\xda\x86\x54\x95\xd5\x30\x46\x43\xa5\x3a\x64\x48\x3d\xae\x1a\x59\x65\xfa\xf2\x55\x1c\xdf\xb2\xfc\x80\xa5\xa4\xb7\xae\x7a\x9e\x42\x68\x3d\x0f\x3d\x64\xe7\x0d\xca\xfa\xbe\xa8\xab\x9b\x29\xf2\xc3\x8e\xe7\x41\x12\xe0\xbb\xd1\x06\x20\xcb\xe2\x9c\xc1\xea\x17\xa8\xa6\x2e\xb2\x72\xec\x33\xcb\x78\xc0\x43\x04\xdd\x2d\xa1\x94\x50\x36\xd5\x23\xd4\xef\x45\xe9\x81\x95\x3c\x90\x06\x0f\x3b\xe2\xb3\x98\x98\x86\x33\x1e\x68\xe3\x8d\xda\x50\x34\xd0\xbe\x6b\x57\xc5\x23\x1e\x46\x51\xd8\x29\x02\x8d\x0c\xb8\x18\x0f\x49\x8a\x19\xce\x49\x94\xaf\x0e\x9f\xa0\xbb\x63\x71\x62\x62\x3f\x6d\xda\xdd\xa6\xa9\x07\x4a\x25\xe3\xb5\x86\x87\x3a\x49\x5c\xf0\x21\x3c\xb7\x14\xd9\xde\x7e\xc5\xe4\x91\x8a\x28\xda\x7b\x57\x55\x33\x87\x36\x9d\x2f\xd9\xf0\xc8\x30\xa3\x1d\xe1\xa8\x7c\x83\xbb\xe6\x78\x7c\xc8\xf2\x7a\x1a\x9e\x72\xa2\x38\xb3\xce\xf9\x6f\x90\x37\xb6\xbb\xe3\x34\x5f\x33\x28\xef\xb3\x89\x81\x11\xe3\x94\x4b\xd4\x2c\x76\x00\xee\x02\x57\x5c\xd5\xa6\x3d\xfe\x94\x4c\x11\x62\xd1\xe8\x65\xbe\x6d\xce\xe7\xe3\x64\xaf\xe1\x31\x77\xfc\xf8\x52\xe4\x63\x68\x16\x8f\x55\x1a\x5b\x9d\xe2\xc3\xe1\x08\xb6\x81\x3e\xea\x56\xf3\x24\x4e\x91\x03\x68\x03\xa1\x71\xfb\x82\x27\x32\xc6\x6d\x71\xe5\x39\x78\xed\x9f\x52\xe5\xe2\x6f\xf4\x94\x9d\xcc\xa6\x44\xc5\xf8\x06\x79\x66\x0c\x6c\xcf\x42\xf5\x9a\xcb\xe1\x64\xb1\xe5\xa9\x00\x9c\xa7\xbb\xd5\x76\x68\x8e\xcc\x78\x2a\x23\xc5\x3a\x77\x70\xc7\x13\xda\x76\xd8\xdf\x6e\x98\x12\xa8\xc1\xb5\x58\xee\xd6\xdf\x57\xfb\xfb\xcd\xe2\x71\xbf\x5c\x3c\x2e\x57\xf7\xab\xdb\xfd\xcd\x1f\xfb\xfb\xd5\xe3\xed\xea\x79\xbf\xdd\x2d\x76\x1d\x7e\x84\xa7\x3a\x12\xb6\x7a\x3b\x22\x0e\x7c\x00\x7c\x1e\xdf\xec\x54\x53\xf4\xef\xa8\x5c\xf4\xe2\xfe\xcc\x23\xb0\xce\xa7\xd5\xb6\xc9\xea\xb1\x94\xa8\x1f\x12\x33\x44\xca\xee\x5e\xe0\xe1\xfe\xe1\x16\x4e\x3e\xa4\xe7\x02\x2c\xa4\x27\x2f\x6a\xa8\x7a\x7c\xba\x3b\x2a\x59\x27\xcf\xea\xfd\xb5\xd7\xda\x95\x33\x6a\xc8\xb1\xd4\x37\xca\xda\xb8\x14\x81\x36\x5d\x9f\xd7\x76\x2a\xfa\x76\xce\x20\x58\xe7\xca\x84\x18\xd0\xfd\x80\xc5\xd3\xe6\x87\xdf\x78\x39\x90\x10\xb4\x5f\x6d\x56\xbb\xaf\xdb\xce\x42\x99\x71\x88\xa9\x97\xe5\x7c\x2e\x8a\x7a\xf2\xfc\x4d\x98\x52\x8f\x14\x84\xbc\xde\xdb\xae\x53\x77\xd0\x20\xeb\xe0\x5c\x16\xe7\xa2\x12\xc7\xea\xe6\x82\x2f\xc8\xcb\x48\xd5\x60\x72\xc3\x4d\x94\xa2\x2a\x7f\x66\x8b\x83\x36\x8a\x9a\xdd\xb9\xb9\x21\x09\x74\xd6\xa3\x97\xa5\xc8\x2d\xf3\x13\x95\x52\xa7\xc2\xd4\x8c\x1b\x0a\x71\xea\xfd\x58\xb3\xbc\x5d\x2a\x16\x65\x9d\x0d\x36\xc4\xd1\x4d\x35\x4c\x61\xca\xb4\x39\xc1\x41\x3c\xf6\x35\x7c\x6e\xb8\x52\x89\xaf\x79\x1f\x3d\xce\x10\x5f\x75\x3f\x42\x03\xe2\x72\x96\x25\xe8\x62\x7d\x4d\x67\x1b\xff\x62\x11\xb0\x18\xf7\xb9\x85\xd6\x9b\x32\x3b\x64\x93\xb4\x44\x84\x29\x50\xe5\xa5\x73\xf2\xab\xed\xf6\xe3\xa6\x8e\x88\x02\x8a\x28\xb5\xc5\xef\xce\xcd\x93\x09\x12\xda\xbe\x7e\x6f\x0c\xbe\xf8\x40\x9d\x8e\x09\x42\x35\xb6\x2d\xbf\x3f\x2d\x83\x5f\xdd\x09\x64\x42\x3c\x13\xc0\xda\xb1\x8c\x17\x11\x41\xc3\x18\x69\x21\x06\x6a\xf5\xf2\xbd\xa8\xe1\xb1\x39\xdd\x15\xe5\xd2\xf3\x41\x6f\x2e\xdb\x5c\x9c\xab\x97\xa2\x1e\x71\x32\x27\xdf\x4d\x93\x28\xb6\xd8\xc5\xd3\x7a\xb9\x89\xba\x93\x0b\xa2\x9c\x19\xa9\x7e\x06\xe5\xf8\x20\xe3\xfb\xc5\x82\x58\x07\x8e\xc4\x55\xe4\xab\x5f\x28\xeb\x37\xc4\x44\x09\x46\x34\xf6\x41\x17\x18\x3f\xef\xb7\xab\xfb\xfb\xfd\xe6\xee\xae\x0d\xa9\x97\xcb\xd5\xd3\x6e\xe5\x23\x28\xc1\xd2\x08\x41\x06\x8e\x7c\x82\xe5\xa1\x71\x47\x4a\xc4\x24\x92\x9e\x45\x6a\x61\xf8\x5b\x71\x84\x19\x8a\x23\x13\x71\x4a\x10\xcc\x2e\xb4\xee\x39\x51\xe3\xdf\x1d\x2b\x9e\x88\x09\xff\xee\xa1\xd0\xd6\xf0\x6a\x46\x00\x89\x89\x84\x18\xed\x4a\xef\xed\x0e\x08\x7a\x5c\xa9\xf0\xa3\x24\x43\xa8\x5c\x55\x18\xb4\xa3\xb3\x4d\xd3\x6e\xdb\x15\x69\x48\xa3\xd4\xe9\xd3\x60\xf8\x33\x70\xde\x62\x22\xa5\x96\x38\xd2\x6e\xfa\xa2\x51\x50\x77\x4e\xeb\x5b\x50\xd3\x9f\x90\xd2\x34\xf1\xca\x40\xff\x69\x44\x09\x3f\xb2\x6b\x2b\x9c\x6e\x2c\x07\xee\x49\x36\xed\xea\x3c\xe7\xd3\xcc\x44\xaa\x02\x2b\x80\xf3\xa2\xde\xed\x66\xd9\x7c\x8c\x77\x16\xdc\x58\xa9\x33\x0c\x3d\xe0\x74\xf6\x7d\x4c\x21\x42\x6b\x81\xd3\x7e\x5b\xd1\xd4\x56\xd0\xa9\x3f\xa6\xdc\x8d\x3f\x59\xfb\x59\xe4\x60\x8d\xaf\x43\x24\x29\xb6\x28\xb2\x0a\xf9\x87\x50\x6d\xce\xdd\x16\x26\x84\xd0\xba\xd7\x1d\x7d\xb0\x4b\x8c\x0b\xba\x51\x1b\xc7\x0f\x94\x89\xc1\x3a\x83\xf2\x08\xcb\x6d\x83\x5e\x70\xa6\x39\x76\x43\x84\xc0\x55\xf0\xef\x45\x96\xef\x5e\xe0\x6e\xea\x02\xc6\x84\x04\x89\xed\xa3\x93\xf8\xe5\xa2\x04\x77\x40\x69\xc0\x90\xd8\x7b\xde\x2f\x8b\xf2\x5c\x94\x1e\x00\xf2\xc1\xeb\xa6\x40\x08\xd5\xc9\x38\xa0\x0d\x0a\x1a\x5c\x8c\xdf\x1b\x1d\x59\x41\xba\xd3\xfe\x5d\x61\x29\xaa\x9b\x3e\x9a\x08\xed\x48\x4f\x2e\xaf\x5b\xf6\xce\x02\xe3\x0b\x87\xd0\x3a\x96\x38\x42\x7a\x9b\x29\xb7\x0b\xf6\x28\xe6\xfe\x08\x22\xe2\x4e\x61\x52\x13\xf5\x95\xff\x45\x8e\xad\x9a\xc5\xf1\x68\x67\xfe\x4d\x73\x19\x78\x57\x7d\x08\xb6\x9f\xbf\x11\x46\xc7\x68\x66\x81\xb0\x95\x0e\xf9\xe4\x7e\xa6\x0c\x42\x8a\xe1\xcb\x43\x51\xe4\xbb\x52\x64\xc7\xfe\x80\xc2\xe2\x16\xf2\xc3\xd7\x7a\xe1\x0b\x39\xdf\x6d\x3a\x37\xde\x35\x65\xa0\x02\xc4\xc6\x78\x47\x11\xaf\xa4\xea\x0e\x87\x34\x40\x4a\xd5\xf7\xac\x74\x9e\x4b\x03\x90\xa4\x8c\x88\xb5\xcc\x69\x67\xf7\x1e\xa3\x64\x8b\x29\xda\xc3\xe9\x5c\x5f\xec\x5b\xf4\x54\x14\xc7\x7d\x66\x55\x67\x54\xbb\x7a\x74\x1f\x16\x01\xea\xc5\x23\xb1\xbc\x6f\x2a\xc8\x48\x85\x41\xe4\x54\xa0\x50\x8a\xe2\x53\x18\xa2\x24\x71\x4a\x1d\xb8\xe7\x00\x64\x60\x97\xd8\x1e\x02\xb0\x7a\xfd\xa3\x5a\x94\x24\x92\x20\xd1\xf5\x64\x59\x91\x75\x2f\xc7\xc4\x24\x0d\x28\x6e\x98\x15\xfa\xbe\xdf\x15\x5e\x52\xa1\x3b\x29\x8d\x28\x16\x9f\x01\xa3\xdd\xed\x4b\xf1\x6e\x45\xf7\xfa\xd0\x46\x52\x10\x11\x9a\x33\x6d\x6f\xd5\x50\x7a\x8e\x49\xa6\x2d\xcd\x48\xd9\xa0\x72\xe4\x23\xc4\x64\x1c\x6a\x6c\x9b\x3d\x3d\xaf\x6c\xf1\xe7\x61\xfd\xb8\x5f\xed\xbe\x7a\x1b\x30\x26\x13\x1a\x73\xcb\x9a\x93\xa5\x28\x2f\xa1\x71\xf6\x26\xfe\x78\xca\x64\xe4\x1a\xe9\x37\x8b\xc5\xb7\xab\xd4\x70\x76\xa2\xc9\x94\x4b\x0c\xac\xff\x2c\x31\xf1\xc3\x45\x8a\x8d\xc4\xc5\x76\x8b\x28\xc7\xf5\x72\x33\x7e\xaf\x24\xd7\xc6\xba\xd3\xad\x16\x6d\x08\x7c\xb7\xf2\x45\x20\x29\xa8\x8e\x7a\xdd\x79\x24\x02\xcc\x7d\x59\x3a\x53\xde\x95\x82\x99\x34\xf2\x14\xee\x76\x59\x58\x0e\x42\x68\x3f\x46\x5a\x4e\xec\xaf\x61\xae\x37\x7a\xf8\x32\x31\x03\x11\x8a\x3b\x40\xb9\xb5\xc9\xbe\x21\x55\x20\xb0\x5a\x79\xff\xc7\xcd\xee\x4f\xf1\x01\xfe\x33\xa0\x84\x6b\xd2\xdd\x83\x38\x34\xf0\x5c\x54\x35\x94\xed\x92\x20\x8e\xed\xca\xb0\x03\x71\xfa\x40\xf0\x62\xbe\xe8\x29\x95\xb1\xc9\xa9\x33\xd3\x7c\x6e\xf2\x3c\xcb\x0f\xc3\xa9\xa6\x09\xc5\x9c\x32\x87\xf7\xcd\x79\x96\xec\x3a\x1c\xcc\x12\x11\xfa\x1a\x43\xa9\x2b\xaf\x81\xec\x0f\x43\x8a\x85\x5d\xcf\x38\x7f\x2a\x16\x53\xe9\xcb\x06\xa5\xe0\x5c\x78\x87\xff\xf3\x11\x7c\x13\xed\x3d\xdc\x89\x81\x86\x98\x99\x22\x59\x64\x72\xa7\x41\xa5\x98\x62\xbc\x43\xf6\x94\xfd\x82\x51\xa9\x59\x02\x70\x4c\x6d\xac\xea\xdf\x38\xb8\x93\x26\xb4\xbe\x34\xc2\x37\x26\x87\xac\x38\x3f\x26\xd2\x12\x3a\x51\xdb\x27\x51\x8a\x13\xa0\xd5\xef\x5f\x42\x4b\x48\x43\x35\xde\x30\xd8\x65\xea\xb5\x83\x4b\x48\xc3\x8c\xf2\x3a\x75\xd6\x85\xc1\x6e\x7b\xd7\x66\x25\x4c\x05\xb1\x26\xce\x82\x7a\x5c\x0e\x52\x21\x25\x3c\x9c\x40\xc2\xe7\x7a\xba\x2a\x8c\x63\x6f\xd4\xba\xfa\xa5\x5e\x0e\xcb\xe2\x94\x55\xf9\x43\x73\xbc\xb9\xec\x5e\x8a\xa6\xea\x31\xd1\x2a\x0a\x15\x35\x7d\x9f\xa8\xd1\x59\x3d\xde\xcc\xc6\x67\x8e\x74\x84\x5d\x04\xac\x01\xaf\x1f\x97\xab\xc7\x36\x95\xdd\x8e\xc4\xa9\x99\x8a\xc0\x2a\xcc\x6b\xa8\xea\xb2\xb8\x74\xa5\xc0\xe1\xec\x57\x11\x00\xbe\xd8\x2f\xa2\xba\x17\xf9\xa1\x11\x87\x3f\x59\x46\x14\xa1\x09\x76\x2c\xef\x8b\xc3\xa2\xa9\x5f\x3e\xa3\x1b\x29\x1a\x58\x99\x7d\xbb\xe8\x3e\x43\x5e\x34\xb9\x02\x4c\xc8\x06\x6d\x32\x45\x69\xca\xd3\x81\x70\x58\x55\x5f\xdb\xd8\x30\x45\x63\x8e\x3b\x67\x56\x3d\x45\xdb\xaf\x63\x04\xdb\xe4\x7b\x19\x51\x98\x53\xde\xae\x76\x1d\x86\x43\x31\x9d\x62\x95\xf6\x02\xf5\x22\x2f\xda\x30\xfc\x6e\xbc\x0c\xab\x38\x50\x88\x4f\x68\x77\x07\xb4\x26\x2a\x8a\xe3\xe0\xad\x55\x71\x48\xac\xe9\x90\xb8\x8c\xef\x62\x1c\xa6\x48\xdd\xb0\xbf\xd3\x13\x22\x8e\xdd\x79\x19\xc3\x0a\xc0\x51\x54\xd6\x71\x1c\x61\x31\xee\x60\x22\xac\xd8\xe2\x12\xca\x1a\x8d\xd6\x6f\xb1\x6e\x36\x59\x21\x55\x22\x15\x2e\xf6\xaa\xc8\x72\x2c\x6d\xeb\x55\xad\xfc\x39\xd2\x80\x62\x8d\xb9\xcd\x86\xbc\xa5\xd4\x8c\x20\x17\x53\x69\x68\xad\xcd\x2b\x64\xae\x98\x6e\xf7\x56\x3c\x96\xc4\xc5\xb5\xb6\x60\x28\x4a\x3d\x50\xa5\x65\x8a\x27\x61\xe4\x8d\x93\xda\x33\xdf\xaf\x3e\x7d\x02\x3c\xd5\xd2\xc9\x52\x3f\x95\xc5\x19\xca\xfa\xd2\xe7\xe1\xd3\x9a\x8e\xe2\xdc\x3e\x5a\xdc\x22\xf2\xff\x0c\xbe\x55\x46\x9e\x41\xbb\x38\x1e\xb7\x2f\xfd\x86\xae\xb8\x0a\xf1\x19\x6f\xdb\x45\xb6\xba\x03\x78\x86\xec\x24\x9b\xb2\x9a\x12\x52\x95\x20\x0c\x03\xb2\xf7\x3f\x51\xfd\xfe\x9c\x46\xe1\x4e\x26\xa9\xf0\x8c\x90\xa7\xde\x9e\x7b\x0e\x9e\x30\xf9\x8d\x2a\xd4\x94\x77\x6d\xa5\x79\x17\xf8\xab\x6f\x53\x69\x1a\x76\x12\x58\x59\x7e\xc0\xf7\x62\xe3\x7b\xb7\x4a\x81\x95\x57\xad\x5e\x8a\x77\xd9\x5c\x86\x8b\xb0\xd2\xc4\x96\x2d\x85\xb6\x72\x66\x9f\x86\x63\x4a\xeb\x08\x4b\x12\x4e\xde\x0c\x39\xc1\xb3\xf4\x92\xfe\x23\x40\x88\x85\x0f\x94\x1d\x7b\x53\x01\xa5\xaa\x43\x18\xaf\xea\x97\x36\xc1\xce\xde\x40\x67\x83\x54\x50\x41\x9c\xa0\x44\xca\xe2\x03\xbd\x92\xc9\x8d\x83\x58\x58\x27\xdf\xe2\xe0\xb6\x12\x0b\x40\x10\xe7\xa5\xa7\xb0\x5c\x83\x83\x47\xb3\x1e\x78\x88\xa5\xd8\xac\x7a\x76\x7b\xe4\xb0\xdb\xda\xbf\xdf\x00\x0a\x29\xa0\xab\xe7\x65\x92\x24\xb7\x70\x2a\x3e\x92\x4c\xb8\x9e\xf0\x60\xac\x12\x9b\xb3\x94\x70\x5a\xfc\xee\xa0\x61\xd6\x57\xbf\xcd\x6d\x6c\xf6\x3c\x99\xa2\x46\x70\xdc\x4e\x31\x18\xc7\x55\x60\xbc\xc0\x18\xa1\x3d\x86\xa1\x7d\x98\x3d\x89\x2f\x2b\x3a\x97\x9b\xf1\x07\x54\x80\xf4\x94\x76\x45\x70\x77\xed\xe6\xf2\x7b\xdf\x1d\x9d\xdc\x63\x03\x80\x76\x1a\x67\x6c\xab\xaf\x67\xee\x93\x1d\xa8\x83\x38\x91\x41\x97\x37\xb9\xd4\x74\x51\x3d\xb5\x1f\x5b\x8c\x14\x81\xff\xf9\xaf\xbf\x75\x55\xa5\x4f\xc0\xc3\xa3\x27\xa5\x03\x27\x0b\x94\xf5\xdc\xc1\xbb\xc6\x9b\xd7\x30\x1d\x68\x81\x8a\x96\xbf\x67\xf9\xa1\xda\x5d\xa9\x19\x31\x1d\x4a\xce\x44\xd7\x06\xab\xad\x03\x57\xb9\x2b\x6c\x4e\xf3\x89\x42\x30\xd3\x21\x24\x49\xd0\xe3\xec\xa6\x9b\x94\x8e\x42\x40\x8c\x83\xfd\xe5\x0e\x03\x33\xea\xae\xe9\xc8\x30\x57\x01\xa9\x7b\x92\xd8\x07\x75\x0b\x4d\x89\x2d\x0b\x6f\x0b\x95\x89\xe3\xcf\xa1\x2d\x14\xb3\x4a\x8c\x6d\xe8\x65\x6b\x19\x5f\xb3\xaa\x2e\xca\x8b\x43\x64\x8c\x9f\x08\x63\x56\xb8\x78\xb5\xfb\xd9\xf3\x2d\xbb\x63\x0a\x63\x2d\x8f\x1c\x5a\xda\xdf\xd6\x05\x33\xd8\x48\xf1\xb8\x81\xe5\x57\xab\xda\x12\x75\x07\x95\x45\x05\xd8\xde\x9f\x8d\x53\xad\x87\x94\x7f\xc4\xa4\x7f\x90\x83\xff\x8d\xfe\x35\x78\xa9\x34\x33\x34\xe6\x73\xc5\xe8\xf5\xd3\xdd\x56\x67\x25\xa8\xf6\xa7\x5d\x95\xa4\x75\x1c\x07\xf8\xbb\x7e\x74\x4f\x20\x61\x4a\x58\x19\x58\xcc\x42\xe6\xea\x63\x3a\x15\x09\x0b\xd1\x5b\xa5\xdd\xe0\x2e\xfb\x87\xe6\x8f\x6c\xff\x58\xf8\xfa\x8d\x16\x1c\xd2\xc8\x99\x03\xa2\xea\xc7\x5f\xc0\xba\xbb\x8f\x4a\x62\xc0\x99\x5d\xfc\x75\x32\xca\x04\x38\x3d\x75\xbc\x19\x7f\x41\x12\x61\xde\xeb\x97\xa9\x52\x4c\x0a\x1f\x5a\x72\x2b\x3a\x6c\x9f\x08\x7a\x0c\xd4\x50\x3a\x3a\xbb\x99\xc2\xce\xb4\xe4\xd6\xde\xc1\x42\x2a\x9d\xd6\x5f\x56\xe4\xd8\xc0\x1c\x5e\x65\x07\xd1\xd4\x52\x86\x78\x8f\xd1\xad\x63\x50\x18\xf5\x7b\xa2\xa7\x6f\x7f\xb0\x3d\x6a\x09\xb6\xff\x83\x64\xa5\xf6\x59\x5b\x65\xa7\x99\x26\x94\x56\x49\x88\x7b\xfb\x56\x95\xa2\x67\x2b\x6b\xa5\x62\x14\xee\xdc\xd6\x65\x91\x1f\xbe\x8a\x1e\x5f\xaa\x95\x09\x23\xc7\x46\x5b\x4c\xe1\xb4\x5a\x33\x7b\xf0\x64\x85\x9f\x1e\x8b\x7a\x0b\xf5\x3a\x5f\x9c\xbb\xf9\x03\xc4\x5a\x43\xc3\xdb\xc3\xe1\xe4\x34\x53\x9f\xca\xe2\xdf\xa0\xae\x81\x9d\x1f\xa7\x63\x1a\x92\x54\xba\x77\x06\x45\x29\x3b\xd7\x8f\xc9\xc3\x32\x89\x95\x00\x76\xdc\x5a\x37\xf7\x27\x57\x6d\xda\xb8\xce\x26\x82\x77\x45\x51\x4b\x71\x3c\x22\x1f\x73\x3c\x0c\x02\xa6\x70\xaf\xcd\xaa\xae\x3b\xf6\xcd\x42\x06\xbc\x34\xb7\xf5\xd7\x1a\x12\x29\x52\xff\x59\x19\x87\x2e\xb4\x5b\xe4\x97\x95\x35\xb9\x9d\x28\xc5\xfa\xa1\x3a\x35\x9e\xaf\x5c\x9c\xc6\x70\x86\xd9\x55\x0c\x02\xc7\x26\xc5\x0d\x7f\xa1\xdf\xb2\xaa\x28\xab\x51\x35\x11\x48\x6a\x7d\xc1\x8e\xe7\x3b\x80\x9b\x73\xf7\x67\x63\xfb\xee\x67\x71\xe9\xe3\xd0\x36\x9e\xc1\x15\xde\x7f\xf7\x9f\xbf\x97\x40\x05\x89\xad\x5a\xb9\xe3\x02\xfb\x7c\xdb\x1f\x97\x84\xda\x06\x3f\xfc\xd2\xf0\x56\xbd\x14\xe7\x1f\x22\xab\x41\x87\x7f\x80\xe8\x60\x75\xc0\xc0\x2a\xc4\x9f\x4b\x50\x59\x05\xdf\xf2\x8e\xd9\x0e\x29\xb1\x3c\x9e\xe7\xac\xca\x5e\x07\x06\x57\x0c\x38\xd7\x58\xf4\x44\x77\xd0\xa2\x4b\x72\x81\x0b\x89\x11\xc7\xa9\xa9\xea\xdf\x2f\x6a\x3c\x33\x80\x83\xc4\xf3\xad\x9f\x7c\x53\x05\x04\x89\xb1\x3c\x5e\x18\xf3\x20\xb2\xbc\x86\x7c\xd0\x20\x00\x19\x58\xfd\x83\xac\x03\x74\x3c\x41\x79\x12\x53\xa7\x15\x06\x8a\x06\xc2\xd8\x94\xbd\xdf\x1e\xe7\x85\x60\x19\xa8\x04\x50\xfc\xea\x08\xa6\x8e\xa2\xc9\x54\x50\xa9\xc6\x85\x72\x0f\x15\xb2\x54\x0e\x50\x6e\xff\x53\x4e\xcc\x91\xff\x36\xfe\x88\xb2\x2a\x71\x67\x71\x6e\xfc\x95\xeb\x28\xe5\x1e\xd5\xdf\xc6\x36\xcf\x57\xba\x03\xa0\xb9\x92\xae\x6c\x7e\x2f\x72\x3d\xeb\xeb\xce\x40\x2b\xc1\xbc\x69\xd6\x07\x5b\x2a\x40\x62\xe5\x56\x6b\xcf\x53\xec\x83\x4e\x13\xd0\x20\xe8\x0d\x9c\xdb\x4b\x99\x27\xcc\x5c\x51\xba\xae\x15\x51\x99\x09\x12\xab\xa8\x85\xd0\xe4\xb5\x41\x37\x48\x98\x14\x31\x4c\x18\xa5\xa1\x0f\xfa\xce\x70\x6d\xcc\xe4\x87\x25\xda\xd9\x5a\xa0\x88\x7d\x76\x78\xa9\xa3\x5b\x10\xb6\x59\x3b\x88\x2e\x4c\x08\xa9\x03\xb3\x94\x7a\x29\xce\x03\x01\x7d\x66\x22\x9a\x60\x3f\xf8\x50\xd4\xe2\xd5\x4f\x1b\x43\x12\x2b\xaf\x56\x65\x87\xfc\x2a\x42\x1e\x5f\x2c\xe1\x34\xb5\x0a\x6e\xe7\x63\x71\xe9\x4f\x4c\x03\xaa\xfa\xb2\xdb\xfe\x5c\xbc\x0f\x8e\x25\x02\xf7\xda\x55\xfd\x52\x0a\x63\x8e\xb0\x7f\x23\xb2\x3b\x98\x42\xd2\x6f\x55\xdb\x4b\x5e\xbf\x40\x95\xfd\x37\xcb\x0f\xb3\x4c\x14\x43\x4d\x20\xc9\x40\xda\xcb\xbf\x4a\x86\x45\x1a\xbf\xa5\xcd\xde\x6e\x4b\xf1\xfe\x30\xe1\x73\x19\x26\x13\xbc\xf4\x93\xf8\xb5\x14\xe7\x5e\x5e\xc0\x30\x6d\xa2\xce\x8d\xfb\x2e\xab\x94\x38\x8e\xab\xe8\x26\x96\x8c\xa4\x83\xd9\x69\x1d\xdb\xef\x8a\x72\xdb\xc6\x24\xae\xa6\xee\x07\x27\x91\x8c\x9c\x60\xc7\xff\xd6\x44\x35\x89\xb4\xa9\xea\x5e\x36\x65\xfe\x49\x0f\xc5\xa4\x51\x82\x21\xc6\xee\xa6\xec\x79\x49\x26\x8d\x53\x99\x74\x1b\xc9\x33\xbc\x41\x59\xc1\x90\x86\xeb\xc7\x25\x11\x2e\x74\x96\xf4\xbe\xce\x1d\xde\x77\x70\x26\x2e\x14\x25\x13\x86\xdf\x4e\xe4\x87\x4c\x1e\x61\x51\x55\x50\xcf\x19\x88\xf9\xcf\x4a\x8d\x46\x53\x36\xb2\xc5\x20\xf8\x0a\x08\xe1\x87\x42\x8c\x93\xc6\x6d\xae\x8f\x9d\x70\x28\x33\x22\x92\x41\xd0\x8b\x84\xcc\xca\xdf\xb6\xa3\xac\x93\x40\x0e\xef\x16\xf9\x39\x99\x2c\x32\x14\x28\x69\x71\x73\x69\x97\x5d\xf5\x0a\xe5\x48\x3b\xd2\x48\x08\xd0\x26\x77\x7f\x00\x74\x9f\x1e\x7d\x58\xa9\x44\xc6\xbe\x34\x01\x43\x79\x12\x37\x40\x33\x82\x33\xce\xd7\x71\x5c\xfe\xe4\xb8\x9f\xd7\xe8\x8f\x3e\x36\x30\x5a\x12\xe2\xaa\x03\x9b\x33\xa0\x64\xea\xba\x8b\x5f\x8c\x36\xd6\xe6\x1c\x15\x88\x51\xc5\xff\x63\xbc\xbb\x81\x38\x40\x20\x8e\x15\x85\x68\x2a\xfd\x54\x16\xbf\x2e\xd3\xb4\xc4\xb4\x4b\x3e\x82\xea\xa5\xee\x45\x5d\x26\x96\x83\xcc\x98\x00\x12\x39\xe2\x95\x7e\x04\x82\x1d\x43\x35\xfd\xc7\x49\xea\x88\xda\xa8\x63\x7d\x23\xaa\x4c\x21\x30\xf6\x4f\xea\xb1\xff\x7f\x6c\x37\x63\x58\x8c\xe5\x20\x94\x58\x5a\x0e\x64\x9f\xe3\x20\x88\x09\x4a\xc0\xf8\x62\xf7\x3a\xaf\xea\xac\x6e\xea\x19\x3f\x88\xe1\x1d\x68\x3f\x08\xce\x54\xb8\x9f\xe1\x73\xf6\xaf\x83\xe1\x60\xa3\x81\x6d\xdf\x5e\xfd\x4b\xd0\xaf\x38\x08\x54\x8a\x64\x89\xbf\x67\xf9\xe1\xbf\x2f\xd9\x78\x21\x8f\x83\x28\x48\x3c\xfc\xe3\xbe\x78\x87\xaa\x6e\x63\x0d\xdb\x31\xd7\xbf\xda\x57\xb2\xf3\xb9\x8c\x83\x28\x16\xca\xfb\x1f\x7a\x5d\xa3\x6d\x73\xba\xb9\x58\xcd\x89\xb9\xc5\x3c\x0e\x48\xa0\x19\x52\x38\x36\xdf\x1e\x77\x7f\xec\x97\x8b\x87\xa7\xc5\xfa\xcb\xe3\x7e\xfb\x75\xf1\xbc\xf2\x67\x26\x5c\xd0\x2e\x72\xab\x3a\x84\x70\x1c\x90\x76\x21\xb1\x31\xc4\x53\x09\x1d\x07\xa4\x3d\xa0\x23\x7f\x0b\x77\x85\x7b\x2b\x50\x90\x64\xc6\x12\x7b\x72\x4b\x68\x6c\x2d\x71\x3d\x75\x76\xc4\x9a\x8d\x03\xaa\xe3\xce\x95\xf6\x35\x3b\x1e\x9f\xc5\xff\xe2\xf1\xd0\x9d\x24\xd5\xa1\x5f\xef\xaf\x3c\x39\xe2\x80\x25\x29\xbe\x04\xa5\x8f\x0d\xe3\x20\x26\x11\x8a\xa8\xfe\x5e\xff\xfa\xd3\x56\x51\x1c\xc4\x86\x20\x5a\x57\x41\x5e\x37\x93\x08\x25\x0e\x12\x4a\xa4\x55\x0b\x17\x7a\x8f\x77\x75\x6f\xbb\xb3\xfb\xc2\xec\x9b\x0a\xca\xfd\x79\x4a\xe0\xf1\x9f\x4c\x38\x46\x0a\xcf\xcf\x43\x16\x7c\x1c\xa4\x92\x58\x68\x2a\x56\x64\x5f\x04\x2a\x39\xb8\x63\x1c\x04\x77\x95\xc1\xd7\x2c\x3f\xac\xce\x85\x7a\xb9\x6d\x86\xbd\xe6\x38\xe0\x06\x30\x03\xd9\xac\x36\x9f\xa0\x1d\xe2\x40\x1a\x4b\xdf\xd8\x41\x55\x93\xc9\xb5\xe9\xc4\x72\x9e\xdb\xa4\xbb\x1c\x4a\x87\xc4\x81\x56\x12\x91\x2d\x43\xb5\xa9\x38\xd0\x86\x61\xef\xe6\xd7\xa9\xf4\x7f\x82\x90\x52\xcc\xdb\x30\x2f\xb8\x81\xff\x3e\x16\x47\x1f\x99\xc5\x81\x09\x00\x6b\x36\xd8\x03\xee\x44\x14\xfe\x52\x1f\x3f\x0e\x4c\x04\x56\xc4\xa7\xb9\x3c\xdd\xec\x76\x8b\x83\xc8\xf2\xaa\x1e\xc4\x46\x71\x60\x62\xa5\xb9\x9b\xb6\x8e\x2b\x32\x2e\x42\x4f\xde\x1e\x23\x12\xec\x93\x7e\x2f\x32\x05\xaa\x0b\xf6\xe3\xc0\xe8\x10\x7f\xd9\xd7\xe2\x3c\xfc\x7b\x18\x10\xab\xdd\xb8\xcf\xe1\xfd\x09\x7a\x09\xf0\x7f\x46\xbe\xe1\x36\xf9\x67\xf4\x7d\x61\x10\x5b\xba\x62\xef\x51\xb0\x3f\x8a\xaa\xde\xbf\xa1\x18\x78\x37\x48\x12\xf7\x3b\xc7\x4d\xcf\x38\x0c\x23\xcb\xc8\x44\xd7\xc1\xeb\x1e\x4f\x1c\x86\xdc\xc6\xe5\xbd\x2e\xe2\xf7\x36\x32\xc8\xea\xcb\x4d\xe1\x6b\x94\x71\x18\x49\x40\x20\xac\x1e\xda\x10\xc4\x61\xa4\x0c\xf6\xf2\xce\x9d\x0f\xf2\x48\xa0\x6b\x12\x2d\xbb\x0f\x11\x61\xfd\x9c\x64\x73\x91\x42\xbd\xee\x2e\x67\xd8\xe4\x7e\x0d\x0f\x89\x04\x94\xfd\x42\x8d\x26\xbb\xbc\xfb\x0b\xef\xb7\xb7\xf1\x3d\xa2\x91\xc2\xdf\x68\x8b\x6f\x4f\x65\xf1\x96\x69\x28\x7f\xbb\x56\x45\x9b\x61\x5b\xa7\xd7\x82\xcd\x71\xc8\x38\x0b\xb4\x57\x94\xec\xc5\x4d\x26\xb7\x36\xa6\x09\xc6\xe6\xbd\xae\xb1\x3d\xef\xfe\x50\x1c\x8b\x6a\x7c\x97\x13\xa1\x13\xed\x1b\x03\x35\xe4\xe8\x47\x35\x9c\xbc\x61\xfc\x4f\xf6\x2f\x37\x38\xe5\x1c\xb1\x69\x45\xa9\xa1\x5c\xf5\x0f\x81\x47\x96\x7b\xf2\x52\xe8\xa3\x63\x10\x4d\x16\x8b\x90\xeb\x28\x1c\x79\xdd\x7a\x8e\x56\x1c\x72\x13\x4b\xdf\xe0\x5c\xe7\x3a\x7b\xcb\x74\x23\x8e\x63\x30\xd7\x55\x78\x1a\x87\x82\x5a\x11\xbf\x0a\x6a\x9d\x55\x58\xf9\x11\x33\x10\xf1\x38\x94\x3a\x35\xd2\xb7\x3e\xbd\x5c\x77\xbf\x8a\x87\xea\xff\x91\xf6\x27\xcd\x8d\xe3\xd8\xfa\x38\xfc\x5d\x7e\xab\x5a\xf4\x82\x04\x48\x00\x7c\x77\xb6\x2c\x67\xea\xa6\x6d\xf9\x5a\xca\xcc\xaa\xbe\xd1\xa1\xc0\x70\x60\xb3\x4d\x91\x6a\x92\xb2\xad\xfa\xf4\x6f\xf0\x00\xe0\x24\x39\xab\x3a\xfe\x9b\x72\xa5\x08\x4e\x20\x86\x33\x3c\xe7\x79\x24\x77\x1c\x07\x7f\x7c\x0d\x8f\xa4\xb5\xc5\xc9\xf4\x74\x75\x7d\x35\x19\x57\xc0\x09\xe6\xd2\x02\xa5\x38\x52\xef\x4d\x7b\x1f\x32\xc2\x7d\x86\xa7\x77\x1b\xfb\x21\x66\x33\x22\x3d\x5f\xc9\xff\x54\x4e\x0d\x70\x76\xba\x55\x11\x3a\xcd\xdd\xf5\x43\xa5\x14\x23\x91\xe6\x98\x47\xbb\xab\x9e\xb1\x08\xd1\xbb\xd3\x1e\x5f\xfa\x57\x90\x9f\xfe\x22\x12\xe9\xe4\x9c\xb2\x12\x5a\xd1\x20\xf7\xe1\x16\xb1\x12\xd4\x0e\x72\x55\xdf\x4e\xe6\x4c\x78\xe1\xb3\xd4\x53\xb8\x82\x16\x5c\x0c\xf4\x27\x7b\x28\x67\x35\x8f\x8c\xc4\xe0\x32\x43\xae\x6c\x61\x9c\xa2\x66\x84\x50\x8a\x35\xf9\x1e\x18\x3f\x54\x2e\xfe\xfa\xae\x24\x91\xcc\x7f\x5e\xcc\xe9\x6f\xe1\x63\x1a\xae\x62\x84\xd2\x24\x24\xbf\x1f\x65\x6e\x7e\xbb\x90\xb0\x61\x84\x32\x87\xe4\xba\x87\x36\x6f\x86\x68\x09\x23\x49\xea\x81\xf9\xb2\x18\x4b\x5e\x32\x92\x58\x83\x26\xb9\xaf\x7d\x3a\x93\xdf\x61\x24\x95\x1c\x35\x22\xae\xd1\x6f\x38\x97\x65\xf8\xb5\x69\x40\x52\x5f\x99\xee\x0d\xd8\xbb\xaa\x09\x5c\x0d\x4f\x70\xd8\x56\x3f\xf3\x72\x20\x6f\xf0\xa7\xb0\x44\x21\x79\x50\x30\x99\xaf\xe5\xa8\xae\x69\xfa\x70\xcc\x28\xee\xb1\x8d\xae\x3e\xa7\xc7\x5d\xf6\x8c\x7c\xfd\x24\x21\x3c\xe6\x84\x0f\xb2\x5e\x3e\x8c\x77\xd1\xe9\x62\x44\x40\x84\xaf\xfd\x53\xb6\xfa\x65\xe2\xf7\x76\xc7\x34\xd2\x5b\xef\x8f\x45\x9b\x63\x77\x5e\xe5\xf5\x4d\x3d\x68\xae\x9d\x4f\x75\x92\xc5\x96\x39\x3d\x81\x56\x16\xdf\x20\x58\x13\x24\x53\x1a\x2d\x90\xfc\xc1\x26\xfb\xb1\x0d\x41\x64\xb7\x98\x77\x4e\xfe\xc7\x8b\x3c\x36\x4e\x4b\x7f\xf8\xa2\x92\xbb\xa0\xeb\x33\xb4\xdd\x9e\x95\xf7\x43\x50\xea\x54\x20\x3e\xd6\x87\x04\x3d\xae\x35\x18\x99\x44\x91\x34\xf5\xa8\x9b\x49\x95\xdb\xc4\x30\x21\x8a\x59\x54\xaa\xb9\x97\xc3\x2d\x35\x73\xac\xc6\xa1\x22\x09\xa1\x58\xbf\x4a\xed\x30\x62\xa8\x63\x24\xc6\x32\x21\x87\x57\xf0\x47\x6c\x64\x49\x50\xf2\x3c\x3d\xe5\x43\xe7\xda\x38\x61\x6a\x58\x9e\x3a\x9b\xf4\xe2\x1c\xf6\x88\x3b\x46\xa3\x88\x04\x2e\x8e\x19\x59\x40\x68\xa0\x0c\xa2\x69\x0e\x05\x98\x67\x08\x44\x42\x93\x07\xa5\x91\x89\xa3\x68\x60\x2e\xb8\x32\xfb\x70\xad\xd0\x00\x6c\x88\x3d\x5f\x15\x05\xc6\xd6\x1f\xeb\x1e\x82\xca\x68\x4c\x12\x27\xf4\xdf\x99\xc0\xf7\xb9\xc9\x1f\xaa\x16\x1a\x37\xd7\x70\x2f\x0c\x23\x81\xc6\x00\xd8\x32\x58\x1d\xcb\xf6\xe5\xb6\xaa\xcf\x14\xd8\x18\x8d\x2d\xc3\x02\x4a\x07\x4b\x08\xf1\xf2\xf1\x67\xa2\x24\x89\x71\x94\xa2\xd9\xb5\x78\x81\x3e\x81\xdf\x1d\xca\x50\x05\x71\x87\x32\xac\xd7\x70\x9e\x54\x1e\xfc\x4c\x46\x89\x65\x98\x12\xd8\x8d\xa9\xe0\xfb\x63\x06\xa3\x95\x8f\xab\xc7\xf0\x53\x92\x39\xc6\xa1\x1a\x2c\xd4\xb5\x2c\x7a\x44\xf4\x2c\x16\xcf\x68\xa2\x24\x7e\x67\x25\x9b\x89\x9c\x33\xa3\x69\x9c\x50\xbf\x8f\x3c\xe5\xfa\xe5\x82\x15\x40\x53\x9a\x72\xf0\xe6\x71\xbf\x0c\x9f\xe7\x99\x19\x4d\x13\x8e\x21\xe4\x2f\xdd\x9e\x00\xb0\x18\xbe\x5b\x2a\x62\x03\x21\xe6\x90\x6b\xc0\xfc\x7a\xe3\x7d\xf5\xfe\x9b\xa4\x82\x63\xf5\xa2\xc3\x4d\x3d\x1c\xf7\xf3\x07\x51\x2c\x73\xd5\x10\xce\x82\xeb\x4c\x21\xef\x52\xcc\x5b\x5a\xcd\x68\x2f\x80\x09\x75\x9f\x82\xf1\xc7\x19\x81\xa0\x13\x71\xdf\x4f\x2d\xca\x23\x57\xd8\xb5\x83\xba\xae\xea\xab\xd2\xf8\x2c\xf6\x85\xc4\xb7\xf0\xa7\x88\xc8\x3a\x7e\xea\x50\xd4\x7b\x71\xfd\xa5\x82\x4b\x0a\xfd\xfd\xa0\x6e\xae\xda\x69\x68\x3a\xb4\x33\x19\x02\x69\x36\x79\x89\x99\xdb\xbc\x45\x9d\x21\x92\x84\x47\xcc\xa2\x28\x80\xaa\xb6\x79\x01\x77\x81\x3b\x71\x94\xf7\xf8\xcc\xb0\xa7\x59\xec\x34\x5e\x70\xda\xec\x1c\x2a\x76\xd2\x2b\x99\xb2\x18\x36\xba\xce\xdb\xa6\xad\xf4\x6b\xb3\x77\x1a\x78\xfe\xb0\x8c\x1d\xe0\xa1\xb3\x19\x6f\x01\x6e\x0b\x39\x1c\x62\xda\x31\x0b\x07\x55\x03\x46\xa5\x80\x38\x0e\x41\x8c\x59\x1e\x9d\x51\x05\x06\x2b\x32\x76\x0d\xae\x17\xde\xb4\x0e\xa2\x25\xbf\xb4\xae\xa9\x49\xa4\xf5\x15\xfb\xb8\x76\x4e\xd7\x3e\xdf\x08\x98\x46\xd2\xf1\xc0\x1a\xe8\x8a\xec\xc2\xc3\x01\xd7\x4e\x2d\x07\xa3\x0e\xbd\x8b\x4f\x41\x01\x16\x54\x6e\x5a\x38\xfc\xb7\x42\x8b\xf3\xbf\xc3\x9e\x47\x01\x24\x46\x26\xef\xaf\x7e\xdf\x3d\x7c\xbf\xbf\x5e\x3e\xed\xae\x97\xdb\xed\xf2\x69\x13\x6e\x6c\x21\xc6\x98\xc8\xf6\xea\xe9\xcb\x72\xbb\xdb\xae\xb7\x57\x77\x13\xa1\x7d\x96\xc4\x19\x0b\x05\x8a\x2e\x77\x07\xe6\x2e\xdf\x87\x2c\x0d\x4b\x62\x4b\xb1\x54\xf5\x50\xc8\xd3\x25\x12\x81\x69\x64\x2b\xf4\x66\x42\x28\xc1\x8a\x0a\xc7\x28\x1f\x47\x65\x1f\xad\x64\x09\x49\x00\x0b\x6f\x7b\xae\x54\x6f\x4b\x8f\x26\x84\x57\xd8\x65\x09\xe1\x1a\xad\x68\x37\x79\x1d\x3f\x41\xb8\x4e\x92\x41\x9c\xf6\x7b\xd6\xf6\xf7\x77\xac\xc5\x32\xd3\xc2\x4a\x96\x24\xd2\x62\xf4\x30\xac\xc9\x08\x4b\xef\x9d\x83\x04\xa5\xc1\xbb\xc3\xc7\x8f\x5c\xde\x23\xc1\xdf\x08\xf1\xc3\x92\x04\x5c\xd1\x42\x3e\xd1\x80\xfc\xa5\xff\x9c\xa4\xc6\xd8\xc0\xeb\xf1\x79\x34\x92\x25\x8c\xba\x98\xd5\xe0\x43\xfa\xc5\x76\x66\x21\x26\x9d\xd9\xe4\x77\x28\x47\x8f\xbc\xb6\x17\xd6\xd4\x84\xa7\x9a\xba\x5a\xd8\x36\xc4\xc4\x9b\xdb\xaa\xbe\xf9\x44\xed\x92\x25\x5c\x29\x5c\xc1\x1d\xa7\xe4\xc8\xfd\x4e\x38\x10\xd4\xf4\x42\x34\x7b\x03\xed\xee\x19\xda\xdd\x53\xde\xbc\x8e\x70\xa3\xbe\xa9\x88\x53\x8f\x51\xc7\x05\xfa\xcf\xbc\x7c\x9e\xd1\x33\x89\xd0\x52\x32\x0c\x59\x78\x5a\xca\x79\x19\x21\x4b\x84\xe1\xd6\xa9\xf8\x34\x97\x29\x3d\x58\x92\xa5\x0c\x53\x20\xa8\x30\xe8\xb8\x50\xfa\x52\xd5\x69\x4b\x15\x3b\x92\x97\x6e\x7e\x7c\x7f\x58\x2d\xd6\x4f\x0f\xc8\xd2\xf4\x65\x75\x1b\x1c\x97\x44\x69\x1d\xcb\xc1\x36\x98\x71\x38\xb0\x44\x93\x28\x70\x70\x3c\xc0\x47\xbb\xda\xcb\x67\xd4\x14\x99\x26\xfa\x2f\xfd\x19\x19\x88\x89\xa6\x89\xd5\x21\x36\xa9\x5f\xc7\xd2\x44\x2c\x31\x31\x45\xa5\xce\x77\x4c\xcb\xce\x55\x10\x58\x62\x58\xc6\x84\x07\x30\x74\x3b\xf2\xdc\x8a\x4f\x8c\x76\x94\x29\x2a\x37\x37\xaf\x97\x0d\xaa\x7e\x82\xce\x3a\x13\x12\xc7\xb7\xfb\xf8\x6d\x5c\xf5\xc9\x12\x00\x61\x90\x96\xa3\xc4\xcf\x33\x73\x93\x12\x9b\xc6\xa8\x1c\xb1\x2a\x67\x8f\x62\x85\x53\x05\x29\xe1\xa3\x07\x9c\xdf\x42\x67\xdf\x1c\x66\x6f\x65\x21\x0d\xc2\x00\x8e\x0f\xc0\x01\x4f\xfa\x4f\x39\xb9\x6e\x1a\x69\x97\x25\xb2\x55\xfd\x9c\xbf\xc1\x7d\x98\x9d\x29\x11\x31\x62\x61\xff\xf9\xc7\xfd\xf8\x05\x52\x22\x1c\x63\xf5\xed\xd5\x62\xbb\x7e\x0a\xca\x0f\x2c\x4d\x52\x40\x93\xe1\x45\xb5\xe3\xe6\x69\xca\x04\x1f\x3c\x99\xce\x60\xc3\x48\x7c\x38\xac\xb9\x18\xd2\x6e\x88\xd6\xe9\xd5\x8f\x71\x7c\x47\x2e\x1a\x32\x2c\xce\x29\x93\x4e\xe0\xa6\x69\xab\xc3\x6d\x55\xf7\xeb\x49\xca\x25\x60\xac\x5d\xea\xf6\x28\x8b\x31\x90\xc3\x37\x10\xc4\x44\x0e\x57\xf7\x13\xe0\x75\x34\x77\xc3\x71\x43\xb0\x34\xeb\x45\x36\x2f\xd0\x4c\x17\xbb\x54\x18\x0a\x26\xe0\xee\xcd\x33\xd4\xce\x4a\xbd\x1c\xc4\x9f\x0e\x86\x34\xcb\x52\x47\xf8\xd3\xb6\xb0\x3f\xb4\xd7\xf0\x9c\x97\x77\x95\x2c\x2f\x31\xce\xb1\x34\x93\x9e\x74\xa5\xf3\x46\x1d\xc5\xe7\x13\x48\x33\x8b\xdf\xa6\x99\x09\xa3\x77\x57\x1d\x86\x0e\x97\xb1\x1b\x28\x79\xb3\x2e\x61\xf2\xe5\x64\x12\x8b\x24\xa4\x9b\xb1\x58\x60\x54\x27\xcd\x52\x29\x9d\x22\x5d\xbb\xdb\x14\xf2\x4d\x92\xfe\x77\x95\xba\x84\x2f\xca\x9a\x0e\xbb\x4d\xaa\x12\x8e\xc1\x9f\x2f\xd5\x5b\xf7\xc1\xfa\xa2\xec\xee\x88\xc0\xc5\x26\xc0\x29\x2f\x7b\x3b\x97\x4c\xea\x54\x47\x11\x4e\x00\x4f\x08\xec\x5a\xa0\x46\x59\xf0\x51\x2f\x3b\xb5\xa9\x16\x2e\x14\x85\xf9\xa7\x9b\x5c\xee\x2b\x9f\x6f\xe8\xe3\x98\xbe\xa1\x15\xcc\x27\xb0\xdb\x3b\x80\x89\xc2\x17\x63\x51\xe2\x90\xd1\xef\xe1\x6e\x18\xe5\xed\xe6\xd1\xc4\x20\x61\x51\x4a\x30\xa3\x67\x1c\x7a\x19\x23\x5f\xbf\x9d\xa7\xa2\x18\x8b\xb4\x40\xcb\xb5\x7d\x81\xce\x5e\xef\x55\x3c\x19\x8b\x40\xd2\x29\xa9\xf1\x5b\x1c\x8e\xc5\x59\x4a\x64\xdf\x0b\x8f\x75\xfe\x96\x17\x70\x99\xd8\xb1\x6b\x6c\x31\xcc\xd5\xad\xfd\xcd\x4e\x8e\xcb\x17\x18\x8b\x0d\xc1\x7c\x5b\x20\x4c\xb9\x5d\x7f\x77\xf5\xe2\x63\x5b\x85\xc5\xc6\xe0\xa4\xbe\xff\x7e\xb7\x5d\x3d\xde\xad\x96\x4f\xbb\x9b\xd5\x8f\xd5\x66\xfd\xd4\xb7\xb0\x24\x50\xad\x3d\x55\xd5\x7e\xc8\x91\x32\x46\x19\x8d\xbc\x6e\x15\x6a\xc6\xae\xdf\x7a\x4b\xa2\xdb\x54\xb4\x8f\x32\xf6\x48\xa0\xc7\xba\x32\x47\xed\x91\x56\x55\x61\xae\x4f\xf7\x95\x81\x62\x5c\x78\xd7\x9d\xe8\x14\xea\x1c\xc0\xd7\x2f\x78\x6d\x75\xb5\x58\x5c\xde\xbd\x58\xa2\x0d\x5a\xbb\xb2\x79\x9d\x13\x5b\xb1\xae\x8f\x32\x17\xf1\x40\xc9\x1a\x07\x36\xc1\xea\xfe\x5f\x58\x8c\xe1\xdc\x84\xa5\x4e\x53\xaa\x34\x9d\x81\xbd\xad\x26\x15\xda\xbe\x15\x37\x2e\xba\xf1\x52\x1d\x1b\x58\x9a\x3e\x03\xc8\x44\x24\xd9\x00\x09\xef\x16\xb7\xa2\x3f\x44\xa2\xc8\x7b\x35\xdd\xbc\x7a\x38\xee\x37\xb9\x99\x15\x09\x31\x26\x12\x8e\xb5\xee\x83\x29\x73\xf5\x34\xd9\x53\x98\x90\xae\x60\x1d\x1a\x2d\x0f\xf0\x15\xf1\x58\xc3\x82\xc9\x04\xb8\x60\xd2\x5d\x15\x42\x48\x38\x2b\x2f\x97\xa3\x33\x96\xc5\x4e\x39\xef\xb1\x6a\x37\x87\x22\x9f\x19\x4c\x2c\x13\x59\xa6\x7d\xd0\xf6\xee\x68\x8e\xfb\x6d\xd5\x79\x3f\x43\x56\x7a\x9e\x9b\x64\x59\x66\x51\x6d\x4f\x1a\xf3\x58\x15\xb9\x3e\x8d\xa8\x03\x66\xfe\x19\xcb\x20\x46\xef\xbd\xb3\x2c\x16\x57\xc1\x73\x66\x2a\x52\x98\xe2\x7e\x9d\x2a\xad\x30\xa6\x08\xc1\x2e\x74\x92\xe6\x61\x9c\x20\x9b\xd8\xe5\xb7\x53\xc6\x05\x8f\x3d\xcd\xc5\x7c\x2e\x69\x6e\x31\x52\xba\x5a\xac\x1d\x27\x12\x1d\x13\x57\x31\xa6\x33\xad\xc9\x28\xca\xe6\xc4\x84\x1e\xe5\xa9\x99\x87\xcf\x87\x5b\x6a\xa9\xc9\xc0\x85\x38\x83\x38\x8d\x56\xa8\x7e\xec\x6b\x95\x81\xcb\xcc\x95\xf0\x8e\xbc\xaf\x25\xd4\x87\x1e\x0e\x39\xfb\x20\x26\x03\x84\xa7\x17\x20\xfb\xc5\x9c\x41\xca\x43\xdd\xef\xcf\x3a\x1f\x12\x33\xcc\xc6\x09\x33\xbd\xa0\xf7\x63\x55\xf4\xa3\xd1\x52\x89\xf0\x59\x69\xcc\x72\x8f\xa8\x9a\x33\xde\xdd\x60\x7d\xd1\xf9\x27\xb6\x26\xc6\x9d\xf5\xae\x7a\xfe\x51\xcd\x80\x1e\x8c\xc7\x49\xe6\x8a\x57\x83\x5b\x82\x52\xee\x1b\x3d\x62\xc8\xf7\x2d\x49\x1c\x45\x51\xc8\x0d\x85\x72\xfd\x6d\xe5\x69\xee\x7a\xc5\x93\xa2\x99\x04\xd7\x39\x11\x0e\x73\x33\xe4\x3d\x96\xdf\x1e\xfc\x7b\x71\xaa\x33\xe4\xe4\x6f\x70\x30\xff\xad\xf8\x2b\x4f\x22\x03\x41\xc0\x6b\x67\xab\x7a\xd7\x7a\xe7\x32\x1c\x37\x0c\x2b\xb6\x9e\xf2\xfd\xb1\x7a\xcb\x1f\xe0\xb9\xfa\x33\x97\xe5\xd9\x9b\xa7\xa9\x63\xdd\xaa\x61\x2f\x91\x0f\x68\x21\x0f\xa3\x32\x73\xc6\x53\x6e\x5d\x04\xc9\xc9\x2c\x17\xb2\xb5\x55\xbd\x9f\x9a\x1e\x3c\x05\xa7\x17\xd0\x4d\x20\xcf\x14\x3b\x23\x30\x9f\x3d\x3e\x8b\x62\x19\x4a\x7a\x9b\xa7\x70\xef\x6d\x75\x85\x6a\xa2\xe1\xde\x9c\x13\xd3\x2d\x6c\x8f\x50\x96\xa7\x71\x0a\x92\xf3\xcc\x55\x5a\xbf\xbb\x38\x73\x83\x60\xa3\x33\x86\xe3\xae\x9d\x61\x0e\xe7\xf7\x53\xd6\xb5\x2c\xdb\x13\xc6\x79\x26\x5b\x2a\x17\x9c\x24\x76\xb2\xca\x61\x05\xf0\xb2\x6c\x51\x35\x79\xfa\xe4\x82\x73\x8c\x42\x28\x47\xf0\x1b\x1e\x48\x28\xe9\x05\x3b\x71\xbb\xbd\x7b\x5a\x84\x23\x19\xe3\xc8\x1e\xe0\xe9\x0a\xb6\xf9\xf0\x16\x99\x70\x3c\x82\x9d\x8f\xa5\x2f\x71\xa5\x33\x9e\xe9\xc4\x92\xc1\x68\xf0\x82\xb5\x33\xf5\x03\xc6\x65\xc4\x71\x49\xbc\xa9\x87\xc0\x2e\x97\x71\x84\x22\x29\xd0\xf5\xdc\x0d\x14\xbd\x51\xcb\x65\x1c\x27\x3e\xe0\x81\xf2\x16\x3e\x10\x3e\x5b\x6b\xb8\x8c\x89\x09\x84\x7e\x5e\xa2\xf6\x6b\x6e\x0c\x94\x0e\x03\x35\x1d\x03\x32\x66\x81\x77\xda\x41\xef\x17\x2f\x18\x5c\x9f\xbe\x8f\xe4\x80\xcc\xa6\x3e\x0c\x9c\x3f\x97\x60\x6e\x40\x16\x0e\x28\xb6\x2a\xaf\x8f\xc5\xeb\xe7\xe1\x76\x2e\x21\x45\xca\xe1\xe5\xf7\xa7\xd9\x85\x55\x4a\xb1\xe0\x03\x29\x6c\x0b\xc7\xf7\xd3\x6d\xa3\x0b\x59\x9b\xd5\x65\x09\x71\xc6\x55\x26\x71\x4b\x5e\x3f\xdc\xfd\xc1\xa2\x68\x14\x88\xe7\xca\x3a\xdc\x76\xe7\x18\x5f\x1f\xeb\xf2\xfe\xb5\x1d\x0e\x51\x9e\x85\xca\xad\xf3\xd4\x0a\xd7\xb1\xc4\x2f\xee\x48\x07\xb0\x86\x60\x14\x77\xe5\x3a\x49\xd0\xe0\xda\xf9\xe4\xcc\x1c\x6b\x7e\x39\xd8\xc6\x35\xb7\x68\x77\x1e\x76\x1e\x3a\xb8\x7f\x42\xac\x95\x97\xc1\x9c\xef\xf7\x5c\x67\x19\x73\xfa\xcd\xcd\x7c\x0c\x6b\x05\x3a\x1b\x3c\xdf\x0b\x0b\x7e\x80\x69\x92\xc8\x9f\x62\x22\xa5\xb2\x60\xed\x60\xc8\x1f\xa3\x6b\x1f\x3d\x1d\x34\xe3\x86\x3a\x9e\xe6\x29\xb3\xd9\xe5\x97\x31\x9c\xc2\x48\x55\xc3\x45\xf4\x7e\x49\x23\xd8\x9d\xe3\xc4\xc6\xba\xa5\x37\xd0\x20\x9c\x3d\xf5\xf9\x9f\xe1\xb5\x6d\x62\xd0\xe3\xdd\xe6\x6d\x7b\xba\x95\xf5\x7e\x98\x89\xd6\x88\xa0\xfb\x59\x1d\xdb\x91\x6d\x22\xa2\xd4\x91\x6f\x95\xd5\x9b\xec\xbf\xd4\xc5\x45\x4d\x44\x59\x8c\x83\x73\x73\x77\x75\x3d\x36\x7f\x44\xcc\x5c\x70\xd0\xe6\x1f\x9b\x03\x68\x5f\x66\x34\x80\x6e\x47\xb7\x8b\xb3\x0c\xeb\x09\x9f\x51\xfc\x53\x06\xae\x57\x26\x62\x6b\xa5\x37\xc5\x6e\xc0\x22\x59\xf4\x7c\xa3\x15\x24\xe2\x28\x22\x8e\x3b\xf2\x36\xdf\xc3\x36\x84\x03\x05\xa1\x49\xea\xf7\x8b\xff\x3d\xca\x12\x5d\xc3\xfe\xda\x44\x39\x72\x7c\xd4\xba\x3d\xfb\x0a\x13\xdc\xee\xf8\x59\x69\x24\x2d\x0d\x04\x13\x6d\xb7\xfb\x6c\xaf\xd6\xab\x99\xff\x2e\x68\x9c\x80\xec\x31\x7a\x9d\x49\xe3\xf9\x82\xc7\x1b\xa4\xa0\x29\xc1\xa8\xc3\x35\x48\x57\xea\xb3\xd2\x15\x4a\x48\xc5\x18\x29\xea\x53\xb1\x82\x9a\x18\x43\xfa\x8e\xa7\xcc\x74\xde\x6a\x5e\x95\xb7\xc7\xc2\xe6\x45\x31\xa3\x03\xec\x2c\x53\x6d\xc4\x4c\x8d\xac\xe8\x7c\x56\x17\xa8\x1a\xfc\x25\x91\x12\x86\x69\xec\x10\x2a\xfc\x02\xfb\xfd\xe9\xfe\xd8\xe4\xfa\x93\xaf\x9d\xb2\x18\xf3\xe5\xbb\xdc\xb1\xb3\x9e\x8b\x1a\xcf\x4f\x10\x22\x8d\x1c\x49\xf4\x8b\x54\xa8\x95\xf0\x36\x62\x9c\xf6\xad\x38\xa1\x69\x60\x7d\xc0\x2d\xef\x5e\x96\x47\x59\x14\xa7\xbf\x87\xdf\x11\x3c\x4d\x89\x9b\x59\xb8\x65\x7c\x2f\xdf\xbb\x5d\xdf\x7c\xc9\x83\xe8\x11\x13\x5c\x66\x88\x6a\xd8\x39\x42\xb9\xe0\xb3\x4d\x7b\x8e\x2b\x97\xa3\xc9\xcb\xd6\x19\x91\x9f\x74\x43\xa6\x9d\xe4\xd8\xae\x81\x76\x51\xe4\x50\x62\x1e\xfb\xfb\x61\xfb\x89\x7d\x2b\x64\x66\x95\xff\x24\xb7\x35\xb8\x00\x40\xe3\xc2\x62\x6b\x7b\xbe\x9a\x0a\x9d\x31\xa4\xae\x91\xc6\xf4\xd5\x8a\xd7\x52\xbf\x2e\xcb\xf9\x48\x33\x19\xc3\x80\xde\xd3\xda\x51\x46\x04\x9b\x58\x40\x64\x91\x0f\xf7\x26\x14\x6e\xe7\x97\xf1\xc2\x4c\x40\xc2\x48\xa8\x6c\x7d\xb9\x40\xca\x10\x9a\x65\x0a\x15\x84\x1c\x1e\xe1\x0b\x94\xd1\x10\x92\xf5\x8e\x82\xb0\xd4\xe9\xaa\xd5\xa0\xab\xda\xdc\x57\xfb\x5f\xd0\x9d\x87\x53\x98\x63\xd3\xdc\x7c\xbd\xfa\x2b\x05\xd1\xae\xb1\xa3\x87\xe9\xf6\x80\x7a\xb6\xc2\x0b\x9b\x51\x33\x28\x93\x63\x88\x60\xb0\x64\xce\xf7\x55\x61\xa5\x46\xa3\xfb\xb5\x3c\xea\xd7\x31\x25\x24\x13\x56\x41\x1a\xc4\xab\x17\xb2\x2c\xab\xf6\x8b\xaf\xc6\x6b\x56\xe5\x43\xd5\xae\x90\xb7\xbe\x85\xf1\x1e\x97\x45\x8c\x20\x50\x3e\xcc\xa6\x45\x51\xf9\x58\xcf\xcc\xc6\xc8\xe2\x28\x73\xe2\x5c\x35\x98\x5c\xb7\xcb\x8f\x43\x51\xd5\xe0\x1f\x61\xf2\x52\x59\x9c\x90\x98\x87\x48\x78\xfd\x06\x98\x5c\x75\xf1\xa9\x8b\x9f\x29\x8b\x99\x46\xe3\x56\x4e\xd3\xf8\x23\x8c\x6a\x6f\x69\xf8\x33\xa8\xd0\xb1\xab\x95\x92\xcf\xa0\x0a\x98\x15\x00\xb2\x8c\x1a\x2d\xc9\x08\x76\xb9\x28\x9b\x4f\x17\xcc\xb3\x05\xb4\x5f\x3a\x33\x0a\x8e\xf4\x2d\xf7\xa1\x44\x9c\x60\xce\xe9\xbc\xfc\x2a\x49\xa4\x31\xfd\xbf\x73\x7c\x6a\x06\xe3\xc5\x8e\xdf\xef\x02\xd9\x45\x38\x29\x75\xb9\xbd\x06\xda\xef\xdf\x57\x37\x09\xd6\x99\x8f\x78\xa6\x59\x96\x08\x9d\xf0\xc1\x8e\xde\x82\xdc\xaf\xc2\x97\xcf\x52\x1e\x21\x78\x3e\x28\x03\xae\xad\xb3\xfb\xa6\x37\x61\x91\xd3\x20\xf0\x65\x9e\x7d\xfe\x34\x1c\x4e\xdd\xdc\x6b\x86\x52\x73\x96\x31\x21\xb0\x8c\x72\x79\xc8\xd1\x38\x3d\xeb\x66\x2e\x33\xc4\xc6\x2f\x2a\xac\x0e\xfa\xcb\xd9\x90\x65\xb4\x47\x2f\xdd\x1d\xae\x73\x33\xce\xe3\x64\x99\x76\xa5\x2a\xc1\x27\xfe\x09\xf9\xb6\xf2\xd5\x8e\xd3\x97\xc9\x2c\x50\x1f\x43\x7d\x1c\x67\x81\x7f\xed\x8d\x65\x32\x32\xa1\x96\xff\xbe\x6a\xba\x41\x0c\x65\x93\xbf\xc1\xa2\x3e\x1d\xda\xaa\x73\x2a\x82\xa5\x91\xc9\x58\x06\xe1\x8b\x07\xf8\x68\x1f\xe5\xa9\x3a\xb6\xcb\xa6\xcd\x27\x28\x91\x4c\x31\x8d\x0a\x69\x2b\x53\x15\x63\x5b\x22\xd3\xd4\xf1\x68\x94\xf0\xd1\x3e\x54\x03\x7a\x25\xd3\x19\x41\x78\x0d\x7c\xb4\xb5\xec\x39\x07\xf3\xaa\xc4\x9c\x85\x6f\x64\x44\x86\xba\x5c\x0f\xdf\xef\x77\x4f\xcb\xcd\xf2\xe9\xc7\xf2\x66\xb7\x58\xaf\x1e\xfa\x06\xca\x86\x3c\x77\x60\xc1\xc1\xd0\x5f\x67\x4d\x34\xad\xdc\x1f\xa6\xdb\x44\x66\x74\x86\x85\x05\xbe\xae\x76\x37\x9b\xdd\xc6\xc4\x41\xb2\x6e\x85\x1d\x16\xd2\xfc\xe3\xee\x93\x11\x51\xda\x83\x46\x9c\x47\xe0\xe9\xc3\xd5\x90\x69\x92\x11\xcd\x30\x47\xfb\xbf\x6a\x18\x5c\x32\x12\x31\x12\xe4\xf6\xa8\x33\x3f\xf8\x4c\xdf\xc0\x00\x52\x58\xaa\xe3\xc9\x51\x97\x5c\x9f\xd6\x63\x39\x81\xbf\xc5\x9f\xcc\x64\x9c\xba\x94\x42\xd7\x2b\x1a\x90\x0b\x7e\xb6\x8e\xc9\xd8\x32\x5c\xee\x55\x0d\xf2\x75\x65\xbe\x97\xf9\x7f\x8e\x50\x42\x73\x4e\xb1\x32\x3d\x8f\xc8\x34\x73\xc4\x84\xc1\x4d\xf8\xe5\x1e\x21\x69\x64\x55\x12\x82\xdd\xbb\xff\x1c\xf3\x3f\x77\xce\xd0\xbe\x30\x2b\x24\xcd\x1c\x15\x7d\xf7\x05\xbf\x1f\x46\x66\xad\xa4\x8a\x21\xe8\xe7\xeb\xfa\x61\xfd\x74\x75\x7d\xb7\xdc\xdd\xad\x37\x1b\xc7\x7f\xfd\x5b\xdf\x46\xc7\x9e\xd8\x4f\x06\x5c\x90\x9f\x35\xa1\x85\xa5\x08\x28\x34\xde\x31\x7d\x1a\x90\x40\x32\xa1\x0e\xa1\x30\xc9\xc7\xf7\x14\x90\xe2\xc2\xaa\x28\x93\xd4\x3d\x54\xb7\xb8\xba\x9a\xa6\x26\x00\xf1\x46\xad\x52\xe2\x40\x91\xcd\x8b\xac\x21\x04\xa4\x65\x9a\x02\x96\xe6\x36\x47\xb5\x93\xb5\xca\xdb\x5f\x2b\xa4\x33\x99\x66\x29\xee\x9f\x07\x79\x6a\x2b\xd2\x5f\x06\xd2\xc4\xa5\x18\xa1\x7e\x86\x52\x9f\x1c\x62\x63\x96\x05\x93\x2c\xce\x60\x5c\xf7\xb3\xb2\x8f\xc7\x3a\x6f\x65\x99\xeb\x01\xf3\x18\xda\x92\x04\xbd\x7c\xbf\x40\x3e\x0d\x09\xda\x79\xc1\xdc\x67\xf2\x5c\x7f\x6b\x11\x92\x5d\xcf\x44\x98\xb8\x33\xd5\xf7\xb1\x20\x0c\x93\xcc\xb8\x6f\xd1\x19\x03\x45\xaf\x7f\x30\x49\x77\x4a\x9e\xba\xfa\xc4\xf3\x90\x4a\x68\x20\x22\x24\xea\x50\xc7\xba\xec\x43\x36\xe1\xa0\xa0\x0c\xd1\x93\xde\x6b\xdc\x56\x1b\x7c\xa5\xdf\xfc\xbf\xa7\xde\xa4\xcc\x22\x85\xe9\x59\xf4\x26\xd1\x81\x6d\xf2\xe7\xe9\xd0\xca\xb4\xc0\xb8\xa9\xc7\x7c\xde\x54\xcf\x7f\x17\xf2\xf9\x8f\xe3\x65\xe2\x2c\x26\x33\x03\x69\x3c\x4e\xa5\x4f\x57\x7f\x99\x41\x86\xf5\x0e\xad\x13\x90\x9c\xc6\x58\xa4\x54\x51\x9c\x86\x00\x47\x79\x6c\x50\x28\xdd\x1f\x53\x10\xe3\xe8\xc3\x17\x9a\xd0\x49\x31\xa9\x09\xc5\xc0\xc8\x01\x97\xfa\x3e\x30\x36\xbd\xb5\x89\x22\xd4\xa0\xb8\x59\xff\x4f\x88\x1c\x49\xac\xa1\xfd\x7f\xff\xbf\xff\x77\xbf\x7a\xe8\x49\x30\x77\x3f\xae\xee\xbe\x87\x92\x13\x09\xa9\x25\x59\xcf\x62\x61\xfc\x1c\x9d\xe4\x14\x25\x58\xc5\x3c\x71\xcc\xb5\x6c\xf5\xcb\x99\x13\x7b\x56\x75\xc5\xa4\xcd\x12\x0c\x72\x3d\x55\xc7\x02\x7a\x38\xb4\xb4\x3a\x53\x01\x92\x57\x57\x36\xef\xc7\x86\x8a\x2c\xc5\x6d\x63\x7d\x38\x36\xe7\xec\x4f\xdd\xf1\x44\xb8\x85\xa2\x41\x42\x9f\x3e\x55\xe6\x8f\xc7\x06\x70\x32\x7e\xdb\xae\xe7\xb6\x80\x8a\x21\xc1\xae\x51\xc7\x93\x83\x3a\x75\x9e\xdc\x20\x0a\x13\xd2\x66\x8a\x10\x17\x2a\xf3\x3b\xab\xcb\x1d\x5e\x1f\x4f\xe1\x73\x4c\xb9\xbb\xc2\x49\xca\x95\xf8\x3d\x81\x2c\xf2\x3f\x67\xb6\x8d\x22\x40\xb0\x92\xf6\xf1\xea\x69\xb3\x5c\xec\x16\x4f\xcb\x9b\xd5\xd6\xe9\x03\x8c\xe8\xe8\x98\xa2\xd4\x29\xe6\x4c\x6e\xdd\x0d\xb1\x5f\xde\x3b\x49\x04\x9e\xd5\x78\x9d\xb1\xef\xa5\xa9\x56\x33\x8b\x44\x25\xe0\x80\xa4\x9d\xdf\x2f\xf3\xe2\x34\xb8\xb1\x63\xac\x8e\x4a\x89\x41\x2a\xf4\x83\x83\x85\x2e\xb7\x5f\x9d\x09\xdd\x4c\xf1\x8e\x2a\xa5\x31\x5a\x09\x0e\xa2\xdf\x0d\xe1\xc1\xa6\x13\xa1\x4d\x26\xd0\x08\x42\xcc\xe3\x2f\x34\x56\x98\x4a\xa5\xc2\x40\x12\x8a\x57\x3e\x56\xe5\x9f\xf9\xe5\x40\x9b\x62\x89\x63\x0c\xaa\x61\x64\x28\x87\x63\xd6\xd9\x7a\x0d\xe8\xaa\x34\xbf\x3f\xb9\x02\x86\x31\x36\x44\xf1\x44\xa0\xc4\xd9\x7b\x37\x80\x7b\x5b\x4a\x71\x2d\x10\xc1\xe8\xe2\x8d\x8e\xc4\xe9\x93\x27\x15\xcc\x21\x09\xc1\x2b\xb2\xfc\x92\x8a\x87\x29\x21\x01\xb3\x13\xff\x86\x8f\xc3\x67\xeb\x4e\x68\x0a\x9a\xf9\x32\xf7\x6e\xd4\x0e\xd5\x03\x2a\x23\x31\x22\x0b\x76\xcd\xa9\xd4\x0e\xe9\xe0\xb9\xa4\xbc\xbf\x3b\xb5\xa5\x54\x46\x0d\x16\x93\xda\xbc\x40\x11\xc4\xe0\x9c\x88\xc1\x5f\xf3\xc2\x1e\x97\xc9\x22\x98\xca\x12\x89\xe3\x75\xbb\xdd\x5e\xe0\xd8\x11\xb3\x27\x97\x5a\x45\x1e\x43\xb8\xfd\x38\x23\x92\x66\x4a\x5a\x89\x70\x85\xe5\xa2\xda\xef\xbb\x61\xe4\x31\x37\x9b\x53\xd3\x42\x00\xe7\x2b\x15\x49\x74\x32\xfa\x79\xfb\xe5\xb8\xdf\x9f\x45\x2b\x42\x63\x9a\x62\x15\xe0\xdd\x51\xbf\x9e\xae\xa5\x3a\xf5\x57\xc9\x20\x28\x45\xdc\xcb\xba\xcd\x1d\x61\xd6\xf6\x74\x80\x95\xb9\x1b\xe5\xd4\x7d\x73\x1d\x2b\x9a\x8d\xe0\x9f\xae\x6a\xe2\x1f\xf3\x46\x80\x55\x7b\xb6\xae\xf6\x3f\x21\xff\xb5\x3d\xa0\x0c\x8b\x02\x73\xcb\x27\x22\xb5\xb3\x77\x31\xcc\x21\x7b\x10\x26\xf5\x0c\xed\x0e\x3e\x0e\x79\xcf\xbf\xca\x94\x11\x3c\x40\xb9\xbf\xd7\x61\xa7\x50\x10\x73\x44\xad\xd4\xae\x48\xe3\x19\x48\x7f\x84\x29\xec\x48\x95\xd7\xed\xac\xd2\x4e\x81\xf4\xdc\xf7\xdd\xd8\xdd\x56\xa1\xba\x62\x75\x33\xeb\x17\xd0\x8e\x0c\xb7\x81\xce\x09\xe9\x9e\xe6\xaa\x34\x3f\x67\x34\x5d\xa1\x2d\x38\x95\xa0\x40\x6d\xd0\x74\x6b\xda\xa7\xe9\x27\x7c\x9e\xb0\x42\x58\x22\x10\x19\xb8\x6b\xa0\x34\xf7\x55\xe9\x91\x73\x7f\x9e\x4d\xab\xd0\x9e\xa7\x34\x48\x22\xb5\x2f\x7e\x12\x4c\x68\x0c\x99\xb2\xda\x25\x1b\xaa\xd3\x6b\x55\x35\x2f\x21\x01\xa5\x23\x0d\x52\x8d\x42\x19\xdd\x54\xbf\x01\x69\x8a\xbc\xfc\x04\x1c\xab\x63\x62\xb1\x34\xf5\x50\xe7\x3a\x2f\x9f\x1f\x0b\x19\xdc\x27\x1d\x0b\x96\xa1\xf1\x48\xe9\xa4\xf6\x4e\xc7\x99\xc5\x88\xb4\x3a\xe6\x85\xb9\xcc\xc4\x36\x7d\x29\x1d\x7b\x68\xe7\xb3\xdc\xc3\x52\xd6\x68\x34\x85\xdb\x90\x84\x98\x51\xfd\xc5\x8f\x1c\xde\x3f\xa1\x4c\xef\xda\x72\x5c\xba\x51\x2a\xa4\xb3\x79\xa7\x1d\xa3\x69\x92\xe2\xc0\x94\xc6\x74\x7b\xb7\x7e\xc1\x52\xf5\xab\xd2\x4c\x75\xed\x2e\x2f\x4f\x3a\x4d\xdc\x57\xf6\xa4\x85\x97\xf5\x6f\xe7\xe7\xc8\x04\xc3\x5b\x6d\x0e\x35\x1d\x8a\xa9\x74\x67\x21\x7a\xe7\x70\xa3\x73\xa7\xa8\x30\x29\x5b\xf6\xed\x98\x4d\x44\x90\xde\xba\x7a\x1e\x14\xcb\x98\xe6\xa9\xd3\xff\x42\x34\xa1\x9b\xb8\xd3\x64\x4f\x4c\x7a\x44\xbd\xe6\x2a\x91\x2e\x13\xec\xe0\x00\x71\x7f\x15\xc5\x42\x81\xde\x24\x91\x3e\x1f\xbb\x63\x5f\x48\x8b\x8c\xb3\x61\x1c\x0d\x74\x53\xe7\x7c\xc8\x4c\x0b\x9b\xf5\x2c\x4e\x3e\x2f\x77\x01\x07\xa5\x33\x43\xb8\x0c\xc9\xe0\x23\xea\x4d\x5e\xfe\x08\x52\x68\xd4\xb5\x36\x79\x53\xbd\x97\xbf\x4d\x8c\x61\xad\x52\xc7\x93\x72\x9b\x37\x2f\xa3\x0c\x94\x56\x99\xd3\xc8\x7f\xcb\x87\xb2\xaa\x11\xf9\x00\xd3\x5a\x39\x01\xad\xdb\xe5\xcd\x5f\xd7\xda\x6a\x6d\x79\xd0\xbc\xc1\x97\x3f\xe3\x2c\x1a\x1e\xd7\x24\x12\x51\x9d\x58\x70\x33\xf9\x7e\x36\x16\x08\x82\xf6\x65\x83\x79\x2d\xcb\x17\x39\xf1\x23\xb4\x4d\x09\xc6\x83\xaa\x5a\xea\x02\x56\xed\xa6\xb3\x89\x46\x7a\x26\x4c\x5b\xd0\x4e\xdd\xa7\x86\x11\x4d\x31\x33\x11\xd1\x8e\x98\xe2\xa5\xca\xa7\xb5\x80\x26\xa6\x12\x31\x63\x0e\xef\x71\xce\x20\xc2\x4c\x9c\xc4\x28\xc1\xe8\x65\x34\x87\x78\x45\x38\xae\x04\xaa\x62\x6c\x17\x77\x93\x9a\x60\x13\x5b\x8a\xf0\x97\x2d\x34\x6d\x32\xfd\xc0\x26\xb6\x1a\x83\x93\x9b\x6a\x33\x62\xa9\x61\x86\xc4\x06\x97\xe3\xf7\x97\xaa\xff\x89\x58\x99\xb8\x1a\x2d\x39\x69\x9a\x46\x91\xa3\x99\x2c\x9c\x54\xdc\x9d\xec\xcd\x5e\x43\x23\x47\xf8\x11\x30\xe5\xff\x23\xf5\xeb\xa1\x9a\x6d\x76\x86\x12\xc1\xdc\x68\xec\xd7\xfd\x6e\xd4\xcf\x1b\x65\x98\xa0\x6b\x5e\xf2\x43\x33\x31\x8c\x0d\x4d\x34\x22\x88\xb5\xc7\x05\x85\x9f\x21\x46\x9c\xcc\x4d\xfe\xec\x8b\x97\xba\xe7\xfe\x16\xa0\xeb\x26\x89\x29\xeb\xd9\x3e\x1e\xab\xfe\x33\xa5\x5a\xe0\x3e\x75\xb3\xbc\x7d\x5a\x6f\xb6\xbb\xfb\xf5\xc3\xf6\x6b\x08\x1a\x18\x96\x5a\x3a\x55\x9d\xbd\xcf\x8b\xce\xe3\x29\x61\xc4\xd2\xc9\x30\x3a\xe9\x04\x92\xfa\x88\xe1\x2f\x03\x1f\x86\x47\xbe\x60\x4d\x36\x28\x23\x3c\x81\x0e\x1a\xce\x20\x48\xdb\xb7\xc7\x66\x1e\x8a\xed\x1b\x59\xe4\xfd\xb8\xaa\xdb\x81\xf0\x0f\xce\xe2\xb6\xbf\xaa\x7f\xbd\x54\x9f\x67\xb8\x49\x89\xf7\x0c\xc7\xd1\x55\x23\x22\x8b\x1a\xa3\xa3\x42\xe4\xce\x3e\x3f\xed\x64\x67\x2f\xf4\x1d\x2a\x18\xc3\x98\x43\xb0\xc9\x8b\x5c\x9f\xdc\x44\x9f\xa1\x5b\xc6\x93\xdb\x9f\x9b\x45\x64\x50\x74\xda\xbe\xd4\x55\x89\xb2\x5a\x13\x21\xef\xd0\x94\x30\x26\x03\x9e\xf9\xfd\x7b\x33\xfd\x1e\x99\xb0\x68\xcd\x2c\xaa\x66\x9f\xeb\xe5\xc7\x01\xea\x1c\xca\xbe\xb0\xc6\xb7\x92\x91\x88\xd2\x11\x5b\x04\xa2\xec\xa6\x9d\x2c\x4d\x82\x6b\xdd\xf5\xe2\xd6\xd1\x3f\xff\x77\xa4\x03\x46\xf1\x18\x31\xae\x58\xe6\xe1\xeb\x65\xa6\x2f\xa2\x44\x8a\x9c\x4c\xb6\x96\xdd\x83\xfe\xbd\x18\xad\x51\x42\x22\x68\x35\xc4\xaa\x5c\xe4\x75\x96\x38\x31\xca\xc6\x21\x14\xf9\xb8\x5e\xdf\x39\x02\xbf\x2c\xbc\xbe\x89\x6d\x88\x37\x96\xa0\xdb\x3b\x90\xf6\xf2\x12\x6a\x8c\xa4\xd4\x04\x0e\xad\x7d\xde\xd7\x6a\x1b\xa3\x0c\x32\x93\x07\xea\x82\x2b\xf3\x76\xf6\x02\x17\x42\x79\xc6\x18\x82\xc9\xeb\xb7\x5e\x51\xa9\x6e\xcf\x16\x39\x10\x46\x27\x83\x9e\x23\xfa\x50\x93\xea\x2c\x63\x95\x43\xa3\x3c\x83\x43\xf6\x5e\x2c\x63\x75\x6d\x21\x52\x2e\xba\x80\xab\x46\x60\xc1\x0d\xc7\x0c\xc7\x1d\x12\xb7\xf8\xf0\x23\x89\xa4\x17\x32\xc1\x48\xd7\xb7\x99\x76\x20\x03\xa2\x34\xea\x72\x6c\xde\xab\xda\xb8\x82\x8b\x70\x2e\x25\x29\xf2\x0e\xfc\xbb\xca\xcb\x45\x71\x54\xfd\xef\x22\x46\x0d\x56\x69\xcc\x5c\x56\x84\x01\x55\x2a\xf3\x07\x91\xe3\xf9\xb2\xd7\x01\xd4\x18\xac\xc4\xf7\x41\xea\x66\xb5\x3f\x54\x75\x0b\x75\x80\x86\x43\x62\x0c\x86\x89\xab\x69\x22\xf7\x4c\x48\x91\x41\x6a\x21\xf3\x45\x01\x08\xa9\x7d\x82\xff\x1c\x73\x47\xcc\xe7\x05\x4d\x88\x08\x86\x8c\x3f\x85\x71\x12\x7b\xee\x9d\x85\xfc\xf7\x71\x80\x57\x02\x17\xa0\xa2\x40\x6b\xde\xdc\xe7\xb3\x7c\x3e\x08\x1e\xa3\x53\x54\x54\xcd\x67\xa0\x03\x10\x99\x40\x23\xa9\x1b\x17\xa4\x05\x79\x46\xee\xd6\xb7\xd3\xd6\xdf\x2b\x44\x80\x2e\xd5\x88\x83\x90\x11\x3e\x53\xcf\x37\x78\x9d\xcf\xf2\x70\x90\xa5\x96\x3b\x39\xa0\x0d\x14\xc5\x28\x44\x08\x99\x8a\xe2\x40\x4d\x99\x37\x87\x63\x0b\x23\x28\x3d\xc8\xd4\xf1\x79\x38\x0b\x0c\x19\x4e\x67\xdf\x53\xa6\x12\x3d\x52\x33\x4a\x5f\xa0\x8e\xf7\x62\x54\x35\x01\x52\xe8\x2c\x42\x93\x56\xe7\x7b\x59\xac\x8d\x69\x6e\xab\x7a\x7d\x6c\x75\xb5\x9f\x44\x32\x40\xaa\x2c\x20\xa9\xbf\x56\x0d\x12\x08\x4c\x5f\x45\xea\x04\x31\x25\x9d\xd5\x80\x53\x01\x09\x08\x9b\xfe\x4e\xd6\xe0\xe6\x1d\x22\x34\x0b\x59\x14\xd3\xed\x62\x54\x5a\xd1\xbb\xd7\x41\x73\x8e\x81\x8a\x15\x9a\xbb\x5e\x76\xf3\xac\xb8\x01\x14\x4f\x44\x4f\x60\x54\x4c\x73\x79\xd3\x96\x3a\x8a\x30\x04\xb2\xf8\x1a\x72\x35\xa0\x15\x15\x0e\x67\x54\x37\xed\x08\x88\x7e\x13\x28\xc7\x66\x57\xb0\x16\xf1\x07\xbd\x16\x5a\xb0\xeb\xc1\x08\x9b\x7a\x91\x47\xaf\xf2\x30\x21\x0c\x99\x76\x99\x51\x51\xe2\xed\xc8\x2b\x27\x67\xe2\x73\x4c\xeb\xcf\xfc\x31\xb0\x24\x35\x5e\x8e\x27\x88\x6f\x38\x03\xe5\xff\xe8\xbf\x2e\x61\xec\xc1\x52\x03\xae\x6a\xae\xd2\xaf\xfd\xd7\xb0\xdc\x95\xe9\x85\xed\xd4\x47\xb8\x3e\x79\x4e\xab\x22\x1a\x0d\x40\x8a\x73\x82\xa6\xd0\x4e\x0b\x4c\x27\xb8\xd2\xc4\xeb\xe3\x09\x6b\x3c\x9a\x69\x86\x28\xf8\x24\x60\xad\x44\xa8\xec\x6a\xb1\x7e\xef\x41\x92\x36\x52\x2e\xbc\x89\xe1\xd7\x7a\x59\x9a\xbe\x5c\x2e\x58\xa9\xb3\xf2\xa0\x7f\x7c\x92\x7e\x9a\x47\xa5\x2e\x74\x8e\x8d\x89\x64\xb2\x07\xc8\x6e\x93\x00\x73\xb0\x71\xea\x88\x61\x1b\x7c\x8d\xf3\xcc\x89\x25\x04\x02\xd2\x1b\x65\x4c\x9b\xe3\xfe\x51\xe6\xf5\x78\x72\x59\x4a\x38\xf2\x67\x36\xef\xf2\xb0\x90\xb5\xb9\xad\xea\x99\x46\xdb\x68\x82\x59\x9a\x82\x4a\x66\x7a\xcc\x98\xc4\x9a\x7c\x0b\x4b\x75\x92\xda\x01\x3d\xe6\x03\x45\x03\x76\xcc\x26\x24\x42\xde\xb8\xc7\x17\xc4\x09\x4c\x3d\x60\x9b\x24\x1c\xf7\xcc\xeb\xed\x62\xb3\x7b\x5c\x3f\xa1\x42\xd4\xfd\xd5\xef\xfd\x71\x4d\x68\x1a\xb2\x8c\x4d\x5b\x1f\x75\x5b\xd5\xf3\x22\xdb\xf1\x6e\x6a\x13\x70\xe2\xcb\xb2\x70\xd9\xd5\x66\x90\x57\x63\x36\x8d\xc0\x57\x41\x7b\xd2\xd8\xab\xc3\xe1\x5c\x5c\xd2\x2b\xd8\xfe\x2b\x9c\xc4\x33\xe2\x36\x7c\x6f\xf6\x7a\x8d\xc9\x27\x90\x66\x3e\x15\x6d\xaa\x33\x0c\x5f\xb5\x79\x58\x3a\x2d\x53\xcc\x79\x56\xdd\x62\x7f\x2b\xf3\x02\xcc\x8f\x0a\x05\xd1\x46\x01\x1c\xdf\x96\x1b\x63\x1d\x18\xef\xf0\xfd\x0c\xd5\xe0\xdb\x08\x1a\x71\x3b\xd0\x67\x77\x23\x7a\xfa\x0c\x22\x65\x88\x88\x0e\xb3\x69\x37\x04\xfa\xad\x00\x2d\x5d\x00\x60\xdf\xc7\xa7\xac\xa4\x8e\xbd\xb8\x76\x5b\x9e\xe9\xac\x8f\x6b\x68\xdf\x01\xca\x9b\x5a\xbe\xf7\x5f\x4b\xc5\x8c\xfb\xb2\x52\x64\xca\x98\xa4\x23\xac\x62\xce\x4f\xc1\xd0\xd1\x4f\x04\x8e\x07\xaf\x67\xfa\x7c\xca\x92\x88\xcc\x99\xda\xc3\x55\x34\x01\x46\x7c\x14\xcd\x57\xd0\x6f\x30\x7c\xdc\x2d\x44\xa7\x4b\x0e\xa2\x35\xb1\x45\xbb\xb2\xf1\x75\x45\x7d\xae\xdd\x1a\x21\xb0\x12\xb2\x7d\xa9\x01\xb5\x48\x3f\x59\x52\x2c\x50\x83\x28\x19\x69\x5b\xa8\x6f\xab\xfa\xf5\x09\x1a\x7d\xec\xb9\x76\xa6\x74\x12\x16\x24\xc5\xc2\x96\x77\xc8\x57\x8b\xf5\xbd\xfc\xc8\xf7\xc7\x7d\x7f\x50\x19\xd4\x2f\x56\xc7\x4f\x62\x06\x16\x40\x63\xb9\x5a\x0d\xed\xae\x08\x8e\x0e\x8f\xa2\x88\x23\xc8\x69\x9f\x97\x55\xed\x49\x20\x26\xd3\x85\x47\x11\x25\xc4\x55\xf0\xe5\xed\xa2\x0a\xde\x26\x8f\x22\x30\xd4\x73\xde\x22\xa6\xae\xc6\x14\xdf\x6c\x4f\xe2\x51\x1c\x09\xe9\x91\xf9\x8b\xbd\xd9\x69\x17\x24\x09\x17\x21\x91\x53\x12\x43\xd0\x9f\xae\x7d\xc6\xbe\x9e\x5d\x83\x44\x2a\xf2\xfb\x9a\xac\x9f\x77\x74\xb2\x1e\x74\x87\x0d\xfa\xd5\x3e\x3c\xe6\x29\x09\xbd\xe2\xd2\x2f\x4b\xd5\x78\x44\x14\x43\xcb\xda\x56\xf5\xae\xa8\xca\xe7\x16\xea\x7d\xff\x70\x46\x61\x71\xd4\xf7\x06\xea\x27\x68\xf3\x1a\xbe\x56\xa6\x98\xdf\x1c\x28\x4b\x7a\xba\xc2\xd5\x62\xdd\xcd\xfd\xa9\xe0\xc8\xec\x96\x29\x01\x04\x1e\x7d\xa9\xda\x4f\x0a\xc5\x66\xed\x3b\x9f\xd0\xb3\x6c\xfc\x2a\xa5\x3f\x3b\x8d\xa5\x5c\x4e\x23\xd0\x5f\x9d\x2a\x63\x38\xce\x9d\x95\xaa\x03\x54\xe0\x51\x1e\x7b\xac\x03\x8f\x58\x96\x62\x84\xa3\x79\x97\xf5\xfe\x09\xc6\x36\xd4\xc5\xf1\xcc\x23\x66\x2c\x5a\x1f\xd7\x79\xb5\xe9\x23\xfa\x3c\xe2\x89\x44\xff\xea\x8b\x93\xc7\x19\x03\x35\x79\xc4\xd3\x04\x75\xfa\xca\x5e\x7e\x91\x47\x3c\x03\xe0\x61\xaa\x3a\xc2\x96\x66\xb4\x09\xcc\xee\xca\x4d\x82\x09\x13\x14\x43\xdb\x56\xae\x16\xea\x93\x27\x14\x31\x44\xe3\x3c\xfb\x2f\xb2\x51\x3c\x12\x29\xa0\x73\xba\x91\x16\xc6\x88\x45\x7f\x38\x8b\x1c\xd3\xbe\xad\x01\xfe\x84\x40\xb3\xe7\xfc\xa7\xcb\x17\xcc\x48\x8a\xbb\x5b\x67\x56\x77\x26\x84\x7f\x88\x5e\x6f\x3d\x34\x4b\x04\x7a\x35\x3e\x55\xbd\x33\xf5\xf1\xf9\x6c\xbf\xb8\xdc\x17\x99\x88\xd3\xde\x7d\x9f\x44\xd0\x7d\x03\x69\x25\xc2\x43\x6e\x97\xcb\xdd\xd5\xcd\x7d\x00\xea\xf0\x48\x31\x47\xc2\xec\x8a\xf7\xfb\xac\x13\x8f\xb4\x8d\xb1\x17\xf6\xd5\x1b\x7c\x96\xc8\x98\xde\xc3\x10\x97\xec\xba\x41\x2c\xd6\xf6\x23\x5c\xc9\x50\x97\x33\x5b\x1f\x5a\x30\xab\xcb\x86\x29\x8f\x4c\x4a\xd1\x22\x3a\x38\x0e\xb1\xab\x73\x5e\x47\x11\x5a\x66\x04\x5f\x36\x6f\xae\xa1\x5d\x74\xfb\x5c\x3f\x76\x4d\xc6\x10\x5b\xd0\x8d\xea\x7e\x1d\x33\xca\x22\x01\xd8\x55\xb7\xe1\xb4\xb2\xff\x1d\x22\xeb\xec\x7f\x97\x4c\xbe\x3a\xb6\x55\x7f\x88\x39\xc6\xf7\xa2\x7a\x1f\xa5\x47\x79\xb7\xf2\xa1\xa9\xdc\x2b\x96\xfc\x95\xc1\x75\x31\xfd\x31\x80\xa0\xcf\x74\x8f\x79\x04\x56\x0a\x57\x14\x8b\x4c\xc9\xb7\xb2\x28\x96\xd6\x82\x6e\xdd\x83\x5c\xfe\xfe\x16\x5c\x75\xd8\xa8\xba\xb8\x59\x97\x5e\xc1\xea\xe2\x29\x71\x94\x65\xc8\xc9\xbc\xc9\x8b\x5c\x57\xe5\x0f\x59\x14\x2e\x72\xf7\x5b\xdf\xc0\x18\x39\x89\xc0\x75\xbd\x7a\x23\x4f\x7d\x03\x20\x36\x58\xc6\x48\x7a\x73\x2e\x8b\xdf\x35\x72\xf0\xd2\x07\x78\x9f\xea\x02\x5c\xcc\x86\xf1\x38\x16\x0c\xf7\xf5\xdb\x63\x69\x76\x53\xb8\x0c\x8f\x49\x6c\x91\xe7\xf1\x6b\x55\xe4\xaf\xd5\xa1\x9d\x48\x91\xf1\x98\x50\x63\x47\xfc\x5e\xd7\xc7\xbc\x30\x79\xf9\xd7\x80\x8f\x4f\xf2\x33\x03\x92\x81\xc7\x44\x44\x91\xdf\xae\xee\x2a\xfd\xea\x4a\xa2\x7f\x91\x27\xe0\x31\x31\x11\x33\x03\x94\x03\xb3\x26\xe7\x69\xe5\xd9\x39\xa0\x50\x80\xfb\xad\x6a\x03\xba\xdd\x1f\xa1\x11\x0b\x90\x93\x45\xde\x4e\xeb\xb9\x79\x4c\x63\x57\x0d\x33\x92\xc0\x38\x4b\x4c\x9f\x07\x83\x78\x4c\x69\x1f\xa5\x42\xe3\xdd\x91\x63\x5c\x9f\xb6\xb5\xd4\xaf\xab\x29\x08\x9e\xc7\xa9\x16\xc8\x7a\x89\xd1\x0d\xaf\x7c\x71\x2e\xee\xce\x63\x46\x08\x82\x9f\xf3\x66\x57\x7d\x2a\xf1\xcb\x63\x06\x99\x96\x41\x16\xba\x95\xc5\xaa\x7c\xab\x30\x93\xe3\x8f\x77\x63\xc7\xe9\x7e\x1c\xcb\xf6\xaa\xf5\x25\xa1\xdb\xd3\x61\xd4\x44\x45\x18\xfc\x0d\xd9\xf8\xf1\x5c\x8d\x45\xe4\x2a\x2c\x9f\x9d\xe2\xc4\x26\xff\xe8\x8f\x10\x87\xa0\xaf\x06\x92\x16\xef\x82\xf6\x2b\x49\x2c\x98\x53\xe2\xfe\xf6\xb0\xdd\x4e\x06\x99\x00\x8e\x10\x95\xdb\xbc\x94\x45\xfe\xa7\x9c\xa0\x7b\x2f\x8f\xe9\x8c\xc4\xd4\x73\xd6\x5e\x7b\x31\xa0\x38\x5c\x2e\x13\x09\xb5\x41\xe2\xd5\x53\x5a\xc0\xe1\x5c\x66\x8b\xc7\x32\x32\x18\x7e\xff\x5a\x15\xf2\xa5\x3a\x7c\x4c\x9e\x4a\xc7\x09\x96\x73\xee\xf2\xe6\x6a\xed\xd5\xa4\xbf\x37\xf2\x19\xfb\x6b\xf6\x1d\x75\x12\x21\x5d\xec\xcd\xd3\xe3\xa7\x4f\x3e\x5b\x2c\xb4\x31\x68\x8b\x23\xae\x6f\xf7\x75\xb5\xfb\xdf\xed\x1f\xfd\xad\x6d\x0c\x3e\x58\x38\x0a\x8c\x9c\xad\x84\x97\xbb\xc6\x50\x85\xf1\xbf\x1e\xb6\x38\x66\xb6\xe5\xb1\x61\xda\xe1\x2e\x0b\x28\x8d\x92\xfa\xb5\x1d\x0a\x4b\xff\xef\x5f\x83\xf3\x34\xfa\xbf\x63\x50\xd2\x9b\xbe\xb4\xc9\x00\x57\x6e\x75\x3c\xdd\x16\xd5\xfb\x0c\xb3\xc5\x63\xa3\x84\x94\x63\x54\x96\xa7\xae\x9e\x2d\x67\xc6\x72\xd4\x4c\xc0\xac\x54\xfe\x27\xec\x4a\x78\x7f\x42\x62\x99\x9b\xcd\xff\x1e\xe1\x3c\x73\x37\xeb\x48\x48\x85\x63\x50\x36\xfb\xbc\x44\x52\x94\x30\x76\x77\xf5\x08\x13\xed\xdd\x41\x1e\x83\x20\x99\xa7\x8d\x58\x4d\xdd\x37\x1e\x43\xe6\x28\x97\x3b\xb3\x22\x94\x34\xbc\x57\xfd\x51\xc5\x30\xdf\x5d\x83\x3e\xd6\x4d\xfe\x06\xbb\x6e\xc2\x4e\xa2\x09\xc3\x63\xd9\x58\xa1\xab\x7a\x57\xb5\x2d\x34\xa7\xa9\x23\x10\x5b\xad\x20\xa4\x4c\x7c\x4d\xde\xa5\x18\x08\x27\x11\x25\x18\x47\xfd\x27\xd4\xd5\xef\x83\x2d\x41\x22\x16\x07\x22\xcb\x80\x5b\xeb\x56\xd1\x21\xa6\xc0\x49\xac\xbc\x40\x82\x6c\xf5\xcb\x32\xa0\x6b\xa6\x49\xdd\x51\xc7\x90\x58\xbb\x0f\x81\x68\x1d\x57\xee\x09\x70\x57\x49\x33\xd4\xee\x4c\xd6\x3a\x42\x84\x42\xeb\xca\x54\xc8\x19\x0d\xdd\x54\x9b\x88\xcc\xf8\x76\x94\x03\xc2\x2c\xf3\xf2\x2d\x6f\xc1\x5c\x9f\x90\x32\x45\x16\xa3\x14\x23\x27\x54\x70\xcc\x79\xe5\xba\x5a\xbf\x41\x4d\xfa\xdf\x95\xe2\x74\x2c\x90\xbd\x2a\x6d\x75\x5b\xd5\xdd\xff\xd6\x7f\x47\x1d\x9b\x93\x84\x53\xac\x86\x9a\xb2\x29\xce\xd8\x37\x7a\x73\x62\xe8\xc0\x34\xa2\xca\x0f\xf0\x85\x9c\x2d\xc9\x24\x95\x0e\xf5\xdc\x9b\xfc\x72\xf2\x85\x49\x6a\x5d\x59\x73\x37\x54\x3e\x59\xc5\x08\x8b\x9c\x1c\x84\x8b\x17\x8d\x89\x9c\x42\x03\xee\xa8\x03\x3b\x8b\xf1\xb6\xa8\x66\xd8\x44\x4e\x98\x75\x54\x45\x7b\x99\x23\x57\xe1\x06\x55\x68\x46\xf5\xb8\x9c\x70\x96\x60\x49\xa4\x42\x3d\xd2\x66\x94\x67\xe4\x84\x1b\x96\xf8\xe4\xf7\xe1\x88\xfc\x0b\x6d\x01\x66\x0b\xf5\x3e\x2f\x47\x65\xa4\x33\xf8\xe6\xf4\x5f\x67\x84\xb3\x9c\x88\x4c\xa3\x71\xde\x19\x1c\x8d\x03\xd5\x7e\x82\xfe\xe2\x44\x28\x66\x54\x10\xfc\x6c\x91\x56\xc1\xa3\x0f\x42\x03\xed\xf4\xc4\xca\xea\x0d\xb3\xb7\xd3\x89\x44\xb2\x28\x76\x72\x84\xfb\x43\x7b\xfa\x59\x57\x81\xd9\x72\xfa\x44\x59\x16\x45\x99\x0f\x01\x35\x6d\xb5\x87\xfa\xab\x6c\xae\x16\x0b\xc4\x1f\xdd\x9d\x35\x06\xc4\x65\x1c\x3a\x1f\x2e\xd0\xe6\x8f\x86\x85\x34\x04\xc1\x81\xc7\xb2\x1b\x73\xf8\x92\xb3\x2b\x48\xc3\x48\x4f\x49\xe7\xd8\x81\xc6\x95\x3b\x9c\xa8\xd8\xd1\x14\xd7\xe7\xd0\x6d\x4e\x14\x33\x58\x74\xbe\x78\x5a\x5e\x61\x3c\x6d\xc4\x22\xc0\x89\x32\x1a\x29\x25\x7c\x36\xbd\xf3\x4b\x7e\x91\x8b\x9c\xf5\xb6\xf6\x92\xea\x9b\x7d\xf5\x0a\x61\x49\xe8\x7a\x75\xd8\xb5\x3e\xb3\xdc\xfe\xc2\xb2\x0b\x37\xc8\x9c\x62\xa8\xcf\x33\x8d\xb4\x02\x37\xf9\x73\x78\x05\x13\x25\xc6\x83\x44\xbe\xcc\x05\x51\x39\x31\xc2\x31\x1d\x96\xc7\xbd\xd7\x47\xc9\x87\xd1\x60\x40\x23\x85\xa1\x7b\xf2\x1f\x52\xeb\xbc\xf4\x76\xd3\xec\x32\x40\x14\xee\xaf\x4d\x55\x78\x38\x4e\xb7\xd8\x57\xc7\x76\xb2\xea\x00\x35\x08\x78\x70\x66\x9e\x1b\x1c\x0e\xab\x2b\x2f\x19\xfa\xff\x15\xee\x9b\x13\x48\x62\xc6\x83\x31\xb8\x3f\xb4\xb0\xa3\xa2\xbf\xb3\x54\xca\xc7\xe2\xf2\xbd\x1c\x57\x92\x70\x62\x79\x96\x0a\x17\x48\x69\x8f\x25\xec\xb0\x72\x61\xe7\xcb\xd4\x7d\x23\x1a\xc5\x4e\x0c\x3e\xd7\x15\x06\x8d\x6e\x7a\xfc\x09\xa7\x11\x05\x5c\xfa\xcb\x5c\x57\xc5\xf0\x6b\xa2\x70\x16\xe8\x02\x64\x79\x3c\xac\x8d\xe9\x8f\x28\xa7\xf7\xf5\x24\x95\xca\xdb\x91\xcb\x42\xe3\x38\x43\xdb\x6c\x1f\xa2\x4d\x45\xbf\x7c\xd0\x38\x35\x2c\x0a\x9c\xed\xbe\xbc\xbe\x37\xf7\x68\x2c\x39\x1f\x34\xa1\xb6\x4f\x57\xd3\x0f\x44\x89\xa4\x18\xb4\xec\xb6\xfb\x09\xc1\xff\xc4\xca\xa0\xc4\xd0\x00\x85\xfc\x22\xf7\x0a\xcb\x43\x65\xdd\x9e\xce\x80\x16\x5d\xd3\x0c\x2b\x69\x0d\x38\xcc\x46\x78\x92\x84\x3b\x0b\xe1\xd8\x74\xb6\xe9\xc3\x71\xbf\xad\xde\xcb\x69\x55\x25\xa7\x69\x9c\x44\x2e\x78\x75\xac\x5b\xc7\x8d\x19\x26\xc8\xd3\xa8\x67\x53\x4a\x11\xcc\xf2\x08\x50\xdf\xe5\x1a\xca\xa6\x87\xda\x73\x9a\x26\x2a\x09\xe5\xe7\x79\xdd\xbe\x0c\x9e\x1d\x4d\x05\x77\x04\xf2\x43\x71\xc8\xf3\x85\xc2\x10\x4e\x53\xa3\x11\xbb\x86\x54\xb7\x3e\xe7\xf3\xf9\xa6\x4d\x53\x2b\x11\xe0\xf0\xfe\x52\x15\xc8\x21\x8a\x7e\xd4\x1d\xd8\x7e\x9c\xb0\xd4\x22\xae\xae\xa7\xe4\xbf\x1f\xf1\x0d\xf9\x36\x3c\xa2\xf8\x74\x2f\x18\xd5\x6a\xdc\x14\x19\x05\x08\x28\xcf\x08\x22\xbd\x6f\x97\xcb\xdd\xcd\xf2\x61\x7d\xbf\x7a\xb8\xda\x06\x86\x9f\xee\xb0\xe3\xc8\x19\x98\xd3\x3d\xe9\xa5\xf8\xc7\xf4\x3e\x9a\x84\xb4\x6a\xb0\x77\xf0\x3b\x5e\x0c\xe1\x7b\x18\x16\xa7\xdc\x44\x6e\x97\x6b\x9e\x1d\x67\x4a\xb8\xad\x48\xa5\x53\x61\x0a\x84\xab\xe1\x8e\x6e\xdd\x9b\xdb\x64\x34\xe3\x32\x68\x53\x7e\xaf\x8b\x5f\x3a\x8e\x34\x93\x32\xe8\xb4\xa2\xb4\x49\x69\xab\xbe\x44\x66\xb8\xa2\x24\x0e\x69\xaa\x65\x79\xdd\x8b\xe1\xf6\x93\x47\x76\xdb\x93\xcf\xc1\x20\xdd\xa5\x41\x86\x93\xf1\x62\x11\xa7\xa3\x3a\x1b\x4e\x55\xa4\xad\x17\xa4\x40\xcd\x5e\xf3\x34\x22\x02\x18\x6e\xab\x62\x83\xe8\xee\x30\xd2\xb1\xe0\xf1\xaf\xe3\x49\x54\x51\xc9\xf8\x14\xf6\xd2\xd9\x94\xd3\x46\x9a\x70\xee\x18\x40\xaa\x5a\x3e\xc3\x40\xd7\xc4\xa9\x56\x1a\x91\x7a\x9d\xcf\x70\xd7\xaf\x57\xdd\xcf\x68\xc7\x18\x89\x69\xd8\xf0\x2b\x18\xf4\x16\x37\x8f\xcb\xc5\xf6\xe9\xfb\xfd\x3f\xc3\x01\xe3\xb7\xc7\x80\xad\x72\x04\xc1\xf2\xec\x83\xf8\xe6\x10\x39\x41\x38\xf4\x23\xaa\xd7\x51\x4e\x8c\x53\x1b\x29\x1c\xfe\x45\x55\xbd\x1e\x0f\x0b\xb9\x3f\xc8\xfc\x19\x73\x9e\xf1\xec\xad\x2c\x4d\x30\x61\xbc\xc9\xf7\x07\x4f\xcd\xd0\x6d\x49\xb3\x6d\xac\x9f\x57\x16\xa2\xe0\xbc\x8c\xf5\x76\x38\xb5\x36\x32\x6a\x50\x4b\xb9\xb6\x3d\xf1\x8a\x6b\x90\x44\x69\xc2\x03\xc4\x12\x27\x52\xcf\xf8\x38\xd1\xf3\x0a\xad\x39\xc3\x74\x57\xd7\xa3\x0f\x8e\xe6\xb0\x67\x22\xb2\x0f\x55\xdb\x2b\xf1\xf8\xf6\x31\x10\x4c\x30\x1d\x02\x41\x15\x4f\x68\x14\x3b\x21\x50\xdc\xc3\x50\xdb\xe8\x51\x76\xae\xc0\x34\x90\x76\xe6\xd2\xcd\x87\x7c\x42\xb5\xc4\x54\x5f\x09\xef\x2e\xfd\xf3\x19\x14\xff\xf2\x76\x97\x24\x31\x4f\xbd\xd9\xb3\x3d\x1d\x72\x2d\x8b\x55\x0b\x7b\x9c\x35\xd3\x8c\x5f\x68\x6f\x5d\x65\xe8\xbb\x2c\xdb\xfb\xd3\x39\x75\x66\xd7\x82\x52\x97\x18\x5f\x14\xf2\x0d\x16\x2f\x32\x9f\x99\x76\x49\x62\x13\x1c\xad\x6f\x9e\x25\xf8\x1e\x9a\xce\x49\xbf\x24\x0b\x7f\x19\x9b\xdf\x5d\x42\xe3\x56\x8c\x49\x97\x5b\x00\x4c\xd5\xbb\xaf\x7e\x5d\x1d\x03\x21\xc2\xf0\x54\x69\x42\x9d\xe9\x5f\xed\xf7\xc7\x32\x6f\x4f\xdd\xc6\xd2\xf4\x39\x53\x9e\x30\x9a\x72\x3a\x48\x23\x75\x6e\x51\xde\x4f\xa2\x84\x49\x2a\x54\x20\x08\xd6\x75\x75\x5f\x99\x63\x01\x5d\x37\x5d\x18\xb7\x09\x8f\x25\xd2\x2f\x94\xb0\xaf\x06\x2a\x50\x9e\x88\x48\x22\xaa\xf1\xea\xa8\xdb\x63\x83\x26\xff\xdf\x64\xb1\x0d\x17\x30\xb1\x75\xb9\xd4\xb7\xce\x18\x34\x79\x5b\xd5\x4f\xf9\xf3\x4b\x3b\xb3\x66\x13\x99\x31\xdc\x81\xaf\xbf\xdc\x6e\xff\xaa\xdc\xb7\x6b\x9d\xe1\xac\x77\xa3\xf1\x2f\xd1\xaf\x3c\x91\x90\x09\x97\x4d\x33\x00\xfb\xcd\x4b\x7e\x98\xf5\x80\xb4\x12\x09\x93\x4a\x78\xaf\x46\xde\x4b\xa2\x08\x27\x24\x20\x34\x3a\x07\x6a\x1e\x29\x4d\x14\x88\xc4\xc9\xa5\x35\xaf\x7e\xe7\x98\x36\xd0\xc2\x69\x11\xbb\x94\x19\xd2\xbb\x5d\x90\x5a\xe5\x89\xe1\x2c\x54\x4c\x7e\x5f\x74\xe6\xd1\x23\xd4\xcb\x71\xb5\x6a\xdf\x0e\xd0\xe6\xe9\xd9\xaa\x9c\xd9\x7f\x35\x1f\x41\x10\x19\x24\x35\xd9\xa0\x08\xf8\xab\xbf\x8e\x98\x1a\xd3\x09\xc8\x38\x0e\x2a\x6c\xc8\x22\xe8\x99\xac\xca\xf2\xb3\xac\x4c\x62\x05\x64\x81\xc0\x53\x36\x81\x8a\x75\xbe\xe8\x58\x01\xc6\x78\xa6\xb4\xf5\xcf\x87\xe5\xd3\x6e\x31\xa8\xe9\xf3\x34\x4a\xa8\x48\x47\x53\x6a\xc8\xfa\x4f\x9e\x2f\x8d\x84\x44\x7b\xeb\x50\xc3\x41\xd6\xe0\x0b\x43\x6f\xab\xfa\xa1\x2a\xd7\x5f\xdc\x64\xf5\x4d\x63\xae\xc3\x72\xea\x3d\x2a\x0f\x71\x0a\xc7\x95\xc0\x94\x6a\xe0\xa6\x39\x3a\x11\x91\x7f\x5d\xf2\xd2\xc7\x0b\x98\x3f\x9d\x44\x04\xb1\x5f\x1b\x68\x11\x72\xb3\xdd\xca\x8f\x69\xde\x30\x34\x24\x29\x96\x52\xf6\x58\x80\x6d\x0e\xf5\x42\x1e\x9e\x40\xea\x97\x7e\x95\x4d\x89\x31\x38\x26\xaf\x6e\x37\x63\xbe\x18\x9e\xd2\xd8\x99\x92\x2e\xc1\x3a\x32\x94\x53\x4a\x22\xe5\xd8\x36\x8e\x0a\x0d\x9b\x6e\x11\xb9\xcf\xcb\x16\x8b\x11\xa7\x4f\x41\x69\x8a\x1c\x0c\xaf\xa0\xb5\x7c\xdd\xf5\x48\xc5\xff\x23\x5e\x35\xa5\x6b\xe2\xc4\x7d\xbf\x7b\xfa\xe7\xcd\xeb\xc9\xd7\xac\xff\x6a\xf6\xa5\x34\x25\xe8\xcf\xec\x65\xfd\x9c\x97\xa3\xdd\x38\x4d\x12\x66\x21\x50\x4e\x7d\xe9\xbd\xcd\x34\x61\x06\xc1\xe7\xc8\x99\xd6\x4e\xa8\x30\x2e\x06\x2d\xd2\x44\x32\xa5\x43\xbc\xad\xf3\x95\xda\xe5\x5e\xe6\xe7\x72\x22\x93\xe7\x4a\x6c\x84\x39\x8b\xbb\xf5\xe2\xdb\xfa\xfb\x76\xf7\xb8\x7c\x5a\xad\x6f\xfa\x67\xb0\x14\x51\x48\xde\xc3\x59\xd6\x72\x04\x80\xe5\x69\x4a\x84\xf4\x20\x25\x24\xe9\x91\x9f\xd2\xe9\x86\x13\x12\xc9\xc4\x48\x0f\xfe\x17\x01\xfb\x34\xe5\xd6\x69\x5d\x17\x55\x03\xc1\x80\xe8\xef\xac\x75\xe2\x23\x40\x5f\xd6\x8f\x9f\x50\xda\x7d\xf6\x10\xe0\xf4\xbd\x3d\xe2\x13\xea\x6e\x69\xbb\xc6\x28\x4c\x6f\x48\x7a\x20\x38\x4f\x59\xe4\x62\xe3\xe8\xf4\x22\x76\xea\xfb\x1c\x92\xc6\x53\x9e\xa6\x99\x07\x83\xd5\x3b\xac\x84\x95\x75\x3b\x19\x9e\x3c\xe5\xb8\xae\xfc\xfe\xe1\x62\xd9\x03\xf1\x07\x4f\xb9\x70\xc4\x1f\x0b\xd9\xbc\x1c\xe4\xe9\xcf\xf0\xbb\x22\x0a\x3b\xa0\x95\xaf\x30\xc8\x2c\xcf\x6e\xad\x28\xc3\x98\xfa\xb1\x09\xa1\x8c\xc5\x24\xdd\x3b\x6b\x9d\x1a\x4c\x84\x3d\x5d\xdd\x2e\x1f\xfa\xaf\xac\x44\x84\xf8\x25\xb9\xcb\x4b\x5d\x3d\x97\xf9\xac\x3a\x85\xa7\x26\xa3\x96\x8d\x30\xcc\xf7\xb0\xbe\xac\x21\x39\xfd\x84\x06\x12\xe9\xc4\xa4\xfd\x3a\xb5\x2a\x87\x32\xd6\xcb\x4f\x08\x34\xc2\x32\xe7\xce\x08\xbe\x85\xbe\x8f\x80\x31\x64\x8b\x58\xbf\x41\x7d\x90\xa7\x29\xc6\x79\xf6\x7d\x81\x4b\xac\x34\xd0\x28\xc6\x70\x19\x98\xc2\x53\x10\x1c\x90\x11\x13\xea\xa6\x2a\x5d\x7d\x80\x8b\x43\x5e\x8e\xda\xfc\xf5\x9f\x70\x61\xe5\x80\x78\xff\xae\x72\xd4\x5e\x44\x31\x3d\x9f\x54\x9e\x3e\x82\x8d\x5c\x40\x65\x93\x7f\xb4\xa1\x06\x38\x1c\x92\x0a\xfd\x31\xf7\x49\x31\xfa\x76\x5e\x7c\xfc\x8b\x92\xf7\x00\xa9\xed\x6f\xc6\x48\xaa\x85\x53\x6e\x6d\xee\x1d\x6d\xf3\x6c\x14\x33\xc2\xd3\xd4\x84\xc0\xc7\x71\x8f\x7e\xa0\x07\x43\xfc\x84\xfc\xfa\xb4\x2e\x07\x8a\x42\x7f\x0a\x15\x2e\x06\x7c\xe8\xdc\x57\x32\x18\x5a\x8c\x5a\x07\xed\xba\xcd\xcb\x16\xf4\xcb\x78\xcb\x61\x09\x91\xd8\x41\x8b\xf5\xea\x61\xb7\x58\x6f\xb6\xbb\xd5\x62\xbd\xdb\xae\x96\x3d\xf1\x34\x67\x09\x75\x42\xf7\x87\xba\x6a\xab\xb1\x63\xc1\xd2\x38\x41\x3f\x1f\x45\x45\xfa\x1f\x53\x85\xdb\xcc\x7a\x9f\x7f\x5c\x30\x57\x19\xcb\x62\x04\xd9\x3e\xc0\xfb\x54\x48\x7a\xfc\xe5\x18\x97\xe0\xea\xd9\x94\x0a\x17\xe6\x00\xc8\x4f\xe6\xf8\xe3\xee\xaa\xe7\x5c\xcf\x2e\x2d\x08\x47\x57\x72\xe7\xf2\xd1\x03\x6f\xc3\x59\xc5\x58\x70\x61\x98\xe0\x24\xe8\x11\x3f\x81\x86\xb2\xbd\xc9\x65\x1d\x02\x12\x4c\x08\x47\xdb\x6b\x00\x35\xe4\x6e\xab\x63\x69\x30\xe6\x75\x03\x6f\x7d\x9b\x2c\xc1\x00\x8f\xdb\x78\x9e\xfa\x15\x99\x09\x93\x61\x5c\x1a\xf9\x27\xf2\x06\x66\x59\x65\x3c\x0e\xe3\xa0\xfd\xbd\xcc\xcb\xff\x3a\x70\xcf\x84\x31\x18\x9f\xc6\x6a\x4c\x3a\x60\x5a\xc3\x6d\x32\xe9\x88\xd2\x37\x77\x8b\x2b\xf3\xd6\x75\x8c\xf9\x4b\x03\x95\x65\x96\x22\xc2\x69\x7f\x2c\x7e\xff\xe3\xd7\x1b\x09\x93\x91\xf3\x0c\xbe\x9e\x54\x9d\x9b\x51\xe1\x33\x67\x32\xa6\xa8\xec\xe6\xca\xd5\x6e\x16\xff\xfb\xcb\x9b\x4a\x96\xe1\x60\xbc\x1d\xaf\x27\xff\x1f\xff\xf6\x1f\x5a\xb1\x08\x57\x76\x9c\x1e\xf1\x28\x5a\xc5\x94\x06\x74\x8e\x4c\x5d\x1d\x3a\x47\xff\xd3\x38\x12\x33\xcc\x0d\xca\xff\x60\xc6\x6d\xe2\x27\x91\x49\x0c\x87\x19\xed\x80\x1c\xdd\x56\x7e\x75\xdf\xd9\x8d\x21\xf3\xca\x8c\x66\x58\x65\xf0\xe5\x66\x71\xa5\x75\x44\xfa\xdf\x8d\x41\xb6\xd0\x63\xe9\x10\x3e\x23\x6f\x88\x41\xca\x59\xda\x13\x25\xd4\xab\x83\x45\xf7\x6b\x1e\x69\x61\x96\x08\xd1\x2d\xa4\x7b\x68\xe5\xf5\xb1\x9e\x4a\xf3\xfd\xfa\x2b\xda\xcc\x65\x72\xdb\x2a\x10\xbc\x39\x73\x3b\xbc\x3c\x8f\x39\x4f\x7b\x8e\x08\x37\xfb\xfc\x11\x42\x47\xf4\x32\x67\xf5\x50\xa1\x91\x31\x3a\x0a\xb0\x35\x54\xba\xaa\xea\x8b\x16\x33\xa7\x11\x41\xde\xee\xbd\xfc\x58\xb6\x2f\x4f\x32\x1f\x80\x36\x9c\x26\x22\x4d\x03\x42\xdf\x5e\xae\x5e\xe1\x9c\xf2\x18\xbf\xd3\x97\xaa\x32\x37\xf2\x34\x5e\xcd\x79\xa2\x1d\x54\x17\x43\x87\x33\xf1\xd7\xe9\x73\xa4\x46\x91\xa0\x23\xb1\x7d\xa9\xab\xf7\xa6\xb3\x14\x9c\xeb\xb3\x2a\x75\x55\xd7\xa0\xdb\xc0\xfe\x11\x2e\xcf\xa2\x14\x09\x76\x3d\x91\x41\x13\x42\x53\xe1\xb0\x27\xac\xf2\xde\xc0\xa8\xdc\x8a\x73\x4e\xb8\xd7\x04\x82\x73\x02\x6c\xce\x39\xd7\x58\xce\xe2\x50\x6a\x0e\xf9\xd7\x4d\xf9\x30\xb0\xb8\x48\x12\x34\x0c\xf2\x06\xf1\x08\x0e\xd8\x8e\x24\x81\x63\x1e\xfa\xae\x5d\x86\x91\x42\xc7\xfc\x2d\x5f\x41\xc9\xcf\x16\x17\x2e\xb8\xa5\xbe\x20\xdb\x73\xb2\xfc\x92\xe5\x92\x73\x91\x49\x54\x74\x38\x96\x0d\x4a\x2d\x57\x75\x03\x97\xa8\xe3\x42\x73\x9d\xc5\xbd\xee\x4c\xd8\x71\x78\x16\x69\xfc\xf5\x5d\xe6\x48\x6f\x33\xfa\x7c\x19\xcb\x9c\x72\xca\x0b\xe8\xd7\x10\x4b\xc4\x70\xee\xed\xef\xb3\x0e\xcb\xb4\x24\x03\x71\x89\x27\x91\xdb\x56\x0e\x94\x18\xb6\x2b\x2e\x69\x86\x51\x42\xe4\xfe\x45\xa7\x6b\x8a\x91\xfc\x54\x13\x98\x73\x29\x22\x14\xa9\x2d\x64\xd3\xde\x1e\x47\x31\x57\x2e\x05\x93\x51\xaf\x8c\x3b\x79\xf7\x60\xcd\x72\xa9\x29\xf1\x2a\x9c\x08\x35\xd9\xcc\xe4\x9d\x38\x57\x9e\xf7\xef\x15\x4e\x5e\xc8\xe0\xab\x6c\x1e\xe6\x22\x7c\x9c\x2b\x13\x23\xdc\x39\x94\x57\x5e\x16\xc4\x1b\x2f\xb5\x5c\x59\x67\xda\x2d\xd6\x0f\xb7\xab\x2f\xbb\xc7\xa7\xd5\x62\x19\x1e\x5e\x07\x5d\x9d\x6e\x3b\x5a\xac\xb7\x2f\x79\x6d\x7e\x02\xbc\x2e\x4b\x33\x5a\x93\xb8\x89\xa2\xc0\xec\xd1\xb9\xe7\x13\xa2\x0e\xce\x0d\xb5\xe8\xe4\x7f\xab\xe4\xa6\x95\xa5\x91\xf5\xe5\x5d\xe7\x3c\xd6\xc1\x8d\x4c\xec\x58\xf5\x66\x5b\xa1\x98\xe2\xf4\x9d\x81\x58\xe7\x56\x3b\x7f\x1f\xe3\x0c\xb7\x55\xbd\xa8\xab\xe3\x21\x1f\x3e\x04\x88\x4c\xb8\x39\xb1\xfc\xc8\x9b\xb6\xf9\x6f\xa0\xba\x1c\x74\x82\xd1\x23\xf8\x00\x7d\x6c\xfb\xc8\xf5\x28\x5f\x37\x7b\x28\xab\xd3\xc8\x86\xc1\xf9\x4f\xa8\xab\x41\x68\x6d\xd4\xc8\x66\x48\x28\x0a\x6f\x50\x22\x40\xf5\x49\x96\xcf\xd0\xab\x6e\x71\x11\x45\x16\x39\xfa\xc2\x42\xfa\xe4\x0d\xfd\x11\xc2\xe0\xe2\xf3\x8a\x38\x55\xf8\xbc\xc8\x2c\xe5\xb3\x14\xdd\x68\xcf\xcb\xe7\x38\x98\x34\x22\x66\x36\x19\xcb\x18\x16\x48\xec\xd1\x1f\x55\xe0\xf8\xa3\x4a\x73\x23\x5b\x68\x87\xef\x2d\x62\x13\xe1\x67\xf9\x43\x56\x7f\x69\x3f\x88\xd8\x52\x6c\x7c\x5b\x55\xed\x46\x57\xc7\x76\x46\x8b\xd3\xb5\x50\x76\xc8\x7c\x2d\x9f\x16\x84\xd0\x5f\xb2\x9a\x70\x41\x68\xaa\x3d\x18\x0e\x53\xa7\xcf\x9e\xd8\x0f\x3f\xfe\x05\xe8\x92\x20\x9c\xe9\xb1\x92\x6e\x77\x97\x68\xde\x46\xeb\x34\xe9\xcb\x4a\x9d\x1a\x05\xbc\xc1\x99\xf7\x1c\x9a\x1b\xa7\x03\xe4\x22\x77\x33\x0e\x03\xdf\x86\x72\xc7\x4f\x1c\x6e\xfb\x50\x95\xdb\x99\x8a\x0c\x17\x54\x4a\x7c\x99\x55\x2b\x8b\xc9\x0e\x25\xa8\x4a\xa9\xcf\xfc\x6e\x8e\x07\x57\xea\x37\xdd\x22\x45\xc2\x22\x87\xa2\x3f\x2d\xdb\x20\x03\xb9\xb6\x0f\xd5\xe0\xa5\x89\xc4\x24\x24\x50\xd7\xed\x0f\x05\x2e\xc2\x93\x02\x2d\xdf\x2e\x8d\x98\xc6\xa0\x52\x75\x92\x45\x7b\x6a\xd6\xef\xa3\xe8\x68\x68\xa3\x5d\xa9\xf5\x7b\x55\x17\x66\x71\x3c\x38\xb1\x7a\x17\x88\x0d\x4d\x20\xc5\x77\xde\xef\xf2\x66\x91\xd7\x18\xd8\x1b\x92\x7e\x82\x93\xc4\xb0\xc1\x80\x09\x9b\xc8\xc4\x3f\xee\x9b\x72\x1c\xa0\x5f\x8e\xfb\x49\xb7\x08\x99\xe1\xef\xbb\xbc\xb9\xab\xca\xe7\xbc\x3d\x1a\xf8\x6d\xd2\xa5\x19\x51\xbe\xe2\x1b\x0b\xf4\x40\x6a\x78\x82\x42\x22\xac\x68\x76\x93\x2c\xe1\x68\xf6\x6b\x28\xda\x5c\xef\x74\x5d\xf5\x68\x09\x91\x65\x2c\x90\xee\x7e\x6f\xf3\x22\xff\x13\xbb\xed\xaa\x34\x57\x65\x79\x94\xc5\x75\x55\xd7\xd5\xfb\x93\xfc\x44\xdb\x8e\x8b\x4c\x25\x48\x97\xdc\xfd\x7a\x2f\x3f\x66\xdf\x5d\xc5\x8e\xd9\x1e\xf6\x79\x7b\x71\xf4\xe8\x38\x35\x99\x2f\xbd\xad\xf6\xd5\x90\x2c\x16\x9a\x44\x88\x33\x7d\xab\xda\x8b\x7a\x91\x5c\x68\x15\x2b\x9f\x19\xfb\xfd\xb9\xcf\xe9\xcf\xde\xdd\xb0\x38\x52\xbd\xcb\x93\x1f\xf2\x81\x21\x81\x0b\xa3\x58\x12\xcc\x23\x2c\x53\x9f\x76\x31\xc4\x4a\xf5\x14\x63\x55\xbb\x0b\xa7\x81\x49\xa3\xa0\xd7\x3e\x28\x90\x6c\x9c\xa9\x92\x6b\xb8\x20\x41\xc2\x05\x58\x97\x68\xc3\xc7\xd3\xf5\xf1\x33\x98\x71\x16\xc5\x04\x5d\x2c\x0c\x3f\x39\xd3\xc7\xf3\xf4\xff\xd6\xb7\x70\x54\xf4\x5f\xa0\xbd\x91\x87\x43\x5e\xda\x6a\xcc\xc0\xc0\xb3\xc8\x38\xf9\x3b\x28\xcd\xda\x76\x76\xdc\xed\xb1\x28\x06\x32\xaa\x70\x9d\x58\xa4\x58\xfa\x80\x4f\xfe\xe5\x08\x4d\xb3\x7b\xef\xc9\x1c\x26\x4b\x5c\x16\x1b\x60\xb4\x47\xb8\xfc\x36\xf3\x37\xb2\x18\x0c\x56\x2a\x5f\xcb\xea\xfa\x6f\xac\x98\x19\x51\x4e\xac\xad\xeb\x59\x6c\x3d\xf2\xe4\xa6\xbd\x41\x2d\xc7\x34\xf3\x01\x3b\x42\x62\x04\x17\xd7\x2d\x47\xa5\x9e\x43\xbd\x2a\xc3\x6e\x3c\x3d\x33\x21\x11\x9a\xf0\x1b\x68\x8f\x07\x4f\xf8\xf4\x49\x97\xa7\x24\x06\xff\x41\x1f\xab\x57\xd8\x57\x3d\x2d\xdc\xac\x5d\xea\x40\x14\x1b\x59\xb6\x43\x37\xa6\x99\xc6\xc5\x3d\x3f\xd8\x30\xb2\x32\x46\x2d\x82\xf4\xdc\xec\x74\xc2\xde\xd3\x91\x99\x09\x22\x91\x29\xc2\x75\xa9\xdf\xab\xc3\xb1\x44\xe3\xe0\x5f\xc8\xc3\x01\x69\x81\x3a\xff\xe6\x4c\xc9\x38\x34\xe6\xa9\xe3\x58\x84\x73\x99\xd6\xd0\x44\xe8\xcc\x59\x39\xaf\x80\x55\xb3\x7f\xab\xce\x5f\x84\xb3\x33\xa7\xb6\x2f\xc7\x1e\x75\xe3\x12\x1e\xe1\x89\xb3\x24\x0e\xeb\x08\x42\x34\x1d\x5e\x73\x21\x8b\xa2\x33\xb8\xbf\xf4\x05\x01\x59\xc6\x12\xed\x2e\x66\x6e\xe0\x50\xc3\xf4\xab\x7f\xea\xe1\x1e\x2f\x81\x8b\x32\x95\x2a\xdc\xf3\x6e\x3c\x1d\xcf\x06\xca\xf6\xfa\xd8\x3e\x54\xed\x3d\xb2\x8f\x7d\x12\xa9\xcb\x94\x49\xb2\x6c\x24\x23\x3e\xa9\x06\xe3\x99\x8e\x2d\xef\x71\x92\x4f\x8e\x9c\xdb\x53\x34\x6d\xde\xe5\xa1\xf9\x6d\x96\x35\xec\xe7\x81\x56\x0c\x23\x80\xea\x78\xda\x68\xb9\xef\x5f\xda\xa4\x1a\xe7\xc7\x62\x7d\xff\x78\xf5\xf0\xc7\x6e\xbb\xfe\xb6\x7c\x40\x6e\xba\xc5\xb2\xcf\xb2\x64\xa8\x8c\x19\x90\x6f\xf5\x98\x16\x97\x67\x46\x00\xf3\x45\x5a\x9f\x95\x37\xfa\x96\x10\x03\x56\x62\x34\xc7\xfd\xb2\x18\x15\xbb\xf7\x52\xab\x3c\x03\xca\xd1\x9e\x6c\x9d\x84\x6e\xb5\x0f\x80\xd6\x0c\x52\x57\xea\xf6\x15\x8a\x7c\xba\x25\x65\xd0\x6d\x24\x2e\xa6\x6a\x5b\xa8\x07\x00\x71\x66\x53\x57\x44\x78\x23\xff\xfc\x33\x1f\x71\xaf\x70\x19\x89\x04\x9c\x7c\x18\x86\x5f\xef\xf2\xa6\x3d\xc7\x77\xc9\x48\xb0\x24\x0e\x96\xe4\x42\x96\xc1\x8d\x1c\xd3\x84\x4d\x3f\xa0\x8c\x23\x89\xc4\x15\x81\x25\x80\xfc\x36\x3b\x1e\xbb\x30\xe0\x66\x7b\xf5\x65\x49\x77\xdb\xd5\xfd\x72\x37\x04\x9e\x65\x9c\xc8\xa8\xef\x80\xc0\x67\xbe\x94\x75\x71\x0a\x76\x68\xd3\x37\x4d\xb3\x34\xa8\x97\xc0\xa5\xf2\xda\xd1\x4d\xb9\xe3\x90\xcb\x75\x45\xd0\x93\xef\xaf\xe1\x79\xd7\xa5\x31\xb7\x75\x7e\x56\xed\x24\x09\xb5\x41\xbb\x03\xbd\xd7\xbc\xbd\x84\xf9\x97\x09\x51\xbe\x26\x67\x89\x82\x19\xf3\xc3\x32\xc2\x6d\xde\x40\x0b\xba\xfd\x1f\x59\x1e\xa5\x87\x4a\xfb\x89\x2c\x53\xc1\x10\x45\xe6\x56\xa5\xaf\xd5\xb1\x01\x30\x13\xed\x47\x2e\x53\x69\xd1\x54\x73\x26\x75\x50\xae\x7e\xc9\x0f\x13\x0a\x52\x2e\x53\x4b\x1c\x9a\xae\x90\xcd\xcb\xaa\xc4\xcc\x60\x67\xed\x94\x3d\xcb\xc8\xac\x77\x52\x6b\x50\x0c\xf9\xe6\xcb\xa3\x13\xcc\x2a\x66\x4c\xad\x5c\x32\x06\xca\x25\x7e\xa5\xf1\xf8\xfa\x70\x88\xc7\x82\x89\x1e\x38\x73\x44\xe5\xe7\xb9\x09\x2c\xbb\x1d\x5d\xf4\x55\x63\xb3\x83\x22\x65\x91\xa3\xf1\x76\x25\x10\x9b\x56\xea\x09\x74\x44\x4a\x66\x9c\xe4\xfe\x4b\xde\x22\x09\xfa\x58\x77\x82\x4b\x29\x48\xc8\xe1\x8f\xbc\xa2\x73\xd4\x99\x94\x10\x79\xfe\x42\x74\xa5\x7a\x79\xfd\x8b\x6b\x98\x54\x84\xf3\x28\x44\x46\xbf\xe4\x6f\xa3\xdc\xc6\x64\x62\x4b\xcd\x33\x87\xa9\x41\x25\x80\xaf\x90\xcf\xec\x3c\x69\x88\xc0\x72\xbf\x2f\x1b\xdc\x1c\x2f\xef\x05\xd2\x24\x19\x06\xb0\xd4\xf1\xf4\x50\xbd\x4f\x31\x6f\x12\x28\x45\x68\xd8\x6d\xd5\xad\xcc\x4d\x8b\xf1\xf3\xf1\x32\x20\x81\x33\xa4\x66\xb9\x59\x3d\x7c\x09\xbf\x59\xc2\x02\x32\xca\x25\xb6\x9a\x5e\xa4\xc6\xb5\x50\x11\x8d\xbc\xb6\x77\xe3\x16\xb7\xe1\x88\xa4\x38\x26\x9b\x97\xfc\xf9\x39\x37\x13\xef\x40\x45\x5a\x62\x28\xb0\x90\x4d\x9b\x46\x87\xe2\xd8\xa8\xa2\x7a\x7d\x91\x7d\xd0\x55\x45\xc0\x32\x9f\xf2\xdf\x95\xf0\xbe\xc3\x1c\xe4\xb4\x5f\x54\x1c\xc7\x08\x09\x3a\xbc\x07\x16\xd2\x49\x70\x42\xc5\x24\x71\x85\x7d\xb8\xfe\x5c\x44\xdd\xab\x98\x58\x57\xf4\xfe\xb4\x5a\x2c\x77\xb8\xac\xec\xb6\x3f\xd7\x63\x12\x66\xae\xe2\x54\x0a\x31\x16\xcb\x44\x28\xf0\x9d\x6c\xda\x8d\x77\xdd\xfb\x96\x2a\x43\xf2\x17\xdb\x07\xd9\x2f\x97\xc8\xa8\xd8\x2b\xbf\x6a\x69\x24\xd6\xb7\xff\xf6\x4b\xfc\xca\x24\x30\xab\x88\x94\xc0\x06\x70\x5d\xc0\xd6\x8d\x4d\x31\x45\x2c\x65\x81\xee\xaf\xc4\xd8\x0c\xd4\x13\x52\x5c\xae\x28\xb1\xa9\xaf\x31\x7d\x9c\x4b\x93\x73\x45\xa9\xc5\x12\x51\x97\xa9\xf0\xb6\xd8\xb6\xda\xca\x57\xb8\x6a\x36\x30\x93\x7b\xc5\xf6\xb8\x8f\x3c\x3e\x2d\x31\xff\xe2\x22\xc6\xe1\x6a\x49\x14\x63\x91\x9d\x74\xd0\x81\xeb\x13\xa2\x97\xe6\xb1\x5f\x95\xf0\x34\xf2\xe5\xb7\x3e\x18\x35\x3b\x2e\x39\x86\x07\x91\x84\x76\x5d\x9e\x57\x0f\x85\x76\x9e\x25\xd7\xa1\xc5\xbe\xe5\x6d\x1b\x28\x68\x67\xa8\x1b\x95\xd2\x08\x61\xe5\x68\x96\xa3\xde\x65\x79\x7a\xef\xd1\x9c\x2a\x4d\x23\xdc\x75\x55\x67\xcc\xe9\x6e\xd6\x68\xc7\x5a\x35\x7c\x4a\x1e\xc5\x38\x73\x36\xb2\x96\x23\xf2\xb8\xee\x00\xc1\x5c\x8f\xaf\xb0\xee\x29\x04\x7c\xc4\x78\x26\x1e\xca\x15\xcf\x62\xf4\x99\xed\xac\x54\x5b\xf1\x8c\xc5\xbe\x57\x1e\x65\x5e\x4f\x02\xe2\xd3\xf7\x16\x89\xc5\xe5\x74\x5f\xbd\x21\xed\xcb\xac\x2c\x7e\x5b\xfd\xec\xbc\xdf\xf0\x80\x42\x1b\x0c\x70\xdc\x9f\x27\xe8\x1c\x01\xec\xfc\xf3\x08\x03\x51\x14\x56\xeb\x8f\x45\x55\x14\xa0\x5b\x24\x9f\x99\xb6\xcb\x62\x85\x09\xe0\x9e\xd6\x72\xb0\x2a\x54\xc6\x0c\x22\x71\x30\x66\x53\xf7\xbf\x72\xa3\x3c\x80\x72\xcc\x9b\x3f\x26\xc8\xf3\x2d\x25\x8d\x54\xa0\x1d\xb8\xf2\xa2\x12\xe1\x50\x42\xac\x67\x69\x74\xec\x02\x9e\xff\x61\x36\x38\x64\x96\x62\xf1\x1c\x86\x98\x48\x7f\xb2\x8c\xd0\x5a\x71\xb5\xd3\x77\x83\xd2\x35\x57\x2a\x8b\x31\x27\x2e\xdd\xe5\xbc\x9d\xdc\xf3\xdc\x4f\xaf\xae\x32\xb7\x9c\xeb\xd0\x9b\xfd\x8c\x52\x1a\x88\x27\xff\x5a\xd7\x0b\xa9\x5f\xe0\x06\x9a\xfc\xb9\xec\xd6\x85\x27\x38\x54\xf5\x54\x21\xd4\x9f\xa5\x09\x75\x08\x6f\x78\x1f\x69\x3f\xff\xc2\xbc\x1f\x4e\x35\xcc\x49\xd9\x4a\x63\x02\xc2\xd9\xf7\xc8\x59\x2e\x31\x9c\x21\x32\x34\x75\x30\x5d\xe0\x83\x6b\xa3\xe5\xcd\x48\x89\xb4\x04\x3f\xef\xee\x27\x95\x0c\xca\x68\x1a\x64\x01\x7f\x54\xc5\x71\x0f\x37\x3e\x20\xfc\xdb\x05\xc7\x43\x41\x1a\x61\x7f\xee\xda\xea\x15\x26\xfe\x86\x02\x1e\xb9\x72\xf8\xea\x88\xf5\x6c\x7f\xa7\x74\x7f\xf6\x0e\x20\x34\xfa\x4d\x07\xa8\x6d\x55\xef\x6f\xbb\xfd\xb7\xbf\xbc\x4c\x99\x0c\x06\xe2\xf2\x43\x43\xd3\x8c\x6e\x6e\xb5\xc0\x8a\xb9\x6b\xa9\x4e\x37\xb5\x7c\xee\xf3\x8f\x3a\x8a\x35\xf5\x30\xae\x6e\x01\x7c\x9c\xf1\x03\x72\x1d\xd1\x08\x15\x92\xcb\xe3\x7e\x6d\x17\x79\x9b\xff\x09\x65\xf3\xf3\xa5\x0a\xe2\xb6\xdd\x30\x6d\xfa\xab\xb1\x04\x49\x20\xae\xea\x99\x31\xae\x23\x96\x05\xf2\xa6\xc0\xbe\xdf\x1f\x32\x09\x9a\xbe\x3d\x61\xe6\xdf\x8d\x45\xeb\xc8\x72\xe2\x63\x25\xdb\xbc\x3d\x16\x32\xaf\x61\xe7\xcb\x14\xd2\x70\x79\x42\x53\x44\x4c\xbf\xb8\x1a\x0b\x2c\xcb\xc7\x4d\x7f\x36\xbe\xb1\xa1\x87\xdc\x6c\xf2\xe7\xb9\xcb\xf4\x8f\x73\xda\x0f\xae\x09\x93\x88\xa4\xed\x0b\xff\x5c\xfe\xac\xb2\x63\xfa\x57\xae\x89\x14\x38\xf8\xee\xaf\x1e\xae\xbe\x2c\xef\x97\x0f\xdb\xdd\xed\x72\xb9\x7b\xba\xda\x86\xb0\xbe\xa6\x29\x43\x3a\xe1\x65\xfb\xd2\xfc\xa7\xfe\x32\x04\x4f\x34\xcd\x34\xba\x8c\xf8\x65\x37\x50\x14\x79\xf9\xbc\x1a\x08\x15\x74\x22\x08\xc2\x33\x6e\xc0\xd6\xd5\xa8\x94\x66\x80\x64\xeb\x44\x80\xaf\xa2\x87\x06\x46\xe5\x0f\x3a\x01\x47\x0a\xf1\x55\xd6\xdd\xcf\x79\xb7\x54\xf6\xcb\xbc\x4e\x6c\x86\x39\xcf\x0d\x4e\xe5\x63\x0d\x2e\x75\x71\x5e\xa3\x33\x8c\x96\x54\xb9\x88\xfe\x5d\xf5\x3c\x5e\x74\xa7\xd8\xc0\xd9\x39\x2c\x06\x8e\xc5\x42\x18\xb4\xc5\x9d\xea\xed\x79\x0a\x3e\xf8\xd5\x5f\x96\x4c\xa7\x89\xe6\x71\x9a\xf9\x35\xba\xdb\x98\xbe\xfd\xb1\x40\x9e\xb0\x31\x97\xd6\x45\x10\xad\xe6\x09\xe1\x0e\x92\x7e\x28\xaa\xd3\xe2\x25\x2f\x4c\x3d\xaf\xc3\xd2\x22\x8e\x71\xb4\xf6\x7b\x5e\x51\xb8\xfa\xa9\xe9\x4b\x89\x58\xb9\x54\xa8\xdc\x43\x10\xbd\xe9\x7e\xb5\x28\xc0\x76\xbf\x59\x2c\xfe\xcb\xc4\x8b\x16\x22\xa1\x7e\xb0\x2f\x9f\x9f\x9b\x4d\xb7\x61\x77\x96\x9a\x13\xbc\x9d\x3d\x24\x64\x68\x6d\x60\x2c\x72\x0f\xa5\xd9\x9f\x85\x9b\xb4\xb0\x19\xd6\x80\xb9\x6e\x3f\xd3\x3c\x3d\x9e\x69\xdd\x85\xc8\xa0\xce\x12\xc0\xa0\x41\x0b\x72\x3f\xc4\xb4\x75\xc6\x9d\x78\x08\xd4\x9a\x93\x78\xe6\x2a\xe9\x4c\x3a\xbd\xc8\x67\x68\xef\x4f\xf7\x55\x09\xc1\x12\xd1\x32\x8a\xd5\x48\xc2\xe2\xb2\xaf\xaa\x25\x95\xc8\xcb\xb0\x80\x02\x54\x9d\xb7\xa7\x7b\xa4\xd4\x9a\xbd\xb8\xe4\xae\x34\xd8\x57\x7e\x57\xfa\x75\xd0\x62\x9b\x5d\x2f\xcb\x92\xac\x9f\x56\x43\x34\xd6\x1f\x56\x69\x8a\x69\x9e\xab\xc9\x2a\xa6\xa4\x46\x37\xdc\x55\x3c\x77\xc6\x20\x1a\xd6\xf1\xae\xb3\x0d\x37\x57\x77\xcb\xb8\x6f\xe9\x6b\x3e\x9d\xee\x31\x3a\x10\xd3\xb2\x3f\xad\x13\xea\xe8\xdb\x36\xe0\x42\xb1\xb3\x07\xd4\x82\x32\x87\xf3\xbc\x93\xdd\xae\x75\x2f\xff\x5d\xd5\xdb\x1a\x60\xbe\x32\x85\xf6\x9a\x68\x7a\x86\x9b\x0d\x77\x33\x4c\x3b\x09\x8d\x63\x5d\x76\xe3\x75\x66\x40\xcc\x3a\xdb\x70\x82\x65\x56\x25\xbc\x7f\xa9\xab\xe3\xe1\x8c\xc5\x74\x16\x4f\xd5\x40\x29\x46\xad\x6f\x40\x87\xd0\x8c\x06\x29\x90\xc9\x6f\x5f\x95\xed\xcb\xa6\x9d\x59\xbc\x1a\x80\x22\x34\x18\x25\xa3\x67\x7d\x63\x63\x83\x6a\x23\x5f\x6f\xb6\xbb\xc9\x07\xb0\x2c\xc6\x08\xb0\x6c\x1a\xa8\xbd\x9e\xcf\xf5\xe9\xba\x1a\x2a\x40\xfe\x0e\x5c\x5e\x5b\xae\x30\x1a\x13\xea\x89\x36\xd2\x7e\x12\x6a\xd5\xd6\xba\x15\xad\x39\xaa\x7d\xde\x5e\x95\xcd\x3b\x72\xb4\x04\xa0\xe9\x5f\x70\xac\xb9\x8b\x98\x48\x3a\xfe\xde\x1d\xfa\xcc\x6e\xc6\x19\x47\xc8\x71\x5b\xd5\xf7\xd0\x3d\xc5\xdc\x9a\x33\x31\x71\x5c\xc7\xad\x6c\x5e\x91\x0b\x61\x1a\xf4\x33\x71\x1a\xe1\x04\xb6\xc7\x12\x37\xd4\x51\x95\x8b\x89\x95\xa3\xfe\xeb\x36\xa4\x9f\x79\xf9\xdc\x60\xae\x33\x9e\x45\x9d\x4c\xac\x8c\xf2\xf8\xaa\xef\x65\x53\x15\x66\x5c\x5b\x6b\x08\x8d\xd3\x9e\xb8\x72\x57\xe4\xe5\x6b\x2f\x58\xc2\x0d\xc9\x28\xa6\xfa\x1d\x57\xde\xb1\x29\xce\x94\xe9\xc7\x0a\x68\xbf\xb6\xe7\x0c\x8d\x33\x64\x0b\x58\xfc\x5c\xd4\x58\x6c\xeb\xaa\xe6\xc3\x51\x9d\x20\xb6\xf6\xf0\x76\x70\x41\x16\x03\xb5\x57\x2a\x9b\xbd\x4f\x12\xa5\x4e\x78\x48\xd6\xe6\x5d\xd6\xd3\xaa\x54\x93\x50\x85\x86\xf0\x7d\x05\x46\x8e\x87\x95\x49\xb2\x14\xc9\xae\x07\x31\x7a\x99\x85\x63\xa9\xf0\x9c\xfa\x58\x64\xb0\xf1\x64\x8d\x97\xcd\x4c\xc3\x93\x84\x0c\x0a\xb4\xdb\x97\x1a\x1a\x54\xfa\x9b\x3e\x26\x57\x80\xd2\x71\xbd\xd9\xe0\x20\x4b\xe3\x7a\x8f\xff\x8b\xfd\xd4\x32\x42\x44\x28\xdc\x00\xa5\x71\x54\x2b\xbd\x69\x60\x84\x36\x81\xfa\xf0\xac\x38\xd1\x64\x91\x45\xc7\x63\x51\x80\xac\x17\x98\x35\xed\x37\xf2\x70\x81\x8c\xc9\x98\xf8\x84\xca\xa4\x43\x32\x0b\x8e\xc5\xc5\xbf\x6e\x67\x35\x5d\x42\xb9\xcd\xbe\xa3\x04\xe1\xd8\xe4\x11\xd2\xb2\x7b\xbf\xa4\x0d\xc0\x8d\x52\x22\x54\x8f\x94\xa4\xb3\x55\x1d\x23\xcd\x64\x8a\x1a\x65\x14\x78\x6c\xcb\x8f\x5c\x43\x67\xba\xe4\x06\xca\x16\x6e\xe0\x1e\x1a\x79\xc6\xb1\x33\x3d\x5b\x33\x82\xd4\x4e\x7d\x15\xc3\xaa\x6c\xa1\x86\x4f\x78\x27\xb9\xd1\x52\xa2\x79\x7a\x7d\x9c\x74\x83\xd6\x4e\x8a\x71\xd9\xbe\x6c\xc6\xfa\xd9\x73\x34\x92\x31\x44\xe2\xd3\xfe\xf0\xf5\x06\x8b\xbc\xed\xe1\x81\x2b\x2f\xc3\xf7\xc9\xad\x8d\x60\xc8\x8f\xe9\x2a\xe8\xe7\x99\x78\x63\x20\xc6\xd2\x31\xdc\x22\x8e\x87\xc9\xe3\x41\xca\xd1\x34\xd4\x2f\xdd\x38\x2f\x9f\x11\x04\x71\x7b\xec\xbe\x30\xd6\x01\x9b\xd3\xd9\xf7\x3a\xab\x9f\x1a\xd7\x54\x85\xcb\x66\x9a\x41\x70\xe7\xa4\x2e\x00\x67\xa3\xd7\x5c\x1a\xdb\x24\xc6\x72\xc0\x4c\x92\xe7\xd6\xf9\x59\x9d\x17\xa8\x18\x2b\x23\xac\xd4\x28\x46\xa0\x34\x88\xb8\xc1\x08\x8d\xe9\xdc\x31\xdc\x78\xbd\xbc\x50\xdf\x40\x31\xec\xd0\x80\xa3\x9e\x80\xe0\x27\xdf\x1a\x22\x23\x7a\x59\xbd\xfa\x6d\x66\xd5\x43\x04\x9c\xb3\x09\xef\xd9\xda\xae\xca\xa6\x1d\xad\xa4\x10\xc7\x80\x81\xe8\x2b\x63\x9c\x90\xdb\x18\xf9\x05\x24\xd5\xd4\xa1\x54\xce\xaa\x2c\x80\x58\x17\x26\x3c\xd4\x20\xfb\x8c\x60\x33\x53\x20\xe2\x40\x23\x81\xeb\xcb\x56\x96\xaf\x73\x89\xa4\xd0\x24\x36\x98\x6e\xc5\x52\x20\x44\xa7\x9f\x2b\x5c\x73\xa0\x52\x62\x8c\xe0\x07\x56\x54\xcc\xc4\xad\x3e\x5d\x6d\xfd\xc9\x09\xc4\xd6\xdf\x62\x23\xf3\x90\xee\xf5\xb6\xdd\xc8\x5f\x80\x54\xbb\xd8\x90\x7f\x25\xf8\x44\x0b\x62\xfa\x02\x2c\xd1\x51\xd4\xeb\xfc\x57\x63\xe2\x4f\xde\x39\xbf\x42\x4e\x90\x6a\x48\xfd\x3f\xeb\x03\x9e\x3a\x4a\x62\xc4\x94\xf5\xc4\x26\xd3\x97\x10\xbe\x54\xf0\xf6\xa8\x5f\xff\xa6\xe9\x0c\x22\xb1\x68\x6a\xa1\xfc\x46\xbf\xbf\x81\x48\x53\x2a\x07\xa9\x5a\x3f\x77\xab\xf9\x97\xc9\xc0\x4d\x07\xbf\xe5\x5c\x17\x52\xbf\x8e\x29\x6c\x7d\x33\x49\x33\xed\x90\xff\x16\xea\x5a\x16\x37\x55\xd9\x0f\x30\x99\x71\x74\x71\x7e\xc4\x67\xf1\xe9\xee\x18\xf8\x80\xf0\xf5\xf6\xeb\x00\x62\xbe\x54\xc5\x05\xd2\xc4\x8e\xb7\x31\x7f\x7e\x69\x79\x32\xeb\x1b\x09\x8e\x89\xa2\xeb\xe5\x12\xf9\xfb\x96\x5e\x69\x6e\x78\x12\x70\xf4\x66\x77\x5f\x26\x04\x46\xa0\x6c\xea\x64\x99\x90\x57\x09\x97\xef\x85\x6c\xda\x7e\x1d\x02\x1d\x5b\x39\xe1\xe4\x71\xd5\x19\x55\x61\xaa\x63\xff\x99\xb5\x4a\x71\xd6\xde\xaf\x1e\x56\xbb\x2f\x57\xf7\xcb\xdd\xf5\x72\xfb\x73\xb9\x7c\xc0\x84\xd6\xd0\xca\x49\xff\x94\xc7\xfd\xb5\xac\xeb\x1c\xea\xe6\x11\xea\xeb\x6a\x60\x97\x00\xad\x63\x07\xa7\x44\x7a\xcf\x4f\xe4\x7e\x39\x18\x6a\x83\x66\x18\x92\xdf\xe7\x3a\x3f\xc8\xb2\xdd\xb5\xd5\xa1\xd8\xc9\x4b\xf8\x55\x30\x3c\x49\x69\x5f\xab\xf7\xd3\xeb\xd1\xcd\x3a\xd2\x18\xa3\xc8\x08\x23\x74\x65\xf6\x79\x89\x74\xad\x6d\x55\x3b\xe7\x65\x76\x82\x15\xc2\x49\x50\x1d\x0a\x28\xf3\xe6\x65\x08\xbe\x80\x8d\x1d\x76\x40\x41\xd3\xee\xa4\xf9\xf7\xb1\xf1\xa6\xe3\x30\xe1\x6c\x22\x91\xa1\xce\x59\x86\x8b\x1a\x4c\xb5\xd2\x9f\xbd\xb4\x55\x16\xad\x07\xc4\x88\xe5\x23\x30\xb9\x8d\x04\x80\x71\x19\xfa\xbc\x69\x37\x47\x75\xc6\xa0\xcf\x6d\x64\x04\xd6\x3f\xcb\xb6\x95\xfa\xf5\x7b\xf9\x19\xac\xc3\x46\xc6\xa2\x07\x73\x0d\xad\x96\xcd\xcb\x5f\x4f\x33\x1b\xd9\x08\xb1\xec\xf6\xd8\xeb\xcd\x8e\xfe\xeb\x1b\xd1\x18\x90\xca\xcd\x56\xf5\xa5\xcc\xe4\x88\x8c\x98\x5b\xaa\x5d\xa6\xe9\x1e\x9a\x7e\x8c\xd9\x84\x00\x04\x64\xe3\xf5\x5d\xae\x02\xe9\xb3\x3f\x9c\xb2\x40\x7d\x32\x4b\x04\x4e\x5d\x0c\x9b\x66\xd6\x20\x60\xfa\x19\xbc\xbe\x78\x83\x96\x1f\x72\x3c\x0d\xca\x7c\xdc\x32\x2b\xfa\x18\xb5\x63\x21\xac\xaf\xa5\x79\x9e\x05\xe6\x2d\x4f\x1c\x52\xab\xcd\xd1\xe7\xbc\xae\xf6\xa1\x34\xc2\xf2\x54\x20\xf5\x19\xba\x9a\x0b\x79\xc8\x5b\x19\x70\x4b\x7d\x13\x4b\x11\xdf\xbd\x97\x75\xbf\x41\x5c\x66\x03\xf5\x27\x08\x19\xe1\x30\xc6\x46\x4f\x73\xe1\x5c\x6e\x33\xc3\xd0\x76\xbf\xc9\xdf\x06\xee\x11\x2b\xe3\x28\xf2\x3b\x00\xc6\xda\x2f\x7a\x47\x56\x26\x4e\x3d\x03\x61\x04\xd7\xb9\xb9\xa0\x97\xdc\xb9\xfa\x16\xe5\xd1\xc0\xe1\x4e\x03\xd6\xc8\xaa\x14\x6c\x1a\xd4\x20\xc7\xec\xbc\xdc\x2a\x9e\xa0\x66\x55\x00\x37\x3e\xc0\xfb\xa7\x6a\xd9\xdc\x2a\xe1\x20\xe9\x7b\x57\x0d\x8d\x54\xd1\xb2\xa9\xc6\x3a\xd8\xdc\xea\x58\x65\x6a\x64\x26\xcc\x82\x53\xc3\x14\xb3\x9a\x50\x74\xe8\x9d\xa5\xf2\x00\xef\x98\xa7\xf9\x55\x30\xcb\xea\x4c\xa0\x47\xdd\x04\xc1\xd8\x55\x89\xfa\x0e\x47\x59\x8c\x26\xaf\x35\x91\x23\xb5\xdf\x2e\xaf\xee\xbd\x7c\xdf\xc3\xf6\x29\x30\xa1\x59\xd3\x59\x20\x03\x57\xf2\x08\xa4\x6b\x81\x70\x2c\x4b\x46\xb4\xfb\x21\x60\x9b\x37\x53\xd8\x7b\x6f\xa7\x85\x93\x94\x56\x41\x52\xa6\xb3\x8a\xae\xf3\xf6\xb6\x90\x67\x25\xd3\xbe\xb5\x4d\x1c\xd0\xe9\xe7\xfa\x66\xb9\x58\x6e\xbe\xae\xae\x57\x7f\x63\x26\x5b\xa5\xa4\x0c\xd4\x5c\xb6\xaa\xbd\x7c\xf0\xa8\x8d\x88\x62\xaa\x13\x5f\xda\xfb\x50\xb5\xb3\xa8\x04\x89\x2e\xc0\xa8\x44\x14\x33\x97\xc7\x40\x23\x47\x57\xfb\x7d\xe7\xd4\xb8\x2a\xda\xbe\x43\x45\x14\x0b\x9d\x90\x00\x81\x43\x64\xc5\x84\x37\x39\xb4\x92\x52\x38\x70\x81\xdb\x29\x6f\xeb\x6a\x8f\x56\xe2\xe4\x8e\x24\x92\xb1\xe8\x09\xd8\x5d\x30\x68\x40\x42\x8b\x88\x12\x86\x70\xad\x1f\x50\xb6\xb2\x1c\x7b\x85\x22\xa2\x2c\xc1\x84\xc7\x5d\xf5\x1c\x50\xbe\xbf\x5d\xc0\x6b\x8b\x28\xe1\x12\xa7\xd5\x53\xa5\xaa\x76\x54\xc1\x25\xa2\x94\x08\x04\x7f\x37\xad\x0c\x28\x3e\x11\xa5\xa9\x40\xaf\xeb\xad\x6a\xa1\xb9\x01\x5d\xf4\x0a\x1e\x22\x4a\x05\xc7\x63\xdf\xcb\x5c\x57\x75\xe9\x08\x4f\x7d\x64\x7c\xd6\x01\x8c\x02\xe6\x2c\x10\x98\x54\xc0\xf3\x58\xd3\x65\x56\x99\x77\x69\x6c\x88\x88\x47\x3a\x41\x6a\x02\x5d\x8d\xa0\x3b\x22\xe2\x92\x61\x56\xf8\xfd\x30\xe2\x4f\x98\x9e\x2a\x52\x47\x3f\xbd\xcf\x43\xd6\xe8\xb6\xaa\x1d\x49\xf6\x68\xf1\xec\xda\x59\x8c\xa9\x63\x08\x61\x21\x4b\xe4\x27\x58\x8c\xd7\xfd\x79\x45\x10\xfd\xd7\xd9\xad\x2c\xf4\x93\xe4\xbe\x33\x67\x66\x68\x3e\x11\x09\xc6\x90\x94\x34\x6f\xd0\x86\xfb\xe7\x18\xc8\x28\xa2\x2c\xd2\xca\x86\x54\xbe\x07\x47\x85\xe7\xcb\x0c\x41\x40\x25\x96\x6d\x3c\xc0\x87\x43\xfb\xf8\x83\x32\xd5\x18\x71\xbd\x3f\x4d\x62\xd9\xe1\xa8\x89\xc1\xc7\x4e\x36\x87\xaa\x6c\x2a\xdc\x6b\x10\x3b\x51\x77\xed\x02\x4e\xe7\x97\x2e\xb3\x88\x24\x48\x1a\xfb\x48\x8d\x0f\x0c\xe1\x3e\xb4\x2e\x9f\xe0\x0d\x64\xd1\x4c\xa5\xc2\xcf\xa2\xfb\x22\x52\xb1\x2b\x15\xf6\xe4\x19\xa5\x59\x96\xa6\x7a\x5f\xc4\x9f\x7c\x3a\x45\xa2\x94\x4d\xe8\xc6\x46\x64\x6b\x22\xd2\x9a\x26\x0e\xf8\xd0\xca\xbc\x9c\x84\x9c\x44\x64\x68\x44\xd2\xa9\xf2\xbf\xd7\x6b\x1c\xbc\xc9\xe9\x7a\x25\x22\x93\xe9\x74\x38\xc7\x8d\x91\x66\x55\xba\x4a\xb4\xe9\xa3\x81\x20\xb1\xb3\xa2\xe0\x4d\x16\xc7\xce\x6d\x5f\xac\xcf\xda\x70\x74\x33\xfa\xe2\xf7\xe1\x7b\x59\xab\x30\x6a\x88\xa8\xee\x91\x30\x8d\x88\xa3\x04\xd0\xbd\xff\x02\xed\xfd\xc9\xcb\xe9\xf5\xc7\xac\x2b\xbc\xd7\xd5\x7e\x60\x90\xeb\x0c\x34\xff\xf9\x7c\xb3\x38\x8e\xb1\x42\xf7\x3a\x64\x7e\xfb\x03\x24\xf5\xba\xd2\xa5\x59\x95\xdd\xda\xd2\x57\xf3\x88\x38\x56\x71\xe4\xc1\x0a\x5f\x47\x71\xce\x75\x39\x6a\xc1\x31\x67\xdb\xf6\xbb\x3e\x6a\x88\x5f\x1f\x3b\x3f\xf4\x22\xb6\x43\xc4\xb1\x8d\xb0\x46\x1a\x67\x55\x37\xea\x82\xc9\x80\x24\x3a\xc1\x3b\xed\xda\x39\x59\x16\x3b\x82\x05\x89\x98\xd0\x48\x8b\x90\x25\x96\x7a\xfc\xb8\xc4\x64\x2c\x68\x18\x4b\x17\x50\x9c\xf4\x7e\x4c\x6c\xcf\x7e\xe4\xd6\x1c\x53\xdd\xc0\xb2\xd1\x47\x28\xce\x43\x32\xd3\x53\x29\xf1\x9a\xcb\xcf\x4e\xce\xc1\x65\x01\x07\x10\x72\x78\x06\x9a\x48\x42\xfb\xd2\x83\x6e\x01\x3c\x04\x28\xff\xac\x1b\xa8\x4a\x94\x97\xa4\xb8\xaa\xdb\x95\xb9\x24\x53\x2e\xe2\x24\x8d\x30\x8e\xde\xfc\xe7\x98\xd7\x35\x14\x7b\x54\x06\x7a\x82\xff\x84\x1b\x26\x22\x46\x3c\xc8\x38\x3d\x7f\x9f\x7f\x12\x1b\x17\x71\x92\xb9\x5d\x41\x75\x7e\x60\x67\x67\x77\x8e\xc6\xa9\x99\x2f\x4a\x71\x92\x59\xc4\x34\x9b\xfc\x0d\xe2\xd9\x93\x27\xa0\x70\xed\xd8\xd6\x47\xef\x0e\x0f\x58\xd9\x69\xcb\x94\x68\xa4\x2a\xf0\xe4\xc5\x6e\x3a\x86\xc8\x52\x78\x03\x16\x3b\xda\xfc\xc7\x1a\x56\xba\x1a\x07\x3d\x45\xcc\x88\x41\x59\x32\x57\x49\xf2\xbd\x6c\xf3\x62\x54\x04\x2a\x62\x9e\xc4\x88\x3a\xbe\xbf\xfa\x7d\xf7\xf8\xb4\xdc\x5c\xdd\x2d\x37\xbb\xe5\xef\xdb\xe5\xc3\x66\xb5\x7e\xe8\x5b\xa5\x31\xd6\xee\x3a\x96\x5f\xd9\x74\x4b\xb8\xa3\x21\xba\x18\x08\x15\xb1\x48\x32\xe5\x93\xa9\xb9\x5b\x0d\x07\x4b\x35\x34\x01\xe5\x38\x73\x8f\xa5\xa9\x65\xde\x5c\x28\xdc\xfe\x55\xd4\xb8\xbb\x80\x06\xe8\xa1\x15\xdd\xe4\x9d\x97\xa4\xfb\x86\x32\x73\xaa\x5f\xc1\x4d\x3c\x91\xf0\x0c\x52\x45\x3a\xf6\x18\xbb\xd7\xcf\x69\x6a\x07\xa7\x44\xc4\xd2\xb8\xae\x58\xdd\x3f\x5e\x2d\xb6\xbb\xa7\xe5\x97\xd5\x66\xfb\xf4\xc7\xee\xea\xe6\xe6\x69\xb9\xd9\x84\x2b\xab\x38\x22\x7e\xa6\xdc\x56\xb5\x3e\xab\xcc\xf3\xcd\x34\x21\x18\x19\xca\x75\x85\x0b\x3d\x41\xe1\x8b\x6e\x61\xed\x61\xe2\xc3\x76\x1a\x6b\xc6\x31\x82\xed\xe7\x86\xbb\x12\x96\xcd\x77\x67\x14\xf3\xa0\x84\x88\x8d\x1f\xfc\x35\x14\xf2\x74\x7d\x3c\xe1\x26\xac\xa1\xf8\xab\x1a\xab\x7f\x8c\x63\x43\x44\xfc\x22\x99\x22\x62\x23\x6c\x20\xb7\xda\xc8\x42\xd6\x7e\x7d\xc4\x94\xc5\x84\x12\x3b\xb4\x37\xd9\x58\x34\xf4\x8c\x33\x54\xc4\xc6\x02\x72\x26\xdd\xad\x17\xdf\x96\x37\xa3\xd8\x81\x88\x41\x24\x81\x97\xf2\x93\x91\x07\xd6\xc9\x94\xc1\xb1\xae\x16\x50\xb6\xcd\xaa\x5c\x97\x30\xde\xe3\x62\x9b\x52\x4c\x60\xe2\x8f\xab\x7e\xb9\xb4\x22\x51\x9e\xeb\x10\x8b\x52\xa6\x0f\x65\x33\x81\x0f\xe5\x72\x7f\x3f\x57\x0f\x37\xeb\x9f\x3b\xb2\x5b\x3e\x4c\x1e\x90\x44\x9c\xe2\xf0\xb8\x3f\xfd\xcc\x9b\x97\xcf\x49\x29\x27\x17\x27\x91\x54\x59\xda\xcb\x54\xa3\x09\x35\x09\x88\x0a\x12\xc7\x0a\x21\x2f\xd7\xcb\x87\x7f\x0e\x49\x7a\x41\x62\x95\x39\x30\xbf\x23\xd3\x1c\xea\x12\x66\xf6\x32\x21\xdc\x69\xef\xb8\x95\xc4\xf1\x13\x7c\x5a\xfb\x29\x08\x05\x57\x26\xd5\x79\x35\x0e\xfe\xbd\x5b\x5c\x3d\x86\xbb\xa6\x2a\x45\x49\xfa\xce\xf6\xcc\x1b\xf9\x3c\x4a\x4b\x86\x16\xa0\xf4\x24\x02\xdf\x2d\xa9\x23\xde\x75\xdf\x8c\xa5\x51\xea\x94\x6d\x96\xed\xcb\x43\xb5\x2c\xf5\xc4\x78\x23\x8c\x5b\x44\x37\x14\xd0\xae\xda\xa7\x11\x77\xd6\xb9\xa5\x41\x98\x48\x3d\xc5\x51\x51\x7c\x83\xd3\x79\xc0\x72\xbc\x28\x10\x66\x5d\x35\x36\x9a\x85\xbf\xf5\x3f\x1a\xdb\x23\xbb\x1d\x77\x06\x96\x26\x76\x93\xe6\xfa\x34\xca\x8e\x09\xc2\x23\x83\x0e\x3f\xf6\x67\x40\x74\x85\x63\x49\x8a\x5b\x6c\x88\x1f\x05\x9d\xd7\xd9\x27\x11\x89\xe3\x2c\x7c\x86\xf6\xa1\xba\x40\x7d\xe7\x9b\x75\xab\x17\xf2\xdb\x7c\x5d\xde\x6d\x16\xeb\x20\xd3\x20\x48\x96\x80\x81\x81\x87\xa2\x7b\x82\x3e\x18\x27\x48\xc6\x13\x1b\x20\x73\x2e\xbb\x17\x26\xe6\x10\x64\xec\xdb\x5a\x57\x93\x8d\x94\xda\x3f\xf3\xf6\x05\x8d\x90\x4f\xa5\x48\x66\x63\x45\x32\x93\xba\x08\xf9\xfa\xfa\x29\x5c\x52\xd1\x2c\x19\xe8\xe7\xcf\x48\xb1\x04\x51\xa0\x32\xf0\x86\x13\xd4\x3b\x18\x44\x3f\x04\xd1\xcc\x01\xf8\xf2\x12\x0d\x94\x61\xd7\x20\x1a\x44\xea\x27\xe9\xe3\xca\x29\x28\x12\x16\x0e\x02\xcd\x18\x39\x27\xaf\x9a\x75\x3b\x18\x8e\x38\xaa\x63\xf9\x1e\x02\xf5\x7e\x29\x0d\x54\xb9\xd3\xf6\x96\x49\x44\x75\xed\xe5\xc7\x4f\xc8\x47\x33\x27\x1c\xcf\x12\x24\x81\x73\x61\xe4\x6e\x9c\xcf\xa2\xfb\x82\x58\x49\x71\x5c\x99\xca\x9d\x3e\x3d\x4c\x63\x19\xa7\x83\x9b\xd4\x1e\xa7\xe0\x09\x41\x63\xc5\xe3\x71\xd1\xed\x0d\xbc\x16\x72\xae\xbf\x31\xda\xa4\x28\x31\xce\xc6\xcb\x9b\xd1\xb7\x9e\xde\x93\xa6\x59\x64\x7b\x00\x04\x06\x6a\x1e\x6b\x68\xdb\x53\xb8\x29\xd5\x1c\xf3\x1e\x6d\x9d\x1f\x0a\x78\xaa\xaa\xfd\xbd\xfc\xe8\x0f\x1a\x05\xd9\xc0\x21\x38\xda\xd7\x69\x02\x0c\x8d\xed\xfd\x20\x39\x18\xa6\x28\x4d\xac\x2b\x5c\x72\x00\xdf\xa1\x48\xf4\x17\x71\x18\x41\x53\xaa\x78\x3a\xa8\x53\xde\xc8\x16\x7a\xdd\x68\x41\x59\xcc\x30\x56\xdb\xb3\x05\xdd\x55\x7a\x48\xb2\xfc\x72\xe0\x52\x46\x28\xe6\xa6\xd0\xfd\x1b\xdb\x7f\xfd\xc5\xb9\xc0\xa8\x77\xdb\xd9\x68\xe3\xe0\x00\x65\xdc\xe0\x56\x8c\xa7\xae\x4a\x5d\x21\x34\xf0\xfc\x02\xca\xc1\x85\x9e\x07\x92\x73\xbc\xcc\x68\x6f\xbf\xb8\xfe\x52\x66\x23\x04\xf4\x79\x46\xbc\x6f\x7f\x2c\x3a\xcf\xe4\x93\x02\xa1\xae\x39\xcf\x92\x7e\xed\x53\x52\x35\xfd\x13\x58\x05\xa3\x1a\x0a\x64\x52\x6f\xb4\x3c\xa0\xde\xe0\x7c\xa0\xd2\x6e\xf3\x8d\x06\x36\x61\x97\x02\xb8\x10\x30\xea\x21\xe9\xbf\xfa\x13\xae\x99\x39\x69\xa1\x97\x51\xc8\xd1\x1f\xca\x88\xa3\x8a\xed\x96\x9c\xd1\xae\x46\x25\x21\x74\x28\x16\xc5\x31\x0c\xb5\x33\x6c\x2f\xd1\x52\x08\x2a\xb9\x0d\x3c\xc5\x33\x05\xf8\x59\x3b\x61\xe2\xd8\xe3\x40\x5d\x9d\xc3\xe0\x0a\x52\x29\x55\xa8\x67\xfa\x29\x9f\x61\x9c\xc2\x12\x54\x33\x81\xde\xc6\x63\xde\xad\x91\xdd\xf2\x08\x03\x27\xc0\xa5\x68\x17\xd5\x8a\x89\x38\xb0\x24\x7e\x40\x3d\x77\x90\x7c\x33\x43\x24\x06\xc5\x0a\xb0\x6d\xf5\x06\xf5\x4f\xc8\xa7\x91\x03\xdf\x0e\x8c\xe1\x51\x9f\x28\x1e\x71\xa1\xf8\xe3\x96\x24\x92\x7c\x12\x28\x99\xef\x95\xd4\x6a\x8b\x6b\xd6\xf6\x3e\xec\x26\x49\x4c\x04\x56\x89\x7e\x95\x7f\xfe\xe9\x02\x61\x98\xb9\xb6\xb2\xf7\xcd\x12\x12\xc5\x3e\x91\x76\x4a\x87\xdf\x80\x7a\x91\x09\x8c\xbe\xb8\x4f\xb9\xc7\x6f\x80\x66\xc8\x59\x68\xc0\x9f\x48\x19\x63\x74\xb0\x03\x57\xd7\xdb\xc5\x45\xa6\xac\xd0\x3c\x8b\xb1\xb4\xe2\xe8\x1c\xa6\xc7\xaa\x3c\xb9\x4a\xe7\x51\xaa\x61\xd4\xda\x68\xd4\xab\x5a\xde\xdd\x86\x07\xa5\x90\x44\x9e\xc0\x0f\xd9\x9a\x1f\x82\x60\x5a\x77\x88\x13\xcf\xf9\xfd\x06\x75\xbb\xad\xae\xb6\xdf\xa6\xbb\x55\x92\xc8\x08\x81\xc0\xdb\x1c\xea\xbc\x2a\xbd\xea\xf8\x78\x49\x48\x52\x99\x28\x3a\x44\x7a\x67\x17\x60\x11\x60\x8a\xe8\x1e\xca\x63\x94\x85\x73\x58\xc2\x13\x9f\x9e\x5e\x9e\xa0\x39\xa7\x24\x10\x09\x87\x04\x0d\x95\xeb\x22\xf7\xd4\xf0\x43\x35\x83\x48\x44\xea\xf4\x04\x6f\x3b\xc3\x20\x4e\xe3\xec\xaf\x8a\x59\x45\x22\xb2\x18\xc3\x65\xcb\xfb\x98\x90\xfe\x3a\x99\xc4\xc1\x7a\x2f\x3f\xfc\x3a\xe6\xf0\xe2\x6e\x67\xd8\xf5\xcd\x8c\x57\xe3\xc2\x79\x86\xd5\x90\x63\x19\x48\x91\x64\x34\x13\x5d\x27\x7c\xa9\xbb\xb1\x7c\x7d\xec\x25\x36\x45\x92\x01\xa0\xe7\xfc\x5c\xb5\xfe\xcb\xf9\x03\x52\x5b\xe2\x8b\x6d\xda\xaa\x86\xab\xa2\xd8\xc2\xfe\x70\xa1\xfe\x5a\x24\xca\x70\xda\xdd\xff\x43\xeb\x70\xb6\x56\x0c\x45\x6a\x97\xdb\xaf\xbb\x6e\x1f\xda\xdd\x4a\xdd\x33\x6f\x89\xc4\x10\x89\x9c\x00\xcd\xa1\x06\xe9\x52\xe6\x87\xa2\x27\xa1\x10\x89\xc9\xd2\x00\x6b\xb7\x79\xbd\xbf\x0f\xb1\xf8\xa1\x62\xea\xcc\x90\x0c\x67\x2a\x83\x26\xee\x1b\xd4\xb9\x3d\xf5\x8c\x5f\x93\x59\x99\xd8\x8c\x3a\xa8\x59\x9d\x6b\x58\xdb\xb5\xb5\xb9\x96\x08\x08\x1c\x54\x21\x45\x62\x8d\xba\x10\x4c\x3c\x03\xb3\x8f\xc2\x7e\x69\x44\x1c\x8a\x06\xd9\x10\x31\x0e\xd1\x86\x82\x01\x91\x46\x5c\x0a\x13\xe8\x8a\xfe\x0c\x18\x4d\x91\xc6\xa0\xd0\xe2\x54\x58\xf8\xa4\x3f\xdb\x4e\x52\x42\x2d\x6a\x00\xc9\xe6\xf5\xb6\xaa\xb1\x36\xf5\xb7\x59\x0b\xc6\x30\xad\x71\x8f\x75\xf4\x4d\x0b\x75\xd8\x73\x6b\x38\x8b\xee\x86\x73\xbc\x20\xad\x2b\xe3\xac\xaa\xc2\x69\x51\x85\x01\x92\x12\xe1\x34\x58\xa5\x0b\x63\x61\x0d\xd2\xbc\x0e\x59\xa4\x34\x71\xfe\xa3\x2e\x72\x6b\x6f\x82\x01\xe1\x0f\x26\xc4\x60\xf5\x63\xb0\x76\x27\x59\x3f\x91\xa6\x51\x8c\xe1\xf5\xc3\xb1\xdd\xa0\x9c\x6a\x38\xfe\xab\x40\x79\x9a\x6a\x87\xb4\x6b\xa0\x5d\x7e\xb4\xb5\x74\xa6\xcb\xdf\x42\x27\x0f\x17\x61\x94\x82\x0b\x6e\x62\x4a\x63\x1d\x62\x77\xe1\xd1\x18\x27\xb1\xd7\x05\xa8\x9f\xbb\x39\x30\xeb\x70\xa6\x15\xa6\x12\x56\x8b\xf5\x7d\x5e\x6e\x3d\xb2\x2c\xe0\x51\x2e\xb9\x38\x29\x4f\x20\x66\xa1\x84\xbf\x69\x6e\xc2\xad\x78\xca\x7c\xee\x4e\xaa\x02\xe6\x75\xf6\x22\xe5\xc2\xc4\x8e\xaa\xa4\x7a\xf7\xc4\x8f\xd2\xc2\x98\x3b\x7c\xf6\x6e\x1c\x54\x50\x75\xdc\xca\xe7\x19\x57\xac\x48\x3b\x13\xc0\xf3\x42\xb9\xb8\xec\xda\xfa\x4d\xba\xff\x30\x82\xbb\x58\x9e\x92\xe6\xb9\x57\xe2\x0b\xc7\x32\x07\x05\xeb\x0c\x84\xdb\x22\x3f\x1c\xfa\xc9\x9b\x0a\xe5\x1c\xad\xaa\xee\x5c\x88\x4f\x0b\xca\x45\x2a\x40\xd9\x81\xd3\xf7\x47\xde\x48\xa4\x0a\x1c\x0b\x81\x7d\x06\xe5\xbc\x84\x30\x13\x9d\xf1\x8c\x35\xe6\xba\x00\x59\xf7\x0a\xa2\x97\x10\x4a\x22\xcd\x88\x71\x9c\xba\x45\xd5\xc0\xcf\xaa\xde\xbf\xf4\x92\x06\x22\x95\x9d\x83\xe1\x08\xfc\x74\xf7\x91\x56\x3f\xfa\xef\xa4\x22\x8e\x5e\x59\xd3\x56\x87\x95\xae\x7c\x59\x7d\x7f\x94\x10\x11\x78\xb7\x5d\xe6\x00\x43\x29\x9f\x64\x40\x45\xaa\xd2\x14\xc9\x9f\xd0\x62\xdd\x40\x01\x7a\x3c\x71\x94\xe4\x99\x08\xc2\x6e\x6d\x0e\x41\xe8\x2b\x1c\x36\x29\x12\x96\xd4\xc7\x72\x14\x3c\x4f\xb5\xc8\x30\x76\xea\x44\xb3\x66\xc8\xa6\xd9\x27\x30\xd4\x60\xfa\x77\x9f\x97\xed\x24\x49\x97\x1a\x96\x32\x2f\x77\xb5\xb9\x7f\xf4\x85\x85\x38\x04\x1e\xd1\x1c\x9a\x0d\x27\xc3\x9c\xe9\x6d\xf3\x32\x6f\x5e\x3c\xc8\x3b\x3c\x11\xa4\x89\x70\xdd\x89\x6e\x63\xcf\xb4\x28\x52\x10\x02\xd1\x31\x79\x0b\x67\x20\x73\xa7\x01\x33\x7e\x61\x30\x4e\xd1\x7f\xbf\x0b\x80\xa6\xd9\x56\x94\xda\x24\xc1\xc8\x69\xe9\x87\xf4\xcf\xbc\x5f\xc9\x58\xa4\xc1\x74\x8f\xb8\x5d\x2d\x9f\xe2\xbe\x8e\x5b\xb0\x98\x50\x18\xe8\xf4\x4f\xf3\xa0\x31\x8b\x53\x40\x56\xc2\x5e\x92\xb2\x34\x8f\xf2\x13\x14\x9f\x3f\x85\x44\x44\xab\x81\xbc\xc5\x93\x7b\x78\x4a\xaa\xcb\x26\x27\x23\x3c\xc5\x0c\x6b\x5e\xb6\xb9\x9c\x64\xe9\x05\x23\x8a\xa1\x85\x0c\xdd\x4a\x87\x71\x70\x7f\x80\x12\x8a\x69\x41\x59\x14\xdd\xa2\x30\x36\x8e\x19\xf5\xf8\xc7\x26\x7f\x0e\xc5\x1e\x17\x83\x85\x8c\x5a\x8e\xf3\xf0\x26\x7f\xce\x1f\xa1\xa9\xc2\x05\x92\x2c\xb6\xda\x0f\xe6\x27\x00\x74\x7f\xfb\x47\x4a\x34\x75\x35\xa5\xe3\x4a\xaf\x8d\xe3\xf6\x9f\x6e\x0e\x2c\x01\x9e\x04\x62\xf3\xbc\x6d\xfb\x9d\x8f\xa5\x91\xf5\x78\xff\x57\x28\xbf\x40\x09\x6e\xdf\xb8\x1b\x42\xe1\x2c\x15\x19\x52\x0d\xee\x9e\x1d\x3c\xe2\x1b\x9c\xf5\x7c\x68\x29\x29\x77\xe1\x09\x27\x08\xbd\x8b\xfb\x6b\x48\x40\x40\xc2\x8b\x6c\x9e\xaa\xe2\x6c\x41\x98\xf5\x46\x6a\x74\xd2\x03\xde\x50\x26\x7a\xd2\xab\x3c\x49\xb1\xce\xb7\x1d\x73\xea\xb7\xd5\xb7\x3f\x16\x9f\x3c\x17\x57\x4e\x4b\xe0\x19\xda\xf5\xc3\x97\xa9\xaf\xc5\x84\x17\xe8\x76\x08\xeb\x6d\xbe\x1f\x69\x6c\x08\x26\x32\x22\x03\x38\x10\x6b\x84\xbe\x1c\x65\x2d\xcb\x76\xa6\x6a\x2f\x98\xd0\x3c\x1e\xcb\xd6\xdf\x0e\x8a\x84\x82\x65\x91\x26\xae\x68\xe1\xea\x4d\xe6\x28\xdf\xdf\xf5\xf0\xa6\xa8\x3e\x89\x33\xb2\x8c\xd8\x98\xfb\x90\xcd\x3d\xd4\xaf\x05\xdc\x80\x95\x9d\x71\x78\x4e\xf5\x7f\x71\x25\x66\x99\x76\x6e\x56\xde\x34\x47\x9f\x28\x9a\xa6\x2d\x59\x66\x04\xf3\xd6\x95\x5b\x56\x9a\xdb\xaa\x76\x85\xa0\x5e\x50\xf1\x93\x30\xb8\x3f\x5f\x5a\x85\xce\xc4\x73\xfe\x06\xab\x0b\xab\x87\x6f\xa6\x48\x86\xcc\xdc\x6e\x41\x68\x26\x9f\x52\x51\x1e\xa8\x94\xd5\x28\xfd\xc2\x94\xe0\x34\xeb\xe1\x68\x30\xa9\x42\x11\x4c\xe9\x18\xd3\x6d\x8e\x31\xf5\xfa\x84\x38\xb4\x79\x50\x85\x69\x1a\x83\xab\x4a\xf9\x7d\x33\xf5\xa0\xc2\xdf\xc9\x63\xea\x54\xa1\xfd\x84\x08\x9d\x9f\x2f\x00\xc5\x6d\x5e\x62\x5a\x69\xb2\x0e\x18\x4b\xe9\x10\xd5\xfa\xac\xbc\xf2\x1f\xf3\x15\x0c\x62\x27\xa3\x78\x75\x34\x79\x3b\xad\xaa\x17\x0c\x38\x0b\xd1\x90\xed\xc0\x64\x31\x26\x91\xec\xda\x64\x2e\x70\x8c\x5b\xda\x6d\xfe\x01\xc6\x15\xf0\xfc\x38\x58\x67\xd9\x9f\x2e\x29\x23\x8c\xc7\xc7\xdc\xe1\xbc\x6c\x91\x31\x50\x54\xf1\x41\xc2\xca\xf7\xfd\xd4\x62\x64\xa0\x49\xea\xa1\x30\x0f\x55\x2b\xeb\xd3\xa3\xac\x35\xcc\x8c\x33\x66\x09\x43\xd1\x93\xeb\xfc\x19\x5d\x9e\xb1\x5f\xc8\xac\xd0\x3a\x0c\x3f\xd7\x8d\x38\x27\xda\x11\x60\x23\xb4\x54\x22\x1b\x48\x74\xd1\x4b\x6d\xc6\x00\x9c\xc9\x4d\x79\x0c\x19\x72\xcb\x3a\xe1\xfb\x42\xe6\xfb\x9f\x32\x6f\x87\x82\x27\xdf\x8c\x46\x60\x3d\x9c\x06\x6b\x9b\xbd\xe2\xc3\x64\xa4\x71\xca\x4d\x50\x42\x5c\xb6\x2f\x9f\xc2\x02\x05\xa7\x36\x32\x2c\xdc\xb4\x73\x44\x7b\x6e\x3c\xc1\x93\x48\x60\x1d\xb0\x3d\x96\x26\xec\x60\xfd\x31\x6a\xd1\x4b\x7b\x87\xfc\x3e\x2f\x2f\x00\x2a\x78\x4a\x08\x1a\xb8\x28\x5a\x36\x04\xf8\x78\x9a\x70\xb4\x62\x7b\xe4\xd6\x56\x96\xaf\x5f\x8f\x81\x17\x5e\xf0\xce\xce\x45\xb7\xc1\x15\x4d\x0f\xcc\x57\x82\x33\x92\x04\xfd\xbb\x2f\x75\xbe\x7f\x02\x79\x80\xba\xb9\x7a\x96\xdd\xca\x3d\xce\x09\x71\x96\x11\x24\xf6\x6a\x87\x54\xfa\x55\x69\x90\x7e\xfe\x42\x80\x95\x33\x9d\x39\x19\xb2\xe5\x62\xfd\x70\xb3\xbb\xfa\xbe\xd8\xae\xd6\x0f\x9b\xdd\xea\x61\xb5\x5d\x5d\xdd\x05\xa6\x9c\xab\x2f\x21\x31\xc4\x39\x71\xc2\x0a\xcf\xd0\xee\xda\xc1\xb9\xdc\xe9\xd1\x32\xc1\x79\x62\x3c\xcf\x4f\x37\xc4\xf5\x08\x24\x2a\xb8\xa0\x2a\x4a\x7a\x46\x87\xfb\xef\x77\xdb\xd5\xe3\xdd\x6a\xf9\xb4\x5b\x2d\xd6\x21\x02\xce\x05\xb7\x98\x12\x28\xe1\xa3\x9d\x45\x91\xb9\x10\xc0\x44\x98\x7d\x01\xb3\x23\x8b\x91\x8d\xc4\x33\x2a\x30\xcb\xd4\xba\x54\x82\x57\x2f\x1b\x7b\x58\x3c\xcb\xe2\x24\x68\x62\xe6\xa6\xb9\x83\xf2\x39\x60\x5d\x05\xcf\xc0\x31\x86\xfe\xcf\xfa\xe9\xe6\x2a\x44\x96\xb8\x24\x8e\x33\x2f\xa0\xf4\x1e\xe4\x1e\x7e\x2f\x3d\xe3\xf7\x8d\x3c\x9c\xd7\x97\x8d\x5e\x5b\x1a\x29\xa3\xd1\xc9\x8f\x47\x35\xde\x98\xc7\x1f\x45\xa5\x8e\x84\x15\xbd\x68\xf9\x5e\x0e\x9c\x34\x53\xa2\x09\xc1\x95\x4e\x70\x4a\xfe\x5c\x7e\x59\xfc\xd6\xff\xe6\xc2\xfc\x3f\xf2\x6e\x91\xc9\x61\x52\xc1\x2c\xb8\x02\x82\xe8\xd6\x51\x8d\x50\xd2\x59\x09\x3b\x3f\x3f\x42\x3b\x4d\x8d\x03\x40\x76\x8b\xe9\x20\x43\x35\xdc\x5b\xa7\x06\x0d\x7e\x89\xfa\x94\x5e\xd8\xed\xb2\x0a\xf2\xfc\x44\xeb\x7d\x24\x5f\xc7\x80\x09\xdd\xe9\x12\xc2\x75\x96\xf0\xc0\xf5\xd6\xca\x67\xb8\x7a\x83\xce\x4c\x9a\xeb\x61\x09\xae\x21\xc2\x48\x4a\xdd\xad\x32\xf1\x68\x0c\x18\x22\xd1\xa6\x5f\x6e\xbf\xee\x16\x4f\x3f\x6f\x30\xf9\x37\x1c\x54\x18\x58\xb8\x3e\x9e\xee\xd7\x7f\x4c\xd7\x10\x93\xb9\x13\xbb\x11\xee\x19\x05\x76\xfe\x59\x77\x30\x0f\x57\x72\x63\x34\xe6\x23\x83\xfb\xb9\x7c\x83\x99\x5f\xc0\x21\x65\xa1\x6a\xe0\xeb\xcf\x85\x77\x19\x2f\x6f\xbe\xdc\x0a\x83\x0a\x0b\x6e\xab\xf4\xe8\x92\xdf\x2e\x18\xcc\x22\x22\x02\xe1\xad\x8d\x5b\x26\x97\x8e\x4c\xf3\xb7\x70\x94\xc5\x08\x4e\x97\x87\x03\x94\xe6\x1b\x9c\x5c\x48\x6e\x1a\x1f\x08\x6d\x45\x84\x51\x1b\x64\xae\x0c\xf5\xbc\x97\x43\x6f\xd3\xa7\x15\x91\x72\x98\xd1\xbb\xea\xd9\xd9\x21\x8f\x8b\x0b\x78\x7f\x21\xe2\x0c\x22\x87\x0b\xfe\xd8\xd6\x32\x2f\xa1\x76\xf4\x97\xfe\x30\x21\x1c\x5d\xaa\x85\xac\x6f\xa0\x1e\x98\x48\xa7\x37\x23\xd2\xe0\x0b\xff\x90\xae\xc6\x7b\xd0\xe0\x11\x82\x02\xc7\xe4\xfd\xa3\x3c\xa1\xff\x32\xbd\x7d\x92\x90\x24\x1e\xed\xd7\x0b\xd9\xc2\x73\x35\xa8\x19\x0a\x91\x48\x67\x9a\x2b\xdc\x5c\x26\x7e\xbb\x60\x46\x4a\xd2\x57\xce\x39\x28\xe3\xfc\x23\x4e\xef\xc7\x33\x63\xc4\x00\xe4\x9b\x94\x1c\x5d\xee\x48\x9e\xb9\x8a\x6a\x67\xa5\x5c\xe7\x41\x88\x2d\x1c\x96\x9a\xa2\x5e\x7d\xcf\x8f\xdc\xb4\x93\xf0\xa0\x10\x1c\xd0\xf1\x08\xa9\xb5\x5b\x2c\xb2\xfd\x30\xf0\xd6\xbc\xf4\xf1\x34\x91\x45\x29\x46\x7f\x1b\xe9\xa0\x41\x17\xc2\xaa\x22\x4b\x9c\x96\xac\xad\xe5\xd8\xb3\x16\x92\x4a\xcf\xa5\x7a\x11\x43\x3a\x97\xe2\x98\xf9\xef\x33\xea\xb4\x69\x7f\x49\x20\xe9\x40\xdb\xfd\x6f\xd0\x6d\x13\x16\xfd\x8b\xe9\x0f\xa1\x22\x81\x55\x9b\xc1\x67\x5d\xd4\xa7\x4d\x55\xac\x15\x9e\x1a\x1e\x58\x11\x83\xdf\x6d\x17\x9e\xf8\xc9\x97\xb4\x5c\x9e\x05\x4a\x30\xee\xa3\x4c\xdb\xfa\xd8\xb4\x30\x2f\x2e\x0e\xed\x32\x8e\x50\x97\xeb\xef\xbf\x8f\x92\xd8\x42\x59\x25\x7b\xfa\x07\xa9\xdb\x1b\x27\xbc\x3f\xa6\xaa\x17\x42\x13\x8e\x85\x78\xf9\x50\x5b\x05\x13\x61\x94\xd0\x2e\x25\xb8\xa8\xfd\x80\xf2\xd8\x8c\x12\x4a\x42\x1b\xa7\x65\xdc\x39\xde\x33\x8f\x46\x18\x1d\x7b\x22\xda\xb2\x84\x7a\x27\xcb\xb2\x3a\x96\x9f\xc6\x46\x05\x78\x4f\x69\xbd\x87\x67\xf9\x58\x57\x6d\xa5\xab\x30\x23\xb3\x28\x03\x3e\xce\xd4\xde\x9f\xc2\x88\x9f\x5c\x24\x8b\x23\xc5\xa3\x11\x37\x17\x8a\xc6\x56\x1f\xa7\x4b\xbb\x55\x16\xd3\x54\x9b\x10\x37\xbd\x76\x5a\xb4\xe1\x50\x6a\x31\xb7\x76\xb3\x40\x3c\xfb\xb5\xd4\xaf\x50\x9a\x8b\xc0\x7e\x91\xc5\x4c\xe1\x06\x82\x21\xe3\x6d\x75\x16\x59\xc9\x68\xc6\xb1\x9e\x46\xb5\xba\xb9\x3e\x9e\x7a\x02\xd2\x69\x2f\x67\x54\x65\x98\xcd\x1e\x30\x05\x81\xd0\xc4\x37\x48\x20\xa3\xc1\x99\xac\xf6\x30\x5e\x42\x43\x0b\x2b\x98\xcb\xb8\x38\x76\xee\x30\xf8\xb2\x34\xa5\x81\x28\xc9\x43\x3c\x17\xb2\x34\x58\x54\x79\x5b\xd5\x8f\x75\xfe\x67\x7f\x97\x34\x4b\xe3\x5e\xa8\xbe\x2c\xa1\x9b\xd6\xb3\xa4\xb8\x6f\xc9\x98\x34\x81\x09\xad\xda\xab\x80\xe4\x98\x35\x32\x86\x79\xae\x61\x8f\x49\x1f\x5b\xc0\x7e\xdb\xcc\x38\x75\x04\x4c\x8e\x7e\x00\x65\x1b\x67\xd7\xe1\x82\x06\xa5\xad\xcd\xa0\x12\x35\x58\x34\x99\x80\x18\x3f\xc3\xce\x0b\x8e\x8e\xed\xd0\x2c\x23\x59\xe6\x29\xe5\x8a\x00\x02\x9f\x78\x24\x59\x66\x28\xbe\xf6\x16\x9a\x36\xdf\x57\xe5\xa9\x3f\x00\x2e\xb8\xdd\xca\xfa\x19\x5a\x1a\x7e\x96\x8a\xe1\xcb\xff\x51\x1d\x3d\xb1\x51\x37\x31\xfa\xcb\xa9\x84\xa5\x3a\xd4\x80\xe7\xed\x15\xd6\x05\xad\xbc\xae\xe1\xb9\xbf\x37\x1d\x30\x4a\x44\xa9\xff\xd0\xeb\x46\xcb\x79\x97\xaa\x2c\x42\x6b\x01\xe1\x34\xdd\x67\xce\xcb\xe7\xc1\xd2\xc8\x94\x96\x58\x66\x70\x7d\xb5\x9d\xb0\x73\x8a\x4c\x7b\x1d\x3f\x67\x23\xdd\xc9\xf7\xd3\x0c\xd8\x9f\x99\x24\x41\x6b\x78\x77\x90\xa7\x73\x1d\x33\x91\x19\x1d\xe1\xb2\xe2\xbe\xd3\xfa\x30\x47\x56\x66\x20\x23\x9b\x7a\x28\xc2\x38\x86\x8b\xb9\xcb\xf2\x7c\xd0\x83\x01\x6d\xfb\xf0\x89\x0f\x4f\x16\xc7\xa6\xaf\x2c\x9e\xde\x1f\x6c\x14\x8f\x04\x9c\x86\x75\xeb\x6a\x1e\xf4\xcb\x6c\xc6\x03\x37\x0e\x72\x02\x20\xf6\xe6\xaa\x7e\x3e\xee\x07\xee\x5f\x91\x59\xe5\x18\x74\xe0\x90\x37\x95\x81\x5e\xc8\x61\x8e\x59\x9c\x3e\x86\x35\x12\x8b\xc5\x6e\xf3\xa6\xef\x5c\x0b\x1a\xd1\x26\x52\x55\xc7\x30\xc9\x1e\x7b\x8a\x3a\x21\x23\xe9\x88\x5e\x91\x5d\xd6\x65\x71\x31\xf6\x3f\xe9\x0f\x19\xc7\x19\x8e\x62\x0c\xfd\x6e\xa0\xfd\x91\x37\xb9\x2a\xe0\xd2\xd6\x28\xe3\x24\x72\x92\x8f\x30\x0c\x57\x19\x03\x47\xdb\xe6\x3d\x37\xed\x0b\x82\x5a\xde\xc2\x21\x22\x12\x11\x4a\x7a\x1d\x8f\x85\xa7\x9b\x9d\x3e\x02\x4d\x5d\x35\xe4\x0e\xb3\xfe\x18\x35\x7a\x94\x75\x9b\x5f\x80\xbf\x49\xea\xdd\x08\xe7\x45\x2e\xcb\xf6\x5c\x95\x3f\x7c\x10\x49\x6d\xa4\x7c\x3c\xda\x47\x1c\xc6\x08\x65\x99\x88\x0c\x5d\x45\x74\x54\xb7\xd5\x11\x29\x24\x7b\xb3\x47\xa6\x11\x43\xad\xf6\xf6\x25\xaf\x1d\x94\x2f\x70\x46\x3d\xba\x1c\xa0\xcf\xad\x77\xcb\x6f\x38\x85\xc4\x68\xb4\x87\x3d\xd0\x49\xad\xd6\xfd\xe1\x84\x0e\x2a\xc5\x4f\xb0\x97\xf9\x28\x06\x2f\x53\xad\x91\xb3\xfa\xd6\x2b\xd9\x7c\xb2\x6f\x49\x16\x39\x74\x7d\x8f\x34\xef\x66\xf8\x71\xa6\x3a\x2d\x24\x27\x6e\xf9\x92\xc6\x5c\x57\xd5\xeb\xc5\xef\xc9\x13\xcd\xf5\x05\x45\xe3\xcd\x71\xbf\x97\xdd\x12\x7d\x46\x32\xd9\x9d\x63\xd1\x09\x44\xb1\x8e\x65\x5d\xf7\x26\x98\xe4\x99\x41\x7a\xa4\xf7\xaa\xb0\x74\x1a\xba\x93\x82\xa5\x36\xe4\xc7\x3d\x2c\x7f\x36\xd3\xa4\x80\x08\x01\x08\xfb\x11\xe3\xf6\xd4\x44\x91\x19\xb8\x8a\x36\x57\xc3\x67\x8e\xba\xf7\x8d\xcf\x6d\x08\x29\x33\x2b\x7a\xae\xd5\xdb\xaa\x5e\x1f\x5b\x5d\xed\xc7\xa4\xa3\x42\x2a\x41\x78\xd2\x7b\x59\xbd\xbe\x92\x90\x2a\x23\x91\x18\x52\x6e\xd7\x27\x17\x86\x9f\x3e\xb1\x92\xce\xe0\x38\xc8\xba\xbd\x85\xe1\x64\x1d\x2b\x45\xc7\xec\x72\xbd\xe1\x75\x09\xd6\x2c\x35\x61\x18\x83\xb8\xad\xea\xd7\xa6\xdb\x0d\x66\x0e\xbf\xd4\x44\x60\xc6\x07\x89\xa1\x7c\x41\x71\xd2\xcf\x3f\x9d\x2a\x2c\xe0\x6a\x03\x3b\x32\xa2\x65\x77\xcf\x2d\xa4\xaf\xdf\x9b\x60\x61\x48\x13\xeb\xb0\x3f\x2c\xe4\x61\x62\xe1\x4b\x60\x31\x46\x2f\x7f\xca\x37\x68\x1e\x65\x7f\x69\x00\xe7\x03\x23\xaf\x69\x5e\x3e\xf7\x95\xf7\xb3\xae\xb6\x9a\x58\x08\x88\xdb\x7d\x5e\xfe\x90\x75\xde\x19\x7f\x7d\x8f\x58\x43\xbd\x5e\xdc\x5b\xde\x54\xf5\x69\x12\xa2\x54\x51\xe2\xbe\xfc\x75\xde\xbe\xc0\xbe\x6a\x2f\x93\x07\x0a\x15\x29\xc7\x9e\x8c\x93\xb0\xee\x4f\x8f\x63\x83\xe1\xf5\x2b\x63\x56\x2d\xec\x31\xb5\x1b\xec\xaf\x11\xfe\x79\x0e\x87\x66\xff\xb8\x64\x06\xab\x98\x38\x28\xf9\x73\x67\x61\x36\x2f\x8f\x55\x5e\xb6\xd7\x27\xac\xa1\xb8\x90\x9b\x55\x31\xa3\x58\x7f\x8a\x42\x13\x8d\x0b\xec\xfa\x43\x24\xa3\x28\x8d\xe2\x88\xb6\x7d\x8f\x8f\x8b\xf5\x7c\x3b\x4a\x63\x24\x51\x38\x20\x50\x63\x60\xdb\x98\x0c\x36\x45\xa5\x13\x3b\xca\x9b\xb5\x31\x67\xc7\x0c\x0f\x68\x0e\xd9\x62\x99\xdd\x5d\xae\xa6\x1f\x49\x51\xc3\x82\x20\xe7\x0f\x28\x4d\x55\x5f\x1d\x0e\x45\xee\x40\xc6\x1b\x5d\x75\x8f\xb5\xad\xbb\xed\xe3\x92\x83\xa6\x28\x24\x18\xdf\xff\xbe\xb9\x21\xd1\x36\xd0\x3d\x84\x57\x4d\x20\x15\x11\x06\x3c\x8b\x4a\x9a\x3e\x5c\xfc\x29\x6e\x49\xa5\x91\x64\x74\xcc\x84\x78\xf9\xae\xa9\xb6\x48\x9a\xa2\xa0\x04\x9b\xeb\x5c\xd6\xa7\xdd\xbe\x32\xb9\x9d\xad\x76\x8a\x31\xe9\x13\x72\xa5\xf9\x5c\x5a\xc6\x37\xe6\x59\x8a\x57\xbd\xfd\xf8\x98\x20\x7f\x3a\x0f\x28\xc8\x06\xe3\x0e\x7e\xae\x9c\x20\x54\xc6\x12\xe4\x36\x0d\xa4\x99\xf3\xc3\x22\x46\x7b\x61\xf1\x74\x77\x08\xca\xac\xfd\x21\x8b\x25\x42\x81\x14\x72\x76\xa2\x24\xd2\x43\xb1\x3f\x53\xff\x99\x75\x4e\x26\x39\x22\x02\x17\x77\x8b\x5f\xe1\x84\x94\x64\x4e\x9f\x6f\x24\x14\x14\x26\xa6\x92\x42\x07\x7a\x96\x07\xf8\x68\xc3\x0e\xb7\xdd\xde\xbb\xdd\xcd\xb0\xdf\xc6\x18\x40\x25\x65\x16\xf9\xcc\xd4\x55\x0d\x72\xe9\xea\xbb\x46\xa8\xd4\x8b\xac\x12\x42\x49\x93\x22\x43\xd1\xb1\x81\xfa\xae\x92\x9f\xd4\x43\x0b\xa5\x24\x44\x74\xea\x4f\x39\xdd\xa1\x39\x20\x47\x99\x84\x3b\xcf\xc3\x21\x1c\xd1\xfc\xd1\xa7\x0b\x41\x86\x19\xa4\x4c\x01\x11\x68\x93\x1e\xcb\xcd\xb1\x39\xcc\x49\xb1\x85\x02\x1a\x59\x3d\x24\x62\x83\x8a\xf3\xac\x91\x14\x99\xdf\x1f\xdc\xe2\x0e\xa6\x07\x0e\x5d\x5c\x56\x6c\x94\x62\xd0\xb6\x80\x37\x28\x62\x17\xc6\xeb\x0f\x01\x02\xbc\x5d\x1e\xbc\xf3\x0b\x07\xab\x40\xd9\x98\xf3\x09\xfe\xfe\xb1\xaa\x5e\xae\x8f\x27\x5f\xb5\x33\x7d\x35\xcb\x5c\x26\x64\xb3\xbd\x7a\xda\xee\xae\xef\xd6\x8b\x6f\xbb\x87\xef\xf7\xd7\xcb\x80\xe6\xd6\x11\x71\x2c\x8a\x5f\x10\x34\x7a\xda\xdd\x1f\xff\xc8\x77\x0f\x55\x80\x8f\xe9\x58\x53\x4d\xa6\x10\x8f\xed\x6c\xdb\xd3\xb1\x95\x98\x14\x47\x32\xd0\x55\xd8\x44\x34\x49\x1d\xff\x5b\xde\x3c\x54\xed\x48\x4e\x67\xd2\x0f\x9a\xe8\x38\x2c\xaf\xba\x02\x6b\x75\xfe\x69\xed\x82\x26\x5a\xa0\x39\xf5\x58\xc0\x07\x06\x01\x2e\x00\x58\x27\x15\xcf\x42\xd3\x88\x87\x42\xbd\xde\xed\x0c\x7e\x8a\xa6\x49\x8c\x61\xb6\xbc\xf9\x56\x56\xef\xe5\x40\xa3\x34\xbd\x44\xda\xd3\x6d\x7f\x3d\xee\x65\x39\x29\x41\xd4\x94\x83\x36\x93\x7a\x08\x74\x4c\x1e\xf3\x0f\x28\x26\xd8\x91\xff\x8b\xd9\x0c\x29\xa9\xa9\x76\xa5\xa6\x4e\xab\xf0\x4f\x58\x8d\x24\x74\x2f\x66\x69\x74\x42\x00\x13\xfc\xa6\x3a\xaa\x02\xce\xa9\xc7\x85\x4e\x58\x4f\xbd\xfb\xb0\x0a\xf8\x04\x9d\x68\x8a\x36\xc1\x37\x59\xcb\xf5\x24\xfe\xad\x13\x6d\x1c\x4d\xbf\x7c\x83\x4d\x7b\x34\x23\x46\xc1\x59\xcc\xea\xe2\x26\xac\x53\x2e\x32\x12\x10\xba\x3a\x6f\xe6\x94\x4f\x42\xa7\xda\xb1\x72\x9b\xbc\xf1\x8b\x64\x4f\x9d\xe4\x5b\xb0\xd4\xa1\x3a\x77\xcd\x08\x2e\x99\xcc\xde\x8c\x29\xc3\x7a\x9d\xa7\xfb\xbc\x9c\xbf\x79\x16\x71\x46\x26\xf1\xaa\x55\xd3\x1c\x3f\xa9\xed\xd6\x19\xc9\xa4\x98\x0c\x0c\x4c\xcb\x79\x89\xdb\xf0\x60\x19\xa5\x98\x8a\xdb\xc2\x47\x1b\x18\x86\x43\x0c\xe6\xc2\xd2\xaa\xb3\x44\x23\x73\xd7\xae\x7b\x88\xcf\x41\xaf\x3a\xe3\x23\xae\x0f\x0b\xf5\x6d\x5d\xed\x7f\x9c\x39\x9b\xff\x7f\xce\xbe\x6c\xbb\x71\x1c\x49\xfb\x75\xea\x62\x2e\xb8\x83\xb8\x94\x25\xd9\xe9\x29\x2f\x6a\x4b\xce\xac\x9a\x3e\xff\xd1\x09\x00\x01\x9b\x6d\x8a\x54\x93\x94\x9d\xea\xa7\xff\x0f\x03\x00\x37\x51\x59\x35\x73\xd1\x55\xd5\x26\x48\x71\xc1\x12\x88\xf8\x16\x09\xcc\x0f\x9d\xd5\x3f\xfd\xcc\x23\x0e\xfb\x1e\x58\x97\x6b\xe5\x00\xea\x78\xff\x8f\x9d\x2d\x94\x5f\x20\xfb\xa4\x08\x14\x15\x78\xb6\xbb\xe7\x41\x06\x4d\x8a\x08\x08\x31\x2c\x68\x0a\x1a\x7f\x5b\x11\x07\x2e\xbf\x72\x5b\x21\xbe\x80\x10\x59\x33\x0c\xa5\xba\x2c\xca\x3c\x10\x42\x0a\xf0\xc4\x90\x05\x3b\x97\x0c\x97\x02\x18\xe5\x25\xc9\x24\x32\x1c\x8c\x4f\x21\x31\x1e\xcd\x75\xab\xec\x33\x53\x58\xa8\xfa\x62\xfa\x97\x52\x79\xb4\x3b\x6b\x43\xd3\xc9\x83\x2b\x90\x54\xfc\xfa\xca\x0a\x55\x7e\x79\x44\x4d\x1d\xb0\x7a\x24\x4a\x49\x2a\x3e\x8f\x0a\x15\x81\x38\xdf\x21\x2b\x86\xaf\x48\x73\x3f\x75\xbb\x02\x42\x17\x2e\x2d\x37\xa8\x53\xc9\x4c\xa5\x56\x46\xbf\xe8\xa1\x7c\xbb\x99\xf4\x7f\xad\x4d\xa1\xf3\xe9\x66\xb1\xf3\x3d\xff\x5a\xa9\x7d\x7e\x7c\x29\x8f\x25\x94\x73\x3b\x96\x16\x04\xe7\xae\xab\xbc\xd4\xa7\x6d\x40\x7b\xab\xdf\xb3\x3c\x07\x7b\x2f\xca\x57\x31\x51\x72\xbf\x9c\xd7\x85\x0b\x20\x26\xdf\x57\xf9\xa8\xc9\x15\xad\xea\xe5\x18\x0c\x91\xdb\x5d\x29\x8c\x24\x95\x11\x8c\xd5\xc1\xaf\x81\x60\x2a\x14\x3e\xa9\x21\x12\x38\xca\x5d\x21\xf2\x0c\x99\xf3\x0d\x0e\x38\x9a\x39\x55\x14\x2b\xdf\x86\x1a\xdb\xf7\xec\x78\x9c\xa8\x90\xa5\x2a\x02\x46\xbb\xbb\xc5\xeb\x6a\xff\x7c\x28\x32\x55\xe6\x39\xf4\xa7\xa3\xf4\x02\x37\x1d\x58\x36\xc5\xe4\xf1\x62\x16\x51\xce\xf1\x8f\xc7\x87\x3f\x87\x73\x9e\x8a\x21\xb0\x7e\x91\xe7\x9b\x36\xbc\x39\x8f\x37\xe6\x8a\x85\x09\x65\x5f\xf7\x07\xf8\x40\x9b\xe8\xbd\x2d\x2b\x5b\x7f\xff\x25\x1f\x5a\x31\xc6\xa8\x2c\xbf\x37\x4a\x3c\xc3\xd1\x92\x8e\xf8\x13\x2a\xc5\x80\x5a\x36\x58\x37\xfb\x20\xdc\x1b\xf1\xcb\x3b\xa8\x5f\xdb\x00\x23\xf0\x3c\x92\x4e\x72\x73\x91\xe2\x7e\x4c\x20\x82\x63\xe5\xc9\x32\x9b\x64\x0f\x15\x84\x42\x8e\x17\xba\x4d\xd9\x6c\xfb\xac\xaa\x02\xe6\x11\xdc\xfc\x58\x61\x26\xcb\x3d\x16\x4a\xf5\xe5\x31\x25\xe2\x34\xd4\xfd\x48\xa7\x78\xbd\xda\x7e\x64\x79\x3e\xaf\xbc\x9d\x2a\x21\x22\x62\xef\xfc\xf7\xf6\xf9\xe9\x08\xcd\xfb\xbe\x9e\xa9\xea\x74\x6d\x8d\xfa\x05\x61\x33\x0d\x53\x75\x9f\xb9\x35\xc0\xce\x1f\x5d\x1e\x55\x09\x8c\x24\xef\xdd\x02\x86\x89\x93\xf1\x2d\xa8\x40\x50\xe9\x9d\x5c\xbd\xdc\x4c\x8a\x44\x5a\x7a\x25\xa4\xc5\x64\x5f\xa4\x30\x06\x43\xee\x39\x76\x7d\xb9\x9d\x79\xff\x77\xfc\x64\xa5\xa3\x88\x68\xa6\x07\xf8\xd9\xb1\x7a\xdd\x7b\xd4\xb1\x92\xbe\xa5\x65\x8f\xf6\xd4\x4a\x73\x00\xe5\xf6\x64\xe7\x1f\x1d\x83\x70\x6a\xaf\x92\xa2\xc7\x15\x58\x35\x15\xb3\x90\xcd\x88\x3f\x53\xae\x99\xa6\x56\xfc\x79\xcc\xcb\x0a\x83\x5f\x48\x49\x60\xe0\x21\x29\x15\x89\x2a\x93\x1f\xc3\x9c\x17\x06\x41\x68\x83\xb4\xfa\x84\x8f\xa8\x26\xf6\xea\x29\x06\xe8\x76\xea\x87\xac\x68\xd7\xe7\x7d\x56\xbf\xe0\xbf\x4f\x59\x85\x46\x7e\xb9\xff\x95\xd0\x33\x18\x3d\x02\xec\xaf\x97\xeb\xfb\xef\xeb\xd5\x80\x5c\x8a\xa1\xf4\x09\xd4\x2b\x4e\xe7\x0d\x19\xd5\x0d\x78\x36\x7f\x63\x31\xc1\x50\x86\xa6\x8f\x56\x99\xda\x95\xa3\x04\xcc\xf8\x0b\x61\xc4\x12\x63\xbb\x6e\xd9\xd7\x5d\xa2\xae\x63\x67\xb9\x00\x17\x23\x30\xfc\xdb\xac\xa6\xba\xcf\x24\xd5\x82\x91\x36\x39\x41\x32\x08\xfb\x72\xb0\x46\x8c\x01\x89\xc5\x45\xfb\x39\x38\x64\xaa\x3b\x20\xbd\x68\x88\xa2\x1b\x01\x4d\xe6\x6f\x36\x96\x8c\x68\xa0\xb2\x2c\x24\x4c\x95\x8b\x66\x46\x13\xc6\x98\x44\x2e\xbb\xe2\x60\x4d\xcf\xd5\xff\x60\x55\x8e\x17\x1e\x4c\xbc\x84\x16\x9e\xe7\xdb\xa7\xe7\x3b\x77\x87\x89\x08\x08\x30\xa9\xb3\x42\x6d\xca\x9a\x92\xbb\x56\x67\xa6\xac\xea\x69\x2a\x07\x99\x2f\xa8\xd2\x9a\xc9\x32\xac\xac\x36\x3c\xd5\x8c\xdd\xf5\x58\x84\xca\xca\x01\xb7\x01\xfe\xb6\xa9\x86\xc8\x11\x4c\x93\xd4\x39\x3d\x52\xc7\xbb\x64\xef\xce\xbf\x95\x94\xc5\x01\x38\x1a\xef\x6b\xdd\xfe\xa8\x82\xf3\x50\x7e\xcc\x35\x14\x3e\xe5\x3a\x32\x9b\xaf\xbf\x78\x02\x9e\x78\xa4\x92\xde\x64\xed\xdc\x33\x61\xab\x22\x4f\x42\xca\xcd\x39\x17\x90\x09\xef\x1b\x39\x03\xe2\xc0\x82\xc1\x5b\x90\x62\x51\x03\x07\x17\xa3\xa0\x08\x81\x0f\x29\xc1\x16\xa1\x30\x4e\x77\xa2\x48\x40\xf7\xea\x74\xeb\x59\x12\xae\x6b\xaa\x91\x02\x09\x7a\x1e\x50\xea\x40\xb2\x74\xbf\xee\x42\x32\x8e\x69\x23\x71\xc0\xee\xbd\xcb\x84\x53\xb4\xbc\x77\x7a\x79\xfe\xde\xa1\xa7\x50\x09\x83\x5b\xff\x9f\xa1\x56\x60\x8a\x18\x68\xc2\xf0\xee\xc5\xe9\x92\x64\xed\xda\x30\x73\x59\x6d\xa8\x7b\x9d\x4d\xcc\x20\x9e\x42\x04\xb3\xa7\x34\x82\x20\xf7\xed\x8a\xd7\x1d\x12\xca\x14\x00\x8e\x58\x34\x93\x77\x84\x3a\x48\x8d\xe8\xbe\xd5\x4f\x9e\xbf\x05\xed\xf9\x01\x65\x59\x29\x41\x9b\x63\x5d\x4f\xd0\x83\x33\x43\x46\x7b\x89\x20\x31\x56\x42\xea\x93\x6d\xd8\xa0\xde\x3c\xee\x2f\xda\xb3\x96\x38\xc6\xe3\x6f\x57\xde\xf4\xb9\xa6\xdf\x5c\x13\x69\xbc\x82\x28\x20\x6c\x4e\xc7\xde\xe7\x62\x08\x0e\xd5\x7e\x12\x82\x70\x19\x67\x93\x85\xea\xb8\xa4\x5d\xa9\x57\x07\x51\x2a\xec\xc5\x6e\xcb\xea\x6d\x12\xbd\xea\x40\x2a\x5a\x3b\xcb\x42\xe2\x16\x1b\x6b\xe1\xe7\x0e\x6a\x8f\x9b\x3d\x51\x56\xb8\xf0\x4f\x87\x9e\x31\xbb\xac\xb1\xe9\xd0\xba\x97\x7e\x7d\xa9\x0e\xa3\xc0\xd1\x22\x6f\x76\xcb\xf5\xee\xdb\xf4\x38\x33\x4c\x62\xec\xdc\x4e\x27\x6f\x2a\x0a\x4c\x02\x6b\xfb\x1f\x9c\xc5\xa7\xba\x66\xb1\x26\x80\xfe\xc3\xfd\x72\xd8\xdf\x74\xac\x3c\x1a\x3a\x16\xd2\xff\x3a\xb2\x74\xb4\x6d\x12\x15\xf3\xa4\x13\xa1\x98\xbe\x9b\x44\x49\x07\x81\xdc\x41\xfd\x41\xd5\xac\xd1\x14\xa8\x99\x9f\x92\xe2\xf9\xe3\xe2\x8f\xfd\xf2\xf9\xf1\xf1\x7e\xa0\x7e\xa2\x79\x12\x13\xa8\xdb\x8d\xdd\xe2\x22\x53\x38\xbe\x19\xae\xfc\x68\x62\xa6\x38\x9b\xdc\xd1\x1c\x63\xc2\x94\xad\x3f\xca\x1b\xc4\x6a\xb0\x97\xd0\xe0\x73\x5f\x74\xd0\x0e\x92\x1d\x34\x46\x3f\xb7\x19\xe6\xbd\xdd\x80\x25\x2e\x0c\x8c\xe7\xdc\xf9\xa8\xa5\x99\xbe\x7f\x8e\x78\xc9\x33\x99\x2d\x2d\x84\x0e\x7b\x59\x11\xb7\xb4\xb5\x11\x4f\xe7\x82\x37\x3f\x09\x69\x81\x9c\x4f\xf7\xa7\x53\xd8\xe4\x95\x33\xb5\xe6\xbd\x3c\xc0\xaa\x2a\x0b\x42\x03\x7e\x87\x9e\x17\xa8\x25\x7a\x64\x33\x77\xcc\x0a\xf9\x4e\x3b\x97\x41\x2e\x67\x7c\x39\xa9\x15\xc9\x5a\x5a\x06\xe7\x0b\xb6\x03\x29\x88\x93\xdf\x8c\x80\x89\x6d\xa5\x7c\xa4\x55\x9a\x7e\xb4\x74\xe6\x78\xee\x60\x60\x84\xb6\xdb\x2e\xf4\x71\xca\xf3\xf3\x90\xf0\xe4\xda\x30\xcb\x73\x38\x09\x83\xb2\xb1\x82\x4b\xbf\x7e\x56\xf4\x63\x9a\x06\x6e\xa0\xc6\xfb\xe5\xf3\xce\xc9\xdb\xce\xa0\x03\x35\xc6\xbe\x4f\x94\x80\xac\x79\xef\xea\x20\x1a\x55\xc8\xbb\x5a\xcd\xb6\xd4\x8d\x74\xbb\x5f\xee\x79\x41\x4c\x69\xb5\xd5\xfd\xf7\xfb\x55\xbb\x2c\xdd\xbe\xb6\xff\x78\x59\x2c\xf7\xbb\xe7\x4d\xd7\x0a\x12\x42\xd7\xbe\xbf\x35\x3d\xf1\x90\x7b\x7e\xe4\x39\x0b\x15\xa3\x6a\x3f\xf2\x60\x1a\xde\x1a\xf7\x7c\x1e\x87\xde\x80\xdf\x3a\x6c\x65\x07\x12\xf7\x7c\xc1\x53\x47\xe4\xd8\xfb\xfb\xb7\x8e\x69\xb1\x20\x1b\x5f\xa3\xb1\xb9\xcf\x2c\xbe\xc0\xfc\xdf\x9b\xb3\xef\x79\xee\x8e\x02\x90\x64\x38\x93\x15\xed\x2e\x67\xaf\xda\xe0\xd1\x1e\x0a\x59\x14\xd9\x09\x6b\xdd\xbc\xdf\x9e\x0a\x35\x81\x93\x75\xed\xe2\x20\xe8\xfa\xf3\xf7\xf2\x8a\x70\x1f\xf7\x42\x19\xc3\x50\x40\x63\xb5\x1e\x02\x93\x07\x25\x5a\xee\x45\x1e\x8f\x3a\xcd\x2d\xb3\x35\x59\x54\x87\xf3\x10\x06\x32\x7e\x5b\x31\xb3\x5a\x9b\xc6\x25\xba\xee\xc9\xd4\x23\xe8\x6a\x64\x9b\x27\x4c\x53\xa2\x3b\x2b\xb2\x76\x37\xf3\x76\x01\xde\xe2\x1e\x4b\xac\x28\x2e\x6d\xbd\xa9\xf3\x8c\xd4\x0c\xb9\xc7\xd0\x98\xf5\xec\x2d\x61\x00\x9b\xc9\x4d\xa5\x81\x11\xc8\xb0\x95\x64\xdd\x2e\xce\x5d\x5f\x48\xb9\x20\xf0\xee\xde\x51\xd1\x5c\x16\x65\x72\x11\xce\x0d\xd7\x1e\x0b\x65\xec\x7e\xa9\xc8\x1d\xba\xcb\x40\x1a\x04\xd1\x38\x15\xbc\x3d\x11\xf8\x4f\x9f\xf2\x15\x82\xf3\x69\x6b\x5b\xa6\x0e\x18\x6f\xdd\x13\x5f\xf0\x98\x67\x97\xb1\x9f\x6d\x2f\xbc\x80\xf0\x22\x39\xea\x26\xf5\x26\x77\x25\x22\x1e\x3b\x1d\xb7\x1c\xc9\xc5\xf0\x5f\x28\x9b\xd1\x3c\xcf\x3d\xe9\x33\xa2\x72\x2a\x38\x0f\x22\x07\x77\x30\x30\xa0\xa4\x45\x2e\xb0\x6a\xde\x31\xfb\x57\xe1\x6e\x55\x2a\x63\x6e\x42\x55\xd0\xe2\x13\xea\xae\xc2\xdd\x5d\x5a\xc5\xc2\xde\xc0\xf1\x5c\x0d\x59\x25\xee\x78\xca\x3c\xe1\x76\x48\x5b\x6c\xe6\x5c\x80\xb9\xef\x25\x01\xa1\x90\x88\x57\xb8\x38\x35\xef\xc3\x5c\x07\xf7\x3d\x99\x52\x1d\x85\xe4\xba\x9e\x7f\xac\x5f\x6e\x16\x0f\x0f\xa3\x5c\x3d\xf7\xfd\x28\x72\x80\x3c\x62\x61\xfc\x52\x2b\x9f\xfb\x81\xd5\x40\x74\x73\x78\xd3\x53\x53\x47\x0f\xe0\x07\x28\x44\xd0\x15\x8c\x29\x69\xaa\xee\x9d\xdf\x07\xf7\xc3\x48\x46\x46\x05\xe6\x2e\x2f\x05\xe4\xcb\x36\xd0\xaf\x20\x2b\x86\x49\xfd\xc9\xde\x73\xa6\xe6\xc3\xfd\x30\x8e\x88\x5a\xb9\x50\x9b\xb2\x81\xa6\xff\x01\x85\x94\xff\x7b\xad\x55\xbb\x75\xdf\x4e\x7b\xb7\x1f\x45\x11\x3d\x89\x93\x08\x70\x3e\x96\xd7\x12\x68\xd3\xb3\x4d\xf2\xc1\x60\x23\x89\x4f\x31\x08\x43\xb8\x1f\x49\x15\x59\xe7\xf7\x4d\x39\x51\xe3\xe4\x7e\x1c\x27\x81\x29\xb3\xf6\x3e\x56\xee\xcc\x98\xeb\xc4\xc0\x34\x21\x47\x75\x73\xee\xfe\x2e\x95\x1d\xf3\x9f\x58\x37\xd3\xea\xa7\x6d\x94\xb4\xcb\xce\xc8\xab\x92\x62\xc7\x9b\x4b\xe1\x2c\xee\x27\x28\x43\x1b\xe7\xac\x0f\x59\x5d\x67\x65\xe1\x82\x07\x37\xe8\x7c\x96\x26\x0e\xdf\xe1\xbc\xd3\x76\x58\x37\xbf\xf4\x4f\x6b\xcf\xe2\xf4\x4d\x0e\xf0\xd3\x64\xb7\xc6\xc4\x6b\xee\x33\x85\x94\x20\x20\x67\x63\x74\x7f\xe5\x81\xa9\x5c\x80\x72\xc5\xdd\xc9\x1d\xf3\x48\x59\x6d\xe4\xb7\x37\x4b\xba\xd7\x58\x91\xf3\x5e\x97\x31\x68\x5b\x69\x69\x83\xa1\xe5\xfa\x79\x06\xfb\xcf\x7d\x40\xf4\x82\x01\x54\xb9\x7d\x3b\xf5\xc6\x69\x82\x37\xfd\xc7\x90\x3c\xa5\x5c\x35\xd1\x60\xb3\xe2\x6d\x80\x33\xe5\xbe\x04\x9f\x5e\xce\xfa\xdf\xa7\xac\x28\x7f\xf6\x01\x19\xf7\x49\x7e\xcd\x1a\x7b\xcb\x72\x5d\xa8\x45\xd3\x1d\x92\x9c\x76\x0d\x4d\x76\x20\xba\xdb\xfc\xfa\xe9\xa3\x2f\xa9\x76\xdd\xd8\xfb\xeb\x81\x0e\xdc\xc7\x20\xa2\xfa\x59\xbb\xa5\xbc\x5e\x10\xe0\xbe\x0e\x35\xb1\xb2\x6e\xca\xf2\x83\x60\xe7\xeb\xe6\xfd\xbb\xbf\x42\xe9\x2e\xa4\x93\xd4\xe8\x1c\x9b\xe4\x9e\xad\x42\x0e\x33\xaa\x3c\xf0\x83\x84\x2a\x95\x4f\xf8\x45\xf0\x93\x5f\xed\xb0\x79\xe0\x47\x29\x8d\xaa\xe5\xf3\xd3\xed\xfd\xdd\xeb\xcb\x7a\x16\x5d\xda\x7e\x69\xc1\x0c\x78\xdb\x2c\x2c\xee\xd7\x02\x80\xd0\x50\x32\xab\x5f\xa3\xd5\x78\x10\x08\x93\x8f\xa9\xdb\x05\x65\xef\xef\xcd\x4c\xb3\xaf\x25\xf4\xa3\x29\x70\x1b\x9d\xfb\xa2\x6e\x67\xd9\xa9\xa2\x3e\x0f\x02\x65\x48\xe1\x3b\xfb\x39\x50\x75\x43\x72\x9c\x19\xe4\x41\xa0\x13\x2a\x1b\x6f\x4e\xd5\xb1\x74\xfe\xc7\x3c\x08\xc1\x13\x16\xc2\xf9\x50\x9e\x21\x6f\xce\x33\x05\x09\x1e\x84\xd2\x60\x35\x8d\x57\x7f\x59\xa9\x9b\xf3\x4b\x39\xc6\x5f\xf0\x20\x8a\x04\x61\xdf\x0e\xf0\xb3\x8d\x31\xbe\x95\x2a\x9f\x8c\x9d\x20\x4a\x04\x76\xb6\x29\x33\xaa\xa7\x3c\x88\x38\x32\xa4\xfb\x3c\x1e\x33\xac\x97\x65\xd5\xdd\x6b\x24\x13\x33\xb9\xbc\x67\xba\xd9\x9b\x85\xe7\x34\x34\xef\xb2\xed\x12\x2e\x69\x05\x83\x66\x7f\xc4\xea\x90\xe5\x93\x5d\x12\x0f\x58\x1a\x98\x7c\xe2\xe9\xe0\x16\xf5\xd8\xfd\x0a\x13\x31\xa8\x4e\xf0\xad\x0b\x91\x86\x4c\x33\x1e\xa4\x10\x12\x7c\x7f\xdf\x86\xd0\xf2\xdd\x78\xd5\x51\xb9\x6c\x88\xdb\xe1\x41\x8a\x21\x85\x29\xd4\x81\x6f\xa0\xce\xe4\x5f\x96\xdf\x79\xc0\x13\x8c\x3a\x58\xd6\x0f\xcc\x6e\x87\xb1\x4b\x20\x23\x4d\x88\xb4\x45\x56\x59\xe7\xd8\xbf\x67\x0e\xc1\x03\x09\xb1\xe8\x48\xb6\xf5\x0e\xe1\xe0\xae\xa9\x62\x03\xc7\x5a\xac\xb6\xa3\xfe\xa5\x98\x51\xd0\x2d\x49\xbd\x22\xf0\x8a\x4e\x33\x98\x07\x0a\x18\x85\x9e\x36\x84\x22\x10\x35\x45\xcb\xb7\x19\x34\x13\xac\xca\xb5\x34\x72\x77\xa9\x94\xca\xa1\x82\x2a\x0f\xe6\x0d\x4e\xc0\x7f\x3c\x50\x32\x24\xc6\xef\x63\x56\x34\x8b\x42\x8d\xb4\xe3\xe7\x69\xe3\x5d\x87\x40\x81\x51\xcf\xab\x5b\x2d\x9e\xaf\x25\x8f\xae\x50\x13\xfa\xe4\x1a\x0f\x50\x32\x5f\x38\x2d\xea\x81\x73\xf4\x3c\xc5\x61\x5c\x19\x75\x97\x50\x91\xf5\x59\xb2\x9c\x21\x23\x81\xeb\x66\xc8\x40\x8b\x18\xad\x27\x19\xad\xcd\xdd\x74\x16\x7a\x9e\x91\x8b\xa4\x0a\xcf\xbd\x5e\xe4\xf9\xe2\x61\x79\x91\x40\xe1\xa1\x17\x0b\x02\xee\x3f\x3c\xdf\xed\x29\xc6\x99\x83\xe6\xf3\xd0\x03\x4e\x71\x5a\xbb\x83\xb9\x85\x2c\x7f\x2c\x3b\xbf\xfd\xd5\x09\x77\xe5\x7d\x51\x9f\xb4\xce\x08\x80\x30\x80\xae\xf3\xd0\xf7\x03\xec\xe6\x77\x32\x67\x1f\x68\x61\xf3\x30\x48\x42\x2a\xd0\x6d\x32\x28\xdb\xff\x0d\xfb\x54\x18\x08\x13\x84\x19\xf7\xe0\xed\x4b\xf7\x77\x54\x94\x56\x7f\x84\xaa\xca\xe0\x0d\x97\xc6\xa4\x57\xf6\x98\x43\x1e\x86\x22\xa6\xec\xc6\xf6\x61\x71\x33\xea\xa9\x61\x28\x7d\xdd\x3e\xca\x1f\x7f\x1a\x23\x9f\x41\x09\x82\x87\xa1\x02\xd9\xde\xcf\x67\x86\x5f\x4e\x42\x8f\x87\x31\x8f\x7c\x03\x6e\x3d\x97\xa7\x86\x46\xe8\x28\x02\x0d\x63\x01\xc4\xcf\x6d\x5f\x8f\xdf\xee\xad\xba\x33\x65\x6a\x07\x52\xfb\xf8\xcd\xfb\x16\xfa\xf5\x2d\x8c\xd1\xa3\x77\x7f\x73\xb3\xbc\x00\x1d\x5d\x0e\xca\x30\x89\x23\x9a\xef\xbe\xae\x64\xdf\x78\x98\xa4\x02\x82\x1e\x6d\xf3\x7c\x6c\x46\x84\xda\x71\xf8\x12\xb2\xc4\xbc\x08\x17\xe3\x6e\x7f\x7f\x74\x77\xc6\x50\x51\xb2\xe6\xad\x82\xa2\x31\xbe\x3a\xeb\xd5\xfa\x8f\x71\x82\x9f\x87\x69\x62\x88\x52\xed\x2a\xd6\x4e\x12\xa6\xc2\xde\xa5\xfa\xdb\x06\xd2\x24\x34\x4a\x9b\xf3\xfc\xfe\xba\x59\x51\xb9\x71\x38\xd7\x87\x9c\x05\x4c\x75\x4e\xc3\xf4\xb5\xcc\xe2\xdc\xbd\x2a\x2e\x39\x4d\xe8\x9a\x60\x06\x8e\x81\x61\x0f\x82\x07\x29\x76\xa3\xa0\x36\x4e\xa6\xf3\x32\x77\x63\xf7\xc6\x5f\xff\xcb\x5d\x3d\x31\x12\x62\x86\x7f\xbc\x42\x51\x65\xf5\x15\xff\xee\xf1\xfb\x15\x51\x44\xb2\x3b\xed\x86\xa5\xac\xb2\x1a\xaf\x09\xcc\xda\xf6\x2a\x01\x42\x3f\x66\xf5\xef\x78\xfe\x46\xce\xfd\x93\xef\xab\x80\x91\x16\xd0\xcb\xf3\xeb\xd3\x6a\x1f\x3b\x6d\xe2\xa1\x7f\x39\x0f\x95\x40\x32\x0c\xea\x0a\xff\x86\x1d\x47\xbf\x6d\x6f\x35\x76\x4d\x51\x10\xe2\xc2\x71\x9a\x56\x70\x3c\xce\x71\xa4\x78\x88\x31\xa0\x70\x68\xd1\x7d\x81\x3f\x9b\xa9\x95\xcc\x78\xa2\x0e\x91\xc5\x04\xfc\x51\x59\x5d\x7e\x8d\x41\x2d\x3c\x44\x14\x04\x9f\xad\x41\x77\xe1\xed\x23\x14\xe7\x5f\xd5\x13\x9d\x27\x97\xbb\x84\x4e\x09\xe7\xb9\x79\x2f\x9b\xb2\xeb\x26\x1a\x84\x73\x26\x36\x82\x0d\xe3\xc7\x88\x3c\x16\x52\xf2\x6c\x63\xad\xca\x79\xe4\xa5\x31\x31\x2e\x6f\xb3\x42\x3d\x9e\x6f\xb3\xfa\x7d\xbf\x2e\x1a\xac\x6e\xa0\x92\xa5\x1a\x0b\xb8\xf2\xc8\xe3\x82\x6a\xdb\x3f\x6e\x97\xcb\xee\x0a\x32\xa4\x22\xbd\x5d\xdd\x36\x70\x6e\xa3\xaa\xf9\xd7\x12\xf9\x41\x28\x9c\xf0\x60\x81\xf9\x1e\x8e\x2e\x99\x12\xf9\x2c\x75\x68\xb1\xcf\x29\x37\xa8\x3d\x2a\xa8\x68\x66\xd7\x81\x1f\x65\xdd\xee\xb7\x76\xe5\x8f\xd2\xa9\xcd\x77\x0d\x15\x29\x5a\x7c\x65\x1f\x99\x71\x67\xa2\xf1\x34\x7a\xb5\x93\x7b\x92\x11\x98\xda\x38\x1e\xa1\x9a\x3e\x72\x90\xa6\x0a\x3b\xe4\x37\x12\xc6\xcb\xbd\xef\x28\x4c\x39\x6d\xd6\xf6\x7b\xf9\xee\x5c\xed\x7d\x77\x8c\xc7\xe8\xfc\x03\xad\x47\xf2\x06\x5c\xb1\x8f\x47\xa1\x4c\x49\x4b\xa6\xcc\x95\xe9\xeb\x93\x2e\x17\x45\xbe\x26\xc1\xa5\x23\x8d\xe6\xc7\x7a\x62\x48\xc4\xa3\x28\x0e\x2d\xe9\x9a\xd2\x69\x97\x71\xf4\xe8\x05\x46\x92\x51\xe9\x6e\xb1\xfa\x7e\xbf\x7d\x7e\xd9\xdf\x3e\xbf\xba\x05\x25\x8a\x19\xe7\xba\xcb\x8d\xb5\xe1\x71\xbb\x86\x4d\xee\x27\x4e\x0d\xea\x92\x40\x58\x8b\x42\xd1\x82\x6b\x1d\x74\x07\xff\xb4\xad\x93\xd4\x54\xf8\x75\x46\x13\x16\x16\xcd\xd4\x6d\xcf\x35\x04\x4d\xd0\x02\xb2\x0c\x51\x9d\xe9\xe7\x69\x2e\x0b\x10\xb1\x08\xa8\x5e\x68\x50\xd0\xa8\xdc\x46\x76\x72\x4d\xc6\x13\x5a\x20\xa5\x9d\xaf\xf7\x83\x68\x2c\x62\x32\xa5\xd4\x68\x37\xed\x7f\xe0\xc0\x2c\x77\xd2\x37\x18\x06\xc6\x95\x51\x6b\xa3\x7e\xa2\x32\x28\xbe\x63\x31\x2f\x7a\xc5\xa3\x54\x45\x84\xcc\x74\x4e\x46\xc3\x57\xc2\x03\xae\xed\x06\xa2\x53\xec\x33\x72\x0e\x9d\x7a\x47\xdc\xe3\x8b\xff\x77\xff\x69\x7f\x02\x3c\x60\x16\x14\xa8\x9e\xf0\x67\xf3\x05\x19\x99\xe8\xdf\x60\x73\xbf\xba\x92\x41\x8b\x80\xc5\x24\x27\xff\xb8\x7e\x78\x7e\xda\x2f\x9f\x9f\x76\x2f\x8b\x65\x37\x41\x80\x94\xc4\xc8\xe9\x71\x62\xdf\xb7\x4f\x97\x78\x68\xdb\x5a\xf0\x34\x32\xe1\xce\x90\x73\xea\xae\x25\x99\xe1\xe2\x5b\x27\xcc\xf2\x63\x83\x55\xdb\xdb\x2e\xbc\x8a\x78\x24\xc1\xb0\x83\x2c\xe8\x6f\x53\x65\x87\xb2\x7d\xf9\xa6\x14\x36\x2d\x27\x8c\x82\x48\x7b\x05\xe5\x85\x54\xc0\x6e\x37\xe0\x8e\xba\xf6\x5b\x77\x8c\xa5\xd6\x59\x3b\x3f\x37\x43\x11\x57\x1e\x69\xe5\x05\x89\xe3\xea\x13\x14\xd3\x80\xf7\xfe\xae\xb4\xdb\x3f\xdd\xc7\xd0\x68\x0c\xfe\x32\x35\x29\x2b\xf3\xd8\x0b\x3d\x29\xac\x31\x54\x0f\x4e\xbe\xf2\x81\x62\x2f\x91\xf1\x40\xa4\xab\x69\x72\x1c\x3a\x57\xff\x33\xe8\xed\x1a\x47\xff\xe9\x4e\x07\xa4\x24\x45\x7d\xcc\xb3\x66\xd6\xdc\x8c\xc7\x9e\x8c\xc2\x4e\x27\xf4\xb6\x42\xfc\x0f\x49\xc0\xf5\x15\xeb\x6b\x00\xf8\xf6\x54\x19\x0e\x20\xce\x1d\x04\x8f\xc7\xbe\x17\x10\xb1\xd8\x95\xc8\xea\xee\x40\x1c\x84\x83\x51\xb2\xd7\x17\x66\xd9\x3c\xf6\x55\xc8\x61\x92\x58\xbc\x2d\x2b\x8a\x56\x5f\x28\x41\xf5\x5e\x39\x04\x1d\x8f\x7d\x0c\x89\x73\x48\x40\xc4\xdb\xf2\x54\x35\xef\x3f\x10\x5d\x0a\x27\x0e\x3c\x49\x17\x83\xdc\xf4\x1f\x8a\xf4\x9f\x8d\xd1\x44\xd7\x86\x69\x8a\x46\xc5\xe9\xbc\x7d\x87\x7e\x92\x8f\x43\x16\x91\xa8\xf7\x11\x89\xab\xf8\xdf\x20\x3f\x8e\x65\x73\x5b\x56\xe4\xde\xe1\x5a\x45\x5e\x40\x22\x98\x2f\x54\xa5\xef\xff\x6a\xc2\xf0\x76\xba\xa2\x5f\x5e\xc1\xf9\xaa\x82\xb6\x3b\x27\x88\x89\x14\xb0\xfb\xe3\x8b\x64\x53\xa7\xab\x70\x1c\x85\xbe\x34\xee\x99\xe5\xc7\xe9\x68\xd7\x24\xb5\x3d\x56\x59\x83\xd3\xd7\x18\xa5\x06\x06\x99\xd5\xeb\x9f\xc7\x6c\xaa\x03\xc0\xe3\x08\x8c\xe5\x35\x69\x77\x0e\xd2\xa2\xc3\xea\xe1\xb5\xfb\x04\xed\x19\x0e\xfb\x27\x42\x7e\x93\x5d\x82\xdb\xfe\x22\xc7\x3a\xbd\x9e\x30\x18\xd3\xfb\xe5\xf3\x7e\x77\xbf\x7e\xd9\x3f\x2c\xb6\xbb\xee\x45\x4a\xe3\xce\x6c\x0a\xeb\x06\x1e\xdf\xed\xe2\xe2\xd8\x8f\x08\x90\xfb\x82\x6f\x6d\xc8\xe7\x68\x64\x3c\x8e\x51\xfa\x96\xcc\xf2\x98\x15\xd9\xe9\x70\x5f\x1c\x4f\xcd\x25\x37\x94\xc7\x49\x62\xd2\x3b\xed\x74\xf1\x54\x7e\xfd\xd6\xfd\x39\x34\x8a\xe5\x5d\xea\xb7\x5e\xb4\x2b\xda\x20\x99\x15\xb3\x50\xfa\xd4\x55\xe1\xe7\x7a\x60\x3a\x3d\x1e\xf2\x2c\x46\x19\x4f\xf5\x4e\xee\x57\xd3\xed\x7f\xf7\xde\xed\x2e\x3a\x4e\xbd\x94\x62\xde\x5e\x62\x44\xbb\xaa\x4a\x9c\x86\x11\xa1\x7f\x80\x0c\x51\x6e\x4f\xb9\xce\xf2\x7c\x68\xeb\x3e\x79\xc3\x3c\x30\xac\xfc\x23\xc8\x8f\xdf\x71\x08\x88\x71\xe5\x50\x1e\x73\xe6\xd1\xb4\x49\x33\x41\x8d\x0d\x99\xc6\x1e\xee\xa0\x1e\x01\xc6\x87\x3e\xce\xee\xc4\x34\xa4\x3d\xe0\xca\x48\xf7\xfe\xb2\xfc\xd9\xb6\x36\x32\x1e\x14\x56\xed\x8b\x72\x5f\xea\xfd\x72\xb7\x72\x4f\xc6\xa5\x50\xed\xb8\xd1\x8f\xa7\x79\xf5\x46\x1e\x73\x0c\x68\x8f\x96\xa3\x6e\x82\x78\xf2\x35\xc1\x03\x88\x9d\x0d\x48\x85\xb2\xfd\xfa\xcd\x43\x76\x98\x6e\xec\x63\x08\x14\x81\xe2\x73\x2c\xd4\x5d\xf9\x89\x55\xd1\xbe\xbf\xc7\x21\x6e\xc6\xb5\x4c\x03\x42\x34\x3c\x94\x6f\xd6\xa0\x86\x72\x72\xee\xa8\x60\x4e\xc5\xca\xec\x02\xe7\x92\x83\x31\x48\xec\x61\xe8\xc6\xa9\xfc\xca\x56\x6a\x3c\xe2\x45\x12\x32\x23\x67\xf6\x7c\x44\x32\x9c\x1c\x80\x98\x27\x1d\x4d\x26\x1e\x77\xfe\xcd\x8d\xa1\x73\xe2\xdf\xcc\x7b\xc5\xa8\x85\x15\x7c\x2c\xb0\xce\xea\xd9\xbd\x50\xac\xb5\x24\x3a\xe3\xe1\xbc\xee\xc1\x1d\xe6\x58\xe2\x25\x86\x77\xfa\xe3\xfe\x69\xfd\x0b\x1e\x11\x4f\x3c\x16\x12\x73\xba\xfe\xea\x51\x55\xe3\x0f\xdc\x3e\x46\xd4\xbe\x52\xd5\xc6\x10\xeb\x0b\x1c\xc9\xb4\x35\x2a\x4b\xda\x22\x0c\xd5\x25\xbd\x81\x27\x7e\x6c\xdc\xf0\xf1\x27\xca\x53\x83\x2f\xa7\x7c\x28\xf5\x39\x69\xab\x90\x7a\x97\x2a\x0f\x04\xe8\xb6\x52\x02\xe3\x99\x38\x09\x38\x92\xe5\x99\x84\x3a\x2b\x4a\x2a\x2f\x4c\x7e\x33\x80\x84\x80\x49\x1d\x7d\xf3\xe6\xfc\xba\x5d\x5d\x79\x86\x40\xc6\x3e\x76\x48\xaf\x9b\x73\x1b\x18\xc8\x77\x9c\xaf\xd5\xb9\x73\x94\x51\x87\x22\xc0\xeb\xe1\xd8\xe0\x3e\x0a\x47\x5b\xa7\x24\x64\x29\x05\x34\xed\x6e\x73\x5f\x9f\xc4\x95\x27\x8e\x74\x40\x23\xd2\x04\x58\xd9\x48\xcc\x7a\xb6\xa7\x25\x71\x20\x45\x27\x77\xdf\x85\x0a\xcf\xda\x55\xa1\xfb\x2c\x70\x12\x23\x38\x2a\x8d\x19\x1e\x43\x89\x28\x9e\x24\xa1\x4e\xa0\xe3\x1a\x6d\x5e\xd6\x66\x0d\x78\x5c\x6f\x77\x8b\xc7\x4d\xd7\x4a\x6a\xd9\xe5\xd2\x7a\xf4\x58\xb9\x30\x44\x50\xb7\x60\x27\x4c\x33\xeb\x9e\x5d\x34\x8f\x20\xdf\xb3\xe2\xa2\xd3\xcc\x2f\x41\x49\x1a\x73\x8a\xb4\xac\xd6\x4c\x57\x2c\x9c\xb4\x52\x20\x8c\x21\x48\x76\xbc\x60\xb1\x4e\xde\x11\x4f\x3c\x82\x30\x56\x08\xea\xbe\xd0\xe5\x1c\x6e\x66\x72\x13\xdc\x92\xfa\x69\x95\x3a\xe6\x50\x38\x2b\x12\x9e\x70\x04\xda\xbf\x53\x1a\xe2\x58\x95\x93\x1b\x03\x8f\x47\x56\xd9\x6c\x7a\x24\x08\x44\xda\xd1\x18\x8c\x49\x5b\x83\x47\xdf\x5d\x18\xd2\x84\x02\xe2\x3f\xac\xd4\x6a\xf7\x77\x44\x0a\x0f\x9c\x02\xb6\xa9\xdf\x9e\xda\xa1\xb0\xc3\xba\xbb\x2f\x21\x95\xf1\x4d\x81\x42\x95\x87\x1d\x69\x4d\x2c\x48\xa6\xa1\x6b\xa1\x85\xd5\x41\x37\x90\xcc\x6a\x7e\x99\x4c\xa4\xc7\x79\xfb\x6e\xff\x7d\xca\x08\x6c\xb4\xc8\x2a\x55\x95\xc7\xee\xdb\xca\x20\x31\xf8\xee\x93\x70\xc0\x6d\xab\xac\x33\xbb\x17\xb8\xdc\x99\x26\x32\xf4\x20\x72\x73\x30\x41\x0f\xe7\x07\xa3\x8c\x63\xda\xf8\xec\x8f\x95\xb3\x81\xee\x05\x16\xe6\xbe\x60\xea\x4e\x14\x46\xe5\x21\x93\x65\x1f\x0c\x27\x52\x1a\xb2\x63\x53\xde\x84\xc1\xc5\x5e\xc2\xdc\xe6\xf8\x55\x28\x66\x4a\xdb\x9b\x97\xf5\x7e\xfd\xc7\x7a\xf9\xba\xbb\x7f\x7e\xda\xdf\x2d\x5c\xa6\x2b\x51\x22\xa0\x12\x11\x21\xe3\x77\xe5\x0b\x42\x7e\x01\x8a\x76\x4d\xd1\xc4\xb0\xc4\x29\x5e\x55\x30\x24\xdb\xf3\x04\x7d\x4d\x71\x41\x26\x4b\xab\x4c\xe2\x0e\xc4\x31\xe9\xeb\x37\x58\x37\xc4\xd1\xaf\x5f\x90\x76\x75\xc4\xca\xa3\xff\xa2\xb2\xac\x6b\xae\x62\x7a\xc6\x43\x56\x74\x01\x83\x39\xc4\xbc\x30\xa1\xec\xce\xe2\xe5\xd1\x1f\xf6\x30\xe6\x85\x06\xb0\x4e\xf5\xb2\xba\x7c\xc4\xe6\xbd\x9b\x36\x98\x17\x71\x61\x45\xe2\x26\x13\x2b\xf3\x78\x4c\xa8\xd8\x3e\x46\x64\x9e\xf4\x8d\xf1\x2b\x64\x35\x92\x9e\xc9\x16\x51\x4d\xb4\x0f\xae\x70\x2f\x38\xf3\xbd\x80\x4a\x95\xbb\xaf\xf2\x76\x22\xd7\xc8\x99\xcf\x91\xca\x3b\xcb\x97\xe7\x1f\x2b\xca\x39\x6e\xbf\x2d\x5e\xd6\xdd\x61\x05\x04\x79\x23\x41\xf7\xd7\xed\x4a\xae\x77\xdf\xdc\xb1\x40\x48\x27\x14\xde\xce\x6a\xb3\x9e\x5f\x9c\x05\x98\x82\xea\xb9\xaa\xed\xac\x3f\xbe\xbd\x00\x81\xaa\xd0\xaa\x82\xb7\x2e\x73\xcc\x22\x2f\x24\x65\xfd\xed\xe2\xc7\x7f\xe3\x17\xa5\xfc\xce\x03\xb3\x51\xce\x22\x5f\x28\xe3\x50\x51\x3c\x8e\xaa\x0b\x2c\x66\x09\x31\x97\xf0\x21\x6b\xb0\x97\xff\xe2\x2c\xd6\x86\xf8\x69\xb6\x6d\x93\xdb\x60\x1e\x4b\x6c\x79\x93\xb8\xf1\x37\x7d\x35\x86\x31\xae\x29\x84\xb6\x65\x66\x93\xe4\x18\x16\xf9\x18\x83\x98\x8f\x85\x7c\xda\xad\xff\xcd\xa8\x26\xc2\xd2\x28\x70\x76\x5e\x46\xe1\x63\x51\xa8\xde\x99\xf8\x2f\xfd\xc9\xdc\x55\x62\x93\x7d\x6e\xe3\xf9\xaa\x33\xa9\xe1\x2c\x05\x4f\x59\xe6\x90\x91\x38\xcd\x20\x27\x01\xfe\x69\x16\x89\xf1\x58\x93\x74\xdd\xa9\xc6\xaa\x7e\xea\x62\x53\xc6\xdb\x77\x60\xa9\x53\x37\x55\x39\x7e\x42\x8e\xdc\xb3\x98\xd3\x3f\x9e\x7e\x77\xf3\x45\xd7\xa1\xb9\x8e\x9d\x89\xee\x5c\x86\x9b\x01\x97\x56\xfa\xb5\xee\xf0\x4f\x53\x1d\xfa\x59\x90\xff\x7c\x9f\x16\x1e\xd0\xd7\xfa\x51\x56\x1f\xc3\x4f\x2c\xfc\x48\x7b\x96\xe1\x6e\x57\xcf\x79\x59\x63\xce\x64\x2c\x48\x48\x36\x2f\x6b\xdc\x94\x65\xde\xd7\x19\x99\x44\x49\x9c\x0a\x97\x49\xa3\x45\x62\x0b\x4e\xdb\xe9\x4a\x8e\x88\x49\xed\x51\x6a\xb0\x2c\x72\x62\x50\x49\xac\xd6\x26\x22\xfb\x15\xe1\x61\x38\x87\x33\x15\x69\x5a\xe1\x6f\x9f\x5f\x9f\x56\xeb\x97\xed\x9e\xd8\xc9\xab\xc5\x6e\xbd\x9d\xf4\x57\x85\xd2\x9f\x48\x78\x5e\x65\xec\x5c\xfb\xe5\xf1\x27\xc2\x30\x55\xf6\x0b\x2f\x2c\x6d\x9f\x34\x17\x6f\xcb\xca\xd0\x4a\xe6\xdf\xa3\x96\x9c\x72\x5f\x06\x51\xb9\x2d\x73\xaa\x95\x7f\x9b\xda\xdf\xf0\xd4\x0b\xa5\xb0\x54\xd4\xd9\x7e\x99\x06\x21\xe7\xc9\x20\xad\x42\x4f\xec\xc7\xc1\xfc\x4e\x2b\x0d\xa2\x24\x19\x61\x85\x16\x5f\x40\xa8\x84\x42\x3d\x95\xf3\xab\x70\x1a\x70\x4e\xfa\x01\x2f\xa8\x6e\xda\x4f\xd9\xfd\xd9\x18\x4f\xd2\x5c\xdd\x5e\x65\x41\x68\xbf\x23\x54\x9d\x61\x40\xd7\x14\x52\x82\x46\xca\xac\x01\x85\xf9\x88\x70\xc6\xd3\x28\x42\xaa\x50\xbf\xe3\x4f\x77\x64\xfc\x12\xe2\x40\x92\x05\x73\x21\xac\x8b\xa3\x3b\x33\xd6\x3e\xd5\xd2\x5f\x30\x87\xf3\xae\x2c\xf3\x7a\x10\x87\xa4\x2c\x96\x3c\x74\x58\x91\x7e\x17\x9f\xa6\x36\x9b\xb8\xa1\x02\x66\x81\x3f\x9b\x6a\xb8\x83\x4f\xb9\x36\x69\x9a\xa3\x11\x82\xb1\x38\xf9\xf9\xf7\x09\x9c\x51\x8e\xb5\xfd\xdd\x1f\x65\x95\x2b\xe7\xbc\x79\x3f\x24\xa5\x0d\xda\x63\xea\x0f\xf3\xcd\x2b\xcb\x44\xf1\xa7\x2f\x5d\x78\x3c\x92\x56\xa6\x9c\xd4\x78\x4d\x08\x5d\x8f\x70\x3a\xa9\x08\xb4\xd3\x21\x7a\xfe\xc4\xea\x33\xc3\x2f\x03\xfe\x9a\x66\x34\x52\x11\x85\x9a\x75\x59\x7d\x53\xec\x9d\x7c\x07\xc1\x8d\x3c\x21\x61\x55\x6f\xb2\x79\x95\x20\x9e\x0a\x89\x54\xa5\x16\xd0\x48\xd2\x14\xa0\x8a\xf4\xc0\xc5\xc7\xb5\xd3\x31\xf5\x71\xda\x68\xef\x9c\x52\x22\x4f\xa5\x97\xd2\xcf\x2c\xab\xf3\xb1\x81\x93\xab\xb1\x97\xd5\x79\xf8\xf1\xa4\x1f\x3b\x8c\xe8\xa6\xac\x1a\x5d\xe6\x9d\x72\xe3\xa4\xb4\x98\x2a\xcf\xf7\x55\x87\xbc\x34\x4a\x70\xbf\xe3\xf9\xb2\x1a\x31\x9c\x35\x52\x85\x29\x18\xbe\xda\xb2\x3a\xab\xea\x7b\x86\x5f\x03\x14\xe2\x70\xcf\x94\xa2\x1f\x51\xb1\x63\xbb\x5b\xec\xf6\xcb\xe7\xd7\x27\x17\x64\xa4\x18\x70\x93\x73\x51\xea\x91\x50\x17\xbf\x40\x66\xa5\x3a\x62\xda\x6c\xe8\x64\x86\x9f\x68\x96\xb3\x5f\x32\x61\xdb\x73\x4c\xd8\x37\x40\xdc\xb0\x76\xcb\xe8\x0e\x27\x1e\x29\xee\x93\x62\xf8\xaa\x1d\x05\xf6\x08\xf7\x7c\x89\x24\xa3\x0f\xc7\xe3\x25\x65\x83\x73\x5f\xc6\x14\xa4\x1f\x3a\x77\x16\x77\x66\x10\x02\xe5\x7c\x2c\xde\x6f\xdf\xae\x99\x66\xa8\x8c\xa7\x1e\x1e\x00\xb0\x5e\x30\xcb\xd0\x5f\x27\x19\x2c\xd7\x19\x78\x20\x54\x2c\x3a\xf5\xfe\xfa\x94\xb7\x41\x23\x11\xcd\x6c\x83\x30\x02\x42\x85\xbf\x97\xb9\xb2\xfd\x32\xea\x8e\x25\x9c\x92\xca\x0f\xcf\xbb\xdd\x9f\x83\x95\x8b\x47\x09\x33\x23\xfc\x1d\x2a\x34\x4b\x68\xb7\x05\x5b\x34\xd7\xc3\x79\x1e\x25\x40\xbc\xa5\xcd\xfa\x65\xfb\xfc\xb4\x78\xe8\xc9\x85\x9c\x47\x29\x68\x36\x7e\xe5\x7e\xff\xca\x79\x12\x29\x1e\xf4\x21\xea\xa9\x92\xd8\xd9\x20\xbb\x78\x83\x27\xdc\x23\x9c\x30\xad\x08\xb3\x16\x0b\x9c\x33\x1f\xb9\xd9\x98\x12\x0a\xf9\x64\x7c\xd1\x86\x1d\x8f\xb3\xc0\x38\x72\x9a\x41\x3b\x55\xe8\x6d\x8f\x0b\x6e\x00\xb5\xb6\xac\xfe\x9f\x41\x7c\x3b\x04\x8f\x73\x16\x73\xca\x3c\x7c\x2b\x97\xef\xd9\x63\x56\xb8\xcd\x36\x67\xdc\x50\x21\x25\x14\x37\x15\x22\x99\x73\xd1\x6f\x44\xde\x7f\x99\x7f\xb9\x86\xe0\x53\xee\xd8\xcd\x5c\x24\x0c\x70\xaf\xf0\x70\x2c\x9b\x81\xd0\xc6\xb0\x26\xd0\x13\x47\x39\x67\x52\xd2\x96\xef\x08\xe7\x47\x37\x7f\xf3\x94\x49\x63\x8b\x6f\x0c\x07\xca\x91\xe8\xe2\xe4\x75\xa5\xca\x53\xc6\x25\xfc\x54\x7c\x3c\x75\xbd\x95\x07\x5c\x09\x47\x61\x6c\xa3\x6a\xb5\x3b\x1f\x71\x8b\xff\x3e\x61\x21\x71\x42\xcf\xe0\xed\x97\x51\xed\xe3\xae\x5e\x9f\xd6\xfb\x9b\xd7\xbb\xbb\x3f\xbb\x0b\xb1\x88\xd2\x2d\x84\xf2\xe8\x3d\x11\x87\x51\x32\xe7\xc2\x27\xd0\x49\x1f\xf8\x6f\xbe\x2d\xb6\xeb\x7d\xb8\xa7\x5c\x45\xd7\x4c\xfb\x54\x3f\x31\xf0\xaf\x15\xd6\xb2\xca\x8e\x17\xf2\xec\x9c\x43\x6a\xec\xa1\xcc\xf6\x75\x34\xe7\x70\xe0\x8a\x1c\xaf\xf6\x35\x0e\x19\xc9\x9b\xaa\x3c\x4e\xae\x22\x04\x1f\xce\xec\x63\xd7\x20\xce\x65\x22\x29\x40\xb5\x2e\x25\x93\x31\xac\xd2\xd0\x20\x92\x7e\xd6\x1b\xac\xbe\x95\xa7\xc9\xba\xc1\x95\x50\x26\x8c\xb7\x86\xee\xa5\x95\xa5\x9f\x0d\x31\xb9\x52\xa1\x1f\x59\x88\x3d\x14\x67\x87\xaf\x74\xf7\xa2\x53\x41\xf0\xbf\xef\x50\x15\xd9\xcf\xd1\xab\xd5\x18\x10\x7b\x56\xe1\x4f\x02\x1b\x9b\x60\xea\xd7\x79\x63\xf0\x44\x40\xe9\x2e\x85\x0e\x18\xb9\xec\xbd\xfb\x39\xf8\xa9\x4e\xd4\x98\x35\x67\x05\xcd\x57\xa7\xf6\x55\xdf\x2f\x9f\xfd\xae\x2d\x07\xd6\xc6\xe2\x8f\x8f\xcf\x03\x39\x6b\x92\x4e\xa2\x3d\xd5\x0e\xe1\x60\xb2\xb8\x8e\x10\x3e\x9b\xe2\x81\x40\x6b\x23\xee\x6d\xa5\xe6\x47\xf4\x0b\x08\x79\x4a\x10\xb6\x87\xf2\x6d\x53\xe6\xb9\x0b\x19\xc7\xf1\x0e\x84\xd2\xe7\xdc\x4e\x96\xed\xdd\x0e\x5f\x14\x44\xb1\x59\x45\xb0\x50\x54\x2f\x1e\x7f\x50\x88\x40\xd1\x40\xaf\xdf\xcb\x53\xae\xbe\x75\x92\x59\xd3\x66\x52\x12\x4a\x78\xef\x14\x63\x88\x13\xd7\x8f\x57\x88\x3d\x9f\xfa\xdf\x16\x8a\x6c\x00\x72\x86\x38\x00\x11\x76\x1c\xc3\x8f\xc7\xec\xcd\x20\x55\x7b\x42\x34\x4d\x53\xab\x8c\xf6\x11\xdd\x59\x09\xa7\xb7\x42\xc9\x89\x36\xf0\x1c\x0d\xf2\x21\x0d\x97\x43\xcc\xc2\xd4\x86\x5f\x47\xac\x9a\xf3\xbd\xda\x95\x56\xdc\x71\xfc\xf5\x63\x61\x10\x63\xed\x6b\xfa\x96\xbd\xbd\x63\x6d\x77\xcb\x4f\x65\xb3\xfe\xd9\x23\xb3\x20\x91\x09\xcd\x11\xb7\x20\x1b\x01\xd5\x0a\xbb\x2d\x18\x24\x52\xa7\xc3\x78\x0c\x44\x8e\x64\x81\xde\x35\xc0\x80\x10\x1f\xdf\xb7\xbb\xbf\x86\xa0\x02\x8b\x8d\x4f\x51\xd6\xc6\xfe\xbb\xf7\x0a\xa1\x03\xff\x41\x6a\xbd\xcd\xda\x50\xd3\xe9\x1f\xbb\x43\x18\x10\x60\xf9\xee\xf9\x61\xf5\x0f\xf7\x47\x9e\x18\xe7\xcb\x07\x7c\xb3\xbd\xb7\x3f\xa2\x29\xb5\x51\x43\x8e\x56\xcf\x60\x1c\xca\x01\xf8\xa9\x79\x2c\xaa\x32\x9a\x1a\x4c\xff\xd0\x10\x1b\x95\xb2\x02\xbf\x56\xa5\xbc\x48\x28\x0f\xe7\x21\x10\xbe\x71\x79\xae\x0f\x90\xe7\xcb\xe1\x4d\x0b\xe0\x72\x2c\x99\x38\xe9\x63\x02\x95\x81\xfb\xc1\x07\xee\x35\x62\xbd\xc7\xe6\x7d\xaf\x9c\x88\x27\x07\xe9\x85\xce\x14\xcc\x49\x2a\xf5\xe0\xc5\xeb\x7e\xc7\x1c\x24\x87\xd4\x12\x5d\x2d\x4b\x7a\x40\x24\xe7\x80\xc0\x3c\x43\x24\x57\x99\x3e\x2f\xb1\x9c\xdc\x98\x0e\x13\x4a\x2b\x1a\x5b\xbe\xc1\x6f\xce\x2f\x3d\xa0\x21\xa4\x31\x75\x84\x73\xcf\x78\x9a\x6d\x2a\xbc\x40\xd1\xfa\x52\x63\x63\x2c\x84\xf2\x4b\xd9\x0e\x5b\x64\x9b\x6a\x06\x0e\xfe\x15\x06\xff\x8c\xfe\xdf\xe4\xbf\x52\xf7\x0b\x71\x2a\x2c\x3c\x90\xa2\xf8\xec\x3f\x78\x07\xf5\xf1\xb2\xc2\x21\xfc\x38\xa5\xcc\x34\xd9\xb8\x38\x0d\xb1\x7a\x68\xfe\xcf\x45\x10\xa6\xa4\xdb\x42\x64\x3c\x4b\xa8\xd3\x99\x71\x78\xfe\x96\x15\x6d\x94\xb6\xcb\xde\xde\x9b\x1b\x9a\x6a\x46\x97\x0f\x62\x08\x4c\x9a\xab\xfc\x79\xbe\x71\x15\x8d\xf1\xab\x16\x61\x62\x28\x93\xbb\xff\xbe\xed\x8d\x1e\xb9\x88\x40\xd0\x7c\x70\xe8\xc9\x71\x7b\xd9\x41\xf0\xf7\x9f\x81\x6b\x18\xfb\x61\x24\x07\xa4\x0d\x47\x48\x99\x4c\x7b\x22\x4e\x7c\x1a\x5c\x24\xa3\x51\x95\x1f\x5d\x38\x2b\x62\x9e\x48\x36\x00\x46\xbd\x40\xb7\xd3\x13\xb1\x88\xa5\x55\xbe\x20\x41\xdf\x0c\xae\xd4\x17\x45\x2c\x23\xda\x2d\x14\xa5\x42\xeb\x79\xe1\x42\x6d\x91\x04\x8c\x3c\x82\x0d\xe7\x8f\xf8\x3b\xc6\x77\x61\x34\xab\x8b\x04\xd0\xb0\xc1\xf3\xbc\x77\x88\xee\xde\x48\x22\x7c\x6e\x26\xb3\xc3\xd1\x95\x30\x06\x50\x73\xc1\x94\x4f\xa5\x03\x02\xa2\xdc\x96\xd5\x0e\xea\x8f\xc9\xf7\x66\x2a\x22\x88\xb5\xf5\xc5\x29\xcb\x46\x18\x03\x5f\x7b\x1c\xc2\xc0\xc9\xcf\x75\x9c\x75\x9b\xe1\x1d\xbf\x4c\x48\x91\x92\xe2\xd6\x3e\x0d\x6a\xa3\x68\xe5\xae\x23\x62\x46\x10\x12\x13\x70\xdc\xc1\x01\x8d\xa8\x4f\x7e\x51\xe6\x75\x27\x24\x3e\x31\x6f\xbe\x21\xe4\xcd\xfb\x12\xea\xf7\xc7\x3e\x28\x10\x92\xa7\x4e\x15\xcd\x10\xe7\x36\x90\x15\x0d\x2a\x42\xdb\xd4\x43\x87\x0e\x77\x82\x4c\x62\xe1\x8c\xa8\xf0\x42\xd3\xb0\x6b\xa5\x5d\x66\xe6\x07\x54\x6d\x50\x77\x1e\x3b\xf0\xfd\xb2\xf8\x23\x94\xc7\x8c\x22\x68\x8e\x60\xe5\x7a\xba\x6f\xa5\x82\x68\x64\x93\x32\x9f\x37\x11\x4a\xfa\x4e\xa8\xdc\xe4\x5a\xbe\x41\x7d\x67\x54\x71\xae\xbc\x28\xa5\x12\x42\x6c\x5a\xe5\xc1\xd5\xe6\x01\x8d\x58\x84\x5a\xe4\xf9\x0a\x1c\x3a\x52\x20\x67\xa4\xbf\x7c\x07\x59\x71\xc0\xaa\x36\x11\xcb\x2f\x33\x55\x42\x87\x7e\xea\x84\xb8\xad\x5e\xed\xb0\x5c\x31\x5f\x6b\x16\x3a\x35\xe0\x9c\x1a\x9b\x1f\x59\x81\x83\xc4\x60\x1f\x2b\x08\x0d\x8c\xb2\xd1\xa4\xb7\xb0\x3e\x96\x72\x5e\x66\x95\x4b\xcf\x37\xe6\x2f\xed\xa6\xf3\x5e\xb5\x03\xce\xba\x0c\xfd\xe6\x1a\x70\x0f\xbc\x81\xbd\x51\x6e\xf6\x56\xa3\x2d\x8d\xbb\x37\xe9\x43\x48\x55\x59\x8b\x02\xa5\xf9\x61\x0a\xae\x92\x3e\x48\x4a\x2e\x0d\x52\x7e\x04\x59\xff\xc5\x46\x5d\x06\x11\x10\xbc\x64\xef\x90\x85\x56\x7f\x67\xd2\x2a\x09\x89\x7d\x71\xb4\x69\xdd\x76\xca\x1c\x22\x3e\xae\x7c\x8e\x61\x12\x42\xb6\xfb\x3b\x6b\x3a\xb0\xc1\x09\x9b\x52\x86\x3e\x0f\xed\x4c\xbf\x3d\x82\xc4\x36\xaa\xef\x2b\xd9\xfe\xa4\xc7\xca\x90\x33\x23\x84\x7c\x20\xd2\xc1\x6f\xdd\x9f\x8d\xb4\x42\x7b\x95\x2c\xff\xc4\xea\x57\xfe\x0f\x5c\x86\x2a\xa4\xf5\x9e\x0a\x62\x66\x5f\xe6\xae\x14\xa5\xcc\xc3\xb1\x64\xea\x38\xec\x90\x71\x60\x6a\x50\x0a\xb2\xde\xef\xbd\xfd\xb3\xf1\x75\x7c\xc3\x5e\x06\xd4\x94\x35\xd6\x16\x3b\x99\xba\x96\xb1\x44\x63\xdc\xe8\xcc\x9b\xb8\x8c\x99\xa0\x4d\x70\x76\x38\x96\x55\xe3\x16\x80\xa1\x86\xc3\xfc\xee\x40\x26\xcc\x08\xc0\x53\x99\xb9\xfa\x20\x87\xfa\x66\x08\xc2\x94\x49\x6a\x8c\x1a\x44\x59\x55\xe5\x17\x56\xe6\x79\x6f\x33\x68\x8c\xd8\xfc\xf0\x21\x12\x1e\x18\x0d\x31\x13\xba\xdd\xd7\x4f\x65\x73\x4b\xb2\xc9\xb7\xa5\x3d\x71\xf2\x2a\x13\x6b\xec\x8b\x07\xac\xde\xb0\x90\xe7\xc1\x56\x48\x32\xcf\x4c\xd6\xe5\x57\x21\x46\xa8\x09\xc9\x12\x65\x8d\x0f\xca\xfc\x5b\x9f\x21\x91\x8c\x99\x78\x6b\x2f\x4e\xe7\x4d\xb8\x9a\xf4\x46\xa6\x14\x4d\x1d\x7b\x33\x74\x6e\x4e\x55\x31\xbc\xfb\x34\xf6\xb4\x7d\x17\xf7\x0d\x1e\x7e\xcf\x8a\xa1\x91\x20\x97\x69\x8a\xb4\x71\x23\xf2\x7a\x97\xbe\x9d\x7f\xaf\x9c\x25\x34\x35\xee\xf7\x12\xf2\x5c\x80\xfc\x98\x2a\x19\x8e\xdb\x83\x27\xd8\xb0\x32\xf0\x52\x9e\x9a\xac\x78\x1b\x62\xd9\x26\xf3\x04\x40\xa8\x82\x7e\x63\x3c\x1e\xf6\x00\x40\xe6\xd4\x87\xac\xd8\x54\x78\xe9\x13\xc6\x25\xa0\xe1\xff\x7d\x4d\x9f\x63\xfe\x79\x04\xf8\x04\x53\x79\x3c\xe5\xbb\x0a\x46\xf3\x91\xd4\x09\xf9\xd2\xd6\x4d\x05\xe3\x99\x4a\x25\x1e\x71\xa3\xda\xc0\x87\x70\x9b\xdb\x7e\x57\x21\x29\x7f\x3b\xb8\x81\x15\x7e\x12\x8d\x72\xfc\x94\x18\x98\xa2\x54\x8d\xcd\x03\x82\xbe\xa8\x03\xbb\x66\x10\x3b\xf1\xff\x15\x42\x3e\xa0\x95\xff\xd7\xe9\x9a\xa5\x3e\x97\x5a\xfa\xa9\x4d\x53\xd9\xbd\x11\x4d\x1d\x8b\xe9\x2c\xa6\x35\x27\x61\xc8\x1c\xea\x66\x5f\x19\xd3\xed\xd9\xc9\x5b\x79\xc2\xa3\xa8\x79\xa1\xd4\x23\x54\xe4\xa8\x3a\x35\xc4\x9d\xbb\x7f\xe5\x47\x8a\xf2\xc5\xc5\xe9\xf0\xac\x6d\x96\x34\x3b\x74\x88\x4a\xe5\x4b\xa4\x2a\xd8\x50\x99\xba\xc3\xad\xfe\x3f\xd7\x48\x45\xa2\x57\xa1\x38\x36\xb8\x0f\xd2\xee\x02\xe8\x51\x51\xca\xe6\x21\x89\xad\x3b\x5b\x2f\x1a\xdc\xe9\xec\x6a\xa7\x7c\x1d\x2b\xde\x45\x36\x1b\x03\xf1\x5c\x1b\x59\xb4\xf9\xaf\xa3\x02\xdf\xeb\x38\x0c\x6f\xf8\x0d\xf3\xe3\x20\x83\xd5\xaf\x91\x2a\x50\x1e\x71\xff\xb7\xc7\x3c\x6b\xfa\x6c\xab\x0a\x23\x33\xe3\x65\x75\xbb\x9d\xce\x8a\x37\xa3\x17\x71\x6b\xb7\xe5\xaa\x6b\x27\x25\x33\x0b\x71\x95\x61\x6d\x65\xc3\xed\xb1\x98\xa5\x38\xc8\x39\x90\x90\xd0\x95\x32\xb7\x3d\x23\xf1\x8c\x8a\x91\x91\xe7\xc7\x4b\xa7\x41\xae\x12\x3f\x89\x9d\x53\xe8\x57\x81\x6a\x2e\xbc\x57\x89\x0f\x7e\xdb\xd1\xef\x0c\x8c\x63\x0b\x1a\x9d\xdf\xdb\xb8\x21\x0b\x53\x8a\x3e\x56\x19\x38\x79\x21\xae\x18\xf3\x8c\x58\x6b\x53\x65\x6f\x6f\x58\x6d\xbe\xaf\x0d\x08\x77\x7c\xb3\x69\x14\x87\xbe\xcb\xb8\x5a\x76\xe3\xef\x59\xf1\xa6\xca\x43\xd7\x89\x52\x11\x10\xef\x44\x5a\x3d\xcd\x3e\xc2\xee\x4b\x94\x8a\xc7\x29\x5a\x39\xbc\xd7\x76\xd1\xb9\xd0\x00\xe3\x0a\x3c\x9f\x10\x80\x46\x1e\xc3\xa6\x1d\xa8\x93\x04\x9e\x6b\x12\xb0\xb0\xff\xe2\x54\x95\xcb\xc0\xd5\xb4\xee\xf5\x13\x4a\xac\x6b\x98\xb8\x26\x70\x05\x51\x9a\x80\x95\xef\xc8\x20\x5f\xcb\x32\x2f\xdf\xce\x2e\x11\x30\xba\x07\x96\x50\xca\x61\x05\x59\x7e\xee\xfd\x75\xb9\x02\x30\x08\x4f\xe7\xdc\x66\xa1\x35\x33\xc1\x89\x02\x40\xe3\x17\xb1\xfc\xb6\xdf\x22\xb4\x2b\xa7\xb3\xa0\xe5\x0a\x24\x0f\x64\x87\x14\x6d\x97\xe4\xec\x98\xe3\x90\xc8\xe0\x1a\x2a\x63\xf6\x47\xab\xc2\xb3\xbe\x32\x04\x84\xaf\x8d\x78\xac\xb3\xfb\xbf\xae\x9f\xc5\x95\xe0\x8a\x58\x72\x6f\xa4\x00\x61\xca\xe5\x24\xa3\xd5\x27\x90\x1e\xca\xb7\xcc\xb1\xd5\x95\x50\x26\x1b\x74\xfb\xba\xfb\xc3\xfd\x4d\x32\x4d\x90\xe7\xf5\x77\xc7\xd1\x53\x0a\xb4\x30\x68\x3e\x2b\x58\xf0\xcb\xb2\x8a\x42\x1f\x09\xda\xf8\xed\x74\x3a\x1d\xa0\x70\xce\x6c\x7f\x13\x19\xa9\x50\xa7\x1c\x1c\x3a\x3c\x6b\x96\x79\x59\xf4\xf3\x99\x0e\x8c\xb6\x34\xd5\xb7\x4a\x6b\xa8\x53\x56\x13\xba\x20\x7a\xca\x20\x41\xde\xb0\x79\x28\xe5\x48\xe9\xdc\xb6\xf0\x39\x70\xa7\xbe\x65\xba\x89\x29\xa5\x0f\xa2\x3f\x97\x50\x18\xcc\xfc\x18\x46\x1e\xf5\xcf\xe7\xd5\x50\x24\x8b\x63\xc8\x31\x9e\x18\x4a\x19\xbd\xa8\xc9\xa0\xc6\x48\x43\x62\x23\xc6\xd7\x5a\x6d\xb0\xfa\x7d\x06\x22\x8d\xb1\xe7\xa7\x36\x74\xfd\x41\x8e\x9d\xd3\xe3\xb1\x66\x56\x71\xd8\x6a\x20\xed\xca\xc7\x01\xf8\xce\x35\x83\xd8\xb3\x13\xfb\xb6\x80\x0f\x3c\x80\xf1\x13\xfb\xb7\xbb\xed\x24\x15\x1d\xb2\xd7\xf7\x26\x9a\x2e\xc8\x42\x8f\x1b\x76\x33\x55\x34\x47\x0f\xcc\xb8\x64\xbd\xe0\xa4\xb2\x99\x9b\xe9\x05\x64\x2a\xfb\x2d\xd7\xcb\x40\xa5\x67\x7e\x63\x88\x0c\x91\x64\xb1\x0b\xfc\xda\xbf\x0d\x04\x36\x26\xcd\xd2\x34\xa2\xba\xca\x11\xce\x2f\x17\x1a\x2e\xc8\x23\x46\x78\xa5\x8f\x4c\x7e\x3c\x9f\x2c\x0a\x72\xf2\x66\x78\x0c\x4e\x08\xfe\xba\x40\x11\x82\x2f\x22\x2a\xa1\x80\xd6\x39\xee\x6f\x69\xcb\xde\x2d\x1b\x08\x21\x23\xd1\x91\xc3\x59\x67\x72\x00\x05\x42\xe0\x62\xb0\xd5\xbc\x69\xa4\x9d\xc0\xbe\x0d\xa4\x30\x27\xef\x61\xf4\x04\x20\x0d\x57\xf9\x11\xdf\xe0\x07\x34\xcd\xb4\x7b\x83\x0a\xe8\x87\xad\xcd\xe3\x6d\x59\x2d\xf3\xb2\x9e\xa4\xa8\x50\xc4\x91\x81\x1d\xfd\xa4\x93\x97\x0f\x4f\xba\x2a\x0f\x66\x09\x7c\x84\x8f\x6b\xe3\x17\x45\xcc\xe9\xa9\x75\x0e\x4d\x27\x9d\xcc\x51\x7a\x31\x81\x91\x3b\x84\x9a\xeb\xe8\x4f\x65\xb3\x2e\xc8\x34\xae\x6b\x1a\x1a\x5c\x9e\x09\x31\xb7\x47\x2c\xd4\x0c\x22\x1c\x25\x46\x94\x3d\x32\xb3\xca\xa3\x51\x68\x18\xc6\x9c\xc6\x72\xec\x13\x1a\xdc\x0c\xcd\x96\xec\xe9\x18\x1a\x67\x8c\x2e\x10\xcc\xb4\xc6\x0e\x0e\x35\x13\x27\xa0\xf6\x91\x0a\x32\x26\x17\x37\xe7\x5d\xc1\x51\xc7\xa6\x74\xdd\xbc\x1b\x54\xb6\x7d\x26\xed\x79\x1e\x61\xa5\xb6\x37\x77\xc3\x81\xa0\x3d\xdf\xcc\x48\x92\x5c\xd3\xf3\x47\x12\x84\xec\x0e\x06\x01\x2d\xe1\xed\xca\x2b\xa0\xb6\xaa\xf3\x64\xc3\x75\x38\x42\x0f\xda\xd4\x5e\x18\x13\x02\x5b\x9c\xb2\x5c\x3d\x66\x39\xd6\x4d\x59\xfc\xc5\x68\x69\x4f\xa2\xe0\x4e\x42\xa5\x08\xed\x3a\x39\x2c\x35\x6d\xd1\x4c\x2f\xb4\xb9\xdc\x1f\xef\x58\x6c\xe0\x54\x5f\x57\x4d\xfb\x75\xee\x46\xfb\x49\x4c\x96\x8f\x66\x2b\xe4\x44\x1d\x47\xa3\x4b\xfb\xe0\x13\xa6\x64\x43\xd6\x28\x37\x90\x0f\x0d\xc8\x67\x16\x2e\x1d\x80\x24\x44\xb4\x42\xd9\xbd\xbb\xd0\xf3\xa4\xa9\xe8\xb7\x5f\x95\x34\x87\x86\x04\x7a\x1d\xa6\xc6\x10\xdf\xca\xdc\xb6\xe1\x88\xd3\x7e\x9f\x04\xa6\xee\x04\xd0\xda\xf2\x1f\xa7\xbe\x13\x83\x08\x41\x47\x0c\x23\xdf\x15\xb6\x56\xf8\x89\x79\x79\x3c\x58\xb1\x81\x31\x06\x5f\x47\x68\x04\xf1\xdb\xf8\x7e\x53\x95\x3a\x6b\xba\x23\x3a\x26\x38\xd8\x1e\x9b\xf7\x11\x85\x45\xc7\x29\xa7\x7e\x34\xaf\xd2\x54\x41\xf7\xfc\x09\xc7\x08\x7b\x0b\xb3\x1f\xef\xe5\xcd\xe9\x2a\xd7\xe3\xff\xfa\x6f\xfb\x5b\x2c\x8e\x48\x5d\xfe\xa1\x7c\xdb\x62\xe3\xb6\xa8\x66\xcc\xce\x4e\x12\x9a\x61\x90\xc6\x9d\x1f\xdb\xfa\xa7\xc4\x91\x25\xc1\xb8\x3f\x30\x04\xa9\x07\x49\xcd\xec\x8a\x91\x08\xd7\xa9\x27\x93\xb8\x63\x11\x51\xa0\x79\xb8\x98\xe1\x75\xea\x0b\xaa\x1b\x36\xd9\x81\x32\x43\xe5\xc9\x16\x0e\xdd\xbb\x4b\x13\x5f\xf8\x53\x9d\xec\xfb\xe2\xb3\xcc\x06\x0a\x4f\xa3\xaf\x9e\xa6\x11\x81\x7d\x6e\xee\x9f\x9f\xee\x97\xbd\x43\x26\xd7\x29\x18\xb6\x4d\xfb\x91\x07\x28\xe8\x17\xab\xb2\x3b\x94\xa9\xd3\x29\x44\x18\x58\x46\xfc\x72\x80\xcd\x1c\x02\x74\x35\xf8\x26\x7c\xdc\x90\x53\xe9\x06\xaa\x1c\xff\xb3\xac\xca\x2f\xd5\x7b\x38\x72\x0d\xa9\x8c\x8d\x0b\x91\x91\xdb\x18\xfb\x14\xb8\x46\x3c\x24\xd5\xdf\xf7\xf2\x54\xe3\xef\x88\xc7\x3e\x1e\xd7\x20\x05\x1a\x8e\xff\xb3\x20\x83\xf5\x6a\x7a\xb2\x94\x64\xfe\xf3\x88\x55\x3b\x01\x37\x13\x13\xe4\x19\xc5\x4c\xae\x45\xc2\x13\x8b\xfa\x22\x05\x30\xa3\xef\xe3\x7e\x52\xb0\x88\xa4\xe2\x89\x82\x97\x1d\xf0\x01\x75\x37\x20\x64\x24\x28\xf1\x32\x24\xe2\xcf\x92\xf0\xe7\xfb\x85\x4c\x0d\x55\xf4\x0d\x1b\xe3\x40\xbd\xa8\xaa\x6b\x0a\xef\x6e\x5f\xab\x25\xb0\x84\x77\xf9\xd5\xa9\xe5\x24\xd7\x52\x84\xbe\xb6\x30\xb0\xbd\xe5\xc9\xbb\xfb\x55\xca\x8f\x0d\x82\xe9\x01\xdf\xb0\x0d\x60\xcf\x9b\xc1\xee\x69\x72\x7b\xe8\xf9\xb4\x60\xef\x5d\x1a\x66\x2f\xce\xc6\x50\xf4\xda\x78\x1d\x64\xca\x34\xfa\x5e\x64\xe2\x2c\x05\x75\x97\xc4\x1b\x2e\x32\x98\x18\xdb\x84\xd5\xee\xdb\x50\xfc\xec\xe2\xaa\xd7\xf7\x06\x1a\x45\x4a\xd3\x69\x1b\x28\x0c\x84\x33\x34\x22\x12\x3b\x5e\x67\x79\xfe\x78\x26\xff\xa4\xc9\x68\x43\x2d\xb8\xad\x21\xac\xa0\x81\x7d\x18\xfd\xd6\x1f\xd1\x36\x8a\x22\x95\xf1\x2b\x89\x81\xae\xb5\xa2\xc4\xba\x51\xd4\xa1\xe7\x6b\x7b\xc9\x40\x00\x4c\xeb\x08\x94\xd1\x1e\xaf\x66\x75\x04\x46\xaf\x4d\xa7\xc8\x6d\x0a\xd7\xf4\xdd\xe7\x53\x13\x4c\x3e\xb1\x4e\x35\x95\x65\x6e\xb0\x59\x14\x37\xdd\xcf\xf0\x48\xd8\x74\x7d\x3b\xed\x96\x45\x87\x1e\x5e\xcc\x7f\x61\xf0\xbc\x38\x25\x85\xd3\x6e\xa8\xfd\xe6\x0e\x80\xaf\x23\x57\x94\x34\xf5\x87\x2e\xe2\x00\x2f\x08\x62\xaa\x8e\x0b\xcc\xcb\xe2\xad\xde\x95\xb3\xf3\x1e\x78\x41\xc8\xc1\x96\x7d\xcc\x1e\x7c\x88\x75\x06\x2f\x88\x3d\xca\x66\x69\x37\x99\x59\xe1\x91\xe1\xc3\x82\x17\x88\x44\xda\xfe\x7c\x3c\x35\x38\xee\xf3\x57\x53\xe6\xbf\x5a\x19\xc0\x0b\xb4\x01\xff\x9b\xe5\xfe\xbe\xfe\x8e\x55\xa6\xb3\x21\x12\xaa\x7f\xd8\x30\x30\x6c\x59\x7b\xc8\xed\xda\xc0\x0b\x99\x56\x26\xeb\x5a\xe8\xac\x3a\x6c\xb0\xd2\x28\x9b\x76\x06\x3d\xf6\xa9\x45\xf0\x22\x4f\x7a\xc6\x51\x8d\xbe\x46\x56\xbc\x39\x81\x57\xd7\xc0\xe7\x04\x11\xea\x14\xbc\xc6\xf7\x1a\xe9\x34\x10\xfd\x8a\x39\xe7\x46\x00\x5e\x1c\x30\xba\xc6\xfd\xe1\x08\xb2\xe9\xca\x8d\x93\x46\x3a\xa6\x89\xd5\x2c\xdd\x34\x39\xd7\x90\xcf\x46\x3b\xe0\x25\x81\xa2\x8a\xd5\xfa\xa7\xd9\x13\xfa\xbe\xbb\xdf\x44\x71\xea\xf1\x56\x49\x6d\x57\xd2\x5e\x0f\x7b\x41\x7d\xdb\x8e\x45\xa9\xf3\x33\xec\x92\x30\xeb\xe6\xbd\x93\x85\x76\xd7\x63\x2c\x82\x0e\x8c\x99\xe7\xb7\x88\x5b\x09\x39\xcc\x4b\x70\x83\x97\xfa\x01\x05\x80\x79\xd6\x18\x83\xbf\xee\x83\xa4\x32\x86\xd0\x79\x17\x58\xcf\x17\x57\xb5\x9c\x3c\x1d\xf7\xfd\xd4\x86\x21\xf4\x74\x77\x15\x5c\x3a\x3f\x99\xfa\x7a\x30\x29\xbe\xbb\x2b\x48\x16\x18\x93\xf0\xcf\x3e\xa0\x06\x0f\x62\x23\xdf\xb6\xfe\x17\x54\xd9\xcb\x29\xef\xbb\x0b\xc4\x9a\x96\xae\xde\xaf\xee\xba\x07\x39\x78\xc2\x4b\x52\xe3\x81\xfe\x96\x15\x77\x5d\xe6\xae\x3d\x20\xc3\xa4\x53\x42\x5d\x61\x4d\xc6\x51\xa8\x5e\xf0\x58\x56\xcd\x53\xb9\x7d\x2f\xbf\xba\xdf\x14\x02\x68\xb3\x64\x13\x4f\xb6\xf8\xbf\x6c\x3b\xec\xdb\x28\x47\x4e\x4d\xb9\x83\xf4\x1b\x47\xe4\x39\x78\xde\x20\x61\x0c\x9e\x62\xc6\x5b\x49\xf4\x5e\x19\xab\xe7\x1f\x4f\xee\xc7\xd1\x37\xc9\x6a\x35\xd0\x76\xa3\xc2\xc7\x9c\x54\xc1\xe4\xf1\x51\x1b\xda\xa3\x53\xc5\x5f\x2d\x76\x6b\x77\x5d\xed\x85\xdc\xb8\xf0\xfe\xa4\x02\xde\x78\x52\xd1\x61\xca\x8c\x65\x4d\xdd\x18\x21\x82\x15\x7e\x2e\x17\xbb\x0b\xd9\x24\xf0\x74\xcc\x94\xd7\x0f\xe0\x1f\x73\x5e\x87\xe0\x69\x30\x6b\x3c\x65\x89\xc7\x7b\x56\xf0\x3d\xe6\x51\x65\xa1\xc0\xaf\xb1\x9b\xec\x7f\xcd\x15\x20\xc1\xf7\x35\x23\xce\xbb\x80\xe2\xc3\x0d\x28\x3f\x08\x8c\xcc\xe4\x6d\x56\xbf\xb7\x07\xae\x45\x0f\xae\x79\x1a\x53\x6d\xcc\xe1\xb0\x4c\x90\x68\x12\xb2\xae\x09\x72\xd4\x8e\x8b\x39\x26\x8a\x8c\x5f\xb4\x1f\x26\xa6\xe2\x5c\x11\x1e\x7f\x6a\x63\x03\x7e\x14\x99\xd9\xef\xf7\x93\x2a\xeb\x9b\xf6\xe6\xc6\xe7\x47\x4c\x11\x70\xb1\xa9\x40\x21\x59\x36\xba\x7d\x22\xf8\x91\x64\x81\x1d\x8f\x86\x05\x6e\x30\x0e\xf3\x37\x12\x61\x28\x82\x61\xd5\xb5\x50\xe6\xf3\x8d\xb3\xc8\x93\xb3\x92\xc0\xd4\xc4\x36\x39\x34\xe5\xd1\x61\x99\xc1\x67\x69\x48\x44\xcc\x5b\xac\x0e\x63\x48\x66\x7b\x4c\x52\xa9\xe5\xd8\xee\xdf\xdc\xdf\x64\x40\xd7\xa1\x8f\x4c\x59\x0f\xa2\x70\xaf\x8b\xb7\x81\xd7\xd7\x4c\x04\x02\x7e\x2a\x24\xea\xce\x70\x60\x02\x69\x07\x9f\xfb\x9c\xb2\x8c\x87\x8c\x32\x1a\x57\x1e\x03\xfc\x90\xc2\x18\x9d\x35\xf5\x08\x75\x38\xf5\x8c\x00\x1f\x00\x28\x09\xb8\x9f\x96\xaa\xec\x71\x11\x28\x1a\x1d\xb2\x3c\xac\x06\xc8\xcf\x5f\x2f\x88\xbe\x88\xc2\x98\x77\x9e\x99\x26\x25\xe4\xde\x8d\x48\x02\x97\x6f\x33\xe9\xe3\xdf\x46\x2f\x40\xf0\x98\x16\xf9\xa1\xd8\xdf\xa4\xf3\x4f\x05\xbe\xae\x74\x6c\xa1\x52\xb0\x28\x8d\xd3\x71\x6c\xfb\xef\x66\x34\x5f\x31\xe6\xf7\x4e\x8b\xdf\xb2\xcf\xae\xcf\xa3\x88\x4d\x1e\x1e\xb3\xdc\xff\xed\x32\x01\x05\x3e\x2a\x61\x90\x09\xef\x50\xe1\x43\xbb\xf1\xc1\x79\xe9\x77\xf0\xd1\x3a\x8c\x3e\x96\x9f\x68\xf8\x70\x7f\x95\xe2\x05\x5f\xfb\x11\x91\xd3\xb6\xeb\xe5\xeb\xcb\xcb\xb3\xbb\x2f\x9d\x44\x84\x9b\x5c\x34\xe5\xe1\xf5\x8f\xee\xaf\xc8\x0c\x36\x99\xe6\xe2\x53\x85\x2b\x22\x8a\x4f\xe5\x1c\xc6\x77\xa5\x75\x4c\xe1\xbb\xcc\x33\xad\x77\x08\x07\xe7\xe8\x9b\xf7\xe2\x34\x10\x04\x7e\xe2\x7a\xa4\x9b\xae\xc8\x33\xcc\x18\x65\x5c\xf8\x14\x40\x10\x44\x86\xdc\x6b\x53\x2a\xb2\xc9\x3e\xb3\xe6\x3c\xf7\xc4\x17\xb7\x14\x04\xa9\xe6\x93\xf0\xb7\xb6\xbf\xd6\xdd\x0f\x1a\xc8\x76\xdd\x90\xaf\xab\xfb\x73\x18\xfa\x81\x33\xc1\x73\xa1\xc8\x64\x7a\x0d\x42\x69\xac\xe0\x51\x65\xcd\x42\x5d\x51\x80\x1c\xff\xcb\x78\x17\x0c\xfb\xdd\x48\x1a\x21\x72\x57\x56\x3e\x2d\x30\x26\x02\x7c\x26\x31\x25\xbb\x90\x8c\x1f\x30\x0a\x22\xb0\xaa\x4b\x9b\xfb\x7d\x7b\x23\xfb\x20\x18\x8d\x80\x20\x12\x1e\x21\xc9\x86\xa9\xef\x89\x07\xd4\xe4\xad\xc5\xcc\xe8\xa6\x9a\x84\xc0\x0b\x7e\x62\x71\xc2\xc9\x0f\xc7\xd2\xa3\x99\x77\xf7\x9e\xd5\xeb\x9f\x86\x1a\xb4\xa8\x6b\x3c\x88\x6e\xb1\x0b\x62\x85\xa1\x1c\x06\xd8\xa3\x54\x0e\x04\x49\xa0\xe3\x74\x20\x19\x45\x95\xe0\x99\x59\x2c\x48\xc2\x98\x52\x55\xa7\xc2\xe9\x8b\x18\x5b\xde\xee\x42\x49\xe2\xcc\x00\x7b\x3c\x49\xd7\x81\x12\x19\x50\x72\xc9\x89\x2d\xc1\xa9\x46\x2b\x7a\xd4\x07\xd2\x41\xa2\x3c\x32\x77\x27\x09\x71\x39\x8c\x74\x47\x51\x7b\x17\x70\x05\xe9\x4c\x99\x1a\x82\x04\x85\xd3\x79\xdb\xc0\x19\x71\x00\x4a\x80\x20\xd1\x06\xd1\xb2\xbc\xbf\x7d\x71\x7f\x63\x51\xe4\xa0\x9f\x8f\x65\xd3\x75\x4b\x06\xc2\x1f\xb8\x8e\x75\x55\x99\xee\xb8\x14\x56\xaf\xa3\x69\xb0\x9a\xd2\x54\x26\x1f\x34\xf5\x34\xc6\x8e\x77\xf9\x0d\xea\xc5\xa9\x29\x7b\x1d\x4b\x08\xd2\x48\x11\x22\x05\x7f\x1e\x33\x13\xe5\xf7\xa6\x35\x10\xa4\x32\x25\x01\x18\xd3\x19\x7f\xff\x73\x39\x8c\x58\xdd\x52\x12\xf0\xd0\xa7\xc8\x8f\x5c\xb9\x47\x23\xc6\xa8\x10\x5f\xd9\x02\xd9\xb3\x81\x33\xda\x84\xde\x75\xc8\xd9\x91\x44\x24\x04\x00\x09\xa9\x2d\x81\x52\x2f\x44\xc3\xbf\xcd\xde\xde\x9b\x60\x85\xd0\xcc\xab\x9b\x41\x20\x82\x98\x2a\x73\x77\x58\xac\x7f\x36\x3f\xb0\x3d\xa1\x4b\xd9\xa6\xae\x11\x8b\x8c\x8e\x16\xd6\xcd\x4d\xd6\xd4\xed\xc2\x0e\x59\x4e\x5c\xc7\xe7\xe7\x1b\xf7\xf3\x42\x68\xc9\x06\x5d\xf5\xf5\xe5\xfe\xa6\x9d\xd4\x46\xdd\x54\x7a\x11\xc9\x58\xbe\xc1\x01\xef\x32\xdd\x3c\x17\x12\x87\x4e\x67\x10\x28\x26\x88\x61\x74\xaa\xb1\xda\x9e\x44\xc7\xa3\x98\xab\x31\x43\xa0\x52\x16\x58\x2f\x3e\x2b\xcb\x14\x74\x17\x4a\x65\x9a\xf6\xb8\x32\x6c\xef\x43\x36\xa8\xb6\x4d\x29\x3f\xb6\x58\xa8\xab\x5c\x21\x08\x94\x44\xbb\xef\x35\x24\x95\x0f\x2c\x88\xdb\x3a\xfd\xa4\xa1\x17\x18\x45\x8a\xbc\x7d\x73\xb4\x09\x7f\xc8\xc4\x6f\xee\x60\xc2\x09\x2f\x42\x6a\x52\xab\xc5\x6e\x31\x7a\x17\xa1\xa7\x22\x2a\x47\x98\xba\xf3\x2a\x73\x44\x38\x08\x7d\x3f\x76\x1d\x7e\xe8\x54\xeb\x8e\x4a\x1d\xc0\xa0\x24\x4c\xd3\xd5\x0b\x64\x1d\xcb\x18\xc2\x20\x94\xdc\x79\x4e\x1a\x75\xbb\xf1\x25\x82\x34\xa4\x18\x9b\x8a\xbc\x5b\xba\xce\x07\x2e\xcb\xc3\x01\xa7\x62\xec\x10\x86\xa1\x04\xa3\x19\x74\x7e\x3e\x35\xd3\x83\x2c\x4a\x2c\x62\x60\x83\xc5\xdb\x29\x2b\xea\x9b\xf3\x88\xd2\x63\x1b\x46\xc2\x54\xbf\xba\x54\xd4\xe4\x42\x31\x4b\xdc\x43\xb9\x59\xda\x4f\xdc\xe3\xc4\x5c\x49\x3b\x0b\xde\xb4\x6b\xc0\x00\xd0\x05\x61\xac\x62\xc2\xbd\xaf\xa0\xfc\x76\x12\x23\x94\x3d\x84\x09\x4b\xd5\x10\x87\x64\xfc\x4d\xcf\xdd\x32\x35\x97\x18\x86\x30\x51\x01\x05\x0f\x6d\x2c\x79\x3a\xee\xca\x79\xed\x76\x08\x13\xad\x48\x28\xfc\xf6\x44\xa8\x91\x05\xd5\xd6\xf1\x82\x44\x39\x39\x8b\x45\x7e\xdc\xd7\x97\x36\xe5\xf1\x94\x97\x13\x3c\x2e\x84\x29\x58\xb9\x0c\x1a\xc9\x77\x93\x1c\x2b\x84\xa9\x02\x61\xdf\xd7\x03\xea\x66\x59\x96\x6d\xf0\xdf\xee\x20\x06\x1a\x94\x10\xa6\xda\x38\x43\xec\xa0\x1e\x9a\x93\xb7\x07\x90\x00\x16\xcb\xb2\xa8\xb1\xb0\x1a\x49\xa5\x03\x38\x43\xc8\x03\xed\x19\xe7\x32\xbb\xd9\xef\xc8\xb4\x10\x72\xc6\x29\xc9\xbe\xbc\x79\x1e\x5d\x93\xa7\x09\xda\x5e\xb7\x5b\x3c\xdf\xab\x79\x39\x3b\x08\x45\x62\x5c\xe1\xa8\x94\xf1\x0d\xea\x01\xe6\x0e\x42\x19\x7a\x84\x3f\xb0\x1a\x02\x5d\xa5\x0f\x42\x29\x74\xe7\xe6\xf4\x9e\x1d\x49\xe9\x76\xb4\x8c\x85\x52\x25\x94\xb0\xb8\xc3\x66\x45\x41\xdf\xea\x79\x37\x24\x58\x0f\x52\xeb\xd0\xc6\x0f\x68\xfc\xa0\x4f\xf5\x6b\xde\x54\xe0\x7e\x47\x05\x21\x98\x49\xb1\x59\x17\xdd\x90\x52\x4c\x31\x53\x2c\xe8\x22\xbe\x2b\x8f\x87\x9e\x49\x2b\xf5\x4c\x85\xba\x33\x0d\xea\xe0\x4d\x10\x62\x18\x1a\x1e\xa9\x59\x73\x67\x75\x76\x26\x57\xd6\xa9\xa4\xf8\x77\x71\xc0\xe6\xfd\xdc\xb3\x22\x21\xd4\x22\x21\x42\x58\x1b\x45\x90\xac\x24\x34\xb8\x71\x53\x61\xe4\x31\x26\x78\x07\xee\xfe\xe6\xd8\x52\x10\x05\xbe\x22\x4c\xfe\x11\xde\xf0\x36\xcb\xaf\x78\xac\x40\x14\x20\x3a\x35\x2d\x23\x6f\x37\x23\x6e\x05\x51\xe4\x01\x91\x72\xbf\x20\xcf\xdb\x9b\x1b\x76\x8e\x28\x4a\x8c\x13\xcb\x80\x98\xd5\x89\xa3\x40\x14\xf1\x90\x96\x7d\xcb\xe9\x1a\x2f\xaf\x51\xa4\x02\x12\x0c\xf8\xcc\xf0\xcb\xa4\x0f\xeb\xee\x10\x7a\xa4\xcf\x69\x85\xf4\xbb\xbd\xd7\x6d\x59\x39\x75\x21\x88\x12\xcf\xd8\x0f\xd5\x16\x97\x00\x33\x34\x93\xc9\x13\x27\xb1\xa2\x5a\x7e\xbb\x44\x1b\x35\x40\x4a\x7b\x75\x57\x04\x16\xda\x2b\xde\xc1\x01\x9d\x28\xd7\xe4\x85\x24\x18\xa5\x36\xf4\xbc\x7b\x58\x8c\xfa\x6a\x94\x60\x22\x47\x26\x59\x88\xf7\x05\x75\xfa\x31\x5c\xa1\x6d\xa9\x9c\x23\x1b\xed\x6e\x57\x65\xb3\xca\xb4\xce\xe4\x29\x6f\xce\xd3\xb6\x1a\xc9\xca\x07\x6d\x46\x6f\x57\xda\xdd\xf7\xfc\x77\x65\xb1\x2f\xbd\x2e\x8c\xb5\x45\x6d\xda\xb6\x1a\x32\xdf\xcd\x69\xfa\x03\xcc\x8a\xf4\x2a\xcc\xe1\xfc\xad\x3c\xf5\x5f\x82\xf1\xd0\x19\x8f\x3e\xc2\xcf\x2d\xca\x53\x95\x35\x67\x92\x4c\x35\x2c\xe5\xc9\x85\x54\x1a\x27\xbd\x2d\x72\x1b\x92\x8e\x36\x35\x51\xea\x4b\x4a\xb7\xad\x90\xcc\xf1\xba\x80\xe9\x2f\xc1\xd6\xff\x97\x5a\x23\x44\x29\xef\x68\xdd\x44\x2a\x9d\x45\x44\x42\xc4\x13\x9f\x3e\x7c\xbb\x72\x2a\x7d\x2a\xe4\x20\x1f\x15\xf1\xd4\x23\xab\x67\x97\x94\x9c\x51\xf8\x80\x88\x73\x4d\x7c\xb1\xad\xb1\x80\x5a\x28\xf5\x3c\x1f\x47\xf7\xf7\xc6\xa5\x12\xb1\xc3\x0d\xd9\xe4\xe3\x64\xc1\x88\x20\x08\xa8\x00\xfe\xf8\xc7\xd3\x85\xdf\x31\x44\xc0\x12\xfa\xd0\x02\x65\x79\x20\xfe\xc6\xf6\x58\x16\x1d\x5b\xaf\x6d\xc0\xa8\x68\x9f\xd5\x2f\xd0\x64\x3a\xbb\xb8\x6d\x48\x91\x46\xe8\x16\x9b\x26\x2b\xde\xea\x2d\xfe\x5a\xc6\x0a\x22\x11\x63\xc0\xad\x08\x2f\xf4\x59\xde\x48\x79\x8c\xbe\xfc\x27\xbe\x67\x32\xc7\xf5\xcf\xa1\x22\xd6\x30\x42\x8a\x54\x60\x22\xda\xbb\xf2\x20\xfa\x5c\x4f\xa4\x83\x94\xc0\xc8\x59\xfd\x5a\x63\x75\x5f\xdc\x55\xe5\xe9\x38\x0b\x2b\x86\xd8\x0f\x13\xe1\xc8\x0c\x2e\x95\x3c\x41\xc1\x4f\xcf\x88\x3c\xaa\xcd\x74\x8a\x9d\xed\x74\x32\x3d\x65\xf6\x89\x63\x9f\x27\x68\xe1\x56\x07\x3c\x54\xf8\x6f\x65\xc1\x56\x57\x9a\x0b\x23\xcd\x93\x9f\xe4\xc7\xd9\x22\x4f\x8d\x82\x88\x6b\xa0\xfd\xc4\x86\xfc\x2b\x38\x0f\x8d\xe9\x20\x0e\x12\xee\x88\x74\x6d\xc4\xfe\xac\xed\x4a\xee\x5e\x73\x1c\x46\x3e\xa4\x9d\x39\x2f\xfc\x7c\x2a\x07\xa9\xf6\x38\x8c\x12\xca\x7e\x5b\x68\xe2\x20\x5d\xfc\xb7\xc7\xd1\x2f\x27\xd0\x38\x8c\x19\xcd\xf7\xed\x6b\x7c\x3d\xfe\x2d\x06\x0e\xc4\x11\x53\xd2\xda\x4c\xdf\xcb\xf2\x1b\x54\xaa\xb3\xb4\x83\x38\x4a\x4d\x7f\x22\xde\xdb\xba\xdb\x87\xd1\x9c\x38\x94\xc8\x80\x38\x0e\xcc\xce\xfb\x1b\x56\xe5\x53\xa9\x86\x10\x31\x88\x19\x0b\x13\xed\x24\x42\x06\x1a\xb2\x10\xf3\xd8\x08\x83\x51\x59\xe4\xa6\x3c\x39\xd3\x94\xcb\xfb\x04\x1e\x26\xbd\x04\x0c\x6d\x73\x46\x93\x57\x0c\x42\xc7\xca\x04\xcd\x07\x2c\x9a\xbd\xd9\x48\x4c\xa7\xf6\x58\xf8\x9a\x74\xe0\xc5\xe9\x1c\x7b\xee\x36\xa4\x07\xcc\x99\xe5\xad\x8c\x7a\xbc\x3b\xc2\x90\x26\xdf\x1f\x4f\x4e\x9e\x19\xe2\x36\x9e\xe2\xa3\x0f\xd9\x69\x4b\x93\x80\xef\x08\xde\xf8\x37\x3f\xa5\xbb\xb4\x60\x64\x3f\xa1\xb3\xaa\x6e\xc6\x39\xaa\x18\xa3\x28\xed\x74\x8a\xda\x0e\x38\x31\x60\x87\x18\xb9\xa4\xa5\xa8\x73\x6b\x58\xc1\xb9\x5d\x18\xda\xad\xc6\x70\x7f\x19\x23\x18\xa3\x75\x5b\x1f\x34\xbc\x8d\x6b\xf6\x64\x2e\x7c\x8a\x75\x08\xe4\x95\x7d\xb7\x78\x5c\xef\xd7\x4f\x2b\x77\x63\x3a\x0d\x89\x6e\xfd\x85\xed\x54\x36\xd8\x14\x25\x5e\xc0\x52\x63\x0a\x2c\x31\xfb\xa4\x02\xd6\xe8\x79\x13\x4f\x31\x8a\x08\x6f\x9e\x17\x2f\xab\xbd\x8b\x9e\x92\x00\x82\x28\xe9\x32\xec\xf5\x85\xaa\x15\x24\x91\x97\x24\xa9\x23\xd0\x3c\xb5\xf1\x80\x94\xa7\x63\x36\x21\x79\x43\x12\x45\xa1\xf3\xcb\xb1\x13\xca\xae\xbc\x28\x70\x8d\x3f\x42\x12\x71\x99\x74\xce\x54\xed\x57\x1d\x61\xce\xc6\xfd\x32\x89\x03\x41\xfa\x7f\xf5\xe9\x70\xb8\xc9\x72\x51\x56\x6d\x2f\x76\xb7\x19\xa7\x71\x67\x8c\xb0\xad\xe4\x3f\x06\x29\xc2\x5f\x0e\xcb\x24\x4e\x35\x69\xee\x88\xac\x6a\xde\x37\x58\x7d\x3b\x15\xaa\xea\x5f\x6c\x22\x45\x88\x9d\x05\x21\xf1\x06\x9d\xa1\x65\x6d\xc0\x3a\xb6\x21\x03\x49\x19\xde\xc7\xfb\xcd\x72\x12\x1f\x26\x69\x60\x0c\x16\xca\xe2\xef\xe8\x00\x40\x92\x86\xa9\xb6\xd9\x9f\x7b\x3d\x40\x60\xb5\x47\xcc\x1b\x1b\xd5\xe8\xc6\x1f\x22\x55\x11\x49\xf8\xe4\x99\xc4\xa2\xc6\xa7\x5b\x37\x9c\x12\xae\x8d\xcd\x38\x54\x15\x18\x71\x9a\xc9\x96\x3f\x01\x10\xce\x06\x6a\xdf\xc6\x23\x17\x3e\x10\xc3\x51\x90\x88\xd0\x17\x8e\xd7\x4f\x92\x7b\xbd\x19\xcf\xd3\x29\xcf\xad\x86\x47\xd3\x75\x25\x01\xc2\x51\xb7\x9e\xf0\x67\x33\x52\x31\x9d\xbc\x01\x19\x1b\x79\xf1\xe5\xcb\xf3\x76\x71\xff\xb2\x27\xf7\xbf\x97\xfb\xa5\xab\xb3\x25\x2a\x95\x34\x9f\xd9\x04\xd8\x0b\xca\x77\xa8\x9c\xcc\x1a\x24\x4a\x23\x38\xb8\xc1\x80\x0b\x30\x54\xf6\x9d\x14\x0e\x27\x0a\x1f\x90\xa0\xef\xd3\xbe\xc0\xee\x61\x6c\x21\x7a\xca\xce\x1c\x9d\xa1\x85\xe7\x1b\x1d\x4a\x67\x3e\xae\xdd\x0d\x69\x96\x50\x98\x63\x32\x36\xeb\x63\x56\x97\x0a\xe7\xe0\x90\xc0\x3c\x25\x68\x87\xfe\x2d\xab\xf0\x6e\x28\x6b\x07\xcc\xf7\xa2\x20\x18\x30\x35\x4d\x7a\xe9\xb6\xac\x7e\x60\x36\x9e\x7e\x99\x1f\x9b\x84\xe6\x3f\xbe\xb2\xa1\x6e\xd7\xdf\x5c\x08\xed\x45\x02\x3f\x21\xc8\x31\x0d\xfe\xdb\xbc\x84\xa6\xc7\x49\x5c\xe0\x44\xa6\x96\xbc\xc0\x02\xe9\x63\xea\x10\xcb\x17\x10\xf6\xd9\xbe\xcf\xc2\xc4\x53\xba\x5f\x5d\x3a\xdd\xa9\xc9\x9c\x39\x11\x5e\x6b\xcf\x0b\x3d\x57\x34\x47\x38\xcc\xf6\x58\x16\x6a\x23\x95\x65\x4c\x73\xeb\xac\x2c\xf6\x55\xbf\x3f\x67\x51\x2a\x7c\x93\x71\x3b\xd5\xa8\x06\xba\x09\xc0\x22\x19\xd3\x46\x45\x66\x4d\x86\x75\x6f\x28\xdb\x1e\x41\xaa\x78\xd2\xca\xba\x84\x23\x6d\xd0\x4e\x55\xf3\xfe\xd8\xee\x57\x7b\xed\x3f\x60\x71\x14\x53\x49\xb7\xc9\x9a\x7c\x94\x19\x66\x71\x62\x8c\x9a\x6e\xd6\x8b\x5d\xf7\x37\xc1\xa9\x37\x29\x3c\xe6\xe5\x79\xdb\xe0\xb1\x83\x10\x01\x4b\x54\x4c\x51\x80\xab\xb3\xcd\x79\x0d\x02\x4b\x63\x83\x39\xa8\x90\x14\xbe\x1f\x4a\x09\x79\x1b\x33\xf4\x89\x07\x96\x2a\x43\x8b\xa1\x6c\x99\xff\xfc\xbb\xfb\x3b\xf7\x7d\xb4\x1b\x7d\x02\x28\xb5\xcb\xa0\xc9\x52\x9a\x81\xd0\xb5\x03\xae\xed\xce\x68\xf7\x73\x51\x6f\x8f\x58\x34\x17\x3c\xaa\xf1\x5d\x09\x15\xa2\x65\x0a\x7c\xa7\xba\xf7\xdb\x56\xbe\xa3\x3a\xe5\xb8\x2e\x9a\x2b\x52\x7d\xc0\xa4\x67\xd4\x61\xa9\x16\x62\xdb\x5f\xa9\x60\x30\x99\x40\x14\x74\x72\xe4\x26\x94\x1a\x8b\xb0\x01\x93\x52\xa2\x9b\xbc\xf6\x65\x61\x54\x50\xd7\xff\xbe\x2f\x1a\x57\xfa\x66\xca\xf3\x08\xe6\x90\xd5\xbd\xa6\xc2\x50\x8c\x75\x7c\x41\x15\x44\xe4\x33\xf2\x5a\xb8\xcd\xac\x2d\x93\xfe\x92\xc8\x0c\x4c\xc5\x8c\xfa\x24\x2d\x82\x2f\x50\xa1\x81\xbe\x5f\x79\x34\xc5\x52\xc7\x3d\x1d\x65\x90\xe7\xfb\xbb\x4a\x13\xb2\xd2\xac\x4b\xdd\xac\x30\xc7\x66\x12\xcb\x31\xf4\x7c\x42\x84\x2c\xf2\x06\x9d\x8f\xdc\x55\x8a\x32\x30\x4c\xb4\xea\x4a\xf7\x54\xc1\x9d\x99\x4e\x5d\x5b\x50\xaa\x73\xc7\x5a\x68\x9d\xe5\x19\x34\xb8\x5a\x75\x1d\x5c\xcb\x20\xb2\xda\x12\x37\x20\x3f\x70\xa2\xfd\xd2\x36\x60\xd2\x64\x70\xce\xe5\x89\x78\x72\xed\x13\x74\x03\x4f\x2b\x5f\x9b\x1d\xc9\xe1\x70\x7e\x3c\xd5\x99\x1c\x45\x2e\x4c\x6b\xa1\xa2\x89\x52\x42\x79\xd8\x1e\x31\x37\xaa\x08\xe9\x3f\xfd\x4e\x95\xc2\x9c\x92\x7a\xbe\xa6\x94\xbb\x9d\xf3\xaf\x39\x71\x5c\xab\x24\xff\x72\x32\x4d\x7d\xe1\xf1\x0e\xba\x4c\x0c\xfc\x6d\x03\xd5\xaa\x9f\x7f\xd2\x20\x61\x04\x96\x7f\x87\xda\x25\x2d\x17\xe4\x23\x3c\x7e\x31\x69\x00\x1e\x25\x19\xeb\x2f\xc4\x23\x69\x2e\x92\xf3\xa9\xbb\x4c\xe8\x79\x44\x37\x75\xd4\xac\x02\x0f\xe7\x65\x79\x10\x63\x84\x49\x1a\x06\x01\x21\x28\xb7\x8f\x8b\x87\x87\xf5\x76\xb7\x1f\x08\x05\x41\x1a\x46\x20\xa3\xae\x92\x55\x9e\x9a\xa7\xd3\xc1\x26\x82\xc6\x8f\x15\xb6\x71\x9c\x55\xbc\x24\xc8\xd3\xa0\xac\x96\xc6\x5e\x42\x93\xd8\xe3\xef\x7f\x0e\xd9\x3b\x90\xc6\x09\x23\x32\xf1\x22\x57\xd9\xb9\xec\x15\x79\x20\x8d\x99\x0e\x4c\xd9\x50\x9d\x24\x55\xc2\x7f\x20\x7e\x98\xd0\x7a\x76\x6a\x48\xe3\x34\x49\x0d\x40\x41\x37\xef\x8e\x50\x3d\xc8\xbb\xa6\x69\x88\x89\x75\x8e\xba\x6f\xf0\x30\xd0\xf6\x1b\x2c\x27\xe3\x57\x9c\x42\x4a\x39\x64\x4b\x3f\x86\xda\x42\x3d\x0c\x91\x7a\x9a\xe2\x4f\x39\x37\x56\xc7\xef\x50\x17\x0d\x91\xfe\xba\x7e\x9a\x82\x67\x02\x09\x52\xd9\xda\xff\x58\xaf\x7f\x0f\x86\xa6\x5e\x90\x42\x64\xb6\xd6\x6d\xa4\xdc\xee\xfa\x5f\x50\x42\xdd\xd4\x23\x34\xe6\xc5\x96\xa1\x7f\xc7\xa0\x12\x91\x74\xa9\xe9\x49\x57\x91\x41\x40\x03\xbc\x57\x23\x99\x76\x26\x15\x68\xea\x4c\x4b\x83\xc6\x35\xd3\xc4\xbc\x1c\x14\xa4\x18\xa4\xdc\xd6\xa4\x9e\xb2\xf7\x2c\x3f\xb9\x74\x6b\x8a\x51\x44\x25\x3c\x57\xa2\x5d\x96\x79\x59\xcd\x06\x38\x29\x22\x23\xaa\xd5\xd0\x43\x7f\x5a\xb5\xb0\x4d\x75\xe4\x93\x4e\xb5\x53\x96\x1a\xf5\x21\x1d\x9b\x9f\x6c\xa7\xf0\x76\xfa\xbe\xd2\x3d\x34\x37\xe5\x4f\xc3\x0e\x43\x65\x2c\xfe\xe6\xcb\xf5\x83\xbd\x5b\xaa\x05\xa3\x35\x76\xb1\xdd\xfe\x3d\x22\x5d\x7b\x8a\x29\x5f\x51\x00\xf1\x98\x0d\xd8\x9a\xc0\x3d\x2e\x3c\x0b\x8d\x76\x7d\x74\x92\x87\xe2\x7e\x10\x93\x3a\xcc\xd7\x7b\xb9\x38\xdc\xbb\x13\xfd\xd4\x08\x58\x1b\x1d\xcb\x8e\x0e\x3c\xc1\xfc\xf1\x20\x65\x94\x9a\x37\x2c\xc8\x6f\x67\x51\x65\x2a\xfb\xcf\x08\xb4\x39\x7e\x31\x3c\x0c\x03\x61\xc1\x9b\x36\x27\xfa\xfa\xf2\x30\x57\x81\xe7\xa1\xf2\x94\x4d\xd3\x0e\x70\xf5\xed\xdf\x35\xe5\x34\xde\xb2\xcf\x8b\x25\x63\xdc\x73\x78\xa8\x39\xe5\xf7\x0f\xf0\x73\x71\x3c\xf6\xa6\xe8\xc0\x23\x2b\xc1\x45\xc9\x1c\x33\xca\x1c\xa4\x60\xfe\x8b\xf2\x08\x19\xd5\x51\xff\xbc\xf9\x3e\xec\x10\x3c\x0e\x23\x42\x2e\x6c\x9b\x2e\xcf\xc4\x63\x6e\xdc\x88\x40\x29\xc3\x8d\xa1\xec\xc1\x4c\x8a\x9f\xc7\x28\xac\xf0\x1c\xf9\x97\x3a\xc4\xdd\xd5\xbb\x48\x84\xa0\xfe\x71\xa4\xcb\xae\x3f\x1d\xf3\xa0\x7b\x30\xc6\x0c\x73\xf1\xb3\xcc\x4f\x07\x9a\x43\x54\xaf\x79\xd8\x5f\x87\x71\x41\xbb\xfa\xed\x11\x65\x06\xf9\xcb\x8c\xa9\xe3\xfc\x8a\xc2\xd3\x24\x8e\xd1\xc1\x2d\xf3\xb1\x0e\x2d\xf0\x94\x87\xa4\xe3\xe3\x64\x1d\xe7\xe9\x40\xe3\x0f\x0d\xc2\x68\xa2\x9b\xfe\x79\x3f\x12\x0e\x05\x0e\xca\xe3\x51\x5f\xdd\x83\x0a\x28\x7d\x3d\xa4\xef\xbb\xa5\x94\x8b\x50\x3a\xff\xf8\x3b\x38\x90\xfe\xea\xfc\x43\x08\xee\xd1\x42\x43\xab\xcf\xfe\xf6\xfe\x65\xbb\xdb\xaf\xee\xb7\xa4\x4b\xba\x7f\x7c\x7d\xd8\xdd\x6f\x1e\xee\x9d\xd7\x3b\x70\x21\x21\xf0\x0d\xfd\x9e\xc0\x40\x68\xc8\x86\xdd\x53\x0b\x25\x28\x20\x5d\xfe\x3e\x58\x54\xb8\xd0\x66\x64\x65\xb2\xa4\x1c\x83\x83\xfc\xf7\x2c\xdd\xc8\x35\x95\x01\x23\x99\x12\x53\xba\xb6\x0c\x96\xc9\x27\x6b\x03\xcc\xc4\xa1\x87\x8f\xf9\x79\x79\x41\x59\x06\x2e\x53\x66\x18\x89\xf6\x65\x9d\x2f\x8c\xc0\x80\x2b\x4f\x13\xc4\xdd\x85\xf1\x06\x89\x38\x5f\xb9\xe5\x2a\x4e\x94\x0d\xfd\x6e\x32\x75\xaf\xba\x47\x56\xdc\x78\x9c\xc9\xf2\x70\x28\x8b\x5f\xaa\x5d\x00\x57\x10\x33\x03\x65\x3c\x5b\xfb\x81\xee\x32\x2a\x15\xc6\x1f\xc2\x76\xa4\x29\xf0\xdc\xb6\x43\x3f\x84\x0e\x6e\x63\x2c\xea\x8c\xf3\xe9\xa4\x19\x18\xed\xfb\x0a\x67\x28\x4d\x03\x56\x01\x70\x44\x93\x1e\xd9\x60\x53\x95\x23\x6b\x0e\xdb\x40\x47\x9e\x4b\x74\x53\xfd\xe2\x36\xcb\xf1\x21\x2b\x3e\xc6\xbd\x53\x47\xa9\x71\xe5\x1b\x22\x33\xdd\xb1\x84\x13\x1e\xc1\xa8\x78\x67\x6f\xe3\x09\xa0\x8f\x03\x26\x2f\x4b\xb3\x98\x38\xc6\x76\x4a\x30\x11\x64\x77\xcd\x34\xb2\x40\x8a\x76\x61\xed\xb9\xcc\xdd\xe9\xe0\x81\xa0\x3d\xe9\x01\xfe\x45\x89\x90\xdb\xb2\xea\x35\xb0\x00\x3c\xcd\x68\xc7\xf0\xb0\xbe\x5b\x3c\xec\xd7\x7f\x6c\xd6\x4f\xdb\xf5\x76\xbf\x58\xad\x5e\x1c\xb9\x1d\xc0\xb7\xd4\x5a\x63\x9b\xf2\x80\x9f\x8b\x42\xdd\xa2\x91\x95\xef\xe1\xac\xe0\x33\x4f\x1a\x27\x3b\x57\x3d\x1b\xa3\xad\xc0\x67\x3a\xe2\x63\x89\xb2\xf1\x7c\x01\xbe\x62\x6a\x50\x6e\xec\x87\xc6\xb3\x5e\xc1\xb9\x1e\x05\xd7\x10\xf8\x48\x8f\x66\x81\x33\xdb\x76\x3b\x62\x42\x55\xd7\x20\x34\xde\xda\x7b\x61\x4c\xcd\x9a\xac\xec\x9e\x29\x48\x43\x4a\x44\x4d\x15\x57\x46\x73\x11\x84\xe0\x27\x66\x5d\x78\x3d\xbe\x55\xa0\x70\x80\xcb\x87\x28\x32\x3c\x98\x37\x6c\xee\x8b\x6d\x53\x21\x1c\x26\x5a\x49\x00\x51\x1c\x10\x7a\x62\x4f\x35\xab\xf9\xf1\x00\x91\xd4\x1d\x1e\xc5\x94\xe5\x69\xcf\x3e\xac\x55\x40\xec\xa1\x29\xd7\x6d\x77\xd4\x81\xea\xec\xad\x3b\xa4\x23\x82\xea\xe9\xac\x50\x62\x42\xb7\x05\x48\xb8\xa4\xe8\xeb\x23\xcb\x73\x2b\xb5\xd7\xcc\x47\x3a\x90\x68\x03\xea\x7c\x2f\xbf\x1e\x4f\xf2\xdd\xba\x71\x39\x84\xc2\x6d\x59\xb9\xa0\xa1\x8d\x96\x08\xe7\xe3\x6e\x81\x85\x8c\xb0\x60\x65\x71\x0b\x59\x7e\xaa\xba\x77\x94\x26\x81\x9f\x8c\x28\xeb\xee\xb7\xeb\x61\xf6\x01\x52\xae\x51\xbb\x05\xf8\x09\xbf\xbe\x61\xae\xc8\x61\xe2\xca\x2b\xe3\x91\xb1\x88\xd1\x24\x17\x64\x51\x29\x96\x8c\x39\xfe\x02\x3c\xf1\x0c\xc7\xf6\xbc\x29\x8b\xff\x64\x93\xa3\x10\x7b\x72\x28\x5f\xdf\xce\x5c\x66\x06\x7c\xc1\x1a\xab\xcf\xac\x78\x7b\xfa\xab\x4a\x1c\x40\x22\x62\xe5\xca\xf7\x94\xc6\x57\xbf\xac\x81\x01\x28\x65\xd8\x15\xd5\xbc\xc9\x14\x80\x48\x53\xe8\x7d\xc2\xc7\x30\x6b\xdb\x44\xfa\x3a\x31\xce\x37\xff\xd6\x5d\x32\x05\x64\xec\x53\x16\xde\xb8\x9a\x9a\x0c\xdd\x78\x8c\x49\x61\xf6\xbc\xe4\x5a\x1f\x05\x93\xab\x92\x40\x36\x6d\xd7\x65\x26\xba\xd4\x32\x20\xf3\x99\xcd\xb1\xdc\x17\xc4\xfb\x3f\x11\xeb\xf9\x02\x7f\x0d\xc8\x8c\x0e\x44\xef\x97\x34\x36\xb3\x06\xd0\xa1\x22\x27\x7a\x68\x1a\x98\xd1\x95\x19\xbf\x08\x8d\x9e\x83\x46\x5c\x02\x2b\x85\x17\x87\x03\xfe\xc6\xfe\x38\x79\x1a\xe1\x71\xce\x79\x07\x34\x7b\x3c\x5f\xba\x5c\xd9\x86\x7e\x60\x34\x49\xd5\x7d\x91\x5d\x94\x0a\x06\x3b\x1d\xe1\x07\x82\x16\x8a\xed\x01\xaa\x66\xfb\xd5\x53\xc2\x44\x10\x1a\x37\xfc\x4b\x0d\x27\xdb\x20\xf4\x12\xea\xb3\x9f\x65\x1b\x93\xf7\x09\x30\x11\x7a\x92\xc0\x8f\xa0\xd4\xd0\xda\xe9\x74\x21\x45\xd4\x4b\xcb\x8d\xfe\x9f\xbd\x4c\xe4\x73\xda\x45\xed\xca\xb2\x39\x57\xc3\xd5\x4b\x44\x21\x92\x6c\xef\xa6\x22\xf8\x41\xb8\x5a\x6c\x36\x93\x37\x10\x25\x71\x1c\x4e\xd4\xec\xbb\xd3\x65\x12\x77\x1e\xbd\xab\xf2\x6b\x90\x7b\x14\x91\x14\x24\x43\xf3\xd6\xf9\x52\xb8\x03\xca\xa7\x0a\x12\x89\x0e\x5e\x88\xac\xf9\x57\x8a\xf1\x22\x96\xa6\x08\x57\x5b\x03\x94\x6e\xcf\x2b\xa7\x8c\x60\x10\xb1\x0e\x23\x8b\xaf\xe8\x85\xc8\xba\xf7\x1d\x6b\x45\x51\xdd\xea\xf9\xc7\xd3\x9e\x6e\xbd\x37\x53\x01\x91\xa4\x9e\xb2\x52\x82\x86\x94\x4d\xd8\x5f\x7b\x90\xa5\x29\x25\x61\x68\x9f\xf6\x82\xb5\x3c\x5d\xd9\xf8\x8b\xd4\x33\x66\x1b\x5b\xa2\x19\xb5\x33\xdf\x6c\x88\xdb\xb5\x56\x89\x25\xa3\x3b\x80\xc0\xf8\x2b\xa4\x81\xc1\x11\x7f\x61\xb6\xc1\xf1\x37\x4c\x43\xc1\x4d\xe9\x22\xcf\x0d\xb3\xcc\xeb\x0e\xa5\xc6\xb6\xf7\xfb\x7d\xd2\xfd\x09\x0c\x7e\xbb\x36\x11\xfd\x35\xf1\x96\xe9\xd3\x48\x8f\x80\xb6\xff\x53\x56\x55\xe9\xf9\xe3\xdf\x47\x1d\x5a\xda\xe7\x4b\x59\x1e\xea\xd9\x8d\xb5\x48\x35\x30\xcb\x69\xd9\x80\xfc\x80\xb7\x51\x85\x21\x89\xfe\x19\xda\xe4\x9c\xe0\x3e\x52\xc7\xc9\xb3\xe2\x63\x57\x1a\xc1\xfc\xb9\x4d\x91\xe0\x21\x10\x13\x75\x53\xe6\x50\x65\xf5\x6a\xfd\xc7\xff\xad\x94\x20\x78\xec\x13\xa8\x8f\x8a\x4f\xb7\xa7\x42\x5a\x16\xc4\x3f\x7d\xaf\xbb\x29\x1e\x3a\x48\xd1\xbd\x2c\x6f\xf0\x2d\x2b\x56\x17\x31\xb3\xe0\xa0\xa9\xf2\xb3\xc3\xba\xf1\x83\xf1\xfc\x2a\xda\x49\xc9\xa6\xad\x97\xef\xd0\x2e\x75\xd3\x54\x8d\x10\xa1\x09\x73\x1e\xe0\xa3\x7e\x3f\x64\xbf\xe2\xcf\x08\x91\x04\x91\x31\x5d\x6a\x70\xbf\xde\x7d\xeb\x74\xf3\xdb\x43\x21\xa1\x7d\x8f\x5d\x98\xb4\x2f\xf5\xbe\x19\xd4\xdc\x85\x48\x18\xb1\xce\x3f\x4d\x96\xbb\x97\xdc\xee\x1a\x08\xe5\x09\xc7\xf9\xa8\x09\xd5\x37\xfa\xea\x42\x05\xa4\x8d\x6b\xf5\xbb\x68\x55\xa1\xe5\xdf\x90\xcb\x27\xcf\xa5\x12\xda\x14\x37\x08\x87\x60\x74\x19\xe9\x49\x4a\xf4\x65\xf5\x06\xea\xda\x20\x58\x67\x37\xe9\x42\x32\x2f\xe9\x35\x90\xc9\x1e\x6e\x59\x76\xd8\x5d\xa1\x02\xe6\x3b\x3f\x55\xbb\x81\x9a\xdc\x84\x0a\x50\x04\xfd\xa6\xa7\x1a\x40\x9f\x26\xfd\x41\xc5\x2a\x89\x1d\x91\xf9\x5c\x4f\xaf\x23\x7d\xf2\x2c\x31\x40\x7d\xb3\xd1\x5b\x91\xa8\xd6\xa4\x7f\xa2\x54\xb4\x79\xde\x17\xf8\x35\x70\x69\xb5\x47\x35\x33\xe0\x5a\x93\xc1\x74\x62\xc7\x6b\xa8\x7a\x26\xc5\x70\x7d\xd1\xcc\x48\xda\xbe\x1b\xd9\xb3\xf1\x2d\xe9\xd4\x94\xca\x69\xa3\xef\x38\x02\xff\x4b\x5c\x96\xb9\x94\xf4\xbc\x88\x66\xb8\x03\xfc\xfc\x06\xf9\x27\x59\x16\xbb\x43\x31\x28\x07\x90\xd8\xfb\x7b\x2c\xea\x53\x85\xdf\xcb\x06\x7f\x94\xd5\x47\xbd\xcf\xac\xd7\x33\xa5\x81\xea\x9b\xb3\xef\xb9\x79\x48\xfa\x7e\x4a\x2b\x7b\x9d\xbd\x15\x37\x37\xcf\xab\x52\x9e\x0e\x5d\x31\x66\xb8\xdf\x92\x3e\x8b\x42\xe7\xba\xda\x5e\x7a\x00\x47\x94\x3e\x8f\xb4\x13\x69\x3a\x35\xa5\xd1\x1d\xeb\x0e\x62\x4c\x99\xb4\xbd\x85\x33\x6c\xbe\x6f\x2c\x70\x67\xfe\x39\xc3\x40\x10\xda\xd4\x08\x57\x6f\xca\x3c\x93\xe7\x49\x20\x3e\x94\x2b\x03\x19\x46\x06\xe4\x6a\x2b\xc4\x84\xe5\xb2\x98\xac\xbf\xc4\x79\xfc\xbd\x57\x1f\xb6\x13\xf6\x30\xdc\x97\x67\x42\xd1\x4e\x5a\xe9\x84\x32\xe8\xff\x3e\x61\x75\xbe\x3d\xd5\x59\x59\x10\x0f\x1f\x7f\x4e\x3a\xbc\x8c\x18\x90\x79\xe9\x16\x9b\xbb\x4c\x1b\x8f\x8e\x49\x0b\x2d\x9d\xa3\xc3\x13\xda\x1d\xfe\x58\xb9\x77\xd4\xa3\x65\x1c\x29\xda\x5e\x3f\x6f\x1e\x76\x83\x77\x1f\x8b\x94\xa8\x3e\x1d\x02\xe6\xef\xc1\x8e\x64\x12\x19\x67\xfb\x37\x6c\x6e\x5e\xef\xe7\x07\xa3\x4c\x22\x4e\xe3\xe4\x69\xfd\x63\xe9\x7e\x30\x01\x4d\x71\xc7\xf6\xc7\xfd\xed\xee\xdb\xf4\x66\xa7\x09\x73\xc9\x78\xe2\x14\x0d\x9d\x36\xf7\xd4\xd3\x74\x72\x82\x4c\x09\x44\x65\xf2\x3e\xbb\x97\xc5\xd3\xf6\x76\xfd\xb2\xdf\xbc\x3c\xff\xf1\x27\xed\x81\xdd\x8d\xa4\x11\x12\xf4\xfa\x40\x48\x62\x2b\x02\xf2\x17\x65\x64\x99\x2a\x4d\x3a\xb9\xab\xf5\xf7\xf5\xc3\xf3\x66\xfd\xb2\x5f\xbe\xba\xca\x93\xe4\x5e\x44\x10\xa7\x3d\x92\x51\xe0\x68\xce\x90\x3c\x8e\x69\x43\x01\xd6\x83\x73\x5f\x0f\xa4\x74\x5c\x9b\x34\xa5\x3c\x6f\xa9\x35\xcd\xda\x66\x15\x42\x63\xac\x39\xdc\x5b\x49\x88\x0d\xd2\x93\x76\xc1\xe3\x70\xca\xb5\x40\x41\x0c\xb4\x63\x8e\xca\x72\x92\x26\xcf\x22\x53\xf4\xed\xa2\xb6\xbb\xb4\x7e\x05\xa9\xbc\x84\x52\x5e\xbf\x97\xc5\xdb\x3f\x06\xee\x06\x20\x55\x14\x51\xb2\x67\x93\xfd\x2c\x17\x15\x16\x40\x46\x20\xe3\xd8\x46\x2a\x61\xc4\x26\xcc\x2a\x63\xb7\x73\x5b\x84\x4a\x4e\x18\x29\x12\xa3\x38\xb6\xa8\x8a\xd7\xc2\x49\x8e\x4c\x6e\x06\x75\xec\x5b\x71\xf9\xac\x18\xf2\x15\xa4\xf6\x53\xc9\x3a\xe1\xcf\xe6\x7d\x78\xa3\x9a\x47\xa9\x15\xbc\x78\xbd\xb7\xc2\x70\x4b\x2a\xd2\x37\x17\x2e\xc2\xe3\xdf\xd3\xe0\x51\x54\x77\x20\xcd\xee\x55\xe7\xd2\x05\xca\xf3\x83\x54\x59\x48\xd0\x29\x87\x06\x17\xea\x5f\x44\xdb\xbc\x25\x84\x7b\x7d\xdb\xf6\x50\xf2\x9b\x77\x7d\x3a\xec\xe1\x21\x2e\x52\x52\x5e\x68\x08\xb9\x56\x75\xa7\x77\x96\x04\xe5\x87\x69\x60\xa3\xe5\xc7\xb2\xa0\xa2\x47\x0e\x75\xbd\xcd\x48\xa8\x65\x7e\x4e\x54\x41\xc0\x52\x23\x3b\xfa\xd9\x0e\x0e\xb5\x30\x95\xe5\xac\x8d\x81\x1b\xcc\xf3\xec\x0d\x0b\x89\x5b\xd0\xd8\x9c\x57\xa8\xb1\xe8\x70\x69\x2a\x88\x62\x62\xb2\x6d\x2a\xac\xc7\x36\x1a\xa0\x02\xc6\x08\x9f\xde\xce\xfe\x34\x44\x8e\xcd\x44\xf7\xcc\x36\x0c\x3d\xa9\xbb\x05\xa6\xd3\x4e\x69\x4a\xa3\x57\x0f\xb2\x21\xee\xee\x5e\xbb\x6d\x94\x3b\x2d\x0d\x28\xf5\xbb\x29\xbf\x0c\xfc\x17\xea\x77\x54\x37\x3d\x6a\x4e\x85\xdc\x27\x46\x3d\x79\x6b\x5f\xc1\x39\x5d\x96\x89\x55\x1c\x18\x55\xbb\x7d\xd6\xe0\xc1\x48\xce\x1b\xc9\xae\x49\x48\xa0\x62\x6e\xea\x54\x64\x80\xa9\xa8\x08\xe7\x56\x4d\x15\xcb\x80\x0a\xa7\x9f\xed\xf8\x5b\xd4\x4d\x55\x0e\x07\xa1\x8a\x65\x88\xd6\xf4\x25\x2b\xce\xdb\xf7\xb2\x6a\x28\x7d\x38\x0e\xfd\x5c\x63\xad\x08\x34\x41\x26\xec\xdd\xb7\x4e\x44\x44\x58\x80\x53\x4d\xba\xe7\x9b\xb2\xce\x9a\x4f\x9c\xdd\xcf\x2a\x16\x84\x04\x5e\x22\xd0\xc5\x6b\x51\xf7\x1b\x36\xc5\x40\x51\x42\x08\xb2\x9f\xdd\x9f\xa4\x91\xfc\x1b\x66\x41\xae\x23\xf9\x67\x67\x3b\xc5\x30\xa2\xf5\x6a\x01\x8e\xe9\xa1\xd2\x44\x44\xb1\x0d\x07\xdb\xc8\x95\xc6\x6b\xe8\x8e\x72\xcf\x54\x90\xbf\xba\x22\xc7\x8b\x49\x71\xd6\x7d\x0b\xdf\x18\xe5\x40\x9e\x8f\xfd\xef\x40\x71\xab\xbe\xec\x26\x7a\x92\xe9\x71\xc7\x52\x23\xc5\x6a\x47\xc4\x4d\xd6\x8c\xfa\x29\xe7\x3e\x85\x90\x4a\xe9\xfe\x4f\x9c\xe0\x96\xe2\x54\x15\xa3\xb4\x93\x3b\x0e\x91\x63\xea\xaf\x4e\x58\xdf\x4f\x38\x63\x0a\xd2\x58\xda\xe3\x36\xa3\x6d\x41\xe7\xa9\x6b\xa0\x52\x6d\xa1\x41\x4f\xf8\xb5\x6d\x2a\x44\x03\x72\x18\x7d\x77\x11\x18\x8f\x7c\x13\x72\xd2\x4d\x0f\x91\x10\xb6\x95\x4c\x39\x0a\x97\x12\xc1\x7b\x59\xb6\x3b\x94\x2b\x20\x68\x25\x85\x61\x04\x8a\xd3\xe1\xb8\x29\x07\x32\x75\xa0\x24\x1a\x49\x65\xda\x69\x3b\xb8\xaf\xcd\x3a\xd8\x26\x8a\x23\x6d\x87\xdc\x37\xda\xd7\xe5\x01\xf7\x60\x18\x85\xf3\xfd\x40\x69\x4d\x74\x6e\xea\x79\x03\xf6\xa5\x3d\x8c\x2a\x75\xc2\x22\x8f\x58\xd7\xf0\x86\xf6\xab\xcf\x8c\xd3\xe1\xbb\x41\x8f\x05\x84\xe6\x6e\x03\xb2\x1f\x97\x61\xaf\x6d\xe5\x0b\x45\x14\x81\x85\x52\xcb\xf7\x6c\x2a\xd9\xeb\x1a\x29\xa5\x3a\x48\xd9\xfe\x68\xb2\x2d\xb3\x11\x02\xfa\xda\x77\x92\x9b\xdb\xf7\xf2\x68\x36\x2e\xa3\xfb\x0a\xfc\x28\x36\x18\x13\x27\xf3\x62\x7c\xe7\xed\xd3\x8d\x1b\x87\x0c\x4c\x99\x84\x26\x99\xb6\xcf\x66\x32\x3b\x0e\x21\x11\x18\x32\x6d\x78\x1e\x47\x2c\xd4\x54\x0b\x06\x43\x6e\x44\x79\xeb\x52\x37\x96\x16\x77\x57\x3a\x9b\x16\xc0\x50\x33\x52\x22\xbb\xab\x20\x87\x9f\x59\xd9\xa1\x36\x31\xe6\x26\x6e\xee\x59\x53\x46\x17\x78\xfe\xb1\x13\xdf\xa7\x5d\x08\xa1\xcb\x69\xd8\x3e\x42\x23\xdf\xef\x36\xed\x82\x65\xa2\xe1\x99\xcd\x0b\x26\xda\x4b\x6d\xe4\xbe\x95\x15\x1c\x1f\xb3\xc2\x5a\xf9\x5f\x44\x0c\xc8\xfa\xe5\xf6\x11\x0f\x75\xf6\x9f\xee\x19\x19\x7a\x14\xfd\x98\xb4\xfd\x22\xcf\x27\x67\xa6\x69\x42\xa8\xee\xf5\xee\xdb\xfa\x65\x04\xe9\xc0\x94\x6b\xc3\xf9\x74\x7c\x3d\x42\xaf\x90\xb8\x3c\x25\xd3\x27\x17\x02\xcd\x6c\x34\x70\x8b\xf8\x83\xac\xbb\x27\xf6\x66\x80\x5c\x86\x46\x41\xa3\x2a\x4b\x6d\x97\x3d\xf7\x73\x1c\x43\x66\x61\x64\x17\x3a\x81\x80\xed\xa4\x30\x40\x6f\x8e\x47\x31\x82\x30\x7e\xd5\x94\xf1\xb6\xcb\xe5\x95\x6c\x37\x0a\x5f\x72\xc7\xa5\x1b\x3d\xaf\x48\x13\x62\xf3\x59\x24\xa1\xcd\x44\x60\x3d\x85\xbf\xd9\xe6\x32\x8a\x69\x05\xb1\x3d\x60\x5d\x4c\xcd\x9b\xfb\x9f\x94\xcc\x28\x40\x89\xd3\xf9\x8f\x4e\x49\x63\x36\x72\x47\x99\x1a\xa1\x82\x43\xe6\xaa\xcf\x06\x7f\xd8\x46\x79\x5d\xff\x93\x92\xfb\x96\xbb\xb1\xfc\xdd\x0c\xa3\xf1\x55\x54\xc2\x48\xeb\x6d\xbd\xfb\x66\x05\x7e\x3b\xf8\x0a\x62\xa4\x54\x62\x4d\xde\x97\xed\xa0\xbd\x72\xd3\xed\x07\x21\x2f\x5d\xfc\xc4\x3c\x18\xa2\x96\x11\x95\x31\x46\xaa\xa0\x41\x52\x02\xa7\x12\x8b\x03\xa1\xa3\xf6\x8c\x73\x60\xdd\x94\x47\x5b\x83\xb9\x83\x69\x60\x89\x3a\x52\x4e\xf9\x6c\x09\xd5\xd4\x37\xf8\x97\x9b\x20\xd4\x71\xc2\x8d\x8f\xd5\x20\xcb\xf2\xd0\xc6\xdb\x6e\x6e\xd4\x9e\xcf\x1c\x33\xf2\xa5\x94\x1f\x38\x32\x69\x01\xed\xc5\x5c\xf6\x35\x81\xbb\x13\x5a\x7e\xa6\xcd\xa8\x8e\x53\xc5\x0e\x93\xa1\xfd\x10\x22\x66\x99\x04\xd5\x27\x79\xc7\x9d\x5c\xce\x5a\xfb\x89\x8f\x0e\xcc\xfb\x9e\x55\xca\x80\xa7\xdc\x41\xd0\xb4\x4e\xda\xf7\xb1\x1f\x99\x2a\x80\xf6\x95\x01\x93\xb4\x1f\xe5\xdc\x7e\xf1\xa1\x28\x8a\x0e\x02\x4d\x65\x17\xaa\x37\x65\xfa\x3c\xde\xe1\xe8\x30\x08\x99\xe7\x94\xfd\x8c\x0a\x9b\x4b\xa3\x8d\x5e\x9b\x8e\x98\x00\x23\xde\x2a\xef\xb0\x78\x00\x71\x0b\xd3\xa9\x44\x47\xa9\x71\x65\xa2\xfa\x8b\xc6\xaa\xea\xa4\xaf\xa7\x0d\xb9\x51\x5c\xba\xb9\x7f\x1a\xca\xb9\x82\x8e\x74\x42\x49\xa7\xcc\x00\xea\x47\xc2\xb6\xa0\x93\x08\x20\xee\x95\xf2\xa1\x38\xaf\xc6\xc4\x23\xd7\x8e\x7b\xb4\x8b\xb9\x79\x78\x5e\xfe\xbe\xfc\xb6\xb8\x7f\xda\xaf\xd6\x9b\xe7\xed\xfd\x6e\x7f\xb3\xde\x2d\xf6\xfe\x63\x77\x45\x09\x94\xfe\x98\xd1\xf4\xd0\x09\xc6\xb4\xcb\x5e\x21\x1e\x6f\x2a\xe8\xbf\x07\x4b\x3c\xe5\x0d\x14\xf9\x92\xee\x80\xf6\x89\x27\x6d\xf7\x92\xe3\x9b\x4a\x75\x64\x44\x5d\x08\xdb\x49\x15\xdc\x1e\x11\xa4\x79\xea\x07\xba\xc7\x98\x65\x45\xfb\xd6\xb2\x4f\x5c\x57\x15\x4c\xc1\x90\x9a\x83\xd1\x47\x73\x37\x10\xb8\xc4\x8f\x06\x5f\x05\xca\xc6\x4f\xa3\x15\x4f\x43\x6c\x41\xcb\x6d\xa7\x3d\x55\xa6\xa8\xe9\x6c\x29\xc7\x77\x0a\x18\x79\x1d\xcd\x63\xf7\x5e\x61\xfd\xde\x86\xad\xe3\x46\x02\xcc\x0d\xb7\x1b\x9e\xc5\xdd\xaf\x8c\x57\x40\xcb\x38\xa1\x0b\x0e\xcc\x1e\x5f\xa0\x31\xf2\x5e\xd5\x61\x00\xdd\x9d\x9d\x4d\xb4\x4c\x22\x5a\x04\xd7\x2f\xcb\x20\x08\x1f\xb3\x82\xbc\xf8\xa9\xdf\xcc\x4a\xc2\x69\x15\x9b\x6a\xfc\xfa\x27\xac\x5f\x5d\xee\x40\x2b\x66\x4a\x8c\x2f\xeb\xed\xfa\xe5\xfb\x7a\xb5\x7f\xdd\xdd\x3f\xdc\xef\xfe\xdc\xdf\xbd\x3c\xbf\x6e\x5c\x2b\x84\xc0\x88\xc0\x1c\xe0\x67\x10\x27\x73\xfa\x3c\x5a\x7b\xa6\x7f\xb9\x7e\x8e\x73\xd1\xf9\x70\x9c\x09\xcf\x4b\x80\xc5\x5d\xe9\x7e\xf4\x2e\x85\xe7\x31\x23\x6a\xd2\x06\x37\x77\x4f\x46\x86\xc1\xaa\xe7\xb9\x16\x22\x25\x8a\x52\x1b\x24\xe9\xb2\x3a\x90\x01\x5b\x66\xfd\xed\x46\x31\x83\xf0\x3c\x65\xe4\x7f\xf7\xc7\xca\x20\x99\xdb\x57\x6d\xfc\xbb\x06\x01\x8e\xf0\x82\xd8\x47\xc7\x5b\x24\xd9\x33\x7c\xac\xdf\x06\x95\x23\xe1\x85\xb1\x41\x4a\x18\xd8\xf9\x6d\x59\x61\xf6\x56\xdc\x54\x99\x7a\x1b\x2f\xa2\xc2\x8b\x7c\x4e\x19\x5c\x4d\x86\x6a\xd8\x80\x0d\xf9\xdd\x95\xa2\x30\xa1\x62\xd2\xcb\xeb\xd3\x7a\x30\xe0\x85\x17\xb5\x93\xb9\xf5\xf2\x20\x16\xa9\xd3\xbf\xb0\xc7\x63\x3f\x89\xed\xab\xa6\xb0\xee\x16\x71\x6e\x4a\x11\x5e\x1c\xf9\x86\x20\x6d\xf4\xab\x8c\xca\x5c\x56\xbc\x75\xb1\xdd\xe5\x19\x5c\xe9\xde\x53\x6c\x5b\x5f\x92\xf7\x06\x03\x48\x78\xb1\x94\x0e\xdd\x3e\xb2\x7d\xff\xe5\x72\x23\xbc\xc4\x43\xaa\xe4\x74\xbd\x8e\x72\x5c\xdb\xfd\xed\xf3\xcb\xfe\xf6\xfe\x69\xf1\xb4\xbc\x5f\x3c\xec\xef\x9f\xb6\xbb\xfb\xdd\xeb\xee\xfe\xf9\xc9\x3d\x79\x92\x1a\x54\xc5\x00\x23\x78\x81\x1a\x12\x5e\xa2\x3d\xc3\x53\x2e\x6d\x48\xe4\x90\x86\xbf\xaa\x2f\x09\x8f\xa5\xda\xa8\x89\x97\x6f\x6f\x39\x39\x4a\x5f\x94\x58\x85\x97\x06\x8c\x3a\x08\xd4\xef\x12\xea\xf7\xd1\x77\x4b\xc3\x88\xd0\x7e\xd6\x44\xca\xe4\xc7\x06\x9d\x2b\x8d\x22\x62\x68\x35\xe5\x6b\x56\x34\xbf\xcd\xbd\xd0\x94\x81\x8a\x47\x68\x0b\x0a\x4f\x37\x58\x75\x92\xbe\xc2\x4b\xa5\x24\x5f\x0b\x2c\xfe\x95\x15\x3b\x84\xc3\xa8\xc8\x23\x3c\xf0\x52\xe6\x4c\xf4\xce\x47\xec\xad\x43\x84\x07\x60\xd8\x6a\x37\x59\xd3\x7c\x41\xd3\x74\x7f\x57\x81\x91\xbf\x2a\x65\x06\xf9\x23\xaa\x0c\x4c\x96\xe1\xd2\x4b\x5a\x78\xd2\x8f\xe9\x39\xde\xb3\x49\x11\x69\xec\x6a\x98\xba\xe6\x1c\x48\x21\xcf\x20\x6b\xb6\x38\x89\x99\x85\xa7\x62\x9f\xc5\x63\xa7\x82\xc9\x50\x52\x4c\xd2\x06\xc1\xb1\x99\x4a\x92\xc0\xc4\x91\x2f\xeb\xe8\x3d\x2a\xe1\x91\xbf\x91\x73\x01\x20\x1e\x2f\xed\x0c\x17\x56\xfc\x65\xbe\x0f\x28\xc5\x7c\xbb\x03\x5c\x88\x2c\xcf\x7a\x87\xeb\x2e\xef\x98\x5e\xfc\xf3\xf2\x32\xe8\x07\xb4\x33\x2b\x8f\x58\xac\xca\xb2\x1b\xf2\xe8\x27\x54\x3d\xe8\x2c\xa2\xa8\x86\xbb\xa2\x85\x74\x6e\x9e\x17\x1e\x4a\x4e\x1f\xac\x99\xab\x91\xfa\x2e\x4d\x24\x3c\x54\x8a\x3a\xaf\x91\x22\xfe\x06\xf5\xfb\x42\x29\x97\x1a\x0c\xbc\xd1\x07\xd1\xc2\xa7\xe9\xdc\xac\xab\x5b\xd0\xb8\xc5\x62\x4a\x56\x6f\xdb\x84\x94\xba\x5f\x21\x09\xc9\xaf\xff\x6f\x24\x29\xe1\xfb\x5e\x64\xb5\x98\xde\x5e\xf0\xcd\x64\x08\xe7\x3e\x9a\xef\x07\x9c\xb6\x3c\x9b\xaa\xfc\x17\xca\x66\xdf\x59\x1f\x0d\xae\x85\x40\x40\xdb\xb6\x2f\x5d\x5a\x41\x09\x3f\x08\x98\x72\xae\x2b\x6d\x8c\x6c\x43\xae\xf1\x46\x22\xed\x1a\x1b\xca\x8c\x2c\x0f\x87\xac\x69\x10\xff\xbb\xcc\x8a\xef\x65\x33\x81\xea\x09\x3f\x08\x85\xa9\x3c\xbf\xfc\xb1\x5f\x6c\xb7\xeb\xdd\x9e\x14\x7d\xdc\xd1\x24\x24\x0c\xb6\x3e\x15\x0a\xaa\x0c\x3a\x69\x0b\xe1\x07\x9c\x13\xa5\x01\x4c\xde\x65\xa2\x86\xd8\x27\x13\xfa\x09\xc6\x0f\x93\x84\x50\x86\xe2\x74\xbe\x84\xea\xb7\x87\x85\x8f\xbd\xdc\xdb\x48\xad\x60\xfc\xaa\xe2\xd8\x38\x2c\xef\x36\xbb\xee\x4d\x95\x6e\xcf\x23\xfc\x58\xb0\xc0\xd6\x3d\x56\xf4\xa2\x47\x6b\xb3\x9f\xc4\xc0\xfa\x78\xfe\x61\x10\x6f\x4d\x7e\x26\x51\x1e\x25\x8f\x8c\xf9\xb5\x21\xf4\xcf\xf7\x03\xe6\x07\x94\xa6\x77\xc2\x4a\xb6\xd3\x75\x47\x19\xa5\x2a\x28\xad\xa8\xc6\x33\x9a\x9f\x7a\x82\x64\x74\xdb\xd8\x75\xf1\xf8\xfc\xfa\xb4\x0b\xba\x43\x92\x53\x7e\xf4\x98\xc3\x39\xba\x72\x8f\xa9\xe6\x44\x47\xb6\x1d\xfe\x98\x67\x0d\x14\xaa\xfd\x7d\x77\x15\x1e\x30\xd2\x09\x5d\xb6\x73\x77\x27\x45\x29\x7c\x60\x3e\xc5\xbb\x6d\x20\xf7\xd1\x46\x58\xfb\x3c\xfb\xb8\xe8\x1f\xc2\x6e\x9f\x8e\x15\x7e\x66\xe5\xa9\x1e\x3f\x99\x50\xca\x37\x5a\x70\x26\x3e\xbb\x73\x07\x64\x14\x6b\xde\xe1\xcf\xda\xee\xda\x3d\xb0\x8c\x43\x34\xd4\x2a\x37\x23\x22\x09\x08\x4f\x7e\x58\x79\x9a\x96\x0b\xc8\x8f\xef\xe0\xce\x55\x49\x2a\x8c\x3a\xe1\xa9\x68\xaa\xb3\x11\x4d\xb9\x5f\xb9\xc3\x88\x82\xf6\x19\x8f\x24\x26\x9b\x75\x43\x47\x27\x09\xa5\x19\x81\x68\xa9\x6d\x97\xc1\xa2\xb9\x39\x5f\xe6\x26\x44\xe0\xf9\x09\x45\x5e\x8b\xe3\x31\x93\x75\xef\x3e\x28\x02\x5f\x4b\x6e\x97\x9e\x26\x3b\x60\x9f\x21\x17\x41\xe0\x85\x81\x11\xd1\x29\x1a\xc8\xdb\x39\xb8\x13\x16\x76\x4d\x42\x8f\x11\x53\xc3\x76\x7b\x94\x9f\xeb\xe6\xdd\x5a\x96\xf6\x43\x24\x08\xad\x9b\xd5\x67\x86\x5f\x5b\x59\x56\x93\xc0\x2b\x08\x39\xa7\x27\x94\xa2\xcf\x39\x4c\x5a\xc8\x98\x30\x29\x99\x2c\x5f\x4e\x79\xbb\xbb\xfb\x5b\x6c\x68\x82\x51\x99\x44\x3a\xfe\x87\xa8\x28\x8b\xaa\x82\xb3\xb1\xb6\xbc\xd0\xcd\x10\x41\x94\x68\x05\xa3\x2c\x72\xfb\xd8\x13\x1c\xa6\x08\xa2\xd4\x38\xad\x41\x4d\xb5\x69\xca\x0c\xcc\x76\xe4\x20\x16\x91\xc7\x2c\x13\xc6\x14\xfd\xdd\xab\x8b\x65\x48\x79\x8e\x7f\x11\xb7\xda\xe1\x8e\x67\x91\xd2\x22\x88\x31\x31\xcc\xa6\xa6\x1a\xf6\x66\xb7\x98\x04\x49\x04\x24\x56\x57\xfb\xde\x50\x52\x4a\x04\x4c\xa4\x4a\xf5\x88\x8d\x71\x40\x1e\x70\x1e\x51\x9e\xe2\xfe\xee\x76\xf9\x97\x64\x10\x11\x70\xad\xcc\xbe\xd6\xd6\xec\x57\x99\x91\x69\x5b\x96\x1f\x57\x96\xe7\x80\x6b\xf4\x03\x0b\x51\x7a\x87\x0a\xdf\x2f\x45\x56\x44\x00\x9e\x24\x29\xf5\x6f\x17\x56\x4f\x6e\x67\xe4\x1a\xca\x94\xf8\x31\x3f\xee\x9f\x28\x00\x5d\xac\x56\x2f\xeb\xed\xd6\x1d\x16\x68\x2a\x5b\x6f\x4e\xcc\xfd\x16\xb1\x43\x52\xb9\x91\x1a\xc8\x08\x03\x2b\xd9\x7a\xcc\xf1\xe7\x56\x42\x8e\xcf\xa2\xde\x4d\xbd\xf7\x45\xa0\x7c\x83\x16\xdc\x54\xe8\x28\xf2\x9b\x13\x99\xf7\xcc\x7f\x6c\x15\xa7\x54\xce\x12\xd0\xc8\x77\x27\xc1\x30\xfd\x54\x18\xf8\x94\xb4\xed\x22\x8a\x71\x2d\x42\x04\xed\xde\x0d\x87\xa4\xf6\x89\x98\xdd\xd5\xd2\x53\x7b\x6a\x4c\xc2\x31\x84\x19\x5c\xbf\x2c\xfd\x24\xb6\xc2\x35\x35\xd1\x8e\x35\xc8\x09\xab\x25\xb2\x67\x6a\x5f\x19\x17\x7d\xc8\x3f\x8c\x2f\x96\xbd\x9d\xd0\xf7\x39\x95\xc1\x0f\xd4\x75\x46\x55\xa6\xd1\xd3\x87\x7e\x9a\x1a\xc7\x7a\x94\x7f\x63\x78\xce\x0f\xd7\xd0\x57\xca\x67\x7d\xe9\xd6\xdc\xea\x6d\x55\x1e\x2e\x95\x17\x86\x5d\x33\xf4\xb5\xf0\xac\xbd\x18\xd6\xf5\x7a\x22\x3d\x28\xc2\x20\x31\x3d\x87\x40\x03\xe3\x95\x33\x0c\x84\xc1\x98\x56\x24\xd4\x7e\xbf\x7c\x76\x8f\x1e\x7a\x8c\x77\x0a\x41\xdf\xdb\x2f\x01\x7f\xa9\x8d\x32\x79\x9e\x30\xe6\xda\x00\x63\x3e\xf0\xa9\x2c\x6e\x4f\xc5\x5b\x26\x2e\x8d\x51\x6d\xeb\xd8\x0f\x89\x29\xe8\xba\x84\x21\xe6\xcd\x76\xb6\x30\x8e\x42\x6d\xa1\xac\x94\x1d\xbd\x34\x28\x13\x61\x0c\x5e\xe8\x2a\xff\x5f\xa8\xc8\x44\xa9\xcb\xa2\x8a\x76\x37\x8b\xc6\x17\x8e\xfc\xe7\x9f\x7f\x05\x92\x16\x21\x93\x48\x9b\x98\x03\xfc\x5c\x37\xef\x33\xb1\x5c\xc8\x30\xa2\x05\x83\x0a\xa6\x54\x4f\x2a\x4b\xdd\x6e\x68\x06\xf4\xc4\xc9\x70\x08\xd3\x50\x10\x2e\xea\xf1\xfc\x84\x5f\xc3\xcd\x59\x98\x0a\x23\x2d\xde\x60\xdd\xbc\xd4\x6d\x08\xe0\x8e\xf0\xd8\x40\x7e\x85\x85\xb7\xb6\xd1\xae\x91\x0c\x98\xb1\xda\x13\x21\x07\xa3\x1d\xe7\x34\x06\xdc\x02\x7d\x5f\xd4\x37\xe7\x2b\xd0\xea\xc9\xb3\x73\x89\x54\x46\x79\x74\x24\x84\x60\xb6\xd4\x21\x42\xc1\x42\x87\x8d\xd9\xe4\xd0\xe8\xb2\x3a\x0c\x76\x73\xa1\xf4\x05\xf5\xa8\x75\x73\xd8\x60\x75\xd3\x48\x77\x40\xa5\x51\xe0\x0f\x6c\xd4\x17\xc5\x1b\xe6\x4b\xa8\xd4\x96\xec\x24\x5d\x33\x64\x9a\xd0\xd6\xba\xac\xde\x7e\x25\xd5\x2d\x42\xad\x0c\xc3\xe4\x54\xa3\x32\xe0\x73\x1c\xf2\x1d\x44\xe4\x85\x8c\x32\xb9\x36\xd5\xf0\x27\xc2\x95\x9e\x16\x79\x98\x92\x94\x5f\xdd\x94\x47\x17\xe1\x76\x57\x41\x45\x1e\xf3\x3f\xf0\xae\xcc\x87\x64\x46\x11\xf9\x81\x0e\x8d\x02\x10\xa1\x84\x57\x98\x67\x9f\x78\x85\x0d\x2f\xa2\xc0\xd3\x68\x52\x24\xd5\x27\x56\xe3\x68\x32\x0a\x02\x34\xb0\x42\x2c\xac\xcd\xe5\xa2\x50\xd6\x12\x69\xf4\xfe\xa3\x88\x49\x67\x29\xec\x32\xc1\x26\xbb\xfa\x4b\x60\xb8\x88\xe2\x88\x51\xdc\x2f\xf3\xd2\x88\xe9\x16\x98\x5f\x24\xf4\xae\xa8\xdc\x0c\xa0\x68\x22\x8a\x13\x53\x05\x22\xc3\x34\x07\xed\x99\x0d\xca\xa2\x18\x42\xcf\x6e\x1c\x36\x39\x14\x38\xe9\xb7\x11\x8b\x3d\x32\xd6\xdb\x7e\xbb\xdf\xf5\xf2\x81\x22\x62\xa9\xd9\x39\x52\x5d\x62\xf7\x55\x0e\x2a\x13\x22\x62\x82\x4b\x23\xb7\xd5\x49\xdf\x94\xd5\x35\xfa\xab\x88\x52\x8f\xd1\xfb\xfa\xb6\xdc\x8d\x3e\x5e\x1a\x45\xba\x4b\x0e\x52\x45\xf5\x96\xa8\xa6\x93\x5b\xe4\xbe\x22\x0e\xce\x70\x36\x18\x2a\x5f\x51\x0b\x4a\xbf\x28\x38\xd7\xbb\xf2\xb5\x30\x5c\xa6\x2b\x77\xc3\x7d\x4c\xed\x02\xfe\x54\x36\x57\x62\x8a\x08\x14\xe7\xc6\xa2\xa4\xa8\x9b\xea\x24\x29\xae\x73\x6e\xe5\x53\xc0\xb4\xa9\x79\x4c\x55\xab\x67\xe4\x1c\xec\x1e\x33\x12\x22\x25\x28\x95\xc8\x9a\xfa\x23\x1b\xbd\x14\xa1\xcc\x20\xed\xf7\x16\x15\xca\xb2\xba\x12\x0e\x44\x32\x0e\x08\x34\xed\xc2\x25\x82\x58\x64\x65\xf1\x5c\xdc\xe0\x3b\xe4\xba\x0f\x2b\x67\x75\x25\x44\x24\xc1\xa4\x8d\x9e\x69\x19\x70\x7f\x44\x96\x18\x1b\x9f\x97\xf5\xcf\x23\x16\x75\xf6\xe9\xd8\x9f\x93\xb3\x75\x8a\x8e\x2c\x63\xaa\x96\x73\x35\x11\x11\x29\x3f\xa0\xe1\x6d\x7d\x19\xa8\x68\xb3\x9b\xf6\x55\xb4\xda\x93\x35\x36\x37\xbb\xdd\xf6\xd2\x48\x4a\x44\x28\x05\x21\xf4\x97\xcf\x4f\xbb\x97\xc5\x72\xb7\x1f\x47\x67\xb1\x9f\x2a\x31\x34\x7d\xbe\xa6\xcf\x2f\x62\x5f\x25\xb4\x79\x7c\x3e\xe2\x40\x59\x52\xc4\x01\xfa\xb6\xce\xf1\x89\x5b\xfa\x92\xc3\xea\x80\x88\x43\x2f\x20\xf8\x52\x81\x3f\x9b\xb5\xcd\x1a\xb9\x43\x89\x0a\xb4\x83\x6a\x69\x38\xe5\xcd\x20\x5d\xe8\xda\x30\x8f\x60\x17\xeb\xf5\x82\x86\xdb\xf8\x68\x14\x6a\x65\x68\x15\x9f\x59\x4d\x86\x09\x37\x24\xc2\xee\x7e\x21\xf6\x99\xc1\x3f\x14\x70\xac\xdf\xcb\x2b\xd5\x57\x11\xc7\x11\xa7\x48\xc4\x88\xdb\x0e\x4c\xc9\xff\xeb\xa2\x04\x2e\xe2\x58\x98\x4a\x88\xd9\xe2\x65\x35\x3e\xe1\x4f\xda\x47\x74\x8b\x6e\x9c\x30\x2f\x10\x4e\xf7\xeb\x07\xe2\xc7\xe4\xc9\x13\x19\x90\x43\xc1\x4d\x96\xe7\x99\x71\x8a\xeb\xb7\xba\x71\xa2\x02\x72\x97\x31\x18\x91\x5b\x23\x69\x31\x79\x72\x26\x23\x23\x0d\x48\x99\x85\x4d\x55\x1e\xca\x76\xeb\x7b\xdf\xe0\x54\x94\x66\x3e\x08\x8a\xd3\xc4\xc7\xf6\x16\x5e\xad\xac\xe6\x3c\x38\x5d\xc4\x29\xe7\x1e\x73\x64\x9f\xba\x99\x07\xa1\xb4\xcd\x8c\xa6\x13\x01\x33\x0d\xad\x7a\x55\xc1\xd7\x10\x53\x6b\x5b\x72\x9f\x53\x46\x65\xe9\x4f\x0e\x40\x60\x80\xec\xa4\xe3\xb3\x50\x06\xe1\xd8\xa9\x8e\xbb\x46\x2a\x72\xb7\x43\xce\x54\x7f\x21\x8a\x61\x66\x11\x17\xd8\xc4\x22\xf2\x29\xa2\x2e\x89\xfb\xf2\x7c\x6a\x64\x79\x70\xa5\xf4\xf1\xb4\x17\x8b\x98\x71\x8b\x42\x5f\xe6\x19\x16\xcd\xbc\x20\x91\x6b\xcd\x12\x4b\xcc\xa1\x0a\x8b\xac\x4a\x28\xea\xf3\xa6\xfc\xea\xbf\xaa\xe4\x11\xc9\xc5\xec\x5e\xee\x17\x0f\xdd\x1f\x35\x57\xf6\xb5\x6d\x8f\x20\xb1\x7e\xcf\x8e\x9b\xaa\x54\x27\xd9\x10\xca\xef\xe6\xfc\x58\x2a\xbb\xea\xf9\xee\xc7\x54\x1a\xc7\xc2\xf1\x82\x09\x55\x70\x7f\xd5\xf4\xd1\x9d\xa2\x23\x5b\x22\x56\x78\xa0\x1c\x13\x65\xc4\x97\x0e\xb4\x38\xf9\x14\x88\x3a\xb1\x18\x40\x95\x51\xcf\x36\x79\x6c\x77\xdb\x3a\xd0\x44\x80\x90\x90\xcb\x99\xfc\x5a\xac\x63\x45\xb9\xf3\x36\xd0\x59\x6c\xac\xc6\x80\x48\xbc\x84\xd3\x69\xc7\x32\x2b\x88\xce\xf3\x54\xaa\x49\xc7\x4e\xfc\x54\x9a\x8a\x1e\xd6\xcd\xe2\xa4\xb2\x4e\x05\x48\x24\x41\x28\x28\x4f\x43\xc9\xcf\xad\xf5\x19\x1f\x80\x86\x47\xcf\x90\x04\x91\x31\xcf\xfe\xd1\x9d\xae\x34\xed\xe1\xf2\xec\xc3\xd8\xb4\x4c\x67\x7a\xdb\x2e\x4c\x3d\x9a\xe1\x07\x52\x4b\x8f\x90\x15\xfd\x1e\x24\x09\x53\x8c\x7d\x27\xdd\x67\xb4\x34\xf4\xaf\x60\xc8\x22\x09\xd1\xa7\x35\x79\x7d\x38\xe6\xe5\x19\xdd\xe2\x30\xec\xda\x49\xe4\x03\x71\xd9\xdb\x71\xec\x2a\xf1\xfb\xac\xd8\x0f\x41\x88\x22\x89\x02\x41\x3e\x29\x77\xa5\x52\x24\x7f\xd7\xaf\x85\x49\x12\xa5\xd2\xb8\xf9\xe4\xed\x47\xad\x20\xcf\xea\x99\x2d\x48\x92\xa0\x76\x2e\xca\x46\xad\xe0\x77\x3c\xbb\xea\x50\xc2\x02\x46\x4b\xc6\xe1\x7c\x93\x0d\x76\x31\x3d\x51\xd7\x35\x4c\x3d\x0c\x95\x83\xf7\x34\x6d\xe8\xae\xcb\xb6\xbf\x16\x8d\x01\xba\xa7\x93\x0f\x92\xfa\x48\x19\x3c\xc2\xdb\xcb\xb2\x1a\x40\x6e\x47\xa5\xd0\xcb\xd3\x62\x47\xf1\x37\x1a\x3b\xc6\x44\x89\x34\x73\xc6\x5f\x2e\xf5\x91\x6b\x1b\x92\xda\x48\x74\x7c\x2d\xce\x19\xd8\xe1\xb6\x24\x89\xad\xa1\xbb\x9d\x9b\x25\x12\x08\x93\xd8\xe6\x47\x8c\x6d\xde\x7c\x07\x03\x34\x50\x51\x83\x95\x7b\xd6\x3f\xca\xea\x83\x7a\xf6\x3f\x4e\xd8\x55\x3a\x13\x21\x02\x4a\x08\xfe\xcf\xf9\xad\x3c\x40\xff\x57\xc3\x60\x01\xf1\xd3\x78\x88\x75\x07\x30\xa6\x62\x23\x16\x6a\xdf\xd4\xfd\x5f\x53\xe6\x04\xb1\xe9\xd7\x6e\xce\xcb\xf2\x74\x2c\x8b\xc9\x0b\x10\xa8\x02\x7b\xe7\xb6\x68\x67\x3a\x5a\x7d\xc9\x41\xef\x9e\x56\xfa\x46\x83\x86\x36\x6e\xdb\x73\xdd\xae\x20\x74\xd5\x78\xf2\xbc\x92\x79\xbc\x37\x88\x1d\x0e\xfb\x2b\x8b\x42\x22\x99\x6f\x40\x3d\xf5\xf1\x42\xd1\x6e\xda\x32\x20\xb1\x16\x83\xf5\xba\xbb\x71\x0f\x2e\xb9\x71\x4e\x58\xbc\x95\x96\x27\xe8\x8e\x68\x1f\x9d\xb5\x1a\xa5\x74\x4f\x3d\x8e\x46\x24\x9a\xc5\xa1\x85\x7d\x6d\x9e\x9f\x1f\x3a\xcf\x12\x77\x98\x2b\x82\x57\x1a\x3d\xca\x4b\x94\x80\x6b\x26\x35\xc9\x0a\x65\xf5\xde\xee\xc6\xa7\xb1\x36\xf3\x62\x46\x95\xde\xaa\x78\xbb\x77\xe1\x35\xf3\x23\xd4\xb6\x97\x19\x06\xcd\xfc\xeb\x61\xbe\x64\x2c\xe9\xe5\x03\xef\x65\x69\x92\x5a\x93\xdf\xf0\x55\x4a\xf9\xdc\xdb\xf5\x7a\xbf\x5d\x3f\xac\x97\xbb\xfd\xc3\xcb\xd2\xfd\x58\x10\x22\xb1\xf1\x8e\x58\xd5\x65\x41\x8c\xdd\x4e\xf1\x55\xb0\x20\xe2\x89\xee\xd0\x88\x43\x2d\xaf\x2b\xf7\x14\x32\xc9\x86\xfb\xf2\x4b\x0c\xa0\x60\xa1\xd0\x34\x05\xbd\xb5\x01\x47\x47\xa9\x14\x2c\xf2\x4c\x6a\xce\x56\x55\x8e\xc7\xfb\xa2\x6e\x68\x52\x9c\xd9\x94\xb1\x88\xe9\xc0\x42\x7a\x9e\x2b\xb8\x83\xfa\xd2\x49\x5a\xb0\x28\x35\x32\x93\x9d\x81\x5a\x3b\x73\x37\xbd\x9d\xc0\x65\x7f\x66\x91\x34\x55\x43\x01\xf2\xe3\x05\xd5\x26\xcb\x8d\x58\xba\xc1\xa3\xd8\x46\xb1\x52\x64\x8e\xb5\xf8\xc7\xcd\xb0\x57\xb1\x84\x71\xcf\x62\x4f\x16\x6d\x4c\x59\xce\xf1\x15\x05\x4b\x90\x3b\x06\xab\x11\x06\x79\x68\xb7\x7d\x93\x46\xcc\x0b\x29\x4e\x7c\x59\xec\xd6\xfb\xed\xe2\x61\xbd\xdd\x2d\xee\xd6\x91\xfb\xa9\x76\x27\x49\xca\x7b\xa5\x15\xcc\x9a\xdd\x6f\x30\x16\x47\xbe\x85\xf0\xee\xce\x47\x54\xd6\xa4\x63\xde\x03\xb2\x3b\x87\x51\x09\xfd\x13\xf2\x13\x0e\x25\x5c\x45\xbb\x4d\x95\xb6\x6f\x5a\x18\xf3\xa2\xd9\xda\xe8\x78\x72\xff\xa9\x8e\x89\xb0\xef\xf6\x06\x6e\x8b\x34\x97\x94\xee\x69\xcb\x73\xb0\x44\xc1\x38\x24\xb1\x1e\xae\x98\x94\x3a\x7c\xc8\xea\x66\xe8\x5d\x22\x18\xc7\x84\x85\x5d\x11\x5b\xe1\xb3\xd6\xa4\x54\x95\x1d\xdb\x10\x6c\x24\xab\x65\xcf\x00\x2f\x25\x69\xc1\xc7\xff\x19\x7d\x48\x08\x34\x45\x5b\x47\x53\x05\x5d\xbc\x61\xff\x23\x10\x25\x5e\x3c\x4c\x49\xd7\xdd\x91\xd4\xd3\xe9\xc0\x37\xca\xee\x9e\x5f\xb7\xab\xc9\xbb\x11\x29\xd3\xda\x56\x48\xe7\x55\x47\x7e\x11\x93\x1a\x7f\xa6\xf6\x1f\x93\x8b\x4a\x8f\x85\x5d\xce\xf3\xc7\x3b\x16\x4f\x65\x43\x06\xf0\x93\x8c\x0a\x93\x10\x12\xac\xe7\x0f\x38\x55\x07\xf2\xa3\x1d\x43\xcc\x04\x53\x41\x42\xb0\x99\xdb\x53\xa1\xae\x32\x83\xc7\x17\x55\xdc\x33\x5c\x49\x2a\xa0\xa0\x32\x5f\x66\x57\x2e\xcb\x92\xc4\xf9\xb3\x4f\xdc\x40\xd5\x0c\x46\x11\x2a\x8e\x03\xc5\xf7\xba\x2e\xab\x5d\x39\xf4\xb1\x75\xed\x74\x4c\x95\xc3\x7d\xb0\x1f\x8a\xc3\xb5\x07\x98\x34\x42\xe6\x55\xa6\xcf\xc6\x3e\xd0\xba\x2e\xcd\xdf\xa3\xf6\x31\xe9\xf8\x5f\xbf\xd0\x9d\x13\x4c\x23\x10\xe1\xe1\xc7\xe2\xe1\x61\xbd\xdb\xef\xd2\xf5\x1f\x7b\x87\x94\xb1\x6d\x52\x2f\x04\x5a\x75\x8e\x65\xdd\x4c\xa0\x9e\x6e\x3a\x49\xbd\xd4\x0f\xed\x8c\x30\x5e\x6c\x53\x0f\x18\x05\x98\x78\xc8\x9a\x65\x79\xaa\x1a\x67\x78\x35\xba\xe5\xd4\xd3\x42\x1a\xbf\x43\x8a\xe8\x9e\xf5\x10\x9f\x29\xd2\x80\x27\x14\x2a\x9b\x49\xf3\xb5\xce\x8a\xb7\xb1\xc1\xf0\x60\xce\x4c\x03\x9e\x1a\x0f\x18\xd9\xc9\xf1\x59\x3f\x3a\xdb\x20\x0c\x31\x74\x0c\x72\x63\xba\x30\x4f\x6b\x1a\x4f\x18\x69\x98\xf0\xc8\x16\x1c\xb7\x90\x0f\x27\xf5\x34\x64\x11\xc1\xd1\xc5\xe9\x6c\x14\x03\x6e\x1d\x97\x6d\x56\xf3\x5a\xa4\xa1\xf2\x68\x57\xff\xfd\x65\xfd\x4c\xd3\xde\x7e\xf9\xf0\xbc\xbd\x7f\xba\xdb\xef\xee\x1f\xd7\xee\xb2\x51\x10\x07\x7d\x90\xdd\x3e\x7b\x17\xe7\xa7\x71\x80\xd4\xad\x8e\x19\x4a\x24\x21\x82\x5f\x6e\x6e\xd2\x38\x61\x14\xce\x2a\x3c\x96\x75\xd6\x3c\xdb\x9c\x67\x3d\x93\xcc\x98\xdc\x6b\x9c\x68\xaa\xf7\xed\x4d\x4c\xb3\x84\x6b\x79\xa3\x34\x16\x8a\x0d\x85\xe7\x68\x76\x72\xc8\xf3\xc9\x17\x4f\x54\x4a\x7a\x3e\x0e\x6d\x72\x57\xce\xcb\xc2\x88\x94\x49\x41\xb2\x10\x77\xd8\x6c\xb0\xb2\x5f\xb4\x7e\xb8\xa6\x65\x2d\xd2\xd4\x67\x89\x4d\x99\xfc\xe3\x84\xf5\x85\x57\xae\x48\xd3\xd8\xa3\x52\xd6\x9e\x4a\x59\xf3\xab\x7c\x9a\x26\x9a\xc8\x2e\x66\x57\xd7\xd7\x8e\x53\x2e\x4d\x7a\xb3\xc2\xe3\xa9\xa1\xf1\x34\xad\xb3\xa6\x1c\x4d\xca\xe8\x26\x6b\x56\x90\xe5\xe7\x9b\xb2\xeb\x7d\x90\xf8\x04\x05\x59\x6c\x36\xfb\x9b\xc5\x76\xbd\xdd\x3f\x2d\x1e\xd7\xdb\xcd\x62\xd9\x7d\x77\x91\x48\xe9\xe4\x11\x4e\xa2\x9d\x9a\x1f\xa1\x69\xc6\x8c\x0b\x91\x0a\xa6\x1d\x60\xa0\xa8\x75\x59\x1d\x26\xf7\x20\xa4\xa1\x50\x3f\x2e\xfe\xa0\x5e\xb5\x7f\x59\x3c\xdd\xad\xf7\xa4\xe6\xe5\x7e\x49\x22\x12\xb3\x74\x3f\x56\xe6\x5c\x15\x30\x79\x63\x52\x43\xdc\x8e\x99\x6f\x8b\xef\x4d\xd9\x4e\xf5\xe3\xc3\x2a\x8e\xff\x3f\x65\x6f\xd2\xdd\x38\x8e\x65\x8f\x7f\x97\xdf\x2a\x17\xbd\x20\x40\x82\xc3\x7f\x27\xcb\xb2\x43\x95\xb6\xe5\xb2\xe4\x88\xac\xee\xd3\x47\x07\xc3\x83\xcd\x32\x45\xaa\x48\xca\x0e\xe5\xa7\xff\x1f\x3e\x0c\x1c\x44\x45\x66\x6f\x32\xf2\x98\x20\xc5\x01\x78\x78\xc3\x7d\xf7\x6a\xe2\x5b\x08\xdc\x56\x91\xaa\x44\x62\x26\x5d\xe5\x0d\x17\x85\x57\xc7\xea\x2d\x50\x0a\x59\x10\x85\xa6\x69\x77\x73\x6a\x2f\x11\x76\x29\x48\x1d\x46\x83\x39\xd5\x2b\xda\xff\x36\x9f\x1a\xbd\xb2\xa1\xf8\x3e\x9a\x91\x00\xe0\xec\xee\xdc\x9f\x31\x3d\xd7\xdd\x93\x4a\x91\x23\xd8\xb7\x03\xf1\xfd\x94\x70\x48\xa4\x00\x31\x96\xa8\xf7\x28\x24\xd0\x05\x30\xe5\xbe\x0f\x8f\x53\x1d\x84\x81\x8b\x56\x56\xed\xfb\x95\x39\xa8\xa9\x46\xbc\x1a\x82\x13\xaa\x9a\xbf\xc1\x45\x8c\x70\x09\xf1\x99\xbe\x81\x6b\xbc\x8a\x22\xd5\x8c\x63\x74\xa6\x01\x1a\x9f\x17\x34\x39\x9c\x29\x62\x22\xd5\x89\x46\xac\xc7\xb1\x9e\xa1\x6c\xb3\x83\xb2\x20\x49\x31\x3c\xc7\xee\x84\x7b\x28\xb1\xf9\x68\x18\x75\x64\x41\x16\xe0\xbb\x53\xf0\x89\x06\x68\x56\x4d\x57\x64\x24\xc8\x70\x62\x3e\x7c\xff\x63\xe8\xb2\x64\x24\x49\x22\xe9\xa5\x64\x2e\x99\xbe\x44\x46\x59\x84\x0e\xf6\x5e\x9c\x2e\x99\xb1\xc7\x43\x43\x42\x9c\x44\xa0\x89\x41\x76\xd5\x13\xfc\x6c\x11\xf3\xe7\x7e\x30\xd4\x21\x7e\x01\xc4\x8d\xe3\xad\x8c\x60\x5b\x33\xaf\x7b\x62\x45\xdd\x26\x99\x45\x31\x47\x50\xd2\x73\xc1\xcf\x5b\x63\x37\x8c\x64\xa8\x3d\xce\x52\xd3\xb4\x73\x57\x55\x23\x3d\xb6\xb9\x8c\x63\xc6\xb2\x10\x7d\xfe\xaa\x8b\xbd\xdd\x9c\xa8\x6a\x47\x15\x31\x79\x27\x71\xa2\xd0\x99\x83\x52\x6d\x34\xb2\xee\x85\xee\x57\x13\x49\xb1\x41\xe1\xf4\xe7\x9f\xa3\x9a\x41\x96\x72\xe1\x29\x3d\x77\xef\x75\xf5\x65\x40\xcc\x5b\x28\x0a\x0c\xf8\x77\x5f\x9e\x7d\x52\x64\xa9\x4a\x9c\x03\xf0\x82\x95\x85\x39\x24\xba\xc8\xb2\x34\x40\x0d\x06\x0d\xad\x7c\xb7\xa8\x4a\xbc\x58\xb7\x0d\x3d\x42\xdd\x45\xcb\x93\x8d\x22\xe3\x94\x60\x19\xdf\x0c\x7f\xf9\xef\xc7\xf9\x6d\x22\xe3\xc2\x70\x0c\xf3\xba\x9e\x6d\xfb\x11\x99\x88\x93\x84\xd9\x27\x7a\xcc\xcb\x76\xf7\x9e\x37\xbf\x8d\xae\x21\xa5\x89\x23\x86\x90\xb7\x19\x7a\x97\x6e\x60\x86\xb9\x69\xdb\x41\x64\xf1\xdd\x57\x58\xb0\x45\x26\x55\xaa\x3a\x2b\xd7\x72\xe1\xde\x98\xa2\x29\xe6\xe9\xca\xd3\xe1\x36\x7f\xcb\x27\x3d\xb6\x22\x53\x4c\x85\xa6\x39\xf9\x90\x97\x2f\x08\x2a\xb8\x52\x0a\xcb\x94\x36\x42\x67\x25\x7c\xed\x80\x1f\x36\xe5\xca\xe6\x74\x66\x3b\x62\x6c\x53\xa3\xc8\x34\x89\x51\xb9\xa5\xe5\x1f\x5d\x08\x81\x59\xf1\x91\x21\x34\xe3\x78\x40\x24\x46\xea\x7d\x78\xf9\xbc\x7a\xda\x5d\x5f\x00\xee\xb4\xc4\x90\x0a\xec\x0d\x22\xe2\xae\xae\x0e\x0f\x23\xb9\xca\xf1\x53\xf0\x00\x0c\x5c\x03\x35\xa5\xda\xaa\x85\xdb\x2e\x5c\xac\x8e\x07\x28\xdb\x21\x57\x8b\xe0\x84\x1b\x30\x9b\xa3\x05\xe8\xdc\xf7\xa6\x3f\x28\x5d\xc2\x6d\x55\xea\xaa\x96\xf0\x02\x9f\x79\xd3\xd3\x8e\xd3\xc0\x8e\xa4\x84\xa1\x63\x8b\xc5\xfe\x8d\xde\xd5\xf0\x59\x95\xff\x18\x40\xe3\x38\x25\x31\x36\xd9\xf3\xe6\xe3\xae\x9a\x21\x1b\x16\x9c\x52\x03\xdc\x71\x5e\x8c\x2d\x87\xfe\x2d\xb4\x2a\xa7\xa1\x69\x95\x7e\xde\x3c\x0f\x57\x1e\xa7\x9c\x61\x53\xd0\xbe\x3d\x95\x57\x9c\x13\x94\xa4\x64\xa6\x9e\x2e\xc1\xe5\xf1\xec\xb1\x90\x64\xc4\x24\xab\xaa\x8f\xed\x91\x7f\xcf\x9b\xe9\xe6\xc4\xc3\x50\x22\xea\xc4\x37\xaf\x37\xcb\x5e\xd4\x47\xf0\x10\x4c\x71\xd5\x58\xd9\xfc\x70\x3a\x8c\x50\x13\xe3\x6b\x45\x32\x65\xd6\x3f\xfb\x31\xe1\xc0\x1f\x7f\x61\x16\x4b\xac\xec\x8b\x93\x15\x00\x1e\xb1\x0d\xcf\xae\x6a\xce\x20\x43\x58\xcd\x16\x0a\x7d\x0b\xa6\x6a\xea\xee\x32\xd6\x09\x96\x53\x4c\x60\x64\xec\xc3\x36\xbf\x8a\xbd\x9f\xab\x7a\xf3\x84\xf2\x08\x8c\x80\xfc\xd3\xfa\x9f\xc6\x15\xdf\x3c\xaf\x9e\x26\xae\x38\xef\xa2\x30\x2c\x46\x55\xd5\x47\x7e\x25\x81\xcd\xd3\x98\x1b\x50\x21\xf6\xfc\xf2\x5a\x89\xca\x31\xb2\xb8\x55\xc7\x53\x01\xb1\x69\x80\xcf\xe5\x07\x98\xf6\xb7\x5b\x28\xe0\x6d\xe0\xdc\xf3\x2c\xcd\x90\x42\xd2\xb4\x7e\xee\xf2\x83\xeb\xd0\x13\x3c\xe3\x29\xb7\x59\x95\x5d\xbd\x3c\x4d\x3f\x6c\xa6\x38\x6a\x63\x1f\x73\xf9\x71\x93\xbf\xd9\x0c\x88\x3d\xc8\x39\x45\x4c\xdd\xe3\xfa\x69\x8f\xc5\xce\xf5\x0d\xf6\x3c\xec\x9f\x5f\x56\xdd\x93\xfb\x71\x22\x04\xe2\x34\xd6\xac\xf3\x6b\x5a\xe2\xc6\xcf\xcb\x15\x01\xaf\x58\x70\x9b\xfb\x04\x0a\x17\x54\xa3\xca\x99\x71\xaf\x07\xe0\xe3\x49\xf9\x7a\x94\xd2\x76\xe7\x26\x1a\x1b\x4d\x8d\xe8\x96\xae\x26\x41\x3b\x97\xd4\xd0\x3c\x3e\xf2\xb2\xe4\x03\x54\x29\x97\x91\x44\x38\xf3\x7d\xaf\x67\x8d\x62\xf7\xbb\x2e\x68\x28\xbb\xad\x66\x0b\xf2\xd6\x11\xd5\x09\x2e\x93\x14\xb5\x27\x0f\x79\x01\x4d\xeb\x15\x7d\x05\x97\xd2\xb0\xb1\x1b\xc8\xdf\x46\x4f\x5e\xb1\xa2\x84\xa3\xd8\x67\xf7\x01\xdb\x86\x7c\x1c\x7b\x1e\x66\xc1\x81\xc7\x08\x68\x7c\xfd\x3e\x5e\xd4\x20\x03\xe4\xff\xb7\xb5\x48\xf4\xe7\xfb\x74\xd6\xa4\x85\x72\xb8\xd5\x73\x1d\x50\xb4\x68\x0f\xd5\xdb\x40\x2b\x58\x70\x4d\x49\xc4\x66\x49\x92\xdd\x00\x26\xa1\x57\x00\xc5\x1c\x74\x9f\xae\x9c\x14\x1e\xb8\x4e\x68\x64\xb3\xc1\xe8\x55\xcd\x22\x3f\xb8\x56\x81\xa6\x03\xb4\xcf\x16\xb5\x78\xbc\xdd\xd0\x4a\x88\xd8\xe9\x08\xa0\x09\x30\xf9\xca\xd9\xb5\x2d\x82\x2c\xc2\xdc\x59\xaf\xb9\x77\x25\x10\x1d\x2f\x33\x41\x92\x50\x79\xbd\x08\xab\x85\x0c\xe7\xbd\x02\x83\x56\x78\xaa\xbe\xf5\x3d\x2f\xee\x94\x34\x74\xb9\x48\xab\x85\xf3\x27\xa8\x87\xea\x2d\x97\xbf\x6a\x9d\x13\x82\x46\x0c\xeb\x2a\xe6\x57\xb0\x1c\x78\x0b\x65\x75\x30\x3d\xd5\xe3\x97\x23\x42\x09\x98\x78\x50\x66\xe3\x82\xda\xde\xdc\xbe\x9b\x81\xcd\xbe\xd2\xfb\xc6\x4a\x10\x0e\xbf\xaf\x88\x12\x85\xc0\x1b\xb4\x1a\x86\x59\xac\x5b\xb6\x3d\x15\x95\x10\x2c\xe1\x48\x7e\xe6\xb6\x99\x4d\x39\xcf\xc3\x27\x44\x4c\xa8\xe3\xf6\xbe\x94\x43\x14\x22\xa6\x9a\x46\x7d\x65\xf8\xd1\x78\xf8\xe3\x67\x8e\xc3\x10\x63\x39\x5c\xd5\xfd\xac\xea\xd5\x11\x84\x48\xa8\x8e\x13\x74\x5e\x8a\x22\xd7\x13\x38\x82\x48\x03\xc0\xb4\x22\xb7\x49\xe5\x71\x4f\x99\x48\xa9\xa9\xca\xef\x6b\x5e\xaa\x9b\xf3\x0b\xa2\xb2\x66\x77\x39\x91\x86\xa1\x32\x19\xc4\x4f\x3b\xc3\xab\x53\xeb\x6b\x08\x22\xe5\xa1\xcb\x51\xde\x58\x1e\x89\xf1\xf9\x59\x2a\xb9\xa9\x66\x1e\xf2\x36\x71\xa7\x65\x0a\x10\x2b\xfd\x86\xde\xbe\xfb\x2b\x17\xca\x15\x24\xca\xd3\xa4\x45\x50\x08\x42\x32\x4b\x4d\x69\x18\xfa\x6c\x50\x33\xaf\x2d\x7f\x9a\xed\xdd\x19\xfe\xd7\x7a\x66\x63\xa6\x6e\x21\x04\x35\x0c\x3a\xc3\xd0\xe5\x2f\xfe\x75\x67\xc2\x58\x81\xf8\xe6\x7c\x75\x55\xd9\x33\x64\xac\x31\xad\x92\x37\xcf\xfc\xdc\x45\xe7\xa3\x6e\x5f\x21\x64\xca\x42\xe1\x92\x4f\xaf\x2f\xeb\xed\x49\x6b\x47\x95\x22\x84\x0a\x0d\xd9\x16\x57\x6a\xd9\xcd\xdb\x0b\x40\xd0\xf8\x8d\xcc\xdf\x82\x8a\xd2\xd8\xf4\xfe\x23\x0f\xdc\x4d\x5e\xab\x66\x20\xd3\x23\x84\x4a\x52\xc5\x47\x48\xa0\xa7\x5c\x7e\x94\x53\x2e\x90\x6e\x60\x86\x59\x02\x9d\x97\x6a\x08\xef\x98\x7a\x99\x42\x65\x1c\x3d\x9b\xc5\xc3\xc3\x66\x69\xb5\xac\x56\xfe\xe7\xb8\x4a\xe5\x50\xa6\xc4\x20\xa1\xcd\x24\xde\xca\x77\x38\x70\x64\x28\xbb\x92\x69\x1b\x87\x1b\x42\x71\x40\xbc\x93\x6d\x05\x01\xa4\xff\x98\xdc\x8d\x0e\xd2\x70\x90\xdc\x98\x4f\xe8\x0a\xa0\x5a\x3b\x98\x45\x5e\x23\x18\x21\xaf\x4a\x9b\xba\x1c\xd9\x12\x1d\x10\xe1\xec\x9c\xc2\x36\x8e\x4b\x80\xe8\xe5\x5c\xed\xbf\x88\x96\xca\xf5\xf3\x2d\x37\xb6\x75\x57\xc8\x80\xa6\x58\x85\xfa\x63\xf7\xdd\x72\x82\x4f\xad\xa6\x1b\x28\x83\xd4\x31\xdd\x8c\xe9\x99\x85\x24\x61\x86\xde\xda\x43\xf5\xf6\x98\xbf\xd5\x7c\x8e\xb4\xcf\x0d\xd5\x14\x39\x10\x9a\x53\x2e\xf3\x29\xf8\x41\xd2\xc4\x80\x4e\x8e\x06\xdc\xf0\x04\x5f\xc3\x80\x5d\xd2\x24\xc5\xed\xf2\xb6\x7a\xaa\xda\x5b\x6c\x9d\xed\x02\xbd\x7b\x68\x77\xef\xf0\x92\xbf\xbd\xb7\x9b\x12\x96\x55\xf3\xcc\xeb\xbc\x3d\x3f\x9f\xda\xa6\x3b\xbc\x29\x77\x8e\x7e\x5d\x48\xaa\x02\x34\x60\xb2\x2a\x9b\xd3\x61\x0a\xea\x94\x14\x0c\x7f\xb7\x01\xfb\xbd\x36\x56\x0b\x63\xef\x8e\x87\x69\x86\x74\xac\xf0\x13\xe4\xa9\x85\xdd\xcf\x89\xc7\x2c\x23\x46\x31\xa3\x5a\xc2\x97\x0f\xd8\x67\xe7\xd2\xd0\x55\x95\x51\x9a\x62\xa3\xce\x6a\x5b\x54\x6d\x73\xb1\xbc\xed\x28\x16\xca\x20\xb1\x74\x04\xe3\x4e\x49\x37\x20\xa6\x99\xdf\x6e\x2e\x96\xed\x38\x11\x3e\x1b\x47\x4b\x96\x64\xae\xd0\xbe\x96\x95\x6d\x9a\x71\xc7\x54\x10\x50\x8b\x2e\xf8\xe7\x09\x3c\x32\x69\x3e\x04\x92\x31\xd3\xa9\x4d\x2a\xdd\x9c\xce\xb8\xbf\x3a\x4f\x57\xc6\x19\x33\xa0\xc5\xaa\x9d\xc1\x6c\xcb\x34\x34\x92\x44\x39\xf2\x32\xd6\xfe\xcf\x29\x41\x47\xfd\x7e\xf3\x70\xbb\x7a\x7a\x59\xec\xd6\x2e\xe5\x26\x33\x12\x1a\xbc\x20\x46\xeb\x06\xb5\x80\xaf\x86\xa6\x7e\x04\x18\x71\x8d\x93\xb8\x0c\xfd\x27\xb7\x9e\x85\x21\xe6\x90\x8f\x7b\x97\x06\xbc\x85\xcf\x6f\x55\xa1\x06\x1b\xb7\xcc\xc0\x54\xd8\x6c\x10\xec\xb8\x2a\xbb\x2b\x45\x36\x0e\x95\x9c\x98\x96\xf7\x37\x68\x1f\x78\xd3\x6e\xc1\xdb\x60\x29\xb8\x91\xd6\xcb\x2d\xbb\x13\xd6\x1c\xc6\xdf\x5b\x88\x30\xf6\xf1\x00\x2f\x9b\x23\xd4\x2f\xa7\xe9\x84\x93\x51\xcc\x6c\xc9\x0e\x09\x9b\xdd\xf2\xbd\x39\x3b\x68\xe7\xf4\x84\x58\x72\xed\xb5\x16\xf7\xb5\x6d\x09\x99\x0c\x12\x19\x2e\x53\x9b\xc8\x19\x4b\x8b\x8f\x87\x2a\xca\x90\x00\x4e\x60\x9a\xed\x19\xea\x6f\xd5\xc9\x7f\x32\x20\xda\xaa\x7d\x68\xa8\x6b\x23\xbb\xb1\x2e\x3f\xf3\xbe\x81\x5d\x82\x08\x70\xa7\x37\x68\xfa\xf1\xb5\xb5\x25\x9a\x75\x0f\x75\x77\x2a\x0a\x9d\x63\x36\xc6\xdd\xcc\x78\x3c\xc9\xb0\xa7\xf8\xde\xd0\x23\x96\x46\x4b\xf0\xa2\x42\xa1\x02\xa2\x30\x0a\x92\xc5\x69\xd0\x4b\xaf\x02\x96\xa0\xef\xf3\x72\xb3\xf0\x7f\x02\x22\xbc\xc8\x74\xcf\xf2\x24\x14\x89\x13\xc4\x5f\xac\xef\x1f\x79\xfb\xde\x4c\x42\x19\x45\xb2\x18\x99\x45\xea\xce\x7e\xed\x81\xd7\xe5\x25\x14\x50\x11\x01\x8e\x9d\xe7\xb6\xae\x26\xf4\xe7\x42\x11\xa5\x33\xf7\xfd\xf3\xf6\x54\xf0\xbc\x86\xbd\x65\x1c\x9f\x80\x07\x15\xa5\x19\x16\x64\x91\x04\xda\xa4\x79\x47\x90\x35\x45\xb9\x44\x96\xac\x3e\xd5\xb3\x74\xe4\x73\xb3\x8b\x40\x85\x24\x08\x1c\x8a\xe3\x94\xe3\xdc\x77\xd7\x0a\x43\x82\x72\x9d\xcf\xf9\x9f\x7f\xf2\xe7\xaa\x28\xfc\x01\x19\x62\x1b\x65\xc3\x35\xe0\x26\x21\x79\x73\xd1\x8d\x7d\x4d\x14\xb2\xb7\x87\x2a\x94\x2a\x1e\xc2\x72\x9f\x8d\x4c\xe1\xe4\x99\x43\x15\xa0\x15\xe9\x3c\x83\xce\xdd\x33\x11\xcb\x6f\x23\x33\x6b\x0d\x9b\x8a\xa8\xe2\x86\xd7\xae\xfc\xf0\x8b\x50\x45\xdc\x28\x3d\x36\xe7\xb2\x7d\x87\x36\xff\x89\x51\x65\x7f\x34\x05\xee\x42\x9e\x66\xec\x6c\xc5\xd1\x00\x11\xa2\x58\x24\xdc\x4a\x35\x3e\x64\x17\x89\x4c\xe6\x1c\x63\x1a\x05\x78\x16\xcb\x01\x17\x81\x62\x59\x84\xa9\x31\x04\x9a\xf9\x36\xcd\x2b\x55\x38\xc5\x40\xc7\x96\x86\xff\x0e\x0c\xcb\xc7\xdb\xdf\xeb\x39\x54\x71\xc4\x0d\x27\x45\x51\x35\x86\x21\xdd\xdd\x42\xac\x78\x6a\xbc\xc5\xd7\x5c\x6d\x27\xa8\x3c\x15\x6b\x86\x70\x38\xee\x89\x08\xc6\x5b\xa6\x4a\x62\xa3\x89\x81\x16\x1e\xd5\x90\x6f\x4d\x49\xc8\x0f\xd0\x8a\xb8\x84\xd4\x63\x5e\xb8\x56\x4e\x95\x46\x31\xcb\xbc\x9a\xae\x71\xc5\x6e\xce\x06\x6c\xea\x0a\x8b\x13\x33\x3d\x7e\xa3\x69\x94\x62\x92\x6d\xbd\xdc\xec\x0d\xd1\x93\x3b\x90\x19\xea\x02\x47\xb6\xd8\x53\x5b\xf4\x0e\xa8\x4a\x25\x45\x48\xc6\x0d\x6f\x72\x89\x3f\xbe\x3e\x1c\xfd\x4c\xce\x48\x82\x6b\x0f\xdb\x86\x50\xaa\xdd\x1f\xe1\x91\xb2\x71\x96\x27\x10\xf4\x2f\x43\xa4\x02\x95\xc9\xa1\x6a\xee\x17\x5b\xff\xd7\xcc\x70\x74\x18\x77\x51\xed\x8f\xc8\xd1\xbb\x3f\xf2\x73\x51\x71\x7f\x61\x49\x13\xd6\xa7\x11\x1c\x04\x4c\x29\xc6\x11\x32\xcf\x65\xeb\x11\x28\xc6\x83\x38\xfd\x35\xf0\x44\x29\xa6\x0c\xd7\xef\x17\x3f\x0e\x0b\xc2\xee\xb0\x54\xc2\x09\x1d\x4a\x44\xd4\xd9\xe0\x7e\x12\x2d\x2b\x20\x59\x9a\x4e\xd4\xc4\x6c\xd0\x66\x7b\x2b\x7e\x59\xa3\x56\xa0\x03\x66\xdf\x1a\x72\x53\xe5\x7f\xc2\x10\x93\xa2\x74\x62\x30\x55\x08\x90\x41\x93\xdd\x9b\x5a\x9d\x32\x0c\x7c\xf7\x70\xc8\xdb\x1f\x55\xfd\xe1\xa4\xdf\xe6\x67\xba\xd6\x54\x5a\x1f\xc6\x94\x3c\x87\xd2\xde\x02\x02\x92\x64\x81\xef\x97\xfe\x76\x14\x4f\x95\xf2\x1f\x10\x48\xc0\x42\x65\x9d\x1c\x94\x52\x90\x1f\xbb\xca\x38\xdb\x76\x04\x0d\x88\x23\x58\x5d\x14\xc5\x4d\xae\xb0\x61\x0b\xe9\x6b\x47\xf7\x01\x54\x48\x24\xea\xdb\x37\x27\x64\xba\xb3\xf6\x78\xf4\x5e\x81\xca\x94\x09\xaf\xfd\x9a\x37\x92\x17\x28\x08\x34\x66\x93\x12\x40\xc1\x34\x44\x1c\x4f\xcd\xfb\xae\x7a\xf6\x35\x67\x08\x03\x82\x75\x97\x1f\xeb\xa7\xa7\xd5\xcb\x7e\xfb\x6d\xe1\x83\x1e\x08\x83\x04\x19\x07\x7e\xcf\x5b\xf9\xee\xf3\x55\x10\x12\xc3\xf8\xd7\xe6\x50\xd3\x5d\x7e\x80\xa6\xe5\x87\xa3\x3f\xca\x02\xe7\xb3\x58\x9f\x66\x1c\xe4\x43\x08\x19\x35\x7d\xea\xd5\x27\x94\x06\xd3\x31\x79\x2a\x16\x31\x97\x8b\xd8\x2f\x7f\x2c\xf7\xb3\x19\x18\x60\x0c\x98\x95\x5c\xc3\xa6\xb4\xb1\x61\x01\x96\x26\xa8\xad\xbb\xe4\xcd\xfb\x73\xf5\x01\xf5\x73\xed\x00\x82\x6e\x84\xe0\xc2\x26\x09\x36\x47\x28\x4d\xb9\xc9\x1f\x94\x1c\x11\x0b\xcf\x9b\xc5\xb3\xff\x9b\x86\x4c\x39\x3b\xfd\x73\x59\xe5\xe5\x36\x57\x16\xbe\x69\x1d\x45\x88\xa5\xc1\x6f\xe4\x86\xc3\x7d\x53\x6f\x8e\x56\x91\x71\x36\x3c\x87\x24\x60\xb8\x4b\xfc\xb2\xf0\x75\x73\x9e\x49\xb2\x42\x96\x51\xde\x53\x53\x19\x5d\xd6\x69\x7e\x6c\x3c\xa7\x32\x00\xa1\x1d\x75\x7c\x2e\x01\xf9\x2e\x27\xdf\x87\x33\xaa\x8c\x6e\x3e\xd2\x9c\x0c\xa4\xe4\x04\x70\x41\x93\x1e\xa2\xf8\x52\x9d\xda\xbc\x7c\x5b\x56\x0a\x26\xd3\x8d\x0b\xe5\x5a\xff\x9e\x8f\x05\x4a\x55\x8d\x6a\xbd\x20\xed\x4e\xbf\xfa\xc9\x0f\xc7\x62\xe2\xb9\x80\xd4\x02\x79\xa1\x3f\xaa\xf6\x7d\xff\x49\x5c\x65\x0c\x14\x01\xc7\x0b\x3e\xa0\x36\x1e\xbf\x14\x15\x1a\xe2\xb0\x7b\x7e\x80\xe7\xaa\x2a\x26\xb3\x42\xe9\x0c\x79\xaa\x77\x37\x01\x71\x7f\x83\x40\x81\xd1\x65\x37\x41\x7d\x7e\x40\x12\x38\x7f\x98\xa7\xe8\x8b\x61\xba\xe3\xbe\xe6\x65\x0b\x30\x71\xc5\x40\x07\xc6\x2a\x18\x5a\x09\x43\x27\x3b\xee\x65\x74\x03\x21\x41\x3c\xf3\xd3\xeb\xe3\x7e\x73\xb7\x7f\xfe\xb6\xd8\xba\xf5\xa6\x49\x44\x11\x73\x85\xf1\xd7\x36\x2f\x9c\x7c\xc0\xb4\x4a\xf7\x8b\xd2\x9d\x26\x91\x52\x86\xa7\xf5\xac\x8b\x8a\x7f\x34\x8b\x37\x9e\x97\x8d\xe1\x68\xf2\x3f\x24\x82\x40\xb8\x1f\xba\x81\xe1\x01\x6d\xd0\x4a\xdd\x76\xdd\x7a\x01\x16\xa1\x09\x28\xdc\x2b\xf7\x5d\x28\x52\xbd\xe1\xa3\xcd\x6a\x24\x09\x4d\x74\x82\x0d\x6f\xfb\x77\xde\xe0\x9c\xbc\xab\xea\xce\xeb\x84\x36\xbf\x1e\xd8\x6b\xa2\x01\xd9\x1c\x3c\x0f\x74\x5f\x07\x1a\xc8\x66\x4f\x4e\xa2\x09\x04\x3d\xa4\x7a\x59\x95\x4d\x9b\xb7\x18\x0a\xa2\x57\x39\x7a\xf3\x9a\xca\xcc\xb0\xb2\x18\x02\xf0\x5e\xf8\x7c\x32\x4c\x87\xae\xf2\xbf\xaf\x47\x5b\x93\x1d\x10\x52\xa3\xd8\x77\xbb\xba\x1d\xa6\xf1\x75\xc8\x0c\x61\x3f\xee\xf6\xb8\xf6\x9b\xf7\xfc\xe8\x5c\x32\xaf\x56\x2f\x74\x14\x31\x1c\x98\x37\x88\xe2\x9c\xb7\x0b\x3a\x62\x1c\x69\xfd\x70\x17\x29\x3f\xfc\xc9\xd2\x68\xe4\x61\x3f\xfe\x8c\x6b\x7c\xe1\x24\xdb\xf3\x58\x40\xa5\x63\x97\x84\xb2\x45\x89\xd4\xdd\x37\x77\x55\x46\x12\x2c\x1d\xed\x65\x55\x96\x20\xdb\xc7\x4a\x9d\xbc\x07\xa6\x59\xc8\xd1\x95\x1f\xd1\x18\x3c\x56\x57\x48\x26\x85\x66\x8c\x22\x39\xfe\xc3\xe6\x7e\xef\xd8\x87\xbb\x99\x30\x6a\xf0\x98\xff\xa2\x4c\x64\xc4\x32\xf7\x6e\xb9\x86\x7b\x3e\x59\x68\x9a\x81\x20\xd2\xf9\xa1\x17\x34\xfb\x76\x50\x1c\x1a\xd5\x1b\xee\xc8\x61\xb7\x9d\x83\x3e\x60\x9b\x16\x3a\x4e\x98\x81\x15\x22\x83\xaa\x39\x7b\xea\xb5\xe8\x84\x46\x32\xf1\xd8\x05\x6c\x7b\xa5\xd3\x21\xb1\x29\x97\x0a\x04\xc8\x6c\xb4\x2e\xf2\x12\x46\x45\x69\x9d\x64\x0a\x25\x28\x4d\x3a\x64\x59\xcd\x8b\xfe\xa1\x0c\x46\x20\x5d\x7d\xba\xcd\xdb\x33\x16\xc5\xad\x61\xb5\x1f\xd4\xf7\x62\xe9\x94\x48\xc4\x7e\x6a\x4b\x23\x6a\x7b\x88\x47\xd6\x4e\xa7\x8a\x6a\xee\x9a\x8c\xf3\xa3\xff\x7b\x96\xea\x98\x8f\xc3\xbd\x9b\x41\xb5\x46\x73\x96\xc6\x86\xf7\xa0\x54\x83\xec\xbe\xe6\xb1\x49\xbf\xe5\x8e\x79\xc1\x41\xd4\xa7\x9f\x89\x67\x29\x5a\x98\x6d\x51\xbd\xf1\x11\xe1\xa1\xd0\x5c\xc4\xe8\xb3\x2c\x3e\x79\x51\x95\xa3\x35\x24\x88\x11\xc2\x45\x90\x50\x73\x3a\xdc\xf2\x96\x8b\x2e\x76\xba\xaa\x86\xd9\x9d\x93\x62\x2d\xeb\xbe\x12\x45\x5e\x4e\xf5\x59\x84\x96\x49\x84\xda\xa2\x9b\x97\xc5\xf2\x61\xfd\xdf\xab\xfb\xc5\xf6\xf9\x65\xed\x21\x75\x5a\x4a\x85\x3d\x12\x88\x2e\x68\x8e\xae\x32\x62\xf7\x73\xad\x44\xec\x68\x81\xd7\xb2\xb2\x6f\x79\xd4\x92\x3f\x1f\x5e\xe8\xce\x67\x25\xd8\x89\x25\xdf\xcb\x6a\xe5\xc3\x5f\x0d\x89\x99\xe3\xd2\xb3\x2c\x8e\x36\x4f\x0d\x82\x24\xda\xdc\xd0\xbe\xef\x45\xd0\x20\x53\xf4\xb5\x97\xdf\x56\x7f\xcc\x26\x54\x26\xd3\x09\x74\xe2\xf8\x64\x6d\x7b\xe8\x0b\xfc\xe7\x94\xd7\xa0\xba\x55\x65\x07\xe9\x88\xa4\x26\xf2\x84\x19\xa2\x84\x3e\x59\x3f\xbc\xb4\x0c\x02\xae\xc0\x16\x23\x90\x94\x69\x5c\xb4\xfd\x9f\xff\xed\xff\x67\xf8\x4a\x64\x10\x88\x18\x53\x80\xab\xa2\xc8\x8f\x0d\x18\x8f\xf6\x11\x15\x12\x7f\x55\xc3\x90\x41\x00\x11\x56\x1c\x6e\x78\xc9\x4b\x7e\xc3\x1b\x9f\x99\x90\x01\xa1\x31\xce\x49\xb3\x67\x4d\x7c\x49\x19\x10\x96\x1a\xc6\xfb\x4b\xb4\x02\xc2\x9d\x22\x7f\x1d\xa1\x02\x39\x52\x22\xc0\xaf\x7c\x57\xd5\xb7\x8b\xf5\x6f\xe3\x17\x40\x49\x4c\xad\x84\x5b\x4f\x3c\x24\x03\xca\x88\x23\x6e\x43\x3c\x6a\xdb\x0e\xd4\xfc\x26\xac\x29\x9d\x9b\x18\xa1\xff\xaa\x40\x56\x0a\xbc\x2d\xef\x13\x19\x32\x88\x68\xe4\xca\x58\x4f\x08\x3f\x99\x2f\x5e\xc8\x20\x4a\xa5\x1e\x66\x3c\x26\x08\x31\x3b\x8a\xd1\x04\xdb\x25\x9f\x6e\x57\x7f\xb8\x7b\x8e\xa9\xa1\x8d\x6a\xde\xab\xaf\x1f\xef\x1c\x79\x88\x6a\x7f\x50\xa4\x18\x63\x97\xa7\xc3\xe0\x63\x35\xfe\xb0\x4a\x11\xef\x5f\x94\xc8\x34\x33\x37\x0f\x65\x10\x83\xe1\xd4\xda\x77\x56\xb4\x39\x8e\x04\xf7\xc6\x0f\x91\x04\x06\x54\x63\xaa\xd2\x37\x50\x02\x6a\x2e\x4c\x58\x44\x65\x90\x72\x63\x5c\x1a\xae\x61\x57\x2d\x94\x9a\xe1\x02\x95\x41\x2a\x62\xc4\xba\xac\xfe\x58\x2c\xdd\x0d\xa7\x40\xa5\x7d\x9f\xdf\xd7\xcf\x97\x14\xab\xdd\x08\xa6\xad\x87\x8c\xfa\x8d\x83\x4d\x43\x06\x59\x64\x3a\x8b\xef\x8d\x5c\x6e\x8f\xf3\x96\x41\x96\x65\x78\x08\x10\x84\xef\xed\xd6\x9c\xa5\x97\x41\xa6\x52\xa3\xf8\xff\x5e\x7d\xb9\x0d\xb2\x59\x56\x23\x85\x78\x19\x88\x90\xa1\x7c\xa1\x11\x2a\xf4\x2f\x5d\x44\x29\xc6\xa7\x08\x3b\x7c\x3e\x09\x84\x52\xfb\x83\xdc\xd4\x0f\x2c\xa3\xc5\x28\xd0\xf7\x13\x4f\xa8\x00\xdf\x8c\x34\x2c\xd2\xb7\xb6\x83\xa6\xff\x05\x65\x24\xbe\xf8\xb1\x8b\x3b\x6f\x41\xd6\xe7\x63\x0b\xaa\x8b\x55\x7f\x9b\x4b\xbd\x9d\xa6\xcb\xbd\xff\xbf\xd9\x51\x97\xf7\x93\x60\x2a\x65\x28\xf6\x38\x3f\x97\x24\xe1\xd4\x54\x97\xbb\x90\x7c\xa3\x1f\xf9\xbf\xab\x1a\xb5\x9e\xfc\xcd\xcb\x24\x09\x4d\xe5\xd0\x4a\xf9\x19\x27\xa1\xb7\x17\x2a\x54\xf8\x85\xb5\xa5\xdf\x1e\xff\x82\x8a\x24\x26\x6c\x0f\x50\xcb\x53\xd1\xe3\x45\xdc\xd9\x20\x08\xba\x65\xb6\xb5\x77\xf7\x0e\x77\xa7\xf6\x54\xc3\xf2\xbd\xdb\xf3\x3d\x8b\x88\x0c\x34\xd3\xda\xee\xe6\x7b\xc9\x4b\x85\x6c\xaf\xfb\x63\x2e\x07\xbb\x8b\x24\x84\x47\x59\x4f\x36\x36\x0a\xf2\xfa\x04\xa1\x24\x44\x84\x69\xec\x78\x85\xf3\xe2\x6c\xbb\x16\x66\x5f\x12\x21\x02\x4c\xf4\x7c\xe0\x45\xb1\xf5\xb4\xf1\x92\xd0\xd8\x96\x1d\x31\x76\xfa\x8e\x1c\x77\x33\x41\x8a\x24\x34\xc9\x54\xcf\x38\x82\x00\xbd\x7b\xe8\xf3\xcb\xff\x43\xff\xd7\x0d\xcc\x52\xc4\xa3\x3d\x54\x4e\x71\x57\x12\xca\x53\xb4\x59\xa8\x9e\xc9\x92\xf1\xfb\x25\x94\x0b\xe1\xd5\x2a\xb1\xc5\xf2\xba\x36\x83\x24\x21\x15\x8e\xe6\xc6\x58\xe3\x4a\x23\xb8\x64\xc0\x1d\xeb\x3e\x3c\x09\x43\x86\x72\x3f\x3b\xe0\x87\x21\x2d\x8c\x24\xa1\x4e\x99\x5d\xd3\x8f\xfc\x27\x06\xb4\x5b\xcf\x51\x2f\x49\xc4\x8d\x6c\x1f\x2a\x77\xca\x7a\x00\xb9\xb6\x03\x58\x64\xfc\xd9\x16\x1a\xf4\x4a\x3b\x8b\xe3\x0f\x19\x22\x5e\x27\xb6\xb5\xab\x4e\x75\xc9\x0f\x56\x41\x16\xa9\x89\xa6\x48\x2c\x24\x2e\x25\x36\x46\x5b\x94\x6a\x0b\xed\x6d\xfe\x39\x48\x30\xce\x85\xf0\x23\xd6\x32\x49\x98\x8c\x1d\xcf\xb4\x82\x63\x9b\x0f\x38\x2a\xc7\x1b\x03\x89\x99\x69\xc6\x35\xfe\xa9\xf9\xda\xdf\x3b\x67\xc0\x3d\x41\x92\x05\x10\xf6\x97\xaa\xe1\x3f\x6a\x4c\xdd\x3d\xb9\x60\x22\x0d\x00\xcd\x75\x38\x1a\x23\x3a\x19\x03\x69\x60\x3f\xdb\x33\xcf\x4d\x3a\x63\x0e\x35\x24\x49\x1a\xaa\xd8\x66\x7a\x0c\x7d\xb1\xe5\x45\xae\xea\x66\x7d\x38\x16\xd0\xbd\xc9\xcb\x16\x6c\x49\xd2\x08\x92\xa0\xe7\x6c\x77\xf9\x5e\x7b\x34\x0b\x02\xa7\x50\xd6\xed\x11\x87\x4a\xc1\xe4\x77\x33\x1a\x23\x9c\x02\x67\xd3\xbe\xd2\xfb\xe7\x91\x91\x25\x59\x16\x86\xcc\xe5\xd5\x06\xd4\x7a\xa3\xaf\xc0\x85\x40\xc0\xde\xe3\xe2\x8f\xfd\xe2\xf5\x76\xbd\x1b\xe0\x02\x25\x11\x59\x88\x7e\xe7\x72\xf3\xb2\xfa\xa3\x47\xa3\x49\x22\x04\x27\x36\x43\xb6\xfb\x69\xa6\xf5\xe3\xf2\xc7\xc8\x09\x94\x44\x80\x00\x4b\x7d\xa9\xf2\x76\x65\xea\xc5\x0a\xf1\xac\x0f\xd0\x34\x77\x2e\x05\x41\xe8\x7c\x53\x92\x24\x92\x84\x86\x4a\x51\x4a\x38\xb6\xd8\x09\xd8\x45\xe2\x5d\xc4\x3b\x3c\x81\x5c\x9c\x27\x22\x54\x8c\x45\xec\xda\xee\xe1\x99\xba\xfb\x56\xb1\x21\xeb\x3c\x98\x06\xed\xf1\x59\xca\x12\x8d\x1c\xcd\xa2\x46\xfe\x9e\x3e\x89\x22\x89\x4a\x43\x2c\x5f\x18\x43\xb7\x83\x02\x8e\xef\x55\x09\x93\xcf\xaa\x74\xa8\xd1\xfa\x9e\x67\xed\x12\x70\x81\xa0\x88\xc6\x06\xa2\xc3\x55\xac\x05\x33\xdd\xb3\xd5\xe1\x70\x2a\xf3\xd6\xaf\x7e\x2d\x79\x82\x20\x65\xa4\x99\x2d\xc0\x65\x7f\xdd\x61\xa5\x75\xe0\xf8\x57\x71\xff\xdd\x9e\x9c\x2d\xa3\x01\x49\xd1\x34\xfc\xf3\x94\xcb\x8f\x41\x26\x4c\xd2\x20\x06\xb4\x29\x48\x85\x91\xff\x09\x7b\x54\xa1\x9b\x07\xe6\xbb\x8d\x8e\x06\x2a\x86\x9e\xf3\x76\x94\x5d\x1e\xbd\x4d\x1a\xe8\xcc\xc2\x8b\x8d\x51\xaa\x0e\xe3\x0c\x9b\xa4\x44\x84\xe8\xca\x1d\x51\xdf\xc6\xd0\x25\xcd\xce\x03\x4a\xb9\xc4\x17\x73\x8f\x82\x27\x9d\x07\xec\xa7\x22\xa5\x52\xc4\x26\x3e\x44\x46\xae\xc9\x89\x20\xac\x74\xfa\x04\x82\xf2\x77\x2a\x46\x92\x46\x34\x72\xb4\xdc\xae\x94\x7c\xa9\x72\xd2\x0d\x83\xd0\x26\x7e\x76\x7d\x34\x3a\x19\x94\x12\x82\x21\xf4\xef\xb7\x9b\xd7\xdf\xfc\xdf\x62\x8c\x87\x16\x28\x18\x34\x68\x27\xb9\x04\x56\xb9\x33\x94\x95\xb2\x46\xc6\xb4\x6a\x96\x2c\xdc\x0e\xcd\xd2\x18\xe3\x22\x93\xe8\x5c\xf2\x16\xde\xaa\x31\x97\x8a\xa4\x19\x4f\x31\x58\x95\x55\x29\x79\x7b\xd3\x7d\x9e\xa1\x8e\xe3\xaf\xff\xeb\xae\xa1\x38\xa5\x0e\x30\xa2\x60\x88\x21\x72\x23\xc0\xe8\x82\xe2\x4d\x5b\xd6\xb3\x6b\x37\xad\x89\x32\x22\xc4\xc7\xd7\xa3\x7b\x4d\x3c\x0c\x58\xec\x50\x00\xf9\xb1\x80\x97\xaa\x3a\x3c\xf2\x89\x21\xa6\x3c\x0e\x70\xe5\xe5\xcd\x0b\x70\xb5\x29\xfd\xee\x49\xb9\x0e\x1d\xc7\xca\x72\xb5\x19\x25\x18\x24\x15\x21\x75\x84\x4c\x3f\x20\x37\xbe\xec\xa4\x85\x53\x52\xc1\x43\x66\x90\xda\xed\xe9\xf8\xcf\xdb\xc5\x6f\xb3\x38\xa3\x6b\x5d\x32\xb3\xa9\x6c\x49\x65\x46\x8d\x8c\x37\x3f\x35\x56\x75\xb5\x0f\xb5\xe6\x67\xa4\xd4\x86\x5e\xb0\xcd\x0f\xb0\x2a\xf8\xd1\xf7\x75\x4b\xaa\xa2\xd8\x75\x2e\xf7\x94\x7b\xee\x98\xce\x98\xdd\x6c\xf7\xb6\x1f\x7a\xdf\xed\xb8\xf5\x81\x5f\xe0\x23\x24\x85\x28\x41\x95\xc6\x86\x7f\x42\x34\x06\xd1\x8c\xf6\x70\x0a\x89\x30\x32\x50\xfc\x82\xc8\xcd\x8d\x10\x12\x71\x24\x5f\x8e\x27\xf2\x91\xe7\x98\xee\xb2\x1f\xe1\x91\x97\xe7\x21\x84\xda\xfb\x8b\x54\xb3\x58\x0e\x31\x7f\x8b\xb7\x1a\xa0\x17\x1a\x9d\x48\xca\x4a\xaa\x93\x34\x4e\x7c\x61\xc3\xd6\x03\xc6\x37\xa3\xd3\x04\x5b\x1b\xd1\x91\xb8\x34\x16\x3a\xe5\xce\x89\x7a\x81\xa6\xf3\x2f\xc6\xe5\xc5\x7e\x19\x86\x41\x9c\x32\xc3\x7f\xd0\x44\x83\x4c\x8d\x0c\x83\xd4\x40\x88\x9b\x23\x94\xed\x55\x75\x35\x37\x18\x28\xea\x0f\xa8\xca\x15\x04\x71\x37\x98\x7d\x93\x61\xa0\x33\x47\xd9\x8a\xbf\x98\xff\x69\x3e\xdd\xb5\xfe\x37\x19\x92\x30\x72\x54\x27\xeb\xa6\xe0\xa5\x32\x2a\x84\xdb\x96\x4f\xfa\x71\x64\x48\xb8\x02\xe8\xcb\x07\x1e\x17\x6f\xb7\x30\x37\x0a\x02\x0c\x10\x9f\x56\xbf\x6f\x96\x9b\xf5\x53\xff\xf7\x08\xbb\xd6\xab\xe3\xb8\x80\x25\x43\x4a\x53\x03\x98\x42\x1d\x9e\x01\x23\x9e\x0c\xa9\x4c\x68\x0f\xc2\xb1\x56\x61\x5c\xb7\x90\x61\x94\xc5\xc8\x2f\xcc\x8b\xa2\xb3\x2b\xbb\xf3\x71\xfa\xd5\x42\x46\x4d\x77\xb6\x0d\x17\x2f\x82\x36\x37\x8c\xc7\x28\x4f\xfa\xb0\xf9\x81\xe2\x9f\xeb\xe5\x0a\x9b\xc1\x77\xfb\xe7\xd5\xcb\x72\xf5\xb4\x5b\xdc\x3b\xb7\x27\x64\x3c\x0b\xfa\x46\x29\x74\x3b\xae\x6d\x1c\xee\x0c\xe0\x98\x80\xc3\x54\xec\xda\x64\x65\x88\xbb\x5c\x62\xe9\x6b\x14\x14\xd0\x1a\x15\x81\xd1\x46\x18\x26\x71\x88\x95\xf6\xd5\x6e\x39\xd8\xd9\xc2\x24\x89\xd0\xdf\xf0\x29\xe0\xd9\xc2\xb4\x0c\x53\x6a\x5a\x03\x9a\xd3\x61\x81\x8e\x92\xcd\xd8\xe4\xc2\x5d\x29\x23\x24\x31\x69\x9a\xce\xc8\x28\x8b\x25\xf1\x9f\x22\x63\x21\x56\x43\x17\xdf\x17\xeb\x87\xc5\xcd\xc3\x6a\x7f\xb3\x79\x7a\xdd\xd2\xfd\xf6\xf5\xf9\xf9\xe1\x5f\x7e\x98\x0a\x10\x7a\xe1\x57\x64\x69\x68\xf7\xaf\x43\xa3\x64\x98\x01\xd3\xd0\x0b\xce\x1f\x2d\x79\x8f\x67\x1f\xf5\xef\x80\x13\xc9\x6d\x5d\x72\xed\x9e\x93\xce\x85\xea\x6e\x7c\x6a\xaa\x6f\xd2\x8b\xcf\x19\x29\xc8\x4b\xb0\xa1\x3b\x21\x8b\xd0\x56\x19\x51\x09\xf4\x42\x47\x02\xa9\xa8\xd8\x1b\xc7\xce\x61\x5e\x39\xbc\xd2\xf8\x5d\x73\x09\x8e\xe4\x6c\x71\x3c\x4e\x0e\xca\x30\xc3\x20\x6b\xb7\xbc\x75\xe9\x9a\x50\x4a\xad\x86\x2f\xcd\x70\xfd\x34\x7b\x5d\x57\x07\x2f\x85\x79\xe5\x96\x15\xe1\x18\x0e\x1a\x3d\xc1\x09\x71\xd4\xbc\x49\x51\x54\x60\xbb\xd2\x63\x5e\xe6\x8f\xb0\xae\xeb\xef\xd0\xdc\xe6\x9f\xe3\x4f\x34\x4d\x50\xcc\x50\x4b\x0f\x2c\x71\xa8\x22\x8a\xf5\x01\xdf\xdc\x91\x0f\xad\xf0\x5f\x52\x5d\xcc\x70\x9a\xc8\x50\xc5\x06\xdc\xbe\x1f\xa2\x29\x16\x45\xb1\xa8\xdf\xae\x92\xbe\x4e\x1f\x95\xc7\x08\xe7\x59\xcb\xca\x5a\x9d\xed\x04\x5b\x20\x43\x90\x42\x98\xa5\x27\x4e\x6f\xfb\x2f\x27\xfd\x21\x43\xd0\x71\x6a\x7b\x83\x9f\xeb\xea\x90\x17\xde\x0b\x0f\x75\xcc\x54\xff\xb8\xea\xe6\xfc\xd8\x1f\x4a\x18\xb6\xbf\x2c\x14\x3f\x0c\xcd\x7e\x14\x70\x4d\xd0\x95\x2e\xd1\x84\xed\x4c\xf3\xcc\xf8\x66\x22\x12\x45\x46\x67\x07\x4d\xf8\x28\xfe\x9f\x0c\x64\x69\xe0\x91\x22\x4d\xb7\xb9\xfe\xc5\x4b\x76\xe7\x65\x5a\xa5\x13\x08\xe8\x85\xcc\xaf\x8c\x08\x18\x11\xb6\x75\xa9\xaa\x7f\x80\xb3\xb5\x11\x0d\xb4\x9a\x20\xce\xaa\x53\xdb\x7d\x97\x9b\x09\x89\xa5\x8c\x68\x14\x3a\xf5\xee\x2d\x2f\x78\x7d\x9e\x9f\x60\xb3\xd3\x3a\x8a\xac\x42\x01\x57\x6a\x2c\x1e\x7e\x01\xac\x9f\x7f\xcc\x48\xd8\xfa\x19\x7e\x20\x43\x19\xd2\xdd\xe6\xd5\x79\x33\x3e\x9d\x45\x12\xc1\x58\xab\xdb\x97\xcd\xb3\x7b\x78\x26\x32\x64\xcd\x90\x03\x85\x87\x25\x32\x91\xb7\x30\xcc\x9f\x46\x4c\x18\x0c\x9b\x38\x9d\x9f\x07\xc8\x41\x77\x54\x05\xa9\x35\x0f\x58\xad\x9e\x6b\x15\x94\x11\x03\x9a\xd8\x64\x0e\x6e\x89\x76\xd4\xcd\x79\x48\xca\x3c\x5e\x40\xc4\x9e\x1a\x07\x19\x5a\x31\xc3\xd0\xf2\x52\x15\x70\x01\x72\x1e\xff\x56\xcc\x93\xd8\x76\x8c\xae\x15\xf0\x66\x9b\x97\x12\x1e\x78\x63\xc1\xe3\x93\x3b\x8b\x65\x8a\xef\x66\xf7\x55\xad\x7e\xbe\x9c\x9c\xd2\x9b\x8c\x62\x95\x21\x92\xa7\x3c\x1d\x50\x5f\xc1\xf4\x04\x7b\xe7\x33\x4a\x44\x88\x19\x5d\x97\xd5\x34\x68\x32\x57\x8d\x93\x51\x02\x0c\x23\x1d\x2b\x93\xb8\x28\x15\x92\xb7\xfd\xc5\x84\xf9\xb5\x51\x19\x46\x21\x51\x9a\xc9\x4c\x8c\xc4\x59\x8f\xd3\x9c\x4e\x94\x85\x06\xe1\xc0\x0d\xaf\xd3\x79\x58\xe3\x94\x11\x0f\x83\x01\x0d\xcb\xb2\x3a\x1c\xaa\x72\x08\x69\x9e\x96\x22\x22\x11\x12\x82\xbe\xf8\x7b\x5e\x2b\x83\xfd\xf3\x04\x9f\x32\x12\x1c\xd0\xf0\xe3\x6e\x62\x01\x4d\xe3\xdb\x11\x32\x88\xa1\xe7\x2f\xf3\x11\xda\x78\x94\x8c\x0c\x38\xd8\x74\x49\x0f\xb5\x2b\x26\x5f\x5a\x51\x89\x01\xe6\x84\xbf\x60\xcc\xe1\x75\x59\x7d\x94\x11\x48\xc0\x8c\x34\x6e\xfa\xfb\x70\x7f\xbb\xf8\xd7\xd6\x3d\x05\x80\xf1\xae\xaa\x4f\xa8\x79\x51\xec\xf8\x07\x94\x03\x1c\x86\x8c\x74\x1c\x4a\x53\x72\x3a\xee\x0f\xdc\x76\xd0\x48\x16\x50\x93\x14\x83\xf6\x7d\x57\xdd\x58\x49\x02\x71\xea\x93\x16\x2c\xe0\x1a\xad\x10\x37\xe0\x0e\xf7\x67\xa2\x05\xf6\x6d\x6f\xb1\x96\xe9\xfc\x62\x7f\x16\x8d\x0d\x9b\x59\xeb\x58\x94\x8b\xb3\xe1\x48\xed\x47\x48\x86\x8a\x45\x88\x2e\x30\x60\x24\x4f\x43\x6a\x87\x84\x61\x88\xb8\xf5\xba\x73\x3d\x25\x92\xab\x1a\xe1\x7d\xe8\x73\xec\x2c\xcc\x02\xac\xd7\xe9\xce\x53\xb0\xa5\xf3\x31\xf7\x9b\x64\x51\x90\xa1\x34\xe8\xf3\xe6\x6e\xf3\xb8\x71\x67\x46\xc4\x28\x15\x7e\xe6\xf0\x15\xd2\xfe\xaf\x20\x5c\xaf\x6f\xe7\xae\x9c\x07\x99\x1f\x16\x51\x9e\x18\x7a\xe8\x47\xfe\x33\x3f\x9c\x0e\xf7\x15\x2f\x5e\x80\xcb\xf7\xfe\xc1\x22\x2a\x91\x98\x6c\xf1\xb0\x1e\xee\x3d\x2c\x4a\x0c\xd7\x46\xe3\xa5\xae\xe6\xf2\x0f\x2c\x52\x19\x66\x6c\x8b\xaa\x7c\xb3\x4e\xc8\x64\x04\x63\x01\x2e\x0f\x93\xda\x19\xcc\x65\xc6\x58\x12\xf7\x22\x36\x9e\xd4\x62\xd6\xbc\xb3\x38\x36\xa4\x48\x6d\x75\x54\xd5\x57\x89\x4b\xbd\x79\xaf\x4e\x57\xbc\x1c\x96\x04\xdc\x79\x7e\x3d\x03\xce\x6f\x93\x7e\x9e\xde\x1d\x61\x49\x42\x6d\xde\xf3\x03\xca\x9e\x0f\x72\xd4\xe0\x25\x59\x22\x89\x69\xbf\xac\x8e\x67\x4c\xe3\xff\xe5\x3a\x60\x89\x0c\x91\x12\xa7\x84\x9f\xed\xba\x3c\x9e\xda\xe7\xba\xd2\xb9\x9f\x10\x89\x62\x18\xad\xc1\xb1\x92\xef\x9d\x05\x75\x07\xd2\x30\x0d\x0c\x8d\xdb\x49\x14\x70\xae\x4e\x35\xf3\x87\x58\x42\x2c\x02\x06\xea\xce\xe7\x7c\x84\x75\xd3\x9c\x5c\x57\x7a\x5d\x7d\x29\x6d\x04\x7e\x67\xe1\x01\x7f\x3b\xaf\xf0\xf7\xce\x1a\xbf\xf7\x2c\x8c\x75\x60\x9b\xdc\x2c\xcf\xee\x00\x2f\x2e\x59\x16\x87\xe8\x85\x3c\xe5\x25\x3c\xec\x6e\x2d\xa3\x89\x7b\xb2\x2c\x11\xae\xa3\x76\x51\xe6\x07\x5e\x0c\x21\x84\x92\x71\x4a\xb0\x8d\x69\xbd\xdc\xec\x0d\xff\x96\x3b\x91\xf3\x08\x13\xdb\x05\x6f\x0c\x2f\xc9\x5e\xd3\x2e\xb6\xdb\xdb\xbb\xf3\xe3\xa4\x70\x20\xd5\x4d\x8d\x14\x1d\xa3\xd4\x15\x13\x41\x84\x10\x84\x4f\x93\x6d\xcf\xab\xf2\x99\x37\x53\x9e\xb4\x6e\x58\x1c\x53\x47\x17\xa6\xe0\xe7\xcd\x79\xeb\xd2\x6c\xfd\xab\x10\xa9\x61\xcb\xc3\x64\x3f\xf2\x9b\x0d\x44\xe7\x26\x43\x65\x84\xbc\xb8\x2f\x5c\x8d\xde\x87\x90\x1c\x69\x20\x5f\xcb\x5c\x56\x75\x79\xc9\xc4\x2d\x99\xd0\x59\x4c\x1c\x62\xc5\xf6\x8e\x62\x30\xe2\xae\x21\x43\x08\xe2\xbe\x24\x8f\x02\xf4\xd8\x62\x7c\x25\x1b\xc4\x64\x16\x27\x7d\xb5\xd9\x74\x67\x98\x9e\x2b\x50\x97\xec\x31\x92\x29\x92\x46\x96\xc8\x64\x7d\x3b\x3d\x96\x09\x8c\xd4\x0e\xae\x7d\x6d\xdb\xc2\xf4\x3d\x29\x1d\x62\xd1\x77\xf5\xf3\x08\x75\x8e\x85\x8d\xc2\xe2\x51\xff\xee\xce\x3d\xeb\xcb\x33\xa5\x35\x3a\xd6\x0f\x55\xdb\x56\xce\xef\xfa\x75\x21\x95\x69\x09\x2a\x72\xaf\xf3\x85\x7f\x78\x6b\xa5\x21\xa0\x96\x3d\x62\x04\xcb\x1e\x55\x92\xfd\xd8\x30\xca\x86\x89\x8f\xf2\xbc\x6d\xf9\x07\x0c\xab\xc4\xbf\x40\xa6\xb9\x70\x34\x0e\xa8\xc2\xbc\x0f\x1a\x56\x7c\xf5\xd8\xfc\x71\x2c\x72\xbf\x55\xc6\x41\x98\x28\x6b\xa8\x05\xc7\xb4\xc7\xdf\xe8\x5d\x18\xdf\x6f\x1c\x44\x0c\x9d\x94\x23\x92\xf6\xa2\x2d\x99\x37\xab\x71\xc0\x18\xfa\x1f\x37\x9b\xd7\xa7\xdd\xbf\xc6\x8b\x30\x26\x24\x8e\x1c\x71\xef\x79\x7b\x84\xfa\xe0\x8f\x44\x2c\x36\x8d\x03\x5d\x54\xb5\xac\xc7\x1d\x59\x32\xa6\xd4\xf0\x95\x35\xb6\x76\xd6\x0c\x56\xca\x95\x78\x6d\xe6\x75\x51\xc5\x71\x29\xa0\x73\xd4\x39\x94\x0f\xf9\x65\xd2\x35\x0e\x79\x4c\x6d\xfd\xf9\x2e\x2f\x70\xcc\x37\x70\xdd\x02\x32\x0e\x75\xe0\x62\xf1\x2d\x6f\x37\x5f\x17\xe7\x47\x71\x88\x29\x41\x28\x4d\x99\xa5\xdf\x44\xe2\x28\x61\x56\x6d\x08\xf1\x03\x8d\xad\xbe\xdd\x3a\x99\xc3\xc9\x95\x98\xa5\x40\x3f\x35\x60\x71\x85\xe3\xe3\x31\xe1\x18\xf9\x1f\x0c\x4b\xf4\xdd\x2c\xe9\xbb\x8c\xe3\x38\x55\xc2\xca\xce\xec\x79\x59\x95\xe7\x43\x75\x6a\xf6\x53\xc4\x8b\x1b\x9d\x28\x07\xa6\x33\x06\x3a\x87\x66\x18\x8b\xc4\x71\xa6\x70\x05\xac\x4a\x55\xd5\x43\x6b\x14\xa7\x99\x0a\xed\xa9\x37\xa8\xb5\x61\xbb\xfa\x7b\x68\x46\x9c\x85\x92\x27\x6e\xf9\xf8\x84\x71\xf7\x9e\x88\x1f\xc2\x29\x92\xf7\xb6\xc0\xeb\xdb\xea\x6b\x62\x0a\xe3\x8c\x73\xdc\x2f\xb7\x27\xc5\xcb\xfb\xca\xc8\xd4\xf4\x9d\x9b\x7f\x6b\xe5\xc7\x82\x48\x61\x77\xff\x39\xdf\xf6\xca\x32\x10\x89\xc6\xb8\xde\xd8\x4f\xfb\xf1\xbc\x9a\xf0\x6b\xa3\x1c\x11\xe3\x95\xd3\x33\x81\x4d\xfa\x65\xd5\xc2\x08\x3a\x2e\x63\x21\x8c\xa2\x02\xbe\x96\x21\xd2\x6a\x5d\x7a\xe5\x50\x19\x0b\x8b\xfd\x36\x20\x62\xb4\xbe\xf5\x4d\x4f\x1b\x34\x7d\x46\x6d\x00\x03\x9d\x63\x71\x83\x10\xaf\xb5\x9f\xc4\x32\x90\xb8\x4c\xb1\xdf\xd9\xff\x31\x04\x88\x7c\x2e\x7b\x67\x59\xc8\x27\xaf\x5f\x29\xc2\xa8\xc7\xd6\xbc\x54\x45\x71\x7b\x51\x9a\x8a\xbb\x50\x9f\x7a\x42\x51\x04\x68\x71\x0c\x69\x6e\xce\x28\x4e\xda\x56\xf5\x1d\x5c\x9c\x94\x49\xec\xc8\xde\x3f\xae\x9f\xd6\x8f\xaf\x8f\xfb\xdd\xe2\xe5\xbe\x37\x1e\x3a\xcc\x10\x3f\xb2\xab\xf3\xb7\x37\xa8\x97\x55\x55\x74\x8e\x9e\x3f\xac\x0d\xf4\xe6\x71\xb1\x7e\xc2\x1e\xf4\xa5\xeb\x3e\x90\x49\x10\x65\x98\xaa\xe4\x65\x79\xe2\x85\x91\x3d\xeb\xb6\x11\x0f\xd3\x96\x49\x10\x73\x8c\xc4\xbf\xe7\xb2\x1d\x09\xe1\xcb\x24\xe0\x22\x70\xdd\x80\xdd\xe7\x71\x25\xe5\x67\xa8\x6f\xf9\x79\xfe\x5b\x27\x24\x4d\x32\xd2\xf3\x84\x9c\x8a\x4b\xa4\xc6\xaf\x6d\x6e\x42\x94\x40\x16\xbf\xaf\xaa\x2e\xd4\xf2\x74\x34\xc5\x81\xce\x51\x70\xce\x7d\x42\x03\x86\x98\xa5\xc5\x5b\x9d\x23\x7c\xd3\x32\xf8\xf7\xeb\xad\xfb\x0e\x06\x53\xc2\xdb\x9e\x92\xd3\x1e\x0b\x03\x89\x74\x91\xb9\x21\x34\xdd\xe6\xe5\x5b\x01\xb3\xdc\x71\x32\x09\x21\x42\xb2\x86\xe6\x8b\x1f\x47\x6f\x27\x62\x11\xce\x24\x43\x46\x6e\xbb\xfb\x95\x3f\x1a\xc7\x0c\xdc\xbc\x7e\x00\xae\xa0\x46\xfe\x1e\x17\x14\x25\x4c\x53\x63\x9b\xfa\x76\xaf\x79\x20\xb6\x4c\xe2\x00\x90\x8e\xe1\x9d\xd7\x6a\xc9\x8f\xb8\xe4\x07\xd1\x4c\x12\x2b\x89\xfd\xb0\xbc\x0b\x43\xee\xaa\x7a\x09\x75\x9b\xeb\x5c\xce\x15\x2c\xe6\xc0\x99\x49\xac\xb9\x70\x64\xa4\xc7\xaa\x1d\x56\xad\x93\x04\x98\xa5\xef\x41\xb6\x11\xb3\x09\x0d\x05\x3b\xec\xb8\x34\x11\x82\x0f\xac\xe7\x0e\x0e\x47\xab\x02\xed\x2e\x95\x65\x1a\x7b\x31\x3a\x13\xd9\xdd\x63\x85\x9f\x6e\x02\x97\x4a\x32\x61\x92\xe7\x36\x4c\xbf\xaf\xab\xd3\x24\xf1\x9b\x64\x92\x82\xa5\xb4\x44\x23\x36\xcd\x8d\x5e\xf9\xd7\x9d\xad\x82\x38\x1b\xf4\x41\x8f\x90\x3f\x09\x17\x80\x09\xa7\xcd\xf3\xea\x69\xbb\x79\x7d\x59\xae\xac\xca\xb3\x1f\x20\x09\x3e\x68\x01\xa5\x1a\xc2\x62\x12\x91\x9a\x64\x94\xe4\x45\xf1\x90\x8b\xed\x34\x8b\x97\x08\xa1\xd0\x8a\xbd\xf3\x06\xbb\x16\x3b\x8f\x6f\x2c\x7b\x27\x13\x29\x34\xf7\x50\x8a\x51\x57\x9a\x4c\x94\xce\x7a\x12\xbd\x91\x16\xf3\x20\x33\x93\x00\x4b\x8c\x07\x8e\x84\x24\xcf\x50\xe7\x95\x9f\x95\x90\x1a\x0d\x30\x47\xa0\x7f\x53\x55\x1f\xd3\x6d\x3c\xd1\x32\x45\x21\x38\xc1\xcb\x0f\xa8\x0f\xd8\x5d\xfa\x02\xff\xb1\xd7\x48\x83\x20\x64\xae\x23\xb4\x1a\xeb\xdc\xca\x34\x20\x0a\xb1\x70\x8f\xe7\x7f\x3d\x2c\x67\x43\xc0\xd3\x05\x34\x29\x0d\x38\x07\x23\xce\x5f\xb4\x43\xca\x79\x99\x12\xa0\x48\xf2\x75\xcb\x6b\x28\xbf\x9d\xdc\x7e\x90\xd2\x38\xf3\xcc\x12\x76\xfa\x0c\xc4\xce\x65\x1a\x32\xb3\xab\x6c\xa1\x6c\xfa\x3f\xc6\x19\x36\xfc\x1d\xac\xcb\xb9\x29\x5d\x1c\x36\x7e\x86\x88\x51\x4c\xec\xd4\x16\xfb\xfc\x9b\xff\xbb\xa1\x05\x31\xa2\x66\x67\xa8\x6f\xa6\x85\x4b\x37\x30\x56\xd8\x94\xb3\xf1\x46\x3a\x8d\x20\xc1\xc2\x3f\xc6\x18\xca\xc2\x0c\x5f\xb7\xb7\xee\x38\x23\xc6\xd4\xe6\xad\xc4\x1a\x8f\xff\x3b\x8b\x89\x97\xb5\x79\xa9\xaa\xc3\xc2\x15\xa7\x26\x8d\xaa\xce\xd5\x4b\x99\xc8\x10\x1e\xf8\x95\x97\xaa\xfa\x22\x63\x8f\x28\x8d\xc1\x04\xa1\x9d\x43\xfc\x5a\xe6\x63\x82\x65\xd9\x85\x65\xb8\x5f\x38\xb2\x89\x7e\xff\x1a\xf7\x38\xdb\xe1\x29\x63\x98\xc9\x12\xd8\xc0\x74\xc8\xcb\x1e\x1d\x38\x7e\x23\x29\x18\x50\x4c\x17\x5c\x2e\x5e\xdc\xcd\xf0\x40\xc7\xcc\x6f\x15\xfb\x37\x7e\x80\xbd\x9a\x30\x1a\xc9\x54\x04\xb6\x1c\x52\x00\xf7\x45\xa7\xc5\x0c\xc7\xf6\xac\x5f\x9e\x0a\x99\xa0\xf8\x8d\x1e\x96\x7c\x47\x13\x3e\x45\x54\xb2\x31\x27\xb6\xe8\xd3\x6d\xd2\x4a\xf0\xcb\x76\x95\x69\x06\x60\x10\x83\xa7\x8a\x04\xf8\xd9\x9b\xbc\x8b\xa7\xb6\x27\x31\x25\xd7\x97\xa9\xa2\x71\x66\x9a\x21\x44\xf5\x13\x71\x96\xe3\x3b\x51\x34\xe6\xca\xbf\x91\xf5\x72\xd3\x23\x1d\xaf\x60\xb6\x52\x80\xc8\x08\x2b\x57\x85\x32\x09\x56\xe7\x4f\xa6\x9a\x72\xb0\x19\x87\xd5\xcf\x63\x91\xcb\xbc\x1d\x31\x34\x18\xf8\x7d\x1c\x79\x70\x66\xaa\x85\x88\x4c\xfd\x86\xb7\xef\xb7\xbc\xe5\x7b\x4d\xdc\xa6\x9b\x05\xa1\xc9\xa8\x71\xa5\x96\xef\xa7\xf2\x83\xed\x2a\xcf\x29\xef\xc7\x44\x80\xb6\xf5\x8b\x7f\xc2\x92\x1f\x43\xff\x77\xab\x89\x58\x5b\xd2\x5e\x50\x08\x95\x9e\x42\xef\x33\x92\xc6\xa9\xb6\x52\x02\xbb\x6a\x7a\x50\xc4\xb8\x00\x4d\xb9\xc7\xb9\x90\x19\x01\x8e\x52\xe3\xcf\xdd\x9a\x34\x82\x58\xce\x1d\x1d\x4e\xa4\x8c\x0a\xa3\xdc\x88\x5e\x5e\x79\xbe\x90\xd2\x74\x4b\x28\x0b\x75\x82\xa0\x1f\x0d\xf0\x8c\xf5\xdb\xce\xfe\x8d\x50\x34\x76\x60\x24\x22\x64\xd4\x50\xd5\x33\x3f\x5f\x2b\x1a\xb9\xb1\x10\x39\xb3\x69\xb2\xb3\xed\xc4\x76\x66\x8c\x98\x9c\xfe\x3f\x4e\x4d\x9b\xeb\x33\x32\x21\x75\xdb\xc3\x8f\xbc\x2d\x9d\x5e\x59\xea\xc7\x1a\x19\x2e\x74\x2f\x36\x9f\x50\xb7\xef\x75\xf5\xe5\x76\xda\x8c\xc5\x11\xf2\x81\x8a\xd3\x05\xbe\xec\x5a\x09\x60\xfc\x64\x2c\x0b\xd0\x4e\xec\xb7\xbb\xc5\xcb\x6e\xec\x90\x66\x31\x8b\x30\x7b\x7a\x57\x79\x3e\xbd\x61\x75\xc1\x8e\x4a\x78\xe4\x54\xa2\xd1\x7b\x7c\x2d\xf1\x65\xfa\x90\x6f\x84\x98\xc9\x12\x95\xf5\x79\xa3\x89\x59\xca\x12\x08\xe3\xd8\xc1\x1a\x0c\x26\xd4\x1e\x49\x63\x82\x5e\x94\xc9\xa1\x3e\xc2\x2d\x9f\x4e\x9a\x34\x15\xa6\xb1\xab\x28\xaa\xaf\x1f\x55\xfd\x01\xf5\xae\xf2\x81\xc6\x05\x54\x64\xf2\x1e\x32\xca\x79\x60\x5a\x41\x7a\x6b\x9d\x65\x69\x86\x19\xc8\x2d\xff\x04\xd4\xb3\xb1\x7f\xe7\x84\x39\x20\x39\xe6\x0b\xfa\xbf\x67\xd8\x0d\x97\x63\xf4\xfe\x05\xca\x00\xf0\xc7\x3f\xc5\x89\x42\xc2\xb7\x2d\xd7\xe0\x0a\xd5\xcd\xee\x65\x35\xa4\x2c\x96\x19\x97\x19\x4a\x67\xe6\xb2\x2a\xf3\xff\x74\xc6\x6c\x53\xbe\x55\x9e\x29\x43\x66\x1c\x0c\x65\x4d\x67\x93\x27\xac\xf1\xe3\xe9\x26\x62\x15\x3b\xdd\x91\xfc\x00\xbe\x50\x85\xd8\xf8\xc9\xbd\x09\x91\xe0\x6b\x2e\xab\xdf\x07\x3f\x25\x63\xc0\x82\xcc\xfe\x70\x76\x9e\xf4\xd0\x95\xca\x54\x4c\x99\x70\x0b\x2e\x2f\x5b\x9e\x97\x46\x9b\xc4\xe7\x05\x32\x05\x80\xb1\x8d\x71\x48\x9c\x56\xa5\xea\xa6\xfd\x2d\x48\x93\xe7\xec\x87\x6a\xdd\xc3\xc0\xa1\x28\x66\xb0\x81\x19\x24\x1c\xb3\xe1\xbd\xfc\xb8\xd9\x4f\x7f\xb9\x49\x64\x90\x09\xee\x27\x09\xa2\x3d\xdd\xaf\x82\xc8\x70\xf7\xd9\x89\xaa\x54\xa4\xff\xab\x21\x99\x71\x73\xdb\xa1\xd8\x86\xa5\x9a\x4c\x07\x31\x02\xf5\x5c\xc9\xfd\x91\x77\x41\xd8\xc5\x8e\x32\xb4\x51\x3c\xb0\x98\x88\xdd\x57\xf5\x8c\xf2\x32\x57\x19\xba\x47\x2b\x84\xd3\x44\x61\xb8\xd1\x40\xfb\x7d\xff\x12\x8d\x5f\x0a\x8f\x22\x11\x66\x3e\xe5\xbf\x29\xe1\x92\x7d\x56\x72\xa6\x09\x7a\xe7\xb6\xb8\xdf\xb9\x86\xf6\x49\x78\x1c\x04\x68\x78\xf3\xe6\x91\x1f\x8f\x13\xbb\xca\xe3\x80\xa5\xa6\x24\x55\x6e\xc1\x73\xaf\xf4\x7c\x1c\x92\xc7\x09\xa0\xed\xdb\xdb\x26\x70\x68\x3a\x13\xd0\xfe\x36\x53\x15\xe0\xb1\x0e\xb1\x89\xde\x25\x69\xfa\xa6\x5e\x94\xb9\xe8\xee\x39\x73\xb7\x9c\x04\xa1\x32\xbd\x04\x6f\xdb\x9e\x9e\xbf\x0b\x6e\x67\x3f\x33\x4f\x42\xaf\x65\xf1\x78\xde\xb6\x95\x97\xc3\x96\x3c\x11\xd2\x25\xb7\x7e\x54\x7d\x98\xc6\xd3\x40\x60\xcf\x24\xbe\x31\x38\x54\xe5\x0b\x2f\x3f\x0c\xb0\xeb\xd7\xa6\x83\x67\x14\x84\xa1\x2f\xb3\x8c\xa1\x0f\xf9\x7f\x4e\x36\x75\xee\xae\x9e\xb1\x88\x58\x42\x92\xea\x13\xea\x6d\xfe\x56\x0e\xc2\x99\xd1\x7b\xc9\xb4\xc2\xc5\x04\x2a\x6f\x2d\x4b\xd6\x8c\x67\x3d\x8c\xaa\xfb\xed\x82\x73\x16\xd3\x60\xc0\x5b\xf3\x03\xe0\x43\x0d\x42\xf8\x81\x53\xc7\xb9\x00\x35\x60\x90\xba\x05\x50\xbd\x3e\xf0\xe8\x96\x84\xce\x42\xed\x93\x1d\x4d\x4f\x64\x23\xb9\x8c\x19\xb5\xf3\x11\xd1\xfe\x26\xdd\x32\xff\x55\x64\x9c\x21\x0e\x3c\x2f\xdf\xa1\xce\x5b\x50\xcf\xa7\xfa\x0a\x2a\x8f\x4b\x48\x02\xbb\x4d\x18\xda\x96\xee\x16\x9f\x79\xae\x5e\xa6\x82\x8d\x92\x4b\x4d\x32\x3e\xf0\xfc\x50\x2c\x17\x5b\xa0\x26\x03\x81\x4a\x61\x1d\x7b\xcb\x95\xf9\x5c\x77\xbe\xd9\xf8\xa7\x01\x82\xd8\x56\x0b\x30\x7e\xb8\xcd\x1b\x71\xaa\x1b\xcc\xa7\xcc\x36\xa7\x71\x00\x4e\x6c\xe3\x0a\x2a\x2c\xba\x97\xa3\xc3\x8c\xf8\xdc\xc0\x22\xaf\x6f\xeb\x6a\x94\x5a\xe0\x9a\x47\xc8\x76\xb4\xe5\x3f\xab\xc9\x01\x70\xcc\xa3\xcb\xaa\x0b\x02\x4d\xc1\xf5\x7e\x4a\x56\x29\xb9\x06\xc0\xf4\xc7\x47\x5e\x14\x0e\x15\x61\x0e\x89\x80\x18\xf1\x8e\x86\x17\x70\xa1\x11\x2e\x45\x10\x52\x69\x3b\x12\x9f\x2a\x05\x26\xfe\x1e\x7e\x77\x11\x44\x0c\x6d\x62\x17\x87\x2e\x11\xc9\x6c\xe5\x04\xc2\xd0\x40\x9a\xed\x38\x42\x8d\x50\x6c\xde\x6c\x2b\xdd\x4a\x7e\xdc\x94\xfe\x90\x0c\x10\x5d\xb9\x7c\xaf\xbe\x06\xa9\x0c\x41\x93\x14\xe1\xfa\x9d\x3f\xb1\x10\x63\xc9\xde\x91\xc5\x13\x21\x11\x08\xb7\xce\x1b\x4b\x4a\xe4\xfe\xce\x54\x10\x7b\x3d\x23\x17\xbe\x98\xb8\xc1\x42\x4b\x46\x6f\x4a\x84\x71\x10\x1b\xfc\x91\xcd\xa4\x3e\xe6\x83\xa0\x5b\x84\x5a\x23\xdb\x99\xf1\x30\x9c\xf7\xe2\x5e\xe9\xb5\x02\xe1\xf8\x27\xa2\x18\x1c\xd2\xf5\x47\x55\x37\xed\x92\x37\xc8\xa0\x6b\x74\xfd\x27\xf7\x13\x25\x89\xcd\x1c\x7d\x40\x39\x92\xff\x91\x22\x4a\x8d\x18\xc9\x48\x17\xbe\x4f\x6f\x39\x0f\x56\xb0\x2c\x0c\xb8\x49\x7e\x21\xdb\xc6\x0c\xbf\xa2\x14\x31\xd7\x9e\x3f\x61\xf1\x09\xdd\x07\x5c\x2f\x37\x88\xa5\xfc\x1d\xce\x33\x9b\xab\x48\xc0\x30\x4c\xb6\x60\xf1\x58\x8d\x95\x04\x72\x97\x4c\x74\xea\xc4\x52\xdc\x4a\x42\x54\x93\xc7\x23\xe4\x55\xf9\x8d\x37\xef\x9d\x39\xbf\xab\x6a\xb7\xc1\x88\x94\x18\xf2\x5e\xdb\x0a\xe2\x5d\x73\x87\xad\x70\xe3\x32\x66\xe0\xea\xc7\x53\xf3\x7e\xa5\x76\x20\x32\x46\x1d\x26\xe8\x26\x57\x2a\x2f\xdf\x2e\x88\xee\xa4\xc8\x54\xc4\xfa\xb6\x0a\x63\x4a\x36\xba\x97\x3e\x30\xa9\xd2\xfa\x4a\x21\x50\xf0\x20\x44\x62\x88\xc7\xf5\xd3\x6a\xe1\x6e\x8e\xcb\x18\xeb\x07\x5f\x79\x89\xf6\x63\x12\x04\x0b\xae\xb2\xc4\xba\x43\xab\x52\xad\x65\xe5\x34\x2e\xc7\xc3\x24\xa1\xb8\x0f\x1f\xf6\xdb\x47\x17\x2a\x0b\x49\x24\x2e\xe7\x5b\x23\xb8\xf3\xf7\xd2\xf6\x42\xa6\x11\x37\x6d\xe3\x79\xd9\x60\xf1\x4a\x3d\x7e\xf8\x97\xa9\x78\xe0\xd4\x2f\x7c\x15\x61\xed\xba\xf4\x27\xef\x0b\x12\xa9\x2d\x43\xeb\xba\x6c\x4e\xc8\xcb\x60\x73\xae\x57\xb3\xbb\xb3\x8a\x2a\xf6\x7a\x9a\xc4\x58\x4a\x79\xaa\xea\x83\x05\xb3\xa7\xee\x10\x8f\x5c\x98\xb9\xed\xac\xd7\xe5\xec\xd6\x10\x2a\xe6\x32\x02\x56\x97\x7b\x92\xe2\x95\x81\x94\xe8\x4d\x5f\x04\x04\x32\x00\xe3\x96\xf9\x8a\xda\x5d\x55\xf7\x29\xd5\xd1\x0b\x94\x44\x2b\xdc\x6e\xba\x68\xbc\xe8\x8e\xbb\x64\x90\xa4\x61\x12\x06\x43\x14\x88\x9c\xa4\x91\x24\x4d\x32\x69\x17\xfd\x37\x5e\x74\x86\xac\xf7\x7b\x65\x18\x1a\x29\x77\x33\xff\x3c\x4e\x97\x17\xb3\x3b\x89\x8c\x28\x18\x5d\x76\x5e\xab\x66\x2f\x8a\x13\xec\x71\xf3\x70\x77\x13\x85\x99\xec\x69\x7d\x6c\x63\xda\x7d\x55\xa1\xdb\x64\x9d\xea\xf9\xdd\x57\x32\x1a\xe2\xac\xbc\x2b\x38\x26\x7e\x3b\xff\x7e\x32\x22\xf4\xc4\xc8\x8f\x03\x09\x79\x7b\x34\x0e\x08\x75\x8d\x7b\xa6\xd3\xc1\x19\x18\x19\x93\xd0\x00\x07\xdf\x41\x7e\x4c\x2c\xe6\xb4\x1d\x5d\xc6\xb1\x40\x56\x6a\xae\xd4\x0b\x18\x4e\xda\xe6\x3d\x3f\xde\xe4\x08\xd7\xf8\x91\x97\x50\x9f\xfd\x7b\xba\x88\xb5\xc7\x74\x02\xfe\x92\xd2\xf1\xb2\x58\x52\xfc\xe9\xf7\x8d\x13\x53\xf1\xfc\xf2\xc4\xd4\xc6\xa0\x79\x47\x46\xc6\x90\x70\xe5\x7d\x9c\x8b\x46\x4f\x99\x10\x53\x15\xb7\xda\x85\xcd\xa2\x54\x77\x96\x5e\xe3\xca\x0b\x4f\x62\x8e\xe8\xf3\xce\x91\xec\x83\x29\x99\xe8\x18\xc5\x1f\x3a\x47\x73\x92\x5b\x97\x29\x31\x53\xc9\x76\x8c\x2e\xcb\xb6\x36\xd1\x33\x8a\x97\xbd\x96\x47\x8e\xb0\x86\xe1\x02\x24\x43\xff\x4f\xa6\x2c\xc3\xe7\xfc\x7d\xb3\x7c\xdc\x2c\x87\x2e\x85\x4c\x39\xc3\xc6\xcb\xa3\xd9\x69\xfa\xb6\x30\x77\x6e\xc6\x8d\x7b\x8f\xbb\x7d\xef\x6e\x5c\xd7\x3f\x1a\xa7\xc8\xec\x55\x44\x20\x53\x4f\xb3\x4e\xf6\x4d\x75\x00\x24\x00\x70\x87\xc3\x04\xed\x8b\x8d\x23\x0d\x33\xdf\xc8\x6d\x91\x82\x19\xc4\x07\x72\xb2\x75\x11\xeb\x42\xa9\x6b\x15\x47\x29\x12\x23\x0c\x84\xb6\xb6\x0b\x45\x16\x45\xe1\x22\x93\x66\xb8\x10\x45\x66\x48\xa1\xb7\x47\x5e\x7f\x8c\x5e\x8c\x10\x04\x27\xe4\x91\x9f\xd1\x2a\xa2\x91\x71\xc7\xb4\x41\x8a\x1f\xf2\xd2\x85\x7e\x4b\x47\xbb\x21\xa5\x8c\x65\x66\xf8\xa3\x6b\x40\x31\x41\xc7\xcb\x3b\x0a\xad\x27\x77\x2c\x45\x44\xd4\x80\x7a\x55\xf7\x4c\xc1\xe3\xf7\x6a\xc7\xab\x28\x24\x5e\x4a\x28\x2f\xdf\x16\xfe\x5d\x2a\x99\x66\xa1\xb9\xd2\x13\x7c\xf5\x29\xba\xf1\xf9\xc0\x39\x4f\x2d\xcf\xcb\xf6\x3d\x47\x65\x94\xdd\xbc\x6a\x9a\x94\x00\x0c\x99\xa0\xbb\xcd\x47\x14\xde\x0b\x6a\xa6\xf9\x3b\xa9\x93\x44\xc2\x08\x1c\x87\x98\x23\x77\x6b\x5a\x18\xd6\xca\xca\x65\xac\x2c\x04\x2a\x34\xc7\x55\xa0\x79\x66\xf7\xee\x3d\xaf\x45\xde\x36\xfb\x43\x5e\xee\xe5\x90\xb1\x77\xf4\x83\x8a\x40\x8c\x5d\xbd\x68\x63\xc6\x24\x2b\x76\x44\x48\x03\x8c\xed\x45\x75\x2a\xe5\x79\x59\x8d\xb8\x5e\xa4\x0a\x25\x45\xb2\x96\x7f\x3e\x2c\x1e\xdc\x56\xae\xa2\x20\x0b\x84\xa3\x74\xe8\x1c\xdb\x61\x4e\x40\x45\x20\x48\xe4\xfb\x04\x4c\x36\xf2\xb7\xa9\x25\xba\xb6\x2b\xce\x05\x77\x8a\xa5\x80\xe9\xd1\xbb\xd7\xdd\xeb\xcb\x6a\xff\xb8\xda\x2f\x6e\x6f\x5f\x56\x5b\x57\x74\x52\x2e\xe5\x56\x9e\x0e\xa6\xa2\xd3\xf4\x47\x62\x9c\x37\xd2\x62\x11\x79\x61\x04\xfc\xec\xe1\x44\x29\x17\x88\xfd\xfe\xaf\xe5\x48\x34\x75\x98\xbc\x56\x69\x40\x11\xc1\x60\x56\x5e\xb7\xbf\x8f\x55\xc4\xdc\xb8\x2c\x8c\x33\x23\xc4\xdd\xd6\x39\x7c\xc2\xa6\xbc\xeb\xf6\x04\x77\x54\x1a\xe9\xe5\xce\xf7\x5a\x2c\xe6\x3b\xc7\x14\x0f\x64\xaa\x7b\xa9\x89\xdb\xfc\x58\x54\x07\x7e\x73\x7e\x9a\x78\xc2\x8a\xd3\x10\x9b\x06\xdc\x7a\xd8\x42\x51\x20\x85\xa3\x55\x2f\xbc\x62\x61\x15\xb7\x3a\x0b\x8a\xff\x39\x0a\x9f\x14\x8f\x04\x3a\x05\x87\x81\x32\xad\x54\x9c\x87\x18\x59\x1f\xf2\xd2\x52\x06\xb8\x94\xb7\x12\x31\xa5\x28\x0f\x02\x4d\xc3\xdf\x60\x7b\x95\xc6\x79\xf2\x88\x42\x00\x76\x60\x22\xe1\x9c\xeb\xb8\xb8\xd4\x46\xb4\xa3\x65\xc0\x50\x0e\x4f\x55\x37\x97\x2a\x63\x6e\x4c\x42\x2d\x88\xbf\x5b\x10\x0d\xb4\xfb\xe6\xbd\x3a\x62\x0e\x63\xc6\x53\x57\x32\x51\xca\xe6\x2d\xaf\xa8\xa5\x0e\x63\x7e\xa5\x62\xe5\xea\x33\xa6\x66\x7b\x11\x5a\xb8\x81\x19\x47\xdc\xd5\xed\xea\x8f\xff\x2b\x98\xdc\x5d\x81\x9b\x16\xb3\x2e\x86\x78\x2d\x75\x0d\xe0\xd9\x26\x14\x04\x01\x71\x0a\x7f\x26\x60\xf3\x47\xd2\x10\x83\xa2\x27\xf8\x9a\xeb\xd9\x9b\xff\x2d\x08\x44\x84\xb8\x0e\x4c\x3b\xd9\xcc\x90\x3d\x44\x88\x51\x62\x03\xa4\xdc\xa9\xfd\x9f\x55\x88\xe9\x1e\xd7\xf5\xf7\x6c\x68\xe1\x87\xb3\x08\x68\x08\x59\x32\x60\x44\x34\x95\xc7\xd1\x7b\x02\x9a\x85\xb8\xff\x1c\xf2\x72\xae\x35\x12\xa8\x88\x1c\x63\xe8\x23\xaf\x3f\x4e\xc7\xe9\x71\x6d\xc4\x75\xbe\x57\x27\xc4\x24\xcf\xc6\xc0\x10\xa6\x46\xa7\xfa\xc8\xcf\x80\x4a\xb1\xcd\xae\xea\x16\x89\xbb\xd3\x88\x47\x08\x1a\xe5\x13\xe3\x0f\x11\x07\xcc\x92\xde\xe6\x6f\xf9\x4f\x13\x3f\x9f\xea\x61\x66\x0a\x22\x11\xa2\x94\x51\x83\x65\xac\x45\xd9\x7c\x41\x7d\x73\x5e\x74\x36\x79\x4c\x4d\x39\xad\xb5\x4f\x7e\x48\x9b\x1e\x4f\xcf\x83\xe5\xae\xcf\x92\xc4\x75\xc8\xe2\x0e\x31\x42\x05\x01\x4b\x32\x84\xee\xc1\xcf\x16\x30\x54\x9a\xbc\x1e\x96\x85\x48\x47\xa3\x72\x43\x9b\xb7\x2a\x55\x0f\x84\xf2\x63\x64\x60\xab\x5f\xcf\xdd\xfb\x99\xbc\x02\x26\x19\x37\x98\xa4\xba\x81\x6e\xa7\x1e\xa2\x1e\x80\xc9\xc4\xf0\x0a\x55\x95\x7f\x9b\x4c\x53\x44\x7f\x3a\xdc\x80\x67\x4e\x1b\xdf\x5b\x1c\x99\x04\xfc\x2d\x88\xbc\xed\xb7\x9b\xab\x7d\xa3\x90\x50\xf3\xad\xdf\xa0\xfd\x47\x25\x6c\xcc\x33\xbe\x66\x92\xa8\xd4\x66\xa8\xec\xb6\x7a\x99\xef\x82\x94\x51\x6c\x8a\xc4\xbe\x85\x21\x9d\xa4\x3d\x9e\xa5\x49\x6a\x00\xc6\xf0\x75\xdf\x6f\x11\x90\xe9\x58\x1a\x5c\xd9\x11\x1b\xa2\xbb\xa0\x6e\x34\xe1\x79\xc0\xb1\xb9\x60\x71\xfb\x87\xff\x53\x42\x88\x6d\xcb\xd9\x9c\x46\x80\x11\xe0\xa9\xd1\x24\x07\x2b\x57\xbf\x5e\x6d\xfc\x21\x29\xb2\xb0\xcf\x03\x3f\xc1\xd7\x0d\x57\x97\x4d\xa4\x6e\xb4\x36\xea\x8c\xe7\xea\xb4\xa8\xa7\x0f\x2b\x42\x48\x94\x47\x00\xe8\xdc\x76\x56\x37\xf3\x7b\x0e\x08\x41\x30\xe8\x33\x13\xca\x9b\x10\xff\x5b\x92\x81\x74\x4c\x5e\x83\xde\xbf\xe7\xaa\x2a\x36\x47\x73\xe1\xf1\xcd\xc9\x84\x22\x5a\x1b\xf3\xc2\x4f\xe0\x48\x9d\x40\x51\x8d\x04\xb8\x76\x3b\x5e\xbe\xf3\xda\x83\xcf\x40\x71\x9a\x58\xb7\xe2\x05\xde\x4e\x05\xaf\x97\xbc\x9e\xeb\x1e\x00\x05\x54\xba\x14\xdb\xba\xd9\xf2\x03\x6c\xf3\x37\xff\x41\x14\x00\x28\x47\xc6\xb9\xd6\x4f\x00\x0a\xd4\xee\x1d\xca\x6d\x0b\x97\xad\xe1\x13\x56\x98\xbf\x68\x24\xb4\x3f\x01\xc0\xc1\xf4\x85\x20\xec\x67\xe9\xdb\x3e\xaf\x9a\xfd\xf1\x0b\xd7\x29\xc1\xda\x7e\xb7\x00\x6e\xf2\x5a\xf5\xf4\x61\xa0\xb9\x21\x57\xf6\xca\x6d\xbf\x2e\xce\x80\x96\x02\x13\x3a\xf0\xd3\x97\x1a\xb1\xe8\x36\xd8\xc0\x74\x10\x08\xd7\xdb\xb3\x90\x86\x00\xc5\x30\x87\xcb\x36\xff\x84\x59\x09\x47\xa9\x09\x4b\x10\xda\x85\x0d\x45\x18\xf8\x8c\x3b\x54\x35\xe1\x19\xa6\xa5\x7a\xa2\x8f\x71\x4c\xa2\x89\xd2\x46\x49\xe0\xbd\xfa\x1a\x73\x43\x8c\xde\x86\xa6\x24\xd3\x36\xe7\xf0\x50\x55\xad\xa8\x7e\x5e\xa0\x00\x75\x18\x71\xf4\xac\xb6\x56\x8a\xe4\xb5\x14\xa6\x77\x76\xa6\x20\xa7\x43\x2d\xa8\xe1\x9f\xfd\xac\x3e\xae\xfd\x2a\x0b\x13\x6c\x8c\x39\x18\x68\xf4\x39\xf9\x6d\xf4\x83\x71\xc8\x0c\x52\xaf\x3a\xd5\x1e\x25\xa3\x63\xce\x32\x93\x57\xbd\xc7\x45\x5a\xef\xde\x79\x39\x1f\x65\xe9\x84\x4a\xe4\x0b\xc4\x2f\x39\xb9\xc3\x24\x4c\x59\x3c\x90\xbf\xc1\x3c\xb2\xb3\x45\x3a\x11\xa6\x6f\xd6\x72\xbb\x18\x6e\xaa\xc9\x05\x64\x80\x2e\x0c\xce\x11\x23\xfe\x7c\x15\x8d\x71\xd5\xd9\x76\xba\xef\xfe\x9a\xd4\x88\x3d\xa2\x18\xe7\x69\xd4\x80\x3b\x98\x4d\x69\x10\x99\x14\x6c\x0e\xb5\x4b\x71\x0e\xba\xa2\x74\x4a\x8c\x1a\x81\xe4\x87\x23\xcf\xdf\x4a\xa4\x82\xdf\x9e\xa4\x84\xa6\xd1\xa7\xc2\x57\x40\x75\x1a\x33\xdc\x67\x7d\xdb\xed\xb8\x99\xd8\x8d\xd2\x24\xe4\x23\xeb\xbe\x6e\xe1\x30\xe3\xd6\xe9\x2c\x48\xd0\x80\xae\x65\x35\x6a\xa6\xd3\x19\x01\xdc\xcd\x1e\x2b\xdd\xf2\x51\x1c\xab\xb3\x28\x76\x59\x90\x45\x51\x3c\x73\xbc\xbe\x9a\x38\x76\x3a\x4b\xa2\xd0\x54\xa2\x3e\x81\x17\x7f\x5c\xf9\xe0\x59\x9a\x22\x42\xf9\x1e\xd5\x00\x26\x29\x1d\x37\x46\x08\x84\x59\xbc\xf3\x06\xdb\xf0\x72\x50\x8b\xd6\x56\xdb\x4d\xed\x7e\x76\x99\xeb\x0c\xd2\x30\x76\xf5\xdd\xaa\x0b\x30\x6b\xdb\x8c\xf1\xcb\x24\xa7\xe6\x31\x47\x65\x6a\x71\x3a\x2f\xdf\xf9\xe1\x38\x4f\x42\xa5\x79\x46\x47\xd5\xd8\x05\x7e\xad\x41\xc4\x3b\x1d\x2e\x91\xfc\xb6\x33\xc0\x46\xee\x9f\x7b\xbf\x4a\x73\x69\x90\x3e\xcb\xe7\x3f\xe6\x3b\x9c\x26\x17\x93\xa1\x88\x6c\x4d\x62\xa1\xd6\xea\xe6\x3c\x82\x5e\x8f\x1f\x47\x46\x86\x13\xf8\xad\xae\xaa\xc3\x80\x58\x51\x77\xf1\x90\xf0\x4b\xc6\xb4\xe1\x4e\x26\x92\xe2\x49\xe2\xb4\x4c\xbf\xbc\x43\x34\x9b\x52\xd4\x10\x87\x38\x63\x74\x5e\xe6\xcd\xfb\x73\x9d\x7f\x5a\xb2\xa3\xdf\xfc\x80\x08\xfb\xbd\xb7\xdf\x16\x7d\x9b\x90\x86\x14\xb0\x56\xb6\x85\x76\xfd\xfc\xf2\xdb\xbc\x30\xd7\x7c\x7b\xd4\x4c\xb5\x57\x6b\xaa\x93\xbe\xd3\x6d\x51\xaa\x7f\x54\x79\xb9\xbc\x75\x00\x66\xad\x19\x4b\x89\xf1\xfb\xef\xe0\xca\x93\x68\x4d\x12\xdb\xe7\x61\xd2\x7c\xaa\xba\x05\x8f\xb1\x19\x4e\x73\x15\x04\xc4\x84\x51\x25\x3f\xc0\xae\xb2\x5d\xb3\xc3\xea\x56\x37\x24\xc5\xf7\xac\xaa\x37\x18\x55\x4c\x54\x10\x44\x92\xa7\x96\xe3\x76\xa5\x5c\xab\x9a\x0a\x82\xcc\x54\x52\x6a\x90\xa7\xba\xc9\x3f\x61\x09\xf9\xe5\x36\x3c\xfc\xce\x2a\x08\x78\xa6\x3c\x2b\xf1\x7c\x13\xb2\x1b\x29\x62\xdc\x64\x4a\xcc\x95\x23\xcf\xad\xfb\x61\x42\x7d\x85\x71\x3d\xce\x7b\xa8\x80\xe8\x04\x5f\xdd\x5b\xb5\xab\x7e\x54\xf5\xc7\xc5\x61\xc3\x6a\xfe\x50\xbd\x19\xff\x61\x6e\x35\xab\x80\xd2\x84\xda\x60\xe7\x9e\x1f\xa6\x42\x8e\xbd\x6d\x55\x01\xcd\x18\xca\xbd\x2c\xab\x1a\x1e\xf8\xd9\xc5\x54\x2a\xa0\x10\x22\x02\xcf\xb2\x68\xef\x7e\x5a\x3e\x8c\xbb\xaa\xfe\xfd\xc7\xfb\xe4\x03\x85\x51\x84\xbd\xda\xb7\x39\x3f\x54\xa6\x95\xd1\x5d\x87\x51\x86\xd1\xa1\x4b\xd6\x76\xd6\x6c\x48\xc1\xa6\x02\xa6\x04\x56\x7c\x2d\x9a\x04\x6a\x8b\xca\x76\xc7\xe3\xd8\x93\x14\xfe\x77\x5f\x0a\x1c\x32\x3e\xa9\x20\x09\x4c\x13\x86\x63\x1d\xe3\x88\x3b\xb8\xab\xea\xbb\xba\xfa\xd3\x4a\xac\x8e\x67\xa0\x0a\xd2\x50\xd3\xc0\xc6\xb4\xcf\x3e\x51\xa4\x82\x34\x0e\x70\xbe\xac\x9b\x4b\xca\x3b\x15\xa4\xc2\xf0\x49\x7b\x3d\x7b\x05\x87\x63\x1f\x83\xa9\x20\x0b\xb2\xd4\x4e\xec\xa1\x1c\xe1\x34\x95\xe4\x46\x2b\xc0\x56\xf5\xde\xf1\xdf\x94\x5d\xe4\xe4\x0e\x03\x09\x3d\x62\xec\x05\xf9\xb9\x4c\xc4\x87\x8e\xcf\x10\x8c\xa5\x02\x4e\x4c\x1c\x9e\x37\x16\xf7\x66\xdb\x3e\xdd\x0e\xa8\x02\x2e\x53\xde\x5d\xed\x5b\x55\xa8\xbf\x6e\x41\xf9\x95\x43\xfa\x77\x9b\xd6\x54\x20\x08\xd7\x76\xb2\x3f\x9e\xdb\x77\xf8\x79\x95\x17\x56\x05\x82\xa6\x58\x62\xbf\x2c\xf7\xab\x40\x24\x5a\xdb\x94\xd8\xcd\xe9\xfc\x54\x7d\x5d\xee\xb4\x2a\x90\x24\xcd\x7a\x9e\x78\x6c\x30\x5a\xfd\xf4\xd2\xa7\xd3\xc1\x11\xe5\x7d\x35\xc7\x71\x26\xaf\x4c\x0b\x91\xe1\xdc\xf3\x43\x35\x61\x4e\xed\xa3\xe7\x01\xee\xfe\x9e\x18\x8d\x97\xb6\x3a\xde\x9f\x5c\x54\xd9\xb9\xac\xfd\x0a\x53\x49\x84\x08\x28\xac\xe4\x21\xc3\xfb\xf8\xc1\x80\x86\xc8\x0b\xf4\x59\xb5\xc3\x0c\xce\xf8\x5e\x21\xcc\x5c\x53\x07\x02\x3c\xe3\xb1\xf5\x83\x24\x0d\x87\xdb\xe4\x8f\xbc\x7d\x37\x0d\x37\x57\x6b\xdd\xd7\xbe\xe6\x3c\x81\x99\x0a\x74\xe0\xa8\x1e\x4b\xe3\xda\xba\xbf\x33\x8e\xab\xd7\x16\x81\x9f\xf3\x55\xff\x7a\x34\x8f\x23\x62\x6a\xab\x65\x5e\xbe\xed\x05\xb4\xcd\xb0\x04\xa6\x48\x10\x80\xe6\x9e\x74\x7b\x20\xce\xa3\x48\xa0\xb2\x04\x86\xc0\xed\x1f\x3c\x6f\x7d\xe9\x45\x11\x42\xa3\xc4\xe3\x31\x1c\x97\x88\x3b\x16\x49\x74\x1b\xb0\x01\x70\xa0\xd6\x78\x65\x2a\xdb\xb3\x3a\x7f\x5f\x61\xbe\xfc\x0b\xea\xed\x57\xde\xca\xf7\xbe\xe8\xa0\x08\x15\x8c\xb8\xfe\x57\xdf\x82\x3d\x34\xec\x24\x4c\x04\x4e\x93\xb6\xba\xe1\x0d\xb0\x74\x26\x17\xab\x48\x08\x14\xab\xfc\xba\xaa\xdf\xe0\x07\xf0\x63\x55\xbe\xa0\x0e\xe1\xdf\x4a\x8f\x29\x12\x6a\x85\x84\x84\x7b\xc3\xf7\xb8\x9c\xc9\xb2\xff\xd7\xdc\xef\x46\x5c\xa0\x9b\xd1\x37\xae\x1b\x39\x97\x39\xea\x19\x45\x18\x51\xc4\xd5\xec\xed\xa4\x5c\xd4\xf5\x00\x2f\x3b\x9a\xc4\x84\x31\x1d\x5e\x40\x1c\xa6\x73\xcf\x96\x82\x15\x61\x22\xc6\xf6\xc9\xc7\xf3\x8f\x7c\xc0\x6f\x31\xdb\xf3\xf2\x2b\x37\x52\x11\xa6\xb3\xcc\xe8\xed\x62\x85\xfd\x75\x7b\x3b\xeb\xa0\x29\x12\x2b\x63\x95\xf3\x66\x69\xdd\x7f\xdc\xd6\xc6\xfb\x18\x89\x35\x04\x36\x13\xde\xed\x61\x37\x5c\x7e\x6c\xc4\xbf\x61\x22\x7d\xa1\x48\x02\x84\x11\x6b\x0f\xb8\xa8\x2f\x8e\x72\x0f\x59\x36\x41\x9c\x51\x5e\x9e\x50\xfc\xf7\xf8\x7f\x45\x52\x41\x59\xe0\x08\x48\xcc\x8b\x9e\x2e\xd4\x4b\x47\x4c\x91\x8c\x2a\xe4\x99\xe4\x5a\x23\x41\x03\x8c\x75\x01\x14\xc9\x42\x48\x84\x27\x2a\xc7\x2c\xe3\x69\xc4\x05\x3a\xb0\x54\x24\x63\xa6\x98\xb9\x2e\x3b\xf7\xf2\x33\x1f\x04\x24\x8a\x70\x6a\xb8\x5f\xc4\xc9\xf6\x6d\x37\x23\x36\x99\xf9\xcf\xc3\x59\x8c\x09\xd5\x1f\x50\x14\x25\x3a\xee\xc3\x2b\x32\x8d\x1e\xc6\xfe\xad\xe6\xa5\x7a\xfe\xfe\xfc\x50\x35\xdd\xe6\xff\xe5\x04\xd3\x07\xd7\x89\x0d\x15\x76\x0d\xc7\xaa\x6e\x87\x8f\x40\xc6\x93\x9c\x73\x86\x9d\xca\xcf\x8b\x97\xdd\xd3\xea\x65\x3b\xea\xe8\x55\x44\x90\xcc\x95\xbd\x91\xbb\x60\x3b\x05\x8c\x29\x22\x62\x82\x45\x80\x6e\xe2\xcf\xc6\x53\x8a\x88\x84\x23\xc7\x44\x59\x95\x77\xa7\xf2\x2d\x17\x05\x8c\xdb\xa1\x14\x11\x69\x66\x44\x1b\x30\x53\xbe\xfa\x99\x37\x13\x36\x39\x45\x44\x26\x51\x83\xf0\x79\xb3\x79\xd8\xdf\xad\x56\xfe\x54\x11\x2a\xe2\x54\x03\x1a\xc9\x5b\x98\xe3\xc7\xe9\xc6\xc5\xb8\xb1\x1a\x77\x78\xb9\xb9\x5f\xf8\xc7\x94\x21\xc3\xce\xb0\x1a\xe4\x59\x16\xd3\x27\x94\x4a\x63\x46\xf1\x03\xce\x82\x37\xf0\x7c\x12\xaf\x2f\x0f\xa3\xfd\x84\x28\x06\xb1\x11\x9d\x94\xf7\x50\x3e\x70\x71\x97\xbf\xbd\x4f\x17\x81\x12\xd2\xb0\x01\xf1\x42\xbe\x96\x8f\xbc\xf9\x00\xb5\x9a\x13\x30\x54\x44\xc9\x00\xeb\xf1\x16\xf6\xd1\x07\x2c\x8a\x28\xad\x9d\xb2\x18\xd2\x8d\x2d\x4d\xaf\x71\xbf\x0f\x00\x8d\x19\xe9\x3b\xcb\x7e\x87\xf3\xe4\xe2\x10\x01\xa6\x95\xf7\x5e\xc8\x6b\x3a\x00\x42\x2c\x5e\x7c\xbd\x0f\xe2\x2a\x7f\x0c\xb0\x77\xc2\x88\x9a\x79\x9d\x91\x3e\x84\x53\x44\x67\x31\xc2\x38\x9e\x5f\x5f\x96\xdf\x16\xdb\xd5\x7e\xf1\xb8\x79\x7d\xda\xed\x5f\x16\xbb\xd5\xfe\x65\x75\xb7\x7a\x59\x3d\x2d\xfd\xe7\xd3\x32\x36\x72\x9f\xb6\x16\xa2\xee\x2e\x15\xa1\xc6\xf3\x89\x06\x9c\x99\xc4\x04\x86\x53\x3d\xb3\xf4\xf8\x31\x28\x61\x91\xd3\x79\x30\x9a\xfe\xcd\x25\xd1\xb2\xa2\x24\x91\x40\x5c\xd4\xaa\x4e\xbd\x22\x99\xa2\x24\xd5\xda\x92\x23\x3e\x23\x9b\xac\x03\x99\xac\x87\xb4\xd2\x93\xcb\xe9\x10\x83\xe6\x76\x1f\xd6\x6a\x8f\x65\xd5\x7e\x83\xa7\x94\x44\x69\x2f\xce\x0d\x6a\x7b\x3a\x6c\x4a\x73\x6d\x3f\x24\x4d\x1d\xf1\xca\xc2\x59\xa9\xa1\x33\x36\xf9\xbd\x30\x52\xa8\xc4\xf2\x9c\xff\x84\xe2\xa6\x3a\x0d\xa6\xdd\x45\xee\x73\x2e\x07\xa0\x68\x98\x64\xb8\x3f\x8a\x4a\x3c\xf2\x0f\xc4\x4a\x3a\xfc\xd5\x64\xef\xb2\xca\x8f\x01\x5e\xd0\x0a\x2b\x29\x1a\xa6\x71\x60\xc8\xd3\x1b\x68\x2f\xda\x4d\xec\xa0\x28\x48\x54\x68\x37\x80\x4d\x59\x9c\x91\xcf\x75\xb4\x97\xd0\x88\x6a\x6e\x7c\x43\xae\xf5\x3e\x72\xef\x83\x85\x52\x05\x63\xc4\xc0\xa3\x51\xac\x70\xc9\xc5\xd4\x8d\xcc\x22\xde\x73\x36\x1a\xb7\xd9\xcc\xa9\xc9\xf2\xa2\x09\x68\x2c\x96\xef\x8f\x5c\x7e\x3c\x7f\x7f\xee\xbb\x1b\x14\x4d\xb4\xa1\x0c\x5c\xb5\x50\x97\xbc\x40\xea\xc4\xeb\xb1\xbd\xa2\x69\x20\x13\x3e\xa8\xf3\x42\xcb\xe5\x7b\x37\x1b\x37\xe5\x33\x3f\x4d\x04\x60\x15\x4d\x53\x92\x18\x76\x4e\xac\x6a\xfe\x3a\xda\xa1\x69\xe7\x45\xfd\xbf\xff\xef\xff\xfd\xf7\xfa\x61\xfd\x74\x7f\xbf\x19\x76\x1e\xe0\x51\xcf\xb7\x00\x07\x81\x13\xdc\x00\x59\xc7\xbf\x99\x45\x04\x97\x58\xde\xcb\x40\x8d\x29\x31\x15\xe5\x41\x82\x6f\xe4\x61\xb9\xf5\x7f\x92\xd4\x76\xa8\x96\xbb\xea\xe1\x74\x45\xcf\x54\x51\xae\x4c\x95\xaa\x91\xef\xa0\x4e\x05\xca\x9f\xfe\x76\xc9\x8a\xa1\xa8\x90\xa6\x51\xeb\x16\x3e\x73\x09\xeb\xe6\x16\xb8\x6c\x31\x21\xa3\x26\xb3\x45\x46\x0a\xc5\x02\x17\xaa\xc2\x50\xd1\x9a\x41\x43\x0f\x56\x38\x5d\x18\xe6\x46\xa7\x69\x6a\xb5\xb9\xba\x01\xdf\xf2\xa6\x1d\x10\x5e\x4d\x6e\x42\x51\x8e\x90\x5c\xab\x7a\x72\xe5\x99\x54\x04\xf8\x3a\x0c\xa3\xd1\x23\x77\xa8\x66\x45\x21\xe0\x98\x31\x33\x52\x01\xa3\xde\x4f\x3b\x42\x47\x20\xec\x57\x79\xb2\xbc\x65\x48\x6e\x66\xaf\x10\x06\x81\x74\xdc\x69\x5b\x68\x11\xb9\x8a\x13\x76\x58\xe0\xb9\x44\xf0\xaa\x30\x20\x01\x16\xeb\xca\x6a\xa3\x77\x79\x6f\xa6\xc2\x20\xa4\xb8\x7b\xa1\xa4\xf7\xf2\x9b\x69\x9f\xf6\x07\x63\xe3\x84\xbb\x57\x7d\x35\x27\xa7\x42\x42\x33\xcc\x95\xf5\x3a\x2f\x45\x71\x73\x3a\x77\x4e\x9d\x67\xfe\x56\x21\xd1\x11\x82\x5b\x10\x96\x78\x0b\xc2\x6d\xe1\x21\x25\x01\x32\xfe\x17\xf0\x09\xc5\xba\x85\xc3\xb2\xe0\x7e\xdf\x08\x69\xa4\xc1\xd8\x29\x90\x30\xd2\xcb\xfa\xcb\xd6\x59\x15\xd2\x38\xd0\x1e\x62\xb7\x39\x02\x4e\xdf\xda\x5f\x3a\x65\xf8\xfd\x5d\xc6\xc4\x18\x7b\x77\x34\xe2\x02\x2d\x8f\x0b\xf5\x6e\xf3\x1a\x64\x5b\xd5\x8b\xf1\x9c\x0b\x23\x69\xf8\x07\x24\x3f\xde\x15\xae\xf5\x4a\x85\x91\xe2\xd8\x9b\x8b\x21\x76\xf7\xb3\x1b\xdd\xed\x77\x0f\x55\x1b\xf9\x21\x40\x90\xf7\xc1\x90\xb5\x79\xb8\x57\x77\x20\xc1\x6e\x0b\xd3\x3f\xfd\x4b\xcf\x2f\x8c\x99\x48\x11\x87\xe5\xba\x69\x55\x18\x0b\x96\x49\x1f\xd0\x95\xb6\xc7\x60\x32\x2b\x62\x20\x78\x9e\x73\xa8\x86\xd2\xe2\x2a\x4c\x04\x98\xd9\x5e\x29\x17\x69\x9f\x7a\x7e\x54\x15\xa6\x51\x80\xa5\x9f\xe7\x97\xf5\xf7\xc5\x6e\xf5\xfc\xb0\x58\xae\x1e\x57\x4f\xce\x31\x0a\xd3\x98\x62\xbe\xfc\x80\x4d\x3d\xc5\x79\x8b\x73\xda\xb8\x9c\x8d\x6f\xd2\xbd\xab\xea\xe5\x7b\x5e\xa8\x49\x92\x62\xf2\x84\x59\x02\x41\xe8\x89\xd9\x6d\x31\xc4\x1e\x13\x01\x89\xa4\xeb\xc6\x68\xa1\x69\xbf\x43\xdd\x0c\x10\x90\x6e\x98\x0a\x9c\x7c\xc2\x0b\x70\x75\xee\x7b\x7e\x55\x28\xa3\x00\x53\x6a\xfb\x06\xda\xc4\xff\x51\x9a\x8a\xf2\xd1\x54\xbc\xee\xaa\xfa\x1b\x14\xc7\x9e\x0e\x57\x85\x2a\x10\xd8\x95\x6d\x36\x8d\xe2\x48\xd2\xc9\xbc\x00\xa6\x11\x5d\xb0\x6f\xde\x79\x0d\x26\xb9\x37\x6f\x35\x42\xd0\x31\x8f\x47\x7d\xa5\x9f\xae\xaf\x54\x85\x9a\x1a\xbc\xda\xfe\x58\x57\xd2\xb9\xf6\xcd\x2f\x61\xab\x2a\xd4\x69\x8c\x0f\x7c\x57\x54\x1c\x33\x93\x66\xc5\xcc\xc6\x94\xa1\xce\x18\x72\xdf\xed\x7b\xf6\x5a\xff\xe3\x9c\x98\xaa\xc3\x7b\x3e\xea\x72\x50\xa1\xd6\x91\x8e\x5d\xa6\x06\x60\x57\xfd\x82\x08\x56\x45\x24\x54\x68\x17\xbf\x43\xa9\xf2\xf1\x4c\x8c\x48\x96\xea\xc8\x4b\xde\xda\xad\x2d\x1d\x6f\x68\x11\x91\x92\xda\x9c\x80\x6b\x64\x1a\x90\xcf\xa8\x88\x80\x11\x81\xad\x41\x01\x1c\x66\x23\xa6\xe1\xed\x47\x34\xd0\xa8\x5b\xc4\x4f\x2a\x6f\x51\x4e\xf1\xd0\xe7\x5a\x22\xca\x42\x6c\x60\x7b\x84\xaa\x39\x0d\x01\x71\x2a\xa2\xd2\xe8\x01\x19\xe6\x0a\xcf\xde\xeb\x0f\x6b\x8e\x67\x9a\xfe\xf2\x10\x4f\x5d\xd9\x52\xff\x8b\x07\xce\xaa\x28\x24\x11\x42\x06\x4f\x65\xfe\x9f\x13\xec\x47\x8a\x44\x2a\x8a\x42\x99\x08\x4f\x9d\x6a\xf8\xaf\x27\xbe\x48\x14\x65\x1c\xbb\x0d\xb0\x9a\xe1\xbf\x58\x14\x71\x82\xa5\x43\x2b\x0f\x0d\x3d\x88\xbb\xe7\x12\x1d\xcf\xd4\x88\x05\x0a\xc1\x2c\x43\xf2\xdb\x1b\x5e\x7e\xec\x2a\xa7\x02\x32\x9b\xba\x88\x58\x22\x13\xdd\xef\x9f\x8d\xa7\x2b\x54\x11\x03\xea\xf8\xd8\xba\x8d\xe3\x21\x6f\xda\x5e\x37\x47\x45\x31\x05\xe4\x3b\xf2\xb9\x6a\xcc\xaf\x76\xbe\xdd\x00\x5f\x3d\xf9\xb5\x38\x09\x30\x54\x42\xc0\xe4\xf8\x50\x12\x2a\xf4\x76\xdc\xe5\xf6\xbe\x18\xa5\xa2\x44\x83\xad\x01\x94\x6a\x57\x8d\x4b\xa9\x7f\x95\xab\xb3\x97\x48\x83\x74\xf8\x9c\x7d\x23\xc4\xe4\x3d\xa6\xb1\xc4\xfe\xd6\xaa\x33\xb7\x3f\x78\xd9\x3e\x9e\x07\x1d\x8f\x2a\x4a\x33\x13\x02\x35\xd0\x6e\xcf\x4d\x0b\x87\xad\x05\xa7\xe2\x06\xf0\x98\x4f\x1c\x82\x28\x55\x19\xf1\x0c\x6d\x5b\x28\x8a\xa1\x9e\xae\x8a\xb2\x84\x61\x51\xdf\xa6\x64\x66\x98\x05\x54\x94\x69\x82\xd0\xe8\x9b\xaa\x7a\x1c\x4d\x63\x1e\x30\x44\xf5\x89\xd3\xd9\xc3\x3d\xd2\xc9\xa2\xe5\x69\x18\xdb\x88\xc2\xbb\xe7\x2e\x6b\xeb\x33\x4d\x83\xbc\x46\xc4\x53\x1d\x93\x81\xcc\xb7\x6f\x14\xf1\xbf\xca\x25\x3a\xb1\xdb\xd5\xc3\xc3\xea\x65\xbf\xdd\xad\x9e\xf7\x74\x7f\xbf\xda\xed\x9f\x17\x0e\xcd\xa9\x22\x0e\xc2\x48\x7d\xe3\xc9\x8f\x79\x89\xd9\xc8\xc1\xef\x08\x49\x30\xd4\xf9\x82\x2e\x5a\x9e\xa0\x6c\x55\x24\x54\x24\x92\x11\xe6\xfe\x31\x2f\xa0\x69\xab\xd2\x48\x95\xfc\xc0\xb5\x39\xde\x22\x22\x99\x19\x47\xd6\x46\x93\x4f\xd5\xa4\x03\x59\x45\x4a\x1b\x74\xee\x07\x32\x43\xd8\x3f\x42\x6c\xf2\x62\x05\x40\x7d\xcf\xfb\x3f\xa7\x29\x92\x51\x1d\xab\xbc\xb3\x11\x27\xe7\x56\x45\x9a\x68\x03\x8d\xb6\xf9\xaa\x6f\xd5\xa1\x92\xb9\xf2\x2b\x43\x33\x8d\x29\x0f\x37\x95\x6f\x6e\x36\xfe\x50\xaa\x91\xaa\xb0\xee\xdc\xb5\xad\x73\x2b\xec\x51\x16\xc4\x26\xa3\x66\x4d\x4d\xd5\xdb\x24\x16\x80\xa9\xeb\xa0\xe7\xb5\x3d\x1d\x0e\x55\xf9\xe4\xfd\x32\x46\x02\xff\x95\x4d\x9c\x54\xd5\x07\xb3\x4c\xf6\xc7\xaa\x9a\xe7\x2f\xef\xce\x4a\x95\xed\x78\xa9\x71\x53\xc2\x46\x5f\x27\x7c\x66\xeb\x25\xa3\xf7\xc7\x48\x00\x48\x9c\x52\xc2\x57\xf7\x4e\x5e\x8f\xb3\xb5\x09\x46\x98\x54\x5e\x80\xfb\x7b\xd5\x7d\xfb\xbb\xaa\xc6\xe7\xb5\x95\x31\x7f\xe7\x9a\x73\x9b\xab\x9f\xca\x9a\x2a\x46\x43\x86\x6d\x7c\x0a\x3e\x4f\x50\xf8\x54\xe9\x6b\x73\xe2\x75\x3e\xa9\x7b\x32\x1a\x45\x58\xb6\x45\xea\x98\xfa\xec\x2b\xda\x3f\xf2\xf6\x7d\xc0\x9c\xa2\x58\x28\x0d\xbb\xe9\x21\x2f\xdb\xab\xbd\xc7\xe3\x1b\x89\xa8\x11\xa7\x6c\x1d\x6f\x96\xfb\x3b\x8f\xa9\xb6\x8b\xa5\xef\xf6\x75\x07\xa5\x51\x2e\xe5\xea\xf3\xa6\x1d\x31\x03\x2b\xc6\x82\x8c\x39\xb6\x90\xce\xd2\xcc\xe1\xec\x14\x63\x9a\xe0\xcf\x1a\x9a\xff\x65\xde\xe6\x7f\x4e\x23\x0e\xc6\xb4\xe9\xeb\x36\xf9\x90\x2d\x4a\x1f\x3c\xd7\xd5\xa1\xb2\xb9\xa1\x5c\x14\xf3\xe2\x59\x17\xd5\x27\x16\x87\x86\xc5\xfb\xbe\xca\xcb\xb7\x7b\x38\xcc\x8b\x5d\x29\x96\x28\x26\x99\x9b\x6d\xa7\x69\xb8\xcf\x52\x66\xd2\xa8\x25\x7c\xe5\x28\xd2\x53\x54\x6f\xbf\xcd\x6d\xe0\x2c\xcd\x08\x12\x11\xfd\xbb\xca\x2f\xe8\x59\xc7\x03\x35\x53\xa6\x5a\xb7\x96\xd5\x1d\x96\xf3\xdd\x9b\xcc\x28\x37\xd5\x9c\xea\xf8\x7a\x1c\xd5\xf8\x58\xc6\x42\xdc\xe6\x4f\x65\xeb\x16\xc5\xa8\x52\xc5\x32\x99\x61\xa9\xbc\x9b\x09\x37\x1c\x2b\x18\x7f\x8f\x66\x69\xf2\x42\x78\x04\x58\x0b\xe9\x9c\xb4\x17\xec\xa2\xb9\xec\xda\x98\xcc\x28\x9e\xe8\x28\x18\xd3\xfb\x2c\x2d\x84\x77\xf7\xf3\x9e\x37\xc7\x1e\x6f\xa8\x18\x97\x86\xe6\xfd\x88\x9d\x86\x2f\x80\xca\xc9\xce\x20\x33\x41\x43\x35\x94\x35\xb9\xa9\x4a\x75\x65\xc5\x0b\x9a\x09\xc3\xd0\x77\x13\xd2\x99\xd6\x68\xc5\x24\x8d\xb1\x37\xfd\x77\x7e\x3c\x9e\x7f\xef\x7d\x65\x26\x79\x9c\xd8\x96\x8b\xce\x9a\xbb\xe4\x24\x7e\xa5\xc7\x9e\x49\xee\xbf\xae\x67\x4b\x98\x14\x1c\x51\x0c\xcb\x6f\x7f\xf4\x1a\xc5\xf6\x98\x92\x0a\xa9\xe7\x74\x5e\x2a\x83\x68\x7b\x19\x8a\x6f\xb8\x51\x8a\x31\xa3\xc8\x3c\xe0\xa3\x9f\x0e\x49\x0d\x6d\x66\x7e\x80\xfb\x7e\xa5\x2a\xa5\x21\xbd\x4a\x09\x3c\xc8\x24\x31\xa5\x4d\xe4\x55\x56\x86\x96\xfa\x1a\x60\x5d\x31\x88\x02\xac\x37\x77\x73\x72\x60\xaa\x21\x35\xa9\xc7\x7f\x73\xf9\x71\xac\xda\x47\x50\x79\x6f\xa9\x81\x27\x46\x79\xee\x54\x23\x8f\x71\x55\x7e\x42\xdd\xee\xaa\x7f\xbe\x2e\x26\x0b\x5b\xc7\x86\x19\xb5\xcc\x25\xbc\x9d\xce\xa1\xbb\x82\xce\x8c\x38\xd2\x76\xb7\xdd\xad\xb6\x3b\x4b\x0c\xac\xe2\x20\xd2\xa8\xac\xb6\x7a\x3b\x1f\xdb\x9c\x97\xcf\x83\xed\x23\x0e\x44\x88\xfd\x3a\x6f\xf9\x27\xdc\x61\x9a\xfd\xf2\x2d\x8c\xfc\x80\x38\xb0\x14\x59\xc7\x81\xa8\xc0\xd0\x5b\x8f\x09\x01\xa4\x64\xdb\x42\xdb\x4e\x23\xd3\x98\xc4\x3c\xea\x4c\xc4\x7f\x43\x5d\xf5\xf6\x32\xa6\x82\x98\x4c\x13\x2f\x86\x2c\x58\x2a\xa6\xa0\x30\xab\xcb\x7f\xa9\x6f\xa3\x62\xaa\x63\x1d\x3a\x5a\xdd\xb9\xb6\x5b\x77\xc1\x90\x84\x98\x6f\xaf\x4a\x1f\x65\xcd\x14\x42\xe6\xcd\x7d\x1c\xea\x04\xd3\x8e\xfa\x54\x4a\x93\x82\x6a\x4f\x98\xaa\xbf\xc4\xc1\xab\x38\x8a\x34\x52\x9e\x09\xde\xe4\xcd\x73\x95\x97\x6d\x33\x08\x12\xe2\x98\x10\x6c\x5e\x79\xeb\x6c\x43\xf7\x49\xfa\x8c\x70\x9c\xf0\x10\xf1\x24\x38\x8f\x1f\x72\x0d\x4b\xac\x40\xd8\xa3\x29\x01\xcc\xe5\x83\xac\x1a\x74\x35\x51\x65\xdf\xe1\x15\x46\xfb\x49\x9c\x5a\x29\xcc\x41\x3f\xb8\x33\x44\x0b\xdd\x42\xbd\xfa\x79\xcc\xeb\x79\x3e\x43\x15\x67\x59\x8c\xd9\x8f\x87\xcd\x83\x9b\x65\x31\x57\x09\x7a\xea\x23\x22\xd1\x89\x73\x19\x73\xad\xb4\x11\xa6\xae\x4e\xc3\x6c\x6c\x2c\xa8\x96\x46\x37\xeb\x86\xd7\xcb\x4a\x41\x8f\x66\xf5\xef\x4d\x64\x19\xa6\xc2\xa0\xf4\x84\x39\xcf\x1e\x8a\xae\x62\x49\xcc\x8c\xbd\xe7\x7f\xc2\x88\x05\xb4\xcf\x32\xdb\x91\x10\xc7\xca\xe7\xeb\x2c\x1f\x1f\x7a\x32\x63\xcb\x10\x43\x0a\x28\xeb\xb6\x3f\xf0\xfa\xa3\x87\xa2\xdc\x9d\x0a\x9d\xf7\x89\x45\x7f\x7f\xa0\x18\xd6\xea\xf3\x32\x6f\xb7\x27\x81\x00\xfb\x0b\xec\xf5\x40\xd5\xd9\x9e\xa6\x03\x8d\xc0\x92\xc5\xf1\x58\x58\x7e\xc2\x75\xb3\x2e\x6f\xe1\x13\x8a\xea\x38\x70\x7d\x12\x92\x29\xec\x58\xe4\x86\x1e\xe1\x5a\x40\x73\x59\x00\x4d\x28\x25\x34\x71\x9d\x32\x86\xc5\x7f\xb2\x7d\xf6\x03\xd1\xea\x3d\x54\x6f\x26\x1f\xdd\x2f\xf0\x84\x26\x60\x84\xec\x4e\xe5\x3f\x8c\xa5\x72\x37\x46\x33\x23\xc5\xcf\x95\xda\x37\xef\x39\x14\x6a\xb4\x6d\x26\x94\x03\xc6\x9a\x5e\x45\x68\xbd\xdc\xec\xbf\x88\x3b\x3d\x54\xc4\x41\xc0\x5d\x48\x3e\xbb\x98\x13\x46\x42\x12\x58\x0c\x8e\x11\xd3\x03\x65\x58\x85\x2e\xea\x56\x09\x83\xc4\x29\x10\xaf\x9e\xaa\xaf\xdf\xfc\x9f\xa5\xb4\xb8\x87\xef\xd0\x60\x93\xe0\xc8\x6d\x1d\xcf\xf4\x24\xf6\xca\xef\x17\x95\xe3\xd9\x34\xff\xb4\x18\x9f\xa4\x49\x9a\x58\xd7\xe7\x74\x9c\x6d\xd3\x19\x3f\x62\x46\x24\x30\x37\x37\x6f\x41\xba\xfb\xce\x62\x11\x98\x46\x0b\x05\x3f\x37\x7a\xc9\xeb\x69\x02\xcd\x0d\x94\xd2\x6a\x11\xca\x1a\xbb\xfd\x87\x36\x38\xc9\x20\x44\xb3\xd9\x1c\x8b\xbc\xed\x05\x39\x47\x24\x26\x2a\xe1\x24\xc1\x1d\x83\x9b\x4c\xc0\x90\x21\x5c\x25\x9c\x0b\x8c\x2e\x3d\x7e\xf7\x1b\x14\xc7\x6b\x69\xe2\x44\xd8\xc6\x20\x71\xea\x8c\x6f\x63\x19\xf2\xef\xea\xea\xd0\x63\x24\xfc\x50\xa3\xc6\x60\x57\xcc\xae\x1a\x68\x01\x4e\x70\xea\x2a\x11\x5a\xa7\xd4\x43\x22\x96\x4e\x19\xd8\xc5\xc9\x89\x22\x71\xca\xbd\x0a\xca\xcd\x09\x6d\xdf\xe8\x21\x55\x2c\x84\x75\xa8\x1e\x8e\x8b\x66\xa8\x4b\xa9\x12\x25\x8c\x22\x2f\x57\xaa\xdb\xfd\xbe\xe7\x25\x9c\x07\x3c\xde\x6e\x94\x02\x6c\x78\x38\xf0\x9f\x28\x97\xdb\x27\x3b\x12\x20\x04\xb3\xb9\xd8\x26\x5b\xda\x46\x76\x1b\xca\x0c\x37\xb2\x04\x04\xc7\x8a\xd0\x77\x5e\x74\x5f\xa3\x04\x8b\x43\x73\x75\x9b\x44\x53\x8a\x54\xe2\x8f\xf9\x92\xd7\xcd\x7a\xb9\xf1\x07\xd2\x14\x9c\x22\xe7\xbe\xe9\x9b\x31\x55\x1a\x68\x8a\x2b\xf5\x7b\x2e\x6a\x5e\x4a\xcf\xff\xad\x52\x92\x64\x48\xec\x31\x60\xbe\x0f\x2e\x99\xef\x55\x4a\xb2\x84\x3a\x98\xdd\xdd\x4e\x9c\x1d\x2a\x74\x32\xe9\x7b\xeb\x90\x86\xa9\x41\x30\x41\xa9\x1e\x1d\x7d\xfb\x90\x68\x53\xa5\x21\x0f\x0d\x69\xa1\xc9\x6f\x55\x75\xfb\x36\xd0\xe9\x75\x83\x64\x8a\x4f\x2b\xb8\xfc\x00\xdf\x4e\xe4\xbf\x6b\x1a\x85\x54\x83\x4b\xea\x1e\x78\x5e\x7a\x85\xb8\x2e\x5e\xec\xfd\xc3\x34\x4a\x94\x1b\xe8\x35\xae\xf6\x87\xaa\x84\xb3\x1f\xc1\x25\xe7\x7d\x34\x0b\x8e\x88\x6c\xfc\x91\x53\x96\x25\x98\xd5\xde\x42\x3b\xd4\x52\x9f\x85\xd3\xfc\x9f\xff\x99\x33\xc2\x29\x13\x44\xd9\xb6\x67\xdb\x6a\xe2\xc0\xdf\xd3\x5b\x13\x29\x36\xb2\x76\x6e\x27\x2f\xae\x54\x53\xd3\x98\x24\x92\xdb\x8e\x38\xcc\x4c\xcd\xae\xd4\x34\xa6\x04\x91\x53\x07\x50\xbc\xd8\x9e\x0f\xc2\x6f\xad\x69\x1c\x19\x06\x1a\x2b\xaf\x6d\xf9\x26\x97\xd5\x25\x7d\xd1\xf4\x9a\x3a\xc1\xbd\x6d\xb9\x79\x7c\x7c\x7d\x5a\xef\xfe\xb5\xb7\x54\xf0\xdf\x36\x0f\xb7\xab\x17\x77\xfd\x44\x66\xc8\xac\x07\x3f\x61\x54\x91\x48\xb3\x24\x41\xf6\x74\x94\xd3\x2c\x7e\x54\x75\xa1\x0c\x5a\xcd\xe6\x87\x9c\xe0\xc6\xc9\x48\xf8\xba\xb3\x52\x8d\x29\x02\x43\x5a\x63\xfa\x41\xab\xaa\x98\x74\xc3\xa9\x34\x53\x9c\xbb\x7e\xbb\x9b\x3b\x5e\x1f\xd6\xb7\xc6\xda\xd8\x62\x75\xca\x03\x89\xfd\x1a\x9f\x5c\x4e\x5b\xcb\x54\xca\x15\xc1\xa4\x8e\xe5\x05\x5d\x1c\x8f\xc6\xeb\x1b\x7b\x05\xa9\x08\x34\xa6\xcc\xeb\x83\x15\x0b\x75\x52\xc3\xfd\xfd\x0a\x95\xa2\x23\xee\x64\xcd\xc6\xbf\x23\x34\x71\x10\x4f\xe3\xbb\xca\x36\xf8\xf9\x04\xed\x57\xe5\x9a\xf3\xc7\xe3\x91\x82\xd4\x4c\xeb\x1f\xbc\x86\xf7\xea\x74\x0d\x4b\xed\xef\x51\x11\x02\xb4\x47\x23\x6f\x4f\xa2\x91\x75\x7e\x6c\x2f\x6a\x2a\xa9\x22\x51\xa6\x7c\x5e\xc3\xbd\xd0\x81\xfb\x9a\x2a\x22\x41\xbb\xfc\xa5\xd1\x14\x32\x88\xb0\xc9\x46\x95\xaa\x48\xfa\x80\xb6\x73\x4d\x7d\x8e\x33\x85\x38\x46\x76\x85\xbb\xd7\xa7\xdb\xfd\xdd\xcb\x62\xb9\xbf\xd9\xec\xfc\x41\x88\x11\xab\x59\x54\x6f\x73\x75\xe3\x14\x74\x1c\xf7\x59\xf4\x4b\x52\x41\x95\xea\x90\x20\xe8\xe2\xdb\xf9\x08\xf5\xf2\x3d\x3f\x8e\x80\x53\xa9\x06\xc0\x4e\xf6\x1a\xbb\xd1\xda\xca\xd9\xce\x2c\x60\x01\x6e\x65\x55\xfd\xc6\xcb\xbc\x41\x0b\x37\x72\xaa\xb3\x40\x46\x41\xe8\x3b\xae\xba\xad\xf3\x0e\xe0\x22\xb4\x1e\xdf\x70\x46\xd2\x00\xf8\x58\x99\xd6\xa4\xd3\x6c\x2e\xdf\xd9\xcf\x8c\xd8\x89\xd0\x56\x6f\x6f\x05\x2c\x4e\xed\x7b\x55\x3b\x05\xce\xa9\x2b\x38\xfa\x6a\x19\x8d\x18\xba\xc6\xca\x4b\x20\x59\x7d\xaa\xdf\xae\xba\x8c\x19\xe5\xa9\x08\x1c\x50\xaa\x3e\x78\x70\x5b\x7f\xe3\x21\x95\x98\x4d\xfe\xac\x5a\x44\xad\x4c\x8e\xa6\x86\x2e\xa0\x0b\xff\xa1\xe5\x17\x30\x93\xf1\x1d\x86\x32\x89\x9c\x9f\x55\x62\xf5\x39\x6f\xcf\x16\xa9\x6e\x77\x91\xf1\xe5\xa3\x38\x40\x64\x37\xea\xea\xa4\x64\x72\x94\xd1\xc0\xf5\xdc\xef\xf8\xcf\x2e\x96\xd8\xe6\x6f\x25\x6f\x4f\x9e\xdd\x4e\x65\x2c\x8a\x05\x19\xf2\x55\x0c\xf4\x28\x55\xc6\x18\xd3\x64\x98\x92\xcd\x15\x96\x53\x2e\x53\x64\xe3\x3c\x86\x3f\x5d\xda\xac\x7f\x51\x0c\xe8\xc4\x26\x9f\x9e\x31\x85\x85\xcc\x9a\x7f\x5d\x30\xf7\x8e\xdf\x0f\x8b\xcd\xd7\x38\x98\xa6\xfb\x21\xa4\xc8\x8e\x88\xa3\x08\xf9\x34\x6f\x6f\x6f\xdd\x33\xc4\x89\xc0\x4f\x60\x78\x5a\x1e\x2a\xee\xe6\x78\x96\x12\xc6\xa9\x6b\x96\x34\x16\x75\x28\x34\xa4\xb2\x94\x0a\x4c\x11\xdd\x71\x09\x37\x55\xf5\x31\x28\x82\x66\x59\xc6\x91\x70\x4a\x16\xc0\xcb\xd7\x23\xc6\xa8\x3d\x72\x38\xe3\x49\x8c\x8e\xf7\x71\x06\x65\x39\xbf\x02\x78\x06\x18\xd7\x2c\x37\x2f\x2f\x33\x42\xf4\x2a\x13\xd2\x80\x91\x4d\x5f\xce\x7c\x70\x90\x09\x9d\x61\xfe\x81\xdb\x85\x01\xdd\xda\xef\xfc\x7b\x73\xad\x49\xaa\x34\x13\x5a\x04\x46\xa3\xeb\xc3\xd4\x77\x6e\x60\xba\xbf\x66\x52\xcb\xc8\x67\x71\x3b\xe7\xa2\xb9\x39\x2f\xb0\x4d\x6e\xfe\x7b\xaa\x38\xc5\xfb\x2c\xf9\x01\xde\x2f\x30\x4b\x59\x17\x76\x3b\x72\xb1\x6d\x5b\x1d\x87\x1e\x67\x06\x61\x8a\x29\xbb\x27\xf8\x32\x21\xe9\xe4\x5e\x20\x0a\xb2\xc8\xea\x76\x3c\xc2\xc1\xa0\x40\xc8\x55\x54\xf3\xe8\xbe\x20\x11\xc4\x68\x7e\xfc\xdc\x1b\xb6\xed\x3d\x1f\x26\x3e\x33\xe0\x34\xcb\x86\xfc\x86\x58\x5c\x72\x4d\xba\x8a\x07\x34\xc6\xd4\x0d\xaa\xb3\xdf\x40\x3b\x28\x86\xf0\x40\x12\x15\xbb\xd8\x72\x71\x30\x44\x70\x45\xd5\x3a\x08\xc1\x2f\x74\x14\x15\x0f\x20\x12\xdc\x7f\xd9\x45\x51\x0c\xc1\x2f\x3c\xd0\x44\x88\xbe\x8c\x97\x77\x2e\xa1\x3b\x46\x42\x43\x42\x7a\x5f\x15\x6a\x40\x5d\xa1\x38\x55\x19\xb5\x79\xc7\x5e\x96\x73\x7e\xce\xf0\x30\x8c\xb0\x86\xf8\x02\x26\xf6\xae\x6a\x43\x3f\xe7\x7c\x44\xde\x1d\xef\x06\x0c\xdd\xaa\x2b\x8f\x12\xa6\x61\x8a\xbd\x3e\x77\xbb\x97\xc5\xad\xbf\x80\xe0\x86\xa1\xf5\xbd\xfa\x2a\x86\x4c\x23\xf6\x78\x14\x09\xd7\x2e\xfa\x02\x32\x3f\xe6\x53\x36\x9c\x8b\xe6\x64\x77\x62\x92\x60\xb6\xef\x0b\x77\xa0\xa9\xf9\x70\x83\x34\x4f\xb5\x97\x93\x1e\x64\x81\xc6\xc3\x58\x60\x28\x9f\x4e\x0d\xd4\x5e\x30\x51\x71\x46\x22\x1a\x79\x1b\x1b\x8c\x17\x10\x67\x4c\x20\x82\xe7\xfe\xa7\x69\x44\x6d\xa6\x17\x55\x0c\xbd\x9a\x86\x57\x0d\xaf\xa8\xbf\xa8\x4a\x70\xaa\x3d\xbf\xb8\x2d\x9d\xc7\x01\x45\x3b\x65\xe0\xbc\x9d\xd7\xf6\x5a\xb6\x8e\x40\x45\xf1\x98\x18\xd2\x02\xd4\x90\xde\x82\x3c\xd5\xb9\xab\x8e\xbc\xc0\xdb\xe4\x57\xe3\x30\x64\x99\xf3\x9d\x8b\x62\xe7\xd9\x98\x07\x99\x0c\x1e\x67\x26\xe1\xca\xd5\x78\x73\xf6\x59\xbe\x41\x6a\x8a\xc7\x5c\x88\xd4\x4f\x42\x9b\x34\x98\x20\x92\x79\x2c\x43\x09\xae\x7e\x65\x69\xfe\x26\xef\x2b\xa1\x14\x0b\x9c\x46\xe2\x70\xb7\x5e\xbd\xec\xe3\xfd\xc3\xfa\x71\xed\xdf\x43\x4a\x24\x56\xad\xf1\x58\xb4\xbf\x79\xfd\x97\xd3\xb7\x56\x3c\xcd\x8c\xf4\x76\x03\xad\x43\x16\xdc\x42\xcb\xf3\xe2\x4a\x80\xcc\xb3\x28\xc4\x65\x79\xe0\x3f\xfb\x12\x3d\xcf\xb2\x10\x73\xd5\x06\x4e\x38\x49\x56\xf0\x4c\x13\xcc\xeb\x7d\xdb\xdc\x3e\x0c\xdb\xa1\xdc\xd9\xdc\x52\xb1\x5b\x02\xec\xf5\xe3\xca\x1f\x89\x24\x5a\xaf\xb7\x9a\x97\xa7\x82\xd7\xcf\x35\x38\x2c\xc2\x5f\x2c\x1b\x9e\x00\xfa\x73\xf7\xd0\x76\x0b\xbc\x8b\xa1\xc3\xc9\x9b\xe3\x5a\xdb\x7e\x3b\xd3\x71\xb5\x05\x39\xbc\x2b\x19\xc7\x58\x94\x41\x15\xb6\xd1\xcc\x51\xd4\x74\x35\x95\xf0\x75\x59\xda\xe5\x2a\x94\x9c\x38\xeb\xfe\xc8\x7f\xf6\x69\x67\x0e\x14\x0c\x38\x66\xdf\xf0\x4f\x20\x34\xfd\x6d\xe2\x1e\x71\xcd\x75\x64\x38\xd0\x70\x0f\x7d\x6a\x3f\x4f\x3d\x81\xb0\x9d\x3a\x82\x50\x8e\xd8\x00\xa3\x85\xc9\xcf\xa6\xfc\xe0\x0e\x46\x44\xd2\x3e\x7e\xf0\xe9\x94\xf1\xc3\x0b\x22\x94\xe1\x39\xc3\x06\xfe\x5f\xbf\x4c\x41\x40\x41\xe6\x9d\x5f\x50\xdd\xd6\x9d\x97\x6f\x5a\x4e\x2e\x4a\x29\x0b\x93\x81\x77\x73\x0b\x5c\xdd\xe4\x7e\xe5\x0b\xca\x14\x16\x5e\xee\x6f\x9e\x8f\x75\xf5\xd3\x99\x43\x11\x12\x89\xbe\xea\x6e\xb5\x78\xb4\x12\x20\xfb\x87\xcd\xf2\xf7\xfd\xf3\xea\x65\xbd\x71\x46\x4f\x44\x69\x86\x39\x8d\xa7\xbc\xad\xab\xce\x75\xf0\x17\x8e\x32\x8d\x9b\xf4\xf6\x98\x4b\x78\xca\xcb\x7f\x3b\x24\xad\x60\x22\xc4\xee\x39\xb3\x6a\x7b\x8e\x0e\x25\x62\x1a\x1a\x57\x0f\xb8\xda\xf1\xe6\x63\x8b\xa4\xba\xc3\x88\x19\x69\x3b\x9d\x22\x58\x7e\xe8\x82\xc8\x41\xcf\xf3\xf8\xd1\x63\x20\xc8\x08\xd2\x79\xad\xa3\x2c\xa5\x48\xa8\x21\x7b\x96\xef\x96\x7f\x16\x5b\xad\x27\x6f\x2e\xc9\xa8\x41\x0c\x20\xe7\x10\x2a\x68\xef\xaa\xfe\xdb\xfd\xb2\x2a\x2c\xd2\x38\xc4\xa4\x10\xe2\x00\x9e\x79\xdd\x9e\xb7\x50\xce\x68\xdc\xfc\xcf\xff\x0e\x4b\x6c\x22\x15\x01\x9a\xcc\xbc\x85\xc3\x13\x3f\xc0\x46\x4f\x6e\x2a\xd5\x46\x35\xf3\xbe\xa8\x04\xef\x39\xdd\x5e\x4b\x43\x96\x30\x30\x7d\x22\x0b\x8d\x64\xe1\x16\xda\x9b\x53\x5e\x74\x0e\x52\xe7\x1e\x9b\xd4\xe6\x64\x92\x8b\x2c\x89\xd1\x5a\xec\x1b\x03\x3d\x6d\x30\x47\xed\x23\x12\xc1\x53\x89\x45\x9b\x4f\x94\x96\xb5\xed\xd7\xd3\xd2\xf1\x68\xd1\x09\x11\x71\x2c\xba\xef\xad\xb5\xc2\x1f\xde\x55\xa6\x2c\x38\x61\xb5\x54\x42\xc8\x90\x99\xef\xca\x6b\xf9\x7e\x73\x7e\xea\x59\xf6\xec\x08\x29\xcc\x2e\x53\xdb\x84\xf0\xa2\xb9\x60\xe1\x19\xdf\x80\x14\x4c\x5b\x9a\x52\xdb\x6a\xe0\x9e\x46\xea\x10\xed\x01\x94\x0d\x5a\x0b\xfb\x67\xa5\x69\x64\xbb\xff\x06\x40\x1c\x01\x89\x8c\x4c\x17\xf6\x27\x72\xed\x74\x9e\xe6\xf1\xe8\x8f\x76\x9f\x64\x10\x1b\xb9\x3f\x67\xd4\x02\xdb\xdb\x9b\xca\x34\x3b\xce\x66\x71\x85\x66\x86\x29\x42\x5a\x1d\xc2\x87\xaa\x6d\xc1\xbb\x25\x42\x33\x43\x17\x86\xdb\xcd\x80\x36\x63\x32\xdf\xb4\x50\x28\x5d\xb2\xda\x7d\x5b\xbd\xfc\xfe\xfa\xe4\x4f\x57\x31\x66\x81\x17\x4a\xdd\x57\x95\x6a\xc6\x68\xcf\x91\x6d\x19\xff\x75\xfc\x4f\x7a\xb9\x5b\xca\x20\xa0\x58\x40\x30\xf5\xda\xaa\xb8\x1a\xfd\x4e\x78\x28\x94\x0c\x94\x61\x90\x33\xf9\x78\x43\x3d\x32\xe6\xde\x74\xd3\x42\x12\x6a\x7a\x71\xf7\xed\x9c\xfc\x97\x92\x34\x0c\xd0\x09\xd8\xca\x77\x38\xb8\x84\x2a\xaf\xfb\xc3\x0a\xf3\x6b\x50\x4b\x12\x33\x4f\xef\xba\x3d\x1d\x8f\xc8\xae\xbc\x7f\xaa\x96\x5c\xbe\x4f\x64\xad\x6d\x52\x48\x86\x61\x84\xcd\x64\x8f\x4f\x0f\xbb\xfb\xd7\x27\xb7\x05\xca\x90\x65\x2c\x18\xd0\x7b\xbb\x97\x3a\xfa\xb0\x32\x84\x10\x03\xc3\x3d\x92\xf5\x9f\xda\x5d\xb5\x9c\x6d\x76\xff\x65\x95\x40\x46\x9c\x4b\x2f\x41\x1c\xdd\x73\x37\x2b\x25\x0b\x25\x7a\x72\x05\x6f\xda\xbb\x1a\x60\xc0\x34\x88\xfa\xbf\xf8\xdc\xb6\x6f\x73\xea\x2d\xca\x38\x34\x42\x6d\xef\xbc\xee\xe2\xe1\xb1\x91\x91\x71\xc4\x74\x8a\xd8\xe1\xa2\xe0\x2d\xd4\xbc\x30\xf9\xae\x89\x22\xb1\x92\x31\x37\xdc\x03\x97\xa5\xd9\xc9\x38\x9d\x86\xe0\x6a\x2b\x53\x30\x8c\x8c\xb5\xc6\xec\x2c\x3a\x7c\xa0\x1e\x40\xbd\xc1\x50\x60\x50\xc9\x34\xe6\x98\x59\xb3\x1c\x38\x37\xe7\xb5\xfa\x6d\x98\x57\x93\xa9\x10\xe8\x18\x60\x9c\xb5\xd1\x24\x08\x02\xc7\xd0\xec\x85\x2b\x94\x4c\x55\x82\xc9\xf2\xbd\x29\x25\x60\xd9\x6b\xfa\x66\xb2\x34\x44\x8c\x80\xe8\x66\xe5\xaa\x54\x0d\x0b\xdc\xe9\x9c\x30\x8c\x86\x87\xa4\x40\xbd\x63\x28\x79\x18\x26\xe6\x70\xdb\xb9\x18\xef\xf0\x9f\x13\x5c\xca\xa2\x76\xe3\x34\x0a\xbc\x69\x47\xc7\xa6\xa4\x20\x3c\x8b\x7a\x95\x31\xd4\x17\x1b\x9f\x24\x74\x92\x59\xd2\xc5\x1e\x44\x7b\x61\x06\xa4\x0a\xe3\x94\x4c\x73\xe6\x75\xce\x8b\x6e\x93\xbb\x12\x1a\x49\x95\x00\xba\x12\xdd\x4c\xfa\x47\xe3\xbd\x2d\xa9\xd2\x24\x0e\xfb\x0e\x96\x9b\xd3\xb9\x73\x22\x56\xbb\x6f\xfd\x80\x14\xab\x79\x2d\x34\xed\x63\xae\x54\x81\x92\x49\xf2\xfd\xa9\x6a\x57\x3f\x07\x6f\x06\xb8\xe6\x03\x9e\x7f\x67\xdb\xa4\xe6\x94\x24\xc6\x69\x7b\xe9\xbe\x7d\x37\x27\x6e\xf2\xa2\x18\x7a\xdd\xa3\x5b\x55\xa4\x33\x3a\x56\xf2\x60\x50\x06\x51\x84\x84\xda\x0a\xc6\x3f\xf2\xba\xce\xf9\x9b\x0f\x2d\x15\x61\x86\x76\x6a\x08\x7f\x9d\x41\xcc\x2b\x22\x62\xd7\x27\x6d\x79\x68\x1e\xab\xd2\x91\xb2\x29\x15\x32\x05\xa9\x6f\xfd\x78\x86\xfa\x66\xb7\x74\xc7\x22\x02\x38\x3f\xa7\xbd\x04\x93\xbb\x67\x01\xd3\x8e\x5e\x6f\xa0\x2d\x75\xcd\x6c\x4e\xc2\xe9\x81\x9f\xa0\x58\x28\xa5\xaf\x35\xae\x97\x1b\x9c\xf7\x7f\xa9\x34\xe8\x4e\x4e\xd2\x84\x4e\x5d\xa8\xe1\x8a\x54\x0c\x88\xf0\x49\xa3\x79\xa4\x97\x62\x10\xa7\xc3\xd7\x8a\x3e\x71\xb3\xab\xe6\x5e\x6d\x1c\x11\xcc\x69\xb5\x39\xd4\x4f\x53\xb6\x7e\xa5\x62\x95\x64\xa6\x55\xca\x4e\xd9\xb1\x2c\x9c\x52\x89\x4c\xb1\xe5\x1a\xef\xe7\x07\x4c\x10\xe6\x2a\x25\xae\x42\x68\x3c\x83\xe7\x81\x23\xab\xd2\x90\xe2\x0e\xb1\x37\x04\x22\x43\x50\xc8\xfc\x22\x52\x19\x0b\x1d\xb9\xda\x6b\xa3\x56\xed\xfb\x0c\xc0\x5b\xf1\x38\x56\x3e\xe9\x59\x77\xc7\xdb\xb9\x80\x5b\x71\x49\xb0\xae\x61\x91\x8e\x98\xfc\xb8\xc2\xdb\xdb\xc5\x1a\x46\x59\xe7\x4b\x8e\xd4\x16\x3b\xff\x2c\x0d\xdd\x4a\xbb\xe3\x79\xb1\xf4\xd2\xe8\x86\xd1\xa8\xb9\xab\x6a\xc8\xdf\xca\xa7\xaa\x5d\x97\xaf\x8d\x13\x55\xed\xfc\xaa\x84\xb9\x3c\xb5\x1a\x81\x74\xba\x19\x8d\x26\x65\x59\x95\x0d\x94\xad\x99\xb3\xf9\xe7\x15\x1b\xae\x54\x68\xe6\xff\x1b\xb4\x18\x7e\xb9\xcb\xe8\x90\x60\xfa\xb4\xb3\x1e\x28\xda\x34\x71\x70\x94\x0e\x8d\x66\x7f\xa5\x35\xd4\x4b\xde\xba\xea\xdd\xfc\x2b\xd0\x82\x1a\xfb\x7b\x3a\xaf\x7c\xbc\xac\xb4\x4e\x23\x13\xcc\x9a\x06\xa1\xff\x3b\xe9\xc6\xdf\xda\x6d\x21\x60\x34\xec\x5b\x05\xbf\xe7\x4d\x8e\x4a\x13\x7f\x5b\xc3\x73\xfc\x30\x10\x30\x8e\x1f\x7f\x97\x97\x7c\x90\x57\x85\x20\x09\xdc\xbb\xc4\x57\x36\x87\xa7\x85\x40\x05\xc8\xff\x7a\xe0\xed\xfb\x34\xe9\x33\x11\xc9\x54\x40\x82\xc4\x48\x63\x74\x8b\x19\xdb\x59\xdb\xaa\xed\x6d\xcc\x24\x25\x0a\x84\x19\x7e\x8f\xdc\x11\x53\x0e\x13\x94\x40\x63\x40\x6a\x16\x83\x1b\x45\x68\xd1\xaf\xa3\x51\xa0\x09\xd0\x6c\x54\x76\x30\x97\xa5\xd7\xcb\x0e\x40\x45\x18\xd2\x71\x03\xa7\x21\x99\x19\x04\x31\x40\xb5\x21\xa0\xb8\x7d\x18\xf2\x76\x2b\x08\x93\x10\x9b\xde\x90\x17\x60\x44\x2f\x73\xf1\x6a\x42\x0e\x71\xaf\x2a\x87\x49\xdd\x19\x3e\x1a\x88\x08\xb7\x5d\x6e\x65\x55\xe6\x7f\x82\x9a\x54\xe7\x21\xa2\x01\x7e\xcc\x23\xcf\x1d\xc3\x8c\x9e\x5e\x23\x94\x98\xe3\x7c\x59\x7d\x5f\x6f\xd7\x9b\x27\x7f\x6a\x96\x19\xca\x08\x0c\xd3\xee\xa6\x1b\x03\x44\x3c\xf1\x84\xcb\x17\xd5\x17\x88\x94\xc4\x3e\xb6\xed\x7b\xf5\xb5\x77\x95\xc3\xf9\xef\x10\xe9\x88\xf0\x81\xc0\x78\xf7\x76\x3a\x2b\x81\xfd\xc6\x83\x37\x34\x49\x07\x01\xe3\x31\x33\xfe\xe2\xa4\xed\x68\x7c\x9f\x71\x0a\xb8\xfd\x5a\x3a\xf8\xdd\xb7\x5d\xb5\x3c\x35\x6d\x75\xb8\x56\x6a\x86\x58\x84\x58\xfa\xf3\xbd\x83\x0f\x15\x2f\xa1\x76\x94\xe2\x93\x27\x8d\x81\x5a\xd6\xbc\x76\xc9\xeb\xa1\xc2\x82\x4b\x76\x41\xac\x23\x24\x26\xe8\x02\x60\x5d\x95\x30\x5c\x56\xb1\x8e\xd2\xa8\x57\xdc\x72\xa5\x85\xf9\xa5\x9e\x70\x8d\xd3\xef\xab\xf3\x17\xaa\xba\xa7\x04\x55\x90\x52\x69\xe5\xba\xf3\xb2\xf1\x7e\x94\x3f\xca\x42\xa6\x87\xdd\xb5\xb6\x90\x3d\xbe\x7c\x2a\x0d\x57\x9c\xed\x90\xf9\x5e\x4d\x3a\xb5\x49\x1c\x0c\x42\x22\x48\x15\xc7\x1d\xf7\x66\xb5\x7a\x59\x6e\x7c\x32\x10\xb2\x30\x33\x75\x23\x74\xc0\x71\xde\x3a\xc7\x06\x78\x6c\x24\xd3\xf2\xe6\xdb\xe9\xc0\xcb\x99\x0a\x31\x70\x30\xb5\x33\xdc\x38\x2f\xe7\x1d\x87\x54\x1a\x21\xf1\xfa\xe3\xb6\x2a\xc7\x59\x12\x10\xcc\xd4\x21\x8e\x1e\x1e\x36\xbc\x63\x11\x87\xc2\xba\x20\x26\x1d\x30\x1b\xde\x82\xa4\x29\x16\xab\x34\xb4\xf2\x1d\x17\x9f\x31\x35\x93\x51\x71\x80\x20\x6e\xbb\x9b\xb9\x27\x94\xd2\x60\xbb\x8d\x9a\x0d\x52\x11\xf7\x2d\x11\xa0\xa2\x4c\x8a\xa1\xc0\xd0\xf8\x9a\x88\xf7\x35\xb2\x73\xdd\xd1\xbb\xaa\x1e\x0a\x05\x4d\x66\x83\xd2\x12\xe3\xcc\xdd\x3b\x3c\xe4\x6f\xef\x23\xe0\x0e\x80\x22\xd8\x81\x7e\x34\xdd\x26\xdd\x06\x0c\x63\xdc\x1b\xe8\xd8\x88\xfd\x70\xf5\x09\x65\x7b\xaa\xa7\xd1\x01\xe8\x34\x0d\xb4\x53\x63\x80\xe3\x65\x59\x0f\x74\xaa\xd1\x86\x7e\xdb\xec\x76\x1b\x7f\x9a\x12\x99\x91\xae\x2a\x8a\x4d\xfd\xfb\x80\xe5\xe5\x7f\x58\x6f\x52\xe3\xff\x1d\xd9\xe5\x2b\x85\x04\x1d\x44\x21\xb6\x24\x20\x82\xe8\xd9\xf0\x0c\xcd\xaf\x5b\x1d\xc4\xa1\xd5\x5c\xb0\x2c\x12\x2b\xef\x09\xeb\x20\x05\xe1\xbb\x6e\x97\xfc\xd8\xf2\x7c\xec\xc4\xf6\x3f\x98\x01\x16\x67\x9f\xa0\x68\x90\xe2\xa7\xdc\xa1\x78\x6f\xff\x6e\x75\x20\x03\x07\xbf\xb2\xf4\x1c\xcd\xf5\x3d\x43\x93\x34\x41\x47\x52\x55\x6f\x86\x49\xc3\xfd\x5d\x00\xb3\xd5\x8f\xf5\x7a\xbd\x7f\x99\x54\x89\x35\x65\x14\xd3\xd9\x7f\x4b\x35\xb5\x1b\x2e\xc1\x04\x2c\xe5\xea\xa7\xbb\xad\xc9\x17\xd5\x34\x31\x8e\xe5\x43\xf5\x36\x92\x9c\xbe\x15\xaf\x65\x0f\x5a\x1c\x4f\x4a\x4d\x33\xe3\x7b\xb7\xc0\x0f\x9f\x83\xce\x13\x4d\x55\x2a\x9d\x40\x26\x34\x58\xc2\xee\xb6\xa0\x63\x55\xb7\x2f\x20\x21\xff\x04\xa3\x64\x3b\xbe\xd1\xd0\x22\x61\xfb\x9e\xf3\x71\x91\xc3\x0d\x0b\x25\x76\x4f\x0e\x92\xb9\xce\x43\xd4\x61\xc4\x1d\x38\x6e\xf1\x56\x03\xa8\xa5\x49\x44\x75\x4f\xd2\xf9\xbb\x38\x85\xc8\x55\x8d\xa7\xc9\x9b\x8b\x88\xd0\xa6\x6d\xe2\xad\xe6\x2d\x38\x09\xec\xc9\x20\x1e\xa0\xe9\x35\x3b\xb2\x6d\x76\x1f\xfb\x58\x71\x74\x99\x77\x1a\x66\x9f\x74\x24\x02\x6c\x9e\xdb\xad\x1f\x57\xfb\xd7\xe7\xdb\xc5\x6e\x35\xae\xc1\x6a\x26\x25\xae\xa7\x85\xe9\x70\xcf\xab\xf2\x87\xd7\x39\xf1\x53\x8c\xf6\x73\x2c\x9d\x38\x0e\x3a\x06\x86\x09\xe0\xfb\xd5\xd3\x3e\x18\xd5\x6f\x74\x02\x84\x27\x2e\x18\xb4\x4c\x8a\xdb\x2f\x7e\x44\x32\x9c\xff\x5b\x86\x47\x67\x2a\x26\xa1\x8b\x3b\xbb\xcd\xf4\xe6\x74\xb6\xe4\x9f\xf3\xdb\xb0\xe6\x21\x8f\x1d\x9e\xa6\x3e\x37\x2d\x2f\x7e\x60\xa7\x9c\xb3\x9b\x9a\xb3\x10\xd9\x0d\xdf\x79\xad\x64\x77\x57\x5d\xcc\xe4\x8e\x69\x9e\xd9\x8d\xc9\x90\x29\xcd\x2f\x01\x91\x0a\x24\x6b\xc1\x30\x7b\xff\x9f\x53\xfe\xe7\xfe\x3f\x7f\xce\x48\x16\x2a\x2d\x59\xa0\xec\xda\xbb\x39\xfb\x09\x63\x4c\xcf\xa4\xcd\x57\xab\x84\x6a\xaf\x0a\xd4\xbc\xdf\x9c\x7f\xd4\x79\x3b\xd0\xfc\x9b\x83\x44\x40\x10\x50\x8e\x79\x9b\xe3\xa9\x79\xbf\xe0\x72\x84\x20\xc8\x4c\x87\xfe\x3b\x78\xce\xef\xe1\xfb\xea\x06\x00\x36\x78\x62\x04\xb2\xab\x96\xef\xbc\x2c\x61\xbe\xf3\x0d\x82\x80\x9b\x5d\xcf\x37\x4b\x5b\xb7\x00\x02\x42\x43\xcc\xb1\x2e\x94\x72\x74\x54\x1e\xb4\x08\x56\x0d\x78\x46\x51\x17\x02\xd2\xed\x82\x5e\x3b\xaf\x05\x83\x9a\xec\x2f\x4c\x23\x86\xd5\xc0\xdb\xd5\xe3\xce\xff\x8d\x43\x76\x1d\x22\xeb\xca\x06\xfe\x15\x51\x4d\x90\x09\xe1\x79\xf5\xb2\x5f\x2c\x97\xc8\xab\xb3\xb8\xbd\x5d\xef\xd6\x9b\xa7\xc5\xc3\x48\xc3\x1d\x82\x28\x4b\x95\x51\x87\x6a\x61\x8f\x1f\xb8\xbf\x17\x96\x05\xcc\xf0\x7f\x6e\x2d\xef\xe2\xf8\x87\x62\x91\x68\x23\xfa\xbb\xe3\x1f\x50\x8f\x5a\xf6\x20\x88\x41\xa3\x77\x86\x0c\x41\x93\x1e\x46\x08\x12\x9e\x62\x27\xc2\xed\xea\xee\x65\xb3\xdd\xed\x1f\x37\x4f\xbb\x6f\xfb\xf5\xd3\xfe\x71\xfd\xf4\xba\x5b\xf9\xfb\x4b\x83\xc8\x08\xcc\x42\xfb\x6e\x74\x08\xae\xb8\xa5\xb3\x46\x08\x82\x34\x33\x8a\xea\xa7\x06\xea\x47\xfe\x33\x3f\x9c\xbc\x0c\x94\x89\xb4\x9e\xde\x26\x33\x24\xe5\x46\x03\xfb\x00\x2d\xbf\xd8\x23\x46\x09\x98\x6b\x3f\x29\xc3\x38\x1a\xf0\xb6\x1d\xba\x40\xbf\x9d\x04\x19\x10\xa4\x56\x65\xb4\x31\x8a\x81\xdb\x16\x8e\xee\xa1\xb3\x40\x20\x1c\xf6\xa1\x92\x1f\xeb\xd2\x36\x65\xd8\x63\x9c\x48\xd6\x87\x30\xdf\x4f\xf0\xcc\xcf\xab\xdd\xb7\x5b\xac\x50\x1b\x08\xd9\x8c\xf3\x05\x01\x4f\xa4\x8c\x07\x6e\xbd\xb2\x6a\x2d\xe3\x51\x82\x98\xb6\xa8\x6e\x07\xe8\x1c\xb4\x45\xeb\xa8\x6a\x26\x0b\x4d\x30\x23\x7f\x61\xea\xda\xcb\xcd\xea\xee\xce\xdd\xa1\xd0\x1a\xe3\x4f\xac\x4b\x19\xa9\xcf\xc6\x1d\x93\x9a\xa5\x06\xa7\x57\x14\x50\x5b\xb0\x5b\x5e\x95\x38\x3f\x06\x69\x6b\x8c\x78\x9d\xbe\xa5\xb1\x68\x8b\x52\x19\x31\xeb\xc9\x2d\x2b\x16\x40\xcf\xab\x15\x58\x5f\x66\x90\xde\x80\x40\x25\x46\xad\x6f\x51\xb4\x50\xef\x1f\x41\xe5\xdd\x92\x9b\xd5\x74\x77\x4e\x2d\x04\x90\x71\x4c\x54\x9f\xca\xaf\x9a\x1f\x27\x8f\xaf\xa9\x88\x2c\xe0\xc0\x6e\xf8\x53\xdf\x7f\x78\x29\x9d\x50\xa6\x7a\xd8\xfa\x95\x66\x52\x37\x18\x32\x6a\x19\xa5\x3a\xbb\xb8\x3b\x1f\x47\xc5\x2f\x08\xb4\x4e\x24\xf3\x20\x77\x57\x5a\xee\xc2\xfe\x0c\xdb\x24\x3f\xa1\x69\x1d\xd4\xde\x1f\xd3\x01\x62\x9a\xa0\xe6\x8d\x69\x78\x1e\x17\xdd\x80\x90\x44\x23\x30\x4e\x9c\xce\x3e\x65\x39\x7a\x66\x42\x52\x8a\xbd\x52\x5d\x78\xd4\x7f\xb9\xd9\xe8\xb3\x1b\x9c\x21\xc6\x26\x6f\x1c\x64\xf1\x8a\x76\x07\x10\x22\x33\x44\x01\x6a\x03\xc2\x19\xfb\x56\x40\x28\x61\x56\xef\x45\x3d\xe4\x1f\x30\xf3\xa9\x08\x15\x8c\x4a\x27\x42\x7c\x1c\x4e\x23\x42\x45\x8a\x38\xee\x7b\x68\x9f\x73\xff\x3a\x42\x01\xd2\xd1\x50\x1f\xf3\xcb\x0a\x23\x90\x28\x8a\x31\x2d\xf3\x99\xc3\x17\x8b\xdc\x79\x91\x10\x48\xf9\x50\x23\x25\xda\x3d\x5c\x7b\xfa\x48\xa6\x88\x92\xb1\x1d\xe6\xce\x32\x4e\x06\xa9\x10\x21\x4b\x16\x6b\xb9\x28\xa6\xdc\xab\x40\x22\x60\x91\xf5\x04\x17\x16\x1e\x39\x33\xbf\x08\x0b\x94\xe1\xc8\x7c\xaf\xab\xaf\x6d\xc1\x0f\x87\xc1\x3e\x3a\xe7\xff\x03\x61\x51\xc8\xe8\x40\x75\xa4\xd9\xe5\x45\xf1\xc8\xdb\x16\xbe\x7e\xf3\x43\x12\xec\x16\x3f\x1d\xdf\x6a\xae\x60\xd4\xdf\x0f\x84\xc5\x0c\x51\x16\x5d\x74\x5d\x62\xf7\x7d\x5b\x49\x07\x1e\x07\x12\xa7\x14\x51\xd6\xcf\xbb\x87\xa5\xfb\x5b\x12\xb0\x24\x70\x3a\xdb\x3e\x78\x05\x92\xc4\x31\x56\x41\xf6\xdc\x4a\xc7\x0d\x29\xac\x80\x24\x19\xc1\x1e\x03\x5e\xa0\xf0\xa0\xf5\x49\xfd\x36\x45\x12\x65\x4a\x0a\xa8\xde\x78\x3e\xb6\xfc\x54\x5f\xc6\xbf\x40\xd2\x94\x20\x05\xb1\xe5\x56\xc9\xcb\x37\x2f\x82\x03\x24\xe5\x3a\xb3\xaf\xc3\x2a\x5e\xd4\xeb\xf2\xb3\xca\xe5\xc4\x29\x4a\xdd\x78\x3b\x81\x06\xbd\x01\x96\x1b\x76\xf2\xa3\x4a\x91\xd4\x66\x49\x1a\x43\x2a\x3e\xf1\x08\x48\x46\x39\x52\x26\x2f\x5e\x96\xef\xfc\x97\x44\x62\x40\x32\xc6\x94\xee\xf1\x27\x37\x67\x1b\x0f\xcc\x03\x48\x81\x70\x49\xb5\x1a\x90\x22\x8d\x04\x6b\xec\x18\x11\x44\xb8\x13\x3b\x54\xc8\x90\x50\xc5\x0d\xa1\x09\x62\x90\xb7\x8b\x87\xd5\x7e\xf1\xf0\xb0\x59\x2e\x76\x3e\xa5\x05\x44\x00\x10\xc7\x13\xfe\x73\xfc\xed\x24\x0d\x13\x1b\xea\xf2\xfa\x6d\x4f\xf7\x39\x7a\xc5\xee\x68\x92\xa2\x90\x9d\xe0\xad\x7c\xdf\x37\xb3\xa8\x08\x3f\x54\xbb\xb9\xb3\x9a\x3a\x75\x44\x66\x09\x22\x4f\x0c\x45\x3d\xf8\xbc\xbe\xff\xbc\x10\xc5\x80\x9b\x5f\xc1\x25\xdc\xc0\xbc\x5b\x9e\xfe\xd7\xe8\x17\x21\x35\x49\xee\xc7\xf5\xd3\xfa\x71\xf1\xb0\x5f\x3f\x7d\x5f\x6d\x77\x3d\xf3\x11\x10\x10\x14\x3b\x0a\xdd\x9b\xfb\xe7\x89\x97\x6d\xb7\x44\xed\x71\x9d\x66\xd4\xb4\x9a\xfc\xfb\xd4\xb4\xfb\xd5\xcb\x92\xd2\xd0\xbb\x14\x83\xf5\xab\x35\x89\x4d\xf6\xc6\x56\x9b\x36\xf5\x33\x6f\x1c\x9a\xfc\x05\x46\x8a\x0f\xa3\x47\xa7\x41\x98\x60\xf4\xe1\xfa\xfa\xcb\xa6\xb7\xdb\xf3\xfe\x09\x0d\x18\x73\x49\xab\xce\x94\x9b\x6d\x0b\xc3\x0d\x95\xf3\xd2\xa0\x3a\x7e\x9b\xfc\x8a\x90\xb8\x3c\x50\xee\xd9\x3e\x1e\x25\xb6\x7f\xe0\xcd\xb5\x04\x02\x25\x49\x4c\x6d\x22\x08\xdd\x87\x66\x3a\xdb\x29\x49\x23\x74\x9c\x3f\xb1\x06\x72\xa5\xad\xce\x8d\x95\x2a\xb1\x0b\x7f\xdd\x0e\x79\x06\xc6\xcf\x43\x94\x44\xa9\x5d\x7d\x2a\x07\x58\x29\x7b\x90\x86\x86\x54\xf0\x0d\xda\xef\x55\x0b\x75\x33\x94\x57\xea\x0e\xeb\x78\xc8\xfc\x85\x75\xe0\xf9\x85\x42\x23\xaa\xd1\xdd\xed\x2b\xdc\xee\x80\x0a\x31\xd5\xfb\x63\x75\xd3\xe7\xeb\x80\x32\x96\x24\x66\xed\xbb\xbd\xd2\x6a\xb0\xd8\xe3\xb1\x10\x46\x4a\xd0\x10\x4f\x0d\xba\xa2\x86\xa6\x86\x26\x04\x90\x12\xcf\x72\xbf\x2c\xca\x37\x28\x7a\xe8\xfa\xaa\x7f\x96\x84\xa6\xa1\x69\x01\x41\x2b\x8a\xdc\xd8\xf3\x81\x0d\x4d\x43\xe2\xdc\x3c\x9f\xd3\x34\x7a\x97\x7e\x80\xc0\x1c\x96\x15\xef\xf1\x50\xa7\xda\x9b\x5d\x9a\x46\x46\xd3\x14\x29\x08\x1e\x78\xd3\x5a\xef\xcc\x1d\x4e\x0c\x24\x93\xcb\xc2\xff\x49\x70\xdc\xc9\x1f\xab\xfa\xf8\x0e\x27\xd3\x80\x71\xb7\xf8\x7d\xe5\x07\x68\x89\x4d\xd0\xb9\xac\xb6\x50\x7a\xd4\x1c\xd0\x2c\x88\xb0\xdc\xbe\xe4\x47\xf3\x2b\xea\x1a\x81\xa5\x3b\x81\x26\xae\x15\xe0\x05\x9a\x53\xe1\x67\x68\x96\x45\xa8\x91\x71\x32\x82\x6b\x36\x8d\x38\xe8\x48\x04\xca\x23\x8e\xdb\xd1\xcb\xc3\xc3\x2c\xf9\xdc\x8c\xb0\x05\x50\x9e\x99\x8f\x6d\xd6\xa1\xa9\x3a\xfe\x45\x84\xf2\x57\x39\x81\xb9\xe2\x6f\x7a\xd1\x83\x07\x54\x50\xa9\xfa\x14\xca\x6d\x55\x5e\xcc\x5c\x11\x45\x8e\x94\xa1\xdb\x82\x2c\xd0\xdb\x77\xbe\x0d\xae\x25\x89\x0a\x4c\xdb\x5b\xa9\x3a\x7b\x15\xec\xaa\xdb\x5e\xa7\xc4\x0f\x02\xac\x46\x21\x35\xe6\x0f\x93\x33\x5f\x56\x87\x03\x66\x89\xf8\x95\x55\x0a\xb1\xa5\x17\x83\x52\xdd\xe7\x7a\xba\x4e\x41\x19\xea\xb3\x76\xc8\x2d\xe3\xa7\xa3\x4e\x29\xd6\xe3\x1b\xfe\x09\xcb\xf7\x2e\x70\x29\x27\x05\x17\x08\x03\xf2\xff\xb3\xf6\x27\xcd\x8d\x23\xc9\xb6\x38\xfe\x5d\xde\xaa\x16\x77\x11\x98\x81\xff\x8e\xa4\xa8\x4c\x76\x69\x60\x93\x54\x56\x75\x5f\xbb\x46\x8b\xc1\x43\xc4\x15\x08\xb0\x30\x48\xc9\xfe\xf4\x7f\x83\x7b\x04\x26\x42\xaa\x7c\xcf\x7e\x9b\x52\x16\x23\x30\xc7\xe0\xc3\xf1\x73\x20\x36\x46\xe0\xee\xb0\xc6\xd1\x8c\x9f\x0f\x99\xf5\x46\x6a\x45\xe0\xb1\xd0\x43\x18\x17\x7d\xad\xc7\x34\x87\xfb\xa2\x1c\x7f\xec\x5f\xc9\xea\x81\xe7\xf8\xb1\xdb\x95\xf1\x7c\xe7\x55\xbf\xf5\xd8\x79\xe2\x39\x31\x21\xc9\x1e\x79\x9e\xda\xdf\xdc\x50\x22\x13\x38\x41\x4f\x6a\xc8\xeb\xee\xcd\x39\xe1\x30\x27\x33\xc4\x06\x16\x45\x36\xfa\x61\xe6\x5f\xf6\xf4\x89\x87\x01\x03\x64\xa7\x22\x0c\x8a\x29\xf4\x18\xdf\xbd\xa7\x62\x74\x75\xb7\x65\xda\x01\x71\xc6\xe3\xda\xf3\x9d\x90\x8c\xc0\x1c\x43\xff\x47\xd7\x3e\x82\x1f\x72\xcc\xe6\x7c\x58\x55\x55\x1c\x2e\x93\x6f\xe2\x0b\x8e\x91\x4c\xc9\x4b\x35\x48\x2b\x82\x17\xf0\x10\xef\x10\x39\x01\xe7\xaf\x1c\x08\x20\xcd\x07\xd4\xdd\xeb\x38\xb1\x6e\x04\x8f\xc7\x8f\x14\x45\xcc\xa1\x4c\xe9\xcf\x4e\x69\xaf\x57\x01\x05\x2f\x92\xc4\xed\xf9\x78\x45\x25\x83\xfd\x99\x97\xf5\xc4\xe3\xf0\x22\x48\x50\xde\xae\x3e\xa5\xd5\xad\xfe\x2e\x78\xb1\x1f\x32\x62\xae\xf9\x89\xf3\x09\x95\x38\xfb\xc6\x04\xd1\x9e\xf8\xee\x8f\xa6\xe2\x8a\x16\xad\x91\x55\x3a\xb5\x70\xbc\x38\xf0\xbd\x78\x98\x1e\x5b\x5b\xe2\x8d\xf9\x27\x8d\x79\x80\xdb\x11\x6d\xd8\xbf\xff\x6b\xf5\xab\xac\x34\xf6\x78\x19\x59\xb1\x98\x7b\xaa\xe5\x99\x11\x8d\x05\x2f\x06\x81\x5e\xdf\xe3\xe2\x4f\xc4\x7e\x3f\xbf\x58\xfb\xc7\x4b\xe2\x04\xcd\x42\x2c\xe4\x53\x8b\xee\x67\x4e\x70\xe1\x57\xa8\x3d\x77\xa6\x5a\x0f\x3c\x1e\x07\xc4\x76\x06\xfc\xfc\x3b\xc0\x25\xcd\x5f\x47\x66\xa3\xc7\x45\xe4\x21\x28\xf3\x9d\x67\x0d\xaf\x01\xc9\x29\xfe\xd9\x40\x79\xa5\xdc\xd3\xf8\x74\x22\x60\xc6\x51\x69\xdf\xf2\xb2\xb9\xa2\xcf\x3c\x5d\x7d\xc7\x87\x84\x01\x3e\xd5\xa6\x32\xe5\x66\x83\x44\x04\x78\x42\x0a\xac\xf9\x6b\xad\x9d\x85\xe5\x97\x83\xd6\x69\xc4\x2d\x4d\xf0\x0a\x8a\xbe\xf8\x04\x3c\xc5\x5c\xcc\xcc\xbc\x7e\xd4\xbf\xc4\x56\x0a\x9e\xe2\x12\xd3\x93\x54\xfc\x30\xc9\x4e\x9a\x3e\xc0\x19\xfa\xc5\xfb\xc5\xb7\xc5\xe8\xf6\xb4\x13\xa3\xe1\x65\x24\x20\x0e\xc0\xcf\x5d\x93\x1b\x82\xc0\x6a\x45\x2e\xb3\xae\xa8\x7c\x3a\xc0\xb5\x50\x18\x14\xe3\x4a\x7d\x4a\x1b\x0d\x3e\x63\xa1\xdb\xa7\xfe\xdb\x29\x6e\xe0\x38\x66\x6f\x9e\x22\x6e\xe7\x42\xda\xe0\x3b\x6e\x20\x4c\x52\x67\x22\x5d\xbe\xce\x55\x51\x56\x70\xee\x41\x80\x63\x94\xe8\x8c\x03\xe4\x3b\x5e\xac\xc6\xc0\x2c\x8c\xa2\xda\x9a\x25\xf0\x1d\x70\x10\xce\xcb\xab\x2a\x7d\xcd\x3f\x41\x03\x4c\x6e\xd1\x55\x12\x31\x0e\x0f\x8d\x7c\x5b\xf1\xea\x74\xcb\xd8\x0b\xbe\xab\x99\xdf\x91\x48\xb6\x26\x43\xd1\xd4\x9b\x9c\x5c\x67\x7b\x6d\x2f\xf6\x31\xc8\xa2\xd3\x9f\xa0\xd6\x3f\x2f\xbf\x8d\xce\xe0\x73\x27\x82\x4e\x8c\xfa\xb1\x50\x18\x34\x1a\x2f\x98\xbe\x2f\x34\x73\x6c\x38\xbf\x7d\xed\x2f\x79\xeb\xde\x55\x40\xd9\x50\xfb\x7f\x03\xa2\x32\xf0\x83\x44\x62\x78\x1e\xb9\xd3\x5b\x17\x6d\x7f\x58\x7c\x5b\x87\xb6\x39\x4c\x18\xce\xf3\x13\xaf\x4e\x4b\xa8\x3b\x9a\x5e\xf0\xa3\x38\xf4\xad\x9e\xf9\x9e\x6b\x58\xa8\x79\x30\x12\xf8\x11\x30\x31\xa2\xaa\xe3\x15\x74\xe0\x3f\xf0\x63\xad\x31\x98\x40\x13\x90\x90\xfa\xe3\x9a\xe7\xf9\x5c\xe4\xc0\x8a\xf1\x13\xdf\x49\xd8\x88\x0e\x64\xa3\x96\xd7\xc5\x67\x77\x94\x08\x85\xb6\xe4\xb2\x93\x4e\x58\xe4\x6a\x0f\x46\xb6\xf8\xbe\x28\x9f\xe0\x03\xbf\x8e\x3c\xf1\x49\x3a\x18\x7c\x61\x20\xaf\x15\xd4\xed\x93\xdc\xaa\xde\xb4\x5d\x38\x71\x70\x83\x6e\xed\x87\x03\xfc\xb4\xb3\xc7\x17\x3e\x33\x4d\xef\x08\xe4\xef\x7e\x26\x88\xb9\x4e\x73\xd4\xc8\xdb\x91\x8f\x6e\x9b\x25\x0b\xa2\x41\x36\x6c\x61\x9d\x08\x94\x7c\x78\x80\x57\x2e\xaf\x3b\xb8\x7c\x8a\xcb\x00\x5f\xaa\x2e\x19\x41\x5c\x50\x77\x20\xd3\x33\xcf\x26\x37\xae\x02\x87\x07\xbd\xad\xd7\x2e\x85\x76\x17\xfa\x6d\x9a\x40\xeb\x10\xdd\x13\x1b\x67\x74\x42\xed\x13\xe3\x26\x5a\x66\xeb\xfa\xf4\x9d\xe7\xaa\xcf\x84\xf8\x3a\xf1\x62\x6f\x8a\xfd\x1b\x91\xb2\xce\xba\x20\x01\x63\xc4\xd4\x52\x7d\x00\x5c\x1e\x2b\x03\xa9\x80\x80\x69\xa2\x7a\xf8\xfd\x2a\x57\x19\x9a\x7b\x37\xdf\x2f\x70\x98\x83\x2c\xee\xb5\x35\xdd\x0f\xc5\xdd\x54\x8b\x08\x02\x47\x07\x76\xc2\xe1\x7c\xd9\xd7\x70\xf1\x26\x7d\x5c\x29\x71\xb7\x7e\xfa\xf6\xa7\xbd\x01\x8f\x09\x2c\xfe\x5b\x3f\x6e\xf6\xfb\xcd\xf3\xd3\xf1\xfe\x79\xd7\x4f\x2b\xbf\xeb\xe6\x47\x08\xe9\x26\xca\x96\x21\x92\x70\xfe\x79\x43\x4f\xc4\x49\x17\x03\xde\xb5\x2b\xa0\x3d\x55\xc8\x5d\x5c\x5b\x40\xa5\xed\x09\x48\x66\x95\x67\xab\x4e\x6b\x73\x72\xd3\x91\x03\xbe\x85\x8c\xd9\x9c\xfc\x90\xd2\x0e\x82\x28\xe0\x18\x3c\x57\x69\xd5\x9e\x62\x57\x4c\xf4\x1b\x20\x88\x42\x89\x4c\x29\xab\xdd\x7a\x71\x58\xdf\x1d\xf7\x87\xc5\x2e\xe8\x0e\x8f\x03\x15\x10\x2c\x79\xc4\xe0\x3c\xc6\x62\xb6\xfd\x38\xce\xd9\xc5\xa5\xa0\x6c\xdb\x64\xa3\x09\x22\x88\x85\xdf\x63\x90\x4c\xad\xc8\xdf\xa4\x91\xcd\xb1\xb1\x07\xe8\xb9\x1f\xd3\x33\x06\x51\x57\x03\x09\x93\x79\xe3\x2f\x88\xc3\x10\x45\x2d\x2b\x27\x31\x17\xb1\x0d\x09\x85\x08\xf1\x26\x1f\x8a\xfc\x75\xfd\x13\x4a\x99\x56\x7d\x4c\x7a\x26\xfb\xdb\x2d\x57\x83\xb6\xe9\x05\x95\x13\x0c\x44\xfb\xb0\x48\x78\x8e\xf1\xc3\x74\x4f\x12\x86\x18\x9b\xcd\xd3\x61\xb7\xde\x6e\xee\x8e\x3f\x9e\x5f\x56\xdf\xd7\xbb\x61\x42\x19\x82\x84\x53\x71\x0b\x06\x3b\xdb\x25\x6c\xd1\xc8\xd9\x72\xff\x2f\x33\x5f\x01\x97\x31\x61\xdd\x08\x1f\x8a\xb1\xdb\x91\x05\x18\x88\xc8\xc1\x68\x76\x8f\xd4\x33\x42\x31\x5f\x9f\x58\x24\x49\x6c\x09\x7f\xf3\xb4\xbe\x03\x0d\xb9\xc1\x97\x5d\xb2\xf4\x6f\x00\x15\xed\xe1\xe0\xb7\x93\x77\x99\xd6\x8f\xeb\x3b\x34\xc0\x87\xd6\x4d\x20\x04\x55\xa9\xe7\x6b\x95\xda\x34\x36\x04\x32\x49\x50\x88\xf4\x5f\xee\x91\xca\x9b\x0e\x44\x9c\x40\xc6\x5b\x9f\xe9\x08\xa4\x88\x50\x11\xf8\xae\xa9\xe5\xc9\xbc\xb9\x6d\x71\xd7\x35\x6b\xc3\x56\x9c\xbe\xc3\xd7\x9a\xbb\xe3\x4f\xa7\x12\x32\x18\xb3\xe2\x75\x9f\xe6\xaf\x99\x11\xf0\x1c\x2a\x7b\x8d\x1f\x53\x71\x86\xc5\x1a\xad\x93\xd0\xfa\xbb\x9d\x89\x12\x28\x19\xca\x78\xc0\x12\x7a\x81\xbe\x09\x38\x22\xc5\x4a\x50\x8d\x84\x4d\xfe\x0e\x79\x5d\x74\xd2\x69\x9f\xb9\xa3\x8e\xbd\x26\xb8\x8e\xb2\xeb\x62\x39\x00\xc5\x43\x00\x11\x49\x83\xbe\x42\xfd\xdc\xd4\xb2\x38\x4f\x02\xd5\x01\x70\xa2\x98\x56\xad\xeb\x3d\xe1\xe5\x1e\x3b\x0e\x01\x00\x29\x0c\x5f\x4a\xd8\xac\x9e\x47\xda\x2f\x10\x68\x8f\x02\xe3\xa2\xb9\x3a\x6c\xe8\xf2\x05\x3a\x08\x10\xe1\x9f\x71\x35\x19\x87\x3a\xa2\x28\xb5\xe6\x8d\x84\xee\x96\x75\x12\x87\xa1\x4d\xea\xb4\x1f\xea\x01\xb4\x6d\x0c\x99\x55\xa9\xfe\x1c\x36\xd2\xd7\x32\xd9\x63\x78\x88\x58\xee\x33\x16\x7d\x76\x72\x2a\x10\xba\x2c\x44\x15\x0b\xac\xce\x19\x30\x6a\x42\xe8\xba\x0a\x73\x8b\xf5\x2b\x8c\x73\xe3\xa1\xeb\x39\x88\x9a\xdd\xfc\xf3\x70\x5c\x3d\x3f\x1d\x76\x8b\x15\x66\xd9\x77\x6b\x4b\x6e\x0c\xa1\x1b\x28\x47\xf7\x42\x83\x84\xdc\xe9\xe0\x17\x10\xba\x31\x78\x1d\xd1\x40\xb5\x32\x7e\xdf\xe7\xf1\xdb\xf1\x08\x0b\xdd\xc4\xf5\x4c\x1e\x70\x0c\x3a\x2a\x64\xd3\xda\x4f\x8b\xfa\x73\x91\x59\x08\xbd\x88\xf0\xe5\x97\xe2\x52\xff\x9c\x47\x7e\x40\xe8\x29\xa2\xb9\xae\xa0\xde\xf2\xb2\xce\x69\x67\xdf\xd2\x87\xb7\xca\x33\x03\x9b\xe5\x33\x31\x2e\x08\x7d\x06\x08\xaa\xeb\x23\x97\xe3\x0d\x29\xf4\x5d\x11\xa0\xf2\x91\x50\xf2\xab\x1c\x48\xe8\x1b\xed\x0c\xdd\xfa\xef\xc8\x31\x5a\x34\xb9\x62\x03\x44\xe3\x4d\x6c\x24\xee\x6f\x23\x16\xb8\x76\xb5\xd6\xd1\xef\x0f\x76\xbb\x9a\xcd\x98\x87\x41\x28\xd0\x70\x5e\x42\x3b\x5f\xf6\x39\x4f\xb3\x33\xc7\x44\xbe\xed\x10\x13\x94\xf7\x48\x76\xef\xaa\x38\x5f\x78\x7e\x9d\xad\xcc\x86\x30\x48\x02\x8c\xf6\x76\xd0\x10\x50\x37\xa1\xcc\xce\x1a\x0e\x03\x45\x49\x21\x9b\xad\x47\xb8\xa2\x69\x0b\x1d\x2a\x95\xc9\x40\xd7\x51\x30\x79\x8d\x61\x04\x11\xeb\x24\x1d\xfb\xea\x8b\xb1\xcb\x13\x86\x22\xc0\xa5\xbf\xc9\x53\x4b\x07\x87\x5a\xf0\x04\x35\xb2\x9d\x40\x31\x65\xf9\x54\x4a\x0c\xa5\x62\xa9\x5c\xf9\x8d\x57\x04\x85\x37\x1d\x23\x3f\x44\x9b\x53\xb7\x5f\x62\xca\x09\x00\x61\x14\x12\xdd\xc3\xfe\x83\xe7\x65\xd1\xf9\xd3\x61\xa4\x15\xca\xb9\x12\x6f\x31\x29\xa5\x8e\x9f\x26\xf6\x78\xd4\x83\x1d\x6e\xf6\xa5\xf1\x65\x62\xe9\x7b\x24\x21\x76\x0f\x9f\xc2\x43\x4c\x5f\xee\x08\x87\xea\x9c\x72\x75\xe6\xe5\xdb\xb6\x28\xb2\x43\x2f\xa2\x08\x21\x4f\x14\xae\x87\xa8\x45\x48\x21\x64\x0a\x73\xcc\x0a\x2b\x40\xc8\x05\x95\xd8\x6f\x9e\x36\x87\xcd\xe2\x61\xff\xb2\xdd\x3e\xfc\xcb\x9e\x4c\xc4\xdc\x35\x5e\x2b\x71\x78\x52\x0e\x62\x7c\x06\x91\x44\xc8\xb6\xb1\x7d\x5e\xb8\xec\xb7\x5b\xe1\xe0\xd8\xf6\xe3\x52\x8a\x89\x2e\x25\xca\xf4\x7c\xb9\x6b\x87\x42\x51\x9d\x41\x09\xfd\x76\xbf\xae\x4f\xf7\xc5\xad\x3e\xe6\xd4\xf5\x08\xa5\xaf\x7d\x2a\xb7\xad\x7e\x81\x51\xff\x93\xbf\xf6\x5c\xdc\x43\xd6\xaf\x63\x45\x8e\x5e\x7a\x03\xca\x9e\x4c\x1c\xa9\x94\x7d\x79\xb6\xf8\x06\x11\xb3\xe3\x5e\x20\x7c\x32\xe4\x97\x8b\xe7\xa7\x87\x8d\x2d\xd0\x84\x10\x54\x84\xea\xc2\xdf\x8a\x4c\x91\x5c\x68\x53\xe6\xed\x00\x19\x2d\x2a\xa0\x19\x12\x2d\x12\x41\xca\xc1\xd6\x75\xf5\xd9\x95\x50\xbb\x7e\xc7\x4a\xf2\x48\x7c\x3c\xdd\x9b\x18\x9e\x2a\x62\x71\x88\x95\x5d\x07\x38\x5f\xb2\x2e\xea\x67\x1b\x85\x87\x2a\x8d\x3b\x54\xab\xff\x91\xc2\x07\x69\x02\xbc\x43\x06\xd3\xe4\x71\xe4\xc4\xe0\x69\x43\x2d\x9a\x22\xb0\x6f\xc7\xd3\x31\x80\x12\x22\x47\xfa\x54\x8a\xd0\x7e\x9c\xbc\x36\xd2\x8a\x03\xbb\xc4\xbe\xa2\xc8\x51\x41\x68\x2b\x0b\xa8\x76\xa6\xfd\x00\x97\x22\xff\xac\x86\x00\x22\x97\x33\x4c\xc8\x2c\x5e\xed\xa2\x10\xb9\x22\xf6\x94\xdd\xd4\x96\xed\xdb\xba\x8e\x7c\x8f\xc8\x95\x04\x22\x25\x72\x17\xaa\xe8\x1d\x30\x02\x42\xe4\x79\x1e\x46\xd7\x48\x9b\xbb\xf5\x91\x3b\x44\x7d\xdb\x18\x61\xfc\x86\x3e\xf4\x7d\x56\x4c\x61\x28\x91\x17\x7b\x98\x0f\x3b\xa1\x1f\x4a\x9f\xca\x6e\xae\xf6\x2c\xbe\x41\xed\xbf\x02\xd6\xc3\x2e\xb2\xb4\xff\x04\x7e\x1c\x23\xdf\x7a\xfb\x71\x74\x51\x9e\x5f\x28\x13\x04\x5d\x3b\x04\x91\x25\x7f\xb9\x91\xdd\x83\x28\x60\x3a\x34\xd9\xd3\xa7\x34\x87\x69\x6b\xec\x23\x61\xfb\x66\x7b\xbf\x1f\x25\x81\xfe\xfb\x13\x17\x22\x0a\xa4\x17\x42\xcf\x47\xf8\x88\x3b\xcc\x53\xa1\x6c\xd1\x22\x44\xa1\xc7\x2d\x65\x1a\x39\xd7\xd0\xfa\x62\x68\x5b\x6d\xf2\x15\xcf\x95\x0d\x9b\x46\x91\xeb\x26\xba\xa3\xc0\xa3\x0a\x81\x53\x7a\x39\x0c\x92\x77\xb3\x93\x32\x8a\x22\x1f\x3f\x6a\x0e\xa0\x2a\x31\xe0\x3b\x1c\xdf\x6b\x1c\xf9\x58\x65\x70\xc9\xae\xe5\x71\xda\x26\x48\x7c\xa3\xc8\xf7\x85\xae\x57\xfc\xb2\x03\x2e\x4f\x93\x32\x61\x88\x62\x88\xe2\x2e\x61\xf2\xc0\x9b\x1c\xfb\x74\x8d\x0a\x13\x4b\x5c\xd6\x0d\xcf\x8e\x62\x46\xa3\x11\xa2\x24\x00\xaa\x67\x2e\x8b\x77\x6e\x8f\x4c\x34\xe9\x48\xbc\xfc\x7e\xa0\xa4\x0f\xa5\x97\x27\x49\xc2\xf9\xcc\x8a\x39\x05\x0f\x12\x5b\x70\x42\xea\x50\x83\xb8\x6a\xc4\xc1\x43\x43\xc8\x7a\xc0\x96\x8a\xb8\x42\x72\xee\xe6\x52\xe4\x03\x01\x7d\x73\x8c\x70\x38\xa6\x11\x6c\x40\xa8\x23\x33\x1f\x23\x69\x22\xe1\xfa\x48\x35\xb3\x59\x3d\x0f\xca\x09\x6e\xab\x3f\x6d\xf7\x38\x41\xfb\xe7\x1b\x55\x93\xac\x7f\xd6\x25\xbf\xe3\x35\x77\xa6\x97\x07\x1e\x19\x93\xff\x70\x2a\xa1\x3a\x15\x86\xa0\xd7\x6c\x24\x91\x74\x01\xf3\x86\x88\x04\xff\xb1\xde\x1f\x36\x4f\xdf\x8e\x77\x2f\xbb\x21\xb6\x23\x92\x49\x22\xbd\xde\x83\x37\xea\xf8\x7d\x76\xed\x73\x84\x3e\x44\x52\x78\xc8\xe0\xb2\x2d\x8b\x42\xdb\x13\x2a\x5f\x5b\x4f\xa4\x35\x6a\x48\xfe\xac\x6b\x54\x01\x5a\xe2\xc8\x58\x69\x46\x38\x12\x94\x6f\x01\xab\x01\x4c\x37\x0d\x1e\x18\x0f\x74\x53\xc3\xf9\xa6\x80\x02\x62\xe6\x39\x49\xdc\x27\x37\xa0\x1c\xf8\x99\xa3\xd7\x14\x33\xcf\x27\x88\x55\x6b\xdf\xef\x6f\xb2\xf0\x9f\x9a\xdf\x31\x13\x0c\x8d\x9e\x4b\x59\x9c\xad\x2b\x11\x3b\x6e\x44\x45\x36\xe8\x74\x2f\xb9\xf8\x35\x05\x62\x88\x1d\x8f\x28\x7a\x31\x66\xf8\x1d\x32\x35\xce\x39\xc5\x4e\x00\x98\xe3\xb8\x2f\x9a\x72\x51\xfe\x3f\x6f\xc2\xbf\xb6\x49\xc7\x0e\xe7\x58\x86\x7f\x22\xa1\xb8\xae\x6e\x1e\x62\xd7\x21\x72\x1b\x63\xf3\x1a\x39\xf4\xb4\xc8\xf7\xc0\xab\x22\xbf\xcf\xf8\xeb\x1c\x8a\x21\x76\x7d\x82\xfa\xdc\xaf\xd7\xc7\xed\x7a\xf7\xb8\x79\x78\x58\x77\xe7\xf4\x35\xe6\x7e\x51\x70\xb0\x77\xf2\x62\x57\x10\xfa\x8d\x78\x6d\x3a\x62\xa7\xaa\x39\x4f\xe3\xe6\xb1\x0b\x5a\x10\x71\xfd\xb9\x33\x94\x63\xcf\x01\x1c\x26\xb4\x97\x3c\xa6\xf9\x61\x8e\x6c\x07\x62\x9f\x69\x4c\x47\x3d\xf1\xaa\xe2\xcd\x70\xbf\x8e\x03\x26\xd1\x07\x50\xf0\x57\x03\x0d\x20\x80\xb4\x75\x90\xbb\x54\x55\x1c\xb8\x5c\x53\x1d\x5c\xbb\xa3\x2f\xa4\x84\xaa\xba\x83\x4b\x56\x4c\x30\x34\x71\xe0\xb3\x10\x11\x71\x45\x59\xeb\x22\x4b\x8b\x69\x3b\xf7\x31\x46\x85\x2b\x23\x5a\x2a\xea\xf1\xad\x7b\x17\x61\xa8\x2c\x3c\x73\x12\x64\x8b\x43\xc1\x11\x52\x7e\xe4\x4a\xe1\xca\xaf\xd0\x92\xcd\xae\xcb\xeb\xb2\x4c\xd5\xad\x5e\xb9\x39\x2e\xf2\x13\x8c\x82\xaf\x9f\xf7\xc7\x7d\x9a\xbd\x77\xd3\x30\x8e\x99\x03\x41\xaf\x3f\x3e\x8c\x24\xc4\x71\x24\x04\xb7\xf5\x89\x48\x36\x3d\x05\x11\xc7\x71\xa2\x90\x13\x83\x4a\x03\x67\x4a\xa1\x21\x8e\xb9\x87\x49\xf1\x0b\xbf\x76\x4b\xa9\xbd\x42\xe2\x2b\x0c\xb5\x1c\xfb\x12\x7a\xdb\xe3\x4b\xa3\x3e\xe6\x8e\x44\x4b\xf1\xf9\x71\x33\xfa\x88\x3c\x24\x66\x58\xc1\xab\xd6\xe4\x5d\xf1\xcb\xb6\x97\x52\x31\x7d\x84\xa3\x90\x73\x86\x26\x2e\x15\x5f\xd8\xb2\xa8\xcf\x66\xf0\xff\x2b\xbe\xe3\xeb\x95\x40\x18\xa9\x4a\xb2\x4a\xf0\x41\x3a\x6e\x9f\xee\x6e\x79\xa8\xac\x20\x6d\xae\xee\x20\x1b\x5b\xc3\xb1\x10\x21\xc6\xd8\x0e\xeb\xfb\x55\x77\x8c\xf6\x44\x88\xee\x11\x3a\xcc\x8f\x69\x9e\x0e\xbc\xca\x58\xc6\x01\x66\x6d\x0b\x9b\x9e\x1b\xbd\x42\x1d\x30\x34\xcb\x0c\x3a\x6c\x5e\xd0\xbe\xed\x16\x60\x60\x5e\xf1\x34\xbb\x8e\x82\xe2\xb6\x03\xf7\x3d\x73\xe3\x3d\x6f\x36\x24\xcc\x71\x98\xa9\xd6\x7c\x78\xf8\x71\x04\x95\xd6\x47\x27\x18\x99\xe8\x89\xe3\xba\x46\x6e\xed\x02\x8b\xda\x78\x30\x96\xc2\xfc\xbf\x26\x70\xe6\xc4\x89\x12\xc4\xe3\xec\xb9\x06\x4b\x04\x5d\x1d\x76\xeb\x3f\x7b\x09\x0e\x48\x1c\xae\xa3\x2e\xb5\x81\x64\xc1\x96\x0c\x0c\x12\x47\x10\x45\xdf\x8a\x97\xea\xb1\x5d\x3f\xec\xec\x48\x5c\x4e\xde\xd0\x43\x91\xbf\x1a\x35\xdd\x99\x20\xb2\x37\xc9\xef\x27\x9e\x13\x92\x28\x26\x37\x54\x57\xf6\x7c\x9e\xef\x23\x37\x95\x31\x77\xcc\x16\x3b\x9e\x30\x89\xe7\x2b\x44\x69\x2e\x9f\x0f\xc7\xf5\x03\x0a\x30\x1e\x9d\xee\x0c\xa1\xaf\xfd\x01\x25\x40\xeb\xe2\x7c\x6b\xae\xad\xb1\x52\x34\x46\x7c\xc7\x74\xf5\x19\x55\x42\x95\x90\x17\x4d\x2e\xa1\x33\x12\xef\x8b\x12\xde\x47\x4c\x66\x90\xf8\x2e\x84\x06\x26\xd6\x7d\x96\xb0\x3b\x93\x1f\xb8\xc6\x2c\x6d\xaf\x47\x4e\x80\x65\x89\x9e\xb7\x33\x13\x3f\x0a\xd1\x76\xe3\x4a\x3d\xc1\x87\x4d\x4b\xcd\x73\x45\xce\x4f\xf2\xc4\x17\x31\xf2\x02\x0a\x3e\x57\xe6\xd6\xf7\x0b\x22\xa9\xcd\x90\x5a\x9d\x9a\xfc\xed\x46\x96\x1c\x92\x30\x70\x85\x19\x8c\xb2\x48\xf3\x7d\x81\x0a\x6d\xd9\x10\x20\x98\x84\x01\x91\x7b\x9a\x62\x8e\xb3\x68\xf7\x08\x35\x45\x58\x25\x21\x90\x08\x58\xbb\x54\xb6\xcb\x4c\x4f\x4a\x30\xee\x17\x3b\xda\x11\x63\x3d\x9f\xd1\x1b\x8f\x85\xc4\x89\xfb\x50\xbc\x1a\xb2\xeb\x7d\x5d\x0c\x22\xc4\x49\xc2\x84\xe2\xd6\x42\x32\x05\x2d\x5d\x5b\x40\x05\xa2\x28\xa0\xdc\x7d\xd7\xbf\x4d\xc5\x25\x49\xac\x10\xc7\x7a\xec\x24\xef\xb7\x65\xf1\x5a\xf2\xf3\xa6\x1a\x21\x16\x13\xee\x08\x24\xba\x78\x24\x66\xf8\xb9\x20\xc5\xe4\xd4\xc2\xf3\x74\x62\x8d\x6a\x32\x9d\x9f\x8a\xd6\xac\x19\xad\x57\x89\x48\xa8\x64\xe6\xcc\x7f\x1e\xd3\x2e\x42\x78\x84\xfe\x3b\x28\x66\x30\x67\xa8\xcc\x43\x70\x95\x5c\x9e\x8a\xf9\x62\x73\x48\x14\xd7\x89\x41\xb7\x58\x1c\xcd\x2d\xb1\x1b\x24\x4a\x04\xca\xeb\xcb\x79\xf7\x27\x5e\x76\x4f\x0b\x5c\x41\x07\x49\xdb\x90\x0f\x3e\x61\xa6\x87\x04\xc0\x21\xbb\xcd\xa2\x76\x6c\x91\x91\x81\xfc\xcf\xcf\x03\xed\xc6\x60\x8c\xe0\x7f\x14\x02\xb7\xeb\xfd\x5b\x9a\x65\x13\x67\x33\xd1\xbe\x8b\x99\x3e\x0a\xd2\xd5\x69\x7f\x5d\x1d\x10\x24\xfb\xa1\x78\x5d\x96\xc5\xdb\xd4\x20\xe2\xcc\x21\xda\x68\x93\x92\x27\x32\xa1\xf9\xbb\xe1\xcc\x11\x5e\x3f\xc6\x9f\x73\xa0\x8d\x7d\xfc\x8d\x38\x0b\xa9\x5e\xc9\x0a\x16\x63\x76\x7d\x91\x95\xc0\xd5\xf5\x31\xcd\xbb\x21\xca\x59\x02\xe8\x25\xd6\xfc\x0d\xe6\x22\x71\x5f\xc6\xa9\x38\xe3\x31\x92\x14\xee\x29\xe4\x6c\x34\x85\x5e\x76\x0f\x37\xe7\x19\xee\x0e\x9c\x49\x81\x7a\xf4\xef\x29\x7c\x3c\xf2\x9f\xdf\xf8\x90\xc6\x02\xda\x81\x1b\x26\x5d\x2e\x38\x55\x69\x3d\xf1\x6d\xb9\xeb\x84\x9c\xf2\x35\x28\xba\x8e\x02\x69\xd3\x2e\x5e\x10\x4a\x4b\x57\xdd\x0e\xd2\xa2\xfc\xc6\x27\x52\x8e\xc0\xbd\x48\x63\xfc\xe3\xbe\x28\xfb\xeb\x7b\x12\x5c\x13\x77\x5e\x67\xe9\x6b\x4a\xf9\xd4\x1d\xa4\x67\xd1\x94\x43\xc1\x15\xe0\xbe\x1b\xe2\xa6\xc4\x55\xeb\x59\xb6\x8d\x7f\xaf\x28\x60\x0e\x0d\x7c\x16\x1b\x12\xe6\x76\xf0\xb5\x4b\xde\xd2\xde\x41\xd0\xba\x2c\x6d\xdb\x89\x57\x70\xf4\x8f\x83\x9c\x19\x0f\x39\xc8\x68\x18\xe8\x1d\xa1\xb1\x78\x24\xa2\x30\xee\x90\x78\xc4\xf3\xfb\x54\x6c\xdf\x26\x03\x24\x4e\x18\x3a\xd0\xad\xa3\xf9\xc8\x7f\xda\xa3\x63\x15\xa2\xdd\x51\x93\x3a\x77\x5e\xd4\xed\xa7\x25\xd3\xca\x20\x37\x74\x0d\xc8\x03\x83\x86\xa6\x1d\xe2\x3c\x61\x44\x77\x86\x35\x19\x50\xbe\x42\x2e\xaf\xd6\x12\xda\xa7\xaf\xed\xfa\xb6\xba\xe1\x4a\x01\x9e\x04\xda\xd6\x95\xa2\xa1\xf3\xd4\x4c\x72\xdf\x3c\x89\x58\x64\xf2\xe7\x66\x29\x19\x94\x82\x55\xad\x9f\x01\xe5\x74\xa2\xf3\x44\xf8\xb8\x44\x19\x18\x76\xcf\x87\x36\xab\x98\x0a\x3c\x91\x91\x2b\x86\x72\xc5\xdb\x12\x6c\xba\xb2\x04\x18\x1d\x35\xfd\x63\x4f\x01\x12\xb3\x81\x77\xc0\xf3\x39\x8d\xf9\xe6\x06\x57\xc6\x39\x53\x28\xe7\xf0\xd1\x95\x37\x5b\x23\x81\xf3\x20\xb1\xb5\xb9\x73\x26\x39\x17\x01\xc7\xb7\x72\x58\x7f\x3b\xd8\xc8\x35\x97\x7e\x88\x90\xb7\x34\x1f\xc9\xe0\xd8\x56\x4e\xaa\xda\x15\xd4\x75\xf6\x9e\xc1\x79\x4a\x63\x3c\xdc\xc6\xe7\x06\xac\x4a\x62\x8c\x95\x5e\x78\x59\x1f\xeb\xe2\xf8\x0e\xa7\x54\x0e\x2c\xee\xb1\x65\xd0\x1d\x44\xee\x22\x25\xa5\xf8\x6d\x5d\xc0\xbc\x53\xcb\x95\xf4\x30\x12\x2c\x2d\x70\x0c\x88\x1d\x67\x79\xbd\xeb\x71\xeb\x1c\x02\xe5\x53\x28\x0c\xb5\x16\xb6\x19\x97\x70\x22\x6a\x6e\xd3\x43\x07\x3c\x18\x6a\xe8\xda\x7c\xdb\x7c\x66\x40\xb0\x50\xa2\x3b\xf3\xca\xcf\x60\xb6\xd3\xd1\xf3\x08\x16\x45\x22\x19\xc0\x49\xbb\x4c\xb1\x60\x31\xe5\x73\x91\x03\x39\xe3\xbd\x8f\x24\x18\xb0\x44\x74\x65\x0d\x69\xfe\x7a\xd7\x0c\x49\x7b\x41\xb8\x2c\xd1\x24\xad\x65\x55\x44\x46\xaa\xd4\xb6\x97\xef\xe1\x20\xfd\x0f\xc8\xfe\xaa\x2e\x30\xbc\x9f\x47\x50\x4f\x5d\x3a\x56\x78\x21\x78\xae\x8d\x93\x18\x3e\x64\xdb\xe6\x3b\x3a\x36\x65\x6a\x87\xe6\x32\xe3\x31\x8d\x16\x0a\xe1\x7b\x31\x46\xa6\xbe\x43\x99\xd6\x7c\xc0\xaa\x6f\xda\x03\x37\x42\x24\x2c\x05\xce\x2a\x40\xa4\xee\x16\x8b\x7e\x6d\x0f\x8f\xf8\x44\x07\xe5\x57\x54\x9a\x32\x39\x91\x0a\xb1\x12\x35\xcd\xdf\xd3\x1a\xca\x1d\x74\x77\x1c\xb2\x10\xd7\xe3\xc7\xd3\x40\xe9\x1b\x44\x98\x78\x18\x1b\x26\x99\xf6\x01\xf3\x38\x88\xc8\xd4\x90\x56\x35\x7f\x05\x97\x02\xdf\x7d\x5b\xd0\x53\x00\x7c\x0d\xdb\x15\x31\x73\x08\xfb\x6a\x46\xcf\x91\x7f\x4a\x2d\xdf\x76\x56\x98\x03\x37\xdf\x10\xbd\x03\xe8\xc5\x4c\x40\xc4\x9e\xa0\x3c\xb8\xb5\x37\xd7\xb9\x7a\x28\xe4\xdb\x60\x75\x17\x89\xe7\x70\x77\x20\x22\x3a\x5e\xb6\x45\xe2\x09\x92\x07\xb6\x92\xc7\xcf\xdd\xeb\x48\xa2\x04\xd9\x79\xcf\x6f\x84\xa0\x6a\xc6\x09\x4b\xd3\x8b\x07\x90\x18\xe9\x91\x4e\x91\xe9\x06\x1c\x3a\x9c\xf6\x82\x2b\x17\x67\xd0\x01\xaa\x8c\xf7\x6a\xf8\xd8\x60\xcb\xc5\x0c\xe3\x4f\x35\xbd\x58\x3b\xf6\x2d\x27\xe3\x03\xbc\x43\xe6\x6c\xa9\x7e\xa6\x43\x54\x9a\x9e\x42\x12\x14\x56\xd4\x72\x07\x19\xef\x3e\x96\x8c\x48\xcd\x5c\x34\xd7\x1d\xaf\xe1\xdf\x50\x16\x5d\xe1\xd6\xf8\x5a\x32\xf1\x11\xa2\xb6\x6c\xe4\x9b\x1c\x8c\x12\x29\x14\x6e\x4c\x97\x12\xba\x5d\x6b\x50\xfa\x22\x94\xe3\xba\x66\x59\x7c\x99\x14\x0e\x0b\x70\xa4\x35\x44\x0c\xea\x37\xcd\x5f\x3f\x59\xc6\x26\x47\x26\xb4\x0b\x9f\x53\x9b\xa0\x22\x85\x2e\xcb\x3f\xd0\x1d\x3e\x4d\xe2\x7d\x5e\x28\x20\x74\x20\x30\x61\x60\x8d\x82\xb2\x7f\x0a\xc9\xdc\x00\x73\xaf\x46\x55\xb6\x23\x54\x1f\x0e\x1e\xc9\x7c\xa2\x86\x68\x37\xb8\x4e\x6f\x0d\xa4\xc3\x88\x92\xcb\x2c\xb5\x98\xa4\x20\x2b\x77\x68\x58\x48\x27\x16\x3e\xd5\x84\xb4\xd6\xd6\xb1\xdf\xb4\xc6\x2f\x4d\xba\x2e\xc9\xa0\xe9\xd6\xa4\x5a\x13\x73\xf6\x0e\x4b\x70\x09\x13\x6e\xbb\xf9\x0e\x16\x5b\x22\xfd\x1c\xcf\xb2\x61\x21\xb0\x74\x43\x85\x02\x39\x0f\xa9\x86\x3d\xd4\x47\xc6\x3c\xdb\xe4\xb9\x1c\x53\xa3\x46\xf0\xca\x2e\xb2\xd2\x17\x3e\x95\xac\x34\x02\xeb\xe0\xdf\xe6\xa7\xb4\x0c\x22\x40\x64\xe6\x3f\x0f\x2f\x8f\xf6\xd8\x40\x6a\x24\xdb\x5b\xff\x4c\xbb\xd9\x2a\x43\x21\xd1\x29\xc1\x34\x4e\xce\x9b\xba\xda\xd2\x10\xea\x3a\x48\x17\x0b\x32\xcc\x44\xeb\xab\x49\x3e\x29\xe4\x92\x91\xcf\x91\x9d\x06\x9a\xb2\x5b\xc0\x65\x14\xf8\x6e\xcf\x5c\x37\xa3\x63\x3a\x9d\x9c\xbd\xf5\x29\x23\x00\xfa\x72\x84\x32\x75\xb7\x19\xaf\xd3\x7c\x6a\x42\xc9\x48\x73\xc7\xc8\xa8\xb4\xde\x0e\xbe\xb7\x51\x1a\x50\xc6\x3a\x70\x07\x92\x7b\x13\xf6\x1b\x90\x49\x48\xf2\xbf\xc8\x3c\x59\x37\x19\x4f\x4b\x38\xae\x8a\xf3\xa5\x86\xe3\x04\xa5\x29\x13\xc1\x11\x6b\x69\xa2\xea\xdd\xa6\x84\x34\xac\x86\x4e\x40\xe2\x50\x58\x15\xd5\x27\xb9\x4c\xc9\x43\x88\x3a\xc5\x8a\xca\xf8\x73\x58\x96\x6e\x3b\x28\x5a\x4b\xcf\x3c\xcd\xab\xba\x04\xa8\xd1\x8b\xd7\x7d\xc0\x48\x0a\x8f\x00\x8f\x1f\xe9\xe4\x69\x85\x1f\x33\x0a\x61\x5f\x06\x2b\x85\x14\xca\x09\x7b\x08\xfd\xd6\x14\x9e\x8e\x6d\x36\xa9\xe2\x28\x36\xeb\xa7\x01\xd9\xcc\xe2\x51\xa4\x8a\x39\x49\xc2\x6d\x9e\x36\xc7\x6f\x8b\xc7\xf5\x71\xbb\xdb\xfc\x7b\x7d\x5c\xed\xfe\xb5\x3f\x2c\x1e\xec\x35\x15\x44\x92\x51\x7e\x68\x05\xe5\x88\x32\x0d\xa4\xd2\x1a\xb3\xd8\x47\x38\xa7\xad\xeb\xb9\x6b\xbf\xee\xeb\xb7\xf4\x1d\x6e\x47\xc7\x4c\x18\x5f\x82\x9b\x60\xf6\x73\xb7\x3e\x1c\xef\x36\x3f\x7e\xeb\x7e\x06\x4c\x42\x9b\x2c\xd1\x7d\x93\x2b\x63\x47\x77\x3d\x3c\x2f\x20\x3d\xbb\x1c\xb6\xc5\xfe\x93\xe1\xdc\xae\xda\x66\xd0\xe0\x39\x26\x6f\x40\x3b\x10\xfa\xfd\xa8\xdb\x66\xa0\x5e\x61\xfc\x21\x34\x30\x45\x66\x7a\x55\x97\xc5\xd5\x4a\x85\x51\xab\x62\xbe\xc6\xe9\x32\xe6\xce\x7c\x82\x8f\x1d\xbc\xa7\xed\x14\x79\x2a\xea\x81\xac\x08\x28\x16\x28\x4c\xf2\x18\xdc\xc1\x8d\xb2\x88\xe9\xe6\x04\x31\xd6\x9e\xe1\xb1\x36\xd0\xf1\x35\xbc\xd0\x1e\x29\x49\xbb\x1b\xcd\xaa\xfb\xd6\xe0\xc1\x1c\x94\xb5\xda\x95\xa3\x98\x88\x87\x95\x6a\xe9\x98\xb7\x63\x7a\x3a\x30\x45\x44\x08\x5b\x41\x90\xf1\xec\x6c\x68\x3b\x62\x21\xc5\x5d\x5a\x5d\x10\xf8\x59\x15\xd9\xfb\xa8\x56\x62\xf2\x84\x10\x61\x30\x04\x33\xa3\xdf\xda\xc9\xd1\xdd\xa1\x0e\xd0\xb1\x7c\xc9\x2d\xe7\xea\x0c\x45\x81\x72\x7d\xe6\x98\xec\xea\xdd\x35\xe7\xe7\x54\xa2\x43\xb1\x36\x4e\xc3\xf8\xe6\x5c\xc5\xa8\xd2\xf6\x83\x97\xea\x8b\x20\x9f\xf2\x98\x67\x75\x36\x41\xd6\xb7\xd9\x3d\xe5\x39\x11\x37\x9b\xe6\x28\x8f\xa5\xbc\x28\xf2\xa9\x4e\xec\x2a\x60\x91\x17\xed\x8a\x7c\x43\xaa\x05\xca\x4f\xe2\x91\x46\xff\x40\x33\x6a\x28\x0b\x38\xeb\x70\xa8\xc0\xe7\xa4\x4f\x50\xa7\xb5\x3c\xdd\x1a\xc5\xfd\xdb\x09\x84\x0c\x4d\xed\xe2\x52\x5d\x36\x67\xe4\x83\x41\x5a\x98\xee\x83\x38\xe1\xff\x74\x9d\x95\x63\x22\x9b\x8b\xcb\x4d\xf4\x74\x7c\x0b\x51\xac\x08\xad\x31\x54\x44\xfb\xb4\xd0\x74\xee\xf7\xdb\xa2\x8d\xf1\x1b\x8a\xfd\xc0\x1f\xe8\x29\x5a\x72\xa2\xf1\x6d\xc4\x3a\x42\x2c\xf2\xb1\x2a\xca\x4f\xd6\x67\x95\xf8\xa4\x93\x54\x9d\x8a\x8f\xd1\x1c\x4c\x04\x8b\x0c\xce\x71\x91\x65\xa6\x78\x15\x86\x04\xb6\xa0\x38\x23\xf4\xe0\xb9\x90\x6f\xfb\xae\xe6\x77\xb8\xcc\x2a\xee\x32\x1c\xf1\xaa\xb0\x04\x40\x53\x12\xc4\xb6\x8f\x26\xa1\x3b\x62\x98\xdf\xd7\xc0\xb3\x47\x9e\x37\x3c\xcb\xae\xa3\x85\x54\x89\x08\x70\x31\x3e\xa6\x7a\xfd\x0e\xf9\xe1\x04\xf9\xb3\x52\x87\xa2\xb8\xcf\xf8\x14\x33\xa2\xa4\xef\x5b\xc2\xbf\x75\x25\x1b\xc8\x3e\x29\x92\x55\x8a\x0b\xc7\x1d\xb9\xef\x33\xb5\x48\x0a\x1c\x17\x39\x08\x71\xcd\xf8\x03\xe0\xed\x39\xb7\x16\x44\xeb\xa8\x49\x62\xfd\xd4\x50\x96\x3c\x6b\x4d\xdc\x0d\xba\x3f\x5d\x17\xed\xf8\x8e\x31\x4f\xef\x90\xf5\x6b\xfe\x5e\xb4\x08\x70\x4d\x47\xd9\x8a\xfb\x51\x9d\xda\x8d\x69\x49\x87\x00\x73\x3d\x70\x07\xbe\xcd\x22\xcb\x16\xe5\x6b\xf5\x54\x2c\x3e\xd3\xeb\x9e\x9c\xc0\x11\x1a\x51\x5c\x18\x72\x7d\xa0\xd8\xcc\x7d\xca\xeb\xd1\x1a\x0f\x8e\xd4\xc4\xe6\x28\x8b\x8e\x57\x0a\xcb\x40\x28\x7d\x6f\x7b\x69\x17\x03\x7a\x5c\xcd\x2f\x21\x93\x4b\xbb\x41\x42\x0a\x82\xb8\xd2\xf7\x00\x87\xd9\x05\x1f\x5c\xc1\x02\x13\x64\x5a\xf1\x0b\x97\x03\xe7\x61\x72\x5e\x8f\xbb\x28\x2a\x63\x51\x20\xfb\xda\x82\x05\xc0\x03\x2d\x2c\xc5\x51\x51\xbe\x41\xb9\x2d\x8a\x6c\x79\x25\xd4\xee\xf8\x2c\xbe\x70\x7d\xe3\xb4\x98\x6d\xa5\xe9\x99\xf1\xbe\xe6\x7a\x04\x08\x5c\x87\x20\x46\xad\xed\xbd\x6b\x5d\x8e\x33\x8c\xa9\x94\x46\x9f\xc3\x9c\x35\xf4\xed\xe1\xbe\x40\xc7\x83\xa2\x46\xe6\x7d\x58\xec\xea\xec\xca\x07\x41\x10\x60\xbd\x98\x4a\x2b\xa2\xb0\x68\x47\x61\x07\xb8\x86\x80\x27\x98\x98\xdf\xee\x36\xab\xf5\x11\xeb\x6a\x8e\x87\xef\xbb\xf5\xfa\x88\x74\x52\xb6\x5b\x08\x01\xf7\x3b\xe9\xc3\xdf\xff\xb5\x9a\xd9\x58\x20\xf2\x14\x5a\x34\x0b\x29\xe1\x52\x43\x9f\xf8\x98\x7c\xb1\x28\x70\x48\xab\x09\x37\xd2\xef\x45\xf6\xd5\xc6\x02\x11\x04\x09\xe5\xf8\x5e\x3f\xd9\xce\xc7\xfd\x63\x87\x23\x71\xdf\x43\x21\x3b\x0c\x29\xc4\x7e\x28\xfb\x18\xfc\x3f\x8a\x34\x87\x9e\xad\x7a\x3a\xa2\xe2\x20\x0a\xcc\x16\xf0\xd4\x9c\x97\xe9\xd4\xf3\x85\x38\x54\x5a\x18\x82\x56\xd4\x4e\xb0\xfa\x0f\x00\xb1\x50\x28\x01\x6f\xe2\x8b\x9d\x5a\x30\x40\xa2\x03\x82\x10\xaa\x89\x7c\x0c\x80\x88\x1c\xd4\xf9\x7a\xbc\x1b\x55\x97\x82\x00\x8e\xd5\x90\x76\x12\xcf\x80\x66\x40\xfa\xd2\xed\x54\x3c\x4b\x55\xdd\x22\x70\x40\x0a\x07\x91\xd6\xbf\x5f\x05\x94\x46\xb8\x74\x84\x88\x33\xfd\x94\x29\x66\x45\xb1\xd7\xd6\x4b\xbc\x37\x13\xc5\xde\x8f\x72\x05\x98\x6b\xdd\xf1\x34\xbb\x92\x70\x61\xf7\xec\xca\x17\x31\xa9\x83\x63\x98\xc8\x06\x3f\x3a\xf9\x15\x00\x48\xb8\xa5\x67\xdf\x3e\x3f\x3f\x98\xec\x32\x1b\xed\x0e\xa0\x43\x89\x6a\x3b\xff\x4e\x5f\x5f\x9b\x92\xd7\xb3\xcc\x0f\xb7\xc6\xbb\x66\x3e\x71\x1a\x1d\x4e\x40\x8c\xd5\x77\xc0\xd5\xfe\x94\xd6\x83\xb0\x92\x66\x0a\x34\x1f\x44\x60\xbe\xa7\x15\x31\x5d\x35\x79\xfd\xac\xc7\x2e\xb5\x76\x62\x87\x0d\xa8\x37\x96\x96\x5e\x1d\xb4\xc3\x5d\xcc\xfd\xbd\x4b\x8f\xe6\xa2\xbf\xed\x50\x20\xda\xf5\x63\x1c\xb1\xc6\x71\x1b\xbf\x65\xed\x8a\xae\x64\x6c\xb9\x58\x2c\x5e\x6e\x58\x16\x67\xe7\xb1\xf6\x05\xc7\xa0\x5f\x53\x97\x13\xb6\x56\xd0\x81\xa3\x30\xb8\xb6\xda\xac\xba\x9f\x92\x20\x22\xa3\xaa\xdd\x32\xaf\x0b\xa5\x76\x66\x1b\x9a\x9f\x36\x3a\x48\x80\x1b\xd7\x87\xf8\x93\xbf\xde\x1f\x74\x20\x04\x66\x2a\xab\xba\x5c\x15\xb9\xe4\x75\xf5\xcb\xc9\x11\x1d\x81\xf0\x4d\x8e\x91\xa8\x9a\x7a\xfa\x27\x1d\xfb\x1e\xca\xd7\xd2\xe2\xf0\xac\x17\xf5\x09\x83\x1e\xbc\x9c\x92\x13\x7c\x0d\xde\xd0\x71\x28\x71\x35\x3a\x17\x2a\xd5\xd7\x19\x1a\xc8\x29\xb6\x5a\xc7\x91\x83\x97\x36\xea\x53\xe3\x59\xa4\x13\x27\x0a\xa5\xa9\x94\x77\xc6\x90\x30\x9d\xb8\x14\x4a\x7a\x5c\xfc\x79\x5c\x2e\x1e\x16\x4f\xab\x75\xd7\x14\xf3\x88\x54\x10\x8c\xb8\x20\xa2\x04\xfb\x1a\x33\x9d\xc8\x08\x67\xdd\x11\xb0\x24\x0f\x83\xa7\x38\x34\x4d\xde\x72\xcd\xcb\x7c\xc8\xcf\xf3\x09\xe9\xc2\x7f\xdd\x2e\xc8\x9a\x27\x2e\x09\x94\x93\xa1\x36\x85\xf7\x68\xce\x03\xe4\x9e\x39\x8e\x2a\x46\xa1\x0f\x31\x7c\xf2\x6a\xb9\xe6\x5e\x64\x55\x0d\x5b\xa7\xbc\x9d\xe6\x18\xe1\x19\xf7\x13\x49\x80\xa5\xf5\xdb\xdd\xf3\xe3\xf3\x11\xeb\x1b\x37\xcf\x4f\xa3\x12\x3b\x2d\x24\x95\xf0\x7e\x40\xda\xc9\x65\x99\x26\x19\x47\xe1\x20\xe1\x4f\xcf\x77\x5f\x16\x67\x92\x2b\x9e\xcc\x2b\x19\x53\xfc\x65\xd9\x5c\x9f\xf5\x17\x64\xc2\x7f\x33\x6c\x24\x10\xe7\x64\x6b\x3c\xce\x1a\x1c\x1a\x5c\x12\xe3\xae\xfb\x28\x9a\x55\x25\x1d\x2f\x1f\xe0\x4a\x2c\x70\x3b\x92\x0b\x08\x12\x8b\xa9\xd5\x0c\x6f\x82\x06\x4d\xbc\xa2\x17\x7e\x45\x20\x78\xfb\x4e\xa1\x1c\x7f\x87\x21\xd3\x2e\x68\xed\x31\x19\x1a\x81\xdb\x39\x7a\x55\xad\x3d\xfa\x48\xb6\x6e\x65\x07\x08\x47\x9f\x74\xf2\x1d\x89\xc1\xa3\xe3\x90\x45\x41\xeb\x20\x0a\xa2\x51\xb1\x91\x25\x67\x98\x7c\x61\x1d\x39\x46\x9b\xb1\x75\x08\xda\x77\xb6\xe5\x69\x59\xe1\x23\xfe\xb7\xfb\x3f\xdd\xd4\xd2\x91\xc6\x38\x18\xee\xb9\x86\xe3\xa2\x1b\x86\x5a\x70\xcb\x81\xd0\x99\x0c\xab\x13\xdc\x0a\x7e\x62\x7f\xcd\x18\xd3\x08\x3f\xe2\x68\x67\x6c\x79\x99\xd6\xd7\xde\xd6\x30\x9d\x1c\x4f\x73\x61\x99\x9b\x33\x78\xe5\xaa\xb8\x03\x6b\xf2\x7f\xe2\x47\x4d\xae\xe3\xc4\x4a\xa8\x9e\xa6\xee\xd3\xec\xf9\xed\x12\xa7\x99\xeb\x4a\x64\xe3\x3e\x41\x96\x15\x8e\xbd\x29\xcf\x0f\x10\x3a\xd4\x8e\xf3\xdb\x84\x69\xdb\x2e\x71\x51\x25\x33\xa5\xec\x0f\x53\xf8\x96\xf9\x6a\xb1\x5f\xf4\x41\x7a\xcd\xbc\xc8\x47\x7e\xa4\x9a\x58\x10\xfe\xb4\xbf\xfb\xbe\x83\xf1\x33\x1a\x79\x34\xaf\x26\x97\x0a\xfc\x28\xa1\x4f\x4c\x7a\x9e\x8b\x46\xa5\xdd\x79\x83\xd8\x47\x83\x7d\x95\xa5\x67\x2c\xa7\x4a\xf3\x11\x48\x4f\xb3\x30\x50\x26\x45\xb9\x3f\x1c\xb7\x0f\x8b\x7f\x59\x31\x79\xcd\x42\xe9\xe0\x0c\xba\x64\x45\x5d\xb5\xdf\xe5\xa6\x8a\xd5\x76\xd4\x09\x0b\x49\x1e\x68\x09\x75\x77\xea\x28\x09\xb8\x91\xa2\xfe\xfd\x2a\x67\x95\xf7\x35\x8b\xa5\xc1\x43\x0d\xa4\x51\x6e\xa2\xea\x9a\xb5\x8b\x36\x99\xa4\x75\x83\xa6\xcc\x88\x60\xe0\xcb\xa5\x40\xb3\x24\x4c\x28\x4b\x99\x01\x2f\xad\x48\x73\x6b\x0e\x8d\x6f\x25\x49\x5c\x87\x6a\x43\xaa\x3a\xad\x9b\x81\x74\x78\x97\x04\xd4\x8c\xbb\x04\x16\x22\x20\xe6\xe6\x35\x2f\x4a\x20\xc5\xc7\xf1\x35\x79\x1c\x60\x6d\xba\x02\x9e\x0d\x5d\x2d\xcd\xb8\xf2\xd0\x69\x36\x1c\x90\x5c\xa4\x59\xfb\xd9\x90\x62\xdf\x74\x11\x0e\x69\x9b\xed\xe5\xe9\x0c\xf2\x2d\xeb\x71\xee\x5d\x8f\xc0\xc5\x82\xd7\x37\xb8\x4e\x3e\xa8\x90\xba\xe3\xb7\x7c\xe7\x35\x2f\x27\x37\x26\x7d\x37\x96\x7d\x5c\x71\x61\xf8\x21\x0f\xc0\xcf\xc3\x50\xbd\x66\x32\xe2\x18\x5e\xcc\xe1\x67\xdd\xbf\x6d\xa7\x3b\x8f\xf2\x30\xd8\x4c\x5b\xcd\xb9\xf8\xdf\xb4\x3b\x52\x31\xd2\x15\x58\x9f\x2f\x45\x99\x16\x58\x62\xf4\xda\xdd\xba\x72\x08\x2a\xf0\x5e\x64\xcd\x19\xc9\x14\xba\x69\xa5\xb8\x8b\x99\x28\x62\xc0\xfd\x63\xf3\x74\xf7\xfc\xc7\xd1\x39\xae\x9f\xee\x06\x1a\xa9\x9a\x81\x16\x08\xc4\x29\x79\x0d\x13\xb9\x1b\xd3\x43\xb3\x04\xcb\x40\xed\x9a\x39\xac\x96\xd1\x4c\xbb\xa1\x45\x50\x99\xfd\xbf\x7d\x87\xd3\x53\x78\x2e\xa6\x33\x6d\x16\x18\x71\xca\x93\x44\x5d\xdb\x8b\x84\x0d\x0c\xf4\x1e\xd7\x82\x5e\x40\xaf\x6d\x07\x64\x74\x4b\xab\x7b\x9e\x59\x99\x87\xe1\x02\xe3\xb0\x04\xa0\x5d\xb9\x4d\x5d\xf5\xa8\x90\x41\x3b\x4c\xa9\xb0\x93\xc3\xdd\x37\xc2\x50\x07\xe0\x90\x19\xed\x52\xda\x71\x22\xda\xa5\x0c\x3c\xa9\xb9\xe0\x28\x7f\x4f\x33\x78\x85\xf9\x6c\x98\x3d\x50\xb9\xe8\x78\x7f\xa4\x75\xde\x0e\xa4\xbf\xe3\x3c\xfa\xdc\x2f\xd6\x8e\x2b\x12\x1f\x28\x3d\x0c\xd5\x98\x22\x4c\x3b\x9e\x27\xf1\xbd\x9f\xd3\x1c\xaa\x5b\x86\x10\xed\x78\x3e\x43\x4a\xf8\x7f\x1e\x76\xc7\x81\x61\xac\x1d\x2f\x08\x31\x88\x74\xbf\x58\x1d\x9e\x77\x16\x30\xa9\x1d\x2f\xa1\xcb\x49\x9e\x65\x82\xcb\xb7\xc9\x2b\xf1\x3d\x2d\xda\x57\xf2\x9d\xcb\x37\x20\x0d\x92\xd1\x94\x77\xfc\x58\x76\x7e\x4c\x91\xff\x27\x9d\x33\x14\xb4\x13\x04\xbe\xa1\x95\xe6\x65\x3d\x4e\x05\x6b\x27\x90\x9e\xd5\x35\xa3\x1a\x97\xaa\x6b\xd1\x84\x73\xbc\x4f\x79\xbd\x43\xb1\xf0\xa9\x87\x3f\x7e\xfa\xd0\xf1\xa5\x41\x93\x3c\x40\xae\x06\x6a\x94\xb6\x43\xe4\xa1\x65\xb4\xfa\xbe\x79\x5a\xef\xd7\xc7\xf5\x9f\xab\xef\x8b\xa7\x6f\xeb\xa3\x6f\x2f\x19\x05\x90\x10\x8d\xd6\xc7\x8a\x9f\x2f\x3c\x7d\xfd\x3a\x46\xa3\xdb\x41\x23\x1c\x93\x92\x7c\xe5\x35\x58\x34\xd0\x22\x57\xad\x75\xf6\x29\x0e\x64\x04\x43\xf8\x72\x48\xc4\x4e\x8c\xf8\xe4\xaa\xe6\x5a\x5b\x80\xad\x76\x62\x2f\x1c\x44\xd5\xf0\x82\x64\x2d\x53\xea\xb9\xeb\x06\xae\xd3\x3b\xfc\xb4\x0e\x0e\x25\x97\x4d\xb7\x84\x31\xeb\x8c\x2d\xd4\xdc\xd0\x4a\x44\x84\x13\x51\xa5\xaf\x69\x7d\x28\x4c\x8d\x4c\x6f\x88\x69\x27\x51\x1a\x19\x7f\xd1\x80\xea\x18\x95\xaa\x99\xc2\x52\xed\xf0\x80\x73\x5b\xbd\x59\xbe\x1b\xe6\x84\x0a\x0b\xef\x06\x01\x33\xed\x70\xa1\x63\x2a\xf5\x21\x7e\x99\xb6\xd7\xf2\x3a\x08\xbb\x98\x7e\x22\xee\x88\x8c\x9a\xcb\xaa\xa9\x53\xba\x7d\x9f\xfd\xd7\x70\xcd\x75\xa4\x1f\x60\x40\xa3\xc9\xad\x26\xb4\x5d\xd3\x1c\xa9\x5c\xd4\x8b\xa1\x55\x15\x63\x6d\x50\xcd\xd8\x93\xda\x91\xda\x45\xac\x0f\x57\xca\xb2\x60\x34\xb7\x72\xa5\xb7\x23\x45\xf9\x81\x15\x04\xbf\x7f\x7e\x79\xba\x23\x1f\x00\xdd\xff\xc5\xdd\xdd\x6e\x72\x15\x25\x04\x86\x3c\x10\xfe\x39\x9a\xcb\x4a\xc5\x6e\xd8\xc5\xcf\xc7\xd7\x00\x2f\x44\x63\x98\x94\x9c\x4c\x5c\x7a\x8e\xcb\x4e\x3b\xc0\x55\x6c\xf8\x58\x68\xb1\xb1\xe7\x07\xe9\x21\xea\x7e\x09\x55\xaa\x80\x28\xf4\x26\x41\x87\xd1\x02\xac\x7d\x1e\x82\xa5\x50\x3e\x03\xb5\x4d\xee\x4b\xcb\x08\x89\xf3\x7e\x4f\xe5\x5b\x2a\x8b\x1b\x28\xf2\xff\x27\x35\x42\xda\x65\x0e\xa7\xe4\x7d\x7a\xbe\x74\x7b\xbd\xcb\x3c\x32\x93\x8d\xf7\x67\x2a\xc5\xbb\x56\xe1\x38\x49\x8f\x35\x59\xd7\x27\xbc\xbb\xdf\x26\x67\x96\xcc\x08\xe8\xa8\x27\xf8\x30\x12\x0d\x8b\x5c\xed\x78\xfe\x56\xe8\xa1\x50\xa7\x7d\x47\xc3\xe7\x77\x99\x22\xf8\xd0\xb2\x78\x7b\xbb\x6e\x8b\x62\xc9\x4f\x15\x6e\xfc\xe4\x36\x72\x91\x01\x59\x54\xa6\xbf\xeb\xb8\xae\xc1\x93\xfd\x01\xe9\x48\xe0\x6f\xf4\x62\x5d\xd7\x4c\x10\xc9\xf3\x97\x6a\xca\x1e\x32\xee\xea\x39\x6e\xac\x3b\xea\x5f\x92\xc2\x9c\x9e\xce\xf3\x63\x5c\x2d\x88\xfe\xa1\xe3\xd9\x59\x20\x39\x36\xaa\x62\xe5\x06\x09\x11\xcf\x8f\x72\xd7\xf7\x42\x41\xbc\xc1\xeb\x9f\x69\x55\x2f\xaf\x23\x61\x08\xdb\x29\x22\xc1\x80\x15\x2f\x01\xca\x3f\x6d\x61\xc7\x2f\x59\xa3\x6e\xe0\xb9\x5d\x21\x6d\x93\xab\x8e\x6e\xda\x36\x83\x44\xac\xe5\xdd\xfe\xd0\x01\x44\x66\x86\xad\x1b\x00\xb8\x86\x85\x17\xa3\xdb\x9b\x09\x17\xbc\xed\xa6\xa9\x36\xfc\x9c\xe6\x5b\x28\x0f\x3f\xed\x65\x42\xc9\x91\x01\x1c\xce\x69\xbd\x2e\xcb\x49\x49\xb0\x76\x63\x0e\x7a\x28\x6c\x4e\xa2\x03\xbc\x86\x6d\x51\x64\xd3\xbe\x2a\xc4\x58\xdc\x1d\xfc\x74\x27\xe3\x2e\xf1\x83\xd8\xac\xcb\xc7\x6f\x3c\xbd\xcd\xdd\x76\xfd\x24\x2a\x08\xd9\x75\xed\xa9\x38\xa7\xb9\x4d\xd5\xcc\x8f\x87\x24\x60\x18\xa5\x34\xc2\x73\xa2\xc2\x77\x35\xc9\xf1\xd9\xbe\x22\xc1\xc5\x02\x2c\xe8\xd5\x46\xa0\x47\x0c\x9b\xd3\x0b\xa8\xae\xac\xf2\x88\x5b\xff\xb1\xee\xf7\x7d\x97\xbb\xcc\x31\xa6\xc3\xfe\x5a\xd5\x70\x7e\x2e\xf9\x37\x5e\xdd\x22\xe2\xdb\xae\xa4\x12\xf9\x70\xf7\x6d\xb8\x12\xba\xdc\x4d\x14\xb7\xa2\x55\x39\x3e\xf1\xa4\x4a\x48\xbb\x3c\x24\x6a\x9f\xb7\x4a\x2e\x79\x2d\x4f\x7b\xc8\xb2\xe5\xf5\xb9\x9d\x7b\x18\x0e\x9d\xbc\xce\x39\x68\xd2\xe0\x97\xd1\x08\x12\x0e\x8d\xb4\xda\xe4\x17\xe7\x87\xab\x68\x8d\xba\xae\x38\xbd\xbd\x85\x49\x78\x55\xbb\x92\x05\x58\x66\xf7\x22\xa0\x3c\x43\x5e\xc9\xd3\x96\xdc\xa3\xdb\x38\xb7\x76\x65\xa4\xe5\xc0\xde\xed\x24\x3b\x7f\x25\xba\x33\x48\xce\x4c\x4e\xaa\x04\x28\x53\xca\xb0\x4c\x15\xd1\xe5\x8d\xec\x55\xd3\x51\x79\x1e\xd2\x70\xa5\xd5\xb2\x04\xfe\x96\xe6\xaf\xab\x89\x10\x85\x76\x95\x4f\x4e\xf3\xba\x3e\xfd\x2d\xaf\x55\xf4\x8b\xbc\x56\xda\x6d\x07\x14\xb2\x83\xad\x9f\x8f\x7b\x14\xa0\x6a\xca\x6e\x30\x29\x2d\x5c\xd2\xf1\xcb\x37\xcb\xe6\x6a\x7f\x86\x40\xb2\x01\xea\xa8\x35\x6b\xb6\x50\xbe\xe4\xa9\x2c\x26\x12\xc6\xda\xd5\x8c\xfb\xdd\x60\x92\x88\xbc\x40\xb0\xd6\xc0\xd2\xb9\xbd\x29\x2d\x38\x92\xb8\xe3\xc7\x5d\xbc\xf3\x2c\x6d\x97\xcb\x21\xa2\x4c\x7b\x8c\x11\xa2\x0c\x8b\x9e\x6f\xb5\xe5\xb5\xc7\x82\x90\x26\x22\xba\xd7\x65\x71\x29\x2a\x9e\x11\x90\x6e\xfc\xed\x3d\x06\x41\x42\x89\x09\x44\xce\xe2\xfa\x96\x8a\xa6\x2e\xca\xcd\xc4\xb1\xf2\x9c\x20\x0c\x2d\xe0\x6f\x73\xc3\x66\x69\x3b\x85\x3e\x9a\x0b\x36\xa6\x65\x7f\x16\xe4\x7b\x23\xa0\x11\xeb\xfa\xfb\xfc\x8d\xf6\x5c\x26\x4c\xb9\x56\x3b\x44\x97\x93\x68\x9f\xf6\xdc\x28\xc0\x5a\xb4\xe2\xa3\x2b\xc0\xd0\x9e\xab\x24\x5a\x5e\x76\x39\xb4\xc1\xdc\xf1\xfd\x78\x4e\x80\x08\x08\x6b\x16\x76\x56\x24\xcf\xd6\x3f\x2f\x90\x77\xd8\x77\xed\x79\x3e\x23\x2b\x0c\x63\x5f\x69\xfe\x6a\x19\xa4\x6d\x87\xd0\x73\xb0\xaa\x1f\xcc\xe6\x39\xa8\x18\xd5\x5e\x1c\xfa\x38\x8c\x6b\x04\xae\x10\x1b\xef\xf8\x56\x12\xa6\x90\x85\x1d\x72\x59\x28\xe8\xa9\x90\xdd\xc9\xc6\x47\x33\xca\x67\xf6\xb0\x80\xf8\x67\xb1\x1e\xc3\xc2\xb9\x66\x28\x32\xb5\xc7\x7d\x8d\xe5\x8b\x67\xfe\x73\xdf\x08\x95\x12\xd8\xa7\xbb\x7d\x1e\x7a\x01\xef\x62\xbe\x77\xf0\x99\xd7\xe3\xf1\x90\x8a\x02\x51\xe5\x1a\x13\x16\x0b\xa5\x40\xad\xdf\x7b\x27\xc0\xe3\x9c\xe4\x97\xee\x0f\x7f\xce\x2c\x29\x9e\x88\x02\x6d\x4f\xd1\xae\xd4\xa4\x61\x6b\xfc\x1f\x2a\x1c\x46\xf2\xa6\x5c\xbd\xf4\x83\x44\x40\x18\x1a\xed\x0a\xd5\xc8\x1a\xd7\xed\xc9\x3e\xef\x09\x48\x10\xc5\xb8\xde\xad\xee\xff\xb0\x07\x4a\x97\xe0\x45\x5d\x79\x12\x61\xf1\x06\x39\xe4\x5f\x2d\x4c\xd5\x9e\xf4\xb8\x67\x76\xe7\xfa\x61\x10\x33\xd7\x9e\x0c\x38\x56\xf3\x56\x38\x17\x37\xab\xe7\x59\xc9\x6e\xed\xc9\x38\xc4\x95\x23\x6f\xce\x47\x79\xe2\x59\x06\xf9\x6b\x3f\xca\xa4\xf4\x4c\xf9\x5a\xfd\x52\xa9\x5b\xfb\xcb\x03\xc6\x1d\xd2\xe2\x24\x05\x10\x43\x27\x38\xee\xa4\x83\x24\x22\xca\x41\xae\xb6\x8d\xc8\x52\xb9\x03\x59\x94\x6a\x96\x96\x49\x7b\x5a\x04\x09\xe2\xa0\xf6\x5b\xcb\x96\xbb\x03\x94\x89\x98\xcf\x6d\x6b\x9f\x05\xcc\x93\x43\xee\xfc\x76\x6b\xb3\x0f\xe1\x33\xce\x62\xe3\x78\xdc\x95\x7c\x2a\x84\x39\x39\x95\x13\x85\x88\x83\x96\x69\x89\x5f\x27\xcd\x5f\xe9\xcb\xdc\x97\xc5\x79\x10\x41\xf3\x9d\x58\x0b\xdd\x49\x7f\xe2\x0e\xe8\xfc\x36\xb0\x9c\x7c\x47\x11\x15\x55\x2a\x8b\xa3\xfa\x3b\x32\x4a\xed\xbb\x21\xa9\x6a\x19\xc2\x26\xbc\x28\x05\x6c\x11\x66\xef\xda\xeb\x5a\x86\x32\x53\x15\x7d\x4a\x33\x65\xe7\xd7\x6f\xfd\x46\xdd\x25\x7f\xb4\xef\x1a\x2d\x16\x43\x59\xb3\xd8\xfd\x49\xeb\xf3\x40\x76\x4e\xfb\x2e\x90\x0e\x28\xa5\x2f\xcc\x8f\x9e\x08\x93\xa4\x2b\xae\x2a\x52\x09\x2b\x2c\xfb\xcf\x6e\x3f\xc4\xe4\x61\x3c\x11\xe3\xb8\xe4\xa2\x2a\xb2\xa6\x5e\x2d\xef\xec\x39\x7d\x5f\xe9\x9e\xe6\x9d\x86\xcb\xf2\x6a\x80\x89\xf3\x27\x0b\x5d\x66\x89\x23\x9e\xe0\x67\x4d\xb4\xf6\x87\xc3\x23\xbe\xa2\x8d\x8a\x7e\x1b\x40\x23\xb4\x1f\x1a\x8e\x4a\xd1\x5c\x6d\x89\xdd\x2d\x82\x42\xfb\x11\x4f\x30\xd5\x7e\x97\xf2\xa1\xbd\xe4\xc7\x2e\x57\x54\x67\x8f\x25\xbf\xad\x85\x3d\xda\xce\xfc\xd8\x0b\xad\x16\xd4\x43\x51\xd7\x50\x5e\x07\x35\x71\x9f\x3c\x41\x1c\x51\x59\xff\x7d\x2a\x90\x60\x10\x9f\xdd\x30\x7f\x7c\xf2\x06\x63\xee\x0a\x66\x53\x6b\x7d\xfd\xe5\x6c\x80\xc9\x4f\x62\xa2\xa5\x3e\xd7\xef\xf6\x36\x13\xa5\x11\x1c\x68\xe2\x1e\x26\x2a\xf3\x48\x28\x4d\x1b\x1a\x32\x56\x8d\xcf\x5d\xa2\xee\x3b\xf1\xea\xa9\x63\xd5\xd5\x3e\xe7\x1a\x4b\xc0\x57\xcf\x9b\xa7\x23\xd1\x67\x1d\x37\xab\xe7\xe3\x61\xb3\xde\x1d\xbb\x01\xc9\x95\x48\xc6\x3c\x86\x73\x78\x19\xed\x0b\x37\xb1\x72\x31\x3b\x2e\x44\x5a\x3f\x22\xc2\x6f\x88\xe1\xd2\xbe\xf0\x3c\x84\x4d\x18\x61\x53\xf4\x11\x97\x7c\x9a\xb4\xf0\x85\xd4\x01\x89\xc7\x92\x58\x5f\x5a\xe4\x03\xc6\x77\xed\x0b\xe5\xd8\xea\x17\xb4\x7a\xd0\x53\xfd\x84\x55\x5b\xfb\x02\xb4\x91\xba\xe6\xa5\x3c\x6d\xf2\x87\x41\x7a\xd8\x74\x91\xae\x63\x61\xae\x58\x1e\x33\x0e\x9a\xfb\x32\x89\x31\x7a\x42\xa3\x7a\xd7\x7e\xa8\x46\xce\x49\x71\x7d\xbd\x9e\xfb\x52\x08\x4c\xff\x49\x64\xe1\xb2\xb6\xd0\x6f\x33\x15\x1b\xda\x57\x0e\xb1\x68\xb5\xf3\x7a\x66\x57\xf3\x95\xe6\x58\xb8\xb1\xdd\xad\xe9\xab\xa1\xc8\xe0\x71\xf1\xf8\xfc\x62\xf5\x72\xb4\x0f\x51\x82\xae\xd7\x8f\xf5\xfe\xb0\xbe\x1b\x09\x11\x6a\x1f\x84\xc2\xa8\xa9\x68\xae\x7f\x98\x72\xb7\xf1\x25\x40\xba\x24\xb9\x86\x34\xbe\xe6\x47\xcd\x18\xb9\x6c\x0d\x2f\xd5\x8f\x34\xcb\x86\x0a\x4a\xe3\xc7\xd5\xcc\xc1\xa0\x5a\x96\xca\xd6\xb8\xd9\x4c\xb3\x20\xbe\x0e\x6c\xd2\x5c\x37\xbd\xf8\x88\xf6\xb5\xf4\x30\x59\xbc\x87\x7a\xb3\xdd\xfd\x36\xab\x02\xf2\x5f\xb7\xa5\xd0\x37\x86\xbf\xaf\xa5\xc6\x72\xb9\x1c\x3e\xee\x01\xb6\x9d\xec\xcb\xa6\xda\xc3\xc4\x0d\x0b\x58\x10\x40\x87\x56\xff\xd1\xdd\x4c\xc0\x42\xaa\x02\xb9\xf0\x2b\xf2\x13\x8d\xae\x10\xb0\x30\x26\x52\x47\x2a\x2b\x38\x9c\x52\xe4\x6f\xe9\x0e\xe6\xb1\xec\x89\xf2\xdb\xe5\xa6\xe4\x69\x35\x07\xd8\x6d\xfb\x6a\xee\x77\x49\xd6\xe2\xa3\xe7\xa0\x18\x74\x72\x94\x1f\x1a\xbf\x92\xb6\x8f\x35\x2f\x91\x02\x76\xfc\x30\x2e\x03\xdd\x49\xc5\x6c\xcd\x7e\x33\xdc\x12\x02\x57\x7b\x18\xf2\x59\xa5\x79\x21\xd3\xb9\x62\xc7\xe1\x70\x0c\xbc\x90\xb4\xf9\x8f\x14\x7b\x1b\x33\xa2\xe8\xc0\x8f\x3d\x6e\x66\x24\x62\x69\xff\x48\x55\x3d\xc6\xdf\xda\x28\x65\xe0\x4b\x2a\x70\x1c\x70\x64\xdd\x1b\x16\xc3\xaf\x02\x3c\x41\x20\x48\x5d\x9d\x32\xd8\xa3\x9b\x0b\x74\x80\x36\xfb\xcb\xd3\xc3\xf3\xea\xf7\xe3\x61\xfd\x74\xdc\xae\x77\xab\xf5\xd3\xa1\xfd\xbb\x79\xb6\xdb\x53\x10\x06\x12\x0b\xb3\xca\x76\x1a\xb7\xeb\xca\xea\xc7\xbe\xa7\x6a\x32\x9d\x22\x07\x90\x51\xe8\x52\x54\xf5\xbe\xd0\x08\xa5\xeb\xda\x12\x5a\x8a\xbf\x15\x85\xd2\x29\x64\x0a\x91\xec\x35\x4f\xb3\x2f\xdf\x5e\xc4\x43\xc0\x44\xed\x2b\xb1\xf7\x98\x5a\x9a\xbb\x9c\x8f\x1f\x24\x12\x91\xdf\xa9\x04\xd1\xa6\x3f\x32\x9e\x82\xd8\x8f\x48\xaf\x27\x6f\xd7\x22\xc2\xfd\xa7\xf9\xeb\xb7\x62\x52\xc1\xa3\x83\x58\xb9\x58\x4a\xf3\x47\x7a\x01\x35\x81\x91\x4e\xde\x6c\xc2\x14\x5a\x50\xbf\xe7\xc5\xc7\xf7\xe2\x83\xf8\xbf\x6d\x9b\x03\x31\x49\x4e\xdd\x17\x25\x52\x15\xdb\x06\x29\xb0\xd8\x0b\x33\xbf\x2f\xa3\x64\x25\x81\xce\x4c\x3f\xee\xf8\xc8\x9d\x49\xc9\xe3\x3f\xac\x58\x93\x0e\x84\x41\xf0\xa3\xc9\x58\x9d\x4c\x76\x64\x2f\x8b\x12\xf0\x93\x8c\xf2\x89\x28\x27\x6c\x98\x23\xfc\x19\x85\x0b\x1d\x48\x1d\xb9\x5e\x9f\xa9\xe8\x73\xb2\x81\xf2\x48\x07\xbb\x6a\x44\xeb\x3c\x4f\xf3\x55\xe3\xf9\xac\x3c\x2a\xcc\x36\x64\xee\x6b\x53\x92\xde\x7d\x00\xa5\x1c\x8b\x9f\x7a\x46\xc5\x87\xc9\x7a\xa0\x54\x12\x93\xdd\xa8\xef\xa1\x75\x89\xec\x5d\x80\x17\x20\x76\xe8\xc4\xab\xe5\xcd\xda\xa3\x59\xc8\x28\x11\x50\x97\x29\xbc\xc3\xba\x9f\x3c\xb6\x47\xe0\x91\x61\x75\x02\xf9\x76\x2b\xa5\x3c\x5b\xea\x3f\x0f\x24\xff\x24\x11\x13\x32\x2f\x0a\xc9\xf1\x95\x45\x2e\xd3\xec\x86\xc4\xe8\xbf\xff\xe7\xbf\x46\xb1\xa3\x78\x44\x3f\x3b\x71\xfb\x43\x47\x07\xe8\x07\xd1\x9c\x26\x76\xa5\xbf\x8b\xe2\x98\x43\xbd\x28\x06\x93\x35\x35\xfb\xac\xdd\x8f\x27\xfd\x54\x82\x41\xca\xd6\xb1\xfb\xd7\xb2\xb0\x52\x88\x3a\xf4\x80\x96\x18\x2a\xa4\x5b\x64\x99\xa1\x8f\xb4\x1b\x7a\xe8\xbb\xd2\x2e\x57\x5d\xfd\xd2\xd8\xf3\xed\x5e\x4b\xa0\x08\x2d\xf6\x0a\xf5\x43\x23\xdf\x96\x05\x66\xd4\xd1\x86\x30\x3d\x42\x2d\x4d\x75\x80\x09\x69\xb5\xdb\x84\x49\x9c\x8f\x47\x47\x18\x39\xb1\x8d\xc2\xec\xe0\xaf\x26\x2d\xa1\x63\x1d\x1b\x3f\x5a\xe4\x29\x24\xfd\xda\x6f\xf6\x8b\x63\x3d\xb0\x60\xc3\x88\x83\x67\xc8\xe8\xf6\x75\xa3\xf5\xad\x35\x13\x46\x2a\xc6\x10\xf2\x39\xcd\x3b\xc9\x08\x1d\xc6\x3c\xc0\x7a\x90\x77\x0c\xe2\x1c\x2f\xa8\x40\xf4\x65\x34\xcd\x1e\x28\xa9\x9a\x55\xf2\x9e\xce\xcb\x36\x69\x85\x2e\xc4\xa5\xb8\x98\xba\x92\x76\x68\x6e\x8b\xe9\x97\xe2\x8c\x21\xaf\x6d\xc5\x35\x74\x45\x87\xd3\x3e\x21\x43\x06\x7d\x5d\x34\x65\x7d\x7a\x2c\xf2\xfa\xd4\x41\x4a\xdb\x56\xe1\x19\x32\x55\x80\xf3\x67\xe1\x82\x90\x0b\x0a\xe0\x9d\x79\x55\xcd\xab\x1b\x76\x03\x94\x0b\xe5\xf9\xe4\xc0\x7d\x27\xa5\xee\xee\x5a\x4a\xa2\xc4\xd4\x3f\xb8\x7c\xbb\x14\x26\x6f\xdb\x35\xea\xc8\x12\x41\xbd\xe4\xc8\x1d\x07\x0a\x79\x7f\x47\xe5\x53\x5f\x32\xed\xb7\x27\x01\x45\x73\x0d\x1d\xdf\x45\x89\x60\xdd\xd1\x8a\x17\x0a\x07\x10\xd8\xc8\x73\x9e\x5d\xff\x03\xab\x22\x27\xb1\x82\xa1\x69\x1f\x4a\xc7\x93\x26\xcc\xff\x98\xe6\x66\x37\xb0\xb7\x2a\x0d\x21\x8f\x09\x81\x57\x15\x9c\x45\x36\x46\xcd\x87\xbe\x79\x33\xed\x3f\xec\x61\x3a\xc1\x95\x74\xf3\xe7\x61\x24\x30\xad\x43\xe5\x71\x6d\x20\x3b\x28\x8a\x47\x02\xf3\x93\xd1\xa7\xfc\xd8\xb7\xb7\xc4\x7f\x0e\xe8\x8d\x75\xa8\x38\x21\x2b\x70\x40\xb7\x4e\x21\x06\x9e\xc6\x87\x83\xe3\x61\x3e\xb8\x1d\x21\xc8\x96\x35\xde\x57\x6d\xaf\x88\x07\x26\x19\x8e\x53\xee\xae\x5f\xf5\x67\x1d\xff\x10\x80\x30\x90\x19\x22\xf3\x86\x0b\xe0\x7c\xce\xba\x3b\x2c\x44\x88\x00\x57\xea\x97\x98\x0a\x3f\x59\xd1\x34\x73\x3d\x92\x23\x7e\x28\xb8\x5a\x15\xe5\x2f\x62\x93\x22\xc6\x58\x64\x6c\x42\xb4\x4b\xe7\x9f\x2e\x62\xa1\x46\xe2\xcb\x7f\x1c\x4a\xb0\x39\x9c\x88\xc5\xa4\x6c\x53\xb5\x1f\x22\xcd\xbf\x14\x41\xd6\x11\xe3\xc4\xbd\x6d\x2d\x8b\x6d\x51\x91\x36\x46\xbe\x84\x13\xcf\xf4\xb3\xde\x81\x44\x72\x94\xe9\xd0\x9e\xab\x52\xd2\x11\xd3\x1e\xfa\x4c\xff\x68\xce\x3c\xff\x5f\x6b\x76\x46\x8e\xc7\x85\x49\x6f\x61\xbe\xc4\x68\x0b\x1c\x2d\x63\xd8\xb1\xba\x41\x5e\x45\xbe\x1f\xa9\x5e\x57\xc1\x90\x04\x8c\xaf\xe6\x07\xb1\x34\x34\x57\x3b\x68\xdd\xf9\xb1\x4f\x35\xef\x1e\x44\x7e\xa0\xdc\xb8\x07\x3b\x61\xfa\xe2\xb7\x31\x5c\x58\x47\x81\x1b\x38\x04\xfa\x7d\xfa\xbe\x38\x1c\x16\x4f\xdb\xdd\xf3\x9f\xff\x72\xf6\x87\xbd\x75\xb3\xa2\x20\x88\x70\x59\x17\xcd\x75\x53\xc3\xd9\xeb\x7f\xe7\x09\x05\x11\xc7\xb0\x85\x28\xd0\x9e\xb6\xc0\x12\x72\x1c\xee\x9a\xf2\x76\x1b\x88\x42\x47\x63\x3d\xfc\x00\x40\x60\x63\x9f\xbf\xb4\x95\x46\xa1\xf1\x94\x77\xa6\x50\x70\xb3\x9d\xf5\x36\xa3\x28\xe0\xc4\xf0\xf1\x96\x5e\x36\x79\x5a\x2f\x41\xf2\xa6\x82\xcd\xe2\xfc\x54\xd4\xcf\xaf\xff\xb7\x20\x5b\x1a\x13\xf1\xe4\x66\xa2\x30\x44\x43\x6c\xc9\xab\x54\x6e\x6a\x23\xf9\x69\x1b\x39\x29\x7a\x3d\x2b\xa4\x78\x6d\x1f\xb2\xea\xda\x80\x66\xc1\x37\xe4\x3e\xec\x4a\x1f\xe2\x4f\x3e\x6b\x04\xc2\x19\xd2\x85\x7c\x2f\xce\xf0\x23\xe5\xc4\x49\x30\xbb\x20\x47\xb1\x74\x88\xe2\x96\x5f\x37\x93\xd4\x49\x94\xa8\x18\x57\x3d\x13\x61\xb3\x44\x44\x43\x09\x31\xb3\x1c\xe3\xde\x1c\xa3\xe1\x21\x9a\xd7\xde\xf8\x8b\x44\x3b\xbd\xfe\xcf\xff\xef\xff\x7c\x94\x69\x0d\x55\x9f\x32\x9a\xb5\x41\x23\x01\x3e\xa6\x54\x8e\x14\x1d\x7f\xba\xff\x22\xcf\x19\x09\x1d\x31\x02\xd9\xd7\xf2\x34\x54\xde\xd4\x91\x0c\x34\x62\x68\xd0\x66\x24\x8c\x5b\x2a\xbb\x46\x19\xe1\x96\x0c\xf5\xe9\x25\x47\x11\xd6\xae\x05\xa4\x1b\x77\x24\xa0\xcb\x74\x2c\x1e\xa1\x23\x25\x14\x46\x7a\x2e\xe5\x08\x11\x18\x29\x0d\x06\x88\x80\x56\xd7\x28\x40\x62\xba\x80\x06\x7c\x3f\x7f\x40\x9a\xe6\x1d\xd5\xb7\x8e\x99\xe3\x60\x5d\xd6\xf7\xe7\x3f\x1e\xba\xdf\xe2\x04\xcc\x12\x6f\x15\xfd\x6f\x35\x62\x75\xec\x38\x0a\x49\x13\x72\x43\x92\x65\x8a\x55\x36\xb9\x51\x2b\x43\x46\x22\x7b\x4e\x27\x74\x99\x49\x56\x91\x42\x48\x85\x82\xce\x84\xd8\x9f\x9e\x38\x82\xc0\xef\xde\x5e\x09\x1b\xac\x7d\xab\xad\x62\xab\x8e\x5d\x47\xe2\xf3\x2e\x37\x77\xbd\x08\xad\x8e\x3d\x8f\xa3\x9f\x4a\xab\xd5\x37\x5e\x8f\xeb\x74\x74\xec\xf9\x3e\xf2\x97\xf2\x2c\x1b\x68\x52\x15\xe5\x23\xcf\xaf\x66\x50\x55\xb7\xe5\x0b\x93\x32\x06\x1d\xfb\x31\x33\x12\xcc\xc4\x7a\xbe\x99\x16\x1c\xe9\x38\x70\x34\xf3\x4c\x2e\xe2\x69\x84\xd3\xec\xfb\x44\x8e\x07\x66\xe5\xdc\x16\x13\xbf\x24\x8e\x1d\x17\x8b\xcf\x69\x91\xde\xe4\x03\xfc\x6e\xdb\x26\x87\x5b\xe3\x8c\x96\xa1\x8e\x63\x9f\x61\x08\xe8\xf7\x34\xcb\xf8\xe9\x3a\x8c\xc5\xc6\x71\x10\xa0\x87\x9a\xff\xc4\xb8\x67\xf7\x73\xac\x11\xb4\xb7\x78\xee\x7e\xd1\x81\x45\x9f\x3f\x15\xf5\xaa\xc8\xab\x9a\x77\x6b\x69\x1c\x6b\xaa\x32\xb1\x99\xb0\xe5\x75\x3b\x23\x37\x3d\xfe\xb6\x22\x8a\xcc\x66\x47\x49\x2c\x93\xbc\xea\x9e\x4d\x08\xc7\x67\xdd\x14\xe8\xb0\x72\xa3\x79\x10\xab\x30\x04\x23\x93\xbf\x35\xcc\xe6\xd3\x1e\xd2\xc3\x99\xb2\xc3\x84\xdf\xac\x79\xd2\x7d\x4e\x65\x18\x96\xd1\xa4\x9c\x43\x66\xc5\xc0\x3c\xc4\xe2\xe1\xf2\xd9\x17\xba\xd8\xd6\xc8\xa3\x68\x5e\x5a\xff\x67\xf4\x9a\x21\x71\x91\xc7\xf8\xd8\xba\x49\xed\xf6\x64\x1b\xb4\xef\x21\x3d\x43\x3b\x3a\xf6\x87\x7f\xce\x7e\x3f\xed\x03\xda\x3f\x45\x99\xbe\x12\xe2\x62\x42\x29\xa2\x63\x1d\x25\xf8\x2e\x51\xef\x34\x83\x41\x21\xb1\x8e\x75\xcc\x63\xcb\x09\x78\x58\x3d\x14\xf2\x2d\xcd\xb1\xdc\x62\xfc\x68\x09\x63\x21\x3a\x8b\x05\xa2\x98\x47\xcb\x4a\xc2\x64\x82\x5b\x58\x2f\x7b\x4a\x85\x28\x5d\xbb\x8e\x70\x7f\x3e\x67\xf6\x91\x13\x47\xbb\xb8\xdc\xee\x5f\x5f\xfb\xa2\x30\x9d\xb8\xcc\x47\x5e\xb4\x4b\xf1\x81\x62\x3d\xfd\x5c\x4e\x5c\x37\x32\x90\x6a\x7e\xde\x43\xb7\x70\x27\xae\xab\x3d\xde\x99\xd0\x9f\xe8\x83\xe9\xc4\x93\x09\xb7\x72\xe8\x04\xe6\xb3\x27\x08\x22\x81\xcb\xf3\x51\x16\x4d\xa6\xfe\x18\x28\xbe\x8f\x8d\xe7\xf1\xaa\x9e\x04\xed\xe4\x40\x8b\xa2\xcc\xef\x8b\xf2\x1b\xaf\xe1\x63\xb0\x79\x0d\xac\x9a\x49\xe6\x23\x09\xc3\x04\x98\xd5\xe6\xef\x29\x8a\x3a\xb5\x36\x3b\x38\x93\x30\x11\xc8\x5a\xb1\xb8\xfb\xb1\xd9\x3f\xef\x8e\x87\x3f\xec\x84\x4b\x42\xee\xe1\xcc\x5c\xa6\xf5\x1b\x34\xdd\xfb\x8b\x12\xa2\x7c\xc7\x84\x11\x59\x89\x38\x1e\xfe\x20\x55\x4c\xe2\x83\xea\x63\x95\x49\x2c\x38\x12\x87\x9e\x8f\xc5\xe5\xc9\x92\x66\xea\x24\x06\xed\x79\x9d\x52\x74\xd1\x94\x96\x9c\x72\xce\x02\x4f\x12\x26\xb1\xb7\x40\x4d\x98\xe7\x8f\x91\x22\x8c\x4e\x12\xcf\x43\xe2\xe4\x3d\xd4\xdb\x8f\xc9\x4e\x95\x24\xb1\xc6\x38\x00\xc1\xa3\x3b\xc5\x9e\x79\x56\x46\x9d\x24\x3a\xc6\x9c\xdf\xa1\xe4\x6a\x04\x4a\x4c\xb8\xaf\x03\x52\x89\x22\x33\x0a\xab\x28\xa6\x5b\x51\xc2\x05\x47\x7c\x72\x75\xe6\x59\xf6\x92\xe6\xf5\x7d\x93\xcb\xb1\xa5\x62\x7a\x0a\x16\xa1\x41\xb3\xff\xe0\x97\x76\xcf\x3e\x4f\x91\xe3\x89\x70\x13\x74\x83\xee\x17\x4f\xcb\xc5\xde\x62\xdb\x13\xe1\x09\xde\x2e\x8e\xff\xbe\x4c\xca\x44\xe7\xed\xbf\x44\x04\x44\xbf\xb1\x78\xf8\x6e\xad\xd2\x44\x79\x44\x1f\xc1\x69\xaf\x59\x36\xd7\xa1\x93\x96\x80\xe7\x81\xc1\x64\x19\x86\xda\x5d\xd1\x19\x07\x89\xf6\x1c\xaf\x3d\x61\xd1\xd4\xfe\x5d\x91\xf7\xbf\x27\x2e\x5a\xb4\x7b\xc9\x67\x04\x77\xed\x2a\xc7\x99\xe4\x14\x2b\xf9\xe0\x97\x2d\x31\x80\x8e\x1f\x9c\x3b\x9e\x8f\x36\xf3\x43\x3b\xbc\xd4\x72\x58\x6e\xf6\xb5\xb5\xf9\x05\x24\x7d\xf4\x99\xb8\x13\xc4\xa8\xb8\xad\x78\xcd\x05\xd6\x38\x0c\x93\x3d\xdc\x09\x04\x26\x9f\x76\xeb\xfd\x7a\xf7\x63\x7d\x77\x7c\x3e\x7c\x5f\xef\xf6\xc7\xfd\xe6\xce\x7e\x06\xee\xba\x1a\x4c\xea\xa4\x9d\xca\xcf\x37\x21\x69\xee\xfa\x60\x88\xfa\x72\x85\x69\xae\xaf\x3f\x14\xf7\x62\x8d\xb0\xd4\xa7\xc5\xd3\x66\x3c\xac\xb8\x1f\x24\x8e\xec\xb0\x12\x0f\xc5\x6b\x2a\x7f\x40\x79\xbb\x0a\xf1\xc0\x0f\x6c\xaa\xce\xca\x8d\xec\x0a\x31\xdd\xd4\x79\xc0\x5d\x84\x27\xda\xea\x87\x55\xa1\xb5\x2d\xcc\xd4\x3c\x14\x12\x73\x32\x0f\xc5\xeb\x2b\x28\x4c\x4e\x6f\x56\xcf\x9f\x7e\x82\x39\x42\x5a\xac\x62\xe8\xd7\x01\x1e\xb9\x2e\x96\xa8\x61\x1c\x85\xec\xb3\xfb\x2c\x7d\x3d\xd5\x93\x04\xc1\xe4\x95\x44\x31\xd5\x71\x54\xfc\x3d\xed\xfc\x04\x1e\x0b\x40\xcf\xff\xc4\xe5\xdb\x5a\x35\x92\x4f\x89\x8e\x34\x4f\x3c\x15\x1a\x0d\x44\x7e\x9d\x2a\x4e\xd9\x3e\xc2\xf7\x8d\x48\xae\x69\x39\x14\x7f\xd8\x1d\x66\xea\x03\x72\xee\x91\x94\x3a\x32\x1b\x3c\xf6\x90\xb0\xae\x83\x12\x3e\x42\x14\x24\xcf\xd5\xf5\x81\xe7\x28\xed\x34\xb9\x24\x44\x4a\x12\xa3\x37\xe9\xfa\x76\xb2\x54\xdd\xb3\x01\xd7\x48\x00\x71\x38\x95\xc5\xc7\x6d\xe9\xb6\xe6\xda\x0b\x71\x6c\xca\xac\xa8\x60\xa5\x2e\x7f\x33\xa8\x74\xe4\xa1\x5f\x9a\xf1\xaa\xbe\x11\xee\xd3\x5c\x73\x4a\xbf\x51\xe0\xf2\x33\xae\x12\xdb\x59\x78\x98\x79\xf8\xe7\xcb\xe2\xa9\x0b\x2a\x72\x2d\x35\x22\xd3\xd3\xea\x31\xcd\x07\xe6\x8d\x6d\x06\x87\xe9\x9e\x68\x69\x92\x46\xa7\x4e\x82\x39\x12\x43\xe6\xcb\x95\x29\x6b\xd6\x82\x79\x64\x5a\x5f\x9a\x4f\xc2\x15\x82\x85\x24\x5c\x82\x79\xe1\xcf\x42\x1b\x5f\x12\xdf\x6a\xc1\xb4\x40\x47\x67\xf1\xf4\x6d\xfd\x30\x96\x92\xd3\xc2\x49\x1c\x0c\xd9\xd8\x68\xe5\x27\x6a\x67\xb6\x37\xa7\xcd\x74\x28\xec\x38\xc4\xfe\xcf\x6f\xf3\xc2\x91\x0c\x77\x2f\x24\x99\xf8\x7d\x42\x3b\xa2\x85\x1b\x24\x58\x0b\x86\x52\x1a\x24\x98\x35\x04\x12\x8f\xdf\x88\x1b\x87\xa1\xb2\x29\xbf\x7b\x2e\x7b\xdf\x5a\xb8\x49\x62\x44\xe5\x72\xf5\x9d\x57\xa7\xd1\x52\x25\x3c\x46\xf1\xeb\x57\xa8\x69\x72\xee\x2f\x5c\x42\x75\x4a\x2f\x8f\x85\x82\x6c\x79\x9d\xa2\xef\x84\x17\x90\x60\xcf\xf2\x69\x79\x7c\xdc\x3c\x91\x1c\xdf\x66\x69\x2f\xe7\x85\x02\xd5\xda\xdf\x5b\xa3\xdf\x00\x13\x6d\x9b\xef\x40\x24\xfb\xdd\x45\xf2\xaa\x1e\x23\x31\x27\x6f\xc8\xe7\x8e\x0b\x5d\x02\xb5\x63\x3b\xc4\x18\xc0\xf8\xf9\x7d\x0e\x68\xaa\xfd\xf1\xfd\xf9\xb1\xbb\x9a\x70\x11\xfa\xa5\x80\xab\x2c\xcd\xe1\x58\x0d\xad\x3e\x11\x24\x94\xe0\x5e\xd7\xa7\x1d\xe4\x9d\x16\x99\x16\x01\x4f\x90\x60\x11\x37\xc8\x7d\xdd\x94\xf0\x57\xd7\xa4\x7d\x44\x54\xdd\x82\xfc\xbf\x8c\xc4\x88\x30\x26\x8d\xd1\xa5\xad\x89\xd6\x22\x4c\x24\x7a\xbd\xb2\xc8\x8a\xb2\x1a\x06\x12\x44\x1c\x51\x80\x08\x69\x19\xd3\xff\xc0\xf2\x7a\x4b\x4b\xd3\xf6\x12\x60\xcd\xeb\x7c\x06\xbf\x25\x62\xee\xc5\x6a\xa0\xe8\xb8\xe5\xad\x2b\x3b\xf8\x1c\xb1\x24\xbe\x4e\xc1\xeb\x3a\x83\xc9\x5a\xb9\xe2\xf9\x12\x6c\x51\x92\x39\x20\x09\x42\xe4\xeb\x2c\xdb\xf5\xdb\xf5\x27\xd7\x4b\x84\x92\x43\x54\xe2\xaf\xe0\x8f\xcd\xa1\xdc\xa3\x67\xb9\xbc\x5f\x3a\xd0\xef\xa7\x7d\x13\xa2\x80\xa0\x1d\x71\x5f\x73\xad\xc7\x43\x9a\x27\x51\x12\x0f\x26\xef\xe3\xb5\x9e\x79\x7d\xc2\x63\xb8\xaa\xcb\x41\xa4\xa0\x1d\x58\xe5\x79\x98\x3f\x14\xc2\xa7\xe2\x08\xb4\x22\xbf\x95\xa9\x1a\x7d\x29\x11\x31\x22\xef\x48\xcf\xf0\xac\x1f\x78\xd5\xd9\xc6\xf6\x78\xe9\x29\x7c\x32\x24\x83\x31\xa4\x0b\xb6\x49\xc4\x6a\xc8\xfc\xb1\x1a\x6a\xc1\xce\x2f\x7c\x2a\x20\x0e\x82\xf5\xeb\x6b\xb5\xfb\x32\x19\x22\x54\xe8\xa0\x2a\x48\xd5\x88\x41\xd9\xb7\x16\x2a\x49\x10\x5e\x71\xe1\xad\xb7\xfc\x49\x6e\xf8\x93\x61\xac\x80\x88\x57\xef\x01\x55\x98\xec\x29\x81\x05\x46\xe5\x31\xcb\xb6\x45\xa9\x6b\x94\x5b\x99\x3f\x05\x08\x85\xdc\x92\x06\x16\xb2\xfe\x79\x49\x8d\xfe\xc5\x94\x0d\x4c\x0b\x90\x8c\x11\x37\xc0\x5f\x0d\xd2\x61\x5c\x52\x39\xfe\xd4\xa0\x42\xd7\x1b\x2c\x10\x23\xa4\x59\x6f\x84\x08\xd0\xa4\x63\x8f\x21\x17\x5b\x72\x32\xb1\xe0\x85\x0e\x3c\x34\xaf\x3f\x86\x29\x1f\xc9\xdc\x08\xb4\xcd\xd6\x5c\x17\x79\x75\x0b\x98\xb6\x1b\x81\x64\x02\x6c\xc9\xe0\xaa\x98\x16\x30\x49\x87\x01\x8f\x4d\x41\x22\x92\x35\x99\xf2\xe1\x75\xae\x06\xd4\x99\x5a\x3a\x4e\x22\x2c\x64\x75\xa7\xd3\x2e\x80\x25\xdd\x38\x44\xbf\xf0\xa9\x91\x19\x34\xd5\x0f\x44\xd5\x0e\xc0\x84\xd0\xf7\xe4\x0e\x06\x11\x9f\x77\x8b\xd5\xf3\xd3\xfc\xa7\x90\x5e\x18\x02\x65\x50\xf3\xfa\x54\x34\x15\xcf\x55\x7d\xb2\xcb\xa3\xf4\x38\xc9\x0e\xcb\xdc\x40\x6f\xbb\x16\xdf\xd5\xb8\x8a\x3f\x9f\xe1\x95\x4f\xb0\x20\xd2\x37\x89\x46\x55\x90\x36\xc5\xd7\x14\x54\x5a\x86\x5a\xa0\xf3\x6c\xb4\x6f\x96\x96\x15\x77\xfc\x6d\x64\xa8\x35\xa2\xb9\x57\x27\x44\xbc\x0c\x1c\x7b\x19\xf9\x52\x58\x35\x0e\xa4\x8f\xee\x08\x2b\xb5\x8c\x02\x91\x48\xb3\xf7\xfd\x23\x7d\x2d\x9a\x25\x91\x08\xcc\xcf\x19\x19\x85\x81\x92\x36\x7b\x55\xcb\x13\x94\xd5\x51\x5c\x8f\xe9\x2d\xe2\x4d\x46\xb1\x50\x44\x5d\x4c\x38\xae\x03\xcf\xb2\x74\x22\x2e\x3a\x3d\xbb\xf2\x6d\xbd\xcb\x80\x00\xfd\xa6\x94\x53\xc6\xa1\x42\x7f\xf3\xa5\x52\x87\x62\x4d\xd5\x1c\x44\x32\x33\xe9\x97\x84\x08\x6d\xdb\x96\x58\xcd\x96\xd7\xeb\x0c\x88\x53\xdd\x3e\x7e\x2c\xb4\xee\x01\x48\x0f\x53\xf2\x0e\x2d\xb9\x4b\xb4\xa9\x0f\x45\xf1\xb6\xa0\xcd\xa6\x3b\x98\x87\x31\xa2\xb4\x09\xf3\x63\x65\x52\x6c\x63\xac\x15\xed\x5e\x06\xa6\x0f\x18\xc3\x7c\x9b\xaa\x91\x6a\x29\x7c\x87\x68\x26\x5a\x9b\x58\xd7\xb6\x2c\x6c\x54\x75\x2d\x45\xe4\x21\x9e\xcd\x96\xf8\x3c\x22\xe9\xd2\x71\x55\x9c\xcf\x8d\x85\xc0\x75\x37\x26\x44\x84\x9e\x0e\x0a\xad\xa0\xbe\xcc\x97\xc6\xab\x14\xd2\xc5\xfd\x80\x00\xae\xcb\xe6\x8a\xa2\xa0\x37\x94\x3c\x5f\x06\x0d\xa5\xf4\x05\xb2\x3a\xac\x8a\x5c\x66\x8d\x82\x95\xc5\x53\x4f\xde\xa8\x0c\xc8\xbf\x4a\x73\x5d\x1c\xf7\x00\x87\xcd\xd3\xe2\x5c\xd4\x19\x5c\x1f\xa6\xf2\x85\x5a\x4a\x05\x3a\xe8\x11\x91\xa0\xfa\x8c\xbd\x54\x32\xd2\x04\x8f\x7b\xdd\x99\x32\xd8\xc9\x9b\x55\x0a\x02\xab\x85\x31\xa2\x11\x90\xed\x32\xdd\x07\xae\xbe\x95\x3c\xaf\x2b\x9c\xa8\xc5\x0d\xa7\x8a\x96\x10\x25\x14\xb2\x6e\xcf\x00\x25\x2a\x97\xa3\xca\x11\x15\x58\x8e\xef\x18\x62\x8e\x29\x67\x9d\x5e\xaa\x07\x78\xe5\xf2\x6a\x93\x4b\xf4\x3e\x5d\x36\xce\x0c\xda\xc3\x44\x20\x7a\x66\x84\x23\xcf\xd5\x51\xa5\xdd\x60\x02\xad\xc8\x8f\x68\xe7\x99\x89\x63\x0f\x72\xd3\x83\x85\x5c\x31\xd7\x47\x37\xca\x0e\x14\x9b\x8f\xb1\x83\x43\x31\x19\x60\xc9\xc0\x66\xf5\x6c\xd4\xd5\x4d\x83\xe3\xbb\x78\xa4\xdd\xa0\x7b\x18\xcd\x5c\xec\x53\x39\x11\xf1\x86\x63\xc0\xb9\x6c\x64\xfd\xef\x15\xaf\x4e\xab\xac\x99\x80\xb2\x94\x13\x69\xac\x81\x12\xcd\x75\x93\x53\x12\xf1\x93\x4d\x74\x6a\xc9\x28\x47\x40\x10\x0f\xa4\x31\x4d\x06\x7f\x0b\xe5\xfa\x52\x48\x9b\x1f\x51\x2e\x63\xd2\xd4\x5d\xec\x1a\x0c\xb6\x0d\xe2\x6c\xca\x55\x0a\x8c\x4a\x46\x6b\x53\xa7\xaf\x39\xa9\x90\xa1\x07\x39\x5a\xec\xcc\x01\x7e\xe4\x04\x96\x8f\x90\x98\x25\x66\x23\x25\xca\x07\xa6\xc3\x0e\x67\xdb\x4e\xfe\xd6\xad\xfd\xce\xb3\x7a\x78\xf9\x80\xe9\xc0\x2e\x04\x80\xa1\xf9\x09\xfc\x43\x05\xae\xc0\x70\xd7\xf1\x15\x6a\xc3\xe8\x6a\x9f\x2c\x50\x1e\xee\x74\xb2\x04\x95\xd6\x8f\x72\xec\x33\xab\x40\x29\x84\x3b\x96\x3c\x7f\x1b\xf2\x4f\x6a\x15\x02\x51\xbd\xd1\x29\x31\x4e\xf1\x9c\x23\x72\x0c\xee\xf8\x1c\x42\x59\xc5\x2c\x44\x39\xb8\x0f\xeb\x78\x0f\x31\xc5\x2a\xf6\xa5\xe3\x99\x7d\xe2\x5b\x0f\x80\x53\xb1\xa2\xdd\x6c\x53\x1d\x4e\x69\xd5\x15\x89\x9a\xd6\xc4\xd5\x31\x1f\x04\x06\x0d\x87\x7a\xd7\xec\xc7\xe8\x60\x50\x5d\xed\xfe\x42\x66\xc5\xf8\xb6\x12\x70\x90\x3d\x49\x95\x45\x4e\x1a\xf7\x07\xbb\x71\x4e\xfc\x2e\xc5\x95\x44\x9d\x00\x53\x20\x65\x59\x35\x7f\xeb\x9a\x49\x09\x7e\x91\x5d\x4e\x7c\xc5\xcb\x61\x08\x53\x09\x37\xc2\x6a\x42\xc4\x5a\x12\x19\x45\xff\x90\x22\xd0\x08\xd2\x53\xc5\xb2\x29\x3f\xc9\x34\x2a\xe9\xf9\x89\x71\x26\x1e\xa0\x32\x40\xfd\xc7\xe6\x86\x04\xc0\x76\x4f\x12\x8b\xa4\xfb\xfd\x52\x5c\x56\x90\x81\xf8\x44\xfe\x7b\x32\xec\x24\x44\x96\xa8\x7a\x2f\x4b\xd4\x8e\x93\x30\xce\xb4\x2a\xe5\x25\xc8\x6b\x73\xe6\x3f\xd7\x87\xef\x8b\xa6\x2e\xba\x72\xb1\xc1\xf6\xa7\x20\x08\x23\xdd\x73\xfb\x2c\x76\x93\x37\xaa\x05\x25\x47\xb8\x52\xeb\xea\xb5\x38\xfc\xf9\x4b\x85\x86\xdd\xf1\xc0\x34\x43\x87\x67\x28\x0d\xbd\x87\x5c\xfd\x0d\xaf\x9a\x06\xc7\x63\xc8\x54\xfb\xbd\x39\xf3\xdc\x44\xeb\x28\x56\xe0\xb8\xde\x14\x4b\xda\x4c\x59\xf0\x34\x38\x82\x28\x01\x8c\x4c\x22\xed\x67\xb6\x4d\x49\xdd\x21\x99\xf7\x14\x80\xac\xdb\x59\x37\xb1\xd4\xc0\xd1\x86\x34\xbe\xf5\x6c\x30\x30\xf0\xc9\x36\xfa\x37\x6f\xc1\x55\x80\xf5\x20\x02\xb5\xd9\xd0\x8c\x1f\x7d\x51\xf0\x3c\x4f\x50\x1d\xd1\x25\x85\x99\x7a\x34\xf0\xbc\x08\x09\x1a\x8c\x3c\x4d\x69\xa8\xfd\xec\x8d\x7a\x7e\x88\x84\x49\x4f\xa9\x7c\xab\x0e\xbc\xaa\x47\x99\x44\xf0\x78\x80\x0b\xf0\xea\xe5\xf0\x7c\x7f\x7f\xdc\xee\xd6\xfb\xc5\xc3\x7a\x90\xd1\x00\x0f\x22\xc3\x7b\x5f\xf7\x7a\xbf\x93\x9b\xf4\xe3\x20\xa6\x5d\x30\xaf\xea\x66\x10\x3f\x01\x5f\x9a\x51\x42\xd3\x72\x60\xba\xdd\x2c\xf4\xa3\x8f\x14\xb8\x01\x37\xc5\x24\xdf\x51\x3b\xf9\x76\x54\xcc\xa0\x85\x21\x00\x4d\x1a\x54\x55\xd5\x7c\x1a\x5e\x30\x7d\xc3\x24\xc1\xa4\xe0\x1e\xa9\x89\xb3\x54\xf2\xbc\x9e\x67\xe8\x9b\xbb\xc1\x90\x6b\x8c\xa2\xb5\xeb\x36\x06\x1d\x31\x49\x88\xf5\xfa\xfc\x5a\x34\xf5\x8a\x57\xb0\x3f\x15\x4d\xa6\x96\x70\xcf\xd3\xac\xaf\x49\x85\x50\x79\x28\x94\xf1\xca\xcf\x22\xeb\x5d\x03\x88\x1c\x27\xee\xf5\x58\x57\x77\xdb\x07\x78\x87\x92\xbf\x76\x9e\x09\x44\x8e\x8f\x76\x94\x4a\xab\xd6\x9f\x6a\x2a\x28\x15\x42\xa8\x27\x76\x23\xc4\x0e\x47\x2a\x88\x6f\x39\x2f\xb3\x2b\xb2\x2f\xd8\x73\x24\xae\x23\x49\x32\x5a\xdb\x48\x1b\x6a\x99\xf6\x3e\x14\xf0\x10\x30\xb4\x71\x31\x0e\x41\x3b\x35\x89\x97\xf7\xc6\x7b\x1b\xfd\xbd\x45\xcd\x8e\xef\x8a\xc7\x3e\xe9\xd4\xb7\xbb\x51\xd1\x74\x93\x89\x2b\xc0\x6c\xd7\x42\xc2\xfa\xaf\x26\xad\xaf\xb3\x84\x96\x37\xf2\xf2\x1a\x84\x13\x59\x92\xa0\xa7\xa2\xe6\x69\xff\x8e\x85\xa3\x95\xc9\x94\xbd\x54\x50\xfe\x28\x06\x3c\xcf\xb3\x23\x47\x78\x94\xe1\xac\x50\x09\x8c\xa7\xd9\xf3\x7b\x6b\x6d\xb7\x7d\x70\xb8\x3e\xa4\xba\x8f\xe5\x80\xf0\xa4\xdf\x5d\x18\xd5\x7e\x67\xd7\x63\x10\xc2\x47\xe2\x36\x54\xfa\x2a\x28\x94\xfc\xce\xf3\x7a\x95\xf1\xa6\xaf\x59\x05\xe9\x45\x9d\x31\xba\x6a\xca\x6d\x91\xe6\x75\x75\x8f\x40\x99\x49\xc8\x17\x94\xd6\x96\xcd\xf4\xf0\x91\x7e\x82\x4b\x07\x60\xc4\x30\x76\x36\xf0\xf2\xfd\x05\x40\x75\x31\x07\x00\x57\x20\x88\xf7\x42\xb4\x77\xc4\x57\x35\x34\x82\x01\x42\x0f\x27\xd2\xea\xf9\xf1\xf1\xe5\x69\x73\xf8\xd7\x71\xfb\xf0\xb2\x3f\x6e\x77\x9b\xe7\x5d\xfb\x7f\xb8\x4a\xac\x16\xdb\x63\x6f\x74\x83\x0e\x7c\x4e\xba\x02\xa7\xe2\xd7\x28\x49\xdb\x63\x62\xde\xa7\x07\x8d\x2c\xd0\x94\x74\x6e\xfc\x06\x74\xa0\x43\x43\x76\x44\x9a\x83\x86\x55\xb9\xbb\x0d\xae\x3d\x6d\x79\xdb\xe0\x25\xe7\x63\x57\x9a\x7a\x69\xe6\x06\xa8\x26\xa2\x0a\xe2\x06\xd8\x77\x59\x56\xcd\x02\x85\xe8\x84\x8b\xac\xef\x36\x77\x63\x7e\xb6\xf1\x49\x1c\xc7\x57\xaa\x23\x65\x1a\x10\xe6\xe2\xe3\x4f\xfd\x70\xed\xc4\x1a\x98\x51\x03\x4f\x15\x1c\x80\x9b\x54\xf6\x4c\x95\x92\x76\xb8\x70\x82\x1e\x44\x43\x8e\xf2\x30\x30\x32\xb9\x17\x57\x11\x0a\x51\xa4\x39\x2f\x27\xdc\x65\xda\xd3\x1e\x9a\x3f\xc5\x90\xf3\x7f\x5a\xf8\xa0\x3d\x1d\x1b\x6d\x3d\x24\xd8\xdf\xf1\x8f\x01\x38\x74\x16\xab\xa8\x7d\x5f\xb8\x44\x9e\xfc\xde\x4b\xc8\x69\xed\xf3\xc0\x66\x42\xdb\x39\xc4\x9b\xf2\x26\x79\xa1\x03\xcf\xc5\x3c\x6d\x56\xbc\x77\xc7\x05\x5e\x8c\x95\x44\x47\x13\x58\xbc\xb3\x52\x38\x5a\x07\x9a\xa2\xc0\x86\x85\xab\xfd\xea\x24\xb3\x34\xbe\xa1\xd0\x27\x4a\xba\xa7\xd6\x4e\x43\x0f\xee\xd6\xc3\x9d\xad\x7f\xb2\xc7\x47\x81\x74\x6d\xb5\x7f\x96\xbe\x77\x92\x2d\x5a\x47\x49\xc2\x8c\x8c\x21\x7e\xb0\x1d\xc6\x50\x3f\x09\x87\xe8\x84\x91\x54\x51\x45\x8c\x53\xdd\xa7\xe0\x51\x84\x64\x78\x47\xa4\x70\xe1\x97\x22\x47\x00\x4d\x32\x79\x0e\xc1\x84\x05\x4b\x53\x6a\x01\xf1\x02\x96\xa0\x74\xf2\x2a\x85\x20\x57\xb8\xaa\x8b\xcb\xad\x92\xad\xd6\x42\x51\x36\xc4\x92\x84\x7f\x3a\xa0\xa5\x4e\x48\x1c\xca\x18\x65\xed\x7e\xf6\x9d\xbf\xbf\xdf\x40\x6a\xb4\x0a\x48\x7b\xc5\x92\x7c\x8f\x1d\x3b\xad\x42\x16\xf4\x00\xea\xd6\x68\x9e\x2d\xd0\xd4\x2a\x72\x71\xfc\x20\x4f\xc2\x9a\x97\xdd\x2d\xab\x44\x60\x16\x78\xb5\x7e\x3e\xa2\xe8\xfb\xfe\xfb\x62\xb7\xee\x5a\x65\x84\x81\x02\x6d\x2a\x6b\x46\x6e\xf3\x7f\x0d\xc3\x48\xe6\x00\x60\x3c\xf4\xba\x04\x2f\x52\xca\x75\x5f\x04\x38\x49\x8a\x9e\x7b\xdf\x45\x6b\x57\x63\x8d\x32\x6f\xea\xc2\x96\x99\x4e\x29\xf8\xb5\xd6\x92\x34\x46\x0d\x05\xff\xd8\xeb\x00\xc6\x98\xaf\x11\xd0\x2d\x5a\xcf\xf6\x30\xe4\xa8\xde\x7f\x15\xdf\xb7\x47\x03\xc8\xde\x1e\xd8\xa6\x3f\xc1\x4c\x58\x7f\x50\x67\x01\x8c\x39\x31\x51\x87\x56\xa7\xe2\xc3\xa4\xa1\x50\xdf\x1c\x0b\x82\xfa\x9d\xc9\xee\x9b\xed\x11\x8a\x6a\x8d\xeb\x8e\x9b\xd0\x40\xfe\x7e\x33\x1d\x5c\xa6\x31\xac\x41\x74\x3f\x5b\xe4\xbd\xa5\x02\xf5\xae\xd2\xbb\xed\xe5\x73\x2c\xa5\x3d\x9e\x07\xd1\x99\xe1\x88\x6a\xfb\x70\x32\x59\x68\x20\x98\x4a\xa8\xc3\x28\x03\xd5\xf6\xd2\xc4\xc3\x2b\x2f\xb6\x02\x10\x18\xf3\x1c\xe1\x98\x7a\x8d\xbb\xe7\x83\x59\x8a\x40\xed\x50\xbc\xbc\xbc\x65\x21\x69\x0f\x09\x19\xd1\xd6\x65\x45\x35\xb6\xff\x4c\x47\x27\x71\xfb\xd8\x0a\x1e\xa0\xf0\x1a\xa4\x15\x6d\x91\xdb\xbf\x0d\xb2\xea\xf1\x00\x24\x04\x8c\xf9\x8e\x87\x85\xa8\x55\x96\xde\x80\x6f\xc6\x1f\xdf\x17\x11\x22\x00\x7b\x4d\x23\x5a\x30\xd4\xe4\xd9\x7d\x0d\xe8\x8f\xad\x78\x69\xab\xfa\x07\x71\x7a\xea\xd0\x85\xb4\x5b\xcb\xe4\x31\xcd\xeb\x6f\xcd\xf5\x8f\x13\x32\xb6\xa1\xe0\xee\xe8\xc2\x41\xc8\x1c\x53\x9d\xfe\xc0\x73\x35\x80\xd1\xc4\x43\x98\x41\x43\x85\x48\xe6\xa0\xd0\x73\xb1\xec\xfb\xbd\x68\x30\x74\x3b\xb7\xde\xb7\xdd\x62\x16\x10\x39\x18\xd1\x52\xcc\x79\xb0\xd8\x8d\x00\x7e\x25\x46\x91\xb6\x50\x62\x8c\x7e\xa2\x64\xde\xf6\x4b\x12\x8c\x86\xf3\xa6\x3e\x41\x5e\x13\xc4\x68\xa8\x92\x6d\xfa\x45\xc2\xf3\x88\x4b\x1b\xca\x34\x1b\xa8\x23\x77\xf7\x1f\x3b\x02\x6b\xe2\xec\x6e\xff\x85\x10\x48\xdb\xdb\xf5\xb1\x42\xe4\xc2\xaf\x58\x73\x6e\x1c\x96\xb6\x25\x91\x08\x26\x7c\x59\xa1\x06\xe8\x2f\x28\x59\xb6\x07\x49\x85\x2a\xb2\xfb\xe5\xbe\x8b\x0d\x00\x63\x3c\xd2\x18\x68\xb1\xab\xa9\x01\xbc\xcc\x6d\x18\x6d\x6f\x41\x7a\xd3\xa6\xc0\xbe\xdd\x1f\xce\x69\x3e\xa9\x78\x6b\xfb\xc9\x04\xcd\xac\xfa\x94\x96\x3d\x9c\x0f\x18\x13\x92\x59\x15\xe9\x0d\x46\x2c\x79\x9a\x43\x89\xa1\xe5\xf2\x0d\xfa\xc0\x13\x76\x8d\x30\x49\xfa\x5e\xd4\xfc\xd8\xe4\x47\x69\xb2\xc3\xd3\x79\x29\xc0\xe5\xc6\xce\x5d\x97\xd2\x65\xbb\xfe\xfb\x98\x1e\x52\x30\xa4\xf1\x05\x22\x2d\x43\xca\x2d\x35\x8c\x77\x03\x63\x8a\x71\xc4\xfc\x1c\x78\x56\x54\xbd\xfb\xd9\xb6\x44\x80\xec\x2f\xeb\x9f\xfc\x7c\xc9\x60\xdc\xa6\x9c\x70\xc0\x2d\x6f\x24\xc3\x80\x31\x1d\xc7\xae\x1c\xe0\x96\xd7\x3f\xe5\x69\x93\xaf\xab\x9a\xd7\xf0\xc4\xab\x45\x36\x54\x0f\x1e\xbf\x3b\x0d\x2e\x98\xe4\xf0\xc1\xd6\xf3\x03\x73\x58\xc8\x88\xb0\xc9\x7c\xa8\x9e\x2b\xb9\xf9\xbc\x5a\x6f\x6a\x9e\xda\xa1\xe8\x30\x19\xe2\x92\x97\xc3\x47\x57\xa8\x3e\x75\x97\x06\xbb\x25\x30\xc7\x71\xa8\x36\xb5\x6a\x57\xba\xa1\xec\xe1\x78\x31\x75\x9c\xc8\xf7\x1d\xcb\x7d\xd0\x1b\xcc\x37\xe0\xe4\xb6\x2b\x97\x98\x81\xe2\x68\xd6\x3f\x80\xee\x1e\xd6\xf3\x98\xb0\x32\x78\x33\x31\xa8\xf1\x1b\x73\x7c\xee\xa1\x9d\xfc\x01\x29\x51\x6d\x6e\x30\x84\x6f\xb4\x4e\x68\xdb\x90\x57\x6a\xfa\xad\x3b\x26\x46\x0b\xbc\x75\xa5\xe6\xa1\x76\xc3\x21\xe4\x04\x7e\x88\xa9\x3d\x5d\x16\xe7\xfb\xd2\x44\x07\x4c\xc7\xd1\xbd\x04\x61\x84\x3c\x9e\x50\x9f\x96\x69\xf1\xb3\x1d\x8c\x8e\xbd\x66\x20\x43\xac\x3c\xeb\xc8\x63\xbe\xe4\x31\xb6\x07\xa9\x18\xad\x82\x77\x5e\xa6\x7d\xe2\x1a\x98\x13\x86\xcc\xeb\x39\xf6\xad\x6a\xe1\xfe\x54\x7c\x54\xd3\x95\xc7\x89\x12\x08\xbb\x19\x40\x4c\x3e\xe3\xab\xc4\xcc\x21\x4b\xbe\xc9\x64\x53\xf2\x9a\x48\x24\x77\xfd\x04\x71\x62\x97\xc4\xfb\x08\x34\x7d\x4b\x15\xd3\x76\x89\x14\xea\x05\xe2\xac\x3f\x5e\x88\x73\xfc\xc8\x47\xcb\xa9\x13\x4b\x0f\x6f\x45\x34\x57\xd2\x21\xe5\xf2\xad\x5d\x74\x6e\x94\x0d\xfa\xa5\xc0\x49\x5c\x86\x50\xa6\x1d\x54\xb2\xf9\x32\xe1\xd8\x76\x0e\x38\xa6\xbc\xce\xfc\x27\xd5\x61\x4f\x77\xfd\x69\xff\xd0\x57\xfd\xba\x3d\x7d\x31\x09\x27\x7d\x7f\xe2\xb1\x5e\x11\xca\x74\x1c\x72\x07\xe6\x70\x2f\xc6\xd8\x2c\xc8\x12\x64\x6b\x70\x93\x9e\xf2\xa4\x14\x6d\x7c\x66\x2e\x49\x8d\xe5\x35\x7d\x07\x93\xc9\x98\xcb\x58\x19\xb3\xc1\x11\x8e\xb0\x79\x8f\x3b\x7e\xed\x5e\xa7\x10\x09\xbe\xf3\xae\xee\x72\x31\xe0\x6d\x1d\xdf\xa4\x90\x21\xeb\xc8\xdc\x56\x4d\x55\x17\x67\x2c\x6d\xac\x1e\xf9\xe5\x62\x0b\x0b\x81\x39\x32\x54\x86\x57\xb7\x3a\x75\x1b\x85\x23\x93\x08\x29\xcc\xbe\x35\xf9\x68\x0d\x74\xa4\xf2\x28\x17\x85\x03\x63\x0f\x59\x66\x69\x77\x26\x2f\x49\x2a\xcd\xb9\xd5\x9f\xbe\x64\xc5\x15\x10\xe8\x33\x45\x20\xb5\x3d\xb5\x8e\xfd\x41\x22\xb5\x1d\x19\xed\x6c\x2e\xca\x1b\xbe\x75\x60\x8e\x72\x34\x62\xb9\x70\x0a\xec\xd3\xd7\xb1\x1a\xf3\x2d\x15\xde\x78\x66\x2b\x45\xf2\xe0\x8b\xc7\xe5\x62\xbf\x5f\xdc\x3d\xef\x48\x3a\xc7\x3e\x1e\xb0\x10\x5f\xb0\x06\xb8\x4b\xdf\xe7\x6d\x09\x07\x12\x17\xb3\xa5\x5c\x54\xbf\x11\xd1\x96\x6d\xe0\x8c\x49\x2b\xb6\x52\xbe\xe5\x85\x02\x24\x23\xc2\xfc\xcf\x0d\x6e\x6c\x38\xe6\x41\x3b\xb8\xde\x73\xa5\x36\xf9\x3b\xe4\x75\x51\xde\xd4\xbd\xcd\xfe\x99\xbf\x43\xad\x35\x26\x40\x34\x3f\xa7\xd9\x75\x14\x2a\x06\xe6\xb6\x8f\xd9\xae\xc4\x6b\x99\xa5\x97\x0a\xba\x9f\xfd\x20\x36\x59\x98\xa3\x80\x59\xb0\x5e\xdb\x4b\xc4\xb8\xd9\x77\x45\x7e\xaa\x5f\x36\x5c\x27\xa4\xc2\x07\x30\x69\xee\xce\xef\x1b\x47\x1e\xda\x9e\x22\x26\xe7\xb9\x02\xf2\x39\x67\x8c\xc2\xc1\x7f\xff\xdb\x89\xc2\xff\xb1\x87\x2a\xc0\x42\xba\x33\x8c\x0b\x4e\x81\xb9\xae\xef\xa1\xd5\x8e\xd9\x3b\x93\xdd\x99\x5d\x07\x5c\x8f\x25\x7e\xbf\x9e\xde\x95\x45\xaf\xee\xfc\xc9\xab\x9d\x9e\x40\x27\xcc\x70\xc9\xae\xac\x7e\x95\x63\x1b\x7d\x37\x94\xc6\x57\xee\x08\x00\x31\x26\x8f\x9f\xd4\x9f\x9c\xca\x07\x19\x98\xa9\x72\x7f\x3e\x57\x77\xc4\x41\x31\xda\x90\xdd\x20\x8c\x11\xf6\x67\xb8\x5f\xab\x1b\xe6\xd7\xb6\x4f\xec\x23\xe6\x3d\x4b\xdb\x85\x36\x2d\x51\x23\x1f\xe3\xa9\xb7\x75\x9e\x16\xd6\x3b\x18\x84\x6e\xc0\xc3\x30\x1c\xda\xc8\x86\x61\xa5\xf5\xf1\xab\xce\x20\x75\x23\xe6\x21\xed\x7c\x5a\xfd\x91\xd6\xa7\x34\xdf\xac\x9f\x6d\x53\xec\xba\x46\x33\xa2\x7d\xab\x8b\xe5\xbc\xd2\x62\xdb\x51\x6b\xa4\xc6\xca\x88\x97\xe9\x5b\xfa\x0e\xdf\x9b\xbc\x46\xd2\x23\x9e\x19\x22\x43\xd3\x37\x49\x42\xc4\x6c\x7d\x5b\x6e\xbe\x08\xc3\x9a\xce\x22\x26\xca\x3f\x53\x06\x3e\x5c\xbb\x5c\xc1\x19\xda\xec\xf0\x53\x42\x55\x0d\x4a\xf1\xdb\x36\xe9\xe0\x9a\x2e\xd2\x2e\x55\x3e\xfe\x00\x42\x2a\x0f\x6c\xc6\xcc\x90\x03\x0c\x49\xcf\x81\xb9\xd2\x13\x81\xea\xa4\xf6\x5a\x0b\xe7\x01\x5e\xbb\xc6\x08\x30\xca\x52\x1b\xdd\x95\x1e\x30\x34\x4d\xa0\x0d\x5d\x69\x57\xc6\xb4\x6f\x90\x2c\x84\x79\x5d\xbf\x35\x53\xbd\xfb\xb6\x27\x48\xe4\x63\xa2\xa4\xfc\x6f\x13\x1b\xd0\x55\x8e\x64\x60\xb9\x98\x31\x58\x55\x4f\x20\x5a\x6d\x27\x8f\x85\x86\x20\xe1\xe5\xe9\xb0\xff\xe7\xa3\xbd\x7b\xa5\x7d\x04\x51\x3e\x2e\xfe\x3c\xae\x0f\xdf\xd7\xbb\xa3\xeb\x7f\xb7\x8d\x3a\x56\x58\xd6\x71\x23\x48\xd6\x75\x48\x18\x12\xec\xa7\x03\xe7\xc0\xd5\x5c\x60\xfd\x1e\xcf\x1b\x91\x8e\x8c\x70\x8f\x31\xa2\x63\x6d\x3a\x51\xcc\x41\xa4\x63\x1a\xca\xff\x7a\x9e\x7a\xcc\xe3\x56\x49\x17\x2d\x90\xc3\x47\xf1\xdc\xd4\x97\xc6\x32\x00\xda\x6e\x7e\x80\x6c\x2d\x85\xc2\x72\xd5\xdf\x06\x9b\xb1\xc7\x8c\x42\xf1\xab\xac\x2e\xbf\x4d\xce\x2e\x84\xea\x58\x88\x0f\x05\xc6\xc9\x97\xd7\x47\xa8\xf9\x23\xaf\x66\x15\x8f\xdb\x83\x94\xc6\xd8\x67\x47\x51\x3b\xb6\x1c\x1c\xd3\xcd\x89\x12\x44\x42\x3d\x14\xaf\xc3\xa5\xf4\x93\x93\x3a\x2a\xd4\xa4\xe4\xb5\x59\x3d\x77\xa8\x4b\xd3\xe8\xc6\xd2\x96\xd8\xef\xc8\x64\xb9\x0e\x9a\xb0\x82\xe4\xc4\x6f\x21\x88\xb3\x73\xd7\xf3\x9c\xc4\x35\xbb\xdc\x30\x2a\x37\x0e\x7b\xb7\xfd\xbc\x40\xd0\xd0\x1d\x59\xc0\x5b\x28\x07\x91\xa3\xee\xac\x3e\xe3\x18\xcb\x7c\xe4\x57\x7e\xdc\x1a\xaa\xf8\xee\x01\x02\x70\x50\x4b\x1d\x8d\x4d\xb4\x56\xd7\x56\x14\x09\x98\x17\x06\x2e\x29\xd5\x57\x83\x74\xde\x16\x7a\x02\x05\x60\x5e\x14\x02\xe2\x16\x1e\x9e\xbf\x1d\xd7\x53\x6e\x60\x9e\xed\x1b\x29\x01\xd4\x3c\xfe\xb2\x3d\x9c\x13\xa9\x7c\x4f\x92\x7c\x9e\xe4\x3a\xec\x68\x89\xdd\x48\x11\x3b\x81\xae\x23\x36\x79\xca\x38\xe1\x7e\xd4\xeb\x23\x11\x5c\xf3\x31\xcd\xa0\xaa\x8b\x1c\xc6\xeb\xb9\x17\xcb\x08\xf7\x85\x01\xc1\xe1\xb1\xea\xeb\xf5\x80\x79\x89\x23\x70\xbe\xb6\x3b\xf1\x1b\x52\x81\xa8\xb4\xca\xd2\xb7\xb1\x3e\x5e\xdb\x31\x71\xb5\x32\x0a\x1f\xf7\x45\xf9\xf6\x52\x66\xdd\x39\x92\x10\x23\x1e\x67\xa4\x67\xeb\xf8\xe7\xfe\xae\x4c\xdc\x1e\x0d\x3e\x77\x86\xf2\xf8\xcd\x58\xf6\xa8\xed\xa2\x29\x90\x93\x56\xed\x95\xed\x65\x85\xc7\x7c\xcb\x90\x75\xe5\x79\xdd\x6e\xc1\xf5\x5a\x16\x79\x71\x4e\xff\x6a\x3a\x31\xeb\x68\xf2\x02\x45\xbb\x8e\x52\x3d\x35\xad\x0c\x77\xf0\x3e\xf4\xae\x3f\x29\x1b\x32\x47\x4b\x27\xc0\x6a\xf2\x87\xe2\x75\x0f\xf5\xfe\x70\x43\xb5\xf9\x2b\xd5\x06\x78\x1e\xe9\x1b\x54\xc3\x43\x9a\x0f\x86\xfe\x27\xdd\x43\x0f\x71\x8b\x5c\x29\x43\x11\x30\xb6\x5a\x6d\x37\xc9\xad\x9e\x4b\x87\x47\xbb\x2f\xca\x73\x93\xf1\x39\x4a\x50\x60\x9e\x8a\x13\x34\xf2\x8f\x56\xa6\xf3\x50\x2c\xac\xb6\xd4\x3a\x6f\xce\x86\x93\x76\xf2\x0e\x81\x25\xe8\xde\x1e\xc9\xf8\xb1\xfc\x77\x7f\xf3\xe8\x93\x67\x02\xc9\x1c\x0b\x47\xe7\xe5\x2b\xd4\x73\x8f\xe4\x33\x87\x1c\x96\xfd\xe3\x6e\xb8\xc2\xfb\xcc\x55\x98\x0e\x7e\xe7\x59\xaa\xee\x8a\xde\x36\xb2\x9f\xca\x67\x89\xa7\xc2\x2e\xbb\x42\xfc\x4c\xed\x74\xb5\xa4\x77\x6d\x17\x49\x4c\x7f\x86\x4b\x22\x70\xbc\xaf\x4a\x85\xdb\x03\xb4\x47\x83\xe7\x84\x48\x8d\x11\xb6\xc3\x74\x71\x5c\x1e\x98\x61\x49\x4e\x71\xd1\xe4\xca\x1d\xbf\x40\xdf\x4d\x04\x7a\xb5\xfb\x53\x9a\x5f\xf7\x7f\x35\x69\x59\x42\x66\x57\x23\xdf\xe5\x0a\x71\x60\x85\xa5\x04\x36\x6f\xc6\x34\xfb\x1e\x24\xa6\x28\x8b\xcc\xa4\x5f\x9b\x69\xbe\x2f\x5d\x65\xf8\xef\x1e\x0a\x6e\xd2\x1b\xbf\x4c\xe2\xf0\xd9\x39\x7d\x82\xd4\x60\x90\x7e\x57\x64\xd9\x5d\xda\xd9\x33\x7e\xe0\x51\x51\xf1\x89\x57\xf7\x45\x53\xfe\x0b\x78\x97\xa9\xeb\xba\x44\xcc\x27\xd0\x7b\x53\xd5\xa0\x36\xf9\xa5\xa9\xfb\xb6\x18\xfd\x3a\x41\xb5\xa1\x59\xbf\x7b\xdd\xc6\x7e\xcd\x21\xa1\x1b\xf8\x51\x57\x04\x61\xe5\xfd\xc7\xf7\x1c\xba\x8a\x11\xb4\xa3\xc4\x84\x25\xc1\x99\xad\x88\x6f\xdb\x41\xfa\x98\x70\xbb\x43\xee\x82\xee\x57\x4d\xa6\x8d\x02\x5e\x9f\xee\x78\xcd\x8f\xdc\x86\x6a\xfc\x88\x01\xd2\x15\x9d\xd1\x50\xbf\x2b\xf9\xeb\x74\xce\xf8\x91\x0b\x18\x10\x31\xc5\x8e\xa3\x18\x9a\xed\x12\x00\x5a\x39\x27\xcc\xa0\x52\x88\xb3\xe3\xa4\xb5\x97\x8a\x15\x43\x32\xbf\xf7\xa2\x36\x14\xad\xe3\x44\x87\x9f\x04\x3c\xf4\x6d\x22\xbf\x3c\xf3\x8c\xbc\x76\xdb\xcc\x9d\x04\xed\x14\x24\x40\xd6\x45\x53\x22\x7a\x6c\xfd\xd7\x4b\xda\x9f\x82\xbb\x01\xaa\x2b\x3f\x15\xfc\x34\x97\x9f\x6b\xbb\xc4\x12\xe9\xb6\xf6\x96\x2b\xaf\xfd\x4d\x32\x24\xf3\x5d\xb6\x7b\xd2\xd5\xb0\x7c\x8d\x1f\x51\x3a\x9e\x09\x2a\xbc\x41\x7e\x1c\x46\x91\x7f\x85\x2c\x09\x4f\x40\x6c\xb3\x3a\xcd\xd5\x13\xfc\xac\xbf\x17\x4d\x8f\xe0\x20\xc8\xa9\xed\xa9\x18\x6e\x4b\xcb\xe7\x87\xc3\xf7\x99\xdc\xd4\xf8\x79\x54\xe0\xa0\xf5\xd0\x99\x1a\x7b\x40\x2a\xa7\x3d\xc9\x6b\x8c\x6f\x42\x7b\x0e\x16\xd2\x4e\x73\x75\xa3\xfb\x18\x0e\x4b\xcd\x25\xfa\xf5\xfc\x47\xaa\xa0\xe8\x24\x39\x80\x05\xcc\x4f\x30\x4e\x23\x1a\xb4\x25\x6e\x6b\xfd\xdb\x3e\x61\x84\xf0\xb0\xa3\xa2\xf4\x6d\x57\x2c\x88\x0b\xcc\xa4\xb3\xeb\x32\xc7\xb5\xea\x36\xff\x8b\x93\x6a\x5b\xd4\x8b\xea\x3e\xfd\xd9\xfe\x2b\xcd\x6b\x2c\x21\x3f\xc3\x66\x0c\x4e\xb7\x87\x73\xaa\xdd\x48\xab\xa7\xa2\xc6\x6a\x8c\x01\x88\x7d\xf4\x16\x02\x57\x33\x19\x77\x82\x81\xfc\xfc\xb5\x18\xe8\x97\x51\xb5\xc0\x73\x22\x84\x5b\xfd\xb9\xda\x66\xcd\x6b\x17\x46\x0a\xbc\xc4\x75\x89\xa2\x17\x52\x59\xf4\xd5\x4a\xc0\x02\x9f\x05\xc8\xf5\xf1\x50\xbc\x2e\x9b\xeb\xd7\x51\xbb\xc0\x67\x54\x21\xb8\xba\x2b\x81\x9f\xd3\xfc\xd5\x92\xbc\xb7\x6d\x92\xb9\x49\x97\xcf\xfb\xdf\x8b\x3b\x79\xa3\x81\x10\xa4\x83\xdc\x94\x79\x17\xb2\x0f\xc2\x24\xc6\x00\x17\xea\x4e\xda\xba\xa8\xf1\x00\x98\xdd\x43\x82\x50\x3a\x18\xb0\x4f\xab\x6f\x59\x21\x78\xd6\xd3\xad\xb4\x8d\xda\xd5\x36\xce\x5c\xde\x03\xca\xa0\xac\x7d\xdb\x1a\x85\x04\x5a\xe5\x4a\x3d\x40\x3e\xca\x5a\x04\x71\x20\x11\x9f\xb0\x84\x5a\x16\x69\x3e\x78\xbe\x58\x4a\x2b\xc6\xf3\x08\x67\x38\x18\x8a\x90\xf1\xe1\x89\xa3\xa8\xd4\x21\xfd\x0f\x94\x9b\x1a\xce\xd5\x24\xe8\x13\x24\x32\x36\x24\xe8\x94\xcc\xa1\x67\x6e\x47\xd2\x92\x97\x23\x29\x8b\xc9\xbb\xe7\x3e\xd1\x31\xf5\xce\xd8\x0f\xc8\x55\x71\x63\x20\x9a\xee\xc2\x27\x57\xe3\x1b\x0a\x8d\xa2\x11\xbf\x98\x24\x8c\x02\x11\xf8\x01\x95\x7f\x40\x3e\x0e\xc7\x4f\xce\xc5\x25\x12\x56\x52\xca\xc0\xe6\x72\x30\xa2\x66\x8b\xd2\xc6\x27\x96\x01\x8f\x3d\x53\xba\x04\xe5\x98\x43\xa5\x6d\x16\x21\xe6\xa3\x1e\xd3\xba\xe4\xef\xf6\xcd\xa8\x28\xc4\x75\x0f\xba\xe2\xa5\x3d\xc8\xa2\x77\x2f\x02\xf0\x98\x6b\xb0\x23\xb6\x84\xe1\x4a\xe2\x6d\x67\xc8\xa7\xcf\x06\x89\x03\xac\x23\x1b\x7f\xc1\x4c\xad\x81\xc0\xdb\x1e\x9c\xf8\x29\x74\x39\x58\x48\x00\x22\x1c\xa5\xbb\xc5\x61\x5d\xd4\x8d\xfd\x59\x3b\x7e\x62\x15\x8b\x8a\x9a\x67\xbb\xa6\xdb\x4a\x02\x1d\xa9\xd0\x2a\x7e\xae\x8a\x9e\x14\xec\x0b\x40\x6e\x7b\x14\x57\x09\x95\x51\xca\x42\x7d\x99\x2f\x0e\x59\x44\x34\x4e\xb2\xc8\x75\x5a\x9e\x09\xbc\x62\x98\x32\x4d\x17\x27\xf2\xc1\x98\x4b\x75\xa7\x0f\xda\xfe\x9e\xc4\x38\x68\xfb\x4f\x3f\xb6\xc4\xc3\x76\xbc\x9a\x98\xd7\x1e\xf2\xaa\x98\xe4\x61\x43\xd7\xa3\x6a\x98\x97\xa7\xfd\xf3\xc3\xdd\xa8\xa0\xb7\x6d\xe5\x5a\x77\x32\x6d\xad\xe1\x3d\x8a\x18\x85\x1e\x4b\x30\xa1\x84\xb9\x0f\x4a\x9d\x75\x4d\x51\x80\xab\xde\x51\xdf\xa5\xdd\xdb\x0f\x3d\xee\x23\x13\xc2\x51\x16\xe7\x4b\x53\x83\xad\xe2\xe9\x42\xbb\xa1\x1f\xb8\x98\x37\x58\x19\xf6\x7c\xbb\x90\x84\xbe\xa0\x31\x8a\x80\xfd\x21\xf5\x2d\x59\x7d\xfb\x8c\xbf\x4f\xfc\xba\xd0\x97\x0e\x62\xfc\x15\xe4\x57\x7a\xa9\xdd\xed\x05\xcc\xc5\xef\xbd\x2d\xde\xe0\x5c\xe4\xdb\xe2\xa3\x6b\x09\x34\x04\xbd\xc2\x7e\x73\x9d\x54\x1a\xb5\x5d\x12\xc7\x27\x05\xc2\x2d\x94\x55\x91\x93\x34\xc7\xe4\xe2\x01\x78\x58\xb6\xf4\x04\x1f\xcb\xe7\xed\xa4\x31\x02\x52\xa5\x22\xa5\xc7\xdb\x92\xf4\xd9\xd5\x39\x8c\x74\xe8\x11\x03\x4f\x0d\xe5\x3b\xcf\x8c\x3a\xbe\x69\x8d\x43\x92\x28\xb7\xc9\xd1\x65\x67\x0a\x87\x09\x73\x89\x8d\xcb\xa8\xfa\x03\x0b\x39\x4b\x40\x0e\x37\x72\x8c\xe3\x42\x55\x8f\xaa\x00\xbe\x36\x6b\x43\x1e\x32\x5c\x86\x11\x90\x9d\xd6\xd7\x95\x2d\x1c\x69\xdb\xb8\x83\xc2\x1d\x14\xc0\x6b\xca\x19\xad\xd3\xcf\xce\xaa\x5d\xa4\x7f\x59\x42\x9d\x5d\x07\x59\xf5\x50\x04\x31\x72\x22\xa0\x9e\x3b\x72\x21\xbe\xe4\xe9\xad\x4b\x39\x3e\x9b\x88\xc0\x4b\xac\xa8\x53\x5a\x3f\x97\x43\xdb\x39\x14\x71\xc0\xa4\x31\xf3\x36\x79\xbb\x41\x57\x50\x1e\x3e\x8a\x3b\x90\xe9\x99\x5b\xdf\x3d\x94\x8c\xea\xb6\xf6\xbc\x2e\xaa\x53\x3a\x74\xb1\x42\x19\xc4\x68\xe2\x21\xed\x4c\x59\x9c\x67\x78\x57\x81\x85\x2a\x56\x68\x0b\x71\xf9\x57\x93\x12\xd6\xa4\x6a\x47\xcd\x1a\x83\x27\x8b\xee\x86\x80\x31\x8c\x2e\x52\xfc\xa3\xf8\xb0\x28\x4b\x6c\x02\xc4\x14\x15\xef\x50\xf6\xec\x23\x6d\x83\x17\x47\x46\x98\xa4\xbc\x5e\xea\x69\x9e\x32\x84\x90\xa4\x70\x1e\xd2\xb7\xbf\x81\x47\x84\x10\xbb\xc2\x35\xf8\xa0\xa7\xcd\xe3\xfd\x62\xb2\x5c\x40\xa2\x2c\xd5\x3f\xe5\xba\x0c\xaa\xc9\x60\x48\xe7\x3f\x01\x48\xca\x3b\xa7\xd5\x43\x8a\x34\x0e\xf6\x6c\xda\x53\x48\x50\x8a\xe0\xc4\x45\xf7\x2b\x27\x16\x81\xf5\x61\xf5\xd0\xff\x16\xc6\x7d\x49\x3b\x16\xc4\x4d\x5e\xb0\x96\xa1\xf2\x0d\x96\xab\xe2\x19\x90\xea\x45\x7f\xb1\x88\x25\x46\xc2\x26\x4b\xf3\xb7\xa3\xe8\x4a\x47\x81\x45\x4e\xc0\xe3\x5e\x23\x6f\x50\x33\xd3\xb6\x85\xb1\xcd\xd0\x0f\xc9\xc6\x7e\x40\x99\xea\x14\x6e\xe2\xbf\x91\x23\xc7\xd5\x0d\x3f\x78\x93\xd5\x3d\xac\x60\xb4\x0e\x44\x6e\xec\xe1\xf0\xbb\x7f\x79\xba\xdb\x3c\x7d\x3b\xae\x0f\xdf\x8f\xdf\x17\xbb\xbb\xe3\x6a\xb1\xfd\xad\xeb\x43\x6c\xe9\x8b\xa7\x1f\xdd\x4f\x42\x39\x6c\x08\x11\xec\x73\x59\xe3\xf3\x7b\x40\x88\xd9\x4b\x23\x7e\x87\xeb\xa1\x58\xa6\x68\xf5\xd8\x8f\x3a\x35\xc0\x23\xdf\x71\xa8\x7a\x15\x1d\xe6\x65\x09\x80\xa3\xf3\xd7\x88\xfb\xed\x39\xdc\xc8\x0a\x0d\xe0\x63\x4f\xa9\xab\xda\x2e\x82\xe2\xd4\x27\x5e\xad\x7f\x82\x6c\xea\xa9\x03\x14\xf9\x42\x0c\xe2\x77\x3d\x90\x6a\x7a\x22\x80\xc0\xa4\xd2\xa8\x32\xb2\x3a\x14\x5b\x7e\xfd\xac\x48\xd1\x1c\x15\x04\x11\x46\x06\x06\xa7\x9d\x1c\x60\xd1\x1e\x7e\xf7\x59\x83\x40\x60\x5e\xe8\x0f\xd8\x3e\xff\x61\xbf\x43\x28\x19\x96\x3e\xff\xd5\x40\x79\x7d\xea\xf6\x90\x28\x72\x75\x88\xc2\x54\xbb\xe7\x3f\xee\xa8\xac\xe2\xf9\xf7\xf5\xd3\x71\xf3\x74\xfc\x63\xbd\xe9\x7a\x05\x54\xbd\x2f\xe7\xa3\x13\xbf\xf8\xd7\x9e\x2c\x76\x1d\x13\xaf\xcb\x80\x57\x28\xc8\xf0\xc5\x9c\x8c\x22\xc9\x11\x7b\xa6\x7f\xda\xdb\x89\x65\xd0\x21\xdb\xcd\x16\x42\x1b\xec\xa1\x40\x1f\x75\xf2\x85\x92\x20\x11\xe6\x33\xa3\x0a\xdd\x94\x49\xa1\xed\x02\x9e\x67\x5d\x6c\xf8\x68\x57\xf2\x7b\xb0\xdb\x55\x94\x40\x04\x81\xa5\xc2\x6b\xe7\xe2\xd7\xd9\xc0\x61\xa4\x33\xe2\x6e\x88\x88\xe7\xb3\x55\xba\xd8\xdb\x89\x70\x83\x20\xff\xbf\x4a\x62\x44\xdc\x73\x64\xd4\x2b\xcf\xa6\xf9\xeb\x6a\x58\xe4\x38\xed\x1d\x28\xf4\x88\x56\x0f\xbb\xc1\x36\x15\x09\x70\xfd\x7e\x12\xb5\xdb\xd4\xfa\x69\x3f\xa3\xb6\x05\x2c\x92\x31\xb3\x94\x15\xbf\xa7\xb9\x1a\x2f\xb6\x91\x94\x0a\x3a\x68\x81\x11\x9b\xb7\x81\xa1\xfd\x30\x3e\x1d\x49\x95\x60\xd4\x64\x51\xe2\xfc\xc6\x7a\xee\xd3\x98\x2b\x6d\x3c\x5c\x94\xaf\x49\x12\x81\xbf\xc3\x8a\x97\x77\xbc\xe6\xc3\x0a\x9d\xf9\x83\x34\x13\x98\xb7\xdc\x43\xae\x0c\x3b\xf8\x34\x47\x38\x3d\x80\xd2\xe3\xff\x6e\x6d\xa9\x2d\xa4\x5b\x48\xff\x1e\x53\xd7\x1e\x15\x0c\xa9\x48\x47\x9e\xcb\x2d\x5a\x36\xd2\x9e\xc2\x08\xe6\x6b\x31\xcc\x26\x45\x9a\x7b\xd2\x19\x92\xd1\x58\x4e\x4b\x60\x31\x73\x7d\xc7\x54\x7f\x3e\xdd\x1f\xee\xa0\xe6\xf2\x34\x5d\x83\x62\x26\x88\xb6\x83\x5f\xd2\x15\xcf\xb2\x6a\x8e\x15\x09\x18\x52\x3a\x06\x7d\x5c\xdf\x96\xd6\x12\x5d\x5d\xf5\x49\x7a\x3f\x76\x3c\x70\x03\x2b\xfd\x92\xab\xe2\xbc\x99\x7a\x38\x6d\x97\x00\xc6\x3a\xbd\x06\x90\xfb\x9c\x4f\x51\x5f\xb1\x13\x04\x88\x21\xdc\xac\x9e\xad\x8e\xc3\xa2\x93\x31\xc6\x76\x89\x78\x3e\x1b\x10\x7a\x4c\xf3\x66\xa0\xfe\x32\x0c\x09\xc5\x4e\x1c\xe2\xae\x91\x5d\xfa\x87\x14\xc4\xc4\x7f\x97\x4a\x78\xce\xb3\xb4\x8b\x02\xc6\x8e\x56\xc4\xcc\x69\x95\x41\x7b\x2e\x82\xd9\x59\x13\xbb\x11\x05\x9c\x8e\xed\xcf\x87\x62\x7f\x23\x0e\x0b\x2c\xf6\x5c\xaa\xc6\xa3\x79\x38\x03\x4f\x89\x3d\x1f\xd0\x8f\xfb\x83\xd7\xf2\x64\x2e\xb9\xc9\x89\x35\xcc\x76\xe1\x0e\xb2\x29\x1f\xad\xb0\x12\x4a\x18\xda\xc1\xd3\xf3\xf2\xdb\x0f\x34\x1c\x84\xb1\xa7\x7c\xf4\x5f\x94\x89\xeb\xcd\x32\x2c\x00\x8b\x7d\x1e\x23\xe4\xf6\x52\xc2\x85\x97\xd0\x33\xdc\x98\xf6\x80\x79\x63\x3b\x7b\x96\x53\xb4\xed\xe8\xfb\xc8\xe8\x74\xbf\xd9\xed\x0f\xc7\x97\xfd\x7a\x77\x5c\xbd\x1c\xba\xd3\x24\xbe\x6b\xdd\xb8\x46\xfc\x2f\xc8\xfa\x91\xd7\x35\x94\xd5\xde\x4a\xc4\xb6\x9d\x64\x60\x4d\x5d\x83\x06\x97\x13\x59\xe7\xb6\x93\x8e\x5d\xd2\x59\x6e\xcf\xb2\xba\x25\xf8\x33\xfd\x42\xc7\x47\xbb\x67\x51\x55\xe9\xeb\x8c\xf1\x6e\xbb\xb9\x5a\x45\xdd\xae\xb1\xe4\x0a\xe9\x4e\x27\x7d\x20\x80\x91\xd2\x5f\x67\xd3\xc6\x91\x27\x19\x41\x21\xb0\x70\x8f\xb4\xb6\x66\x4d\xd3\x38\x0a\x1d\x2c\x75\x50\x35\x86\x62\x79\x0d\xab\xb4\xbe\xee\x73\x7e\xa9\x4e\xc5\x27\xdb\x5c\x1c\x49\x85\x06\x82\xbd\xf4\x26\x97\x90\xd7\xe9\x7b\xe7\x09\xc6\xb1\xcb\x09\x11\x94\x96\x77\x65\x71\xf9\x7b\x74\x7e\x1c\x87\x1a\xdd\x75\x3e\x9d\xb0\x71\xe4\x23\xe8\xa9\x23\xeb\xff\x0a\xfc\x18\xc7\x3c\xc1\x25\x98\xf8\xf0\xcb\x97\xbc\xea\x1c\xb6\x98\x07\x1a\xdd\x53\xf4\xbb\xb7\xc4\xf1\x71\xd7\xfb\x7a\x31\x97\xcc\xf1\x7b\x92\x09\x34\x7d\x2c\x5b\x24\xb0\x58\x84\xa4\x2c\x83\xc1\x4d\x4a\x58\x61\xb1\x5a\xd7\x2e\x3d\x9c\xb3\x97\xd6\xdd\x69\x17\x9e\x41\x86\x3e\x56\x6e\xac\x0c\xd2\x6f\xd3\x89\x6c\xf5\x71\xb2\x58\xc5\x3e\x5a\x0e\xed\x4a\xf3\xb0\xfe\xb1\x7e\x30\xba\x57\xc0\x62\xf0\x3d\x6f\x68\xfb\x0e\xb2\xd4\x31\xa8\x00\x79\xec\xed\xcb\x59\xa6\x6a\x0c\xf5\x1c\x21\x3e\x13\xe6\x39\xb1\xad\xcf\xe7\xb2\xb6\x9f\x2b\x61\x20\x90\xa6\xf4\xc7\x8b\xbd\xa1\xc4\x31\xd5\x93\x0a\xde\x51\x45\xa2\xa9\x8b\x61\xa4\x73\xf4\x8d\x12\x47\x01\x86\xc4\x1e\xef\x16\xdd\xf1\xda\x0f\x8c\xb2\x72\x17\xc5\x1f\x1f\xe4\x26\x82\xa8\xad\xda\x4f\x75\x5f\x02\x20\xc2\x61\x48\x3c\x64\x3a\x7a\x9c\x58\x3b\xb8\x98\xd5\x7e\x05\x96\xf8\x8e\x27\xb8\xdd\xd3\xbb\x8a\x1d\x50\x8b\xb4\x54\xed\xf0\xb3\xdd\x02\x8e\x68\x81\x0f\x21\x7b\xcb\x22\x09\x98\x52\x06\x36\x32\x40\x87\x8f\x77\x96\x24\xd0\x31\x8e\x0d\xc4\x86\x1d\x8a\x1b\x0e\x2c\x60\x49\xe8\x49\x84\x65\x3f\xa4\xf9\xdb\xfa\x0a\xa3\x52\xea\xbf\xdf\xa0\x93\x30\x8a\xb5\x15\x2e\x92\xc5\x7c\xca\x34\x89\x20\x12\xc9\x50\xe1\xa3\x42\xd1\x32\xd3\x1a\x3b\x44\x5e\x8b\xdb\x5f\x89\x75\xf5\xe3\x6d\x35\x89\x23\x5f\x1a\x4e\xd6\x2d\x51\x12\xea\xf4\xf5\x53\x31\xc8\xee\x20\xf2\x84\x29\xde\xb0\xc8\x32\xf2\x02\x3b\x46\x39\xdb\x4d\x46\x48\xfb\x56\x5c\x10\xc0\x80\x24\x71\x35\xcf\x1e\xb9\x35\x86\x13\xae\x24\xb2\x65\x41\x7d\x32\xaf\x70\x80\xda\x4d\x24\x27\xcb\x80\x0a\x0d\x17\x93\xc2\x83\xf1\x2d\x49\xe0\xc8\x21\x70\xcc\xe1\xe3\x6f\x1c\x29\x7b\x84\xd6\x08\x76\xde\xa7\xf9\x6b\x93\xf1\x32\xad\xaf\x07\xa8\x6a\x27\xb6\x97\x57\x4c\x44\x81\x51\x98\xe4\x25\x3c\x00\xbf\xd9\x6b\x3f\x39\xb5\x12\x24\x97\x45\xa5\x85\xb8\x83\xe4\x28\xca\x8d\xf0\xaa\x51\xe4\x30\x51\x8a\x21\x9c\xe0\xfe\x69\x75\x18\x06\x3c\x12\x05\x0a\x07\x79\x86\x32\xfe\xcf\x9a\x48\x0d\xb6\x25\xe8\xf4\xa7\xe7\x7a\xee\x9c\x86\x25\xb0\x04\x12\x3f\x61\xbd\x70\x80\x81\x8d\x8c\xd4\x51\xda\x5e\x3c\x62\x86\xb0\x19\x1e\x8b\xbc\x28\xa1\x1e\x68\xc3\x7f\xfd\x74\x00\x01\x66\x59\xf5\x50\xb6\x6c\xf0\x51\xc1\x54\x39\x5e\xca\xe2\x5c\xac\x9a\x3a\x05\x23\x3b\x38\x74\xf8\x13\xcd\x98\x6b\x18\xc0\x56\x48\xb0\x41\xbb\xe8\xdc\x1a\x9e\x68\xcf\x61\x66\x5b\x3e\xa6\xb2\xc8\xd3\xbf\x8e\x86\x91\xe9\x58\x5c\xa6\x50\xdd\x44\x87\x9a\xb4\xe1\x1a\x89\xc4\x0a\xf5\x72\x10\x84\xe0\x2c\x91\x8e\x9e\x25\xc9\x1b\x9d\x85\x33\x1d\x30\x33\xfb\x30\xe8\x49\xf1\xcf\x21\xdf\x43\xf7\x46\xb8\xc3\xdd\xc4\x84\x6b\xda\x33\x18\x81\x1d\x3b\x0f\xb8\x23\x20\x18\x28\x22\x22\xbc\x00\xd4\x63\x91\xc3\x75\x07\x64\x12\xdb\x9e\x92\x14\xfd\x3f\x8c\x57\x74\x1a\xe0\xf1\xb8\xa3\x15\xa7\xcc\x45\xb7\x7b\x3b\xe6\xab\x73\xd7\x89\x3c\x93\x55\x59\x66\x5c\xbe\xa1\xe2\xcb\x1c\x84\x81\xbb\x91\x70\x87\x56\x82\x71\xc0\x3e\x59\x48\xb9\x9b\x90\x58\x3b\xc6\x8e\x8e\xba\x04\xf8\x0f\x90\xa6\xb8\xbd\x2d\x4f\x90\xc8\xff\xae\xc8\xb2\xe1\x17\xe6\x1e\x44\x64\x93\x51\x10\xfa\x0e\xb4\x29\x53\xb2\x1d\xfc\x44\x1b\x75\x22\x22\xb4\x32\x22\x8e\xb3\x63\x80\xfb\x9c\x23\xc2\x76\xfd\x93\xb7\x03\xa5\x5b\x0e\x27\xeb\xe8\xe8\x98\xc0\xf3\x92\x81\x8b\x98\xe6\xaf\xd3\xe4\x29\x0f\x02\x4a\x60\x63\x41\xdb\x23\x4f\x91\xe5\xbb\xdf\x86\x79\xc8\x00\xf1\xc1\xcb\xcd\xe1\xf0\x3c\x9c\x9f\x3c\x74\x3d\x6b\x06\xee\x4f\xdc\x0d\xc2\xe3\xcb\xe6\x33\x1f\x96\x87\x61\x2c\xcc\xa3\xfe\x20\x8e\xd5\xaf\xc8\x13\x80\xf1\x88\xc5\x0e\xc1\x1f\xe9\x65\x5b\xfe\xa2\x81\x09\xc1\x23\x8f\x94\x31\x2e\x25\x9c\xd3\xce\x2c\xe1\x51\xe0\x62\x2a\xd2\xd0\xce\x2d\x96\xc5\xcf\x19\x44\x3b\x6f\xc7\x81\x67\x8d\x9f\x9e\x30\xca\xb4\xc6\xcc\xc5\x0d\xb4\x92\x3c\xc7\x50\x6e\xf5\x55\x6e\x85\xc7\x6e\x44\x7a\xd6\x3f\x37\xdd\x19\xdc\x04\x0b\x5b\x5e\x91\x50\xee\x7a\xf8\x28\xfa\x16\xa2\x9a\xab\x50\x19\x68\x89\xb3\xaa\x1d\x3d\x93\x4f\x13\x1b\x0e\x58\x79\xe2\x79\x0e\xd9\xf3\x05\x72\xe3\x3c\xda\xdc\x13\x8f\x75\x48\x14\x55\x08\x3d\x98\x07\x32\x70\x1e\x84\x81\x6f\xf3\x5d\x98\x78\xe3\xea\x4a\x96\xfb\xf2\x7a\x28\xb9\x7c\xdb\xa8\xf1\xa2\xcc\x85\xd2\x61\x68\xa7\x53\x21\xdf\x90\xe0\xa1\xe6\xe7\x09\x5e\x92\x4b\x57\xe0\x2d\x7e\xe7\xdf\x39\x6a\xd3\x8d\x46\x88\x0c\x98\x14\x06\xc7\x07\xbc\x6a\x4a\x58\x16\x3f\x27\x5f\x41\x86\x0e\x06\x6d\x29\x0f\x82\x91\xbc\xfd\x89\x97\x28\x8c\x68\x68\xef\xb0\xc0\xac\xbe\xf1\xde\xb8\xe4\x12\xd7\xe1\x8f\x2e\x56\xd1\x0d\x01\xe5\x3b\xe8\x55\xf0\xd6\xd0\x1f\x21\x43\x39\x44\x81\x63\xb5\x2b\x9a\xfa\x54\x94\xe9\x7f\xa0\x67\x5f\x99\x08\x59\xf6\x31\x4b\x0e\x49\x88\x91\x75\xd5\xd9\x49\xc2\x91\x72\x50\x31\x6e\xd1\xc3\xb3\x1e\x82\x70\x24\x60\xda\x15\x43\x20\x83\x97\x24\x3c\xe6\x44\xed\x60\x78\xfe\x81\x24\xfc\x3d\x8e\xf8\x26\x87\x3e\xbb\x4e\x0b\xcf\x49\x8c\x05\x5b\xbe\x43\xb9\x2d\xba\x85\x09\x29\x24\x64\x27\x54\x7e\x80\xf2\x5c\x2d\x72\xf5\x8f\x22\xcd\xef\xfe\xbc\xef\x3b\xc9\x84\x59\x6a\x5a\xe3\x4c\xdb\x61\x20\x7c\x2f\x36\xec\x8a\x28\x76\xc2\xcf\x60\x19\xfa\x86\xcb\x8c\xf0\x03\x1f\xc3\xb9\xc7\x76\x76\x93\xd3\x54\x4c\x62\xb1\xc2\x4f\x98\x36\x0e\x9c\x89\x6d\x6f\xd4\xb4\x8b\xd4\x8c\x77\xd3\xe2\x91\xff\x5c\xde\x8a\x45\x98\xae\xa1\x54\x18\x86\x78\x78\xf8\x71\xf4\x1c\xe7\xb8\xbe\xdb\x1c\x3a\xff\x40\x44\x31\xc1\x14\xa8\x1c\xf6\x40\x58\xa6\x5f\x4a\xa7\x8a\x38\x94\x01\x19\xf9\xc4\x43\xf6\x30\xc7\x71\x3e\x3e\x24\x49\x12\x0b\x99\xfc\x2a\x14\x2a\x12\x88\xbd\x7e\x59\xfa\x55\x84\xe2\xe4\x62\x5c\x04\xb8\x1d\xe9\xa2\x3c\x12\xae\xdf\xee\xb2\x42\x24\x9e\x67\x6c\xdd\x39\xc8\x93\x90\xa1\xc4\x3c\x35\x7a\x17\x9b\xbc\x32\xaa\x46\xa3\x89\x2f\x64\xa8\xa0\x17\x7f\x3f\x0c\xf0\xc0\x33\xe5\xf5\xc0\x84\xf2\x98\x63\xe2\x4b\x28\x81\x34\x88\xcc\xd8\xfb\x52\x81\x27\xc0\x24\xf1\x8d\xa0\x77\x51\xfe\x1b\xe4\x74\xae\xcd\x7f\x69\x15\x29\xc7\xc4\x6f\x3b\xd4\x74\x31\x4b\x89\x00\x4c\x80\x82\x80\xa2\x4f\x65\x65\x22\xf5\xa3\x00\xa6\xd0\xdc\xd1\x7d\xbc\xff\xa5\x46\x4d\xcc\x5b\xa9\xb4\xb6\x27\x24\x68\x6c\x3c\x2e\xfe\xb4\xfa\xbd\x86\x75\xde\x9c\x4b\x32\x87\xc0\x21\xe7\x42\xa5\xfa\xca\x8d\x63\x35\xfb\x14\xd2\x61\x3e\x9e\xed\xee\xf9\x69\x65\x8f\x77\x85\x44\x61\xb0\xd5\xdd\xba\x17\xe5\xfb\xdc\x1d\x92\xae\x92\x18\x09\xcf\x78\x55\x1f\x3f\xd2\xfc\xf8\x61\x14\x63\x81\x49\x5f\xd2\x8e\xf2\xad\x2c\x3e\x86\xab\x8b\x0c\xb4\xc7\x0d\x97\xba\x1b\x84\x9f\xdc\x5d\xc8\x7c\xc4\x3f\x22\x55\x09\x1c\x8a\x21\xfb\xbf\xd3\x75\x72\x12\xb4\x07\xd1\xa6\x1f\x78\xdc\x32\xf4\x12\x44\xdb\x3d\xbf\x75\xbf\x44\xc4\xeb\xb9\x7b\xfe\x7d\x74\x33\x61\xac\x48\x59\xfb\x54\x0e\x4b\x1e\x62\xdb\xac\x1c\x50\x7d\x84\xf3\xbe\x28\x6d\x90\xd3\x9e\x20\x8a\x3d\xcc\xcc\xfe\xb9\xb1\xb6\xc8\xe8\xa3\xc9\x48\x3a\xc8\x95\xb6\x6b\x1d\x4d\xbb\xdd\xca\xd8\x0d\x31\xd7\xb9\xfb\x63\x74\x37\xc2\x23\x49\x08\x83\xf5\xfa\x02\x33\x23\x85\x50\x40\x8c\x66\x6f\x30\x62\x48\x19\x7d\x20\xa1\x63\xdf\x32\x36\x2d\x94\x7a\xe8\x39\x5f\x81\x49\xe9\x03\x7a\xa2\x0f\xa9\xfe\x5b\x3f\xe3\xd3\xbf\xb3\x6b\x96\x54\x9e\x6f\xa3\x98\xb8\x59\x2f\x9b\x34\x53\x37\x70\x02\xa9\x42\xaa\xb3\x12\x05\x2f\x15\x69\xb9\x99\x96\x76\xc9\x4c\x7a\x26\x36\x22\x77\x18\xed\x04\x12\x22\x17\xb7\xba\xa3\x26\x0f\xb9\x3b\x54\xb8\x48\x42\xa2\x79\x5a\xb6\x8f\xb4\x2d\x8b\x9a\x68\x4e\xbb\x1e\x32\xb1\x64\x01\x77\x3c\xcd\xae\x66\x42\x8e\xef\x0d\x80\x24\x8c\xf7\xe4\xb2\xe8\x26\xcb\xae\x76\xf1\x21\x84\xd0\xaa\x75\x42\xf3\xeb\x4d\x06\x72\x9a\x81\x31\x27\xd4\x8e\x87\xd4\x80\x1d\xa8\xd1\xe4\x6d\xbe\x4c\xe2\x4b\xed\x44\x3c\xb0\x51\x93\x7d\x5d\x94\xa0\xee\xee\x6c\x70\x54\x6a\x07\xfc\x5e\xec\xc1\xd2\xee\xde\xa4\xf4\x6c\xef\xc8\xc1\xea\x21\x8c\x15\x1f\x4a\xe8\xb2\x02\x52\x47\x2e\x26\xe4\xd6\xbb\x95\xcb\xfe\xb6\x04\x4a\x6a\xc9\x02\x39\x24\x02\xab\x76\x80\x3b\xd9\x03\x47\x0e\x62\x20\xa2\x84\xbb\x02\xaa\xbc\xfe\xce\xdf\xdb\x95\x1a\x13\xff\x3c\xb3\x6d\x55\x77\x69\x05\xae\x6b\x0b\x47\x88\x7a\x0a\x7a\xfa\xff\xf6\xa0\x15\xbf\xdc\xe6\x40\xe8\x68\xc5\x02\x2a\x49\x7a\x84\x73\x91\x96\xb0\x22\x59\x51\x73\x6e\xe5\x08\x8e\xcc\x0d\x3b\x5e\xc3\xd1\x0a\x88\x01\x53\x6e\x44\xb5\xe7\x8f\x9b\xa7\xcd\xe3\xcb\xe3\xe6\xe9\xc7\x7a\x7f\x78\x5c\x3f\x1d\x0c\x17\x5c\xd7\x2f\xa1\x2c\xfd\xfe\xb0\xd8\x1d\x36\x4f\xdf\x8e\xdb\xe7\x67\x1b\xc0\x55\x5e\x10\x60\x62\xfe\x1b\xd4\xcb\xa2\xc0\x42\x01\x5e\xf3\xf1\x28\x52\x5e\xc4\xb0\xaa\xa4\x4a\xbb\x18\x8a\xf2\x81\x5b\x30\xc7\x1e\xa6\xb9\x97\xb6\x15\xa9\xfa\xb8\x52\x77\x40\x4c\xa2\x58\xee\x6e\xec\xe8\xe1\x77\x50\x81\xdf\xa9\xe8\x6f\xf2\xae\xaf\x7d\xb5\x2a\xe0\x1a\xab\x8a\x46\x0c\x48\x8b\xcc\x62\x3b\x54\x18\x26\x2a\xb6\x05\x5b\xd5\x2d\x92\x47\x85\x2a\xf0\xac\x3a\x90\xb1\x55\xba\x93\x47\x81\xa3\x78\x87\x42\xeb\xa4\xbe\xda\x96\x48\xeb\xd0\x6a\x17\x43\xbe\x2c\x0a\x9b\xe5\xb6\x73\x41\x45\xe6\xc5\x72\xa5\xa4\x29\x81\x56\xaa\x7d\x7b\x73\xc8\x50\x73\x4c\x1c\xb9\xc2\xbe\xb6\x54\xc1\x1e\xca\xf7\x54\x76\xd1\x6c\x95\x08\x49\x34\x90\x57\x71\x2e\xba\x47\xe4\x2e\xc5\xab\x3e\x52\x75\x2b\x23\xdb\xb6\xfb\x9d\xc0\xe4\x1d\x68\xde\x64\xb5\xc5\xfd\x0d\xa2\x5e\x4a\x84\x11\x0a\x53\x15\x5a\x43\x79\xd7\x9e\x65\x34\xb5\x95\x88\x23\x2c\xab\x38\x17\x39\x5c\x31\xd8\x37\x7e\x8f\x82\x87\x4c\x0f\xde\x63\x31\x4b\x3b\xde\x76\x14\xc0\x69\x32\xf0\x72\xc0\x0b\x3b\xbe\x9a\x8c\xa9\x3a\xea\x5b\xaa\xeb\xef\xf4\x8e\xf7\x83\x41\x2f\xb5\xab\xe2\x7e\xe9\xdc\x90\x68\xd9\x0d\x45\x12\x30\xf5\xff\xe7\xec\xdd\xba\x1b\xc5\xb5\x7d\xf1\xef\x72\x9e\xfa\x61\x3d\x20\x09\x04\xfc\xdf\x1c\xc7\xa9\xf2\xaa\x24\xce\x8e\x9d\xae\xd5\x7b\x8f\x33\x3c\x74\x99\x72\x58\xc1\xe0\x05\x38\xa9\xf4\xa7\xff\x0f\xa6\x24\x6e\xc6\xe9\xde\xe7\xa5\xab\x47\x90\x31\x06\x21\xcd\xcb\xef\xa2\x99\x7d\x84\x0f\xb7\xcb\xed\xdf\xac\x80\x6a\x2d\x22\x94\x0f\xf8\xd6\x4f\x09\xf4\x73\x7b\xaa\xe0\xa1\x7c\x87\x75\x7f\x72\x21\x90\x0d\xd8\x45\x2b\xfb\x9b\x97\x3f\x9c\xef\x1d\x04\x1a\x54\xa0\x82\x01\xc9\xd7\x8a\x08\xb8\x83\x26\x22\x9d\x5c\xc3\xbe\x2c\x00\x23\xf8\x45\xa1\xd7\xc5\xbb\xc5\xa2\x8f\x2b\xa6\xda\x44\x56\xea\xeb\xde\x92\x17\x91\x51\x81\x8c\x19\xd0\xd7\x50\x3f\xe3\x5f\x65\x22\xcb\x72\xf2\x06\xb1\x2f\xcf\xeb\xf1\x9b\x66\x74\x80\x9a\x6d\xdf\xd6\x77\xbb\xce\xbe\x0f\x02\x08\x42\x9e\x38\xa9\xdd\x4d\xae\xe7\x0b\xc2\x10\x24\x44\xdb\xbd\xba\x7a\xb3\x5a\x4c\xe7\xba\x3b\x01\x50\xec\x39\x54\xbd\xb4\x80\x0b\x3e\x80\x90\x00\x67\x55\x93\x0d\x10\xdd\xe3\xf9\x0b\x84\x58\x87\xa4\x02\x3e\x7e\x2f\x3f\xd6\xfa\x2e\x17\x7f\x51\xc6\x00\x12\xa5\xcc\x62\x03\x95\xf8\x44\xdd\x12\x05\x88\xaf\xbf\x32\x9c\x1b\xb4\x52\xdf\xa1\x34\xcc\x84\xcb\x34\x19\x2a\x62\xe3\x45\x7b\xb6\xdf\x17\xcc\xff\x46\xca\x2d\xe0\xe1\x98\x15\xd9\xf1\x7c\xfc\xd9\x05\x89\x40\x53\x81\x9d\xea\xed\xfd\xc3\x7a\xb9\x99\xdc\x36\x46\xa3\xc0\xb2\xba\x6e\xc5\xe7\x36\xfb\xd5\x7c\x2e\xdb\x40\xaf\x0b\x60\x80\x85\xd0\xf9\x33\x22\x52\xda\x6a\x2f\x8b\xac\xb0\x78\x73\x68\x06\xea\xe2\xff\x98\x4b\x5e\x80\x71\x4b\xba\xc3\x10\xf2\x42\xfc\xb8\x1d\x20\x53\x7c\x76\xeb\xe3\xf1\x8c\x52\x97\x58\x0a\xe8\x1e\x1f\x93\xc2\x13\xab\xef\xcb\x1a\x6a\x3c\x3a\x3d\x85\x01\xc4\xca\xd4\x6f\xd9\x71\x71\x9f\x35\x4d\x0e\x1b\x63\x76\xaf\xb0\x2b\x27\xc5\x0b\x08\x03\x86\x75\xd2\x42\x1c\x2f\x08\x67\x7e\x48\x6c\xe5\x9e\x9e\xad\xc7\x81\xed\xe0\xb7\x9b\xde\xc6\xf9\x72\x4e\xce\x18\x33\x54\xb5\xc2\x69\xfd\xad\x6c\x37\xe0\x61\x79\x13\x42\x15\xb2\xc4\x35\x2b\x3c\xa1\x3d\xbf\x0c\x65\xc6\x27\x8d\x92\x00\x3d\xb1\x6e\xca\xf2\x2d\x2b\x0e\x4f\xe5\xf2\xeb\x28\x06\x22\x63\x8c\xd5\xf9\x41\xbe\x8d\xef\xcd\x03\x4f\x53\xe6\x00\xc6\x6e\xf9\x75\xa5\xb8\xc1\xf3\xfb\xab\x08\xb4\x5f\x3e\x81\x6b\xae\xa4\xf3\x7f\xc8\x2a\xbb\x6c\xcc\xa2\x3a\xdd\xf8\x98\xd0\x58\xf8\x32\x94\x9d\xda\x1d\x70\xab\x5f\x5e\x20\xa6\x76\xe7\x69\x97\xb2\xc5\xfd\xfd\xe6\xe7\xea\xd6\x71\x90\xbb\x29\x9e\x10\x5b\x77\x69\xcf\x64\xd9\x36\x5b\xf5\x6a\xa5\x2b\xac\x51\xc8\x6d\x37\x32\x4c\xec\xc2\xd7\xce\xb8\xce\x13\x0d\x0f\x40\x42\x86\xe6\x81\x6d\x70\x69\xeb\xc5\xb3\x89\x2e\x24\x91\x41\x40\x7f\xbb\xa0\xa0\xcb\xef\xe2\xb7\x39\x2c\x0a\x24\x09\x65\xc3\xf2\xf2\xad\xc8\xe6\x1b\x68\x90\x88\x08\x7b\xc6\x3f\x16\xf7\x6c\x98\x98\x40\x2a\x99\x47\x48\x3d\xc3\xa9\xac\x46\x52\x3c\x3d\xb4\x09\x04\xb1\xe0\xe2\x63\x9b\xc5\x8a\xea\x73\x74\x12\xc9\x02\x04\x92\x8d\x6c\xf1\xba\x68\xd5\x03\xcf\x86\xcf\x53\xf2\x00\x31\x99\xce\x78\xd3\x29\x62\x4f\x9a\xec\x20\x39\x47\xac\x8d\xeb\x16\x3f\x95\xe5\x85\x24\xc3\x34\x6e\x04\x99\x86\xf8\x83\x8e\xa2\x81\x05\x2a\x02\x5c\xcc\xb3\x99\x18\x04\xa4\xa6\x91\xad\xb8\xd5\x58\x30\x1a\xee\x5a\x20\xb5\x34\xae\x47\x89\x3f\xcd\xbd\xa1\xe5\x04\xaf\x09\x8a\x5a\x62\x88\x15\x31\xaf\x7d\xc0\xd1\xbd\x92\x3a\x4e\xb4\x57\x3c\x2a\xcf\x39\x34\x0d\x3c\x9f\xf3\x29\xe1\x16\x20\x0e\xa1\x67\xa5\x2c\x54\x73\x16\xf9\x7f\x9d\xe1\x3c\x5d\x7e\x20\xb5\xe3\x9e\xda\xe4\xaf\x19\xc0\xb5\x00\x4c\x80\xdb\xe6\xcd\x66\xf3\x63\xbd\x6a\x83\xdb\xfb\xfd\x72\xf3\xf0\xb0\xde\x6e\xd7\x9b\x6e\x8b\x33\x5a\x60\xfb\xba\x2e\x4d\xb3\x74\x7a\x07\xf5\x40\x39\x15\x02\x13\x84\x29\x96\xb7\x9d\x6c\x95\x55\xfb\x13\x39\x74\x64\x18\x13\x70\x16\x79\x52\xd9\xfa\x0a\x9e\xc8\xd0\x40\x20\x7b\x05\xfb\xb7\xf7\x7d\x57\xc2\x30\x62\x84\xf5\x0d\x6b\x5f\x18\x3b\x03\x07\xf5\x7a\x3f\x8a\x12\xb4\x6d\xa8\xce\xc5\xf6\x03\xe0\x64\x1d\x26\xfd\x41\x9e\x62\xc8\xdf\xbc\x66\xf5\x10\x2b\x63\x42\xca\x11\x21\x5e\x9c\x8f\x0f\x4b\x14\x45\xee\x9e\x84\x09\x63\xeb\x7d\xe8\xdf\x1c\xeb\xe8\x89\x1e\x2a\x73\x92\x0a\xdd\x23\x36\xa1\x20\x18\xc7\xb9\x1d\xef\xe9\x79\xb5\xbb\x5d\x0d\x29\xf6\xeb\xa2\xdf\x05\x4d\x08\x1a\x3b\x7f\x27\x51\x29\xc8\xfb\x3c\xc5\x44\x81\x14\xde\x8d\xe4\x9a\x86\x29\x04\x86\x07\xa9\xb6\x98\x88\x5a\x18\x58\xd7\x2b\x8b\x86\xee\x7f\x07\x57\x2a\xb0\x9c\x2d\xac\x88\x8f\x42\x1b\x13\x87\x0a\x59\x9f\x37\x9b\xc7\x97\xed\x7e\xb7\x7e\x58\x6d\xf7\xbf\x2f\xee\x5f\x56\xdb\xc9\xd7\xc4\x31\x41\xef\xa2\x9b\xac\x79\x3d\x1f\xe5\x57\x19\xa2\x89\x65\x88\xb1\xcb\x53\x05\xbb\x03\xac\x7e\x9d\xa0\x6a\x7c\xc9\xcb\x24\x69\x82\x94\x0e\xcc\x69\x71\xb2\xdc\x97\x75\x3d\x7c\x97\x4c\xa2\xb8\xcf\x6c\x9c\xaa\xd3\x67\xbb\xc7\x8d\xa7\x5d\xa2\x2d\x92\xb3\x3e\x95\x45\xdd\x66\xc6\x48\x77\x1b\xae\x39\x26\xa5\x04\xe9\x84\xa8\x46\x79\x3b\xb0\x5b\x1b\xd2\xf2\xae\xf9\x4c\x41\x60\x84\x09\x84\x23\xe6\x6c\xdc\x94\xee\xa6\xab\x4c\x42\x5c\x0c\x2a\x50\xf0\x0e\x7a\xd5\xbc\x8e\x78\x43\xf3\x33\x43\x41\x8a\xe9\xae\x63\xea\x7d\xbd\xd1\x1a\x1d\xa5\xd2\x4a\xcd\x5a\x5c\xab\x3e\x66\x85\xb3\xd9\xf4\x57\xa1\xb5\xf1\xa6\xb9\xe0\x54\x90\x7e\x1b\xe3\xba\xa6\xe7\x34\xd6\xae\xd5\x64\x98\x8e\x5f\xaa\x61\x43\x60\x20\x20\x26\x74\xd5\xa5\xa7\x76\x99\xea\x04\xca\xc6\xe9\x80\x81\xc0\xaa\x38\x9f\x50\x00\x1c\xdb\x38\xdd\x39\x42\x2a\x2d\xe9\x29\xab\x9b\x1a\xc3\xcc\x4d\x81\x30\xa7\x27\x91\x5d\x41\x67\x1a\x08\x05\x32\x7a\xbd\xe2\x6d\x25\x1a\x38\x7c\x2e\xdb\xff\x76\x7a\x45\x24\x9a\xfc\x22\xe0\xd6\x22\xaa\x4d\x0b\xad\x97\xc5\x74\x7f\xf3\x25\x10\x03\xa9\x42\x84\xc1\x4f\x91\x37\xce\x0a\x09\x8b\x62\xdd\xed\x34\x91\x4c\xdc\x46\xde\x46\x37\x93\x57\xc0\x44\x9a\x1a\xdf\x1e\xfd\xf5\x2c\x14\x0c\x9d\xd8\xda\x01\x22\xd0\xde\x43\x11\x2b\x5f\x7b\x43\x58\x77\x6e\x48\x50\x3b\xb4\x80\x0f\xab\xc0\xff\xa5\xd0\xd2\x2c\x4b\x12\xcf\x44\x82\x20\x8a\x10\xcb\x23\xf2\xbc\xfc\xf0\x55\xa9\xb1\xc9\x33\x90\x80\xc4\x8c\x51\x6f\xb3\xd5\xc6\x86\xda\x1f\xa1\x44\x46\x4e\x1a\xf6\xfe\xac\xde\x3e\x9f\x41\x95\x95\xee\x11\x75\x24\xa0\x49\x2a\x93\xcb\x22\xf7\xb4\xec\x37\xbc\x3d\x24\xa0\x52\x08\x39\x48\xa3\xe6\x2d\x64\xda\x81\x3a\x8d\xdc\xeb\xfd\x28\x8e\x56\xb8\xc8\x1d\x62\xdc\x20\x23\xa1\x11\xbf\xf6\xbd\x3f\x62\x77\xe5\x21\xd1\x78\x78\xbf\x6f\x5e\x2b\x8f\x3b\x27\x01\x37\x02\x37\xb9\xbc\x6c\x9a\xf2\xbe\xfc\x80\xba\x19\x12\xb6\xda\x01\xd2\xea\x29\xe0\x6d\xdc\x95\x37\xed\x4c\xfa\x6d\x74\x53\x13\xca\x98\x2d\xb5\xcd\x4a\x11\x92\x20\x49\x29\xba\x80\x2e\x6b\x5f\xec\x20\x41\xa2\xa9\xe6\x5d\x87\xc8\x7a\xcf\x5b\x58\xcc\x40\x18\x6a\x6e\xae\x93\x20\x0d\x6d\x9d\xe4\xf6\xdb\x7f\xdb\x4d\x15\xa9\xd2\xf3\x77\x36\x8d\xad\xf7\x60\x1b\x09\x61\xbe\xed\xbf\x3f\x05\x43\xc3\xc1\x2d\xdf\xa0\x24\x40\x59\xf9\x6b\xb8\xe8\x2a\x4d\x34\x99\x48\x20\xe2\x00\xa3\xdb\xfb\xf2\x60\xe5\x59\x7e\x5f\xdf\xac\xfe\x16\x61\x89\x04\x42\xa4\x98\xfe\xae\xf2\xcf\x5f\xdd\xad\x96\x3c\x0a\x64\x67\x8b\x36\xe6\xf3\x93\x40\x2a\x85\x78\x4e\xec\x71\xf7\xba\x24\x57\xf4\xcf\xff\x31\x28\x1b\x91\x40\x42\x1c\xc4\xbd\xc2\x72\x59\xea\x9b\x4f\x18\x3f\x44\x15\x4b\x84\xbe\x62\x40\x8c\xf5\x52\xff\xc5\x9a\xa6\xe0\x28\x0b\xe7\xfe\x8f\x21\xc1\xc4\x1f\x0a\xb4\x31\xb0\x16\x29\x43\xc3\x1c\x1c\xa3\x02\xdb\x33\x6e\x37\x80\xe9\x54\x06\x1a\xa3\x6b\xea\xb2\x12\x7f\x7e\xae\x44\xd5\x13\x6f\x48\x00\x91\x56\xed\x57\xee\xe5\x39\xcb\xf5\xa0\xe7\x4b\x02\xe0\x1c\x7a\x8d\xe0\x9f\x90\x3d\x79\xb8\xf7\xf8\x0e\x43\x62\x10\xb0\xa8\x4b\xa4\x45\x0e\xde\x50\x48\x23\xdc\x8e\x8d\x35\x01\x5a\xe1\x2f\xe8\xde\x13\xd0\xd6\xd1\x69\xbd\x59\xde\xa1\x51\x61\x9b\x05\xb9\x63\x86\x58\x5d\xa4\xac\xde\x95\xe7\xaa\xcd\x35\x27\x20\x63\x12\x18\x99\x22\x26\xd7\x0b\x66\xda\x3f\x93\x80\x85\xd4\x7a\x4c\x61\xfc\xf6\x3c\x6c\xf7\x11\x12\xc4\xa1\x6d\xae\x17\x59\xd3\x63\xce\x09\x09\x92\xd8\x42\x5d\x3b\x6f\x3a\x20\x84\x50\x8e\x6a\xfb\x15\x2e\x3d\xc3\x7b\x43\x48\x24\x84\x6b\xb0\xbd\xd4\x50\xf9\x6f\xf9\xaa\x0d\x49\x08\x0b\xe3\x34\xf5\xbd\xc4\x5b\x51\x62\xf4\xe7\x2a\xfb\x93\x91\x69\x02\x9e\xb6\x76\x0f\xa6\x29\xdf\x3b\xf6\x26\x21\x4c\x71\xe3\xd1\xe4\xdb\xf5\xe3\x72\xe5\x0f\x84\x21\xc3\x1f\xf7\xf2\xf3\xf1\x2b\xab\x86\xf1\x57\x45\x94\x85\xac\xdb\x1e\xc7\x8f\x96\x44\x34\xc6\xb0\x2d\xcf\x8a\x37\x18\xbb\xad\xb4\x47\x13\x86\xaf\xa5\x7d\xab\x9f\xb6\x53\x8b\x60\x20\x84\x3b\x57\x97\x03\x34\x3f\xce\xba\xac\xdb\x1f\x73\x57\x56\xbe\x57\x36\xbb\xea\x90\x38\x12\xb1\x4b\xe5\x1e\x3e\x77\x59\x9b\x13\xd4\x73\x79\x23\x21\x31\x70\x0c\xfc\x1f\xe6\xbd\x29\x86\xc5\xc1\x31\x57\xe5\xcb\x1d\xec\xab\x7f\xdc\x17\x27\x44\xc5\x56\x5b\xf0\xac\xa0\xb9\xcf\x8c\xff\xc1\x49\x0c\x5e\x69\x6b\x69\x1d\xd0\x32\x69\x35\x5b\x1e\x60\x52\x7a\x27\x24\x01\x8d\x88\x3f\x03\xa8\xb9\xa1\xb7\xa7\x2a\x6b\xa0\xbe\x47\xec\x5e\x77\x46\x23\x85\x9d\xd0\xed\xca\xe7\x2d\x92\xba\x3b\x9c\x9a\x04\x0b\x91\xae\xff\x67\x15\x37\xd6\x48\x76\x7c\xcc\x64\xde\xbf\xea\x44\x44\x22\x1c\x1a\xd2\x61\xf9\x71\x00\xad\x22\x44\x88\x88\x77\xa5\x66\xd0\x1d\x7e\xe5\xa6\x33\x2e\x98\x09\xd7\x08\x91\x81\x73\xe8\xb7\xe9\xd7\x84\x1d\x4c\xda\x8d\x5c\x98\x41\x0d\xc3\x7b\x1a\x0d\x70\x5f\x84\x68\x69\x35\x67\x8e\x96\xbb\x32\xb9\x09\xda\x24\xd8\x47\xc5\x20\xf9\xf7\xec\x84\xbd\xc7\x41\x37\x60\x14\x1f\xf7\x0b\x23\x01\x22\xb1\xb8\x0e\x28\xde\x3a\xea\xb1\x13\x02\x46\xf8\xe2\xdc\x53\x55\x1e\xaa\x29\x31\x94\x10\x13\xa6\xce\x7a\x01\xda\xa9\x5f\xa8\x4f\xff\x59\xc3\x19\x66\x72\x0f\x8b\x7f\xad\x1f\x5e\x1e\x3c\xad\xa3\x3b\x0c\x96\xc1\xfb\x2a\xea\x75\x03\xf3\x85\x4b\x42\x83\xd8\xf6\x99\xad\x56\xde\xed\xa5\x67\x4c\x3b\x26\x8d\x7d\x4f\x61\x79\xae\xaa\x5e\xe8\x9d\x50\xa2\x48\x60\x6b\x0f\x1d\x6e\x7e\x7c\x7e\x4a\xc2\x20\xf0\x37\x3e\x2b\xd0\x63\x78\x38\x8d\x29\xe5\xc4\xeb\xac\xdc\xa1\x4a\x26\x2a\x93\x8e\x2f\x80\x2a\x4b\xfc\xc7\x54\xe8\xfe\xa6\x8d\x00\xf6\xdf\x56\x8f\xab\xe7\x45\x07\x2e\x27\x94\x1a\x82\x65\x90\x6f\x65\xae\xa1\xf0\xfa\xc3\x83\x3c\x87\x50\x46\x2c\xb7\xc1\xbb\xb4\xcf\x42\x72\x09\x0d\x13\x8d\x69\xf8\xed\x1f\xf7\xcb\xfd\xa0\xd9\xe7\x0f\x03\xc3\x1e\x8a\xd0\x7a\x8f\xa1\x25\xe8\xaf\xb0\x29\x84\x86\x26\xc1\x45\xb7\x29\xb1\xea\xe2\xfe\x1a\x51\x99\x4a\x97\x3d\xec\x45\x51\x16\x9f\xc7\xf2\x5c\xef\x47\x7e\x27\xf3\xcf\x2c\x0a\x8d\x14\xfe\x1d\xb1\x1a\x89\xe3\x2f\x8c\xa2\x80\x98\x4e\x82\x70\xe0\x12\x3e\x7d\x3a\x91\x49\x30\x8e\x17\xa5\xea\x71\xe4\x84\x72\x1e\x84\xae\xdb\xb8\x13\x6f\xd0\xb1\x53\xef\x3a\xe0\xec\xf4\x44\x1c\x24\xd6\x36\x2a\xa7\x27\xbc\x2c\x35\x0c\xc9\xce\xe3\xeb\x8b\x03\x89\x68\x51\x71\x25\x04\x74\xc3\x12\x42\x13\xd7\x58\x73\xe7\x79\x59\x17\x8d\xd7\xcd\x9d\x0d\x01\x69\x12\xa6\xd2\xe9\xb6\x3c\x64\x05\x7c\x83\x02\xea\xcc\xaf\x54\x34\x89\x23\xef\x91\x33\xe4\xa1\x4c\xcf\x61\x02\xcd\xbd\xd8\xc3\x01\xeb\x2c\x3d\xb9\x82\xd0\x94\x46\xc2\x35\xc6\x5f\x8a\xf2\xa3\x00\xfd\x98\xa9\x37\x2c\x46\xcf\xb4\x4d\x08\x4d\x99\x15\xeb\x31\xe8\x1f\xde\x2d\x3f\xdd\xe2\x44\x53\x95\xa2\x09\x5c\x51\x36\xa2\xfa\x6c\x13\xaa\x41\x8e\x41\x53\x13\x23\x7d\xa1\x4d\x01\xbc\x2b\x24\xe8\xd9\xba\x37\xa1\x82\x49\x4c\x27\x33\x55\x5e\x02\xd2\xfc\x98\x24\xc5\xda\xf8\x52\xea\xff\x1d\xb2\x9f\x50\x29\x34\x26\x86\x4f\xce\x5a\x71\xea\xec\xdc\x0e\x51\x9a\xdb\x88\x05\x1b\xf7\xed\x55\xf7\x87\x00\xf9\x8a\x27\xa8\xda\x8f\xad\xfe\x73\xbe\x7c\xf4\x93\xda\x02\xa1\x4a\x4a\xac\xcb\x6e\xd7\xdf\x1e\x17\xf7\xfb\xdb\xd5\xfd\xe2\x8f\xdf\xfa\x63\x29\x0c\xb4\xc9\x34\x54\xd6\x2a\xb2\x5d\x7e\xdd\x99\x3a\x41\x76\x42\x93\x8b\xff\xc3\x83\xa3\xaf\x03\x4d\xf0\xeb\x5c\x91\x6e\xb8\x37\x51\x80\x04\xbb\x1c\xb8\x0c\xd9\x22\xcb\xb3\x78\xeb\x9f\xa3\x61\x82\x93\x09\xa6\x6a\x8c\x2c\xf3\x03\x79\x8c\x9d\xce\x5b\x2c\x90\x56\x7f\x0e\xa5\x9d\x09\x0b\xc2\xd0\xf4\xc8\xca\x55\xf3\xba\x6f\xca\xfd\xb9\x1e\xb7\xc0\x09\x0b\x38\xf5\x7e\x34\xeb\xe2\xbd\xcc\x86\x5e\x53\xdd\x46\xe4\xc6\x12\xa6\x8d\x5b\xb2\x1c\xc2\x00\x17\xe2\xf1\x09\x69\x18\x49\x32\x91\x57\xb9\x69\x17\xb8\xa6\x1e\x87\xcd\x8c\x46\x04\x4b\xa2\x68\xf8\x88\x48\xcd\x51\x6b\xec\x82\x63\xdb\x6d\x86\x8c\x6a\x19\x76\xbe\xdf\x7d\xf3\x98\x30\x46\x85\xa3\x83\xf4\x5d\xa9\xdf\x66\xc2\x1e\xc6\x92\x00\x73\xd8\xd5\x71\x99\x8b\xba\xce\x54\x77\x06\xa1\x31\x5b\x87\x5f\x0d\x14\x1a\xc5\xa1\xc6\xbf\x2f\x8c\x24\xee\x55\xdb\x87\xc5\xf3\xee\x5b\x27\xb8\x45\x58\xa8\x52\x63\x6d\x52\xce\x8d\x2e\x3f\x0a\xe7\x8a\x30\xfb\x86\xb1\x10\x18\xb3\x2b\x1d\x82\x6d\xdc\x5f\x23\xa2\x50\xf7\xea\x24\x3e\xf7\x83\x95\x94\xc5\x01\xc3\x62\x6d\xbb\xc8\xdf\x97\x87\xbb\x2c\xbf\x9a\xef\xfe\x25\xa0\xf0\xcb\x24\x93\xc5\x81\x25\x97\x3d\xaf\xb6\xab\xfb\xfb\xf5\xe3\xb7\xfd\xfd\x66\xf9\x63\xff\xf2\xd4\xc6\x05\xeb\xcd\x6d\x77\x45\x5c\x63\x2c\x67\xdf\x19\x2c\x1b\x2e\x54\xbb\x73\x7f\x43\xd3\xb9\xc9\x3d\x8b\x95\xb6\x66\xea\x5d\x11\x12\x29\x11\x0e\x6f\xe2\x06\x25\x60\xa4\xdb\x2e\xd0\x09\x7c\x6b\x81\xdf\xfd\x53\x4f\xc1\xb2\x43\xad\xf3\xbe\x82\x45\x31\xb0\xa7\x20\x4c\xc4\x31\x62\x7e\x2c\x2a\xa6\x39\x57\xdd\xed\x13\x52\x84\x89\x3b\x72\x33\xf8\xbb\xd4\x81\xeb\xce\xe6\x4b\x51\xbf\x66\x57\x78\xcc\x84\x69\x11\x20\x96\xfb\xfb\xe2\xf9\x9f\xf6\x25\xbb\xba\xb8\x31\xad\x68\xe2\xfb\xe9\xd8\x14\xf3\x25\x23\xbf\x7d\x30\xa0\xa0\xac\x76\xdd\xfb\x1e\xf9\x88\xbd\x5d\xcd\xe4\x69\x80\x22\x58\x2f\xc7\xb6\x96\x77\x9b\x9a\x0c\x31\x32\xee\xba\x45\x06\xda\x68\x05\x2e\xf4\x17\x09\x33\xc2\x68\xd9\xb5\xc5\xdb\x18\xaa\xbb\x1c\x03\x29\xb6\x65\x9f\x57\x8b\x7b\xa4\x74\x5b\x40\xe4\xc3\x20\x28\x9d\x2f\xaa\x84\x41\x28\xbd\x5d\xc4\x23\x7c\x78\x44\xd4\x5f\x4c\x40\xf7\x59\x92\x46\xa8\x4d\x83\x53\x3a\xfb\xcf\x39\xf3\xef\x51\x48\x89\x08\xfd\x64\x5f\x17\x8d\x63\xee\x4e\x72\x9f\xe1\x2d\x0f\x69\xca\x3d\x8c\x07\x57\x4c\x8f\x2e\x9c\xcd\x8c\x06\xc9\x6f\xc8\x62\x89\x61\x65\x47\x9b\x75\xfd\x44\xfb\xea\xa2\xae\xad\x25\xd1\xfa\x6d\x85\x38\xd9\x72\x12\x32\xc9\x44\x2f\xab\xf0\x08\x1f\xce\x55\xe1\xeb\x3b\x16\x86\x31\xb5\x92\x02\xa3\xfe\xf0\xec\xaf\x8a\xa9\x46\x69\x9f\xcc\x79\x22\x4f\x00\xe6\x7e\x54\x6a\xeb\xb1\x47\x38\x94\xe3\x94\x35\x8c\x53\xb0\xbb\x78\xdd\xc9\xab\xc2\x18\xe9\x4f\xc2\x84\x12\xfc\x92\xfa\xb5\xfc\x58\x7a\xa3\xeb\xae\xc9\x48\xc2\x84\x83\x48\xfa\x8c\x07\xdc\x72\xd8\x7f\x3e\x25\x88\x58\x50\xd8\xad\xa9\xfb\x1d\x3c\x4c\xa4\xad\x12\x0a\x64\xf6\x2e\xf3\x0c\x8a\x66\x6d\x1e\xcb\x66\x4a\xf5\xf5\xe3\x0d\xd0\x64\xca\xc7\xaf\xad\xbb\x04\xd6\xcd\xbf\xea\x02\x91\x30\xe5\x1a\xdf\x7e\xf4\xf2\x7a\x5c\x3c\x4c\x3a\x2a\x24\x4c\x8d\xc4\x77\x69\xfb\x2a\x4e\x50\xbf\x66\xa6\xb9\x29\x9b\x6d\x99\x8f\x13\x89\x50\x90\xd0\xcf\x25\xa7\xda\x74\x05\xa8\xec\xc7\x2b\x15\x84\x9d\x5a\xd0\x7d\x29\x8a\x61\xdf\x84\x84\x92\x32\xd4\xd2\x5b\xad\x87\xf4\x36\x12\xca\x38\x42\x71\x89\xba\x11\x07\xd8\xb3\xfd\xa9\x57\xd3\x23\xa1\x4c\x2d\x85\xec\x1e\xde\x21\x1f\x7d\x4c\x85\x1c\x49\x79\x0e\x21\xfb\x20\x06\xe2\x72\x24\x54\x11\x10\xd7\xe2\x57\xd6\x76\xe8\x42\x16\x85\x84\x4a\x10\x04\x0b\x95\xae\xc6\xb5\x14\x79\x2e\x85\x7a\xfb\x26\xea\x81\xde\x0f\x09\xb5\x49\x30\x5f\xab\xcf\xb2\xcd\x0f\x9a\x55\x73\x61\x42\xeb\x46\x02\x91\xe8\xea\xb6\x3f\xb8\xc2\xa8\xbd\x05\x6d\x6a\x8b\x6b\xd2\xa4\xe1\x9b\xf8\x8f\x45\x0a\x8b\x06\x37\x28\x41\xee\xbf\x16\x74\x10\x46\x97\x39\xf6\x84\x12\x4f\x42\xc3\x13\x87\xf3\x2a\x74\x87\xb3\x23\x11\x31\x92\x53\xe4\xfd\xe3\xce\xf4\x00\x8d\xd0\x03\xa8\xe0\xe8\x15\x8b\x58\x64\x97\xbe\x3b\x91\x55\x9f\x77\xa2\x3a\x76\x35\xec\x88\x25\x12\xeb\xf9\x07\x51\x3f\x89\x4f\xd9\x91\x4a\x49\xc4\x52\xcb\x11\xc0\xe2\xd7\xbc\xab\x83\x1f\x29\x63\x0c\x91\x51\x5f\xf3\xce\xdd\xe6\xd1\x3d\x0c\x93\xe1\x7a\x14\x85\x24\x4e\xdd\xe4\xdb\x95\x8e\xb8\x30\x9a\x9e\x51\x48\x6c\x86\xd4\xbe\x89\xb7\x99\x50\x55\xd6\x28\xff\xc2\xb7\x07\x95\xa3\x18\xef\x34\xa0\x9c\xca\xe4\xe1\x47\xa1\x26\xf8\xf9\x57\xc8\xf5\x58\xde\x72\xfc\x4c\xa3\x28\x4d\xbd\x54\xdd\x5d\x05\xb0\xac\xca\xfe\x7b\x22\xc9\x11\x30\xbe\x2c\x8b\xf7\x02\xaa\x66\x57\x6e\x41\x55\x8e\xad\x31\xde\x0e\x23\x4e\x12\x69\xd5\x39\xcf\xa3\xbe\xaa\xcc\x01\xed\x15\x43\x7f\x52\x1e\x5b\xdb\xe8\xb7\x5a\xdd\x8c\xed\xec\xac\x82\xe9\x57\x94\xf9\xe9\x1e\xf3\x3f\xff\x77\x72\x11\x89\x25\x99\x0e\x42\xee\x4d\x8f\xc3\xee\x2a\x51\xed\xc5\x95\x67\x27\xe4\xe9\x3f\x9a\x5a\x09\x93\x1e\x7e\xbb\x45\x33\x58\x07\xc2\x6d\x7f\xc7\x63\xe9\xc4\xb2\xdd\x47\xe2\x90\x63\x95\x68\xf7\xcf\xe5\xcb\xdf\x4c\x89\xa2\x38\x21\x88\x53\xe8\xbb\x30\xcb\xcd\xc3\xfa\xc7\xca\x02\xe0\xae\x64\x35\x51\x12\x0b\xec\xd5\x1f\xc5\xaf\xbb\xac\x28\xe0\xf3\x09\xb0\xae\x72\x0f\x75\xbd\x7b\x15\x7e\xd5\x88\x12\x41\x71\x22\x42\xd3\xdd\xd6\xa6\x5c\x2c\x97\xe3\x25\x32\x4a\x03\x70\xd8\xb9\xcc\x6a\x5c\x78\x8d\x46\x7f\x1e\xc1\xac\xa8\xc6\x5b\x96\xe7\x8b\x42\x3f\x5b\x6f\x02\x77\x50\x49\xeb\x09\xbc\x3f\x5d\x97\x46\x9a\x0f\x06\x22\x1d\x58\x52\x16\xda\x62\xbf\x14\x73\xfb\x43\x04\xa9\x46\xbd\x1b\x6d\x6b\x15\x7f\x09\xbe\x23\x91\x61\xd6\x66\x78\x3b\x28\xb9\xff\x63\x8c\x50\xb3\x23\x79\xc0\x03\x44\xb5\x60\x34\xb6\x84\x6a\x22\x73\xe8\x47\x09\xa2\x6d\xc8\x52\x08\xab\x90\xf2\x9b\x3f\x02\x04\x83\x19\xe7\xac\xec\xaa\xcb\xc3\x48\xd1\x0d\x24\x8a\x49\xd3\x29\x49\x39\xee\xf0\xf8\x29\x70\x4a\xa4\xdf\x51\x6e\x45\x03\x4f\x65\x3d\x15\xae\x22\x9c\xf1\x34\x11\x83\x4e\xd4\x5d\x59\x0d\xec\x13\x27\x63\x93\xc8\xd8\x28\xb7\x6e\xaa\xf2\xd3\xbd\xf5\xb3\x85\x7d\xce\x64\xec\x4c\x45\x9b\x26\x87\x1b\x98\x10\x2f\xfd\xbf\x7e\xfb\xe7\x61\x68\x9d\xb8\x3a\x35\x40\x54\x36\xdb\x95\x18\xbb\x7f\xeb\x93\x76\x1e\x0a\x15\x05\x4e\xf1\xcd\x93\x88\xdd\xa1\x28\x34\x48\x8e\xa9\x10\xbb\x35\x7d\x59\xdc\x20\x4e\xc0\xe3\x7d\x6c\x88\x77\xd1\x69\x1b\x5d\x17\x27\xc6\xa0\x2a\xb7\x68\xa6\x4b\x20\xe7\x54\x20\xbc\xb4\x16\xef\xf0\x50\x1f\x6e\x3e\x5f\xea\xf9\x24\x91\x73\x19\x63\xe7\x17\x31\xdd\x0f\xd0\xbc\x96\x7e\xb2\x73\x2e\x01\xb1\xcc\x37\xeb\xc7\x21\x2d\x96\xf0\x38\x8c\x92\xc4\x57\x7d\x2c\xba\xb5\xbf\xd9\x7d\x32\xc3\xe3\x28\xa4\x3d\x02\xed\xae\xde\xfd\x70\x74\xc4\x66\xd2\x42\xe1\xb1\x96\x28\xf5\x06\x0e\xec\x30\x14\x19\x20\x3c\x11\x16\x73\xe8\x14\xfb\xf5\xa2\x02\x31\x39\x41\x22\x00\x27\xcb\x3e\xab\x9f\xaa\x9e\xdc\x4b\x78\xa2\xac\x6a\xcc\x3b\xba\x57\xbb\x3f\xca\x94\x3a\xd9\xfa\x3c\xbf\x41\xdd\xd4\x99\xab\x97\xc2\x7a\x66\x39\xf9\xd9\x76\xd6\x11\xe7\xd1\xd2\x9d\x47\xb3\x0e\x42\x2e\xa6\x88\x2a\xc2\x55\xac\x11\xcc\x60\xdf\xf5\xc5\xd8\x43\xf9\x6f\x27\xb1\x23\xd5\xf4\xfe\xcc\x69\x32\x06\x1a\x8e\x83\x5e\xae\x92\xc0\x4b\x71\x74\xc2\x00\xb3\x4b\x08\x57\x89\xc6\x4e\x36\xfa\x6b\x7f\x3a\x38\xea\xe0\x3e\xa8\x94\x21\xda\x76\xfb\x21\xaa\xcb\x39\x39\x3e\x97\x96\xd6\xca\xd8\xb9\xbd\x65\xea\x8b\xe2\x2c\xd7\x4e\x6a\xeb\xd0\x11\xa6\xb7\x6d\xa6\x70\xbe\xc2\xd7\x27\x1c\x68\x12\xba\xdf\xe4\xc5\x84\x3c\x07\x28\xf1\x43\x52\x16\x06\x9d\x5e\x4b\xfb\xd9\x45\x55\x89\x4f\xdb\xae\x9c\xad\x61\xb7\x1f\x41\xdb\xaf\xdb\x17\x16\xfc\x45\xe2\xcb\x0d\xb3\xc2\xd8\x07\x68\xbe\x8b\x4a\x96\xd5\xfd\xb0\x70\xe8\xdc\x4e\x89\x3f\xb3\x89\x0c\xa6\x07\xb7\x20\x9a\xd7\x3b\xac\x69\xee\xb3\x77\x3f\x79\x8c\xa4\x26\xed\x1a\x96\xbd\x40\xcc\xd7\x2b\x3e\x37\x60\x31\x64\x4b\x91\xab\x3e\x09\xb6\x07\xe3\x80\x45\xd4\x65\xab\x98\xd4\x3d\x94\x15\xb4\x9b\xe4\xa6\x80\xd5\xee\xfb\xe0\xa9\xc6\x81\xd6\x08\xf3\x79\x70\x0e\xe0\x03\x95\x04\x37\x82\x46\x2a\xb5\xc8\x22\x14\xf0\xc4\xb4\xd9\xbf\x41\x31\xe5\xd6\x2b\xed\x74\xae\x3b\xc1\x76\x87\xa9\xfa\x52\x5a\x82\xc4\x34\x4e\x02\x0b\xb2\xca\xb3\xe6\xa9\x6c\xba\x33\xc6\x06\x5f\x37\x0f\xe0\xbf\x05\x04\x1f\x0d\xcb\x1f\x31\x15\x51\xdc\x57\x31\xbf\x41\xe1\xec\x0a\xb6\x4d\x79\xba\x30\xb3\x48\xfc\x87\xb4\x40\xfd\x29\x68\x5e\x37\x3a\x2b\x06\x8e\x87\x24\x66\x32\xd0\x56\x49\xc3\xa6\x5f\x5d\x8c\x1d\x87\x9c\x29\xda\xad\x5d\xf9\x29\x9a\xdc\x9d\xd0\x10\x6c\x47\x3d\x88\xe2\x2c\xf2\x07\x2f\x9f\x37\x19\x15\xc5\x02\xab\x2f\xbb\xf5\xc3\x6a\xf3\xb2\xbb\xb9\xdf\x2c\x7f\x6c\xfd\x57\x44\x89\x44\x62\x45\x21\x9a\xec\x7d\x54\xd8\x8c\x23\x95\x70\xd1\x55\x2c\xb3\x06\x8d\xe8\xfc\x41\x1e\x05\xb1\x03\xdb\x3c\x89\xe6\x75\xbc\x15\xc6\x3c\xb1\xf6\x9c\x5b\x8c\xdb\x7a\x7d\x2c\x7f\x3b\x62\x1a\x72\xf0\x10\xe9\x5c\x7c\x4e\x3e\x1e\x47\x11\x1a\x19\xfd\x59\xfd\xea\x21\x37\x7d\x1b\x39\x8e\xa3\x98\x39\x35\xa1\xef\x18\xc2\xfa\xdb\xce\xc3\xc9\x83\x8e\x79\x88\x40\x86\x76\xc4\x16\x89\xf5\xfe\x80\x24\x89\x6d\x82\x16\xcb\xb2\xac\x74\x56\x88\xc6\x3b\xe7\x75\x43\x2c\x30\xe3\x77\x91\x6b\xc8\x45\xff\x67\xdb\x08\xf2\xa9\x3e\x12\x15\x87\x2f\x68\x9c\xd2\x04\x1b\x3e\x37\x9b\x9b\x0d\xb2\x44\xfc\x47\x05\xb3\x40\xad\x13\xe2\x96\xbc\x9a\x1b\x89\x45\x94\x20\xa7\xe9\xb3\x2c\xa5\x40\xd1\xa3\x51\x81\x21\x16\xb1\x95\xaf\xc1\x1c\x96\x0d\x65\x31\x48\x2c\x69\x24\x3c\x7a\xcb\xe5\x60\xb3\x5d\x9c\x58\x32\xe7\xe4\x6d\x13\xd6\x4b\x5e\x40\x3b\x24\x02\x6b\x51\xd6\xbe\x91\xd3\x83\x26\x41\xf0\x85\x2d\xfb\x7d\x88\x4a\xdf\xdc\x8c\xd7\xfb\x58\xc9\x38\x8e\x3b\x27\xb4\x67\x68\x3e\x00\xa6\xa7\x01\x42\xd1\x50\x08\xe3\xfc\x2e\xf5\x78\x46\xf9\xb2\x7e\x67\xee\x06\x5b\x25\xd7\x2d\x34\xe7\xd3\xcf\x9f\xcb\xbf\x00\x97\x4d\x71\x36\xb3\xfb\x43\x0c\xb1\xa0\x81\x8f\xe9\x90\x80\x88\x5d\x81\xf1\x20\xa3\x62\x0c\x0e\x95\x28\x1e\xd0\x3d\xe0\x5c\xe8\x99\xee\x4c\x6c\x80\xfb\x86\xac\x33\x20\x76\x30\xcc\xee\xb8\xc2\x60\xfd\xa5\xb8\x56\x1a\x4a\x82\x84\xa4\xee\x65\xb8\x39\x7f\xee\xa6\xf6\x62\x24\x09\xd2\x14\x89\x8c\xe0\x9c\x12\x06\x85\xf8\x24\xd0\x52\xda\x47\xb6\x12\x55\xfe\x79\x93\x55\xb3\x96\xf0\xed\x48\xa0\xc8\x5b\x5f\x14\x05\xfc\x82\xfd\xf2\x69\xbb\xe7\xfe\x2c\x14\x2c\x67\xc0\x88\xda\xbe\x51\x59\x71\x18\xd8\x0e\x90\x84\x1a\x8b\xe6\x6d\x9c\xf4\x53\xf1\xe6\x04\x2c\xfd\x1c\x4d\x42\x95\xca\x4e\x0e\xde\x3f\xc0\x24\x22\x32\x71\xcb\xc4\x83\xf8\x95\x1d\xcf\x47\x54\x8c\x59\x17\xab\x73\x55\x2e\xb1\x33\xe9\x47\xa6\x04\x8b\xce\xca\xf7\x32\x86\x45\x89\xff\x3a\x97\x8d\xe8\x46\x8a\x24\x0d\x86\xf4\x37\x9b\x1e\x4d\xe6\x7b\x12\x49\x8a\xdb\x24\x1c\x4f\x8d\xdb\x7b\xc7\xc0\x49\x92\x70\x26\x91\x33\x8b\x91\x42\xed\x4d\x31\x1f\x66\x51\x02\xe3\x49\x94\xb4\x3b\x67\xec\x3b\x23\x2a\x6b\xb2\x3f\xa1\xd0\xae\x1d\xff\x37\x90\x22\xee\x2c\x71\x92\xa2\x82\x42\x56\xdf\x82\x9f\x1f\xed\x8a\x39\xf9\x29\xb1\x88\x30\xa8\xcf\xcb\xc3\x52\xe4\x17\xa8\x7e\x3f\x0a\x04\x92\xee\x85\xd6\xb8\xe5\x4e\xf7\x22\x1f\x12\x24\x09\x0b\xd1\x78\xae\x13\xf0\x43\xe8\xf8\xb9\x17\x3c\x21\x49\xaa\xa5\x20\x2e\x38\xb5\xf5\x8d\x71\x3a\xe3\x86\x89\x94\x78\x49\xd8\xfb\x52\xbd\x3d\x55\xa5\x3e\xab\x69\xb7\x39\x11\x86\x22\xec\xf2\xe9\xfb\xd3\x9c\x0f\xf7\xe8\x8e\x48\x12\x5b\xbf\xbd\x73\xf1\xb7\x79\xdb\xfe\xa3\xb1\x15\xda\xaa\x6c\x32\xdd\x17\x57\x13\x15\x51\x4c\xdf\x1b\x4f\xf7\x2a\x73\xbf\xf4\x3c\x96\xcd\x50\x7d\xa1\xfb\x44\xa2\x30\x2e\xc2\x6e\xf2\x00\xd7\x4e\x12\xcd\x12\x05\x43\x55\xc6\xc7\x01\xad\xc9\x8f\x51\x81\x71\x51\xbb\x6a\xe3\x1a\x87\xf8\x1d\xaf\xea\x09\xb0\x50\x47\xbe\x87\xf6\x59\x9e\x9b\x29\x97\x9c\x24\xa0\x23\xec\x12\xf5\x5e\x70\x3b\xf1\x6b\x32\xc6\x10\x86\xfc\x96\x1d\xd4\xcd\x75\xaa\xf3\x65\x1c\x99\x18\x99\x78\x59\xa4\xbb\xec\xd7\xa5\x88\x25\x49\x0c\xc4\x48\x89\x5a\x64\x6e\x55\xb3\xeb\xe5\x40\xea\x81\xa4\x01\xe5\x88\x11\x2a\xe0\x63\x29\x8e\x27\x91\x1d\x0a\x27\x3c\x32\x3e\x59\x1a\xa4\x96\x29\x83\x24\xcb\xe3\x09\x1a\x6c\x6d\x3e\x43\x7d\xce\xdd\x8c\x61\x74\x90\xfa\xa4\x81\xb6\x7a\x9f\x9d\x4a\xdf\xb2\x12\xd2\x7f\x2b\x21\x1a\x77\xc4\x87\xd5\x6e\x71\xbb\xd8\x2d\xf6\x2f\xcf\xf7\xdd\x31\xc6\xb1\xdc\x79\xae\x64\xe6\xb0\xab\xa3\x1b\x9f\x92\x28\x44\x49\xeb\x45\x91\x1d\x41\x89\x4a\x2f\x7b\x44\x65\x4a\x55\x88\xd0\xa4\xcc\x69\x22\xec\x47\xc5\x97\x94\x25\x12\x6f\x9a\x2f\xea\x6e\xad\xb4\x70\x57\x94\x4a\x99\x8c\x59\x67\x6d\x58\xdf\xa2\xd4\x43\xf7\xe9\x30\x81\xd0\x89\xf9\xa1\xc7\x49\x67\x9d\xd1\x0d\x00\xe6\x5b\x6f\x77\xe2\x08\x48\xf8\xbc\xf9\xc4\x29\x36\x7c\x76\x69\xe4\xf2\x21\x25\xea\xd7\x01\x08\xef\x2f\x9b\x93\x8e\x8d\xd4\x47\xeb\x69\xa4\x83\x94\xfb\xeb\x75\x1d\x80\xee\x7a\x23\x43\x2d\x28\xa9\xfc\x78\x10\xc5\xe7\x1d\x74\xc1\x77\x9a\x04\x56\x30\xc4\xee\x5a\x4e\x0a\x6f\x36\xf2\x48\x53\x19\x43\xe8\x37\x01\x24\x49\x8d\x1e\x47\xaa\x12\x6c\x7d\x6c\x85\xc9\xaa\xa1\x68\x0f\x49\x45\x2c\xad\xd9\x4e\x53\x9e\xfa\xf0\xd6\x1f\x94\x31\x8f\xc7\xda\x8b\xaa\x19\x4f\x4e\xa1\x04\x42\x79\xdb\x1d\xde\x67\x08\xd3\xab\x93\x32\x45\x44\x13\x36\x06\xd6\xb6\x07\x94\x15\x87\xe7\xf6\xbb\xfc\x79\xa4\x4a\xb0\x6e\x25\xcb\xe2\x5c\xc3\x08\x86\xd6\x1e\xc3\x47\x91\x15\x59\xe3\xfc\xf2\xd7\xaa\xfc\xdf\xad\x5d\xa9\x66\xdc\xf4\x0a\x40\x63\xdd\xd4\xf1\xe5\xb6\x8b\xbc\xd5\xbd\x2f\xd5\x9b\x2d\x07\x4d\x7e\x90\x21\x0a\x17\x04\xab\x90\xeb\x8b\xae\xfa\x6b\x98\x7b\x6a\x64\x8a\x9b\xc2\x03\x14\x8d\xc8\xbf\x83\xc8\x9b\xd7\xfb\xcc\xc0\x0c\x7e\x37\x35\x9a\x29\xd4\x6e\x85\x06\xaa\x63\x56\x74\x5f\xe2\xee\x89\x08\xa2\x20\x71\x35\x89\xf5\xf1\x24\x54\xf3\x52\x1c\xdb\xb0\x02\xb4\x25\xc4\x0c\xe7\xb2\x08\x22\x16\xf6\x7e\x74\x5b\xa1\x75\x0e\x17\x12\x2a\xff\xcf\xff\x8e\xee\x8d\x20\x4a\xe3\xab\xaf\xaa\xf2\x43\xb7\xef\xf5\xaa\xd0\x03\xb0\x90\xa0\xb1\xd0\x96\xcd\x00\xba\xc6\xb5\xa3\x47\x77\xf9\x21\x89\x75\xd8\x3b\xda\xa4\x75\xc4\x41\x10\x34\x15\xcc\x45\xe3\xbf\x7b\x2f\xfa\x2f\xd1\x66\x82\xaa\x10\x4b\x9a\xed\xe3\xf4\x8b\xec\x1b\x14\xed\xeb\x36\x8d\x57\x04\x4b\x28\x32\x58\xfe\x7b\xf7\xfd\x2b\xb8\xee\x20\xd3\x12\x0c\xa2\xc8\x39\xc9\xcf\x02\x62\x45\x18\xc6\xa1\x43\x72\x6c\x4e\x56\x69\x61\xf4\xb0\x45\xc4\xad\xfb\x8f\xf2\xd2\x6d\xa8\x30\x39\xa6\x19\x88\x28\xe6\x84\xf4\xab\x08\x6e\xc0\x55\x3d\x6a\x61\x8a\x28\x11\x18\xf9\x9b\xbc\xfc\x70\x36\xd7\x7d\x4e\x27\x38\x53\xb8\xb0\x62\x33\xf8\xa1\x2b\x6f\x09\x1e\x2b\xed\x6d\x32\xaa\x4c\xdb\xf9\x38\x96\x12\x1a\xcf\x64\xc1\x53\xdb\xcf\xcd\xe1\x1d\xf2\x3d\xd9\x8b\x61\x9f\x50\x70\xad\x95\x0d\x98\x11\x34\x30\xb2\x88\xed\x86\x58\xb9\xde\xbb\xfb\xf5\xb7\xef\xbb\xfd\xe3\xcb\xc3\x4d\xd7\x36\x13\x1c\x38\x86\x6c\xbb\x4a\x68\xdc\xdb\x45\x35\xd9\xe9\x04\x37\x56\xce\x17\x95\x15\xae\xbd\x76\x97\x4b\x73\xb7\xf5\x89\x38\xb6\xc6\x97\x07\x68\x56\xbf\xa0\x52\x59\x0d\x56\x65\xe9\x16\x84\xee\xd5\xba\x89\x48\x84\x49\x44\x2f\x70\x0f\xd5\x53\x95\xfd\x39\xd9\xc5\x45\x4a\x82\xd4\x2b\x4c\x82\xe3\xc6\x4f\x87\x08\x8a\x58\x22\x28\x34\x42\x20\xe6\x23\x4c\x91\x9a\x14\x7b\x4c\x7b\x79\xfe\x6c\x03\xd1\x5d\xb9\xcc\xcb\xfa\xaf\xe3\xb4\xf1\x8c\x13\x24\xc0\xba\xe1\xb7\xb3\xa8\xb4\x70\xa4\xdb\x71\x77\x58\x08\x22\x95\xea\x20\x91\xd3\x9f\x2d\x78\x80\xb6\x5d\x3d\x21\xe9\x9d\x75\xc7\x62\xb0\xe2\xbe\x1e\x2f\x80\x55\xe7\x91\x60\xc2\xe4\x7a\x64\x94\x70\x67\xed\x94\x8b\x0a\x6c\x7d\x1f\x0d\xce\xda\xd7\x3b\x17\x57\x4a\x87\x42\x72\x6b\x65\xbe\x78\x1c\x9a\x74\x12\x21\x63\x85\x74\xa9\x4d\x01\xcd\xef\x8f\xdd\x5f\x9d\xe5\x49\x01\x1f\x9d\xee\xc9\x98\xd2\xe6\x07\x1a\x2b\x41\xfe\xad\x8b\x2c\xa6\x3d\x9e\xd9\x8d\x41\xa8\x30\xc1\xf2\x7e\x2d\x72\x68\x43\xd9\x51\xf9\x5a\x28\xc1\x11\x52\xf6\x9f\x73\xa6\xde\xb6\x65\x35\x2f\xc1\x44\x84\x26\x04\xdb\xba\xcd\xd4\xcf\x76\x66\x9a\xea\x98\xa7\x1d\x08\xec\x33\x2f\xc5\xb8\x87\x2a\x74\x12\x62\x6e\xfc\x0d\x03\xcc\xf9\x99\xa7\xb5\x41\x30\xba\xd3\xc5\xb3\x35\x30\x61\xd7\xa1\xf1\xef\x83\x94\x48\xe6\xe2\xdc\xb1\xfb\xd9\xfc\x2f\x31\x01\xc1\x32\xa4\xa8\xeb\x52\xd9\x95\x78\xda\xdb\x16\x26\xb5\xe2\x41\x8e\x7b\x03\x85\x03\x44\x87\xc1\xf4\x64\x32\x40\xf5\x3f\xab\xd0\xed\x28\x7b\xee\xa0\x0c\x74\xe8\x01\x55\x03\xd7\x85\x7a\x61\xc1\xc6\x83\x82\xa7\xa4\x31\x60\x93\x73\xb9\xf1\xbd\x01\xc9\x0c\x43\xad\x82\x73\xa1\x4b\xef\xbd\x3c\xba\x48\x19\x06\x02\xfd\x44\xb3\x93\xa9\xc7\x91\xac\x0c\x49\x84\x71\xc9\xfd\xfa\xf7\xd5\x70\x0e\xca\xd0\x89\x06\x7c\xdf\xec\x96\xcf\x7f\x3c\xed\xba\xaf\x8b\x28\x47\x6d\x87\xa7\x73\x73\x57\x56\x5f\xf2\x3a\x89\x8c\x58\x80\x9a\x89\x47\xf1\x06\xd5\xc2\x98\x2c\xcf\x44\x33\x48\xac\x64\x14\x52\x8c\xaf\xc0\xee\xa2\x1b\xf3\x7b\x76\xc2\x1a\x6d\x2f\x58\x44\x64\x94\x26\xb8\xfe\xdc\x89\xba\x41\x0b\x56\xff\x77\x05\x08\x2c\x90\x03\x75\xef\x99\x94\x50\xc6\x11\x8b\xcc\x08\x3f\xed\x95\xca\x88\x8c\x85\xc4\x77\xed\xfb\x66\xbb\xdb\x6f\xbf\x2f\x9e\x3d\xb5\x45\x26\xcc\x02\xec\xda\x9c\x0f\x6b\x0e\x8b\xaa\xd3\xd9\xb3\x42\x7b\xa6\x81\x21\x38\x5e\x26\xa1\xc0\xae\xfe\xbe\x0d\xfb\xdb\xc0\xbe\xdd\xde\x3d\x7e\x6e\x74\x87\x92\x09\x31\x66\xce\x73\x80\xc8\x24\x0e\x90\x6e\x84\x95\x36\x0f\x2a\xfb\xb2\x9d\x26\x53\x2a\x71\xce\xde\x97\x87\xcd\x11\x0e\x62\x75\x18\x15\xc5\x27\x8f\x27\xd5\xd6\x8d\xb4\x86\xe6\x02\x5b\x32\xfb\x4e\xc8\x54\x5b\x9b\x85\x6f\x79\x29\x0f\x79\x79\x10\xf2\x20\xf2\x2e\xab\x92\x29\x68\x7c\x52\xed\xfa\x3e\x0f\x5a\x18\x15\x12\xa4\x48\x42\x84\x56\xe3\x3d\x76\x57\xb0\x7b\x85\x36\xe2\xf1\xa7\x14\x82\xe2\x1a\x60\x3d\xa1\x8a\x03\xe4\x17\x4e\xd9\xc3\xc2\x83\x14\x22\xc5\x89\xbb\x7c\xdc\xed\xad\x12\x75\x77\x26\xd0\xd8\x80\x7b\xcd\x2a\xb0\x48\x85\xef\xe7\x62\x6a\x1c\x45\xa4\x0a\x42\x5c\x67\x55\x5e\x16\x50\xef\x9b\xd2\xf9\x45\xec\xcb\x02\xf6\x99\x06\x5f\x46\x92\x8a\x05\x01\x8a\xd4\xc0\x3b\x88\xdc\xa9\xce\x8e\x1e\xa0\x52\x56\xf8\xf4\x4e\xa9\xd1\xcb\x85\x1a\x54\x83\x2e\x81\x8d\x46\x26\xaf\xa6\x56\x0c\x99\x6c\x42\x7b\xba\x81\x43\xc2\x5f\xac\xfe\xe3\xb7\x1d\xe2\x10\xb3\x1a\xd9\xfe\xc4\xac\xcb\xb7\x24\x68\x83\x14\xc3\x45\x2e\xaa\x63\xbb\x06\x4e\xe3\x7e\x69\x98\xd5\x44\xe8\x81\x5d\x3f\x8a\xf2\xa3\xb8\xa6\x6f\xf3\x8f\x4e\xa3\xc2\x7f\x3e\x34\x58\x65\x3a\x9f\x0e\x95\xd0\xf0\x10\xdd\x97\x87\x4c\x4d\xbf\x24\xb2\xf6\xa7\x9d\xe0\xdb\xf2\x55\x1c\x2f\x6c\x16\x26\xd3\xce\x28\x86\xfe\xe1\x56\x21\x75\xe3\x63\x3b\x15\x70\x9e\x3a\xf6\xd0\x3f\x4b\xb9\xb5\x8c\xf7\xfa\x35\x3b\xad\xbf\x36\xd3\x27\x2a\x48\x99\x16\x3d\x6f\x60\xa8\xf7\x4c\x14\x09\x23\x22\xba\x14\xdc\x3a\xf2\x3e\xbc\x35\xdd\xe1\x44\x79\xba\xc4\x4a\x54\x05\xe8\x3d\x4a\x5c\x8d\xe7\x91\x22\x32\x45\xd9\xe5\x77\xa8\x32\xf3\x39\x74\xd3\xb9\xc6\xea\xbc\x16\xe0\xfd\x65\x0e\xae\x18\xb3\x6a\xa3\xbf\x4e\xe2\x0e\xc3\x1d\xcb\x12\xf1\x47\x05\x60\xb4\x63\x1b\x4e\x36\x47\x40\x1b\xb2\x59\x65\x26\xa2\x98\x14\xd8\xc4\xaa\xdb\xac\xf7\x41\xfc\x5a\x74\xc4\x5a\xc5\x8c\x4c\xad\x93\xb7\xa8\x31\x74\xf3\xef\xa9\x0a\x53\xad\xad\x98\x3a\xbc\x67\xa5\x33\xf0\xae\xbb\xa3\x82\x0b\xd7\x25\x5d\xd7\x56\xee\x75\x52\xc5\x56\xa1\x4a\x8d\x25\x3e\x39\xa3\xb6\x51\x1d\x5c\x45\x54\xe3\x45\x2d\xad\x29\xe6\x78\x4d\x1d\x9f\x29\xd2\x09\xee\x88\xf6\xbd\xdd\x54\x07\x31\x06\x77\x28\x4e\x09\xaa\xcd\x38\x65\xd6\xaf\xe0\x55\x8a\x73\x2b\x99\xee\x3c\xc3\x5d\x99\x69\x7c\xc3\x78\x62\xd0\x88\xd1\x64\x85\xbe\xcb\xcb\xb2\xfa\x71\x31\x1b\xb8\x24\xa1\xf4\x80\xb1\x4d\xf3\x0a\x55\x9b\xa2\xcc\x2e\xb2\x2a\x0e\x24\x4d\x7b\xa3\x9a\xa7\xf2\xe3\x2f\x24\x58\xa7\x9f\x67\x29\xbe\xe9\x59\xd1\xcf\x81\xd8\x04\xd8\x8b\x5b\x68\x8d\xcd\x71\xed\x6b\x6c\x57\x8c\xfb\x27\xbf\x30\x09\x58\xea\x5a\xb2\xce\x53\xea\x6b\xfc\xac\x4a\x43\x82\x12\xa2\xc8\x9e\xdb\x42\xa1\x7f\x82\xfc\x96\x99\xe6\x8a\x79\x93\xff\x54\x24\x31\x3f\x70\x02\xf4\xaf\x15\xd4\xaf\x65\xae\x1f\xc1\x8a\xa5\xa2\x44\xc2\xe4\x13\x4a\x09\x0b\x16\x2d\x4f\x62\x84\xc0\x54\xc2\x21\xf0\xee\xb2\xfc\x58\xe6\xff\x3e\x9f\x54\xd6\xeb\xbc\x90\x36\x9e\xe5\x66\x04\xe4\xda\x93\x20\xd8\xdb\x77\xbe\x5d\xf6\x8f\x33\x19\xb4\x12\x89\x8c\xe2\x0e\x49\x6d\x65\xc2\xce\x85\x9a\xad\x5b\x29\x21\x02\xd5\xcb\xba\x2f\x0a\x8d\xc5\xf7\x4b\x78\xb3\x92\x01\x44\x8e\xdb\xf1\xbb\x77\x99\x24\x4a\x46\x11\x56\xc8\x0a\xf8\x58\x54\x4d\xa6\x72\x98\xb7\x8a\x1e\x7f\xa9\x14\x09\x7a\x53\xee\x5e\x6e\x56\xcb\xcd\xfa\x51\x8d\xf3\x64\xa5\x23\x83\x93\xff\xe9\x79\xf3\xcf\xd5\x72\xb7\x79\x5a\x3d\x2f\x76\xeb\xcd\xe3\x7e\xfb\xf2\xf4\x74\xff\x47\x37\x4c\x84\xbc\x7f\x89\x9c\x6a\xcf\x5d\x55\x1e\xad\x46\xc0\xf0\xea\x21\xb5\xde\xae\xf5\xb9\xdd\x6e\x49\xb0\x7d\x43\xb6\x3f\x08\x2b\x5c\x3c\x7e\x60\x26\x90\x4c\x76\x89\xd9\x22\xcf\x6d\x11\xdc\xaf\x14\x3a\x08\xac\xcf\xf3\x31\x2b\x2c\xbb\x00\xcf\x31\x3c\x85\x0e\x98\x26\xc4\x13\xb2\x72\x54\x6f\x9d\xbd\xff\x3a\x88\x83\x08\xf7\x1a\x2b\xfd\xbb\x3d\x41\xa1\x47\xd1\x8d\x1b\x47\x9c\xcd\xf5\x88\xfd\xdb\x1d\xb3\xe5\x32\x25\xf2\xfc\x5c\x43\x25\x66\xbf\x89\x80\x15\xe0\xee\x95\xae\x5e\x6c\x35\xaf\xeb\x80\x69\xaa\x19\x16\x31\xb7\x6d\x32\x91\x3f\x80\xce\x44\x77\xc8\xf0\x30\xed\x35\xf4\xff\x8e\x2d\x08\xd1\x2c\x48\xf1\xc2\x3e\xca\xfc\x6d\x5d\x78\x5a\x8c\x66\x11\xc1\xe2\xdd\x53\x55\x9e\x75\x69\xfe\x28\xcf\xd5\x60\xd6\xeb\x10\x0c\x76\xc6\xff\xf8\xee\x89\xa3\x3a\x4a\x13\x0c\x78\xbc\x7c\xd3\xff\xae\xf2\xa8\x23\x48\xf0\x81\x55\x65\x9e\xdf\x22\x2b\x69\x7a\x5c\x85\xb6\xd7\x0e\x76\xe9\xf1\xdf\xcb\x85\xb2\x76\x76\x5e\xa9\x23\x6b\x5e\xdb\x88\x6d\x0e\x3d\x32\x5c\xbe\x35\x07\xc2\xf9\x18\x37\x74\x65\xf5\xd6\x31\x57\x09\x0c\x24\x77\x6b\xa7\x8b\x7e\x0b\xb5\xfa\x9a\x3a\xaf\x63\x05\x28\x28\xb9\x6a\x5e\xb1\xcf\x38\x31\x2b\xf7\xa3\x8c\xc0\xbd\x55\x67\xf5\x7f\xce\x22\xcf\xcc\xe7\xf7\xf2\x04\xe6\x9c\x4f\xc6\x25\x24\x46\x98\x90\x63\xef\x4f\x8e\xa6\xa1\xee\x35\x49\x6d\xa4\xbf\x6d\xa3\xeb\xf1\xbe\xa5\x53\x4e\x31\x9e\x7c\x86\xd3\xb9\xb1\xac\x9c\x49\x56\xd0\xd1\x29\xfc\x66\xa8\x45\x48\xb0\x9d\x80\xe1\xe0\x67\x1b\x1d\x8c\xe3\x4c\x2d\x42\xe3\xc5\x1a\xb1\x16\x85\x42\x1a\x74\x72\x81\x22\xe2\x5e\x92\xce\x81\x02\x7f\x42\xf6\x4f\xa1\xde\x4e\xe5\xf4\x65\x12\x0a\x88\x95\x40\xfd\xc8\x60\x28\x72\x4d\xb4\xa4\x01\xc2\x91\xf3\xf6\x1d\xdc\x65\x50\x91\xee\x48\x02\x9e\xb4\xef\x3c\x58\x6c\x47\xeb\xf1\x7c\xb4\xca\x1d\x75\x3f\xd2\x02\x06\x8f\x59\x61\x71\xf5\xc3\x45\x7a\x02\x39\x4e\xbc\x7c\x5a\x2f\xa4\xd6\x87\xab\x5a\x2a\x3a\x90\x96\xbb\x11\xc5\xdb\xe4\x97\xa8\xd8\xfa\x82\x6e\x4e\x0d\xe8\xcd\xf9\x8a\x76\x80\x56\xc2\x08\x36\x92\xeb\xeb\x9f\x8f\x8b\x61\x26\xe7\x35\x0c\x43\xa5\x47\xf8\x70\x5a\x81\xb3\x59\x52\x32\x99\xcb\x10\x50\x83\xe9\x25\xfc\x9a\x32\x80\x35\xb0\x98\x19\x47\x86\xe8\x9b\x8a\xa3\xc9\x63\xc2\x08\x29\x07\x3f\xb1\x32\x3f\x35\x81\x20\xda\x44\x16\x32\xdc\x75\x0a\x2d\xfc\x7a\xfa\x3a\x9b\xd8\xf0\xc0\x2b\x95\xd4\x4d\x79\x5a\x2f\x37\x83\x0a\x05\x04\x31\x93\xbc\xf3\x8e\xc7\x6f\xb0\x01\xf4\x6f\x7e\x40\x4a\xd3\x74\xa0\x63\x51\x4e\xd2\x53\x57\x78\x46\x30\x74\x64\xe5\x88\xf7\xb7\xab\xa7\xcd\x76\xed\x57\x2c\x20\x26\x45\x98\x08\xfa\x95\xed\xfa\xb6\x7c\xd8\x23\xcd\x59\x47\xf8\x0c\xdd\xf3\x06\x9a\x46\xb8\x1b\x28\x27\x16\xb0\x13\xf5\xe4\x89\x03\x55\x4a\x7b\x6d\xa0\xdb\xea\xec\x7d\xd5\x09\x30\x93\x12\xcb\xf7\x73\x5c\xc5\xec\xcf\xae\x63\x07\x21\x67\x28\xb7\x7c\x7c\x3f\xdd\x8b\x73\xa1\x5e\xd1\x7a\xbf\x3b\x68\x1c\xa2\xdd\x01\x2f\x68\x77\x24\xb6\x3b\x5d\x3b\xf3\xb0\x0f\x30\x22\xaf\x43\xa8\x63\xff\xca\x59\xe4\x70\x55\x4e\x21\x35\x10\xb5\x79\x8c\x4f\x24\xcb\xbc\x33\xd6\x20\x10\x2b\xe6\x99\xcf\xdf\xc4\x11\x6a\x67\x23\x92\xe9\x2b\x80\x62\x48\x22\x65\xa5\x80\x10\xd1\x56\x95\x66\xba\x4b\x42\xe2\x04\x4b\x0f\xd0\x60\x1f\xef\xcb\xe5\x13\x92\x58\xd1\xa4\xdb\xe7\x77\xe5\xcd\x79\xb0\xcb\x43\x12\x1b\x44\x38\xde\x97\x87\xce\x63\xed\xcb\x6a\x5c\xfb\x09\x9c\x77\xfb\x76\x29\xcf\xfe\x6a\x74\x1a\x50\x04\x35\xf5\xa9\xec\x50\xba\x61\x76\x5b\x81\x94\x71\x44\xec\x88\xa6\x3c\x66\x0a\x8d\x7e\xf6\x3d\x9f\x6c\x30\xb7\xfc\xff\x27\xff\xc3\xff\xef\x30\x19\xbb\xfa\x5f\x3b\x98\xf6\x4b\x50\xe4\xe7\x64\x0a\x56\xc1\x08\x0a\x55\xea\x0b\xe2\xd4\xf8\x8e\x8a\x40\x60\xe8\xb9\xdb\xfc\xf8\xb1\xf0\x37\x52\x44\x10\x74\xdd\xe2\xbd\x99\x52\x57\x66\x53\x47\xf7\x51\x19\x19\xec\xb1\xf9\x38\xd6\x9f\x52\x6a\xc9\x5d\xb9\xbf\x13\xcf\x5a\x5c\xb9\x26\x45\xa8\xb2\x7a\x2c\x27\x3b\xc3\x46\x53\x58\xc7\x46\x39\x90\xfa\x8d\x38\x78\x38\xed\x35\x0c\x2f\x68\xad\xf0\x8b\xf7\x95\x98\x58\xee\x11\x80\x94\x26\x61\x87\x9e\xbe\xb0\xda\x6b\x07\x08\x66\xdb\x32\x4f\x15\xac\x55\x39\x68\xca\x81\x09\x6d\x77\x02\xd1\x07\x7b\x6f\x56\xd0\x4d\x46\xa3\x05\x7e\xaf\xc8\x2a\xb1\x1d\xce\xc4\xd9\x98\xc2\x04\xc2\x3a\x04\x3c\xc2\xaf\x72\xf8\x73\x4d\xa0\x18\xd6\x59\x0f\xe2\x08\xb7\xe7\x51\xd3\xcf\x10\x92\xa0\x46\x90\x12\x55\x71\x3e\x4e\xeb\xc8\x86\x70\x8e\xa4\xb8\xac\x78\x6f\x93\xab\x2d\xea\x45\x0e\x14\x19\x89\xa1\x44\x61\x59\x47\x5c\x01\x60\x8f\xaf\x31\x4c\xd2\xa8\xd3\x70\xf5\xe5\x6e\x7f\x4c\xa4\xd2\x85\xcf\xfb\x53\x05\xfb\xb7\x4f\xb5\xc7\xbe\xf4\x5e\x43\x51\x1e\x2d\x90\x71\x7c\xfb\x4d\x44\x04\x42\xdb\xdb\xb9\x60\x1d\xfc\x3f\x9f\xdb\x0d\xd3\x1f\x8e\x39\x4a\x1e\xbc\x96\x55\x0d\x75\x6f\xb5\x3e\x39\x49\x9c\x58\xf2\x45\x79\xdc\x1b\x00\x5b\x01\x9a\x77\x18\xfe\x9a\x93\x6a\x22\x90\xb8\xdd\xa9\xb2\x78\x47\x5a\xd3\x75\xa6\x44\x3b\x16\x7b\xcd\xfb\x93\x55\x00\x5a\xe8\x36\x9f\x9c\x8f\x17\x0d\x0f\x23\xd4\xd2\x59\x1c\x0e\xd9\xb9\x38\x64\x8f\x70\x28\xff\xcc\x44\x31\xf0\x81\xe9\xf7\x3a\xc3\xd3\x14\xd3\xb6\xf7\xb2\x81\xed\xfb\x29\xa0\x83\x8d\xd0\xc4\x3a\x40\xd0\xdd\xd3\xf3\x6a\x8f\x9e\xdf\xab\x47\x4f\xca\x36\x31\x28\xff\x78\xac\x7b\x81\x3f\x90\x50\x8d\xab\xdc\x09\x7b\x48\x1e\x4d\x31\x7a\x7c\x09\x4f\x7c\x6b\xfc\xa9\xac\x1a\x53\xe6\x59\xb9\x1b\x40\x8f\x4c\x12\xa7\x41\x67\xb3\xfd\xab\xb9\x2d\xcf\x17\x80\x30\x93\xa4\x94\x0e\x3d\x95\x87\x18\xa4\xd1\xaa\xd8\x8e\xc4\x8e\x83\x63\xf3\xac\x9a\x57\x14\x35\x19\xdf\x36\x11\x07\x60\x05\xc3\x34\x56\x85\x06\x55\x71\x23\x62\x6e\x55\xed\x9b\x46\x5c\x7a\xf4\x74\x83\x12\x2c\x3d\x2e\x0e\x55\x86\xa1\xc9\xbd\x90\x90\xaf\xbb\x1e\x80\x11\x09\x45\x8c\xb3\xbf\xe0\x36\x13\xbd\xc3\x3e\xf0\x5f\xbc\x09\x22\xb1\x2a\x00\x7d\x9a\x7f\x65\x9e\x88\x04\x70\x85\xf1\x30\xba\x71\x79\xca\xc8\xc0\xe2\xca\x1e\x9a\x9d\x90\xe5\x68\x9d\x33\x12\x04\xc2\x5e\x97\x2f\xcb\x97\x7f\xf9\x3f\x2a\xa1\xb1\xe2\xb2\x87\xff\x9c\xb3\xd3\xcb\x69\x53\x5c\x29\xc3\x1b\x25\x13\x5c\x7f\xfe\x28\xcf\xbb\xb3\xec\x6e\x9c\x66\xda\x72\xc1\x8e\x50\x1d\xa0\x50\x9f\x5b\x68\x6e\x2d\xea\x76\xb6\x48\x63\x34\x67\xc8\x5b\x58\xdd\xbe\xec\x7f\xfc\xb1\xdc\xa3\x76\x69\x77\x36\x19\xca\xb0\xdb\x8f\x07\x8e\x4d\xee\xb8\x49\x13\x43\x3d\x1d\xa6\x11\xd6\x21\xaf\x5f\x7e\x8c\x06\x25\xbb\x92\xe8\x13\x54\xbb\x36\xb9\x7f\x75\x17\x4b\x83\x20\xb2\xca\x6d\x15\x9c\x72\xa1\x60\x04\x0e\x1e\x5d\x26\x0d\x02\x05\xe0\xba\x0e\x37\x65\x5d\xff\x14\x45\x21\x96\xd5\x27\xea\x6c\x1b\x31\xe1\x4d\xd3\x80\x48\x48\x07\x86\xbc\x83\x1b\x4f\x03\xa2\x43\xcc\x04\x71\x6b\xb9\x0a\x5b\x9b\x07\x38\xf8\x9f\x4e\x03\x4a\x8c\xcf\x27\x17\x76\x92\x5e\x91\xc7\xf7\xe3\xa9\x66\x56\xac\xaf\xac\xe0\x11\x3e\xa6\x46\x79\xf3\x4d\x9d\xe9\x49\xc0\x46\x7f\xbe\x3c\xf3\x24\xaa\x66\x53\x8c\xab\x25\x34\x60\x24\xc4\x99\x85\x66\x14\xbf\x75\x01\x48\xd0\x67\x3a\x83\xb8\x84\xf7\x01\x86\x0b\x7a\x69\xc0\xc2\x04\x01\x96\xb6\xe6\xfa\x8c\x6a\xc7\x77\x65\xd5\xb1\xcf\xdc\xfc\xa6\x01\x33\x56\xe7\x31\x07\x61\x06\xe1\x00\x0d\xc2\x28\x8c\x5c\xb5\xbb\x8d\xd7\x8b\x2b\x2b\x45\x3b\x50\x46\x3e\xd7\x16\xfa\x00\x17\x92\x23\x34\x08\xe3\x28\x71\x54\x73\xa8\x9a\xd5\x7f\xbe\xec\x66\xd1\x20\x54\x40\x86\xbd\xe4\xd5\xaf\xa6\x12\x5f\x46\x7e\x34\x88\xb8\xc2\x4d\x06\xc7\xde\x8c\x4a\x82\x34\x88\x52\xa3\x8d\x23\xd1\x63\x56\x62\x05\xb0\x66\xeb\xc8\x34\xe0\x69\x8c\xf7\xce\xf1\xf1\xba\x6d\x6d\xd8\x18\xa7\x41\x12\x8b\x30\xec\x51\xa3\x5e\x62\x72\x07\xf5\x65\x19\x63\xf4\x3d\xee\xf3\xa9\x34\xd4\x79\x72\x3e\xc0\x11\x66\xf8\x6d\x34\x10\xa1\x54\xda\xb1\x6c\xde\xbb\x4e\x91\xb5\xdb\x29\x51\xdb\x32\x7b\xc7\x86\x63\x0e\xdb\xec\x50\xa0\xb4\xdb\x55\x66\xe7\xf5\x98\x90\x06\x22\x12\x48\x18\xc1\x78\xe0\xae\x3c\x57\xcd\xeb\x4f\x00\xe7\x28\xed\x7f\xb1\x48\xad\x60\xc0\x0e\xea\xb2\x2a\xbb\xbf\x2a\x15\xf7\xca\xdb\xf8\x36\xbf\xfb\x5a\x26\x0d\x64\xac\x59\x67\x29\xd0\xee\x20\xee\x37\xec\x32\xa8\x96\xae\x12\x9e\x4c\x1e\xa5\x94\x16\x6b\xf5\x6c\x7f\x35\xba\x3f\xed\xa0\x10\x7e\x57\xa0\x81\x54\xdc\x4a\x73\x9d\x9b\xd2\x96\x02\x27\x8b\x87\x54\x80\x56\x75\x79\xf9\xb1\xcb\x8e\x80\x84\xe1\x81\xa4\x32\x0d\x14\xd7\xcc\x75\x90\x1e\xac\x0c\x1c\xfa\xd5\xf8\xa3\x0a\xb0\xa3\x7b\x72\x7d\x75\xff\x67\xa3\x90\x14\x72\x12\x9f\xa0\x3b\x58\xe0\xcb\xf6\xd6\x0f\xd0\x2c\x42\x28\xc5\x12\xf2\xdc\x33\x2d\x07\xd3\x50\xab\x00\xc9\x9b\x07\xf4\x67\xf0\xe2\xa4\xdd\x51\xe0\xe0\x5a\x05\x95\xf5\xa6\xba\xeb\x5b\x29\x34\x00\xa2\xf1\x9a\x5c\x73\xa0\x2a\x7f\x7d\x5e\xa9\xa7\xd3\x00\x98\x25\x17\xf8\x36\xfd\x42\x8b\x53\x03\xd5\x8d\xa8\xe7\xd9\x69\x34\x80\x28\x14\xbe\x14\xfa\x7d\x67\x1b\x93\xf5\x50\x34\x96\x06\xc6\x70\x84\x89\x1b\x68\xd4\xab\xd7\xf5\x17\x4d\x59\xbf\x66\xdb\xa6\x8b\xba\x29\x09\x48\x14\x78\xdf\xd1\xb7\x76\xac\xe5\x6d\xcf\xb8\xb8\x51\x42\x82\x80\xe9\xde\x9e\x65\x63\x0c\x46\x01\x1d\x2c\x70\x6e\xe3\xa4\x84\xa4\x2a\x09\x7a\xe3\xd6\x67\x10\xf9\xf2\x4a\x57\x85\x12\x4a\x34\xc6\x63\x1e\xb4\xbe\x28\x3e\xfd\x95\xb2\x40\x63\x7b\xd1\x82\x33\x76\x20\x8e\xa3\x57\x9c\x30\xc2\xd1\x6c\xef\x58\x56\x4d\xdf\x77\xf5\x07\x25\x20\x7d\xb2\xeb\x67\x96\x9d\x7e\xda\x74\x24\x58\x77\x60\xd7\xd7\xc1\xb7\x7d\xb2\x3f\xcd\xff\xce\x88\x51\xec\x2f\x6d\xc5\x6b\x36\x5a\xd0\x48\x14\x59\xd0\x1b\x7a\x97\x8a\x7a\x44\xbb\x99\x9c\x84\x07\x89\xb4\x16\x19\x56\xdc\x7a\x78\x1a\x1e\xc6\x56\x5e\xc5\x3e\x4d\x5b\xb5\xea\x0c\xe4\x29\xe1\xd2\x20\xd5\x74\xeb\xca\xa8\xc3\x1d\xe4\xaf\xf0\x5a\x94\xc4\x34\xc0\xb3\xe7\x60\x1a\xce\xc6\x5b\x02\x89\x53\x69\x2b\xb4\xfe\xbb\x12\x1a\x23\x73\xe0\x5c\x1c\xb3\xa2\x19\x5b\x75\x53\x92\x44\xc4\x23\xdb\x2a\x30\xdd\x5f\x63\x40\x3a\x18\x58\xa1\x21\xfb\xd6\xd8\x0f\xb6\x4f\xb3\x1b\x96\x10\x24\x7e\x2c\x9f\x37\x3f\x6f\xf7\x3f\x17\xbf\xaf\xd8\x48\x2d\x89\x92\x54\x08\x6c\x2d\x7c\x83\xc6\xca\xc4\xac\x76\xdf\x47\x12\x8e\x94\xa4\xd2\x92\x69\x2a\x90\xa2\x81\x4d\x01\x77\x50\x1c\xcf\x7b\x7f\x58\x84\x56\xfd\xcd\x47\xf0\x68\x6e\xdd\x1d\x14\x02\x11\x2b\x7b\xf4\xe2\xcd\x4e\x23\x40\xd3\xe4\x79\x09\x95\xe0\x7d\x58\xbc\x8b\x06\xd4\xeb\xe8\x79\xc9\xc0\x1a\xd0\x3b\x0a\x21\x2e\x23\x0f\x59\x31\xc2\x22\x8e\xcf\x26\x39\xf3\x10\xa3\x47\xf8\xc0\x69\xe2\x8f\xa4\x1a\x41\x20\xc7\xbd\x5d\x23\xfa\x54\x82\x12\x09\x21\x42\x37\x97\x37\x0f\xbb\xd1\x05\xa8\xd0\x8a\xd4\x65\x6d\x28\x78\xcc\x9a\xe6\x8a\x42\x1d\x25\x40\x29\x66\xcb\xc3\x6b\x1b\xfa\x64\x4c\xde\x11\xc3\x62\x64\x47\x38\x4d\x4e\xff\x7d\x26\xb4\x17\xd2\xee\x1c\xae\x40\x3c\xde\x32\x26\x37\xcf\x24\xd6\xd6\xff\x00\xcd\xbe\x4d\xc7\xdb\x7c\xb3\x9b\x43\x46\xa7\xc8\xb3\xdf\x97\x1f\x57\xda\xbe\x94\x06\x54\xe0\x8c\xff\xb7\x05\x4a\xb8\xbf\x12\x12\x61\x45\x78\xf7\x73\xb3\xbf\x5d\xfc\xb1\xed\xfe\x1e\x13\x7c\x0d\x4d\x59\xb5\x6f\x4e\xcf\x87\xe9\x4f\x48\x62\x8d\x38\xda\x76\xcf\xf0\x7a\x04\x94\x92\x34\x46\x16\xe4\x87\xed\x8e\x6e\x0a\x85\x0d\xf7\x01\xe0\x94\x52\xa2\x23\xed\x96\xe4\xdb\xf3\x1b\x3c\x66\xea\x6d\x5a\xdd\xa5\x94\xca\x00\x55\x47\x11\xd5\xdd\x3e\x94\x27\xf1\x39\xda\xb5\x29\xa3\x76\x4f\xf2\xeb\xd4\xcd\x50\x10\x73\xf4\x10\x28\x63\xd6\xa3\xbe\x3e\x8a\xaa\xb9\x2d\x7b\x1b\x4f\x57\x3b\xa7\x94\xc9\x08\x35\x1e\x94\xc8\x15\x42\xf3\x66\x0a\xdd\x94\x32\x25\xb1\x84\xb9\xd0\xfa\x26\xbb\xa4\x1d\x5d\x42\x02\x29\x65\xa0\xbb\xec\x16\x9c\x93\xc8\xe4\xa4\xc6\xfa\x6b\xbf\x6c\x57\xcf\xfb\x6f\x8b\x87\xd5\xfe\xe7\x7a\xf7\xdd\xba\x69\x4d\x86\x7a\x95\x96\x4c\x95\x1b\x87\xfe\xf5\x77\x23\x4c\x2d\xa5\xc0\xe2\xe5\xdb\x48\xaa\x97\x65\xe8\x25\xe3\xa7\x3f\x3b\x52\x11\x26\xc3\x28\x2c\x3c\x7c\x21\x68\x04\x56\x4d\x60\xf7\xb8\x7c\xf4\x7f\xe3\x82\x48\x3e\xa2\x71\x3b\x97\xab\xf1\xdd\xe6\x4a\x83\x72\x45\xe7\x8d\x31\x88\x53\xfd\x2a\xa7\xa5\x94\x83\xc6\x90\x51\xda\x95\x69\x63\x90\xb6\x33\x9b\xd7\x52\x1a\xcb\x08\x8d\x53\x56\xbb\xef\x43\x2d\xca\xf1\xa0\x84\x87\xd8\x59\x2a\xf3\xe6\xd3\xb3\xfa\x28\x4d\x84\x45\x6e\xfb\x2d\xf3\xb7\xcb\xf6\x04\xf1\xd7\x94\x68\x8e\x7c\xb6\x02\x7e\x39\x69\xa1\x61\x9b\x89\xd2\x04\x14\xe6\x9f\x68\x7c\x39\x5a\x51\x69\xca\x12\xa4\x20\x62\x77\xf0\x41\x14\xe2\xd0\xbf\x71\x69\x14\x29\xde\x73\xf1\x3f\xaf\x82\x91\xfe\x4e\xb3\x92\xd2\x34\x89\x10\xc7\xf0\x6b\xfd\x74\xb7\xb5\x4f\xfc\x07\xf8\x38\x80\x0a\x26\x4c\x62\x39\x9b\xa8\x5d\x31\xda\x7a\xa8\xe0\x76\x17\x16\x5a\x2f\x45\xa1\xb3\x91\x3b\xf0\x4c\xd4\x4e\x45\x9a\xc4\x6e\x2e\x7f\xff\xb9\x9c\x6b\x51\x53\x2a\x44\x18\x0b\x77\x5b\x3a\xd3\xdd\xe5\xa5\x36\xdb\xe4\x53\x3a\x22\x89\x6f\xc2\x3c\xc2\xaf\xe6\xc9\x3a\xab\xf7\x75\x17\x4a\x05\x30\xf4\x76\xb9\xab\xc4\x11\xfa\x16\x70\xbb\x52\xd8\x0c\xc9\x02\x93\x66\x5f\xca\xe4\x02\x63\x44\xa9\x64\x46\x86\x63\x03\xf0\xdf\x46\xc7\xd3\x10\xd3\xfa\xbb\xb2\x52\xb0\xac\x3e\x4f\x4d\xd9\xcb\x01\x8c\xbe\x5f\x08\x5c\x9b\x8b\xb2\xf8\x6f\xa8\x26\x29\x22\x95\x5a\x60\x1e\x0a\xef\x50\x34\xbf\x43\xd1\x85\xea\x54\x71\x42\x13\x4f\x27\x47\xff\xfd\xf1\x4d\xd1\x24\xb2\x9e\x1f\x22\x87\x55\xa1\xa9\xff\x1c\x24\x41\xc8\xbd\xad\x43\xa1\xde\x3e\x07\xb2\xef\x94\x82\x4e\x07\x70\xef\x6d\x73\xd6\x50\x34\xf3\x38\x0b\x87\xfd\xb1\xd8\x5d\xf7\x71\x93\x68\x44\xe9\xc9\xf3\xe7\x3e\x2f\xdf\x01\x73\x90\xab\x9f\xee\x7f\xa6\x91\x16\x33\xbe\xfc\xe7\xbf\x46\xeb\x88\x51\x76\x37\x3e\xd7\xb0\x6e\xe0\xd8\xf1\xda\xae\x24\x6f\xf6\x53\x2c\x08\x02\x6f\x91\x7b\x23\xd4\xdb\x30\x7f\x67\x01\xd1\x58\x00\xab\xcf\xf2\xc2\x82\x61\x72\x16\x4e\x51\x6d\xa3\x24\xe3\x77\x97\x05\xda\x48\xd7\x11\x58\xed\xbe\xb7\x79\xce\xe4\x83\x40\x6d\x61\x17\x31\xc1\x7f\xf5\x6a\xba\x0f\x11\x22\x10\x1b\xfc\x24\x3e\x4f\x50\xc9\x1e\x7f\x47\x19\x61\x1a\x55\x86\xf0\x25\xdc\x54\x99\x7a\x15\xb9\xea\xa2\x51\x46\xa4\x31\x41\x27\x4f\xee\x8b\xa7\x94\x51\xea\x14\xd2\x7b\x57\xe9\x9f\x59\xa1\xcb\x8f\xee\x87\x50\x9e\x06\xa9\xf7\xef\x38\x57\xf5\x15\x40\xcd\xe5\x32\xe7\x17\xbb\xe1\x9f\xdc\x39\x19\xb1\x7e\x22\x8b\x36\x39\x18\x3e\x4b\xc6\x28\x71\x3c\x71\x55\x16\xda\xe6\xa7\xbd\x10\x04\x65\x0c\x00\x15\xc6\x6d\xa8\x78\x97\xe5\xb9\x35\x40\xb9\xd0\x53\x1d\x06\x54\x2c\xe2\x80\x5a\xfc\xaf\xa5\x17\x06\xdb\x14\x03\xf3\x0b\xca\xa2\xc4\x2e\x29\x42\xeb\x6d\x79\xae\x14\xdc\x95\x55\xfb\xb5\xb8\xb1\x4c\x9f\x89\x07\x23\x75\x3b\x30\x8b\x94\x70\x06\x3e\xef\x20\x72\x47\x55\x1b\x3f\x3a\xee\xdc\x69\xbb\x9a\x6a\x59\x59\xe6\xb3\xbf\x84\x98\x4b\x20\x4e\xf2\xed\x61\xa6\xba\x7f\xee\x11\xbb\x94\x25\xb1\xc4\x6d\xd2\xc1\x5e\xbe\x97\xe7\x2e\x60\x66\x89\x8a\x41\x0f\xa4\x46\xdb\x6d\x03\x59\x55\x5f\xef\x90\x2c\xd1\x60\x3a\xb1\x4d\x0c\xc1\xf5\x78\xd3\x61\x69\x48\xa4\x77\xeb\x75\x78\xc9\xb1\x29\x47\x3b\x84\xe2\x0a\x7a\x5f\x36\x6d\x40\x07\xe7\x0b\x51\xf5\xcb\x48\x66\xf4\xa8\x52\xa5\x50\xc7\x01\x75\x7f\xfd\x59\x05\x89\x90\x96\x9a\x97\x87\xad\x95\xcf\x1a\x02\xc2\xfc\x7e\xca\x44\x98\x12\xee\x39\x8f\x19\xfa\xf1\x9c\x4f\xdd\x39\xe2\x18\x31\x1b\xae\x19\xb4\x28\xf4\xcd\x00\x03\x7f\x51\xe0\xe9\x1f\xae\x48\x42\xdf\x78\xe8\xb9\xa3\xc3\x39\xa9\xa2\x80\xb3\xae\x16\x6a\x83\x05\x1b\x85\xcd\x86\xf7\x4c\x89\x4e\xd0\xde\xf9\x8c\x3a\x4d\xf9\xc5\x6f\xa3\x07\xa2\xa4\xd0\xde\x7c\xbf\x7a\xbb\xf0\x04\xa6\x4c\x07\x69\xea\x4e\x74\x6b\x55\x88\xd7\xb7\xb3\x5a\x37\xed\x50\x49\x6d\xd0\x0c\x6f\x74\xb4\xd6\x69\x11\x47\x43\xb5\xad\x6e\xc1\x9b\x0d\x8d\x58\xbb\x96\x18\xdb\x51\x5d\x3d\x6e\xf7\x8f\x9b\xdd\xfe\x6e\xf3\xbc\xef\xcd\x8e\x29\x03\x46\x69\x3a\x60\xf3\x0e\xf7\x0e\x06\x42\x60\xd1\x7b\x7b\x2c\x0f\xa3\x37\x1f\x64\x60\x7b\x4e\x1d\x98\xe2\x6e\xb5\xa2\xbd\xd3\x96\x1f\x67\x22\x08\x53\x5f\x15\x43\xcf\xa1\xaf\xab\x9b\xcc\x70\x62\xac\x49\x89\x2b\xbc\x6c\xaa\x27\x51\x37\xb3\xaf\x84\xff\x88\x4a\x71\x47\xd9\x23\xd1\xb6\x2a\xee\x00\x16\x72\x8c\xea\xa0\x21\x49\x14\xe2\x1b\xd0\x3e\xa8\xfe\xf9\x0a\xc5\x23\x34\x1f\x65\xf5\x86\x64\x8c\x57\x2c\xd9\xac\xeb\x1b\xe1\xd7\xda\x90\x28\x82\x42\xc1\x1a\xaa\xec\x1d\x06\x78\xd7\xf9\x0b\x0f\x09\xa4\xf6\x8e\x1c\xa0\x79\x19\xc3\x18\x68\x48\x03\xa9\x3d\xff\xe5\xa3\x4d\x26\xab\x9b\xf2\x62\x8c\x36\xd8\xfd\x7e\xc8\x2a\xa1\x72\xd8\x41\x3e\xc3\x2c\xa5\x21\x35\x52\xba\xe2\xd9\xf7\xf3\x51\x8c\x65\x90\xdc\x98\x30\x88\xb0\x7c\x67\x8b\xea\xd6\xf9\xa7\xeb\xd3\x5f\x5e\x7a\x48\x43\x14\xcf\xfd\xfd\x24\x7e\x8d\x49\x87\x34\x0c\xa3\x14\xd3\xd5\x4a\xbc\x9d\x0f\xa5\xf3\x5a\x1c\xef\x9e\x61\x98\x2a\xd2\x17\xec\xb6\xff\xb9\xce\xe8\x9b\x7c\xaf\x81\x24\xf5\x90\xe1\x4e\xa1\xfb\xcb\x04\x05\x6b\xf5\x74\x1c\xdb\x25\x53\x68\xaf\x1f\x1a\x5b\xb4\xbe\x8d\xe7\xfe\x7b\x7b\x15\x33\x30\xbe\x2a\x4e\x18\x88\xae\xbb\x88\x1b\x16\xf6\x05\xae\x7e\x7c\xfc\x18\x39\x57\xd2\x35\xba\x45\x8e\x21\xf4\xa2\x28\xca\x73\xe1\x18\x3f\x93\xef\x8a\x03\xac\x84\xae\x9a\xd7\x5d\x79\x15\x84\x47\x43\xae\x35\xae\xb3\x99\x2a\xef\xb2\x22\xab\x5f\x07\x2b\x5a\xc8\x4d\x8c\x78\x34\x6b\x06\xaa\xb5\x4f\x30\x66\xdf\x96\x30\x16\x14\x7a\xb9\xec\xdf\xcb\xfc\x3c\x51\x53\xa1\x61\x22\x43\xe6\x00\x73\xcb\xe5\xf7\x3d\xe8\xac\xd9\x93\x68\x94\x8e\x87\x29\xd7\x51\xdf\x2e\xfb\x09\xd9\xb3\xc8\x3a\xb0\x3c\x0d\xd3\x54\xa6\x89\x47\xd8\x23\x85\x14\x8a\x06\x8d\x30\xc6\xcf\x28\x15\x51\xec\xbe\x6a\x07\xd5\xd1\x17\x62\xc7\xd7\x23\x88\xad\x5e\x6a\x10\x56\xfe\xa6\x86\x07\xf1\x36\x2d\xb1\x86\x22\xb2\x26\x0f\x98\xff\x1f\xcf\x97\x77\x51\x86\x61\x60\xf1\x65\xc7\xcc\x6f\x89\x70\x09\xb4\x19\x9f\x55\xc6\x56\x27\xd9\xfd\xf5\x1e\xea\xb7\xcc\x6f\xa0\xa1\x62\x1c\x9b\xb6\x26\x3f\xd7\xaf\xab\x4a\x74\x7f\xd7\xda\x1b\x2e\x2c\x45\xd5\x38\xdf\x95\xf1\x89\x95\xa1\xa8\x7b\xa3\xf2\xb2\x06\x27\xd9\x3c\xbe\x5e\x93\x30\x7c\xaf\x84\xd6\x3d\xe0\x6e\x3e\xb4\x0d\x0d\x10\x12\xa0\x88\x99\x42\x5b\x95\x3c\xfb\xb3\x7f\x1a\x06\x34\xd6\x27\xbb\xae\xd4\x10\xbb\x33\x7c\xac\x51\xc0\xc1\x5b\xb9\xad\x1e\x16\x33\xd5\x89\x28\x00\x85\x2c\x86\x65\x79\x80\x62\x90\xdd\x7c\x5d\x22\x8d\x08\xb0\xc8\xda\x93\xc3\x5a\x95\x5b\xeb\x6a\xe3\xae\x2f\xa2\x41\x8a\xef\x0c\xea\x2e\x6e\x0a\x18\x88\xff\xd2\x88\x29\x1b\xa4\xfc\xf7\xcd\x72\xb8\x05\x45\x4c\x6b\xee\xb1\x37\x65\xe1\xf8\x18\xe1\xe4\x6a\x43\x6a\xf0\x91\xdb\xd9\xee\xab\xed\x4f\x65\x5d\x67\x32\x87\x1e\xcd\x80\x0e\x23\x98\xb4\xd5\x47\x91\xe7\x37\x79\x67\x59\x45\xa3\x88\x06\xc2\x3a\xa5\xa9\x37\x84\x0a\xd9\x1f\xe6\xcc\x19\xc7\x4f\x35\x8a\x92\x00\xf5\x98\xba\x7d\xf1\x5e\x14\xfa\x28\xaa\xb7\x4b\x6a\x27\x8d\x22\x6d\x2b\x56\x47\xf1\xeb\xe6\xfc\xf9\x2c\x1a\x58\x17\x4f\x15\xa8\xac\x57\xaf\xa6\x11\xe7\x11\xd6\xaa\x00\xd5\x8b\x84\x7a\x83\xaa\x1e\xf4\x97\xba\x61\x49\x82\x5c\x3a\x67\x9a\xb3\xf8\xb6\xda\x3f\x3d\xaf\x96\xeb\xde\xd3\x95\x46\x31\xa3\xd8\x07\xf6\xe5\x8e\xe7\x65\x77\x24\x02\xd4\xa5\xdf\x67\xb5\x2b\x44\x4c\xaf\x35\xe6\x29\xbe\xd1\x76\x35\x7d\x68\x77\x0a\x30\x4e\xe2\xe8\xae\xac\x56\x5e\x73\x7b\xfc\xa9\x84\x05\x71\xd0\x17\x72\xd6\xc7\x53\x59\x35\xb5\x77\x33\xf2\xdf\x9e\xc4\x5c\xdb\x78\x27\xdb\x95\x56\x3e\x76\x7a\x1e\x11\x60\x46\x64\xb7\x18\xb4\xff\xf9\x5a\xe1\xea\x7f\x9c\x3c\x7a\xfb\x51\x81\xe9\x61\xd7\x4e\x3a\x96\xcf\x70\x18\xbe\x49\x73\xf9\x6b\x94\x48\x60\xb4\xab\x9f\x59\x0f\x93\x43\x57\x12\x20\xd3\xf9\x9d\x46\x01\xae\x51\xaa\x77\x4d\xac\x47\x29\x43\x94\x46\x94\x39\x7b\xb3\x27\x8f\x13\x71\x59\x17\x9d\x34\x06\xa3\x54\x07\x28\x04\x00\x85\x16\x36\x69\x28\x2f\x2b\xae\x91\xa0\x22\x1d\x90\x49\x66\x70\x67\x93\xd3\x8a\xc8\xd6\xeb\x6a\x2b\x30\x83\xeb\xdf\x60\x65\x19\x55\x01\xfc\x47\x34\x20\xb5\xd4\xb9\x03\x5c\x65\x3c\x8e\xc3\xf0\x48\x46\xca\x56\xbc\x76\x8b\x1f\xab\xfd\xe2\xe9\xd9\xdf\x05\xa9\x62\x14\x1b\xef\xd9\x71\x03\xa4\xdb\x95\xcb\x96\x3a\x0c\xd2\xbe\x01\xfd\xd4\x5e\x77\x56\x16\x17\x5d\xa8\xf1\xfe\x1f\xa9\xc4\xaa\x06\xee\x5d\xd3\x67\xad\x4a\xd4\x79\x7e\xb0\xee\xbc\xfe\x8a\x54\xaa\x18\x1b\x74\xf5\x51\xe9\x7c\x3e\x30\x8f\x74\xa8\xd1\x99\xf7\x98\x15\xd6\xea\x6e\x76\x31\x8e\x4c\x20\xac\x25\xb1\x25\x95\x80\xbe\x2b\xab\x4e\x9c\x65\xd1\xcd\x08\x03\xc4\x6e\x7e\x0d\xf8\xa5\x90\x13\xce\xb0\x3c\xfc\xf0\xf4\xc7\x7c\xdb\x84\x93\x98\x63\x60\xda\x7e\xff\xb3\x45\xd6\x8e\xd7\x20\x4e\x8c\xc2\x14\x07\xd1\xc7\xa2\x98\xb4\x8c\x39\x25\x02\x57\x81\xef\x4f\x37\x23\xb2\x92\x3f\x1c\xa5\xa2\xf7\x62\x7d\xf8\xfc\x5e\xcc\x1a\xc5\x51\x1e\x92\x18\xf9\x03\xba\x12\x59\xb1\xda\x7d\xf7\x3f\x21\xa4\x14\x77\x88\x5b\xf1\x59\xef\xca\x5b\x8b\x2d\xe8\x0e\x72\x91\x3a\x1e\xc9\x7a\xb9\x19\xa6\xf5\x3c\x4c\x15\x42\x5a\xdf\xcb\x06\x76\xe5\x5d\x05\xf0\x27\xf4\x7e\x82\x94\x87\xc2\x6a\x7b\xfc\x58\x3f\xee\x9f\x56\xcf\xfb\xbe\x1d\xcd\x43\x63\x9d\x8e\xf7\xf2\xfc\x79\x97\xe1\x5b\xf7\x05\x08\x80\x47\x24\x42\xe6\x22\x52\xea\x2d\x7f\xb9\x38\x2c\x5f\x45\x51\x80\xef\xe7\xf3\x88\x85\xa8\x8f\xfc\xf1\x2a\x72\xf0\xed\xe5\x5e\x57\x8e\xf2\x28\x65\x34\xec\x5d\xe7\xf7\x70\x14\x59\x3e\xd8\x51\x78\xa4\x22\x18\x02\x8e\xf0\x66\xfb\x14\xbc\xb7\x7f\x1b\xdf\x54\x1e\xd2\xa8\xd3\xda\xb9\xcd\xde\xb3\xba\x9c\x47\x93\x52\xce\xa3\xd4\x33\x3c\x17\x79\xde\xa6\x94\x5d\x55\x99\xf3\x94\x59\x0b\x69\xab\xeb\xd3\x25\x90\x9c\x83\xdd\x72\x1e\x3e\xeb\x26\x53\x1d\x7c\x81\xc7\x31\xc7\x4c\xd1\x37\x25\xbf\xdd\xec\xba\x43\x5a\xa7\x2e\xe3\x58\x1c\xbe\x50\x0e\x9d\x4c\x8f\x84\x84\xa8\x9b\xd9\xbb\x68\x67\xd7\x9a\x51\x3c\x61\x91\x95\x0c\xeb\x14\x36\x27\xe7\x0a\x4d\xe0\xb6\xa7\xa1\x9a\x0c\xe5\x09\x08\x0c\x02\xb6\x9b\xbb\xdd\x7e\xb9\x78\xda\x77\x57\x9d\x06\x11\xf3\x61\xbc\x93\x84\xb6\xce\x3e\xdd\x00\x46\xb0\xb7\x7e\xfb\x7d\xf1\xb8\x40\x6d\x73\x7f\xc0\xa4\x34\xed\xb1\x28\xcf\xf0\x5e\xbe\x0d\x8c\x4c\xc6\xa9\x94\xfb\x8c\xe0\x09\xb6\x17\x6e\x9e\xf6\xeb\x87\x87\xcd\xf3\x6e\x71\xef\x4f\x27\x85\x8d\x08\xda\x69\x20\x2a\x2b\x15\xda\x66\x06\xd6\xd9\xa3\xf6\xcf\xd8\x8f\x56\x01\x4e\xcd\xe2\x7c\xec\xbd\xb1\x1e\x4a\x8d\x4e\xf0\x6e\x8c\xa2\x5a\x58\x78\x4a\x35\x52\x83\xa2\x5c\x45\x11\xee\x42\x58\x70\xab\x5f\x97\x65\x61\xed\x91\x46\x5a\x34\x94\xab\x24\x44\xdc\x0f\x66\xd5\xc8\x89\xb9\xad\xc4\xc7\x25\x6f\x8f\x72\x0d\x80\xa0\xc0\xb5\x2a\x57\xbf\xfc\xc2\xc5\x21\x96\xd1\xd8\xac\xa4\xca\x9a\x07\x51\xd7\x13\xcf\x4e\x3f\x3c\xd1\x08\x3c\x6c\xdf\xcc\x2d\xf8\x22\xe0\x5f\x64\x63\x5f\x17\x57\xb9\x09\x18\x06\xfb\xa8\x1b\xbc\xfb\x3c\x41\xbd\x83\xde\x20\xe9\x7f\x48\xf0\x7f\xfd\x40\x4a\xa4\xd3\x1b\xfa\x5e\xe6\xfa\x8a\xd6\x39\xe5\x46\x2b\x84\x62\x21\x98\xf1\xb6\xfc\x98\x44\x32\x71\x10\x24\x08\x1c\x72\xd8\x86\x67\x51\xc1\x57\x5b\xd7\xfc\x65\xc7\x01\xb3\x6a\xe9\x6d\x06\xf2\xcf\x52\x8e\x15\xd5\xff\x9e\xc6\xf4\x50\x03\x8e\xc6\x81\x54\x89\x6d\xd6\xd7\xe7\x23\x2a\x6a\x8f\xde\x9c\x38\x30\x09\xca\x72\xec\x9d\x7b\xc2\x9f\x70\x21\x9f\x49\x63\xc2\x88\xb5\xfc\xcc\x46\x8d\x8c\x98\x46\x04\xfd\xbf\xba\xe7\xbc\xd1\x7a\x68\x7c\x4d\x63\xca\x01\x79\x5d\xed\x3c\x3a\x1f\xfd\x8a\x1e\xf6\x4b\x73\x4c\x65\x82\x1d\x65\x54\x74\xed\x55\xb0\xfb\x5f\xc0\x42\x95\xb2\xa1\x5c\xe0\x9c\xbb\x0c\x8d\x99\x21\xc8\xee\xd9\x42\xb3\x85\xea\x3d\x53\x6d\x28\xf7\x9e\x69\xa8\xee\xe0\x0a\x7c\x26\x0e\x53\x6b\x0e\xfb\xed\x82\xfb\x44\xe3\x50\x30\x88\xb1\x3a\x7f\x82\xea\xd0\x99\x67\xd1\x38\x34\x02\x51\xa9\x37\x19\xd2\x80\xff\x75\xdf\x1f\xd0\xb8\xe0\x63\xe3\x66\x52\x27\x89\xa3\x58\xe0\x2b\xf1\x04\xa7\xa1\x7b\x07\x8d\x23\x11\x10\xee\x2b\x60\x7b\x34\x00\x19\xbe\x8b\x71\x64\xa8\x55\x97\x1b\xe0\x7e\x31\x04\xbf\x4a\xfa\xea\x7d\xd0\x68\xcc\x63\x82\xaa\x68\xaf\x59\x9e\x3b\xb7\xd9\xee\x08\xf5\xca\x01\xb6\x53\x80\xef\xf9\x34\x27\x8e\xb9\xb2\xb7\xe8\x00\x8d\xaf\xfa\xc5\x71\xa4\x3b\x88\x94\xa8\x9a\x4c\xe4\x03\x53\x09\x1a\xc7\x5c\xa0\x58\xa5\x6d\x81\x3d\xbd\x96\x50\x64\xbf\x26\xaa\xea\x34\x4e\xb8\x46\xa3\x30\x0b\xc7\xdd\x9e\xf2\xac\xf1\xb6\x4c\x7e\x84\x0a\x8c\x2b\x8a\x75\x8c\x85\xa9\xc0\x23\x8d\x13\x4d\xbd\x3e\xea\x7d\x56\xc0\xcb\xc9\x5a\xb7\xed\x4f\x65\x99\x4f\xbf\xd2\x00\x12\x9e\x31\xa3\xb6\x2a\x4d\xee\x48\x1a\x24\xd8\xf8\xd9\xfc\xab\xfb\x0b\xb5\x29\x27\xe6\xd6\xbd\x15\xf1\xac\x7d\x0a\x8d\x45\x62\xd9\x01\x42\x6b\x2c\x4d\xdd\xb7\x0b\xb3\xf6\x57\x3d\x8b\x16\x8d\x45\xaa\x62\x27\x1e\x89\xb7\xef\xf1\x8a\x9f\x22\x8d\x65\xcc\x30\xb9\xc1\x18\xbb\x0d\x10\x56\xbf\x1a\xa8\x0a\x91\x0f\x34\x75\x67\xc3\x19\x1f\xea\xc6\x2a\x92\xf8\x72\x34\x50\x37\xdb\xbc\xdf\xee\x63\x2d\x52\x2b\xd7\x6d\x43\xe0\x7d\x93\xf5\xcf\x11\x98\xc1\xac\x6b\xd9\xbe\x6d\x79\x6f\x91\x40\x63\x50\x06\xb5\xa5\xee\x4b\xab\xde\x75\x2b\x9a\x2b\x20\x9e\xd8\x04\xd4\xd2\x3e\x0f\x59\x71\xb8\xf1\xed\xfa\x2b\xef\xa3\x21\x1c\xd7\x82\x9b\xac\xa9\xcb\x42\x34\x83\xad\x2b\x36\xcc\x3e\xa2\x26\x3b\x82\x5b\xa8\xa6\x30\xb5\xd8\x40\x64\x8d\x76\x06\x24\xe2\xfa\xb7\x31\xed\x91\x26\x81\x8c\xac\x89\x75\x4f\xcd\x6b\x53\xf7\x17\x1f\x63\x27\x81\xe6\x18\x34\xd8\x08\xf7\x67\x59\x3c\x9e\x8f\xf3\xd6\x99\x34\x21\x94\x62\x59\xe0\xa1\x2c\x44\xa5\x3c\xac\x25\x21\xda\xa2\x2b\xec\x3b\xb0\xcd\xcb\xa6\x1e\xdc\xc0\x84\xb2\x10\x57\xdd\x8f\xfd\x9d\x35\x9b\xa9\xbb\x23\xb1\x65\x1b\x54\xbd\x93\x54\x77\x28\x65\x88\x06\x75\xfe\x34\xed\x35\xaf\x86\xbe\x72\xed\x08\xee\x9d\x70\x9e\xa0\xaa\x07\x0c\xea\x7e\x3d\x4d\xa8\xd2\x62\x54\x81\xb8\x39\xab\x37\x68\xfa\xd2\x5b\x77\xa3\x98\x26\xa0\x06\x84\x00\x57\x84\x9a\x79\x01\x92\x90\x6a\xef\xed\xb6\xc8\xf3\x36\xb1\xe8\x7e\x51\xc8\xac\x14\x39\x52\x7b\x57\xbb\xef\x4b\x27\xb8\x39\x7a\x37\x93\x50\x59\xcf\x2b\x7b\x82\x85\x5e\xeb\xfa\xe6\x73\x29\x26\x05\xd1\x84\x13\x65\xd5\x07\x45\xfd\xba\x39\x7b\x9a\x9e\x3f\x18\x49\x84\x2c\x1d\xaa\xf2\x03\xed\x10\xfd\xdf\x13\x85\x31\xf3\x22\xab\x74\x55\x9e\xe8\xf4\x9c\xa9\x9d\x59\xcf\x60\xd6\xb7\xb3\xbf\x8e\xa7\x26\x76\x7a\xd7\x9d\x15\xcf\xa2\xd0\x7f\x01\x7b\x77\x1f\x8e\x63\x40\x36\x4a\xb7\x80\xa3\x83\xc0\xe7\x33\xd4\xd8\x9b\x74\x50\x27\xd7\x5d\x9d\x7d\x2f\x92\x58\x68\xcc\x6c\x84\xd6\xdb\xec\x30\x9f\xce\x26\x49\xaa\x12\xdf\x43\xc8\x8e\x70\x49\xf3\xa7\x49\x1a\x0a\x8c\x2e\x36\x56\x4a\xc8\x96\x9d\x47\xdb\x4d\x92\xf2\x28\xb5\xd2\x7f\x42\x43\xd5\xb9\x51\xfb\x5b\x99\x1a\x5b\xbd\xf6\xa0\x7d\xeb\xa4\xe8\x8f\x8a\x08\x38\xf3\xec\x51\xa7\x38\x47\xba\x83\x92\xe1\x4a\xf0\xb0\xf8\xd7\x7e\xfd\xf8\xfb\x6a\x2c\x37\x45\x13\x19\x68\xf4\x15\x72\x3e\x8d\xde\xbe\x5e\x5b\x61\x9a\xf1\x0f\x91\x54\x3a\x41\xaf\xd2\x3b\xb3\x76\xa7\x89\x23\xa4\xff\x2f\xc5\x29\x6b\xa6\x22\x89\x34\xd1\x31\x89\x87\x9c\xfb\x3e\x2f\x4d\x74\x62\x09\xa0\x28\x97\x8b\x25\xc3\xd1\xea\x92\x68\xb0\xdb\x5e\xfd\x01\x70\x1a\x98\x87\xcd\x2f\x66\x09\x70\x89\x09\xc6\x11\x05\x5b\x31\xc3\x5b\x89\xaa\xe8\x51\xd4\x89\x11\x34\xd6\x5e\x84\xdf\x3a\x92\x8c\x4f\x61\xc0\xc1\x72\xd1\xee\xbe\x56\xe7\xe9\x2e\x9a\x22\xa8\xb7\x9d\xda\xb7\xbf\xaf\xb7\x9b\x67\x0b\x02\xf3\xa8\xbc\x94\x50\xc6\xbd\xdb\x19\xd6\x6a\x9f\x44\xd5\xdc\x7c\x7a\x57\x9b\xd9\x15\x2d\xa5\x2a\x0e\xdd\x64\xbf\x6f\xf3\x11\xbf\x8b\xfd\x84\x6c\x7c\x79\x29\x8b\x00\x9d\x1a\x0f\xd0\xbc\x58\xc5\xa3\x36\xe2\xbd\x1f\xb4\x65\xdc\xc0\x30\x51\xd6\x4b\x10\x53\x9a\xac\x38\x5c\x2c\xdd\x69\xc4\xa8\x22\x9d\x95\x90\xb0\xc8\xfe\xb1\x2d\x00\x4d\xa3\x50\x20\xca\xd0\xdb\x59\x6f\x11\x57\xd0\x9f\x23\x21\xc2\xa7\x74\xa5\x86\xc1\xdf\xd3\xd8\x66\xe2\x42\x77\x75\xa5\xbd\x2a\x0b\x93\x1d\xba\x31\x2a\xf5\x15\x79\x3b\xa7\x6f\xda\x6c\xbf\x5b\xc5\xd2\x98\xc6\x3e\x5d\xc4\x09\xd9\xe6\x7b\x9b\xea\x12\xbe\x93\x26\xd4\x66\x7a\x35\x14\xbd\xa4\xd5\xba\xb6\xb6\x63\xb3\x7a\x43\xed\x67\xec\xfd\x39\x59\xeb\x8d\xe9\x43\x4e\xa2\x08\x43\x40\xb4\xb0\x68\x6f\x71\x7b\x87\x26\x13\x3b\x4d\x74\x12\xa9\x81\x88\xc5\x40\xcf\x89\xa6\x29\x4f\x70\x79\xfe\x7e\x2e\x1f\xb3\x73\xf7\x57\x09\xa8\x07\xb8\xcd\x8e\xa7\x1c\x86\x8d\xdd\x54\x50\xdb\x7a\x73\x89\xa2\x63\x06\xcc\x82\x45\xfc\x27\x12\x8a\xd1\xc2\x4d\x76\xb8\xcb\xea\xd7\xe7\xd2\x9b\x70\xd0\x54\x1a\xc0\x3e\x45\x7d\x96\xc7\x1e\x64\xb0\x9b\x21\x3f\x8e\x6f\xa5\xe2\xc2\xfb\x8e\xff\x01\x62\xc8\x38\xa3\xa9\x12\x80\xc5\x13\x17\xb8\x60\x5a\x61\x67\xd4\xa0\x06\x93\xa2\x09\x6e\xc7\xc5\x7f\x82\xea\x56\x7c\xf6\xc7\x12\x54\x2d\x76\x3d\xcb\xa5\x38\x4d\xb5\x24\xc6\x57\x03\x4c\xa0\x8c\x47\x1b\xf1\xd6\x4d\xbd\xa8\xb0\x3d\x3c\x10\x32\xa6\x29\x84\x8c\xbb\xee\xfb\xcf\xb2\xca\xf5\xf2\x7c\x6a\x67\xfa\x48\x6b\x63\x74\xd3\x40\x26\x8c\x7b\x01\xe6\xce\xd4\xd2\x9f\xce\x44\x04\x57\xf4\x76\x9d\x67\x74\x57\x3a\x7f\xd1\xd1\xb2\x9f\x1a\x4e\x10\x43\x03\x85\x26\xd3\xe5\x3a\x35\x69\x8a\x91\x63\xe3\xf0\x88\xfd\xdf\x6d\x0c\xd0\x2e\x0c\x95\x28\x74\x90\x76\x47\x84\x65\xc9\xb5\x51\x69\x95\x1d\xb2\xc2\x07\xf7\xd3\x1c\x74\x3c\x45\x8d\x83\xc3\xd6\xce\xfa\x07\x75\x7e\xf0\x42\xc3\xd9\x6c\x75\x52\xd0\x16\x01\x0b\xb5\xb6\xf2\x02\x9d\x75\x3b\x5a\xf5\xfe\x36\x19\xa7\x23\x64\x0a\x22\x21\xe4\xe6\x5c\x15\xd3\x84\x45\xd0\x58\x89\xae\xdb\x5f\x56\x1a\x2a\x5c\xf9\x48\x38\x1d\x97\x24\xa8\x02\x84\x6c\xbd\x4e\x54\x7f\xec\xfd\x43\x05\x15\x5a\x59\xa0\xcf\x3b\x36\x5d\x30\x6b\x00\xfd\x72\x85\x63\x21\x18\x4b\x90\x81\x88\x80\x01\x3d\x61\x39\x53\xc1\x62\x8e\x11\x15\xc2\xaf\xba\x46\xc0\xff\xae\x46\x20\x58\x22\x42\xd9\x75\x1e\x26\x35\xf7\xd9\xb9\x2b\xc2\xc4\x16\xbb\x6a\x68\x5e\xb2\x81\xe6\xd5\x78\x54\x44\x24\x06\xc6\xc2\xd9\x0e\x8e\x7c\xf4\xfd\x18\xc5\x52\xd3\x81\xa3\x46\x99\x63\x3f\xfb\x46\x33\x54\xc4\xc4\x60\xe5\x44\x58\xc1\xad\x5b\x18\xb4\x76\x44\x42\x49\x24\x07\x4b\xfa\x95\x16\xc2\xf8\x36\xa6\x52\x04\x2e\x01\xbd\x29\xcb\x76\x7b\xed\xd8\xe6\xe3\x5f\x94\x4a\x89\xa1\x9d\x45\xcc\xdf\x88\xa6\xc9\x71\x8f\xba\xd4\x6e\xf8\xbb\xff\xf6\x81\xb4\x48\x95\x5d\x10\x5c\xa3\x0f\xaf\xbc\x93\x66\x74\x63\x04\xb5\xfe\xf1\x2e\x17\x86\xf2\x94\x43\xef\x10\x4f\x85\xe0\x56\x42\xf1\x80\x5e\xf7\xf5\x39\xbf\x5e\x3d\x45\x98\xc6\xfc\x8c\x10\x5c\xf1\xde\xd4\xef\x49\xd4\xf5\x47\x59\xe9\xa5\x97\x9b\xfe\x6d\xce\x11\x8f\x0a\x91\xa6\xb6\x97\xdb\x3e\xbe\x2e\xae\xfd\x83\x4e\xe6\xac\xe4\x29\xf6\x57\xf3\x39\xfd\x88\xf1\x75\x28\x13\xa3\x18\xac\xeb\x49\xd9\xc4\x71\x32\x1b\x74\xc0\xbd\xfa\xc9\x12\xaa\x26\x33\xde\x5d\x6c\x12\xd5\x0e\x01\xb8\xdd\x87\x21\xb0\x14\x3b\x6b\x9a\x0e\x45\xb3\xbe\x1d\xdd\xaf\xee\xbd\x85\x54\x83\x55\x24\x6e\x27\x1b\x16\x01\xaf\x4f\x7c\x19\x44\x41\x3c\x30\x80\xc3\x74\x76\xa6\x8a\x2b\x03\x25\xc0\xd6\xfc\xbb\x8d\x48\x12\x66\x10\x79\xea\x50\x15\xc8\x06\xc1\x4e\xa7\xad\x0b\x6b\x44\x5d\xcc\x56\x00\x24\x89\x13\xef\x7c\x33\xf1\xed\xa1\x92\x06\x54\x9a\xee\x07\x0c\xaf\xbd\x1b\x20\x62\x6b\x19\xd9\x06\x16\xc3\xbd\x51\xd2\x28\xc6\x82\x7c\x56\x2f\x73\x10\x93\x5a\xb9\xa4\x9c\x21\x78\x0c\x99\x66\xa0\x77\xe5\x23\x7c\xd8\x3e\xcb\xe8\xb7\xb2\x38\x12\x43\x2d\xcc\xae\x9b\x36\x99\x1f\x32\x64\x40\x3b\xf5\x1f\xec\x19\x5e\x21\x32\xcb\x50\xb2\xc0\x95\x9c\xde\xdb\x35\xf9\xdf\x65\x56\xe4\x59\xdd\xec\x4b\x3d\x59\xc5\x65\x68\x42\x87\x11\x44\x22\x13\x88\xe3\xcb\x9d\x2f\xdd\xcb\x38\x0e\x64\xdf\x81\x7a\xd9\xde\x3e\x94\x45\xf3\x9a\x7f\x6e\x45\x2e\xaa\x0c\xae\x36\x20\xbb\x8f\x13\xd4\x4e\x78\xc8\x74\xd7\xce\x91\x09\x67\xf8\xa2\x76\x59\xb1\x95\x5f\xba\x32\x61\x92\xd8\xda\xca\x5a\xd9\xd6\xec\x6b\x2f\x14\x2a\x53\xc2\xc8\x40\x8f\x11\x45\xe2\x17\x85\x7e\x69\x23\xc4\x8f\x2a\x6b\x1c\x06\x6b\x78\xd9\xbe\xe7\xdb\xfe\x3b\x06\x8d\x4e\x2e\x05\xe3\x18\xb4\x1f\x3b\xc2\xbe\xfb\x42\x60\xd4\xb1\x58\x75\xbd\x39\x37\x75\x23\x2e\x75\x91\xa9\x14\x91\x2d\x2c\x7d\xa0\x4a\xf6\x60\x5d\x92\xed\xba\x04\x7e\x6d\xc8\x8a\xc3\xfe\x90\xbd\x83\xf8\xe8\xa2\x27\x29\xb8\x02\x4b\x9a\xfa\xf1\xc7\xd2\x57\x5a\xfd\x41\x29\x09\x82\x39\x9c\x64\xc2\xfc\x5e\x29\x15\x49\x63\xd2\x29\xf4\xc8\x1c\xaa\x6f\xe2\x08\xeb\x89\xbd\x04\x95\x4a\xc4\x28\x8d\xd5\x3f\x9a\x2a\xfb\x73\x98\x37\x5f\xdd\x2a\xa5\x8e\x02\x6f\x12\xba\xcb\x9a\x73\x2e\xb2\x0a\xf6\xcb\xf2\x78\x6a\x60\x3f\x29\x03\x48\x9d\x00\xda\x12\x2e\x4b\xfd\x39\xa2\xb6\xa8\x80\x09\xec\x3e\x65\x0d\x1c\x87\xce\x15\x54\x91\x50\x6a\x4f\x9e\xb5\xda\xb4\xe3\xb7\x54\x11\x13\x50\x67\x1e\xb0\x3d\x9f\xa0\xba\xad\xc4\xa1\x83\x6e\x28\x62\x62\x74\xb1\x45\xbc\xf6\x52\x9c\x56\xf8\x90\x86\x91\xbb\xa2\x81\x8d\x10\xed\x5c\x5f\x14\xfa\x1b\x34\xdf\x4b\x9d\x63\x3e\x39\x24\xf2\x2a\x2a\x00\xa1\x9f\x59\x7d\x73\xfe\xec\xd1\x24\x7e\x49\x54\x54\xdb\x76\x6c\x0d\x4d\xb7\x33\x6c\x55\x06\x85\x82\xf9\xb4\x44\x31\x22\x11\xdd\x99\xa9\xba\x9e\x1a\x0b\x52\xc5\x42\xdb\xbe\x2c\x5d\x98\x38\x49\x48\x14\x4b\x00\xdb\xb5\x26\x2b\xb4\xb3\x35\xc2\x14\x03\x51\x5e\xa3\x5b\xaf\x58\x1a\x22\x42\xed\x76\xf3\x6d\x3f\xba\xf3\xcc\xa4\x18\xcc\x3d\x2f\x76\xab\xfd\xd3\xcb\xcd\xfd\x7a\x39\x04\xa7\xaa\x90\x68\xa9\x06\x4e\xbb\x03\x9a\xb0\x8a\x08\x97\x8e\xfb\xe4\xcd\x81\x3b\x13\xa2\xf6\x68\x82\xf5\xa6\x5c\xd4\xcd\x43\xf9\x0e\x43\xd1\x3d\x3f\x24\x0c\xb1\x9a\xa6\x5e\xdb\x7d\xec\xd1\xe3\x97\x15\x27\xc4\xbb\xfe\x58\xbc\xca\xd5\x06\x83\xe2\x3a\x44\xd7\xee\x36\xf0\x51\x99\x5f\x6c\x54\x4c\x12\x6c\x7d\x56\xd9\xe1\xb5\xe9\x79\x4b\xfe\x28\x97\xa8\x1c\xba\x3d\x81\xeb\x9e\xf5\x2d\x17\x15\x9b\xd8\xf9\x28\xff\xdb\x39\xd0\x39\xab\x4f\x77\x3c\xe1\x01\x96\x50\x33\x53\x96\xba\xc3\x4c\x76\x47\x85\x55\xb8\x1f\xa0\x50\x9e\xca\x32\x7f\xc8\x8a\x66\x60\x10\x46\x55\xa2\xb5\x25\xfe\x7b\x6a\xf7\x08\xaa\xa2\x12\xb0\xf8\x51\x9b\xe3\xae\x6b\x8f\xb8\x98\x87\x14\xaa\xc4\xc4\x28\x8f\xb9\x78\x5e\x8f\xcf\x93\x52\x11\x4d\xa4\x49\xbe\x5c\xba\x55\x2a\x03\xac\x98\xd8\x4c\xed\x26\xcb\xf3\x7b\xeb\x35\x33\x94\x5a\xf8\x22\x66\x53\xa9\x54\xf8\x4c\x51\xa8\x3e\xab\xfd\x62\x3d\x7e\xab\x45\x40\x70\x59\x14\x28\x94\xb3\xa9\x2c\xe6\xd2\xd1\xb6\x2f\x7a\x6d\x73\xd8\x52\x25\xc2\x04\x1f\x7c\xfd\x21\x4e\xf5\x38\xb4\xa1\x81\x1b\x23\x65\x8a\xbc\x69\x78\x77\x84\xce\x79\x4d\xfe\xf9\x99\xa5\x68\x80\x00\x1a\x0d\x22\x87\xea\x7b\x57\x04\x55\x2a\x16\xa8\xc5\x56\x67\x87\x02\xb5\xb2\xc1\x64\x3e\xad\x57\x5a\x87\x28\x8c\xfb\x5e\x5e\xaa\xc0\x0c\x6f\x13\xc4\xc0\x63\x5f\x31\xc9\x08\xdf\x8b\x36\x82\xf2\x67\x31\x89\x0c\x74\xb7\x9d\xdd\x9c\x0b\xdd\x6d\x75\x3a\x88\x05\xa2\x65\xfe\xeb\x8f\x1f\xc3\x37\x59\x07\x3a\x22\xa9\x9b\x32\x97\xc0\x9c\xd1\x6f\xd3\x24\x16\x92\xf8\x96\xd8\xb7\x52\xe4\x7e\x76\x6b\xa2\x05\x32\xd0\xfc\x37\x67\x79\xbb\x60\x6e\x8e\x45\x36\xa4\x09\x25\x57\xff\x7b\xf9\x53\x35\x15\x09\xca\xbc\x8a\x73\x53\x5a\xa3\xaa\x2e\x14\x9e\x49\xd1\xfc\x87\xb4\x52\xa2\x4b\xc1\x6c\xdf\x6a\xa1\xa6\x0b\xa8\xa6\x40\xf1\x47\x77\xaf\xd1\x93\x7b\x5d\xfd\xef\x61\xc4\x16\x76\x0f\xd0\xec\xac\xdd\xb4\xc9\x9a\xc5\xf1\x5c\x76\x93\x51\x87\x91\x19\x15\x2c\x3d\xfc\xae\x4d\xa3\x0e\xa2\xb9\x14\xc4\xff\xca\x6d\x7e\x0e\xed\xa2\x23\x1e\xf0\x21\x06\xaf\xf7\x6a\xa3\x3a\xd2\x84\xc8\x2e\xdd\xbb\xaa\x2d\xa0\x39\x68\xed\x58\xe9\xfb\xaa\xfc\xd8\xab\xf2\x2a\xd9\xd5\x7d\x22\x16\xb1\x72\x65\xc6\x45\xd3\x54\xcb\x73\xdd\x94\x7f\x49\x2f\xf1\x9f\x55\xdc\x66\x5e\xa2\x7a\x2b\x4a\x0d\x3d\x12\x62\x31\x7d\x04\x49\x68\xa3\x53\xdb\x1e\xf4\xdb\xaa\x16\x20\x91\x45\xff\xb8\x5e\x7a\x67\x07\xaa\xa5\x34\xbc\x37\x8b\x5d\xab\xf2\xd6\xd5\xd2\x10\xf2\x75\xa5\x03\xa4\x15\x8b\x60\x24\xcc\x74\x15\xf7\xa5\x95\x6b\x9c\x1a\xc4\x68\x3b\xcf\xde\x51\x1d\x54\xab\x38\xc6\x12\xba\xc1\x16\xd7\xa0\xc7\x3b\x98\xb2\x2a\x15\xc2\x41\x8e\x87\x45\xb4\x01\x3c\x8f\x87\xa3\x4c\x43\x83\x88\x49\x34\x10\x7b\x5f\x4f\xe8\xaf\x1a\x84\x48\xbc\x24\x5a\x05\x06\x2a\x28\x2e\x79\xf9\x93\x5f\x03\x32\xc5\xdb\xd5\xae\x34\x83\x82\xc8\x68\x21\xd4\xa0\x2d\x00\xc0\xd5\x64\xaf\xdc\x43\x13\x84\xf8\xab\x9d\x6d\xb8\x55\x56\x1a\x71\x3a\xfc\x40\x12\x69\x87\x50\xb4\x58\x12\xa7\xc1\x3e\x39\x1d\x0d\xb4\x17\xeb\x7e\x17\x59\x2e\xc6\x58\x5e\x6d\x68\x88\xb9\xd3\xe2\x5c\x75\x38\x3f\x6d\xb8\xe2\xc6\x17\x15\x8a\x73\x3d\xd1\x69\x80\x40\x05\x48\x55\xb1\xbb\xc1\x16\xf2\xdc\xa2\x9d\x46\x17\x08\x24\x32\xd4\x8a\x4c\xf4\xda\xed\x14\x88\xb1\xf2\x11\x88\x21\xcc\xf3\xb2\xa9\x1f\xcf\xc7\xc9\x27\x29\x8f\x91\x94\xbf\xcd\x9c\x6a\xe8\xe4\xfb\x69\x6a\x10\x36\x67\x41\xda\xbb\x57\x31\x44\x49\x00\x85\x08\xf3\x17\x7b\x75\x0f\x59\xe1\x51\x12\xe3\x93\xb0\x34\xc4\xf6\xce\xde\xf2\x23\x26\x5a\x39\x97\xa4\x57\x88\x08\x43\xe0\xef\x7d\x79\xf0\x01\x9e\x97\x1f\x98\x9d\xe3\x10\x85\xd4\xbb\xca\x8f\xf2\x7b\x6c\x0b\xcc\x6e\x96\x10\x49\xed\xed\x04\x6e\xda\x1b\x54\x67\x6a\x72\xd9\x91\x11\x5e\x5b\xbf\x5d\x98\xad\x4b\xbb\x3b\xc6\x09\x47\xc2\xcb\x87\x6f\xbc\x5b\x00\x40\x77\xef\x79\xc2\xf0\x61\xaf\x17\x0f\x08\x0b\x5c\xed\xbe\xef\x3b\x49\xba\x36\xb0\xec\x07\x5a\xb0\x7e\x2d\x0c\x2c\xb4\x66\x74\xb8\xa7\x74\x17\x1b\x3b\xef\xa5\xfd\xdd\x72\xc4\xb8\xbf\x6a\x13\x49\x21\x4e\x43\xc5\xbc\x9d\x37\xd2\x94\x27\x4a\x90\x49\x37\xd0\x42\x91\xd1\x77\x8b\xce\x47\x53\x10\x0b\xe9\x6b\x79\xab\xe6\xd5\x2d\xd9\xef\x65\x76\x2d\x8c\x87\x84\x11\x65\x27\xb6\xed\x34\x0f\xbf\x31\x91\x29\x72\x50\xeb\xec\x4f\xd8\x18\x2c\x33\x0c\x93\x06\x48\x81\x63\x9a\xe7\xc0\x9e\xe2\x17\x8a\x6c\x1c\x4f\x02\xf3\xdb\xab\x65\x34\xf7\x69\xc9\x6c\xcb\x6f\x7f\x82\xca\x94\xd5\xb1\x53\xb3\x99\x7e\xec\xcb\x72\x1f\xc8\x94\x38\x2b\x2b\xb4\xf6\xb3\xc7\xee\xaa\xf2\x68\x03\x89\xc9\xcf\x55\xdc\x4a\x16\xf5\xb6\x21\x50\xef\xca\xab\x8c\x21\x50\x92\x91\x3e\xa6\x70\x3d\xee\x2f\xc3\x50\x50\x60\x59\x03\xb2\xcc\xa1\xf0\x79\x01\x68\xa3\xa8\x15\xe3\xc1\x3a\xfe\x62\x20\xd7\x76\x23\xa6\x2d\x4c\x00\xd7\x61\xc9\x9c\x32\xed\xba\x18\xfb\x86\x8d\x7f\x14\xa4\x29\x52\xb0\x1a\x71\xfa\x6d\x14\x45\x82\x49\x29\x1e\xb9\x13\x1f\xc5\x20\x51\x30\x81\x08\x30\x1d\xb4\xf6\xdf\xf7\xcb\xbf\x9e\xa7\x86\x68\x6a\xa7\xb6\xd0\xfa\x5b\x55\x9e\x4f\xbb\xd2\x86\x36\xf3\x1d\x67\x43\x19\x45\xc0\x53\x56\xdb\x57\xee\xe6\xfc\xd9\x2e\x8b\xfe\x0a\x68\xcc\x30\x44\x75\xa9\xeb\xe5\x6a\x6e\x28\x58\x0b\x60\xeb\x0f\xb7\xdf\xdc\xed\x6f\x36\x9b\xed\x6e\xf5\xec\x3b\x98\x86\x91\x84\xf6\x10\x76\xa7\x1e\x31\xfb\x50\x0c\x8b\x8c\xc3\xb8\x88\xa3\xf3\x76\x18\x53\x20\x0c\xe3\x01\x0b\x87\x85\x84\x67\x78\x87\xe2\x0c\x8b\x66\xa6\xc7\x6c\xc2\x08\x90\x53\xf5\x54\x41\xd3\x7c\x7e\xcb\xaa\x7c\x7a\x0b\x47\x37\x8f\x07\x31\xf2\x40\xeb\x13\xa8\x4c\xe4\x63\x3f\xc7\xf6\xb0\x75\xb1\xb6\x3b\x70\xb3\x38\xeb\xac\xb9\x60\xa3\x8f\xef\x4e\x1c\xa7\x66\x68\x32\xec\xd4\x11\xaa\xf2\x88\xc1\x92\xbe\xa4\x4a\x5e\x3b\x8f\x00\xea\x97\x1f\x74\xe8\x5c\x39\xdd\xd6\xf1\xad\xec\x9e\x6b\x22\x02\x62\xd5\xa5\x3f\xd7\x45\xdd\x88\x3c\xbf\xa4\xa6\x99\x44\xc6\xa9\x67\xdc\xe7\xe7\xf6\xd1\x54\xab\xc3\x61\xb6\x1a\x6b\x12\x23\x3c\x95\xd7\x19\x74\xed\xc4\xaf\x81\xcc\x98\x49\x0c\xa0\x38\x4f\x56\x58\x60\xd3\xbe\xb1\xaa\x33\xa3\x6f\x4c\x03\x8e\x8c\x8b\xa2\x6c\x76\x65\x79\x5f\x16\x87\x6d\x56\x28\xf0\x8c\x38\x37\x4a\x44\x0c\x27\xf1\xc9\xbf\x72\xae\xa5\xe3\x0a\x67\x9e\x74\x6d\x44\x64\x9c\x08\xac\x2a\x0b\xed\x23\xbd\x9e\x74\x64\x04\x37\xa9\xf3\x48\xe9\xfa\x2c\xfd\xa2\x33\xec\x72\x4f\x26\xa2\x48\x01\x03\xc2\xf2\x04\xc5\xf6\xb5\x9c\x34\xf5\x8d\x30\xc1\xc0\xac\xf3\x76\xb1\xf9\x7b\x72\x01\x46\x32\xed\x92\xee\xe6\x19\xd0\x82\x2b\xdf\x1e\x45\x75\xa5\xa7\x6c\x14\xe5\x28\xf4\x71\x3e\xb5\xc9\xde\x53\x59\x4f\x0a\xc8\x46\x39\x72\xb7\xf2\xe9\x0e\xb6\x71\x06\x70\x22\xa3\x22\xed\x72\xb6\x66\x68\x3a\x53\xff\x36\xc4\x99\x0e\x02\x53\xa3\xb8\xc1\x5c\x4a\x42\x01\x26\x53\x99\xa8\x3e\xc7\xa4\x73\xa3\x99\x95\x39\xc5\xba\xa2\x2d\x8d\x77\x47\xac\x15\xd7\xe6\xf8\xfb\xd3\xe3\x30\x75\x34\x5a\x29\x9c\x8e\x60\x97\x66\xff\x57\x93\x20\xa4\xdf\x35\x8e\xa6\x7e\x7d\xd4\x80\xd2\xc6\x4a\x83\x9f\x3e\x7f\x9b\xa5\xb7\x4e\x6e\xb0\x01\x86\x1f\xa8\x9b\xb2\xc2\x6e\x32\x6e\x87\x83\x97\x9c\x05\x41\x68\xcd\x4f\x5c\xbd\x69\x9c\xb0\xf7\x61\x13\x0b\x82\x84\x08\x9f\xdd\xcc\xe0\xf8\x59\xc0\x12\x21\x7c\xbd\x19\xf1\xce\xbb\xf2\xa1\x1e\xd7\x34\xfd\x48\x91\x52\x69\x69\x14\x1f\x8e\x61\x3e\x1d\xa1\x94\xd2\x0e\x76\xf3\xe3\x5c\x4c\x8f\x42\x62\xad\xa3\x6c\x8b\xe1\x4f\xab\x86\x70\xd9\xd1\x75\x1b\x22\x0b\xc2\x90\x49\xe5\x45\xab\x47\x50\xdb\x7f\x8c\xcf\x1c\xa6\xd2\x47\xcc\x77\xd9\xe1\xb5\x99\xf8\x95\xb6\x03\x34\x8a\x17\x2c\xf2\xfc\xd3\xd1\xa9\x07\x4f\x96\x05\x51\x10\x86\xa6\xef\xa0\x39\xdc\xee\x43\xe9\x55\x8a\x58\x10\xa5\x0a\x4c\x8f\xb5\x9f\xe7\xf3\xfe\x63\x7c\x6b\x23\x45\x49\xe0\xf5\x81\x6d\x61\x0a\x6d\x5b\xb0\xfb\x27\x4b\xaf\xd2\xe4\xb5\x2c\xdc\xa7\x38\x8b\x31\xb3\x78\x5e\xdd\xdd\x8d\x60\x34\x2c\xe0\x11\xc1\x7e\xc3\x72\xf3\xf0\xf0\xf2\xb8\xde\xfd\xb1\x5f\x2e\x9e\x9e\x56\xb7\xfb\xdf\x17\xf7\x2f\xab\x6e\x54\x0a\x18\xe3\x7f\xdf\xfd\xab\xfb\x53\xbb\x86\xff\x9f\xff\xef\xff\xac\xd6\x4f\x31\xa1\xfb\xdb\xcd\xc3\x62\xfd\xb8\xff\xbe\xd8\x7e\xf7\x23\x12\xca\xb1\x20\xf3\xf6\xa9\x9e\xda\xc0\xfe\x22\x9b\xf7\xe3\x98\x91\xd1\x48\xad\xe9\xaa\xd4\x19\x0b\x92\x38\x40\x18\x64\xe3\xed\x83\x50\x8e\x0b\x01\x61\x77\x65\xb5\x05\xd0\x03\xf0\x2b\x0b\x12\x45\x49\x47\x70\x3a\x4c\xce\x95\x52\x8a\x59\x49\x86\xf8\x45\xab\x2b\x37\x99\xca\x29\x4b\xb9\x83\x69\x6c\xd5\x2b\x1c\xc5\x0c\x86\x8e\x05\x69\x92\x26\x1d\xd4\x61\x5b\xe6\x7a\xef\xbf\xbf\xcd\x66\x23\x8b\xbf\x3b\x17\x7a\x3b\xe3\x7e\xe2\x07\x3a\x3f\xf3\x26\x83\x6a\xf7\x51\xf6\x40\x0f\x16\xa4\xc6\x76\x58\xea\x13\x54\xc7\xbc\xac\xc6\x1e\x1f\x2c\x10\x5a\x7b\x58\xc3\xfe\x54\x95\x27\xa8\x9a\xcf\x7d\x6e\x5b\x3c\xb3\xbb\xfa\xf8\xe2\x65\x18\x60\x0b\xe2\x24\x3e\x7f\x66\x45\x91\x15\x87\x6f\xb9\xd0\xd9\x50\x27\x7c\x72\xad\x52\x5b\x14\x55\x05\xef\x50\xd5\x30\xb9\x65\x8a\x71\x43\x70\xf3\x94\xed\xbc\x1f\x98\x89\x76\x6f\xa1\x62\x36\x32\x77\xca\x9b\x03\x84\x35\x0b\x54\x2c\x51\x47\x71\x57\x95\xc5\xbf\x9a\x36\xac\x9f\xf7\x9b\x65\x81\x12\xb1\x92\x5d\xe2\x69\xc1\xb7\x7e\xc3\x58\x17\xdb\x3f\x85\x2c\xbb\x93\x1a\x11\x5a\x94\xf1\xea\x17\xa8\x21\x3d\x7a\x72\x4e\xad\x29\xca\xab\xac\x4e\x35\x26\xca\xfe\x04\xda\xc8\xd4\x85\x57\xf9\xa2\xd0\x77\x22\xcb\x7f\x66\xcd\x6b\x79\x6e\x9e\x41\xd4\x65\xf7\xd6\x03\x63\x18\x86\x5d\x40\xec\x58\x60\x42\xa0\x6e\x2a\xf9\x3a\xd7\xdf\x88\xe1\xdb\xcf\x99\x24\x1c\xe0\xaf\x2d\x0d\x76\x72\xd3\x4d\xac\x92\xae\xdf\xed\xb0\xa0\x57\x84\x43\x59\x60\x80\xc5\x6e\xb7\xfd\xaf\x33\x54\xb3\x6c\x2c\x46\x02\x45\x95\xa3\x6b\x60\xcf\xf7\x49\x4c\xd6\x66\x42\xc1\xbe\x8b\x53\xd5\xfa\x51\xb5\x64\x34\xd9\x48\x18\x28\xac\xe0\x3e\x2d\xbf\x2f\x3c\xeb\x88\x91\x90\x58\xf5\xca\x0a\xf3\xb0\xd3\xe4\x6b\x42\x16\x60\x35\xcd\xfa\x03\x4e\x92\x98\xd9\xb7\x89\x84\x3a\x89\x9c\x8f\x0c\x62\xb2\x1e\xe0\x58\x5e\xb1\x59\x73\x9f\x88\x58\x42\x7d\x55\x38\x2b\x0e\x7b\x25\x2a\xbd\x77\x13\x5c\xef\x1d\x56\xd7\xad\xa7\x84\x4b\x8d\xc0\xe8\x57\x51\xbf\x3e\xd4\x87\xbf\xb2\xe0\xbd\xe0\xb0\x8c\x6e\x09\x87\x14\x7f\x1e\xa2\xb5\xff\x96\x7a\x04\x23\x71\xc8\x74\x3c\xf0\x94\x35\xce\xe3\x70\xe8\x27\xcb\x48\x12\x5b\x23\xe4\x63\x7e\xdb\x26\xdd\xed\xca\xe0\x67\x23\x49\x44\x8c\x65\xc6\xe7\xc5\x72\x75\xb7\x79\xee\xa0\xa2\x8c\x24\x32\xc2\x79\x5a\x7f\x88\xd3\xac\xd2\xf7\x78\xf9\x26\x89\x86\x98\x79\xb9\xfb\x6a\x88\x19\x1e\xc6\x64\x8c\xa4\xa9\x8d\x0d\x6b\x68\xb0\xee\x8d\xa9\xe1\xc5\x7b\x78\xd9\xd8\x60\x24\x95\x01\x58\x11\x65\xa4\x8b\xd5\x9d\x2f\x98\x69\xa0\x5a\xe6\x99\x31\xfe\xda\x45\x60\xfd\xfc\x0e\xd0\x8c\x8d\x11\x18\x11\xb1\x0a\x30\xcb\xac\xb2\xc3\xc1\x2a\x9c\x8f\x7c\x46\xe7\xa7\x85\x48\x08\xe9\x53\x9b\x81\x1c\x0d\x23\x22\xd5\xf8\x5d\xb9\xa8\x9b\xf5\xad\xff\xab\x24\x02\x7b\x58\xcb\x5e\x28\x79\xc0\xcd\xfa\xea\x57\x4a\x23\x50\xa8\xa0\x80\x5f\xcd\x3e\xf3\x3b\x18\x51\x3c\x00\x8b\xe0\x46\x3e\xed\xfc\xf6\x41\x54\x4c\x10\x88\x5e\x0b\x03\xbb\x72\x7b\x96\xf3\xeb\x1b\xd1\x2c\xe4\xae\xfd\x73\x9e\xd6\x16\xdb\xa3\x29\xaa\xf9\x3f\xac\x1f\x77\xfb\xf5\xe3\x6e\xf5\xfc\xfb\xe2\x7e\xbf\x5d\x2d\xfd\xc5\x80\x53\x97\x6b\xb7\x1a\x28\xf4\x5e\x5e\xe4\x96\x8c\x00\xd5\x08\x63\x33\xe7\x42\xed\x83\x45\xca\xba\x0f\x87\x91\x6d\xad\xbc\x82\x7a\xbb\x29\xa7\x8a\x92\x8c\x18\xda\xf9\xac\xf9\xc7\xb3\x2e\x4c\x89\x61\xfb\xfc\xcf\x36\x0c\x02\xe5\x97\x3d\x87\xd3\x7d\x2a\xf3\x7c\xb2\x94\x99\x90\x62\x09\xb6\x79\x85\x65\x87\x20\x64\xc4\x18\xae\xa8\x0b\xc0\x2a\xed\x65\x89\x7b\x1d\xc5\x6b\x2f\xa3\xfd\x38\x4a\x88\xa3\xf9\x16\x34\xfb\x87\x85\x0f\x8c\x28\x09\xac\x0a\xd3\xc8\x28\xf8\x16\x4e\x15\xa8\x11\x8c\xeb\x42\x49\xfe\xab\x42\x11\xa3\x84\xa4\x7e\xfb\xf8\x02\x5d\xfa\x8f\xc9\x86\x3f\x88\xdb\x29\x49\x6c\xc7\xe6\xf6\x5c\x1c\xa0\xb4\xfe\x50\x13\x37\x3a\x3f\x52\x68\x04\xcf\xee\x95\xe8\x51\x5f\xf3\x97\x45\x9d\x2d\xf2\x29\x03\x05\x75\xbb\x5e\x4c\x42\x28\xca\x12\x4b\xbc\x7f\xab\xd5\x03\x96\x7f\x2f\xae\x79\xb8\x1c\xd2\x30\x8d\x55\xe8\xb5\xa4\x1a\x30\x42\x35\xf5\xda\x77\xbe\x19\x8d\xa8\xb5\xbb\x2e\x2b\xa1\xf2\xec\x4f\x40\x3b\x99\xf2\x78\xbb\x6d\x43\x9f\xd2\xfc\x8e\xa5\xdf\xfd\xbe\x06\xdc\xb3\x7e\xc0\x27\xfa\xf8\x67\xcd\xe7\x0c\xe8\x89\xd1\x28\xb4\x68\x1b\x0b\x5b\xf9\xab\x35\x61\xfa\x61\x1e\x62\xfd\x66\xb9\x79\x78\x5a\x3c\xfe\xb1\x7f\x5e\x6d\x57\xcf\xbf\xaf\xf6\x77\x9b\xe7\xee\x6a\x8d\x44\x38\x23\x2a\xae\x77\xf9\x37\xa3\x5c\x28\x44\x40\xb5\x27\x44\x4f\xd1\x2f\x8b\x8d\x8c\x72\xe0\xd8\xdb\xbe\x5d\xdd\x2d\x5e\xee\x77\xfb\xa7\xe7\xd5\x76\x71\xbf\xda\xee\x6f\x5f\xac\xbf\xa3\x3f\x71\x1c\x59\x53\xf5\x87\xcf\xbb\x0a\xb0\xb9\x4e\x08\xfd\xcb\xf2\x18\xa3\xb1\x08\x31\xdd\x91\x15\x88\x37\x3d\x65\x80\x32\x9a\x04\x84\x3a\xca\x98\x65\xb0\x4e\xa5\xe5\x18\x4d\x94\x8a\xd4\x10\x65\xbe\xa8\x64\xd6\xf4\x5b\x4e\xfb\x72\x63\xe3\x75\xfd\x78\xbb\x2e\x4c\x8e\x2f\x83\xa7\x99\xb8\x21\x29\xe7\x49\x38\x72\x76\x7a\xca\x60\x72\x29\x29\x24\x08\xad\x71\x72\xd0\xc4\x7f\x56\xd0\x14\x6b\xe5\xf2\x5c\x15\xb6\x73\x82\x33\xbc\x93\xf4\x18\x33\x80\x18\x15\x22\x42\x40\xb3\x0d\x2b\xee\x45\xdd\x3c\x64\x39\xd4\x4d\x59\xc0\xa8\x9a\xc0\xa8\x80\x94\xb9\x40\xf3\xbf\xce\x70\x86\xcd\x09\x8a\xc1\x45\x0b\x13\x62\x4e\xb6\xdc\xba\x86\xcd\xe0\xa6\x48\x16\x22\xf1\xe3\x9f\xcb\x1b\x3f\x5c\x72\x46\x6d\xba\x83\xd2\x75\x77\x65\xb5\x56\x17\xef\x84\x1b\xab\x22\x13\x58\x72\x41\x21\x0e\xf0\x34\x41\x04\x0e\xc6\xf1\x08\xe9\x84\x9d\x81\xc7\x4f\xc8\x48\xe4\xbf\x51\x49\xdb\x7d\xd1\xa0\xb2\xa3\xc8\x51\xf5\xcb\x1f\xd3\x94\x23\xe3\x53\x68\xed\xfc\xed\xbc\x62\xfd\xcd\xa7\x77\x01\x99\x4d\x45\xa9\x8e\x94\x71\x4e\x1f\xbe\xd8\xf7\x35\x54\x97\x51\x1d\x73\x6c\x75\x20\x07\xfc\xa6\x2f\xa4\x4c\x56\x0c\xe0\x09\xd8\xbc\xec\x11\x3e\xb6\xea\x75\x6a\x49\xc3\x28\xa4\xd6\x56\xc1\xe2\xf2\xf2\x12\xa9\x05\x33\x2a\xc5\x8c\x82\xd2\x98\x3c\xdd\xaf\xfe\xb5\xf3\xbf\x19\x0c\x53\x8e\x9e\x09\x15\x80\x03\x48\x8c\xae\x81\x05\x11\xd1\x8e\xbf\xf2\x4d\xd4\xb8\xf1\x5b\xd6\xd1\x64\x18\x17\xf8\xde\x2c\x3b\xa8\x7e\xd3\x25\x0d\x2c\x10\x9d\xc9\x5b\xdf\x77\x6f\xa7\x48\x3b\x6f\xab\xbb\x89\x0f\x13\x63\x54\x1b\x6b\xbd\xd0\x3e\xc5\x20\x0d\xc8\x17\x45\x59\xc6\x42\x16\xe1\xdc\xd8\x9f\x72\xf1\xf9\x0c\x22\xef\x08\xca\xff\x0f\xd8\x5f\x7f\xce\xd4\x3a\x41\x0a\xad\xeb\x41\x75\xef\x8b\xf4\x91\x85\x4a\xfb\x90\x6b\x51\x37\x55\x59\x3b\xc1\x27\x7f\xd8\x30\x0a\x9d\x07\x9a\x0b\x10\x47\x27\x88\x02\x1d\xbb\x92\x0c\xae\xd5\x3f\xfe\xf0\xe1\x06\x8b\x98\x61\x08\x73\x2a\x54\xd5\xbe\x2b\x18\xe3\x5a\x21\x81\x6e\x88\x8c\xf0\x9e\x89\x3c\x2f\x95\x68\x60\x7b\x3e\x9d\xf2\xcf\xee\x28\x10\xe3\x3a\x7c\x88\x9f\x1a\xe7\xf8\x57\x6e\x02\x0f\x62\x2b\x90\x2d\x72\xb0\x42\x05\xfe\x74\x1c\x02\x2c\x2b\xb6\x47\xfe\xeb\x2c\x8a\xa6\x83\x1f\x31\x16\xb3\xd0\xe8\xae\xcd\xeb\x6d\xdc\x6f\xc7\x28\x41\x3f\x56\x4b\x54\xb4\x7f\x5c\x3c\xfe\xb3\x57\x5f\x68\xff\xae\x51\x26\x67\x6b\xf3\x62\xeb\x63\x3f\x0b\xd3\x64\x2c\x06\x85\x34\x87\x9d\xc8\xdf\xc6\x03\xdd\x80\x24\x90\x98\xd7\xff\xbb\xcc\x8a\xa7\x2c\xcf\x45\xb5\x2c\xab\xf9\xbe\x77\xe2\x3f\xc2\xad\x76\x4b\x53\x9d\xeb\x66\xe4\x4c\xc5\x58\x22\x42\x2c\x19\xdf\xae\x7e\x5f\xdd\x6f\x9e\x56\xcf\xfb\xbb\xd5\x6a\x7f\xf7\xbc\x58\xee\x6f\x36\xfe\xd5\x62\x29\xb3\x6e\x6b\xef\x65\x73\xf1\xa0\x53\xae\x91\x3f\xe0\xf4\xa8\xac\x33\xf0\xb2\x9c\x74\x4e\x18\x4b\x93\x04\x01\xa8\x8b\xdb\xdb\x67\x94\xff\xbe\x7d\x5e\xfc\x5c\xdc\x93\xee\x3b\xd2\x08\xa3\xd4\x45\x95\x35\xaf\x03\x98\x20\x63\x22\x15\xb2\xb7\x64\xde\x18\x1f\xb6\x90\xe9\x23\x96\xb1\xc6\xa0\x1a\x0b\x36\x5e\x43\xd4\x9f\x45\x26\x71\xe0\xcc\xd8\x60\x62\x55\xc7\x98\x14\x11\xf2\xad\xda\xd4\xcf\xc2\x93\x07\x1a\x83\xdd\xbd\x97\xd2\x96\xbe\x6e\x9e\x6f\xfb\xbe\x15\x63\xca\x77\x2b\x1c\x93\x64\x18\xc8\x5d\x64\x06\x7d\xe4\xc6\x54\x1a\x47\x51\xbf\xb5\x96\x45\x1b\x10\x75\x05\xea\xc1\x26\xcc\x34\xb5\xdc\x5c\x6f\x83\xb9\xaf\x21\xcf\xf7\xe0\x24\x5c\x26\xbf\x45\xd3\x04\xb3\xc8\x77\xa8\x9b\x0b\xfa\xb2\x1f\x23\x0c\x46\x2a\x80\x3e\x00\x95\xab\x8f\x87\xee\x28\x44\xa9\xee\x54\x9b\xeb\x33\x5a\x42\xf7\xae\xbd\xdd\x20\xe5\xad\x83\x5c\xa5\xe1\x65\x5d\x34\xc9\x6c\xc3\x9c\x31\xc3\x6d\xf1\xf8\x00\xcd\xa6\xb8\x39\x57\x8e\x88\x38\x7c\xce\x61\x10\x53\x0c\x02\x65\x76\x78\x28\xf5\xea\x57\xb7\x50\x79\xe5\x2b\x16\x06\x8a\x1a\x8c\x06\x32\xbd\xda\x7d\x5f\xb7\x0b\xc8\xb1\xab\xc8\xb3\x30\xd0\x81\xb6\x8e\x56\x05\x7c\xdc\xc2\x85\x5d\xb0\x1b\x46\x52\x1a\xd8\x0c\x41\x67\xdd\x0f\x0a\xa9\xa2\xc0\x07\xb2\xa1\x1d\x2d\xde\x0f\x60\x06\x04\x1f\xd9\x3f\x7d\x76\x1f\x0e\x79\x80\x15\xc5\x76\x02\x35\xe2\xb0\x2c\x8f\x5e\x3d\xcc\x0f\x48\x38\xae\x59\x59\x6d\xc3\xa8\xa7\x8e\x6d\xc6\xc2\x50\xc1\x90\xbd\xed\xbf\xb7\x9e\x60\x69\x7c\x8c\x13\x46\x81\x65\xa7\xb5\x39\xaa\x7d\xe1\xfc\x99\x22\x12\x4a\xc7\xf9\xfb\x3d\xab\x9a\xb3\xc8\xe7\xa4\x27\x58\x18\x45\x04\xeb\x04\x16\x18\x61\x79\x20\xe5\x4e\xfc\x9a\x0f\x58\xc2\xc8\x58\x04\x41\xfd\x5a\x7e\xb4\x21\xd5\x4d\xa6\x75\xff\xa5\x9c\xa5\x58\xb1\x5b\xb8\xc5\x5a\x2f\xdb\x77\xac\x07\xa5\x5d\x4d\x8d\xfe\x6a\x17\xbb\x96\x4a\xcd\x5f\x24\x0f\x25\x02\xbf\x6e\xab\xf2\xd4\x5d\x9a\x64\x49\xe0\x57\x84\xa7\x6a\x60\x72\xc7\x42\x6e\xac\xd3\x80\xe5\xf8\x8d\x59\x3c\x6e\x48\x1c\x24\x48\x67\x3b\x8a\xea\x0d\xb9\x5d\x5b\xc4\xd8\x0d\xa5\xde\x58\x18\x0b\xeb\x07\x51\x5b\x54\xeb\xec\xfc\x0f\x93\x54\x84\x4e\xb3\x65\xbd\xde\x3f\x93\xf1\x3b\x1b\xa6\x51\xc4\x53\xc7\x34\xbe\x5d\x6f\x97\x9b\x97\x47\xbf\xf8\x86\x69\xca\x92\x0e\x5b\x68\x1f\xb7\x43\xfa\x8f\x2f\x36\x55\x9d\xb6\xa2\xf7\xf5\xb4\xe9\xf8\xfc\x15\xa5\x2a\xd6\xee\x8a\x9a\x1c\x5e\x0a\xd5\x07\xd3\x17\x23\x25\xe9\x41\x66\xfb\x62\x62\x64\xc1\xc2\xd4\x10\x6c\x84\xfd\xbb\x7c\xeb\xf8\xa3\xfe\xea\x45\x6a\xa5\x06\x7b\xc0\xac\xdb\xd6\xfc\x71\x95\xe0\xdd\x13\xef\xa2\x11\x5d\xfd\x66\x60\x4a\xc4\x42\xa1\x39\x52\xa2\xac\x20\xdf\x44\x4e\x69\x2e\xfb\x19\x85\x32\xa1\x8c\x53\x94\xdb\xd0\x25\x42\x59\x8a\xee\xbc\x8a\x25\x48\x52\x6d\x63\x88\x39\x91\x52\x16\xaa\x44\x4b\x33\xbc\xf8\xac\x2c\x6e\x07\x57\xa6\x45\x6c\x85\xe8\x7b\xe7\x81\xf0\x78\xb3\x5b\x5e\x79\x8d\xb4\xb6\x0b\x7e\xcf\xc8\x1f\xdf\x2b\x20\xd6\xd2\x67\xdb\x88\x2a\xcf\x0e\xaf\xa3\x52\x57\xd8\x86\xfc\x4e\xf2\x32\x3b\x5c\x4a\xc5\xf9\x51\x51\x6c\x9b\x16\x50\x37\xd8\x93\xc6\x36\x55\x23\x0a\x2d\x2a\xbd\x14\xc7\x93\xc8\x0e\x85\x9d\x3f\xbb\x72\x18\xac\xfb\xcf\xc7\x09\x82\x3c\xce\xc8\x73\xb9\x2d\x8f\x22\x2b\xc6\x4f\x1b\x62\xa5\x2d\x4b\xfc\x17\x36\x65\x6e\x21\xf7\x6d\x71\x16\x1a\x2a\xf0\xa5\x32\x96\x0c\xdf\x35\x68\x07\x1c\x4f\x16\x9a\x98\x60\x3c\xea\x41\x36\x8b\x2b\x95\xe6\xf1\x2f\x33\x69\x18\x5b\x43\xb5\x93\xc8\xaa\xa5\xf0\xba\x85\xf1\x17\xa2\xfd\xed\xa7\x34\x22\x71\xbe\x2d\x37\xff\x7a\x5a\x38\xbd\xcd\xcb\x0f\x24\xd3\x8f\x19\x25\x07\xda\x90\x59\x31\xd7\xe8\x8c\x82\x40\x86\x89\x6f\x70\xd7\x65\xfe\xde\x2d\x8a\x51\xc0\x03\xd4\xb4\x73\x05\xbe\x95\x53\x23\x77\x8c\xd9\xf1\x43\x8b\x02\x69\xa3\xb0\x83\x38\xc2\xae\xfc\x89\xdc\x96\xc9\x57\xd1\x50\x33\xaf\xbf\x6a\xb3\x12\x0f\x00\xf0\xdc\x78\x3f\x30\x09\x71\x92\xb5\x09\xf3\x53\x95\x1d\xcb\x4a\x67\x4e\xa9\xed\xae\x2a\x8f\xf3\x53\x33\x62\x01\x20\xba\xb4\x6e\x83\xa3\x4e\xb0\xa7\xce\x0e\x17\xca\xf6\xe3\x2b\x67\xee\xf6\xde\x97\x07\x4f\x59\x58\xed\xbe\x7f\x1d\x8a\x47\x21\x17\x98\xa9\x65\xf5\xb3\x68\x32\xdf\xce\x89\x42\xc1\x30\xdd\xb5\x40\x52\x07\x88\xf9\x6d\x08\x80\x1e\xbd\xd8\x51\x14\x10\xec\x2f\xb4\xa1\xd6\xbb\x68\x60\x2f\xf4\x31\x2b\xf6\x6a\xba\xf7\x46\x11\x4d\x70\x7d\x7a\x2e\x65\x79\x89\x53\x64\x51\xc4\x13\xdf\x72\xea\xc0\x97\xa3\x2e\x4f\x14\x29\x8b\x64\xd8\xbe\x8a\x0a\xad\xf0\xfc\x01\x9e\x86\xca\xe9\x86\xe5\x77\xe7\x62\xde\x18\x77\xd2\x28\x70\x1f\x8d\x63\x88\x89\x67\x06\x62\xaa\xeb\xaa\x8a\xf5\x5c\x37\x32\x8a\x53\x40\x24\xae\xe3\xb7\x4f\xe6\xf0\xfc\x53\x4d\x58\x12\x07\xbd\xc3\xe7\x2d\xa8\xd2\xdd\x9a\x69\x3d\x2f\x4a\x64\x30\xb2\x5a\x7b\xaa\x60\xbd\xdc\xac\xba\x94\x2f\x4a\x74\xec\x65\xe8\xef\x44\x56\x7d\x5a\x91\x88\x67\xf8\x8f\x1f\x90\xa6\x56\x12\xc0\x19\x5c\x79\x6d\x20\x07\x64\xff\x1f\x6f\xee\x3e\x44\xb7\xfb\x4f\x2a\x2b\x00\xfe\x2a\xea\x55\x51\x9e\x0f\xaf\x5f\x36\xf1\x23\xc9\x62\x84\x95\xee\x9e\x17\x8f\xdb\xbb\xd5\xf3\x7e\xb9\xd9\xfa\xdd\x32\x92\x49\x8c\xd0\x8b\x6f\x65\x9e\xfd\xc2\x87\x78\x3b\x58\xbc\xaf\x26\xd2\x5f\x36\x43\x22\x99\x5a\x06\xe8\xa3\x38\xc2\x9b\xff\x26\xe5\x42\xbe\x7f\x66\x87\x43\xfd\xdc\xfd\x35\xe5\x3a\xb4\x4e\xd3\xcd\xa5\xee\x1f\x8b\x94\x60\x56\x23\x19\x99\xa6\xb6\xea\x86\xf7\x22\x18\x04\xfc\x91\x66\x11\x2e\x08\x0b\xad\xb7\xa5\xca\x44\xee\xdf\x86\xaf\x38\x1c\x2c\xd2\x9e\x01\x69\x6d\xd4\x4a\xbf\xea\xec\xd9\x7c\x24\x1c\x01\x0f\xb0\x65\x8b\x1f\x78\x82\xea\xa5\xd6\xb7\x03\x43\xe9\x6e\x94\xab\xc7\x3b\x38\xd6\x98\x77\xee\x1e\xe8\x6c\x3e\x1b\x99\xc0\x8a\x3f\x16\x4e\xb0\xd0\x67\xd0\x23\xf9\x3e\x16\x99\xd0\x96\xa6\xb5\xef\x68\x59\x89\xee\x06\x7e\x35\x7b\xcb\xed\x1e\x8d\xe7\x01\xb5\xf4\x57\x3f\x5b\x2d\x03\x60\x76\xba\xf0\x20\x66\xdc\x25\x2a\xdf\xb3\x36\xb0\xff\x9c\x9c\x4b\x58\xd2\x54\x2e\xda\xed\xd2\x06\x02\xee\x97\x73\x42\x08\xb5\x0c\xb5\x27\xf1\xd9\x17\x07\x39\x21\x91\xbd\x6f\x50\x37\x77\x65\xf9\x23\xeb\x82\x79\x4e\x23\x4b\x32\xdb\x5b\x2e\x08\x14\x50\xb5\xc9\x28\x2a\x6a\x5a\xa9\x8c\x51\x8e\x3e\x7c\x11\x38\x8d\x34\x80\x45\x74\xac\x9e\x9f\x16\x7f\x0c\xf7\x7f\x4e\xa5\xc2\xa2\x23\xaa\x80\xd4\x6d\xa0\xed\xcb\x10\x7e\x00\x18\xcf\x68\x40\xae\xdd\xd3\x40\x3d\x8d\x71\x6a\x08\x22\x9d\xda\xcc\x75\x61\x5b\x6e\xd6\x75\xfd\xef\xd5\xc5\x39\x35\x0a\xa5\x4a\x96\x98\x35\x95\x13\x10\x2b\xe3\x2c\x76\x12\xeb\xe7\xd3\xa9\xac\x1a\x3f\x61\xdd\xd1\x90\x91\xce\x73\x02\xef\xf3\xfc\x84\xe4\xa1\xd4\x58\xfe\xfa\xb1\xda\x78\x30\x0b\x8f\x82\xd8\x23\xfd\xbf\x89\xfa\xae\xac\xbe\x3d\x8f\x17\x70\x1e\x11\x40\x1c\x14\xda\x5b\x3e\xa3\x5e\xf8\x16\xa3\xfa\xa6\x63\xe2\x30\x1e\xa5\x80\x31\xf6\xf2\x71\x7d\x77\x99\x9b\x5c\x5b\x10\xe6\x2f\x33\x32\xda\x49\xa6\x34\x0f\x59\x91\xb5\x3b\xc2\xaa\x9d\xb0\xc9\x78\x6a\x71\x12\x25\xdc\x3f\xb2\xea\x38\xf2\xc9\x62\x9c\xa7\xb6\x44\x66\xf1\xf5\x23\xad\xca\xbe\xa0\xcd\xe3\x98\xf3\x61\xf1\xfc\x29\x03\x35\xef\x87\xcd\x78\x12\x01\xda\x7c\x3e\xa1\x67\xf0\x43\x59\xc0\xe7\x98\xe3\xc8\x78\xc2\x25\x72\x02\x9e\xca\x53\xaf\x21\x71\xa5\x8b\x30\x3d\x7b\xa2\x63\x17\xf8\x3d\x9e\x8f\x0f\xbe\x9e\xc7\x53\x1a\xc6\x0e\x2c\xfe\x80\x95\xb8\xa1\xb8\x9a\x1f\x93\x5a\x92\xc8\xbe\xc7\x38\x4f\xe6\x8f\x08\xac\x1f\xe4\xab\xa8\x7b\x46\xfa\x30\x62\xf1\xe3\x8c\xed\x37\x4a\x68\xea\x1f\xd0\x65\xe0\x5c\x06\xd6\xb8\xae\x6e\xca\xd3\x20\xcd\xe3\x52\x90\x38\x1c\xe2\xc1\x97\xe2\xb4\x6a\x5e\x37\x53\xa6\x01\xe3\x8a\x06\x08\xbb\xb7\xb0\x4a\xf4\x1a\xea\xce\xae\x98\xd5\xd3\xba\x59\x3d\xae\xee\xd6\xbb\xb1\x6f\xf5\xdf\xaa\xc2\x72\x1d\x30\xee\x95\x96\x9d\x82\xcb\x95\xc7\xa8\x59\x82\x3d\xf5\x65\x1b\xb2\xcf\x53\x17\xae\x7d\x07\x4b\x91\x31\x7b\x0b\x79\xf6\x6e\xfb\xac\xf8\x1d\x7c\x5e\xd3\xe4\xa2\x32\xe5\xd6\x6f\x1e\x8e\x37\x16\xae\x99\x40\xa6\xf1\x76\xf5\x78\xbb\x7e\xfc\xb6\xbf\xb9\xdf\x2c\x7f\xf8\x7b\xa3\xa5\x75\xb6\x51\x6e\x65\xe8\xfe\xae\xad\x06\xa7\x5f\xa4\x45\x8e\x33\x12\x91\xe5\x6e\x08\x90\x20\x72\xaf\xb6\x12\x15\xbe\x91\xc7\xb2\xb8\x74\x26\xf1\xc3\x23\x5b\xf6\xaf\x5f\xcb\x8f\x5d\x79\xaa\x47\xc5\x0f\x6e\x18\xc1\x4d\xe1\x28\x7e\xad\xeb\xfa\xdc\xa6\x1f\xc3\xb2\x31\x37\x0c\x62\x35\xaa\x58\xdd\x42\xad\xaa\xec\x74\xe1\x69\xc9\x62\x12\x44\xb8\xe3\x6f\xa1\xf0\x6e\xa6\xc3\x37\x3b\x26\x09\x19\x33\xbc\x87\xea\x5a\xb3\x4f\x35\x26\x2a\x80\xa1\x2c\x66\x3f\xcb\xe7\x35\x84\xdb\x4f\x68\x8c\x25\xf2\xf3\xdb\x85\xeb\xec\xf8\x6a\xb4\x41\x59\xab\x36\x08\x15\xc7\x2c\xbf\xf0\x15\x72\xe3\xa8\xb6\xe6\x1c\x28\x6c\x57\x6f\xcc\xa2\x02\xf1\xb7\x08\x6c\x2c\x66\x9c\xa2\xf4\xc6\xe3\xf3\xcd\xfe\x41\x74\xc5\xcf\x38\xa4\x36\xde\xd9\x36\xe5\xa9\x5f\x55\xfd\x41\x48\xb4\x85\xdb\x3f\x7c\x5a\x1e\xad\x2d\xd5\xef\x5d\xae\xe0\xc7\x45\xda\x20\xea\xb2\x4d\x17\xa5\xa8\xa1\x3f\xd1\x6c\x3c\x16\xc7\x42\x21\xa9\x32\x87\x83\xd7\x7b\x66\x71\x12\x2b\x94\x76\xdd\x41\xdd\x23\x8c\x47\xb7\x29\x31\x01\x6a\x2b\x7d\xa0\xc3\x58\x60\x79\x06\xa8\x95\x5d\x16\x7d\x1b\x37\x16\xb1\x41\x05\xd2\x02\x3e\xdc\x04\x9b\xbf\x25\x42\x70\x9c\x8d\x7d\x69\x63\x58\xce\x8c\x85\xb2\x5a\xf6\x37\x9b\x7f\xad\x07\xed\x80\x58\xb2\x90\x6b\x57\x7d\x1c\x44\xa6\xfe\x68\x4c\x94\x8b\x56\xee\xce\x85\xde\xfd\xeb\xca\xdc\x90\xda\x59\x4a\x63\x82\xba\x9a\x56\xb4\x63\xc5\x6d\x1f\xcf\x1a\xae\xdd\x66\xb5\x78\x2f\x3f\x3a\x67\xde\xf1\xed\x54\x09\xc7\xca\x51\xe7\x4d\xe9\x21\xef\x97\xf1\x6b\xac\x94\x50\x5e\x78\xe4\x7c\x42\x1c\xd5\x34\x97\x88\x95\xb6\xf5\x55\xcf\x4b\x7b\xbe\xd8\x0f\x62\x1d\x72\x64\x5a\x1c\x3f\x6f\xb3\x77\xbf\xca\xc6\x3a\xb4\xf3\xa0\xe7\x0f\x74\x62\x93\x93\x8f\x27\x09\x32\x8a\xac\x0e\xf6\x50\xfb\x80\xc5\x40\x39\xa6\xa4\xa8\x9c\xde\x66\xb2\xb6\xd9\xd3\xad\x73\x03\x51\x1a\xff\x09\x6e\xc9\x77\x8d\x9f\x39\x65\xfe\x0c\x38\x7f\x1e\xcb\x66\x08\x63\x8c\x21\xd6\x48\xfb\xcf\x8a\xec\x02\xb3\x33\xe1\xae\xba\x98\x2e\x09\x22\x9b\x37\x39\x22\xd8\xff\xcf\xd9\x9b\x2d\x37\x8e\x63\xf9\xc3\xaf\x53\x17\x7d\xc1\x05\x00\x89\x4b\x59\x96\x9d\xaa\xb2\x2d\xb7\x25\x67\x56\xcf\xc4\x84\x02\xcb\x81\xc5\x36\x45\xaa\x49\x2a\x6d\xf5\xd3\x7f\xc1\x03\x80\x9b\xe8\xac\xfa\xfe\x1d\xd1\x93\x3d\x26\x44\x51\x24\x01\x9c\xe5\xb7\x60\xc3\xca\x3a\xcb\x0c\x68\xab\x71\x1a\x08\xe0\x0e\x83\xf3\x34\xb1\x4d\xc1\x9e\x0f\xde\xad\xee\x01\xcd\xf2\xae\xdd\xe0\x30\x4e\x45\xe4\xd1\x33\xcf\x63\x91\x22\x3f\x24\x0d\xbc\xa8\xd3\xae\x7c\x16\x17\x80\x69\xc6\xf5\xc5\xa9\x45\x8a\x45\x8d\x6d\x03\x6f\xe5\xa0\x05\x92\x46\x9c\x41\x6f\x34\xe9\x89\xbe\xe3\xd7\x22\x8d\x64\x8a\xb9\xc0\x1e\x33\x5e\x54\x49\x19\xeb\x2f\x45\xc1\xe4\xfb\x22\x15\x03\x1b\x2a\xfe\x0e\xd1\x9b\x69\x64\x00\xa7\xb3\x06\xd1\x1c\x6e\x45\x23\xf6\x3f\x89\x3f\x16\x6b\x11\xa7\xbe\xf0\xbb\x30\x26\xcb\x33\xbf\x48\xd7\xdb\xbe\x5a\x92\x92\xd8\x60\xd4\x71\xbc\x3c\x94\x35\x0c\x98\xce\xed\x16\x2c\x70\x3d\xc9\xea\x1b\x84\x65\x4f\xfc\x55\xe2\x94\xa4\x60\x0d\x83\x0e\x7d\x53\x6c\x6e\x79\x4e\xa9\x24\xb1\xf3\x94\xeb\xe6\x3b\x3a\x80\x96\xdd\x6f\xa1\x26\xd1\x91\xdb\x6f\x06\xaa\x4a\x7e\x23\x0e\x27\x08\xf2\x30\x74\x9f\x4b\x92\x18\x39\x13\xb7\xb7\xbf\xaf\x76\xdf\x86\xf3\x20\x6d\x57\x49\x44\x6c\x55\xe5\x7f\xa1\xb8\x15\x97\x36\x74\x76\x91\x7f\x37\x26\x4d\x84\x18\xb0\x58\x6e\xce\x55\x31\xaf\x67\xe5\x3f\xa0\x63\x9c\x00\xed\x63\x6b\x1c\x8b\xb9\x2b\x1e\xa6\xa9\x92\x12\xb9\x12\x1f\xa7\x3b\xac\x0c\x0e\xf3\x93\x94\x4b\x86\x2a\x36\xcd\x14\x90\x33\x0a\x41\x66\xcb\x78\xa9\x54\x56\xe0\xa0\xc9\x8e\xb0\x3b\x88\xc6\x7a\x46\xdd\x9f\x45\x25\x8a\x06\x40\x0f\x7d\x93\xe3\x54\xc5\x54\x76\x0e\x77\xed\x8b\xf6\x5a\xf7\x22\xdc\xa3\xc8\x26\x55\x84\x62\xf0\xf2\x7b\x99\x15\xcd\x7a\xb9\xf1\x3b\xc7\xb8\x34\x9b\x2a\x9e\x22\xbc\xe3\x28\x3e\xdf\x3a\xd1\x99\x38\x55\xca\xd6\x00\xd0\x91\x30\xfb\xe9\xff\xac\x03\x6b\xbe\x89\x3d\x83\x5d\x85\xd8\xd3\x95\x2a\xeb\x4b\xdd\xc0\xb1\x1b\xc4\x24\x22\x6b\x8e\xe2\x73\x88\x40\x4c\x75\x02\xb8\x6f\xec\xc7\x90\xc1\x54\x8b\x10\x39\xd4\x08\x40\xbb\x2d\xb3\xf9\x6a\x7d\x0a\x91\x32\xd2\x5b\x70\x9c\x7b\x4e\x53\x9c\x1a\x92\xda\x17\xba\xc8\xf0\xb6\xf8\x13\x1b\xa9\x8d\x43\x01\xdd\xa0\x3c\xf3\x14\xba\x91\x1a\x43\x31\xb3\xb4\x31\x74\x27\x12\x6d\x8f\xf2\x80\x45\xa6\xbd\x37\x8f\xb7\xbb\x3f\x26\x20\xe5\xf1\xbe\xcd\x03\x26\x63\xed\x42\xe0\x76\x02\x2c\x3b\xc2\x71\xcc\x03\xb0\x68\x3e\xc7\xac\xe8\xba\x60\x77\x25\xe2\x75\xfd\xb0\x90\xd8\x52\x8c\xf6\xb5\x8d\xdc\x12\x4c\x9e\xa0\xb1\x75\xd3\xc9\xe6\xc6\x43\x61\x91\x67\x15\x8a\x5b\x75\xf4\xe1\xe7\x0a\x9c\x95\xe3\x57\x16\x08\x31\x0f\x65\x6c\x49\xd9\x28\x4e\x36\x8a\x25\x78\x28\x2d\x31\xde\xbf\xcc\xeb\xe3\xe9\x8a\x15\x37\x39\x5d\x44\xed\x6a\xb6\x15\xc7\xd3\xc4\x09\xef\x6b\x0c\x17\x0a\x8e\xd8\xa7\xa6\xe1\xb3\x2f\xbf\xb8\xed\x85\x7b\xce\xdf\x29\x17\x05\x34\x0f\x99\xf9\x35\x07\x3e\xe6\x94\xdb\xad\x53\x62\x1b\xc6\x4e\xf6\x1b\xd1\xa8\xc3\x35\xb0\xdc\xe7\xa0\x9c\x05\x29\x76\x6f\x57\xbb\xd7\xaf\x0a\xe8\xd7\x5f\xc4\x42\x9b\x78\xd9\x62\xd4\x75\x9c\xc5\x19\x91\x28\x29\x8d\x4e\xd8\x7f\x59\x98\x9f\xbc\x4a\x2c\xd1\x88\xf3\x72\x6a\x9a\xed\x4e\x32\xdc\x1c\x38\x4b\x00\x43\x09\xdc\x00\xda\xe9\xef\x7c\xd8\xfc\x61\xa9\x11\x31\xfb\x50\xbe\x59\xe8\xf9\x0f\xc8\x5e\xe0\x3f\xbf\x4d\x7e\x82\x16\x49\xdc\xb5\xde\xaa\xb2\x34\xd3\x49\x37\x45\xe1\xf3\x24\x96\xb8\xdd\x3f\x65\x0d\xd4\x87\xe1\x82\xcc\x13\x6d\x74\x5f\x20\x6d\xe6\x9e\xff\xdc\xda\xc7\x53\x9e\xea\xae\x01\xd8\xa6\xb6\x08\xa8\xf1\x67\xe5\x71\x8c\x6d\x4f\x55\x66\x85\xeb\xc0\xf6\xe1\x24\xe7\x84\x73\xd7\x14\xbc\xc5\x36\xcf\xe8\xdd\xe2\xca\xca\xa2\xb4\x2b\x42\x86\x06\x6b\xb6\x75\xdb\x2e\xde\x55\x1b\xa3\x4c\xba\x10\x9c\x6b\x81\x59\xc0\x7f\xcb\xf2\x58\x09\x63\x72\xb8\x03\xbf\x70\x71\xc1\x2c\xc2\x03\xf1\xb6\xc8\x67\xd0\x16\x81\xe9\x07\xc8\x28\x42\x1c\xe0\xff\xac\x36\x4f\xcf\x15\xd6\xec\xb7\x33\x41\xfe\xaf\x6b\x2f\x5c\x92\x00\xd1\x09\xce\xb6\x02\xd7\x90\xc9\x8b\x38\x3d\x51\xbf\x69\x73\x29\x2d\xe1\xcf\x0a\x9c\xe8\x9b\x2f\x52\x4d\x2e\xb5\x11\xd2\xf7\x5b\x1a\x07\x57\x24\x81\x3b\xaa\x98\x4e\xad\x00\x49\xa3\x0e\x57\x00\xd3\xab\x80\xb0\x9b\x48\x2a\xb1\x6a\x36\x7b\x25\xf2\x73\xbb\x06\x37\xde\xba\xc2\xcf\x67\x25\x21\x0d\x06\x62\xbc\xc7\xac\x58\x14\xba\xbd\x4d\x4f\x65\xbb\xeb\x75\xf9\x0e\xd7\x91\x85\xf5\xb4\xdb\xc4\xb2\x3c\x1e\xcb\x62\xb7\x7b\xc4\x17\x6e\xed\x8d\xb4\xb1\x3b\x83\xab\x87\xcc\x85\xaf\xe4\x73\x90\x1a\xc1\x55\x77\x9b\x87\xf5\xe8\x05\x35\x22\x40\x1b\xe1\xff\x9c\xa1\xba\xbc\x20\x02\x77\x29\xf2\x5c\xb6\x09\xfb\xc4\x4b\x60\x80\x63\xe1\x46\xea\xb4\x2b\x22\xd7\xb7\x59\x7d\x82\xa2\x07\xde\x70\x63\x0c\x96\x55\x06\x81\xbe\x08\x44\x88\x8d\xb3\xb7\xec\x27\x7c\xd1\xc9\x14\x81\x06\xab\xc3\x8f\x34\xec\x59\xd3\xe7\xe1\xcb\x2c\xc2\x88\xa4\xc1\x88\x38\x34\xbc\xb1\x22\x8c\x29\xc6\x26\x7b\x99\x7d\x4d\x4f\x98\x5d\x6b\x44\xc8\xad\xd2\x72\xbb\xcb\xef\x0e\x55\xf9\x61\x8b\x32\x4f\xf0\xf1\x02\x56\x64\xf5\xa9\xb4\x85\xe3\x5e\x42\x2f\x16\x91\x88\x91\x7b\x62\x29\xaf\x59\x73\xf9\x32\xab\x9d\xdf\x2f\x44\x9c\x00\x06\xf2\x05\x7c\x58\xa5\xe3\xd1\x46\x2f\x48\x22\xb1\x5b\xdc\x29\xe5\xb9\xbf\xd3\x38\x14\xae\x1c\xd7\xbe\x36\x0e\x0b\x3e\x8d\x6b\xc6\xbf\x30\x09\x40\x59\x44\xea\xe7\xfe\xad\x14\xb9\x2f\xba\xfb\xc3\xa1\x75\x8e\xd3\xb6\xac\x34\xa4\x41\x4d\x78\x4d\x22\xa1\x04\xe3\xa9\xdd\xe6\xa5\x23\x1a\x8a\x84\x27\x26\xf4\xe6\x91\xce\x86\xdf\xf2\xf4\x87\x2a\x58\xdd\xe0\x14\x59\x5d\x56\x72\x66\x5a\x29\x9b\x8c\x35\x16\x95\x0f\xca\xd1\x2d\x7f\x54\xed\x02\x36\xf6\xe3\x9e\x77\x53\x8d\x45\x1a\x47\xd8\x64\x41\x59\x0d\x31\x8a\xf7\x44\xca\x42\x41\x3c\xc8\xf3\xa2\xab\xef\x19\x7c\xcc\x49\x62\xc6\x22\x4d\x8c\xe5\x68\x21\x2b\xdb\x2d\x6b\x0e\x7c\xd6\x53\x93\x63\x91\xca\x30\xb6\xe5\xfb\x19\xb8\xde\x3c\x76\x7e\xf2\x63\x53\x69\xa5\xa1\xe1\x78\x6a\xa6\x75\x5d\x91\x42\xc4\x95\x0f\xe2\xaa\xaa\xfc\x98\x92\xc9\x44\x0a\x34\x40\x63\xa9\xb3\xec\xab\x5e\x36\xec\x19\x51\x7b\xdc\x70\x4e\x00\x65\x73\x9d\xb9\x5f\xbd\x2b\x3d\x8a\x60\xeb\x9f\x47\x5f\xa5\x16\x3c\x21\x08\x89\x3f\x7a\x29\x98\xfa\xb7\x2f\x7e\x62\xbf\x16\x0b\x9e\xa4\x3c\x1e\xdc\x3a\x7c\xd2\xab\x8e\xe6\x29\x38\xd7\x51\x87\x8b\xba\x2a\x54\xf9\x41\x92\x62\x73\xd7\x0a\x3a\xdc\x0e\x94\x6d\x9f\xab\xf2\xf3\xd2\x9d\x4b\x4b\x4c\x5c\x1c\x0f\xba\x9e\x42\xe2\x84\x08\xc2\x14\x5c\x2f\x7f\xe0\x30\x37\xf9\x36\x11\x2b\x06\xfd\x8e\x89\x33\x21\xcf\xea\x66\x94\x5f\x0b\x11\x1b\xd9\xf1\xf6\xc6\x1e\x14\xc3\x1f\xe1\x98\xfd\xb1\x10\x2c\x92\xce\xf2\xe8\x54\x16\xb5\xf8\xe9\x55\x3e\x63\x21\xc0\xca\x59\x65\x35\x62\x29\x7a\x4b\x8e\x58\xc8\x94\xf0\xa8\xf7\xe4\xbb\xff\xb1\xb0\xe1\xe1\xe8\xf5\x94\x20\x4c\x3c\x70\x63\x07\xbd\xeb\x50\xf8\xbf\xcd\x3c\x13\x15\xa7\x6e\x67\x53\xef\xe7\x93\x11\xd5\x71\xdd\xc0\xb1\xfe\x3a\x38\x14\x8a\x6a\xec\x68\x9e\xaa\xec\xbf\xdd\xb5\xa9\x14\x42\x57\xce\xc0\x4d\x2b\xfb\x6f\x6f\x5b\x3e\xbe\xa3\x4a\x59\x2c\xbd\x12\x56\x6c\x71\x57\xe2\xaf\x58\x7d\x2a\x38\x5d\x93\x58\x84\x36\x04\xbd\x8c\x1d\x13\x6b\xb9\xb9\x2a\x7d\x09\x08\x19\x32\x12\x54\x79\x3c\x0e\x18\xb7\x02\x52\xea\xb5\x43\x87\x5a\x47\xb1\x00\x15\x63\x7f\x53\x62\x23\xc6\xbb\x0a\xf9\x83\xa0\x31\x7f\x40\xd9\x45\x34\x92\x1b\x3f\x6b\x30\x91\xec\xf8\x4f\x9e\xc3\x66\x87\xf4\x7a\x11\xb1\x30\x11\x60\xe9\x64\xf7\x63\xb8\xe5\xca\x20\x35\xd4\x75\x88\x94\x68\xfe\x05\xa2\x42\x65\xd8\x19\xba\xb7\x0c\xb8\xc0\x95\xf5\xdb\xb9\x78\xab\x06\xc5\x17\x19\x06\x04\x95\xcc\xef\x7d\x5f\xc2\xfd\x3d\xa2\x1c\x31\x67\x0e\x8b\xd3\x47\xde\x32\x62\x02\x23\x6f\xdb\x5b\x76\x3c\x77\x7f\x30\x4e\x09\x96\xc9\x6d\x07\x0d\xa3\xde\x8d\xe9\x37\xe9\xd1\x1a\x2a\x63\x1e\x47\x36\x9b\x28\xdf\xff\x00\x38\x75\x11\xb6\x24\xd4\xa2\x76\x1f\xd7\x4f\x96\x9c\xbe\x5f\x3c\x0e\x60\x6d\x92\xb0\x40\x71\xd4\x1d\x2f\xdf\x3d\x39\xa1\x3b\xc6\x05\xaa\xd5\x54\x65\x9e\x6f\x6d\xd2\x3c\x7a\xc4\x92\x52\x0b\x15\xc5\xf8\xe8\xe6\x7c\xb9\x2b\xab\x6d\x79\x84\xb2\xe8\x7a\xd3\xa3\xc9\x2d\xa9\x08\xa9\x47\x4c\xae\x4e\xa5\x3a\x74\x8c\x77\xc9\x02\x82\xba\xb1\x76\xc7\x43\xab\xa1\xa1\xb6\x62\x2c\x59\x18\xc6\x96\x57\x60\x91\xa1\x43\x07\x97\x58\xb2\xc8\x0a\xc7\xe2\x9d\xff\x2e\xce\xf9\x04\xdb\x23\x93\xd0\x2a\x0a\xd4\xd0\x3c\x3a\x33\x72\x57\x02\xba\x82\x81\x4d\x3e\x28\x19\xf3\xb2\xf0\x8f\xe2\xf3\x56\x64\xf9\x05\x5b\xf4\xd3\xa8\x5c\x8a\xd8\x0a\x88\x64\xa8\xed\x39\x57\xe2\x95\xc2\x39\x87\x7a\xd1\x72\x4c\x57\xcf\x23\xad\x91\xf1\x07\x64\x10\xa2\xdd\xe2\xcf\x0c\x3e\xac\x2a\x76\x0e\xd7\x46\x19\xb1\x94\x31\x21\x03\xde\x8b\xeb\xb8\xcc\x2e\xd5\x52\x0a\x89\x6f\x30\x62\xd3\xd0\x95\xf8\x16\x7e\x66\xb8\x30\x60\x33\xa4\xe9\xa7\x9d\x94\x92\x60\xc8\xf0\xb8\xf8\x73\x7f\xbf\xd8\xee\x9f\x5f\xd6\x4b\x1f\x4f\x48\x15\x49\xa4\xd5\x17\xf0\xe1\xa5\xc3\x7f\x9b\xdb\x32\xa5\xe6\x2c\xf6\xd2\x5e\x13\xd1\x91\xf9\xa0\x4b\x82\x88\x10\xf2\xa9\x44\x9e\x17\x65\x83\xb3\xba\xbf\x2a\xa3\xad\x55\xf4\xa9\xcc\xb1\x56\xb6\x2e\x94\x3b\xa4\x02\xa2\xe2\xc8\xcb\xc6\xf5\xbb\x95\x3f\x9a\x0a\x6d\x86\x96\x70\x0f\x0b\x63\x26\x63\xc2\x20\xf1\x2a\xad\x8f\x1d\x61\x71\x32\x26\x02\x62\xa3\x58\x0c\x4c\xb0\x35\x88\xf4\x89\x4d\x81\x90\xe3\xa6\x7e\x1e\xa9\x55\x5d\x2f\xf0\x2a\x6e\xb7\x4c\xdb\x67\x7d\x29\xf3\xf1\x6e\xa1\x62\x50\xd6\xce\x6a\xf3\xf4\xba\xdd\xbf\xac\x7e\x2c\x5e\x3c\x07\x56\xc5\xc6\xba\x4b\x62\xf9\xd6\xdb\x4e\x5b\x71\xb0\xae\xc0\x1f\x46\x6e\xb5\x52\x44\x86\x56\xf5\x75\x64\xa3\x17\x75\x36\x7a\xb1\xa2\x61\x82\x60\x95\xf6\xf2\xef\x72\xf1\xd6\xfd\x3d\x65\x91\x53\x40\x5e\x2e\x36\xff\x7f\xa9\x2f\xfe\x24\xc2\x52\xc5\xe5\xf9\xb2\xcb\xd4\x3b\xf4\xb0\x8b\x6b\x89\x49\xff\x11\x1d\x62\x84\xd0\x2e\x58\x37\xaf\xff\x1a\x2b\x6a\x28\x06\x0c\xbb\x36\xde\xac\x04\xf4\x5a\x95\xb8\x55\x0c\xc4\x8f\x63\x95\xc4\x3a\x76\x14\xf5\xec\x78\x3e\xe2\x56\x36\x5c\x4d\x54\xc2\x05\x4a\x6e\x41\xd1\x40\xb5\x29\x6e\xe0\x20\x72\xb3\x31\x33\x57\x37\x9a\x67\x2a\x8d\x2c\x80\x42\x82\x2a\x8f\x70\x7b\x7e\x87\x39\x94\x98\x12\x61\xa4\x98\x4b\x1f\x9b\xf2\x66\xf2\xf6\x08\x63\x75\x7a\xed\x7a\xbc\x5a\xbc\x3c\xfc\x6b\xfb\xfa\xfc\xbc\x79\xe9\x05\xac\x62\x25\x03\x85\xdb\xe4\x51\x7c\xee\xfa\x56\x65\xbb\x73\x9b\xaa\x8f\x3e\x94\x24\xdc\x38\xa9\x1d\xbc\x03\x16\xed\xf9\x17\x7a\xb8\xb1\x92\x29\xc5\x32\xdf\x29\x17\x97\xe1\x6e\xa5\x24\x24\x84\xcc\xf1\x48\x6e\x2e\x9b\x29\xd6\x59\xa9\x98\x62\x3b\xbe\x0d\x37\x3b\x1b\xe2\x71\xdc\x39\x3b\xbd\x95\x62\x9d\x83\x6d\xe7\xd0\x37\xa2\x36\x29\x95\x5a\x59\x75\xdf\x83\xfa\x71\x80\xc2\x56\x9b\xa7\x7d\x2e\xa5\x64\x8a\x2e\xce\x3f\xcb\x06\x36\x85\x87\x36\x0d\x5a\x04\x4a\xc7\x81\x71\x85\x68\x2f\xfd\x6a\x93\xd2\xff\x0d\x13\xf6\x7f\xd7\x08\x20\xa5\x13\x15\x78\xeb\x48\x31\xdd\x12\x14\x70\xbb\x42\x9c\xda\xc8\xd6\xbb\xd2\xcc\xde\xf0\x2f\x72\x1e\x05\x32\xc0\xd7\xf8\x5f\x50\x3f\x95\x57\x0a\x07\xbf\x02\x13\x2a\x13\x0a\xdd\x77\x1c\x5d\xe9\x1f\x6f\xbc\xe3\xc7\x7d\xf1\x31\xc6\x9c\x40\x40\xa1\xff\x38\x3e\xa3\x95\x85\x3f\x04\x86\xf9\xa2\xfe\x0b\x1c\x45\x36\xe0\x5f\x2a\x63\x18\x6a\x6e\x74\x60\x21\xff\x1b\x74\x10\x85\x9a\x0e\x0d\x38\x70\x82\xbb\xdd\xcc\x87\xa5\x3a\x88\xac\xe0\x81\xb6\xfc\xc7\x9d\x13\x08\xe8\x33\x32\x1d\x24\x1c\x53\xa6\xe7\x87\xc5\xee\x6e\xf3\xf2\x88\xd4\xa7\xe7\xd5\xcb\x3e\x0c\x82\x20\xe8\x46\x49\xc0\x32\x3d\xce\x96\xfd\xfa\xe9\xfb\x1e\x17\x47\x7f\x38\x0c\xac\x46\xf9\x7d\xf6\x13\x84\x39\x77\x2b\x81\x0e\x63\xca\x5d\xf6\xbe\x03\x75\xd8\x5a\x58\x54\x77\x14\x98\x76\x5a\x13\xa3\xba\xa2\x3b\x1c\x09\x9e\x7a\xe5\x73\x5b\xe0\x74\xee\x62\xf7\xa5\x98\xb0\x26\x75\xa4\xac\x1d\xac\x6b\x30\xee\x3c\x59\xf4\xb6\xcc\x73\xe1\x43\x2a\x1d\xc7\x46\x0d\xcd\x11\x86\x8b\x92\x8e\x0d\xc1\x56\x91\xcc\xf4\x7d\x66\xbe\x00\x30\x68\x12\x3a\x47\xe0\xf3\x95\x8e\x9b\x1b\x41\x75\x9a\xba\xa2\xd9\x16\xaa\x9f\x50\xf9\x97\x7e\xe4\x14\x79\xf5\xd6\x6b\x0a\x0c\x4b\x16\x17\x10\x55\x64\x63\x68\x7f\x69\x2c\x09\x90\xcd\x24\xe7\x78\x2c\x9a\xa9\x4e\x7d\xe5\x2e\x13\xcd\x8c\xb6\xec\xe8\xfa\x18\x10\x5f\x1a\xc1\x3e\xac\xc5\xb2\xdd\x64\xf3\x8a\x64\xb1\x4e\x08\xa1\x49\x1f\xdc\xb4\x2f\x8f\xb5\xf8\xf1\xc7\x4d\x88\x05\xb3\xbb\xf5\xcb\x76\xb7\xdf\xad\x57\x2f\x53\xf6\x86\x4e\x19\xe7\xd6\x58\x40\xe5\xa2\x82\x27\xf8\x80\xea\x3b\x54\x03\x78\xb2\xe6\x21\xe0\x03\x44\x3a\xf9\x73\x59\xe6\x57\xc9\xa9\xe6\x90\x62\xd6\xd3\xce\xf7\xc2\x31\xb0\xbf\x78\x06\x82\x58\xc9\xa1\xba\xac\x1a\xa7\xfc\xe3\xba\xe4\x6e\xe5\xa1\x7e\x86\x08\x1a\x63\x2b\x25\x07\xd3\xf0\x60\xf2\x56\x09\x6e\x52\xdf\xac\x53\x07\xb8\xbe\x24\xa1\x38\xfe\xf6\xa3\x78\x87\x9d\x38\xed\x3a\xd2\x8d\x96\x61\x22\x7b\x05\xce\x2f\x6e\xad\x64\x2c\xb1\xda\x3d\xdf\x90\x98\x70\x72\x56\x58\x20\xd4\xa1\x8b\xb7\xb4\x14\x06\xa3\x40\x5b\x5a\xdc\x9e\xfa\xce\xad\x96\x5a\x30\x47\xc3\x5d\x58\x7f\x2b\xd7\xba\xf7\xd1\xf4\x17\xc5\x60\xf7\x71\xa5\x23\x54\x78\x3f\x8a\x4f\x87\xbe\x5e\x17\xd8\x52\xf2\xe7\xd7\xa1\xa5\x50\xd7\xd0\x3c\x81\x55\x32\xb4\xda\xf9\xd3\xc2\x8a\x86\x30\x45\x29\x40\xbf\x63\x3c\x5e\x2c\x63\xdc\xb5\x3f\xfd\x72\xa7\x41\x10\xe9\xae\xf8\x51\x55\x16\x2b\x74\x57\x56\xf7\x62\x82\x6e\xd0\x20\xa5\x04\x8f\xb1\xe8\x8b\x35\x4e\x6c\x6c\x7d\x3b\x5e\x2c\x20\x60\x0a\x43\xf0\x67\x71\x79\x16\x97\x41\x66\x08\x61\x90\xb0\x68\x88\x52\x5a\x6b\x10\x37\xe7\x8b\xb5\x4f\x1b\x7f\x2b\x84\x5a\x49\xb7\xf5\xbc\x94\xe7\x06\x4d\x7f\x6e\x2e\xb6\xf2\x38\x1e\x19\xc5\x24\x72\x4a\x70\x96\x58\x60\x85\xe6\x77\x6d\x62\x53\x88\x7c\x14\x52\x42\x94\x4a\x21\x7b\x93\xc7\x99\x38\xcc\x2f\xd9\x10\xc9\x50\x3a\x4f\xda\xbd\x05\x0c\x4f\xbe\x98\x04\x41\x68\xc5\x00\x70\xf7\x73\x59\xfc\xe8\x69\x00\x89\x24\x26\xf3\xff\x03\xc5\xc2\xc7\x9a\x40\x84\xd5\x43\x93\xe7\xaa\x68\x13\xa8\xb1\x96\xa4\x1f\x24\xb9\xe9\xdc\x14\x7f\x2f\x27\xa1\x37\xd0\x20\xa1\x03\xe7\x06\x2b\xce\x66\x11\x3f\xe3\x2b\xa0\x24\xf6\x5c\x0a\x75\x3b\xb4\x0f\x68\x0f\x09\xd4\x26\x59\x8a\xea\x16\xaa\xc1\x16\x7a\x27\xf2\x29\xfb\x08\xa8\xe2\x58\x94\xed\x5a\xa1\x83\xba\xeb\xca\x65\x4b\xb3\x6b\x00\x24\x31\xe7\x8e\xfe\xef\xc8\x24\xa3\x0a\x1f\x99\x0e\xa7\x21\xef\x80\xc3\x58\x38\xcb\x14\x98\xb2\xba\x15\x27\x3f\xa9\x21\x49\x02\xa4\x95\x78\xe1\x05\x9b\xef\x3a\x9d\x87\xbf\x28\xa3\x4f\xbf\x8e\x07\x71\xcf\x18\xde\x62\x41\x74\x7c\x07\x13\x49\xd0\x32\x5e\xa1\x07\xd5\x8f\xcc\xbd\x66\xdd\xb5\x28\xc6\xa8\x5b\x7a\x10\x52\xd8\x1d\xd0\x04\xc5\xe9\xad\x15\x28\x0a\xe7\xad\xda\x2c\x0a\xa6\x8f\x3a\x4d\x13\x0c\x2e\xb6\xd9\x1b\xe6\xd3\xe3\xaf\xe7\x69\x80\x6d\xb1\xbd\x05\xe9\xa3\xc1\xbb\x41\xd9\x1a\x8b\x92\x70\xe1\xc8\x20\xab\x02\x9e\x2a\x94\xf2\x58\x6e\xb6\xdb\xd1\xb5\x72\xa9\xf0\xc7\xda\xb8\x7d\x7b\x2a\x8b\x1e\x7e\x01\x5c\x49\xa4\x61\xde\x64\x55\x73\xf8\xe2\x59\x0a\x46\x10\x18\x54\xb4\x79\x78\xe5\x6d\x49\xba\x37\x5b\xb0\xc4\xe2\xef\x76\x8b\x97\xdd\xfa\xe9\x7e\xbf\x7b\x7d\xd9\x3d\xac\x7c\x7c\x02\x52\x58\xa9\x7c\xe1\x8a\x7f\xe5\x16\xe9\xcf\xb3\x8b\x22\xa8\x20\xb2\x70\xcc\xb3\xc4\x35\xbb\xdf\xa4\x40\x05\xcc\x1a\x76\xe5\x20\xaa\xdf\x85\x7a\x3f\x95\xcd\xb5\xdb\x5a\x0c\x8a\x06\xa8\x25\x74\xbb\x5a\xae\x1f\x17\x0f\xc3\xbd\x10\x54\x42\xb1\xff\x67\xe1\x9b\xed\x6b\xfc\x5a\x58\xb2\xcf\xed\x15\x5a\x08\x94\xd4\x88\xb0\xcc\xea\x95\x75\xfc\xf7\x22\xd9\xe3\xdb\xa3\x43\xe2\x1d\x3d\x6f\x33\x71\x2c\xa7\xd5\x40\xd0\x24\x15\x64\xf0\x72\x6f\x55\x79\x9a\x2e\x7d\x5a\x5a\xdf\xe8\x37\x68\xec\xb2\x7c\x3b\x9d\xd4\x26\x88\x13\xec\x3a\xde\x21\x31\xef\x16\x72\x71\x19\x98\x21\x4d\xc6\xf2\x28\x10\xae\x25\xfb\x88\x34\x99\xdf\xfc\x11\x99\x20\x04\xe3\x03\x57\x85\xbb\xee\xcf\x5a\x13\x57\xa6\x68\xe7\xd7\x15\xcb\x63\x74\xb5\x26\x0c\xc2\xb4\xdf\x5f\xdb\xd4\x79\x24\x75\x31\x3f\xeb\x4c\xc8\x2c\x9c\xe9\xfe\x05\x95\x42\x0e\xd6\x1b\x64\xf6\x3d\x30\x91\x13\x28\xd9\x6b\x87\xe4\x32\x65\x75\xbd\xd4\x9a\x08\x08\xde\x5a\x51\x74\x45\x56\x13\x87\x01\xe2\x03\x4f\xed\x1a\xe2\xdf\xb6\xf1\x95\xc4\xa9\xc6\xd8\xf7\x1e\x9a\x6d\xf6\x56\xf8\x68\xe8\x57\xc9\x87\x21\x3c\xc6\xd8\xb3\x3c\x37\x9b\x9f\x50\x21\xf1\x70\xed\xc3\x04\x43\x8c\x65\x3e\xdc\xb7\xef\xd2\xd0\x75\x33\x36\x34\x08\xb0\x8d\x81\x3a\x88\xcd\xe1\x31\xcb\x41\xbc\xc1\x73\x99\x4d\xc9\x7c\x86\x06\x29\xc2\x58\x6a\x68\x1e\x40\x98\xf9\x1a\x96\xa1\x91\xc2\xa0\xe9\x43\x54\x55\xd6\xcd\x64\x43\x59\xec\x12\xbd\x02\x2a\x8c\x7a\x8e\xa7\xf6\x1a\x77\x50\x1d\xeb\xe9\x17\x71\x26\x3a\x7b\xe9\x21\xf4\xc7\xb0\x90\xfb\xf7\x00\x4b\x0b\xfd\xe6\xeb\x5b\x05\x86\xa5\x29\xbe\xaa\xbb\x43\x56\xbc\xd5\xea\x20\xb2\x62\x06\xa6\x69\x98\xa4\x98\x75\x1d\x61\x80\x7a\x30\x89\xe9\x25\x5c\xbd\x2f\xd5\xc4\x34\xc1\xa3\x85\x0c\xa7\x04\x83\x10\x79\xbe\xac\x97\x9b\x51\xcd\xdb\x70\x46\x82\x60\xc0\x34\xb1\xee\xcc\x96\xf1\xd1\x0f\x92\x02\x0b\xab\x15\x34\xe7\xaa\xe8\x99\x64\x86\x2b\x8d\x14\x2d\x94\xfd\x40\x5e\x62\x59\xad\xbc\x96\xc1\xf8\x67\x08\x6a\x09\xd8\x4d\xd5\xa7\xbb\xe3\x9b\xa9\x82\x18\xfd\x96\xee\xcf\x83\x0a\x6a\xb7\x01\x8d\xff\x99\x7c\x92\xc4\x18\xb6\x59\x31\xca\x7e\x2d\x37\x4a\x0a\x6f\xec\x6b\x9d\x8a\x1c\xc3\x52\x5c\x5d\x9e\x32\x21\x0a\xd6\xec\x6b\xd5\x5c\x89\x0d\xfc\xba\xa9\x6c\x20\x88\xf1\x2e\xec\x5d\x67\xc6\xe2\x36\xee\x00\xe6\x95\x41\x0c\x90\x14\xe1\x5f\x79\x29\x7a\xc7\xfe\xa1\x42\xc0\x98\x37\x62\x80\x59\x26\x6e\x0d\x87\xca\xe2\x4d\xfd\xfd\x07\x6e\x85\x3e\x33\x55\xee\xbc\xde\xea\x38\xee\x36\x26\x32\x68\x57\xf9\x01\x99\x7f\x32\x83\x4e\x8a\x31\xdc\x86\x31\x8f\x8b\xe5\x08\x73\x68\x8c\xe2\x2e\xc1\x2a\x2c\x40\x6b\x57\x0e\xf1\xb3\xc8\xaa\xc5\x0d\xba\xac\xa1\xda\x7c\x35\xc7\x0c\x18\xd4\xf1\xf8\x1f\xa8\xca\x17\x7c\x7b\x86\x35\x77\x12\x04\x91\x8c\x03\xd7\xe0\xc9\x9a\xd5\xb9\x2a\xbb\x23\x09\x47\x76\x8b\x3c\x5f\x86\x05\x0a\x7f\x38\xe4\x80\x1a\x20\x37\x9b\x1b\xff\xa7\x28\xb0\xf6\x1c\x55\x3b\x5b\x47\xe6\xf4\xed\xb1\x34\xb0\xf0\xf5\x6f\x20\xf2\xe6\x70\xe9\x0e\x90\x90\x93\xee\xd5\x46\xc2\x8b\xe8\x8e\x25\x56\x53\xeb\xb8\x3d\x1f\x5f\xc4\xc7\xf6\x04\xfe\xb6\x92\x80\x84\xd6\x3e\xd1\x29\xb1\x0c\x7b\xf2\xdd\x90\xd8\xd2\x58\x5c\x19\xcc\x6e\xf7\x73\x30\xb1\xff\x07\x39\xa0\x5f\xd6\x4c\x49\x40\x52\x6b\x17\xe2\xac\x8a\xca\x32\x1f\xc9\x66\xbb\x51\x2c\xd2\xb8\x4c\x6e\xdf\x2f\x83\xd5\xc7\x1f\x8c\x43\x12\xf4\x9e\xf8\xaa\xc9\x7e\x66\xcd\x58\x60\x94\x04\x8c\x46\xf8\x78\xf1\x7b\xda\xf0\xab\x53\x9e\x9f\x69\xb0\xb7\xc3\x15\x06\x49\x8b\x3c\x13\x75\xf7\x45\x52\xfa\x7e\xb3\xeb\xb6\x0d\x0a\x1a\x24\x48\x94\x92\x96\x7d\xed\x0c\xaa\x27\x97\x90\x86\x1c\x17\xc2\x5c\xb8\xd6\xad\xa7\xd9\xf8\xe3\xb1\xb6\x0b\x25\xfe\x79\xff\x26\x8e\xb0\xcf\x8a\x9f\x59\x73\x25\x9b\xf5\x8f\xf3\xd0\x71\x63\x50\xdb\xe8\x88\x91\x73\x1b\x1a\x09\x52\x6d\x71\x3e\xed\xf2\x5a\xb4\x6b\xdb\x22\xf7\x5a\x1d\xdd\x55\xf0\x80\x81\xf7\x60\xc1\x9e\x3e\x1a\x8d\x5c\x41\x26\x48\xc0\x53\xe6\x95\x64\x96\x22\xcf\xdb\xff\x82\xf6\x1e\x01\xc3\x64\x91\x04\x1c\xb4\xb1\x60\xb2\xb2\xac\xc1\x66\x07\xde\xf8\xde\x7f\xaf\x48\x22\x8c\x29\xf7\x1e\x16\x3c\x7a\xc6\x22\xa1\x98\x6e\x3a\xd3\x88\x9b\xf3\xa5\x5d\xb4\xe6\x16\x39\x12\x08\x4e\xad\x7a\x5c\x25\x8a\x66\x60\xa1\x3e\x1e\x25\x09\x45\xc7\x23\x4f\xe4\x1e\xb5\xd1\xfe\xe6\xcb\xab\xa2\x18\x35\xc3\xb7\x4d\x59\xc0\xe8\x7a\x75\xcc\x78\x34\x74\x90\x03\xbd\x70\x76\xc1\x93\xeb\xd0\x69\xec\x25\x6d\xbc\x0c\xf7\x1a\xc9\xf0\x4f\xe5\x94\x2d\xd6\x0e\x36\xde\xb4\xc3\x76\xa1\xaf\x58\x6f\x24\xd0\x3a\xa6\xb2\x93\xa2\x76\x32\x07\x7a\xf2\xad\x40\x19\xee\xe8\x15\xbc\x9d\x73\x51\xed\xdb\xa8\xb1\x7b\xcf\x21\xf5\x15\x28\xec\xf1\xa3\x7f\x74\x35\xc6\x7e\x90\x30\xa0\xa0\x5d\xe4\xd2\xa3\x4a\xd3\xf1\xa3\x08\x03\x11\xb8\xce\x40\x73\x1e\xdb\x98\xb9\x2d\x9f\x84\x21\xb5\x6d\xe1\xc5\x49\x55\x5a\xfc\x0f\xc8\x0c\x67\xb8\xff\x9a\x28\x88\xa2\x60\x10\x49\xef\xda\x55\x6c\xfc\x63\xc2\x28\x8d\xd2\x8e\x28\xdf\x7d\x50\xd1\x88\x75\x52\xd6\xb0\x7f\xbf\xa8\x3d\x16\xbb\xda\x2c\xdf\x75\x7e\x67\x67\x49\x48\x0d\x41\x42\xec\x5e\x68\x7d\x2b\xb2\xf9\xb7\x2c\x64\x01\x60\xd8\x64\xf9\xff\xf8\x16\xc1\xbe\x63\x9d\x75\x90\x2c\x12\x32\x0a\xa8\xdb\x8d\x91\xd7\x2d\xf8\xf7\x6d\xf8\xba\x84\x4c\x87\x88\xf9\xb4\x04\xf8\x2f\x91\x3a\xf3\xd7\xcb\x0c\x93\x96\xe2\xd0\x86\x6f\x03\xcd\xf2\xf6\x90\xf0\xd6\xb9\x37\xd0\x3c\x79\x17\x27\x12\x26\x61\x82\x19\x13\xfa\x23\xee\x4f\xa2\x6a\x0a\xa8\xc6\x78\x24\x12\x26\x11\xc7\xca\xc7\xb9\xf0\x21\xf9\xed\x62\x33\x53\xc5\x20\x61\xc2\xa8\x06\x0f\x04\x9a\x85\x7b\x91\x30\x51\x31\x3e\xe8\x71\x01\xe5\xd7\x33\x2c\x4c\x14\xc3\x4a\x37\xd6\xab\x87\x96\x61\xee\x78\x9a\x68\x64\xfd\x1c\x6d\x85\xe0\x72\x6b\x75\x09\x67\xf7\x78\x12\xa6\x86\x3a\xf0\x0a\x32\xc1\xe6\x8d\x04\x7b\x3c\x12\x09\xb9\x09\x51\x98\x04\x4f\xbf\x50\x0a\xea\x7a\x5d\x8f\x94\x8c\xdd\x40\xa1\x25\x42\xf5\x9f\xcb\x32\x77\x0f\xd1\x1d\x91\xa1\x8e\x10\x31\x59\xba\x58\x15\x74\x17\x55\xba\x21\x2a\x88\xb0\x4c\xae\xa1\x81\xaa\xdd\x5c\xb0\xde\x6b\xd9\x05\x9b\x73\xd3\xe6\xf0\x93\xfb\xad\x54\xc0\x5d\xee\xb8\x6e\xe0\xb8\x6d\x4a\xef\x4d\x15\xba\x35\x37\xd4\x01\xc7\x60\xdc\x6a\x52\xde\x96\x45\x17\x4a\x91\x50\x33\xeb\xc5\xe6\x74\xda\xa1\x7a\x14\xc5\x59\xe4\x9e\xb5\x48\x42\x10\x02\xdd\x72\x8c\x78\x87\xa7\xb2\xbb\x50\x00\x82\xf8\xe7\xc7\xc5\x9f\xfb\x7f\xbe\x2e\x9e\x76\xeb\xdd\xbf\xfc\x31\x93\x68\x0c\x60\xa1\x39\x60\x80\x3f\x36\xbb\x25\xa1\x91\x29\xb1\x2b\xa2\xf5\xda\xbc\x86\xb5\x90\x28\x88\x18\x2a\x5e\x8c\xd5\xf5\x49\x14\x08\x8e\x31\x91\xa5\x36\x0c\x26\x4e\x14\x68\x85\xaa\x1e\x58\xab\xbd\xad\x32\xd1\x1d\x09\x53\x12\x32\xc7\x45\x3b\x62\x29\xd3\x52\xd3\x27\xaf\x6e\x14\x69\x26\x7b\xd3\xe1\x17\x51\x59\x70\xef\x2f\x5f\xcb\x28\x02\x89\x68\x56\xdc\x24\xfd\x92\x18\x45\xc6\x5a\x24\x59\x68\xd9\x0f\x80\xf7\x71\x6c\x17\x45\xc6\xf2\x08\x9a\xf2\x66\x35\xb9\x0c\xd4\x00\x76\xb7\x76\xfd\xf4\xfc\xba\xdb\xbf\x6e\x57\x2f\xdb\xfd\xa0\x96\x41\x22\xc2\x84\xb6\xa5\xd5\x0e\x5a\x39\x9b\xc3\xb4\x23\xa5\x37\xd6\x70\x95\xe6\x6e\xfd\x9e\x59\xa7\x23\x1a\xc6\x2c\xf4\xab\xac\x16\x17\xdb\xa6\xec\x55\xce\x48\x44\x1d\x65\xe5\xf1\xee\x69\xf4\x00\x12\x42\x10\xe4\xe2\x5c\x67\x97\x2f\x9b\x1f\xb7\x88\x6d\xdc\x6e\xee\x76\xfb\xe5\xe2\xb9\x1b\x98\x18\x54\x2f\x90\xa2\x4d\xc0\x36\xb9\x1e\xc4\xe8\x24\x4a\x44\xc8\x6d\x06\x0f\x3f\xb3\xf2\x5c\xe3\xdb\x31\xa1\x55\x90\x28\x15\x1a\x17\x7a\x6f\xec\x32\x23\xd3\x49\xa2\xd4\x68\x8a\x4d\x04\xf1\x8e\x02\xf7\x83\x62\x1d\x89\x38\x67\x3a\xec\x18\x8a\xcb\x76\xd7\xdb\x95\x83\x25\xd7\x0f\x93\xda\xf7\x94\x5e\x11\xdb\xe7\x48\xb6\x73\x95\x0b\x12\x71\x05\xc6\x19\x0d\xa2\x61\xd1\xc4\x07\x93\x44\x82\x50\x04\x5c\xfd\x61\xcd\x3e\x9f\xc0\xcf\xa8\x48\xa4\xd2\x4e\xfd\x85\xd6\x8e\x92\x3f\xd5\xbe\x19\x5f\x99\xe0\x21\x9e\x6a\x71\x3a\xe5\x70\xaa\xca\xd1\xc3\x10\x9c\x41\x6f\x01\x33\xd9\xb1\x23\x19\x84\xb8\x68\x20\x12\x26\x2b\x6a\xa8\x9a\xbd\xc9\x0a\x5c\x8e\xbe\x39\x72\xcc\xda\xc9\x63\xea\xdf\x46\xdf\x2a\x25\xc7\x82\xe2\xb6\x11\xd5\x6b\x91\x35\x80\x70\xfb\xbf\x24\x92\x90\x48\x1a\x83\x15\xbc\x63\x56\x34\x37\x42\xbf\xcd\xcb\xab\x90\x48\x05\xb6\x88\xba\xac\x2e\xa7\xa6\x3e\x94\xa7\x53\xff\x6e\xa8\x20\xed\x15\x69\xe7\xc5\x05\x49\xa4\xc2\x38\xee\xbd\xe9\x27\xa4\x83\xf6\xb0\x44\xec\x96\xd5\x01\x5b\xb8\x3d\x78\xde\x46\x8c\x44\x4a\x72\x67\x71\x23\x1a\x18\xce\x02\x4d\x25\x78\xcf\x14\x3b\xad\xae\x2e\x44\xb3\x84\x58\xa6\xad\x39\x17\x7a\xad\xca\xee\xb3\x0c\xd0\x4a\xf9\x5c\x54\xce\x87\xb3\x4d\x43\xa6\x60\x66\x12\xe9\x24\x90\xa2\xf7\xd7\x5b\x1e\xa0\xd7\x45\x9f\xdc\x35\x0d\x06\x81\xf6\x78\xd7\xca\x6f\x9d\x20\x08\x89\x0c\x51\xca\x89\xb3\x3f\x43\x55\x97\x85\xc8\x31\x84\x9f\x34\xdd\xff\xf6\x3f\xf6\xb4\x71\xc0\x63\xcc\x65\x4d\x59\x35\x99\xb9\x2c\x73\x91\xb9\x4a\x53\x38\x44\x91\xf4\x99\x5b\x1c\x48\x49\xdd\x4c\xf2\x32\xd2\x7e\xb9\x8f\xc3\x36\x11\x76\x36\x16\x58\xb1\x54\xa2\xd2\x57\xa5\x71\x12\x87\xc2\x58\x7f\xbc\x76\xe0\xd8\x69\x6d\x74\x3f\xe2\x50\x5b\x93\x37\x14\x05\xb6\x3e\xe0\xde\xf3\x14\x2f\x75\xdc\x91\xf8\x25\x52\x9b\xc4\x51\x44\x50\x03\xe3\x51\x34\xea\x70\x63\x55\x92\xee\x84\x42\x2d\x97\xf1\xf5\x45\x34\xd2\x89\x67\xb6\x5e\xb9\x6f\xf8\x41\x26\x00\xea\x79\x0e\x9b\x4a\xa8\x31\x0c\x8a\xc4\x71\x60\x53\x1c\x7d\xf6\xa2\x65\x24\x8e\xa5\x35\x31\xfc\xb6\xf8\xee\x37\xda\x98\x04\x80\x9b\xb0\x6d\xf2\x50\xff\x67\x6a\x6c\x10\xd1\x2e\x7b\x1d\x70\xb2\x53\xac\x1e\x77\xbd\x48\xcc\x02\xa3\x52\xef\x49\x94\x5b\x3f\xc8\xdc\xbe\xea\x83\xf8\x27\x66\x34\x40\x4e\xa3\xb3\x7a\x7d\xb8\xf3\x6a\x22\x93\x1b\xe9\x87\x8b\xd8\x24\xbe\x9b\x57\x36\xd1\x3e\x64\xe3\x85\x35\x66\xd2\xba\x4d\xdd\x56\xe2\x63\xb2\x13\xa3\x52\x80\xe9\x84\xcd\x9a\x2a\x53\x6d\xd6\x34\xb0\x0b\x9e\x3c\xed\x44\x87\xa8\xf2\x77\x2e\x5e\x70\x35\x9f\x9e\x4e\xa7\xde\xcc\xf5\xb6\xce\x5c\x16\x86\x37\xe4\x4b\x5c\x31\x41\xd6\x21\xed\x7f\xf0\xd3\xc2\xb5\xd2\xc6\xcf\x92\x47\xcc\xc8\x6e\x8e\x3b\x25\x4b\x6b\xcd\xfb\xe5\xbb\xc9\x69\x80\xb9\xe2\xa2\x68\xda\x10\x6f\xb8\x6e\xc7\x3c\xd1\x32\xec\xc2\xf4\x7a\x20\x44\x48\x62\x11\x48\xac\x18\x9e\xce\x28\xf6\xa5\xbb\xd9\x23\xd2\x14\xb7\x4c\x1b\xda\xe9\x1b\x51\xf4\xfb\x69\x2c\x04\x45\x39\x81\x47\xd0\xb2\x8b\x89\x62\xa1\x2c\x68\xf7\x36\xab\x40\xb5\x11\x41\x01\xca\x36\x02\xed\x6b\xed\x87\x01\x23\x8e\x79\x01\x0d\xdc\xae\x6f\x6d\xab\xf5\xc7\xa1\x5b\x7e\xff\x07\xaa\x72\x72\x4f\x64\x12\x49\x32\xc6\xaa\x79\xac\xd3\x74\xa4\xb0\x9e\xdc\x59\xbd\x6d\x2a\xd1\xc0\x9b\x93\x1b\x0e\xa9\x1f\x20\x2d\x80\x29\xcf\x8a\xf7\x5f\x76\xd4\x49\x2c\x55\x88\x81\x98\x71\x32\x68\x4f\xe2\x08\xf1\xb8\xfa\x10\xab\xc4\x76\x0c\x6e\x5e\xca\x8b\xc8\xfb\x56\x35\x89\x95\xe6\x58\x52\x6e\xa3\xf6\xa1\x42\x24\x89\x35\x4b\x95\x35\x40\x6f\x6e\x44\xf1\x3e\x32\x20\x25\xb1\x36\x0e\x3c\x71\xae\x8a\x89\x35\x31\x89\x0d\xe3\xcc\xf5\xf0\x67\x4b\xa6\xfd\xda\x68\x52\x12\xf9\x06\xf1\x7d\x99\xeb\x5f\x90\xa0\x09\x09\x62\x8a\x4b\x6f\x63\xeb\x4e\x76\x6b\x1f\xd9\xc6\x91\x36\xad\xc3\xf7\x68\x51\x65\x85\x70\x74\x9a\xfd\xbf\xcf\xfa\xad\xab\x46\xa5\x93\xb3\x46\xc4\x1a\xbd\x2b\x4f\x2e\x9a\x55\x68\x27\xed\x1a\x67\xd9\xe4\xa2\x11\x77\x55\x79\x74\xaa\x71\xc3\xbb\x42\xe2\x98\x20\x99\x61\xf3\xb4\xb2\x38\x46\x7f\x59\x24\x10\x29\x73\x8a\xa6\xd0\x0c\x9b\xd3\x84\x10\x62\x40\xf6\xa6\xa5\xb6\x61\x38\x49\x20\x27\xd7\x42\x68\x80\xb5\x39\xe4\xa0\xe1\xb2\xde\x1d\xb0\xad\xfc\x2b\x03\x54\x44\x6c\x5f\xaf\xc9\x84\x88\x08\xf5\xe7\xf6\x32\xab\x9a\x83\xdd\x28\x67\xe8\xa0\x8c\x4c\xc4\x91\xdb\x4b\xb0\x26\x29\x59\xe1\x32\x7f\xef\x5d\x3e\xf9\x06\x4a\x7c\x93\xa8\x79\x14\x9f\x08\x47\x5d\x35\x87\xc5\x80\xe8\x44\x08\xe5\x96\x66\x9e\xd5\x4f\x65\x71\x77\x2e\xde\x90\xf3\x3f\x7e\x4e\x69\xa0\xb1\x13\xe8\x0b\x0c\xf9\xf4\x38\x00\x56\x3b\xfe\x5d\x66\xc5\xf2\xd0\xde\xe1\xa9\x46\x33\x21\x3c\x32\x08\xb8\xea\xc0\x5a\x9d\x53\x0f\x21\x9c\xca\x90\xf6\xa2\x51\x5b\x68\xd0\x43\xa8\xea\x8e\x2b\x1a\x89\xce\x99\x67\xb4\x71\x11\xae\x2d\x69\xa7\x8d\xdd\x27\x31\x27\x11\x9c\x60\x9d\xe9\x38\x30\x43\x69\x53\x31\x47\xb0\xf2\xa3\x54\x08\xce\x97\x0a\x39\xe2\x93\x90\x88\x48\x9e\x20\xa9\x00\x05\x05\x6f\x60\xf2\x2a\xff\x0d\x0c\x22\x21\x52\x11\x8c\x60\xeb\x06\x4e\x9b\x62\xd0\x58\x20\x44\xc5\xb1\x7d\xb7\x2b\x10\xc7\x1d\x88\xee\x7d\x52\x9c\xe1\x96\x2a\xb4\x5e\x5b\xea\xcd\xd8\x49\xb7\xbb\x3e\x25\xac\x48\xb3\xc3\x8b\x4d\x3c\xb1\x09\xd1\x71\x90\x7a\x58\xe1\x9d\xc8\xf2\x73\xd5\x7d\xb9\x8e\x2d\xd5\xa6\x41\x3c\x21\x66\xce\xf5\xf4\xd3\xcc\x60\xf6\x2b\x41\x60\x39\x73\x3c\x81\xb4\x94\x09\x1d\xf9\xf8\xb6\x0b\xce\x7a\x40\x5f\x98\x4c\x1f\xdd\x26\xc7\x0e\xa5\x7c\x25\xd0\x39\xbf\xf6\x98\x24\x49\x54\xdf\x55\xdb\x7d\x33\x65\xf5\x5a\xfc\xe7\x2c\xf2\xcc\x64\xa0\x6f\xce\x97\x81\x5a\xca\xf8\xb3\x34\x08\x28\x12\x74\xad\xda\x9f\xa8\x9a\xec\x8a\x60\x43\x68\x10\x6b\xcb\x7c\x43\xf9\x90\x83\xa8\xe1\x51\x7c\x66\xc7\xf3\x51\x0d\xed\xfb\xfc\x60\x62\xfd\xe7\x75\xf9\x86\x32\xf4\xee\xcf\x61\xc8\x51\x29\x6c\x53\xe9\x81\x4c\x08\xa1\x21\x28\x8c\xbb\xeb\x0f\x87\xf7\x42\xf8\xcc\x5d\x59\x2d\x9d\x14\xf7\x17\xbf\x7d\x0a\x50\x1d\xbf\x65\xa3\x7b\x4a\xa3\xd4\xda\x8a\xd7\xd0\x2c\xd6\x2f\xb7\x2f\x9b\xe7\x76\x3b\x99\x96\x6f\x69\xcc\x62\x57\x93\xc0\x05\xea\x65\x31\x5e\x2d\x68\xcc\x6c\xa7\xca\x2d\xeb\x2f\x88\x28\xf1\xbf\x23\x4e\x93\xc4\x96\x25\x6d\x49\x77\xea\xa6\xd3\x0d\x53\xcc\x71\xf2\x10\x2b\xf0\x56\x09\x7d\xc6\x7a\xe3\xaf\x83\xff\x7e\x4a\xfd\xfa\xff\x8e\x8d\xbe\x09\x25\x21\xc5\xb2\x9e\x39\x37\x67\xab\x75\x3d\x25\x84\x13\x4a\x62\x6b\x6b\x52\x43\xd3\xc9\xa7\x0f\xfa\x9b\xe3\x1f\x40\x12\x42\xe2\x31\xfe\x71\xb8\x28\xfc\x63\x3a\xda\x58\xa8\x63\xa9\xce\xed\x69\x57\x9f\x28\x62\x3e\x08\x62\x29\xe1\x16\xd2\xe4\xbb\x5b\x59\x2f\x66\x33\x3e\x17\x65\x26\xd2\x36\xe2\x3f\x57\x59\x73\xb9\x6e\x54\x0f\xcd\x5c\x07\xdb\x01\xa5\x3a\x62\x6a\x24\x94\xfb\x04\xa0\x87\x94\x1e\x42\xa9\x51\x36\x39\xff\xc4\x15\x72\xf3\x13\xaa\x3a\x7b\x3b\x34\x9d\x73\x1f\x36\xde\x87\xb8\x70\x42\x59\x10\x23\xea\xc2\x19\xd4\xf4\x1a\x58\x84\x32\x92\x22\x57\xc6\x0b\xf2\x6f\x72\x3d\x82\x78\xb6\x23\x04\x11\xdd\xac\x75\x5f\x83\x70\x2e\x2f\x31\x47\x28\xe3\x0a\x01\x87\x30\xf8\x8f\x3f\x96\xa4\x56\x0f\x74\x7b\xca\x33\x9f\xee\x3e\x8e\x96\xe7\x69\xf8\x4c\x13\x08\xc1\x85\xcf\xd5\xd5\x83\x4d\x55\x82\x52\x3c\x1f\x3e\x43\xaa\xe7\x6a\x51\x54\x10\x23\x9d\x7e\x97\xcb\x5e\xbe\xe8\xd9\x12\x2a\x78\x6c\x75\x96\xd7\xbe\x44\x46\x85\x60\x41\xcf\x0b\xbf\x2b\x2b\x4c\x55\xbb\xdf\x2b\xa4\x95\xae\xd9\x81\x3a\x14\x65\x5e\xbe\x5d\xe8\xfd\x64\x12\xca\x50\xe3\x8a\x5c\x9e\x60\x68\xfe\xe3\xcf\x20\x13\xfb\x48\x6a\x0b\x92\x94\x50\xd5\xfb\xdd\x66\xff\x6d\xb1\x5b\x7e\xdb\x87\xcb\x4a\x64\x6f\xf7\x95\xe8\x1f\xbb\x4c\xc3\x78\x28\xa5\xd8\x06\x24\xff\x1d\x9c\x4e\x05\x48\x59\xd1\x65\x9e\xab\xc1\xaa\x25\x21\x05\xd7\x6b\x1c\xa0\x35\x08\x95\x26\xc1\xad\xc6\x81\x63\x76\xbe\xbc\x40\x55\x98\x26\xae\x24\xe9\xd8\xd7\xe3\xd7\x4f\x45\x61\xa0\x7a\xff\x12\xa8\xd6\x9d\xfe\x82\x9e\xae\x0c\xe3\xbb\xac\x48\x22\xad\x2c\x5d\x33\x90\x8f\x1b\x39\x3b\x0f\xe7\x66\xea\x3f\x06\x09\xd8\x79\x6c\xb2\x3c\xdf\x7d\xde\x01\x3c\x5a\x82\x4a\x77\x49\x00\x1e\xf3\xf0\x5a\x54\x20\xf4\x23\xd4\xb5\x78\x83\x49\xc2\x40\x75\x40\x69\x30\xd2\xd0\x5b\x54\x95\xb8\xcc\xaf\x67\xfe\x33\xc4\x4a\xf2\xfa\x80\xe9\xa1\x7c\xcb\xd4\x57\xb5\xb5\xab\xf7\x58\x8b\x00\x71\x28\x4e\x15\x7a\xd4\x16\xa1\x5a\x0a\xcc\x5f\xbe\x72\xce\x9f\xec\x1f\xdd\x49\x41\x02\xef\x84\x3d\xbe\x97\x9d\x4f\xbb\x3f\x6c\x08\xa2\xf9\x64\x29\x6d\x5d\xc5\x4d\xb9\xaf\xc4\xb0\xc7\x04\x6a\x67\x74\x4f\xa8\x51\x49\x68\x86\xf2\x55\xcb\x8b\x9a\x86\x93\xed\xb2\x82\x6d\x15\x4b\xde\x73\xdb\xcd\x44\x90\xc5\x0d\x0d\x49\x80\x15\xbc\x47\xc8\xcb\x31\xea\xe7\x97\x92\x19\x84\x85\x8c\x60\x69\xfe\x43\x64\x58\x3a\x29\xab\xa1\x36\x2c\x61\x11\x53\x08\xf6\xce\xb3\xf7\x2f\xaa\x82\x2c\x52\x69\xda\xd7\xe6\x2d\xa7\xf9\xe6\x82\xe1\xc6\x17\x9f\x88\x25\x43\x80\xf8\xaa\x29\xad\xcf\xff\x6e\x28\xfb\xfa\x65\x9d\x92\xc5\x46\xa0\xa6\xd2\xc2\x39\xa3\x5e\x27\x0b\x8c\x68\x85\x25\x93\x73\x0d\xd5\x37\x51\x3f\x9c\xd5\xfb\x05\x1b\xbf\x93\x71\x34\x24\xcc\x05\x64\xab\xe6\xb0\x83\x3c\xff\xf2\x6a\x69\x64\xc5\xc7\xf7\x59\xfd\x04\xd9\xdb\x41\x96\xd5\x20\xb4\x4d\xfd\xa8\x38\xc1\xb4\xe6\xf7\x81\xc1\x0f\x61\x54\xd9\xaf\x19\xde\x3e\x77\x88\x85\x89\x64\xfd\x0e\xfa\xe8\x9a\x57\x16\x28\xd5\x2f\xde\x93\x0f\x45\x1c\xe1\xaf\xcb\x87\x9b\xe1\x7a\xc7\x58\x9c\x82\xd3\x8e\xfe\x5b\x46\x97\x84\x31\x4e\x20\x75\x38\x87\x6d\x23\xde\xed\x96\xfb\xba\x5d\x42\x07\xd4\x22\x2c\xa1\x21\xae\x0e\xf0\x79\x1a\x95\x9a\x59\x62\x12\xf0\x2c\xab\xaf\x77\x1a\x96\x46\x26\x08\x3a\x49\x6b\x44\xfc\x59\x53\xad\xf1\xb5\xa4\xb1\xc0\x55\xd1\x56\x6a\x66\xd5\xab\x08\x4b\x89\xc6\x37\x71\xf1\xe7\xd3\x6a\x37\xfa\xf1\x29\x4b\x53\xf0\x95\xbd\x46\xe4\x63\xa6\xa9\x1f\x94\x84\x56\x68\xa2\xfc\x09\x58\x0f\x78\xe8\x5a\x7b\x2c\x55\x12\x75\x48\xee\x5e\x77\x8f\xdd\xdf\xb4\xc2\x28\xb0\x7d\x35\xdb\x2f\x3b\x8a\xf7\x8e\x82\x44\x18\x0f\x04\x2a\x26\x9c\xca\x93\xf7\xe9\xf4\x47\xc2\x14\x75\x27\x6c\x1c\xf3\x02\x35\x54\x3f\xc1\x8a\xd9\x0f\x5f\x17\x1e\x03\x77\x31\x83\xe3\xef\x0c\x5a\x50\x8c\xa7\x00\x89\x8f\xb4\x29\x86\xda\x51\x10\x05\xfe\xb0\xa0\x56\xba\x05\x2d\x13\x8f\x17\x8b\x37\x9f\x24\x24\x4c\x45\x0a\x93\x5f\x79\x69\x44\x55\x45\xce\x7e\x27\x4a\xbb\x87\xa3\x43\xfb\x2e\x15\xe2\x54\xe6\x50\x16\x7f\x62\x02\x6e\x91\x51\x1e\xbe\x48\x98\x66\x0a\xab\x15\x4a\x14\x4b\x47\xef\x42\x39\x8d\xcb\x84\x4c\xe1\x87\x8b\x10\xb7\xa1\x47\xc8\x7e\xcf\xce\x7f\x4f\xc9\x8a\x30\xad\x6c\x7d\x21\x2b\xb2\x66\x5c\xcb\xfb\x82\x93\x49\x98\x06\x61\xf9\xa8\x79\xa9\xde\xb1\xd1\xf1\x2c\x7c\x61\x88\x99\x28\xe8\xf4\xae\xdd\x74\xf8\x26\xea\x2b\x1c\xf5\xdf\x92\x15\x22\xcc\x70\xc0\xbc\x01\x10\x66\xbc\x2c\x35\xac\x3e\x7b\xc6\x16\x61\x46\x82\x75\x27\x3a\x57\xc5\xb6\x3c\xc2\x80\x2c\x42\x98\x01\x89\x8b\x78\x59\xbd\x5d\x42\x33\xc3\xcc\x24\x49\xc0\x00\x53\x5b\xbc\x5b\x6d\xce\xbb\xbc\x36\x6f\x22\x49\xa0\xb5\xe9\x74\x0b\xff\xc8\x9a\x26\x83\x1a\x41\x1f\x1e\x47\x90\x84\xa1\xd5\x1b\xa8\x7b\x65\x5a\x7f\x44\x58\x85\x9b\xd3\xb9\x59\x17\x4d\xf9\x2c\xd4\xfb\x20\xa4\x9f\x85\x21\x92\x24\xd4\x49\x12\x38\xfd\xd6\xdd\x01\xee\xc4\x3b\xd4\xcf\x55\x79\xf4\xc1\x4c\x12\xb9\xac\xf8\x20\x0a\x9d\xc3\xb7\xdd\xc3\xd2\x4a\xa4\xef\x3e\xaf\x4a\xf8\xa3\xa9\x9c\x44\x71\x8a\xdd\xf6\x76\x6e\x3d\x8a\x2e\x90\x4e\x22\x2a\x11\xc8\x68\xbb\xe1\xe3\x02\x61\x42\x28\x4f\x82\xa1\x46\xe0\x7c\x06\xe8\x47\x27\x36\x0f\x13\xed\x52\xd0\xa6\x91\x50\x35\x99\xc9\x5c\xc6\x33\x4e\xaa\x06\xfe\x11\xd3\x74\x72\x7c\x4e\xc3\xbd\x8d\xf6\x73\x05\x99\x2a\xa7\x15\xb0\xf1\x03\xa3\x91\xa5\x80\xdd\x66\x6f\x59\x73\x1e\x2a\x91\xb6\xc7\xa2\xa8\x33\xa8\x40\x47\x84\xee\x59\xb1\x30\x4e\xa4\x93\xa2\x7d\x3d\x75\x7f\x15\x86\xaa\x4e\xab\x6e\xd1\xb8\x4a\xb9\x13\xaa\x1b\x45\x76\xd3\x9b\x3e\xfe\xd7\x9f\x4f\x49\xac\xf6\xed\x07\xb2\x2c\xf3\x3f\x23\x89\x04\x38\x14\x03\x0a\x0d\x5c\x9b\x27\x92\x24\xe1\x3a\x71\x40\x25\xec\xe3\xec\xcf\x57\xfd\xa1\x24\x4d\xe3\xd4\x4a\x57\xb7\x7b\x81\xf7\xa1\xfd\x3b\x50\xae\x81\x44\xf5\xe4\x94\xd2\x6a\xed\x23\xee\xa4\x34\xcb\xb2\xc0\xf7\xc6\x1d\x15\x21\xc7\x7b\x8c\x75\xf3\x23\x56\xca\xba\xa9\x22\x98\xe0\xce\xbe\x47\x9e\xab\xda\xe7\xba\x9d\x50\x24\x49\xa4\x8a\x91\x3f\xb8\x3d\x88\xe2\xdb\x79\x50\xaa\x48\x54\xa0\x10\xec\x74\x0f\xa8\xdd\x84\x08\xcf\xf1\x75\x29\xca\x11\xef\x02\xea\x27\xda\xd3\xfe\x36\xf7\x04\x94\x20\xb8\xe6\x3d\x94\x6f\x4f\xf0\xb1\x28\xea\x8f\x81\x38\xd1\xf4\xdf\xaf\x6e\x53\x9f\xdd\x26\x4a\x86\xb8\x3f\x22\x80\x7d\x76\xe1\x9d\xcb\x1b\x12\x9d\x06\xa9\x75\x5c\x71\x39\xf1\x75\x6b\x2f\xd1\x3c\xc4\x1c\xd5\x80\x3a\xb4\x21\xf1\xba\x30\xe5\x5d\x59\xb5\xff\xd3\xaf\x73\x89\x16\xd4\xd6\xa8\xcb\xa2\x3e\x1f\x3d\xf3\xf6\x57\x29\x4b\xa2\x85\x02\xea\x57\xb4\x07\x54\x35\x1b\x97\xca\x13\x0d\x22\x74\x0a\x19\x53\x4e\xb3\x1b\x01\xa1\x0a\xbc\x41\x4b\x5d\x43\xd3\x39\x07\x93\x04\x12\xc0\x98\x58\xd4\xef\x93\xa5\x14\x99\x33\xf8\x9b\xd7\xcb\x8d\xb1\x22\x34\xfd\xbb\x61\x02\x8d\x2d\xc5\x36\xba\xdc\x9f\x2c\xcc\xb6\x3b\xa9\x09\x53\x54\xcb\xb0\xcd\xdc\x5d\x59\xa9\xc3\x68\x62\x1b\x23\x99\x53\x6a\xd8\x96\xa6\xd9\x2f\x27\xee\xf6\x24\x0d\xa4\x60\xd6\x38\x02\xa7\xd3\x16\x4d\xb6\xb0\x49\x5d\xdc\x97\x7d\x88\x91\x86\xa9\xa0\xbd\x4c\x61\xe1\xc2\xc4\xf1\xc2\x9e\x86\x29\x90\x81\xc4\xd4\xf0\x0d\x4e\x43\x95\xe2\x84\x5b\x2c\xef\x46\xc5\xc8\x34\x04\x69\x5c\xa6\x86\xfe\xcd\xd6\x76\x6e\x55\x34\xd5\x24\x68\x4a\xa3\x88\x62\x83\x05\xe3\x90\x36\x4a\xcc\x8a\xb7\x45\x33\x1d\x94\xc6\x48\xb7\x94\xe7\x8b\xdd\xf9\xc6\x87\x63\x12\x7a\x1a\xce\xab\xa3\x7d\x0e\xec\x4a\xdc\xa0\x36\xf3\x45\xe8\xc2\x09\x2a\x9f\x79\xa6\x84\xcb\xd8\x9a\xbe\xe6\x93\x4a\x7a\x4a\x23\x89\x52\x15\x7e\x33\x98\x58\x02\xb9\x51\x2c\x88\xe3\xde\xf4\x64\x7a\x30\x4e\x93\x0e\xa6\x02\x85\x82\x5f\xe8\x57\xfa\x8f\xa4\x8c\x3b\xc2\x22\x4a\xad\x6a\xf1\xab\x16\x48\x9a\xb0\x08\x1f\xce\x4a\xb4\xbb\xf4\xfd\xd3\x76\x7e\x85\x4d\x13\x65\xb9\xd1\x3d\x2c\xe7\xf5\xe9\xfb\xea\x65\x7d\xb7\x5e\xdd\x22\xc0\x68\x80\xd0\x49\x13\x48\x71\x7b\xf0\x08\x45\xab\x9f\xd1\x67\xa8\x69\x02\x92\xa6\xfd\xd3\xad\x7e\x1b\x65\x9e\x69\x62\x34\xa6\x1d\xa7\x9e\xa1\x15\x6e\xc1\xef\x01\xc3\x62\x44\x9a\x86\x29\x8a\x7f\x2b\xd1\xfd\x89\x2b\xdb\xb1\x3c\x88\xbc\xe9\x51\x13\x29\xd7\x14\x4b\x87\x8f\x8b\x3f\x9d\xa2\xcf\xf6\xf5\xf9\xf9\xe1\x5f\xdd\x71\xa3\x50\xb0\xe6\x49\xc3\xe7\x50\x79\x9f\xa4\x22\xb4\x6a\x9b\xa2\xae\xa1\x6a\x3a\xbe\xad\x86\xcf\x75\xf1\x72\x1d\x05\xa5\x82\x88\xc8\x72\x8b\x2f\xff\x16\xbd\xb9\x0a\x49\x55\xc0\x0d\x74\xbd\xf2\x06\xc6\xe2\x0d\x24\x55\xb1\x75\xab\x6e\xc3\xc5\x35\x6a\x1e\x77\x47\x0c\x43\x28\x12\x0a\xa7\xe4\xa2\xae\xbf\x67\xf0\x81\xe5\xe7\x68\xf2\xe5\x3a\x0d\x91\x51\x72\x74\x0e\x58\x1f\xa3\x69\xa5\x25\x45\x6c\x34\xee\x46\xed\xda\x38\x79\xe1\x20\xd0\x08\x1e\x43\x88\xe9\x0b\x34\x55\x06\x0e\xdd\x78\x0b\x8d\xc8\xf2\xee\x82\x80\x59\x16\x64\x95\xbd\x1d\x1a\x4a\xc6\x17\xc1\x83\x30\x46\x32\xee\xbf\xb3\xb7\xf2\xdc\x9c\xb3\xc3\x59\xcc\xeb\x7d\x13\x1e\x28\x1a\xba\xad\x7b\x85\xde\xb5\xb6\x67\x3d\x9a\x7a\x3c\x64\x29\x36\xfb\x3f\x0e\x99\x3a\xa0\x02\xd2\xe4\x0b\xc3\xc4\x20\x9e\x0d\xeb\xd9\xbe\x42\xf9\x75\xc3\x94\x87\x3c\x66\xc6\xf3\xee\xea\xd3\xb9\x81\xdd\x9f\x93\x53\x46\x69\xa0\x2c\x9f\xb6\xac\xbf\x28\x2b\xf0\x28\xb5\xf5\x24\x2d\x2e\x39\xe6\x8c\xfe\xef\x5c\x60\x17\xe2\x6e\xb9\x1c\xdf\x60\x1e\x47\x02\xeb\x41\xeb\xa7\xa5\x1f\x1c\x83\xc1\xba\xf7\x3f\xfd\x1f\x48\xc4\x91\x20\xb2\x45\x25\x9d\x87\x72\xb2\x98\x71\x1a\x69\x3d\x5c\x58\xda\xdd\x7d\x5e\x86\x92\x70\x6a\x82\xd4\xdb\x07\x95\xe7\x1a\xb7\xc5\xc9\xcd\xa5\x46\x20\x62\x4a\xda\x82\xee\xb3\xb8\x74\xfb\x0c\x67\xc6\x4e\x9a\xce\xd9\x1e\x41\x27\xd3\x4d\x1b\xcf\xf7\xbf\xf1\xff\x4d\xee\x4e\x1a\x03\x4a\x48\x7e\x5b\x6d\x26\xdd\x3c\x9e\xf2\x28\x72\xf7\x7f\xe0\x94\xea\x0f\x4a\x9e\x76\xf0\x0d\x0d\x70\x74\xe9\xeb\x4c\x5a\xce\x53\x63\xf1\xc2\xb6\x16\x6a\x61\x0d\x5d\x60\x3f\xd5\xca\x27\x9c\x53\xbb\x59\x3f\x57\xa5\xdb\xa5\xfa\xe6\x21\xe7\x89\x76\x16\xdc\xc7\xf2\x27\xdc\xe4\x42\xbd\x5f\x49\x46\x11\xce\x53\x8b\xb0\x96\xed\x2c\xfd\x26\xf2\x9f\x03\x0a\xb1\x1f\x62\xa8\x85\x3d\x74\xd6\x0a\xfb\x6a\x04\x30\x9c\x5c\x95\x24\x8a\x75\x94\xba\xc7\x52\x63\x92\x7b\x2d\x6f\x47\xb8\x64\x01\x76\x07\x90\xe3\xed\xe4\x11\xea\xc9\xe3\x54\x9c\x46\xdc\x61\xad\x1d\xbf\x73\x5a\x9c\x64\xff\x37\x8c\xf2\xb8\x52\x4c\x70\x8f\x51\xec\xe2\x9b\x1a\xad\x52\xbb\xa5\x83\x6b\x05\x16\x20\xe1\x8c\xc9\xfc\x52\xc0\x0d\x03\xac\x84\x83\xb6\x4a\x14\x43\x95\xaa\x61\x6e\xc2\x8d\x16\xc2\xf9\x0d\x62\x5d\x72\xe4\x5d\x3e\x5f\x02\x12\x41\x60\x39\x47\xb6\x3a\xb3\x6a\x0e\xd6\x40\xd9\x1f\xa5\x0a\x4b\x94\xfb\x22\x93\x32\x87\x7a\x57\xee\x2a\xf1\x13\xaa\x1a\xbe\xd4\xc5\x26\x22\x50\x21\x82\x25\xfe\xb9\xdc\x8e\x6a\x34\x22\xd0\x31\xe6\x1b\xd0\x1c\x76\xe5\x0d\xe0\x35\x76\x53\x41\x84\xb1\xf1\x4c\xdc\xf5\x72\x33\xac\x2c\xa4\x7e\x84\x4e\xad\x38\xaf\xa5\xd8\xef\x9b\x2f\x6d\x0e\x88\x88\x12\x0b\xab\x45\xa3\x74\xff\x15\x91\x48\x3b\x9b\xe1\xf6\x55\x58\xe6\x19\x14\xcd\x78\xe5\x15\x91\x50\x2c\xf2\xa2\x60\xc7\x93\x50\xcd\x75\x74\x2f\x22\x65\x05\x5a\xf2\x52\xe8\x11\xfb\x4c\xc4\x41\x18\xb2\x91\x68\xf2\xfc\x4b\x29\xe2\x20\xc2\xba\xd8\xcd\xcb\xf7\xf9\x20\xdd\x8f\xa3\xd6\xb0\xf9\x0d\x33\x4e\x93\x7d\x0e\xe5\x6e\x88\x88\x99\x48\x92\xce\x4d\x43\x77\x42\x39\xed\x1d\x7e\x16\x99\xde\x74\x75\x5c\x41\x42\x95\xf4\x64\xf3\xbb\x2a\x83\x42\xd7\x48\x7b\x85\x6e\x08\xb3\xae\x24\x87\xf2\xe3\x51\x14\x36\x96\xab\xdb\x53\xb5\x9f\x18\xe2\x80\x05\x4b\x23\xc4\x39\x78\xec\xd0\xe8\x49\x33\xb0\x05\xb0\x36\x65\xda\x36\x65\x25\xde\xba\x6f\x48\x22\x69\xdd\x44\xfe\xe7\x73\x56\x4c\x9f\x88\x24\xd1\x11\xf7\x3d\x48\xbc\x89\xdf\x45\x95\xc9\x41\x75\xeb\x4b\x25\x81\xd9\x18\x4c\x24\x26\x46\x51\xa9\x27\xf8\xd8\x5e\x8e\xb2\xcc\x87\x6a\x70\xfe\xe5\x4a\x35\x20\x0a\xff\x3f\x67\xd1\x40\x15\xfa\x8b\xe1\x32\x4a\x9d\x44\x93\x93\x33\xb8\x3d\x3b\xd6\xe0\xfc\x97\x89\x20\x41\x64\xe3\xe2\x08\x55\xa6\x4a\x07\x39\x1b\xdc\x1b\x11\x11\xc4\x48\x6e\xcb\x73\x73\x58\x98\x2a\x53\xa2\x8d\x72\x74\x3d\x1e\x45\x63\x74\xc1\x7f\x43\xe2\xea\x68\x05\x12\x82\xd9\x30\xe6\xf1\xdb\xf2\x66\xd9\x7d\x20\xb5\xdc\xba\x36\xfc\xfa\xb1\x5a\xf7\x7f\xb6\x88\x47\x84\x12\x0b\xad\x17\x85\xbe\x6f\x7f\xca\xb0\xff\x28\x44\xaa\x71\x81\xc2\x7e\x07\x9a\xef\x9c\x9a\x81\xee\xd0\x98\x70\x31\x5c\xda\x84\x14\x56\xfa\xd7\x4a\x93\x5e\xa1\x74\x47\x0a\x73\x83\x85\x56\x48\x13\x20\xfb\xf7\xb5\xb0\x1b\xcb\x2c\x11\x45\xa8\x38\x42\x55\xb3\xce\xc7\xef\x9f\xbb\xf1\x4e\x20\x14\x28\x0c\x5c\xda\x88\x39\xd8\xaf\x9e\x6e\xfd\x4f\xd2\x5c\xa0\xfb\x4e\x23\xde\xe1\x57\xa5\x0d\xa1\x05\x37\xae\xa0\x73\x07\x70\x57\x56\x48\x5d\x58\x54\xcd\x8f\xb2\x7a\xf7\xd5\x4e\x5b\xdd\x9d\x7c\x50\xc5\x48\x24\x79\xbd\xd9\x76\x5f\xaa\x08\x26\x55\xb8\xcf\xf8\xa2\xe3\x0f\xc8\x76\x87\xac\xd2\x2e\xff\x1a\x9f\x04\x22\x70\x6d\x63\x21\x73\x70\x52\x06\xd3\x31\x89\xf6\x33\xbc\xb3\x91\x1d\xad\x10\x26\xe2\x46\xd9\x92\x99\xf3\x26\xeb\xe2\x77\x61\xa8\x89\x5d\x9e\xf7\x98\x15\x8f\xe2\xb3\xdf\x71\x84\x49\x63\xf4\x49\x32\xe7\x42\xed\x83\x68\xe5\x11\xaa\x32\x10\x3c\xf1\xbe\x15\x7b\x5d\x9e\x65\x0e\xdf\xd1\xdb\x7f\xf1\x26\xb2\xa2\xab\x73\xcb\x90\x90\xb8\x1d\xf7\xc7\xfa\x8f\xfd\xe2\xf6\xf6\x65\xb5\xdd\x76\x87\xb8\xad\x6d\x5b\x68\xdb\x0b\x16\xf5\xbb\xb5\x5e\x86\xc0\xf1\x27\x1d\x84\xd6\x5e\x19\xf0\x1f\xe7\x81\x42\x20\x91\xa1\xe1\xb1\x4d\x91\x51\xcf\xbe\x23\x81\xce\x2e\xa6\x32\x34\x40\x89\x4f\x94\xef\x3b\x22\xa8\x8c\x82\x18\x6c\xa8\x83\x0a\x2a\xee\xaf\x31\x89\xd0\x7b\x00\x59\xbd\xa4\x73\x21\xee\x0e\x2b\x8a\x1d\x49\xe5\x15\x38\xdb\x85\x2a\x2b\xce\xdd\x00\x12\x11\xfc\x71\x0b\x53\xdd\x49\x91\x23\x52\xf1\xcf\xe1\xf4\x95\x34\x88\xd1\x42\xa7\xb3\x06\xbe\xb9\xdc\x40\x63\x5f\xa7\x09\x0d\x42\xd2\xc0\x9a\x09\xbf\x41\x33\x83\x75\x90\x34\x00\xf0\x2e\xc2\x22\xab\x07\x7d\x84\xc1\x18\x12\xe2\x34\x70\x76\x07\xb7\xf0\xf3\x0e\xba\x6a\xa2\xa4\x94\xc6\xca\xb6\xcc\xb0\x76\x3b\xd5\x28\x22\x92\x26\x2c\x12\x03\x0b\xcf\x3b\x80\xbf\x56\x41\x9f\x2d\x34\xfa\x13\x6a\x0d\xd2\x03\xb2\xec\x06\xb1\x68\xd6\xb7\xc3\xed\x5c\x52\xa0\x48\x5e\x5c\x3e\xff\x58\x8c\x6e\x1e\x23\x76\x39\x6a\x73\x7e\xb4\x40\x9d\xac\x0b\x92\x09\xcb\xf9\xc5\x88\x3a\xc2\xe7\xd7\x23\xe4\x24\x33\x09\x1f\x1a\xcb\xdd\x8a\xac\x3f\x24\xbd\xbe\x9f\xa3\x5b\x62\x3f\x0a\xaa\x81\x35\x17\x91\x49\x2c\x10\x4d\x66\x9c\xbb\x94\x9d\xb9\x71\x77\x98\x58\xb4\x45\x1b\x7d\x8a\x42\xfd\xda\x51\x83\xc8\x44\x86\xa8\xaa\xf8\x2c\x2e\x55\x99\x5f\xb9\x80\xf8\x51\x46\x26\x5e\x5e\xc9\x6f\xe1\xa3\x2c\x59\xa6\x20\x51\x1f\xea\x54\x7e\x40\x35\x00\x20\x48\x1e\x80\x76\x5c\xb9\x36\xa2\xea\x64\x68\xc6\x5f\x20\x62\x8e\x99\xa7\x33\xe0\x7c\x01\x55\x4e\x09\x39\x52\x26\xa1\x4d\xc4\xf5\xbf\xcf\x75\xb3\x2e\x4c\x8e\x3b\xdd\x00\x82\x27\xa5\x24\xf6\xd7\x6c\xba\xcc\x5e\xaa\xc0\xca\x27\xdd\x95\xe5\x63\x56\x34\x9d\xc2\xb6\x3f\xae\x19\xe3\xb4\x6b\x0e\xcf\xba\x78\xcc\xae\xcd\x52\x73\xb0\xe2\xc9\x22\x57\xeb\xe9\xc5\x6a\x61\x15\x4b\xe4\xf9\xe2\x78\x0d\x93\x5b\x0a\x34\xec\xfd\x0a\x96\x87\x2c\xef\xe6\x3f\x24\x29\xbe\xee\xf6\x82\xb6\xa0\x10\x44\xf4\x57\xde\x25\x57\x57\x39\x5b\x91\x1d\x83\x1d\xfd\xbb\x6e\x28\xf3\x73\xfc\x59\xd4\xa8\xd3\x3d\xae\x4d\x48\xc3\x42\xde\xe3\xd9\xef\xab\xf2\x7c\x1a\x52\xb9\xff\x2e\x59\xff\xd7\x2c\x4d\x69\x0c\x45\xf4\xe8\xfe\x64\x2b\xc4\x7e\x43\x41\xfe\x05\xfe\xcf\xdf\x86\x7b\xfd\x14\x5d\xdc\x3e\x69\xe9\x0a\xd6\x5b\x68\x46\xd1\x94\x1f\x41\x45\xd2\x09\x5e\xaf\x8a\xb7\xac\x00\xa8\xfe\x89\xfb\xe7\xf8\x54\x21\x11\x08\xb7\x19\x74\x8a\xa6\xf7\x73\x74\xe2\x90\x13\xc4\x0b\x59\xe4\xa1\xf5\xa6\x9d\xfd\x91\x2a\x0a\x15\x36\xeb\x91\x90\xb3\x2d\x4d\xd3\x69\x5b\x13\x15\xa5\x31\x9e\x45\x9e\x2f\xcf\x65\xd5\x98\x32\xcf\xca\xaf\x1a\x10\xfe\x23\x5a\x7a\x73\xda\x67\x47\x7a\xbb\xcb\x72\x18\x22\xd7\x14\x49\x13\x5c\x32\x6e\xa0\xa9\x33\x25\x7d\x51\x4c\xd1\xd8\x22\x42\xbd\x1e\x6f\x56\x16\xcb\xf3\x88\xd2\xec\x07\x1a\xe3\x68\xbe\xc5\x59\xe4\x8f\x83\x96\xfa\xe4\x6a\x58\x60\x65\xdd\x5f\x16\x4f\xf7\x2b\x94\x75\xda\xa7\xfe\xdb\xd2\x28\x4d\xc3\xee\x1d\xb2\xf9\xd1\x1c\xf3\x4e\xf1\x28\xc1\x9d\xff\x6e\xe1\xad\xb1\x89\x92\x71\x20\x9c\x9c\xc0\xf2\x20\xda\xb8\xfc\x2b\x34\x84\x52\x61\xc8\x2c\x7d\xd2\x52\x64\xef\x45\x3d\x53\x3b\x50\x2a\x4c\x2d\x36\x07\xf5\x51\xf1\x37\xf9\x23\x3c\x45\x7b\x24\x8f\xc5\x1e\x15\xad\x95\x4e\x34\x6a\x5a\x6d\xfe\xdc\x6f\x5e\xee\xbb\xbf\x1a\x0b\x21\xf3\x6c\xc1\xab\x99\xf1\x37\xa8\x42\x0a\x22\x8a\x58\x3c\xab\xe7\xd1\x1c\xac\x82\x8b\xff\x0a\x60\x0a\x9b\xbc\x1a\x40\xff\x36\xf9\xa0\xb2\xca\xbd\xca\xec\xab\x71\x38\x38\xb9\x37\x26\x49\x70\x86\xdc\x97\xa5\xbe\x29\x2f\xd8\x89\xa9\x7f\x95\xe0\x29\xa3\xa4\x71\xc2\x7f\xd8\xc3\x7e\x82\xcf\xe9\x5c\x31\xc0\x71\x3b\x55\xed\x4e\x54\xf5\xb0\xcd\xf1\x7d\x33\x86\x61\x31\xe9\x54\x95\x0a\xea\x7a\x7f\x84\xea\x0d\xb0\xb9\xb7\x6f\x5f\xda\xf1\x39\x75\x60\x88\xef\xab\x2c\xce\xcd\xa1\xac\x46\xf8\xb2\xeb\xe2\x88\x0e\x63\x86\x01\xef\x49\x9c\x6b\x18\x89\x77\x78\x89\x00\x1d\xca\x08\x9f\x91\xb0\x57\x38\x06\xe4\xe9\xc8\xd8\x1e\x7a\x86\x90\x34\x40\x39\xd7\xd9\xdd\x50\x93\x38\x86\x6e\xae\xdf\x82\xc8\xef\x4a\xab\x6c\x3e\xed\x85\xfd\x75\x4f\x4c\xd3\x98\x60\x9d\xd1\x00\x8c\x6a\xb5\x9a\x0a\x4a\x7b\xa1\x2c\xb4\xd1\x31\x1d\x56\x77\x84\xb5\x9e\x2b\xc7\xb9\x93\xb0\x80\x2b\x07\xe2\x75\x69\xc2\x34\xb8\xd2\x09\x31\xd8\x83\xbc\x59\xde\xa8\x81\xfe\x22\xd1\x09\x55\xdc\x3d\x01\x97\x5b\xce\xa6\x41\x3a\x61\x1a\xc3\xec\xc5\xee\x69\x3c\xc3\x74\x22\x62\x4d\x3a\x41\x15\x5b\xce\xf0\x6f\xb3\x4e\x35\x08\xed\xdf\xab\x76\xf7\x9b\x5b\x56\x35\x0f\xe3\xc4\x36\x58\x9a\x1c\x7e\xc2\x24\x6c\xd0\x5c\x47\x61\x64\x2d\xce\xbf\x3f\xdb\xc7\xd6\xd5\x00\x34\xd7\xc0\x7d\xc9\xc6\xef\x55\xa9\x3f\x06\x61\x6c\x9b\x64\x2e\x88\x1e\xbd\x0a\x22\x4e\x31\xd2\xf8\xb3\x5d\x1b\x9a\x0b\xb6\xed\xfc\x31\x19\x45\xb1\x63\x44\xce\x12\xbc\xc7\x17\x28\x23\x65\x23\xcd\x73\x73\x18\xed\x44\x5a\x12\xcb\x73\xc7\x6d\x60\x95\x67\x6f\x99\xcc\xf2\xf6\x95\xfd\x45\x7f\x5f\x4b\x16\x60\xf5\xe7\x3e\xfb\x09\xcd\xe1\xa6\xca\x86\x4c\xd8\xaf\xde\xb6\xd9\x55\x52\x4b\x1e\xa2\x5e\x88\xca\x1a\xa1\x21\xbf\x39\xcf\xfb\xee\x12\x2d\x55\x8c\xed\x57\xdb\xff\x58\xfd\x27\x8c\xbc\x42\xc0\x3f\x46\x4a\x01\x5a\x9a\x24\xe4\x63\x95\xb9\x07\xd0\x6f\x57\x6f\x9c\x8a\x6c\x79\xbc\x19\x20\xa1\x26\x23\x62\x4b\x9b\x46\x1b\x2f\xb4\x6c\x09\x3b\xed\x75\xa2\x95\xb4\xbe\x85\xe5\xa9\x0b\x88\xdc\x11\x9d\x24\xf8\xc4\x9d\x69\xc4\x73\xbb\x14\xf8\xf5\x47\x83\x0c\x82\xc4\x6b\xa2\x7e\x5a\x7b\xa1\x37\x98\x76\xe4\x34\x28\x6b\x96\xe8\x3d\x47\x86\x74\x13\x54\x7a\x1f\x4c\x5e\xd0\xb6\x64\x75\x8b\x04\xb7\x49\x95\x5b\x9b\x88\xc6\x56\xff\xf5\x34\x6e\x1a\x43\x90\x50\xeb\xf2\xda\x29\xea\xb7\x2f\xe8\xcd\x65\x76\x82\x41\x20\x75\xd8\xb5\xcd\x9f\xdb\xf8\x7a\x30\x4d\x21\x50\x41\x1c\x38\x3d\xc9\x39\xa4\xe7\x35\xd8\x62\x3e\x1e\xec\x7f\x16\x84\x41\xac\x2d\x92\xe3\x63\x42\xa4\x1d\xbf\x43\x10\x0a\x81\x98\xbe\x1e\xe1\xb4\x3d\x94\xa7\xe1\xd5\x85\x52\x23\xad\xdf\x5b\xdb\x78\xf0\xf2\xe4\x27\x86\x26\xc2\xb6\xa5\x27\xfd\x6d\x1b\x38\x75\xa7\x30\x4c\x59\x4a\xd1\xf1\x24\x26\x6a\x9b\xed\xd1\x04\x8b\xa6\x3d\x48\x64\xca\x55\xfd\xc7\xf8\xad\xbe\xc6\x00\x42\xc4\x39\x6e\x71\xff\x85\xaa\xdc\x97\xe7\x49\xa0\x00\x91\x34\xd6\x1f\x56\x14\xce\x0e\x06\xa6\x23\x94\xa0\x83\xec\xa5\x5e\xad\x9f\xa3\x00\x33\x1d\x23\xbc\x69\x27\xf1\x63\x75\x84\x40\x6d\x1b\x05\x6d\xe7\x1c\x95\xdc\xc8\x98\x30\x6c\xc3\x2f\x86\x46\x67\xa4\x0d\xa4\x90\x92\x0d\x8f\xbb\xef\xfe\x6f\x34\x91\x4e\x2f\xcd\xa9\x8d\x5e\xab\xc9\x8d\xcf\xcd\x02\x8e\x8d\x93\x87\xf2\xed\xe6\x7c\xb1\x6c\xea\x5f\xc5\xb7\xc0\x58\xec\xbb\x04\xdb\x46\x34\x0f\x68\x5c\x99\x75\xc1\x09\x30\x0d\x61\xea\x85\x22\x4a\xd7\x08\x98\x7f\x9f\x93\x30\x46\x64\xe6\xed\x6e\xb9\xdc\xaf\x1f\x36\x3f\xf6\xcc\x9f\x25\x61\xca\x3b\xef\x58\xf8\xc2\xb6\x3c\xe7\xb3\x22\xcc\x04\x12\x1e\xc8\x21\x95\x6d\x7f\xbf\x5e\x4e\x9e\x4b\x1a\x28\x44\x51\x6c\x4f\x67\xbd\x2b\x5f\xca\x06\x43\xdb\xc9\x18\xca\xb1\xfc\xea\xc2\xd1\x36\xb9\x7d\xb6\xfc\x13\x7f\x51\x3c\xa5\xc2\x65\x47\x7f\x5c\xd4\x44\x8f\x04\xb8\x54\xca\x15\x27\x56\x53\xc9\x92\xf1\x05\x0b\x6a\xc3\xca\xae\x5e\x88\x9a\x5c\x36\x02\xde\x95\x58\x4a\xf0\x27\x15\x92\x30\xf7\x95\x3f\x44\x55\x89\xc2\x93\x48\x7e\xc1\x25\xba\x7e\xc8\x42\x69\xc4\xa3\xa9\x73\x05\x45\x63\x65\x21\xbc\xee\x24\x01\x01\x40\x9c\x4c\xbb\x95\x4b\x1b\x17\x41\x41\x8a\xc8\x16\xa7\x70\x85\x1e\x36\x38\x41\xc5\x56\x9a\xb9\x2c\xac\x7e\xc3\xf8\x77\x2a\x62\x79\x95\x0b\x1f\x1c\x83\x36\xd6\xd0\xc2\xb7\x2c\x2d\xfb\xfb\x78\xb5\xf8\x02\x04\x09\x56\x11\x5e\x9b\x7c\x1e\x22\xfe\x17\xff\xba\xd3\x98\x48\x81\xf1\xc4\xdf\xb9\x66\x14\x98\x18\xd0\x3b\x78\x0b\xcd\xea\xa7\xc8\xcf\x53\xef\x87\x11\x72\xda\x04\x51\x82\x8d\xde\x3c\xab\x9b\xfb\xbc\x94\x22\x47\x7d\x8e\x5b\xc7\x15\x42\x6e\xe8\x15\xbc\xbe\xbf\x95\x26\x60\x61\x10\x78\x8d\xa7\x2d\xa0\xdb\xee\xe8\x51\x99\x28\x30\xd2\x59\x6f\x34\x9e\xd4\x38\xbb\xe6\x9a\x88\x58\x50\x48\x3b\xc4\xfa\xa5\xf8\x03\x8c\xc5\xd8\xba\xc0\x19\x7a\x8d\x9d\xf4\xcb\x9d\x89\x93\x18\xeb\x8b\xa7\xec\x13\xf2\x7a\xd4\xaf\x31\xb1\x21\x5e\x26\xdf\x81\xad\x76\x97\x13\x6c\x8c\x0d\x81\xc6\x57\x42\x14\xc5\xaa\xa6\x9b\xe5\xb7\xd6\xab\xc0\x5f\x0e\x8b\x12\x44\x3b\xbc\xc3\x65\x84\xd9\x30\x8c\x27\x88\x1d\xb8\x59\x3f\x6f\x36\xdf\xf6\xb7\x8b\xcd\x3e\x8e\xfc\xc1\x44\x04\x89\x5b\x00\x62\x54\xa0\xba\x32\xdd\x22\x26\xd1\x96\xff\x90\xd5\x6b\x55\x2e\xcb\xe3\xa9\xdd\x7c\xfd\x09\x52\x62\xfb\xb3\x1a\xcc\xb0\x6a\x66\x52\x12\x1b\xab\x8d\x74\xaa\xa0\x0d\xfe\x77\xed\xcf\x6b\xb6\x67\xd9\x5c\x4e\x43\xb3\x45\x62\x52\xce\x30\xbc\x6f\x13\x95\x5c\x64\xc7\x45\x9e\xaf\x1d\x3d\xb7\x3b\x9b\xe4\x98\xa7\xef\x4f\x96\x8a\x30\x7a\xfd\x4c\xaa\x2c\xad\xff\x5f\xd0\x34\x02\x23\xcc\xc1\x72\x62\x38\x8d\x22\xef\xef\x2c\xea\xde\xc9\xc3\x1f\x17\x4e\x9b\xed\x20\xea\xc3\xbe\x9c\xc8\x82\x18\x21\x03\x66\x1c\xa7\xfe\xad\xcd\x61\xee\x3e\xf4\x18\xcb\xea\x07\x3a\x7a\xe6\xe2\xe1\x61\xb3\xdc\xaf\x96\x9b\xed\xbf\xb6\xbb\x95\x07\x8f\x1b\xc5\xa4\xb7\x84\x71\x4d\xea\xee\x88\x89\x7d\x83\x6b\xde\x00\x9f\x18\x48\xc1\xeb\x0c\x60\xcb\x38\x7b\xc3\xca\xad\xf5\xb0\x1d\x5f\xaf\x09\x0c\xee\x0b\x55\x89\x46\x36\x87\xec\xe4\xd4\x3a\x6f\x31\xa7\x18\xd2\xfb\x8c\x31\x56\xa5\xc2\xa6\x3c\x8f\xc2\x75\x9a\x77\xe5\x6d\x7f\x91\xc3\x0b\xa1\x41\x10\x58\x4a\xd1\x0e\xf5\xae\x44\x03\xab\xe3\x29\x2f\x2f\x30\x1f\x14\xfb\x88\xc8\x7f\x38\x8a\x89\x0b\x08\xb1\x3e\xf0\x28\x3e\x7b\x97\xcb\x99\x4d\xb0\xfd\x84\xb0\xca\xa2\x9e\xda\x31\xea\x0d\xd2\x20\x4a\xac\xff\x9c\x29\xab\xe6\x32\xd2\x6c\xc2\x63\x82\xb9\x2d\x7a\x91\xe7\xb6\xee\xfe\x2c\x2e\xab\x81\x78\xf6\xaf\x9a\xe1\x34\x88\xe3\x88\x39\x40\xbe\x95\x06\xeb\x1d\xe8\xbb\x11\x80\x91\xca\x51\x7c\xda\xdc\xe0\x1b\xb4\xa1\x78\x77\xd8\x24\x28\x0d\x5e\xc0\xc7\xa2\x6a\xb2\x5e\x39\x64\x26\xd7\xa0\x01\x89\xa2\x24\x74\xf1\x72\xa6\xde\x67\x70\xe1\x34\x20\x31\xc3\xba\xc3\x2a\x07\xd5\x54\x65\x91\x29\x2b\x36\x6a\xeb\xb7\x7f\x0f\x5b\x4f\x03\xd2\xde\x59\x87\x48\x74\xd5\x4e\x5b\xd4\x46\x6d\xd1\xe1\xfb\x44\x03\xe2\x0c\x96\x7c\x36\x12\x07\x6e\xe1\x0d\x5c\x7c\x1b\xb8\x81\x8c\x52\x94\xb7\x75\x6c\xcd\x9e\x70\x36\xbb\xae\xd2\x80\x49\x8e\x5b\xcf\xbf\xcb\x73\xde\x3d\xb4\x24\x94\xa9\x75\x4c\x74\x6c\xd3\xc1\x4a\x46\x83\x84\x1a\xa4\x93\xc3\x7f\x4f\xff\x1d\x84\x68\x34\x48\x34\xd3\xba\x33\xcc\x2a\x2c\x7a\x71\xf8\x32\x24\x90\x60\x0a\x24\x2b\x51\x68\x4f\xa9\x19\x56\x5c\x69\x90\x46\x01\x92\x48\x1b\xeb\xfd\xf2\x90\xc9\x4a\x54\x97\xd5\x4f\xe8\xbf\x9f\xa7\x80\x99\x19\xb4\x9b\x73\x21\xaa\x55\xd1\x64\x5a\xe8\x09\xcf\x82\x06\x5c\x72\x44\x1b\xd8\xa6\x7f\xd3\x33\x7e\xff\xda\x09\x9b\x06\x5c\x09\x0c\xbf\xf7\x36\x60\xc5\xdf\x39\x17\xd7\xd1\x40\xc4\x11\x86\x88\xcf\x55\x56\xb6\xcf\xf0\x9f\x67\x38\x77\xbf\x58\xc4\x12\x97\x8c\x09\x94\x68\x74\x05\x13\x3f\x6a\x1a\x08\x99\x60\x5c\xad\x5c\x04\x78\xed\x24\x4b\x03\x09\x06\x17\xdb\x9f\x96\x08\x57\x35\x93\x1f\xaf\x03\x82\x1b\xc2\xd6\x59\x63\x5e\xd7\xca\xc3\x6e\x68\xa4\x85\x7b\xe3\xb7\xe7\x53\x9b\x94\x39\xaf\xf8\xf1\xef\xd4\xa9\x48\xad\x1b\xa7\xf0\x95\xa9\xc7\xac\x68\xe6\x0b\x2c\x34\xd0\x0a\x70\x1e\x35\x50\x37\xce\xe5\x23\x87\xca\x37\x78\xa0\xa9\x31\xcd\xec\xd3\x43\x1a\x68\x1d\x59\x7b\x70\xf7\xb3\xf1\x9e\x4f\x25\xa4\xff\x31\xf9\x16\x4d\x10\x68\x9e\xd5\x77\x59\xad\xbc\xd1\x32\x0d\x20\x32\x48\xef\x42\x07\xa0\xc5\xed\xe6\xb9\x77\xcb\xa2\x81\x31\x29\x70\xc7\x72\xd8\x62\xe6\xe2\x42\x36\x1a\x06\xc4\x2a\x34\xad\x6b\x9b\xa0\x8e\x7f\x54\x18\x30\x01\xbc\xef\x7f\x3e\x95\x5a\xe4\x08\x89\xfa\xbd\x97\xbe\xf0\x43\x93\x18\x01\x66\x6d\xd8\x7b\x8b\x61\xef\x0f\xc8\xc6\x0f\x29\x0c\x78\xca\x45\xe7\x57\xe2\xbc\x47\xd0\x14\x0e\xe7\xec\x64\x74\x18\x47\xb8\xcc\xbe\x80\xca\x4e\x19\xb4\xe9\x62\xfb\x7d\x16\xbb\xab\xc7\xdf\x4e\x05\xd1\x76\xab\x2a\x82\x87\x3e\x86\xa5\x21\x55\x3a\x4e\x7b\x5b\xe0\xc9\xef\x63\x86\xe0\x0c\x7e\x28\xdf\x2c\x16\x67\x24\x8e\x37\xbe\xf7\x61\x12\x73\x04\x7c\x3d\xbf\xac\xf6\x33\x9a\x75\x34\x4c\x8c\xa6\xa4\x43\xc1\x9c\xbd\x26\xf7\x64\x9e\x86\x29\x07\x6c\xfc\x8c\x6d\xe7\xe2\xae\xf4\x41\x43\x1e\x2b\x32\xcc\x79\xee\x45\xde\x06\x26\x6a\x46\x99\x96\x86\x9c\x58\x4b\x10\xdb\x5c\xc7\x88\x15\x93\x88\xad\x67\xce\xd2\x50\xc4\x12\x61\x19\xc7\x73\x7e\x45\x18\xa4\xa1\x48\xd2\xc8\xb2\x86\x2e\xcb\x39\xe3\xdf\x49\x69\xdb\x7f\x4a\x81\x13\x27\x50\xbd\xb5\xa1\x3b\x26\x8d\x76\xcf\x39\x37\xdf\x2e\xb2\xca\xb4\xf3\x56\x1d\x70\x93\x69\xa8\xe2\x08\x5b\xaf\x59\xdd\xf3\x8d\xbc\xe8\xbb\xf6\x83\x74\xd4\x49\x57\xb6\xd1\x55\x67\xe5\x4e\x43\x4d\x15\x06\xc2\x37\x59\x53\x37\x95\xf8\xcf\x7e\xb8\x36\x87\x5a\x59\xa6\x80\x35\x2a\xbc\xc9\xf4\x6d\x66\x1c\xbc\x7a\x5d\x6c\xff\x2b\x64\x39\x79\x2a\xda\x68\x3e\x60\x08\xfa\xae\xef\x6c\xd2\x4e\x43\x88\x15\x36\x1f\x7c\xaa\xe3\xe8\x75\x77\xe7\xe2\x57\xb2\x3c\x34\x84\x34\xc5\x66\x62\xbb\x92\x64\xc5\x9b\xd3\xc7\x9a\x55\xdd\xa5\xa1\x89\x2c\x58\x79\x2c\xd9\x38\x39\xa3\xe1\xb6\xc8\xd4\xae\xfa\x7b\x35\xb5\xef\xf6\x83\x94\x41\x9b\xee\x87\x87\xef\xfb\x38\x0c\xf7\xab\xdb\xf5\x6e\x4f\xfc\xbd\x32\x26\x44\xe8\x46\xd6\xa0\x2f\xc0\xe6\x27\x54\x56\xba\xdf\x0d\x88\x02\x13\x60\xdd\xa1\x71\x81\x5a\x7b\xf5\x6b\x74\xd4\xe9\x47\x28\x64\x39\x35\x15\x88\xba\xd3\x2b\xa1\x51\x18\xd9\x16\xfc\x5e\x9e\x2f\x6b\x07\x44\x1a\xdf\xf8\x28\x8c\x69\x62\x99\xe6\x4a\xe4\x76\x9d\x19\x84\x8b\x34\x0a\xd3\x14\x9d\x5f\xfa\x10\xf6\xb9\x5d\x8b\xc7\x38\x2c\xf7\x2e\x47\x11\x8d\x6d\xf3\xc9\x0a\x3f\xfb\x73\x44\x8c\xa3\x18\xfc\xa6\xac\x40\x97\xa5\xff\x73\x9c\x50\xbc\xea\xa5\xa8\x0f\xe8\x20\x3f\x7b\x8b\x23\xa2\x19\x06\xb7\xaf\x37\xd0\xf4\x55\x2f\x1a\x51\x12\xc4\xbd\xdc\xd9\x93\x38\x82\x35\x89\x1d\x5c\x3c\x4d\x2d\xbc\x00\x5f\xc3\xb7\xf6\xee\xde\x01\xd4\xb7\x67\xd8\x95\x77\x65\xf5\xde\x57\x19\x69\x44\x85\xc1\x48\x66\xb7\x59\xdc\x74\x1f\x57\x31\xe2\xdb\xf4\xee\x65\x7d\x7f\xbf\x7a\xd9\x3f\xad\xfe\xdc\xfd\x58\xad\xfe\xd8\xef\xd6\x8f\xab\xed\x6e\xf1\xe8\x17\x9f\x88\x05\x1c\x1b\x09\xb7\x60\x2a\x71\x51\x83\xcb\x64\x5c\x4a\x9b\x26\x1f\xb3\xc6\xa5\x6f\x6d\xba\xd7\x1d\xd7\x89\x57\xfd\xdd\x81\x38\xfa\x5d\x7f\x34\xdd\xa3\x24\x0a\x11\x8d\xb3\x91\xff\x6e\xef\xeb\x4c\x94\x18\xa5\x34\x45\xf5\x66\x7c\x4b\xf6\xd2\x9f\x3e\x65\x0a\x97\x71\xfc\x73\x58\x37\xe3\xfa\x29\x8d\x78\x68\x23\x8f\x37\x68\xbe\x3f\x3e\x8b\x4a\x1c\xa1\x19\xe8\xc3\xb8\x51\x92\x09\xca\x86\xf6\x27\x36\x0b\x99\x9d\x9d\x91\x0a\x0c\x82\x3f\x95\x37\x60\x1e\x98\x60\x4e\x46\x86\x09\x16\x7d\x9c\xc8\xa5\x55\xb3\x6c\x43\xb8\x9b\x4b\x1a\xb4\xff\xd9\x37\xd9\x11\xb0\x8d\xec\xaf\x57\x31\xa6\xc2\x81\xb1\xc4\x43\x59\x77\x0a\x19\x34\x52\xdc\x06\x17\x6f\xd9\x4f\x10\x1f\xe2\xca\x85\x6e\xf4\xb6\xea\x80\x04\x4e\xc8\xa8\x1d\xb3\x31\xbd\x99\x46\x77\xe3\x75\x60\x29\xea\x1d\x2a\xa6\xac\x6e\x44\x0d\xcf\x57\x21\x50\x04\xdc\x84\x96\x40\xe5\x95\x7d\xd0\xe7\x79\xbc\x14\x44\x20\xa3\xd4\xf5\x9e\xef\xce\x93\x4e\x4b\x7b\x34\x61\xbd\xc3\xe5\xf7\xf5\xf3\x4d\xd9\x99\x50\xd3\x08\x8c\xec\x3c\xf2\xcb\xe3\xa9\x81\x6e\x0d\x89\x0c\x23\x0a\x06\x24\x72\x51\x5c\x26\xda\x00\x34\x0e\xb4\x0c\x15\x82\x47\xca\x7c\x7f\xea\x05\x5d\xdc\xe1\x50\x70\xac\xf4\x15\xe7\xe3\xc6\xbc\x16\x7e\x69\x45\x4c\xda\xec\xd6\x17\x47\x11\x47\x23\x97\xff\x8a\xfa\xb3\xfd\xef\x7f\x84\x3f\x57\x1c\x4b\xdb\xf6\xc8\xcb\x1a\xf6\x05\x7c\x36\x7b\x79\x46\x22\x98\x1b\x40\x42\x8a\xa4\x26\xe7\x31\xe3\xff\x2a\x62\xe2\x10\x43\xb8\x02\xfe\x25\xf0\x61\x34\x49\x62\xa2\x58\xc2\x3c\x7e\xc6\x64\x79\xde\x46\x00\x77\xe5\x08\x29\x47\x63\x9a\x48\xcc\x83\xac\x6d\xc4\xb2\xd4\xc3\xba\x04\x8d\x29\x68\xf4\x72\xc6\x4b\x6f\x03\x92\x02\xf2\x11\xd0\xb9\x4f\xff\x69\xcc\x22\x0b\x4e\x3c\x68\x57\x6b\x9a\x62\xd8\xda\x21\xd6\x6a\xdc\xbf\xaf\x53\x27\x02\x1a\xb3\x58\xe0\x8d\xf7\x68\xe1\x6b\x26\xc4\x5f\xfe\xfb\x65\xd6\x17\x33\x41\xb0\xad\xf1\xba\xbd\x8d\x82\x3e\xf1\xf6\x47\x55\x82\xb2\xfa\x79\xf9\xe1\xe3\xe6\x91\x7c\x13\x8d\x99\x49\x11\x32\x74\x12\xd9\x5e\x68\x3d\xb7\xf2\xc4\x09\x4b\x70\x57\xd5\x50\x64\xd7\xed\x63\x3f\x48\x58\x6c\x0b\x1a\x3f\x8a\x66\xf1\x53\x34\xa2\x7a\xad\xc6\x84\x2e\x1a\xa7\x71\xe8\xbd\xb0\xb7\xe5\xd1\x99\xa7\x8d\x87\xf0\x00\xb0\x3e\xd0\x1c\xb2\xca\xa1\x06\x36\xa6\xd3\xf0\xa6\x31\x0f\x03\xdc\x6d\xdb\x78\xfb\xa9\x7d\x15\x4e\xe7\xa6\x77\x7f\xed\x46\xc5\x06\x3b\x50\xf7\x96\xa0\xf7\x21\x2a\x18\x3d\x15\x11\x45\xc2\x35\x75\xb7\x67\xf9\x98\xe5\x6d\x92\xd2\x9b\x87\x7f\xa9\x3b\xe7\x3f\x9e\x0a\x24\x13\xdd\xbf\x2c\x9e\x57\xdd\x39\x53\x65\x86\x46\x53\xf5\x03\x98\x66\xfc\x76\x0a\x08\xb0\x15\xfb\xfc\xba\xdc\xac\x9f\x66\x35\xcf\xdd\x48\x19\x27\x88\x0e\xc6\xe5\x52\x14\xb6\x33\xe4\xbf\x49\x11\x8a\x21\xac\x9f\xc5\x23\x15\xf4\xc9\x89\x14\xb7\x97\xaa\xcc\xde\x09\xca\xcd\xaf\xeb\xb1\x12\x0a\xa5\x2d\xf2\xac\x6e\x36\xe7\xc6\x57\x81\xea\xee\x4b\x8d\x35\xb0\x47\xff\x80\xc7\xac\xc8\xee\x3b\x33\x60\x1a\x6b\xc2\x71\xe1\xfb\xf1\xf0\x30\x7a\x0e\x10\x10\x41\x3b\xe1\x99\x0e\xb6\x49\x63\x90\x34\xd6\x1d\x7a\x74\x57\x6e\x01\xf4\x13\x7c\x3a\xc9\xfc\xf9\x2b\x04\x25\x51\x40\xa2\xc3\x1e\x8c\x5a\x82\x94\x04\x29\x60\x5b\x68\xb7\x5a\x3c\xee\x5f\x56\xdb\xd5\xcb\x77\xff\x70\x48\x18\xd2\x88\x0e\x11\x9f\x1d\x26\x74\x58\xfd\x21\x61\x6c\xd1\x23\x76\x89\x1e\x5a\xdf\x4c\xf6\x4c\x12\x41\x82\x4e\x37\x6e\x64\x73\x80\x6a\x59\x4e\x20\xc4\x38\x4a\x39\xa3\xf2\xb5\x76\x6c\x68\x4b\xd2\xf2\xdf\x18\xa7\xc4\xf0\x8e\x32\x83\xf4\x4c\xab\x00\x3f\x9f\xa4\x92\x38\x35\xb8\xf8\xde\x3d\x64\x7f\xfc\x9a\xfa\x3b\xbe\x7b\x84\x70\x86\x05\xf4\x73\x71\x87\x4a\x3a\x57\x0c\x60\x4a\x88\xa4\x91\xea\xdb\xbb\x2f\xe7\x5f\x21\xf2\xc7\x67\xa7\x86\x93\x70\xa0\x14\x76\x65\x49\x45\x09\x8b\x38\x1f\x72\x1a\xd1\xdf\x78\xb4\xc6\x13\x16\x07\xde\x43\xfd\xc7\xc3\xb8\x30\x48\x98\xb4\xbe\x8e\xe2\x94\x4d\x8f\x68\xae\x48\x77\x0b\x51\x35\x70\xfc\xcd\xa9\x33\xfa\xf5\xc4\xf5\xe5\x34\x92\x9f\x56\x0b\xff\x37\xfd\x3f\xff\x51\x65\x42\xd7\x11\xd8\x14\xcb\x32\x3f\x1f\x8b\xdf\x66\x64\xc7\x28\x49\x4d\x80\x34\x82\xd5\xee\xdb\xc6\x2c\xab\xcb\xb6\xcc\x6d\x38\xd7\x5d\x26\x0f\x28\x16\xed\x17\x45\xd9\xbe\x2d\x9e\x35\x31\xbe\x54\x1e\x86\x96\xea\xdb\x6e\xde\x9b\x02\x3a\x60\x5b\x7b\x88\x83\xb3\x0c\x5e\x17\x59\xb3\x14\x95\x8e\xba\x63\x44\xa2\x7a\xe6\x19\xbd\x73\xa3\x7f\x75\x7f\xe7\x80\x1a\xba\x0f\x3f\xee\x86\xf3\x92\x70\x50\xd6\x91\x43\x18\xb8\xad\xfa\xa5\x85\x88\x88\x4b\xe9\x77\x59\x7b\xb7\xe0\x5a\x07\x9a\x12\xc1\x19\xb1\xae\x84\x93\x02\x2e\x11\x02\x3c\x1d\xf1\x11\x45\x46\x77\xe5\xe9\x01\x7e\x42\xde\x8d\x50\x84\x23\x77\x04\x0d\x2f\xb2\xe6\xe2\x00\x6c\xdd\x51\xab\x22\x67\xf7\xf9\x73\xa1\xaf\x2d\x36\x29\xd1\x24\xa0\x61\xef\x1e\xb1\x2e\x1a\x78\xf3\xe0\xa1\xd1\x1b\xea\x0b\x53\x44\xb3\x08\xab\x2d\x75\x76\xec\xf8\x1d\x83\xcd\x9e\xe8\x54\x21\x88\xe8\x51\x9c\x4e\x83\xf4\x8c\x80\x04\xd6\x2b\xd6\xf9\x15\xe7\xaa\x41\x45\x69\x48\x2c\xd6\xe7\x71\xf1\xe7\xfe\xf9\x65\x85\x45\x0c\x6b\x21\xbf\xdf\x6e\x1e\x7c\xf9\x81\x86\x94\x49\xda\xb1\x11\xe6\x17\x6d\x1a\x52\x89\x8f\xcd\x01\x97\xea\x1a\x05\x20\xb0\xfc\x30\x59\x87\x68\x98\x32\xd1\x09\x77\x75\xa5\x19\x1a\x4a\x63\xac\x9c\xee\x3b\x38\xb1\xa7\x41\x2f\x87\xd2\x28\xe4\x98\x4f\x2c\x0f\x55\x79\xcc\xba\x6a\x06\x8d\x22\xe1\x35\xc2\x91\x25\xdb\x66\xa3\x76\xe7\x1c\x06\xce\x34\x8e\x13\xee\x54\x04\x6f\x32\xad\xb3\xe2\x0d\x0d\xef\x8a\x69\x3b\x92\x52\x42\x52\xab\x81\x51\x55\xe2\x32\x2a\xcf\x52\xe2\x84\x91\x31\x18\xbb\xc9\xe6\xcd\x4c\xdb\x61\x06\xd3\xbc\x9b\xc5\xef\xeb\xdb\xcd\xcb\x5f\x17\xc3\x69\xbb\x7d\xc6\xb8\xfb\x17\xcb\x43\x76\x1a\x5f\x3a\x55\xa1\xb3\x28\xcb\xf3\xc7\xcb\x90\x88\x47\x29\x13\x01\x12\x49\xbd\x68\xf9\x78\x87\x1e\x3c\xec\x84\x70\x8b\xae\x81\xa1\x11\xca\xe4\xc2\x13\x0a\x9d\x93\xc3\x01\xec\x6f\xdf\x98\x76\x32\xd9\x15\x78\x72\xa7\x12\x11\xa6\x30\x58\x1f\xbf\xc1\x57\x1a\xfd\x94\x26\x52\xa2\x56\x20\xaa\xb0\x4e\x5f\x89\xd4\xe1\xe1\x2c\x75\x71\x86\xe3\xde\x0e\x51\x98\xf8\xc0\x27\xa8\x73\x03\xbb\xcf\x2f\x35\x3a\xfc\x07\x78\x82\x29\xe2\x2d\xc8\xf3\xdb\xaf\xac\x1a\x29\xe5\xb1\x44\xd5\x7d\xbf\x4d\x63\xde\x5b\xe8\x67\x6b\x6c\x33\xa9\xe0\x8c\x6f\x01\x17\x46\xf3\x2f\xd5\xdb\x27\x2a\x6e\x94\x72\x95\x60\x2a\x8a\x1b\xfe\xf7\xd5\x16\xfd\x4f\x9f\x57\x2f\xeb\x4d\x37\xdd\x44\x60\xf5\xb7\xd0\x7d\xb8\xcd\x7c\x3b\x9b\xbc\xbe\xa7\xfb\xb7\xff\x57\xfb\x02\x74\xff\xf4\x5f\xa0\x3a\x47\x84\xad\xc8\xc1\xea\x14\x76\xdf\xcf\x00\xf5\xb3\x7f\x22\xbb\xc6\xc6\xb3\x13\x3a\x0a\xa5\x22\x11\x58\x65\xbc\x87\x63\x27\x11\x43\xa9\x00\xab\xdd\xd5\x01\x9c\x26\x8f\x59\x12\xe1\x31\x15\x88\x4b\x28\x8b\x36\x00\xe9\x3e\x2e\xa9\x55\x75\xb0\xa0\xe6\x6d\xe7\x0c\xbf\xf8\x29\xb2\xbc\x37\x45\xa2\x54\x32\x2e\xe3\x0e\x76\x5d\xd6\xcd\x00\x77\xed\x87\xa4\xd2\x33\x26\x9f\x61\xfa\x0c\xdd\x18\xc5\x74\x90\x0c\xbc\x2b\x6f\x45\x03\x1b\xb3\x14\xc7\x93\xc8\xde\x8a\xf1\x46\x4f\xb5\xb4\xfa\xd4\x95\xf5\xf1\xdc\xfb\x6b\x01\x4d\x70\xb5\xd8\x9f\x0e\x9f\x33\x31\x04\x35\xdc\xd2\xd8\x1f\xca\xb7\xb0\x4b\xc9\x46\x73\xdf\x08\x48\x5c\x51\xe8\xd5\xb7\xad\xb2\x72\x0c\x8f\xa6\x2c\x20\x44\xd9\xac\x4c\x59\x17\x83\x1b\xa1\x5f\xe0\x34\x3f\xdb\x58\x40\x28\xce\x96\x76\xea\xbe\x9e\xde\x2a\xa1\xaf\x9d\x97\x7f\x1d\x1f\xb1\x40\x5a\x88\x68\x0d\xcd\xc6\xb5\x6f\xee\x45\x7d\x1d\x31\xb2\x30\x92\x08\x05\xb5\x90\xea\xdb\x49\x6b\xb9\x3d\xae\x03\x18\xc4\xfe\xcf\x22\xcb\xf3\xac\x6f\x44\x8d\xee\x17\x0b\x8d\xb5\xe3\x52\x59\x63\x9d\xbc\x77\x65\x57\x0f\x1d\x7f\x6f\xa4\xed\xd4\x2b\x4f\x50\x0c\x7c\xab\x28\x8b\x4c\x00\x2e\x28\xfc\xe3\x5f\xcb\x17\xf8\xcf\x39\xab\xd0\x47\xb8\xd7\x9f\xea\x17\x46\x16\x27\x1c\xd7\x89\xc7\xf5\xd3\x7e\xfd\xd4\xce\xc9\xd5\xed\xbe\xa3\xee\x50\x16\x6b\x8a\x71\xa2\x86\xfc\xae\x5a\x7d\x2a\x38\x0d\x99\x96\x6e\x10\x91\xda\xae\x20\x4a\xdd\xb5\x97\x32\xac\xfa\x31\x62\xac\x0e\x9c\xaf\x97\xa2\xe4\x4f\x7f\x50\x7b\xe4\xe1\x53\xd9\x88\xde\x1e\x62\xb0\x78\xb3\x76\x9d\xe7\xc3\x89\xb5\xbe\x9d\x5c\x00\x65\x86\xf7\x69\xc0\x63\xfd\xb6\xb5\xba\x35\x65\x71\xae\x6f\xab\xf2\x34\x59\x71\x19\x95\x71\xda\xbe\x74\x77\x9b\xd7\xa7\xdb\xc5\x6e\xbd\x79\xda\x3f\x6f\x36\x0f\x48\x99\xc3\x85\xe9\xb7\x6e\x20\x60\xc9\xb6\x2e\x4d\xf3\xd8\xa8\x2b\x15\xbf\xc9\x69\x8d\x95\x3f\xdd\xb6\x53\x6a\x14\x2d\x4e\x1e\x33\x23\x0c\x33\x9f\xed\x11\xa7\x70\xf1\xdf\xec\xb7\xee\x88\xed\x5d\x9d\x2a\x70\xab\xc0\x10\x51\x4e\x19\xa3\x92\x5a\x17\xd2\xd2\x34\xaa\x0b\x36\x19\x93\x80\x1b\xcc\xaa\x39\xbc\x40\x9e\x81\x99\xdc\x21\xa6\x0d\xc6\x0f\x7b\x2b\x0b\x66\x65\x03\xa6\x53\x60\xfe\x57\x25\x09\x65\x4e\x9c\xe0\xb6\x8d\x0b\xcb\xd3\x11\x8a\xc6\xf5\x56\xca\x63\xd9\x3e\xec\x19\xab\x07\xca\x52\x16\x20\xaa\xc3\x41\x53\x51\x89\xd8\x1f\xe2\xc2\xf4\xb0\x07\x7f\xb3\xe6\xa7\x22\x4f\x53\xec\x4b\xe5\x6d\x56\xd7\x86\x2f\x83\xa5\x98\x71\x15\x7a\xbc\x75\x1b\xfa\x0c\x08\xd1\xed\x4b\xc3\xb1\x0d\x6a\xb5\xf3\x97\x90\x77\x21\x2d\x13\x5a\x62\x96\xbd\xae\x71\xd7\x9a\x5c\xb8\x8c\x01\x7b\x0d\x47\xd0\xd9\x14\x09\x42\x99\xe4\xda\xfb\x1b\x60\xf1\x7d\x7a\x58\x5a\xaf\xd1\xce\xb3\xf7\xf1\xd2\xf5\xbe\xdc\x10\x15\x06\x58\x64\xde\x3c\xed\xae\xdd\x5a\xdb\xc3\x09\xf1\x31\xfd\x10\xa4\x35\xff\x78\x54\x1a\x62\xec\xd9\x17\xac\x1e\x9d\x10\xca\x17\x6f\xa9\x4a\x29\x22\xd3\xea\x53\x56\xec\x0e\xf0\xe3\x00\xd3\xca\x27\xd3\xb1\x01\xdb\xee\xc5\xe7\x6d\xed\xed\xbc\xc5\xdd\xde\x94\xd5\xfe\x66\xf2\x09\x20\x09\x56\xfb\xc4\xcf\xb7\xf6\xa5\xad\x77\xe5\xb0\x7e\xc3\xda\xfb\xe2\x45\x83\x96\x7f\xc3\xc2\x6e\x72\xc9\xc0\xac\xab\xc5\x36\x2b\xd0\x73\x31\x6b\x2e\x3b\xa8\x9b\x30\xea\xce\x0f\x31\xd6\xa1\x55\x27\x3d\xed\x0e\x98\x38\x75\x75\xe0\x3f\x8a\xf2\xa3\xd8\x14\x9e\xbe\x47\x93\x20\xd0\xba\x7d\x07\xfe\x2d\xd4\xfb\xfe\x23\xeb\x2d\x40\x68\x12\x44\x09\xfa\x69\x23\x74\x2d\xcf\xdb\xa7\xb0\x2e\x9e\x2b\x50\x59\x4f\xd2\xa6\x49\x40\x63\x34\x05\x10\x59\xa5\xab\xf2\xf4\x23\x2b\x06\x6f\x66\x12\x24\xb6\xcd\xd4\x80\x38\x7a\x91\x08\x7f\x48\x5a\xe0\xe8\xed\xf7\xf5\xf3\x8d\x50\xef\x5f\x19\xbc\xd3\x24\x24\x80\xc1\xaf\xb5\x9c\x5a\x3e\x3c\x35\xa5\x4d\xd2\x1e\xc5\xfb\x57\xcb\x50\x12\x2a\x6b\x8b\xf9\x02\x28\x0c\xe1\x8d\x75\xe7\x9d\x67\x68\x12\x1a\x1d\x39\x4d\xde\xe7\x0a\x6a\x55\x65\xa7\x21\xe7\x79\xb4\x5d\x27\x51\x60\x75\xbe\xdf\x90\x3e\xa5\x1d\x80\x1f\x21\xbd\x1b\x63\x1d\x25\xe6\x90\xf2\x34\x89\x34\xa0\xac\x98\x44\xaf\x90\x5f\xf5\x05\x93\x38\x94\x18\x12\xbc\x16\x27\xa1\xde\x5f\xe0\xa7\x97\x44\x1f\xe4\x7f\x49\x4c\x94\x6f\x26\x21\x24\x30\xf4\x59\xe2\xba\xf8\x56\x9e\xa7\x2d\x93\x84\x04\x21\x32\xf4\x45\xbb\x6c\x0d\x69\x9c\xed\x21\x8a\x14\xd4\xd5\xe3\x7a\xbb\x6d\xb7\x82\xbb\xcd\xcb\xbe\x0d\x51\xfd\x00\xaa\xa8\xea\xf1\x37\xed\x2b\xb4\x9b\x04\x5c\x09\xd5\x26\x89\x7a\x74\x98\xd3\x7e\x9a\xad\x08\x25\x2c\x88\x51\xec\x45\x68\xfd\x04\x1f\x5b\x71\x3c\xe5\x80\x2d\xa8\xb9\xc8\x3f\x61\x01\x45\x5d\x3b\x7b\xdf\x86\x92\x61\x34\x61\x0c\x52\xe2\xa6\xbe\xcd\x19\x77\x83\x40\x31\x61\x5c\x48\xde\xa3\xee\xda\x87\x5b\xf7\xef\x78\x42\xa9\xf7\xf8\x69\x2f\xd9\x9d\x79\xf4\xb0\x13\x1d\xa9\x68\x58\x33\xdb\xd9\xa6\x25\x36\x83\x7f\x7c\xcb\xba\x2c\xf3\x1f\x93\x6a\xbb\x87\x9e\x8d\x7e\x49\x1a\x4a\x04\x85\x6c\x45\x73\x97\x7d\x7a\x56\xe3\xe8\x1f\x3f\x32\x32\xba\xcf\xb9\xb7\x4d\x75\x56\xcd\xf9\xeb\x66\xbc\xff\x14\x37\xd4\x0c\x7b\x51\xed\xe2\x35\x4c\xa2\x13\x1e\x2a\x2c\xd2\x1e\xcf\x75\xf3\xad\xcc\xf5\x5d\xd9\xdd\x0d\xce\x12\xd7\xc1\xb7\xee\x49\x7e\xa7\xef\xee\x35\x07\x69\x09\x5f\x87\x45\x56\xb5\x31\xc5\x5d\x7d\x10\xd5\x64\xf1\x4f\x04\x4b\x35\x62\x6c\x1b\x38\x1d\xa0\xf8\x26\x3e\x7a\x7d\x5a\x9a\x08\x95\x60\x1d\xb8\xb2\xc4\x4e\xa7\xc3\xb4\xb5\x32\xc7\x73\xf1\x60\x22\x79\x84\x94\xb0\xbd\x33\x99\x39\xa3\x83\xd7\xec\x8b\x22\x55\x80\xd5\xd6\xdb\x4a\x7c\xf4\x06\xd5\x34\x51\x01\x97\xca\x21\x6b\xa0\x68\x6e\x2e\xeb\x31\x93\x8e\x26\x2a\x49\x31\x62\xec\xdd\xd5\x26\x70\x5c\x3f\x2e\xb5\xe1\x8d\x3e\x1f\x8f\x17\xcb\x23\x71\x47\x34\x11\xa8\xcf\xe4\xec\x15\xb4\xe3\x88\x8f\xbf\x46\xa7\x69\x20\xac\x88\x3f\xd2\xa1\xbf\x70\x91\xfe\xf5\x56\x90\x40\x1c\x62\xe4\xe0\xbe\x6a\x7b\x96\x1e\x30\x33\xbf\x82\xb6\x13\x1c\x41\x58\xc5\x9f\xfd\xca\x0d\x8c\xf2\xce\xd1\xda\xca\xde\x4c\x80\x61\xbf\x20\x06\xd0\x04\x44\xc8\x3a\x46\x2d\xbe\x61\xdb\x8e\x82\xe2\x25\xc5\xa7\x97\x2d\x15\x1a\x74\xdd\xbd\x3c\x0f\x0b\x7b\x89\x71\xf2\x4c\xb6\x16\x8a\xf6\x40\xcd\x79\x12\xeb\xa7\x41\x98\x62\x55\xba\x8d\xf5\xdb\xdd\x75\x0c\xb3\x4c\x83\x04\xb0\xef\x75\x2e\xac\xe6\xfa\x4d\x79\x7e\x3b\x34\x73\x49\x5f\x1a\xc8\x48\x5a\x42\x22\x3e\xe0\x55\x2f\x01\x41\xd3\xc0\x10\xec\x6a\xe7\xc8\x73\xb8\xac\x07\x07\x98\x90\xdd\xdd\xc2\x36\xc2\xa0\x47\x97\x86\x41\x60\x53\x25\xe7\x48\x25\x85\x7a\x6f\x3c\x1d\x13\x33\xf7\x3e\x87\x1f\x67\xf3\x8c\xf4\x7f\xf2\x27\xa3\xb6\x14\xf4\x7b\x79\x10\xc5\xd3\xe5\xad\xea\x6e\x55\x1a\x26\x91\xd3\x3c\xae\x34\x26\x62\xee\xef\x51\x20\x90\xca\x72\x3a\xd7\x87\xe6\x73\x7e\x4f\x49\x23\x46\x70\x4f\x74\xf8\x9a\xf6\x2e\xbe\x9c\x51\x4d\xaa\x3b\x8d\xb4\xe2\xd9\xb9\xc0\x20\x73\xe8\x33\x44\xd3\x48\x6b\xe4\x35\x59\x81\x41\xff\xd7\x38\x60\x86\x7b\x8c\xfb\x97\x0c\x61\x9a\xc6\xc4\x56\x58\x6a\x68\x90\xde\xea\x80\xd5\x7d\x8a\x93\xc6\x3c\x45\xf4\x44\xe6\x2d\x0e\xc6\x8f\x8d\x1a\x86\xc2\xa8\x16\x1b\xe4\x25\x47\xdc\xc1\xc4\x48\x0f\x5a\xdd\x39\xc4\xc9\x4d\xf9\x39\x93\x48\xa5\xa9\x88\xb0\x58\xec\x1a\xa9\x53\xf1\xce\x39\xe0\x70\xc8\xfd\x93\xe1\xb1\x92\x36\xaa\xb0\x6b\xc4\xdc\x17\x08\x46\x03\x24\x9f\x3c\xee\x4c\x9f\x92\xa6\x02\x08\xb5\x86\x0c\x88\xfa\x78\x3e\x54\xa2\x06\xd4\x70\xfa\x9b\x2d\x55\x77\x1e\x19\x58\x0c\xf6\x8f\xac\x78\x87\x7c\xf5\xb2\xf4\xe2\xdb\x34\x95\x54\xb8\x00\xb3\xb9\xc3\x4c\x1c\xf4\xee\xb3\x3b\xc8\xb8\x89\x46\xad\x7a\xd6\x1d\x12\x1c\xac\x7b\x0e\x08\x8c\x4c\xdb\x9b\xb2\x2d\x55\x26\xf2\xb5\x06\xdb\xf9\x99\xbf\x18\xc5\x52\x5c\x57\x1f\x17\x7f\xee\xef\x57\x4f\xc1\xfe\x7e\xfd\xf2\xe0\x61\x86\xa9\x4a\xad\x22\x10\x2e\x11\xcf\xbd\xaa\xa3\x8b\x0c\xc6\x8f\x57\x89\x00\xa1\x37\x58\x16\x6f\xef\x90\x1e\x18\xaf\xd2\x54\xe9\x58\xc9\x81\x5d\xf8\x52\x9c\xd6\xc5\x6b\x71\x55\x5b\x4e\x75\x18\x32\xd7\xb1\x5f\xda\xde\xe1\x20\x6e\xea\xa6\x98\x26\x09\x26\xe4\xb2\x51\xed\x3e\xf1\x7c\x96\x7f\xc0\xe5\xb5\x50\xe5\xf1\xd4\xd3\x79\xc7\x2d\xfd\x7f\x8c\xbf\x46\x53\xec\x07\x40\xa1\x51\x47\xc7\xa2\x4f\xfc\x41\xd0\x28\x92\x6e\xb9\xee\x8e\x18\xdd\xed\xb3\x29\x68\x81\x7b\xc8\xe2\x65\xf7\x63\xf3\xf2\xc7\x7e\xf1\xba\xc4\xf4\xfb\xf6\xf5\x05\xf3\xf0\x6e\x9c\x49\xb1\x58\xe6\x0b\x9e\x7f\x47\x3e\x9f\xa6\x26\x88\x52\xeb\x04\xfc\x74\x7f\xbf\xf8\x36\x70\x52\xa3\xa9\x89\x58\xe4\xfa\x1c\x96\xc9\x65\x35\x82\xfd\x51\x45\x91\xc0\xe3\x51\x86\x77\x65\x05\xd9\x5b\x31\xbb\x88\x1a\xad\x03\xeb\xb2\x82\xaa\x2c\xa3\x83\x3c\x0c\x7a\x7d\x81\xf2\x5c\x29\x4b\xab\x1a\x5d\x26\x0f\x23\x2b\xff\x62\x95\xf5\x87\x9e\xd7\x94\x87\x2c\x40\x61\xe7\xa2\x3c\x76\x5d\x1e\x1e\x1a\x11\x75\x82\x07\xe5\xbf\x41\xb5\x71\x91\x6e\x17\xda\x1f\x59\xa1\xcb\x8f\xf1\x13\xe6\x51\x20\xa4\x0b\xed\x9e\xca\xef\x65\xd3\xd5\x28\x79\x14\x26\xb8\x56\x23\xc4\xa7\xf9\x28\xd7\x05\x96\xce\x57\xff\xb1\x70\xd2\x6e\x18\xd3\x5e\xa9\xbd\xbd\xfc\x51\x1b\x80\x47\xc6\xb6\x83\xb0\xe1\xf3\x81\x53\xc6\xc9\xf2\xcd\x3e\x14\x1e\x93\xc8\x4a\x20\xbf\xbe\x2c\xbf\x2d\xb6\xab\x29\x6b\xc8\x0d\x23\x5c\x52\xed\x70\x4a\x85\x27\xe9\x0c\x0e\x0b\x8b\x04\x11\xd8\x5c\xe9\xcd\xab\x28\x67\x91\xc5\x32\x20\x16\xf7\xea\x79\x30\x9d\xa2\xb1\xb4\x8b\x17\xd0\xa8\x63\xfa\x36\xb9\xa1\x89\x88\x12\x17\x40\xda\x40\x6b\x63\x10\x26\x55\x0f\x24\xdc\x7e\xf4\x0f\x25\x31\x04\xa1\x2b\x4e\x44\xc5\xa6\x3b\x33\xb2\xde\x94\xa7\xc4\x6a\x0f\x89\x3c\x2f\x3f\x16\xe7\xa6\xb4\x28\xeb\xc9\xd7\x73\xc2\x2d\x92\xc2\x5d\xdd\xd7\x0e\x63\xf3\xf7\x99\x73\xab\x78\xf1\x06\xcd\xdd\xf1\x58\x5b\x11\xbd\xc9\x5d\xe4\x22\x41\xfc\xcb\xfd\xbd\x47\x3d\x73\x11\x71\xc1\xba\x3a\xf0\x3b\x3c\x43\x75\xdb\x19\xac\x53\x2e\x4c\x84\x6b\xb7\x3c\x5f\xf6\xf5\x29\x53\xb0\x3f\x42\x8e\x10\x4c\x37\x40\x06\x10\x7a\x83\xb6\x75\xfd\x74\xce\xf3\x61\x9e\xc6\xa5\x32\xb6\xda\x70\x96\x0f\xa5\x8b\x96\xbe\x78\x51\x14\x31\xb6\xd3\x73\x14\x79\xfe\x9a\x15\xcd\xdd\xb9\x50\xbf\x0d\xa1\x62\xd3\x0f\x50\xc0\xe2\xe5\x5d\x96\xe7\x33\x15\xde\x2f\x6e\xd7\x2f\x7d\x05\x28\x57\x5c\x68\x31\x00\x2e\x4f\xdb\x35\xe8\x58\xdd\xde\x43\xd4\x7e\xd2\x03\x5f\x51\xca\x95\xe1\x38\x4f\xb1\xae\xb8\x7a\xf1\x12\x5c\xb1\x3f\xae\x23\x89\x6f\x98\x8f\xd4\x7a\x4b\x3a\x8b\xc7\xf3\xc3\x08\x0f\xa3\x41\xf1\x19\xfb\xa5\xd5\x4f\x31\x7d\x9a\x3a\x25\xb1\x15\x4b\x3e\xe5\x99\x5d\x66\xaf\x3b\xaa\x57\x09\x28\xd7\x10\x71\x97\x5e\xad\x1b\x38\x3e\x43\xf5\xec\xab\x6f\x61\x77\x6a\x88\xad\x1e\x48\x25\x3e\x66\x0a\xfb\x1c\x42\xe5\xdf\x9a\x9b\x2a\x53\xef\x37\xe7\x2c\xd7\x57\x48\x45\x0e\x00\xb8\xde\x3c\xbf\xac\xf6\xeb\xe5\x66\xff\xb8\x7e\xda\xdf\xae\x9e\x37\x5b\xef\x3a\x45\xb9\x61\x21\x62\xa2\xd6\xc5\xe9\x3c\x23\x78\x4a\xb9\x31\xd6\x97\xc0\xce\xb3\x1e\x88\xdc\xb9\xa9\x5d\xd3\x0f\xa9\x08\x42\x60\x6e\x32\xfc\x00\x71\x2a\x0b\x97\x3a\xf9\xc3\x09\x09\xbd\xa0\xd5\x6d\x2f\x79\xa2\xa0\x68\x56\xdd\x4a\x27\x82\x24\x45\x97\x5c\x0b\x83\xf6\x75\x94\x41\x71\x5b\x84\x49\x8a\x95\x9c\x1e\x28\x3d\x90\xc4\x18\xfd\x0c\x11\x82\x50\x1d\xe3\xe7\xea\x5b\xc5\x1b\xc2\xb9\xcf\x73\xe6\x8c\xee\x04\x51\x0c\x49\xcf\xa2\xbe\xc9\xaa\xe6\xe0\xac\x44\x27\xf0\xdf\x21\xac\x52\x44\xd4\x46\xcd\x27\xac\x9c\xef\xe0\x78\x1a\xb5\xef\x45\x94\x04\xc8\x09\x78\xce\xcf\xcd\x55\xd1\x67\xa6\x59\x2b\xa2\x94\x98\xd4\xb7\x82\xee\xca\x73\x35\x7c\x75\x45\x1c\x2a\xbb\x8a\x8b\x02\xad\xbc\xbe\x43\xdd\xc0\x14\x06\x3e\x7a\x95\x44\x1c\x33\xdc\x0d\xf3\xb3\x7a\xbf\xa0\x7a\xfd\xe4\x2d\x12\x31\x31\xdc\xb5\xaa\xee\xce\x79\x5e\x0d\xda\x1d\x22\x56\x56\x24\x07\xab\x57\xd8\x87\xed\x5b\x67\xf3\xeb\x8c\x88\x55\x82\x01\x33\x7c\x9e\xb2\x0a\xd0\x36\x73\x54\x64\x17\x44\x82\x8e\xbd\x8a\x46\x03\x55\x67\x24\x43\x05\x35\x52\xa5\x43\x5c\xd2\xba\x78\xae\xca\xb7\x01\xa0\x42\xb0\xc8\x20\x82\x7c\x97\x75\xa5\x18\xc1\x64\x88\xe9\x9f\x95\x83\x53\x97\xee\xef\x46\x60\x6d\xfb\x05\xb2\xa2\x0d\xdc\xb7\xf0\x13\x2a\x91\xdf\x82\x68\x0e\xc3\x3e\x8d\x48\x02\xc0\x24\xc7\x00\x38\xb2\x7f\xd6\xbf\xcd\x49\x08\xd8\x34\x5d\x37\x08\x5a\x2f\x2b\x1e\x04\xc1\x6b\xde\x54\xa2\x1b\x41\x38\xf6\x26\x0b\x00\xbd\x3d\x57\x3f\x31\xfd\x18\xc6\x0c\x22\x91\x14\xa7\xe1\x49\x54\x50\x34\xcb\x5f\xa0\xec\x45\x1a\x19\x0c\xf1\x5e\x56\x7f\xae\x9e\xc6\xeb\x82\x48\xa9\xe5\xe4\xb8\xaa\xd2\xee\xcf\x61\x19\x58\xf0\x30\x42\x8c\xea\xa7\x1e\xdc\x52\x1e\x5b\x7f\xd6\xac\x58\x66\x15\x96\xcc\x07\x13\x8c\x6b\x26\x1d\x1e\x7b\x5f\xb9\x09\x38\xd1\xa9\xa7\x42\xc4\x1a\xe1\xde\xbe\x8b\x22\x64\x6a\xbd\xe6\xb3\x7a\x59\xe6\xb9\x90\x25\xde\x95\xcd\xaf\x80\x77\x42\x25\x11\x8a\xfa\xb6\x6f\xf3\x8c\xe3\xd3\x64\x70\x6a\x45\xa6\x6d\x78\xdf\x0b\x73\x5e\x9b\x44\x5c\x7f\x14\x3a\x88\xf7\x8f\xb2\xca\x97\xe7\xd3\xcd\xc5\xe9\xf0\xf5\x83\x20\x49\x90\xc9\x5a\x9f\xe5\xb1\x33\x10\x9c\x7e\xc5\xb5\x0b\xcf\x68\xe6\x9b\x00\x52\xde\x11\x8c\x70\x46\xbc\xbe\xac\x47\x15\x3e\x61\x5c\x65\xa1\x46\x4d\x86\xf1\x5d\x35\x31\x0d\x1c\x8a\xb9\x14\xd6\xda\xeb\xe6\xf2\x24\x26\xdc\xe4\x76\x9c\x88\x2d\x02\xb4\x2a\x3f\xea\x76\xf6\xd9\x2d\x6d\x5d\xa8\xb2\xaa\x40\x35\x5d\x3f\xc2\x7f\x80\xa4\xf6\x81\xd7\x53\xae\xc7\x7c\x64\x23\x4c\xaa\x51\x61\x2b\xcb\xb2\xa2\x1c\xb1\xf1\xfc\x00\x88\xa1\x43\xdb\xcf\x18\xc1\x52\x19\x44\x31\x56\x7c\x84\x46\x62\xf2\x24\xf4\x93\x41\x64\xdd\xbd\x4d\x56\xe8\x5d\x79\x7a\xc2\x30\xa5\x3b\xc7\xf4\x19\xca\x00\x80\xe8\x6e\x29\x76\x52\x41\x73\x8d\x6b\x19\x85\x36\x73\x77\x9b\xc7\x65\x74\xfb\x65\x94\x2a\xec\xc1\x7f\x00\xbc\x23\xa3\x7e\x55\xe8\xe7\xfc\x5c\x3f\x96\x45\xb7\x0b\xc9\x48\xd0\x54\xdb\xe6\x47\x09\x03\xca\x85\x24\x41\x80\xad\xe7\xb7\x76\x4a\x3c\x97\x65\xfe\x52\x4e\x6b\x76\x92\x06\x21\xb2\x8f\xda\x2c\xf5\x75\xfd\xe4\x77\x5d\x49\x79\x8a\xed\xe3\x83\xa8\x97\x07\x71\x3c\x6d\xcb\x23\x34\x87\xac\x78\xdb\x14\x73\x5c\x12\x49\x05\x45\x65\xf3\xb7\xec\x27\x6c\x1b\xc8\x73\x51\x8d\xf6\x11\x49\x0d\x58\xa8\xec\x84\x1a\x4e\x25\x93\xc4\xd8\xae\x28\xf2\x5c\x33\xa8\xf7\xd4\x7f\x8a\x81\x50\xc4\x35\x49\x5e\x2d\x16\xce\x1f\x4a\x62\x40\xbe\xf9\xe9\x9a\x8a\x27\x13\x6a\x4f\xe9\xcc\xeb\x7f\x19\xd0\xc9\x04\x54\xea\x64\x3a\xda\xdd\x65\x39\x11\x3b\xa1\x32\x8d\x24\x22\x69\xb5\x70\xae\xbe\x3d\x8a\x56\xa6\x9a\xe1\x4a\xe2\xf3\x42\x57\x81\x31\x03\xd4\xab\x1b\xc9\x45\x62\xb5\x25\x70\xca\xce\x4b\x1a\x8d\x76\x52\x29\x82\x14\x5b\x22\x7b\x29\x6a\xb8\x05\x79\x25\x60\xf6\xc5\x0f\x12\x81\x4c\x85\x57\xe3\x34\xe6\x9a\x97\xf5\x8f\xd9\x46\x8f\x94\x8c\x26\x5d\xa2\x34\x92\xb8\x19\xdf\x5d\xc9\x0d\xf6\x0d\x6c\x50\xb3\xfb\x1c\x56\xfb\xa4\x4a\xec\xd2\x5a\x01\x62\x99\x1e\x4b\x7d\xce\xe1\x1b\x36\x95\xa7\x4f\x49\xc9\x38\x70\xdb\xe8\x42\x29\xa8\xeb\xb2\x7a\x3e\x57\xa7\x81\xb9\x80\x1b\x68\x42\xeb\xc3\xfc\x06\x0d\xb2\xaa\xb3\xb2\x58\x8f\x59\x74\xd2\xf0\x18\xaf\xc9\xd9\x44\x5f\x5b\x9a\x50\x15\x68\xc0\xea\xfe\x83\x90\x50\x41\xb7\x85\xa8\xc0\x08\x66\xfd\x46\x2a\x75\xf0\x61\x57\xbd\x99\x74\xc8\x55\xc8\x65\xe4\x8a\x74\xbf\x8d\xce\x1b\x45\x01\x96\x0e\xf7\x5d\x47\xd7\x45\x17\xd7\x41\x57\xff\xa1\x38\xd4\x4e\x4f\xa8\xcd\xd6\xa7\x7e\xc3\xd3\xc1\xcc\x0a\x92\x36\x1d\x25\xa1\x5e\x2f\x37\x9e\x4e\xa2\xe2\x94\x2b\x2f\x1b\x56\x16\x26\xfb\x4b\x26\x86\xfb\x1c\x89\x0c\xf2\x40\xdb\x35\xaf\xcd\xec\x1c\xbd\x63\xfc\xb3\x09\xb3\x94\x82\x0a\xcc\xf3\x94\x85\xa2\x08\xe3\x28\xc1\x8d\x2b\xf8\x36\x7b\xfb\xca\x05\xce\x0d\xa7\x5a\xd8\xfa\xe2\x76\xf9\x02\x35\x56\x3f\xd0\xe6\xa9\xf2\xf1\x8e\x62\x41\x80\x9b\xec\x21\x7b\x3b\x40\xdd\xec\x65\xa6\xfb\x43\x1a\x3d\x83\x2c\x0a\xe5\x71\xf5\xb4\xdb\xdf\xbd\x3e\xdd\x76\x98\xcc\x81\x75\x09\x55\x2c\xb2\x6b\xa2\x9f\x96\x63\x4d\xb3\x2f\x02\x3f\x95\x24\x04\x15\x80\x0e\xe5\xb9\x86\x95\x7e\x83\xf6\x6d\xa8\xbb\xe2\x94\x4a\xa4\xf5\x7f\x6e\x2a\x80\x7a\x53\x5c\x57\x6e\x54\x02\xb6\xc0\xd9\x26\xbb\xbb\x76\xbf\xf3\x4f\xd6\x89\x3d\x3d\x95\xcd\x0a\x85\xa3\xbb\x9f\x95\xca\x20\xb6\x05\xfe\x02\x6d\xad\xd1\x1b\xac\xfb\xc6\x14\x24\xba\x42\x1c\xdb\x89\xda\x34\x13\x69\x72\xaa\x78\x18\xe0\xbe\x24\xb4\x7e\x84\x9b\xcb\xcb\x72\xf2\xf4\x78\x14\x60\x77\xd0\xa6\x93\xb3\x12\x79\xf3\xef\x06\x4f\xad\xd3\x18\x42\x87\xb6\x4e\xe7\x84\x91\x7f\x4c\x4e\xaf\x22\xe4\x7f\xec\x07\xda\xf9\xb3\x6b\x86\x82\xd4\x6a\xe7\x0f\xea\x67\x8f\xef\x93\x9d\x40\x99\x28\xc2\x38\xde\x92\x08\x36\x1f\xd3\x62\x8d\x32\x84\xe2\x44\xb8\xab\xce\xd9\x94\x23\xa2\x8c\x0e\xb1\xe0\x6a\x33\x99\x78\xca\x05\xd0\x41\x20\x01\x06\x94\xff\x65\x25\xe4\xb3\x05\xb6\x89\x7e\x8c\xc1\x28\x17\xe3\x36\xc7\xb9\xbe\x96\x42\xa5\x3a\x88\x14\x1a\x4a\x61\x2c\x61\xb9\x49\xa3\x49\xd7\x31\x8a\x74\x90\x84\xb8\x09\x1f\xc5\x27\x6a\xc8\x3e\xc3\x28\x21\xd2\x81\x0a\x91\x8e\xf3\xb0\x18\x5a\x2f\x50\x1d\x26\xa1\xad\xda\xbf\x7b\xde\xba\x8e\x14\x44\x0e\x68\xb3\x14\x0d\xbc\x95\x13\xe7\x27\xaa\x63\xcd\xbd\xf3\xc0\xcd\xf9\x32\x72\xf2\x75\x23\x08\xb3\x89\xc6\x1b\x14\x36\x15\xf8\x35\x64\x49\x53\x95\x72\x1b\x8b\x21\xfd\x3f\x2b\xab\xdf\x66\xba\x35\x6e\x30\x0b\x12\xab\xed\x8e\xf5\xf1\x07\xb0\x0e\x99\x7f\xd3\xd4\x8c\xea\x24\x54\x06\x3a\x8d\x35\x57\x84\x1d\x24\x39\x3a\x49\x13\xac\xd3\x1f\xcb\xca\x4e\xe4\x67\xa8\x70\xa5\xbf\x2b\x7d\x4b\x72\x08\x75\xd3\x69\x10\x7a\xbf\x5e\xaf\xdc\x83\xc1\x21\xbe\x5e\x77\x65\xb5\x29\xe0\xa6\x51\xdd\xe8\x30\x88\xc1\x97\xd1\x1b\x91\xcf\x56\x77\x74\x1a\x11\xe1\x66\xdc\xb0\x43\xe1\x8f\x9a\x50\x89\xde\x85\x7e\xd8\x23\xd2\x3c\xd0\x08\xfc\x79\x38\xab\x77\x75\x80\xe3\x65\xf4\xbc\xb9\xb6\x91\x8e\xa8\xeb\xde\xfe\xf2\x8b\x87\x22\x22\x6b\xc0\x7c\xb3\xb9\x19\x9d\x43\x68\x81\xba\x5d\xfb\xd3\xb9\x3e\xbc\x94\xe5\xf1\x09\xa5\x4e\xa6\x33\x7e\x70\x47\x65\x28\x10\xc9\xe4\x9e\x24\x16\xd4\x46\x41\x81\x96\x11\xc3\x5a\x53\x9f\x3f\xfb\xbe\xec\xd5\xd5\xcd\x2f\x25\x5a\x26\x22\xb2\x6a\x7c\x59\x51\xe0\x56\xdf\xde\x95\xdb\x4c\x4d\x27\x95\xe4\x92\xb8\x9a\xcc\xef\xa5\x5c\x17\x3f\xcb\x61\xa0\x3e\x0c\x37\xb5\x22\x89\x77\x2b\xfa\x9e\x69\x28\xdb\xa9\xe5\x1e\xf1\xc8\x59\xde\x0f\x67\x89\x76\xa8\x61\x1c\x99\x97\x45\x57\x4e\x19\x8c\x52\x69\x34\x10\xc7\x0c\xe7\x97\x32\xad\x03\x8a\xed\xce\x53\x95\x1d\x45\xe5\xf4\x1c\x6d\x1a\x3b\x0c\x49\xb4\xe6\x01\x96\xc8\xbe\x9d\x8f\xa2\xd8\x36\xa2\xd0\xe2\x6f\xeb\xbf\x68\x2d\x43\x64\x1f\xec\xd1\x0a\x13\xa1\x0a\xb6\x8d\x32\x7b\x8b\x21\x90\x98\xca\xad\xee\xef\xb7\x03\xc7\xf4\xbb\xc5\xc3\xb2\x6b\x99\x68\x88\x38\x62\x29\xad\x56\x0e\xa2\xb0\xfc\x21\x13\x6b\x1d\xb8\xba\xe3\xb0\xbd\x38\xf9\x1a\xc3\x6c\xb2\x52\x59\x33\x59\x44\x11\xfc\xb5\x86\x2f\xd5\x26\x91\x61\xe0\x4b\xa6\x83\xde\xb3\x3f\x2c\x21\x49\x07\x92\xcb\x30\xa9\x7d\x8d\x1f\x13\x04\x44\xc4\x56\xbd\x04\x25\xb0\xcf\x79\xb7\x39\xd9\x7f\xdc\xb0\x30\x8a\x8d\xf3\x4a\x80\x4a\xe4\xbf\xcd\xb5\xaa\x20\x14\x91\xf5\x7c\xb4\x1d\xf3\x4d\xe1\x43\x1b\x88\xda\x08\xcd\x6b\xe7\x8e\xae\x17\xa2\xd4\xc6\xe5\xe8\xd8\xda\xce\x54\x31\xef\x8a\x39\x28\x73\x43\x64\x34\x36\xcf\x5d\x7c\xea\x1a\xb1\x3e\xee\x81\x38\x35\x2a\x19\xf4\x5d\x76\xd5\x19\x16\x85\xbe\x13\x79\x0d\x0b\x84\x15\x75\x23\x85\x22\xa6\x5f\x61\xea\xba\x5d\x6b\x1b\xd0\x9d\xe2\x98\xd3\xc0\x9a\x4d\x99\xbf\x14\xbe\x74\x27\x27\xa1\x5d\x40\x4e\x67\x99\x67\xf5\x61\x33\x06\x7a\x4d\xc6\x52\x89\x88\x98\xa2\x6c\x32\x73\xd9\xc1\xf1\x74\x53\x81\x50\x87\xdf\xc6\xa3\xd2\x20\x31\x03\x46\xf6\xae\x1c\x29\x09\x52\xa0\xa1\xf4\x5b\x16\x96\x6e\x1d\xe3\xd6\x2a\x98\xf9\x2e\xfb\x6c\x9d\x1a\x68\x4c\xb8\xf5\x2f\x45\x95\x99\x3f\x32\x1b\x0f\x74\xc6\x5f\xf3\x6d\x9c\x36\x52\x40\x4e\xe0\x22\x6f\x06\xcc\xff\xf6\x3d\x34\x61\x97\xd5\xdc\x20\x9c\x6a\xf2\xe6\xb5\x83\xd0\x0e\xe9\x98\x35\xf7\xed\x06\x9a\xa9\xe7\xaa\x3c\x95\xb5\x18\x49\xaa\x53\x60\x22\x40\x29\xbd\x06\xfd\x34\xfd\x75\x00\xd4\xee\xf7\x8c\x2f\x28\xa1\x06\x03\x13\xd3\x1e\x13\x59\x31\xeb\xb2\x43\x21\xe1\x91\xb6\x58\xfa\xea\x4a\x00\xdd\x0f\x11\x21\xc2\x04\x96\xab\xcd\x7e\xfb\x6d\xf1\xb2\xea\x3e\xdb\x26\xb1\xd6\xc8\x69\x75\xae\x06\x60\x52\x48\x54\x94\x30\x67\x6c\xd9\xc5\x41\x90\x18\x81\x1a\xa5\x9e\x29\xcd\xed\xd3\xe7\xfe\x8b\xd2\xd4\x3a\x2a\x9c\x8b\x36\x69\xd8\x9e\xe5\x15\x2c\xd0\x0d\xe4\xc2\xf2\xcf\x3c\x72\xa8\x4d\x2b\xeb\x29\xd9\x1d\x44\x18\x05\xbd\x0c\xba\x75\x21\xdd\x79\x0d\xba\xc9\x42\xd9\x9f\x5b\x48\x83\x9d\xa5\x36\xe0\x9b\x7a\x28\x7c\xd5\xe2\x98\x9c\x42\x72\x8d\xca\x81\xdb\x2c\xff\x09\xd5\x63\xd9\x65\x85\xa0\x52\x6d\x0d\x3a\x44\xae\xda\xa5\x41\xff\xf3\x5c\x36\xe2\xe6\x82\x62\xb3\x7f\x2f\xc1\x02\x1d\x6a\x2b\x47\xd0\x88\xaa\xb9\xbf\xaa\x8c\x81\x8e\x43\x6c\xdc\x3b\x2e\x9a\x9d\x92\xb3\x46\xea\x14\x34\x21\xd8\x1e\xf8\xa3\x3c\xe5\xc2\x47\x8f\xa0\x93\x54\xba\xd6\xff\xad\x98\x15\x7b\x02\x48\x35\x62\xc9\x71\x4e\xab\x7b\x4c\xa1\xd1\xb8\x74\xb6\x32\x30\xf9\x2c\x70\xc4\x74\xe4\x65\xf1\xf6\xfb\x59\x0f\x20\xd8\xe3\x37\xd8\x04\x12\x3b\x46\x37\x59\xf3\xf2\x32\x0c\x49\x4c\xc0\x28\xb6\xe0\x4c\x96\xe7\xde\x95\xc7\xff\xc0\xb9\x87\x6a\xc2\x24\xc4\x39\x76\xf3\xb0\x59\xfe\xb1\xfc\xb6\xe8\x1b\x42\xfb\x9b\xd5\x6e\xe1\xcf\x1b\xa5\x01\xeb\x0d\x21\x06\x7c\x9a\x38\xfa\xdf\xe4\xff\xe6\x1b\x5b\x26\x66\x31\xb6\x26\xee\x76\xbb\x66\x78\x91\xb1\x8c\xb4\x65\x8f\x63\xba\x67\x21\x40\xf5\x08\x4b\x69\x62\x48\xb0\x67\x8e\x55\x8d\x1b\xf8\xcb\x5a\xcc\x78\x17\x98\x3e\x4e\x13\x1b\x6b\xd0\x2e\xf2\x4c\xd4\xfb\xd3\x00\x92\x6c\x08\xb7\x3f\x0d\xc9\xaf\xed\x95\xac\x97\x9b\xf9\xf9\x6e\x28\x87\xc4\x71\x39\xd6\xf5\xf2\x20\xaa\xb7\x4e\x27\xa7\x7d\xc4\x6d\x88\xd3\x07\x7b\x86\xea\x00\x5b\xb5\x96\x69\x61\xdb\x93\xc3\x78\xd9\xb0\x30\x45\xdc\xda\x51\x7c\x0e\xd5\x05\x7e\x40\xd6\x8d\x20\xb1\x32\x03\x0f\x31\xac\xfa\xa2\x25\xa0\x1f\x40\x15\xa6\x2d\x2e\x21\xb4\x2a\xc8\x83\x28\xd8\x30\x61\x65\x22\xdb\xc5\x6d\x59\x1e\x8f\xe7\x22\x6b\x2e\x57\xb4\x18\xc3\x64\x18\xfb\x6d\xe1\xdc\x2c\xc5\x3c\xa8\xd1\x30\x1d\xe3\xea\xe5\x79\x02\xa2\x39\xd7\xdf\x33\x31\xda\xaf\x0d\x33\x11\x1d\x80\x6f\x9f\xce\xc7\x55\xfb\xe3\xe0\x8b\x32\x80\x61\xc6\x62\x3d\x51\xb2\x00\x89\xfa\x3d\xe1\xc5\x24\x9c\x99\xf6\x1e\x2d\x37\x4f\xbb\x97\xf5\xcd\x2b\xa2\x53\x3a\x1b\xab\xf6\xb8\xcd\x32\xbd\xf0\x95\xff\x7b\xaa\x80\xbb\xf6\x9e\x0b\x6b\xa2\x2f\xbe\x9e\x47\x96\x96\xa0\xca\x42\xe5\x67\xdd\xdd\x12\x4e\xad\x31\x98\x4d\x8f\x1e\x45\x73\xb8\x87\x22\x1b\xa6\x28\xd3\x13\x09\x82\xb9\xde\xee\xe5\xdb\x98\xf8\xf8\x37\xe8\xe5\x86\x83\x42\xc9\xcb\x1c\x4c\x43\xc3\xdf\x26\x07\x9d\x09\xe6\x0d\x34\x8f\x5f\x74\x81\x8c\x0c\xac\x26\x33\xbe\x6d\x43\x1a\xc3\x63\x96\x83\xaf\xe2\x1a\xc9\xa3\x30\x74\x06\xd4\x88\xe3\x7d\x00\x61\xa6\xab\xcc\xe4\xcc\x9a\xc5\x56\x77\xa5\xc7\xa3\xe2\xda\xf6\x07\x4c\x36\x6c\xd3\xe6\x54\x8e\x2d\x53\x43\xd1\x3c\x66\x75\x9d\x15\x6f\xcb\xc3\xb9\x78\x1f\x82\x10\x0c\xc4\x76\x1b\x10\xa7\xaa\xfc\x29\x9e\xc5\x9b\x68\xa7\x4f\x39\x9c\x3c\x40\x4c\x3c\x34\xaf\xf9\x22\xd6\x35\x90\xa4\x28\x30\xfc\xb3\x1c\x73\x35\x3d\xea\xb9\xbf\x38\x13\x41\x2a\xbc\x4c\x37\x88\xe3\xf8\xa5\x35\x09\xb3\x8e\x57\xe0\xed\x53\x06\x52\x20\xc6\x80\x48\x3d\x4e\xa7\xd3\x01\x7b\x02\xd0\xa0\xb1\xa3\xd5\x60\xc8\xdb\x0f\x36\x76\x0d\xfe\x9c\x7a\xdf\x0f\xaf\x9d\x05\x81\x4a\x31\xaf\xb4\xfe\xe7\x58\x01\x1e\x84\x35\x2c\x88\x28\xc5\x1a\xfe\xf6\x20\x74\xf9\x71\x53\x3a\x00\x1d\x0b\x22\x61\x10\x61\xea\x14\x29\x6c\x77\xb0\x37\x60\x75\xa3\x88\x32\xdc\x25\x6d\x7b\x91\xe7\xfb\xfa\x3f\xe7\xde\xcb\x83\x05\x49\xa4\x11\x37\x74\xb3\x79\x7a\xdd\xee\x1f\xd7\xb7\xfb\x7f\xee\xfe\xd5\x1d\x14\x0c\xdb\xd0\x6d\x90\xd2\x2b\x06\xce\x66\x68\x2c\x48\x49\x8c\x35\x97\x0f\xc8\xee\xca\xea\x65\x88\xa2\x9a\x0c\x54\x82\x25\x43\x2e\x0e\x46\x32\x65\xaf\xa8\xfe\x0f\xab\x1f\xd2\x23\x1f\x58\x90\xea\x18\xa3\x7f\xcb\x1a\x6a\x5f\x27\xd1\xfd\x42\x1e\x46\x08\x61\xce\xda\x68\x44\xa1\x5a\xf7\x5e\x95\xc5\x4f\xe8\x77\xe5\x99\x4a\x3f\x0b\x78\x4c\x52\x4b\x77\x42\x32\xe2\xa8\x0d\xe9\x86\x88\x38\xc6\x90\xf2\x5c\x43\xb5\x2a\x74\x17\x4d\x5c\x63\xf1\xa6\xa2\xcb\xa3\x67\xed\xcf\x96\x44\x58\x2b\x43\x1b\x6d\x91\xdb\x1d\xef\xdb\x75\xfd\x97\x05\x82\x5b\xed\x9f\xba\xcd\xdc\x11\x96\x7a\x55\x46\x60\x81\x10\x46\xb8\x30\x64\xad\xca\x31\xbb\xc1\x0d\x91\x81\xc2\x3e\x7c\xa7\xd4\x8a\x42\x7e\xa1\xbf\x73\x32\x24\x98\x7b\xbb\x8b\xdf\x95\xaf\xd9\xa4\x8d\xcb\x02\x19\x29\xec\x55\x21\x15\x3f\x42\x65\x2f\x7c\x57\xba\x73\x24\x06\x7b\xe0\x72\x88\xe1\x9a\xd5\xcc\x9e\x54\xa6\x59\xa0\xc2\x10\x19\x57\xf5\x59\xfa\xe8\x7b\x2a\x0d\x30\xfe\x80\x8e\x15\x6a\xec\x3b\x29\xd5\x36\x28\xbc\x15\x97\x2b\x5d\x60\x16\x68\x29\x30\xfc\xfa\xfd\x7c\xec\x5e\x13\x13\x1a\x2f\x0d\xb5\xfa\x9c\xe0\x59\x58\x60\x64\x80\xbd\x5d\x9f\x84\xf5\x94\x35\x16\x18\x1d\x93\xa8\xa3\xd7\xb4\x2f\x2c\xda\xe1\xdc\x7d\x9e\x06\x44\x06\x16\x06\x89\xc2\xb0\x30\xab\x6f\xce\x55\xd1\x75\x51\xfd\xd1\xd4\x20\x10\xcc\x4b\x78\x3d\x94\xea\xdd\xff\xda\xb9\x15\x97\x85\x61\xc0\x8d\xf6\xe8\xd9\x5a\x89\xfc\x3b\xae\x10\x7f\x4b\xfd\x90\x85\xa1\xb0\x4e\x3c\xcb\xf2\x5c\xd5\x70\x23\x6a\xd8\x14\x6b\xbd\x6d\xce\x1a\x2c\x86\x6b\x72\x07\xc2\x28\x48\xf1\x57\x7e\x88\xaa\xc8\x8a\xb7\xd5\xcb\x62\xbb\x52\x23\x25\x34\x16\x46\x82\x48\x07\x30\xda\x97\x88\xf9\x99\x09\x10\x58\x18\x39\xf8\x47\x03\xe2\x18\xf9\xcf\xc6\x61\x12\xf4\x51\xc3\x30\x85\xff\x6a\xee\x7c\xf5\xff\x4f\x45\xa6\xda\x73\x0b\xdc\x9c\x2c\x59\xf9\x06\x0a\x30\x99\xca\x06\xcc\x55\x3f\xae\x5d\x97\xdb\x6c\xce\x26\xf2\xbd\x98\x59\x7f\xed\x31\xd3\x96\xbe\xa3\xca\x1b\x78\xcb\x8a\xa6\xc3\xf4\xb3\x30\x4e\x2d\x1a\xfd\xbd\x50\xfd\x9f\x24\x86\x4c\xbb\xd5\x76\x77\xf3\x72\xd3\xfd\x59\xc7\xd2\x73\xbd\x11\xbb\x71\xa5\xfe\xc1\x42\x1a\x5b\xe6\x46\xbb\x15\xfd\x36\xf4\xcc\x09\xc7\xcf\x76\xe2\x2e\xc6\x42\x0a\x1a\xfb\x35\x8b\x4a\xbc\xb9\x72\x7c\x07\xaf\x79\x2c\xbf\x10\x09\x64\x21\xee\x05\xa8\x4d\xf4\x9f\x33\x0a\x33\xdc\x94\x55\x55\x5e\x03\xcd\xbf\xf8\xb4\xe2\x89\x13\x83\x72\xc5\xc4\xb5\x83\xc5\x0f\x22\x4d\x16\x26\xd4\x3a\x9f\x3c\x8a\x21\xa5\x82\x85\x89\x89\x3c\x02\xb7\x0b\x5f\xc7\xfe\xd2\xe3\xdf\x98\x1a\xeb\x3a\xb4\x83\xe3\xc9\xee\xd1\x5b\xb8\xd6\x88\x98\x0d\xa3\x58\xc8\x13\x43\xc2\x01\x36\x1b\x75\x39\x1d\x00\xdd\x5f\x90\x88\x15\x06\x7c\xf7\xe7\xdb\xf3\x1d\x14\x6f\xd8\xc3\xff\xab\x12\x21\x0b\x85\x64\x38\x8d\x9d\x89\xe8\xf3\x59\x8e\x4a\x2b\x2c\x94\xcc\xea\x29\x56\x56\x6f\x73\xb8\x90\x84\x32\xb1\x9a\xd1\xb6\xda\xb1\xc8\x7b\x11\xcf\x5f\xdb\x64\xb0\x50\x72\x8a\xfa\x96\x1a\x7e\xee\xcb\x73\xb3\x6d\x2a\x10\x47\x7f\x5a\x45\x6d\xfd\xbb\x29\x4f\xaf\xa7\x7b\x31\xd9\x04\x42\xc5\x62\x2c\x05\xef\x07\x15\x44\xa8\x11\xd9\xb0\xcd\xde\x0a\x81\x2c\xae\xc1\x9c\xea\x96\x10\x25\xd2\xd0\x2e\x59\x96\xf3\xee\xc2\x98\xf1\xd9\x35\xd5\x68\x49\x60\x2d\x72\x36\x37\x2f\xfe\xaa\x8c\xb6\x7e\xdc\x37\x99\xca\x6e\xe1\xe7\x19\x72\x5f\xe9\x60\x51\xc0\x12\x0c\x40\xdb\x67\xba\x6a\x0e\x9b\xa2\x3b\x90\xb0\x30\xf4\x66\x4c\x50\x37\x63\x94\x37\x8b\xc2\x38\x44\xc4\x43\xa7\x9e\x6f\x75\x84\xa6\x83\x68\xa0\x3b\x57\x7d\x7c\x4e\x8b\x42\x0f\xf9\x85\x2c\x0a\x65\x88\x65\xef\xda\xfa\xde\x75\xd2\xb6\xed\x11\xaa\x6d\xad\x4f\x03\x1c\x6d\x4f\xdb\x1d\x8a\xb8\xc2\xda\x87\x23\x7e\xcd\xa8\xad\x5c\x3b\xfa\xce\x78\xdd\x74\x37\x2f\x8a\x84\xc4\xdc\xb8\x4d\xbb\x31\x9f\x19\x1f\x8e\x23\x29\x7a\xd9\x9c\x55\xa1\x6f\xc5\xb5\x8d\xba\x1f\x4b\x22\xb4\x8a\xd2\x5e\xb3\xd8\x07\xa4\x9b\xe2\x06\x0e\x22\x37\x7d\x6f\x7d\xb6\x0e\xc9\xa2\x58\x84\x88\x1e\x7d\x57\xea\x3d\xa2\xac\x6e\x2a\xa1\xf5\x40\xd0\x6e\x76\xa2\x46\xb1\xe0\xb1\x97\xbd\xae\xef\xca\x6a\x51\xd4\x1f\xfd\x1d\x8b\x15\xf1\x12\x71\xed\x67\xd6\xc5\xf6\x43\x9c\xe6\xa7\x7c\x44\x02\x67\x86\xea\x3c\xd3\x86\xeb\x4a\x44\xa2\x40\x73\x6f\xbb\x97\xe5\xf3\x6a\x31\x2c\x22\x84\x40\x0f\xd1\xfa\xfd\xe5\xdb\xd5\x6e\x79\xe5\x8e\x71\x05\xdb\x1a\x37\xd8\x58\x44\x64\x60\x6d\x30\x31\xc0\x46\x4d\xd9\x5f\x4e\xd6\x88\xe8\x90\x5b\x41\x40\x14\x6b\xe9\xc1\x57\x93\xb9\x13\xd1\xc8\xf2\x5f\x7d\x7f\x16\x01\x01\xbf\x5d\x57\xb2\x59\x44\x3d\x87\xe7\xf9\x69\xb8\xac\x46\x34\x0d\xac\xe0\xd2\xbf\xfe\x5e\x8f\x83\x45\x94\x1b\x2c\x32\xb6\xfb\x1a\xf6\x2a\x37\xe6\xff\xe3\xec\xcd\xba\x1b\xc7\xad\x76\xe1\xff\x72\xae\xfa\x22\x17\x1c\x01\xf0\xbb\x93\x65\xb9\x4a\x29\xdb\xf2\x2b\xa9\xba\xd2\x27\x2b\x4b\x0b\xc3\x86\xcc\x98\x22\x15\x92\x72\x95\xf2\xeb\xbf\xc5\x8d\x81\x83\x68\x77\xbf\xe7\x26\xd5\x31\x21\x8a\x22\x09\x60\x0f\xcf\x30\xb9\x2a\x16\x46\x28\x12\x8d\x20\xea\xa7\x1b\x95\x0b\x12\x31\x25\x74\x36\x28\x1c\x9e\xfe\x8a\x0e\xe5\xfc\xad\xca\x62\x40\xfe\x87\xb8\xd4\xa5\x5f\x99\xdc\x8f\xcb\x58\x4c\xe5\xff\x83\xf3\x9c\xfd\x38\x4f\x8c\x3f\x6d\x03\xed\xdd\xf7\xf5\x4d\x94\x31\xba\x0e\xae\x19\x4d\x2d\x36\xd1\x84\x3c\xb8\x70\x5b\x7d\x52\x3b\x48\xd0\x2c\x95\x8e\xc9\xd3\x45\x55\xb3\xae\x05\xe3\x7b\xdf\xf7\xcf\x48\x24\x14\xc3\xf7\xa2\xdb\xf0\xb1\x68\xe8\x02\xf1\x48\x06\x09\x86\x8e\x37\x55\xf4\xba\xef\x29\xfc\xf3\x5f\x13\xe9\x1e\x12\xc9\xc8\x28\x6c\x74\xe1\x98\xf3\x3a\xf4\xa7\xcc\x94\x76\x2f\xa1\xa5\x39\xed\x2b\x5c\xcd\x76\xe7\xa9\xc0\x14\x89\xa4\x34\xeb\xee\x6a\xff\x75\xb5\x3d\x7c\x5d\x6c\xef\x7b\xd9\x70\x12\x49\x95\xe2\x0f\xc7\x46\x49\x55\x82\x25\xa8\x60\xa3\x64\xf5\x1f\x37\x4a\x91\x44\x0f\x6d\xc8\xb9\x28\x60\x24\x2e\x48\x22\xc5\x02\x63\xe5\x77\x11\xca\x63\x7e\x7e\x0e\x0c\x0e\xdd\xb8\x2c\x30\xd4\x3a\x5e\xfb\xa0\x5b\x4d\xc6\x40\x2c\x9d\x54\xce\x20\x98\x34\x04\x8b\xe6\xb7\xe1\xe4\x01\xe0\xc6\x5f\xa3\xbb\xe7\x3b\x68\xdb\xa2\xfb\xc6\xd1\x5e\x17\x87\x22\x8d\x4d\xba\x0e\x85\x9a\xaf\x51\x91\x38\x04\x2b\xf2\x53\x15\xef\xb0\xde\xfc\xf6\x41\xb5\x71\xb6\x48\x41\xe2\x28\xa2\xa2\x87\x85\x18\xfb\x9e\xbd\xb3\x21\x73\x63\x92\x88\x5a\x6f\x4a\x9d\x17\x03\x8a\xda\x78\x0a\xc6\xdd\xa3\x8f\x1d\x38\xc9\xf5\x86\xdd\x8b\x1a\xc7\x12\x30\xcc\xcd\x5b\x38\xa1\xe3\xe0\x47\xa4\x8b\xc1\x5d\x8a\x13\xc2\x30\x2d\xcf\x4f\xfc\x17\xd6\xdf\x86\x0b\x4d\x4c\x32\x2a\x87\x82\xef\x9f\x56\x8b\xba\xe1\x80\x11\xd8\x04\x0f\x42\x62\x22\x64\xec\x8c\x20\xab\xeb\xe3\xe5\x17\xd6\x31\xff\xbc\x36\x46\x62\xca\x14\xf2\x2a\xfe\x5d\xe5\x25\x26\xe2\xe3\x8a\xb6\x1b\xa5\x4d\x3b\xf9\x8b\x93\xa5\xb9\xe7\x2d\x5f\x4c\x5e\xf7\x98\x29\x6a\x6a\xae\x86\xfb\x78\x5f\x9d\x78\x7e\x93\x87\xb8\xb1\x3a\x76\x2a\x02\xf7\xeb\xdf\xef\x0d\xa5\xdf\x35\x49\xed\x98\x2c\x61\xa1\xa5\xa7\x7c\x3f\x9f\xa1\xbe\xab\x2e\xa5\x32\x34\xa5\x3d\x4a\x76\x9e\xba\xdd\xdb\x8f\xb6\x12\xeb\xc8\x7c\xb4\x15\xdf\x0a\x9d\xf7\x1c\x37\x70\x7c\xb5\x9c\x50\xc4\x4a\x9e\x90\xee\xb4\x29\xe1\xa5\xe0\xfe\xab\x45\x10\xe1\x94\x32\x52\x47\x3b\x5e\xbc\x4f\xf5\x10\x49\x2c\x08\x0b\xa1\x0f\x69\x2c\xd5\xdb\x3c\xdf\x39\x03\xe3\xee\x13\x02\xb5\x78\xee\x73\x1b\x7d\xf7\x11\x6e\x2c\x59\x3c\x92\x97\x76\x8c\xd5\x72\x0e\xae\x44\x62\x15\x33\xb0\x06\x3f\x67\xa8\x1b\x8b\x12\xbc\xa9\x09\xb8\x45\x2d\x56\x49\x86\x01\x34\xbe\xda\x48\x3d\xf9\xbe\xbb\xff\xb1\x5a\xbb\xaf\x57\x3c\x35\x05\x87\xaa\x42\x59\xfd\x73\xd4\x1f\x61\x89\x74\x5a\x5e\x6d\x5b\xc0\x96\x97\xaa\x9a\x97\x6a\x25\xb1\xd2\x06\x53\x62\x62\xb9\xbf\x57\x62\xd5\xc8\xda\xb1\xf6\xc2\x8f\x89\x4a\x93\xd4\xec\xd2\xcb\xe2\x91\x18\x94\x46\xbf\xaf\x47\xe0\xb5\x9f\x3a\x5a\x50\xe5\xdc\xd4\xd5\x1e\x7e\x4d\xe6\x72\x12\x04\x02\xfb\x3d\xcd\xa5\x39\x83\x7f\x4b\x92\x20\x49\xb0\x94\x6b\x9c\x9d\xbe\xc1\xb5\x99\x7e\x8e\x90\x98\x8f\x58\xea\x7e\xfb\xb0\x22\xa9\xa6\x91\x71\xff\xc1\x72\x96\x04\xca\xf8\xc9\xbd\x5c\xc4\x42\x4a\x38\xdf\xac\xb1\x49\x48\x74\x02\xb6\xe9\xfe\x50\xdd\x3a\x40\x0f\xd6\x8f\x24\x14\x0a\xc2\xb1\x97\xfd\xe4\x6c\x91\x30\x32\x72\x79\xe3\x55\xe9\x36\x65\x71\xb5\x95\x2b\x3f\x28\x43\xcc\xda\xdd\xe5\xd8\x37\x8a\xf1\xcf\x78\x93\x9e\xf6\x2f\x87\x97\xd5\xf6\xb0\xda\x7f\x3d\x8c\xab\xfd\x24\x89\xc3\x0c\xdb\xfd\xfb\xed\x1f\x87\xcd\xa9\xcc\x55\x17\x03\xd7\xfe\xa8\x32\x8c\x96\x03\x76\xc5\x6d\x03\x79\x12\x2f\x7d\xb4\x90\x7f\xb6\x30\x25\x89\xed\xa3\x36\xd0\x1e\x74\x55\x8d\xaa\xb7\x49\xa2\x18\x42\xfa\x72\x59\xc5\xf8\x46\xbb\xcb\x49\x34\x09\x84\x25\x97\x43\xf3\x3a\xfe\x14\xaa\x95\x77\xbf\xe4\xcb\xea\x1e\x50\x42\xf8\x4f\xbb\x9f\x1f\xf6\x5e\xc7\xcf\x20\x25\x1c\x5d\x3a\xbb\x2d\x7e\xb9\x78\xc1\xfb\xf8\xb8\x7e\x72\xcc\x2f\x92\x90\x3e\x79\x9a\x48\xdd\x3d\x54\xf5\x20\xd1\x4d\x08\x13\xb8\x47\x9f\xba\xcc\x79\x0c\xb0\x23\x09\x0d\x34\x3e\x2e\x13\xba\x59\x49\x7f\xc7\x98\x70\x63\xc2\x34\x35\xb2\xc6\x27\x7b\xea\xe6\x0e\x74\x55\x03\x16\x29\x1f\x79\xe3\x47\xb2\x34\x46\x98\xd6\xb9\xf2\x6a\x51\x24\x61\x12\x68\xea\xa9\x5b\x43\x99\x9b\x11\xd1\x93\x60\x67\x2f\x19\x54\x03\x0c\x6e\xed\x06\x47\x4a\x12\x9e\x00\x26\x97\xee\xa2\x79\xb1\xac\x4a\x85\x98\xc7\x71\xb7\xa7\x27\xb9\x61\xf6\x39\x39\x8b\xd4\x3c\x71\x4c\x5c\x6e\xb4\x4e\xf6\xd5\x18\xae\x68\x87\x42\x1c\x25\xa1\xab\x00\x8d\x2e\xbd\x5f\x15\x6f\xab\x5d\x89\x0e\x53\x14\x31\x52\xe8\xf6\xba\xe7\xcd\xdb\x38\x98\x49\x03\x42\x23\x5b\x19\xfe\x52\x83\x43\xaf\x8e\x5e\x84\x34\x20\x0c\xeb\x1f\xa2\xaa\xde\xf2\xf2\xf8\x04\x2d\x57\xbc\xe5\x0f\x55\xfd\x0d\xae\xd3\xf3\x49\x8e\xee\x2c\x3a\xaf\x9b\xf6\x07\xc0\x1b\xa2\xa2\xd6\x65\xf7\x9f\xf6\x71\xa4\x61\x28\xa1\x27\xde\x2e\x2b\xd5\xdb\xd0\x0e\x5f\xed\x34\x8c\x00\x2f\x5e\x77\x3b\xa4\xc1\x7b\xb8\x23\x89\xc2\x33\xd8\x87\x33\x30\xc9\x21\x69\x98\x19\x3a\xcb\xb1\x37\x88\xef\xc5\x36\x48\x1a\x51\xd3\x91\xdc\x94\xf0\xa3\xaa\x0b\x65\x3c\x3b\x7b\x5a\x06\x49\x23\x96\xb8\xea\x6f\xf7\x54\x8c\xff\xcc\x19\x7c\xcc\x94\x46\x92\xe3\x44\x7d\xac\x7e\x4a\x5e\x8b\x11\xcc\x95\xa4\x91\x4e\xa4\xdd\x5a\x90\xae\x70\x03\x28\x21\x69\x1c\x88\xcc\x62\x14\x17\xb5\xc8\x3f\xb2\x85\x27\x69\xac\x52\x23\xed\x64\x2a\xc4\x2f\x75\xf5\xeb\xfa\x61\x84\x36\xdb\xf5\x1a\x85\x3c\xdd\xf9\x90\x18\x67\x22\x4a\x2b\xdb\x86\xe0\xf0\xb5\xff\x75\x31\x48\x6c\x6f\x5f\xca\xc6\xc0\x46\x04\x6e\x18\x2f\x55\xe5\x16\xa4\x34\x49\xcc\x96\xbf\x5e\x6e\xb6\xdd\x0d\x76\x7f\x4f\x83\x00\x3c\x9e\xc2\x55\xaf\xdd\x9e\xcf\x8b\x7d\x5f\x88\x4a\x49\x20\xb1\xf8\x77\x68\xf8\x3b\x8c\x4c\xf8\x26\xb7\x80\x44\x1a\x06\xfc\xef\x87\xaa\xfe\xc9\x6b\x05\xce\x81\xec\xe6\x6e\x8c\x7e\x2f\xc9\x44\x08\x3e\x7c\x5a\xbb\xc2\x4d\x4a\x59\x80\xcb\x3f\x94\x6a\x2d\xfd\xe5\x33\x15\x61\x61\x1f\x1d\x14\x5f\x8a\xaa\x75\xb6\xbc\xdd\x4f\x18\x82\x49\xff\xf9\xaf\xf9\x3c\x6e\xf4\xdd\x59\xe8\x36\xc4\xf6\x79\xf7\xf0\xc3\x35\x25\x7d\x53\x26\xe5\x41\x88\xdd\x3c\x0c\x00\xc6\x3f\x9a\x47\x80\xa8\x2c\x5d\xd5\x12\x56\xa7\x73\x3b\x9d\x66\x5c\x47\x58\x6f\x7b\x29\x2e\xcd\xf0\xdd\x15\x41\x80\xfb\xe6\x48\x3e\x62\x5a\xcb\x19\x5c\x83\x08\xb5\x0a\xfc\x0d\x6a\x40\x5e\xda\xfc\x1d\x2c\x7d\xd1\x8d\x49\x32\x5c\xe6\x0f\xb5\x57\x0b\xe8\xd3\x90\x54\xd0\x04\x51\xb9\x5d\xcc\xc6\x5b\xf9\xfa\x85\xe7\xe5\xe0\x20\x8b\x26\x00\xdf\x9a\x97\xf2\xd5\xcf\x46\x91\x11\x8c\xac\x9e\xae\xf7\xbc\xe4\xa3\x79\x24\x32\xa3\x98\x7c\x69\x90\x3a\x7d\xe9\x3f\x23\x8c\x3f\xf9\x89\xbf\xc1\x42\x55\x88\x6a\x1a\x41\x57\x52\x3b\x50\x86\x11\xb2\x1f\x0c\x6f\x02\x83\xc9\x49\x91\x30\x95\x3c\xc2\xf4\xe7\xd6\x44\xf1\x2f\xee\x99\xf6\x3c\x2a\x34\xce\x7d\xba\xae\x4e\x53\xab\xb0\xee\x68\x26\x7b\x30\x8c\x33\xe6\x5c\x99\xfd\xe2\x26\x35\xfc\xb3\x5d\x7a\xfa\xf7\xb9\xbe\x4a\xaa\x88\xc7\xea\x0e\x3c\xc9\xdc\xc1\xcc\xe0\x93\xcf\x97\xe6\xf5\x77\x28\x55\x35\x55\xaf\x1a\xbe\x22\x8a\x67\xdc\x38\x85\x6d\x9e\x36\x88\xa6\x58\x2c\x97\x9b\xef\x8e\x8a\x46\x52\x05\xf1\x00\x53\xbd\xcf\xdb\x62\xea\xd6\xe7\x07\x72\xdc\xc5\x9d\xda\xf3\x87\xf7\xfa\x93\x59\x85\x91\x33\xce\x2a\x59\x95\xf8\xc4\x64\x51\x35\x79\x79\x1c\xae\xf1\x40\x63\x30\x5e\xbf\xc0\xdf\xfd\xaa\x05\x99\x89\x61\x8d\xa5\x0f\x1f\x77\xda\xed\x18\x1d\x44\x49\xdf\x79\xc2\xb5\xbb\xbe\x9a\xbe\x6b\xb3\x1c\x41\x1d\xc7\xb7\x5b\x87\x0a\x61\xf8\x22\x3f\x3e\x56\xd5\x79\xf2\xfc\x75\xc4\x91\xf9\x0d\x65\x5d\x15\xfe\x7a\x74\x0a\xb8\xfb\xf7\x5e\x50\x61\xf0\xb4\x9f\x60\xef\x08\x09\x42\x2d\xba\x61\xef\x39\xfc\x34\x62\x05\xa3\x4b\x26\x81\xa4\xd8\x78\xb6\x08\x84\x71\x61\x8c\x04\xca\xd8\xb8\xc9\xea\x74\x1e\x02\xa6\x08\x09\x79\x86\xb2\x1e\x20\xab\xe6\xda\xb4\x70\x1a\x40\xae\x08\x09\x45\xac\x4c\xc4\xd5\x05\x23\x73\x1d\x63\x12\x09\xa3\xfd\xaa\xaa\x59\x20\x27\x21\x11\x64\x5c\x3b\x15\xe3\xba\xa9\xca\x6e\xcb\xe1\x6f\x30\x4f\x24\x27\x24\xd2\x86\x26\x3e\x54\x0a\xdf\xb5\x5d\x66\xec\xae\x2a\x4e\x4c\xad\xc0\x20\xa4\x0c\xbb\x60\xd1\x6e\x01\x45\x25\x07\xba\x91\x84\x24\x91\xb1\x4c\xb3\xfe\x08\x86\x9b\xf8\x31\x51\x75\xfc\x38\x49\x12\xa5\x28\x59\x70\x97\x23\x04\x75\x5d\xaa\xfc\x58\xf9\x53\x53\xab\xa8\x51\x86\x11\x43\x1b\x17\xb7\x2d\x24\xff\xf2\x43\x52\x1c\xe2\x4a\x20\x8b\xb6\xe5\xf2\xcd\xd7\xba\x49\xa2\x18\xd2\xb9\x9b\xd7\xea\xe7\x6b\xd5\x9c\xf3\x76\xa2\x0d\x41\x48\x02\x21\x04\x2e\x15\xc4\x6b\xdd\xff\xac\x26\x37\x38\xa5\x01\x62\xb5\x0c\x20\xb3\x59\x97\xbd\x45\x08\x21\xa9\x12\x3c\xb0\x41\x86\xf3\x7c\x54\x2e\xa1\xff\xe0\x09\x90\x28\xc6\x6e\xec\x6a\x2f\x78\xf9\xf6\xa3\x72\xf4\xd0\xee\x08\x60\x9c\xf8\xbd\x8b\x57\x66\x7b\xf6\x6e\x20\x25\x54\x0c\xc5\x7e\xef\xa0\x7d\xa8\x6a\x07\xfe\x2f\xf8\xd5\x40\xda\xc6\x9f\xa2\x4c\xc7\xbd\xbb\x07\xa2\x1e\x6a\xcb\xf0\xb8\xed\xd9\x13\x16\xa5\x28\x4c\x8b\xb0\xbc\x17\xa8\x7b\x21\x7e\x42\x18\x4f\xb1\x82\x37\x91\x1a\x65\xfd\x71\x63\xbe\x2f\x2e\xd7\xb9\xba\xb0\x1b\x05\xa1\x36\x2a\x3e\x5d\x68\x0a\xcd\x40\x3e\x9c\x90\x2c\xd0\x88\x0d\x2c\xe1\x57\x6b\xd3\xe7\xc9\x05\x66\x61\x34\x58\x7d\xcf\x2d\x38\xc6\x2c\x21\x3c\x05\xd4\x78\xfa\xc9\xdf\x61\xc9\xcf\xa1\xff\x3b\x11\xb8\x83\xe4\x0d\x32\xcc\xfc\x8d\xe7\x9c\x62\x4b\xee\x7c\xa9\x61\x02\x02\xb0\x23\x84\x4e\x10\x0e\x77\xff\xf8\xcd\x7d\x48\x26\x21\x26\x3c\x8f\xbc\x3e\x76\xdf\xe2\x15\xd0\x0d\xf2\x67\x52\xa5\x27\x92\x10\x67\x35\xf3\x54\x95\xc6\xb1\x03\x78\x5b\xd5\x73\xa6\xa9\x84\x48\x0e\xb8\x22\x9d\xf9\xf5\xa1\xaa\xdb\x4b\x39\x7d\x3e\x2a\x14\xcc\x2c\x3a\x97\x12\x85\x1a\x67\x60\xd5\x84\xa8\x84\x60\x08\x78\xbc\x9e\xc6\x36\x6a\xdd\xd5\x30\x04\x57\x6d\x57\xff\xf3\x7d\xb5\xdb\x1f\xb6\xab\xbf\xaf\x96\xfb\xd5\xfd\xe1\xee\x8f\xc3\xd7\x8d\x93\x77\x26\x44\x29\x8e\x31\xd6\x4f\xd4\xbe\xef\xeb\xef\x44\x29\x40\x38\x12\x46\xa2\xe6\x85\xeb\xb7\x34\x02\x41\xa0\x99\x9b\x5b\xa7\xbc\xbc\xe7\xcd\xab\xe8\xbd\xc1\x08\xd1\x69\x88\x78\x8a\xc5\xaf\x1c\x56\xdb\x25\x8d\x42\x97\xf4\xf4\x23\x62\xb4\xde\x95\x97\xba\x97\xc7\x22\x44\x13\x70\x4c\xd8\x75\x63\x66\xbd\x3f\x44\x0d\x4b\xb9\x32\x8a\x30\xed\xff\xa0\x99\xec\xec\x96\x67\x3e\x41\x03\x4d\xa5\x97\x29\xfc\xca\x27\x99\x3f\x0d\x13\x8d\x64\x00\x68\x5f\x0f\x5e\x6b\x8a\xd0\x90\xaa\xd8\x23\xfa\xa1\xc9\x15\x94\x5d\x86\xfa\x04\x0d\xbf\xf5\x7b\x1f\x06\x95\x34\xe4\xd2\x29\x6c\x21\x81\x1d\xf3\xe4\x69\xa1\x87\x86\x16\x5b\x58\x95\x18\x51\x61\xdd\x6c\xf5\x0b\xe4\x8d\x80\xc2\xe8\x9d\xa0\x51\x94\xc6\xa1\xfb\x31\x77\x55\xd5\xbd\x65\xb7\xcc\x3d\x42\x23\x30\x81\xcb\x17\x68\xef\x0c\xcf\xc7\x85\xb1\xe3\xf3\xc5\xda\x18\xa2\x34\xa3\xca\xe8\xcd\xfa\xee\xb3\x6e\xdb\x5f\x19\xaf\x56\x34\x49\x82\xd8\xa8\xda\x56\x05\xf0\x72\x5f\x7d\x5f\xfb\xaa\x03\x4d\x98\xe2\xae\x2b\xd4\xfd\xa6\x71\x0c\x4e\x13\x1e\x60\x6d\xd6\x78\xc0\xcc\x2f\x87\x34\x8d\x12\xd4\x44\x42\x10\xe1\x2c\xb7\x75\xfc\xcc\x53\x46\x12\x43\xe7\x7d\xaf\xde\x60\x40\xfb\x1d\x45\xf4\xe3\x5b\x41\x94\x31\xba\xf9\xb2\x5d\xb8\x0c\x87\xd2\x6e\xff\x70\x5c\xc4\xf3\x9e\x8b\xf9\xc0\x85\x52\x45\xa8\x71\x1b\x93\x95\x82\xb1\xfc\x90\x1d\x92\xc5\xc4\xe9\x87\x3b\x98\xa8\x77\xb8\x0f\x47\x92\x35\xb7\xff\x6b\x4f\xc1\x95\xe9\x13\xf2\xbc\x9e\x22\x65\xa8\x90\x1a\x53\x96\x2e\xbe\xb1\xf9\xfc\x12\x41\x0f\x05\xa8\xc7\xfc\xe6\xfd\x90\x89\xce\x48\xdf\x58\x5f\xb7\x70\xfa\xcc\x1e\x83\x50\xa9\x34\xce\xd4\x2e\x38\xdd\x14\xc6\x5b\x67\x3c\x42\xc5\x29\x66\x1a\xdf\x4f\x5d\xe0\xfa\x0e\xc5\xb3\x8f\x92\xa8\xb2\x2c\x1a\x2c\x00\x0c\x30\x62\x14\x02\xe3\x23\x85\x2b\x8c\xa9\x89\xe6\xe5\xf1\xbe\x1a\xda\xc3\x13\x0a\xb1\x42\x78\x3d\xb4\xaf\x7b\xfe\xab\xe7\x75\x10\x0a\x8c\x73\x63\xc6\x92\x6b\x3d\xee\x11\x50\x00\x95\x38\x67\x33\xdc\xda\x0d\x34\x64\xf6\x01\xea\x58\x22\xeb\x84\x8b\xa9\xa9\x3f\xa1\x5a\x2a\x9c\xaa\xe6\x56\x61\x19\xeb\x73\x8d\xd6\xf1\xb9\x59\x40\x25\xcf\xfc\x9c\x2d\xb8\x7c\x2b\x6e\x1e\x08\x0b\xa3\x68\x54\xcd\x29\x9b\x41\xcf\x70\x6e\x5d\x63\x21\x64\x08\xef\x3a\x28\x43\xba\x36\x1a\x04\x83\x05\x9a\x85\x3a\x33\xd2\x27\xfc\x1d\xba\x95\x17\x93\xef\x9b\x34\x76\x38\x1b\x59\x14\x0a\x8d\xc9\x45\xae\xa0\x9a\x84\xaa\x2c\x4a\x04\xa6\xb0\xdb\xd5\xe2\x65\xb5\x3d\xac\x9f\xf7\xdb\xd5\x8b\x2f\x07\xb0\x48\x66\x60\x82\xc5\x46\xe6\xa5\xfa\xbd\x6a\xc7\x5a\x2a\x84\x45\x10\x65\x36\x1a\xf3\x05\xe9\xb1\x14\xe4\x78\xde\x77\x1f\x40\x54\xd7\x8b\x67\xd8\xda\x03\x31\xd3\xa8\x7f\xbb\x14\xdd\x8f\xfa\xdf\xd1\x0e\x09\x4b\x38\x37\x7d\x65\xdc\x50\x17\x45\x0d\x5c\x5d\x5f\x78\xae\xee\xfa\x9d\x86\x25\x8a\x22\x24\xb4\x4b\x46\x0f\x6b\x27\x2b\x8f\xef\xe5\xa1\xad\x0e\x8f\xb9\x06\x79\x95\xbe\x3c\xcb\x52\x6d\x92\xe0\x5d\x5e\xc8\x3f\x4f\x84\x3f\x8d\x9c\x19\x11\xd6\x15\xbb\xe5\x47\x38\x44\x43\xe6\x04\x61\x2c\xe5\x18\x5e\x5a\xab\x08\xf7\x57\xce\x45\x6f\x70\x6a\x5d\x67\xdf\x27\x51\x0e\x63\x2a\x30\x35\x33\xcc\x9d\xdf\xe0\x3a\x3d\xae\x59\xa6\x9c\x0d\xd6\x04\xa9\xc7\xb2\x20\x44\x69\x3e\xae\x94\x41\x1b\x0f\x31\x85\xa3\xfa\x19\x73\x9f\x08\x33\x64\xcc\x7c\xeb\x42\xa7\x41\x85\x85\x65\xa1\x49\x62\x2f\xa5\x82\x1a\x1d\x7f\x30\xef\x98\x42\x23\x58\xc6\x38\x55\xce\xa1\xd1\x5f\xcf\x3f\xa3\x7f\xb9\xe3\x59\xc4\xcc\x02\xfd\x0e\x65\x7b\x05\x64\x02\xbb\x63\x9c\x13\xd3\xfd\x58\x38\xeb\xbd\xcc\x1d\xe3\x09\x0d\x95\x13\x05\xc7\xc8\x14\x89\xd6\xfc\xaa\xf8\x6d\x69\x70\x7c\x8b\x78\x6a\xa0\xc2\x06\xfa\xd8\x2d\x84\x2f\xab\xc7\xcd\x38\x36\x9b\x3c\x4e\x4e\x4c\x3b\xbf\x5b\xfb\xbb\xdd\xfe\x1e\x8a\x96\xf7\xfa\x2a\x5d\x34\x2d\x63\xe1\x35\x42\x8c\xe8\xd2\xfc\x9b\xc1\x33\x12\x06\x13\xc7\xba\x66\x7f\xd3\x70\xb6\xa3\x65\x1c\x61\xff\x5c\x1e\xf9\x10\xfa\x67\x8f\xaa\x98\xa3\xc8\x26\x98\x3e\xdc\x64\xde\xcc\xff\x14\x20\xc6\xa5\xa9\xaf\x45\x75\x77\xc0\x8a\xe0\x8c\xdd\xe5\x08\xd3\x41\x6a\xa6\x04\xb4\x7e\x46\x8c\x33\x6b\xa6\x03\x86\xf9\xd5\x13\x56\xbd\xa0\x6d\xfb\xb0\x7a\x54\xeb\xff\x60\xa2\x68\x11\x21\x26\xe1\xc4\xdf\xac\x26\xde\x5f\x4a\x4d\xb3\x80\xc5\x31\xf7\x52\xa2\x67\xa8\xdb\xeb\x96\x77\x5b\xcf\xfe\x72\xf6\x53\x3a\x0b\x54\x86\x36\xc9\x5b\x84\xe1\xcb\x8a\xa3\xe2\xaf\x3d\x18\x52\xc0\xf6\x7d\x9b\x43\xbd\x29\x3d\x5f\xdc\x1f\x16\xe0\x2c\x39\x0e\xbc\x4b\xf7\x3e\x58\xe3\xb2\x18\x8c\x4f\x7d\x09\x79\x5d\x95\xf9\xaf\x97\xba\xd2\xf9\x98\x15\x49\xb2\x24\x48\x31\x94\x3e\x40\xa9\xee\x2f\xad\x7c\x9d\x64\x4c\x93\x9f\x97\xc4\x91\xb4\xa1\xf9\xd3\xf5\xb9\x8b\xfd\x8a\x7b\xc4\xae\xf6\x27\x54\xa1\x03\x73\x14\xbc\x69\x3d\x17\xb9\xca\xbd\x43\x07\xc9\x12\x6d\x72\x8b\xbe\xb6\xf2\xb8\x7d\xfe\xc7\x07\xc2\x27\x24\x4b\x03\x82\x35\x14\xf3\x52\x1e\x5e\xa0\x3e\xdc\x63\x47\xf0\x70\x0f\x28\xe4\x3a\x88\xf1\xb3\x34\x55\x88\x35\xfa\xc7\x1f\xcb\xa5\xff\x1b\x4d\x11\xee\x77\x82\xfa\x08\xea\x29\x2f\xa1\xb6\xe6\xdf\xd5\x04\xaa\x94\xa5\x32\x30\xbe\x8a\x48\x1b\x5e\xfd\x27\xca\xcc\x5e\x13\x65\x7f\x1b\xfd\xeb\xf6\x9e\x8c\xa8\x10\x37\xaf\x73\x5d\x49\x68\x9a\x1b\xd9\xf5\xd9\xd7\x3d\x23\x5a\xe0\x42\x7c\x20\x07\x5d\xe7\xe0\x45\x2e\xbb\x23\x8a\xf4\xeb\xed\x21\x97\xd5\xc1\x20\x02\xc6\x2b\x58\x46\x23\x65\xa9\xa1\x5c\xad\xba\x45\xaa\xcb\x97\xbb\x4d\x4b\x74\xdf\x7e\xe9\xb9\xdc\x24\xa3\x99\xc8\xac\x27\x7f\x9b\x2f\x94\xfa\xb8\x67\x9f\x51\x91\x2a\xa3\xa1\x6f\x72\xfc\x0f\xea\xfe\x19\x4b\x23\x57\x99\x46\x52\x18\x3f\xc1\x44\xf2\x87\x64\x8c\x85\x44\x0f\x1a\x90\x6b\xb5\xd1\xcb\xed\x28\x4b\xca\xb2\x38\x02\x9b\x91\x3d\xd4\x00\x3b\x80\xfe\x4e\x64\x54\x23\xb6\xa3\xae\xaa\xf6\xfb\xfe\x1f\x9b\x27\xa8\xdf\x0a\xd8\xd7\x00\x98\x6d\xb9\x51\xc0\x64\xec\xeb\x9b\xb6\x41\x69\xb6\xa9\x69\xdf\x3a\xe3\x91\xc2\xbb\xfe\x08\x1f\xb0\xa2\x49\x26\x12\xe3\x38\x99\x37\xcd\xc5\x29\x2b\x0e\x85\x28\x48\x26\x32\x81\x1e\x42\x60\xa3\xed\x2e\x46\x32\xe3\x10\x88\xdb\x37\x56\x33\x15\x64\x52\xf7\x6b\xaa\x7a\x18\xe8\x85\xb8\x21\x91\x31\x05\x2f\x72\x6d\xc5\x7c\x0e\xef\xfe\x18\x4b\x70\xcf\x54\x5d\xd4\xfa\x01\xb7\x20\x83\x20\xc1\x95\x58\xd9\xce\xec\x60\x43\xcf\x20\x21\xd8\xed\xf3\xfc\x9c\x0f\x48\x19\xd3\x53\x66\x31\x22\xe1\x5f\x56\xdb\xdd\xe6\x79\x31\x8c\x8f\x32\xad\x4c\x89\xef\x1b\x94\x6d\xcd\xc7\x71\xd1\xf8\x2c\x5a\x4b\x2c\xa2\x59\xe6\x1a\x16\x01\x51\x42\xd5\x2f\xe3\x3c\x48\x23\x67\x29\x61\xe9\x0c\xeb\xfb\x21\xde\x8b\x87\x60\xd4\x85\x4b\xf8\xe9\x38\xa3\x36\x02\xe0\x11\x95\x7a\xc0\x4a\x5c\x19\xae\x43\x83\x20\x29\x3b\x24\x8e\x23\xc2\x7c\x31\x7a\x10\xdd\xf3\x98\x6b\x53\xe0\x43\x09\x02\xa3\x25\x30\xe4\x8f\x11\x8e\x20\x83\x91\x41\xae\x81\x17\xfb\xe3\x69\x80\x52\xb4\x1a\x5a\xf9\x8a\x6d\x6e\xa4\x20\xdc\x5d\x77\x25\x3f\x37\xaf\xd5\x8c\x03\x3c\xe1\x69\x60\x18\x09\x7d\xd1\xb0\x7b\x63\x46\xdc\x85\x61\x5e\xc6\x53\x45\x51\x86\xe9\xd0\x2d\xb7\xf8\xf2\x6f\xab\x6a\x46\xa7\xd0\x0e\x27\x81\xc1\x3b\xbf\xd4\xb0\x3f\x82\x11\x4a\x72\xd7\x4b\x54\xe2\x16\xee\x95\xd1\xfc\x1e\x06\x59\xfe\x67\x53\x12\xa3\xe3\x23\x5c\x64\x01\x2a\xe7\xe5\x7d\xde\xb4\x9f\xbd\x32\xe3\x87\xce\x99\x06\x24\x07\xc0\xfb\x57\x5e\x0f\x45\x98\x27\xe3\xb2\x20\xc2\x32\x9b\x41\xf7\x7e\xa6\x02\x31\xc4\x73\xb8\x0f\x93\xc8\xd1\x76\xd1\x26\x63\xca\xca\x1b\x4d\x68\x9e\x89\x48\xf5\xfa\xb6\xfb\xc5\xe6\x53\xac\xe7\x04\x44\x35\xb9\x6c\x1e\x85\x44\xba\xbb\x38\x75\x96\x22\x9c\x67\x04\x25\x4b\x96\xdb\x9d\xff\x13\x07\xd6\x97\xc4\x27\x2f\x11\x97\xa6\xc6\x6f\x64\x4b\xdb\x7b\x7e\xdd\xfb\x0f\x8a\x8c\x80\x29\x5f\x34\x2d\x7f\xc3\x16\x3c\x4c\x29\x5d\x5c\x70\x2e\xb8\x0d\x15\x0e\x92\x9f\x0f\x0e\x41\xc5\x65\x48\x79\xff\xbd\x87\x21\x60\x85\x4b\xc9\x11\x98\x63\xf7\x95\xbb\x89\xb3\x18\xe1\x52\x07\xd2\xb8\xd2\xb5\x50\x9f\xf2\x12\x36\x97\x56\x56\x03\xa0\x1e\xbe\xa4\x76\xf7\x60\xfe\xfd\x53\x51\x80\xe5\xbe\x77\x23\xd8\x38\x55\xf9\x9c\xdc\x4b\x95\x0a\xe9\x54\x67\x91\x7d\xd2\x23\x0c\xc7\x57\xa3\x14\xc4\x91\x63\x69\x7f\xcd\x95\x82\xf2\x09\x9a\x86\x1f\xa1\x19\x2e\x26\x10\x18\xdc\xa7\x65\x0e\x71\xf9\x36\xd5\xbf\x70\x03\x43\x9e\xd1\xc1\xb6\x34\x57\xfd\xe4\xc0\x32\x91\x8c\x4c\xf1\x4a\x5d\xad\xcb\x91\x1f\xb7\x1b\x9a\x45\x4e\x43\x15\xcb\x1d\xf3\xaf\x21\x64\xa6\xf0\x6e\x4a\xe8\x26\xa4\xf4\x71\xe8\x5f\xb2\xf8\x21\x5c\x47\x0a\x33\x84\xfd\x76\xbd\x1c\xae\xca\x5c\xc7\xa9\x1e\x2d\xf4\x0f\xe0\x5e\x4a\x11\x64\x9e\x39\xbd\x98\xb3\xb4\x27\x22\x24\x41\x64\x6b\xee\x9b\x12\xb6\x5c\x88\x29\xa9\x4e\x84\xcc\xc8\x8c\x3f\x56\xe5\x71\x0f\xf5\xc9\xca\xe4\xdb\xed\x71\x14\x41\x89\x50\x26\xb8\x6a\x2d\x4e\xfe\x95\x13\x21\xd0\x50\x5a\x33\xb0\x73\xf5\x41\x9b\x4e\xc4\x29\x73\xe5\xd9\x45\x51\x08\x68\xef\xae\x5f\xda\xeb\x19\x7e\xeb\xd7\x44\x91\xa6\x1a\x4b\xff\xf8\xd5\x2b\xdb\x39\xc5\xf8\xe7\x63\xa1\x26\x22\x88\xce\xb0\x5f\x86\x52\x90\x96\x49\x72\x6b\xd0\x37\xba\x2b\x34\x04\x24\x3f\x9b\x69\xbe\xb6\x70\x89\x8f\x43\x27\xc1\x22\x8a\xac\x0b\x01\xdd\x5c\xd9\x9d\xa1\x3e\x15\x7d\x8b\x46\x64\x69\x80\x17\x7e\x90\xd5\xe9\x7c\x69\x61\x59\x55\x85\xaa\x7e\x96\xbd\xfa\x7d\x3e\x51\xb8\x20\x22\x23\x46\x37\xd5\x1a\x2f\xf2\x5f\xcf\x97\x93\xa5\xad\xfa\x11\x1a\x62\x67\x43\x8f\xe6\xbb\x1f\xac\x60\x1f\xf2\x5a\x66\x40\xe9\xf3\x58\x15\xf7\x8d\x34\xc2\x4a\xce\xc5\x86\x7d\xe3\x89\x23\x78\x9a\xe0\xda\xd1\x9c\x01\x5d\x3e\xba\xfd\x78\xfc\xa3\x04\x49\xec\xd4\x42\x0d\x35\x40\x81\x54\x87\x71\xfc\x13\xfa\x94\x10\x8c\x09\xfb\x7b\x9f\xf2\x72\x35\x4a\x30\xdd\x10\xc8\x94\xf2\x9e\x85\xfb\xd7\x1a\x9a\xd7\xaa\xf0\xcf\x41\x46\x12\xc9\x04\x4f\xbc\x96\x50\xf0\x03\x2a\x7d\x77\xd9\xf9\x9f\x62\x46\x84\x4c\x23\x14\x73\x5c\xd6\xd7\x33\xfc\x1a\xce\x40\x21\xa9\x42\x6a\xc9\x03\xcf\x6b\x2f\xc7\x30\x96\xd8\x23\x42\x0a\x89\x91\xe3\xa9\x6a\xda\x5d\x7e\x2c\x73\x9d\x4b\x5e\xb6\x77\x37\xd3\x4d\x4a\xa3\xe4\xb7\xdb\x2f\xb6\xe8\xe2\x7b\xb7\x78\xfe\xb6\x72\x84\x2c\xa1\x02\xc0\x96\x7e\x09\x3f\x47\x3a\xa3\x73\x50\x03\xa1\xc2\x10\x4b\x5d\xdc\xa1\xff\xee\x2e\xd7\x75\x69\x88\xaf\xee\x84\x3a\xd6\x56\x4e\x13\x01\xa8\xbc\x3e\x4d\xbb\xc5\x42\x13\x89\x38\x03\x2c\x36\x1e\x14\x70\x55\xe4\xa5\x5f\x64\x34\x0d\xb0\xca\xe8\x14\x05\x7e\x1b\xda\x34\x65\x1e\x6b\x37\xa6\xe8\x38\x4e\xb8\x0c\xc2\x04\x61\xd1\x48\xc7\x38\xcd\x69\x31\x8f\x9e\x83\x0c\x92\x14\xc3\xf8\x3a\x3f\xbe\xb6\x34\x1b\xdf\x3c\x19\x00\xc1\xb9\xae\xec\x3c\x1f\xec\xd0\x32\x80\x0c\xe1\x4a\xa6\x2f\x72\xbf\x3b\x34\x80\x0b\x88\x71\x69\x69\x30\xaf\x18\x9f\x2d\x24\x01\xde\x9a\xee\x2c\x3b\x68\xfb\x3c\x5d\x86\xc2\xf6\xd9\x6a\x38\xc3\xb4\x65\x2a\x43\x45\xb5\x0d\x15\xd0\xb9\x7a\x5d\x2a\x94\x63\x1b\x8f\x8a\x42\x19\x19\xaf\x93\x25\xd4\x6d\xae\xf3\x41\x95\x62\x7c\x1d\x51\xc4\x31\x14\x36\x29\xb3\x6c\x83\x5f\xcf\xd0\xfe\xac\xea\xb7\xe1\x1b\x26\xa3\x94\xdb\x6d\xbf\xe5\x05\x1a\xf7\x45\xae\xe6\xdd\xf8\x31\x4c\x8d\xb7\xb6\xdd\x99\x4b\x68\x5e\xf3\xf3\x0c\x18\x4e\x46\x0a\x30\x54\xfe\x3d\xf7\x29\x97\x8c\x74\x62\xcb\x2f\xa5\x3a\x55\x25\x5c\x91\xd1\x39\xbe\xde\x38\x36\x68\xf6\x55\xfb\x3a\x02\x0e\xc9\x38\xe5\xc8\x26\x44\x9a\xb9\x35\x7b\xfb\x78\x55\x95\xb1\x48\x90\x1b\x8f\xe6\xa4\x26\x7d\x59\x5c\x5a\x7f\x29\x89\x75\x1e\x7f\xdc\x2c\xbf\x75\x13\xe5\xfb\x33\x32\xf0\xf6\xeb\xa7\x95\x1f\xc2\x13\x44\xcc\x1d\xb0\xbc\x28\xbb\x25\x79\xba\x46\xce\x4c\x76\x99\x48\x23\xa6\x8e\x05\x2e\x6b\xb7\xa3\xa6\xbf\x32\x0d\x8c\x40\xa8\xe4\x45\xb1\x28\x8a\x2e\x9c\x7f\x82\x1b\x4a\x85\x1b\x1c\x05\x21\x19\xc0\x57\x3f\xa2\x1c\xba\xe1\x49\x18\x67\x06\xe5\x70\xe2\x4d\xf3\x8f\xd1\x5d\x4c\x29\x47\x6c\x41\x9b\x9f\xfc\xde\xf4\x02\xb5\x33\x65\x22\x32\x85\x2c\xb1\x41\x72\x3e\xb1\xb7\x98\xbc\x59\x24\x36\x76\x18\xe8\xcc\xd5\x65\x2d\x07\x1e\xd2\x6e\x26\x1c\xec\x38\x77\x4a\x1a\x85\xc6\xcc\x09\xdd\x7f\x9d\x54\xda\x07\x71\xb7\xa4\xa9\xc4\x10\xbf\xad\xf3\xe3\x11\x6a\xb3\x45\x8f\xee\x30\x95\x09\x76\x5f\xac\xa8\xdb\x46\x4f\xfa\xcc\xb2\x5b\xeb\x43\xe7\x2a\x59\xd5\x53\x28\x96\x1b\x95\x29\xc4\x92\x60\xa9\x4e\x6b\x94\xb3\x5c\xe6\xed\xf5\xa1\xaa\x77\xd5\x09\xaa\x72\xd4\x0b\xbb\xbd\xcf\x4c\xcb\x5e\x4e\xe0\x9c\x1b\x07\x0a\x87\x58\x1b\xdf\xaa\x4c\x13\x54\xa7\x69\x5e\xa1\xd0\x73\x96\x82\xa4\x0b\xad\x51\xe8\xe8\xc0\x45\x55\x77\x61\x0c\x86\x8c\x7e\xf2\xf1\x40\x27\xd6\x57\x13\xb3\x46\x7f\x40\x64\x41\x88\x1b\x1b\xd7\x30\x78\xcf\x26\xcf\x4a\x48\xc1\x1d\xb0\x70\x53\xc2\xc0\xdb\x98\x48\xa1\x8c\x42\xb6\x21\x4a\x77\x3b\xde\x5f\xca\xd9\xa4\x80\x38\xc5\x1d\x9b\x17\xe0\xaa\x7f\xf6\x90\xe2\xa9\xd6\x0e\x29\x70\xcf\xaf\xfe\x6a\x21\x24\x91\x41\xf8\x62\xd1\xeb\x89\xd7\x6f\x68\x94\xf1\x27\x20\x39\xf3\x69\x15\x24\x0a\x25\x9f\x7f\xba\x5e\x0d\xa8\x01\x41\x6a\xd2\x1d\x52\x41\x96\x46\x16\xad\xb1\xdf\xef\x87\x5c\x52\x15\xf0\x98\x1a\x7f\x87\x6e\xdf\x7a\xa9\xaa\xc2\xd8\x97\xff\x36\x07\x37\x55\x81\xd2\x8a\x5b\xb5\x2f\xbb\x37\xdc\xc6\x5c\x2a\x0c\x32\x04\xf5\xbe\x1b\x6b\x0d\xe0\xa7\xe9\x00\x1a\x19\xf0\x82\x89\x70\x46\xb0\x2d\x15\x52\x89\xcb\xfe\xc1\x8a\x23\x7c\x5c\x20\x51\x21\xe3\xa8\x9a\x53\xe6\xaf\x79\x71\x39\xdd\xb9\x59\x30\x5e\x80\x55\x14\x70\x6c\xfb\x77\x37\xf8\x50\xe9\x83\x81\x7c\x75\xff\xa7\x79\xcd\x6b\x5f\x53\x55\x11\x11\xd2\xad\x2e\xd6\x13\x77\xa8\x82\x37\x3b\x49\x55\x24\xc1\x29\x8f\x1c\xce\x55\x55\x1c\xce\xbd\x48\xf5\xa0\x12\xa1\xe2\x40\x60\xb5\xc5\x64\x8c\x4f\x79\xd9\x22\xf1\x6e\x5c\x96\x57\x71\x62\x5c\x6d\x1c\x91\xcf\x5d\xc3\x88\x7c\xa9\x62\xc1\x52\x5b\xe9\xf7\x34\x97\x6e\xca\x16\x55\x39\xa0\x9f\xba\xc1\x9a\xd0\x78\x54\x29\xfe\x62\xc3\x46\x35\x92\x92\xb3\xc3\x93\x50\xe0\x9a\xd9\x7b\x1f\x78\xf5\xc0\x31\x88\xdb\xd5\x46\x55\x92\x84\xf8\x26\x17\xf9\x29\x6f\xc7\x0a\x00\x2a\x51\x51\xe8\x80\xe0\x16\xe4\x55\xf9\xfe\xe2\xfc\x3b\x96\x26\xc6\x10\x59\x41\xb1\x33\xef\x87\xa9\xc8\x8d\x6f\x7b\x9a\x6a\xec\x12\x88\xcb\x35\x0c\xde\x8c\xcc\xa1\x7f\x90\x24\xd4\x34\xb0\xba\x03\xad\x45\xa3\xe6\xed\xb5\x7b\x55\x6b\x3f\xc6\x46\x25\xdf\xef\xf6\x7f\xde\x96\x54\x84\x70\xe9\xcb\x5d\xb3\x5e\x31\x93\x57\x93\x12\x4e\x87\x04\xd0\xdd\xb5\x6c\x5f\xa1\xcd\x27\x8d\x3b\x45\x99\xf1\x57\xf1\x80\xbf\x1f\x90\x3b\x28\x95\xa2\x5a\xc5\x7d\xa6\x86\x6e\x82\xe3\x4f\x33\x9e\xe0\x04\xe8\xcd\xf1\x0f\x77\xdf\x9d\x64\x91\x62\x2a\x41\xec\xc7\xe2\xe9\x6e\xb1\xdb\x2d\xee\x37\xdb\xc3\xe6\xd9\x6d\xea\x2a\x4b\x2c\xe7\xcb\x26\x53\x53\xf1\x5a\x17\x5b\xaa\x2c\x05\x81\xca\x47\xbb\x1e\x66\xe7\x4f\x42\x8d\xce\x64\xed\xdc\x23\x6e\xe0\x29\xc3\x8d\x46\x65\x42\x04\xba\x07\xb7\x7e\x2f\xdb\xbc\xe8\xc9\x80\x8a\x5b\x1d\x79\xae\x94\xb5\xac\x78\xa8\xea\x19\x05\x93\xc9\xbd\xe6\x22\xc3\xa4\x00\x91\x0a\xfb\x9a\xcb\xb7\x79\xfa\xa2\xe2\xca\x10\x22\xbd\x06\x78\x5d\x4d\x97\x26\x11\x33\x69\x90\xc3\xa6\x09\xd1\x0d\x99\x59\xe2\x04\xa7\x18\xd3\xad\xfe\xe1\xae\x5d\xe8\x84\x39\xb8\xce\xe3\x72\xf2\xb6\xca\x98\x60\x4f\xf5\xe0\x90\xc1\xdf\xeb\x91\x60\x27\x51\x92\xa5\x08\xa3\xf9\x09\xf9\x7e\x50\x69\x52\x32\x33\x6b\xa9\xb8\x5c\x77\xa8\x56\xb5\x18\x21\xf2\xd8\xfc\x8e\xac\x14\xa1\x11\x56\x21\xbb\xc0\xe5\x89\xe7\xe5\x70\x52\xaa\x8c\x33\xab\x84\x74\x67\x18\x2f\x7e\xe6\x80\x88\x22\xeb\x42\x62\x22\xdb\x27\x7e\x3e\x77\x6b\xca\x5f\x60\xa5\x2a\x00\x8d\x5b\xab\x95\x5d\x18\x3d\x2d\xff\x36\x69\x1d\x63\xec\xec\x77\xae\x29\x41\x6e\xb0\x1c\x42\x90\xa6\x24\x72\x68\xb3\x82\xa3\x72\xd3\x7b\x5e\x5d\x1a\xb3\xec\x8d\x1f\x0a\x04\x4c\x20\xde\xb8\x3a\x43\x69\x24\x9e\xac\x60\xb4\xfd\x75\x10\xc6\x34\x4b\x6d\x1c\xbb\x2a\xbb\xd7\x75\xf4\x7a\x42\x44\x42\xa7\x54\xf3\x70\x29\xd5\xa2\x70\xde\x12\xfd\x77\x44\x32\xc0\xea\xbd\x55\xcd\x71\xbb\xe0\x74\x14\x84\xf8\x22\x77\x6f\xf1\xc3\xc3\x8c\x1b\x43\x3f\x34\x4e\x93\xc0\x13\xb2\x97\x55\x5e\x3e\x14\xf9\xf9\x23\xaf\x1e\xfb\x99\x24\x35\xbc\xa1\xa7\xeb\xff\x83\xb4\x33\x81\x84\x98\xed\x37\x57\xc3\x50\x00\x52\x91\x60\x99\x6b\x91\xd7\x3f\xf9\xf5\x2e\xf7\x40\x6e\x20\x51\xec\xec\xae\x4d\x68\x74\x3d\x89\xaa\x98\xd7\x70\x03\xc2\x24\xd6\x17\x4e\xfc\x3c\x57\x92\x07\x1a\xc5\x54\x3b\x12\xca\xa1\x8b\xbe\x0f\xef\xb9\xf1\x60\x18\xdf\x19\x96\x18\x41\x90\xdd\xa5\x86\x32\x1e\xc6\xee\xa8\xfe\x6a\x2b\x41\x66\x7f\x1c\xf1\x26\x81\x49\x82\xbf\xc4\x2e\x6d\x5b\x68\xce\x55\xd9\xc0\x43\x5e\x37\xed\x57\x5e\xe8\xd1\x75\xb9\x37\x13\xb2\xd0\x04\x1e\xef\x55\xae\x1e\x78\x5e\x74\x21\x95\x21\xe9\x8d\xaf\x2b\x8b\x45\x68\x39\x74\x02\xda\x7e\xf9\x02\x11\x04\x12\xac\x25\x5d\x5e\x1e\x9f\x2b\x7f\xc0\xd2\xc9\x4d\x44\xe3\x39\x65\xf6\xa8\x94\x99\xf4\x74\x2c\x14\xca\x99\x85\x93\x82\xd4\xa6\x1f\xbf\xdc\x3c\xef\x9d\xf9\x84\xfb\x06\x95\x50\x07\x16\x34\x5c\xa3\xe1\x1d\x57\x69\x28\x7a\x76\xef\xf8\x2d\x99\x0d\x6a\x40\x11\x49\x1d\x6f\x6f\xa6\x98\x09\x40\x0d\x6b\xdb\x72\x96\x4c\xf0\x88\x73\xd2\x45\xfd\x76\xa0\xd6\x02\x09\x53\xe6\xab\xdd\xca\xf5\x51\x61\xed\x83\x42\x9b\x39\x97\x0e\x22\x2b\xb5\x61\x9e\xea\x9c\x3a\x3e\xd1\x41\x12\xe2\xcd\xec\x92\xdd\xc7\x2e\xdc\x78\xe5\xee\xad\xd1\x01\x8b\x90\xf5\x6a\xb8\x82\xcf\xd5\x44\x3c\x9f\xe8\x20\x0b\xb5\x8d\x7d\x66\x39\xc0\x3a\x10\x04\xdb\x91\x79\x89\x92\x0d\x17\x5e\xa0\xd5\xad\xd7\x27\xed\x46\x00\x72\x77\x9a\xca\x2a\xee\x31\x0f\x9a\xd7\x21\x0f\x99\x39\xfd\xf2\xd2\xb4\xd5\x69\xf8\x4a\xeb\x98\x03\x5e\x5c\x09\xf9\xf1\x55\x54\xf5\xdc\xdc\xd1\x09\x49\x10\x62\xb2\xbd\x73\x8d\x79\x9d\x50\x82\x59\x0f\x76\xa6\x77\x17\xf1\xa3\xf7\xb7\xf8\x58\x2d\x43\x27\xd2\x6c\xfe\x0d\xb4\x1b\xd4\xc1\x30\x3e\x7d\x33\xba\x7f\x9a\x04\x11\x66\x30\x02\xca\x7d\x55\x39\x0c\x96\x26\x11\xc1\x9a\x40\x79\x39\x3d\x61\x7a\xdc\xf8\x23\x14\x30\xd2\x3d\xf3\xeb\xa6\x3e\xf2\x32\xff\xaf\x8f\xba\x34\x11\xd4\x59\x7e\xa1\x60\xb2\xe6\x12\xd6\xa7\xb3\x11\x04\x36\xc0\xc2\xb9\x9c\x50\x13\x08\x91\x60\x0b\xb6\x5c\xbd\xeb\x4d\x60\x88\xa6\x42\x33\x8b\xa8\xc5\x1f\x30\xae\xa6\x6b\x0a\x12\x6b\xe2\xe7\xea\x6c\xcc\x71\x72\x40\x01\x6a\x3f\x80\x45\x04\x19\x5e\x7f\x37\xa5\x75\x63\x93\x35\x38\x9a\x61\x43\xcf\x0a\x55\x21\x3a\xeb\xb1\xe2\xe5\xa2\x9d\x91\x4c\xd3\x2c\x92\xdc\xac\x4c\x05\xf0\xfa\xae\xce\xd5\x11\x9c\x67\xd3\x74\x68\x9a\x81\xd1\x6f\xf2\xda\xd5\xd3\xb7\x39\x4b\x28\xe1\x23\x75\x84\xa1\x0f\x20\xd1\x99\x8e\x30\xf2\xe1\x35\x3c\x57\xa5\x84\x06\x31\x19\x03\x90\x2b\x1a\x98\xbb\xff\xb0\x1f\xe2\x1a\xb0\xd5\x31\x54\xd8\x7d\xca\xcb\xfc\x74\x39\x99\xce\xcf\xa4\x44\xa3\x45\x2a\xb1\x3c\xb0\xfc\xfa\x38\x7a\x65\x85\x4e\x0c\x59\x65\x20\x43\xb3\xc3\xca\xc6\x0b\xbf\x36\xdd\x0f\xfe\x34\x46\xd6\x2a\xca\x58\xd4\x4b\xf5\xda\xc5\xcf\x9d\x5d\x25\x11\x56\x0a\x6c\x6b\xef\x2b\x2f\xde\xbd\x01\x70\x77\xd4\x98\x5b\x37\x0e\xf8\x3f\x54\xd6\xd0\x8a\x04\x98\xc8\xcb\x8b\x5b\x89\x34\x08\x99\x21\x2a\xc1\x09\x07\x4f\xc4\x3b\xec\x30\x1d\xb0\x34\x9e\x2a\x31\x8f\x12\x54\xad\x95\x61\x85\x6f\xfe\xf1\x65\xf3\x78\xef\xff\xaa\x13\x54\x25\xda\x43\x37\x9f\xbe\xdc\x59\xc1\x18\x1a\x04\x96\x2b\xd0\x98\xb7\x53\x2d\xe7\xd0\x68\xb7\x1d\x17\x1a\x04\xca\x68\x1a\x3c\x00\x74\x79\xe0\x3b\xd4\xed\x6d\x6d\x73\x74\x4b\x69\x10\x80\x96\x46\x72\xee\x97\xd5\xf8\xfa\xb0\xa5\x43\x83\x30\x33\x40\x9d\xfa\x06\x31\x38\x1c\xc4\x09\x32\x6a\x5f\xd1\x41\xcb\x72\xb0\x8c\xbc\x1e\x2f\xaf\x1f\x96\x1d\x69\x10\xaa\x20\xb5\x52\x00\x4f\xa8\x54\x6a\x66\xdd\x6f\xe3\x0b\x8e\x48\x8a\x09\xef\xc3\x76\x61\x7c\xb6\x51\x75\xc7\xdd\xbb\x38\x4c\x51\x4e\xc0\x36\xbd\x7e\x20\xb9\xbe\x07\x12\xd3\x20\x86\x0c\xa1\x2b\xcb\x57\x90\x6f\x38\x37\x7d\xb8\x47\x83\x24\x89\xf1\x41\x95\xd6\x2b\xd9\xe1\x14\x36\x1a\xf3\x09\x47\x9f\xa7\x41\x42\x98\xe8\x95\xf7\x37\x67\x28\xef\x72\x35\x38\x2a\x70\xbe\x34\xd0\x3e\xfc\x1a\x2d\x8e\x34\x48\x74\x98\x86\x56\xb3\x69\x80\xd2\x9f\x71\xe5\xa6\x41\xca\x00\x13\xdb\x6d\x55\x14\xc2\xa3\x59\x69\x90\xf2\x14\xa9\xae\xa8\x2a\x1a\x4e\x55\x45\x69\x40\xa2\xc8\x00\x29\xba\xdf\xb8\x2a\x55\x55\x37\xb8\x5c\xae\x7e\xe5\x4d\xdb\xcc\xaa\xb5\xd3\x80\x64\x21\x73\x32\x45\xfb\xea\x78\x2c\xe0\x2e\x6f\x77\x17\x74\x39\x73\x27\xa6\x31\xc7\x59\x62\x1e\x0f\xea\x8a\xff\x1e\x4d\x2e\x9a\x5a\x22\x3a\x1a\x06\xa3\x01\xba\xf5\xbb\x72\x27\x61\x89\x30\xa6\xaf\x45\xd5\x20\x6c\xbe\xba\xf8\xa7\x93\x45\x22\x09\x7d\x37\xb2\xfa\x39\x12\xf8\x9c\x8b\x3c\x68\x90\xa5\x80\x7d\x1b\x43\x27\xf8\xa0\x2f\x33\x79\xe9\xb3\x2c\x40\x5d\xea\xe6\x72\x3a\x55\x65\x18\xf8\xaf\xcf\xa8\xb9\x71\x45\x0e\x65\x7b\xf8\x39\x98\xc5\x34\xe0\x4a\xa1\xe5\x35\x76\x40\x18\x9d\xbc\x96\x22\x0c\xad\xf0\xdd\x7b\xf5\x06\x16\xa4\x3a\x55\xa3\xa1\x81\x48\x23\xd4\xd7\x3f\xf1\xf3\xd7\x01\xc0\x95\x06\x82\x66\xa6\x3c\x51\xf0\xf2\x4d\xd4\x00\x2a\x2f\x8f\x6a\xc0\xb0\x1e\xce\x43\x19\xa4\xd8\xf9\x82\xf6\xb5\x4b\x3b\xac\xeb\xd3\x68\x17\xa3\x81\x8c\x8d\x4d\xc2\xd7\x6b\x7e\x36\x38\x44\x7c\xc9\xf6\xc0\x4f\xd3\x91\x2a\x05\x13\xe6\x34\x6d\x5d\x5d\xd7\x2d\x9c\x1a\xcb\x84\x77\x43\x80\x64\x81\xad\xe3\x1d\x8e\x4e\xfe\xfd\x70\x9a\xc0\x8a\xbb\x71\x80\x11\xed\xdd\xe6\xfb\x76\xb7\x1a\xb8\xd5\xd3\x00\x44\x6c\x62\xec\x2e\x8c\xb7\x20\xd3\xb9\xb8\x8d\x06\x3a\x55\xde\xcd\xf9\xf7\xc3\x36\x9e\x7c\x87\x86\x14\xfb\xaf\x5f\xa0\x84\x26\x6f\x66\xeb\xfa\x66\x68\x18\xa4\x36\x7f\xab\xb9\x84\x6e\x9a\x4e\xb6\x2a\x1a\x76\xeb\x1f\x31\xf5\x88\x9d\xeb\x92\x87\xe3\x72\x37\x0d\x43\xc5\x51\xdb\x02\xc1\xcd\xfb\x6a\x7c\x6f\xc2\x88\x24\x88\x5f\xe7\x4a\x39\x57\xd2\x66\xf2\x2d\x11\x05\xac\xa7\x72\x57\xd2\xda\xd7\x3c\x9f\x46\x4e\x34\x8c\x84\xb0\x8a\xc3\x2d\xd4\x8b\x1a\x4a\x3e\x20\x52\x8e\x6f\x52\x18\x27\x44\x27\xbd\xab\x4a\x99\x9f\x78\xb1\x56\xdd\x8e\x6a\x39\xba\xb3\xe9\x23\x0d\x63\xaa\x10\x07\xeb\x4a\x1a\xab\xfd\xd7\x4f\x77\x5d\x1a\xc6\x52\x71\xe6\x89\xaf\xdf\xb1\xad\x38\xec\x88\xd3\x30\xe1\x41\xd4\x7b\x46\xf7\xf2\x06\xa3\xd8\x9e\x86\x69\x68\x6c\xaf\x15\x70\xa3\x1e\x70\x78\x0f\xfd\xb1\xc8\xc0\xf8\x5d\x68\xb0\x6b\xf9\xbc\x04\x04\x0d\xd3\x2c\xc2\x9a\x90\xaa\xee\x2e\xd7\xc9\x1d\xa4\x4a\xe0\x69\x96\xaf\x00\x2d\x7f\xed\x61\xea\xdd\x21\x89\xb6\x75\x2d\xff\x75\xd0\xde\x42\x80\x86\x14\x38\x09\x47\x28\xe8\xf1\xf4\x08\x59\x14\x27\xbe\xe2\xf6\xe8\x75\x5a\x68\xc8\x32\xc3\x46\xe3\x85\xe6\x78\xb0\xf5\x72\x0e\x34\x64\x5c\xe1\x4e\xb4\x05\x23\x9e\x80\x61\xd8\x84\x6c\x38\xf9\x61\x59\xa6\x31\xbc\x71\xf7\x60\x89\x80\xbf\xe2\x8e\x97\x6f\x53\x95\x37\x1a\xf2\x20\xc2\xb6\xea\xfd\xea\x71\xf1\xc7\xe1\x65\xb5\x5d\x6f\xee\xdd\x77\xf3\x24\x40\x8f\xf2\xd3\xa5\x38\xe8\xa2\xe2\xed\xe1\x7c\xe3\x01\x72\x4b\x4a\xa2\x21\x4f\x53\x6a\x61\x3a\xcf\x97\xd3\xcb\xc5\x1b\x60\xf8\x7b\xc1\x29\xb3\xe2\xf7\xc6\xee\xe6\xd6\xb9\xc6\x0e\x14\x49\x86\xaf\xf2\xe2\xfe\x7e\x7b\xd8\x7f\xfb\x72\xd8\x6c\xbf\xf8\x63\x34\xc3\x0c\xc4\xb8\x55\xcf\x52\xa5\x69\x28\x98\xc0\x8c\x5d\x5c\xfd\x44\x13\x42\x27\xcc\x77\x5b\xae\xa5\xca\x25\x6f\xc7\x7e\x8c\x34\x14\xca\xc8\xd7\x72\xa5\x5c\xbb\x6c\x72\x66\x19\x0b\xac\x66\x3c\x56\xc7\x1d\xb4\xdb\xbb\x01\xa3\xae\x9b\xd9\x30\x47\xf1\xa4\xa1\xcc\x08\xee\x33\x7f\xe6\xa6\x61\x87\xab\x98\xe3\x36\xb8\xfc\xe3\xc1\x05\x27\xa1\xa2\x14\x73\xa8\x97\xed\x7a\xb9\x3a\x2c\xbf\x2e\x9e\xbf\xac\xb0\x6d\x7a\xd8\xed\x57\x2f\xfd\x28\x13\x3d\xa0\x50\xbe\xd1\x8d\x77\xb7\x68\xea\xc5\x48\x43\xa5\x09\x7a\x8f\x70\x4c\x3f\x4d\x27\x06\x05\xec\x87\x53\x87\x4d\xae\x0d\xd2\x2c\x12\xbd\xe1\xe9\x4d\x57\xf1\x26\xfd\xa3\x21\x48\x4d\x8c\x08\xda\x3b\x94\x17\xa3\xe1\xbd\x74\xce\xdf\xe3\x1b\x05\x5a\xa1\x81\xfc\xd3\xb5\xf5\x85\x83\xb1\x0a\x14\xfb\xdb\x4c\xca\x46\xa3\x20\x54\xd4\x78\x79\x34\x2d\xd4\x03\xed\x5f\x1a\x05\xc2\x64\x9f\xf7\xab\xd5\x93\xff\x1b\x84\xb6\x6c\x54\x9f\xaa\x49\x0b\x87\x46\x61\x18\xc6\x89\xaf\x23\xdc\x2f\x36\x1f\xa8\x55\xb9\xe1\x11\x8d\x58\x8f\x89\x5e\xbe\xe6\xd2\xe7\x2d\x34\x8a\x52\x43\x1e\x6e\x4d\xb4\xb2\x5b\x2d\xfd\x11\x6e\x54\x2e\x3c\xd5\x0b\x8b\x4b\x66\xb2\xe7\x72\x8f\x70\xd0\x41\x29\x8d\x46\x71\x2c\x81\x3a\x3c\xea\xda\xc7\x8c\x51\x9c\x81\xd3\x39\xeb\x62\x22\xc1\x1b\x50\x3d\xd9\xdb\x0d\xe2\x4c\xdb\x64\xb8\xdb\xf7\x6b\x9e\x37\x37\x0b\x43\x94\xa4\x11\xea\x5a\x1a\xa5\xc4\xa9\x28\x4c\x1f\x45\x44\x69\x0a\xda\x54\x5f\x9b\xbc\x06\xe5\x00\x87\xf6\x68\x37\x4f\x06\xfb\x4b\x3d\x51\x13\xa6\x11\x65\x11\x76\x8a\xef\xa1\x19\x24\x79\x34\xa2\x0a\x52\xbb\x7b\xaf\x8e\xc7\x41\x7b\xc0\x1a\x4c\xd2\x28\xcb\x08\xde\xce\xfb\xba\x3a\x17\x23\x50\x0f\x8d\x32\x61\xa8\xdb\x45\x25\xdf\x30\x5d\x9e\x14\x6c\x68\x94\x81\x00\xfb\xa8\xbc\x02\xf3\x0b\xaf\xdb\xa1\x6c\x25\x8d\x44\x60\xb4\x51\x8d\xfc\xe5\xfe\xfb\xdd\x6a\x7e\x37\x89\x04\x31\xfe\xad\xf0\xab\x85\x12\x9d\xb4\x7b\x62\x3b\x8d\x64\x62\x9a\x3e\xcb\xaa\x86\x2e\x72\xc2\xca\xc5\x5f\xd3\x4c\xa0\x91\x64\x21\x16\x7f\x14\x9c\x06\xd6\x7c\xa3\x8e\xfa\xdf\x46\x2f\x87\x14\x1c\x67\xd9\x7a\xb9\x39\xbc\x7c\x5d\xec\x56\xe1\x61\xf1\xd4\x0b\x8b\xd0\x08\x12\x63\xe5\xb2\x3e\x9d\x0a\xbe\x96\x1f\x6b\x53\xce\x5f\x10\x88\x04\x5b\x75\xf7\xd5\x71\xef\x78\x52\xee\xd4\x3a\xd1\x18\x53\x36\x31\xb3\x2a\x7e\xee\x40\x6a\x48\xd5\x27\xfe\xcb\x4a\x02\xba\x03\x94\xa3\x09\x9e\x69\x50\xda\xbd\xb3\xd7\x5b\xa0\x91\xce\x32\x2e\x47\xfb\x3d\x0f\x99\x3f\xa8\x8c\xd8\xb0\x82\x77\x28\xaa\x33\xd4\x4b\x9f\x06\x44\x1a\x20\xb5\x2b\x41\x83\x77\xbd\x39\xf6\xf4\x03\x1a\x07\x51\x9a\x58\x07\x96\x2e\xc7\xdd\x14\xea\x56\xa3\x8b\xc6\x01\x30\xea\x79\x77\x9b\x12\x86\x12\xd6\x34\x0e\x13\x83\xb7\x6d\xa0\x35\x56\x2c\x08\x63\xc8\xcb\xe3\x9c\x4a\xf4\xf8\x36\xc6\x21\xe1\x26\xaa\x6c\xa0\xf5\xc9\x43\x1c\x8a\x00\x27\xcc\xd7\x2e\xf2\xe1\xdf\x72\xf9\x56\x69\x3d\x78\x97\xe2\x50\x08\x4c\xf8\xe5\x79\x4c\x57\xa6\x71\x14\xe8\xcc\x8a\x32\x75\xf7\xcf\x80\x0e\x31\x03\xbd\x9b\xea\x1e\xd3\x38\x22\x0c\xb9\xa2\x2e\x4a\xd8\x20\x7b\x7e\xf2\xe3\x23\x16\x20\xde\xf8\xd2\x58\x3f\x09\xdb\xea\x6e\xa6\xe3\x32\x30\x9e\xad\xf2\x15\xd4\xa5\x80\x25\x2f\x8a\xa1\x9c\xf9\xec\x0b\x35\xd9\x4f\xe2\x88\x53\x7c\x94\xe7\x7a\x90\xf8\x34\x2f\xc6\x4c\xd5\xfd\xfa\x38\x09\x11\x79\x62\x39\x3b\xcf\xf0\xab\xbd\x1f\xb7\x7d\xec\xc0\x84\x86\x18\x4e\x1f\xba\x8c\xee\x19\x89\x8f\x5d\x18\xd7\xdc\x5d\x57\xb5\xdc\x57\xe6\x2f\xa6\x4e\xe6\xce\x9d\x0a\x67\x46\x62\xb4\xe7\x7a\x6b\xb7\xe1\xf4\x8a\x53\x4d\x08\xed\xf3\x1c\x94\xc2\xae\x61\xfa\x30\x08\xe3\x68\xc1\x9a\x0f\xfd\x92\x2d\x92\xc5\xb6\xb0\x69\x4c\x74\x60\x94\x58\xb1\xba\xe7\xb6\xe3\x98\x52\x89\x8c\x3a\x0b\xc7\xb6\xfb\xf1\xe4\x07\xb2\x58\xe2\x8a\x63\x1c\x45\x46\x35\x9a\xd1\xe5\x32\x46\x84\x95\x2b\x79\x1c\x4b\xb5\x8c\x2f\x98\x71\x8a\x15\x11\xbb\xd5\x5d\xca\x23\xdc\x92\xc9\x3e\x2d\x95\xd3\x98\x49\x81\x30\x4b\x84\x0c\x3d\x56\xc7\x2e\x48\xbd\x91\x62\x9e\xf9\x98\xb2\x9c\xc4\x2e\xc4\xcd\xcb\xa3\xc7\x40\xd3\x38\x63\x9a\xc7\x83\x16\xd0\xf6\x23\x3e\x0d\x8d\xb3\x2c\x75\x6e\xe0\xbb\xbf\xc0\xb3\x75\x9f\xe2\x06\x11\x67\x8b\x81\x3b\xe8\x1f\x03\xcf\x42\x07\xc4\xea\x76\xfe\xf1\xe7\x04\x55\x94\x8e\xe3\x2b\xb3\x49\x3c\xc3\xcf\x2d\xbc\xe7\x4d\x5e\x95\xcf\x55\x8b\x95\xcd\x9e\xce\x41\x63\x91\x19\x2f\x63\x81\xaf\xde\x4c\xc3\x85\xc6\x32\x88\x31\xb0\x7a\xd9\xae\xb0\x36\x83\xf9\xaf\x97\x82\xa6\xb1\x8c\x25\xd6\x0a\xcf\x79\x79\xb4\xd3\x76\x7c\x27\x24\x89\x71\xc0\x0b\xbf\xa2\x2e\xd2\xa7\xfb\x4b\x2c\xb3\xcc\xf0\x2d\x57\xfb\xc5\xfd\xe6\xf1\x71\xb1\xf5\x5f\x24\x78\x3c\xa2\xcb\xdf\x82\xe8\x69\x2c\x65\x04\xc2\x4a\x85\x80\x8d\x59\xa6\x71\x54\x2c\xb5\x59\x48\x56\x4f\xeb\xe1\x76\x11\x2b\x48\xe2\x01\x77\xd5\x85\x19\x97\x1b\x45\x09\x1a\x43\x1a\x10\xfb\x26\x6c\xad\x11\x58\xc9\x8f\x50\x1b\x8d\xc2\xf1\x35\x69\x19\xc8\x78\x40\x14\xb8\xbb\x22\xde\x79\x38\x2f\x92\x40\x02\xf2\x80\xee\x77\xc3\x2b\x4a\x02\x9d\x68\x53\x76\xaf\xd5\x01\xab\xbc\x07\x94\x5c\x74\xc7\x43\xa2\x31\x21\x1b\x62\xee\xd8\x2d\xe6\x8e\x26\x51\xa4\xa2\xcc\x42\x37\x46\x12\xdc\x34\x89\x44\x96\xc4\xb8\x36\x9c\xb9\x7c\xe3\x47\xac\x6d\xee\xa0\xbd\x9c\xfd\x08\x25\x90\xa8\x6c\x8c\xcf\x87\x02\x07\x34\x89\x74\x88\xcb\xd4\x50\x74\xf2\xcf\xe4\xaf\xff\xea\xbf\xf6\x2b\x62\x66\x42\x7b\x43\x03\xee\xb1\x75\xbf\x8d\x87\x25\x41\x8a\xc3\x1e\x78\x21\xab\xd2\x82\x8f\xed\xb1\x94\xa4\x44\xf8\xc0\x6f\x7d\x32\x32\xcf\x37\xa5\xac\x84\xc4\x04\x11\xc4\x4f\xbc\x79\xe5\x75\x2e\xf6\x38\x9f\x7c\xbe\x9d\x50\xaa\x91\x7f\xe0\xca\x01\x6e\xb5\x1f\x3d\xf0\x84\x66\x86\xf4\x81\x53\xe5\xf0\xb4\x7e\xf6\x1f\xd7\x71\x68\x82\x87\x41\x37\x71\x3c\x01\x12\x16\xc4\x0a\x7d\x8d\x2f\xb8\x70\x4c\x00\x84\x93\xc1\x59\x98\x22\x7d\xb2\x87\x35\x7d\x0a\x06\xa5\x49\x96\x19\x9e\xa0\xdb\x68\xbd\x61\xe7\x84\x54\x3d\xff\x7f\xe7\x2f\x82\x87\x19\x6e\x6e\x8b\xbc\x56\x75\x65\xe5\xa1\xc7\x2e\x56\xf3\x75\xce\x84\x27\x4c\x40\x6f\x8d\x32\x05\x15\x4d\xbe\x26\x65\x89\xcd\x32\xbe\x14\x5c\xe5\xbc\xad\x6a\x47\x7e\x98\x3c\x46\xce\x12\x54\x7a\x40\xf2\xe5\x27\xb5\xb4\x84\x8b\x00\x3b\xc6\x4e\xc5\x12\x23\xfb\x43\x14\x1c\xfe\xce\xcb\x8b\x17\x2f\xa0\x09\x97\x19\x36\x7f\xb6\x28\x26\xff\x58\x5d\x79\xd1\x5e\x77\xa8\xa7\x36\x9a\xaf\x22\x63\xa1\xc5\xc1\x3d\x00\x6c\x41\xe6\xe7\x7c\xaa\xad\xdf\x8d\x52\xc6\xd3\x84\x6b\xd8\x57\xbb\x8b\x30\x68\xd5\xf9\xbb\x2b\x38\x15\x4e\xae\xc7\x89\xcb\x18\x49\xb4\xdf\xa6\x03\x01\xa5\xa6\xbf\x1b\xf7\xb2\x31\x30\xc1\x8e\x91\xca\x60\x02\xba\x7d\xa2\x8b\x56\xb6\x97\xd2\xcf\x64\x09\x02\xf7\x90\x89\x7b\xf5\xf2\xeb\x7a\xd9\x57\x3c\x13\x45\x8c\x47\xd1\x11\xda\x47\xe0\x53\xa3\x32\x9a\x00\x21\xca\x88\x75\xdf\xd9\x8a\x5a\x7f\x85\x40\x00\x43\xc2\x2f\x77\x4f\xa3\xbb\xa6\x63\x8d\x14\x64\xdc\x71\x7f\x37\x78\xc9\x01\x8b\x92\x26\x9a\x01\x76\x5f\x71\xed\xbb\xe7\x86\x63\x39\x90\x83\xa5\x89\xd6\x42\xa5\xde\x5e\xa9\x9d\x85\x3e\xd1\x34\x10\xa9\x0c\x3c\xab\xfe\xdf\xd0\xc3\x1a\x87\x8b\x71\x1a\x26\x91\x11\x3e\x6d\x6c\x39\xf6\x33\xf0\x23\x4d\xc3\x8c\xe3\x59\x0f\x2e\x2c\x18\xd2\x59\xe6\x48\x41\x34\x0d\x75\x44\x4d\x82\x86\x1c\xca\xf1\x4a\x96\x46\x71\x2a\x6c\x36\x38\xa1\x9d\xd0\x34\x0e\x0c\x36\xb2\x06\x09\x65\x3b\x52\xe9\xec\x0e\x5a\xd4\x28\x82\xe2\xe3\x43\x2e\x2b\x5c\xcc\x67\xda\x83\x34\x4d\xba\x6c\xd7\x14\xf3\xaa\x77\x98\x38\x63\xd1\x34\xe1\x09\x38\xd3\x46\x5e\x40\x64\xb6\x1f\xd5\x2f\xfd\x69\x1a\x31\x94\xc0\x15\x97\xeb\xdd\x25\x2f\xd4\x8c\xe9\x87\x1b\x19\x9b\x26\xef\x4e\xbe\xd6\x55\x37\xce\xaf\xcc\x69\x4a\x28\x32\x3d\xbf\xbc\x8c\x76\xbe\x34\xe5\x46\x38\xa7\xe5\x6f\x80\xa4\x7f\x57\x73\xb9\xe9\x1c\xa4\x29\x04\xf8\xe2\x3e\x7d\x1b\x9d\x81\x44\xb1\xb2\x7e\xe6\x46\x32\xfb\x84\x65\xd0\x53\xde\x03\x4a\x27\x3f\x99\x06\xa9\xa4\x9e\x4d\xfa\xc0\xdf\xe0\xab\x79\xc5\xdd\xf1\x28\x8a\xfd\xeb\x33\xb5\xb7\xa7\x29\x4d\x42\xac\xb7\x70\x21\x47\x17\x42\x59\x8c\x30\xe5\x3f\xaa\xb6\xe6\xfe\x8f\x99\x61\x6c\x20\xc3\xe2\xee\x72\x85\x7a\x94\xcb\xa5\x54\x86\xd4\xc8\x01\x20\x94\x74\xc0\xc7\x46\xf1\x28\x04\xd0\x77\xcf\xb5\x59\x2f\x37\x7f\x2a\xe2\xf2\xd1\xbf\xe3\xeb\x67\x2a\x49\xd2\xb1\x8c\x6b\x6e\x08\x8b\xb3\x20\x27\x9a\x66\x4a\xe3\x7b\xea\xba\xc9\xcd\x5d\xf7\xda\xed\xf2\xff\xfa\x2b\xe5\x01\x35\x32\x7d\xdd\x63\xf4\xf7\x91\x6b\xcb\x7c\x2f\x15\xca\x6e\xe8\xa9\x52\x20\x4d\x45\x42\xd0\x7b\xee\xa0\xc0\xac\xcc\xb7\xad\xb3\xf1\xc5\x0b\x95\xe0\x0a\x2d\x3d\x82\xf3\xbf\x30\x3d\xa7\xa6\xd8\xfc\x5e\xed\x56\xbf\xaf\x9e\xf7\x7f\xe0\x3f\xbf\xf9\x83\x0c\x19\x18\xf0\xcb\xf1\xd1\xdd\x16\x66\x07\x48\x65\xac\xe3\xfd\x6a\xb0\x2e\x77\xdd\xa6\x55\xcf\x37\x7c\x52\x15\x52\x94\x19\x7e\x87\xf7\x5e\xb6\x9e\xa6\x4a\x8a\x70\x62\x05\x64\xa4\x5d\x86\x0f\x18\x48\x86\x15\xd0\x7d\x7d\x1d\x44\x1f\x29\xf0\x0c\x81\xe7\x67\x84\xf5\x39\xf7\x27\x77\x50\x67\xc2\x16\xda\xe5\xdb\xee\x3c\x65\xd2\xd0\x54\x07\x11\xb6\x98\xbe\xd7\xbc\xcc\x2f\xa7\x97\xe2\xe2\xd7\x0d\x1d\x12\x0c\xad\xcf\xc0\xeb\x62\x37\x25\x21\xd1\x54\x13\x88\x3c\x1d\xe8\x49\xbb\x7b\x42\x82\x4c\x86\xd6\xfd\x6f\x86\xec\x45\x49\xc0\x43\x74\xc1\xe0\x6d\xcb\xe5\xab\x9b\x75\xb7\xa8\xe1\x4f\xa3\x04\x12\xa8\x08\xb1\x03\x77\x9b\xcd\xb7\xf5\x6a\x37\xfe\x59\x24\x50\x1c\x09\x42\xb6\x5a\xf9\xf2\x89\x26\x15\x45\x57\x47\xbc\xe0\xba\x7a\x1f\x2b\xbd\x50\xd2\x45\x31\xa6\xf3\x51\x58\x99\x89\xfe\x10\x00\x36\xd4\x0c\xed\x67\x5a\xdc\x9f\x9f\x4e\x24\x4a\x02\x04\x62\x4a\x5e\xc8\xff\xfb\x63\x69\x92\xab\xbb\xeb\xac\xaa\xe6\xf4\xa3\x24\xd4\xc2\x60\x79\x96\x03\x6c\x5f\xaf\x98\x76\x77\x7d\xe4\xa5\xea\x69\xa1\x94\xc4\x54\x20\x1a\xde\xc0\xba\x86\x74\xc9\xf1\xa4\x25\x31\xf3\xb3\x7c\xcb\xb5\x36\xa5\xc1\x47\xd0\x6e\x2b\x25\x69\x68\x5c\x78\x4b\x94\x65\xb1\xcc\x0c\x7f\x90\x9a\xf6\x7d\x8f\x0c\x20\xa9\x90\x68\x18\x8b\x3e\xcd\x08\x49\xf2\x68\x40\x4a\x52\x49\x90\x62\x27\xa0\xdd\x94\xf7\xd5\x7f\xa7\x95\x09\x92\x4a\x81\x22\x68\xdc\xa0\xe2\x9e\xf2\xd1\x4c\x20\x24\x0e\x68\x37\x5d\xaa\x9f\x25\xd4\x07\xff\x57\x45\xb3\x91\x9e\xf3\xaa\xfc\xbc\x0d\x45\xa8\x48\x29\x9b\x18\x95\x2f\x4a\xb5\x68\x9a\xfc\x38\x04\x11\xff\xb5\xff\x1d\x96\x39\x27\x2f\x2b\xcb\x52\x6c\x45\x3a\x0c\xd6\xa0\xc2\x31\x7e\x0e\x59\x92\x64\x26\xed\x3a\x20\x0a\xf8\x60\x08\x2c\xf3\x25\x55\xf7\x19\xc2\x31\x8b\x33\x35\xa1\x1f\xd0\xc5\x49\x03\x4d\xd9\x5e\x90\x28\x74\xbf\xbb\x5b\xa2\x2d\x72\xda\xfb\x64\xf9\x7a\x06\xc9\x34\xc1\xb2\xd0\xd9\x20\x84\x0f\x5e\xc8\xb6\x4f\xd3\xed\x48\x2e\xa4\xc8\xfa\x68\x00\xab\xf8\xdd\xee\x10\xb9\x53\x09\x16\x1a\x21\x0b\xa3\x31\xf3\xd7\x66\xb6\x94\x01\xc2\x6a\x34\xcf\xb1\xc3\x5a\x5d\xda\x2d\xf0\xc6\x11\x87\x28\x51\x2a\x06\xed\xdb\xb4\xae\x43\xe5\x2a\x56\x04\x62\xc3\xdb\xf9\x5a\x95\x55\x71\x29\x2e\xee\x63\x90\x02\x16\xa9\x0f\x87\xfb\xd5\xdd\xf7\x2f\x87\xbb\xc5\xa3\x3f\x94\x45\x88\x50\xb7\xf0\x6c\x67\xe8\xfc\x69\x51\x82\x00\x17\x18\x0b\x99\x1f\xf7\x52\xc3\x5a\x56\x8b\x52\x61\x5c\xe5\x95\xe5\x29\x01\x09\xce\xf7\xc3\xe0\xb9\x71\xc0\xe4\x85\x07\x15\xe0\x32\xec\x14\x8d\x86\xa1\x02\xd1\x01\x8b\xed\x82\xda\x6d\x64\xcf\x97\xd3\x46\x2f\x79\xdd\x4f\x36\x1d\x1b\x77\xe6\xed\xea\x61\xb5\xdd\xae\xee\x0d\x48\xe6\xf0\xb2\xda\x3e\xad\x1f\x9d\xf1\x09\x25\x9a\x44\xd2\x10\x9a\x30\x05\x1a\x5f\x02\x0d\x62\x23\xf5\x6e\xd6\x0a\x94\xbf\x6f\x87\x78\x58\x3b\x2c\x0c\x8c\x22\xe4\x89\xd7\x75\xce\x8f\xf0\x52\x57\x95\x1e\x36\x24\x68\x18\x71\xe3\xed\x79\xbf\xef\x15\xe5\x46\x8f\x98\x86\x2c\xcd\x7c\x9c\xb3\x40\xe4\x4d\x85\xa6\xef\xee\x38\x84\x59\xec\x96\x3a\xec\xf1\x2f\x2b\x35\xe2\x5e\x50\x1a\x45\x3a\x9b\x6c\xbd\xef\xf9\x14\x97\x4a\x69\x2c\x8d\x0c\xbd\xe8\x5e\xce\x55\xa9\x1a\xf7\x72\xd2\x58\x6b\xcc\x0e\xfe\x73\x81\xfa\x6a\x26\xff\xf7\x72\xf1\x93\xbf\xc1\xee\x2d\x2f\x8a\x6e\xa5\x37\xd1\xe5\x3f\xc3\xd0\x76\x07\x69\x12\x48\x6d\x25\x3a\x81\x17\x2f\xfc\x3c\xd6\x39\xa7\x34\x0d\x01\x3b\xb7\xd5\xc4\x63\xe7\x96\xfd\x4a\xbb\x18\xd0\x65\x4d\x2f\x08\xc0\xac\xf3\x89\xd8\x3f\xed\x36\x68\x9c\x8c\xcb\xc5\xd0\x28\x95\x52\xc2\x53\x64\x02\x9a\x92\x96\x57\x34\x77\x47\x35\xc7\x66\xdd\xa2\x38\xbf\x72\x59\x95\xfd\x73\x70\x24\xe9\xd4\xfd\x22\x4a\x8d\x00\x20\x3e\xeb\x71\x87\x99\x52\x61\x9c\x72\x1e\xab\xe3\xd6\x72\xaf\x41\xad\x87\x84\x4f\x92\x8c\xaa\xc5\x94\xaa\x80\x04\xbe\xa4\xf2\x52\x57\xdd\xeb\x5c\x2f\x6e\x64\xdc\x28\x65\xa1\x8e\x0d\xa1\xf0\x7c\x06\xf5\xdd\x25\x20\x34\xb3\x3e\x12\x67\x93\x8a\x99\xc2\xf2\x78\x53\xa6\x19\x67\x38\x93\x79\x6e\x4a\x6b\x03\xac\x3e\xa5\x9c\x28\xce\xdd\x0f\xf2\xfe\xeb\x93\xb7\x98\x67\x61\x64\xd6\x38\xd0\x79\xd1\xb7\x99\x29\xe7\x80\xdd\x6c\x04\xa6\xb8\x24\xe8\xa9\x72\x4e\xff\x94\x8a\x80\x1a\x8c\x3e\xf7\xc6\xf9\x93\x5f\x26\x98\xc2\x97\x3b\x3f\x57\x3f\x7f\xb3\x82\x1b\xc3\x7b\x24\x78\x24\xbd\xb2\xe6\x5a\x3f\xc1\x91\xff\xdd\x83\xf8\xfa\x56\x30\x95\x24\x31\x0a\x55\x68\xc7\xf5\xdb\xcc\xd2\x4f\xa5\xe6\x58\x3a\xfa\x09\xf9\xb8\x09\x41\x95\x88\x62\x23\x29\xfd\xed\x8f\xa5\x37\x99\x1e\x5f\xa8\x52\xa9\x93\x3b\xd8\xf5\xfe\xa6\xe3\x1b\xa5\xb4\x21\x75\x3c\x5e\xdf\xde\xc0\xf6\x57\x06\xfa\x63\x73\xbd\xee\xd1\x7c\x80\x20\xc2\xc5\xfc\x98\x77\xa1\xd5\x00\x38\xfa\x41\x41\x87\x82\x8e\xf0\x85\xef\x76\x1c\x2c\xe2\xd8\xbf\xeb\xcc\x08\x87\x1e\xf9\x09\x5d\x81\xa7\xf5\x5b\xaa\x75\x84\xbe\x82\xd2\x60\x49\x2c\x21\xab\xf5\x2f\xb3\xd6\x0c\xbb\xf5\x76\x5b\xdb\x99\x00\x61\xd0\xb6\x62\x41\x4c\x11\xaf\x67\x9c\x8f\xf3\xf6\xfa\x52\x55\xc5\x00\xe0\xe6\x86\x25\x89\x09\x4e\xba\xe4\xe3\xc9\x58\xc3\xf9\x63\x9a\x38\x33\xc9\x7b\x68\xda\xda\x4c\xfe\x59\x9c\x05\x0b\x83\x18\x2f\xc8\xec\xdb\x56\xab\xb3\xa7\x28\xf8\x5b\xc2\x42\xc5\xa4\x2b\x63\xb8\x7e\x3c\x8b\x28\x30\xa3\x45\x69\xda\xdf\x73\x68\x2c\x16\x65\x21\x2a\xab\x9c\xeb\xea\x04\xed\xeb\xe4\x02\x22\x11\xd2\x21\x0a\xa7\xdb\x6c\x8d\xdf\x78\x2b\x5f\xe7\xe0\xab\x73\xff\x65\xcf\x15\x0b\xa3\x8b\x6e\x56\x74\xa7\x5c\xb9\xaf\x7a\xdf\x17\xca\x92\x38\x43\x7d\xe3\xdd\x7e\xb1\x5f\x1d\x5e\x16\x7f\x6c\xbe\xef\xfd\x31\x9e\x61\x17\xbb\x7d\xcd\x9b\x9f\xde\x2f\x88\xb2\x34\xd0\x48\xf2\xda\x5d\xca\xf2\xea\xff\x48\x22\x69\x0a\x9c\x66\xb7\xdc\x62\xd9\x03\xf3\xe5\xe6\xc5\x73\x4c\xef\x6d\x92\x68\x16\x35\xff\x59\xc1\x31\x23\xf2\x51\x4d\xb7\x36\x6d\x0d\xd8\xc3\x8f\x51\xa6\xcc\xd0\x40\xfb\xbd\xec\x56\x72\xe5\x84\xf7\xac\x64\xed\x8c\xd1\x3e\x65\x24\x4c\x02\x2b\xbb\x7c\x97\x57\x76\xa5\x1d\x4e\x57\x46\x62\x13\xc1\x9b\x65\x03\x15\x14\xf6\xd5\x7a\xb9\xe9\x7e\xb0\xdb\x96\x18\x61\x04\x4c\x55\x1a\x2b\x5f\x43\x28\xfa\xe4\xf9\xd1\x28\x74\x1e\x0b\xbb\x13\xaf\xdb\xdd\x2b\xef\x66\xde\xdd\x75\x3d\x99\xc5\x8c\xc6\x22\xf5\xf6\x17\xe8\x3b\xef\x57\x3c\x46\x13\x53\xab\xcf\x9b\x1d\x56\x38\xa6\x20\x77\xca\x28\x49\xb1\xc9\x74\xd0\x55\x7d\x39\xad\x95\xf1\x78\x1e\xed\x7b\x8c\x32\x66\x12\x61\x07\x58\xff\xc9\x6b\xf5\x50\x73\x39\x9c\x39\x54\xa4\x06\xaa\xf0\xf8\x6d\xa6\x8f\xcd\x98\x48\xf1\x97\xc3\x29\x6f\x17\x35\xf0\xdd\x00\x7b\x34\xda\x15\x99\xd0\x80\x06\x09\xdc\xbe\x68\xb3\x91\x9a\x13\x3a\xea\x7f\x88\x0c\x43\x0c\xa4\x4c\x17\xec\x71\x79\x3f\xbf\x06\x31\x19\x85\x18\x5a\xb4\xfc\x0d\x06\xc8\xbb\xcf\xdb\x74\x4c\xc6\x09\x32\xf2\x04\xb4\xcd\x46\xeb\xc9\x4d\x94\xc0\x94\x93\x20\xe5\x4e\x51\x6e\x04\x2e\x64\x12\x32\x8c\x42\xbf\x6d\xbe\xfd\xe6\xff\xc4\xb1\x34\x2b\x86\x5d\x60\xa6\x48\x1c\xd8\x80\xd0\x78\x63\xb9\x28\x7e\x3a\xff\x95\x22\xa8\x3e\x70\xb2\x34\xc7\xbd\x03\xf6\xf5\x8f\x1f\x62\x8e\x13\x77\xb5\xdb\xbc\x58\xdc\xe8\xf8\x67\xe9\x34\x41\x05\x87\x2e\x21\xe9\xd2\x75\x74\xb4\x1d\x7f\x8d\x56\x19\xf6\x0f\x4c\x89\xec\x29\xff\x40\x52\x96\x32\xad\x53\x16\xf6\x02\xa6\x55\xd3\xc5\x50\xd7\xa2\xe2\x0a\x51\x0f\xb3\xf5\xd9\x2c\xe0\x1c\xf3\xba\x7f\x57\x79\xf9\xd4\xfd\xdc\xa1\x09\xe7\xe8\x5a\xb3\x50\x10\x94\x50\xfb\x01\x27\x5e\xbb\x35\x24\x8b\x02\x02\x7d\x16\xb2\x2a\x40\xde\x12\x4a\x68\x16\x85\x81\x53\xc0\x37\x35\x9e\xc7\xbc\x7c\x1b\xdf\x8b\x2c\x4a\x18\x70\xd7\xe0\x2b\x70\x57\xf0\x44\xd9\x49\x33\x30\x8b\x03\x15\x19\xd4\x50\x91\xbf\x5b\x6c\x82\xbb\xa2\x38\x26\x81\xbd\x0f\x9b\x77\xa8\x6d\xef\xed\xc7\x6a\xdd\x2b\x0c\x76\x83\x54\x6a\x4b\x95\x6b\x59\xe1\x6a\x31\xbb\x91\x64\x31\x13\x58\xb3\x3d\xe5\x25\x16\xc4\x40\x61\x65\x6d\x5d\xf6\x6b\xa1\x3b\x67\xc2\xa8\xe2\x3e\xf6\x28\xdf\x79\x9d\x73\x1f\x3a\x65\x69\x00\xa8\x27\x5e\x54\xc7\x11\xc6\x28\x4b\xa5\xb1\x41\x7f\xc8\xbd\x21\xe8\xf8\xe6\x91\x20\x03\x0b\xea\xda\xd4\x4b\x2e\x5f\xe1\x1e\x1a\xc4\x2c\x81\xda\xc2\xb9\xaa\x5b\x63\x5a\xed\x86\x27\x46\xe8\x1f\xc5\x3e\xa6\x3d\x8b\x8c\xa4\xd4\x7a\x1e\x2e\x0b\xc0\x25\x0d\xb3\x7f\x2f\xaa\x3a\xf9\xf9\x84\x85\xa8\xa6\xbc\x58\x3d\x0c\x61\xd8\x19\xc9\x52\xfc\xad\x9e\x54\x6f\x28\x3c\x33\x00\xb1\x8c\x70\xb7\xe6\xea\x41\xf7\x78\xbe\x0e\x93\x11\x99\x18\x87\xc8\x21\xed\x69\xc8\x3c\x4e\x82\xc9\xab\x80\x18\x01\x6c\x1d\x60\x5a\xf5\x80\x1b\xf6\x34\x1b\x76\x5b\x69\x46\x93\xcc\xc8\x17\xe6\xc7\x7b\x44\x57\xe0\x7b\x66\x63\xb8\x45\xa9\x10\xb9\xe2\xc6\x52\xea\x92\xcb\xc7\xaa\x6d\xa1\xbe\x6e\x06\x6c\x29\x36\x5e\x0f\x27\x09\x6c\x46\x33\xc0\x16\xdd\xe3\xe6\xcb\xe1\x0e\xda\x1f\x9f\xd0\x0f\x47\xcb\x6f\x46\x41\x86\xc6\x42\x0d\xf7\x43\x2b\xd8\x60\x0f\xb2\x84\xc7\x62\x60\xe7\x82\x1b\x41\x55\xcf\x19\x35\xcc\x75\x41\x32\x46\x12\x62\xf9\x9a\xbb\xcb\xb9\x7b\x75\x60\x8c\x7a\x1a\x3e\x38\xa6\x13\xd3\xd9\x07\x71\xbe\xb8\x35\x2d\xcb\x82\x34\x23\x23\x29\xcc\x45\xdf\xe0\x1e\x3f\x9a\x2c\x62\x58\xf8\x3a\x9b\xf0\x79\x5d\x36\x2d\x2f\x8a\x13\x78\x3d\x61\x9a\x65\x44\x23\x0d\xd9\xe2\x03\x5b\xd7\x53\x1d\xdf\x93\x4c\xc7\xc8\x0b\xed\x5e\xa0\xbc\x3c\x3e\xf1\x5f\x03\xf2\x23\xcd\x78\x68\x5e\x81\x4b\xe9\x55\xac\xdc\x11\x61\x4c\x6b\xc4\xa5\x30\x72\x4b\x86\x27\x36\x07\x51\x9d\x46\x5d\x99\x48\x62\x66\x01\xbe\x77\xb9\xc2\x26\xf8\x74\xf7\xce\x54\xc0\x48\xd0\xd7\x96\x87\xb9\x52\x06\x81\xc9\x13\x8f\x56\xe2\x7b\xba\x26\x42\x24\x54\x6f\xcd\xd3\xed\xc9\xd3\x01\x94\x22\x42\x7d\x85\xe2\xc7\xa5\xbc\xee\xb8\xf6\xb3\x5c\x73\x8e\x0b\xd8\xa5\x3c\xf3\x4b\x33\xc6\x36\x64\x5a\xa4\xb1\x45\xae\x7c\xdf\xdd\xe3\xb7\xcf\xb4\x4f\x32\xad\x8d\x32\xd5\x41\xc1\xfb\x6f\xfd\xdf\x32\xab\xd9\xe2\xb4\x08\xea\xe6\x11\xca\xa3\x53\x6e\xa2\x3c\x08\x23\xac\x48\x22\x85\x65\xd2\x71\xe4\x41\x18\x63\x54\xcc\xd5\xbf\x2f\x4d\xfb\x95\xd7\x6a\xc9\xcf\xd3\x31\x91\x19\xd3\xbd\xdc\xf7\xbc\xce\xab\xf1\x2b\x38\x57\x10\xe2\x4e\x39\x0c\x7d\x37\x5a\x5e\x54\x47\x53\x55\x98\x76\x0a\xdd\xf0\x54\xa3\xca\x92\x25\x76\xf8\xfd\x79\x32\x2c\xa4\x8a\xc5\x36\x2a\xda\xf3\xe6\xcd\xd9\x9c\xcf\x16\xa5\x78\x94\x0a\x6c\xf6\xfd\xfd\xd2\xb4\x46\xc0\x6e\x82\x56\xe0\x11\x18\xf1\x79\x9d\x37\xaf\x82\x97\x6e\x97\xe4\x71\xcc\x22\x23\xe5\xc8\x6f\xe0\x38\x6e\x48\x9a\xa0\x94\xfe\xc9\xc0\x5a\xec\xcf\x32\x08\xbe\x27\x7e\x9e\x5c\x78\x2c\x23\xcc\x6f\x5a\x68\xda\x07\x9e\x17\x08\x73\xc3\x6a\x62\x75\xc1\x8a\xc5\x81\xbb\x1c\xed\xd0\x56\x86\xaf\x8e\x92\xe5\xee\x8a\x92\xd4\xdb\x65\x2f\xf3\x1a\xf3\xf8\xbc\x2a\x47\x1d\x31\x9e\x64\x32\x32\x42\x50\x97\xa6\xed\x05\x59\x3e\x4b\x31\x79\xa2\x32\x7c\xab\x1f\xd7\xff\xf3\x7d\x7d\x3f\x26\x6d\x71\x12\x70\x67\x96\xdf\xab\x78\xcf\xf0\x59\x29\x27\x40\x91\x81\xb1\xda\x7f\x3d\x7c\xdf\xdd\x1f\x06\x79\x20\xa7\x41\x12\x5b\xb9\x8e\x97\x1a\x64\x75\x3a\xe5\xad\xe9\x34\x76\xaf\xdc\x69\x46\x50\xd2\x7e\x90\xc5\x86\x5e\xbe\x70\x99\x11\x67\x3c\x95\x16\x3d\xb0\xcf\x27\x9a\x34\x94\x67\x29\xc7\x72\xc4\x8f\xaf\x9b\x47\x0b\xc5\xfa\xba\x5d\xed\xbe\x7a\xfa\x25\xe5\x3c\xe6\x4e\x2c\xce\xf6\xb7\x87\x92\x00\x94\x73\x06\x58\x07\xf3\x45\xa2\xa7\xa5\xbf\x1b\x5c\x18\xef\x8b\x06\xda\xc3\xb8\x1f\xce\x45\x62\x50\x2f\x5d\xf6\xf1\xca\x6b\x6b\x55\xb3\xa8\x6b\xee\x1f\x8e\x4c\x14\xca\x14\x14\xfc\x52\xca\x57\x53\xfd\xbc\x51\x0d\xa0\x5c\xb2\xd0\x36\x95\x2b\x75\x91\xad\x57\x97\xb2\xc5\xa5\xb1\x40\x1f\xe5\x92\x73\xb4\xb7\xf1\x8e\xdc\x37\x8a\x6b\xf3\xb7\x56\x8a\x08\x01\x38\xff\x37\x6f\xeb\xe9\x6b\x24\x95\x34\x90\x19\xdb\x28\x79\x77\xe8\x9a\xb1\x75\x37\xe5\xa0\x43\x62\x0a\x80\xba\x86\xe6\xf5\x46\xa1\x63\xfe\xab\x41\x1b\x8a\x0c\x96\x0c\x7c\xb0\xee\x18\x0e\xfd\x7e\xc6\x75\x92\xa2\xa8\xf6\xf2\x35\xbf\x56\x97\xe5\xa5\x68\x2f\x35\x56\x48\x5f\xbb\xa0\x77\xbc\x5f\xde\xea\x57\x50\xae\x39\xe0\xb2\xf5\x83\x5f\x97\x60\x5b\x56\xf6\x37\x8a\x40\x13\x0b\xd8\x6a\xbb\xb0\x3b\x77\xdb\xa5\x08\x69\x84\x6a\xc0\x5f\x16\xbb\x83\x61\x6c\x0c\xac\x9e\xa9\x08\x33\x86\x1c\xf0\x63\xfe\x0e\x63\x36\xdb\x3f\x93\x7f\xfd\x6d\x70\x93\xd8\xdf\x06\x9a\xb3\x8e\xdb\x4f\x45\xc8\x29\xc7\xe7\xd5\x4d\x6e\xd9\x1e\x34\x8c\xb7\x02\x11\x2a\x13\x50\xb9\x94\xfc\xf7\xaa\x8b\x27\xb6\xdd\xd2\x3d\xd9\x90\x44\xa8\x88\x72\x00\x4a\xec\xb3\xda\x57\x79\x46\x9c\x92\x8a\x48\x51\x30\x72\x49\xe7\x1a\xba\x34\x71\x51\xaa\x09\x0e\xc6\x8e\x8c\x63\x46\x6f\x7c\x7b\xdd\x31\x6a\xbc\x48\xcd\x92\x72\x63\x26\x38\xfe\xca\x24\x96\x49\xaf\xaf\xff\x72\xf9\xef\x7f\x2d\xf2\xf1\x73\x97\x24\x2a\x12\x66\x4c\x24\xbb\x94\xce\x28\x70\x3d\x71\x0f\x75\x11\x09\xd3\x4e\x74\xe2\xb7\xb9\xdc\x53\x24\x90\x72\x13\x91\xb5\xf5\x8d\xca\x19\x15\x69\x18\x81\x13\xb5\xb6\x7b\xd1\x14\x5d\x77\x1b\x5c\x09\x12\xc6\xa9\xd5\x3a\x5d\x16\xd5\xcf\x49\xcc\x2f\x08\x0b\xb0\xb9\xb8\xa9\xf3\x63\x97\x17\x3c\x5d\xd7\x18\xeb\x37\xf9\xa0\x86\x2c\x08\x33\x2e\xaf\xdf\xcb\x33\x97\x6f\xab\xb2\xf5\x35\x6e\x37\x20\x03\xfc\x6d\xa8\x94\x30\x55\xc5\xa3\x02\x79\xe7\x98\x55\x63\x6f\xee\x6b\x55\xbd\x41\xdd\x78\x9d\x6b\x2a\x68\x60\x48\x4e\xdd\xf2\x66\xa3\x81\x51\xa3\xf3\x26\x94\x9d\xf1\xe7\x70\xa7\xe2\xc0\x7b\x55\xde\xe6\x3c\x61\xfc\x0a\x2a\x23\x4e\x9c\x1e\xee\x9f\xe2\x2b\xa6\x7f\x9f\xa0\xe7\xc6\xa7\x66\x81\xc9\x2c\x7b\x2f\x95\x07\x80\xa7\x4a\xe5\x3a\xbf\xc1\x55\x0b\x16\x53\x84\x9c\xb4\x03\x85\xe9\xf9\x5f\xc4\xb2\x8c\x52\x0f\x3d\xb3\x67\x9e\xfe\x2c\xa6\xcc\x20\xb0\x26\xe6\x1b\xbd\xbf\x9e\x27\x81\x98\xc8\x12\x85\x2c\x4c\x65\x15\x3f\x87\xc4\x7f\x2a\x32\xce\xb1\x25\xf7\xb0\xde\xee\xf6\x87\xdf\x37\x8f\xdf\x9f\x56\x23\xaa\xb6\xc8\x94\x40\x65\x25\x69\xbc\xcc\xec\x4b\x3e\xf9\x12\x1e\x06\x58\x6b\x68\x70\x71\x5e\x4e\x23\x02\xc1\x23\x89\x5a\x63\x77\x50\x54\x6d\x5b\xfd\x3f\x3b\xf7\xfe\xd5\x7f\xdd\xd7\x12\x99\x10\x27\x9a\x66\xb4\x18\xac\xea\xe9\xcc\xac\x11\x91\xe9\xb2\xb9\x00\x62\x59\xf0\xa6\x59\xfb\x1d\x6d\x7c\x66\x91\x46\xf1\xd8\x09\xa0\xed\xa3\x08\x21\x94\x09\x7e\x5f\xa1\xae\x96\x55\xed\xff\xae\x58\x8a\x12\xbd\x2f\x0f\x5f\x96\xd3\x4d\xc1\x91\xbe\xfa\x0b\x82\x94\x84\x4e\xd0\x04\xa1\xd8\x68\xb1\x09\x33\x84\x73\xfb\x01\x9d\x9a\xd8\xd7\x77\x7e\x1d\xab\x69\xf6\xd5\xf6\x6c\x27\xa1\xa9\xc0\xa9\xfa\xa5\xae\x2e\xe7\x61\x98\x3a\x2d\xe9\x08\x4d\xd5\x20\x24\xe9\x36\xfd\x99\xd8\x5f\x68\xa9\xd3\xee\xc2\xbf\xe6\xc7\x21\xbf\x55\x68\x25\x33\x83\xc5\x07\x5e\x3f\xc2\x3b\x78\xb9\x02\x19\x08\x85\x71\xff\x0e\x40\x3d\x56\xc7\x69\x97\x7d\x7c\x19\x32\x50\x5c\xa5\xae\x1a\x62\x12\x6c\x5e\x0c\x5c\xcd\xa9\x0c\x20\xc5\x14\xe6\xae\xaa\x4e\x50\xf3\xf2\xf8\xe8\x7a\x03\xf3\x00\x1f\x19\x46\x2c\xb6\x78\xd4\x97\xcd\xe6\xf1\xd0\xcd\xa9\x43\x94\xb8\xf3\x85\x29\xc3\xcd\xe4\x80\x12\x9d\x35\xe6\x2c\x68\xfd\x1f\xb2\xf1\x8f\x97\x21\xcd\xb0\x38\x2f\x5a\xb9\xaf\xac\x37\xcd\x64\x48\x12\x9a\xca\xad\x84\xba\x5d\xa3\xa3\x88\xfb\x9a\x54\x46\x18\x15\x76\x6f\xd4\xe6\x3c\x4d\x29\x64\xaa\x32\xcc\x68\xef\xea\x6e\x31\x1d\xc4\x1f\x92\x44\x11\xa6\x30\xe7\x11\x53\x68\x84\x79\x92\x24\xa3\x98\x40\x6c\x77\xcb\xee\xa9\xdc\xf4\x78\x27\x77\x84\x52\xc9\x9c\x99\xed\xc9\x48\x7d\xe6\xc5\x55\x5c\x7b\xb5\x71\xb3\x11\xfa\x80\x41\x32\x15\xd2\xd0\x41\xe3\x5b\x5e\xfc\xc8\x95\xad\x11\x85\x23\x5d\xaa\x6e\xa4\xc2\x16\xd9\x17\x38\x8d\xa8\x79\x92\x69\x12\x82\xaf\x50\x2c\x2e\x35\x9f\x5f\x20\x65\x96\x52\x6c\x25\x60\x61\xc6\xe9\x7c\x7c\xf4\xda\xfc\x6d\x06\x3d\x2b\x79\x18\x27\x1e\xf4\x8f\x88\x65\xac\x76\x9c\xce\x03\x0d\x10\x37\x34\x89\x99\xea\x6d\x45\xee\xf3\xe6\x5c\xf0\xe9\x20\x49\x22\xa1\x5c\x98\x76\xb8\x34\x3d\x92\x53\x4a\x46\x30\xd9\xe9\x22\x4e\x78\xad\x2e\x0d\xcc\xe4\x25\x52\x32\x05\x6a\x20\x81\xfe\x58\xc9\xb7\x8b\x05\x60\x5b\x06\x6c\x97\x46\xc9\x57\x38\x71\x2c\xbb\xce\x82\x4b\x5c\xc4\x2b\x55\xc2\x11\x8b\xc9\x95\xc2\x4a\xda\x8d\x2f\x23\x95\xc0\x8d\xd0\xa7\x91\xe6\x94\x6f\x86\xd1\x3a\x3e\x8d\x0e\xcc\x43\x35\x4f\x04\xaf\x66\x69\xb9\x34\xc3\x17\x50\xa7\x61\xa2\xbc\x04\x3b\x3a\x19\xac\xda\xd7\x19\xab\x85\x6e\x68\xc2\x64\x1f\x32\x0d\x83\x36\xa9\x89\x96\x7d\xa7\x05\xab\x0b\xfb\x5f\x33\x34\x0c\xa9\xa9\x40\x90\x1b\x12\x11\xbb\xd8\x37\xf6\xa7\xe0\x5a\x5a\xaa\x1a\xaa\xb8\xa3\x2d\xaa\x3d\xa8\x82\x20\xc5\xdc\xf6\x01\x4b\xca\xe6\xde\x7a\x19\x41\xaa\x82\x28\x31\x59\x29\xbe\xbe\x90\x2f\x4d\xe8\xeb\x27\xa8\x0a\x62\xc8\x9c\xd2\x3c\xff\x95\x5f\x4e\xeb\xf2\x7c\x31\x35\x98\xf1\x05\xaa\x40\xa6\xa9\x2d\xd1\x6c\x0d\xc2\xfc\xc5\x14\x72\x1a\x7f\x2e\x49\x81\x5a\xce\xee\xae\xe5\xa7\xf3\x46\xe3\x9c\xdc\x39\x90\xaf\x1b\x18\x86\xdc\x59\x4b\x3e\x5c\xda\x8b\x25\xa4\xdf\x5d\xd7\x6a\xf2\x0a\xa9\x30\xa6\x18\x2f\x5a\xf1\x64\x57\xc0\x18\xf2\xcd\x46\x6f\x80\x0a\x79\x80\xc0\xd5\x67\xf8\xb9\x29\xff\x04\x38\xa3\xa2\x38\xc1\xa2\xd1\x19\xab\x23\xef\xbc\xec\x96\xd3\xf1\xf9\xa2\x4c\xb1\xa1\x89\xf6\xca\x03\x30\x6f\x06\x1a\xb3\x5f\xae\x94\x59\xa5\xa6\xf1\xed\x64\xb8\x4c\x4d\x3e\xfb\x5a\xfd\x74\x73\x74\x72\x71\x3a\xc6\x1d\x04\x1f\x9d\x49\x12\x07\x74\x71\x3b\x28\xd6\xc6\xc8\xf9\x94\xdf\x46\x5e\x93\x6f\x4c\x28\xc1\x5a\xe9\xa5\x7c\xe5\x45\x7b\x08\x53\xe5\xf3\x63\x95\x50\x19\x99\x8e\x61\xa1\xbb\x30\xe7\x6a\xf9\x42\xa3\xd8\x4a\x25\x8c\x26\x36\x79\xb4\x1e\xa6\x93\xf0\x5e\x25\x5a\x65\xe1\x80\x4b\x64\x03\xa7\x21\x48\xd7\x8e\x4c\x03\xc0\x9a\xc5\x03\xaf\x4f\x98\xb5\xbb\x2f\x49\x63\x33\x61\x06\xdd\xf1\xe9\x47\xb9\x59\x7c\x90\x25\x50\xf9\xab\x63\x81\xa4\x81\xab\xfc\x2b\xef\x1e\x3d\x9e\xfd\x8a\xa5\x89\xeb\xa8\x3a\x96\xcc\xe2\x6e\x3d\x6c\xfa\xb8\x81\x24\x0a\x92\x81\xd6\xff\x1e\xf8\x69\x27\xab\xba\x27\x47\xfb\x87\xc0\xa8\xc4\xfa\x3e\xaf\x85\x51\x81\x35\xa2\x3f\xe3\x5b\xc3\x24\xc5\xb6\xdb\x53\x2e\xeb\x6a\xb8\x45\x28\x1e\xa5\xb8\x47\xbe\xe6\xc7\x57\x68\xda\xbb\x5c\x75\x57\xbf\xf4\x87\x39\x47\x4c\x15\xae\x65\xf6\xb9\xf8\x63\x32\xc3\x92\x9c\xe9\x77\xe1\x32\xf6\x57\x23\x50\x77\x06\xad\xc4\x90\xda\x6a\x24\xe0\x3f\xaf\x22\x28\x41\x28\xde\x6a\xc4\xdc\xff\xa8\xea\xb7\x69\x77\x74\x9a\xcc\xd9\xcf\x29\xc8\x8c\xf0\x5a\x03\x66\xf3\x9d\x59\x08\x15\xa4\x29\xd6\xbd\xb0\x0c\xe7\x60\x68\xb7\x37\x1d\x68\xc4\x7b\xb5\x81\x87\x82\x1f\x7f\x9b\xeb\x2d\x28\x80\x0c\xed\xb1\xbe\xe5\x6d\x7b\x1d\xc4\xae\x4a\x47\x1a\xab\x09\x2a\x6f\xc4\xa5\x36\x2d\x2d\x7b\x0c\x82\x40\xa1\xbf\x25\x47\x00\xe6\x1e\x1a\x97\xad\x0e\xcd\x78\x28\x04\x51\x82\x2b\xf3\xbf\x79\xf9\x33\x9f\x17\xc0\xa6\x10\x48\x4e\x4d\x0f\xb7\xce\xb5\xc6\x7d\xf2\xa1\xaa\xe7\x36\x12\x08\x83\x24\x0b\xbc\xa8\x4b\x2f\x07\x4b\x21\x04\x92\x19\x89\xf2\xd3\x29\xef\x5e\x91\xdf\x66\x2c\x23\x28\x44\x9c\x63\xe7\x5f\x5c\xae\x68\x95\xd4\x9d\xc6\x9d\x22\x0e\x55\x6a\x1d\x72\x9e\xf3\xf2\xdf\xfc\x5b\x5e\x5a\x9d\xb3\x41\xfa\x0f\x71\x08\xd4\x2a\xeb\x20\x4a\x7b\x0a\x9a\x86\x38\x09\xf1\xd6\x68\x90\xaf\xb6\x93\x71\x77\x9d\xd4\x95\xdd\x43\x82\x18\x42\xa4\xff\xd6\xc3\x76\xd7\xe8\x27\x27\x2c\x44\x48\xc9\xdd\xcb\x61\xf7\xb2\xd8\xee\x17\xae\x6b\x06\x69\x14\x63\x81\x0b\x59\x35\xbd\xcc\xc6\xd8\x28\x92\x02\xe1\xa0\x9c\x98\xe4\xa1\xfb\x9f\x6e\x57\x77\x6a\xab\x4b\x7e\x3a\xf3\xfc\x58\x8e\xb0\x0b\xf6\x83\x94\x10\xcc\x5d\x96\xbb\xe5\x96\xd7\x60\x45\xb1\xc7\x13\x0c\x7f\x02\x33\xa5\xd5\xd5\x76\xf5\xb4\x79\x3e\xbc\x6c\x37\xcb\xd5\x6e\xb7\x71\xc4\x4f\x60\x61\x88\x0a\x02\xba\xaa\x25\x8c\xca\xbe\x5e\xa9\xc5\x0d\xcd\x08\x4f\xe2\x9b\x98\xdc\x1f\x85\x30\x30\xc9\xdd\x4f\x5e\x1b\xff\xdf\x4f\xa7\x21\x64\x3a\x46\xe4\x4d\x59\x75\xef\x56\x33\x69\x04\x01\x8f\x15\x22\x56\xba\xc8\xad\xe4\x27\x67\x1d\xee\x62\x56\xe0\x49\x82\xdf\xb7\xcc\xdf\xf3\xff\xb8\x8b\xe0\x2c\x20\x56\x4a\xe2\x99\x9f\x4c\x86\x36\x27\xf7\xd8\x8d\x34\x92\xe2\x79\x83\xa9\xa2\xb3\xf8\xfd\x6f\xdf\x81\x03\xce\x79\xe0\xb7\xb0\x85\x73\x66\x79\xa8\xea\xe1\xab\x2d\x22\x86\xf6\x78\x4d\x0b\x67\x8c\x3b\x30\x0d\xf1\x47\x65\x8c\x30\xc6\xb2\x2a\xad\x74\x5c\x97\xf2\x7b\xb9\x23\xff\xc6\x45\x7d\x4f\x8a\x4d\x9c\x7d\x9c\xdd\x2d\x05\xc9\x42\x23\x66\x88\xc4\x3b\xe0\xa7\x11\x8f\x0b\x14\x17\xd8\x82\xb3\x13\xc7\x8b\xf5\x0f\xdf\x1a\x20\x1c\xb9\x0f\xf5\x0d\x94\x0f\x80\x19\x99\xbc\xff\x5c\x72\xf9\x76\x77\xb9\xbe\xf0\x69\x43\x19\x40\x85\x9a\x8e\x38\x2c\x2f\x7e\x03\x03\x2d\xb5\x8c\xfa\xb2\xe8\xb5\xba\xb4\x43\x4b\x46\xaa\x83\x38\x71\x22\xb4\xdf\xeb\x7c\xbe\xf0\xa7\x03\xce\xf0\x01\xba\x05\xbd\xf5\xfb\xf0\x0d\xa3\x48\x87\x61\x18\x0e\xf8\xdc\xf9\x7f\xa1\x0b\x5d\x6e\xf4\x4d\x74\xc8\x22\xec\x92\xe7\x65\x03\xf5\xb0\xc8\x3e\x1d\x27\x13\x5c\x6b\xbb\xd0\x00\x8b\xe7\x1f\x55\xa0\x66\x57\x4a\x1d\xc5\x52\x38\x59\x28\x5e\x14\xbb\x96\x4f\xbc\x05\xa9\x8e\xd3\x84\xd9\xf0\x6e\xf1\x9f\x0b\xaf\xf3\xcb\x69\x72\x0d\x49\x10\xe3\x02\xa6\xe0\x03\xb7\x7b\xe6\x07\x2a\x54\x5e\x77\x30\xd2\xbb\x6b\x8b\xf6\xf3\xee\x75\xd0\x49\x62\x40\x42\x5b\x90\x90\xbf\x83\x7a\xdc\x2f\x3f\x6d\x18\xeb\x84\x12\x6a\xb5\x6b\xbb\x7d\xcd\xaf\x22\x3a\x25\x21\x96\x4f\x70\x83\x36\x4f\xd6\x2c\xba\xff\xfc\xd7\xc0\x2c\x68\xf2\x5f\xee\xb3\x94\xa1\xd2\x83\x95\x1a\xa8\xe4\xac\x83\x93\x1d\x4c\x40\x61\xca\xf6\x6a\x1e\xe3\x9e\xff\x72\x97\x90\x41\x82\x25\x91\xa6\xad\xa6\xc2\x51\x9a\x27\x09\xee\x84\x17\x2c\x29\x2f\x79\xf3\x7a\x2e\x40\x1d\x27\xeb\x89\xe6\x84\x61\xb0\x61\xf8\x54\x0f\x55\x1d\x25\x98\x8a\x7c\x6e\x66\x45\x35\xa7\x19\x2e\xe4\xde\x6b\x36\xb5\xbe\x49\xa9\xf5\x9a\x4d\xdd\x40\x69\x14\x81\xac\x55\xec\x03\x32\xf1\x50\x8d\xe7\x05\xea\xa7\xbc\xf0\x6b\x86\xe6\x20\x41\x0e\x3a\x7a\xeb\xb2\xb9\xa0\x60\x24\x94\x28\xd3\xd3\xf4\x38\x24\xfb\x09\x91\x9a\x06\x35\xfc\xca\x47\xfe\x2c\x54\x0b\x9a\x48\xd3\xf6\x46\x19\xbe\xc9\x0b\x27\x00\x8c\xce\x9a\xc1\xc8\xa2\x28\xb0\xca\xa1\xc1\xa2\xbf\xba\xbb\xbb\x9f\xee\x79\x5a\x26\x02\x9d\x6d\xeb\x5c\xf2\x5a\xe5\xbc\xfc\xbd\xba\xc8\x41\x3a\xf5\x09\x54\xf5\x6f\x37\xfa\x0f\xee\x65\x95\x0a\xb2\x9e\xb9\x3b\xac\x8a\x7e\x70\xd3\xa5\x4e\x91\x30\x86\xf1\x4b\xb5\x85\x66\x26\x22\xb7\x43\x55\xc6\x43\xab\x27\xbf\x3a\x9d\x8b\xea\x0a\x1f\xb0\xd8\xb4\x92\xc6\x60\x58\x5c\xae\x0f\x75\x75\xfa\x9d\x5f\x8a\x3f\x11\xe5\xd2\x0a\x32\x9c\x8e\xbe\x84\xd7\x47\x74\xe3\x79\xab\x03\x93\x3f\x09\xc4\x91\x79\x73\x31\x9f\xa9\x6a\xcd\xb2\x20\x1c\x81\x44\x4b\x98\x25\xaf\xb0\x20\x60\x81\xea\xe3\xa8\x2e\x27\x9f\xf2\xd4\x07\x6f\x00\x0b\x42\x12\x60\xd5\xa0\x32\x76\x85\xa3\x53\x85\x54\x08\xbb\x62\x7f\xdd\x3f\x2e\x77\x16\x9e\x81\x09\xc3\x4c\x95\x82\x05\x21\x8f\x51\xdb\xae\xcd\x0b\x27\xb5\xd9\x73\x5b\xe7\x32\x33\x16\x44\x91\x42\xac\xee\xcb\xe3\xe2\x58\x03\x18\xcc\xc7\x5c\x0d\x8b\x05\x51\x62\x56\x58\xf4\xdb\xaa\xab\xee\x67\xe5\x35\xa8\x2f\x55\xa1\x1e\x2a\x53\x82\xfc\x3e\x46\x10\x74\x9f\x51\xa8\xfd\x04\xcf\xd5\xa9\xaf\x5e\xb2\x20\x4a\x8d\x2a\x87\x29\x4d\xd8\xfe\xd5\xf8\xa3\x31\x83\x28\xf5\xf2\x6f\x73\xf5\xed\xf1\xe5\xc5\x82\x06\x9e\xd4\xda\xf2\xbc\x98\x6d\x88\x75\xe3\x24\x56\x1f\x77\x96\xaa\xea\x7d\x07\x07\x45\x35\x16\x24\x84\xa6\x46\x2d\x4b\xe6\x27\x5e\x34\x07\xd4\xcf\x3e\x17\xb9\x5b\xba\x58\x90\xa6\x90\x49\xab\xed\xba\xfa\x85\x54\xb0\xf1\x37\x91\x0c\x70\xc3\x78\x87\x3a\xd7\xd7\x71\xb3\x69\xb6\xc8\xce\x02\x22\x49\x80\x56\xcb\x95\xa8\xda\xb6\xe6\xb8\x92\xf6\x09\x1b\x0b\x68\xa8\x63\x43\xc6\x3c\x57\x25\x94\xdd\xd6\x79\x50\x20\xf9\xbc\xfe\x23\x0b\xa8\xc5\xe1\x73\xa5\xfa\xaa\xad\x3d\xc6\x62\x86\x4a\x1d\x3a\x2f\x71\x03\x9e\x18\x93\xbb\x51\xcc\xd8\xd2\x7d\x81\x76\xf5\xce\x8b\x0b\x6f\x27\x2e\xa5\x6e\x1c\x07\x8c\x2f\xf2\x66\x2d\xab\x91\x92\x2c\x0b\x98\x22\x34\x1c\x56\xf8\x8d\x40\x70\xee\xe2\x0b\x16\x64\x41\x82\x8c\x9a\xe7\xcb\x09\x6a\x9e\xd7\xc6\x5e\xb4\x9c\x31\xd2\x9e\xfc\xc0\x2c\x34\xbe\x93\xdd\x8e\xfb\xbd\xcb\x19\x96\xfc\xa6\x2b\x65\x87\xf2\x44\xe1\x15\x3e\x57\xed\xa5\xb1\xde\x6e\xee\xfb\x45\x18\x21\x34\xa9\xad\x2e\x18\xb0\x96\x6d\xd3\x27\x65\x2c\x10\x94\x63\xaa\x8a\xd5\xf6\x41\x7b\x9f\x05\x42\xc5\xd8\x5f\xe5\x4a\x59\x83\x39\x03\x94\xbf\xaf\xe4\xa5\x3b\xcd\xbe\xda\x41\xa1\x27\x33\x5b\x26\x26\x18\xdc\xbd\xd6\x80\x09\xfe\xf0\x11\xab\x08\x34\x1b\x5a\x8d\x36\x17\xd1\xc8\x3a\xef\x92\x10\x28\x8a\xc9\xe3\x51\x09\xc5\x66\xf0\xf7\xdd\xfd\x6e\xbf\x7a\xc2\xf2\x9d\x3f\x13\x09\x90\x85\xbc\xac\xaf\xe7\xb6\x7a\xad\x4e\x7c\xfc\x45\x22\xc5\xb2\x80\xac\x6a\x18\x1b\x83\xb1\x40\x47\x71\x4f\x20\x71\x5d\x81\x2e\xf6\xf5\x22\x6c\x1f\x12\xd9\x3e\xec\x39\x0e\xdf\x7f\xf7\x35\x2a\xc3\x6c\x1e\x45\xb1\xbb\x5b\x55\xaa\x7b\x87\x71\x62\x61\x10\x11\x13\x4f\xf1\x16\x56\xb2\xda\x1a\xf1\x19\xe2\x0f\x53\xe3\xd3\x8f\x60\xd6\x2e\x1c\xfb\x6b\x06\x17\x2c\x0c\x93\x80\xdb\xa5\xc2\xf8\x80\x78\x19\x80\xf1\xcd\x0d\x43\x9d\xa2\x0e\xae\x74\xa5\x4b\xcf\x10\x64\x61\x94\x82\xe8\x19\x87\xee\xfe\x0d\xd5\xb7\xdc\xc8\x24\x08\x5d\xc5\xdb\xf7\x09\x1c\xe0\xca\x0d\x09\x35\x96\x42\x8b\xea\xf8\xbd\x9b\x15\x73\xef\x6f\x98\x24\x32\x89\xa6\xda\xe3\x4d\x2f\x51\xca\xc2\x84\xf2\xa8\xef\xdd\x3e\xe5\xe5\x40\xb9\xd2\x0d\x91\x19\x16\xd2\x2c\x39\xa9\x37\x05\x9b\x04\x13\x2c\x4c\x05\x41\x2e\xdc\x0e\xca\x21\x6b\x9f\x85\x84\x85\xb8\x78\x0f\xa4\x75\x22\x7f\x8c\xa7\xa6\x72\xc8\xdf\xe0\xa1\xe8\x25\x8f\x59\x48\x34\xc5\x19\xbe\x68\x9a\x4a\xe6\xfc\x33\xa3\x07\xfb\x89\x6e\xad\xeb\xbe\xa7\x5b\x75\x60\xa3\xb1\x58\x3f\x7d\x42\x94\x10\x4c\x92\x17\xc7\x3a\x5f\xbe\xf2\xbc\xbc\xe7\x2d\x9f\xbc\xcc\x21\xcd\xb8\xf0\x2e\xe8\xfc\x26\x1a\x1a\xbd\x1b\x59\x48\x51\x18\xcf\x21\xc6\xfc\x2f\xcb\x28\x4f\xc4\xa8\x26\x9a\x83\x5a\xe8\x16\xea\xe1\x13\xe0\x44\xa6\xcc\xa5\x79\x5b\x44\xd2\xae\xf5\x33\x74\x8b\x21\x9f\x38\x98\xb0\x50\xc4\xa6\x20\x78\x50\xa8\xc2\x30\xbd\x6c\x11\x4b\x8c\x1b\x97\xdd\xbb\xd2\x27\x63\x2c\x14\x69\x6c\x62\x0c\xe7\x73\xdb\xdc\x76\x6b\x7c\xa9\x88\x85\x82\x07\xd8\x7c\xf2\x1e\xb7\x53\xa4\x1f\x0b\x9d\x99\x75\xe3\x2c\x12\xda\x71\xab\xc9\xce\xa2\xd1\x66\x15\xca\x48\x1b\x89\x6c\x18\xfa\xb1\xba\x8b\x94\x3c\x8c\x8c\x1d\x47\xd9\x5c\x4e\x60\x84\xa9\x66\x83\x3b\x16\x4a\x1d\x25\xb2\x97\x28\x9d\x5f\xbf\x43\x95\xc6\x86\xf1\x56\xbb\x75\x39\x54\x44\x12\xdd\xcb\xe4\xfc\xe1\x9f\x96\x52\x21\x0b\xad\x6d\xe4\xc8\x13\x9c\x85\x10\x70\x14\xe6\xfb\x91\x8f\x5f\x40\x36\xf9\x3a\x08\xa5\x1c\x22\x72\x9c\xcd\xa7\x3f\x4f\x16\x63\x71\xb4\xb9\x9c\x4e\x2f\x83\x8a\xb1\x3b\x2c\x85\xfd\x4d\x26\x85\x1b\xf2\x73\x59\xa8\x83\x30\x45\x5d\x81\xfc\x6c\xfb\x57\xfe\x40\x24\xc8\xd4\x83\x6a\x36\x58\x08\x75\x9c\x6a\xdb\x26\x7a\xe4\x56\xdf\x71\xad\x26\x4f\x56\x2b\x13\x69\x75\x1b\xcd\x92\x97\xca\x6d\x5c\x51\x10\x9b\xa0\x17\x4e\xb9\x2f\x47\x7f\x6e\x98\xc9\xa2\x80\xc7\xc8\x18\x7c\x87\xb6\x1a\xe4\x92\x37\x8f\x2a\x0a\x24\x24\x0e\x05\x7a\xbb\xae\x46\x51\x6c\x42\xc9\xe6\x95\xc7\xb2\xa8\x4a\x18\x80\x61\x58\x14\x51\x12\x86\xae\x99\xc8\x8b\xbc\xc1\xdb\x7e\x00\xad\x01\x61\xe6\x93\x93\xc5\xcc\x28\x53\xb9\x34\xc3\x59\x83\x59\x1a\xe7\xf8\x17\xc4\x22\x13\x66\x9f\x5f\xe3\x39\x10\xaa\x3b\x39\x9f\xe2\x18\x83\xfd\xfe\xed\x6e\xb8\xec\x45\xb1\xe6\xc6\x89\xb4\x4b\xc7\xee\x6b\x7e\x44\x9b\x91\x41\xe0\x3a\x0c\x87\xa2\x44\x64\x98\xda\x9d\x2a\xdd\xf2\xb7\xd1\x89\x28\x31\xa8\xdf\x1a\x34\xd4\xbc\xb8\x65\xc5\xb2\x88\x8a\x18\x8c\x63\x68\x97\x66\xbe\x54\xcd\xcd\x00\x4d\xd1\xeb\xba\xb6\xc9\xc5\xb8\x24\x3b\x79\x1a\x98\xc0\xfc\x9f\xff\xef\xff\x7c\xbd\xc7\xeb\xc8\xb2\xf9\x64\x20\x62\x99\xb1\x7e\x2e\xaa\xc6\x87\xb9\x11\xe3\x11\x6e\x4d\xdd\x82\x78\x1d\xfd\x8e\x2c\x20\x38\x7c\xbd\xc3\xd0\x7e\x7c\xae\x2c\x36\xc4\x83\x22\x7f\x9b\xde\xe0\x2c\xe1\x28\x27\x81\x6c\xe4\x70\xe5\xbd\x3b\x59\x94\x51\x85\xb1\xa6\x02\xdd\xe5\x77\x8f\xa8\x0a\x7b\x7f\xa9\x87\xf3\x2e\xca\xb2\x24\xb5\xd6\x7e\x2f\x75\x75\x86\xda\xe2\x10\xc2\xe9\x4b\x98\x71\xd3\x6d\x7d\x5a\x3f\x1f\xbe\xac\xf6\x56\x5c\xf5\xf0\xb0\x7e\x7e\x5e\xfd\xe1\xcf\xa6\x98\x25\x98\x1a\x65\xbb\xe3\x30\x03\xb2\x63\x38\x55\xb8\x81\x9b\x56\xc7\xa2\x6c\x7e\xc2\xbc\x5a\x39\x8b\x38\x8f\x91\xb9\x69\xbd\x94\x06\xde\x96\x6e\x5f\x8d\x04\x95\xc2\xf2\x11\x7f\x5d\x77\xd0\x2e\xab\x2e\x51\xee\x9b\x76\xb3\x79\x65\x24\x40\xe3\x72\xda\xed\x28\x23\x26\x30\x8b\x24\x01\xea\x77\x26\x9f\x2e\x0d\x0f\x23\x42\xa2\x8b\x90\xd1\xe2\xea\x73\x1b\x70\x7f\x9d\x52\x26\x54\xf7\x6e\x67\x98\xb6\x4f\x5e\xb3\xd9\x75\x29\x52\x94\x62\x2d\xea\xe1\xeb\x72\xb2\xa5\x45\x4a\x50\xd4\x30\xbc\xe3\xed\x89\xdf\x84\x6a\xc3\x8d\x38\x02\x95\x04\xd2\xb6\x1d\x2e\x65\xde\x5e\x87\x85\xf4\x59\x77\x16\x16\x69\xaa\x30\x22\x44\x57\x8b\xd7\xba\xfa\xd9\x6c\xc1\xf8\x63\xe2\x3c\xfa\x58\xef\x91\xc5\x41\x94\x19\xa5\xad\x6e\x76\x8b\x19\x9a\x04\x8b\x83\x98\x60\x4e\x88\x05\xf9\x83\x17\x7a\x64\x71\x40\x55\x10\xf8\x7e\xbd\xef\x12\x8c\xae\x2d\x0e\x53\x8a\xd1\xdb\x89\xff\x1a\x96\x7e\x59\x1c\x32\x96\xd8\x1e\xbb\xe1\x37\xcd\x44\xa2\x71\x24\x12\x16\xd9\xc8\xae\x84\x62\x59\x95\x3a\x3f\xba\x89\x31\xdc\x59\xe2\x48\x2b\xab\xc4\x89\x40\x53\x3e\x09\x00\xe3\x58\x08\x14\x9d\x7c\x78\xfc\x76\xff\x50\xd5\x5f\xb8\xbf\x90\x58\xca\xd0\x76\xd9\x9f\xf9\x09\x9a\x33\x97\xd3\xcb\x48\x82\x40\x3b\xd2\xdd\x45\x1d\xa1\xdd\x68\xd7\xe7\x18\xa7\x38\x71\x92\x50\x8c\x51\x44\x0d\xfc\x0d\x59\x64\xee\x00\x67\x46\xaa\xbb\xe0\xf9\xc9\x95\x58\x58\x9c\x00\xc3\x6c\xfa\xa1\x80\x5f\x83\x4a\x41\x9c\x06\x1a\x81\xb3\xe7\xba\xc2\x4f\x58\xbb\xce\xa1\x79\x2a\x8b\x53\x16\x60\xdc\x9b\x37\xbe\xe9\xff\x60\x93\x5a\xff\x05\x29\x33\x22\x88\x8f\xd5\xf1\x7f\x2e\x50\x5f\x1f\x00\x76\xb7\xba\xee\x6e\xb0\x52\x91\xb5\x87\xff\xb6\x3a\x74\x0b\xc8\xe2\x8b\x4b\xab\x62\xca\x45\x9a\xf5\x8a\x6a\x36\x7e\xbe\xe9\x44\xd9\xd1\x2c\x30\x7d\xd2\xbb\xe5\x5f\x82\x2f\xb3\x98\x51\x8e\xf9\x1f\x52\x05\x26\x48\xd7\xc9\x65\x66\x69\xea\x5e\x9d\x3b\xde\xe4\x72\xd9\x2d\x5e\x58\xd5\x78\x81\x3a\x0e\x7a\x3f\x61\x16\x67\x40\x50\x6a\x0b\x85\x1e\xa2\x8f\x0b\xb9\x2c\x16\x11\x47\x6f\x93\x97\x6e\xc5\xff\x83\x97\x6f\x80\x8a\xbc\x9f\x4d\xd6\x58\xf0\x10\x05\x14\x50\x7d\xb9\x5b\x2d\xbe\x54\xbc\xd8\x02\x97\xaf\x36\xf0\x71\x4f\x4a\x06\x42\xd8\xc0\xc0\x15\xfc\x70\x36\xdc\x5a\xa8\x4c\x17\x97\x1b\xe6\x0f\x8b\x65\x64\x5c\x2c\x1b\xa3\xa2\x1e\xcd\xaf\xc9\xb1\x4c\x4c\x22\xd3\x8d\xf9\x01\xf0\xb6\x29\xfd\xac\x97\x94\x99\x05\x03\x2d\x70\x7a\x45\x21\xd4\x63\xf0\x83\xc0\xd8\xbe\xf5\x26\xb5\x8b\x22\xe7\x1f\x94\xc9\x62\xa9\x6d\x6c\x83\x7a\xa2\x6d\x5b\xc0\x27\x3c\x0c\x16\xab\x50\xe2\x73\x71\x2b\x94\x7c\xe5\xf5\x71\x20\x4a\xce\x62\x95\xb2\xcc\xe9\x0a\x3e\xfe\x3e\x06\xd3\xb1\x58\x81\x42\x20\x9a\xb7\xf8\xee\x36\x4d\xfc\xf8\xf8\xb2\x94\x06\xdc\x35\x97\x55\x29\x8b\x8b\x82\xe5\x2b\x2f\x0a\x28\x8f\x30\x5b\x97\x8c\x21\x88\x4d\xfd\xcb\x95\x4c\x0d\x12\xfd\x21\xff\x65\x08\x84\x87\x0f\x7e\x0e\xc4\x89\x30\x64\xdb\x5f\x0f\xe0\xf7\xa0\x18\xb2\x88\xcb\x5e\xf3\xb7\x99\xba\x9d\xb1\x58\x13\x16\x19\x39\xa4\x63\x8e\x95\xe2\xbc\xbc\x54\x97\x66\x10\x51\x27\x41\x60\xb4\x66\xb0\xf5\x7f\x67\x1c\xe9\x66\xf8\x09\x2c\x09\x64\x88\xe2\x5b\xbb\x2e\xd1\x2c\x9e\xab\xd6\x9f\x22\x0a\x05\x96\xc3\x5e\x0a\x3e\x8a\x65\x92\x28\x0a\xc1\xc1\x71\xee\xf2\xe3\xa6\xde\x9d\x78\x31\xef\xe7\xce\x92\x28\x4d\xb0\xb5\xfc\x7d\x77\x7f\x6f\xeb\x83\xfe\x3c\x59\x8a\x0e\x7c\xc6\xd3\xad\xaa\x3d\x37\xe2\xb3\x52\x35\x4b\x62\x92\x21\x29\xbb\x0b\x28\x1b\xab\x3a\xef\x0f\x49\x9e\x3a\x94\x54\x5e\xba\xe5\xd6\x86\x9e\x7d\x9a\x97\x24\xb1\x29\x80\xbe\xf0\xeb\x31\x2f\xe1\x2b\x6f\x8c\xb8\xdf\x84\x0c\xc7\x92\x44\x1a\xb9\x60\x97\x62\x98\xf7\x73\x5f\x39\x69\x8a\xdf\xfc\x38\x81\xf8\x2e\xc1\x5b\xde\xf2\x5e\xaa\x8d\x25\x89\x0a\x32\x6b\xdb\xdc\xe5\x14\x68\x59\x3b\xf9\x92\x34\x0c\x52\xe9\x8c\xcd\xeb\x1c\xb0\x4e\xb1\xc2\x02\xf6\xc2\x85\x03\x09\x01\x03\x3c\xec\xae\x62\xe8\x5c\xc7\x12\xa2\x43\x44\x5a\xdb\xca\x8b\xb3\xf5\x1a\x7f\x07\xd1\x59\x46\x1d\x5c\xc3\x45\x06\x03\xd8\x10\x4b\x68\xe2\x75\x09\xbf\x5e\x45\x9d\xab\xfc\xbf\x86\xb0\x7c\x29\x8a\x5b\xb4\x2d\x4b\x28\x15\xce\xc0\xfc\xee\x72\x7d\xe2\x33\x70\x39\x96\x50\x69\xd8\x51\x77\x8b\x7f\xac\xdd\x17\xb1\xd0\xf8\xcd\x15\xdd\xec\xed\xbd\xf8\x46\xcc\x63\x96\xb0\x8c\x44\xc4\x15\x9e\xaa\x5f\x9f\xdb\x21\xb3\x84\x71\xc1\xa3\x09\xea\xd0\x40\x9f\x66\xd6\xc4\xe9\xea\x98\x64\x20\x99\x31\xc7\xe1\xa5\x35\x19\x74\x0b\xdc\xad\x8f\x23\x4b\x78\x62\x84\x78\xb8\x52\xaa\x6a\xe5\x6b\x5b\x55\x5a\xc3\xcd\x8b\x6b\x47\x8b\x34\x16\x96\xdb\xb5\x46\xa9\xd7\xff\x55\xbf\x95\x25\x82\x64\x28\xd4\xd8\xad\x66\xc6\x77\x7b\x26\x05\x4f\x64\xa6\x52\xe9\x8b\x55\x9e\xc3\x7c\x2b\x30\x67\xc7\xab\xc8\x14\x7a\xf2\xd2\x79\x1a\x8f\xdf\x2a\x95\x05\xb2\x4f\xe1\xf2\x06\xa9\x47\x43\x22\x58\x37\x24\xc2\x82\xd2\xa1\xdb\x53\x51\x70\xc0\x48\xd0\xdf\xac\x58\x89\xa6\x41\x9a\x78\xbe\xf4\xd3\x75\x2d\xab\x01\xbb\xcb\x0d\x62\x11\xda\xbb\x74\x59\xf6\x5d\xb7\xb4\xd9\x03\x69\x10\x27\xf8\x6c\x8d\x76\xd1\x7e\xa4\x4b\x3b\xc9\xce\x3e\xac\xac\x1a\x77\xf8\xe1\x2b\x93\x06\x24\x44\x64\x89\x81\x15\x2e\x46\x05\xfd\x61\x7e\x9a\x06\x2c\x43\x90\x33\x96\x3e\x47\xae\xec\x2c\x0d\x38\x33\x8b\x61\xb7\x48\x4e\xeb\x82\x69\x00\x09\x7a\x08\x4e\x25\xf8\x56\xbc\x2e\xae\x7b\xa8\x4f\x39\x32\xde\xa7\x42\x7c\xdd\x07\xb5\xc3\xbf\x6d\xe1\x98\x57\xe5\xde\x1a\x8a\x85\x93\x4b\xd3\x31\x77\xfe\x08\x06\xbe\x9b\x57\xe5\x1a\xf9\xd3\xde\xaf\xc0\xff\xe0\x90\x05\xb8\xff\x2d\xbf\x2e\xb6\xeb\xfd\x1f\xbb\xd5\x62\xb9\x71\xb2\xd2\xdd\xd1\x78\x64\x41\xe9\x61\x31\x5d\x02\xf1\xb5\xfa\x39\xef\x51\xe8\x3f\x2c\x20\xe8\x73\xec\xad\x29\x4e\x8d\xe6\xce\x44\x06\xda\x7f\x50\x49\x07\xd4\xe8\xbe\xc8\xe8\xd9\xd8\x83\x51\x6c\xb4\x9d\x4e\x79\xb9\xda\x7f\xed\x5f\x88\x38\x8d\xc1\x38\x19\x9d\xf2\xf2\xd0\x40\xdb\x33\x0f\x6e\x08\x16\x2c\x8d\x49\xaa\x52\x87\x50\x12\x45\x5f\x81\x4c\xe3\x2c\x42\x80\xeb\xae\x8b\x4e\x51\x57\xde\x6a\x5d\x0c\x3f\x9d\xc5\x28\x45\xec\xd2\x28\xcf\x5c\xf6\x27\x91\x26\x89\xc0\x89\xf2\xad\x94\x8b\x5a\xe4\x6d\xcd\x8f\x70\x63\xd1\xd8\x8d\x05\x6c\x3a\xff\xbb\xca\xcb\x61\xc2\x3b\xb9\x9b\x89\x0a\x11\xf3\x60\x85\x7d\x7f\xe4\x13\x25\xbd\x6e\x84\x46\x6e\x22\x42\x28\x3f\xaf\x0d\xa7\x09\x00\xd6\x1e\xb4\xcc\x27\x5b\x70\x9a\x06\xa1\x62\xde\x9b\x6f\x64\x4a\xc6\xba\x78\x99\x09\xa7\xf1\x28\xe1\x8e\x37\xd8\x7d\x9c\xb4\xee\xd2\x94\x03\x86\x1a\x87\x11\xb8\x75\x7c\xb9\x24\x54\xb8\x67\x4b\xde\xbc\xde\x71\xf9\xf6\x50\x57\x27\xcb\x2d\x9d\x5f\x9e\x52\x92\x46\x26\x13\xbf\x14\x9e\x4d\x72\x19\xb0\x47\x58\xca\x02\x93\xc0\xee\x2e\xf5\x3b\xdc\x6a\xae\x8c\xcd\x8c\xfc\x8c\xe4\x32\x45\xeb\x08\xd4\x5b\xdb\x41\xbb\xb8\xa8\x7c\x2a\x11\xc1\x52\x11\x11\xb3\xf8\x19\x39\x50\x04\x6c\xce\x06\x71\xa9\xe4\x06\xdf\x28\xf2\xb6\xdb\xf5\x4d\xef\xb3\xc9\x8f\x87\x77\xec\xba\xdb\x51\x4a\x6a\x5c\x29\x77\xd6\x4c\x64\x68\x10\xfa\x89\x2a\x3a\x4b\x15\x30\xf0\x75\xfd\x75\xf9\x7d\x77\xef\x4e\x09\x81\x50\x36\xae\x18\xf7\x72\xe6\x4f\x04\xb1\x42\x61\x98\xc7\xaa\x3c\x2e\x8b\xaa\xf9\x80\x91\xc8\x52\xd0\x32\x0d\x06\x30\x90\x9b\xf3\x8e\xd7\x14\x1d\x0b\xd4\x4a\xd9\x6f\x76\xb6\xb0\x6b\xb1\x49\x93\x72\x46\xaa\x63\x2d\x6c\xe2\x6f\xa5\xb6\xfe\x0b\xb3\xd8\x45\x46\xc2\x24\x42\xad\x3a\x6c\xf4\x1b\xab\x91\xd9\x7e\x2b\x09\x65\x82\x72\x35\x2e\xf2\x1e\xe9\x73\x31\x12\x82\xb1\xa7\x3b\xe5\xa5\xd9\x6d\x06\x0a\x0b\x8c\x84\xda\x08\x3e\x7f\xe5\x45\x7b\x13\x21\x92\x28\x35\xc2\x74\x5d\xa6\x71\x9f\x37\xe7\x4b\x0b\x6a\x5d\xbe\xf3\x22\x57\xbb\x6e\x9a\x94\x12\x7e\xd4\x55\x79\xfc\x51\xe7\x2d\x0c\xa0\x70\x8c\xc4\x41\x8a\x3c\x67\x94\x58\x7a\xa8\xea\x11\x9d\x9e\x91\x38\x0c\x8c\x68\xd1\xaf\xf3\xa7\xb8\x41\x46\x62\x1e\x3a\xb1\x85\x3e\x3c\x5a\xfe\xf0\x27\x52\x46\x38\xbb\x86\x33\x32\xa7\x9c\xc3\xfa\x9f\x04\x17\xee\xd3\xda\x88\x66\x72\xf9\x56\x56\x3f\x11\x47\x64\xd6\x92\xf1\xb0\x24\x24\x06\x8d\xda\x1a\x8a\x4a\x0d\xbf\xcd\xe4\xb4\x24\x89\x13\xd0\x2e\xdd\x30\xad\x9c\x89\xe1\xfb\xe4\xeb\x13\x6d\x4a\xf7\x30\x91\xc4\x1b\xcf\x71\x92\x68\x53\x5b\xc0\xb5\xf5\xa6\x15\x43\x48\x4a\x2c\x18\xa5\xbc\x34\xb6\x96\x3d\x8a\x62\x08\x51\x71\x60\xd1\xb4\xbd\x66\xde\xf2\x06\xd3\xcb\x08\x0d\x42\xdc\xc0\x4c\x30\x60\xdb\x71\xc3\x6b\x0f\xfd\xc8\x48\x41\xe6\x03\xad\xad\x11\x82\x9d\xbe\x99\x34\x4b\x5d\x7d\xc8\x60\x9c\xaa\xfa\xe4\x59\xa6\x6e\xf2\x10\x0a\xd2\x85\xd0\x5d\x84\x3d\xe5\x37\x32\xc2\x52\xc1\x43\x6f\x3b\xb8\xd1\x3e\x83\x70\x2b\x38\x61\x99\x71\xf6\x3f\x74\x51\x53\x17\xf0\x6e\x79\x77\x17\xbe\xe4\xef\x7f\x02\x0f\x67\x84\x89\x34\xed\x79\xf1\x5b\x14\x29\xc7\xd7\xb9\xfe\x90\x20\x3f\x9a\xfb\x84\x49\x85\x44\xc1\x27\x5e\x7e\x2f\xf3\x16\xd4\x6e\xe9\x2e\x2b\xcb\x12\x47\x4f\x75\x85\xe7\x65\x55\x54\x96\x89\xe0\xef\x65\xa6\x92\x54\x0f\xd0\xfb\xb6\x6f\x79\xd3\xa0\xeb\xfe\x1d\x53\x21\x19\xe1\xb1\xc0\xed\xe9\xc7\x6e\x6d\x57\x9e\xd5\x7f\x2e\x79\x7b\x1d\xd0\x14\x18\xe1\x99\x40\xe8\xa4\x05\x84\xf1\xf2\x63\x90\xc4\xf4\xf4\x5a\x41\x30\xb6\x14\x1f\x15\x0f\x89\xe0\x11\x19\xf8\xd2\x61\xf6\xf3\x50\xd5\x5d\xe8\x73\xdd\x94\x4e\xae\xca\x5d\x88\xd0\x11\xe6\xc1\x2d\x7f\x83\xa5\x56\x53\x86\xa4\x1d\x25\x49\x82\xce\x71\xb9\x47\xc6\x39\xa0\xf3\x64\x1c\xa3\x46\xf2\xf6\x52\xca\x43\x40\x29\x73\x5f\x23\x75\x80\x9d\xd7\x7d\x5e\x5e\xc7\x69\xd3\xf8\xd9\xab\x28\x91\x7c\x4e\x0a\xee\x86\x62\xc1\x88\x62\x04\xb8\xaf\x99\x3b\x58\x97\x4b\x30\x9e\xf8\xf9\xec\xb1\xc4\x8c\x28\x6e\x2c\x62\xba\xed\xa3\x35\xe8\x8f\xc9\x37\x03\xc7\x76\x97\x06\x30\x00\x16\xaf\xb5\xc7\x08\xc4\xd6\x69\x0d\x3f\xba\x2e\xdb\x87\x70\xd7\xd6\x0f\xd1\x6f\x3e\x71\x1b\xad\x3a\x3a\x32\x6e\xf4\x4e\xad\x6c\x07\xb2\x2a\xd5\x30\x82\x24\x9a\x10\x94\x7e\xc9\x9b\x3e\x23\x52\x53\xca\xcf\x65\x08\x43\x1e\xbf\xe3\x34\xe0\x8c\x59\x91\xbe\xf2\x72\x7a\xf2\x51\xb8\x3b\x2c\x00\xb1\xbe\x45\x75\x3c\xde\x4c\x5f\x1a\x92\x30\xb1\x77\x79\x0b\xcd\xb9\x2a\x1b\xf8\x3e\x0c\x92\xc6\x5f\x85\x4d\x4a\x5b\x29\x30\xaa\x69\xf3\xa1\xc1\x5c\x55\x91\x46\x3c\xc0\xc9\xdc\x3d\xee\xa7\xdc\x57\xed\x68\xac\x02\x44\x97\x4b\x3e\x61\xa7\x33\xda\xed\xb2\xb6\x5a\xb2\xac\x4e\xb8\x58\x8f\x4e\x99\x06\xc6\x57\xc5\x09\xf3\x3b\x9b\x1a\x77\x38\xf5\x95\xfc\x1d\xd4\xef\xb9\x1c\xe6\x7d\xe3\xd7\x8d\xa6\x24\x40\x78\x82\x55\x54\x73\x8b\xbe\x3b\x4a\x15\xaa\xd9\x3b\xaa\x78\xe3\x0f\x08\x2d\x2c\x63\xcf\xba\xea\x23\x6a\xd4\x1d\x26\xb1\x51\x60\x43\x49\xe1\x8d\x5e\xfc\xe4\x35\x94\x7d\xb3\x87\x12\xa1\x40\x0f\xd4\x8a\xb6\x3c\x6f\x7c\xb1\x88\x12\x19\x51\x6c\xd6\xf5\xc4\xad\xdd\x14\x02\x42\xbb\x57\x32\x1c\x9a\x13\xf4\xa8\x16\x4a\xd3\x08\xeb\x2e\xb9\x1c\x72\x49\x19\xa5\x34\x44\x5c\xc3\xb1\xe6\x65\x6b\x8c\x48\xe6\x83\x5c\x4a\xc1\xd8\xf5\x09\x5e\xbe\x5d\xc6\xe7\xd0\x59\x18\xd8\xca\xe8\xbe\x9a\xe2\xc2\xc7\xb1\x98\xfd\x08\xa3\x01\x4a\x81\xac\x0a\x78\x87\xd2\xfc\xef\xe8\x9c\x2c\x53\xcc\x82\x12\x6d\xa0\xb4\xd1\xa8\xb4\x3e\xbf\x46\x50\xa6\x08\xbe\x8f\xff\xb3\xfe\x3e\x3a\x4f\x46\x8d\xe3\xf5\xd7\xaf\xdb\x07\x6e\xfd\xd7\x3f\xcd\x40\x28\x0f\xb8\xe9\x06\xad\xef\xdc\x49\x78\xa6\x10\xf0\x77\x7e\xe5\x0d\x84\x56\x68\xc0\x54\xd7\x9e\x1c\x1c\x9a\x51\xce\x29\x62\x92\x0f\x28\x1a\xd3\xad\x69\x97\x3a\x1f\xf7\x30\xfd\x54\x14\x41\x84\x4d\xa3\xc5\xfd\xef\xeb\xdd\x66\xbb\x3b\x3c\x6e\x96\xdf\x0e\xf7\x8b\xfd\x44\xec\x9f\x51\x21\x14\xf6\xaf\x9a\x33\xff\x79\xa3\x0c\x38\x79\x44\x32\x48\xad\x0b\x76\xd3\x0e\x25\x60\xba\x23\x00\xa4\xb7\x26\x1c\xa2\x4e\xa8\x0c\x13\x84\x0b\x8a\x5c\x59\x30\xc7\xf8\x0a\x14\x37\x85\xef\x6e\xaa\xbf\xe6\x85\x9a\x75\x9e\x67\x54\x69\x1a\x18\xe9\xa5\x77\x68\xf3\x93\xdf\xf5\x29\x50\x6a\x7a\x08\x3f\xf3\x56\xbe\x5a\xcb\x24\x7f\x90\x07\xa9\x67\xa9\x5b\xfe\xc2\x6e\x50\x5a\xa3\xa0\x18\xc6\xd7\xdb\xfd\x9d\x03\x81\x50\x9d\x84\x42\x4c\x04\x6d\xa6\xe6\xfb\xb7\x85\x33\xaa\x75\x90\xda\x9b\xd0\xe5\xb3\x77\xd7\x97\x6e\x89\x70\x7b\xa5\x0d\xe3\x58\x10\xc6\x18\x4c\x37\x95\x35\xa4\x6c\xf0\x6e\xf9\xc6\x39\x0b\x13\x62\x38\x2e\x88\xbe\xf3\xd6\xe5\x9f\x2c\x78\x2c\xd2\x0c\x73\xf7\xfb\xf5\xb3\x73\x77\x63\x2c\x4e\x0c\x1d\xbd\xdf\x3f\xad\xc0\x61\xef\x3f\xcd\x58\x4c\x42\xec\x32\x61\x29\x60\x00\x48\x62\x71\x16\x70\x03\x61\xcb\x51\x54\xed\x3e\xd7\x28\x7c\xd0\x9a\xf8\xfe\x4f\x9b\x2c\x2c\x56\x21\x0a\x10\x54\x97\xb6\x69\x39\x16\x70\x5f\xd0\x5e\xda\x1e\x4f\xb2\x8c\x67\xae\x9f\x67\x41\x21\xf6\x50\x1a\x64\xd4\x64\xe2\xe7\xaa\x6e\x9f\xf2\xa6\xe9\x72\xa8\xd7\x4b\xf9\x36\x55\xb9\xfc\x6c\xbb\x62\x69\x0c\xb1\x0d\x4a\xd0\x56\x34\x62\xfe\x0b\x12\xa9\x95\x13\x0f\x47\xed\x94\xf1\x3b\xc9\xd2\x2c\x44\x96\x2d\x5a\x7f\xcc\x0b\xb1\x33\x96\x0a\x86\x3d\x7b\xdc\x64\x8b\x29\xb3\x9b\x31\x12\x65\xc8\xeb\x55\xc8\xd1\x40\x77\xc6\xa6\xae\x2a\xff\x33\xbb\xf8\x00\x9c\x78\xdd\x07\x0e\x18\x33\x37\x96\xb2\x24\x34\xa2\xe3\x93\x8b\xa6\x4c\x20\xfe\xe5\x27\x7f\x83\xef\x67\x13\xf1\xd8\x43\x2c\x0c\xb4\xee\xcd\x06\x5e\xf2\xfb\xbc\x91\x83\x49\xca\x58\xc2\xa1\x3b\xe9\xe1\xd2\xc0\x43\x5d\x9d\x3e\xa0\x3a\x32\xc6\x58\xaa\x8d\x63\x4a\x2e\x21\xdc\xe8\xe9\x61\x30\x5e\x18\x56\xc3\xad\xda\x5c\xde\x73\x55\xd5\x39\xff\x93\x08\xe3\x6f\xa3\xb3\x70\x6a\x50\xb5\x47\x68\x17\x5d\xec\xb4\x56\x06\x5d\x56\xaa\xcd\x2d\x69\x9f\x31\x2e\x62\xe7\xf4\xea\x64\x12\x31\x03\x9a\x76\x08\xed\x70\x11\x04\x18\x7e\x9e\xf2\xb2\x1d\x54\x5e\x6f\xf9\x0c\x1f\x36\x50\x99\x60\x1c\x57\x42\x2b\xc8\xb2\x28\xd5\xb2\x5b\x60\x86\x70\x24\x26\xb2\x04\xeb\x3c\x4f\x7f\x6c\x0f\x9b\x53\x99\xab\xaa\x28\xb8\x7f\xfd\x85\x8c\xb0\xa1\xf9\x3b\xaf\xf3\xd9\xfe\xa5\x1d\x27\x09\x37\xb5\x9f\xea\x7d\x46\xe1\x8e\x31\x15\x51\xab\xbe\x69\xb2\x06\x0f\x6d\x99\x65\x69\xcc\x2d\x1e\x2a\x4b\x49\x8f\xa9\xb7\x81\xcd\x4d\xd9\x9a\x81\xd6\x81\xed\x41\x60\x6a\x55\x15\x23\x2b\xf0\x9e\x09\x34\x7e\x73\x99\x7f\x6f\x75\xcc\x51\xa1\x97\x2b\x13\x96\xee\x2b\x04\x81\x7e\x5e\xab\x61\x3a\x31\x8d\xb1\xc7\xfc\xe8\xf0\xce\x1f\x01\x88\xe7\x6f\xa0\x4e\x0c\xd4\xef\xd2\x80\x5a\x56\xf5\xc8\xe0\x97\x31\x9d\x51\xec\x47\x98\xf6\xf6\x41\x97\x72\x7e\xa1\x9d\x05\x48\x65\x41\x4c\x52\xd2\xd7\x26\x77\x06\x70\x7d\xbe\xad\xce\x64\x01\xe1\x91\xed\x7b\xec\x10\xb5\x33\x25\x9e\xb2\x2c\x4c\x4d\xaf\x73\xdd\xc2\xc9\xf1\xb7\x7e\x73\xc7\x08\x77\xad\xe4\xc7\x5c\x42\xd9\xc0\x1e\xea\xd3\xad\x10\xd5\x48\x9f\x69\xf8\x7f\xdc\x79\x64\x86\xd0\xed\x77\xa3\xce\x07\x3d\x2b\xf1\x16\x9f\xfd\x51\x37\xe1\x46\x03\xea\x83\xf5\x37\x8b\xa8\x89\x58\x9d\x15\xa0\xfb\x31\x11\xd3\x94\x7b\xfd\x86\x1f\x90\x4f\xee\x55\x1c\x80\xb1\xaf\x76\x71\xe6\xf8\x95\xcf\xe2\x08\xb0\x10\x20\x2e\x75\x69\xca\x77\x06\xc2\xe8\x8c\x17\xc7\x57\x11\x13\x81\x49\x58\x91\xbf\xc3\x2e\xef\xe1\xd5\x59\x12\x04\xa8\x94\xcb\x7d\x05\x6e\xb8\x3f\x65\x49\x10\xe2\xb7\x60\x11\xf3\xf5\x26\x13\xcc\x92\x38\x42\xb9\x64\xae\x94\x9d\x33\x8e\xbd\x3f\xbe\xda\x24\x49\x89\xc3\x16\x1d\x0c\x1b\xf1\xa0\xf3\x52\x61\x27\x21\x2f\xdb\x97\x1a\xde\xb7\x58\x3e\xf1\x4f\x3b\xd1\x21\xd6\x12\xf0\x67\x75\xb1\x29\xce\x93\xb9\x02\x86\x4b\xc0\xb3\x34\x13\x8e\xaf\xd1\xcd\xce\xdf\x46\x37\x94\x26\x0c\x37\xc2\x2e\x0c\x2e\xf6\x3f\xab\x5b\x9d\x7c\x96\xb1\x88\x70\xfb\x73\xbe\x4c\xbc\x54\x59\xc6\x28\x41\x06\xe9\xcb\x66\x37\xd0\x95\xfa\x5f\x75\xee\xb2\x2c\xa2\x98\x80\xbc\x57\x2d\x8a\xbc\xf8\xfe\xef\xe8\x9b\xb2\x48\x25\xd6\xcd\x18\x43\x27\x5e\x0c\x52\x92\xc9\x25\x67\xd4\x30\x07\x0d\xc1\xac\xb9\xbd\x32\x37\x0e\x18\xf2\x71\x1f\x78\xd3\x9e\x78\xfd\x06\x6d\x39\x22\x71\x64\x3c\x31\x02\xcc\xa6\xf4\xf4\xce\x5b\x40\xbf\xc1\xf1\xf3\xe6\x09\x64\x36\x9a\x78\x00\x40\xa1\xa3\x87\xaa\xfe\xfb\x6e\xf2\x65\x5c\xa6\xc8\xab\xd8\xd4\x47\x5e\xe6\xff\x85\x61\x92\x96\x71\xe0\x58\x69\x30\xae\x14\x8f\x7c\x62\x0b\xc6\x32\x11\x40\x68\x33\xd7\x89\x25\xbf\x1b\x10\x99\xb7\x69\xcb\x5b\x48\xdd\x69\x45\x0c\x72\x28\xf8\xf1\xf2\xfd\xce\x1f\x4a\x55\x22\xdc\x1c\xec\xb6\xb9\x6e\x52\x95\x08\x70\x9d\x7f\x4c\x82\x46\x08\xc2\x3b\x5d\xcd\x8d\x6f\xf9\x1b\x0c\x29\xbd\x2c\x13\x99\x46\x2c\x17\xd4\xf5\x38\x72\xcd\x84\x64\x44\x38\x69\xf5\xaa\x00\x5e\x3e\xf1\xb3\xc9\x05\x46\x0f\x59\x76\x97\x85\x39\x2e\x82\xed\x26\x07\x95\xd6\x36\x13\xef\xa2\x68\x7c\x12\x97\x19\xa8\x49\xa6\x02\x53\x71\xb3\xe1\xb6\xf1\xce\xf4\xb7\x5a\x51\x8d\xf9\xf0\x99\x5f\x1d\x7d\xef\x83\x5f\xac\x74\x14\x19\x50\x71\x8e\xd5\x1b\x9b\xc0\xbb\x13\xe9\x40\xe3\x1b\x79\xbf\xdf\xfa\x3f\xc5\x09\x56\xcb\x8f\xb5\xe3\xc9\x77\x7f\x33\x88\x20\xbb\xb5\xf5\x29\x62\xa6\xd3\xd8\x00\xda\x0d\x1b\x16\xc4\x4d\x63\x68\x72\x41\x9a\x12\x54\xaf\xd2\x58\x77\xfd\xcc\xc9\x97\x65\x3a\x63\xd8\x0e\x1e\xb5\xe9\x9d\x71\xd7\xe8\xd5\xe1\x41\xa8\x31\x3c\xbc\xe3\x47\xaf\x12\xfa\xbf\x90\x7b\x73\x67\xe1\xa0\xe2\x1e\xa8\x8a\x3f\x74\x86\x09\xea\x46\x4b\xed\x54\x73\x76\x92\xa3\xb3\xa6\x37\x81\x63\x3c\x50\x71\xe8\xb9\xed\xeb\x12\x3b\x17\x17\x0b\x45\xfd\x00\xf7\xc4\x03\x88\x91\x78\x78\x97\x1f\x45\x35\xc4\xcf\xa3\xb4\x92\x1d\x14\x46\x09\x7a\x9c\x2d\xef\x96\x7b\xff\x37\x19\x60\x4c\x59\xe6\x02\x35\x94\x96\xaf\x7c\x12\xf5\xf3\x28\xa0\x08\x30\xd6\xb5\x45\x97\x35\x5e\x00\xc0\x9d\x25\x0a\x4d\x56\xd3\x40\xfb\x5c\x95\x58\x49\xf9\x68\xdd\xe1\x51\x18\x1b\xec\xa5\x23\x64\xa1\x40\x76\xd9\xe2\x2b\x32\x51\x1e\x9c\x7c\x92\xa7\xc2\x98\xe3\x36\x55\xf1\x3e\x63\x61\x36\xdc\xe2\xed\x67\x92\x38\xc3\xbc\x12\x8a\xfc\x97\xaf\x22\xf2\x84\x32\xfc\x49\x75\x75\x29\x55\x30\x2c\x07\x22\x6e\x43\x59\x28\xc5\x7c\x95\x79\xfa\x6f\x18\x7c\xea\x2b\xcd\x78\x22\x68\x46\x7b\x55\xe6\xa9\x75\xce\xe4\x51\xa6\x11\x8b\x94\xab\xb9\x95\x3a\x3f\x8e\x57\x5c\x9e\xa6\x09\xe2\xb0\x0f\xed\x34\x39\xba\xa0\x50\xbc\x1d\x46\xc2\x38\x75\x4e\xed\x3e\x06\x18\x7f\x13\x09\x8d\xf4\xa1\x81\x5c\xa0\xd7\x89\xbb\x0b\x24\x8a\xe2\xd4\xc9\x82\x59\xdc\xc3\xf8\x61\x10\x45\x95\x34\x98\xce\xed\xfe\xb0\x5d\xec\x1d\xa0\x93\x53\xa7\xb8\x88\x95\x87\xa1\x6e\x94\xaf\x2f\x70\x1a\x45\x58\x99\x7f\xe5\xcd\xaa\xac\x2e\xc7\x57\xd4\x35\xf4\xd1\x96\x0d\xe1\x5c\xa8\x3c\x47\xad\x77\x27\x4a\x4c\xf7\xf3\xa7\xab\xdd\x6e\xca\x59\x4b\x03\xc6\xa9\x00\xbc\x21\x4f\xdb\xdf\x67\x03\x66\x37\x0c\x22\x0c\x5e\xb1\xfb\xbb\xaf\xce\xce\x46\x8a\xf1\x2c\xcd\x12\x6d\x71\x08\x1b\xbd\x3a\x75\x09\x78\x55\xbe\x40\xfd\x07\xf8\x04\x86\x67\x44\x24\x64\x68\xf9\x30\xb9\xe7\x19\x05\x24\xcb\x19\x9b\xc5\x81\x95\x20\x1b\xad\x10\x3c\xd4\x58\xab\x3d\xf1\x37\x03\x91\xb8\xcb\xdb\x13\x3f\xdf\xe5\x93\x9d\x8f\xf3\x98\x52\xaf\xdf\xf6\x95\xd7\x5d\x6c\xb8\x39\x5b\x94\xc7\xcc\x12\x64\x33\xcd\x9e\x8a\x34\xdc\x3c\x38\x4f\x19\xca\xe0\x60\x67\x7a\x5f\x59\xf4\xd7\xfc\x7b\xca\x89\xc0\x0c\xa2\xdb\x65\x90\xd7\x68\x09\x85\x0e\x4b\xc9\xb9\xd0\x08\xec\x32\x77\xd2\x35\x05\x20\x37\x35\x78\x7b\xee\xc9\x39\x15\x47\x94\xfa\xef\x39\xfc\xbc\x83\x9b\xdf\xaa\x64\xac\xb1\x92\x2e\x2d\x88\xc5\x7d\x95\x88\x12\xd4\x8d\xfd\xc1\xeb\x3a\xaf\xea\xc6\xd8\x2d\x76\x11\xb0\xc1\x8c\xea\x1c\x8a\x9b\x0a\xeb\xe4\xf7\xc8\x00\x28\x19\x1a\x89\x4c\x0a\x1b\x5c\x52\x62\x28\x6b\x3f\xab\xa7\xbc\x28\xf2\xaa\x7c\xa8\x2e\xf5\xd7\x4b\xa9\x6a\x50\xfb\xd7\xea\xd2\xf0\xd2\x5f\x91\xe4\x09\xb1\xea\x3b\xa8\xbc\x52\xf3\x62\x7a\x3a\x6e\xf6\xb3\x63\xb7\x66\x2a\x5e\x60\xad\xe9\xfb\xf6\xd1\x9f\x01\x8c\x89\x35\x76\x4a\x47\x88\x22\xae\xc2\x00\x69\x81\x87\xc3\x43\xde\x1d\x44\x94\xc4\x48\x4b\x9b\x71\x65\x45\x77\x50\x82\xa3\x81\x39\xbd\x71\xc6\x15\xc9\x42\x1b\xe2\x7d\xe1\x4d\x17\x7f\x3e\x6e\xbe\xdf\x4f\x07\x51\x21\x0d\xda\xb4\x7b\x6e\x7b\x2f\x45\xc1\xb8\xd2\x29\xcb\x1c\xfc\xa3\x85\x9d\x1c\x5c\x23\x50\xa5\xec\xcf\x5b\x2e\xbf\x5a\x9c\x6d\xe4\x8f\x32\x89\x52\x3b\x03\xf9\xb7\xb5\x8f\xa5\xb8\x8e\x4c\x53\xc4\x1a\x1f\x6c\xe1\xc4\xf3\x32\x2f\x8f\x7e\xdf\x59\x77\x7b\x8c\x1f\x0d\x4a\x65\x7d\x93\xc2\x4c\xcb\x3d\xaf\x8f\xd3\x17\x48\x04\xb6\x1f\xb7\x5e\x6e\xa2\x51\x13\x58\x84\x56\x64\xb9\xbb\xda\x57\x9e\x97\xd7\x9e\xe9\x3f\xbc\xab\x22\x54\x81\x25\x0a\x15\xfc\x8a\xf8\xa9\xd1\x16\x91\x0c\xcb\xed\x22\x8a\x09\x26\x18\xa6\x61\x6c\x7a\xde\x0b\x67\xb4\xc1\x44\xcc\x32\x8c\x6a\x2f\x4d\x3f\x3d\x30\x4b\x19\x5f\x74\x0c\x8a\x58\x4a\xf4\x47\x9a\x21\xa3\x49\x2c\x92\x2e\x76\x33\x31\x5e\x97\x4d\x0d\x0c\xdc\xc7\x4b\x9d\x48\x64\x86\xf8\x90\xcd\xcb\xea\xf9\xf0\xb2\x58\x7e\x5b\x7c\x59\x1d\x86\x94\x67\x91\x06\x0c\x7b\xe3\x2f\x5b\x23\x04\xbf\x7a\xbe\xf7\x87\x20\x0d\xb5\x6f\x7b\xb8\xbf\x92\x30\xc4\x94\x48\xf1\xbc\xb8\x8e\x6a\x0a\x82\x64\x81\xe1\x10\xa2\x32\x2a\x6e\x29\xeb\xc6\xe2\x3c\x1a\x50\x8b\x52\xa1\xb6\x85\x1f\x2e\x04\x42\x1a\x75\x17\x74\x98\x25\x63\x92\x9c\x09\xa2\x39\x32\x31\xb1\x56\xea\xa0\xfd\x73\xff\xd8\xf1\x99\x4a\x0d\x2c\x38\x2f\x8f\xd6\x1a\xf1\xd9\xb2\xdc\xdc\xb7\xf2\x48\x63\x1c\xd5\xe5\x27\x93\xd5\x6f\x7c\xef\x38\x4b\x71\x33\xb0\x0e\xa9\x38\xf4\x03\x0c\xbb\xe0\x4c\xe3\x66\xa7\xf3\x5f\xc6\xbd\x61\x67\x58\xf1\xb3\x01\xbc\x10\x3c\x71\xa4\x10\x9b\x41\x83\x9a\x38\xd3\x31\x21\x03\x9b\x10\x1a\x25\x25\x40\x8f\xfd\x2e\x98\x71\x3f\x44\x4a\x8e\x88\xae\x67\x38\x16\x30\xd3\x16\xba\xcc\xdd\x20\x15\x64\x58\x0f\xfd\x02\xad\xb9\x50\xe3\xc3\x30\x2c\xd4\x0b\x95\x4a\xc4\x2b\x3e\xef\xb7\x7f\xbc\xa0\x92\xa6\x8f\x1a\x04\x44\x80\x9d\xd0\xe7\xff\x9f\xb4\x3f\x6b\x6e\xdc\xd6\xf6\x87\xe1\xaf\x93\x8b\x73\x41\x12\x9c\x70\x29\xc9\xb2\x5b\x27\x9e\x8e\xa5\x4e\x27\x7b\xd7\x2e\xd5\x02\xb0\x20\x33\xa6\x48\x6d\x92\xb2\x5b\xf9\xf4\x6f\x71\x01\xe0\x24\xda\xc9\xf3\x7f\x6f\xd2\x29\x13\xa2\x28\x12\x04\xd6\xf0\x1b\xf0\xa3\xb3\x3e\xb7\xf2\xdc\x6e\x04\x4b\x23\x2b\x52\xf9\xa4\x35\x49\xd0\x4f\x41\x29\x7d\xf0\x26\x30\x61\x14\x63\x2c\xb1\x78\xcb\x36\xab\xa7\xc9\x4d\x40\xd4\x91\xb9\xaf\x15\xae\xdb\xfc\xed\xbe\x3c\xb0\x45\x51\x16\x97\x63\xf7\x7d\x5a\x7a\xb6\xa4\xdd\xcb\x95\x50\xa9\x66\x7c\x2a\x8d\xc6\x09\x3f\x87\x42\xb5\xc9\x30\xa1\x99\xb7\x0d\x9e\xa6\x0d\x68\xa1\x51\x10\x4d\x77\xb3\xdd\x7e\x5f\xef\x1f\xd6\xbb\x6f\x4f\xee\x9d\x90\x5e\x68\x04\xb0\x4e\x55\xa9\xb3\x7c\x9c\xc3\x4b\x8f\x9b\x4b\x21\xfd\x0a\x2b\x6b\x60\x42\x84\x9a\x9a\x07\x53\xb7\x8b\x54\x7a\xe0\x29\xed\xba\xea\x76\x2e\x8c\xc9\xf0\x32\x60\x71\xc8\x1d\xf9\xb1\x82\xfc\x71\x5a\xa4\x90\x41\xca\xa2\x91\xfe\xc1\x4d\x56\x9f\xb0\x70\xe5\xa1\xda\x90\x96\x66\xd0\xdb\x32\x90\x82\x70\xff\xf8\xdf\x33\xe4\x5f\x50\x5c\x24\x0b\x14\xc9\xce\xdc\x94\x20\xa1\xa4\x27\x51\xba\x0b\x64\x60\x3a\x84\x35\xbc\xa3\x3f\x5e\x2c\x27\x27\xb1\x48\xac\xbb\x1e\x0e\x32\xdb\xd6\xe8\xaf\x2f\xe4\x06\xda\xd5\xfe\x32\x6b\xaf\x6b\xe8\x7a\xc3\x65\x47\x86\x8a\x19\xb3\xfc\xac\xba\xa9\xca\x93\x9d\xd1\xee\xa0\x36\x42\xb4\xb2\xcc\x0a\x23\x77\x7c\x87\xc7\xe3\xe5\xe1\x5c\x67\xd2\x8d\x89\xb4\x26\xe7\x9f\x3f\x0d\x38\xe8\xbe\xdd\x58\xdc\xb1\xd8\x97\xc4\x18\x32\x38\xbd\xe5\xe4\x06\xc6\xb1\xa4\xe2\x51\xb7\x8d\x11\xab\xba\xfb\x6c\x12\x38\x4f\xf3\x76\xf3\x34\x5d\x05\x77\x0c\x15\xc9\xf3\x14\x99\xc4\xbb\x73\xf7\x5b\x92\x94\x13\xd5\x40\x19\xac\xb5\x3d\xa1\x63\xc8\xcd\x48\x87\xa7\x32\x51\x3a\x85\x0e\x07\x4b\x71\xda\x1e\xd4\x84\xc3\x20\x53\x2f\xa5\x95\xd4\x02\xa4\x6c\x00\x3d\x49\x98\xc7\xaf\x8c\x6c\x33\x15\x53\xb5\x31\x5b\xc0\x4d\xf6\x5e\x4f\x4f\x2b\x84\x51\xfd\x3e\x18\x8c\x72\xdd\x54\xdd\x6f\xe1\x0c\xa0\xcf\xff\xad\x64\x77\x56\x12\x4c\x28\xe9\x06\xc5\x26\x18\xbf\xc7\xba\x2e\x8b\xfd\x27\x94\x24\xc9\xc1\xa8\x86\xb8\x4a\x4f\x31\xce\x95\xdd\x28\xcd\xa9\xb1\x74\x5f\xca\x89\xe3\xd8\x3c\x6c\xe2\x13\x5a\xe6\xe4\x36\x80\x1f\x13\xff\x9d\x70\x6d\x8f\xf8\x61\x7a\x76\xa3\xe8\x42\x02\x13\x42\xf4\xde\xe3\xf5\x04\xf8\x28\x45\xcc\xa2\x8e\x2d\x69\x21\xb6\x7d\xe5\xd9\xbc\x2c\x7d\x42\x34\xe9\xea\x4b\xe9\x79\x94\xcc\xba\x5f\x6f\x20\xd5\xf6\xa0\xf6\x4c\x6d\xcd\xda\x50\x1b\x4b\xa6\xdb\x69\x39\x56\xea\x28\xa6\xa7\xb1\x0a\xee\xbb\x4f\xa6\x31\x6d\x06\x0f\x97\xb1\xdd\x4f\x2a\x35\x8f\x1c\xe0\x65\xf9\xf1\x40\xa5\x43\x23\x4b\x0f\xd7\xe9\xbe\xd4\x32\xa4\x65\xef\xda\x8e\x69\x98\xf0\x90\x7a\xb1\x6f\xae\x33\x2f\x2f\xcb\x12\x3a\xa0\xbb\xf2\x92\x28\xb0\x5e\xa5\x84\xbd\x26\x6a\xef\x78\xa6\x29\x0f\xb4\xb6\x74\x8b\x31\xa2\xbc\x07\xf5\xbb\x91\xa8\x98\x6f\x61\x13\x57\x56\x2b\xe3\x93\xfa\xbe\xa2\x04\xe6\x06\xde\x33\x35\xb8\x01\xca\x4f\xb9\x2f\x3a\x7c\x9f\x51\xc0\xff\xec\x1c\x9c\xa3\xd9\xc2\x9a\x86\xb2\x38\x39\x3c\x0f\xf2\xd8\x40\x83\xda\x88\x48\x5e\x63\x0e\x15\x0b\x3c\x8c\xed\x02\xb5\x74\x9c\xb4\x19\x11\xbc\x76\x64\x4a\xbd\x59\x85\xb6\xa4\x39\x7e\x0e\x8a\x85\x9a\xaa\x8b\x58\xd4\xe7\x0a\x57\x65\xde\xee\x05\x15\xe4\x6e\x43\x99\x7c\x6f\x12\x11\x7a\xe0\x03\xf1\x6d\x9f\x15\xfb\x36\x39\x71\x25\x12\xc5\x20\xa2\xc9\xf2\x67\x99\x15\x82\x9e\xd4\x70\x25\x57\x4c\x1a\x09\xfc\x3e\x80\x71\x4e\x5a\xe3\x2b\x0a\x13\xe3\xcf\xaa\x17\xea\x93\x22\xa4\x8a\xbc\x90\xc4\x03\xcc\x4a\x74\x43\xa8\xc6\x7f\x54\x57\x57\x11\x37\x44\xd7\xe7\x97\xa7\x87\x27\xe3\xc7\x64\x19\xeb\xee\x57\xc4\x31\x83\xd0\xf2\x11\x20\xcf\xf4\x44\xdb\x40\xc5\x22\xa2\x56\xff\xee\xe9\x65\x35\x8c\x11\x55\xac\x63\x2a\xd0\x9c\xae\xfa\xbc\x2a\xf1\xa2\x98\xbb\x7c\xea\xd8\x15\x22\xce\xd7\x72\x1f\x2a\x65\x8c\x20\x06\x1f\x3d\x4a\xee\xa7\x65\x3a\x8d\x0a\xcb\x2a\x4d\x85\x32\xb5\xed\x6e\xdb\x57\xed\xbe\x9a\xb8\x87\xdd\x66\x77\x56\x52\x68\x91\xe7\x8b\xea\x70\x4d\x46\x1f\x7f\x35\x57\x09\xe5\xa6\x3f\x56\x0f\x8e\xb8\xaf\x64\xea\x79\xb2\x53\x89\x68\xb7\xab\xfa\x6a\xfb\xed\xb7\x15\xd5\x26\xaf\xc6\x5b\xb7\x2a\x3f\xea\x1f\xaf\x86\x24\xbf\xa9\x1f\xcb\x91\x38\x5d\xe7\xb3\x91\x2a\xa9\x7c\x0a\x04\x1e\xf1\x5c\x41\xfe\x5c\x95\x4d\x29\x4b\x97\x0b\x29\x25\x12\x7a\x2b\x8f\x97\xfa\xb5\xfc\xc8\x28\x55\x1d\x5f\xb4\xd2\x3e\x31\x2e\x3b\xf9\xee\xe6\x75\x1c\x0b\x29\x8c\x99\x6b\x3d\x59\x59\x42\x6f\xf2\xc3\xb5\x27\xc1\xef\xd7\x59\xca\xac\xcb\x3c\xbf\xe9\xfc\x31\x52\xa5\x21\xf2\x9c\xcb\x56\x76\xf8\x27\x68\xe9\xf1\xc4\x43\xaf\x7d\x11\xe9\x3a\x0b\x55\x7e\x78\x63\xbc\x39\x7a\x3c\x8a\x0d\x1e\xad\x8f\x57\xe6\xf7\x57\xf4\x54\xe4\x64\x76\x56\x65\xf1\x8e\x55\x4d\x49\xb2\x2e\x47\x6f\x1b\x86\x61\x40\x6d\x1c\x57\x0d\x7c\xc8\x8a\xcf\xe4\x14\x30\x4a\x53\x12\x07\x27\x3c\xe7\xa9\x2c\xf3\xdf\xcc\x59\xbb\xa6\x2b\xb3\x65\x35\x4c\xc2\x80\xf2\x73\x7b\x9d\xe3\x67\x81\x89\x4c\x98\xd5\xa3\x25\xdd\xc8\xfc\xb2\x18\x0a\x94\x61\xea\x6b\xca\xdd\xa8\x59\x91\xe3\xa1\x82\xe3\xf8\xa2\x39\xa2\xe3\x24\x3d\x57\x78\xcc\xce\xc7\xcf\xb9\xd6\x08\x5e\x4c\x18\x4e\xd3\x1e\x42\x65\x3c\xe8\xc6\x55\x51\x14\x41\x40\x60\x31\xa0\x77\x67\xfa\x62\xa2\xd0\x8c\xc4\x89\xb3\xcc\x81\xfb\x51\xa2\x91\xb4\x3d\x60\xb3\x3d\x21\x51\x5b\xcf\x2e\x6f\x40\xe5\x05\xa1\x89\x15\xca\x53\xd5\xa9\xc6\x8d\xef\x82\xf2\xa5\x52\x23\x7f\x9d\xff\x3b\xc3\x30\xdb\x41\x25\x02\xad\xad\x6d\x42\x93\x49\xc8\xf3\xcb\xba\x38\x64\x05\x8e\x2d\xfe\x53\x54\x32\xa5\x58\xb0\xb6\x64\x07\xfb\xe7\x36\x47\x0f\x49\x72\x63\xdb\xff\xc9\x00\x5a\x0d\x08\xab\x6b\x17\x2e\x2f\xdb\x02\x4e\xf5\x6b\x69\x24\xa4\x3e\x79\xfe\x28\x35\x89\xe8\x1c\xe1\xe7\xee\xe7\x90\x91\x80\xa8\x8c\xd5\xe4\x2b\xd4\xaf\xa6\x87\x3e\x13\xe8\xa3\x8e\xfc\xce\x70\xd8\xd5\x74\x7c\xd7\x6f\x43\x2d\x7d\xe8\x85\x91\x94\x39\xff\xf8\x29\x69\x4c\xa9\x3a\x4a\xb5\xae\xda\xd0\xc7\xc6\x4f\x4a\x7b\x1e\xb7\xca\xd9\xb9\x34\x49\xe8\x75\x60\xa9\xbd\xd0\x68\x01\xda\x40\xd8\xfa\x94\xde\x65\xef\xf8\xad\x5f\x39\xb5\xc7\x31\x08\x5d\xf2\x47\x03\xaf\x04\xbc\xb4\x9f\x98\x45\x63\x07\x6f\xed\x5c\x46\xf7\xec\xb4\x2f\x94\xb3\x82\x78\xc4\xec\xf0\x2a\xca\x73\xf5\x5a\x96\x6a\x3a\xb5\xb4\xaf\x24\x01\xca\xf6\x67\xb2\xa3\x7a\x80\xb7\x76\xa3\x82\xc9\x28\x16\x69\x22\xd7\x9b\x9b\xf3\x7d\x8b\xff\x7d\xef\x56\x3f\xcd\xa4\x72\x12\x08\xb7\x67\x52\xdd\x1b\x50\x70\x57\x56\xd9\x61\x34\xf9\x74\x28\x8c\xba\xc4\xa6\xc8\x1a\x6b\x40\xb6\xea\x63\x26\x1d\x85\x8c\x1a\xa2\xff\xfb\xbf\x5f\x21\xe4\x74\x24\xb5\x21\x5d\xd1\xfe\xfa\x63\xb5\x0b\x3e\x6b\xdb\xe8\x38\x48\x62\x5b\x8f\xa9\xaf\x56\x77\x1d\x07\x9a\x1e\x6c\x5d\x1e\xf1\x01\x9b\xd7\x52\x05\x5f\x23\x58\x74\x1c\xc6\xb4\x4e\x3a\xbb\xcd\x41\x4c\x3a\x6b\xad\x93\xea\x58\x18\x6b\x03\x73\xb1\xf6\x95\x33\x5e\x3d\x14\x11\x8e\xaf\x37\x09\x52\x22\x29\x11\x8e\x0d\x24\x89\x32\xfd\xfe\xc7\xbf\xdc\x05\xa7\x69\xca\x0d\x76\xff\x7d\x9f\x15\xdb\xa6\xea\xd1\x7f\x3a\x05\x9f\x4a\x97\xe2\x7c\xa1\xa6\xc8\x48\x60\x44\xf3\xc8\x7a\xde\xd9\x05\xf7\xb9\x42\xc2\xae\x7c\x5a\x5f\x9e\xfd\xf7\x13\x74\x88\x06\x5f\x45\xe4\xcf\x04\x85\xca\x91\x70\x1c\x2b\x23\x52\xf2\xd9\xdd\xb9\xfa\xba\xd9\x77\x5f\x83\x0c\xc9\x43\xea\xaa\x6b\xf4\xc9\xbf\x9f\x49\x44\x6a\xd0\x46\x5a\xc4\xe8\xb6\x3c\x2c\x7e\xdf\xaf\x9e\x1e\x77\x2f\x9b\xe5\xfe\xfb\x76\xe1\x6e\x92\xf0\x02\x65\x0a\xcb\x79\x7e\x8b\x48\xf5\x72\xc7\x3a\x77\x43\x64\x9c\x28\x67\x93\x53\x67\x87\x71\xb9\xed\xd3\xaf\x97\x5e\x42\xf3\x66\x7f\x24\xa7\xf6\xc9\x6b\x26\xc3\x88\xfc\x3d\xb3\x22\xfb\xd4\x45\xe3\x9f\x6d\xe4\x5a\x72\x03\xfe\xb6\x7a\xa3\xee\xc3\xa3\xf7\x47\x72\x49\x30\xac\xef\x45\x26\xcb\xea\x4a\x9c\x7b\x3e\x65\xd4\x52\x81\x51\x27\xaf\xb1\x71\xe0\x4b\x8d\xb1\x88\x63\xb7\xdd\xab\xc9\xc2\xa9\x91\x87\x26\xde\x22\x6d\xfc\xd7\x0a\xd1\x32\xcd\xd6\xff\x1d\x28\x1c\xda\xc1\x3a\x88\x39\x76\x48\xa2\xc5\x3b\x34\x70\x5d\xc9\xe3\x9e\x17\x7b\x54\x71\xa1\xf2\xe9\x44\xe6\x7e\x78\xc1\xdc\xf3\x12\x15\xda\x13\x36\x39\xde\x0d\x4b\x97\x93\xd5\x65\x78\x0b\xb9\xe7\x33\xe9\x44\xd2\x6f\x2b\x44\x8a\xd6\xaa\x4d\xf1\x5e\x66\x12\xeb\xe5\xc5\x52\xea\xe6\x5e\x1b\x77\x8d\x41\x18\x73\xa3\xaf\x28\xcb\xf7\xc1\xbb\x36\x32\x19\x1a\x73\x7f\xbe\x7c\xac\xed\x19\x0d\x90\xe2\x58\xaa\x4c\x5f\x1e\xb0\xae\xe1\x30\x2a\x99\x71\x8f\x45\x01\x81\x07\xbb\x0e\xab\x41\x31\x7e\xd5\x3e\xe2\x1e\x4b\xb9\x83\xdd\xfc\x80\xac\x69\x63\x86\xec\x88\xcb\xf3\x90\xf5\x6f\x87\x86\x11\xd7\x4e\x2b\x6e\x5d\x55\x13\x67\x13\xee\xc5\x32\xa5\xaa\xd4\x5e\x75\xda\xc9\x86\x3b\x3f\x64\x4f\x98\xc4\xd6\x45\xe4\xdc\x8b\x31\x8e\xed\x66\xf7\x33\x78\x2e\xf3\x4c\x5e\x13\x5e\xe7\xef\x48\xc2\x39\xbd\xab\x46\x34\x3c\x74\xbe\xb8\x38\xb9\xea\x94\x01\xc1\x49\x55\x05\x59\xf1\x60\x23\x07\xee\xa5\x61\xc2\xda\xbd\x0b\x65\x59\x94\xc7\xcb\xb2\x2c\xeb\x66\x06\x7c\xcf\xbd\x34\xe2\xd4\x7f\x7d\x59\x3c\xde\xad\x4d\xd7\xd8\xef\x4e\x92\x20\x69\x33\x4b\x28\x1e\xca\x77\x9c\x4c\xbf\x14\x0c\xce\xaa\x33\x26\xc0\x7d\x1b\x19\x7c\x9f\x7b\xc7\xc7\xd7\xcc\x03\x41\xd5\x8f\x0f\xc4\xa7\x02\xd7\xcd\xeb\x0a\x8a\xa5\xab\xa7\xf1\x36\x18\x97\x96\x42\xbf\x3a\x57\x57\x28\x35\xee\x71\x14\x1a\x1c\x9a\x8d\x6c\xae\xe6\x2d\xc9\xb8\xc7\x75\x20\xfb\xfd\x7d\x45\x72\xd5\x37\x59\xdd\x90\x9d\x89\x1d\x03\x4c\x6a\x2b\x40\x41\xe5\x35\xa8\x5f\x3f\xca\x5c\x77\x87\x85\x41\xec\xe7\xe7\xa2\xf3\xfd\xea\x8e\x49\x15\x59\xb6\xc0\x54\xd9\x9a\x7b\x42\x0a\x16\x38\xeb\xfb\x6a\x57\x8e\x58\x5d\x76\x8c\x14\x5c\x70\x27\xc5\x51\x15\x53\x75\xb4\xf1\x60\x15\xf8\x81\xd1\x91\x95\x43\x01\x10\xee\x29\xc0\xb4\x33\x2e\x5d\x7c\xbf\x72\x0a\x3c\x4f\xf5\x97\xb8\xa7\x94\x41\x91\x51\xe9\x71\x60\x45\xc8\x3d\x8c\x42\xfa\x4d\x15\x5c\x83\x90\x26\xcf\x11\xa5\x31\xce\x5a\xbf\x97\xd7\x91\x38\xf7\x74\x1a\x0a\x1b\x89\xaf\x77\xdf\x6e\xab\xd2\xd9\x41\x8c\xce\xe2\x7b\x91\xa4\x82\xf1\xb9\xa0\xf8\x73\xb8\xad\x73\xdf\x4b\x23\x22\x8a\x1e\xb3\xa2\xd9\x66\xb9\x1c\xa7\x66\xe3\x13\x05\x9e\x81\x8f\x1c\xa8\xe0\x75\xb9\x2d\xcf\x95\x3b\x4d\xe0\x27\x54\x6e\x37\x95\x56\xe3\xad\x50\xef\xe1\x8a\xe5\xd6\x8e\x14\x14\xc1\xb9\x45\x66\x51\xa8\x05\x15\xae\x3f\xf9\xce\xd8\xb7\xfa\x18\xcd\xb9\x2a\xee\xcb\x09\x9f\x94\xfb\x01\x60\x68\xf3\xc5\x7b\xa8\x9b\x67\xc8\xd4\x90\x43\x6e\x47\x31\x4f\x51\x6b\xd5\x6c\x24\x1f\x65\xb7\x8d\x2c\x2f\x1d\x65\x94\xfb\xa1\x17\x50\x3a\x50\x37\xf0\x86\xbb\xc5\x53\xbb\xb1\xcd\x30\x75\xcd\xca\x9b\x7e\x5d\x3e\x9d\x47\x8e\xbb\x2f\x8a\x92\xc8\x98\xcc\xaa\x67\xf2\x07\xdc\xc8\xf2\xb6\xac\x76\x58\x77\x84\x41\xee\x87\x1c\x59\xd8\xb5\x1a\x51\x75\x0c\x6d\xee\x87\x2a\xa5\xea\x7e\xbb\xd6\x52\xf8\x3e\xa8\xd4\x70\xbf\x7d\xbd\x6d\x9a\xf9\x70\x6e\x7a\x75\x37\xf7\xe6\xf8\xb1\xf2\x48\x4f\x44\x95\x73\x56\xfe\xed\xf1\x80\x1b\x18\x46\x23\x5f\x97\xe6\xa5\x7b\xae\x50\x67\x3f\x7f\xb9\xd6\x5f\xe6\x7e\xe2\x1b\x76\xc8\x4d\x79\x18\xdb\x18\xfe\x4d\xc4\x31\xb9\x29\x89\x0f\xa6\x5c\x6c\x48\x3b\x2f\x28\xb3\x53\x86\x45\x33\xe0\x0f\x71\x3f\x09\x18\xe9\x1e\xc2\xe1\x90\x9d\x8b\x43\xb6\x97\x36\x17\x1c\xd5\x07\xb8\x9f\x24\x9a\x6a\x95\xdf\x76\xab\xd1\xbd\x49\x84\x17\x24\x9d\x78\xce\x9f\x28\x9b\x39\x1e\x29\xf7\x13\x6d\xe0\x48\x4f\x3f\x2f\x7d\x09\x94\xfb\x69\x10\xa7\xbd\x1b\xde\x4d\x05\x1f\x57\x9f\x4c\x13\xd4\xbd\xa2\x8b\x05\x11\xcd\x85\xf6\xdc\xe7\xa9\x47\xd8\x0b\x9d\xe5\xf9\xf2\x7c\x21\x9a\x39\x89\xc1\xb5\x29\xf3\xd7\x6b\x83\xcf\x25\xf8\x56\x94\xe8\xe1\x32\x26\x70\x70\x1f\x3c\x03\x04\x24\xa2\x1d\xaa\x67\xa8\x6a\x94\xab\xaa\xcd\x5c\xbb\xc9\x0e\x71\xea\x0a\x2d\x8b\x3c\x27\x65\xae\x7b\xec\x26\x9f\x60\x20\xa3\x7e\x0e\xe5\x02\x7b\xc7\x05\xee\x8b\x98\xa7\x56\x62\xe1\x11\x3f\x9e\xc4\x9f\xa3\xb7\xb7\x9b\x67\x42\x98\x72\x8a\x29\x61\xac\x0f\x87\xc9\xad\x92\x0c\x18\x76\x92\xca\xcd\xb9\x1e\x7e\x87\x94\x7e\x32\x54\xce\x35\x29\xe2\xf4\x0c\x52\x91\x1c\x05\xe4\xf9\xad\x69\x37\x3d\x57\xa5\xc4\xba\x63\x33\x72\x5f\x2a\x8f\x53\x06\xf0\x9a\xd5\x56\xdf\x6c\xbd\xfb\xe6\x8e\x2a\x1f\xc1\xbc\x0a\x1f\x45\xd3\x55\xac\xb8\xaf\xa4\xe1\x97\x3f\xdc\xdc\x77\x7f\xd2\x21\x75\xa7\x1e\xcf\xd5\x59\x0e\xe6\x84\xd2\x29\x71\xd5\xad\x12\xc3\xb6\xcc\xd5\xd3\xb9\x99\x2c\x53\xe8\x7b\x24\x5b\x03\x1d\x01\xc5\x18\x1e\xf6\xd7\x89\x3e\x33\xbd\x88\x6f\xdf\x1f\x7f\xdd\x6f\x37\xff\x5a\xbb\x23\x9a\x2b\x6e\x63\xe4\x47\xdd\xd4\xcb\xcb\xb5\xf2\x12\xf7\xb5\x4e\x68\xcf\xdf\xee\x9e\x5e\x16\x77\xeb\xfd\x8f\xc5\xfd\xfd\xda\x56\x7d\x79\xe0\x47\x01\xf5\x2e\xf0\xfd\x8a\x5b\x34\x4d\x13\x66\xd7\xe1\xc0\x17\x21\x05\x6f\x6d\x72\x38\xab\x51\xc8\x83\x20\x08\xe9\x3b\x48\x79\xac\xba\x3d\x17\x72\x7e\x4d\x0f\x82\x28\x24\x40\xa3\xb1\x0c\xa8\xd1\x3e\x39\x77\xad\x01\xa2\x95\x63\xb6\xe2\xe2\xd3\xaa\x3e\x0f\x18\x83\x38\xea\x45\x26\x37\xea\xaa\x3e\xee\x06\x86\x1e\x11\xfa\x36\xab\x27\x63\xa2\xbc\xdf\x6d\x1e\xd6\xce\xb2\x8a\x07\x4c\x32\xe5\x5c\x64\x29\xa3\xb0\x41\xf5\xe4\x2c\x98\x90\xcb\xeb\xab\xd1\x5b\xef\x17\xe2\x20\x62\x3e\x75\xea\xc8\x3b\x6b\xaf\x50\x9d\x8d\x2d\xbb\x7b\xcb\x82\x38\x50\x80\x43\x31\x75\x57\xb3\x1e\xe6\x24\x41\xcc\x34\xcd\xd1\x4c\xb7\x13\x6b\xb8\x60\x05\x71\xac\xe5\x40\x3d\xfe\xa5\x14\xe5\xa7\xe1\xdf\xfc\x52\x11\x24\x5e\x88\x69\x07\x77\xea\x36\x83\x41\x18\x1d\x24\x90\x5a\x4d\xab\xf6\x32\x5d\x42\x77\x9d\xa4\x8c\x1f\x43\x22\x3b\x43\x53\xdb\x42\xfd\x34\xbd\x9e\x4b\x94\x82\x44\x01\x21\xdb\xc4\xf9\xf2\x0c\xf2\xed\x47\xd6\xbc\x92\xcb\xdd\x2f\x93\x61\x08\x44\x11\x11\xed\xcb\x33\xb0\x95\x3f\x5f\xa9\xf6\xf1\x20\xd1\x46\x66\xb1\x0d\x07\x08\x03\x4e\x3d\x35\xaa\x4c\x4d\xae\x5d\x4b\x23\x2d\x67\x78\x1a\x23\x35\x5c\x1e\xa4\xa9\x22\x94\xda\xe9\x5c\xbf\xee\xca\x25\x14\x6f\x93\x8f\xa7\xa0\xc2\xa4\xeb\xe3\xae\x9b\xd7\x65\xa6\x26\x52\x2c\xa3\xa7\xe1\xf2\x81\x80\xa7\x82\xf7\x04\xab\x67\xac\x2c\x72\x6b\xce\xe3\x89\x07\x10\xa9\xa4\x37\x09\x6c\xb7\xfb\x1b\x94\x70\xe9\x4a\xb3\xff\x70\x22\xcc\x5a\xf6\x0c\xbf\x47\xc4\x29\xa9\xf4\xb9\x9a\xc6\xf3\xfa\x65\xf3\x74\xe3\xef\x49\xba\xd4\xdd\x14\x91\x68\x42\x02\x2e\x14\x99\xbb\x55\x23\xe8\x1d\x0f\x04\x30\x02\xcf\xda\xfd\x9b\x9e\x11\xb5\xf7\xfd\xee\x04\x22\xa6\x38\x7a\xbf\x82\x3c\x5f\x88\xb2\x1a\x12\xc0\xc7\xe0\xe2\xee\xc2\x74\x60\x5c\x16\xe0\x7d\x54\x5f\xfc\x9f\xaf\x09\x84\x5f\x51\x97\x79\x20\xbd\x40\x76\xa2\x2c\x4f\x27\x2c\x7e\x50\xd7\xe2\x93\x35\x44\x45\x7e\x92\x5a\x2e\x3a\x56\xa4\xbf\xd6\xf7\x36\x78\xa0\xb4\xa0\x7e\x1e\xfd\xd4\xb9\xb6\x22\x0f\x30\x8c\x8c\x8d\x5c\x1b\x7d\x72\x41\x2e\x7f\x77\x65\xa9\x76\x9d\x67\xe5\x2b\x16\x36\x24\xfd\xa5\xfb\x8c\x8a\x47\x66\xc8\x59\x71\xd8\x36\x78\x9a\x9e\x3a\x92\xcc\xe6\xbf\xf4\x4c\xae\x15\x5c\xda\x31\x9a\xda\x89\x0e\xce\x66\xda\x82\xdb\xef\xcf\xcf\xf7\x7f\xec\xef\x37\x0f\x9b\x6e\x9b\xd0\x01\xa7\x17\x7a\x55\x1e\x4f\x15\x74\x7f\x4d\xc2\xd0\x00\xb9\x6f\xe0\xb2\x7b\xcd\xaa\xee\x22\x75\x2a\xc9\x7d\xfc\x61\xf3\xb8\x5f\x7e\xff\x63\xb9\x58\xfd\xba\xff\x6d\x71\xff\xbd\x9b\x32\x9a\x4b\xdf\xa6\x28\x0e\xa4\xda\xe6\x29\x23\x50\xe6\xe4\x76\x6b\x85\x14\x4d\x62\xf3\xfa\x82\xf2\xeb\x28\x88\x79\xda\x8b\xb5\x93\x6d\xdf\x42\x8e\xe3\x72\x5a\x37\x8a\x41\x6c\x4e\xe9\x96\xb6\x51\x13\x8d\x33\xdf\xe7\x04\xa6\x14\x57\xcd\xe6\xd9\x2d\x8c\xf9\xda\xb7\x0a\xb4\xb2\x2c\x14\x41\xd0\x1e\xe0\xb2\x76\x40\xb4\x76\x00\xb8\xc6\xe2\x43\x59\xd4\x0d\x56\x77\x58\xa0\xd5\x49\x99\x9c\x2c\x60\x9c\x58\x14\xe5\xb9\x39\x9d\x1b\xf3\x0b\xc6\xeb\x11\x0b\xc2\x90\x5a\x22\x27\x83\x88\x1d\x26\x94\x8c\xf9\xa1\xf3\x8c\xde\x76\x7f\x63\x1a\xac\xdd\xd6\x9e\x30\x30\x93\x3b\xc2\xb8\x22\xe8\x48\x9b\x3c\x28\xf8\x7a\x99\x67\x4c\x1a\x81\xaa\x36\x47\xa4\x6a\xfb\x6c\xfc\xce\x18\xc6\xd8\xc1\x39\xa8\xa7\xf5\x69\x26\x60\x3f\x11\x26\x48\xed\xcf\x7d\x8d\x79\xfe\x2b\x5e\xae\xbb\xdc\xa3\x8c\x9f\x85\x69\x44\x19\xff\x5b\x21\x5f\xa0\x41\xea\xf9\xd4\x46\xf5\xd0\x8d\x00\x41\xb7\x7d\x21\x9b\x33\xe4\x84\x8b\x6d\x1a\xc4\x97\xb2\x3c\xba\x21\x11\x93\x22\xf9\x04\x81\xc3\x96\xd8\x40\x37\x30\x15\xe4\xd7\x55\xe0\xc7\xfa\x71\x3b\xb9\x81\xb1\xe7\xf1\xb8\x73\xe8\x6a\xdf\x17\x6c\xb2\x2b\xaa\x27\x67\xb1\xaf\xe8\xfd\xc4\xe6\x95\x04\xa0\xde\xb1\x38\xe3\x0b\x19\x64\xba\xef\x89\x53\x4f\x19\x99\xb8\xcb\x35\xb9\x61\x66\x53\x60\x31\xa6\xb4\x20\x39\xe3\x57\x97\x85\xb3\x24\x31\xa8\x97\x63\x33\xea\xbf\x72\x96\xe8\x38\x75\x6a\x11\xeb\x1c\x87\x0c\xe7\xf1\xe5\x72\x5f\x09\xbb\x7d\x2e\xb1\xc8\x74\x26\x33\x70\xe0\x25\xce\x78\x14\x13\x93\xe6\x4c\xc6\x84\x5b\x3a\xc1\xe4\xf7\x82\xcf\x89\x18\x2c\xce\x97\xd9\x02\x38\x67\x20\x38\xf1\xa5\x44\xa6\xea\x7d\x76\x28\xca\x0a\xd5\xde\x24\x4b\x5d\x30\xcc\x04\x97\x29\xb7\x9e\x9a\xbd\x7c\xd5\xf0\x34\x02\x3c\x12\xb5\xe8\x8b\x85\x34\xe5\x26\xc5\x8f\x76\x58\x6c\xb3\x9c\x4e\xe7\x66\x31\x59\x20\x99\x8c\x38\x95\x99\x8d\x2a\xb1\xf3\x24\x1b\xd0\x32\x26\xc3\x79\xea\x29\x57\xec\xa0\x72\x9c\x3d\xa0\x18\x46\x76\x35\xea\x90\xa9\x53\xee\x34\x67\x18\x18\x90\xc9\x5f\x59\x9e\x63\xef\x38\xe4\x8e\x86\x1e\x35\x1b\x49\x37\xd5\xba\x9d\x67\x03\xd3\xd1\xaf\xd7\x43\x4c\x44\x60\x25\x80\x0f\xc8\x6e\x10\x54\xde\x49\xde\x70\xa6\x03\x53\xac\x6d\xa3\x5d\xca\x33\xa9\xd1\xd6\x75\xb5\xae\xac\xbe\x2d\xdd\x84\x33\xcd\x74\xaa\x3a\x45\xdb\x6b\x38\x53\x7f\x01\x3a\x4a\x68\x02\x49\x38\x0d\xf1\x1c\x3c\xf4\xd2\x84\x22\xed\x3f\xcb\xac\x58\xd4\xcb\xaa\x7c\xeb\xe6\x6d\xe8\x6b\xa0\x09\xdd\xa5\x7a\x4e\x4a\x86\x87\x81\xe7\x69\x47\xef\x5d\xe4\xf9\x93\xa1\xa7\x0c\x2a\x58\x61\xc0\x18\x01\x87\xcb\x0a\x64\x9e\xfd\x85\x77\x50\x93\x97\x8d\x3b\x2c\x22\xdf\x32\xd5\x67\x9a\xbb\x3c\x0c\x64\xe4\x0a\xc8\x53\xf2\x31\x0f\x19\x33\x8e\x5d\x58\xa8\x9b\xb1\x04\x0f\x0f\x99\x94\xb4\x3c\x9c\xca\x0f\xac\x6e\x68\xf1\x1f\xbc\x72\x61\x18\x18\x2f\xcd\xdb\xf2\x5c\x2d\xaa\xee\x72\xc2\x48\x11\x9e\xc3\xac\x3e\xa4\xb1\xf8\xf5\x23\x0d\xc3\xc4\x48\x63\x98\xb4\xca\x91\x83\x47\xab\x51\x18\x42\x4c\x90\x76\xea\x69\xd8\xb6\xfe\x0b\xd6\xe5\xb9\x9a\xc6\x22\x61\xa8\x23\xc7\x3d\x6f\x4f\xb0\x2b\x4d\x05\xec\xcb\x1d\x20\x8c\x22\x4e\x82\xdc\xeb\xdd\x70\xae\x86\x91\x64\xdc\x7a\xac\xb8\x5f\x7f\xee\x79\xc8\x3c\x8c\xd0\xb0\xa2\x57\xab\x6f\xfb\xa7\xfb\x4d\x57\xf8\x0e\x63\xdf\x37\x10\xe6\xfc\x5c\xbf\x8e\x5d\x18\xc7\x5f\x1c\x83\x72\x3a\x51\xb6\xdd\x4b\xed\xf3\x79\x12\x19\x0f\x13\x6e\x9c\xd5\xdb\xb0\xfd\x05\xf5\xa6\x90\xe5\x44\xc3\x9c\x87\x69\x00\x14\x0c\x7c\xaf\xb3\xe2\xb0\x78\x2c\xab\x23\xe4\xdb\xa6\x3a\xcb\xee\x19\xa5\x11\xb7\x54\xbd\x62\xd9\xc1\x4c\xd5\xf2\xb2\xde\x7d\x1b\x6a\x5c\xf1\x90\x6b\x53\x24\x68\x97\x55\x37\xee\x8b\x02\x6a\x08\xa1\x12\x46\xc4\x6c\x7b\xce\xc8\x38\xe2\xee\x3a\x86\x77\x63\xa5\x26\x85\x9b\x5d\x56\x5c\x5e\xca\x73\x33\x4d\xf8\x43\x40\xa3\x05\x91\x43\xdd\x6c\x1b\x84\x9c\xb6\xc3\x21\xd0\x97\x87\x22\x06\xec\x8a\xa3\x97\xf5\xe1\x30\x55\xda\xe3\xa1\x4c\x4d\x05\xe5\xf1\xf7\xdf\xdd\xa7\x54\x02\xba\xeb\xc9\x9d\x8b\x66\x91\xe7\xcb\x73\x96\x1b\x74\xd4\xb0\x11\xe3\xc6\xcb\x28\x4e\x2d\x53\xd2\xc6\x55\xf5\x04\xba\xcf\x43\x0c\x85\xb6\x9a\xee\x24\x27\xd2\x79\x29\xf1\x10\x53\x4f\xf7\x72\xc3\x14\x1b\xee\xca\x8e\x2e\x38\xbe\x2d\x98\x32\xd2\x65\xb5\xfe\x29\xa3\x57\x59\xfb\x46\x31\xb7\x1e\xac\xf5\x1d\x07\xf0\xcb\x78\x2e\xf2\xfc\xc8\xf4\x09\x4e\xf0\x51\xd8\x80\x6d\x7e\x4a\x46\x5e\x2c\x69\xb3\xd8\x9b\xba\xec\xa2\x26\x1e\xe5\x73\x55\x12\xde\x67\xfe\xf4\x3e\x07\xe2\x42\xdf\x66\x15\xfe\x1c\xbe\x42\x91\x2f\x0d\x06\xf6\x11\x3f\x16\xa7\x93\x83\x46\xd9\x83\x01\x93\x3c\xe9\x4a\x74\x8b\x36\x8e\xab\xbb\x63\x3a\xa1\xba\xf7\x30\xdb\x72\xc7\x42\x8f\xf1\xc8\xa9\xab\xb5\xa1\xc6\x4d\x46\xa2\xec\xdd\xf1\x58\x91\xc8\xbb\xd3\x62\xf8\xd5\x1d\x88\xbc\x80\xf0\xa4\x39\x89\xfd\x92\x5e\x60\xf7\x85\x51\x1c\x92\x0a\xfa\x76\xbd\x7a\x7a\xbc\xd9\xb6\x29\xe2\xfe\x61\xf3\xf8\xdd\x31\x20\x79\x14\xf1\xd4\xb3\xee\xe0\xdb\xd7\xec\xb4\xbc\x4c\x7c\xa4\x78\x14\x21\x1a\x67\x4a\x7c\xc7\xaa\x79\x2c\x0b\x59\xc3\x95\x67\x83\x1d\x1b\x7b\x82\x89\x6b\x83\x8c\xb9\x82\x75\x14\x07\x31\x55\x2b\xef\xb3\xbf\xce\xdd\xdd\x4b\xfc\x88\x88\xf0\x16\xc1\xbe\xc5\x2e\x3a\x8f\x92\x04\x7c\xab\x1e\xf9\x2d\xab\x9b\x65\x23\xaf\x24\x89\x79\x94\x06\x8c\xda\x1d\x35\xe8\x71\x5f\x9a\x47\xa9\x45\xf5\x9d\xa0\x6a\x0a\xac\x6c\x3b\xb5\x1e\x99\x30\x4d\xa6\x4d\xaa\x7c\x2a\x04\xed\x2a\x9c\xf8\x24\xf2\x88\x07\x40\xe6\xf8\xae\x82\xd8\xa6\xa5\x9d\xd7\xd7\xff\xd8\x7f\xc6\xa7\xe3\xb1\x22\xa2\x8b\xc0\x66\xe8\xa9\x63\x8f\x42\x1c\xd2\xe4\x30\xa6\xbf\x93\x98\x34\x02\xc9\xa9\x3f\x7d\xbf\xfc\x62\xb1\x8a\x40\x7b\x54\x41\xcf\x14\x16\xcd\x10\x0a\x30\xbe\x10\x11\x08\xa2\x90\xac\x9b\xd7\x0a\xb4\xce\x71\xff\x1e\x08\xf7\xc3\x44\x08\x94\xbd\x17\x70\x9c\xc9\xa9\xdc\x20\xa9\x69\x55\xfc\xfe\xdb\xcd\x66\xf5\xd4\x7d\x54\x45\xd4\x35\x24\x17\x9e\x92\x52\xff\x41\xcf\x21\x12\x88\x84\x1d\xa2\x5f\x78\xdb\x2e\xe2\x23\x59\x01\x1e\x29\xab\xac\xf6\x00\x95\xc8\x71\x0d\x55\x0f\xc4\x9d\x7c\xbf\x4a\x7c\xda\xa5\x6e\xd7\xeb\xfd\x76\x7d\xbf\x5e\xed\xf6\x0f\x8b\x97\xbb\xcd\xe3\x7e\xfb\x7c\xdf\xe5\xc6\x91\x4a\x42\xb4\xaa\x7e\x7b\x23\x68\x6c\x84\xf7\xda\x98\x5d\x4d\x15\x09\xdd\x67\x44\x4c\xd5\x28\x71\xbe\xfc\xea\x30\x56\x3c\xd2\x81\x47\x65\xf1\x36\x6b\xfe\xb1\xde\x8c\x00\xba\xed\x51\x99\xd8\x94\xf9\x01\x7e\xde\x97\x50\x8c\xd9\xe1\x6e\x58\x6c\xaa\xd1\x0a\x2e\xcf\x65\xb3\xfe\x79\xca\x86\x06\x57\x3c\xd2\x49\x80\x64\xfe\xed\x78\x3a\x3c\xd2\x90\x70\x22\xe1\x62\x1b\xed\x75\xcd\x5a\xd2\xaf\x1f\x4f\xa0\xb8\x8d\xba\x82\xde\xd0\xca\x19\xef\x7f\x29\x26\xef\xb6\xc5\xd8\xf3\x83\xc4\xe2\x26\x02\x8a\x81\xaf\xac\x88\x78\xec\x09\x6e\x84\x14\xca\xb3\xc8\x71\x9b\x8d\x56\xc5\xd8\x13\x22\x4c\xa7\x7e\x24\xd3\xa8\x27\xf6\x63\x93\x97\x9a\x52\xda\x6d\x85\xf8\x57\xbb\xa5\x1f\x66\x69\x55\x3c\x0e\x52\x83\xbc\x59\x1a\x16\x6b\x3d\xfa\xc6\x80\x2b\xf2\xa9\x32\xaa\x7b\xfd\xe6\x14\x33\x8f\x13\xd3\xfa\x00\xcd\x2b\x56\x4f\xb9\xba\xc2\xa3\xbb\x81\x5c\xa6\x5e\x7f\xcb\x76\xaf\xf8\x54\x65\x87\x6c\xca\x3f\xe7\x31\xd3\x8c\xca\xb1\x0f\x8b\xdf\xf7\xcb\xef\x7f\x6c\x1e\xf7\x77\x8b\xed\x90\x80\xc8\xe3\x88\x19\xa3\xa6\x57\xa8\x89\x62\xf0\x6c\x99\x55\xe3\x6f\x8c\xe3\x38\x95\x03\x2b\xcf\xae\x61\x1d\xc7\xa9\x1f\xa4\xbd\xda\x9b\xe9\x85\xd6\x56\xf1\xcd\x0d\x4a\x12\x41\x9b\x52\xbb\xbe\xad\x8d\x66\xd1\x97\xa2\xe9\x96\x8b\x31\xfa\x2d\x09\x70\x4a\xa6\x15\x34\xb0\xa5\x70\x73\x65\x85\x0f\xd7\x3f\x9b\x0a\xc6\x09\x7d\x37\x41\x12\x61\x3c\x41\x2a\xc7\x0d\x1d\x40\x10\x79\x9c\x60\x4c\x39\x3c\x09\xe5\x2f\xb3\x11\xcc\x9e\xc7\x29\x08\xda\xdb\xb0\x00\x61\xb7\x4b\x57\x46\x03\x91\xe5\x1d\x0c\x95\xc7\xa9\xf2\xa8\x49\x55\xbf\x56\x59\xf1\xe6\x07\xe9\xe4\x39\xa4\xe8\xa3\x2d\xd1\x3c\xdf\x2f\x76\xd7\x5c\x30\x1e\xf3\x54\xc7\xc1\x00\x3e\x40\x2f\x62\x57\xc1\xff\x32\xa4\x88\xb9\x4c\x49\xb0\xa0\xfe\x80\xd3\xdf\xa8\x05\xf2\x18\x62\xc1\xac\x02\xa5\x51\x84\xba\xcd\xe1\x30\xe5\xab\x10\xc9\x3e\x30\x2a\x7e\x13\xba\xc7\xe8\xe5\x15\x11\x12\x31\x6d\xbb\x7e\x59\x3f\x6e\x76\x7f\xb8\x1b\x22\x52\x13\xf9\x8a\xac\xf9\x28\x2b\x55\xf7\x7a\x4f\xe3\x6a\x53\x2c\xb4\xb1\xb3\x6b\x43\xcb\x6f\x7d\x97\x3f\x96\xca\x33\x02\xde\x65\x05\xa3\xb7\x47\x79\xbe\xb2\xc8\x67\x03\x5e\x7d\x7a\xc7\xaa\xca\x14\x6e\xe6\x29\x0e\x3c\x56\xcc\x28\x0c\x75\xc6\x6c\x4e\x99\xad\xeb\x03\xc5\x2a\x36\x9d\xfd\x13\x75\xc8\xa9\x3c\xe4\x8e\x00\xe7\x68\x9d\x3e\xaf\xe8\x72\x76\x0c\x46\x3c\xb2\xfd\x51\xa2\xe6\x11\x74\xca\x1e\xd3\xe8\x3c\x47\x6b\xa7\x42\xdd\x66\x95\x04\xdd\x75\x5f\x92\x78\x2c\xa1\xfc\xae\x3d\xfd\xae\xec\x9b\x43\xbe\x3b\x9e\x44\xa1\x8d\x4f\x76\x3f\x3f\xe9\x3f\x25\x1e\x9a\x3b\xd9\xee\x62\xd7\xf1\x79\xe2\x47\x4e\x31\xdb\xf0\x18\x4d\x28\x39\x2a\x74\x24\x3e\x37\xc5\x4b\xd3\x0e\x33\xcc\xe1\xf1\xb4\x48\x7c\x19\x44\x9d\x74\xca\xe7\xb3\x2c\x09\x82\xd8\x57\x43\x52\x24\xad\x2b\xf3\x4a\xe4\x3c\x61\xa1\x4f\x3d\x10\x93\xaa\xfe\x80\x03\x81\x35\x9c\xd6\xed\x68\xca\x25\x8c\x2b\xe7\x32\x4f\x13\xe3\x3a\x9c\x4a\x98\x48\xa8\x64\x5a\x94\x0a\xf7\xaf\x38\x94\x11\x77\x23\x74\x20\xc3\x01\xb5\x6e\x2f\xcb\xfc\x6f\x4c\x8f\x78\x12\x06\x2a\xe8\x25\x68\xee\xce\x93\x60\x27\x09\x53\x8c\xcc\x5a\x53\xe0\x07\xe4\xb5\xe9\x82\x2f\xb4\xce\xf2\x0c\x1a\x24\x52\x98\x1b\x2a\x3d\xaf\x33\x76\xd9\xd4\x4f\x45\x6e\x3b\xad\xe3\xdf\x9a\x44\xa6\xb9\xde\xbc\x66\x95\x32\xf1\xb5\xe1\xbd\xad\x0b\xb5\xec\x4d\x34\x78\x92\x70\x4e\xa9\xb6\xd9\xe3\xaa\xfe\xcf\x82\xba\xfe\x96\x9b\xf6\xe4\x94\x3f\xe7\xe3\x30\x0a\x55\xa9\x0f\x0e\xef\x58\x5b\x01\xc4\xee\x54\x1a\xe8\x54\x7b\xea\x3f\x7e\x26\x1b\x39\x39\x61\x9b\xb0\xf9\x24\x29\xda\xde\x31\x7a\x2f\xce\x57\x00\xa6\x84\x73\x4e\x8e\x9d\x3f\x28\xa8\x1b\xf4\xbb\x13\x0e\x9a\xb2\x92\x36\xc9\x36\x3a\xd6\x63\x43\x47\x37\x4c\x80\xb4\x31\x36\x69\x8c\x1f\xb1\x5a\x42\xf1\x66\x54\xd8\x7f\x19\x0f\xd5\xa8\x3a\xf1\x11\x02\xdf\xb8\xef\x82\x30\xa1\x8a\x23\x5a\xd3\x78\x27\x1e\xfe\x4c\x66\xe3\x6a\xa6\xe2\x9a\x88\xc0\xe7\x56\x34\x6c\xff\xe1\xec\xb7\xfc\xee\x68\x12\x3b\xed\x06\x92\xb4\x22\xa4\x73\xf7\xce\x0b\x6e\xb0\x68\x05\x9e\x8f\x50\x75\x0f\x52\xea\x94\x48\x4b\xdd\x7b\xf3\x37\x73\x52\x6a\x10\x43\x6f\xac\x2b\x28\x3f\x4f\x54\x9a\xa8\xa8\x8f\x16\x7a\xef\x70\x77\x5c\xc4\x31\x8e\xe4\xf9\xbb\x23\x52\xd0\x9e\x84\xbd\xd8\x16\x4f\x30\xe4\xc6\xe7\x12\x8a\xf3\x44\xc1\x83\x27\x18\x2b\x2a\x0b\xc3\xe9\x94\x5f\x1c\xb5\xc5\x1d\x53\x9c\x60\xcd\xbb\x73\xd5\xe4\x78\x0b\xd5\xb1\x3f\xa9\x8e\x19\xed\x23\x96\x3e\x6b\x12\xcd\xbd\xa1\x9a\xec\x11\xe4\x6b\x37\x10\x7d\x8a\x45\x29\x12\x7e\x28\x55\xa6\xb3\x81\xa6\xe1\x38\xdc\x4e\x3d\x1e\x53\xcf\xa8\xa0\x95\xf0\x49\x93\x4b\xe4\x2f\xee\xa0\x0c\x28\xc8\xce\xb3\xa6\x01\x9d\x59\x00\x96\xa9\xe3\x4f\x7d\x43\x67\xff\xe9\xe3\xbd\xd4\x67\x46\x88\x85\xf0\xa4\x59\x61\x0d\xab\x3e\xbb\x2c\x5f\xa6\x36\x35\xfd\x13\x65\xf3\x0c\xe7\xda\xea\xd4\xfc\x32\x38\x65\xa0\x0c\x05\xf0\xca\x09\xc8\x1f\xdf\xf2\x94\x45\x48\x3e\x3c\xf7\xe5\x61\x71\xa8\x90\x2a\xee\x8b\x23\x52\x89\x7b\x06\x52\xcd\xd3\xd0\x17\x54\xd7\x90\x64\xff\x7f\xa1\xa6\xc6\xc2\x89\x01\xb7\x69\xe6\x65\x5a\x9c\x75\x1f\x0c\x4d\x73\x7f\xb9\x79\xd8\xec\x6f\x16\x4f\x7b\xe6\xef\x5d\x0b\x23\x0d\x55\xc2\xed\xbe\xfc\x02\x9d\x3e\xf4\xd5\x84\x4d\x43\x65\xda\xcc\xff\xc2\x22\xfb\x39\x24\x92\xf3\x34\x42\x46\x82\xa0\x3d\x6f\xab\x3b\xc0\x0d\xb7\xa8\x76\xa5\x9a\xdb\xb2\x5a\xe4\x57\x61\x91\x1d\x9e\x84\x3e\x35\x06\x4e\x96\xec\x64\xd5\x9f\xdd\x51\xce\xe9\xb9\x3f\xe0\x9f\x50\x77\x97\x9f\x48\x19\xda\x3a\x86\x1e\x38\x58\xdb\xa3\x69\x68\x68\x42\x76\x1d\x5d\xe5\x59\xbf\x6b\xa6\x69\xec\x51\x59\x77\x5f\x63\xa1\x9e\xab\xec\x58\x56\x2a\xb3\xfc\x67\xd2\xdc\xa0\xb2\x08\xbe\xcf\x17\x79\xd2\x94\xf3\xd4\xb0\xbc\x75\x9b\x56\xb8\xd7\x25\xe5\x41\x1a\xd8\x0a\xde\x09\x0b\xd5\x86\xa0\xb7\x55\xf9\x17\x16\x2b\x1c\xfc\xf2\xf1\xcd\xe5\x4c\xd2\x1d\x84\xf6\x2b\x47\x45\xf1\x14\x3c\x85\x16\x8d\x76\x97\x35\xdf\xce\x62\xb4\x2e\xa6\xe0\x87\x04\x32\xa6\x7b\xf6\xa4\x89\x32\x70\xea\x7b\x00\x6e\x5f\x4f\x01\x19\xe3\x5d\x33\xea\x01\xaa\x43\x56\x5c\xb9\x5c\xf1\x54\xf8\xa6\x7d\xd3\x66\xb0\xa7\x0a\xf7\x6f\x17\xb9\x27\x83\x90\xbd\xc2\xa2\x24\xc7\xad\x4f\x48\xc1\x3c\x15\x89\x0e\x6d\x56\x3a\x03\xd1\x48\x85\x66\x84\xfd\x19\xea\x5a\xfe\x85\x55\xd9\x67\xbd\xa9\x64\x71\xd4\x19\x0c\x3f\x64\x87\x0a\x1a\x24\xa0\x94\x3b\x9e\xc4\x54\x94\x3a\x96\x8a\x27\xbe\x37\xcc\xf6\x53\x09\x82\x82\x39\x71\xae\x0a\xaa\x0f\x4e\xeb\x82\xa9\xd4\x06\x91\xd6\x9c\xab\xc2\x18\xe3\xb8\xf3\x2a\xe6\x53\x2a\xfb\xf4\x41\x19\x43\x1b\xf4\xde\x2c\x9e\xba\xa3\xd2\xba\xe3\x99\x39\xbc\x9e\xba\xae\xcc\xdf\x0d\xf4\x19\x2d\xb7\x77\xd8\x74\x5c\xb4\xe7\x2a\x2b\x64\x76\x1a\x23\x7b\x52\x4c\xc1\xb5\x17\x7e\x45\x29\xe1\x6d\xf2\x4c\x50\x28\xda\x07\x8a\xf3\xd1\x19\x21\x74\x8b\xa1\x0e\xbd\xc0\x72\xb1\x56\x39\xd4\x35\xe1\xf1\x4d\x44\x32\x57\x13\x4a\x75\x64\xbc\x1b\x6f\x0e\x13\x26\x43\xaa\x31\x22\x20\xf1\xe2\x50\x65\x24\xf4\xb3\xbb\x9c\xdc\x0d\xe2\x9e\x97\xf8\xa1\xa3\x86\x2f\x1d\x5e\x72\xf6\x87\x73\x1f\x90\x14\xd4\x09\xaa\xb0\xff\xa0\x28\xae\xee\x4d\x28\x3e\xd9\x16\xdd\x44\xe5\x41\xa0\x9d\xf9\xcb\xaa\xcc\x88\xd6\x49\x70\x00\x35\xda\xa4\x79\x00\xc6\x66\x74\xf3\xb8\xfa\x7d\xb8\xe6\xf0\x40\xa5\xb4\x4a\xfe\xfa\xb8\xea\xfe\xa4\x63\x22\xf8\x9c\xca\x99\xfc\xca\x8e\x61\x51\x4a\xee\x97\x53\xcd\x2e\x07\x03\xe3\x2c\xe5\xe4\xb3\xb0\x6e\x57\xdb\x25\x36\x6d\x54\xf8\x02\x7f\x4d\x57\xcb\xee\x77\xb0\x14\x5d\xfd\xd0\x91\x37\x3b\x77\xdb\xd4\x73\x83\x78\x40\x95\xf5\x36\xaf\xc9\x6b\xc3\x47\xb9\xd2\xd4\x1f\xcd\x06\xce\x80\x0f\x60\x58\x7b\x9d\xc3\x61\x7f\xa5\x36\xcb\x39\x93\x46\x5b\x7e\x0b\x79\x59\x64\xa3\x3b\x14\x26\x11\x85\x2a\xa0\x94\x35\xf0\xda\x95\xb4\x6e\x58\x7d\x05\x23\x11\x36\xf2\x1f\x1a\x4d\x15\x1e\x79\x71\xd8\x03\xd6\x9c\xbd\xee\xd8\x21\x83\xf3\xc8\x37\xa2\x70\xb3\x62\x7c\x9f\x08\xed\x70\x1e\x85\xcc\x70\xcb\x2b\x17\x74\x0e\x8e\xa5\xcc\x0f\x5d\xcd\xda\xb8\xad\x0d\xfb\x14\x3c\xe2\xbe\x17\x75\xf6\xd8\xcd\x37\xcc\x4f\x83\xaf\x1d\x9d\x2a\x8e\x8d\x72\x63\xb7\x3b\x77\x81\xf1\x17\x8e\xe3\x9c\xc7\x89\x4f\x1f\x23\xd4\x61\x87\xcb\x9a\xfc\xf0\xc4\x13\x54\x2c\xcc\xea\x7b\xac\xeb\xdd\x2b\x7c\xd2\xbf\xe1\x89\x6f\xa6\xaa\xfd\xf8\xa0\xfa\x39\x7e\x96\x69\xac\x79\x27\x69\x44\x71\xe0\x5d\xbb\x18\x4f\x62\xb8\x76\xe7\x21\x6e\xc2\x7b\x86\x1f\x54\x97\x37\x18\xfb\xfb\xac\x6e\xae\x9a\xf0\x3c\x55\x81\x86\xce\xbc\xee\xb7\x81\xf2\xce\xf4\xac\x4a\x50\x3d\x41\x65\x15\xca\xc6\xb1\x82\xae\xb3\x01\x0e\x09\x0c\x72\xc1\x15\xe6\x28\xa6\x1e\x2c\x93\x19\xf0\xef\xf8\x3f\x83\xff\xed\x4e\x63\x22\xd1\x1c\xea\xc6\x79\xd0\x6e\x5c\x7d\x92\x0b\x0e\x2e\x89\x74\x71\xbe\xc9\x51\xd4\xd3\x67\xeb\x91\x0a\xd2\x38\x76\x56\x2b\x57\xf4\xcd\xf6\xb8\xa2\x48\xfc\x5c\x64\xef\x58\xd5\x4e\x00\xc5\x1d\x4d\x18\x23\x57\xed\x3c\x6b\xfe\x32\x0e\x0b\xee\x10\x0a\x44\x07\x2f\x30\xd6\x75\xa7\x1c\x5d\x0c\xfc\xe9\x42\x83\xca\xe7\x36\xbb\xb0\x25\x95\xfb\xec\xbf\x67\xb3\x3d\x94\x8e\xf8\xca\xc1\x53\x2a\x49\xba\xfd\x7a\x99\xf5\x2e\x17\x53\x60\x26\xf8\x51\x4a\xd9\xbf\x34\x6e\x15\xeb\xdd\x37\x53\xa7\x72\x87\xd1\xa4\x33\xcf\x15\x6e\x56\x4f\xff\x14\x70\x3f\x9e\xf8\x10\x84\x3e\x91\x78\x8c\x3e\x40\x79\x2e\x54\x6d\xca\x14\xbb\xf2\xa5\x6b\xa7\x40\x10\x1a\x5a\xf1\xb9\xc6\x2a\x37\xc2\x16\xf6\x08\x4b\x12\x66\x0b\x69\xcb\xb2\x99\xb2\x01\xdd\x20\x1d\x46\x36\x14\xed\x76\xa1\x2d\x76\x0a\x4b\x76\x54\xe4\x1b\xb5\x28\x09\x79\xee\x8f\x67\x35\x44\xb1\x47\x52\x1e\x3f\x5e\x11\xf3\x27\x7d\x5b\x56\xcd\xb9\xc0\xe9\xa0\x54\x52\x5d\x59\x9f\x3f\x79\x31\x21\xe2\x86\x36\x74\xea\x9b\x4a\xf4\x9b\x6d\x64\xf6\xe5\xc6\x0f\x91\x4c\x28\xe1\xde\x7d\x5b\x13\x8a\xce\xdd\x82\x38\x10\xf4\x98\x1e\xd6\x77\x8b\x87\xc5\xfd\x7d\x6f\x1f\xca\x21\x96\x12\xc3\x6e\x1b\xcf\x8e\xbf\xe2\xa5\x1e\xb6\xeb\x20\xd6\x4a\xb2\x7e\xa9\x58\x34\xbf\x8c\x54\x6f\xec\xa8\x24\x8e\x7a\x78\xd5\x66\xf5\x34\x74\x9c\x6d\x8f\x6a\xc7\x39\xdc\x14\xa7\x73\xf3\x38\xc3\x56\x74\x43\x53\x20\x01\x3e\xeb\x44\xf1\x58\xf6\x38\x38\xe0\x1e\x07\x5b\xf0\x7c\xb2\x78\x8a\x76\x22\x5b\xe9\xd9\x6a\x33\x79\xa8\x5c\xfa\xc2\xfe\xb4\x3d\x25\x29\xfe\x5e\x8c\x80\x75\xc0\x65\xe4\xc9\x8e\x02\x30\x42\x6e\x00\xa4\x9e\x98\x3a\x35\x8c\x2b\x91\x20\xbc\x90\x1a\x48\xaf\xd0\xc8\xd7\xf5\xe1\x30\xa7\x1d\xc7\x41\xf8\xc6\xf1\x71\x57\x9d\xbb\x2f\x16\x49\x82\x51\x6f\x42\xd6\x9d\x51\x32\x9f\xfa\x4a\xc7\xfa\xa0\xa0\x03\x7b\x81\x8c\x38\x95\xa4\x3f\x5e\xa1\xb9\xc9\xd4\xff\x42\x5d\x16\x5b\x70\xc1\x2b\x28\xdf\xd4\x67\x75\x56\x38\x93\xac\xe5\x65\x5d\xa8\x53\x99\xf5\x50\xaa\xd1\x5d\x56\x49\x40\xd7\xb4\x97\x50\x58\xa2\xfe\x6d\x85\x93\x65\x1d\x50\x70\x9a\x8c\xca\xa2\x1b\x76\xa5\x15\x86\x18\xef\xf8\xa0\x21\x21\xa4\x81\xd1\xf7\xb4\x09\xd7\x3f\x66\x5e\x9b\xe9\x34\xfe\x66\x0d\xca\x55\x9c\xa9\x10\xe2\x00\xdc\xe6\xb0\xf0\xbc\x28\xb5\x09\x2c\xd5\x26\x7e\x20\xbe\x8d\x5e\x55\xe1\x85\x18\x5b\x17\x02\x53\xf9\xbf\x2d\xab\xe5\x59\x1d\xf0\x1a\xd0\x72\x95\x9b\x0b\x2f\x11\xe2\xcb\xf8\x61\xa0\xfe\xe4\x3e\x22\xbd\xde\xda\xb6\xf3\x0c\x46\x69\x7c\x8f\x86\xfd\x9e\x29\x49\x54\xf8\xa9\x47\xba\x09\x37\x04\x66\x1b\xed\xc3\x6e\x84\xf6\x29\x40\x36\x3c\xc6\x17\x28\x54\x79\xdc\xce\xc0\x67\x44\x60\xbd\xf5\xcc\x40\x03\x31\x37\x62\x40\xb3\x6b\xab\x08\x38\x70\x8b\x9c\x5a\x3c\x4f\x5e\x1f\x11\x68\x23\x61\x75\x2e\x4c\x96\xf9\x55\x1d\x50\xb0\xc0\x80\xe5\xbf\x3d\x7d\xdf\xae\xf7\xeb\x9b\xbb\xf5\xfe\x66\x43\x86\x4e\xee\x99\x31\xad\x28\x0d\xa4\xe2\xc1\xb2\xfc\xe9\xfe\x1e\xa6\x41\x6a\xda\xfd\x6d\x5e\x36\xe6\xfe\x0e\x6f\x53\x08\x1e\x75\x8d\x4e\x70\x59\x7c\xbd\xd1\x89\x28\x4c\x43\x17\x8e\x4c\x85\x5e\xa7\x43\xd3\x20\x30\x96\xbd\xcd\x0d\xd6\x4d\x55\x5e\x96\xe5\xa4\xf2\x2b\x22\x08\x74\xe2\x8c\x88\x5d\x5b\xc2\x5d\x7e\x1c\x68\x2a\x43\xb5\x41\x03\xd5\x57\xf7\x3a\xec\x8e\xf1\x88\x40\x02\x0d\xc2\xd1\x1f\xee\xed\x22\x8d\x24\xd1\xb0\xb6\xd9\xf1\x94\x93\x98\xb0\xda\x36\x65\x35\x65\x3d\x0b\xce\x8c\x76\x11\x05\x8b\x77\x24\xe7\xef\x4e\xc1\xb9\x6f\x7d\x44\x49\x32\xa7\xeb\xd7\x0b\x08\x62\x6a\x70\xf6\xd8\xc3\x76\x5f\xfe\x65\x82\x9a\x13\x10\x20\x17\x04\xc6\x33\xdf\x3b\xfe\xcd\x90\x24\xda\xa8\x69\x91\xbb\xc7\xe8\xe2\x21\x8d\xa9\x53\xbb\x7b\x45\xdb\xad\x24\x62\x5d\xdf\xc2\x10\x20\x25\x31\xfe\x87\x98\x9b\xc9\xec\x12\x21\x50\x8b\xe5\x07\xe4\x4d\x69\x48\x25\x46\x48\xec\x93\x30\x78\xf2\xdc\x44\x1a\xca\x21\x51\x73\x3d\x68\xa0\x4f\x46\x4a\x9f\xda\x31\xeb\x9f\xd0\xde\x6b\x36\xbe\xc1\xd2\x67\x04\x10\xd8\xdb\xd8\x11\x8a\x77\xa8\xa7\xb0\x1c\x37\x36\x66\x6e\x17\x6b\xc3\xb9\x0e\xad\xd4\x7f\x97\xe4\x11\x4f\x5d\x15\xa1\x19\x34\x37\xdd\x8d\x91\x18\xd2\x8a\x7a\xc1\x66\x51\x94\xcd\x6b\x2f\x32\x7b\x6d\x2f\x6f\x3f\xa2\xc2\x94\xae\xf0\xb7\xfb\x11\xbc\x4d\x28\x6e\xb4\xbe\x3b\xcb\xa8\x6e\xda\x29\x10\x24\x25\xd5\x64\xa7\x7a\x3e\xae\x17\x28\x53\x66\xf1\xfb\x1d\x0c\x9a\xaa\x8a\x83\x7a\xa2\xf4\x3c\x46\x1c\x74\x52\x7e\x7a\xd2\xbf\x5c\x09\x7e\xdb\x71\x3e\x70\xea\x8c\x58\x72\x1b\x49\x11\x4c\x9f\xde\x95\xc1\x0b\x97\x41\xe8\xc7\x03\x47\x1a\x97\x57\x8d\xcf\x1d\xc4\x29\xb7\x17\x4a\xbd\xe6\x9b\xb3\x01\x12\x5c\xa9\xb9\x70\x19\x68\x41\xc5\x8a\x25\x14\x05\x8e\xfb\xb2\x92\xf9\xcc\xef\xbc\xd5\x96\x84\xd9\x71\xf5\xc6\x74\x9a\xed\x4e\x7e\x1d\x63\x01\xa9\x79\x3a\x9f\x9b\xe5\x6e\x35\x29\x92\xfe\xcf\xdc\xb6\x2f\x19\x53\x8e\xe7\xfa\xad\x3c\xd7\xb8\x9e\x68\x05\x8c\x2f\x9e\x45\x46\x82\xbc\x4b\x05\xa8\x42\x36\x3a\x61\x08\x8c\xde\x18\x95\xd5\xa7\x36\xe0\xb0\x8f\x5b\x46\x21\x33\xba\x3b\x25\x76\x22\x86\x9b\x76\xaa\x1b\x0f\x8d\x06\x2b\x0d\x72\x62\xce\x6a\x31\x90\x32\x66\x82\xcb\xde\xff\xfd\x19\xb1\x1a\x73\x0f\x64\x1c\x02\x45\x0a\xf8\xfe\x82\xb2\xac\xae\xf5\xfd\x47\xd7\x18\x4b\x3f\x71\xc6\x49\xb3\x8e\x49\xe3\x7b\x1b\xa3\x32\x36\x60\x76\x51\x7d\x2c\x09\x44\x36\xbe\x35\x89\x1f\x52\x4c\xb4\x07\x29\xf1\xd4\x10\xd0\xcc\x5d\x5d\x92\x98\x78\xe9\xd7\xe5\xa6\x19\xbc\x1c\x32\xf5\x7c\xf4\xbb\xc5\x71\x56\x6a\x9f\x4b\x1e\xc4\xa4\x5d\xb3\x3f\x19\x98\xfd\xfa\x67\x56\x37\xd3\x6f\xe7\x4c\x52\x11\x54\x0a\x92\x01\x1a\x99\x69\x72\xc9\x95\x20\x9e\xd6\x66\xf5\x24\x27\xfa\x3b\x5c\x72\x6d\x30\x39\x7b\x43\x25\xfc\x0b\x6f\x21\xcb\xcf\x15\x3a\x6a\xd8\xe8\xce\x01\x37\xc9\xae\x81\x78\x50\x54\x93\x15\x87\x45\xf7\x4d\x20\x19\xe5\x52\x65\x91\x5f\x06\x9e\xa8\x2b\x28\x6e\xca\xdd\x6b\x56\x77\xe3\x34\xd0\xc2\x68\xb4\xa8\x4c\x07\xcc\x1e\x12\x2c\xa6\xb2\x48\xbb\x55\xed\x7a\x3d\x91\xc9\x33\x11\x2a\x26\xb8\xf3\x9e\xfa\xcf\x76\x36\x10\x44\x6f\xbc\x1c\x4a\xa5\x04\xf5\x6b\xd7\x8b\x97\xfb\x3f\xf6\xcb\xf5\x6e\xbf\x79\x5c\xad\x1f\x77\x9b\xdf\xd6\xfb\xd5\xd3\xc3\xc3\x66\xbb\xdd\x3c\xb9\x3c\x43\x22\xea\x68\x60\xcd\x4e\xeb\xac\x3b\xa6\x83\xd4\xba\x2c\xb5\xb7\xef\xee\x0c\x44\x0c\xc6\x81\x8c\x31\x97\x1a\x12\xaa\xb6\x77\x5d\xae\x47\x63\x8c\x43\x6b\xe2\x9c\x4d\xc5\xdf\xfc\xeb\x4e\x2b\x18\xe5\xc4\xdb\xf2\x7c\x9a\x71\x08\x31\xa3\x94\x1f\x07\x94\x5d\x1e\xe1\x27\x11\x7d\xd5\x40\xa7\x8b\x2b\x5f\x9a\x55\x3f\xab\xd7\x79\x76\xb0\x70\xf8\x49\x8c\xe2\x86\xaa\xc4\xeb\x5d\xda\x6f\xcf\xc5\x50\x07\x40\xf9\x18\x92\x73\xf8\xff\xfe\x6b\xc0\xea\x56\x2c\x96\xd1\x50\xdb\xa8\x42\x9b\x0d\xee\x4a\xbb\x26\x8d\xa7\xac\x0a\x7d\x15\xda\xe0\xd9\x59\xb6\x77\x6b\xa6\x0d\x1b\xed\xc8\x28\x56\x01\xf6\x7d\xbe\x4e\x8d\x99\xf8\xd6\xf5\x6d\x59\xc9\x79\x09\x4d\xae\x22\x15\x3a\xfc\xe3\x8f\xac\x28\xb0\x5a\x5e\x6e\x2a\xf8\x18\xa2\x08\xc6\x1f\x48\x82\x10\xa3\x9e\x59\x58\xe1\x46\x96\xeb\x42\xdd\x5c\xb5\xe2\x55\xa2\x12\xd2\xee\xda\xbe\x3c\xee\xf6\x27\xac\xf6\x3d\x21\x5a\x25\x9a\x79\xdc\x29\xf8\x5b\x01\xfa\x51\xda\xa6\xd2\x38\x20\xd8\xd5\xde\xc4\xc0\x53\x6f\x94\xf1\x57\xa5\x8a\xd1\xe2\x36\x10\x4c\xfa\xbe\xdb\x3c\x3d\xee\x6f\xbe\xbf\x2c\x76\xfd\xec\x55\xa9\x12\xe4\xf3\x95\xd5\xce\x72\x67\xfc\x5c\x79\xc2\x49\x76\x6e\x95\x95\xed\xa3\x5b\xbf\xac\x02\xff\x0b\x2f\xcc\xc9\xcd\x6c\xd7\x76\x6e\x74\xaf\xc6\x3e\x5a\xee\xb8\x8a\x2c\x22\x84\x1e\xd3\x72\xb9\xfb\xe4\xa9\x80\x1f\x10\xb1\x6a\xb1\x7b\x19\xc6\x0a\x4a\x44\x8a\x7a\x2b\xdb\x06\xe1\xad\xff\xa3\x8e\xac\x8e\x8a\x05\xe5\xcf\xf9\x38\x71\x25\x92\x94\xdc\x2c\x4c\x3d\x68\xdb\x80\x9c\xb4\x09\x94\xf4\x62\xaa\x8e\xbe\x97\x0d\x0e\x3b\x23\x4a\x06\x18\xf6\x7a\xc2\x9b\x06\x8f\xff\xe8\xf5\xec\x4f\x1c\x9a\xc6\x8d\xf3\x2e\xcc\xf3\x36\xf0\xea\x9e\xb5\x4a\x4c\xb9\xf3\x80\xcd\xf7\xcd\xcd\xe4\xd9\xb6\x91\x96\xb6\x4d\x9f\x4e\x4c\xdb\x1d\x8b\xa4\x67\x35\x00\xe7\x01\x3a\x0a\x93\x94\x1e\xf8\x0e\x6b\xc3\x6a\x86\xaa\xe7\x8b\xb9\x31\x82\x13\xc2\xcd\x3a\x55\xae\xca\x42\xe6\xe7\x9e\x26\xa4\xb4\x4e\x89\x99\xe8\x76\xb7\x07\x02\x17\x0c\xeb\xc7\xdd\xf7\xa1\x17\xfa\x04\x1c\xbb\x5b\xaf\x7f\xdd\x76\x45\xc7\xf6\xcf\x9a\x0d\xf2\xe0\x1f\xd4\xd3\x40\x35\xd4\xa2\x73\x63\x83\x80\x39\x38\xd8\x8f\xac\x70\x38\x9d\x49\x73\x00\x03\xce\x09\xb9\x2f\xa0\x78\x73\xe2\x12\xee\x90\x4c\xd2\xb8\x53\x33\x19\xd6\x5b\xfb\xeb\x64\x5e\x42\x9a\x72\xee\x37\x2d\xa1\x78\x6b\x77\xbd\xf9\x09\x89\x2c\x10\x5a\xb8\xd4\x89\x64\xe1\x86\xcf\x01\x99\xf0\x65\x87\x04\x6e\xd7\x2a\x2c\x9a\x4c\x66\x9d\x25\xa4\x1d\x16\x32\xec\x88\x02\xf7\xbf\x59\x89\x43\xcf\x9d\x24\x0c\x19\x4d\xb2\x57\xa8\x5f\xbf\x72\x1c\x74\xc3\xd3\x34\xec\xb4\x6f\xf6\x46\x5f\x69\x3f\x10\x57\x68\x07\x10\x54\x72\xf9\xf4\xfd\x71\xf7\xc7\x18\xff\x8a\x51\x24\x09\x37\xe7\xd8\xaa\xf7\xeb\xdf\xd6\xf7\x1d\x75\x04\x63\x0e\x6e\xe9\xb5\x0e\xbe\xcf\x70\xc0\x6d\xd6\xf5\x68\x31\x81\x38\xb6\x49\xc4\xde\x80\x49\xc6\x97\x97\x20\xa7\x36\x19\xad\xa4\x4f\xfa\x3e\xd3\xf8\x77\xa6\xba\x1c\x79\x12\x10\x41\x54\x67\x39\xde\x67\x85\x7b\xc5\x91\xa7\xc6\x3e\xe5\xc7\xf6\xd7\x3f\x06\x5b\x0a\x72\xae\x52\xbf\x73\xd6\x28\x0a\xcc\x6f\xf1\x0b\xeb\xa6\xf1\x33\xe5\x22\x12\xb6\xa0\x4a\x56\xef\x9d\xcf\xfb\xa8\xc4\x84\x10\xc7\xb1\x70\x4d\x57\x03\x0f\xdb\xd7\x59\x71\xc8\xf1\xb1\xec\x28\x91\x08\x10\x53\x16\x5a\x7f\x20\x9e\x76\xe5\x40\x26\x9b\xa3\x40\x30\x11\x74\x85\x38\xc9\x0b\x50\x72\x4c\x4d\x7e\x5a\x94\xe7\x42\xe2\xf2\x5c\x0d\x3e\x29\xa5\x27\xb5\xab\x37\x5a\x67\xc6\x19\xf9\x71\x8e\x52\x31\xa2\xe4\xbc\xc0\x9f\xbb\xce\x31\x83\xa3\x4a\x03\x77\x7f\x6e\xb2\x22\x9b\x7f\x65\x55\x6a\x9e\xa4\xad\x29\x92\x67\xee\xe4\xf4\x8a\x8b\x38\xec\xf4\x5c\x4e\x65\x3d\x11\xc1\x76\xc3\x54\x42\x68\xf0\xd5\x6a\xa2\xaf\x80\x4a\x1b\x81\xc0\x57\xa8\xd4\x07\x54\x38\x52\x7e\x42\x8c\x91\x8a\xae\x9d\x5a\xd1\x90\x4b\x3b\x2e\xf5\xa0\x8e\x18\x95\x10\xf7\x99\x01\xed\xde\x43\xa1\xec\x9a\x99\xba\x21\x4a\x75\x9e\x78\x97\xdb\xaa\xbc\x5a\xac\xcd\x38\xed\x45\x1e\x11\x02\x2c\xf0\x65\x5a\xbe\x1f\x3d\x28\xed\x21\x46\x36\x23\x98\xc1\xb0\x6a\x3f\x30\x1e\x6d\x59\x83\xc7\x7a\x79\x99\x5a\x25\x70\xed\xcb\x90\xca\xcf\xfa\x4a\xbb\xd2\x0e\x08\xfc\x88\x59\x94\x42\x0f\x83\x1c\x90\xec\xbb\xcc\xa3\xbb\xdf\x3a\xe0\x22\x11\x8e\x97\xfd\x86\xc5\xf7\x2a\x7b\xae\x50\x8f\xbf\x38\x50\x66\xe9\x3a\xc2\x1b\x9a\x5f\x3a\xea\x4b\x7e\xc9\xe1\xd7\x4c\x70\xf2\x28\x6e\xaa\xec\x70\xc0\x8a\x18\x50\x43\x45\x88\xfe\xf2\x43\x2f\x74\x2a\x13\x33\x05\x36\xfb\x68\x74\xe4\x09\xf2\x7c\xe9\x28\xb8\x93\x0e\xe3\xec\xea\xab\xa3\x14\x08\x79\x59\x95\x0d\x34\xb8\xcf\x51\x7f\x82\xa6\xd4\x31\xe8\xd0\xae\x4a\xff\xc2\xe6\xd5\x90\x18\xbb\xb5\x7d\x32\x56\x28\x32\x23\x75\x10\xa9\x5e\x16\x98\xeb\xc4\x0b\x74\xdf\x89\xbb\xc9\xe0\x58\x16\x6a\x5a\xd1\xf9\x3b\xb7\x1c\xae\xd3\x50\x12\x1a\x63\x95\x23\x54\xc3\x17\x42\xa7\xa9\x04\x23\x99\xf2\x6d\xb1\x79\x1c\x1f\xe2\x7e\xe0\x3b\xae\x24\xbe\xe5\x17\x07\x4d\x1b\x86\x14\x3a\x95\x2a\xb1\x00\x3c\xfa\xf4\x33\x64\x9f\xde\xc6\xaf\x17\x42\xcd\x3d\x4d\x3a\xf0\x6d\x26\xf6\x5c\xbe\xe1\xb1\x9c\xae\x2f\x9a\x73\xe3\xdd\x65\xa9\x2e\x13\x3f\x4b\x37\x48\xa5\x68\xb4\xfe\x1c\x9b\x65\x40\x29\x9a\x9c\x10\xe2\x80\x9a\x73\x26\xba\x7d\x80\xfa\xed\x9f\x89\xaf\xb7\x9f\x34\xd2\xe9\xe6\x93\x8f\xf8\xd3\xf0\xf2\x3a\xf6\x43\x77\x87\x40\x25\xc4\x49\x6d\x5f\x49\xf3\xca\xfe\xcd\xed\xe9\x3e\x97\xd2\x9c\xc7\x9f\x5d\x7e\xac\x85\x97\x38\x57\x82\xdb\x0a\x71\x48\xb5\x98\x7c\x5a\x42\x60\xdc\xdd\xcf\x97\xe9\x3b\xe6\x46\xc8\x84\x40\x34\xe2\x4c\xa2\x57\xf5\xa2\xe9\x09\x39\x5a\xb1\x90\x98\xec\x2b\x54\xf8\xb3\xfb\x63\x88\xbe\x65\x3c\x13\xbb\x60\x35\x70\x79\xf8\x04\xea\x30\x5c\x26\x54\x12\xaa\x4e\x84\x05\xe7\xac\x23\xaf\x5a\x97\xe3\x99\x6e\xcf\x83\x89\x03\x84\x93\xdb\x06\x14\x8d\xe1\xc9\x4e\x1e\x2d\xa2\x6f\x95\x85\x9c\x27\xd5\xf8\x0e\x69\x15\x93\x55\x06\xe4\x86\x4c\xb9\x2a\xcb\x4a\x65\xc5\x50\x7f\xbf\x1b\xa9\xa9\x54\xbe\xae\x64\xe0\xdd\x74\x66\x93\xe0\x79\x10\x38\x7c\x29\x89\x34\x94\xba\x6b\x55\x18\xba\xbc\x1b\x27\x15\xe9\x98\xdd\x54\xf0\x17\x0e\x77\x24\xf0\x3c\x0d\x04\xa6\x97\xd0\x06\xe3\x43\xd1\xab\x61\x65\x09\x3c\xdf\x37\xbd\xed\xac\x76\xf8\xda\x6f\x50\xff\xfa\xc7\x4a\x57\xe5\xf1\xc7\xfd\xe8\xa7\x83\xe7\x87\x31\x25\xf7\xcf\xbb\x3f\xae\xe4\x0b\x07\x0b\x03\x78\x81\xa7\x69\xe5\xfe\x91\x15\x6a\x74\x59\x81\x9f\x38\xd5\xc8\xdf\x4a\x4b\xc8\xcf\xca\x31\x0e\x0b\xbc\x40\x09\x8a\xfb\x3b\x5c\xff\x73\x59\x8e\xe9\x05\xe0\x31\xee\x53\x54\xbf\xb8\xfb\xfa\x52\x98\xf4\xfd\xa8\xd3\x87\xa6\x3c\xbe\xc7\x2d\x81\x17\x46\xda\x4c\xc8\x97\xa7\xed\x76\xff\xb2\xde\xae\x5f\x7e\x5b\xef\x6f\x77\xbf\x77\x03\x52\x63\xa3\xf2\xfc\xf2\xd4\xf7\x63\xc1\x0b\x39\x27\x44\x38\xc5\x86\xc6\xbc\x6d\x6e\x71\x07\x2f\x8a\x63\x2a\x9a\x1c\xe1\x67\x76\x3c\x1f\x1d\xc3\xf7\xb6\x1a\x6a\x0b\x82\x17\x25\x1e\x15\xa1\x24\xc9\xd5\x37\x96\x51\xcd\x82\xc9\x9d\x89\x38\x97\xf6\xe5\xda\x74\xd3\x25\x92\xca\x33\x4d\x2d\xb5\x82\xca\x8a\x51\xfc\x72\x6d\x5c\xf8\xd5\x3f\xd3\x37\x1d\xbc\xd8\xc7\xa4\xd7\x18\x7a\x44\x68\x26\xb3\x21\x06\x45\x9b\xdd\xa9\xac\x9b\x65\xb7\x2d\xda\x83\x89\x0f\xd2\xeb\x71\x95\x43\x16\x28\x78\x29\x13\x69\xec\x7a\xb6\x20\x9b\xbd\xe1\xe1\xa8\xee\xb8\x10\x69\x97\x8f\x92\xe3\x86\x2b\xf8\xa5\x6e\x04\x4a\x42\xb5\x81\x49\x85\xaf\xe0\xc2\x76\x18\x67\x9e\xa9\x49\x5a\xe4\x43\x0f\x8e\x06\x0f\xa2\x80\x02\x12\x28\x4c\x68\xfa\xcb\x68\xda\x40\x62\x8a\xea\xf4\xab\xee\x1e\x56\xbb\x2f\x27\x19\x70\x46\x5b\xc3\x91\x2a\x1d\xa6\xa1\xd7\x7d\x0f\x22\x65\xdd\xcb\xf3\x65\xdb\x94\xf2\xed\xa5\x94\x6f\x96\x4e\x32\x11\xbc\x73\xff\x8c\x7f\x83\xf2\xac\x61\xa1\xc8\xf2\x7c\x0f\x79\xbe\x1f\x80\x0e\xba\x5b\xaa\x7c\x23\x49\xd8\xd5\xdd\xb6\xe7\xe3\xae\x1c\x77\xc1\xda\x51\x09\x3d\x32\xa3\xcb\x6c\xcc\x00\xdc\x7b\x3f\x0b\xe5\x6a\x3f\x92\x52\xa1\xc6\xe4\x49\xbf\x8f\xde\x66\x15\x29\x69\xf1\x9c\xdf\xeb\x36\x7c\x1a\x6a\x12\xbb\x31\x31\x58\x35\x6b\xa3\xd7\xfb\xf2\x74\xfb\x32\x28\x3e\x80\xa7\x52\x05\xbd\xfb\x80\xd5\x6e\xed\xa6\x82\xe2\x29\x6d\x87\xb6\x1e\x35\xfc\xe5\xe3\xe9\xaa\xa3\x30\xb4\x7d\xcb\x4e\xb7\xf3\x93\xe0\x6f\x7e\xc2\xfb\x5e\x12\x84\x5e\x57\x92\x7d\xc1\xc3\x5c\xff\x02\x7c\x4f\xf8\xe4\xfa\xdb\x97\x0b\xb2\xe2\x26\x7b\xb7\x6a\x6e\xe0\x7b\x2a\x70\x2e\xa6\xfb\xb2\x22\x09\xd3\x1a\xdb\x27\x77\xbc\x2a\xda\x80\xef\x7b\xa8\x60\x0c\x95\xb8\x83\xda\xf8\x59\xcd\x5f\xa5\x1f\x98\x62\x8a\x15\xcb\x75\xc5\x8e\x39\x35\x3d\xf0\xfd\x38\x08\x99\xd5\xea\x70\x50\xa9\xcf\x9c\xc1\xae\x1b\xfe\x53\xab\x37\xf0\xfd\x34\x22\x9c\xd9\x7b\xd9\xe0\xfe\x64\x52\x25\xb5\xb7\x63\x46\x2f\x90\xef\xa3\xe7\x19\x17\x88\xc3\x03\x34\xf2\x35\x2b\x0e\x6b\xfb\x96\x77\x7b\x37\xf8\x2c\x88\x04\x8e\xbd\x9f\xbf\x57\xd9\x2f\xfd\xae\x9d\x3a\xe6\xf2\xb9\xd7\x84\x00\x9f\x45\x26\xa3\x92\xe5\xf1\x74\x6e\x70\xfb\x0a\xac\xab\xa0\xf8\x03\xcc\x58\xfa\x1f\xfb\x81\x30\x8c\xa8\xd9\x8a\xc7\xac\x79\x31\x7a\xd8\x57\x5c\xe4\xc9\x6f\x0d\x39\x90\xea\x9f\x80\xe2\x2d\xf8\x0d\x72\xf7\x7c\x43\x21\xa9\x19\x22\xca\x9f\x54\xff\x8f\xdc\x81\x48\x1b\x87\x4c\x12\x77\x5f\x2f\xee\xdd\xdf\xe3\x30\xd0\xa9\xe3\xe2\x16\x97\x69\xa3\xf5\xdf\xee\x1a\x63\xe9\x87\xa6\x3e\xbd\x91\xe5\x88\x80\xda\x0d\x40\xaa\xcd\x1e\x0d\xee\xb9\xee\xf5\x9b\xc0\x4f\x12\x8f\x04\x05\x0a\xfc\xd9\x3c\x00\x79\x25\xba\x43\x29\x32\xe7\x29\xd4\x06\x77\xdb\x8f\xd2\xc9\x06\x81\xcf\x51\x8b\xc8\x89\x98\x99\x1d\x79\x94\xc1\x83\x0f\x81\x11\x16\xaa\x7b\xbc\x60\x3d\x4c\x6f\xc1\x07\x6e\x32\xbb\xcd\xd3\x72\xbb\x23\xa2\x75\xbf\x44\xf8\x22\x48\x69\x5f\x3b\xc2\xcf\x6d\xcf\xc9\x01\x5f\x08\x64\x91\x4b\xfd\xdb\x58\x70\x34\x79\x84\x66\xa9\x13\xab\x6c\x23\x60\x6a\x38\x2c\x9f\x76\xea\xfa\x75\x94\x1e\xa3\x9a\xa9\xdd\x5f\x17\x9d\x12\xc0\xb3\x95\x41\xb5\xf1\xb9\x1b\xee\xc7\x34\x83\x1b\xe7\x51\x4a\xb4\x70\xbc\x22\x17\x83\x2f\x43\x9f\xa6\xe6\xcb\xcf\xf5\xe2\x7e\x6b\x0a\x87\x03\xc2\x3d\xf8\x52\x87\x54\x0b\xdc\x1c\xe1\x50\x2a\xcc\x46\xbf\x5b\xc5\xa1\x48\xdd\x8d\x7d\x2e\xeb\x66\x23\xcb\xee\x18\xa4\xa4\x13\x61\x5e\x61\xcb\xa5\x79\xc8\x8a\xa9\x74\x0c\xf8\x4a\x1b\xec\x7e\x77\xb5\xb7\x59\xd5\x85\x89\x3e\x86\x92\xa8\x61\x83\x25\x2f\xe8\x8e\x45\x49\xe0\x4c\xbd\xda\x45\x68\x09\x75\x26\x6f\x33\xcc\x07\x2a\x97\x9f\xa5\x51\xe3\x09\x80\x49\x88\x7a\x6c\x1e\x84\xd5\xae\xdc\xe8\xe7\xb2\xae\x33\xf1\x59\xe0\xe3\x23\x20\x29\x27\x88\xf3\x85\x7c\x75\x88\x29\x7a\x67\x4b\xcb\xdd\x9b\x8c\x52\x6b\x87\x1b\x5f\x5e\xda\x5f\x22\x5f\xb1\x1e\xf4\xb0\xa7\x88\xd0\xff\x0c\x20\x37\xe0\xeb\x80\x47\xe1\xa0\xb4\xb2\x2d\xca\x0f\x9d\xc3\x9b\x83\x33\xcc\x31\xea\xc1\xd7\xa1\x47\xcc\xe8\x97\xbb\xdf\x3f\xb3\x9b\x9f\x2e\x88\xa9\xfb\x28\x17\xa4\x36\xfb\x58\xfe\x2c\x8b\x4d\x27\xdb\x04\x81\x17\xa4\xa2\x0f\x97\xda\xf9\xf2\x0d\x2a\x25\x61\xac\xb5\x07\x81\x1f\x08\x02\xce\xb9\xdb\xe9\x8a\x56\x73\x65\x19\x08\xfc\x44\x11\x63\x22\x2f\x0f\x56\xb2\xad\xfa\x64\x63\x08\x7c\x19\xd3\x7c\xd5\x59\xa1\xf6\x50\xa8\x7d\x59\xed\x4d\x2a\x83\xd5\xfe\x5c\x5f\x57\x21\xdc\xe7\x94\x4f\xb3\xc8\x6c\x7b\xdf\x8b\x76\x4d\xcd\xb1\x31\x26\x89\xd7\xbd\x7e\x08\x82\x40\x2b\xdb\x31\x5f\x1c\x45\x86\x45\x73\x9f\x1d\x5e\x1b\x2b\x01\x45\x7b\x57\x3d\xfd\x08\x22\xc5\x30\xf7\x4f\x77\xfb\xf5\x11\xab\x03\x16\xf2\xd2\x33\x87\x7f\x2b\x07\xda\xf0\xfd\xee\x10\x30\x69\x9c\x1b\x6a\xf9\x8a\xea\x9c\xa3\xc5\xb7\x4d\xfb\xfa\x0e\x84\x34\xd3\x21\x80\x20\x4c\x3c\xea\xb5\x10\xfd\xc5\x2a\x00\xd8\x43\x91\x2f\xa9\xf5\x40\x8c\xc1\xfd\xf2\x5c\x15\xdf\xfb\x66\xd4\xed\x80\x2b\x34\x39\x65\x14\x1a\x3b\x2d\x63\x5e\x84\xa7\x06\xd5\x5d\xcf\x3f\x83\x20\xd2\x01\xe9\x0d\x19\x37\xaf\x76\x67\x9b\x13\xf4\x1c\x3f\x85\x58\x44\xe4\x4d\xb4\x6e\x5e\xf7\x56\xb0\xab\xbf\xd0\x84\x99\x6a\x42\x9b\x20\x5f\xa0\x68\x6e\xaa\x32\x6b\xd6\x64\x1a\x90\xfd\xf7\x8c\xfb\x55\x79\x3c\x35\xb8\x4f\x27\x53\x2d\x09\x8d\x60\xcc\xc9\x00\x3e\x96\xe7\x79\x7d\x74\x08\x12\x48\x5d\x1d\xf5\xc1\xe8\x51\xac\x0b\x55\x7e\x1c\xe7\x64\xcb\xe7\x27\x5f\x2a\x00\xd1\x01\xef\x21\xff\x51\x56\xb9\x32\x24\xee\x97\xb2\x9d\x80\xbd\x56\xa3\x1f\xd8\x57\x29\xe0\x11\xca\xc0\x86\xac\x56\xd3\x6e\xbc\xe1\x05\x1c\x02\x92\xa7\xa6\x1b\x39\x15\x87\xfd\xfa\x82\x80\xf9\x44\x10\x7c\x7c\xf8\xf5\x97\xee\x4f\x4c\x4b\xb7\xe5\x90\x1b\xc2\xcb\xfa\x79\xc8\x53\x83\x00\x78\xc4\xb9\xcd\x9a\x77\xaf\x59\xbd\x2b\xcd\x1b\x67\x0f\x0b\x99\xd2\x0e\x5f\x92\xe9\xf6\xc0\x7f\xfb\x93\x57\x52\x06\x4c\x0d\x74\xba\x4c\xae\x32\x09\x5c\x03\x19\x18\x1f\x21\x45\x04\x5f\x6a\x91\x4f\x6e\x83\x0c\x19\xb9\x3f\x14\xf8\x61\x22\x24\x6a\x86\x4c\x3a\x47\x6e\x6c\xcc\x95\x6f\x14\x4b\xb2\x3f\xcf\x50\xa0\xf3\xe5\x82\x40\x62\x1c\x19\xda\x99\x39\x8b\x79\x99\x5c\x9e\x12\xa8\x50\x52\x98\xb2\xdf\xdf\x90\x8f\xa4\x51\x5f\x6e\x46\xaa\xb2\xf3\xd3\x47\x81\x69\xac\x3f\xde\x0f\xb7\xc0\x00\x99\x01\x84\x58\xfd\x08\x5d\x56\x47\x13\xd5\xb8\xe3\x60\xfa\x6e\x6d\x24\xb3\x7a\x6d\x43\x8a\xe2\x80\xb7\x16\x83\xe1\x06\xe9\x20\xa5\xc2\x33\xdd\xba\x1f\x88\x6f\xdd\x5b\xa6\x43\x46\x15\x67\x9b\xda\x6d\xac\x0c\x51\xbf\xaa\xec\x10\x8e\x4b\x52\xfb\xed\x3e\xc2\x51\x98\x0a\x4f\x53\x65\xf8\x4e\x70\xfa\xa9\xb4\x1e\x04\x1a\x7d\x82\x2f\x17\x5d\x08\xc5\x3c\xdf\x58\x1c\x8b\x76\x8d\x28\xce\x9d\x01\x70\x77\x3c\x8c\x7c\x7f\x98\xa5\xc0\x11\x9b\x81\x3f\xd7\x90\x46\x3f\xf7\x7f\xee\x34\x18\x50\xa5\xf2\xf7\x0c\xca\x87\xf3\xc3\x79\x78\x3b\x99\x1f\xdb\x0c\x8f\xb8\xe7\x26\x04\x6b\xb3\xae\xfb\x87\xc7\xa7\xf9\xf7\x9a\xf9\x89\x8e\x2d\x6e\x54\x65\x35\xa1\xaf\x4f\x57\xc5\x7d\x60\xbe\x08\xb8\x6b\x33\x19\x21\x63\xda\x89\xe5\xdb\x44\x7a\x09\x98\x2f\x23\x02\xe9\xef\xcb\x13\x16\xed\x9a\x77\x5f\x96\xa7\xee\x02\xa5\x24\x9d\xbb\x6a\xe0\x36\x3d\x1f\x5b\x33\x5f\x45\xb4\x32\x1d\xb3\xa2\xd9\x55\xe7\xba\xf9\x44\x8c\x0d\x58\x10\x87\xa4\xee\xf9\x88\xe7\x1c\x1c\xcf\x0f\x58\x00\xa9\xb6\xa2\xd1\xb5\x29\x2d\xcc\x2e\xab\x2c\x90\x3c\x22\x54\xe1\xc3\xf3\xee\x8f\xfd\xf3\xf7\xe5\xfd\x66\xb5\xff\x75\xfd\xc7\xde\xf5\x6e\x81\xb1\x38\x01\x83\xc3\x7c\x7f\x80\x76\xad\x5a\x1c\xbb\xaf\x61\x89\x24\x1d\x45\xd1\x66\x30\x86\xc9\xfb\xad\xcc\xd5\x5c\xd1\x8a\x31\xa5\x02\xc3\x24\x7d\xc7\xbc\x3c\x61\xb5\x77\xca\x58\xfb\xd3\x48\x54\x72\xf2\x0b\x43\xdf\x60\x25\x24\x34\xf5\x00\x2c\x61\x38\x56\xee\x42\xc2\x54\x11\x35\xe0\xf6\x2c\xdf\xd6\x2f\xe6\x05\x66\xcc\x1d\x8d\x82\x98\x8a\x58\x72\x68\x79\xf5\xff\xd1\xea\xea\x0a\x2c\x0d\x2c\xe2\x26\x4c\x5a\x17\x2a\xec\xbe\x4a\x69\xaa\x3a\x9b\x86\xec\x40\xa9\x00\x58\x84\xa9\x37\x82\xfe\x18\xc4\x89\x3b\x1c\x87\xc0\x1d\x8e\x81\xfa\x8b\x8e\xf1\xfb\x89\x9f\xca\x30\xec\x62\x31\x28\x9a\xa2\x1d\x8e\xf4\xc5\x92\xfa\xcc\x4a\x4e\x6b\xf0\x3f\x00\xa4\x02\x4b\x99\x41\xbe\x1d\xcb\xa2\x79\x65\x9e\x4d\x17\xba\xad\x96\x71\x3f\x34\xf6\x2d\x85\xda\xc8\x72\x60\x0b\x0f\x4c\x30\x18\xfa\x29\xb9\xcb\x9e\xdc\x67\xe7\x03\x09\x4c\x70\x23\xec\x67\x38\xf6\xf3\xf3\x53\xa8\x48\xe9\x81\x93\xdb\xd7\x51\x02\x93\x41\xea\xc3\x50\xd5\xbe\x99\x6a\xf8\x03\x53\x41\x6a\xcd\x29\xda\x20\xc2\x3e\x83\x61\x76\xc5\x54\xe8\xd3\x8c\x6b\x93\xc8\x4d\xbd\x6d\x20\xb7\xdd\xed\xd0\x0d\x88\xbc\x14\xba\x53\x94\xdd\x23\x54\x09\x3a\x2e\xe9\xa0\x5a\xd1\x1d\x4d\x39\xe9\x99\xbd\x9b\x8d\x9a\x76\x32\xcb\x36\xce\xfa\x69\x80\x02\xb0\xd3\x05\x2c\x74\x76\x58\x96\xe5\x98\x63\x0c\x4c\xfb\x06\xfc\xa0\xf0\xfd\x16\x71\x52\x03\x65\x3a\x96\x94\x52\xfe\x59\x66\xc5\x5d\x55\x9e\x4f\x0b\xe7\x46\xfc\xcb\x5c\x01\x2d\xf4\x62\xcb\x4c\x72\xf3\x72\x57\xde\xb6\x8f\x75\x76\x82\x84\x1e\xe7\x44\xb4\x21\x3f\xca\xf3\xf1\x39\x3b\xd0\x24\x27\xbb\xfd\x5f\xdc\x18\x69\xe4\x9c\x16\x2f\xab\x6f\xeb\xdd\x1f\xcf\x8b\xfb\x51\x5d\x2c\xf4\x43\x11\x58\xad\xfc\x1d\xfc\x9c\x51\x93\x86\xd0\x17\xa6\x41\xa6\x4a\x93\x16\x7f\x16\xd5\xcc\xae\x9f\x61\x10\xfa\xa9\xe8\x4c\xc5\x8e\xa4\x6e\x30\x4a\x4e\xc3\x36\x22\x6b\x97\xfe\xc5\xea\xfe\x8f\x1b\x99\xa9\x01\xd1\x08\x42\x16\x99\x8e\x89\x31\xc7\xb7\x68\x32\x33\x53\xea\x6e\x4c\x9c\x10\x6c\xf0\xa3\x5d\xfa\x46\x6a\x32\x10\x32\x8e\x14\x97\x0d\xa0\xd3\x2f\xf0\xe1\x54\x40\x3f\xb9\xf4\x71\x5d\xa9\x8f\xf2\x43\x26\x3c\x02\xcf\x3f\xbf\x6c\x7e\x5b\xec\xd6\x7b\x2b\x2f\xbe\xeb\x2a\x28\x21\x13\x09\x75\xb2\xcf\xc5\x2b\xe4\xcd\x0d\xf1\x0c\x07\x8a\xcd\x10\x86\x29\x4b\xac\xac\x5a\xbb\x25\xae\x8f\x90\x8d\x50\xb9\x10\x46\xa1\x22\xe0\xee\x8f\xb2\x50\x58\xdd\x94\x87\x59\xb4\xc6\x79\x4a\x5a\x84\x30\xf6\xb9\xb3\x17\xa1\xcc\x77\x84\xbb\x85\x30\x66\x8c\x76\xb2\xed\x2b\x01\x82\xff\xf1\x59\x59\x48\x26\xc4\x86\x66\x9f\x63\x5d\xf7\xb0\xa5\xf1\xa3\x8e\x95\xd1\xc2\xdd\x2d\x56\x4f\x5b\xf7\xad\x89\xa7\x08\x17\xfe\x5e\x36\x04\x62\x34\x3a\x96\xd3\x1b\x3f\xb8\xc7\x09\x8f\x05\xef\x34\x13\x37\xfa\xc5\x38\x21\x59\xf6\xe9\x43\x56\x2c\x0a\x75\x93\x75\xbf\x2a\x91\x82\xf6\x32\xca\x8c\x1c\xdc\xcc\x1e\x4b\x63\x49\x84\xab\x63\x69\xa9\xa3\xee\x00\xf7\x44\x6a\x55\xaa\xb1\xc2\xf3\xf1\xb6\xac\xde\x16\x95\xc8\x3a\x85\x11\x08\x39\x48\xd2\xc7\x80\x3c\xdf\x4a\x38\xd6\x4e\x8f\xd8\x1e\x86\xc0\x10\x82\x4d\x23\x63\x5e\xf5\x09\x42\x88\x81\xa6\xf6\x7d\x79\xe8\x4c\x63\xc7\x77\xdc\x0d\xd4\x5e\x40\x78\x8d\xb2\xd0\x58\x61\x21\x71\x45\xc2\x18\x8e\xc6\xda\x0d\x93\xd6\x1d\x8a\x4a\xcf\xf3\xda\x1e\x10\x8a\xd0\x00\x65\x88\x3a\xb4\xb7\x7d\x8d\x19\x48\x0d\x84\x82\x2b\x89\xbd\x9b\xd4\x12\x9b\xa1\x60\x13\x84\x02\x52\xb4\x00\x8e\xa7\x73\x43\xea\xb2\x83\x6d\x37\x94\x21\x23\xa6\x8d\x85\xe0\x52\xb8\xf7\x59\xcd\xc6\x7d\x44\x06\x14\xe8\x19\xfa\xe9\x33\x5c\x8e\x83\xb7\x55\xca\x84\xbe\x4e\x65\xef\xef\x97\xbf\x3b\x11\x06\xa6\xe0\xd4\xae\x0c\xc3\x47\xa3\xb4\x24\x91\x29\x81\xc5\xb8\x11\x17\x62\xac\xd0\x36\x01\xda\xd9\xf0\xa4\xdb\x94\x8a\x5c\x19\x46\x31\x72\x88\x3a\xf2\x4d\xdf\x94\xb2\x97\x36\xad\xfa\xbb\x3e\xfe\xe8\xd2\x50\x43\x64\x8c\xc3\x0a\xac\x5f\x2b\xf8\x73\xb4\xe4\x6a\x2f\x35\x72\xbb\x39\x42\xf5\x5b\x99\x9f\x8f\xe8\xfc\x8c\xdc\x15\x44\x1e\x0b\x03\xab\x84\xf1\x0e\x0d\x0e\x94\xfe\xed\x00\x9f\xc5\xd0\xb1\xc3\x4c\x2d\x60\x8b\x4d\x43\x92\xb5\xb3\x93\x22\xf2\x23\x49\xa9\xcf\xe9\x50\x9a\xac\x0c\x95\x21\xeb\x66\xcd\x65\x72\x6e\xc9\xc2\xde\x12\xf3\xbe\x84\xe2\x49\x6b\xac\x06\x19\xed\xbf\x79\x9f\x11\x24\xff\xb1\xcd\xa0\x7f\x87\xff\xf9\x9f\x6b\xbb\x2c\x88\x02\xcf\xa8\xdf\x99\x25\xbc\xea\xa2\xf0\x88\xc5\xb1\xf4\x3b\x85\x49\xb3\x29\x04\x30\x1f\x62\xd9\x8f\xc4\x10\x1a\x33\x4b\x0a\x70\x6d\x5e\x68\x62\xe1\xf1\x62\x14\x25\x89\x4f\xe8\xf7\xad\x29\x25\x3f\xfc\xba\x19\xef\xcd\x51\xa2\x8c\x05\xc8\xfa\x98\x0d\x59\xd2\x10\xa5\x7e\xa4\xa3\x8e\x06\x43\x8a\x59\xdf\xeb\xab\xf3\xa7\x21\x62\x3c\x12\x63\xfc\x57\x79\x14\x19\x7e\xf4\x8e\x14\xbe\xfb\xaa\x54\xc6\xa4\xdc\xb2\xfe\xbe\xbd\xe9\xbe\x45\x72\x52\x96\x70\x72\xda\x2f\x7d\x85\x3c\x4a\x25\xd0\xda\x73\xd3\xee\x31\x9e\xbf\xff\xdf\xef\x8f\xfb\xc0\xf3\x53\x77\x9c\x33\x8f\x28\x66\x87\xec\x1d\x7f\x85\xea\x08\x5f\x75\xfc\x22\x1e\xc5\xc9\x08\xe9\x33\x1b\xbe\xba\x88\x26\xe2\x31\x50\x84\xbe\x5e\x3a\x2d\xd0\x36\x67\x96\xd4\x59\xfb\xa8\xa6\x45\xc2\x88\x73\x29\x98\x7b\xba\x8b\x5e\xe7\x1f\x22\x0e\x46\xa9\xe7\xce\x89\xe4\xed\x6f\xab\xf2\x38\xf4\xf0\x1d\xc6\xcd\x11\xf8\x46\x2c\x41\x96\x59\xa1\xaa\xf2\x54\x8f\xde\xc9\x08\x02\xe3\xd6\xd9\xe6\x61\xf0\xd3\xfd\x55\x04\x40\xdd\x4c\x2b\x61\x66\x43\xc8\xf1\x15\x8a\x28\xa6\xb7\xf9\x70\x86\x4a\x65\x50\xf8\x54\xc3\xb3\x07\x65\xe0\x91\xaa\xdd\x03\xca\x6d\x03\x85\x82\x4a\xfd\xc3\x8d\x31\x92\x2c\x20\xf3\x10\x5d\x92\x53\x57\x3d\x94\xba\x81\x88\xb6\x3e\x43\x2e\x74\x7e\x4f\xa3\xcb\x8a\x3d\x34\x36\x16\x7f\x9c\xeb\xb3\x35\x87\x6c\xff\x98\x70\x53\x07\xc3\xcd\xea\xc9\x34\xd7\xec\x21\x3f\x88\xc2\xc8\xb1\xce\xab\xaa\xfc\xe8\x84\x96\x3e\xe1\x9f\xda\xcf\x05\x3a\x20\x37\x70\x93\x06\xed\x10\x8e\x0b\xab\x9f\x69\x83\xf2\xf1\x8d\x8e\x59\x6c\x4c\x15\x6a\x6c\x1e\xb3\xe2\x4f\x98\xe5\xb7\x43\xcc\x24\x52\x0a\x0d\x79\x5e\x7e\x4c\x60\xde\x83\xed\x3c\x0e\x41\x51\xcb\x85\xe6\x47\xfb\x1e\x39\x7a\x5a\x97\xc8\xc4\x21\x98\x66\x51\x9b\xa5\x2f\x33\xe5\x0a\x95\x7f\xbb\xe6\xda\x34\x70\xf0\x5d\xda\x5c\x3a\xd9\x02\x8f\x2b\xae\x7f\x17\xb4\xce\x26\x31\x71\xe4\xb1\x24\x1d\xc8\xfc\x6d\x6e\x5e\xd0\xa4\x8b\xcd\xeb\xee\xe7\x38\x15\x88\x23\xcf\x08\xd9\x12\x0c\x78\x57\x3a\x69\x9d\xed\x07\x9c\x9e\xc8\xe9\xe4\x9f\xca\x15\xd8\xf3\xc5\x2c\xa6\x7a\x42\x79\x32\xf8\xfd\x6a\x9d\xc3\xa9\xee\x6f\x5b\x1c\x19\x9c\x5f\x56\x3b\xd5\x92\xc9\x23\x8a\x39\xd8\xdc\xa8\xd9\x9d\x6b\xf5\x62\xc0\x42\x97\xc9\xa8\x24\x60\xd2\xb8\xfc\xab\x87\xc2\x6d\xfc\x71\xea\x79\x04\x59\x26\x98\xb5\xd5\x69\xae\x0d\xf3\x15\xfb\x41\xbe\x61\x73\x7f\x60\xf6\x83\x8c\xf7\x9e\xba\x89\x9c\x06\x06\x1b\xf6\x5b\x36\x64\x7a\x42\xcc\xa3\x88\x9e\x35\x85\x6b\xae\x00\xf6\xbd\xa8\x4f\x6d\x62\x30\x34\xec\x83\x18\x42\x8e\xf6\xf2\x97\x56\x77\xa6\x9e\x80\xcf\x21\x16\x3e\x4b\x2c\xdf\x82\xf2\x86\xed\xd3\xbd\x5b\x62\x63\x81\x9c\xe0\x4f\x6d\x92\x77\xec\x98\x1b\x93\xd7\x50\xfa\x41\x64\x13\xa0\xdb\xed\xee\xd7\x15\xb6\xb3\x3d\x9f\xdc\x23\xc9\x93\xc8\x1b\xe4\xf4\xbb\xd2\x64\x71\xfd\xad\x90\xe0\xa7\xd6\xf4\x75\x71\xb0\xae\xc0\xed\xce\x41\x32\x18\xb3\x01\x4c\x2c\x65\x8c\x86\xa3\xd1\xae\x8e\x66\xd9\xb1\x49\x7e\x97\xc7\xc6\x0a\x31\xb5\xe0\xc2\x5f\x71\x5e\x93\x1a\x62\xd4\x81\x46\xcb\x0a\x26\xf8\x8a\xfb\xb4\xf6\x12\xda\x28\xda\x17\x62\x55\x1e\x4f\xed\x4a\x75\xe5\x5e\xfd\x65\x75\x3a\xd6\xbe\xa4\x0e\x01\x69\x35\x95\x15\x21\xee\xbb\xd3\xc7\x09\x71\xe2\xb6\x59\x71\x38\xe7\x44\x80\xdc\x61\x1d\xc4\xdd\xf1\x44\x53\x42\xd2\xde\x94\x3c\x27\x90\xf0\xf6\x15\xbe\x41\xfd\xda\x75\x20\x12\xcf\xf3\x54\x3c\x42\xab\x8e\xde\xaa\xc4\x13\x21\x19\x09\x9e\x90\x16\xd1\x81\x90\x44\x7b\x4c\x51\x78\x0d\x4d\x03\xf2\x6d\x97\x11\x4d\x8a\x38\x77\x59\x71\xa0\x3d\xfb\xdc\x3b\x14\xcf\xe4\x73\x49\x10\x83\x14\xae\x17\x60\xe6\xf6\x95\xc7\x3c\x24\x41\x62\x34\xb3\xcc\xfb\x4c\xd4\xbf\x01\x76\xdb\x4d\xc5\x24\x50\x9c\x9a\x4d\xdb\xf5\xa3\x51\x8b\x5f\xef\xbe\xed\x97\x8b\xed\x7a\xff\xb2\x70\xa2\xf1\x90\xb0\x44\x44\x4e\x1d\xc3\xf4\x42\x42\xd7\x09\x4d\x42\x16\x70\xe9\x56\x90\xbe\xc2\xf6\x5c\x19\xf0\x44\x37\x2c\x65\xee\xbd\x1e\x9a\x99\x4c\x9a\xf4\x49\x14\x31\x72\x3d\x7d\x87\x73\xde\x90\x34\x64\x17\xe2\x25\x91\x62\xbe\x29\xb0\x3b\x1f\xce\xc9\x6d\x8f\x3d\xd3\x90\x79\x7b\xdb\xac\x9e\x76\x58\x37\xa9\xf7\x4b\x77\x48\xe9\xb4\x17\x83\xf7\xf7\xef\xe5\x47\xf7\x38\x63\x8e\x03\xbb\x37\xca\x7c\x8d\x79\xd3\xe0\xae\xc7\xc0\xe8\xbd\x7c\x80\xd7\x3f\xcb\xe2\xd0\x6b\x6d\x42\x92\x78\x10\x4a\xd7\x4d\xff\x20\x50\xe6\xa6\xae\xcf\xf8\xb5\x73\x30\x24\x09\x53\x04\x88\x14\x79\xc7\x55\x80\x24\x51\x1e\x95\xa0\xc4\xf9\x62\xcd\xb8\x56\xaf\x53\xd0\x3d\x24\xa9\x27\xa8\xf6\x5f\xbe\x63\x95\x97\xa0\x50\x3d\x60\xf3\x5a\x7e\x49\x4b\x85\x24\x0d\x22\xa3\x9d\x7a\xae\xaa\x7d\x31\xcc\x99\x92\x34\x4a\x29\x7e\x34\xf6\x0e\x7b\x43\x72\x1a\xba\xa9\xbb\x71\x09\x53\xb6\xef\xdd\xce\x04\x28\x5c\x0d\x3f\xe1\xa1\xb1\x54\x95\x65\x51\x93\x53\xc7\x0f\x84\x93\xa5\xb4\x6f\xd4\x6d\x59\x8d\xe3\x9c\xc9\xbd\xe0\xca\x50\xb3\xf0\xbf\x67\xc8\xaf\xc0\xeb\xa3\x5f\xc1\x35\x63\x46\x90\x21\xfb\xef\x19\x0b\xac\x6b\xd3\xfd\xb2\x87\xc1\xf3\xc3\xc0\x79\xb2\x1d\xa1\x7a\xf3\x47\x95\x8a\x04\x12\x9f\xd2\x68\x22\x44\xf5\xcc\x4e\xe1\x3e\x2f\x22\x45\x5c\xa3\x13\xca\x73\x91\x95\x16\x02\x3e\x2c\x4a\x24\x32\x30\x98\xc7\xbc\x2c\xdf\xce\x27\x92\xda\xbb\xc1\x06\xb2\xbc\x9e\xd4\xd2\x12\x09\x42\xa9\x8e\xd9\x63\xad\x71\x06\x5d\x8b\xf1\x3b\x2b\x11\x88\x59\x5f\x37\xe5\xe9\x85\xe0\xaf\xdd\x14\xd5\xa1\xa2\xaa\x63\x95\x1d\x5e\x1b\x9f\x4d\xbe\x46\x47\x8c\x40\x90\x27\x53\x47\x7a\xd2\x77\x65\x07\xa8\x49\x74\x62\x44\xf6\x1d\xfd\xd6\x0a\x9d\x4c\x4f\xc1\x83\xd0\x49\x7b\x41\xf1\xe6\xb9\xb8\x3d\xf5\xfc\x94\x30\x6d\x8b\xf7\x0c\x56\x9e\x5f\x74\x7f\x67\xc6\x2b\x88\x6a\xf7\x06\xea\xb6\x2b\xdb\x48\x6d\x76\xad\x66\x81\x7b\xc5\x53\xdf\x4f\x85\x11\x18\x3b\xd7\x0d\xbd\x47\xa3\xbb\x90\x06\x31\xa7\x89\x64\x09\x25\x5f\xd9\x81\x43\x1a\x68\xa0\x8c\xc9\x76\x2f\xb7\xb6\x93\xbd\x32\x4c\x39\xbc\x52\xfc\xf8\x47\x98\x76\x48\x19\x28\x82\xf7\xde\x94\xbb\x51\x47\xfc\xef\x8a\xfc\xe3\x8b\x0b\x03\x24\x07\x54\xd3\xfa\x6f\xef\xcd\xf8\xa6\xa7\x61\x1c\x53\xa1\xf0\x7e\xf9\x7f\x5f\x65\x43\x69\x08\x46\x3f\xef\x88\xed\x3b\x6b\x76\xcb\xc9\x99\x84\xc6\x5e\x1b\x65\x26\xa6\x4d\x23\x3f\x4d\x23\xb3\xb0\x98\x92\xe8\xf0\x98\x30\xfa\xa1\x16\xe2\xed\x3e\xfd\x55\x8d\x34\x8d\x84\x11\x9f\xb9\x41\x50\xa7\xb2\xcc\x83\x97\x76\x5e\x15\x65\x75\x5b\xa1\x93\xc0\x80\x34\x92\x09\x74\x25\x6d\xa3\xb4\xbf\x3d\xd1\x42\x70\x4d\x83\x81\x34\x66\x48\x0d\xe0\xff\x2d\xab\xc3\x28\x04\x4b\x13\xcf\x73\xf2\x55\x2f\x58\xc0\x91\x76\xd5\x29\x4d\x1d\xd2\xc4\x37\xe0\xc0\xfb\xa7\x1f\x7b\x32\xf3\x1f\x6e\x63\x69\xe2\x47\x81\xe8\x10\xe8\xbd\xc6\xc6\xe4\x1c\x3c\x66\xdd\x66\xd7\xd5\x40\xd3\x04\xbc\x01\x71\x60\xd3\xe0\xb1\x9e\x86\x77\xd3\x86\x63\x9a\x06\x61\xdc\x21\x88\x86\x78\xe4\xb4\xbd\x7d\xed\xd3\xf8\xfe\x78\xb3\x7e\xf9\xb1\xf8\x63\xbf\xdd\x2d\x76\xdf\x5d\x01\x32\xe5\x32\x26\x72\x19\xb5\x09\x57\x83\xda\x78\x0a\x1e\x90\x94\xf6\x73\x5e\x36\x3b\xac\x2a\x70\x95\x94\xcf\x5a\x1b\xf3\xb0\xa3\x14\x7c\xa0\x8d\xd6\xac\xf4\xdd\xd9\x43\x46\x3d\xa6\x7f\x65\x87\x6c\xb0\xc5\xa5\x10\xc7\x84\x8b\x06\x51\x97\xf9\xb9\xc1\x07\x63\xaf\x79\xdf\xb7\xa7\x52\x10\xc6\x6c\xef\xf7\xf5\x6f\xdd\x9f\xa4\xa0\x69\xb5\xef\x43\xd0\xab\xc5\x61\x36\xcc\x4c\x41\xa7\x94\x96\xd4\xe7\xa3\x51\x4d\xf3\xdd\x39\x85\xc7\xa4\x51\xe3\x28\xb0\xba\x3b\xb7\x2b\xc3\x3f\xca\x4c\x52\xc1\x90\x5b\x68\xfc\x6d\x0e\x87\xf9\x67\x2f\xc2\x98\x96\x59\xb3\x0d\xde\x43\xdd\x6c\x65\x59\x19\xfc\xc9\x64\x99\x12\x91\x04\x66\x90\xfd\xf6\x37\x91\xbf\x47\x97\xea\xa4\x22\x61\xd4\x7b\xea\xdc\x67\x57\x0e\x6e\xef\x04\x6e\x1f\xb2\xb1\xc5\x5f\x3a\xcb\xaa\xb0\xa7\x93\xbe\xf1\x48\xcb\xea\xa5\x29\x84\xcd\xd1\x94\x21\x55\xbe\xc7\x86\xa2\x4d\x6d\x1e\xbf\x2b\x3f\x19\x2b\x53\xe5\xd9\x30\xd6\x28\xfd\x9e\xaf\x21\x59\x29\xa6\x21\x55\xed\x1c\xae\xd3\x40\xab\x67\x28\x1e\x90\xa2\x08\x85\x89\x68\x4a\xf9\x96\x15\x07\x27\x53\xe2\x6e\x09\x22\xa6\xc9\x00\x99\x47\x75\xc2\xf5\x4f\x0a\xbb\xae\xd4\xe8\x21\x45\x1d\xf9\x03\xb3\xda\x2d\x1c\x71\x2c\x00\x37\x91\x3c\x6a\x3f\x61\x40\x5a\x07\x6c\x96\x84\x75\x73\xdf\xac\xe3\x98\x9a\x8b\xc7\xac\x68\x88\xe6\xad\x33\xb9\x82\x89\x8e\xc7\xe4\x96\x73\x8f\xc9\x24\xed\xac\xd3\x8c\x5d\xdf\x2f\x93\x21\x11\x23\x9e\xea\xbd\x01\x90\xad\xe0\xf4\x82\xd0\x6e\x42\xd3\x71\xa0\x08\x20\x7b\xbb\xf8\xee\x0a\x54\xdc\x47\x49\x8d\x99\x9d\x8d\x9c\x89\xd5\xfe\x37\x41\x23\xf7\x75\x2a\x8d\x61\x46\xf9\xf1\x70\x99\x89\x4e\x78\xe0\x09\x5a\xe5\x04\x36\xdb\xf3\xf1\xd8\x59\x43\x02\x0f\x94\x32\x3d\xa7\x36\x85\x85\x8f\xc9\x25\x32\x8b\xf5\x73\xc8\xb9\x7d\xf3\xa9\xc6\x2c\x70\x16\x07\x94\x37\x1c\xe1\x67\x3b\x8b\x6d\xf2\xe8\xbe\x88\x01\x0b\xc2\x01\xe2\x01\x69\xcb\x32\x78\x2d\xa3\x96\xed\x46\x86\x7e\x44\x0a\x67\xb4\xcd\x5a\x83\x93\xff\xb7\xdd\x96\x87\x32\xa6\x05\xa8\x17\x7c\xfa\x7a\xb2\xf0\x10\x81\x52\xa4\x55\x0f\x8e\x5e\x5e\x16\x43\xa3\xbd\xb9\x28\x9a\x47\x18\x92\x68\xe8\x92\xe4\xc0\x48\x22\xd7\x11\xb0\x80\xc7\xbe\x32\xb6\x9f\x68\xb0\x09\xe6\xd9\x52\x9b\x76\x70\x1d\x57\xa0\x4b\xf7\x69\x06\x81\x7b\xd5\x8a\x55\x59\x1c\xaa\xb9\xf5\x6d\xf4\x23\x12\x2f\x01\x4b\x8d\x5f\xc1\xa9\x81\xac\xb0\xde\x6c\x43\xfb\x6d\x37\x36\x8c\xe9\x07\xdf\x3e\xee\x3e\x75\x7d\xfd\xdb\x7f\x3f\x7b\x28\xe3\x87\x91\x32\x4d\x56\x3d\x8b\x5c\xc3\x60\x23\xe1\x69\xe4\x11\xd6\x6a\xd9\x5e\x5d\x86\x35\x19\x26\xfe\x6d\x94\xe6\x3e\x9c\x86\x44\x7b\x72\x33\x34\xe8\xce\x9a\x22\x79\x66\x1e\xb3\x02\x7d\xcf\xf3\x26\x33\x3b\x55\x66\xe9\xaf\xce\x85\xeb\xc6\x8e\x7b\x38\x3c\xc5\x88\xb8\x09\xa7\xaa\xfc\x79\x71\xc5\xbe\xdb\xaa\x3c\xee\xca\xcd\x6a\xf1\xfc\x23\x6b\x5e\x29\xd7\xc6\x62\x2a\x21\x34\x40\x80\x8c\x66\x49\xaa\xa5\xe6\x2e\x2d\xbe\x2d\x2b\xfa\xc1\xdd\x9b\xc8\x63\x4f\xa5\x43\x7d\xcb\x06\xaf\x75\xa5\xba\x69\xc1\x63\x49\x29\xb6\xd5\xbf\xb6\xc2\xe8\x46\xc3\x64\x02\x66\xe3\xdc\x8a\x8d\x0e\x6c\x3a\x07\x55\x7a\x0e\x0c\x09\x90\xbe\xb8\xfd\x31\x8c\xaf\x38\x48\x03\x32\xc7\x63\xd6\xb8\x22\xe0\x2d\xa2\x09\x2d\xa6\x8b\x19\x60\x12\x58\x3a\xe3\x73\x59\xcf\x55\xa8\x78\xbb\x11\x44\x34\x93\xa1\x52\xfd\xd7\x88\xd8\x34\x01\xc4\xb9\xa2\x00\xc2\xaa\xf7\xdb\xa3\x32\x48\x0d\x01\xdc\x40\xce\xee\x0c\x14\x48\x0e\xd0\x67\xdd\x48\x26\xa8\x80\x9f\xc9\x32\xd8\x13\x06\x5c\x0d\x7e\xa4\x4c\x31\xb6\x5a\x9d\xdb\x23\x54\xcd\x95\x55\x7e\x77\x67\x25\x1a\x7d\x8b\x81\xf2\xe5\xb0\x57\xc8\xd1\xf7\x28\xb1\x32\x9a\x4b\xb6\x18\x09\x5d\x39\xf8\x8a\x01\x33\xbe\x09\xc8\x92\x60\x08\xed\xde\x1c\x4f\xf3\xca\xfb\xc0\x51\xa4\x91\x2d\x94\xff\xb8\x7f\x98\xf1\x39\x02\xae\x3d\x49\x65\x06\x42\xdd\x43\x1e\x78\xbd\x59\x1e\x70\x1d\xf2\xd8\xb9\xb3\x66\xc5\x88\xe0\xe2\x46\x40\x42\x23\x0a\xfc\xf8\x81\x59\x5f\x83\xf9\xf4\xdd\xeb\xf3\x03\xf0\x30\x89\xa9\xa0\x77\x6e\xca\x23\x34\x99\x74\x45\x50\xc2\xa7\xcd\xbe\xac\xe0\x6b\xae\x0d\x18\xf0\xbf\x14\x6c\xdf\xb7\xff\x2d\x06\xfd\x38\x3b\x2e\x88\xb5\x37\xbc\x49\x90\xef\xa9\xb8\xf8\x8b\x3b\x2e\x02\x32\xba\x7c\xcb\xc6\x4a\x60\x00\x81\x36\x96\xe7\x4b\xcc\xcb\xa6\x21\xc5\x99\xc9\xb9\x59\xc2\x78\xef\xcc\xff\xcb\x00\x82\x65\x29\xae\x73\xff\x71\x9f\x4d\x03\x13\x68\xd6\x76\x83\x73\x32\x21\xe3\xaf\x08\x3d\x43\xd8\x35\xc5\x9f\x2e\x16\x1c\x37\x71\x21\xf4\x92\xc4\x36\xf6\x36\xab\xa7\x67\x82\x22\xfd\xc3\x8c\x74\x72\x5b\xc3\x00\x0c\x5d\xad\xc6\x66\x5b\xc0\xa9\x7e\x2d\x1b\xca\xe7\x26\xba\x4f\x5f\xc6\xd7\x10\x26\x8a\x5a\x50\x2f\x99\x7c\x6b\x03\xd1\xb2\x6a\x2e\xdb\xd7\x2a\x3b\x9e\xba\xad\x19\x22\x2e\x93\xb0\x33\xdb\xd8\xbe\x66\xa7\xd3\xa0\x21\x34\x5a\xed\x20\xf6\x95\xec\xab\x8d\x5f\xc9\x8f\x8c\x24\xf0\xae\xf5\xf0\xda\x53\x21\x45\x6a\x4b\x38\x9c\x40\xbe\x65\xb2\x1c\x2e\x54\x10\x87\x86\x6d\x43\x8d\xaf\xac\x38\x8c\xdd\xd0\xfe\xee\x9e\x8e\x2e\x3a\xc5\x98\x16\xe1\xfb\x4c\xe3\x2d\xc8\xa6\xac\xf6\x59\xe6\x78\x66\xc0\xe3\xd4\xc0\x9a\xf2\xb2\xc6\x65\x57\x85\x04\x2e\x38\x41\x4b\x3a\xce\xc8\x1e\xba\x24\x08\x40\xa5\x68\xd8\x32\xed\x94\x27\x3b\xac\xf1\x74\x11\xca\x8b\x70\xa0\xb9\xb0\xfd\x80\xea\x48\xf6\x3e\xb3\x04\x05\x90\x49\x42\xdf\x46\x10\x47\xfa\xc4\x0f\xcc\xac\x90\x74\x3f\xc4\xb4\x1c\x08\x6a\xbd\x97\xce\x16\x0f\x40\xca\x24\xea\x7b\xe2\xdf\x88\x5c\x34\x01\xf7\xdb\x91\x18\xc6\x46\x96\x2a\x47\xa8\x48\x00\xb9\x1e\x85\x0e\xa0\x83\xd0\x98\x93\xbb\xdc\x79\x35\xd0\x03\x9e\x07\xdf\x81\x4e\x53\xd7\x2a\xdf\x61\x8e\xa7\xb2\x5f\x89\x67\xe9\x74\xa0\xb5\x79\x5d\x2d\xd4\xc1\xcd\x36\x47\x66\x11\x5e\xa2\xa8\xb4\x77\x87\xcd\x0d\x5c\x56\x57\x86\x8b\x20\xfc\xc8\x4b\xed\x32\x4a\x6a\x90\x7c\xb4\x62\x08\x3f\x35\xac\xa1\xff\xbd\x5f\x0d\x27\x95\x08\x02\xc3\x18\x7a\x7e\x59\xef\x37\xab\xa7\xfd\x6e\xb3\x7e\xd9\xdf\x2f\xb6\xbb\x6e\x00\x33\x16\x47\x64\xa9\x00\x0d\x2e\x0a\x75\xd7\xbb\x92\xdd\xe2\x75\xcc\x3a\xfb\xde\x89\x20\x81\x44\x3a\x26\x00\xb1\xcc\x36\xc5\x0b\xdd\x19\xac\x06\x62\x6a\x20\x02\xc5\x5c\xea\x41\x82\x94\x0f\xa5\x1a\x56\x6c\x44\xa8\x0d\x3e\x61\xf7\x6d\xf3\x72\xb3\x7f\x5e\xbc\xec\xfe\xd8\xdf\x3f\xad\x7e\xfd\xfe\xec\xce\x10\x49\x95\xf6\x6b\xdf\xb7\xa7\xc7\xe6\x5a\xf9\x05\x44\x1c\x69\xa2\xb8\xaf\x8f\xa7\xae\x35\x3b\x1d\x93\xa6\x31\x45\xf3\x6d\x52\x67\x4c\x00\xbf\x0c\xd3\x44\xaa\x62\x0a\xd3\xba\x1e\xfa\x62\xfa\x98\x38\x8a\x40\x59\xa5\xbb\xbb\x0a\x4e\x5d\x67\x45\x08\x29\xa8\xb5\x4d\x7b\xfa\x46\x96\xff\x8c\x1f\x21\x64\x2a\x8c\x42\x16\x14\x4b\x5c\x66\x4a\x61\x31\xf9\x4a\xe5\xfb\xd4\x92\x31\xb2\xc1\x8f\xe7\xe3\x1d\x16\x58\x41\x6f\xe1\xea\xc6\x45\x8a\xca\x9a\xf5\xf9\x84\xd5\x11\xba\x29\xa2\x78\x48\x55\xcb\xa6\xba\x18\x24\x4a\x7f\x00\x69\x6f\x5c\xe6\x20\xdf\x1e\x49\x93\xb0\x3b\xa4\x22\x02\x31\x74\x16\x53\x8b\xcd\x7c\x3a\x25\xd0\xe3\xe0\x0c\xbf\x5d\xa9\x43\x68\x5f\x92\x3b\x68\xe7\xb2\xfc\xd9\x2a\x37\x9a\xe3\x3a\x34\x34\x5b\xc2\x1c\x38\xf7\xc5\xf1\x76\x24\xb4\x36\x96\xe9\x93\xaa\xe9\x8b\x7d\xb7\xff\x5f\xcb\xa6\xd2\x63\x09\xcd\xa6\x26\x43\x27\x33\xed\x8e\x84\xb1\x31\x37\xb9\xbd\x5d\x0e\x5f\x3d\xe9\xfb\xb1\xec\xa7\xe9\xaf\x59\x71\x50\xe5\xf1\x33\xac\xf1\x6c\xec\x24\xfd\x40\x12\xc2\xbc\x6e\x13\x74\x7f\x04\x0c\x90\x3e\x46\xc4\x26\x26\xe7\xce\xfd\x72\xb7\x72\x25\x36\x19\x84\xa6\x0f\xdc\x26\xf7\x50\xe5\x97\x67\xa8\x2c\x97\xb1\xd3\x95\x9c\x29\xa3\xca\x20\x32\x7a\xb3\x23\xe0\x05\x05\x76\x6e\x80\x4e\x49\x84\x8a\x72\x3e\xeb\x67\x33\x7e\xa1\x24\x0b\x8d\x9c\xb1\x89\x3a\x67\xeb\xf1\x92\xa5\x9a\x08\x4b\x7b\xa3\x5a\x43\x52\x84\xe3\x76\x97\x64\x98\x10\x9b\xa6\x81\xea\x80\x8d\x9b\x36\x32\x0c\xb9\xe2\x9d\xb1\xc4\xfc\x84\x93\x61\xe2\x03\x95\xff\x2e\x32\xc7\xfb\x81\x53\x40\x7b\x28\x20\xd9\xef\x53\x1b\x62\xdc\xe0\xfb\x84\x08\x33\x3d\x51\x1a\xd0\x42\x45\x54\x83\xf2\xd6\xc2\x4a\xdc\xb9\x22\x4f\x86\x96\x59\x65\x0d\x7f\x3e\xdf\xf9\x65\xc4\x18\x75\x66\x1d\x7e\x0c\xf3\x3c\x18\xcd\x95\x28\x0c\x62\x5b\xc2\x7b\xfa\x28\x76\xaf\x48\xbb\xc0\x1c\xd2\x43\x46\xa9\x79\xf5\x5c\x19\xec\xe6\xdc\x4e\xa8\x4d\xd1\x46\xce\x04\x0c\xfb\xe4\xbe\x44\x90\xf2\xae\x61\x33\x10\x18\xfd\x65\x06\x24\x26\x23\x10\x03\xcc\xd9\x43\xd9\xbe\x43\x73\x73\x26\xf6\x04\x55\x15\x17\x4a\xed\xe0\x30\xbb\x03\xcb\x38\x96\xca\xa2\x36\x0c\x9a\xb1\x4f\x5a\xec\x88\xd4\x33\x8b\xa6\x89\xb1\x7e\x83\x2a\x6b\xa7\xd6\x27\xb4\x07\x99\x06\x01\xf1\x20\x4f\x15\xbe\x67\xe5\xb9\x36\x96\x11\xc3\x4e\xb4\x4c\xb5\x61\xdd\x1c\xb0\x21\xcb\xc2\xc9\x0c\xe4\x8a\x53\xbe\x01\xef\x58\xc1\x01\xef\xb0\xf0\xda\x27\x38\x50\xae\x03\x09\x09\x78\xf6\x89\x2c\xbb\x6a\xc7\x7c\x8a\x23\x85\x17\xd1\x2f\x24\x05\xbf\x76\x9b\x1d\x71\xc3\xa4\x88\xa5\x37\xf0\x62\xd9\x95\xdb\xb3\xa8\x65\x95\xd1\xad\xb8\xaa\x5d\x4a\x01\xa6\x22\x5d\x63\x63\x27\xdd\x35\xde\x4d\x0a\x19\x10\xf7\xab\xcd\x6a\x7b\x85\xe9\x36\xa3\xbf\x56\x66\xfe\x22\x99\x97\x02\xb9\xec\x79\x01\x37\xe8\x5a\x94\x0e\x2c\x27\x65\x10\x11\x62\x7d\x87\x70\xdc\x8f\x80\x89\x52\x46\xa6\xa1\x5b\x8f\xe2\x05\x2b\x59\xfa\x09\x69\x54\xca\xc8\xf8\xaa\xd7\xa0\x91\xd2\xbc\x2f\x77\x5c\x29\x45\x40\xa8\xb5\xce\xf2\xee\x84\xa6\xf0\x5a\x77\xda\xaa\x93\xf3\x4b\x53\xfd\xaf\x9d\xf9\xfc\x27\xaf\x83\x0a\xfc\xd0\x14\xa4\xa0\xce\x0e\x85\x7d\xbe\x33\x75\x28\xa9\x02\xad\x59\x87\x2d\x9e\x2e\xe0\x9f\x6d\x1f\x83\x97\x44\x61\x20\x85\x2b\x98\x6c\xd4\xf2\xd2\x73\x1a\xfb\x6f\xc1\x30\x1d\xd4\xe7\xf7\x47\x78\xc3\xbd\xb0\x33\x37\x75\x63\x54\x24\xec\xcc\xd8\x96\x9d\x6f\xe7\xf8\x3c\x3a\x51\x84\x46\x78\x58\xfc\xbe\x5f\xff\xfe\xbc\x79\x59\xef\x6f\xd6\xf7\x8b\x3f\xdc\x43\xd3\x22\x49\xc1\x69\x9c\x57\xef\x58\x3d\x5e\xb5\xc2\xa5\x96\x1e\x6d\x3b\x4e\x5c\xb6\xab\xfc\x2b\x8f\x05\xce\x1d\xfc\x31\x93\x6f\x8f\x57\xcd\x03\xe5\x85\x18\x86\xfd\x64\xdf\xd4\xdb\x53\x9e\x35\x57\x80\x50\xe5\xe9\x84\xa8\xb0\x12\x4e\x8e\xb9\xd7\x7d\x8b\x9f\x68\x02\x01\x91\x3b\xdc\x8f\xac\x50\xe5\x07\x5b\x5b\x1f\x6f\x37\xa4\xbd\x17\x83\x86\x97\xab\x7a\x7d\x39\x9b\x54\x00\x86\x15\x7f\xc0\xe6\x3b\xf5\xd8\x3b\x33\x8d\xd1\x23\x19\x4f\x59\x15\x08\xed\x84\xd8\xef\xe0\xd8\x2e\x13\x7f\x4d\xee\x98\x0a\xb4\x00\x67\x2f\xf3\x89\x3b\xc6\x97\xe1\xb3\x62\xe0\x53\xd5\xf9\xff\xfe\xf8\xa4\x5f\x3a\xb9\x26\x26\x03\x92\x43\x22\x6f\x20\xea\xb6\x8c\x2f\xfd\xba\x65\xa7\x42\x6e\xec\x1e\x2c\x0b\xe9\x1e\x75\xd3\xfe\x5b\xf7\x09\x97\x0a\xb9\xef\x7a\x9a\x0f\x50\xbd\x99\x54\x63\x79\xb1\x48\x87\xc9\x94\x55\xa1\x64\x81\xd1\x2b\x37\x95\xc7\x95\xa5\xc9\x4c\x4d\x51\x41\x85\x1a\x28\x44\xdd\x36\x50\x1d\x33\xf5\xc9\x2f\x1c\x4c\x75\x15\x79\x8a\x8a\xbf\x9a\x84\xcb\x0b\xe9\x16\x53\x15\x29\x16\x0d\xab\x80\x57\x4f\xbc\x7f\xf1\x54\xe2\x7b\x14\x81\x19\x7d\xc9\xe1\xba\xa7\x52\x1f\xd3\xd8\xa1\x3d\xce\xd5\x0c\x7f\xea\x53\xf5\x3a\x50\x3c\x32\x48\x69\xa3\xd2\x32\x6f\x9b\x31\x79\xbe\x22\x08\xa9\xa7\xec\x16\xca\x7a\x3d\x12\x2e\x52\x22\x46\xca\x69\x28\x3b\x78\xc9\x9a\x73\x87\x72\x50\x22\xd6\x56\x3c\x98\x04\xbf\x2d\x17\x78\x53\x2c\xcf\xf9\xdb\xb4\xec\xa7\x44\xea\xd1\xce\x47\x80\xbe\x27\xbd\x7a\xcd\xf2\x4f\x56\x40\x25\xa3\x98\xf4\x75\x84\x01\xaa\x4f\x1e\x99\x14\x9a\x5e\x95\x87\xdb\x9d\x34\xd4\x4e\x77\x3d\x2a\xd0\x54\xc6\xe8\xba\x11\x59\x59\xec\x3e\xca\xc9\xfb\xad\x78\x48\x92\xc6\xe7\x5a\xbd\x40\xd6\xe3\x24\x95\xe2\x32\x25\xc6\x01\x88\x61\xfb\x57\x29\x25\x98\x9d\x7b\x2f\x65\x79\x1c\xee\xe7\x4a\xe9\x88\x2a\x7c\x5d\xd8\x62\xdf\x5b\x23\xb3\x36\x6f\x7e\xd2\x7e\xca\x10\x60\xac\x16\xc8\xe6\x08\x07\xdc\x74\xd7\xa1\x7d\xf3\x03\x3b\x5f\x0f\xb3\x5d\xf4\x17\xaa\x43\x03\xd4\xa6\x80\x69\x2b\xcb\xd3\xd5\x3b\xed\x06\x72\x53\x43\x9c\x0a\x54\xce\xf5\x61\xd1\xf3\xa2\xd8\xc2\xd9\x7f\x2b\x1b\xac\x5f\xb0\x3e\xe7\xee\x87\xa2\xcf\x15\x21\x44\xac\x4d\xa0\x31\x24\x70\x07\x99\x0a\x93\xff\x6f\x62\xcb\xf6\x83\x61\x18\x11\xd1\xc2\xd4\x6e\x8a\x52\xe1\x95\xb5\x05\x60\x18\x45\xb1\xad\x69\x0c\xa2\xc3\x25\x19\x11\x4c\x66\x19\x86\xd2\xa7\xb6\x83\x32\x7c\x6f\xb5\xe8\x7e\x40\x68\xad\x1e\x0f\xd8\x3c\x63\x55\x97\x05\xe4\x56\x28\x7d\xde\xe0\xca\x7e\x2c\x82\x38\x50\x43\xef\x35\x54\x03\xa5\x58\xc0\x38\x89\x08\xf6\x48\xb0\xe5\x75\xf3\x6a\x55\xfa\xfb\x7b\x93\x78\xca\x55\x9f\x4e\xb4\x3e\xcf\xce\x79\x4c\x02\x83\x75\x73\xe1\xc4\x12\x7a\x0b\x03\x3b\x24\xf5\x25\xb3\x4a\x99\x96\xce\x3e\xd2\x68\xc0\x34\x4e\x22\xd5\x23\x06\xa1\xb8\x8c\x10\xea\x6e\x14\x30\x15\x3b\xbf\x40\x2a\x87\x8c\xdf\x0f\x4c\xa5\x26\xae\xce\xbf\xb2\xa6\xea\xda\xc8\xc8\x3d\x46\x89\xb1\x69\xdc\x3d\xc3\x65\x28\xbd\xec\xc6\x28\x41\x6f\x96\x95\x9c\xbb\xd9\x2f\xbf\x6f\x37\x8f\xeb\xed\x76\x7f\xf7\xf2\xd4\x55\x49\x10\x02\xa3\x29\x4e\x1d\xeb\x36\xe2\xcc\xd4\x24\x13\x43\x91\x32\xea\x9a\xb5\xf1\xe5\xde\x11\x75\x51\x32\x2d\x53\x17\xef\x14\x4d\x59\xcc\xe3\x99\x51\x26\x06\x53\xec\xd0\x57\xcb\xf3\x45\xf4\x05\x43\x94\x5a\x42\x0f\x3d\x6c\x6f\xf4\x20\xda\xb3\x63\x54\x60\x65\x1a\x7a\x3a\xe0\x8a\x50\x1b\xf9\x0c\xde\x7c\x6e\x1f\x44\x8d\xc6\x19\x10\x94\x32\x0a\x87\x6d\x1a\x32\xa7\x0b\x0d\xda\x63\x9a\x1c\x83\xbb\xfe\x51\x55\x1e\x6f\x3b\xfb\x9a\x5f\xdc\x28\x85\x8a\xf7\x9a\xdf\x86\x81\xbd\xcf\x8a\xfd\x07\xba\x02\xaa\xf6\x63\x66\x08\x21\x5f\x8b\x19\x6a\x3f\x95\x8e\x23\xb0\xdb\x3d\x8c\xca\x15\xa3\x5f\xa1\x03\x3f\xc4\x5e\xab\x6c\xf7\xb3\xd8\xc1\x64\xb3\xd5\x41\xe8\xd1\x1b\xb2\x37\xd2\x8e\x55\xd3\x47\x2c\xae\xc2\xa3\x03\x88\x48\x70\x27\x6b\xf0\xf8\xd8\xc9\x37\x68\xc6\xc1\x3a\xac\x5a\x2b\x74\x23\x15\x31\x3e\x7f\xe8\x27\xe4\x94\x96\x39\x63\x91\x9a\xba\xfe\xed\xe4\xb1\x78\x73\xd3\xe6\xe8\xde\x49\x1d\xfa\x86\x52\x5c\x37\xe5\xe9\xb9\xac\x1a\xc8\xef\xce\x64\x6e\x9c\x75\x93\x40\x87\x21\xa3\x22\xc5\xf6\x7c\xc2\x6a\xad\xba\x86\x98\x0e\x43\x4e\x68\x7a\x63\xd7\x4f\x9c\xc2\xcf\x98\xfc\x3a\xe4\x40\x60\xee\xe2\x7c\x5c\x14\xd9\x11\xf2\xfa\xf7\x81\x10\xa3\x0e\x45\x4c\x68\x14\xb0\x8c\x6c\xf6\x5c\x95\x7f\xa2\x1c\xa9\x49\xe9\x28\x35\xca\x2b\x03\x0a\xf6\x5c\xe2\xab\x23\xce\x92\xa8\x93\x48\xff\x5e\xd4\x65\xae\xb6\xa0\xbb\x2f\x8b\x83\x98\xda\x01\x5b\xbc\x56\x18\x9d\xbf\xfa\x58\x05\x9d\xe9\x6c\x47\x22\xc4\x6d\x36\x98\x73\x09\xb2\x20\xea\x32\x64\x02\x60\xb9\x43\x6d\xb2\xcb\x3a\xd2\x73\xb7\xdf\xd6\xb7\x65\x35\x3f\x95\xd2\x80\x53\x99\x51\x9f\x0b\xd5\x35\xf3\xc6\x57\x94\xc6\xca\xb4\x18\xeb\x2d\xe6\x79\x56\x1c\xb6\x03\x3d\x30\x9d\x8a\x24\xb1\xa5\xea\x45\x9e\x0b\x6c\x96\x97\x76\x2e\x11\x88\xa4\x0f\xd0\x34\x4f\x42\xba\x51\x2a\xab\xdb\x40\x66\x71\x6e\xca\x17\xcc\x0c\x99\xda\x0d\x49\x15\x01\xba\x6e\xd7\xeb\xfd\xf3\xfa\x65\xb5\x76\x2a\xeb\xa0\x39\x0f\x85\x95\x3d\x6c\x5e\xf0\x74\x6e\xc6\x4a\x37\xb3\x9b\x84\xe6\xca\xa7\x22\xba\x15\xb8\x85\x23\x2e\x0a\xb5\xbd\x1c\x45\x99\xcf\x98\x7a\x80\x06\x69\x7c\xa9\x37\xab\x27\x2c\x54\xaf\x00\x0f\x5a\x04\xc2\xfa\x91\x34\x0f\x04\x3c\x24\x9b\xd6\xcb\xe9\x93\x6d\x43\x8b\xc4\x23\x7a\xe9\x11\xfe\x2c\x2b\x42\x09\xb5\xd9\x67\x5f\xf1\x99\x5d\x6f\x24\x37\xed\x14\x5d\x61\xf1\xd7\x65\x42\xb3\xd6\x0a\x83\xd4\xf0\x80\x3e\x2a\x38\xad\xbb\x22\x95\xc6\x08\x69\xdd\x26\x92\x3a\x1c\x89\xdc\xe2\xd6\xa8\xf1\x55\xe9\x50\xd0\x4e\x75\x7b\x2e\x54\xed\xfa\x96\x9f\xc0\x5a\xb4\x16\x4c\x9b\xda\x99\x28\x0b\x35\x3d\x93\x32\xfc\x46\xc2\x32\x1e\xa0\xc8\x6a\x18\xb8\x5a\x09\xcf\x63\x1e\xcd\x98\x67\xb8\x90\x90\xda\x2c\x00\x6f\xf4\x85\xc2\xf3\x78\x4c\x2d\x8d\x23\x9c\x3a\x89\xf6\xd1\x5c\x15\x9e\xa7\x03\x62\xeb\x9f\x9b\x2c\xcf\x9a\xcb\x88\x2e\x2c\x3c\x3f\x8e\x69\x25\xb6\x7f\x9e\xe8\x72\xcd\x3a\x33\x7d\xa2\xc3\xe5\x4e\xa8\x52\x67\x69\xb2\xcc\x46\x56\xe8\xc2\xf3\x75\x48\xcb\xeb\xaf\x4f\x9b\xa7\xad\xd1\x8d\xae\x88\xe7\xf9\x8f\x9b\x99\xe3\x9f\x16\x78\x09\x6d\xe4\xaf\xcf\x70\xa1\x7a\xe9\x36\x3b\xb8\xef\x0a\x24\xf3\x9c\x7d\x73\x1b\xc5\x4c\xf3\x25\xe1\x31\x2f\x8d\x2c\x4b\xdf\x5a\xa4\x57\xa3\x58\x50\x78\x8c\xf9\xca\x00\x70\xc9\xd3\x6e\x72\xeb\x58\xc2\x7d\x41\x9d\xc6\xba\xc1\xe1\x42\x28\x3c\xa6\x84\x51\xc6\x3a\x67\x32\x53\x48\x73\x67\xf2\x58\x18\x32\x92\xfb\x71\xd2\x12\x6a\x5f\x4f\x8a\x54\xc2\x63\x5a\x24\xc6\xd8\xa9\x28\xb2\xe2\x30\xe8\xf0\x08\x2f\x8c\x12\xea\xa8\x59\x3d\x91\x2d\x56\x19\x4e\xbf\x23\x94\x8c\xc4\x28\xb5\x21\xe3\x0d\x53\x04\xe1\x85\x4a\xfb\x56\x7d\xe6\xe5\xf1\x6e\x05\x79\xde\x06\x16\x77\x50\x1b\xdd\x87\xd9\xba\xa0\xf0\x22\xa6\xc1\x9a\xb7\x4a\xab\x4a\x71\x55\xfb\x1a\xd5\xc4\x82\xd0\x7d\x92\x9b\x79\xa8\xcf\x85\xdc\x07\xc3\x44\x51\x78\x91\xd0\x46\x8e\xd6\xac\x73\xed\x94\x30\x91\xe9\xf8\xf7\xc4\xbe\x69\x33\x1e\xb2\xe3\x11\x9f\xb3\xbf\xfe\x02\xf7\x63\xe2\x54\xd3\x91\x5b\xcf\xf3\xfc\xd1\xa3\x88\x79\x4a\x25\xc6\x73\x8d\xd5\xa2\xb9\x2e\x0a\x09\x2f\xc6\x38\x42\xc7\xea\x6b\x67\x7f\x1b\xb3\x3c\x57\xe5\xcf\xaf\x25\x28\xdb\x0f\x4a\x6a\x01\x54\x94\xd3\xec\xa0\x7e\x5b\x19\x71\xb6\x99\x55\xd6\x7e\x24\x05\x60\x96\xeb\xb8\x1d\xc8\x82\xba\xa3\x82\x11\xbb\xd2\x44\x28\x0f\x08\x6d\x9c\xde\xa6\xfd\xd3\x1b\x91\x2a\x41\x5a\x59\x78\xcc\x9a\xe5\xe7\xbb\xba\xf0\x38\x28\x02\x34\x93\x36\x42\x01\xe7\xa6\x5e\xff\x3c\xe5\x65\xd5\x4d\x23\x67\x43\x71\xfb\xfd\x71\xf5\x77\x0e\x19\xc2\x83\xc4\xa3\x9c\xfc\x15\xea\xdf\xb0\xaa\x7b\x59\x17\x7b\x5c\x68\x60\xa9\xab\x0b\x1e\xb2\xb2\xe8\x81\x28\xfe\x74\x26\x49\x6e\x0c\xe0\x4d\xf5\x7b\x9b\x1d\x0a\x12\x13\x9e\x5d\x0a\xd2\xd9\xd5\x5f\x78\x4a\xc4\x60\x61\xdd\xab\x57\x3c\x12\xd5\x6f\x6e\xc7\x16\x1e\x72\xd3\xd6\xa2\x3c\x73\xc6\x5a\x49\x78\x88\x40\xa9\x99\xb5\x1b\xcd\xb0\x76\xd1\xba\xf0\x74\xe0\x13\xf3\x85\xfc\x35\xbe\x14\x68\x4c\x87\xf8\xab\x09\x12\x4b\x78\x3a\x8c\xad\xdb\xe4\x7b\xf9\x86\x0b\x29\xb1\x26\x78\xc8\x6c\xc2\xd6\x0e\x17\xa4\x23\x51\x9c\x8f\x9d\xcf\xb9\x51\xf1\xc5\x6e\xce\xe8\xc8\xa7\x1a\xcb\x5e\x61\x83\xd5\x31\x2b\xf0\x06\x35\x4e\xf7\x31\xe1\x69\xe1\x01\x1b\x20\x07\x9c\x4b\xc8\xd5\x4b\xeb\x2a\x3b\xc2\xf7\xb8\xf1\x4c\x3c\x81\x7c\x1b\xd0\x72\x85\xef\x89\x50\x28\x57\xde\xa4\xba\xc6\x0d\x9e\x2a\x94\xd7\x55\x29\xe1\xfb\x4a\x19\x97\x88\xff\x9e\xb3\xaa\xc2\xfc\x05\xff\xeb\x4e\x13\xf8\x48\xf8\xa6\xf3\x2c\x00\xfd\xdf\xbe\xe7\xff\xc7\xdd\x39\x3f\x88\x12\xca\x2b\x2c\x14\xe7\xba\x84\x2c\xfc\x40\xc5\x3e\x3a\x05\xa3\xc3\xd5\xea\xe1\x07\x5a\xa5\x8e\xd9\x03\xcd\x50\xe1\xf5\x13\x40\x65\xfb\x11\x24\x5a\x93\xcb\x28\xee\x4b\xb7\xbf\xf8\xcc\x33\x32\x64\xa0\x9c\x42\xd2\xae\xfc\x5e\x48\x38\x9d\x3a\xc9\xa4\xe9\x7a\xec\x87\x01\x52\x3f\x61\x6f\x85\x50\xa8\x40\x30\xfc\x6e\x2b\xa4\x7b\xb5\x6e\xf8\x21\x8b\xa9\x24\x9c\xc3\xc5\x39\x24\xdb\x84\x44\xf8\xa1\x60\x91\x7d\xb2\x77\x58\x60\x9d\x5d\x7d\xad\x8e\x18\x3a\xaa\xcd\xae\xb7\xfa\xec\xef\xd0\x55\x21\x53\xf8\x91\x0a\x68\x77\xfb\xbf\xa1\x70\xaa\xf0\x63\x16\x39\x39\x09\x8b\x6b\xba\xc6\x9a\x09\x3f\x4d\xc2\xc4\xd6\xbf\xef\xda\xd8\x9e\xe6\x2c\xb1\x21\xc6\x57\x96\xa2\x30\xfa\x4a\x46\x14\xdd\xbd\x6f\x7e\xaa\x05\x26\xce\xf1\xc5\x7a\x9c\x4d\xbe\x82\x47\x31\x29\xd4\x6e\xfe\x6f\xb7\xbf\x59\xaf\x36\x0f\x8b\xfb\xad\xfb\x38\x08\xb3\x33\x2f\x9a\xf2\x98\xc9\xed\x07\x9c\xe6\x83\xa9\x89\x1a\xa5\xf0\x85\x30\xbd\xcf\xd7\x8b\xa8\x32\x65\x0d\xdf\xda\x94\xac\xf7\x1e\x12\xbe\x04\xa4\x88\x77\xfd\xfe\x88\x1f\xa3\x5f\x3f\x39\x9b\xd4\xe0\x26\xdc\x03\xfc\xbc\xa9\xca\x53\x3d\xf9\x11\x8a\xa5\x1e\x5a\x41\x43\x17\xbb\xba\x96\xcb\x72\xba\x92\x4d\x69\xdd\x9f\xc5\x4c\xd4\x1a\x1d\x8b\x6e\xba\xaf\x4b\x42\x2a\x3a\x58\x58\xa6\xf1\xfb\x9b\x81\xf6\x0b\x5f\x21\x43\x63\x10\x72\xb3\x6d\xca\x53\xdf\x14\x10\x3e\x06\x52\xd9\x30\xd6\xc2\x33\xc6\xa1\xe3\xf8\x44\x08\x56\x41\x9a\x3c\x48\x2a\x90\x4e\x21\x50\xf8\x28\x14\x99\x92\x2e\xef\xb7\x46\x4f\x68\xbf\x5a\x3c\x77\x07\x95\xa2\xd5\xb8\x4d\x6b\x16\x37\x37\x2f\xeb\x6d\xf7\x74\x35\x37\xb0\xfa\x6f\x50\xdf\x60\x8e\x07\x68\xd0\xf6\x50\x1c\x40\x56\xf8\x1a\x8c\x8e\xf0\x7f\xcf\x58\x5d\x2c\x4c\xc1\x70\x4b\x3f\x79\x56\x5a\xa7\x61\x6f\xac\xb7\xf9\x1a\x46\x2f\x82\x20\xf0\x48\x58\xe4\xb9\x2a\xef\xb0\xd8\xa1\x63\x0a\x88\x20\xe0\x9a\x56\x21\x23\xd1\x42\x2d\xca\x36\x9e\xe8\x5d\x4b\xec\x38\x66\xdb\xb1\xa2\x14\x06\x30\xe5\x3c\x31\xaf\x1c\x77\x86\x3b\x5f\xe0\xcd\xc7\x22\x01\xe3\x8a\x83\x85\x95\x2d\xd4\x9f\xe7\xba\x79\x44\xb7\x56\x05\x61\x64\xe4\xd9\xe4\xb9\x6e\x4a\x95\x41\xb1\xfb\x44\x15\xc3\x8d\xd7\x5a\x75\xd5\xb7\x73\x9b\x10\x63\x3d\x94\x5a\x77\x8b\x44\x10\x2b\xed\xf5\xa4\xa6\x5e\xd1\xa5\x1b\x37\x5d\x56\x82\x34\xf6\xa3\x5e\x51\x7c\x4c\x69\xf9\x9c\xcb\xe2\x3e\xac\x8c\x89\x2c\xd5\xfb\xea\x9a\x92\xa7\xe1\xf3\xf1\xe3\x6e\xa0\xa2\xc6\xcd\x3e\xab\x77\x8b\xa7\x2e\xb6\xb0\x2f\x14\x91\xb2\xff\x11\xe2\x4a\x04\xdc\x43\x2a\x2c\x3c\x64\x47\xc3\x68\xfa\x22\x3c\x0a\x78\x64\x1a\xf5\xbd\x21\xd8\x66\x5c\x8c\x13\x01\x57\x86\xe0\xef\x6a\xa3\x6d\x46\x39\x5a\x8a\x27\xdf\x0f\x49\xca\x1c\x32\xe9\x7c\x21\x9e\x37\x16\xcd\x75\x31\xb4\x1d\x69\x48\xeb\xba\xc2\x59\x8e\xa6\x08\x04\x33\xb5\xa4\xa6\xbc\x41\x49\x25\x9e\xe9\x80\x18\x49\x32\xfb\xf9\xfb\xe3\xcd\xc6\x4d\x1e\x01\x82\xd4\x06\x9c\x5c\xe2\xb3\x13\xec\x14\x81\x50\x02\x5c\xae\xf7\xfd\xfb\xac\x07\xa0\x08\x04\x6a\x0b\xb3\x6d\xaf\xc9\x96\xb9\xfe\xee\xee\x4f\xce\x21\xbd\x80\x8a\x1c\x67\x23\x7e\x33\x0b\xda\x10\x81\xf4\x7d\xea\xba\xae\x7f\x9a\x1b\xe4\xcc\x3c\xfe\x29\x1a\xc9\x9d\x26\x06\x9f\x3b\x67\x36\x93\x53\x7f\x01\xe9\x11\x81\x4c\x13\x6a\x4b\x5a\x6e\x78\x30\xe0\x86\x8b\x40\x6a\xb3\x50\x1c\xb0\xd9\xb7\x59\xfd\x3e\x6b\xf0\xe8\x0e\x6a\xe6\x31\xa3\x5b\x7a\x29\xcf\x57\x6d\x55\x37\x28\x4c\xfd\xa4\x37\x17\x36\x41\x63\x77\x86\xd4\x90\x56\xf6\xbd\x55\xde\x16\x65\x85\xdd\x23\xd2\x3a\x30\xfe\x0e\xa5\x6e\x56\x70\x72\xf9\xb6\x39\xca\xbc\x34\x11\xd6\x36\xeb\x56\x66\xf3\x17\xc0\x3c\x65\x7c\xbe\x9a\x11\x95\xf5\xab\x20\xf8\x33\xbe\xc7\x55\x18\x3f\x07\x97\x10\xcc\xd3\x51\x62\x3a\x29\x3f\xd7\xcd\xeb\xae\xa4\xbc\xd5\x5d\xb2\xaf\x19\x91\xce\xfe\x55\xe6\x8d\x83\xd7\x09\x16\xf8\x3e\x25\xdc\xb2\x5d\x4a\x07\x4a\xf6\x82\x05\x52\x1b\x6b\x3c\xc8\xd1\x31\x13\xda\xf0\x2f\x70\x03\x58\xaa\x43\x02\x9a\xb7\xdf\xf2\x00\x3f\x1f\xcf\x47\x27\x77\x30\x79\x3f\x58\xc8\x4c\x4d\xa1\x03\xb1\x62\x45\x4e\xf6\x9b\x9b\x71\x99\xf3\xda\x35\x6d\xb8\x0d\xb3\x90\x1b\xcf\x99\x03\x1c\xd1\xc2\x08\x3b\x92\x9b\x60\xa1\x34\x3f\x65\xa4\x42\x42\xc5\xe8\x9b\xae\x80\x28\x58\xa8\x81\xd6\x25\xfb\xd0\x77\xf7\xdb\xc7\xe7\xaa\x2c\xf5\x1c\x3a\x48\xb0\x28\x41\x82\x7a\x9d\x4c\x03\x7f\x60\xd4\x28\x58\x04\x69\xe8\xdc\x8c\x28\x6c\x16\x6e\x8f\x62\x71\x1c\x04\xa6\x99\x0d\xca\x19\xde\x8c\x7f\x4a\xac\x22\xfa\xf0\x8f\xcd\xe3\x4b\xf7\x29\x9d\xa2\xd1\xd6\xa7\x56\x81\x91\x1d\x8c\xc3\x51\xa6\xc8\x92\xc0\x77\x4c\x3b\xd3\x04\x37\x40\xec\xf1\xfd\x4e\x94\x0e\xad\x01\xe1\x5d\xa6\x9b\x7a\x79\xd9\xe1\xf1\x94\x43\x83\x13\xe9\xdb\x76\x65\x33\xc5\xb5\xe3\xa0\x4b\x3f\x7f\xf7\xdb\x1d\xc8\x96\x7d\xee\xb3\x77\xdc\xfd\x1c\xaf\x22\x8c\x0b\xc9\xbd\xde\x6d\x10\xab\xe6\xb2\x2a\x73\x07\x53\xee\xd3\xd8\x7f\x47\xff\x71\x9f\xd0\x21\xe1\xb8\xa8\xad\x6c\xa3\xe2\xe1\xb3\x82\x80\xb9\x0e\x85\x93\x45\xea\x97\x0f\x06\x09\x63\x46\x78\x8d\xe4\x46\xf0\xe9\xd4\x0c\x37\x36\x37\x2a\x35\xa0\xd8\xfb\xf2\xf0\x5b\xd9\xb3\x7d\xae\x5d\x40\xda\xa1\x29\x21\x29\xf2\x52\xbe\x59\x3b\xe6\xab\xc6\xb9\x1d\x2a\x3c\x10\x36\x75\xb8\x45\x27\xbf\x3e\xb8\x36\x61\x4d\x16\xe8\xe1\xdc\x9e\x73\x9d\x51\xd3\x68\x76\xdd\x64\x22\x4e\x8d\x08\xec\x6b\x55\x7e\xd4\x3f\x5e\xb1\x0b\x33\x0c\x95\x33\x2b\x0e\xc3\xb5\x47\xb4\xbb\x61\xfb\xdd\x59\x5e\xba\xbf\xc9\x54\x25\x3d\x46\xed\xc1\x78\x46\x50\xd9\xab\x7d\xcd\xca\x73\x43\x73\xfc\x49\xbb\xc8\x78\x7c\x01\x52\x45\x91\xad\x06\xac\xdf\xb1\xba\x2c\x33\x35\x95\x8f\x16\x4c\x79\x8c\xe6\xf4\xed\xe2\x79\xe0\x44\xee\x32\x0f\xa6\x90\x11\xb2\xe6\xc3\xad\xf8\x6e\x0b\x98\x46\xe1\xa3\xd9\xac\x7d\x41\xd1\xaa\xeb\x8e\x2c\x8a\x03\xe6\x3f\x5e\x11\xf3\xdb\xac\x68\xa3\xe2\xdd\x90\x0b\x79\x1d\x16\x31\x1d\x84\x0e\x98\x94\x15\xcf\xd0\xbd\x81\x1a\x78\x40\x7a\xb8\x86\x3c\xb2\xef\xfe\x8e\xe8\x52\x0b\xab\xa8\xe2\xc7\xa3\x17\x2c\xf4\x80\xcb\xae\x14\x23\xcb\xe3\x91\x5c\xc6\xc8\xc0\xcd\x9e\x24\xf4\xb5\x90\x83\x86\x18\xc1\x40\xe7\xf1\x80\x22\x0c\x84\x47\xf0\xaa\x13\x5c\x96\x58\xa0\xce\x64\x06\x54\x71\xb4\xc7\x43\x16\x51\x79\xe1\x2e\x6b\x5e\xcf\xa2\xff\x2b\x27\xf7\x47\x63\x20\x65\x0d\x4c\xdc\xb1\x18\x08\xcf\xf7\xe3\xdb\x66\xb7\xbe\xdf\x6c\x77\xfb\xed\xf7\xe7\xe7\xfb\xcd\xfa\xa5\x1b\x91\x44\x60\x96\x5b\x75\x96\x58\x9d\x8b\xe3\x1c\x7a\xdc\x0d\x16\xc2\x28\x93\x55\xe5\x5f\x58\x90\x04\x91\x3b\xa2\x14\xf5\x92\x6d\xcd\x2d\xba\xcd\x8a\xac\x7e\xed\x0a\xa1\x61\xa8\x95\x62\xc3\xa5\x68\x3c\x63\xc2\x28\x52\x32\x76\x1e\x18\x99\x91\x9c\x98\x41\x1d\x88\x30\x0e\x19\x51\xac\x8d\x28\xd3\xe2\x7e\xbd\x5f\xde\x2f\x56\xbf\xb6\xbf\xcd\x7d\x57\x0c\xbe\x43\xf3\xb9\x89\xd5\x87\x88\xe3\x85\x2a\x4c\x3c\x14\x76\xf5\x6b\xf3\xaf\x6d\x03\xc7\xb1\x11\xba\x08\x13\xa6\x0d\xaf\x3e\x6f\x97\xe8\x0b\x19\x74\xa3\x1a\x03\x54\xc7\x9f\xe0\x7e\x9c\x76\x9e\xae\x0d\x56\xef\x6d\x14\x38\x1b\xb8\x85\x3c\x06\x92\x61\xc2\x9f\xa7\xbc\xcc\x9a\x07\xbb\xe8\xa4\xee\x30\x37\x3a\x1b\x0d\x51\xbf\xfd\x53\x8f\xeb\x14\x21\x04\xdc\xd9\xc7\x6c\x09\x83\xd9\xcd\x93\x76\x45\x09\x06\x1d\xad\xa3\x80\xba\x06\x55\x56\x0f\x9d\x56\x82\x08\x45\xea\xd1\x4a\x72\x82\x8b\x93\xbd\x75\xaf\x4e\xe0\xf5\x2f\x4f\xe0\xfd\xc7\x7d\x00\x63\xba\xf3\x2b\x28\x96\x30\x24\xfc\x88\x50\x46\x11\x65\x99\xb7\x2f\xeb\xf5\xbf\xd6\xfb\xf5\xe3\x4d\x7f\x04\x44\x8f\xf4\xd8\xbe\xc2\x09\xb7\xaf\x99\x6e\x56\xe4\xf1\xd6\x66\x17\xcf\x65\xdd\xcc\x34\xbd\x44\x28\x39\x50\x7d\x82\xc2\x8d\x81\x2b\x85\x3b\xb5\xf2\xd0\x56\x86\x15\x1e\x69\x3d\xbf\xed\x94\xaa\x45\xa8\x54\x6a\xec\x3d\x8d\xca\xc8\xe4\x99\x2a\xd4\x52\x74\xcd\xd1\x55\x79\x3e\xf5\xe1\xf2\xbf\x83\x2b\x0d\xca\x2e\xa6\xfa\x77\xe0\xee\x86\xd2\xa9\xa3\x4f\x3f\x7d\x14\x9b\x06\x8f\xd7\x08\x58\x11\x62\x1c\x12\x78\x02\xda\x95\xa1\xd7\xd5\x1b\xfd\x4e\x44\x49\x6d\x32\xc8\x1b\xa8\x86\x3f\x41\xfb\x31\xf1\x40\x09\x11\xd0\x46\x5b\xe3\xa9\xa3\xfd\xc4\xd4\x6f\x08\xf0\x5b\x4a\x44\x55\x53\x96\x43\xeb\x8f\x91\xb4\x9e\x7c\x22\x32\xbd\x4a\xd3\xaa\xfe\xbe\xbd\xf9\x5b\x31\x42\x11\x6a\x34\x7a\x44\x79\x79\x28\x7b\x7d\x43\x11\x79\x81\xa2\xfd\xd6\xe5\x58\xf3\xb5\xfc\xb9\x80\xf5\x93\x3a\x73\xe4\xc5\xe6\x89\xe1\x4f\x27\xed\xdf\x7d\x57\x1a\x72\x0b\x89\x59\x41\x61\x64\xfc\xe6\x61\xcc\x83\x94\x21\xf2\x52\x43\x1e\xc8\xa1\x6e\x9e\xa1\x0d\xfe\x27\x7b\x59\xe4\x63\x40\x3a\xd7\xfb\x53\x79\xb2\x32\x63\xdb\x31\x84\x6c\x98\x19\x47\x3e\x1a\x7f\x12\x8b\xc2\x22\xf4\xe4\x60\x0d\x8c\x02\xe6\x91\x45\x3f\x99\x5f\xdd\x7e\x7f\xbc\x79\x58\xef\x6f\xd7\xeb\xee\x70\xca\x28\x26\x2a\xf0\xa7\xf1\x02\x1c\x14\x7c\xa2\x00\x43\x2f\x74\xb2\xab\x46\xcf\xc6\xcd\xc1\xb4\x2b\x9d\xfe\x3b\xb4\xd3\xb1\x9d\xa2\x6e\x46\x86\x76\x46\x46\xcc\xe7\xbc\x57\x15\x6f\xdf\x2e\x98\xcd\x02\xcf\x3d\x67\x4c\x44\x24\xfd\x6f\x20\x79\x8b\xa5\x1d\x31\x9a\x9e\x11\x63\x46\xa2\x0e\x7f\x36\x6d\xec\x42\xd2\x8d\xb3\x05\x81\x88\xf1\x40\xb7\xcb\xde\x3d\x96\x05\x54\xca\x05\x1c\x11\x03\xee\xe8\xef\xd6\x74\x24\xfb\x0b\x1f\xcf\xc7\x5d\x26\xdf\xea\x61\xbf\x2d\x62\x2a\x48\xd8\x08\xd2\xeb\x76\xb9\x28\x12\x01\x9d\xa4\xc2\x53\x0e\x97\x2d\xf5\x08\xae\x6a\xcb\x76\x6c\xec\x7b\x91\xc9\x6d\xda\x9d\x66\x50\x56\x8c\xe2\x20\xa2\xba\x5a\x0d\x1a\x3f\x83\xb7\x8e\xe7\x48\x1c\x31\x95\xf4\x90\xe7\x5d\xd9\x31\x7d\xc6\xe3\x12\x4f\x18\xe5\x7f\x9b\x20\x3a\x14\xfe\x86\x2c\xad\xdc\x20\x65\x7c\x0e\x76\x58\x40\xd1\xec\xa8\x95\x00\x0d\x3e\x64\x75\x85\xa7\xf1\x6d\x4f\x7d\x69\xf0\x26\xf2\xac\xca\xde\x10\x5d\x44\x69\xe2\xd1\x34\xda\x9f\xb0\xd2\x65\x75\xfc\xff\x8f\x09\x3f\xb9\x73\xdc\x0b\x65\x1f\x97\xeb\xac\xb9\x19\x40\x23\xe7\x2b\x02\x11\x47\xe9\xc2\xa4\x7b\xa8\x9b\x51\xab\x65\x7c\x8f\x20\x8c\x88\x01\x76\x2e\x5c\x72\xb7\xbc\xdc\x0f\x12\x7e\x17\xa9\x45\x10\xc7\x01\x76\xc8\x0d\xd3\x30\x9c\x7c\x2b\x24\x1e\x63\x0e\x67\x87\x3a\xfb\x89\x6a\x48\xd1\xb4\xa3\x84\x6f\xde\xb9\x66\x82\xcc\x16\x91\x88\x03\x32\x7d\x5d\x3e\x3d\xef\x3e\xd5\xd0\x10\x91\x00\x46\xc3\x4e\x65\x7e\xb9\x66\x69\xb5\xc7\xa3\xb8\x2b\xb5\x95\xd5\x9e\xe8\x5c\x4d\xbd\x9f\xa9\xf7\x46\x02\x4c\xac\xf1\xb0\xf8\xdd\x84\x61\x7f\xb8\xa2\x7a\x77\x36\x81\x3a\x1d\x92\xd1\xdb\xe8\xa1\x80\x7c\xc4\xc8\x71\x63\x95\x22\x76\x50\x17\x0e\x1b\xf1\xd5\x2f\x30\xbc\x63\x07\x41\x11\x49\xf4\x09\xc9\xbb\x85\xff\x1f\x6b\x5f\xd6\xdc\x38\x6e\x7d\xff\x75\xf2\x90\x07\x70\x03\xc1\x47\x59\x96\xdd\x9a\xf1\xf6\xb3\xe4\xee\xc9\xa4\x52\x2a\x2c\x17\x32\x63\x8a\x54\x48\xaa\x6d\xe5\xd3\xff\x8b\x17\x0b\x17\xd1\xee\x49\xd5\xff\x25\x3d\x31\x21\xae\xc0\xc5\x5d\xce\x3d\xe7\x70\xf4\x21\x43\xa2\x54\x80\xf5\xfe\xe6\xb5\x3a\x15\xea\x89\xf7\xcf\xaa\x94\xa1\x26\xb7\xb2\x8b\x7d\x77\xfa\x04\x3e\x64\x87\xa3\x30\x1d\xf6\x25\xa0\x50\x43\x55\x15\x4b\x5b\x0e\x9b\x9d\x7a\xa0\x14\x5e\x17\x51\x02\xc3\xee\x59\x91\xe8\xd0\xc8\xf2\xac\xcb\x06\xea\xd6\xd3\xa2\x8f\xd5\x5b\xd9\xdf\x07\xa1\xe3\xec\x3f\x7d\x8d\x90\x12\xc2\x42\x2b\x0b\xa5\xf3\xb6\xd9\x40\xa9\xb0\x07\xcc\x1d\x0e\x24\x72\xec\x7e\xaf\xf6\x50\xa8\x93\xe0\x5d\xd4\xa9\xda\x81\xf7\x41\x49\x62\xf8\x2a\x5e\x79\x63\x32\xf4\x3f\xba\xd8\x01\x26\xa9\x48\x4a\x52\xea\xa2\x6b\xdf\x0e\xeb\x0e\xc9\x04\x2d\xcb\x35\x57\xcd\x76\x74\x6a\x08\x5d\xdb\x0c\xfe\xc0\x9c\xbf\x59\x97\xf3\x18\x0b\x1a\xc4\xc6\x41\x35\x94\x43\x3b\xee\xe5\xff\xdc\x09\x83\x24\x45\xce\xba\x85\x28\xaa\x8f\x0f\xff\xd7\x2c\xe4\x36\x27\x71\xbf\x7d\xb9\x9a\x70\x93\x0a\x1a\x72\x82\x80\xad\x59\x4f\xf7\xc2\x9c\x8c\x76\x84\x70\xcc\xd2\x23\x68\xa8\xb4\x89\xdd\x70\xef\x36\x67\xb4\x87\xa2\x4c\x63\xae\xa9\x38\xc9\xb7\x73\x9f\xf7\xa4\x11\x04\x58\x4c\xde\x43\x7b\x75\x3a\xa3\x2d\x5d\xe8\x16\xea\x2d\xff\xe8\x87\x70\x65\xd1\x15\x66\x1b\xf9\x32\xe7\x48\xe3\x38\xea\xf7\xa1\x16\x8a\xe6\xea\x3c\x5f\xfa\xa7\x71\x16\x86\xc2\x46\x23\x5b\xe0\x87\xed\x65\x5b\xae\xa0\xb1\x8a\xc0\x2b\x73\x5d\xd7\x3c\x9f\xdf\x6a\x07\xd7\x57\x1e\x51\xfc\x52\x76\xb3\xae\x05\x5e\xe4\xe5\x7e\xc9\x8f\x5c\xe6\xed\xd7\x2d\xbb\x82\x26\xdc\x4c\x0b\x59\x57\xef\xa5\x4f\x2e\xdb\x83\x34\x92\xe8\x3c\xdd\x3d\x3e\xde\xaf\x17\xbb\xe7\xd5\xfd\x62\xfd\x70\xed\xc3\x3c\x4a\x93\x0c\x11\x67\x3b\xf2\x61\xc3\xab\xd1\x94\x4b\xd3\x4c\x39\xc2\xc5\x5d\x55\xc2\x0d\x2f\x1a\x58\x34\xdd\x72\xf3\x43\x24\x60\xc6\xc9\x11\xaa\x6f\x06\xd8\x64\x3b\x84\x91\x14\xe3\xfa\xce\xc3\x59\xbe\x82\x7c\x3b\x56\x79\x3f\xdf\x59\x92\xe0\x02\xbf\xaa\x9a\xf1\x7c\x67\x09\x43\x0a\x32\x0f\x67\xad\xea\x9b\xea\x54\xff\x03\x78\xdd\x0f\xf1\x3d\x8a\x16\xd2\xf4\x69\x45\x90\x32\x69\x12\xec\x56\xf2\xcd\x35\xcc\xbe\xcc\xc8\xff\x8d\x4d\x10\xe5\x41\x8c\xbb\x05\x7c\xe0\x13\x3e\xf1\xba\x6d\xba\x6d\xf5\x16\xca\x89\x2b\x4d\x45\x90\xf5\xba\x79\x17\x55\x44\x37\x48\x28\xc7\xf2\x8c\x95\xe8\x03\xdf\x4f\xcb\xd5\x54\xc6\x02\x53\x08\x87\xaa\x44\x91\x38\xb5\xad\x06\xe9\xca\xf1\x45\x55\x42\xd0\x0f\xde\x3a\xb2\x51\xe6\x0e\x64\x46\xc2\xd4\xf3\x7a\x76\x76\xd6\x6d\x75\x54\xc9\x14\x9b\x47\xbc\x06\x5e\xfd\xc9\x6e\x47\x41\x1a\x6d\x8a\xb6\xce\xf7\x7b\xdb\x0f\x72\x63\x41\x4b\x6b\xfd\x00\xa0\x3e\x6f\x3b\x76\xa7\x50\x61\xc6\xbd\xaf\x7e\x0b\x2d\x76\xa3\x23\x3a\xbd\xdf\xbc\xa8\x66\x44\x07\xbe\xf6\x8c\x04\xb9\xaa\x73\x99\xb6\x77\xff\x38\x42\xbd\xda\x7e\x1b\x3f\x79\x4a\x48\x14\x59\xa0\x59\xe7\x84\x1a\x5a\x86\x41\x6b\x62\x37\x22\x43\x9f\xaf\x79\xad\xde\xbf\x73\xdf\x88\x20\x52\xc2\x12\xd3\xb3\x06\xfc\x60\x95\x95\x87\xed\xc7\x22\x25\x42\x22\xb8\xc3\xb0\xff\x5c\x26\xe0\x66\x9f\x33\x25\x10\x60\xcd\x68\x77\x2a\x8f\x5c\xbe\x6d\xda\x1a\x1b\x74\x47\x76\xc8\x0f\x8d\xb1\x3c\x51\x09\xbc\xba\x9b\xd4\x69\x10\x72\x14\xbb\x45\xb1\x90\x29\xc2\xf5\xef\x13\x9f\x28\x0d\x44\x0a\xe6\x2b\xc2\x91\x9f\x4d\x6f\xc1\xd4\x66\xa7\x61\x9a\x06\x46\x0b\x14\x8b\x93\xfe\x25\x44\x19\x21\x62\xd8\x76\x32\xf9\x5d\x4c\x42\xc4\x60\x60\x13\x96\xa9\x7e\x7c\xb3\x20\x35\x64\xe8\x9c\xdd\xe1\xd3\x38\x0b\x51\x68\xaf\x45\xc5\x5b\x5f\x8a\x75\x17\x8d\x35\xc7\x8b\x5e\x2d\x17\xcb\xe2\x24\x96\xbf\xa8\xec\xa5\x49\x62\x08\x97\x0e\xbc\x3c\xf1\xc2\x64\x90\x2e\xe8\x6d\x45\x9a\xc8\x38\xb0\x1b\xc3\x68\x6b\x72\x87\x95\x99\xc3\x98\x20\xda\x3d\x3d\xaf\x30\x49\xd4\x57\xbd\x53\x4a\x89\xc9\x7f\x5a\x55\xca\xa5\x23\xe3\x10\x29\xcd\x98\xa1\x5c\xe1\x5a\x17\x60\x0d\xe5\x55\x55\xbd\xcd\xe6\xa2\xd2\x94\x28\xe2\x72\xa1\x65\x5b\x9f\x2f\x12\xa1\x29\x23\x0a\x5b\x81\x36\xf7\xeb\xbb\xc7\xdd\xcd\xe3\xcb\xc3\xf5\x62\xbb\x7e\x7c\xd8\x2d\xee\x1f\x5f\x1c\x88\x58\xa4\x2c\x54\x08\xa1\xed\x7c\x2a\xac\x2e\x5d\xe2\x0c\x53\xc6\x8d\xbe\x89\x28\xb8\x7c\x33\x40\xd9\x61\x90\xdc\x1d\xc7\xce\x34\x04\x5f\x99\x3c\xf7\xc5\x1c\xb6\x43\xb3\x58\xa1\xe7\xc1\x95\x42\x46\x84\xc9\x95\xb2\xc4\xd4\x1b\xba\x20\xe9\xa2\x88\x3d\xca\xf7\xbb\x1f\x64\x01\x56\x2f\xf7\xbc\x71\x9a\x58\xee\xae\x32\x90\x48\xa6\xe1\x6c\x3b\xca\xbf\xfb\xa5\x87\x4a\xe2\x6e\xdb\x89\xe8\x8e\xe3\x8e\x73\xcb\x9b\x97\x86\xef\x21\x24\x84\x5c\x55\xbc\x56\xfd\x78\x1a\xa7\xc1\x6c\x4f\xce\x7c\x26\x2e\xe5\x69\x88\xbd\xb1\x05\x6f\xda\xdd\xa1\xdf\x8c\xd2\xce\x60\x50\x4f\xd0\x7d\x2a\xd5\x10\x26\xe4\xc6\x08\x93\x58\xf5\x3c\x6c\xdf\x78\xad\x3e\x61\x0f\x14\xa9\x50\xa6\xdb\xc6\x3f\xa9\xae\xde\xa7\x3e\x43\x2a\x43\x23\x33\x62\x84\xd0\x93\xb7\x97\x46\xad\xcb\x25\x78\x81\x16\x91\x4a\x9a\x20\x82\xfe\x4f\xf1\xdf\xff\x4d\x37\xa2\xfb\xa9\xc6\x0e\x92\xa6\x85\x23\xf5\xe7\x53\x22\x41\x45\x42\x5e\xbe\x5d\x57\xef\x9f\x40\x33\x52\x25\x0c\x12\x49\x17\xf9\x71\x5a\x80\x4a\x51\xab\xcb\xda\xd6\x2e\xc4\xbb\x2d\x2a\xc1\x8b\xc5\x49\xe5\xed\x20\x87\x91\xea\x28\x23\x89\xab\x61\xa2\x92\x41\xde\x83\x71\xfe\x19\x90\x8b\x3c\x86\xfb\xf3\x34\x95\x91\xea\x58\x12\x35\x7c\xf3\x4f\x55\xdd\x56\x9f\x7c\x63\xcd\x85\x4a\x5d\x6a\xd9\xf5\x91\x38\xb3\xc9\x08\x61\xb1\x6d\x5f\xba\xbb\xfb\xbe\x03\x95\xb7\xbb\x80\x8d\x62\x6d\x46\xd2\xc8\x35\xd3\x3e\xe7\xcd\x54\xf2\x51\x30\x22\x22\xb4\x73\x35\x97\xd0\x05\xc4\x4b\xef\x5a\xb3\x80\x30\x6a\x9b\x84\xff\x17\x1a\x41\xc1\x82\x88\x6a\x53\xcf\x72\xfb\x59\xe3\xcf\x09\x99\x69\x28\xf6\x11\xd6\x68\xcb\x9e\x4d\x24\xb3\xd0\xca\x98\x34\x47\x28\x95\x61\x80\x71\x47\x22\x43\xb3\x60\x02\xfa\xce\xc4\xf0\xbc\x84\x7a\xa1\xf8\xb1\xfd\x95\x4b\xc4\x42\xea\x73\x90\x06\xd0\xb9\xad\xae\xcf\x25\x3f\xe4\x72\x24\x74\xe6\x46\x67\x1c\xdb\x76\xee\x9f\xb6\xe3\xa0\x7a\x6a\x3d\x3e\x9d\xc4\x2c\x82\x50\x98\xb6\x15\x84\x89\x9b\x6c\x0b\x1f\x4b\x1d\x0c\x3a\x55\x06\x66\x88\x45\x9a\x04\x46\x7c\xb1\x69\xa7\x52\xe5\x82\xc5\x89\x0c\xcc\x34\x29\x89\xad\xf8\x8e\xa9\x4f\x05\x4b\xe2\x00\xbd\x8c\x83\x68\xe5\xb6\x7a\x69\xa6\xf3\x20\x49\x03\xe9\x5b\xf8\xbf\xf6\x83\x58\x22\x0d\x50\xf2\xf6\x65\x7d\xbd\x1a\xba\xbb\x2c\x51\x19\xd6\x89\xd7\xdf\x5d\x6a\x90\xd1\x4c\xa0\x96\x9d\x23\x79\xf9\xa4\xfa\xc7\x52\x92\x46\x3d\x9c\xd7\xfa\x93\x73\x91\x18\xbb\x6c\x22\x16\x2c\x05\x89\x95\xf5\x12\xde\x0d\x58\x70\x6c\x9c\x18\x23\x11\xf3\xf0\xdd\x65\x55\x6d\x00\xd4\x90\x61\x4a\x30\x46\x4d\xf7\x6a\xe3\xc0\x3e\xe8\xe5\x43\x7d\x83\x34\x9b\xce\xe1\x64\x4c\xd1\xa1\x7a\x57\x75\x38\xe4\xed\x61\xaa\xd3\x2b\x18\x03\x86\xc6\xf0\x8e\xb7\xf9\xe9\x60\x04\xee\xdd\x29\x32\x12\x62\x06\x08\x4a\x75\xcd\x5b\x08\xdc\xdf\xb9\xcc\x42\xb7\x63\x7c\xf2\x92\x44\x10\x62\x2c\xf3\x74\xb7\xd8\xde\x3c\x3e\xdf\xef\x7e\x2c\xee\xee\x56\x6e\xaf\x65\x82\x53\xc4\xeb\xe7\x98\x4c\x40\xc2\xd8\xbf\x8d\x5f\xd9\xe4\x74\x42\x85\x5e\xaa\xa5\xe5\xc5\x4d\x4f\xf9\x2e\x98\xe4\x26\x0b\xae\xaa\x7b\x5e\xd7\x39\x77\x6d\x61\x82\x49\x91\x21\xe7\xdc\x5d\xb5\x47\x72\xa8\x3e\x9d\xc1\x54\x18\x63\x98\xd4\x19\xb6\x75\xb3\x90\x6d\xfe\xd3\xff\x4c\x45\x11\x3e\x1f\x96\xb9\x77\x56\x0e\xb0\xf3\x60\xdc\x00\x08\x28\x25\x43\x64\xa0\x29\x65\xfb\xc3\x60\xa8\xe7\x10\x19\x77\xcf\x73\x24\x74\x31\x5d\xef\x46\xee\xc0\x8e\xd3\x3c\x46\xa7\x57\x0e\x5a\xb1\xd6\xe5\x92\x9f\x0a\x55\xdb\xb8\x83\x4d\x4c\x81\x16\xa6\x49\xbe\xc1\xcd\x57\x42\xd9\xbd\xba\x6d\xf5\x7b\x5e\x14\xc3\x60\xa4\x1b\x07\xd2\xe7\xa1\x9b\xb6\x8b\x8c\x3f\x6d\x31\x33\xbf\xc9\x48\x9c\x10\x9b\x26\x41\x79\xff\xab\xd3\xb9\x57\x17\x1d\x7d\x8f\x8c\xa4\x11\x7a\xd3\x56\x04\xc7\x40\x6e\xe6\xa7\x42\x46\xb4\xc6\xc4\x11\x76\x8e\x4e\x0c\x42\x16\x44\x0c\xcd\xec\x4b\xc9\x3d\x3b\x84\x05\xfe\x8c\xac\x4b\xec\xc6\x8b\x04\x71\xf0\x8b\xbb\x97\x3f\x7e\x89\xe2\xcf\x02\x15\xa5\x36\xd8\xb7\xf0\x91\x01\x29\x8b\xc8\xc2\xd0\x48\xb2\x9b\x5c\xda\xf3\xc5\xe2\xc8\xc2\x24\xb2\x99\xd8\xcf\x7a\x80\x45\x16\x05\x24\x34\xa0\xa8\xa6\xf9\xfd\x1f\xcb\xf1\x72\xce\xa2\x04\x30\x89\x25\xf2\xbd\xa8\x2b\x84\xbf\xb9\x23\xd2\x70\x36\x8b\xb1\xdc\xfb\xe4\x0e\xe2\x18\xe2\x1e\x47\x8f\x23\x6e\x6b\xfe\x59\x72\x37\x8b\x53\x8d\x88\xae\xd5\x07\xa6\x13\x9f\xa1\x41\xee\xd3\x41\x81\x24\x8b\x01\x30\x14\xb3\x74\xdc\x76\xda\x61\x86\xd7\xcf\xcc\x2c\x09\x29\x5e\xb6\x8b\x65\x2b\xc3\xc1\x60\xfa\xd9\x9b\x91\x02\xa7\xc8\x12\x91\x62\xe3\x90\x65\x6d\x9d\x9f\x58\x89\x8a\x51\x4d\xcd\x75\x00\x8d\x99\x46\x3e\x99\x8d\x89\x26\xae\x28\xbc\x3c\xd5\xc8\xca\xb3\xf6\xf7\x47\x13\x99\x18\xb8\x46\xde\x2d\x01\x5c\x7c\x93\x16\x84\x8c\xa6\x46\xf1\xa0\x36\x02\x11\x88\x3d\xed\x9f\x90\x32\x2e\xfb\x7e\x62\x7f\xe3\xa3\xb7\x49\xb9\xe2\xa9\x85\x2f\xbd\x94\xc7\xce\x82\xb8\x9f\xa7\x49\x94\x11\x9f\xee\x33\x7d\x06\x13\x2f\xfd\x12\xfc\x90\xa5\x34\x42\x4c\xb9\xab\xd7\x89\x4f\x8b\x75\xf6\x07\x2c\xd0\x08\xa2\x1c\x36\x19\xcf\x4d\x13\x96\x9a\xee\xe8\x63\xc1\x25\x72\x30\xce\xef\xf5\x6e\xb4\x64\x8a\xf6\xa0\xf5\x06\xbb\x47\x3b\x9f\xd2\x0a\xfe\x4f\xe6\x70\x46\x24\x72\x64\xe4\xbe\x6e\xf4\xab\x12\xa3\xfb\x21\xcd\x38\xf3\x15\x84\x51\x67\xb4\xc8\x78\x12\xa2\x48\xcd\x75\x55\xe2\xf7\xbb\xe7\x2d\x3a\xf4\x5f\xbf\x10\x0e\x12\x71\xb8\x95\x0d\x71\xd6\x6a\xc4\xbf\x28\x32\xae\x59\x14\xf7\xca\xc4\x55\x91\xcb\xf3\x78\x6b\xb1\x03\x85\xa4\x58\x28\x3b\x72\xc4\x3d\x5d\x54\x0a\x32\x99\xa5\xc8\xb3\xb4\xc1\xcc\xd5\xaf\x8d\x8d\xd2\xa9\x12\xe3\xcc\x3c\x37\x49\xa0\x49\x74\x9c\x01\x31\xd6\x73\x0e\xc2\x35\x1a\xc9\x49\xc0\x62\xa3\x02\xd6\x9c\x06\xb9\x71\x4e\x92\x10\xcb\xce\xcf\xa0\x6b\x68\x5e\x97\xaf\xf9\xf1\x05\x91\x27\x58\xc9\x19\x6c\x04\x9c\x50\x26\x6d\xaf\x88\xcd\xad\x54\xf5\x37\xc3\x2c\x3e\xfb\x86\x79\xc8\x4d\x4b\x01\xf2\xfa\xdd\xe7\x65\x3b\x26\x06\x99\xce\x69\x1e\x51\x25\x6c\xfe\x17\xdb\xa0\xe7\x1f\x24\x4a\x39\xbe\xed\xb2\xbe\x07\xde\x9c\x6a\xcb\x9f\xe8\x8f\x2a\xd7\x66\xb3\x28\x0a\xc7\xf3\xd8\x5c\xe7\xcd\xf1\xd4\xc2\x55\x55\xaa\xa1\xf3\xc6\x23\x16\xa3\xd2\x8a\xc6\xec\x84\xa1\xd9\x9f\x7f\x98\x48\x2a\xe4\xd6\x15\xa7\x52\x5d\x36\x5f\xda\x41\x31\x07\x6c\x55\x7b\x80\xf7\xeb\x53\xb9\x87\xaa\xbc\x29\xaa\xea\x42\x80\x67\x58\xe7\xb8\x48\xae\xf3\x84\x46\xc4\x31\xfa\x05\xe8\xa3\xb8\xbb\xa5\x84\x62\x09\xbc\x5b\xbf\x0f\x1e\x93\xc4\x29\x55\xb2\x5b\x55\xbf\x3d\x6e\x5f\x1e\x46\x39\x1b\x4e\x79\x44\x6c\x30\xf5\x7f\xa7\xaa\x1d\x32\x89\x09\x9e\xc6\x92\x0c\xa7\x99\x82\x1f\x80\x9c\x77\x73\xd9\x11\xce\x32\x86\x05\xaa\x5d\xb7\xbd\x42\xd9\x62\xb7\xf8\xfc\xd0\x8c\xc7\xb8\x5a\xaf\x73\x7e\xa8\x4a\xd5\xbd\x75\x77\x4d\x1e\x85\x26\x4e\x3a\x89\x83\x81\xa3\xef\x90\x43\x70\x87\x7b\xfa\xae\xe9\x73\x0d\x9c\xc7\x46\x19\xd1\x40\x32\x3c\x0c\x7a\xe2\xe6\x22\x19\x2b\x36\x7c\xd6\xb9\xbf\x1f\x7b\x48\xc4\x11\xe6\xd8\xf2\xc6\x62\x78\x07\xe1\x2d\x17\x5a\xe0\xd3\xff\x44\x65\xd5\xed\xf9\x08\x2e\xc8\xe6\x8a\x52\x04\x8a\x1e\x76\xab\xed\x37\x5b\xf6\x1d\x46\xf5\x5c\x29\x40\x23\x69\xb4\x12\x1d\xf3\xcd\xb4\xee\xc9\x95\x56\x91\x67\xb6\xbb\xcd\x7f\x42\xb9\x78\xf7\x38\x35\x0e\x51\x82\x02\xf8\xd7\x8b\x47\x43\xd3\x6f\x13\x58\x4f\x43\x42\xf4\xcf\x40\x49\x1c\x62\x23\xbb\x60\x66\xae\xc3\x48\xba\x83\x69\x1c\x39\xc9\xa8\xd5\x96\x6e\xab\x69\xbc\x35\x34\x74\x1c\x52\xa1\x8d\x46\xac\xfa\x76\x14\x0f\x83\x96\xa3\x0b\xec\xf1\x28\x91\xc0\x35\x01\xec\xc8\x57\xeb\x32\x9f\x83\x79\x73\x9d\xea\x50\x7b\x5c\x8e\xa5\x3d\x1b\xcf\x15\x0d\xda\x68\x2f\xf3\x37\xe8\x4e\x33\x6e\x18\x16\x24\x4e\x74\x67\xa5\x9f\x4e\xa2\xc8\x65\xe7\x85\x14\x3f\xa7\x56\x50\x90\x44\x67\xd6\x95\x5d\xb7\x70\xb0\x25\xfd\x9b\xaa\x5e\x14\x73\xb5\x56\x41\x38\xc3\x24\x4a\x01\xbc\x69\xb1\xd5\xc9\x1d\x00\x23\xa5\xa8\xda\x5b\x68\x97\x79\x7b\xbe\x1e\x34\x95\xdb\x31\x41\x20\x11\x1c\xb5\x13\xa7\x19\x0a\xa3\x61\x04\x2b\x02\x91\xe2\x26\xcd\x8f\xf9\x94\xb1\x4c\x88\x40\x49\x0c\x0d\x56\xcf\xcb\x90\x74\xd1\x77\xaf\x7c\x23\x44\x18\x13\x8c\xbc\xad\xf7\x65\x05\x6c\x3b\xb3\x1c\x46\xb3\xf5\xed\xcf\x50\xe2\xf6\x7c\x51\x10\x23\x77\xad\x85\x90\xa1\xf4\x88\xf3\x1f\xbb\x38\x00\x99\x7f\x6e\xaa\x6a\x21\xf2\xc9\xe3\x46\x51\xe8\x40\xc7\x37\xa7\x72\xd3\xf6\xbf\xd2\x0a\xe9\x92\xde\x0c\x7f\x28\x32\xae\xd9\x43\x71\x1c\x61\x9f\xb5\x38\x15\x6f\x9d\xdd\xff\x0e\x4d\x7b\x99\x81\xbf\xdc\x01\x44\xcc\x25\xe6\x57\x6f\xaa\x1a\x29\x8f\x6a\xc3\x11\x7d\xbe\x98\x8f\xe3\x7b\x8c\x75\x8c\x1c\x55\xcf\x8f\x77\xab\xdd\xe6\xe5\x69\xf5\xfc\xb2\xf1\xb5\x32\x91\x70\x03\xa4\xc1\x06\x42\x75\xd7\x2f\xd8\xed\x6b\xb7\xe3\x55\xc5\x64\x4a\x8a\x44\x07\x81\x74\x20\xbe\x5e\xf6\x69\x06\x94\x24\x28\xcb\x10\x6e\x89\xad\x5a\xdd\x6c\x73\x7f\x17\x11\x76\x29\x48\x43\xac\x01\xca\x6a\xa8\xfa\xe3\x32\x31\xf2\x08\x9d\xbd\x4d\xc3\xc9\x0d\x50\x25\x23\xee\x97\xcd\x6a\xe0\xeb\x8b\x34\x30\x54\x13\x03\xad\x81\xb1\x12\xa2\x10\x69\x1c\x38\xb1\x42\xd7\xe8\x3e\xe5\x85\x13\x22\x4d\x38\x76\x43\x2b\x10\xa7\xfd\x5d\x35\xab\xcd\x23\x04\x4b\x12\xdc\x8a\x6e\x17\xf7\xab\xdd\x66\xbb\x78\xde\xee\xb6\xeb\x7b\x17\xbc\x0a\xc6\x44\x66\x77\x17\x8f\x36\xba\x3a\xe3\x4c\x18\xda\x61\xc1\x64\x88\xa1\xe6\x8f\xfc\x72\xde\x7e\x59\xe3\x15\x59\x4c\xd0\xdf\xbf\x3a\x61\xcd\x69\x12\xf3\x89\x8c\x0b\xcc\xae\x76\x0e\x9a\xe1\x0a\xf9\xe4\x34\x22\xa6\x18\x36\x74\x31\xc3\x2e\xd9\x0d\xf6\x01\x91\x09\x03\xd9\x94\x96\x24\x0e\x8c\x99\xba\x71\x1a\x96\x33\x1e\x9f\xe0\x41\x4c\x88\x83\xa4\xb6\xb0\x77\x4c\xd2\x93\x51\x89\x91\xbd\xfb\x71\xfa\x13\x90\x30\x73\x98\x9d\x12\x9c\x07\xf8\x05\x16\xea\x67\xe7\xcc\x8e\xfc\x12\x21\x52\x2a\x8d\xc6\x4d\xb9\xdf\x42\x7d\x18\x32\xc7\x34\x7e\x10\x98\x2a\x50\x0b\x4d\xfb\x50\x1d\x5f\xca\xba\x2a\x8a\x80\x8e\x1b\x7d\x27\x77\x2e\xe3\x0c\xd7\xba\xad\xdc\xbf\x0f\xe6\xa4\xcc\x12\x84\xe4\xef\x2e\xd3\xf1\x86\x7e\x79\xeb\xe8\xd7\xe7\xb7\x24\x01\x24\x51\xc4\xb5\x9a\x95\x3f\x20\x1f\xf3\xe3\xdb\x51\x3a\xd4\x14\x2d\x7a\xfe\x01\x05\x76\x09\xfc\x6d\x8c\xed\x18\xcd\x90\xd8\xfd\x4a\xd0\xc8\xb8\xa9\x9e\x2f\xf9\x13\x0a\x05\xff\x03\x53\x21\xc7\xcc\x8b\x29\x30\xce\x48\xaf\xb8\xc1\x52\xa3\xb9\x6d\xab\x43\x65\xd1\xed\x63\x60\x90\x24\x31\x8d\x1d\x75\xc4\x1e\xba\x6d\x41\x0c\xba\xa4\xec\xa0\x80\xca\xc4\xa6\x4a\xae\xeb\xd3\xfe\x17\xd1\x90\x0c\x44\x8c\xfb\xee\x4d\x55\xc3\xc7\x00\x13\x26\x43\x12\x1b\x04\x7b\x5e\x2e\xf9\xb1\x07\x9c\xc9\x90\x4a\xac\x85\x6f\xab\x72\xd4\x62\x2c\xa3\x48\x26\x56\x6b\xc9\xc6\xe2\xee\x48\x4c\x35\xc6\x12\x0a\x5a\x2e\x5f\x7b\x94\x4f\x77\xd1\xbe\x78\x29\x13\x2a\x11\x7f\xb5\x7b\xe5\xb5\x7a\x86\xff\x9c\xf2\xda\x90\x9f\x8f\xb7\x7c\x99\x50\x43\x02\xd3\x40\x8b\xc8\x94\xf7\x9d\x0d\x8a\x07\xe5\x60\x99\x30\x8d\x9a\x72\xf7\x9b\x3f\xdc\xec\xf6\xd7\xc9\x74\xe4\x71\xbc\xfb\x27\xab\xac\xe7\x5f\x33\xa5\x82\x1b\xc1\x8d\x73\x0d\x8e\x28\x4a\x48\x9a\xa5\xbe\x32\x69\x1f\xe1\x19\xf0\xcb\x3e\x54\xa3\x49\x2c\x29\xa7\x88\x4c\x81\x52\xad\x97\x8f\x98\x0e\x0c\xfd\x31\x88\xf0\xda\xd6\x91\x34\x54\x66\xbf\x96\x8f\x9e\x9d\x5f\x32\x8d\x8c\xd0\x60\x03\xed\x0f\x9e\x7b\x35\xa6\xd1\xbc\x92\x2c\x8c\xb1\xe1\xfd\x2d\x2f\x8a\x35\xb6\x3d\xdd\xe4\x9e\x47\x42\x32\x91\x45\xb6\xd8\xb0\x33\xec\xaa\x63\x4b\x2e\xb3\x54\x46\x86\x0b\xd2\x0a\x71\x43\x9d\x57\xaa\x79\x18\xc8\x88\x0a\x99\xb1\xc0\x26\xc2\x0d\x2a\x61\xb2\x9b\x49\x01\x80\x38\x6f\x4c\x21\x1a\x3a\x93\x21\x88\x51\x4a\xa2\x20\xb0\xa2\x0b\xae\x35\xfd\x17\xd9\x70\x29\x99\x11\xf5\x5e\x6d\xbf\x2d\x1f\x1f\x90\xcb\xfb\x2a\xaf\x95\x0b\xc0\x27\xf3\x5c\x66\x1c\xbd\xaa\xf5\xf2\xf1\x1d\xe0\x2d\x5c\xf9\x70\x40\x4a\x91\xa0\x61\xfe\xc6\x8b\x2a\xba\x7e\xaa\xda\xa7\xaa\xe5\xed\xa4\x72\x27\x15\x53\x4e\xc8\x76\xd3\xf2\xda\xa2\x4e\x67\x9a\xe8\x25\xa4\x19\x06\x87\xa6\x79\x02\xab\xa1\xc5\x0c\x22\x51\x6a\xc5\x10\x7a\xb1\xb8\x1d\xae\x3b\xad\xb2\x30\xf4\x54\xb7\xc3\x7d\x57\x91\x48\x26\x7d\xaf\xf3\x53\xc1\xdb\xfe\xf2\x53\x6f\x4b\x91\x24\x45\xa7\x15\xd1\x24\xbb\x5e\x65\xe5\x6f\x93\x61\x56\xd0\xcb\x24\x18\x4c\x8c\x33\x07\x3c\x51\x44\x27\x58\x62\xe0\xcd\xdb\x10\xb4\xa6\x22\x95\xe0\x7b\xe9\x5e\xc8\x13\xc8\x53\x91\x9f\x0e\x8b\xb9\x13\xc4\x54\x61\x59\x0b\x4a\x59\x29\x9b\x3f\xfe\xa4\x28\xa1\x62\x45\x0c\xa8\x15\xb3\xe3\x45\xc5\x5b\xc3\xe2\xed\x2e\x9a\x50\x23\x42\x29\xf2\xb6\x81\xfa\x67\x1f\x4f\xaa\x84\x65\x08\xa8\x6e\x4e\x22\xfc\xe4\xe4\x94\x72\xf4\xd4\xef\x17\x7f\xec\x16\x77\x77\x8f\x3f\x56\xd7\xbb\xa7\xe7\xd5\x6e\x90\x12\x57\xa9\x54\xd8\x1b\x2a\x07\xbb\xb4\x62\x91\x57\x58\x37\xa1\x62\xb3\xd3\xd5\xa4\xf7\x4d\x31\x1a\xa1\xf5\xb8\x96\x12\x4b\x3e\x83\x57\xc5\x54\xca\x89\x2f\x10\x5b\xe0\x88\x1a\xed\xa7\x8a\x69\x03\x59\xf4\x9e\x80\x0d\xfd\xac\x0e\xd2\xf8\x5a\x59\x96\x60\x5e\xb3\xdd\xd7\x68\x65\x90\xa9\xf3\x0e\xb4\x7f\x4f\x9c\x52\x4c\xc9\x5b\x3c\x8c\xf1\x26\xa2\x71\xd2\x53\x71\x49\x30\xf9\xa7\xcc\xa6\x83\xde\xdc\xf8\x3a\xa2\x0b\xfa\x6d\xc9\x7b\xdd\x34\xa7\x41\xe2\x4b\x89\x34\xc2\xba\xea\x3b\xe4\x4f\x46\x12\xc3\x1d\x90\x46\x28\xd6\x75\x3a\x76\x8f\x39\x34\x93\x4a\x28\xc3\xdf\x63\x42\xff\x9d\xa5\x7f\xdf\xd5\x55\x75\x18\xdb\x20\x25\x25\xc3\x77\xda\x99\xde\x5a\x8e\x36\xdd\x4f\x90\xff\x4a\x45\x1a\xf1\x03\x16\x76\xe4\x44\x0c\xed\xdc\xb6\xfa\x53\x9f\x3b\xd5\x0a\x88\xc0\x44\x13\xd6\x5e\x11\xe7\xe5\x0e\x50\x82\x7d\xa9\x77\xe7\x37\x9b\xc1\x5e\xd5\x32\x0c\xa3\xab\x61\xc3\xf2\x5c\x43\xfc\x9c\x73\xab\x34\x31\x3d\x4e\x50\xaa\x9c\x97\x06\x63\xdf\x46\xa1\x98\xc8\x38\x09\xa5\x19\xc5\x9e\x2f\xae\xd4\x5c\x67\x8b\xd2\x3c\x46\xdb\xf0\xef\x2a\x2f\x41\xf9\x22\x77\x73\xd7\x4f\x3f\xad\x52\xb4\x2c\xbe\x45\x6e\xc4\x1a\x2d\x94\x86\x04\x29\xa2\x8e\xb9\xac\x8e\xcd\x2e\x6f\x76\x58\x13\xcc\x47\xad\x85\x40\x02\xc3\xa1\xbb\x33\x86\xf0\x0d\xc6\xfa\x32\x6e\x54\x68\xa4\xee\xfb\x14\xcb\x20\x69\x0f\x24\xe3\x59\xd4\x67\x6c\x07\x04\x97\xb3\x21\x00\x04\x71\x80\x59\x98\x95\xda\x43\x01\x63\xa8\x1f\x04\xb6\xd9\xf4\xee\xee\xfb\xee\x67\x14\x78\xf2\x1f\x08\x43\x81\x19\x94\x53\xd9\xf4\xed\x8b\x10\xc6\x0a\xa5\xbf\x0c\x3b\xeb\xb2\xad\xea\x89\x43\x0f\x61\x42\x12\xa3\xb8\xf9\x83\xd7\x45\x55\xab\x4b\x25\x6e\x01\x61\x16\x61\x2d\xae\xcf\x22\x6f\xaa\xc3\x67\xa2\xc5\xe3\x6d\x1b\xa2\xd8\x78\x12\xdd\x72\xea\x3e\xc0\x8f\xde\x38\xbb\x11\x54\x0a\x62\x1b\x78\x2d\xc9\xa6\xc6\x24\x9e\x3d\x1e\x07\x86\xa7\xcc\x2e\xd9\x61\x8a\x14\x62\x49\x54\x30\x20\x9e\x6e\x36\xa7\xc3\x4d\x75\x49\x93\xdf\x8d\x4c\x30\x74\xf2\x3c\x1b\x3f\xab\xb7\xcf\x7d\x11\xfb\xa3\x24\xcb\x06\x7a\xb8\x8b\xe3\x71\xf5\x01\x72\x1e\xcc\x05\x09\x37\xcd\x41\x6d\x75\xe5\x00\x20\x93\x11\x34\xd6\x78\x0b\x28\x3c\x59\xa3\x46\xcb\x4e\xba\x04\x0d\xb3\x9d\x29\xff\x72\x83\x13\x8d\x75\x4a\xb7\x99\x19\xa8\xd6\xd4\x45\x1a\xd9\x01\xa0\x82\x63\xf2\x51\x59\xa2\x23\x23\x89\xaf\xb9\x37\x60\x40\x75\x24\xa5\xd3\x0e\x3a\x1e\xad\x5a\x65\xaf\x57\x34\x79\x69\x69\x9c\x61\xd7\x21\x6e\x82\x77\x36\x22\xf9\x9b\x3f\x28\x30\x9f\xe2\xb6\x93\x5d\x44\x76\xab\xed\x37\x7f\x38\x0d\x14\x1f\x95\x3b\x93\xf9\x24\x2e\xa4\xc0\x92\x70\x1c\x10\x22\x13\xf2\x97\x91\x2a\xb0\x54\xe2\xae\x25\xa0\x7d\x07\x98\xb8\x40\xc0\x32\xf3\xb9\x9d\x98\xd1\x05\x43\xe3\x27\x09\x37\xfb\xf3\x2c\x49\x30\xf9\xdc\xe4\x87\x1b\xcf\x3b\x3e\xc8\x34\x01\x8f\x58\xe0\x45\x98\xce\x93\x3d\x04\x78\xa4\x22\x1b\x98\xdd\xe4\x1f\xa0\x7a\x75\x42\x01\x5c\x12\x03\x58\xc5\xe6\x9a\x25\x3f\x5e\xf5\x0d\x3c\xc0\xa5\x43\x6f\x74\x26\xe2\xe7\x94\x2c\x58\x00\x57\x24\xd1\x8e\x9f\x51\x39\x6f\xde\x48\x93\xf7\x21\x9a\x1d\x2c\x08\x8b\x8c\x50\x67\x71\x53\x57\x07\x04\x2f\xde\x5d\x80\x17\x91\xc3\x8b\xd9\x82\xd8\x25\x0c\x11\x44\x20\x70\xeb\xea\x05\x8e\x91\x99\x0b\x37\x8b\x26\xdf\xcf\xc7\xa6\x20\x52\x2a\x30\x23\xda\x34\xf9\xbe\xbc\x87\x96\xcf\x9b\x3b\x99\x46\x89\xa5\x74\xfd\x9e\x2b\xa8\x9c\x73\x00\x2a\xa1\x81\x69\xcb\xdd\xe7\x25\x3c\x9f\x90\x5d\xd0\x1f\x4c\x39\xc6\x65\x87\xbc\x84\x9a\x17\xa1\x0d\x6a\xc6\xa7\x56\xa0\xb1\x8f\x95\x5b\x0c\x8c\x43\xe2\x7e\x95\x42\x04\x1d\x32\x5c\xf2\x57\xeb\x6b\x23\x97\x30\x4c\xc0\x68\x12\x67\x41\x6a\xdf\x85\x7c\xf5\x61\x94\x26\x09\x85\xa8\xd7\xa3\xb9\x98\x64\x7e\x4b\xd1\x84\x0a\x69\x70\x46\xfc\xbd\xdc\xe4\x9f\x6b\x5a\xbb\xf1\x32\x35\xcc\x1a\x95\x87\xf6\x6b\xa2\x38\x86\x42\x80\x9b\xb1\xff\x2b\x24\x18\xdd\x6e\x90\xb8\x17\x5d\xa9\x1b\x98\xa9\xca\x8d\xcf\x1f\x44\xa6\x01\xe7\x90\x97\xf7\x79\x09\x83\x66\x2f\x1d\xf0\x38\x4b\x2c\x8a\x7f\xd5\xbe\x6e\xdf\x61\xa0\x9e\x3c\x22\x70\x1a\xfc\xf7\xe8\x13\xe8\x28\x08\x13\xd7\xb6\x5c\x95\x70\x2e\xfb\x08\x5f\xc7\x34\x43\x0a\x80\xbc\x69\x4e\x97\x94\x1d\xc3\x0d\x5f\x27\x81\xa1\x48\x3d\xe4\x65\xfb\x52\xae\x97\x8f\x9d\xdf\x37\x8f\x90\x1a\x3f\x5d\x12\x86\x66\x03\x2f\xe1\xfd\xb7\x4a\xbe\xc1\xf9\x33\xab\xf2\x97\xff\x9d\x5c\x20\x02\x43\x8e\x55\x9d\xca\x76\x51\x14\xcb\x22\xbf\xae\x5d\x18\xad\x13\x69\xf6\xdf\x7f\x73\xf9\x76\xac\xda\xdb\xd3\x45\x3a\x5e\xd3\x24\x94\x8e\x08\x61\x8d\x7a\xa1\x0e\xab\xa3\x29\x64\x48\x7e\xf9\x3a\x75\x90\x74\x4a\x08\x42\x78\x8d\x6b\x77\xb1\xae\x87\xf3\x2d\x25\x01\x58\x3f\x7c\xc2\x81\x35\xb2\x15\x3a\xa5\x49\x68\xba\xd0\x0a\x7d\x6d\xa8\x44\xe7\x57\xb6\x66\x81\x31\x6e\xbb\xc1\x56\xfe\x49\x37\x8b\xfb\x05\x53\xd0\x17\x76\xbf\x41\xee\xf6\x76\xcd\x32\xa3\x68\xe0\x76\xb9\xa7\xaa\xfc\x6f\x3e\x79\xd8\x2c\x21\x98\x26\x13\xe6\xbe\x1f\x35\x2a\x39\x8e\x6d\x98\xe6\x91\x44\x6b\x71\xe0\x1f\x46\xfd\x0c\x51\x07\xee\x32\x9c\x4b\x69\x1a\xe7\x0c\xf7\x1d\xc2\x63\x2e\x2d\xa1\x16\x11\xc5\x47\xfb\x09\x75\xc9\x0f\xde\xb1\x1c\xba\x60\x5a\x85\xcc\xc9\xa6\x7c\xb7\x2e\x23\xd2\xf3\x1f\xdb\xa1\xf6\xe6\xd0\xa6\x68\xc5\x8d\x62\xdf\xdd\xe3\xe3\xd6\x9f\x46\x52\x14\x09\xd6\x56\x4d\x6a\x9c\xfe\xd2\x40\x8c\x26\xc1\x81\xbf\xc1\x10\xf8\xed\x0e\xab\x0c\xdb\x55\x0e\x55\xe7\x48\x5a\xce\x82\xf1\x10\x1d\x52\x4c\x25\xff\x98\xca\x63\xfc\x22\xfd\xe2\x7e\x1e\x07\x44\xb9\x76\xb2\xf1\xcc\x99\x04\xbb\x5a\x2b\xc3\x70\x6b\xf8\xc8\xf7\x10\x78\x44\xb8\x24\x84\x08\x91\xb8\x36\xc3\xfc\xbf\xce\x62\x4a\x42\xa2\x94\xc4\xee\x35\x1a\x85\xb6\x96\xd7\xf3\x24\x93\x92\x90\x24\x44\x8f\xbf\x9b\xd8\xdb\xaa\x0b\x8e\xc7\x52\xa6\x92\x10\x15\xf2\x9e\x5a\xa1\x0b\x81\xea\x91\x14\x94\x24\x41\xca\x42\x32\x10\xde\xd8\x56\x57\xdb\x65\xb5\x9a\x75\x4a\x24\x09\x74\x8a\x1b\x6d\xe7\xf3\x1a\xa9\xa1\x49\x6f\x9a\x24\x61\x1a\x83\xf2\x14\xfd\x46\x1f\x61\xc6\x7c\x49\x12\x05\x29\x26\x49\x16\xb9\xea\xb3\x1f\x92\x44\xb1\xc0\xdf\x2b\x9b\xc5\x19\x4d\x01\x49\xa2\x24\xca\x5c\x7a\x18\x4b\xeb\x3f\xf3\x2e\xb6\xc0\xb8\xd7\x64\xa4\x6c\x21\x22\x24\xfe\x17\x1c\x43\x47\xfc\x66\x8f\x3f\xa1\x8e\xbc\x3f\x26\x49\x94\x46\x92\xba\x0e\x69\x2f\x5b\x38\x7a\x43\x71\xc0\x7d\x4f\x7e\x7d\x5f\xa9\x5c\x9f\xad\x0e\xff\xe4\xc9\x63\x16\x63\xfa\xb6\xae\x72\xe3\x7a\x8c\x8c\x89\x24\x71\x16\x22\x96\x69\xd1\x1e\xf8\xb0\x51\xaa\x3b\x12\x61\x2b\x9d\x6d\x19\xb7\xc8\xa9\x21\x6f\xdb\xdf\xad\xea\xd4\xa4\x76\x6f\x7f\x4f\x43\x2e\x89\x07\x2b\x1b\x48\xae\x3b\x37\xa5\x3c\x36\x00\xb3\xbb\x7f\x8c\x2e\x9a\x91\x58\x1b\x76\x2a\x94\x9f\xbf\xa9\xea\xc9\xf3\x64\x54\x33\x2b\x4d\x38\x8c\xcf\x3e\xf7\x13\x24\xe1\x44\x60\x5b\xb7\xe1\xd1\xb0\xfd\xa8\xee\x82\x3c\x08\xd1\x6f\xfe\xed\xf7\xd1\x7d\x88\x48\x79\xf0\xe5\x16\x09\x68\xd6\xfa\xa9\xe0\x12\x5e\x31\xac\x5c\x37\x57\x5c\x0d\xc6\xa2\xcd\x34\x5a\x2f\x4f\xd0\x5e\x76\x2e\x4a\x22\xe2\xe0\x72\x7b\xfd\x62\x59\x77\xbf\x08\x49\x6a\xa7\x35\x7e\xfb\x61\x46\x46\x12\x91\x84\x58\x26\x43\x19\xcc\x1c\xfd\x93\x6d\x7e\xec\xe1\x8a\x7e\x1c\x37\xf0\x7f\x34\x0b\x13\xb2\x4f\x49\x04\x04\x58\x86\xbf\x1b\xf5\x51\x4a\x22\xa9\x91\x68\x30\x3b\xbe\xdb\x33\xc6\xb8\x9c\x4b\x02\x71\x49\xa4\x56\x44\xf4\x9a\x20\x50\xb7\x79\x6f\x48\x14\xcd\xc0\xf4\x5c\x0d\x89\x13\xbd\xf4\x1e\x73\xc3\x38\x91\x6a\x40\x8b\x65\x60\x9f\x4f\x3c\xbf\x6c\xcd\xf8\x2a\x26\xec\x4e\x14\xe1\x1e\xd1\x7d\xc4\x0d\xd7\xb0\x39\x89\xd9\xdc\x9b\x24\x0a\x42\x74\xad\xb4\x2f\x45\x75\xdb\x7b\xaf\xab\x29\x09\x70\x86\xa9\x62\x51\xc3\xa0\x5c\x7b\xa9\x1e\x7c\x99\x04\x91\x44\x07\x46\x66\xbc\xbb\x8f\xab\xbc\x6d\x1e\xeb\xcd\x69\x40\xbb\x26\x89\xa6\x44\x59\xd2\x7b\x39\x14\xb2\x35\x87\x03\x12\xc6\x18\x3a\x4b\x28\x9b\xaa\x06\xb5\x7c\xe5\xed\x3d\x34\x0d\x62\xa2\x47\x0f\x12\x90\x90\x61\xeb\xcc\x53\x95\x97\x6d\x01\x4d\x33\xd7\x8a\x34\xca\xff\x8c\x96\x57\x40\x32\x43\x89\x68\x3a\x45\x90\x52\xc5\x36\x5d\xab\x25\xee\xc7\x97\x4a\xfd\x7f\x71\xb3\xba\xf8\x66\x9f\xfd\x3b\x7e\xa0\x20\x8c\x31\xb8\xde\x79\x4e\x48\x8f\xa6\x74\xaf\x27\xb0\xd2\xd8\x1a\xa1\xd9\x03\x18\x8f\x0c\x02\x45\x90\xb8\xf1\x1a\x8a\x96\xfb\x3d\xd1\x1e\x0c\x75\x60\x94\x37\x6c\x16\xf3\x9e\x7f\x20\xe3\x8d\x97\x29\x6d\xe6\x5e\x5c\x7f\x6b\x51\x68\x04\x51\x4f\xa5\x63\x5e\x99\x1c\x97\x12\x39\xb6\xcc\x7d\x8d\xed\x6e\x10\x29\x4d\x2d\x6d\xd8\xea\x03\xe4\xa9\xcd\x7f\xc2\xa3\xd6\xb9\x9c\xa4\x43\x64\x10\x13\x1e\x74\xb7\x79\xb5\xdd\xfc\x36\xb4\x51\x41\x9c\x29\x54\x77\xc6\x64\x3c\x9c\x0e\xef\xaf\x95\xec\xf7\xac\x20\xd6\x19\x22\x50\xee\x17\x7f\xec\x96\x8b\xe7\x8d\xfb\x7b\x92\x98\x16\x8f\xce\x43\x1f\x8a\x94\x4f\x9e\x2e\xe1\x1a\x6b\x1f\x3a\x2f\x0e\x47\x9e\x2b\xff\x73\x49\x85\xd1\x77\x16\xe6\xad\xfc\x6d\x9e\xbf\x7f\x7e\x4d\x06\x34\xa6\xb8\x16\x76\x86\xc1\xb5\x8b\x61\x91\x37\xd6\xbc\xf0\xf9\xf6\x52\x19\xa4\x54\x01\x98\x6c\xee\xb6\xb2\xbd\x9a\xd2\xcb\x5b\xc9\x20\xe5\x29\x8f\x7a\x01\xbb\xcd\xd2\x63\xd0\x65\x90\x0a\x43\x14\x6f\x2b\x24\x9d\xff\x82\x5b\xe5\xe4\x6b\xb1\x38\x15\x16\xae\xf9\xa3\xaa\xdf\xa0\x36\xdc\xee\xe3\xfb\x60\x99\xe1\x48\xb0\xe6\xcd\x4f\x25\x26\x4d\xee\x1e\x09\x58\xba\xf1\xe0\x6f\x2d\x8b\x18\x02\xbe\x16\x4a\x3d\xc0\xfb\x06\xf6\x23\xc9\xbb\x5f\x2d\x9a\xa1\x1d\x09\xb8\x8a\xd3\xde\x39\xc7\x3c\x81\xe9\x8b\x9b\xff\x82\x22\x32\x6a\x7d\xcd\x91\xd7\xaa\x6a\xa0\xec\x71\x28\x32\x50\x99\xd0\x06\xff\x75\x5b\x15\xca\x94\x8e\xeb\xf3\xe4\x71\x21\x66\xa6\x97\x1d\x33\x03\x3f\x8c\x6c\xc0\xd4\xe4\x00\xe5\x98\xe8\x6c\x81\xd7\xd8\x76\xe5\xfe\x9e\xc6\x46\x4b\x08\x9b\x22\x7a\x40\x89\x39\x1c\x92\x58\xb3\xd4\xfa\x4c\x86\x6e\x62\xac\x18\x3f\xd8\x11\x42\x22\xe2\xc4\x76\xf1\x5d\xf0\xa7\x8d\x6e\x26\x24\x5a\x22\x53\x94\xf5\x59\x10\xea\x6f\x6b\x14\x76\x44\x40\x65\x14\x3b\xe0\x19\x26\xfe\x2f\x49\xfc\x65\x18\xf0\x2c\x88\x7a\x79\xb0\x30\xa1\x7f\x9b\x9b\xce\x61\xa8\x33\x47\x7a\xf0\x8c\xf2\xb9\x9d\xf1\xe8\xc5\x51\xbe\x57\xed\x27\xa4\x11\x32\x8c\x04\xc7\xfa\xde\xef\xfc\x98\xb7\xbc\x80\x0f\x4f\x39\x24\xc3\x98\x73\xe2\x7b\x23\x9e\xac\x00\x2d\x2f\x60\x33\xd8\xd9\xc3\x84\x1b\xdd\x31\xae\x54\x3b\x74\x0d\xc2\x34\x10\x60\xe5\xef\xeb\xbc\x3d\x9b\x49\x32\x76\x59\xc3\x34\x95\x16\xdb\xda\xe4\x45\x0e\xbe\x72\x22\xc3\x54\x18\xfe\x32\xf9\xda\xfd\xae\xdc\x63\x89\xeb\x78\x6a\xfd\x71\x6d\x75\xea\x61\xcf\xe5\xf9\x19\x8e\xe3\x44\xb5\x0c\x19\x11\x1a\x4b\xf4\x55\x0d\xf7\x79\x69\xba\x48\xc6\xaf\x8d\x05\x01\xd2\xa3\x94\xf0\xd1\x3a\x9a\x5f\xa7\xb6\xb4\x56\x81\x3b\x53\x16\x9a\xb6\x44\x95\xff\x44\x47\xd9\xff\x3d\x65\xd8\x71\xa4\xa0\xc8\x7f\x42\x7d\x5e\xfb\x59\x95\x69\xed\x15\xcd\xf9\x47\x7e\x3a\xe0\xad\x0f\xca\x95\x32\xe4\x31\xa1\x96\xc4\xe5\xf1\x08\xe5\x8c\x2d\x08\xb9\x4c\x62\x18\xe4\xb1\x3f\x03\x94\x4d\x7e\xa5\x4d\xc7\xa3\x63\x16\x40\x5e\xe0\xd5\x7f\xae\x7c\x85\x41\x86\x22\x60\x68\x27\x6e\xa1\x7d\x79\xbe\xfb\x64\x0e\x8b\xc4\x60\xf2\x2d\xab\xfb\x5d\x2e\x6a\x3e\x5d\x9a\xa1\x10\x19\xd6\xbe\xaa\x23\x52\x04\xfc\xd7\x7f\x3e\x21\x55\x18\xf6\xa6\x70\xc9\x4b\xdf\x81\x00\x93\x73\xc8\x90\x09\xbf\x14\xae\x4e\xe7\xc9\x5b\x90\x4c\xbb\xee\x96\xd5\x7e\xdf\x3c\x6a\x3d\xfd\x7d\x46\x02\x3a\x64\xba\xf3\x1f\x48\x2a\xc1\xd2\xbe\x0c\x81\xaa\x54\x46\xcb\xc2\xdf\x27\xc8\x94\x39\x0f\xfb\x86\xe7\x45\xf7\x4a\xca\x66\x24\x7c\x22\x43\xd0\x80\xcc\x18\xf7\xc8\x62\x78\xf0\xd5\x41\x19\xea\x28\x13\xc6\x7e\x19\x2c\x43\xed\x75\xe5\x64\xa8\x99\x51\xc4\x34\x4d\x59\xb7\x75\x75\xba\xe8\x9a\xf9\x5f\xff\x35\x67\x8e\x08\xd1\x98\x02\xba\x07\x95\xa3\x10\xe2\x65\x9b\x80\x8c\x48\x66\x68\x78\x25\x2f\x4d\xa0\xec\xfe\xce\x15\x26\xe9\x56\xed\x6b\xf3\x9f\x7a\xe9\x55\x33\x64\x44\x64\xec\xc2\x72\x74\xdc\x9a\x6d\xb5\x39\x82\x4b\x8a\xc8\x28\x48\x99\x76\xfc\x25\x70\x80\xe6\xea\x7c\x09\x78\x97\x51\x18\x72\xec\x45\x43\x63\x50\x40\xe9\xe4\x89\x64\x14\x2a\xc3\xd2\xf7\x51\x63\xe5\xd6\x10\x81\x4c\xd6\x64\x14\x42\x0c\xcc\x45\x9d\xbb\xbc\xc4\xb4\x36\xf4\x25\x7a\x0f\x8c\x97\x51\x14\xc6\x78\xa5\x6e\xf2\xdd\x54\xb5\x01\xa0\x1a\x2a\x2f\x3b\x22\x0e\x39\xe2\x9d\xae\x16\x9b\x95\xff\x5b\xc4\x31\xd1\xff\xcc\x5b\x88\xdd\x1f\x93\x24\x45\xcf\xfb\xd6\xd1\x30\x0d\x9a\xce\x64\x94\xa4\x46\x0f\xaf\xa9\xa4\xf4\x2b\x38\x4a\x52\x49\xed\x2e\xbc\x46\x07\xf7\x19\xf6\x43\x54\x9d\x8c\x68\x90\x51\xc3\x9a\xbe\x39\xd6\xe0\x43\xb5\x28\x8d\x23\x47\xc6\xb0\x05\x7e\xe8\x29\xe8\x64\xc4\x48\x88\x5d\x4c\xf7\x7c\x08\x37\x93\x11\x8b\x79\x04\xee\xad\x6e\x2b\xc7\xf9\xeb\x52\x13\xc6\x34\xfe\x8f\x3e\xaf\x3b\x35\xb0\xc4\xa6\xc6\xdb\x5e\x23\x79\xf2\x59\x38\x89\x11\x30\xfa\xb4\x18\x45\xca\x11\xb7\xb8\x05\x2c\x56\x56\xea\x1a\x24\xe6\x1c\xc6\x6e\x66\xc4\xa9\x4e\xad\xe4\x87\xdd\xe3\xb9\xc7\x6a\xcb\x88\x2b\x6d\xb2\xd3\x2a\x47\x53\x33\x15\xe1\x1b\xff\x1b\x90\x2f\x31\xcf\x32\xe2\x3a\x76\x34\x3b\x16\x94\xf7\xfb\x49\x55\x13\x5f\x2e\x12\xc2\x70\x56\x1e\x0c\x1d\xeb\x50\x45\x48\x46\x9d\x7b\x0a\x0e\xf9\x8b\xcf\x7b\x3f\x30\xcf\x9f\x36\xd3\xca\x2e\x5c\x47\x77\xf5\xed\x2c\x91\xc8\x69\x7c\x4d\x15\x27\xc0\x3c\xfc\xee\xa9\xf3\x02\x8d\xb8\xfe\xf4\x6d\xab\x44\xe3\x8e\xd3\xb4\x79\x51\xd8\x76\xad\x67\xe0\x6a\x38\xfb\x75\x44\x11\x7a\x84\x8c\xca\xc3\x1d\x39\xd2\x89\xc2\xad\xc5\xad\x99\x67\x68\xda\x47\x3d\x6a\xc9\x91\x91\xb6\x42\x49\x9d\x59\xfd\x38\xe6\xb5\xd7\xf7\x40\x3f\x64\x92\xb2\x93\x31\x91\x31\x46\xe8\x9b\x43\xe7\x0a\x74\x7b\xc9\x97\x26\x2a\x26\x4a\xa0\x51\xfe\x06\x6a\xef\xfb\x63\x82\x2f\xdb\xc0\x64\x1c\x84\x80\xa0\x4d\xa3\xdd\xef\x76\x64\x04\x6e\x5a\x88\x98\x8c\x43\xcd\x10\xb0\x6e\x50\xf5\x6b\x59\xb9\x03\x51\xa6\x68\x3a\x48\xac\x77\x33\xa9\xf1\x07\x01\x9c\x5b\x6d\x1f\xf3\x51\x4f\x70\x58\x32\x8e\x23\x86\xde\x16\x36\x5a\x6f\x2b\xe7\xaa\x0c\x92\x38\x71\x9c\x81\xb9\xc8\xa0\xc3\x70\x5d\xea\xea\x51\xcf\x87\xf4\x71\xcc\x0d\x4d\x50\x5b\xf3\x1e\xfe\x2f\x63\x4a\x08\x2a\xea\xaf\x9a\x96\xb7\xf0\x87\xff\x73\x6a\x82\x22\x53\x80\xf2\xa5\xef\xc9\x7d\x52\xa1\xd1\x8e\xc2\x01\xea\x3d\x94\xf2\xec\xad\xe3\x64\x60\x1a\x66\x68\x4c\x76\x4b\x5e\x14\xbd\x3a\xe6\x68\xb9\xc4\x69\x12\x63\x9a\x0f\x4a\x05\x03\xec\x92\x8c\x53\x9e\x66\x49\x4f\x01\x03\x0a\x27\xd9\x74\x62\xa4\x60\x10\xf4\xe8\xdc\x4c\x6f\x78\xf2\x7d\x19\x49\x92\xd4\x16\xee\x31\xe6\x32\x59\xc9\x47\xed\x38\xed\xfd\xf7\x62\x54\x22\x35\xfe\x03\xbc\x5f\x0d\xed\x4d\xcc\xd3\x0c\x43\x69\xd3\xd7\xc1\xe7\xc2\xb4\x98\x4b\xd3\x0c\x28\x78\x29\xab\x7a\x6b\xde\xfc\xc4\x3d\x8c\x45\xcc\xb8\x73\x93\x96\xbc\xbc\x1e\xfb\x58\x6e\x10\xe7\x88\x63\xd8\x74\x7e\xb4\x5c\xb5\xaf\x3e\x32\xf7\xa7\xd1\x0a\x7b\x9f\x7d\x29\xda\x12\x5d\x77\x7e\x46\x55\xc2\x50\x36\x22\xfb\xd7\xb8\xb7\x63\x90\x8c\x8e\xa5\x2d\x7e\x36\x9e\xb1\xf1\x0a\xd9\xf3\x3f\xa7\x5d\x92\xb1\xb4\x59\x85\xbc\xb1\x79\x1c\x7d\x72\x1e\x5e\xac\x18\x43\x8a\x86\x53\x83\x85\x89\x09\x02\x5d\xc6\x90\x18\x5c\xd2\x4e\x81\xac\x94\xc9\x56\x60\x4e\x75\x38\xd9\x41\xc4\x28\xc3\x67\xba\x75\x27\x73\x4b\x0b\x03\xd7\x42\xd0\xa2\x09\x9b\x9f\x8c\xee\xa9\xbb\x07\xad\xcc\x1c\xef\x2c\x4c\x37\x39\xae\xab\x71\xc5\x41\x26\x24\xa2\xd8\x16\xd8\x93\xc2\xb9\xcf\x93\x90\xc4\xe8\xb8\xaf\x1f\xae\x1f\x97\x8b\x8d\x4b\x4a\x27\x41\x14\x23\xd2\xc7\x52\x2b\x6d\x5a\x38\xfa\x43\x71\x84\x19\x8a\x97\xf2\x27\x9f\x41\x03\xd8\x51\x11\x51\xe0\x13\x91\xbd\xa4\x91\x3b\x1a\x26\x32\x70\xec\x71\xf5\x5b\x59\x29\x98\x67\x19\x97\x49\x94\x30\x7c\xbc\x9b\xd7\xf2\x7d\x90\xa4\x4f\x62\x1e\xd1\x1e\x02\xb2\xcd\x0f\x13\x02\x78\x99\xc4\x9a\xe3\xee\x52\xe4\x4d\xbb\x7c\xbc\x59\xbb\x5f\x26\x94\x31\xa3\x1f\x5b\x7d\x9c\xfd\x1f\xb3\x20\xb5\xbd\x11\xab\x5e\xcd\x71\xfe\x96\x28\x61\xa1\xa5\xb6\xe2\xb5\x7c\x3d\xaf\x4a\x65\x3b\x7a\xdc\x00\x1e\x19\x41\x01\xbb\x18\x26\xd3\x22\xa1\x92\x22\xb2\xc6\x1d\x87\x9f\x50\xb6\x83\x6e\x1f\x99\x50\x10\x59\xd4\x4b\x18\xe3\x14\x5f\x5e\x60\xc8\x65\x92\x42\x88\xcc\x5e\xf7\x7c\xff\xdf\x9c\xbb\x5f\xb3\x90\xa3\x81\x5f\xbf\x9d\x6a\xbe\x69\xab\xba\xdf\xb5\x12\x26\x4c\x13\x88\x41\x40\xda\xc4\xe2\xec\x2e\x13\xb8\x76\x14\x99\x30\x1d\x0b\x2b\x38\xbc\xb9\xec\x3b\x92\x49\x16\x88\xd0\xb4\x0e\x74\xc6\x6f\x03\x9d\x19\x74\xf8\x19\x37\x24\xa1\x58\xb7\xb9\xca\x4b\x5e\x9f\xcd\xf2\xfd\x1e\x7e\x59\x26\x96\x49\x96\x06\xa1\xbd\x6e\x3e\x48\x02\x26\x59\x9a\x48\xea\xb8\x0b\xba\x35\x61\x71\x8c\xee\x38\x0f\x13\x2c\xae\x9a\x60\xd8\xc5\x54\xee\xa0\x04\x6c\x51\x37\x01\x83\x91\x0e\x98\x5c\xfe\x9f\x51\xdf\x92\x93\xfc\xeb\xef\xa3\x57\x2e\xd3\x40\xb8\x4f\xf3\x9a\x17\x6a\xad\xbe\x56\x96\x97\x89\xcc\x08\xba\x10\x7d\x36\xf5\xeb\xf1\x2a\x93\x88\x44\xb1\x85\xd5\x69\x9a\x72\xfc\x8a\x54\x06\xb8\x82\xab\x81\x2a\xe8\x20\xf5\x93\x28\xcd\x11\x79\xdd\x05\x67\x06\x25\xd7\x4c\x3a\x4f\xb3\xfe\x3b\x2b\x2d\xb0\x51\x43\x88\xb1\x1b\x93\x68\xcd\xa5\x55\x83\xed\xdc\xb8\x81\x48\x86\xa4\x24\xd5\xc8\x3b\xd5\x85\xf7\x06\x98\xed\x8f\x08\x89\x3d\x8e\xe2\x54\x97\x37\x75\x75\xf8\x12\x4c\x2d\x69\x20\x63\xcc\xe0\xff\xe3\xa4\xf2\x5f\xf5\x06\x4b\x1a\x12\x70\xf2\x03\xd8\x87\x8e\xa1\xfd\x3c\x03\xbd\xa4\x61\xc8\xb2\x01\x73\xb8\xc9\x2b\x0d\x73\x73\xee\x15\xd0\x30\x49\x6c\xc9\xe9\x90\x97\x57\xa7\x7a\x2e\xe8\xa3\xa1\x08\xd1\xed\x7a\x7a\x5e\xed\xd6\xcb\xc7\xdd\xd5\xe3\xc3\xcb\xc6\x29\xe8\x2e\x6e\x5d\x10\x44\xe3\x54\xa1\x69\xff\x6d\xb5\x19\x6e\xaf\x34\xd6\x09\x7a\x57\xa2\xe6\xce\x57\xa1\x09\x49\x55\xea\x1a\x91\x76\xed\x27\x22\x4b\x93\xe7\x4a\x82\x04\xdb\x1d\x9e\xbe\x3f\x7d\xed\x29\xd2\x24\x62\x51\xe4\x36\x12\x0b\xfc\x1f\xe8\x18\x4b\x9a\xd8\x5e\x35\x74\x4e\x4c\x5f\xb3\xaf\x06\xf4\x63\x00\x83\x5d\x2e\x65\xae\xfa\x6d\x84\x26\x76\x97\xba\x59\x3f\x2c\xee\xd6\x7f\xae\xc6\xf6\x8e\xd2\x98\x62\x0b\xca\x6d\x55\xcd\xbd\xcd\x34\x94\x9a\xf6\xed\xce\xd0\x34\x8b\xba\xe6\xe7\x69\x26\xcd\x7f\xa2\x94\x0b\x2c\xc1\xdd\x3f\xde\x0f\x76\x04\x9a\x42\x84\x94\xcf\x26\x7f\xf9\xdc\x19\xd5\xd3\x84\x2d\x47\x52\x16\x64\xa9\xf5\x00\x6e\xb9\xc1\x4a\xce\xc0\x33\x24\x65\x0c\xd0\xf9\x7b\x47\x0b\xf2\x50\x59\xdf\x6c\xbc\xf8\x28\xe3\x29\xba\xeb\x46\xaf\xeb\x08\xb2\xaf\x7f\xd1\x8c\x71\xb4\x5d\x3b\xff\x2d\x31\x87\x3b\xcb\x61\x3c\x0f\xb2\x19\x1b\x43\xca\xe3\x98\x59\xae\x48\x2c\x2a\x4e\xd2\xc1\x93\xc1\xd2\xa8\x3f\xd6\x3e\x3b\xb9\x2c\x80\x4f\x85\x28\xdc\x60\x2d\x31\x8b\xe4\x18\x00\x76\xa8\x7c\x36\xbf\xfa\xfe\x19\xb9\xcf\x20\x02\x83\x06\x3e\xde\xe7\xe5\xba\xbc\x71\x0e\x02\x15\x81\x0a\x6c\x43\xae\x1a\x39\xf7\x7e\x3e\x88\x28\xc3\xd7\xd6\x9c\xc4\x0f\xc8\x6d\x4c\x38\x9e\x13\x02\x08\xb5\x79\xfc\x5e\x32\x62\xbe\x5e\x40\x65\xc0\xb0\x81\xcc\x30\xe3\x39\x3d\xbf\xdd\xfd\xcb\xdd\x76\x3d\xd0\x84\x90\x54\x46\xa1\x54\x9e\xb5\xbe\x0b\x0b\x0b\xe8\xd6\xc0\x3c\x7c\xd3\xfe\x08\xe2\x88\x03\xae\xf5\xf5\x72\xb5\x5b\x7e\x5b\x3c\xdc\xa2\x12\xc0\xfa\xe1\x76\x00\x41\x93\x14\x12\x85\xed\x02\x86\xef\xe7\x5b\xde\x8c\xfa\x35\xbf\xb4\xf8\x14\x52\xe1\xd5\x1a\x30\x28\x43\x00\xda\x5f\x01\x84\x48\x0a\x22\x0e\x4c\xd3\xf2\xbf\x4f\xcd\xac\x90\x9e\xa4\x3a\xe2\x88\xd3\xaa\xea\x7c\x9f\x97\xd6\x91\xb4\x98\x69\x37\xc4\x72\x70\xae\x65\x85\x79\xac\x1e\x51\x2a\xa9\x4e\xd3\xd0\x96\xe1\xbf\xe7\xf5\xe9\x13\x57\x2d\x25\x31\x71\x91\xcc\xfd\x79\x59\x57\xd2\xad\x85\x34\x88\x8d\x12\x49\xe3\x9e\x6f\x14\x74\xb2\xf1\xb7\x4f\x83\xc4\xb4\xc9\x58\x58\xc0\xd0\x72\xa6\x61\x60\xfa\x4c\xf7\x75\xf5\xde\xad\xa4\x9e\xf7\x72\x03\xe5\xbc\x90\xad\x4c\xc3\x94\x10\x87\xb5\xb2\x98\xc3\xeb\x2b\x77\xc6\x88\x0a\xea\x11\xa9\x4f\x50\xcb\xc9\xdd\x44\x69\x92\x9a\x04\x80\x61\xda\xbe\xcf\xcb\xf6\xc5\xc8\x61\x7f\x72\xb9\x88\x99\x02\xaf\x5b\xf7\xf7\xc8\xfb\x58\x9c\xbf\x0e\xcb\xd3\x38\x15\xc4\x25\x54\x4c\xfa\xf3\xea\xfc\x49\x73\x8a\x4c\x63\xc1\xb0\x8f\xb9\x16\x5d\x5c\x5c\x1f\x70\x89\x77\xae\x9e\xfb\x68\x69\x42\x01\x12\x07\x1a\x59\x72\xf9\x6a\x52\xd4\x79\x7b\xbe\xaa\x4a\xf5\x03\x43\x55\x8c\x53\xdd\xf8\x4c\xb0\x21\xcb\x40\x33\x74\xdf\x52\x1a\x05\x21\xb7\x98\x43\x2f\x3e\x82\xa5\x14\x37\x40\x28\xcc\x2e\xf5\x2c\x02\x89\x3b\x94\x26\x91\x29\x8d\xda\x37\x68\x39\x28\xfc\x61\x46\x4c\x0b\x30\x16\xba\x16\x4d\x03\xc8\x50\x6b\x92\x9e\xb3\xd5\x94\x34\xe5\x0c\x7f\x82\xc0\x7d\xc4\x40\x83\xda\xfb\xb9\x9c\x32\x1a\x52\x9b\x53\x7f\x7a\x7c\xbc\xb3\xe4\x78\xc1\x28\x6b\x98\x32\x96\x06\x06\x17\x3e\x32\x52\xc3\x52\x54\xca\x32\x30\x24\x0d\x50\x14\xc7\x9a\xc8\x2a\x2f\x9b\xc5\x9e\xe7\x65\x63\xab\x0c\xe3\x8f\x92\xd1\x8c\xf8\x9c\xac\xdd\xc4\x26\x23\x40\x73\x9b\x2d\x56\x88\x7f\x5e\x6d\xbf\xe1\x13\xfb\xa5\x92\xe9\xcc\x71\x7f\xd8\xf7\xe4\x8b\x69\xc8\x1f\x5c\x4f\xca\x17\x29\x8f\x38\xe6\x5c\xba\xd0\xb8\xf3\x57\xa6\x64\x9d\x32\x15\x21\x43\xa0\xde\xdb\x4f\x79\x7f\xba\xc8\x28\xb9\x41\x4c\xc6\xc4\xe3\x5a\x6e\x10\xad\x35\x2f\x45\x2b\x53\x91\x51\x4c\x65\x36\xc7\xbc\xce\xdb\x13\x2f\x76\xfb\x53\xae\x06\xfe\x62\x2a\x44\xe8\xb4\x95\x6f\xa1\x24\x03\x01\xe0\xee\x98\x44\x55\x39\x4c\x21\x2f\x54\x33\xd8\xc3\x53\xa1\x53\xf4\xbe\x36\x58\x97\x2d\xd4\xa6\xe4\xc7\xe6\xb5\x6a\xe7\x31\x18\xf3\x4f\x22\x89\x21\x84\x50\xd5\x7d\xbe\xaf\x79\x3f\xd1\x64\x08\x7a\xc8\x64\xb9\x83\x8f\x2e\xb8\xdd\x8d\xea\x69\xa9\xa4\x51\x6a\xe3\x69\x6b\x4c\xcd\xdd\x8f\x5f\x81\x52\xa9\x10\x03\xbc\xf7\x35\xb4\x3c\x9f\x68\x22\xca\x54\x41\x00\x06\x2d\x88\xd0\x16\xbd\x84\x6e\x92\x97\xe7\x27\x18\xb0\x54\xc8\x54\x69\x86\x9b\xdd\x2b\x6f\x36\xd7\xcb\xe5\xd7\x3e\x5f\xaa\xb4\x88\x6d\xb3\xd3\x6d\xe5\xda\x35\x64\x0a\x12\x64\x32\x24\x50\x1b\xf5\x81\xdb\x41\x3a\x34\xda\x33\x77\xd5\x7e\x00\xa8\xf2\xd5\x9a\x29\x3e\x7a\x66\x3f\x4c\x75\x96\x19\x88\x11\x66\xc6\x6f\x6a\x80\x45\x89\x94\xdd\xe6\x35\x4d\xae\x07\x1c\x97\xfe\x55\xfe\xc7\x69\xeb\x72\x88\xa9\x06\xc9\x4c\x2b\xae\xce\x4b\x30\x2a\x3d\xfe\x98\xa6\x81\x67\xbd\x6c\xe5\xeb\x5a\x39\x13\xc3\x48\x10\x1a\x42\xe3\xf5\xf6\xdb\xea\xee\x09\xb7\x7b\x77\x2c\x20\x94\xc5\x1e\x46\x54\xfb\x7a\xec\xbc\x89\x66\x41\x48\x64\xe6\x1c\x37\x74\x83\x6f\xaa\xba\x17\x18\x93\x2c\x88\x8d\xb0\x9f\xaa\xae\xe1\x27\x14\xd5\x71\xa6\xb0\xc9\x02\xce\x6d\x4b\xf1\xb1\xa8\xce\xbe\x8b\x6e\x32\x48\xc4\x98\xdc\xf2\x4c\xbd\x92\x05\x60\x48\x00\x0d\xad\x01\x0a\x53\x59\x9d\x85\x99\x26\x7b\xc9\xc2\x58\x62\xa6\xfd\x95\x37\xaf\x03\xf5\x71\xe6\x0e\x0b\x8d\x82\x47\xbb\x23\x3f\x9b\xb9\xbc\xc3\x2a\x3c\x76\x3c\x4d\x6e\x26\x94\xe6\xb1\x3a\xeb\x62\x52\x71\x4f\xc7\xc3\x90\xed\x49\xb2\x38\xd0\x18\x3b\x77\x53\xc4\xe4\x9b\xb0\x03\xd4\xca\xfe\x4e\xce\x17\x27\x4a\xb1\x5e\xb0\x56\x34\xb2\xce\x07\xbc\x7d\x92\xc5\xa9\x06\xc3\xb7\xf1\xf3\x75\xe8\x6f\xb0\x24\xe6\x88\x33\xbd\xb6\x97\xf1\x7f\x57\xa1\x36\xea\x47\xfb\x53\xd1\xbd\x12\x4b\xe9\xe8\x0f\xc7\x34\xf6\xaf\xce\xa0\x08\x8c\x03\xb9\xa9\x6e\xf8\xc4\x20\x33\x4a\x0d\xc7\x61\xde\x58\x2a\x94\xc7\xd2\xf5\x4f\x48\x46\x53\x23\xb8\x9a\x1b\x38\x8a\x03\x0d\x8f\x17\x3a\xa3\x10\x38\x16\xd6\x67\xeb\x8f\x9c\x8f\x30\x1d\xa4\x3d\xd9\x92\xdd\x6b\x4d\x89\xd4\x31\xd9\x2c\xab\xc6\x99\x3f\x96\x26\x86\x92\xc6\x00\x38\x97\x7f\x3e\xdf\x5f\x2a\x4c\xfb\xa1\x3a\xb3\xe9\x8f\x65\x75\xaa\x3b\x43\x3c\x8e\x0c\x5c\x48\xc4\x58\x10\x23\x82\xef\xbb\x69\xab\xa9\xea\xd1\x5e\xc7\x18\x0d\x8c\xa4\xd2\x7b\xde\xca\x57\x27\x7c\xdc\x77\xd4\x49\xc6\xb8\xa1\x6b\xdf\x3c\x7e\xff\x19\x04\xa3\x2f\x92\x91\xcc\x69\xa7\x6c\x5e\xab\x7a\x62\x09\x59\x26\x99\x36\x55\x5b\xf9\x0a\x05\xfc\x32\x70\x67\x3c\x94\x58\x4f\xcc\x7d\x10\xee\xbf\x2e\x97\xb1\xb2\x9a\xa6\x73\xc9\x0e\x26\x42\x86\xb4\x28\xfb\xfc\x17\xfa\x36\x92\x09\xab\xcc\xc9\x95\xba\xcf\x4b\xa8\x07\x6b\x93\xc6\x13\xe6\x15\x4f\xab\x2b\x99\x80\xc4\xe8\x7a\xf1\x12\xb3\x0a\x9f\x91\x2b\x0c\x4d\x22\x93\x1c\xc2\xc8\x9b\x44\xe3\x57\xcf\x64\xeb\x98\x14\x21\x56\xc1\xab\x23\x42\x6b\xbd\xb1\x51\x2c\xd4\xec\x32\xfe\x1a\x22\x2f\x7b\x8e\x18\xfb\x1b\x08\x38\xb6\x56\xe7\xae\x95\x6c\x5d\x36\x6d\xb7\x5b\x0d\x91\xc3\x0c\x94\x4e\x7b\x95\xbe\x31\x36\x64\xfc\x6a\x75\xa4\xb9\xdd\x3e\xfa\xfe\x81\x31\x8c\x84\xe9\x58\xe1\x9a\xad\xca\x5f\x68\x0c\x4d\xee\x55\xb3\x04\x71\xa2\x66\xe3\x85\x77\x7f\x3e\xc1\x10\x93\xe7\x7b\xe9\x0a\xf5\x85\xe2\xa4\x64\x1a\x08\x35\xfc\x8e\x67\x0c\xdb\x86\xa3\x26\x46\x33\x23\x01\xc1\x7d\xe4\x90\x3b\x2c\xad\x61\x6e\x3e\xc0\x15\x6f\x40\x59\x6c\xfb\xff\xc4\xc2\x22\x33\x12\xa6\x29\x32\x88\x5b\x5d\xba\xd1\x2b\xcc\x48\x68\xf4\xa0\x0e\x7e\xbe\xcd\x3f\x47\x46\x78\x9a\x19\x5a\x1b\xf9\x73\xa7\xeb\xea\xb0\x6b\x72\x05\x3b\xf9\x3a\x42\xca\xf6\x13\x2c\x0b\x42\x23\x68\x7e\xe0\xf5\xdb\xb2\xee\xdc\xd9\x4f\xce\x1c\x88\x04\xd1\xcf\x87\xbc\xcc\xcb\x7d\xe7\x39\xba\x49\x96\x85\x22\x43\xd7\xca\x94\x6b\x56\xb5\x0c\xc9\xca\x83\x06\xb2\x28\x4a\x4d\xe1\xb9\xaf\x96\x2e\xf6\xbd\xa4\xdb\xd8\xff\xce\x22\x4e\x70\x22\x7f\x83\xe2\x08\xf5\x06\x78\x2d\x5f\x87\x36\x23\x8b\x44\x84\x33\xfa\x16\x50\xd6\x06\x4d\x66\xff\x95\xd8\xd0\xc9\xce\x22\xa9\x31\xc0\xbe\xe9\x26\x2e\xcf\xcb\x47\xfd\x03\x78\xd1\xdf\x5a\x1c\x18\xf1\xa0\xab\x3f\xfe\x1c\x5d\x23\x96\x10\xf7\xfa\x90\xdd\x2a\x77\xa0\xe9\xde\xae\x65\x69\x18\x71\xeb\x4e\xa3\x74\x95\xc9\x4f\x7e\xfd\x95\xd3\xd0\xb4\x6b\x16\xbc\x69\x31\xab\xb8\xd3\x81\x0b\x66\xb2\x34\xd4\x98\xbb\x6f\xf3\x03\x3c\xea\x3b\xde\xb4\x33\x28\xd5\x2c\x8d\x28\x26\xfe\xcc\xbd\xcd\x24\x98\xb2\x34\x23\xa8\x2e\x65\xdb\x0d\x07\x8b\x36\x4b\xa5\xd6\x16\x00\xb7\x34\xb4\x49\x06\xae\x7d\x5d\xc9\xd3\x08\x4f\x38\xca\xaa\x64\x2c\x91\x99\x55\xb1\xd5\x9d\x4b\xe5\x36\xba\x8c\x51\x83\xbf\xc2\xb8\x9b\x17\x41\xff\x35\xdc\x00\x00\xdd\x43\x68\x46\xcd\xa7\x9f\xcc\xb3\x2c\xd2\x51\xaf\xb5\xea\xa2\xf9\xd1\x49\xb3\x34\x06\x31\xe0\x17\xfe\xb1\x5a\x0f\x91\x59\x59\x26\x34\x64\x5e\x2a\x03\x3f\x0e\xaf\xf9\xe1\x22\x83\xfb\xc9\x47\xca\x24\x25\x72\xe0\x27\xde\xd4\xd5\xc1\x33\x35\xf6\xc3\x38\x05\x97\x34\xbb\x06\xcd\x4f\x05\xc6\x96\xb9\xc1\x5e\x8c\xe9\x4d\x65\x26\x12\x89\xad\xc2\x47\x84\xb8\x74\xb7\xe4\x19\x3a\x64\x26\xc0\xb6\x9e\x82\xe5\xe6\x98\x41\xe5\x64\x92\xa6\xa9\x27\xba\xbb\x86\x01\x98\xe1\x64\xba\x88\x27\xdf\x4c\x45\x09\x9f\x2a\xba\x2f\x7b\xe7\x6d\xfe\xe5\xab\x54\x63\x00\x65\x5a\xc7\x4e\x07\x2c\x88\xaa\x8d\xe1\xa0\xb8\xe9\x57\xbc\xe2\x89\x93\x17\xbc\xe7\xf9\xa8\x9f\xf8\xc2\xfe\x67\x90\x66\xa9\x85\x54\x2c\xd4\xc1\x47\x64\x19\x28\x2d\x2d\xc2\x6c\x73\xe0\x45\xf1\x19\x24\x73\x7c\x8f\x9c\x90\x40\xf9\x17\xe1\xd5\x39\x7e\x41\x32\x33\xcf\xa3\x20\x39\x09\x33\xdc\x3f\x6a\xfe\xbe\x81\x76\xd1\x3a\x80\xdb\x2c\x40\xc5\xfd\x26\x61\x08\xde\x32\xc1\xdd\x4d\x55\xff\x80\x71\x03\x9b\xe4\x44\x00\x8a\xef\x6c\x57\x8b\xfb\xdd\xed\xf3\xe3\xcb\xd3\x88\x52\x5b\x72\x04\xd8\xa3\xab\xd6\xc0\x83\x23\xe1\x91\x3c\x70\x1c\xb6\x2e\xd2\x6a\x66\x36\x7b\x1e\x26\x1a\x4d\xc0\x76\xf1\x7c\xbb\xda\xee\x16\xd7\xd7\xcf\xab\x8d\xc3\x65\xf3\x90\x49\x81\xd2\x55\x05\xf0\x01\xe4\xf3\xd3\xc9\xff\x49\x2f\x84\x3b\x1b\x50\xdc\x98\x0f\xfc\x0d\x7e\x54\xf5\x5b\xcf\xfe\x7d\xf9\x65\x22\x06\xb8\x70\xa0\x7d\x1d\x54\x82\x79\x04\x80\xd4\x64\x16\x72\x61\x79\x14\x2d\x4c\xd7\x8e\x89\xd3\x38\xe4\xc3\x3c\x9a\x47\xb3\x4c\x9e\x3d\xce\x28\xca\x53\x6c\x4f\x75\x89\xdb\x2d\xca\x9d\xf4\xd6\x8f\x27\x51\x84\x55\xdd\x6e\x77\x5e\x7d\xb4\x35\x9f\x0b\x9d\x78\x22\x53\xac\x82\xb6\xd0\xb4\xab\xba\xae\xea\x21\xa5\xf5\x03\x3f\x80\x23\xc1\x72\x37\x48\x21\x0e\xad\xb5\xdf\xd9\x52\xd5\xae\x1d\x8a\x4e\xda\x71\x69\xa4\x31\x8a\xb0\x0f\x7b\x35\x80\x9b\x72\x96\xc4\xd8\x23\x65\xdb\xbb\x7c\x8d\x6f\x3c\x25\x33\xa2\xd1\x64\xde\x55\xfb\x5b\x5b\x78\xff\xaa\x55\x56\xf2\x2c\x31\x64\x14\x7b\x23\x82\x04\xa6\x1b\xf2\x13\x38\xbd\xfd\x0d\x27\x80\x2c\xec\x8f\x7f\xdc\x3e\xde\x5d\x0f\xbb\xbf\x25\xe7\xda\x10\xa3\x95\xf0\xbe\x56\x5b\x5e\xbe\x7d\x3b\x39\xd6\x3d\xc9\x45\xc0\x89\x53\xf6\x5f\x7d\x1c\x51\x54\xa7\xc6\xfd\x69\x74\x7e\xc1\x35\xf6\x95\x3d\xc0\xfb\xb7\x7c\xff\x8a\x0d\x2b\xf3\xda\x2a\x92\xcb\x54\xe3\x6e\xdb\x9c\x0f\xa2\x2a\x46\x1d\x7c\x5c\x0a\xa3\x18\x66\x85\x65\x36\x79\xf9\xca\x0b\x3e\xdc\xac\xb9\x0a\x52\xac\xf8\x7f\x3b\xd5\xa8\x61\x90\xf7\x47\x52\x86\x05\xca\x23\x3f\x2b\x23\x58\xdb\xac\xb6\xdf\xc6\xd6\x89\x03\x37\x25\xa2\xe7\xd5\x66\xf5\xfc\x7d\x75\xbd\xb3\xed\x5d\x37\x8f\xcf\xbb\xe5\x3f\x1e\x1e\xb7\xcf\x2f\x1b\xbf\x6c\x91\x77\xdd\xee\x77\x50\xb4\xfc\xbe\x2a\xdb\xd7\x4f\x56\x83\x4e\xa9\xb0\xbc\xc1\x58\x96\x19\x4d\x78\x41\x82\x80\x72\x87\xde\x42\x56\x1a\x7f\x24\x4c\xa8\x11\xda\x2d\xf8\x79\xfb\x61\x73\x87\xf6\x12\xb6\x72\xfc\xaf\xf1\xff\xff\xfb\x5f\x18\xe3\xce\x9e\x06\x88\x39\x39\x58\xa2\x7b\xcc\xc8\xab\x3e\x62\x10\x44\x30\x6a\x5f\xda\xa4\xc2\x25\x82\x38\x09\xac\x5c\xff\x6c\x27\xb6\x1b\x96\x50\x24\xeb\xbf\xe5\xcd\x4d\x5e\xf8\xb2\x95\x08\x44\x84\x9c\x8f\xdb\xe7\xc7\x87\xf5\xd2\x81\xb3\x45\x48\x14\x46\x90\x2d\x7f\x83\x2b\x1b\x9d\x8d\x4a\xe7\xc3\x92\x79\xff\x9f\x5f\x99\x75\x11\xb1\x0c\xa7\xcd\xe1\x80\xc2\x56\xc8\x73\xe1\x0e\x65\x52\x18\xf9\x56\x4c\xbe\x40\x6d\x72\xb8\x4d\x77\xf9\x5d\x8d\x60\x8b\x5d\xcd\xc7\x34\xb7\x52\x44\xca\x44\x96\x16\xc9\x8d\x73\xd4\x1b\x07\x11\x07\x11\x66\xd9\x1e\xaa\x76\x51\x22\x6f\xbc\xe9\x6a\x76\x87\x43\x83\xc3\xba\x5f\x3c\x2c\xfa\xbf\x65\x28\x3b\xb5\xd9\x2e\x6e\x57\xbb\x60\x77\xbf\xf8\xa3\x4f\xe3\x88\x98\xb2\xc4\x46\xab\xc8\xf9\xed\xfe\x9e\x30\x89\x9d\x1b\xc8\x7a\xe5\x6a\xa8\xf3\x7b\xb9\x48\xb4\xc6\x89\x7d\xbd\xba\xdb\xfa\xcb\xd2\x10\xb0\x2f\x4b\x79\x8f\x85\x1f\xa0\xbd\x00\xf1\x0a\x1a\x91\x20\xf8\x85\xa6\xc8\x74\xf3\x60\xee\xb7\x5c\x87\x56\xb9\x10\x5b\x88\xfd\xb5\x45\x82\xdb\xc3\xf3\xe2\xfb\x7a\xb2\x69\x09\x2a\x63\x53\x61\x2d\x8a\x4d\x5b\xb9\x82\x9f\x48\x09\xcf\xfa\xb4\xf7\xd5\xf9\x9a\x37\xaf\xdb\x8f\xf1\xa7\x49\x89\xc6\xfd\xee\x95\x37\xab\x52\xf9\xaa\x83\x48\x13\x82\x71\x87\xed\xc4\xc7\xee\xf0\x41\x8e\xab\x7f\x56\x16\x32\xa4\x6d\x47\xbe\x1a\xbc\xd0\x50\xf8\x41\x0a\x96\x2a\x14\x83\x93\xff\xde\x02\x3f\x0c\x25\xa4\xa4\xc8\x98\x51\x0f\xb3\xdc\x2e\x8a\x1f\x06\xdb\xa3\x1b\xa3\x28\x06\x6f\x3b\x83\x61\xd9\xbe\x95\x97\x22\x5c\x52\xf0\x80\x61\x2e\x44\x76\x2e\x41\x8f\xe7\xe8\x77\x36\x21\x08\x95\xce\xad\x45\xe7\xc0\xa8\xde\x15\x9d\xd7\xe2\xb2\x0f\xa7\x0b\x91\xcf\x31\x13\xb1\x14\x22\xc9\xd0\xf0\x5c\x83\x84\x6e\x79\xa3\xc4\x2b\x5e\xcf\x11\x1c\x7f\x52\x32\x9e\xb5\x72\x42\x48\xa5\x06\x70\x2e\xcc\x65\xae\xf5\xa2\x74\xbb\x89\x10\x2a\x30\x6a\xfe\x0e\x5f\x77\x6f\xf0\xba\x57\x3e\xc9\x36\x79\x11\x32\x88\x31\x02\xec\x7e\xf0\x7d\xfd\x64\x6a\xb4\x9f\x80\xc1\x84\x8c\x8c\x8e\x56\xf3\x6a\x10\xdf\xe3\xb4\x82\x90\x51\xc8\x7c\x15\xbd\x0b\x17\x2f\x39\x44\xa5\x90\x4c\xf3\xf4\xb3\x32\xe7\xd8\x7a\x4a\x9e\x24\xca\xe9\x8c\x3a\x39\x76\x57\x16\xf1\xaf\x58\x05\x09\x72\x40\xf0\xc2\x51\xd1\x7f\xae\x02\x21\x85\x12\xd4\xc9\xf2\x5e\xf3\x96\x4f\x90\x34\x7e\x90\x40\x5e\x45\x0b\xdc\xe9\x9b\xbc\x85\x02\xc8\x2c\xec\xe0\x07\x72\x94\x6d\x78\x5b\x35\xaf\x13\x8f\x54\x00\x64\xd9\xc8\xb3\xbc\x82\xf6\x42\xc0\x4b\x0a\x1d\xa4\x81\xad\xae\x6c\x72\xc7\xd3\xfa\xcb\xc0\xe9\xaf\xe5\x38\x84\x96\xc4\x7c\xac\x6e\xcf\x31\x39\x30\x73\x44\x12\x2a\x1d\x46\xee\xa6\xaa\xbb\xb0\x63\x7c\x5f\x92\x00\x60\x51\x52\x57\x75\x7b\x2a\x61\xd7\x40\x9b\x1f\xf6\xe5\xe1\x82\xe5\xe7\x9f\x41\x1c\x4f\x42\x21\x19\x44\x86\xeb\x7f\x0f\xad\xf1\x8d\x16\x0a\xb5\xbe\xeb\xf3\x5c\x97\x98\x0c\x58\xc2\x9c\xaa\x3a\xca\xcb\xd9\xd0\xaf\x3f\x9f\x34\x9a\x4d\x96\xc8\x61\x84\xd0\x93\x81\xd4\x7c\x98\x79\x5a\xdc\x2d\xc7\x9f\x42\x86\x01\x73\x54\x41\x06\x23\x7a\x03\x30\xe8\xb7\x9e\x0c\x4e\x98\x52\xbe\x84\xb9\x01\x59\x75\x93\x1c\xb9\x2a\xef\xaa\x89\x0e\x9d\x94\xa1\x8c\xb1\x6d\xa9\x3a\xb5\x1b\x25\x1d\x2d\xd6\xe4\x8c\x90\x98\x40\xb2\xe0\x4d\xf3\x9d\xd7\xf9\x25\x7c\x5d\x46\x01\xc1\xc4\xc9\x5b\xde\xb6\xe7\x85\x1c\xf5\x13\xfc\x7d\x32\x94\x99\xb6\xd2\xe7\xd5\xcd\xea\x79\xf5\xec\xa0\x4a\xee\x75\xc4\x24\xcc\xec\xbb\xdf\x1c\xa1\x6c\xc7\x4b\x7e\xec\x39\xc8\x98\x2a\xa4\xf4\xb8\x5e\x5d\x2d\xb6\xab\xee\x54\xeb\xc7\xeb\xdd\xfd\xfa\xe1\x65\xbb\xda\xf8\x33\x72\x2a\x43\xa7\x78\x3e\x94\x9d\xb4\xc7\x93\x98\x60\xd5\x7d\x5b\x19\xb2\xab\xab\xbe\x69\x4f\x26\x89\x49\xec\x74\xaf\xbe\xaa\x8a\x70\x60\x5e\x65\x92\x9a\x36\xb8\x9d\x86\x56\xbe\xa2\x07\x72\x75\x5e\xab\x2e\x6e\x7e\x42\xe2\xd0\xb9\x7c\x95\x4c\x38\xc7\x30\x1b\xe7\x34\x0a\x79\x8f\xea\x89\xb3\xaf\x2c\x0d\x33\xeb\xe1\xd9\xe5\x7c\xcf\xeb\xbd\x77\x5b\x65\x1a\x0a\xa7\xec\xd3\x85\x51\xa6\x1f\x66\xd6\x76\xc8\x34\x32\x3c\x4e\xd2\x90\xdf\x82\xda\xf8\x58\x52\xa6\x90\x0a\x69\xa5\x4f\x2d\x81\x53\xef\x35\xcb\x2c\x90\x0e\xff\x88\x21\xc6\x55\x5d\x59\xe8\xd6\xe8\x3b\x07\xa1\x5b\x15\x19\xa5\x89\xa5\x5b\xe9\x5e\x49\x75\x6a\x7b\x65\x4c\x37\x84\x49\x44\x4f\xad\x9e\x97\x69\x18\xec\x9e\x57\xcb\xd5\xfa\xfb\xea\xda\x1f\xce\xb8\xb6\x30\x80\x07\xd8\xaf\xfd\xdf\x39\x31\xb0\xdf\x57\xde\x7c\xaf\x2e\x0a\x41\x92\x67\xd2\x29\x9b\x63\x83\xda\xc8\x8f\x96\x9c\x33\xc7\x36\xb2\x39\x42\x51\x2c\x84\xc1\x4f\x8c\x16\xac\x08\x12\x7c\x15\x1b\xde\x7a\x41\xe8\x19\xe7\xb8\x73\x51\xb0\xdb\x88\x2b\x85\xf4\xed\xed\x7c\xc4\x22\x85\x4c\x10\xe9\x7a\xe0\x1f\x8b\xb6\xe5\xf2\x0d\x6f\x6c\xc4\x3b\x29\xa5\xd0\xb1\x94\x03\x24\x29\xfa\x8c\x17\x44\x14\x52\x46\xa6\x2a\x75\xed\xdf\x87\x0a\x8c\x94\xfb\x8d\xb1\x75\x23\x6f\x47\xaa\x80\xe3\x8e\xf6\xb0\xfa\xe1\xd7\x98\x62\x40\x7c\x27\x88\xc9\x9b\x3d\xcf\x10\x75\x4f\xe6\x0e\xa4\x40\x2d\xca\xd1\x76\xe4\x76\xee\xcd\xe4\xe5\xeb\x40\x84\xc8\xc9\x5c\x9f\x9b\x96\x17\xd7\xd5\x49\x78\xc9\x31\x29\x75\x66\x14\x97\xac\xba\xc5\x45\x4b\xff\x97\x37\xa0\x08\x13\x12\x81\x64\x9e\x3b\x46\x11\x49\xf0\x4f\xbb\x61\x1f\x83\x0a\x22\x81\x9e\x9c\xb2\xc9\xc0\xeb\x1c\xed\x9f\x3f\xcc\x59\xc4\x7b\x76\xde\x65\x55\x15\xd8\x3f\x3c\x7a\xcf\x2a\x90\x31\x56\x21\xb8\xc3\xbc\xfe\x79\xe7\x5e\xa0\x0a\xc3\x08\x17\xc3\x3b\xe4\xf8\x10\xde\xf7\x53\x61\x1a\xe0\xa5\x75\x0d\xb0\xad\x5e\x9a\x91\x10\xae\x54\x51\x4a\xb0\x3a\xe7\x8c\xfd\x12\x55\xa2\x47\xe9\xbb\xc9\x43\xc7\x20\xd0\x83\x6f\xa0\x54\x17\x54\xa4\x52\x25\x29\xc8\xc0\x37\x18\xdd\xf3\x0f\x4f\x35\x37\xca\x6c\xab\x24\x53\x68\x56\x1f\xb7\xdf\x56\xcf\xcb\xe7\x97\xb5\x27\xe3\x97\x8a\x46\x29\x36\x69\x1c\xf8\x1b\x38\x44\xff\xd8\x76\x5d\x7c\x98\x99\x62\x9a\x4a\xe3\x54\x39\x55\x82\xbc\x79\xbd\x3a\x3f\x55\xd3\xbb\x4d\x13\xa3\x35\x74\x53\x9d\xea\x1f\xfc\xbc\x39\x16\xf9\x65\x4b\xfa\xff\xf8\xaf\x3b\x75\x46\x28\xfd\xbc\x21\xda\x88\xf9\x4e\xd8\x9c\xa5\x4a\x95\xc6\xec\x84\xa5\x41\x8e\xfb\x24\xab\xca\xc2\x2c\x1d\x7e\xaa\x85\xd6\xc3\xe4\x8c\xca\xe2\x38\xf4\x29\xcd\x8f\x1f\x90\x3b\x91\xad\xf1\x23\x67\x32\x48\x92\x41\x5a\xd5\xa7\xe8\xab\xba\x79\xcd\x8f\x93\x49\xc7\x03\x82\x22\xc1\xa6\x8c\x7f\xe8\xac\x79\x0f\x7e\x53\x3c\x8c\xf1\x23\xbe\xac\x7f\xe4\xcd\xeb\xe6\x0b\xf8\xf6\x2f\xff\x9d\x7f\x89\x3c\x22\x06\x4d\x83\xd2\x78\xeb\xe5\x63\x30\x79\x1a\x9e\x30\x39\x6c\x34\xdb\x45\x0e\xb0\xe1\xdf\x1b\x4f\x34\x82\x80\x8e\x9d\x89\xeb\x5c\xec\x11\x63\x82\xe2\x94\x62\xa3\xbc\xe1\x61\xbe\x5f\x3f\xec\xee\xd6\xf7\x6b\xbf\xb2\x04\x31\xbb\x86\xc8\xdb\x87\xaa\x9d\x7c\x2d\x41\x43\xb4\x5b\x95\xd6\x45\x5e\xc2\x33\xf0\xe2\xb0\x19\x68\x45\xcc\xd7\x5f\x95\x4c\x03\xbc\x64\x17\x19\x03\xc7\x8f\xb8\xb4\xc1\xc5\xa5\x0e\x90\xfd\x8d\xca\x8c\x40\xaf\xe7\x49\x0a\x48\xef\x43\x2b\x95\x19\xd1\x1f\x97\x41\x9b\x45\xee\x7f\x06\xa5\x9d\x5b\x3b\x3a\x0e\xb0\x0c\xa7\xaa\xce\x22\xf4\x3d\x12\x4a\x27\x31\xae\x18\xfe\x8e\x1c\xf0\x1a\xea\xda\x12\x57\x7c\x5d\x74\x56\x9a\x6a\x30\x62\xdd\xbc\x86\x6b\xc7\x7d\xea\x4f\x2b\x4d\x56\xae\x75\x6d\x3c\x03\xc0\x89\xd2\x4a\x22\x1a\x01\xa5\x3b\x16\xd7\xf7\xeb\x87\xf5\x66\xfb\xbc\xd8\x3e\x3a\x8b\x01\x24\x34\x12\x91\x58\x1c\xbe\xe5\x07\x70\x18\xd3\xd1\x3d\x00\x51\x09\xd6\x0a\x97\xbc\x9b\xad\x3f\xa7\x6b\x03\x82\x20\x0b\xac\x67\x76\x05\xed\x28\xd4\x9a\xdf\x02\x20\x50\x14\x91\x84\xc8\xe1\xe6\x73\x50\x10\x28\xc0\x0c\x12\x3f\x1e\xa1\xa7\x9a\xb3\x07\x43\x62\xd4\xee\x1a\x2f\x13\x68\x1c\xf0\x91\x65\x86\x90\x68\xec\x8c\x28\x4f\x45\x91\xeb\xb3\xff\x33\x70\xc4\xa2\xa1\xde\x3e\x3f\x0e\x56\x23\x44\x89\x32\x5c\x09\x80\x15\x92\xb1\xd2\xa9\x84\x38\x16\x18\x96\x96\xa7\xc3\xd2\x79\x5b\xfe\x98\x36\xcc\x69\x77\x2f\x77\x2f\xcb\xc7\xb5\x83\x0e\x41\x22\x79\x42\xfb\xd0\x6e\x17\x45\xee\x08\x0d\x4d\x0d\xb9\xd9\x2e\xcd\xd7\x9f\x7f\x3f\x94\x46\xb1\xe9\xef\x38\x1f\xdb\x6a\xc3\xf7\xfc\x1b\xd4\x93\x98\x0d\x68\x1a\xa6\xc4\x35\x44\xa9\xea\xbd\x5c\x37\x2f\x6e\x47\x85\x54\x46\x18\xf7\x6d\x4e\xf5\x4f\x38\xf7\x22\x0d\xee\xb0\xe6\xc9\x90\x23\x69\x9c\xd7\x9b\xa5\x76\x9e\xdc\x22\x8b\x35\x6a\x0a\x4a\xb7\xfb\x1b\x15\xf2\xfe\xe5\x30\x4a\x11\xf7\x50\xf8\x3f\xf0\x00\x41\xac\x82\x8b\x73\xff\xb7\x30\x53\x43\x3c\xca\xdf\xe6\x56\xd7\x17\x4b\x0e\x32\x0e\xa6\x8f\xaf\x06\x5e\xff\x76\x82\x7d\xd5\x98\x7e\x72\x87\x0d\x03\xae\x34\xf6\x66\x3e\x3e\xac\xfe\xf0\x7f\x83\xcc\x71\x24\x58\x45\x06\xd5\x99\x15\x47\xf6\x61\x6d\xdd\xf8\x89\x45\x98\xc5\x89\x2b\x40\x39\x55\x79\x54\x16\xfa\xac\xa4\x32\xa8\x1e\x81\xc8\x00\x83\xc7\xcd\x3b\x58\xc7\xf0\xae\xda\xe7\xf2\x57\xdb\xe6\x85\x92\x8f\x04\xc1\x59\x4a\x07\xed\x42\x2f\x65\xde\x85\xb5\x13\x86\x20\x90\x3c\x09\x33\x9b\xf1\xed\xec\xf7\x53\x0d\x03\x37\x15\x14\x09\x1d\x38\xf7\xe9\xb5\x0f\x95\x40\x85\x99\x69\x94\x75\x79\x9b\x45\xa9\x5c\x51\xc4\xa8\x11\x74\xf3\x76\xea\xc0\x80\x4a\x12\xc4\x63\x6f\x96\x9e\x6e\x5e\x82\xa2\x12\x3d\x12\xe8\xeb\x31\x4f\x50\xbf\x94\x79\x7f\x17\x5c\x23\x47\xea\x06\xb5\x98\xfe\xb2\x27\x39\x5f\xb4\x02\xa5\x53\x11\x0e\xd8\xab\x9b\x91\x64\xc2\x64\x30\xc4\x20\x82\xe1\x83\x3e\x54\x8f\xda\xdc\xe4\xb6\x42\xe8\xf7\xf8\x09\x41\xc8\xc8\x4e\x19\x74\x11\x6c\x7b\xea\x20\x94\x04\x4d\x20\x41\x04\x5a\xbe\xcf\x3f\x44\xd5\x9a\x4e\xe6\xf1\x65\x35\x0d\x12\x61\x01\xc0\x8e\x04\xa0\xaf\x02\x68\xc2\x62\xec\x12\xe9\x76\x54\xab\xc8\xef\x0e\x05\x21\xa5\xe8\x75\xe5\xa3\x90\x4e\x07\x40\xb4\x5d\x43\xf7\xbc\x3c\x8f\x2e\x7a\x39\x7d\x74\xd0\x6d\x1a\x4e\x7b\x1c\x39\x13\x0a\x58\x77\x6f\xff\xe0\x45\x3a\xfd\x48\x05\x96\xd7\xf9\x38\x61\xa4\xbe\x90\x00\xfe\xff\xf5\xaf\xbd\x74\x18\x03\x46\x18\x43\xf5\xd3\x5f\x6d\xcc\xf6\xa7\x71\x20\x59\x0f\x3d\xb0\x9a\xbf\x93\x6c\x91\x1b\x1a\x02\x32\x1c\xad\xb6\xdf\x9e\xef\xd6\x0f\xbf\xcf\xcf\x14\x1d\xa7\x46\x3e\xd5\x4f\x4f\xc7\x17\x32\x1e\x96\x50\x65\xf2\x47\x5d\x5c\x6d\x69\xa6\x9a\xdd\x78\x16\xe9\x24\x13\x86\x60\x5d\x56\xd1\xbd\x8f\xfd\x35\x4d\x02\x6c\xdf\x3a\x20\x15\xe3\xce\xba\xef\x21\x5e\xe8\xfa\x02\x74\xab\x29\x03\xac\x31\x8d\x24\x4d\x27\x8e\xeb\xe4\x21\x28\x08\xcb\xfa\xda\x2e\x51\x20\x66\x8c\x51\x9f\x0c\xd6\x01\xc2\xce\x45\x3e\x82\x52\x6a\xaa\x0d\xac\xec\x2a\x6f\xf7\x35\x77\x29\x07\x9d\x06\x04\xfb\x62\xf1\xc9\x27\x22\xb3\xe3\x1b\x4f\x05\xc3\x3e\xd6\x1d\x1f\xaa\x1f\x5d\xbc\x4a\x16\xca\xcc\x86\x43\xa8\x65\x34\xf0\xb6\xa7\x23\x23\x43\x27\x66\x42\x51\x87\x58\xfb\x8c\x88\xc2\xfd\x88\x1a\x26\xde\xa6\xad\x8e\x9d\x3d\x3e\x0e\xbb\x0f\x35\x63\x41\x10\x0c\xdf\xd4\x5f\x6b\x9b\xd1\x19\x61\x58\xfb\x6c\xa1\x69\x61\xff\x49\xb3\x93\x1b\xab\x22\xc8\x5c\x41\xd1\x68\x84\x83\x32\x92\x9a\x4f\xfc\x5c\x9d\xda\x6f\xbc\x71\x70\x25\x9d\x01\x47\xc6\x07\xf8\x38\xf2\x41\xa5\x43\xf3\x28\xc4\x16\x44\x2f\xe9\x36\x85\xf1\x4c\xbe\xaa\x88\x0d\x9a\x0c\xb3\xe2\xbd\x70\x81\xd4\x22\x51\x41\x3a\x44\xea\x1f\xfa\x1c\xcf\xe4\x14\x90\x62\x2d\xc7\x05\x0e\x3d\xcf\xc6\x27\x6b\x47\x26\x19\xd6\xc5\xf3\x52\x0e\x09\xc7\xc7\x6f\x4e\xa6\x80\xdf\xc3\x08\xe3\x7a\xae\x38\x2d\x21\x15\x96\xa1\xea\xa9\xae\xd4\x49\xb6\xab\x52\x55\x75\x83\xa6\x6a\x5a\xe8\x1e\xa6\xdf\xe6\x5e\xb9\x22\xc6\x29\xb3\xe5\x29\x57\x87\xd4\x8a\x65\x21\x1b\xea\x7b\x57\x23\xaa\x54\x0d\x3a\x44\xbe\x91\xfb\xea\xdf\x79\xeb\x9c\x0a\xad\xa3\x0c\xd3\xbd\x46\xb9\xed\xc7\x6a\xf5\xfb\xce\x9f\x51\x27\x51\x6a\x13\x79\xb7\x50\x92\xe5\x23\x4e\xa2\x61\x66\x4a\xeb\x84\x29\xed\x7c\x37\x4b\x76\xd2\xf8\xdf\xa7\x09\x76\x2b\x5d\xf1\xf2\x0d\xea\x1b\x5e\x1f\x7c\xea\x45\x6b\x19\x20\x27\xf1\xf3\xa9\x69\x72\x5e\x2e\xfd\x34\x51\x84\xa4\x12\x23\xb6\xc5\x7e\x9f\x9f\xca\x7d\x8e\x20\xd5\xd1\xf7\x53\x84\x88\x14\x37\xb1\x95\xa8\x46\xe5\x74\x45\x02\x4a\xb1\xe1\x7a\x65\xac\xd7\x1b\x94\x81\x3f\x24\x74\x68\x34\x07\xd5\xde\x95\xc0\x14\x09\x79\x6a\x14\x53\x2b\xb3\xe2\xed\x8a\x9e\x5d\xf8\xdd\x68\x85\x22\x63\xa5\x25\x8e\xb8\x3d\x0d\xda\xf7\xf1\x30\x72\xfa\x3a\x5b\xd6\x85\x4f\xcd\xa7\x0d\xbe\xcc\xfd\x4a\x29\x0c\x8e\x8a\xaa\x69\xb6\xd5\xd2\xd0\x95\xcd\xda\x3f\x45\xa2\x90\x23\xc4\xa9\xe0\x4d\xdb\x8d\x7c\xa8\xfe\xec\x5c\xea\xc1\x14\x51\x24\xe2\x09\x36\x00\xcb\xa2\x2a\x61\xd4\x6c\x33\x01\xcb\x2a\x12\x29\xa2\x86\x9a\xcf\x96\x96\x7e\x7c\xcd\x38\xe1\x08\x2e\x56\x95\xe1\xc3\xfc\x32\x2a\x52\x24\x4e\xc1\x6c\xe4\xd8\x6e\x6a\x2b\xca\x98\x54\x0a\xa6\x27\xb6\xa4\xd0\x7b\x2c\x25\x78\x54\xcd\x33\x2f\xf7\xfd\x3b\x4d\x08\x73\xc8\xfc\x61\x43\x84\x22\x49\xc2\x42\x9b\x9b\x47\x33\x33\xff\xc5\x12\x0e\x4e\x16\xc8\x02\xfb\xe7\x3a\x01\x15\xa1\x84\x63\xea\x4a\xf0\x56\xbe\xde\x8f\xb2\xfc\x9f\xbd\x3c\x4a\x99\x16\xae\xad\x6f\x8b\xf8\x0d\x7f\xd7\x94\xd3\x50\x3a\x15\xb3\xfa\x70\x55\x89\xeb\xbc\x06\xd9\x99\xc5\xbf\x4d\xce\xa2\x62\x64\x95\xff\x3d\x7f\xcf\x7d\xb2\xdb\x9f\x46\x0b\xdc\x41\x9e\xba\xe5\xf9\xbc\xfa\xb1\x78\xbe\xc6\x4e\xcb\xe5\xca\x8d\x48\xc1\x10\x36\xf2\x5a\xe4\x3a\x1f\xa5\xef\xed\x08\x16\x44\x38\xef\x7f\x0e\xba\x3e\xac\x1b\xa5\x48\xa6\x4c\xa8\xbf\x87\x36\x9a\xdc\x18\x57\x51\x38\xe8\x36\x54\x8f\x7a\xf2\xca\x04\x31\x60\x8c\xfb\xf5\xc3\xea\x79\xb3\xdb\x6c\x17\xbf\xfb\xdb\x12\x81\xc4\x39\x78\x77\xf7\x7d\x17\x05\xc1\x6e\x75\xbd\xde\xee\xfc\x52\x14\x12\xb0\xee\x6c\x02\xc3\xa2\x6a\xdb\x2a\xb8\xe6\x97\x4d\xa1\x73\xc6\x58\x11\x19\x07\x61\xd4\xa7\x0b\x78\xae\x26\x37\x26\x53\x92\x99\x3b\xef\x66\xa0\x69\xda\x7b\xcd\x8f\xee\xea\x52\x86\x10\xf4\xd5\xc8\xe6\xe5\x58\x54\xdc\x6f\x48\x8a\x48\x65\x04\xf1\xee\xab\xb2\x0b\x17\x5c\x61\x61\x7e\x7e\x41\x4c\x11\x7a\xbd\xf8\xbe\x58\xdf\x2d\xae\x30\x47\xf1\x7d\xbd\x79\x7c\x1e\x31\x2c\x2b\x02\x59\x08\x89\xaf\x84\xf5\x2a\x7b\x53\x3c\xa9\x1d\xae\xc3\x10\x9d\x35\x74\x9d\xac\xec\xb0\x0a\x08\x0d\xd1\x4d\x58\xf2\xa2\x30\x7c\xa9\x03\xe0\xe0\xd0\x39\x50\x01\x81\x08\x17\xed\x09\x65\x50\xdc\x09\x02\x4e\x51\x4d\x0a\xed\x3d\x36\xea\xbe\x3c\x6f\x9d\x6f\xae\x82\x40\x19\xd0\xc1\x4d\x55\xb7\xd0\xb3\xa8\xaa\x20\xcc\x24\xe2\xc7\x8e\x75\x5e\x5a\x96\x3b\x7f\x08\x0c\x56\x7d\x0f\x2d\xa2\x55\x46\x04\x09\x2a\x88\x43\x3a\xd2\xe3\x47\x47\xe8\x6b\x0b\x12\xc4\xcc\x88\x27\x23\xbc\xad\x6c\x6e\x78\x5e\xf8\xd3\x65\x49\x10\x5b\x97\xca\x08\xa6\x5e\xa4\x9e\xdc\x48\x41\x31\x63\xde\xf9\x44\x8f\x5e\xc7\x50\x05\xb1\x0a\x52\xe8\x8b\x4e\xb6\x1d\xde\x1d\x4d\x68\x8c\x99\xb6\x6f\x50\x57\x23\x5a\xd8\x2f\xa7\x64\x90\x30\x8a\x49\x7c\x51\x55\x6f\x3f\x00\xde\xbe\xe7\xcd\xa4\xe5\x4b\x05\x89\x8c\xd0\xff\x31\xbb\x12\xf9\x58\x1c\xfa\xf7\x9b\xc8\x04\xdf\xd2\x0c\xf3\x94\xff\xf8\x89\xe2\x68\x57\xef\x86\x8c\x44\x2a\xa0\x61\x8a\x3e\x18\x22\x2f\xb6\xaf\x79\xb3\x3d\xd5\xfe\x60\xaa\x38\xa2\x4b\xcc\x52\xf1\xfe\x27\xa8\x11\x57\x8e\x0a\x52\xcd\x39\x1b\x82\x33\xae\xf9\x79\xd5\xbe\xae\xcb\xcb\xde\x35\x15\x30\x12\xc7\xb6\xe4\x3f\x66\x05\x75\xc7\x93\xc4\x60\xb0\xcc\x35\xae\x81\xab\x22\x2f\xfd\xb5\x18\x8b\x98\xcd\x80\x2d\x4e\x6d\x75\x75\x3a\xf7\x47\x34\x62\x09\xe4\x66\x70\x6b\xcc\x06\xac\x9b\xa2\x9a\x2c\x92\x80\x81\xc4\x3a\x6f\x23\x79\x39\x5e\x06\x81\x1b\xa1\x09\xce\x24\x51\xf4\x9f\x38\x23\x29\x66\xa5\x90\x0f\x1b\x73\xfe\xee\x40\x18\x21\xbd\xee\x01\x54\x7e\x3a\xf4\x19\x3d\x15\xf0\x4c\xf2\xc0\x37\x57\x35\x8f\x25\xbc\x94\x25\x3f\xc0\x7c\x13\xb2\x0a\x44\x1a\x00\x1f\xe4\xa5\x86\xf2\x4e\x9f\xcc\x20\xc1\x19\x7a\x16\x4f\x50\x22\x2a\xe3\x54\x2a\xdb\x56\x35\x08\x82\x67\xbd\x88\x4f\x10\xc3\xe3\xd3\xab\x98\x99\x2c\x9b\xa9\xaf\x19\x5c\xd4\xbc\x80\xbe\x0a\x14\x8b\x5d\x45\xce\xa8\xb2\x54\x35\xf6\xe2\x4e\xaa\xdf\xe3\x67\x06\x09\x06\x6a\x9b\x97\xb0\xf4\x88\x02\x15\x00\x00\xb5\x1b\xf0\x0d\x8c\xca\x81\x2a\xd0\x01\x4d\xbc\xf2\x24\xef\x21\xdb\xee\xb7\x3a\x0c\x43\x5b\x3a\xb3\x13\xf7\xa6\x32\x91\x59\x0e\xcd\xc2\x43\x09\x1a\x3f\x3e\xcb\xb2\xc0\x75\x8a\xfb\x7e\x0d\x6c\xc7\x9e\xc3\xe3\xaa\x90\xe8\x28\x25\x96\x5b\xa4\x54\x05\x2c\x4a\x35\x4b\x7a\xa6\xc2\x20\x60\xa9\xdd\x28\x1d\xd2\x7b\x88\xf5\x54\x61\x10\xc6\x38\xad\x1d\x93\x97\xfb\x73\xac\xb5\xbe\xb8\xa5\x3b\x5f\x77\x56\x61\xc0\x53\x44\x10\x2e\xf2\xba\xe1\x3f\x87\x66\x37\x0c\x13\x8e\x6e\x32\xfc\xe7\x94\x1f\x0f\xa6\x9a\x8e\x0d\x2c\x37\x00\x28\x67\x74\x2c\x72\x6f\xd9\xc2\x90\xa6\x81\x85\xf7\x7c\x4d\x61\xe8\xc6\x4b\x82\xd1\xfa\xe6\x76\xf5\x54\x83\xe7\x8a\x56\x61\x14\xa5\x4c\x0c\x19\x4d\x97\xa6\x09\xf3\x9e\xe7\x85\xa8\x3e\xfc\xb0\x18\x42\xe2\xb2\x9e\x87\x23\x2f\xcf\x73\x2c\x1a\x2a\x8c\x20\x11\x86\x76\xed\x3f\x27\x68\xda\x47\xd1\x85\x09\xcf\x55\x5f\x50\xf9\x0b\xa0\x48\x15\xc6\xb1\x96\x6a\xa4\x0b\x83\xe6\xd1\x7c\xd1\x60\x88\x81\x51\x61\x0c\x06\x77\x6b\xfc\x8b\xc5\xd5\xc6\xdd\x72\x22\x0c\xdf\x83\x28\xf2\x52\x1a\x99\x48\x7f\x08\x0c\x30\xc3\x84\xa7\x36\xce\xf9\x67\xec\x48\xd3\xfe\x19\x52\xeb\x33\x85\x34\x66\xca\x11\xec\x2c\xbf\xd9\x26\xfa\x78\x34\xb3\x43\x2a\x39\xb8\x70\x8c\xe7\xe5\x27\x9b\x54\xb7\x37\xe2\x4a\xbb\x85\xd6\x52\x36\xcc\x80\xca\x54\x48\xb5\x44\xbc\xfd\xa6\xac\xde\xaf\xb8\x83\x33\xab\x90\xa5\x06\x9a\x39\x24\x52\x59\x94\x6a\x08\xad\xf9\x4b\xea\x29\x2a\x64\xca\x04\x7b\x06\xbf\xea\x8d\x75\xc8\x40\x27\xc1\xa7\x59\x39\x3b\x28\x93\x01\x7a\xe2\xf7\x8e\x4b\x4c\x85\x3c\x34\xbc\x9c\x65\x85\x0a\x38\x93\xe7\x11\x36\xa2\xe8\x1c\xff\xaa\xae\xab\xf7\xe7\x19\x20\xe8\xe4\x0e\x05\x03\xaf\xa9\x50\x55\xc5\x73\x65\xb2\x7c\xd7\x50\x70\xb7\x81\x84\x32\x0b\x45\x30\x20\x54\x40\x65\x65\x7e\x38\xf2\x7c\xef\xd7\x94\x14\xa6\xc8\xba\xb3\xb4\xc9\x5f\x34\xd6\xa9\x50\x05\x0a\x3b\x45\xf6\x55\xa5\x1e\xf2\xfd\x6b\x8b\x79\xef\xa7\x3a\xef\x3d\x9c\x50\xc5\x1c\x61\x3f\x16\x43\xb8\xdb\x7b\x92\x29\xd5\x45\x76\xb8\x43\xc9\x82\xe7\x87\x45\x81\x79\x83\xce\xb7\xaa\x1d\xd1\xfb\x65\xaf\x8c\x0a\x15\x64\x49\xe8\xc8\xf8\xac\xa9\x71\x64\x65\x93\x91\x3a\xa4\x76\x4d\xdc\x22\xea\x7f\x28\x43\x67\xc7\x40\xa4\xd1\xdf\x41\xa2\xde\x2e\x16\xbf\x64\x1a\x52\x21\x24\x86\x94\x16\x59\x62\x27\x87\x84\x21\x49\xf0\xb9\x92\x11\xa4\x7f\xfe\xb5\xe9\x30\xc2\x1c\xaf\x21\xcf\xc5\xb4\x94\xb3\xd1\xa1\x4e\x44\xc0\x5d\x69\xbc\x7b\x36\x18\x4a\x98\xd8\xa6\xe6\xc9\xe9\x84\x46\xc0\x4a\x9b\x1f\xa0\x29\x6d\xf2\x42\x45\x24\x61\x40\x06\xb3\xff\xb9\xfb\x40\x63\x3f\xc0\x8d\x04\x89\xe9\xe8\x1d\x72\x99\x0c\x88\x20\xc6\xf7\x1d\x05\x59\x82\x16\x6d\xe7\x54\xf8\xcc\x67\x42\x27\x68\x72\x53\x51\x94\x26\x58\x1c\x7f\xde\x3c\xdd\x6d\x77\x6e\xe2\x47\x11\xd3\x86\x5b\xd7\x34\x49\xf5\x25\x3a\x15\x45\x19\x41\xaf\x40\xe7\xa5\xba\x1a\x88\x56\x4e\x6e\x22\x02\x82\xc9\xa9\x63\xbf\x5d\x20\xda\xd0\xf4\x37\x36\xfe\x6c\x5a\xa0\x6b\xf3\x94\xb7\xf9\x80\x2a\x42\x45\x71\x10\x60\x40\xe9\x9c\x0f\xa7\xb9\x63\x2e\xe3\x41\xb6\xbe\xc7\xcb\x20\xa5\xdc\xd5\xe3\x28\xc5\xdc\x68\x23\x79\xd1\x6d\x34\x83\x72\x79\x77\xd0\x30\xe5\xe2\x7e\x7d\x5d\x57\x47\xac\x83\x98\xdc\xe7\xd0\x29\x8d\x62\xc9\x11\x8e\xb0\x7d\x45\x25\x64\xf7\xe7\x24\x11\x6e\x0d\x77\x2f\xc0\xb7\x4c\xd9\xc3\x34\x30\x74\x58\x9a\xe7\xc5\x86\x6b\xb8\xaf\x14\xf4\xc7\x24\x26\xf7\xc4\xa9\xee\x36\xc0\x25\x3f\xa2\x2c\x87\xd9\x09\xa6\x16\x29\xa2\x71\xa4\xa8\x2b\x72\x6d\xf2\x7d\x17\x27\x5c\x9d\x91\xfe\xed\x13\xe5\xaf\xc9\x47\xa0\x9c\xa5\x5e\x59\x88\xcb\xc2\x89\x87\xda\x93\x0c\x6d\x7d\x94\x32\x86\xc8\x66\x7d\x6a\x4f\x35\x58\x5a\x84\x6e\xb7\xee\xec\xd4\x08\xd2\xab\xa2\x0c\x38\xc6\xc5\xdf\x6e\xb7\xee\x4f\x3c\x0c\xd0\x54\x1a\xab\x52\x20\x64\x1e\xca\xeb\xaa\x28\xb8\x7f\x33\x9c\x19\x35\xde\x9a\x4b\x70\x34\xef\x2a\xe2\x2a\x8e\x60\xc8\x1f\x63\x65\x34\x87\xa5\x82\x91\xc1\x88\x44\x0c\x92\x7b\x80\x8e\xd9\x6b\x02\xa3\x3c\x36\x7e\x7e\x15\x2b\x4c\x87\x3c\x3d\xfe\xb8\x77\x97\xeb\x36\x55\xd1\x4b\x02\xe3\x9b\x9f\xae\x0a\x88\x29\x1a\xbc\x36\x3f\xf6\xb9\x5f\x15\xe9\x40\x62\xb7\x21\x0a\xc2\x2f\x8c\xea\xcb\xec\x8e\x18\xe9\x38\x8e\xb4\x4b\xaa\x5c\x75\x36\x42\x56\xb5\x1a\x7a\x5a\x91\x56\x04\x99\x07\x56\xdf\xef\x37\x48\xab\xe0\x74\x1b\xcc\x64\x75\xbb\x41\x4c\x82\x34\x51\x03\x6e\xf5\xc7\xb2\xfb\x5f\x50\xcb\x7e\x07\x8d\x09\x23\xc2\x79\x8c\x35\x60\x83\xb2\x6d\x4c\xf8\x34\xe4\x8f\x09\x67\x92\x79\x8d\x0c\xf7\x35\xe2\x20\x4c\x31\x19\xba\x5c\x3c\x7c\x5f\x6c\x76\xdf\x56\xeb\xdb\x6f\xee\x23\xc7\x61\x66\xb0\xa1\x3b\x8e\xef\xdc\x56\x89\xed\xc1\x28\x30\xba\x79\xd7\xbc\xe5\xe6\x79\x37\x6d\x7d\x9a\xd2\x63\xaa\x38\x0e\x4d\xda\x04\x43\xc4\x11\x86\x42\xc5\x49\x1a\xe3\x06\xde\xd9\x88\x25\x14\x17\xbd\x0e\x6e\x98\xcc\x84\x85\x45\x2d\x8a\x62\xfb\xda\x45\x8c\xe5\xbe\x3f\x0b\x24\x2e\x5b\xb6\x68\x5b\x5b\xfc\xb9\x03\xdd\xde\x54\x75\xef\x20\xc6\x14\x04\xee\x50\x26\xd3\x8e\x74\x49\xe3\x32\xb3\x8a\x53\xc9\xb3\xd8\xb3\xf6\xa1\x56\xf1\xd9\x64\x17\xb7\x35\xc0\xc6\x2b\x0f\x5f\xa6\x26\xff\xf9\xaf\xbf\x54\x5d\x53\x71\x16\x18\x20\x2a\x37\x09\x9a\x02\xb8\xa7\xd1\x50\x71\xc6\x0c\xa1\xd0\xa9\x99\x6e\xf1\x6e\x80\x32\x45\xa0\x03\xff\x18\xfa\x10\x31\x07\x8a\x90\xcc\xbc\x41\xce\x08\x2b\x55\x37\xfe\xad\x08\x14\xba\x6d\x8d\x7c\x05\x75\x2a\x60\xa8\xc1\x35\xbe\x47\x19\x48\x04\x40\x7f\xf0\xd3\xb6\x5a\x9d\xfc\xed\xc9\x40\xe1\x86\xdb\x9c\xcb\xa1\x0c\xb9\x8a\x25\x4b\x0d\x41\x90\xd1\xbc\xc0\x94\xfa\x14\xff\x36\xfd\x77\xc0\xcf\x34\xfa\xdf\x3e\x09\x18\x2b\x15\x22\xb7\xe7\x66\xb5\x7c\x7c\xb8\xde\x6d\xd7\xab\xe7\xdd\xf5\x7a\xb3\x7c\x7c\x79\xf0\x73\x14\x68\x82\xf9\xcc\xb2\x42\xbe\xac\x75\xb3\xc0\xed\xdb\x1f\x4e\x23\xa3\x8f\xdb\x99\x53\xb5\x1d\xb8\x9c\xbf\x04\xcd\x7d\xf6\x3d\x2f\x8b\x76\x2a\xd6\x41\x80\x2c\x3e\x7d\x87\x42\xe7\x1c\x8e\x35\xc1\xdd\xd0\xd0\x70\xf9\x35\xd0\x5a\x6d\x03\xf6\xf7\x71\xeb\xb2\x8a\x75\x1c\xa0\xe5\xfc\x56\x15\xfc\xd5\xb5\xe6\xa8\x84\x24\xca\xf2\xd9\xb7\xbc\x30\x76\xf0\x51\xdb\xa4\x88\x67\x83\xb6\x48\xe1\x01\xd0\x4e\x25\x44\xa9\xd8\xb8\x53\xf9\x1c\xe4\xed\xa2\x52\xad\x92\x90\x50\x26\xbd\xd4\xea\xd5\xa9\x2e\x3d\xcf\xc8\xe8\xc9\x93\x90\x52\x62\x28\xdc\xa0\xf3\xc1\x6f\x78\xb9\x7c\x3d\xb9\x89\x91\xc4\x69\x8c\x5d\x5a\x05\x6f\x5a\x97\x92\xb4\x87\x12\x9b\x90\x41\xe2\xde\x71\xdb\x9b\x4a\x68\xa0\x6d\xe2\x11\x63\xfe\x0d\xc8\x53\x9d\xb7\xe7\x39\xc2\x69\x95\xd0\x24\x42\xe7\xec\xc8\x4f\x13\x24\x86\x4a\x28\x35\x65\x2c\xe7\x6e\x3d\xea\xa7\xea\x7d\xea\xbc\x26\x34\x4d\xb5\xf1\xd5\xa0\x46\x9a\x05\x5f\x1e\x56\x09\x55\xc0\x86\x65\xb7\x3f\x9f\xff\x18\x7f\xd1\x84\x25\x04\xd1\x36\xde\x77\x19\x67\x3a\xdc\xc7\x4d\xfe\x35\x9e\x34\x09\xa3\x11\x5e\x95\xef\x79\xde\x94\xed\xee\x67\xd5\x7a\x8f\x33\x61\x82\x2b\xe6\x13\x4e\xb6\x4b\xf6\x1e\xf9\x41\x2e\x09\x08\x54\xc2\x24\x8b\x87\x6e\xe5\xed\x69\xde\x96\x26\x4c\x59\x59\x06\x68\xef\x0c\x6f\xd5\x7c\x32\x37\xc9\xa2\x20\xe2\xbd\x94\x49\x39\xf5\x20\x92\x8c\x09\x4c\x01\x6c\xa1\xe4\x65\x7b\x5f\xfd\x84\x75\x39\x19\x01\x0a\x33\x50\x3b\xae\xd4\xe6\x74\x84\x7a\xda\x6e\x6e\xc7\x09\xc9\x0c\xa5\xdc\xa9\x54\xa0\x9e\x7a\x26\x67\x95\xc8\x84\x59\xce\xb6\x96\x7c\xa0\xcd\x31\x87\xc7\x27\x50\x61\x88\x29\xe0\x02\xb9\x03\x64\x7e\xd1\x82\xa1\x92\x6e\x3b\xc7\x49\x52\xbd\xef\x02\x32\x3d\x48\xb5\x30\x85\x0f\x44\x62\x0e\x66\xa9\xe2\x31\xca\x77\x74\x47\x4e\x2d\x3c\x63\x2e\x6d\x04\x1f\x73\x03\xa5\x89\x7f\x50\xd8\x02\x9d\x93\xc7\x9f\x17\x37\x01\xd4\x88\x81\x60\xda\x73\x51\x96\x27\x6e\x3b\xf0\xdd\xe5\x20\xa5\x98\x0b\x42\xb8\x43\xe7\x1f\xdb\x1c\xc7\x97\x69\xb8\x04\x58\x8c\x69\x38\xc3\x99\x3b\x5e\x00\xc0\x35\x36\xe4\x2e\x8b\xbc\xcc\x25\x2f\xb6\x75\x3e\xe8\x29\xfc\x4b\xb6\x6e\x9c\x81\x49\x40\x66\x81\x29\xcd\xe4\xea\xd3\x3d\x84\x12\x6e\x28\xc3\x45\xae\x1e\xcb\x4d\xde\xcd\x8a\xb9\x66\x87\xfe\x07\x41\xc0\x4c\xc7\x26\xf2\x2b\x1a\xd3\xf9\x52\xbe\x56\x85\xba\x9e\x01\xd6\xbb\x1f\xb1\x48\x18\x3a\x77\x5b\x66\x1b\xec\x24\xdd\x82\x73\xff\x61\x87\x87\x41\x82\xaf\xf7\x77\x5e\xf3\xb6\x0b\x2b\x07\x21\x08\x0d\x03\x8e\x15\x16\xcc\x1e\xfe\x00\x78\xbb\xa9\xfc\xd6\x47\xc3\x40\xe1\x5a\xc5\xda\xa9\x6d\x69\xf4\x87\x00\xab\x51\x5c\x29\x5f\xba\xff\x1a\x08\xd4\xfd\x46\x63\xbf\xc9\x3f\x5e\x1e\xa6\x58\x85\xd3\x54\x20\x43\xd1\x30\x31\x3a\x12\xa2\x6d\x9b\xe1\xbe\x4b\xc3\x8c\xa1\x33\xb1\x43\x7a\xbb\xb6\x2d\x5c\x34\x3d\xae\xcb\x8f\xff\x19\xbf\xc1\x50\xea\xc0\x42\xab\x96\xbc\x44\x2f\x73\x7e\xa7\xee\x8d\x0d\x0d\x75\x42\x0c\x81\xcd\x87\xe5\xbe\x33\xc0\x09\x67\xbc\x68\x44\x42\x74\xd8\x0a\xd0\x6d\xc6\x26\x33\x23\x8a\x93\xc4\x38\x0b\xb5\xb5\x3e\x98\x6b\xba\xc4\x0d\x28\x1a\xc7\x46\x7d\xf1\x8f\x04\x8b\xd2\x5f\xc0\x3a\x14\x8d\x45\x84\xef\xa2\xbb\x66\x90\x4c\xae\x19\x0b\xc0\x1a\xf7\x6f\xfc\x30\xfc\xe4\xb1\x24\x06\xaf\x54\x00\xaf\xaf\x4c\x89\x7d\xb4\xb4\xba\xad\xc5\x32\x94\x61\x5a\xdb\xea\xb0\x8e\x4f\x4e\x29\x64\xa6\x9a\xd9\x36\x46\xa5\x76\xe4\xfa\xd3\x54\x48\xd3\x8c\xea\x42\x1e\x77\x80\xc5\x12\x89\xcf\xdb\x3a\xdf\xef\xa7\xc6\x82\x32\x90\x38\x1f\x4b\x78\x47\x85\xf1\xd1\xd3\x32\xad\x43\x39\x02\x51\x62\xc0\xd8\x53\xf4\x56\x55\x31\xb6\x12\x94\x87\x02\x23\xbe\xbb\xbb\x31\xab\xd7\x6c\xd0\x45\x79\xa8\x10\xf1\x7d\x55\xe4\xe5\x20\xbb\x4b\x39\x33\x98\xfe\x16\xf8\xc1\xb8\xa8\x43\xe6\x59\x45\x45\xa8\x52\xe5\x70\x87\xb2\x9d\x24\xaa\xc6\xd7\x10\x31\x41\xa4\x19\x92\xf1\x3e\x1b\x21\x78\x7f\x9e\x84\x63\x2d\x11\x37\xf5\xcd\xbb\xeb\x57\x51\x54\x48\xc5\x3c\x5c\xc1\x98\x1e\x47\xc0\x38\x79\x92\x2f\x79\xac\x14\x15\x8a\x21\x31\xd0\xb1\x73\x9b\xc2\x09\x4d\xae\x42\xce\x62\xda\x2b\xb1\x6d\x8e\x5c\xc2\x68\xf1\x09\x6d\x0a\xb6\xa6\x3a\xb1\x2a\x7b\x3b\xe5\x8c\x2f\x15\x9a\x63\x8e\xb1\xad\xf6\xfb\x02\x9c\xf7\x32\x58\x49\x32\x02\x43\xd1\xde\x99\x6e\xa3\x38\x75\xea\x35\x5e\x15\x95\x22\x23\x43\xf2\xd9\x39\xb6\x17\x45\xa5\xa2\xb4\x97\x48\x7e\xf9\xfd\x76\xf5\x13\x3e\x2b\x79\x50\x15\x9b\x06\x85\xcd\xd5\xba\xb3\x80\x93\x53\x29\x96\x60\xfd\xfc\xfb\xcb\xdd\xe8\x61\x55\x16\x60\x72\xec\x78\x6a\x5e\x2d\xca\x6c\x72\xda\x8c\x3a\x2b\x68\x85\x12\x67\xa3\xd1\x4f\xbe\x85\x12\x81\xc9\x6f\x7e\x7b\x79\xb8\x7e\x76\xfd\x6b\x8a\x42\x6a\x18\xcf\x6c\x9a\xf2\xfe\xd4\x22\xf7\xee\xa2\xf3\x36\xd5\x6f\x95\xb0\xfa\x2c\xe6\x52\x4e\xd2\xf8\xaf\x6c\x6e\xec\x42\x40\x5c\x51\x60\x89\x34\xca\x67\x4d\xcb\x8b\xe2\xda\x0a\x46\xcf\xfb\x47\x14\x04\x67\xf1\x50\xe9\xa5\xb3\xf9\xf6\x13\x4f\x36\x61\xaa\x49\x8a\x68\x31\xde\xbc\x99\xc4\x8c\x7d\xbe\x94\x28\x43\x81\x87\xcb\x58\x3f\xd5\x15\x42\xfb\x46\x17\x4a\x09\x10\x04\xfb\xec\x2c\xa5\xee\x4f\xde\xf2\x89\x07\x95\x06\x91\xc2\x8f\xfa\x27\xd4\x75\xf5\xc7\xa8\xd6\x9a\x06\x52\x63\xf6\x26\x6f\xae\x1d\x93\xc2\xc8\xd9\x4e\xc3\x38\x20\x66\x80\xf1\x5b\x4a\xb8\x24\xd7\xb2\x43\x23\x92\x60\x36\x70\x55\xd6\xf9\xe9\xf0\xeb\xad\x2b\x8d\x42\x85\xb0\x04\x03\x2f\x83\x4b\xb9\xad\xf1\x68\x41\x39\x35\xbc\x65\x79\xf7\xad\xc1\xa5\x3c\xd2\x38\x4a\xb0\xe8\xf6\x8f\xf5\x66\xf3\x39\x19\x9b\x4a\x63\x05\x99\x72\x30\xa2\xaf\x93\xf3\x69\x12\x10\x44\xe3\x3a\xbf\x7d\xd9\xa3\xd0\x10\xa1\x37\x7f\x85\x24\xa6\x58\x18\xda\x61\x9a\xae\x5b\x69\x6b\xbd\xac\x0e\x87\x2b\x5e\x14\x93\x76\x1b\x95\xd2\x2c\x43\xe4\xa7\x38\x9d\x67\x19\x87\xed\x30\x16\xa6\x48\xf4\xb6\x5e\x3e\x3e\xac\xff\xcf\xd1\xa1\x3c\xac\x56\xd7\xab\xeb\xdd\xd3\xea\x79\xb7\x7e\xf8\xbe\xda\x6c\x57\xd7\xbb\x1f\xab\xb5\xff\x51\x02\x58\x67\xb4\x01\xe0\xd5\xf3\xea\xfe\xe9\x93\x7b\x66\x9d\x89\xb0\xb0\x75\xd3\xbf\xd1\xf9\x37\xf3\x3e\x55\xca\xa4\x8e\x8d\xa7\xdc\x0e\xec\x6e\x9a\x45\x46\xd3\x7a\x27\x4e\x75\xf9\x0c\x07\x53\xd3\x9b\x61\xfa\x51\x29\x0f\x12\x6c\x91\x35\x39\x37\xd3\x40\xbd\xfa\xb8\x68\x92\x74\xa3\x63\xb0\x7c\x82\x9d\x07\x37\x4e\x3d\xa6\x3c\xa3\x86\xeb\x92\x17\xb0\x2e\x71\x81\x0c\x8f\xaa\x10\x81\x65\x06\x6f\xec\xec\xeb\xc8\x79\xb5\x23\x45\x9c\xa2\x86\xf7\xd5\xcb\xdd\x9d\xfb\xb5\xe4\x1c\x99\xd4\x8c\x92\xce\x63\xdd\x79\x31\xfe\x18\xa4\x18\x2e\xfc\xfe\xe3\xd9\xa5\x1a\x52\xa5\x28\x12\x18\xa1\x98\xf8\x03\xbc\xdf\x54\x35\x48\xde\xfc\xa2\x6e\x19\xb8\xb9\x00\x5a\x87\x62\x48\x64\xd0\xce\x5b\x96\x54\x33\x05\xa6\x57\x59\x9b\x36\x9b\xbb\xe0\x09\xea\x80\x10\x7b\x23\x8c\x24\x86\x97\xac\xd2\x1a\xea\xab\x56\x5e\xcc\xf3\xd1\x24\x64\x84\x5a\x35\xf2\x66\x8d\xdd\xc5\x98\x22\x5a\x97\x34\xfe\xdb\xa0\xdb\x58\xb1\x80\x48\xe4\xa0\x84\x43\xde\x76\x01\xff\x17\x9b\x08\x0b\x88\x22\xa1\x87\x68\x6c\xa0\x44\x4e\x32\x77\x7f\x41\xa2\x10\x68\x6d\x88\x2f\x07\x9f\x81\x05\x9c\xe2\x2b\x07\xd5\x4d\x85\xd2\x35\x69\x29\x16\x58\x4e\x8b\xba\xaa\x0c\x57\xf8\xa3\xc6\x06\x8b\xcf\xae\xaf\xa9\x21\xac\x30\xb3\xf9\x9a\x9f\x1f\x35\x4e\x69\x7b\x3c\x8c\x35\x56\x89\xf1\xfe\x56\xdb\x6f\xc3\x06\x66\xc5\x42\xc9\x2d\x5f\x30\xae\xc2\xc9\xf4\x65\x11\x64\xd8\x5f\xfe\x8f\xeb\x6f\x86\x95\x78\xb6\x27\xc7\x0f\x16\xf8\x2d\x6e\xf2\x02\x46\xe2\x3c\x8a\xc5\x81\xc9\xe2\x20\x01\x5d\xf3\x0a\xb5\xd3\xe7\xb1\xc7\x93\x54\x20\x36\xe6\x2a\x6f\x0f\xbc\x69\xbc\x3c\xe1\xc0\x78\x33\x1a\x98\x36\xd9\xe6\x24\x0e\x79\xbb\x69\xb9\xbc\x58\xb6\x9f\x07\x6f\xde\xcf\x60\x34\x00\x54\x69\x3b\xf0\x92\xef\x2d\x9d\xe9\xba\x7f\x21\x54\x65\xb8\xf3\x1d\x0b\x7e\x46\xe1\x0b\x9d\xcb\x6d\x9d\x1f\x0b\x98\xef\x92\x52\x2c\xcd\x64\x9a\xf6\x71\xf1\x03\x7c\xb4\x9b\x73\xd3\xc2\x01\xb7\x8e\x5e\xc7\x5b\x31\x96\x30\xc7\x82\xb1\x35\xe0\xe7\x49\xb1\x8f\x31\x69\x26\x85\xea\x36\x5c\xff\xbb\x2c\x0b\x30\xb1\xe7\xfb\xf5\x8f\xfe\x88\x08\x39\x19\x76\x8f\xfc\xdf\x89\x97\xad\xa1\xc2\xbf\x68\x8f\x51\x2c\x03\x86\x2e\xbc\x81\x3f\x9b\xc0\xf2\x13\x0c\x0c\xe3\x71\x80\x52\x30\xbb\x1a\x3c\x33\xa0\xcf\xc9\x30\x9e\x46\xe8\xc8\x4f\x78\x8c\x5a\xf8\x68\x77\xbe\x17\x6b\xe4\xa7\x33\x9e\x49\x0c\xf4\x30\xc2\xb0\x9a\x81\x37\x35\xc0\x7f\x2f\xf2\xb3\x4c\xd0\xc4\x75\xae\xfd\x66\xf8\x73\xc6\xb3\x56\x64\x24\xb1\x5c\x34\xbd\xb2\x67\xb1\xdb\xf3\xe9\x03\x0b\xcd\x31\x19\xa9\x6a\x9e\x97\x9b\x7b\x87\x23\x60\x32\xe4\xa0\x5c\xf6\xe1\xa9\xf2\xf5\x04\xd6\x99\x08\x0c\x9d\x78\xbd\x87\xa6\xfd\xf6\x78\x7d\xb7\x7a\x1e\x1b\x62\xa6\xb4\x09\x84\x1e\xe0\x7d\x44\x65\xeb\xad\x0c\x50\x43\xeb\x67\x27\xf9\x84\x61\xfa\xef\x73\x20\x0b\x06\x2c\x35\x25\xf5\x9f\x86\x9e\xd4\xfd\x39\x33\xc1\xcd\x5d\xb5\x7f\x29\x5d\xd0\x34\x71\x45\x98\x26\xa1\x22\x6e\x89\x23\xaa\xe2\xc9\xac\xb3\x39\xaf\x64\xf0\xb3\x80\x28\xed\x80\x54\x7d\x85\x9d\xe9\x20\xc0\xd6\xeb\xd5\xcf\x81\x12\xbb\x62\x1a\x22\x2c\x29\x19\xc5\xb6\xe7\xe6\x47\x35\x38\x04\x18\x21\xdd\x6f\x3c\xb0\x35\x23\x32\x15\x3d\x9a\xdf\x02\xe7\xc7\x37\x9e\x05\x2c\xc0\x36\xc9\xa7\xbc\xd0\x50\x5f\x4e\xc5\xbf\x4f\x86\x4b\xc3\xd0\xde\xb4\xd5\xf1\xd6\x95\x91\xb3\x30\x55\x58\xb2\xb2\xdf\x60\x5b\x6d\x8c\xa0\xfb\x57\xcd\x17\x2a\x0b\xb5\xf1\x78\xae\xb6\xcb\x34\x21\xa4\x2a\xe3\xcc\x9d\x30\xe2\xa6\x1e\x78\x05\x2d\xf9\xd8\xf7\xc9\xbe\x4f\x3a\x11\x47\xdf\x31\x8b\x24\x37\x8a\x20\x2e\x88\xba\xf6\x3b\x69\x96\x10\x8a\x2a\x43\xef\x2e\x37\xe2\x05\xcb\xdd\x80\x30\x0d\x59\x2f\xcc\x5e\x35\xbc\x98\x83\x46\x0f\xb7\xf3\x2c\x89\x04\x86\x23\x6f\x70\xb6\x52\x3e\xee\x80\x4e\xcc\x26\x8b\xdc\x20\xbc\x76\x3b\x42\xc6\x02\x85\x6a\xdf\x7d\xcb\x19\x80\xea\x02\xf5\x2e\x7a\x80\x9a\x7f\x0a\xef\x9c\x4d\x9b\x64\x4c\x07\x38\x45\xbb\x0d\x84\xd7\x25\x2f\x9e\xc1\x50\x9f\x5c\xc8\x82\x5d\x22\xe0\xec\x29\x32\x9a\x20\xac\xd5\xc6\x36\x3f\x5e\xa1\xec\x79\xb8\x54\x96\xa5\x4c\x1a\xde\xda\x72\x7f\xea\x77\x8d\x2c\x63\x84\x9b\x2e\xdb\xc3\x13\x3f\x6f\xb9\xe8\x01\xdc\x19\x8f\x2c\x1e\x3c\x1f\x65\x51\x33\x1e\x29\xac\x6c\xe7\xcd\xf2\xd4\xb4\xd5\x01\xea\xbc\xbc\xba\x9b\x8f\xca\x33\x4e\xb9\xad\x97\x23\x8f\x7a\xa9\xaa\xda\x61\xa0\x33\x41\x02\x62\x8d\xf9\xae\x81\x52\x41\x6d\xd0\x4a\xa2\x8b\x24\xc7\x6f\x48\x08\xe6\xa8\xd6\xb7\xef\x00\xd3\xa2\x6b\x26\x40\x90\xc4\x02\x46\x96\x8f\x83\xa0\x38\x93\x54\x25\x4e\x93\xcd\x41\x95\xfc\x3c\x95\xa9\xc4\x0e\x21\x0f\x76\x58\x3c\x6e\xb0\x87\xe7\x54\xc3\xb4\x2d\x65\x6c\x73\xbe\x02\x6a\x65\x92\xc7\x7a\xd8\x61\x08\x6a\x5b\xb9\x92\xca\xe8\xde\x74\xe2\x70\xa0\xc3\x7d\x3a\x53\xa1\x4a\x87\x81\xfa\xd6\xa7\x47\xe6\x3d\x98\xac\x73\x27\xa3\xc1\x0f\x7a\x9e\xd8\x5b\x68\xdb\x69\x85\x22\x53\x3c\xa5\x48\xfb\x51\xe6\xff\x31\xe0\xb1\x90\xb9\x6c\x62\x06\xdd\xfa\x33\xb1\xf7\xe2\xa4\xf2\x29\x27\xec\xe4\xfb\xea\xc0\x74\x00\x98\x72\xba\x69\xbf\x9a\x53\x45\x57\x99\x8e\x49\xe0\x94\x76\x86\x22\x43\x93\x51\x9a\x20\x86\xf2\x68\x89\x4f\x7b\x55\x5d\xc5\x09\x89\x24\xf4\x84\xcd\x3d\x82\x7c\xfc\x78\x9c\x24\x29\x35\xf7\x04\x7f\x56\x07\x91\xc3\x73\x55\x4c\xe2\x04\x4e\x32\x85\x5d\xb3\x9b\xd5\xdd\xdd\xea\x79\xb7\xfc\xb6\x5a\xfe\xbe\xdb\x6c\x57\x4f\xe3\x98\x8b\x07\x41\x18\x9a\xd2\x95\x02\x38\x4c\x0f\xc6\xa1\x11\x4e\xcb\x0f\xdd\x9d\x1e\x8e\x8f\x1a\x57\xec\x88\x1e\x58\xf1\x90\x98\x5c\x99\x2d\x08\x80\xa9\xc1\xfb\xa3\x91\x0e\xed\x7b\xb9\xcb\x9b\x76\x0b\x87\xa3\xa3\x10\x73\x23\x38\xe1\xce\xda\xb8\xdc\x68\x37\x8b\xdc\x27\xe3\x11\x91\x99\x95\xc1\x47\x36\xd5\xf1\xeb\x88\x93\x0c\xeb\xe2\x9a\xbf\xc1\x6e\xda\xdc\x33\x3b\x9f\x78\x0c\x14\x43\xbc\x23\x86\xed\x03\xf1\x72\xc5\x13\x02\xf8\xcc\x5c\xa9\x6b\xe8\x35\x1d\xe6\xb6\x47\x9e\x28\x86\xbb\x38\x0a\xe1\xa3\x11\x1d\x25\xbb\x79\xa2\x20\x95\x7d\x46\xab\xee\xbd\x7e\x9e\x68\x8d\x10\x9e\x12\xde\x7f\x0c\x84\x6d\xbe\xec\x1b\x56\x9c\x42\x88\x09\x02\xec\x6f\xb6\x11\x38\x22\x7d\x8f\x9f\x6a\xf7\xdb\x5f\xa6\xc4\x60\xc4\xc0\x78\x55\xc3\x94\x2b\x4f\x03\x4d\x2d\x62\x60\xd5\xb4\xf9\x81\xb7\xf0\x28\x8a\x7c\x3f\x48\x14\xf9\xf3\x30\x4a\x1d\xb1\xf2\xa2\xad\x0e\xcb\xa9\x4e\x33\x73\xe3\xb2\x30\xb5\x7d\x83\xb6\x92\xb1\x9a\x22\x50\x38\xa7\x86\x2a\x68\x73\x2e\xa0\x47\xdb\x71\x0e\x80\x71\xea\xb5\x8b\x25\xb9\x8c\x4c\xab\xc9\xb1\x3a\xae\x3e\xba\x6f\x36\x1c\x2e\x33\x86\x7d\xca\xc3\x8a\xc2\x14\x2d\xc4\xa5\x56\x98\x1b\xcf\x4b\x67\x0a\xbb\x5d\x13\xa6\x3c\xd8\x8a\xab\x54\x23\xe5\x89\x25\xc9\x9f\x64\x7f\xb8\x62\x09\xf3\xe6\xde\xb0\x30\x3e\xd5\x70\x93\xd7\x4d\xeb\x85\xa2\x15\x57\x20\x70\x87\xcf\xcb\xbc\xed\x4c\xd5\xa9\xcc\x5b\x14\x70\x9b\xcc\x5c\x48\xd3\xd4\x36\x70\xfe\x9e\x97\x7b\x55\x1d\x9c\x6a\xc6\x0d\xc0\x94\xb4\x59\x71\x10\xd2\xad\xa4\x6d\xcd\xf3\x11\xe9\x9b\xe2\x00\x06\x14\x26\x4e\x67\xab\x4a\x73\x53\x57\x87\xcb\xe2\x1e\xd7\x90\x20\x55\xa8\x06\xd8\xbc\xf2\x6e\x5a\x5f\x1d\xdd\x5a\x14\x24\x96\x48\x91\xf1\x78\x84\xf2\x47\x5e\xaa\x3e\x7f\x3f\x3f\x25\x05\x61\x71\x64\x41\xe1\xbe\x92\x72\x31\x15\x9d\x72\x91\xbb\x59\x41\x84\x88\xfa\x6e\xd8\x59\x0d\xe2\xaf\x93\xa0\x82\xe8\x50\x9a\x6e\x47\xf9\x76\xdb\xed\x2f\x7b\x18\x24\x89\x44\x40\x52\xdc\xc4\xc5\xe9\x8c\xe2\x07\x16\x8c\x39\x6f\xe5\x45\x90\x2a\xb4\xdd\xff\xae\xf2\x72\x57\x8f\x5a\xe0\xec\x88\x30\x61\x71\x30\x10\x3d\x9a\xdf\xa8\x44\x98\x5a\x91\x19\x54\x1b\xf9\x91\xff\x97\xd7\x93\xd6\x25\x11\x0a\x86\x59\xea\x12\x3e\x10\xd2\xd9\x0b\xa4\x28\x11\xd1\xd0\x40\xa3\xaa\xc2\xc3\x2f\x3e\xb9\x52\x1c\x28\x2c\x4d\x57\x25\xe6\x21\x7b\x73\x2c\x12\x95\xc5\x46\xb5\xad\x40\x3d\x5a\xbf\x18\x58\x5f\x5a\xa3\xff\xfa\x6a\x83\x17\x34\xce\xd0\xbf\x37\x9f\x07\x69\x60\x1c\x0b\xcc\xf8\x2e\x52\x06\xe8\x9e\x23\xfa\xf5\xd7\x34\x31\x4a\x64\x89\xc1\xd0\xef\x72\xcb\x60\x31\xfa\xf6\x6e\x10\x0d\xb4\x49\x48\x7c\x83\x8f\xb1\xaf\x6e\x47\x70\x48\x25\xed\xb7\x4a\xe4\x4b\x6c\x73\xd3\x6f\x7b\x99\x35\x13\x22\x50\x08\x9f\x68\xf8\xcf\xbc\xdc\x37\xbb\xbd\x17\x8f\x52\x02\xa2\x50\xc6\x7e\x55\x29\x40\xee\xd3\x4b\x01\x29\x25\x80\x1b\x20\x59\x37\xd3\x0d\xc9\xea\xe5\xc3\xfe\x8f\xff\xba\x33\x03\x84\xae\x1c\xde\xc2\x61\x7b\x3e\xc2\x5a\x5d\x9d\xbb\x7f\x17\xa5\x5a\xab\xd9\xdd\x47\xe8\xd8\x08\xd3\x3a\x12\x89\xff\xfe\x52\x93\xe4\xeb\x25\x25\x09\x07\x23\x5c\x8d\x09\x42\xd3\x25\x84\x02\x03\xff\xdb\xd2\x94\x41\xc0\xd1\xeb\xcc\x9b\x67\xe0\xea\xbc\xad\x6e\x10\xb6\x3b\x19\x94\x71\x66\x50\xb4\x1a\xb6\x13\x95\x50\xe4\x1d\xfb\x05\xd2\xc8\x9d\x86\x0b\x64\x8b\xe5\x65\x59\x9d\x4a\x09\xbb\xce\x08\xf4\xe8\xfe\xf1\xbc\x96\x01\x18\x80\x82\x73\x5c\x79\x29\x61\xf3\x0a\xd3\x42\xa6\x74\x04\xf6\x9d\x47\xf2\x0c\xdd\x42\x9a\xfd\x04\x32\x04\x88\xc1\xf5\x80\xee\x7b\x89\x7e\x7b\x38\x0a\x0c\x9a\x0f\xbb\xdc\x4c\x33\x5f\xb7\x20\xd1\x80\x6c\x5e\xab\x53\xcf\xe3\x62\x94\x33\xc7\x8d\x75\x32\x12\xb1\xa3\x05\x5d\xbe\x72\x54\xcb\xae\x1f\x4e\xff\xe6\x93\xab\xc4\x81\x32\xaa\x64\xbc\x5c\x16\x55\x03\xdf\xab\x6e\xc9\xfe\x04\x5e\x18\xbe\x94\x51\x65\xfa\xe2\x95\xc4\x61\x04\xd4\xeb\x57\x9b\x84\xcf\xa8\xec\x22\xe3\x30\x45\xbe\xf7\xe3\xa9\x28\x30\x05\xd8\x7d\x26\xaf\xa8\xa0\x5b\xa8\x0d\xee\xc2\xb0\xd9\xf4\xbf\x12\x61\x2f\x93\x31\x90\x41\x98\xcf\xe3\xca\x98\x65\x68\x60\xc5\xe9\x7c\x75\xee\x5c\x8b\xc9\x53\xd2\x90\xa3\x93\xb8\x1b\xb3\xc8\x3f\xb9\x2a\xe0\xc5\xce\x24\x69\x9c\x60\x66\xa7\x33\x10\x26\xfc\xf8\x22\x35\x29\x69\x22\x99\xc5\xce\x3c\x5a\x2d\xa2\x25\x2f\x0a\xc1\xe5\xdb\xed\x34\x69\x24\xd3\x98\x18\x4d\x65\x68\xa1\x3e\xe4\x25\x3c\x9e\x5a\x59\x1d\x3e\xdf\xc3\xfa\xa0\x48\xa6\x42\x22\xaa\xdc\x54\xc7\x2f\xc4\x46\xa6\x4b\x77\xfc\x4c\xa9\x8a\x8d\x80\xb7\xfd\x4e\xf9\x3e\x2f\x8d\x2d\x5a\xab\x9b\xaa\x5e\xb4\xaf\x28\x66\x37\xff\xe3\x2c\x0c\x79\xe6\x73\x07\x3f\xf3\x81\x0f\x2e\xb3\xc8\x14\x70\x97\xd5\xe1\x88\x20\xce\xc0\x1f\x89\x13\x64\xe7\xda\xee\x61\x18\x26\xcb\x2e\x34\x32\xba\xd8\x46\x69\x70\x78\xe3\x31\xb1\xff\xd8\xb1\x3c\x00\x04\x5c\x89\x22\x7f\xf3\xf3\x8a\x47\xa6\x99\xe9\xea\x74\xde\x80\x8f\x17\x24\xcf\x82\xd8\xfa\x31\x96\xe3\xd2\x1e\x10\x91\x44\xae\x8f\x75\xb3\x2e\xf3\x76\x81\xbd\xe7\xfe\x58\x06\x59\xbf\x61\x99\x20\x62\x32\xc1\x20\x21\x0a\x7a\x86\xf4\x4f\x51\xe2\xf3\x76\x46\x87\x1c\xd9\x9b\x76\x5c\xa9\x3b\xd8\xe7\xed\x4c\x5b\x87\xd4\xb1\xc2\xa4\xa4\x4b\x68\xe5\x12\x0c\xc9\xd8\x78\xc9\x69\x6a\xdc\xc3\x3d\xb4\xdf\x0d\xfe\xf1\xcb\x99\xa9\x15\x49\x4c\x13\xd6\xa8\x15\x4e\x11\x12\x23\xec\xaf\x73\x24\xc6\xf3\x53\x11\x91\x48\xe1\x3b\xf2\x9e\x3b\x97\x72\x7c\xab\x8a\xa8\x0c\xf1\xad\xbb\xdd\x81\x7f\xec\x76\xf3\x19\x5e\x15\x44\x46\xf4\xda\xf4\x4b\x3a\xfe\x6d\x77\x30\x33\xa4\x06\x56\xb1\xf5\xde\x64\xcb\x5d\x2a\x73\x76\xa7\x53\x81\x22\x8e\x2b\xf5\x01\x3e\xba\x9b\xb3\x4e\xa6\x3d\x1e\x12\xf3\xac\x77\x8f\xb7\xbb\xcd\x09\x51\xe4\xfa\x54\x5c\xd7\xfc\x7d\xde\x0d\x52\x61\x60\xa0\x7c\x3e\x53\xf5\x7b\x59\xbd\x17\xa0\xf6\x68\x52\x27\xaf\x25\x4c\x05\xd3\x4e\x11\xa7\x69\xeb\xea\xec\x05\x46\x27\x23\x23\x6a\x3a\x71\x2d\x3c\xd7\x6a\xcb\x7d\xc5\xed\x73\x91\xc0\x72\x67\x62\x19\x45\x6a\xd7\xd7\xea\xfd\xc7\x2b\xf7\x6d\x06\xee\x89\x23\x05\xda\x66\x76\xb6\x87\xe3\x8f\x3a\x6f\x61\x9b\x1f\xa0\xe9\xc2\xed\xf9\x4c\x83\x8a\xb4\xc6\x62\x7a\xde\x6c\x8e\x55\xd9\x54\x35\x17\x05\xfc\x56\x09\x27\x4c\x72\x11\x0a\x4e\xa2\x21\x15\x93\x08\x0d\xc1\xf6\xf1\x29\x20\xbe\x52\xa6\x62\x22\x5d\x7d\xfd\xbe\x3c\x6f\xf3\x29\x27\x94\x52\x49\x0a\xa6\xba\xae\x40\x56\xca\x58\xd5\xf5\xf4\xdd\x25\x60\xc0\x6c\x47\xde\x34\xdb\x6a\x34\xb3\x02\x87\x9e\xbd\x70\x3c\x27\x6f\x8d\x46\x31\xf2\x06\xe9\x53\x51\x0c\x0b\x24\x8a\x46\x29\xba\xfd\x06\xbd\xb1\x7c\xde\x7c\x32\x2f\x68\x94\x62\xc2\x5b\xcc\xf9\xa4\x6e\x4c\x4a\x92\x5e\x21\xee\x2b\x66\x5a\xf7\x03\xa9\x45\xd0\x73\x5d\xb7\x27\xd5\xd3\xbb\xb8\x21\x5a\x60\x4d\x44\x9a\x1e\x00\xa4\x86\xf0\xb6\x4d\xa5\x84\xa7\x13\x8a\x00\x2e\x5b\x4c\xdf\xb8\xf7\x30\x3a\x5b\x9a\x1a\x11\x0e\xac\x9e\x1b\x9c\xfa\x4d\x55\x9b\x4d\x1a\xcd\xe6\xe4\xed\xa4\x42\xa4\x89\x7f\xa2\x01\x82\xc0\x1d\x97\x9c\x6a\xd7\xe2\xda\x42\x0d\xcd\x3c\xd3\xb5\x52\xa9\x96\xe8\x15\xef\xac\x33\xd8\x6d\x73\x63\x61\xa6\x91\x5b\x11\x4f\x7e\xce\x94\x42\x8c\xa9\xe3\xbd\xcc\xab\xd2\x18\x86\xbf\x5c\x8f\x1b\xdf\x78\x16\x6b\x61\x1d\xb7\x2b\xde\xc0\xaa\x7d\x5d\xf2\xe3\xe4\xe1\x32\x08\x70\x07\xd7\x00\xea\xa5\xcc\x65\x55\x4f\x60\x96\x4a\x10\x82\x46\xdc\xe0\x2b\x4e\x67\x13\xc9\xfd\xb5\x3b\x10\x49\x84\x00\x33\x9c\xf3\xbd\x4c\xe0\x27\xd3\x4f\x82\x49\xd1\xb9\xc6\x94\xeb\xbc\xa9\xde\xcb\x87\xaa\x75\xae\x2e\x6a\xa3\xd9\xc1\x9d\x31\x96\x3e\xc7\xd8\x4e\x55\x8c\x95\x52\xa1\x8a\x32\xdf\x50\x57\x9d\x6a\x09\xc8\x67\x34\xec\x78\x0e\xfc\xe0\xcc\xb0\x7b\xb5\x5e\xcb\xcc\xe4\x10\xdd\x61\x11\x25\xc4\x37\xd9\x42\xd3\x54\xf5\x79\x03\x75\x0e\x43\xd1\x6b\xa5\x80\xc6\x06\xc0\xe0\x52\xae\x3b\x71\x1e\x81\x89\xe7\xf7\x49\x05\x2c\x42\x76\x05\xab\x37\x51\x3a\xba\x6f\xa5\x20\x0b\x90\x95\x10\x01\x01\xde\x0d\x76\x7e\xfa\xf8\x2c\x3a\xe2\x88\x89\xb8\x32\x08\xce\xdd\x66\xfb\xe0\x4e\xa3\xa5\xd6\xdc\xb1\xbd\xf0\xa2\xb9\x83\x72\xef\x04\xf3\x14\x90\x50\x60\x46\x45\x14\xc0\x6d\xdc\x12\x84\x06\xe2\xea\x6b\xf7\x40\x12\xc6\x52\xf7\x0a\xda\x7c\xb0\x10\x6d\x27\x52\x29\xf9\x78\x59\x43\x18\x1a\xd9\x81\xeb\x47\xd7\x21\x03\x51\x4c\xc0\x76\xb8\xae\x8a\xaa\xdb\x63\x07\xd2\x14\xa3\xd5\x00\x11\x8b\x43\x5f\x17\xc3\x1c\xb2\x71\xd6\xe6\x27\x0f\x44\x2a\x53\x89\xe7\x22\xb8\x3e\x97\xfc\xe0\xfd\x6a\x88\xc3\x80\x59\xe7\x01\x4f\xb7\x1b\x6a\x23\x29\x88\x99\x11\x1b\xb1\x28\x49\x03\x4b\xb0\xc7\x12\x4e\x9c\xbc\xf3\xe6\x3f\x27\x5e\xc3\xa2\x86\x49\x30\x01\x89\xa6\xce\x42\x98\x5c\xe6\x7d\x5e\x40\xd3\x56\xe5\xb4\x52\x0c\x69\x98\x71\x4b\xf6\x05\x75\x3b\xd4\xcb\x75\xd7\x4b\x53\x86\x89\x3c\xbc\x09\x03\x3e\x1b\xa2\x9a\x9d\x3f\x04\x29\x4b\x90\x6b\x6d\x75\xbd\x0d\xdd\x6f\x19\x97\xca\x97\xa6\xdc\xaf\x46\x6e\x14\x30\xae\x49\xd0\xfb\x12\xb7\xfc\xd0\x37\xce\x01\x93\x1a\xb7\xfa\x67\x9e\x2b\xc7\x2c\xff\xab\xa0\x7c\xfc\x7c\x0c\x08\x56\x2c\x6f\xd6\x7e\xf2\x01\x03\xa1\x23\x67\x8f\xa7\x42\xa0\xd3\x9f\x1b\xba\xcf\x7b\xe8\xde\xe2\x42\xa9\xcb\x7d\xd9\x8e\xcc\x22\x23\xc8\x6c\x7d\x7a\xc7\x65\xd3\x4e\x5c\x36\xc8\x68\xa4\x4c\x58\x6d\xd7\xbd\xad\x90\x8f\x4e\xeb\xdf\x0e\x8f\x00\x5b\xe3\x8c\xfd\xbe\xc9\x4b\x69\x27\xb9\xd1\x0b\xa8\xdb\x7c\x26\xc6\x1e\xbf\x60\x11\xc5\x28\xc6\x88\xe2\x20\x8d\x37\x25\xfe\x1d\x8b\x18\x8c\x38\x73\xf5\x7e\xcf\xcb\x09\xc6\x11\x44\x9a\xa5\xd2\xcf\x24\x43\x6f\x38\x9d\x43\x42\x30\x2b\xdc\x6d\x62\x3a\xac\x8f\x35\xe7\x1e\x72\x3b\xab\x11\xa3\x40\x2a\x20\x30\xe4\xca\x2e\x30\x72\x2d\xa1\x98\x78\x2c\xa0\x12\xdb\xde\x0d\xed\xb2\x2a\x3e\xa1\x5f\x56\xa0\x44\x8a\x2c\x11\x47\x7e\xee\x5c\x52\x73\x56\xbf\x45\x4e\xc6\x82\x69\xe2\xe9\x6c\xfb\x38\x62\x07\x10\x41\x6c\x65\x50\x9f\xfa\x86\x33\xd0\x4c\x28\x07\x03\x36\xad\xd2\x46\x64\xde\x1f\xd7\x09\xee\x96\xfb\xfc\x27\xdc\xc3\xa6\x3a\xc0\xd5\xd5\xcb\xf2\x77\xe7\x23\x6a\x12\x67\x3a\xb5\x9c\xec\x4f\x50\x47\xfe\xef\xc2\x94\xe7\xb1\x61\xde\xc8\x06\x2c\x3f\x55\xaf\x50\x9a\x28\x0b\x8f\x01\xa3\xed\x79\x5d\xb5\xcb\x2a\x2f\xc5\x20\x49\xe0\x46\x76\x56\x68\xf0\x7e\xf1\x83\x8c\x28\x4e\x66\x23\x4c\x1d\x28\x8e\x51\xe4\xed\x07\x1a\xf7\xbb\x29\x2f\x9f\xd2\x01\x00\x6a\x88\x7a\xbd\xdf\x53\x03\x46\xfa\x6c\x64\x70\x75\x48\x0d\x7f\xbc\xfd\xf5\xd4\xfa\xe8\x50\x85\x3c\x74\x9c\x61\xe6\x26\x6f\x39\x12\x67\xbf\x5e\x34\xb8\xeb\x50\xa7\xb8\xf5\x94\x55\x9b\xeb\xf3\x16\x43\xf6\x8b\xfc\x9e\x8e\xa4\x40\xef\x6e\x0b\xfc\x70\x9d\x37\xff\x39\xf1\xe2\x52\x15\x5b\xe9\x98\xc7\x24\x72\x62\x2d\x2d\x4e\x96\x61\xfb\x98\x4e\x22\x86\x06\xda\xfe\x0a\x49\xf9\x27\x81\xa2\x4e\x52\x8a\x4b\xf9\x9e\x9f\x45\xe7\x5b\xe9\xaa\x3e\x60\xee\xc6\x9f\x44\x1a\xb0\xb7\x49\xfd\x74\x13\x7b\xc0\x27\xa2\x69\x6c\x20\xcc\x0f\xf0\x7e\xcf\xcf\xd5\x45\xaf\xbe\x1b\x46\x49\xe0\x74\x42\xf3\x12\xa1\xef\xd0\xb4\xe3\xfe\xfb\xbf\x8f\x5e\x01\xcd\x0c\xea\x2e\x5f\xf2\x7a\x39\x92\xe4\x9d\x69\x22\xd0\x54\x0b\x14\x2b\xc9\x9b\xab\xbc\x3a\x40\x5b\xe7\xb2\x67\x67\x1f\x99\x12\xcd\xa2\x08\x9b\x32\x86\x34\x16\x0f\x55\x69\xc0\x84\x2a\x6f\xc4\xc9\x92\x25\x62\xea\x7d\xd6\x4e\x6a\x96\x72\xcc\x0a\x1b\x8b\x66\x79\x89\x06\x15\x9c\x69\xdf\x88\x66\x99\xd1\x50\xac\xab\x93\xa9\xe5\x28\x04\x46\x8d\xef\x2c\x0b\x35\x9a\xf4\xba\x0b\x61\x2b\x35\xfa\xe2\x93\x1b\xe0\xb1\xa1\x70\xba\x85\xf6\xbe\x73\x86\x9c\x21\xd4\x5c\xc4\x5a\xf6\x0d\x78\xea\x07\xe4\x4b\x8f\xc0\xd2\x22\x0e\x52\xab\x00\xf2\x5c\x15\x85\x69\x3a\x19\x43\xc5\x86\x4d\x9d\x97\xab\x4a\xc4\x81\xe3\xbc\x71\x26\x69\x58\xbf\xd3\x42\x71\xcc\xd0\xec\xb8\x52\x0f\x37\x5f\x00\x7e\xb5\xd0\x86\x4a\xae\x81\xd6\x44\x13\x9e\xb9\x69\x3a\x2e\x43\xde\x37\xc4\xa7\xa3\xb6\xea\x24\x43\xf1\x95\xab\xac\x25\x70\x09\x3e\x0d\xb2\x69\x3b\xcb\xbe\xb7\xd0\xc6\x20\xb1\x83\x54\xa8\x31\xff\x7b\xf4\xc2\x42\xcf\x20\xf3\x63\x0e\x65\xeb\xed\x9b\x4a\x19\x16\x26\xf1\xf4\x4d\x5b\xfb\xbf\x77\x3e\x2e\x06\x59\x55\xa1\x4e\xef\xe5\xcb\xd3\xc8\xa1\xd0\x90\xc4\x18\x09\xac\xff\xef\x66\x88\x3b\xd0\x40\x53\xab\x6b\xd3\x4d\x33\x2b\x60\x8a\x19\xcc\xef\x50\x9f\xef\xaa\x72\x7f\xdb\x33\x7b\x68\xe0\x86\x42\xf4\x88\xe3\x90\x80\xd8\xbf\x72\x1d\xa6\xc4\xe8\x12\x94\xaa\x7a\x37\xc4\xa2\xa3\x00\xd2\x8d\x83\x08\x5c\x63\xa2\xf9\x22\x37\xc1\x4d\xf8\xc9\x7a\xd5\x96\xf0\xf8\x90\xff\x3f\xd6\xde\xad\xbb\x55\x1c\x6b\x17\xfe\x2f\xfb\x6a\x5d\xf4\x85\x00\x01\xe2\xbb\xb3\x1d\x27\xf1\xae\x24\x76\xd9\x4e\xad\x55\xfd\x8e\x1e\x1e\x3a\x4c\x25\xbc\xc1\xe0\x06\x9c\xc4\xfd\xeb\xbf\xc1\x94\xc4\xc9\x24\x55\x3d\xc6\xbe\xe9\xd5\x15\x09\x0c\x42\x87\x79\x78\xe6\xf3\xe4\x03\xb2\x05\x20\x24\x88\x10\xa1\x59\xd5\xe5\xbe\x58\x9f\x9a\xb3\xb2\x18\x4a\x4b\x00\x21\x31\x47\x4e\xe7\x53\x2a\xdf\xac\x8a\x54\x55\xf5\x90\x24\xa3\xba\x59\x20\x84\x2b\xa4\xdb\x59\x2d\xd6\xa8\x4b\xd7\xc5\x5b\x2e\xdf\x01\xcf\x81\x10\xa5\x1c\x3b\x18\x9a\x76\x98\xfe\x1c\xcc\x20\x20\x1e\x0d\x8d\xa5\xc4\x33\xb9\xdc\x2f\xea\x62\xb1\xde\x8e\xbb\xb0\x08\x27\xa3\x38\x5f\x9c\x20\xc0\xd4\xac\x05\xe2\x27\x0a\x5d\x2f\xb0\x03\x8c\x8b\xe0\xdd\x65\x70\x80\x50\x1a\x21\x9b\x36\x77\xc2\xac\xd7\x04\x3b\x40\x68\x14\x22\x84\x64\xde\x18\x02\x66\x93\xfa\xd1\xe6\x25\xbf\xc9\xbc\x8f\x9e\x85\x0a\x6a\xcb\x57\x2b\x79\x06\xe4\x9d\x72\x8f\x11\x25\xc4\x61\x37\x67\x59\x36\x08\x96\x01\x89\x00\x70\x4d\xac\x4f\xe7\x0c\xf2\xba\xa8\x5c\x43\x4c\x18\x22\x7b\x54\x5a\xa1\x96\x77\xfb\x77\x2f\xc4\xe8\x9a\x4b\xc1\xe5\xcb\x4f\x6b\x6c\x54\xa3\x37\x8b\x3d\x8e\x86\xf8\x2b\xaf\x5a\xe2\x7f\x2b\x98\x73\xd5\x95\x1b\xb4\xc7\x23\x7f\x83\x1b\x9e\xfe\x57\x0c\x42\x40\x62\xa1\x31\x4d\xd5\xf7\x38\x80\x30\xe2\x3b\x65\xdc\xa7\xf3\x71\x0b\x2f\xe7\x8c\x3b\xf2\x9b\xe2\xdc\xe7\x6b\x19\x3e\x0b\x0b\x98\x01\x94\xf3\x66\xeb\x1d\x11\x08\x01\x61\x5a\xea\xa0\xe5\x29\x30\xd4\x60\x95\xa3\x29\xab\x7e\x0c\xf7\x7a\x20\x89\x47\x30\x0d\xbd\x92\x85\xe3\xd6\xeb\x24\xcb\x2a\x87\x63\xed\xbf\xe7\xb5\x1e\x3b\x90\x24\x94\x68\x57\x42\xae\xb6\x5c\x6b\xe7\xa2\x03\x49\x38\x20\xcc\x1f\xea\xd7\xe6\xc3\xda\x58\x67\xdb\xaa\x7c\x34\x75\x6d\x3d\xe1\x04\x7a\x13\x08\x67\x46\xb0\xf2\xa5\x31\xa6\x4d\x81\xde\xf4\x0c\x13\x84\x8a\x96\x50\x68\xef\x24\x9c\x47\xa3\x23\x88\x31\xa3\x56\x45\xfd\x33\xd5\x69\xdd\xdf\x2c\x44\xa8\x1c\xb7\x97\xd9\xe2\x56\xb9\x2e\xe6\x97\xa9\x6a\x28\x20\x92\x18\x01\x07\xb3\xb2\xb0\xee\xd8\x68\x17\x8d\xba\x05\x60\x20\xec\x25\x57\x80\x8b\xfe\x9e\xe7\x2a\xfb\xda\x20\xbc\xfa\xef\x71\x16\x6a\xf8\xd2\x52\x18\xcd\x8c\x0f\x5b\x49\x5a\xbf\x76\xbb\x28\x10\x15\x11\x2c\x82\xe4\xe7\xfa\x15\xf2\x3a\x45\x51\xd1\x0e\xe1\x08\x44\x25\x06\x39\x55\xa0\x97\xb1\x32\x09\xd1\xe1\x34\x55\x89\x44\x6d\x10\x67\xd2\xfe\xda\xac\x46\xfb\x91\x92\x14\x99\x31\x10\xec\x0a\xf5\x32\xd7\x45\x29\x61\x0b\xef\x69\x85\xae\x8b\xed\x06\xbe\x87\xbb\xb4\xdd\x65\x86\xf7\x00\x01\x96\xd9\x47\xbe\xf1\x17\xe8\x1d\xd3\x40\xb4\xa7\x22\xd1\xca\x32\xe0\x97\x41\xd6\x9f\x2f\x98\xd0\x81\x68\x46\x12\x8b\x61\xd8\x9f\xb3\x74\x18\x0e\xf6\xdc\x4f\x6a\x29\x63\x1b\x40\xde\xc9\xa2\xfc\x6a\x13\xd5\x4a\x21\xb6\xfa\x84\xc1\xf1\x61\x25\xca\xb0\xab\x47\x38\x45\xd7\x71\xf9\x38\xe0\x90\x04\xcf\xf3\x05\x82\xaa\x67\x50\xc2\x75\x41\x53\x7f\xba\x7b\x1e\x17\x89\x8d\x35\x2c\x96\x0a\x6a\x9e\x66\xc3\x3a\x2f\xf0\x82\x20\xe0\x8e\x3b\xdd\xa6\xa3\x7e\x82\xa8\xd2\x5e\x90\x70\x70\xcb\x20\xa6\xdc\x1f\x94\xf7\xe1\x4c\xf5\xbf\x41\x0e\x82\x17\x00\xc1\x4c\xee\x1f\xe9\xa7\xc7\xba\x6a\x56\xf0\x42\xc1\xd0\x78\xc5\xab\x6f\xcf\x99\x4e\xb3\xec\xd8\xab\xe1\xf8\x1f\xbf\x33\x28\xd9\x28\x68\xdd\x6b\x73\x77\x03\x40\x26\x6c\xc7\x58\x3a\x08\xf2\x83\x17\x45\x42\x58\x7a\x00\x03\x2f\x48\xff\x33\x34\xb9\xc0\x8b\x84\x46\x09\x8a\x5b\xcb\x8c\x84\x91\x29\xcc\xa4\xb4\xb9\x43\xf0\x22\x19\x0b\x4b\x26\xb7\x4f\xe5\x5b\xff\x36\xd3\x7b\xb6\x17\xfb\x21\x6d\xf9\x17\xad\x5a\x66\x8f\x24\xd4\x3d\x60\x4c\x23\x3c\xbb\x6c\x59\x91\x4d\xa6\x77\xcd\x09\x0b\x8d\x02\xa9\xb2\xc0\xa8\x49\xc1\xd0\x2f\x9e\x81\xc5\x09\x68\xab\xf7\x65\x42\x6c\x50\x3a\x75\x3d\xf0\x92\x48\x63\xa8\x5f\x15\xad\x88\xaf\x6b\xb1\x1c\x9b\x2f\x60\xb2\x6d\xd5\xc0\xdb\x06\x2f\xe1\x26\x31\x8d\x61\x51\xac\x38\x46\xb7\x76\xb8\x75\x79\x89\xd0\x86\xed\xc5\xa6\xda\x7f\x16\x65\xa6\x16\x45\xe9\x0a\xe0\xad\x28\x6d\xfb\x8f\xbb\x4c\x46\xca\x52\x2d\xee\x61\x52\xe3\x7c\x22\x72\x09\x5e\xa2\x05\x38\xc6\xfe\x43\x65\x6d\xe7\xe1\x15\x6d\x4f\x53\x08\x7d\x4c\xf3\x1d\x26\x7d\x4e\x3d\x8d\x4d\xdb\x87\x53\x81\x19\x8a\xca\x05\xc6\xc0\xe3\x91\x8f\x95\xff\x98\xd8\x18\xd0\x8f\x81\xc7\x21\x09\x04\x1a\x4a\x88\x35\xd8\x82\xe4\x59\xb6\xe0\xa7\xb4\xfe\x22\x50\x0d\x9e\xa0\xcc\x90\xca\x37\xde\xe7\xbc\x28\xde\xda\x39\x2b\x04\x33\xdc\x91\x50\x3f\x6f\x57\xd3\x4b\x52\x32\xc6\xec\xbc\x5e\xe6\x8d\xf9\x32\x3f\x5f\x66\xb9\xc2\xd4\x5b\x6f\xda\x4a\x68\xc1\x53\xbf\xc1\xa5\xbf\x29\x7a\x8a\x04\x91\x74\xb9\x50\x9c\x59\xae\x3e\xe5\x8b\x07\x56\x3a\xc4\xc4\xe5\xa9\x28\xb2\x4e\x75\xa2\x6d\x4c\xd0\xa6\x78\xd8\xaf\xdd\x9f\x20\xf2\xd0\x38\x1c\x8a\xfb\xef\xfa\xa3\x0c\x92\xe2\x33\x98\x50\xdd\x20\xa2\x0c\x9e\x0e\x79\x6c\x73\x86\x08\x7e\xb0\xf2\xca\xc3\x39\xa6\x39\xb8\x4e\x8f\xfc\x73\xce\x6b\xf9\x6a\xf2\xd3\xb8\xa3\x0c\x5f\x40\x4b\x1f\x4c\x92\xd8\x01\xa0\xd0\xf6\x9d\xd0\x1b\x00\x4f\x83\x8f\xa6\x1d\x82\xeb\x26\xcd\x28\x9f\xc4\xe0\x40\xe6\xcd\x54\xe8\x85\x22\xc0\x27\x2c\x11\xbe\xdb\x61\xa1\x8f\xb3\xef\x00\x09\xe0\x13\xa0\xe8\x26\x2f\xb2\xe2\xac\x7e\xb5\xd7\x42\xcc\xe8\x08\x2a\xf3\x63\xf4\xd3\xda\x1c\xcb\x2e\x7a\xb7\xa9\xe0\xac\x8a\xc6\xf7\x70\x37\xf1\xfc\x18\x79\xb4\xb6\xb3\xfd\x12\x19\x89\xfc\xb6\x25\x4a\x02\x07\x79\x92\x05\x02\x55\xd6\x39\x58\xce\x92\x54\xc2\x2a\xdf\x14\x8d\x8f\x06\x68\xf0\x0e\x46\xc5\xf7\x22\xed\x52\xa6\xf6\xb5\x16\x59\x51\xa5\xf9\x0b\xae\x85\x51\x5f\xce\xb1\x12\xc7\x90\x3e\x5c\xd3\xc2\x83\xef\xd3\x98\xc4\xc3\x58\xa2\x23\x07\x73\x3d\x22\x8f\xf4\x96\xd5\x57\x34\x1e\x4d\xc7\x04\xba\xc0\xfd\xa6\x6e\xf6\xf1\x07\x5e\xb6\x33\xcd\xf7\x99\x01\xed\x99\x10\xc6\xef\x67\x38\x4f\x28\x80\x34\x4e\xc9\xd4\x1f\xdd\x3d\xb8\x42\x56\xab\x43\x09\xb6\x9e\xcc\x52\xe4\x3d\xf0\xaa\x9e\xbd\x43\xc9\x5f\x60\xfa\x4d\x03\x2f\xc2\x98\x7a\xc9\x73\xd5\x7e\x88\x80\x05\x3c\xea\x12\xaa\x8e\x4a\xf3\xdc\x51\xae\x3a\x4b\xc3\x0f\x78\x42\xed\x6a\xc7\xba\x37\x6e\x93\x8f\x5f\x9c\x02\xee\x2a\x88\x31\x78\x59\x9e\xf3\xde\x5e\xe5\xd3\x50\x84\x16\x6f\x73\x9b\x56\xaf\x62\x5c\x5d\x0f\x3e\x15\x21\xaa\xb5\xbe\x1a\xad\xb7\xf9\x58\x18\xbb\xe9\x21\x90\x01\xec\xb5\x2e\xf8\xe8\xe2\x30\x34\x8a\x4e\xb2\x4d\x80\x75\x1a\xfb\xe0\x87\x3a\x64\x46\x91\x2c\xaf\xce\x47\x78\xac\x9c\x9f\xe6\x47\x91\x51\x03\x2f\xd0\xc9\x4e\x8b\x9c\x67\xc8\x20\x3d\xd0\x4e\x05\x3f\x8a\x13\x21\x3b\x62\x32\xa7\xb3\xe3\x5a\xb9\xc0\x30\x68\x47\x6a\xbc\x6c\x3e\xe4\x6d\x51\x2e\xe7\x7f\xee\x97\x23\x74\x32\xf8\x91\xd0\x48\xa0\xfc\x50\xbc\xec\x90\xe8\xea\xfb\x11\x8d\xb9\x30\x6a\x55\xb9\x42\xd7\xfb\x86\x5f\x5a\xe6\xb6\xa6\x55\x26\x36\xe4\x70\xc8\xe1\xe3\xa0\x2c\x8f\xdc\x01\x95\xf9\x46\x23\x18\x83\x99\xfc\xe2\x7c\xe9\xb3\x6b\xd9\x56\x46\xb4\x61\x0a\x2a\xea\x1a\xca\xcb\xfc\xb2\xdc\xdf\x8f\xc6\x99\x89\x98\x5a\xf4\x24\x1a\xb3\x5d\x5e\x13\x7c\x06\x1c\x59\xc2\xb9\x94\x70\xaa\x27\xd8\x40\xc0\x4f\x42\x23\x1b\xbe\x2c\xa5\x93\x67\xb9\x86\xc2\x30\xd7\x99\x29\xe4\xd2\xf9\x30\xce\x6d\xe3\xd4\x55\xb0\x6b\xbf\x49\x22\xc1\x0b\x9d\x02\xe1\x6f\x70\xf9\x31\x05\x2d\x00\x9f\x13\x83\x70\xc6\xdd\xc3\x14\x61\xf4\x50\x19\xa3\xbe\x9e\x51\x3b\xb5\x6c\x02\xc6\x56\x2c\x8b\xe3\x9c\x97\xd3\xfc\x8b\xe0\x73\x2e\x4c\xad\x27\xcf\x51\x9b\x6b\xf4\x10\xd3\xd2\x6b\x83\x51\xe7\x3a\x70\x25\x27\x07\x6d\xf9\x0e\x87\xbf\x21\x62\xc6\x2d\x12\xd5\x95\xdd\xfc\x5e\x3b\x4f\xc7\x97\x54\xe3\x26\xb3\x99\x6d\xf7\x4f\xcb\xed\x61\x37\x7b\x70\xe2\xd4\xe0\x2b\x9f\x62\x1d\x95\x48\x95\xe6\x69\x76\x2e\xdb\xaf\xa5\x84\x32\xc8\x5c\xae\x94\xe1\xd3\x1c\xfd\xaa\x12\x1a\x03\xdb\xaf\xbc\x42\xa1\x09\xfb\x67\x88\x22\x2c\xbd\xb2\x12\x80\x59\x51\x57\x5d\x59\x97\xeb\x23\x78\xd8\xf1\x4a\xa2\x08\x6e\x33\x59\x56\xf9\xfc\x9c\xbd\x7d\xc9\xfc\x03\x3e\x80\x87\xd6\xeb\x19\x19\x48\xcd\xf0\x17\xa5\x0b\xb4\x8d\x9e\x0f\x74\x84\xef\xdd\x98\x99\x2b\x94\xde\xc6\xc9\x38\x9c\x70\xa0\x13\xd4\xf6\x3b\xa6\x8a\x3b\x8a\x87\xa1\xb1\xee\x6b\x42\x70\x57\x31\xea\x43\xf6\x80\xe9\xd9\x2c\xbe\xe6\xda\x4a\xe4\xd6\xed\x9b\xce\x0d\x9d\xd4\xdf\xc1\x12\x80\xaf\x85\x0e\x78\x57\x04\xe4\x6c\x92\xbe\xbf\x1a\x10\x16\x24\x8d\x49\xb1\x7a\x3b\x97\xfc\x31\xfd\xa2\xb8\x1c\x02\x8f\x1a\xdd\xfc\x16\x00\x85\x75\xc3\x77\xfc\x08\xa8\xf9\xec\x6e\xe7\x09\x4d\x08\x56\x99\xa7\xf2\x6d\x48\xb5\x77\xad\xe0\xe7\xae\x01\x41\xec\x7b\xce\xcb\x54\xbe\x4d\xae\x91\xc0\xd3\x89\x6e\x3d\x0c\xf3\x0e\xfb\xe3\xc9\xfd\x6e\xf3\x7c\xe8\x2d\x2b\x95\x7e\xc9\x67\x05\x41\x90\x68\xac\x7f\xdb\x94\x67\x10\x5c\x16\x69\xee\xf9\x41\x7b\x0f\x4e\x10\x65\x5b\xa2\xef\xb0\x52\xa3\x07\x08\x64\x88\xb2\xdd\x07\xab\xf2\x8c\x44\xe5\x69\xbf\xb6\x63\x1c\xfa\x0c\xa8\x8c\x4c\xc8\xec\x22\xca\x54\xa5\xff\xc1\x9d\x7e\xf9\x99\x56\xa3\xc2\x3b\x08\x42\x1a\xa3\x85\x8b\x11\x16\x43\x95\xde\x09\x52\x41\x10\x86\xc2\xd3\x2d\x7a\x76\xa8\xc9\xed\xba\x24\x49\x98\xb4\x41\xe7\xe6\xc3\x60\xc4\xf9\xa1\xc8\x5f\x56\x39\xd2\x27\xa7\xed\xda\x0d\x22\xa2\x75\x9f\x99\xce\xc9\xfc\x39\x32\x50\x17\x78\x1a\x8e\x40\xe4\x2b\xcc\xae\xcc\x16\xb3\x4e\x40\xf3\xaf\x30\xe0\xa3\x5b\x58\x60\xe9\xb7\xd0\x18\xdb\x37\xf6\x3c\x8c\x50\x0d\x2a\xf8\x21\x88\x69\x80\xb7\xc8\xe1\xb3\xee\xdb\xd7\x41\xcc\x22\xac\xae\x18\xe8\xcd\x8d\x46\x29\x06\xdf\x95\xc2\x20\x5e\xf7\x72\x02\x27\x2e\xf7\x63\x1c\xad\xbb\x06\x6d\xda\x9b\x30\x3f\x40\x97\xc5\x4c\x84\xa7\xa2\xe6\xdf\xc5\x28\x02\x16\x09\x68\x43\x00\xd5\x06\xca\xdf\xd0\xc2\x1f\x15\x63\xbb\xce\x89\x40\xb6\xd3\xfd\x40\xa7\x1e\x02\x26\x63\x13\x57\x5e\x3f\x3d\xef\x0e\xab\xc5\xfa\xb0\xdb\xcf\xee\x96\xde\x61\xb3\x5d\xe2\xd6\x1b\x76\x3d\xb9\x23\x95\xff\xf3\xf3\xa9\x57\xc7\x36\x55\xee\x0d\x41\x02\x31\xb7\x29\xc0\xdf\xdc\x2d\x38\x31\x6a\x09\xb6\x0a\x76\xbe\x5f\xf4\x8d\xd1\x8e\x24\xb4\x1f\x78\xb3\xdc\xd0\xee\x0e\x21\xe9\x21\xd0\x50\x00\xc4\xb0\x0c\xda\xec\xe0\xe8\xad\x39\x63\x08\x67\xdb\xbf\xc2\xee\x23\xd5\xf5\xeb\xcd\xec\x1b\x86\xbd\xff\xaa\xec\x01\x02\x19\x08\x5c\x85\x69\x65\xab\x48\xdb\x1a\xd2\xe9\xad\x4e\xca\x08\xa7\xf9\xe3\x6e\x33\x5a\x00\xca\xd7\xc4\x28\x8a\x57\x15\x9e\x2c\x6e\xc0\x20\x00\x9f\x77\x42\x42\x50\xae\x73\xe8\x91\xc9\x40\x00\x8c\x63\x60\x13\xd0\x7d\x6d\xa6\xde\x35\xb0\x17\x02\x90\xe6\x1c\xea\xb4\x46\xfb\xfa\x04\x98\x8f\xc8\x3b\x17\xdb\x5e\xa4\x3d\x81\x07\xa3\x39\xac\xfe\x28\xea\xbe\x92\x4d\xff\x53\x53\xe2\x1b\xa0\x3f\x66\x89\x8e\x69\x3e\x6d\xb9\x50\xc2\x3d\xc4\x67\x72\xa5\x9e\xe0\xc3\x88\xf0\xfd\x18\xde\x48\x18\xb3\x74\x0f\x55\xbd\x2d\xfe\x92\x71\x08\x28\x51\xa6\x8e\x66\xf7\x0e\x59\xdd\xb8\xe6\xd7\x29\xdf\x89\xab\x3c\x16\xa2\x9b\xcd\x95\x1a\x44\x5c\xfe\x16\x98\x0f\xa8\x07\x8a\x5a\xea\x28\x28\xeb\x45\xf3\xc1\x87\x1d\x7c\x5f\x23\x01\x87\x40\xe5\x80\x55\x0d\xc7\x71\x07\x66\x34\x82\x16\x9b\x3d\x26\x43\xdb\xb0\x1e\xf5\x85\xf1\xd5\xda\x9a\x3d\xa0\xbe\xf4\x55\x8b\x9e\xfb\xe0\xa5\x7a\xe4\x75\x99\xba\xb4\x0d\x0d\x42\x62\x84\xab\x21\xcb\xe6\x45\xae\x46\x3b\x13\x0d\x54\x80\x81\x53\x6e\xfc\x42\xd8\x42\x55\x3b\xfd\x55\x77\x0f\x2a\x62\xd5\x03\x86\x9e\xc5\x50\x61\x7f\xf8\x19\xa9\x02\xac\x45\x44\x20\xe3\x67\x35\xa2\x4a\x03\x1a\x7a\x91\x7b\x5e\x9b\xfb\x1f\x28\x9d\xe8\xe2\x8a\x26\x62\x78\xff\x30\xf0\x7c\x9b\xe4\x45\xb3\xba\xee\x27\x84\x5d\x1f\x6a\x48\x44\x91\x64\xc9\xd4\x31\xba\x9f\x8f\x88\x8c\x2c\xba\x18\xa9\xfb\xdd\xdf\x63\x69\xea\xd6\xe6\xcb\x7f\xae\x37\x87\xe5\xaf\xc5\xfd\xec\xe9\x6e\xd9\xb6\x2a\x89\xc6\xd7\x22\x3b\x8b\x3d\xf0\xe3\x43\x21\xdf\x86\xc5\x93\x40\x99\x1f\xbb\x78\xde\x82\x97\x6a\xf0\x2a\xd3\x33\x85\x05\x81\xe3\x75\x3d\x9f\xdc\x71\xf3\x45\x57\x6e\x54\xa8\x2a\x0b\xea\xc3\x23\xbd\x1f\x10\x18\xf5\xe7\xc4\xc3\x64\x96\x7c\x7d\x33\x6b\x6e\x7a\x30\x39\xd3\x48\xb5\xd3\x16\xea\x0c\xc2\x34\x5f\x3c\x36\xe7\x81\x29\x99\x30\xd4\x54\x9b\xe5\xf6\xb0\xdc\xdf\x2f\xb7\x87\x9b\xd9\x9f\x87\xf5\x53\x3b\x68\x1c\x7c\x99\x58\x5c\xcf\x63\x91\xc3\x17\x31\x2f\x2a\xc0\x67\xac\xab\xb2\x43\x42\x39\xdb\x24\x3d\x30\x87\x4a\xcd\xdf\xe0\xee\xe1\xd7\x17\xaf\x21\x79\x12\x83\x1b\x48\x4c\xa1\x5d\x33\xc3\x02\x55\xc4\x18\xc7\xb7\x59\xf1\x79\xe9\xe7\x94\xa8\xf2\x19\x0a\xb2\x89\x73\x99\xdf\x8d\xe1\xf2\x40\x55\x20\x4d\xfc\xeb\x94\x4a\x78\x3e\x4d\x06\x0b\xa9\x4a\x28\xf1\x5b\x31\x99\xe3\x04\x5f\xd2\x34\x27\x94\x8b\x98\x52\x05\xb1\xe3\x7c\xc1\x3d\xbc\xc8\x86\xdc\xfb\x40\x81\x52\x3c\xae\xd2\xea\x91\xa7\x48\x95\xd9\xa5\x60\x29\x70\x21\xbb\x1a\x11\x37\x39\x5d\xa8\x64\xf8\x42\x5a\xf8\xf8\xac\x4f\xb3\xed\x94\x46\x98\xe9\x15\x7a\x61\x1c\x5a\x70\xd9\x73\xee\xb2\xcf\xc8\x66\xba\x2f\x4e\x5e\x48\x7a\x31\xd0\xd0\x13\x0c\x0b\xa2\x25\xa4\x19\x06\x20\x2d\x2a\xc2\x36\xfb\x84\x70\x07\x2a\x5b\xbe\xbc\xac\x1c\xed\x3b\x84\xbe\x95\xc0\x72\x51\xb6\x9f\x69\x6e\x90\x99\xfb\x09\x81\x89\xef\x77\xde\x30\x20\x1e\x22\x4b\x07\xf1\xc4\x2f\x06\xdd\x99\xcd\xee\x52\x5f\x63\x86\xa3\x1e\xd5\xea\xdd\xf0\x9a\x7f\x99\x47\x1e\xdc\x20\x30\x44\x3b\xe8\xc9\xa5\x43\x18\x0e\x84\x81\xf0\xb8\xcd\x17\x2d\x3f\xd3\xfa\x16\xc0\x45\xa8\xc2\x40\xf9\x18\x62\xc0\xca\x6d\x43\xab\x3f\xf2\x41\xc2\x40\x45\x18\x19\xb0\xf9\xef\xc5\x6b\x7a\x1a\x77\xa1\x1e\xd3\xc4\xc1\xb6\x72\x55\x1c\xfb\xe7\xce\xd8\xf1\x6c\xb6\x47\x44\x9e\xcc\x1e\x7e\xf5\xf7\xe6\x90\x26\x81\x88\x6c\x69\xa3\xe1\xc1\x03\x75\x9b\x96\xc7\xc1\x31\x1c\x52\x15\x52\x43\xb4\x6b\x18\x41\x46\x8f\x12\xfa\x41\x62\x1f\xa5\x2d\xcf\x76\x79\x87\x30\x8c\x84\x91\xdd\xe6\xef\xf0\x08\x35\x1f\x8c\xef\xb7\xdc\x69\x43\xac\xa4\x3f\x41\x4c\x3c\x9c\x0c\x21\x68\x00\x17\xfa\xef\xf4\xd8\x20\x8c\x68\x88\x03\x7e\xa8\xb2\xc2\xe2\x76\x9f\xe0\xc3\xb5\xc6\x40\x11\x74\x08\xc7\x53\x7d\x31\xf8\xe9\xe6\x2d\x3a\x7c\x1a\x84\x8c\x86\xd2\x79\xe2\x98\xef\xba\x2d\xca\x85\x53\x3c\xf5\xc6\x93\x92\x31\x43\x4f\xb3\x59\x6f\x9f\x5c\x14\x2b\x4c\x28\x47\x98\xba\xe2\xe5\x5b\x5e\x28\x43\x57\x24\x7f\x83\xd1\x96\x15\x26\x8a\x53\x7f\xac\xf3\xfb\x55\xc9\xfa\xe8\x87\x65\xa0\xb0\xc8\xc7\xe8\xcd\xff\x4c\xc7\x4e\x49\x28\x93\x08\x21\x35\x0e\x76\x22\x8b\x23\x54\x18\x0e\xfc\x4b\x4f\xff\x8b\x05\x08\x5e\x88\x62\x4b\xf3\xd5\x62\xbd\x7a\x72\x2f\x0b\x7e\x82\xfb\x3b\x72\x5d\xc1\xc0\xb4\x08\x81\x19\xe8\x8f\x53\x57\x5c\x7e\x72\x59\xff\x2c\xb2\xb7\xd1\xb3\x6a\xe2\x05\xd6\x26\x33\x58\xdb\x21\x7e\x6f\xc2\xa8\x9b\x9a\x21\x6e\xa0\x46\xcb\x41\x33\xa3\xae\x53\x16\xe7\x41\xc6\x29\x22\x31\x47\xcc\x64\x56\x18\xd5\x20\x4c\x3f\x18\x45\x41\xd7\x43\xf8\x88\x96\x2d\x2c\x6a\x69\x07\xb9\x9a\x5f\x1a\xb7\x45\x0e\xf8\x17\xbe\x0a\x90\xb9\x6d\xa8\xbf\x97\x44\x44\x68\xac\xee\x59\x2c\x1f\x1e\x76\x87\xfd\xfa\xf0\x38\xfb\x6d\x79\xf0\x0e\xbb\xcd\x72\xfb\xe8\x7e\xd9\xb3\x7c\x59\x5d\x14\x16\x9f\xee\xbb\x74\x71\xe4\x93\x04\xe9\x7c\xac\xb0\x61\x2f\x66\x1c\x05\x89\x2f\xed\x66\xdf\x56\xb3\x62\xac\xc5\x75\xa0\xda\x47\xda\x64\xeb\xa3\xb7\xa0\x93\xa1\xb4\x83\xed\x1c\x12\x1f\x2b\x1c\x30\x92\xe6\xbe\x42\x17\xeb\x8c\x42\x00\x2c\xee\xde\x94\x45\x5d\xec\x4b\x9e\x66\xfd\x7d\x28\x8a\xb8\xc7\x6c\x76\xd2\xd6\x07\xa0\x0a\xf0\xd2\x88\xe3\xff\xe8\x83\x09\xdd\x15\x4a\x62\xa5\xfe\xc1\x01\x8a\x4e\x67\x43\x3a\x6b\x40\x03\x93\x27\x6e\x14\x87\x71\xa8\x7b\x9b\xfe\x4f\x10\xc1\xff\x7e\x35\x76\x31\xe7\x98\xac\x3c\xb4\xb1\xba\xef\xcd\xa4\x28\xd6\x12\x6d\x2b\x04\x52\x9f\x2f\x8f\x3c\xbf\x60\xe9\x9b\x7b\x49\x16\x28\x2c\x21\x3e\x20\x1f\xdc\x2c\xcb\x9c\x8f\xea\xda\x29\x0b\x10\xb4\x5d\x64\x19\x22\xd8\x86\x4b\x22\x62\x31\x41\xb4\xd3\xe2\x7e\xbb\x1f\x3e\xcf\x97\xae\x4d\xc4\x12\x8f\xf7\xdf\x78\x7e\xd9\xbf\xa6\xa5\x6a\x2c\xf0\x2b\xc1\xe6\xc1\x6b\x4d\x53\x29\x40\xc4\x40\x71\x53\x25\x29\xcf\xed\x54\x49\xc2\x84\xb4\xf9\xc2\x9e\xfc\xde\x0e\xea\xda\x7c\xc2\x5b\x80\x9b\xd4\x20\x71\x86\x2f\x95\x24\x86\xcc\xd1\xc5\x37\xa7\x4b\x1b\xfe\xd6\x6e\x14\xf1\x10\x42\x17\xe0\x4b\x4b\x3c\xcb\x47\x41\xd5\x88\x0b\x8a\xe9\xa1\x8f\x74\x1a\x53\x0a\x91\xf4\x35\xb5\xee\xca\x2d\xea\xbe\x1c\x8f\xc6\xf0\x36\x25\x8c\x93\x96\x53\x24\x43\xce\x44\x2b\x33\x85\x89\x5f\x9c\x8c\xc3\x0c\x7f\xa4\xfc\x88\x7a\xd6\x40\x6e\x8c\x8d\xe5\x67\x5d\xf2\x3b\x5e\x2d\x3f\xbf\xc4\x1e\xb8\x2b\x19\xb5\x95\x05\xf5\x3c\xe3\x4e\x03\x10\x22\xf0\x0c\x12\x23\xcd\xd3\x7a\x9e\x15\xc5\xf1\x36\xcd\xea\x36\x1c\x10\x81\xf6\x30\xea\xda\x34\x1f\x14\xbc\x1f\x78\xae\x0e\x76\x33\x38\xf0\x6b\xd9\xa0\xe9\xb7\xd3\xa1\x42\x85\x17\x9b\x73\x76\x9a\xd7\x69\xd5\x7a\x53\x31\xd1\x01\x56\x90\x5b\x8e\x49\x43\xfb\xca\x1d\xcf\x1b\xc4\x9e\xaf\x31\x6a\x68\x09\x1d\x57\xd5\x53\x51\xa3\x0e\xf8\x54\x00\x21\xf6\x98\x44\xc2\xab\xc5\x6c\xe1\x6e\xe0\x93\x00\x61\x15\x58\x40\x83\x2c\xfb\x03\x0d\xe4\xa6\x83\x91\x23\x6d\x36\xe4\x23\x3a\x1f\x83\x11\x8c\xfd\x80\xf8\x2d\x5d\x7e\xaa\x56\xaa\x77\xc2\xc7\x7e\xa8\xd0\x44\xa8\x0b\xeb\xa2\xae\x6e\x06\x26\x50\x1c\xc4\x26\xcb\x82\x2e\xd0\xe1\x66\xb9\xfb\xed\x80\x11\x32\x77\x83\x40\x7a\x5e\x4b\x74\x39\x56\xae\xcd\xce\xd5\xbe\x4c\xe5\x5b\x06\x37\xc5\x47\xee\x88\x2a\xed\x95\x34\x32\x52\x84\x1b\x7e\x69\xe6\x1b\x0e\x4f\xf9\x63\xf0\xe8\x34\x31\x05\xd6\xa7\x73\xbd\x2f\x90\xb7\xdb\x36\x84\x92\x63\xc5\xca\xae\xc8\xd4\x53\x31\xba\x71\xc4\x25\x89\x1d\xb9\x7f\x96\x01\x4c\x32\x15\x40\x1c\x49\xdf\xf1\x03\xaf\xf2\x77\xc8\x31\x41\xf3\xed\x42\x8b\xe3\x58\x26\x49\x2f\xe7\x3f\xa8\x31\x1d\xde\x3d\x66\xbe\x76\x72\x55\xbf\x8d\x3e\x49\x2c\x25\x5a\x0f\x07\x89\x42\x71\x93\x05\x19\xe7\x1e\xc6\x24\x8e\x35\x60\xca\xc6\xa9\x18\x0d\x14\x0b\x6c\xe1\xe6\x30\x6a\x38\xd8\xd2\xec\x5d\x58\x20\x9d\x28\x15\x26\x7c\x9f\x77\x37\x72\xb9\xbf\x77\xe3\xc6\xac\x58\x37\x72\xd7\x15\xed\x5f\x23\x86\xa5\xe3\xd7\xec\x24\xff\x43\xff\x75\x75\xc8\x7b\x1d\xa2\x6a\x42\x32\x08\x62\x26\x12\x57\x22\x69\x38\x73\x72\x9d\x5e\x69\xb1\x8c\xae\x49\x88\x12\xbe\xab\x14\xac\x90\xf6\x0e\x94\x89\x9a\xdd\x9c\x7b\x45\xd6\xb6\x3b\x6f\x9c\xa3\xc6\x50\xc9\x8c\x0b\x37\x74\x50\x62\x49\x94\x20\xfd\x09\xdb\xcc\x21\x77\xad\xf4\x62\x16\xd9\x4a\x08\x75\x9b\xe6\xad\x51\x10\x4b\x6d\x04\xf0\xdf\xd2\xfc\x65\xde\x89\x91\x42\xac\x62\x5f\x50\xf7\x46\xd5\xb5\x08\x33\xc4\x2a\xf1\x71\x05\xdf\x41\x0e\x55\x5b\xf4\x75\x45\x0b\x34\xb9\x2b\xc7\xe0\x31\xb4\xd2\x1b\x9b\x78\xa0\xfe\x36\xdc\x38\xc0\x27\x58\x59\x6a\x00\x09\x4f\xf0\xf1\x9d\xec\x08\xc4\x10\x12\x66\x23\x38\x98\x79\x6e\xfc\xf8\x02\xf1\xa9\xae\xce\x13\x62\x48\x28\x02\x77\xb3\xe2\xe5\xa5\xf3\xbe\x63\x1d\x98\x0a\xca\xff\xcb\x15\x34\x2e\x75\xdf\x9c\x89\x75\x22\x31\x22\xf8\x9e\xc2\x07\x65\xed\x5f\x65\x88\x0c\xb2\xc7\x73\xf6\x65\x51\x36\x30\xa2\x62\xe4\x3a\xb0\x9b\xad\x83\x92\xdb\x56\x2f\x34\xf2\x9c\x56\x8a\xba\xd9\x34\xa0\xc7\x51\x08\xcc\xd3\x01\xc8\x16\xb3\x81\x4f\x35\xc4\x8f\xf7\xc0\x7e\xdf\x01\x02\xdb\xdb\x85\xae\xea\xcd\x0a\x0c\x98\x4a\x64\x0b\x6a\x59\xf0\x5c\xb9\x3d\x9e\xf9\xcc\xd4\x38\x3e\xe7\xc6\xf0\xff\xfe\x48\x63\x3e\x97\x2e\xda\x80\x33\x09\x79\x3f\x47\x5d\x80\x1b\x11\x77\x53\x52\xb4\x05\xae\x5c\x16\x8d\x05\xbe\x87\xa6\x6d\xc6\xab\x7a\xa9\x75\x2a\x53\xc8\xcd\x8d\xfa\xa4\x75\x4d\xbf\x18\xbd\xa2\xdf\x4e\xc5\x69\x01\x19\x88\xb6\xc1\xea\xfe\xdc\x9c\x8f\xc7\xcb\x37\x84\x2a\xa3\xc7\x0e\x24\xb0\x76\xa7\xb7\x5c\xbd\xa3\xc7\xa6\x92\x20\xb3\xc7\xbc\x28\xaa\xfa\x98\xba\x1f\x8c\x40\x4a\x3b\x96\x0f\xbc\xaa\x71\x1a\x0f\x03\x3e\x2c\x0e\xa8\xe1\xb5\x3d\x97\xf9\x2d\x3f\x4b\xa8\xd7\x79\xdb\x26\x03\x61\x68\x9c\xcb\x97\xd4\x59\x16\x63\x9c\x39\x63\x84\x39\xa2\xba\x66\x36\x0f\x74\xb7\x80\x31\x9f\x27\xb6\xd5\x1c\xd1\x55\x4b\xe6\x3e\xdc\x1f\x18\x4b\x00\x9f\x04\x72\x35\x9a\x82\x89\x10\x38\x00\x26\x89\x8d\x79\x80\xc7\x73\x95\xca\xd1\x20\x24\x8a\x0b\xea\x8e\x15\xb7\x67\xba\x1d\x86\x71\xc2\xd1\xd6\x6d\xe6\x71\x63\xe9\x4f\x6c\x18\x8c\x53\x00\xbf\x93\x5f\x99\x65\x19\xaf\xd7\x9d\x35\xc5\x44\x60\x32\xb5\xce\x57\x6e\x66\xdd\xd0\xe0\x62\x22\x96\x18\x01\x74\xbc\x6c\x85\x4e\x33\x18\xeb\x61\x02\x13\xca\xc3\x3b\xcd\x94\x32\x39\xcf\x91\xe7\xcc\x84\xf2\xfd\xe6\x65\x0a\x51\xf3\x34\xb7\x21\xcb\xc9\x9d\x8a\x49\xdf\x50\x3d\xb8\x8d\xd5\x7e\xe1\xf6\x5c\x66\x92\x0a\xa1\x9d\x94\xf0\x95\x98\x46\xd3\x2e\x23\x27\x02\xb9\xe1\x97\x3d\xf0\x63\x7b\xa9\x90\x88\x42\xe6\x4a\xe1\x80\x81\x32\xf0\xbd\xc9\x4c\x36\x93\x56\xf8\xad\x82\xfa\x09\x3e\xae\x89\xc9\x80\xa9\x38\xd4\x26\xf6\x61\xc8\x10\x6e\xcf\xb9\xaa\xfa\xc4\xd3\xc0\x20\xf4\x0d\x87\xb5\xe1\x7e\x68\x53\x5a\x93\xa7\x3d\x83\x24\x41\x1f\xd5\x8c\x37\x1a\x24\x0e\x69\x34\xfc\x65\x1d\x78\x32\xe8\x36\xea\x73\x96\xed\x53\x9b\x1a\xf5\xda\x3e\x49\x82\x41\xfd\xf4\xd8\x9c\x71\x4e\xe9\x60\x54\x34\x32\x50\x61\x1c\x3e\x8c\xd6\x46\xd5\xdf\xa0\x18\xfb\x05\x4f\x90\x78\x2c\xc6\x7d\xed\x6c\xd5\xcd\x46\x63\x97\x78\x89\x0a\xdd\xfc\x1c\x3e\x7a\xe3\x50\x71\x5b\x8f\xd0\xcc\xa4\x3e\x5d\xb1\xeb\x21\x18\x0a\xdd\xa2\x7c\x0d\x72\xc9\x76\x4c\x52\x90\xf8\x91\x49\xae\x58\x6a\xcf\xe1\x8c\x4d\x7c\xe5\x0b\x0b\x06\x44\x00\x5c\x06\x6d\x52\xec\x1f\x13\x27\x5e\xe2\x2b\x6a\xc9\x53\xac\xcf\xd5\xde\x08\x74\xd8\x83\x74\x01\x94\x8b\x73\xfb\xfa\xbe\x36\xe2\x6c\x2f\x50\x3f\xa7\xd3\xe4\x36\x90\x04\x9e\x61\x2e\xaa\x1d\xa9\x4c\xef\x3c\xb5\x5d\x68\xcc\x71\x18\x9b\x9d\xe0\x7c\xb2\xaa\x21\xae\x4d\x28\x74\x3d\x0d\x77\xe0\xf3\xe9\xa5\xe4\x0a\x90\xea\xdb\xb2\x36\x77\xa7\x56\x42\x65\xec\x6a\x8d\x1e\xa1\x7c\xcb\x60\x5f\x02\x74\x82\xeb\x2e\xdd\x9b\x50\x15\x05\x56\xdc\x7b\x03\xf5\x4a\x3d\xf2\xd3\xa9\xcf\x53\xd0\x0f\x3d\x26\x54\xc5\xe8\x1b\x49\x5e\x16\xe7\x8a\x67\x86\x37\xc8\x35\x02\x24\x16\xa3\xd6\xe2\x55\x5c\xbd\xd8\xe8\x83\x87\xdc\xb0\x07\x3a\xa9\x90\x27\xf8\x78\x84\x66\x19\x7c\x05\x62\x4d\x42\x0d\xdc\x04\x4c\x0d\x11\xda\x68\x7e\xc4\x5c\x09\x33\x6a\x5c\x21\xf5\x69\xab\xdf\xe8\x9e\x2e\xd6\xb1\x36\x7b\x7d\xd5\x79\x73\x09\x8b\xb5\x96\x6e\x41\x7f\xd6\xae\x30\x68\xbf\xff\x69\x99\x6b\xbc\x41\xec\x35\x61\x96\x00\x0f\x72\xd5\xf2\xdc\xba\x7b\x25\x3e\xb1\x42\x5c\xfc\xed\x8a\x18\xb4\x69\xd6\x8a\xb5\x89\xe6\xb5\x5e\xf0\x53\xed\xe2\x6f\xee\x8c\x48\x12\x6a\x4a\xf4\xd6\xc7\xb4\x7a\x69\x47\x96\x87\x34\x30\xae\x60\xf9\xd6\xb2\x2d\xb4\x35\x6a\xc3\xa1\xe5\x8c\xb2\xa4\x3b\x12\x6f\x4a\xfe\x71\x7d\x84\x27\x5c\x99\x82\xb9\x23\x28\x9e\x7d\xcb\x23\x09\x8d\xa7\x24\xfa\x95\xb9\x9b\xc2\xc8\x26\xba\x66\xea\xa1\x52\xdf\xe3\xea\xe9\x70\xbf\x7e\xb8\x59\x6e\xad\xe0\x8a\xeb\x20\x09\x43\xd1\x21\x91\xd6\x7d\x92\x67\x48\xa4\x1f\x39\x37\xe9\x78\x39\x15\x55\xdd\x18\x1e\x69\x3b\xdb\x65\xac\x69\xd0\x89\xb0\xde\xa5\xaa\xc7\x3f\x02\x89\x14\x14\x7d\x8e\x87\xe2\xc5\x00\x07\xc7\x74\xa8\x90\x48\x20\x18\x46\x37\x5c\x44\xab\x5c\xa5\x25\xc8\xba\x5f\x17\x94\x48\x10\x86\xc7\x32\x4f\xeb\x65\xfd\x8a\x54\x9b\x83\x9b\x70\xe2\x45\x68\xd1\x3a\xee\xe2\xf6\xbb\x76\x8b\x8d\x13\x16\x99\x75\x61\x2c\xcc\xa6\x0b\x7c\x8e\x50\x63\x9c\x28\x0f\x31\x9c\x0a\x4e\x59\x71\x79\x4c\xf3\x7e\xb6\xdf\xcc\x02\xbb\xf5\x0e\xfe\x8f\xbd\xda\xa3\xb1\x8c\x5b\x2b\xe4\xd4\x58\x3a\xed\x93\x0c\x1f\xd8\x8b\x43\x67\x4e\x75\xee\xaf\xeb\x5b\xcd\x2f\xb6\xbc\xfb\xeb\x68\xea\x28\xd5\xc1\xbd\xc4\x63\x36\x52\xf2\xc8\x3f\x6f\xd2\xea\x94\xf1\x4b\x8f\x55\x08\xb8\xef\x49\x4c\x86\x2c\x57\x8b\xbf\x19\x46\xe3\x7e\xa0\x5c\x61\xc0\xa6\x2c\x8e\xc5\xe3\x75\x80\x81\xfb\x3c\xc0\xc3\xd4\xc6\x49\x6f\x01\x7a\x05\x10\xc3\xae\x81\x1f\x83\x21\xf4\xae\xcb\xf3\x88\x53\x00\x38\xf5\xbd\xd0\xeb\x06\xaf\x86\x03\x75\x56\x2f\xa7\x36\xaf\xd4\x3c\x08\xbf\x34\x1b\xc8\x40\xce\x76\xf0\xd0\x54\x6a\x74\x51\xaa\xb3\xb8\x81\x77\x77\x87\x90\x4b\x0c\x60\x63\x6d\x5c\x5a\x94\xf3\xf6\x50\xe4\xa1\xf2\xb0\x5c\xd0\xe2\x08\x8b\x12\x8d\x8c\xef\x44\x33\x80\x47\x71\x18\x88\x16\x14\xfb\xbd\xc9\xcf\x23\x19\xd2\x41\xd2\xca\xae\xf3\xef\x02\x91\xd7\x77\x89\xc3\x18\x1f\xf3\x85\x57\x5b\xa8\xa0\x7c\x6f\xbf\x6c\x0c\x34\x72\xc0\x93\xb4\x9c\xaa\x68\xe3\x8c\x46\x61\x87\xa0\x69\xd9\x8c\xdd\x1d\x98\xa4\xaa\xe3\xd0\x9a\xef\xf6\x56\x60\x6f\x2a\xbd\x6b\x2f\x49\x42\x8e\x8a\x31\xe7\xbc\xe2\x1a\x90\xf1\xec\x39\xcd\xa7\xb5\xf2\x81\xf3\x38\x14\x76\xc7\xdb\xf3\xea\xad\xf9\x7a\x66\x12\x0e\xcc\x6f\xce\xb5\x87\x96\x1e\xc6\xd3\x27\x23\xb1\x5c\xf8\xbe\xa3\x43\x68\x56\xce\x26\xeb\xef\x99\x5c\x84\x31\x5a\x99\xb3\x87\x87\xf5\xe2\xb0\x58\x3f\x3e\x3e\x3f\xad\xf6\x7f\xb6\xcd\x9c\x60\x49\xb9\x35\x8c\x2d\xdb\xc6\xf5\x3a\x9b\x7c\x07\x19\x29\xac\x2c\xbc\xe5\x6f\xf0\xcf\xad\x2b\xb1\xe0\x92\x51\x0c\x82\x2e\x5e\xa1\xaa\x0d\xda\x62\x34\xb3\xc1\xd3\x68\x51\xf0\x2c\x33\x05\x83\xfb\x96\xd4\xa9\x59\xed\xee\x46\x10\x02\xa6\x56\x11\xf9\x5c\xad\xf5\x4e\xbe\xc2\xb8\x12\x82\x83\xf4\x91\x04\xa3\x46\x59\x7e\x74\x30\xfc\x42\xfb\xed\x3d\x20\x40\xb4\xfd\xc3\xea\x71\xb5\x47\xc8\xc2\xf3\x6e\xb9\x75\xad\x1a\x62\xe1\xcc\xbb\xc5\xc3\xb0\x8e\xd6\x74\x11\x84\x46\xe8\x6e\xcd\x53\x35\xc3\xb9\xfd\xd5\x12\x10\x84\x1b\x58\xb9\x11\x4a\x7f\x4c\xb1\x54\xf7\xe6\x5c\xf6\x8b\x2e\x84\xaf\xfc\x48\x74\x34\x1b\x33\xb7\xe8\x44\x20\x13\xcf\x08\x91\x61\x32\x60\x0b\x0a\x8e\xa7\xeb\x62\x8c\xe6\xe0\xc2\xf4\xa6\xe0\xb5\x7c\xed\x2c\xb1\xca\x91\x42\x4d\xc9\x91\x5f\x6f\x8f\x82\x52\x0f\xb3\x3a\xe6\xc3\x3f\x20\xef\x5b\xe1\x84\x9a\xbc\x2b\xc8\x82\xbb\x2a\x8a\x02\xeb\xcc\xdd\x17\x99\x1a\xeb\xd7\x80\x08\x7d\x1f\x17\x41\xaa\x9c\x1d\x20\xc2\xd8\x0b\x7a\x49\xec\x89\x2d\x53\x84\x8c\xe2\xbb\xcf\xee\xa6\x90\x5a\xfd\xcd\x4c\x44\x54\x63\x25\xea\x66\xfd\x34\x6b\x63\xab\x7d\x81\x3e\xd7\x2f\x34\x25\x5c\xca\x0a\xf8\x55\x23\x6d\x47\x10\xb1\xcf\xb0\x9a\x21\x55\x90\xd7\xa9\xbe\xb4\x7f\xe7\x02\x7f\x01\xeb\x59\x57\x47\xfe\x02\xab\xfc\x74\xfe\x12\x92\xf0\x3f\xff\xb2\xa5\x2d\xed\xc1\x2a\x62\x01\xc2\xd0\xa8\x62\x78\xae\xbc\x87\x12\x54\x2f\xc8\x6d\xbb\x31\xce\xb8\x71\x4a\x31\x04\xb0\xba\x19\x8d\x0a\x13\x49\x60\x35\x15\x24\x3c\x9e\xb3\x3a\x3d\x65\xe9\x88\xf6\x1c\x44\xe2\xfb\x08\xe0\xec\xb8\xdb\x10\x87\x7b\x57\xf0\x6c\x0b\x5c\xbe\xb6\xbe\xb6\x48\xa2\x00\x4d\xbd\x63\x9a\xd7\x83\x64\xac\x10\xb1\x06\xc4\x40\xdd\x94\xfc\xa5\x9b\xab\x82\xfb\x08\x4c\xb9\x5f\x3f\x6f\x1f\xfe\x3c\xfc\x31\x7b\x78\x5e\x1e\x6e\x96\x8b\xd9\x9f\x87\xed\x6c\xbf\x6c\xbb\x29\x5f\x0c\x38\xd5\x6e\xcf\xb9\xfc\x3e\x8e\x27\xa4\x4f\x7a\xa2\x6d\x8b\xe2\x74\x29\x91\x4c\x79\xa4\x17\xff\x45\x9a\xf7\x6f\xc4\x67\x84\x0c\x8d\x1c\xcd\x01\x83\x7a\x79\xcf\xb7\x12\x32\xe6\x8e\x77\xce\xaa\x86\x5a\x22\xcc\x96\x85\x14\x84\x54\x34\xb6\x51\xf3\x55\x35\x3f\x5f\xba\x90\x9f\x50\x0a\xb0\x84\xb2\xb7\x44\xbf\x3d\xee\x84\xd2\x1a\x01\xe7\x07\x2c\x6e\x7c\x38\xcb\xf1\xfc\x07\x8f\x49\xed\x92\x1a\x77\xfc\x78\x37\x10\x16\x01\x01\xd4\x43\x3b\xc1\x9c\x46\x9b\x12\x34\x94\x88\x3e\x68\x8e\x8e\x6f\xb9\x8b\x40\x80\x32\xb2\x82\x1f\x37\x29\x3f\x16\x6d\x0d\x9b\xd0\x09\xc3\xe0\xd4\x26\x7d\x79\xb9\xf4\x92\x09\x92\x04\x14\x73\x20\x60\x2b\x1f\x73\x95\x75\x2f\x2f\x89\x52\x88\x68\x77\x5a\x17\x83\x1f\x93\x9e\xa7\x11\x64\x37\x9b\x2f\x06\x5b\xfa\x5f\x25\xf2\xdc\xe5\x81\xd7\xa9\xce\xec\xbb\x94\xa8\xf4\x78\x90\x58\x7f\x6f\xde\xbd\x83\xf4\x59\xe2\xe2\xb6\x5b\x0b\x43\xaf\xa6\x4e\x7b\xe9\x8b\x08\xcb\x41\x05\xe8\xa2\x04\xcb\x59\x3d\x7a\xf6\x20\x64\x78\xd4\xda\x4c\xf2\x0e\xc5\x06\xaf\xa1\x7c\xae\x37\x93\x4e\x42\xfd\x60\xe4\x69\x1b\xa7\xaa\xdb\x04\x64\xd0\x98\xfa\x7d\xd1\x4b\x23\xfd\xf1\xc5\x9b\x07\xe0\x3b\x42\x95\x87\x87\x3f\x8c\xdc\x8d\x9f\x0c\xa2\x53\x32\xd0\xd2\x18\x96\x59\x51\x41\xe7\xc8\x0d\x6f\x44\x99\xe4\x61\x2b\x26\x0a\xa5\x23\xb8\xff\x42\xc4\x0d\x24\x15\x12\x74\x2f\x3a\xd2\x96\x0e\xcd\xcf\xa3\x69\x2a\x43\x45\xe2\xa8\xa7\xe2\xf6\x8c\x18\x6b\x50\xb3\x5c\x3d\xe7\x36\x3a\xa7\x86\x38\x04\x77\xa5\x36\x22\x0e\xfc\xac\x46\xca\xfd\x20\xa3\x50\xa0\x07\xde\xd5\x06\x3c\xf2\x34\xff\x23\xe5\x5b\xc8\xf8\xe5\xaa\xb3\x0c\x59\x4f\xaf\xe0\x91\xbf\x59\xeb\x61\x10\xae\x92\x51\x62\xd4\x27\xe7\xf3\xfd\xa2\xbf\x94\x64\xa4\x42\x2c\x18\x39\x36\xfb\x29\x56\x32\x7d\x91\xf3\xbc\x3e\x33\x65\x4c\x48\xd4\xc1\x45\x5e\x4b\x80\x7e\xea\x43\xc6\x9e\x40\x1c\xe8\x43\x61\x14\x31\x2d\xfe\xf4\x6f\x19\xb3\x32\x66\xa6\xa0\x5d\x9c\x2f\x87\xe5\xa7\x7c\x7d\x39\x88\xa2\x78\x1b\xc7\x34\xfe\x12\xfc\x23\x63\xcd\x0d\xe0\xee\x7a\x4c\x18\x49\x9c\xbc\xd1\x63\x91\xd7\xaf\xee\xc4\x18\x7d\x65\xa6\x0c\x4c\x6a\xb1\x5d\xff\xbc\xd9\xcd\x1e\x96\x87\xfd\x6c\x7b\xb7\xdc\xbb\xdb\x70\xcb\x21\xbc\xd8\xec\x06\x23\xcb\x23\xa5\x7b\x1e\xdc\x1f\x69\xde\xc6\x31\xa4\xf0\x29\xae\x16\x3c\xca\x6e\xfa\xd9\x42\xd7\x81\x1a\xbd\xa9\xbb\xed\x72\x3f\xb8\xab\x88\x09\xf2\xc8\x9c\x2b\x98\x55\xcd\x36\x55\xb6\x9a\x75\x20\x65\xe0\x21\x97\x21\xa2\xf7\x5b\x6a\xaa\xe6\xef\x02\x57\x13\xcf\x32\x43\xf4\x7a\x2e\xbb\x67\x51\x7e\x6c\xaa\xff\x40\xd7\x2c\x1a\xbd\xbc\x62\x2c\x36\x5c\x58\x9f\x58\x30\x3b\x9a\x7e\xe0\x81\x11\x4a\xb7\x89\xc7\xdd\xeb\x59\xeb\xfe\xf6\x08\x3e\xc1\x12\x28\x4b\x7b\xe3\x82\x14\xa8\x55\x7c\x5d\x34\x2d\x41\x45\xf8\x76\x5c\xa9\x4d\x09\x2a\x1d\xf0\x41\x4e\x27\x2f\xaf\xbe\xff\xf0\x09\x75\xcc\x6c\x76\xe0\x0d\xbe\x0a\xd2\x0e\x2c\x2a\xa9\x45\x60\x22\x87\xd2\x64\x8e\x43\xa7\x62\x6d\xda\x15\xf1\x01\x19\x25\xfe\xb7\x48\xf3\xbb\xb2\x38\x0f\xf9\x69\x41\x11\x0a\x46\x15\xba\x6c\xb6\x0c\xf4\xb0\x83\xf6\x5a\xe9\xc5\xcd\x31\x7f\x5b\x14\x6a\xc7\x35\xd4\x17\x03\xdf\x72\xcd\x5a\x5a\xce\x39\x83\x01\xc5\x14\xe3\x54\x1d\x8d\xf2\x3c\x16\xb8\xad\xa7\x04\xd8\x75\x25\x60\x2a\x08\x3c\x9c\x77\x38\xe3\x11\xa0\x6e\x19\x3e\xf9\x67\xdb\x45\xc7\x86\x2d\x91\x1f\x61\x7b\x2d\x83\x02\x8a\x86\x92\x33\x77\xda\x23\x4f\xbc\x75\xc6\xda\xfd\x5c\xd1\xd8\xb3\xe0\xe7\xfd\xec\xe1\xf0\xb8\x7a\xba\x31\x11\xa3\xc3\xee\x79\xb3\x79\x70\x0e\x95\x0a\x09\x0f\x7c\x4b\x12\xf6\x32\x00\x55\xd8\x0e\x51\x68\xb4\xcb\x5c\x89\x6d\xef\x4d\x62\xcf\x37\xa5\x8a\x43\x2d\x00\x4c\x94\xb6\x7d\x7c\xdf\x8b\xfb\x34\x7c\x8f\x69\x9e\x1e\xcf\xc7\x3d\x7c\xd6\x4e\xac\x7a\xf4\x8b\x31\x70\x87\x4f\x9f\x99\x58\xf3\x30\x98\x62\xbb\xb1\x30\xc6\xe8\x5a\x85\xe1\xa0\xbe\x16\xcc\x24\xce\x52\x25\xbe\x11\x67\x9f\xa9\x12\x72\x9e\xa5\xf9\x5f\xd9\xee\x8a\x13\x40\xbe\x58\xe0\x25\xb2\x38\x21\x5b\x1e\x7e\xab\xb5\x5e\x40\x96\x4d\x13\x5a\xa3\x60\x57\x62\x78\x88\x4c\xe0\x75\xf4\xe0\xdc\xf7\xb1\xd8\xa3\x68\xbe\xfd\xa6\x39\x8b\xb7\x20\x11\x89\xdd\x8f\x2d\x2b\x1e\x05\x58\x5e\x2c\xc0\xd0\xcc\x1d\xdc\x90\x0a\x2f\xa6\x41\x57\xe5\xc0\xaf\x02\xb5\x4a\xc4\x26\x02\xbe\x58\x1f\x6e\xd7\xcf\x4f\x37\xcb\xed\x61\xb3\xde\xee\x57\xeb\xa7\xf6\x1e\x49\xd8\x23\x3b\xfd\xe7\x34\x7d\x77\xd3\x0d\x1c\x50\x79\x53\xc2\x31\x6d\xd3\xcb\x4a\xa8\x18\x8b\xb6\xf0\x70\xdf\xf0\xba\xd9\x2b\x06\xbe\x97\x12\x10\x78\x6a\xa0\xdf\xdc\xaf\x46\x53\x32\x89\xa2\x36\xa0\x31\x59\x28\xaf\x64\x62\x84\xa9\x56\xb9\x2a\xca\x6a\x50\x9d\xa1\xa4\x0e\x09\xc7\x7d\x23\xcd\x6f\x66\x0e\xaf\xaa\x94\x67\x14\xea\x54\x01\xd5\xa6\x2c\x0a\x8d\xd5\x84\xd3\x5f\x79\x8c\xba\xb4\xb7\x00\x1a\x7b\xb8\xf8\x8a\x7d\xb1\xcb\x00\xc6\xfb\x87\x0e\x09\x7a\xf9\xf3\x3b\xaf\xff\x44\x40\x48\x0c\x3d\x1d\x98\x5d\x9a\xbf\x64\x2d\x87\x69\xb3\xb8\x07\xb7\x01\x92\xc4\xa1\x5d\xc2\x8f\x97\xc5\xb5\xbf\xe6\xba\x89\x30\x34\xc9\x44\x8b\x87\xa9\xfa\x35\xb0\x40\x54\x82\x3f\x6a\x11\x87\x6e\xd9\x81\x47\x3d\x44\x62\x6f\xb6\xeb\xdd\x7d\xf7\x47\xaa\xf4\x20\xb5\xb9\x03\x50\xb3\xea\x36\xfd\x04\x85\x01\xe7\xdb\xa2\xb4\xfc\xbd\xc3\xa7\xf0\x98\x49\x46\x63\x9e\xa3\x59\x00\x2b\xf5\xb9\xd6\x57\x8c\x9a\x00\x9e\x0c\xd1\x28\x2d\x72\xb8\x2f\xce\x25\xba\x76\x63\x4f\x16\x3c\x88\x91\x9f\xa1\x2d\xe3\x9a\x9f\xcb\xe1\xd9\x0f\x9e\x0e\x75\xd2\x71\xce\xa8\x9f\x69\x6e\x8a\x7f\xc7\x89\x63\xf0\xa9\xef\x19\xa6\xeb\x5e\xd4\xb8\x6d\x0b\x63\xe2\x1c\xa7\x7a\x7c\xa1\x94\x68\xc1\x18\xc4\xc1\xf2\x1d\xca\x4b\xfd\xda\x1d\x8d\x10\x44\xb1\x87\x12\xdf\x5c\x1d\xd3\xbc\x55\xaf\xbd\xbd\xda\x8d\x21\x48\x7c\xd9\xc3\xd8\x7c\x1f\xe9\x87\x40\x52\x53\x6d\xd2\xac\x06\xb4\xca\x3a\x4b\x00\xa8\xcf\x90\x70\xf4\x71\xf6\xeb\x70\xfb\xfc\x74\x73\x98\xed\x76\xcb\xfd\xae\x6d\x0e\x63\xdd\xc6\xa7\xf3\x36\x98\xd0\x6c\x4c\x98\xcf\x1b\xcc\x64\x08\x23\x81\x39\x81\x9a\xbf\x41\x71\x1e\x9d\xe5\x10\x26\x12\x9d\x38\xdc\x86\x5a\x0e\xf2\xc9\x87\x77\x99\x19\x88\x24\x18\x35\xf1\xed\x12\x2d\xad\xe5\xfe\xfe\xb0\x7a\x3a\xfc\x5c\xae\x0e\xb3\xc5\x62\xb9\xd9\x2f\x6f\x9a\xa3\xc6\x3d\x6e\xcc\x42\x24\xc9\x69\xf5\x22\x51\xc8\xf3\x5b\xa8\xa4\xbd\x92\x31\x0f\x2d\xa2\x43\x55\xf3\x7c\x18\xc0\x62\x5d\x21\x71\xcf\xc2\xb8\x56\x32\xe8\xb6\x52\x48\x08\x03\xd5\xf3\x47\x53\x09\x8b\x73\xf9\x0e\x3b\xa8\x6b\xa4\xe7\xfb\xc2\xd6\x9d\xb6\x7d\x21\xf1\x03\x7c\xad\xfe\xc1\x3c\x3c\x02\x20\xa1\x86\x4e\xb0\x85\x29\x5d\xfd\x44\xff\xf1\x42\x1d\xd9\xe0\xb8\xa8\x2f\x72\xa2\x50\x0c\x92\xd8\x47\x71\x21\x55\x9c\xaf\x8a\xe9\x41\x78\x31\x18\x01\x5f\x7e\xae\x5f\x8b\x32\xfd\x0f\x20\x81\xbd\x61\xd3\xba\x5a\xa3\x82\x6a\xb4\x4d\x66\xbb\xbd\x83\x29\x82\x10\x81\x0d\x22\x39\xea\xcc\x9f\xe9\x28\x92\x07\x92\x00\x82\x09\xca\xbe\x9f\x33\x1a\x1a\xe5\xc5\x51\xec\x84\x73\x1f\xd2\xaa\x76\x75\xad\xa3\x67\x50\x9e\x81\x06\xc2\x67\x0d\x79\xe5\x4a\xc4\x5c\x63\x62\xe0\x4d\x1b\xa7\x41\xde\x78\x6b\xae\xcc\x63\x74\x23\x88\xa5\x24\x9d\x9c\xcc\x6d\xca\xbf\x97\x60\x04\xd0\x89\x0a\xc3\x81\x24\xe2\x4a\x21\x96\x63\x48\x43\x65\x7a\x6b\xe2\xc5\x7a\x98\xd4\x70\xa1\x5a\x4d\x42\x1d\x85\x3d\x59\xd5\xd5\x49\x57\x03\x11\xe0\x5e\x0a\x4c\x13\xd0\x78\xaa\x58\xb9\x74\xe0\xc7\x4d\x51\x64\xab\xbc\x99\xdf\xa3\x9d\x49\x13\xad\x44\x5b\x11\xf2\x50\xf0\x7c\x9d\xcf\xe1\x95\x67\x7a\xad\xb7\x20\xcf\x65\x75\x5d\xb2\xfc\xad\xe9\xa3\x3d\xe6\xf9\x76\x82\xe1\x7c\x5f\xc9\xeb\xe2\xc5\x6f\xa7\xbc\xf6\x3d\xa9\xfc\x4e\x31\x83\x5f\x4f\x2b\xed\xfb\x1c\x11\x3c\x18\xf9\x9b\xa5\xe5\x4d\x59\x9c\xfe\x66\x9e\x4a\xfb\x71\x82\x95\xa6\x6e\x03\xbf\x05\xf8\x36\x7d\xa3\x03\x4e\x50\x7e\x60\xb3\xd9\x2c\xfe\xc6\xfd\x03\x99\x60\x1a\xf3\xc6\x58\xb9\x8d\xd7\x3f\x7a\x7a\x4a\x13\x0c\xcb\xef\xce\xaa\xa8\xce\xb2\xe5\xdf\xd2\x34\x01\x08\xba\x09\xd6\x86\x27\x75\x48\x63\x65\x57\x5d\x76\x70\xd4\x7a\xfd\x3c\xb3\x0e\x43\x19\x5b\xe4\xe3\x9c\x67\x59\x51\xaf\xf5\xce\x58\xaa\xae\x03\xa7\x49\x07\xfb\xb3\xca\xdb\x69\x91\x3f\xe7\x69\x1d\x75\x9d\xa4\x30\x52\xf0\xa2\xd5\x41\xb5\x99\xae\x2d\x1e\x5d\x13\x6a\xdc\x93\x76\xa9\x0e\x85\x46\x10\xde\xb3\x0d\x18\xa1\x08\x5f\x2f\x94\xa6\x23\xa6\x10\xc4\xd1\xf8\x1d\xb7\x69\xde\xac\xbd\x2f\x95\xbe\x47\x1f\x24\xd2\x26\x1a\x85\x21\xc3\x1e\x0f\x94\xe7\xee\x1d\x7b\x89\xb0\x0b\xe9\xf7\x33\x2f\x6b\x28\x2d\x4d\xe7\xf0\x3e\xb1\xcf\x11\x89\xd3\xa3\xdd\x1c\xf3\xf4\xe8\x38\x00\x21\x3a\x92\x82\x2b\xa1\xc1\xa6\x87\x46\xf3\xe1\x06\xde\xab\x81\x32\x03\xe8\x58\x29\x34\x1c\xef\xa0\x9e\x43\xbd\xfa\x6a\x82\x31\x22\x84\xcd\x52\xdd\xf0\x9a\x1f\xbc\xf6\x45\x58\x62\x52\x06\x86\x8a\xe2\x4b\x46\x10\xcd\x20\x08\x6d\xf8\x02\x9d\xc8\xcb\xf3\xf6\x61\x10\x20\xd3\x09\x91\xb8\xce\xf1\x4e\x06\x6c\xd3\x83\x3a\xe8\x24\x88\xd0\xf3\xba\x83\xfa\x06\xef\xb0\x85\xf7\xe2\xad\x71\xd3\xfb\x67\xfd\x00\x69\xac\x13\x9a\x60\xcc\x7c\x31\x9b\x17\x9f\x7d\xf3\x54\x27\x94\xa3\x33\x63\xe6\xda\x3e\xf4\x82\x63\x4f\x2c\x60\x3a\x18\xab\x13\x69\x18\x55\x6d\x92\x67\xca\xd5\xd5\x3c\xb4\x70\xa7\x6a\xf0\x7b\x3c\x54\x08\xfa\xd8\xa4\xf9\xcb\x86\xb7\x80\x03\x2d\x92\x30\xb0\x76\x2f\x0e\x6c\xe0\x0f\x07\x45\x06\x26\xc3\x67\x75\x53\xb2\x62\x1c\xb4\xd5\x10\x30\x8f\xb5\x6f\xb2\x3e\x41\x3e\xcb\xd5\x43\xbf\xfe\x7d\xd4\x9f\x19\xe5\xb4\xc7\x4b\x73\x82\xa4\xe7\x63\x63\x00\x34\x86\xde\xf0\x3d\x80\x47\x98\x16\xd0\x00\x26\xbb\x59\xf3\x6c\x51\x54\x8d\x4d\x6c\x69\x06\xbe\x1d\x2c\x4d\x48\x24\xfa\x45\x4b\xa6\xca\x29\x85\x92\xfe\xb0\x1d\x3c\x1a\xf0\xc0\xe9\x07\xa4\x9f\x90\x35\xee\x30\xd6\x9d\x4c\x2a\x4c\x69\xe2\x29\x81\x19\x63\x8e\x24\x76\xab\x1a\x8e\x86\x0e\xd7\x50\xca\x0c\x7f\xdd\xe7\x8a\xf4\xf1\x7b\xab\x5c\x17\xcd\x00\xef\x4b\x2e\xdf\x5a\xb3\x56\x13\x5f\x02\x9a\xbd\x5b\xae\x79\xcd\xcb\xf6\xcf\x2a\x44\x98\x88\xb2\xf9\xbf\x11\xf0\x46\x93\x20\x36\x2e\xc0\xae\x38\xf2\xe6\xfc\xf8\xea\x04\xfa\x6e\x9b\xd0\x84\x06\x12\xd3\xd8\x4f\x50\xbf\x95\x45\xde\xde\x9d\x6a\x25\x2c\x01\x16\x86\x33\xaa\x1e\x8b\x06\xfb\xe2\x5e\xa1\x67\x52\x6b\xf3\x8c\xe7\x6f\x0b\x9e\xbf\xf3\xca\xdd\x2e\x8c\x4d\x92\x75\xb7\x5c\x3c\x6f\x97\xeb\xe7\xed\x6e\x71\xbf\x5e\x3f\xec\xfe\xf2\xa8\xd0\x24\x64\xbe\xb0\xba\x01\xcb\x53\x5a\x15\x0a\xb0\xf4\xf3\xab\x5d\x70\x74\xad\x0e\xed\x86\x7f\x57\x64\x58\x59\x3f\x51\x79\xaa\x49\x28\x34\x7e\xd7\x6d\xe3\x9c\x1f\xfc\x83\x33\xa7\x7b\xa5\x19\x9a\x84\x4a\x62\xc5\xe1\xb1\x50\xbf\x7e\x0c\xdf\x3c\xf2\xa8\x4b\xc6\x37\x93\xa2\xad\x52\xd6\x24\x4a\x38\x04\x1d\x8f\x30\xcf\xc0\xc6\x5b\x46\x77\x88\x39\xf3\xac\x2b\xd8\x46\x61\x86\x3d\x18\x25\xc4\x70\x3e\xbd\x16\x59\x2f\xc0\xa6\x49\x42\x3c\x44\x8a\x1e\x5e\xf8\x69\xad\x17\x67\x01\xbb\x1e\x0b\xed\xf0\x2e\x49\x44\x22\x74\x18\x8a\x2c\x33\x40\xec\xbf\x77\xa0\x68\xc2\x3d\x8a\xfc\x7a\xc6\xe2\x70\xac\xed\x65\x71\x1c\xd0\x04\xb8\xce\x01\xa1\x91\x5d\x59\xeb\x73\xdd\xa3\x16\xd1\x84\x2b\x2f\x72\xea\x9f\xce\xbe\x58\x97\x4f\x45\x79\x1c\x51\x85\x68\xc2\xc1\x1c\x3e\x2f\x50\xa7\x15\x2a\x87\xf4\x4d\x47\x4d\x84\x1f\x20\xb8\xc8\xfe\x75\x5f\xec\xea\x72\xdc\x85\x1a\x0e\x11\x3c\x07\xfd\x65\xde\x7d\x1a\x41\x95\xc3\x41\xbf\xcd\x2a\xab\x68\x37\x7a\x00\x11\x52\x27\x2d\xbd\xfe\x00\xe5\xe8\x86\x46\xbd\x94\x90\xee\xfc\x6b\xf5\x3f\xeb\x7e\x51\xaf\xe7\x62\xaf\x53\x1b\xa2\x26\x4a\xf9\xd4\xf2\x96\x2d\xf8\xa9\x9f\x5a\x6d\xda\x14\x82\xac\x80\x97\xd9\x45\x74\x2c\x96\x9a\x80\x1f\x24\xc2\x61\xb0\x07\x84\xaa\xb6\x83\x0e\x7d\x3c\x32\x5f\x0b\x95\x19\xa1\x9d\xbf\xb0\x31\xcd\x75\x9e\x47\x4c\xe5\xda\xde\x14\xa1\xa1\x65\xe3\x7e\xd5\xf3\xc2\xd0\x48\xc0\x66\xc0\xcb\x11\xf5\x84\x35\x08\xb4\xe7\x81\x87\x08\x8e\xac\x78\x69\x93\xba\xdf\x3a\x98\xcd\x25\x61\x68\x4e\x2d\x44\x32\xf6\xf8\x3a\x9b\x36\x8d\x04\x37\xf7\x67\x91\xa6\x4f\x50\x7f\x14\xe5\xdb\x60\x94\x3c\x3f\x0c\x22\xd2\x4e\xce\x9f\xce\xd9\x19\x79\x27\xda\xf3\xb9\xd9\x10\xb6\x00\xcd\x77\xca\xe5\xe5\xb1\x4d\xc0\x68\x2f\x88\x62\xc7\x6d\xfb\xc0\xf3\x97\x33\x7f\x69\x2b\x71\xdb\x57\xa3\x9e\x4f\xed\x42\x35\x11\x92\x7d\xd1\x53\x70\x63\xae\x17\x27\x08\x04\x5f\xcc\x57\xfd\x74\x44\xd3\xa0\x64\x6c\x59\x55\xd2\xfc\xc5\xb0\xc3\x0e\xbf\x9b\x17\xca\x10\x01\x39\x46\x27\x62\x5b\x14\xc7\xf9\xa5\xf9\xdf\x51\x82\x5f\x7b\x31\x89\x8c\xa0\x44\xc9\x6d\xe1\x48\x3b\x20\x2c\x88\x69\x9f\x23\xb8\x17\xa4\xd2\x1e\x03\x8a\xa1\x2e\x8d\x6a\x3b\x7d\x95\xe1\xbf\x2c\x98\x6c\xbd\xe4\xe6\x2e\x09\x3a\xf1\x06\xb1\x35\x20\xc6\xb2\x3d\x92\xc8\x43\x4b\xb9\xf1\x3c\x4e\x70\xc5\xf9\xe7\x7a\xc5\x09\x72\x11\x65\xa9\x84\xbc\x82\x3d\x94\xc7\x61\x91\x91\xf6\x12\x19\x18\x7d\x45\xc4\x54\x20\x0b\x9f\x9a\xcc\x72\x4c\x57\x9b\x6a\x8f\x2b\x8a\xf3\xe3\x66\xb6\xd9\x20\xa0\x68\xf0\x51\x84\x06\xb4\x4e\x8f\x86\x0b\xb2\x5d\xe6\x03\x48\xb5\xf6\x20\x8c\xa2\x0e\xeb\x34\x06\x90\x8f\xe6\x33\xc4\x80\x92\xe5\xbd\x18\xc0\xfc\x5c\xe6\xd3\x31\x00\xed\x01\x53\xe8\x0a\x64\xbc\x32\xc5\x27\x07\xee\xd9\x2c\x88\xf6\x89\x1f\x62\xd1\xb3\x70\x95\x38\x36\xfe\xee\x9a\x85\xd6\xd6\xd2\xd8\x9d\xf8\x47\xde\xd5\x40\x8c\x0d\x18\xdf\x23\x21\x26\x32\x0c\x2f\xdb\xb2\x1e\x16\xca\x68\xdf\x27\x7e\x60\x6b\xd6\xee\xca\x54\x31\xf7\x13\x3e\x03\xaf\xf9\x46\xcf\x8b\x99\x0b\x5f\x6a\xdf\x4f\xdc\x5c\xae\x77\x35\x9c\xae\x81\x39\xda\xf7\x05\x43\x02\x94\x09\x8a\xd8\x6f\xf7\x20\x3f\x08\x0c\xea\x7c\xbb\x7c\x58\xce\x76\xcb\xc3\xfe\x7e\xbb\xdc\xdd\xaf\x1f\x6e\xdc\x8f\x07\xc2\xd8\x6e\xff\x3e\x17\x35\x1f\x05\x21\xb5\x4f\x45\x1c\xf7\x23\xfe\x4f\xf0\xd1\xe3\x48\xf8\xc7\xb8\xb3\x21\xa0\x5f\xee\x16\xf3\x8e\x27\xee\xef\xa4\x4b\xb5\x1f\xc6\x01\x5a\xd5\x6d\xe8\xf4\xbe\x38\x57\xb0\x38\xd7\x13\x30\x02\xed\x47\xa1\xc2\xc0\x52\xf3\x21\xbf\x65\x2b\xd2\x7e\x04\x14\xa3\xf5\x6d\xe0\xa6\x3d\x40\x7d\x46\x15\xb2\x0e\xdc\xa4\x95\xe4\x65\x5f\x11\x45\xfb\x2c\x51\xcc\x4a\x20\xfd\xd6\x33\xa9\x47\x99\xbb\xef\x8f\x7a\x3f\xe1\x26\x1e\x0c\xc7\xb4\xfe\x59\x94\x6f\x5f\xb9\x9e\xae\xbb\xf2\xdd\xf1\xf7\x04\xe9\xcb\xab\x28\xce\xa5\x61\x94\xfa\x02\xb8\xaa\x7d\x9e\x78\x58\xd8\x66\xcb\x78\xab\xe6\x05\xad\x49\xf1\x38\x12\xb0\xd4\xbe\x20\x14\x0b\x1d\x24\xcf\xb2\x79\x2d\x7f\xa6\xf5\xeb\xae\x96\xd7\x01\xbc\x6f\xb2\x9e\x53\xfd\x06\x31\x4b\xf7\x53\xb1\x32\x2e\x03\x3a\x7f\x77\x50\xf7\x28\xa6\xbe\x78\x7b\x21\x84\xea\xc8\xf5\x5c\xee\x73\xd4\x47\x79\x4e\x6d\xed\x26\xad\xb8\xe5\x73\xbf\xd2\xaf\xd0\xbe\x0c\x19\x9e\xae\x87\xc6\x6b\x78\xcb\x3b\x9e\x05\xed\x4b\x99\x20\xa0\xe8\x71\xf6\xeb\x30\x5b\x6d\x6f\xb6\xeb\xcd\x00\x72\xae\x7d\x45\xa9\x0c\x5a\x07\xf7\x78\xba\x2d\xca\xa9\x99\xec\x7a\x87\xa6\x36\xd3\x78\x6d\x37\x57\xe9\x46\x1b\x76\x1b\x4d\x4b\xc5\x62\x42\x9c\x9d\x2a\xcf\xbd\x1c\x87\xf6\x95\x12\x61\xcf\xdf\x7a\xce\xb5\x29\xdf\x1b\xfd\x2e\x44\xb8\x5b\x15\x1f\x79\xd5\x03\x6f\x0e\x42\x35\xda\x07\x9f\x58\x76\xc8\x0a\x6a\x5b\xe9\x69\xc0\x12\xc3\xbb\x41\xa0\x5d\x58\xa0\xf5\xb2\xee\xa1\x4c\xc7\x11\x4e\xed\x43\x1c\xa0\xbf\xbd\x7a\x5a\xed\x57\xb3\x87\xbb\xd9\xee\x76\xbd\x5d\x6f\x67\x8b\x87\xd5\x3f\x97\x3f\xda\x4e\x12\x61\x1f\xab\xc7\x9b\xe5\x2f\x14\xf5\x68\x6d\x1b\xd6\x96\x05\xfd\x0f\xfd\x97\xeb\x9e\x84\x18\x72\x3a\x0b\x3c\x11\x5c\xf8\x56\xfb\xda\x37\xa0\x29\xeb\xa7\x1f\x4e\xa8\xbc\x7d\x38\x57\xad\xb4\xb8\xf6\x75\x62\x48\xcc\x75\x51\x6a\x48\x6b\xeb\x66\x0d\x5f\x4f\x73\x2f\xb2\xfa\xae\xd6\xc6\xbb\x85\x69\x1a\x40\xed\x6b\x65\x74\xdd\xdf\x53\xf8\xf8\xa3\xa8\x5d\xca\x57\x07\x24\x08\x91\x52\x9a\x1b\x15\xf4\x05\xcf\x91\x0b\x70\x40\xdd\xac\x03\xc2\x18\xae\x32\x1b\x29\xdc\x82\x02\x38\xce\x6e\xf7\xbf\xf9\xae\x87\x27\xb4\x15\x5a\x44\xb8\xdb\x0e\x4b\x87\xcf\x25\xcc\x72\xf5\x08\xf5\x6b\x71\x0d\x85\xe9\x02\xae\x3a\x68\x8e\x0b\xab\x5c\x67\xb5\x25\x3a\x5b\x3c\xf0\x03\xe5\xc0\xf6\x9b\xac\xa8\x7b\x30\x7b\x1d\xf8\x91\xa9\x63\x4b\xab\xf5\x88\xbd\x48\x07\x41\x10\x21\xe5\xf9\xc9\x68\x6d\x57\xf3\xcb\x1c\x72\x30\xec\xc0\xe3\xae\xb1\x51\x48\x56\xf0\x6e\x8a\xdd\x6c\xf5\x90\x6b\x66\x82\x99\x30\x08\xbc\xad\xd5\x17\x5b\x5d\x10\x24\x5a\xd2\xde\x74\x43\xb6\xb0\x41\xc5\x83\x0e\x02\x6d\x18\x95\x04\xd4\x1e\x21\xe4\x40\x88\x07\x8e\x37\x5f\x07\x34\x08\x19\x73\x8a\x31\xd3\x93\xcb\x66\x55\xfc\x8e\x9f\xd5\x4d\xb8\x80\x2a\xc0\xb0\x6f\x56\xd4\x75\xd1\x27\xe4\xd7\x41\x28\x4c\xa6\xef\x30\x10\x27\xac\xf6\x85\x65\xe6\x77\xdd\xa4\x12\xd6\x6b\x68\x81\x62\x01\x69\x5b\x55\x82\xfc\x5e\xa7\x12\x56\xb2\xe8\x79\x4b\x41\xa8\x25\x52\x88\xdd\xaf\xee\xee\x0f\xdb\xd9\xd3\xdd\xb2\x87\xe1\xd4\x41\xe4\x05\xb8\xf7\xf0\x2c\x5b\x76\xcf\x14\x71\x66\x62\x47\x8d\x4d\x37\xc3\xda\x0d\x43\x77\x5b\xcd\x4a\xb0\x66\xdc\x00\x33\x3d\x6d\xbe\x05\x91\x36\x80\x4b\x7d\xe2\x65\xfd\x63\xf0\x45\x62\x12\xfa\x96\x2c\xb3\x74\x71\x21\x64\x85\xb0\x52\x92\xc3\x49\x10\x4b\x03\x54\x7d\xc1\x60\xa3\x49\xdd\xce\x72\x65\xd4\xe8\x5d\x9f\xc6\x9f\x6f\xf6\x80\xcd\x5a\x16\x69\x7e\x5f\xd4\x90\xd9\xc5\x69\x7b\xb0\xd8\x90\x30\x95\xbc\x6e\x86\xa9\xfd\x33\x0f\x88\xc1\x98\xe4\xc3\x31\x67\x8a\x20\x62\xc8\xc6\x79\x21\xcb\xb0\x7c\x6d\xda\x1c\x09\x12\x0a\x9e\x13\xa9\xe7\x55\xed\xd8\xcc\xbc\x3e\x7e\x87\xb9\xbe\x1a\x10\xc0\xd4\x41\x0e\x31\xa7\xff\xc8\xf3\x33\xcf\x46\xb2\x09\x3a\xe0\x11\x09\x3a\x85\xce\x41\x02\x5f\x07\x9c\x6b\x47\x7a\x82\x36\xcc\x54\x2d\xa8\x0e\xb8\xd2\xe8\x34\xff\xda\xcc\xac\xe2\x94\x6d\x10\x31\x11\x4e\xac\xf9\x9c\xd5\xe9\xd6\xc1\xd0\x1b\x03\xac\xe4\x57\xb5\x19\xee\x32\x90\xe8\xda\x01\xaa\xdd\x4f\x6e\x6c\x81\x24\x21\x3e\xb6\x2c\xf2\x1a\xf2\xfa\xbe\xa8\xea\xf9\x65\x35\x94\x52\xd4\x81\x8c\x28\x42\x70\x56\xd2\x30\xe9\xf6\x1c\xbb\x40\x0a\x19\x18\x76\xeb\x1c\xfd\x94\x65\xfd\x6a\xec\xb3\x43\xdb\x43\x09\x4b\x91\x8b\xe5\x85\x8f\xe1\xfe\x2a\xe9\xa7\x03\x15\xf9\x48\xb1\xb1\x5c\xef\xe6\x50\xb7\x60\xb2\xe9\xcf\x08\x8c\xe1\xd6\x8d\x81\x73\x43\x84\x5f\xfe\x18\x9a\x5f\xb6\xa7\x8e\x25\x9e\x9b\xc6\xf6\xec\xb1\x08\x7e\x65\xad\x4d\xfe\x20\x25\x91\x22\xad\x12\xf7\x72\xfe\xfc\x0d\x94\x46\x53\xc2\x08\x96\xb7\x21\xa1\xcb\xa9\x84\x43\x2a\x87\x19\x18\x4d\x89\x0c\x20\x72\x81\xdf\xdd\x07\x3f\x3d\x74\x23\x4a\xbd\x88\x23\x20\x4f\xa7\x65\x65\xd0\x80\x4b\x07\xab\xd5\xd4\x03\x83\x73\x6c\xe6\xd9\xfe\xb5\x2c\x3e\x26\x64\xa3\x9e\x0a\xe3\x98\x76\xd7\x70\x64\x62\xd4\xa6\xdc\xa9\xfd\xb3\x4e\x30\x3e\x99\xc3\xc7\xa6\x2c\x4e\x45\xc5\xb3\xaf\x30\xde\x93\x59\x46\x7b\x1b\x3f\x8e\x11\x96\x97\x5a\x4a\xda\x45\x8b\x74\xc0\x38\xc3\xb7\xe6\x30\xf5\x45\x88\xb5\x3c\x7d\xc4\xc1\x38\x09\xa2\x69\x40\x38\x37\x5c\xb8\x35\xbc\x14\x8e\xb1\x46\xd3\xc0\xa3\xc8\x27\xd3\x78\x76\x37\xfc\xd2\x85\xde\x35\x0d\xb8\x61\xb2\x30\xa9\xb5\xa5\x2d\x9e\xde\x22\x70\x02\x1c\x15\xc1\x70\x0d\x53\x9a\x30\x66\xa1\x89\xc5\x47\xf5\x04\x1f\x77\xbc\xa5\x86\xd2\x34\x4c\x7c\x2d\x5a\x45\xf4\x73\xd6\x2f\xfb\xd3\x34\xa2\x80\xd0\x0c\x37\x0a\x56\x1d\x68\xf4\x0b\x11\x10\x3c\x28\xad\xcf\xf6\x35\xe3\xb5\xa6\x31\x25\x61\xa7\x92\xb6\x3e\x35\x9e\x69\xf3\x6d\x7e\x0c\xe6\x5a\x4c\x13\x5c\x36\xd5\xf9\x78\xbc\x2d\xce\xb9\x82\xd2\x60\xe4\xdc\x53\xc7\x2c\x76\x55\xc4\xab\xca\x16\xa4\xb7\x6d\x5a\x23\x7a\x50\xf4\xf8\x28\xed\xee\x47\x19\x8b\x10\x7a\x5c\x42\x5d\xa6\xf0\x0e\x7f\xf0\x3c\xad\x2f\xb7\xc5\x48\x8c\x66\xb4\x4e\x18\x98\x6a\xd6\x13\xbf\xca\xb6\xd8\x1e\x49\x18\xe1\x5c\x5c\x1e\xe6\xe9\xb4\xe8\xa9\xa6\x89\x2d\xc4\x4c\xab\xbb\x8c\xab\x94\xd7\x45\x89\xf5\x4a\xa3\xc1\xe4\xc4\xc8\xab\xa5\xb2\x38\x20\x3a\x3f\xcd\x5f\x0e\x55\x2f\x01\xa6\xa9\x08\x3c\x2c\x91\x3d\x35\xb6\x84\xd1\xb9\x70\x2d\x11\x0b\x9c\xe3\xe3\x34\x58\x6d\x3c\x6e\xf4\x33\x22\xf1\x30\xeb\xbe\x31\xf7\xe8\xa3\xef\x5c\x0f\x1e\x22\x4a\xba\xd0\x1a\x4a\xb4\xaf\xae\xbc\x7f\x2a\x94\xc6\xf8\xd7\x0e\xea\xc3\xa5\x38\x97\x87\x17\x7e\x84\x43\x8e\x08\xbb\x83\x80\xfa\x03\x20\x3f\x78\x07\x2f\x1c\x7e\x5f\xc9\x22\x34\xde\x1e\x8a\x97\x27\xf8\x98\x10\x02\xd2\x54\x45\x1e\x35\x33\xcf\x22\xbe\x9b\xdd\x77\xd4\x07\xa2\x38\x69\xb9\xaf\x9e\xea\x1e\x91\x8c\xa6\x20\x09\xb5\xa8\x45\x3b\x83\xc6\x17\x6b\x0f\x91\xa0\xc2\x6e\xca\xcb\x4f\x33\xc5\xcd\x91\xfb\x8d\xac\x9b\xa6\x9a\x48\xcc\x0b\x9a\x49\x8c\x54\x5a\xf3\x31\x73\x83\xa6\x3a\x82\xc4\x39\xfa\xcf\xf9\x23\xaf\xde\x40\x2d\x2d\x0e\xf1\xab\x1b\xdb\x0a\xc9\xe6\x12\x8c\xa5\x7e\xff\x18\xda\xb0\x54\xdc\x17\x39\x54\xf5\x0b\x3f\xb6\x8a\x21\x3a\xf4\x7c\x0f\x4f\xdd\xc6\x73\x04\x99\xa2\x9f\x86\x98\x10\x48\x5d\x17\x9f\x70\x61\x03\x7e\x3c\xcb\x0e\xaf\x45\x59\x41\x1f\x9a\xa6\x43\x9f\x2b\x74\x80\x1e\xd3\xbc\x7e\xec\x19\x9f\xd3\xbb\x5e\xe8\x0b\x82\x90\xfb\xed\x39\x1f\x18\x0a\x61\xe0\x73\xf7\x2d\xe6\xfc\x65\x96\xab\xbb\x54\xd7\xd3\xc7\x7b\x18\xb0\x10\xf1\x49\x4f\x70\xaa\xf9\xe0\x2e\x94\x11\x67\xe5\xa0\x66\x1a\xda\xed\xa9\x4c\x79\x99\xb6\xdb\x59\x48\x19\xc7\xfa\xf7\xcd\xc3\xec\xcf\xe5\xf6\xb0\x7f\xde\x3e\x1d\x76\xab\xa7\xbb\x87\xe5\x61\xb3\xdc\xae\xd6\x37\x6d\x47\xae\x31\xe0\xbc\x4f\x61\xe2\xe0\x0e\x43\x4f\x60\x8e\x73\x63\xdc\x84\x91\x69\x63\x19\x9f\x5c\xdf\x88\x20\x97\x7c\x73\x78\xdd\xf2\x2c\x13\x5c\xbe\xad\x2a\x44\x58\xa8\x75\x1b\x2c\x75\x3f\x1c\x27\x01\x86\xe6\x1e\xd6\x77\x07\x3c\xcf\x5a\x50\xfc\xe4\xb6\x11\xc6\xd2\xe8\xa0\xcd\x67\xdb\xc1\x70\xb0\x90\x98\x58\x5a\xcd\xdf\xa0\xac\x6e\x8b\x72\xd3\x98\x16\x03\x13\x27\x64\x49\x94\xd8\xe8\xdc\xee\x71\xd3\xd7\x12\x5d\xe5\xad\xd2\x8d\x0e\x93\x44\xf0\xd0\x41\x64\x5a\x86\x97\x1f\x7d\x5e\xab\xf6\x96\x89\x66\xd2\x66\x7f\x4d\x2a\x73\x3c\x36\xc3\x81\xe4\x01\xc7\xd3\xc7\x89\xe7\x54\x3d\xa5\x57\x1d\xf2\xc8\xc7\x18\xbe\x72\x2a\xe1\x97\xd1\x77\xe0\x8c\x98\xef\x69\x90\x15\x43\xf5\xff\xf1\xbf\xf6\x98\xef\x22\xce\x21\x67\xda\x72\x5a\x64\xd9\x43\x2b\xa7\xa5\x43\xc1\x4d\x24\xda\xd4\xa8\xda\xe0\x88\x6b\x94\x3e\xc1\xda\xc0\x1d\x64\x7a\xc3\x5b\x49\xdd\xbf\x8a\x12\x7d\x6b\x6b\x85\x2a\x0c\x02\xe3\x0a\xdf\xf3\xea\x15\xdd\xe1\xd1\xb7\x52\x5c\xe3\xe2\x3f\xa8\xf3\xf1\xb4\x2f\x8c\xfa\x86\xdb\xf3\x43\x9d\x04\x18\x9f\x5c\x9f\x4e\x45\x59\x5f\x06\x53\x41\x73\x85\x68\xb6\x1b\xfe\x13\xd2\x49\xc0\x4e\x7f\xf7\x0d\xb5\x20\x96\x18\xf7\x72\x0f\x59\x56\xb4\xb7\x11\x86\xe6\xab\xaa\x8b\xd3\x26\xe3\x5d\x01\x9a\x0e\xb5\x0a\xdd\xda\xfb\x0d\x2e\x2e\xf2\xd2\x97\x3c\xd7\x91\x47\xa8\x67\x64\x6f\x0c\x7f\xf3\x2c\xcb\x66\xe5\xcb\x55\xb4\x7b\x38\x2e\x91\x17\x85\xcc\x51\xa2\x39\x62\xd6\xfd\xfd\x93\x83\x29\xeb\x28\x24\x46\x6b\xcb\x30\xb5\x4d\x2f\x92\x28\x22\x26\xea\xe1\x0c\xae\x6d\x5b\xc9\xd5\xb4\x71\x23\x8b\x08\x59\xfa\x0e\xe5\x82\xe7\x2a\x55\x5f\xb1\x60\xe9\x28\xa6\x60\x8a\x34\xab\x7e\x52\xc8\x35\x4a\xce\x89\x0d\x32\x95\xef\xae\xf4\xc8\x99\x28\xae\x17\x0b\x4d\x81\x24\x57\x6a\xc1\x2b\xd9\xec\x9c\xd3\x8f\xcd\x98\xd2\xb6\x18\xa3\x31\x11\x4b\x9e\x8e\xf1\xb8\x3a\x62\x89\xd1\x2a\x50\x65\xb3\xcd\xdf\x20\x29\x42\xf7\x40\x49\x63\x98\x1b\x53\xa0\x46\xbd\xe2\xbf\xc5\x6a\xd6\x5c\x17\x23\x3d\x91\xa5\x58\xdd\x62\x16\x6c\x94\xfb\x8a\x78\x14\x63\x1c\x05\x2d\xc7\x7d\x5f\x48\xe5\x47\xdb\x43\x20\xb1\xd4\x43\xf1\x62\xb7\x81\x05\x3f\x2d\x3f\x25\x80\x9a\xa8\x43\xea\xcf\xc2\xc6\xd1\x47\x46\x89\x99\xa8\x30\xff\xf9\x7b\xd3\x0b\xaa\x0a\x72\xc7\xe2\x3f\xfd\x7d\xb8\x24\x18\x2c\x29\xcf\xc3\xca\x75\x1d\x09\x8f\x7a\x4e\x55\xcd\xca\x88\x75\x5b\x41\x24\x02\x3f\xe1\x0e\x92\x77\x50\xc5\x47\xfb\x12\x92\x0a\xdc\x24\x1d\xb7\xd1\xa4\x1f\x1b\x29\x4f\xe2\xbe\xf7\xfb\x3f\xbf\x54\xd7\x1a\x3d\xa9\x8a\x85\x11\x91\x3c\xa6\x96\xfc\x39\xfb\xba\x38\xcb\x5d\xc3\x69\x20\x5d\x59\xc8\x4f\x48\xdb\x02\xf0\xbe\xc2\xb6\xed\xab\x3d\x83\x02\x75\x38\x1c\x7f\x68\x65\x45\x9a\x01\x32\x63\x62\xd6\x3e\x75\x5c\x05\x3a\xd2\x5c\x1a\x73\xd6\x54\xde\xf5\x61\xc8\xb6\x4b\x4c\x22\xae\x3a\x35\x1e\x64\x9e\x1e\x5a\x37\x31\xe1\x80\x55\xfe\x90\xab\xc6\x3c\xe8\xf6\x8a\xd8\xe3\x1e\x12\xf5\xcd\x17\xdb\xe5\xcf\xd9\xf6\xe6\x0a\xb2\xd1\x7f\xc8\xd8\x4f\x02\x0c\x88\xee\x96\x0f\x0f\xcb\xed\x61\xb7\x5f\x6e\x0e\xd4\x42\x91\x87\xdf\x37\x0e\x12\x23\xbc\x6b\xcc\x2e\xb4\x54\x7a\x7c\x91\x86\xae\xc7\x76\x0d\x89\x91\x4b\x6c\x8e\xe4\x9f\xa8\xc4\x3a\x7a\xfc\x28\xe4\x18\x53\x86\x52\xfa\xc4\xc8\xa5\xc2\xe2\x15\xfa\x38\x9b\x38\x92\x04\x53\x80\xf7\x9b\xdf\x27\x4c\x84\x38\x66\x0a\x89\xc4\x5a\xe8\x5f\x1f\x0d\x30\xaa\x53\x18\xbe\x48\x2c\x22\x43\x84\x71\x3f\xdb\x2e\x6f\x57\x37\xcb\xa7\x85\x0b\x8b\xc5\x31\x28\x04\x14\xa6\x55\x27\xb0\xd9\x02\x37\x62\xc6\x43\xb3\x45\x63\x69\xc2\x73\x05\xe5\x2e\x7d\xc9\x9f\xa7\xc9\x61\x75\xcc\x14\xd5\x96\xc5\xae\xa5\x47\xd2\x71\xc2\x0d\xac\xcd\xe8\x8c\x63\x2d\xcc\x03\x6a\x6e\x0d\x2f\xe6\xd4\xd4\x15\x65\xc5\x4b\xb1\x6a\x2f\xe6\x61\x82\x0e\xdc\x7c\xbb\x7e\xfa\xe7\xf2\x30\x7b\x5c\x3f\x3f\xed\x0f\xbb\xdf\x1e\xba\x0e\xdc\xa9\x98\xaf\xce\x0a\x3e\x91\x15\x79\x36\x66\xcb\x6c\xc7\x82\x4b\x62\x32\x47\x79\xbf\x7a\xad\xb7\x70\x63\x19\xb7\x0c\x4d\x3b\x14\x10\x33\x78\x89\xa1\xe4\xd8\x1f\x50\xa2\xb3\x33\x7a\x07\x99\x00\x2a\xf3\x9b\xe8\xe4\xbe\x13\xd6\x72\x4f\xab\x68\xec\x8a\x57\x1f\xd3\x1c\xf3\x05\xee\x18\x5a\xe5\xeb\x1c\xee\x8a\xd1\xc4\x51\x42\x62\xd0\x2b\x4b\x91\xb4\xf1\x04\x75\xda\x15\x71\xeb\x58\x29\xe3\x80\x99\x12\xad\xc3\xed\x7a\x7b\x98\xdd\xfc\xb1\xda\xad\xb7\xbb\x76\x84\xc0\x03\x0c\xee\x9d\x8a\x0f\xf7\x27\xed\x1b\xed\xc8\xdc\x7e\x0f\x23\x82\x36\x37\x0e\x14\x3e\x71\x67\xe3\xc6\xda\x07\xcf\xaa\xd7\x34\xb6\x44\xd9\xe3\x1a\x1e\xee\x10\xb1\x0e\x98\x21\x4f\x28\x51\xf0\x04\x6b\x1b\x66\x9d\xf4\xf7\xb8\x70\x4b\x33\x42\x7c\xf4\x63\xad\x80\xeb\x21\xcd\x75\x31\xee\xe2\x03\x72\x9b\x19\x1a\x93\x96\xc4\x0f\xa3\x88\x2e\xf0\xcf\x08\x05\xae\x5a\x8a\x0c\x40\xdb\xae\xbe\xcc\x2f\x5d\x8e\x81\x11\x19\x06\x2d\x4c\xc5\xb2\xa9\xcc\xe1\x25\xed\xe1\xc8\x35\x23\xda\x43\xc6\xb3\x87\xb4\x3e\x9e\xc7\x6a\x78\x4d\xb3\xf6\x5a\xae\x28\x27\x66\x37\x0c\xae\x33\x2f\xd2\x2a\xb1\x2a\x2c\xe3\x53\x9f\xb9\x3e\xb1\xc6\x39\x8b\xa8\xa3\x7f\x72\x5e\xde\x5a\xb5\x40\xd7\x0e\x46\x27\xd2\x80\x45\x1e\x78\x85\x33\x71\x9d\x67\x97\xa7\xa2\xee\xf4\xa5\x6d\x6f\x5f\x32\x6e\xb2\xeb\x2e\x00\xd5\xf7\xaa\x98\xaf\x0d\xc0\xb3\x82\xfa\xb6\x2c\x46\xd0\x71\xcd\x02\xdf\xc7\x35\xfb\xef\x33\x94\x97\x6d\x91\x8d\x08\xe2\x34\xa3\xe0\xc7\x76\xf9\xfe\x2c\xca\xb7\x53\x91\xe6\x75\x33\x45\x8a\xd2\x9e\x32\xee\x87\xc2\xc4\xe8\xdf\x57\x96\x6d\x76\x57\xc3\x69\x58\x7d\xaa\x59\xa8\x0d\xa9\xf6\x6a\xbb\x70\xea\x2a\xa8\xb5\xe5\xee\x11\x25\xd4\x90\x4b\xa1\x1b\xde\xb8\x2a\xa6\x02\x04\xca\xd5\xf0\x28\xf3\x7c\x37\x98\x31\x31\x2b\xba\x76\x8a\xfb\x37\xf0\x0e\x59\x71\x3a\x76\xa9\x23\xc6\xc2\x18\x71\xd5\x77\x8b\xc5\x50\x67\x60\xe2\x88\x60\x09\x31\x27\x6f\x5a\xdd\xf5\x51\xcd\xae\x95\x05\xa1\xd1\xe1\x7a\x07\x9e\xdd\xa7\x4a\x41\xee\x58\x65\x7a\x76\x6a\x44\xdb\xf4\x88\xe7\x5e\x3e\x51\x11\x58\xef\x68\x56\x1e\x8b\xd2\x04\xf5\x87\x03\xc4\x7d\x9f\x5b\x0a\x0b\x68\x59\xc2\xdb\xc9\xc5\x13\x1f\xa3\xe9\xb2\x2d\x8f\xeb\x50\x16\x8c\x27\x86\xeb\xdf\xe9\x1d\xa9\x5e\xf5\x9c\x66\x82\x18\x91\x4d\xab\x40\x36\x38\x85\xbf\xb5\x11\x98\xf4\x14\x6b\xab\x0f\x9d\xf7\xb8\xe1\x65\x05\x72\x14\x83\x60\xd2\x37\xc5\xeb\xc5\x09\x72\x8c\x07\x19\xcd\xe8\x9e\xf5\xc3\x24\x4b\xa8\x8d\xe2\x9b\xe4\xea\xa8\x74\x4c\x33\x45\xb9\xe3\x25\xc7\x08\xfe\xea\xe6\xb6\x28\xf7\x97\x13\xec\xe0\xdf\xe7\xc6\x5c\xeb\x60\x46\xa3\x27\x55\x52\xfa\x60\xeb\xd3\x3b\x20\xc7\xc2\x10\x3a\x5e\xc3\x7b\xc6\x57\x2b\x82\xe1\x1d\x83\x6a\x5a\xe2\x69\x3f\x38\x3c\x18\x30\x62\x92\x9d\x47\x9e\x65\xfd\x14\x20\x03\x1e\x20\x89\x28\xca\x7b\x99\x84\xc2\x80\x8d\x77\xb8\xa4\xb4\x67\xd4\xe0\x96\x8f\xab\xdd\x6e\xb5\x7e\xc2\x7d\x1b\xd5\x3e\xf7\xb3\xbb\xa5\x43\xd5\x30\xad\x0c\x35\x5d\x1f\x6a\x96\x10\x9f\x23\x86\x75\xf7\x5a\x7c\xcc\x8b\xa2\x27\xd7\xad\x13\xd2\x4c\x31\x2b\xe4\xd7\x7f\xbc\x84\x70\x8e\x68\xc7\x97\xf4\x1d\x2c\xa9\xe7\x60\x62\x25\x9e\x4f\xb1\x34\x76\x5f\xa6\x79\x3a\x74\xf7\x12\x2f\x20\xa2\x4b\x49\xad\x6a\x38\xf6\xf7\x97\xc4\xf7\x98\x53\xad\x7a\xe4\x9f\x2d\x1b\x50\x3f\x59\x9e\xf8\x7e\x40\x4c\x19\xfb\x62\x31\xb8\xb7\x1f\x53\xfc\x62\xab\xc5\x1a\xa5\x6d\xdc\x9f\x6d\xc5\x76\xc5\xdf\xe1\x0e\xf2\x45\xf1\x95\x4b\x93\x50\x4b\x86\x7e\xe2\x17\xc5\xbf\x24\xfa\x77\x9d\x3d\x85\x81\xe3\xb4\xaa\xce\xe3\x90\x5b\x7f\x0b\x48\x68\x90\xa0\x64\x56\x5b\x4f\x34\xdc\xe4\x13\x2a\xc1\xb3\x9a\x1d\x8f\x90\x9f\x07\x76\x70\x12\xfa\x46\xfd\xfe\xae\x3c\x6b\x9d\xe6\xff\x69\x96\x5a\x5b\x62\xa8\x93\x90\xf3\xd0\x55\x46\xf2\x3c\xd5\x50\x5d\x2b\xfa\x0c\x1f\x3b\xf2\x82\x28\xee\xd1\x32\xde\x16\xa5\x33\x05\xc6\xab\xf7\x8b\xfc\x64\xc2\x7c\x10\xd6\x57\xa9\x8b\x33\x12\x81\xe6\x35\x82\xc2\x27\xbd\x8f\x84\xd1\x04\xa9\xc1\x5b\xca\x0a\xc8\xcf\x85\x95\xe0\x30\x92\xfe\xaf\xe9\x69\x7c\x8d\x02\x1e\x0c\xca\xa4\xac\xb7\x37\x1a\xbc\x44\x26\x18\x14\xbf\x99\x2d\xfe\xe8\xfc\xe6\x44\x10\xdf\x33\xc5\x62\x5c\x1d\xd2\xc0\x3f\x70\x2c\xb1\x72\xad\x61\x88\xee\xd4\xe2\xe1\x57\xfb\x27\x6d\x20\x5f\xa6\x1c\xd3\x95\x8d\xb5\x3f\x23\x83\x10\x89\xec\x35\xcf\x64\x91\x1b\x7e\xc9\x2d\xfc\xbb\x6d\xa6\xd4\x2a\x03\x36\x67\x98\x39\x39\x61\x5f\xb4\xcd\xa1\x0f\xa6\x5a\xf8\xb3\x4b\xa0\x26\x32\x4e\x54\x4b\xa3\x9d\x41\x17\x36\x48\xa4\xa0\x71\xa7\x38\xd3\x1c\x94\x50\x6e\x8a\x22\xdb\x14\x59\x2a\xbf\x64\x99\x1f\x7d\x68\xc5\xbd\x40\xb9\xea\xd3\xc6\x84\xc6\xa1\x36\x30\x80\x29\xb9\x2b\x9d\x40\xac\x13\x1b\x70\xd2\x87\x66\xe4\x2e\x3d\x73\x26\xd1\x11\xc1\xaf\xb8\x79\x9e\x3f\xac\x16\x08\x18\xef\xd7\xf2\xeb\x44\x4b\x4f\x41\xaf\xca\xc9\x95\x50\x4d\x9a\xf7\x89\x96\x21\xb1\x00\x09\x63\xc8\x7f\x11\x29\x4e\x34\x04\x5c\x3a\xb8\x31\x96\xc0\xb1\xc1\x12\xe1\x84\x31\xa3\xcf\x63\x82\x4e\xfd\x5c\x0b\x27\xdc\xc3\xe9\xb1\x83\xba\xe6\xf9\xdb\xea\xd8\x7c\x18\x35\x2e\x87\xd6\x9c\x40\x84\x00\x9c\x65\xfd\xea\xa6\x04\xf7\x64\x40\x0d\x30\xb5\xaa\xcb\xe2\x62\x25\x0e\x86\xf3\x94\xfb\xbe\xc1\x59\x68\x3c\xd9\x6d\xea\xda\xb5\x85\x5e\x12\x39\xea\x79\x1b\x41\x74\x37\x0f\x12\x03\x99\x6d\x29\xd7\x97\xef\xbd\x1a\xf6\xaf\x52\xa1\x13\x16\x06\x0f\x54\xc8\x6c\xc5\xc0\x68\xf5\x0e\x5f\x31\x50\x12\xdd\x09\x23\xb6\xe1\x22\x9a\x1b\x28\x3b\xe1\x44\xcd\x29\x31\x81\x0d\xe4\xc3\xe9\x87\x89\x1e\xd2\xaa\xb6\xa4\x5a\x1d\x85\xff\x5f\x70\xa7\xfd\xc3\x70\xf8\xb4\xb7\x96\x68\xa7\x42\xfe\x92\xe6\x30\x0a\x41\x0c\x07\x95\xea\x04\xb1\x3d\x56\xd9\xfe\x06\xb8\xca\xd2\xb6\x5a\x83\x87\xbe\xc9\xca\xa7\x35\xd2\x3e\xdc\x8d\xc4\x76\x35\x0f\x23\x8e\x3b\xea\xb9\x82\xc3\x7a\xf9\x78\xd8\xf0\xb2\xae\xbe\xe2\x09\xb1\xd7\x44\x5a\x21\xdc\xf5\x04\x65\xef\xb8\xef\x48\x57\x34\x8f\xfd\xc8\x91\x0e\x2d\x5f\x5e\x3a\xd8\xe9\x50\x20\x5f\xf3\x98\x6a\x57\xdc\x80\x63\x37\xbf\xec\x2e\x47\x51\x64\xc3\x59\x1b\x43\x88\x30\xcc\xc6\x2c\xec\x21\x4f\x38\x0b\x03\xb4\xca\x5a\x28\xc1\x61\x5d\x72\x79\xce\x46\xae\x0c\x67\x2a\x49\x8c\x2e\x80\xa9\x37\xd8\x9d\x60\x6c\x8e\xf3\x84\x02\xe6\x2e\x6c\xd1\x55\x9f\x30\x71\x72\x2a\x25\x09\x60\x4d\xf6\xee\x2c\x1e\x0b\x24\x6c\x39\x57\x27\xb8\xd2\xd4\xd1\x9c\x87\x21\x86\x12\x91\xe4\x84\x8f\x48\x06\x35\xe7\x2c\xc2\x62\x3b\x53\x45\x07\xfc\x38\xc1\x72\xa4\xb9\xf0\x20\x24\x9d\x82\x46\xb3\xdf\xde\xd8\x3a\xc6\x51\x47\x2a\x90\xce\xea\x70\xce\x4f\x5c\xbe\xad\xf2\x1a\xb2\x2c\x7d\x69\xac\xb7\x09\xab\x97\x0b\xce\xd1\x45\xad\x8a\xb2\xde\x97\xe7\x5e\x08\x94\x4b\x62\x14\xa3\x36\xc5\x07\x94\x66\xc5\xfd\x45\xe1\xd0\xdf\x8d\x98\x5f\xf1\x1f\x69\x2e\xa9\x12\x74\xb8\x30\x47\xe2\xda\x9a\x4b\x15\x63\x98\xcd\xf0\xee\xc0\xb6\x90\xf7\x67\x13\x90\x9a\x9e\xa5\x2a\x52\xc8\x70\x2c\x2f\x32\x83\x9e\xc2\x96\xe6\x8a\x33\xe2\x72\xe1\xe7\xfc\xa6\x57\x10\xda\xbb\x9a\x27\x54\x38\x1a\x54\x94\x49\x40\xa0\x5e\x9f\x18\xf0\xaa\x8e\x5f\x73\x20\x1a\xc1\x22\xb3\xd5\xf6\xe0\xb9\x9f\xd3\x0c\x50\x38\x33\xad\x4c\xfe\xb5\x13\xc2\x1b\x80\x7d\x5c\xef\x84\xa0\x17\x74\x33\xfb\x73\x77\x08\xdc\x4d\x04\x91\xca\x04\x72\x61\x5f\x14\x7d\x53\x4e\x78\x24\x51\x96\xcc\xef\x1d\x1d\x90\xf3\xf1\xaf\x83\x96\xc2\x8b\x03\x45\x5b\x6d\xc9\x53\xbf\xc0\xb0\x3f\xcf\x85\x97\x10\xa2\x5a\xe3\x7c\xff\x9a\x56\x43\xea\x06\x2d\x7c\xa2\x91\x1e\xe4\x67\x51\x66\x0a\x85\xc8\xdb\x96\x40\xc5\x41\x4f\xfc\xe2\x1e\x3e\xe7\x17\xc7\x36\xea\xb9\x4e\x42\x1b\x3d\x4e\x07\x1a\xc4\xf0\x5c\x9b\x47\x13\x41\x94\x60\xfe\xab\x47\x01\xa8\xaa\xf9\xe5\x6b\xbd\x58\x2d\x42\xc6\x80\x76\x70\xd3\x47\xfe\xd9\x87\x71\x89\xc8\x33\x80\xa4\xb4\x72\xb9\xe0\xf9\xf9\x32\x8e\xc7\x8b\x38\x22\x5e\xab\xaf\xd8\x15\xdb\x8f\x7b\x81\x25\x45\x4a\x31\x3f\x37\xac\xb5\x10\xb1\xe6\xb1\x11\x32\x78\x48\x73\x64\x62\x7d\x44\x73\xe8\x3b\x14\x82\x60\xc2\xec\x08\x5c\xd7\x50\x7a\xc4\xaa\x28\xb8\x5b\x26\xa1\xc4\x8c\x96\xb3\xab\x3e\x78\xa9\xaa\x21\x60\x53\x24\x4c\x48\xed\xb0\x1e\x36\x6e\xd3\x33\x4f\x04\x4f\x84\x2d\x11\x97\xc5\x3b\x94\x0f\xa0\xeb\xe6\xdf\xf6\x37\x44\xa8\xbd\xd8\xa2\x27\x78\x5a\xbb\x3a\x7a\x2d\x9a\xa1\xeb\x13\xaa\xed\x6a\xb1\x2f\xcc\x97\x18\xce\x2e\x21\x0c\x5a\x1a\x59\xb7\x8f\xa2\x18\x37\x83\x87\x11\x57\x2e\xd2\x1b\xe4\xa2\x6e\xf9\x77\x7a\xa0\x14\x21\x89\x51\xde\x76\xbf\x86\x3f\xb4\x7b\x4d\x4f\xfb\xc2\x92\x2b\xf6\x71\x42\x42\x86\x14\x9d\x44\xae\xd4\xdf\xae\x26\x10\x92\x1b\x92\x76\x33\xbd\x4d\x38\x6c\xad\x3b\xd2\xde\x49\x7f\x46\x48\x10\x18\xfa\x58\x8b\x6a\xb0\x14\x15\x15\xc8\x83\x86\x64\x64\xb7\x45\xb9\x05\xf9\x97\x82\xa3\xee\x52\x16\x05\xad\x35\x61\x01\x01\xc6\x95\xec\x07\x5d\x84\x62\x3c\xf1\x7b\xb1\x1e\x13\xc0\x1a\x0d\xaf\x4a\x8c\x14\x9e\x99\xb5\xa8\x42\xd5\x3a\x3a\xad\xd3\x2a\xc0\x93\x18\x5e\x84\x36\x5d\x8a\x3c\x40\x9d\xd6\xf9\x7d\x91\xa9\xb9\xc3\xb0\x9a\x74\xee\xf4\x70\x40\xc0\x12\xa3\xe3\xf7\x06\x1b\x5e\xa7\xbd\xa9\x08\xd4\xc7\x28\xe2\xc1\x09\x3d\x9f\xa0\x9c\x24\x9a\xd0\x02\x42\x46\x0d\x5e\xf3\x66\xa9\x10\xa6\x3d\x59\x15\x24\x20\x32\x84\x86\xef\x86\x59\x13\x7e\x4c\xc0\xba\x04\x30\x83\x48\xee\x1f\xe7\xdf\x51\x7c\xba\xcb\x24\x65\xd6\xab\x9d\x17\xd5\xe8\x4c\x10\x00\x09\x2e\xf6\x03\xae\xf5\xef\x9d\x47\xa1\x63\x85\x08\xd7\xbb\xb2\xf8\xb8\x3b\xa7\xd9\xa0\x1a\x43\x12\x8f\x61\x42\x4d\x16\xe7\x53\x73\x00\x8d\x4e\x01\x49\x62\x0f\x95\xf8\xb8\x0d\x3a\xb6\x50\xa2\x51\x3f\x2f\x48\xd0\x52\xdd\x1d\x79\x59\xcf\x2d\xaf\x9f\x6b\x13\x66\xae\xdc\xf2\x37\x3b\xb3\x1b\xe7\xd1\x1a\x4b\x97\xf1\x8d\x24\xc1\x08\xec\x2e\x3d\x9e\x8c\x80\x49\xdb\xd1\xf6\xf0\xb5\xf2\x3b\x4a\xcc\x34\xcb\x76\x35\xaf\x6f\x8b\x72\x60\xab\xc9\x20\xf0\x0d\x2b\x00\x0e\x7c\xcf\x52\x77\xcc\xbf\x5e\x2b\x50\xe9\x5d\xb3\x07\x6b\x19\x28\x1f\xeb\xf0\xee\xa0\x7e\x38\xcb\xb7\xcb\x03\xcf\x55\x57\x35\x2b\xa9\x14\x08\x44\xba\x4d\x0b\xd9\xd9\xe2\x92\x5a\x16\x48\xa3\x04\x61\xd1\xae\xad\x39\x2a\x43\x66\x78\xca\xaa\x13\xff\xc8\x31\xb6\xf5\xb7\xb8\x13\xb5\x0c\xa5\xc1\x55\x58\xc4\xdb\x0e\x1c\x43\xa0\x96\x51\x20\xf0\xdc\x3a\x94\xfc\xe3\x0e\xea\xbb\xac\x10\x3c\xbb\x2e\x96\x70\xbd\x43\x81\x51\xf0\x45\x9a\xab\x54\x36\x1f\xb2\xaf\x21\xae\x65\xec\xb3\x96\x41\xd7\xea\x90\xfc\x4c\xeb\xd7\xff\x5e\x2c\x5e\xcb\x38\x0a\x7d\xa7\x7a\x34\x7b\xf6\xbf\x0f\xbe\xc9\x38\xd6\x58\x8d\xf6\xb0\xbf\x1f\x4c\xd0\x98\x51\xe2\xf5\x8c\x96\x59\x96\x15\x1f\xe3\xbc\x8b\x64\x1e\x67\xdd\xd7\x76\xd7\x32\x3f\x40\xc5\x45\x3c\xf4\x9b\x83\x67\x84\x8d\x91\x4c\x05\xc8\xab\x66\xf8\xac\x9d\xf7\xb4\x05\x5d\x0d\xce\x4f\x99\xf8\x31\x46\xc0\x76\xaf\xc5\x47\x1f\x04\x39\x5c\x97\x92\xdb\x08\xc6\x7d\x51\x6f\x8a\x7a\xf0\x1a\xdc\x07\xe8\x79\x72\xad\x62\x5e\xdb\x9e\x68\x62\xf1\xbf\xe9\xf1\xdc\x8a\xcf\xf4\xcd\x45\x29\x22\xa9\x3a\x42\x18\x73\xe6\x7c\xa5\x27\x3c\x86\xa8\x4c\x05\x85\xa4\xb4\xe2\xdf\x2f\x98\x8c\x4a\x37\x45\x91\x2d\x11\x6d\xef\x7e\x51\x02\xb7\x0a\xd6\x28\xde\x86\xcc\x73\xed\x23\x2b\xcf\x28\x0e\xb5\x06\x13\xea\xeb\xf6\x4f\x4e\xa9\x7c\xa5\x3a\x16\xa5\xc6\x29\x42\xf8\xce\xe8\xe3\x29\x16\xe2\xa7\xbf\x29\x5e\xe0\x3f\x50\x6e\x4a\x58\x2d\xd6\x5d\xee\xe5\x2b\xf4\xcd\xf0\x26\x40\x22\xc6\xfa\xd9\xd1\x23\xd4\xaf\x3f\xc6\x7d\x0c\x49\xa2\x2a\x7e\x3f\x5f\x01\x21\x25\x78\x0a\x81\x18\xf3\xb4\x5e\x5e\x60\xf9\x39\xbe\x38\x82\xd8\xb0\x09\xe7\x6f\x83\xf8\xa8\x04\xe6\x33\x3c\x32\xdf\xd2\xdc\x56\xac\x77\x81\x21\x09\x60\x50\xd6\x86\xdf\xbe\x28\xb2\x81\x5d\x2b\x41\x0b\x14\x0a\x70\x48\x92\x59\x96\xf5\x8a\xae\xda\xed\x48\x13\x93\xc4\x79\x4f\xe1\xc3\x25\x51\x1f\xe1\x58\xf4\xb0\x68\x52\xfb\x14\xe9\x74\xea\x32\x1d\x59\xde\x6d\x87\x18\x33\xc8\x87\x53\x09\xc7\xaf\x68\x48\xb4\xd4\x54\x53\x27\x64\x98\x7e\x42\x36\x88\x90\x48\x1d\x29\xac\x68\xd7\x69\xce\x73\xbb\x64\x9a\xb5\xd5\xc3\x5e\x2b\x22\x99\xd3\x75\x30\xee\xca\x16\xb8\xba\xf4\xb7\x42\x45\x34\x75\x9c\x4a\x8b\xd7\x41\x1e\x43\x79\x7e\x84\xac\x51\x88\x46\xdd\x14\x55\xdd\x21\xc7\x94\xcf\x0d\x3a\xad\xad\x66\x9c\xe5\xf5\xfc\x7c\x31\xa7\xc5\xf0\x83\x2a\x5f\x0b\x8c\xe7\xdf\x40\x66\xa1\x7d\xce\x23\x50\x34\x02\x34\xaa\x97\x74\x5b\x7c\x18\x99\x92\xb6\x49\x11\x4c\x8d\x6a\x9b\xf7\xc9\x0a\xae\xba\xc3\x4c\x45\x34\xc6\x38\x64\x5b\x7f\xf7\x5c\x35\x96\xc4\x38\x6d\xa9\x22\xca\x1d\x1d\x9d\x51\x2e\x4c\xf3\x97\x9f\x29\xd6\x10\xd8\x1e\xb1\x07\xc8\xcc\x6f\x2a\x23\xfe\xe0\xe7\xac\x9e\x42\xa6\xaa\x38\x30\x41\xc1\x0a\x05\xd6\xab\x5e\x54\xa4\x33\xa2\x54\x1c\x70\x3c\x78\x1e\xd3\x17\x13\x7f\x47\xd2\x39\xd7\x18\x19\xd2\xa0\x83\x85\x57\x94\xea\x0b\xaa\x39\xad\x18\x8b\x6d\x4c\xf5\xbd\x78\x83\x69\xcb\x47\x31\x19\xe0\x44\x3b\x57\x50\xfe\xda\xee\xa7\xa8\x18\xb5\x4a\xe2\x44\x8a\x36\xd3\xdd\x6c\x6a\x18\xf3\xd8\x17\x06\x62\x32\xfa\x56\x89\x32\x3a\x21\xbf\x15\x45\x35\xcb\x04\x94\xf5\xc0\xa2\x55\x92\x9a\xd2\x01\xf8\xac\x4b\xbe\x05\x09\x69\xe3\x28\x0c\xea\x8b\x94\x0c\x05\x7a\x39\x66\xb7\x39\xe4\x85\x42\xa9\xe7\xd1\x73\x49\x11\xda\x1a\x98\xfa\xb1\x7a\xb9\xe3\xd5\x1c\x19\xb3\xdb\x9b\x48\xe2\x4a\x95\x7b\x51\x90\xe1\xc3\x4a\x95\xc4\x36\x85\x75\x0b\xe0\x9e\x66\xf4\x3b\x10\x29\x74\x7e\xb6\xf0\xbf\x08\x94\x72\x3f\x00\x89\x42\x4d\x96\x55\x8e\x82\x23\x59\x06\xbd\x1c\xb2\x5b\xf6\x1e\x99\x50\xda\x24\xff\x72\xb7\xe0\x86\xbb\xa2\x86\xaa\x3e\x04\x87\xaa\x38\x42\x47\x25\xae\x15\x48\x85\xf3\x1e\x4b\xd1\xdb\x62\x2b\xc5\x8b\xb6\x03\x24\x54\xb7\x8a\x37\xe3\xf8\xbc\xd2\x3a\x76\x05\x58\x2d\x59\x84\xe9\x71\x5d\xd4\x02\x84\xf1\xb8\xdb\xe2\xbf\xc5\x66\x02\x01\x9a\x0c\x58\x1c\xff\x40\xa8\xb5\x19\xe3\x91\x40\xca\xdf\xb2\x31\xc0\x0b\x7d\x54\x56\x6c\xb6\xc5\x5b\xc3\x82\xac\x06\x93\x02\x7c\x2f\x40\x09\x82\x43\x47\x2a\xda\x17\xef\xd2\xe0\x4b\xc6\x69\x4b\x8d\x51\x9d\x8f\xdd\x78\x0c\x9f\x3e\x88\x15\xd6\x8c\x2c\x1f\x0c\x61\xc2\xea\x78\x72\x46\x18\x04\xcd\x9e\x89\x23\x5a\x43\x79\x4c\x73\x58\xe5\x35\x94\x9a\x4b\x68\x7a\x21\xd1\xa6\x91\xec\x1e\x6a\xfc\xf4\x61\xbd\x40\x83\x20\x60\xfd\x7b\x4c\x01\x89\x80\x02\xc1\x4a\x04\x1b\x48\xdd\xbf\x96\xc5\xf9\xe5\x75\xf7\xc1\xcb\xe3\xf7\x2e\x26\x84\x9e\xc4\xb0\x77\xd5\x6c\xc3\xce\x95\x86\x48\x68\xcb\x30\x94\x99\x8d\x61\xc4\x6c\x00\x91\x34\xa9\xf3\xc7\xd9\xaf\x83\x41\x39\xef\x30\x73\x8f\xa9\x4a\x77\x97\x38\xf1\xf1\x50\xd8\x6c\x57\x8b\x65\xd3\xf4\x74\x33\xdb\xde\xb4\xad\x3c\x44\x75\x80\xe5\x53\xf7\x27\x19\x63\x7c\x10\xeb\xf4\x76\xfb\xd9\x76\x7f\x08\x5d\x1b\x8b\x14\x7a\x7f\xa8\xff\xb1\x39\xe7\xf2\x75\x7d\xae\x47\xe1\xb8\x88\xba\xa3\x11\x58\xa2\x7a\x3a\x37\x3e\x66\xa9\xc7\xdf\x8e\x49\x33\xe3\x0f\x15\xd7\xb0\x3b\x8b\xe9\x50\x1d\x24\x01\x71\x1c\xcc\x8d\xb7\xda\x6c\x00\xf3\xcb\x26\xe3\x97\xfd\xe5\x34\x3a\x5d\x20\x49\x18\xda\x84\x50\xbf\xba\xc8\x7c\x9f\x90\x54\x43\x22\x08\x16\xba\xab\xb4\xaa\x8a\xec\x7d\xb4\x3f\x42\x02\x0c\x83\xc9\x8f\x97\x4d\x9a\x5b\x98\x63\xb3\x8a\x9d\xf1\x05\x9c\x18\x66\x69\x3c\x06\x57\xb2\xe8\x25\x7a\x81\xb3\x20\xb4\xa5\xa2\x1a\xa0\x2a\xce\x35\xb2\x5e\x76\xe7\x14\x08\xca\x11\xe7\x56\xe4\xc8\x7a\xb0\xeb\x7c\x61\x10\x21\x84\x46\x2a\xa0\x0f\x68\x1f\xbe\x9d\x08\x4d\x40\x9c\x2b\x35\x75\x28\x81\x48\x4c\xf1\xff\x6a\xb1\xc6\xe7\x6b\xef\x2d\x63\xa4\xa3\xa9\x3e\xf8\x69\x99\xab\x5e\xb4\x07\x24\x17\xc8\xd1\xc8\x95\x61\x89\x9a\x3c\x80\x40\x79\x11\x82\xee\xf4\x39\x97\x07\x42\xdb\xc0\x23\xa8\x58\x20\x0b\x9b\x2e\x72\xb5\xc9\x78\xad\x8b\xf2\xd8\xb6\x69\xea\x9b\x90\xcb\x31\xcd\x0f\x47\xf4\x31\x0f\x69\x75\x85\x74\xef\x8d\x20\x48\xe1\x4c\x14\x67\x4f\x0d\x6c\x7e\xd0\x41\x82\x0b\xed\x34\xa2\x18\x77\xcd\x94\x22\xa8\xd9\x05\x85\x6e\x78\xcd\xbf\xe5\x27\xe9\xd9\xc5\x9a\xf8\x20\xc3\x36\x73\x39\x2f\xca\xb2\xf8\x00\x50\x5d\x5d\xaa\xf6\x02\x8a\x1a\x38\x83\x52\x59\x34\xf9\x4d\xa8\xad\xed\x47\x25\x5a\xa5\xd5\x59\x1c\xd3\xda\x84\x17\xf1\x97\x6c\xa0\xa6\xb1\x09\x29\xed\x54\x98\xdc\xd6\x36\x58\xe3\xda\x8f\x78\xd0\x9e\x18\x86\xff\x78\xf0\xb9\x75\x10\xea\xd8\x11\x57\xa6\xf2\x0d\x3f\xeb\x60\x3c\x74\xc0\x74\xe2\x3b\xb2\x3e\xa8\x7a\xe0\x4e\x1d\x48\x8a\x64\xa3\xc5\x09\xf2\xdb\xa2\xec\x6b\x44\x6a\x4d\xbd\xc0\xc9\x7c\xdd\x15\x99\x32\xf6\x4b\x2f\x03\x79\x65\x31\xeb\x50\xfa\x51\xe4\xca\xb4\x1f\xe1\x68\x02\x4b\x83\x2e\x11\xd1\x08\x1a\x7c\xd8\xfe\x5a\xac\x1d\xb9\xac\xd6\x51\xe0\x49\xdd\xc9\x84\x9a\x63\x60\xf8\x1a\x91\x00\xbf\xc3\x7c\xce\x79\x85\xe5\xec\xa3\x3e\xc0\x5c\x96\x16\xa3\x51\x13\xc4\x32\x3a\x06\xe5\x98\x3e\xfb\x51\xdb\x65\xe3\xdd\x3e\xef\xbe\xc0\xaf\x68\x46\x3d\xe5\x0d\x52\x79\x3f\x01\x45\x63\x46\xdd\x22\xc3\x7e\xb1\x28\xcf\xff\x81\xb4\x1c\x84\xe1\x35\x8b\x0d\xa9\xb4\xa9\xe9\x71\xd1\xbb\x55\xde\x55\xe2\x68\xc6\x02\xa3\x1c\xc8\xdf\xa0\xc4\x62\x5f\x0c\x45\x8c\x7e\x04\x62\x6a\x0a\x29\x8c\xf6\xe2\x75\xd0\x59\x27\x9e\x8c\xc1\x45\x57\x11\x7a\xd7\xce\x4b\x4e\x8c\x15\x9d\x56\xab\xdf\xf7\xd7\xfe\xae\x16\x8c\x7a\x76\x7c\x0e\x25\x48\xb4\xe6\xa6\x77\x04\x2d\x84\x99\x59\x06\xb1\x79\x63\x65\x07\xda\xda\x76\x77\x47\x49\x25\xee\x58\xf5\x6b\x59\x7c\xac\xf4\xa0\x76\x5e\x4b\x45\x91\x2d\xf4\x83\x67\x59\x55\x97\x00\xb5\x3b\x00\x1b\x93\x17\x79\xe4\xa0\x7e\xdd\x17\xbd\x41\x52\x9c\xc4\x36\x31\x61\xd1\x79\xfb\x62\xb1\x99\xb6\x6c\x34\x90\x00\xb3\x97\x27\x8e\x42\x33\xdb\x56\xc1\x41\x6b\xed\x69\x61\x8c\x6f\xa3\x0e\x35\x78\xcb\x96\x8c\xf1\x1f\x7d\xb8\x8c\xd6\xb1\x87\x47\xc7\x7c\xb5\x9f\xaf\x7e\xb5\x77\x8a\x59\x2b\x7c\x72\x6e\x25\x64\xff\x9e\xa5\xa4\xb5\x66\x38\xb1\xdf\x9b\x2d\xa2\x9b\x30\x9a\x10\x42\x8d\x7c\xf1\x66\xbb\xfa\x63\xb6\x37\xb4\x72\x48\xdb\xb1\x98\x6d\xda\x3e\x51\xec\x14\xf6\x51\xf6\xad\xd3\x60\x9f\x08\x3a\x36\xfd\x93\x04\x3d\x6d\x5b\xac\xfc\x95\x0f\x6f\x7b\xfb\x34\x8a\xe3\x2e\xb7\x83\x42\xa2\x8f\x85\x1a\x1c\xe2\x9a\x90\xc0\x0f\x11\x06\x63\x53\xcc\xb7\xbc\xec\xcb\xe8\x36\x1d\x18\x33\x5c\xd7\xe9\xfb\xe4\xf1\xd2\x74\xe1\xd4\x4a\x3a\xa3\xa4\xcd\x55\x94\xc1\x76\xa3\x24\xc6\x30\x99\x95\xe3\x9e\xc9\x31\xdd\x5d\xd3\xc7\x37\x20\x87\x5f\xbf\x7e\xb5\x21\xc0\xe6\xcf\x34\x41\xef\x75\x9e\xd6\x77\x70\x44\xe3\x61\x8a\xbd\xda\xf5\x16\x1e\x56\x9e\xe2\x83\xf4\x89\xc2\xa7\xca\x57\x34\x21\x91\x67\x24\xbd\xcc\x50\x2d\x8a\x3e\xb5\xaf\xeb\xe2\x1b\x8d\x85\x97\x33\x2f\x55\xca\xf3\xc0\x3d\x59\x44\x19\x16\xa6\xb8\x33\x65\x51\x94\xd0\xf3\x71\x6c\xaf\xd8\x8f\xd1\x48\x4f\x6b\x38\x56\xdb\x66\xe3\x9a\xda\xac\x9a\x8e\x61\x88\xd1\xa3\xd5\xe6\x97\xc9\x99\x37\x87\x64\xdb\xc6\xfc\xa4\x23\xe2\xd8\x9c\xc5\x6f\x70\xe9\x42\x43\x9a\x10\x16\xf8\x98\x49\x96\x3c\x6f\x4d\xe4\xd6\x68\xbe\x2d\xc6\x36\x78\x3f\x72\xd5\x5c\x1d\xc5\x24\xe8\xf4\x61\x5b\xf1\xd5\x2f\x1e\x95\x09\xc3\x60\x69\x61\x93\xfb\x14\x4a\x27\x29\xdb\x23\x00\xb2\x9d\x93\x80\xa2\x47\xf3\xdb\x59\x15\x95\xd9\x62\x86\x03\x9c\xb0\x04\xf1\xb6\x28\x94\xb0\x7a\xba\x3b\xec\x97\xb3\x47\x77\x35\xe7\x26\xa6\x86\xfc\xd0\xdb\x6d\xfb\x67\xe9\x29\xab\x9c\xd3\x4d\x15\x2e\x8d\x78\xfe\xa9\x84\x13\x2f\x01\x77\x8d\xe9\x17\x90\x51\x8c\x24\x4e\x06\xba\x47\x3e\x7b\x21\x8b\xa6\x35\x8e\x30\xc4\xd4\x51\x73\xbd\xfb\x6d\x5b\x02\xb8\x68\x9a\xed\x19\x79\xc5\xaa\xd6\xe9\xec\xb2\x56\x9a\x10\xe5\x33\x84\x0a\xed\x1d\x47\xed\x10\x40\xd0\xf4\xa0\x22\x54\xa3\xf0\xe3\xf4\xa4\x56\x71\xe0\x47\xbd\x98\xed\x38\xd1\xf2\x8f\x41\x74\xab\xb9\x40\xf8\x91\x51\x09\x55\x50\x7e\x34\x1b\x4c\xfb\x5c\x40\x3d\x03\x95\x3c\x42\xf9\x02\xb9\xbc\xd8\x32\x05\x5b\x19\x6e\x4b\x29\x54\xdb\x3d\x6a\xab\x01\xf6\xbc\x7c\xb1\x0c\x17\xd8\xa0\x09\xef\xd7\x9d\xb7\x1c\x9d\xcc\xf5\x60\x51\xd8\xa5\x6a\x2c\x3b\x44\xeb\x76\xf8\x13\x0e\xb9\xf7\xaf\x6b\xeb\x4e\x13\xa2\x89\xa1\x14\x2b\x4e\x60\x62\x31\x83\xbc\x68\xd3\x21\x16\xc8\x61\x96\x15\x15\xac\x55\xfb\xec\x3a\x11\xb4\x2f\xe8\x7b\x5b\x94\x8f\x46\xb0\x7e\x38\xbc\x5a\x7b\x78\x32\xbd\x43\x99\xea\x4b\x6b\xe4\x4e\xc4\x78\x35\xf1\x48\xa2\x11\x49\x89\xfb\xbe\x65\xce\xf9\xe1\xda\x44\x84\x76\xc4\x47\x7a\x82\x79\xc6\xe5\x9b\x29\x3e\xdb\x97\x67\x68\x6c\x94\xc1\xaf\x7a\x1e\x8f\xb1\x32\x12\x01\x22\x3d\x89\xf1\xa6\x09\xfc\xd8\xc4\x15\x31\xd8\x37\xf4\x5b\xbf\x3b\x97\x34\xf1\xfc\x40\x60\x8e\x50\x99\x1a\x2a\x77\xcb\x20\x06\x2c\x08\x6a\x41\xdd\xde\xb2\x7e\xdd\x04\x6d\x33\x10\xb0\x86\x12\x56\xcd\xf5\xe3\x3c\xe3\x64\x8e\x26\x1e\xf5\x94\x2b\xfa\xbb\x01\x99\x1e\x79\xe6\xb6\x3b\x8f\x52\x8e\x8e\xa8\xe2\x35\x6f\x8c\x91\xa3\x0a\xd1\x0a\xae\x6c\x04\xb7\xe9\x92\xc4\xce\x55\xc0\x8a\x8e\x1f\xc3\x11\xa6\x89\x40\x5a\x9b\x7f\x42\xde\x78\x3d\x96\xfd\xd1\x5d\x1c\x86\x46\x70\x5f\xa5\x5a\xa7\xf2\x9c\xd5\x97\x99\xfa\xdf\x73\x55\x1f\x87\x81\x88\xa6\xa7\x90\x03\xa5\x84\xd9\xcd\xcd\x76\xb9\xdb\xb9\xe6\x28\x88\x0c\x1b\x33\x2e\xbf\x9b\xe2\xc8\xd3\xab\x92\xb5\xe1\x3a\xf4\xa2\x80\x33\x6b\x93\x3f\x15\xa2\x55\x94\x77\x77\x8c\x03\xb3\x89\x6e\xd7\x0f\xcb\x03\xf2\x4c\x2d\xdb\x26\xca\xfd\xd0\x92\x6f\x3c\x42\xcd\x9b\xd1\xb1\x96\x97\xeb\xc2\x74\x4c\x4d\x62\x66\x53\x42\x85\x12\x93\x70\x03\x8f\x50\xf1\xd1\xf8\x24\x42\x61\x8c\xa6\xd5\xfc\x19\xc6\x1f\xbf\xf2\x97\xa6\xb2\xa4\xee\x8e\xd2\x8f\x8c\xbd\x60\x64\xb6\x66\x96\xae\xec\xbb\x1a\x44\xbc\xcc\xb0\x64\xc0\xe7\xa9\xe7\x44\x61\x43\x82\xaf\xb2\x7b\x98\xfd\xe1\xfe\x26\x58\x82\xd1\x1e\x7e\x14\xa9\xdb\x4c\x3d\x29\x0d\xcf\x8b\xd1\x17\xe3\xa5\x7c\xbd\x58\xe4\xc3\xf4\xbe\xed\x29\xa1\x88\x11\xde\x69\x7a\xd9\x33\x0d\xaa\x5d\xbb\x2f\x79\x0a\x98\xb4\xd8\x94\xe6\x24\x9b\xf3\xba\xce\xa0\xf5\xaf\x8c\xa8\x80\x26\x1e\x34\xa7\xf7\xff\xf9\xff\xfe\xcf\x1f\x45\x3d\x51\x90\xec\xfc\xda\xa6\x63\x40\x3d\x8b\xd1\xdc\x14\x55\xbd\xce\xfb\x92\x2b\xa3\xf9\x01\x51\x04\x96\x9a\x6c\xf6\xfe\xd2\x01\xc6\x9b\x26\xa5\x8c\x3a\x70\xb3\xda\x1f\x2f\xb3\x53\xda\xae\x18\x00\xdf\x7a\x51\xb9\xc2\x62\x8a\xfd\x07\xc0\x57\x82\x39\x53\x9f\x4f\xfb\x04\xd7\xb6\x38\x97\xf9\xd5\xf1\xeb\x69\x88\x92\x4e\x37\x73\x0a\x40\xaf\x89\xdf\x98\x59\xda\xd2\xce\x63\x3d\x8c\xbb\xdc\x6f\x36\xaa\x66\xa0\x4c\xa4\xad\x5f\xe5\xd0\xd2\xed\x34\xbd\x28\x41\x7b\xd6\x95\x4a\x5c\x87\x79\x9b\x4e\x11\x47\xc8\xd1\x8d\x33\xe1\xbe\x16\xe5\x64\xff\xe8\xd7\x4b\xfe\xbf\xfa\xd7\x3d\x47\xac\x11\x88\x73\x90\xc5\xd1\x26\x1f\xdb\xf7\x10\x1a\xf7\xc1\x47\xb9\x28\xb1\x44\xaf\x6f\xd9\xfb\x44\x91\xc4\x92\x32\x64\x97\x55\x5e\x9d\xcb\xae\xcc\xde\x2d\x4f\x9f\x68\x1f\x83\xf9\x96\xbe\xe4\x67\x9a\x6f\x8a\x22\xbb\x2d\x4a\x03\xf8\xd9\xf5\xbe\x8d\xef\x05\xa6\xcc\xd1\xa4\x2c\xf6\xa9\x7c\xb3\xf0\x8f\xd1\xc8\x79\xa1\x8f\x49\xfc\xea\x54\xe4\x55\x51\xae\x4f\x69\xde\x2f\x86\xe8\x46\xcc\xf5\x8f\x43\x19\xbb\xf8\xc3\x13\x7c\xa0\x71\x81\xc5\xdc\xdf\x8f\x8c\x17\xcb\xc0\x1f\x70\x57\x9b\x42\xb6\xbf\xbe\x0c\xcf\xbd\x13\x94\xc7\xb4\xfe\x2a\x87\x6a\x3b\xfb\x2c\x92\x46\x6e\xf0\xf4\x7c\x7a\x38\x0f\xf9\xfd\x9a\x76\x1e\x21\xe8\x64\x5f\x7c\x8a\x5a\x0e\xc6\xdf\xe7\x2c\x8a\x5b\x42\xec\xc7\xbc\x3e\x4d\x7b\x25\xbe\xaf\x12\x1d\x0d\xe9\x99\x37\xa6\xc0\x1a\xc5\xf2\xba\x81\x0a\x54\x84\xe4\x86\x2e\x28\x75\xe0\xbd\xd0\xbd\x26\x3e\x8d\x35\x86\x83\x8e\xfc\xf3\xf7\xfa\xb2\xca\x6f\xdd\x59\xef\x47\x09\xc5\x9f\xd8\xd9\x62\xe5\x3f\xa0\xaa\x47\x8c\xf6\x9a\xf8\xb1\x34\x69\x98\x66\xdf\x5f\xa3\x6e\xc4\xa6\x2c\x5e\x4a\xee\xce\x42\x3f\x56\x9e\xb6\x72\xd2\x0b\x7a\xdb\x92\x63\x7f\x6d\x0c\xfa\x2c\x14\x88\xa8\x3e\x60\x60\xb6\x57\x0d\xd9\xb4\x25\x21\x02\xe4\x56\x8b\xf5\xe8\xb8\xf3\x93\x48\x68\xde\xaa\x7c\x4e\x92\x20\xb9\x9e\xe0\x21\x23\xdc\x8e\xe7\xea\x23\x95\xaf\xbb\xd7\xd6\xc2\xf1\x79\x40\x30\xd9\x52\xa7\x47\x28\xce\xf5\x2f\xc3\x66\xac\xda\x66\x4a\x11\x40\xbc\x7b\xbb\xb8\x28\x8d\x6b\x52\x31\xe0\x8b\xa6\x03\x89\x4b\xd7\xa8\x4c\xc6\x1a\x03\x1f\xf9\xc8\x50\xf6\x81\x08\x84\x9e\xe0\x29\xbe\x7a\x3a\x6c\xb6\xeb\xbb\xfe\xab\x69\x4f\x44\x8e\x49\x9d\xa7\xd9\xe5\xa1\xa8\x6b\x28\x2f\x3d\x22\xcf\xf1\x4e\xa4\x03\x03\x8f\x2d\xc0\x12\x00\xb7\xb7\x62\x21\x06\x12\x9b\xf7\x5b\xeb\x07\x67\xff\xb7\xcd\x32\xc6\x8a\x30\x8c\xa4\x6f\xe1\xe5\x9c\xf1\xd2\x61\x20\xda\x18\x60\x27\x8e\xe4\xec\x25\x5f\x6b\x8d\x26\xcd\x6d\xcf\xb1\x0d\x48\x40\x11\x11\xd3\xd1\x2d\x8c\x67\xb3\xbb\x3e\xf0\xa8\xc2\xc1\x43\x08\x1c\xa2\x79\xc7\x32\xb9\xae\x23\xa7\x88\x00\xdc\xf3\xea\xad\xba\xe7\xb9\xca\xae\x33\x93\xdf\xef\x8e\x41\x40\x94\x29\x25\x40\xe0\xf2\x47\xda\x8c\x65\x57\x30\xd5\x74\xa0\x86\xc5\xd2\x68\x6d\xd5\xa0\xe6\x23\x87\x2e\xa0\xbe\x17\x27\x3d\x30\xdb\x73\x9e\x8e\x3f\x41\x40\x13\xe5\xb4\x39\xce\x27\xdc\x14\xdb\x1f\x08\x89\xc4\xf4\x86\xb3\xdb\xcd\x4c\x1f\x17\xc8\x34\x1d\xfd\xc4\xd1\x9f\x1a\xfc\xe5\x2d\xc0\x17\x03\x13\x46\x1c\x33\x11\x76\x57\x5e\xeb\x9e\xce\x8d\x0b\x13\x6b\x12\x44\xd4\x8b\x75\x4f\x50\xc8\xa2\xd6\x87\xe8\x0f\xd7\x37\x92\xa8\x70\x90\x1e\xf9\x0b\xd8\x4c\xf2\xf0\x1d\xa3\x24\x74\xe8\x6e\x7c\x43\xe2\x64\xc6\x9a\x36\x11\xba\xf8\x2e\x8e\xee\x10\xf0\x37\xfa\x26\x11\xa8\xd0\x86\x68\xb7\x50\x15\xe7\xb2\xcf\x42\xdd\x99\xe9\x26\xfd\xd5\xce\x9a\x38\x34\x2c\x73\xbb\xb3\xe2\xf9\x5d\x91\xa9\x45\x61\x49\xc3\xdd\x43\x30\x9e\x44\x9d\xfa\xcd\x4e\xf2\x81\xa3\xf1\xd7\xcc\xc1\xcd\x2d\xc0\xc3\xf4\xef\xe2\xb7\xd9\x7a\x3f\xb8\x79\xe2\x7b\x98\x9f\xd8\x16\xe2\xd2\xcc\xfb\x43\xe3\x32\x7b\x6d\xab\x4a\x54\xe8\x00\x3c\x9b\xd4\xc9\xfd\x68\x12\x70\x4f\x48\xfb\xb2\xf3\x6b\x40\x97\xeb\x14\x46\xcc\x40\x59\x4d\x65\x6b\xcb\xd3\xef\xda\x23\x86\xc9\x1e\x91\xd6\x47\x5e\xbd\x1d\xc6\x95\x21\xbd\x3b\x71\x83\x64\xcc\x8b\xd6\xb8\x71\x45\x4f\x9a\x04\x82\x48\x22\x7a\x24\x87\xbb\xf4\xe5\x3a\x7f\xd3\xf4\x8b\x65\x4c\x5a\xd8\x35\x96\xca\x8e\x48\xeb\xc6\x04\x10\xcd\x45\x4c\x20\x7d\xc8\x73\x31\x9f\x3d\xfe\xf3\x69\x30\x7a\x42\x9a\xb8\x87\x49\x44\xcc\xfa\x2a\xc8\x57\xfa\x6a\x9a\x04\x92\x80\x61\x88\x0e\xfe\xef\x0d\x1c\x8b\xa9\x6f\xc8\x86\xd3\x57\x86\x0c\xd3\x97\x98\xf4\xd6\x00\x8d\x95\x82\x75\x43\x87\xb4\xc2\x3d\x4d\x16\xaa\x0d\x1b\x04\x32\x96\xb8\xf1\x9f\x5a\x2f\x35\x90\x2c\x42\x6d\x3b\x5c\x9d\xd6\x99\xd9\xf0\x0b\x8c\xe2\x67\x81\xa2\x01\x42\xb5\xce\x1d\x31\xd7\x97\x96\x4e\xa0\x62\x85\x61\x55\xb7\xf6\x9d\x22\xf5\x17\x24\xb8\xcd\x15\x32\x50\xd6\xe0\x7f\xae\x40\x6d\xe1\x1d\xca\x01\x4b\x00\xf6\xa1\x40\x3b\xc6\x8c\x83\xc1\x50\x20\x04\x2b\xe3\x97\x6b\xe2\x6e\xbc\x24\xc4\xaa\x29\x83\x4b\x41\xd2\x9c\x81\x1d\x13\x28\x65\x58\x86\x3a\x15\xfd\xe5\xfe\x7e\x7c\x13\x08\x35\x18\x4d\x95\xfb\x87\xcd\xe3\xde\x3d\x0f\x84\x0a\x0d\xa6\xb4\xba\x49\xab\xd3\xb9\x1e\xda\xdc\x01\xc4\x0c\x91\xf7\xee\x64\xc8\xd5\x82\x3b\x6a\xa8\xaf\x60\x5b\x7f\x69\x03\xf7\x22\x2a\x81\x16\xa6\x9c\x01\x21\xf9\xa6\x46\xcd\xa5\x00\x6f\x33\x64\xf8\x9a\x29\x65\xa9\x55\xab\x3e\x18\x67\xda\x13\x0c\x34\x28\xac\x84\xc8\x3f\x8e\xfd\x49\x4c\x89\x4a\xb0\x50\xc0\xb8\x35\x7f\x45\xbb\x32\x1d\xcd\xa6\x5e\xe0\x61\x44\x41\x70\x65\x63\xa7\x6c\x00\xc3\x73\xdd\x98\xaf\x8c\x04\x64\x05\x65\xdd\x52\x47\x8e\x87\x67\x74\xef\xc4\x70\xf3\x96\x70\xca\x2e\xd7\xd4\x02\x9a\x50\x3f\x34\x1e\x41\xf5\xc1\x4f\xa7\x56\xab\xdc\x36\x06\x24\x80\xc0\x91\x35\xf3\x0c\x57\x40\x59\x9c\xa0\xbc\x46\x98\x4f\x5b\xc3\x34\x88\xb9\xcb\x90\x3f\x5e\x9a\x9d\x23\xc5\x48\x06\x96\xa0\x0c\xc6\x98\x06\x09\x10\xdd\x62\xb8\x97\x9f\xa7\xb4\x04\xf5\xc4\x8f\xf0\xa3\xbf\xac\x1b\x03\x0c\x3f\x6d\x56\xa4\x6f\xe9\x9b\x4a\xdd\x8e\x48\x69\x04\x68\xd6\x19\x96\xb3\x34\x7b\x4c\xf3\xfa\xa9\x98\x9d\xeb\xd7\x1f\x83\xdf\x09\xa3\x08\x87\x7b\x53\xc2\x7b\x3f\xa2\x49\xc3\x84\x52\x62\xeb\x49\x37\x8d\xa5\x8f\x9e\xd3\x64\x96\x49\x13\x1a\x05\x86\xc6\xb3\xea\x69\xa6\x8d\x12\x10\x34\xa2\x11\x2e\x8f\xb2\x25\x3e\x73\x0d\x2c\xe2\x36\xba\x8b\xc1\x0d\xa7\x5b\xf3\x6d\xda\x83\x46\x52\x39\xc9\x70\xb7\xca\x91\xd7\x76\xa9\x5e\x46\xdb\x0c\x8d\x69\x80\x27\xf3\xc9\x4e\x93\xeb\xb4\x60\xd3\x29\x09\xf0\x88\x3e\x15\x45\x36\x53\x6a\xdc\xca\x43\xdf\xb0\x1a\x6c\x0b\x13\x42\x5d\x96\x65\x51\x2e\x20\xbd\x0a\x3a\x8f\x86\x26\x56\xc4\xe0\xaa\x10\x3d\x36\x3f\x5f\x9e\x8a\x8f\x2b\x8a\x1e\x4d\x28\x0b\x03\xdf\x16\xdb\xb5\xe2\xa0\x76\xfe\x0f\x5f\x9c\x59\x4a\xba\x63\xa1\x16\xb7\xeb\x09\xb4\x4d\xd3\x47\x24\x78\x9e\x9c\x2b\x28\x1d\x1a\xf6\xe9\x7c\x7c\xe4\x23\xa3\x8a\x26\x91\xe7\x68\x05\x8d\x88\xcf\xf0\xa1\x92\xc4\x38\x2c\x56\x8c\x6f\x38\x77\x38\xf7\xd1\xe2\x68\x25\x60\x66\xef\x3c\xc5\x65\xf1\x17\x9f\x4e\x40\xc8\x5a\x52\x92\x7a\x04\x80\x1b\xf7\xd5\x44\x76\x0c\xc8\x68\x0f\x23\x47\xcd\x2a\x9f\x9f\xb3\xb7\xef\x0b\x33\xed\x2d\xa4\x60\xc4\xb1\x34\xb9\xb2\x3b\x5e\xf3\x59\xae\x10\xbd\xfd\x04\x1f\xc3\x1c\xd3\xf7\xdf\x53\x51\x23\x67\xa9\xc0\xa1\xfa\x1f\xd2\x1c\x56\x35\x38\x2f\x8f\x2a\x1e\x85\x4e\xb8\xc7\xf0\x4a\x0f\x5f\x09\x7c\x81\xa6\xe4\xa1\xb1\xa9\xc7\x6d\xd4\x97\xaa\x17\x5a\x69\x8c\xb8\xea\xeb\xd8\x2c\x85\x98\x22\xf1\xed\x7c\x37\x5f\x74\xde\x06\x05\x26\xd1\x49\x32\x21\x65\x13\x29\xed\x47\x88\x29\xa8\x04\xdd\x91\xfa\x72\x32\x62\xe9\x83\x97\x0c\x1b\x27\x26\xee\xd1\xc6\xfc\xfb\xdc\xec\x3f\xb7\x45\x39\xcb\xb2\x9f\x69\xbb\x25\x86\x5e\xc4\xc0\x6e\x68\x33\xcb\xfb\xbe\x85\x66\x7f\x74\xa8\xe6\xb6\xa7\xcf\xe3\xc8\x69\x08\x9e\x40\xa6\x7c\xc8\x53\xf5\xf7\xdc\x95\xd0\x57\x51\x68\xa7\xeb\xc2\xea\xf6\x8f\x9e\x3c\xa0\x40\x78\x1f\x7a\x63\xbc\x99\x29\x9b\x3e\x0c\x92\x08\x73\x90\x36\xb1\xb5\x76\x19\x07\xf7\xcc\x34\xf1\xd1\x9f\x3f\x20\xd9\xc0\x5b\x0f\x30\x7e\xfe\x8a\x2c\xa0\xb9\x4a\x79\x48\x46\xad\x6c\xac\xdc\xda\xfa\xb6\x35\x54\x01\x26\x38\x3f\xec\xc3\x9d\xf3\xfa\x32\x8c\x12\x84\x11\x01\xac\x35\xb5\x06\x81\xda\x36\x0f\xf5\xf7\x12\x02\x61\xc4\x4d\x2c\x48\x81\xcc\x78\x09\xdb\xdb\xc1\x79\x11\xc6\x21\xc1\xd2\x2f\x9b\xdf\xff\x36\x76\x13\xc6\x11\xc5\xe7\xb0\xc0\xbf\x9a\x57\xce\x35\x0e\x59\x40\x55\xf4\xff\xaa\x6a\xda\xdd\x33\xa4\xb8\x15\xed\x5c\xe1\x54\xfb\x63\x91\x36\xc5\x8b\x05\x92\x4d\xf7\x22\x3a\x21\x83\x08\x21\x1f\xfb\x5f\xeb\x96\x69\x48\x93\x30\xf1\x02\xa7\xcd\xf7\xd8\xae\xcb\x30\xa1\xca\xb0\x84\x22\x71\xc3\x07\x2f\xbf\x91\xcc\x72\x97\x08\x61\x05\x5d\x2c\xe3\xc7\xa6\x84\xfb\xa2\xb8\x2a\xe6\x70\xdd\xa5\x36\x4c\xc8\x27\xc8\xeb\x7d\xa1\xb8\xb3\x49\x43\xee\x5b\x0d\x45\x34\xbf\x2c\xa4\x77\x0e\x13\x32\x32\x4d\xe7\x88\x62\x69\xe3\xa9\xe8\x64\xbc\x9b\x3f\xc7\xcc\xeb\x04\x99\x5c\xa0\xaf\x6d\xe5\x41\x60\x48\x01\xb4\x21\x38\x9c\xb5\x2d\x2a\x31\x25\xb4\xae\x1e\xce\xe4\x61\x6c\xab\x60\x21\x06\x83\x1f\x8a\x97\xdd\xbf\xcf\xbc\x84\x66\x7d\x1b\x5a\xdd\x2f\xa5\xe3\xec\xa5\x52\x2a\xc4\x35\x15\xf9\xcd\x7f\x95\x4b\x08\x95\x17\x69\x0b\x88\xd8\x7f\x8e\x20\x42\x4d\x73\x18\x62\x66\x37\xe7\x47\x50\xc3\x09\xac\x22\x86\xf1\xc4\x43\x0e\x1f\xab\x5c\x16\xc7\x34\x7f\x99\xaa\x13\x9c\xce\x87\xb8\x9b\x30\xa3\xbd\xc8\xeb\x81\x01\x1b\x2a\x15\x29\x4b\x74\x6c\xb3\x70\x5f\x3c\xbe\xe2\x48\x30\xf5\x0b\x86\x1e\x76\xa8\x03\xb0\x50\x0c\xe4\x50\x82\xf2\xf0\x5e\x20\x23\x34\x32\x73\x0d\x9e\x41\xd3\xd0\xd4\x87\x1a\xf5\xa8\x0a\x19\x73\x30\x78\x35\x4a\xef\x86\x9a\x43\xe4\xe4\x9f\xea\xa2\x1c\xe5\xa1\x22\x12\xc5\xb8\x89\xb9\x43\x78\x7e\x79\xf8\x1b\xd5\x46\xee\x62\x29\x91\x71\x15\x2a\x79\x7b\xce\xd5\x6c\x10\x0f\x8d\x88\x8e\x3c\xfb\x99\x16\xe7\xb2\xfa\x2a\x0e\x15\x79\x9e\x44\x94\x5c\x56\xc8\x37\x54\xa0\x77\x1c\x83\xd3\x3f\xea\xb1\x48\xba\xa4\xfa\x16\x90\x6b\xcc\xfd\xa2\x4f\x49\xd2\x86\xb2\x31\x18\xb7\x3c\x9e\xea\x49\x1e\xef\xa6\x37\xf8\x51\x07\xd5\x56\xbc\x7c\x73\x30\x6d\x4d\x22\x4a\x0c\xd3\x54\x73\x2e\x01\x3f\x3a\x49\xd1\x49\x2b\x23\xa2\x91\x11\x22\xbc\x99\x6d\xf7\xed\x0d\x44\x12\x63\xe8\x1a\xb1\x4b\x59\x51\xb5\xac\x81\xb6\x43\x28\x03\xf4\x92\x1f\x8b\xbc\x38\x15\x19\x62\x97\xbe\x73\xc5\x47\xbf\x19\x51\x4e\x5b\x3d\xf8\x75\xde\x7e\xd0\x28\xd2\xb8\x0f\x0a\x94\x1a\x9e\xa7\x35\x86\x11\x27\x67\x62\x14\xc5\x5e\x82\x79\xb6\x52\xec\xfb\x50\xa1\xab\x8d\x96\x5d\xc7\x29\xa3\x88\x51\x8a\xa9\x45\x38\xa6\xf5\xac\x04\xbe\x7c\xe7\xd9\x79\xd2\xf4\x3e\x8f\x6b\xcf\x9b\xcb\xa5\x30\xe2\x1f\x25\xc0\xfc\x9c\x66\x93\xbc\x27\x9a\x44\x2c\x14\x68\x43\xee\x1b\x57\xe4\xdc\x06\x6d\x22\xc6\x0d\x8b\x9e\x45\xa1\x60\xed\xe3\x17\x13\x8c\x29\xc9\x7a\x8b\xe5\x3f\x0e\x5f\x70\x05\x74\xb1\xfd\x93\xc8\x4f\x4c\x6a\x2e\xc7\xf0\x80\xa9\x24\x2c\xeb\x56\x55\x53\x93\x88\x7b\x80\xa0\xb6\xdf\x9f\xd7\xfb\xa5\x91\xfd\x77\x4d\x82\x24\xa6\x6a\x2e\xc7\xe2\x6c\x5d\x42\xf5\xfa\xd0\x05\x86\x23\x11\x06\xa8\x32\x52\xf1\x77\x68\x79\x45\xda\xc6\x44\xe2\x6b\xf1\xf7\x17\x03\xec\x81\xba\xab\x5b\x6f\xda\x85\x01\x83\x2e\x7f\xed\x97\xdb\xa7\xd9\xc3\xe1\xf7\xe7\xe5\xf6\xcf\xc3\xdd\x6c\x77\x78\x58\x3d\xae\xda\x87\x90\x61\x84\x11\x07\x59\xe4\x55\x5d\x1a\x46\xa0\xde\x69\x10\xa9\x20\x30\x89\x61\x5b\xff\xfd\xfd\x04\x57\x61\xc4\x2d\x53\x54\x30\x48\x9c\x47\xc0\x23\x1c\xab\xba\x78\x46\x34\x98\x0d\x3c\x74\x72\xb0\xdd\x17\x07\x21\x9d\x94\xf0\x6f\xef\x5f\xac\x49\xd0\x11\x26\x95\xf4\x39\x57\xe8\xcd\xad\xac\x18\xc1\xf7\x47\x42\xa4\xa5\x47\x9c\x56\xef\x90\x3c\x63\x7a\xeb\x8a\x09\xd5\xe8\xe1\x7e\x00\xbc\x05\xfd\xec\x6b\x4c\x42\x1f\x19\xd0\xac\x68\x4a\x75\x9a\x89\x74\xb0\xf9\xc6\x24\x0a\xb1\x04\x18\xc1\x32\xfb\xe2\x26\xe5\x7d\x6a\xd2\xd6\xbc\x88\xbd\x30\xc4\xec\xd4\x81\x2b\x85\x32\xa8\x63\x61\xe2\xc1\x20\xc7\x9e\x08\x51\x9d\xe1\xa1\x78\x31\x10\xa3\x2d\xfc\x7b\x78\xb4\xc5\x9e\xe4\x58\xd7\xd3\xb8\xab\x8b\x2c\x05\x43\x06\x98\x5d\x07\x10\x46\x97\x29\x81\x76\xaf\x06\xa8\x16\x06\x09\xd9\xe6\x61\x62\x0f\x24\xba\x48\xb3\xdb\xfd\x72\x7b\x78\x9c\xfd\x3a\xdc\xad\x67\x0f\x87\x9b\xe7\xed\x6c\xbf\x5a\x3f\xb9\x6e\xbe\x1f\x2b\xa3\x2d\x6d\x54\x21\xba\xad\xe2\x8b\x44\x44\xec\x87\x21\x06\x3c\x72\xf8\x44\x4b\x55\xf1\xf2\xd2\x43\xe9\x6b\x12\x07\xc2\xc7\x03\x0f\xce\x65\xb1\xe5\x69\x05\x6a\x2b\x5d\x1b\x4d\x8c\xf9\x28\x32\xee\xfe\x14\xc6\x06\x2e\x82\x00\xc9\x83\x29\x77\xd8\xdf\xaf\x9f\x77\xb3\xa7\x9b\xfd\x7d\xdb\x4b\xfb\xa8\x67\xf5\xfb\x76\x9b\xb6\x76\x4a\x1c\xf9\x89\xe1\x80\x7d\x87\xbc\xae\xee\xd3\xaa\xa5\x7c\x6c\x1a\x05\xc7\x49\x0c\x8d\x0f\xdb\x8c\xbc\xd2\xdd\x4e\x13\xc7\xbc\x1f\x4c\xd9\xf1\xe3\x69\x1a\x40\xaf\x49\xcc\xbc\x84\xbb\x24\x03\x54\x7c\xf4\xf5\x98\x1f\x51\xe2\x6a\x7b\x90\x6e\x63\xd1\x1f\x8d\x24\x88\x99\xf5\xcc\x53\x7d\xb9\x2f\xca\x0a\x2e\x37\x39\xff\x31\x0a\x0a\xb9\xde\xd4\x6c\x14\x2f\x50\x6f\x0b\x89\xb6\x1c\x7a\x91\xc3\x9f\xe4\xc4\xc3\x64\x52\x61\xd0\xeb\xb8\xd4\x47\xeb\x63\x38\x09\x05\x0d\x0d\x89\x53\xfa\x6e\x0d\xf1\xb4\x35\x12\x63\x41\x23\xc2\x1c\xc3\xd3\x39\x2d\xcd\x7e\x5b\x17\x6d\x7b\xc2\x31\x19\x23\xa1\xac\x67\xe7\xfa\x15\x1d\xe4\x6a\x01\x25\x32\x90\x5e\xfb\xf5\xa3\xd3\xee\xaf\x6a\xf3\xf1\x17\x34\x96\x38\x3c\xf2\x53\x06\x3d\x97\x35\x96\x44\x20\x42\x67\xf6\x52\xa6\xa8\xbe\xfe\xc0\x05\xb4\x5f\x5f\x52\x2a\xdb\xf4\xd9\xa9\x4c\x47\xe5\xc3\x9a\xc4\x8a\x48\x5c\xf5\x0f\xc5\x04\x8b\xf9\x60\xf5\x83\x12\x58\x6e\x74\xe4\x9f\x8d\x15\x8e\x0b\x7b\x68\x54\x31\x12\x04\x58\xe4\xb1\xdf\x9d\xb8\xec\x3f\x26\x23\x9a\x21\xd8\xee\x71\xf6\xa7\x33\xb0\x99\xa7\x12\x44\x84\xdf\xf3\x92\xff\x96\x96\x69\xfb\x77\x6d\x08\x15\x9b\x25\xb9\x5f\xef\x67\x0f\x8e\x80\xf7\x6e\xb9\x3f\x2c\xdb\x09\xcf\xfc\x28\x74\x69\x87\xe6\x98\xba\xd2\xbf\x1e\xaa\x0c\x8f\x51\xcf\xb6\xa2\xc7\xfe\xe3\x6e\x99\x48\x24\xf6\xfb\x03\x4a\xde\x7f\xfc\xc0\x0b\x23\xa4\x00\xff\x73\x3e\x88\xd0\x5e\xa7\x0c\x58\x00\x0c\x99\xa1\xed\x58\x36\x47\xb7\xd3\xe6\xb0\x3d\x68\x20\xb0\x3a\xec\xdf\xe7\x54\xbe\x2d\x8a\xfc\x1d\xca\x09\x1c\xd9\x70\x02\xb0\x50\xf8\xdc\x73\x02\xc3\xf8\x0c\x7d\x7b\xd5\x76\x8a\x02\x49\x6c\x26\x1e\x99\x8b\x9e\xab\x61\x9d\x5d\xd3\x25\x89\x10\x76\x94\xa3\xb0\xf4\x01\xf5\xd6\x0e\xaa\x3b\xe0\x9b\x0e\xe1\x17\x05\xdf\x6d\x8f\x18\x17\xfb\xef\xe7\xcb\x0d\x3f\xbb\xeb\xe2\x28\x46\xef\xe3\xb7\x42\x16\xfd\xa1\x8b\x95\x8f\x01\xc7\xdd\x7e\xbb\x9c\x3d\xae\x9e\xee\x5c\x03\x53\xc6\x5d\x11\xe7\x51\x6a\x94\x25\x81\xc2\x6a\x82\x23\xff\x6c\xcc\x33\x43\xbc\x5b\xf6\x9d\x3a\x96\x08\xa3\x49\xfc\xca\xab\xd7\x9a\xbf\xb4\x7f\x56\x21\x22\x95\x71\x72\x5e\xe3\x8c\x59\x02\x3e\x38\xae\x3b\x6b\x95\x4e\x2d\x37\x96\x40\x82\x99\x31\x1b\xe2\x78\x82\x5a\x63\x00\xd3\xdd\x87\x87\x9a\xdb\x80\x0a\x1a\x60\x18\x8a\x1e\x4c\x03\xc1\x7c\x17\xe2\xe9\x8b\x9c\xd8\x56\xd9\x3c\x88\x89\x86\xd5\xaf\xc8\x6b\xae\xfd\xb6\x4d\x2a\x3c\xa1\x5d\x2c\xcb\x32\x22\x7c\x73\xba\xb7\xb3\xd8\xe4\xcf\xba\x93\x98\xa9\xb0\x83\xd4\xa5\x3c\x33\xf1\x0b\xb4\xab\xae\xf6\xc1\xff\xf6\x5f\xfb\x0b\x10\x44\x83\x5c\x94\x51\x81\x9a\x3c\xe8\x19\x70\x8a\xbc\x1f\x46\xf2\xa7\x35\x5a\x87\x43\xaf\x79\x60\x08\xa3\x1c\xb5\xe2\xc1\x6a\x1a\x5c\x6e\x46\xc5\x20\x9a\x24\x44\x02\xd2\xa1\x70\xa5\x5a\xbc\xaf\x6d\xf2\x20\xe4\x48\x0c\x5f\xa4\xf9\x23\xb4\xd8\xb7\xc4\x27\x1c\x17\xc0\xc7\x31\xfd\x12\xde\x91\xf8\x9e\x60\x04\xa7\x97\x48\xe5\x6b\x0e\x6d\x4a\x36\x09\x08\xb5\x62\x1b\x06\x39\xfe\xce\xb3\x9d\x7c\x05\x75\xce\xdc\x87\xfa\xde\xfb\x4f\x02\x5f\xa8\xb8\xb3\xdf\x71\x5a\xd9\xea\xd1\x51\xc7\x80\x0b\x03\x67\x5f\xe5\x26\xf5\xd5\x87\x45\x25\x81\x56\x18\xb1\x3b\x88\x54\xf5\x34\x8b\x46\xbf\x46\x7d\x85\x2c\x71\x2f\xfc\x08\xb6\x0e\x74\xb0\x98\x13\x1a\x47\xf8\xa6\x08\x61\xea\x2a\xe2\x35\x49\x42\x50\x86\xcc\x04\x23\xf0\xb3\x5c\x2d\x73\x35\x20\x1f\xb4\xfd\x22\x9a\xb8\x35\x85\xc5\xf6\xbd\x52\xd8\xa6\xd5\xc6\xe7\x7b\xf8\xe2\x69\x1b\x22\x89\x89\x59\xbb\x56\x79\xf5\x2d\xb3\x7c\x9e\xdf\xc7\x9a\x92\xd8\xe6\xd6\x8f\xfc\x73\x7e\xbe\xa4\xf9\x4b\xcf\x5b\x49\x18\x18\x06\xc0\xd5\x62\x3d\xc8\x1e\x26\x4c\x1b\x96\x2c\x9d\xe6\x3c\x33\x25\xf2\xbd\xed\x25\x49\xbc\xd0\x10\x84\x55\x55\xfa\x32\x29\xd2\xd0\x74\x0a\x93\xc8\x6c\xa5\x35\x6f\xbc\xab\xe9\xb2\x94\x24\x91\x06\x0c\xff\x02\x75\x4b\x64\xd3\x2b\x4e\xda\xf2\x5c\x15\x23\xf3\x25\x49\xb4\xc0\xa3\x11\xb5\x7d\x9d\xbc\xf5\x08\x39\x91\x70\x4f\x63\x7a\xbf\xd9\x03\xd1\x67\xd8\x5f\x4e\x36\xf8\xc4\xfe\x6e\xc6\xd3\xdd\x8a\x12\x2f\xb2\xfb\xc4\xb4\x81\x94\xf0\x90\x69\xd6\x53\x49\xdb\x41\x66\x36\xb5\xdb\xb2\x30\xc6\xc0\x75\x36\xaf\xdd\x88\x12\x9e\x18\x78\x12\x57\xea\xae\x68\xad\xd3\x44\x00\x47\xf2\x12\x04\x38\x2c\xd2\x3a\x6d\x23\xdf\x89\xd0\xd2\x60\xb4\xdb\xa1\xba\x4d\x3f\xe1\x0b\x86\x3c\x4d\x12\xe9\x87\x46\xf0\x01\xf9\x9d\x31\x69\xbb\x29\x8b\x77\x2e\xb2\xcb\x2d\x4f\xcb\x6b\xa2\xa4\xe6\x9a\xc0\xc3\x70\xfe\x13\x94\x6a\xf7\x9a\xd6\xbd\x73\x2b\x91\xb6\x9a\xa4\xfa\xe0\xa7\xf1\xc8\x4b\x2e\x13\x93\x11\xc5\x2a\xfc\xab\xf0\x5d\x2f\x37\x9a\xa8\xc0\x78\x68\x65\x71\xe1\x59\x7d\xd9\x97\xdc\xe8\x2f\x0c\x47\x57\xa9\x18\xf1\x1c\x2d\x23\x87\xd6\xe9\xff\xcf\xd9\x9b\x74\x37\x8e\x63\x5f\xe2\xdf\xa5\x57\xb9\xa8\x05\x01\x70\xfc\xef\x64\x59\x76\xe8\x97\x9e\x4a\x92\x23\x32\xab\x4f\x1f\x1d\x0c\x0f\x36\x2b\x24\x52\x45\x52\x76\xb8\x3e\xfd\xff\xf0\x3d\x00\x22\x29\xd9\x99\xdd\x9b\x8a\x2c\x03\xa4\x48\x10\xc3\x1b\xee\xbb\x77\x57\x62\x26\x63\xbf\x2f\x07\xe8\xcb\xc2\x98\x3c\x8e\x03\x15\xb8\xcf\x52\x11\xbc\xf9\x33\xad\xe7\x0b\x8c\x0a\x36\x2a\x40\xc4\x1e\x30\xe5\x0b\x1b\xa6\x94\x7c\x7d\xaf\x34\xb1\x0e\x7e\x3c\xeb\xea\xfd\x8d\x9c\xec\x35\xde\x76\x2a\x40\x72\x34\xcc\xeb\x51\x82\xe2\xcb\xd4\x72\x01\xda\xa2\xb7\xee\xcf\x82\xed\x30\x36\x2b\x23\x21\xd1\xd0\x58\x6e\x16\xe1\x4f\x92\x23\xab\xc4\xf7\xe5\xd3\x0d\xf8\xe5\x2a\x59\x42\xb7\xd9\x2c\x17\x2b\x7e\x12\x60\xb5\x91\xe4\x82\x98\xfe\x28\xa3\x84\x06\xf2\x99\xcc\x45\xdf\x2d\x2b\xd0\xcf\x3f\xf4\x63\xc9\x16\x98\xa9\x9c\x75\xe1\x26\x0a\xa4\xcf\x0a\xe3\xc4\x5a\xd5\x3f\xc7\x96\xaf\xe4\x3a\x16\x84\x61\xbc\x45\xf6\xa8\x01\xf2\xda\x77\x11\x1c\x32\x45\x1b\xd5\x0a\x7a\x3f\x0b\xb7\xf3\x40\x5d\xed\x7b\x25\x29\x2e\x94\x63\x0b\x0d\xea\x11\x4f\x82\x34\x52\x68\x48\xcc\x68\x5d\x5c\x97\x6f\x9f\x9c\x63\x52\x38\x6d\x0c\x92\x9c\x9e\x3d\x2d\x2f\xf0\x1c\x62\x37\x2b\x63\x2f\x1f\x40\x86\xd6\xbc\x6e\x9a\x0b\x04\x6e\xde\xc9\x95\x31\x27\x91\xa0\xad\xab\xb6\xbb\x83\x37\xd8\x7d\x61\x7e\x7f\xfd\x8f\xbf\xa9\xc8\x70\x3b\x78\xf7\xe5\x15\x98\x63\xf3\x8d\x89\xb6\xe4\x8e\x1e\xea\xa6\xdb\xa2\xe9\xf4\xc9\x6b\x67\x0c\x6c\xea\xcd\x3c\x78\x23\x78\xe2\x60\xe1\xcb\x2c\x4f\x28\x24\xe3\x8e\xee\x61\x2c\xfc\xc2\x46\x21\xb3\x22\xf3\x40\xbc\x6b\xf9\xf1\x4f\x52\x7a\x98\x7e\x19\x69\x34\xc2\xd7\x67\xcb\xfb\x01\x84\x51\x4a\x1b\x7b\xc0\x3b\xa1\x5b\xdb\x9b\xba\xb9\xaf\x8d\x1b\x2e\xbf\x7e\xa4\x52\x22\x27\xa6\xcc\x6f\x75\xf7\x39\x49\xa2\x8d\xa4\xd6\x39\x16\x0a\xfe\x73\xbe\x9e\x0f\x03\xe9\x52\x5b\x9a\xa8\x87\xb2\x91\xd5\xab\x6c\xa7\x5a\x20\x36\x92\x86\xc7\x02\xbc\x2f\x7e\x52\xd3\x24\x61\x99\xc9\x30\x1a\x0d\xa8\x4a\xe5\x08\xc0\x7e\x94\x55\x55\x56\x2f\x01\x35\xe2\x7b\x19\x22\xe3\x70\x06\xcd\x77\x68\xfa\xed\xea\x62\x84\x51\x42\x24\x14\x81\x19\x54\x3d\xdc\x6d\x65\xef\x16\xb9\xc2\xd7\x7e\xf6\x3d\x93\x9c\xc6\x0e\xcc\x35\x58\x18\xa6\xb9\xc7\x4f\x68\x93\x48\x17\x4e\xcd\xeb\x00\x54\xe2\xef\x9b\x32\x48\x93\x93\xf9\xf2\xe2\xbe\x6c\x18\x6e\xab\xa8\x46\xa9\x82\xf7\x9b\x63\x77\x6c\xc0\x21\x62\xbf\x36\xdf\xa4\x35\x04\xd9\xd8\xf2\x2d\x98\xa3\x1e\xae\x5d\x15\x31\x42\x20\x7e\x5f\x3e\x2c\xfe\x9c\xad\xae\x27\xf0\x62\x15\x25\xca\x9a\x13\xb3\x55\xfb\x68\x49\x8c\x60\x3c\x48\x2a\xca\x48\x69\x94\x0c\xa1\xd9\xe1\x00\x72\x37\x3e\x80\x54\x94\x67\x3a\x68\xd9\x55\xb6\x7c\x79\x2e\xab\x6e\x38\xc3\x55\xa4\x89\x62\xa3\x01\x69\xd6\xb5\xed\xde\x65\x03\xcb\xca\xf6\x5e\xdf\x57\x19\x1f\x77\x35\x93\x86\xbe\x93\xa3\xa6\x9c\x4a\x3a\xfa\x6e\x8a\x88\xf4\xe9\x49\x03\x8a\xbc\x7e\xff\xed\xef\xc0\x22\x15\x8f\x59\xce\xfc\xe9\x4f\xd3\xb4\xff\x82\xde\x13\x52\x3c\x61\xc8\x58\xdd\xbe\xd6\x87\xdf\xab\xd2\xfa\x6f\xab\x44\x64\x53\x1f\x49\x26\x9f\xe6\x04\x9e\x3a\x77\x6c\xc6\x3f\x2a\xb8\x4e\xbd\x90\xe1\xb6\x7b\x6d\x00\xb0\x5a\x74\xf1\x9f\x2b\x3a\x24\xc3\x6f\x64\x04\xb0\x3d\x56\x21\x7c\x3e\xf9\x4e\x42\x66\x98\x71\x78\x95\x8d\x99\xcb\xc3\x70\x25\x2a\x21\x0d\x40\x08\xa6\xd2\x79\xb0\xfa\x44\xc3\xc6\x46\x2a\x61\x69\x42\xe4\x38\x3b\xf9\xf1\x68\x89\x8d\xcc\xdf\x2b\x11\x1c\xa7\x55\xff\x19\x4f\xe0\x58\x95\x88\x58\x3b\xbc\x84\x2f\x48\x3c\xe9\xdb\xdb\x48\xa5\x3c\x92\xb4\x9f\x38\x7d\xc7\x79\xbd\x3f\xec\xa0\x9b\x02\xcb\x55\x0a\x54\x67\xfd\xb8\xba\x5e\xac\xb6\xf3\xd9\xc3\x7c\x71\xf7\x17\x83\x98\x41\x82\xe1\xea\xc0\x14\x81\x69\xfe\xcb\x7d\xf3\x28\xc2\xf2\x01\x5f\x62\x46\xc4\x2b\xd7\xa7\x43\x5a\xe5\x89\x62\x0e\x0a\x7d\x0d\x56\x1e\x77\x28\x42\xbf\xac\x46\xb2\x0e\xa7\x1b\x16\x90\xe0\xb8\xd7\xd5\x62\x35\xcf\x38\x73\x5c\x48\xe7\xaa\x63\xc3\xf5\x20\x39\xc9\x36\xef\xd1\x7e\x25\x38\xdf\xa0\xb2\x4c\xc9\x22\xc1\x02\x66\xc4\x27\x0d\x4b\x34\x95\x2c\x52\xe2\x35\xa5\xb2\x6c\xe2\x16\x0b\xa3\x2c\x81\xe3\x4a\x34\x35\x06\xfd\x26\x10\x5b\x25\x21\x43\x1b\x7d\xeb\x4c\xc5\xab\xe3\xc7\x4a\x56\x9f\x24\xc2\x95\x92\x24\xa6\xf6\x6d\xfd\x6d\x34\x9b\x14\x44\xa8\xe3\x89\xe6\x09\x51\x59\xe0\x42\xd9\x6e\xea\x53\x97\x1c\x43\xca\x41\x3b\xef\xab\x58\x9e\xd2\xa9\xc6\x90\x7b\xd9\x12\x76\xf4\x6c\x4e\xe8\x42\x3b\xb2\x10\x1a\xdb\xeb\xc5\x86\x78\x43\x3e\x79\x72\x2d\x29\x3d\xf3\xdc\xf6\x1e\xd8\xd5\xe4\x6e\xa6\x90\xe8\x34\x1f\x8e\xed\xeb\x18\x34\x74\x72\x11\x94\x65\xc4\x53\xf9\x24\xcb\x41\xaa\x80\x4c\x57\xdf\x25\x36\x36\x0e\xf4\x5e\x8b\x8a\xd0\xec\x93\xe9\x61\x53\xc6\xc6\x24\x29\xf5\xe4\x71\xac\xc9\x30\xca\xb7\x81\xb6\xeb\xbe\x56\x92\xb4\x91\x8e\x22\x66\x88\xd7\xb6\xae\x6d\xef\x62\x6d\x67\x95\x69\xea\x00\x1a\xd4\x51\x12\x63\x70\x10\x45\xf7\xcc\x30\x4e\xa4\xa3\x54\x22\x7b\x02\x1a\x6b\xc7\x76\x62\x5b\x6b\x66\x98\xce\x06\x25\x38\xae\x68\xec\xa9\xae\x77\x93\x9e\xbc\x48\x2c\x1d\xb2\xf0\xaf\x7a\xaf\x4a\x98\xd7\xbb\x7a\x02\x3b\xd3\x22\xcf\xa9\xa2\x89\x62\x8a\xf7\xb2\xac\x74\x6f\xf1\x9e\xf3\xf2\xd9\x48\xc7\x4c\x60\x04\xed\x0c\xec\xff\x35\x0a\x4d\xc7\x4c\x29\xee\x39\xf4\xe4\xfe\x30\xa5\xa3\xf6\xdd\x92\x38\x0b\x41\xfd\xf2\x63\x51\x19\x57\x43\x3d\xa5\x71\xe9\xfb\xea\x08\x33\xaa\xc8\xb3\xa6\x3b\x0a\x21\x85\x36\x21\x1c\xa5\xdd\x0d\x1a\xb1\xeb\xb2\xd2\xe0\x69\xcb\x7d\x27\x4b\xb3\x75\x7f\x6c\xbb\x4d\xdd\x7b\xa6\x44\x52\x30\xe8\x60\x22\x62\xbd\x9e\x75\xce\x6a\x26\x92\x80\xc9\x93\x24\x32\xc6\xd4\x38\x69\xc9\xf5\xdb\xf0\xe6\x71\x7b\x18\x26\xfe\x74\x22\x33\x34\xe3\x69\x67\xef\x9d\xf3\x7e\x1b\xf1\xb1\x95\x30\x9d\x75\x5a\x40\x6e\x86\xbc\x63\x01\x03\x7d\xda\x75\x74\xc6\x04\xe2\x5b\xfe\x0b\xd5\xe3\x7a\xac\xfc\x65\x23\x9d\x67\x79\x42\x63\xf8\x06\x21\xba\xcd\x78\x7e\xca\x3d\x05\xed\x84\xa9\x7d\xae\x8b\x44\x69\xef\xb6\xf5\xce\xf9\x77\xd9\x94\xfd\x2f\x7f\x5a\xa6\x76\xf9\x8c\xd6\x45\x91\x21\x08\x14\x2a\xb3\x9c\x3f\xa2\xcb\x12\xfb\xe7\x93\x29\xcb\x89\x55\xce\xc0\xbe\x2a\x5b\xdc\xac\xb7\x22\x34\x83\x44\x58\x0f\x46\x48\x57\xf5\x71\x07\x5d\x88\xcc\x68\x69\x21\x02\x0f\x95\xbb\x7d\xf0\x87\x9d\x56\x09\x45\xda\x69\x78\x89\xe1\xc5\xab\xe3\x8f\x81\x57\xfe\x82\x2c\x8e\x48\x5e\xe7\x7f\x6a\x45\x60\xbd\x51\x73\x4e\xd8\x92\xde\x54\x38\xd5\xc2\x4e\x26\xab\x82\x08\x55\x3d\x50\x6b\xdc\xd7\x2a\xdd\x34\xf5\xbe\xff\x66\xb8\x43\xc2\x05\xa8\xe5\x99\x7b\x3d\x5a\x5f\x5a\x73\x24\x35\xd4\xaf\xc7\xea\x67\xb2\x6c\x49\xd5\xd7\x35\x9a\x84\xf8\x5f\x66\xc7\xee\xb5\x7f\xa8\xc9\xf3\x98\x44\xb3\x13\xf8\x75\xf3\x2b\x5c\x96\x47\x88\xa0\x79\x9c\xcd\xe7\xfe\x6f\x90\x72\x2c\x0f\xfe\x63\x39\x7b\xfc\xd7\xb7\x65\xf8\x38\xa0\xa5\x1d\x00\x7d\xf1\xbc\xf8\x26\x1b\xa3\x83\x05\xa1\x2d\x2b\xa8\xf8\xc4\xd1\x53\x23\x08\x59\x9d\x2d\x65\xab\x25\x56\xb7\x6e\xb1\x5c\xf8\x7d\x81\x5c\x6e\x4b\xff\x2e\x26\xe2\x1a\xd3\xfa\xb3\xef\xb7\xdb\xab\xbb\xc7\xf9\xef\xeb\x6d\xc4\x7f\x84\xd6\x2c\x42\x97\x4e\xee\x76\xcb\x0e\xf6\xbd\xef\x33\xb0\xd2\x4d\x64\x8c\x70\x15\x1c\x54\x5d\x4e\x7b\xc9\x85\x0d\xcb\x30\x9d\x6b\xa0\x70\x17\x81\x36\xfc\xdf\x4d\xc4\xdd\x4c\xdf\xf6\x7e\x40\x37\x95\x57\xec\xfb\x00\x29\x66\xd3\xa6\x55\x55\xb0\x9b\xb2\x0a\xda\xc8\x70\x2e\x91\xea\xb6\x3f\x14\x0f\x84\xa5\x1e\x2e\x05\x23\xa2\x2c\xf7\x5e\xa5\xd3\x5e\x9b\xcb\xdd\x0e\x79\x48\xcb\x41\x4d\xa7\xef\x2e\x0b\xe3\x7e\x13\x29\xf6\xdb\x61\xd2\xd3\xc4\x59\x8c\x54\x9d\x98\x19\x32\xf5\xcb\xa4\x31\x41\x27\x8d\x12\xbe\x8f\x37\x37\x8b\xd5\xf2\xe1\x76\x3b\xbb\xbb\x7b\xfc\x31\xf3\x3a\x9a\x7d\x3f\x5d\x70\xe3\x19\xb2\xf6\x30\x2a\x58\xf4\x5d\x0c\xc3\xa8\xcc\xee\x42\xbd\x9f\xeb\x92\x44\x31\x28\xec\x52\xff\x3c\x1e\x7e\x2f\xbb\x13\x72\xc8\xf7\x48\x18\x73\xdb\x67\xe3\x11\x13\xcb\xf6\xa6\xa9\xff\x0b\xd5\xd5\x85\xb8\xbc\x49\x93\x04\x83\x85\xdb\xb0\xfb\xe1\xb1\x4f\x59\xf0\x59\x65\x88\x99\xdf\x40\x73\x75\x34\x2f\x30\x49\x01\x98\x54\x53\x9d\x10\xf4\x87\xc6\x6e\x87\xaf\x35\x88\xce\x9a\xd4\x5a\xac\x4b\xbf\x07\xe8\x1e\x9d\x0c\xfb\x80\x08\xc6\x64\xba\xb0\xd6\x97\xd6\xc1\x5b\x59\x1f\xdb\xf5\xb1\x39\xec\x8e\x5f\x40\x82\x4d\x66\x05\x8e\x82\xa4\xa8\x33\xd2\x0e\xfb\x1b\xe6\x89\xce\x0b\x8f\xdb\xc4\x5c\xf2\x24\x65\x65\x72\xc7\x78\x72\x57\xbf\xac\xc0\x00\xec\xa9\x7a\xe7\x2c\x0c\x36\x9a\xd1\xb9\x89\xa5\x2f\x6a\x0f\x5c\x9a\xfd\xdf\xa1\xf0\xd0\xb5\x3b\xd9\x76\x77\xe0\x99\xe0\x9c\x49\x6a\x8a\xa8\x40\x03\xe6\xd8\x9a\x11\xb0\xc0\x14\x19\xc9\x00\xf8\xd2\xbc\x50\x60\x3a\x7e\xda\x42\x29\xcc\x26\x7f\x40\x3b\xb4\x33\x8d\xcc\xe3\xc0\x43\xea\x56\x11\x9e\x56\xe3\x89\x2d\x25\xc7\x75\x60\xea\xa3\xda\xc1\x1f\x7f\x5e\x0e\xc2\x18\xa9\x24\xc2\x81\xf6\xd0\xf4\x0f\xd1\x2d\x51\xc8\xd3\xff\x94\x8e\x19\xc2\xc4\x1c\x41\xd5\xd8\x75\xbb\xf0\x79\x4c\x46\x02\x66\x0a\x79\xeb\xae\xea\xfa\xe7\xd9\xd8\x8e\xdf\xd1\xc8\x34\x90\x8a\x5f\xce\x9d\xf9\x8e\x3a\xc2\xd0\xeb\xb2\xfa\xf7\xb1\xf9\xd8\xcb\xc3\x20\x2e\x61\x2c\xa7\x4a\x11\x75\xfc\xb8\x87\xb6\x3d\xe5\x5f\x8c\x4d\x0b\x8c\x0f\x3b\x94\xf7\xb7\xe3\x5e\xfa\xab\x20\xe2\x0a\x91\x92\x3f\x16\xcb\xed\xfd\xec\x8f\xe5\xfd\xf3\xfd\x76\x31\x5b\xdd\xfd\xf9\xf4\xbc\x9a\x7f\x9b\xad\xfd\x02\x06\x16\x69\xc4\xe8\x1e\x76\xf2\xa2\xdc\x42\xdf\x45\x10\x30\x81\x50\x18\xfd\xa1\xb4\x78\x79\x79\x9a\x92\x03\xf6\x1d\xd3\x82\x39\x08\x37\xa5\x69\x2e\x65\x36\x81\x29\xc9\xb5\x57\x69\x38\x31\x7d\xf7\x2d\x96\x24\x08\x5a\xe8\xbe\x23\xfc\x92\x68\x88\x8e\x43\x15\xf4\xf1\x18\x03\x17\x4c\x91\x26\x7b\x07\x55\xa0\x06\x02\x9e\xda\xdc\xe1\x3d\x88\x5a\xe2\x82\xca\x8c\x8d\x40\x18\xe6\xe5\xe1\x16\x95\x19\x6c\xd7\x20\xac\xb5\xb9\x0f\x0c\xfc\xa8\x27\xd1\x5a\x88\xa3\x34\xe5\x83\xdc\xea\x25\x34\x30\xc4\x5c\x7a\x75\x25\xef\x94\x0d\xa2\x7c\x77\x60\xc3\x8b\xc7\x3a\xb6\x4e\x7d\xe2\x56\x76\xf0\x2e\x3f\x96\x93\x1f\x4c\x44\x8c\xeb\xbf\xf7\x1d\x5f\x9a\x13\xf0\x12\x12\x00\x44\x91\x96\xba\xe6\xdd\x00\x1e\x0c\x29\xcb\x08\x05\x49\x19\x12\x80\xff\x0e\x62\xfe\x03\xaf\x07\x52\xcd\x11\x5e\x34\x9f\xad\x87\x4b\x11\xb2\xb4\x70\xb0\xa3\xf6\xb8\x87\xf5\x7b\x38\xb5\x21\xd3\x96\x09\xcf\x3b\x89\x21\xe2\x59\xd9\x98\xa6\x3e\x9c\x03\xc8\xdd\x15\x79\x6a\x0b\x97\x05\x43\xc6\x9d\x1d\xc9\xbd\x8f\xdf\xb1\x48\x0a\x3c\x90\xa8\xa4\x57\xee\xa6\x46\x12\xc8\x88\x04\xdf\x5b\x57\xa8\xcb\xc9\xd8\x1a\x8f\xba\x8c\x85\x90\x6e\x4b\xc3\x30\xa9\x2d\xc1\xf4\x87\x4e\x05\xcd\x3c\x30\x49\x7c\x5a\xa8\x08\x32\x56\x68\xb5\xa0\x4a\xbc\x37\x31\x40\xf1\xc2\x2a\x4f\x46\x81\x58\xec\x51\x50\x13\x54\x26\x32\x5f\xdf\x40\x19\x7b\xcf\xb4\x15\x7a\x68\xf0\x15\x10\x8b\x2a\xb0\xec\x80\x8e\x84\x0c\x56\xe8\x0f\x28\xd7\xf5\x2e\xfc\xa8\xce\x62\x24\x1a\xfc\xbe\xd8\xac\x66\xe1\x8f\x45\x8c\x3c\x24\x60\x5e\xe0\x09\x9a\xa0\xc1\xea\x9b\xa5\x21\xbe\xa2\x7a\x7f\x68\x8e\xa0\xe4\x65\x2a\xb1\xbe\x1f\x66\xc2\xdf\xea\x0e\xd6\x6f\x87\x48\x0c\x67\xbf\x89\x78\x41\xfa\x78\xea\x48\x81\xbd\xf1\x18\x19\x16\x63\x7d\x45\x53\xbe\xbc\x76\x45\x32\x6d\x55\x99\xb6\x81\x96\xb4\x37\x8a\x66\xfd\x50\x6d\x11\x04\xbd\x5d\x9a\xed\xcd\xb4\xf8\x14\x20\x33\x96\x07\x31\xcd\x1f\xe5\x24\xe0\x02\x36\x23\x16\xa0\x9b\xb2\x7d\x3d\x21\x6e\x6d\x64\x01\xb3\x2e\xc4\xb1\x40\x47\xe3\x7e\x0f\x95\xc1\x08\x71\x73\x1e\xb9\xb1\x9c\x09\xca\x5d\xf5\x4f\xce\xb3\x69\x6b\x1e\x61\x10\xac\x6c\x1f\x71\x02\x4e\x9a\x85\xe5\x3a\x1f\x63\x37\xc6\x1d\xe2\x98\x08\xbd\xfa\xc3\xaf\x01\xd9\x1e\xa7\xa7\xb4\x8d\x53\x81\xd0\x8a\xf6\xb5\x3e\x7c\x83\xdd\x3e\xa0\x02\x6c\x22\x00\xdc\xe4\x26\x7d\xd3\x69\x89\x47\xf8\x3c\x36\x91\x16\x83\x31\xc1\xb4\x79\x54\x9d\x2c\x2b\x30\xb3\xfb\xe5\x7a\xf2\x48\x99\x32\x68\x9c\xdf\xf5\x66\xf5\x50\xe1\xd4\x46\x36\xcf\x48\x7d\x07\xff\xd8\x3b\x1a\xf5\xd1\xd1\x51\x5d\x28\xff\xf4\xd7\x48\xeb\x09\xde\x9f\x9c\xcc\x0e\xd2\x68\xd2\x0e\x78\x7f\xdc\xcd\xeb\xdd\x4e\x76\x54\xfa\x72\x71\x85\xd9\x5c\x91\x18\xb8\x82\xee\x8f\xc4\x3f\x4b\x91\x66\x88\xa3\xd0\x12\x4d\xda\x73\xae\x9f\x93\x47\x65\x0b\x99\xe1\xc1\x67\x3c\x84\xf7\xd1\xfa\xdb\xc8\x24\x91\xce\xfc\x58\xef\xca\xc3\x41\x4e\x6b\x0a\xad\x8a\x05\x86\x05\xfa\x27\xac\x5e\x70\x4e\x5e\x4e\x72\x58\x95\x83\xf5\x25\x5d\xef\x2e\x2c\xf8\x59\xec\xc8\x2a\x9d\xd3\x3e\x5c\x99\x65\x65\x77\xe8\x88\x3a\xed\x74\xff\x6c\x0a\x38\xc4\x27\x5c\x96\xdb\x33\x43\xab\x35\xb8\x6f\x75\xc8\xdf\xe6\x77\x0f\x44\xca\x84\x41\xd2\x2c\x16\x0e\xca\x60\xc0\x07\x53\x3f\xab\x9d\x3d\xfb\xff\x5f\x22\x55\xad\x4e\x95\x0e\xd4\x47\x93\x20\xa2\xd5\x3a\x45\x6e\xf4\xc3\xb9\x91\x30\x19\x34\xa3\xc8\x5c\xd1\xb2\xc2\xa9\xf4\xe3\x44\x0a\x66\x8d\x4e\xbd\x11\xbb\xac\xde\xf8\x64\x69\x18\x4b\x2a\xea\x13\xec\xa6\x05\x41\xca\x0b\x7b\xe8\xe4\xd5\xb1\xa9\xe6\xb2\x51\x75\x75\xdd\x4f\xb3\x73\xd2\x8c\x11\xfa\x79\xf2\x86\x00\xcc\x3a\x0b\xd9\xf1\xed\x7e\x1d\x63\xb6\x00\x16\x39\x5c\x30\xac\xe6\x45\x35\xcf\x7f\xe1\x93\x7a\xb2\xde\x45\x40\xd0\xe9\xdd\x51\xff\xd4\xaf\xb0\xff\xf8\x84\x76\xd3\xda\x54\xea\x78\x10\xcb\x3e\x25\x5b\x46\x0f\xe6\x64\xa8\x2c\x8b\x22\x66\x73\x3d\x30\x3f\xc6\x52\xa9\xc3\x9b\xb3\x88\xc5\x82\x24\x8e\xb1\xa2\x1f\x93\x54\xcf\x67\x84\x3c\xa3\x17\x67\x11\x4b\x89\x13\x62\xaa\x90\x92\xff\xe6\x3b\xb8\x32\x45\x55\x1f\x5f\x5e\x3b\x2f\xfb\xd1\x37\x28\x4e\x2a\x60\x87\x43\x8b\xdb\xfd\x80\xb7\x85\x45\x42\xc5\xc8\x00\x48\xa1\x95\x7b\xf9\xcb\x1d\xa2\xe3\x5f\x8f\x75\x2e\x5c\x7d\x01\x6e\x2d\xde\x11\xb8\x95\x97\x0d\x68\x16\x25\x5c\xda\xc4\xf9\xcd\x5e\xdc\xef\x62\x45\x02\x8b\x12\x5d\xe4\x8e\xd5\x6e\xab\x29\xe2\xb9\x95\x8d\x2a\xbb\x76\xbb\xf7\x46\x37\x8b\x12\xe0\x18\x06\x7f\xfa\xbe\xd8\xce\x1f\xef\x9f\x16\x0f\xeb\x01\x24\x9b\x45\x69\x1e\x23\xfb\xca\xc1\xc7\x60\x59\x94\x45\x91\x76\x3b\xfb\x71\x67\xfc\xe2\xbc\xf6\x95\x64\x2c\xca\x1c\x79\xe7\x0b\x74\xdf\xa1\x29\x6d\x49\xa9\xbb\x81\xc0\xfb\x00\xc0\xef\xaf\x29\x88\xd6\x4c\x1d\x3f\x36\x43\xc1\xe4\xf1\xeb\x67\x2a\x81\xcc\x4b\x2b\x23\x34\x76\x60\x56\x33\x94\x2a\x18\xa6\x4a\xbe\x72\x09\x59\x54\x24\x2c\xd3\x8e\x6a\xf5\x45\x76\x60\x36\xbf\x7a\xaf\x09\xda\xe7\x16\xc6\xf1\x0a\x16\x15\x69\x8e\x01\x73\xd9\xb6\xd0\x74\x8b\xff\xfc\x16\xd0\x7f\xff\x18\x77\x94\x31\xd1\x50\xfe\x98\xdd\xdd\x2d\x36\xdb\xa7\xd9\x6a\xf3\xb0\x58\xf9\x07\x94\x59\x56\xf8\x0a\xea\xe3\x49\xbe\xe6\x1f\xe3\x2f\x27\x8b\x1c\x7d\x6e\x8f\x88\x74\xf4\xe5\xcf\x94\xfd\x6f\xc3\xcd\x80\x48\xb8\xb6\x5b\x53\xbe\x6c\xbb\x57\xa8\xb6\x87\xe0\x46\x0c\xdf\x7a\x38\xce\x5a\x52\x4e\x15\x57\xfa\x45\x4a\x49\x16\x69\x25\x30\xb9\xfe\xa8\xfe\xed\xdd\xc5\xbf\xe4\xef\xe8\xaf\x4a\xd0\x8a\xa6\xd8\xd2\x54\x68\xf8\xf2\xf2\xd3\x90\xe9\x38\xe4\x3e\x9b\x71\xba\x74\x74\x77\xc3\x8c\x27\x84\x7c\xae\x54\x8d\xe1\xed\x01\xc1\xb7\x4b\x35\xb3\x08\x12\x0d\x2a\xd0\xbe\xfb\x2a\x79\xbf\x9d\x80\xd6\x94\xa8\x7e\x95\x65\xb5\x2b\xab\x9f\x03\x2b\x81\x45\x56\x42\xea\x6c\xb3\xbb\xbb\xef\x5b\xe8\x37\x02\xce\x7e\x1b\x3d\x87\x35\x36\xd1\x03\xed\x0c\xaf\xb0\x4f\xcd\xfd\x3c\x46\x8b\xd0\xc9\xc1\x7d\x1c\x26\x9b\x14\x8b\x94\x32\x4e\xfc\xf8\x78\xf0\x8c\x16\xfe\x6a\xc6\x01\x83\x31\x07\xf9\xf1\x27\xc8\x66\xf7\xf1\x3f\x52\xff\x3c\xd4\x93\x95\xcd\x58\x42\xb4\xdc\x3e\xfa\x76\xbf\x5e\x5e\x5e\x2f\x8c\xf7\x1e\xf7\xff\xfa\xff\xfe\xd7\xed\xff\xdc\x2f\xfd\x8f\x08\x4d\xd2\xcc\xa5\xae\x37\xaf\x0d\xb4\xaf\xf5\xce\x60\xd8\x87\x85\x1e\x36\x8b\x08\xac\xf4\x56\xb6\x75\xf3\xe1\x45\x80\x06\xb0\xda\xbe\x93\x93\x2e\x6e\x8e\x70\x5b\x9b\xf0\xf7\x38\xd6\x68\x31\x7f\x9b\x90\xfb\x30\x16\x27\x19\x77\x20\x64\x3c\x30\xa1\x79\x92\xbe\x62\x89\xb1\x38\x53\x72\x48\x88\xbf\x22\x0c\x97\x6f\x4e\x52\xed\x23\x7c\xce\xed\x20\xc7\x39\xb4\xdb\x88\xc4\x41\x5f\xcb\x0e\x09\xe3\xd7\x70\x2e\x46\x68\x19\x4b\x23\x83\x9b\xd7\x20\x38\x37\xa3\x9c\x73\xf7\xf1\xdb\x85\x22\x38\xc6\x52\x4e\x82\x05\xf3\xe6\xe3\xd0\xd5\xce\xda\xf5\x1b\x3d\x4b\x33\xc0\xa8\x82\x93\xa5\x42\x8c\xc1\xd2\x3e\x00\x98\x89\xd7\xc7\x58\x9a\x03\x63\x27\x5d\xd9\xfb\x5a\xa1\x12\xe5\x84\x96\xe7\xb3\x54\xc1\x70\x16\xb2\x4c\x14\x88\xf4\xa4\x68\xb2\xb9\x69\xea\xfd\x2d\x91\x6f\x5e\x50\xa2\xf4\xd7\xc4\x89\x63\x5c\xed\xe4\xee\x5b\xbd\x0b\x28\x79\xc6\x32\x4d\x94\xd6\xd8\x44\xe0\x5e\x30\x27\x46\x79\xcb\x58\x2e\x00\xdd\x12\xbf\xff\x45\xa3\x1a\xac\xd1\xf6\xc1\x72\x88\x53\x57\xa3\x4a\x3c\x19\xdf\x97\x57\x8b\x3f\x3e\x79\xaa\xdc\x66\xbe\x4c\xfb\x1a\x19\xeb\xf0\x15\xd0\xbd\x6e\x2f\x52\x1b\x31\x56\xc8\x38\x27\xa9\xb5\xe7\xaa\xfc\xd5\xf9\x1c\x57\xa8\x79\xff\xe4\x7f\xc3\xd5\x46\x7a\xf4\x0b\xc8\xfd\x68\x75\xb3\xc2\x6a\x49\x09\x8e\xfb\xb2\xea\xa4\xda\xc1\xc3\xcd\xc6\x8f\x81\xcc\x0b\xfc\x7e\x92\x56\xed\xe6\xd7\x38\xc8\xc2\x98\x2c\x32\xa4\xe8\xb9\x0f\x7a\x1f\xe1\x52\x2b\x90\xb5\x78\x71\x1c\x92\xf9\x5b\xc6\x54\xa1\x90\xb8\xfa\x66\xf5\x84\x01\xe8\xd3\xdf\x2d\x3a\x60\xb0\x2f\xbf\x8a\xa8\x31\xa6\x1c\x9c\x6c\xeb\x98\xb8\xbf\x9d\x88\x43\xfc\x1b\x2b\xc8\xb4\xa7\xb7\x1d\x93\xb5\x85\x45\xab\xb9\x26\xd5\xad\xcf\xa9\x9f\x27\xab\x42\xc7\x71\x3e\x20\x8b\xeb\x67\xe0\x88\x4a\xfb\xa2\xa1\xd9\x5f\x96\x5a\x52\xd0\x7b\xdf\x76\xf5\x16\x01\x02\x52\x77\x28\x62\xb4\xc5\xe4\x95\x1e\xaa\xfe\xf6\x57\xe4\x06\xdd\xa5\x7f\x2d\x1e\xc2\x97\xd0\x56\x13\xf8\xa7\xd4\x3f\xc3\x0e\x61\x92\x08\xb3\x97\x87\x9d\xd4\xb0\x7d\x1d\x4d\x70\x93\x10\x21\x33\xd1\xb4\x4e\x03\x05\x93\x67\x34\x86\x38\x17\xde\x4a\x78\xbf\x2d\xdf\xe0\x77\xd9\xec\x65\x40\x40\x32\x06\x2a\x2a\x28\x83\x05\x4b\x5d\xcf\xa8\x74\x60\x70\x06\x80\x4d\x34\x81\xe7\x70\xdb\x1c\x7d\x0b\x9b\x19\x6e\x4e\x85\x3d\x57\xa5\xf1\x7a\x87\xd4\x81\x47\x11\xc3\x6d\xb0\x37\x82\xa0\x81\xe3\xfe\x57\x68\x89\x8d\x4a\x4f\x97\xfa\xa3\xc1\xb7\xe6\x12\xc3\x78\xfd\xd6\xf9\x03\xe0\xe7\xee\xc3\xd5\x87\xfb\xf6\x22\xc3\xbc\xef\xfc\xdb\xe2\xe1\x7a\xe1\xff\xca\x12\xc3\x93\x01\x79\xca\xa5\xcd\x86\x73\x30\xce\xd7\xaf\xcc\x76\xef\x22\xb3\x97\x0e\x69\x2e\x84\xca\x8a\x01\x7d\xe8\x1e\xae\xa0\x7b\x07\x40\xa0\xe6\x64\xb5\xf0\x38\x2b\xa4\x3b\x49\x4f\x21\xd6\xdc\x37\x4a\x11\x45\x5e\x15\xfb\x83\x02\xe3\x61\x13\xe7\x31\x10\xc6\x61\xb1\xb9\xf6\x6f\x92\x24\x29\x32\x0f\x54\x75\x57\xda\x8f\xa9\x64\xd7\xe7\x62\x2d\xfd\xa5\x79\x62\x93\x01\x2b\xde\xf7\x7a\x77\xdc\x83\xab\x26\x2c\xcf\x9e\x3b\x65\xcc\x52\x12\x70\xcc\xa0\xdd\xb7\x58\xcc\x9a\x11\xed\xe8\x89\x87\xd1\x35\x67\xdc\x62\x7d\x00\x85\x06\xdb\xee\xf4\x71\x32\xc1\x73\xe9\xf7\x5f\x5c\xee\x93\x0a\x4a\xc6\xb3\x9c\x23\x14\x60\xf1\xf4\xc7\x88\xe4\x9b\xf1\x0c\x12\x44\xb1\xde\x1d\x2b\xfd\x8a\x5a\x40\xbe\x25\x8f\x34\x77\x76\xf8\x7c\xfe\x8d\xec\x19\x0f\xba\x62\x3c\xcf\x24\xee\x56\x8b\xee\x75\x5f\xff\xdb\xef\xf4\xbc\xd0\x89\xf1\x10\x7a\xa8\x60\xad\x4b\xa8\x34\x8c\xf0\xb5\x8c\x4b\x96\xe4\x43\x51\xc3\x6b\x78\x1b\x32\x2e\x63\x07\xe4\x0e\x78\x05\x79\x28\xed\xc7\x6f\x3e\x99\xee\x9b\xb5\x46\xbc\x94\x03\xb4\x3e\xd5\xd5\x47\x6f\x7a\x7f\x56\x90\xcf\xb8\x12\x54\x20\xb1\x86\xaa\xbb\x01\xd8\xd4\x41\x21\x68\xd2\x2f\x8d\x30\xbc\xb6\x59\xcc\xee\xb7\x4f\x8f\x8f\x77\xdb\xe5\x83\x2f\x58\x66\x5c\x47\x05\xd2\xde\x9c\xc8\x0f\x68\xfa\x6e\x67\xa3\x63\x80\xeb\x3c\x43\x23\xf2\xb0\x93\x95\xd3\x80\xb9\x20\x3f\x6d\x19\x37\x2c\xd1\xc2\x5b\x62\xef\x93\x8a\x1c\xdf\x47\x90\x34\x95\x43\x76\xd2\x34\x1f\xd6\xba\x0f\xfe\xeb\xab\x69\x6a\x8c\x21\xe6\x8e\x50\x7e\x7c\xf9\x99\x20\x01\x3c\xc3\xfc\xb7\x41\x4b\xe7\x44\x6a\x7e\x79\x63\xe6\x36\x89\x51\x9f\x54\x6a\xdd\x1c\xc1\x17\xf8\xb4\x7f\x03\xe6\xc7\xb8\x4d\x0b\xdc\x45\x1e\xea\x9f\xc7\x9b\x9d\xec\x9e\x76\xf2\x53\xe6\xf2\xf1\x31\x22\x22\x46\x7c\x16\xbe\xd2\xc1\xd7\xf5\x5c\xfc\x21\x11\x15\x64\xce\x7a\xc3\xf7\xeb\x2a\xec\xe9\xc5\x46\x26\xa4\x93\x0c\x50\xfd\x31\x3c\x85\x05\x8b\x18\xa6\xd5\xb7\xde\x15\x1c\x2f\x6c\xc1\x98\x44\xec\xe5\xe1\xa5\xbe\xaf\xab\xee\x75\xf7\xe1\x4b\xc6\x51\xd5\x31\xdc\x26\x13\x89\xf3\x1f\xbe\xcf\xff\xf8\x7a\xd0\x04\xcb\x34\x0e\xf8\xab\xdc\x75\x5b\x4f\xf7\xdb\x86\x5b\x15\x79\xe1\x2b\xaa\x4a\x5b\x56\xfd\x04\x1c\x3e\xb0\xcc\xf0\x94\xc0\x0a\xc5\x7e\x73\xf5\x0d\x3c\x92\x38\xff\xe1\x17\xec\x0f\x13\xc3\x49\x88\x2c\xc1\x4a\x17\x69\x8c\x47\x31\x92\x81\x75\x09\x40\xcc\x84\x28\x32\xd4\x8d\x59\xec\xa1\x91\x5e\x56\xfa\xf3\xc2\x59\x26\x84\xa4\xc2\x8a\x2d\xed\xff\x97\x97\xb2\x10\x5a\x60\x48\x07\xf5\x84\xaa\xee\x49\x36\x2d\x92\x4b\x38\xe2\x7e\xff\x26\x71\xce\x30\x02\x78\x5d\xfb\xfd\xee\xf2\x38\xc6\x05\x19\x90\xb4\xf1\x53\x4c\xb6\x7f\xde\x87\x3a\xec\xc0\x13\xa5\x8b\xfe\x9a\x02\x89\x37\xc0\xc9\xf2\x0f\x4c\xb9\xb1\x2d\x2b\x52\x99\x93\x48\x90\x1b\xaf\xcb\xa8\x16\x26\xb2\x88\xe2\xe9\x8b\xc7\xf9\xb7\xd1\x97\xca\xa2\x4c\x85\x0c\xd2\x2d\x74\x0e\x85\x3c\x7e\x9e\x2c\x07\xe4\x42\xfe\xe7\x51\x56\x7f\x8e\x2f\xd7\x1c\x23\x44\xd7\xeb\x87\x20\x74\xd5\xff\xd9\x30\x19\x22\x2c\xbd\x45\x37\x4e\xcb\x4d\x86\x28\x17\x19\x42\xf4\x67\x77\x4f\xa3\x9b\xe7\xb9\x45\xbc\xc8\xbe\x6b\x7e\x85\xbf\x59\x2d\x13\x67\xbc\x74\xbf\xd7\xbe\xb8\x8c\x89\x22\x21\xfd\xe6\x20\xd8\x70\x0d\x6f\x1d\x78\x4a\x28\x26\x8a\xdc\xe0\x8e\x7f\xaf\xd4\xe8\x47\xa4\xc8\x7d\x0d\xf9\xbc\xae\xda\x4e\x56\x61\xbd\x48\x95\x62\x55\xaa\xa9\x91\xba\xca\x41\x67\x27\x23\x2b\x8d\x50\x36\xb8\x3a\xb3\xdd\xee\x1b\x48\x73\x3a\x55\x85\x4a\x73\xf0\xa9\x0a\xb7\x8a\x7a\x73\xe1\xbe\x36\x30\x19\x65\x95\x93\xfe\x2f\x65\x77\x9f\x08\x62\x3a\x41\xe0\x30\xa1\x64\x2a\x0b\x0f\xa7\x20\xc3\xc4\xb5\x68\xc1\x10\xd8\xb6\x1d\xfa\x7a\x97\x32\xbf\x4c\xe8\xcc\x26\x59\xd0\x7f\x9b\xed\x76\xa3\x12\x96\xde\x05\xb7\x78\xf6\xbe\x43\x49\x7b\xd8\x6a\x90\x83\x63\x42\x17\x0a\xb7\xfa\x17\xa2\xbc\x19\xc0\x0e\x98\xd0\x32\x56\x2e\x84\x84\x74\x78\x93\x56\x9d\x62\x85\x9e\x3a\x7e\x3c\x3c\xae\x27\x03\x60\x18\x63\xd6\x95\x33\x35\x6d\x38\x89\x7c\x2b\xe7\xde\x4d\xb8\xaf\xcd\x71\x07\x57\x1f\x53\x36\x47\x26\x8c\xe6\x58\x2e\xfc\xde\x2f\xb2\xbd\xf4\x11\x6f\x26\xac\xa6\x38\xe2\xcd\xf2\xe1\x0f\xf7\xb7\x38\x4a\x48\xfa\x0d\x21\x71\xbb\xf0\x57\x45\xa1\xb4\xde\xdc\x82\x2a\x2c\xd2\xf1\xb3\xc6\xcc\x44\xc8\x1a\xe7\x29\x22\xb6\xd7\x8b\xf9\x6a\x31\x5b\x2f\x50\x9b\x72\xb1\xf9\x16\x82\x6a\x31\x67\x24\x45\xe6\x0f\xbc\x29\xed\x29\x8b\x45\xa6\x8c\xb3\x26\x87\x12\x7e\xbe\x15\x52\x2c\xbd\xc0\xcd\xd4\xcb\xc2\x4c\x6e\x60\x2d\x1e\x10\x4f\x4d\x6d\x87\xb3\x3b\x8e\xd3\x0c\xb3\xa5\xdf\x4b\x78\xbf\xff\x78\x22\xfc\x17\x92\xb3\x0e\x87\x2d\x8e\x73\x4a\xdf\x35\x74\xf7\x05\x9a\x02\x01\x65\xe7\x3a\x25\xae\x7c\x73\x8e\xc4\x9e\xa7\x10\xfa\xc5\x45\x1d\x27\x59\x8a\x38\x21\x0a\xa5\x18\x3c\x04\x3e\xe9\xa9\x25\x0c\xc8\x46\xba\xba\x99\x6a\xde\xf5\x9d\xac\xf5\xb6\xe2\xa0\x60\x72\x14\xf2\x89\xd3\x82\xaa\x66\x1c\xd0\x5e\x76\xe7\x08\x47\xd7\x33\x33\x80\x39\x57\x75\x6c\xb5\x6c\x66\x6d\x5b\x22\xd7\x9e\x1c\x8f\x4a\x66\xac\x70\xb1\xba\xed\xcf\xde\x0c\x93\x97\xce\xa1\xb8\x48\xa3\xcc\x41\x1c\x5c\x99\x2a\x6a\x2f\xb9\xb8\xdf\xb0\x30\x8e\xc5\x12\x18\x16\xc8\x90\x68\x89\xdc\x81\xdf\x13\x26\xf7\x54\x4c\x23\x60\xc6\x19\xa0\x4e\x00\x6e\x32\x26\xca\xe4\x88\x83\x69\xa0\x2d\x5f\xb0\xf6\xf2\xb6\xa9\x8f\xde\xf0\x8e\x15\x14\x81\x9b\x9b\x94\x71\x27\x3f\xa2\x65\xe6\x4d\x69\xc7\xc6\xef\x6a\xff\x7c\x35\xf3\xe5\x23\x2d\xd6\x32\xcf\x13\xe7\x60\xce\x1f\xf5\x19\x0b\x34\x8b\x0d\x8b\xb3\xb0\x19\xaf\xe5\x0e\x7e\x40\x79\x2f\x7f\x85\x66\xcd\xb2\x41\x50\xc5\x51\xf3\xcc\x8f\x8d\x1c\x88\x34\xb9\xbe\x50\xa4\xd6\x2d\xfb\x2b\x68\xbb\xab\x09\x4e\x97\xc5\xa0\x04\x46\xb8\xfa\x9f\x99\x23\x7f\x96\xab\x15\x76\xed\x36\xc9\xf1\x06\xb4\xad\x9e\x29\x0d\xf6\x3d\xa4\xc5\x1c\x8a\xa9\xab\x29\x29\x06\x8b\xad\x56\x18\xe9\x40\xed\x8b\x31\xae\x8f\xc5\xd6\xb9\xd2\xb8\x57\xc8\xce\xc1\x82\x9e\x9b\x71\x8d\x0e\x4b\xa2\x9c\x45\xfd\x88\x3d\xbe\x56\xe5\x5f\x87\xaa\x13\x96\xa7\x18\x89\x94\x55\xdd\x6f\xa1\x83\x42\x48\x96\x30\x88\x25\xd1\x05\xbc\x1d\x61\xf7\x36\x14\xdc\x60\x09\xe7\x26\xa1\x38\x82\x01\xd8\xf7\xe7\xcc\x5b\xb9\x6b\xcb\x89\x3a\xb8\x65\x89\x10\x05\x9e\xdb\x57\x0f\x9b\x01\xf1\x0f\x4b\x84\xa1\x2d\xf1\xea\xd8\x54\xc7\xc3\xb7\x7a\x87\xd5\x8f\x48\xa6\x8a\x41\x99\xda\x6f\x93\x49\x9c\x52\x68\xfc\x07\xec\x7a\x23\x70\x39\x7f\xfc\x7b\x26\x75\x92\xf2\x0c\xd9\x2b\xf6\x65\xd5\xd1\x42\xf9\x0c\xe9\xc5\x92\xd4\x00\x7a\x95\x7b\x94\xa1\xa2\xd5\xfe\x68\x27\xef\x92\x71\xc8\x8c\x57\xfe\xac\x71\x7b\xf3\x0f\x99\x09\x8e\x87\xd1\x6a\x31\xbb\x0b\x7f\xd3\x49\xac\x82\x3a\x56\xdd\x10\x46\xef\x0a\xb1\xbe\xfa\xf5\x4c\x72\xfc\x92\xaf\x93\x64\x20\x91\x6e\xc4\xd6\xcd\xcf\xb1\xeb\x99\xe4\x71\xe2\x33\x82\x5e\x76\xbc\x32\xf5\x3b\x5a\x0e\x17\x37\xa3\x24\xcf\x69\x7f\x77\x3f\xb8\xa9\x7d\x74\x60\x53\xbb\xe0\xcb\xfa\xd0\x94\x7f\x91\x23\xed\x6f\x43\xe6\xc3\xc0\xd0\x70\x67\xef\x27\xfd\x21\xce\x02\x91\x4d\xfd\x31\x97\xfb\x83\x2c\x5f\xaa\xf1\x0c\x4f\x0a\x50\x58\x1a\xf7\xfb\xf7\xf9\x68\xa6\x15\x56\xe4\x36\xc0\x03\xf5\xcf\xd6\xfb\xed\x89\x64\x0a\x01\xd4\x04\x77\xaa\x9b\xcd\xc9\x08\x4b\x64\x5a\x60\x14\xe4\x8d\x44\xf9\xdc\xd6\xe7\x1b\x0b\x09\x9e\xb1\xe4\xfb\x53\x3f\xdd\x50\xbc\x2d\x8c\xac\x84\x24\x75\x04\x0f\x8b\xaa\x9b\x00\x3a\x58\x22\xad\x44\x74\xba\x3d\xdc\x1f\x77\x4b\x07\xd7\xfd\xc7\xe8\x95\x15\x57\x66\xc0\x13\x7e\x5f\x56\x9d\xa3\xf1\xbc\x3c\x44\x0a\x40\x3b\x0e\xd8\x87\xde\x5e\x1b\xc6\xe3\xc2\x08\x29\x9b\xf9\xaa\x04\xac\x2c\xa6\xc8\x1e\xce\xec\x21\xfd\x01\x4b\xb4\x94\xb2\x08\x84\xdb\xd7\x67\x5b\x4d\xa2\x2d\x60\x14\xf0\xf7\xd5\x8f\xcd\x76\x34\xda\x26\xcb\x06\xd2\x77\xf7\x60\x4a\x59\x95\x53\xd3\x30\x01\x21\xfd\x56\x79\x2f\x3b\xfd\x3a\x23\x46\x89\xa5\x99\x51\x8c\xe0\x93\xf9\xd7\xef\xe8\x88\xdc\x1b\xf3\xb0\xb1\xc4\x72\xa2\x9d\x53\xc8\x22\x88\xa0\xff\xd0\x94\xa4\x32\x73\xc0\x97\xab\xb2\x7a\x71\xb5\x47\x2c\x8d\xf2\x74\x70\x06\x3f\xb7\xd0\x38\xc0\xdf\xdf\x61\x1b\x1e\xfc\x17\x95\x32\xb8\x9b\xb2\x88\x21\x46\xb5\x82\x5f\xdd\xf6\xa5\x7c\x03\xf9\x1e\xb2\xb9\x29\x4f\x12\x11\x8f\xd8\x84\xa9\xec\x66\xf4\x92\x29\xcf\x22\x8c\x84\x7c\x5f\x6e\x02\xaa\xed\xaf\x1c\xf3\xe9\x46\xf6\xbf\x79\xe4\x9f\x88\xeb\x44\x9e\xca\x15\x35\xb1\xe3\xfd\x0c\x16\x72\x2a\xb2\x54\x0c\x03\x50\x57\xfd\xf7\xf8\xed\x2c\x90\xe2\x7a\xc7\xb1\x4a\xdd\x9e\x71\x23\x8f\x1a\x42\xe0\x3b\x4d\x45\x8e\x81\xef\xe7\x16\x76\xd0\xb6\x2e\xd3\x85\x34\x89\xbe\x47\x22\x31\x19\xfb\x00\xef\x03\x35\xfb\x4f\x03\x8b\xe3\x51\x49\x8d\xc6\x83\xa6\x3f\x55\xc7\x11\xd3\x49\xc7\x8c\xa9\xc4\x6d\x2e\x44\xfd\xbd\x3a\x69\xd5\xb0\x34\xcb\x33\xa5\x5d\x81\x69\x6f\x86\xcc\x3f\x55\x24\x63\x69\x56\x44\x45\x32\xc6\x15\xbb\x1d\x74\x28\x14\xe6\x3b\x9b\x14\x3b\xb7\x52\xcb\xe6\xba\x96\xba\x0e\x21\x88\x34\x8f\x39\x02\x9f\x1f\xdf\xab\x21\x61\xb6\x6f\x4d\x39\x22\x46\xbe\xd5\xa6\x6e\x46\x66\x5d\x9a\x67\xd2\xe5\x67\xfa\x79\x80\x05\x42\x1e\x6f\xcd\xd2\x22\x56\xc2\x0c\x8a\x35\x5b\x90\x8d\x7e\xbd\xbc\x3f\xa4\x2a\xa5\x24\xc3\x8b\xdc\x03\x82\xf6\x4d\xfd\x5e\x4d\x1e\x44\x15\x31\x72\xd8\x20\xc9\x60\x63\x6e\x64\xb9\x03\xf3\xb8\x33\x78\xa8\x07\xe7\xe2\x93\xfb\x1b\x85\x9c\x6c\xb8\x5d\xf6\xfb\x05\x95\x66\x47\xd8\xad\x08\x5c\x56\xa7\x69\x75\x3c\x55\xd0\xe3\xd5\xb4\xdf\xb4\xf3\x63\xdb\xd5\x7b\x68\xca\xea\xea\x0e\x4b\x59\xce\x6a\x3a\xdd\x25\x3a\xa1\x42\x25\x14\x1d\x6a\x6e\x8f\xa5\xb7\x2f\x2e\x3f\x9f\x29\x24\x22\x95\x7e\xbe\x4a\x55\x8e\xdc\xea\xd4\x58\x85\x46\x3d\x69\x44\x4e\x98\x15\x5d\x1f\xc8\x62\xe9\x60\xd9\x7e\xef\x39\x77\x19\x53\x5b\x28\xb4\x69\x7a\x1b\x17\x7c\x60\xc8\x4b\x3c\x7c\x19\x3f\xbf\xcc\x7d\x31\x79\x65\x2b\x53\x4c\xcc\xba\x22\x23\x2a\x8d\xc0\x0a\xab\x69\xbf\x22\xa1\x6d\x46\x1d\x5f\xb6\xbd\xc9\xfd\x5f\x58\x01\x46\x04\x6d\xf9\xc9\xd6\x9a\x45\x91\x2d\x62\xaf\xd4\x6d\xeb\x1b\x36\xbe\x69\x16\x09\xc3\xe3\x70\xa4\x95\xdd\xc7\xb4\x5d\xe7\x18\x56\xb6\x72\x0f\xc8\x3e\x3e\x36\x36\xb2\xde\x3c\x76\x02\xae\xc3\x14\xf8\xc5\xaf\x95\xf5\xb6\xac\x26\x3a\x57\x12\x4e\xe8\x00\x36\xf5\xbd\x3c\xcc\x2a\x83\xc7\x15\x41\xc5\xc7\x4f\xc0\x64\x26\x86\x21\x4d\xec\xb3\x3d\x47\x7b\x85\xe4\x47\xc6\x14\xa1\xf3\xdf\xa0\x31\xa5\x76\xbe\xe4\x44\x50\xdd\x75\xe5\xbd\x6d\x3e\xae\xa2\x39\x27\x19\xeb\xbb\xe5\x18\xa1\xfe\x77\x7f\x56\x7f\x10\xbb\xc4\xf8\x29\x05\xa3\x8a\xde\x63\x45\x85\x28\x17\x03\x86\x99\x48\x0d\x16\x2b\xec\xb7\x06\x65\xaf\x06\xd0\x9c\x4c\xe4\x1c\xcd\xea\xf5\xf3\xd3\xd3\xdd\x9f\xdb\x9b\xc7\xd5\x76\xb5\x58\x2f\x56\xdf\x17\xa1\x47\xa1\xe5\x10\xd5\x80\xe9\xc4\xc7\x8b\x4a\x4b\x2c\x8b\x23\x46\xf5\x43\x55\xd9\x6d\xf7\xc7\x5d\x57\xd6\xef\xd5\xa7\x8c\x35\x2c\x8b\x93\x58\x45\xb4\xcf\x37\x54\x1d\xe6\x96\xba\x6f\x4f\x89\xe6\xe1\x3b\x66\x48\xfd\x23\xc5\x4a\xa0\xc1\x40\x6e\xec\x75\xad\x8f\xbd\x99\x59\x3f\xd5\xcd\x72\x72\xfe\x65\x09\x4b\x51\xb8\xa3\x7d\xad\xdf\x57\xc8\x9a\x41\x21\x32\xaf\x28\xc3\x42\x47\x1e\x41\x12\x4c\x8d\x20\x6e\x3a\x62\xf5\xf1\x5d\x05\xc9\x35\xb5\xc7\x43\x7f\xc3\x36\xc8\x27\x4f\xbe\x5f\x02\x14\xb2\xea\xb7\x7c\xd2\xc7\xf2\x2f\x90\x72\x22\x30\x51\x95\x22\x1e\x94\x91\x3e\x1a\xcb\xd2\x44\xe1\xe6\x49\x7c\xdd\xc3\x33\xdb\xdb\x06\x59\xc6\x34\x1a\x29\x57\xcf\xab\x87\xd9\xd5\xdd\x62\xfb\xfc\xb4\xdd\x78\x3b\x25\xcb\x20\x17\xc4\xc2\x9f\xf2\x45\xa5\x6b\x33\x95\x9c\x63\x59\x66\x35\xce\xae\xa7\xba\xa9\xd6\x1a\xaa\x91\x47\x95\xe5\x4c\x23\x48\x95\xbc\x47\xb2\x16\xb1\xfe\xe8\xf2\x1a\x2b\x64\x9e\xc2\x20\xfa\xb5\xa1\x74\xba\x4f\xa2\x0e\xe6\x7e\xa1\x53\x20\x78\x78\x65\xcb\x66\x4f\x06\xc2\xf4\xe5\x0a\x5b\xa0\x45\x77\x90\x4d\x0b\x7a\xde\x80\x29\x4f\x5c\x69\xae\x8f\x64\x16\xd3\x83\x57\xb3\xdb\xed\x66\x35\x7b\x58\xdf\x2c\x56\xdb\x9b\x45\x98\xb7\x52\x68\xf4\x77\x6e\x36\x6b\x9f\x68\xca\x14\x33\xa8\x3b\x77\x25\xf5\x5c\x36\x32\xfc\x39\x51\x38\x0b\x09\x45\x81\x36\x64\x59\xbd\xf8\xd8\xe0\xe5\x2d\x4e\xa5\xa6\x50\xc4\x89\x2a\x3f\xe6\xf7\xf3\xcd\x65\x24\x68\x98\x0c\x4a\x32\x2c\xab\x75\x36\xf8\xd5\xc7\x54\x68\xfb\xf2\xc0\x6a\xe7\xb5\x6d\xa0\xed\xee\x4a\xf5\x5b\xf8\xb3\x41\xc1\x9c\xeb\x87\xfb\xb9\xff\x9b\x61\x39\x5a\x53\x81\x3f\x69\xb7\xc3\xbc\x17\x5a\x26\x93\xc1\x83\x98\xec\x2b\x0c\x7f\x7f\x7d\x1a\x67\x96\x17\xc6\xc5\x79\x6e\xeb\x9d\xe9\xcf\x88\x35\x34\x81\x5f\x95\x65\x56\x68\x8c\x7a\xcf\x9e\xe7\x18\x12\xfc\xf1\x6d\xf1\xb0\x7d\x5a\xac\xe6\x8b\x87\xcd\xec\x76\xb1\xbd\x7b\xbc\x5d\xce\x89\xf3\x60\x1d\xae\x49\x2d\xa6\x56\xa1\xd5\xf2\x00\xfd\x99\x16\x56\x47\x1e\xa5\x92\x3b\x7b\xfe\xb9\xf2\x11\xfe\x7e\x87\x68\x43\x8f\x2c\x26\xa8\xb2\x0f\x7a\x8f\xe8\x25\xfb\x76\x10\xc9\x30\xa4\xec\xe5\x3b\x07\xb9\xec\x9c\xa5\x29\x42\x8e\x36\xab\xd9\xf5\x62\xbb\x5a\xfc\x98\xad\x7c\xda\x3a\x67\x4a\xe4\xb9\x2f\x22\xeb\xe4\xee\xc7\x67\xc8\xc5\xf1\x11\x3b\xf0\x95\x73\x66\x45\x41\x7b\x33\x72\xfa\xd3\xe1\x3e\x49\x42\xe6\xdc\x18\xa1\x4e\xcc\xba\x74\x8e\xc5\xa4\xde\x3d\xe9\x2a\xe2\x84\xeb\x49\xd7\x4b\x75\xe7\x2c\x17\x89\xc1\xca\x5a\xb2\x41\xfe\x86\xf2\x04\xcb\x45\x2e\x59\xe2\x98\xc3\x6f\x48\x1d\xe3\xda\xfb\x15\xa7\x98\x52\x2e\x72\x0b\xee\x5c\x5f\xfc\x3a\x60\x22\x9c\xc2\x8d\x93\x49\x3c\xaa\xce\x9e\x04\x37\xf2\x24\x92\xa1\xc2\x6e\xa0\x9d\xe7\x5a\xd3\x88\xb1\x80\x30\x3f\x3b\x44\xc7\x43\x92\xb2\x0c\x89\x5b\x7b\xff\xc8\xe3\xd5\x37\x9b\x7b\xbc\xeb\xd2\xa4\xe1\x96\x05\x95\x83\x2c\x4d\xbd\x3b\x15\xb6\xb1\x3c\x95\x29\xe6\x47\xfd\xc9\x46\xae\x77\x77\x3a\xdb\xa6\x21\x91\x4b\xe0\x8a\x3c\x55\x04\xae\xe8\x0f\xf3\xf2\x17\xec\x4e\x6a\x65\x63\x6a\xa7\x7e\x75\xa6\x99\x3d\xc9\x9f\x9e\x1b\x06\x79\x6a\xb2\x0c\x4e\x74\xae\x97\x11\xc4\x79\x16\x01\x26\x3c\x3c\x24\xe7\xa6\xac\xe4\xae\xfc\x6f\x38\x3e\xf2\x2c\x4d\x48\x40\x17\xda\x9f\x57\xb0\x0b\xd9\x5b\xdf\x9c\xd1\x21\xfd\x70\xfc\xb7\x24\xb8\xb2\xa7\x43\x66\x79\x1e\x31\xee\x25\x03\x36\xf7\x4f\x63\xd5\xee\xbe\x59\xa1\xe1\x86\xbc\xf9\xe7\x2c\x62\x2c\x2f\x44\x4c\x90\x09\xd8\xe1\x69\x3b\x7f\x95\xfd\x23\xba\xd9\x1c\xe6\x5b\x91\x00\xb2\xb4\x6e\xb7\x68\x72\x7f\x65\xbf\xe5\x45\x6e\x31\x7a\x41\x95\xc0\xf3\xc7\x87\xcd\xea\xf1\xee\x6e\xb1\xda\x2e\x1f\x36\x8b\xd5\xcd\xcc\xd7\x02\xb3\x5c\xaa\x04\x6b\x6b\x0e\x80\x38\xd4\xbb\xb2\x9d\x0e\x9d\x34\xa9\x55\x5e\x8d\xbe\xf7\x4b\xfc\xa5\x2a\x53\x38\x26\xeb\xc3\xae\x0c\xc5\x72\xed\x6c\x5f\x57\x2f\xad\x9b\x11\x93\xf5\xa8\x64\x81\x01\xaf\x57\x54\xcf\xc4\x28\x2c\x41\xae\x5d\x4d\xb4\x92\x13\xc9\x5a\x96\x6b\xe5\xde\xba\x9f\x58\x9b\x7a\x8d\xd3\x68\x6c\x34\xe4\x26\x12\x7a\x28\xca\xf0\x19\xde\x6b\x32\x48\x86\x47\xc8\x56\x84\x1b\x7a\xd8\xad\x7c\x63\x6c\x94\x8b\xb4\xd1\x8a\xbb\x00\x7a\xcf\x4d\x22\xb1\x42\x8e\xbe\xc5\x1a\x3e\x0b\xa0\xe5\xc6\x24\x0c\xa1\x9a\x8b\xd5\xfa\xf1\x61\x76\xb7\xbd\x59\xae\xd6\x9b\xed\xb7\xc7\xe7\xd5\x76\x3e\x7b\x0a\x3f\x6a\xa9\x62\xa3\xac\x9c\xc0\x47\x6f\x0b\xf4\x07\xea\x17\x9e\x55\x0e\x8c\x07\x19\x45\xf9\xcb\x09\xa7\x9c\x18\xea\x27\x9d\x35\xd5\x58\xa2\x1c\xd0\x45\x38\xf4\x70\xa1\x16\x91\xcc\x0a\x27\x66\x72\x90\x15\x15\x22\x39\x20\x63\xe8\xa1\x31\x5b\x4c\xf5\xb2\x67\x39\xe5\xa9\xf5\x5a\x44\x2a\x36\xc4\x72\xfe\xde\x1f\x4f\x04\xb5\x41\xe6\x12\xd7\x81\xc5\x06\x43\x4c\xeb\x4e\x76\xa5\x5e\x74\xaf\x27\x9d\xab\x23\x41\x6f\xc6\x75\x15\x05\xd3\x1c\x55\x63\xe6\x4f\xde\x66\x29\x78\x4e\x8e\x5a\x0b\xbb\xdd\xb8\xa2\xda\x77\x80\x02\x33\x4e\xb6\x6e\x2c\x4c\x43\xf5\x85\x60\x0a\x2b\xe9\xee\x66\x37\x21\x4f\x5d\x08\x29\x6c\x16\x8c\xdd\xab\x21\x1b\xcf\x68\xbd\x14\x31\x8b\x11\x07\x42\x95\x74\x65\x85\x47\x02\x6c\x7d\xdd\xd3\x6f\x93\xde\x9a\x63\x2e\x7a\x7b\x42\x03\xcf\x76\x9d\x6c\x68\xa9\x79\xba\x04\x56\x24\x3c\x46\xeb\x65\xa6\xeb\x46\x96\x46\xde\xd7\x55\xa9\xe5\x0f\x59\x75\xed\xa6\xfe\xbd\xaa\xdf\x37\xaf\xf0\x00\xef\xff\x3c\x42\x8b\xa7\xcf\xe8\x33\x26\x45\x91\x50\x21\x3e\x02\x2b\x07\xf8\xda\xc1\xe1\x5e\x24\x36\xc2\x2a\xb1\x76\x57\x6a\xe0\x17\x6a\x66\x4e\xe3\x97\x66\xa4\xd0\xfc\x24\xbb\xa6\xae\x36\xaf\x0d\x9c\x78\x4a\xc2\x97\xcc\x8a\x1c\x41\xfd\xd5\x71\xbf\xaa\x77\x61\x43\x2c\xb2\x82\x60\x90\xad\xdb\xfd\x67\x0d\xc8\x11\x2f\xcd\x97\x41\xb6\x20\xa9\xc1\x8a\x4c\x29\xe4\xa2\x31\x20\xcd\xae\xac\x20\x14\x19\xb2\xa2\x60\x92\x13\x7f\x87\x13\xa3\x20\x28\x5a\x03\xf8\xda\xab\xc0\xf5\xca\x8a\x82\x13\x87\x96\x87\xed\xb8\xf3\x73\x14\x32\xb8\x18\x1c\xf0\xd7\xdb\x04\xa7\x5f\xd3\x9b\x53\x23\xe4\x58\x21\x93\x9c\x44\x25\xdc\x94\x71\x16\xc8\xb9\x36\x27\x2b\xa4\xe2\xe8\x3b\x5f\x9d\x28\x00\x59\x21\x75\x82\x08\xcb\x0a\xde\x5d\x55\xda\xa9\x16\x76\x72\xbd\x02\x41\x35\x27\x9d\xee\xd7\xe0\xd3\x51\xfd\x0e\x1f\xfd\xe6\xda\x5c\x2e\x8c\x28\x14\x24\x38\x4b\x1d\xf6\x72\x5e\x37\x9f\x32\x10\x4f\xbe\xbd\x8e\x78\x64\x02\x20\x80\xf6\x9b\x81\xc0\xb2\xef\x95\xe5\x88\x6b\x1c\xa6\xfc\x30\x99\xec\xdb\x2d\x58\xc2\x42\x1c\xea\x7e\xc3\xe8\xdf\x89\xf4\xb9\x2e\x6f\x73\x85\xe1\x0a\x41\xfa\x8b\xc7\xf5\x58\x49\x9c\x15\x26\x23\x69\x98\xa7\xa6\x6e\x0f\xc1\xa2\x2d\x8c\xc9\x10\x22\xb7\x6b\x87\x24\x6b\xac\x00\xa1\x0b\xaf\xc1\x54\xc9\x43\xfb\x5a\x77\x5e\x04\x71\xfc\x93\x90\x11\x9d\x2f\x56\xaa\xde\x4f\x2b\x6a\xfb\x76\x02\xa2\xba\x65\x75\x75\xb6\xcd\x80\xca\xb0\x8e\x73\xf3\xbb\x0b\xd2\x23\xdf\xdc\x97\x3b\x2e\x00\x27\xcc\xc6\x8b\x2b\xa4\x0a\x4f\x6d\x75\x2c\xbc\x80\xc1\xb1\x32\x4b\x92\x3b\x1f\x0c\x83\x15\x3c\x26\x50\xc8\xbf\x41\x0f\x4c\x32\xdf\xac\x18\x02\x39\xbc\xaf\x13\x2a\xef\x59\x61\x75\x8a\x2b\xf5\xa5\xae\x96\xcb\xd1\x58\x59\x48\xd1\x65\x0b\x8c\x6d\x54\x90\xf6\xc9\xd6\x67\xc1\x62\x70\xf7\x5b\xdd\xaf\xc7\x97\xaf\xfd\x34\x19\x45\x84\x62\x3b\x56\x9e\x2f\xb0\xb7\x3e\xa0\x9a\xd2\xdc\x32\x19\xc9\x3c\x71\x2a\x0b\x97\x52\xe5\x92\x89\x1c\xa1\xd8\xae\x3a\xb3\x95\xc3\xa8\xa0\xe4\x09\x65\xf6\x10\x0d\x52\xc1\xc7\xd5\xa9\x54\x43\x0a\x03\x08\x5d\xf3\x4f\xb0\xdd\x3b\x31\xa5\xf1\x03\x24\x2c\xc1\xe2\x5d\x34\x77\x43\x50\x45\x26\x59\x84\x77\xf6\xc6\xcf\x0a\xf4\x87\xde\x7d\xae\x73\x76\x79\x45\xc9\xc4\x6a\x44\x61\xe3\x0a\xdd\xd4\xcb\x11\x27\x23\x93\xa9\xc8\x30\x74\x43\x58\x1d\x5a\x24\x5f\x18\x04\x32\x05\x83\xf3\xe0\x71\xb5\xbc\x5d\x3e\x6c\x17\x9b\x6f\xdb\xab\xd5\x66\x8b\xe0\x13\xff\xe4\x85\xb4\x54\xd5\xd9\xef\x8d\xc3\xb4\xae\x2c\x0c\x39\x08\x77\xab\xf9\x1c\x37\xa3\x2f\x66\xab\x94\x20\xd9\x90\x76\x49\x5d\x8c\xa6\x49\x25\x52\xe5\x7c\xa0\xde\xe8\x1b\x12\x4a\xba\x1e\x1a\x18\x26\x49\x90\xe3\x6f\x31\x5f\xde\xcf\xee\xbc\xdf\x2b\x8d\x20\xad\x35\xac\x4d\x0c\x42\x0e\x4c\x1a\x48\xd0\xa6\xff\x0e\x3b\x68\x07\x4e\x8a\x84\x24\x16\xa7\xa3\x7a\x23\x7f\x9e\x83\x44\x24\x64\x1c\xc1\x61\x24\x33\x03\x87\x0e\x4c\x6f\x6b\x8c\x26\x0e\xe4\x24\xf2\x8d\x83\xb4\x92\xd6\xee\xa6\x77\xb1\x9a\xce\x41\xcc\xe6\x51\x21\x8a\xcb\x7d\xef\xce\xcd\xd0\x51\xd2\xea\xef\xe6\x93\x2e\xce\x18\x15\xf1\x08\x51\x9c\x1b\xb9\xfb\xb9\xa9\x7b\xbf\xb2\xe9\x2e\x62\xce\x54\x94\x51\x39\xac\x01\xe5\x39\x1c\x3e\x89\xa2\xb8\x0b\x18\x8f\x89\xf5\x41\xd7\x9f\x52\xbb\xfd\xdf\x3d\x2c\x17\xb1\x74\x0c\x21\x5f\xf0\xd3\x32\xc5\x55\x84\x11\x6c\x1c\xee\x6d\x48\x6c\x29\x6e\x52\x8f\x10\xec\x37\x08\x24\x14\x75\x4d\x02\x24\xc2\x31\x64\xfb\x51\xe9\x6b\x50\xe5\x27\x06\xb8\x12\x36\x70\xe3\xac\xa4\x86\x45\x65\x88\xdd\x37\x34\x1b\x34\x8b\xf7\x75\x3f\x84\x9b\x72\x0f\x8f\xf6\x72\x10\x4b\xc5\xa9\x72\x7c\x02\x68\x44\x01\x11\xb1\xcf\xfb\x63\x7f\xe8\xae\xa9\xd8\x24\x71\x7e\x3a\x1c\x30\xb5\x3d\x71\xeb\x55\x12\x69\xcc\x71\x03\x86\x32\x43\x4c\xc9\xb7\xc6\x8c\x8a\x53\x71\x8d\x06\xfa\xc6\x01\x9d\x3f\x53\x89\x22\xca\x2f\x44\x48\xe0\xe4\x8d\x43\x93\xce\xb2\x6c\x78\x02\xc3\x0f\xd9\x62\xd4\xc8\x84\x2e\x26\x43\x0f\xee\xd0\xc0\x16\x99\x5d\x26\x0e\x9b\x4a\x05\x43\x55\x0f\x34\xa1\x02\x17\xdb\xc0\x68\x54\x69\x96\x4a\x57\x82\x27\x16\x95\x39\xdd\x3b\xd5\x80\xc1\xe1\xf7\xb2\x7a\xaa\xbb\xb3\x57\xcf\x62\x11\xfb\x0c\xfd\xaf\xb2\x2d\xfb\xcf\x3a\x12\x89\x3f\x0b\x8b\x4c\x83\x22\x2a\x4b\x58\xe6\xe7\x05\xbc\x48\x3d\xf1\xce\x54\x2e\x13\x65\x03\x1c\x07\xf1\x8f\xf7\x65\x35\x20\x3b\xed\xcd\x7c\xe0\xb1\x2f\x6e\x97\x03\xaa\x7f\xa6\xa4\x8a\x0a\xa7\x63\xbb\xf8\xd5\x35\xf2\x9c\x25\xab\xef\x13\xa3\x81\xb7\x97\xd5\x91\x84\xcf\x3e\x99\x7e\x4a\x26\x58\x4a\x7b\x5b\xef\x68\xe2\xb5\xe4\x96\x84\x07\x51\x32\xb5\xc5\xa9\x20\x6b\x64\xbe\x2b\xa5\x53\x0c\xc1\x06\x88\x14\xea\xe3\x99\x13\xb7\x15\x53\x5a\x8a\x81\xe8\xd2\xbd\xac\x3e\x30\x0a\x3f\xd5\x37\xec\x3b\x66\xf8\xbd\x4c\x8d\x16\xee\xf8\x31\xb5\x4a\x29\xa0\x3f\x22\xe6\xad\xcf\x1d\x6a\xac\x16\x9e\x64\x81\x47\x8f\x6c\x62\xa2\xc1\x7d\x81\xae\xb7\x30\x9f\x42\x75\x8f\x32\x49\x91\x51\x18\xc3\x5d\x2f\xb6\x5b\xdf\x06\x2c\xf5\x71\xa1\x7b\xd9\xfc\x0c\xc6\x8f\x82\x98\x63\x70\xbb\x3a\xee\x43\x74\x24\x8c\x5d\xef\x38\xa3\xab\xee\x1d\xc5\x7f\x85\xf2\x2a\x65\x55\x81\x56\x23\xb1\x82\x57\x2f\x3b\x98\x9f\x0c\x74\x1d\x25\xb9\x18\xc9\x42\xae\x2f\x09\x71\x5c\xfc\xa4\x9a\x45\x1a\xa7\x4e\x59\xd9\x7a\x1c\x8b\xf1\x1d\x52\x83\x95\x17\x63\x00\xcb\xff\xd3\x16\xaa\x39\x23\x59\xeb\xa7\xd5\xe3\xd5\xec\x6a\x79\xb7\xdc\xfc\xb9\xbd\x5e\x7e\x5f\xae\x1f\x3d\x74\x54\x73\x2e\xa3\xc4\xf3\x69\xbf\x4f\xc2\x6a\xa7\x3b\x89\x08\x34\xc1\x37\x91\x33\x62\x68\x68\x68\x91\x52\xbd\x2b\x46\x34\x51\x9e\xe1\xc2\x61\xae\x85\x31\xc8\x32\x67\x8f\xfa\xe7\x89\x7e\x8c\xe9\x98\xa9\x34\x0f\xac\xa4\x2d\x54\xed\xb1\x5d\x1d\x07\xd4\x91\xff\x3b\xfd\x3f\xbe\x6b\x4a\x04\xa6\x7b\x68\x65\xeb\x6c\xef\xef\x14\x79\xf5\x3d\x4c\x8a\xe9\x85\xeb\xc7\xdb\xed\x84\xe0\x92\xe9\x18\xb4\x72\x92\x52\x73\x79\x38\x95\x76\xea\x44\x48\x8c\x71\x3f\x07\x44\x09\x2e\xdd\x6b\xd9\x49\x36\xad\x94\xf3\x97\x24\x85\x60\xa7\x0a\x37\xaa\x7a\x19\xbf\x70\x62\x22\xa4\xee\xec\x88\xb5\xe1\x0d\x68\x05\xfb\x1f\x4d\x59\x81\xea\x55\xd7\xcb\xdb\xe5\x66\x76\x37\x9f\xad\xbf\x85\x26\x09\x18\x55\x5e\x23\xd7\xf2\xae\xd4\x72\xcc\xaf\x35\xd0\x5c\x18\x19\x59\xfe\x72\x9d\x20\x96\xa5\x39\x22\x83\xba\xa3\x98\x9b\x6c\x42\x3a\x4b\x23\x4c\x36\xda\xf2\x97\x4b\xbf\x4c\x45\x00\x43\xc7\x1c\xc3\x1a\x73\x59\x99\x8f\x81\x0b\xac\x8b\x98\x24\xb2\x77\xb2\xed\xf0\xdd\xb6\x32\xfb\x26\xdb\xd7\xad\xfb\xa1\xd0\x4f\x6b\xac\x1a\xed\xbb\xdc\x07\x73\x4b\xcb\x82\x76\xc1\x17\xa8\x22\xf7\x31\x07\xb4\x84\x4c\x6b\x99\x4b\x47\xd8\x85\x84\xcf\x67\xc6\x98\x06\x91\x99\x7e\xdd\x83\xd4\xaf\xfd\x57\x73\x92\xf1\xbe\xb5\x48\x10\xd9\xb1\x59\xde\x23\x64\x7a\xf9\x78\xbd\x5d\x3e\x6c\xd7\x8b\x79\xe8\x21\x73\x12\x10\x9b\xdf\xad\x2e\x63\x5a\xfe\xe2\x5f\x77\x1f\x9b\x28\x2f\xb9\xf8\x03\xba\x57\xbf\x01\x5e\x5e\x07\x56\xb1\x88\x56\xd2\x5e\x22\xe6\x90\x54\x08\xc7\xb1\x24\x6d\x2d\x09\xff\x74\x08\x48\xed\xda\x87\xba\x5b\x43\xb7\x3e\x22\x4e\xd2\x3d\xbf\x89\xb8\xc4\xb8\xe8\xfd\x09\xbb\x78\x81\xcb\x92\x99\x28\x57\xd6\x8d\xe4\xe3\x01\x11\x73\xb8\x61\x9d\xa2\xe1\x86\x25\x96\x39\x20\xef\x9d\xac\xcc\x68\x07\x18\xef\x29\x86\x65\x69\x7e\xb2\xdd\x5d\xbc\x1b\x15\xa5\xe5\xe1\x30\x70\x81\x06\x27\xf0\xf0\x87\x72\x19\xa3\x71\x22\x2d\x78\xb7\xec\xfc\x37\x78\x64\x90\x1c\xee\xd0\xd4\xbd\x87\x44\xe4\x9a\x5f\x7f\x04\xc3\x1d\xa9\x79\xff\x6a\x43\xf5\x1d\x66\x38\x57\xb8\x3f\x39\x59\x8a\x69\xcc\xc1\x70\x45\x5a\xfd\xe8\xfa\xb2\x70\x95\xa2\x30\x54\x0b\x27\x04\xf5\xf8\x29\x45\x94\x63\x2c\xa4\x3f\x20\x8e\x3b\xd9\x94\x1d\x12\x77\xb0\xcc\xdf\x42\x24\x81\x22\xea\xb6\x7e\x83\xa6\xf2\x5c\xdf\x93\x47\x17\x32\x47\x8f\xf6\x49\xee\x76\xe5\x71\x7f\x8e\x7b\x1f\x77\x4f\xf2\x5c\xbb\x2d\x7b\x55\xef\xfa\x53\x5b\xbe\x4c\x33\x53\x26\x29\x62\xef\xf7\x3f\xaf\x17\x9b\x33\x6d\x06\x66\x52\x96\x27\xd1\x29\x3d\x8c\x7e\x15\xf1\x49\x3c\xbe\x05\x6b\xd2\xa4\x8c\x50\xf1\x5d\xb9\xc7\xdc\xf4\x8c\x18\x11\x26\xbf\x96\x31\x85\x36\x95\x82\xee\x6a\x77\x1c\x68\xf1\x31\x93\x89\x04\x99\x71\xfe\x79\x2c\xff\x7b\x71\x76\xe6\x31\x55\x93\x0e\x5c\xaa\x91\x3f\x65\xf2\x22\xc7\x08\x84\x2b\x4c\xf0\x48\xf5\xcb\xd3\xa0\x60\x45\xcc\xbd\x69\x66\xeb\xe7\xc6\xc3\x67\x46\xbf\x29\x93\x1c\x73\x27\xae\x5c\x61\xf8\xbc\x32\x83\x54\x78\xb7\xbf\xe9\x5e\xe4\x0b\xac\xce\xea\xe1\x8c\x94\x0c\x31\x01\x28\x4e\x7a\x0d\x16\x25\xcf\x06\x9b\xec\xf8\x15\xa5\x24\x0e\xf9\x40\xe2\x45\x2f\x78\x53\x37\x67\x95\x1a\x46\x71\x61\xb4\x3f\x36\x9e\x9a\x5a\x03\x04\xbc\xa4\x51\x4e\xc5\xee\x66\xf9\x80\x42\x85\x77\xdb\xeb\xd9\x9f\xeb\x53\x2b\x55\x13\x39\x1a\xf5\x13\xda\xf2\xf2\x2a\xd3\x9c\x70\xde\x28\xc0\xde\xbe\x3e\xd5\x65\xd5\x5d\x7d\xe0\x56\x5c\x87\xef\xdf\x6f\x1e\xf1\x28\x73\xe7\x43\x89\xd3\x0a\x63\x7f\x41\xca\xbc\xd0\x1e\xd9\x37\x4b\x3d\x81\x86\x1b\xc8\x48\xb2\x94\x04\x53\x6c\xf9\x6b\x48\xc3\xeb\xfa\x58\x6d\xd0\x3a\xeb\x37\xc0\x01\x29\x10\xd2\xde\xfb\x67\xb3\x16\xbc\xb8\xd9\xd2\xd1\x67\x0d\x39\x74\x19\x44\x3c\xe5\xbe\xea\xa5\x6c\xda\xee\x8c\x0d\x9c\x41\x24\x0c\x52\xa9\x92\xed\x3a\xdc\x8b\xd9\xd7\x6c\x5a\x17\x85\x1e\x3f\x49\xfa\x02\x4f\x1c\xfd\x79\x53\xea\x9f\xcb\xf0\x3d\x81\x17\xb9\xa6\xda\x38\x73\x81\xa5\xf0\xb2\x09\x09\x5c\x6a\xcc\x0a\xc1\x9b\xdc\x3d\xc9\x46\xee\x27\xa8\xe1\xb3\xc7\x9e\x14\xf9\x7b\xa3\x1e\x38\x14\x98\xfd\x47\x1d\x24\x6f\xdd\x82\xe0\x39\xfa\x14\x3b\xb0\x5d\x9a\x4f\x86\x2b\x96\xb4\x9a\x8f\x15\xda\x6b\x75\x63\xca\x6a\x30\x5d\x20\x89\x74\x50\x5d\xbe\xf7\x1f\x0a\xd2\x22\x1a\x85\xcb\xae\xdb\x71\x2d\x63\x18\xb6\xff\x9d\xf8\x67\x4b\x95\x62\x0e\xb0\xda\xbb\x5e\x4e\xcb\x66\xf2\x34\xa9\x8d\xd1\x4c\x47\x86\xbf\x38\x9a\xb4\x66\x12\xf0\x50\x23\xa5\xd7\x7b\xd8\x2b\x68\x10\x91\xf5\xb5\x6a\x31\x83\x5c\x6a\x20\x85\x78\x5d\x1b\xb8\x2a\x77\xbb\xb2\x7a\xb9\x87\x4e\x9a\x81\xe8\xa7\xeb\x5b\x24\xb1\xc9\x07\xb9\xb7\x00\xfd\x3d\x63\x45\x80\xa2\x48\x3c\x47\xe8\x8c\xca\x51\x70\x97\x1b\xf0\x28\x85\x73\x12\x0a\x99\x60\x61\xe2\xf7\xd5\xe2\x71\x8b\x42\x16\x4f\xdf\x66\xeb\xc5\x96\x6f\x17\x0f\xd7\xdb\xde\xa4\xf1\x77\x95\xb1\xc0\x87\xdd\xcc\xd7\xf3\xc1\x3e\x06\x32\xd5\x2a\xd0\xb2\x94\x75\x75\x5f\x56\x41\xce\x83\x81\x34\xc2\xa4\xa3\x8a\xa2\xf6\x66\xba\xab\x83\x04\x4e\xa4\xb6\x75\x13\xc8\x46\xfb\xbf\xa6\xb1\xa4\xea\x06\xc4\xb6\xfa\xbf\xab\x08\x0c\x41\x04\xde\x97\x24\x00\x49\xf5\x81\x98\x33\xec\x0d\x83\x8b\x85\xb3\x9f\xcd\xf5\x7f\x0c\xa2\x05\xa0\x20\x4e\xfa\x89\x3a\x7f\xad\xeb\x16\xae\xfc\x2f\x6a\x6b\x31\xc9\x7b\x25\xdb\xae\x1e\xa3\xaa\xc0\x14\x05\x9e\x5b\x65\xbb\x08\x0c\x15\x10\x80\x0a\x00\x40\xaa\xaf\x65\xd5\x1e\x1b\x20\x91\xe7\xd1\xac\xf0\x41\x62\xb0\x45\x8e\x24\x62\xaf\xb2\x7d\x5d\x83\x6e\x82\x77\x09\xb6\x90\xf8\xf3\x87\x06\x4a\x7d\x9e\xc3\xf4\xbd\x54\x96\xba\x62\xbf\x27\xf9\xe1\x25\x34\x98\x8d\x12\x29\xfc\x6c\xe8\xba\x33\x35\x35\xdf\x4b\xf1\xc2\x0b\x26\xd2\xfb\x9d\x26\x49\xbf\x56\xd1\x7b\x87\xee\xf5\xa6\x6e\x7e\x87\x49\x24\xc3\xf2\x88\xf9\xc2\xd0\x59\xd3\xbd\xd7\xcd\xcf\xfe\x48\x9c\x74\x12\x22\x41\xae\x9a\x85\xd7\x4a\xed\xff\x54\x00\x55\x2b\xa1\xfe\x58\xf8\xb3\x04\x41\x0a\x84\x6f\x72\x6a\xe3\xba\x2e\x71\x11\x61\xcc\xd9\x80\x39\xea\xce\x73\x22\x5e\xdc\xc6\x6c\x0c\x1c\x91\x79\x8f\xba\x93\xc3\xa8\x9a\x4d\x39\xe9\xab\x95\x2d\xc5\xfd\x08\x12\xb7\x5d\x9f\x65\x41\x6d\x6a\x0a\xf4\x40\xde\x41\x4d\x1e\x24\x13\x1c\xe5\x6a\xae\x1e\x1f\x9e\xd7\x5b\xc4\x33\xac\x3d\xdc\xf2\x3a\x74\x4a\x89\x62\x11\x21\x16\xc4\x31\x36\xf9\x81\x3c\xb3\xa8\xf8\x74\x55\x76\xf7\xa5\x2f\x2e\xb3\x45\x22\x30\x13\x84\xe4\xe5\x2b\x39\xa5\xe1\xb3\x92\x65\x71\xec\xf2\xc8\x87\x13\xb3\x37\xb3\xb2\x88\x3c\x0a\xdf\x91\x8a\x3e\xc8\xe9\x89\x64\x95\x90\xc8\xa1\xb1\x2f\xab\x45\x28\xed\xb0\x2a\xe1\xac\x18\x71\x9c\x8f\xc8\xb7\x8e\x53\xfa\x1f\x3f\x7f\xad\xb2\x1c\xc3\xa0\x67\x04\xa2\xeb\xab\xcd\xe4\x97\x75\x6c\xf0\xac\x27\xd3\x7e\x7e\xec\x6a\xeb\xc2\x99\xfe\x66\xa6\x48\x59\x1c\xb8\xc5\xae\xcf\xb6\x43\x0b\x31\x25\x4d\x06\xe4\xc7\xbe\x9e\xd4\xfb\x05\xe2\x3c\x34\xc7\xd8\xff\xb9\x94\x24\xb5\x20\x89\x34\xa8\x85\x0e\x99\x2c\x90\xbf\x23\x1b\x19\x0a\x16\x34\xfd\x62\x55\x1b\x18\x66\x24\xac\x15\x26\x0e\xfe\x37\x7d\xdd\xfb\xb2\x3a\x11\x8a\x58\x1b\xcb\x34\x3b\xc1\xbc\x7e\x94\xdd\xeb\x2b\xec\xa6\xc2\xf6\x83\xf5\xd6\xcf\x2a\x07\x99\xb8\x92\xd5\xcf\xb3\xd9\x62\x0d\xe0\x74\xbc\x92\x6d\xa9\xaf\xe4\x6e\x77\xe2\x2d\xbb\x10\xed\xe2\x51\x14\x31\x8c\x56\xdc\x43\x75\x8c\x1c\xdf\x22\x8f\x58\x2a\x11\x2d\xea\x88\x13\x71\x16\x3c\x41\xf3\x50\x77\x81\x47\x70\x34\xe8\x3c\x62\x46\x46\x2e\xe1\xeb\x99\x2b\xff\x6e\xe8\x7d\xf8\x02\x3c\xe2\x11\x47\x5d\x9d\xe3\x09\x01\xc8\x23\xce\x08\x83\xfb\xcf\xfe\x9d\x51\xd3\x30\xb4\xf0\x02\x63\x47\x5d\xbd\x33\x7f\xd6\xc7\x65\xf7\xa3\x3e\xee\xcc\x89\x05\x94\x47\x22\x66\xd2\xc7\xcf\xbd\xbf\xbb\x41\xd2\xd3\xd0\x43\x5a\x9e\x0e\x4c\x83\xe5\xfe\x50\x7b\x51\x0d\x67\x16\xe4\xff\x18\xbf\xae\xd0\xa4\xb6\x8e\x4f\x39\x5a\xf7\x7d\x1b\xf9\x0a\x2f\xd0\xad\x0f\x20\xa7\xdf\x88\x47\xb1\x60\x18\x87\xbf\xff\x40\x97\xe8\xc1\xf3\xe7\xf0\x28\xc9\x18\x46\x11\x29\xfd\xb3\xac\xda\xae\xec\x8e\x27\xc0\xf8\x84\xa4\x6c\x7c\xd7\x34\x21\xbd\xec\xea\x97\x3e\x91\x3a\xf3\x28\xcd\x89\x5f\x5a\x1a\xf3\x5c\x95\xff\x39\xc2\xfa\x40\x94\x44\x93\x33\xf0\xe2\xd9\x37\xfc\x5f\x7f\x3f\x6d\x91\x8b\xe1\x7e\xf9\x40\x2c\xef\x9b\x6f\xdb\xf5\xe3\xcd\xe6\x04\x06\xe2\x51\x0a\x19\x6e\x59\x16\xf4\xeb\x6c\xb7\xeb\x8d\xa7\x15\xb4\xc7\x5d\x77\xf5\xe1\xd3\xd6\xb4\xdb\x8e\x07\x35\x63\x19\xb8\x18\xea\x83\x1a\x28\x5e\xf0\x28\x4b\xd2\x78\xa8\xce\x36\xb9\x30\x8f\x14\xd6\x9e\x3f\xd5\xd5\xcb\x6f\x83\x67\xcd\x05\x47\xdb\x9b\xc2\xe3\xb8\x1f\xf4\xd6\x54\x43\x9e\x68\x27\x7f\x5e\x0e\x7a\xf3\xa8\x60\x51\x8e\x67\x08\xb2\xbe\x7e\x5c\xcb\x21\x87\x1e\x8f\x8a\x8c\xa6\xa3\x3a\xea\x9f\xd0\x2d\x7e\x95\x6d\x37\x56\x19\xee\xbb\x28\xcc\x3e\x9b\x1a\xfc\xfc\x78\x7c\xaf\xfc\xd8\x7f\xf2\xab\x56\xa3\x71\xe6\x79\x48\x9a\x40\xa3\x37\x99\x40\x2a\x16\x18\xaf\xf4\x36\xc5\xbd\x2c\x2f\x96\x7a\xf9\xee\x85\xf0\xb5\xfe\xcb\xea\xad\x2e\xb5\xf3\xfd\x9e\x64\x69\x26\x8f\x6d\x12\x81\x45\xcf\x50\x9d\x4a\xdf\x31\xfd\xc0\x4f\x22\xc3\x7d\xaf\x02\x1d\xfb\xd6\x11\xd0\xb1\xf0\x77\xc0\x99\x7f\x52\xea\xdc\xd4\x4e\x6e\xeb\x9c\x63\xd6\x5f\x63\x60\xa0\x2e\x34\xaf\xdb\x2e\xe4\x49\x79\x64\xa0\x40\x13\xb1\xb7\xf3\x6e\x65\xef\xfd\x7b\xc6\x25\x1e\x41\x42\xa8\xdf\x93\xf9\x78\x89\x74\xbf\xef\x67\xd1\x70\xa3\xb8\x82\x67\xc4\x1c\x4e\x69\x90\x80\xdb\x77\x7d\xec\x0e\xc7\xb0\x2b\x58\x4e\x2a\x96\x78\x7a\x9e\xaa\xe9\xa8\x95\x45\x5c\xa0\x51\xd4\x4f\xfd\xf9\xec\x69\x20\xc1\xca\x59\x94\xd9\x5c\x04\x2a\xab\x9f\x65\xf5\xd2\xdb\x3c\x4f\xf2\x63\x57\x4b\x33\x08\x5b\x73\x16\xe5\x24\x34\x73\x33\x14\xdf\xe7\x8c\xc5\x19\x52\xd8\xbc\x95\xf0\xbe\x06\x5d\x57\xe6\xae\xee\x4e\x7a\x55\x28\x3a\x1d\xfa\x26\x62\xc4\xb6\xba\x86\xae\xdb\x9d\x29\x33\xff\x15\x29\xf3\xd8\x67\xbc\x40\x28\xc8\x19\xd3\xa4\x7a\xed\x8e\x2a\x24\x07\xbc\xfa\xa0\x94\xde\x38\x55\xc3\x19\x4f\x2c\xba\x68\xeb\xc5\xe2\x2e\x0c\x0b\xd7\x9c\xb9\x7a\xf8\xf5\x47\xdb\xc1\xde\x7f\xb6\x4b\xa2\x77\x9c\x09\x96\x14\xfa\xc4\x8a\x76\x8e\xdc\xf8\xc7\xa4\x7f\x21\x95\x57\x9f\x29\x5f\x9e\x9a\x7a\x5f\xe3\x26\x13\xca\xfc\x7d\x3f\x29\x71\xc0\x8c\xfc\xf0\xc0\xaf\x41\xcc\x97\xb3\x98\x91\x0a\xf9\xae\x6e\xdb\x4d\x3d\x7f\xc5\xa0\xda\xe4\xd9\x62\x51\x28\x5a\x26\x6f\xf5\x4f\x08\xc5\x0f\x43\x5f\x8b\xb3\x38\xb3\x38\xb3\x1d\x81\xec\x93\x53\xd8\x0a\xe6\x01\x67\x49\xc4\x31\x69\xf5\xaf\xcd\xb7\xcd\xef\x0f\xb3\xeb\xeb\x55\x68\x11\x16\xe3\x22\x57\x0f\xbf\x0f\x2b\x92\x39\x4b\x94\x76\x6a\xa6\xd5\xa2\xed\x7e\x87\x0f\x7c\xc7\x87\xc9\x8e\xc8\x52\xc1\x91\xa8\xb5\xd4\x35\x56\x68\x04\xc5\x40\xdf\x9e\x4a\xe4\x89\xf9\x75\x90\x95\x91\x5f\x00\x25\x38\x4b\x15\x8f\x02\x52\x74\xfd\x51\x99\xde\x00\xf8\xdb\xd9\xa0\x70\x13\x8b\x0b\xd9\x15\xcc\xf6\xe7\x2b\xfa\x01\xe3\x5f\xb2\x71\x62\x1c\xc0\x1b\xe7\x15\x25\x2e\x5d\x6b\xc6\x98\x15\xa7\xe1\x24\x3e\xf5\xd0\xe8\x12\xed\x6d\xd7\xbf\x4f\x63\xae\x27\xa5\x4f\x9c\x65\x96\x11\x10\xa7\xa6\x40\xff\x6f\xe7\xc6\x1e\x67\x79\xa4\x51\xe0\xfc\x8d\x24\x5d\xe7\x75\x38\x82\x58\xce\x80\x9c\x39\xf2\x2b\xcb\xff\xc2\xad\x6c\x9f\x82\xa6\xc8\xcd\xb1\x32\x28\xe1\x30\xfd\x12\x85\x95\x69\x7a\x9a\xc6\x04\xa3\xfa\x8b\xd5\xe8\x2e\x95\x2c\xf6\x99\xff\xc7\x63\xa7\xeb\xfd\x88\xfc\x95\x33\x29\x01\xeb\xc1\x90\xe9\x72\x68\x15\x31\x09\xd6\x90\x12\x26\x4a\x2a\x84\x3f\xdb\x08\x75\x2f\x8f\x55\xa8\x78\x1a\x9f\x2c\x4c\xc5\x1c\xad\xdd\x13\xb0\x09\xab\x2a\x4d\x29\xcf\x12\x13\xfe\x8a\x94\x20\x12\xce\xd1\x9a\x06\x13\x39\x53\x85\xc8\xbc\x94\x50\x7d\xac\x4c\x00\xc5\x8e\x31\xbc\x93\x8b\x24\xe8\x21\xe2\xeb\x09\x59\x1e\xb1\xee\x23\xbc\xbe\xe6\x19\x56\x67\xcf\x37\xb3\xfb\xd1\x1a\xd1\xc6\x31\x5d\x80\x6d\x42\xd1\x2b\x67\x26\x31\xe0\x29\xd9\xa8\x60\x26\xb4\x18\x9d\x11\x8c\x5d\xee\xaf\xbc\x3a\xe0\x64\x64\x6c\x22\x48\xf4\x97\x98\x5e\x66\xe1\xb6\x36\x8f\x3c\xad\xcd\x2d\x54\xf5\x27\x04\x30\x7d\x3f\x22\x91\x42\x3b\xd4\x7e\x02\x44\xe3\x3c\x8a\x8d\x3f\xd6\xc8\xf5\xc4\x8a\x1e\xac\x1a\xf6\x3d\x34\xe5\x12\x6e\xa1\x5b\xb6\xa8\xda\xe4\x97\x35\x67\x79\xce\x9c\x05\xe5\x8c\x8e\x59\x65\x10\xe1\x83\x33\xf5\xd1\x0e\x94\x06\x39\x67\x52\x81\x75\x34\xe6\x52\xbf\x82\x09\x4c\xc4\xa1\x87\xe2\x89\x83\x92\xaf\x0f\x75\xd5\xd6\x08\xcb\x23\x95\x65\x2a\x65\xfb\x0b\x72\xe9\xfe\x16\x59\xe2\x44\x7a\xe6\x8b\x4d\xec\xbd\xc4\xf3\x54\xe2\xf4\x1f\x7f\xbd\x35\x28\xbb\x8d\x2e\xd4\xaa\xae\xf7\x23\x52\x1f\xce\x79\x92\x60\x2e\xeb\xe6\xdb\xe0\x04\xe5\xdc\x44\xaa\x08\x4e\x22\x12\x77\x5f\x05\xcc\x02\xe7\x22\x26\x01\x4b\xc2\xeb\xbc\xf4\x0e\xf0\xb8\x6e\x66\xf0\x24\xec\xab\xb8\x50\x7f\x2b\x8b\x08\x4e\x97\xc2\xa0\x0a\x42\xdf\x96\xe7\xf8\xee\x13\x62\xcf\xb3\x2a\x19\xce\x13\x26\x10\xa5\xb7\x2b\xbb\x6e\x2e\x0f\xed\x71\x07\xb7\x30\x06\x77\x63\x27\x39\x5c\x14\x77\xb2\x2b\x8f\x63\xee\x45\xce\x93\x98\x79\xdd\x17\x27\x57\x46\x13\xfa\xd3\x12\x34\x77\x5d\x1a\x45\xc2\x67\x48\xa7\x3d\x83\xff\xc9\x79\x2a\x80\x51\xa5\x20\x7d\x7d\xa7\x71\xe9\xdf\x38\x2d\x34\x0a\x24\x3a\x76\xae\x9b\xba\xee\x14\x56\x7b\xad\x3b\xf9\x97\x20\xe9\x70\x0f\x83\x99\x0a\x49\x90\xc8\x79\x5d\xef\x4c\xfd\x5e\x2d\xaa\x30\x2d\xb3\x58\xaa\x50\xd7\x81\xc9\x6f\xb3\x6c\x89\x17\x60\xbc\x6a\x79\xa6\x18\x52\xbd\xd3\x9e\xff\x63\xb1\xb8\x6c\x22\xf3\x42\x2a\x75\x82\x33\x5d\x1d\x9b\x41\x90\x8b\x73\x19\x29\xe1\x4a\xd4\xae\xe5\xc7\xc4\xc0\xe4\x32\x29\xb0\xbe\x97\x9c\x36\x5c\x68\xcf\x81\x7a\x75\x57\x56\x30\xed\x2f\xe9\x5b\xf7\xe6\xe1\xf5\x7c\x3e\xcc\x88\xf5\x8d\x80\xa6\xdf\x76\x0f\x7b\x7d\xf8\x5a\x9b\x9b\x73\x15\xe9\x22\x88\xb8\x54\xc7\xf6\xd1\x5a\x7f\x23\xc5\x13\x2a\xcd\x21\xb2\x61\x02\xa5\x9c\xd5\xfe\x5d\x1e\x0d\x95\xe6\x82\xd8\x77\x76\xbf\x7f\x68\x52\x0f\x00\xe3\xe9\x28\x27\x43\xac\x23\xeb\xc8\x9e\x08\x2d\xf6\xcb\xa1\xf9\x6e\xea\xe6\x7e\xfe\x63\x32\x85\x35\x8b\x7c\xba\x64\x00\x3c\x6c\x3f\x2f\xb4\x3b\x7d\x04\xed\xb4\x37\xcb\x76\xd9\xc1\x7e\x4d\xfa\xe7\xbf\x85\x46\x89\x2a\x02\xeb\xcd\xe2\x42\x82\x8f\x73\x9d\x31\xb4\xb4\xac\x2b\x9e\x1a\x4a\x9f\xb3\xf4\x22\x05\x31\xe7\x3a\xb7\x98\x86\xbb\x59\x3e\xcc\x1e\xe6\x8b\x81\x87\xcb\x4d\xc4\xb9\x72\x78\x13\x84\x1b\x96\xe1\x58\xe6\x46\x59\x3c\x96\x6d\xdd\xdc\x0d\xe9\xd3\x39\xb7\x3c\xf5\x82\x63\xf7\x65\x35\x62\xa3\xe3\xdc\x5a\x83\x88\xba\xcd\xdd\x03\x05\x0b\x27\x68\x52\x2e\xa2\x28\x47\x22\x82\xb9\x6c\xae\xea\x6a\x1e\xb4\xe5\xb8\x88\x8a\x0c\x8d\x93\x16\x3a\xac\xad\xc6\x2a\x4a\x79\x1e\x82\x19\x8e\x89\x60\x29\x09\xd6\x06\x02\xfb\x8f\x91\x79\x21\x78\xc2\x31\x84\xf8\xfd\xf9\x6e\x3e\x7b\xd8\x3e\xad\x1e\xef\x17\x9b\x6f\x8b\xe7\xf5\xf6\x7e\xf6\xc7\x76\x3e\x5b\xdd\x3e\x86\xae\x79\xee\x80\xf5\xb8\x1a\x7f\xc8\x31\x4f\x3d\x17\x5c\x92\xd4\xda\x8b\x57\xee\x99\x75\x1d\xec\x0f\x67\x0b\x56\x70\x10\xe8\xad\x9d\xcc\x2c\x37\x4c\xe1\x56\x22\xe6\x26\x44\x4c\xbf\xc9\xf6\xf5\x92\xff\x2d\x44\x02\x85\x1b\xea\xd9\xdb\xcb\xad\x6c\x7f\x3b\x6d\xec\xae\x44\x8f\x8b\x98\x2b\x25\xbd\x6c\xdb\xcb\x45\xf7\x51\xc4\x5c\x63\x86\x7d\x80\xf0\xfb\x32\x0e\x23\x62\x25\x75\xe2\x21\x6f\xbe\x6c\x63\x2e\x0f\xcf\x23\x3a\x4e\xd7\x39\x51\xc6\x0b\xe4\xaf\xf0\xe7\x5d\x70\x22\xbc\xf4\xf8\xde\x89\xb2\x9e\x36\x7d\x42\x36\x71\x89\xd0\x84\x8b\x14\x38\x16\xc0\x3d\x6f\xe6\x1b\x3f\x7e\x19\xb3\xc8\x85\xf9\xd2\xc8\xaa\xbb\x2d\xdf\x90\xa8\xf1\xf7\xa3\xa9\x2f\x57\xe4\xe1\x05\x86\x51\x68\x6f\xb1\x47\xad\xed\x66\x32\xd8\x79\x9a\x63\x1e\x61\x27\xdb\xee\xf7\xd3\x69\x20\x72\xa3\xd0\xe2\xda\x13\x45\xd4\xf6\xe0\x70\xbe\xae\xb9\x10\x26\x71\xa6\xce\xef\xa0\xa4\x6a\x51\xe9\x18\x6f\xd2\xff\xdf\xc9\xbb\x17\x3a\x31\x94\x4c\x72\x71\x89\x61\x24\x95\x8b\x02\x12\x9e\x3b\x62\xde\xc7\x0a\xd0\xeb\xf9\x56\x7b\x98\x21\x17\x32\x05\x34\xed\x51\x43\x9d\xb1\x24\x39\x13\x51\xff\xd2\x35\xf6\x77\xc9\x59\x32\x64\xca\xa5\x3d\xf1\x6b\x13\x48\xc8\x5c\x7a\xf2\x4d\x8c\xe3\xdd\x95\xa7\x0a\x2c\xd7\x45\x25\x44\x61\x7c\x75\x95\x0f\x4d\x59\xa1\x52\x8b\x14\xcd\xb0\x2f\x3b\xbf\xaa\x47\x04\x16\x97\x77\x70\xa1\xf2\x0c\x73\x4b\xdd\x9b\x0e\xb7\x92\x39\x6e\x4b\xaf\x65\xf3\x49\xa0\x48\x28\x4d\x6a\x98\x44\x44\x80\x49\xb3\xdf\x06\x81\x7c\x2e\x74\xc2\xb4\x09\xb2\xa0\x98\x7a\xff\x0a\x69\xc4\x85\x96\x11\x9a\x0b\x0a\x7a\xf7\xe5\xa1\x6e\x5a\xb0\x65\x13\x3e\x0a\x70\x2e\x29\xfc\xdd\xf6\xf6\xe7\xd1\x21\x89\x29\x68\x7f\xd9\x8e\x16\x96\xa5\xf8\x1e\xf2\x70\x00\x49\xac\x36\x97\xbe\x94\xe5\x5a\x0d\x95\x2c\x7a\x5f\xff\x52\x7e\xfb\xfc\xa4\x89\xa3\x44\x20\x6a\x6b\x8d\xf5\xec\x9b\x6f\xab\xc5\x62\xbb\xd8\x7c\x1b\xb2\x83\xf2\x38\xca\x0d\x56\xf8\x3f\x2d\x1f\x2e\xbb\xcf\x5f\x5b\x39\x71\x54\x98\x34\xf1\x0c\x6a\x3b\x90\x2f\x80\xe0\x87\xcb\xd6\x59\x1c\x99\x08\xe9\x0f\x2c\x40\xeb\xa3\x16\x55\x78\x14\x9b\xe1\xe4\x31\x65\x7b\x38\x86\xc8\x50\xcc\x98\xd0\xe9\x00\x25\x55\xdb\x72\x77\x59\x6c\x86\xc7\x4c\x88\x64\xa4\xdd\x4d\x71\x8a\x21\x79\x5f\xee\xbb\xc6\x94\xd4\xfd\x73\xa4\xdf\xc8\x63\x96\x10\x98\xef\x7b\xfd\x0b\x76\xd7\x44\xb7\xe6\x03\x6d\xe7\x71\xe4\x98\x25\x0c\x83\x64\x9b\xb2\x7b\x3d\x3d\x72\x6a\x53\x2c\x5b\x6a\xa4\xde\xc1\xb2\xf3\x95\xb5\xe3\x08\x7b\xcc\x63\x97\x93\x91\x16\x86\xe2\xd5\xff\x37\x4b\x39\xe6\x05\x65\xf7\xd5\xf1\x83\x44\x45\x0e\x65\x85\xf9\xfd\xf1\xc8\x8b\xc8\xa2\xe5\xf0\xb4\x3b\xee\x7d\xfa\x8d\xc7\x42\xb3\x2c\x1a\x22\x4c\xf8\xf4\x32\x4d\x33\x1b\x4f\x01\x44\x8c\x78\xff\x2d\x8e\x73\x42\xa6\xb7\x28\x93\xfc\x5c\x11\x26\x8c\xc2\x43\x14\xed\x9b\x9c\x41\x71\x12\x09\xcf\xb7\xf1\x54\xd7\xbb\xe9\x23\x26\x4c\xc6\x0e\xc1\x81\xfb\xcb\x43\xdd\x49\x82\x2a\x0c\xcf\xfb\x38\x49\xf2\x28\x0b\x7c\x94\xe5\x4b\x25\x3b\x30\xc4\x92\x32\x4d\x51\xc4\x49\x16\xa1\x8f\xe9\xf9\x18\x08\xf0\x54\x86\x53\x38\x4e\x54\x81\xdc\x00\xd7\xdf\x97\x4f\xd3\x6b\x4d\x8e\xf3\xee\x01\xde\xbf\x41\x53\x4f\x5a\xd3\x88\x65\x8e\x29\x2a\x30\x55\x8e\xbe\xdd\xf8\xd5\xd3\x28\x8f\x9c\xfb\xf8\x06\xaf\xa5\x1e\xa8\x74\x4e\x96\xdb\x17\xff\xf8\x7b\x09\x92\x9a\x5a\xf7\xd3\xc6\x61\xc9\xfc\xfb\x64\x11\x4b\x5d\x9d\x69\xdd\xc1\x63\xf5\x52\x9f\xce\xb1\x38\xcb\x2c\x5e\x88\x62\xdf\x43\xea\x08\x1e\xe7\x2c\xc7\x24\xef\xb1\xea\xfd\xe6\x13\xae\x9d\xc7\x05\x13\x08\x7c\xee\x8d\xa5\xf5\xf2\xe1\xf6\x6e\xb1\x5d\xae\xd7\xcf\x8b\xeb\xed\xcd\xea\xf1\x7e\xfb\xb8\xf9\xb6\x58\x6d\xe7\xcf\xab\xd5\xe2\x61\xbe\x5c\xac\xc3\x65\xda\x7a\x17\x7e\x2b\x77\xbb\xad\x7e\xed\xfd\xa7\xea\xe5\x34\xf4\x32\xb2\x08\x4a\x55\x64\x23\x88\xf0\xf7\x44\x60\x92\xe4\x11\x17\x4f\xf8\x6b\x5a\x20\x79\xd2\x5e\xfe\xba\x95\x2d\x39\xed\xa1\x0d\xd2\x98\xe0\x77\xbd\x45\x36\x92\x41\xe2\xb1\x4a\xb2\xac\x08\xb8\x7c\xa7\x59\xe2\x66\xf2\x25\x7b\x32\x56\x69\x36\x20\xc5\x0b\xe9\x83\xa9\x17\x34\xf9\xc0\x86\x27\x82\x07\xef\x69\x35\x90\xa0\x5a\x77\xb2\x3b\x5e\x72\x42\x63\x88\x89\xbf\xe2\xe9\xd8\xbc\x84\x17\x85\xcc\x9a\xc2\x27\x7b\x64\x07\xbf\x97\xbb\xdd\xfa\xbd\xec\xf4\x6b\xe8\x61\xac\x57\xb9\x09\xf1\xaf\x40\x26\xfe\xd4\x0c\xc2\xd8\xc3\x1f\xb3\x85\xc4\x83\x04\xed\x25\x52\xe6\xfe\x9c\xbf\x80\xc7\xd6\x16\x5c\xff\xb5\xb8\x5e\xb8\x20\x89\x12\x8e\xd0\x64\xbf\xe7\xfd\xf3\x08\x27\x0e\xdc\x2f\xa6\x73\xc2\x04\x60\xba\x8c\x34\xf3\xc9\xc1\x6b\x7f\xbc\x42\xe5\x62\x42\xe3\x9f\x61\x79\x91\x13\x69\x6a\x89\x36\x0b\x1a\x48\xbf\xf9\x46\xa5\x73\x97\x24\x44\x35\xa8\xd3\x40\x0c\xed\xe5\x84\x59\xea\x86\xb1\x98\xf9\x19\x23\x2e\x4f\x38\x8b\x71\x57\x98\xaf\xfe\x7c\xda\x3c\x5e\x3f\xde\x85\x06\x01\x99\x0c\x0e\x4a\xa0\xa1\x38\x0d\x73\xc2\x0b\x40\xcb\xea\xa6\x44\x7d\xf4\xbf\x9b\x3c\x1e\xbf\xa4\x88\xc8\x87\xc2\x02\x81\xde\xae\x1d\x0b\x4b\xf2\x7e\x85\xc4\xa7\xfa\xba\x39\x34\x5d\xef\xda\x4e\x76\xbf\x44\x40\x8a\x47\xd9\xb5\x6c\x4a\x6f\x3f\x25\x71\x04\xc8\x80\xb9\x3d\x56\xb6\xde\xed\xea\xf7\xcb\x47\x75\x92\xa4\x1c\xeb\x13\xa1\x32\xd7\xc7\x4e\xbf\x7a\xa2\xde\xcb\x4f\x9c\x68\x8e\x39\x3f\x32\xb6\x2e\x1b\xf3\x93\x4b\x52\xb7\xdd\xa3\x94\xee\xb1\xd4\xa5\x81\xc9\xf3\xa7\x82\xa0\x7e\x1f\x20\x1b\xf6\x5c\x9d\x80\x2d\x3c\x49\x15\x13\x54\xf7\xd3\x4f\x97\xb2\x7a\xb9\x39\xed\x07\x49\xaa\xe2\x1c\xbc\x3f\xe4\xc2\xa0\xd7\x65\x3b\x89\x43\x25\x99\x0a\x8c\xd1\x41\xb5\x8b\xa8\x37\xc7\x8f\x91\x73\x40\xa3\xa5\x77\x49\xdd\x62\xbe\x2c\xb3\xe5\xfb\xcb\x18\xdd\x85\xd2\x05\x1a\xc2\x8e\x34\xee\x56\x44\x02\x57\xff\x88\x06\xf9\x4b\x73\x38\x91\x59\x8e\x97\xdc\xd7\xfa\xe7\x28\x51\x8a\x98\xb7\xbf\x98\x5b\xd3\x7f\x7d\xd0\x2e\x91\x5a\x61\xa8\x96\xcc\xe5\x6b\xf0\xf2\x1e\x61\xbd\x48\x30\xc8\xa6\xe7\x4a\xa3\x7a\xc3\x8d\xbc\xc0\x13\x47\x51\x58\x3a\x8a\x67\x18\x15\xb2\xd0\xe9\x57\xd4\x8d\x1f\xbf\x82\x12\x96\x2a\x6d\xa9\x82\x63\xdc\xa8\x99\xc0\x53\x92\xa2\x6e\x8f\xd5\x39\x37\x28\x4f\x74\x9e\x61\x9f\xfb\x8f\xc5\x6a\xce\xb9\xb8\x24\xba\x3b\x19\x36\x23\xc9\xf3\x33\x8d\x2c\xab\xd9\xf3\x7c\x72\x47\x10\xb1\x2c\xbc\x27\xfe\x3f\xc7\xe6\xa3\x3f\x3a\x27\x0e\x7d\x02\x99\x0a\x05\xb4\xdd\x80\xdd\xd1\x37\x17\x60\xb8\xaf\x9b\x6a\xcf\x0c\x91\x04\x54\xa2\x4f\xbc\xd6\x2b\xc7\x99\x1f\x1a\x8d\xf4\x3c\xe3\xf5\xaf\x8f\x4b\x28\x74\x9e\x00\x70\x64\x7b\xbc\xff\x20\xe3\x6a\x68\xb4\x26\x60\x35\x96\x0c\x5b\x0c\x95\x12\x73\xc5\x74\x70\x6d\x4c\xac\xa0\x16\x60\x48\x20\xc2\x13\xab\x00\xf3\x0c\xf7\xd0\xc9\xdb\x53\xd4\x3c\x8d\xa4\x21\x4c\x4a\xd9\x8d\x81\x03\x69\xa4\x0c\xc6\xeb\x3c\xd5\xa5\xc3\x25\x21\x82\xb6\xfd\x12\x9d\xc4\x27\xe8\xa4\xf1\x97\x4a\x99\xcc\xf5\x90\x89\x55\x7d\xec\xdd\x60\xb8\x0e\x3c\x8e\x52\x27\x46\xbb\x74\x30\xd1\xb9\x3c\x8c\xdf\x34\xed\x0f\xfd\x7e\xa8\xde\xfd\xe9\x38\x4c\x8c\xa6\xfd\xf6\x8e\x14\x72\x88\x02\x4d\xb6\x4f\xab\xa5\x27\xe3\xe1\x29\x37\xe0\x4f\x90\x6d\xdb\xc9\xb2\xd1\xbe\x58\xc1\xaf\x86\x54\xc4\x71\x9e\x78\xd5\xf9\x3d\x8c\x0a\xac\xbe\xde\xd7\x53\x91\x65\x98\x7b\xfe\x59\x76\xdd\xc7\xed\xc7\xde\xff\x6a\xcc\x4d\x44\x99\x1e\x2d\x3f\xc0\x7c\x46\x6d\x36\xde\xa1\xd3\x44\x14\x98\x92\xa3\xd5\xe2\xd8\xe0\x3f\xd9\xa6\xff\xe2\xc1\x92\x24\xc3\x60\xd4\xcc\x00\xec\xe4\x06\xfa\x21\x0b\xf1\xff\x34\x29\x14\xae\x9f\x5b\xe8\xe6\x65\xf7\x71\x27\x2b\xf3\x70\xdc\xb7\xa1\xd9\x50\xac\xab\x91\x1d\xac\xe1\xc4\x18\xc8\xd3\x54\x48\xca\xb9\x2e\x56\xeb\xc5\x6a\xe6\xf1\x10\x69\x16\x09\x2c\x30\xb9\x7a\x9c\xad\xae\xb7\x2c\xfc\x99\x53\xcc\x7f\x4b\xa0\x3e\xac\x57\xa1\x42\xcb\xc9\x07\xce\x0c\x60\x30\x8b\x72\xb9\x94\xc9\x1a\x2f\x97\x34\xe7\x04\xb8\xc5\x90\xf2\xb1\xea\x3e\x3e\x17\xa7\xe1\x69\x2e\x88\x66\x82\x98\xd9\x02\xbc\x6a\x59\x39\x4e\xf5\x49\x77\x19\x25\xb8\x14\x9f\x39\xfb\xd3\x3f\xbb\x2a\x48\x86\x79\xf1\xf0\x78\x1f\xfe\x26\x49\xb8\x60\xab\xe5\x01\x89\x30\x03\x08\x91\xa7\x4a\x25\xc2\x85\x20\xfa\x31\x45\x95\xa3\x8b\x9b\x7e\xaa\x14\x91\xb5\xfc\xf8\xf6\x78\x7f\x59\x0a\x99\xa7\x9a\x25\x08\xa3\x74\x75\x39\x17\x08\x5c\x79\xaa\x53\x09\x9f\x40\xdb\xc6\x3f\xa8\x15\x14\xd2\x4b\xf9\x93\x60\x74\x7b\x8d\x28\xd4\x49\x96\x8c\xa5\xd1\x3f\xe8\x1f\x77\xa5\xb1\x84\x37\xc2\xf0\xb4\x07\x2c\xdc\xd4\x44\x73\x74\x7b\xda\x3f\x20\x01\x5c\x42\xb7\xd0\x39\x1d\xda\x51\xfc\x63\xfc\x38\x90\xe5\x8e\x5e\xac\x32\xd7\xb0\x0b\x0b\x44\xba\x5a\x3c\xd7\xcd\x0a\x72\x2e\xef\x97\x0f\xcb\x87\xdb\x31\x1f\x28\x4f\x6d\x6c\x31\x6c\xd6\x85\xd4\xe0\x84\x26\xcd\xf7\x4b\x1d\xd3\x01\x74\xf3\x46\xda\xde\xb2\xb8\x3c\x65\xac\xca\xa2\x24\x60\x91\xeb\xa3\x67\xef\x76\x3f\x98\x45\x4a\x1b\x17\x93\xed\xa7\x70\x59\xbd\x10\xc2\x81\xa0\xb1\xa3\x37\xcc\x18\xcb\x19\x11\xe7\xef\x4e\xb8\x8b\x8c\x15\x99\x74\xe6\xc9\xb2\x3d\x51\x30\xb9\x56\x1e\x47\x18\x89\xde\x3a\xd7\xf6\xeb\xbd\x22\xe3\x45\x8c\xee\x53\xe5\xb2\x88\x37\xb2\xd9\x9f\x80\x89\x19\x2f\xcc\x40\xb9\xfa\xd8\x4d\x23\xb6\x19\x97\x69\xe4\xf6\x45\x0c\x31\xe3\x67\xb8\xfc\xc1\x32\x6e\x81\x91\xf4\x88\x23\xa9\xff\x6c\x0f\x1a\xff\x84\x48\x08\xd9\x30\xff\x50\xbd\x59\x31\xd0\x22\xbb\xe4\x36\x64\xc2\x2a\x64\x3a\x39\x90\xf4\xce\xf6\x7d\x44\x1f\xc6\xb3\x38\xe2\xe8\x56\x28\xfd\x3a\x8a\x78\x65\xb1\xcc\x31\xc2\x5a\xea\x1a\x21\x61\x82\xb4\xfb\x7d\xab\x89\xf0\x45\xef\x66\x3f\xe6\x9f\x72\x6f\x4c\x9e\x3c\x29\x00\x86\x19\x08\x12\x2d\xbe\x92\xfa\xe7\xa6\x5e\x03\x12\x51\x8c\x1e\x3d\x8d\x0c\x15\xb6\x0f\x52\x47\xa3\x23\x39\x4b\x59\x8c\x39\x8b\x7b\xd9\xbd\x3e\x77\xe5\x2e\xfc\x3d\x8d\x70\xab\xdd\xc9\xb6\xbb\x29\xab\x32\xa4\x4e\xb2\x14\xa8\xa0\xf7\x2d\x80\x14\x91\xaf\xa0\x7d\x3d\xe7\x01\xf3\x86\x5f\x96\x5a\x91\xba\x19\xd6\x9f\x64\xd7\xb2\x93\x57\x1f\x23\xf2\xf9\xd0\xd1\x20\x4b\x41\x5d\x6d\xe4\xaf\x2f\x89\x37\x79\x96\x45\x0c\x73\x28\x07\x68\xb4\xd3\xd7\x2b\xf7\xd0\xb2\x28\xf2\x8f\x9a\xb1\x64\x80\x8d\x46\x00\xd6\xba\x9c\xec\xb1\x59\x9e\x19\x84\xbf\x5b\xf0\xdb\xd9\xd0\x02\xc9\x72\x65\x22\x4e\x9b\xd9\x55\x5d\xef\x40\x56\x54\xb3\xe4\x9a\x8b\x34\xce\xd5\xa9\x12\xba\xeb\x0d\xbf\xee\xb7\x29\x46\x6c\x54\x28\xc2\xb3\xc2\x52\xc6\xc3\x07\xc5\x3f\x25\xb3\x1b\xbf\xb0\x8c\x59\xee\xe6\x13\x16\x95\x9e\x66\x9a\xcc\x04\x26\xba\xc8\x2a\x9b\xc3\x39\x9f\x95\xef\x98\xcb\xe2\x24\xaa\xe3\xb2\x13\x30\xac\x30\x18\xcf\x7d\xa9\x63\x8c\x11\x18\x20\x13\xe8\xb3\xdb\x42\x86\x29\xcd\xeb\xdb\x6b\x0c\x78\x84\x07\x53\xa9\xc9\xc9\xe2\x23\xfd\xcd\xaf\xdc\x99\x4c\xe5\x11\x8a\x4a\xbc\xe3\x0c\xfd\x01\xea\xc3\xd4\xe1\x46\x85\x88\xbd\x1a\x2c\xc8\x3d\x55\xa9\xb4\x41\xd8\x9e\x67\x9a\xc7\x10\xe0\x26\x78\x96\x0f\xd0\x87\x99\x16\x0a\xc9\x5b\xea\x0a\xfe\x04\xd9\x84\x3f\xe7\x89\xd2\x5e\x23\xa4\xd4\x3f\x11\x04\xf7\x44\xf3\xc9\xf7\x31\x91\xb4\x2e\xb7\x0b\x1d\xcc\x1a\x55\x76\xe7\x82\x34\x3c\x33\xa2\xc0\xe8\xd5\xc3\xe2\xf1\x6a\x07\xc7\x70\xb5\xca\xb5\x8b\x4e\x91\xb2\x29\xed\xe1\xbe\x19\x38\xe0\x73\x55\xf0\xab\xdf\x0f\x81\x52\x15\xbe\x31\x56\x0c\x19\x39\x30\x28\x43\x74\x4c\x83\xf3\xe8\x31\xcc\x51\x80\x0c\x63\x71\xfd\x62\x0d\xf4\x0b\xfd\x9f\x0d\x44\x9e\x49\xb4\x93\xbb\x21\x9d\xff\x78\xe4\x6d\x91\x21\xec\xfe\x5e\x36\x2f\x32\x54\xcb\xf0\x3c\x62\xd6\x0b\xd7\xf7\x3e\xe9\x72\xa0\x18\x33\xde\x99\xf2\x28\x15\x3a\xd4\x25\xee\x43\x9a\xda\xb7\x66\x89\x74\x50\xc3\xed\x01\x3f\x5d\xe0\xf5\x1a\x3d\x48\x1e\x81\xc5\x8e\xae\x75\x53\x5f\xa1\x7f\x38\x1e\xeb\x9c\x45\x05\x9a\x89\xc4\x3d\xd0\x6d\x60\x7f\xd8\xf5\x9e\xd2\xe5\x74\xc2\xe7\x11\xa1\x9c\x69\x81\xd4\xdf\x5b\xb7\x87\x7c\x8d\x1e\xc8\xb9\x4d\x12\xe6\xcf\x6c\x1f\xad\x43\xae\xaf\x5f\xdd\xdb\xf4\x21\x45\xbf\x51\x8e\x59\xd1\xd0\x9f\x1b\x49\xbe\x8c\x9e\x46\xe4\x29\x02\x32\x1f\xe0\x57\x19\x26\x76\x9e\x08\x4e\x9a\x8a\xe7\x22\xc7\xbe\x47\x2a\xb9\x3c\x5b\x1b\x93\x91\x4d\x4c\x81\xa1\x8a\x23\x46\x37\x86\x45\x51\x3c\x4f\x2c\x99\xb0\x68\x95\xfa\x9a\xb9\x73\x97\x3a\x4f\x35\xd3\x44\x77\x68\xba\xda\xb1\x7e\x5e\x9e\x0e\x59\x11\xe1\xde\x7c\x57\xbf\x8c\x4a\x5e\xfe\x9f\xa2\x54\x79\x9e\x91\x09\xdb\x7f\xa2\xf6\x09\x9a\x93\x75\x9b\xe7\x39\x71\x77\x1e\xab\x76\x08\x4f\x77\xad\x05\x23\xd9\x06\xd9\x62\x02\x8e\x42\xa5\xd5\x24\x3c\x93\x4b\x6e\xb1\x82\x62\x2b\x1d\x3c\xfc\x99\x38\x89\x11\x75\x36\x48\xca\xe7\x32\x2b\xd0\x7c\xfa\x4f\xbf\x57\xf0\xf0\x57\x9d\xa7\x81\x6d\xf9\x0b\xa5\x49\x9e\x4b\xa3\xd1\x94\x9a\x75\x5d\xe0\x25\xe3\xb9\xb4\xb4\xcc\x0f\xc7\xf6\x75\x56\xbd\x80\xcb\x91\xf6\xf3\x64\x28\x38\x30\xb9\x97\x12\x54\x89\x45\xd4\x93\x2d\x74\xdb\xf6\xb5\x3e\xa0\x4c\xda\xca\x83\xfe\xc7\x83\xa1\x32\x49\xf8\xe0\xb2\x55\xc7\xa6\xc5\x89\x38\x2c\xda\xe6\xb9\xca\x39\x06\xc4\xef\x67\x9b\xed\xe6\x71\x33\xbb\xdb\x3a\xde\xfb\xbb\xe5\xbd\x97\xa3\xe5\xb9\x8e\x32\x96\x9e\x52\x1d\xa7\x30\x4e\x18\x50\x0d\x3c\xa1\x3a\xbe\x6d\xff\x70\x2f\xb5\xdc\x6d\x1b\x42\xcc\xf9\x9b\x18\x4e\x9f\x14\x85\xdb\x30\xe4\x18\x02\xe9\x39\x24\x85\xdf\x33\xb7\xfd\x12\xdb\xd6\x17\x26\x3d\x00\x99\x4f\xc4\x16\xdc\x81\x71\xac\xd0\xae\xd9\x46\x16\x3f\x8a\x3a\xee\x7e\x12\x96\xe9\x4e\xee\x55\x7d\x31\xb4\xec\x28\xe6\xce\xe6\x5d\xc1\x62\x92\xbd\x72\x75\x5f\xdb\xe1\x12\xbc\x68\x5a\x16\xfd\x73\x11\xe2\xe4\xd0\xc9\xb2\x7a\x6a\xe0\x54\x6d\xc9\x0b\x11\xe7\xc8\xe0\xf4\x4d\xee\xe4\xee\x09\xaa\xea\x23\xb4\x28\x92\x86\x26\xab\xb9\xb6\x15\xbc\xfb\xe1\x28\x62\x29\xb1\xda\x66\x51\x99\x7a\xfd\xed\x94\x4a\x29\x12\x1e\x61\x38\x65\x7b\xac\x5a\x69\x61\x58\x6b\x37\x79\x91\x24\x21\xcf\xe6\xa5\x7c\x83\xe5\xc6\x6b\xc1\xf1\x22\x65\x19\xfa\x0e\xcd\x20\x8b\x30\x29\x00\xf4\x3d\x13\x89\x51\x7a\x52\x00\xbb\x45\x65\x93\x06\xa6\x9d\x34\x43\x19\xd7\x90\xe4\xfb\x34\x79\x3c\xdc\xf7\x8a\xac\xdf\xcf\x51\x8e\x8b\x4a\xfd\xb6\x28\x83\x7c\xf7\x38\xff\x7d\x71\xbd\x5d\x2f\xbd\xee\x37\x2f\xb2\x4c\xa3\x6f\x31\xf5\x44\x86\x76\x96\xeb\x9a\x47\xb9\x70\x76\x99\x87\x2e\x8d\x9f\x35\x8f\x48\x43\xac\x77\xab\x88\xca\xd3\xc9\x32\x8d\xbb\xc9\x8c\x23\x77\xe5\xd6\x93\x03\x6f\x6a\x54\x26\x1e\xed\x66\x17\xd1\x50\x85\xe2\x11\x26\x8b\xe0\x17\x56\x47\x8d\x3a\xe7\x7f\xaf\xbe\xc0\xdd\x49\x33\xa5\x3d\x3f\x42\x3b\x7f\x95\xcd\x8b\xa7\x0e\x09\xc9\x5c\x18\x50\x83\xf0\x42\x67\x79\x16\x79\xd8\x81\x2d\xab\x91\xd7\xeb\xfa\x18\x6e\x79\xe0\x70\xff\x09\x15\x1d\xd9\x93\xd7\xb7\x8c\xe0\x14\x2b\xd0\x25\xbc\x21\x6f\xde\xd7\xd8\x8d\xc2\xc6\x06\x29\x8a\x91\x60\xe6\xf8\x31\x48\xf0\x15\x36\x53\x4c\x85\xd0\xe4\x76\xc8\x38\xe8\x7b\x18\x95\x9f\xc2\xb2\x6b\x90\xed\xb8\x4c\x32\x90\x41\x06\x9e\xbd\xfc\xe4\x6c\xe4\x3e\xf9\xd2\xff\xd7\xa9\xdd\xdf\x1a\x88\x3b\xbc\x83\xb6\xb7\xb4\xba\xdb\xe3\xc7\x90\x77\x80\xcb\xa8\xa0\xb0\x27\xc9\x17\x1a\x5f\x63\xe1\x5b\x65\x91\xf7\x53\xef\x76\xfe\x30\x94\xba\xe5\x92\xa5\x06\x43\x49\xb7\xd0\x3d\xd4\x5e\x0f\xc1\xe5\xec\xa5\xc8\x8d\x74\xb1\xa1\xdf\xff\x9c\x8f\xc4\x32\xc6\x1b\x87\xec\x7d\x45\x04\xeb\x75\xe0\x4f\x7e\x99\xa4\x14\xa4\xa6\xaa\xc4\xe7\x43\xf8\xbb\xce\x0a\x5f\x66\x5f\xc2\x7b\x7f\x48\xf8\xcd\x42\xa6\x09\xcb\x4e\x85\x88\x4e\x94\xfd\x04\x38\x19\x7f\x5e\x99\x16\x31\xcb\x42\x46\x0c\xd1\xe2\xf8\xd6\x63\x7a\x3a\x2e\x53\x48\x31\x06\x01\x6f\x50\x5d\x97\x6d\x47\xb8\x67\xdf\x9a\xf1\x18\x6b\x23\xd6\x55\xfd\x9f\xa3\xdc\xed\x4b\xf8\xdc\xa1\xf5\x97\x24\xc4\x94\x0f\xfb\x43\x40\xfb\xc9\x0c\x52\x3e\x54\x2d\x1e\x79\xaa\xb2\x90\x39\xfa\x9d\xd2\x13\x65\x5f\x46\x66\x48\x25\x00\x09\x5c\xca\x4a\xd7\x7b\x78\xb4\x2c\xf2\x27\xad\x54\x49\x81\xde\x8c\x1e\x98\x24\x54\xd9\xb8\x0d\x5d\x0a\x81\x3e\x48\x7b\xdc\x2f\x76\x78\x44\xb6\x13\x3e\x3b\x2e\x95\x89\x30\x69\xe6\x20\x77\x57\x30\xac\xac\x90\xba\x88\x39\x89\xef\x94\x1a\xda\x4d\x4d\xa2\x3a\xd3\x8a\x1f\x69\x74\x21\x4e\xd9\x62\x27\xdb\x3f\x29\x9b\x91\x36\x02\x6e\x43\xed\x31\x85\x29\xa9\x9a\xc3\x81\x60\xc7\x9f\xd3\x26\x05\x1a\x90\xb6\x3e\x36\xdd\xeb\x80\x3c\x90\x4b\x0b\x05\x06\xc2\xee\x16\x57\xab\x47\x47\x74\xcd\x55\x24\x08\x22\xba\x7d\x81\xee\xa1\x54\x6a\x07\x24\xbd\x38\xd8\x7c\x54\x94\x68\xe6\x95\xb9\xea\x43\xa9\xe7\xe7\x11\x3f\x15\xc9\x24\x71\xa7\xf9\xd3\xae\xee\xce\x6a\x8c\xb9\x62\x59\xa2\xa3\xa1\x0c\x3c\x92\x24\x5e\x3c\xad\x14\x53\x54\x92\xdb\x42\x37\xfb\xcf\x51\x36\xe5\x71\x7f\xbe\x7f\x29\x9e\x26\xe8\xf3\xf6\xfe\xc4\x48\x46\xf6\x73\x7b\x5f\x71\xe7\x8e\xf6\xee\x16\xe6\x73\x3d\xad\x92\x6f\x2f\x8a\x42\x84\xe8\x14\x34\x72\x37\xfd\x51\x1b\x53\x74\xaa\x9f\x84\x17\x29\x86\xfa\x3e\x96\x39\x19\x7e\xd4\xfa\xa7\x82\xbe\x50\x4f\xa5\x84\x31\xd6\x07\xec\x16\x9b\x98\x70\xe6\x93\x01\x8d\x23\x8e\xe4\x1b\xab\xd9\x66\xe1\xf1\x0a\x2a\x8e\x13\x49\xf4\xd3\xef\xcd\x30\x5f\x35\x19\xbe\x38\x91\x98\x01\x22\x4f\xb8\xf7\x53\x86\xaf\x18\x27\x40\xb2\x7e\x75\xf5\xcf\x63\xf9\xab\xee\x86\x14\x0c\x5c\xc5\x99\x49\xb8\xa3\xbc\x5c\xeb\x12\x4e\x78\x5b\x15\x6b\xa6\x8a\x13\x6e\xf9\xda\xfb\x08\xa3\x65\xe8\xfa\x26\x49\x81\x1b\xdf\xa1\x29\x2b\x94\xdf\xa4\xcd\x74\xf4\x9c\x29\xe4\x2a\x75\x50\xbd\xf5\x47\xd5\xbd\x42\x57\xfe\xa2\x74\xdf\x24\xc6\xae\x32\x49\x32\x2f\x06\xda\xce\xb1\x50\x13\xd6\xdd\x3f\x5b\x1e\x33\x4d\xf4\x03\xe4\xfd\x2c\xcd\x67\xc5\x9d\x2a\x4f\x12\xe6\x9c\x98\x07\x78\xc7\x99\x33\xfe\xb1\x22\x8a\x11\x1d\x86\x59\xba\x2b\xe8\xe6\xf5\xee\xb8\xaf\xc6\x24\x50\x17\x29\x63\xb8\x2a\x92\x18\x33\x3e\x8e\x98\xa6\x7b\xed\x17\xff\xb1\x2a\x3d\x89\xef\x05\x6d\xd7\x21\xc6\x4b\x15\x2a\x26\x72\x08\x44\xd5\x0f\xb1\x1d\xfe\x45\x0b\x5b\x60\xa2\x03\x33\x17\xbd\x21\xa2\xcb\x83\xac\x90\x53\xea\x13\x5f\x4c\xe1\xa9\xea\xf4\x98\x76\x97\x29\xb7\xb9\x92\x2c\x87\x11\x9e\x6d\xc0\x9d\xc9\x95\x14\x0c\xcd\xda\x7b\xd9\x94\x55\x98\x10\x32\xce\xf0\xc4\xc4\x95\x34\x97\xed\xeb\x93\x3c\x63\x78\xfa\x5b\xb4\xc8\x5c\xc9\x9c\x45\x48\xeb\xbd\x5a\x10\x73\x8a\x88\xb6\x44\x03\x71\xbf\x0c\xbb\x95\x94\x32\x3a\xd1\xfe\x78\x0a\xee\xa9\xdd\xa5\x54\xa2\xb1\x94\x6f\x2f\x7f\xf5\x07\xfd\x53\x53\xd7\xf6\xd1\x52\xf5\xb2\xef\xa2\x89\x45\x00\x3f\xf1\xf7\x1a\xd3\xfa\x75\x43\xe6\xfd\xd5\xf1\xa3\xb7\xd9\x1d\xe9\x8c\xbf\xc0\x48\x8c\x24\x3e\xf0\xb9\xff\x93\x36\x11\xe7\x23\xdc\xca\x18\x74\xa7\x8c\xb1\x4e\xb8\xdd\xf4\xc7\x5c\x59\x57\xa3\xf8\xc9\x71\x80\x13\x55\x90\x92\xbf\x4c\xe5\x37\x1b\x59\xfd\x6c\x37\x1f\x87\xe9\xce\x02\x92\x61\x69\xfa\xfd\xec\x61\x76\xbb\x58\x39\xef\xcc\xff\x1e\x40\xe4\x13\x3d\xe4\x36\xc9\x4b\xf9\x04\x65\x33\x42\x96\x50\xaa\x64\x36\xff\xea\x9c\x56\xd6\xa6\x68\x46\x97\xba\xde\x76\x43\x5f\x58\x47\x51\x81\x68\xa7\x6d\xbf\x7c\xbd\xbd\xd0\x7c\x81\x0e\x1e\x3d\x85\x8e\xb4\x41\x90\x90\x97\x4a\x68\xc7\x51\x37\x1d\x19\x86\xa5\x7c\x15\xbc\x8f\x42\x1e\x93\xdb\x30\x43\xb4\xec\x37\xb2\x6a\x87\xfb\x98\xe6\x45\xae\x46\x05\xf0\xc3\xd7\xd2\xdc\x58\x74\x54\x3a\xa4\x26\x2b\x77\xeb\xde\x78\xeb\x56\x80\x76\x52\xbf\xf4\x1e\xea\x6e\x20\xaf\xcc\xb5\x88\x23\x4b\xa0\x2b\x3b\x77\x41\x88\xd1\xcf\x09\x48\x4d\xe1\x94\xd2\xcb\x86\xb6\xd4\x9b\x23\xf8\x3d\x5f\xc7\x11\xc7\xbd\xae\xab\x8d\xfc\xf0\x25\x38\xa1\x31\x06\x0c\x1d\xba\x0c\x95\x17\x3b\x1b\xbf\x69\xac\xa9\xd6\x73\x2f\x7f\xc2\x29\x40\xf0\x59\x32\xe6\xd3\x65\x37\xbe\x69\xc2\x2c\x7a\x5e\xd7\x0f\x33\x0f\xdb\xd1\x49\x41\x81\x05\x24\x17\xfd\xe5\x62\x25\xcc\xed\x70\x3a\x55\x12\xe9\x2f\x88\x53\xd6\x25\x99\x5c\x5b\x16\x39\x1d\x5d\x13\x4a\x5f\x96\xf6\xa1\xf6\xf5\xfe\xe3\x9f\xce\x8c\x70\x64\x9c\x97\x79\xcf\x5c\xb7\x3c\x8a\x45\xe2\xb5\x59\x9e\xab\x3d\x41\xd8\x27\x7d\x18\xa1\x8f\xa4\xf1\xd8\xb4\x4d\x7d\xe5\x19\xb0\x27\x3f\x9b\xf3\x24\x73\x71\x4a\x2d\x0f\x95\x0c\xde\x89\xce\x65\x8e\xd5\xc7\xeb\x3f\xe7\xbc\x32\x0b\xd9\xec\x3e\xc6\x52\xc4\x5c\xe7\x2a\x45\x81\xf2\x9b\xd9\x7c\xf3\xb8\xda\xe6\xe1\xef\x86\xc7\x8e\x7e\xf9\x0d\x9a\xae\x1c\xd5\x6a\xfa\x74\xbe\x2e\x20\xc2\x2d\x76\xfd\xb3\x39\xee\x43\x97\xd0\xa8\x4d\x3e\xac\xbf\xf3\x0d\x4a\xa6\x88\x85\x5f\x2d\x9e\x9e\x37\x33\x14\x10\x9b\x94\xb9\x68\x2d\x29\x49\xed\x28\xd7\xbd\xbd\x1f\x88\xaf\xc7\x23\x60\x72\xd2\x2c\xe9\x4e\x4e\x5f\x6f\xa5\x22\x43\xec\xb8\x27\x18\x89\x95\x84\x5e\x0a\xba\x1e\x90\x0c\x5f\x0e\xe1\x6b\x80\x04\xb1\x5c\x9b\xe5\x62\xc5\xbc\xc8\x99\x7f\x4e\x9b\xe6\xb8\xf3\xdc\xcf\xfe\x78\x5a\xac\x7e\x2c\x96\xa1\x01\x78\xea\x80\xb6\x8b\x43\xad\x5f\x83\xfd\xc8\x78\xee\xb2\x49\x69\x3c\xfd\x8f\x81\x45\x6e\xa2\xc4\x72\x67\x72\xf5\x87\x7f\x65\xe0\xd7\xa6\x1e\xc5\x69\x7c\xc7\x94\xa8\xd0\x5a\xe8\xae\xca\xee\x20\x49\x01\x60\xdd\xd5\xcd\xa0\x2a\x7f\xbc\x48\x0c\x4b\x74\xec\x1c\xe5\xbb\x52\xf7\x16\xd1\x06\x53\x6d\x84\xf8\x26\x74\xce\x78\x18\x0c\x67\x02\x09\x4b\xf0\x08\x5b\x5c\x6f\x9f\x9e\x57\xf3\x6f\xb3\xf5\x62\x3d\x8a\xa4\x19\x0e\x0c\x31\xcf\xff\x5c\x7f\x7b\x0e\x7f\xb3\xb2\x60\x64\x39\xbd\xf5\x3e\xb0\xdc\xc1\xbd\xfc\x85\xdf\x74\x14\xac\x33\x22\x4f\x7d\xc5\xe6\xbf\xeb\x63\x53\xc9\x1d\xae\x32\xd7\x1a\x8b\x02\xe7\xd3\x53\xfd\x73\x92\x73\x30\x49\xc4\x12\x16\xf4\xcf\x56\x2d\x3b\x59\x71\x63\x73\xc6\x24\x59\x8e\xb4\x86\xab\x6f\xc3\xb9\x6a\x92\x4c\x1a\x47\x3c\x8a\xd3\x26\x10\x06\x8c\x07\x21\xc9\x53\x54\x4b\x99\x6d\x36\xab\xed\xe2\x8f\xa7\xbb\xc7\xd5\xec\x2a\xb0\x1b\x98\xc4\x24\x98\x13\x3c\x1c\x3f\xcb\x56\x99\x34\x07\x18\x82\x74\xe6\xf5\xae\x37\x4d\x1a\xb9\xbb\x69\xea\x3d\x2a\x09\x7d\x72\xa1\x36\x18\x32\x9b\x2f\x1e\xb7\xc8\x8b\xe2\x97\x93\x49\x21\xc2\x5c\xf7\x76\x7b\x68\x6a\xe4\x65\x3d\x57\x7f\xe5\x26\x8b\xe8\xc3\x04\x51\xe9\xcf\xe2\xd4\x43\x8e\x53\x7f\xad\x30\x88\xe6\xee\x0d\xa8\x7f\x8d\x19\xce\xb8\xc9\x6c\x4a\x72\x05\xbb\xba\x05\x2f\x6e\xfa\x97\xdc\x13\x94\x3f\x3c\x99\xd7\x26\x8f\x48\xd1\xc5\x96\x4d\x4b\x95\xff\x94\x79\x5e\x56\x81\x21\x99\x9b\x22\x4a\xb5\x3e\xe5\x52\x9c\x06\xa0\x57\x64\xe7\xa6\x10\x56\xf9\x20\xd1\xb1\x7d\xdd\x94\x7b\xb8\xd9\xd5\x75\x33\x3f\xd3\x92\xe2\xa6\xb0\x31\x62\x1e\xec\xae\x3c\x3c\xc9\x8f\xb2\x7a\xb9\xae\x8f\x6a\xd7\xb4\x83\xa8\x93\x91\xcc\x62\xbc\xa2\xdc\xcb\x17\xb8\x08\x66\x30\x32\xcd\x4c\x10\xb0\xaa\x4e\xe3\x7a\x29\xf8\xc5\xa3\xb1\xb5\xed\x6f\x91\x53\xae\xd1\xc8\x4e\x3e\xda\xf5\xa7\xb9\x4e\x23\x15\x4d\x02\xd4\x59\x3d\x50\xf9\xd3\xe7\x39\x6a\x23\x8d\x41\xf3\xe9\x06\xb5\x7d\x08\x66\xe6\xd6\x20\x9c\xcb\x7c\xb8\x8b\x54\x42\x0a\x0a\xdf\x6f\xfd\x6e\x6c\x14\x44\x58\x13\x54\x3b\xf6\xc3\x4f\x54\xf2\x5c\x6f\x9d\xe7\xd9\x30\x0a\x87\x2c\x84\x9f\xeb\xf3\x73\x63\x62\x85\x20\x9d\x83\x4b\xba\x3b\xab\xed\x62\x08\xd2\x98\x34\x41\xaf\xff\x45\x36\xb2\xea\x80\x58\x44\x5c\x80\x77\x59\x79\x05\x4c\xff\xe4\x46\x67\x58\x69\xe0\x2a\xb3\x87\x51\x00\x63\x8c\xc1\x12\x9f\xab\xbb\xeb\xd9\x45\x2d\xb1\xa1\x4f\xe3\xae\x01\xc6\xad\xd7\x2f\xff\xf5\xbc\xbe\x76\xef\x75\x29\x35\x62\xac\x64\x58\xec\xbf\xde\xcc\x36\xcf\xeb\xed\xf5\x62\x76\xb7\xfd\x31\x5b\x6e\xb6\xf3\xc7\x87\x9b\xe5\xea\x1e\x4f\x3e\xff\xa0\xd6\x64\x88\x93\xa5\xb0\xd5\x0f\xd9\xf4\x6f\xf7\xf1\xdb\x17\xc8\x09\x88\x84\x44\xd2\x81\xfa\x00\x95\x0f\xa5\x8c\x41\xad\x5f\x26\x0f\xe9\xed\xce\x57\x3b\x44\x05\x31\x21\x78\x10\x3d\xd5\x24\x39\xbf\x64\xf8\x86\x10\x99\x54\x0c\x49\xb3\x1c\x3f\xc0\xb8\xef\x09\x5f\xeb\x37\x61\x60\xac\xc0\xec\xde\x7b\xbd\xfb\x39\x70\xe4\x81\x71\x29\x8a\x13\xa3\xf0\x05\x92\x62\x0e\x4c\x31\xad\x43\xf6\x79\xbd\xab\x27\xeb\x1a\x98\x02\x24\x66\xba\xbd\x7e\x1a\x55\x41\x00\xe7\x12\xb7\xde\x3d\x25\xee\xaf\x6a\xd9\x98\x91\x0d\x0d\x3c\x11\x48\xf7\x73\xf3\xbc\x79\x5e\x2d\xb6\xf7\x0b\xc7\xd8\x17\xee\x90\x29\x71\x12\xe8\xf6\x1e\x02\x9e\x35\xff\x4f\x3e\x22\xf0\x1c\x30\xef\x74\xd5\x94\xb2\x82\x5f\xc3\x7d\x15\x38\x24\x30\x28\xde\x76\x9b\xcf\xb2\xba\x7b\xde\x4c\xde\x58\xc4\x05\x46\x56\x10\x8c\xb9\x9d\x3f\x6f\x1e\x6f\x6e\xfc\x5d\x62\x6b\x45\x74\x8a\x70\x4c\x10\x8e\xae\x53\x92\x90\x9a\x0c\x1d\x9f\xae\x70\x7d\x50\x84\xf7\xd9\x66\xfe\xc9\xff\x0f\x77\xa5\xa0\xcd\x0b\xd6\x1a\x75\x65\x85\x5e\xff\x45\x90\x0c\xa4\x9c\xd6\x29\xa5\xfe\xe4\xc8\xeb\x84\x34\x89\x30\x61\xf1\x04\xcd\x01\xba\xa3\xdc\x4d\x30\x96\x90\x02\x55\x62\xb9\xeb\xa0\x25\xf6\xb6\xbf\xe2\xa5\x80\xd4\x82\x0e\xde\x3e\x3d\x5e\x88\x69\x41\x96\xb0\xd8\xd5\x86\x5d\x7d\x20\x3f\xe2\x68\xae\x64\x85\x44\x72\xfc\xc5\xe6\x1b\xc8\x5d\xc8\xde\x42\x1e\x5b\x8c\xf8\x6e\xd5\x47\x33\x2d\xfb\x87\xa2\xc8\xd1\xcc\xc0\xec\xdf\x0a\xde\x40\xee\x1e\xdf\xa0\x69\x4a\x33\xed\x29\x73\xd2\xf9\x06\xd2\x73\x5b\x81\x3e\x36\x6d\xf9\x76\x66\xd0\x85\x5d\x72\x7c\x35\x64\x41\x5b\x04\x59\x2b\x1d\x80\x73\x7f\x1e\xe8\x04\x09\x80\x68\x20\x79\x38\xec\x3e\x7e\xc8\xc0\x96\x03\x4a\x50\xe1\xb0\x34\xe6\xd1\x5a\xe4\x96\xb9\x98\xf8\xfe\x2a\x11\x06\x4a\x80\x88\x5d\x60\x99\x85\x3b\x27\xc6\x04\x45\x90\xe7\xf5\xf5\x89\xcd\x9f\x83\x32\xc4\x1f\xd6\x35\x1f\x8b\x5f\xa0\x7f\xbb\x70\x5e\x82\x4e\x23\xcc\xdc\xd9\x93\x6e\x5f\x98\x0b\x3a\xe5\x69\x50\x3d\x73\x8b\xe6\x7c\xc9\x68\xa0\xaa\xe4\x86\xb8\xe3\x97\xda\xa3\x72\xc0\x70\x16\x3b\x2f\xfd\x56\x76\xd0\x5b\x4a\xbe\x45\x65\x18\xad\xf7\xd4\x6c\x3f\xea\x33\xcd\x5e\x0e\x90\x2b\x70\x5b\xd8\xfa\xa8\x1c\xc0\xff\xf1\x00\xd3\x25\x07\x92\x30\xed\x2d\x74\xc7\xc3\x4c\x6b\x14\xbc\x0e\xab\xfc\xf2\x41\x09\xa0\x93\x6c\x28\x51\xdf\x04\x8a\xf2\xf1\x27\x05\x4d\xb2\x67\xf3\xcd\xe3\x38\x80\x63\x23\x91\x3b\x55\x1d\x8c\xe0\x1f\xc7\xa8\x2e\xdf\xa9\x48\x33\x9f\x68\x2c\xed\xb9\xe6\x2b\xb7\x2c\x97\x18\x3b\xf0\xa3\xff\xc9\x03\x5b\x9e\xc4\xda\x81\x6d\xee\xa4\x4b\x53\xd5\xcd\xa6\x01\x98\x70\x45\xfb\xfe\x32\x8a\x07\x1c\x06\x03\x92\xef\xb3\xb2\x79\x2b\x44\x1e\xfb\x40\xff\x2d\x54\xd1\xec\x12\xfa\xc6\x0a\xc9\xb0\xb6\x60\xd1\x68\x1e\x5d\x90\x26\xb8\x54\xf3\x60\x85\xa6\xe5\xd3\x3b\xfc\x13\xea\x30\x1b\xe7\x80\x7c\x82\xb4\x4b\x92\xc6\xf5\xf6\x69\xb5\xc0\x10\xdf\x66\x79\xbf\x58\x6f\x66\xf7\x4f\x93\xa7\x88\x41\xa1\xdd\xa6\xeb\x50\xf7\x6c\x93\xd4\x5a\xe7\xb6\xcf\xc7\x5f\x63\x3c\xd6\x29\x97\x38\x86\x9b\xc7\xb5\x33\xde\x96\x95\x86\xaa\x2b\xdf\x60\xac\xf1\xcd\x6d\x9a\x14\x81\xe8\xbf\x91\xda\xd5\x93\x4e\x9e\x25\xcd\x53\x8c\xe5\xff\x28\x2b\x55\x76\x27\x09\x14\x6e\x53\x1d\x60\xb7\xae\xf4\xa7\xf7\x49\x86\x41\x23\x9b\x5a\x4b\x75\x37\x8f\x77\x8f\xab\xed\xd5\xdd\x6c\xfe\xbb\x6f\xca\xa2\x04\xeb\x1a\x4c\xd9\x4a\x45\xa6\xe9\x4d\xdd\xc0\xdb\xe9\xe2\x3c\x49\x11\x68\xad\x8e\x1f\xb3\xea\x1c\xa8\x7f\x61\xa5\xdb\x3c\xb1\x88\xc1\xba\x5d\xcd\x1e\x3c\x48\xc0\x16\x9c\xe1\xde\xd8\x3a\x1e\x49\x24\xfa\xba\xad\x6b\x67\x05\x8e\xe9\x68\x6c\x91\x11\x45\x54\xff\x56\xd0\xb5\x57\x1f\x73\xd9\xc1\x4b\xdd\x7c\x8c\xf6\x73\x2b\x73\x9b\x16\x3e\x86\xf8\x54\xef\x4a\x3d\x49\x45\x59\xed\x14\x71\xde\xa1\x74\x62\xf7\xed\x55\x5d\xd5\x93\xe1\xd5\x05\xe9\x6a\xf4\x1b\xde\x27\x55\xaa\xa3\x29\x37\xc8\xf0\x5b\xc3\x25\x56\xa2\xbc\x20\x5d\xce\x07\x0a\x93\xfa\xd7\x30\xc6\x58\x07\xae\x5e\x54\xba\xf9\x38\x74\x17\xb5\xa2\xb9\x35\x40\xd4\x32\x7e\x93\x38\x29\x29\x4e\xfa\x59\xda\x99\x5d\x62\xfa\x00\xba\x84\xa9\x6e\xc0\x64\x2a\x02\x93\x8c\x42\xba\xeb\xda\x76\xef\xb2\x81\xef\x44\x92\xe6\x8a\x66\x1c\xdc\xc0\xf7\xd6\x05\x23\xf5\xdd\xdd\x0e\x74\x77\xff\xfb\x6a\x32\x54\x36\x22\xec\xd1\x0b\x74\x14\xb4\x99\x75\x17\x6c\x03\x6b\x55\x6c\x89\xa8\xa9\x3e\xdc\x05\x3d\x0d\x11\x45\x11\x09\xbe\x3e\xc0\xfb\x7c\x17\xbc\xd2\xe1\x13\x8b\x28\xd2\x96\x19\xc7\x7c\xda\x42\xb3\xa9\xef\xe1\x13\xf8\x91\x88\x98\xd4\x58\x8d\xff\x2a\xdb\xd7\x0b\xb8\xc2\xbf\xa2\xb3\x9f\xdc\x8d\xf3\x20\x13\xdb\x3f\xe0\x17\x0c\x09\x22\xe2\x49\x92\xa4\x5e\x29\xf5\x0d\x76\xf5\x61\x82\x10\x4e\xe3\xd3\x34\xe9\xbb\x13\x31\x35\xb9\x8b\x57\xc7\x8f\xe9\xed\x14\xc4\x41\x79\x0d\x47\x65\xac\xfe\x77\xd1\x5e\x13\x91\x48\x49\x12\xea\x79\xf3\xb8\x7a\xf0\x83\x2c\x8a\x1c\xf9\xc1\x7e\x94\xed\xeb\x49\xdc\x55\x44\x31\x4b\xb5\x2b\xe6\x44\xff\xee\xe8\x98\xe4\x2f\xbe\xe6\x3f\xc6\xcf\x17\x0b\xa6\x12\x1f\xdc\x24\xb9\x8d\xa1\x7f\x3e\xe9\x9d\x70\xf2\x79\xfb\x7d\xd2\xaf\xdc\xf1\x83\x27\x29\x45\xa2\x09\x20\xe0\x54\xbe\x3f\x4d\x99\x8a\x28\xe3\x11\x6e\xe1\x07\xd9\x74\x15\x34\x5b\xb6\x3d\x05\x4d\x45\x94\xc5\x0a\xd5\x78\x02\x99\xe6\xf5\xc6\x36\xf5\x5e\x8f\xf6\x5a\x11\x65\x45\x8c\xa1\xa0\x57\xd9\x98\xb9\x3c\x04\xfa\x55\xd7\x9c\x0b\x8d\x20\xf4\x5b\xe8\xee\x3f\x16\xb2\xa9\x4e\xba\x7f\x22\xca\xf3\x38\xb5\x03\xbf\x09\x8c\x27\x39\x98\xce\x8c\x22\x49\x98\xab\x1e\x3a\x89\xef\xce\x4f\xc8\x32\x11\x15\x59\x8e\x71\xc2\x3b\x68\x75\xfd\x06\xbf\x30\xf3\xea\xdb\xb4\xc4\x8f\x54\xea\x7a\x51\x19\x4c\x18\xbd\x78\xda\x7a\x11\x15\x20\x08\xfa\x78\x82\x08\x86\x02\x36\x11\xc9\x58\x66\x0e\x69\xbb\xae\x77\xc3\x8a\x39\x11\xc9\x8c\xa5\x21\x0c\xf1\x15\xf9\xc2\x49\x7c\xe7\x2c\x3a\x21\x22\x25\xf3\xe4\x54\x38\x44\x18\x48\x68\xb6\xd5\x71\x0f\xcd\x49\xcb\x41\x44\x4a\xe5\x08\xa0\xbd\xad\xe5\x6e\x35\x84\xdc\x89\x48\x47\xc4\x7e\x88\xba\x88\xd5\xcf\x28\xf1\x0d\x46\x48\x13\x7b\xa2\x98\x53\x00\x62\x58\xcc\x20\x22\x13\x1b\xa4\xac\x19\xbb\x73\xfd\x7b\x10\xdf\xfc\xff\xa5\x4f\xf7\x8f\xf3\xb0\x9b\x88\x8c\x25\xb2\x98\x90\x84\xbc\xaa\x9b\xa6\x7e\xa7\xc7\xf1\x7c\x24\xe3\xe9\x6c\xf3\x24\xca\x3d\xd2\x89\xd2\x2a\x74\xda\x0c\x59\x80\x3f\xd9\x75\xac\xb4\xa4\xe8\xe9\x64\xff\xc6\xb7\x66\x11\x63\x98\xc3\x9e\x3d\x6c\xd6\xdb\xcd\xe3\x76\xfe\x78\x77\xb7\x98\x6f\xb6\x6c\xf6\xb0\xf9\xb6\xbc\x73\xa5\xda\x82\x45\x82\x8a\x80\x1d\x41\xc3\xa7\xdc\x0c\x82\x45\x69\x86\xd2\x93\xd7\x75\x28\xb3\xfe\xca\xe5\x15\x2c\xca\xb4\xb3\xaf\x7b\xaf\x16\xe5\x50\x66\xd5\xc7\xa6\x9e\x55\x1f\x7c\xfa\xb4\x92\x08\xb6\x11\x82\x21\x3f\xa0\xf9\x2e\x8f\xbb\xae\xfd\x06\xbb\x03\x9c\x11\xc9\xb9\x6b\x58\x16\x03\x09\x2a\x60\xf8\xa2\xec\x3e\x5c\x6d\x9f\xb3\x85\x5c\x37\x9e\x48\x66\x07\xac\x7c\xd3\x51\x3d\xaf\xaf\x14\x8c\x17\x31\x11\x2f\x55\x55\x7d\xac\x34\x22\x69\x9e\x57\x4b\x7f\xcb\x7e\x42\x27\x83\xb0\x57\xdb\x2f\x9b\x65\xe5\x94\xa9\x26\xaf\x16\x67\x2a\x0a\x8c\x86\xcb\xf9\xe3\x30\x0e\x2e\x58\xac\x6c\x9c\xfa\x19\x80\x4f\x7f\x3d\x66\x42\x12\x2c\x06\x8e\xe8\x80\xde\x0d\x5e\xfc\x72\x52\xb1\x7f\x2b\x88\xd5\x5f\x5b\x60\xce\xe7\x20\x1b\x0d\xbb\xdb\xff\xa2\x13\x55\x1f\xbb\x01\xd5\xaa\x60\x09\xe4\xee\xac\xa7\x68\x2c\x0b\xdc\x7b\x82\xa5\x11\x99\xf5\x2d\x10\x2e\xc6\xff\x99\x51\xfa\xd8\xe5\x8c\x36\x44\x3b\x3b\x79\xf3\x34\x06\x4a\x1b\xba\xe5\x36\xab\x0c\x71\x14\x7e\x32\xc1\xd2\x34\xf2\x84\xe0\x8f\xcd\x8b\xac\xca\x96\x78\x4d\xd6\xe5\x7f\x21\xfc\x70\x91\x44\x14\x87\x92\x41\xaa\xf0\x92\x2d\x21\x58\x0a\x12\x63\x93\xea\xf8\xf1\xd8\x78\x16\x70\x7f\x9b\x4c\xe5\xc8\x74\x39\x74\x1d\x1d\x61\xbf\x3c\x4c\xc6\x3f\x67\x51\xc4\x08\x97\xd4\x7b\x81\xbd\x3d\x0b\x72\xbf\x86\xd3\x47\xcc\xb9\x49\x1d\x50\xee\x06\x46\xda\x4d\x9f\xac\x8c\x3c\xcf\x20\xf5\xfb\xa1\xdf\x8d\xae\x3e\xc6\x10\xbb\xc9\x25\x3a\xc3\x5a\x50\xf3\x56\x1e\x46\x9e\x5e\xdf\xa4\x63\x57\x48\x5f\x76\x9f\x8a\xa3\xbb\xce\x05\x23\x95\xae\xae\x7e\x79\xe9\x4d\xf7\x97\x11\xfb\x86\xef\x54\x40\x91\x07\xe6\xba\x1f\x50\xde\xd4\xcd\xf5\xb2\x2a\xbb\xc9\x18\x17\x32\xc7\x82\x9c\x07\xb9\x87\x69\x5c\xd2\x75\x91\x51\x8c\xa8\xf1\xde\x25\xdc\xe2\x5a\x1b\x26\x6b\x7c\x27\x96\x4b\xc7\x43\xbe\x9c\x3f\xe2\x24\xcc\xfc\xb3\xa8\x18\xf2\x41\xd1\xcf\xa1\x6c\x6b\x73\x06\x97\x1a\x3f\x96\x92\x84\x54\xa7\xd2\x93\xbb\x5a\x56\xe3\x2c\xfc\xa4\x37\x28\x3c\x74\xae\x8e\x2f\x54\x02\xfb\x58\xc1\x55\x43\x4c\xfe\xae\x8b\xb1\xc2\x52\xdd\xaf\x59\x76\xb0\x1f\x22\x37\xd8\x78\xa0\x59\xf8\x67\xb4\x0e\x41\x00\x02\xf3\x66\xf7\x61\xe3\x85\x4c\x20\x70\x5e\x12\x9c\xfe\x2b\x34\xae\x60\x60\x0a\x9c\x30\xd7\xd0\x6a\xd9\xa0\xf8\xf6\xe9\x90\x66\x16\x0a\xa4\x62\x81\xca\xdc\x36\x67\x5c\x00\x82\x47\x11\x89\x5f\xd3\xde\xb1\x6d\x3f\xf6\xaa\xde\x0d\x7d\x22\xc1\x23\x16\xa3\x45\xd8\x4c\xd0\xf7\x17\x03\xff\x82\x47\xc2\xe0\x9e\x84\x55\x69\x6d\xf9\xd2\x7a\xa2\xf5\x4f\xba\x27\xba\x20\x48\x7d\x6f\x9a\x5f\xc9\x2a\x88\x3f\x09\x1e\x99\x02\x69\x17\x65\xdb\x42\xd3\x2d\xfe\x73\x81\xd0\x51\x70\x16\xa5\x28\x7e\xe6\x8b\x65\xfe\xe6\xfe\xc7\x19\x13\xc6\xed\xd4\x57\x2f\xbf\x3e\xaf\x6d\x16\x9c\xc5\x29\x42\xc7\x1e\xbe\x0d\x79\xae\x04\x67\x69\x22\xa4\x2f\x91\x73\x70\x28\x82\xb4\xba\x25\x73\xb2\xd6\x39\xcb\x44\xec\x53\xd9\xaf\xf5\xfb\x06\x7e\x75\xe1\x36\x39\xcd\x70\xcf\xc7\x72\xce\x73\x23\x38\x67\x1a\xd1\xaf\xaf\xb2\x1d\x05\x9a\x87\x21\x1b\xc1\x79\x96\x51\xe5\x65\xfd\x12\x68\x6d\x66\xe6\x53\x1f\x26\x5c\x65\x74\x1c\x92\x0e\x58\xf5\x30\x1a\x28\x2e\x99\xc6\x45\xb0\x3b\x02\xc6\xff\x46\x83\xc0\x75\x86\xa6\x8d\x91\xf5\xfd\x90\x68\x40\x70\x11\xa5\x86\x0f\xe6\x4d\xbf\x13\xfc\xb1\xbc\xbe\x94\x26\x11\x5c\xa4\x31\x06\x2d\x30\x7f\xe8\x11\xc1\x82\x0b\x19\xa5\xc4\x45\xdb\x75\xf5\x3f\x8f\xe0\xeb\x13\x05\x4f\x0b\x2a\xd6\xf8\x08\x55\x6f\x82\xa7\x0a\x10\xcd\xdb\x9b\xc6\xf2\xd8\x84\xbe\x59\xce\x30\xf5\x7c\x75\xfc\xb8\x59\x6f\x3e\x0d\x59\x8e\x9f\x28\xcb\x49\xce\xeb\x05\xc3\x28\x5d\xd9\x1d\xcd\x80\x0b\x7a\xda\x59\x65\x96\x48\xa3\x1e\xea\xee\x5f\x03\xae\xab\xf1\x9c\xcb\x85\x55\x6e\xc6\xf8\xe5\x31\x99\x6b\x32\x89\x33\x97\xd8\xe8\x5d\xba\xf1\xaf\xc8\x8c\x63\xec\x41\x96\xcd\x75\x53\x1f\x48\x44\x6c\x3a\x5b\x65\x61\x33\x12\x28\x44\xfc\x09\x9d\xbe\x97\x9f\x5a\xe5\x09\x7a\xa7\x5d\xb9\x87\xb5\x3e\xf9\x2d\xdc\xa4\x0c\x94\x27\x08\x7b\xdb\x78\xd3\x7c\x58\x49\xe6\x7a\x42\x1e\x79\xb5\x51\xd7\xc1\x93\x4a\x7c\x7d\xd8\x70\xd0\x92\x11\x4c\xe6\xad\xfe\x09\x33\x94\x12\xbd\x54\xa1\x21\x38\x58\x83\x92\xea\x0d\xf4\xae\x4d\x83\x04\xd8\x5f\x19\xe3\x97\x65\xef\x04\xb7\xa9\x44\x6a\xd4\x7a\xf7\xb1\x3f\x84\x03\x8d\x5b\x9d\xa3\xdb\xfd\x43\x56\xfa\xc4\x9c\x2e\xb8\x85\x02\x13\x83\x3b\xb0\x5d\x91\x8e\x5f\x5b\x44\x5c\xe2\x31\x42\x7b\x9b\x3f\xa6\xcf\x96\xbd\x88\x12\x09\xae\xc0\xe1\x61\xc8\x2d\x3d\x7a\x43\xc1\x22\x8e\xeb\xf6\x76\x76\xbf\x78\x9a\x3d\xaf\xbd\x28\x54\xdf\x92\x62\x2d\x83\xf7\xce\x9c\x88\xe1\x25\x6d\x5c\x21\x58\x9c\xe2\x69\x85\xe7\x69\xf7\x5e\x6f\x9a\x23\xb2\xaa\x35\xc1\x4f\xec\x4d\x1f\x4a\x30\xf6\xa7\xd9\xba\x9f\xd2\x55\xe7\x25\x91\x7c\x97\xdc\x22\x9a\x67\xf3\xda\xd4\xef\xed\xb2\xa2\xea\xdf\x23\x4a\x68\x0f\xde\x8c\x15\x3c\x26\x71\x2d\x5d\xee\xe5\xee\xa6\xf9\x82\xaa\x51\x08\x66\x20\x76\x29\x7b\x64\xfb\xfd\x7b\x6b\x50\xf0\x84\x79\x91\xba\xcd\x2f\x5d\x4f\xf2\x23\x42\xf0\x94\x3c\x99\xb6\x37\x0b\x06\x14\x25\x42\xf0\x3c\xc2\x2a\x18\xe8\xa7\xff\x80\xfe\x5f\x08\x2e\x39\xee\xc4\xc7\x4a\x79\x4e\x96\xf1\x30\x0a\x6e\x1c\x1d\x60\x43\xed\xed\xe2\xd7\xe1\x93\xf7\x12\x02\x32\xeb\x7f\xc6\xeb\x63\xfa\x48\x86\xef\x93\xa5\xfa\x44\x32\x82\xd0\xb3\x4b\x9b\x83\x10\x16\x22\x87\x94\x72\x74\x54\x3a\xb0\xe4\xf8\x49\x2c\x92\x5c\xea\x93\xe6\xd5\x64\x38\xd2\x2c\x22\x91\xe2\x7e\x88\xc7\x62\x44\x42\xa4\x4a\x23\x40\x6c\x2f\x7f\x5d\xbb\xa2\xe7\xa7\x10\xc8\x10\x29\x10\xbb\x1e\xe2\x17\x7e\x95\xfb\xe3\x9e\xd0\xa3\x3f\xca\xca\xd4\xef\x93\xdf\xc9\x78\x8e\x36\xa0\xe9\x50\x9a\x67\xf8\x2d\xf3\x71\x5c\x73\xe4\xfa\x7b\x59\xc5\xff\xe3\x6f\x93\x12\xd3\xde\xd3\x62\xb3\x58\xf9\x07\xc9\x64\xe4\x19\xbd\xef\xee\xbe\x93\xc8\x56\x1c\x1a\x35\x89\x59\x04\x3f\xfa\xc1\xe3\xdd\xa9\x76\x7d\xfc\x98\x79\xc4\x20\xf2\xe7\xb3\xd4\xaf\x9f\x0b\x09\x0b\x91\xf3\x14\xe3\xd6\x65\x3b\x97\x7b\x7f\xfc\x88\x3c\x87\x2c\x71\x1b\xe4\xae\xd6\x3f\x31\xb2\x55\x23\x1d\x81\xef\xa1\x8b\x3c\x1e\x94\x4c\xa0\x95\x38\xf2\xe3\x44\xc1\x0a\x1c\x2d\x7f\x76\x8f\x7f\xb8\xe0\x05\x56\x42\xec\x03\x62\xeb\xc4\x66\x2d\x44\x91\x92\xa8\xd5\x0e\xf3\x77\x0f\xf5\xfb\x65\x51\x02\x21\x0a\x9d\xa0\x56\x7d\xdf\xd1\xd3\x49\x8f\x7f\x48\xca\xc2\xc3\x1f\x97\xad\xdf\xb1\x3c\x24\x73\xb0\xb0\x25\x64\x48\x44\xec\x94\xba\x1f\xed\xe4\x3e\x8a\x81\x33\x57\xde\x65\x83\xf1\xd4\x33\xd2\xee\xf3\x30\x8f\x30\x91\x15\xf2\x84\x23\x35\x57\x10\xc6\xc7\x14\xd2\x21\xf3\xbb\xad\x91\x9d\xdc\x2a\xa8\xc0\x96\xc3\xc4\xed\x68\x9d\x18\xcd\xb0\xcc\xc0\x39\x5d\x0e\x36\xef\x45\x15\xfd\x5d\x6d\x4e\x52\x5e\x2d\x74\x87\xa3\x3a\x34\xbd\xa3\x38\x7e\x11\x5b\x24\x9c\x3b\x7f\x71\x3e\x2d\xd9\x12\xc2\x5a\x4d\xd5\xa0\xc6\x60\x58\xbc\xff\xb8\xd5\xb1\x9d\xd7\x95\x71\xea\xba\x5f\x3a\x72\x71\x94\x47\xc8\xae\x7c\xbf\x7c\xd8\x2e\x1f\xbe\x2f\xd6\x9b\xfb\xc5\xc3\x66\xbb\x9c\x3f\x3a\xf5\xcc\xcd\x8f\xc7\xed\xd3\xe3\xf3\xc3\xb5\x43\x16\xf4\x97\x30\x36\xcc\xec\x4d\x99\x6a\x2f\x9e\xe2\x71\x64\x25\x3a\xa1\xe6\xd2\xe9\x19\x33\x4e\x12\xc4\x8e\x79\x0c\x49\x74\xda\x41\x78\x30\x66\x79\x8a\x90\x3e\xa8\xcc\xa2\x7b\xbd\x0d\xdf\x25\x66\x5a\xfa\xd8\xf5\x62\x0f\xcd\x0b\x54\xfa\xc3\x6f\x6d\x17\x4f\xd8\x98\x99\xff\x9f\xb2\x2f\x69\x6e\x1c\xc7\xb6\xfe\x3b\xb5\xe8\x05\x49\x0c\x24\x97\xb2\x2c\xa7\xd5\xe9\x41\x6d\xc9\x99\xdd\x5f\xc7\x0b\x05\x86\x0b\x9b\x2f\x29\x52\x45\x52\x1e\xea\xd7\x7f\xc1\x0b\x80\x93\x28\x67\xbd\x4d\x65\x85\x01\x71\x00\x31\xdc\xe1\xdc\x73\x88\xb4\x7c\x94\x85\x7e\xcf\x74\xf3\x6a\xc9\x42\xfd\x05\xdb\x31\x8d\xec\xea\xc5\x30\x67\x5f\x42\x47\x28\xe1\x49\x4c\x7c\x28\x64\xf1\x91\x41\x6d\x6b\x17\xbb\x0f\x4a\x09\x57\x08\xf9\xd9\x7d\xff\xf7\xd0\x00\xa5\x44\x59\x16\xda\x65\xf5\x59\x37\x22\xdf\xfe\x3a\xf9\xba\x54\x42\x29\x8d\x03\x47\x58\xbd\x13\xc5\x2f\x44\x9e\xfb\x26\x43\x71\x16\xdd\x2e\x9e\xae\x97\x8b\xcd\x66\x75\x3d\x42\x9d\x13\xca\x74\xe0\xa9\x3d\x76\x59\x0e\xb7\xc7\x3f\x06\x4e\x5c\xe2\x3a\x71\x12\x21\x62\xa1\xce\x5e\x8a\xd3\xf1\x06\xba\xcb\x73\x16\x26\x16\xed\x88\x28\xab\xa9\x26\x10\xa1\x9c\x4b\x1a\xfb\x40\x11\x92\x28\x62\x7e\x64\x82\x01\x26\x94\x1b\x8d\x2a\x6b\xbb\x4a\x28\x18\x48\xbb\x10\x9a\x10\x47\x16\xc0\x02\xff\xa7\x34\x4a\x43\xd6\x03\x9d\xb6\x47\x28\xb4\x3d\xfc\xc6\x17\x4d\xb9\xfd\xa9\xa3\xe3\x76\xb9\xb2\xe5\xed\x4d\x77\x21\x20\x28\x8a\x5c\xbe\x4f\x4e\x47\x2a\x1c\xf1\xd0\x3d\x54\xea\x54\x7d\x8e\x3e\x85\x4c\x99\x24\xe7\xd8\xf4\x69\xae\xc4\xf5\x56\x71\x10\x06\x5d\x16\x7a\x0b\xea\x84\xfa\x4a\x5f\xaf\x2a\x1d\x45\x3a\x98\x12\x5b\x74\x74\x53\x57\x96\x12\xcf\xf7\x35\x29\xe6\x86\x5d\x7a\xea\x02\x59\xfb\xc0\xcd\xa2\x10\xf1\x34\x75\x34\x72\x18\xb0\xbb\x71\x2a\x01\xdd\x2c\x04\x62\xf9\xf5\x9d\xf6\xd5\xc8\x53\xa2\x40\x95\x75\x62\x4e\x55\xf5\x70\x3a\x3c\x9a\x2b\xd1\x34\x39\x2c\x45\xa5\xbb\x87\x02\x4d\xd1\x5d\x7f\x12\xc5\xf5\xe2\x71\x93\x9f\x26\xf6\x3b\x35\x94\x98\x4e\x1d\xe6\x68\x15\xa5\x46\x27\x39\x35\xcc\xa0\x05\xb3\x6a\x27\x4c\xff\x62\xb6\x95\x85\x91\xb2\x00\xa7\xd6\xc1\xb8\x2b\x87\x1c\x9e\xbe\x87\xb6\x81\xfb\xbd\x57\x22\xb2\x3a\xd3\xa3\x81\x66\x51\xc4\x59\xf7\x18\xff\x0b\xea\x5c\xf1\x98\x30\x12\x06\x8e\xa9\x50\xbd\xf6\xd2\x7e\x37\x65\xb5\x14\x85\x46\x5a\xbb\x79\xc7\x83\x11\x01\x18\xfe\x7d\x29\x4b\x9d\x9f\x3c\x63\x00\x61\x34\xb0\x55\x68\xdb\x63\xbb\x29\x0f\xe7\x16\xa3\x61\x8a\x4b\xd9\x41\x61\xc6\x1e\xf0\xfc\x64\x61\x34\x51\x9a\x74\xac\xfe\x43\xfb\x90\x51\x88\x94\x2f\x37\x72\xe5\xb8\xae\x85\xc9\x34\xd2\xd6\x59\x1c\xd7\x7a\xbb\x76\xae\xb9\x87\x9e\x6d\xd6\xd6\x3e\x09\x13\xff\x63\x0e\x09\xd2\xfc\x1c\x73\xa1\xe0\x01\xde\xb7\xa7\xea\x0d\x3e\xcf\xa0\x53\xa7\xf3\xf2\x1e\xc2\x62\x2a\x30\x21\x35\xe2\x43\x99\xa9\x3b\x99\xe2\x2e\x67\xbd\x7a\x16\x73\xab\x78\xe8\x13\x58\xb9\x9f\x3e\x2c\x89\x88\x87\x05\x0d\x67\x17\x8c\x12\xb7\x84\x25\xdc\x20\x0c\x7b\x9f\xd5\x8e\xdb\xf3\xaf\x73\x28\x95\xef\x9b\x26\xd2\xf2\x09\xc0\x5b\x56\x9e\xea\x21\x2e\x9b\xb0\x44\x12\x1c\x94\xa7\xd5\xf7\x9d\xe7\x2a\x1a\x96\xc0\x12\x96\xf2\x38\x54\x13\x8a\x76\xac\x2e\xc4\x32\xbd\xe9\x8b\x8e\xa6\x7b\x2a\x03\xef\x1d\x8a\x5c\xe1\x11\x0d\xdd\xab\xa6\xda\x22\xb5\x75\x65\x09\xea\x07\x13\x40\x24\x71\xca\xbb\x32\xd5\xdb\xf2\x54\x23\xb7\xcb\x64\x86\x4b\x22\x99\x8d\x1c\xe4\x79\x56\x16\x83\xdc\x27\x93\x3c\xe0\xf6\x78\x6c\x97\xe1\xcf\xac\x68\x37\xa0\x61\x89\x03\x61\x52\x30\x9c\x7f\x96\x16\x74\x09\x65\x9f\x85\x77\x3d\x54\x68\xd9\xf9\x71\x16\xaa\xb2\xd0\xb7\xf0\x71\xf5\xe9\xad\xfe\xd0\xf5\xd2\xdc\x2a\xf5\xae\x76\x37\x23\x87\x65\x68\x67\x4d\xbe\x88\x16\x9a\xf6\x62\x49\xa0\x01\x0e\xdd\x26\xc6\x80\x58\xa5\xe2\xed\xd3\xed\x6f\x0a\x9a\x09\x03\x2a\x3c\xe3\x38\xb2\x7c\x9d\xcb\x75\x12\x1e\x44\x84\x5a\x46\x98\xc3\xb1\x75\xee\x66\x57\x23\x0f\x28\x58\x0e\x54\xfd\x96\xd5\x65\x55\x7f\x07\x07\xaa\x22\x3c\x48\x52\x50\x1e\x05\x53\x38\xcd\xb5\x1e\x0f\xd6\x76\x90\x88\x07\x6b\x97\xeb\xaa\x79\xdd\x95\xcf\xb5\x1e\x99\xf3\xbe\x9f\xb2\x5c\xf2\xf5\xb0\x68\x7d\xd0\x0c\x11\x1a\xdb\x0a\x72\x90\xed\x69\x33\x9c\x12\x3c\x0c\xe3\x30\xed\x4f\xcf\x9b\x2a\x83\x42\xe3\xd7\x1a\x8e\x08\x0f\xb9\x48\x7b\xec\xcf\xed\xe3\xdd\xf5\x85\x2a\x2e\xc2\x23\x99\xa2\x47\x8e\x23\xf7\x00\xef\x58\x7b\xeb\x6f\x17\xe9\x38\xf1\xee\xfa\x55\xd6\x3c\x94\xcd\xea\xcf\x93\xc8\x91\x01\xab\xdb\xec\x39\xa1\x56\xc4\x1a\xf3\x01\x7b\xb9\x17\x43\xdf\x82\x13\x4a\xbd\x83\x8c\x64\x20\x65\x75\x5d\x36\x23\x39\x19\xec\x93\x9a\x4e\x92\xc5\x86\xf4\x07\x4a\x43\x84\x13\x26\x10\xfb\xf7\xa6\x22\xbb\x2c\x69\xef\x18\x72\x12\x6b\x4f\x0d\xb4\x11\x9f\x78\x9e\xf4\x07\x26\xa7\x31\x4b\xe3\x0e\x6b\x54\x34\x56\x7a\x69\x75\xbd\xfa\xf7\x2c\x2e\x85\x70\x0a\x31\x02\x58\xf6\x36\xd6\xb9\xa8\xb1\x1e\x49\x66\xd5\x85\xad\x85\x73\x12\x42\x5f\x1b\x89\x34\xf2\xa7\x91\x16\x97\xef\x17\xb3\x30\xee\x2a\x9c\x9b\x7e\x98\x79\x0a\x48\xba\xf2\x5a\x1e\xc1\x9c\x26\xaa\x2e\xad\xcb\xcc\x91\xb6\x7d\xbb\x7a\xd8\x8e\x16\xd7\x97\x92\x7c\x84\xc7\xee\x6c\xb1\xb9\x07\x0f\x8d\x74\x27\xc6\xb8\xab\x08\x2d\x1f\x39\xd2\xf0\xbc\x5f\x9d\x3e\xaf\xb3\x0a\xfa\x11\x16\x54\xe2\x95\x6c\xc0\xae\xb5\xc3\xdc\xd0\xd9\x62\x3b\x67\x2c\xdf\x88\x2c\xbf\x5c\x84\xe8\x2e\x25\x43\x2b\xde\x60\x31\xc0\xab\x7f\x6f\x1e\x1f\xba\x32\x25\xc2\x55\x90\xa0\xc1\xf5\xb4\x78\xb8\x7e\xbc\xdf\x5f\xfd\x67\xb7\xda\xee\x97\x8f\xcf\x83\x1e\x09\x31\xce\xba\xda\x9c\x8e\xc7\x49\xfc\x91\xeb\x50\x62\x42\x78\x9b\xbd\x14\xad\xa3\x3a\xe6\xd4\x6e\xdb\x81\x82\xcf\x58\xbe\x8b\x01\x81\xee\x85\x41\xd4\x51\x0a\x16\xe6\x99\xbd\xbc\x40\xb5\x73\x4e\xe9\x6f\x65\x4d\x08\xd7\x32\xc5\xd4\xe9\x8b\x38\x80\xa5\x2f\xad\xfc\xd3\xb8\x38\x64\xc7\x11\x40\x38\x44\x81\x96\xc3\x2c\xe6\x80\xaf\x90\xe0\x91\x8d\xd5\x5b\xa0\x33\x25\xf2\xa5\x28\x0a\x21\xb3\x6e\x01\x9a\x88\x78\x0a\x80\x3b\xd0\x7d\x7c\x9b\x1b\x1d\x62\xbc\xa6\x35\x01\x76\x59\x93\x4f\x33\x4f\xb6\x5b\x1c\x04\x36\x99\x73\x05\xcd\x63\xb1\x98\x63\x07\x18\xbf\x5a\x1c\x84\x5a\x58\xb2\x99\x2c\x1f\x17\x4b\x92\x38\x88\x64\x12\x0d\x64\xbe\x36\xa2\x69\xa0\x2a\xfe\x38\x3b\x06\xbc\xb1\x17\x07\x44\x20\xa2\xed\xae\x7c\xc1\x15\x6a\x39\x83\xf4\xac\xc2\x3f\x89\x03\x2e\x11\xcf\xfc\x2b\xcb\xf3\x39\xec\xb7\xff\x77\xe6\xa4\x88\x03\x63\xe5\x75\xef\x4a\x4b\xe1\xd2\x15\x19\xfe\xad\x05\x15\x87\xd4\xca\x03\x7a\xbd\xa7\x6f\xe3\x5d\x2a\x0e\xc1\x12\x34\xa3\x0a\xaf\xf6\xf8\x95\x98\xc4\xc6\xb8\xb0\xc6\x75\x56\x8f\x20\x44\x33\xa3\x41\x79\x4a\x7d\xfd\xd3\x55\x56\x35\xaf\xd3\x09\xfa\xdf\x9e\x5e\xf9\xbf\x51\xff\x2b\x63\xe2\xfe\xe4\x72\x78\x0c\xff\x04\x4c\x2a\x8c\xba\x19\x5c\xa1\x48\xd5\xd8\x88\xc3\xd1\x0b\x78\xb8\x5e\x9c\x10\xc4\xa9\xd9\xd8\x6d\x67\xfa\xc4\x5c\x5b\xe1\xdf\xfb\xfb\x7f\x7f\x75\x0e\xc7\x71\xeb\x32\xba\x3c\xa8\x2a\x91\x2a\xf5\x5e\x14\x27\x91\xf7\x23\x14\x1b\x26\xdd\x66\xec\x58\x04\xac\xbc\xb5\x1d\xc6\xf1\x68\x27\x21\xc7\x8d\xfb\xf6\x24\xb3\xec\x8c\x13\xf7\xc2\x27\x4a\xa8\x86\xa1\x99\x36\xde\x93\x7c\x27\x63\x10\x57\x50\x89\x42\x97\xa3\x7c\xa8\xf7\xfc\xe2\x34\xa4\x98\xa2\x78\xbc\xbb\xb6\xb5\x15\xfe\x0d\x52\x9a\xa2\xa2\xff\x21\x2b\x1c\x09\xc0\x29\x17\x55\xfb\x7f\xb6\x0a\xe4\xbf\xf4\x7f\xc6\xdb\x7e\x2c\x62\x8d\x81\x78\x59\x96\xad\xc7\xd9\x0d\xb7\x48\x15\x5a\x94\x8b\xbb\xbb\xc7\x9f\xfb\xab\xd5\x6e\xe1\x5b\x64\x60\x69\x4c\x50\xea\xa5\x3a\xd5\x43\x56\x4c\x12\x4b\x4a\x2c\xea\xd9\xa9\x10\x2d\xc5\xa0\x0c\x6b\xd6\xd7\x98\x00\x39\xc7\x23\x26\x63\x8a\xd8\x2b\xe1\x2d\x68\x27\x89\x37\xad\x6e\xfa\x7b\x4b\x44\xa6\x61\x4f\xc8\x66\x17\xf2\x73\xa3\xda\x19\xb7\x2e\xb6\xa0\xba\x77\xd0\x02\xa3\xe2\x3e\x8c\xb4\xcd\x5e\x2e\x15\x6f\xf8\x5f\x98\x50\x82\xa7\xe2\x75\xdc\x0b\x0d\x3c\x0c\xc8\x47\x5c\x47\xa5\xec\x97\x6b\x6d\xed\x47\x2b\x92\x3d\xff\xa8\x3a\xb4\x05\x3a\x4a\x14\x7f\x47\x97\xc7\xfd\x0a\x98\xf5\xbd\x3a\xc6\xb7\xf5\x74\x76\x41\x4c\x2d\xa7\x9c\x65\x2e\xfb\x09\xd9\xcb\xeb\x24\xba\x11\x9b\xa4\xcb\xb5\x3a\xdc\x63\x73\xce\x21\xd1\x6d\x09\x46\x8b\x50\xf6\x68\xf3\x73\x77\xab\xb3\x76\xda\xae\x86\x8d\xb5\x91\x4a\x93\x35\xb3\x99\xb1\xd8\x98\x20\x9c\x06\xb2\x43\x47\x79\x42\x92\x20\x8e\xd2\x4e\x9f\xe2\x2a\xf2\x7f\x0e\x49\x88\x19\xef\x63\x55\x7e\x7c\xee\xc4\x2f\x9b\xbe\xbb\x12\x93\x62\x67\x92\x84\xb1\x8c\x88\x2f\x80\xfa\xeb\xaf\x8d\x28\xb4\x40\x63\x76\x1a\xaf\x4d\x42\x41\x30\x05\x75\x73\x82\x1c\xd9\xb5\xae\xa7\x28\x7a\x92\x84\xc6\x96\xfe\xb8\x78\xd0\x52\x78\x07\x25\x21\x11\xc1\x70\xbc\xc4\xc0\xb6\x17\xe8\x5e\x17\xa3\x48\x4b\x42\x54\x2c\xc9\x84\x3f\xd2\x9e\xb1\xe3\xfb\x10\x6d\x4b\x7b\xd1\x0f\xfa\x61\xa9\xef\xcb\x6a\x7d\x38\xfa\x88\x5d\x42\x39\xc1\xa2\x0e\x2f\x02\x5f\xb4\xd6\x31\x1e\x9a\xa7\x33\x65\x58\x5f\x42\xdd\xa7\x14\x12\x1a\x73\xf4\x44\x50\x42\x25\xfb\x0b\xf6\x7f\xa2\x86\xca\x70\xb5\x75\xdb\x7a\xc2\x02\xe3\x48\xe2\x30\x53\x3a\xb6\xdd\xc6\x33\x33\x61\x3a\x41\xa3\x5f\x15\xcd\x7e\x48\x2a\xd7\x0d\x01\x4f\x18\xe6\xc1\xcb\x4a\x23\x86\x71\x1a\xa1\x4f\xb8\x4c\xf0\xa0\xda\x79\xaa\x97\xee\xa3\xc7\xc4\x0a\xdf\x23\xdd\xb0\xb2\x31\xa3\xae\x2d\x09\xc0\x92\x71\x58\x8e\xd5\xcc\x1b\x5b\x49\x22\x03\x84\x87\x39\x15\xec\x9d\xa8\x7f\x75\x4d\x60\x10\x8e\x67\x07\xf1\xdf\x9b\x3b\x0f\xab\x9c\x7c\x8e\x34\x60\x98\xbd\xda\xd7\xd0\xdc\x97\xa7\xe6\x15\xb3\x28\x6c\xda\x2b\x11\xe9\x80\x04\xe0\xdc\xf9\x9c\x0c\x95\xe0\x76\x0e\xaf\x0b\x85\x78\xd8\x99\xe3\x27\x11\x49\xc4\x23\x2f\xa5\xd3\x6b\x60\xcc\xe3\x1a\x12\x61\xa4\x71\x07\xdb\x7d\xd9\xee\xca\x36\x6d\x31\x8b\x24\x48\x64\x60\x4b\x43\xfd\x21\xb5\xb0\x87\xf6\xa0\x20\xb4\xed\xc3\xd1\x7a\x34\x59\x65\x99\x69\xef\xca\x97\x6e\x69\xca\x08\xd0\x08\xc6\x99\xf7\x0a\x08\x4e\xbc\xb7\xa5\xb6\x59\x67\xfd\x25\x9a\x29\x1b\x1e\x79\x81\xe6\xcb\xda\xbf\xf1\x2c\xd0\x92\x68\x0f\xeb\x3c\x15\x96\x22\xdf\x25\x73\xfb\x8d\x26\x01\xa6\x84\x4b\x89\x5c\xe5\xa5\xc4\xad\xb0\xdd\x3e\x6f\x4e\x79\xde\xfe\x61\xad\xc7\x69\xc1\xc4\x48\xce\x2c\x03\x5d\xfb\x89\xf0\xd0\xb2\x2d\x69\xc0\xac\xc5\x98\x49\xd1\x41\x0e\x7c\x93\x12\xc8\x55\xb6\xb8\xbe\x7e\xda\xef\xbe\x7f\xdb\xef\x56\xcb\xdb\xfd\xcd\xb3\xaf\xb1\x20\x69\x00\xd4\x4b\x76\x3c\x41\x8d\x64\x96\xa3\x08\x47\x1a\x12\x40\xeb\x72\x84\x56\x9b\xdd\xe8\x67\x37\xfc\x34\x34\x41\x3c\xd0\x45\x59\xeb\x9b\xb2\xfa\x12\x36\x9e\x46\x91\xd2\x8e\x13\x63\xf5\xa1\xe0\x38\x8f\xd9\x49\x23\x96\x62\x9c\x78\x2f\x45\xa3\x5e\xa3\x7d\xa6\xca\x6e\x53\xea\x4c\x34\xff\x16\x44\x12\x2c\x18\xdf\x5f\x8b\x46\x3c\x75\x70\xec\xf1\x18\xa7\xc4\x58\x60\x63\xa6\x4a\xbc\xcc\xc6\xe3\x8c\x53\x1a\xc5\xcc\xc9\xae\xed\x3e\x76\x25\x0a\xa5\x1f\xa0\xea\xc4\x8d\xfe\x56\xad\x40\x4a\x99\x12\xae\x7e\x71\x55\xe8\xd2\x11\x99\xce\xa7\x5a\x52\xca\x03\xe5\x59\xf6\x5f\x41\xfd\xba\x9f\x94\xe5\xf5\x93\x29\x65\x5c\xc4\x28\xa4\x5a\xdf\xaf\x6e\xfd\x23\xf3\x28\xb1\x27\x2d\x26\x2e\x50\xd8\xf7\xf3\xc2\xad\xb8\xd2\x68\x79\xbe\x43\x66\x13\x9b\x36\x83\xef\x5b\x21\xc1\x63\x6e\xbb\xb8\x5b\x6d\xf7\xd7\xcf\x4f\x83\x82\x66\x92\xc6\x49\x82\xfc\x56\x47\xac\xae\x7b\x3c\x42\x3b\xe3\x07\x79\x9f\x34\x21\x40\xfb\xfa\x13\x7b\xfd\x76\xfe\xec\x0e\x30\x9c\x0b\x13\xb3\x65\x32\x27\x12\xad\x2c\x4a\x02\x65\x31\xab\xe7\xfa\x24\xaa\xac\x9c\x0f\x28\xa4\x89\x11\x42\x0c\xd0\xe2\xa9\x7f\x94\x94\x68\x44\xa4\xe0\x8c\xf9\x3b\x46\x8b\x3f\x75\xd2\x34\x09\x31\x2d\x2d\x4f\x55\xb1\x3d\x63\xeb\x6d\xdb\xd3\x30\xf1\x6c\x77\xc8\x7c\x61\x03\xaf\x87\x33\x42\x02\x92\xa6\x69\x84\x8b\x12\x79\x5e\xde\xcb\x0e\xac\x9c\xa6\xca\x02\x43\xb1\x9e\x63\xc8\xee\x35\x79\x3f\x61\x04\x26\xe1\xbe\x2d\x7f\xf8\x9f\xca\x10\x70\x95\x2d\xff\x75\xff\x03\xb7\xf8\x65\x56\x59\x03\x06\x45\xf7\xea\xae\x1f\x93\x58\x31\x08\xcd\xab\xab\x6d\xda\xbe\x8b\xe3\xba\xb8\x68\xe6\xa5\x32\x36\x32\xec\x73\xb7\xd9\x1e\xad\xc7\x32\x2f\x87\x48\x4e\xfb\xdf\x30\xf0\xbf\x31\xd2\xe6\x7b\x33\x4b\x0f\xd8\x5c\xe0\x54\x75\xdd\x55\x14\x8e\x74\x17\x36\xb6\x5e\xa3\x7b\x68\xa5\x00\x13\x03\xee\x78\xba\x2b\x9b\xb5\xae\xcf\x34\xce\x5d\x67\x4d\x18\xbe\x61\xeb\x64\x5e\xc3\xa1\x54\xa3\xd0\x5e\xaa\x53\x2b\xb9\xb7\xdc\xae\xb6\xa1\xbf\x01\x70\x40\x93\xf3\xd1\x01\x82\x47\x14\xa9\xbe\x4f\x6a\x84\xcb\x36\x5b\x4d\xa5\x85\x2b\x9b\x1f\xa6\xd6\x53\x50\x21\x9e\x63\x79\x59\xfe\x3a\x1d\x27\xdb\x8b\xa1\x11\xde\xe6\x66\x7d\xf5\x7d\xe1\x77\x60\x11\x50\x81\xf1\xb2\xcd\xf3\xd5\xdd\x7a\x39\xaa\x44\x27\x22\x24\x44\xa4\x83\xd8\xec\x62\x32\x99\x44\xc8\x15\xca\x77\x4f\x15\x88\x7f\x66\xcd\xeb\xe3\x18\xea\x2d\x42\x49\x65\x34\x67\xc3\x89\x42\x7b\xbb\x6f\x7e\x16\x88\x50\x47\x96\xbe\xd6\x51\xc9\x7e\x59\xf1\x36\x1c\x70\x11\x1a\xab\x24\x81\x87\xf0\x13\x7a\x8c\x36\xc8\xe2\x40\x49\x97\x8b\xb7\xdd\xd5\x46\x9f\x41\x44\x34\xc6\x60\xde\xff\x2b\xcb\x11\x0c\xd4\x37\xc7\x16\x4f\x7a\x2a\x30\x88\x70\x9f\xf5\x15\x34\x82\x08\xa9\xa6\x92\x80\x97\x8b\x13\xbb\x6f\x2a\x88\x04\x63\x01\x20\x05\x54\x5b\x55\x76\x19\x66\x41\x34\x20\x34\x6e\x75\xbf\x58\xf6\x1e\xf6\x85\x80\xd8\xe4\x45\x28\x35\xb8\xa3\x74\x9e\x76\x59\xfd\x2c\xab\x5f\xad\x5f\xe4\x2f\x4f\x53\x93\x7a\xe2\xc9\x41\x75\x26\x11\x2c\xa0\x98\x66\xb7\xb2\xfc\xdd\x5f\x89\xe5\x61\x5a\x2f\x1f\x7f\xae\xff\xdf\xe2\xe9\xfa\xb7\x15\xb0\x44\x30\x1e\x71\x57\xfb\xed\x83\x39\x17\x02\x47\x82\x71\x8b\xe5\xee\x34\x99\x57\xed\xcd\x07\x3b\xbd\x60\x29\x0b\x3c\x4f\xed\x6d\xf6\xf2\x0a\x76\x7c\xbd\x28\x23\x11\xcc\x58\x9b\xb0\x46\xa6\x7d\x09\xd5\x2e\xbb\x84\x5c\x14\x3c\x50\x56\x00\xa3\xb8\x2b\xad\x28\xec\x39\x7f\x3c\x11\x3c\x0e\x10\xc2\xd9\xe5\x3f\xbe\x74\xaf\x05\x8f\x05\x02\x56\xeb\x93\x74\x38\x07\x1f\x49\x9f\x7f\x88\x24\xb0\xc1\xf7\xdf\x86\x4f\xbe\x46\xb9\x89\x24\xa6\x48\x84\xbf\x28\x9a\xec\x46\xfc\x82\x3b\x21\x21\x1f\x2f\xa4\xc9\x0f\x5c\xc4\x69\x9f\x97\x2f\xed\x49\xf0\x2d\x33\xcd\x90\x82\xcf\x75\x4b\xa5\x09\x48\x47\xe8\xb0\x3e\x0c\x99\xa0\x46\xab\x50\x50\x8a\xb9\xc2\x7d\x6b\x8e\xeb\x1d\x92\x2e\xb5\xb6\xc7\x55\x59\x36\x97\x29\x82\xc6\xcf\x84\xa3\x37\xa4\xc8\xb6\xb4\x1b\x1b\xf1\xb9\xbe\xf4\x1a\x32\x06\xb7\x7d\x41\x0f\xa8\x17\x2a\x8a\xc9\x80\xac\x65\x0a\x88\x10\x8a\x68\x74\xc2\x11\xd2\xd3\x6b\x16\x12\xa1\x52\xc0\x93\xf3\x28\xaa\x1a\x5a\x53\x63\xd7\xc9\x10\xfe\x37\x0c\xfb\xb0\x5e\x18\x74\x6e\x23\xfd\x9f\x29\x05\x11\x11\x4a\x59\xdc\x47\x05\x4d\x25\x5a\x9f\xbd\xbb\xbe\x8b\x7d\xe0\x2e\xd7\x88\x7c\x80\x3b\x73\x3d\x74\xa0\x71\x8d\x8d\x2a\xe2\x2e\x66\xec\xfc\x8f\x94\xa2\x7c\x40\xcd\xda\x3a\x13\x4f\xad\xef\x6b\xfd\xba\x5b\x91\xbf\x75\x75\xcc\x44\x40\x44\x11\xe1\x91\xd5\x73\x1a\x77\x44\x00\x13\x38\xe5\xef\x44\x6d\x6b\xbf\x54\x33\x5c\x84\x00\xa9\xe9\xec\xf5\xda\x0a\x42\x8e\x6a\xa2\x84\x81\x30\xb2\xe9\x92\x53\xb5\x29\x9b\xd5\xc7\x31\x1b\x12\x75\x12\x61\x8c\x45\xb6\xb8\x82\xde\x2b\xf1\x62\xcb\x76\x6f\xce\x8a\x0b\x64\x10\x4b\xe9\x08\x2b\x57\xcd\xeb\x06\xaa\x61\x48\xd9\xf5\x09\x99\x8d\xdf\x22\x68\x35\x2b\x6a\xa8\x9a\xbd\x2a\x8b\x46\x64\x45\xed\xb5\xa0\x88\x0c\x79\x84\x55\xb9\x65\x71\xdd\x09\x14\x11\x49\x02\x82\x2f\xbb\xd0\x6f\xed\x32\x1d\x06\xf2\x24\x61\xb6\x02\xfb\xad\x6c\xce\xd0\x72\x92\x88\x14\xc1\x3f\x07\xf1\x31\x0e\xe6\x4a\x1a\xd9\xaa\x00\x5f\x45\x9a\x97\x42\xcf\xd9\x69\x92\x46\x8a\x5a\x4a\x95\x47\xcb\x6d\x54\x7c\x92\xaf\xb3\x1d\x92\xc6\x04\xe5\x9e\x73\xcb\xdb\xde\xe5\xdd\xa7\x57\x06\x85\x87\xd8\xd2\xeb\xfd\x0e\x26\xb9\x64\x81\x0a\xa8\xd3\x49\xcf\x06\x7f\x66\x01\x32\x88\xee\xae\x3f\x7e\x5f\xfa\x20\x19\xb7\x99\xc7\x15\x2a\x0f\xdf\x2f\xfe\xbd\x5f\x3e\x3e\xec\x9e\xd6\x57\xdd\xe5\x12\x86\xd1\xbb\x62\xdb\xc0\xb1\xee\xfe\x2a\xac\xd8\x89\x6c\xcd\x86\x9b\xb2\x5a\xbd\x41\xf5\x59\x16\xdd\xd8\xf1\x20\xc0\xf0\xf0\x7e\x8c\x56\xfe\x7a\xd7\x95\x5c\xc4\x88\x05\x71\x87\x32\x1a\xdc\xe3\x1e\x31\x03\x20\xbd\xd8\xac\xab\xb4\x68\x47\x65\x28\xfc\x4f\x64\x1c\x5b\x96\x1b\xac\x21\x38\x2f\x25\x92\x09\x4d\x51\xf5\xb7\x7b\x3e\x4f\x60\xfc\x95\xfd\x29\x13\x19\xe1\x2e\xf5\x0e\xd9\xd5\xe9\xb3\xbe\x2d\xdf\xef\x45\xf1\x39\x27\xcf\x4d\x64\x1a\x27\xc8\xe7\x81\xf4\xab\xc8\xcf\xfa\x47\x07\x7a\x9d\xc2\x5f\xa5\x08\x09\x66\xd3\xda\x55\x8f\xb0\xbc\xc9\xc5\x84\x08\x52\x4b\x51\x6f\x05\x2f\xd1\x20\x9a\xcd\x8d\xb9\x1f\xc8\x34\xa6\x61\x07\xa8\x6a\x37\xf0\x33\xfd\xb0\x91\xc9\x29\xa5\x4a\x30\x5a\xd6\x64\x50\x75\x8a\x43\x44\xea\x28\x16\xd6\xb7\x6c\xdf\x11\x33\x66\xf7\x16\x9d\xda\xf5\x10\x2c\x10\x1e\xb6\xd0\x3c\xc0\xfb\xae\x1d\xc7\xac\x98\x45\xd8\x4e\x6e\xaa\x55\x84\x26\x9f\x23\x5f\x44\x3f\xc7\x06\x67\xc6\x6f\xa3\x41\xe0\x4c\x6f\x9d\xaa\xf5\x72\xb1\x7c\xec\xe5\xf5\x5d\x0f\x08\x62\x90\x9e\x5a\xc8\x88\x53\xee\x0c\x0a\x98\x5e\x0a\x42\x40\xae\xcd\x1f\xeb\x1f\x8b\x19\xbb\x50\x82\x92\x0c\xcd\xfe\xc9\xef\x0c\x97\xb1\x8b\xc6\x1e\xcb\x5a\xe4\xe8\x69\xff\xce\x8c\x90\x26\x4e\xc0\x45\xab\xae\x16\x8b\xc5\xf3\x25\xa2\xb4\xf9\x90\x88\x34\x29\xc1\x30\x80\x29\x2b\xd5\x49\x52\x62\xf5\xdf\x78\x1c\x8d\xd6\xd2\x33\x5a\x7c\xae\x47\x1c\x56\x44\x1a\x88\x99\x4d\x3a\x0a\x1b\x6c\x5c\xab\x72\x8a\x65\x53\x01\x18\xe8\x83\x37\xe5\x48\x77\x61\x3e\xb8\x7f\xc9\x6a\x1d\x4f\x44\x15\x32\x6e\xc8\x80\x23\xe7\x3a\x7b\xc9\x1a\x91\x2f\xaa\x66\x0b\x79\x9e\x15\x2f\x5d\xa5\x5c\xf7\xda\x2a\x64\x86\xba\x0a\xcf\xbb\x4c\xc8\x2c\xcf\x3c\x7f\x3e\x51\x21\xb7\xc8\x91\x27\xa8\xcb\xfc\x6d\x02\x89\x57\xa1\x8a\xb1\xe0\x0c\x25\x79\xb2\xa2\x5e\x1d\xb2\x19\xbf\xc1\x75\x8e\x02\x2b\x1d\xd5\xf4\xc1\xde\xb0\x6b\x8b\x29\x3a\x71\x59\xbd\xe9\xc0\x4b\x8a\xc4\x12\x0f\x04\x0c\x91\xcc\x18\xa4\x43\x38\xa8\x62\x01\x53\xbd\xf0\xf9\xba\x68\x17\xab\x15\xcb\xff\x6a\x20\xbb\x07\x60\x81\x85\xee\x2d\x4b\x09\x16\x7d\xb2\xec\xa8\x62\x88\x62\xa1\x42\xa8\xf9\x7e\x55\xbc\x95\x59\xfd\x55\xb8\x5a\x31\x12\x2b\xcb\xa3\x58\x34\xc9\x1f\x83\x27\xe4\x34\x41\x5e\xb4\xd6\xbe\xd3\x30\x66\x83\xc5\x52\xd9\xe9\x71\xa4\xb8\x88\x30\xd3\x70\x95\x99\xaa\xac\x9b\x70\x78\xca\xaa\x98\x52\x44\x51\xe5\xe5\x4b\xeb\x9f\xc0\x40\x09\x6a\x38\x1f\x55\x9c\x04\x58\x81\xb5\x40\x24\x54\x56\xbc\xb8\x52\x9f\xae\x38\xb0\xf7\xa8\x54\xac\xa3\xd8\x1a\x78\x50\x9c\x8e\xb3\x14\x0e\xf3\x5a\x82\x93\x59\x18\x03\xf3\xa5\x49\xfb\xda\x82\x6a\xcc\x29\xdf\xbf\x4d\x3e\xa4\xeb\x9d\x30\xc0\xb0\x89\x2a\x0f\xc7\x39\x0e\xfa\xc9\x00\x27\x86\x20\x23\x06\x46\x63\xee\xb2\x7a\xb0\x3b\xaa\xc4\x58\x59\x7e\x28\xf4\x06\x35\x37\x06\x82\x05\x44\xa5\x2c\x46\xf7\xec\x55\xe4\x8e\xf2\xc7\x19\x60\xd3\x28\xe1\x78\x96\xa7\xcc\x62\x4b\x1d\x85\xdb\x30\x55\xe5\x7b\x08\x7b\x68\x77\xee\xc8\xa0\x5a\xe1\xc2\x7a\x9d\xdc\x43\x44\x29\xda\x6b\x58\xfa\x8c\x7c\x3a\x3f\x7b\xed\xfa\xae\x8f\xb4\x7c\x0d\xae\xc8\x08\x9f\x66\xf5\xe7\x16\xbf\x44\xd7\x89\x71\xe4\xd0\x46\xcb\x65\x12\x0c\xb8\xe4\x23\xfd\x26\x7e\x3e\x47\x26\xe1\xef\x16\xd3\x88\x59\x68\x68\xa5\xb2\x1a\xf0\x14\x9a\xe6\xc1\x94\x48\x22\xaa\x06\xc1\x92\x5e\x4a\x6f\xd2\x4f\xe8\xc0\x16\xa4\x2e\xb3\x26\xfb\x6b\x5a\x1e\xa4\x64\x98\x60\x49\x86\xcc\xf4\x63\x71\x55\x01\xe8\xac\x78\x19\x32\xea\xd1\xe0\x1f\xf6\x1f\xff\x83\x44\x21\x21\xb4\xd0\xda\xeb\x12\x4e\x2f\xa9\xac\xa0\x8e\x65\x6d\x1f\xc7\x62\xbf\x9e\x86\x12\x62\x69\x5f\xdd\x16\xf0\x0a\x4f\xbf\x5c\xb7\x76\xd4\xb6\xe9\xf4\xde\x89\x52\x11\x45\x9a\xc6\x83\xf8\xd8\x94\x65\x3e\xac\x79\x57\x8a\x27\x9e\x32\x6a\xa4\x7c\x30\x7b\x82\x2b\x25\xa8\x55\xb7\x45\x26\x6c\xc7\x18\x32\x87\x95\x55\x4a\x58\x9d\xca\x8e\x80\x63\x5b\xe6\x7a\x54\x1d\xa3\x94\x48\x98\x33\x25\x30\xd0\x38\xc6\x3a\x2b\x25\x84\xd5\x3f\x38\x0c\x96\x90\x92\x14\x43\x7e\xd7\x59\x6d\x23\xde\xe0\xf0\x0e\x2e\x4d\x03\xe7\xee\x96\xff\xa5\x8a\x9c\x90\x53\xad\x44\x75\x5d\xaa\x53\xbb\x57\x95\x9b\xb2\xfa\xd7\xfd\x78\xc7\xd2\xa1\xea\x54\x84\xdc\x99\x88\x45\x26\xef\xe3\xcd\x4a\x33\x6a\xd9\x43\xa0\xd0\x57\xe5\xe9\xe5\xb5\xf9\xca\x98\x54\x10\xd9\x28\xd3\xde\x9e\x10\xe8\x38\xbc\xbd\xdc\x66\xed\x40\x9e\x79\xda\xfe\x37\x34\xf0\xc5\x98\x5b\xf5\x6a\x0f\x50\xc4\x7f\xcc\x65\xd6\x14\xc4\x56\x6f\xe7\xae\x2c\x5e\xec\x03\x75\x83\x31\x80\xb6\xb0\xe9\xc0\x80\x73\xfb\x5e\xc0\xf2\xc3\x6f\x5b\xa7\xc8\xfb\xe4\x0a\x80\x53\x2f\xb5\x7c\x98\x78\x79\x3a\x32\x61\xec\xcd\x30\xd1\x88\x7d\xe4\x13\x9b\x3a\x32\x49\xe4\x92\x14\xff\xfe\xd7\xf3\x68\x7c\x35\x09\x98\x4f\x2d\x5d\x21\x76\x43\x6f\x9c\x95\x55\x9f\x0b\xb1\x10\x4d\x68\x80\x64\xa1\x76\x9a\xdb\xb0\xf1\x50\x8d\xe5\x1f\xe3\x8b\x27\xc2\x73\xd7\x5d\xed\xae\xfc\x94\x1a\x77\xd1\xd4\x93\x5f\xf7\xfb\xe4\x6c\xd0\x58\x13\xa3\xbc\x41\xd7\xe4\x70\x07\x85\x1e\x45\xb7\xa7\x1b\xda\x59\xe4\x7b\xe8\x84\xb4\x77\xd5\x91\xaf\xc0\xac\x3e\x87\x0a\xa5\xbe\x47\xac\xc3\x21\x75\xd7\x22\xcf\xe7\xa8\x57\xfc\xf6\xa7\x69\x6a\xd1\x6d\x4d\x47\x16\xd1\x0b\x79\x5d\xc2\x8a\x8f\x9e\x48\xda\x0a\x21\xf0\x45\x3e\x37\x28\x81\xed\x3f\x22\xa3\x14\x1f\xf8\xe6\x69\x37\x5b\x5a\x3f\x1a\x55\x2e\x99\x47\x00\xba\x25\xb9\x19\x56\x5e\x8d\x27\x9d\xe6\x4a\x46\x2e\x7e\xdd\x41\x24\x08\x1d\x7f\xa7\x38\xb5\x0a\x1d\xf5\x49\x5a\x3d\x06\x7d\x51\xa8\x79\xf4\x56\x71\x1a\x61\x62\xc9\x2a\xc7\x5a\xa0\xc6\xf5\xa0\x22\xc1\x77\x93\x96\x1a\xcc\xb3\x92\xb7\x27\x75\x4f\xdc\xe2\xc7\x20\x56\xdc\xc4\x1e\xad\xe1\xf8\xf7\xc6\xeb\xfc\x3c\xb0\xa3\x63\xa0\xc8\x41\xb9\x5a\x3c\xdd\xfd\xc7\x7b\xd8\xcf\xbb\xc7\xa7\xfd\x8f\xd5\x76\xb7\x7e\xf8\xb6\xdf\xac\x9e\xd6\x8f\x3e\xd4\xaf\x13\x92\x08\x6b\xfd\x1d\x3f\x2b\x84\xb5\xf8\x86\xd4\x22\xdf\xda\x41\x3d\x35\xa5\x8f\xe3\x9f\x71\x06\xe9\x34\x8c\x11\x91\x98\xd5\xab\x3c\x7b\xc9\x64\x0e\x37\x65\xe5\xc4\x17\x26\xef\x9d\xc6\x22\xea\x99\x86\xc7\xc3\xfa\x9b\x28\xa6\xbf\x82\xb4\x44\x69\x6e\xe7\xfb\x4d\x1a\x47\xa7\x00\x18\x1c\x58\x96\xa7\xaa\x06\x6f\xf6\xcd\x5f\x5a\x06\x29\x0a\xbb\x64\xad\xa1\xab\xce\xaa\xa6\xff\x96\xc8\x66\xa7\xa8\xe6\xaf\x49\x2d\x93\x7e\x05\x4d\x95\xc1\x1b\x6c\x32\xb0\xcc\x86\x73\xd5\x2f\x5a\x0a\x83\xb2\x25\xb6\x3a\xe0\x07\x12\xd7\xbe\x8c\x38\x58\x5c\x47\x4d\xac\xec\x77\x01\xef\x36\x60\xa7\xa6\x74\xcd\x03\xff\x40\x6b\x99\x62\xac\x4f\x42\x53\xef\x9b\xc1\x09\xac\x81\x71\x4c\x6b\xfb\x22\xe1\xf7\x6d\xa9\x32\x68\x3e\xc7\x8b\xc1\x04\x12\x71\x5a\xb5\xc3\x93\x5b\xb6\x89\x3f\xc6\x72\xcc\xe3\x30\x83\x36\x51\x8a\x54\x3b\x47\xb4\x32\xd7\xbb\xc7\x3d\x14\xc3\xc0\x3c\x84\x4a\x62\x56\xa4\xaa\xad\xe9\x61\x61\x28\x53\x1b\x60\x78\x7a\xfc\xe6\xff\xfc\x75\xc1\xa0\x68\xd7\x9b\xc5\xf9\x64\x65\xb1\xb7\x34\x34\x13\xc3\x15\x22\x62\xb7\xc4\x6d\x53\x95\xc5\xcb\x77\xf0\x26\x0b\x44\x42\x24\xc4\x15\x8d\x42\xdd\x3c\x01\xae\x3f\x8b\x64\x71\x5d\x88\xe2\xb8\x85\x20\x88\xde\xd7\xc6\xa2\x7d\x57\x2f\x2c\x11\x83\xeb\x48\x43\x2b\x10\x2d\xb4\xc6\xc3\xb3\xfb\x7b\x12\xc7\x4e\x3c\xf4\x8c\xd4\x76\x6a\x3e\x00\x55\xb6\xfa\x7a\xff\x32\x64\x62\xf3\x97\x62\x2a\x44\xa7\xbb\x56\x15\x40\x51\x37\x7d\xfd\x02\xf0\x88\xa3\x85\xe7\xa3\xe3\x5f\x93\xf0\x01\xe7\x54\xf9\xc4\x9e\x10\xf5\xe2\x98\xd9\x0d\x6c\xf6\x7c\x02\x9e\x58\xb2\xdb\x17\x68\xb6\xd9\x4b\x01\xd5\xa3\x71\x43\x31\x02\xa6\x9c\xc6\x84\x93\xfd\x5e\x09\x71\x18\x63\xad\x17\xda\x9f\xbb\x4c\xfd\xea\x73\xc2\x90\x50\x85\x66\xb3\xaf\x11\x6c\xad\x66\x3d\x68\x44\x47\xbf\x9b\xb5\x4f\xf0\x96\xd5\x67\x80\x61\xd7\x3b\xa5\x0c\x9d\xc5\xbb\xf2\xa5\x93\x0e\xfb\x32\x16\x02\x22\x8c\x68\xd8\x57\xdb\x21\x14\xc7\xdf\x5b\x50\xc5\x3b\xf7\xee\x9c\xb6\x06\x84\x0a\x2c\x13\xa9\x0d\x0d\x39\x0b\x7d\xf4\xc1\x64\x44\x6d\x1d\x4c\x76\x38\x7a\xd9\x92\x79\xb6\xf4\xf1\x80\x2b\x62\x90\x55\xe9\xdd\x27\x0a\x5d\x56\xdf\x7d\x1e\x14\x00\xe8\xa7\x50\x6f\x2d\x82\xd2\x22\x6a\xdf\x67\xbd\xdb\xde\xfb\x87\x50\x90\x1a\x5b\x16\x63\x55\x4d\xee\xa6\xda\x2e\x04\x74\xc0\xf1\x7e\x18\x78\x0d\x06\x1c\x5c\xa0\x4d\x18\x46\x9d\x59\xe4\x38\xd1\xc6\x3f\x06\x4e\x02\xd6\x6d\x65\x3d\xb3\x40\x56\x16\xde\xfe\x9d\x87\x5d\x01\x48\x0b\xde\x40\xc5\xcb\xf6\xd1\xf6\x26\x6d\x67\xd4\xde\x8d\x8a\x7f\x08\x30\x29\x66\x04\xf6\x99\xa7\x81\x9a\xb8\x40\x26\x0c\x34\xb2\xaf\xfa\x7c\xda\x57\xa3\x6b\xc2\x30\x40\xcb\x0c\x9a\x57\x37\xa0\x76\x47\xfa\x3e\x28\xa4\x1b\xfb\x25\x43\xda\x6b\x62\x42\x2e\x30\x45\xf2\x56\x0e\xc3\x40\xfd\x57\x30\x61\xc2\xc3\x9e\xe8\x7c\x67\x99\xd5\x9d\xca\xee\x85\x75\xe9\x16\xcf\xac\x6b\x6e\x42\xc9\xf0\xed\x96\x65\xf1\xd2\xfe\xa8\x35\xa0\xfd\x17\x32\xa1\xb6\xb4\xec\x15\xe6\x20\x47\xe5\x56\x73\x8f\x06\xd4\xd5\x22\x14\x2f\xb9\x98\x61\xa7\x40\x22\x74\x97\xa7\x5e\x34\xce\xfb\xc1\x55\xaf\x27\x0b\xfd\x02\x64\x7f\x86\xd3\xce\x44\x26\x40\xb5\x78\x5b\x78\xaf\x32\x51\x7d\x7a\x1b\xde\x90\x30\x61\xc4\x43\x83\x3f\x77\x88\xbb\x1b\x06\xad\x0c\x25\x31\xfa\xcb\x47\xc0\x0d\xa2\x8f\x18\x4c\xb6\x29\x43\x59\x82\x4c\x59\xea\x53\xe5\x96\xac\x63\xef\x6f\x42\x93\xc0\xea\x57\xfa\x94\xc7\x28\x27\x65\xa8\x00\x43\x06\x6a\xed\xd7\x8b\x42\xaf\xed\x51\x32\x21\xd5\x34\x2c\x4a\xb8\xc3\xfe\x6e\xa0\xaa\xcb\x42\xe4\x88\xc8\xb1\x4e\xe7\x05\x50\x99\xe1\x26\xd0\xb1\x9b\xe9\x96\x30\xce\x35\xc4\x01\x47\xe4\x0c\xe2\x49\x61\xaf\x44\x3e\x89\xd2\x9b\x98\x33\xb4\x14\x0c\x34\xea\x15\xd9\xe4\xea\x9b\xb2\xba\x87\xaa\x5d\x92\x93\x85\x6c\xe2\x54\xf8\x72\xa9\x6b\x90\x9e\x2a\x27\x2b\x5e\x5c\xa1\xfc\xf8\xd2\x69\x44\x03\x0b\x56\xb1\xa5\x52\x93\x8b\xa5\x3c\x15\x9d\x16\xae\xc7\xac\xb9\x52\xcd\x5e\x34\x62\x66\x92\xa5\x2a\x70\x39\x24\x63\x44\x8e\x6a\x33\xae\x45\x84\x16\x89\x2a\x4f\xf9\xaf\x85\x15\x2b\xed\x9c\xdf\x3f\x26\xe7\xbb\x11\x91\x22\x5e\x43\xdf\x96\xc2\x0d\xd8\x2d\xbe\x36\x1e\x8d\x50\x14\xf7\xad\x76\x44\xd5\xca\xd9\x23\xe3\x2e\x32\xb5\x55\x69\x35\x34\x43\x27\x69\x72\x21\x29\xa4\x64\x7e\x44\x35\x32\xa6\xb4\x8e\xe4\xc7\x84\x0d\xd7\x48\x63\xc3\x67\xdb\x9b\xdd\x76\xe5\x81\x51\x46\x31\xc2\x75\x47\x42\xb4\xb4\x19\x67\x31\xf4\x9c\x7c\xc7\xd8\x20\x38\xe6\xb1\xd2\x59\xcf\xee\x67\x14\x10\x7f\xf7\x25\xbd\xf1\x75\x5b\x9d\xa2\x69\xd9\x1e\x2b\x17\x36\x21\x9d\x44\xc8\xfe\xda\x0c\x80\x66\x13\x03\xfa\x3c\xf2\x35\xfd\x04\x1a\x22\xa4\xc7\x72\xc2\xb6\xd9\xcc\x93\x43\x18\xa1\x29\x81\xa6\xd3\xe8\x84\x34\xc0\xac\xfa\x32\x1a\xa2\x3f\xb3\x46\x57\xe5\x3b\x8c\xaa\xae\x0d\x18\x22\xc8\x00\x87\x32\x6f\xdc\x1b\x13\x06\x68\xea\x3d\xd7\xf0\xaf\x93\x28\x9a\x76\xfe\xf5\x05\x1f\x34\x08\x52\x9d\xa6\xdd\x31\x85\xa8\x60\x0f\xc4\x1c\x7d\x75\x1a\x04\x82\xe0\x4a\x34\x59\x91\xd5\xaf\xd7\x9d\x09\x45\x83\x40\xdb\xca\x8c\x4f\xa8\x7f\x94\x0d\x6c\x7d\xbe\x8a\x06\x81\xd1\x98\xf8\xb7\xa5\x91\xa1\xff\x73\x18\x68\xab\xe8\x06\xed\x47\xd8\x65\xe3\x8d\x8b\x06\x21\x17\x8a\xf8\x09\x86\x35\x47\x18\xbc\x1e\x4d\x9c\xb6\x97\xc4\xba\x42\x9f\xae\xda\xac\xb6\x8f\x97\xb1\x19\x34\x88\x18\xe3\x49\xaf\xf5\x3b\x64\xf2\x99\x74\x4c\x21\x75\x18\xdf\xfb\xb2\x68\x57\xef\x13\x34\x27\x57\xcb\xe5\xdc\x16\x1a\x90\x90\x9a\x8e\x1e\xd7\x4b\xe4\xf6\xe1\x64\x1a\x50\x6a\x0b\x79\x3e\xac\x88\x81\x9d\x79\x75\xd7\xaa\x43\x84\x8f\x0f\x78\x36\x47\x15\x2d\xe3\x98\xc5\x60\x76\xb4\x3f\x35\x9d\x84\xee\xea\xe3\x88\xdc\x14\x23\xfe\xca\xf9\xf7\x67\x24\xc4\xe8\xc5\xfd\xff\xc1\xa3\xfc\x3f\xe1\x65\x68\xc0\x84\x4d\x10\x60\x2e\xf4\x9f\x65\x56\x80\x76\xa0\xf9\xf9\x47\xe2\x94\x22\x00\xd6\x49\xbe\xb4\xc6\x1a\x1e\x98\xed\x7e\x95\x15\xae\x36\xe6\xf7\xc2\xe5\xe7\x09\x1f\x1a\xc4\x61\x8a\x51\xc2\x43\x56\x34\x8b\x93\xce\x1a\xbb\x6b\xfe\xc6\xb0\xa5\x41\xac\x2c\xaf\x2a\x7e\xd6\x87\x72\x1e\xae\x48\x83\x04\xac\x8e\x84\x86\xb7\x7d\x05\xb5\xaf\x1a\xa3\x41\x2a\x38\x5a\x15\x99\x03\x8f\xdf\x67\x45\x73\x9e\xd9\x6c\xfb\x49\xce\x7d\x8a\x14\x33\x2e\xa0\x07\x35\xcf\x34\x48\x81\x63\x79\xf1\x16\x9a\xd5\xc3\xb7\x6b\x78\xfb\x0a\x7d\x4d\x03\x11\x50\x2c\x5b\x69\x2a\x0c\xb3\x8e\x6f\x26\x52\x6b\x8c\xbe\xbf\x8a\x1c\x3c\x0d\xdc\x80\x7b\x8b\x06\x2a\x48\xac\xb2\xc3\x49\xd6\xaa\xca\xe4\x94\x3b\x6a\xb8\x75\xd1\x40\xc7\xa1\x19\x58\xff\x5f\x84\x17\x68\xa0\x13\x2b\x80\x6c\xe3\xaa\x8b\x4e\x4a\xdb\x35\x43\x20\xb1\x8a\x5d\x95\x59\x51\xef\x4a\x14\xd7\xf2\x4d\x51\x62\x59\x69\xd0\x87\x41\x0d\x89\xd3\x2c\x95\xd9\x97\x90\x3d\x1a\x40\xa2\x13\x1f\x60\xf8\xfc\x89\x70\xc0\xc9\xf8\x80\x60\x4a\x8e\x28\x9d\x5b\x6f\xa4\x9d\x81\x93\x7e\xd2\x7a\x55\x35\xf4\x2e\x2d\xe2\x8c\x6e\xca\x79\x3c\x1c\x0d\xc0\xc4\xa8\x99\x64\x71\xd6\xab\x42\xd7\x0b\x3f\xe8\x61\x10\x5a\x6e\x42\xe3\xf2\xbf\xf6\x6e\xd4\xb7\x8a\xc8\xc1\x9d\xb0\x08\x66\xc6\x5b\xec\x62\x09\x6d\x67\x2b\xcd\xb4\xcf\xea\xfa\x04\x5f\x05\x1a\xbf\x08\x8a\xba\x6b\x85\x9c\x24\xae\xb0\xfc\x26\xab\x95\xc8\x47\x07\x17\x0d\x43\x23\xd1\x57\x32\x18\x8d\xfc\x79\xe1\x00\xea\x8f\x54\x1a\x46\x29\xf1\x3a\x23\x68\xc4\xdd\x94\xd5\x0e\xc4\x61\xad\x67\x8a\x10\x69\x18\x09\x93\x3a\xe8\xf2\xe3\xe9\x2d\xd3\x65\x95\x89\x55\xa1\x8f\x65\x36\x31\xdb\x68\x48\xe2\xd8\xd3\xdc\xf7\x52\xf2\xb3\x2b\x36\xa4\xd4\x5a\xb2\x75\x57\x90\x3f\xbf\x92\x42\xaa\x2c\xca\xc7\x73\x6b\x03\xfc\xd5\xda\xd6\x3d\x28\x68\x9c\xe5\xa2\x21\xe3\x31\x52\x20\xb4\xaf\xd4\xda\x6c\xa3\x44\x09\x0d\x19\x68\x2c\x9d\xac\xf3\x41\x02\xc7\xb5\xf1\x88\x21\x30\xa6\x28\x35\x74\x1c\x45\x34\xe4\x84\x38\x08\x93\x2b\xe4\xf4\x7f\xd7\x11\x3e\x1a\x0a\xe0\xda\x58\x68\xd6\xaf\xa5\x30\xe6\x21\x7a\xa3\x2e\xae\x03\x8b\x42\xdb\x93\x6b\x54\x80\xe0\x3a\x27\x32\x64\x36\x84\x83\x94\x28\xf7\xa2\xfa\x05\x0d\x96\xa1\x0d\xa3\x20\xa3\x6c\x78\x94\xf8\xdf\x2a\x43\xc1\x11\x3f\x56\xce\x41\x5b\x9b\x07\x50\xed\x3e\x5e\x7d\xfa\x5b\xa4\xa9\x74\xd1\x42\x5b\x38\xfc\x17\x74\x00\xde\xb3\x41\x4c\x15\xc7\xfd\x6b\x6f\x57\xfb\xa6\x2c\x7e\x8b\x6f\x9c\x7c\x37\x11\x46\x48\x97\xb5\x6f\xbd\x8a\x33\x55\x8d\xf1\xb2\x0c\x25\x23\x1c\x7c\xfd\x8c\xca\x8e\x19\x9e\xde\x7d\xa6\x94\x86\xd2\x88\x14\xdc\x01\xf2\xc7\xe4\xc6\xc3\xe3\x38\x54\xa1\xe5\xc9\x6d\xfd\xbe\xa2\x7e\x87\x6a\x1a\xfe\xa5\xa1\xe2\x24\x05\x17\x91\xbd\xaf\xbb\x5b\xe8\x40\x06\xca\x2f\x0b\x93\x9f\xa0\x50\x63\xd9\x60\x1a\xea\x50\x60\x91\x90\xd3\x42\x18\x4a\x21\xd0\x50\xa7\xb1\x57\xbb\x73\x99\x55\x8b\x28\x29\xee\x44\xed\xc3\x2a\x93\x55\xa0\x25\x89\x5c\xb0\x6d\x36\x33\xea\x3f\xf4\x30\x4a\x40\x43\xad\x22\xe4\xb1\xb6\xf6\x28\x64\x77\x65\xdd\x3d\x04\x10\x8a\xd1\x9c\x57\xe1\x27\xeb\xf8\xdd\x81\x07\x8a\x75\x02\xe3\xbd\xd3\x32\xd8\x1e\x20\x31\xf8\xe5\x6c\x20\x74\x98\x85\xa4\xa1\xa1\x12\xa9\x11\x7c\x74\x18\xf9\x60\x76\x9d\xb0\x36\x0d\x8d\x48\xd1\x82\xdd\xf5\x52\x39\x34\x0a\x42\x45\x2c\xeb\xeb\x8f\xf5\x66\x3c\x04\x51\xc0\x63\x64\x23\xf7\x96\x33\x46\x2d\xc7\xd8\x0a\x1a\x05\xa9\x95\x7c\x2c\x4a\x37\xa8\x0b\xc7\x62\x77\x53\x56\x5b\x80\x61\xa4\x92\x46\x81\x62\xbe\xd6\x02\x95\x4e\x2c\x57\x87\xbd\x64\xe2\xfb\xe8\x54\x7b\xbe\xd1\xd3\xc1\x91\x30\x2c\xde\x44\x96\x0b\x9b\x0d\xf8\xf2\x78\x8f\xc2\x98\xfb\xa4\xd8\xc5\x35\x14\x85\x10\x60\x24\xbd\x81\xba\x59\x8a\xa2\xf1\xb8\xa2\x76\x8b\x5e\x17\xaa\xac\x2a\x50\x4d\x57\x42\x4a\xa3\x28\xe0\x48\x36\x86\x63\xba\xd2\x2f\x60\xbd\xc5\xc9\x50\x44\x49\x9c\x88\x5e\xbd\x6d\x5d\xa3\xdb\x7e\x9d\x29\xf8\x26\x0e\x30\xcb\x26\x42\x23\xc2\x98\xb0\xac\x8d\x5b\x34\x39\xfc\x06\xd0\x8d\x19\x49\x6d\xd6\x41\x18\x93\xe5\x59\xbb\xe2\x87\x6a\xdc\x34\xa2\x5c\x02\xf5\x98\xde\xab\x53\xa1\x73\x98\xad\x82\xa2\x11\x0b\x0c\x1a\x9d\x8b\x97\x2a\x43\xaa\x8f\x4d\x05\x6f\x3d\xef\x3d\x8d\x18\xb5\x35\xd4\xc7\xaa\x3c\x94\xbb\xb2\x2c\xea\x21\x3a\x91\x46\x2c\x4d\x3c\xb7\xc6\xbe\x5d\xed\x18\x49\x71\x6d\x3c\x01\x8b\x01\x0e\xe3\xa6\x77\xbf\x68\xc4\x15\xa0\x8e\x81\x68\xbf\xe3\x45\x01\xbe\x4e\x5a\xb1\x1f\x4d\xae\x13\xe1\x2b\xf5\xb3\xe2\xb6\x3c\xc0\x39\x0d\x1c\x8d\xb8\x09\x3c\x81\xf5\x0d\xc6\xd8\x0b\xf5\x39\xe9\x12\x47\x61\xa8\x3c\x0b\xde\x01\xa2\xc9\x07\x88\x53\x1d\xf6\x66\xd7\xaa\x79\x7d\xde\x5e\x0f\xf5\x16\x69\x24\x22\x45\xa3\xee\x9c\xc3\x7a\x23\x0f\x97\x19\xdf\x49\x88\x28\x89\x27\x35\x8f\x23\x8d\x6e\x1a\x09\x15\x6a\xb7\x59\xfe\xeb\x54\x56\x13\xfe\x53\x1a\xc9\xd0\x6a\x3b\x9e\x8a\x8d\x38\xd5\x38\x71\xfc\x63\xc8\xd4\xae\xdf\x4c\x95\xf7\x59\x61\x55\xbc\x7d\x9b\x0a\x18\x56\xde\xb8\x14\xa3\x45\xc3\xad\x1a\x1b\xcd\xf9\x79\xeb\x75\x2f\xfd\x7e\xe5\xff\x1d\xc7\x1d\xdb\xcb\x18\x0c\x58\xdc\x2f\x9e\xbe\xaf\x30\xbf\xb7\xbd\x5d\x3c\xad\xba\xbb\x30\x8e\xde\xb6\x92\xd5\xf4\x3b\x28\x11\x81\x7b\x80\x3d\x89\xe6\xac\x95\x48\x87\xda\x62\x5b\x51\x22\xae\xac\x7c\x3c\x6b\x7c\x21\x90\xb1\x8f\x7e\x2d\x5e\x2a\x18\x15\x10\xfa\x2e\xc6\x52\x2d\xb5\x87\x7b\xbb\x62\x31\x54\xf7\x5b\x70\x29\x8d\x4c\xa0\x70\xab\xca\x91\x24\xec\xd1\x2c\xcb\xc3\xa1\x6c\x17\x81\xc9\x3e\x48\x34\x13\xef\xa7\x24\x60\x61\xd8\x73\xca\xf6\x96\xcd\xe0\xbd\x48\x90\x5a\x59\x17\xf4\x6e\x70\xe8\x27\x1c\x59\x94\x44\x81\x09\x3c\x29\x8d\xad\xfa\x7f\x2e\x4e\xb5\x97\x43\xe9\x7a\x31\x8a\x7e\xfa\xe2\x78\x9c\x22\x8e\xe6\xce\x53\x12\x31\x8d\xd2\xdc\x96\x15\x69\x88\x1d\xa7\x84\x84\x04\x53\x66\x9e\x77\x9e\x84\xee\xfd\xc2\x7f\x8c\xff\xf5\x6f\x41\x22\x1e\xf5\xcb\xe0\xa6\x2a\x0f\x5d\xed\xa7\xef\x91\x58\xa9\x82\xf6\xcb\xe4\x79\x6b\xc3\x2d\xcb\x4e\xd5\x9a\x12\x02\x61\x64\xc9\x79\x87\xf6\xd1\x90\x24\x8d\x12\x1a\x5b\x31\xf1\x17\x68\xfe\xfd\xc7\x70\x9c\x29\x04\xe8\x84\x5a\xb0\x19\x46\xbf\xae\x4e\x9f\x17\xa0\x8a\x67\xee\x34\x61\x61\x8a\x59\x63\xb7\x7d\x62\xed\x01\xc6\x69\x66\x43\x6e\x6d\x7f\x08\xbd\x70\x93\x85\x60\x5b\x5d\x96\xda\xaf\x12\x97\xf3\x38\x2f\x10\x9f\x5e\x88\x44\xa2\xd7\x1e\xf8\x29\xde\xe0\x47\xd9\x9c\x6d\xf5\xe3\xcf\xc6\x74\x10\xba\x03\xee\xb9\xc8\x9a\x7f\x0a\x0d\xdb\x06\x04\x82\x4a\x9d\xc7\x79\x51\xca\x7d\xc6\x67\x20\xcc\xd8\xd8\xfd\x99\x9e\x3c\x25\x5c\x43\xe8\xd0\x2b\x9d\x3f\x79\x4e\x33\x4c\x49\x2c\x15\xb3\x15\x13\xdd\x96\x42\x62\xcd\x31\xa2\x5e\xca\x76\xbe\x6e\x5f\x33\xf0\x60\x02\x4a\x92\xd0\x2a\x02\x5f\x83\x15\x6f\x74\x54\x93\xff\x77\xce\x1c\x4a\x12\xd6\x69\xa7\xd9\x6f\xb0\x9e\xd8\x45\x24\x61\x80\xeb\xeb\xfb\x66\xbd\x1d\xcd\xf1\x24\xd6\x09\xce\xf1\x4a\x66\x4d\xd5\x9a\xf1\x36\x60\x75\x9f\xe5\x50\x37\x65\x31\x7d\xcb\x94\x69\x9b\x23\xc8\x9a\x43\xeb\x45\x8f\x2e\x96\xa6\x06\xab\x89\xef\xaf\xd7\xa3\xbf\x8b\x38\xf2\x4a\xdc\x28\xc4\x03\x03\x7b\x8c\x08\xa9\x7d\x54\xbf\x83\x2c\xa2\xde\x63\x67\x3a\x10\xa1\x6c\xa9\x28\x26\x26\xef\x6c\xd9\xc4\xe4\xb9\x64\xc8\xa3\xa0\xd7\x76\x5b\x9c\x9a\xd2\xff\x5a\xd2\x04\x27\xf6\x5b\x06\xef\x1b\x51\xd7\xef\x65\x35\x1d\x1e\x19\x0b\x24\xab\xc1\xd4\x3e\x38\xaa\x80\xf1\xc6\x22\x85\x42\x0f\xe6\x58\x96\xf9\x0d\xc0\xba\x40\xc2\x85\xe9\x85\x80\xd8\xea\xc9\x53\x61\xd1\x33\x8b\x3c\x9f\x4c\x27\x20\xb6\x08\xf8\x7e\x75\xe7\xeb\xa3\x29\x81\x34\x51\x76\x17\x32\x43\xbd\x42\x4a\x0c\x8b\xf0\x68\x3e\x94\xf3\x20\x09\x4a\x8c\x8e\xf1\xb0\xdb\xbf\x8a\xd6\x6c\xd9\x55\x96\x02\xb5\xb5\x8e\x4f\xe7\x1c\x7c\xe3\x1f\xd3\x30\x4a\x30\x69\xe3\xc9\x23\x90\x75\xd7\xaa\x0a\xfc\xe1\xbb\xa4\xa1\xb7\x57\x2c\x3b\x7f\x59\x7d\x7a\xd9\xde\x59\x6f\x87\x86\x32\x44\x03\xdb\x5d\x74\x64\x61\xd3\x88\x2a\xa1\x3a\xe2\x72\xac\xe4\xbd\x2b\x5f\x56\xad\xc7\xe8\xf9\x1a\x29\x25\x34\xd5\xc8\x3d\x5d\xbc\xb8\x0a\xb8\x21\x07\x14\xa5\x24\xe6\xc8\x8b\x70\xac\xe0\x26\xfb\xb8\x00\xf2\xa6\x94\x80\xc5\x0d\xdc\x67\x85\xbe\x15\xaa\x2b\x2e\xa3\x94\x2a\xbb\xf6\xac\xfb\x77\xfd\x2b\x9f\xc6\x7a\x86\x17\x0c\xa7\xa3\x46\x41\xe0\x21\x6c\x79\xdc\x84\xc7\x56\x52\xca\x42\x4b\xd3\x2f\x4f\x9f\xb7\xdb\xed\x6b\x79\x1c\xcf\x0e\xca\x28\x45\x7e\x94\xf6\x23\x6f\xca\xee\x75\x79\xa4\x31\x11\x63\x3d\x92\x4c\x75\x90\x77\x4a\x39\x89\xa5\x33\x87\xaf\x4e\xd5\xb4\xb4\xb1\x6d\x37\x88\xfe\xef\x40\x5b\x5b\xc8\xcd\x35\x58\xa6\xfe\xee\x22\x2a\x44\x12\x84\x85\xff\x43\xca\xc3\x14\xfa\xda\xad\xcd\x19\x2b\x36\xa5\x69\xca\x12\x6d\xa3\xe6\xd9\x1b\x54\xb6\xca\xec\x00\x45\x33\x03\xf0\xa4\x34\x55\x04\x43\x05\xfb\xa3\xdd\xc4\xc6\x9f\x2b\x35\x06\xdc\x0e\xea\x36\xb9\x33\x05\x57\x4a\x45\x60\x39\x61\x2c\xb1\x55\x6b\xc7\xa3\xd7\xe3\xc3\xf8\x54\x70\x25\x9c\x2f\xb9\xa9\x4a\x7d\x9a\x3a\x01\x54\x52\xab\xc0\xe3\x22\xee\xe3\x6a\xad\xf9\xf8\x2b\x95\xcc\xf2\x32\x99\x53\x81\xdf\xff\x41\x1c\x20\x1c\x5b\x4a\x54\xc6\xa9\x1c\xe6\x3e\x44\xbe\xe8\xa2\x86\x54\xea\x04\xc9\x02\x76\x4f\xcb\xd5\xd3\x32\x0a\xbe\x40\xc5\x51\xaa\x15\xc3\xca\xd6\xbd\xd0\xfa\x3b\x9c\x51\x1c\xbb\x5e\x10\x12\xcf\xb4\xe8\xa4\x8c\xe6\x4a\xfc\x28\x35\xa1\xa5\x10\xb1\xd6\x49\xe4\x9f\xc8\x74\x9a\xc3\x85\x7e\x80\x97\x27\xf8\xf3\x62\x64\x63\xf4\x70\xc6\xc4\x78\x86\xc8\xf6\x08\xbc\x85\x1e\x78\x46\x59\x10\xa4\xbc\x37\x6b\x1e\x1d\xa7\xce\x37\x31\x5f\x75\xd0\xf6\x07\x4c\x87\x61\x5d\xd9\xf2\x06\xe0\xbe\xd4\x88\xb5\xaf\xbb\x2b\x26\x01\x06\x1a\xf6\xc7\x2a\x53\xb0\x1f\x3a\x3b\x2c\x48\x0d\x1a\xc8\x77\x8f\xcb\xef\xab\xeb\x7d\xf8\x9f\xfd\xf5\x62\xb7\xea\x5a\x25\xc3\x4c\xec\xfe\x90\x7d\x74\xeb\x99\x05\xca\xa0\xe5\xec\xe4\x66\x37\x55\xf6\x96\xe5\xf0\xd2\x79\x5d\x2c\xd0\x56\xa3\x47\xe4\xb9\xf5\x53\xeb\x41\x1b\x30\x9c\x38\xb6\xa8\x7e\xbf\x7d\xbc\xbb\xde\xdf\xad\xef\xd7\x3b\xdf\x21\x0c\x28\x72\xfa\x6c\x77\xff\xb2\xb6\x55\xd4\x7a\xff\x63\x94\xc5\x04\x8d\x4e\x59\x48\x15\x56\x91\xc8\xd3\xe7\xb6\x3c\x5c\x2e\xf8\x9e\x1f\xc2\x30\x0d\xb0\x54\x49\x42\xf3\xa8\xbb\x27\x8d\x24\x4f\x55\xaf\x12\x8c\x45\xba\x83\x33\x8a\x45\x86\x44\xda\xd7\x02\xed\xe6\x73\xa5\x94\x11\xca\xb5\xfa\x42\xee\x6e\x34\xcd\x18\x49\xad\xf0\xb7\xe5\xa1\x2e\xab\x5e\x0d\xe2\xea\xd3\x86\xf1\x26\x79\xdb\x81\x59\xc5\x88\x4a\x22\x67\xab\x3a\xbb\xff\xa6\x35\x81\x88\x7f\x60\x4a\x23\x66\x41\x29\x33\xe5\xf5\xbe\x8f\xb2\x54\x50\x0d\x88\xc3\xd3\xc0\x4a\xaf\x7b\xd8\x77\x37\x40\xac\xdd\xd9\x2c\x0c\x0f\xfd\x87\x1d\x78\x76\x17\xca\x78\x40\xf1\xac\xeb\xd1\x60\x94\xf1\x30\xe0\x96\xb0\xb8\xd4\xcb\xa1\xc9\xc2\xe2\x88\x23\x98\xca\xa5\x2a\x2d\x21\x56\x27\x27\x77\x5e\x09\x4a\x59\x4c\x38\xba\x39\x47\x91\x69\x47\x5d\xdb\x5d\x8c\xd1\x18\x3d\x20\xe4\xb3\x1e\xc7\x1e\x58\xcc\x13\xdc\x69\x95\x28\xf6\xd9\xfe\x7f\x4f\xfd\x13\xc7\x71\x84\x8a\x11\x43\x3e\x7e\xca\x62\x00\x44\xca\xeb\xd2\x8a\xd4\x8f\xb7\x05\x96\x84\x21\x72\x30\xff\x28\x3f\x7b\x15\x26\xca\x12\xae\xbc\xe4\x90\x83\x31\x3e\x61\xb2\xfb\xfa\xb7\xa9\x3c\x96\x86\x96\x9c\xc7\xe6\x62\x2d\xe0\xc2\x5f\x36\x25\x14\x5d\x24\x25\x2a\x5d\xef\x5f\xca\x5c\x0f\xf1\x8c\x94\xa5\x09\xb5\x6c\x57\xed\xda\xda\x3f\x3f\xac\x77\x7b\x64\x86\xe9\xda\x41\x72\x1b\xcc\x2a\xa0\xb5\x3e\xbf\x83\x52\xe2\x57\xc4\xf8\xd0\xb3\x61\xa9\xb1\xa4\xae\xda\x51\x7b\xd6\xe7\x81\x6f\x26\xe2\xc8\xaf\x8d\x0b\x4a\x20\x94\xc9\x30\xe0\x96\x5b\xd2\xba\x08\xf7\x65\xd1\xbc\xe6\x9f\x83\x72\xe4\x1f\x65\x7e\x3a\x40\x47\xc1\x3a\xfd\x3d\xed\x74\x9b\x3c\xaa\xc4\x72\x67\x5c\x42\x22\x4f\x7e\x9e\x72\x5b\xd2\x97\x15\xad\x13\x61\xc1\x2d\xf5\x30\x0f\xc7\x54\xc2\x80\xf5\xb6\x13\x4e\xe2\x1b\x98\x84\xab\x98\x82\x44\x7b\x86\x47\x7b\xa7\xef\xff\x59\x9e\xa3\x0b\x28\xd3\x02\x30\xf0\x8c\xb5\xf0\xa8\x72\x67\x0c\x54\x96\x08\xcf\x3d\xdb\x7f\xe3\x41\x19\xbc\xfb\x19\x44\x29\xb2\xbd\xbd\x8a\xfa\x75\xd9\x71\x5d\x53\x06\x89\x95\x08\x93\xa7\xcf\x9f\xa2\xca\xcb\x4a\x2f\x5f\xa1\x9e\x2e\x04\x90\x16\xd2\xbf\xf7\x1f\xd5\x12\x7a\xb4\x17\x73\xac\x51\xc3\x83\x87\x81\xb1\xcc\xc6\x05\x7c\x34\x4f\xa0\x4f\x6a\x6c\x3d\x30\x30\x90\x24\x5e\xdc\x27\xb4\x10\x63\xdf\x66\x62\x8a\x5b\xf7\x0f\xa8\xb2\x66\x28\x42\x40\x79\x40\x63\xe4\x3c\x31\x59\x9e\x2f\xaa\xca\x2b\xf7\x53\x1e\xb0\x14\xe1\x34\xae\xf4\x02\x91\x92\x33\x63\xc7\x03\xc5\xd0\x6a\xc9\xb3\xba\x19\x16\x2a\xce\x25\x80\x79\x00\x4c\x7b\x10\x8e\x38\x40\x31\x1f\xa8\xe4\x61\x62\x65\xbd\xae\x45\xf3\x2d\xab\xfc\x2a\x69\xad\x31\xcc\x4c\x3f\x94\xbf\x4e\x96\x35\x0a\x8d\x89\x2d\x54\x6f\x99\x82\xe9\x35\xb4\x74\x04\x1a\xe2\xd0\xc9\x9d\xf4\x40\x5e\xca\x23\x02\x81\xa3\xeb\x98\x12\x57\x7c\xe9\x46\xf2\x88\xc7\x18\x00\xb3\x4c\xef\xd7\xf6\x2c\xbd\xe0\x77\x70\x42\x22\xf0\xf4\x68\x7b\x44\x95\x20\x1f\xd4\x1e\x0e\xc7\xe6\xf3\x06\x6c\x3a\xe8\x5d\x54\xba\x5d\xab\x7e\x95\x72\xc2\x2c\x90\xca\x95\x3d\xd8\x20\xcf\xa3\xe9\x9a\xe3\x00\xf7\x68\x8f\x53\x58\xbe\x66\xb9\xae\x26\xe0\x37\xca\x89\x04\xe2\xe6\xbf\x2d\xc0\x76\xab\x60\xf2\xba\xbe\x37\x68\x0c\x3c\x3b\x63\xdf\x83\x1d\xc7\xaf\x43\x81\x53\x1b\xb6\x85\x43\x76\x3a\x6c\x50\x7e\x79\xda\x25\xd6\x36\x6f\x9b\x7f\x41\xcb\x41\x39\xe3\x11\x1e\x42\x96\x7d\xf9\x69\xb1\x5b\xed\x6f\x1e\x9f\x9f\x76\xb7\xfe\x2d\x79\x60\x8c\x97\x13\x42\x15\xdb\xae\x21\x32\xb1\xd5\x35\x2a\x9e\x8b\xfa\x15\x72\xf3\xc7\x8c\xf4\x3a\xe5\xdc\x84\x81\xd3\xa4\x39\x63\xac\xbf\xf0\x6d\x63\x2a\x31\xf0\xe4\xad\xd8\x0b\x52\xa2\x93\x1b\x25\x5c\x62\xd4\xf6\xdb\x07\xf6\x7e\x3c\x82\xa7\x3b\x9c\xf4\x03\x6b\x23\x67\xc5\x7a\xe9\xf7\x76\x9e\xc6\x01\xd2\x0a\x62\x50\xfd\x5b\x99\xeb\x33\x48\x2b\xe5\x92\x91\x68\xa4\xe4\x84\x3b\xfb\xcc\xf1\xca\x65\x9a\x70\xd1\x55\xa3\xaf\x3e\x1a\x2c\x5c\xc5\xed\xb7\x75\x16\xea\x55\xc7\xeb\x47\xb9\x94\x0a\x61\x11\xcd\x6b\x56\xe9\xbe\x96\xa3\x67\x92\xa7\x5c\x05\x26\x4a\x5d\x9d\x27\x14\xf5\x99\x3f\xc2\x15\x0b\xac\x95\x54\xb6\xae\x74\xf7\xb3\x84\xf9\xf4\x84\x8b\x12\x4c\x5e\x48\x87\xa9\x67\x66\x3e\x5d\x48\x07\x72\x9d\x86\x08\xe6\xc1\x87\xba\x3a\x55\x13\xb4\x06\xd7\x22\x48\x7a\x32\x34\xa4\x5f\xfd\xaa\xec\x75\xe4\xae\x70\x0d\x14\xd3\xb2\x78\x08\x9e\x0e\x03\x2d\x3b\xca\x41\x29\xe5\x79\x75\xa7\x8a\x81\x94\x9b\xd0\x46\xa6\x6d\xe0\xda\xff\xc6\xb4\xbe\x01\x8e\x43\x9e\x8b\xca\xc9\xf8\x3e\xb5\xb3\xc0\xf5\x88\x83\x40\xe3\x4e\x9b\x1f\xef\xc5\x87\x3d\x40\xbb\x26\x62\xe5\xda\x2d\x69\x97\x3d\xea\xee\xc5\x47\xd7\x1c\x13\x43\x07\xe2\x37\xeb\x42\x95\x07\x18\x9c\x77\xa3\x71\x89\x03\xa3\x6d\x35\xfb\xdd\xb3\xbf\x42\x18\x31\x5c\x4a\x5b\xcc\xa3\xf4\x93\x2f\x0e\x81\xe3\x9d\x5b\x8f\xc0\x3a\x84\x57\x9f\xcb\xb9\x2a\x31\x1a\x47\xb1\x4d\x96\x29\x71\xec\x14\x64\xfc\x65\xa2\x24\x45\x02\xa6\x3d\xa8\xeb\xf2\x24\x2f\x13\x37\xf9\xfe\xda\x62\x8a\x6d\xfe\x71\xad\xba\x41\x8a\xc0\x46\x1c\x8c\x17\xc8\xb3\xb5\x29\x03\x8c\x57\x4c\x68\x82\x91\xa1\xfd\x80\x32\xf9\x6f\x7b\x0c\x31\xe1\x34\xea\xb1\x75\xcf\x45\xa6\xca\xaa\x78\x12\x85\x7a\x9d\x45\x28\xc4\x44\x51\x9c\x64\x57\xa2\x51\xaf\xd7\xd0\x08\xf5\xea\x58\xe0\xbc\x61\x10\x06\xce\x1e\x88\x69\xca\xb1\x80\x4f\x67\x75\xb3\x6f\xcf\xc3\x7d\x0d\x33\x04\xa0\xff\xed\xfa\x4b\x8e\x51\x30\x21\xcb\x53\x63\x0b\xc2\x27\x77\x67\x51\x82\x3b\x98\x63\x6b\x8b\x36\x50\x16\x9f\x33\xc8\xa5\x98\xc5\x02\x8b\x9e\x1c\x55\xd4\x55\xa6\x7d\x7c\xf7\x42\xd4\x27\x66\x69\x8a\xdb\xf4\xcf\xbb\xfb\xdd\x15\x6a\x73\xfb\x6f\x10\xbb\xd9\xb8\x58\x6d\xdb\x63\x5f\x34\x7d\xe6\x68\xce\x5f\x8f\x63\x1e\x60\xac\x0a\x29\x18\xbe\x89\x73\x27\xce\xf7\x4b\x19\x46\x30\x6d\x2e\xc4\x3a\x27\x43\x1a\xa8\x59\xbf\x26\x8e\x05\x97\x71\xef\x86\xb9\xc4\xb0\x6f\x54\x91\xf4\xf8\x91\x32\xd7\x97\x65\x69\x69\x9c\x50\x89\x87\x21\x02\x2b\x96\x27\xf9\x7f\x74\x35\xe3\x44\x01\xc2\xab\x72\x10\x1a\xaa\xbd\x0f\x24\xc4\x82\x5b\x41\xe2\x97\x4e\x77\x5c\x77\x4d\x22\xc4\xf9\xb0\x38\x35\xe5\xf6\x98\x67\xcd\xf2\x54\x0d\x31\x2e\xae\x9b\x8c\x63\x0b\x2c\x29\x4c\xe9\xf1\xb4\xae\x49\x25\x14\xf3\xf4\xf7\x8b\x7f\x8f\xc8\xec\x68\xac\x74\x88\xe6\xe0\xe2\xfe\x6a\xb1\xdd\x2e\xae\x1f\x9f\xf0\xf4\xec\x9a\x81\x84\x2e\x1c\xf9\x54\x96\x07\x0f\x85\x84\xe9\x5e\x01\x46\x2a\x57\x4f\x6c\x59\xc4\xee\xb2\xe2\xd7\x74\xe8\x0c\x4b\xa3\x70\x50\x31\xfe\x78\x1c\x95\xfd\x90\x7e\x66\x13\x37\xb5\x93\x20\xb6\x8a\x9f\xba\x7c\x2f\x76\x99\xfa\xb5\x83\x73\x19\x7e\xd7\x35\x8c\x40\x76\xbc\x1a\x6b\xbd\x2b\xcf\x95\x4a\x68\x12\x52\x8a\xf5\x89\xfb\xee\x60\x1e\xaa\x76\xd0\x24\xd4\x56\xe8\xea\x4a\xd4\x70\x23\x2a\x58\xba\x83\xd2\xcb\xa9\xd1\x84\x10\xc2\xdd\x88\x20\xcc\xa9\x30\xe5\xd5\xe7\xfa\x7a\x72\x1f\x42\x52\xb4\x66\x1d\x83\xcb\xaa\xe7\x84\xa3\x09\x61\x02\xab\x0d\x8e\x65\xdd\xdc\x8a\x4a\x0f\xce\xc9\x84\x24\x14\x43\xef\x79\x59\xc3\xcf\x61\x14\x6a\x36\x9b\x32\x19\x01\x0a\xd6\xfd\x47\x30\xd2\xf6\x20\xf2\xfc\xb9\x06\x24\x15\x1b\xba\x77\x09\x0b\x09\xb8\xb2\xe2\x9b\x53\xa1\x1f\x7b\xeb\xb9\x37\xc7\x13\x9e\xc6\x91\x8b\xa7\xfc\xcc\x9a\x57\x0b\xdd\x1c\xf2\x82\xfa\x7c\xec\x7c\x79\x06\x4d\x62\x1a\xe0\x41\x56\xe6\x43\x9e\x3c\x9a\xc4\xca\xc6\x05\xae\x45\x23\x6c\xb6\x79\xb8\x09\x24\x31\x58\x0f\x77\x0b\x85\x46\xab\x7c\x57\xe2\x3e\x39\x9e\x4a\x49\x12\xc8\x68\x88\xb0\x1d\xaa\xa5\xd3\x24\x35\xc2\x78\x20\x8c\xfd\xd9\xae\x44\xd3\x25\x3f\x33\x89\x12\x41\x6c\x85\xe2\x26\x17\x7f\x89\xdf\x95\xda\xd2\x44\x88\x00\x27\xd0\xc9\xd6\x77\xae\x9a\xd7\x65\x39\x75\xc9\x12\x49\x09\x82\xdc\xb6\x57\xb3\xda\x26\xbe\x17\x44\x91\x1c\x20\xa8\x6a\xe8\xf5\xea\xba\x57\x51\x21\x8b\x75\x8f\x93\x1c\x18\x27\xe3\x8a\x43\x9a\xa8\x48\x20\xbb\xd6\xe6\xc7\x0c\xef\xe1\xfc\x13\x28\x12\x20\xab\x04\xf2\x9e\x7b\x8e\xfc\x49\x17\x6a\x91\xaa\x2e\xd4\xf7\x84\x19\x93\xee\xe9\x74\x18\xba\x3c\xb2\x85\xd3\x95\x87\x1f\xeb\xcd\xdd\x0c\x7c\x25\xd1\xc4\x6a\x4d\xd9\xf7\x38\xdb\x33\xbf\x7c\x4c\xcd\x03\xdc\x5c\x5e\x45\x6d\xa7\xd2\x78\xb4\x21\x0a\x4c\x34\x50\xe3\x69\x2d\x1a\x1b\x32\x7b\x2e\xb2\x37\xa8\x6a\x18\xd0\xc5\xd1\x04\x98\xc1\x55\xd2\x6e\x93\x1e\xdf\x18\x76\x8d\xa9\xc2\xd7\x5d\xed\x36\x65\x23\x9a\xd2\x05\xd0\xbf\xe4\x1e\xa2\x09\x68\x83\x58\x2f\x07\xe4\xba\xf0\xbd\x0d\x51\xb8\xee\x6e\x6f\xd0\xc9\x9f\x99\x5d\x69\x40\x2c\x19\x71\x01\xef\xdd\xa2\x1c\xbb\x24\xff\xfd\x9f\x89\x1d\x3a\x7e\x94\x34\xa4\x69\x98\xfa\x98\x0b\x92\x51\x95\xed\x0e\x74\xca\x9a\x4f\x17\x0d\x18\x02\x1c\xd2\x90\x19\x04\x7f\x5d\xdd\xba\xca\x38\x9a\x86\xdc\x60\xe5\x1a\xc2\xfd\xdf\x8e\x41\x10\x7d\xfd\xf6\x69\xc4\x52\x3c\x59\x5d\xc9\x73\x47\x86\x31\x9e\x49\x69\x94\x72\x01\xa8\xf8\x5c\xdf\x82\xe7\xd7\x69\xff\xac\xf0\x68\x6a\x57\xc1\x46\x64\xd5\xf4\x57\x22\xc6\x1c\x7f\x9d\xbd\x14\xcf\xc7\x39\x23\x68\x3c\x82\x44\x25\x88\xa5\xf2\x1b\x83\xe3\xa6\xf8\xbc\x6c\x3e\xa5\x2c\x08\x2d\xf0\xb7\xdd\xaa\x3a\xb4\x7f\xa7\xcb\x4d\x53\x46\x49\x12\x7b\x9e\x8e\x7c\xb8\x4d\xa6\x3c\x8a\x11\x7e\xb4\x03\xf5\x5a\x94\x79\xf9\xf2\x49\xbf\xf9\x9f\xc5\x81\x0d\x33\x38\x83\x78\x40\xea\x32\x7b\x80\xa5\x71\x14\x4b\x17\x4e\xde\xfe\xca\xf2\x7c\xf5\x26\xf2\xd3\x28\xe6\xf8\xf7\xc0\x92\x69\x4c\xb9\x07\x18\xfd\x10\x55\xd6\x7e\x90\xaf\xa9\x90\xfa\x67\x48\x82\x04\x9c\xc3\xb5\x6a\x5e\x6f\xca\xca\xef\x0a\xae\x3d\x25\x12\x9f\xd1\xe9\x01\x76\x0a\xa5\x53\xc6\x1a\x9a\xa6\x82\xa0\x25\xf9\x00\xef\x16\xae\x72\x59\x07\x98\xa6\x82\x31\x9f\x92\x3b\x64\x4d\x03\xda\x42\x85\xca\xa9\xd3\x94\x0a\x27\x5e\xec\x20\x1f\x00\x56\xf3\xee\x4b\x7c\x5d\x2a\x38\xc7\xa8\xe8\xfe\x78\xaa\x5f\xef\x44\xa1\xd7\x17\xa2\x2c\xa9\x8c\xa3\x04\x3a\xf0\xc1\x13\xd4\xe5\xa9\x52\x80\xe7\xd0\x19\x44\xd8\xff\x24\x01\xb4\x90\xae\x20\x87\xbf\xc4\x03\x34\xef\x65\xe5\x33\x94\xa9\x94\x0c\x65\x66\xac\x43\xb6\x69\x3d\xee\xd5\xc7\x60\x7b\x1c\xcf\x5d\x29\x3b\x75\x09\xcc\xc8\xe7\x19\x14\xcd\x0c\x2f\x07\x4d\xa5\x31\x9e\xfc\x63\x14\xa1\x4b\x75\xa8\x71\xf9\xbf\x65\xf0\xbe\x85\x3c\xc7\x00\x64\xbd\x68\x56\x1f\xbe\x08\x48\x55\xa5\x28\xea\xcf\x99\x10\x5c\xaa\x41\xc5\xae\x5c\x7a\x03\x47\x58\x78\xf4\x9e\x9e\x1e\x23\xae\x3f\x24\x21\x19\x09\x73\x38\x0f\xfb\xd3\x56\xf6\x8e\xb7\xe9\x14\x00\x10\x32\x80\x39\x28\x5b\x79\x77\xe5\x1f\xdb\x04\x69\xdc\x1d\x44\x78\x7e\xd8\x06\x11\x84\x16\xde\x37\xd4\xe6\xb5\x59\x89\xd6\x6b\x9c\x5d\x47\x22\x60\x06\x8b\x12\xf6\x5d\xf9\x0d\x1a\x10\xd3\xa3\xb0\x7f\x71\x11\xb2\x84\xb9\x12\x81\x07\xf8\x68\x96\x9f\x3d\x92\x4e\x44\x51\x04\x0e\xc2\xf6\x24\xb2\x1a\xf4\xaa\x8b\x2c\x09\x12\x01\xc6\x43\xb1\x42\x78\xca\x5f\x41\x05\x25\x96\xec\xe4\x05\x9a\x15\xd6\xa5\x6f\xcf\x12\xbf\x82\xc6\xb6\x3a\xa1\xd9\xaf\x0f\x07\x57\x7b\xea\x6a\x46\xca\x0e\xc7\x24\xa8\xb4\x80\x05\xfc\x9c\xcf\xc5\x28\x00\xe5\x30\xfe\xad\x39\x38\xfa\x3c\x82\xc7\x04\xa5\xf4\xeb\xd7\xf2\xbd\x9f\xbd\xbe\x11\x0c\x22\xf3\xf2\xf2\xe5\xaa\xbd\xc0\x38\x0b\x2b\x92\x50\x7b\x55\xf4\xef\x27\x5d\xd6\xdf\xb2\xb7\xe9\x86\x2e\x12\x1e\x22\x21\xd1\xb1\x82\x71\xe8\x25\xf1\x1d\x84\xd5\x75\x45\xe0\x25\x5a\xdc\xfb\x53\x95\x9d\x6d\x66\xc3\x35\x20\x12\x25\x55\xcf\x14\xb7\x2b\x7f\x42\x36\xbf\x56\x45\x1a\x05\x38\x9f\x2a\xf1\xee\x40\x34\xb3\x05\xd5\x54\xa4\x71\x84\xf8\xc5\xba\x34\xa8\x62\x38\xa5\x97\x9e\x5c\x56\xd9\x03\x14\xc9\x1e\x76\xaf\x59\xf1\xab\x8f\x4f\x88\x54\x1b\x4c\x29\x8b\xa2\x38\x4d\x90\x26\xad\x93\x96\x8e\xc8\xa3\x5b\x43\xc9\x71\xa4\x7e\x4d\x5e\x48\x85\x48\x19\x6e\x6b\xb6\x90\x64\x5d\x3b\x91\x0a\x7f\x5b\xa1\x02\xe2\xb2\x63\x55\xd6\x7c\x76\xaa\xff\xae\x59\x46\xb6\x1c\x2a\xab\xbb\x5a\x48\x54\xeb\xea\xdb\x65\x98\xf6\x15\x3d\x8b\x3c\x7f\xcc\xf5\x99\xa4\xb9\x3f\x0f\x85\xa4\x1a\xab\xa4\xf6\x58\xcd\xdb\x2c\x4e\x95\x98\x4c\x5a\x99\x0a\xed\x42\x8d\xad\x95\x30\x39\xb3\x85\xe2\x0c\x5d\x24\xa4\xf4\xff\x91\x1d\x7f\x36\xd9\xeb\x58\x12\x77\x70\x7a\x0f\x96\xa1\x52\x91\x77\x4c\xfc\x8b\x8c\xa3\xa6\xa3\xbe\x5a\x74\xc2\x2f\x67\x87\xdb\xe4\x79\x20\x14\x96\xda\xae\x54\x50\xd7\xa3\x82\x89\xf9\x49\xa0\xa3\x08\xb3\xf3\x18\x25\x80\xd3\xa1\x3d\xe7\x44\xbf\xb0\x75\x62\x03\xe2\xb9\x85\xd4\xd6\xa3\xe2\x41\x01\x81\x8e\x8c\xf7\x10\xd5\x2b\x3a\x1e\xe1\x64\x04\x21\x0a\x2d\x4b\xcd\xf5\x30\x8b\x22\x80\xc7\xc2\x81\x11\x76\xa2\x7a\xe9\xc5\xd5\xd0\x82\x4d\x27\x17\x31\x69\x48\xb9\xaf\xc2\x1d\x32\x71\xfe\x31\xf1\x0d\x84\x91\xda\x0a\x62\x61\xc8\x69\x0f\x1f\xc7\xbc\xac\xa0\x42\xca\xdf\xa1\xb2\x3e\x95\x81\x02\x74\xcf\x1e\xe0\x7d\x5d\xd7\xa7\x73\xcb\x77\xe0\x49\xca\x30\x20\x9a\x76\x4c\x0e\xad\x37\x27\x5e\x26\x1b\x9c\x0c\x13\x2e\x62\x8f\x46\x29\x4d\xd6\x9c\x53\x86\x53\x19\xc5\x11\x06\x91\xf2\x4c\x41\x51\x43\x57\x62\x3f\xc9\x09\xc8\x28\x89\x51\x48\x6e\x29\x8e\x8d\x18\xa3\xe1\x64\xa4\x8d\x2d\xe2\x6f\x67\x5d\x56\xbc\xec\x6f\xb2\xa2\x80\xcf\xba\x6b\x37\x4c\x3a\x26\xb6\x01\xc6\x69\xbd\x7c\xf4\xc6\xbf\xa4\x24\xc2\x22\xd2\xe3\x6b\x25\xba\x1a\x88\xf6\xaf\x58\xe8\xf2\xd6\x11\x00\x0e\x37\x2c\x49\x13\x2b\xa6\xe8\x1c\x42\x3d\x79\x33\xaa\xe3\x18\xb1\x3f\xa7\xa9\x46\x14\x95\x4c\xc9\x4e\x4d\xc4\x53\xb5\x4d\x7e\x1e\x53\x81\xa7\x8f\xb5\x77\xae\xa0\x6e\xbc\x65\x34\x3f\x73\x65\x9c\x92\x38\xed\x32\xbc\xf9\x20\xb6\x20\x13\xae\x68\xe2\x48\xac\xab\x5f\xd0\x60\x04\xcb\x37\xa6\x8c\x23\x24\x6f\x5d\x3f\x81\xd0\x9f\xdd\x9f\x39\x43\x93\xe0\xa5\x02\x68\xf6\xe5\x41\x4c\x9c\x2f\x99\xc6\x96\xa8\xc4\x72\x48\x3f\x94\xfa\x0c\xc9\x3f\xde\x8d\x65\x6a\x04\x22\xfa\xb5\xc8\xfc\x4d\x44\x62\xe9\xb1\x01\x39\x81\xf6\x06\x60\x5f\x9c\xda\x15\xd7\x87\x5d\xa4\xd4\x4c\x53\x5f\x52\x29\xf2\xab\xa1\x37\xd3\x3f\x8d\x34\xda\x66\x2d\x86\x3a\x72\x67\x45\x70\x52\x07\x52\x19\xbf\x61\x5a\x65\x89\xfb\x2e\xe3\x2f\x75\x00\xd2\xf9\x93\x18\x6d\xfb\x7b\xa6\xb3\xd4\xdc\x62\x5a\x1d\xc9\xdc\xe6\x55\xd4\x80\x9a\x37\xdd\x75\x53\x1b\x32\x3e\x15\xa2\x6e\xdd\x99\xd1\x42\x18\x6f\x59\x12\x84\xb6\x99\xe4\x4e\x55\x73\x57\xee\xca\x06\xee\xb2\x3f\x4f\x56\xbe\x6b\x84\x52\x96\x20\x85\xea\x05\xab\xf6\x32\xeb\x7c\x74\x69\x8c\x40\xfe\x65\xcf\x1f\x7d\x2f\x86\x69\x23\x15\x70\x95\x40\x4f\x54\x62\x8b\xf1\x87\xf1\x22\x15\xd2\xc0\x4b\x54\x2c\xaa\x26\xab\x9b\x1b\x98\x2e\x4c\x15\x25\x80\x15\xeb\x79\xf9\x0e\x15\x16\x3d\xdc\x94\xd5\xae\xd4\x5d\x1e\x58\x45\x20\x75\x1f\xc8\x68\xad\xf0\x45\xa1\x27\x75\x4c\x97\x12\xfa\xe3\x91\x56\x24\x11\xb8\x4b\xb6\x2e\xe3\x9d\xe5\xbf\xf8\xfa\x7c\x55\xc4\x10\x64\x12\x43\xba\x88\x45\x9e\x5f\x8b\x46\xdc\x94\x95\x97\x0c\x1a\x2f\x3a\xc5\x22\x4e\xe9\x90\x00\xc9\x9c\x0a\x7d\x5d\x16\x83\xf9\xa8\x98\x90\x98\x5a\xf6\xe5\x78\xed\x4c\xbb\x08\xd1\x52\x3c\xb6\x41\xf2\x6f\x99\x2e\xce\x42\x50\x8a\x1b\x1a\x0d\x08\x97\x7e\x8a\xaa\x12\xc5\x39\x97\xc4\xfc\xa5\x63\x93\x22\x5e\xa7\x80\xf7\xa7\x93\x84\xfa\xb9\x68\xb2\x7c\xa8\x04\x4e\x55\x42\xad\x53\x60\x27\xe6\x5c\xe0\x41\xa5\x61\x12\xc4\x43\x53\xde\xb9\xc1\xe8\xb4\xed\xbb\x83\x3b\xee\x4f\x6e\xf7\xbf\xc9\xe8\xbf\xf3\xf4\x7b\x54\xa5\x71\x98\xf6\x4f\xd0\xda\xd8\xdf\xc4\x01\x36\xe5\x78\x81\xf9\xce\x69\x18\x7b\x26\x67\xd4\xbb\xdb\x40\xeb\x86\x3a\x72\x92\x49\x5f\x19\x1a\x8b\xe6\xb1\x94\xdb\xdb\x9e\xfe\x89\x2a\x01\x16\xca\x90\xd5\xbd\xbc\xe2\x60\xae\xb8\x5e\x32\x48\x95\x71\xd3\xfb\x20\x45\x5d\x0b\x3d\xf0\x3b\x07\x36\x87\x92\x54\x00\x99\xea\xba\xdc\x8b\x0f\x47\x4d\x37\x08\x19\xa8\x76\x67\x37\x5e\x28\xf0\x8c\x9a\x65\xbc\xd8\x15\x70\x8e\xb9\x7d\xb0\xca\x01\xcf\x99\x2f\x1f\xb9\xf0\xc9\x21\xb6\x2a\x9b\x9e\xe8\xb9\xbd\xc3\xb9\xd0\x5c\xdb\x4f\x63\x6e\x72\xf9\x2a\x8a\x02\xf2\xde\xa6\xc2\x9b\x7b\x32\xb8\x0b\xcf\x24\x35\x6e\x28\xb7\x50\x95\x3d\x1d\x32\x55\xe0\xb8\x37\xfe\x57\xd4\x4e\x25\x70\x70\x06\xeb\x40\x5a\x45\x43\xbb\x64\x3a\x27\xde\x11\xa6\x8d\xee\xa0\x03\xc9\x31\x5f\xbd\x85\x19\x46\x0a\x1d\xc6\x1c\xac\x88\xc1\xf1\x5e\xd4\x9d\xb0\x34\xd5\x51\xc8\x30\xe5\x67\xcb\x86\xfe\x75\x3a\xc3\xa6\xeb\x28\x4c\xf0\x38\xe9\x08\x94\x96\xb9\xc8\x3a\x1d\x76\xaa\xa3\x48\x06\xc3\xd8\xf1\x7d\x59\x41\xeb\xd4\xcd\x1e\xa8\x3a\xa2\xd6\xac\xa8\xa1\x87\xa5\x0c\x27\xfd\xa0\x27\x37\xa0\x3a\x4b\x60\x50\x68\xa6\xa3\x44\xc8\x5e\xbb\x7c\xbf\xdd\x2d\x9e\x76\xfb\xcd\xd3\x6a\xbd\x7c\xdc\xef\xd6\xf7\xab\xed\x6e\x71\xbf\x99\xbe\x85\xea\x78\x32\xba\xac\xfb\xa4\x0b\x81\x14\x27\xd9\x3b\x64\xd6\x35\x5d\x17\x3e\x5e\xe9\x7a\x50\x2a\x63\xaf\x68\x57\x8a\x6a\x8c\x7e\xd2\x34\x51\x48\xa2\xa3\xec\xfc\xe8\x16\x89\xcb\x04\x8f\xb9\xfc\xa8\x66\x5c\x30\xab\x68\xb6\xd6\xc8\x3f\xec\xea\xc4\xfc\xe3\x30\xcd\x95\x0d\x9e\x54\x19\xd4\x57\x23\x58\x91\xe6\x34\x46\xd2\xaf\xdb\x17\x35\x9a\x31\x31\x97\xe8\x2b\x1c\xcb\xba\x71\xd2\x94\x70\x56\x8e\x31\x7e\xed\x58\xc6\x48\xa2\xf8\x4d\xd4\x03\x5e\x31\xaa\x93\xd8\x20\x58\xe0\xe7\x4f\x32\xba\x45\x1a\x25\x58\x73\x81\xd0\x99\xfa\xf5\xd4\x5c\x97\xef\xc5\x8f\x11\x64\x50\xa7\xd4\xba\xaa\xab\x42\x97\xef\x07\x28\x9a\x27\x57\x92\xda\xcd\xbb\x94\xc5\x38\xb5\xf1\x2a\xb8\xeb\x63\xc9\x4f\xeb\xe5\x75\x1e\xa5\xeb\x2a\xb8\xc0\xb0\xfa\xe2\x79\x77\xfb\xf8\xb4\x5d\x7f\xbb\x5d\x6c\x6f\xbb\xc6\xc4\xa9\xf6\x23\x05\xa4\x3b\x00\x77\xe5\xd5\x69\x3a\x8d\x85\x48\x13\x85\x0c\xe0\x8d\x2a\xb3\xe2\xe6\xd4\x9c\xba\x65\xa8\x85\x56\x08\xe4\xb3\x7a\xa0\x93\x1f\x42\x84\xec\x13\x88\x0c\xdc\xbf\x43\xb6\x7f\x41\xef\xdd\x37\x1b\x1b\x96\xb4\x7b\xf1\xfe\xf5\xac\x70\x5d\xb7\xee\x5d\xd8\xa9\x8f\x3e\x16\x79\x56\xc0\x08\xf9\xaa\xa5\x08\x11\x76\x81\xaa\x6b\x93\x4d\xca\x3b\x1d\x5a\x82\x4c\x75\x17\x97\xd7\x4f\xa2\xf8\x55\x5f\x7d\xa2\xb8\xe8\x90\x13\x6a\xfa\x33\x15\x69\xcc\x12\x5e\xc3\xb4\xdc\x43\xeb\xc0\xf8\x58\x4c\xd8\xe3\x1a\xb4\x56\x02\x0b\x82\xeb\xd7\xb2\x6a\xa0\xb0\x12\xdd\xe8\x49\x4f\x7f\x6f\x0c\x6e\x9c\xfb\x06\xc4\x61\x7d\xed\x7f\x0f\x89\x36\x30\x40\x45\x3e\xf7\xe9\xbc\x59\x9b\xaf\x1b\x28\x30\x94\xf6\x0a\xe7\x66\x62\xdf\x6b\x13\x5a\xfa\xa2\xe6\x15\x0e\xa0\xb7\x47\xb4\xcd\xa6\x5f\xcb\x24\x81\xaf\x42\x6c\x9d\x8b\xaf\xe8\x36\x20\x30\x96\xbf\x09\x3e\x40\x5d\xe8\x12\x12\x8b\x98\xf1\x9b\xdb\xde\x42\x23\xfc\xe6\x07\x91\xe6\xc8\x97\x91\x37\x6a\x9c\xfa\x04\x42\x6d\xfa\xfd\x09\xf4\x4d\x59\x76\x7f\xe5\x02\x0f\x58\x93\x15\x7a\xf7\x5a\x95\x05\x5c\x7d\x3e\x88\xc3\x88\x75\xca\x77\x95\xe0\xe1\xd0\xdb\xa3\x78\x2f\x2c\x21\xd4\x70\xc0\x80\x46\x09\x75\x92\x02\x3d\xc1\xf3\xf0\xcc\x06\x16\xd8\x84\x6f\x7b\x91\xd3\xf1\xd8\x7e\x50\x8b\xba\xf6\x45\x30\xe3\x7b\xf2\x48\x61\x64\xe4\xb1\xca\x5e\xca\xe1\xaa\x07\x9e\xd0\xc4\xe9\x27\xae\x97\x8f\x0e\x51\xdc\x35\x8a\x18\x77\x3e\x2c\xa6\xcb\x0e\x22\xdf\x7d\x1e\x61\x9c\xd6\xf4\x3d\xb5\x15\x10\xef\x0c\xa3\xbb\x52\xfd\x82\xa1\xda\xfd\xb0\x77\x4c\x08\x6e\xda\x79\x66\x60\x80\x11\x84\x98\xc9\xb8\x53\xe0\xad\x5f\xb3\xa3\x7f\x77\xcb\xbe\x7c\xe9\x14\x86\x98\x0b\xaf\x52\x84\x5f\x4b\x9c\xd3\xb2\xba\x9e\x09\x61\x48\x54\xf0\xa3\xcc\x4f\x45\x03\x50\x35\xed\x91\x87\x20\xa2\xa6\x7d\xe2\x6e\x5c\x52\x1e\xa4\x56\x27\xb6\xc9\x0e\xad\xd5\xf2\x5a\x1e\x8f\xbf\x15\x48\xfb\x9d\x8a\xc6\x68\xcc\x52\x95\xe2\x57\xde\x3c\xad\xf6\xed\x11\x67\xcf\xbb\xf6\xa0\xf3\x0f\x21\xe2\x08\xc9\x4f\x77\xe2\x17\xec\x6b\x04\x32\xb6\x4b\x72\xbf\x58\x6d\xfb\x2e\xb1\x25\xb9\x2c\xb3\xa2\x27\x4b\xa3\x20\x52\x86\x69\x7e\x6f\x78\x3b\xb0\x84\xdf\xcf\xed\x74\xeb\x00\x04\x20\xa3\x00\xd5\x86\xb7\x0f\x4b\x7f\x05\xc9\x93\xc4\xd2\xfb\xd4\xaa\xca\x10\x83\x10\x76\x6d\xa0\xe3\x41\x31\x95\x85\x54\x8e\xc2\x3b\xa0\xc2\x04\x41\xec\xf7\x65\x59\x0c\xd0\xba\xa0\x58\x4a\xb4\x95\x7a\xbb\xac\x3b\x37\xff\x99\x75\x60\xf0\x33\x83\xf5\x45\x31\x4c\xec\x9b\x22\x9b\xf0\xb0\xee\x99\x0f\xe3\x3b\x35\x46\x1b\x23\x9a\xc5\xa9\x80\xe6\x3c\x30\xee\xbc\x5a\x9b\x55\x5e\xf7\x97\x14\x31\x77\x5b\x44\xd6\xac\xf5\xc7\xae\x3c\x93\x1c\xa7\xa0\x65\x88\x21\xf1\x42\x54\xaa\xac\xaf\x3e\x67\xa2\x36\x00\x89\x2d\xa0\xb6\x68\xf3\xed\x6a\xf9\xf8\x70\xbd\xbf\x5e\x6f\x97\x8f\xcf\x0f\xbb\xfd\xfd\xf3\xdd\x6e\xbd\xb9\x5b\xaf\x3c\x98\x04\x20\x05\x03\x03\x9d\xf9\x47\xb3\x9a\x2a\x10\xcf\x1a\xbc\x00\x26\x45\x71\x32\x0d\xc7\x06\x8b\x12\x85\xe7\x7b\x1a\x3a\x31\x60\x84\xd5\x1a\xc0\x7a\x8d\xa2\x86\xa2\x3e\xd5\xd7\xd0\x88\x6c\x42\x8a\x48\x4d\x20\x39\xb0\x8e\xe3\xaf\xac\xce\x28\xaa\xa9\x09\xb4\xdd\xf8\x76\xc1\xbf\x87\xfb\x8a\x09\x8c\xc2\xe3\xa9\x6a\x2d\xae\xa5\x38\xce\x7b\x7c\x26\x8a\xb8\x97\xd5\xbb\x8c\x5d\x4f\x7c\xe7\x38\x40\xdc\x67\x79\x3c\x07\x0b\x4c\xae\x4b\xc2\x28\xea\xb8\x88\xb7\x33\x53\xcc\xf7\x93\x69\xdc\x27\xca\xb6\x27\xac\x88\xbd\x17\x4d\x33\x88\x96\x0e\x07\x0f\x25\x82\x42\xfb\x71\x4e\x17\xdc\x58\x43\x54\x22\xa8\x93\x3a\xea\x93\x82\x86\x46\x11\xe5\xa3\x60\xc5\xf2\xd4\x37\xea\x88\x0c\x05\x73\xc6\x57\x64\x71\x84\x49\xe1\xe5\xfd\xe3\xde\x81\xc4\x3a\x23\xc7\xb0\x34\x45\xae\xb6\xc3\x5e\x14\x22\xff\x6c\x32\x55\x77\x4d\x92\xe0\xec\x3e\x15\x59\xb3\x83\xba\xf9\x06\x4d\xc7\xb7\x31\x58\xb4\xe7\xaf\xc0\x20\xc4\xd7\x44\x92\x80\xfd\x55\x3b\x53\xff\xe3\x2f\xca\x43\xc6\x3b\x6a\xba\xb7\xac\x01\x18\xe5\xde\x26\x57\xe2\x9a\xe3\x6c\x7e\x87\xec\x3e\x2b\x06\xce\x9f\x89\x23\x5b\x77\xf8\x02\x8d\x93\x9e\xa8\xfe\x59\xca\xfa\xea\xd3\xa1\x54\xe6\xbe\xb0\x9f\x0a\xb1\xb2\xa8\x50\x9d\xd5\xe2\xa5\x82\x9e\x81\x69\x7c\xf3\x84\x53\x2c\x13\x6d\xb7\xd6\xab\xf5\x6e\x26\xdf\x6e\x92\x38\xf6\xdc\x05\xad\x9d\xd7\x9c\xa3\xfd\x4c\x4a\x05\x22\xc6\x4a\xab\x3d\xe0\xa4\x40\xbf\x39\x33\xe8\x1e\x9a\xd7\xa9\xc3\x6d\x52\xae\x2d\x79\xfc\x41\x54\xcd\x28\x06\x65\xd2\x44\xa0\x66\x8f\x15\xc2\x9a\xfe\x2e\xe5\xd8\xf8\x53\x14\xba\x41\x26\x8f\x29\xcc\xe6\x34\x55\x4c\xa3\x46\x70\x85\x99\x08\x2c\x92\x7b\x1d\x16\xc9\x19\x91\x70\x8c\x53\x1b\x21\xab\xcc\xba\x14\x5b\x61\xba\x4f\x20\xa4\x95\x37\x83\x42\x47\x13\xe1\x69\x6a\x24\x8f\xf1\x00\x68\x7e\x15\xe6\x5d\x8f\x56\xb7\x8c\x35\xe2\xd2\x0f\xfb\xa2\x2c\xd0\xa7\x5e\x4e\x43\xe4\x46\x8a\x10\x6b\xb2\x5d\x0e\x7c\x2a\x38\x36\x7e\x6f\x45\x6c\x00\xd5\xe1\x67\x06\x57\x1b\x7f\x2d\xc5\x74\x48\xd0\x32\x7a\x03\x91\x5f\xc1\x48\xc9\x87\x1a\x4d\x22\x3c\x06\xb6\xa7\x23\x54\x4b\x51\x49\x7b\xf6\x8c\x9e\x5d\x83\xe5\x4f\x40\x22\xa2\xb2\x80\xcf\x21\xee\xca\x80\x52\x58\x64\x72\x57\xbe\xb4\x76\xe6\x73\x31\x50\xdc\x1e\x3f\x8a\x61\xdc\x8a\xdf\x7a\xfd\xad\xbc\x2c\xce\xeb\x12\x26\xe9\xbb\x71\x94\xd7\x98\x38\x41\x6a\x4a\x9f\x75\xae\xcf\xb2\x44\xc6\x88\x58\xa4\x9e\x89\xf1\xe4\x2a\x5d\xd7\xfa\x4c\x75\x1a\xbb\xb3\x20\x60\x96\x50\xbd\x02\x55\x16\x2a\xcb\xe1\xda\x55\x27\xfd\x31\xe9\x27\x02\x8c\x44\x62\x8d\x8a\xa8\x07\x23\xc4\x82\x30\xd2\x54\x7a\xf1\xd6\xf6\xe3\x7e\x61\x6d\xb3\x20\x64\x41\x10\x74\x44\x1a\xcb\x57\x51\x09\xd5\x74\x84\x0b\x5d\xaf\x44\xa3\x4f\xb1\xae\xca\xe2\x56\x14\xba\x8e\xba\xbb\x09\x83\x9f\xfe\xf1\x08\xc5\x5d\x59\xbc\xc0\x5b\xd6\x7c\x8e\x1c\x74\x16\x84\x3a\x91\xc9\x84\x8f\x74\xbd\x7c\xbc\xf0\x44\x11\xd1\xe8\xff\x98\xf2\x54\x68\xa8\xa2\xe1\xfa\x63\x41\x44\x53\x64\x8c\x42\xbf\xcf\x7a\xdf\x9d\x93\xc4\x82\x48\x69\x15\x0c\x19\xd7\xe1\x61\x7d\x7f\x9e\x91\x9b\xdc\x91\xc4\x32\x1a\xf0\x03\xdd\x21\x0d\xc9\xac\xb1\xca\x02\x22\x52\x24\x8b\xca\x41\xbc\xc1\x0e\xc4\x19\xa4\xda\xf5\xa3\x51\x12\xb8\x24\xd7\xa2\xb6\x91\xa2\xdf\x24\x48\x59\x40\x65\x80\x4b\xf6\x80\xe0\xd2\xef\xf0\x39\x76\xa3\x58\x40\xc1\xda\x79\x79\x29\xf4\x3e\xef\x74\xfd\xc2\xbe\xdd\x60\x74\xfe\x58\x1e\x6f\x45\xe3\xe5\x6f\x59\xc0\xa2\xc8\x93\xcc\x3d\x94\x03\x60\xda\x84\xbf\x79\xb0\x18\x59\xc0\x52\x9b\xdf\x3c\x88\x5f\xe0\xb8\x51\xa6\xdc\xda\xe3\x87\x63\x22\x4a\xbd\xca\x5a\xa7\xb8\xd1\xcd\x13\x26\xd2\x48\xf7\x9c\x28\x97\xe8\x06\x59\xc0\xc0\xd2\x29\xfe\x2c\xf3\x5f\xd7\x96\x18\xf5\x02\x2c\x9b\x05\xcc\x30\x8c\x78\xff\x79\xca\xd4\xaf\xba\x44\x79\xcf\x9e\x9f\xe0\xe2\xf7\xe6\x3a\x06\xd6\x95\xbc\x1e\x1b\xd8\x93\xd0\x3f\x27\x37\x0a\xc3\x1a\x02\xd5\xc4\x7e\x88\x1c\x8a\x26\x2b\xbc\x44\xe2\x64\x19\xc6\xd4\x20\x87\xbc\x23\x70\x5d\x14\xc8\x24\x37\xe9\x94\x24\xee\x88\x2a\x8f\x17\x09\xe1\x5c\xd7\x34\xb0\xe2\x99\x59\x7d\x53\x56\x13\xfa\x00\xdf\x85\x08\x2c\x84\xb3\x51\x36\xeb\x55\x0e\xa2\x75\xbe\x97\xe4\x08\xff\x73\x42\xb7\xe3\xe1\x8b\xa8\x73\xf0\x27\x53\x3b\x55\x0c\x5f\x7d\xb3\xde\x6c\x97\xb7\x8b\xf5\x83\x1f\x13\xe1\x52\x05\x4a\x14\x9e\x77\x78\x2e\xbd\xec\x7b\x3b\x52\x8b\xca\x6d\xbd\x73\x94\x39\xc9\x78\xae\x09\x19\x61\xc6\x73\xdb\x94\xc7\x9e\x59\xa9\xfd\x7b\x8c\x21\x45\x6b\xdf\x2d\xcb\xd3\x31\x07\xd4\x1a\x5e\x6f\x6e\xb6\x7d\x4c\xc7\xf7\x56\x06\x71\x85\x4d\xa7\x8e\xbb\x11\xd5\x0c\xeb\xd0\x39\xca\x78\x70\x11\x49\xad\xe3\xe3\x55\x18\xd6\xba\x3e\x77\xc9\x59\x20\x19\x41\xe8\x88\xad\xc7\xea\xbd\x80\x7d\x9f\x6a\x65\x81\x8c\x39\x52\x22\xe4\xa2\x6e\x56\xd6\xeb\x99\xa4\x47\x59\x20\x85\x44\x91\xa7\x7e\xc7\x5a\x3e\xed\x7e\xbf\x65\x29\x41\xb9\x43\x8b\xae\x97\x8f\x37\x58\x45\xeb\xe3\x1f\x2c\xd0\x24\x0d\xa9\x67\x3e\xea\x69\x25\x9b\x1e\x74\xc4\x02\x90\x36\x02\xf5\x78\xfb\xed\xee\x24\x8a\x97\x4d\x25\xa4\xf0\x68\x0c\x16\x80\x32\x58\xf0\x27\x45\x9d\x29\x5b\x43\x33\xa0\x5b\x65\x81\x09\x25\x1e\x6c\x7b\x84\xf2\x5b\x65\x86\xde\x06\x99\x83\x6d\xb2\xc0\xa8\x00\xcd\x7a\x93\x67\xc7\xfa\xae\xa3\xb4\x61\x61\x40\x62\x2c\x73\xb6\x74\xca\x5d\x45\xd8\x28\x62\xc7\xc2\x40\x59\xe6\xbf\x95\x15\xeb\xf1\xe5\xb5\x13\xe7\xe7\x22\x7c\x70\xae\xce\xa9\xbb\xb2\xd2\x58\x6c\x31\x0c\x57\xfa\x87\x0b\x43\x9b\xd6\x42\x9f\x0c\x89\x78\x7d\x82\x8c\x85\x61\x44\x50\xc5\xb3\xf5\x3f\x6f\xf2\x52\x34\x83\xaa\xd0\xb6\xd5\x20\xa4\xf2\x1d\xf2\x76\xfc\x06\x92\xf8\x2c\x8c\x5c\xd9\x70\xfb\x4b\x4b\xdb\xf8\x1d\x3e\x07\x10\x5e\x16\x46\x51\x84\xfe\xe0\x5d\xf9\x62\x49\x52\xa6\xc8\x9f\xb1\x36\x11\xed\x93\x38\x2c\x24\x82\x63\xf8\xb3\x2e\x73\xbd\x6e\xe0\xd0\xdd\x96\x12\x89\x07\xf9\xed\x43\x07\xbd\xf5\x2d\x60\x53\x6c\xbb\xc5\xd3\xb7\xd5\x6e\x7f\xfd\x8c\x35\xd5\x0f\xfb\xab\xd5\x0e\x09\xc7\xae\xee\x1e\x97\xdf\xbb\xce\x26\xc0\x80\xd1\x76\xb7\xf8\xb6\xda\xef\x6e\x9f\x56\x2b\x0c\x7d\xec\x57\x0f\xd7\xbe\x0f\xe3\xb6\xb0\x79\xb9\x5a\xfe\x0e\x71\xce\x42\xce\x01\x44\x7f\x3c\x38\x0e\x82\x2e\x0c\xd5\x11\xf6\xb3\x90\x83\x23\x19\x6b\x5e\xaf\x21\x6f\x84\xc3\x91\x8d\x2a\xb7\x59\x18\x93\x10\x71\x53\xd6\x6b\xbf\x59\xdf\xec\x6e\xf7\x7d\xed\xa4\xef\x95\x00\xc7\xc5\xbe\x17\x5a\x23\x27\xe0\x2b\xca\x4d\x8f\x37\xb4\x30\xa5\x02\x89\xae\xef\xc7\x60\x0c\x16\xa6\x4c\xa2\xfb\xab\xf6\x1a\x71\x81\xdd\xdf\x79\x10\xf8\x84\xc4\xe3\x66\x90\x8d\x68\x9b\xc2\xc4\x81\x8a\xbc\xa0\xdc\x2e\x83\x2a\xb2\xf5\x24\x53\x66\x56\x16\xca\x38\x25\xae\xe4\x64\x2f\x8e\xc7\x93\x5b\x18\x83\xbd\x3e\x54\x51\x8a\x59\x4d\xcf\x43\xb8\x7b\xad\xa0\x6e\x5f\xc4\x9f\xbd\xa1\x8a\x19\xeb\x58\x15\xcb\x42\x89\xe6\x1e\x0e\x65\xf5\x49\x88\x45\xc5\xf9\x6e\x52\x61\x1e\xc5\x0a\x06\xbb\x3f\xea\x40\x21\x4f\xc7\x1e\x79\x02\x6f\xca\xea\x09\xac\x63\xdc\x8e\xd3\xb0\x3c\x63\xbc\xd6\x43\x1d\x92\xd4\x69\x53\x9c\x14\xfc\xa6\x66\xd8\xff\x86\x06\xa1\xe9\x22\xcd\x2f\xd0\x13\xb9\x4f\xba\xa9\x8e\xac\xd2\x46\xb0\x7e\x3c\x6f\x7a\x0c\x08\x0b\x35\x0f\x4d\x7b\x9d\xdd\xab\x28\x44\x53\x76\x2f\xa8\x63\xcd\x3c\x66\x29\x6b\x26\x30\x14\x16\x6a\x25\xd0\x7a\x5a\xfc\xf8\xf6\xf8\xd0\xcd\x11\x08\x13\xcb\x34\xa7\x7a\x8b\x36\x34\x34\x26\x9d\xc2\x9b\x67\xe2\x1f\xac\x3f\xc3\x00\x23\x6c\x42\x6b\x4b\x9e\x35\x8f\x17\xf1\x6f\xd4\x3a\x9c\x88\x09\x13\x39\x0c\xb2\x3d\x2c\x34\x92\x0b\x5b\x47\x65\x9a\x75\xd1\xce\x14\xd7\x12\x05\xb1\x55\x7e\x94\xa7\x3a\x2b\xa0\xae\x37\xb9\x28\x0a\xbf\x56\xae\x4f\x43\x5d\x75\x16\x85\x09\xa0\xbf\xed\x39\x0a\x9e\xe0\x38\x24\xee\x44\x31\xf7\xab\xb2\xd0\x36\xa3\x3e\xb1\x3a\xa3\x08\x14\x16\x87\xef\x2d\x93\xd4\x0c\x59\x0f\x8b\x08\xb5\x55\x97\xed\xd6\xbe\x42\x97\x31\x2b\x8b\xed\x7b\xd6\xa8\xd7\x5d\x39\x18\x99\x88\x30\x1b\xec\xed\x00\x84\xd6\xca\xaf\x5b\x53\x7a\x51\xf8\x02\x58\xff\xc9\x22\x92\x30\x8b\xfe\x6a\xca\xe3\x90\x59\xb1\x6d\xe1\x3c\xf0\x8e\x40\xc7\xfd\x3b\x55\xee\x66\x11\xe5\x21\x1e\xb0\x96\xeb\x79\xf6\x94\x70\x2b\x29\x62\x61\xc4\x53\xcb\x31\xe3\xfd\xae\xee\x41\x18\x15\x26\xf1\x21\x29\xfc\x46\x37\x65\x75\x7b\xb7\xb9\xdf\x75\x3d\x12\x81\x81\xc2\x41\x06\xfa\x92\xe1\x1a\x31\x25\x2d\x08\xab\x2c\xf3\xe1\xfe\x10\x31\xad\x8c\x73\x1b\xda\xcd\x6f\x24\x72\x3a\xbe\x44\x1c\x70\xaf\xe3\x74\x9f\x15\x4f\xe8\x70\x4d\x02\xf6\x83\xce\x2a\x41\x65\x17\x47\x47\xb3\x59\x3d\xed\xbf\x23\x93\x8e\xbf\x6f\xac\x35\xba\xde\x7b\x38\x64\x16\x98\x3f\x28\x7f\x9b\x37\x98\xfc\xb9\x1c\xa5\x91\x0d\x43\xec\xeb\x76\x0b\x75\xa9\xaf\xb3\xc3\x6a\xf6\x1a\xc9\xfc\xee\x11\xa5\x89\x40\x87\x45\x9e\xaa\xaf\xc3\xa6\x2c\x4a\x9d\xd8\xa2\x53\x6f\x9c\x6c\x34\xe3\xbe\x82\xda\x22\x88\x43\x56\x34\x8f\x3f\xef\x2e\xf5\xd2\x3c\xb5\xc8\x4e\xfd\x02\xcf\xc5\x50\xb2\x90\x45\x02\x22\xda\x29\x22\x1e\x4e\xcd\xa5\x5b\xc9\xc4\xb2\x97\x62\x44\xca\x51\xcc\xe8\xd0\x1d\x56\xfe\x62\x52\x2a\x74\x8a\xce\x24\x30\x2e\xd9\x32\xe3\x45\x27\x75\xac\x1c\x29\xc3\xf6\x5d\x38\xab\x8b\xfd\x63\xf8\xcf\x74\xc7\x09\xcf\x10\x6b\xff\x18\xf2\xa0\xb2\x48\x51\x66\xf7\x7b\x1b\x51\x5b\xe6\xe5\xfb\xff\x8d\xad\x9e\x45\x26\x62\x58\x55\x37\xa9\x80\x1c\x8f\x8f\x89\x63\xd9\x53\xe3\xaf\xac\xae\xc7\xac\xcb\x1d\x19\x91\xa4\xc8\x19\xfe\x56\xe6\x6f\xe0\x02\x77\xfe\x8a\x61\x77\x41\x13\xda\x1c\xc8\xf5\x6e\xbc\x37\x91\x20\x62\xa9\xa5\xa0\x40\x41\xf8\x3c\xab\x1b\xef\x58\x56\xd3\xae\x89\x65\x22\xb5\x89\x08\x9f\xbf\xba\xeb\xa4\x6e\x19\x09\x13\x92\xb8\x65\xb7\x42\x20\xcd\xe7\xb2\xa9\xf2\xc9\x65\x42\x61\xb0\x58\x6b\x77\xbb\x7e\xf8\xbe\xdf\x2d\x1e\xbe\xef\x6f\x9e\x1f\xae\x47\x55\xa9\x8c\x84\x4a\x61\x24\xf6\xae\x7c\xb1\x25\x5d\xab\x1f\x0f\xf3\xb3\x89\x84\x5a\x62\xa4\xc9\x25\x21\x7e\x2e\x36\xbd\x81\x76\xfb\xf8\xfc\xd4\x5d\x33\x22\x1a\x83\xd7\xc7\x57\x51\xc3\x9e\xed\xe5\xc0\xe6\x24\x11\x24\x49\xd2\xe9\xa2\xfe\xba\x29\x2b\x44\x7a\x8e\x6f\x45\x78\x8c\xa1\xec\xab\x9b\x9d\xea\x12\x3f\x8c\xd0\x50\x62\xcc\x10\xd3\xb7\xd9\xf1\x08\xe7\xa2\xd2\xd3\xa8\x42\xbf\xeb\x13\x4a\x62\x16\x0d\xb4\x84\x57\xc3\x7c\x2d\x23\x54\x06\x51\xe4\x96\x7b\x7b\xd4\x0d\xad\x2c\x42\x75\x68\xc9\x7b\xb3\x2a\xbf\x6a\xbd\x91\x51\x2b\x57\x7c\xe0\x3a\x2c\xf2\xbc\xa3\xf7\x70\x1d\xe2\x20\xc1\x92\xe3\x1e\xa1\xf4\xa3\x6c\x40\x5b\x3e\xda\x69\xc6\x6a\x76\x8b\x21\x31\x07\xac\xf2\xd9\x59\x92\xa3\xf3\x92\x72\x46\xe2\x98\x68\x35\xa4\xc2\x40\xd1\x90\x73\xbe\x20\x46\x12\x62\xbc\x45\xd7\x7b\x66\xe3\x98\xb9\xef\xc9\x08\xa2\x49\x6c\x28\xa2\xcb\xaa\x62\x79\x84\x7f\xbb\x34\x65\xc6\xf8\x68\xbe\xca\x4f\x1a\x9c\xf7\x32\xa0\x27\x67\x44\xa4\x96\xc6\xee\xfe\xd3\x11\x6a\x63\x94\xb6\xcb\xdf\x8d\x6f\x2b\x03\x89\x0f\xb8\xaf\xe0\xe5\x94\x8b\xea\xda\x71\x42\xd5\x03\x59\x67\x46\x24\x49\x51\xdb\x61\xa0\x6f\xb7\x1c\x4c\x17\x99\x68\x44\xb9\x63\x16\xcc\x2a\xd8\x5d\x16\x35\x9d\xa0\x23\x18\x91\x2a\x21\xac\x0b\x4a\x4e\x51\x23\x8c\x48\x0d\x08\x8e\x41\x1e\x94\xcd\xd3\xfa\x47\x6f\xd3\x13\xc5\x94\xaf\x63\xdb\x65\x79\x4f\xf9\x7a\xea\x59\x17\x43\xaf\xb9\x36\x7e\x71\x1d\x08\x04\x89\x0a\x7d\x68\xfd\xe9\x66\x00\xcd\x65\x44\xa7\x9a\x25\xc8\xe6\xa9\x2d\x3c\xb5\xdd\xaf\xc6\x4f\xa5\x45\xea\x50\xd0\x5d\x71\x1d\xe2\x63\xfd\x25\x0c\x25\x5e\xbf\x41\x89\x63\xd1\x57\xb9\xfa\x76\x19\xe0\x76\x9e\xd5\x4b\xcb\xa1\x98\x95\x85\x93\x85\x5e\x34\x5e\x49\x66\x7c\x6c\x76\xbf\x14\xc6\x07\xc5\xf7\xab\xdd\xed\xde\x54\xe5\xc1\xe2\xde\xa7\x7c\x41\x8c\x18\x1d\x61\x64\x72\x7f\x28\x75\x66\x3e\x37\xd9\x07\xe4\xcb\x32\xf7\x12\x61\xf3\xc1\x21\x1a\x84\x21\x92\x62\x60\x96\x62\xf5\x61\xa5\x61\xc6\x98\x20\x46\x83\xd4\xa2\x83\xeb\x46\x14\x5a\x54\xfe\x9c\xa3\x21\x0d\x10\xfb\x89\x94\x3e\x2e\x73\x35\xb2\x21\x68\x98\x86\x1d\x9f\x2a\xe5\xfe\x77\x44\x13\x94\xb4\x46\xb1\x71\x93\x15\x7d\x18\xe6\x72\x30\x89\x52\x65\x2c\xb9\x08\x28\xf1\x09\xda\xe9\x0a\x2c\xc5\x84\xa0\x95\x51\x16\x86\x88\x12\xa9\x4f\xb2\x23\x01\xeb\x2b\x45\x7c\xa7\x98\x69\x3e\x4b\xce\xf2\x8f\xc9\xd5\x92\x40\x29\xc7\x5a\xb6\x97\xf9\x09\xf6\x87\xac\x10\x03\x9e\x52\x46\x59\xaa\x71\xcd\xac\x1f\x7e\xac\xb6\xbb\xc7\x27\x1f\x28\xa2\x3c\x0a\xb1\x1a\x35\xab\x6f\x30\x4e\xdc\x47\xb4\x29\x8f\x2c\xfd\x5e\xeb\x66\x9c\x1a\xb8\xff\x5c\xbd\xbc\x4c\x36\x0a\xca\x99\x4d\x21\xa2\x29\x6c\x71\x24\x33\xa4\x45\x8c\xc6\x81\xc6\x82\xba\xac\x81\x03\x62\x41\xdc\xdf\x13\x27\xd1\x5e\xc0\x87\xe5\xed\xec\x51\x1d\x8c\x26\x82\xa1\x2b\x63\x8f\xc4\xab\x53\x55\x9c\x6c\x8c\x6e\x7c\xed\x54\x6b\x74\x12\x7e\x64\x8d\x38\x74\xfb\x00\x15\x91\xd6\xca\xeb\xd2\xb4\xde\x03\x22\x06\xe7\x47\x50\x92\x84\x0e\xad\xa1\xab\x53\x96\x6b\xbf\xdf\x4e\xdf\x59\x29\xcb\x61\x70\xf0\xea\x44\x35\xea\x1a\x20\xb9\x95\x3f\xf0\x10\x93\xd8\x3e\xd4\xe3\x66\x7b\xc6\xee\xc6\xa8\xa6\xa1\xee\x49\xbb\x5a\xef\xa2\x68\x4a\xa4\x8c\x3d\x4d\xc1\x5e\xff\x18\x9a\x1a\x54\x8b\xc4\x52\xe7\x6b\xfd\x53\xd4\x0d\xe0\x58\x8e\xe6\xa0\x96\x06\x93\xf4\x97\x52\xff\xbe\x9b\x0e\xb1\x9a\xea\x26\x17\x2f\xdd\x53\x69\x5b\x25\x68\x95\x7c\xce\x4a\x33\xfd\x3e\x36\x1e\x0d\x20\x29\xa2\x89\xaf\x76\xf7\x77\xfe\x42\x10\xbb\xbc\xa7\x31\x88\x6d\xeb\x23\x66\xf3\x4f\xc3\x02\x25\xf1\xbc\xa9\x44\xf1\xeb\x42\x97\x30\xb5\xe0\x83\x06\xea\xe6\x98\xe9\x17\xe8\x7c\x4c\x16\xa6\x80\x94\x83\x3f\x45\x81\x99\xcf\xe1\x29\xcd\xa2\x80\x23\xae\xf0\xed\x02\xf8\xd1\x77\x0b\xa5\xa5\x0d\x29\x45\x31\xf1\x61\x5b\x43\x1f\xfd\xb8\xd5\xd6\x93\x68\x32\x16\xc9\x08\x43\x4c\xcd\x6b\x05\x42\x4f\xfc\x56\x16\xe9\xd4\x8a\x9d\x5b\xd6\x7d\x4b\xbe\xef\x76\xac\x75\x71\x3c\xfd\xb6\xe6\x61\x16\xc8\xc2\x18\x89\x41\xc3\x28\xce\x3c\x43\x7f\x30\x19\x38\x92\xd2\xa0\xd3\x0f\xb2\x70\x8c\x75\x61\xac\x66\xc6\xc8\x8e\x65\x94\x59\xc4\x30\x16\x56\x9d\xe5\x50\x19\xa3\x90\xe0\x3e\x53\x1a\x94\xd3\xcc\x6f\xbb\x5a\xcc\xb6\x2d\x45\xa0\x98\x35\x13\x97\x8f\xf7\x9b\xc5\xc3\x7f\xf6\x8f\x3f\x1f\x56\x3e\x2a\xc7\x58\x44\xc0\x8a\xe0\x89\xa6\x3f\x21\xba\x46\x4b\xcd\xf5\x5e\x36\xd7\x62\x72\xbc\x31\xc6\x2d\x6a\xe8\x07\xbc\x88\xba\xfb\x85\x4c\x42\x3b\x67\x1a\xf0\xf1\x26\xc6\xa3\xd8\xeb\x7a\x22\x2a\xd9\x72\x6f\xdd\x94\x15\x02\x95\x27\x97\x4d\xa2\x04\x13\x88\xcb\xd5\xc3\xce\x9b\xb1\x2c\xa5\x61\x3c\xd4\x95\x92\x42\xfd\x3a\x1d\xfb\x56\x9e\xa8\x9e\x53\x22\xff\xb4\x71\x42\x47\xf1\x35\x1e\xae\x94\x73\x64\x50\xbf\x2d\xf3\xb2\xd7\x1d\xf1\x8d\x31\x60\x0c\xdc\xf2\xff\x1e\xa1\x6a\xe6\x14\xb6\x3b\x88\xf0\x10\x29\xcc\x98\x90\x29\x1a\x1a\x47\xb0\xcf\xb8\x2e\x2c\x0f\xf9\x3f\x4f\xd5\xf9\x21\x31\x35\x71\x98\x8c\x88\x72\x70\x78\x3c\x4a\xef\x40\xbc\xf9\x3d\x97\x49\x92\x62\x7a\x77\x03\x4d\x0f\x4b\x6f\xc7\xda\x78\x97\x1f\x81\x39\x7a\x86\xd4\x8c\x31\xa9\x35\x4e\x90\x87\x9b\x9d\xb3\x05\xaf\x7a\x23\x84\x49\x30\x0e\xce\xf4\xfc\xf4\xb0\xb8\x5f\x3d\xec\xf6\x7d\x50\xa0\xfd\x06\xbe\xa3\x4a\x0d\xb7\x12\x87\x6f\x90\xb7\x63\xe3\x9c\x58\xdf\x0e\xca\x04\xae\x2e\xcf\x03\xb6\x9e\x66\x48\x2f\x5c\x6f\x43\x43\x0c\x18\x7b\x04\xdb\xa4\xea\xe3\x37\xff\xda\x8b\xf0\x20\x4e\x88\xcb\xcd\xdc\x89\xda\x55\xda\xfd\xe1\x1b\x85\x60\xde\xee\xeb\xe4\xb3\xeb\xf3\x5c\xa0\xff\x02\x3c\xd0\x34\x64\x03\x79\xfe\x49\xec\x8d\x87\x01\xe7\x1e\x25\xf7\x70\x3a\x58\x13\xa2\xee\x5a\x69\x84\xf0\x97\xd6\x65\x71\xa5\x11\x5f\x27\xf7\x78\x08\x91\x49\x3b\x3e\xf6\xc1\x76\x3c\x55\x5b\x62\x3c\x0a\xc0\x1b\x1d\xeb\xf6\xac\x2e\xff\x66\x72\xc3\xff\x5c\x4b\x2c\x73\x7b\x57\x5e\xb1\x92\x71\x12\x86\xda\x6d\x40\xf7\x45\x73\xbc\xcf\x5e\x06\x4e\x74\x7f\x67\x12\xd9\xf4\xa2\x93\x6c\xd3\xab\xe6\xb5\xbb\x02\x8d\xd0\x03\xc4\xf2\xa2\xab\x2c\x17\x0d\x0c\x55\xb6\x47\xf6\x1c\xa7\x52\x26\x9e\x92\xbd\xd4\xb0\xd6\x1f\xa3\x03\x92\x53\x6d\x99\xb7\x6b\x68\x9e\xab\xbc\x9e\x29\xd7\x61\x9c\x82\x88\x9d\xc2\xd5\x5e\x8a\xe2\xd7\x5e\x8b\x46\x8c\x97\x37\x67\x44\x20\xe6\x14\x49\xc2\xc1\x95\x90\x4e\xde\x89\x25\x6c\xb4\x5f\xcf\x80\x22\xba\x9e\x29\xe2\x77\x36\xa7\xe3\xf0\xf8\xe2\x3c\x24\x96\xb6\xb3\x54\xbf\xae\x9c\x66\xac\x6f\x22\x09\x96\x1d\x1d\xb2\x91\x46\x59\x57\x3f\xcf\x38\x57\x21\x16\x93\xec\x8b\xb2\x3a\xe0\x4e\x71\x0d\x2a\x3b\x88\x7c\x1e\x80\xc6\x78\x1c\x19\xab\xde\x29\x2a\x29\x5e\xc0\x39\x03\xfe\x72\xb1\x88\x11\xac\xd0\xee\x63\x3e\x85\x60\x53\x3c\x33\x53\x7d\x3e\x42\xc3\x93\x20\xe0\x66\x80\x05\xff\xad\xa4\xbb\xff\x5d\x68\x10\xec\xde\xe9\x3d\xfe\x2e\x60\xe5\x7f\xc7\x02\x04\xf2\xbb\xe0\x29\xac\x97\x8f\x45\xf9\xee\xdf\x28\x49\x13\x87\x4c\xf7\xe9\x78\x1a\xf4\x6d\x22\xe9\xf3\x38\xcb\xa7\xd5\x62\xb7\xba\xde\xdf\x77\xb9\x69\x9e\x86\x12\x0f\xd6\xbd\xcc\xf4\xf5\xaf\xfc\xc2\x90\xa6\x3c\xe2\x36\xc0\x5e\xec\x76\xbb\x65\x9f\x7a\xe4\xa9\x88\xcc\xd0\x71\x0f\x27\x53\x42\xb0\x30\xe6\x1e\xc0\x53\x37\x4f\xa0\xa0\xf0\xca\x64\x98\x9f\xf0\x17\x92\x89\x0d\x6c\xef\x56\x8b\xfb\xfd\xd5\xe3\xc3\xf3\x74\x47\xe5\x8a\x73\xcc\x5b\x20\x71\xee\x1a\x51\xd8\xe3\x45\xa1\x63\x81\x3c\x10\x1b\xa1\x60\xe0\x4c\x73\x08\xac\x22\xe7\xcf\xb2\xca\xf5\xf2\x74\xfc\xb2\xf8\x94\x71\x70\xf9\x11\x74\xd5\x86\x25\x0d\x8c\x43\x42\x2d\x35\xa6\x73\x51\xff\x3c\x65\x55\x05\xf9\x00\x43\xc5\x38\x48\xab\x71\xbe\xfd\xb6\x1a\x2e\x82\x38\x0c\x2c\x87\x4d\xaf\x69\xeb\xbd\x8c\xd1\x58\xc7\x21\x4f\xd1\x53\x76\xa0\xcc\x63\x9e\x35\x7f\x8f\x98\x85\xc5\xa1\x16\x68\xfb\x38\xd8\xc2\xa2\xae\x51\x1b\xc2\x3f\x41\x14\xc4\xdc\x6d\x1a\xd7\x95\x78\x9f\x9a\x46\x71\xe4\xd8\xeb\xeb\x93\xac\x85\xb9\x70\x14\xc5\x51\x1c\x2a\x6d\xc3\x6e\x96\xb1\xac\x0f\x94\xc4\x51\x6c\x98\x93\x8d\xc9\x8a\x3b\xd0\x1d\xd9\x35\x42\x38\x31\x79\xdd\x94\x2f\x2f\x39\xac\x8b\x4d\x2e\x3e\xff\x59\x0e\x88\x1d\x59\x4c\x12\x8e\x9e\xe7\xa6\x12\x85\x86\x0f\x4b\x5a\x32\x1a\x43\x92\x48\xa5\xfd\x18\x5a\x41\x05\x8c\xd5\x0c\xa7\x41\x4c\x89\xaf\x36\x76\xec\x46\x0f\xe5\x99\x2f\x17\x53\xc5\xd1\x75\xf8\x3e\x41\xc8\xb1\x98\x85\x0c\x89\xf4\x4e\x85\xc9\x3e\xfa\xa3\x70\x5d\xfc\x84\xac\xeb\xa3\x92\x30\xe8\xe8\xb7\x07\xa5\x7d\x8b\x42\x6f\xdd\x22\xdd\x7e\x41\x09\x35\x19\x52\x9e\x24\x96\xb1\xbb\x3c\x1c\x4e\x45\xd6\x7c\x3a\x3a\x70\xfa\x1f\x10\x5d\x2e\x27\xe6\x26\x8e\xa2\x51\xde\x6e\x97\x41\x35\xd8\x4c\xe3\x38\x4d\xb1\x62\xe1\x28\xea\xba\x7c\x83\xca\xb3\xc0\xfb\x66\x61\x09\x91\x8f\xa8\xd9\x3f\x9a\xd9\x71\x62\x34\x5a\x8c\xe2\x78\xcc\x3f\x6f\x9c\xd0\xca\xa0\x31\x61\x03\xd1\xa5\xe0\xac\x5c\x9a\xc5\x22\x54\x68\x36\x19\x7a\x61\xde\x08\x15\x21\x1f\x04\xae\x42\x6f\xeb\xc6\x42\xb3\x80\x78\xa8\xc5\x53\x39\x8d\xa6\xc5\x42\x73\x10\x3d\x23\xe3\x0c\x42\x95\xc5\x02\x62\x44\xfb\xcb\xd6\xe1\x5d\xeb\xe8\x6c\x57\x9d\x7e\x85\xe1\x73\x4b\x48\x98\xf6\xf0\xd6\x45\x6b\x81\x7a\x8e\x1a\xff\x88\x3a\xa6\xb8\x2c\x64\x2e\xba\x3c\x46\xac\x63\x0b\x55\x7d\x82\x76\xee\xa9\x06\x34\x52\x2d\xd7\x33\xf6\xef\xf9\x50\x68\x69\xeb\x16\xeb\xec\xa5\xb8\x2b\xc5\x04\x01\x14\x43\x44\x78\xc7\x18\xd3\x25\x1a\xfd\x9d\x81\x13\x4c\xa7\x43\xeb\x6f\x0f\x38\x03\x59\x0c\x10\x7b\xc2\x1f\xd4\xe9\x58\x77\x2d\x46\x45\x88\x96\xc8\x95\xfa\xd8\x81\x70\x6a\xe6\x6e\x96\xb9\x4e\x49\x40\x15\xe9\x8a\xd7\xea\xf2\x00\xbd\x9e\x22\x4b\xc2\x90\x22\xc4\xc8\xe6\x1b\xc6\x10\x8f\x24\x8c\x78\x12\x8f\x40\x38\x78\x03\x24\x37\xf9\xda\xb1\x4b\x42\x12\x24\xcc\xe3\x85\x7c\xf8\xa5\x9e\x17\x5d\x66\x49\x98\x68\x44\x0f\x22\xe8\xd6\x2b\x58\x6c\xda\xdd\x02\xba\x67\x01\x85\x84\x36\x37\xeb\xa7\xed\x6e\xff\xe3\xf1\xee\xf9\x7e\xb5\x5f\xfd\x7b\xf7\xb4\xb0\xa7\x4a\xd7\xcf\x84\xe0\x22\xbf\x9b\x4c\x95\xc7\xda\xc9\x81\x4f\x77\xc5\x24\x22\x12\x91\x3c\x78\xec\xa0\xee\x9c\x9b\xfd\xb3\x46\x76\x12\xe9\x28\xb5\x86\xed\xe7\x38\x4a\x9f\x44\x06\xd0\x53\xdb\x9c\x0a\x9d\x0d\xeb\x05\x58\x42\x48\x8a\x80\xf3\x8e\x9e\xfd\xdb\x49\x54\x3a\x13\xc5\x1c\x78\xff\xeb\xcd\x24\x21\x3c\x46\x63\xe1\xfa\xdb\xd5\xdd\x7f\xfc\x0d\x28\xb1\x25\xd0\xcb\xac\xc9\xfe\x9a\xa0\xc0\x59\x42\xa5\xc1\x03\x72\x5b\x9a\x46\x79\x89\x27\x96\xb0\x24\xf5\xc1\xf1\x45\x56\xe9\xaa\x3c\xab\x63\xf8\xcd\xa3\xb0\x34\x40\x28\xaa\xd3\xa0\x7d\x15\x07\x68\xfe\xfa\x3a\x1f\x99\x70\x1e\x70\xe7\x17\x59\x5c\x8f\x35\x49\xc7\x50\x4b\xdf\x37\xb1\x89\x85\x45\x17\x71\x96\xd3\x0d\x24\xe1\x8a\x6b\x07\xab\x3c\x8f\x61\x25\x5c\x1b\x54\xe5\x43\x70\x92\x03\x91\xbc\x66\xe7\x16\x82\x73\x60\x07\x1b\x47\x12\xc7\x12\xc3\x5f\x07\x91\x15\xcd\x90\xa1\x98\x25\x71\xa2\xa9\xc5\x7e\x7e\x6c\x87\xe9\xe9\x24\x56\x0c\x83\x30\xfd\x77\x06\xa7\xe6\x35\x76\x92\xcf\x87\x25\x65\xa1\x1e\xf0\xc4\xed\x2b\xf8\x5f\x50\xcd\xde\xa6\x6d\x2e\x29\xd9\xb3\x24\x55\x52\xba\x50\xdb\x26\x9b\xc6\x0e\x12\x11\x0a\xc7\x9e\xde\x9c\x2e\x7f\xdb\x2f\x61\x7f\x17\x56\x81\x60\x04\xa1\x22\x98\x47\xdb\xe0\x79\xd3\x4e\xe5\x68\x7f\x53\x95\x07\x3f\x1a\x42\x1b\xc4\x91\x2e\x2d\x63\x91\x73\x90\xeb\x61\x4d\x30\x4b\x24\xb5\xa8\xca\x53\x8d\x05\xfe\x1d\x63\x01\x4b\xa4\x0c\x94\x2d\xd1\x12\xb9\xb3\xa8\x86\x2e\x66\xa2\x22\x16\xda\xd8\x29\x42\x50\x7d\xea\x25\xd1\xc4\xf2\x9b\xb7\x57\xac\x97\xa2\xe8\x52\xd4\xbd\x21\x93\x40\x44\x10\x00\x6a\xba\x14\x13\xae\xd7\x5b\x8b\x6f\xf2\x9d\xb4\xe5\xb3\x5d\x6f\xaf\x2c\x52\xb2\x1e\x58\x9d\x89\x51\x11\x26\x31\xef\xb2\xc3\xf8\x38\x4d\x0c\x58\xf9\x7e\x97\x45\x75\x7f\x4e\x03\x21\x94\xe3\x77\xba\x3a\x75\x7f\x8d\x88\x40\x3c\xef\x40\xac\xf6\xeb\x2d\x35\x25\xc4\xe0\x0a\xb2\x41\x85\x9b\x5c\xbc\x20\xaa\xee\x8c\x57\x8c\xa5\x24\x91\xc2\x78\x3a\x61\xc7\xb2\x6d\xd9\x14\xfc\xdd\x09\xd8\x72\x75\x59\x65\x7f\x0e\xd2\x99\x29\x95\x02\x8f\x1a\x4b\x52\xd2\x2b\x51\x8d\x17\x5f\x4a\x8d\x05\x8f\xbc\x95\x56\x38\x77\xd2\xcc\x4c\x68\xdf\xd8\xf2\x73\x20\x65\xc8\xfc\x3b\x71\x22\x84\x8d\xf0\xff\xb3\xee\xc2\x1f\xbe\x8d\x69\x14\xac\x79\x47\x3a\xcf\x29\x42\x34\xe5\xb1\x40\xa6\xa5\xd7\x32\x1f\x43\xe1\x52\xae\xc3\x40\xf8\x9d\xbd\x2f\x2c\x1a\x2c\xf2\x34\x16\x14\x61\x58\xcf\x35\x54\xd7\xa2\x11\x52\xd4\xd3\x41\x8c\x75\x90\xda\xa4\x4d\x05\xe2\xe0\x6a\x41\x84\x42\x5d\xcd\x61\xfa\x22\x8d\x4d\x8a\xc9\x71\x4f\x37\x2e\xf2\xab\xd6\xb4\x1f\x5d\x2c\x89\x08\xf2\x4c\x2c\xcb\xe2\xa5\x0b\x57\x9f\x73\xa0\xfa\xde\x60\x53\x51\xd6\x0c\xed\x6a\x1d\x5c\x6b\x1a\x8a\x80\x39\x6d\x84\x76\x62\x76\x1f\x55\x40\x12\xa9\x01\x46\x77\x3e\x9a\x9c\x6a\x11\x21\x48\xeb\xfe\xea\xfa\x2b\x04\xe2\x10\x02\x94\x6a\xc9\xd1\x4c\x38\x56\x60\x2b\x7c\xda\x49\xb1\xd0\xff\x7b\xaa\x7b\x48\x51\xaa\x8d\x46\xf9\x22\x33\x2d\xde\x66\x29\x04\x49\x4a\x5d\x26\xce\xca\x48\x5c\x98\x10\x40\x12\xe4\x13\x95\x9e\xa1\xec\x32\x89\x2e\x4b\x21\x66\xd4\x65\x51\x9c\xe5\x72\x16\x33\x4a\x41\x27\x88\x26\x18\x84\xb3\xae\x7b\x4c\x5c\x6a\x18\xd8\x83\x02\xed\x9f\x9f\xaf\x00\xf9\x15\x34\xc3\x02\xe7\xf9\x8d\x3b\x35\x69\x8a\x01\x43\x27\x1c\x00\x1f\xcd\x00\x81\xe1\xfb\x08\x83\x08\x8b\x6f\xd5\x24\xf0\x2f\x02\x10\xbc\x67\xc4\x45\xd6\xaa\x79\xf3\x5a\x84\x2a\x45\x17\xbd\x80\x0f\xe4\xde\xd9\x40\x75\x9f\xe5\x79\x7f\x17\x11\x1a\xab\x01\x83\x04\x86\xef\xe7\xb5\x9a\x4c\x44\x24\x48\x88\x8f\x8d\x3c\x7a\xc7\x5b\x44\x44\x60\x1d\xd9\xe1\x13\xf3\x9c\xeb\xba\x6b\xd0\x56\xd5\xff\xba\x6c\x37\x8f\x33\x66\x2a\x26\x48\xa0\xf0\xe5\xb3\x02\x33\x84\x27\x91\xdf\x8b\x8f\x4e\x44\x92\x09\x42\x22\x4c\xbc\x42\xa1\xd7\xcb\xc7\xf1\x17\x11\x34\xe1\x88\x36\xca\xea\xfa\x04\x4f\x50\x97\xf9\x1b\xe8\x59\x43\x40\x30\x4a\x12\xf0\x64\xf8\xc2\xd9\x2a\xb3\x13\x47\x70\x1a\x0b\xe1\x66\xd8\xce\xf1\x07\x6e\x5b\x5b\xfa\x8c\xbb\xf3\xef\x46\x57\xe7\xb7\x61\x11\xa7\xb1\xd7\x84\x9d\x8b\xac\x8b\xd8\x18\x90\x56\x33\xaa\xd9\x88\x22\x53\x7e\x50\x12\x10\x81\xa7\xe7\x74\xac\x24\xbb\xd7\xac\xee\xeb\x9b\x99\x48\x83\x4e\xb0\xda\x4a\x3a\xdb\xc8\xeb\x68\x4c\xd2\x10\x4c\xec\x0b\x0c\x45\xe6\x2d\x1f\xfb\xdd\xc7\x3d\x19\xb7\x7e\xff\x7b\x5f\xa9\x7a\x09\x39\x2f\xd2\x84\x31\x9b\xcf\xb4\x8e\x4f\x56\x16\x4f\x98\xda\xd4\xdd\xc3\x41\x84\xd0\x2d\x25\x8a\x67\x57\x78\x70\x38\x8a\xe2\x73\x83\x8a\x62\x50\xa8\xde\x4b\x1a\x8f\x88\x08\xa2\xc0\x97\xcc\xe0\x8b\xfb\x2b\x8a\xd0\x92\x07\x57\x80\x19\xf0\xe7\x42\x0d\xc9\x5a\x98\x10\xd2\xaa\xbb\xb8\xb0\xcc\x5a\x95\x03\x38\xab\x90\x21\x57\xb6\x3a\xfa\x5d\x54\xb3\xf0\x4b\x21\xa9\xe2\x5e\x64\xdf\x51\x00\x95\x85\xf3\x9e\x07\x55\x81\x4c\x48\x9e\xa2\x8e\x26\xaa\x98\x6c\x72\xa1\x60\x53\x36\x5d\x63\xc2\x51\x05\xcc\xd2\x52\x7a\x93\xd9\x35\xaa\x40\x62\xf2\xfa\x4a\xd4\xbf\xa0\xb1\xd4\xa6\x67\x88\xad\xc9\x58\x2b\x9a\x84\x7a\xb6\x58\xea\x4b\x1b\x5a\x28\x4e\x70\x3c\xf6\x36\xcd\xd1\x3d\x42\xbb\x3d\xdb\x40\xae\x65\x60\xf6\x0d\x3a\xb5\xd4\x91\x5d\x8a\x4f\xbd\xe2\x8c\x1a\xa8\x6d\xf9\xb0\xbf\xd0\x42\x63\x9e\xe0\x4a\x1f\xfb\x3a\x45\xa7\xbb\x67\xc1\x15\xae\x23\xa8\xc4\x87\xb0\x3b\xce\x8a\xd9\xbc\xba\x30\x24\x46\x4c\xe0\x9c\x89\x73\x31\xff\x20\x0c\x0d\x08\x1b\x4a\xff\xd4\x37\x65\x35\xf3\x53\xdf\x9d\x47\x08\x3c\x5b\x2d\xd6\x7b\xec\xfe\x3b\x6d\xc8\xf6\x27\x3c\x0a\x3d\x35\xab\x12\xc7\xae\x8a\xe9\xd4\xd3\x55\xb4\xbd\x34\xa0\x8a\x48\x56\xd5\x16\x77\xbd\xea\xce\x60\x61\x8c\xc2\x2c\x10\x4e\xd8\xdb\x29\x8b\x0a\x93\x41\x68\x30\xad\xb0\xab\x4e\x3d\xbb\xdf\x6f\xd2\xa8\xf3\x1f\x5d\x06\x26\x46\xa4\x03\xfa\xc6\x45\x5f\x05\x24\xc3\x88\x51\x57\x06\xbc\x5b\xed\x1f\x1e\x77\x96\x6b\xa1\xcb\x69\x4a\x42\x34\xda\x41\xf7\x99\xaa\xca\x6b\xf8\xe8\xfe\x2e\x01\xd3\xc3\x8f\x6f\x50\x2d\xf2\x7c\x03\xd5\x16\xbc\xcc\x26\x93\x34\x14\x6e\x23\x6d\xf6\x99\x2a\x8b\xec\x4f\x1b\x9c\xd9\x8b\xc3\xc5\x82\x68\x26\x29\x8b\xb1\xb4\xc6\x2d\xd5\xef\xbd\xd7\x24\x69\x1a\x60\x48\xa5\x6a\x6d\xee\xbb\x52\xfd\x1a\x99\x4f\x92\x1a\x82\x3e\xf2\xcf\x9b\xe5\x4c\x90\x65\x12\x6a\x97\x8c\x40\xd8\x25\x8c\xdb\xbf\xff\xd1\x35\x18\xbc\x8c\xf5\xf8\xca\xa2\x6e\xa0\x5a\x34\x8d\x70\xce\x51\x87\x6d\x1a\x58\x35\x92\x71\x85\xf0\xdf\x57\x2f\x78\x82\xe6\xea\x55\xa6\xbb\x8b\xc6\x02\x93\xf7\x5d\x85\x26\xc0\x35\x14\x9e\x4a\x84\x49\x26\x4c\x88\x26\x79\x5e\xd6\x60\x11\xed\xdf\x3a\xc5\x85\x6e\x32\x30\x69\x30\x8e\xd5\x7a\x78\x99\xee\x6b\x57\xc7\x6f\xc6\xc3\x08\xeb\xe1\x00\xa7\xe4\xad\x95\x8a\xa9\x9b\xac\x18\x9a\x14\x32\x61\x02\xf7\x74\x0c\x04\x0d\x4d\x0a\x99\x52\x8a\xe7\xce\xd3\xe3\xdd\x6a\x7f\xbf\x78\x58\x7c\xeb\x60\xcc\x32\xe5\x14\x0d\x25\x4f\xca\x31\x28\xf6\x90\x42\x5a\x50\xa6\x93\x87\xc1\xd2\x87\x5d\x79\x65\xdf\x60\x68\x34\x4b\xa1\x81\x77\x94\xa3\x16\xb0\x3b\x7e\x05\x01\x1c\x37\x22\xf8\xf3\x24\xf2\x3f\x46\x96\xed\x68\x05\x4a\x19\x44\x88\x72\x5d\x2f\x1f\xdd\x95\x26\x65\x37\x52\x32\x81\x84\x34\xb6\xb8\xbb\x19\x94\x2f\x8e\x0f\x17\x29\x95\x0d\xd8\x65\xf5\xa2\x92\xd9\xb4\xd2\x98\x49\x4d\x13\xe4\xd9\x44\x10\xd0\x5d\xd9\x5c\x8a\x41\x49\x4d\x53\xac\x1c\xe8\xbe\x35\xd2\x19\x5e\x98\xee\x3a\xb1\xd4\xf9\xfb\xac\xde\x55\x27\x98\x5e\x0a\x14\x96\x27\x6c\xa1\xf9\x26\x6a\x5b\x1f\x36\xfe\x3d\x90\x30\x25\xfe\xa9\x90\x6b\xb5\x9b\x73\x20\x62\xa4\x57\x6a\xdd\x58\x0f\xce\xdc\x58\x47\x6a\x90\x1c\xad\xbb\xee\x40\x71\x9b\x42\x66\x6d\xbb\xd1\x97\x03\x77\x55\x1a\xae\xf9\xf8\x4e\xd5\xc8\x11\x97\x26\xa6\x21\xf1\x73\xf8\xeb\x83\x4b\x9a\x18\x88\x1e\xd4\x30\x5e\xaf\x1f\x2e\x78\x76\x2a\x64\x96\xfa\x21\xab\x37\xb9\x68\x4c\x59\x1d\xe6\xa4\x75\x99\x8a\xc2\xd8\xd6\xee\x8a\x1a\xa1\x81\xd3\xa3\x59\x45\x84\x98\xe1\x77\x59\xd8\x4d\xe4\xef\x85\xe0\x55\xc4\xb8\xf2\x66\xe1\xa6\x82\xa3\xc8\x9c\xb2\xc8\x3b\x0c\x80\xfc\xb3\xc1\x5d\x77\x05\x62\x22\x9f\xd0\x77\x54\xd3\xd5\x34\x1a\x3c\xa9\x4e\x52\xd4\x49\x1d\xbb\xfa\xe0\xeb\x9e\x6b\xc6\x1a\x4e\x7a\x5a\xfb\x39\xda\x2f\x14\x8d\xb9\x49\xfb\x29\xab\x7e\xc1\x48\x7b\x96\x29\xaa\xc0\x62\xba\x11\x64\xba\x2c\x5d\xca\xa4\xac\x6c\x99\x9d\x3f\x51\xcf\x35\x75\x98\x62\x31\xc1\xd9\xd5\x1e\x24\x53\x50\x9f\x6a\xf7\x16\x62\x21\x82\x5e\x3f\xe2\x54\x74\xf4\x7b\x4c\xf1\x80\xa0\x05\xfb\x9f\xd3\x19\x94\x49\x71\x25\x82\x64\x64\x7f\x8f\xa7\xbc\xe2\xca\x9e\x46\xdf\xf2\x52\xc2\xc7\x56\x65\x1d\x0f\x69\xdb\x66\x65\x27\x6c\x68\xc3\x06\x99\xcb\xea\x8c\xf5\x8e\xa9\x98\xd9\xd5\xfc\x02\xcd\xf7\x4f\xe5\xbe\xc7\x64\x27\x55\x09\xd7\x36\x15\x8c\x89\xaa\x33\xca\xef\xf9\xf9\x9a\xc4\x3a\x0a\xbc\xce\xe7\x21\x2b\x5c\x4c\x6a\x70\x5c\xa8\x24\x35\x38\x3c\x98\x09\xba\xb7\x51\x95\xcf\xb5\x1e\x0f\xba\x1f\xe8\x44\xc7\x88\xb2\x42\x41\xab\xfb\x21\x41\xf9\xfc\xfd\xd3\xc0\xa2\xee\x3a\x48\xbd\x4a\x43\xc3\x84\x83\xf3\xfc\x16\xe8\x30\x3f\xfb\xd3\x38\x12\xce\x41\x6e\x6d\x35\xcc\x29\x7d\x69\x6d\xa8\x34\x11\x18\x1b\xfe\x56\x01\x34\x50\x5d\x0d\x0f\x00\x95\x6a\x86\x4b\xd1\x42\x35\x36\xa2\x9a\xf8\x3e\x4a\x70\xa5\x7b\xa0\xd5\x76\x71\xb7\xda\x2f\xee\xee\x1e\x97\x88\xc8\xf7\xef\x25\x94\x12\x08\x57\x11\x96\x62\x23\xf7\x90\x09\xd7\x2e\x03\x8d\x06\xc8\x9f\x27\xa8\x3e\x7f\x8a\x0c\xb1\xe5\xd9\x01\xae\x4e\x03\x84\xb7\x92\x44\x1b\x33\x96\x3b\xae\xca\xc3\xb5\x68\xc4\xe8\x91\x65\x1a\xa2\xa9\x6d\x91\xac\xb3\xcc\xc1\x4c\x49\x63\x3d\x09\x65\x57\x52\x53\x4e\x3b\x28\x1a\xa0\xa1\x70\xb5\x75\x9a\x4e\xfe\x29\x14\x30\xc4\x66\x1e\x6d\x5e\xb0\xdd\x78\x7b\x37\x58\x41\xa0\xb1\xc0\xd0\xb9\x52\x1d\x65\xd1\x64\xcc\x0d\x8f\x89\x0b\xd7\x5a\xbf\x70\x9e\x18\x98\xe9\x20\x50\x18\x45\x7a\x80\xf7\x8d\xc0\x6a\xa2\xd1\xc6\xa1\x03\x66\x10\x19\xd2\x47\x37\x7f\x40\xdd\x80\x1e\xe9\x78\x30\x1d\xa4\x09\xeb\x73\x3e\xd7\xa7\x02\xf1\x8a\x7f\x73\x66\x4d\x1f\x29\x35\xc6\xc6\x6b\x0a\x55\x56\xab\xdd\xed\x70\x53\xd0\x61\x6c\xbc\x82\xd8\xbe\x81\xea\xb0\xf7\xe9\x3e\x28\x34\x16\x87\x76\x1d\xb5\x25\x49\xb0\x44\xe1\xed\xa7\xaa\x6c\x29\xe2\xf8\x05\x23\x1a\x62\x41\xb2\x23\xb3\xc5\xc5\x19\x8c\x16\x94\x8b\xe9\x8f\xff\xe9\x86\x5a\x13\x6e\xd1\x50\x7f\x9e\xca\xea\x74\x18\xf1\x40\x32\x4d\x54\x9c\x0a\x0f\x31\xb5\xec\x50\x83\xd8\xb1\x66\x81\x41\x52\x39\x17\x9a\x5a\xd4\x9e\xa3\xce\xcf\x49\xcd\xc0\x6a\xf6\x6a\x38\xe6\xe5\xa7\x97\x94\x9d\xe3\x6c\x63\x9a\x07\x96\x50\x53\x60\x0d\xf3\xa6\xcc\x33\xe5\x8f\xe4\xb6\x4d\x75\x26\xff\x4e\xfc\x82\x85\x69\xa0\x1a\x67\x71\x34\x8f\x05\x6e\x58\xce\xe2\xee\xcb\x16\x7c\xbb\x11\x68\x91\xbf\xbf\x66\xea\xf5\x5c\x0e\x8d\xe9\x38\x12\x51\xe2\xf9\xe6\x7f\x39\xe6\xa4\x7a\x86\x69\x97\xe9\x98\x44\x7c\x7c\x06\x7f\x7e\xc5\x9e\xa2\xe3\x84\x47\x2e\xfb\xe7\x09\xb0\x86\x7b\x8f\xeb\x95\x44\xd6\x75\x16\xfa\x42\x34\x50\xa7\x84\x61\x90\xbc\x80\xf7\xef\x95\xf0\x29\xfb\x5d\xa6\x7e\x4d\x62\x1d\x3a\x8d\x2d\xad\x8f\x2b\x77\xcb\x0a\x51\xcd\xdb\x79\x3a\xd5\xc4\x92\x1a\xa2\x4e\x1e\xe0\x3c\x14\xfb\x93\x57\x08\x66\x5a\x84\xdc\x66\xb7\x56\xcb\xf1\x6c\x16\x51\x18\x78\x8a\x31\x94\x67\xb9\x3e\x03\x5e\x69\x21\x15\x1b\x72\xba\xf4\xc2\xe9\x9b\x8f\x33\xed\x1f\x2b\xdc\x31\x7a\x0f\x49\xe2\xc0\xe5\xe6\xb6\xa2\xc8\x9a\x4f\x2b\x20\x3d\x53\x1d\xe2\x7f\x90\x48\x35\x90\x36\xb4\x12\x25\xe3\x67\x92\x69\x12\x05\xde\x93\xb5\xb4\x71\xfe\x95\x74\xcc\x59\x80\x65\x6d\x16\x47\xbf\x2b\x4f\xe8\x63\x16\xcd\x15\x14\x80\x48\xda\xea\xf3\x2c\xa8\xaa\xb5\x71\x50\x2c\x14\xaa\x3f\x35\xa2\xb7\x6d\x10\x3e\xd2\x4c\x78\x79\x99\x36\xa1\xf6\x3b\x81\xaf\xe2\x90\x39\x22\xc4\x2f\x94\x26\xfe\x63\xfa\x7b\x13\x5a\xf5\x78\x5b\xd1\x59\x96\x67\x98\xa6\xe9\x0e\xd5\x0d\x91\xe1\x1c\xc5\x3e\x0b\x78\x1f\x50\xf8\xcf\x85\x06\x20\x8c\x43\xd4\x57\x6d\xef\xb1\xaf\x7b\x6e\x4a\x06\x51\x6c\x2d\x7e\x38\x1c\xa1\xea\xb0\x37\x40\x48\xea\xb9\x9e\x9d\x0e\xe8\x37\x28\x5a\xe7\xe9\xec\xe9\x6c\x3d\x61\xf7\x33\x91\xf6\x84\xe8\x9b\x72\xc4\xf8\xc4\x80\x30\x8a\xea\x70\x79\x59\xf6\xf8\x5e\x20\xb1\x0d\xd1\xec\x75\xb9\xab\x84\x86\xf9\xb8\xc8\xbc\x7d\x01\x34\x36\x29\xf7\x45\xde\xea\x17\x5c\x74\x84\x80\xa6\x44\x08\x4f\xdd\xea\x36\x95\x5d\x06\xd5\x50\xda\x6d\x6c\xb1\x02\x73\x3a\x7a\x1d\xb7\x09\x36\xc7\xae\x35\x26\x1c\x8b\x9e\x1a\xa1\xca\xf6\xc3\x0d\x0b\xa6\x20\x96\x09\x38\xde\xb5\xad\x2a\xdb\x31\xe8\x0a\xf5\xc7\x53\x08\x62\x05\xa9\x65\xe3\x2c\x36\x50\xb5\xcb\xf7\xcc\xa4\xb2\x8c\x0f\xbe\x3f\x98\xd8\xbf\x47\x6b\xc7\x2e\xb3\x26\xeb\x6a\x20\x20\x89\x6c\xfe\xd1\x11\x79\xdd\x64\x79\x3e\xbd\xdc\x7f\x59\xbf\xdc\x92\x71\xdc\x74\x5e\xf8\x90\x41\x02\x09\xe2\x37\x1f\x16\xdb\xa7\xe1\xde\x01\x69\x9a\xe0\x39\x79\x73\x52\xbf\x06\xee\x19\x88\x90\x69\x32\x96\x3d\xe9\x57\x7b\xc8\xff\xc7\x77\x8b\x98\x09\x06\x28\xde\x05\xd6\xbe\xb5\xeb\xe6\x49\x5c\xaa\xb5\x05\xa1\x40\xf5\x29\x0a\x0f\xcd\x01\x19\x11\x74\xf8\x9e\xab\xfc\x36\xeb\xac\x02\x90\x34\xc2\x4c\xf4\xea\x03\xd4\x5d\xf9\xf2\xfb\x32\xc6\x39\x2e\x13\x90\x49\xe2\x8a\x84\x71\x55\xe3\x7a\x1b\x4f\x2f\x15\x01\xce\x06\x65\xa3\xc7\x0f\x7d\x44\x0b\x54\xc2\x11\x34\x82\x51\x35\x3c\xf3\x28\xd3\xe2\xb3\xfb\x66\x0a\x02\x74\x21\x54\xf5\x79\x6c\xca\xe5\xab\xc8\x73\x28\x5e\xba\x9f\x6b\x95\x5a\xb9\xb8\x93\x7c\x2f\x4b\x03\xd5\xb3\xd7\x60\x74\x1d\x80\x10\xea\x4e\xbc\xbb\xec\x6d\x98\x18\x06\x10\x56\xc3\xa0\x3c\x42\xe1\x28\xd3\xbf\xaa\x89\x07\xd0\x29\x46\x86\x10\x73\x55\xa3\x1d\xdb\xc7\xb4\xc0\xa4\x89\xe7\x0d\xbf\x06\xd1\xbc\xce\x00\xfc\xc1\x48\x1d\x39\x1a\xda\xfb\x52\x9f\xf2\x89\x82\xd1\xfc\x3e\x68\x02\x6e\x93\xc9\x22\xab\xae\xab\xf2\x38\xf2\x0b\x4d\x60\x42\x4b\x11\xd6\x6e\xf4\x57\xa7\xcf\x21\x6e\xdb\x44\x44\x62\xad\xe9\x41\xfc\x82\x9d\xe7\x28\x1f\xbc\x92\x89\x38\x4f\x6d\x9d\x9d\xdb\x17\x1e\xca\x66\x75\x38\xf6\xf5\xc7\xbe\x9f\xe4\x38\xcc\x05\x7c\x0c\x94\xf2\x98\x89\x34\x60\xb4\x19\x9a\xd7\x27\x07\x93\xf6\x4d\x04\x18\xd2\x7b\x38\x33\xd9\xa3\xaf\x0d\x0d\x23\x32\xa8\xaa\x5e\xbc\x89\x46\xcc\x12\x23\xf5\x03\xc0\xa4\xf0\xac\xe6\x7e\xc1\xfc\x7f\xce\xfe\xa4\xbb\x71\x1c\x4b\x1f\x87\xbf\xcb\x6f\x95\x8b\x5e\x70\x00\x01\xf0\xdd\x49\xb2\xec\x50\xa5\x6d\xa9\x25\x39\xa2\xb2\xfa\xd4\xd1\xc1\x70\x61\xb3\x4d\x91\x2a\x92\xb2\x43\xf9\xe9\xdf\xc3\x0b\x80\x93\xe4\xc8\xec\xff\xa6\xa2\xd2\x80\x38\x80\x18\xee\xf0\xdc\xe7\x19\x4c\x21\x93\x48\x89\xb6\xf4\x9b\xa8\xdf\xe6\xd9\x35\xb3\xd8\x74\x56\x7f\x51\x86\xef\xaf\xa6\x68\xe4\x88\x3c\xef\x96\x95\x8a\x82\xdb\xc6\x9c\x49\x4c\x68\x0b\xf9\x1c\xe3\xdd\xcf\xec\x78\x3e\x0e\x71\xcf\xf7\x65\x65\xd1\x12\xb6\xf2\x71\x7c\x17\x0a\x02\x0b\xc3\x97\xcd\xdb\xba\xe8\xde\x84\xc7\x62\x64\x73\x3d\x89\xe2\xf2\x28\x5a\xe7\xda\xea\x89\xfd\xd6\x45\xd0\xa7\xa1\x74\x77\x01\x19\x32\x0c\xec\x95\xad\xdb\xb4\xc9\x00\xa9\x19\xda\xe1\xbf\xda\xf8\xaf\x7e\x28\xb1\xd4\x4a\x9e\x2f\x57\xd5\x98\x46\x3a\xce\x34\x5c\xa3\x4f\xa5\x6c\xb7\xfb\xfb\x5e\x16\x34\x31\x32\x0d\x31\xf0\xa3\xcb\x42\x34\xed\x21\x0a\xfe\x00\x33\x2a\x0a\xb0\x6e\x51\x89\xe2\xe5\x6a\x14\x54\x1c\x29\x57\x85\x3d\x43\xc5\x80\xe1\xa7\xe1\x5d\x27\x4d\x6c\xd1\xb3\xaf\x86\xfe\xa5\x57\x6d\x54\x32\x8a\xfe\xd5\x4d\xf7\x98\x3a\x0c\x31\xb5\xa8\xca\xb2\xd2\x19\xca\x7b\xec\xa0\x99\xbd\x56\x80\xe7\xaa\x2f\x50\x1b\x5f\x4e\x87\x69\x6c\x01\x9d\xe7\xa2\xf9\xd7\xfe\xf7\xc5\x1b\xf4\xa0\x0a\xa3\x23\x5b\xac\x09\xcd\xdb\xbe\x9c\x43\x6f\xfa\xe9\x5d\x67\x71\x19\x9d\xc6\xc4\x72\x3d\x7a\xc1\xf2\xc4\x68\x91\x68\x4f\x7a\x74\x88\x93\x83\xc5\x63\x3e\x88\xfa\xa5\x16\xaf\x10\x92\x20\xb0\x04\xfe\x7d\x7f\x8e\xfe\x41\xdb\xdf\x4e\x2b\xdf\x62\x62\xad\x5c\xb5\x07\x26\x10\xb3\x3f\xe1\x07\x32\x8f\xb7\x0e\xf4\xda\x18\xaf\x85\xe7\xc7\xd3\x24\x0a\x61\xdc\xe2\xb5\xf7\x0f\x8d\xe1\xb6\x6a\xae\x82\xf6\xf3\xcf\x2a\xab\x6a\x78\xbe\x0e\xe4\xd2\x20\x0a\x6c\x25\xaa\x5d\xbf\xc3\xb2\xf9\x21\xec\xc9\xd5\x06\xd1\x20\x22\x14\x1d\xd4\x76\xc2\x7c\x2d\x89\xd9\x57\xc8\xd3\x20\x52\xb1\x65\x3d\x6f\x57\x9f\x8d\x03\xfb\x16\x88\xd1\xc7\x70\xd4\x48\xb3\x01\xfe\x8b\x06\x71\x20\x30\x18\x7e\xcc\xae\x33\x16\x43\xac\x05\x0d\x62\x1e\x5a\xd5\xad\xa6\x12\x91\x92\xa5\x37\x0f\x9d\xf5\x48\x83\xd8\x08\x57\x45\xfa\xfa\x9a\x03\xa6\x14\xde\x40\x2f\x0b\x53\xda\x18\xd9\x6f\x83\xa7\x25\x31\x55\xba\x63\xf7\xe9\x31\xba\x34\x20\x24\xe5\x62\xe8\x3b\xb8\x20\xec\xaf\xac\x5e\x1a\x10\x1a\x05\x62\x64\xb4\xcd\x9a\xd9\xb5\xcd\x46\x03\x02\x54\x0c\xe9\x63\xfe\xf9\xfc\xfb\xa4\x47\x42\x02\x44\x3e\xad\xee\x1f\xf7\xbb\x4c\x03\x42\xb9\xfd\xd3\xb5\x27\x96\xa5\x5c\x28\x5e\xe7\xe5\xf9\xf5\xad\xd7\xf0\x8d\x7a\x1b\x28\xf9\xf7\xd8\xf6\x19\x04\x18\xdd\x75\xa8\xa4\x23\x01\x56\x97\xbf\xab\xca\xe3\xee\x04\x2a\x13\xf9\x17\x5a\x9d\x93\xcb\x30\x42\x30\xa6\xff\x01\x55\x66\x2e\x13\x04\xcf\x0d\xce\x94\xaf\x2d\x32\x1a\x30\xe0\x38\xf0\x36\x89\xd5\x41\x62\x5c\x6b\x9a\x30\x2c\x37\xfb\x56\x7e\xb6\xef\xbe\xaa\xef\xb2\xba\xf5\x83\x76\x4d\x96\xe7\x5e\x88\x6f\xfc\x70\xa9\xb0\x13\x06\x05\x5b\x9e\xb2\xc2\x71\x9b\x8d\x9d\x0e\x1a\xa4\xd2\x2a\x2f\x15\xf0\x79\x27\xca\xed\x39\x87\xda\x73\xaa\xfe\xed\x50\xcb\x50\xd7\x71\x32\x44\xa9\x34\xc4\xeb\x54\x21\x9e\xa6\x6e\x67\x9b\x0d\x16\xff\x36\x30\x83\x69\x20\xa8\x05\x90\x1c\xb1\xb4\x09\xd7\xe8\xc0\xc2\x0c\xfc\xf3\xca\xc0\x26\xf0\x96\xa8\xc3\xb5\x98\xd4\xc8\xff\x32\x47\x49\x03\x99\x12\x8c\x91\x7f\x58\xe4\x31\x06\x48\x5f\x8a\xec\xe7\x24\x98\x4f\x03\x29\x62\x4f\x10\xb5\x3e\x41\x71\xa5\xfd\x42\x03\x29\x99\x55\x76\xb4\x26\x04\x62\xc7\x5c\x93\x12\xd4\xc2\xe0\x1d\xed\x66\xff\x67\xcc\x3a\xe9\xac\xee\x65\x33\x69\xa0\xb4\x32\x9d\x12\x86\xcd\xcd\x75\x57\xd2\x42\x20\x0f\x9c\x3e\x37\xea\xad\x93\xe1\x58\x54\xc2\x74\x57\x85\xc8\x1a\xec\x98\x4f\x6c\x07\x6d\x56\xe8\x55\x91\x35\x2b\xf3\x0c\x0a\xea\x5a\x5c\x67\xf9\xfd\x2f\xb5\xc4\x92\xef\x93\xa3\xf7\x9f\x92\x08\xd3\xc0\x84\x0a\x19\x0d\xce\x35\x7c\xc1\x06\xe9\x3b\x92\x14\x79\x7b\x37\x62\x58\x2f\x41\xc3\x20\x89\xd0\x79\x59\xa0\x21\xbc\x13\xaf\x62\xd6\x6e\xd6\xdf\xa1\x0a\xff\xcf\x28\x97\x71\x9c\x6c\xfa\x9f\xfd\xe6\x16\x06\x90\x58\x3a\x58\xf4\x3d\x2c\x49\xf6\x20\xd6\x4a\xc3\x48\xd0\x4e\x03\x42\xf4\x14\x13\xab\xda\xb2\x6b\xd4\x13\xb2\x61\x1a\xc6\x86\x09\x5f\xac\xfe\x52\xb7\x13\xa7\x5b\xea\x7f\x63\x69\x87\x24\x4a\xd1\xd7\x10\x79\x73\x55\x79\xe5\xbb\x18\x8d\xd6\xa2\xaf\x70\x88\x88\x7d\xe2\xc8\x61\x7e\x23\xb7\x4a\xc2\x24\xd0\x98\x57\x3e\x89\x4b\x57\x3f\xea\x9b\x42\x63\xe8\x74\x53\xf3\xac\x76\x34\x4c\x62\x65\x0f\xe3\x76\x9e\x8d\x88\x8c\x68\x98\x40\xec\x2a\x73\x72\xcc\x03\xe5\xd9\x07\x54\x93\xf0\x73\xdb\x4b\xe3\xd7\xac\xcf\xd2\xad\xe5\x9b\x58\x30\x1a\x52\xc9\x1c\x5e\xe6\x54\x56\xa3\x90\x01\x0d\xa9\x82\xd8\x49\xcb\x78\x05\x3f\x1a\x52\x13\xa5\x66\xf0\xe8\xcb\xe6\xed\x1e\x60\x56\x68\x4b\x3a\xf0\x57\x11\x14\x77\x15\x46\x64\x3a\x24\x10\x5d\xbc\x21\x5e\xe2\xef\xed\x0d\x21\xa3\x36\x96\xf1\x0a\x0d\x52\xf3\xe6\x93\x3a\x0f\x1a\x32\x61\xe1\xe4\xf3\x72\x67\xd9\x52\x0e\x7b\xa8\xaf\x92\x73\xe7\x29\xa5\x05\x0d\x39\x0b\x02\x6b\x7d\x38\x88\xc5\x44\x3c\x95\x86\x5c\xc5\x38\x00\x28\x6f\x24\x72\x2c\x81\x79\x45\xcf\xe4\x97\x27\x50\x98\xc6\x01\x11\x7e\x7b\xcd\x73\x2c\x0f\xb0\x34\x49\x96\x52\xcd\x5f\x5f\xc4\x60\x03\x1f\xe5\xc0\xa2\x99\xbc\x9e\x60\x06\xab\x0a\x4d\xf6\xd3\x2e\x0b\x4f\x8c\xe7\xdb\x55\x6c\x89\xf5\xdb\x9d\xc6\x32\x09\xa2\xf3\x34\xf4\xed\x68\x28\xb4\x41\x2e\xbc\x97\xa2\x9d\xe6\x46\x14\xf5\x35\xef\x3b\x6d\x0d\x77\x4c\x51\x3d\x25\x8f\xe5\xab\x37\x0b\x69\x28\x53\x01\x7a\xc2\x34\xfd\xe5\xe7\x1b\xb2\x17\xba\xdf\xab\x88\x52\xf7\x0d\x97\x3f\x4f\x59\xb7\xc9\x86\x8a\x2a\x62\x89\xc5\xad\x23\x20\xaa\x63\xd7\x24\x98\xe5\x00\x1d\xa8\x37\x6f\xce\xd5\xa9\xbc\xd6\x76\xfa\xaf\xe1\x2e\xa2\x04\x67\xa2\xcf\x59\x0d\xca\x04\xa2\xe0\x8b\x29\xa6\x34\xc3\x4a\x56\x25\xda\x5d\xd6\x06\x48\x70\x09\xcf\x9a\x6b\xcf\x9b\x86\x3a\x15\x58\xdb\xb8\xac\xaa\x8e\x52\x8f\x86\xad\x47\xdf\x1a\x1d\xbf\x67\x79\x3e\xf9\x81\x09\x42\x8c\xd6\x3d\x64\xcd\x3c\x6b\x46\x3b\xb1\x89\x13\xfc\x2c\xf7\xeb\x87\xee\x4f\x09\x41\x56\xc1\x1d\x14\xda\x46\xf0\xcb\xfb\xf3\x04\xee\x41\x43\x63\x62\x34\xb2\x67\x0a\x9d\x89\xfb\x2c\xcf\x01\x67\xd0\xb5\x52\xc4\xd4\x66\x8d\x82\xc4\x4a\x46\xb4\xe7\x9d\x45\xd4\xed\xa0\x9b\x4f\x51\x24\x2c\x6b\x8a\x4b\xef\xcc\x4e\x63\xde\x59\xbf\x7d\x46\x91\x52\xdc\x0a\x6b\xa8\x5c\x54\xe8\x27\x64\xc5\xeb\xfa\xdc\xa8\xf2\x38\x8c\x0c\xd0\x28\x8e\x12\x4c\x7f\xed\x40\x9d\xab\xac\xb9\x1c\x1e\xa0\xb1\x89\xb4\xb5\x99\x35\x0d\x1c\x4f\x4d\xbd\x2f\x17\x65\x51\x80\x6a\xe6\xa2\x78\x77\x2f\xb5\x2f\x67\x1e\x91\x3a\xaa\xcf\xa0\x51\x1c\x07\x08\x9c\xb9\x2b\x8f\x50\x0c\xb5\x7b\x68\x14\x6b\x26\x1c\x74\xaa\x6e\x72\xa8\xeb\x21\xea\xe1\xf0\x58\x4e\xec\xb1\x28\x01\x88\x3a\x06\x42\x4b\x36\xbf\x28\x4f\x17\x8c\xc7\xe8\xf2\x73\xb2\x42\xa2\xc4\x10\x3c\x11\xb0\x46\xb8\xfc\x2c\x06\xe7\xb3\xbe\x0e\xb3\x8f\x77\xc2\x88\x86\x22\x70\xb0\x0f\xd4\x2b\xf3\x2b\x1e\x21\x1e\x5f\x56\x73\xba\x1f\x33\xa7\x25\x9b\x21\x6f\xf2\x34\xd6\xf8\x6f\xdf\xcb\x80\xd3\x7c\x69\xce\x55\xb1\x2b\x8f\xd0\xbc\xf5\x1b\x5a\xc4\x43\x91\x4a\xef\x11\x40\xd5\x53\x37\x8c\xef\xc5\x09\x43\xde\xc9\x3d\x54\x55\x56\x62\xc5\x56\x77\x05\x4e\xa2\xc8\x2b\x35\xa0\x93\x7b\xa8\x2f\x75\x03\xc7\xae\x03\x70\xe8\x06\xb4\x63\xb9\xf2\xad\x22\x8d\x8c\xf7\x55\xb7\xf0\x01\x55\xb3\xff\xe9\xdb\xa4\x8a\x90\xd5\x66\xb5\xd8\xcf\xfc\xdf\x94\xb2\x51\xa1\x83\xca\x41\x20\x4b\x6a\xa5\xbf\x65\x50\x89\x4a\xbd\x5d\xa6\x8c\xeb\xff\xf3\xef\xf1\x11\x1f\x29\x50\x11\xf3\x55\x43\x5d\x91\xf4\xe4\x65\x35\x04\x28\xbc\xf4\x09\xd9\x06\xaa\x97\xdd\x9d\xbf\x37\x04\x31\x16\x3f\x7a\xae\xde\xc5\xe3\x7a\xe7\x45\x86\x68\x04\x1a\xb4\x2d\x2f\xbc\xb4\xd7\xbe\x7d\xe6\x46\x00\x21\xd6\x52\xc8\x73\x55\x8c\xb6\xcd\xd1\x5a\x02\x50\x81\x25\x31\x68\x2d\xd3\x47\x51\xfb\xc3\x1e\xa3\x6c\xe3\x77\x32\x84\x89\xf6\x13\xbe\xdc\xdd\x1f\x36\xeb\x6d\x9f\x1a\xa7\x91\x49\xb5\xec\xa8\x59\xb6\xed\xc0\x8f\x51\x14\x34\x0e\x12\xcb\xe1\x7a\xff\x4f\xcc\xb1\xdf\x8c\xe0\xd0\x38\x10\x84\x3a\x33\x7b\xd6\x94\xc7\x55\xbd\x1d\xb2\xba\x9d\xad\xd4\x95\xef\x0b\x81\xe9\x35\x15\x7f\x41\x87\x73\x2d\xf0\x39\xb9\x6b\x18\xf0\x70\xb8\xe3\xdf\x95\xea\x0a\xd8\x3a\x5a\x4f\x71\x18\x13\xaf\xbd\x9f\x8b\xea\xd5\x52\x41\xef\x9a\xf2\x74\xed\x18\xc4\x11\x35\x32\xee\x13\x5d\x1d\x93\x00\x8d\x63\x61\xd5\x6b\x30\x1b\xe5\xcc\xe9\x1b\xc1\x8a\x98\x04\x12\xe9\x0a\x9c\x46\x6f\x55\x5a\x7a\xee\xdf\x7e\x61\x09\xf7\xb7\x27\xd2\x69\x9f\x80\x3a\xb4\x3f\xf0\x37\x4f\x82\x24\xb2\xb5\xd9\x79\x59\x0d\x02\xae\x34\x4e\x74\x48\x5d\xcc\x7e\xb3\x5e\x3f\x5a\xe6\xff\x28\x18\x99\x6d\x71\x62\x12\xcc\x29\x1e\xb3\xc2\x9d\xf8\x3d\xbb\xaf\xeb\x42\x03\x1d\xb3\x5e\x21\xf6\x2e\x3b\xe5\xe5\x51\x4c\x46\x87\x52\x89\x86\x0e\x6e\xb6\xd6\x72\x98\xe5\x79\xa9\x10\x6d\x34\xe9\xca\xcd\x48\x25\xee\x8b\xef\x3c\x7a\x4c\x9a\xc6\x21\x96\xe0\x67\x05\x88\xd3\x29\x87\x4d\x99\x15\x3e\x98\x46\x63\x16\x47\x98\x5c\xc2\x2a\xe3\x1d\x34\xbd\x30\xfa\x5f\x61\x54\x68\xcc\xa4\x05\x80\x29\x9b\x16\x04\xdd\xd5\x63\xd3\x98\xe9\x34\x71\x59\xc3\x59\x5d\x3b\x86\x89\xf1\xcf\x39\x09\xf1\xa3\x1a\x40\xc7\x61\xf4\x05\x38\x51\xd2\x63\x92\xb6\x60\xa0\x12\x79\xde\x6e\x85\xbf\x62\x43\xa5\x31\x4f\x02\x2c\xa7\x7e\x10\x85\x70\x75\x34\xbe\xce\xed\x2f\x2b\x90\xc7\x57\x4a\x63\x9a\xf8\x38\xdd\x0e\x9a\x87\xce\x6e\x8c\x05\xb1\x34\x37\xf6\x4b\xf9\xa8\xc4\x38\x5c\x1d\xfe\x75\x80\x60\x7c\x3b\x91\xe8\x28\xea\xb0\x2e\x8e\x4d\x03\x81\xa2\x9b\x0a\x54\x56\xdf\xae\xfc\xa7\xb1\x0c\x0d\x6e\x93\x0f\x65\xae\xa1\x78\xcc\x5e\xdf\x1a\x4c\x51\xfd\xa5\x01\x1e\xab\xc8\xb2\x08\xe1\xa8\x2f\x9c\x4a\xde\x04\x3d\x43\x63\x95\xc4\xe8\x9a\xf4\xfc\x12\xed\xdf\x92\x38\x1a\x16\xf3\xef\x1a\x71\x45\x3c\xe5\xfb\x4a\x2e\xbc\x44\x72\x56\xf9\x1a\xe4\x3e\x41\xe3\xcf\xce\x58\x8b\x08\xb7\x13\xac\x8b\xe8\xdc\xed\x58\x9b\x08\xfd\x0b\x6b\x10\xed\x2c\x09\x9f\x1e\x87\x8f\xc7\x77\x04\xc3\x88\x2f\x57\x72\x55\x8c\xed\x7e\x33\x30\x53\x63\x13\x00\x96\x16\xb4\xa7\xf4\xda\x98\x85\x2f\x8a\xf0\xfa\xc6\xab\x22\x6b\x44\xfe\x94\x15\x73\x68\x7a\x4d\x37\x4a\x02\xc9\x71\x25\x61\xac\xb7\x2c\x60\x55\x20\xf9\xd7\xf2\x3f\x0e\x71\xfb\x04\x75\x2d\x5e\xfb\xee\x3a\x09\xae\x22\x6a\x5f\x65\x35\xdc\x6f\xc2\x18\xbc\x70\xe0\xbd\x38\x2b\x5f\xa7\x32\x60\xd1\xa7\x24\xe4\xb6\xfa\x59\x9e\x31\xa9\xe0\x52\xc9\xbe\x51\x5b\xa2\x2a\x47\x4a\x9a\x5b\xb6\x85\x81\x4e\xdc\x68\x16\x90\x28\x00\x64\xc6\x68\xbc\xbf\x81\xaa\xf9\xaa\xcf\x8e\x3d\x8a\xcf\x0b\x54\xf5\xaa\x68\x8d\xc5\x42\xe3\xda\x1b\x5d\x21\xa6\xc2\x1e\xd4\xc8\x0f\xb2\x5a\xac\x0f\x9b\xe5\x76\xb5\xbe\x3b\xec\x7f\xac\xbb\x6b\x2a\x83\xd8\xd3\xe7\xe5\xed\x31\xb8\x39\x77\x08\x09\x22\x2f\xb3\xff\x3d\x53\x70\xaa\xa0\xce\x34\x14\x0d\xdc\xc1\x13\xd4\x62\x7c\x34\x13\x42\x24\x66\xd7\xb2\xfa\x0e\x21\x3c\xbd\xe1\x45\x08\xa5\x16\x4e\x93\x35\x6f\x77\x95\xf8\xdc\x63\x2a\xdb\x56\xdd\x4c\x6e\xc9\xe3\x34\xec\x12\x19\xa3\x72\x04\xdf\x43\xa5\x98\xf0\xd9\x89\xea\x28\x2e\xf0\x26\xc4\xd0\x02\x26\x09\xa1\x18\x02\x13\x5a\x1f\x54\x57\x02\x3c\x20\xc4\x18\x0f\x7f\x42\x52\x04\xc9\xb4\x7e\xad\xf8\x14\x08\xd7\xf0\x4d\x3c\xc6\x05\x21\x7b\x30\xc7\x55\x39\x54\xd7\x55\x59\xe1\x85\xf2\x5f\xe1\x0d\x04\xa9\xeb\x45\x83\x94\x62\x3e\x05\xc4\xf1\x77\x80\x53\x56\xbc\x6e\xa0\x5a\x9e\x4a\xd5\x4d\x1e\x1a\x59\xbc\xae\x97\xad\x54\x30\x04\x11\xb6\xed\xdc\xfb\x92\x36\x2a\xb7\x7b\xcb\x4e\x38\x8e\x9d\x44\x9c\xcf\x17\x10\x9a\xc6\xe8\xe8\x1c\xda\x33\x54\xa8\x77\xd0\xe8\xcf\x39\x10\xdf\xad\x0c\x34\x25\x3c\xb2\x1a\x0c\x42\x6b\x3f\xdd\xc6\xa1\x12\xc2\xa9\x05\x20\xb6\x26\x9d\x2b\x4e\x1e\x96\xa8\xfa\x5e\x0c\x08\x74\x26\xdd\xc2\x69\x8c\xdf\x8c\xd3\x11\x6e\x22\x5c\x4d\xe2\x15\x0a\x75\x19\x2a\x33\x51\x22\x64\x14\xba\x50\xc2\xba\xc0\x78\xf1\x60\x35\x8e\x9e\x5c\x26\x2a\xf4\x81\xcc\x3b\x2f\x97\x41\x89\x34\x42\xba\x0b\xcc\xcf\x83\x28\x26\x51\x01\x47\x42\x9b\xb2\xb0\xe2\xac\xdd\xdf\x95\xc2\x64\xc0\xc9\x47\x0d\xff\xd6\x69\x45\x94\x8e\xec\x87\x51\xc7\xdb\xc2\x86\x94\x40\x48\x3d\xf5\xd4\x1e\x7e\x36\x83\x9c\x37\x25\x60\x84\xa5\x69\x55\xe5\x37\x51\xe9\x85\x38\x0d\xa8\x55\x28\x31\x4a\x44\x30\x64\xbe\x1a\x4d\x0a\x03\x56\x7d\x4f\xd4\x97\x42\x0d\xc5\x82\xbe\x78\x56\x63\x34\x38\x1c\xb0\xf3\x35\x1d\x44\xde\x0e\xeb\xe8\x4b\x26\x41\xec\xe4\x18\x85\x01\x07\x19\xfe\xf5\xe5\x93\x80\x24\xda\xf8\x98\xde\x22\x2f\x6b\xd0\x73\x2f\x19\x4c\x93\x80\x4b\xa0\x5d\x3d\xd8\x06\xaa\xf6\x35\xc7\x17\x08\xa5\xc1\x03\xe4\x58\x7e\xc0\xa1\x29\x87\x54\x86\x34\x89\x02\x86\x03\x7d\xf0\x85\xba\xf5\x98\xb0\x6e\xf2\x30\x91\xb4\xd5\xfc\x32\x6b\x76\xbb\xd9\x70\xa7\x48\xe2\x88\xa5\xaa\xe7\xaf\xbf\x5f\xbf\x3c\xdf\x2d\x3d\xeb\x35\x4d\x62\x1d\x59\xf1\x6b\x4c\x5d\x39\x9d\xbc\x1c\xd6\x45\x4f\x8e\x48\x13\xcc\x4d\x21\xef\x88\xc8\xcf\xd6\x2e\xc6\x2c\xc5\x13\x34\x55\xa6\x96\xd3\xc0\x45\x42\xa3\x04\xc9\x43\xed\xe1\x60\xb3\x8b\xc8\x8e\x8a\xb2\x73\xf7\x65\xb5\x15\x7f\x7e\xf1\x26\x8c\x31\x4c\x2c\xa3\x99\xdf\x61\x8b\x56\xc7\xd3\x5f\x62\xb9\xdc\x05\x78\x12\xe2\x0a\xc1\xa9\x73\x7f\x2e\xd4\x70\x12\x25\x5c\x86\x56\x83\xd0\xcb\xf5\x8e\xd4\x98\xc6\x8f\x92\x0a\x82\x70\x2e\x57\x54\xfa\x0b\x34\x23\x4d\x24\x68\xcc\x3b\x64\x45\xd6\x3c\xc3\xe7\x83\x3f\x08\x79\x07\xd0\xa1\x89\x34\x46\xc5\x3e\x88\x77\x53\x9d\x8e\x26\x8a\x68\xdc\xcd\x3a\xad\xf5\x09\xad\x03\x4d\x74\x48\x38\xf7\x04\xcf\x4e\xba\xc1\xd2\xf9\xdd\x82\x6a\xd1\xd6\xde\xa3\x66\xc0\xb2\x32\xef\x6a\x52\x6f\x46\xcc\x13\x4d\x35\xa2\xd5\x9e\x66\xff\x3c\x3c\xad\x9e\xf7\x87\xe7\x97\xa7\xb9\x2f\x13\xa2\x09\x44\x96\x62\xc4\x4a\x41\xda\x5d\xf6\xe1\xdc\x9e\x16\xfa\x66\xf5\x0d\x4d\x80\x6b\x8b\x7f\x2e\x1b\x2f\xd5\xe2\x5a\x4c\x02\x60\xe5\x81\xca\xb2\xee\x53\x77\x7d\x3e\x81\x86\x5c\x0a\xd9\xed\x6b\xae\x06\xcf\xab\xcc\xf9\x3e\xb2\x97\x6f\x5f\x88\x62\x4c\xac\x4c\x69\x08\xb6\x16\xf7\x23\xcb\x73\x91\x15\xa8\x48\xb5\x2f\x6f\x96\x05\x50\x1a\x85\x61\xe4\x34\x24\x76\xb9\x38\x1e\x6d\x52\x7c\x3c\xa2\x34\x8a\x93\xc4\xe5\xd5\xec\x36\x8e\x73\x75\x7a\x38\xd0\x88\x5a\xe1\x88\xc7\xfd\xde\x3f\x4b\x24\x42\x4c\x8f\x94\x2e\xef\x7e\xa8\x70\x14\xef\x76\x87\x53\x55\x96\xe6\x3b\xe6\x32\x0f\x07\x1b\xd7\x59\x94\x7a\xca\x7d\x32\x0c\x82\xd2\x48\x72\x1e\x76\x72\x9a\xad\xf9\x35\x29\xd6\xa0\x34\x32\x91\x37\x33\x56\xc3\x0a\x81\x71\xaf\x38\x88\x44\x84\xa7\x18\x2a\x25\x3f\x4d\x66\x1c\x8d\x43\x85\x07\xfa\x66\x33\x5f\x1c\x30\x5a\x79\x18\x94\xe8\xd2\xd6\x56\xc1\x22\x04\x2c\x2d\x5c\x3d\x3f\x1c\xee\x67\xab\xed\x1f\x5d\x2b\xd7\x64\x60\xe7\x3d\x65\x3f\xa1\x42\xd6\xdf\xd1\xb4\xa3\x49\xca\x30\x22\x9a\x67\x75\xb3\xaf\xca\xd3\xdb\x97\x82\x6f\xe3\x95\x47\x13\x91\x90\xd0\xe9\x40\xd7\x23\xe1\x10\xd7\x01\x21\x05\xad\xf7\x77\x2e\x34\x06\xe9\x57\x85\xe5\x0d\xbd\xbd\x94\x29\x8d\x23\xc4\x77\xbe\xbc\xac\xee\x3c\xd0\xdc\xbf\x4c\x1a\xd8\xfc\xd6\x51\xfc\xf4\x05\xe4\x4f\x1d\x3e\x8e\x52\xc1\x52\x61\xdd\x79\x55\xb6\x0e\xc4\xf8\x98\xa7\xc2\x28\x61\x4d\xc7\xfd\x1b\xcc\xd6\x5f\x79\x8a\xae\xb7\x24\x5c\xbb\x33\xfd\x5b\x59\xd5\x80\x48\xe2\xf1\xa3\x4a\x13\x45\x8e\x41\x71\x7e\xbe\x8c\x52\x52\x54\xc5\xc2\xdb\x58\x33\x6d\x3d\x19\x37\xe9\xbb\x0c\x5a\xdd\xf5\xa5\x96\x11\x0d\x05\xf2\x7d\x92\xb8\x6b\x64\x09\x24\x5d\x45\x47\x17\x66\x1f\x3f\xac\x52\x10\x58\xb2\x99\xff\x3d\xd7\xcd\xef\x9b\xd5\x17\xf9\x29\xaa\x83\xc0\x93\x02\xfa\xf0\xf0\x62\xe9\x6f\xa5\x43\x4b\xc9\xe3\x66\xe2\xbe\x5c\x8a\x2a\xbf\x78\xd6\xdf\x2f\xf6\x5e\xaa\x23\x86\x30\x9d\xd9\x6b\x95\x61\xd1\xd1\xa0\x98\x6a\xd5\x0f\x08\x70\x2a\x87\xa5\xc6\x0f\xa2\xde\x88\x8b\x14\xfd\x9b\x9a\x40\x62\xb4\xef\x29\x2b\x5e\xff\x38\x8b\xe2\x26\xf3\xc5\xb5\x8b\x4b\x4d\x64\x8f\xc7\xfd\xb7\xd9\xf3\xef\xbb\xfd\x72\xb7\x27\xdd\x25\x29\x71\x89\x5e\x78\x2d\x44\xd1\xfc\xab\xd4\x99\x50\xdd\xc0\x1b\x1e\x63\xde\xb0\x3d\x89\x5a\xff\xbf\xca\xa0\xf6\xda\x12\xb6\x0b\x0b\x22\x2e\xc1\x57\x6e\x5f\x23\x86\xcb\x32\x1f\x6c\x98\x2c\xe4\x0c\xa7\x98\x43\x05\x0f\x1f\x93\x85\x4a\x80\xf3\x73\x56\xaa\xdc\xbf\x65\x95\xfe\x01\xf0\xbe\xbd\x3a\x63\x58\x68\x12\x17\x47\xcb\xc1\x2a\x8c\x54\xf0\x90\x97\x26\xf3\x48\x3e\xca\x22\x22\x90\x79\x05\xcd\x1f\x3b\xf3\xec\x77\xea\x92\x0c\x2c\x4a\xa5\xad\x1a\x45\x5a\xeb\xe2\xd5\x43\x0f\x7c\xb3\x0a\x85\xf0\x57\xb0\x84\x7f\x43\x63\x91\x45\x60\xb9\xd7\xac\x11\x81\x05\x57\x57\x50\x51\xca\xe2\x50\x53\x1b\x24\x68\x16\x22\xcf\x7f\x64\xcd\x9b\x05\x5b\x0c\x93\xc3\xff\x43\xfe\xed\xbb\x33\x82\x7b\x15\xe8\xd2\x1a\x65\x07\x7f\x3b\xa2\x2c\x23\x91\xa3\x0d\xa3\x41\xd7\xa0\x99\x93\xe3\x6a\x2d\xb5\x27\x51\x5c\xee\xab\xf2\xd8\x47\xd5\x27\x11\x06\x96\x04\xa1\x43\x05\xa0\x12\xfb\x2f\xb4\x80\xc6\x83\x9e\x30\xe5\xab\x95\x9c\x2a\x34\x5c\xc7\xb2\x18\x0d\x43\xac\x09\xf9\x31\xd1\xbd\xf1\xcd\x3a\x89\x1d\xe5\xd5\x41\x8b\x26\x3b\xe4\x65\xd3\x94\x43\x13\x88\x31\x62\xd5\x9f\x3a\x13\xe8\xf9\x7c\xbc\x5b\xdd\xed\x4b\xac\xfc\xbc\xbd\x6c\x19\x53\xc6\xda\x37\xf5\x00\xb2\xe6\x47\x88\x87\x04\x77\x45\x68\xde\x1e\x45\x81\x59\xd6\xf5\xa9\xb3\x40\x19\x8f\x13\xc4\xd6\xff\xfe\xc7\x62\x68\x99\x32\x4e\x2c\x48\xb4\x81\xea\x58\xcf\x0a\xbd\x28\x0b\xab\xf4\x58\x77\x3d\x12\x8d\x8c\xdb\x05\x7c\x6e\xc4\x65\x7d\x6e\x7a\x95\xa6\x55\x3d\x50\x59\xf2\xdd\x95\x09\x22\x5f\x9c\x93\x0f\xe4\xde\xc6\x9b\x15\x4b\x43\x6e\x0b\x30\x86\x3a\x69\xbe\x8d\xa5\x58\x44\x70\x42\xbf\x73\x5b\xe6\xd7\x76\xe7\xf8\x62\x22\xb4\xa1\x57\xf4\x3a\x71\xfb\x99\x80\x8e\x29\x13\xcc\x96\xeb\x9e\xb0\x6e\xa6\xc3\x6f\x52\x26\x78\x88\x18\xe0\x79\xf6\x2a\x45\xf7\x47\xa9\x91\x51\x0f\x8a\xa6\xba\x78\x85\xc6\xf1\x8b\xca\x38\x20\x2e\xe5\xb1\x6a\xe0\x88\xd4\x85\xd7\x81\x47\x6f\x33\xf4\xbb\x83\x4e\x6c\xad\x7a\x0d\x85\xee\x64\xba\xda\x99\xb4\x05\x73\x3b\xa7\x38\xbe\x2f\xc4\xd6\xca\x7d\x2b\x3f\xdb\x75\xd0\x7a\xe5\xdd\xb7\x02\xae\xa5\xb3\x8a\x96\xcd\x9b\xe3\x8c\xc7\xf3\xb6\x97\xce\xa4\xcc\xf0\x58\xf4\x0c\xa7\xf7\x59\x0e\x5f\x21\x19\x98\x31\x01\x66\x55\x0e\x79\x27\x96\x71\x33\x27\x7d\xf3\x50\xe0\x41\x90\xca\x74\x40\x88\xd8\x9b\xbd\xbf\x5c\x85\x3c\x08\x29\xe2\x27\x5e\x7d\x51\xb6\xff\x7b\x4c\x11\x5d\x6f\xa3\x65\xbe\x4e\xd9\x37\xd2\x80\x91\xa1\xfc\xc2\x10\xa0\xe1\xfb\xc8\x10\x81\x08\xed\x76\xdb\xc7\xd1\x78\x48\x42\x4b\x2e\x24\xea\x66\x5f\xae\x26\x94\xe4\x94\x87\x86\xe2\x12\x50\xe2\x94\x35\x22\xdf\x0e\x58\x3d\x28\x8f\x52\x86\x34\x39\x70\x84\xea\xf5\x72\x98\x6a\x61\xb9\x5e\x71\xa4\x10\xa8\x70\xe7\xe3\x64\x3c\x76\xa2\xb1\xe5\x09\x8a\x1d\xa8\x0a\xae\x9c\x81\xd1\x01\xc7\x09\xb1\x19\xec\xe3\xc5\x03\x76\x22\x7f\xa9\x04\x6c\xe1\xcc\x41\x55\xe5\x67\xcf\xa7\x36\x7e\x89\xc4\xa4\xe8\xd5\xfc\xeb\xb9\xaf\x6b\xc0\xbf\x62\x8c\xe5\xa9\x14\x3e\x2a\xc8\x69\x90\xe2\xb1\x02\xc7\xac\x99\xc9\xb2\xea\x77\x19\x4e\x29\x09\xa4\xaf\x39\x11\xb2\x5e\x9b\x6b\x1e\x23\xca\xa9\x09\xc2\x74\xc4\x88\x9c\x76\x17\x30\x02\xeb\x8b\x2c\x64\x70\x3e\x5f\xdf\x95\xea\x7c\xec\x4a\x24\x87\xc6\x35\x67\x29\x45\xb4\xb6\xd0\xda\x1e\x4d\x4e\x7a\x65\xfc\x5e\x5c\xca\x48\x76\x2c\x89\x77\x7f\x83\x25\xd1\xfd\x30\x65\x09\xd6\x80\xa0\x47\x76\xd8\x89\x8f\xde\x2b\xe2\x42\x4a\x04\xad\x3a\xba\xbf\x7d\x79\x8f\xba\xf6\xb7\x2f\xa4\x82\x08\x4b\x88\xd1\x2c\xff\x27\x78\xda\x09\xca\x55\x22\x31\x56\x87\x3c\x0b\x2e\x6e\xec\x28\x1b\xc6\xdf\xda\xf7\x07\x3b\xba\xcd\xb9\x6a\x72\x38\x62\x8e\x7c\x0b\xff\xf1\x97\xd3\xc2\x5a\xb6\xb3\xe6\x0d\x0a\xf1\x28\x64\x3d\xc8\xb1\x76\xe8\x4f\x76\x95\x14\xef\x72\xd7\xae\xba\x9c\x72\xad\x34\x8e\xd9\xd3\xb7\xbd\xa5\xd4\x9b\x2e\x14\xa0\x31\x56\xfb\x74\xfa\xc0\xfe\x19\x4c\x28\x02\xe5\x14\xde\x3f\xa0\x5a\xee\xbf\x1d\x76\x50\x68\x79\x79\xca\x50\x3e\xaf\xeb\xc7\x01\x67\x9b\x16\x8d\xd8\xa1\x0a\xc8\x03\x34\x0f\x55\x79\x3e\x6d\xa1\x3e\xe7\x93\x15\x96\x06\xb1\x4a\x2d\xf7\x5e\xa9\xa0\xae\x97\x85\x5e\x9b\x3f\x40\x4c\x42\xb6\x69\x28\xe3\x40\x3a\x22\xf3\xad\xb5\x4f\xef\x44\x03\xf4\xa9\x2c\xba\xd5\x9c\x86\x10\xa3\x35\x82\x9f\xe3\x6e\xfd\xb0\xec\x0a\xd8\x69\x1a\xb1\x30\x71\xa5\x81\x0f\xe2\x08\x83\x67\xf1\xb1\xcc\x34\xe2\x01\xd2\x84\x16\xce\x32\x6e\xfb\xf9\x79\x91\xc6\xb1\x15\x58\xcb\xda\xa1\x77\x5b\xbe\x6b\x22\x51\x18\x2a\xa7\x74\x53\xde\xf0\xc4\xa7\xf0\x5c\xf7\x7f\x6f\x44\x8a\x53\x42\x53\x64\x8c\xf9\x5f\xa1\xde\x0f\x27\x4f\x70\x44\x53\x22\xad\xdf\xef\xab\xd1\xca\x7c\x2a\x44\xf0\x37\x13\x51\xe3\x09\x9c\x12\x45\xd0\xbc\x7d\xde\x0d\x29\xb3\x69\x9a\x04\x56\x70\xf4\x71\x75\xbf\xfc\xb1\xde\x3e\xde\x75\x0d\x61\x80\xf0\x50\x74\xf7\x2d\x23\x5b\xd6\xbc\x39\x12\xc6\xfb\xb2\x82\xec\xb5\x08\x7d\x67\xaa\x08\x82\x9a\x4c\xbb\x84\x66\xaf\xce\x1e\xf8\x35\xe1\x26\x4d\x59\x6c\x13\x4f\x58\xe7\xaf\x71\x97\xb9\x25\x62\x4e\x53\xe6\x8a\x91\xbe\x89\xfa\xad\x28\x35\xb2\xe6\x22\x38\xad\x80\x4f\xff\x08\x4c\x04\xf8\x08\xa7\x93\xbc\xbd\x86\x53\xa6\xed\xc9\x89\x25\x39\x63\x10\x4c\xca\x99\x2d\xd7\x69\xdf\x71\x44\xe2\xf0\x8a\x3b\x57\x3d\x45\x47\xf8\x9f\x71\xc9\xdc\x2e\x78\x37\x11\xa1\x40\x66\x8c\x6b\xc3\x32\xe5\x52\x81\xdb\x5e\x5b\x97\xb6\xe7\x88\xa2\x29\xd7\x02\x77\x24\x6d\xb9\xde\xe0\x24\x06\xfa\x5e\x34\xe5\x40\x31\x55\xf1\xa3\x12\xa7\x2d\x08\xeb\x6b\xa2\xb7\xea\x3a\xa4\x42\x3b\x66\xbf\xe6\x7c\xba\x3f\x63\x10\x76\xf8\x04\x93\xf1\x10\xb1\x62\xf2\xa6\x5d\x38\xab\xd0\x79\x75\x13\xfc\x0b\xcc\x67\x2a\x68\xca\x9d\x25\xf2\x3d\xab\x9a\x33\x8a\x6d\x69\xa8\x77\xe7\xe3\x71\xc0\x22\x37\xb9\xa9\x56\x60\x03\xeb\x63\xac\x51\x2a\x53\x6d\x19\xd2\x84\x81\xbe\x1e\xe1\x06\x7d\x05\x4d\xa5\x08\x90\x5c\xb1\x29\xe7\x71\x74\xdb\x59\x4d\xa5\xb4\x74\x40\xbe\x98\xcf\x85\x1e\xaf\x2d\xaf\xde\x6c\x4b\xa5\x09\x62\xe9\xd9\xf0\x36\xa2\x6a\xba\xfc\xfd\xe4\x01\x54\x7b\xb0\x0f\x6a\x2c\xd1\x7d\x76\xb7\xb9\x9d\xc2\xef\x06\x4d\xb7\xdb\x20\x0a\xb8\x2e\x6c\xd0\xc2\xae\xad\x49\x30\x25\xd5\x89\x41\x7f\x36\x53\x25\x96\x29\x4d\x9f\x40\x8b\x98\x59\xaa\x77\x4c\xa6\xfb\x41\x84\xd6\x9d\xc3\x58\xb7\xce\x0c\x3e\x11\xb2\x64\x16\xe7\x01\xd2\xfd\x56\xd6\x24\x05\x16\x23\x3d\xe2\x47\xd9\xc0\x7d\x59\x2d\x44\xa1\x33\x3d\x14\x0c\xb9\x19\x3b\x49\x81\xc7\xa8\x5c\xa8\xa0\xb4\x0c\x75\x8b\xb2\x9c\xbc\x09\xa4\x1c\xe9\xb7\x64\xf6\x85\xf2\x0a\x4d\x4d\x68\xeb\x21\x36\xdb\x25\xf2\x54\xfc\x58\xae\x0e\x0f\xeb\x99\x3f\x90\x52\x13\x72\x4c\xa2\x34\xd9\x11\xea\x55\xbd\xfe\x98\x5a\x23\xa9\x09\x53\x5f\x0e\xfe\xa3\xac\xde\xa1\xba\xa1\x56\x48\x53\x43\x89\xf1\xe6\xfc\xf5\xc2\x34\x4c\x61\x0c\xd4\xee\xbc\xf8\xdd\xbf\x0b\x7f\x74\x74\xdf\xcf\x70\x91\xa8\xde\x6a\xd0\x98\x06\xba\x2f\xab\x6b\x05\x7e\x2a\x82\x30\xea\x39\xdf\x76\x4d\x59\x0d\x54\x6f\xc7\x03\x29\x82\x18\xa4\x19\x80\xab\xa6\x57\xe2\x0a\x37\x37\xcb\x44\x38\xcf\x1a\xab\x34\xe7\x5b\x25\x60\xa8\xfa\x79\xb1\x1d\xd8\x7d\x22\x00\x8e\x60\xd6\xbb\xfd\x62\x71\x58\x3d\xae\x7f\x1c\x98\x6f\x0a\x83\xc8\x46\x52\x9c\xc1\x6f\x55\x54\x6e\xae\x24\x11\x46\x12\x0b\x49\x90\x19\xf3\x28\xde\xa1\xda\x54\xf0\x31\xd2\xb3\xff\x5b\xf9\x5f\x11\x12\xe9\xd9\x12\x7d\x48\xaa\x23\x95\xdb\xbf\x59\xf2\x3d\xdf\x95\x51\x4c\x6c\x98\xd3\xd3\xf9\xb6\x60\x06\x15\x51\x12\xe2\xac\xb1\x5c\xea\xd0\x1c\x72\x21\x3d\x03\x31\x15\x51\x2a\x31\x6a\xbb\x2c\x9a\xaa\x3c\x5d\xf6\x3f\xa7\x1a\xfc\x37\x2a\x1a\xa9\x88\x03\xc0\x98\xe4\x31\x2b\x6c\x91\x8f\xbf\x5c\x1c\xb2\xd0\x72\xd1\x7f\x94\x36\x01\xfc\xc5\x68\xc5\xa1\x44\x2b\x67\x50\x2a\xd8\x7a\x30\x63\x4e\x2d\x2a\xe2\x38\x1a\xa4\xf5\x11\x5e\x36\xf9\xe4\xb1\x0c\x75\x87\x65\xff\x26\x2a\xdd\xf1\x4d\x50\x11\x6b\xab\x73\x03\x3f\xb3\xba\x99\xcc\x72\x11\x03\xc7\xe2\xbd\xdc\x9f\x3f\xc3\x07\xf5\x26\x90\x20\x54\xe1\x4e\x51\x43\xd3\xe4\x30\x6f\xad\x2c\x8b\x92\xeb\xea\xb2\xa9\x20\x0c\x90\x84\xe3\xa9\x2c\x5e\xcb\x3c\x13\xcf\xc2\x72\xea\x0e\xf7\x6d\x91\x24\x84\x7a\x10\xe2\x3c\xcb\x33\x99\x55\x5a\x8c\x7b\x50\x89\x54\x29\xfb\x4c\x14\x8f\x99\x28\x46\x80\x96\xf1\x4b\x27\x8e\xf9\xd2\x7b\x58\x1d\x65\xf2\xb6\x03\x34\x88\x44\x5a\x5e\x80\xe3\x61\x90\x4a\xef\x1a\x8d\x40\xe6\xb6\xfa\x2c\x9d\x58\xc0\xf8\x06\x34\xd0\xdc\x06\x99\xea\xf3\x11\x26\x44\x1d\x54\x30\x02\x9a\x75\x31\xa8\x41\xb5\xc8\x78\x88\x39\x09\xc2\x8e\xc8\xeb\x69\x39\xdb\x97\xc5\x88\x52\x9b\x0a\x2e\x40\x30\xa7\x0e\x56\xa8\x4c\xe4\xbb\xa6\x12\x0d\xbc\x76\x1d\xd2\x48\xa3\xc1\x71\xbc\xa8\xae\xd6\xfc\x7c\xad\x6a\x49\x45\x4a\x00\x73\xb9\x45\xd9\x64\xe6\xb2\x36\x48\xad\x66\xb9\x6d\xbd\xb1\x34\x29\x84\x9d\x8c\xa9\x24\x11\x71\x6c\xf9\x0b\x51\x37\x5f\x93\xdd\xbb\xfe\x2a\x21\x38\xf1\x30\x7d\xb6\x85\x57\xc7\x42\x32\x3a\xc6\x84\xa2\x94\x13\xaf\x83\xdf\x2e\xa4\x7f\x41\xf5\x85\x9d\x21\x34\xa5\x68\xd1\x9b\xf8\xab\x0e\x22\x14\xba\x63\x0f\xbd\x13\x97\xfa\x11\xba\xea\x1f\xa1\x85\x44\x8b\x58\x43\x2e\x2e\x6b\xb3\x5a\xac\xbd\xd9\x29\x4c\xc8\x11\x2f\x79\x2c\x8b\x26\xbf\x1c\x4e\x5d\xa2\x5e\x98\x88\xa1\xbb\xfc\xdf\x67\x51\x34\xa2\x6e\x3a\xfc\xbd\x30\xc2\x95\xad\x42\x73\x93\x6d\x9a\x0a\x03\x1c\x41\xdb\x9b\xed\xd2\xf2\x26\x3d\x3c\x6d\x37\x07\x27\xef\x33\xdb\xb8\x0b\xc9\x20\x0d\x53\x2b\xce\x05\x99\x2a\xf7\x3e\x01\xdd\xc7\x1c\x64\x90\x72\xc3\x5d\x75\xb6\xe5\x3f\x9c\x16\x61\xc9\x30\xe0\xb6\xde\x64\x60\xf5\xcc\x3c\x01\x24\x95\x61\x64\x10\x50\xfd\x2a\x8e\x30\x50\xc0\xa1\x32\x4c\x0c\xb8\xf0\xbe\xd3\x18\xbb\x39\xb4\x32\x4c\x15\x46\x4c\x74\x25\xb2\x49\xde\x55\x46\x32\x8e\x2d\x06\xf3\xb5\xb5\xdb\xae\x25\xbc\x7c\x3f\x15\x63\x51\xd7\x77\x28\xb4\x65\x02\x1a\xb7\xc7\xa9\x74\x98\x32\x3b\x91\xd1\xd9\x7e\xca\x8a\x2e\xa4\x20\x63\x08\x50\x22\x09\x4b\x33\xd6\x05\xf4\xd4\xb1\x54\x12\xa2\x51\x9d\x04\xa1\x57\x96\xb3\xb5\xdf\x82\xa4\xd7\x90\x41\xf6\x1a\x34\x68\x17\xed\x3a\xea\x82\xf7\xa3\xb5\x22\x89\x36\x48\xbf\xac\x7a\x7d\xfb\x81\x91\x2f\x13\x42\x11\x32\xee\x77\x97\x7d\x25\xd4\xfb\xda\x8c\xa2\xf7\x32\x49\x04\xd6\x5f\xbe\x95\x2e\xeb\x38\xb9\x08\x4d\x29\x72\x91\x67\xc7\x53\x89\x20\xe8\x8f\xac\x3c\xd7\x36\xf7\x3e\x14\xb8\xba\xc2\xaf\xfb\xc0\xb5\xa4\xda\x66\x8c\x6a\xc7\x59\x34\xe1\x68\x9b\x8c\x3e\x0b\x58\x60\x39\xee\x11\x0b\x78\x3c\xe5\xf0\x73\xc4\x7b\x4b\x25\x73\x75\xb3\xf3\x32\x6f\x3c\x85\x12\x95\x9c\x25\x48\xf5\x9b\xb9\x34\xdc\x42\xe4\x6a\x4c\x04\xe9\x3a\xa6\x61\x28\xd5\x54\xc9\xfe\xf6\x54\x48\xc3\x14\xb1\x14\x9f\x38\x32\x8f\x59\x57\xc4\x4d\x65\x1a\x11\x9c\xec\xa8\x5a\xed\xc5\x4b\x7e\x0d\xe7\xbd\xbd\x01\xc9\x94\x28\xfc\x8a\x05\xbc\x96\x4d\xe6\x8d\x50\xbf\xf5\xc8\x34\x61\x08\xe2\xb1\x7b\xf4\xa1\xbc\x0e\x4e\xc9\x94\x85\xb1\x25\x47\xd3\x70\xc4\xfc\xd4\xe2\x8a\x1d\x9a\xca\x54\x07\x08\x09\x95\x18\x78\x72\x10\xdd\xac\x1f\xc0\xd4\x68\x74\xee\xba\x7c\xeb\xf7\xd5\x73\x07\x59\x97\x22\x8c\x91\x2e\x3f\x17\x75\x33\x40\x42\xad\x0a\x0c\x83\x76\xbd\x62\x89\x25\x04\x42\xeb\x3d\xd6\x0e\x8c\x09\x6f\x6e\x45\x01\xa5\x8c\x95\xa3\xae\xca\xa1\x01\xbb\xbd\x8e\xb7\x5f\xa9\x13\x9e\xc6\x3e\xc6\x31\x39\xe3\x24\x10\x86\xa9\xbf\x85\x28\x0a\x21\xb3\x3f\x87\x87\xb1\x04\x66\x45\x2e\x6a\x68\x3a\xf9\xd2\xc9\xcf\x85\x0d\x42\x3e\xae\x17\xbf\x2f\xef\xb2\xe7\xee\x97\x3a\x48\x6c\x12\xf4\x67\xbf\x0f\x99\x00\x74\xaf\x46\xaf\x44\xd1\x94\x85\xcf\xaa\x4c\x86\xdb\x18\x63\x78\x4f\x30\xb1\x2f\x8f\xb2\xdd\xf1\x86\xc4\x4d\xa3\x71\x50\x41\x62\x99\xab\x5c\x81\xc7\x80\x2e\x8e\xfb\x1e\x2c\xa6\x43\xae\x1b\x27\x5d\x74\xfb\x6a\x9a\x22\x72\xf5\xf0\x0a\xcd\xc2\x6a\x67\x21\xba\x61\xf4\xf2\x2a\x14\x4a\x5b\x76\x8c\xb2\x34\xf7\xe5\x88\xd9\x8a\xaa\x50\x4b\xcc\xb1\x3f\xb4\x97\x68\x0f\xdf\xd6\xbe\x9a\x5f\x86\x14\xf5\xae\x67\xc4\x23\xcc\x96\xcf\xcf\x97\xfb\xb2\xba\xaf\xb2\x21\x8e\xea\x6f\x99\xcb\x2a\x36\xbe\x80\x5d\xe8\x76\xaf\xf3\xc8\xe4\x59\xb3\x1a\x55\xad\x8c\x7f\x45\x22\x16\x0e\xf0\xa2\x3f\x4f\x59\x05\xfa\x9a\xf6\x94\xaa\x24\xd0\x28\x2d\x6d\x17\x50\x3d\xaa\x70\x53\x49\x4c\x5d\x82\xbd\xd0\x98\xb0\x78\x12\xc5\xe5\x4b\xe6\x2b\xaa\x12\xc5\x31\x61\xa1\x72\x10\xc5\x8b\xdf\x98\x14\x95\x2c\xb6\xc4\x6a\x4d\xf6\x01\xf7\x59\x55\x37\xc3\xd5\xa1\x18\x89\xd1\xcb\xfd\xc7\x6c\x33\x5b\x7c\x5b\x3e\xae\x3d\xfc\x45\x71\x43\xd1\x3c\xf5\x0e\xca\x5c\x7c\x4d\x33\xea\x7e\x92\x32\xaa\x23\xef\x0f\x84\x13\xe2\x86\x64\x44\xdb\x40\x55\xca\x35\x1a\x7a\x3f\xb2\xf7\x6c\xb8\x3e\x54\x9a\x6a\xb4\x45\x76\xcb\xfd\xcb\xa6\xfb\x23\xa4\x68\x55\x3a\xa7\x6f\x07\x85\xbe\x41\x62\x39\x2c\xd6\x9b\x3c\x9b\x60\x09\x06\x37\x66\xef\xe5\x40\x83\x9e\x2a\x21\x05\x8e\x73\xbb\xf5\xb6\xe7\x40\x2f\x87\x40\x95\xe4\x14\xb1\x66\x9f\x3e\x03\xea\xc7\x62\x53\x65\xc7\xb2\xd2\x99\x33\xc4\x7f\x55\x40\xe8\x2f\xa5\x84\xf4\xc5\xbd\x1b\x51\x75\x8a\x18\x1e\xdb\x3e\x5a\xa8\xaa\xdd\x01\x02\x5f\x93\x67\x75\x85\xb2\xe2\xf5\x4b\x07\x51\x29\xa6\x7d\x71\xc5\x4b\x91\x35\x77\x60\xa0\xa8\x61\x55\xb4\xeb\xfc\x16\xd7\xff\x74\xda\xf7\x11\x18\xa5\x4d\xc4\xc3\xae\xe2\x6a\xd3\xec\x84\x81\x27\xd0\x59\x17\x6f\x57\x00\x76\x73\xb4\x40\x0b\xed\x35\x2d\x6f\xd4\xc7\x7f\x41\xaf\x4f\x95\x89\x05\xd3\x9e\x11\xc8\x05\xed\x16\xe7\xe9\xfa\x30\x24\xc1\x18\xb1\xe5\x60\x18\xd5\x2e\x7e\x85\x8c\xbb\x62\xb2\xb9\x19\x37\x53\x26\x21\x61\x27\x35\xd9\x5a\x84\x9b\x0a\x56\x9e\x81\x84\xea\x40\x1a\x4c\xd7\x3e\xf4\xac\x3a\xbe\x48\xc2\xf5\x88\x40\x62\x2e\xeb\xe0\xb5\xaa\xff\xfb\x2c\xf2\xac\xb9\x2c\xca\xa2\x86\xa2\x3e\xd7\xb7\x21\x67\x3a\x32\x56\x1b\xb3\x86\xe6\xbe\x02\xc0\x6b\x7e\x31\x8d\x6f\x68\xab\xf1\x7e\xd5\x0f\xfe\xdf\x70\x7f\xd4\x71\x9c\x7a\xe4\x83\xb7\x9a\x26\xc0\xaa\xd1\x4c\xd3\x31\xb5\xe2\x34\xcb\xe7\xfd\xf6\x8f\xc3\xfd\xd2\x03\x54\x74\xac\x13\x2c\x5f\x47\xc6\x3d\x0b\x6a\xd0\xb7\x8c\x89\xee\xd5\x62\x27\x32\x85\x9b\x19\x46\x50\x7a\x50\xe3\xf8\xc3\x6a\x22\x22\xec\x2a\xb4\x7e\x14\xea\xdd\xcb\x95\x5b\xf2\x1e\x4a\x3a\x25\xf5\x8e\xcd\xa7\xfb\xfb\xe4\x3f\x71\x50\xfc\x16\xa8\x93\x90\xc6\xdc\x27\x42\xd5\x4a\xbb\xcc\xec\x6a\x92\xcb\xd2\x49\x9a\xf8\xaa\xc1\x99\x97\xe8\x6c\xce\x93\x33\x5c\x53\x6e\x90\xda\xc7\x71\x77\xfd\xc8\x8a\x4d\x59\xe6\x18\x28\xc9\x2a\x8d\x14\xf8\x7e\xac\xa8\x4e\x44\xc7\x02\x24\x64\x3e\x54\xd6\xa3\x9a\x45\xc2\xcb\x39\x7e\x2f\x9b\x01\x27\xcc\xcd\xb5\xac\x39\x0d\x86\x1a\x58\xed\xb9\xf3\xfb\x1f\x8b\x59\xa1\x77\xa8\x8e\x0f\x55\xf5\x05\x23\x2a\xd5\x3c\x75\xb8\x61\x0f\xe3\x6c\x44\xee\x44\x14\xfd\xc3\xa4\x09\xd5\xb6\x80\xef\xf2\xdb\x68\x4a\x4d\x9e\x42\x84\xca\x73\xad\x60\x39\xcb\xee\x69\xb3\x1f\x02\x7c\x7d\x37\x19\x27\xce\x09\x7a\xd8\xec\x46\x4a\x8c\x54\xcb\x48\x22\x42\xe7\x71\xfd\x70\x98\x43\xf3\x58\xd6\xb7\xf9\xf2\xa9\x96\x14\x70\xbf\x3b\x95\xc5\x9f\xd9\xbe\x1c\x20\x88\xa7\x1d\x55\x84\x80\xc4\xa7\xf5\x76\x94\x44\xd1\x4a\xc6\x91\xea\x8a\x9b\x06\x12\x18\xae\x5d\x07\x21\x77\x3e\xe7\xee\x2c\x91\x30\x63\x7c\x65\x2d\xac\x9b\x76\x76\xbc\x8d\xce\x10\xbd\x91\x38\xd2\x5a\x01\xe2\x67\x3a\x7d\xb3\x43\x3d\xd5\xf8\xa1\xda\x04\x3a\x09\xfc\x4a\x2f\xff\x44\x92\x3a\x84\x0e\x2d\xd6\x03\x8e\x1c\x6d\x22\x7b\x64\xbe\x67\xea\x7d\x7d\x6e\xbd\x0b\xab\x8d\xf9\xc5\x40\x19\x61\xc0\x39\x63\x18\x5c\x71\x52\x5d\x93\x4e\xca\xf8\x28\xdf\xa2\x2c\x73\x5d\x7e\x7a\x95\x0f\xec\x48\x02\xdb\x0f\xc2\x84\x7b\xe0\xc0\x26\x43\x6d\xf4\xba\x86\xa6\x9e\x15\x1a\x29\x2a\xb0\x8a\xba\x2f\x45\xbd\xda\x7a\xc6\x8f\x06\x51\x18\x21\xc2\x43\x68\xbd\xa8\x2e\x75\xf3\x15\xea\x10\x08\x25\xa8\x9c\x72\x72\xd6\xd4\x54\x31\x8b\x02\x11\xb1\xd6\x1e\x08\xe6\x76\xde\xeb\xb4\xc1\x57\xff\x7d\xfb\xae\x89\xa2\xa2\xe3\xbe\xfa\x01\x19\x96\xf2\x76\xfe\x31\x24\x10\x86\x91\x3f\x11\xec\x59\xeb\xab\xed\xbb\x1e\x51\xca\x3d\x35\x63\x06\x05\x16\xa2\x0c\x91\x8a\xa3\x49\x02\x94\x2a\xa4\xd0\xb0\xa8\xb1\xcf\x81\xe5\x03\x94\x87\x98\x12\x5f\xbd\x9f\x2b\x61\x91\x8a\xe2\x8a\x6e\x71\xf2\xf8\x2c\x4a\xf1\x58\x6e\xed\x87\xd6\x12\x1c\x84\x0a\xc6\x07\xc5\xb5\x69\x08\x4c\x32\xcc\xdd\x35\xda\x82\x80\xfa\xb7\x66\x86\xa6\xbe\x24\xef\x90\x15\xad\xb9\x76\x30\x99\xe5\x6e\xf8\xd6\x5a\x2a\x15\x7c\x78\xdd\x9b\xd1\xe3\x70\x66\xf0\x71\x76\xef\x59\x9e\x4f\xe9\xcf\x29\xf0\x94\x4b\x57\xa9\xb8\x52\xa0\xfb\x2a\x1b\xd7\x9e\x4a\x8e\x21\x7c\x5d\xee\xa0\x59\x88\xc2\x66\x60\x1e\x2a\x51\xf4\xb1\xd4\x81\x51\x02\x22\x14\xc8\x8c\xe7\x18\x5e\x4e\xd9\xa4\x8e\x1d\x04\x75\xfb\xc2\xea\x79\xb9\x3d\x2c\x9f\xef\x0e\x98\x53\xf7\xf7\x93\x61\x8c\xc8\x25\x2b\xcf\x32\xa2\x74\xfa\x7b\x1e\x71\x7b\x05\xc4\x09\x7e\xcf\xa0\x29\x9c\xb4\xe8\x5f\xe3\x25\x41\x26\x5c\x0f\x8d\x68\x17\x8b\xde\xc2\x47\xf9\x3e\xcd\x38\x81\x04\x12\x5a\x15\x58\x23\xce\x79\xf3\xb2\x5d\x0d\xb4\xa3\x29\xa8\xd4\x02\xfa\x3b\xad\x7d\xb7\xa3\x74\xed\xd2\x6a\x70\xbd\x42\x73\xaa\xb2\x3f\xe1\x58\x16\x70\x99\xdc\x42\x69\x86\x69\xb3\x9b\x2c\xea\xbf\x22\x94\xba\x89\xc4\xfc\xaf\xc9\xc5\xc1\xa2\x20\x1f\x41\xbc\x9e\xa1\x97\xab\xec\x13\xa8\xa0\x89\x64\x5d\x39\x54\xfd\xde\x9a\x7f\xa3\x9c\x80\xef\x96\xd8\x4a\x27\xbb\x19\x5b\x12\xa6\x61\x3e\xbb\xff\x2e\x9a\x1b\x04\x0d\xbd\xe2\xdc\x79\x29\xf2\x1e\xce\x0b\x10\x69\xc4\x80\x75\x03\xe6\x5c\xac\x11\x54\x19\x80\x58\x52\x14\xef\xc1\xe2\x26\xd8\xee\xc3\xed\xa9\x39\xfe\xc0\xb7\x12\x16\x00\x9c\x61\x59\xed\x21\xf8\xb9\xec\x34\xe3\xbb\x8b\x73\x85\x1e\x3b\x3a\x5e\x16\x77\xe6\x5b\x24\x4f\x5d\x58\x62\x9e\xe9\x2f\x04\x75\xc7\xa3\x02\xc6\x60\xb1\xe4\xe9\x5c\xbc\x3f\x97\x8f\x65\xf1\x8a\x79\xaf\x2b\x61\x00\x0a\x26\x65\x66\xc2\x74\xb3\x2f\xdd\x6b\x4f\x7a\x2a\xe9\xf9\x45\x7e\x87\x4b\x4f\x18\xff\x95\xe9\x6c\x02\xe3\x44\x60\x40\x1c\x1d\x38\xc4\x6f\x27\x26\x0c\x2c\x75\x63\x53\x9e\x5e\x4e\xed\x1e\x82\x03\x32\xf3\x12\x08\xf7\x65\xe5\x71\x30\x37\x37\x39\x13\x26\x80\x99\xd9\x47\x51\x49\x51\x9e\xb3\xee\xba\x4c\x62\xcd\x57\xaf\xbc\xbb\xa9\x60\x57\xe6\x5e\x8d\xd8\x77\x4b\x53\x2b\x72\x5c\xe4\x17\x0c\xd5\xee\xa0\xb1\x90\x26\xf7\xea\xa3\xe1\x34\x71\x48\xb0\x5a\xe3\x01\x61\x7c\xb7\x44\x9b\xa8\x89\x23\xeb\xeb\x2c\x56\x0e\xd0\x79\xc3\x1e\x30\x31\xa5\xc4\x05\x74\xbe\x1f\xb6\xc9\x78\x84\x4d\x9c\x32\xdc\xbb\xcc\xb9\xd0\xbd\x8f\x61\x48\x4a\x54\xea\x8b\xc7\xaa\x63\xdd\xf9\x50\xe3\xe1\x4e\x82\x04\x1f\x60\x2b\x8c\xc9\x61\x8c\xea\xf9\xf2\x24\xfc\xbb\xff\x5e\xf9\x1d\xe3\x5b\x13\x1e\xb7\x5b\xde\xb7\xec\xf5\xad\xb5\x1f\x5a\x5f\xf2\x5c\xc1\x62\x40\x95\x67\x92\x44\x20\x72\xdf\x02\x21\x06\x78\xd9\xdb\x1f\x38\x01\x89\xcb\xc1\xcf\xcb\xd6\x56\x9e\xe2\x52\x4d\x62\x12\x2c\x63\xd9\x3d\x6d\x66\x0a\x6b\x9c\xff\xa2\xfe\xcd\xd0\xc4\xe0\xc6\x39\xdb\xed\xb7\xcf\x36\x4d\xe0\x2f\x46\x41\xa3\x06\x03\x02\x0a\x2a\x57\x05\xde\xcd\x18\x6a\xac\xd1\xf7\x86\xd3\xb2\xd7\x8c\xf6\xed\x2c\x0e\x42\xb7\xa5\x62\x39\xe6\x90\x2a\xc2\xf0\xc8\xa6\x85\x8e\xa2\x76\x0e\x92\xe5\x5b\xb0\x21\x3d\xeb\x53\xb4\xcb\x33\xcb\x3f\x1c\x35\xc9\xe3\x08\x44\x3d\x38\xe0\x0c\x27\xc4\xbb\x6d\xeb\xd3\x64\x0a\x70\x25\x02\xe6\x22\x14\x9b\x7f\x3e\x7e\x31\xb4\x69\xc8\xf0\x88\x7b\x9a\xfd\xf3\x70\xbf\x5d\x2e\x0f\xdb\xe5\xfd\x72\xbb\x9d\x3d\x1e\x36\xb3\xc5\xef\x3e\x66\x6a\x52\x22\xd0\x16\xd8\x29\x91\x83\x8d\xf5\xf7\x4d\x12\xd3\x32\x56\xcb\xc3\x29\x7e\xfc\x7a\xe0\x53\xaa\x31\x37\xd0\x1a\xc1\x6b\x83\xab\xbd\xbb\x1a\xb7\x4c\x27\x4a\xe4\x6a\xeb\x8b\x1c\x7e\x51\xa9\xec\x7e\x26\x23\x85\x84\x34\xf2\x7c\xf1\xea\xd0\xbf\x4e\x96\x19\x49\x14\xa6\x48\x5d\x50\xf3\x3e\xcb\x8f\x5f\xe0\xb5\xfc\x0f\x28\x28\xe3\x85\xd4\xbf\x95\xe7\x8e\xff\xd0\x48\x15\x50\xe7\xf4\xfc\x80\xac\x03\xf9\xdf\x74\xb6\x8c\xe2\x96\xd0\x42\x68\xbd\xbb\x32\xff\x8d\x4a\x29\x06\xb1\x8e\x22\x2b\x06\xe9\x4d\xa3\x24\x78\x03\x1e\xc1\xfb\x2f\x59\x31\x5d\xf2\x4a\x85\x98\x5a\x16\xaf\x7b\x50\x6f\xa3\xc3\xca\x40\x2c\x02\xf7\xf3\x17\x7b\xbf\xa7\xac\x18\x99\x66\x06\x80\xc5\xd1\xa8\x18\xf4\xb9\x6c\xc6\xfb\x1a\x0b\x02\x1e\xa2\xdf\x76\x78\x13\x1f\xb0\xfc\x80\xea\x52\x16\xd0\xd3\xc6\xf9\x5e\x42\x62\x9a\xa4\x3d\xa3\xce\xfa\xf5\x1a\xdf\xef\xfb\x81\xc0\x6a\x92\x2e\xab\xd3\x7e\x68\xa4\x14\xfa\x32\x60\xc9\x82\x48\x6b\x24\xde\x78\x7b\xb7\xe4\x9b\xe7\x5b\x67\xad\xeb\x1b\x53\xbb\x0e\x6b\x61\xe0\x20\xf4\x15\x55\x9b\xef\x06\x96\x64\xcb\x46\x5e\x1f\x33\x03\xcb\x9f\x27\x50\x8d\x28\xd4\x98\x81\x9f\x05\x84\x48\x01\x57\x8e\xd4\xa0\x2a\x83\x05\x84\x87\x34\xec\xb3\xb0\xed\xfe\x3d\x66\xe4\xe3\x63\x71\x68\xff\x33\x99\x30\x8b\x74\x6f\x94\xe5\x80\xea\x2e\xa8\x24\x7a\x10\x42\x6b\xe4\x0b\x1c\x83\x18\xbe\x72\x67\x46\x03\x91\xc4\x91\x81\x31\xdf\x73\xdd\xd7\xc2\x4d\x86\x23\x31\x92\x3b\x99\xda\xd5\x62\xdd\x69\xe6\xb2\x80\x52\x5b\xfb\x97\x8b\xba\xf9\x87\x50\xef\xa7\x72\x18\x14\x66\x01\x95\x84\x39\xe4\xd6\xe1\x24\xce\x35\xbc\x2c\xf7\xbd\xd3\xda\xb6\x73\xac\xfe\xdf\xcc\xb6\xbb\xe5\xe2\xb0\xd8\x2e\xef\x56\xfb\xc3\xdd\x72\xb1\x7a\x9a\x3d\xee\xfc\x55\x58\x4c\x2c\xf9\xf9\xf9\xf2\x98\x15\xef\xdd\x9f\x49\x1a\x5a\xea\x18\x28\xbe\x41\x05\xb3\xae\x21\x25\xd0\x33\x2a\x7e\x83\xfc\x34\xf9\x66\x4c\xc4\x96\xfd\x21\x83\x6a\xff\x59\x3e\xf9\x63\x88\x05\x9c\x6a\x8c\x99\xec\x8e\xd9\x2b\xd4\x03\x0b\x8c\x05\x69\x40\xac\x1e\xac\xc8\x21\xb4\x44\xf1\x1d\x8f\x01\x0b\xd2\x44\xa3\x03\x64\x0d\xcd\x3d\x14\xed\x47\xf9\xf0\xec\x5f\x8b\xb7\x2c\xd7\x2f\x45\xf6\x01\x55\x3d\xae\xe2\x63\x41\xaa\x75\xe2\x56\x22\x62\xee\x8e\xa2\xea\x5e\x51\xe8\x04\xf3\xd2\xad\x8d\x74\x70\x15\x5e\x07\xe8\x69\x01\x58\x20\x03\xbb\xa7\xd7\xed\xaf\x51\x36\xf8\x51\x34\x80\xb5\xd5\xd5\xb5\x03\xc4\x02\x19\xc6\x2a\x71\x94\xa2\xa3\x6c\xa5\x43\x93\xb0\x40\x4a\x99\x76\x01\x1b\x5b\xb3\xbc\xfc\x69\xd3\x8e\x76\x3c\x6e\x71\x75\xb7\x3f\xd3\x58\x7a\x60\x37\xcf\x1b\x66\x68\x1c\x8d\x35\xeb\xa6\xbf\xd7\x12\x51\x16\x33\x9d\x69\x31\x50\x06\x67\x81\x4a\x23\x74\x7d\x1e\xd6\xbb\x6f\x2f\xab\xe7\xee\xcf\x4a\x21\x3f\xc3\x93\x38\x35\x5e\x7d\xd3\x35\x69\x46\xb1\xc6\xef\x60\x61\xeb\x68\xc2\xd5\x6f\xd9\xc9\x83\x94\x7e\x19\x38\x63\x81\x96\x92\x39\x8d\x35\x27\x8b\x31\xd0\xc1\x66\x81\xd6\x21\x2e\x9d\xac\xa7\x02\xa2\xbe\x0d\x84\x44\x7b\x59\x68\xdd\x1a\x01\xb3\x42\xcf\xf4\x47\x56\x97\x55\x3d\xc8\x49\xde\xbe\xab\x09\x39\xae\xa5\x4f\x80\x77\xe4\xf6\x5d\xf6\xeb\xc8\x88\x28\x1a\x14\xa5\x66\x22\xcf\xfe\x84\x85\xa8\xdf\x06\x81\x05\x16\x86\x24\xc6\x40\x63\x56\xb7\x96\xfc\x63\x07\x76\x66\x61\xa4\x9d\x19\x0f\x75\x73\x2f\xb2\xbc\x47\xc3\x0c\xcb\x44\x5a\x43\xbb\x3c\x37\x5d\x20\xc1\xff\xd8\xc4\x48\x5c\x86\xaa\x68\x88\xa0\x5d\x6e\x17\x21\x4d\xb0\x26\xd4\x08\x35\x61\xd8\x77\xf3\x28\x8c\x39\x0c\x26\x84\xa3\xbb\xf6\xc9\xe4\x5b\xd3\xc3\xfd\x8e\x90\x10\x93\xb1\x47\xf1\xf3\xa1\xec\x9f\x82\xd0\x08\x39\x3f\xdb\x57\x78\x80\xc6\xd6\x52\xdf\x55\xe2\x75\x92\xf4\x64\x21\x49\x23\xe4\xf9\xd8\x3e\x3f\x74\x3f\x16\x96\xcb\xe3\x78\x71\xe2\xba\x5d\x83\xb4\xec\x27\xe5\x07\x54\x26\x2f\x3f\x07\xc0\x0c\x16\x12\x0d\xe8\x59\xe1\x01\x34\x43\x41\x21\xdf\x44\x03\x46\xe9\xa8\x64\x22\x8c\xbb\xb6\x90\x85\xbd\x08\xf5\xbe\xab\x41\x0c\x7f\x2d\x4d\x1a\xd2\xf1\x38\x50\x12\xe0\x24\x76\x90\x8e\x4d\x05\x26\xfb\xb9\xf1\x68\x5e\xf4\x03\x87\x87\x87\xff\x95\x22\x41\x30\x51\x19\x79\x29\xb2\xff\x9c\x61\x48\x72\xc1\x42\x6a\x00\x91\x44\x75\xcc\x7e\x1b\x48\xa8\xb0\x90\x11\x5b\x98\x76\x72\x68\x08\x0c\xda\x4e\x54\xe2\x59\xc8\x54\x8c\x75\x21\x06\x4b\x57\xfc\x24\xaa\x77\x59\xa1\x6e\xb2\xd9\xb0\x90\x53\x5b\x9a\x8b\xb6\x1d\x9c\x8f\xae\x38\xc7\x3f\x4f\x1a\x59\xc5\x2f\xd5\xfa\x4e\xf9\xa4\x1a\xea\xb7\xd1\xc0\xa4\x10\x62\xce\xe5\x5c\x83\x27\x63\xef\xae\x02\x4e\x2a\xbd\x1d\x9d\x8d\xad\x9e\xf6\x6d\x42\x13\x0f\xc3\x1d\x93\x68\xb0\x50\x06\x24\x54\x5d\xb9\x2e\x82\x51\x46\x2c\xf9\x37\x0d\x46\x16\xca\xd8\x0a\xc3\x6f\x56\xcb\x7f\xee\xb7\xcb\xd9\x53\x77\x3d\xe0\x68\x42\xd7\x03\x66\x13\xd7\xa4\x68\x20\xdb\xf7\x9c\x3d\xcd\x67\xbb\xdd\xec\x6e\xbd\x3d\xdc\xaf\xbe\x2f\xfd\x2f\x95\xb2\x48\x04\xc7\xd2\x39\x86\xbe\x4e\x6e\xaf\x65\xcc\x9d\xc6\xc9\x00\x48\xb6\x98\xe0\x65\xc6\xb7\xd7\x4a\xe2\x77\x73\x48\xe5\xa7\xfd\xe6\x8b\x8b\x1b\x66\xf1\xeb\xf5\x75\x9d\x93\xef\x91\x2a\x4c\x92\x58\xb0\x9c\x4f\xec\x8c\xae\x12\x05\xc4\xee\x3b\x07\x28\x5a\x0f\xcd\xda\x3e\x93\x67\x8a\x02\x4e\x2c\x96\xbf\x93\x57\x43\x43\xea\x37\xdf\x2c\x48\x12\xbb\x80\x3c\x8e\xc8\x7b\xdf\xa4\x6d\x9a\x02\x0a\xed\x34\x69\x7f\x95\xbf\xfd\xab\x7f\xbd\x41\x19\x05\x60\x02\x3e\x54\x85\xc9\x9e\x01\x77\xaf\x6b\x6a\x58\x16\x05\x26\xb6\xa9\x6a\x57\xdb\x6e\x7d\x97\x9b\x13\x26\x0a\x0c\x0f\x2c\x28\xdd\x12\x6a\x4e\x2e\x15\xc6\x56\x70\xba\x6c\xe7\xfc\x7d\x96\xe7\xf5\xd8\x54\x88\x48\xc2\x70\x4b\x5d\x58\xf6\x22\xa8\xee\xa4\x1f\x8a\x24\x0e\x58\x38\x84\xb0\x1c\x4c\xd0\xb5\x71\x1b\x98\x3a\xb6\xfb\x98\x93\xd3\xbf\x2a\x7d\xf4\x1c\x91\xee\x37\x34\xd0\x31\xf4\x7c\xe1\x7e\x4f\x8c\xa8\xe3\x48\x75\x32\xd5\x35\xd6\x33\xae\x7c\x48\x9a\x45\x54\x18\xac\x85\x79\xca\x72\xa8\x9b\xb2\x00\x5b\x41\x38\xac\xc1\x63\x11\x35\x16\x81\xdb\x87\x61\xac\xd4\xc5\x78\xb4\x58\x92\xe0\x82\xd5\xd0\x40\x75\xcc\x0a\x18\x72\xa8\x8e\xba\x79\x4b\xd6\x83\x28\x27\xed\x1c\x5c\x12\x63\x5e\x09\xf5\x6e\xb1\x82\x4f\x99\xd6\x39\xe2\x94\x57\xee\xc6\xdc\xf5\xe7\x34\xc0\x53\xd4\xe1\xee\xcf\x75\x53\x1e\xa7\xea\x56\x5d\x57\xce\x5d\x9e\x10\x91\xfd\x0e\xd6\xe2\x5a\xd3\x90\x83\xb3\x05\x30\x5d\xf7\xfd\xca\x7b\x8a\x52\xca\xb1\x0c\xff\xf0\x26\xea\xfb\x5c\x5c\x93\xfb\xf9\x7e\x32\xc2\x0a\x88\x63\xe9\x78\xda\x2c\x38\xd1\x46\xed\x00\xf4\xd0\xe8\x8e\x52\x57\x77\xfc\x0a\xcd\x3f\x4a\x39\x99\x42\x22\xb2\xb1\xaa\x37\x51\xe8\x1c\x5a\xa3\xe4\x73\xc0\x1b\x36\xb9\xad\x00\x16\xd9\x7d\xd1\x41\x77\x47\x12\xa2\xae\x93\x64\x02\x93\x3f\x3b\x99\x97\x4a\x89\x76\xff\x29\x27\xaf\xa9\x48\x8c\x7c\x2a\x59\xfd\xed\x7c\x14\xd3\x15\xa4\x58\x22\x12\x87\x91\x7a\x15\x0d\x7c\xb7\x6c\xf7\x7e\x23\xbb\xae\x58\x64\x91\x8e\x14\x52\xf2\x59\x62\xb3\x6f\x2b\xff\x2c\x3a\x96\x38\xb1\x1e\xc5\x51\x96\xce\x78\xfb\x5b\x1c\x38\x2c\xd2\x49\x20\x7c\x0e\xab\xa3\x95\x24\xdd\x85\x93\xd8\x93\x45\x3d\x9f\x8f\x08\x9f\x87\x6e\xce\x6b\x99\x08\x87\xe0\x7a\x7c\xfc\x6e\x7f\xc9\x7d\x23\x10\xea\xf3\x9f\xf3\x97\x97\x97\xaf\xc4\x16\x7c\x6f\x9a\x7a\xe6\xce\x4d\x59\xe6\x53\x28\x03\x8b\x4c\x1c\xa0\xdb\xef\x06\x69\x32\x2e\x26\x26\xda\x25\xa4\xef\xac\xc8\xac\x9e\x8b\x3a\x53\x73\x91\xe7\x65\x53\x3f\x4f\x26\x83\xa1\x1c\xc3\xac\x76\xf3\x9e\x72\x12\xb1\xc8\xa8\x04\xcb\xf8\x0f\xc8\xbe\x51\xc1\xac\x58\x17\x0f\x65\x3b\x0f\xc4\xa9\x53\x5d\xb0\x7d\xe3\x20\x89\xd0\x4a\xc4\x34\xd5\xae\xcc\xf5\xd0\x05\x8e\x03\x96\x62\xd9\xc7\xec\xdc\x4c\xf3\x4d\xbe\x07\xb7\xc5\xc7\xed\x27\x8b\x76\x4d\x79\x3a\x75\xfb\x45\x1c\xa4\x26\xf2\xb6\xdf\x23\xaa\xcf\xbe\xb4\x67\xc1\x88\x8a\x82\xc5\xa1\x8a\xf1\x68\xcd\xcb\xa6\xb1\xd8\xf7\xa1\xd9\x10\x87\xda\xd2\x25\xce\x4e\x7f\x0e\xbc\x8b\x38\xa2\x96\xcc\xe9\x15\x9a\xd9\x76\x55\x7c\x58\xb2\x9b\xbe\x94\x8b\xc5\x51\x4a\x2c\xc1\xb0\xc5\xae\x89\xa6\xac\x66\x79\x05\x42\x5f\xda\x15\x7d\x3b\xaa\xc3\xe2\x08\xa4\xb7\x10\x6d\x04\xec\x0e\x8a\xf2\x68\x15\x71\xfc\x95\x49\xa4\x50\xa5\x6c\xf7\x70\xef\xff\x44\xa3\x30\xf1\xc8\xa7\xfd\x5b\x55\x7e\x1e\xda\xff\xd7\x3e\xce\xb0\xf4\x69\x21\x6a\x17\x91\x68\xad\xf9\x73\x77\x58\xc6\x8c\x05\x60\x5d\x97\x83\x07\xce\x5a\xc7\xbb\x1b\x4b\x66\x22\x46\x3a\x7a\xa0\x3b\x38\x8a\xe9\x67\x8f\x79\xc2\x10\xca\xa1\x41\x9c\x9b\xb7\xb2\xca\xfe\x84\x9b\xd6\x44\xcc\x21\xc1\xad\x12\x91\x1a\x7b\xf1\x0e\x0e\xbf\xec\x9a\x53\x91\x60\x8c\xa9\x2e\xc4\x69\xf7\x56\x36\x37\xeb\x65\x58\x9c\x4a\x81\x20\x99\x53\xa6\xca\x53\xdd\x55\x64\x1f\xe0\xe7\xc0\xe2\x8e\x53\x65\xb5\x32\x73\x78\x05\xe4\x89\xe9\x1a\xc0\x92\xe5\x64\xfa\x60\xca\xea\x70\xae\xa1\x6a\xfd\xbe\xa1\xcc\xd0\x78\x91\xc5\x22\xb1\x15\x46\xfd\xf1\xa3\x0f\x4d\x57\xb1\xc2\x62\x99\x58\x7a\x1c\x79\xce\xdf\xbf\xe2\xac\x60\xb1\x14\x06\xeb\x56\x4f\x55\xf9\xf3\x72\xc8\xbc\x5b\x36\x80\x9d\xb2\x58\xc5\x01\xb8\x9d\x61\xb9\x5b\x6f\xba\x3f\x73\x8d\x5a\x99\xa7\x8f\xd3\x7f\x9f\xe1\x0c\x3d\x91\x25\x8b\x95\x4a\x91\xb3\x71\xa6\xf5\xdd\x7a\x3f\x60\xa1\x60\xb1\x0e\x12\xbf\xba\x77\x6f\xc2\xff\x40\x27\x29\xbe\x3f\x32\x22\xce\x3b\x11\x16\x16\x43\x60\xc1\x9f\x5b\x68\xaa\x0c\x3e\x60\xd1\x31\x53\x77\x83\x6a\x08\xc8\x41\x1d\x6f\xcf\x17\xf5\x57\x85\xaa\x7d\x44\x81\x04\x31\xd1\xc3\x2c\xfc\x03\x14\xc1\x28\xab\xe9\xfb\xb1\x90\xb9\xc3\xf2\x20\x45\x71\x9d\x24\x61\x24\x30\x52\xf9\x75\x6e\x01\x51\x1b\xa8\x1c\xda\x9f\x91\x30\xe8\x06\x73\x9e\x35\xf5\x70\x68\x48\x28\x69\x60\x49\xd7\x8b\x8e\xfb\x66\x72\xf1\x28\x20\x08\x92\x7c\xce\x3f\x6e\x26\x5d\x87\xbb\x11\x89\xa8\xc4\x8f\x7b\xb6\x79\xc0\x91\x05\x3c\x48\x90\x7f\x49\xdd\x3c\x6e\xf3\x17\x65\x29\x26\xb3\x71\x8b\x5c\x8a\xaa\x57\x54\x60\x24\x26\x80\xc7\x8f\x18\x5a\xf2\xbe\x1e\xc4\xf7\xd1\x16\xe4\x3f\x47\x51\xe0\xf9\xd9\x2f\x01\x42\x92\xd8\x72\x54\x20\xd7\xf4\x22\x07\x51\x21\xc3\x59\x36\xf5\xcd\x27\x25\x9c\x8c\x10\x2e\x46\xea\xfc\x96\x56\xf3\xa6\x4b\x40\x12\x1a\x23\xe4\x7e\xa0\x12\x3c\xf5\xf2\x08\x85\x08\x9f\x04\x63\x9c\xea\x6d\x20\x27\xea\x3b\x98\x18\x11\x5b\x99\x2a\xf1\x90\xf0\x85\x50\x6d\x8b\xc2\xd9\x7d\xb2\xc7\xf6\x53\xeb\x36\xdf\xb2\x4a\x08\x0b\x13\x4c\x97\x38\x6a\xa6\xd1\x23\xfb\x2e\x44\xa3\x17\x7c\x12\x97\x41\x2e\x81\x91\xd6\x16\x34\x2e\xfc\xbb\x83\x42\x2f\x06\xfc\x04\xff\x35\xb9\x04\x23\x71\xd2\x51\x09\xff\x28\xab\xf6\x44\xeb\x8e\x0d\xc2\x44\x82\xa5\xbf\xc2\x06\x34\xe6\xd9\xb8\xaa\x86\x11\x26\x2d\xd7\xad\x15\x3c\xc6\xf0\xca\x75\xda\x94\x91\x34\xb0\x15\x50\xda\x52\xe8\x56\xcd\xb8\xba\x8c\x91\x34\xb6\x04\xa2\x2f\x8e\x5d\x1b\x8e\xd9\xf9\x38\x02\x01\x4f\x86\x27\x95\x96\xb6\x7b\xfe\xf2\xc7\x72\x7b\x58\x7c\x5b\x2e\x7e\x3f\xec\xf6\xcb\xcd\xe4\xf9\x52\x9d\x62\x1d\xc7\xa3\xa8\x9b\xa5\x15\xeb\xf4\x67\x04\x11\x04\x68\x3c\x62\xc7\x45\xc6\xae\xf1\x7d\x24\xa3\x54\x74\x61\x8e\xf9\x2f\x38\x7b\xa6\x72\xbc\x8c\x28\xca\x64\x3c\x52\x19\xff\xfd\x8f\xc5\xae\x11\x53\x03\x99\x28\x96\x60\xce\x53\x97\x45\x63\xe1\xab\xfe\x19\x35\x8b\x41\xf9\x7c\xdc\xae\xa3\x73\xbd\xf2\x6b\x7c\x77\x10\xb8\x79\x60\x2c\x67\x97\xbd\x8e\x13\xb9\xb7\x30\x92\x57\x73\x1b\x38\x4d\x9c\x4b\xdc\x9d\x0a\x33\x14\x78\xbb\x8e\xb3\x12\x48\x25\x06\x2d\x4f\x9f\x5f\x38\x83\xc4\x10\x5b\x0c\xe2\xca\x06\x2d\x09\xb3\x7e\x12\xff\xdb\x13\x3d\x3b\x80\xc4\x60\x0b\x30\xd2\xa6\xd6\x70\xac\xbc\xcf\x3d\xb8\x6d\x6b\xb1\x71\x47\x09\x67\x73\xda\x93\xbc\xfe\xf8\x21\x92\x40\x88\x91\xc0\x19\x66\x70\xac\x32\xc2\x68\xfc\x92\x90\x26\xa8\x48\x57\x65\xaf\x6f\x4d\x14\x8d\xe7\x42\x12\xb2\x84\x7b\x9e\x11\x0b\x13\xb4\x5e\x4a\xcf\x1a\xce\x92\x50\x46\x38\x5f\xce\x05\xa2\x1b\x5b\xa7\xe5\x22\xf2\xe6\xd2\xb5\xab\x08\x0b\xc0\x9e\x66\x8b\xfe\x4f\x1a\xf5\x2d\xfb\x02\x19\x96\x44\x94\xe0\x71\x27\x20\x37\x1d\xc8\x0d\xbf\x6a\x9d\xbd\x76\x9d\x8c\xb6\xd2\x05\x96\xb3\xfb\x8b\x97\x8f\x43\x8a\x11\xfd\x45\x29\xb3\xe2\xad\x2c\xf5\x30\xde\x9f\x10\x63\x43\x7c\xb5\x23\x2b\x1c\xa0\x1c\x47\xff\xeb\xba\x27\x71\x80\x23\xef\xaa\xae\xbd\xaf\x7a\xf3\xc6\x89\x60\xb4\x57\x90\x45\x34\xfb\x78\x75\x26\x89\x48\xb9\xd7\xae\xf7\x61\xbc\x65\xa1\xaf\x65\x57\x58\x42\x49\x80\x6b\x49\xf9\x7e\x0b\x0c\xa1\x75\xab\x39\xa1\x54\x12\xe7\xd9\xcc\x27\xd8\x05\x96\x50\x99\x78\x73\xf0\xae\x2a\x4f\x43\x3e\x3c\x96\xb0\x48\x21\x57\x4e\x01\x9f\x57\x44\xbd\xe3\x87\x40\x5b\xd6\xd3\x48\x7d\x8a\x4a\xff\x10\xf5\x0e\x8a\xe9\xdd\xb8\x31\x98\xb6\x6f\x9b\x3a\xbc\xf6\x40\x07\x7b\x72\xd5\xd4\x21\xe5\x06\x55\xc6\x38\x02\xf5\x06\xaa\xdf\xb3\xce\xf2\x4f\x44\xc4\x12\xd9\x6b\x16\xea\xc7\xcd\xde\x37\x49\xae\x63\x35\x90\xd8\x01\xfd\x75\xd1\x19\x4b\x24\x08\xcc\xe8\x7e\x3b\x8b\xfd\xb9\xf4\xd7\x50\x4a\x22\x8f\x11\xe6\xef\x9c\xba\xcd\xf8\x73\x29\xc3\x10\x51\xd5\x3a\x0f\xaa\xcc\x0a\x0b\x16\xf1\xbf\xd7\x31\x41\x16\xbd\xd5\x62\x3d\xc1\x3f\xbb\x0e\x90\x68\x6e\x77\x96\xdc\xdc\x81\x25\xac\xf8\x05\x5d\x03\x4b\x40\x46\x24\xe8\x6b\x5b\x45\x9e\xef\x4e\x18\x1e\xbb\x32\x57\xfd\x0f\x54\x12\xb9\x91\xdc\x9d\x84\xba\x66\x49\x63\x89\x11\x09\x7a\x96\x3f\xcb\x6a\x8b\x3a\x8b\xd7\x90\x4d\xdf\x53\x72\xb4\xe4\x6c\x3a\xf0\xb3\x8b\xa3\x26\x46\x2b\x0b\x5f\xc6\x19\xd8\x85\x80\xc6\x37\xa2\x81\xb6\xdc\x99\x87\x8e\xa4\x1e\x3f\x6a\xbb\xa5\xb9\x71\x75\xa1\x70\xb7\xb4\x68\xc8\xac\x5c\x63\x56\x2f\xff\x73\xce\x4e\x5f\x80\x42\x18\x0d\xb9\xc0\x51\x79\x5c\x3d\xad\xf6\x87\xcd\x76\xfd\xe4\x88\x64\x18\x8d\x02\x7b\x9a\x67\x05\x6e\xb3\x87\xfc\xba\x60\x88\xd1\x88\x69\xd1\x41\x37\x5f\x8a\xbc\x3d\x64\x41\x5f\xa1\xa2\x18\x8d\x78\x8a\x2b\x6a\x1e\xcd\x9e\xef\x54\x6f\x15\xd0\x08\x42\xdc\x9e\x85\xb6\x10\xd8\xab\x23\x71\xb0\x97\xd3\x98\x49\x3c\xc1\x5c\x72\x7d\x0b\x42\x43\xe5\x41\x92\x37\x4f\x31\x4a\x92\x18\x99\xd6\xda\x65\x8e\xd6\x82\x57\x62\xf2\xed\xcc\xa0\x90\xaa\xcd\x7c\x76\xaa\x8c\x37\x57\x17\x25\xc0\x85\x35\x92\xaa\x66\x53\xd6\xdd\x35\x40\x3a\xd1\xca\x57\x97\xc7\xbf\x2f\xab\x8e\x7a\xf7\xf6\xa5\x92\x80\xe3\x46\x6d\x8d\x14\xab\xc4\x79\xd3\x65\xa4\x09\x09\x6d\x46\xf8\x94\x77\x8e\x22\x4d\x48\x8c\x05\xd4\x6f\xa2\x5e\x9f\x60\x60\x16\xd3\x84\x03\xda\x9c\xb2\xdd\x81\xef\xc0\x96\xa1\x74\x24\xde\x8c\x26\x92\x4a\x97\x18\xc3\x62\x45\x9c\xd7\xa3\xb5\x42\x13\xa0\x40\xba\x3a\x14\xeb\x0d\x77\x3f\x07\x85\x81\xa9\x3e\x6a\x2a\xc2\xf0\x9b\xa8\xdf\x0e\xee\xfd\x7c\x47\x4a\x13\x6b\xd7\xa2\xe4\xde\x9f\xae\xcc\xa3\x2f\xf1\x61\x94\xa6\x11\x9e\xa4\xba\x41\x46\x9b\xac\xb9\xec\x0a\x71\xaa\x5b\xb7\xf7\xf6\x6c\xa5\x4a\x7b\x7e\x02\xef\xb1\xf4\xd6\x30\xa5\xa0\x30\x1d\x6a\x59\x91\x20\x6f\x1c\xbe\xf7\x36\xf6\xc5\xfd\x88\x05\x12\x1d\x5b\x6b\xa1\xcf\xce\x83\x32\x9f\x6b\x13\x85\x32\x6e\xb4\x43\xec\x3d\xc3\x67\x27\xf1\xf2\x35\x44\x91\x51\x66\x34\xee\x8f\xbf\x6f\xff\xe8\xb6\x58\xca\x0c\x60\x15\x6d\x47\xad\x3c\xeb\x74\x5c\x18\xe5\x91\xc0\xe0\xde\xe2\x65\xfb\x7d\x79\x58\xbc\xec\xd7\xf7\xf7\x87\xbb\x97\xed\xac\xd7\xe7\x61\x94\xc7\x12\xf3\x25\xcb\xfd\xde\x43\x6d\x19\xe5\x24\x88\x1c\x0c\x7c\x53\x95\xfa\xac\xae\xac\xb5\x89\xd1\x36\x34\xd6\x28\x4f\xa3\x18\xf7\x8c\xd7\x22\xeb\x3f\x92\x88\x08\x96\x5a\x67\xf5\xde\xc5\xcf\xce\x3d\x83\x38\xa3\x42\x40\xe4\x23\xb6\x50\x65\x26\xeb\x10\xc7\x93\x59\x2c\xb9\x4a\x6c\x68\xba\xbd\x0a\x7a\x6b\xd3\x14\x19\x95\x9a\x21\x94\x40\x67\xb5\x90\x39\xac\xea\xfa\xdc\x17\xfe\x30\x2a\x4d\x84\xfa\xb7\xbb\xa6\xac\x8e\x37\x12\x0b\x54\xb6\xc7\xea\x00\x4e\xba\x11\xaf\x6e\x4b\xe6\xbf\x28\x39\x65\x54\x05\x06\x51\x3f\x8e\x2e\x30\xcf\x2c\x0b\xb7\x3d\x96\xc7\x7c\x7e\xfe\x17\x21\xf8\xa4\x13\x8a\xe4\x9d\x9a\xc7\x4c\xc8\x7c\x58\x3c\x30\x7e\x34\xc5\x89\x95\x01\x46\x36\x1a\x7b\xa6\x59\x4e\xaf\xc9\x85\xd3\x00\x6b\x3a\x8f\xce\x28\xf4\x2b\x62\xe5\x6d\x13\xaa\xc0\x2a\x7c\xa3\x13\xb7\x87\xe3\x29\x1f\x2c\x29\x65\x08\x12\xa9\xcc\xb3\x7d\x59\xf9\xd3\x98\xea\x88\x61\x5a\xe0\xe0\xd3\x33\x0e\x51\x74\x7b\x49\xe8\x38\xc1\xb4\xb1\x38\xeb\xac\x29\xdb\x95\x84\x31\x66\x7f\x31\xe0\x56\x7e\xc8\x69\x98\xb4\x9b\x12\x6a\x55\x1f\x87\x66\xfd\xed\x41\x80\x34\xe4\x16\xc8\xdd\x88\x7c\xf7\xde\x1f\x02\x86\x6b\x3c\x1e\x77\x7f\x3c\xcd\xd7\x8f\xdd\x5f\x53\x9b\xcd\xc0\xc7\xab\x9b\x6a\x32\x54\xc6\x80\x85\xcf\xa2\xdc\x5a\x56\xb4\x93\xb3\xe7\x83\x62\x2c\x08\x89\x5f\xac\x0f\xdf\x97\x9e\x5e\xe2\xff\xe3\x3f\xdd\x35\xad\x33\xa1\xcb\xcf\x22\x2f\x85\x46\x73\x7d\x98\x18\x65\x41\xa8\x30\xa8\x2b\x45\xa3\xde\x7a\x54\xe6\x35\x18\xcb\xf7\x17\x1c\xbd\xfb\x7b\x51\x09\x6d\x31\xf6\xbd\x45\xcd\x02\x95\xe2\x6e\xbb\xbf\x5b\x0e\x19\x36\x18\x0b\xa5\xa2\x4e\x56\x1a\x2a\x2b\xe6\xd8\x5b\xa1\x2c\x4a\x08\x72\x5b\xb9\x9b\xee\xcb\xdd\x59\x76\x64\xc5\x5f\x24\x47\x59\x44\x19\x08\x97\x35\xf4\xb4\xd3\x96\x4e\x68\x64\xc8\xfb\xde\x3c\x12\x72\xb0\xbd\x7b\x98\x82\x6b\x8e\x45\x6c\xec\x7c\xff\x39\xab\x6b\xcc\xbf\x7b\x5e\xf5\xbe\x8b\x44\x77\x3a\xab\x37\xdf\x37\x63\x0a\x6c\xc6\x62\xc5\xb0\xfe\x70\xff\xb4\xfb\xe3\xa6\x74\x84\xeb\x47\x02\x02\x1d\x41\x70\xeb\xdc\x94\x85\x27\x92\x18\x0f\x18\x49\x0c\x26\x9e\xe6\xe7\x61\x50\x82\x11\x0a\x56\x47\x5d\x4c\x18\x02\x19\x23\x29\x20\x98\xaf\x2a\xd5\x3b\x20\x4a\xf6\xa5\x68\xb2\xfc\xa9\x9c\xc2\x27\x58\x12\x48\xb4\x65\x71\x26\x2e\x9b\xb7\x07\x18\x4a\x33\x32\x96\xa4\x0a\xe9\x42\x3c\x9f\xb7\x7d\x32\xa7\x20\xe7\xfa\x50\x9e\xe0\x68\xe0\x99\xec\xd1\x01\x33\xf5\x25\x4c\x6d\x24\x47\xcf\x18\x0b\x52\xe4\xfd\x94\xe7\xcb\x01\x0a\xe4\xe9\x54\x65\x05\xb7\xab\x06\xf1\x1f\x07\xe7\xef\xfe\xcb\x5d\x88\x9b\x38\x72\x53\x67\x96\xbf\x4e\x2c\x5e\x96\x86\x41\x38\x28\x05\xfe\x51\x65\x37\x8a\xea\x7c\x5f\x41\xd1\x00\x38\x38\x9d\xb4\x2f\xd1\x76\x03\x0b\x8f\xa5\xc2\xb2\x24\xdd\x89\xf2\xc5\xa2\x38\x26\x96\x3f\x13\x41\x8a\xfb\x1f\x62\xfc\xb2\x62\x63\xe3\xb0\xd3\xd8\x25\x13\x24\x0d\x5c\xe5\xdf\x53\xd6\xa9\x6d\xdb\xa5\x3a\x7e\x27\x21\x02\xa1\x07\x51\x05\x0b\x43\xba\x75\x88\x31\x21\xb5\x77\xfd\x30\xa1\x65\xb5\xc7\x90\xf4\x71\x9c\x87\x0c\x53\xbf\x63\xc8\x90\xfb\x2a\x3d\x4f\x90\x3e\xdc\xa4\x24\x35\xd4\x59\x63\x8b\xed\x9b\xa8\xdf\xd6\x66\xb1\xf5\xa5\x93\xb7\xd7\xa9\x0a\x35\xc6\x15\xce\xc5\x7b\x51\x7e\x16\x3d\x6f\xf9\xa4\x1b\x61\x69\xe8\xd9\x40\x06\xa2\xcf\x6d\x8b\x41\x5d\x9a\x83\xe9\x4a\xd2\x2d\xf9\xa7\x6f\x17\x11\x26\xf3\x8f\xb6\x60\x66\x55\x6f\x86\xe9\x10\xa6\x69\x64\x3a\x3a\x13\xeb\x64\x1e\xba\x36\x41\xad\xf0\x45\x2e\xb2\xe3\xea\x78\x04\x9d\x79\x36\xb1\xe9\x58\x6a\xe5\xb8\x5f\xa0\xf9\x56\x96\xef\x5d\xe9\xe6\xed\x91\xd7\xc6\xe0\xfc\xfe\xdf\xf6\x93\x67\x79\x2e\x50\xc5\xd5\x45\x84\xc7\x63\xcf\x27\xe3\x05\xc4\x96\xfa\x63\x88\xfc\x0f\x71\x59\xd5\xcf\x65\xb3\xfe\x80\x6a\x97\xfd\x6c\x2e\x8e\xeb\xd9\xbf\x00\x70\xc9\x1d\x23\xab\xd5\x04\x1a\x52\x20\x30\x66\xa2\xd4\x1b\xcf\xf7\x00\x3f\xb2\x42\x97\x9f\xbf\x75\x6d\xc6\x73\x4a\x59\xcb\x61\x02\x45\xe9\xed\x48\x1e\x04\x80\x47\xac\x39\x17\xda\xb2\xac\xf9\x86\x28\x49\xa1\x93\x0a\xaf\x06\x52\xe1\x8c\x07\x9a\x53\xe6\xc5\x98\xda\x2d\x6c\x6c\xd3\x0d\x27\x8b\xdb\x15\x78\x98\x18\x8f\xb4\x5d\x15\xcd\x7d\x06\xb9\x8e\xfc\xe5\x22\x69\x6b\x06\x0f\xaa\x2c\x4c\x56\x1d\xc7\x03\xce\x89\x12\xb8\xb1\xde\x43\xd3\x23\x82\x38\xd1\xda\xea\x72\x80\xb0\xb0\xf2\xae\x76\x80\xf1\x24\x4a\x44\x38\x14\xfb\x9a\x5f\x50\xa9\x6b\x38\x80\x3c\x01\xc3\x9c\xd4\x2b\x56\x03\x1c\xba\x5f\x9b\x20\xee\xd6\xeb\x6b\x25\xd0\xd4\x1c\x0c\x19\x0d\xa4\x74\x78\xe8\x7d\x39\x0a\x16\x70\x1a\x01\x8a\x3a\x18\xff\x45\xe6\x43\x2a\x97\xd1\x64\x40\xf8\x01\x41\x95\x5c\x2b\x50\x73\xd8\x2e\x7f\xcc\xb6\x77\xdd\xa5\xa4\x4d\x62\x7c\xcb\xfe\x4e\x8d\x59\xdb\x1f\xb0\xbe\xf8\x69\xf6\x8f\xf5\xf6\xf0\x7d\xb9\xdd\xf5\x36\x3a\xa7\x4a\xf2\xbe\x92\xea\x11\x8e\x65\x61\x21\x2f\xdb\x1e\x1c\x70\xd7\xc7\xe9\x38\x0b\x14\xc6\x64\x5c\x25\xd5\xaf\xc0\xfa\x8c\x73\x2e\xd0\x15\x76\x25\xd2\x03\x20\xf2\xf8\x3b\xa6\x11\xb7\x40\xe4\x76\xfb\x3b\x84\x87\xe1\x17\x4b\x53\x8d\xb3\xed\x20\xcf\x17\x7b\x76\xee\xf7\x4f\x5f\x56\xb8\x8c\xaf\x2b\x98\xc5\xeb\xc3\xcf\xa6\x12\x4b\x97\x25\x1b\x6f\x41\x5c\x30\xcb\xde\xef\x82\x76\x28\x72\x35\x22\x38\xbd\xe9\x88\x70\x45\x25\xee\x0c\xba\x53\x7c\xbd\x99\x89\xe1\x4a\xa5\xaa\xd3\x9c\x79\x87\xe2\x19\x7e\xda\x82\xe9\xc9\x63\xe8\xd0\xe6\x03\xec\x7e\xb6\x59\xdd\x4d\xdb\x13\x82\xc4\xa1\xee\x50\x7b\x86\xcf\xd6\x9a\xf4\x8f\xea\x3b\xe9\x00\x73\x04\x4f\xe5\x47\x06\x5f\x72\xb8\x31\x0e\x24\xc2\x13\xd2\xab\xea\x7d\xb7\x9a\x7a\x23\x1a\x25\xc6\x41\xc7\x91\x15\x43\x79\x6d\xd7\xc8\x0f\x8b\xd8\x98\xac\xe4\xf1\x80\x1b\x11\x62\x8a\x15\xfd\xec\x7d\xb9\xdb\xdc\xed\xa6\x26\x31\x37\xc2\x1e\x0d\xdf\xfe\xe9\x03\xc2\xdc\x80\x95\x34\xaf\x1b\x9f\xb5\xe6\xbd\xb6\xed\x7f\x9d\x07\x45\xfc\x2c\x0d\x62\xce\xec\xea\xfe\x18\xd6\xe2\xb0\x34\xe0\x26\xe8\x39\xad\x87\xca\xac\xbe\x43\xca\x8d\x3b\x18\x97\x96\x45\x75\x2c\x44\xec\xba\xc5\x49\x8a\xba\x08\xfb\xb7\x0a\x60\xe6\xdd\xe1\xf6\xcf\xd4\xb3\xa8\x8b\xe2\x6a\xe6\xfb\x5e\x46\xa2\x40\xcc\x87\xc8\x3b\xbd\x0d\x96\x12\x1e\x20\xaf\xce\x00\xc5\x15\xa6\x37\xe2\x11\x29\x01\x86\x15\x92\x42\x6b\xe4\xe8\x50\x60\xb9\x40\xc6\x43\x40\x40\x26\x2e\xea\x87\x21\xec\x9e\xab\x8b\xa5\x34\x06\xee\xb9\xfe\x9e\xe1\xd3\xa2\x45\x6c\xa1\xf2\xaa\xfe\x13\x3a\x7f\x2b\xa5\x14\x30\x67\xe6\x2d\x8a\xd3\x79\x52\x6f\x30\x70\x29\x52\x9a\xda\x00\x98\xb2\x0e\xdf\x1c\xb9\x50\xba\x2b\x41\x80\xf6\x7f\xa7\xa2\x80\x8a\xf9\xd6\xbb\xf5\x7a\x40\xe3\x51\x62\x61\x80\x89\x72\x5c\x97\x13\x31\xa9\xdb\xe3\xca\x84\x72\xa2\x2a\x7a\x07\x79\x9e\x15\xaf\xab\x06\x8e\xbf\xac\xfc\x61\x29\x93\x34\xb4\x85\x51\x5d\xf2\x78\x23\xa6\x81\xf6\x94\x19\x86\xf0\x3c\x24\xd1\x5e\x3d\x3c\x1f\xf6\x7f\x6c\x96\x77\x87\xbb\xd9\x7e\x76\x98\x6d\x1f\xbe\xcd\x76\xdf\xfc\x9b\xf2\x50\x6a\x2b\x6d\xa5\x7b\x09\x71\x96\xf2\xc8\xd2\xf7\x09\xad\xb7\xa0\xb2\x53\x36\xf4\x32\xc7\x37\xe3\x4c\x20\x95\x9a\x97\x7e\x7d\x12\x3f\xf1\x8c\xf6\x64\xba\xdd\x25\x85\x54\xe0\x2a\x04\x1e\x4b\xf5\x3e\x88\xbd\xa4\x69\x98\x60\xdb\xfb\xfb\x1e\xea\x66\xb5\x58\xa7\x61\xd7\x14\xd9\x88\x33\x74\xc6\x5b\x9a\xd2\x10\x93\x7e\xad\x51\x82\x38\xde\x69\x44\x23\x15\x91\xe4\xce\xc8\x41\xf8\xf1\x53\x76\x2d\xdd\xea\xbb\xc6\x0a\xe1\xa3\x2e\x1b\x72\x67\x63\x20\xfe\x56\x22\x65\xc6\xe6\xee\x76\xa7\xd6\x41\xf8\xb9\x11\x97\xd6\xe3\xbe\x2f\xab\xa7\xc5\x8f\x71\xfc\x2e\x15\x4a\xe8\xb8\xdf\xd0\x3a\x0b\x71\x55\xcc\xcf\xf9\xfb\x14\x96\x91\xca\x28\x02\x2c\x16\x81\x66\x5d\xcc\x90\x88\x74\xfc\x16\xca\x08\xb0\xd2\x4b\x8f\x37\x2a\x31\x6f\x19\x5d\xa9\x0e\x04\x1a\x5d\x4a\xe4\xf9\xae\x3c\xc2\xfd\xb9\xc0\x0d\xe3\x7b\x26\x56\x45\x01\x55\x37\xac\x9a\x52\xde\x73\x4e\xe2\xe5\xaf\x24\x97\x59\xaa\x95\x41\x5f\x02\x44\x95\x67\xed\xce\xda\xfa\x39\x4d\x7f\x94\xa5\x10\x49\xa7\xe2\xfa\x98\xd5\xcd\xec\xcb\xc2\x9c\x14\x44\x8a\x68\xbe\xef\xa5\x8b\xf2\x74\x57\x90\x9a\x19\x8f\x4a\xc5\x63\x04\xe1\x47\x5d\xb3\x4e\xc9\x20\x61\x32\xde\xcf\x53\x93\x44\xbc\xa7\xb5\x76\xbe\xf0\xb0\xd2\x20\x35\x8a\x05\xbe\xdc\x7f\x2e\x6a\xd8\x35\x1e\x98\xf8\x52\x67\xc5\xab\x55\xf9\x74\x12\xf0\x7d\x2e\x5b\x04\xa1\x0d\x2d\x63\xf6\xf2\x49\xa8\xb7\xcc\xeb\x7a\x30\x11\x50\xe1\x35\xda\xda\x85\x0b\xd5\xc3\x59\x54\xa2\x68\x00\x7e\x1b\x82\x79\x7d\x6f\x16\x22\xd5\xf9\x5d\x59\x0c\x39\x52\x98\x08\x38\x41\x05\xe0\xd9\x6a\x7b\xb7\x5d\x6f\x0e\x48\xf8\x76\xe8\x76\x67\x11\xc8\x08\xe3\x28\x4e\xac\x1a\xf2\x72\xf9\xb3\x81\xa2\x1e\x42\xa7\xc7\xc6\xa3\x08\x00\x10\x1d\x7e\x14\x3f\x9b\xe1\x41\x22\x02\x23\x3c\xb4\x0f\x73\xad\x5d\x80\xa4\xdd\x1d\x07\x7e\xa0\x88\x28\xc7\xda\x5b\x8b\x96\xf7\xd5\xf6\x23\xac\x72\x6f\x1c\x8a\x38\xb6\x39\x5c\x74\x49\x3a\x16\x42\x27\xc7\xc3\x44\x4c\x12\xe6\x61\xdf\xa3\x62\x8a\xf1\x08\x91\x00\x10\xbb\x77\xb4\x10\x09\x16\x85\x7f\x67\xff\x14\x44\x11\x24\x54\xe8\xf6\xe8\x9d\xc8\xc1\x65\xde\x6f\x6d\xa2\x93\xa5\x22\xa8\x08\x50\x39\x4c\x0a\xf5\xbe\xae\x00\x19\xb2\x86\x45\x15\x82\x91\x00\x27\xd7\xfc\x7c\x79\x84\x0f\x4f\xf2\xcb\x04\x03\x85\xbc\x19\xad\x17\x71\x40\xd5\xef\xff\x13\xc7\x1a\x13\x3c\x60\xb8\x3b\x0d\xe2\xc5\xc3\x25\xed\x7b\xc9\x98\x38\xad\x9a\x02\xc6\xe2\xbb\xb7\x2f\x9b\x86\xa9\xec\x73\xb5\xed\x71\xd5\x1f\x7d\xff\x13\xd2\x7f\xff\xdd\x9a\x69\x7f\x39\x61\xf1\x7d\x38\x05\x10\xac\xd6\x4d\x27\x41\xac\x1e\xd8\x53\xd6\xbc\x55\x59\x3e\xab\xaa\xf2\xb3\x6f\xd4\x29\xb2\x46\x8b\x23\x74\x42\xdb\xf5\x74\xf3\x13\x92\x82\x72\xfe\xf9\xda\x18\x68\xdf\x7e\x7e\xe9\x90\x9a\x37\x9c\x2a\x21\x85\x74\x3e\x5a\xbb\x57\x21\x76\x73\x18\x69\x12\x2a\xa1\x58\x6c\x71\x3a\xd7\x6f\xce\x05\xfc\x02\x2b\x31\xb8\xa8\x4a\x2d\x21\xb1\xdb\xb2\xbb\xa2\x95\xd6\x92\x19\x40\x0b\xfe\xe6\x87\xd5\xcc\xa2\x00\xac\xf0\x6f\xf9\x09\x2e\x8a\x3d\xbf\xf4\x34\xd3\x4c\xe8\xd4\x19\x17\x9e\xb9\x74\x2a\xc3\x7e\x7b\xbe\x6b\x45\xb8\xaf\x8c\x8a\xc7\xfb\xb4\x80\x88\xa0\xc3\x79\x7f\xb6\x44\x26\xee\xe4\xbd\x7d\x21\x48\x49\xd4\x15\x79\xfa\x43\xea\x16\x17\x00\x13\x00\x22\x24\xdd\x29\xf1\x90\x97\x52\xe4\x56\xa8\x40\x64\x83\x7d\xe1\x56\x1c\x4a\x98\x28\x44\x88\x9c\x4d\xb1\x4e\x48\x8f\x99\x30\xd4\x2a\x6e\x3c\x40\x33\xcf\x7c\xe4\xd3\x6d\x38\x18\x8c\xbb\x09\xbe\x95\x41\xaa\xb1\x42\xff\x35\xfb\x00\x2f\xdd\x7b\xbe\x56\x8b\x75\xbd\x43\x12\x78\x64\xc4\xf9\x2f\xd5\x5b\x6e\xef\x16\xbf\xfe\xe4\x32\xe4\x1c\x33\x12\xe7\x62\x33\x48\xd7\xc9\x28\x32\x22\x1a\xc1\x4c\xe6\x3d\x6d\x74\x9f\x3c\x93\x11\x0f\x70\x8b\x3c\x96\x39\xb4\xbb\x58\xd5\x80\x7a\x2b\xca\xbc\xf4\x9c\xcd\x4c\x46\x82\x49\xe8\x78\x8a\x47\xb0\x07\x49\x22\xed\xeb\x3f\x0e\xa7\xf6\xec\x3c\x88\x42\x1f\x6a\xb8\xd6\xb5\xf2\x3f\x88\x05\x26\x2a\x3c\xe9\x3d\x2a\x6d\xaf\xb7\x83\x14\x97\x24\xad\x47\xec\x80\xdd\xa8\x7b\xef\xd7\xa7\x23\x5e\x1a\x7d\x65\x49\x64\x60\xfd\x5c\xcf\x6c\xd4\x9a\x5b\x37\xe4\x0b\x98\x24\x06\xd0\x73\xb6\x41\x8a\x51\xc5\xaa\x4c\x62\x82\xe0\x3e\x03\x50\xef\xc5\xb0\x81\x04\x18\xa6\xc7\x48\x4a\x3b\x53\x5b\xe3\xcb\x8d\xe8\xb5\xd2\x2f\x93\x09\xe3\x48\x08\xf3\x98\x7d\xc0\x20\xde\x2c\x69\x1c\x44\x30\xbc\x4e\x59\x8d\x95\xf7\xbf\x98\x40\x2c\x89\x46\xd4\xe0\x79\xbd\xc4\xfa\x20\x6f\x28\x4b\xc6\x04\x2e\x26\x5b\x26\x53\x94\x1a\xbc\x9f\xf0\x55\xf2\x5f\xf2\x28\xd2\x0e\x31\x73\xb7\xc4\x5c\xcf\x15\x97\x76\x7f\xc6\x4a\x9e\x8a\x18\x06\x0a\xaf\x8b\xb2\x8f\xe5\x4b\x2e\xa8\x47\x0f\xce\x72\xab\xd9\x3f\x45\xed\x0f\x4e\x77\xc9\x01\xa4\x2b\x30\xf9\xf1\x76\x05\x16\x90\x69\x64\x10\xb5\x69\x75\x18\x46\x1f\x28\x4d\x74\xec\x13\x6f\xcf\x0f\x0b\x91\xe7\xed\xb1\x39\x65\x81\x65\x52\x70\x9e\x22\xf8\x0a\x8b\x1e\xbf\x8a\x69\xf8\xce\x5a\x60\xbd\x94\xed\xbc\x78\x2b\x33\x05\xf7\x55\x79\x6c\x90\x04\x1f\x55\x68\x5c\x4f\xa9\x43\x15\x76\x51\x65\x5b\xd2\x3c\x2a\x5f\x72\xfd\x54\x14\xa0\x2f\xe2\x0a\x90\xbd\xd6\xf3\xb8\x44\xee\x26\x50\x45\xaa\x38\xc5\x95\x51\x7e\x4e\x43\xa6\x52\x47\x31\x46\xdf\x1e\xcb\xf2\x7d\x36\xa6\x45\x64\x2a\x08\x78\x22\x07\x9c\xfa\xed\xab\xac\xab\xd7\xd9\x66\xf5\x3b\x5c\x46\x41\x38\x15\x04\x36\x69\xeb\x70\xa3\x3f\x20\x1b\x15\x1b\xa9\x80\x11\x5f\xb1\x64\x59\xef\x44\x7e\x75\x70\xaa\xc0\x10\x45\x87\x66\x0f\xb2\x15\x76\x97\x30\x82\x58\x9a\x62\x44\x8f\x2c\xca\xaa\x02\xe5\x73\xa5\xe3\xc1\x52\x91\x8c\xb9\xea\xf4\x4c\xeb\x43\xde\xd1\x9f\x33\x15\xd3\x00\x7d\x13\x03\x70\xb0\x20\xb8\xaa\x6b\xe2\x81\xb5\x0b\x5c\x74\xe9\x62\x0b\x1f\x6f\x9d\x90\x7c\xc0\x48\x9d\xfc\x7b\x40\x88\x40\xff\x7d\xc5\xae\x36\x08\x8f\x0c\xff\x9f\xbf\xa9\xb4\xe1\x9d\xe5\xf3\xe2\xf7\xbf\x47\x44\xc5\x54\x0c\x36\x51\x99\x1d\x8f\x65\xd5\x20\x57\xa5\x7f\x07\x12\x09\x54\x2b\x28\x0b\xa4\x76\x59\x69\x28\x9a\xac\xc9\x26\x2a\xbf\x4c\x11\x2a\x58\x47\xb9\xff\x56\xd6\xc3\x42\x50\x95\x70\x1b\xb4\xfc\x84\xcc\x17\x39\x75\x4d\x86\xc8\x8e\x28\x1d\x56\x8b\xf5\x80\x07\x89\x29\x1a\x72\x15\x76\x3b\xfa\x70\x9d\x29\xca\x8d\xb1\x75\x77\x9e\x68\x68\x3d\x98\x6b\x3c\x22\x48\x4e\xb1\x28\x8f\x32\x2b\xa0\xc3\x04\xfb\x49\xac\xb8\x08\x30\xf9\x60\xca\xca\xd7\x14\x75\x2d\x06\xf5\x34\x34\xd4\x4d\x55\x5e\x86\xa1\x06\xdf\x43\x53\x5c\xfd\x8d\x98\x54\x62\xa9\xd4\x9d\x40\xc8\x73\x01\x55\x83\x67\xd8\x84\x7b\xbc\xeb\x6a\xcf\xbd\x8e\x8f\xe8\x01\x9a\x99\xfe\x18\x32\x7a\x30\x95\x9a\xd0\x67\x88\x37\x65\xf1\x67\x86\x5e\x5f\x76\x9d\x22\x52\xa9\x61\x38\x9b\x1d\x4d\x9b\x1a\xaa\x79\xdf\xdc\x5b\x95\x90\xdc\xf3\xec\x6f\xcf\xf9\x84\xc0\x40\xc9\x84\x05\x29\x8e\x5f\x56\x58\x01\xc0\x97\x42\xe4\x8d\x25\xe5\x59\x15\x0d\xbc\xf6\x9f\x50\x32\x8e\xe4\x02\xe8\xdb\x74\xa4\xd5\xbe\x91\x03\xf5\xaa\xd4\xab\xee\xbd\xa4\x92\x7c\xc8\xf4\xde\xd9\x3c\xeb\xfa\x0d\x2a\xbc\xa9\xef\xaa\xb8\x42\xc2\xe4\xa7\x52\xee\xfe\x73\x16\xba\x8e\xfa\x16\x5b\x96\x58\xc8\xb9\x50\xef\x80\xf9\x96\xa7\xb2\x82\x75\xb5\xfc\xcf\x59\xe4\xfb\x7e\xae\x68\x43\xb0\xfe\x62\xb9\xff\xb6\xdc\x2e\x5f\x7c\x4d\xaf\x82\x28\x91\x36\x06\x50\xe9\x59\xa1\x17\xad\x99\x97\x67\x75\xb3\xd2\xf5\x7d\x59\xdd\x28\x52\x53\x40\x08\x4b\xbd\x6c\x91\x03\xaa\xde\xcc\x07\x29\x13\x08\x4c\x36\x58\xa7\xf4\x29\x2b\xe6\x53\x9c\xb8\x32\xa9\xb0\x72\x65\x96\x5e\x61\xba\x2f\xdc\xb2\xea\x94\xd1\x69\x10\x79\x3b\x53\xe4\xf3\x5c\xa8\xf7\xc7\x2b\x6c\xa0\x0e\x38\xa0\x99\xdb\x97\xc3\x38\x13\xd0\x79\x02\x37\x8f\x19\x1d\x40\x40\xa4\x4f\x10\x4d\x63\x82\xae\x0f\x51\xac\xab\xd8\xe8\x4b\x2f\x91\x13\xd2\x7f\x33\x9d\x84\x5c\x26\x36\x26\x50\x75\x32\xf0\xe3\x90\xcc\xf0\xa5\x74\x02\x04\x23\x57\x43\x85\xf9\xaf\xf0\x08\x9a\x6a\x89\x79\x9f\x17\x5f\x43\x6f\x3d\xa1\xee\xe6\x8c\x30\x84\x16\xd4\xe7\xa3\x35\x01\x07\xac\xff\xae\x0b\x27\x21\x32\x0c\x3f\xfd\xb1\x5d\xde\xfd\xf5\xfe\xa8\x39\x0b\xb1\x1c\xe6\xf9\xac\x72\x38\xd7\xdf\xb3\x3a\x2b\x0b\xa7\x74\x68\x8d\xa3\xa7\xac\xf8\x8a\xd8\x8a\x69\xae\x38\xa6\xec\x64\x05\x80\x4e\x07\x56\xcc\xdd\x34\x3b\x75\x1a\x58\x11\xe7\xa3\x8d\xa1\x9f\x40\x65\x22\x1f\xda\xed\xbe\x5f\xa8\x90\xba\x4a\x38\xba\x0a\xf7\x79\x1d\x15\xc2\x28\x38\xae\x53\x96\x30\xc7\x27\x32\xca\x3e\x4c\x6f\xcd\xb8\xe8\xc1\xeb\xcb\xa2\xa9\x2e\x03\x18\xaf\xef\x24\x12\x9c\x58\xf3\x46\x0d\xb7\x63\x2d\xb4\xf1\xa4\xcd\xf3\x73\x55\xdc\x97\xd5\xf1\x9c\x8b\xc9\x43\x0b\x97\x5b\x43\xdb\x52\xc3\xcf\xb9\x68\xd4\xdb\xfc\xf2\x52\x43\x55\xb4\x53\xc4\x69\x6a\x77\xdf\x49\xb2\x98\x38\x50\xaa\x73\x3b\x7f\x49\xcc\xe8\x31\x5f\x5a\x8a\x50\x2b\xd4\x0f\xcc\xf3\xcc\x5c\x7c\xe8\x60\xb4\xc5\x69\x15\x10\xab\xdc\xec\x9c\x4a\x47\xc2\xf1\x57\x9c\x1e\x5a\xa5\x41\xda\xeb\x50\x3d\xc3\xa7\xf5\xc1\x26\x44\xca\x37\x71\x6c\xe3\x59\xa5\x23\x40\xfc\xee\x7c\xf6\x70\xd8\x6f\x67\xcf\xbb\xfb\xe5\xf6\xf0\xb4\x7a\x5e\x3d\xbd\x3c\x1d\x66\x4f\xeb\x97\xe7\xfd\x61\x7d\x7f\x98\xbf\xfc\xe1\x59\x73\xb4\x36\x12\x17\xe8\x11\xf2\x61\x39\xad\x6f\x06\x65\x10\x9e\x26\xdb\x5d\x01\xcb\x05\x3e\xb3\xa6\xe3\x95\xd1\x60\x00\xcd\x98\x53\xa6\xde\xf7\x6f\x60\xcf\x25\xdf\x68\xb8\x41\xf7\xe4\xc3\x82\xe8\xee\xdb\xcd\x1c\xaa\x71\x14\x11\x02\xa9\x10\xe0\xb6\x58\x3f\xae\xb7\x87\xc5\xcb\x6e\xbf\x7e\xea\xda\x80\x91\xb8\xf3\x80\xef\xad\x88\x1f\xf2\xa4\x3c\x0e\x92\x85\xae\x73\x14\x53\x66\xe5\x5c\x9b\x59\xe3\x76\xa8\x2f\x0a\xa5\x21\x8a\x19\x62\xaf\xdc\x39\x7d\x55\xd2\x0a\x11\x37\x18\x7e\xfa\xf4\x66\xe2\xcc\x34\x50\xdd\x65\xb5\xc5\xe0\x96\x58\x87\xee\xfb\x82\xc6\xf3\xe8\xb8\x2e\xfe\x5e\x34\x01\x22\x63\x53\x4b\xe7\xda\x1e\x31\x36\x62\x30\x21\xa6\x63\x10\xab\x80\xfa\xa7\x6c\xb2\x57\xf0\x2c\xfb\x0c\x62\x13\x60\x0c\x68\xf3\x32\x7f\x5c\x2d\x50\xb2\x66\x77\x88\x0e\xdb\xd9\xde\xe3\x22\x81\x44\x14\x0f\x63\xc7\x34\x54\x9d\x6b\x9b\x67\x1a\x3f\x09\x49\x39\xaa\xa4\xdb\x24\xd7\xa6\x2a\x4b\x33\xa9\x62\x1b\xd5\xab\x4d\x4d\x43\x20\x82\x08\x0b\xc9\xad\xf4\x42\x9c\x36\x15\x0c\x6a\xbe\x21\x09\x22\x2c\xc1\xfa\x36\x7b\x1c\xae\x6c\x48\xd2\x04\xe9\xb5\x0e\x96\xac\xed\x28\x32\x87\x3b\xf4\x1d\xa8\x30\x08\x0c\x3a\xbc\x42\x33\x0c\x0b\x02\x23\x80\x2e\xa9\x23\xea\xf4\xb2\x13\xd3\xa5\x3b\x5c\x14\xc0\x18\x10\xd2\xfb\x25\x4f\x97\xef\x43\x52\x23\xdf\x89\x03\xce\x08\x3b\x10\x77\x20\xf2\x1b\x5a\xae\x0c\xda\xb3\x02\x75\xd7\xca\x5a\x75\x41\x25\xe0\x41\x82\x49\x6f\x4b\x5f\xd1\x6e\xc5\x5b\xb0\x05\x5d\x93\xe1\xe6\xb1\x40\x0f\xd9\xde\xe5\x4a\x1c\x97\x41\x9a\xc4\xb4\x67\x85\x7e\x38\x3f\x89\xfa\xfd\x6a\x12\x4f\x66\x53\xca\x35\x56\xb3\xff\xb1\x7c\x7c\x5c\xff\x78\x9c\x3d\xcd\x3d\xc0\x0a\x04\x13\x1e\x60\x30\x0c\xda\x8d\x7f\x2f\x74\x90\x46\x1d\x53\x71\x56\x8c\xa2\x1c\x20\x40\x11\xd3\xad\xc1\x71\x21\xd3\xf8\x3a\x92\x04\xa1\x13\xc0\xf2\x78\xd8\xf9\x65\x59\xe8\x53\x99\x4d\x99\x4d\xfd\x2f\x54\x9c\x5a\xc4\x7e\x07\xfe\xb2\x91\xbb\xbf\x58\x3f\x2a\x8a\x70\xfe\x74\x75\xc7\x7a\x5f\xde\x55\xc2\xa3\x52\x40\x45\xc6\xc2\xf8\xeb\xc9\x76\x06\x8a\xc9\xa4\xd7\x5a\x3d\x14\xf0\x79\xd0\xe0\x94\x12\x27\xd5\xf6\x7e\x57\x07\xa5\x08\x6e\xaa\xed\xf9\x89\xb2\x7f\xe3\xba\xd1\xc9\xb3\x69\x1a\xc4\xe1\x40\x1d\xdb\x43\xe2\x87\x64\x25\xa0\x59\xa8\x03\xac\x52\x36\x0d\x09\x26\xdf\x43\x4b\x89\xe8\xe3\x02\x7e\x36\x8f\xe2\xd4\xa1\x60\x01\x92\x00\xa3\x11\xa0\xb3\xc6\x6a\xd5\xdd\xc8\xfc\x83\xd1\x21\x12\x81\xab\xb1\x09\xf8\x17\x25\x6c\xff\xd7\x7f\xc7\x7b\xaf\xd1\x24\xf0\x55\x4d\xf5\xaa\x99\x86\x06\x4c\x10\x27\x48\x4c\xb1\x14\xf5\xc5\x45\x77\x07\x01\x22\x13\x26\x71\xd0\xce\xfa\xd9\x76\x71\x77\xb8\x7f\x79\xbe\xeb\x1a\x52\xab\x09\x62\xf5\x5b\x6d\x86\xa9\x76\xa7\xea\xc4\x2d\x30\x51\x14\x22\xaa\xbd\x3c\x41\x6b\x18\x5b\xc5\x14\xdf\xc6\x2c\x73\xcf\xec\x7e\x3f\xbc\x6f\x1c\xa5\xf8\x58\xaa\x3c\x9e\xce\x0e\xb2\xd5\xee\xc7\x7d\x21\x57\xff\x0a\x71\xac\x10\xa0\xb1\xa8\xb2\x53\xeb\xcf\x0a\xbb\x63\xd5\xdd\xb5\xb8\xd5\x20\x46\x46\x4d\xa8\x6e\xd8\xb9\x26\x16\x1a\x6f\x77\x9f\xfd\x9c\x43\x93\x84\xdd\x4f\xb5\x40\x11\x52\xab\x71\xeb\xe8\x2c\xba\x94\x97\x21\x32\xd5\x9e\x51\x6e\x59\xe8\xee\x67\x49\x60\x6c\x19\xcd\xdb\xb9\x78\xaf\x3d\xd7\x80\xa5\x90\xf4\x5d\x38\xc7\x0a\xb2\xae\xec\x1c\x76\xe4\x7e\x39\x79\xac\x24\x25\x2e\x76\x6f\xa3\x71\xcb\x9f\x59\xdd\xc0\x14\xfe\x6d\x92\x54\x62\x8d\xc5\x63\xf9\xea\xd9\x4e\x3c\xfa\xfd\xe6\x72\x75\x51\x7e\x43\xb5\x85\x24\x3f\x54\x00\xc5\x52\x54\xcd\xdb\x52\x95\x45\x79\xbc\xdc\xf7\x64\x24\x86\x11\x89\x88\x41\x95\x97\x35\x7c\x2f\xab\xbe\xb6\xc3\xb0\x34\x4c\xb4\xaf\x3f\xf8\xe9\xa0\x7b\x30\x52\x88\x62\x86\xc7\x56\xc7\xf5\x64\xed\xb2\xd0\x86\x61\x7d\x23\xb3\x21\x24\x57\xa7\xb2\xa9\xca\x9f\x5f\x40\xd6\x0d\x17\x02\x91\x23\xbb\xb3\x2e\x7d\xb0\xb1\x8f\x07\x9a\x54\x49\x9c\x47\x9f\x95\x38\x9d\xae\x12\x97\x46\xe8\x14\x13\xd6\xb6\xbe\xc5\x16\xaa\x8e\x07\x51\x06\xcc\x13\x95\xbb\x40\xea\x00\x6c\x61\x24\xe1\xc8\x84\xd0\x63\x14\x7f\x3c\xf5\xf4\x6e\x46\x85\x52\x53\x8c\x1f\xaf\x9f\x5a\xbf\xf3\x65\x77\xd8\x7d\x5b\x6d\x86\xd4\xe3\xcc\x28\xc6\xd0\x33\xd8\x89\xd6\x91\xf4\x8c\x77\xe3\xb7\x54\x5c\x60\xa4\xe2\x4d\x7c\xc0\xee\x0d\xf2\x91\x1e\x1a\x33\x4a\x10\xe3\x13\xf8\x00\x37\xed\x6e\xa3\x04\xd7\xb1\x63\x62\xb5\x91\xea\xc1\xc1\x6f\x14\xd8\x6f\x5e\x21\x8b\xf0\x41\xf4\x68\x03\xa3\x23\x40\x3a\xc6\xd1\x42\xd4\xb1\x0e\xc2\xfe\x88\x5e\x88\x4a\x96\xc5\x5d\x99\xe7\x62\xba\x93\x40\x64\x01\xca\x05\x20\xe2\xad\xfd\x42\xeb\x13\x14\x0e\x19\xf0\xa5\x2d\x7f\xc3\x58\x36\x10\x13\x34\x18\xad\x6c\xd0\xf2\x3f\xbf\x4d\x32\xac\x06\xa8\x89\x11\xb1\x98\x49\x0f\x73\x31\x00\xd2\xea\x1b\x1d\xa1\xd0\xe8\xd0\xfc\x36\xb1\x8d\x6e\xff\x1b\xba\xf6\x70\xfc\x9f\xd3\x48\xa8\x31\x49\x00\x91\x77\x21\x2c\xde\xe8\x30\x60\x5d\x67\xc6\x08\x81\x21\xcf\x25\xc2\xaa\x67\xdd\x9f\xa5\x45\x6a\x08\xcb\xa3\xe4\xc1\x76\x5d\xb3\x8a\xd1\x46\x05\x5b\xc2\xbd\x3d\xe7\x59\xf1\x3a\x1f\x8d\x2d\x0f\x42\x46\x85\xec\x08\xaa\x91\x7e\xed\xe6\x21\xc7\x83\x90\x0b\x8c\x59\x9c\x2a\x38\xdd\x90\xb9\xf2\xbd\x8c\x5d\x4c\x07\x63\x6b\x4d\xef\x32\x0f\x2d\xe3\x41\x14\xb0\xc4\xf4\xb1\x52\xbd\x2c\x74\xf9\x79\xec\x40\xa9\x3c\x88\x88\x0e\xdd\x4a\x79\x82\xa3\x84\xca\x8b\x60\x8d\x9f\x24\x8e\x6d\xf2\x6d\x58\x13\xd9\x1d\x0a\x3c\x88\x25\x20\x6e\xd7\x94\x95\x02\xbb\x2c\x7d\xec\x6c\x1c\xdb\xe5\x41\x6c\x52\xab\xaf\xec\x4d\x91\x97\xfd\xda\x26\xf2\x93\xab\xbe\x09\x97\xe8\xbd\x1f\x16\xdb\xf5\x8f\x3b\x4c\xe6\x6c\x66\x2f\xbb\xe5\x9d\xbf\x6f\x22\x63\xb4\xf0\xb1\x89\xfc\x58\x2e\x7f\x3f\x20\x09\x91\x6f\xa7\x09\x68\xea\xc5\x7f\xcb\x13\x02\xab\xe7\xd0\xf4\x54\xa1\x3c\xe0\xb1\xc4\xaf\x51\x67\x47\x0c\x35\xdf\xca\x2d\x8e\xc7\x9b\x27\x0a\xf3\x25\x67\xbf\xfd\xbc\x43\xd5\xda\xfc\xd3\x0d\x80\x07\x29\x4b\x35\xf5\xd4\x95\xbb\x9e\xba\x72\x3c\xb6\xa9\xb2\xbc\x3f\x0e\x13\xbd\x2f\xef\xaf\x68\xd9\x78\x20\x4c\x8a\xcc\xa2\x18\xaa\xb3\x18\xb7\x81\xfd\xc8\x03\x19\x27\xb4\xaf\xab\x9b\x6a\x04\x8d\x92\x02\xff\x13\xfd\xbb\xfb\x91\x32\xc2\x67\x49\x51\xca\xe5\xf3\x2d\x7b\x7d\x1b\x10\x70\xf1\x40\xca\x08\x4b\xdf\x50\x69\xac\x7d\xdf\xb3\xdc\x0e\xa1\x10\x5d\x37\x40\xc7\x1d\x3a\xae\xc0\x9b\x3e\x21\x0f\x34\x05\xa4\x8f\x7d\xd8\x7c\x1b\x38\x2b\x3c\xd0\x29\xe0\xa8\x6e\xbe\x2f\x0f\xf3\xd9\x7e\xff\xb8\xec\x5a\x24\x47\xf4\xd2\xcc\x98\x2c\xcf\x44\x83\x49\xaf\x09\x73\x80\xef\x6a\xb4\x72\x61\x8a\xfd\xf1\x84\x25\x04\xbd\x30\xe8\x70\x07\xe0\x01\x30\xa6\x07\x5a\x04\xfb\x6f\xcf\xff\xba\x9b\xbc\x13\x88\x24\xf4\x82\xa6\x20\x72\xa8\xb0\x9e\x71\xb0\xb9\xf1\x00\xa4\x60\xaa\xa3\x8b\x3d\x65\xe3\x92\x4c\x3f\x86\x86\x10\xac\xdc\xc6\x72\xfd\x94\x4d\x6e\x63\x08\x08\x6f\xf8\xa2\xba\xc2\xdf\xd2\x0e\xe1\x81\x49\x34\x46\x8e\x97\xed\x55\x1b\x80\x62\x34\x9e\x26\xd1\xda\x89\x31\xdd\x2e\x43\xe6\x81\x49\x29\x7a\xa5\x76\xce\x3c\x88\x42\xcc\xc1\x94\xce\xb7\x9c\x74\x95\x4c\x38\x20\xdf\x62\xb9\x27\x13\x45\xd3\x71\x29\x13\x0f\xc3\x88\xe2\x9c\x39\xe1\x74\x5f\x2d\xd6\x28\xab\xe4\x28\x39\x79\x18\x26\x96\x67\x78\xbf\xfe\x7d\xf8\xc8\xed\xdf\xbd\x24\xe9\x4e\xb8\x04\xeb\xfa\x73\x52\xa5\xc1\xc3\x28\x09\x52\x07\xb9\x39\x68\xf8\x50\x65\x71\x38\xfa\x6c\x33\x0f\xa3\x54\xe1\x77\xad\x6f\x6c\x98\x57\x74\xd5\x3c\x8c\x0c\x89\x2c\x08\xf0\xa3\xdd\x3c\x87\x82\x3a\xdd\x48\x87\x71\x64\xd9\xa3\xf2\x52\xbd\x2f\x2e\xca\x1f\xc0\x3c\x8c\x8d\xd5\x57\xaf\x2c\xa0\x77\xec\xed\xb6\xcd\x7e\x7d\x89\xe2\x15\xee\xcb\x72\x55\x58\x7a\xf0\xbb\x4b\x21\x8e\x99\x42\xa6\xa1\xf1\xad\x48\x20\x70\x7b\x44\x4c\xad\xa8\xd0\x04\xf3\x4d\x89\x45\x13\x1c\x7c\xe4\x70\xb9\xff\xe6\xeb\xd2\xfd\x69\xca\xc3\x24\x08\x11\xb4\x5a\x1f\x07\xf4\x25\xb6\x96\xac\xde\x4d\x02\xd9\x3c\x4c\xc0\x9e\x45\xef\xba\x69\x77\x1d\x67\xba\xf9\x3b\x52\x13\xa0\xe9\xfb\x2a\x8e\x8e\xc7\x20\x9f\x90\x4a\xf2\x90\x27\x22\xf4\x51\x65\x47\xc4\x36\xfe\x5c\x5c\xb3\x68\x48\x5f\xb2\x29\x3f\x27\xc1\x79\x1e\xa6\x71\x82\x51\x94\xee\x50\x28\xb4\x63\x41\xf9\x02\xce\x3d\x34\x31\x78\x28\x42\x8e\x9c\xed\xef\x59\x9e\xaf\x8b\x97\xa2\xd3\x7f\xbd\x2f\x3d\x7b\x33\x0f\x45\x9a\xe8\x2e\x44\x6e\xf5\xb6\xa6\x41\x52\x1e\xca\x30\x45\xb4\x57\x7b\x5a\x78\x67\x19\x09\xeb\xa7\x67\x53\x28\x8d\xd5\xae\x69\xef\xb9\x7f\x9b\xba\xc0\x3c\xd4\x81\xad\x28\xad\xa1\xd9\x88\xea\xba\x02\x7b\x7c\xa8\x84\x3a\xe0\x18\x85\x6d\x8f\x7a\x51\xc1\x23\xb2\xa6\x5d\xba\x8b\x45\x29\x1e\x84\x0f\xe2\x28\xc5\xd0\xa9\xe3\xa1\x56\x01\x3e\xc7\x7f\x9f\xb3\x3f\x3f\x47\x7a\x3d\x3c\xd4\x10\x79\x9e\x81\x21\x92\xb6\x9e\x7d\x88\x2c\xef\x21\xa0\x6d\x47\x08\xfc\x92\x7a\x2f\xc1\x4c\x46\x05\x38\x63\x89\x05\x28\x96\xf9\xc7\x4d\xfa\x31\x1e\x82\xb6\xca\xf2\xdd\xb1\x58\x4d\x27\x9b\xe1\x21\x9a\x9f\xbd\x9b\x34\xd0\x15\x6b\x9b\xa5\xa1\x4e\x10\x61\x90\xc4\x98\x26\x55\x46\xdb\x78\x68\x8c\xe5\x93\x74\x66\xfe\x02\xcb\xb6\x3a\x9e\x13\x1e\x05\xa1\xb0\x95\x76\x76\x85\x3e\x96\x4e\x78\x20\x8c\xf8\x15\xff\xef\x2d\xab\x96\x92\x41\xe0\x88\x47\xa1\x08\xfd\x7e\xff\xbd\x6c\xcd\x08\xc7\x45\xea\xf5\x6e\x7c\x37\x65\x77\x95\x76\x13\x72\x92\xc2\xf5\x75\x5a\xc4\xcf\xa5\x28\x8a\x19\xfa\xdf\x8f\x42\x26\x61\xeb\x9e\x0e\xbf\x62\x14\x25\x02\x55\xb3\xb1\xc4\xd6\x13\x44\x03\xcc\xe4\xd8\x77\xe6\x51\x44\x35\xa6\xf7\xf7\x8b\x5f\xb0\x69\xf1\x28\xe2\x04\xc3\x3a\x9b\xaa\x3c\x41\xd5\x5c\x76\x83\x72\xdd\x5b\xd6\x72\xfb\x0b\x83\x1b\xb6\xc0\x72\xcb\xdd\x49\x54\x8d\x28\xea\x7d\x39\x17\xcd\x54\xb4\x9a\x47\x51\x0a\xd2\x55\x8a\xcf\xce\xcd\xdb\xfc\xb2\x28\xf5\x2f\x72\x48\x3c\x22\xa1\x66\xfd\xc4\xe9\x45\xa5\xfa\x4c\xf9\x64\xed\x45\x24\x52\xb1\xc3\xdb\x2f\xde\x5a\x03\xa0\x78\x9d\x1c\x58\x11\x89\x39\x11\x1d\x29\x3f\x4e\xfd\x59\x33\x29\xcf\xe0\x11\x61\x51\xea\xaa\x03\x56\x67\x0d\x3f\x77\xaa\xac\x60\x96\x7f\x61\xf9\x45\x89\x23\xd8\x3f\xa1\x27\xb6\xb5\xab\xa1\xf2\xdf\x89\x12\xe6\x73\x24\xf6\x18\xe8\xa6\x03\x4f\x02\x04\xe8\x3a\xce\xc2\x27\xa8\x6b\xf1\x0a\x4e\x26\x77\x34\x16\x5c\xc5\x78\x62\xd4\xea\x0d\xf4\x39\x47\x32\x91\xf1\xc7\x21\x37\xb9\xc3\x78\x94\xea\x10\xf9\x23\xac\x80\x34\xd6\x4e\xbb\xfa\xb3\x4e\xd1\x90\x47\x82\x30\xc7\x4f\x8f\x70\x88\x39\x34\x9f\x00\xc5\x53\x56\x34\xdd\xb3\x0a\x46\x10\xdd\xf2\x9a\x7d\xc0\x13\x2c\xee\x36\x93\x21\x13\x32\x42\x88\xd3\x66\xbb\xfa\x3e\xdb\x3b\x1d\xf7\x81\x6b\xcc\x23\x19\xa9\xd8\x55\x07\x9a\xac\x3a\xce\x2f\xd3\xe9\xe8\xfb\x19\x23\x9c\xeb\x71\x38\x42\xf5\x9e\xc3\x01\xc5\x81\x27\x37\x54\x41\x8a\x7c\x9e\x9b\x0a\x6a\xa4\x32\x5a\x2c\xd7\xfe\x56\x2a\x8a\x9d\x43\xdb\x4e\xcc\xfb\xaa\x3c\xf6\x4a\x7b\xbe\x4b\x12\x20\x9e\x20\x2f\x5f\x27\x17\xd6\xc0\xbc\x76\x2b\x58\x22\x9b\x49\x07\x20\x02\x63\xb2\xed\xa6\xd2\x9c\xaf\xa5\x60\xff\x0e\x60\x92\x47\xa0\x62\x8c\x33\x3e\x97\xd5\xd1\x3f\x14\x68\x15\x4a\x44\xd4\xed\x86\x2c\x3e\xe3\xd9\x66\x62\x5b\xa0\x5d\xbf\x89\x1b\x7c\xb7\x3c\x32\x4c\xd8\x9c\x6f\xbb\xd5\xba\x93\x7b\xf9\x33\xbb\x22\x76\x9c\x3c\x8f\x91\x31\x56\x16\x64\xaa\xec\x89\xe7\x27\xab\xc7\x80\xc5\xc5\x6e\x1e\x67\x7f\x2c\xb7\x87\xa7\xe5\x7e\x76\x37\xdb\x3b\x2f\x98\xc7\x01\x25\x6a\x78\x5c\xe3\x04\x7a\xcb\x4e\xe3\xab\xc4\x81\x8a\xa3\x3e\x8b\xf0\x95\xd0\x12\x8f\x03\x4d\x78\x8a\xb8\x8d\xeb\x77\xb8\x91\x25\x71\xbf\x0a\x39\x45\x86\xaa\x6f\x65\x75\x29\xcf\xc3\x1d\x33\x0e\x05\xe0\x90\xb7\x2e\x99\x2e\x8f\x98\xa5\xcf\xca\xe2\x1e\x60\x55\xdc\xb7\x7e\xe9\xa5\xeb\x09\x29\x8d\xbc\x34\x8c\xb4\xa4\x37\x5d\x93\x75\x0c\x1d\xa9\xfa\x18\xae\x7d\xf3\x53\xc7\xa1\xb1\x51\x13\xb7\x93\x9d\x4e\x5f\x11\x37\xf6\xf6\x5a\x1c\x07\x14\xa7\xc2\x76\xb9\x5b\x3e\x3e\xae\x9e\x1f\x0e\x8f\xeb\xc5\xef\x2f\x9b\xc3\x66\xb9\x5d\xad\xbd\xa7\x1b\xc7\xb1\x85\x23\xcf\x2a\x71\xf4\x6a\x53\x3c\x8e\xd3\x20\x48\xbc\xc5\xac\xf5\x74\x2f\x8e\x63\x93\x22\x0a\x7b\xbd\x5b\x8e\x06\x88\x84\x56\x04\x75\x0e\x7f\x0a\xc7\x0e\x36\xda\x87\x62\xc2\x22\x84\x69\x49\x68\xea\x67\xaf\x11\xcc\x63\xa2\x25\xf1\x3a\x6f\x3d\xd6\xd3\xaa\xdf\x75\x7d\x20\x0a\x9d\xe1\xf3\x20\x8e\xb0\xa9\x06\x46\xee\x64\xbc\x92\xd0\xaa\x54\x7c\x3a\x5d\x8e\x2e\x35\xc5\xe3\x84\x08\x1e\xb9\xe8\xfc\xac\x82\x42\x0c\x2c\x85\x38\x11\x94\x7b\xb7\xde\xe5\x15\x7d\x0b\x48\x1c\xcd\x67\xf8\xfc\x0a\x19\x7d\x6b\x06\xd2\x28\x45\x28\xd8\x72\xfe\xe8\x27\xcb\xaf\x8e\xd0\x98\xd1\x10\x1c\x54\x70\x3e\x7b\x89\xae\xb0\x8d\xb7\x5f\x97\x01\x43\x4c\x94\xc4\x63\x73\xa6\x27\xa6\x74\xcc\xa5\xad\xa7\x6b\x37\x44\xe1\xb9\xa0\x0f\x80\x44\x59\x5f\xd8\x8d\x31\x07\x11\x0a\x2f\xb9\x8c\xfa\x82\x4f\xe2\xe7\x3f\xce\x47\xef\x0f\xc5\xdc\x50\x2c\x7e\xb2\x54\x09\x98\xe1\x87\x6b\xd5\x4d\xd7\x39\x8d\xe2\xa0\x57\xda\xb1\xc9\x8f\x27\x31\xd9\x38\xe3\x94\x04\xcc\x5b\xd2\xa2\x01\x0c\x07\x5c\x69\x25\xb5\xdd\x08\x2e\xa0\xc7\xf2\x75\xf9\xfa\x8a\x9a\x5f\x75\xf6\x65\x7a\x9e\xc7\x29\xe5\x14\x05\xc2\xf7\xbb\xfd\x72\xb7\x67\xfe\x0d\x52\xad\x2c\xb5\xab\x38\xd7\xf0\xa3\xb5\xe8\x27\xbf\x03\x89\x43\xe0\xf1\x84\x57\xfb\xdf\xed\x91\x13\x44\xf1\x4e\xdd\xd7\x43\x7c\x86\x44\x14\x3c\x16\xcc\xd2\x0c\x08\xad\xef\x32\x05\xdb\xf2\x0b\xcc\x31\x8f\x65\xa2\xb1\xb8\x0b\x94\x7f\x6a\x45\xcc\x20\x59\xb9\xc8\x2a\x44\x32\xf6\x31\xb3\x58\x51\x83\x11\x9b\xa7\xd5\x6c\x20\x6d\xc6\x63\x05\x41\xa2\xc7\x7c\xbf\x83\xf2\xd6\xe9\x56\x1d\xeb\x80\xa3\xb9\xd5\x13\x4f\xf1\x58\x87\x96\x58\x47\x9e\x2f\xbb\x77\x68\xd4\xdb\x64\xc4\x34\x4d\xd1\x15\xca\x8a\x66\xa2\x33\xc5\x63\x9d\x52\x9c\xa4\xab\xa2\x3e\x57\xed\x04\xb4\xb9\x48\xd7\x0a\xb1\xc1\x2a\xcb\x1d\xca\xd1\xfc\x2f\xa8\x66\x5a\x87\xcd\x63\x48\x18\xfa\xe7\x4a\xbc\x42\xb7\x30\x21\x15\x28\x03\x82\x65\x94\xa7\x81\x82\x0b\x8f\xa1\x1d\x3c\x1f\x3c\xd4\x56\x95\x60\xf2\x92\x46\x69\x10\xbf\xc0\xc1\x8c\x3f\x2d\x09\x62\xee\x4b\xe9\x9f\xb2\x22\x3b\x9e\x8f\x43\xba\xe6\xdf\x7c\x2f\x66\xc1\x80\x18\xfd\xba\xb7\xa0\x89\x49\x31\xd0\xe4\xb2\xdc\x6a\x24\xb6\x7d\xb3\xe2\xf5\xb0\xb3\x91\xc4\x83\x12\xf5\x9b\x14\xea\x1d\xab\xc6\x0e\x75\x2f\xee\xc9\x49\x9c\xd8\x02\x1e\xab\xd3\x7f\x38\x89\xcb\xc0\xed\x22\xb1\x0c\x11\x42\x59\x67\xc5\x6b\xde\x95\x13\x76\xad\x9a\x80\x4b\x75\xf9\x38\xb1\xc7\xe5\x5e\x9f\x23\x24\xd6\x02\x63\x8d\x58\x8c\xbd\xff\x2c\xfb\x4d\x91\xc4\x20\x48\xaf\x86\x84\xdc\xf8\x36\x43\x3d\xeb\x8a\x57\xc6\x13\x84\x10\x91\x1a\xd2\x7b\x4d\x03\x41\x8b\x2b\xec\xf5\xed\xa1\x4a\x82\x10\x37\xd4\x53\x55\xd6\x27\x70\xd5\xa2\x23\x48\x0a\x27\x09\x25\xe8\xef\x6d\x1f\x86\xf3\x9f\x24\x9c\x22\x82\xb8\x80\xcf\xa1\xf6\x87\x6b\xa5\x29\xc5\x8a\xa6\x3a\x1f\xd0\xe9\x7e\x21\x5e\xcc\x09\x93\x21\x6e\x29\xab\xe7\xd9\xf0\xfc\x23\x3c\x48\xc3\x6e\xed\x8f\x59\x76\x6f\xee\x4d\x84\x47\x0a\x4b\x20\x36\xe2\xd2\x1a\x4c\xdd\x75\xb4\xe5\xa6\xf6\x68\x48\xcb\x04\xeb\x1a\xd3\x80\x69\xd6\x69\x51\x1c\xda\x19\x32\x8d\x65\x91\x54\x28\x64\x33\x2f\x3f\xa0\xaa\x32\x0d\x08\xb8\x19\x7c\x55\x11\x00\xb2\x82\xcc\x77\x3f\x16\x58\x0b\xe0\x37\x12\xb0\xa2\xce\xfe\x5e\x82\x26\x98\xee\xf1\x71\xfe\xbb\xf2\xb3\x4b\xd6\xf8\x2e\x3a\x40\xd8\xad\xa3\xc3\x69\x37\xd2\x31\xaa\xf9\xaf\xfe\x3d\x0f\x64\x12\x39\x11\x86\x61\x4c\x33\xab\xf1\x49\x56\x1a\x01\x24\xeb\xca\xe1\xd1\x6f\x23\xea\x38\x91\x91\x49\x1c\x0f\xd7\x7f\xce\x22\xb7\x79\x4d\xdf\x46\x23\xe2\x1c\xd3\x76\x67\x19\x44\x39\x88\x4c\x6d\x4e\x7e\x40\x12\xde\x35\x29\x19\x86\x83\x65\xb2\x75\x1a\x19\x57\x27\xa6\x77\x1f\x89\x82\x90\xba\xd3\x7b\x59\x58\xc9\xf7\x70\xb2\x00\xb4\x92\xe8\x23\x2f\xee\x47\xf3\x46\x6b\x83\x21\xb8\x5c\x38\x1f\x7d\xd5\x3d\x86\x89\x03\xac\x2a\x3c\x64\xb5\x43\xa4\xcf\xcf\x97\xac\x98\x5c\xd7\x90\x28\x90\x5d\x39\xba\x2e\x8f\x4e\xa4\xe2\xf6\x60\x19\x05\x89\xcd\x1f\xf4\xb0\x0b\x9e\x04\x22\x8c\x1d\xf0\xfa\x90\x97\x35\x1c\x54\x09\xa6\xee\x5b\x19\x0a\x62\x1f\x84\xd6\x43\x4e\xcd\xf1\x02\x4d\x02\xc9\x30\x4c\x88\x93\xff\x8f\xdd\x10\x38\xc4\x93\x30\x08\x11\x30\x62\x05\x1d\x92\xe0\x10\x06\x41\xd7\x96\x28\xa3\x7a\x90\xb5\xd5\x9a\xbc\xf4\xad\x80\x86\x25\xe6\xe6\x65\x0e\xd3\xb0\x59\x12\x52\x45\x31\x80\x52\x95\xe7\xd3\xa6\xcc\x33\x75\x59\x15\x75\xd3\x57\x1b\xf0\x24\x14\x84\x58\x05\xc6\x63\x37\x01\x92\x88\x44\xf8\xd2\x77\x90\x43\x03\xab\x63\x6b\x70\x8e\x06\x2b\x89\x64\x8a\x5c\x86\x87\xf3\x20\x2d\xec\xda\xe2\x98\xc4\xee\x20\xc7\x7c\xcd\xec\xee\x26\x8e\x96\x27\x31\x95\xc8\xd7\x70\x12\x55\x93\xa9\xec\x84\x5a\xe2\x5f\x74\xe5\x14\xcd\x92\xd6\xac\x3a\x9f\x6e\xca\xf2\xf0\x24\x06\x40\x6e\xca\x4a\x34\xf0\xb2\xf3\xd6\x7c\x42\x22\x93\x74\x7a\x7f\x27\xb1\x28\xab\x71\xd5\x2f\x4f\x08\x97\x78\xe2\xfd\xe7\x2c\xaa\x06\x2a\x2b\x30\xd5\xb5\x59\x62\x29\xef\x7e\xfd\xda\xe1\x4b\x88\x66\xc8\xd1\xdb\x41\xb6\xbd\x8b\x7c\xdb\xa7\x71\xbf\xa2\x9a\x06\x49\xb7\x7b\x8d\xc1\xff\x3c\x61\x81\x44\xc7\xfb\x50\xc0\xe7\x12\x15\xf0\xc6\xbf\x66\x2c\x94\x1d\xd8\x19\x9c\x3c\xf6\x17\x53\x91\xa5\x02\xa7\x22\xd2\x5a\x9c\xa0\x52\x96\xfa\xc8\xdf\x8a\xf3\x24\xb5\x1b\xcd\xee\x7c\x82\x6a\x5a\x16\x3c\xb9\x58\x1a\x24\x42\xb9\x8b\x21\x98\x3c\x6b\xac\x18\xe7\xe8\xf1\x44\x64\x89\xac\x6b\x68\xf6\xcb\x9f\xe3\x3d\x39\x11\xb1\x35\x36\xac\xc4\x3b\x66\xd9\xd6\x66\x29\xaa\xfc\xe2\x0b\xa9\xea\x1e\xbd\xe2\x7f\x03\x46\x7a\xfe\x86\x79\xd6\xd4\x3b\x40\x2d\x08\x4c\xa5\xae\xd7\x73\xdf\x4d\x46\x56\x5c\xb4\x02\xd5\xee\xf8\x6d\x17\xd0\x8f\xbd\xe5\x96\x28\x2a\x11\x60\x71\xa8\x85\x81\x07\x51\x5f\xc7\x7f\x7c\x47\x19\xf4\x40\xed\xa8\xfb\xb9\x8e\x71\x9b\x6c\x0d\x91\xd6\xd2\x1a\xa5\x23\x12\x9d\x2a\xc5\x7c\x04\xfc\x23\xfb\x80\xab\xf8\x77\xa2\x85\x40\x19\x29\x67\x7a\x36\x97\xa9\x80\x95\xeb\x07\xc4\x32\x2c\xe1\xec\x58\xd5\xf5\x19\xf4\xa6\x82\x1d\x86\x95\x3a\x35\x64\x9e\x80\x21\xf8\x3a\x56\xbd\xc7\x2e\xf7\x0e\x35\x3a\x30\xb8\x27\x09\xb3\xc4\x04\x29\x86\xd2\xee\xcb\x9f\x99\x2a\x37\x03\xe2\xfa\xdb\x16\x5f\x62\x62\x89\x15\xf6\x4e\x63\x7d\xa5\xca\x3b\x10\x3a\xef\x2a\xda\x79\x62\xb8\x88\xad\x7e\xe7\x3e\x13\xa3\x30\x39\x0d\x92\x28\x76\x81\xa8\x67\xf8\xdc\x83\x38\x6e\x4a\xeb\xa9\xf8\xd2\x02\x47\x4c\x39\xa8\x9a\x74\xa4\x66\x9c\x06\xc2\x42\x15\xbb\xea\xb9\x51\xed\x14\xa7\x01\x50\x0c\x44\xfa\x88\xfe\x2f\x83\x45\x34\x4c\x74\xe4\xf5\x40\xb2\x72\x12\x96\xf5\x7d\x74\x84\x61\xde\xa7\xd5\x76\xe1\xef\x12\x71\x5b\x48\xaf\xcb\x01\x17\x79\xdd\xb5\x6a\xc6\x03\x1f\x0c\x1d\xcf\x76\x1a\x19\x6a\xac\xa0\xef\xe9\x50\x9c\xab\xb3\xff\x4d\x1c\x25\x58\xe2\x3c\x9f\xed\xc6\xf1\x3d\x1a\x27\x80\xbe\x4e\x79\x82\x62\x07\x96\x9c\xc7\x35\x91\x90\xa3\x5f\x7c\x38\x55\x36\x59\x2c\x72\x18\x6a\x1a\x8e\x0a\x33\x26\xaf\x4e\xa4\xc2\x53\x79\xc0\xfe\x9a\x5c\x93\xad\x70\x4a\x94\xad\xd7\xed\x55\x69\x6f\x50\xf9\x73\x4a\x80\x45\xce\x99\xee\xd2\x1d\x5e\x30\xe9\x8a\x6b\x9a\xd3\x24\xd4\x78\xd4\x6e\x2a\x18\xec\x73\x94\x07\x34\x74\xc4\x5b\xab\xc5\x7a\xf9\xd3\x57\xc0\x4d\x10\x47\x9c\x72\xae\xb5\x87\x80\x8a\xca\x72\x78\xd9\x6c\x7f\x07\xa0\x1b\xff\x20\x95\x21\x9a\xa0\x1a\x54\x2e\x2a\xf8\x9e\xa1\x66\xf3\xed\x59\x91\xca\x18\x85\xdb\xbc\x7a\x65\x0f\xe9\xe2\x54\xc4\x89\x55\xe3\x41\xe0\x69\x6b\xcb\xd4\x7d\x13\x20\x31\xe8\xd3\xe5\x41\x94\xaf\x67\x51\xf4\x2d\xd4\x6a\x57\xd4\xd0\x78\x2a\x71\xdc\x48\xee\x44\x03\xa8\x88\x7d\x33\xc6\x4c\x85\x34\x28\x08\x7c\x14\x59\x81\x4c\x04\xad\x3b\x41\xba\x8b\x02\xc7\x3d\xdf\xf2\x10\x22\x27\xb2\x27\xa0\xe2\x54\x06\x14\x79\x78\xe4\xb9\x2a\xa0\x1a\x40\x95\x38\x95\x89\x95\x3d\xb9\x9b\x3d\xef\x76\x65\xde\xbd\x99\x6a\xbd\xa7\xff\xf7\xff\xfb\x7f\x0f\xe5\x87\xda\x83\x7a\x2b\x32\x25\xf2\x87\x76\xfb\xed\x7a\x70\x40\x74\x94\xc4\xe8\x2d\x52\x28\x3e\xc3\xe7\xa6\x6c\xa0\x68\x32\x04\xd9\x16\xfd\xa7\x54\x4a\x93\xb0\x83\xee\x4c\x44\x91\x39\x6d\xb7\xce\xf6\x03\x16\x25\x0a\xfd\xdc\x08\xbc\xbb\x8e\x5a\x50\xd0\xde\x6d\x44\xb8\xef\xbc\x37\xc4\xa9\x96\x21\xd6\x6e\x9b\xb2\x42\xe2\xf5\xac\x79\xdb\xc2\x07\x54\xd7\x98\xa9\xc1\x6e\x4e\x81\xa7\x88\xef\x7f\x13\xf5\x53\x56\x38\x39\xc0\xf5\xaf\x45\xb5\x39\x0b\x22\x83\x1c\xe1\x4a\xe4\x0a\x83\x3a\x93\x90\xd5\xa4\x37\x27\xa9\xd3\xc5\x9f\x8b\xe2\x1d\xaa\x4d\x95\x15\xad\x89\x93\x0f\xf1\x1e\x2c\x54\x0a\xa1\xe6\x07\xd5\x6d\x7c\x5d\x13\x58\xb5\xab\xbb\x73\xa3\xde\x3c\x29\xe7\x2f\x83\x2c\x2c\x0a\x05\x9a\xf4\x16\x81\xde\x9c\x2b\xc7\x5c\x72\xfb\x85\xa2\xd0\xe0\x6a\x2b\x66\xb9\xa8\x8e\x7e\x4c\x59\x94\x10\xb4\x00\x1e\x16\xb3\xb0\xfb\x9b\x04\x64\x16\xa9\x8b\xee\x2f\x2a\xd5\x96\x7d\x65\x90\x35\xbe\x39\x12\x71\x64\xb9\x9e\x5f\xcb\x52\x3f\x9e\xaf\xe9\xd0\x7c\x37\x26\xf1\x16\x05\xfc\x6c\x2c\x6f\xda\x20\x06\xc9\xe2\x94\xa0\xbf\x7d\x57\x16\xa2\x81\xa1\x71\xc4\x62\xcd\x2c\xaf\x71\x97\xe7\xdc\x57\x67\x34\xff\xc6\x37\x20\x91\xdd\xc9\xde\xb2\x8f\x76\xaf\xe8\xed\x43\x46\x78\x64\xbf\xac\x25\xf3\x45\xd2\xba\x49\x86\x8b\x25\xca\x52\x1c\x78\xa1\x36\x0c\x7f\x39\x55\xe0\xb1\x51\xc7\xfd\x07\xa4\x61\x10\x2a\x5f\x03\x87\x56\x77\x53\xdf\xa4\x59\xe1\x8c\x46\x49\xd0\x4b\xac\x2d\xf2\xb2\x80\x7a\x55\xfc\xc8\xf2\x49\x94\x8f\x51\x03\xb8\x8f\x09\xbf\xc9\x7e\x13\x1f\x1f\x53\x4a\x46\xce\x58\x9a\x44\x8e\x0f\x64\x52\x56\x36\x98\x60\x9c\x51\x95\x8c\xd2\x39\x88\xd8\x9a\xdc\x91\xf3\x98\xdb\x78\xe0\x65\x07\xd5\xc7\x34\x1c\xd4\x57\xf2\x9c\x7b\x2a\xd2\x5f\xff\xe3\x2f\x9c\xda\x57\x71\x92\xf3\x2f\x45\x86\x72\xd5\x5f\xb0\x90\x72\xc6\x8d\x42\xb4\xd1\xd1\x92\x0a\x96\x85\x87\xd5\xbb\x76\x21\x38\x46\x32\x0e\x58\x5a\x75\xb9\x46\x91\xb7\x5d\xec\x54\xdc\x21\x9b\xc6\xc4\xfb\x67\x42\x0a\x34\x4c\x4e\xb9\x50\x7f\xa9\xe9\xe2\x7e\xa3\x18\x53\xce\x98\xf9\x9e\x55\x8d\x63\x84\x2e\x20\x1f\x07\x52\x98\x66\xd6\xa1\x12\x5a\x2f\xc4\xe9\xbe\x82\xdb\x69\x7d\x06\x8c\x60\xc0\xe5\x5b\x79\x6e\xba\x83\x9e\x81\x50\x6c\x4c\xd5\xfe\x11\x26\xbe\xd1\xc4\x21\xea\x7d\x1c\x6d\x7c\x31\x5b\x2d\xd6\xbf\x72\x35\x98\x21\x44\xba\xd2\xcc\x1f\x20\xdb\x5d\x79\x14\x50\x64\xc6\x48\x4b\x8d\x2a\x8e\xb0\xd2\x8b\xa2\xf1\x2b\x8d\x07\x41\xa8\x6d\x9c\x0a\x8d\x91\x0e\x1a\xcb\x79\x10\x52\x5f\x1f\x80\x7b\xb4\x5d\xa6\x3f\x96\x2b\xc4\x70\xf9\x4e\x34\x21\xbd\xb5\xf5\x28\x8a\xd7\x33\x9e\x9f\xa3\x11\xe0\x81\x49\x31\x74\xd9\xee\x61\x4f\xe2\xa7\xff\x71\x18\xaa\x98\x0e\x18\xc1\x9f\xe1\x73\x12\x3e\x74\x1d\xa3\x90\x63\x2c\x0c\x83\x4d\x9b\x37\x28\x8b\xec\xe7\xb4\x4b\x1c\x23\x4b\xc0\x21\xab\x1f\xb3\xfa\x2b\x19\x3b\xce\xe3\x38\xb5\xfc\xed\xf3\xf5\xe6\x9a\xa5\xbc\x6d\x07\x2b\x65\x56\x95\x52\xc8\x2c\xb7\xf5\xde\xa3\xd1\xc6\xac\x8b\x33\x8c\x7c\xd1\x44\x7d\x8b\x19\x85\xf3\x98\x85\x8e\x6f\xda\x12\xdc\xb4\xd3\x13\x74\xf8\x87\x1f\x81\x58\x1b\x99\x8c\xf6\xb9\x01\x87\x10\xe7\x24\xb0\x92\xb4\xfb\xf2\x84\xa1\xdd\x11\xb3\xe1\x57\x25\x9b\x9c\x13\x6e\xc5\x09\xf1\xa3\xe8\x95\xae\xe7\x97\x5b\xaf\x4a\x20\x41\xbb\xfa\x35\xfb\x80\x85\x70\x55\x7c\xc9\x64\xbc\x12\x16\x63\x0d\x3c\xc2\xea\xb2\xba\x19\x96\x32\x70\x9e\x80\x30\x51\x8f\x99\xb4\x8b\x77\xb0\xc7\x73\x1a\x30\x14\x2b\x40\x06\x91\xd6\x04\x8e\xba\x16\x92\x7a\x42\xd2\x47\x51\x37\x23\x4b\x83\x53\x6e\xcb\xde\xec\xee\x3d\xa9\x61\xe5\x9c\x2a\x69\x51\xdb\x20\x74\x37\x15\x29\xa4\x92\x76\x0e\xf3\x16\xf2\xeb\xca\x06\xce\x39\xb3\x0a\x85\xfb\x4e\x09\xea\x06\x7b\xf5\x57\xe9\x69\x77\x8d\x34\x51\x38\x24\xb5\x7a\x83\xa3\xf0\xb7\x4f\x29\xe0\xa0\xa3\x8a\x78\x76\xec\xfe\xcc\x52\x92\xd8\x95\xdc\xfd\x49\xd8\x02\x8d\x7f\x6c\x0e\x75\x97\x18\xe4\x22\xa0\xcc\x0c\x16\xc3\xb7\xb2\x81\x7c\xb4\x8a\xb9\x60\x24\x92\x5d\xa1\x3b\x5a\xaa\x37\x3c\xc0\x2b\xa3\x80\xcb\x80\x61\xfe\xbf\x35\x0d\x87\x6e\x1b\x97\xa1\x89\x87\xd3\x93\x4e\x26\xba\x34\x61\x22\xba\x21\x7d\xcc\xfe\x73\xce\x74\xd6\xfc\xff\x39\xfb\x97\xe6\xc6\x71\x2c\x7f\x18\xfe\x2e\xff\x55\x2d\x7a\xc1\x3b\x81\x77\x27\xc9\x72\xa6\xba\x6c\x4b\x2d\x29\x33\xab\xba\xa3\x43\x71\x00\x1c\xd8\x2c\x4b\xa4\x86\xa4\xd2\xd6\x7c\xfa\x37\x78\x00\xf0\x26\xda\x59\xf3\x44\x4c\x74\x4e\x99\x10\x45\x91\x20\x70\x2e\xbf\xcb\x87\x19\xd8\xf8\x6b\x35\x86\x6d\x89\xe6\x92\xd7\x83\xd0\x9a\x49\xc9\x52\x69\xa3\xf7\x26\xc9\x9c\xac\xfe\x30\xa9\x59\x60\x01\xa4\xdf\x31\x57\x45\x69\xf9\xac\x1f\xf6\x91\x3f\xfc\xb7\x5b\xe0\x99\x0a\x3c\x23\xea\x48\x80\xbc\xce\x91\x7b\x3c\x2c\x49\xa9\x17\xad\x6e\x36\x1d\x86\x9e\xf0\x78\x0b\x5a\xa5\x99\x44\x51\x59\x4f\x54\x8e\x31\xe4\x9a\xb2\xcc\x4f\x3c\x9b\x18\x43\x65\xde\xa0\xd3\x24\x1c\x97\x7b\x5e\x4c\xe0\x2c\xdb\xd8\x37\xc1\xb0\xc6\x12\x3b\x8f\xdb\x76\xa4\x49\x9f\x9e\x0b\x35\xac\x34\x70\x2f\x4c\x29\x1e\xdd\x5f\x4a\xdc\x97\x08\xd5\xa5\x44\x12\xb4\x68\x07\xa4\x11\xa1\x46\xb3\x6a\x51\x1c\x8f\x28\xfb\x1b\xb1\x35\x68\x30\xff\xb8\xf1\x68\x2c\x46\x8b\x12\xe4\xb1\x27\x6e\x6b\x0f\xfb\x9e\x4f\x95\x74\x1b\xdf\x52\x5a\x84\xd3\x4e\x2b\xcd\xe0\xc0\x08\xa7\x3a\xcc\x8f\x29\x17\xdd\x93\x1f\xe0\xe4\x73\xe1\x01\x22\xd5\xd5\xaa\x8b\xb8\xc3\x9f\xfb\x37\xb7\x02\xf0\x48\xf1\xd8\xd9\x94\xa3\xb2\x65\x74\x53\x7d\xf8\x9b\x80\x93\x7f\x8c\xda\xd0\xf6\xc4\x71\x14\x26\xb6\x79\x66\x8b\x10\x1b\x28\xe1\x84\x75\x4f\xda\xe2\x6f\x4c\x3c\x1e\x27\x90\xa4\x3d\xfd\xd2\xcf\x5b\x26\x3c\x89\xbd\x10\xdc\x0b\x94\xeb\xec\x79\x04\x4a\x77\xc3\x12\xe6\xb9\x82\x9d\xa5\x9c\x51\x30\x6d\xb7\xa4\xdd\x4b\x71\x39\xaa\x39\xfe\xbb\xd5\x40\x65\x3c\x8d\x25\xed\x60\xff\x86\xbc\xee\x29\x20\x31\x9e\x26\x21\xb1\x33\xb6\xc5\x6b\x7f\xa5\xe0\x29\x18\xfa\x74\x7e\x39\x2d\x4f\xe7\xfa\x4a\x65\xb9\xf6\x65\xe6\xa9\x34\xa0\xcf\x26\x98\xa1\x8a\x45\xb7\x05\xf0\x14\x85\x90\xae\xbf\x6e\x02\x6d\x45\x95\x8c\x96\x7c\x66\x07\x32\x3f\x65\x9d\xbe\xc4\xf9\x98\xdd\x6e\xa8\x9c\x45\x86\x3b\x7d\x68\x85\x6d\x6c\x7b\xf2\xdc\x83\x2c\x72\x86\xc6\x04\x2c\xcb\x65\x93\xc7\xfe\x1c\x28\x19\x76\x26\x37\x8c\x33\xcd\xa8\xc1\xbe\xac\x24\x9c\xfb\xd5\xf6\xd1\x04\xe0\x31\x67\xcd\x2c\x9d\xcd\x67\x8e\x19\xc1\xb9\x48\x08\x09\x76\xff\xae\xfa\x77\x90\x23\xa7\xae\x0e\xe4\x79\xf6\x92\x91\xe2\x20\xf9\xd6\x4d\x47\x6e\x1c\xbc\x38\x14\x4e\xfd\x90\x62\x9f\x7b\xc4\xc7\x42\x91\x1d\xfa\x2f\xd0\x32\x1c\x62\x9f\xc8\x1b\xdb\x2f\x1b\xf7\xf5\x90\xa6\xc2\x6f\x97\xec\xd6\xe0\x77\x20\xce\x68\x87\x0a\x34\x65\xe1\xaa\xd0\xb5\x6c\xe1\xdf\x5c\x82\x67\x11\x61\x3f\x11\x8e\x8f\x63\x65\xa4\xde\x5b\x62\x3f\x80\x91\xa2\x5f\x4c\x2e\x97\xd9\xf1\xf5\x83\x37\x1d\x93\x98\x50\x2d\x8b\xc7\xbb\x91\xcc\x1b\xe3\x08\xc6\x20\xe1\x50\x52\xef\x7a\x69\x9c\x72\xa7\xef\x18\x02\x12\xa7\xa0\x99\xee\xbd\xfa\x08\xd7\x01\x24\x16\xae\xef\xaa\x4c\xa3\x12\x15\xd7\x21\x0b\x6d\xb4\x6a\x6f\xf6\xe2\x85\x90\x5f\x04\x3d\x9d\x5f\x97\x79\x9d\xd5\xd7\x95\x1a\x7f\x2c\x35\xbe\x2d\x8f\xb3\xfd\xe2\xeb\x72\x77\xd8\x2c\xb7\x87\xed\xba\x65\x7f\x36\x03\x24\x59\xd6\x99\xbe\xc9\x5d\x09\x6f\x53\x34\x15\xae\x15\xd0\x9b\x60\x74\x54\xed\xbe\xf1\x79\x35\x1e\x3c\x2e\x95\xd5\x59\xab\x8f\x64\xe3\xe2\x80\xb2\xfd\xc4\x0b\x3c\xa9\xd0\xb2\x0b\xbe\x55\x58\x1a\xca\xa7\xf1\x69\xfe\xe0\x3e\x82\x9f\x1a\x49\xd5\x07\x84\xe7\xcb\xb4\xb2\x19\x83\xc0\x26\x01\x1b\x53\x8d\x6c\x26\x7a\x5f\x4f\x91\x41\x18\xf8\x78\x23\x13\xb8\x98\x90\xe0\x71\xe3\x23\x41\x54\x1d\xab\x6e\xf5\xc1\xd7\x86\xb1\x20\x5e\xf4\x09\xde\x9b\x97\xbb\x6f\x90\xd2\x7e\x31\x87\x04\x5d\xcf\xa3\x7e\x2b\xf6\xe5\x85\x3a\xba\x65\xfd\x54\x58\x78\x68\x3b\x54\x22\x0b\xac\x3a\x6c\x3d\xac\xb7\x42\xe4\x09\x42\x8d\xdb\x3e\xfd\x0e\xeb\x8e\xbd\x64\x7a\xd1\xd3\xf0\x79\xf7\xf1\x24\x26\xe5\x83\xaf\x50\xbd\xe4\x05\x29\xb2\xf4\x16\x03\x88\xd2\x80\xa0\xfd\xdf\xf3\xec\xdd\xe2\x9c\xdb\x43\x52\x52\x99\xcb\x15\x61\x37\xc5\x88\xef\xce\x20\xc2\xc4\x6b\xa9\xfe\x19\xaa\xdf\xff\x5c\x74\xd8\xde\xe1\x6d\x8d\x43\xce\xa1\x9d\x26\xcb\x56\x5e\x7a\x3c\x2c\x31\xd9\x4d\xab\x4b\xbf\x85\xb7\x9b\x53\x01\x53\xaa\x8b\x6d\xe4\x0b\x56\x16\x67\x6b\x07\x24\xbe\xc1\x5a\x97\xa6\x4d\x3c\x69\xe0\xf5\x8f\x89\x8e\x0b\x24\x32\xe6\xb1\x81\xb5\x1a\xfe\xdb\xc8\x17\x84\x41\xa2\x25\x11\x79\x2c\xf0\x75\x75\x3a\x63\xa9\xad\x34\xd9\xf9\xb6\x04\x0c\x69\x9a\x12\x82\x91\xfc\x7c\x4c\xd1\x8f\xe2\xef\x1c\x8e\xcd\x5b\x48\xee\x13\x76\x28\xd3\x2a\x71\x12\xbf\xee\x6f\x9c\xa7\x81\xb9\x6b\x4d\xd4\x63\x52\x90\xc0\x6b\x8f\x4a\x03\xc7\x7f\x2e\x8e\x99\xcb\x59\x01\x3c\x20\xc7\x47\xf3\xaa\x8b\x41\xa7\x02\x80\x85\xe4\xfb\xb3\xff\xba\x5d\xee\xbe\xae\x1f\xee\x82\xf6\x88\x10\xb6\xee\xfb\x8a\xfb\x7f\x8e\x6f\xb9\xf0\x02\x23\xaf\x5d\x6d\x51\x77\xd4\x82\xd1\xa0\x34\xa2\x8e\x27\xf9\x48\xef\x47\x8d\x4b\x37\x46\x70\x2a\xc1\xbe\x40\x45\x5e\xee\xeb\xdc\x29\x05\x39\xe0\x15\x1b\xad\x2f\xc2\x0a\xaf\xd3\x6a\x0a\xb9\x7a\xcb\xe4\xcb\x30\x22\x1e\x8e\x97\x49\x9c\x7a\x6d\x53\x73\x5e\x5c\x9e\x5f\xea\x55\x4e\xbd\x3d\x91\xb5\xe0\x43\x50\x09\xa7\x07\xf9\x95\x7a\x01\xfd\x50\x02\x94\x30\xd0\x43\x6c\x3e\x63\xd4\xab\xcc\x92\x32\xe2\x82\x32\x50\xd2\x38\x28\xab\x62\x03\x65\x9d\x63\x69\x77\xd2\xe1\x6f\x46\x65\xa2\x24\x51\xcb\x6a\x53\x94\xcd\x2c\xa1\x7a\x85\x3b\x8b\x0e\x62\xaa\x11\xae\xaa\x55\x5b\xb3\xcb\xf2\xe2\xdc\xee\x3e\xa0\xe3\x84\x04\x0f\x0f\xba\x49\x71\xdb\x79\xae\x39\x26\xb6\xc5\x39\x53\x3f\x3f\x43\x33\x0a\x8f\x27\x42\x38\x05\x51\xab\xa9\xfb\x41\x3c\xf8\x9f\xff\xfe\xa3\xd5\x7f\x66\xff\xf1\x03\xf6\x5f\x77\x0e\xe9\x39\x35\x38\xf7\x74\x77\x35\xb8\xb9\x2a\x7c\x2f\x4a\x22\x87\xe1\x3b\x58\xec\xf8\x6e\xd6\x92\xfc\x84\xef\xb3\xd8\xd2\x88\xbe\x60\x6e\x63\x2b\x6b\xaa\x38\xbc\x65\xc2\x8f\x62\x8a\x1b\x9c\x33\x44\xeb\xef\xf4\x7f\xc4\x67\xff\x63\x74\x5a\x65\x94\xcd\x9c\x35\xc4\xbc\x78\xc7\x51\xb0\x2a\x02\x26\x03\xfb\x2b\x77\x28\x4b\xac\xe7\xa4\xb3\x30\x1e\x25\x45\xa4\x1d\x25\x6a\xa2\xb0\x22\x02\x0c\xe8\x35\x3c\x16\x6f\x0b\x38\xb7\x0e\x5f\x4c\x84\x61\x40\x7e\x41\x45\x7e\x06\x83\x8b\x38\x1e\x4f\x3d\x8d\x80\xe9\x50\x5b\x84\x89\x01\x96\x4a\xa8\xf1\xb9\x30\xe2\xab\xa3\x11\x2a\xb4\x81\x15\xad\x7a\x36\xd0\xbe\xef\xf4\x75\x98\x88\x62\x41\x51\x0c\x35\x92\xaa\xce\x48\x88\x89\x08\x44\x0a\x3d\x1c\xf7\x8d\xc2\xc9\xe8\x72\x22\xa9\xa5\xa3\xcb\x0d\x53\x7c\x37\x00\x3d\xe6\xf5\xf4\x24\x6b\x5c\xeb\x5b\x93\x7a\x26\xe2\x28\xa0\x5a\xc5\xc1\x7b\x6f\x42\x92\x17\x3c\x66\xd0\x7f\x1b\x45\xe2\x31\x68\x9d\x5b\x2e\x24\x45\x95\x13\xe9\x8d\xec\x57\xc7\xcb\xba\xab\xc0\x88\xd4\x97\x96\x2c\x6b\xc4\x09\xa7\xf7\x71\x91\x46\x06\x3a\x3b\x57\x67\xa2\xa0\x13\x2e\xa1\x45\xb4\xf8\xc9\x7f\x07\x89\xa5\x60\x5c\x69\xe1\xc8\xc6\x78\xee\xb7\x4e\x04\xe7\xa6\x94\x66\x24\x07\x4c\x7c\x43\x41\x56\x6b\x23\x6c\x07\x42\x1a\xfa\xa6\x47\x0f\xc7\x47\x32\xf4\x7b\x74\xd5\xe5\x76\x08\xc3\x04\x7a\x0a\xcc\x04\xd2\x3c\xdd\x16\x1e\x85\x08\xba\x72\x7f\x59\x5c\xce\xd9\x38\xa4\x14\x82\x1b\x3c\xc2\x7e\xf5\x65\xb9\x75\xe7\x17\x12\x8c\x56\x79\x93\xd3\x37\x21\xd1\xfc\x72\xfd\x3c\x94\x17\xd2\x8b\x29\xa9\x3d\xa2\xae\xd3\x51\x1d\x46\x48\x16\x47\x96\x85\xb6\x59\xaf\x1f\x0e\xa8\xb2\xfa\x10\xba\x4e\x8e\x50\x51\x44\xd9\x97\xd5\xcd\x9a\xcf\x76\xcb\xfd\x72\xf6\xd8\x1e\x8e\x83\x04\x5d\x5e\x95\xe5\xf0\x8c\xd3\x1d\x0b\xa1\x52\x9f\xd0\x0d\x97\xbc\xea\xe2\x6a\xa1\x84\xa0\x5f\xe8\xd4\x07\x7c\xcf\x9a\xda\x7a\x56\x21\xc0\x73\x03\x6d\xfb\xe8\x19\xeb\x43\x65\x56\x6a\x7b\x44\xa7\x86\xfb\x6a\xf8\xd9\xad\x1a\x45\x35\xbd\xc7\x08\x2d\xc2\x48\xba\x34\xb9\xd9\x8b\x06\x1d\x2f\x33\x48\xfa\xd2\x67\x06\xd9\xd5\x2b\x5a\xcb\xc0\x4b\x84\xe3\x31\x1a\x09\xe1\x8f\x74\x65\x06\x5f\x29\x83\x58\x46\x5d\xc1\x91\x22\x89\x4e\xed\x7a\xf8\xc5\x01\x93\xe8\x75\x12\x10\xe3\x34\x56\x86\x81\x34\x76\xfe\x9b\x2f\xed\x9f\x22\x2f\x36\x58\x4e\x32\x24\x34\xae\xaf\xed\x41\x08\x28\x0d\x9b\xdd\x7d\x5f\xed\xd6\xdb\xdd\x61\xf6\x74\x77\xd8\xcc\xb6\xfb\xa7\xe5\xd6\xe4\x1a\x8b\xe5\xd3\xde\x8d\x8e\x42\xae\xac\x9c\xe3\x61\xf9\x6d\xdb\xfe\x39\x41\xea\x6f\xdf\x1b\xc3\xbf\xb6\x55\xff\x4b\x33\x08\x26\x23\xc6\xa9\xc7\xd2\xb2\x4b\xa7\x54\x47\x26\x57\xfe\x1b\x91\xdc\xc1\xa6\x28\x23\x10\x3c\x68\x41\x21\x8b\x0b\xa9\x03\x64\x3f\xb1\x7d\xe5\xdc\xc5\xc7\x81\x4f\x2c\x17\x85\x65\xf6\x13\x8d\xed\xaa\x7d\x04\xf7\x2d\x4b\x7f\x78\xd1\x31\x4b\x09\xa4\x74\x86\x73\x5b\x35\x96\x31\x06\x8e\x6d\xbe\xc3\xe3\x71\xdb\x3c\x16\x77\x2c\x89\x18\x6d\x79\x55\xf6\x9c\x77\x25\x23\x99\xc4\xc2\x48\xfa\x3d\xcb\xcf\x36\x78\x99\xc6\x21\x81\x2e\xdd\x4d\xfa\x9e\xc1\xf4\x7d\x9a\x5c\x07\x25\xf3\x94\xcd\x7a\x4c\x1a\xe5\x18\x12\xee\x70\xc0\xa8\xb0\xeb\xce\x7e\x68\x92\x28\x78\xc6\x43\xf1\x96\x63\x79\xcb\x0b\x92\x2c\x4d\xe2\xa1\x5c\xce\xaf\x6a\xd8\xee\x83\x0a\x49\xac\xc2\xfc\xb8\x7d\xf1\xad\x79\x8c\x83\x42\xa2\xe4\xb1\x59\xd1\x28\xc2\x73\x11\x42\xfc\x61\x80\xff\xff\xf1\xbf\xed\x97\x41\x88\x64\xb5\x64\x84\x7a\xba\xba\xc0\xaf\x8a\x6a\xd3\xbf\x0e\x78\x2b\x8d\x6c\xdf\xdd\x43\x96\x1f\x7a\x9e\x9d\x4c\x0a\x65\x9c\x1c\x0d\x27\x69\x42\xa8\x43\x4a\xdf\x1b\x68\x23\x2e\xe0\x78\x1c\x3e\x84\xd1\x6f\x90\xc2\x50\xd8\xa9\x45\xe2\x42\xb7\xf2\xa3\x0e\x94\x94\x42\x51\xd1\x9d\xe2\x78\x87\x87\xbb\x2f\x4a\xb3\x57\xb9\xeb\xc4\xd0\xa7\x0d\x16\xa4\xbc\x58\x59\x8d\x8e\xc8\x2e\x31\x66\xbc\x53\x5f\x23\x82\x10\x41\xbc\x86\xdf\xa4\x3d\x63\xf4\x71\xa1\xd6\x3b\x39\xe9\x0c\x06\x28\x8f\x9b\x0a\xd0\xef\xd9\x6b\x26\x27\x7a\x4b\xfd\x79\xa1\x7c\x1d\x6b\xa7\xf8\xee\xe2\xc5\x89\x8c\x42\x05\x3c\xf0\x9d\x7d\x5e\x96\x3f\xef\x8c\xf9\x78\xf6\xde\xc9\x48\xb4\x03\x35\xd1\x47\x5e\xa0\xda\x94\x85\xce\x8e\xb8\xc9\x64\x7d\x29\x3f\x28\xc2\xa9\x30\x48\x6d\xaa\x4e\x22\x8b\x65\x71\xba\x91\x65\x18\x7f\x02\x02\xda\xe7\xff\x75\x81\x0a\x9a\xbd\xaf\x2b\x0c\xb5\x23\x34\x61\x7d\x73\x6b\xc7\xdf\x73\xcf\xaa\xda\x31\x18\x10\xb0\xc9\x70\x56\x1f\x0a\xf9\xda\x31\x03\x54\x14\x78\xe0\xb7\xbd\x84\x2f\xce\x7f\xc3\x45\xb2\x2a\xf6\xe2\x28\x70\xf1\xd5\xcd\xf5\xde\x32\x99\x55\xec\x25\x54\x50\xd9\x2f\x9e\xfe\xec\x95\x12\x54\x9c\x32\x63\xec\x68\xfb\x43\x83\x1a\xcb\x07\xec\x29\xf7\x51\xce\x09\xc5\x04\xe7\x33\xe6\x6a\xaa\x38\x33\xfa\x40\xe2\x71\xc2\x21\x99\x2d\xff\x80\xef\xbd\x96\xba\x4a\xd2\x98\xa2\xdc\xdd\x4b\x71\x9e\xde\xc0\x55\x22\x52\xcf\x56\x23\x66\x57\xc8\xeb\xbb\xb2\xc8\x6a\x23\xa6\x95\xfd\xcf\x05\x0f\x8b\xe2\x74\xae\xf1\x10\x0f\xdf\x3c\x95\xea\x94\x84\x4d\x16\xeb\xc7\xc7\x6f\x4f\xab\xbd\x6b\x93\x2a\x96\xb4\x25\xe4\x27\x7c\x5b\xe6\x8a\xcc\x85\x7e\x91\x9c\xd8\xcf\xf2\xd0\x60\xbd\x77\xf0\xf3\xc6\x8c\xb2\x37\x2a\x8e\xa9\x43\xdd\x02\x55\x9e\xb2\xfc\x2f\x18\x0c\xf6\xdb\xb1\xa9\x49\xd4\x0c\x7c\xc9\x7a\x3c\x6f\x0d\x6d\xa0\x89\x9e\xab\x71\x2f\xab\x97\xf0\xb9\x53\x30\xa6\x4c\xa6\xe0\x66\xe4\xe8\xcd\x04\xf0\xb0\xaf\xf1\x43\x2e\xa6\x06\x76\x8c\x1f\xdc\x74\x50\x21\x65\xcb\x8f\xb3\x3f\x56\x8f\xdf\x1e\x57\x4f\xdf\x97\xbb\xfd\xe3\xf2\x69\xbf\x9b\x3d\x3c\xac\x7f\xb4\x92\x3f\x4a\xf8\x8c\x24\x43\x1f\x71\xe0\x84\xcb\x94\x88\x95\x97\xb6\xeb\xc5\xef\x57\x39\xba\x28\x91\xfa\xc2\x71\x25\xc9\x3a\x65\x3a\x8e\x54\xd2\xf7\x25\x3d\x2e\xd7\x6f\x5c\xe5\x46\x79\xab\x57\xf2\x55\x32\x56\x8a\xb7\x6f\xf3\x10\xd6\x38\x3d\x2b\xa5\x50\x6a\x9c\x1d\xf4\x8e\xca\x10\x2d\x6a\xe3\x21\xcb\x5f\xad\xb7\xcb\x64\x3f\x47\x49\xc9\xa9\x23\x76\x2e\x6a\xa8\x5d\x2c\xa0\x94\x9f\xd2\x92\xbb\x38\x22\xfc\xcd\xc6\xf0\xf0\xb4\x4a\x05\xc6\xf2\x29\xf4\x6d\x88\x6c\x0f\x60\xa0\xb4\xea\x10\xff\x46\xe3\x7b\xfa\x47\x22\xf8\x54\x95\x25\x0e\x94\x51\x25\x73\xd7\xa7\x3d\x46\x24\xa4\x7f\xb7\x61\x9f\xd2\x00\xbe\x29\xc5\xd5\x87\xec\x34\x62\x19\xa2\x27\xa5\x6f\xe3\xe8\xcd\xca\x26\x0d\xae\x22\x85\xbe\x00\x17\xad\xb7\xdb\x6e\x5f\xf7\x01\x7d\x94\x44\x22\x58\xec\xd7\xb2\x5b\x87\x9a\x10\x4b\x46\x2d\xf8\x61\x32\x3b\xc7\x80\x33\x66\x27\xca\xe1\x19\x4e\x78\x18\xd6\xc9\x30\x50\x1e\x35\xfd\x4e\xf0\x6e\xd8\x1b\x46\x38\xab\xea\x8e\x1b\x4f\xc8\xb2\x79\x33\xd6\x9a\xd0\x81\x93\xef\x2d\x86\xdc\xa7\x7e\x50\x96\xd7\x25\x9e\x33\xb5\x7b\xc9\xce\x56\x8f\xda\x8d\x00\xe0\x4e\xcd\xe6\xe9\xf2\xfc\x91\xb3\x3a\xc3\x28\x34\xa0\xa8\x4c\x16\xdb\x0b\xb1\x69\xed\x1c\x72\xc7\x63\xcf\xe1\xb9\xf6\x1d\x66\x7b\xf4\xcb\x23\x16\xd1\x14\x30\x80\x88\x3b\xfc\x89\xc7\xe2\x8c\x65\xb5\xb8\x8c\x22\x58\x8c\x50\x91\xae\x18\x56\xb2\x2c\xde\xee\x50\x66\xd5\x54\xd5\x68\x78\xfa\x38\x0e\x7c\x7b\x0d\x94\xf3\x7e\x85\xea\x65\xad\xd4\xba\x5c\xfe\x1c\xa7\xfe\x18\x33\x8f\xf0\x62\xe4\x3d\xd5\xfe\x8a\x24\x0e\xb8\x71\xc3\x2e\x4a\x5c\xd5\x83\xd0\x0f\x13\x60\xe4\xd9\x79\x86\xeb\x72\xff\x75\xf4\xd3\x12\x11\x52\x2b\xe0\xaf\x5e\x05\x15\xd3\xd8\xec\xc9\xf7\xab\x79\x7f\x29\xc1\x34\x91\x84\xa1\x3a\xe0\x7b\x56\x8d\x9c\x26\x19\x32\x5b\xa6\x24\x39\x0e\x83\xeb\x1b\x7e\x17\x43\x8f\xea\xff\x8b\xf5\xee\xeb\x6c\xf1\xf4\xe7\x44\x2d\x1b\x21\x76\xd4\x67\x57\xaf\x1f\x98\xae\x30\x04\xe9\x53\xcc\x4e\x9d\xf5\x0f\x6b\x2d\x08\x2a\x75\x46\xa5\xdf\x2a\x2c\x67\x3f\xb1\x09\xbd\x1d\xb0\x67\x7b\x03\x1b\x44\x11\x6b\xd9\x52\xc6\xdd\x4b\x33\x3c\xa7\x00\x41\xce\xb3\x87\x26\x58\xca\xde\xf1\x48\x4f\x6b\x9a\x78\x39\xfa\xa4\x0e\x58\x27\x44\xfe\x75\xd7\xec\xb2\x1f\x0b\x97\x33\x94\x91\xd0\x96\x2b\x4e\x79\xd5\x20\x80\xe9\x76\x6d\x94\x91\x24\x31\x2b\x77\xb7\xe6\x99\xba\x2f\x4a\xd7\xef\x17\xb7\x21\xb7\xfb\x5c\xc2\x89\x1b\x26\x2e\x57\x01\x6d\x91\x05\x65\x8a\x24\xde\x48\xdd\x17\x13\x85\xfe\x8e\xd7\xc3\xff\x62\x59\x3c\xe1\xdb\xef\xad\x3c\x00\x4a\x11\x3b\xcb\xce\xfb\xac\x7a\x99\x4f\x3a\x06\x30\x44\x8c\x55\x27\xa4\xb5\x81\x4c\xcd\x41\xbe\xce\xdb\xfa\x57\x77\x41\xda\x0f\x09\x6d\xbf\xac\x5f\xc4\x70\xff\x42\xcd\x8d\x88\x70\xb3\xde\x19\xe6\xde\xc3\x58\xb2\x02\x35\x68\x4a\xb5\xce\xa6\xa2\x7c\x08\x0e\xa4\xbe\xee\x8e\xea\x84\x40\x29\x35\xbc\x5a\x63\x46\x7b\x44\x7b\x29\x17\x7d\x87\xc1\x4e\x29\xdd\x0e\xf0\x83\x80\xf8\x2b\xf9\xe5\x44\xdd\x6b\xac\xc7\xa6\xfa\x4c\xfb\x3c\x24\x00\xb1\xf3\x55\x22\xd6\xe6\x61\x31\xdb\xb4\x03\x14\xa7\x54\x82\x0a\x47\x44\x2c\x6b\x81\x4a\xd9\xf3\x4b\x7d\xbc\x6e\x06\x14\xc8\x91\xca\x35\xd3\xbe\x36\x53\xbe\x26\x05\x9c\x01\x5c\xc0\x8e\x08\x54\x4c\x80\xac\x73\x89\x2b\x69\x64\xe6\xaa\x45\x4f\x06\x4f\x87\x81\xc2\xa4\x6d\xff\x9a\x8e\x9a\x5b\x98\xfc\xe0\x63\xc3\xab\xfe\x42\xa2\xa3\x44\xc4\x7a\xa0\x1e\xfa\x98\xe5\x23\x45\x75\xa6\xe3\x50\x12\xb8\x25\x27\xe1\x2f\x43\x7d\x99\xe5\xd7\x7d\x31\xcb\x47\xad\x30\x1d\x4b\xd3\xb8\x32\x53\xed\x09\xdf\xad\xd6\xe2\x2f\xe4\x34\xed\xa7\x93\x30\x24\xf5\xa5\x3f\xff\x18\xb0\xf4\x74\x92\xa6\xa1\xe8\xbb\xe4\xb8\x74\xec\x56\x57\x97\xe9\x84\x31\x2b\x31\xf4\x13\x06\x20\x1d\x9d\xd8\x62\xec\xb7\xdc\x98\xe0\xb4\x52\xca\xe3\x2e\xcd\xe8\xb2\xd2\xd0\x0f\x9a\x1f\x65\xb8\x26\xf3\x4b\x99\xcf\x49\xaf\xdd\x88\xea\x7f\xf4\x19\x46\x3d\xc1\xa1\x68\xf2\xc8\x28\x82\x69\x06\x9c\x9a\xed\x5f\x70\xe8\x44\xc4\x34\x0f\x52\x0a\x0a\x9c\xfd\xed\x73\x0b\xea\x33\xdb\xdd\x7d\x51\xee\xb2\xe3\x4f\x2c\x29\x59\xe9\xdb\x6b\xf4\xb0\x03\x9a\x47\x71\x62\xec\x3b\x6c\xe8\xe0\x58\x8c\x83\xd7\x5a\xf3\xc4\x78\x4c\xf7\x40\xae\xc9\x04\x23\x45\x73\x61\xf8\x78\x5d\x97\xbb\x7f\x61\x83\x56\xb7\x16\xbe\xf2\xb4\x73\x1c\xfc\xd6\x19\x0e\x36\x47\xb4\xd1\xe6\x39\x17\x79\x55\x94\xd5\xc8\xf0\x95\x69\x11\x1a\x71\xd1\xaa\x2e\x86\x0a\xf0\x4c\x8b\x88\xfb\xba\x13\xc4\x98\x5c\xa5\x34\xd5\xf1\xff\xdf\xff\xef\xff\x3d\xcd\x67\x7b\xcf\xf3\xff\x6f\xe1\xa1\xa6\x4a\xaa\x7d\x29\x5e\x5e\x0d\x14\xf4\x33\x54\xaf\x96\x7e\x42\x4e\xc5\x27\x72\xbd\xd9\x17\xc6\xd1\xca\x5d\xb1\x4c\x34\xed\x31\xff\x7a\x9a\xcf\x56\xed\x1f\x79\x04\x06\xb1\xd7\xa4\xdf\xbd\xcd\x80\x6c\x01\x96\xef\xe7\xec\xd6\xd8\x82\x69\x95\x06\x20\x1d\xd0\x88\x52\xb3\xc8\x71\x52\xb4\x42\x41\x88\xc9\x37\xcc\x1e\xe1\xbd\x35\xa5\x63\x1a\x03\x4d\x8b\xd9\xef\x57\x81\xe5\x17\xcc\xb1\xca\xaa\x89\x7d\x5a\x63\x12\x3a\x25\x61\xe3\xdb\xb9\xfa\x80\x0f\xaa\x75\xe2\xd3\x1b\xf6\xa3\xe5\x25\x0d\xcd\xe4\x46\xb7\x47\x63\x14\x58\x25\x85\x45\x81\x7a\x8b\x6f\x83\x9f\xc5\x3d\x2f\xe6\x34\x60\x5f\x3c\x3f\x77\x2c\xaa\xae\xfc\xd8\xce\x67\xee\x79\xc2\xec\x3f\x36\x08\xa0\x0e\x4d\xb3\x0b\x4d\x16\x16\xb8\xe7\x7b\x8a\x6a\x1c\x7f\x15\x59\x6e\xde\x56\x77\x00\x7c\xd6\x9b\x46\x93\x2f\x31\xf7\x02\x0f\x43\x87\x98\xe9\x07\x99\xdc\x0b\xb9\x0e\x3b\x24\xc9\xc1\xda\x4e\x1f\xca\x1e\x5d\xaa\xbf\xd2\x72\x2f\x12\x9c\x0a\xbf\x5f\xfe\xb8\xfb\xba\xdd\xf4\x56\x37\xee\xc5\x9c\x19\xd7\xdd\xca\x4a\xbc\xb8\xd0\x88\x7b\x89\x25\x08\x1b\x59\xbb\x22\x1b\x82\x09\xb9\x97\xf2\x84\x02\xf8\xdd\xa6\x2b\x41\x70\x8f\xf9\x82\x4c\x52\x2a\xd0\x38\x14\xeb\xe3\x1e\x0b\x83\xc4\xec\xab\x57\xd3\x9c\xb9\x2f\xca\xcf\xf4\xfa\xb8\xc7\x22\x43\x2f\x3b\xff\xac\x0f\xe7\xe3\xa9\x36\x75\xba\xc3\xb3\xe9\x5d\x76\xd7\xca\x23\xa3\xa8\x62\x9a\xb3\x46\x33\xae\x3d\x96\x44\x04\x7d\xb3\xdd\x38\x63\x0c\xdc\xf7\x66\xe6\x1e\x57\x89\xa7\x06\x4a\x16\x5f\xa0\xea\xa9\x0c\x70\x0f\x02\x1d\x5a\x93\x0b\xf5\x54\xf4\xb2\x99\xd1\x53\x13\x81\xd0\x96\x41\x4f\xb2\x65\xbf\x8d\x0f\x1b\xa1\x81\x0a\x1d\x0a\xaf\x43\xc1\x71\x4f\x86\x9a\x76\xf6\xfb\x6f\x4f\x77\xab\xa7\x2f\x03\x6d\x22\xee\x49\x34\x0d\x9e\xdd\xa9\x13\xa2\x6a\x8f\x69\x8f\x4a\x54\x0f\x30\x12\xf5\xe0\x9e\x52\x68\x34\x98\x9b\x3b\x47\xde\xe4\x65\x35\x1a\x82\x01\x0f\xa4\xc9\x27\x9f\x31\xdc\x75\xca\x1a\xdc\xd3\xbe\x4f\xab\x99\x0b\x09\x9f\xbe\xef\x75\x59\x9c\xbe\x4c\x78\xc8\xba\x4f\x84\x41\xca\x1c\x90\xa6\x75\xae\x19\xcc\x1c\x1d\xc5\xc9\x80\x70\xd1\xfe\xdd\x10\x31\x1e\xa1\xae\x5f\xf0\xad\xfd\x33\xc4\x96\xf4\xe7\xcc\x3d\x9b\xb0\xc5\x70\xf4\x6e\xac\x53\xb8\xef\x69\xa4\xe5\xad\x99\x81\xed\xe6\x6a\x8f\x05\x18\x5b\xa3\xba\x7a\x53\x62\xbb\x31\x4d\xad\xe4\xcd\x60\xe5\x39\x31\x95\x47\xf7\x90\xfc\x10\x58\xca\x5b\xe0\x3c\xc9\x36\x0d\x3f\x16\x0a\xee\x5b\x88\x22\x69\x36\x18\xb4\xfe\xa5\xa3\xb6\xb6\xf7\xca\x8f\x12\xe1\x44\x38\xb6\xa8\x37\x70\xdd\x4d\x58\x4a\x71\x3f\x0e\xb5\xe8\xb6\xe3\xaf\xc5\xa5\xc2\xf1\x88\x28\x32\xac\xfc\x43\x89\x0a\xf1\x34\xd1\xa8\xe4\x7e\x2c\x35\x95\x19\x9d\x85\xce\x7c\xb9\x3f\x7c\x9f\x3d\x7c\x5b\xba\x9f\x96\x84\x48\xc5\x8d\xe6\x07\x7f\x3b\x9b\x73\xec\xea\xb2\xe7\xc4\x3d\x3c\x61\x1a\x04\xce\x13\x75\x7d\x54\x3b\xc4\xe3\xed\xda\xce\xfd\x34\x8a\x8d\x4b\x45\x51\x98\x36\xd8\x4f\xdc\xd1\x16\xfe\x61\xff\xe8\xa3\xbf\x8f\xd5\xc9\x9a\xbc\x1e\xa8\x93\x6f\x60\x3d\xf7\xf3\x87\xe9\xd7\xd2\xe7\x9e\x36\xd5\xa6\xe6\xdd\xd9\x99\xad\x7f\x74\x99\xdc\x17\x3e\x6b\x63\xda\xef\x45\xdd\x83\x63\x8e\x6b\x75\x13\x95\xd9\x51\x8d\x96\xfb\x3c\x36\x93\x59\x15\x56\xc8\x66\xec\x80\xf4\xc1\xaf\xb6\x1f\x87\x38\x8a\xad\x84\xc5\x43\x51\x55\x3d\xd8\xb3\x7b\x5a\x90\x72\xda\x09\x15\xca\xf2\x7a\xae\xbf\x36\xaf\xfe\xe7\x7e\x18\xf6\x83\x82\x19\x38\xe9\xc5\xc0\x7e\xee\xcb\xe2\x14\xec\x8b\xd0\x9d\x57\x48\x95\x26\xed\x62\x58\xdf\x17\xe5\x16\xcf\x45\xd9\x2c\xa9\x1b\xa7\xd7\x90\xd7\xe6\x5a\x7a\x58\x76\xee\x4b\x2f\x08\x44\x2b\x7b\x48\x57\xdc\x86\x02\xdc\x97\x41\x42\xa4\x1a\xf5\x50\x3c\x3f\xb5\x7f\x0c\x43\x8e\xfd\xe0\x7a\xff\x4e\x48\x8f\xd1\x0c\x98\xb8\xbd\x52\x84\x46\x88\xc7\xda\x9b\xcd\x7e\x42\x0d\x43\x19\x1b\xee\xab\x48\xd1\xea\xe5\xc0\x94\xf2\x75\x84\x86\xe2\x3e\x32\x23\xd2\x74\x82\xf7\xc7\x22\x27\x52\x45\xbb\xac\xfa\x3a\x61\x14\xf0\xd5\x86\x6b\x5c\x16\xa7\x79\x66\x0b\x15\xed\x77\x68\x66\xc1\x51\xcd\x77\x0c\x30\xc4\x03\x4b\x0f\x1e\xf8\x71\x42\xf7\xf5\x6c\xd2\x91\x6a\x7e\x75\xce\x13\x2e\x6f\x72\x03\x39\xa7\xe8\xbb\xee\xf3\x4f\x48\x0c\x61\xad\x75\xb3\xaa\xe4\xca\xec\x4d\x93\x8f\x37\x08\x62\x8f\xea\x3f\x8b\xed\x9f\x9b\xfd\x7a\xfe\xed\xe1\xc1\x5d\x41\x90\x98\x6a\xc8\x43\xf1\xfc\xb1\xb5\xf3\xf8\x6c\xca\x28\x25\x53\x6f\xc2\xac\xbd\x8e\xcb\x3c\x49\x5f\xe6\x41\xa0\x03\x32\x06\x51\x66\x8f\x35\xba\x3f\xf6\x58\xe8\x99\xf5\xf7\x19\x9b\xad\xbc\x86\xe3\xa1\xea\x21\x45\x79\x10\x0a\x06\xb6\x29\x30\x5f\xfc\x39\x7c\x54\x41\x14\x01\x17\xed\x3e\x40\x15\xbc\x72\x3c\xc4\xd2\x29\x4c\xcf\xb3\xc6\x3d\xc2\xe9\xbb\x31\xec\x1a\xbe\xee\x41\x24\x03\x7a\x1a\x1a\xe5\x0b\x91\x4e\x8c\xe1\xda\x75\x97\xc3\xb9\x7a\x29\xea\xdb\xb2\x02\x0f\xe2\xc4\x27\x10\xf3\x11\x4e\xa2\xa8\xe6\x97\xec\xa8\x7a\x69\x31\x0f\x12\x5f\x39\xbd\x0b\xd7\xfd\x72\x40\xdc\x11\xb0\x60\xaa\xe3\x3e\xbc\xbe\x84\xf9\xce\x3b\x79\xa9\x9e\x71\x83\xa5\x53\x4b\x18\x5d\x54\x02\x32\xf0\x1c\xa0\x68\x95\xb7\x30\xa7\x26\x87\xd3\xaa\x93\x99\x6b\x56\xa1\xc9\x7d\x2e\x60\x49\x1c\xf7\x3b\xcb\xb3\x60\x3e\xbd\xe0\x07\x8c\x85\x10\x58\xca\xe1\xdf\x25\xd7\xd8\x8f\xf2\x14\x5c\x34\x69\x4a\x55\x66\x31\x1f\x8c\x81\xd0\xa4\xda\x67\xb8\xde\x17\xe5\xfa\xfc\x19\xf3\x79\x74\x7a\x48\x38\xa9\x78\x99\x94\xd7\x48\x60\x4c\x5e\xe1\xb4\x69\x2f\x0f\x20\x0d\x49\x46\x6a\xb5\x58\x3f\xad\xfe\x65\xf4\x56\x17\x0f\xeb\x5d\x13\x87\xed\x57\x8f\x6e\x8f\x0c\x20\x35\xf8\x54\xfd\x7e\x7e\xbc\x1c\x9d\x11\xd4\xe0\x9f\x76\xa4\x89\xba\x9b\x9c\x86\x54\xb6\x9d\x3b\xb3\x3b\xce\x15\x1a\x44\x03\x15\x80\x9b\x35\xa1\x87\x14\xe3\x01\x08\xa4\xe6\xc7\x17\xac\x97\x3f\xe1\x78\x71\xe1\xbd\x33\x1a\x70\xc3\x94\x69\xa5\x4e\xb4\xf9\xff\xde\x93\x11\x61\xcc\xad\x35\x6a\x5d\x5e\x9a\xcb\x78\x84\x3c\xd3\x6d\x5d\x8b\x07\x82\x2b\xc2\xfc\xec\xbf\xef\x5f\x4a\xac\x5e\x5a\xf5\x00\x1e\x08\xc1\x24\xef\xd3\x4f\x48\x05\x66\x78\x6b\x65\x18\xea\xe6\xe3\x94\x04\x3d\x5c\xe4\xeb\xd5\x14\xf4\xb7\xb4\xd3\xde\x6a\x58\x4d\xef\x88\x81\x8c\x62\x91\x76\xd5\xb5\x81\x7f\x39\x0f\x64\xd2\x26\xce\x5f\x2e\x58\x55\x36\x65\x9a\xfe\xc9\x92\x0b\x22\x77\x51\x6d\x6d\x77\xb8\xff\xb6\xff\xb6\x6d\x9f\xb0\x04\x4d\x58\xd1\x6f\xe7\x63\x01\x6a\xf5\xf8\xa5\x3d\xa0\x02\xd3\xf1\xec\xb9\x70\x56\xa4\xc6\xfe\x61\xab\x96\x07\x28\x39\xf1\xa6\xce\x25\xf6\x75\xb3\xda\x1b\xa8\xb5\xf6\x7b\xca\xd9\x4b\x03\x85\xfd\xb6\xbb\xfb\xad\x6d\x08\xde\x5c\x7f\xe8\xa5\x2c\xb4\x12\x33\x8f\xf0\x2e\x47\x38\x44\x1e\x7a\x10\x92\x3a\xbf\x05\xd0\x3f\x7e\xf2\xba\xda\x4f\xf8\x1c\xa8\x27\xb1\x5b\x2e\xd6\x4f\x77\x87\xfd\x6a\xb9\xed\x19\xf0\xf1\xd0\x47\xa0\x32\xc3\x25\xa7\x7d\x2e\xfb\x5f\x74\xba\xd6\x83\xd0\x3e\xf4\x51\x09\xd3\x1f\xa3\x22\xd7\xa8\x74\x31\xf9\xee\x86\x41\xe8\x53\x55\xf4\x4b\x13\x30\xbf\x12\xe4\xe4\x15\xf3\xc7\x4b\x9d\x9d\x8f\x59\x1b\xbb\x87\x41\xc8\x48\x9b\x75\x5b\x5c\x9b\xbc\x3b\xef\x93\x6e\x27\xc0\x08\xcd\x07\x8c\x28\x39\xd9\x27\x75\x09\x61\x18\x44\x92\x0a\x8f\x04\x48\x9e\x67\x65\xcf\x14\x89\x87\x41\x2a\xb8\x75\xd6\x6e\x32\xe2\xa1\xbe\x0d\x0f\x43\xc1\x22\xa7\xfb\xb5\x2f\x46\x5b\xcb\xa7\xc2\xa4\x3c\x8c\x63\x45\xaa\x5d\xfa\x92\x53\xb9\xe5\xbe\xb8\xb4\x3f\x2e\x66\x5c\x9a\xbc\x51\xfd\x70\xd6\xeb\xee\x10\x20\x13\xbd\x19\xd2\x57\x47\x99\xfa\xd9\xb1\x56\x84\xfb\xf8\x81\xd9\x8d\x83\xe3\xf0\x82\x52\x48\x50\x38\xca\x9a\x7c\xbd\x9c\x0f\x99\x25\x67\x7c\x4e\x2a\xe2\x21\xf3\x52\x12\x5c\x7c\xc3\x6c\x5f\x6c\x8d\xcc\x92\xb1\xa7\x1e\xee\x2d\x21\xf7\x8d\xd2\xce\xec\x78\xdc\xc0\x75\xd6\xf7\xb3\xe1\x21\x8f\x38\x37\x4c\x83\xe6\xcb\x35\x94\xa7\x1d\x49\x34\xfe\x62\xbe\xf0\x48\x3a\x33\x9d\x05\x94\x65\x51\x2f\x4a\x54\x99\xab\xa0\xf3\x10\x02\x9f\x88\x97\xb3\xbb\x7d\xfb\x27\xa6\x48\x6e\xbb\x79\xbd\xb0\x84\x5b\x0c\xd1\xf0\xaa\x41\x0a\x6b\x9c\x25\x9c\x88\x47\xa1\xb3\x7a\x02\x65\xcb\x43\xd0\x61\xdc\x59\x53\xee\xb2\xe7\x7e\x82\xfd\x8f\xde\xcc\x12\x51\x44\xd9\xd2\xc3\x45\x5d\x4e\x7f\xab\x75\x6c\x3f\x28\xc1\xf0\x47\x66\xb2\xbe\xc0\xf1\x5f\x17\x6c\x43\xee\x50\x79\x81\xa5\x74\xe4\x6a\xb5\x58\xcf\xaf\x1f\x4b\xff\xf0\x50\x61\x20\xc3\xbe\xe3\x72\x76\xba\x9c\xfe\x75\x29\x6a\x18\x2d\x1f\x18\x28\x63\x0b\xa5\x4e\x59\xbe\x54\x59\xbd\x70\x84\x5e\x7f\xac\x7a\x32\xba\x54\x4c\x52\x72\x6f\xd4\x25\x22\x09\xc5\x74\x44\x3a\x1e\x22\x06\x04\xd9\x04\xa5\xa8\xd2\x6f\x17\x07\xbb\xa7\x0d\x97\xd0\xb6\x5f\xc1\x43\xed\x87\xce\xaf\x64\x53\xbc\xe2\xa9\xc8\xe7\x48\xce\xa2\xd5\xe8\xb2\xb5\x2f\xc8\xfa\x39\xcb\xe5\xfc\xda\xe2\xf7\x78\xa8\x53\x20\x48\x42\x65\xb5\x74\x48\xe5\xed\x0e\xae\xed\x71\x0e\x14\x0a\xb6\xc8\x1b\x63\xad\xa4\xa6\x1e\xa2\x96\x9c\x44\x79\x47\x3d\xad\xcc\xe2\x35\x9f\x8a\xaf\x23\x15\x34\x1e\x79\x68\xe8\x92\xae\x84\x32\x1d\x5b\x45\x3e\xf7\x98\xf3\xa7\x79\x2a\xf2\xfb\x4b\xfe\x3c\x68\xb9\xb5\xf7\xc7\x8d\x97\x9e\x6b\xf3\xd2\x43\xef\x97\xf5\xa2\x40\x18\x54\x17\xe6\xea\x0e\xae\xeb\xbc\x47\xb6\xe4\x51\x18\x18\xc3\x1d\x17\xef\xf5\x0b\x5d\x51\xc4\x53\xed\x28\x53\x26\xab\x6e\x52\x05\xe3\xad\x51\xdd\x17\x25\x66\xcf\xb9\xd7\x0e\xd6\x46\xa1\xdc\xe0\x33\x48\xef\xc9\x1e\x89\x23\x1d\xf6\x99\xea\x9f\xaf\x27\x51\x1c\x1b\x85\xf9\x0a\xeb\xaf\xc5\xf1\xd6\x1c\x86\x47\xb1\x08\xa8\x72\xf6\x17\xc8\xd7\x73\x61\x7a\x7a\xcb\xfa\xa5\x33\x9c\x6b\x86\x00\xb5\x4a\x80\x52\xc1\x16\x09\xc7\xa3\xd8\x4a\x26\xf5\x7c\xea\xfa\xde\x4a\xa3\x6b\x49\xc2\x94\xaa\x61\x36\x38\xa0\x48\xf0\xeb\x6c\x7b\xd7\xf5\xe0\x78\x94\xa8\x84\xee\xef\xb1\x78\xee\x3c\x34\x6c\x7e\xd4\x81\xfb\x08\x15\xe8\x76\xfa\x28\x65\x9c\x72\x93\xdf\x2f\xf9\xb3\xbe\x0c\x1e\x17\x53\x26\x19\x31\x2b\xbb\x31\xd7\x9c\x7c\x87\x23\x86\x31\x3d\xf5\xec\x74\x36\x3d\x10\xfa\xe6\xc0\x9d\x88\xfb\x56\x89\x75\x71\xd7\xa5\xde\x11\x84\x81\xf1\xc9\xb8\x88\x53\x56\x2f\xca\x62\x92\x48\xdf\x8c\x33\x65\x50\x8b\x0e\xa2\x02\xd1\x6e\xf5\xef\x65\x7b\x1e\x60\xf4\x0b\xe6\xc7\x6c\x7e\xcc\x26\x39\x5d\x76\xa4\xe0\x29\x85\x85\xab\xbc\x2e\xcc\x82\x35\x3d\xe9\xa5\x6f\x3c\x75\x0d\x32\x6e\x83\x54\x28\x31\xad\x2e\xf7\xa5\x92\x19\x99\x93\x6d\x21\x8a\x7a\x5f\x82\x72\x01\xc2\x6f\xa3\x53\x71\x74\x0e\x39\x56\x8a\x85\x34\x48\xa6\xbf\x57\x05\x8a\xb6\x71\x5d\x94\x27\xa8\xad\x3a\x28\xfd\x84\x68\xf4\x4b\x54\x6a\x0c\x1f\x2e\xb9\x9b\xca\x6b\x41\xf1\xe7\xa8\x7e\x14\xa9\x14\x7c\xcf\xe1\x15\x3a\x2d\xb6\x4f\x3a\x64\x3c\x52\x3a\x26\x0a\x4b\x76\x22\x23\x9d\xb2\x6a\x76\x9b\xea\x01\xeb\xe6\x6b\xb4\xd9\xd6\x7e\x6b\xc7\x26\xa9\x6d\x92\xcf\x5a\xa7\xd8\x66\x71\x26\xe5\xe8\xaa\x1b\xc6\x0d\x63\xb3\xf8\x4c\x07\xef\x53\xc4\x2d\x8f\xd0\x63\x44\x28\xfd\x9f\x0b\x96\xd7\x1f\x90\x35\x41\x4e\x7f\x05\xc1\x28\x56\xa4\xa7\x23\xe1\x58\x67\x79\xa1\xdd\x01\xed\x45\x18\xd9\xfd\xc8\xda\x51\x7f\xd2\xbd\xe2\x91\xf6\x91\xf6\xaf\x87\x4c\xe3\x06\xaa\xea\xad\x28\x95\x6b\x54\xf1\x48\x27\x9c\x6e\xe9\x66\xbd\x7a\xda\xef\x0e\xfb\xf5\xe1\x61\xf9\x7d\xe9\xca\x19\xb1\xe7\x99\x46\x38\xd6\x2f\x07\x23\x37\x76\xf8\xeb\xa2\x9e\x5b\x26\x0f\x73\xe3\x94\x08\x8c\x0d\x84\x01\xf4\x5a\xba\x9b\x3b\x8d\x1f\xf9\x9e\x73\x66\x97\xc5\xe5\x5c\xf4\x68\xb7\x23\xcf\xe3\x66\x30\xd2\xc4\x76\xfa\xbb\xf3\x61\x37\x93\xc7\x7e\xac\x49\x1a\x1f\x94\x22\x3c\xde\xf8\xb0\x66\xb1\x4d\x53\x0c\x33\x85\xba\x48\x6d\x52\x30\xfc\xb2\x20\x48\x6d\x75\x8c\x34\x28\xb4\x1e\xe9\x34\xf3\x38\x68\x62\xb1\xb6\xfe\x49\xff\x7b\x29\x3f\x88\x6a\xe2\x90\x07\xa9\x53\x14\xdc\x16\xc5\xe9\x53\x1c\x11\x8f\xa3\xc8\x13\x56\x3a\x2f\x3b\xc1\xd1\xca\x85\x0e\xbf\x3f\x8a\x3d\x2a\x90\x11\x4e\x79\x5b\x5c\x8e\xcd\xd4\x9d\x63\x4d\xbc\xa6\x81\xd9\xb6\xfd\x40\x1c\xa5\xda\xee\x5a\x5f\xe0\x84\x7d\x3d\x35\x3b\x22\x89\x81\x32\xf9\x27\x7c\xa3\xa9\xf3\xa5\x84\x5b\xa9\xf0\xe9\x6d\x24\x4e\x92\x90\x70\x5c\x3f\x30\x7b\x7e\xa9\x51\xed\x9a\x05\xaf\x47\xe5\xe5\x71\x02\x06\x9e\xe8\xa4\xbe\x37\x59\xde\x17\x31\xe0\x71\x22\xfd\xd0\x26\xb4\xa4\x8a\x75\x8b\xfe\xe6\x71\x82\x52\x19\x64\xfd\x4f\xc3\x9d\x6f\x31\x01\xe3\x81\x5a\xc6\x81\x8b\xea\x9d\x2c\xec\xf1\x08\x35\x96\x3d\x4b\xee\xc9\x57\x23\x4e\x23\xdf\x14\xde\xac\x23\xe0\xe0\x2a\x53\xa5\xe8\xd9\xb8\x98\x62\x76\x3c\x36\x8b\xcd\x68\xb2\xb1\x38\xa4\x2e\xb8\x68\xde\x8d\xeb\xa4\x9c\xcd\x6d\xc6\x1a\xb3\x04\x5d\x0d\x6e\x67\xde\x87\x0e\xc8\x62\x3a\xf8\xa3\x5f\xc9\x52\x53\x81\xd8\x35\x73\xba\x09\xc9\x55\xf3\xf8\x17\x45\x5e\x8f\x61\x9f\x3c\x66\x1c\x89\x05\x5f\xe4\x12\xd7\x97\xba\xee\x16\x95\x98\xfb\x0c\x8d\x72\x8d\xc2\xf7\xb5\x6e\xa2\x09\x5a\xc1\x87\x5f\xc6\x43\xcf\x1b\xc0\x31\x76\x58\x5f\xce\x56\x89\x84\x42\xce\xf1\x07\x34\x46\xc2\x05\xb3\x07\x72\xb3\xb3\xc8\x8b\x89\x15\x39\x86\x38\x26\xf3\x66\x71\xb9\x42\xae\x10\xca\x51\xb9\x2d\x86\x34\xa5\xaa\xcd\xe3\xec\x61\x4a\x69\xa9\x9f\x89\xc5\x90\x32\x02\xa4\x9c\xb2\x63\x93\x55\x59\x54\xae\x05\x29\xf0\x18\x74\x42\xf1\xb0\x5b\x95\x5a\xfb\x96\xb1\x3e\x7e\xff\xfa\x34\xb3\xa2\xda\x47\xed\xa6\xd4\x00\xbc\xd1\x0c\xc1\xc0\x21\x3a\x8b\xf2\xb6\x62\x18\x8b\x28\x74\xc2\x34\x07\xc3\x6a\x46\x75\x38\x1f\xe1\xda\x86\x6f\xb1\x88\x21\x6e\x2d\xcd\xa8\xae\x34\xcb\xab\xb7\x71\xb9\x35\x16\x31\x7a\xca\xc6\xac\x5d\x95\xda\x4a\xe4\x7d\x9e\xc5\xc5\x42\x48\xde\x69\xf6\x53\x23\xa1\xa7\xf5\xcb\x63\xe9\x43\x4a\x1a\x19\xdd\xe4\x2b\xca\xe5\x6e\x31\x17\xd7\x5d\x67\xb6\xc4\x63\xf4\x20\xee\x68\x0e\x9f\x3e\x0f\x4c\x42\xcf\xf6\x0c\x24\x56\x15\xb1\xc0\x7f\x3a\x3a\x05\x8f\xb5\xd0\x49\xda\x8b\x59\xe7\x50\xca\x42\xe1\xb8\x6f\xf3\xeb\x7f\xdc\xf9\x30\x40\xc3\xf9\x50\x4f\xf8\xd6\x59\x68\xfd\x6a\x4f\xee\x1e\x77\xe2\x71\x4d\x48\x1e\x2b\xed\x33\x1d\xcd\x24\x7e\x04\xd2\x72\xe6\xc9\xea\x7a\xba\xc1\xe4\x06\x27\x82\x56\xe0\x59\xa6\x96\x3f\xa1\xd7\xba\x4f\x7c\x66\xec\xfa\xef\xbe\xdc\x89\xc3\x2f\x84\x27\x3f\x3a\x39\xf7\xa9\xb0\xb6\xca\x05\x56\x75\xbf\x1b\x32\xbd\x27\x25\x21\x57\xac\xcd\xe5\x73\x03\x5e\x99\x6a\x5e\x26\x21\x00\xb1\x5d\x17\xeb\xa7\xfb\xd5\x97\xc3\xe3\xec\x8f\x83\xb1\x4d\xda\xb9\xcb\x8f\xfd\x40\xf6\x4a\xc0\x58\x76\x29\x5e\x12\x47\x61\xca\x5c\x23\xa8\x99\xa3\x24\x7a\x92\xd5\x57\xab\xc1\xf1\x09\x03\xee\x33\x4e\x20\x4f\x62\x0c\xa9\x09\x67\x22\xf7\x5b\x0e\x22\x4f\x12\x2f\xa4\x5b\xa2\xb1\x96\x2f\xb3\xe3\xd1\x7a\x60\xb9\xa3\x81\x64\xba\xc5\x34\xd2\x8c\xc4\x71\xd0\x91\xa4\x41\x14\xd9\xd0\xf6\xd1\xea\x8f\xd8\x84\xec\x66\x20\xa3\x5e\x40\xa7\xdf\x3f\xdb\xee\xe9\x37\xcf\x6f\x14\x1e\x79\x92\x26\xa6\x56\xe7\xac\xd2\x9b\xfb\x72\x07\xd9\xdf\x8e\x19\x7b\x45\xaa\x24\x4d\x53\x65\x98\xe7\xd7\x7f\xba\x0c\xcd\xca\xb5\x4d\xcf\x94\x34\x35\xa4\x2e\xeb\x56\x6f\x78\xde\x37\x04\xec\xe1\xcd\x66\x5e\xa8\xec\x7d\xf8\x67\x21\x2c\x28\xa5\x9a\x5f\x6d\xad\x77\xb2\xdc\xef\x3e\x1a\xb2\xc0\x88\x46\x64\x39\x61\x54\x87\x57\xc3\x40\x09\x43\x3e\x7d\xdf\x60\xb9\x7f\x77\x8f\x87\x69\xa3\x89\x6a\xd8\x0e\x7d\x9d\x6f\x9e\x80\xcf\xfc\x56\xba\x6c\x62\xaf\x4b\x40\x68\x4f\x5a\xe9\xd0\xba\x03\x1b\x4c\x12\x22\x78\x22\x92\x90\x52\xb7\x2f\xab\x87\x87\xd5\xfa\xa9\x67\xd6\xc1\x13\xe9\x27\x84\xa4\xcb\xaa\x55\x6e\xc3\x6a\xf2\x17\x69\x8f\xa3\x94\x7e\x27\xb1\x37\x78\x7f\x86\xdd\x73\x17\xb9\x25\xca\x97\x54\x25\x24\x8f\xfa\xfe\x82\x9a\x28\xa5\x53\x1b\xa2\x99\x6a\xd6\xb4\xbf\xf1\xe8\x7c\x28\x3c\x2f\x6c\x55\x3a\xd1\x12\xd5\x86\x3f\x51\xfb\x11\x89\xbd\x6d\x97\x0f\xcb\xd9\x6e\x79\xf8\x32\xdb\x1d\xee\x97\xcb\xf6\x0d\xd6\x81\x26\x9e\x14\x25\xc0\x43\x5f\x83\xe1\xec\x49\xbd\xc4\x94\x61\x4b\x94\xc5\xe9\x84\xb9\xba\xbf\xe4\x6a\x5f\x6c\xcc\x26\xf6\x69\x72\x93\x7a\x42\x90\xb5\x82\x29\x5a\xdc\x65\x95\xb4\x38\x87\x8b\x1c\xbd\x78\xa9\xef\x7b\x10\x3a\x6b\xe2\xf3\xb1\xb8\xa2\x9a\x1f\x0b\xa7\x17\xc2\x53\x3f\x8e\x62\x5b\xb3\x99\xd9\x30\xad\x2f\x9e\xc7\x53\x9f\x69\xd9\x41\xfd\x07\xf3\x27\xf5\x85\x47\x1b\xd7\xae\x2e\xde\x09\xd3\x33\xf8\x64\x80\x46\x7e\x9c\x82\x02\x1b\xb9\xf5\x20\x4b\x69\x04\x3e\xb5\xe2\x36\xdf\xb6\x8b\xaf\xcd\xcd\xb4\xc4\xee\x6f\x4f\xab\x7d\x37\x06\x43\xd9\x09\xf3\x10\xc2\xeb\x23\x6d\x6d\x9e\xc6\x60\xb8\x00\x4d\x7a\x40\x10\x27\xe7\xba\xc1\xd3\x58\x9b\xbe\xdf\xea\x69\xb5\x5f\xcd\x1e\x2c\x26\x79\xf7\x6d\xb3\x79\xf8\xd3\x8d\x49\x7c\x2f\x32\x2b\xd9\xcf\xe2\x15\x9d\x8a\xd7\xcd\xfe\x31\x45\xb6\xe1\x69\x22\xc3\xb4\x79\xf2\xff\x7e\xf8\x3a\xb8\x0b\x29\x53\x14\x60\xe8\xec\xdd\x3c\x5b\xea\xb7\x96\xd7\xd5\x07\xc5\x9b\x94\xf9\x08\xad\xe2\x8f\xbc\x94\x50\xb7\xbc\x06\x9e\xb2\xc0\xa7\x4a\xa2\xce\xb4\x53\xaa\xe1\x29\x43\x46\xa8\x98\x03\x28\x45\xec\xcc\xe1\xa4\x4d\x79\x14\x11\x67\x68\xb1\x5d\xce\xf6\xee\x36\xff\xd6\x1e\x4c\x08\xc9\xa4\xc9\xee\x6e\x5f\xfc\xc0\x6c\x74\x57\x79\x0c\xdc\x6a\x3b\xee\x8e\xd9\xf9\x0c\xcf\x16\x06\xbb\xca\xe7\xe7\xf6\xca\x78\x9a\x10\x6d\x87\x24\xb6\xef\x0a\x57\x91\xb0\x47\xc1\x0b\xb4\xe9\xd0\xd1\x2c\x6b\xe7\x00\x70\xc3\x12\x15\x4d\xdc\x74\xab\x7f\xc4\x53\x11\x1a\x70\x63\x57\xbc\x58\x9e\x68\x1a\x8f\xf0\x43\xa9\x48\x62\x05\xed\x6a\xf0\x52\x94\x75\xdb\x6d\x76\x23\xd2\x90\x7b\x83\x1a\x9a\x7b\x73\xac\x00\x90\x49\x94\xdc\x68\xcd\xb1\x5d\x5d\x3e\xec\xef\xf5\x36\x90\x54\xa6\x01\x49\x67\x1c\x8a\x7c\x0e\xad\x0e\xcd\x07\xff\xfb\x9f\xf0\xbf\xf4\x7f\xfe\x7f\xdd\xa7\x51\x18\x19\x7d\x3c\x1e\x61\x67\x4d\x9d\x87\xfe\xe8\x1f\x49\xa1\xf2\x54\x79\xb1\x69\xd1\x41\x59\xf5\x8c\xcc\x87\xcf\x51\x31\x20\xb2\x1d\xb9\x9d\xcf\x8b\xfc\x06\x9f\x3a\x9a\xd1\xe8\xa7\xd4\xbd\x3d\xc3\xb5\x57\xa3\x4c\x11\x12\x2d\x5d\x60\xad\x9a\xed\xab\xd9\x75\xa9\x5b\xd6\xf2\xf1\x09\x5e\x8d\x44\x28\xfe\x7b\xdd\xef\x54\x33\x2b\x77\x06\xaf\x38\xe9\x36\xf4\x9f\xb8\xcb\xf3\xd8\x7f\xff\xf1\x37\x16\xf4\x54\x83\x2f\x88\xb5\x53\x16\xff\x6b\x4d\xcf\x0d\x8a\x75\xf2\x12\x98\x17\x32\xba\x3f\x2f\xc5\xdb\x23\xe4\xd7\xbb\xac\x0b\x72\x98\x07\x1e\xf5\x38\x07\x82\xf6\x7e\x7b\x14\x63\x2a\xdb\xca\x23\x9c\xdc\xdf\xfc\x90\x0b\xb7\xb7\x62\x5e\x5d\x4a\x54\xf3\xeb\xa2\xe5\xf8\xfb\xee\x5b\xfd\x38\x15\x56\x6d\x7d\xd4\xa9\x63\x3e\x67\xcc\x78\x67\x3c\x3f\x53\x1f\xaf\x7e\x59\x18\xc5\x28\xa3\x3b\x73\x35\xdc\x7c\x37\x1a\x40\x5a\x23\xdb\x3b\xec\x99\xdb\xdd\x06\x86\xbd\xbf\x0e\x6e\x18\xf3\xb5\x67\xe8\x4c\xcf\x78\xe3\x42\x3d\x1c\x19\x78\x66\xbb\x7e\x2a\xea\x97\xae\x2f\xc9\x42\xe9\xd1\x6b\x5e\x5e\xf2\xf6\xe6\x44\x71\x62\xfc\xf3\x73\xe3\x70\xe7\xb6\x82\xf6\xde\xc6\x91\xd9\xcd\xa4\xe9\x81\xcd\x9d\x68\xd7\xf0\x05\x67\x71\x9a\x52\xb6\x55\xd9\x94\xb5\xbd\x83\xb1\x8e\xe9\xf3\xad\x0b\x9e\xb2\xba\xdc\x64\x13\xf9\x51\xe8\x37\x3c\x79\xc2\x8d\xd3\xd3\xf2\x61\xb5\xd9\xf5\xd7\x6f\x96\x7a\xa9\x73\xce\xb4\x76\x53\xa3\xeb\x4a\x93\x98\x4a\xf3\xf3\xa2\xde\xd2\x7e\x3c\x82\xaf\x32\x16\x98\x0b\xcf\xaa\x99\xe5\x37\x31\x77\x84\x25\x8c\xd2\x35\xc8\x2a\xc4\xfa\x05\xfa\x78\x00\xc6\xb8\x4e\x99\x53\xfd\x6a\x0b\xb2\xd9\x7b\x8b\x1b\xf8\x10\x62\xe6\x4e\xa0\x20\x32\xc0\xf0\x73\xf5\x37\x57\x12\xc6\x03\x49\x51\xe6\xa6\x2c\x0a\xbd\xd6\xbb\x9a\x4c\x09\xbb\x14\x8b\x41\x64\x8c\x9b\xd0\xd8\xae\x93\x88\xfe\xf0\x6b\x85\x6f\x3c\xe1\x88\x48\x5e\xbd\x74\x71\xbb\xef\x18\xc6\xa3\x39\xd9\x33\x2d\xe1\x4c\x04\x09\x91\x56\x4d\xa5\x7f\x63\xb1\x71\x9f\x37\x5f\x98\x10\x92\x36\xb1\x26\x94\xca\x3e\x30\xa9\xfe\x3b\x4b\x06\x93\x11\x93\xb6\x8b\x73\x07\x35\x1c\xfc\x81\x6a\x04\x67\x52\x68\xd3\xe6\x68\x76\x85\xe5\x1f\xeb\xed\x8a\xea\xde\xed\x5c\x56\x01\x23\xfe\xd4\xb9\xcc\xc8\x15\xa7\xcf\xa0\xe1\x4c\xa5\x92\x08\x3a\xd4\x90\xd9\xed\x67\xbf\xbb\xbe\x04\x43\xcf\x68\x59\x1f\xb3\xaa\xde\x62\x55\x5c\x4a\x89\xed\x49\xd1\x4f\xa1\x99\x26\x1b\xa4\x45\x75\xfd\xd3\xe1\xed\xda\x8a\x17\x43\x96\x0a\x2b\x32\xf0\x82\xaa\x27\xdb\xea\x8e\x03\xd0\x1c\xa4\x65\xfa\xef\x40\x1a\x98\x8e\x85\xb3\xa5\x6f\xbb\x8a\xe3\x8e\x01\xf7\x42\x9f\xae\x2c\xab\x6e\x9a\x04\x6e\x44\x6a\x9a\x5e\x70\x3c\xde\x5a\xfb\x71\xee\x71\x4e\xdd\x56\x71\x39\xbe\xee\xea\xa2\xc4\xaf\x08\xca\xc5\xeb\xff\xe8\x6f\xb2\x03\x64\x12\xf7\x84\xc1\x59\x61\xde\xbc\xec\x03\x99\x4d\xce\x7d\x88\xa8\x73\x67\x69\x05\x7b\x50\xe7\xe2\x68\xb9\xd7\x76\x48\xc0\x9d\x77\x66\x13\x4c\x7c\xae\xd4\xc3\x79\x98\xca\x40\xb8\xb5\xbc\xac\x33\x9d\x49\xd3\x35\x6d\x7f\x47\xc8\x7c\x6e\x30\x30\x98\xab\x4b\xd7\x45\xe4\xa1\x40\x02\xdc\x9d\x8b\x6a\xbc\xbe\xf3\x50\x71\xa2\x0d\xcd\xf7\x8b\xc3\xee\xdb\x6a\xb7\x5b\x1a\xd4\x8a\xc3\xb1\xf2\x28\x34\x1e\x21\x8f\x78\xac\xb3\xfc\x79\x44\x46\xe0\x51\xec\x09\x5b\x05\x5b\xae\x77\xab\xf5\xe1\xdb\x6e\xb9\x7d\x9a\x3d\x2e\x87\x2f\x24\xf5\xed\xa0\x05\x9a\xa2\x21\x2e\x54\xb7\xf8\x49\x37\x5c\x68\x0d\x4e\xf0\xbf\x9c\xae\x2c\x4c\x14\x8b\xa8\xb3\x40\x4e\xbc\xc5\x2a\x3f\x5f\x6a\xe3\xe2\xe1\xae\x35\x0e\x90\xe8\xa7\x26\x76\x9f\x17\x30\x9e\x28\x71\x68\xb0\x64\xa0\xd4\xba\x7c\xfe\x6d\x78\xe6\x24\x20\xc9\x5c\x47\x28\x5c\x6f\x96\x4f\x23\x54\x1b\x4f\x42\x46\xe0\x5c\xb1\xef\x60\x5f\x3c\x89\x8d\xd1\xfd\x73\xf6\x13\xe7\x54\x42\xfe\x28\x1f\xe3\x89\x4c\x78\xda\x17\x35\x74\x1b\x18\x4f\x23\x45\x18\x8f\xb6\x5e\xfb\x23\xcb\xb1\x79\x11\x77\xd4\xc2\x1c\xdd\xec\x34\x0d\x89\xef\xb1\xd8\xae\x7f\xdc\xd1\xd5\x0e\xe2\xed\x26\xac\x32\x1c\x30\xd0\xe4\xec\x3b\x81\xbb\xe3\xa9\xf6\x68\x15\x3a\x9c\xb2\x9c\xb0\xf2\x4b\xd5\x26\xb7\x3c\xd5\x29\x15\x99\x8b\xbf\xb2\x23\xf6\x44\x5f\x38\x67\x21\xa7\x64\x69\x25\x8b\x9e\xb7\x68\xf3\x77\x70\x2c\xb9\xc7\xab\xe1\x7b\x9e\x30\x1f\x32\xe6\x38\xe7\xbe\xe1\xe4\xcc\x94\x72\x1b\xdd\xf4\xdb\xc0\x41\x51\x81\xd9\x74\x6c\x36\x8b\xc5\x74\x3c\xc5\x39\x22\x21\xdb\x49\x27\x0f\xf7\xc5\x5d\xf6\xb3\x7d\x5f\x44\xaa\x9d\xbd\xe1\xec\x78\xa4\x36\xc5\xb8\x8d\xc2\x25\xf8\x14\x8f\x9d\x8d\x16\x7a\x56\xe4\xe3\x98\x80\x4b\x30\x34\xc1\xba\x75\x6e\xc8\x8a\xbc\x33\x5d\x6b\x97\x50\x2e\x25\x37\x32\xaa\x84\xcb\x82\xf7\xbe\xba\x2b\xe7\xca\xd6\xed\xbf\xaf\xbe\x6d\x97\xf7\x05\x39\xbc\x56\xad\x3b\xd1\xe7\x4d\x26\xae\x78\x44\xf5\xaf\x67\x38\x21\x31\xcf\x4c\x27\xbd\x6b\x0b\x70\x8c\x53\xaa\xdf\xcf\x17\xcb\xdf\x3f\xab\xee\x72\x14\x22\x75\xbc\xd6\x7b\xc8\x8e\xa6\xa0\xfe\x00\xcd\x7f\x6f\xf1\x27\x51\xe7\x97\x39\x79\x24\xb8\xff\x6c\x7f\x21\xca\x90\x6a\xe6\x47\xa8\xea\x7b\x2a\xc7\xef\xf0\x7f\xfa\xd1\x06\x47\x64\x64\xd0\xf1\xfb\x72\x36\xa8\xfb\x0f\xef\xba\xf6\x03\xc2\x37\x9f\xe0\x15\x0f\x16\x91\x79\x70\xc5\xdb\xd1\x50\x9e\x12\x8d\xd8\x34\x67\x36\x58\x4a\xcc\xeb\xb5\xee\xc9\x52\x72\xae\xa5\x47\x5f\xaa\x5c\xbb\xea\x68\x94\xc5\x9f\xda\x5d\x91\x6b\xa5\x28\xe1\xcd\x2a\x2a\x69\x0e\xbc\x28\x47\x5f\xa8\x7d\xe6\x59\x43\x84\x47\xe8\xfa\x24\x56\xa1\xad\x1b\x16\x29\xc3\xef\x7f\xfe\x40\x90\x9d\x83\xe7\x23\x15\x8f\x4e\x59\x6e\x65\xf6\xfe\x2e\xe6\x74\x7c\xa2\xd4\x98\x12\x5b\x9d\xb4\xe5\xfe\xeb\x6f\xa3\x01\xda\x98\xe9\x6d\x7b\xf0\x48\xec\x28\x37\xc3\xd9\x04\x3e\xf7\xa9\xdc\xf2\x4c\x72\xde\x25\x12\xdd\xd4\xec\x9c\x2d\xa1\xef\xd3\xe2\x10\x04\xdc\x4f\x74\xbf\xf1\xd1\x91\xcc\x20\x90\x82\xe8\xf1\xab\xa7\xfd\x76\xb9\x59\xdd\x1d\x76\x5f\x57\x9b\xc3\xc3\xea\xb1\xad\xb8\x40\x18\x04\xf4\xc0\x0e\x75\x0f\x02\xb0\x2f\x56\x8b\xd9\x66\x28\xcb\x3f\x0e\xb2\x46\x13\x7b\xf8\xb3\xc2\xc0\xc4\x37\x75\xf1\x1d\x2e\xc7\xba\xfd\x32\xe6\xa3\xd1\xc5\x32\x3b\x75\x6f\x35\x83\x10\xbd\xd4\x32\xda\xd6\xe2\xaf\x55\xae\x0b\x7a\xaf\xcf\x83\x0e\x14\x44\x81\x20\x68\xa1\x33\xf3\x3c\x83\xc4\xea\x25\x3b\xdf\xca\x15\x70\x88\x13\x4d\x0e\x7c\x5f\xe0\x84\x65\xd5\xbc\x03\x6e\x8d\x87\x38\x05\xca\xf6\xf3\xa2\x2b\xf9\x8f\xf0\xb9\x10\x73\xa3\xf2\xd8\x76\x4c\xcb\xe2\xb9\x84\x53\xbb\x6c\xb9\x60\x0c\x12\x05\x54\x35\x3d\xb7\xf9\x23\xa4\x3c\xa2\xb5\x90\x9e\xfe\x43\xf1\xb3\x0b\xcd\x20\x85\x80\x70\xa9\x39\x9c\x9c\x11\x81\x3b\x22\x8d\x5c\x78\x65\x75\xf4\xe9\xf6\x34\x99\x27\xf1\xb1\xf6\x6f\xa3\xc6\x22\xb0\xc4\x74\xe6\x4f\xf0\xfe\x03\xb3\xdd\xe3\xee\xbb\x55\x54\x76\x5f\xc5\x52\x45\x05\x2e\x71\xb9\xce\x8e\xd6\xb1\x72\x7e\xb9\x2e\xeb\x1b\xba\xca\xe7\xe8\x0a\x60\xc2\x34\xd6\x8f\x94\x9a\x34\xef\xfb\xbd\xcc\xc6\x57\x23\x12\x92\x54\x20\x5c\x55\x5e\x15\xc7\x51\x5e\x04\x4c\xc6\x14\xbe\xd4\x08\xa7\x9d\x73\x08\xe1\xc0\x90\x91\xcc\x63\x75\x84\xea\x65\x6b\x91\xd2\x2d\x0b\x6f\x10\xca\xb7\x77\x9c\xe9\x94\x5b\x34\xb1\x59\x2d\xa7\x2b\xd4\xc0\x23\x15\x59\x92\x25\x1c\xb3\x0a\x07\xec\xe8\xe6\x30\x12\xd7\xb8\xd9\xdc\x0d\xe1\xa6\xd8\xc2\x5f\xee\xa8\x08\xcc\x64\xb5\xdd\x5d\x8b\xfa\x6b\xd1\x7e\xbd\xa6\x17\xc8\xd4\xa7\xb8\x83\xcc\xf9\x9f\x8a\xb2\x7e\xd9\x14\x06\xc4\xdc\x25\xcb\xa0\x94\x4f\xbf\xbf\xb8\x94\x63\x6b\x18\x0e\x98\xa6\x04\xbd\xaf\x2e\xe7\x26\xc1\x78\xc2\xb7\xcd\xa5\x7c\xfe\x05\xae\x14\x50\xa7\xc6\x18\xf9\x52\xe2\x97\x0e\xe3\x2e\xbc\x48\xa7\x26\x3c\x35\xf0\x58\x57\x3a\x18\xdc\x1d\xe1\xa5\x82\xd8\x29\x7b\xcc\x5e\x5f\x8a\xca\x06\x4c\xf6\xa0\x9f\x44\x44\x06\xfb\x5a\xe4\x58\xd5\x59\x65\x75\xbe\x97\xfb\xaf\x67\x83\x9a\x75\xe3\x18\xd2\x57\x6d\x31\xa7\xdc\xb1\x15\x51\x9b\xd8\xf0\x44\xe0\xa5\xe4\xec\xbd\x47\x3c\xb7\x60\x37\x11\x70\xa3\x3c\xb5\xb9\x23\x5e\x6e\x3f\xc6\x11\x81\x30\x8e\xc3\x4d\x28\xde\x6e\x7e\x22\x50\x26\x54\x10\x97\xeb\x7d\x51\xde\x97\x19\x8e\x49\xa4\x22\x40\xc9\x9a\x21\x8f\x19\xa9\x05\x53\xad\xaf\xd3\xa0\xb6\x83\xc2\x58\x52\xb5\xbc\x42\x54\xcd\x02\xa8\x9a\x7f\xfa\x5f\x1f\x62\x4a\xf2\x64\x4d\x9e\x65\x7b\xdc\x2b\x35\x08\x56\x45\xe4\xb7\xf0\x8b\x79\xf1\x7e\x5b\xf1\x11\x51\x10\xd3\xc2\x96\xe3\xdb\x1f\x12\xea\x1b\x10\xc5\x74\xa5\x66\x72\xf7\x11\x91\x4a\x08\xe9\x4f\x0a\x8a\x6b\x3d\x8a\x8f\x44\x2c\x13\x8a\xe9\x56\x8b\xf5\xd3\xe2\x08\x55\x95\xc9\xfe\x1a\x2b\x12\x61\xbc\xa8\x87\x32\x0b\x7f\x6f\xe7\x13\xa9\x8f\xd4\xde\xae\x21\x7f\x6d\xd2\xe0\x0a\x55\xeb\x7a\xd5\x04\x78\x82\x16\x23\xa3\x73\x29\x0a\x28\x55\x93\x1e\x66\xf9\xf3\xdc\x6a\xac\x4c\x4e\x61\xc1\xc2\x30\x08\x5b\x3f\x39\x52\xab\x23\x6f\x93\xf6\x59\xb3\x24\xe6\xc6\xc1\xb5\x06\x5b\x58\x08\x83\x7f\x0c\xcf\x91\xaa\xc8\x02\xd9\x28\x49\x73\x2f\xe8\x88\x03\x79\xe9\x91\xe0\x04\x53\x49\x8b\x9a\x21\xcd\x8d\x81\x75\x89\x1d\xc4\x21\x71\xb2\xce\xb4\xea\xb9\x1c\xaa\xbd\x38\xf0\x43\xaa\x82\x57\x17\x61\xdc\x70\xa7\x1b\x59\xc3\x9f\x0c\x90\x60\x8b\xa2\xc8\xf2\x67\x82\xc3\x8d\xbe\x19\xac\xc8\x15\x45\xba\xc3\xe0\x56\x88\x24\x26\x52\x3a\x25\xc2\x3b\x4b\xb6\x6f\xe7\xb4\x60\x11\x89\xc7\x43\x89\x3f\x10\x5f\x15\x5c\xab\xf5\xb9\xab\x05\x4d\x31\x40\x47\xd7\x27\xa4\x4c\x2c\xbc\xec\x31\xcb\xbf\x17\x35\x1a\x74\xd2\xef\xc3\x15\x5f\x48\x11\x51\x01\xbc\xba\x9e\x44\x71\x34\xca\x0f\xee\x2a\x14\x0f\xa9\xd0\x5f\xe4\xa6\x1a\xfb\x31\x40\x44\xa0\x17\x98\x07\x6c\xd8\x77\x6d\xf5\x61\x92\xfa\x25\x30\x0a\x53\xc3\x75\xe9\xc0\x27\xd3\x03\xb5\xa2\x7d\x96\x5e\x95\x1d\xd6\x2d\x3f\x7e\xf8\x23\x74\xb3\x76\x1b\x6d\x9a\x6f\x2b\x47\x0f\x9d\xa4\x09\x0a\xad\x25\x81\x93\xce\x2f\xab\xbb\x83\xfd\xa1\xd2\xf7\x43\xc2\x83\x6e\x11\xd4\x62\x80\x66\x70\x03\x02\x65\x1a\x15\x46\x94\x68\x76\xec\xdb\x6a\x72\xe9\x47\x61\xea\xda\x3f\xf1\xa1\x42\x28\xe5\xcb\x4c\x96\x45\x55\x3d\x15\xaa\x7d\xe6\xd2\x07\xdf\xa4\xab\x36\x4a\x5b\xd6\x2f\x46\x09\x67\xfa\xb5\x92\x01\x47\x82\xee\x37\x0b\x17\xd5\xd7\x0f\x6d\x26\x9c\x76\x33\xc0\xfe\xbf\xc3\x7e\x45\x6f\xcb\xed\xf7\x3b\x64\xc8\x90\x36\xb9\xd9\xa6\x49\xb9\x5d\x28\x25\x43\x6e\x0c\xe3\x9b\x79\xb2\xca\xd7\xe5\x33\xe4\xd9\xff\x1a\xe5\x15\xf9\x82\x6d\x56\x24\x43\x48\x98\xd5\x6b\x3e\x19\x20\xff\x84\x04\x2e\x97\x51\x64\x6c\x9d\x1c\x3e\xed\x33\x2d\x11\x2e\x63\xc6\xe9\x05\x3d\xe0\x29\xab\xff\x59\x08\x42\x1c\x6e\x8a\x6a\xc2\x9d\xfd\xf3\xd5\x4d\xc6\xe8\x41\xa7\x65\xde\x79\x51\x4f\xd6\x0d\x65\xe2\x45\xce\x3a\xe9\xbe\x28\xc9\xf7\x74\x32\x75\x1c\x7e\x47\x12\x32\x32\x10\x7f\x3e\x16\x02\x8e\x8f\x6d\x91\x55\xa6\xbe\x26\x86\x7e\x56\x2d\xff\xe7\x92\x9d\x51\xcd\xf2\x6b\xf8\xab\xe5\xd9\x7d\x96\x79\x34\x33\x5a\xd9\xa8\xc1\x6b\x20\x99\xc7\xb5\x63\xc3\xf6\xb4\x5e\x27\x67\xb8\x64\xbe\xaf\x4d\x57\xfe\xf9\xc7\x07\xc4\x74\xc9\x14\x12\xba\xf9\xf7\x3f\x17\x87\xed\xda\x09\xf5\x73\xc9\x83\x84\x8a\x18\x2f\xf0\x81\x34\x86\xe4\x61\x2c\xed\x8b\x2e\x5b\x2a\x76\xdc\x7e\x5e\x70\x82\x28\x2e\xdf\xcf\x58\x66\x04\x14\x3f\xf6\x37\x2f\x29\x7c\xe1\xe4\xc2\xf7\x86\x39\xea\x2a\x1b\xed\x88\x44\xa5\xd0\xe3\xdb\x99\xa9\x33\x2b\xb1\x17\xe3\xb7\x63\x25\x3a\xdd\x57\xeb\xe0\x36\x88\xef\xd8\x0d\xab\x43\x0a\x94\x14\x4c\xb6\x24\x04\xc8\xd5\xbe\x58\x56\xb4\xf8\x0e\xca\x3a\xa3\x3b\x26\xbd\xc4\xb5\x14\xc6\x11\x88\x94\x01\x3a\x41\x82\xcd\x11\x6a\x5d\x94\x27\x63\x10\xed\x7b\x9e\xe7\x8d\xde\x0d\x99\x68\xa2\x5c\x35\xef\xdf\x6a\xbd\x9f\xf5\xea\xf4\x52\x85\xd2\x94\x89\xc8\xbd\xac\xa3\x12\x48\x25\x24\xc5\x88\x67\xb8\x52\xcf\xbe\x0d\x95\x47\x53\xa0\xfd\x9d\x98\xa4\x94\xf7\xc8\xe2\x74\x86\x12\xf7\xc5\xea\x39\x2f\x4a\x5c\x40\x35\xc9\xde\x92\x98\x86\x54\x9b\xdd\xb4\x6e\xc7\xcd\xdf\x98\xdf\xbf\x57\xbf\xca\x37\xdc\xc7\x30\x25\xac\xab\xf1\xac\x96\x70\x3a\xa1\xfa\xd7\x05\x08\x3f\x64\x4f\xad\x3c\xee\xd3\x2b\xef\x4c\x07\xce\x99\x24\xd1\x0a\x8a\x77\xac\x40\x65\x6c\x2b\x04\xb1\xfb\x8c\x46\x15\xb9\xf8\xbc\xc9\xa9\xdb\x28\xd5\x0e\xf0\x43\x41\xb3\xc1\xe5\x7a\xed\x62\x19\xfd\x77\x7c\xc9\xff\xf1\x83\x0f\x36\x4e\xe5\xa7\x89\x88\x1c\xc9\x31\xbf\x74\xf1\x42\x8f\xae\xa7\x02\x2f\xe6\x43\xc4\xd3\x7d\x96\x43\x2e\x33\x38\xce\xa8\x2e\x61\x2e\x3d\x18\x54\xc3\x7d\xbb\xf0\xa8\x90\x31\x62\x56\x61\xdb\x08\x54\xa1\x88\x88\xfa\x55\x88\xc2\x95\x61\x54\x14\x70\x0a\x90\x9f\xd6\x87\xf9\x6c\xbf\x7f\x58\x1e\x1e\xd6\x5f\xda\x83\xdc\x64\x4f\x6f\x6e\xa7\x7d\xa4\x04\x72\xb8\x70\xa8\x38\x04\xaa\x4c\x80\x52\x1b\x92\x23\x1f\x1d\xe6\xc6\x41\xb3\xc2\xfa\x69\xf6\x7d\x00\x43\xf8\xc7\x68\xa4\x88\xa8\x47\xf2\x50\x3c\x7f\x26\xd2\x3b\x04\x41\xf5\xa1\x50\x2a\x46\x8f\xb5\x80\xd8\x6f\x55\xd9\xa7\xb0\xab\x24\x34\x52\xc5\xfb\x6f\xab\xc3\xec\xe1\x61\xbd\x98\xed\x57\xeb\xa7\xf6\xa8\x42\x5a\x34\x7e\xcc\x1e\x1e\x96\xfb\xc3\xc3\xfc\x30\x92\xe1\xe5\x2a\xf5\x02\x12\x4d\x11\x97\xeb\xa2\xbc\x56\x75\xaf\x97\x3a\x7c\xbc\x69\xac\x49\xd0\x1d\x55\x56\xdf\x41\x76\xbc\x4e\xc4\x13\x2a\xd5\x1e\x75\x27\x17\xbb\xe5\xce\x91\x5c\x14\xf3\x94\x54\xae\x46\x53\xd5\xcd\x0c\x5c\x0d\xe8\x30\x43\x90\xba\x62\x41\xe4\x9b\x22\x53\x4e\xfa\x56\x24\x36\x39\xbc\xab\x02\x63\x7a\xea\xae\x10\xd2\xda\x66\xde\x5e\xb7\xf4\x52\xee\x78\x26\x56\xbf\x61\x0e\xf9\xeb\xd3\x58\xe5\x46\xc9\x58\x39\xd4\x9e\x61\x3f\xf6\x2d\x46\xdc\x18\xe0\x54\x9b\x17\x28\x8b\xd3\xa0\xc9\xa2\x24\x1a\x31\x20\x99\xd5\xd7\x4d\x51\x1c\x17\x97\xda\x16\x09\x3b\xac\x96\xd2\x49\x4c\xeb\x54\x7e\x39\x1e\xfb\xc5\x0a\xa5\x13\xe3\x1c\xd5\x09\x6b\x98\xd5\x7b\x10\x24\xf4\xe2\x46\xa5\x99\x4f\x7b\xb0\x69\x31\xb4\x61\xa3\x83\x0e\x11\xc2\xae\x53\x44\xb1\x06\x35\xee\xb3\x10\xd9\xc4\xaf\x99\xfc\x4d\x30\x62\x69\xcc\x56\x8c\x6c\xf8\x9b\xb5\x08\x13\xbf\x63\xd8\x92\xdc\x50\xcf\x9c\x83\x2b\x2d\x8d\x58\x4b\xfd\x0b\xf7\xb3\xd1\x9b\xa1\x95\x47\x3d\x8c\x21\x2f\xe9\x57\xde\x06\x5c\x69\x34\x00\xe2\x12\x9b\x8b\x30\xa4\x8d\xf1\x08\x49\xb5\x06\x93\xab\xf7\x68\x8b\x37\xb3\x03\x3d\xcf\xa8\x96\x92\x38\xe3\x8f\x11\xe3\xcf\x6d\x0a\xe8\xc5\x86\xda\x5f\xbd\xc0\x50\xfb\x03\xfd\x50\x51\x29\x4d\x15\x9d\x21\xc9\xf4\x37\xf9\x5c\x43\xdc\x1a\x96\xf5\x72\x16\xf4\x25\x2a\x18\x28\xdc\xdb\x89\xd3\x03\xa2\x60\x10\x29\x72\xd5\x6e\x5d\xbe\x88\x92\xd9\x96\x9e\x31\x48\x7d\xcf\xb8\xab\xbb\xb8\x80\xcc\x59\x88\x12\x63\x87\x84\x69\x4a\x73\xac\x33\xf2\x96\x45\x39\x8a\x98\x30\x94\x3e\x72\x27\xcb\xfd\x5e\xdf\x08\xcc\x73\x8c\x3c\x20\x87\x75\x38\x1e\x7f\xb4\x78\x23\x8c\xb4\x20\x1b\xbe\x56\xa2\x4e\x63\xb9\xba\x85\x23\x0f\xef\x49\xec\x0b\x5f\xf5\xa9\x96\xf6\xe6\xf6\x1f\xbf\x5b\x16\x30\x8e\x8c\x8a\xaa\x2a\x8b\xf3\xb0\x42\xd6\x0e\x49\x18\x27\xfe\x86\xf9\x81\x77\x65\xd1\xb6\x1f\x31\x0d\x8d\x10\xb4\x15\x03\x30\x0a\x0f\x37\x15\xa6\x71\xa3\x0c\x59\x14\x12\x1c\xec\x92\xe3\x3b\x9e\xce\xa3\x44\x15\x59\x6c\xec\xc4\x8a\xa3\x5a\x46\x5b\x94\x57\x79\xc4\x79\x1b\x96\x20\x03\x95\x1a\x30\xc4\x86\xa4\x39\xfb\xb8\x4d\xe4\x2a\x8c\xa0\x93\xa7\xdb\xa2\x1e\x09\x2f\x0f\xdf\x17\x84\x10\x7c\x1b\x01\x7e\xdd\x3f\x2c\x76\x67\xc3\xbe\x23\xea\xce\x65\x18\x81\x0d\xef\x0a\x30\x46\xc9\xfe\xec\x78\x7e\x01\xeb\xc4\x31\xd0\xcd\xef\x7e\xfc\xe8\x1b\x85\xc7\xad\x3e\xca\xe2\x25\x93\xaf\x98\x7f\xbd\x01\x7a\xa3\x88\x8c\x5e\xd9\x6c\xb3\xd9\xae\xbf\xcf\x1e\x3e\xb8\x7a\x01\x3c\x34\xea\x19\x22\xab\x47\xba\x47\x6e\x88\x92\xb4\xd1\x65\x95\x05\xfe\xb8\x0a\x71\xaf\x5c\x34\x3c\xa9\x0c\xd0\xa8\x87\x37\x6b\xd2\x13\xbe\xcd\x8b\xb6\xd9\x8e\x28\x13\x22\xa3\xe5\xf8\x5e\xff\xf6\x7f\xa4\x02\x20\x22\x77\xfc\x56\x03\x22\x70\x32\x1a\xc3\x2b\xd6\x5e\x44\xb0\x27\x5d\xe2\x87\x2d\x02\x37\x34\x90\x54\x07\xfb\xba\x5f\xb8\x2b\xd4\x61\x48\x55\xcf\x37\x82\x4d\xac\x97\x8f\xed\x81\x24\xd1\x36\x64\x26\xe2\xeb\x8f\x8c\xa4\xab\x3f\x48\x03\xb5\x17\xc6\x54\x7c\x32\xca\x3d\x9f\xb4\xdc\xb4\x17\x7b\x44\x36\xac\xb3\x13\x9a\x8a\x45\x5f\x3c\x4e\xfb\x91\xa6\x3d\xe5\x98\x89\x12\xca\xab\x1f\x39\xe5\x83\x76\x40\x82\xa4\x9d\xd4\x3a\x2b\xf4\x01\xb2\x3a\xf0\x62\x57\x88\x32\xd9\x09\x1d\x9e\x08\x13\x74\x10\xa8\xa4\x83\xfe\x37\x5b\x71\x75\x86\x56\xaf\x70\xf8\x90\x75\xc0\x12\x6d\x57\x24\x52\x7d\xae\xb2\xe7\x47\x18\xc3\x3e\x75\x20\xfd\xc4\x3e\xb1\x2f\x85\xba\x39\x68\x7a\xc5\x15\xe4\x35\x2c\x8e\x70\xe9\xae\x19\xa5\x93\x21\x59\xbe\xd7\x68\x24\x77\x46\x9f\x0e\xb9\x81\x93\x74\x8a\x2d\x07\x01\x79\x7e\x63\xe7\xc7\x75\xe4\xfb\xd4\x73\xb9\x54\x2d\x5b\x7e\xfa\x91\x45\x91\x69\x6b\x13\x8d\xe2\x78\x6c\xde\xe1\x1b\xc7\x34\xae\xe3\x50\x18\x28\x2b\xbd\xa7\x26\x16\x98\x68\xf5\xe8\x18\x99\xec\x8c\x8e\xf6\xc6\xad\xf2\xd3\x95\x57\xa7\x7e\x44\x85\x47\x47\x84\x37\x68\xdd\xea\x4b\x51\x6c\xda\x06\xf4\xe8\x5b\xd2\xd0\x0f\x9d\x00\xfc\x0b\x8e\x35\x4c\x74\xaa\x4c\x06\xbb\x5f\xef\x67\x0f\x87\xcd\x72\xbb\xd8\x2e\x9f\xf6\x0e\x2b\xae\x99\xa5\x07\x75\x9e\xb8\x8b\xa2\x28\x55\x35\x88\xc1\x34\x4b\x04\x29\x5e\xd9\x55\x7a\x8a\xf5\xd6\x8f\x8d\x35\x13\x31\x19\x46\xfd\xf3\xb1\x9f\x2c\x93\xc1\x55\xda\x61\x62\x7a\xfb\xa8\x66\x9a\x19\xad\xf4\xb7\xac\x96\x2f\xeb\xf6\x23\xdc\x03\x02\x55\x29\xab\x02\xb6\xca\x07\xc4\x0f\xcd\x03\x41\x1b\xbd\x38\x82\x7c\x3d\xde\x40\x7f\x34\x8f\x04\xf1\x5d\x44\x56\x18\xb3\x89\xbf\x83\xc2\xd7\x80\x91\x6e\x85\x6d\x0e\x04\x59\x5e\xad\x7b\xea\xd1\x5c\x83\x16\x64\x8a\xf7\x50\x3c\xcf\x33\x45\x56\x50\x7f\xaf\x34\xa2\x85\x6f\x5c\xf3\x9a\x7c\xf9\x8f\x6d\x5f\xf4\x53\x8b\x50\xf2\xbe\x1d\xce\xd0\xb8\x7a\x74\x9a\x28\x0e\x74\x07\x4c\x58\xdd\xb5\x27\x51\x31\xc5\x61\x24\x1d\x3f\x78\x8a\xd2\x33\x9e\x13\x96\xb7\x65\x21\x38\xee\x73\x32\x62\xa4\x37\xd6\x72\x21\x69\x5e\xdf\xb4\x92\xb5\x8a\xcc\xcb\x54\x61\xbd\xc5\x9f\xc5\xf1\xd6\x79\x96\x6b\x15\x07\x64\xc2\x75\xb7\xfe\x71\x78\x6c\xf3\x1e\x8d\x3a\x14\xce\x87\xf5\x71\x64\xd9\xcb\xb5\xf6\x0d\xb9\xa8\x2a\x8e\x99\xcc\x6a\xb8\xa3\xb3\x4b\x70\x02\x14\x5a\x83\x20\xd4\xdf\x13\xbe\x7d\x9c\xda\x81\xe7\x85\x82\xb8\x44\xbb\xc5\x62\xb6\x9a\x14\x08\x71\x03\x13\xc5\x8c\x26\xf6\x5b\xf3\x9e\xed\x70\x84\x9a\x04\xcf\xe3\x46\x2b\xf9\xfd\xfd\x3d\xed\x1e\x14\x78\x3e\x37\x8a\x2f\xeb\xea\xa5\x89\xab\xb3\xdc\x24\xc9\xfd\xdf\x03\x9e\xaf\xa4\x97\xb4\x48\xfe\xf1\xa9\x7d\xa5\x68\xed\x9b\x5b\x66\x91\x3b\x75\xc0\xe3\xb8\xaf\xf8\xf0\x88\xeb\x9c\xd2\x80\xfe\xb3\x04\x2f\x90\x11\xbd\x4a\x60\x08\xd4\x9f\x2a\xd4\x80\x17\x28\x83\x94\xdd\x43\xfe\xfa\xa3\xe3\xba\xba\xef\x0c\x3d\xa4\x0a\x9b\x00\x01\xed\xdf\xa2\x28\x91\xad\xf9\xe8\x7d\x59\x98\x64\xa4\x3d\x9c\x84\xa4\xab\x36\x73\x48\x02\xfb\xf7\x28\x14\x46\x31\xfa\x05\xe5\xeb\x2e\x7b\xbe\xf1\x67\x99\x7c\xed\x46\x0f\x26\x8a\x58\xe2\xc4\x9c\xb2\x12\xd7\xaf\x7d\x8b\x0f\xf0\x22\x66\x22\x2e\x50\xea\xeb\x59\x3c\x15\xea\x76\x93\xef\xbf\xce\xe0\xc5\x5e\x12\xa1\xeb\x61\x5f\xf2\xfa\xda\x67\xd4\x4d\x76\x69\xc1\x8b\x59\x4a\xef\xe2\xb1\x78\x9e\x8d\xb6\x1e\xf0\x12\x5f\x51\x02\x9f\x55\x5b\x04\x75\xdd\x17\xbb\x6b\x5e\xbf\x60\x95\xfd\x2f\x8e\x26\x41\x92\x68\x42\x56\xdb\xc5\xd5\xd5\xfb\xb7\x08\xf2\xc5\xa5\x99\xe0\xf1\xd4\x23\xc0\xeb\x41\x5c\xca\xbc\xf5\x66\xed\x6f\xe3\xe0\x71\x29\xa8\xf7\xb9\x81\xba\x3f\x15\x39\x26\xf4\xe7\x1e\x85\x79\x74\xb1\x90\x48\x2a\xb6\xce\xee\x97\xf3\xc1\x54\x03\xa6\xa9\x68\xd5\x26\xb7\x4d\x66\x71\x6b\x80\xc0\xec\x70\x11\x63\x1c\xf7\x66\xe6\x87\x18\x19\xf0\x44\x12\xf8\xb6\xec\x4a\x91\x52\x4f\x10\x19\x3c\x01\x2a\x30\x5d\x98\x26\x74\x1b\x00\xc0\xc0\x13\x92\x91\x25\x93\xed\x25\xee\x0a\x99\xc1\x71\xa5\xd0\x54\xdb\xa6\x56\x54\xf0\x64\xe8\x51\x8e\xf3\x05\xf3\x62\xe3\xc8\x8a\xe0\xc9\x88\x33\x6c\xf5\xb9\xff\x59\x08\x2b\x58\x5a\xbd\x64\xe7\xe9\xbc\x13\x3c\x99\x26\x86\x02\x0a\x47\xd9\xfc\xbe\xbb\xec\x67\x35\x6d\x12\x0c\x9e\x54\x92\xf9\x8e\xe2\x6e\x94\xde\xe6\xd7\x95\xfa\x6d\x38\xf7\x54\x2c\x28\xf7\x99\x63\x59\x5e\x1f\xe0\x15\xfb\x0f\x4f\x31\x53\x97\xc9\x64\x71\x87\x79\x71\xca\x72\xa8\x8b\xb2\x67\x0d\x03\xbe\x17\x24\xad\x77\x0c\x01\x8b\x4f\xe3\xbe\x1c\xf8\x5e\x0a\xe4\xf1\xb2\x80\xbf\x2e\x35\x7e\x84\xba\xff\x05\x07\x62\x78\x27\x7c\x3f\x34\xee\x2a\x4d\xa8\xfd\xb8\xbf\x2f\xca\x2f\x30\xc4\xc6\x35\x43\x52\x8a\x1d\xe6\xcd\xde\xbb\xc3\x1e\x09\x16\x7c\x3f\x0e\x08\x72\xfa\x58\x94\xf8\x0c\x59\xfe\x0b\x92\x37\xf8\xbe\x8c\x08\x76\xd6\xcc\x09\x83\xc1\x7a\xc8\x24\xe6\x23\x89\x5e\xf0\x03\x95\x52\xba\x59\x9c\x31\xff\xd2\xda\x49\x80\x1f\x7a\x22\x61\x9d\x0c\x20\x96\xc6\x84\xa7\xc6\xf7\xfa\x40\x5e\x90\x83\xf5\xd3\x0f\x43\x6d\xf5\x4a\xab\x6a\xc0\xe8\xaf\x3e\x00\x67\x82\x1f\x82\xe6\x86\x94\xbb\xc3\xf2\x67\x26\xfb\x52\x02\xe0\x47\x1e\x52\xc5\xe2\x31\xab\x87\x7f\x8f\x0d\x94\xdc\xed\xe9\xbf\x6f\xd7\x6e\xc5\x59\x8f\x1d\x07\x87\x77\x24\x4a\x31\x36\xf3\x77\xb0\x1e\xcc\x72\xd5\x55\x0f\xc0\x8f\x94\x4e\x44\xa7\xd7\xf2\x8c\x5b\x94\xd9\x39\xc3\xbc\x6e\xcb\xed\xe0\x27\x1c\xa5\xcb\x51\xa1\x7a\xb9\xcb\x9e\x47\xc1\x01\xf8\x09\x08\x5a\xef\x5d\xc1\xbf\xfd\xa8\x34\x2a\xb7\x77\x59\x25\x4b\xa8\x5e\xfa\x6a\x2a\xe0\xa7\xe0\x13\x2c\x95\xe0\x80\x44\x18\x72\x47\x18\x4b\x88\x5a\xd8\xd6\x73\xe3\x1b\x3f\xf5\xff\xc4\xff\x6d\x07\x2b\x1d\xb4\x92\x56\xf5\x6d\x69\xde\x8d\xe3\x89\xb6\x86\x48\xeb\x1c\xad\xdf\x55\x2b\xd5\x09\x3e\x53\x2a\x30\xa9\x2a\xc9\x19\x3c\x16\xaa\xbd\x05\x3c\x34\x1e\xf6\xdf\x8b\xba\xdd\xc5\x7c\xce\x12\x4a\xd1\xca\xc2\x68\x0b\xdb\x02\xcf\xa7\x1d\x33\xf0\x21\xd6\x14\xfb\x55\xc5\x71\x80\xce\x02\x1f\xa4\x20\x3d\xb7\x03\x65\xbe\x1d\xfc\x12\x7c\x50\x1e\x69\x90\xf4\xeb\x30\xeb\xcb\x87\x82\x1c\xf6\x53\x22\x44\xc1\x2c\xac\xb3\x1a\x01\x4f\xc1\x17\xe0\xa3\xf1\x8b\xe9\xe4\x15\xfe\xf1\xa1\xdc\x21\xf8\x42\x21\xe3\x8e\xd4\x57\x61\x7d\x68\x52\x86\x75\x09\xb2\xc9\x9d\x9a\x7c\xa7\x73\x9d\x01\x5f\xc6\x3c\xc2\xae\x01\x6e\x3d\x22\xae\xa6\xc3\xdd\xb5\x0e\xc0\x97\x60\x7a\xc5\x2d\x56\x6f\x81\xc5\xe8\x42\x25\x62\xdc\x0b\x56\x7e\x7f\x5a\x34\xa1\xff\x16\x7a\x2c\x7e\x3b\x52\x71\xa9\xed\x44\xfd\x77\x91\xe3\x9e\xe8\x5b\x66\x45\x0d\x06\x00\x4b\xf0\x95\xf0\x49\x16\x60\x87\xb9\xda\x62\x75\x39\xd6\x16\x94\x37\x1d\x04\xf8\x18\x69\xea\x89\x37\x0b\x4c\xf1\x13\xcb\xe1\xc6\xe3\xa3\x25\x79\xe6\xf8\xb6\x93\x2f\x46\xe9\xd0\xc8\x5b\xf5\x7e\xab\xe6\xbe\x53\x35\x3c\x60\xae\x54\x9b\xc0\x40\xe0\xa5\x21\xd8\x75\xda\x68\x3c\x50\x3f\xa0\x6a\x0f\x33\x49\x1b\xcb\xef\x99\x7c\xdd\xbf\xf4\x37\x81\xc0\x43\xe3\xeb\xd4\x3c\xc6\x7a\xb0\xe7\x07\x01\x37\x1d\x93\x66\xa6\xf5\xd1\xc2\x10\x84\x5e\x40\xaf\x65\x93\xd2\xec\xe0\x88\xed\x47\xc2\x30\x21\xee\x7a\x93\xe5\xcd\x1e\x0c\xfd\xf9\x93\x75\x37\x88\x30\x25\x61\xa6\xf7\xeb\x5f\xf5\x14\x3d\x67\x30\x38\x8e\x7d\x27\xda\x4e\x78\x18\x73\xdf\x1f\xb1\xaa\xda\x02\x1a\x04\xb1\x56\x71\xda\x1a\x8c\x0c\x0d\xee\x07\x4f\x3b\x48\x94\x48\xb1\xc5\x74\x58\xf1\x11\x83\xb6\xeb\x5e\x46\x18\x4f\x92\x20\xd1\x48\x82\x94\x0a\x8f\xd9\x4f\x2c\x07\xd2\x99\x10\xa4\xe8\xa5\x5e\xcb\x4b\x26\x88\x19\x11\x01\xf3\x09\x3e\x9f\xfd\x08\x83\xa4\xe7\x32\x58\x9a\xd5\x76\x18\x08\x75\x93\x20\x60\x02\xbc\x3e\x04\x73\x6b\x40\xb7\x0f\x85\x7c\xd5\xd9\x11\xbf\x6d\x57\xc3\x0b\xe2\x7e\x64\xc0\x1c\x59\xbe\x43\x87\x78\x74\x37\x8b\x07\x92\x96\xc9\x79\x56\xcb\x22\xcb\x37\xc5\x5b\xbb\x3a\x05\x90\x30\x22\xad\xfd\xab\xbf\xa1\x04\xc0\x38\x4f\x6d\xec\x49\x5f\xac\xda\x23\x5c\x90\x9d\x50\x2b\xde\x7b\xec\x69\x07\xf9\x1f\xac\x66\x01\x48\x93\x05\x7d\xb1\xaf\x0f\x59\x85\xff\x02\x7c\xf5\x0f\xfb\xa6\x5d\x3a\x14\x2c\x04\xa0\x39\xd5\xcb\xcf\x76\x07\xe9\xd3\x8e\x20\x10\x71\x4a\x3b\x05\xd4\x87\xb3\x79\xb0\xd9\x71\xfc\x60\x45\x9a\x74\x1e\x0b\x0e\x75\x19\xb8\x33\xc8\x54\x73\x27\xe5\x6e\x9e\xe6\xf0\xd3\x12\x0c\x6b\xac\xc4\xbf\x50\xd6\xcb\xfa\xa5\x67\xc9\x62\x71\xcf\xed\xa9\xa4\x3f\xd4\x4b\xb7\x21\xc2\xf4\x1d\x52\x29\x1a\xa9\x0f\x75\x84\x6a\xf0\x2c\x14\x8b\x68\xe2\x80\x52\x73\x57\x80\xf8\xcc\x89\x03\x02\x85\x8a\x60\x56\xbb\x99\x51\xe2\x32\xea\x78\xee\x7c\xc8\x15\xad\xf7\xd5\x25\xaf\xb0\x76\x99\xda\x5d\x6f\x99\xd1\x01\x37\x53\xf5\x08\xd9\x69\xb9\xde\x49\x03\xa8\xbb\x1f\xe9\xf0\x43\xa0\x43\x23\x09\x96\x5f\x4e\x36\xf7\xa8\x48\x06\xc8\x1d\x4e\xc1\x0a\x66\xe4\xc5\x25\x97\x23\x8f\x11\x08\xbd\xd4\xac\x96\x15\xe6\xca\x9a\xba\xa1\x7d\xcf\xfb\x11\xd2\x24\xaf\xd3\x9d\x82\xc7\x14\xd1\x29\xcb\x61\xff\x82\xf5\x27\xc5\x37\x08\x3d\x11\xc4\xd6\xfe\x6c\x9f\xc9\x57\x1c\x06\x28\xa1\x1f\xc9\xc4\x66\xeb\xb3\xba\x38\x75\xd1\x4d\xe8\x8b\xb0\xfd\xa2\x1a\x8d\xfd\xe5\xef\x78\x9d\x34\xa4\x84\xd0\xc7\x84\x45\x1d\x56\xde\x5c\xd2\x8e\x04\x25\xba\xf7\x32\x0c\xd2\x44\x98\x16\xc1\x63\xa1\xa8\x25\xb8\xca\xcd\x76\x30\xb5\x63\xbb\x77\x20\x0c\x03\x9f\xa2\xfd\xe7\x4c\xd7\xcd\x92\xd3\x63\x73\x43\x18\x0a\x49\x31\x71\x56\xad\xf2\x1b\x96\x1a\x84\x91\x08\xa3\xb8\xad\x3b\x57\x2d\xf5\xbf\x3b\x4c\x92\x99\xc4\x52\xdf\x94\xf8\x33\x2b\x2e\x95\x69\x75\x7e\x1a\xae\x84\x91\x82\xd8\x92\x80\xf7\x24\xc0\x3f\xcc\xc9\xdd\xa5\xc7\x81\x99\x99\xb5\x95\xa7\x77\x1c\x81\xc3\xf4\x5b\x11\xc6\x31\xa7\x1a\x19\xd4\xc6\x01\xad\x9d\x41\x83\x48\x64\xf0\x08\xe3\x58\x51\x07\xf9\xd0\x83\x19\x1c\x0b\xa8\xcd\x4a\x31\x60\x87\xba\x4f\x30\x19\x44\x6d\x0e\xb7\x81\x4b\xb7\xdc\x85\x31\x84\xd4\x49\x68\xfb\xf7\x1f\x4b\x60\xb7\x9f\x00\xe2\x5b\x28\x84\xfa\x85\xa8\x95\xda\xf7\xdc\xe9\x92\xd0\x77\xd6\xfd\xf7\x19\xd4\x1b\x82\xb3\xdd\xe8\x3b\x40\x98\x30\x24\x20\x62\x56\xfd\x78\xec\x70\xdb\x10\x26\x16\xdc\x36\x60\xca\xfe\x36\x04\x89\x43\x98\xc6\x91\x84\x49\xfe\xff\xb6\xf7\xac\xd3\x24\xa1\xb7\xd3\x52\x88\xc7\xe0\x18\x13\x0f\x79\xed\xbf\x9f\x3f\x7f\xee\x4b\x6a\xb1\x65\x55\x6b\x96\xe7\xbe\x07\x3c\xed\xc4\x10\x0d\x91\xca\xb5\xa1\xf2\xba\x2c\x28\xf4\x72\x03\x43\x63\x5f\x70\x87\xa7\xc2\xe1\xd5\xc7\xdf\xfa\x37\xf3\xcb\xd1\xd5\x09\xa6\x89\x32\x34\x53\x3f\xb1\xac\xb3\x8a\xe0\x07\x1b\xb8\x16\x23\x17\x4f\x08\x65\x12\x52\x64\x43\x09\x02\x79\x75\x14\x87\xd2\x68\x26\xbb\xcb\x94\xcc\x2c\x21\x4d\xe4\x7d\x87\x12\xae\x2e\x6b\x5a\xe6\x3f\xb3\xb2\xc8\x6f\xa0\x03\x10\x4a\x6e\xfc\x8e\x9b\xd4\xa8\xa8\xea\x6d\x51\x9c\x1e\xfa\xc8\x86\xd1\xea\x81\x5c\x44\xb1\x4d\x8b\x4b\x83\xb9\x18\x45\xbb\x21\x2a\x2f\xb2\x91\xe0\xdd\xac\x14\x59\x5d\x42\x79\xed\x94\xfc\xdc\xf3\xb3\xa3\xb5\x8f\xdc\x05\xe5\xf3\x63\x21\x88\x80\xba\xb5\x25\x96\xee\x49\xe9\x18\xa4\x76\xeb\x71\xf5\x3c\x81\x79\x82\x50\x73\xce\x0c\x40\x43\x21\x9e\x26\xf9\x52\x10\x36\x59\x4f\xd2\x47\x05\x18\xf3\xff\xe1\x6f\x88\xbc\x08\xc3\xa8\xad\x5d\x6e\x8a\xe2\xb8\x2d\xc6\x05\x90\xc8\x4b\x25\x09\xd6\x3d\x6d\x17\xfd\x5d\x31\xf2\xa4\xf9\x30\x28\x65\x63\xba\x8e\xdb\x3a\x6c\xe1\x43\xe4\x07\xb1\x59\x45\xac\xee\xcb\x13\xbe\x0f\x55\x65\xdd\x38\xad\x28\xe6\x3b\x42\x45\xad\x19\x6b\x2b\xd7\x62\xfe\x21\x6a\x76\x3c\x52\x08\x81\xf3\xc1\x7e\xcb\x60\x03\x89\x22\x66\x04\x79\x0e\x2f\x90\xab\x23\xce\xb4\xce\x8e\xd9\xdf\x40\x9c\xdb\x8f\xc7\x2c\x66\x9d\x44\x55\x13\xc9\x6d\xd6\x9b\x8f\xed\x42\x21\x8a\x01\x3c\xaf\x23\xa9\xf7\xa8\xae\x76\x40\x62\xc9\x8e\x15\x1a\xd4\xe1\xae\xc6\x73\x30\xfa\xdd\x49\x80\x4e\xf7\x84\x9c\x98\xfb\xb5\xa1\x28\x11\x8c\xa0\x5d\xcd\xc5\x34\xcb\x87\x29\x00\x4c\xb3\xcd\x20\x4a\x03\x41\x19\xca\xee\x35\x3b\x1e\x9b\x04\xa4\x23\xa9\x42\x94\xca\x38\x31\x0e\xb6\xd4\xe2\x35\x3d\xcb\x41\x02\x15\x31\x11\x09\x6b\x91\x67\x08\x64\xf3\xd2\x85\x13\x11\x53\xc6\x20\xaf\x93\x40\xff\x2b\x43\x95\xc1\xed\x66\x3f\xba\x28\xce\x22\x82\x1a\x50\xbd\xcf\x54\xf5\xdd\x11\xf0\x89\x55\xf0\xfd\x72\x7c\x76\x8d\x41\x88\x20\x30\x15\xf9\xdd\xcb\x35\xc7\x11\x84\x64\xe2\x9d\x88\x80\x79\x54\xda\x7e\x84\xba\xcc\x8a\xea\x15\xda\x13\x49\x3f\xee\x63\x1c\x66\x5a\x1b\x56\xd8\xf0\x6c\x76\xb4\x10\xbe\xd5\x0b\x34\xb3\xb3\x2f\x75\xdb\xfe\x16\x19\x05\xa9\x01\xaa\x52\x73\x7a\x75\xbf\x1b\xbd\x30\x32\x56\x24\x6d\x01\x4a\xb9\x9c\xe9\x06\x50\xd3\x07\x99\x41\xa4\x3c\x19\x4a\x9b\xe6\x0d\x99\xdb\x10\xa9\xd0\xf3\x8c\x48\xf1\x7a\x77\x3e\xb6\x35\x99\x48\x85\x09\xb7\x95\x3b\x53\x61\xba\x79\xe9\x14\x7a\xb4\x0f\xfe\xbe\x59\x6f\x0e\xb3\xed\xf2\x69\x76\x58\xac\x9f\xf6\xdb\xd9\x62\x7f\x98\xdd\xdd\x6d\x97\x3b\x17\x91\x46\x18\x63\x0c\x86\x93\x96\xe9\xab\x95\x93\x99\xba\xd1\x3a\x8c\x28\x8f\xfc\x42\x75\x28\x23\xd1\xb7\xcf\x4e\x7d\x1f\x78\x37\x32\x8e\x7d\x63\xe3\x6f\xfc\x6f\xbe\x95\xed\x1b\xa1\x79\x42\x54\x90\x56\x05\xca\x48\xa5\x50\x24\xd1\x65\x60\x91\x16\x61\xc2\x2d\x0a\xd0\x6c\x46\x9f\x05\x96\x91\x46\x41\x0f\x2f\x73\x26\xac\xf6\xeb\x62\x2f\x90\x66\xf1\x51\x6a\x9e\xa9\x7d\xb1\xab\xbb\x02\x48\xec\x25\x06\x44\x30\xd2\x80\xf8\x2c\x23\x62\x2e\x2f\xea\xdf\x99\xd8\x63\xa1\x46\x57\x27\x26\x58\xd7\x1c\xfb\xbb\x7d\xec\x31\x45\x7a\x5e\x2a\xcf\xfb\xeb\x68\xec\x71\x03\x40\xca\xf1\xbd\x2e\x72\xac\x8b\x67\xac\xcf\x90\xa9\xee\xb8\xa6\xcb\xb7\x20\x7e\x54\x07\x74\x7a\x4c\x10\x7b\x22\xa4\xb6\xf0\x6a\x67\xf8\xfc\xed\x03\x7e\x9c\x7d\x59\x2d\x0e\x4f\xdf\x1e\xe7\xcb\xad\x1b\xec\x33\xa3\xa1\x65\xec\x18\x5a\xd4\xda\x70\xfa\xc6\x3e\x18\x2d\xad\x0a\x6b\x53\x8c\x20\xd7\xb8\xee\xb9\xc4\x3e\x20\xb5\x7d\xb7\xb3\xfd\xf2\xb0\x58\x6f\x9f\x96\xdb\xdd\x7e\xfd\xb4\x74\x5f\x13\x78\xa6\x60\xf5\x70\xb1\x22\x70\x9f\xbd\xba\x71\x10\x07\xc6\x3e\x57\xf4\x59\x69\x10\x07\x42\x0a\xc3\x27\xda\xed\x17\x65\xf1\xd6\x0b\xc2\xe2\x40\xa6\xd4\x9c\xb4\xb9\x79\x31\xf2\xe8\x6b\x06\x00\x91\xbd\xbe\x2e\xfb\xdd\x78\x7b\x30\x14\xc2\xb7\x46\x0e\x60\x7a\xed\x05\xf5\xbc\x06\xd3\x29\x8e\x22\x03\x69\x70\x8a\xf1\xa3\x93\xc4\x5e\x42\xd5\x41\x53\xec\x82\xe3\x7d\x51\x76\xad\xb6\x38\x0e\x14\xed\x22\x6e\xd9\x69\x2e\xde\x6f\x0f\x26\x9c\xf6\xe6\x26\x7c\x59\x50\xb3\xfa\x73\x23\xb2\xe1\x3c\x8f\x49\xb2\xd4\xf6\xf2\xe7\xab\xaf\x50\xbd\xdc\x17\xe5\x63\xa1\xa6\xe2\x8e\x38\xd6\x11\xa1\x8f\x4f\x4d\x7a\x73\x5d\x1e\xb3\xe7\x4c\x64\xc7\x5e\x93\xc5\x8e\x4b\x12\xa5\x0c\x81\xbe\xe3\xfe\x4e\x86\x46\x71\x92\x32\xe7\xfe\xb8\xb9\x94\x15\xf6\x71\xb5\x1f\xf4\x5b\xe2\x14\x03\xb0\x56\xcf\xc5\xf1\x27\xaa\xc9\x76\x61\x6f\xb8\xd6\xa6\xf8\x6f\xe9\x33\xff\xec\xa9\xd8\xff\xbd\x6d\x3c\x66\x3a\x76\xae\x17\xf7\x88\x8f\xf0\x3a\x8a\xef\x63\xee\x73\x68\xa6\xd0\xdd\x6c\xbd\x43\x79\x29\xb3\x4e\xaf\xe1\x46\x7d\x6d\xea\xab\x1c\x08\x11\x62\xae\x7c\x0a\xed\x4c\x25\x8a\x80\x24\x83\x09\x0e\xbe\x12\x46\x85\xe1\xe7\xe7\x24\x0d\x88\x45\x18\x51\x35\xb6\x49\xf6\x9f\xf3\xdd\x45\x18\x7a\xd8\xf4\x82\x17\x0b\xf0\x0c\x34\x67\x14\x30\xc4\x42\x48\x15\x38\x92\x16\x89\x28\x9a\xe8\x6f\xfc\x96\x08\x69\xf4\xd8\x0a\xad\xb1\x6c\x12\x94\x26\xfd\xff\x8e\x1f\x68\xfd\x43\x2c\x90\x69\xd6\x23\x09\xff\xea\xd7\x68\x49\x92\x8f\xd6\xc2\xd9\x00\x11\xbe\x16\xc5\xeb\x47\x62\x60\xa3\xcf\x4b\x4f\xa6\x5e\xe7\x0a\x3f\x28\x31\xba\x21\xca\x54\x2a\xff\x2a\xb2\xbc\x0d\x07\xc7\x43\x8c\xa0\xca\xfa\xa1\x09\x84\x76\xd7\x1c\x6a\xc7\x1c\x84\x58\x41\x44\x2d\x35\x02\xe2\x34\x69\x03\x9a\x5c\x7e\xad\xc7\x08\x65\x88\x31\x60\x14\x77\xcf\xe6\xf3\x85\xfb\x3c\xaa\x90\xd0\x98\x87\x73\x41\xa2\xbe\x5b\x33\xc1\xcb\x19\x15\xab\xc9\xd2\x74\xb2\x3c\x11\xa3\x0e\x9c\x6d\xe0\xf7\xa2\x46\xd2\x80\xbe\x99\xda\xc3\x8f\x68\x8f\x93\x8e\x05\x31\x29\x56\x0a\xc1\xa4\x3c\xbf\x80\x9d\x41\xac\x03\x23\x1a\x3b\x5b\x7f\xf9\x50\x20\xed\x17\xff\x9a\x33\x25\x5e\x1a\x91\xf8\x5f\x9d\x9d\x70\x9d\xe3\x0e\x7b\x62\xe1\x90\x78\x8c\xf1\x7e\x8b\xba\x6d\x70\x3b\x04\xca\xe0\xb9\x24\x1e\xb8\x44\x9c\xba\x6c\xb6\x9e\xd6\x73\xcf\x1c\x0d\xd7\xc2\xa9\x78\xec\xdf\xb7\x45\x31\x4a\x78\x12\x3f\xf2\x68\x01\x7b\x43\x7c\xdd\x14\xf5\x83\xd1\xf6\x71\x07\x53\xdf\x08\xed\x5f\xce\x58\x4e\xf9\x3b\xd9\x71\x01\xf8\xba\x53\x65\xa4\x38\x75\xa8\x96\x6a\xc7\x45\x5e\x14\xd8\xda\xf7\x06\x4b\x2b\x9a\x5e\xb5\xc4\x8e\xd1\x60\xa5\x9d\x88\xfb\x1d\x56\xf5\xbf\x26\x16\x9a\xc9\xf7\x27\x89\x55\x18\x5a\x1e\xdd\x7d\x89\xb8\x39\x42\x2b\xd4\x04\x49\x92\x70\xd1\x19\xe9\xd8\xda\xdf\x00\x8d\x6a\xcb\xc1\x53\x8b\x98\x3f\x04\xa9\x42\x92\xa4\x9c\x30\x43\x26\xeb\xa1\xfd\x8e\x64\x45\x37\x58\xee\x5f\x8a\x4b\x05\xb9\xba\x2f\xca\xf9\xa5\xc9\xb4\x47\x37\x3e\x11\x48\x6b\x96\x34\x5a\x93\x0f\x98\x3f\xd7\x2f\x6b\xdd\x5e\x27\xfa\x84\xeb\x47\x2b\xa5\xb8\xcb\x9e\xa9\xec\xb4\x5b\x6f\xdc\x90\xd4\xc7\x58\x0f\xea\x35\x3f\x7d\xde\x1d\x34\x8d\x4f\xda\xea\x1d\x31\x6f\x25\x8b\xd1\x55\xa4\x9c\xeb\xa0\x7d\x72\x63\xa7\xa9\xd1\x58\x30\xc1\x6e\xb3\x8c\x99\x88\xfb\x08\xd7\xf1\xf9\x04\x38\x65\x0b\xe3\xa2\x5f\xed\x5b\xd4\xe6\xfc\xba\x7f\x1f\x0d\x67\x29\x03\x3b\x21\xe6\xb3\xf9\x0d\x6e\xb6\xb7\x23\x27\x8c\x19\x13\xa2\x6f\xf9\xef\x5d\x77\x28\x61\x22\x22\x7a\xd5\xb1\x28\x5e\x2f\xe7\xd5\x6e\x1d\xfa\x7e\x72\xf0\x0f\x70\x3c\xbf\xc0\x21\xfc\xad\x7f\x06\xee\x43\x90\x38\xa6\x12\xe5\x29\xd5\x06\xaa\xae\x64\x96\xf0\x58\x91\x3b\x9f\xa9\x2b\xad\x6a\x3c\x7d\x14\x61\xb4\x21\xf7\x64\x6d\x37\xe1\x89\xa2\x1c\x63\xb6\xdd\x1f\xee\xd7\xdf\x9e\xee\x0c\x40\x6e\x98\x3c\x24\x1c\x55\x07\x5a\x7f\x6b\x42\xde\x6a\x3e\x56\xf7\x87\x04\xbc\xd4\x0f\x7a\xf9\x4a\x97\x53\xb7\x5b\x69\x02\x22\x09\xdd\x4b\x4e\x92\x38\x2d\xe2\x28\x01\x69\x60\x1e\xd4\xd5\xf4\x0e\x54\x47\x81\x2a\x93\xfb\xf7\x36\x66\x77\x23\x95\x47\x42\xf1\x9b\xed\x62\x7f\x98\xaf\xbf\x3d\x39\xba\x0d\x24\xc2\x0f\xa8\x3b\x41\xc5\xcf\x2f\xc6\x16\x3b\x2b\x86\x4a\x8d\x6e\x68\x1c\x5a\xd5\x2e\x92\x23\xb6\x92\xc5\x93\x8b\x79\x22\x94\xa0\x7d\xf1\xf0\x4b\xca\x59\xff\x31\xaa\x30\xa5\xa4\xcf\x2c\x55\x14\x37\xb8\x23\x4c\x93\x4f\x84\x84\xe3\x91\x76\x92\x66\xfd\x3c\xf8\x13\xea\x58\xdd\xed\x45\xcf\x28\xdc\xce\xb6\xfb\x41\x99\x26\xc1\x38\x4d\xcd\x2a\xf2\x13\x09\x64\x4b\x6b\x76\x7f\x87\x48\x50\xc6\x51\x5f\xca\x1d\xc7\xd6\x97\xbd\xac\x2c\xd1\x61\x4c\x52\xd4\xcb\xfa\x25\x3b\x35\x71\x2f\x49\x18\x2d\x9f\x9f\xdb\xa5\x49\x87\x9c\xd6\x2d\x2a\xaa\x63\x79\x5b\x77\x4a\xb4\xf4\x42\x03\x51\x44\x43\xf3\x9b\x97\xd8\x2b\x68\x0c\x9a\xdb\xfd\xff\x68\x3f\x2e\x09\x77\x68\xfa\xef\x73\xec\x13\x62\x20\xf5\xa2\x24\x71\x89\x98\xf1\xa8\xad\xfa\xa2\x08\x90\x7a\x3a\xa1\x84\x6b\xb7\xdf\xce\x06\xa8\xbc\xd4\x0f\x34\xa5\xf6\x59\x35\x87\xba\x3e\xa2\x95\x12\xb0\x71\x5b\x7b\x02\x3f\xf4\x08\xbe\xbb\x5a\xae\x6e\xbd\xd1\x26\xd7\xf2\x34\x88\x91\x48\x3f\x16\xeb\x46\xc8\x97\x29\xee\x38\xa4\x01\x37\x05\x77\x97\x77\x7c\xcf\xca\x4b\x65\x56\xd5\x9b\x91\x82\x9c\x48\x17\x4f\x7f\x1e\xd6\xa7\x3c\x53\xc5\xf1\x08\x6e\xcf\x4b\x03\x19\x87\x56\xd2\x8a\x76\x25\x43\xed\x5c\xb6\xa9\x63\x1a\x82\xd1\xc5\xfa\xb2\x9d\x3d\xed\x0f\xf3\xd9\x7e\xf1\xb5\xe7\x5f\x04\x69\x28\x85\x79\x48\xf5\xfb\xe0\x26\x85\xda\x23\x99\xbd\x4b\x45\x9b\xb6\xfb\x73\x22\x82\xd8\x11\xb8\xcc\x65\x36\x29\x91\xa5\xde\xf7\xa7\x5b\x9a\x72\xa1\xda\x3e\xac\xed\xcf\xef\xb3\xf1\xbe\x99\xa6\xd2\x7c\x4f\xf5\x02\xfb\x97\x12\x87\xd1\x58\xca\xe2\x20\x09\xdd\x49\x8c\x18\x26\xdd\xae\x59\xf9\xfc\x8b\xb8\x34\x65\x31\x37\x30\x3c\x63\x5e\x3d\xcf\x6e\x89\x0e\xe3\x00\xf5\x83\x7c\x65\x7c\xe2\xc4\xa3\x89\x85\x4d\x3a\xf9\x15\x4a\xd5\xba\x4a\x41\xca\x84\x9f\x1a\xfe\x0c\xbc\x99\x1d\x05\xca\xab\xc9\x78\xdd\x8b\x93\xf2\xc4\x0f\x6c\x97\xf8\xe1\x72\xc2\xbc\xea\x66\xd7\x64\x40\x96\xf2\xc4\x48\x80\x2f\xa8\x4c\xfe\xef\xe2\xc6\xc0\x69\x34\x1e\x12\x49\x92\xf0\x1d\x7a\xca\xdc\xd3\x83\x91\x51\x18\xde\x61\x40\x03\x31\xa0\x1a\x3c\x5c\x4a\xdb\xa9\xbd\xbf\xb4\xe8\x9f\x14\x74\xa2\xb1\xa5\x3d\x91\x1e\x7f\x7e\x6b\x65\x61\x07\xcb\xd0\x27\x74\xf9\x5b\xeb\xed\x72\x3a\x5d\xf2\x9b\x54\x34\x95\x10\xf1\xa0\xe5\x8f\x35\xf1\x57\x7b\x83\x54\xc2\xb4\xcd\xc9\x9d\x22\x4a\xcf\xf3\x64\xf4\x34\x30\x32\xce\x2c\xf3\xe5\xc3\x6a\xbe\x7c\x98\xb9\x93\x20\xd3\x44\x0b\x5a\x92\xe8\x8a\x69\x85\x54\x3d\xa4\x46\xaa\x13\x61\x6a\xe7\x54\x45\xb2\xda\x12\x93\xa1\x04\xf3\xb8\x4f\xa4\x19\xab\xcb\xff\x54\x28\x74\xd0\xc0\xfe\x5a\xcf\x7c\x61\x78\x9e\x27\xa8\x8c\x59\x15\x36\xd9\x62\xee\x70\x1e\x2c\x88\x7d\x16\xb7\xf0\xae\xf2\xb9\x9b\x14\x2c\x40\x4e\xe0\xc1\xc2\xa8\x1b\x60\xe9\xea\x08\x2c\x94\x9e\xab\x63\xec\xea\xe2\xbc\xc3\x5c\xfd\x40\xf1\x25\xd3\x75\xaf\x5a\xc3\x22\xa6\x85\xe7\x58\x3a\x63\x7b\x3b\x60\x11\x0f\x0c\xb3\x9c\x7a\x86\x77\x7d\x7a\x7c\xfb\x45\x4d\x20\x6a\x54\xd3\x5a\xd3\x63\x53\xf0\x77\x03\x52\x86\xd4\xc8\x32\x40\x7a\xaa\x0b\xf9\x1e\xb1\x10\x96\xcd\xd2\xb2\x7e\xfa\xe6\x82\x05\xc6\x62\xa3\x59\x58\x61\xbd\x07\x71\xc4\xdd\x0d\x98\x96\xb1\xd8\xf0\x8c\x4d\xdd\xef\x94\xe5\x9f\x6c\xa8\xa3\x4f\x32\x49\x4b\x46\xb3\x71\xae\x46\x19\x02\xe3\x91\xb1\x00\x34\x4d\xc6\xe1\x62\xc3\x78\x24\x3d\xd6\x11\xfc\x7e\x14\xd5\xa6\x28\x8e\x84\x28\x69\xde\xd5\x1e\x75\x0c\x18\x84\x46\x1f\xa5\x84\x1a\x17\xed\x1f\x79\x1a\xb7\x10\xb9\x16\xfb\xd5\x83\xe9\x0e\xdf\x06\x06\x2a\x21\x96\x24\x41\x00\x56\xd5\x16\xf3\x7a\x7e\x9d\xd5\x9d\xcf\x94\x1d\x27\xd2\x40\xeb\x3e\xa8\xd9\x3a\xc7\x18\xd4\xc5\xf0\x9c\x4a\x86\x21\x74\x6b\xa2\x2c\x4a\x65\xf9\xbb\xfd\xb9\x88\xd2\x23\x11\xe1\x5f\x47\x2b\x53\x81\x06\x43\x05\x62\xbc\x7a\xff\xcd\xc7\xa3\xa5\xc7\x48\x7f\xfa\xfd\xb6\x2a\xc7\xb4\x0a\x88\x7f\xdf\xbc\x6f\x16\xc7\xd1\x89\x15\x00\xf7\x12\x1e\x1a\xcc\x1f\x6d\xf6\x5b\x6a\x7e\x8d\x3c\xc0\x80\xfb\x41\x6a\x44\xb7\x10\xab\x5d\xdd\x3c\xa0\x67\xf7\x8e\xf1\xc0\xca\x1d\x9c\x33\xf9\x0a\xef\xed\x89\x83\x50\x51\xa5\xe8\xfe\x52\x5f\xca\x3e\x62\x8b\x07\x5a\x50\x20\xb1\xaa\xaa\x0b\x6e\x09\x6e\x72\xf3\x85\xa1\xe7\x73\xdb\x57\xb4\x8c\x95\x9b\xea\x3e\x0f\x7d\x16\x6b\xfb\xcb\x9a\x4c\xff\x3a\xd2\x6e\x9e\xbe\x5b\x3c\xd4\x8c\x39\x1f\x93\x2c\xbf\x8c\x3b\xd4\x3c\x49\x23\xd2\xb3\xcd\xf1\xbd\xb6\x26\x6d\x8f\xb4\xbc\xb8\xeb\x4f\x18\x92\xe4\xc7\x29\xcb\xe7\x58\x0f\x00\x49\x3c\x81\x88\x63\xab\x76\x40\x65\x5e\x7b\x0e\xf7\x52\xf3\x34\x69\xcd\xaa\xd7\x79\x93\x34\x9b\x33\x18\x95\x1a\x37\x86\x71\xea\x57\xd6\x25\x64\xf9\xef\x59\x3d\x5e\xcc\x39\x8b\x14\x95\xd9\x76\x97\xbf\xb2\x7e\x14\xc1\x59\x0c\x86\xd8\x62\x49\xe4\x87\xd3\x13\xbe\x6d\x8e\x45\x7d\x87\x3f\x47\xf8\x4c\xfb\x09\xee\xa5\xd4\xd8\x3a\xc3\x35\xf6\x3c\xb7\x75\x8e\xc6\xa8\x94\x18\xa1\xc4\x5d\xbf\xbb\xe4\xcf\xd8\x11\xa9\xfe\x13\xfd\xb7\x4f\x69\x05\x0e\x91\x74\x94\xaa\xcd\x7a\xfd\x60\x90\xc4\x81\x5b\xf5\x38\x48\xe1\x59\x95\xd8\x92\xfc\x8f\x66\x65\x09\x37\xb9\xbb\x1b\x8c\x52\x9b\xe9\xf9\x2d\x2f\xde\xf2\x9b\x79\x02\xda\x98\x8b\x3d\x63\xfd\xa5\x38\xaa\x3f\xe4\xcb\x73\xaf\x37\xc0\x45\x64\x78\x1e\xd6\xd3\x71\xb9\xff\x7a\xd3\xce\xe1\x02\x4c\x1b\xf0\xfe\x92\xdf\xc3\x10\x96\xcc\x25\xa6\x84\x92\x6c\xe6\xd5\xbe\xa5\x72\xec\x6a\xb2\x61\x71\x54\xd3\xd1\x25\xa9\x20\x24\x10\xcb\x0b\x54\x5b\x13\x95\x2a\x22\x46\x9b\xf6\xa2\xdb\x7f\xb8\xd2\x86\xab\xd6\xec\x32\x2f\x43\x83\x3e\xe0\x98\x68\x6a\xf2\x2c\xdf\x41\x67\x65\xfb\x73\x90\x05\x34\x2d\x2e\x64\x0a\x4e\x2c\x47\x6a\x34\xb8\x27\xe1\x7e\x92\xf6\xfd\x54\x77\x74\x67\xca\x65\x1f\xe1\xfd\xae\xc8\x8b\x9b\x47\xab\x83\x88\x40\xb7\x0b\x38\x9f\x51\x4d\xa0\x48\xb8\x56\xc6\xb8\xb4\x2d\xe6\x7d\xa0\xa6\x00\xe0\x25\x86\xb3\xf3\x05\xc9\xac\x97\x6a\x7d\x83\x1f\x06\x1e\x04\x49\x64\xd1\x9a\xfd\x3b\x0d\xbe\xa7\xa3\x5e\x20\xdf\xdb\x69\xc1\x07\xe6\x2c\xec\x9b\x50\x54\xcd\x8b\x0f\xea\x4c\x10\x72\x46\x5b\x51\xf3\xe1\x47\x3c\x15\xe5\xd5\xcc\xad\xde\xc9\xa2\x98\xe9\xa8\xed\x4b\xd5\xa8\x9a\x04\x11\xab\xb1\x72\xca\xe8\xc4\xb1\x1f\x51\x1c\x61\xf5\x4d\xf7\xcd\x0b\x5d\x4e\xe6\x19\x10\x87\x09\x57\x4e\x3b\xae\x2c\x8b\xb7\x2c\x7f\xa6\x52\xc1\xe8\x8c\xb6\x63\xdc\x5a\xd3\x7e\x1a\x5b\x43\x2c\x81\xf4\x1e\xb0\x94\x81\x37\xbf\x5c\x6f\xd6\xb8\x89\x0a\x25\xc4\xca\x43\xab\x7f\x64\x85\x22\x8b\xfc\x52\x2d\x89\xe3\xd9\x07\xe6\x42\x8c\xbe\xc3\x09\x39\x78\xe1\x6f\xed\xa1\xd4\x0a\xd0\xbf\x62\xbe\xe9\x79\x34\x7d\xb9\x40\x09\x79\x8d\x7f\x73\x93\x82\x24\x50\xa1\x6e\x6b\x7b\x16\x9a\xba\x2f\xa8\x09\x36\x1a\x99\x1a\x8b\xda\x7d\x39\x7a\x1d\x21\xd5\x32\x31\x18\xb7\xaa\xde\x76\xf6\xac\x00\x10\xa9\x20\x18\x08\xb0\x6c\x16\x7f\xde\x52\x11\x46\x97\x04\x31\xa3\xbc\xc2\xec\x1b\x04\x8f\x1a\x25\x4b\x00\x8a\xbb\xf5\xc5\xec\x43\x64\xee\xd7\xc1\x2c\xba\x61\xbe\xd1\xd7\xc9\x7f\x62\x59\xef\x8b\x4d\x99\x9d\x8a\x52\x65\x70\x1c\xfd\x38\xc1\x3c\x2a\x80\xe1\x09\xcb\x67\xcc\xe5\x95\x42\x4c\x18\xa3\x43\x40\x70\x15\x72\xc7\x13\x24\xf0\x38\x8c\xaf\x4d\x48\xdf\xb0\xf8\x69\xa1\xbf\x01\x90\x4d\xbf\x22\x92\x7b\x06\x41\x59\x17\x65\xeb\x02\xe3\xf6\x72\x90\xda\xd3\xa6\x90\xd3\x84\xcb\x03\xde\x18\xa8\x08\x22\x7b\x45\x77\xd6\xbb\xf0\x83\xbe\x14\xa8\x04\x45\x77\x65\x03\x2d\xbc\x5e\xc9\x03\x94\xf0\x23\x18\x8a\x98\xec\xdf\xad\x44\xc9\xef\x3f\x5e\xc6\xb4\x34\xfb\x29\x8c\x24\xd9\x8c\x5c\xac\x5a\x42\x65\x44\xd3\x0c\x37\x62\x34\x54\x28\x0a\x8a\xef\xb3\xe7\x97\xfa\x60\xe0\xd6\x37\x02\xf1\x83\x1b\xe5\x07\x6c\xf0\xef\x68\x45\x18\xfd\xa7\x8d\x44\x40\x7b\x41\x2a\x06\x39\x7a\xab\x3c\xbd\xba\x81\x3c\xba\xcf\xf8\x9c\x5a\x1c\xe6\x1e\x91\xf6\xdb\x02\xf3\xba\x22\x24\xca\x55\x5a\x49\x92\x36\x6c\x00\x9d\xfa\xd8\xc6\x87\xbb\x42\xd7\x0b\x38\xaf\x5f\xdb\xa3\xe0\x51\xa6\xb0\x80\x7a\x6c\x7f\x0f\xc2\x8b\x13\xea\xb0\x7c\x59\xdd\xef\xff\x9e\x89\x04\x08\x3f\x12\x56\xe3\xfc\x88\x43\xac\xbf\xf0\x99\x47\x16\x08\xf9\xe5\xf4\x50\xb4\x49\xa4\x08\x64\x94\xd8\xb8\x66\x77\x1c\xfc\xdd\x9c\xc9\x84\x44\x2f\x50\x62\x45\x91\x9f\x6a\x07\x60\x44\x1a\x3c\x5f\x66\x8f\xcb\x1d\xd9\xe9\xdd\xb5\x87\x34\x4b\x8c\x14\x42\x71\xfe\x5e\x74\xca\xab\x20\xc2\xd4\x8f\xa3\x16\xfc\x3e\x29\x2c\x08\x22\x14\x06\xc5\xfb\x63\x39\x2c\xde\x89\x10\x05\xc9\x1c\x3e\x7d\x7b\x78\x38\x2c\x9f\x16\xdb\x3f\x37\xa6\x02\xfb\xf0\x65\xbd\x5d\xed\xbf\x3e\x1e\xee\x96\xbb\xc5\x76\x65\xfe\xfa\x6d\xbb\x3a\xec\x96\xfb\xc3\xaa\xbd\xae\xc8\x63\x04\x86\x22\xb3\x9e\x7e\x16\x20\xa2\x20\xa6\x88\x01\xdf\x4d\xd2\x7e\xa8\x8b\x43\x66\x13\xf8\x03\x19\x2b\x1d\xf2\x09\xf4\x8b\x88\x42\x29\x5a\x7f\xf9\xfc\x79\xe0\xb1\x00\x22\xe2\x09\x31\x27\x8c\xbb\xc8\x16\xb2\x0a\x55\xcf\x7b\x0d\x44\x24\x85\x93\xbe\xfc\x01\x65\xb3\x30\x5f\x37\x3d\xda\xd6\xe7\x5d\x5d\x11\xc7\xe6\xd5\x6e\xee\xde\x41\x17\x65\xbb\xb0\x8a\x38\x35\xb2\x28\x75\x79\x41\x91\xd5\xa3\xcb\x8a\xa5\xb9\x68\xb3\x99\xce\x07\x04\xf1\xfe\x4d\x49\x52\x21\x6c\xc7\xe5\xa9\xa8\xfb\x74\x46\xc1\x82\x58\x5a\xb1\xb4\x05\xe4\x3f\xa1\xa2\xa0\xc1\xbe\x6b\x83\x19\xc9\x98\x59\x11\x77\xfb\xdd\xdf\x98\xbf\x4c\x1a\x66\x7b\x75\x3e\x5a\x4a\x59\x35\x47\x5d\xf4\x74\xe3\xc6\x5a\x00\x20\x78\xc8\x28\x32\x15\x70\x3c\x16\xf5\x43\xd1\xd2\x6f\xff\x13\xfc\xd7\x0d\x11\x26\xad\xcf\x2a\x13\xd6\xf7\x89\x8d\xff\x98\xe2\xa1\x09\x2e\x81\xca\x33\xff\xbc\xe4\xcf\x47\xdc\xc9\x92\xbc\x54\x86\xf3\x94\x6b\xa3\xe1\x7a\x97\x3d\x67\x3f\xb2\xe3\x71\x30\x57\xc1\xd7\xc4\x2c\x3f\x38\x62\xc2\xdb\x07\xd6\x9a\xbf\x78\xc8\xcd\xe2\xde\xac\xed\x7f\x62\xfd\xfe\xaa\xfc\xc4\xf3\xdb\x6f\xc0\x84\x77\xf2\x6b\xfa\xfd\x1e\x47\x31\xad\x10\x41\x4c\xbd\xb6\xf7\x83\x2c\xf2\x8a\x4c\xea\xc6\xc5\x67\x21\x52\x23\x53\xd3\x6c\xf0\x60\x64\x92\xdb\x67\x39\x46\x84\x09\xa1\xa4\xa9\xb1\xae\x57\x4f\x87\xc5\x7a\xb7\x3f\xac\x16\x6b\x03\xb5\x71\x8c\x05\x21\x7d\x49\xd8\xd2\x4b\x7e\x6e\xb6\xe6\xd1\x25\x49\xc9\xa8\xfd\x3a\x72\x5c\xb5\x91\x70\xa7\xe7\xd6\xfc\xbf\xfd\x2e\xc1\x44\x35\x72\xf4\xef\x7f\x42\xf7\xb4\x15\x32\x52\x01\x97\x45\x96\x8f\x52\x72\x3b\x02\xfd\xc8\x37\x24\xe0\xbc\xf3\x65\x71\x3f\x00\x65\x14\x0d\xd1\xca\xdf\xb1\xec\xb5\x76\x05\x62\x42\xa6\x53\x35\xbc\xef\x47\x38\x58\xa1\x3d\x8f\x34\x19\x9f\xf0\xed\x53\xf3\x69\x37\x3c\x46\x30\xf8\xcd\x77\x23\x53\x82\xca\x68\x94\xb8\xe3\x49\x4c\x2b\x96\x25\x91\x4d\xaf\x97\x5a\x20\x65\x5b\x47\xa8\x2c\x88\xb8\x8f\xc0\x97\x1e\x63\x54\x06\x9a\x93\x5a\x68\x2f\xa5\x97\x81\x07\x82\x75\x86\xda\x16\x71\x34\xb8\x42\x19\xc4\x11\xd5\xf4\xcc\x03\x9b\x46\x60\xdc\xa2\xde\x65\xc0\x42\x17\x76\xac\xf2\x9f\xd9\xc7\x80\x53\x37\x5e\xc4\x0e\x4c\xb1\x3c\x1f\x61\x28\x90\x0d\x32\x0c\x43\x20\x66\xc2\xb8\x71\x2e\xc3\x48\x13\xb6\xa9\x7e\x29\x8b\xb7\xfb\xc2\x81\x33\x65\x08\x11\x71\x5d\xad\x26\x99\xc3\xa1\x8a\x23\x3e\x61\xad\xb7\x38\x3e\x8d\xf4\xb5\xdd\x98\x88\x1c\x88\xfd\x2c\x68\xf8\xd3\x22\x3f\x21\xf8\x0e\xad\xd4\x54\x8b\x37\xb1\xb9\xfb\xe6\xd8\xc3\xc8\xc4\x6a\xcf\xfb\xb7\x42\x98\xe0\xdd\x49\x4e\x80\x8c\x83\x90\xde\xa1\x1a\xc1\xfa\x01\x59\x8b\xec\x76\x75\x95\x71\x20\x8c\xf7\xf3\xf5\x90\x77\x6c\x5f\x19\xa7\x9a\x4a\x10\x2f\x50\xb5\xd5\x89\xe1\x6d\x8a\x85\xb1\x0e\x22\xcb\x2c\xc7\xd1\x1a\x46\x57\x32\xd6\x82\x5c\x11\x5c\xe4\x79\x67\xb8\x8e\xa3\x14\x5d\x26\x51\x6a\x84\xd4\xb0\xaa\x1f\x8a\xfc\x19\xcb\x7f\x56\xed\x2b\x20\x93\x38\x20\x0e\xe9\x1b\xfc\xc4\x6a\x80\x2f\x94\x49\xa2\x3d\xbf\xb5\x36\x55\xd9\x27\x48\x28\x99\xa4\x52\x77\x4b\xd8\xf7\xd5\x66\x0b\xf9\xeb\xe8\x37\x25\xc0\xa8\x95\xe7\x0a\xe5\x2e\x7f\x1f\x90\x92\x64\xa2\x91\xde\xf9\x23\xfe\xc4\xe3\x21\x19\xe5\x43\x32\x65\x8a\xaa\x47\x75\x86\xa5\xe1\xb6\xd0\x13\x1b\x5e\x4d\x0a\x02\x43\xa3\xad\x8f\x55\x6d\x4d\x8c\xad\xd3\xde\x74\x38\x28\x53\x11\x78\x60\xde\xdf\x05\x9c\xad\x72\x7d\x6b\xc2\x01\x92\x01\xa3\x4a\x77\x56\x59\x56\xe7\xf0\xe3\x3c\x0e\xa4\xad\xb9\x18\x21\x7a\x2b\x3d\xe6\x0e\xa7\x7e\x30\x81\xfc\x9a\x5c\x05\x24\x57\x01\x3d\x57\xda\xcf\x5f\x8b\x3c\xc7\x96\xd8\x24\x21\x95\xda\xf8\x10\xe1\xcf\x61\x58\x28\x01\x18\xc9\x43\xaf\xaa\x65\x25\xcb\xe2\xad\xef\x12\x09\x52\x04\x26\x59\xa1\xd7\xb8\xbe\xf7\x7f\x1b\xdc\x30\xa1\x4d\x15\xd2\x48\x63\xf7\x24\x6a\x40\xca\x94\x7b\x46\xab\xac\x49\x15\x7b\x25\x76\x29\x31\x26\x11\xca\x26\xc3\xb6\xc6\x0a\x7d\x4d\x16\x90\xca\xe3\x84\xa4\xa7\x42\xf9\x21\x88\xbd\x43\xec\x79\xed\xc1\x34\xb2\x85\xcf\xef\x0e\xed\x38\xba\x0f\xe8\x85\x06\x18\x74\xce\xf2\xfd\x0b\xfe\x78\x41\x3c\x8e\x87\xb0\x34\xd4\xad\xba\xa2\xf9\xc5\x7d\x3e\xa9\x44\x8e\xd4\x5e\x7f\x81\xea\xe5\x50\xbd\x40\x10\x27\x53\x32\x61\x20\x51\x87\x64\x92\xb9\xfa\xb2\x72\x9f\xd5\x71\x8c\x89\x33\x5c\x5e\x1c\x8b\xbc\x3d\xad\xf2\x38\x10\x88\x93\x3c\xcc\xa6\xf1\x31\xca\x8f\x13\xd2\x17\xf8\x76\x7a\x35\x90\xa6\xcf\xfc\xa5\xdd\x67\x18\xa6\xa2\x57\x95\x68\xd6\xae\x3f\x9a\xd3\xde\x97\xc5\xe9\x0e\xce\xb7\x62\xc3\xfd\xb4\xae\x9f\x13\xa9\x20\xe4\xb4\xd0\x6e\xb0\x34\xab\x53\x0f\x2f\xaf\xc2\x38\xa1\x45\x9a\xb8\x4f\x3d\x93\x92\x1d\x1e\x75\x37\x86\x91\x4e\x89\x84\xa3\x34\x2b\x7f\x39\xc7\x1c\xf5\x98\x93\xa1\x42\xcd\xa8\xb3\x7b\x82\xf7\x81\x19\x04\xa8\x48\x70\xde\x09\x40\x2f\x5e\x20\xcf\xf1\xf8\x68\x94\xaa\xa7\x4b\x48\x2a\x42\x5f\xdb\x85\x6f\x75\xf7\x08\xe7\x73\x0f\x99\x33\x1a\x1a\x43\x40\x91\x5d\x56\x2d\x9a\xc7\xa0\x66\xb9\xa2\xa9\xe4\xbe\x3d\xf1\x22\x62\x5c\x0e\x6c\x58\x3e\x4f\xcf\x55\xe2\x25\x54\x7c\x26\x4a\xfd\xa6\x2c\x74\x56\xcf\xaf\x1f\x6a\x82\x83\x4a\xd3\x88\x28\xce\x66\x8a\x3f\x2c\xbf\x2f\x1f\xda\x00\x4a\xa5\xa8\x28\xef\x3b\xcc\x8c\x03\x82\xa1\xe9\x0d\x49\x4c\x8a\x05\x9e\x87\xad\xba\xd7\xd3\xe5\xb4\xc0\x23\x8a\xd1\x9a\xa0\x18\x13\x94\xd6\x7c\x5f\xaf\x76\xcb\xf6\xa3\xc2\xcc\x59\x03\x0e\x5a\x9f\xa7\x30\x09\x8a\xfb\x1e\xad\xa7\xf7\xeb\xc7\x75\xf7\xad\x9c\x07\x08\x0e\xc3\xb8\x7a\xda\x76\x15\x05\x37\x00\x04\x35\xf6\xd5\xa5\x9b\x35\x5c\x68\x2a\xae\x57\x75\x51\x22\xad\x12\xcd\x3a\x77\x8f\x48\x60\x0e\xab\xdb\x30\xf4\x9d\xeb\x47\x7e\xc3\xbf\xd9\x73\x42\x20\x69\x96\xf5\x44\xa3\x46\x1b\x98\x82\x48\x10\xd2\xe3\x7f\x2e\x50\x63\x19\xba\xab\x81\x58\x51\x93\xd8\xe2\xc7\x3b\x04\x80\x92\x5e\x4a\x6b\xb5\xf3\xee\x79\x84\xd7\xee\xd5\x95\xb1\x2f\xcd\xac\x21\xe5\xc2\x41\x8d\x45\xc9\x38\x8e\xba\x18\xe9\xa9\xc8\x9b\x99\x95\xe5\xcf\x4e\x41\xb3\x2c\x0a\xfd\x61\xfd\x62\x5c\xc2\x9c\xb0\x4e\x74\x5f\xa3\x18\xd5\xd1\xa4\x63\xad\x95\x59\x8f\x4d\xf1\xa1\x82\x20\x28\xa9\x7d\x23\x39\x47\x00\x91\x9e\xb9\x08\x28\x15\x06\xa6\xea\x0f\x27\x5c\xe6\xaa\x0f\x1d\x51\x0a\x02\x8f\xf5\x8d\x19\x66\xa6\x5e\x33\xba\xd1\x28\x62\xd7\xf4\xb1\x3e\x13\x77\xf3\xdf\xfa\x6b\x8a\x8e\xa4\x08\x1c\x49\x70\x46\x60\xde\x8f\x54\x47\xac\x36\xac\x2b\x89\x2b\x1d\x69\x5a\xee\xbf\x2c\x17\x93\x78\x67\x37\x2c\xf1\xed\x02\xf8\x13\xe1\xf8\xdb\x40\xb8\xd3\x0d\x61\xa9\x70\x0e\x5f\x5f\xb0\x9e\x67\x75\xb5\xbb\x48\xd9\xa5\xc5\x4d\x4e\x40\xc1\x93\x09\x2f\x0c\x40\x64\x92\x8b\x8f\x7e\x8a\x41\xf7\x20\xe6\xd9\x87\x7e\xbe\x9f\x17\x57\x31\xf0\xb5\x07\x56\xcc\x6f\xde\x44\x3e\xee\xef\x51\x64\x55\x65\x4f\xc5\x4f\x6c\xd6\x9f\x47\xc8\xe1\x99\xaa\xf8\x1f\xf0\x14\x30\x88\xa3\x28\x1a\xba\x77\x90\x04\x7f\xfb\xf3\x02\x8e\x68\x23\xec\x1f\x28\x08\x29\x30\x31\x57\x30\x50\x8a\xe6\xf2\xc9\xf4\x01\xec\x5f\xa3\x80\xd3\xa2\xf9\x94\xe5\x7f\x91\xe4\xcd\xd3\xa2\x3d\x04\x01\x09\x8c\x8b\xcb\xb5\x79\xaf\x6d\x70\x32\x23\x5b\x75\x39\x90\x97\xee\x33\x6f\x31\x0e\x83\xc0\xaa\x9f\x18\xbd\x3f\x03\x40\x1b\x0a\xca\xb5\x56\x21\xfd\x3d\x0a\x63\x9e\xc6\x7d\x49\xf3\x56\x52\xc6\xf1\x8b\x86\x77\x26\x41\x25\x9d\x2d\x97\x5b\x64\x31\x0d\x42\xb2\x9c\xa7\xd0\xe5\x07\x66\xa6\x38\x73\x77\x69\xee\x04\x95\x68\xc2\x76\x64\x18\x53\x26\x33\xbf\x94\x79\x7d\xe8\x07\x9d\xc8\x62\x03\x5e\x3c\xc1\xfb\xb9\x87\x38\x47\x96\x78\x94\x7b\xd4\xad\xc6\x8e\x85\x4a\x8e\xfa\xc3\xbf\xa8\x00\x7c\x30\x6b\x98\x0c\xb8\xe5\xec\x6e\xca\xe2\x54\x50\x05\xbc\xfd\x6a\xcd\x21\x70\x01\x1b\x49\x44\x6e\xa0\x49\x61\x47\xb2\xf8\x9f\xfc\x63\x4f\xc4\x83\xc4\x01\x14\x0d\x28\x64\x32\xea\x44\x1e\x43\x6a\xfd\xaf\xeb\x4c\x66\x67\x42\x10\x6e\x4a\xac\xe0\x88\x5f\xb3\x8a\xaa\xd4\xa3\x4f\xc8\x84\x82\xa0\x9e\x20\x72\x8b\x8d\x76\xbf\x82\x2b\x2f\x19\x18\x3f\xee\xfb\xd5\x8d\x61\x0c\x8e\xe0\x33\xe2\xf3\xca\xa2\x30\x2d\x81\x45\x39\xca\xca\x11\x92\x80\x52\xb2\xef\x4e\x08\xf4\x43\x86\xde\x54\x4a\x3b\xba\xff\xc0\x7d\x2a\x4f\xef\xae\x4d\x6a\xd0\xb5\x2d\x51\x79\x0c\x0c\xf5\xe1\xa1\x00\xf5\x47\xde\x2b\xa3\xb8\x11\x3e\xa7\x49\x7f\x76\x1d\x99\x97\x66\x6f\x87\x52\xb5\xa7\x48\x53\x30\xc1\xf1\xb9\xd9\x1e\xef\x3f\xd1\x72\x1d\x5d\x95\x62\x26\x2b\xad\xea\x72\x51\xe4\x12\xea\xea\xd7\x1b\x03\x2a\x4c\x68\x33\xfc\x33\x38\x1c\x69\x86\x1a\x17\x97\x7e\x6f\x1c\xd1\x0f\x85\xcd\xe4\x7f\xeb\xbd\x84\x18\x45\x5e\xd0\xf3\x98\xa4\x9f\x32\xfa\xb9\x18\x81\xef\x75\x62\xa5\xcd\x12\x57\x16\x2d\x2d\x08\x75\x00\x2a\x70\xc2\xa3\x35\x3e\x17\xe5\x95\x70\x9f\xc3\x67\xa7\x75\x42\xf0\xc6\x73\x73\xc3\x7c\xd3\xd0\x6a\x5e\xb6\x55\xde\xed\xdd\xda\xe3\x71\x20\x5c\x64\xfa\x52\x16\x6f\x5b\x34\x3a\xbc\x45\xdd\x13\x46\x07\x1d\xf8\x3e\x69\xd8\x7d\x87\x63\x51\xe2\xa9\x63\xd2\xea\x20\x4c\x28\x7d\xc2\x93\x2b\x3c\xf6\xe4\x25\x3e\x7f\x23\x75\x90\x1a\x8d\xc6\xe7\x12\xb1\x1e\x89\x16\xea\x50\xf9\x06\x20\x68\x52\x76\x23\x72\x3b\xf8\x89\x3a\x0a\xfc\xc0\x66\x59\xf4\xd5\xdf\xb6\xab\x99\xd6\xd9\x3b\x56\x53\x4b\xb4\x8e\x7d\x3f\x76\x20\x98\x5e\xbe\x3c\x7c\x2d\x34\xf3\x05\x95\x96\xe0\x7c\x3e\x5e\x27\x09\x2a\x6e\x60\x2a\x98\xa9\x8a\x5f\x8b\x4b\xbd\xbc\x77\x77\x84\x31\xcf\x50\x67\x0b\x5d\x4b\x38\x3b\xf5\xbe\xc9\x1d\x58\xf3\x20\x92\x56\x99\xb3\x70\xb9\x80\xe6\xb1\x91\x07\xdb\x80\x51\xa3\x21\x6a\xc3\x72\xff\xf5\x63\x2f\x78\xd0\x9c\x99\x68\xe2\x69\xf5\xed\xd7\xf5\x62\x32\xda\x72\xf4\xdc\x1d\xe6\x6a\x50\x8a\xd0\x5c\x87\x24\x13\x08\x52\x96\x17\xdc\xb7\x05\x97\xcf\x8b\x72\x1a\x22\x69\xc4\xbd\x51\xc3\xe5\xd8\x66\x3a\x5f\xa0\x3d\x31\x30\xb4\xe0\xa9\x66\xbd\xb9\x83\x21\xa4\x93\x3a\x72\xd6\x13\xfa\x63\xf5\xe8\xe1\x77\x8a\xc0\x5c\x2a\x95\x61\xfb\x3a\x00\xe3\x71\xa1\xa4\x82\xe0\x73\xa6\xeb\x05\x4c\x57\xe2\xdc\xd0\xb4\x15\xd1\x5b\x6b\x4d\x1b\x42\x57\x15\xd4\x82\x87\x86\xec\x5e\x1c\x8f\x87\xbc\x28\x4f\x9f\x68\xb9\x8e\xf1\x9e\xb7\xae\xde\xbd\x0b\x14\x49\x20\x3a\x63\xb3\x4f\x92\xd7\xb1\xed\xda\xf4\x34\x16\x82\x83\x73\x25\xc3\x77\x7b\x73\x7a\xf5\x04\x2d\xa4\xc1\xaa\xad\xe6\x4f\xff\xbe\x6b\x32\xa9\xf5\x66\xb9\xdd\x11\x11\xe8\xb0\x18\x1a\x54\x83\x96\x71\xa2\xb8\x03\x09\xe2\x79\xff\x56\xdc\x8a\x5d\x68\xa9\x24\xdd\x1a\x75\x13\x65\x69\x15\x98\x52\xab\x84\xea\xa5\xb8\xd4\x53\x7d\x04\x37\x32\x12\x64\xd4\xb8\x5d\xee\x96\xdb\xef\xcb\x3b\x2b\x7a\x73\xb8\x5f\x6f\x0f\xd4\xb8\x5a\x1f\x96\x7f\x2c\xbe\xce\x9e\xbe\x2c\x1d\x1a\x50\xab\x44\xc8\x91\xe8\xf8\xdc\x2a\xba\x8c\xcf\x2e\x42\x8a\xc7\x4c\xe8\xe4\xe2\x8a\xe1\xed\x1d\xfe\x28\xe7\xed\xf5\x8c\xf5\x0f\x0a\x7a\x68\x5a\x2f\x2c\xae\x88\xb5\xa3\xb8\xe7\xa4\x5c\x0e\xa6\x34\xbe\x7a\x9a\x9d\x8a\xfa\x88\xd7\x87\x2c\x1f\xdf\x29\x64\x1e\xa9\xac\xcc\x1f\xd6\x8b\xdf\x0f\x9b\xe5\xf6\xb0\xf9\x3a\x6b\x33\x4d\x8d\x8c\x91\x6e\x44\x0f\x48\xa3\xa6\x54\x36\xb5\x8e\x3d\xc2\x45\x95\x45\x51\x3f\x75\xfa\x75\x5a\x27\x89\x87\x56\xb3\x9e\xb8\xd1\xe6\x80\xf0\xbc\xd4\x27\x86\xce\x02\x08\x8b\xd5\xa1\x22\x84\xe7\x49\x23\x99\x63\x0c\xbc\x0e\x6f\x54\xd4\x3e\x88\x4c\x0d\x18\x71\xcc\x8d\xd6\x28\x6d\xb5\xc6\x70\x9b\xee\x8b\x72\x5b\x14\xf5\x8d\x02\xb6\xf0\x7c\xcf\x97\x51\xa7\x91\x4f\x86\xa7\xab\x51\x3d\x5a\x78\xbe\x80\xce\xb3\x27\xbf\x9a\xce\xa9\xbb\x6c\x5f\x1b\x9f\xb6\x16\x71\xbc\x29\xb3\xff\x35\xc4\x79\x37\x24\xf0\x39\xc1\x29\x41\xa9\x2d\x9e\x8b\x76\xd9\xe8\x2d\x30\xc2\x0b\xd3\x30\x36\x2c\x23\x53\xc3\xed\x95\xd1\xdc\x79\x42\x04\x74\x3c\xab\xac\x3a\x5f\x6a\x2a\x55\x93\x70\xfc\x7d\x51\xde\x17\xe5\xab\x1b\x19\xb1\x94\x4a\x75\x59\x8d\xa7\xb5\x1e\xfd\x9c\x48\x07\xa4\x54\x52\x11\xf0\xd3\x56\x94\xef\x5a\x2f\x03\xe1\xc5\x51\x44\xfd\x3d\x09\xf9\x1c\xa1\x6c\x52\x80\xc9\xa5\x4b\x78\x71\xcc\xc9\x03\x75\xb7\x9f\x6d\xf7\xab\xa7\x2f\x87\xdd\xd7\xed\xea\x71\xe3\x4e\x94\x04\x40\x12\x45\x44\xbf\x5c\x9f\xa9\x6c\xbc\x2f\x96\x96\x28\xb5\xce\x8f\xd7\xe5\x7b\x5d\xc2\x27\xf9\x41\xfb\xa4\x12\x4b\x56\x06\xf5\x33\xab\x8a\xd2\x15\xd8\xdb\x16\x8e\xf0\x92\xc4\xa3\x8c\xd8\x10\x81\xa7\xa9\xb4\x9f\x09\xf4\xf7\xe6\x5b\xea\x29\x6a\xd0\x2d\xa0\xbe\x87\xf2\xe4\x62\x0d\xe1\xa5\x81\xa7\xac\xce\x29\x6d\xfa\x1b\xbf\x3b\xa2\x4c\x05\x06\x72\xd5\xab\x2d\xf5\xe7\x65\x0a\x92\x19\x1d\x65\x38\x52\xb8\x63\xba\x12\xee\x0c\x2c\xd4\x4a\x3a\x57\xdb\x3b\x3c\xd6\xd0\x1e\x61\x71\xcc\xdc\xd4\x20\x4c\x4d\xf3\x48\x8a\x4b\xed\x58\x60\x6e\x1c\x0f\xd3\x56\xf9\xe8\x46\x49\xf9\xb3\x0d\x52\x78\x4c\x87\x14\x36\xb6\x32\x97\x0e\x31\xd7\x9e\x5c\x2b\x30\xfb\xe3\xf9\x08\x3d\x9d\xad\xfe\x22\x26\x3c\xce\x25\x3d\xf1\x1c\xdf\x4c\xf3\xab\x68\xef\x1d\x17\x3e\xb8\xee\xc3\xdc\xb9\x8c\x6c\x51\x1f\x51\xd6\xad\x74\x69\x3b\x58\xf2\xc4\xbe\x98\x7f\xfc\xeb\x5b\xfb\x57\x25\x7c\xdf\x89\xbc\xd7\xd9\xcf\xce\x97\xc6\x8d\x20\xbd\x67\x9a\x04\xf2\x75\x7e\xb9\xb6\x7f\x0e\x8c\x28\xa2\xb8\x5c\x9b\x7b\x2b\xb3\x13\x1c\xdb\x37\x18\x42\x96\x74\x44\xc3\xc5\x31\xc3\x7c\xd8\x5e\x17\x1e\x30\x99\xd8\xcc\xd6\x92\xaa\xba\xdf\x25\xbc\x80\x58\x04\xc5\xa5\x6e\xd2\xfa\x4d\x51\x1c\x47\x2f\x9c\xf0\x02\x69\x98\x56\x55\x5d\x16\xd7\xf9\x85\x44\xc1\x86\x2b\x91\x48\x44\xa2\x3a\xdd\x92\x9e\xe4\xdb\xfc\xfa\x88\x2a\xa3\x6f\x1c\x9e\x56\x7a\x46\x41\x56\x5c\xae\xc1\xf8\x90\xaf\xe9\x61\x3d\x20\x94\xf9\x1f\xee\x4a\xa5\x36\x99\xc8\xb3\x75\x65\xeb\x08\x6a\x6e\x8a\xaa\x14\x4d\x53\xdd\x46\xf7\x14\x62\xda\x63\x3a\xd1\xc4\x8d\xad\xfc\x7e\xa5\x4c\x78\x9a\x87\x89\xa3\xc5\x98\xfe\x4a\x35\x9a\x14\x9a\xa7\x60\x24\x6d\x49\xc8\x67\x52\xca\x7c\x34\x1d\xb5\x34\x05\xd3\xba\xcc\x9e\x9f\xb1\xdc\x56\x78\xd4\x74\xfb\x2e\xb2\xde\x1a\x78\xbb\x19\xe9\x7b\x7e\xcc\xfc\x41\x62\xbe\x78\x81\x3e\xd9\xdd\x8d\x13\x1e\x31\x43\xac\x66\xbf\x55\xb0\xd8\xc1\x11\xc7\x36\x4a\xc2\xf7\x23\x4d\xca\x8f\x85\xd5\x14\x3d\xfc\xcf\x05\xcb\xeb\x34\x07\xf9\x3f\xe1\x50\x5f\x57\xf8\x7e\xe2\x87\xd8\xb5\x60\xab\xf9\xf5\x6e\xc4\xbe\xa4\x31\x46\xa9\x9c\x2a\x77\x2d\x8b\x46\xf8\x01\xf7\xa5\xbd\x9b\x9b\xec\x1d\x8f\x43\x20\x95\xf0\x03\x44\xc2\x3f\x1a\xfc\xc9\x5a\xaf\xcf\x98\x6f\xef\xff\xe5\x9e\x92\x1f\x42\xda\xe3\xb9\xda\x05\xa2\x7d\x4d\x46\xad\x09\xe1\x87\x42\x83\xbd\x56\xe3\x73\x4f\x45\xa4\xe1\x98\x28\x65\x24\x48\x64\x05\x83\xe0\xd8\x55\x15\x87\x3f\x2a\x92\x26\x67\x22\x60\xd4\x0d\x8e\x73\x7a\x91\x1f\xea\x8a\x09\x3f\xd2\x5e\x6c\xa9\x11\xf6\xe2\x07\x12\xf9\x76\x54\x8c\x29\x31\xb7\x9a\x35\x7b\x5f\xcc\xcd\x39\x46\xf2\x2a\xc2\x4f\x22\x5f\x25\xad\x90\xe2\x97\x7e\xf7\x77\x78\xe1\x49\xc2\xa5\xe3\xcb\xf6\xe2\xae\xde\x00\x16\x91\x10\x41\xf3\xa3\xf7\xf8\x5e\xff\x8e\xd7\xa9\xe6\x91\xf0\xd3\xd0\x70\x40\x77\x56\x19\xe5\xef\x14\x0d\x85\x9f\x26\x82\x00\x5b\x67\x38\xe2\x15\x4b\xbf\x7a\x29\xde\xfa\x30\xfb\xdb\xff\x75\x1f\xe4\x1e\xa5\x8d\x77\x78\x2a\x8e\x59\xf5\x32\xbf\x1a\x31\xaf\xe9\xbc\x50\xf8\x8c\x1b\x98\x43\x13\x2b\x17\xba\x7e\x23\x6a\x62\x93\x3e\x4d\x01\xd2\x9b\xf5\xda\x08\x60\xe5\x45\x0d\x4d\x54\xd3\xc3\x57\x09\x1f\x30\x75\xe8\x7d\x83\x32\x68\x92\xb1\xd1\x09\x64\x18\xd1\xae\x7d\x68\xab\x3e\x1f\x28\x13\xbb\xf1\x68\xb4\x92\xf6\x58\xd5\xcb\xf5\xae\x03\x36\x34\x87\x4c\x9f\xe2\x89\x04\x7c\x1e\x3f\x7a\x94\x8a\x05\x9e\x89\x13\x94\x89\xc1\x2e\x7d\x00\x53\xbb\xd7\xf7\x7e\x87\xe2\x86\x44\xd0\xf6\x86\x2e\xb9\xaa\xfe\x46\x52\x29\xfc\x66\x37\xd2\x1d\x70\x10\xca\xe3\x75\xe3\x6a\x66\x13\x55\xdd\x8f\xce\x82\xdc\xf4\x63\x8b\xe3\x4f\xdc\x43\xf5\xfa\xa1\x34\xcf\xe4\x7f\xda\xb3\x60\xc8\x3c\xc2\xce\x7f\x7b\x78\x30\x79\xc9\x61\xf6\xb8\xfe\xf6\xb4\x77\xf7\x0f\x13\xdf\x09\xf6\x39\x11\xd1\xe1\xca\xa2\x23\x9f\xe6\x78\x96\xeb\xe2\x40\x15\x96\x4f\xf2\x04\xe1\x6b\x50\xff\x7f\xca\xbe\xad\xb9\x71\xdc\xda\xfa\xef\xcc\x43\x1e\x40\x80\x24\xc8\x47\x59\x96\xbb\x95\xb6\x2d\x47\x92\xa7\x27\x27\x95\x52\xe1\xb2\x21\x33\xa6\x48\x85\xa4\xec\x76\x7e\xfd\x57\xdc\x00\x78\x13\xed\x99\xaf\x4e\x25\x9d\x63\x82\x14\x2f\xc0\xc6\xbe\xac\xbd\x56\x64\xc5\xbb\xf3\xe9\xb4\x31\x5a\xa1\x70\x45\x8e\x3d\x9d\x8f\x65\xb3\xfa\xef\xa5\x0f\x45\x07\x20\xe0\xa1\x03\x4c\x49\xeb\x98\xb6\x81\xc7\x72\x63\xa5\x72\x3c\x06\x7e\x12\x53\x7e\x21\xe1\x2d\x29\x91\x9c\xe8\x01\x81\xc7\xad\x68\x60\xb2\x39\x52\xa2\x89\xa3\xb7\xb2\xa5\x55\x67\x67\x76\xea\x05\xf4\x65\x06\x44\xf6\xff\x93\xca\x6d\xaf\x9e\x26\xa6\x6b\xab\x5e\xe9\x6c\x5a\x88\x6b\x87\xa8\xc4\x27\x06\xda\x2d\xf8\xae\xac\x7e\x87\x2a\x33\x99\x12\x57\x58\x38\x49\x03\x97\xac\x76\x9e\xc1\xe2\x7c\xce\xfd\xc0\xf1\x65\x03\x16\x63\x9a\x5f\x38\xec\x09\x7d\xaa\xca\xd6\xf0\x0d\xf2\xdb\x92\x06\xa1\xc1\xb4\xe9\x19\x75\xe2\xbe\x7d\x9c\x90\x26\xb8\x73\xbc\x68\x90\x18\x9b\x88\x6a\xca\x0a\x90\x6d\x61\xf4\x91\x02\x00\x84\xb1\x98\xf7\x31\xa1\xc7\x60\x41\x51\x4a\xad\xa8\x04\xfc\x42\x0f\x11\xd9\xc8\xe6\xd7\x93\x3b\x81\xc5\x36\xae\x3e\xd8\x77\x86\x35\x8e\xc9\x4b\x60\x1c\x6c\xe7\x43\xdd\xc6\x69\xfd\x7e\xa6\x27\xef\x80\x49\x0b\x27\xb5\x55\xd8\x9f\xeb\xc7\xdb\xcd\xcf\x03\x3b\xac\x1e\x6f\x0f\xfb\xf5\xc3\xca\x3f\x65\x18\x84\xd8\x1e\xb1\x05\xfd\xd4\xbf\x9b\x48\xc6\x18\x18\xb5\xb3\x7d\xf4\xd2\xe2\x90\x21\xdf\xd9\x6d\x25\x8e\x65\xf1\x63\x48\xbc\x30\x9c\x24\xd7\x76\x3a\xf0\x82\x42\x81\x6f\x09\x91\x34\x56\x84\x58\x50\x3d\x88\xfa\x32\xc9\xa5\xb7\x87\x19\x16\xe4\x9d\x8c\xb3\xcb\xbb\xff\x84\xec\xd6\xd1\x20\xfa\x71\x40\x91\x21\xaa\x39\x56\x53\xc9\x44\x49\x79\x18\x47\x5d\xe0\xb5\xb4\x65\xd1\x4c\xe6\xed\x4c\xb3\x2c\x63\x8b\x41\xdc\xfc\x85\x89\x19\xdf\x1a\xe7\x82\x7a\x45\x9e\x36\x44\x5f\x17\xc8\x59\xf1\xdb\xe8\x4b\xf1\x34\xc6\x60\xb7\xb6\xc0\xe8\x61\xe2\xb9\x3d\x08\xc6\x62\x76\xce\x5f\x96\xdf\x25\x4d\xa8\x40\x6c\x79\xdf\x47\xd0\x11\xbb\x4f\x4e\xec\x5e\x6c\x42\x0d\x16\xfb\xd0\x90\x7e\x1b\x02\x1e\x27\x97\x66\x81\x8f\x22\xb6\x97\x62\x87\x42\x4d\x83\x6c\x03\x4d\x62\xcb\x91\xf2\xb0\x7e\xdc\x0f\x27\x4d\x92\x26\x16\xc8\xda\xbe\xee\xf6\x35\xb6\x5f\x64\x32\x4f\x13\x09\xdc\xed\xff\x97\xf3\x3f\x9e\xfe\x39\xcf\x68\x70\xf5\xef\x97\x3b\x04\x4d\x99\xc0\x6d\xb8\x7d\xfa\xf6\xb9\x6c\x86\xa8\xdd\x1c\x07\x89\x70\x49\x53\x21\x52\xde\x95\x0b\xef\xcb\x37\x24\xc6\xf0\x9e\x21\x55\x69\x84\xd0\xdf\xf6\xec\x3f\x58\xf7\x57\xc9\x90\xdc\xc4\xef\x7e\x43\x6a\x5a\x49\xb5\x11\xa1\x03\x33\xfd\xc8\x9a\x26\xeb\xd2\x1e\x14\x08\xc1\x0a\xcd\x7b\xc7\x06\x89\xfb\xe6\xf0\x3d\x02\xa3\x5e\xaf\xed\x16\x6f\xb4\x0d\x8f\xec\xa6\x3c\xc7\x32\x21\xa9\x57\xc5\x43\xa1\xca\xa6\x19\x08\x2d\x4b\x0a\xc6\x60\x94\xf5\xf4\x52\x42\x91\xfd\xea\x7b\xb4\x25\x35\x4c\x60\xb2\xfb\x61\xf1\x87\x63\xc3\x38\xec\x9e\x9f\x9e\xee\xff\xd9\x0d\x88\x88\x0f\x26\x5d\xfb\xd9\xd8\x1c\xf9\x61\xd2\x84\xe9\x60\x5f\x58\x6d\x76\x7e\x99\x0c\x6d\x20\x23\x51\x84\xde\xda\xb3\xcc\xfe\x3b\xc4\xcf\x4b\xd6\xee\x2c\xa4\xe3\x09\x59\x1c\x61\xb4\x34\x58\x20\x62\xc4\xdf\x39\x22\x4d\x6b\xe7\x46\xf7\xc0\x02\x49\x31\xd0\xfc\xfd\x02\x4f\xe2\xa3\xeb\x5d\xf0\x3f\x10\x18\xc3\xdc\x27\xbe\xbb\xe4\xb9\xed\x80\x1d\xef\xe3\x8c\x52\xe2\x35\xc9\x1f\x4b\x2d\x72\x84\xba\x5f\x59\x72\x46\x85\x06\xd6\xd3\x47\xdf\xf7\xb5\xa2\x7a\x4a\xc2\xdd\x0e\xb6\x42\x88\x6f\x65\x03\x37\xfe\x66\xa8\x09\x51\x46\x70\xb1\xfd\x71\xb8\xbb\x5f\x7c\xfb\xb6\xda\x1e\x82\x83\xc7\x75\x49\x16\x46\x89\x0e\xfa\x7d\x60\x65\x15\x79\xb1\x6f\xaf\x0d\xa2\xc7\x2b\x87\x85\x31\x88\x0e\x78\xb6\x3b\x77\x40\x3f\xc9\x42\x6d\xbb\x1c\x94\x45\x0d\x21\xc4\x67\x9f\x9d\xc0\x67\xd4\x1d\x69\xb5\x64\xa1\x51\xd8\xd1\xf3\x53\x34\xea\xe5\x11\x7e\x35\xae\x91\x76\x90\x43\x63\x11\x89\x30\x1b\xda\x39\xa4\x03\xce\xe6\xba\x1b\xc4\x38\x19\x16\x7b\x6f\x45\x95\x7d\xed\xc5\xb1\x28\x0a\x7c\x6b\xdc\xa8\xcb\xc6\x1f\xe6\x06\x2b\x46\xab\x9b\xfb\xfb\xcf\x51\x0f\x92\x45\x22\xc4\xad\xf0\xc7\x8f\xbf\xd6\x1e\x22\x59\x24\x43\xb4\x4a\xf8\xde\x6e\xe1\x9c\x97\xd8\xb5\xd3\x3f\x8b\x8e\x42\x8b\xda\x73\xf3\x00\x42\x7f\x28\x8e\x08\x6a\xbe\x1e\x2b\x21\xe7\x70\x1b\x7e\x98\xeb\x7d\x47\xa6\x20\xac\xf7\x3c\x4e\xa5\x51\x25\x8b\x41\x8a\x1e\x3f\x81\xf5\xcf\x51\x37\x8f\xa7\x65\xf2\xc3\x8d\x00\x87\xcd\xfd\xfb\xf9\x43\x39\xf6\x99\xb9\x7a\xb4\x64\x5c\x8a\x71\x6a\xaa\x75\x01\xee\xca\xca\xe7\x8c\xa6\xe3\x93\x98\x06\x3e\xff\x0b\xa2\x99\x6c\x75\x7e\x10\x28\xa4\x0e\x35\x96\xdd\xc5\xdb\x43\x96\x06\x09\x32\x0b\x99\xac\x5d\x5e\xc8\x07\xd1\x1d\xe2\xa9\x21\x53\x42\xaa\xe5\x8b\xa8\x9a\xc5\x51\x64\x45\xdd\x60\x2b\x7a\x56\x1c\x57\x56\xe4\xe9\xaf\x14\x1a\x25\x13\x81\x91\xd4\xfb\xe5\x36\x15\x2b\xfd\x2f\x0a\x66\x70\xbb\xfc\xbe\xb9\xbd\x5f\x6d\xe7\xdf\x8e\x90\x01\x75\x1c\x09\xab\x42\xef\xa6\x15\x5b\xc9\x64\x60\x59\x29\x96\x3f\x97\xc3\xd6\x1b\xc9\xa4\x48\xb1\x6a\x7f\x5f\x1e\x1f\xe1\xbd\xe3\xfd\xbf\xe6\xc6\x19\xff\xa0\x54\xa1\x65\x7a\xf8\xb0\xa8\xb8\x7a\x0b\x0a\xb2\xb7\xde\x0a\x2a\xa2\xd1\x0a\x0e\xc1\x76\xf3\x39\x9f\xf9\x35\xa0\x13\xdb\x95\xbe\xcb\xda\x69\x8e\xfc\x91\x2e\xb1\xf4\xd7\xc2\x69\xa6\x15\xb1\x0f\x66\x29\xd2\x26\xb5\xa8\xf1\xbc\x05\x11\x21\x34\x50\xa0\x34\xf5\x4d\x6b\x39\x7a\xa7\x72\x28\x6b\x2d\x19\xe8\x08\xcb\xc9\x4e\x3c\x72\xa8\x63\x22\x99\x09\x0c\xe6\x1a\x8a\xd6\xda\xb5\x73\x0a\xcd\x6e\x2d\xb1\xd3\xa5\x80\xf7\xb3\xe8\x87\x86\xb6\x17\x0e\xd3\xb4\x0b\xdb\x05\xf0\x27\xd6\xc5\xf0\xc0\xcb\xc5\x5f\xa9\x5f\xcf\x05\x53\xcc\x68\x8b\x02\x38\x1d\xe4\x1a\x09\x3e\xdc\x8f\x87\x84\x2a\xa4\xd6\xba\xb9\x78\x9e\x85\xac\x79\xf9\x3a\xda\x1d\xdf\x4b\x48\x58\x48\xb4\x37\x38\x8f\x58\x65\xdc\x0f\xd8\xa6\xba\x79\x10\x12\x45\xa9\xe8\x20\xb9\x4b\x51\x77\xde\x43\x18\x90\x40\x59\x6d\x93\xf7\xa1\xa5\x18\x7d\x9a\x90\x49\x8a\xb8\x17\xd7\x28\x81\x0c\x4a\x53\xce\xb3\x90\xb8\xc1\x61\x4c\x7c\x65\x14\x95\x91\x76\x0d\x42\xfd\x66\x5f\x67\x18\x69\x82\x01\xd8\x39\x83\x2e\x13\x3d\x5e\x56\x61\x9c\xb0\x90\x78\xa2\xae\x46\xe4\xae\x4b\xc2\x1f\xd5\x21\x82\xbc\x9b\x77\x18\xcb\x3b\xc8\x30\x36\x96\xdc\x05\x1c\x69\xde\x83\xf8\x04\x13\xe7\x13\x5f\x53\x7b\x1b\x72\x22\xf0\x0a\x77\xf9\xc5\xaa\xac\x75\xaf\x8d\x07\x0a\x33\x71\xab\xed\x92\x52\xe6\xed\xdf\x01\x5c\x1f\xb1\x1f\x25\x08\xe6\xb3\x0f\x68\x52\xde\xb2\xf6\x2e\x70\x27\x74\x64\xcf\x13\xb6\x7d\x77\x56\x12\x2b\xee\xec\xc8\xb7\xec\x0d\x8a\xcf\x3a\x86\x64\x98\x28\x81\x2d\xb6\x8f\xf0\xbe\xbb\x1c\x8f\x6d\xf4\x5c\x5e\x45\xe9\x93\x8b\x2b\x43\x60\xf0\x75\x46\x9e\x79\xf7\xc1\x53\x12\x63\x26\xe4\x58\x65\x60\x7a\x6d\x30\x19\xa6\xdc\xa2\x4a\xea\x46\x1c\xe1\x10\x1c\x9c\xd6\x45\x99\x77\xcf\x9c\x6a\x85\x0d\x3e\x8b\xd5\xdd\x9d\xd5\x0a\x72\x07\x44\x90\x78\xf0\x14\x56\x8e\xad\xfc\x02\x56\xe3\xe7\xe7\x86\x88\x15\xea\xcc\xb6\x41\x95\x14\xb5\x4b\xeb\x38\x70\x4f\x77\xd5\xc4\xaa\x6a\xd8\x2c\xec\xbe\xbc\x01\x0b\x36\x1b\x6f\x8a\xa1\x10\x04\x57\x61\xfb\xa3\xce\x4a\x76\x53\x48\xf2\x38\x65\x8e\x08\x7f\x07\x88\x59\x9e\x32\xab\xca\x50\xe9\x04\x9c\x20\xf2\x4d\xa6\x75\x07\xfd\x93\xa1\x02\x22\x5c\xa3\xe0\xa2\xae\xa1\xa9\xaf\x29\x7c\x65\xa8\x45\x84\xa4\x0b\xe7\x01\xab\xc3\xe8\xfa\x46\x2a\xed\x75\x13\xac\x0e\xb5\x40\xf9\xb0\xaa\x54\x00\xba\xfe\x29\xb2\x41\x5d\x5e\x86\x46\xa7\x4e\x72\x04\x13\x48\x4f\x7d\x4e\xf0\x4b\x1d\x5a\x19\x11\x01\xbe\x29\xe2\x77\x28\x74\x59\x0d\xb2\x18\x8e\x7f\x72\x78\x5f\x51\x20\x02\xb0\xc5\x26\xa1\x0f\x68\x68\x0e\x1e\x5f\xd5\xfe\xff\x7a\xd2\x4c\x24\x23\x4a\x6c\xa7\x7a\x53\x65\xea\x35\x87\xe7\xf3\xf4\x78\xa8\x90\x76\xff\xdb\x90\xbb\xda\x3d\x56\x14\x92\x90\xab\x61\xf7\x33\x56\x25\x47\x4a\x07\x13\xd8\x84\x3b\x31\xe2\x0a\xab\x14\x4f\x55\xa6\x47\x19\x83\x28\x4a\x52\xa4\xb2\x38\xc1\x69\x59\x9e\xaf\x04\x1f\xc7\x73\x2e\x8a\x34\x41\xa6\x02\x2c\xfd\x61\xcd\xa0\xbb\x0e\xd8\xb2\x62\x07\x8a\xce\x4b\xb5\x2f\x9f\xa7\xed\xf1\x32\x4a\x62\x8e\x62\x0d\x8f\xe7\xb2\x0b\x17\xa2\x34\x31\x09\x1f\x08\x29\xd5\x9f\xe4\x5d\x23\xc1\xac\xf6\x7d\x05\x75\x73\x97\x15\xd9\x04\xb1\x25\x23\x99\x50\xed\x22\x1b\x97\x4e\x98\xc6\x08\x91\xd4\x8c\xca\x41\x44\x78\x0b\xe3\xbe\x14\x19\xe9\x88\xd3\xb4\xef\xac\x7d\x73\x80\x05\x5b\xe6\xf2\x0d\x36\xed\xb0\x34\x4d\x3d\x9d\x28\xe6\x3c\x44\xf5\x71\xf0\x5a\xe1\x07\x65\x45\x3d\xba\xd1\x9c\x21\x26\xbc\x6e\xe0\xec\x3d\xdb\xc8\xb0\x14\x77\x83\xd2\x98\x3c\x2b\x50\xe4\x60\x7e\xb9\x47\x26\x11\x01\xeb\x8a\x1b\xce\xf3\xf9\x51\x64\xc7\x97\x89\x0b\x1f\x19\xb0\xf5\xaf\x3e\x23\xb1\xb8\x1f\x39\x54\x31\xa1\x01\x16\x53\xd6\xcb\xcd\x9f\x76\x78\xc8\x98\xa4\xac\x73\xab\x2f\xa7\x85\xab\xe7\x38\x00\xb3\xb9\xe4\xb7\xd0\xd7\x28\xe3\x80\xa5\xd2\xc1\xc9\x5a\x1f\x1c\xc9\xee\x66\x2b\x10\x71\x10\x27\x58\x66\xbd\x79\xfe\xe7\xa1\xcb\x5d\xc4\x34\x30\x41\xd8\xb1\x7d\x22\x19\xb4\xc5\x05\xce\x04\xb8\x31\x4d\xb8\x76\x36\xd3\x46\x47\x57\x8a\x87\xb3\xc0\x1e\x19\x53\x20\x58\x12\x10\x5a\x63\x8a\xee\x7e\x26\x45\x17\x33\x0a\x66\x28\x24\x59\xb5\x9b\xd7\x27\xdb\x70\xcc\x54\x88\xdc\x60\x0f\xab\xdd\x6e\xf1\x6d\x75\x78\xda\xae\x97\xdd\x43\x31\xb0\xd0\x8b\xe5\xea\xff\x16\x5f\x10\x04\xcb\x38\x24\x21\xa2\x8b\x0f\x7e\x37\xbf\x39\xa9\x5b\xf1\x51\xbb\xe4\xd4\xec\x9a\x88\xc3\x50\xe0\x2b\xbb\x2b\xab\x49\xb3\xa9\x8c\x43\x20\xdc\xae\x97\x36\x00\xff\xb4\xd4\xfe\xc9\x85\x21\xc6\xdb\xce\x54\xd9\xd3\x0b\xca\x38\x8a\xed\xb6\x7d\x84\x02\xea\xac\x5e\xb6\x6f\xbe\x1a\xd7\xa1\xe3\x28\x55\x58\x1f\x69\xad\x7e\xd5\x64\x2a\x87\x21\xa1\xc9\x30\x0b\x1b\x47\x22\x40\x90\x55\x03\xe2\x84\x53\x76\x7e\x01\xc4\x91\x60\x4a\x0e\x02\x37\xab\x65\xf0\x59\xf5\xce\x9f\xe4\xdf\xfc\x80\x1a\xdd\xdf\x23\x0f\x15\xb6\x5d\x7a\x07\x68\x35\xf2\x4e\x62\x9e\x26\x58\x8a\x37\x17\xf5\x8a\xee\xbd\xc8\x4e\xc1\x15\xa1\x9c\x8c\x13\x3e\x54\x4c\x7a\x80\xe6\xa5\xd4\x8b\x9b\xb5\xbf\x4c\x22\x44\xe2\x1a\x27\xd7\x45\xd6\xb4\x01\xa7\xc7\x62\xc4\x29\xd1\x98\x67\xb1\x38\xd6\xe9\xfc\x13\x11\xc3\xd9\x7d\xba\xe4\x4d\x76\x33\x90\x9c\xf4\x0e\x58\x2c\x40\xe2\x4a\x7f\xda\xae\x0e\x4f\xcf\x37\xf7\xeb\xe5\xe1\x7e\xb3\xfc\xf1\xfc\x74\x78\x5a\x6d\xd7\x9b\x5b\xff\x3b\x32\x48\xd0\x8b\xc5\x0d\x6a\x91\x55\xb7\x55\x79\xee\x8e\x85\xc2\x38\x7f\xf4\x27\x88\x73\x59\x3c\x94\x1a\x26\xc0\x80\x58\x4a\x89\x9c\xb8\x13\x4c\x9b\x8c\x15\x95\xb1\xcb\xc2\x9f\x2d\x54\xfb\xb7\xa1\xa7\x14\x2b\x61\x9b\xd9\x1e\xa1\x79\xcd\xda\x79\xf2\x85\x0a\xc1\xe4\x7b\x6b\x62\xa3\xf9\xf3\x25\x77\x1c\x10\x93\xf7\x03\x81\x15\xee\x16\x5e\x2e\xf8\xf7\x32\xbf\x5c\x97\x4e\xff\xb4\x3c\x32\xce\x8c\xcf\xfa\x05\x31\xc4\x16\xd9\xf2\x52\xe6\x1a\x2a\xe7\x9f\x8e\x6f\xc7\xc4\x09\x66\x7f\x6c\x6d\xe0\x7b\xd9\x4c\x5a\xff\x64\x6c\xb8\x9d\xe9\xb5\xa5\x16\xbc\x2a\xfd\xc7\x26\x65\xc2\x25\x1b\x56\xcd\xcb\x73\xad\xaf\x00\x82\xed\x98\x08\x79\xd6\xd7\x45\xbb\x10\x3a\x4f\x8f\x13\x0a\x98\xc4\xc2\xd9\xd2\x31\x16\xc0\x74\xce\x70\x12\x32\xf4\x58\xb2\xda\xc2\x13\x9e\xca\xba\xce\xba\x0e\x62\xc9\x49\xaa\xa9\x53\xdd\xa9\x32\x4c\xa4\x8e\x7e\x9f\x13\xc3\x51\xdb\x03\xf3\x11\xe8\x17\x39\x7e\xe0\x41\x90\xc9\x89\x31\x48\x0f\x90\xb9\x9b\x7c\xca\x40\x39\xb9\xb7\xf1\xd5\x82\x84\x78\xda\x29\xf4\x15\x66\xaa\x9f\x9f\xb0\xfe\xdb\xe0\x64\xc6\x88\xf2\x20\x0d\x02\x36\x11\x1d\xe3\xfe\xce\x68\x98\xa0\x15\x39\xdb\xbe\x8f\xcb\x30\x7d\x30\xc8\xfb\x70\xaa\xa9\x55\x30\x7f\xc9\x4c\x73\xa8\x70\x9b\xbd\xf4\x1a\x8c\xfd\x13\x50\xa3\x0d\x78\xfc\x74\xbb\xbc\x1c\x1f\xe3\xac\x11\xe3\x4c\x44\xe8\x4c\x5b\xec\xd7\x22\xcf\xef\xe1\x0d\xf2\xa5\xe8\xf5\xb1\x27\x2a\xc8\x92\x87\x41\x84\x05\xd3\x75\xa1\xb3\xb7\x4c\x5f\x44\x3b\xfc\x53\xb2\x5b\x7f\x52\x44\xa4\x17\x60\x6f\xd4\x28\xa9\xe1\x47\x68\xe1\xa5\x40\xf7\x50\x34\x02\x51\x4a\x59\x81\x42\x9c\x18\x76\x0c\x59\x2f\xae\x11\x89\x3c\x84\x18\x5b\x28\x17\xb7\xbf\xaf\x77\x9b\xed\x61\xb7\x5f\xfc\x58\x1d\xee\x36\xcf\x5b\xff\xaa\xa3\xd8\xca\x37\xe3\xaf\x97\xa7\x4c\xfd\xea\x8e\x48\xdb\x2e\x6c\xa3\xea\xa1\x6c\xa5\xe4\x9c\xc6\xd8\x61\x72\x86\x2a\x2b\xf5\x7a\xbf\x39\xd8\xff\xd5\x1d\x67\x1c\x93\xe8\xbb\xe5\xc6\xf3\x96\x4b\xce\x23\x19\x62\x26\x6d\x10\xb8\x70\x0e\x02\xa8\x2f\x83\xb4\xd1\xc1\x4e\xe4\x08\x48\x1b\xa2\x85\x78\x02\x12\xb7\xdc\x4d\xa1\xca\xbc\x3c\x76\x53\x38\x31\x09\x92\x9c\x9d\x8e\xd5\x40\xa7\x50\xf2\x34\xb0\xec\xf7\xde\x7b\xbc\xd6\x42\x90\x3c\x0d\xa9\x15\x2a\x17\xf5\x41\x9c\x46\x67\x03\xc7\x9a\x1a\xd2\xdf\x3f\x96\x6f\x62\xbc\x6e\x04\x55\x58\xa8\x17\x5a\xff\xe3\xe2\xe2\xd5\x4f\x2a\x32\xa3\x29\x2f\x22\x13\x3a\x17\x6d\xdc\x48\x27\xb9\x48\x48\xea\x10\x65\x88\xa5\x6a\x17\x84\x4b\xc7\xff\xc5\x7a\xf1\x64\x6a\x09\x60\x01\x8c\x28\x2a\x90\xd7\xea\x1e\x4c\xf7\x94\x52\x18\xee\x7b\x2f\x2c\x15\xd5\x03\x52\x98\xcc\xd7\x1e\xfb\x4b\x2b\x22\xb0\x37\x5a\x97\x37\x97\x09\x10\x89\x2b\x99\x44\xc4\xf7\x04\xfd\x7a\x80\xea\x38\x42\x84\x71\x65\xe2\xd4\xd2\xc4\x7d\xb8\x16\x8d\x4e\xa6\x5a\x72\x88\x42\xc0\xb2\x40\x3f\x07\x81\x87\xc8\x22\x00\x85\xde\x98\xfb\x52\xbd\xce\x14\xa1\xb9\xa1\x01\x58\xd1\xdf\xa3\x23\x77\x90\x09\xd1\x31\x6e\x79\xbb\x7f\x6c\x1d\x7e\xe1\xe1\xf9\x7e\xbf\x7e\xba\x5f\x7b\x79\x1f\x99\x10\x03\xa9\xa7\x48\x9f\xed\x1c\x92\x49\x40\xd3\xd4\xa5\x31\x16\x79\xee\xb8\x6f\xef\xb2\x42\xe4\xd9\xff\x86\x54\x6b\x32\x09\xa2\x08\xdb\xc5\xfc\x8c\xfb\xd9\x61\x4d\x92\x20\xb2\x2c\xed\x16\x0f\x7c\x3a\x5f\xf2\x1a\xac\x0c\x85\x1b\x10\x6a\x2b\x54\x6f\x9d\xa6\xdd\x2b\xb4\x9f\x61\xc6\x68\x26\x11\x31\x58\xd5\x28\xe0\xbd\x73\xad\x2e\x23\xfa\x2a\x37\x30\xa6\x81\xb6\xdb\x72\x6f\x12\x66\xd0\x2a\x49\xcc\x28\xf2\x7b\x74\xbb\xf3\xca\xb9\x59\xfe\xd6\x62\x6e\x15\xbe\x50\x53\xe4\x0d\x86\x55\x7a\x3f\x42\x84\x68\xf9\x5e\x86\xfc\xcd\x32\xe1\xd2\x60\x02\xe8\xfe\xfe\x8f\xee\x4f\x3a\xc2\x4d\x6d\x46\x80\xd6\xa7\xb4\xc2\x7f\x4f\x1d\x81\x7f\x05\xc1\xbf\xff\x36\xe3\x91\x26\x1c\xec\x12\x47\x22\xb5\x76\x8f\xac\x1d\x31\xc1\xe0\xa3\x24\xc0\x55\xcf\xc5\x75\x83\x49\x86\xf2\x54\x5e\x9a\x4f\x34\x62\x64\x92\x12\x5b\x28\xfe\xe7\xf3\xd3\xd7\x49\xe6\xd9\x90\x25\x49\x8d\x44\xaa\xec\x8f\x0c\x72\xcd\x6f\xbb\x2c\x6d\x22\x22\x4b\x79\xff\x9d\x6e\x96\xfd\xdf\x0c\xd6\xb6\xed\x67\x1f\xbc\x95\xeb\x9e\x8d\x49\x67\xc8\xf8\x47\x25\x09\xd0\x84\x63\xcf\xb5\x4d\x0c\xb5\x9f\x72\xca\x88\x29\x13\xa9\xa8\x2f\xe9\x7a\x38\xed\x93\x68\xd7\x54\xd7\x99\x28\x13\xc5\x43\xea\x04\xcb\xb6\x08\x3e\x76\x6e\x94\x3b\xac\x35\x93\xbd\x7f\xef\x74\xc8\xc6\xce\xd8\xbf\xae\xbe\xe1\xd7\xb6\x2a\x81\xd0\x60\xaf\x8c\xed\x3b\x9e\x74\x01\xf8\x31\x3c\x41\x63\x25\x2f\x1f\x3f\x40\x0a\xe9\x77\x86\x04\x12\x6a\x53\x23\xd9\x68\x29\xf8\x1d\x30\x25\x9c\x81\x9c\xb4\xdc\xcd\xf5\xa5\xc8\x34\x60\x3a\x08\x5d\x0a\xed\xe6\xa3\xfd\x1c\xea\xe5\x4a\x8e\x66\x6e\x2a\xa6\x94\x08\x6d\x21\x40\xf8\x09\x16\x85\xc6\x40\x60\x76\x86\xa5\x34\x4c\x90\x2e\xc7\x3e\xe7\x48\x29\xd1\x8f\x88\x08\x2a\x9f\x6b\xf1\xd1\x64\xa7\xab\xa3\x10\x62\x83\xc9\x21\xab\xbf\x95\xe5\x2c\x29\xbe\x4c\x19\x0d\xb0\xe5\xa5\xcf\x2e\x7c\x72\x37\x11\x89\x22\x97\x1d\xf1\xca\x8f\x57\x50\xa0\x34\x22\x82\xbb\x0d\x0f\x29\x8b\xda\xd9\x35\x40\xcc\x5f\xbd\x9a\x6e\x01\xa6\x91\xd0\xe0\xbb\xee\xee\x44\x66\x29\x40\x5e\x44\xfd\xb2\x2e\xea\x8b\x31\x19\xa8\x0c\x8a\xa6\x2f\xcc\xa7\x91\x4e\x81\x77\xa5\x09\x93\x1d\x57\x45\x53\x59\xa2\x84\xd9\x2a\x7f\x1a\x07\x56\x4e\xd9\x52\x9f\x3b\xe0\xca\xec\x1c\x4a\xe3\x54\x12\xc7\x22\xda\xd4\x4d\xd5\xd9\xaa\x94\x33\x9b\x16\x70\x98\xa8\x4e\x20\x63\x52\x48\x98\xbc\x3a\x9e\x4a\xcc\x05\x6f\x37\xcf\x8f\xb7\x87\xe0\xf0\xb4\x5d\xed\x16\xf7\xab\x21\x7d\xb7\x4c\xb9\x8c\xd1\x57\xc8\xcf\x8b\xfa\xd5\x85\x3e\xee\x50\x22\x42\x82\x9d\x46\xaf\x59\x31\xd6\x99\x96\x69\x4a\x68\x82\x94\xfb\x88\x7c\x6f\xa0\x82\xeb\x64\xdb\xff\x9f\x47\x90\x0a\xaa\x80\xfa\x9c\x4d\x9e\x3f\x95\x35\x12\xef\x7c\xb2\x18\x44\x18\x61\xf2\xfc\x5b\xd6\x7c\xbf\xc8\x21\x23\x80\x4c\x85\x0c\xd0\xf2\xae\xce\x43\x86\x1d\x99\xca\xd0\x92\x45\x59\xdb\x30\x49\x36\xa4\x52\x10\xd6\x09\x10\x38\xff\xbb\x17\x3e\x78\xb0\xc4\x62\xf3\x45\xc2\x54\x0a\x2e\x55\xd7\x4d\xb7\x50\x0a\x61\xa9\xa0\xbb\xa6\x80\xc9\x70\x09\x58\xa3\xdc\x8a\x6c\xd7\xa5\x0a\x52\xc5\x6d\x43\xb7\x72\x4c\x19\xf6\xe4\x53\x0f\x0d\x48\x95\x08\x90\x95\xf0\x41\x54\x99\x28\xc4\x0f\xb8\x02\x69\x5f\x57\xcc\x53\x25\xad\x62\x66\x71\x39\x2d\x5f\xb2\x73\xdd\x3e\x49\xff\xa3\x5a\x27\x51\xd0\xa3\xb7\xd7\x85\x29\x6f\x3e\x6c\x9b\xdd\xf8\x85\x6b\xd0\x61\xfc\x49\xbb\xf9\x7a\xb9\xf1\x15\xe5\x14\x02\xea\xbc\x36\x7f\xf7\x6b\x7d\x2f\xea\x66\xd1\x34\x70\x3a\x37\xa0\xf7\xe5\x0e\x9a\xa6\x0b\x15\x53\x50\xb6\x73\xca\x6a\xa4\x3d\x41\x55\x67\xa2\xa8\xf7\xa5\xc5\xc4\x4c\xee\x02\x8c\x32\x3e\x31\x7b\xa9\x9b\x52\x67\xa2\xb8\x2b\x2b\x68\x1d\x8d\xd1\x3b\x16\x24\x4e\x10\xde\x62\xb2\x73\x8d\xda\xe2\x35\x46\x71\x28\x8a\xee\x6b\x42\xbe\x2e\xe5\x4f\xe1\x3c\xc5\xfa\x45\x26\x9a\x41\x3d\x46\x10\x21\x2c\xdf\xd5\xaf\x3b\x80\x5d\xfb\x44\x03\xaf\x50\x10\x05\x91\x0b\x81\xee\xb3\xe2\xb5\xfd\xe8\xa3\xfc\xa2\x08\xa8\xe5\x0d\x45\xe2\xfb\xd6\x47\x1c\x4f\x3c\x11\x30\x89\xc9\x66\xd7\x2f\xf0\x49\x6e\x50\x04\x8e\x3b\xeb\x2e\xff\xf0\xef\x4e\xd0\x30\xd6\x56\xdf\x19\x4f\x5d\xed\xbf\x77\x47\x62\x4a\x9c\x80\xd1\x33\x06\x9c\xbf\x5d\x49\xff\x4b\x41\x05\xf5\x99\xcf\x27\x1b\x1e\x0d\x51\x0b\x82\x4a\x2b\x86\x70\x38\x42\x63\x23\xdd\xfa\x52\x9d\xf3\x2e\xea\x11\xd4\xc8\xd8\x56\x81\xdf\x9f\xca\x3c\x53\x1f\x9f\xe9\x00\x8e\xfe\x4d\xc6\x59\x11\xc1\x62\xc9\x6c\x03\x3e\xd2\x2f\x6c\x61\xfa\xe4\x61\x6b\xff\x86\xfc\x59\x4e\xe2\x7c\x3c\x37\x44\x28\x24\x42\x0b\x6c\x17\xb0\x7b\x8d\x4b\x04\xe7\xcf\xee\x2d\x22\xa2\xc6\xab\x4f\xf8\x85\xba\xb4\xd2\x76\x73\x80\x29\x11\x69\xb0\xee\x50\x7b\xdd\x1c\x65\xf1\x8f\xa8\x0c\xe2\x5f\x47\x04\x40\x7d\xd6\x39\x2b\xda\x9d\x0d\x0e\x60\x0c\xa8\x26\x33\xdd\x18\x13\x20\x5f\xd8\x7b\x9f\x25\x9b\xe4\x46\x44\x1c\x47\x81\xaf\xcf\x78\x49\x8d\xbd\xf8\x35\xcd\xa1\x88\x98\x87\x89\xea\x04\x4a\x5d\x7b\x61\x1b\x9d\xf6\x9d\x40\x22\x86\x28\xf0\x9f\x10\xc3\x82\x09\x3c\xa4\xf7\x85\xa6\x19\x03\xc1\x09\x4b\x5c\x0b\x1a\x14\xcd\xa5\x82\x9b\x4f\xba\xcc\xe6\xfe\x9d\xce\x34\x1e\x18\x94\x94\x72\xf1\x38\xee\x85\x47\x88\xfd\x6d\xf2\x30\x44\xa9\xb9\xa7\xb2\x86\x4c\x97\xc5\x3f\x2e\xa2\xeb\xee\x13\x9c\xa7\xf8\xca\x44\x75\xfa\xf8\x0e\x79\xa6\xca\x73\x03\x55\x3d\x93\x08\x12\x3c\xe5\x9c\xbb\xed\x3c\x50\x9d\x02\x93\x14\x5c\x05\x18\x98\x08\xad\x51\x3b\xf2\x6b\x22\xcb\xee\x24\xc5\x9d\xef\xb1\xae\x87\xac\x62\x52\x24\xa1\xc4\x42\xd5\xfd\x7f\xde\x77\x8d\x28\xb4\xa8\xf4\x70\xab\x11\x29\x89\x1d\xe8\xa1\xa3\xe3\x1f\x7c\xa0\xc1\x28\xac\x13\x7e\xcf\xaa\xf2\xe3\xf2\x9a\x0d\x1a\x00\x44\xca\x52\xab\x41\x75\x2c\xbb\x5a\x91\x48\x15\x60\x99\xde\x53\x16\xdc\xc2\xdb\xe0\x10\x56\x48\xeb\xf2\x04\x0b\x75\xed\x24\x89\x54\x4b\xeb\x19\xbf\x14\xe2\x08\xbb\x33\xa8\x4c\xe4\x77\x00\xfb\x81\x96\xe6\x9f\xbc\x90\x14\x94\x50\x7d\xfb\xcc\x8d\x28\x5e\xfb\xd9\x2f\x08\x60\x76\xf7\x1d\xe0\xd5\x77\x25\xfb\x43\x49\xaa\x1d\xf4\xe6\x26\xd3\x9f\xa8\x25\xb8\xb1\x52\x59\x16\x98\x27\x10\xed\xea\x15\x59\xf1\x67\x92\xb3\x52\x48\x2d\x11\xdf\xac\xb3\x5a\x4c\x00\x26\xe3\x8b\x2b\x96\x46\x41\x2f\x3a\x31\x4d\x96\x0b\xc5\x75\xa0\x3d\x29\xec\x27\xa5\x81\xcf\xfe\xc5\x76\x9c\xc9\xe5\x12\x3b\x73\x2d\x18\x6d\x10\xf8\x09\xa5\x42\xcf\xdf\x76\x33\x40\x8a\x08\x9d\xa4\x89\x2f\x93\x7f\xf4\x5c\x61\xee\x28\x44\x80\x8e\xb7\xb7\x56\x53\x8b\x00\xed\x2f\x5a\x7b\x6c\xb5\x93\x9e\x7c\x01\x41\x18\x92\x86\x62\xa0\x1e\x35\xb9\xb2\x09\x28\xea\xdd\x1d\xac\x07\x33\x40\x47\x5d\x17\x5f\x25\x01\x89\xfb\xc2\xc9\x91\xad\x96\x7d\xd1\x53\x06\x81\xe9\xe4\x60\x10\x26\x23\xb3\xc9\xd9\x81\x8a\xb0\x09\xf9\x8f\x9b\xe5\xe6\xe1\xe1\xf9\x71\xed\xe5\xdc\xa4\xa4\xb1\x26\xa4\x07\x69\xa2\x1e\x9c\x57\x9c\x72\x43\x58\x6a\x10\x2d\x85\x50\x6f\xa4\xc3\x9f\xcf\x5d\xca\x50\x5b\xcb\xb7\x79\x83\xaa\x06\x51\x6f\xa1\xb9\x54\x05\x40\xfd\x5c\xf4\xe9\x03\x19\x6a\x65\x79\x9e\xb1\x39\xf8\xa1\x2c\x9a\x97\x55\x07\xb5\x95\xa1\x21\x08\x1a\x7d\xbc\x0c\x17\xb7\x8c\x12\x85\x49\xbd\xae\x0d\xf8\x6e\x71\xbf\xdc\x3c\x76\x87\x75\xe4\xba\x8e\xac\x5e\x7b\xbd\x2f\xd7\xcb\xcd\xf8\x53\xc9\xc8\xc4\x58\x82\xfe\xf1\xfc\xb8\x5f\x8d\x4d\xc8\x9f\xba\x74\x32\xa6\x9c\x76\xb2\x77\xf5\xa8\x56\x22\xe3\x88\x63\x64\x65\x2a\x00\xfd\x33\x2b\x3e\x93\xbd\x91\x92\x27\x3c\x40\x9b\x6c\x0d\xd3\xa1\x86\xe6\x24\x7e\xdd\xc0\xc4\xa8\xca\x24\x65\x1e\xd8\xb4\x03\xd1\x78\x8a\xa2\xf1\x20\xc9\x23\x0f\x79\x70\x7b\xa8\x13\x31\x77\xc7\x15\x0b\x43\x07\xbd\xf8\x69\x6b\x5c\xbd\x93\x99\xf8\x31\x32\x44\x6f\xe6\x5b\x99\x15\x4d\xf9\x90\x1d\xab\x99\x60\x4f\xea\xd8\x22\x3c\xcf\x97\xfa\xe5\xfb\x90\xd3\xf8\x6f\x83\xf0\x7a\x02\xc0\x94\x5a\x5a\x26\xf2\x97\x4c\x6b\x18\xe1\xc8\xa5\x96\x06\x19\x6d\xda\xe7\xdf\x67\x3d\x18\x41\x02\xb5\x98\x13\xe9\x91\x58\xf3\x13\x0d\x78\x82\xa8\x83\x47\x78\xbf\xd9\x3c\x7d\x59\x14\x4d\x66\xf3\xae\x12\xb4\xc1\xf9\x84\x39\xb7\xbf\xc6\x98\x28\xa5\x09\x02\xcc\xfc\xdd\xec\x97\xcb\xc1\xbe\x21\x4d\xca\x04\xf1\x70\x82\x46\x64\x5d\x51\x5d\x1a\x11\xa2\xa3\xaa\xe1\x9a\xd4\x48\x4a\x03\x09\x23\x5d\x01\x12\xef\xe2\x3b\x96\xa9\xdc\xe9\x8a\x10\x89\x16\xe4\xdb\x62\xb9\xec\xfe\xc6\xac\x0e\xf4\xb7\xe5\x9d\x2a\xb3\xe2\xee\x2b\x2b\xad\x48\x2a\x11\x8b\x77\xb2\x10\x97\xd6\x1b\x47\x7c\x45\xbf\xba\x15\x0b\xb5\xa5\x0e\xa8\x9a\xac\x6e\xea\x45\xd5\xbc\x97\xd5\xab\x1d\x32\xba\x5d\xc5\x34\x01\x83\xd3\xbc\xfc\x1f\x14\x0e\xba\xba\x07\x71\x1a\xd5\x01\x54\x48\x28\x46\xce\x36\xc1\x76\x2b\xaa\xd7\xa2\xd4\x80\x5c\x7b\xb3\x3b\x44\xbb\xf9\x44\x8e\x63\xac\xd3\x7c\xba\x34\x2f\x65\x95\xfd\x4f\xcc\x34\xfb\xaa\x30\x4c\xd1\x70\xde\x65\x55\xdd\x4c\xa2\x64\x15\x72\x88\x3a\xe1\xb1\xfb\x6c\x66\x80\x49\xd1\xc7\xf2\x98\xd2\x9b\xfd\xf2\x4b\xa0\xa3\x8a\x98\xc2\x4a\xe8\xa2\x12\xb5\x12\xed\x3b\xff\xf2\x95\x47\x5a\x62\x94\xdc\x06\xb3\x75\xb3\xa8\x07\x34\xa6\x52\xc5\x8a\x60\x2c\x65\xf0\xd6\x5f\xb2\xf3\xb0\xa2\xa1\x62\x4d\x10\xe1\x7d\xdd\xa1\xdd\x3a\xe9\xbb\xec\x58\x88\xd6\x29\x1c\x0b\x98\x24\x43\xa4\x9f\xbb\x10\x17\x56\x26\xdf\x20\xd0\x06\xf4\x7d\x89\xa0\x2b\xff\x3b\x09\x89\x00\x3a\x44\x8a\x43\x2b\x0d\x0b\xed\x56\x88\x1d\x19\xcd\x26\xfb\x9d\x4a\x88\x55\x85\xbf\x13\xaf\xf0\x08\xef\xa3\x68\x5f\xa5\xa1\xd4\x0e\x77\x60\x31\x3e\x9d\x9c\xdd\xf8\x22\x69\x68\xd0\x6b\xb7\x37\xd0\xb3\x33\x4d\x87\xa5\x04\xa3\x34\xb7\x43\x8e\x69\xa4\xfd\x18\x15\x93\xa0\x07\x8c\x2d\x2c\x39\xdf\xa0\x30\x78\x95\xc0\x57\x22\x96\x02\x17\x85\x68\xc3\xf2\xe2\xba\x19\x57\x49\x45\x26\x1a\x79\x93\x5f\x55\x8c\x73\xab\x11\xf3\xf0\x61\x67\xbf\xed\x6e\x38\xec\xa0\xdb\xca\x94\x52\x54\x06\xbe\x53\xb0\xcc\xef\x82\x36\x2a\xbc\x0b\x76\x4d\x75\x47\xd7\x45\x63\xd8\x6f\x23\x91\x4e\x37\x99\x46\x37\x02\x52\x5b\xbe\x2c\xc8\xe1\x28\x1a\xd0\xdb\x6b\xe1\x35\xa9\x40\xd9\x8e\xed\x76\xff\x99\x27\x2a\xf3\x03\x8d\x05\x49\xfe\x14\xc5\xb1\xfd\xcf\x72\x66\x32\x5f\xef\x7d\xca\x04\x11\x56\x68\x9e\x1f\x91\xb1\x65\xbf\x5a\x3c\x78\xe2\x51\xa9\x8c\x20\x03\xa1\x5c\x84\xe5\x4f\x0a\x5f\x53\xf3\xdc\xfb\x64\x9a\xc4\xca\xea\xba\x87\x74\xd4\xf2\xaf\x89\x8a\xf0\xaa\x48\x63\xfa\x17\xf0\xd9\xfe\x34\xe0\x58\xe3\xd8\x42\x76\x92\x97\xaa\x2b\xb2\xeb\x20\x0a\x90\x42\xc0\x36\x8c\xba\xfd\xb4\xee\x8e\x6a\x83\xcd\x6c\x58\x07\x1e\x5a\x47\x1d\x80\xc4\x92\x85\xc6\xb6\x07\xec\xbb\x18\x59\x3b\x4d\x69\x88\x41\xbf\xe5\x41\xde\x8a\xff\x74\x07\xb8\xe5\x26\xb7\x74\x1d\xdf\x26\x41\x5c\xe2\x47\x69\x69\x05\xb9\x2a\x78\xcb\xca\x4b\x7d\xeb\x3e\xf4\x64\xd9\x69\x96\xda\xab\x21\x3b\xfe\xb5\x70\x93\xd4\x4c\x45\x98\x30\xcf\xc1\x34\x09\x9b\x1e\x74\x8e\x19\x96\xe0\xea\xe6\x4a\xce\x68\xbc\x40\x74\x48\x2d\x8d\xab\x14\x35\x58\x36\xd9\x43\x56\x1f\x6a\x80\x4e\xcb\xa1\x1d\x03\xc4\xcc\x37\xf7\x74\x43\xc0\x1a\x3b\xf5\xf2\x8a\xfd\x5b\x7a\xe2\x5b\xeb\x28\x14\xb1\xf7\xbc\x1d\x50\xea\x93\xc8\x58\x47\xa9\xd5\x0d\x59\xed\xef\x87\x16\x47\xc7\xb1\x65\xcf\xab\x5d\x40\x5e\x4e\x29\x83\xa5\x8e\x35\xe7\xe0\xd3\xc7\x65\xa5\xb3\xe2\x8a\xb9\x56\xea\xd8\x68\xf4\x83\x6c\x49\x60\x59\x56\x9f\xf8\xb8\x9a\x13\x8e\xc2\x8a\x87\xc3\xc1\x52\x29\xfe\xfa\x98\xc1\xc5\x6a\x2e\x93\x88\x0d\x7c\x72\x1b\x8f\x5a\x96\xfe\xc9\x05\x55\x84\xb6\x06\xb9\x20\xf7\x3e\xa7\xa7\xb9\x26\xb8\x4d\xd9\x42\xe5\xf7\xcd\xed\xfd\x81\x3d\xf8\x83\x49\x60\x05\xa5\xf2\xf2\x78\x1c\x33\xc7\x49\x9d\x12\x8a\x4d\xce\x87\x3e\xcf\xef\x18\xc6\x3d\xc4\xf8\x53\x14\x99\xbf\x42\x24\x9c\x1c\x51\xeb\x94\x7c\x32\x55\xa6\xe7\xa8\x98\x46\x53\x90\xe3\x93\xc8\xdb\x7d\x67\xf2\x6a\x52\x65\xd9\xa2\xde\xa0\xd0\x3e\xa3\xa7\x45\xdc\xc1\x90\x91\x85\x74\xba\x42\x85\x11\x26\x1d\xe7\x8d\x16\xcd\x4c\xce\x54\x4b\x4e\xb0\x14\xf2\x63\xfb\xd3\x37\xa6\xb7\x4b\x0c\x01\x61\xb9\x68\xdd\x01\xc7\x89\xdc\xfb\xba\x6e\x94\x22\x0c\xf1\x20\x05\x34\x6d\x88\xe5\xfd\x86\xda\x72\x32\x7f\xbe\x5a\x54\x14\x53\xd1\xa9\x9a\xd8\x32\xc3\x20\xee\xd4\x9a\xa5\x89\x65\x35\xe1\x63\x1b\xa7\x79\x82\x22\x1a\x1d\x13\xa9\xbf\x13\x9d\x44\x18\x4f\xe0\x9e\xb8\xc0\xb6\x11\xb8\x2a\xfa\xfb\xb1\x22\x88\x2c\x2a\x68\x5f\x5d\xda\xe0\xd1\xdf\xf7\x6c\x11\x48\x43\xc8\xed\xf6\xbd\x5a\x1d\xb6\x8b\xc7\x6f\x1e\xe9\xa8\x21\x92\xb6\x83\x51\x9c\xc0\x29\x25\xfb\x23\x89\xd0\xed\x91\xf3\x55\x13\xb0\x86\x44\x73\x2b\x44\x51\x5c\x44\xee\x89\xe8\xf7\x7d\x88\xd4\xdf\x27\x80\x42\xb7\xb5\x9d\x53\xd9\x09\x9e\x2a\x14\xa0\x77\x07\x0d\x61\x3c\xe9\xfb\x38\x5e\xb2\x5c\x57\x50\x8c\x71\x2b\xda\x84\x11\x76\xa8\xfc\x5f\x59\xa2\xd4\xec\xd0\x0e\x00\x21\x16\xae\x56\x59\xaf\x0e\xd3\x95\xd8\x06\x28\x4e\x30\xce\xfd\x02\x09\x6d\x4e\xb1\xfd\x44\x77\x97\x42\xf5\xa4\x1e\x83\x9d\x09\x48\x44\x2c\x3d\x4c\x79\x3c\xe6\x70\x55\x46\x06\x92\x32\xe4\x52\xb2\x9a\xaf\x96\xf7\x37\x2b\xf5\xed\xc5\x4e\x2a\x27\x78\xef\x7f\x93\x82\xe5\x6a\x14\x5a\x0f\x82\xbd\x49\x80\x32\xb8\x3a\x63\xa1\x49\xba\x46\xdb\xbb\x4b\x6e\xb2\x3c\xb7\x4d\x77\xa3\xd7\x0a\x2c\xb4\x0d\xe5\xa7\xac\xb8\xb9\x7c\x6c\x45\x03\xeb\xe2\xa9\x02\x95\x0d\x0a\xf6\xc0\xa2\x30\x75\xec\x60\x3f\x01\x01\x51\xfe\x40\x62\x1c\x31\x5d\xb1\xaa\x95\x38\xc3\xbe\xf4\x05\xd3\xc1\x1d\xfa\x2f\x00\x4c\x4a\x4c\x85\xed\x77\x7b\x24\x96\xfa\x5f\x9f\xec\x00\x06\x56\x3b\xfd\x80\xcb\xe0\x3c\xdb\xd7\x01\x61\xc0\xb0\x27\xcf\x71\x51\x8f\x65\x41\x86\x4d\x23\x3e\x89\x09\x61\x24\x31\x86\xbd\x14\x59\xf3\x74\xbf\xd8\x2f\x07\x08\x73\x37\x24\x52\x40\x7a\x5a\xc5\x91\x31\x1e\xaf\x54\x88\x74\xc2\x61\xd0\x71\xe3\x70\xe6\xdd\xa6\x06\x71\x64\xe9\xee\x4c\x56\xe8\x4d\xae\x3b\x12\x7b\x09\xb1\x48\xa5\xd5\x93\x40\xc9\xcc\xc3\x30\x41\x02\x3c\x0d\x30\xb3\x64\x97\xea\xc1\xa9\x9a\xf9\xa3\x49\x9a\x22\x5c\xe2\x5b\x1b\xda\x15\x57\x33\x37\xd1\x42\x7a\xc8\x3a\x6e\x5f\x77\x65\x35\x60\xf3\x19\x2f\x77\x48\xa5\x25\x71\x3a\x38\x29\x03\x57\x85\x40\x9f\xa5\xfa\x93\x26\x00\x10\x22\x41\x5f\xc5\x3a\x91\xbb\x21\x49\xca\xac\x55\x07\x21\x00\x8b\x15\x4e\xca\x06\xf4\xe2\x58\x01\xf6\xd8\x2e\x2d\x44\xde\x67\x49\x41\xa8\x54\x75\x12\x76\xc6\x46\x35\x9f\x5c\x13\x24\x72\xe7\x9d\x2e\x55\x1f\xe9\x82\x4c\x2c\x9c\xbe\x29\x2f\x28\xf4\x56\x4c\xe3\x36\x90\xca\x92\x49\x7b\xda\x22\x1b\x22\xce\xd5\xf7\x41\x85\x1c\xdb\xa7\x11\xbb\x74\x2e\xcb\x1c\x09\x7e\x50\x57\xaf\x67\xd5\x02\x15\x05\xae\x80\x88\x91\xc3\x16\x34\x9c\xce\xd7\xc9\x0f\x50\xb1\x41\xde\xee\x63\xdf\x0c\x04\x2a\x0d\xf0\x6f\x27\xf1\x6b\x3b\xa2\x63\xf3\xc7\x21\xb5\x1a\x5e\xb2\xac\x1a\xaf\x7d\x7f\xfd\x41\x80\x4b\x8c\x7c\x8f\x99\x69\xd6\xd8\xb6\xec\x7f\x00\x94\x0c\xb1\x96\x24\x0c\xf8\xa0\xf8\xe6\xe3\xaa\x33\x6f\xfe\x15\x03\x70\x5c\x66\x59\x6d\x8d\x92\x95\x2c\x98\xdc\xa2\x21\x56\xa4\x03\x89\x73\x2c\x19\xdc\x5f\x2a\x1a\x83\x49\x23\x6e\xf3\xfa\x9e\x3e\xce\x90\x08\xf0\x85\x7f\x13\xf5\x7d\x79\xfc\x04\xf8\xe6\xc7\x0a\x0d\x2e\x2a\xb2\x2d\xfb\x13\x01\x2a\x69\x88\xe1\x28\xd5\x28\x2f\x59\xae\x37\x97\x09\x53\x9a\x09\x92\xd0\x93\x2f\xda\x6c\xb8\x15\x04\xdf\xc2\x7f\xbb\x11\x22\x44\x9a\x92\x97\x32\xff\xb0\x65\xea\xbb\x4b\xa1\xc7\xec\x16\x26\x30\x16\x8e\x78\x29\x26\xf9\x6b\x77\x9c\x52\xed\xe0\xb6\xf5\x05\x1c\x9b\xed\x5f\xe0\x15\x33\x94\xc5\xe8\x3c\x67\xb5\xf3\x61\xc6\xe8\x74\x43\xb5\x8e\xc5\x84\xaa\x6c\x28\xf3\xff\x19\xa8\x68\xfc\x2b\x2c\x22\xe8\x2f\xe1\xe9\x37\x37\x98\xb6\xf5\xbf\xc0\x54\x92\x68\x5f\x13\x3b\x16\xa0\xb1\x16\xab\x56\x85\xfa\x01\x93\x14\x94\x09\x49\x24\x6d\x9f\x62\x21\x5e\xfb\x2d\xc3\x84\xd4\xb6\x1f\x2c\x45\xfd\xf2\x54\x66\x45\x53\x07\xdd\xa1\x50\xf8\x60\x62\xe3\xd8\xcb\xbe\x89\xc9\xbe\x64\xa2\x88\x62\x3b\xff\x4b\xd6\x19\x42\x13\xc5\x81\x81\x91\x72\xbe\xd0\x1d\xbf\xe6\xc1\x94\xd5\x61\x31\xb9\xbb\x28\x91\x6c\x48\x1d\x31\xa9\x21\xb9\x51\x71\xca\xb0\xad\xe1\xee\x92\x03\xfc\x1a\x1a\x57\xc3\x93\x44\xc7\x8e\x79\x75\xb6\x88\xf6\x09\x6c\xdc\xf0\x34\x21\xa6\x43\x7c\x67\x45\x7d\xdd\xa0\x32\x7a\x5e\x2e\x05\x1a\x79\x04\xfb\xac\x7e\x9d\xf3\xb2\x82\x2b\x25\x58\x69\x38\xa4\x18\xa9\xaf\x7e\x89\xe7\x9d\x47\xf9\x9b\x84\x70\xce\x3a\xea\x99\x6d\x59\x4e\xd2\x0d\x26\xa1\x1a\xcb\xb5\x3f\xcb\x2a\xd7\x3f\x33\x3d\x90\xd8\x96\x26\x0d\x12\xdf\xf9\x88\x45\xff\x8b\x76\x2d\x75\xe3\x6b\xa4\xa1\xc2\x75\xf7\x2d\x17\x99\x9e\xbc\xa6\x54\x0b\xe9\x40\x60\x37\xd0\x34\x7d\x0e\xd9\xa4\x5a\x21\xdb\x58\xbb\x79\xf5\x62\x03\xd2\x88\x30\x45\x04\x41\xa6\xca\xb1\xfe\x50\x7b\x48\x72\xd3\xdb\xd5\x7a\x18\x4f\x1b\xc1\x39\x52\x2f\xbf\x89\x4b\xde\xfd\x51\xf2\x18\xcb\x13\xdf\x9e\x17\xab\x3f\xbe\x4a\xae\x19\xc9\xb9\x76\x25\xf6\x45\xf5\xdf\x4b\xf6\x56\x0e\x09\xc3\x10\x1c\x8a\x8d\xe3\x08\xca\x3c\xf8\x3b\x73\x9c\x34\x93\x6f\x21\x13\x69\x79\x1a\xac\x33\x92\x15\x1d\x6b\x95\x1f\x20\x63\x04\xd4\xdf\x2c\x76\xab\xc3\xf2\xfe\xe6\xb0\xdf\x1c\x56\xfb\xef\xa8\xcd\xef\xc7\xa8\x20\xc6\x38\xef\x8f\x9b\x51\x5c\x6a\x74\xa0\x85\xab\x4b\xff\x00\xa5\xc4\x2b\x8d\xe2\xe7\xec\xb3\x4e\x20\xa3\xc3\x08\x89\x2e\x9e\xb6\xab\x03\x02\x86\xb0\xce\xd1\x25\x59\x8c\x4e\x09\x82\xdf\x6d\x42\xef\xe6\x52\x15\x59\x71\x44\x2a\xb6\xc1\x8e\x66\x0c\xa7\xd8\x78\xf1\xbd\xd4\xb2\x9c\x76\x7c\x18\xa4\x90\xf0\xec\x98\x59\x53\x23\x65\xd6\x9d\xc8\x72\x0c\xa3\x36\x1b\xc7\xba\xa1\x08\xa1\x96\xb0\xc5\x52\x90\xfa\xe2\x85\x22\xc4\xb1\x1e\x3c\x6c\x6e\xd7\xcb\xcd\xfa\xd1\xff\x3d\x08\x22\x6c\x6e\xb4\x49\xcd\xf6\x67\x1d\x83\xdf\x6d\x57\x8f\x54\x24\xe0\x21\x6e\x37\x1d\x35\xab\xe5\x6a\x5d\xfd\x82\x4a\x61\x5f\xeb\x9c\xbd\x6b\x97\xa5\x77\x8a\x15\x09\x12\x45\x6c\xb4\xf1\x0a\xd6\xa4\x75\x17\x4f\x13\xdf\x59\x8c\x60\x8f\x99\x9c\x9d\x22\x81\x90\x16\x59\x8f\x13\xaa\xe7\xf4\xbb\x9e\x67\x8a\x04\x0a\x12\x36\x68\x83\xc0\xfa\x4a\xfd\x27\x4a\xfd\xfe\x5c\x6d\xa4\x2f\xd5\x3d\x9f\x9b\x72\xd6\x0f\x52\x84\xc6\x14\xda\xb9\xba\x3c\xe3\xa3\x7c\xeb\xbc\x0b\x45\xa8\xb2\x48\x5d\x51\xd7\x50\x35\xab\x5f\x67\x50\x8d\xcb\x84\xbb\x11\x2c\x0c\x6d\xd2\x3e\xcf\xc7\x5c\xa3\xed\x21\xe9\x1b\x6e\x9f\xca\x32\x1f\x96\x84\x14\x61\xb1\xc6\x4f\xb5\x5b\x2d\x9f\xb7\x5d\x15\x50\x11\xc6\x39\xb6\x38\xba\x5f\xfc\x2f\x73\xfd\x52\x2c\x70\x76\x31\xf0\x03\x15\x07\xd5\xbf\x69\x28\x74\xf0\xdb\xf8\xb9\x98\xb1\x0c\xaa\x0f\x42\xdd\x94\xe5\xeb\x90\x81\x56\x91\x90\xd9\x8a\x07\xf2\x72\x63\xa1\xa1\xc3\xf9\xb5\x07\x95\x70\x95\xe0\xa7\x4b\x9e\xb7\x6e\x74\xc7\xea\xac\x48\xc8\x39\x26\xb8\xb6\xfb\xee\x2f\x82\xe2\xbd\x1c\x8e\xed\x4e\x94\x1d\x33\xdf\x6b\x38\xd4\x03\x98\x13\xea\x54\x24\x54\x56\x84\xf3\x2c\xaa\xa6\x80\x8e\xe7\x63\xdc\xe6\xf6\x09\xed\x7a\x7b\xb6\x35\x0c\x58\x10\x5d\xd4\x3b\xa1\x90\x5a\x0d\x35\x57\x90\x8b\x6c\x32\xf3\x22\x11\x1b\xe5\xd9\x81\xca\x73\x0e\x56\x9d\xf4\x61\x9e\x05\x5c\x91\x98\x58\x8e\x42\x5b\x41\x41\xbb\xd2\x61\xb0\xff\x8a\x8f\xa6\x48\x1c\xc5\xca\xf1\x2b\xeb\x71\x1b\xa6\x1f\x20\x12\xde\x67\x6d\x17\xe7\xf3\xd4\x69\x1b\xbd\xae\x58\x53\xcc\x98\xd7\x97\xa2\xca\xea\xee\x93\xf0\x44\x62\x66\xe0\xdb\xed\x72\xa1\x14\x89\xfc\xdf\x13\x62\xe9\x3c\x25\x34\x87\x87\xde\x4e\xa4\x81\x44\x58\xe6\x43\x36\xd0\x93\x54\x24\x35\x4e\xe9\x09\x85\x65\xe7\x20\xcf\x33\x95\xb9\x11\xbd\xc1\xb8\xfc\xa1\x88\x60\x29\x6e\x67\x59\xed\xb4\xef\x66\x01\x8d\x8a\x28\x16\xc6\xb8\x04\xab\x8f\x73\x53\xb6\x3e\xde\x6f\xdd\x91\x04\x4b\x4c\xb7\x75\xa9\x32\x8f\x05\x51\x44\x45\x96\xf8\x08\xb5\x27\xf2\xfc\xa9\xa9\xfa\x23\x21\x7a\x75\x4d\xbf\x09\x28\xa2\x49\x60\x51\x68\xe8\xa0\x0e\xf3\xc6\x8a\x68\x05\x48\xd7\xb3\xd8\xdf\x4f\x66\x0b\x30\x9d\x92\x8e\x43\xf7\xb5\x7b\xdb\x10\x5a\xe2\xa6\xc3\xe1\xb0\xc8\xf3\x51\xe3\xb3\x22\x10\xdb\x3a\x6e\xaf\xe0\xf2\x4d\xb4\x5e\xa5\xf7\xd0\x26\x8b\x14\x78\x88\x85\x9a\xfa\xe5\xd2\xe8\xf2\xbd\xbb\x63\x10\x36\x6d\x79\xae\x4a\x05\x35\x32\x77\xac\xf7\xdf\x3e\xb1\x60\x86\xa5\x58\x12\x6f\xbf\x96\x85\xd9\x18\x78\xe8\x57\x6c\x40\x88\x63\xd4\x2b\x86\xde\x86\x0a\x48\x1c\x61\x51\x54\xa8\xe6\x22\xf2\x83\xc1\x52\x6f\x77\x30\xb1\xb2\xfe\xcb\x3f\x06\x73\x24\x20\x89\xed\x4b\xf9\x26\x4e\x32\x87\xea\x69\x5e\x90\x5f\x05\x44\x87\xda\x95\xc4\xef\x00\x3a\x9d\xb0\x9b\x8f\xf5\x38\xfc\x51\x41\x60\x78\xa0\xfc\x0b\x9b\xaa\xdc\xce\x23\xbb\x83\xee\x5f\x77\x0d\x4a\x93\x94\x76\x8d\x83\x9b\x33\x14\x0e\x05\x34\x81\x3a\x0d\xd7\x52\x40\x95\x8b\x6e\xf2\x52\xbd\xda\x74\x67\x3d\x21\x50\x57\x01\xd5\x06\xfb\xac\xde\x21\xbb\x85\x3c\x7b\x83\x8e\x26\x5b\x05\x2c\x0c\x31\xc0\xf8\x0e\x22\x6f\x5e\x5c\x3f\xe2\x5f\x83\x31\xa8\x80\xc5\x29\xb6\x95\xac\xbc\x24\x7d\xa7\x71\x9a\x5b\x88\xf3\xe0\x77\x04\xb7\x53\xda\xe1\xb4\x17\x5a\x3b\xd8\x27\x26\xe8\x1e\xcb\x66\x5d\x3c\x77\xc6\x20\x08\x29\x43\x8f\xf9\x1d\x32\x0a\x97\xca\x0a\x9c\x4f\x1e\x2b\x64\x86\xda\x6a\x8a\xa9\xca\x7a\x28\xb2\xa2\x82\x50\x58\x8a\x84\xe5\xfe\x66\x34\x5b\x42\xd0\xbc\xef\xd7\x98\x73\xe5\x54\x10\x71\x19\x38\xa2\xd8\x4d\x75\x14\x45\x27\x22\x35\x19\xa6\x15\x58\xcf\xb4\x1e\x92\x06\xaa\x80\x07\x56\x08\x10\x55\xae\xba\x8e\xc1\xfe\xc4\xd6\x3f\x55\x5e\xf3\xdd\x3a\xb4\x37\x1f\x57\x28\x1d\x15\x70\x2e\x1d\x1d\x30\x3a\xa8\x95\xef\xf5\x50\x01\x4f\x0c\x26\x89\x1f\x4a\xd7\x76\x69\x9b\x7d\x3e\xf7\x75\x55\xc0\x15\x60\xed\xfe\x49\x14\xcd\x0b\x54\x6a\xb0\x1c\xb8\xa6\xc2\x4d\x5e\xff\xa8\xab\xf6\xb6\xaf\x8b\xa8\x2a\x48\x42\x63\x1c\x50\xff\xe9\x05\x8a\xf2\x04\x45\x39\x05\x3b\x0c\xe7\x8b\x3b\x2d\x25\x34\xee\x80\x9a\x0d\x54\x6f\x22\x6f\xed\xc9\xcf\xac\xd0\x8e\x39\xf8\x2b\x60\xd6\xe8\x0e\x52\xa2\x63\x9b\x58\x7f\x7f\xb6\x02\xce\x53\x3e\x7c\x15\xa4\xd4\x48\xd2\x49\xbc\x67\xa7\xcb\xa9\x9f\x98\x93\x07\x4a\x63\x65\xbc\xb6\x47\x39\xa6\x80\x57\x81\x08\x02\x14\x0f\x72\x1c\xdc\xf7\xd9\x7f\x2f\x99\x5e\x17\xb7\xd0\x19\xf1\x40\x04\xa1\x35\x5b\x1a\x5f\xd7\xf7\xf2\xd2\x9f\xcd\xac\xb4\x9a\x06\xeb\xf6\xe1\x97\x42\x6e\xa3\x59\x0b\x18\x08\x6d\xd0\x51\xb3\xc0\xeb\xbf\x44\xc7\xa5\x02\x99\xd8\xfe\xcd\x2a\x53\x2f\x50\x37\x96\x6a\xd1\xdf\x81\x4c\xa9\x63\xf0\x7f\x17\x95\xc6\xb4\x73\xd6\x7c\x74\xf8\x28\x15\x28\x12\xc8\x21\xdb\x4c\xeb\xe1\x3f\x89\x4a\x9c\xae\x99\x36\xc7\x3f\xab\x68\xe0\x29\x61\xbf\x97\x63\xd6\x85\xc9\x2c\x56\x8c\xa2\x10\x8d\xb9\x14\x5a\x54\x99\xc0\x6c\xde\xdd\xa5\xd0\x63\x1f\x22\x50\x11\x45\x39\x45\x0b\x2e\x6c\xcd\x5f\xdf\x52\xe9\x02\x69\x15\xa8\x34\xa6\x03\xa4\xf5\xa6\xea\xc2\xc5\xf1\x8f\x6a\x61\x37\xd0\xb3\xa8\x50\x10\x0c\xba\xa7\x5b\xe4\xdd\xa7\x6b\x5f\x77\xc7\xf7\x77\x2b\x1a\x11\xb4\x2e\xd7\x94\xd4\x46\x05\x10\x08\xe4\x62\x79\x84\xc6\x8c\x37\xca\x00\xa8\x82\xb4\x07\xdf\x5b\x3b\x30\xb5\x53\x20\xed\xf6\xe8\xd1\xcf\x4f\x65\xde\xad\x64\xd0\x21\x12\x24\x3a\x02\xfb\xb1\x21\x31\x54\xe0\x3e\xb5\xd0\xfa\xcb\xb5\x6d\xa8\x45\xf6\xdb\x1e\xc2\xf2\xdd\x3b\xa0\x3d\xa3\xf3\x60\x6d\x98\x48\x61\xfa\xfe\x0c\x55\x5d\x16\x22\xdf\xc1\xf1\x04\x45\x33\x78\xec\x69\x53\x58\x77\x22\x44\xcc\x9b\xa3\x7d\x76\xc2\x2a\xed\xef\x22\xbf\xc0\xe4\xe5\x1b\x1e\x63\x25\xea\x90\xd5\x37\xa5\xa8\xf4\x0c\xd2\x42\x51\x42\x04\xc6\x8f\x6d\x5c\x83\x94\x5e\xee\x82\x9f\x4d\x7b\x7f\x5a\x10\x74\x58\xaf\xeb\x4a\xa9\xa2\x24\xb4\x92\x42\x58\x04\x7e\x47\x44\xde\xbd\xa8\x9b\x8d\x17\x0b\x51\x94\x70\x65\xf9\x04\x30\x99\xb9\x98\x18\x67\x1a\x18\xe1\x79\xb4\xec\xc7\xb8\xf9\xb0\xed\xad\xea\x63\x32\x92\xb2\x30\xb0\x50\xde\x41\x11\x66\x44\x99\x75\xf5\xbf\xfc\x99\x51\x18\xa9\x4e\x22\x7b\xbd\xdc\xdc\x21\xa7\xdf\x30\xb7\xa1\x28\x15\x16\x3e\xec\x66\xc6\xba\xae\x2f\x83\x99\x47\xa9\x26\x60\xdf\xdf\xb1\x12\x7f\x22\x6d\xae\x28\x0b\xe3\x58\xf7\x82\x34\x5a\x78\xb1\x0e\x45\x59\x64\xb0\xa7\xa6\xc9\x4e\xf0\x53\x64\xcd\xe2\x7c\xce\x3f\xc2\x2d\x68\x80\xd3\xe4\xe5\xb2\x38\x48\x1c\xb4\x0a\xfb\xe9\xf9\x68\x9d\x50\x66\x22\xe9\x71\x2e\xf6\xbc\x9b\x8f\xf5\xed\xe4\xad\x85\x89\xe5\x9d\xdb\x7a\x9d\xe0\xd6\xc5\x1b\x4d\x34\x1a\x42\x84\x20\x58\x29\xf4\x11\xf6\x3d\xfe\xda\xdf\x71\x44\x23\x2f\x0b\x31\xc7\x12\xd5\x0e\x90\x88\x30\x69\x43\xb9\x1b\xd7\x07\xdc\x9d\xcc\xa5\x70\x04\x45\x1a\xaa\x7e\x5b\x40\x3c\x54\x3e\x5f\x95\x55\x34\x4a\x42\xac\x47\x99\x2c\xcf\x37\x95\x63\xb8\x18\x0f\x89\x49\x82\x35\xc3\x1f\x87\xf5\xe3\x7a\xbf\x5e\xdc\x8f\x48\x5d\x15\x8d\x83\xc8\x3b\x93\x56\x6b\xb0\x47\x72\x29\x1a\xb3\x10\x63\x0c\x25\xf2\xfc\x79\x7b\x3f\xbb\xa1\xfa\xa1\x3a\xc2\x15\xd0\x64\x67\x0b\xc3\xeb\xae\x61\x80\xb8\x54\xb8\xb0\xdc\x1e\x56\xb1\xb3\xba\xc6\x09\x28\xca\x41\x24\xac\xd7\x17\x1b\xd9\x1d\x9a\x04\x34\xe8\x3a\xf6\xd7\x85\x29\xab\xd3\x35\x8e\x53\xd1\x24\xd4\x58\x00\x02\x51\xe5\x1f\x37\x42\xbd\xc2\x04\xcf\xac\x68\x22\xed\x62\xab\x1b\x61\xcc\xb8\x06\xa3\xa8\x4c\x2c\x1a\xa6\x9d\xe1\x43\xf2\x88\xf1\x25\x64\xa2\x50\x60\xe2\xbf\x97\xac\x3f\x53\x73\x01\x6e\x95\x37\x25\x76\x04\xd9\x2d\x68\x96\xba\xce\x9d\xa4\x02\xad\x5d\x5a\x67\xdd\xc0\x69\xe1\x1b\x92\x7f\xbb\xaa\x98\x2a\xaa\x18\x78\xd9\xd9\x75\x03\xc3\xca\xbe\xa2\x9a\x5a\xf1\x83\xdd\x09\x95\x6c\x3d\xf9\x7e\x77\x38\x0e\x81\x75\x15\x38\x84\x6a\x5f\xf5\x34\x2b\xaa\x8d\xa5\x06\xf0\x7b\xc2\x7a\xb9\xe9\xa4\x04\x15\x85\x48\xa2\x07\x89\x8c\xbb\x1b\x84\x71\x8e\xee\x72\x32\x3b\x41\x24\x56\x66\xcf\x12\x3d\x8e\x3f\xa6\x89\x20\xe6\x8e\xfa\xe7\x0d\xaa\x0f\x4f\x4c\x61\x0f\x33\x42\xec\x74\x72\x41\xe8\x1d\x4c\x56\x23\x23\x0c\x4c\x30\x10\x83\x29\xfb\xd6\x2f\xc5\x48\xc2\xcd\x90\x55\x79\x91\xe7\xd4\x1f\x0b\xb8\xc2\x0c\x59\x3b\xd7\x91\x7d\xba\xcf\xdf\x31\x4a\x35\x77\x2c\x56\x79\x0e\xc5\xb1\x9d\x39\xe3\x9f\xa5\x61\x1c\xda\xf8\xd4\x26\x15\x1e\xe1\x7d\x96\x5d\xff\x2f\x65\x30\x18\x8d\xc0\xb3\xdb\xb4\xdf\x7e\xae\x41\x4e\x31\x9a\x38\x7a\x59\x68\x6e\xe1\x58\x01\xcc\x61\x42\x5a\x77\xc6\x32\x29\x3c\x58\x61\xad\xe1\xc7\x67\x2c\x00\x39\x24\xe2\x85\x4a\x51\xf2\x75\x86\x8f\xb1\x10\x12\xd5\x0b\x07\xcf\x55\x10\x14\x63\x91\x44\x3e\xad\x4d\x75\x82\x65\xd7\x16\xa3\x18\xe3\x26\x12\x7d\x43\xc7\x52\xf8\xef\xce\x42\x9a\x86\xf6\xbb\x17\xf0\x7e\x07\x88\xf5\x9c\x84\xad\x2c\x94\x29\x4e\xf3\xfd\x66\xbf\xb8\xb7\x6d\xa5\xce\x6a\x1d\xba\x4e\x34\xc5\xe2\x58\x50\x2b\x23\xb7\xff\xbf\x55\xf7\x47\xa5\x52\xdf\x68\x51\x96\xf9\x77\xa8\xca\x91\xab\xc6\x62\x08\x22\x4f\xc1\x3c\xda\x27\x18\x77\xf9\x55\x69\x21\x06\xfe\x8a\x09\xd1\x48\x16\x23\xb4\x46\x1f\x71\x0c\xfc\x98\xbc\xb4\x24\x94\x7c\x40\x4d\xbd\x6b\x84\x7a\xb5\xa4\x3c\xc3\x94\xcf\xe4\x9c\x48\x63\xef\x88\x45\x15\x39\xf2\xda\x78\xb2\xc9\xb1\x24\x21\x68\x5b\x10\x41\x35\xa1\x09\x51\x2c\x51\x80\x90\x7b\x24\x92\xf7\x10\xa8\x19\x88\x8a\x62\x89\x0e\xc5\x40\x73\x73\x71\xcc\xf2\xac\x99\x2f\xc4\x2b\x96\x46\x2a\x75\x9e\xde\x4d\x96\xe7\x0f\xa5\x9e\x51\x44\x57\x4c\x72\x86\xfd\x4c\xb9\xa8\x2d\x74\xe6\x20\x82\xc4\xdf\x9a\xa2\x89\xb0\x42\x0e\x6f\x5e\xb4\xc4\x1f\x49\xa2\xd8\xeb\x4e\x5f\x53\x02\x4d\xfa\xc7\x12\x6f\x30\x99\x4e\x0d\x96\x9d\x95\xc8\xd5\x73\xf1\x20\xea\x57\xd0\x3f\xe0\x63\x25\xb0\x5e\xf0\xd9\x97\xd1\xc2\xa0\x65\x3b\x2c\x45\xae\x6e\xb3\x37\x7f\x13\x26\xb0\xa2\x8c\x97\xc2\xf3\x95\x63\x6d\xe9\xea\x19\x8d\x0a\x10\x12\x77\xbb\xfe\x7d\x7d\xbb\x7a\xbc\xed\xce\x57\x21\xe8\x91\x6c\x13\x4a\xff\x8c\x7e\x3c\x0c\x82\x18\xd7\xdf\xf9\x60\x03\xfc\xc3\x69\x8b\x72\x04\x4f\x79\xd9\xec\xc5\xaf\x39\xd5\x18\x15\x06\x71\x10\x59\xc1\x8a\x0a\x56\x5b\x07\x8d\x57\x21\x95\x91\xe7\xbb\xf3\x0e\xf5\x1d\xcc\xf7\x25\xa9\x90\x31\x86\x92\x59\x2a\x07\xe1\xad\x41\xc8\xc2\x04\xdb\x51\x2f\x45\xe7\x89\x5f\x15\xfe\xfc\xdb\x0e\x99\x94\xc6\x6d\x4f\xd3\xd1\x9f\xfc\x66\x48\xc1\x4b\x2f\xdd\xe5\xe2\xad\x0b\x5b\xc3\x10\x42\xac\xa9\x6e\x17\x8f\xb7\x9b\x87\xbb\xc5\x72\x3f\x34\x52\x61\x68\x34\xb5\xe8\xcf\x0f\x17\xce\xec\x4b\xdb\x5c\x33\x4a\x2a\x86\x11\x11\x80\x15\x9a\xcb\xe9\xf4\xe1\xaa\x20\xe3\xf2\x9c\x0a\x23\x95\xf8\xed\xa3\x17\xe2\x9f\xf5\xa1\x42\x4e\x02\x2c\xb8\xec\xa1\x6e\xd4\x18\xb7\xa2\x42\x2e\x53\xc4\x86\xc8\xea\x92\x43\x75\xfb\xd9\x6b\xe6\x46\x61\x65\xcb\x52\x6c\x6a\xb0\xbf\xe8\x2f\x92\x48\x5b\x3e\x13\x0e\xef\x0f\x7f\xca\x74\xe7\x4e\x4c\x53\x1a\x1b\xdf\xb0\x79\x29\x30\x89\xe9\x97\x7c\x28\x48\x82\xf6\xbe\x80\xf7\x27\xa8\x7c\xe6\x7c\x92\xd3\xf7\x79\xe3\xb0\xfb\x9e\x22\x14\x81\xe7\x65\x1d\x90\x92\xaa\x50\x92\xc0\xa7\x50\xf6\x99\x7a\x85\xa6\xde\x97\xb7\xed\x2b\xbd\xc6\x71\x25\xfe\x14\x1a\xe2\x76\xb9\xb8\x5f\x1e\x96\x9b\xc7\xfd\x76\xb1\xdc\x1f\x16\xb7\xb7\xdb\xd5\x6e\xd7\x5d\x56\xa7\x58\xcc\x6c\x5e\xaa\xf2\x7d\x6d\x76\x18\x5b\xd4\x28\x9e\xd1\x5a\xa7\x85\x69\x00\x93\x5d\x78\x3f\xdd\xc3\x29\x62\x55\xf2\x0e\xe2\xd8\x1b\x8c\x50\x53\x62\x1c\xc0\xec\xa1\x2c\xda\xb5\xba\x91\xff\xf1\xe0\x98\x39\x97\x3b\xd4\x9c\xa0\xb5\x5f\x6e\xee\x37\xdb\xc3\xb7\xcd\xfd\x6d\x77\x2d\x19\x63\xfd\x6f\x77\x05\xcb\x9d\xff\x18\x11\x09\xe3\x28\xf2\x0e\xd4\x98\xc1\x47\x45\x01\x95\x98\x24\x3d\x97\x75\x9f\xb1\xe8\x26\xe5\xf8\x42\x41\xa4\x91\x64\xcb\x21\x32\x7c\xc2\x61\x97\xfd\x0f\xba\xcb\xc9\x14\x9b\x9e\x6c\x47\xb0\x4d\x38\xf8\x2f\xda\xeb\xa4\xfd\x2b\xfa\xf7\x8c\x3e\xb9\x8a\x02\x2d\xc0\x5c\x53\x20\x59\x75\x29\xff\x13\x94\x19\xee\x00\x9d\xcd\xb5\xd1\xf5\x83\x22\x85\xd0\xc7\xc5\xe9\x24\xa7\xec\x67\x83\x89\x10\x51\x69\xd1\x69\x58\x9d\x6f\xbc\x92\xf8\x0c\x53\xc6\xe4\xf2\x4a\x61\x57\x64\x56\xa8\xa7\xea\x73\x76\x51\x15\x51\x43\x91\x4d\xe3\xb6\x3c\x6e\x85\xf2\xc2\x13\xfe\x51\x18\x4f\xa4\x0b\xbc\x7c\xe1\xd5\xd1\x0d\x8c\x7b\x08\x54\xc4\x52\x11\x0a\x9f\xef\xab\x9b\xf6\xed\x4e\x1c\xbc\x88\xa9\x84\xba\x68\xd1\x26\x08\xea\x21\x50\x54\x45\xcc\xa4\x88\x66\x5a\xdc\x3e\xac\x1f\x0f\x8b\xfb\xfb\xcd\xcf\xc5\xa3\xe7\xd2\x6c\x0f\x03\x6e\xe6\x87\x6e\xb1\x7b\xa0\xdc\xf0\xc9\x02\xea\xdf\x5c\x98\x18\x74\x75\x1c\xa4\xb8\x92\x59\x33\xb3\xc3\x46\x91\xb2\x10\x0f\x79\xf9\x40\x5c\xd8\xb4\x86\xe7\x87\x81\x40\xef\xc7\xa2\x04\x2d\x09\xef\x18\x3a\xad\xa2\x98\x12\x44\x52\xfc\x7d\x79\xf7\x16\x7c\x41\x75\xe8\xef\x30\x66\x71\xd4\xa3\x34\xe5\x84\x4d\x4c\x45\x3c\x61\xb4\x0f\x2c\x90\x3f\xc4\x27\xd9\x6f\xae\xfa\xf6\xfd\x39\x46\x60\x4a\x71\x6d\xf1\x7d\xb3\x19\xba\x28\x09\x23\x4b\xf5\x27\x6a\x64\xbb\x1e\xd5\xb7\x7c\x79\x22\x4a\xc0\x22\x98\xee\x3a\xc2\x3f\xcf\xad\x81\x3a\x7c\x03\x0b\x17\x25\xad\x49\x1d\xb0\xf9\xcd\x17\x4f\x27\x53\x2f\x0d\x02\x97\xa2\xb0\x93\x7a\xff\x71\x76\x7d\x0b\x5d\x2b\xe0\xf8\x86\x04\x09\x22\xcb\x6f\xfb\x46\xa3\x78\xde\x1b\x89\x84\x0c\x10\xde\x75\xb0\x1d\xbc\x1b\xec\xf6\x1f\x3f\xbe\x8c\xb8\x88\xbb\x6f\x39\xf0\x24\xa7\xe3\xe2\xc8\x76\x8c\x97\xc7\x47\xb8\x9c\x44\xf5\x5a\xdf\x5c\xaa\xe2\xba\x0f\x7a\x72\x0b\x12\x12\xb0\x08\xe1\xe2\x52\x2b\x91\x67\x6a\xe2\xb5\x44\x8a\x58\x0a\x6f\x91\xe7\xed\x6b\xbc\xcd\x6a\x75\xd5\x1a\xaf\x22\x9d\xd2\xb0\x13\xce\x18\x7a\xc8\xee\x38\x50\xa5\x60\xa0\x14\x32\xc0\xab\x0c\xb8\x21\xe6\xb5\x99\x55\x04\x32\xc1\x1c\xa2\x4b\x75\x7f\xbf\x14\x4d\x47\x70\xe9\x86\x18\x21\x10\x7a\xfe\x54\x95\x03\x11\x92\xee\xa8\x62\x5e\x7a\xc7\x26\xa1\xd7\xba\xee\x8f\x25\xce\xa7\x86\x36\xd0\xed\xa0\xcc\x2a\x26\x81\x85\xef\x1f\xb2\xda\xea\x26\xfa\xbf\x27\x10\xf0\x0e\xc3\x8d\xf2\x60\xb6\x1f\x64\x39\xb7\x83\xf8\x93\xa4\x64\x71\xdf\xe1\xf5\xad\x2a\x2f\xe7\xbb\xaa\x3c\xcd\x41\x83\xfd\x12\x89\x09\x24\x54\x0d\x05\x56\x2c\x4b\xf8\x5f\x8a\x2b\xe3\x80\x8a\x44\xfb\x60\xc1\x96\x23\xfc\xeb\x8a\x29\x03\x8c\x8d\x5f\x44\xfd\xb2\x2f\x77\x83\x4e\x74\x37\x80\xd1\x18\x23\xb4\x87\xc7\xbf\x58\x6f\x8b\x59\xca\xb9\x18\x65\xd8\xda\xc7\x6b\xd7\x58\x31\x55\x38\x51\x31\xd3\x96\xc6\xa9\xc4\x5d\xad\x6b\x0e\xf3\xeb\xda\x5b\xc6\x98\x69\xa1\xe3\x1e\xf1\x75\x73\xf9\x80\x6a\xdc\x13\xe8\x06\x46\x41\x9c\x62\x52\xbd\x8d\x79\x42\x8f\x4d\xf7\x8f\x1b\x49\x26\x1c\x88\xe4\xd0\x80\x38\x1d\x84\xf5\x18\xbb\x4f\x1d\x01\x38\xc0\x4d\x75\xcc\x8a\xa5\xc8\xf3\x4d\x71\x03\x2f\x22\x37\x1b\xb3\x05\x85\xfd\x55\x57\xcd\x5d\x73\x95\xf6\x38\x32\x09\xc2\xc8\x0e\x6e\xb2\xce\x14\xaa\xe2\xb8\x0d\x6e\x3d\x01\x75\x9e\xcf\x0d\xe1\x4c\x21\x2b\x49\x79\xb6\xc1\xd6\x1c\xa5\xd6\xdf\xa6\x44\xbf\x2a\xe6\xb1\x4d\x6f\xaf\x4e\x52\xd4\xf5\xc7\x27\x73\x91\x0b\x83\x75\x21\x9f\x19\xe9\x88\x40\xc6\x15\x84\x38\x89\x28\x56\xa8\xc7\x94\x29\x2a\x4e\x38\x43\xe0\x8b\x84\x66\x53\xfc\x36\xf8\x0a\x49\x02\xd8\xad\x9c\x97\xc7\x29\xc8\x73\xfc\x78\x82\x28\xb4\x6b\xae\x2d\x12\xc4\x69\xe7\x27\xb6\xbf\x96\x60\x06\xc9\x3b\x1b\xeb\x87\x6e\xde\x8b\x76\x2f\xb9\x2e\x45\xc6\x92\x53\xec\xac\x93\xa8\x70\x22\x26\xa6\x29\x56\x21\x61\xce\x31\x78\xf8\x40\x89\x5a\x7c\xdd\xe3\xf9\xa8\x89\xd6\x2e\xb3\x7e\x9f\x1d\x5f\x50\xe7\x75\x52\xbd\xb9\xfa\xee\x73\xd4\x0d\xfd\x05\x03\x5b\x30\xb7\xd5\x51\x6c\x87\xcc\x20\xef\x21\x44\xde\x15\x8f\x35\x98\xc0\x52\xf2\xaa\x4c\xf7\x0b\x14\x18\xc3\xc6\xd5\x87\xc5\x1f\x16\x26\x77\xfb\xbc\x5d\xec\xd7\x9e\x07\x40\xc5\x60\x22\x11\xf5\x6a\xeb\xbe\x7e\x27\xf2\x09\x74\xcb\x0d\x37\x61\x8c\x8d\xdb\xad\x63\x0f\xc3\x8d\x66\x2e\x57\x35\x96\x53\x57\xb1\x49\xc3\xd8\x2a\xa6\x9c\xb2\x09\xbc\x26\x36\x42\xe3\x0e\x72\x5f\x1e\x8f\xa0\x9d\x3e\xd4\x17\xd6\x62\xd2\x7e\xa2\x38\x21\x1a\x89\x9f\x6d\x2a\xcd\xea\x39\xdf\x43\xa1\xe1\x8a\xf3\x6c\x16\x28\xcc\xe8\xbf\xf8\x90\x66\x66\x12\xba\x72\x22\x43\xc4\x92\xbc\x65\xf0\xbe\x85\xf3\xa5\x99\xc9\x16\x73\x4a\x25\xb5\xa9\x31\x6c\x2c\xf2\x9d\xdc\xb6\x0e\x50\xf9\xe4\x3e\xa7\x2a\x40\x9f\x1a\x2b\xda\x37\xa2\x9e\x2c\x5a\xce\x22\x40\xb2\xfd\x37\xa8\x32\xd3\x9d\xc5\xe2\xc4\xd8\xae\x8d\xf2\x0c\xc5\x94\x01\x41\x71\xa6\x92\x18\x86\x0d\x5f\xb6\xfb\x65\x7c\x87\x0c\x14\x21\xdd\x82\xf1\xe1\xec\xe4\x4a\x61\xa0\x30\xf1\x74\x12\xaf\x36\x1f\xe0\xff\x9e\x5a\xef\xec\x71\xbf\xec\xfe\xa4\xad\x0c\xbf\x6f\xb7\xc5\xf6\xbe\xf1\x2e\xe4\x47\x9a\x08\x0b\x42\x6b\xf8\x05\xea\xfb\x45\xda\xbe\xe3\xa9\x73\xca\x23\xa6\x2c\x9b\xc5\xe2\x61\x75\x58\x6c\x7f\xf8\x1f\x8a\x62\x85\x19\x69\xfb\x79\xb1\xf7\x6b\x36\xcc\xe0\x51\x1a\x23\xce\x16\xf1\xb7\xe5\x08\x47\xc3\xe3\x88\x04\xc2\xed\xd1\xaa\x0c\x90\x1d\xac\x3b\x16\x27\xf8\xd0\xff\xc9\x8a\x63\x0e\xf5\xa6\xb8\x46\x4d\x70\x4e\x62\xa2\xa7\x1c\x4f\xdf\xcb\x13\xac\x7e\xb9\xae\x6d\x3f\x90\xaa\x44\xf6\x5c\x86\x93\x67\xe4\x2c\x40\x46\xaa\x6f\x03\xc0\x0e\x4f\x64\xc8\xc8\xe0\x4d\xa2\x97\xfa\x65\x14\xc9\x53\x6a\xb9\x31\x5e\x44\x7d\x03\x50\x38\x4a\x0b\x7f\xc1\x34\x0c\x12\xe6\x8a\x5e\xb5\xb9\xa8\xd7\x6e\x26\xa5\x2a\xc1\x08\x68\x7f\x33\xbc\x01\x01\x29\x06\xc4\x67\x1b\x52\x3f\x88\x5f\x23\x26\xf9\xf1\x23\x48\x9e\xc8\x60\x2a\x69\x7d\x2d\xb2\xa6\xb8\x4c\x15\x96\xbc\x9d\x14\x9a\xf4\xf1\x37\x97\x22\xc6\xba\xbd\x70\x84\x89\x50\x2f\x2f\xcd\xe6\xd2\x94\x26\xf0\x72\x75\x8a\xab\xc0\xaa\xb2\xb6\x0e\x97\x68\xb7\xc1\x9b\xc9\x17\x51\xa1\x15\xd2\xd2\xe5\x6d\x56\xf7\xb0\x2c\xae\x24\x45\x53\xf3\x54\xee\x46\x33\x40\x13\x8e\x0e\xa4\x77\xb8\xee\xac\xd4\xd8\xc8\xcb\xe4\x9a\x4a\x44\x13\xe2\xe7\xdd\xa8\xaa\x4f\xbf\x70\x1d\x47\x81\x0b\x60\xee\x4b\xf5\xba\xd3\x1e\x51\xcb\x81\x58\x8e\x42\x55\x16\x6f\x50\x8d\x13\x13\x9f\xe2\x1c\x86\xe6\x91\x43\x68\x1b\x65\xf1\xed\x67\x85\x23\x82\x77\x07\x4d\x20\x92\x64\x80\xaf\x6d\x37\x72\xab\x53\x25\x3e\x09\x74\xb9\xe1\x69\xe4\x0b\x6e\x0f\xf0\x20\x3e\x64\x37\xd9\x8d\x12\x30\x90\x01\x44\xe5\xc6\xd1\xc9\x09\x21\xda\x38\x38\x36\x7a\x4b\xf2\x43\x4c\x12\x75\xa3\xef\x9c\x04\x49\x9c\x58\x4e\xe2\xaa\x40\x4d\x49\x5f\x08\x1b\x5f\x96\xb2\x10\x61\xd9\x87\x4b\x81\x8d\xd9\xbf\xf9\xbf\x6b\x82\xbb\xb4\xf3\x76\xba\x82\xd4\xb0\x0b\xd8\x0d\x65\x71\x84\x3d\xd0\x3b\x28\x46\xed\xd3\x2a\x09\xa3\x04\x0b\xe3\x7d\xdf\x98\x3f\x12\x13\xc0\xbc\xbb\xd7\x3f\x18\x44\x72\x49\x4c\x09\x75\x08\xf9\x47\x71\x82\xfd\x62\x73\x5f\x96\xaf\x97\xf3\x6c\x20\x99\xc4\x82\xfb\xfd\xd2\xd6\xf3\xca\x5c\xcf\x38\x5e\x09\xe7\x29\xf1\x19\x30\x04\xfc\x97\x97\x66\x90\x5a\xf5\xa3\x52\xab\xb9\x65\x97\xd1\xe1\x1c\x4c\xaf\xd2\xda\x25\x7b\x95\xf6\xac\xa5\x38\x4f\x2e\x90\x10\x89\x98\xe8\x9d\xa5\x61\xb3\x4f\x67\x01\x0b\xe3\x2b\x25\x54\x63\x46\xae\x7c\x2f\xa0\xfa\x2e\xea\x97\xce\x50\x24\x09\x00\x22\x5b\x4b\x04\x98\x7b\x7c\xf9\x84\xda\x4f\x25\x69\x20\x91\xf7\xf6\xa1\xac\x61\x54\x0e\x4c\x52\xaa\x3c\x2f\xfc\xe5\x7c\x68\x46\x87\x84\x31\x71\x07\x55\xb5\x8a\xca\x96\xae\xe9\x2a\x3b\x9c\xa4\x86\x61\x48\xbd\xd9\xfe\xdf\xe8\xf2\x42\x08\xee\x89\xb3\x64\x6b\x98\x8a\x8b\xc8\x57\x93\x24\xa5\x1f\xab\x19\x5a\x71\xfb\x42\x11\xe6\x03\xcd\xa0\x66\x3b\x1f\xe3\x24\x32\x14\x29\xf1\xb4\x9a\xb7\x17\xab\x83\x04\xd8\x0d\xb7\xfe\x93\xd8\x37\x91\xae\xc1\xd0\xcd\x97\xa6\x5c\xd4\x2a\xcb\x76\xb8\xb2\x27\xaf\x50\x51\x83\xfb\xc7\x22\x3f\xbf\x08\x5b\x61\x6f\x7d\x56\xdb\x71\xe5\x12\xd3\x57\x2e\x88\x3f\x57\x6b\xac\x97\x2e\xb6\xcb\xc5\xed\x7a\xe1\x5f\x8e\x0e\x3b\x3a\x74\x34\x18\x96\x0e\xa7\xbe\xae\x1b\x24\x5a\x00\xae\xd0\x45\x9e\x2f\x4e\x50\x65\x4a\x8c\x96\x88\x61\xa2\x03\x14\xa0\xcc\x69\x77\x20\x0e\xd0\xaf\xf8\xe3\x8f\x3f\xba\x3f\x29\x4b\x88\xff\x23\x6b\x9a\x8f\x81\x1a\x9a\x4a\x49\xcc\xa9\xc3\x4c\x59\xa9\x40\x04\xc4\x8e\x5b\xb1\xfd\xc7\x4a\x49\x9c\xe0\x8c\xb2\x64\xed\x5d\xd1\x66\x12\xc4\xfb\xc1\xa9\x05\x78\x5a\x3d\xa6\x4a\x74\x36\x39\x0d\xa8\x13\xb4\xc7\x3a\x9d\xed\xb2\x9c\x99\x5f\x69\x10\xa6\x38\xbf\x30\x4d\xe4\xed\xd3\x94\xe7\x6d\xd6\x94\xa6\x81\xa0\x3c\x1c\x23\x66\xec\x14\x9d\xb0\x82\x8f\x3e\x59\x1a\x00\x61\x9d\x84\x14\x36\x0c\xce\x67\x71\xd3\x50\x6b\xdc\x55\xac\xc3\xf7\xfd\x72\x12\xc5\x98\x6d\x6b\x7c\xdd\x28\xd5\xa9\x0b\x91\x1f\x3a\xc2\xe6\xee\x31\xe3\x20\x8e\x9d\xb2\xc6\xd3\xfa\x00\x3a\x6b\x26\x20\x96\x34\x8e\xb5\x95\x1f\xcd\x8a\x66\x5f\xee\x9a\x49\x16\x2e\xe5\x24\xc1\x62\xd1\x93\x50\x37\xa2\xc3\x92\xa5\x3c\x4e\xd0\x50\xda\x4a\xea\xb5\x9e\xbd\x4a\x39\x0f\x91\x29\x5c\x3b\xbf\x72\x46\xcb\x44\xa5\x89\xe1\xc1\xa8\xa9\xad\x97\x42\x54\x69\xca\x42\x9b\xa7\x43\x37\xef\x80\x24\xc9\xfd\x31\x8e\x70\x20\x0c\xf6\xeb\x43\x0d\x6d\x14\x3e\x40\x87\xa4\x69\x1c\xe1\x86\x77\x2c\x73\x3d\x01\x62\xa4\x69\x62\x49\x8c\x90\x97\x1a\xd7\xdb\x24\xc0\xb9\x46\x53\xa4\xd2\x08\x8c\x2e\xc1\x79\x77\x08\x1e\xc8\xc5\xd1\x5f\x53\x85\x1c\xbf\x6f\xde\x6e\x4f\x4f\xad\x27\xd8\x53\x51\xa9\x54\x25\x9a\xa5\x6e\xfb\xed\xff\xaa\x85\x8c\x9c\x20\xb6\xee\x59\x16\x55\xaa\x55\x4c\x1c\xee\x08\x13\xec\xfb\xec\x13\xad\x6c\x95\x42\xc4\xb4\xf1\x8a\xc6\xbf\x9c\xea\x40\x25\x26\x9e\x74\x0a\x1a\xe2\xa8\xcf\xa5\x42\xd5\x7c\xdc\x80\x2a\x4f\xbe\x13\x68\x98\x68\x4c\x4d\xa2\x30\x7b\x75\xc8\x6a\xa7\x7e\xa9\x9f\x44\xff\x59\x8c\x01\xe2\x4a\x60\x8e\xbc\x27\xf3\x5d\x5f\x4a\x90\x98\x22\x71\x22\xe2\xb3\x6d\xa3\x86\xe3\x74\x70\x03\x02\x62\x69\xe4\x7a\x62\x97\x2f\xad\xb1\x08\x68\x8a\xe2\x31\xc6\x49\x04\xdc\x42\xad\xaa\xec\x3c\xc8\xc4\x88\x20\x56\x3e\x1a\xef\xd0\x4f\x5f\x5f\x94\x86\x11\x95\xfd\x56\x2b\xc7\x6f\x4b\x50\x6d\xbd\xdf\x1a\x8a\xa6\x81\xfe\xe1\x28\x18\x84\x34\xdd\x96\xaa\x28\x1b\xe1\xdc\xba\x79\x27\x48\xb0\x30\x46\x6f\x14\x95\xc6\xbb\xbe\x2e\x7f\x29\x16\x87\x58\x30\xb0\xab\x7c\xc8\x50\x97\x4c\xe1\x88\xff\x0a\xff\xed\x4f\x92\x91\x10\x1d\xcc\xb7\x99\x66\x2d\x44\x98\x46\x86\xf4\x34\x0e\x9d\x28\xe2\xf8\xe1\x23\x4d\x22\xde\x23\xe9\xac\xdb\xf4\x7b\x30\xef\x38\x8a\x48\x53\x74\x65\xcf\xb9\xf8\xd8\xe5\x65\xf7\x2e\x22\x88\xed\xca\xad\x2e\xc7\x09\x14\x40\xc4\xa1\x85\x62\xb4\xf7\x09\x8d\xb8\x0a\x4f\x45\x9c\x0a\x0c\x5f\x97\xff\x5c\xde\xaf\x0e\xcb\xc5\x93\xbf\x6a\xac\x43\x6c\xcc\xbd\xc7\x64\xcf\x95\xc7\x25\x78\x6c\xd5\x51\xdb\xd9\xf5\x20\x7e\x8d\x70\x72\x82\x2b\xdb\xa2\xf7\xf0\xbc\xdb\xcf\x62\x67\xbe\xe8\xac\x6e\xcf\xd6\xa8\xec\x7c\x3e\x96\xc8\xaa\x98\x7f\xb8\xef\xfb\x7b\xdf\x6c\xa9\x44\x12\x47\x18\xe3\x8a\x9d\xab\x4a\x54\x1d\xf0\xc2\xaf\x1f\x91\x26\x96\x31\xb7\xdd\xf7\x1a\x38\x7b\x8c\xb9\xdf\x17\x45\x2a\x25\x0a\x38\xdd\x2d\x96\xfb\xcd\xf6\x10\xf8\xbf\x0b\x1e\x7b\x19\xf4\x61\xe7\xa0\x10\x69\x8c\x6f\xeb\xbd\x4f\x70\xef\x5f\x2a\x80\xf6\xe2\x7e\x8c\x0a\x14\xfa\x6d\xb7\x95\x38\x96\xc5\x8f\x19\xe2\xef\xd9\x4c\xc7\xb5\x2a\x49\xe0\xe1\x9b\x41\x67\xfb\x84\x66\xb6\x1f\x7f\xff\x02\x77\x39\x66\x77\xbf\xe6\x37\x55\x42\x27\x16\x65\xbe\x85\xa2\xd9\x18\xd3\xe3\x11\x05\x90\x04\xbc\xe4\xe6\xc8\x63\x17\x10\x86\xe8\x93\x5c\x8a\xfa\x22\xdb\x45\x2e\xfb\x93\x12\x85\x74\xa9\x8d\x78\x85\x87\xb2\x00\xff\xc9\x25\x61\x2c\x75\xcd\x96\x0f\x59\xd1\x89\x65\xb4\x07\x2c\x7d\xa2\x97\xd1\x1d\x4f\x40\x49\x04\x17\xba\xdb\x35\x11\x98\x61\xed\xc6\x68\xba\x49\x02\x36\x4f\x71\x40\xf8\xcb\x37\x28\x26\xcc\x52\x4a\x06\x31\xb3\x9e\x88\x93\x8c\x3f\x8f\x28\xf7\xfe\x36\x97\xb4\xf2\x67\x26\x24\x74\xb7\xb0\x15\x0d\x2c\xac\x99\xb7\x50\xc9\x19\xee\xc6\xf9\x59\x2b\x03\x19\x5b\x38\x7e\x25\xb3\x06\x2a\xcb\xa1\x31\xc4\xd5\xca\x40\x49\xe1\xe4\x27\xfe\x71\x29\x3b\x1c\xac\xa4\x29\x43\xd0\x44\xbb\xe3\x5e\xce\x9f\x72\x23\x8c\x5f\x08\x15\x0a\x2d\xe0\xe1\x5c\x01\xba\x4e\xa2\xe9\xcd\xcc\xac\x01\x91\x54\x09\x6c\xdf\xb3\x96\x6e\x36\x90\x92\x8c\x10\x44\x5e\x1c\x7c\x33\x94\xbf\x49\x16\x5b\x8a\x7d\x79\xf9\x58\x8a\x5c\x2d\x3e\xd3\x86\xfd\xf4\xdf\x3e\x29\x28\x99\x60\x9d\x0c\x99\xaf\xa4\xcf\x99\x51\x19\x49\x65\x19\x61\x1b\x51\x35\x48\xe3\xe7\x31\x7e\x32\x52\x80\xdb\x5b\x2d\xde\x60\x5f\x2e\x7f\x76\x7f\xd7\x21\x7e\x4c\x5d\xae\x7e\xd9\x4d\x65\x32\x4f\x62\x46\x6d\x53\x62\x31\x4a\x02\xf9\x25\x26\x79\x60\xc9\x90\xa5\xe7\x52\xff\x3e\x53\x92\x93\x3c\x22\xd8\xff\xbd\x5d\xdd\x3d\x3f\xde\x1e\x6e\xd7\xbf\xaf\x77\xeb\xcd\xe3\xa0\xa7\x5a\xc9\x84\xc4\x58\x97\x70\x0c\x93\x0e\x13\xdb\x1f\xd5\x5e\x7b\xdd\x95\xf0\xef\x8e\x6a\xb0\x6e\x92\xd4\xa2\x2a\xee\x57\xdf\x16\xf7\x87\xd5\x1f\x4f\xab\xc7\xdd\x6a\x87\xd8\x8b\x6e\x88\x0c\x70\x05\x3f\xc2\xfb\x77\xa7\x50\x33\x7e\xd6\x94\x72\xe1\x44\x10\x1d\x8f\x7d\xcf\x3d\x60\xcb\x0b\x93\xc9\x35\x82\x8e\x4f\x12\xb1\xfe\x05\xa5\x61\xe0\x29\x52\xbe\x61\x1f\xce\x27\x4c\x4d\x93\x09\x9b\x86\xda\x02\x14\x6d\xc3\xf2\x27\xa3\x54\x20\xb1\xa1\xd5\x3b\xda\x94\xa1\xd1\x78\xf8\xb4\x77\x45\x2a\x13\x62\xe9\x4d\xe5\x20\xaa\xdd\xe5\xe4\xad\x98\xd4\x24\xb6\x7b\xf4\xe5\xdc\x6e\x0e\x50\xd5\x0f\xd3\x40\x5d\x6a\xca\x91\x90\xc0\xa3\x26\xf7\xa5\x4d\x95\x8e\x7f\x02\x88\xc1\x6d\xe2\x66\xeb\xb1\x25\x12\xda\xf0\xd7\x2e\x87\x7d\xe6\x32\x92\xe3\x6a\xb1\xb7\x2e\x86\x05\x2c\x18\x53\xe5\xde\x88\xe2\x75\x7e\xf9\x19\x37\x39\x77\x2a\x03\x44\x47\xf5\x01\xb7\x22\x81\xad\xb2\x1e\xc1\xb5\x52\x83\x47\xb5\x8c\x82\x6d\x15\x90\x40\x8a\x09\x07\xfc\xd0\x57\x1b\x3d\x9b\x0a\x02\x1a\x5a\xaa\x76\x3d\x12\x12\xfb\xd3\xf5\x3c\x78\x46\x15\x44\x96\x5a\xb4\x0d\xaf\x5f\x47\x2f\x63\xcc\xa9\xdb\x8d\x57\x2a\x95\x5d\xe1\xbb\xb5\x7b\x88\xa4\x3e\xe7\x30\x5d\x8e\x8a\x06\x96\x07\xf5\xbd\x23\xe5\x6a\x63\x73\xff\x4e\x68\x2a\x20\xe9\x68\xf3\xba\xcc\x68\x39\x89\x9d\x14\x15\xb1\x65\xbc\x15\xc5\xeb\xc5\x75\x6c\xfb\x6b\xb0\x10\x10\xf4\xef\xbc\xb0\x9e\x6f\x60\xf4\x69\x14\x8b\x2d\xb4\xa0\x02\x73\xa9\xaf\x04\x36\x94\x0a\x79\x42\x58\x5f\xcc\xb7\x1c\xe9\x08\xa3\x9e\x5c\x28\x14\x91\x6f\xc2\xbb\x05\xd0\x7d\xb1\x5a\x85\x1a\x94\xfb\x89\xf2\x2a\xf7\xa7\xa2\x88\x20\xa0\x60\x69\x09\x2a\x97\x0f\xf3\x0b\x42\x45\x32\x12\xba\x6b\xe6\xea\xe8\xdf\x26\x57\x8b\x89\x8c\x2d\x2d\xcc\xba\xc8\x3a\xea\x28\xa5\xe2\x30\x31\xf1\x34\x99\xbe\x2f\x9d\x0d\xb3\xec\x90\xdd\x58\x69\x1b\x0b\x4c\x96\xe7\xfb\x17\xc8\xaa\x11\x8c\xc9\x0d\xe2\x2c\xc6\x3e\x23\x0b\x8b\xf4\x46\x79\xa8\x2b\x39\xb9\xff\x84\x5a\x3f\xf7\x08\x8d\xa9\xca\x53\x7d\xf9\x54\x36\xc0\x9f\xc0\xac\xd4\x20\xd6\x00\xb7\x99\x7a\x5d\x14\xfa\xa1\xac\xbc\xa8\x8b\x52\x49\xca\xb1\x5f\xe6\xbe\xb4\xa8\xa2\xd6\xfd\x77\xdd\xc5\x28\x75\xf6\x49\x96\xe1\x93\x9f\x4b\xa5\xd5\x4e\xc8\xea\xb5\x2a\xef\x44\x96\xf7\x2f\x4f\x84\x24\x24\xbe\x7b\x7a\x29\xce\x5b\x10\xea\x65\x70\x38\xb1\xa9\x8e\x73\x6b\x04\x6e\x3b\xb0\xec\xa1\xdd\x46\xe7\x7f\x4b\xd1\x04\x1b\x42\x6f\x9e\xb7\x8f\x13\xd8\x9d\x52\x2a\x46\x94\xe8\x7d\xf9\x06\x37\x59\xb7\x53\x2b\x20\x56\x56\x1f\x51\x0d\x1e\x86\x58\x79\x52\xed\x97\xec\x3c\x6f\x7a\x15\xd0\x18\x01\x95\x1d\x32\x7e\x51\xd4\xef\x53\x2e\x01\x3f\x16\x04\x7a\xff\xca\x1b\x98\x91\xff\xaf\x4c\x24\x30\x67\x6e\x1b\x15\xb2\xa2\x27\xed\x55\xca\xc4\xb6\x2b\xa0\x00\xab\x5c\x58\x4f\x1d\x1e\x3f\x2e\xa1\x88\x62\x06\xcb\xbf\xb1\x31\x4f\xd5\x40\x00\x41\x69\x22\x38\x86\x36\xdb\xf5\x18\x64\xaa\x03\xc2\x3b\x09\x63\xdf\x07\x31\xee\xef\x98\xff\xb0\x3a\x60\x0c\x03\xe2\x4d\xbb\x4d\x2e\xcb\xac\x70\x61\xc7\x62\x58\xf5\xec\xc6\xea\x38\xf2\x20\x74\x9f\xb3\x72\xf5\xc4\xd1\x73\xe8\x20\xb4\x32\x7f\x0d\x88\x93\xab\xc8\x3c\x0d\xf4\x24\x95\xa6\x61\x88\xc5\xbf\x1c\xf3\xdb\x5e\x3b\xe0\x49\x54\x0d\x9d\xfc\x28\x23\xdc\xb2\x3d\xd8\xae\xf6\x2d\xa0\x26\x74\xfe\x75\x96\x4c\xb3\x88\x31\xe5\x6a\x00\xf3\xd5\x39\x1d\x06\x11\xa1\x8e\xea\x26\xab\x40\x3f\x88\xff\x94\x55\xd6\x7c\x8c\xd1\xdc\x3a\x0c\xac\x38\x64\xd9\xc6\x11\x59\x2f\x08\xe2\x0f\x47\x96\x96\x2d\xb3\x79\x68\xdf\x67\x05\xfa\xe6\x63\xf7\x71\x92\x65\x3e\xca\x77\xe9\x90\x83\x97\xc8\x28\xca\x77\x25\x2a\x3d\x20\xa3\x53\x3a\x0a\x04\xa2\x37\x0f\xb5\xed\xdc\xcd\xf3\xec\xd8\xee\x89\x98\x46\x0f\xe2\xc9\xab\x89\x12\x16\xb3\x8e\x82\x7c\x89\xa0\xca\x1c\xf4\x37\xe1\xf2\x35\x1d\xb5\x9a\xdf\x58\x74\x0c\x0c\x13\x41\xc7\xec\x0d\x10\xd1\xee\xaa\xdb\xdd\x61\x85\x28\x88\xef\xab\xfb\xfb\x8d\xff\x23\x67\x36\xe6\xf4\xee\x82\xfb\x9e\x7f\xad\x61\x56\x73\x9e\xe8\x8e\x60\xb3\xd2\xf5\x97\xfe\x92\xe6\x29\xc5\x52\x4f\x01\xbf\x9a\xae\x63\x68\xda\xfe\xaf\x13\x66\x09\x40\xda\x6b\x2e\xbf\xdb\xbc\x22\x4d\xc6\x2f\x3a\x51\xa9\xb6\x39\xe4\x32\xd7\xd7\x5d\x6d\x3a\xa5\x69\xea\x24\xed\x3f\x0a\xd5\xfd\x95\x59\xed\xed\x5d\x76\x3a\xf7\xab\x2e\xd5\x22\xf4\x69\xcc\x3f\x4d\xe3\x4f\x9e\x3f\x35\xa1\x55\xf9\xf0\xe9\xd6\x49\x9a\x76\x74\xd3\x22\xd4\x08\xba\xaf\x5f\xca\x77\xf4\x97\x86\xad\x45\x5a\x52\x45\x42\x6f\xf2\xbd\xf8\x94\x3f\xa8\x35\xc1\x15\x77\x16\x1f\xeb\xce\x2a\x00\xb5\xcd\xc0\x87\xd6\x24\xf7\x40\xab\x09\xc2\x23\xf9\xdb\xe5\x5a\x72\xb2\x3d\xd9\xd6\x4b\x8e\x7d\xf2\x96\xb2\xee\xca\x71\xc2\x02\x5f\x53\x1a\xd6\x15\x47\xdc\x1e\xbd\x5b\x3d\xb9\x74\x0c\xb2\x4f\xad\xb6\x06\xae\xde\x67\xad\xf9\x29\x4c\x76\x7c\xe8\xc2\x01\x0d\xdc\xf6\x7e\xe1\x4f\xdc\x6d\xf7\x13\x2b\x03\x69\x4a\x6d\x99\xd8\xe2\x33\x6d\x87\xea\xf8\xa7\x0c\x8b\xac\xb6\xd9\xb7\x6f\xbb\xc3\x7e\x73\xf8\xbe\xd8\x2f\xbf\x1f\x82\xbb\xc5\x7a\xeb\x7b\x05\xb5\x49\x79\xd4\xe3\x35\x6e\xb3\xfa\x7c\xe9\x76\x16\x08\x42\x82\xf7\xe0\xd8\x66\x10\x09\x38\x36\x11\x10\x28\xc5\x22\x4f\x47\xd1\xfc\xe6\x5e\x2d\xbe\x59\xeb\x06\x0e\x59\x39\xfb\x73\x94\xb0\xfd\x3a\xfd\x3e\x01\x01\x30\x48\xfd\x4c\x6b\xac\x92\x5e\xaf\x3d\x94\xba\x65\x0c\x94\x04\xa9\xe3\x56\x37\x03\x9f\xe9\xeb\xa9\x08\x94\x7a\x22\x84\x02\x5a\xa7\xef\xa9\x86\x8b\x2e\xb7\xa2\xd0\x63\x67\x1a\x68\x1c\x63\x65\x54\x58\x39\x81\xfa\x4e\xa8\x2b\x01\x04\x05\x8c\x19\x32\xec\xa9\xb3\x95\xd1\xc9\x18\x99\x62\x9a\x6e\xad\xcb\x1c\x3f\xa2\xcf\x36\x01\x93\xb6\xc3\xca\x01\xc6\xda\x77\xd0\x07\xcb\x10\x86\x31\xb3\x24\x88\x18\xe6\x7f\x17\xf5\xcb\xfe\xe3\x3c\x42\x53\x41\x98\x58\x71\x70\x65\xe9\x33\xa7\x34\x1c\x10\xaa\x80\x26\xbe\x90\xd6\xbb\xae\x5b\x67\xee\xbd\xc3\x3e\xfc\x55\x93\x84\xc6\x09\x91\xec\xcb\x65\x59\xd4\x97\xd3\xb5\xb0\xe8\xe4\xad\x46\xa9\x46\x46\x8f\x07\x51\x1c\xcb\x2d\x9c\xfd\x8a\x84\x58\x47\x88\x2a\xb8\x2f\xad\x8a\xfd\xbc\xe7\x0a\x3c\xb1\x72\x68\xfb\x4b\xd5\xe4\xf0\xa7\xb9\x2d\x48\xc2\x18\x12\x1f\x11\x35\x95\x18\xf6\x4b\x41\xc2\x2d\x13\x03\xfa\x62\xcf\x55\xf6\x54\x81\xc9\x7e\x75\x47\x53\x5b\xb5\x38\x8b\x8f\x9b\xec\xba\x96\x38\xf0\x75\x20\x25\x09\xfa\xd3\xef\xbe\x37\x66\xff\x6b\xde\x64\x43\x4a\xb9\x61\x9e\x6a\xd1\x79\xcc\x7a\xae\x45\x0b\x52\x23\xb1\xee\x7b\xca\x8a\x9f\x90\x3d\xe1\x7a\xef\x42\x97\x6e\x8c\xd6\xc8\xfe\xf9\xf4\x4f\x74\xf9\x67\xe4\x28\xdd\x48\x99\x5a\x02\xe6\x76\xe3\xdd\x18\x83\x44\x7f\x9f\xb6\xfb\x80\x8a\x03\x84\x72\xaa\xb2\x30\x79\xa6\x9a\x55\xa1\xef\xb2\xae\x4b\x1d\x54\x6a\x49\xa1\x10\x0e\x76\x05\x93\x9b\xff\xf0\x4a\x84\x98\xd9\xfa\x7d\xbd\xdc\xfc\x31\xfe\x6e\xe3\x37\xa4\xa4\xf4\x6c\x1c\xa8\x5b\x71\x9e\x04\xaf\xa0\x43\x91\xc4\x1d\x95\xd1\xf7\x4b\xd1\xac\x7b\xd0\xf2\xdf\x26\x17\x9d\x5c\x5c\x47\x56\x80\xf9\x6e\xf3\xfc\x78\xbb\xda\x06\x56\x11\xdc\x3f\x97\x8e\x05\xf6\xf9\xfc\x58\x6c\x1f\x16\xc3\x6a\x38\x40\x18\x79\x50\xc5\x94\xc4\x53\x81\x21\x29\x62\x54\x6f\xf2\xec\xbc\x2c\x4f\x67\x68\xb2\x6b\xe0\x0d\x98\x28\x16\x3d\x21\xf0\x8d\xf0\x1f\xd1\x10\x6e\x45\x82\xcc\x14\xbb\xde\x0d\x30\x11\xb6\xaf\xc0\x1b\x14\x96\x87\x72\xa2\x8b\xd1\xdd\x8a\xa1\x4c\xa4\x2e\x25\x8f\xe6\xdd\x2b\x81\xce\xbe\x0d\x43\x99\x8e\x99\x97\x78\x6b\xd4\x4b\xbb\x43\xde\x67\x75\x43\xfc\xc6\x65\xa8\x49\x22\x33\xf0\xfa\x6e\xe1\x6d\xa0\xcd\xe1\x06\x31\x6a\x39\x68\x67\xa7\xc3\xbf\xc2\x51\xa7\xca\xe5\x53\x22\x4a\x65\x58\xc8\x12\x47\xf5\xb2\x3b\xd5\x4b\xa8\x9a\xcc\x64\xd3\x60\xd1\xb0\x38\xc5\x92\xab\x2e\x97\x22\xcf\xc7\x73\xc3\x84\x24\x40\x52\x0a\xec\x74\xf3\x5d\xd7\xfe\x18\x63\x03\xaa\xb1\xd6\x48\x0e\xb9\x09\xba\x41\x36\x87\x59\x43\x83\xb6\xb4\x53\x69\x99\xcb\xc5\x98\x50\x46\xdc\x6d\xfa\x58\x78\x98\x2b\x83\x98\x28\xb0\x49\xa6\xdf\x2f\x80\xe5\xf9\x7e\x5a\x99\x28\xb4\x0b\x69\x77\x39\x43\xf5\x9c\x37\x95\xc0\xff\x1a\x54\xf7\x4d\x14\x47\x9c\x7b\xb6\x61\xe4\x6c\x74\x75\xd7\xde\x12\x1b\x0e\xb6\x9c\x89\x94\xdb\x05\xa0\xe7\xdd\x6f\x40\x7f\x29\xed\x3a\xb2\x9a\x26\x09\x53\xc4\x4c\xda\x7d\x60\xa1\xb5\x55\x3a\x9e\x35\x2d\x26\x89\x62\x84\x19\x5c\x8a\xba\xcc\xf5\xb2\x7d\xf3\xcf\xde\x27\x31\x69\x10\xa0\xa0\xad\x06\x1f\x0a\x58\x8c\xcb\xf8\xb3\xa5\xca\x66\x64\xdb\x0b\x3c\xaf\xf6\xf3\xb6\xb6\x1b\x2d\xa8\x44\xd4\xca\x6e\x71\xbf\xda\x59\xfa\x48\xff\x73\x22\x66\xbe\xbf\x7d\x0b\x75\x79\xa9\x54\x47\x89\x3e\x7a\x40\xa9\xec\x03\x3e\x17\x35\x34\x93\x96\xa6\xf1\xd7\x53\x81\x7d\xff\x96\xd8\xec\xae\x98\x74\x0a\x19\x45\x49\x02\x2e\x57\xdc\x8b\x6f\x3a\xe1\xd2\xfd\xe6\x93\x95\xa7\x99\x40\xe7\xc2\x32\x6c\x4c\x26\x8c\x16\xc2\x56\x9a\x2f\x38\x9d\xcc\x25\x1f\xa0\x9e\x8c\x96\x0a\xb1\x9c\x67\xa8\x4c\x59\x9d\x0e\xef\xb3\x24\x33\x46\x2b\x93\x0c\xa8\xc2\xcf\x50\x3c\x88\x57\x18\x65\x5f\xa6\xf7\x04\x52\xf4\x4d\x48\xad\xc7\x6c\xe9\x7c\xc7\xd6\xce\x68\xc3\x95\xc3\x2b\x2f\x26\x6a\x78\xf3\xf3\x03\x28\xf5\x05\xc6\x21\x2e\xf1\x76\x28\xfd\x31\x3d\x25\x16\x66\x98\x73\xbd\x9a\x10\x5f\xa5\x63\x3e\x33\x2f\x26\xb0\xb2\xb8\x1e\x88\xf7\x4d\xd4\xbb\xf3\x50\xc0\xfb\x32\xec\x3c\x30\x26\x02\xcb\xa7\x6b\x73\x69\x2f\xa2\x28\x20\xf7\x9a\x25\xb3\x8f\x1c\xa4\xdd\x4f\xc9\x20\x04\xcf\xdb\x54\x9d\x44\xee\x0a\x21\xe3\xa7\x34\x26\x88\x1d\xc4\xdf\x2d\x77\x4d\x48\x68\x91\xf9\xeb\xed\xe6\x71\xb0\x03\x69\x12\x50\x4b\x6c\x6f\x6f\xe7\x1b\x14\xc4\xcb\xc4\xcc\xbd\x42\x4d\x02\x1d\x8a\xc0\xc3\xc6\x6e\xb3\xb7\xbe\x99\x5d\x13\x46\x63\x2b\x1a\x7e\x68\x23\xc7\x3e\x63\xa2\x09\x8b\x09\x4e\xbd\x53\xa9\x9f\x44\x7d\x1d\xb5\x7d\x4a\xfd\xa1\x09\xe3\x52\xf5\xb2\x18\xeb\xfa\x49\x7c\xa0\xa2\xfe\x90\x12\x5a\x13\xd6\x3a\x64\xbe\xae\xd3\x46\x49\x37\x65\xa1\x67\xd3\x3b\x9a\x30\x45\xb0\x90\x28\x8e\x15\xc0\xa0\x4c\xa6\x09\xd3\x3c\x76\xe1\xe8\xe5\x04\x3f\xcb\xea\xf5\xb7\xf1\xd3\x33\xe0\xd4\x4a\x25\xd9\xfc\x07\xbe\x4a\x35\x42\x96\x68\x12\xa6\x0c\x51\xb8\xbd\x7a\x48\x70\xb3\xef\x57\xa3\xf3\x86\x34\x09\x85\x6d\x03\x42\xc8\x0a\x62\xe7\xeb\xc6\xf5\xf1\xf7\x0f\x16\x69\x8d\x95\xb3\xe5\x72\xb9\xed\xed\xb7\x46\x88\x05\xb2\x43\x8b\x42\xe7\x30\x0c\x50\x66\x5d\x14\x4d\x62\x15\x63\x71\x09\x3d\x44\xfc\x08\x23\x50\xf6\xa8\xed\x45\x13\x4e\x62\x4c\x95\xf5\x64\xf2\x5b\xa8\x2f\x79\xe3\xb1\x45\xec\xdf\xff\x0a\x82\x7f\xff\x8b\x51\xff\x30\x3c\x54\xe8\xe7\x5b\xbb\xf0\x13\x75\x62\x6d\xa0\xf0\xaf\x80\xc7\xff\x1e\x96\x98\xbb\x33\xac\xde\x84\x8d\x0c\xcc\x83\x85\xef\x75\xe2\x22\xfe\x41\x13\x12\x20\x84\x48\x9c\xcf\x50\xe8\xc7\xcb\x09\x01\x4a\x6d\xa4\x32\xd3\x51\xd7\x0e\x4f\xb1\xff\xd5\xe2\x0b\xaf\x94\x7d\x87\x4b\x57\x93\x84\x71\x94\x46\xc8\xea\x6f\xa2\x76\xf7\xeb\x74\x13\x34\x49\x42\x89\x55\x32\xfc\x32\x4f\xa2\x72\xde\xd7\xe4\xe7\x22\x89\x35\x8c\x93\xa5\xfb\x18\xa6\x0a\x34\x49\x52\x1a\x38\x4c\xca\x3f\xc1\x3b\x66\x9a\xa4\x04\xd0\x70\xdd\xae\x9e\x36\xbb\xf5\xfe\xf0\xb4\xda\xae\x37\xb7\xdd\xd1\x34\xc1\xbe\x38\xcc\x96\xc8\x61\xdf\x8c\x26\xa9\x8c\x11\xdb\xf1\xf7\xc7\xdb\xfd\x70\x11\xa7\x9a\x60\xae\x76\xb9\xdd\xfc\xbc\xc5\xae\x8e\xc5\xfd\xfd\x66\x39\xe8\xeb\xd0\x44\x70\x83\x44\xe0\xc7\x4a\x14\xcd\x8c\xde\x7c\xdd\x0d\x04\x89\x51\xdf\x4a\xdb\x54\xa4\xff\xbb\x4c\xb5\xa2\x5d\x0d\xd7\xfb\x63\x8e\x8e\xee\x4f\x14\x94\xfd\x25\x24\x8f\x1c\x6a\x08\x03\x26\x2f\x20\xe7\x7f\x42\x05\x80\x6c\x35\x87\xda\x39\x3e\x93\x95\xab\xa8\x05\x7e\xf6\x85\x92\xcf\x7c\x8f\xf9\x35\xa0\x78\xa2\x68\xa7\x9b\x29\xaa\x8f\x8d\xeb\x82\xea\x6e\x40\x2b\xbc\x01\xbf\xf9\xf5\x95\xf8\xc9\x85\x8c\x40\x92\x03\x29\xea\x76\xed\xdd\x66\x6f\x59\xdd\x5f\x45\x07\x0c\xd3\xd9\x3f\x57\x7b\x2f\x3a\xa8\x89\xd6\x21\x76\x02\xc9\xa6\x18\xe6\xc0\x34\x81\x30\xf6\x2a\x02\x85\x82\xbc\xbc\xaa\xdb\x68\x02\xda\x93\x22\x5a\xd5\x09\xc4\x8f\x7d\xb5\x3b\x6a\x62\x68\xec\x54\xb7\x44\x83\x12\xe2\x87\x37\xe2\x7f\xd1\x44\x22\xe9\xf9\x20\x7f\xae\xd6\x6e\xda\x8e\xae\x10\x10\x1e\x69\x32\xe8\x4d\xb5\x49\xca\x61\xf5\xc4\x0f\x4c\x43\xb4\x2c\x7f\x17\xd9\xf7\x72\x38\x2f\x03\xaa\x02\x4c\x61\x40\xf3\x72\x57\xbc\xb6\xa7\x52\x7f\x88\x85\x0c\xb7\xe2\xd5\x6e\xf3\xb4\x68\x4d\xf5\xe9\x2c\x8a\x8f\x1d\xcc\xb7\x39\xea\x80\x25\x94\xba\x1a\x97\xfd\x22\x16\xb3\x37\x7a\x95\x01\x13\x16\xcc\x9f\xd5\x1e\x8f\xd0\x4e\x53\x8b\x09\x99\x9d\x91\x41\x18\xa6\xd8\xdf\x7a\x9b\x15\x65\x57\xa0\xf1\x97\x0b\xc1\xc2\x98\xbb\x7a\xfc\xee\x69\xe7\x8f\x45\x40\xd2\xbe\xdf\xc1\x26\x99\x1f\xc5\x69\xc4\xfa\xa2\x03\x6e\x28\x16\xf8\x1a\x10\xa7\x21\xdb\x93\x3b\x9c\xc4\x1a\x21\x0f\xbb\xa6\x9c\xd5\x45\xf0\xc3\xa4\x05\xc5\xfc\x9e\x35\x62\xf4\x7e\x53\x16\x27\xb6\x92\xb6\xd2\x68\x9d\xc6\xfc\x4e\xce\xd2\x06\xc2\xd1\xce\xfd\x7d\xfd\xf8\xad\xfd\x8f\x3f\x5d\x08\xc1\x69\xa7\x52\x85\x81\xdd\x94\x9f\x7b\xfc\xb6\xa4\x4e\xe5\x88\x27\xee\x1e\x3c\xe1\xaf\x0e\x54\x44\x80\xb8\xbc\xcd\x84\x44\x68\x72\x19\x15\xc7\xda\x97\x89\x6d\x34\xa6\x44\x03\xeb\x76\x63\xd2\xdd\xd5\x94\xc0\x84\xc6\xf7\x4c\x43\x25\x7c\xdd\xf4\xf3\x94\x8c\x0e\xb4\x0a\x98\xf3\x07\x9b\xd1\xcb\xec\x22\x1a\x1d\x40\x94\xa0\x1b\x84\xde\xcb\x67\x5e\x60\x37\x16\x7c\xdf\xe9\xa6\x5a\x0a\xf5\x02\xb7\x50\x63\x90\x0a\x7a\x0b\xe7\xb2\x6a\x1e\xcb\xdd\x4b\xf9\x8e\xb2\x9c\xee\x1c\x13\x4a\xe1\xf2\x69\x8b\x23\x14\x5a\x8c\xa7\x83\x91\x36\x13\xdc\x06\x88\x37\xdd\x39\xca\x66\x30\x1c\x7f\xd9\x35\xfc\xd4\x8e\xa3\x84\xa5\xc4\xa3\x36\x44\xb5\x6b\xc4\x98\x62\x48\x53\x92\x28\x04\x06\x40\xa1\x5d\xc5\x7f\xad\xca\x3e\x9e\xd3\x34\x08\x01\x6b\x08\xca\x8a\xf6\xb8\xed\x6e\xae\xc7\x6d\x3c\x01\x29\x0d\x88\xc5\x2a\xf8\xa4\x70\xfb\xa7\x24\x49\x7d\x13\xb0\x4d\x4d\x2e\xba\x63\x94\x23\x9c\xf8\x04\x79\x59\xb4\x2f\xaa\x3b\x10\x29\x64\xa4\x5a\x96\xed\xff\x75\x5b\x0b\xa5\x89\xc2\xf4\x70\x56\x3f\x64\x45\x73\xdd\x35\xa4\x29\x15\xb1\xf2\x3e\x6d\x1b\x42\x8c\xb3\x5a\x9a\x32\x42\x71\x1d\x6f\xaa\x52\x0d\x2e\xcc\xa8\x8c\x5c\xa1\xc7\xd6\x8f\x1d\x5f\xc2\xf4\xf4\x30\x00\x2a\x07\xc4\x8c\xf7\x23\x99\xed\xf9\xdd\x8c\x86\x91\x55\x52\xb0\xf0\x8f\xa6\xac\xc4\xb1\xdb\x08\xbd\x93\x47\x23\x66\x4b\xa2\x39\xa0\x7e\xe8\xf7\x6c\x08\xcc\xd2\x34\x8a\xe2\x84\x8d\x9a\x9b\x6d\x1c\x3b\xfa\xb0\x31\xd1\x9e\xfc\xbc\x5f\x2f\x6d\xa8\x23\xdb\x59\x70\xa9\x27\xef\x2a\x66\x2c\x75\x86\x1b\xf5\x26\xae\xd7\x01\x8d\x95\xa5\xed\xae\xa1\x39\x1c\x7b\xab\x35\x5a\x50\x94\x47\x1a\x6b\xec\x36\xef\x8f\x84\x07\xd5\xf6\x92\xc3\xf4\xf7\x38\x67\xa9\xf5\x2c\x77\x50\xbd\x4d\x7b\x60\x35\xe5\x32\x0a\x7c\x91\x1c\x5b\x1c\x7a\x32\x12\x4d\xb9\x82\x94\x79\x2f\xd0\xd1\x53\xcd\x2f\x48\xca\x75\xa0\xdd\xbb\xc2\xaa\xd9\x75\x97\x8d\xa6\x09\x15\xce\x64\x37\xea\x65\x87\x9d\x7b\x5f\xca\x22\x6a\x9a\x30\xbb\x03\x38\x43\xfe\x0e\x70\x9e\x13\x3f\xd0\x34\x49\x39\x36\x27\xb4\xfb\xf4\xee\xa3\x68\x5e\xa0\xce\xfe\x87\x1b\xcc\xef\x99\xf8\x32\x68\xa2\x89\x01\xc9\xba\x20\xcb\xd5\xff\xd7\x0d\x78\xc4\x90\xa6\x69\x1a\xda\xa6\xe4\xd6\xeb\xb3\x6a\x31\x4f\xae\x0b\xcd\x0f\x91\xa1\xc1\x1d\x70\xff\x02\x7b\xb0\x2a\x7c\xa2\xf8\xe8\x8e\xc6\x32\xb0\xed\x90\xbd\x78\x44\x67\x4d\xa9\x4c\x62\x66\x5b\xf6\x4b\x7d\x51\xf0\x5c\x64\xcd\x48\x5e\x4d\x53\xc5\x84\xc5\x48\xa1\x18\x9b\x67\x63\xc0\xc9\x98\x74\x63\x1c\x4b\x98\xf5\x1b\x3c\xa7\x71\x77\x14\x82\x04\x7c\x6b\xde\x47\x5e\x0a\x8d\x6a\x4c\xe3\x97\xa8\x00\x50\xa6\xee\x5c\xe6\xb9\xbd\xc3\xf1\x5c\x51\xc6\x36\xfb\x5b\x4a\x9d\x9b\xfb\xe7\x95\xbf\xbc\x66\x96\xb5\x06\x39\x70\xb3\xb2\x98\xb4\x23\x69\xaa\x25\xc3\x5c\x2a\xde\x38\x7a\xcf\x9d\xe0\xfc\xba\x98\x48\x79\xa0\x68\x28\x35\xc8\x2a\x56\x39\x48\x88\x3b\x00\xa9\xc2\x70\xfe\x09\x10\x3b\xd0\x51\xc2\x69\x0a\x4a\xa1\x46\x59\xeb\x9d\xde\x8b\xba\xb9\xbd\x72\x85\x28\x68\x8d\x0e\xaa\xed\x88\xb8\xdf\x2c\x7f\x78\x87\x81\x91\xd8\x5a\x67\xbf\xeb\x58\xa5\xb2\x7d\xf9\xbd\xec\xba\xde\x34\x23\x29\xc5\x46\x0e\xd7\xd9\x34\x0d\x19\x19\x8d\x43\xcb\x4e\x96\x83\x28\xee\xcb\xa3\x3f\x8f\x11\x2b\x52\x8d\x8f\x7d\x70\x14\xef\x75\x77\x34\xe1\x78\xd4\x7e\x37\x4b\x54\x61\xbd\xb9\xf9\x0a\xb0\x66\x2c\xb5\xfd\x27\x0d\xd4\x8d\x13\x92\x6e\x3e\xf6\xd5\x47\xfb\xbf\x9f\x8b\x9e\x6a\xca\xff\x42\x18\x19\xd5\x85\xb2\x8f\xe5\x29\x2b\x00\xba\x9f\x0f\x81\xba\xb4\xbe\xae\xf6\xe5\x5d\x59\x5d\x4e\x13\xee\x1c\xcd\x22\x65\x89\x50\xec\x0a\xb9\xcf\x64\x25\x7e\x9b\xa8\x13\x04\xf1\x55\x47\x86\x66\x11\xf0\xc0\x6a\x22\x36\xd5\x87\xcd\x86\xdc\x4e\x5a\xdd\x34\x8b\xb9\xe1\xba\x13\x22\xec\x68\x01\xfd\x51\xc5\x50\x17\xd3\x37\x2a\x5a\x4a\x8e\xf1\x15\xb8\x09\xbc\x2f\xbc\x2e\xde\x82\xc9\xcd\x27\xc2\x74\xb2\x30\xb7\x20\x2f\xc7\x65\xaf\xf0\xa8\x59\x2a\x43\xdc\xdc\xda\x6d\x6b\xa7\xca\xaa\x9f\xf3\x33\xfc\x4a\xed\x70\x81\x5b\x96\xb5\x04\x98\xc7\x1b\x39\x8d\x4c\x70\x8e\x31\x8a\x40\x98\xaf\x83\x76\xf6\xda\x97\x9a\x09\x49\x11\x4c\xf2\xdf\xee\x0f\x4a\x7a\xea\x5d\x6c\x25\xd9\x98\x5d\xf6\xab\x01\x14\x20\xf7\x31\x7d\x7f\x03\x92\x85\xe8\x94\x2e\xb4\x5e\x15\x4d\xd6\x7c\x0c\xf4\x81\x34\x93\xd2\x7a\x38\x25\x72\x55\xa3\x2c\x1a\xba\xcc\xfd\xe6\xc2\x54\xc0\xd0\x35\x36\xf9\xa5\x7e\xc1\x8e\x9f\x47\xf8\xe5\x77\x3c\xa6\x02\x15\xb6\x66\xec\xbd\xcc\x5f\x47\x05\x09\xcd\x54\x48\x31\x27\x7a\x23\x9a\x26\x87\xdb\xaa\x3c\x61\x16\xb3\x3b\xaa\x64\x3b\xf7\x65\xa6\xc7\xcc\xef\xe3\xdb\x57\x49\x22\x35\x12\xb8\xe5\x4d\x36\x0a\x22\xa7\x03\xd3\x00\xf1\x04\x99\xb3\x63\x7d\x32\x54\x33\x25\x24\xb6\x61\x1e\x9a\x2a\x3b\x1e\xa1\x7a\xfa\x7d\x65\xd5\xb8\x27\xef\x4a\xc9\x08\x59\xae\x75\xd9\xe1\x1d\x5b\x0f\x66\x0e\x98\x31\x3a\x4f\x13\x8d\xcf\x92\x95\xbf\xb2\xee\xf1\x75\xa2\xb4\xe5\xc4\x74\x2c\xc1\xe2\x04\x7f\xac\x6f\xaf\xa8\xde\x35\x03\xaa\xb1\x54\xb5\x3a\x8b\x79\xd9\x82\x2b\xa8\xb9\x66\x10\x11\xe1\x32\xe6\xd9\x9b\xc7\x02\x6b\x06\xb1\x20\x62\x60\x96\xbe\x56\xa9\xd5\x0c\x94\xe5\xc7\xb3\xdb\xe5\xea\x57\x03\xad\x15\x1f\x36\x27\xf9\x81\x60\x3c\x4b\x78\x17\x95\xb8\xad\x78\xe8\x65\x30\x13\x08\x12\x8e\x44\xe4\xc6\xd7\x31\xd4\xc4\xfd\x0f\x3e\x59\xc7\x76\xd4\x88\x3e\x1a\x1f\x92\x84\x63\xe6\xca\x64\x15\x60\x79\xe1\xbe\x3c\x86\xbf\xf9\x83\x22\x80\xd4\x71\xbc\xa1\x2b\x82\x02\x63\x13\x69\x8a\xde\xdc\xb8\xb3\x02\x16\x75\x24\x9d\x97\xfc\x75\x6a\x95\xc3\x20\xe4\x28\xd7\x85\x0a\xd4\x79\x76\x04\xfd\x29\xe1\x7d\x3b\x58\x20\xb0\xdc\xb6\xcb\x6d\x17\xfb\xd5\x81\x92\xc3\xd3\x6a\xbb\x5c\x3d\xee\x2d\x1d\xa9\xbf\x5b\xea\x1c\xb0\xac\x68\xbd\xc6\xf3\xb9\xfb\x6a\x21\x8d\x23\xdc\x26\x3d\x19\xcc\x40\x06\xa2\x3d\x08\x21\x19\x86\xca\xae\xbb\x67\xfd\xe4\xa7\x5a\x18\x86\x31\x46\x57\xad\x71\x59\xdc\xaf\x0e\x7f\xdf\xac\x1f\xf7\x78\x47\xdd\x8f\xc7\x84\x11\xea\x97\x47\x81\xa6\x08\x1b\x61\xfe\x1a\xee\x68\xde\x65\x0e\xe3\x30\x45\x0f\xc2\x66\x8d\x9e\x6b\xa8\x9e\x56\xf7\x9b\xcf\xb5\x2e\x75\x18\x47\xb6\x47\xca\x0a\x84\x2c\xf2\xfc\x26\x2b\xb1\x78\x96\x8f\xb2\x56\x61\xcc\x2d\x5b\x20\xb6\x1c\xdf\x5d\x70\xef\xfe\x14\xe9\xa9\xc3\x38\x11\xbe\x8b\xca\x42\xe2\xea\x61\xc4\x1c\x72\x66\xcb\xda\x7b\x91\x2d\x5f\xb2\x41\xa8\x12\xf2\x28\x41\xd2\xba\x02\xde\x5b\xf7\xa2\xaa\xaf\x25\x4f\xba\x91\x46\xd0\x81\xac\xbe\xd6\x76\x67\xf1\xa3\x87\xab\x20\xe4\x89\x12\x69\xc7\x83\x86\xd9\x46\x95\x9d\x45\xc7\x24\xa4\xc3\x44\xa9\x30\x1a\x62\x24\xa7\xa5\xda\xf1\x05\x53\x16\x08\xe7\x2c\x3f\x67\x45\xd3\xd1\x25\xcd\xdf\xab\x60\x21\xfa\x87\xd8\xfe\xff\x90\x4d\x73\x41\xa1\xd0\x91\xcb\xbe\x28\x28\x9a\xfc\x03\x5d\xb7\x99\x38\x2c\x94\xa9\xb6\x15\xb7\x93\xc8\x4b\x59\xfe\xf2\x77\x2f\x75\xc0\xe5\x90\x70\xea\x67\x56\xc0\xcd\xe5\xc3\x41\xbc\xc6\x17\x51\x91\x42\x2f\xe7\x61\xfd\x78\xb8\x5f\x2d\x6e\x57\xdb\xc3\xdd\x76\xb1\x3c\xdc\x6c\xf6\xfe\x7a\x2a\x51\x48\x8e\xd1\x3a\x33\x7f\x50\x9f\xd9\x0a\x75\x4c\x10\x70\xf8\xb4\x3b\x3c\x6d\xd7\x9e\x38\x4f\x87\x5a\x48\x24\x58\xa9\xcb\xfc\x6d\xa0\x03\x3d\x09\xd6\x42\x2d\x6d\x4b\xf5\x9e\x12\xf5\x57\x74\xfd\x75\x08\x41\x8c\xb8\x91\x2d\x46\xc1\xd5\xa9\x5f\x85\x10\x5a\x61\x67\xf7\xa2\x17\xdd\xdf\x41\x22\x76\x36\xab\x37\x0f\xeb\xce\x2d\x1d\x77\xa7\xea\xd0\x84\x56\xed\x18\xbd\x00\xcb\x2a\x62\x39\x3d\x26\x29\xd3\xd0\x08\xb0\x1a\x68\x2f\x22\xf3\xb8\x1e\x1d\x1a\x63\x15\x16\x84\xd6\x1d\xaf\xea\xd8\x74\x4d\x3d\xa9\x88\xd0\x34\x75\x0d\x1b\x77\x00\x5a\x8a\x19\x59\x82\xf1\xd4\x1d\x6e\x2f\x11\xe1\x86\x0f\xe8\xb8\x3f\x01\xd5\xeb\x88\x48\x82\x84\x58\xf2\xf2\x71\x57\xf6\x62\x0d\xdd\x03\x45\x54\x5a\x52\xd9\x32\xbf\x9c\x72\xd1\xff\xd5\xc5\xa2\xef\x00\x16\x16\xde\x47\x46\x11\x23\x0a\x79\xd3\xbc\x3c\xe9\x50\x06\xb9\x9b\x55\x11\x0b\x6c\xa4\x39\xce\x3a\x8d\x5d\xb9\x88\x45\x94\xf4\x60\x4e\x7c\xf1\xbf\x4d\x2e\x03\x1c\x8b\x5c\x88\x4a\xb0\xbd\x4a\x30\x5f\x2c\xd5\x51\x68\x04\xca\x0c\x74\xb3\x7e\xc0\x60\x37\xce\xb9\x4e\xee\x35\x0a\x29\xf5\x12\x1b\x99\xde\x98\x2d\x2a\x14\xfd\x76\x55\x44\x89\x22\x1e\xf8\x06\x32\xab\xc7\xec\x30\xbc\xf5\xcd\x87\x17\x34\x1e\xce\xd7\x28\xe2\xb6\x07\xf9\xbf\x17\xa8\x3e\x50\x09\xda\x1d\x88\x59\x80\x3e\xf2\xe2\xf1\xe1\xcd\x99\x78\x7f\xa4\x5d\x6d\xbe\xa9\x03\x9b\xe9\xd7\x85\x29\xbb\xe8\x74\x7c\xe3\x1c\x52\x74\xa6\xad\xb9\x5e\xe5\xd0\xf7\x29\xb4\x07\x01\x9d\xfc\x26\x3b\x41\xfe\x67\xb2\x17\x3a\x4a\x20\x66\xce\x46\xe3\x7b\x73\x73\x2a\xbb\xfa\x24\x22\x26\x41\xea\xfc\xef\x2b\x1e\x2f\x3c\x8c\xbd\x4a\xaf\x59\x9e\xdb\xd6\xc8\xc9\xf9\x8a\xc4\x88\x57\xe9\x0b\x76\x1d\x45\x70\x17\x42\xfa\x67\x50\x21\x41\x46\xc8\xd5\xfd\xfa\x8f\x31\x2c\x5e\x47\x2a\xb6\x28\xa0\xae\x96\x5a\xc0\xff\xb2\xda\xa3\x3d\xfd\x20\xc9\x90\x7a\x0f\x29\xd9\xcb\xcb\xf1\xe5\x2f\xf7\xb1\xb9\x0b\xe8\x80\x63\xe5\xef\x61\xf1\xc7\xe1\xf1\xf9\xe1\xb0\xf9\xbf\xfd\x61\xb4\x75\x47\x9a\x59\x51\x84\x63\x8f\x10\xb7\xe2\x7e\x7e\x00\x68\x6d\x98\xeb\x4f\xca\x3f\x66\x60\x62\x3a\x32\x01\x10\xd6\x11\xed\xf8\xdd\xc8\xe6\xc5\x3e\x61\xb4\x1d\x45\xf2\x91\xe1\x34\x8a\xfd\x3a\xd9\x42\x53\x65\xf0\xd6\x99\x39\x8b\x31\xf5\xc5\x80\xc8\xb8\xce\xf4\x53\x56\x74\x22\x2b\xa0\xbf\xa6\xca\xb1\xa7\xc6\x84\x04\x88\xfc\xb6\x3c\xee\xfb\xf5\x6a\xeb\xaf\x1a\x13\x12\x62\x07\x7d\x73\x86\xee\x4f\x3c\xc2\x2f\xd4\x2e\xdd\xf3\x50\x63\x5c\xc7\x24\x95\x18\xb5\xdc\x42\xfe\x7b\xe9\x95\xd5\x97\xa2\xd0\xd8\xdf\xf8\xdb\xe4\x57\x21\x10\x89\xc7\x83\xd8\x52\xf0\x72\xc0\xfb\xa7\xe3\x80\x31\x11\x8f\xf5\x07\xeb\x3e\x39\xef\x07\x25\x56\x92\x14\xd3\xd5\x1d\x93\xf4\x34\xb1\x11\x07\xa9\xc6\xaa\x46\x9d\xb9\xa2\xc7\x53\x55\x1e\x2b\x71\x1a\x47\x4f\x71\x20\x38\x8d\xba\x76\xd6\xec\x74\x39\xd9\x2c\x75\x56\x1c\xaf\x4a\x54\x31\x8d\x2d\xd8\xad\x86\x3c\xff\xf1\xf3\xfb\xe2\x28\xb2\xa2\x6e\x66\xec\x5d\x4c\xb9\xed\x98\xc4\x98\xeb\xc7\x8f\xa1\xe1\x8d\x59\x94\x28\x57\x75\x7f\xaa\x32\x95\x15\xc7\x5d\x53\x89\x06\x8e\x9f\xf6\x3b\x7c\x3d\xb7\x63\x16\xa7\x7e\xd3\x74\x2a\x62\xb3\x5e\x61\xcc\xb8\x41\xe7\x74\xbf\x5a\x3c\x74\xdf\x9b\x99\xd8\xab\xd8\xdc\xdf\xff\x6e\xb1\xd2\x91\x3f\x18\x46\x41\xca\x3a\x09\x16\xcb\x25\x34\xf2\x3b\xfd\x38\x50\xca\xa6\xa2\xef\xca\xea\x5d\xf4\x02\xeb\x3a\x8e\x02\x8d\x2b\xb7\x17\x13\xff\x3a\x56\x8a\xa3\x88\xa0\x4f\xea\xea\x47\x56\xfc\x6b\x6e\xa3\x88\x63\xce\x4c\x34\xa4\xc1\xdd\x18\x9b\xa6\xe9\xbe\x6e\x9c\x26\x56\x95\xab\x8d\xb8\x67\x7f\x37\x99\xfc\x3a\xd7\x32\xf1\x56\xe0\xa5\xdf\x3f\xfa\x01\x49\x1c\x10\xd7\xed\x84\x1f\xfe\xa6\xe3\x77\xd0\x71\x92\x70\xcc\x82\xfd\xf7\x02\x80\xcd\x28\x4d\x76\xec\xe6\x6d\x22\x42\x6a\x3d\xdb\xe6\x52\x15\xa7\xb2\x80\x0f\xe5\x64\x74\xfb\x1b\xf1\x88\x17\x1d\x27\x10\xa2\x79\xbd\x83\xac\x01\x99\x8d\x03\xd6\xa1\x4f\x35\x72\xad\xe2\xc4\x30\xcc\x06\x40\xf3\xf2\xd1\x3e\xb5\xff\xf5\xd4\x30\xaf\x58\x61\x63\xb8\x61\x42\x3d\x16\x42\x53\x1b\x33\x69\xf8\x75\xb5\x94\x24\xb7\xf4\xa4\xb5\x30\x30\x50\x47\xf3\x47\x45\x18\xa5\xce\x0c\x2d\x45\x35\xce\xff\x27\xff\x0a\x1c\x07\x83\x8e\xa5\x0c\x63\xe5\xa7\xa9\x1c\xed\xb0\xb1\xd6\xb6\x30\x62\x05\x94\x2d\x7d\x2b\xee\x07\xde\xc3\x89\x21\x90\x91\x8d\xcf\xda\xe5\x79\x03\x45\x76\x2c\x26\xf7\x09\x4c\x7a\x02\xa5\xc7\xbb\xfd\x57\xdd\x1a\x3a\x06\x65\x15\x65\x7a\x60\xeb\x2d\x34\x22\xcb\xeb\x61\xde\x26\x06\x03\x48\x9c\x76\x9b\xd5\x6a\x10\xcf\xc4\x26\xb4\x55\x33\x2c\x40\xbc\x95\xd7\x2e\x51\x6c\x22\x8a\xd8\xc7\x65\x79\x39\x97\x85\xf7\xb1\xbc\x5f\x47\x7b\x4f\x92\x4f\x60\x98\x83\x63\xdd\xa5\x2c\xa5\x9d\x83\x6c\x41\x97\x0b\x18\xef\x1d\x9c\x24\x01\x73\xb2\x00\x7b\xa8\x4e\x35\x16\x88\x0b\x5b\xe2\x1c\x21\xee\x34\x27\x32\x44\x06\xa5\xef\x1d\x25\xc1\xe8\xee\x39\x31\x21\x56\xcd\x54\xd6\x64\x30\x14\x9b\xd2\x3c\x90\x11\x76\x01\x61\x13\x28\xa8\x17\x51\x64\xf5\x3c\x3e\x5c\x73\x4a\x08\xd6\x54\xaa\xd6\x28\x25\xe3\x16\x20\xcd\x29\x23\x03\x4c\xd7\x4c\xdb\x9a\xe6\x54\x04\xc8\x34\xb8\x2f\xab\x4b\xbd\x1c\x06\x17\xe3\xfb\xa5\x60\x0b\x59\x96\x9f\xb5\x7d\xde\xa1\x3e\x81\xe6\x2c\x8a\xd1\xf2\x39\x0d\x90\xc7\xee\xef\x69\x88\x91\xf5\xba\x40\xae\x9d\x8b\xc8\x3b\x49\x4b\x37\xc2\x2b\x47\x2e\x4b\x2f\x88\xaa\x79\xc8\x6d\xe1\xad\xaa\xc5\xef\x96\x5b\x72\x40\xfd\x3a\x03\x49\xd7\x3c\x14\x01\x52\x90\xaf\xf6\xdf\x0f\xb6\xff\xdc\xa2\x58\xfc\x15\xa3\x98\x28\x31\xf2\xa5\xbc\x74\xc6\x8d\xa8\x41\x6f\x0a\x4c\x81\xce\x4f\x65\x1e\xc9\x04\xdb\x85\x3a\x7f\x19\x71\x2a\xcb\x2b\xc6\x44\xcd\xe3\x20\xb0\xea\x9e\x1d\xd3\xac\x75\x2c\xc6\x3e\x83\x1f\x1c\x02\xf6\x04\x36\x53\x8d\xe2\xc9\x5d\x5c\xf5\xca\x7c\xa5\x91\xab\x39\x4f\x49\xa4\xfc\x6c\xce\xcb\xea\x01\x1a\x81\x22\x63\x73\x01\x39\x4f\x88\x55\xa4\x6e\xcd\x71\x66\xc9\x42\x87\xdc\xef\x9a\x27\x54\x63\x5f\x80\x6d\x03\x77\x7f\x4c\x09\x13\x6e\x4f\xdb\x83\x38\xdd\x55\xe5\xe9\x1e\x84\x86\x4a\x96\xbe\x33\x70\xd4\xe0\xdc\x9e\x91\x62\xa8\xfe\x0a\x1f\xeb\x93\x38\xc2\x73\x0d\xda\x81\x74\xfc\xc3\x79\xd0\x16\x4f\x5d\x5d\xf7\xd8\x46\xf2\xc8\xf9\xe7\x0f\x30\x85\x75\x0c\xd9\x1c\xbb\x3f\x29\x8a\x19\x0a\xff\xa6\x11\xec\xe0\x8e\x89\x40\x62\x1f\xa1\x29\x2b\x99\xe9\x5b\x38\xe7\xe5\xc7\xe4\x1b\x08\x19\x60\x2b\x83\x7a\xc9\x2e\x3a\x3b\xbc\x95\x8d\xf8\x5f\x56\x16\x59\x77\x09\x65\x03\xaf\xbd\xe7\xf7\xef\x0e\x18\x96\x58\xd2\xc2\xae\xa3\xf4\x06\x9a\x77\x80\xc2\x92\xc6\xb9\x61\x8a\x70\xec\x1a\xf1\x3a\x37\x6d\x94\x9c\x15\xc7\x39\x7c\xb5\xe6\x2a\xb4\xb4\x9d\x2a\x93\x50\xdd\x97\x4d\x03\x55\xf7\xc6\x95\x30\x18\x51\xe5\xe5\x87\xc8\x9b\x8f\x8e\x16\x41\x73\xcd\xd3\x30\xe9\xb5\x51\x4c\x59\x9d\x40\xbb\xb6\x38\x8f\x1a\xe3\x10\x48\xe4\xd7\x35\x13\x82\x78\xcd\x4d\x1c\x04\x7d\xbb\x95\x2f\xdf\x8d\xe6\x88\x51\x16\x42\xe1\xc4\x30\x87\x71\x03\x37\x10\x20\x9f\x2f\xe2\xb7\xc6\x80\xf0\x41\x6a\x98\x1b\x90\xac\x17\x77\xf8\x59\x16\x1a\xae\xe5\x5e\x35\x37\x46\xcb\xc4\x09\x64\x55\x7a\xf7\x51\x37\x70\xb2\x0c\xa7\x33\x51\x5d\x42\xa2\x08\x1b\x18\xac\x37\x7b\xb3\xd9\xdf\x64\xd8\x2c\x34\x24\x95\xfb\xdb\xac\x62\xef\x1c\xed\xbd\x4e\x48\xca\x7d\x59\xfe\x9f\x20\xaa\xb5\xf6\x79\xa2\x24\x20\xb6\x52\x9a\x77\xdc\x3f\xe3\x4e\x3d\x3f\x2c\xb0\x1d\x5a\x58\x35\x3e\x57\xf0\x56\x5e\xc9\x22\xea\x24\xa0\xc0\x7b\x8d\x29\xd4\x7a\x9c\x7a\x9f\x56\xbe\xc4\x8f\x0f\x35\x56\x0e\xbe\x89\x13\xfc\x31\x9c\x83\x09\x8d\x6c\x4d\x41\x89\x02\x51\x2a\x9f\xd2\xea\x8c\x1f\x93\xa6\x04\xd1\x26\x0f\x50\xbe\x0f\xf6\xdc\x84\x8a\x28\xb5\x54\x90\xe8\x93\xbb\x84\xc0\x80\x62\x48\x27\x2c\x0d\x22\xe8\xa6\x73\xdf\x3f\x3d\x61\x2e\xf6\xa3\xb5\x20\x5e\x22\xa9\x53\x1d\x1b\xdf\x0b\x33\x16\xc1\xfe\x8f\x0b\x5c\x30\xf1\xfa\x20\x3e\x6e\xc0\x29\x23\x7f\xdc\x56\x65\x01\xcb\xb2\x29\xaa\xd2\x7b\x43\x49\x48\x6d\x0a\xaa\xca\x94\xa8\x74\x26\x8a\xdf\xcb\x8b\x7a\xe9\xdc\xe1\x24\x0a\x03\x5c\x0e\x56\x53\xb2\x63\x46\x1f\xff\x6c\x24\x03\xc1\x5d\xb9\xc8\x61\x9d\x27\x23\xe2\x98\x69\xd7\x19\x71\x73\x41\x45\x3d\x34\x44\xe3\x07\x8c\x21\x4c\xb5\x8f\x94\x0e\x59\xed\xf2\x2e\x93\x51\x9c\x86\xd8\x8b\xf6\xf4\x63\xec\xb9\x8d\xbd\x8b\x84\x87\xc2\x4a\x71\xe5\x36\xcc\xcc\x4e\x70\x57\x56\x36\xb4\x1a\xb2\x11\xe9\x84\x1b\x8a\xc1\xc0\xe2\xf6\x8f\xa1\x55\x4e\x12\x6a\xf9\x72\x2b\xf1\xbe\x73\x82\x2d\xb3\x8d\x33\x3a\x49\x45\x8a\x0d\x76\x80\x70\xe5\xf5\xe9\x2c\xb2\xaa\x23\xf5\x9f\xb0\xed\xf4\xab\x38\x49\x75\x80\x15\x85\xfd\xf7\xf5\xf6\x76\xa4\xa9\xa8\x13\xa1\x12\xac\x45\x2a\x71\xbe\x15\x1f\xb4\xff\xb3\x0a\x1d\x4b\xce\x04\x8c\xe0\x07\x00\x0d\x9d\x9f\x88\x31\x36\x98\x66\x5d\xfc\xc3\xa7\x0c\x13\x49\x52\x74\xab\x57\x8f\x37\xa3\xb9\x2f\x65\x8c\x61\xc4\x40\xf0\x10\xb9\xde\xc6\x17\x97\xca\xc4\xba\x4f\x76\xdb\x2e\x68\x9c\x10\x03\x13\x98\x48\xa0\xe8\x6c\x76\x69\x4f\xfb\x4b\x5f\x99\x0a\x15\x1b\x08\x31\x6e\xfb\x35\xdb\xdd\x35\x59\x09\x3a\xb4\xdd\x6d\x0f\xe5\xc7\xe6\xdc\x06\xd5\x75\x5f\x27\xb2\x43\xda\x35\x19\x78\xa8\xf8\xa5\x29\x8d\x99\xa4\x3e\x52\x12\x52\x4c\x29\x6c\x9e\xf6\xcb\xe1\xab\x48\x49\xac\x30\x60\x72\x16\x3c\x2f\x0b\xf8\x6d\xde\xdc\x4d\x6c\xe1\xe4\xfa\xb1\xe5\xda\x38\xfb\xbc\x8a\xc7\xcf\x06\xff\x8a\x7d\x88\x91\x92\xd4\x66\x2a\x32\x55\x7e\x2b\xbb\x10\x25\x25\x22\xb6\x8c\xe9\x79\x5e\xbe\x5b\xe2\xd3\x1c\x4b\x8e\xa3\x89\x9b\x06\x41\x9a\x72\x47\xd8\xfd\xd9\x1b\xfb\x92\x6f\xbe\xbf\xdb\x80\x31\xcc\x15\xdd\x6f\x96\x36\xf8\x5f\x6e\xd6\x8f\xdd\xef\xc4\x89\x48\x7d\x17\x91\x99\xbc\xc7\x80\x73\x9c\xfb\xf7\xe5\xf1\xa1\x7c\x83\x07\xa1\x61\x12\xf6\x5d\xfd\xb7\x3b\x93\x52\x11\x5a\x9b\x50\xf5\xa5\xca\x94\x32\x91\xfa\x0f\x07\x45\x53\xcf\x11\x7a\xf8\xa1\x11\x47\x4c\xed\xf9\xad\x39\x9c\xf3\x53\x73\xe8\x6a\x61\x87\xac\x38\x74\xd2\x4a\x3a\x65\x24\xc4\x6c\xf3\x29\x2b\xfa\xe6\x54\x0b\xc1\xf2\x23\x28\xc3\x36\x3a\x29\x8a\x57\xa8\x56\x8e\x88\xd1\x1f\x4c\x19\xaa\x91\x65\x45\x2f\x36\x3a\x17\xcc\xa6\x4c\x6a\x39\x94\xe1\x6b\x0f\x22\xcc\x7f\x34\x7d\xd3\x50\x25\xe8\x8f\x9f\xab\x0c\x43\xf2\x49\xb6\x3f\x8d\x12\x8b\x15\xce\x6a\x64\x8c\x7d\xbc\x20\x6f\xab\x9b\x3d\x6e\x0c\x17\x04\xd3\x5e\xe2\xd2\x94\x5d\x52\xe9\x6e\xc2\xab\xae\x53\xae\xe2\xc0\xc1\x1b\x5b\xf7\x6f\x42\x82\xa0\x53\xae\x19\xe2\xee\x8f\xd9\x1b\xd8\x96\x48\x7f\x24\xa5\x0c\xb3\x3e\xa2\x3e\xfd\x25\xa9\x31\x9d\xa6\x61\x84\xf8\x74\x17\xb4\x20\x93\xf9\xa4\xfe\x90\xa6\x82\xa3\x16\x4b\xd3\x4b\x19\x8e\xc2\xb5\x34\x55\x04\x05\x30\x9e\x77\xb7\xfb\xe7\x9b\xd5\x08\x14\x91\xa6\x2a\x1e\x0a\x0f\x2e\x45\x35\xec\xb1\xf7\xf3\x4a\x84\x10\x8f\x39\x97\xae\x33\x9f\xa9\x0c\xad\x54\xd9\x80\x1d\x2b\x83\x5c\xbb\x94\xf0\xa2\xd0\x7b\x84\x48\xf9\x5f\x96\x09\xc7\xec\xc6\x20\x3b\xed\x8f\x80\x55\x19\xed\x28\xfb\x3e\x11\xd2\xd3\xa9\x34\x04\xef\xfe\x60\xcb\x91\x8e\xc9\xf8\x2a\xe0\xef\xde\x95\x34\x0c\xab\x97\xa7\x6c\x90\x86\x1d\x5d\x11\x68\x40\x89\x9b\x98\x4f\xa2\x12\x7f\x9a\x8f\xfb\x32\xcb\x9a\x42\x64\xa4\x63\x18\x6d\xa7\xff\xae\x11\xaf\x83\x32\xda\x78\x62\x41\x62\xf5\x35\x76\x2f\x1d\xa7\x85\x4e\x4d\x40\x11\x39\x9c\xd5\xff\x84\xd6\x74\x75\x7f\x8f\x13\xcc\x12\xb7\x9e\x8b\x4b\x2d\x74\x49\xca\xd4\xb4\x2f\xd7\x96\xca\xce\x57\x9d\xaf\x5a\x10\xc2\xb1\x92\xb6\xf8\xd1\x06\x0d\xb8\x5e\x82\x3f\xf3\xcc\xe6\x9f\x4f\x10\x16\x62\xbc\x93\x5f\xd4\xeb\xc7\x0e\xde\x50\x4e\xc1\x5b\x53\x41\x12\xab\xca\x65\x01\x8e\x53\x3f\x53\x10\x15\x07\xda\x97\x9e\x7b\xf9\xf1\xf1\x20\xca\xac\x68\xec\x11\x0a\xa8\xb3\x21\x5d\xb6\x16\x34\x66\xe0\xd5\xa8\x3b\x9d\x7a\x2d\x28\x17\x58\x8d\x44\xb2\xb8\x5d\xd6\x0c\x5c\xf3\x49\xae\x4f\x84\x29\x60\x51\xaa\xa9\x40\xd4\x97\xaa\x9b\x83\x22\x4e\x8d\xe8\x34\x20\xc6\xc8\x0b\xc1\x63\xc0\xa2\xa8\x83\x82\x7d\xcb\xcc\x28\xf2\x12\x3c\x89\x10\xd7\x09\xaa\xb4\x01\xc2\x28\x13\x21\xb8\xe3\x7d\x50\xe5\xe9\x9c\x67\xb8\x36\x46\x09\x69\x91\x90\xd0\x86\x22\x87\x87\xa1\x75\xed\x0e\xc7\xca\xda\x32\x07\x30\xd8\xc2\x5b\xf9\x0a\x4b\xa8\x26\x5d\x3b\xfd\x3e\xe5\xd5\x7c\xfa\xe7\x4e\xa9\xc6\xa6\x96\x55\x55\x95\xd5\x43\x7d\x1c\x3f\x60\xea\x78\x68\xb1\x88\xfa\xcd\xbe\xf8\x2d\xa8\xec\x9c\x41\x9f\xaa\x17\xa9\xb0\x90\xd1\x9f\x1f\xff\x2b\x0b\xdb\x3c\xe6\x0f\xb5\x5f\x06\x4d\xce\x39\x2f\x85\x7e\xde\xde\xcf\x86\xf6\x42\xa4\xa1\x86\x1e\xa3\xa0\xf5\x44\x76\xc9\x0f\x53\x26\x18\xea\xe4\xa2\x57\x6f\x99\x2c\xc7\x73\x45\x06\x5d\x46\xcf\x59\x20\xe7\xd1\x8d\xe8\x29\xe7\x6d\xad\x90\x51\x8c\xa4\xcc\x07\x07\xa7\x19\xd6\x3a\xbb\xb0\xa7\xf3\x34\x85\x22\xc4\x7e\xc5\xcb\x79\xdc\x82\xaa\x85\x62\xc2\x53\x77\x1f\xa0\x99\x40\x9f\x84\x4a\xed\x32\xaf\xa1\x59\x34\x2e\xd5\x33\x12\xc6\x9f\xd5\x31\xd2\x42\x49\x50\xae\x62\x09\xcd\xcb\x24\x32\x17\x4a\xdb\xce\x67\xcc\xa9\xf8\x4e\xb0\xf1\x05\x34\x0f\xfc\x72\xbb\xcb\x0a\xdf\x03\x39\xf4\xf4\x30\xd4\x1b\x3f\x8b\x06\x8a\x21\x57\x1b\x62\x94\x65\xdd\xf4\x2b\x04\x98\xc4\xf4\xe6\xb9\x2a\x4b\xb3\x31\xbb\x0e\x93\x2b\x20\xb1\xcd\xb4\x99\xa7\xcb\x59\x17\x37\xb9\x50\xaf\xe8\xfe\xce\x34\xf5\x6a\x01\x9a\xb1\x60\xac\x9e\x6a\xb9\xed\x27\x8f\x00\x9a\x73\x0f\xaf\x5c\x96\x85\x12\x8d\x83\x8f\x33\x6a\x19\x0a\xdd\x38\x13\x44\xc8\x6a\x21\xa4\x3a\xb4\x96\x7c\x44\x1f\xa7\x85\xa1\x14\xed\xc6\x29\x2b\x2e\x4d\x97\x20\x97\x24\x24\x98\x01\xc2\x52\xc1\xef\x59\xd5\x5c\x44\xee\x63\xaf\xd9\x3e\x38\xc9\x02\x8d\xc5\x05\x27\x3b\x3d\xf2\xca\x71\x64\x34\xef\xdf\xfe\x05\x6f\x57\xb2\x88\x7b\x8a\xb4\xdf\x91\x65\xe5\xae\xac\x96\xd7\xf0\x6a\xc9\x52\x85\xd5\x9b\x4b\x6d\x91\x6f\x98\xd0\x15\x03\x4a\x75\x37\x2e\x24\x96\x16\xa5\xbc\x34\x75\x23\x10\xe7\x33\x97\xf4\x93\x21\x67\xd2\xea\xd0\xd6\xd0\x3c\x7c\x0c\xd2\x55\x32\xd4\x56\x23\xc1\x82\x2b\x8e\x3e\xc5\x25\x23\x41\xd0\x9a\x54\xe0\x12\x30\xee\xef\x5c\x92\x38\xea\x52\xfa\xb7\xa2\x11\x96\x2d\xa1\x3b\xae\xad\xa1\xdb\xaf\x96\x5f\x39\x81\x32\x61\x1c\xbf\xd7\x37\x5f\xac\xcf\x33\xf5\xda\x7d\xb6\x24\x65\x88\xc9\x7f\x12\xd5\xeb\x72\x06\x7d\x32\xba\x54\x1a\x58\x8e\x64\x25\xce\x23\x72\x32\x2d\xd3\x24\x56\xed\x9c\x79\xcc\x4a\x99\x5d\x4e\x43\x8b\x2e\x85\x8c\xb0\xcc\xf4\xf4\x7c\x73\xbf\x5e\x22\xf2\x6b\xf5\x78\xbb\x5f\x3f\xac\x76\xfb\xc5\xc3\x53\x37\xcc\x70\x4c\x8c\x7b\xcb\xec\xf9\x73\x3f\xa9\x40\x48\x19\xc4\xc6\xad\xc8\x55\xf3\x32\xa7\x37\xac\xa5\x8c\x04\xe6\xc5\xdc\x44\x7c\x84\xf7\x69\xab\xd1\x97\x1e\x88\x94\xa9\x41\xd4\xeb\xf3\xe3\xdf\x9f\x77\xfb\xf9\x90\xf1\x6f\xd7\xf6\x4d\x2a\xd7\x22\x75\x80\xa2\xdd\x18\x1f\xe1\x1d\xd7\xa3\x3f\x1a\x92\xbe\xa7\xc6\x95\x7a\x7b\x26\x73\x2d\x55\x1c\x61\xc1\xc2\x26\xbe\xaa\xf1\x06\x27\x55\xca\x50\x08\xef\x26\x87\xba\xce\x8a\xa3\x65\x3f\xc9\xed\x66\xe8\x07\x61\x0b\x48\x07\xd7\x6d\x3f\xec\xf0\x6b\xe9\x44\xeb\xa4\xcb\xf8\xad\xdd\x0b\x9f\x77\x13\xa5\x4e\x23\x0c\xb2\xcb\x76\xf6\x65\xff\x83\x03\xa2\x38\xa6\xf3\x04\x97\xcb\xb4\xcd\x41\xb6\xfb\x1c\xb7\x41\x27\x14\x8d\xa3\x63\x1f\x7f\x46\xad\x02\x74\xb0\x25\x06\xf9\xf5\xb5\x0c\xbc\x96\x86\x70\x5c\x09\x2f\x9d\x85\x75\x30\x9b\xb4\xe3\xdc\x1c\xf3\x4e\x05\xdd\x99\x01\xb7\x59\x8b\xf2\x74\xbe\x34\x80\x96\x1b\xdd\xc8\xf1\x2f\x28\xc2\x83\x4e\x55\x6d\x48\xca\x3c\x0c\x05\x54\x90\x32\xf4\x97\x5b\xfb\xc9\xee\xb0\xd6\xe5\x8e\x50\x42\xb1\xad\xd0\x8a\x0c\xcf\xb6\x08\x2b\x1a\x12\x74\x3c\x6c\xf9\xf2\x01\x09\x18\x1e\x4b\x0d\x9f\x40\x10\x15\xe5\xd4\xc0\x40\xe1\xe5\xf7\x32\xbf\x9c\x40\x8a\x1a\xac\x66\xfb\x16\x65\x83\x2a\x24\x09\x66\x93\xc7\xa1\x29\x45\xb8\x48\xf3\x79\x7b\x9f\x62\x91\x7d\xef\xf7\xe5\xf1\xe6\xf2\x29\xbd\x86\x1f\xcc\x55\x62\x3b\xcc\xd4\xa5\xca\x9a\x8f\xe5\x0b\xa8\xd7\xe7\xed\xda\xbf\x00\xa6\xff\x1f\x6b\x6f\xd6\xdb\x38\xae\xed\x8f\x7e\x97\xfb\x54\x17\xd8\x0f\x9a\x28\x8a\x8f\x9e\x92\xf2\xe9\x0c\xee\xd8\xa9\xea\x7d\x36\x0e\x0c\x0e\x8b\x8e\x76\x64\xc9\x5b\x92\x93\x72\x03\xf7\xbb\x5f\x68\x91\xd4\x64\xb9\xaa\xce\x1f\xff\x97\xee\x42\x44\xcb\x96\x44\x91\x6b\xf8\x0d\x89\xa2\x56\xbb\x6d\xc7\xab\xf7\xb5\x0b\x27\x65\xe4\x45\x08\xa4\x3d\xf2\x1f\x38\xcf\xa0\xc2\x58\x7e\xdf\x1e\xa7\xc6\x40\x9b\x2b\xf5\x02\x72\x57\x60\xa5\xf0\xc6\x2d\x89\x12\x8a\xb3\xe9\x0e\x9d\x7f\x4d\x7a\xf3\x73\x31\x40\x25\x23\x11\x86\x49\xdf\xa8\x1a\xc1\xc3\x55\x9f\x35\x33\x56\x0c\x51\x32\x92\xa1\xa9\xb4\x59\x49\xa3\xa1\x15\xb7\x92\x44\xe8\xc0\xd4\x78\x91\x39\xb4\x2b\x8c\x93\xa3\x3d\x1a\xfb\x0a\xe1\xd9\xb2\x18\xd9\xcb\x29\x19\x87\x12\x9b\x37\xfc\x54\x16\x82\x97\x8f\x90\x57\xfc\xdf\xe3\xfa\xc4\xe0\xa7\xc4\x44\x1a\x19\x99\x9a\xbf\x23\xff\x74\x64\x46\xaa\x64\xcc\x02\x66\xec\x79\xd5\xbf\xcf\x55\x6d\x33\xd4\xe9\xbb\x91\x30\x4d\x4d\x6c\xba\x29\x3e\xa1\x7c\xd6\xa8\xe6\xfe\x95\x67\x1f\x63\x4c\xa5\x64\xb1\x11\x8c\xfa\xf7\x92\x67\xd9\xa5\x57\x48\x96\x2c\x31\xcc\xab\x2e\x50\xc4\xcb\x7f\x41\x76\x0e\x26\x92\x19\x6a\xfa\xb4\xcb\xa1\x64\xcc\x8b\xa3\x81\x21\xfd\x53\x51\xf3\x91\xaa\x98\x92\x4c\x79\xc8\xa5\xd9\x41\x06\x87\xd2\x89\xde\x2a\xc9\x80\x62\x45\x7b\x5f\x7c\xe6\xd7\x30\x51\x29\x62\xcf\x54\xa7\xb0\x74\x3f\x50\x9d\x56\x52\x50\x62\xec\x2f\x8a\xbc\x2e\xcf\x18\x2f\x36\x5b\x69\xbf\x4b\x2d\x85\xf2\xd0\xf4\x6f\x6f\x42\xe9\xc7\x34\x77\xd3\xc3\x65\xf2\xff\xe8\x77\x5b\xa4\x23\xa4\xde\xf3\x1a\x3e\xf9\xc5\xd0\xe1\x4c\xb7\x4b\xf5\x2f\x5b\xc6\x02\x42\x97\x4a\x81\x9a\x90\x47\x51\x52\xea\xc8\x94\xdc\xcd\x0a\xb5\xe8\xd9\x6c\xae\x8f\xa7\xac\xdf\x6b\x6b\xbf\x5f\x79\xdc\x37\x99\xe1\x0b\x02\x06\xab\xa1\x2c\x85\x54\x71\x84\x25\xab\x55\xfd\x36\xcb\x5b\x8e\x91\x54\x49\xcc\x85\x13\xd6\xa9\x47\x71\xb7\x04\xaa\xf1\x87\xfc\x97\x35\x9e\x3b\x41\xfe\x0b\x3f\x1a\x25\x21\x31\x7e\x1c\xd8\x10\x69\x42\xa7\x2b\x2b\x87\xdf\xcb\x84\x25\x30\x12\x1b\x19\x96\xba\x99\x3f\x39\x58\x63\xef\xae\xc9\xff\xaf\x7e\xc7\xdf\x95\x24\x24\xf0\x10\x4b\x76\x3a\xfd\x61\x90\x2b\x8f\xa9\x52\x19\xe4\xbc\xe7\x5a\x32\x78\x9d\x9a\x18\xb8\x99\x0e\x7f\x14\x7f\xff\xbd\x29\x8b\x7f\x83\x1c\x64\x9f\x52\xfb\x46\xab\x78\xfb\xbc\xec\x55\x1c\xa5\x8e\xb5\xd3\x2e\xdf\x15\x27\xdb\x45\x1b\xd1\x8d\xcd\x50\xe5\x05\x0c\x09\x69\x4e\x4b\x55\xa9\x5f\x51\x3a\x95\x97\x98\x42\x8c\x93\xa0\xdf\xf6\xa1\xb9\x83\xe9\xa2\xfc\x40\xe2\x53\xba\x01\xff\x56\x3e\x8f\xb0\x45\xd5\x7a\xc5\x34\x4f\xa6\x6f\x88\x3b\x94\x41\xb7\x9f\x0a\x22\x02\xd0\x13\x18\x79\x48\xf3\x77\x8b\xe6\xfa\xe2\x86\x68\x53\x4a\x69\xc2\xb6\xfd\xe3\xeb\xc3\x6e\xbd\x79\x58\xaf\x5e\xdc\xe1\x90\x27\xd4\x20\x3c\xd3\x16\xce\xa3\x42\xae\xb1\x54\x82\x72\xc9\x25\x57\x57\xeb\xfa\xaf\x66\xc7\xb0\x91\x32\x4c\x1f\x54\x28\x7d\xee\x0f\x7a\xfe\x3b\x8b\xf0\xfc\x3d\x10\x9f\x0a\x21\xc4\x92\x9b\xf5\x30\x9e\xec\x5f\xa8\x10\x8c\x1f\x95\x51\xf6\xd8\x00\x94\x2f\xf0\x91\x82\xdb\x0a\x54\x14\x40\xd0\xca\x54\x3e\xef\xe6\x57\xb1\xf8\xf5\x9a\xae\x22\xad\x8c\xac\x24\xe4\x3c\xab\x2f\xcb\xb4\x12\xe7\xb2\x1a\xc9\xcb\x2a\x45\x92\x00\x6f\xdf\x91\x57\xd5\x86\x5f\x6e\x71\x49\x55\xcc\x9d\x10\x37\x57\xd8\x91\x6c\xcf\x10\x2b\x8d\x9b\xc7\xf1\x9c\x05\x56\xfb\x70\x74\x79\x54\x25\x56\xb0\x41\x66\x69\x7e\x03\x21\xa1\x92\x38\x71\x28\x82\x5d\xc9\x9b\xec\x61\xfa\x8e\x26\x9c\x86\xa1\xbb\x19\xcd\x96\xe1\x8a\xe5\x6e\x39\x56\x09\x28\x5c\x31\xe6\x68\x5d\x2d\xe1\x5a\xbf\x72\x72\xa5\x51\x2c\xe6\xe0\x02\xb9\x66\xd3\xec\x91\x71\x8a\x6b\x3d\x56\xfb\x21\x1e\xaa\xc4\x42\x79\xbf\xa5\x12\x4e\x25\x54\xa9\x82\xbc\x86\x25\x3c\x42\xc5\xaf\xa8\x0c\x37\xce\xa2\x4d\x2c\x8f\x1d\xac\xd3\x09\x4a\x9b\x6a\xf0\xc3\x0d\x9a\x87\x12\x91\xa1\x57\x1b\xc2\xd8\x4f\xfa\x4c\x4a\x50\x40\x69\x95\x23\x37\x01\x3a\x6e\xef\xe3\xad\x58\x09\x29\xb9\xd1\x6e\x3c\x57\xb0\x77\xb4\x22\x25\x23\x63\x5d\x79\x00\x64\xe2\xa8\x59\x55\x41\x3d\xb0\xf6\x57\x4a\x12\x82\xfc\x8d\x79\x5a\x7f\xe5\xe7\x76\x62\x34\x5b\x9e\x63\x1f\xce\x2f\x0b\x0b\xa3\x9b\xbe\xf5\x52\x9a\x8e\x6b\x5a\x0f\x54\x4b\x94\x12\x21\x16\xf9\x66\xf5\x1b\xe4\x0e\x32\xaf\xb4\xa7\x91\xc3\x06\xf5\x1b\xfa\x9a\xaa\xf6\x80\x1f\x8b\x26\x78\x5b\x3f\xed\x56\x2f\x77\xb3\xc5\x6a\xbf\x5d\xdf\x3f\xcd\x76\xaf\x2f\xab\xfd\xea\x65\x41\x03\xbf\x1d\x19\x01\x06\xe3\xfb\x13\x97\xef\x8b\xe2\x28\xd2\x1c\x14\x8a\xef\x56\x3d\x7d\xd5\x5b\xff\x73\x27\x01\x49\xdb\x96\xd5\xad\x86\x81\x19\x0b\x5e\x44\xd0\xc0\xfa\xeb\xf3\xf2\x81\x0f\xde\x41\xf0\x68\xe0\xdb\xf9\xda\x43\xa7\x83\x47\x0d\x3a\x5d\x18\x02\xbd\x69\x19\xec\xdb\xa3\x3c\x8e\x54\x0b\xd6\x4f\x73\x0b\xd7\x3f\x19\x0d\x29\x37\xca\x0f\x68\xdc\x69\x9a\xb5\x4e\xf4\xc3\x9f\xe6\x53\xf3\x46\x29\x38\xa6\x15\x2c\x56\xcf\xe3\xe3\x00\x91\xe1\x05\xa8\x19\x1a\x46\x99\x76\x78\xdf\x9c\x78\xf8\x81\xc0\x13\x08\x22\xac\xd3\x53\x37\x8f\xad\xf0\x80\x1d\x12\x46\x0a\x25\x96\x9d\xef\xd5\x34\x7e\xc1\xad\xc3\x10\x4a\x23\x13\xf3\x74\x96\x19\x9c\xab\x6f\xa9\x11\x54\x2a\xfb\x66\x0e\x0a\xa2\xc8\x13\xc2\xa9\xdb\x5e\x8a\x73\x8d\x5d\xa4\x66\x3e\x55\x03\x9f\x48\xb7\xb5\x43\x44\xc2\xc8\xc4\x8c\x68\x63\x3c\xbd\x1f\x42\x14\x0b\x5c\xfb\xf6\x15\xd4\x7e\xfb\x5d\x22\xc4\xbe\xbd\xc9\x9f\xd1\xd0\xa8\x7d\xa0\x91\x62\xae\xa7\x30\x3b\xd7\x85\xa9\x6d\xda\x63\x44\x72\xaa\x2c\x10\x6c\x09\x1f\x43\xf7\x67\x37\x06\xfc\x00\x93\xc0\xfd\x2c\x57\x25\xb4\x9d\x70\x88\x43\xe3\xed\x69\x60\x97\xd6\x0e\xc1\x04\x25\x43\x8b\xf7\x21\x6c\x76\xbc\xee\xb9\xb3\x71\xd3\xb9\x3b\x35\x8b\x64\xcf\xc5\xea\xe7\x6b\x15\x50\x69\xac\x47\x9d\x2a\xdc\x5e\x20\xbe\x60\x74\xd3\x92\x90\xe3\x28\x4c\x0f\xab\xbb\xa2\xec\x1c\x26\x14\x30\xcf\xcc\xb8\x26\xb8\xc4\xae\x7a\x9a\x1f\x56\x95\xe4\x27\xd8\x15\xfd\x98\xb8\x7d\xfe\x2c\x4e\x90\xc5\xb5\x5e\x3c\xef\x97\xb3\x7f\x6e\xdb\x13\x31\xd3\x34\xb6\x9a\x7d\x65\xcf\x02\xdb\x8d\x10\x3c\x1a\x08\xe3\x0d\x2d\x5a\x86\x97\xc6\xa4\xd1\xc7\xfe\x7c\x4b\xe5\xdb\xe4\x5e\x0d\x0c\x88\x41\x5d\x36\xcf\xcf\xf5\x20\xb7\xe7\x11\x8a\x0f\x78\x02\xb6\xdd\x09\x3d\x6e\x3e\x88\xc8\x44\xf5\xbc\x13\xa7\x1a\xac\xa5\xa0\x12\x3f\x94\xad\xb3\x75\x91\x4a\x47\xd8\x18\x5d\x16\x84\xa6\x3d\xbd\xda\x7d\xdd\xef\x1e\x96\xfb\xa7\xe7\xa5\xa3\x84\x01\x44\x5a\xdb\xd6\xb5\xf3\x34\x79\xc1\x82\xc0\xe8\x52\x80\x50\x14\xc8\x7b\x5c\x3f\xe9\x26\x14\xbe\xb4\x27\x20\x12\xdb\x7b\xbb\xaf\xb3\xef\xeb\xa7\xfb\x91\x91\xba\x02\x88\x3d\x30\xb1\x45\x56\x98\x54\xb7\x87\x42\x00\x88\x99\xb6\x50\x47\xcb\xc2\xb6\x07\x34\xf3\xf1\xd6\xbd\xf1\xaa\x6b\x05\xde\xe2\x5a\xf4\xfb\x0b\xda\x8b\x7d\xed\x8d\xf5\x52\x07\xce\xfb\x4a\x7b\x2a\x01\x8b\x27\xdc\x73\x23\x73\xb1\xb7\xf0\xf4\x7d\x7d\x0d\x9f\xd5\x3e\x8f\xc2\xa8\x7d\x81\x07\x7d\x9c\xbb\xa2\xec\x09\xe4\xb6\xe3\x8d\xd1\x14\xe6\x21\xfe\xf4\xae\xac\x43\x5f\x84\xcc\xbd\x1b\xcd\xa9\x76\xbc\x7a\xaf\xba\x7a\xff\xf0\x27\x84\x34\x40\xe4\x60\x9e\x4a\x38\x9c\xdb\xd7\x5c\x87\x82\x21\x46\xa6\x05\x8b\x7e\x83\xaa\x1e\x8b\x1e\xff\xfc\x2d\xd5\xa1\xe6\xc4\xb0\x02\x9a\x37\x63\xc1\x6b\x38\x14\xe5\x08\x27\xaf\x49\x24\x19\x5a\x4a\x14\xcd\x42\xf2\x54\xa8\xf6\x6e\x12\x62\x68\x91\xf9\xf9\xf8\x02\xda\xf4\x8e\xa6\x50\x79\x9a\xc4\x0a\xed\xf6\x3e\x0a\x24\x45\x4d\xbc\x32\x9a\x24\x89\x1f\x8d\xd8\x0b\xa1\xfb\xa2\x38\xd0\xc8\x9a\x33\xf5\xf9\x55\x7e\x68\x22\xc4\x89\xf0\xf6\xd7\x57\x1c\x87\x2c\x94\xed\x5a\xb0\xfa\x91\xe2\xb2\x32\xbd\xe7\x69\x1a\x07\xb8\x55\xec\x56\xb3\xc7\xfd\xec\x69\xb9\x9f\x3d\xdd\xaf\x1e\x86\x78\x24\x4d\x13\x8d\x0d\x94\x73\xde\x44\xfc\x53\x8a\x34\x9a\xb2\xc4\x30\xb9\xb8\x06\x17\x01\x2c\xde\xd2\xec\xb6\xff\x49\x7f\x5e\x27\xe0\xfb\xb2\xc7\x71\x9b\xe5\x07\x68\x2b\x7e\x9a\x51\x29\x82\xd6\x62\xbf\x7d\x34\x9c\x50\x27\x3a\xb3\x2c\xf9\xa7\xfd\x59\xfd\xe5\x52\x73\x99\x60\x5d\x65\xfe\xe8\x44\xda\xb4\x14\x11\x76\xc3\x5a\x0b\xb2\x5f\xa5\x45\xb8\xaf\xf7\x1e\xb4\x22\x22\x0a\xaf\xd3\xe7\x2d\x5a\x20\xb9\x6f\x01\x29\x3c\xd3\x58\x5a\xc9\xc2\x19\x8f\x2b\xbf\x9d\xd9\x3a\xf4\x41\x39\xee\x55\x5a\x6e\x21\xcb\x1e\x0c\x1a\xb5\x09\x14\xa6\x43\x27\xad\x63\x81\xa5\xea\x1a\xeb\xc8\xa8\x30\x63\xdf\xfd\xd7\x2a\xcd\x0f\x4f\xf0\x39\xe2\x98\x6a\x9d\x10\x6c\x1a\x2f\x9e\x9f\xee\xd6\xf7\xfb\x97\xd5\xee\xf5\xe5\xa9\x3d\xc8\x04\x46\x4e\x47\xab\x2f\x31\x78\xa2\xe0\x79\xa1\x87\x0a\xe1\xeb\x97\x4d\x2f\xb8\x68\xfe\x6e\xe8\xda\x76\x5b\xb8\xea\xe1\x4d\x6e\xb2\xe0\x79\x71\x82\x2b\xc2\xfa\x69\xbd\x5b\xcf\xec\x0c\x73\x53\x0c\x3c\x8f\x52\x06\xed\xa4\x35\x48\xbd\x5b\x2a\xe3\xcd\x68\xc0\x9a\x21\x5a\xc0\xbc\x14\xe7\x0c\x6a\xdb\xd3\x72\x5b\x51\x7b\x5e\x61\xb8\x4d\xef\x45\xc5\x25\xd7\x83\x2b\xf1\x23\x86\x2b\xd9\x7f\xff\xb9\x18\xfe\x1d\x6c\x74\x91\x01\x2f\x27\x98\xf0\x6e\x98\x36\x28\x12\xfc\xec\x0e\xba\x8e\x63\x73\x48\xc7\x9d\x90\xe2\xee\x47\x0f\x97\xfd\x8f\xc9\x7f\xde\x3c\xf0\xbf\xf9\xa7\xfd\xf2\x80\x86\xac\x57\x30\xfd\x2f\x2e\xdf\x4f\xce\xd0\x13\xbc\x80\xf9\x08\xc7\xa8\x3e\xf9\x95\x57\xcf\xe4\x82\x02\x5e\x98\x78\xac\xd3\x36\x6a\xe2\x97\xca\x9d\x2d\xe2\x44\x48\xab\x2f\x07\xe5\xa3\x23\x09\x80\x17\x49\xe1\x5a\xb8\xe6\xc5\xbc\x96\x72\x02\x8f\x04\x02\x4d\xa7\x8e\xa6\xfc\xd1\x6d\x3c\xeb\xbc\x05\x70\x81\x47\x20\xc1\xf0\x8c\x57\x15\x94\xf5\x5d\xcf\x60\xbe\x9f\xe9\x83\x47\x34\x45\x78\xa3\x82\xaa\x2e\x8b\x8b\x2e\xca\x71\x4b\x1b\xbc\x98\x33\xbf\x25\x5d\x3f\xee\x36\xed\xab\xe9\xbe\x2c\x09\x38\xca\xbf\x6e\xef\xfa\x6e\x54\xe0\x25\x84\x52\xd2\xab\x34\xb5\x71\xcb\x4f\xeb\x1e\xe0\x25\x40\x1c\xcd\xe7\x1e\x4d\x81\x2f\xbb\xcf\x62\xea\x5e\x30\xcf\x68\xb2\x34\x2b\x4a\xb9\x4c\xb5\x4e\xe5\x39\x73\x2e\x53\xe0\xb1\x88\x22\xe4\xeb\xf1\xb7\x9f\x1a\x4b\x42\xea\x9b\xcc\x42\xdd\x95\xc5\xdf\x90\x2f\x20\x1b\xf6\x9d\xfc\x60\x48\xe4\x02\x8f\x07\x86\x74\x6f\x1a\x27\xb3\xb2\xe4\x17\x6c\x57\xfb\x3d\xed\x04\xf0\x38\xe1\x18\xbd\xcd\x51\xfe\x68\x3f\x7f\x5d\xfc\xb1\xda\xed\xb7\xeb\xff\x5e\xb9\x9f\x2b\x78\x88\x32\xc6\x18\x52\x37\xab\x9b\x8d\x6f\x6f\x6d\xda\xf6\x63\x32\xf2\xb0\xf5\x61\xf9\xc9\x46\x3e\x6a\xb8\x8e\x28\x66\xfc\xa6\x2d\xd0\x6c\x74\x17\x15\x57\xd8\x1b\x41\x35\xc6\xcf\x02\x37\x93\x01\xcd\x0e\x3c\x1d\x68\xac\xcc\x9a\x06\x19\x32\x4f\x7e\xc6\xbe\x02\xdf\x53\x49\x18\xf7\x54\x32\xab\x5d\x31\x37\x9f\x6b\xa7\x8d\xef\x7b\xbe\x1f\x0f\xad\xfe\x0a\x87\xb3\x06\x3f\xe0\x80\x35\x6f\x34\x60\x41\xed\xbb\xd9\xe9\x54\xa4\x79\x7d\x43\x5f\x1f\xfc\x90\xf9\xd6\xb8\xd4\x58\x88\xdc\xa5\x3f\x7a\xc2\xf9\xe0\x87\x3c\x31\x00\x00\x53\xc9\x7e\x81\xea\x54\xe4\x15\xdc\xa5\x65\x55\x7f\xe5\x99\xfe\xd2\xeb\xcc\x81\x1f\x0a\xdf\x37\x19\xf4\x21\xcd\x97\xe7\xfa\x2a\xa6\x1f\x3e\x06\x3f\x14\x1c\x81\x1f\x7b\xc8\x65\xa1\xcc\xc2\xba\x56\x5f\xae\x53\x7f\xf0\xa3\x90\x09\x67\x11\xb4\x1b\x26\xcc\xe0\x47\xc2\x3c\xce\x4f\x44\x15\xbd\x56\x50\xf6\x7a\x7c\xe0\xc7\xcd\xea\x61\x3e\xdb\x62\xaa\x76\x6f\x25\x54\x6f\x45\x0b\xc6\x1b\x3e\x5f\x3f\x4e\x0c\xa0\x69\x9f\x56\x4f\xc5\x13\x80\x5a\xe7\x96\x04\x8f\xae\x28\x8b\x81\x27\xe7\xaf\xe2\xa5\xe9\x49\xe8\xc7\x90\xc4\xc1\x08\xa6\xf8\x9c\xdf\x15\xd6\xeb\xdb\x32\x6d\x26\xf7\x04\x9f\x36\x21\x2b\xd2\x6d\xaa\x5e\xb6\x0b\x3e\x65\x09\x76\xd3\x8c\x1d\xf6\xac\xae\x5b\x22\x26\xf8\x49\xc0\x84\xb3\x1c\xcf\x8d\x95\xa6\x44\x88\xbf\x8d\xd8\x56\xf9\xb5\xf8\x0e\xf8\x49\x4c\xa4\xea\x60\x34\x35\xec\x83\xb8\x8f\x8d\x02\x3f\x49\x7c\xd4\x14\xcd\x78\x55\xdb\x12\xbf\x3b\xa2\x62\xa3\xf0\x53\xe4\x1f\x50\xd6\xbb\x62\x35\x5e\x28\xfd\x44\x27\x01\xef\x51\x0e\x3f\x40\xdd\x9d\x73\x35\x0a\x12\x7c\x16\x68\x8c\xc1\x4e\xbc\xac\x60\x9d\x1b\xf1\xa9\xa9\x9e\x2c\xf8\x8c\x18\xd5\x9e\x1e\x6d\x6c\x33\x7b\x18\x6f\xed\x3e\xd3\x11\xb6\x6e\xbf\xad\xb6\xbb\x26\xe7\x5a\x3c\xac\xef\xee\x46\x99\x17\xf8\xc2\xe3\x8e\x98\xe5\xcc\x49\x87\x3f\x4c\x90\x04\xeb\xb9\xfd\xc2\x68\xfb\xe1\xd8\x73\xd7\xb6\xf9\xb6\x59\x5c\xd0\x15\xe3\xdc\x37\xf0\x6a\xc6\x98\x72\xfa\x01\xea\x6f\x90\xab\x02\x01\x2b\xe3\xef\xe0\x80\xa5\x47\xc9\xb3\x4c\x17\xe5\x1b\x64\xa7\xd1\x5d\x94\x84\xa3\x49\xeb\x76\x40\xb1\x7f\x7d\x59\x5f\xad\xe1\x83\x27\x27\x99\x8f\x22\xa2\x56\xa8\xdf\x25\x7a\x56\xb4\xb0\xef\x1a\x3c\xfc\x41\x52\x09\xa4\xfc\x3c\x16\xea\x9c\x8d\x7f\xad\x04\x62\xb4\x2c\x9b\xbc\xed\xb9\x4f\xa6\x19\x9d\x45\x05\x01\x3e\x81\x39\xcf\xdf\x7b\x0c\xda\xe9\x09\xaf\x22\xea\xa9\x7e\x8a\xb6\x4c\x25\x18\xe1\xbb\x1b\x8b\x8b\xe2\x04\x65\xc4\x4d\x41\x64\x7e\x59\x9d\xcb\xdd\x8f\xe1\xcc\x55\x52\xe0\x8e\x3f\x73\x7d\xe4\x56\xc4\xf9\x2a\x49\x76\x71\x39\xf8\xe0\x99\x08\xd2\x10\xac\x67\x79\x7a\xe4\x59\xf5\x97\x2d\x0a\x0d\xaf\x10\x84\x40\x41\x2a\x7e\x3e\x1c\x53\xd4\x3d\x87\xf2\xa3\x5b\x5c\xb5\x17\x63\x47\x7f\xfd\xe7\x7a\xf6\xf4\xcb\x16\x03\xf8\xda\xf7\xb5\xc5\x84\x3d\x89\xb4\xee\xb3\x72\xc1\xd7\x31\xc7\x02\x88\x55\x8c\x68\x66\xd1\x14\xc3\x07\x7c\xad\x42\x14\x24\x42\x0f\xea\xd5\x31\xad\xe7\x67\xad\xed\x4f\x0a\x7c\x3f\xa0\x4e\xff\x62\x53\xa6\x46\xd9\xbb\x1f\xb4\x06\x7e\x48\x2d\x76\x7a\xf5\xb2\xbf\x5f\xed\xf6\x9b\x97\x6e\x3f\x0e\x9a\x25\x06\xfb\xd6\x55\xa1\x9d\x33\xd3\x17\x93\xd9\xf4\xca\x29\xcd\x38\x4d\x8d\xab\xb0\x1c\x9c\x3d\xd0\xd2\x80\x58\xaa\xea\xdc\x2c\xcb\x0f\xbc\xaa\x1f\x0b\x95\xea\x74\xbc\x41\x07\xa1\x17\x53\x0b\x20\x79\x41\xea\xd9\xf8\x38\x31\x25\x2c\x0d\xf2\xed\x5b\x81\x7b\xd7\x39\xab\xef\x8a\x9e\x12\xc3\xe8\x03\x22\xc0\xf5\x58\xba\x76\x2d\xac\x17\xcf\x03\xd9\xf4\x66\x0c\x07\xee\xd6\x83\xea\x6d\x7e\xf9\x5e\xa6\x3d\xc7\xe7\x7f\x8c\x6e\xf9\xe8\xaa\x43\x19\x23\x88\x60\x0e\xf5\xf7\x1b\x3e\x48\x10\x44\xc4\x93\x7e\x5f\x9d\xc9\x82\x6a\x07\x1e\x65\x10\x10\xcf\xc0\xd4\xc5\xf9\x72\x57\x16\xc7\x39\xcf\x7e\x5a\xd2\x85\x80\x44\x04\x35\xe1\x4e\x56\xcf\xba\xf9\x94\x21\x8a\x0d\xbf\x9f\x80\x87\x32\x6e\xd6\x02\xdc\x7d\x5f\xec\xc5\x61\xd7\x2e\x52\x30\xcb\x55\xcb\x83\xf3\xa7\x39\x34\x10\xc4\xbe\x09\xe0\x9a\x19\xb0\x2b\x5e\xd7\x79\xfd\x65\x98\xe6\xa2\x5d\x27\xf6\x41\x66\x87\x32\x45\xd4\xd3\xb2\x90\xe7\x63\x87\xaa\x85\x20\x8e\x22\xd9\x52\xa2\x8b\x72\xaf\xa1\x7d\x1c\xb1\x54\x98\x9f\xcd\x3a\xcb\xb3\xd1\x55\xc7\x8a\x7b\xe6\xaa\x9b\xed\xee\xde\x64\x09\xdd\xe7\xad\xbf\x85\xc3\xd5\xcf\xe6\x6b\xbc\x28\x7b\x98\x92\x00\x99\xee\xdb\x34\xfb\xe8\xee\x04\xa5\x5c\x18\x99\xd7\x26\x3a\xff\x9c\x19\x99\xa2\x2f\xbd\x6b\x4a\x3c\xc3\x8f\x2e\x9b\x5d\xaa\x65\x36\x0e\x6b\xac\x10\x24\xa1\x87\x98\xe2\x0d\x3f\xa3\x44\x67\x4b\x65\x5a\x1f\x4f\x59\xf3\xc7\x89\x5c\x77\x72\x3d\x0e\x12\xe5\xe3\x5b\x83\xa2\xfd\xfb\xef\xb3\x6f\xab\xa0\x2f\xff\x06\x01\xd3\x12\x5f\x5a\x57\x96\x5a\xf0\xd3\xf6\xba\xfe\x6c\x07\xf3\x08\xf0\x3d\x40\xb3\x98\x5c\x2d\xbb\x56\xec\x4f\x1b\xb0\xa3\xb3\x88\x38\x88\x3a\xd9\x92\x47\xfe\xe3\x31\xc5\x1c\x9e\x97\xcd\xb5\xfe\x5e\x55\x0d\x02\x19\xfb\x58\x30\x43\x6d\xe8\xc1\xe2\x1d\x48\x4e\x48\xe8\xb4\x89\x8d\x2a\xc6\x8d\x0b\x92\x12\xf0\x29\x6f\xf8\x25\x83\xaa\x7a\x4c\xf3\xb4\x3a\x65\x69\xfb\x2a\x49\x90\x81\x71\x20\x2f\x44\x5a\x0f\xd6\x23\x95\x30\x2c\x9c\x9f\x4a\x58\xcb\x9e\x84\xcf\xf0\xfe\x2b\xce\xa8\x2d\x85\x36\xc1\xe7\xfc\xd2\x6a\xa4\x0d\x27\xa3\xe2\xd2\xb7\x34\xa6\x27\xf8\xfc\x13\x0b\xf1\x45\x3e\x5e\xa7\xff\x31\xda\x09\xa6\x0e\xb7\x73\xe9\xc6\x7d\x53\x32\x46\x86\x9e\x6b\xf7\x6c\xac\xa3\x62\xb7\x10\x56\x37\x5e\x18\x08\x3d\x24\x29\x9d\x9a\x0d\x2d\x98\xa7\x2e\xf5\x08\x80\x28\x8c\xc0\xb7\x9f\xfc\x74\x69\x43\x9d\xe9\xf7\x1e\x94\xf4\x4d\x95\xc5\x88\xf5\x18\xc5\xcb\x36\x8d\x09\xb4\xd2\x9e\xe8\xd7\xb6\xae\xf3\xdc\x2b\x5d\x31\x08\xb4\x8e\x64\x5b\x08\xd9\x16\xd9\x15\x04\xc3\x8c\x0b\x7d\xc5\xb1\xd7\xa8\xd2\xca\x22\xd7\xe7\x97\xf9\x64\x2e\x1f\x06\x3c\x36\x58\xc6\x73\xf5\xb6\x5e\x3c\x0f\x97\xc2\x30\x90\x11\x76\x49\xf1\x0b\x27\x1c\xf4\x21\x0c\x03\xb3\xbc\x08\x2e\xdf\x97\xb3\x97\x3b\x0c\x36\x7a\x12\x8a\x10\x86\x5c\x59\xb3\x14\xac\x90\xde\x35\x4b\xc2\xd5\x69\x48\xc8\x49\x6b\x60\xe2\x62\x21\x6c\xa1\xdd\x15\x0e\x2a\x7a\xf7\xd7\x8d\xcb\x25\xa1\xc2\x40\x67\x6f\x93\xb4\x27\xf8\x51\xdf\x43\xee\x4d\x64\xff\x21\x21\xa1\x67\xe3\xd9\x66\x8e\x76\x61\xd7\x94\x50\x35\x84\x24\xf1\xa2\x8e\x68\xee\xe8\xed\x93\x53\x2e\xa4\x3a\xf0\x3b\xf5\xeb\xec\xe4\xd3\xd1\xc9\x12\x06\x1e\x6b\x4b\x6f\xc3\x12\x22\x84\x09\x28\xc4\x14\x1a\x21\x96\x01\xe0\x0b\x42\x16\x4b\x6a\xbd\x51\xea\x15\x2f\x33\x34\x6b\x30\x76\xf8\xd3\x8b\x92\xfb\x1c\xf3\x7b\x26\x3b\x50\x3a\x01\x89\xbd\x3b\xb1\x08\x22\x43\xa6\x33\x96\x77\xf3\x67\xb7\xfb\x4c\x92\x70\x21\x94\x61\xe8\x30\xa5\x33\x6c\x00\xff\xd7\x59\x1d\x9a\xf1\xf3\x4b\x13\x78\x5f\x46\x97\x2c\x23\x92\x58\xbd\xe2\xf6\x7a\x7f\x1a\x22\x84\x92\xb4\xda\x0e\x3b\xe0\xc7\xb5\x1a\x2c\x7a\xa1\x24\x0a\x77\x24\x01\xb2\x38\xc2\x36\xe7\x69\x66\x6c\xbf\xdc\x05\xc9\x98\x2b\xdb\x3b\x96\x59\xcf\x25\xfb\xa6\x2d\x12\x84\x92\x89\xd8\xa6\xc7\x6b\x59\x4c\x66\x81\xa1\x04\x43\x5f\x31\xf6\xce\xe6\x1a\xa2\x5e\x69\x1d\x42\xe5\x79\xb8\xe7\xb9\x4a\x17\x96\xd6\xa7\xb1\xde\xa3\x7b\xaa\x3c\x8a\xbc\x5c\x05\xb6\x87\xd3\x2c\xb3\x79\x5d\xdc\x9c\x69\x2a\x08\xb0\x50\x62\xa0\xf3\x7b\x93\x8c\xf7\xed\xa8\x21\x04\x0f\x10\x47\x8e\x74\xae\x97\x45\xe0\xfd\x8a\x1e\x0c\x21\x70\x45\x5b\x95\xd2\x12\xd4\x59\xc2\xb1\xcf\xa8\x19\x0e\x8f\x7c\xe2\x63\x9d\x79\x53\x16\xbd\x5c\xfa\x8b\x3b\x4a\x3d\x5b\xaf\x74\x5c\xb4\xa1\x23\x5e\x33\x42\x63\xdc\x83\x38\xc2\x9f\x4d\xe2\xc8\x17\x81\x73\x5c\xb6\xd5\x78\xf4\xfd\xe3\xfd\x8d\xc8\xad\x91\x51\xe0\x13\x2c\xa9\x94\xc0\xd5\xbe\x04\xc9\xab\x7a\x2f\x51\x22\xcd\xfd\xb4\x80\x30\x30\xbd\xe0\xc7\xbc\x3e\x3d\xa6\x87\x92\x8f\x3b\x65\x10\x05\x52\x04\xaa\x57\x8b\x72\x7d\xcd\x09\xe2\xe1\x74\x4c\x12\x05\x8a\xfb\xa4\x65\x32\xa9\x69\x07\xbb\xd1\x95\x86\x44\xc7\x62\xdc\xb8\x0a\xdd\x0f\x0f\x05\x60\x04\x5a\xd5\xbc\xac\x97\x50\xd5\xa5\x2d\x2e\xd9\xe3\x51\x10\x21\x3a\xa4\x02\x2c\x44\x1e\xaf\x58\xf1\xd3\x5f\x1a\xf1\x38\x8e\x7a\x25\xb0\x6e\x4d\xc4\x50\x70\xd4\x12\xbb\x71\x0e\x15\xa1\x4c\xde\x63\x91\xcb\xb4\xc8\xfb\x21\x44\x44\x02\x0f\x4b\x6c\x7b\x0b\xe9\x29\x27\x38\x26\x10\x11\xc9\x98\xf1\xe5\x41\xf5\x9c\x74\x53\xf4\x8a\x98\xa3\x98\x39\x8a\xbd\xc0\xa9\xf2\x4d\x88\x1a\xb9\x41\x31\x75\xaa\xc9\x8f\xfc\xc7\x43\x51\x55\x33\x5d\x43\x39\x8d\xd9\x3b\xdf\x44\xdd\x40\x44\xb9\xe9\x9a\x1e\xcf\x59\x9d\xda\xfa\x2a\xa2\xe9\xc7\xf7\xe6\x3c\xfa\x98\x29\x45\x61\x09\xdc\xca\xe8\xba\xdf\x46\x65\x82\x9d\x69\xeb\x01\xef\x8e\xfe\xb4\xd0\x1c\x51\x15\xa2\x2e\xcb\xeb\xf6\x67\xdc\x18\x88\x18\x67\x48\x13\x82\xfa\xed\x3e\xfd\x18\xf5\xa1\x21\x62\x82\xbb\x1e\xe0\x2b\xf6\x19\xd7\x0a\x72\xeb\xe3\x39\x7e\xca\xa3\x4f\x2a\x85\x56\xa3\x6f\x3c\xfb\x80\x15\xca\xc4\xf7\x6a\x6f\x11\x03\x16\xb1\x9e\x70\x81\x71\x99\xcb\xab\x73\xd9\x04\xa7\xad\xaf\x5a\x62\x68\x0e\x93\xff\x6b\xe1\x91\xe3\xbf\xda\xaf\xe0\x21\x97\x2d\xd2\x00\xe4\xc4\x0e\x1f\xf1\x10\xb0\x62\x85\xb3\xac\x99\xcf\xaf\xa7\xab\x34\xc2\x0e\x15\x49\xa4\xb4\x65\xf6\xa6\x03\x54\x90\x1d\x20\x43\xe6\x9a\x0a\x8f\xfc\xc7\xac\x84\x9c\x3f\xe7\xb0\xe4\x97\xf1\xb8\x58\x60\xd3\x60\x6f\x15\xc1\xff\x37\x89\x42\x24\x39\x8f\x8d\x35\xf4\x4c\x34\x5b\xba\x5b\xc3\x23\x09\x80\x11\x41\xee\x64\xec\x9c\x71\x5a\x3b\xc5\x55\xc0\x11\x78\xb8\x47\xbe\x6c\x1f\x13\x04\x91\x8a\x03\xcd\x3a\x0d\xc3\xfc\xf0\x47\x6f\xfe\x29\x95\x28\xd6\xe3\x61\x18\x9b\x48\x9e\x8d\xae\x0b\x22\x8e\x95\x4d\xf8\xe1\x2c\x03\x5f\x2c\xd4\xfd\x6a\xc1\x84\x58\x68\xab\x86\x7a\x86\xc7\xf4\xda\x8a\x74\x74\xd5\x00\xc1\xb0\x90\x9f\x9e\xae\x6f\xd8\xd4\x29\xa6\x91\xb3\x10\x69\x0a\x68\xf5\xff\x47\xf3\x43\x07\x2b\x10\xf1\x7c\x89\xf9\x8f\x25\x4c\x6d\xa1\xae\xb3\x11\x17\x12\x88\x27\x25\xb5\x5a\x78\xf7\x25\x40\x07\x8c\x6b\x0e\x41\xec\xb5\x6e\x29\x85\xca\xd2\x1c\xab\x07\x1b\x24\x00\xdd\x48\x24\x88\x4f\x8d\x43\xb3\x6d\x0f\x62\x42\xeb\xce\xe8\x4b\x92\x74\x46\x9e\xd6\x8e\x7c\xa0\x69\x6d\x07\x06\x00\xd4\x6b\xdb\x7b\xa8\x40\x39\xa5\x79\x6b\x47\x87\x9e\x17\xd0\xae\x81\xdf\x32\x3c\x46\xa3\xac\x59\x3d\x4a\x4d\x9a\xc0\x10\x6d\x4e\xf0\x0b\x66\xb9\x1a\x45\x40\xff\x18\x7d\x9a\xf2\x24\xe8\xe4\x01\xfa\x0c\x7e\x20\x11\x4b\x70\xd3\x3b\x41\xc7\x26\x1c\xc0\x66\x80\x44\x82\xa0\x03\xcf\xfb\x45\xa0\x12\xb3\x2b\x36\x10\x12\x06\xa4\xc5\xdc\x38\x68\xc3\xf7\xa2\xbc\xd1\xa2\x20\x24\x96\x88\xd1\x59\xa4\x25\x56\x44\xd3\x62\x60\x09\x06\x84\xb0\x30\xb0\x71\xc3\xd3\x0d\xec\x3c\x90\x38\x00\xd3\x0e\x6c\xb2\xa4\x66\x35\x1c\x12\x6f\xcf\xd3\xe2\x1a\xa3\x7b\x12\x53\x82\x44\xc1\xba\xe8\xec\x19\x80\xc4\x10\x84\x81\x5b\x3d\x9a\x70\xfe\x68\xfc\xef\x47\xd7\x11\x6b\xc2\xed\x23\x6e\xd6\x54\xbb\x56\x8e\x06\x51\x2b\x29\x73\x80\x7a\x9b\x15\xb5\x55\xf4\x9c\x7e\x42\xcd\xd8\xce\x00\x64\xc3\xd3\x41\x29\xdb\x0d\x22\xdc\x0a\x02\x20\x11\xd7\x0a\x47\x0f\x27\x5f\xe2\x13\x6e\xf1\x53\xa3\x04\x96\x24\xca\xb4\xfb\xeb\xf4\x08\xd8\x11\xb2\x46\xb4\xf6\x30\x63\x04\x55\xa9\x4c\xf1\x63\x55\xbf\xed\x8a\xd7\x4a\xdd\x54\x19\x01\xc2\x23\x08\x94\x63\xb4\xe0\xeb\x60\x0d\x8c\x4c\x33\xc4\xd9\x09\xfc\x56\x47\x96\x70\xde\x22\xb3\x9a\x24\x0f\x09\x0d\xcf\xf9\x6d\x5b\x38\x20\x82\x87\x16\x6d\x6e\x2a\xd4\x1b\x28\x5f\xf3\x61\x29\x84\x28\x92\x20\xf4\xef\xaf\xff\x9e\xff\xd5\xfe\x8d\x1b\x0b\x87\xfd\x7f\xce\x30\xf9\x46\x82\x9f\x90\x96\x37\x3f\xef\x5e\x14\xa0\x80\xfc\x58\xc8\xd5\x7a\xf1\xec\x47\xee\xef\xda\x37\x30\xd5\xcd\xcb\x6a\x3b\x7b\x58\x6d\x1e\x5e\xb7\x9d\x13\xe5\xea\xdb\xaa\x1d\x17\x40\x92\xb4\xe2\xda\x83\x1c\x89\x68\xed\x93\xc8\x08\x92\x95\xe7\xb4\xfe\x0a\x65\x71\xd7\x96\x0c\x63\x2f\x90\xb1\xd1\x3d\xd9\x9f\x6c\x51\x64\x5f\xd9\x6c\x52\xb5\x83\x94\x6f\xb9\x60\x86\x2b\xd6\xfe\x1d\x54\xd2\x69\xaf\x34\x37\xf7\xbe\x2c\xce\xa7\xe9\xc0\x3d\xf6\x03\xa6\x88\x5b\x68\x8a\x63\x71\xdb\x9c\x00\x62\x3f\xf4\xc2\x5e\xf9\xfe\x6c\x74\xb2\xb6\x3f\x33\xa6\xfc\xe9\xb6\x1a\x07\x7e\x84\x77\xf2\x61\xb9\x1b\x39\x16\x41\x1c\x70\x8f\xf7\x37\x1f\x5c\xcc\x4b\xa8\x0f\xe6\x6e\x4e\xff\xc2\x30\x34\x75\x61\xc7\xf6\x5a\x59\x36\xca\x3c\xcd\xb2\x9b\xc2\x40\x3f\xff\x8d\x21\x05\x62\x5b\x29\xa8\xe5\x68\xdb\xaa\x13\x41\x68\x1c\x2a\xea\xf9\x6d\xf1\x00\x09\x85\x4e\x12\x7c\x78\xce\x88\x86\x2c\x72\x82\x9f\xfc\x68\x5a\x44\x53\xda\x7d\x10\x47\x2a\xd6\x9d\xd0\xdf\xf4\x18\xe2\xc5\xce\x0d\xf8\xb5\x52\x8f\x79\x39\xfa\x3a\x22\x44\x6c\x44\xf2\xaa\xb7\xaf\x69\x85\x59\xab\x3d\x14\x33\x19\x58\xaf\x0f\x24\x74\xfe\x5e\xc9\x33\xa6\xc4\xd4\xb4\x6f\x95\xd8\x6e\x8a\x2f\x4d\xe6\x61\x31\x25\xda\x0f\x3b\xc7\xa2\x14\x32\x35\x33\x90\xb4\x0e\x53\xee\x86\x72\x1f\xf5\x66\x5d\xd1\xb0\xa7\x4f\xd4\x1c\x24\x91\xb1\x47\x52\xb3\x41\xde\x15\x27\x54\x60\xe6\x5f\x03\x3f\xca\xf6\x8f\xc2\x74\xdf\x0e\x4d\xa4\x6a\xa3\x27\xd4\x39\xe4\x57\xf2\x2b\x10\x27\x10\x24\xa4\xdd\x3f\x30\x8e\x6b\xcf\xa3\xa9\x2b\xb8\x98\xad\x76\x7e\x56\x87\x5b\xa5\xeb\x98\x49\x86\xb7\xbc\xc8\x0d\x12\x65\xb8\xe6\xdd\xf8\x8c\xe2\xb8\x5d\x60\x3f\x6c\x59\xf2\xcf\x9b\x81\xab\x4b\xb2\x63\xee\x49\x65\x37\x06\xfc\xc1\x00\xd8\x0b\x99\xbb\x1f\xcd\x55\x8c\x1d\x8b\xb4\x42\x4a\x24\xda\x5b\x0d\x82\xa3\x58\x48\x6e\x04\x67\xb2\x6c\x07\x55\x4d\xdd\x27\xa5\xcf\xb0\xab\xf3\x15\xb2\xf4\x87\xd3\x29\x73\xc7\x34\x43\x42\xd7\x1f\xe5\xe5\x54\xa7\xb2\xf7\x04\x54\x14\x22\xa6\x73\xf6\xb0\xd8\x2f\x57\x8b\xf5\xe3\xec\x61\xdb\x1e\x93\x4a\x18\xda\xf0\xc9\xfd\x09\xbc\xc8\x39\x0d\xa7\x47\x9e\x7d\x87\x74\xf7\xb0\xf1\xdd\x51\xed\x29\x0c\x70\xac\xa2\x84\x49\xb3\x8b\xd2\xf8\xeb\xbb\x31\xbe\xf0\x4c\x9c\x83\x3d\x29\x03\x86\x2b\xdb\xa3\x01\x8f\x0d\x01\xa6\x96\x6f\x70\x23\x3e\x8c\x35\xe8\x28\xea\x95\x18\xfe\x3c\x17\x9d\xe0\xa9\x19\x43\x3d\x8f\x69\xb7\xed\x37\xb1\x4d\x3a\xae\x9c\x52\x2f\x92\x3e\x2a\xcf\x7c\xff\xf3\x5a\x6e\x12\xa8\xc7\x7d\xc4\xaf\xfc\x91\x66\xd9\x98\x41\xe6\x86\xe8\xc8\xb7\xb2\xc5\x4f\xf0\x79\x57\x94\xef\x2f\x70\x3a\x1b\xce\x45\xa7\x97\x06\xd4\xe7\x80\xae\x71\x0f\x69\x13\x3e\x2f\xb8\xac\x1d\xf5\x06\xa8\x2f\x00\x57\x89\x63\x91\xf3\x52\xbe\xf5\x1f\x1b\x0d\x02\x4a\x0d\x71\x04\x27\xc9\xee\x72\x1a\xb5\x05\x68\x40\x19\x16\x21\xdd\x9d\x70\xc1\xdf\x1d\x58\xf5\xd1\x09\x55\xac\xc9\x7d\x9c\x06\x5c\x22\x90\x39\x87\xcf\x89\xdc\x90\x06\x40\x7d\x93\x92\x2f\x53\xe8\x77\x8f\x69\xa0\x43\x61\x0b\x95\x46\xae\xfe\xcb\xa4\x2e\xc7\x64\xda\xfd\x8f\xa9\xc0\x92\x86\x42\x63\xe9\x55\xc1\x07\x64\xc5\x09\x4a\x53\xce\xa9\xe1\x47\xbd\x77\x2b\x42\xb5\xcf\xd2\xfc\x7d\x20\xc3\x0c\x34\x84\x10\x41\x4c\xa7\x12\xb2\xf4\x98\xe6\xbc\xbc\xdc\xf3\x23\xf4\x0c\xc6\x2c\x67\x16\x68\xa8\x29\x12\x3b\x5d\xfb\xce\xda\x4b\x16\xc7\xdd\xec\x65\x7a\x17\xa3\x51\x20\x63\xa3\x77\x95\x65\x69\x91\xaf\xf3\x45\xaf\xd5\x48\x23\xed\x21\x52\xc8\x40\x00\x57\xff\x99\xda\x8a\x28\xa1\x1a\xc5\xe8\x32\x5e\x19\x41\xe1\x7e\x15\x80\x92\x84\x63\xeb\x63\x8f\xd6\x14\x08\x16\xea\x40\x0d\x6e\x8c\xd2\xba\x59\x1f\xee\x65\x91\xe6\x9b\xb2\x70\x82\x68\x40\x89\xd6\x26\x76\x39\xe7\xa3\x6a\xbb\x1d\x10\x6b\x43\x3f\x36\x09\xd1\x01\x9e\x4f\x80\xbe\x4c\x2e\x61\x49\x06\x3d\x46\x4a\xa9\xc0\xc5\x0d\x9d\x4e\xee\x8a\xb2\x57\xa3\xa4\x94\x2b\x65\x13\xb4\x82\x2b\x23\x73\x70\xb3\x2f\xe7\x3e\xa3\x09\x10\xe7\x07\x51\xd5\x3b\x5c\xb0\x1f\x9a\x47\x3c\xfa\x9d\x89\x47\xf0\xcd\x45\x2d\xb3\x6d\x7a\xe8\x0b\x3e\x01\x4d\x62\x49\xac\xcd\x55\x93\x2a\xbd\xe6\x0a\xca\x0a\xd5\x9c\x07\x53\x81\x09\x8d\x4a\x0f\x87\x54\xd7\x8b\x42\xc1\x94\x54\x0e\x50\xc1\x35\x16\xd9\x5f\x2c\xe3\xd3\x7a\x0c\x4e\xee\xe7\x54\x68\x8f\xc0\xd0\xcc\x3a\x76\xbf\x4a\x4a\x81\xe0\x87\xc5\xe2\xa9\xfd\x93\x62\x8c\xf5\x82\x9e\xbb\xa2\x5c\xf7\xfd\xf7\x4d\x3a\x64\x07\x2b\x9f\x38\x7d\xe1\x05\xcf\xae\x45\x0c\x26\x37\x6e\x37\x97\x55\x42\x9d\xe5\xc0\x5d\x09\x80\x19\x5f\xe9\x4a\x98\x57\x5b\xd2\x75\x77\x8c\x82\x9f\x50\x23\x05\xab\xf6\xef\x17\x79\xb5\x52\x82\xe0\xad\x40\x09\x22\x1c\xe4\xc5\x52\x61\x86\x4f\x4e\x7b\x0a\xd9\x03\xcb\xed\x6e\x3f\x7f\x7e\x7d\xda\x39\xec\x74\xe2\x79\x51\xd2\xfa\x09\x36\xf9\x41\xd5\x99\x36\x43\xe2\x05\x8a\x1a\x37\xa2\xc7\xaf\xbb\xa9\x66\x59\xe2\x33\x0f\xd5\xfe\x9a\x9d\x65\xff\xe1\x36\x9c\x24\x20\x01\xca\x42\xba\xb7\x38\x1b\x30\xdf\x21\x09\xbd\xd0\xf2\x9f\x5c\x46\x32\x61\x4d\x77\x0d\xfb\x6f\xcb\xa5\x49\xe8\xfb\x4a\xd8\xc2\x30\x26\x6b\x0e\x5e\xb9\xe1\x65\x9d\x8f\x24\x95\x9a\xe1\x01\x02\x30\x3e\x4c\x95\x1d\xec\xd4\xed\x43\x81\x06\x4b\x5d\x12\xc6\x0c\xb5\x9a\x8c\x50\x73\xdf\xb8\x1f\x92\x90\x1a\x8a\xdc\x53\x9a\xff\x9b\x77\x82\x0b\x90\x44\x42\x3b\x9f\x06\xb7\xde\x0f\x38\x73\x6e\x98\x24\xb8\x1a\xea\xf4\x07\xa8\xd5\x8f\xd3\x6b\x5e\x71\x3d\x12\x97\xb0\x43\x49\x18\x13\x3b\x83\x5e\x10\xfe\xd7\x6c\x37\x30\xe0\x3b\x41\x42\x62\x8a\x54\x23\x04\x0e\xca\xf6\xaf\x2c\xc2\xe2\xcf\xa6\x99\x6c\xe9\x86\x97\x19\xfc\xdd\xdf\xc4\x92\x38\x0c\x91\x74\x6c\xb4\xa0\x91\xf7\x85\xe2\x36\x43\x89\x96\x38\x72\xb3\x31\x89\x15\x98\xb0\x13\xaa\xfa\xff\x8c\x26\x3e\x2c\x41\xdc\x52\x18\xbd\x06\x68\x25\xd4\x23\x98\x76\xd5\x6f\x65\xf1\xf9\x9c\xaf\x73\x59\x1c\x4f\xbc\x4e\xc5\xd8\x1b\x0b\x12\x0a\x80\x51\x2a\xe4\xea\x65\xe1\xfe\x98\x78\xb1\x26\x6d\xaa\xe1\x00\xc5\x93\x1b\x6e\x92\x04\x1a\x6c\x80\x82\x4f\x6f\x96\xab\x79\xf1\x63\x34\xef\x13\x2d\x51\xd3\xdc\x60\x89\xaa\xc9\x77\x83\x05\x21\x96\xae\x96\x8f\x0f\x7b\x63\xf9\xda\xa7\xc6\x34\xc7\x89\x6e\x2d\x26\xa1\xaa\xef\x00\x86\x80\xa0\x84\xf1\x18\xa7\xed\xe3\xec\xaf\xfd\xec\xe1\xe1\xf9\xfb\x6a\xb9\xdf\xee\x66\xf7\xab\x7d\xfb\xa6\x71\x6a\x54\x8d\xf7\x69\xf5\x50\x7c\x42\x29\x79\x05\x0f\xd0\x6c\x33\x7d\xdd\x4f\x48\x44\x40\x3d\x63\xf0\x88\xad\x2b\x30\xee\x55\xf7\x90\xa3\x44\xe8\x70\xf9\x1a\xdd\x10\x11\xc7\x56\x6f\xb5\x5e\x35\xf1\xbe\x84\x17\xf8\x48\x8d\x06\xe5\x20\xea\x49\x04\x08\xea\x3b\xe4\x63\xd9\x8c\x18\x2b\x8b\x42\x22\x05\x20\xa0\xf8\xa1\x38\xcc\xd3\x56\xb1\xe5\x17\x11\x7d\xa2\xe2\xc8\x35\xb9\x53\x5d\x14\xaa\x35\xd4\x9c\xdc\x12\x12\x95\x48\x6a\xe5\xe7\xb6\x6f\xc5\x39\x53\xf7\x2e\x03\xef\xf5\xeb\x12\x88\x39\x8a\x73\xfe\xe7\xcc\xcb\xf2\xb2\x40\x0f\x88\xd1\xbb\x0a\x8c\xa1\x11\xf0\x39\x3f\x71\xf9\xde\x83\x34\x0c\x2f\x5c\x47\x46\xe6\xf3\xe5\xf9\x9f\xf3\xe7\xb5\x01\x3d\x0f\x5e\x36\x1d\x09\xe1\x84\xdf\xd5\xf7\x34\xdf\x20\x7a\xea\x7b\x9a\x1b\xed\xc4\x76\x98\x30\x0e\xbe\xd6\x43\xf8\x91\xff\xe8\x88\x0d\xa3\x9f\xc6\xbc\x44\x60\x31\xf6\xc4\x2f\x57\x0d\xe8\x5b\x2f\x62\x2f\x3e\x64\x9e\x0e\xb1\x55\xf0\x7d\x33\xfb\x67\x6f\x15\x63\xbe\x0a\xa9\xf9\x0d\x47\x9e\xd7\xa9\xb4\x4f\xb2\x87\x0c\xfb\x57\x68\x97\x04\x16\x78\x46\x79\xdb\xa8\x2e\xcc\xf2\xea\x13\xca\xf9\x65\x56\x8a\xb4\x36\xa0\xcb\xf1\x3b\x3e\x78\x4c\x2c\x20\xc6\x76\xc4\x61\x11\xf8\x35\x95\xf1\x06\x80\xe6\xff\xa8\x80\xc2\x42\xaa\x79\xe4\x66\xb2\x7a\x4c\xf3\x6b\x97\x66\x60\x11\xf3\x09\xb3\x5b\xcb\x23\x54\x15\x3f\xc0\xae\x70\x0a\x79\x13\xcd\x29\x16\x01\xf1\xa2\x9e\xd3\x83\x0d\xda\x06\x63\x88\x6f\xaa\x4f\x9a\x5f\xea\x37\x17\xae\x31\xc2\x09\xee\x9e\x6f\xbc\x6e\xff\x24\x85\xb2\xec\x2e\x44\xfb\x57\xcd\x1b\xe2\x9c\xd3\x87\x3f\x94\x80\x44\xb2\xce\xa9\x38\xc9\x26\x3e\xec\xf3\xd7\x80\xc5\x09\x47\xd9\xc9\xd3\xb9\xde\xd6\xb2\x39\xcb\xbc\x2e\x6e\xe1\x09\x7f\x79\x1f\xa7\xd6\x6a\xbb\x49\x31\x1a\x78\xa4\x33\x36\x9b\xdc\xc9\x7f\x73\x83\x68\x4f\xa8\xb1\xef\xb1\xaf\x8b\xc7\x5e\x25\xca\x1d\x15\x12\x97\x4d\xb3\x21\x1a\x43\xa4\x7b\xdb\xe8\x55\x53\xbb\x28\xa3\x10\x61\x89\xef\xc8\x7f\x2c\xf8\x69\xff\xb8\x6e\x57\x58\x46\xc1\x14\x1d\xdf\x78\xb5\x79\xeb\x29\x76\xdb\xc3\x89\x9f\x20\xcf\xcd\x74\x1f\xd4\x6b\xde\x24\x6e\x15\xfc\x96\xb0\x31\xb0\x84\x48\x61\xd4\x1b\x2e\xe3\x2e\x08\x4b\xb4\x8f\xb8\xd1\xda\xe8\xa1\x1b\xb1\xca\xf4\x6f\x58\xeb\xa7\xa2\xc6\x08\xbb\x6a\xfb\xfb\x8c\x79\x11\xe3\xa3\xe2\xde\xef\x51\x79\x18\x0b\x0c\x3d\xd5\x82\x5e\x9f\xf5\x2c\x1b\xa5\x2e\x8c\xc5\x0c\x69\x5d\x9b\xc7\xd5\xee\x67\x5d\x58\xc6\x43\xd3\x56\xb7\xb5\xd5\x87\xb1\x8e\x2d\x30\x41\x75\x60\xa4\x50\x7e\x98\x98\xa9\x35\x48\x07\x26\x3a\xcc\xc3\x62\xbb\xb0\x0d\x22\xab\x28\x31\x3a\x8b\x8e\xbc\x6e\x42\x39\xdc\xd0\xe4\x6e\xcd\x64\x28\x71\xbb\x77\x10\xd8\xaf\x3c\xeb\x8a\xbe\x4c\x4a\x8a\x73\xe5\x1b\x88\xd5\x5f\xdd\x1f\x0d\x92\xed\xc8\x7f\xcc\xa1\xee\xd8\x62\x4c\x05\x89\x2b\x70\x6d\xd6\x26\xb7\xf5\xfd\xf6\x20\x35\xb8\x23\xab\xc5\x69\xcc\xd0\x6e\xac\x56\x5d\x28\x7f\xd3\x72\xb9\x39\x61\x84\x73\x4b\x9c\x2f\xf3\x73\xf6\xfe\x02\x87\x73\xc6\xcb\x05\xbf\xd2\xf7\xf8\xd7\xff\x8c\xae\x59\x31\x53\xda\x17\x3d\x3e\xfa\x60\x69\x07\xdf\x48\xd1\x0b\x27\xcd\xb8\x9f\xb4\xba\x36\x9f\x71\xbf\x47\x73\x03\x9c\xc5\xf0\xae\x89\xb3\x56\x86\x26\xb5\x85\xcc\x44\x87\xbb\xcf\x2e\x27\x66\x9a\x1b\x06\xa8\x35\x77\x83\x61\xc6\xcf\xb4\x10\x89\x51\x74\x9e\x75\x76\xf0\x83\xab\xe0\x7e\x68\x8a\x28\xaf\xdb\xe5\xfe\xeb\xec\x65\xb9\x5f\xcc\xac\xc6\x24\xf0\x20\xe0\x88\x1f\xca\xe1\xd3\xea\x1b\x4d\x88\x71\x03\x0f\x28\x55\xfd\x62\xc1\x70\x36\x5d\xad\x3a\xc3\xef\x0f\x58\xe0\x75\x40\xb8\x27\xf8\x5c\xb6\xca\x71\xc0\x23\x12\x07\x5d\x57\x60\x57\xd4\xcd\x9c\x1f\x7d\x3b\x51\x14\x6b\x3c\xc7\xc3\xb1\x46\xe3\x8f\x9e\x49\xc4\x74\xa9\x82\x13\xc5\xb0\x8d\x93\x61\x00\xbf\xfa\xcf\xb9\xeb\x4f\x5f\xcd\x19\xfb\x11\xea\x25\x58\x58\x30\x8e\xef\xd6\x8d\xd8\x1d\x4b\x94\xb6\x80\xf1\xfb\x22\x9b\x86\x16\xdf\x68\x2e\xf3\x66\x19\xb5\x2a\x63\xd8\x81\x1f\x77\xca\x79\xc2\x01\xf9\x48\x8f\xfc\xdd\xa1\x0a\xe1\xb3\x07\xbc\x9a\xbe\x42\x26\x08\xa6\x1d\xd6\x7f\x72\xee\xa4\xa7\x80\xf3\x80\x59\x31\xcb\x0a\xca\xda\x14\xf1\xbf\x42\x09\xed\xf1\x48\x62\xce\x68\x1a\x6c\x6b\x34\x00\xeb\xf3\xcc\x6e\xc3\xdd\x38\xe7\x46\xa0\x7b\x7e\x2e\x87\xf5\x61\x97\xbb\x70\x19\xc6\xc8\x60\x31\x5f\x3e\x5d\xbe\xe4\x12\xb8\x35\x6f\x55\x1b\x6b\xff\x38\x6d\x5b\x33\xb9\xd4\x72\xe5\x79\x8c\xba\x9a\x1f\xa6\xd3\x1f\xa8\x39\x30\xcb\xd5\x6b\x6e\x5b\xe6\x37\x14\xaf\xdc\x19\x24\x30\x69\x9d\x0d\x52\x39\xe8\xaf\x73\xa5\x8d\xff\x8c\x35\xe8\x30\xfd\x9d\xf4\xef\xf6\x38\x70\x92\xc4\xd6\xb3\xc7\xe1\x35\xa6\xd7\x4c\x0e\x8a\x24\xac\x6b\xe3\x5b\xb3\xf3\x4e\x2a\xd7\x0e\xd3\x5e\xe2\xe0\x03\x83\x1a\x66\x9f\x88\xc7\xb5\xaf\xc1\xef\x55\x53\x76\x45\xdb\x7c\x1d\xbd\xef\x3a\x26\xa1\xb2\x71\xd5\xaa\x7e\xbb\x21\x93\x05\x5c\x0b\xca\x10\xe7\x5c\x9c\x73\x85\xc1\x36\x6a\x66\x9b\xa3\xc2\x0b\xcd\xf7\xed\xdf\x78\xae\x32\xd8\x94\x85\x32\xad\x8b\xb5\x95\x52\x99\xbe\xb5\xc2\x4b\x12\xa4\x6e\x16\x5d\x71\xcd\xbc\x4c\xbb\x4f\x57\xa9\x13\x41\x64\xba\xeb\x58\x31\x55\x69\x9f\x35\xe4\x46\xd0\xc0\xac\x4b\xc5\xf2\x7c\xca\x50\x36\x7b\x40\xd9\x11\x01\x35\x68\x9e\x4d\x59\x14\x7a\x5f\xe8\xfd\x8e\x4b\xa7\xbd\x0c\x22\xe0\x81\x51\x6c\x3e\xa5\xc6\xbf\x68\x99\x56\xfd\xba\x88\x08\x7d\x86\x08\x44\x6e\x58\x7e\xbf\x68\x5a\x88\x90\xfa\x58\x0a\xfc\xf6\xba\x31\x26\xaf\x36\xc3\xec\x3b\x9d\x82\x88\xb8\x4a\xac\xad\x3d\x02\x6d\x37\x76\xab\x6c\x7f\x56\x24\x0d\x41\x38\x87\x1f\xb5\x41\x4e\xd5\x17\x07\x1e\xb6\x43\x88\x67\xbc\xf9\x0e\x50\x3f\xc0\x07\x3a\x94\xe5\x87\x3f\xd2\xba\x86\x2e\x09\xfc\x47\xbf\x90\x2b\x88\xf2\x5d\x6d\x6a\xbe\xe9\x4f\x19\x41\x83\xd8\x6a\x99\x59\x15\x47\x64\x24\x8d\xee\x34\x55\x01\x2e\x4f\x7f\x14\x79\x5a\x54\x43\x73\x97\x89\x25\x40\x24\x1e\xe0\x93\xa9\x6a\xfe\x8e\x2f\xc7\xb4\x8b\xce\x70\x52\x30\x16\x32\x83\xcf\xb0\x66\x69\x63\x52\xb3\xe0\x8c\xe0\xcf\x68\x19\x36\x36\xbc\x6f\x46\x0e\x7f\xb0\xf0\x34\x05\x0c\xb4\xda\xb9\x2a\xfc\xd0\x98\x72\xf1\x0a\x6b\x54\x7d\x6a\xba\x10\x24\xc2\x84\xdc\x52\x93\x1e\xd2\xff\x9c\x53\x95\x8e\xe1\xc6\x42\xfa\x06\xcd\x8c\xbc\x13\xbc\x8d\x6d\x53\x46\xc8\x80\x99\xf4\xa9\x67\x9b\x9e\x83\x55\xb9\x1a\xae\xe6\x42\x26\x12\x67\x96\x06\x98\x69\x9d\x66\x69\x47\x99\x11\x92\x29\x30\xda\xa5\xcd\x0d\xc5\x5d\xa9\x9a\xca\x74\x84\x12\xcc\xfa\x82\x7d\xf2\x52\x0d\x88\xa1\x02\x22\x86\x50\x70\x0b\xcf\x9f\xa6\x19\x0a\x48\xfc\x80\x39\xa2\xbd\x3c\xb7\x73\x02\xa4\x87\x49\xd7\x7d\xab\x55\xba\xbb\x9c\xac\xc0\xe2\xf5\xc5\x80\x56\x48\x49\x43\xd8\xa8\x6d\x5d\x56\xb3\x5c\xcd\x53\xf5\xe5\xca\x91\xcf\x7c\x46\x7a\x56\x09\xa4\xbd\x59\x3b\x9e\xdd\xd0\x5f\x05\xe9\x49\xe9\xb3\x16\x3f\x8d\xad\xde\x68\xba\x3f\x29\x7d\xce\x91\x87\x23\x0b\x05\x48\x15\x40\x6c\xc6\xae\x30\xf8\xb3\x31\x26\x4b\xfa\x32\xc2\xe6\xd6\x4c\xa9\x27\xf8\x74\x6a\xf3\xe7\x41\x53\xe2\x7f\x97\xd5\xca\x00\x02\x7c\x9f\x8c\x86\x74\x87\xcb\x19\x44\x64\x32\x0c\x8c\x68\x6b\x13\xb5\x6f\x78\x5a\x56\x77\x45\x69\xd9\x8b\x37\x93\xee\xae\x56\x22\x43\xe2\x63\x0b\xb1\x03\x1e\xfc\xaa\xd8\xf7\xd3\xe8\x4b\x86\xc0\xb0\x61\xd9\xbc\xfe\xb3\x5c\xb9\xbd\x65\x3d\x5b\x4c\x47\xa9\xed\x73\x0c\xb5\xc0\xf2\x9c\x3e\xe7\xf8\xdc\x9b\xf5\xfb\xf7\xee\x13\x89\x6c\xc1\x13\xbb\x1c\x0b\xde\x84\xb5\x46\x2a\xbb\xff\x62\x4a\x12\x1b\x9b\xc9\x5d\xc7\xe1\x1e\x0a\x95\xb8\x55\xa2\xff\x4d\x83\x5b\x4d\xa4\x01\x6c\xdf\xad\x9f\xfe\x0a\xfa\x65\x20\x49\x54\x68\xd4\x0f\x76\x8b\x97\xee\x05\x94\x31\x33\xc8\xa5\xe7\x1c\xb6\x35\xcf\x15\x2f\xd5\xe4\x8a\x77\x5d\x58\x90\xb1\x34\x60\x06\x7e\x3a\x65\xc8\x1a\xec\x3b\x3a\xfc\xac\xe1\x67\x3f\x4f\x23\x85\x85\x6e\x28\x32\xc4\x8a\x99\x7c\xda\xfd\x30\x2a\x3d\xde\xdc\xec\xbb\x97\xcd\xcb\xeb\x66\xb5\xda\xb6\x07\xb4\xc4\x06\x4d\x5a\x6d\xd3\x43\xee\x7a\xe1\xfe\xe8\x75\x97\x49\x64\x48\xcc\x0f\xc5\xe1\xb5\x42\x85\xf4\x26\x02\x42\xc6\xfe\x75\xf6\x28\x13\x25\x90\x14\xbd\x08\xf7\x3d\x67\xdc\x9f\x2d\xfb\x92\xc5\x31\x16\xb1\x70\xb3\x42\x49\x97\xed\x1b\x0a\xaf\x8c\xca\xc2\x92\x51\x89\x39\x93\x46\xd4\xd7\xdd\x39\x57\x25\x4f\xc7\xde\x0b\x20\x99\x54\x58\x38\x44\x39\x42\x63\xf2\xde\x04\x95\xd3\x81\x94\x64\xca\x74\xaa\x4d\xc8\xfa\x04\x9f\x3f\x89\xba\x24\x17\x11\x2a\xda\x7d\x94\x50\x34\x0b\xdb\x73\x7e\x28\x3a\x44\xa6\xe4\x8a\x23\xbd\xe1\x74\xae\xde\x66\x75\x71\xb4\x6d\xd1\x1b\x40\xbd\x76\xb7\xed\xff\xaf\xb7\x7d\x0d\x5a\x86\x52\x86\x31\x8a\x3d\xea\x73\xfe\x65\x70\xb9\x92\x13\xc3\x58\x78\x03\xf9\xfe\x78\x59\x16\x39\xef\xc1\x40\xa4\x0a\x23\xa7\x5c\xb9\x3b\x67\xe9\x28\x01\x92\x2a\xf1\x69\xd7\x41\x98\x9f\x1d\x4c\x46\x02\x21\xa8\x73\x74\x2c\xe4\xbb\x55\x6d\xbd\x71\x53\x34\x63\xb8\xee\x0f\xda\xbd\xd5\x15\xf6\x68\xf0\xbd\xca\x0b\x8d\x26\x45\xf3\xb3\x96\x2b\x4b\x66\xb8\x85\xc3\x53\x5e\x12\xe0\xc6\xfc\x52\x54\xd0\xab\x73\x2a\x8f\x89\xc0\x34\xb7\xee\xe0\xc8\xb3\x9e\x4d\x02\x28\x4f\x24\x74\x28\x38\x60\x29\xa1\x58\x99\xb9\xcd\x67\x53\x9e\x0a\xb8\x6f\x9d\xd3\xc7\x9e\x4f\xa0\x7c\xc9\xf0\xb4\xe8\x2d\xe8\x96\xbc\x6e\x0e\x28\x5f\x02\x42\x22\xb9\xb2\x9b\xeb\x28\xe1\x55\x81\x17\xa3\x3e\xd7\xd1\x94\x2e\xf9\xb6\x2e\x81\x5f\xb9\x12\xdf\xea\xac\xb8\x93\x84\x41\x10\xda\xdf\x88\xaa\x1f\xe3\x2f\x89\x29\xc6\xfd\x7f\x1b\x94\x5d\x67\x68\x5e\x4c\x31\xff\x47\x27\x0f\x19\xc3\x0d\xfe\x64\x02\x73\xc3\x9b\xeb\xbf\xb2\x2a\xe4\xa1\xd7\x99\x25\xb3\xd1\x97\x87\xc2\xc7\x7d\xa1\x79\x52\xa2\x87\xb0\x72\x87\xb5\x9f\x4c\x48\x76\x7e\x4e\x19\xa7\x83\x8a\x62\xdf\x50\x26\xcf\x39\x94\xdc\xfa\x9b\x0c\x3a\xff\x2a\x52\x40\x2d\xa2\xab\xad\x54\xbc\x14\xd9\xf4\xda\x69\x3f\x43\xbc\x50\xaa\x5e\x39\xae\xf9\xad\xeb\xdc\x62\xd5\x7f\xab\x2c\xa7\x68\x28\x88\xd5\x73\x33\x32\x03\x6b\xf5\xac\x07\x32\xd5\xe3\x0f\x08\xe1\x59\x48\xcb\x16\x40\x99\xea\xda\x5d\x51\xde\xf3\x23\xac\x47\x41\x86\x4a\x02\xd0\x0e\x51\xc0\xf3\xb4\xbe\xcc\x0b\xc4\x9c\x8e\x46\x71\x62\xf0\x89\x3c\xcb\x04\x97\xef\x6b\xcc\x8d\x6d\xdc\x32\x60\x09\x8f\xdf\xc7\x89\x89\x9f\x88\x10\xa1\x84\x92\xe7\x06\x8c\x6e\x84\x24\xa7\x2f\x26\xd1\x91\x67\x58\x0a\xae\x21\xfb\xc8\xd3\x51\xfd\x41\x31\x96\x38\x27\xc6\x25\x1c\x0b\x89\x58\xf2\xd5\x11\xca\x03\xe4\xf2\xaa\xe5\xe1\x3e\xa4\x22\x24\x94\xcc\x5e\xe6\xeb\xdd\xcb\xec\xe5\x9f\xfb\x6f\xb3\x87\x57\xd4\xff\xd8\xaf\x9f\xf6\x5d\x39\x52\x71\xdf\x43\xc5\xdd\x2a\xe3\x1f\x30\x80\x32\x28\x1e\x26\x8e\xe9\xd5\x86\x3b\xcf\x27\xc8\x7b\xbd\x23\xc5\x05\x47\xe2\xaa\x34\x68\x11\x38\xf1\xf4\x36\xb5\x7b\x6a\xe7\x55\x22\x56\x86\xcf\x36\x5b\xec\xd6\x8b\xd9\xc3\xe2\xe5\x75\xbd\x5d\xbd\xec\xef\x76\x0f\xfb\xed\x66\xb5\x5a\xba\x9f\x23\x24\x08\xde\x36\x81\xdf\x1f\xb8\x6d\x79\x8f\xee\x97\x0c\xb8\xe1\x8c\xf6\xa3\xf3\xea\xcb\x54\x47\xbd\x7d\x6a\x12\x8c\x3c\xd7\xee\x0d\x29\xa6\x18\x01\xb8\xaf\x55\xdc\xc0\xf4\xbe\x2e\x92\xf5\xe2\xb9\xfb\x6b\x82\x25\x0a\xbc\xee\x6f\x46\x6b\xa9\x3d\x26\x22\xa4\xe1\x9c\x40\x9e\xb3\xe7\xcc\x65\xb5\x0a\xbc\x48\x1a\x28\xf2\xbf\x41\x3a\xe3\xe2\xe1\x6b\x08\x44\x5a\x78\x5d\x75\x86\x5b\x46\x27\xbd\x78\x54\x01\x97\xc8\x22\x30\x65\x80\x3f\xcf\xa9\x7c\x5f\x64\xcd\x0a\x6f\x1b\x35\x63\x24\xe5\x6f\xb6\xaa\xed\xd9\xb5\x0f\x2a\x71\x98\x18\xa3\x90\xe3\x0a\xc1\x4a\x2b\x82\x7e\x3e\x8b\x3e\x05\x4f\x69\x30\xa6\xff\x1f\xc5\xaf\x75\x01\xdd\x47\x9a\x44\xa3\xcb\x00\x5f\xac\xa8\xfb\xb0\x07\x0c\x9e\xef\x53\xda\x4a\xda\xa7\xb2\x6a\x0f\x10\x16\xf7\xfc\x46\x6d\xbc\x33\xe1\x1c\x0d\xe0\x87\x46\xf2\x69\xf1\xc6\xcb\x03\xec\xac\x0d\xdc\x97\xf6\x28\x8b\x45\xaf\x84\xf3\x04\x9f\x56\x7d\x63\x10\x79\x83\x1f\x7b\xd8\xc3\x5c\xf0\xf2\x8e\x5b\x85\x72\x6b\x79\xe0\xe4\xa2\xc0\x8f\x13\x5c\xbe\xab\xb7\xe2\xd3\xb2\x24\x87\x6b\x32\x04\x7e\xe4\x7a\xc4\x4b\x7e\xc1\x25\x6f\x3f\x9c\xc9\x10\x44\x11\x89\x6c\xa5\xe8\xa9\xf8\x7c\xe0\x55\xdd\x2f\x20\x40\x20\x0d\x54\xb1\x2d\x71\x40\x68\xed\x00\xaa\x0e\x79\x71\x65\xb5\x37\x91\xd5\x40\x48\xb4\x36\x95\x8f\xcf\x75\xe7\xaa\x7d\x33\xf2\x80\x48\x9b\x7e\x90\xb1\xbc\x3c\x9d\xfb\x4e\x7d\x00\x31\x0b\x90\x41\x70\x30\x9a\xc5\x47\x8e\xaa\xb1\xa7\xa2\xac\x97\x69\x75\x3a\xd7\xb0\x3c\xa3\xf6\x7d\x55\xf3\xe3\xa9\xfd\x90\x0a\x30\x2b\xe1\x4a\x6d\x73\x7e\xaa\xde\x8a\x61\xe2\x06\x14\x42\xd2\xba\x1b\xbf\xbe\xac\xb7\x3d\xb0\x88\x1d\x92\x50\x8a\x18\xb7\x4d\x8f\x71\xd7\x1e\x32\x22\xdd\xf6\xaf\x75\x61\x2c\xc4\x86\x83\x18\x4b\x98\x9d\xee\x7d\x36\xe8\x78\x10\xe0\x5a\xf1\x75\x33\xfb\xcd\xe4\x04\x18\xe7\xd1\xc0\xb1\xdf\xe8\x9e\x74\x04\xf8\x5b\x5f\x25\xb9\x1f\x5a\xea\x44\x9a\x9f\xfb\xa1\x19\x70\xcf\xc7\xa6\x9a\xed\x36\xba\xbc\xc3\x86\xc1\xbd\x5a\x1c\x70\xca\x98\x68\x97\x9d\x5e\x3a\x37\xd5\x33\x01\x19\x6b\xc4\x5a\xec\xe0\x20\xdf\xf8\x4f\x0d\xb6\x00\x24\x25\xf8\xb6\x9b\xc0\xbf\x75\x0d\x1c\xdd\x56\x49\x63\x53\x9f\x31\x94\x28\x80\x6a\x12\xad\x00\x8a\x90\xd8\x77\xab\x4d\xa7\x96\x3f\x98\xf3\x8a\x24\x5a\x3b\x69\x0c\xf9\x7e\xb0\xf5\xa0\xac\x28\x5d\xfd\xcd\x2d\xea\xcd\xfe\x85\x6a\x59\x5c\xd9\xca\xee\xce\x55\x38\x01\x12\xc3\x70\x76\xad\xea\x4e\xbb\xca\x3c\xbe\xf6\x1c\xcd\xab\x6c\xc4\x26\xca\xaa\xee\x07\xd7\x03\x4e\xb6\xf6\xc2\x04\x3d\xcb\x4e\xe9\xe1\x70\x99\xf3\xfc\x7d\x78\x65\xda\xf7\x84\x71\xda\x2d\x8a\xcc\xca\x74\xbb\x23\x4a\x52\x53\x0d\x86\x77\x07\x93\xb2\x87\x82\x44\x62\xd2\xf8\xcf\xb3\x7a\xe3\xb2\x8b\xd8\x75\x20\x25\xb3\x4b\xe1\xa6\x84\xae\xb1\x64\xe1\x59\x93\x73\x49\x47\x14\x42\x23\xa4\xb2\x9a\xed\x56\xfb\xa7\xd9\xe3\x6a\xff\xf2\xfc\xe0\x68\x27\x3a\x12\x2c\x66\x2d\xed\xa4\xc9\xa0\xb7\xf0\x81\xd1\xe2\x55\xd0\x63\x3f\x41\x38\x60\x76\x03\xcd\x36\x65\xab\x55\x46\xbc\xcc\x0d\x10\x3e\x62\xdf\xcd\xec\x68\x12\xdf\x95\x3a\xcb\x81\xe2\xfb\xc4\xbb\xe3\xd6\x50\x4d\xb4\x0f\xb4\x07\x56\xb3\x70\x25\xab\xac\xef\x7e\x4d\xf4\x3f\xe3\x35\xea\x5f\x7e\x27\xe9\x69\xed\x43\x06\xcb\x84\x8e\xc3\x98\x27\xa6\x6c\x76\x80\x00\xb9\x71\xee\x27\xc7\x11\x84\xc6\x00\xcc\xd8\x72\xe0\xc1\x6b\xd1\x00\x4d\x15\xc1\x53\xe8\x34\x57\xab\xe3\xa9\xbe\xcc\x21\x07\x8d\xbd\x5c\x13\xbd\xda\x71\x49\x98\x20\x19\xe8\xc0\x8f\xf0\x7c\x3a\x15\x79\xb7\xa3\xe9\x24\x21\x48\xf1\x7c\x2b\x8e\xc7\xb4\x7d\xea\x4c\x10\xde\x79\xda\x1f\xd3\xdc\xc8\xfb\x54\x3d\xba\x8c\x1b\x29\x4d\x0b\xa0\x82\x7a\xf6\xc1\xd3\x8c\x8b\x0c\x90\x07\x6d\xae\x68\x38\x98\xc7\x46\xa8\x55\xf0\x5a\xbe\x2d\x3a\xa8\x9b\xdb\x46\x35\xa7\xca\x37\x72\xbb\x0f\x85\x7c\x3f\x8f\xc4\xe0\x34\xa7\x10\xf9\xae\xc0\xb0\x2c\xcf\x87\xee\x83\xcc\x28\x8d\xa1\x23\x96\xd1\xa2\x18\x7f\x96\x07\xac\x47\xc1\xb2\xbd\x9f\x4e\xc4\xbd\x19\x11\x23\xb9\xa1\xb9\x4d\x8e\x8f\xd6\x63\x68\x68\x2e\x01\x2f\xd5\xb5\x23\x90\x71\x6c\x8f\x09\x3f\xc4\xfe\x65\x55\x8a\xd1\x35\x8b\x44\x61\xbc\x85\x77\xb0\x7a\x43\xde\xf9\xc4\x2a\xa6\x05\x8b\x30\xfb\xdf\xdc\xcd\xfa\xfb\x98\x16\x3c\x56\xfd\xfc\x66\x96\x5f\x56\x2f\x8b\x20\x08\x7f\xd2\xf8\xd3\x32\x4c\x8c\xcd\x1f\xd6\x64\xad\x42\x72\xfb\x4a\x48\xea\x61\x0f\x62\xf6\x6d\xb6\x7e\x98\xcd\x1f\x56\xfb\x97\xd5\x76\xf5\xf2\x6d\x35\xc4\xc4\x69\x99\x88\xc8\xc1\x22\xf6\xa6\x59\xb7\x6f\xe6\xda\xf7\xb4\x7e\xfb\x9a\xe6\xf5\x53\x51\xef\x9a\xbc\x71\xde\x7f\xdf\x54\x18\xc6\xd2\xe5\x46\xe8\xff\x80\xeb\x49\x7b\xa7\x54\x64\xb6\x8c\x16\x03\xf1\x92\xca\xf1\x4a\xa5\x88\x2f\x6c\xb3\x6b\x5e\x36\x87\x87\x57\xa7\x62\x40\x04\x86\x15\x9d\x07\xd3\xba\xbd\xd1\xc2\xd2\xda\x33\x02\xf7\x5c\xa9\x07\x23\xa1\x7d\xc3\x92\x70\xf8\x1b\xb4\x8a\xf0\xc5\xd0\x50\x1b\x7d\xb3\x47\xde\x24\x96\xda\x2e\xdf\xda\xf3\x24\x61\x16\x89\xf7\x74\x3e\x5a\x11\xb1\xf6\x1d\xe8\x6d\xab\x53\xe7\xd7\x9e\xaf\x7d\x94\x73\x41\x32\xd0\x6b\x7e\x32\x7a\x54\xed\x41\xed\x25\x4e\x6d\xf6\x08\xdf\xf8\xb5\x5d\xcb\x4f\xe3\x59\x3c\x03\xef\x08\x7c\x6d\xe6\xd4\xdb\xd2\xdc\x77\x05\x61\x10\x1b\x1f\xfe\x22\x5f\x9e\xab\xba\x35\x01\x68\x07\x90\x04\xeb\xef\x8e\x27\x6e\x84\x59\x9c\xe2\xd1\x10\x76\xa8\xbd\x20\xf6\x49\xe2\xd2\xdd\x6c\xba\xf5\xa0\xbd\x28\xe2\x38\xab\x8b\x4c\x2d\x4a\x5e\x43\x85\x72\x43\xf6\x20\x89\x0d\xd1\x1f\x05\x4b\x78\x05\x63\xfb\xc9\xe1\x95\x12\xce\xb4\x03\xb1\x6f\xb2\xe2\x5a\x9a\x76\xf8\xcd\x04\x9c\x8d\xa3\x6e\x82\x20\x4b\xe9\x1d\x9e\x32\x66\x22\xb2\x73\x78\x03\xb5\xb8\xec\xd2\xcc\xe5\xf5\x7e\x1f\xcd\xa4\xbd\x58\x08\x42\x5b\x3f\x4d\xc7\x76\x18\x9e\x8d\x7a\x31\x6e\xdf\x0f\xaf\x0b\x77\x85\x89\x32\xc6\x50\x1b\x7e\x79\x4c\x3b\xf3\x21\xed\x31\x2f\x46\xde\xd2\xf6\xf1\x65\xd7\xd5\xc7\xb4\xc7\x42\x62\x4d\xe9\x41\xbe\xdf\x01\x6c\xe5\x1b\x5c\x69\x43\x36\xc3\x8c\x26\x44\x5a\xf5\xda\xd5\xda\x63\x34\x26\xcc\xbd\x93\xe5\x07\x94\xad\x66\x5a\xf7\x2b\x99\xd6\x88\xc4\x77\xcd\xb5\x45\x5a\x8f\x6f\x0b\x0f\x02\xc4\x79\xef\xab\x37\x5e\xde\x10\x87\x1c\xdd\x6d\x11\x6a\xd9\x3a\x47\x7f\xf0\xac\x0f\x96\xd6\x9e\x60\x92\x75\x90\x43\xb4\xdd\x42\x39\xdd\xf6\xb8\x96\xcc\x60\xc5\x2e\x0e\x54\xd6\xb5\x9f\xb5\x27\x09\xc7\x8a\x52\x3b\xa9\xd3\x22\x6f\x6d\xf8\x7f\x13\x85\xe9\x4e\xa5\x0c\xf9\x76\xdb\x5c\xd9\xaa\xaa\x5b\x6b\x5d\x7b\x1c\x64\x10\xda\xfa\xc7\xca\x40\x34\x5a\xca\xf7\x20\xcc\xd6\x5e\xb3\x3c\xc9\x16\x85\xb9\x4c\xab\xba\xcf\x2d\xb7\x71\x8b\xf6\x74\x40\x95\x3d\xe1\x7a\x89\xba\x7c\x93\x21\x53\x33\xd0\xc0\x32\x8d\x1c\xa6\xd9\x2e\xe7\x97\x0d\xbf\x40\xfb\x78\x75\xa0\xa9\xe3\x37\xed\x16\x53\x61\xad\xf6\xbd\x20\x61\xb1\x4b\x5c\x5e\x40\xc1\x71\xe0\xd3\x3e\xb8\x06\xdf\x53\x12\x95\x21\xd0\x98\x6c\x88\x2e\x9f\x7c\x07\x7d\x1f\x0c\x03\x40\x16\x59\x06\xd2\x18\xbc\xdb\x5f\xe7\x07\x7e\x60\x0c\xa5\x6a\x38\x7d\x19\xd7\x0e\xb4\x1f\x10\x99\xf4\xe1\x74\xa8\xf9\xf7\x0b\x13\x3d\xed\x87\xd2\x30\x00\x8d\x97\xdf\x43\xc1\xd5\xa8\xb9\xa7\xfd\xc8\xf3\x91\x34\xff\xac\x52\xb4\xd5\x1a\xdd\x90\x38\xe4\x12\xe5\xef\xe5\x7f\xce\x69\x6e\x5b\xd4\xa3\x31\x34\x4e\x30\x65\xda\xbd\xf1\xbc\xa8\xfe\xea\xcf\x08\x9f\x26\xc6\xff\xb0\x84\x4a\x9e\x61\x04\x74\x19\x55\xe4\x9a\xd1\xc6\x63\xa6\xd9\x4a\x6d\x51\xef\x7b\x9a\x65\x28\xbd\x79\x99\xb9\xfe\x46\x7b\x6e\x61\x71\x82\xe7\x32\xef\x4b\xda\xd8\xc3\x49\x24\x30\x09\x35\x0e\xbe\x83\x5f\x95\x90\x90\x89\x81\x2e\xd2\xc8\xa7\xca\x8d\x8b\x45\x60\x35\x5c\x7a\xec\x2a\xed\x33\xcf\xc3\xec\xa7\x43\x28\xe2\x62\x3f\x75\x73\x58\x20\xa4\x91\x12\xbd\x43\x5e\xc6\xf8\x30\x15\x32\xec\x0c\x63\x3a\x4d\x39\x7b\x9c\x2b\x9a\x18\xfe\x1a\x57\x22\x55\xe3\xf9\xca\x15\x45\xe9\x5c\x2c\x6d\x99\xcd\x75\x7e\x6d\xb8\x3a\x98\xb5\xc2\xf3\x91\x75\x2d\xa0\xf6\x3d\xcf\x1b\x4d\x07\x11\x85\x18\xcc\x00\xaf\x2e\x66\xef\xba\x59\x1a\x72\x9f\x88\x43\xf4\xf0\x35\xba\x19\xf6\x8f\x92\x04\xb8\x7d\x18\xcb\xd5\x71\x6d\xbf\xaf\xc4\x3a\x7c\x8f\x7d\x49\x08\xb3\xae\xca\xc7\x53\x5a\xe4\xf7\xbd\x28\xf3\x56\xa1\x63\xf4\x83\x24\xf7\xb0\xd4\x62\x21\x9f\x8b\xe2\x68\x63\xf9\xde\xc6\xd4\x8d\x56\x81\x27\x88\x5b\xf4\x65\x91\x2b\xac\x89\xf7\x8b\xab\xcd\x18\x23\x36\xfb\x61\x60\xe5\xbd\xac\x41\xfb\x2a\x31\x56\x65\x0e\x71\x74\x5f\xf2\xbc\x86\x21\xdf\x45\xfb\x8a\xf9\x08\xd3\x92\xb2\xcb\x52\xda\x43\x4a\x75\x86\x34\x9b\xa2\xc8\x26\xfd\xa8\xb4\x0f\x41\xc2\x3b\x88\xe9\x16\x0b\x32\xd3\xaf\xbd\xa6\x5e\x14\x5b\x09\xa0\xb4\x84\xca\x31\xa5\x07\xf3\x40\x2b\x46\x5d\x39\x9f\x5f\xa6\xf3\xd1\xe1\x79\x03\x8f\x86\x88\x48\x6b\x16\x93\x17\xd3\x8a\x74\x47\x12\x23\x23\x76\x33\x06\x86\x1f\xf5\xac\xde\x34\x6f\x5a\xf3\x43\x06\x67\xf5\xc3\x08\x5f\xe3\xbb\xac\xf8\x4c\xf3\xc3\x57\x9e\xb6\xa7\xf5\x59\x82\xe6\x1b\xcd\x69\xb1\xeb\x7e\xae\xdf\x46\x1f\xd6\x81\xa5\x7b\x55\x6e\x79\xf9\xad\xc8\x2f\x08\xbc\x20\x11\xdd\x3d\xc2\xf5\xc3\x08\x31\xb5\xc9\xf9\xe8\x03\x24\x91\x46\xce\x51\xeb\x7f\xc2\x44\xa8\xe9\xc6\xc5\x21\x9a\xd1\x61\x19\x02\x73\xec\xf6\x91\xf7\x8a\x68\x3a\x08\x7d\x1f\x1f\xe7\x7d\x73\xff\xeb\xb4\x4d\x36\x75\x10\x26\xc6\x3b\xc4\x14\x24\x33\x38\xf0\x1a\x1e\xab\xc3\x16\xae\x24\x1b\x75\x10\x4a\x8a\x04\x47\x33\x29\x66\x65\x8d\x99\xed\x54\x9d\xeb\xf6\xad\x08\xc1\x37\xf6\x22\x6f\x4d\xaa\xd0\x5f\x28\x83\x88\x09\xe1\xf5\x66\xf7\x86\xcb\xf7\x2e\x7a\x77\xa3\x08\xd7\x68\x5c\x76\x34\x2a\x6e\x0e\x87\x75\x8b\x2c\x35\x19\x03\x05\x04\xfc\xd8\x82\x05\x1f\x8a\xc3\xaa\x2c\x8b\x72\x56\x1e\xfa\x1a\xbc\x3a\x20\x3a\xc1\x08\xed\x8f\xf5\xd3\xfe\xee\xf9\xf5\x69\x69\xba\x24\xb3\xe5\xf2\x65\xb5\xdd\xba\x51\x71\x00\xa6\x43\xec\x68\xe3\xa3\x27\x19\xc7\x2a\x30\xaf\x47\x71\x1a\xaf\xd7\x01\x0d\x8c\x72\xe1\x7e\x5f\x17\x4b\x90\x28\xab\x3d\xfa\x3c\x4d\x22\xdc\x8b\xef\x8b\x4c\x4d\x2c\xf9\x01\x95\x06\xda\x59\xbd\xa5\xba\x9e\xa7\x75\xf5\x82\x32\x31\xd7\xe5\x8d\x66\xa8\x50\x7c\x08\xdf\x8e\xdc\x65\x24\x42\xca\xa0\x67\xb8\xd6\x2f\x46\xe9\x20\x91\x8a\x23\x15\x66\xb1\x1b\x7d\x7d\xa2\xe2\x80\x74\x50\x49\x2b\x36\x79\xbd\x08\xf7\x17\xe3\xc9\xa0\x2a\x60\xc4\xc3\x82\x97\x36\xc2\x68\xdb\xba\x38\xf5\xda\x2d\x3a\x60\xcc\x90\x91\xe6\xbb\xc5\xeb\xef\xd5\x57\x75\xc0\x84\xc4\xf2\x1a\xaf\xaa\xf4\x90\xdf\xc8\x59\x46\x77\x89\x49\xdf\x8b\x7a\x7e\x49\x0f\xc0\x15\x94\xa2\x68\x52\x49\xf7\x5b\x78\x48\xf1\xa6\xe3\x4e\x38\xcb\xb2\xd7\xbc\xea\xb6\xd1\x40\x78\x04\x63\x3f\x55\x34\xbb\x70\xe7\xd3\x3d\x48\xca\x02\x11\x44\x8e\xbb\xfa\x04\x9f\xd6\x71\x7d\xdc\xa0\xfe\xf9\xbb\x24\x42\x82\x02\xf1\x06\xd8\x74\x9f\xea\x7a\x82\xed\xaf\x03\x15\x19\xd6\x19\x57\x6a\x59\xc8\xda\x22\xf4\xc2\x60\x12\x31\x7c\x03\x4f\xd1\xff\xaf\xdd\xd6\x86\xda\xce\x3a\x00\xad\x51\x85\x64\xe1\x9c\x5d\x9a\x18\x98\x87\x76\xbf\x5b\xc2\x48\x10\x42\x87\x9e\x36\x86\x13\xc6\xc2\x02\xeb\xcf\x59\x0b\xfa\xd1\xa1\x0f\x0c\x21\x95\xa7\x32\xfd\x1b\xb7\xaa\x81\xad\xac\x0e\x7d\xcd\x20\x6e\x37\x53\xb4\x73\xb7\xf1\x95\x51\x2c\x73\xaa\x24\x3a\x0c\x03\x2e\x68\x6f\x61\x59\x42\xdd\xb9\xde\xeb\x30\x02\x8d\x33\x6f\x53\xa6\x47\xde\x5f\x91\x42\xc2\x24\xe2\xf9\x5e\x66\xbb\xd5\x7e\x3b\x7b\x58\x21\xb9\x30\x70\x87\x63\xa9\x49\xeb\xc9\x6d\x6c\x17\x76\x5f\x87\x37\x3f\xa4\x94\x7a\xa4\xcd\x15\x56\xcd\xc0\xdb\x4d\x70\xf7\x99\xc4\x44\x8c\xcd\xef\xfd\x31\x5a\x50\x42\xaa\x42\x74\xff\x01\xf4\xd0\xc1\xdb\x7a\xee\x70\xa5\x3a\x64\x91\x6f\xe4\x87\x6c\xf0\x8e\x81\x7f\xb5\x2b\x5c\x0d\xc1\xd1\x45\x86\x67\x65\x1c\x08\x31\xf1\x2b\x94\x70\x3e\xae\x7e\xd4\x25\xb4\x71\x43\xc8\x09\xa0\x06\x7c\x5a\xad\x65\xd1\xfe\x91\xf9\x4e\x51\x0e\x77\xb4\x4d\x2a\xeb\x73\x09\xa3\xa7\xcc\x95\x44\xd0\xd2\x3d\xff\x1b\xe1\x25\x23\x65\x1e\x1d\x72\xcd\xa8\xab\xdc\xb7\xae\xf0\xbf\x44\xcf\xfd\x4e\x0b\x51\x87\x42\xfb\x08\xea\xab\xd2\xda\x71\x47\xf7\xee\x7b\xa5\xcf\x9d\x0d\xc5\x2e\xad\xbb\xdf\x23\x2d\x31\x98\x2b\x75\xae\xae\x54\x21\x86\x4f\x57\xf9\x02\xf9\x0a\x55\x5d\x9c\x36\xa8\x97\xbd\x6f\x72\x2a\xdf\x9d\x4b\x85\x0c\x9b\x57\x2d\xd1\x64\x7e\x99\xf5\xda\x4b\x93\x41\x73\x08\xc4\xc7\x28\xfe\xbf\x5f\x1f\xd6\x0b\x57\x9f\x08\x21\x11\xdc\x90\xbe\xec\x83\x5d\xa6\x25\xc8\xdb\x86\x9a\xc3\xa7\x00\x3a\x42\x7d\x92\x7d\x73\x49\xcf\x9f\xf9\xf4\x5d\xb6\x83\x75\x14\x18\xdc\x92\xe1\x17\x15\xa2\xaa\x0d\xc3\xa1\x8f\x56\xf9\x25\x99\x79\x70\x4d\x5a\xd0\xd8\xc5\x6c\xc6\xe5\x65\xc1\xdb\x62\x48\xe4\x25\x1e\x6d\x25\x86\xe5\xf9\x78\xce\x3a\x83\x5e\x1d\x79\x5a\x22\xc3\x43\x9c\x2f\xf3\xf9\x62\xf8\x7e\x45\xbe\x36\x3a\x6c\x5f\x5f\x77\x61\xb4\x7f\x59\xed\x66\xce\xed\x5c\x47\x41\x18\x62\x25\xa8\x95\xba\x1f\x84\x5a\xc3\x47\x19\x05\x4c\xcb\xb6\xa5\x5d\x64\xaa\xf8\xcc\xbf\xf4\xda\x0e\x3a\x0a\xb4\x8a\xfc\xfe\xc6\xd0\x0b\xdf\x46\x4b\x6e\x14\x06\xcc\x1a\x91\x63\xe9\x63\xc1\xab\x37\xc1\x47\x35\x55\x1d\x45\x5e\x82\xa3\x9a\xd9\x83\xaf\x45\x8b\x15\xd0\x51\xac\x03\xdf\x10\x84\x5e\x73\x8d\xc2\x3e\x53\x72\xd5\x3a\xa2\x1e\x41\xdc\x0b\x12\x98\x04\xcf\xdf\xbf\x15\x2d\x53\xc1\x9d\x2b\xd1\x8a\x39\x54\xd4\x7d\x09\xb7\x9e\x7b\xc4\x44\x10\x77\x8c\x1f\xa3\x7e\x33\xf5\x74\x5b\x88\xdd\xd4\x14\x48\xda\x93\x25\xb8\xba\xff\x71\x11\xb6\xd9\x7c\x85\x68\xd4\x11\x8f\x63\x6c\x3e\xe9\xc2\xda\x1b\xab\x2b\xf7\xd4\x5b\xec\xf7\xe1\x4f\xe7\x94\xe3\x94\x9d\x67\x6d\x5e\x18\x71\x11\x58\xb6\x48\x6d\xfa\x7c\xad\x1e\x69\xf7\x39\x11\x6b\x5c\xd8\xf6\x18\x3f\xa1\xb6\xc3\x14\x28\x4c\x47\x42\xf9\xd4\x58\x13\xf2\x6c\x7e\xbe\xb4\x69\xd3\xf4\xac\xff\xe9\xcb\x10\x09\xed\x23\x36\x63\x07\xf2\x2d\xed\x61\xee\x74\x24\x99\x49\x6d\x5a\xc1\x0a\x43\x1e\xbb\x2b\xca\x6b\xa5\x1f\x1d\x49\x6d\x24\xd4\x8b\x7c\x9b\x1e\xf2\xd7\xd3\x94\x39\x90\x8e\x14\x8d\x2c\xfd\xd6\x52\x45\x93\x9f\x45\xea\x6e\xc5\x88\x94\x32\xb2\x74\xc6\x4b\x06\x11\xc0\xbd\x5a\x41\x04\x3c\xc0\xdc\xd9\x86\xe1\xc3\xc0\xc3\xd5\x58\x22\xed\x85\x9c\xf5\x14\x71\xdc\xde\x41\x3c\x0a\x58\x4b\x58\x14\x79\x75\xce\xea\x9e\x9b\xdc\xf0\xd7\x13\x2f\x51\xd4\xc4\xcf\x4d\x42\xf2\x1d\x44\x7b\x06\x2e\x94\x74\xbc\xaf\xa5\x63\xed\xb7\x47\xb5\x44\xe3\xa7\x73\x05\x6a\x2d\x8b\xbe\x4a\xa4\x26\xbe\xc7\xad\xe3\xca\x73\x6e\x4a\x69\xc3\xef\xf4\x95\x9f\xd8\x5a\xf3\x5d\xd6\x84\xd3\x8b\x22\xcf\x8d\xed\x68\x35\x58\x13\x48\x10\x1a\xd0\x7c\x61\x81\xd2\x7f\x9e\xa1\xbc\xdc\xf3\xd1\x2c\x23\xa1\x24\x3c\x6c\x2b\xff\xce\x52\x61\xf8\x2e\x10\x12\x44\x88\x20\xbf\x87\x3c\x2f\x3e\x06\x81\x08\x21\x31\x48\xd1\x85\xd9\xaf\x79\x2a\x8b\x91\xd7\xae\x26\x44\x19\x95\x5f\xa3\xe4\xf3\x9c\x67\x17\x74\x6f\xd6\x29\xa8\x05\xfa\xe3\x8d\x41\x3f\xee\x73\x10\x80\xad\x7b\x2e\x78\x95\xe6\xc5\x64\xb9\x92\xc4\x21\xc3\x09\x51\x9c\xea\x35\x2a\x0e\x2d\xb2\x26\xae\x96\xee\x37\xc6\x82\x30\xee\x1a\x5c\x31\x72\x02\x02\x2f\x20\xdd\xe1\x98\x38\xfb\xf9\x1f\x96\x3e\xf6\xc7\xf7\xb7\x61\xb4\x40\x68\x68\xac\x51\x3a\x16\x02\xd6\x39\x7e\x62\x1c\x7d\xe5\xb4\xa3\x09\x8d\x02\x84\x47\xfc\x13\xe0\xfd\xae\x28\x9b\xed\xc4\xfd\x8a\x24\x22\x8e\x83\xd6\x53\x58\x72\xaf\xbc\x3d\xe5\xe0\xae\x26\x44\x72\xdd\x43\x01\x8e\x6e\x3a\x0b\xfc\x80\xb8\x9a\x80\x7a\x3a\x1f\xdd\x37\xb1\xd8\x8b\x59\x67\x23\x67\xef\xa9\xd1\x43\x1c\xcc\x21\x46\x29\xb3\x69\xef\xb6\x47\x52\x74\x47\x13\x23\x61\x23\xec\xae\x73\xcf\x2b\x34\x06\xd9\xb7\xdf\xa3\x43\x23\x44\xfa\x06\x8b\x66\xa9\xbd\xe7\x35\xbc\x03\x9c\xda\x7a\x09\xe1\x11\x4d\xfa\xc6\x18\x3b\x27\x35\xa7\x89\x60\x89\x48\x5c\xab\xf8\x60\xb0\x38\x69\x7e\xb8\xe7\x13\x9e\x92\x9a\x08\x69\x5a\x19\x07\xd3\x47\x72\x6b\xa0\x79\xf7\x0d\xe4\x6e\x38\x65\x24\x84\x28\x4f\xbe\xe7\xca\x24\xaf\xbb\x62\x7a\xeb\x21\x2a\x30\xf4\x9b\xba\x88\x83\x55\x2e\x0b\xd5\x77\xe2\x1a\x0d\x85\x28\xb2\xc1\xc2\xb6\x2e\xe4\xfb\x38\xad\x9b\xfe\x02\x20\xbe\x68\xe6\xc4\xb7\xdd\xf3\xf6\x57\x6c\x29\x4d\x80\x2a\xc4\x31\x99\x12\x0d\x0a\x92\x9a\x82\x9d\x4b\x1a\x88\xf6\x43\x2c\x7b\xe9\x02\x1d\x66\xdb\x3f\x27\x02\x7f\x5c\xcd\xdf\x4d\x99\xa7\x7a\xeb\x60\xe1\xc3\x88\x83\x68\xa9\x51\xdf\xb1\xd3\xa2\x7e\x82\xcf\x49\xf9\xcb\xc9\x8c\x99\x68\x10\xa1\xad\x06\x7e\x2b\x6a\x28\x9b\xff\x58\x50\xcc\x68\xa0\x4e\x10\x86\xff\x80\x6e\x75\x59\x5b\xf3\x73\xf4\x8e\xf1\xad\xeb\xd0\x2e\xc3\x9b\x18\x7b\x9e\x97\xf8\x3d\xe9\x97\x0d\x94\x8f\xa9\x2c\x8b\x3f\x9c\xaf\xb7\x8e\x3d\xae\x13\x2b\xf6\xf0\x84\xe4\x64\xb7\x34\x7f\x19\x9d\x4a\x2a\x6d\xb3\x37\xdf\x14\xa2\x21\xcb\xfa\x75\xef\xd8\x27\x02\x49\x1f\xdb\xd5\xe2\xf9\x69\xb9\xdf\x7c\x9d\x6d\x57\xfb\xcd\xcb\x7a\xb1\xda\xdf\xcd\x16\xbb\xe7\x97\x76\x20\x57\x9e\xcd\x43\x5e\x0a\xb4\x85\xba\x92\x0e\xd6\x71\xa0\x02\xc4\xa3\x1a\xf0\xe7\x4c\xfd\xfb\x6c\x54\x43\xfa\x78\x1d\x1d\x87\x1e\x8d\x5c\xa7\xb4\x86\x13\xce\xe9\x1b\xb5\xb7\x66\x2c\x62\xe3\xd0\xfa\xe3\xae\x25\x63\x62\xbb\x6a\x09\x79\x71\x4c\xf3\x5e\x14\x1b\x87\x09\xe5\x96\x10\x6e\xcc\x09\xce\x25\x8e\x37\xa5\xae\xeb\xb7\x2d\x0e\x19\xc1\x9a\x9d\x29\x5e\x80\xda\x63\x49\xde\x1d\xe4\x12\x61\x6b\x7b\x4b\x77\x75\x7f\x8f\x7c\x8a\x28\xad\x13\x4f\xd5\xa8\xd9\xed\x46\x50\x2a\x5a\x01\x52\x7e\x1c\x1f\x55\x11\xae\x5a\x9f\xd0\xde\x5e\x12\x04\xb1\x65\x31\xb4\x14\x06\x1d\x13\x12\x06\x5e\x2f\xb6\x36\x40\x79\x77\x10\x8c\x8f\xb1\x6b\x5c\xce\xcb\x22\xff\xbb\xfd\x8d\x71\x22\xf1\x17\xa8\x22\xe7\x68\x1d\x00\x19\xd4\x8e\x54\xa1\xe3\x98\x1b\x65\x47\xcc\x07\xcf\x79\x7d\x19\x09\x1c\xd8\x61\x94\x50\x94\x77\xb1\x76\x9f\xfb\x96\x91\x3a\xbc\x20\x2a\x99\xd3\x9c\xb2\xde\x6c\x68\x99\x9e\x8e\x1c\x07\x75\x9c\xc4\x54\x7a\x2d\x3e\x23\x57\x5b\x5c\x5e\x4e\x57\x18\x1f\x1d\x33\x2e\xd1\x8b\xc3\xe2\x52\x8d\x9a\x7a\x4f\x01\x4b\xc7\x0c\x02\x04\x48\xf7\x63\xb8\xf6\x98\x0e\x31\x68\x33\x10\xc9\xd5\xb1\xf8\x77\xda\x3e\x55\x1e\x2b\x24\x46\x21\x33\xa2\x75\xbc\x70\x47\x65\x18\x62\xc1\xc3\x30\x59\x9f\xbf\x3f\xad\xda\x67\x24\x13\xf3\xae\x3c\x6e\xee\xdb\x1e\xa8\x3d\xa4\xac\xdd\xcb\x16\xd4\xe6\xf9\x7b\x3f\xaa\x88\x55\xac\x4d\x49\x6d\xb1\xfb\xe5\x92\x18\x6b\x4f\x21\xe8\x74\x97\x9e\x90\x47\xe4\x4e\xa2\x03\x86\xda\x69\xda\xb8\xfc\x54\x0e\x75\xd1\xe7\xc7\x6a\xea\x51\x0f\xcb\xbe\x7b\x6b\x7f\x80\x0a\x55\x69\x7e\x18\xca\x44\x0c\xee\x33\xf5\x84\x49\x5b\x36\x69\x13\x61\x76\x6a\x62\x13\xf5\xbe\xe9\xf4\x9f\x7a\x32\x52\x76\xbd\x9a\x9f\x2f\x30\x80\x7f\x0c\x91\xb9\x9a\x7a\x60\xf4\xf1\xb7\xbb\xd9\x1f\xab\xfd\xe3\xeb\xc3\x6e\xbd\x79\x58\xb7\xb7\x98\x7a\x9a\x47\xcc\xb5\xf1\xac\xbe\xe3\x70\x0a\x51\x5f\xc6\x58\xc0\xfe\x3e\x7b\x78\x58\xed\xf6\xbb\x64\xf5\xd7\x7e\xf1\xfc\xf8\xf8\xfa\xb4\x76\x8a\x72\x9a\x06\x81\x31\x0e\x68\xde\xbf\xf7\x34\xcb\x76\x97\x13\x2c\xba\x1b\x15\xc8\x04\x61\xf7\x82\xb7\x7f\x0a\x19\xa0\x4c\xde\x31\xcd\x57\x79\x8d\x1a\x99\xed\x21\x15\x38\x1c\xf6\xba\x7a\x81\x0f\xc8\xcf\xb0\xe1\xe9\xb4\x9e\xb1\xa6\x11\x33\x4c\xc8\xaa\x2e\x17\x45\x2e\xf9\x14\xec\x49\xd3\x48\x7a\x26\x28\x38\x0b\x0c\x39\xd6\xf9\x47\x91\x4a\xb8\x3a\xe9\xf8\xe4\x60\xfc\x9f\xad\x57\xfa\x88\x60\xa9\x29\x21\x86\xd6\x7c\xea\xdc\x3a\x83\x2d\xe4\xa6\x33\xbd\xe8\x4f\x16\x42\x15\xd6\xd5\xde\x91\x3f\x3d\x64\xaa\x69\x4a\x63\x4d\x48\x0b\xc7\x1e\x3d\x02\x9a\x30\x2c\x97\x3b\x60\xcc\xa2\x15\x17\x77\x2f\x19\x4d\x42\x82\x3c\x33\x9c\xc5\x58\x91\x6a\x15\xe9\x35\x4d\xa2\xd8\xa0\xdd\xf2\xb4\xee\x5b\xe0\x69\x9a\xc4\x1a\xe5\xca\x1f\x8a\x03\xe6\x0c\xd8\x34\xf8\x15\x9b\x65\x38\xc5\x92\x84\x20\x1a\x74\xcc\xc6\x99\xde\xdf\x69\xa2\x08\x1a\xd9\x1f\x55\xdd\xb9\xc8\xb5\x3f\x07\xa2\xc4\x39\x18\x55\xc6\x95\xe0\x59\x77\x04\x0c\x4d\x99\x8a\x91\x46\x34\x9f\xed\x66\xf7\xed\x66\x49\x05\xa1\x8e\xa8\xbe\x5d\xdc\xb9\xbf\x4a\x16\x06\x76\x72\x3f\x1a\xed\xf8\x8e\xd2\xd9\x0e\xa1\xb6\x5e\x7d\x4c\xf3\xbd\x72\x5e\xf0\x13\x21\x33\x05\x9f\x1a\xd7\x5d\xe3\x2a\xd0\x29\xed\x6a\x0a\x84\xa3\x4a\x83\x75\xa1\x5e\x57\xdd\xf7\x4c\x4f\x59\x4d\x34\x6a\x0e\xe0\x2c\x49\xff\xc6\x2d\xf3\xb5\x4e\xb3\xca\x55\x61\x13\x2f\x48\x30\xb2\x3b\xc2\x81\x2f\x78\xae\x2e\xfd\x35\x2e\xf1\x44\xcc\x8c\xf8\x69\xee\xfc\xc5\xfb\x4b\x75\xe2\x4b\x62\xc4\x99\x8a\x34\x7f\x34\xb6\xd1\xee\x88\x16\x88\x74\x39\xe7\x6f\x69\x5e\x7f\x99\x2a\xab\x25\x81\xf0\x5d\x5f\x13\x5d\xf0\xd2\xc3\x84\xea\xf9\xe0\xa9\x26\xa1\x04\xdf\xc8\x86\xe0\xae\xb6\x1d\xc9\x2c\xba\x51\x9a\xa0\x21\xa1\x29\xed\x77\x91\x64\xff\x8d\x4a\x22\xcf\xd8\x01\x22\xd6\x39\x6d\x7f\x78\x94\x30\xe4\x7c\x9a\xcc\xfd\xae\x28\x9d\x76\x52\x37\x00\xb8\x95\xcc\x5d\xc2\x84\x89\xe6\xe4\xfb\x9d\x44\x8c\xa1\x38\xc3\xe3\xcb\x72\xdb\xbc\x36\x83\xdb\x1c\xa9\x56\x98\xed\x31\xcd\xd3\x4d\x51\x64\x2b\xb4\x32\x1a\xfd\x62\x50\xb8\x75\x3a\x15\x85\x1b\xf7\x88\x10\x2e\xc3\x2b\xd6\xa3\x3f\xdc\x87\x13\x22\x14\xe6\x0c\x77\x65\xbb\x20\x26\x44\x0b\x24\xe4\xa2\x0c\x5f\x0f\xc1\xab\x93\x38\x30\x8d\xce\x23\xe2\x3b\xb8\x75\xb0\x1c\x9e\x31\xa1\x81\xb4\x77\x1d\xc5\x99\xea\xb7\x61\xab\xda\x0e\x63\x84\xc7\xc6\x0d\xdf\xe1\x38\xdd\x97\x30\x6a\x44\x48\xac\x03\x64\x9a\x4f\x75\x77\x13\xc6\x29\xc6\x4e\xab\xc5\xe2\x97\xfb\x6e\x22\xb4\xd6\xb2\x93\x05\xd9\x7d\x02\x8c\x5c\x92\x9c\x67\x62\xef\xdf\x53\x27\x92\xda\x00\xf8\x8d\xff\xfc\xbc\x28\xcb\xe2\x13\xca\x66\xb7\x78\x18\x93\x42\x75\x02\xca\x33\x91\x08\xbf\xd1\xf7\x4f\x00\x4c\xe1\x11\x5f\xcc\x9c\x67\x0f\xc5\x07\x98\x75\xc8\xdd\x8c\x66\xc9\xf7\x0d\xcd\xdb\xf1\xa3\x74\xa2\x99\xc0\x89\xf2\xf0\xfc\xe0\x7b\xdd\x1f\x15\x22\xba\xe7\xe7\xcb\xcb\x6e\x51\xf7\x91\x35\x89\xe6\xde\x00\x6c\x7b\x57\x16\xe8\xda\xbc\xe4\x35\xbf\xb9\xfc\x0e\xdf\x52\xe4\x63\xf7\x1d\x6c\x37\x65\x61\xd4\xbb\xa7\x74\x6e\x34\xf3\x89\x8f\x5f\x59\x42\x5d\xf2\x5e\x97\x94\xf9\xc2\xa0\x20\xf3\x22\xb7\xfe\x67\xfd\xba\x12\xf3\x85\x88\xac\x30\x3e\x66\x64\xd3\x77\x8e\x05\x20\x02\x69\x0b\x72\x30\xd2\xa2\xd5\x2c\x4c\x74\x64\x45\x56\x16\x59\x0a\x06\x87\x80\xea\xbe\xc3\x59\xc8\x42\x4e\xfc\xe0\x37\xaa\xb5\xbf\xa1\x3d\xe0\xea\x75\x2c\xa2\xc4\x56\x33\xb6\x6f\xe7\x7a\x59\x7c\xba\x17\x1c\x45\xfc\x2c\xfe\x77\xad\xe6\x97\x01\x15\xd3\x0e\x21\x1e\xb0\x16\x4a\xbe\x3d\xf1\xcf\x7c\x56\x55\xdd\xf2\xd6\x87\x60\x5d\xff\xcb\x9d\x83\x27\x0a\xbf\xa6\xe4\xb9\x33\x8e\xdc\x01\x3f\xf6\x17\x1b\x16\x8b\x28\xb6\x45\x1c\x83\x49\xdf\xcb\x1e\x2d\xe4\xe7\x61\x0a\xa3\x01\xc5\xb6\xcf\xbe\xf5\x31\x19\x5d\x46\xe2\x7b\x8c\x75\x69\x75\x35\x3e\x4c\x02\x0c\x1f\x1c\x1c\xeb\x73\x24\xdc\xa5\x59\xc2\x38\xb6\x65\x2b\xae\x61\xe9\x0c\xfe\xa6\x93\x48\xc6\xfc\x10\x43\x02\xe4\xd3\x8f\xce\xc3\x02\xc0\xd4\x85\xab\xb6\x64\xd8\x2f\xa1\x8f\xcf\x14\x06\xd8\xb6\x12\xcd\xde\xe3\x7b\xe0\xe0\xdf\xcd\x11\x8e\x74\x70\x63\x35\xd1\xbc\x63\x57\xef\x3b\xe3\x31\xc5\xf2\xf6\xd2\x09\xf0\xdf\x08\x4d\x7e\xbe\x47\x30\x11\x1a\xd6\xe7\x5b\xd1\x41\x5d\x99\xf4\x25\xb1\xea\xe6\xeb\xc5\x73\xf3\xde\xae\xdb\x8a\x47\xfb\x23\x65\x12\x85\xb4\xab\x70\x6e\x6b\xfe\x7e\x05\x54\x9e\x2e\xed\x30\xf0\x05\x36\x11\xb8\x32\xaa\xda\x87\x92\xab\xb3\xbb\xc4\xff\xdb\x6d\x6e\x06\x21\xc3\x12\xc1\xa9\x49\x6c\xf7\xe1\xbe\x84\x23\x47\xb3\xad\xfd\x60\xdd\x62\x40\x0d\x0b\xe3\x91\xff\xd8\x34\x0b\x6d\xaf\xcc\xcf\xb4\x67\x0c\xcb\xcc\x36\x31\x98\xdb\x3a\xf4\x08\xe9\x59\xf3\x2d\x73\x3e\x06\xaa\x32\x1d\x87\xe8\x0a\x68\x01\x44\xe6\xa6\x5c\x77\x15\xcd\x68\xee\x91\xd8\x91\xd7\xf6\x58\xc0\x74\x7f\x4f\xa4\x68\x4d\xeb\x37\xc6\xbd\xa9\xe7\x49\xef\x46\xb1\x08\x05\x7e\xde\xd2\xc3\x1b\x54\xf5\x3c\x55\xeb\xaa\x6d\x4a\x72\x9f\x2b\x8c\x7f\xbe\xad\x5e\xb6\xeb\x67\xd7\x78\xe3\x41\xe8\x61\x22\x84\xb5\xf9\xc5\x1b\x6f\x56\xaf\x6d\xb7\x33\xf0\x80\x18\x50\xcb\x43\xaa\x61\x0b\xf5\xde\xf3\x92\xf6\x90\x26\x32\xb0\xf1\x58\xb3\x43\x57\xdb\x9a\xb7\xae\x03\x9a\x87\x1e\x43\x19\x23\x9b\x7b\xdf\xa5\x95\xe4\xd9\x3f\xc1\x69\x0a\x69\x1e\x06\x86\xae\xb2\xdc\xee\xf6\xb3\xe5\xb7\xf5\x76\xf5\xb2\x6d\x8f\x45\xc6\x81\xdd\xc2\x23\xc7\x64\x40\xcd\x43\xa6\x50\x91\x78\x95\x81\xac\xcb\x54\xf6\x9e\x59\x73\x0c\x6f\xfa\x7e\x4a\xb2\xaf\xaf\x6b\xae\x79\xe4\xf1\xc8\x4e\xf8\x43\xce\xf3\x7a\xc3\x73\xc5\xdb\x4b\x88\x98\x91\xe3\x87\x1f\xa7\xb4\xbc\xac\x4e\x85\x74\xd9\x07\x8f\x7d\x8d\xd5\x17\x44\x9f\x6e\xcf\x28\x81\x35\x1d\x22\xf1\x38\xf2\x30\xf3\xab\x9b\x5c\x64\x94\x22\xf1\x98\xf8\x18\x80\xa3\x8e\xeb\x21\xcd\x01\x4a\xe4\x0c\x6b\x2e\x47\x65\x0f\x1e\x53\x6d\xaa\x3b\xae\x2d\x6f\x79\x0f\xed\xa9\x2c\x3e\xac\x49\x88\x96\x5d\xa4\xc3\x63\x16\xa3\x93\x37\xfc\x48\xeb\x11\xdf\x80\xc7\x1c\xac\xb8\xe1\x5a\xf5\xdc\xe3\x2c\x15\xd1\x0e\xa2\x56\x70\x19\xeb\x2d\xf3\xf3\x65\xec\x57\xa5\x79\x12\x68\x6a\xde\xeb\x8f\xb4\x2a\xac\xed\xed\x20\x7a\xe7\xcd\x52\xeb\x19\x53\x8e\x63\x5a\x55\x58\x4e\x5b\x4c\x5b\xc8\x8c\xce\xcd\x25\x62\xbd\xb7\x75\x59\xe4\x87\xaf\x5d\x63\x8b\x27\xd2\xd4\xae\x1e\xd7\x4f\x88\xf8\x68\x55\x17\x35\x67\x9e\xa6\xa6\x86\xa8\x00\x8e\x03\x91\xd1\x41\xe0\xd1\xe3\x4d\x6a\xce\xa8\x01\x35\x37\x1b\xa7\x49\xa4\xa7\xdb\x30\x9c\x87\x31\x16\x06\x3e\x8a\x1a\x65\xb4\xdc\x9f\x63\xaa\x8c\x55\xec\x29\x2b\x2e\x8e\x51\x3e\xc4\x88\x8f\x9a\x21\xed\x7f\x86\x8f\x9a\x33\x19\x58\x76\xcc\x2c\xcb\xa6\x58\x16\x9c\xab\x98\x93\x4e\x05\xfb\x56\xb9\x9e\x0b\xcf\xc8\x92\x34\xeb\x09\xd6\x7c\x9a\x1b\xd2\x2e\xe6\x5c\x84\x01\xce\xe3\x55\xfd\x66\xd0\xe0\xb7\xd2\x3b\x2e\xa8\x92\x4e\x26\x13\x75\x1e\x0c\xa9\x20\x5b\xd6\x7d\x7d\x97\xf6\x1e\x09\x66\xf8\xc5\xc6\x9b\x7c\x7e\xee\xbb\x51\x6a\x2e\xb9\x02\x5b\x7b\xbe\x4b\xb3\xfa\xda\xdc\xd2\x8d\x83\xc8\xb4\xe3\x8a\xcf\x3f\xcf\x9d\xe1\xbf\xe6\x52\x1b\xe9\x0d\x55\xb4\x28\x15\x9b\x0e\x5f\x3d\xe8\xc1\x55\xa8\xc8\x84\xd6\x18\xf9\xa0\xeb\xed\x34\xf3\x49\x73\x45\x09\x88\x56\x66\x67\xbd\x78\xee\xa5\xec\x1c\x7c\x82\x42\x06\xed\x05\x41\x20\x89\x68\x09\xd3\x36\x0a\x1c\x9e\x10\x42\x86\x7d\xd8\x0a\x65\xbc\x5f\xe0\x03\xe5\x1b\x7b\xe7\xd4\x01\xb1\x2e\x27\xcd\xce\xfb\x02\xd5\xa9\xc8\xab\xeb\xd7\xa3\x9f\x2a\x70\x4d\x13\x5c\x84\xf7\xd6\x4f\x2e\x2d\x79\xfe\xc6\x7f\x06\xfc\x48\xa6\x30\x00\xbc\xc9\xba\xb4\x23\xa4\xa2\xde\xc9\x77\x48\x11\xcc\x3b\x8a\x99\x84\xe7\x29\xed\xbb\xda\xe6\x76\xff\xf0\xbc\xf8\x63\xb5\xdc\x07\xff\x34\xc2\xf0\x5f\xdc\x28\x62\x5c\x1d\x8f\x69\x6e\x8b\xb9\x0a\x31\x82\x88\xfc\xee\x95\xc1\x85\x97\x24\x08\xc7\xc7\x34\xf0\x4a\x8d\x78\x70\x07\x85\x4f\x7d\xdc\xe1\x3e\xa0\x4c\xf5\xc5\x76\x0f\x50\x9f\x70\xfa\xed\x76\x1f\xe3\x5e\xac\x9c\x4d\xff\xba\xd9\xa6\xda\xe2\x8c\xf0\x79\x2c\xed\x73\xfb\x9e\x8e\xf1\x78\x22\x88\xa2\x28\x6e\x2d\x46\x87\xc8\x3f\x37\x44\x46\x94\x75\x66\xb1\xe3\xa3\xca\x30\xde\x31\x68\x34\x2f\x98\xfb\xe6\xd0\x33\xa8\x8b\xcf\x32\xad\xa1\x35\xf6\x3e\xf7\xc5\x8f\xae\x20\x42\xff\xfa\x9f\x9f\xa4\x8d\x22\xf4\x25\x26\xbb\x73\x14\xcd\x1f\xf8\x60\x69\x11\x46\x1e\x82\xd1\xb6\xe9\xf1\x94\x81\x3b\x38\xf9\xd6\x89\x30\x01\xec\x0c\xed\x6d\x91\xa9\xdf\x8f\x6e\xe7\xab\x08\x99\x8f\xfe\xab\x5f\x1f\x47\x17\x1d\x79\x3e\x09\x7a\x76\x81\x7b\x7c\x5e\x69\xbb\xe8\x88\x48\x26\x88\xf6\x31\xde\xcf\xe5\x71\x96\x2b\xa4\x2f\x0d\x37\x27\x11\x81\x91\x15\x6e\xc2\xa1\x5e\x29\x72\x7a\x9b\x15\x24\xe2\x98\x0c\x34\xdb\x6c\x9a\x1f\x50\xe5\xc4\x1d\x4a\x82\x08\x83\x85\xf7\x1a\x49\xd8\x93\x11\xb1\x20\x5a\x06\x9d\x45\xfc\x12\x96\xf0\x04\xf5\x67\x51\x8e\xb0\x40\x82\x46\x14\x29\x73\x26\x24\x9c\x5b\x1b\xa9\x9f\x6e\x62\x82\x0a\x8d\xeb\xc5\x67\x33\xda\x91\xff\x46\xb7\x2d\xa1\x06\xb7\x72\x4a\x7f\xc0\xa0\xbf\x26\x58\x10\xe3\xf6\x2a\x8b\xe3\x11\x33\xad\x1e\x8f\x4b\xf0\x90\x1a\x02\x7f\x6e\x1c\x3e\x06\x6c\x17\xc1\xa5\x87\x24\x9c\x3f\x52\xf9\xbe\x28\x8e\xc7\xb4\xae\x01\x45\x25\x1f\xf9\x69\x96\xab\x59\x59\xf2\x8b\x49\x48\x87\x17\xc9\xb5\xc2\x87\x6b\x2e\xb2\x89\xec\xa6\x6c\x3d\xb4\x10\xb1\x11\x8a\x70\xf5\x9f\x26\x0e\x6b\xbf\x5c\x05\xb1\x04\xc7\x2b\x4e\x8d\xe1\x82\xba\x52\xb3\x70\xc1\xb2\x50\x91\xe7\x09\xcc\x8b\x8a\x6c\x57\xbc\xae\xf3\xfe\xf2\x28\x54\xa4\x54\x2b\xf0\x75\x2d\x0d\xe7\x46\xc5\x1a\x73\xab\xea\x94\xb9\x3e\x5d\xaf\x39\x3a\x7a\x2a\x8a\x86\xe8\xe0\xf3\xbc\x7d\xcd\xd3\xd5\xf2\x75\x50\x23\x10\x2a\x91\x98\xe7\x88\xf3\x65\xfe\xf4\x34\xbc\xad\x5a\xf9\xb8\x96\x73\x29\x5f\x2b\x28\x07\x18\x6c\xa1\x55\x88\x05\xdf\xbb\xa2\xd8\xd6\xaa\x9f\x33\x48\xcf\x8b\x91\xe9\xfc\x67\x9a\x1f\xee\x20\x3f\x2c\xb8\xf8\xb8\x92\x85\x3b\x5f\xc1\xa3\xa5\x17\x25\xa8\x38\xbb\x28\x4a\x18\x82\x6b\xa5\xa7\x3c\x44\xee\xbe\x1d\xea\x16\x98\x6e\x0f\xf9\xc2\xc3\x74\x4b\x38\x1d\xdb\x69\x3c\x8b\x0c\xfd\xc0\x27\x6d\x9f\x7e\xe8\x73\xa4\x65\xc8\x69\xcc\x7a\x65\x9d\xdb\x44\x2d\x19\x6a\x1f\x69\x07\x5f\x2f\xa7\x21\xb5\x4a\x46\x01\x43\x68\x93\x81\x77\x8d\xa2\x60\x19\x25\xd2\x10\xa7\x7a\xad\x9f\x76\x2f\x18\xed\x65\xc3\x9f\x1e\x09\x81\x25\x65\x6c\x6a\xa2\xd5\xd3\xa2\x68\xbb\x9b\x92\x04\xdc\xd7\x3d\x3d\x98\xf9\xe5\x61\x30\xf1\xae\x2e\x80\x44\xc0\xfb\xb6\x6f\x86\xc0\x35\x28\xe2\xd9\x91\xb1\xd6\xa8\xe9\x24\xb3\xa2\x82\xed\x59\xd8\xa0\xd6\x7d\x33\x65\xd4\x05\x38\x68\x66\x32\x2f\x72\x35\x68\x1d\x0f\xa7\xa2\x4c\x88\x42\xaa\xa7\x43\x7e\xd8\x5e\x7c\xfb\x28\x13\x21\x15\x75\xcd\x51\xbd\x2b\xe6\x97\xf5\x2f\x58\x7e\x32\x91\x11\x6e\x6d\x26\xb5\x2b\xf2\xea\xdc\xee\xba\x92\xf9\x24\x30\xa2\x87\xe3\xa8\xcf\x0d\x08\x42\x43\x56\x38\x8b\xd5\xb1\x09\x67\x9b\xe7\x39\xd5\x61\x9a\xfe\x6e\x96\x30\xe7\x95\xdf\xbc\x1f\xfd\x0a\xa0\x1d\xc1\x03\x86\x9c\x51\x67\xd4\x89\x1e\xc7\x6f\x3c\xb4\xb8\xb7\x5b\x62\x47\xc3\xaf\xe1\x22\x74\x2e\xf2\xd8\x83\x5d\xda\x4e\xfd\x36\x3d\xe4\xbc\x3e\x97\xd0\xde\x3f\xae\xa2\x08\x9c\x81\x74\x71\x3e\xdd\xa5\x4e\x8f\x75\x30\xd7\x85\x0f\xca\xfe\x6e\x87\xc2\x36\x90\x87\xfe\xca\x20\x45\x68\xfc\x7e\xeb\x14\x4a\x6f\x74\x5d\x42\x10\x65\xcc\xc3\xd2\xbc\x6e\xd6\xcd\xf6\x27\x48\x2a\x84\xee\xee\xc9\xac\x9e\xa8\xcc\x49\x99\x44\x49\x64\x05\x8c\xb1\x59\xb0\x7a\x59\x60\xe2\x68\xe4\xe1\xda\x73\x41\x68\x20\x4b\xc6\xbb\x72\x73\xb7\x45\x53\x93\xc1\xb5\xa8\x38\x42\x37\xb4\x3d\x02\x9e\xe6\x97\xe6\x85\x92\x6f\xf0\x4b\x6e\xef\x55\x62\x24\x95\x14\x58\x1e\x9e\xbd\x15\x45\x06\x60\x71\x10\xf0\x3b\x00\x98\xdf\xad\x6f\xda\x6f\x02\xa9\x11\x20\xb2\x79\x31\x28\xfe\xfd\x76\x37\x7b\xd9\xed\x43\x77\xdd\xda\x37\x56\x20\x59\x81\xed\x9b\xb4\x02\x23\x84\x31\xe6\xaf\x4a\x1d\xf8\x08\x67\x84\x66\x6f\x43\xf4\x8c\x93\xb7\x1e\x7e\xa3\xf2\x3d\xc0\xe4\x16\x25\x50\x36\x45\x31\xb4\x94\xc0\x75\x3e\x31\x95\x88\x59\x56\x02\x57\x97\x8d\x09\xf4\xc6\xdf\xa8\x22\x4f\xa0\xf7\x84\xd5\x55\x28\xca\x11\xda\xc9\x0d\xf3\x13\x2c\x28\xfd\x79\xe6\x79\x7d\x3e\xfe\xd5\x0a\x92\x69\x15\x11\x8d\xae\xeb\x43\x44\xdd\x40\x35\x78\xf4\xe3\x23\xca\x84\x70\x52\x3a\x15\xf4\x89\xe9\x5d\x6e\xe9\xc6\x26\x82\x1a\xab\x85\xcb\x4d\x55\xb2\xd1\xd9\x13\x1d\x79\xae\x8f\x9e\xc1\x81\xab\x62\x09\x46\x4a\xaf\x2e\xbe\x61\x0c\x3e\x8c\xd8\x54\x04\x1e\x04\x3d\xe0\xf5\x5a\x16\x83\x7d\x53\x45\x40\x31\x48\xfb\xba\xfb\xaf\xfe\xf6\xa0\x22\x1d\x21\x3a\x73\xd8\x46\x42\xe8\xe2\x08\xbe\x6b\x3f\x40\xa8\x8f\xb9\x3a\x5a\x07\x56\x2d\x87\xbd\x8d\x31\x55\x9c\x44\x18\x0c\x37\xcf\x0c\x83\xcb\xa9\x82\xec\xe8\x82\x63\xee\x61\xe0\xba\xb0\x96\xbb\xc7\x34\x37\x8c\xcf\x9f\x8a\x51\x28\xea\x1b\x37\xb1\xac\xe0\xaa\xbf\x41\x8f\x46\x45\x9e\xd2\xad\x71\xd7\x53\x31\xc6\xb2\x2a\x2a\x08\x82\x46\x52\xdc\xa4\xbf\xa7\xf5\xdb\xe2\x5c\xd5\xc5\x11\xca\xde\x52\xdf\x7f\xc3\x55\x42\x44\x9c\x38\x0d\xa4\xbc\x2e\x8b\x2c\x83\xd2\x51\x03\x47\x5f\x9f\xc4\x11\x56\x81\xe4\x5b\x0a\xda\xdd\x24\x26\x39\x3e\x61\xb7\x3f\x9a\xc7\x19\x78\xff\x38\x8f\x35\xa8\xb4\xe2\xdc\x47\xac\x01\x3e\x9a\xef\xe3\xbe\xf8\xf8\xf5\x1f\x5e\x1a\x17\x46\x51\xdb\x5c\xfb\x2a\xaf\x47\xce\x91\x5a\x09\x0f\x84\x15\x1c\xfb\x0b\xc5\x99\x6c\xdf\x67\xc0\x97\x55\xcd\xea\x40\x7a\xa1\x48\xf3\x33\x9e\x78\xd9\x2c\xfa\x1f\xd7\x6c\xb1\xc1\xbd\x52\xbe\x97\x58\xf5\xb0\x61\x03\x66\x38\x8a\x48\xed\xbb\x12\x90\x2e\x46\xf7\x10\x3c\xe9\x7a\xc8\xf7\xfc\x38\x8c\x8a\xdd\x90\x04\x90\xf7\xab\xd2\xaa\x89\x08\xe6\xe7\x3c\x1f\x83\x4f\xc0\xe3\xc6\x37\xd6\xe5\x47\xdb\xcb\x51\x14\x99\xe1\x5a\x7c\xe9\xb5\x08\xdd\x70\xcd\x51\x4f\x60\xc1\xcb\x11\x5d\x0a\xfc\x84\x81\x75\xaa\xfc\x30\x1b\xa7\x67\x8f\x04\x89\xe7\x90\xc2\xd3\x76\xf4\xfd\x67\x0b\x81\xa2\xd4\xfc\xea\x12\x64\x5d\x94\x0f\x1d\x9b\x0f\x42\x2f\x50\xbe\xab\xfb\xfc\x3d\xd8\x62\x20\x8c\x4c\x63\xcb\x50\xa6\xac\x60\xe1\x68\xe2\x43\xc8\xa5\xa4\xed\x5e\x65\xab\x46\xb8\xdd\xd7\xbc\xbc\xb6\xad\xd2\x10\xca\x18\xf5\x77\xfe\xfe\x23\x6d\xe1\x9a\x10\x11\xe1\xdb\x7b\xff\x75\xf7\xb0\x58\x3b\xbd\xcd\xb4\xc8\x77\xe9\x11\x8a\x73\xdd\xd1\xf7\x86\x95\x9f\x49\xd7\x10\x0d\x51\x22\xa9\x53\xf5\x5f\x2c\x77\xcd\xa4\xbb\x2b\x26\x44\xb0\x34\x44\xcc\xc7\x3a\xe3\x9b\x81\x52\x4c\xaf\xc5\x10\xb1\x58\x07\x2d\x87\xe1\x90\xe6\xdb\x13\xe4\xa3\x4d\x02\x22\x0d\x58\x6f\xc6\xad\xfd\x6e\x0c\x81\x03\x42\x8c\x1d\x8e\xcb\xe5\x16\x25\xa8\xd4\xb8\x8f\x4f\xce\x57\x20\xd4\x28\x9b\x2c\xf9\x8f\x9e\x6a\x04\x10\x2a\x71\x27\x11\x97\x73\x71\xae\x67\xfd\xd0\x01\x62\xdf\x60\x0e\xc4\xf9\xb2\x69\x32\xcd\x5e\x5f\x3b\x1a\xae\x8b\x91\xfb\x44\x64\x64\xc4\x6d\xc3\x67\x96\x65\xcf\xb9\x84\x7e\xf1\xcc\x0d\x14\x02\x2b\xdd\xc7\x8b\x65\x97\xba\x75\x1f\x12\x00\x4c\x52\xb6\x18\x57\x5d\x23\xf5\x80\x79\x02\xe5\x07\x0a\xad\x2b\xa8\xfb\x54\x7a\x60\x11\xc7\x7c\x5b\x9c\xcb\x7c\xc3\xab\x6a\x52\x2f\x55\x03\x63\xd2\x41\x9e\x8d\xff\xdd\x16\x6f\x54\x35\xee\xc9\x00\x8f\x43\x74\x04\xef\xc0\xbc\x93\xc1\x6c\x32\x3a\xbf\xa0\x8a\x5a\xb0\xe3\xeb\xe9\xd0\x84\x64\x8f\xbc\xaa\xaf\x5e\x6e\x19\x46\x68\x81\x8b\xb7\xf5\x31\xcd\xeb\x4d\xb1\x1c\x70\xd3\x41\x6a\xe2\x5b\x49\xa5\x79\x31\xca\xbb\x41\xc5\xa0\x6c\xd2\x39\x53\x5f\x7a\x8d\x2e\x77\x5c\xa9\xc8\x3a\x60\x6c\x8a\x2c\xed\xa9\xc7\x0e\x3a\x60\x93\x6b\x20\x00\x6d\x55\xe7\xe6\x45\xf1\x3e\x58\x5b\x01\x78\x40\xfb\x99\xbc\xd9\xf9\x82\xee\xb0\x4c\x0c\xed\x58\x17\x7b\x94\x6f\x71\x07\xa4\xe6\xdc\xa0\xad\xfc\x71\xbd\x7c\xcc\xb5\x19\xd7\xc0\x3b\x5b\x47\x0d\x3a\x10\x58\xd1\xdd\x5a\x71\x06\xa8\x51\x14\x00\x27\xbf\x13\xf7\x73\x43\x13\x9d\xb4\x7a\x33\xa3\x89\xa4\x99\x40\x5d\xe9\xbd\x11\x02\xe7\x3f\x0c\xd7\x7e\xa2\x84\xae\xbd\xc8\x68\xd5\x5b\x75\x02\x5c\x50\x6c\xd0\xf6\x54\xd4\xff\x0d\xa5\xe3\xc0\x68\x8f\x06\x48\x28\x3b\x61\xe1\x7b\xf5\xe3\x0a\xcd\xa6\x7d\x8f\x3b\x65\x5b\xdc\x5e\xaa\x81\xdd\xbe\xd6\x41\xe2\xdb\xa6\x29\x32\x91\xfb\xc1\x8f\x0e\x7d\x1f\x5f\x62\x14\xa5\xde\x42\xfd\x6f\x2e\xdf\x4f\x45\x3d\xad\xf7\xa0\x43\x12\x23\x25\x29\x95\xc5\x03\x3f\xe7\xf2\x6d\x2c\x21\xa0\x43\xee\xa1\x64\xd2\x38\x61\x9f\x12\xef\x45\xda\x67\xe8\xa4\x3e\x2d\xf6\xbf\x49\xd7\x76\x25\x97\xef\x1d\xcb\x4d\x87\x32\x22\xd4\xc6\x53\xd6\x4b\x70\x54\xec\xd4\x51\x28\x30\xc7\xda\x37\xe1\x68\xf3\xb2\x36\xd1\xf4\x70\x08\xa1\x62\x50\x2e\x32\x02\xcb\xb7\x48\xe8\xed\x87\x4c\x7f\x16\xef\x1c\x17\x19\x3c\x2f\x5c\x72\x36\x5d\x0b\xd4\x31\x27\x18\xd7\x3c\x14\xf9\x61\xbe\x28\xae\x25\x30\xaf\x4b\x2c\x3a\xd6\x46\xc7\x7a\xb7\x7b\xfe\xea\x2e\x9a\x26\x1a\x71\xad\xaa\x40\x1b\xb1\xf6\xcf\x9c\x51\x5b\xd7\x1a\xd9\xef\x0e\x7f\x46\x12\x02\x2e\xb5\x16\x70\xeb\x08\x88\xc3\x5b\x92\x90\xf6\x8d\x5e\xbc\x9d\xf3\x77\xbf\xef\x2a\xe0\xc6\xa8\x08\x97\x2c\xec\x64\x1b\xb9\xc3\x34\x3f\xcc\xda\xe3\x2c\x04\x19\x3a\xb3\x4d\x6c\x0f\x6f\xf8\x61\x58\xc6\xd1\x8c\x48\x08\x1d\x00\x75\x53\x14\xed\x74\x61\x71\x60\x48\xd5\x2f\x2b\x4c\xb9\xbe\xcd\x5e\x1f\x76\x26\xf1\x6a\x87\x28\x22\x2c\x7d\x5a\xa7\xe5\x11\x4b\xee\xcf\xfa\x7b\x51\x8e\x38\x36\x9a\x33\xb3\xb6\x9a\xe7\x5b\x7c\xee\x46\x21\x94\xe6\x4c\x39\xf7\xd3\xfb\xa2\x50\x63\x0a\xdf\x68\x6e\x0a\xe2\x23\x23\xb9\xb7\x54\xff\x34\xd0\xd4\x52\x01\xf6\x8d\x57\xcf\xdb\xf5\x53\xfb\xf3\x25\x24\x28\xa5\x2d\x10\xa4\x3e\x14\xdc\xe9\x45\x5a\x5a\x91\x40\xc6\x76\x8e\xf7\xa6\xbe\xe2\x09\xbe\x71\x19\xaf\xea\xaf\x45\x59\xc1\xb6\xdd\x9c\xb4\x12\x60\xdc\x30\x91\xf8\x69\xd2\x96\x41\xb1\x40\x83\x97\x24\x06\x63\x92\x8d\x4a\x77\x1a\x84\x4d\x62\x6c\x0d\x04\xf3\x94\x6d\x7a\xc8\xe7\xcd\x9b\x33\x78\x19\x46\x33\x4b\xc7\x02\xcb\x69\x16\x9c\x39\x2d\x68\xd6\x5c\x38\xd6\xbd\xa1\xa7\x7a\x6a\x72\xe1\x2f\xff\xef\xff\xf3\xff\xfd\xff\x01\x00\x00\xff\xff\x41\xc7\x6f\x7d\x39\x03\x54\x00") + +func _4byteJsonBytes() ([]byte, error) { + return bindataRead( + __4byteJson, + "4byte.json", + ) +} + +func _4byteJson() (*asset, error) { + bytes, err := _4byteJsonBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "4byte.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x56, 0x18, 0x15, 0x8, 0x49, 0xac, 0xa1, 0xbf, 0xc2, 0xcb, 0x21, 0x40, 0xee, 0xff, 0xc2, 0xba, 0x46, 0xc0, 0xe1, 0x85, 0xa1, 0x44, 0xe7, 0xca, 0xd6, 0xfd, 0x44, 0xf9, 0x4d, 0xf, 0x34, 0x4d}} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// AssetString returns the asset contents as a string (instead of a []byte). +func AssetString(name string) (string, error) { + data, err := Asset(name) + return string(data), err +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// MustAssetString is like AssetString but panics when Asset would return an +// error. It simplifies safe initialization of global variables. +func MustAssetString(name string) string { + return string(MustAsset(name)) +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetDigest returns the digest of the file with the given name. It returns an +// error if the asset could not be found or the digest could not be loaded. +func AssetDigest(name string) ([sha256.Size]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) + } + return a.digest, nil + } + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) +} + +// Digests returns a map of all known files and their checksums. +func Digests() (map[string][sha256.Size]byte, error) { + mp := make(map[string][sha256.Size]byte, len(_bindata)) + for name := range _bindata { + a, err := _bindata[name]() + if err != nil { + return nil, err + } + mp[name] = a.digest + } + return mp, nil +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "4byte.json": _4byteJson, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"}, +// AssetDir("data/img") would return []string{"a.png", "b.png"}, +// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + canonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(canonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + "4byte.json": {_4byteJson, map[string]*bintree{}}, +}} + +// RestoreAsset restores an asset under the given directory. +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) +} + +// RestoreAssets restores an asset under the given directory recursively. +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + canonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) +} diff --git a/signer/fourbyte/4byte.json b/signer/fourbyte/4byte.json new file mode 100644 index 000000000000..d23b441b3814 --- /dev/null +++ b/signer/fourbyte/4byte.json @@ -0,0 +1 @@ +{"00000001":"account_info_rotate_tine(uint256)","00000002":"razor_balance(bool)","0000000c":"gumXZCZ()","00000033":"matchTokenOrderByAdmin_k44j(uint256[])","00000039":"XXX_unrecognized_adapter(string)","0000003a":"good_mirror(uint256,uint32)","00000063":"math_rotate(uint256,uint256,uint64,uint64)","0000006e":"display_allow(uint256,uint256,uint256,uint32)","00000080":"conduct_auto(uint256,uint256,uint256)","00000082":"artefact_keep(bytes1)","000000a0":"tree_stream(bytes,bytes)","000000a1":"pistol_valve(uint256,uint32)","000000b6":"matchByAdmin_TwH36(uint256[])","000000c4":"festival_happy(uint256,uint256)","000000c7":"lend_during(uint256,uint256,uint64,uint32)","000000da":"muscle_teach(uint256,uint64,uint8)","000000db":"viable_print(uint256,uint256,uint64)","000000de":"pledge_future(uint256,uint32,uint8)","000000ed":"access_coconut_alarm(uint256)","000000f5":"cherry_tomorrow(uint256,uint64,bool)","000000f8":"required_strconv(string,string)","00008962":"token(string,uint8,string)","0000aeb3":"migrateByAdmin_DQV(uint256[])","00012f8b":"LatiumX()","00014502":"totalInfected()","000150a0":"DEV_TEAM_STAKE()","00020a28":"HaltTokenAllOperation()","000267a4":"getUint()","00026e13":"checkAtkBossQuest(address)","00027737":"aicontract()","0002aa37":"richtestkk(uint256,string,uint8,string)","0002c1dc":"Johnsonville()","00046c1f":"totalDragons()","000525fd":"robCoin()","0005a533":"CoalichainToken()","0005bfb7":"gemmyMusicLockTime()","000713fe":"Initiate(address,uint256,uint256,uint256,bool)","000751b8":"LogExtendSale(uint256)","00076943":"unlocker()","00076de7":"disableSellerCancel(uint16,address,address)","00085d25":"round3()","0008f8df":"changeIcoFinish(uint256)","00094161":"TERMS_AND_CONDITIONS()","00096469":"AuctionCreated(uint256,address,uint256,uint256,uint256,uint256)","0009803b":"makeProject(address,string,uint256,uint256)","00099cdf":"withdrawTokens3(uint256)","000a4a7a":"backAtIndex(uint256,uint256,uint256)","000ac1ff":"addparts(bytes32,uint256,uint256,uint256)","000adc67":"buy_the_tokens(string)","000b66d3":"setIcoStartTime(uint256)","000b9726":"MintingContract()","000be356":"expiredBlock()","000c12af":"TOTAL_TOKENs_SUPPLY()","000c65c3":"withdrawVNET(address,uint256)","000ca58e":"refundRequestTimelock()","000dae5c":"claimantConvicted(uint256)","000e02d0":"fiveHundredThousand()","000e28d3":"setLandsLimitPerBid(uint256)","000e2f3a":"totalLBSold_GENERAL_1()","000e60f8":"pendingBetsBalance()","000e7fa8":"presalePrice()","000f0ded":"doAirdrop(address,uint256)","000f71f8":"recieveNegReq(uint256,uint256,uint256,uint256,string)","00100a18":"NewPoll(string,string,uint256,uint256)","0010ed99":"getBraggerAtIndex(uint256)","00113e08":"getBalances()","00115cba":"UpdateSellAgentBounty(address)","001246eb":"availableFlg()","0012d90a":"BNB_HARD_CAP()","001339b0":"prizePoolTotal(bytes4)","00137d6e":"peculAdress()","0013da50":"delList(string,uint256,uint256)","0013eb4b":"isExist(address)","0014f956":"getResourcesInfo(address)","00152924":"setSelfContractAddress(address)","0015be71":"executiveOfficerAddress()","001667bb":"getPI_edit_34()","00173d65":"getShouldGenerateDna()","001773e6":"convertMetToEth(uint256,uint256)","0017cd8b":"PRIME()","0017e1cf":"getTeamNameForAddress(address)","0018b1d3":"pps()","0018b665":"killTokenContract()","00190f64":"getStatusLogs()","00199b79":"_updateList(address[],address,address[])","0019a46b":"gen0CutieCreatedCount()","0019c97d":"redeemPop(uint256)","001a4f5e":"createNewRevision(bytes32,bytes32)","001aa026":"withdrawMarginPreSigned(bytes,address,uint256,uint256,uint256,uint256)","001ab1cd":"setAsBurner(address,bool)","001ab993":"VTestDistribution(address,uint256,uint256)","001b1441":"Ethernext()","001b1cf0":"DualMintableToken(address,address)","001b3fe6":"card_blue_first()","001ba7ea":"signWitness()","001baa89":"createdBy(uint256)","001bc69a":"getGratitudesOf(address)","001cf577":"wcOnCrowdsaleFailure()","001d7bf6":"getInvestmentArray()","001db74d":"FreeLove()","001dbe8a":"getSoftwareExecRecordLength()","001ed012":"previousBurners()","001ee6b2":"participateGame(uint32,uint32,uint32,uint32)","001f0479":"getResultMask(uint256,uint256)","001f4701":"Examples()","001f8d11":"removePackage(bytes32,string)","001f91ce":"curatorAddress()","001f9bc0":"set_arbits_presale_open(address,bool)","00201e33":"BONUS_6_DAYS()","00203116":"endGame(address,uint8)","00203385":"getTotalBorrowingItem()","00212667":"m_Creator()","0021d364":"getNOVotesByEntity(uint256)","00226eb5":"getDepositNum()","0022771f":"numAdviserDeposits()","002338ef":"TLSC()","0023de29":"tokensReceived(address,address,address,uint256,bytes,bytes)","00245220":"HAJDToken(string,uint8,string)","0024eb4b":"getCompanyAllocation(uint256)","00277883":"TeamTokensHolder(address,address,address)","0028b91f":"Distributor(address,address)","0029514f":"PROCESSBY()","00297671":"cancelOneSell()","002a2133":"createCitizen(uint16,uint16,uint8,bytes32,bytes32,bytes32)","002a228c":"initSeed(uint256)","002a4b14":"Nine()","002a5cc9":"getTicketHolders(uint256)","002beece":"unfroze(uint256,address)","002c1a9e":"percent(uint256,uint256,uint256)","002c8456":"toOpenVote()","002ce636":"settrusteeVaultAddr(address)","002d7c9d":"concludeFirstAuction()","002dc7f1":"ChangePeriod()","002e0ae7":"transferTokenOut(address,uint256)","002e1316":"maxInvestment()","002e1d7e":"LCOpenTimeout(bytes32)","002f15ca":"isExistInvestor(address)","002f9569":"allocatedTokens()","002fd07c":"_approve(address,uint256,uint256)","003074ff":"getFrontend()","003078b0":"unlockTo(address,string)","00310e16":"sellWolk(uint256)","00319aad":"_transferadvanced(address,address,uint256)","0031a48e":"myICO()","00322bb6":"sendPlatformMaintenance()","003259ea":"voteResult()","003271d5":"checkStateProof(bytes32,bytes,uint256[],bytes,bytes)","00333375":"minimumMainSaleRaise()","003338a0":"DrawOp()","0034451c":"_buildInternalSalt(uint128,address,address,uint256,uint64)","00346b57":"setHodlerStake(address,uint256)","003495a4":"getHighestBidder()","0034b5fd":"withrawFundTeacher(uint256)","0034f529":"_requestExists(address,uint32)","003538c5":"TestRegistrar(address,bytes32)","00354975":"VRYCoin()","00359e08":"presaleFinishedAt()","0035a45c":"isAllowedToPurchase()","0035ceb1":"BrinkzToken()","0036059c":"TESTER(uint256,string,string)","00360b66":"MyMonsterIds(address,uint256)","0036242d":"Power2X()","00362509":"LogWin(address,uint256,uint256,uint256)","00362a95":"donate(address)","00364ceb":"bountyManagementWalletAddress()","0036624a":"AmountReceived(address,uint256)","003705bc":"getTotalUSDInTokens()","0037dd47":"addUniqueSaleTokens(address,uint256)","00383d0a":"maxSignup()","00387733":"setGameResult(uint256,uint8)","0039522c":"emergencyWithdrawal(uint256)","003958e2":"LogOperatorAdd(address)","00397647":"addToFreelancerTotalEarned(address,address,uint256)","0039ad6d":"ROUNDS_KEPT()","003a3d80":"GetSale()","003a5b06":"getRoundEndBlock(uint32)","003a661d":"renounceOwnedOwnership(address)","003ab1ff":"timereum()","003b0a3f":"getFreeDino()","003b9d88":"setLowerFeePercentage(uint8)","003ba1ed":"setRoot(address)","003bcb34":"Received(address,bytes,uint256)","003cdf26":"Lima()","003cee5a":"HLCToken(address,string,string,uint256,uint8)","003db783":"Purchase(uint256,uint256,uint256,uint256)","003de230":"participantClawbackEther(uint256)","003e9d5b":"FillOrder(uint256,uint256)","003ead5f":"setPVEBattleFee(uint256)","003f07fa":"isValidAddress(address)","003fd35a":"CONTINUE_MINTING()","00404930":"CryptoRiyal()","00405351":"getWarriorChestAvailable()","004056c7":"validateNameInternalET(string)","004079b6":"CheckExec(string)","0040ff6c":"changeFee()","0041edee":"preSaleTokensLimit()","004240e3":"startTransaction(address,address,uint256)","004264c3":"overflow()","0042a3be":"isPublish(bytes32)","00432cf3":"getCurrentMarginAmount(address,address,address,uint256,uint256,uint256)","0043cce7":"technologyShare()","00442a07":"getLoanConfig(uint256)","00452636":"GxManagedWallet(address)","0045626f":"returnETHByOwner()","0045a4d4":"isPointerExpired(uint8)","0047850a":"getOfferCountByToken(address)","00478f87":"TIC()","0048236b":"setOrganName(string)","0048d680":"testTransferVotes()","00498257":"maxWeiTier2()","0049f068":"onContribute(uint256,address,uint256)","004b1e75":"actionAuthorisedBy()","004bd9a5":"setRate5(uint256)","004c942e":"Request_Dividends()","004d39b1":"HavvenGold()","004d4ed9":"setRegion(uint256,uint256)","004db370":"DawnCoin()","004dcd1c":"changeBrick(uint256,string,string,string,bytes32[],uint256)","004ebaa8":"silo_timer()","004ef6c6":"book(uint256,uint256)","004f3e86":"forceCancel()","004f4042":"takeAllPossible(address[3][],uint256[3][],uint256[],uint8[],bytes32[],bytes32[],bytes4)","004f4803":"raise(uint256)","004fba00":"addAdminAddress(address)","00501553":"subHours(uint256,uint256)","005016a3":"checkReturnValue(bool)","0050945d":"referrerLevel2Ether()","0050a315":"getCreationTs(uint256)","0050b3df":"newAlex(address)","0052992e":"buyForInvestor(address,uint256,string)","00530933":"BuyAsset(uint256)","00541756":"jackPotB()","0054438d":"validateResale(address,uint256,uint256)","0055bc9c":"withdrawAtOnce(uint256)","0056c4c2":"getTokensForWei(uint256,uint256,uint256,uint32)","0056ce89":"getCryptoPicture(uint256)","005733e6":"EMISSION_FOR_SALESTAGELAST()","00573858":"setrateIco(uint256)","0057e18f":"setPlatformMaintenance(address)","0057e8d4":"restoreToColdWallet(uint256)","00599e65":"getTokenOrder(address,address)","005a7d9a":"forFund()","005ab803":"LogRegister(address,address)","005b42cb":"MainSalePrice()","005b4487":"totalPayments()","005b7ce8":"SIGMA_EXTRACTION_BASE()","005b9b48":"sellAnimal(uint32)","005bb714":"BlocksToken()","005c0541":"_totalActiveBets()","005c33e1":"receiveFunds()","005d204d":"dataIdentifiers()","005e885e":"getSigners(uint256,uint16)","005ef4ec":"setReservedTokensList(address,uint256,uint256,uint256)","005f41cc":"create(address,uint256,uint256,uint256,bool)","00601801":"setCCH_edit_4(string)","00601d6c":"board(uint256,uint8,uint8)","00603126":"computeNodeId(bytes32,bytes32)","00604854":"FreePPCoin()","0060c778":"removeCompany(bytes32)","00613e27":"register(address,uint8,uint16,address)","0061c78e":"PayoutIncreased(uint256,uint256)","0061ebed":"TransactionFeeChanged(uint256)","0062c8cb":"canCallWithNoOne()","00634064":"Lescoin(address,address)","00639319":"Milestone_BankLicenseSuccessful(string)","006409c4":"Signed(address,uint256,uint8,bytes16,bytes)","0064575f":"shiva()","0064b1f8":"gameNum()","0064d618":"add_referral(address,string,uint256)","0065318b":"dividendsOf(address)","0065d700":"getTileFromBattleboard(uint16,uint8)","0066753e":"removeCertifier(address)","0067a9fb":"BrokerImp(address,address,uint256,address,uint256)","0067ba69":"FT_TOKEN_SALE_CAP()","00686741":"registerProxyFor(address)","00691967":"SUPER_HERO_MULTIPLIER()","006932bb":"whitelistAllAddresses()","0069a132":"AshenVoid()","006a003e":"planetCordinates(uint256)","006a6ef6":"create(address,address,address,address,address,address,address,uint256)","006ac4bf":"findNextMonth(uint256,bytes2)","006ae9d5":"HopeToken()","006b1fd1":"purchasedCount()","006bcb71":"witness(bytes32,address)","006c10e8":"trackPurchase(uint256,uint256)","006c2abc":"privateSaleEndDate()","006c81d3":"isAllocated()","006cfea8":"_delegateAssetOwnerAdded(bytes32,address)","006d96e0":"hasVaultAccess(address,address)","006ddae3":"changevotePrice(uint256)","006e3a1d":"exitOverPlayer()","006f91d2":"RiskPrice(uint128,uint128,uint128,uint128)","006fbd88":"changeSellGenesPrice(uint256,uint256)","00703d48":"crearCelda(uint256,uint256,uint256,uint256,uint256,uint8)","0070c3b3":"Proxy(address)","0070c537":"increaseBid(uint256)","007188d3":"FAOC()","0072615c":"claimedBoards(uint256)","00728f76":"vestingAmount()","0072d7b5":"addressAdded(address)","00732113":"setHolderInformation(address)","00739f2a":"changeStartDate(uint256)","0073c769":"disableTime()","0074477d":"listMultipleItems(uint256[],uint256,address,bytes32)","0075a317":"mintTo(address,string)","00761731":"createContract(bytes32,uint256,uint256,uint256)","00774360":"deploy(bytes)","00797f77":"has_donated(address)","0079efb0":"withdraw1()","007aa091":"san_whitelist(address)","007aaac9":"sisterCheckPrice(uint256)","007b2a03":"GoldTokenERC20()","007bd509":"generalTerms()","007c197d":"ISE()","007cb3fb":"updateOraclizeGasPrice(uint256)","007cc224":"RESERVED_TOKENS_FOR_PLATFORM_OPERATIONS()","007d8051":"issueAndFreeze(address,uint256,uint256)","007e5d08":"updateAvailable()","007e9355":"GetAllChallengesByAUser(address)","008000d6":"configSale(uint256,uint256,uint256,uint256)","008066b6":"doftManaged()","0081d6e5":"updateGravatarImage(string)","008201e7":"TokenSold(uint256,uint256,uint256,address,address,string)","00821b81":"bonusCalculation(uint256)","00821de3":"parentAddress()","00822599":"deleteMasternode(uint256)","008250e5":"fortune_new()","00837b15":"balanceEth(address)","00849f88":"changeFundCollection(address)","0084dbf5":"ProofOfEtherDelta()","0084fe51":"Exercise(uint256,uint256)","00851303":"tokensForSiteReg()","008557d2":"Buy(uint32,bool,bool,address)","0085c647":"setPreICOEndDate(uint256)","00862c3c":"areTokensUnlocked()","00865f92":"parseJsonArrayAndGetFirstElementAsNumber(string)","0086969f":"dissalowFreezing(address)","0086bb3e":"teamUnlockedAfterCliff()","0086ce4d":"LogUpdatedLimitPerDay(uint8,uint256)","00873367":"comparisonchr(string)","00873c97":"CLPContractToken()","00882097":"EtherDeltaDeposit(uint256)","00886980":"LogClaimReward(address,uint256)","0088fca8":"start_go_quiz(string,string)","0088fed7":"addIndex(address,address)","008a3ca1":"reverseSplit(uint8,bytes6,uint8,uint32)","008a5c23":"getCurEarlyIncomeByAddressRound(address,uint256)","008a706b":"Primal()","008a745d":"claimDividendShare(uint256)","008ad306":"changeLockCostPerHour(uint256)","008bdd13":"isWithinSaleTimeLimit()","008bed3e":"getAgreementCount()","008c1b28":"POSTSALE_START()","008c3215":"addReplies(address,address[],string,string)","008c8920":"currentType()","008ca816":"isSalePaused()","008cbc8c":"oraclize_query(uint256,string,bytes[4])","008df454":"ratio(uint256)","008e0f1b":"getTeam(uint256)","008e6865":"buyTicket(uint256,uint256,address)","008e8135":"setProviderRateHistory(uint256,uint256,uint8,bool)","008f7cc2":"requestLoan(bytes8,uint128,address,address,address,uint256,uint64,bytes)","008f8b35":"currentRoundInfo()","008fcc94":"stageEndDate(uint8)","00903c69":"Kether()","0090e9c2":"transferBonuses(address)","00918c7b":"icoPeriodTime()","0091d862":"Minaxis()","00922db6":"secondWeekBonusInWeek()","00923f9e":"tokenExists(uint256)","0093703c":"bankConfirm(address,uint256)","0094151b":"setPurchasable(uint256)","0095716b":"crownBalanceOf(address)","00961320":"stringToUint()","0097130e":"_realBalanceOnEther()","00971a30":"court()","00975ba6":"_sendP3D(address,uint256)","0097b607":"validRareId(uint256)","00983401":"setAuthor(string,string,address,uint256)","00987265":"migrateThroughAllForks()","0098728f":"buyXaddrForContract(address,uint256)","009888ce":"calcNextPrize()","00988a16":"EthMinContributionUpdated(uint256,uint256)","0098fe2b":"refundWhite(uint256,uint256,uint256,uint256)","00991d8e":"setMakeFee(uint256)","0099d386":"enableTrade()","009a1faf":"getSumOfGamblingPartiesBonusPool(uint256)","009af857":"setnextRoundId(uint256)","009b38fa":"canBeFinalizedNow(uint256)","009b9369":"getVoteNumber(uint256)","009ca5e8":"maxTokenWinValue()","009e2297":"SetFreeDCT(uint256)","009f9262":"setEthPrice(uint256)","00a0190e":"BIDDING_DURATION()","00a051ca":"FiCoinFundDeposit()","00a09a7a":"devTokensToken()","00a0d28f":"batchExecute(uint256[])","00a13901":"burnRemains()","00a16cab":"checkCutoffsBatch(address[],bytes20[],uint256[])","00a18b30":"setTeamAddress(address,address,address,address,address)","00a219f4":"payForDemocracy(bytes32)","00a22ee4":"EXOToken(address,address,address,address,address)","00a3216c":"getNextDepositBlockIndex()","00a32af6":"AIRDROP_WALLET()","00a35aa2":"deleteBoolValue(bytes32)","00a470d0":"doInvite(uint256,uint256,uint256)","00a4b146":"SDCToken()","00a53598":"emergencyToggle()","00a58a2a":"Coffee()","00a5e715":"TripCoinTeamSupply()","00a626f6":"getACLRole7123909213907581092()","00a676f9":"getExists(bytes32)","00a6dec6":"setPayerPercent(uint256,uint256)","00a70e03":"priceOfTicket()","00a7d6b3":"checkTransferFromToICAP(address,bytes32,uint256)","00a7fdfc":"bids_count()","00a81ef6":"emitRoleRemoved(address,uint8)","00a8efc7":"subBalance(uint256)","00a8f276":"last_transfer_state()","00a94b6e":"oraclize_query(uint256,string,string[5],uint256)","00aa21e6":"transferFromVault(bytes32,address,address,uint256)","00aa25b2":"_isValidAddress(address)","00aac98b":"Griefing(uint256)","00ac4663":"getWarrantyQuote(string,address,uint256,uint256,uint256)","00ac77a0":"ownerSetCanBurn(bool)","00ad3a23":"RELEASE_PERIODS()","00ad800c":"name(uint256)","00ad8035":"SwingerTokenSPICO()","00ad861f":"README()","00ad8b69":"releaseVestingAllocation()","00adc382":"addressHash(address)","00aea59b":"reviewAudit(uint256)","00aec05d":"BEECASHBACKHOME()","00aeef8a":"deposit(uint256,uint256,uint256)","00af4274":"getTokensForEther(uint256,uint8)","00af9811":"checkRedemptionFulfilled(bytes32)","00afd295":"getAllCellInfoFrom_To(uint256,uint256)","00afdcef":"ELink()","00b08526":"GXCH()","00b172d7":"buyTokensForProposal(uint256,address)","00b23740":"VersusArenaToken()","00b2516d":"vetoMotion(uint256)","00b34747":"contractInitialized()","00b37044":"totalDonated()","00b3c619":"VoteSvp001(address,uint256,uint256)","00b44750":"acceptMembership(address,uint8,uint256,address,uint256)","00b5152b":"VibeXChainToken()","00b526e4":"_sendTokensManually(address,uint256,uint256)","00b5277a":"checkSell(uint256)","00b55554":"emergencyDropEth()","00b56aa7":"emitSynthRemoved(bytes4,address)","00b5988e":"lockTournament(uint256,bool)","00b5b223":"computeResponse(uint256,uint16)","00b6849f":"airDrop(address[])","00b6b707":"accept(uint256,address,uint256)","00b76307":"ChangePrivilege(address,bool,bool)","00b767fa":"EventAddAdmin(address,address)","00b79dd9":"taxlvlEconomy(string,string,string,string,string)","00b7f20a":"isDebtor()","00b8a73c":"IntegrativeWalletToken()","00b9189d":"setPreIcoContract(address)","00b9840a":"DBDHToken()","00b99f8c":"view28()","00b9eb8b":"Coinchangex(address,address,uint256)","00ba092c":"is_current()","00ba3e50":"setProductAttributes(string,uint256,uint256,string)","00badc85":"getcvotesid(string)","00baea15":"pastOneDay()","00bbec1c":"payServiceProvider()","00bc83a9":"xToken(address,string,string,uint8,uint256)","00bca785":"state_of(address)","00bcb883":"ProposalAdded(uint256,address,string,uint256)","00bd35b8":"EventAddToBattle(address,uint64)","00bd6f4c":"transferToAddress(address,uint256,bytes,bool)","00bde030":"getDurationS()","00bdfbcd":"installed()","00c023da":"revokeAttribute(address,bytes32,bytes)","00c17ee4":"setConfig(uint256,uint256,string,string,uint256,uint256)","00c1e956":"addressFundBounty()","00c2943c":"declareWinner(uint256)","00c2b78e":"voteFor(uint256,uint256)","00c33731":"prepair(address)","00c42173":"winnerDeterminedDate()","00c43503":"totalReturns()","00c4cefa":"toKeyValue(int256,string)","00c56675":"setNegativeGrowth(int256)","00c5f509":"preICOSupply()","00c721ab":"setHand(uint256)","00c822fb":"oraclize_query(string,bytes[2],uint256)","00c8bb45":"addMeleeParts(uint8[])","00c90ac8":"AutoCoinICO(uint256,uint256,uint256,address)","00c988e8":"crowdsaleConcluded()","00c99206":"setIdentifier(bytes32)","00c9c8e7":"_emitFeeSet(uint256,address)","00cab8b1":"lockAddressValue(address,uint256)","00cae5df":"solve(uint256,bytes32)","00cb1ae4":"methodThatThrows(bool)","00cb41e3":"getWithdrawableDates()","00cb527f":"miningFive()","00cc15b0":"lengthEncode(uint256)","00cc48a6":"updateNameIP(string,string)","00ccbc68":"firstRedemptionRequest()","00ccfdab":"removeForgivedChar(uint256,string)","00cdbc1f":"changeHash(bytes32)","00cde2bb":"releaseAccount(address,address)","00ce2057":"triggerPayment()","00ce4462":"register_with_node()","00ce8e3e":"getUsers()","00ce9f8a":"getPeggedTokenValue(address,address,address)","00d11245":"Mallory(address)","00d17799":"defaultCreatedCount()","00d2c31d":"getHashSignatures(uint256)","00d30eb9":"firstWeekPreICOBonusRate()","00d32a75":"TransferDFN(address,address,uint256)","00d357d1":"CustomcoinCrowdsale(address)","00d3f51a":"VirtualRealityChain()","00d4b768":"currentMideTokenTime()","00d4b959":"ico1total()","00d52342":"loseGame()","00d56d71":"StageTwoEnable()","00d5da02":"setTokenDescription(string)","00d7b3a9":"Exoso()","00d7e9cf":"landPricePrevious()","00d7f5d8":"Human1StandardToken(uint256,string,uint8,string)","00d80e07":"getGuardianSale(uint256)","00d84fd8":"remove(uint32)","00d9694c":"setBonusRound3(uint256)","00d9f24e":"UpdateNumPlayers(uint256)","00db90d1":"setCanWithdrawBeforeEnd(bool)","00dba80c":"mineableTokenStorageContract()","00dba864":"TOKENOPSPLATFORM_JOINTTOKENS()","00dbeb31":"getPromoCodeForEther(bytes16)","00de1eb4":"cofoundersSupplyRemaining()","00de8393":"SetLimit(uint256,uint256)","00dee43f":"initMinting()","00df415e":"preSaleZxcCap()","00dfafa4":"addMarket(address,uint256,uint256,uint256,uint256)","00dfd21a":"getUserDocId(address,uint32)","00dff399":"Fibonzi()","00dff60a":"partnerPreICOBonus(address)","00e063bc":"AddressQuery(address)","00e0c53f":"hold()","00e11919":"setClamTax(uint8)","00e1986d":"grantVestedTokens(address,uint256,uint64,uint64,uint64)","00e29488":"selfRegisterDINWithResolver(address)","00e31614":"modifyGuess(uint32,uint64,uint64)","00e37634":"batchRefundzFixed(address[],uint256)","00e38410":"getVotingMetadata(uint256)","00e43ee9":"setMigrationStatus(uint256,address)","00e46700":"setMinimumPassPercentage(uint8)","00e4768b":"setPrice(address,uint256)","00e4778a":"addAccessoryIdMapping(address,uint64)","00e4fc14":"withdrawNetfRevenue(uint256)","00e520d0":"_emitSkillEvaluated(address,address,uint8,uint256,uint256,uint256)","00e5fc5f":"rawVotes(address)","00e610fc":"passwordMint(address,uint256,bytes32)","00e62620":"zoDailyLimit()","00e64f6d":"regularDonations()","00e6abbe":"EggFactory(address)","00e6b9f8":"MetalToken()","00e756cc":"roleAddressAliaser()","00e7d289":"registerListening(address)","00e8516a":"buySamples(uint256,address)","00e85279":"ownerLock()","00e893ce":"crowdsaleTokenPriceDenominator()","00e97827":"percentRake()","00e9c006":"deleteTransaction(uint256)","00ea11ec":"calcCakAmount(uint256)","00ea3146":"postGood(bytes32,uint256)","00ea81c0":"mint(address,uint256,string,string,bytes32[],bytes32[])","00ea8737":"myTickets()","00ead724":"Ticket(uint256,address,bytes3)","00eaedc8":"retrieveVanityForWallet(address)","00eb52f2":"setIsActivated(bool)","00ebc96e":"setCrowdsaleEndTime(uint256)","00ed015b":"setETH(address,uint256)","00ed2592":"sendEvents(address,uint256,uint256)","00f052f6":"getBidByBidder(address,uint256,address)","00f12159":"SpectrumNetworkNetwork()","00f17754":"accountAt(int256)","00f1c7ec":"setAllocationFee(bytes32,uint256)","00f29d55":"isOrdered(address,bytes32)","00f2c41b":"calculateTotalPayoutAmountAndCommission()","00f31e76":"isPresent(bytes32)","00f380f4":"communityFund()","00f3e717":"mrate()","00f40839":"LogTowncrierCallback(uint64,uint64,bytes32)","00f43f6d":"Simple_Claimable_Temporized_Stake()","00f45438":"createTokenToMarket2019()","00f49203":"Hard_Cap()","00f545c6":"addressBelongsToAccount(address,address)","00f54f0a":"Wallet2()","00f5544f":"openGame(uint256)","00f55d9d":"destroy(address)","00f62717":"setMockedBlockTime(uint32)","00f64e66":"StakePoolICO()","00f666d4":"QueueManager()","00f6ca59":"runCredits()","00f714ce":"withdraw(uint256,address)","00f733e9":"pieceForSale()","00f784a4":"OrderAdded(address,address,uint256,uint256,uint256)","00f7c5be":"unregisterAddress(address)","00f821a7":"addMintContract(address)","00f9ac78":"setVoteFactory(address)","00fa081a":"multiplicator()","00fa7be5":"EnterToken()","00fac74a":"salesdeadline()","00faf4dd":"getTokenDivisor()","00fca46f":"initialAuctionEndTime()","00fdc73f":"currentMinPurchase()","00fdd58e":"balanceOf(address,uint256)","00fe03e3":"icoSoftCapInWei()","00fe4789":"batchFillOrKillOrders(uint256[],bytes[])","00fe9590":"getMaxInt64()","00fec4ba":"afterForkBlockNumber()","00fece08":"giveDown(address,address)","00ff2fb1":"log_2(uint256)","00ff6262":"DefensorWallet(uint256,string,string,uint8)","010066ad":"joinWhiteList(address)","01008275":"addPersonalCap(address,uint256)","0102305b":"logGameData(bytes32[],bytes32[],int256[],uint8,bytes32,bytes32)","01024700":"OnePhaseAuction()","0102fcfc":"distributeOwnership()","010342f4":"averageSalePrice()","0103c92b":"userBalance(address)","01044632":"setDevelopersTokens(uint256)","0104855f":"mctTotalSupply()","01056361":"setupFunding(uint256,uint256,address)","0106172a":"invalidEarlyPurchaseIndexes()","01061ae1":"removeArtworksByString(string,uint32)","010648ca":"setDocument(bytes32,string,bytes32)","01067543":"getParentCount(address)","01068767":"ABL(address,address)","0106bc8f":"PVE()","010731c0":"sendCryptedHand(bytes32)","0107a4eb":"XRRfrozen()","0107a8df":"withdraw_bonus()","01080c6f":"activateTokensForArbitration(uint256)","0109057e":"WIZISHOPPINGCOIN()","01090c4e":"_removeProxyManager(address)","01090c9e":"PowerOfPutin()","01095962":"oraclize_setCustomGasPrice(uint256)","0109f22e":"CrowdSale()","010a38f5":"getTokenId()","010a7d65":"tryTransfer(address,uint256)","010abbd0":"getCardOwner(uint256)","010ae545":"creditTokens()","010afc20":"claimWrappedContractAdmin()","010b66de":"mainSale_Cap()","010b8701":"hasSubstring(string,string)","010ba4e2":"balanc()","010bd255":"DPNToken(address,address)","010cc97c":"transferMarketIncentivesFund(address,uint256)","010d214e":"WithdrawProfit(address,uint256)","010d2446":"getProblem(uint256)","010d3bf6":"buyUsingRefBonus(address,address)","010dbfec":"sell(uint256,bool)","010e3964":"mintTokenForPreCrowdsale(address,uint256)","010e3c1c":"setInflationChange(uint256)","010e8209":"admin(address,uint8)","010f7735":"burnToken(uint256,string)","0110ea76":"TanterX(uint256,string,uint8,string)","01114d74":"getCCH_edit_33()","0111ae8a":"maximumValueAfterGuaranteedPeriod()","01122ddb":"BonusEnrolled(address,uint256,uint256)","011285da":"multiplication()","0112e2c4":"CotteToken()","01132b70":"setXTVNetworkEndorser(address,bool)","0113b261":"getNumberOfShareHolders(uint256)","01146844":"loadFund()","0114af17":"investment_address()","01169399":"createEthTknDelegation(address,address,address)","0116bc53":"CostChip(uint32)","0116bfc0":"BuyUpgrade(uint256)","01172005":"affiliateContract()","011721ad":"getValidation(address,uint256)","01173a74":"mintToken(address)","0117b324":"addTestimonial()","0118251c":"getHighWinPercent(uint256)","011847a2":"inviteReward()","011857d0":"bntConverter()","011879db":"createAuction(uint256,uint128,uint128,uint128)","0118895c":"reservations(address,uint256)","0118e662":"SiekechuCoin()","0118e686":"isCrowdsaleActive()","0118fa49":"create(uint256,string)","0119ada7":"eliminate(address)","011a44bf":"isAllFrozen()","011a8eb7":"DrawPrepareEvent(uint256)","011aab02":"Oculta(uint256,string,string)","011afdd7":"hello2()","011b1a7b":"setCrowdsalePrice(uint256,string)","011b29e3":"changeCourse(uint256)","011bc2e1":"calculateWinners()","011c3d06":"getCurrentStats(uint256)","011ce353":"OwnerRecall(address,uint256)","011d07c0":"getMyIdeas()","011d0b58":"buyListing(bytes5)","011d79ca":"CrowdsaleEnabled()","011db570":"calculateObtained(uint256)","011de7aa":"intervalAtTime(uint256)","011e0162":"Flercoin()","011e6492":"checkSuccess()","011eb18c":"removeAddressFromOperators(address)","01201c0b":"getTheTokens()","01209d09":"updateVaults(address,address)","0121683f":"createAuction(uint256,uint256)","01216f05":"calcEthReceived(uint256)","0121b93f":"vote(uint256)","0121be14":"_createCard(address,uint16)","01233474":"saleInProgressB()","012397ff":"firstroundprice()","01239adf":"maxPos()","0123aff4":"BurnCoinToken()","0124188d":"CAIRToken()","01250e4d":"CraigGrantEatDick()","01253fbf":"threshold1()","0125ae62":"setMeterPoint(int256,address,int256)","0125d7c8":"IPAYTOKEN()","0126b8b6":"batchAllocateTokensBeforeOffering(address[],uint256[])","01272c2c":"canExecute(uint32)","0127eb0d":"angelAdminAddress()","01281641":"OfferCanceled(uint256,bytes,address)","01281867":"keccak256calc(address)","01284ad4":"removeAddressFromPrivateWhiteList(address)","012874a3":"EthsMePresale(address,address)","01289e3a":"AvenceToken()","01293b5c":"defaultURIEnd()","012a08f8":"_vote(uint256,bool,address)","012aa25e":"releaseTokens(string,address,uint256)","012aa809":"InvalidCoinUsage(string)","012b1f73":"announceEndOfGame()","012bac23":"addCoinAllowance(address,address,uint256)","012beac9":"vendorRegistry()","012cd104":"LoveCrowdsale()","012d61e1":"buyRedirect()","012defec":"harvests(bytes32)","012ea37c":"arrangeFreePoints(uint256,uint256,uint256,uint256)","012f52ee":"escrows(uint256)","012fd089":"EscrowAccountCrowdsale()","012fec73":"KakushinToken()","0130371a":"MAX_SUPPLY_NBTOKEN()","01303778":"refreshMonarchyGamesReward()","013054c2":"redeemToken(uint256)","01307338":"dispatchRewardToken()","013130c0":"maximalInvestmentTimeTreshold()","01326c34":"clearAddresses()","0132cc82":"tokenFounderLockTime()","0133311b":"deleteLockTime(address)","01339c21":"launch()","0133db3a":"nameOf(uint256,address)","0133e1fa":"RunchuToken(uint256,string,uint8,string)","01340592":"MAX_CONTRIBUTION_USD()","01345514":"BJLToken()","013459ca":"getTokensForGraphenePower()","013512e3":"CABtoken()","0136356d":"unregisterAddresses(address[])","01365406":"deathData_f19()","01367751":"PryzeSale(address)","01372911":"throwsWhenActivatingBeforeDeployingANT()","0138aac1":"getUserBalanceOnToken(address,address)","0138e31b":"_jAdd(uint256,uint256,uint256,uint256)","013953a6":"amountForRefundIfSoftCapNotReached()","01395d33":"tokenPriceInWeiForDay(uint256)","0139caad":"payout(address,uint256,uint256,bool,uint256)","013a0e9b":"pairwiseOr(uint64)","013a83f1":"beat(uint256,bool,uint8)","013a9c50":"updateWallet(uint256,uint256)","013b490c":"updateDaoAddress(address)","013cf08b":"proposals(uint256)","013d48bd":"getGuessStatus(uint256)","013d64bd":"setCanCall(address,address,string,bool)","013dbf17":"crowdsaleProgress()","013e5415":"getGoldDataInitialized()","013e7c35":"getUrlCountOf(address,address)","013ed428":"author1()","013eebd7":"getmaxcardcount()","013efd8b":"tokenToEthSwapOutput(uint256,uint256,uint256)","013f83c9":"createTeam(address,uint32[])","013f84fa":"getAllNumberOfBets()","013fc2a3":"SmillesCoin()","0140e359":"stand(uint256,uint8[],bytes32,uint8,uint8,bytes32,bytes32)","0140ea82":"setNormalRoomMin(uint256)","0141e90a":"ICOaddress(address)","01429244":"getVendorApplicationsCount(string)","0142b8d1":"makeMerkle(bytes,uint256,uint256)","0142c8de":"currentPeriodRate()","0142c9ae":"isSoleout()","0142d43e":"notHungry(uint256)","0142d7b4":"authorizedBurnTokens(address,uint256)","0142f904":"CalculatePriceofRigs(uint256,uint256,uint256)","0143279c":"whitelistTicket(address)","014345c8":"SENDER_BALANCE()","01447eba":"disableCrowdsale()","0145e333":"init(address,address,address,uint256,uint256)","014647f4":"approve(address,bytes)","0146705b":"approvedRatio(string)","0146d0ca":"sendVote(string)","01491f09":"baseRateInCents()","01492a0b":"matchingEnabled()","0149eea0":"view_get_Treasure()","014a7453":"getPI_edit_22()","014a897d":"Token_2()","014b0732":"validateTrade(address,address,address)","014bed81":"setAmountToKoikeToken(uint256)","014c3dbc":"current_external_block()","014c8ac0":"CBToken()","014d0f68":"hardCapHighUsd()","014d36f4":"Afroin()","014e5fde":"ARKController_1_00()","014e6996":"ZTF()","014e95ba":"rateBase()","014f7f22":"joinCount()","014fc169":"setLockToAccount(address,address)","015008b1":"reLoadXaddr(address,uint256)","01500a97":"getTokenForCommunity(address,uint256)","01501347":"disableRefund()","01502460":"freezeTransfers()","0150b530":"addressesLength()","015129a1":"sellPriceEth()","01512db1":"removeIntervalCoefficient(bytes2,uint256)","01515a7b":"weiToReceive()","01518d76":"sendQuery(uint256)","0151cf1d":"setVotingWinner(address)","01538868":"_setTokenURI(uint256,string)","015493b4":"setFoundationWallet(address)","0154d3ea":"notexistdept(string)","01567739":"beneficiaries(address)","015689c6":"testControlCreateWithParentsParentSameItemId()","0156b323":"destroyTokensFrom(uint256,address)","015773b6":"set_private_sale_total(uint256)","015854f8":"quoteBid()","0159a91d":"concatenate(string,string,string,string)","015a18ed":"start(bytes32)","015a4ead":"unfollow(address)","015aeda7":"setAttribute(address,bytes32,uint256,bytes32)","015afa55":"winnerIsB()","015bf264":"depositTokens(uint256,address,uint256)","015c1c7a":"toTokenAmount(address,uint256)","015cb3ff":"pauseTime()","015cb8cf":"baxianchain()","015ccd07":"DockToken(address)","015d200f":"lockBalanceAll(address)","015def53":"priceFactorC()","015e4f3a":"getConfigUint(int256,bytes)","015e52c6":"getPool(uint32,int256)","015f32f9":"cappedSaleStartTime()","015fa6c1":"setWeiCap(uint256)","015ff39f":"GNOSIS()","0160751c":"setDepositary_function(uint256)","01608f5f":"amountOf(address)","0160e2f6":"cancelOptionOrder(address[3],uint256[3],bool)","01612def":"additionalInternal(bytes32,uint256[])","0161d5f0":"createCampaign(address,uint256,bytes32,bytes32,bytes32,bytes32)","016211b5":"bonusAllocation()","01621527":"destEthDevs()","01623ee4":"basicRate()","0162827c":"bonus02End()","0162f799":"getPrivatePresaleFundersCount()","01637ff4":"getAccessory(uint256)","0163d8ff":"MostValuableCoin()","01644ea7":"getSimple()","016474ce":"withdrawalRound(address,uint256)","01655e31":"CollectibleBidEntered(uint256,uint256,uint256,address)","01659863":"_0xBitcoincashToken()","01665393":"BLOCKRADIO()","016774e9":"donatetokens(uint256)","0167eb85":"stone()","01681a62":"sweep(address)","016899de":"depot()","0168e2e3":"JonsCoin()","0168f063":"tokenAmountOf()","016a8cf6":"topUp(address,uint32,uint192)","016aba15":"setDividendTransactionNumber(uint256)","016b0882":"Cst()","016c6601":"_receiveDeposit()","016d60b3":"buyStoreCore(uint256,uint256,uint256)","016d7c83":"pauseLottery(uint8)","016deccc":"createContractSpecial(string)","016e03b1":"getItemIdToTokenId(uint256)","016e128b":"ProfitWithdrawn(address,uint256)","016ea771":"isNotCommittee(address)","016eb8a8":"percentage(uint256,uint256)","016f34ad":"callgSoftCap()","016fa018":"getPartnerBalance(address)","01725a0b":"demo()","01738ecd":"setCurrent(uint256)","0173e3f4":"addCoins(uint256)","0174e12b":"myx()","01750152":"isNode(address)","01769b37":"sendTokensToSeven(address,address,address,address,address,address,address,uint256)","0176b596":"DreamBit()","01770e0c":"NKTToken()","01775f23":"_closeBooks()","01778b6d":"Ynfiniti()","0178090c":"toSHA256(string)","01788d1d":"Decabes()","01788d56":"balanceOfTranche(bytes32,address)","0178b8bf":"resolver(bytes32)","0178fe3f":"getData(uint256)","017945ba":"changeDollarPrice(uint256)","017972af":"getNumbersFromHash(bytes32)","017b0d00":"highestBidForEdition(uint256)","017b39a7":"getMiniPoolEdit_1()","017bef67":"addExplorationByShip(uint256,uint256,uint256)","017e322c":"getCurrentGameSteps()","017e6f5f":"reOrganizeAuthorities()","017f27fc":"saleIsClosed()","017fa10b":"returnUint128(uint128)","017fa51d":"shouldRevertPure(bool)","017fe809":"getPower(uint256)","01828e61":"Quecoin()","01836037":"foundationBoard()","01838f01":"addAnimal(uint8,address)","0183f310":"potMembers(uint256)","0184e952":"award(uint256)","0184fc35":"crowdSaleAddress()","0185f409":"getInvestorAddress(uint256)","01863f79":"thisContactsTokens()","0186aa16":"OxBioToken()","0186c36e":"getCurrentExchageETH()","0187699c":"VerixChain()","0187a677":"bbodServiceRegistry()","0187e973":"PricingStrategy(uint256,uint256,uint256,uint256)","0188c09f":"altList(uint256)","0188fdef":"setMaximumBuy(uint256)","01890840":"MilestonePricing(uint256[])","0189bd41":"getProofOfPerfBlockStateState(bytes32)","018a25e8":"getBuyPrice()","018aba3f":"createPledge(address,uint256,uint256)","018b06ff":"isWinner(address,bool)","018b64b6":"AuctionCancelled(address,uint256)","018d3490":"assignOracles(uint256,address[])","018d6f7a":"showethconf(address)","018de5c5":"distributeCBC(address[],uint256,uint256)","018dfaa0":"calcCount(uint256)","018e13d0":"numOfCurrentEpoch()","018f5472":"isAUser(address)","018fa360":"getDeposits(address,address)","018fbf9f":"hashAt(uint16)","01909317":"_storeSettingDataState(uint256,address,uint8,string,address,address,string)","0190b805":"editEarlyParicipantWhitelist(address,bool)","0190e84f":"Bitscorone()","0191903e":"setBlogregistry(address)","0191d35c":"summFounders2()","0191dc92":"numOfAdmins()","01930b6e":"darknodeDeregisteredAt(address)","01933c43":"TOWN_START_PRICE()","0194abaf":"prolong()","0194ac16":"BlockchainFUN(uint256,string,string)","0194db8e":"sum(uint256[])","01968a56":"mintAllocation(address,uint256)","01970353":"setStepOneTime(uint256,uint256)","01970c6b":"team_funds()","0197d972":"VESTING_PERIOD()","01984892":"name(address)","0198632a":"getPurchasedProducts()","0198aa74":"firstsaleOpen()","01991313":"scheduleCall(address,bytes4,uint256)","01996951":"ethPerTransactionLimit()","01998ad4":"GlobalAdminChanged(address)","0199c7b2":"numberOfHolders()","019b1576":"backupAddress()","019b32ad":"transferToSalesPartner(address)","019c3f52":"newCollectible(uint256,string,uint256,uint256,uint256,int256,string,uint256,string)","019c5675":"BatchComplete(uint256)","019d2729":"approve(bytes)","019e56fd":"findCurrentFor(address)","019f5c5b":"narcoCore()","019f64cc":"payBack()","019f80b6":"toSecond(uint256,uint256)","019f8e26":"AddedManager(address)","019fef03":"resetFine(uint16)","01a00216":"addMod(address)","01a01551":"getApprovers(string,string)","01a048c3":"mintLockTeamTokens(address)","01a08a8b":"getWorkerPool(address,uint256)","01a0dee1":"investorsSupply()","01a12fd3":"removeAlerter(address)","01a15ee9":"mintTokensLocked(uint256,int256,address,uint256,uint256)","01a1b778":"battleId()","01a2789e":"transferPreSignedBulk(address[],address[],uint256[],uint256[],uint256[],uint8[],bytes32[],bytes32[])","01a2f48a":"changeAssetPackPrice(uint256,uint256)","01a2f75c":"createContract(address,uint256,uint256,uint256)","01a340a5":"totalBoughtColor()","01a413b9":"bankrollAvailable()","01a50001":"rewardEvery100000Draw7(uint256)","01a521d6":"getSellerBalancesOfCurrentAuctions(address[],address[],address)","01a53d3b":"maximumBuyBackPriceInCents()","01a5e3fe":"isWhitelisted(bytes32)","01a682c1":"createTeam(string,string)","01a68a94":"donkeyCoin()","01a6ab93":"PassedGateway(address,uint256)","01a77625":"_subEth(uint256,address)","01a7a8c0":"batFundDeposit()","01a80669":"createInvestorWallet(uint256,address,uint256)","01a88f7d":"buySeeds()","01a8d07f":"addBidder(uint256,address,uint256,uint256)","01a93f1c":"giveAwayOwnership(address)","01a96b94":"set_stage_Discount(uint256)","01ab2a66":"getPlayer1()","01ab2f14":"Manus()","01ab9806":"BUY()","01ab9f19":"_safeCall(address,bytes)","01ad35e3":"mintTokensForCommand(address,uint256)","01ad3936":"assignedAmountToDevelopmentTeam()","01ad62a3":"getBackendWallet()","01ae19d6":"LogLOTTransfer(address,uint256,uint256,uint256,uint256)","01aef755":"setBestProbability(uint8)","01afd5f3":"allBalancesForManyAccounts(address[],address[])","01afebac":"ICOopen()","01b057b1":"isAdminSet()","01b07f75":"adjustValue()","01b0c649":"collect(address,address,uint256,uint256)","01b11792":"toggleLocked()","01b125e6":"resetTimer(string)","01b14149":"getFcontracts(address)","01b2320e":"getStartBlock(uint256)","01b2a413":"baseVerifierFee()","01b490ed":"CAIDToken()","01b54744":"setLLV_edit_24(string)","01b5990c":"getCreatedOn(address,uint256)","01b5ffcf":"addVesting(address,address,uint256,uint256,uint256,uint256,bool)","01b6b523":"viewMyContribution(bool)","01b74d73":"TEAM_SHARE_PERCENTAGE()","01b78b12":"BitcoinMoon()","01b852c9":"MetadollarCrw()","01b869f1":"release(uint32,uint32,uint32,bytes)","01b8a0b9":"createTestingEnvironment()","01b96aaf":"waveCap2()","01b98853":"assetFreeze()","01b9a397":"setDescriptor(address)","01b9fe59":"testMint(int256)","01ba2bd5":"Request_Airdrop()","01ba6805":"loseEth(address,uint256)","01baa2e7":"validateCap()","01bb4edf":"RAIOCO(uint256,string,string)","01bb67a8":"InvestCancelEvent(address,uint256)","01bb7e5a":"getLockerDetails(address,uint256)","01bb85a4":"__startBlock(string)","01bbb8fa":"verifyTimelock(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes)","01bbc3f5":"stopWhitelistReservetion()","01bc237d":"researchers(address)","01bc43a0":"sha(uint128,bytes32)","01bc45c9":"_admin()","01bc757a":"getstudentInfo(uint256)","01bc9533":"totalTokensGenerated()","01bd4051":"disown(string)","01bea2bd":"Mountain()","01beb7cf":"setBadgeLevel(bytes32,uint256,string,string,bytes)","01bebf36":"updateAirdropStageState(string,bool)","01bf6648":"removeFromWhiteList(address)","01c0c6bc":"_processRefund(bytes32)","01c11d96":"MAX_PRICE()","01c1c877":"setChampion(uint256)","01c1de96":"fechVoteInfoForVoterByStage(address,uint256)","01c24a90":"minimum_balance()","01c28786":"date_end()","01c2b6f5":"commitDeadline(bytes32)","01c355df":"appSelectors(bytes4)","01c432ce":"wrongClaimerOrUnsetInManager()","01c4a07e":"convertDeposit100to70(address)","01c516b1":"crowdsale_end()","01c543c2":"claimOreOnlyFromAssetId(uint256)","01c5b2f0":"compressBoard(uint256[81])","01c64ce8":"maxTxGas()","01c69452":"brandAccounts(uint256)","01c6adc3":"transferFrom(address,uint256)","01c6f167":"auctionsRunByUser(address,address)","01c7cb58":"migrateMileageLeader(uint8,address,uint256)","01c835e5":"returnRemainRewardToken()","01c8c9d4":"getCurrentBonus(bool)","01c96df6":"ZeusShieldCoin()","01ca1d72":"getTransformRate()","01cb0261":"getWeightedVote(bytes20,uint256)","01cb3b20":"checkGoalReached()","01cb63e8":"arrayIndexOutOfBoundsDynamic(uint256)","01cceb38":"setExpiry(uint256)","01cdc371":"getCBATransactionMessageLength(address)","01ce5e75":"fundsCombinedValue()","01ce616f":"setMaxweiAmount(uint256)","01cff174":"getNumberOfAvailableStartTickets()","01cffa17":"getTokenWithBonus(uint256)","01d09a3c":"setCallbackGas(uint256)","01d0ac0b":"requestAccess(address,address)","01d1c7fd":"BTCS_ETHER_CAP()","01d223c1":"set_modified_weth_address(address)","01d2db89":"isValidKyc(address)","01d4277c":"thisisalsofind(uint256)","01d42a9c":"closeChannel(address,uint256)","01d490fd":"registerVestingSchedule(address,address,uint256,uint256,uint256,uint256)","01d4fb7c":"fundsKeeper()","01d511f1":"request(string,string)","01d5c488":"gemCriticalRateConversion()","01d6e35b":"unfreezeTeamTokens(address)","01d78a8b":"alterTotalSupply(uint256)","01d81121":"allocateCreationInvestmentingToken(address[],uint256[])","01d81a50":"slice(bytes,uint8,uint8)","01d8715f":"replaceManager(address,address)","01d8ce92":"KpopArena()","01d90bbc":"getCurrentUserMaxPurchase()","01d92dc8":"unsoldAllocatonScheduled()","01d97f08":"setMapping(bytes32,bytes32)","01d98d44":"changesDenied()","01da31ad":"_setPermission(address,address,bytes4,address,bool)","01da73ff":"isValidChannel(bytes)","01da7b31":"getBankName(address)","01db61e0":"HARD_CAP_EUR()","01dbdf44":"priceAt(uint256,uint256)","01dd91c0":"force_received()","01dda205":"updateSoftCap(uint256)","01ddc95e":"getTargetBlockLength()","01ddfa9d":"referalFundBalance()","01de7a1c":"updateVendorName(uint256,string)","01dee025":"getTombDetail(uint256)","01df6885":"getTokenDetails(uint64)","01df7f30":"validateProposedThroneConfig(uint256,uint256,uint256,uint256)","01e0ba3a":"bonusAccountIndex(uint256)","01e11c29":"SellToken()","01e1bcf7":"rateIcoPreICO()","01e1c861":"minWeiValue()","01e1d114":"totalAssets()","01e1ecb4":"releaseTokensAndEtherForEmergencyFund()","01e30a7f":"bigContributionBound()","01e33667":"withdrawToken(address,address,uint256)","01e343db":"setOffset(uint256)","01e3d346":"create(bytes1,bytes32,uint256)","01e3d718":"transto(address,uint256)","01e40f5b":"getFeeWindowBurnTargetValue()","01e4741c":"Ebets()","01e4abc1":"setWhiteList(address,address,uint32)","01e5691c":"createTransaction(uint256,address,uint256,uint256,address)","01e56c77":"stopPayouts()","01e57a37":"dth()","01e5aa3e":"getIssuerArray(bytes32)","01e68cbb":"timestamp_msg()","01e6a70e":"EthlanceInvoice(address)","01e73b73":"bulkVote(uint256[])","01e7fefe":"addParticipant(address,uint256)","01e88208":"permissions(address)","01e8b608":"TOKEN_SECOND_EXCHANGE_RATE()","01e91872":"DECToken(uint256,string,string)","01ea6270":"setTeamTokenAddress(address,address)","01eb6fdd":"max(uint32,uint32)","01ebc88e":"pingReading(uint256)","01ebccb9":"activeNameOf(address)","01ebd36b":"enable_sale()","01ebebf2":"myTulips()","01ec0793":"profitsOf(address)","01ec16ef":"RulesChangedEvent(uint256,uint256,uint256,uint256)","01eca37c":"medalDataContract()","01ecaca5":"changeOVCPerEther(uint256)","01ed7f8b":"distribute(address,address,address)","01edb1ea":"dayIdx()","01ef6cad":"addJobContractFeedback(uint256,string,uint8)","01ef74f1":"tokens_rewards_available()","01efb6c8":"getOrderInfo()","01f2a2c5":"buyForBtc(address,uint256,uint256,uint256,uint256)","01f40a85":"issuePurchase(address,uint256)","01f59d16":"maxFee()","01f5af30":"addJobSponsorship(uint256,string,string)","01f6dad0":"remaining_for_sale()","01f6e6d5":"asignarDni(uint256)","01f78f43":"getFreeCHICKEN()","01f7e49a":"removeFromPresaleWhitelist(address)","01f81649":"claimBrokerFee()","01f865c3":"setWinPercent(uint256)","01f89de0":"purchaseSharesOfArtwork(uint256)","01f99ad7":"left9(uint256)","01f9a0aa":"setOraclizeQueryMaxTime(uint256)","01fa3e53":"addSocial(address[],uint256[])","01fabd75":"addArbitrator(address)","01fae3b6":"setTokenState(uint8)","01fbaf99":"totalLareSold()","01fc59e1":"checkId(bytes32)","01fce27e":"getQueue()","01fd1b1d":"finalizationFailHook()","01fd89a4":"getFlags(bytes20)","01fe34e3":"EWCertificationCenter(string,string,string)","01feeef4":"getTitleDeeds(bytes32)","01ff62ab":"isConcerned(uint256,address)","01ff8961":"getPortfolio(uint256,address)","01ffc9a7":"supportsInterface(bytes4)","0200b10d":"collectedEthers()","0201b5d5":"transferOverBalanceFunds(address,address,uint256)","0201e253":"WhoHoldsPatentFor(bytes32)","0202f3ea":"allowTransfersTo(address)","020331dd":"getFact(bytes16)","0203596d":"purchaseKingdom(string,string,bool)","0204c163":"maxFadeoutPromille()","0204d0f8":"unlockOwnerDate()","02055186":"Alexa()","02063d93":"calcMaxDeposit()","0206432d":"FlexionCoin()","02064b42":"consul_price()","02065fb8":"isLoanFunded()","02067e6a":"add(uint8)","0206deb5":"unitsLimitForCurrentSaleStage()","0206e79d":"decodeParamId(uint256)","02072579":"controllerSet()","02078166":"unburnedTypeTokens()","0207eda6":"NOVA(uint256,string,uint8,string)","02083e27":"REET()","02093ee2":"finalize2()","02096a8e":"amountsByCurrency(uint256)","02099186":"totalRise()","0209f982":"reminder()","020a0ff5":"setClaimLimit(uint256)","020acb6a":"round1Bonus()","020bdf54":"getFreeStrippers()","020d308d":"removeDelegate(address,address)","020d4786":"OmmerToken()","020de876":"setTakerFeeRate(uint256)","020df04b":"createBarCode(bytes32)","020df957":"setAirdropReceiver(address)","020e2d48":"getArrayHashLibry(bytes32)","020eb6e1":"createWorkOrder(address,uint128)","020f899a":"hybridizationPrice(uint256)","0210d751":"getMyGames()","02114111":"allowTimelock()","0211c4bb":"MessageToken()","0212d0b9":"payByTokens(uint256)","0212fd1f":"InternationalRapidAsset()","0213443c":"changeZombieCreator(address)","02135534":"getNinja(uint256)","02138563":"buyOre()","02140adf":"CryptoHuntersToken()","0214e9cf":"preIcoFinishTimestamp()","0216f544":"transferExecutor(address)","02171e7c":"largeConstant()","02172276":"triggerEvent(string,string)","02175beb":"setOzr(address)","0218a1c3":"setString(bytes32,bytes32,string,bool)","02190a52":"allowRecurringBillingInternal(address,uint256,uint256,uint256,uint256)","021979c3":"wlcontract()","021991e7":"getBetsLocked()","021a11d0":"setContractICO(address,address)","021ba8f8":"CLAWBACK_PERIOD()","021bb947":"burnAfterIco()","021bc974":"checkPoolBalance()","021c309a":"solveBet(address,uint8,bool,uint8)","021c43b4":"NBY()","021c7bd7":"setInspectorId(address)","021da58e":"initCrowdsale(uint256,uint256,uint256,address,address)","021dc2fc":"tokenExchangeRateInWei()","021dd82c":"checkNotLocked(address,uint256)","021e7f85":"CONTRACT_ALLOWANCE()","021ea45e":"claimTilesForExistingUser(uint16[],uint256,bool)","021efe49":"getPawnOwner(uint256)","021f0376":"_addAssetTo(address,uint256)","021f36a4":"changeResource(bytes32)","021fe51f":"VUPRefundedForWei(address,uint256)","0220611a":"timeOfLastPublish()","022079d9":"ecmulVerify(uint256,uint256,uint256,uint256,uint256)","0220a5b4":"terminate(string)","0220f662":"addPolicyAttribute(uint8,uint256,uint8)","0221038a":"payOut(address,uint256)","02218ad6":"desBan(address)","0221f2fb":"Beneficial()","0222f96e":"Poppy()","02238cbd":"_activateDevice(bytes32)","02238e43":"launchnewround()","0224dc18":"TOKEN_SALE1_PRE()","0224e9a7":"devFees()","02258730":"nodeRegistration()","02259b07":"setPBTTForGas(uint256)","02262ced":"setBackendOperator(address)","0226401d":"ownerTestValue()","02264b63":"private_withdraw(uint256,address)","0226a5c9":"petOnLeaderboard(uint64)","0226ed48":"changeGlobalAdmin(address)","02285548":"FarmHopeProjectToken()","0228e05a":"walletFromData(bytes)","022914a7":"owners(address)","02299496":"updateICOStatus()","0229ae31":"CosmoCoin()","0229b23e":"pauseSALE()","0229c4eb":"TransferMinimumFeeProposalAdded(uint256,address,uint8)","0229e448":"founderMulSigAddress()","022b7433":"add(bytes32,uint8,uint8)","022b8a7f":"getIdProject()","022b9735":"GetMyBalance()","022bc71f":"getNextCallSibling(bytes32)","022bd24c":"hypes(uint256)","022c254a":"pendingChanges(address)","022cabac":"CoinViewToken()","022e1e59":"USBEEF()","022ec936":"updatePeriod(uint256,uint256)","022edd35":"getActiveContracts()","022fc88b":"approveToken(address,uint256)","02300cbb":"DepositReleased()","0230a07c":"releaseDeed(bytes32)","0230d870":"tierThreeRate()","02329a29":"pause(bool)","02337657":"documentIPFSHash()","0233d94d":"getEscrowsByTaker(address)","02340ad6":"deleteVisaOffering(uint256,uint256)","023569aa":"MoniCoin()","02356ec0":"returnCoupon(address,bytes32)","02358773":"XFL(uint256,string,string)","02359fdd":"OfferingCloses(uint256,uint256)","02361dbc":"totalAllStage()","0236bb5a":"isAdminAddress(address)","0237ef12":"contributionInWei()","0238777f":"preCrowdsaleContractAddress()","0238b5aa":"testToAddress()","0238b770":"endDateICO()","02394872":"getLastBlockHeight()","02395e9b":"lpc()","023a624a":"right11(uint256)","023bb74d":"DATE_PRESALE_START()","023c19ce":"MyWishChain()","023c23db":"getSize(uint256)","023c6042":"tokencap()","023c61ca":"price_agent()","023c8be2":"setWithdrawalAddress(address,address)","023d6c03":"REPO_APP_NAME()","023e1c34":"communityContributionPercentage()","023e36d8":"nVotesCast()","023eff9f":"airdrop(uint8,bytes32,bytes32)","023f4147":"totalContributed()","023f4a66":"issueToReserve(uint256)","023fadda":"getRedeemedList()","02400845":"publish(bytes12)","02404bee":"crowdsaleCount()","02404fcb":"buyBanana()","0240ab3f":"finishRetrieving()","0240db33":"summFounders4()","02410cf6":"isFundReleased()","0241747f":"ReceivedBTC(address,uint256)","024187a5":"window0TotalSupply()","0241fb82":"returnChildForParentNew(address)","02421ca7":"SaddleFS(uint256)","0242622b":"changeMultisigAddress(address)","0242a5fc":"testRecovery(bytes32,uint8,bytes32,bytes32)","0242ba2a":"FOToken()","0242c430":"CreateTokenToTeam(address,uint256)","0242deb8":"registerIntermediary(address)","0242f1ef":"TonCoin()","0242f351":"getVote()","0242fc62":"voteNo(string)","02431422":"addSuperPlayer(address,bytes32)","02433d0f":"num_holders()","02437982":"adjustRate(uint256,uint256,uint256)","0243aa1b":"getCurrentNbVote()","02443111":"oneTrancheAmount()","0244ba4a":"Hubble()","0244eb3f":"testFundsAreLockedDuringSale()","0245c5c8":"importSequence()","02460d1e":"_emitHolderRegistered(bytes32,uint256,uint256)","02474718":"paydayFrequencyInDays()","02474c59":"myPledgeTo(address)","0247e02a":"subFromAddressBalancesInfo(address,uint256)","024800ff":"presaleWeiSold()","024858b1":"createTrade(bytes32,uint256,uint256,address,address)","02491bd5":"CryptoLottoCoin()","0249e64a":"CodeMailStamp()","024a56a4":"testIsData(bytes)","024adb25":"LogStateSwitch(uint8)","024c4199":"addListener(address,address)","024c6def":"BONUS_ICO_WEEK_TWO()","024c764f":"setChallengeCooldownTime(uint256)","024cc06d":"updateRecipientInfo(bytes32,string,string,address)","024ddebe":"Error(bool)","024edd75":"buyHero(uint256)","024fcc6c":"enableService()","024fd650":"tokenData()","024fd912":"GoToken()","02500824":"buyDentacoinsAgainstEther()","025026d5":"updateEmployee(uint256,uint256)","02502787":"FDT(uint256,string,uint8,string)","0250bd2d":"unregisterName(string)","02521b16":"saveTxt(string)","0252607e":"bitcoinPublicKey(uint256)","0252b995":"gameStartTime()","025313a2":"proxyOwner()","0253a95a":"getMaxMerge()","0253e935":"setOrderListLengthFactor(uint256)","0253fbd1":"momFab()","025404d4":"amountRaisedUSD()","02543238":"setDiscountValueOff()","02548866":"TOTAL_CAP()","0254aa41":"CommonEth()","0254e687":"GodlyCoin()","0254ef0f":"enterMedium()","02550e4d":"profit(address)","02556de3":"updateMajorTree(bytes32)","02565633":"buriedSupply()","0256c7f5":"Afin()","0256e827":"enablePurchasing(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","02571be3":"owner(bytes32)","0257210f":"ForgeCDN()","02573fc2":"resetStellarInvestor()","0257a0c0":"onLotteryCompleted(uint32)","0257c48c":"meta(bytes32,bytes32)","02581ab3":"offerIndexedPieceForSaleByAddress(address,uint256,uint256)","02581cde":"refundExpiredBet(bytes32)","025830ac":"changedBrokerDealer(uint256,address)","025845ae":"thinkTankFundAddress()","02587586":"companyAddr()","025932fd":"bitikzikToken()","0259371c":"TTTTokenSell()","02593c2b":"_Split()","025a6f02":"OsmiumCrowdsale()","025abd58":"getTokenBalance(string)","025b22bc":"updateImplementation(address)","025b97bd":"getProviderAdmin(uint256)","025bbbe5":"newSale(bytes16,uint256,uint256)","025cce45":"AMULETS()","025cf89f":"setMigrationManager(address)","025dd017":"OnReceive(uint64)","025e029b":"buyStar(uint256,uint8,uint256)","025e56d3":"NeuroDAO()","025e7c27":"owners(uint256)","025e8095":"transferCell(address,uint256)","025ec81a":"getBytes32Value(bytes32)","025f9bc1":"updateTokenInformation(string,string)","025ff12f":"airdrop(address,address[],uint256[])","026164ad":"sunset()","026189ec":"BitRecord()","02618eb2":"AltCurrency(uint256,string,string)","0261a403":"issueDID(address,uint256)","0261edec":"getContractByID(string)","0262dc13":"claimOne(address)","0263379b":"bringBackTokens()","026345b6":"ledgerContract()","0264ba24":"sendValueToJackpot()","0265190c":"b66ReserveTokens()","026654bf":"PoolManager(address)","02667e9b":"killPay()","0266ba02":"list(address[])","0266f044":"reservePool()","02682ab3":"setNewWallets(address,address,address)","026858ea":"getRateModifierInPermilles()","0268ec43":"MyEtherTeller()","02690ef0":"setICOElePrice(uint256)","026993e0":"Midas(address,address)","026a308a":"_checkWhitelistContract(address)","026a9cdd":"getPotato(uint256)","026b1d5f":"getPool()","026c0d8f":"RHP()","026d0e1c":"grantUserLicense(address,string)","026d19d5":"WeTestToken(address,string,string,uint256,uint256)","026d6a67":"setStartStopBlocks(uint256,uint256)","026e402b":"delegate(address,uint256)","026eca12":"createTapPoll(uint8)","026f9d56":"SOT()","026fcf83":"setSaleFinish()","026ff05e":"deleteUser()","02704a4d":"COIN_SUPPLY_ICO_PHASE_3()","027116f7":"approveNewOwnersCount()","027391bf":"sendMoneyBeforeEnd(uint256)","02742425":"preFundingtokens()","027471b0":"roundActive()","0274d5ff":"soulIsOwnedBy(address)","0274ea81":"jadd(uint256,uint256,uint256,uint256,uint256,uint256)","0276650b":"individualCap()","027681ab":"setJackPotInfo(uint256,uint256)","02780677":"LN2()","0278199e":"StandardToken(uint256)","0278bde1":"ask(address,uint256,uint256,uint256)","0278fa20":"TeambrellaWallet()","027903ef":"setReservedTokens(uint256)","02795b3a":"tokenMarket(address)","027a4425":"EthereumDiamond()","027a5e3f":"getLastVersion(bytes)","027a7ccc":"calculateFirstCut(uint256)","027aa9f5":"getUnits()","027b1fb3":"SimpleStorage()","027bb838":"FLTToken()","027bd9a8":"changeColorGreen()","027bfab4":"discountedIcoTokensSold()","027c3e08":"ControllerChanged(address)","027cb7c6":"clearing()","027e7a0f":"getTotalGamePot()","027ec848":"setDurationOfLock(uint256)","027efe2b":"makeOperation(uint32,string)","0280052d":"setKing()","028118a1":"PREBUY_PORTION_MAX()","02814b86":"maxETH()","0281b752":"admin_set_ExchangeRateInWei(uint256)","02825adc":"gvOptionToken30()","02836f24":"upgrading()","0283f4b4":"addPropertyForUser(bytes32,address)","02846858":"removeBurner(address)","0285d554":"transferWithEvent(address,address,uint256)","028780e4":"ownerWithdrawZth(address)","02879f9c":"addProduct(string,uint256,string,string,string)","02884909":"authorizedLogicContractAddress()","02889f26":"getCustodianChangeReq(bytes32)","0288a39c":"withdrawDelay()","0288ab5d":"TCC()","0288c0a0":"TransferDomain(string,address)","0289e966":"newVersionReleased()","028a582e":"findEndpointByAddress(address)","028a95a0":"lockRemainingTokens()","028ab3b1":"__get(address,uint256)","028ae3b7":"setAffiliateList(address)","028af743":"getServerCurrentMatch(uint256)","028b7854":"throwsSaleWalletIncorrectBlock()","028e10ac":"BidaCoin(uint256)","028e3731":"getUsersByDocHash(bytes)","028e6c67":"intOrRevert(uint256,uint256)","028ebc44":"setRegistryContract(address)","028fb6b8":"deleteRef(bytes32)","029043a4":"removeBlacklistSpender(address)","02911cfe":"distribute(address,uint256,uint8,uint256)","02917f4a":"issuePatrons(address,uint256)","0291b9b1":"judgeIsReachDailyLimit(uint256,int256,uint256)","02927d20":"setupEventsHistory(address)","0292f88a":"setBaseDenominationAddress(address)","02931e59":"getUserPower(address)","02932f56":"totalCampaigns()","0293a772":"get_sale_owner(address,address)","0293fafc":"ADBToken()","02940dbb":"Decenturuon()","02942724":"preservedTokens()","02949bff":"CampaignToken()","0295d71b":"currentDepositLimit()","02965297":"update_height(uint256)","0296b3a8":"STARLIGHT()","02978be8":"gameHostAddress()","0297abe5":"getLimitMaxGame()","02981cfe":"transferedToPool()","02987db8":"priceInWeiPerSatoshi()","02989d9f":"SellOrder(uint256,uint256,address)","0298d557":"isValidSignatureAndData(address,address,bytes)","029a258a":"claimDonations(address[2],uint256[8],uint8,bytes32[2])","029a8bf7":"multiAsset()","029ad03e":"get_nb(address)","029bca78":"isPremium(uint256)","029c19aa":"getCreditBondAddress()","029d1ecd":"ownerApprove(address,uint256)","029d4b2d":"isTimestampInsideRange(uint256,uint256,uint256)","029da1c4":"walletFounder2()","029dc6d2":"piggyToWallet()","029deeb0":"updateUportInfoFromOracle(string,address,address)","029eabcb":"contributions()","029f1d0e":"userName(uint256)","02a10d87":"getPreSaleEndDate()","02a182d1":"setInvestmentCapIcoPhaseTwoPounds(uint32)","02a1a7a8":"isReachCapped()","02a251a3":"votingPeriod()","02a2680c":"getUserWalletByID(uint256)","02a2c88f":"kycLevelOf(address)","02a2cf02":"NOK_Omnidollar()","02a2e105":"RYANTOKEN()","02a2f06e":"GetMyBet()","02a3036d":"init1_block_height()","02a4e488":"decreaseAllowanceProxy(address,address,uint256)","02a4e849":"getMiniPoolEdit_9()","02a566bd":"Woyager()","02a59ea3":"isEntitledForCluster(address)","02a5c0be":"CryptoSagaArenaRecord(address,address,uint8,uint8)","02a63c28":"consumeMarketOrderAsk(uint256,address,address)","02a6f266":"Presale(address,address,address,address)","02a72a4c":"tokenGrantsCount(address)","02a86781":"authorAddress()","02a8a406":"setBurnPolicy(bool,bool)","02aa26f6":"buySeatForEvent(uint256)","02aa274b":"setForward(bytes4,address)","02aa6318":"getDistributions()","02aa9be2":"unvote(address,uint256)","02ab4781":"reservedCoins(address)","02abb4c5":"Miner()","02ac8168":"Launch()","02acbaa3":"CrowdsaleMinter()","02acc6b6":"GNTTokenERC20(uint256,string,string)","02acdb44":"setAnyoneCanCall(address,bytes4,bool)","02ae832f":"trashTokens(address,uint256)","02ae8cdc":"tokenProduct(uint256)","02aec20d":"PrintableToken(string,uint256,string,uint256,int256)","02af2095":"massTransfer(address[],uint256[])","02b04384":"AIRDROP_ADDRESS()","02b09ac5":"charityVault()","02b32af5":"greenToken()","02b33929":"SMTToken(uint256,uint256)","02b3b3da":"Divium()","02b4b52c":"isLogoInitied()","02b518fd":"callback(address,address,uint256,uint256,uint256)","02b5ecc8":"rateAngelsDayEnd()","02b68bbf":"getPlayersItemTickets(address)","02b6ef74":"CRofMakerByIndex(address,uint256)","02b6f286":"TokenContract(address,string,string,uint8)","02b70b41":"addConfirmation(bytes32,address)","02b7144f":"updateCheckpoint(address,address)","02b74a7e":"setupStates(uint256,uint256,uint256[])","02b857f3":"unlockMintDate1()","02b985d3":"arr(uint256,uint256,uint256,uint256)","02ba302b":"nextPrice1Of(uint256)","02ba6f8d":"getHistoryEntry(uint256,uint256)","02ba742b":"extendMembership(address,uint256)","02ba8742":"sendCoins(address,uint256)","02baaf40":"lastInitTimestamp()","02bb2929":"etherToDustPrice()","02bb5d6e":"setEOMarketToken(address)","02bb8465":"setContent(uint8,string,string)","02bc54bf":"companySite()","02be8e4e":"changeOwnerShip(address)","02beee07":"_getElement(uint8[],uint8)","02bf3165":"auctionUnpause()","02bf7fe7":"JumpCoin()","02bf9e7f":"verifySignature(address,bytes32,uint8,bytes32,bytes32)","02bfeeb8":"totalPicoUSD()","02c06bcd":"prevTokenAddress()","02c1d7cf":"iSportNews()","02c1ecbf":"returnStateChange()","02c28410":"getPublicAllocation()","02c29349":"fixWithdrawalAddress(address)","02c2a74d":"episodeManager()","02c3d7f6":"end_ICO()","02c4897b":"getAutorPicture(bytes32)","02c4960e":"InsufficientFee(address,uint256)","02c4980c":"BOC()","02c63852":"TokenVesting(address,address,uint256,uint256,uint256)","02c6d827":"getgamecardpos2(address,address)","02c6f427":"PRESALE_LEVEL_4()","02c71d92":"newClonedRepo()","02c76d45":"mintCoolDown()","02c7e7af":"sold()","02c85991":"distributeMinting(address[],uint256[])","02c90584":"userAddressExists(address)","02c95d2d":"setHaltIco(bool)","02c9972c":"TICK_TIME()","02c9e537":"cresusAddress()","02ca5994":"registerToken(address,uint256)","02ccee02":"getNoteLine(uint256)","02cd0f96":"Deadline(uint256)","02cdc1ee":"setSendGodz(uint256)","02ce5813":"whitelistActive()","02ce5fc4":"generateMintEvents(address,uint256)","02ce728f":"updateExchangeRate()","02ce8ac9":"withdrawSale(uint256)","02d0181c":"HamidToken()","02d05531":"getUriCount()","02d05d3f":"creator()","02d06d05":"bytesToUint(bytes)","02d19fe5":"testApproveWillNotModifyAllowance()","02d1c1e6":"sendOwnerBalance(address,address,uint256)","02d1d5fe":"getDesign()","02d23cef":"sendWithFreeze(address,uint256,uint256)","02d2f349":"lastPeriodChange()","02d3b339":"drawColors(uint256[],uint256[],address)","02d3bd16":"circulatingSupply_()","02d3fdc9":"burnMin()","02d44e57":"_getBetTimestamp(bytes32)","02d49d0b":"_createHiveInternal(address)","02d52fa4":"createProposal(uint256,string)","02d596d8":"getUserFromAddr(address)","02d66fc2":"hasSchema(bytes32)","02d6e7f4":"tokenXchangeRate()","02d6f730":"getFreezing(address,uint256)","02d77954":"getVoteOf(uint256)","02d7ccef":"UP_winRate()","02d800ec":"deactivateKey(string)","02d8146e":"tokensWallet()","02d947ef":"vote(uint256,address)","02d99637":"BlockClaimedEvent(address,address,uint256,uint256)","02da6d06":"lastDao()","02db2d8a":"myRefund(address)","02dbf3c8":"CGE()","02dc2e1d":"queuePayment(bytes)","02dcfc8e":"setAssetFees(address,uint256,uint256)","02dd6731":"disableApiAccess(bool)","02dd92c4":"crowdsaleOn()","02de2cf3":"isLatestPreReleaseTree(bytes32,bytes32)","02df0b61":"deprecateById(bytes32)","02df45a8":"closeActive(uint256)","02e0a2ff":"getAvailableBlance()","02e0b293":"LogVote(address,uint256,uint256,uint256,uint256)","02e0c14a":"get(bytes12)","02e0d5a5":"AquaToken()","02e1033a":"monsterFleeTime()","02e132f6":"recalcInvestorsFee(address,uint256)","02e26c38":"richest()","02e2c3b7":"setRefererPercent(uint256)","02e2f0b6":"Erc20TokenMarket()","02e32144":"precentDecimal()","02e33d25":"HydroToken()","02e49bd9":"publicityAddress()","02e4ef66":"transferWhiteList(address)","02e4f63b":"doExchange(address,address,address,uint256)","02e635e6":"AID()","02e650b6":"DigitalMoney(uint256,string,string)","02e6a5dc":"LIC(uint256,string,string,uint8)","02e6a951":"PayableContract()","02e7491e":"ERC165ID()","02e8243e":"WeiCoin(address,uint256,uint256,uint256)","02e8d8c0":"scheduleTransaction(address,uint256,uint256)","02e97770":"InfinitiEstate()","02e98e0d":"diffMinutes(uint256,uint256)","02e99e16":"SplitAmount(address,address,uint256)","02e9ad65":"dispatchTo(address,uint256)","02e9d5e4":"acceptBid(uint256,uint256)","02eb4759":"RightAndRoles(address[])","02eba8a7":"auditContract(bytes32,bool)","02ec77d2":"joinPot(string)","02ed26d1":"startTokensSale(uint256,uint256,uint256)","02ed4d2d":"Purox(uint256,string,uint8,string)","02ee3275":"setSatoShi()","02ee3a52":"getAllProducts()","02ee50e0":"EliteToken()","02ee6a6b":"RegisterEvent(address,address)","02eef456":"UK()","02eef7c3":"MassivelyMultiplayerOnlineGame()","02ef3844":"getBountiesByCreator(address)","02ef43c3":"recordPurchase(address,uint256,uint256,string,uint256)","02ef521e":"registerEtherToken(address,bool)","02ef6c86":"calculateWithdraw(address)","02efbde5":"batchApproveWhitelist(address[])","02f050e4":"getWinningDetails(uint256)","02f08568":"lockController()","02f0c937":"buyItem(uint256,address,string,string)","02f1bfad":"setupTimeWindow(uint256)","02f1ed99":"putOnInitialSale(uint256)","02f2008d":"hintURL(bytes32,string)","02f20b9c":"getReport(string,uint256)","02f41314":"continueDistribution(uint256)","02f58015":"claim_bounty()","02f65096":"executeBid(uint256,uint256,uint256)","02f652a3":"setTransferAgent(address,bool)","02f83a56":"withdrawBonusToken()","02f9fd84":"HHGTTG()","02faabb3":"fetchOrderByIdWithMerchant(string,address)","02fac967":"ownerHasCard(address,address)","02faf1e2":"revokeAccessFromAddress(address,address)","02fb0c5e":"active()","02fbe0d5":"getKittyGetOrNot(address)","02fc1f85":"ownedNumbers(address)","02fc28c4":"TAP_POLL_DURATION()","02fc2a8a":"_buy(address,uint256)","02fc3127":"tokenSaleBalanceOf(address)","02fd9dd8":"market_DeclareForSaleToAddress(uint256,uint256,address)","02ff1fac":"changeDevevoperAccont(address)","02ffc0b0":"getApprovedAddressesOfList(address[])","03015ea3":"registerArbiter(uint256,uint256)","03021c87":"setMaxInterval(uint256)","0302263a":"getPendingManager()","0302c688":"prod()","03031960":"VestingVault(address,address,uint256)","030326ad":"pushAddr(address)","0303f694":"_getBonusPercent()","030481d5":"changePreseller(address)","03048590":"ratePresale()","03048a42":"createRequest(address,uint256,string,bytes,bytes)","0304de3b":"setFeeRecieverValue(uint256,address)","03058aad":"getLatestManifest(address)","0305bdfe":"Trongold()","03060b68":"getCoreSupply()","03062183":"getVisaLeft(address,uint256,uint256)","03068d57":"setMinimumTextDonation(uint256)","0307024f":"getCreatedStatus(uint256)","03070ae7":"MANHATTANPROXYRIVDR()","03071302":"getCCH_edit_23()","030745ec":"_calculatePaymentToOwner(uint256,bool)","03075018":"getCosts()","03075ded":"emitIssuanceRatioUpdated(uint256)","03078416":"requestOfAmount(address,uint256)","0307acae":"copy(uint256[],uint256)","0307f82a":"SoldToken(address,uint256,string)","03083883":"compose(uint256[],uint256)","03090958":"_transferAct(address,address,uint256)","03096e92":"proposedMilestones()","0309922f":"icoMaxAmount()","0309c7f8":"payLastSixteenWinner(uint256)","030a78aa":"MAX_SITE_TOKEN_ID()","030b1776":"ROPE()","030ba25d":"withdraw(uint256,bytes)","030bccb0":"QLANCE2()","030c3631":"dungeonPlayerCount(uint256)","030cc118":"depositSuccessful_()","030cecc7":"decode(string,bytes32)","030d406b":"entryPayout(uint256)","030d945c":"PMHToken(uint256,string,uint8,string)","030e30df":"super_transferFrom(address,address,uint256)","030e6b98":"testFinalizingBeforeCapChangesHardCap()","030e9080":"returnAllCoke()","030eafa0":"endThisContact()","030f5702":"returnAmount(uint256)","03101f46":"setDistributionMinimum(address,uint256)","03110f23":"returnKitty(uint256)","031122ef":"exhaustChibis(uint256,uint256)","031126e1":"_approx(uint256)","0311904c":"investAmount()","0311a8f0":"getUploadNames(uint256)","03122043":"setCompte_40(string)","031324fa":"_transferDivis(address,uint256)","03137d43":"test_insert_findWithHintPrevRemovedUpdateHead(int256)","03138b31":"phase_5_remaining_tokens()","0313953d":"indexBalance()","03141fcd":"listPairForReserve(address,address,address,bool)","03145ac2":"WildFurToken()","03149252":"everyoneDisabled()","0314bcfb":"FUND_SUPPLY()","031578af":"bytes32Storage(bytes32)","0315a513":"getDigitalAsset()","0316bdb0":"CofounditToken(address)","03178d05":"getB3()","0317c06e":"isAllowedBalance(address,uint256)","0317fb71":"asmApprove(address,address,uint256)","031a36f1":"EBBToken(address,uint256)","031a8161":"convertDecimalBack(uint256)","031adff0":"whitelistingAddress()","031b3677":"funders(address)","031bd4c4":"TOKEN_LIMIT()","031d5d01":"readMessage()","031d7421":"createRegistry(address,address)","031d973e":"closeMarket(bytes32)","031e1b65":"sendFounderAndTeamToken(address,uint256)","031ee1c8":"contribute(address,bytes32,bytes32,uint8,bytes32,bytes32)","031f22e7":"PRICE_STAGE_TWO()","031f273c":"getMixerCountByType(bytes32)","031f3b1a":"remainderAmount()","031f74d4":"bugDiscovered()","031f9d7b":"buyCore(address,uint256,uint256)","031fce17":"listBackers(uint256)","0320fead":"getUsedBySoftware(uint256)","03216695":"monthlyWithdrawLimitInWei()","0321f836":"namiMultiSigWallet()","03228d0f":"changeSendingBanPeriod(uint256)","0323aa55":"isValidDeletion(uint8,bytes32,bytes32,string,address,address)","0323cc33":"getKnowledgeSinceLastUse(address)","0323e576":"INITIAL_CARD_PRICE()","0323f64a":"removeSubDivision(uint256)","03240775":"getActiveEntryById(bytes32)","0324149a":"marketGolds()","0324d0d9":"calculatVotePrice()","03251a08":"setMin(uint256,uint256)","0325be06":"biathlon_transfer(address,address,uint256)","03261030":"Time_call()","03267c60":"CITY_START_PRICE()","0326be45":"Permission()","0326c06b":"utfStringLength(string)","0327194a":"startPublicsale(uint256,uint256,uint256)","03282473":"AcceptedApplication(address,uint256,string)","03291893":"issueAndActivateTokenBounty(address,uint256,string,uint256,address,bool,address,uint256,address)","03294614":"buyPickaxes(address)","032a0af7":"adIds()","032a8838":"withdrawOnBehalfOf(address)","032aabf0":"has_presale_time_ended()","032b0824":"updateLatestRevision(bytes32,bytes32)","032b13da":"fourthChainETC()","032b3400":"end_Time()","032b642d":"changeStartAndEndDate(uint256,uint256)","032bc66b":"Locked(uint256)","032be08b":"ticketCountMax()","032c05aa":"maximalParticipationAmount()","032cbc5f":"chainStartBlock()","032ccf33":"dayPot()","032cfa5c":"comelBabyCoin()","032dbae5":"setTiers(uint256,uint256)","032e0868":"getAllStaff()","032eb997":"CCXTokenERC20(uint256,string,string)","032fa796":"SVCoin()","032fc13b":"whatRound()","03314efa":"shares()","0332c6d4":"advertisementPayment()","03335d04":"ethGoal()","03339af5":"getRobotCountForUser(address)","0333d499":"getOwnedPoints(address)","0333d4a2":"ZilleriumPresaleToken()","03347d75":"findOrderIndexForAddress(uint256,address)","0334e725":"FALCON(uint256,uint256)","0335d533":"USER_GET_CROWDSALE_TOKEN()","0335e18f":"timeComplete()","03379e7f":"Initialize(string,string,uint256,uint256)","0337aa74":"systemAuctionDuration()","0337e379":"releaseTokenOwnership()","0338e3a5":"getArrIntField2()","03395ba5":"AUCTION_TOKENS()","033988a1":"Pollen()","0339f300":"revise(uint256,bytes32)","033a010b":"adminClaimAirdropMultiple2(address[],uint256)","033a38b0":"vehreqexist(uint256,address)","033a6cab":"admin_redeem(address)","033b8675":"ICOCREED()","033ba5d1":"getWillData()","033c44c3":"m_totalInvested()","033c6ee6":"countHolders()","033c8477":"mined()","033da70b":"setLogicContractAddress(address)","033df9cb":"stepOneStartTime()","033e7ef4":"registerVoteToken(bytes32,bytes32)","033e86d4":"PurchaseLocked()","033f7bc9":"testEmergencyStop()","0340249e":"HotelloadTokenERC20(uint256,string,string)","03402a9a":"ClubTransferContract()","03406e76":"getOptionSellOrders(uint256,uint256)","034187fd":"setEthToCents(uint256)","03427656":"getDefaultSoftResolutionBlocks()","0343d550":"getApprovalCount()","0343dfa0":"checkInvariants()","03440022":"setAsSeller(address,bool)","0344a36f":"draw(address,bytes32,uint256)","03460f6c":"airdropAllowed()","0346a4ad":"MAXIMAL_PARTICIPATION()","034741a8":"patformWithdraw(uint256)","03487513":"SIGToken(uint256)","034889ff":"unFollow(address)","0348946d":"mintedTokensCap()","034a7bce":"saosao4()","034ac7a3":"ROLE_GRADE_PROVIDER()","034cb28e":"addressOf(address,bytes)","034cd0b0":"buyTokensGrowthLife()","034cf8bc":"transferClub(address,uint256)","034d0834":"NoBsCrypto()","034d3b0d":"withdrawTipForDeveloper()","034de540":"_getEthAmount(uint256)","034f55d2":"calculateSum(uint256[])","034f9774":"setWhitelistWallet(address)","034fcf55":"updCouponConsumed(string,bool)","0350bcd9":"toSendLeft()","0350d085":"Sign(string,string)","035186d6":"increasePrizePool(bytes4)","0351947f":"claimFine()","0352017b":"getInvestmentRecord(uint256)","03520535":"getPI_edit_10()","03526ff0":"LFDNetwork()","035340f1":"Bitether()","03547e53":"ownedBalance(address)","0354d6c5":"accountslength()","035502f2":"addCategory(string,uint256)","03553835":"calculateTokenAmount(uint256,uint256)","0355b70a":"getSpaceshipTotalSold()","03562dbb":"changeEmissionContractAddress(address)","0356948e":"previousstagedata()","0356fe3a":"genesisBlockNumber()","0357088b":"trancheByIndex(address,uint256)","0357371d":"release(address,uint256)","03580712":"executeDueToInactivity(bool)","03582fc5":"setReferralBonusPercent(uint256)","0358395d":"DominionCoin()","0358c295":"testInitialBalanceWithNewRGXBonus()","0358d965":"addPayout(uint256)","035ac814":"lastTimeUpdate()","035cf142":"getMinimumDeposit()","035d0880":"_requireQuePayment(uint256)","035d37a8":"setMinContribAmount(uint256)","035e898a":"getStellarInvestor()","035e902d":"Set_EmergencyCode(uint256,uint256)","035f057d":"multiIncreaseApproval(address[],uint256[])","03602e9e":"getPrivAddress()","03606b30":"setStopFunding(bool)","03611ec7":"Finside()","03612cb5":"settle(bytes32[],uint256[],uint256[])","03627e70":"countStudent()","0362d1f6":"getGamblerBet(address,uint256)","03635100":"bizcoin()","0363b1e1":"trade(address,uint256,address,address,bool)","036478c1":"GlobalAmountCapSoft()","03652c4e":"ICOStartTime()","03656d07":"exchangeMethodIsAllowed(address,bytes4)","036648b7":"TokenRateUpdated(uint256)","036723a2":"Payout_intern(uint256)","0367f96d":"setHardCapValue(uint256)","036896ab":"getERC20TokenBalance(address,address)","036a131d":"setPI_edit_28(string)","036a66eb":"GetProductionPerSecond(address)","036ae645":"deleteMessage(uint16)","036b3a81":"partnerSupply()","036bd387":"totalEthInWeiForFirstIco()","036c36eb":"relaySellerRequestCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)","036dd086":"createGame(string,string,uint256,uint256,string,string,string,string,bool)","036e05b0":"CreatePHX(address,uint256)","036e4220":"changeMinAcceptQuorumPct(uint256)","036ee850":"votingDeadline()","036f60ec":"setSupplyAdjuster(address)","037051eb":"startRound(address)","0370c0d9":"_repayLoan(uint256,uint256)","0370ca41":"contractStage()","0370e65c":"preSaleEndedAt()","037101c4":"remainingPresaleCap()","03710668":"callContract(address,bytes)","03714af7":"burnApproveReset(address,address)","0373e649":"Withdrawal(address,address,uint256,uint256,uint256)","03741040":"get_presale_arbits_total()","0374fc6f":"getBestOffer(address,address)","03750d94":"serverSeed(address,bytes32)","03771327":"HardcapGoalReached(uint256,uint256,uint256,uint256)","03771f2f":"numOfInflatableTokens()","0377ebe8":"itemKindCount()","0378f83f":"destroyFashion(uint256,uint16)","03792d52":"lastSubTokenBuyerOf(uint256)","037933dd":"calcSTQAmount(uint256,uint256)","0379565f":"EIP165Implementer()","037a417c":"testFunc()","037a9d30":"isDataSource()","037ae882":"reLoadKey(uint256,uint256)","037b5fdc":"burn_balance(address)","037c68b2":"disagreeCount()","037c983a":"resumeCrowdSale()","037c99b0":"setBonus(uint256,uint256)","037ca5fc":"HubCrowdsale(uint256,address,address)","037ca6c4":"allAgingTimesAdded()","037cf465":"has_token_sale_time_ended()","037d4ff8":"get_pre_kyc_bonus_denominator()","037e2e91":"Insureum()","037ed3e2":"executeClaim(address,address,uint256)","037ef916":"CaterToken(address,address)","037f9cf0":"rewardDistributionStarted()","0380e2f3":"getHashOfTheSignedDocument()","0380fd03":"newExchange()","0381c260":"getYearlyUSDSalary(address,address)","0381cb3b":"setRowcol(uint256,uint256[2])","03824f76":"hasSoldOut()","03828729":"coordinatesToAddresses(uint32)","0382c254":"CheckHash(uint8,uint8,uint8,uint8,bytes32)","038339ab":"publicGetDeposit(uint256)","03833bae":"ValidContributionCheck(uint256,bool)","0383966b":"testCanFinalizeOnCap()","0383a6f0":"CheckLimTransferDay(address)","038424c3":"maxEarningsClaimsRounds()","038461ea":"getCertifiedStudentsCount()","0384899b":"OwnershipChanged(address,address)","03850848":"saleAuctionContract()","03856d15":"BalanceOnlyOwner()","0386a016":"closeProposal(uint256)","03872547":"setarg_1_input(uint256)","0387b0a2":"saleCounter()","03880bab":"deal(uint256[2],bytes32,bytes32,uint8)","03894922":"allocateTokens()","038b117b":"onlyAdminAndNotFinal()","038ccee8":"createNew(uint256,address,address,address,uint256,uint256,uint256,uint256)","038d71ee":"switchOff()","038e666f":"ethereumSaleRate()","038e7577":"setConfigUint(bytes32,uint256)","038f1845":"returnFunding()","038f21a6":"mapToRange(uint16)","038f5ed6":"drawDown(uint256)","038f8b64":"batchFillOrdersNoThrow(uint256[],bytes[])","038fa9cb":"getRomms()","03901913":"DLBToken(uint256,string,uint8,string)","03905f10":"scoreKnockouts(bytes32,bytes32,bytes12)","03906217":"SaddleNotForSale(uint256)","0390d190":"YouDealToken()","0392d2b4":"isManagerAllowed(address,string)","039314b1":"VotingEnded(address,bool)","03941cc5":"onwerName()","0394b9ce":"getWeaponList()","03959bb7":"setDataContract(address)","03960631":"raindropAddress()","03969758":"SetDurationOfLock(address)","0396dcb0":"purchaseByEMONT(uint16,uint256,address)","0396ece5":"SetupReserve(address)","0396f60a":"Invested(address,uint256,uint256,uint128)","03975d1f":"_validateBetOrRefund(uint8)","03976b0e":"setBattleProviderAddress(address,address)","03980ac4":"prophetize(string,string,string,bytes32,bytes)","03985426":"getMode(bytes32)","03991aea":"getReleasableFunds()","0399247a":"isVotingProxy(uint32,int256,address)","0399321e":"set(bytes)","03995b2d":"holdingsOf(address)","03999795":"rouletteOwner()","0399c357":"assignFreeReadings(address,uint8)","0399f881":"ART_DECIMALSFACTOR()","039a21b8":"tryExecute(address,bytes,uint256)","039af9eb":"tiers(uint256)","039b267d":"mdtFoundationAddress()","039b6c34":"assign(uint16,address,uint256)","039ba6be":"getPriceETH()","039bd55a":"constrctor()","039c84c1":"Add(uint32)","039c9a21":"refundTransactionInternal(uint256)","039c9d84":"getOpenNum(bytes32)","039d0bfa":"setSelfOn()","039d8751":"GOX()","039de01d":"unregisterScheme(address,address)","039e4e2a":"situation_challenge()","039e9e00":"acceptOwnershipAPI()","039efdeb":"startMilestone()","039f0156":"withdrawNxc(address,uint256)","039f0e9c":"_createPuppy(uint256,uint256,uint256,uint256,address,uint16,uint16,uint16,uint16)","039f6b28":"QuadrantAssets()","039fb41c":"get_description_hash()","03a0d68f":"expiry_date()","03a168e0":"jackpotLastWinner()","03a19a4f":"maxDropsPerTx()","03a1b87d":"manageInvestors(address,uint256)","03a1bdc3":"walletLockBoth(address,uint256)","03a250f9":"startWork(uint256)","03a3053b":"reserveFundManager()","03a47b58":"tyms(uint256)","03a503a4":"addHorseIndex(bytes32)","03a5c8e7":"tdeActive()","03a68d1d":"REBToken()","03a6981b":"StateUpdate(uint128,int128,int256,uint256,address,uint128)","03a76fed":"createToken(uint256[],address)","03a77c7a":"setRegulator(address,address,bool)","03a7b41f":"queryPlotExists(uint8,int256[],int256[])","03a7bdd7":"testCloseContract(bytes32,bytes32,uint256,uint256,uint64,uint64,bytes32,bytes32,bytes32,uint64)","03ab614d":"testTranferOneToken()","03ac58d7":"deathData_f8()","03ac7215":"setTotalSupply(uint256,bool)","03aca792":"pendingList(uint256)","03ad4be3":"updatetoken(uint256,string)","03adaee6":"applyForCertification(string,string,string,string,address,uint128)","03adcbd2":"walkBook(uint16)","03addce2":"payout(address[],uint256,address)","03ade532":"ctrtMarketPrice()","03ae0357":"DevidendsSnapshot(address,uint256)","03ae3ded":"aproveLoan(uint256)","03ae4c1f":"buyCoke()","03aeeba6":"_setClientSupply(address,uint256)","03af2cda":"createMultiple(uint256[],uint256[],uint256[],uint256[],uint8[],uint256[],address[])","03af73d3":"sendCollectedEther(address)","03b05c73":"maxIssuedTokensPerIco()","03b0a55c":"icoPvtEnded()","03b0e428":"_unpackRarityBonusValue(uint256)","03b103ea":"Vote(uint256,string,bytes32[])","03b25050":"CGCToken()","03b4e20c":"removeAddressFromAccountFor(address,address)","03b5af0f":"incomingRandomNumber(address,uint8)","03b5d494":"takeBet()","03b62e10":"lowestDiff()","03b6eb88":"note(address,uint256)","03b718ee":"getCityBuildings(uint256,bool)","03b753dd":"tokenPurchase(address,uint256)","03b8a24e":"ritual(uint256)","03b918dc":"allow_contributions()","03b98c0e":"pauseable()","03b9b4f9":"releaseTokens(bytes32,uint256)","03b9f0b2":"referrerBonusRate()","03ba27f6":"withdrawToWallet()","03ba3a88":"notifyContract(address,address,uint256,bytes)","03bad56e":"transferERC223(address,uint256,bytes)","03bb5d8a":"openGameResultAndNewGame(uint256,string,bytes32)","03bbba93":"incentiveDistributionStarted()","03bc1e19":"changeOneBet(uint256)","03bc6d0d":"amendFee(uint256)","03bcebea":"initOneChance(address)","03bcf11d":"abortSale()","03bcf514":"finishedCrowdsourcingDisputeBond()","03bda14e":"raiseMaxNumBets(uint256)","03bdecf5":"right69(uint256)","03bec188":"ChangeMinAmount(uint256,uint256)","03bf4fb7":"setTradersContract(address)","03bf8e70":"birthKitty()","03bfee9e":"_getBidId()","03c0bfb5":"getOwnUserState()","03c13148":"setReceiver1(address)","03c175ff":"isRestrictedAddress(address)","03c1d1df":"collectERC20(address,uint256)","03c2d5b6":"nextGameDeveloperMiningPower()","03c327f0":"changingMilestones()","03c401e3":"ADDR_TKG_VC()","03c41c04":"NewUpgradedAmount(uint256,uint256,address)","03c45305":"foundersSupply()","03c49580":"priceOfElement(uint256)","03c4d93a":"payWithGold(uint256)","03c5b1dc":"setPeriod(uint256,uint256)","03c5f26a":"PublicCheckGameStart()","03c5faf4":"s12(bytes1)","03c63869":"resumePlayer(address)","03c6c8f9":"TheExcelToken()","03c7bce1":"_addMinter(address)","03c7da39":"mintMarketingTokens()","03c83302":"distributeDividends()","03c94ca6":"tokenSoftCapReached()","03ca0a95":"performSetTokenControlInfo()","03ca0eed":"requireCustomerId()","03ca0f6c":"advisors(address)","03ca30e0":"changePreMine(address)","03ca558a":"read_i8()","03ca71d6":"setSecurityCheck(string)","03ca7bcc":"debug_last_approved()","03cba01e":"bonusEndTime250()","03cbcf57":"getBetAmountAtLayer(uint16)","03cc1e32":"addFundingRound(uint256,uint256,uint256,address[])","03cc5597":"wrestle()","03cc5e4d":"setTechnicalAdmin(address)","03cc7b85":"num_tokens_auctioned()","03cc8efb":"BethingWorldCup()","03cd3e47":"transferRecovery(address,address,uint256)","03cddb2c":"capitalAllocated()","03ce6c55":"roundUp(uint256,uint256)","03ce9c00":"AcceptsTokens(address)","03cf0678":"bigBang()","03cf4fd6":"expire(uint256,uint256,uint8,bytes32,bytes32,bytes32)","03cf678b":"vitToken()","03d08f3b":"nextLotteryTTWTokenId4()","03d0b7d2":"minimumFeePlusDividends()","03d0cecd":"getLx()","03d2107f":"getSender(bytes32)","03d22885":"scheduleCall(address,uint256,bytes4,uint256,uint256,uint8,uint256)","03d231b5":"signerFlag(address)","03d258c4":"set_prices(uint256)","03d285fd":"nameok(string)","03d2e963":"zint_now()","03d37d78":"showPoolNumber(address)","03d38296":"indexSuperInvestor(uint256)","03d3a6b7":"shutForETH(uint256)","03d41eb6":"reserveSupply()","03d499ef":"totalEthereumICOReceived()","03d4e98a":"getProposalVote(uint256,uint256,uint256)","03d50703":"challengeExit(bytes32[],bytes32[],uint256,uint256)","03d51a0c":"transfer_ether_to_owner(uint256)","03d5aa0c":"PigChain()","03d5f483":"founderTokenVesting()","03d699da":"YggdrashCrowd(address,address,address,uint256,uint256,uint256,uint256)","03d6b6b4":"EpigenCareCrowdsale(uint256,uint256,uint256,address,address,address)","03d6d7b6":"getCallMaxCost(bytes32)","03d7244f":"dice_game(uint256)","03d756cb":"ethealToken()","03d75937":"setUIntValue(string,uint256)","03d76547":"addressFin()","03d83c4d":"stopTge()","03d9d253":"unlock(uint256,address,address,bytes)","03da04d7":"BRN()","03da8902":"transfearDBOwner(address)","03dc0532":"getLableRecords(bytes32)","03dc6340":"AdminTokenSent(address,uint256)","03dcead2":"directDebitOf(address,address)","03dcf6bc":"truToken()","03dd5a18":"testSimpleArray()","03dd88f8":"getAssTotal()","03ddc104":"ownerClaimOverride(uint256)","03ddcae9":"checkTradeSignature(bytes32,uint256[],bytes32[])","03dec463":"getRentOwed(address)","03df1550":"ECR20HoneycombToken()","03df6106":"setNewReleasePeriod(address,uint256,uint256,uint256)","03e07b2f":"getMinRefEthPurchase()","03e1b3c6":"sellAllAmountBuyEth(address,address,uint256,address,uint256)","03e20503":"localManualEntry(bytes32,bytes32,uint256,uint256,address)","03e28366":"playerNum()","03e2b9f5":"syncDate()","03e337d1":"SEPCToken()","03e39113":"BeggarToken()","03e3b1ed":"applicationApproved(address,address)","03e3f677":"setICOStart(uint256)","03e3fa51":"editScores(uint256[],uint256[])","03e4d9f5":"getDayIndex(uint256)","03e55f1c":"lockEscrow(bytes32,address,uint256)","03e5affd":"add(string,int256,int256)","03e6c117":"getIcoAddrListByIcoRuleId(uint256,uint256)","03e7b4e9":"getEmission(uint256)","03e83b6a":"MyToken(uint256,string,string)","03e864fa":"TestableMarketContractOraclize(string,address,address,uint256[5],string,string)","03e8837c":"getUserCount(address)","03e9287a":"Tacoin(uint256,string,string)","03e93b2e":"changeStarbitWallet(address)","03e9598c":"updateClientVersion(bytes32)","03e96fe3":"getAllTickets()","03e9e609":"getRecord(uint256)","03ec1bbe":"tokenIssuedTotal()","03ed9d21":"setMaxContribution(uint256)","03edae57":"withdrawFounderFunds(uint256)","03edf914":"placeBet(uint256,uint8)","03ee8f08":"getCoeff(uint16)","03eea024":"issueTreasury(address,address)","03eeb40e":"AngelsvsRedSox419()","03ef03b4":"buyBulkMidGradeCar(address,uint256[],address)","03ef2a2c":"tryExecuteProposal(uint256,bytes)","03efb5c4":"book(address,uint256)","03f0cc64":"affiliateCodes(address)","03f10bff":"IDMONEY()","03f11878":"casino(uint256,uint256)","03f14be9":"updateEmployeeWallet(address,address,address)","03f14e96":"currentAirdrop()","03f166de":"calculateTransferValue(uint256,uint256)","03f17336":"BOPs(uint256)","03f187ea":"registerFee()","03f21bda":"privateOfferingTokens()","03f3b07f":"setUserScore(address,uint32)","03f3cea1":"requiresHardCap()","03f3e275":"getRatioList()","03f3e7c8":"setICOWeek4Bonus(uint256)","03f4864d":"XXXXXXXX05()","03f499b8":"refundState()","03f6477d":"setBonusSetter(address,address)","03f67e1b":"changelp2(address)","03f73f08":"start_ICO2(uint256)","03f744b0":"JessieEducationToken()","03f7d4ff":"BitpaintingStorage(uint8)","03f8008c":"getUserDAOsCount(address)","03f979c8":"saleEndTokenCreationRate()","03f9b456":"LockupTokensWithdrawn()","03f9c793":"invest(address)","03fad66e":"settokenCap(uint256)","03fb3f63":"currentMigrationSource()","03fba444":"_receiveBuyNextRank(address)","03fce7ef":"approveEscrow(uint256)","03fd8c65":"withdrawBalanceHashing(address,address,uint256)","03ff20a1":"crowdfundEndTime()","03ff5e73":"stopTime()","03ff90f6":"minApproval()","03ffae3b":"FlightDelayDatabase(address)","040177b7":"previousDungeonId()","0401d897":"setVestingCliffDateTime(uint256)","04021ba8":"_increaseBalance(address,uint256)","04029f23":"_setBugFixVersion(string,uint32,bytes32,uint32)","040425d1":"protectedSupply()","040502e4":"EmmiumCoin()","04053d21":"checkCourse(uint256)","0405440c":"secureMode()","040622a9":"UNITPaymentGatewayList()","040677f1":"sentFirst()","0406870c":"SupplyManagementChainSolutions()","04072322":"GetEventData()","0407dc78":"medalBalanceOf(address)","04089c7d":"ALTnextCoin()","040a772e":"getUserDividends(address)","040c014b":"_changeName(string)","040c3a53":"maxRacers()","040cf020":"withdraw(bytes32,uint256)","040d54ce":"addFile(bytes32,string,uint256,string,string)","040d5e82":"partialFlip(bytes32)","040da8f4":"jackpotBalance()","040e33f0":"SHRToken()","040e55f5":"getTransferCount()","040ea2f4":"ownerSetPriviledgedAddress(address)","040f9a5e":"transferRemainingTokens(address)","040fa051":"isPendingRegistration(address)","04106c8b":"startGeneration()","0410ec85":"randomReward(uint256[])","0410fac7":"adminRemoveTrustedCurrencyContract(address)","04115187":"initTime()","0411bca8":"getChallengeAnswerResult(uint256)","041257ef":"setWhitelistControllerAddress(address)","04126ce5":"getHashSubmissionEnd()","04143865":"dec_multiple()","04148f7e":"createGame(uint256,uint256,string,address)","04150694":"airdropBSupply()","04153ac9":"inflateActiveSupply(uint256)","04155727":"dcntrpls(uint256,uint256,uint256,uint256,uint256,bool)","04157752":"withdrawRed_(uint256,uint256)","0415bd13":"create(uint256,uint256,int256,address)","04165443":"gatherAllOldBalanceOf(address[])","0416c10c":"_getBytes(address,bytes32)","04186c57":"getPermissionsProvider()","0418945a":"addStablecoin(address)","0418ac09":"unFreezeTransfer()","04194636":"bulkTokenSend(address[],uint256[])","04198675":"setHitPrice(uint256)","0419c814":"isExistedOwner(address)","0419eca5":"createChild(uint256)","041abd9f":"timestampEnd()","041ae880":"funder()","041b1406":"checkPoDs(address[])","041b8c3e":"group(address,uint256)","041c3ade":"punkIndexToAddress()","041d0c0b":"MyTokenLoad(uint256,string,uint8,string,address)","041d15c9":"getPurchaseTimestamp(uint32)","041d40c1":"buyOrders(bytes32)","041dad49":"incrementpostId()","041dd0f9":"ValueToken()","041dd3f6":"testControlCreateWithParentsParentNotInUse()","041e3929":"getInvitationCreatedOn(address,uint256)","041e6b8b":"rejectUpgrades()","041f173f":"blacklist(address[])","041fa8aa":"times9()","041fe13d":"onEtherandomSeed(bytes32,bytes32)","04213a59":"setServiceDuration(uint256)","0421a94c":"sendSpecialTasterPackage(address,uint256)","042228db":"adminUpdateArrayInvite(uint256,uint256,address,address)","0422ddf3":"isGamePaused()","04239743":"lastGrantedIndex()","0424b6fe":"ContentChanged(bytes32,bytes32)","0424d979":"removeDepositCreator(address)","0425b5e9":"initialLockAddress(address)","0425c357":"submitVote(uint256,bytes32,bytes)","0425c4bf":"updateProduct(address,string,string,uint256,string,bool)","0425ccba":"DoubleETH()","0425e6ff":"SEXNTestToken()","04267892":"koth()","04269bc2":"ICO_SUPPLY()","0426c697":"changePayoutAddress(address)","0426dcef":"unlockBalance(address,uint256)","04275375":"MCToken()","0428c6aa":"earlyBirds(uint256)","0428ca27":"WalletAddressUpdated(address)","04293236":"m_owner80()","0429b880":"confirmationPeriod()","0429b9ca":"totalEthAmount()","042abdf8":"PRE_ICO_MIN_CAP()","042ae62b":"killAborted()","042b5fed":"placeBet(bytes32)","042c71f5":"DevsmartCoinFour()","042cb150":"batchSend(uint256,address[])","042d65ab":"getTokenAwarded()","042e58c8":"receiveResults(string,uint256)","042e9a43":"propose(bytes32,string)","042f3b34":"DesafioStone()","04304b55":"getUSDEth()","04306d69":"MOOSToken()","0430e405":"gameStopped()","043106c0":"deleteAddressValue(bytes32)","043122bb":"minimumParticipation()","04318794":"giveTimeToDemoc(bytes32,uint256,bytes32)","0431dd86":"TokenNedCoin(uint256,string,uint8,string)","0432ff56":"START_WEEK_4()","043331ee":"addOnCount()","04336615":"hashLoop(uint256,bytes32)","04338def":"maxAmountPreICO()","04339140":"setCloneFeePercentage(uint256)","04339582":"buyAndTransfer(uint256,address,address,bytes,uint8)","04343722":"addUsers(address)","0434a44d":"codeSize()","0434e5a6":"changeWalletForETH(address)","0434fe0b":"heal()","043531b1":"setFeeDivisor(uint256)","0435a745":"stat()","04362c2d":"getEsgoTXCount()","043753ba":"makeDecision(uint256,bool)","0438ebce":"getPlayerBetForPlayRound(address,uint256)","043996c2":"setUseAmountBasedBonus(bool)","0439f7d4":"getProviderSupply(uint256,uint256,uint256)","043aea8b":"CrypthubtTokenTest()","043b743f":"investor_getShortInfo(address)","043bb5e7":"getIdentities(address[])","043c8816":"INM()","043cf01a":"addCourse(string,uint256,uint256,uint256,string)","043cf343":"CreditIDENTITY(address)","043d0258":"changePriceLimits(uint256,uint256)","043d5f1a":"ENCSToken(uint256,string,uint8,string)","043da739":"getNextBid()","043eabd0":"RUVI()","0440187e":"hostingProfitAddress()","04403b30":"TokenSaleSucceed()","0440c8e4":"_unpackRarityValue(uint256)","044166ec":"PollManagedFund(address,address,address,address,address,address,address,address,address[])","044215c6":"token(uint256)","044337ca":"setPortfolio(address)","04433bbc":"getContractAddress(string)","044431f0":"setRefundEnabled(bool)","0444c5db":"SSPRegistryReplaced(address,address)","0445154c":"PRIVATESALE_USD_PER_MSENC()","044553ae":"configureBoard(address)","04455e95":"testIsList(bytes)","04461f4d":"XaurumAmountMelted()","0446e187":"buyDonation(address,uint8)","04474181":"JixoCoin(uint256,string,uint8,string)","0448e936":"setSite(string)","0448f79f":"addOptionChain(uint256,string,uint256,uint256,bytes,address,int256[])","0449aa40":"allowedToBeSold()","044a3038":"_changeResolverAllowances(string,address[],uint256[])","044a5f97":"mgmtDistribute()","044aed7c":"removeEmployee(address,uint256)","044b1b02":"addProblem(string,string,string,string,string)","044bf6c2":"getSpinnerData(address,uint256)","044c1d4d":"clientVersion()","044c9366":"privateCrowdsale(address,uint256)","044c96e4":"startGame(string,string)","044ce308":"refundBuyer(uint256,uint256)","044d0b06":"oraclize_query(string,string[2])","044ec699":"get_mail(uint256)","044f19bd":"InfiniteCorridor()","044f53ee":"OPC(string,string,address)","044f9ac8":"findThroneCalled(bytes)","04509918":"scheduleCall(address)","04514185":"ShortBlog(string)","04517225":"transferlock()","04520116":"centsPerEther()","045236b4":"getChainyData(string)","0452396c":"subtrInvestorBalance(address,uint256)","04532035":"settleEth(address,uint32,uint32)","0453a7d2":"computeBonus()","0453e3b1":"ITIX()","04549d6f":"presaleStarted()","04550e70":"MyTestToken2()","04554443":"lockDuration()","045585a4":"priceList(uint256)","0456860a":"acceptAtCommunity(address,uint256)","04571211":"setTokenReward(address,address,uint256)","04578f90":"JTC(uint256,string,string)","0457d76b":"Mesa(bytes32[],uint256,address)","045820b3":"Player()","045894ab":"getCreate()","0458996a":"CBTSToken()","04590a28":"EtherWithdrawn(uint256)","04599012":"balanceToken(address)","045a1796":"upgraderSet()","045aceb9":"useResolver(string)","045b1a0c":"isBreakingInvestorCap(address,uint256)","045b7dca":"mintSupply()","045b9c72":"START_TIME_PRESALE()","045c123a":"sponsorDAI(uint256,uint256)","045c6ce0":"voteForProposal(uint256)","045cc8ec":"_createZodiacWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256,uint256)","045ccf7b":"byte64ToString(bytes1[64])","045d0389":"exchange(address,uint256)","045d2ad9":"upgrades()","045d4503":"TeamDeleted(uint256,uint256[])","045d465f":"setDataFactory(address)","045d46c2":"getBalances(address,address)","045e240f":"getAvailableTokensToWithdraw()","045e7dd7":"ContractEdited(string,address)","045ea88a":"fishySalmonToken()","045eb3b5":"expLimited(int128,int256,int256)","045ec563":"rndInc_()","045eea7d":"changeSelfName(string)","045f2593":"getRoot2(uint256)","045f7850":"airDrop(address,uint256)","045f8aad":"CONUNToken(uint256,string,uint8,string)","045f91ea":"getCurrentWallet()","045f955b":"buyPets(uint256,uint256)","045ff49a":"TIER2END()","0460b206":"Bxcoin()","046111e9":"addVip(bytes32,string)","04612d20":"minionAdd(address)","0461ac58":"dteamVaultAddr3()","04638e1a":"getBalanceOf(address,address,address)","0463cd73":"getSuperManager()","0463e4af":"releaseDividendsRights_(address,uint256)","0464f4b2":"InitialPriceEnable()","0464f8d0":"getCatsCount()","04651a1e":"firstRoundICOEnd()","0465832e":"modifyTransFee(uint256)","04658ad8":"NonIssueDeposits()","04659819":"capUsd()","0465a76d":"airdrop_cnt()","0466450e":"getUserByAddress(address,address)","046672cc":"batchTransfer(bytes32[],uint64)","0466c7ab":"executeComputation()","04670c9d":"nextStage(uint256,uint256)","04673368":"getCurrentPrice(uint256,uint256)","04676af4":"getCompte_7()","0467c3ff":"ThirdBonus()","04684ba3":"convertTokens(address,address,uint256,uint256)","0469756a":"MintAuthority(int256,address)","04699a72":"tipbot()","0469d644":"storeSecretVote(bytes32,uint256)","046ae3c2":"YourPyramid()","046c472f":"IOU()","046c82e4":"GraceFund()","046ce030":"isFactoryApproved(address)","046d30c7":"_random(uint256)","046d5c53":"setMintAmountApproval(address,address,uint256)","046dc166":"setSignerAddress(address)","046e85f9":"getLastPendingTransaction()","046f7da2":"resume()","04706fdf":"giveContributionsBackProfitBugged()","047087cc":"getTotalTokenSupply()","04719030":"manualSendTokens(address,uint256)","04729a8d":"tokensToEthereumAtSupply_(uint256,uint256)","0472a3bf":"doCrowdsaleMinting(address,uint256,uint256)","0472f549":"ran()","0472f72c":"_allocation(address,uint256)","0473e09c":"setConfigUint(bytes,uint256)","047408aa":"getAngelByIndex(address,uint256)","0474b484":"AllyICO()","0474d4a4":"isInitialAllocated()","04751333":"getRevForecast()","047564b7":"revokeValidator(address)","0477d647":"setSalary(uint256,uint256,uint256,uint256)","04780570":"ERC223Token_STB()","04787d83":"winBidDekla(address,address,uint256,uint256)","047956cf":"assign(address,uint256,bool)","0479fcd0":"setPopNameOriginal(uint256,string)","047a7ef1":"transferrable()","047a8dcb":"JetwingToken(address)","047ba641":"LowerStartingPrice(uint256)","047c738e":"wdivfloor(uint128,uint128)","047cfed9":"hasOwnership(uint256)","047d6649":"getUpdateByID(uint256)","047da93f":"testInvariantOverflow()","047de1f3":"drawerFee()","047e2b27":"setDataStorage(address)","047f9651":"make(uint256,uint256[4])","047f993d":"_vote(bytes32,uint8)","047fc9aa":"supply()","047fe8b3":"getUnsoldTokensBack()","047febbe":"admin_renewLockedAddress(address,address,uint256)","04803c2a":"addSales(uint16,uint128,uint16,uint16,uint64,uint64,uint16,uint8)","04804ee8":"sell(string,uint256,uint256)","0480c975":"setUnicornContract(address)","0480e58b":"maximumSupply()","04812aaf":"moveAccountData(address[],bytes32[],uint256[])","0481559b":"getLockDataFromMerkleTree(bytes,uint256)","04819507":"ICO_START4()","0481cb1b":"tokensAlreadyClaimed(bytes32,address)","048259e6":"UTCToken()","04830ddd":"getVotersAt(uint256,uint256,uint256)","0483a7f6":"lockedBalances(address)","0484c7cf":"AppSupply(address,uint256)","0485066e":"addReading(uint8,uint256,uint256)","04858fef":"StartQuiz(string,string)","048641be":"updateUserInvestBalance()","0486529b":"boardMemberApply(uint256)","04865327":"PlayerBet(address,uint256,uint256)","04869083":"auctionCreated(uint256,address,uint128,uint128,uint64)","0487b7e9":"Unity3d()","0487eed2":"restrictionsAllow(uint64,uint8)","0488781a":"teamOwnerOfPlayer(uint256)","0488dbfb":"getConfirmRefund(address,address,uint256)","048911a6":"createRandomZombie_ZOB_smallpack()","048926ac":"updateMaxPhase1(uint256)","04892c9f":"BASE_MIN_CONTRIBUTION()","048957d8":"sideBetPayToken(bytes32)","048986ae":"activityCore()","0489882e":"totalAdminsMapping()","0489fa70":"removePermittedContracts(address[])","048a5fed":"getSelfBalance()","048ae1bb":"addAssetPartOwner(bytes32,address)","048b0bcc":"addCustomerNReqACC(address,address,address)","048b3918":"messageNumber()","048bbc72":"CIR_SUPPLY()","048c35ca":"debug_is_recipient()","048ca698":"trackTotalVolume(address,uint256,uint256)","048cb8e0":"CarlosMatos()","048cc4a2":"BurnToken(address,address,uint256)","048cf8ed":"serviceDecreaseBalance(address,uint256)","048de56d":"setName(bytes2)","048dec38":"changeMarketingAddress(address)","048e2e94":"getAccountSize(address,uint256)","048e8c3a":"FidgetSpinner(uint256,uint256)","048e927b":"Checked(string,bool,uint256,bool,uint256)","048eb854":"_sortTopQuestions()","048f06f2":"setRoot(uint256,bytes32)","04903592":"withdrawAirdropTokens()","04904105":"setMiniPoolEdit_9(string)","0490540b":"Parameterizer(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","0490c71c":"unclaimedDividends(address)","0491eda0":"isCertainProduct(uint256,address,uint256,uint256,uint256,bool)","0492600e":"Issue(address,address,uint256,string)","04937cf9":"DoremiXToken()","0494630f":"oraclize_query(uint256,string,string[4],uint256)","04950f45":"KWHForGas()","049540c5":"structurePreIco(uint256)","0495cad9":"motionPasses(uint256)","0496e9ae":"triggerRequireError()","0496ee77":"checkPosition(address,uint256)","049766a8":"CleariumToken()","049878f3":"join(uint256)","04990162":"newChain(address[])","04994883":"ustAddress()","049948b0":"getMyGrapes()","0499ed13":"TOKEN_PRICE_WEI()","049a2dd1":"claimPartnerTokens()","049abf89":"queryUserContractCount(address)","049ae734":"scheduleCall(address,bytes4,uint256,uint256,uint8)","049b7852":"getElevations()","049c9bf2":"addExchangeAccount(address)","049cac16":"tokensUnvested()","049cc8b1":"soldForSecond()","049e63ee":"defaultClaimPercentage()","049eb289":"submitBuyOrder(bytes32,uint256,uint256)","049efcc7":"startReleasing()","049fb520":"countTickets()","04a077a4":"MyPasswordHint()","04a0c67e":"EagorNetwork()","04a1c63c":"token_a_amount()","04a1eb6b":"lastBlock_f16Hash_uint256()","04a23be0":"isAddressInWhiteList(string,address)","04a2b2c2":"testOwnerCanBreach()","04a2eaa5":"getTimeBonusPercent(uint256)","04a3693c":"applyFee(address,uint256,uint256)","04a373cc":"s20(bytes1)","04a3c21f":"maybeNewRound()","04a3ddd2":"_addToValueHeld(address,uint256)","04a48c27":"setActivityCoreAddress(address,address)","04a4a0d4":"getPriceMoney()","04a4a0ec":"TOTAL_XB_TOKEN_FOR_PRE_SALE()","04a4b776":"updateOpeningTime(uint256)","04a5288a":"stepcode()","04a6021d":"getByTypeNameVersion(string,string,string)","04a7137e":"controlledMint(address,uint256)","04a782ee":"addRecordByAdmin(bytes32,address,address,string,string)","04a79e9a":"spendDeposit(address,address,uint256)","04a7ca0e":"BonusUpdated(uint256)","04a7ff18":"totalNum()","04a82adf":"privateReservedUFT()","04a84938":"avaliableSupply()","04ac3b80":"addReceivedTrade(address,bytes32)","04ac75b0":"withdrawMulti(uint256,address[])","04aca4bc":"getClout(address)","04af7a20":"setDividendAndPayOut(uint32,uint32,uint32)","04afd2ce":"Multisended(uint256,address)","04b02ed6":"times_()","04b07a5e":"removeUpdater(address)","04b1142c":"getGuessCount(address)","04b1af75":"buy20()","04b1c6f0":"ICO_CAP()","04b2bf99":"stateControl()","04b370ab":"icoOver4()","04b43c5a":"withdrawZOB(uint256)","04b47e21":"isSignedWithEnc(uint16)","04b4e7e5":"awardsReservations()","04b5723d":"disableNewStakes()","04b5b5b6":"pointToToken(uint256,address,uint256)","04b64260":"tmpShuffleSeed(uint256,uint256)","04b65e74":"checkSTAGE()","04b69fa0":"jockeyNotForSale(uint256)","04b6ae61":"failedVotingCount()","04b6d39e":"_transferCroupier(address)","04b70576":"resetAgent(address)","04b7dcde":"hashData(string)","04b8ca98":"MAYTotalSupply()","04b92b7d":"overdraftAllocation()","04b94ec5":"MyToken30(uint256,string,string)","04bb1e3d":"updateActive(uint256,bool)","04bb754c":"TradeFinancing()","04bb89d5":"saveNick(string)","04bbc255":"isPricingStrategy()","04bd05d5":"getPeriodicalPnL()","04bd85f0":"getCapTab(uint256)","04be2f50":"isInvalid()","04bf1ee2":"JtoA(uint256[3])","04bf2a7f":"getScriptExecutor(bytes)","04c07569":"getBlock(uint256)","04c08fbd":"borrowFunds(uint256)","04c181f5":"beneficiars(address)","04c2a0ae":"DonateToLosers()","04c2a4a0":"computeKeyConstant(uint256)","04c313f4":"setAirdropGameInterface(address)","04c49f2c":"setFeePeriodDuration(uint256)","04c64e25":"revealMyVote(address,bytes32,bytes32,uint256,uint256)","04c6a9c5":"startIcoForOptionsHolders()","04c6ff7c":"devTeamTokenAddress()","04c76899":"sellerApprove(uint256,bytes)","04c76af0":"withdrawAdmin()","04c80c3c":"TOKEN_HODL_6M()","04c8384d":"trivialThreshold()","04c97ada":"setThirdRoundPricing(uint256)","04c98a2a":"validatePurchase()","04c98b2b":"startPresale()","04ca2775":"saleActive(uint256)","04caa6dd":"pauseReason()","04cb17ad":"returnPeriodExpired()","04cbc791":"getSellerOption()","04cc734b":"VoxelTransferred(address,uint8,uint8,uint8)","04ccf60e":"WrapperLockEth(string,string,uint256,address)","04cd1819":"disableVoting()","04cd5294":"getRefundAmount(uint256)","04ce1a61":"tokensWithdrawal(address,uint256)","04cf447d":"estimatesellvalue(uint256)","04d092c7":"claimPoints()","04d0a647":"getWallet(address)","04d0ac48":"tokensPending()","04d0c98a":"distribute10MTI(address[])","04d0fefe":"HoneyPot()","04d10f1c":"isValidChainyJson(string)","04d16482":"strConcat4(string,string,string,string)","04d1809c":"validateJoinSplit()","04d1b108":"_computeOwnerCut(uint128)","04d2cdbf":"setAcceptable(address)","04d2dec6":"getWalletAddress()","04d332a2":"setRefereeRewards(uint256[])","04d41474":"totalNormalContributorIdsAllocated()","04d58b3f":"MrwToken()","04d5c2c5":"toEGR(uint256)","04d6878f":"closeMicroWallet(uint256)","04d69a11":"SoldToken(address,uint256,bytes32)","04d6db05":"startSale(address,uint256,uint256,uint256,uint256)","04d742dc":"startSale(uint256,uint256,uint256)","04d84108":"SWAP()","04d88bce":"DDJETH()","04d91c6a":"testFail()","04dbd2d3":"LogInvestorProfit(address,uint256)","04dcad85":"testDifferentTokenPrice()","04dcc44a":"getTip(address,bytes32)","04dd2dea":"getCardDivShare(uint256)","04dd69fa":"getGenerationIdForCall(address)","04de40ea":"AnnoToken()","04de76cf":"VisualChain()","04deaeb5":"retrieveEth(uint256,address)","04dee65f":"contractBatchTransfer(address[],uint256[])","04def102":"getRemainReleaseTimeOfStage(address,uint256)","04df0a1d":"kudosByMember()","04df48ef":"ICO_LEVEL_4()","04dfe14e":"LandmarkCoinTestF()","04e15de5":"issues(uint256)","04e1805a":"setFreezeForAngel(uint256,address,uint256)","04e1826c":"getNumTransactions(address,address,uint256)","04e262b8":"wlStartBlock()","04e5a069":"registerUBetCheck(address,string,string,string,string,string,uint256,string,string,int256,uint256)","04e639b6":"fetchSlot(uint256,uint256)","04e6a9a1":"teamLock(address,uint256)","04e6adf8":"serHoldTime(address,address,uint256)","04e75fda":"Contribution(uint256,address)","04e78a30":"stakingMintAmount()","04e7dfcf":"getAssetRaised(address)","04e80e90":"getMasterCopy()","04e86e15":"calctime(uint256)","04e88f2d":"SayaToken(uint256)","04e98568":"withdrawBalanceCut(uint256)","04ea23bf":"FLUXBlockToken()","04ea4a57":"getDisputedPayoutDistributionHash()","04eab1e1":"gvpe_per_Keos()","04eb7d83":"setFirstPeriodEndDate(uint256)","04ebb1d9":"commonWithdraw(address,address,uint256,uint256)","04ebfc52":"userCount_()","04ec70a7":"determineAttackingOrDefendingOutcomeForAttributes(uint256,uint256,uint256,uint256,uint256)","04ecdaac":"rateSecondRound()","04ed02f6":"getCards(uint256)","04ed3f6a":"canStartSale2()","04ed6fbc":"minCDTToParticipate()","04edad4d":"YouLose(address,uint256)","04ee54d2":"revokeInitiator(address)","04ee9748":"storeWinnerShare()","04ef1353":"setTokenWithoutFee(address,bool)","04ef161b":"findSeed(address)","04efa227":"feeMakeExporter()","04f016c9":"transferMulti(address[],uint256)","04f03b6a":"getSomeVar()","04f041b5":"BtcEthRateChange(uint256)","04f05f91":"joltToken()","04f08b55":"getPolicy(uint8)","04f08eec":"PayEth(address,uint256)","04f0aa4e":"setServiceAgent(address)","04f13e40":"HashLand()","04f14090":"setBlacklist(address,bool,string)","04f17b11":"PriceChanged(uint256,address)","04f182f4":"icoPhase1End()","04f1e4e2":"tradeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,bool)","04f24897":"PlanetagroExchange(address)","04f30b37":"getFutureTransIdxByAddress(address)","04f31a47":"confirmICOSpec()","04f342f6":"_addToAging(address,address,uint256,uint256)","04f3bcec":"resolver()","04f49a3a":"addressStorage(bytes32)","04f4d425":"toEthFunction()","04f4f7ab":"KYRO()","04f5222c":"setEthMinContribution(uint256)","04f53231":"SendEth()","04f65288":"AK47Coin()","04f65590":"preSaleWeiRaised()","04f68d49":"dataSourceGetFinals()","04f6aa30":"forwardETHtoSTCcontract(uint256)","04f74b59":"make(address[],uint256[],address,bool)","04f7a69d":"baseSummonPrice()","04f7e87c":"issueBounty(address,uint256)","04f80977":"setBattleContract(address,address)","04f88d71":"testFailHardLimit()","04f8aa9b":"IoTeXNetwork(uint256)","04f92405":"icoTokensLeft()","04f9d030":"test_interface_call()","04fad28d":"instanceId()","04fb82cc":"_deliverTokens(address,uint256,uint256,uint256,address)","04fb9e81":"closeRequested()","04fc11d5":"getActual()","04fc7c6d":"updateJoinedCrowdsalesMultiple(address[])","04fcadf1":"totalZTHWagered()","04fd295c":"WOLF2()","04fd9f78":"variationsOfOwner(address)","04fda0d8":"_trade(address,uint256,address,uint256,address,uint256,bytes32)","04fe947c":"mapToNewRange(uint256,uint256,uint256)","04ffb5b9":"registerToken(address,string,string,uint256)","05009f0a":"_createBid(address,uint256,address,bytes32,bytes32,uint256,uint256)","0500de3e":"interestResolution(uint8,uint8,uint8,bool)","0500fe3e":"getRegionCurrentPixelPrice(uint256)","05010105":"stakeRequired()","05015e79":"coldAdmin()","05018d91":"objectPants()","0501b79f":"getBlocktime()","0501d556":"setEmergency(bool)","05021ce9":"_trade(address,uint256,address,uint256,address,uint256)","050225ea":"giveaway(address,uint256)","05026317":"bitcoinSaleRate()","0502ca6b":"addTime(uint256)","050394ec":"minGasPriceForDrawing()","0503a3bb":"transferCharity(address)","050414bb":"addWhitelist(address[],uint256[])","0505140c":"totalSupplyWithDecimals()","05062247":"blocknumber()","050642f2":"exchangeTokenRate()","0506689a":"omegaPerEther()","050895ff":"backEndOperator()","0508ed90":"contribute(uint256,address,address,uint256)","050906ea":"_computeDamage(uint256,uint256,uint8)","050a2eb4":"diceRollAddress()","050a3250":"ArithLib()","050b8c66":"drainStrayTokens(address,uint256)","050c09ee":"founderWithdraw(uint256)","050c0fd6":"AmmbrToken()","050c8803":"getAmountFida(uint256)","050c931d":"paymentNumber()","050d6a15":"setSellPrice()","050df9f7":"PoolJoined(uint8,address,uint256,uint256)","050e25a0":"getHash(address,uint256,address,uint256,uint256,uint256)","050eb8c0":"BuyableCourt(address[],uint256[])","050f2f3e":"updateBools(bytes32[],bool[])","051064c6":"lighthouseFee()","051097ef":"addProposal(uint256,string)","0510e186":"getSncTokenAddress()","05111c1e":"getItemHolder(uint256)","05117619":"endVesting(address,address,address,address)","05117e0d":"validateTokenPurchase(address,int256[],int256[])","0511a431":"addOns(uint16)","05120ba6":"getTokensReleased()","05128716":"sale(string)","0513fc8b":"onBurn(uint256)","0514be3b":"ownedTemplates()","0514c275":"REALPlaceHolder(address,address,address)","05160860":"initialDayWithdrawCount(uint256)","0516af06":"getMonsterId(uint256)","0516c9f0":"frozenToken(address,uint256)","0517431e":"_teamSupply()","05175786":"announceWinnerManually(uint256)","051847d5":"childTokenByIndex(address,uint256,uint256)","0518afdc":"tokenToReward(uint256)","0519b873":"heroLottery()","0519bb83":"getVoteStatus(uint256)","0519ce79":"cfoAddress()","051a2664":"nameOf(uint256)","051a65dd":"deal_cancel_rate()","051a86cc":"mintApprove(uint256,int256)","051b044f":"_sell(uint256,address)","051b4e6c":"getSurveyInfo(bytes32)","051ba270":"getLogCancelArguments()","051c4ab6":"AddPlayer(uint8,address)","051cb630":"mintRandomCards(address,uint8,uint8)","051d9955":"confirmCustodianChangeProxy(bytes32)","051e5c45":"fiatPerEth()","051f4f6f":"transferAll()","05204231":"setPermission(address,address,uint8)","0520ed4a":"LYT(uint256,string,string)","05215b2f":"createStandardToken(uint256)","0522345a":"blackListFreezeTime()","052369a6":"submitLocation(uint256,uint8)","052534e7":"VerificationEvent(address,address,uint32)","0525ca77":"packParams(address,uint16,uint32)","0526179e":"getSoilTempControlLimits(bytes32)","05261aea":"finalize(uint256)","0527da64":"_openGamePlayNos(uint256[])","0528bb57":"isSubscriptionProduct(uint256)","05297781":"MintToken(uint256)","05298d37":"setWhiteListERC20(address)","0529be17":"circulateTokensForSale(uint256)","0529de04":"getCertificateExpires()","052a076f":"disablePresale(bool)","052a6849":"tokenStartPrice()","052a829c":"notSoldTokens()","052ab49c":"bytesToUint1(bytes)","052b2aa7":"getRegistrants()","052b81c7":"releaseBadges()","052ca699":"end_()","052d5707":"JYToken()","052d9e7e":"setWhitelistEnabled(bool)","052deec5":"investorsIter(uint256)","052f1a7a":"BGXToken()","052f7d11":"freezeAccountSend(address,bool)","053011b7":"authenticate(uint256,uint256,uint256)","0530abf0":"SwingTradeToken()","0533073c":"publishingOwner()","0533f57b":"RAISED_AMOUNT()","0534ab04":"setCapsMerkleRoot(bytes32)","0535020d":"payTokens(uint256)","05354bed":"etherPricesAreClose(uint256,uint256)","0535ec77":"initialDistributionDone()","05365bb0":"presale1()","0537665d":"setOutcome()","053902f6":"DTCC_ILOW_4()","0539272a":"startDay()","05398302":"destroyFrom(address)","05398d45":"setNewMiner(address)","0539c6d6":"num_squares()","0539eba9":"setAllowBuying(bool)","053abd3c":"createShareToken(uint8)","053ae2ca":"getHairColorValue(uint256)","053b8d2f":"deleteBackgroundImage(uint256)","053c351b":"oraclize_getPrice(string)","053c5d59":"e_Purchase(address,uint256)","053db3a9":"testSetPresaleTokens()","053e3169":"openSaleStartTime()","053e3253":"window3EndTime()","053e71a6":"getTotalNumberOfTokensForWinningOption(uint256)","053f14da":"lastPrice()","053f598a":"policyActiveNum()","053f7492":"minimumPriceInDailyAuction()","05401284":"debundle(uint256,address,address)","0541b0f8":"acceptPayment(bytes8)","0542b61b":"snt_claimed()","05433a26":"GetNumbersFromHash(bytes)","054348d6":"icoIsOver()","0544587f":"getCRYPTON_CUT()","054550f3":"assertEq8(bytes8,bytes8,bytes32)","05459f42":"WeeklyLotteryB(address)","0545a03b":"getGroupManagement(uint256)","0545f8ba":"changeExchangeAdmin(address)","05468c26":"addToBond(address,uint256)","0546a746":"restrictedTokensOf(address)","054726cb":"MNTOKEN()","0547bf4d":"DEFROST_MONTHLY_PERCENT_OWNER()","054909aa":"_addNewOwnerHoldingsToToken(address,uint256,uint256)","0549f150":"getAdministrator(address)","054a8c02":"getGirl(uint256)","054a9f11":"shopGloves()","054ba658":"delete_key(uint256,uint256)","054baaf2":"jan()","054be0b7":"setIssuanceRatio(uint256)","054c3c71":"getBetsOnTimestamp(uint256)","054d2a7e":"ChuCunLingAIGO(uint256,string,uint8,string)","054dcbb5":"AdvisorsTokensHolder(address,address,address)","054ded2b":"registrazione_candidato(string)","054e9507":"lastEventId()","054f268e":"getDCategoriesN(bytes32)","054f381b":"entrepreneur()","054f7d9c":"frozen()","054fce82":"ZipperWithdrawalRight(address)","05502a62":"BONUS_PRESALE()","0550f92f":"setMintAddress(int256,address)","05514a3e":"winBonusArray(uint256)","05529d94":"addMultipleParticipants(address[])","0552ce3e":"MonthToken()","05533ce1":"setSettings(address,uint256)","0553b805":"transferStorage(address)","0553e156":"finalize(address,uint256)","0553fd5b":"incSupply(uint256)","05540534":"setMultisigAddress(address)","0554bb48":"depositToLock(bytes32)","0556369e":"tokenToReserve()","055680f0":"purchaseCounter()","0556a66f":"deliverPresale(address,uint256)","0556fcd0":"setIcoFinish(uint256)","0557b2b0":"getApprovedTransfer(uint256)","0557df99":"FundingRulesSet(address,uint256,uint256,uint256,uint256)","0558171d":"maxCharId()","05597d88":"setOwnerCut(uint8)","0559c114":"removeSellOrder(uint256)","055a7341":"USEAddr()","055ad42e":"currentPhase()","055bb725":"_approveForSale(address,address,uint256)","055c7c96":"sliceBytes32Arr(bytes32[],bytes32,uint256,uint256)","055cbb3d":"CalculatePayout(bytes32,uint256,uint256,uint8)","055cdee1":"UpdateBetOnTeams(string,address,uint256)","055cff88":"AlarmxToken()","055e0e07":"Bela()","055e6d8b":"playGameCheckBid(uint256)","055ee253":"claim_reward()","0560ff44":"tokenMetadata(uint256,string)","056129a6":"TravelShare()","0561d562":"GoldiamToken()","0561eff6":"addStoneToBoard(uint256,uint8,uint8)","0561fc18":"ICOResumed(uint256,uint256,uint256,uint256)","056265d1":"storeData(bytes32[],bytes32[],bytes32[],bytes32[])","05626694":"LABEEToken(uint256,string,string)","05626f09":"timeFundingStart(uint256)","0562b9f7":"withdrawAmount(uint256)","0563324c":"executeOrder(bytes32,uint256,address)","0563451a":"icoEnd()","056362e8":"Crowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address)","0563bbf6":"USDEtherPrice()","0563d55e":"MomaSpace()","0564a9a7":"getPollResults()","0564df4a":"_addBattleSequence(uint8,uint8,uint256)","0565ac43":"get_bonus(uint256)","0565c3f4":"pushAngelInvestmentData(address,address,uint256)","05664cea":"getRevisionTimestamp(bytes32,uint256)","0566bc12":"getDebrisPrice(bytes32,uint8)","0566c02a":"discountedSaleDuration()","0566c979":"iCashToken()","05674427":"numToString(uint256)","0567e83e":"kill(address,address)","05681031":"_sendBack()","056841b0":"InsertManifesto(string,string)","056a6421":"activateInvoiced(address)","056ab62a":"TestPool(address[3])","056b01ce":"mint(string,uint256)","056b2300":"TxUserWallet()","056b8197":"tokensInVault()","056ba056":"trade(address)","056bef9e":"addRequester(address,string)","056cf6bf":"Witness()","056e1059":"oraclize_query(uint256,string,string,uint256)","056e25e3":"returnIcoInvestments(uint256)","056e4d88":"TotalInvested()","056e81a6":"TokenBooksAirdrop()","056ed205":"EstateTransactions(string,string,string,address,int256)","057101b1":"Token(uint256,string,string,string,uint8)","0571d85f":"Forwarded(address,address,uint256)","05733989":"setAttribute(address,string,bytes,uint256)","057466ea":"buyToken(uint256,uint256)","05748be2":"dropAmount()","05763ff7":"pauseProposer()","0576cb6f":"verifyTargetWallet()","05777d9b":"ReturnToken(uint256)","0577f15c":"exchangesStatus()","0577f62f":"PRE_MAX_CAP()","05785e4c":"minimumBuy()","05788701":"Ribble()","0578e3e5":"isAtMost(uint256,uint256)","0578f356":"addManagedInvestmentProposal(uint32,bytes24,uint256,uint152)","0579d25d":"price(uint256[],uint256[])","057af1c4":"exist(string)","057b0416":"getAccDetails(address,address)","057b17c0":"timeMode()","057b7105":"calculateTokenAmountICO(uint256)","057bd53f":"sameVar()","057bfcc7":"amount2()","057c3cf5":"get_flag()","057d2c17":"Jack()","057dd42d":"purchaseCompanyCard(uint256)","058026d0":"checkTransferToICAPWithReference(bytes32,uint256,string)","058029a2":"icoCoinCap()","0580d5c7":"massBurnTokens(address[],uint256[])","0581345e":"issueClaimOwnership(address)","058206d9":"ICBCCoin()","05831c62":"donateFor(address)","05839b29":"sortTopTen()","0583ae52":"IRCToken()","05860b6f":"getBidIndex(address,bytes32)","058618f8":"setAuthorizeMintToken(uint256,int256)","05862435":"testFloatKeyValue()","05862611":"CrowdsaleLimit(uint256,uint256)","0587c1ba":"requestTokensFromOtherContract(address,address,address,uint256)","05888fcd":"tradeBalances(address,uint256,address,uint256,address,uint256)","058a628f":"setAuthorizer(address)","058aace1":"divest()","058ab8c9":"EthVerifyCore()","058af982":"nameIsAdvocate(address,address)","058b316c":"MANAGEMENT_KEY()","058c5103":"safeKill()","058d4dd0":"setAssetCooldown(uint256,uint256,uint64)","058d7433":"setAlliesContract(address)","058fa067":"setGasRefundForClaimLootWithConsolationPrize(uint256)","058fcde9":"testFailTransferFrom()","058fe7d9":"setMiningRate(address,uint256)","05910b91":"canBreed(uint40)","05915147":"authType()","05917369":"populateFromOldContract(uint256[])","05917e8d":"updateWhitelistAddresses(address[],uint8)","0591eb24":"promoCreated()","059275ab":"howManyTokensForEther(uint256)","0593d244":"setSaleContract(address)","05940728":"setGGCFee(uint8)","059417da":"_getAllParentIds(bytes32)","05943a15":"TEAM_SHARE()","0595ba4c":"getRoundMinAmountByBet(uint256)","0596334f":"rewardOne()","0596bd84":"_ChallengeFailed(uint256)","05976587":"test_expiry_increaseTimeBy30000()","05978450":"tokensReleasedAdvisorsTeam()","0597f3aa":"setGasRefundForClaimConsolationPrizeLoot(uint256)","05989e9d":"getAward(uint256)","05991e56":"Freewatch(uint256,string,uint8,string)","0599c284":"setAddress(string)","059a500c":"makeDeposit(uint256)","059a7d93":"cardEmojified(uint8)","059b8140":"upgradeAllowance(address,address,uint256)","059b8c77":"computeGainsRate(address)","059c00be":"STL(uint256,string,string)","059c5c4f":"policyFeeCollector()","059caad3":"creatorSupply()","059ce95d":"getVerifier(address)","059d45da":"removeAllPVPContenders()","059d92dc":"FeefersToken()","059eb515":"crowdsaleSold()","059efd9e":"_getShipColor(uint256)","059f8b16":"MULTIPLIER()","05a0c707":"setMintAgent(address,int256)","05a10028":"burn(uint256,uint256,uint256)","05a10e6d":"withdrawStakeTokens(uint256,address)","05a17fc6":"getAccountFeed(address,uint256,uint256,uint256)","05a308fa":"setReferralSignupTokens(uint256)","05a30a7a":"lastDepositDate()","05a3823b":"colorplat()","05a3e81a":"ratePerWeiSecondPhase()","05a44292":"Train(uint64,uint64,uint64)","05a506b0":"seEnableTransfer(bool)","05a5b8c6":"verifyTx(bytes,int256,int256[],int256,bytes,int256,int256[],int256)","05a5f830":"signedApproveAndCallHash(address,address,uint256,bytes,uint256,uint256)","05a873dc":"setMetadataSize(uint256)","05a8bf98":"SEXYKITTEN(uint256,string,string)","05a955af":"holderList(address)","05a95f04":"triggerPayout()","05a9cec2":"BetOnMe()","05a9f274":"totalLockedAmount()","05aaee1f":"unlockTimeStamp()","05ab421d":"sendTokens(address,uint256)","05ac7908":"TakeBackToken(uint256)","05ace573":"commitPhaseMinSeconds()","05ae6bcc":"userPublicFundingEthCountMap(address)","05aeb1e1":"RDMGameToken()","05aebead":"plantationSize()","05aecc80":"IAmVeryPoorToken()","05af0194":"getUserQuickPromoBonus(address)","05af2a81":"AddrDevelopFunds()","05af636b":"PunkTransfer(address,address,uint256)","05afff5b":"isHandleValid(bytes32)","05b0876d":"mgrAddress(uint256)","05b09e07":"getGameNumber(address,uint256)","05b1137b":"transferEther(address,uint256)","05b2b03a":"CertificationCentre(address)","05b34410":"creationDate()","05b35924":"totalLuxCents()","05b3dcb9":"roomFree()","05b4655a":"withdrawlWinnings()","05b496bb":"penalizeSolutionSubmitter(uint256,uint256)","05b4fe5f":"DepositFrozen(address,uint256)","05b542d9":"startPortalGun()","05b5711d":"level_3_amount()","05b575a5":"addWhitelister(address,address)","05b5b0dc":"submitSolution(uint8[])","05b5da23":"setPlayerTokenAddress(address)","05b64993":"setRequestCancellationMinimumTime(uint32)","05b67c8e":"BitGuildCrowdsale(uint256,uint256,address,address,address)","05b6d298":"assertEq0(string,string)","05b6d9e2":"distributeeBitcoinCashLarge(address[])","05b74d87":"inPrivatePreSalePeriod()","05b765ea":"getCertifierStatus(address)","05b8b29e":"profitOwner()","05b95822":"enableFundingWallets(address)","05b961e6":"PayWinner(address)","05b9cb3c":"totalDelegations()","05ba2ded":"voteForCashBackInPercentOfWeight(uint256)","05bbf5db":"startDocumentPoll(uint8,bytes32)","05bc99f8":"eth_sent(address)","05bccd09":"EGGCOIN()","05bdd57b":"AVMTestSuite()","05be478b":"calulateXticket(uint256,uint256,uint256)","05bf3bf0":"FtechizTestToken()","05bf4ecc":"batchPopularitySetting(uint256[],uint8[])","05bf779f":"setFoundation(address,address)","05bf9ece":"ICOSuspended()","05c06367":"RequestDetachment(uint256)","05c06db9":"majorPartnerAddress()","05c080be":"getTotalF6()","05c091f6":"_setCEO(address)","05c0dd91":"DEPOSIT_WINDOW()","05c0e497":"CDcurrency()","05c1f502":"post()","05c1f5ff":"getWhiteListStatus(address,address)","05c24481":"reserveSlash(bytes32)","05c270e2":"getPreviousBlockNumber(uint256,uint256)","05c31491":"test_oneTrueAssertNoMessage()","05c35eb6":"MICE(uint256,string,string)","05c3cb8d":"changegp(address)","05c4af9d":"getProto(uint16)","05c4b3dc":"Snydertoken()","05c54cd6":"MUNIRAHAMID()","05c7603d":"updateGenGuVault(uint256)","05c78929":"thirdWeekTokenPrice()","05c7cd4b":"confirmAndForwardWithRevert(address,uint256,bytes,bytes32,uint256,uint8,bytes32,bytes32)","05c7f589":"BACS()","05c85c42":"icoTimeStart()","05c8a4e2":"FeuzingToken()","05ca11cf":"TIM5(uint256,string,uint8,string)","05ca3557":"makeAdoptionOffer(bytes5,uint256)","05ca3841":"getOraclizeAddr()","05caca6c":"transferOwnershipServer(address)","05cb177a":"referralPay(uint256)","05cb71d4":"firstLoos()","05cc49dd":"distributeFee(uint256)","05cc72e3":"FilmscoinToken()","05ccfddd":"invalidateCombat(uint256)","05cd4794":"ExEquity()","05ce55fc":"channelDisputeResolver(uint64)","05cf5fcd":"mediationExpiry()","05d0f15b":"tokenPriceWei()","05d1127f":"changeChanceToWinModule(uint256)","05d1afec":"ausGroup()","05d1fc5d":"AIRDROP_MAX()","05d2035b":"mintingFinished()","05d258dd":"getMixingResult(uint256,uint256)","05d26bc6":"feedme(uint256)","05d2f3e2":"ErrorReport(address,uint256,uint256)","05d2f92a":"check_depth(address,uint256)","05d35816":"ConstitutionalDNA()","05d430db":"isNameValid(string)","05d4665f":"CROWDSALE_TOKENS()","05d473da":"assinaPresenca()","05d52eeb":"OMPxContract()","05d53802":"setPreSaleTokens(uint256)","05d55093":"oraclizeRequests(bytes32)","05d56a4e":"GetDChainNumRevokableHashes(bytes32)","05d57a59":"destroy_time()","05d6671c":"m_txs()","05d67464":"getTether(address,uint256)","05d74066":"SendPreReserved5()","05d7649f":"sendPortion(uint256,address)","05d78739":"cratesMigrated(address)","05d85eda":"count(address)","05d861fa":"CommunityAdVoucher()","05d866cd":"MemberChanged(address,address)","05d87fe2":"issueLetterOfCredit(uint256,uint256,uint256)","05d8bb97":"additionalDebt()","05d8c792":"_buyHicsTokens(address,uint256)","05d9a5fb":"sgn2sga(uint256,uint256)","05dabbcd":"lockedHasEnd()","05dad1c0":"test_userSetup()","05dae1f9":"ChargeStation(address,uint256)","05db3b82":"minwei()","05dc2708":"getCardNumber()","05dd071c":"_initialTransfers(address,address[],uint256[])","05dd23f7":"_stringGas(string)","05dd686f":"MIN_TOTAL_AMOUNT_TO_RECEIVE_ETH()","05dd7303":"EthereumStack()","05ddd49f":"Rotharium()","05de4f07":"getContentParent(uint256)","05de6288":"WithdrawalDone(address,uint256,uint256)","05df5e86":"XPAToken()","05df75db":"foobar()","05dfedac":"incrementDate()","05e1bd8c":"calculateInterest(uint256,uint256,uint256)","05e1c942":"reclaimTokens(address[])","05e206f0":"_registerBid(uint32,uint256)","05e24a93":"DISTRIBUTED_STATUS()","05e2b66a":"update_eth_ratio(uint256)","05e2eee0":"getArrayString(bytes32)","05e33b6e":"calculateMask(uint256,uint256)","05e33dd0":"allParticipants(uint256)","05e43263":"AzwieToken(address)","05e437b5":"setAllSteps(uint256,uint256,uint256)","05e4438a":"applyHotFix(address)","05e4545d":"nextActionIsAuthorised()","05e45546":"promoCreatedCount()","05e49d1d":"findWinner(uint256)","05e4a75c":"setupairdrop(address,address)","05e52ea0":"numberOfBasesSold(uint256)","05e53535":"operationTokenCreated()","05e57cb1":"CommitGoodToken()","05e633e2":"bonusEnds3()","05e6b4a4":"_emitHolderAddressRemoved(bytes32,address,uint256)","05e6ee11":"btcInvestment(address,uint256,uint256,string,uint256)","05e7781e":"changeReserveWallet(address)","05e87e2a":"tracetoMultiSigContract()","05e88b69":"production()","05e992ff":"BitcoinDeuce(string,string,uint8,uint256)","05eb1877":"projectBuget(address)","05ecc085":"snapshotAt(uint256)","05ed2cd3":"settleBBDBatch(address[],int256[],uint256)","05ed76c4":"resolveTime()","05ee27a6":"RavneetToken()","05ee72b5":"playerEndGameConflictImpl(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address)","05ee8d89":"investorMinimalBalance()","05eed946":"waracoin_per_ether()","05ef6848":"getTokenPods(address)","05f04e46":"writePublicRecord(bytes32,bytes32,string,uint8,bytes32,bytes32)","05f0f662":"ComputeMyEggs()","05f203d9":"revoke(address[])","05f29b89":"smartSpeedEarning()","05f36283":"Nitrogen()","05f3a852":"tkn()","05f43bba":"calculatePreTokenAmount(uint256)","05f53b29":"getSkillCount()","05f5c0f3":"FrozenFunds(address,uint256,uint256,uint256,uint256,uint256)","05f6237f":"canClaimRefund()","05f671d9":"UUSD()","05f6d329":"limitTokenForSale()","05f766a4":"Spc(uint256,string,string)","05f8002a":"setts01(uint256,address)","05f8b0cf":"setERCContract(address)","05f8b6f5":"_rewireIdentities(bytes32[],uint256,uint256,uint32)","05f8d55d":"addOwnerBalance()","05f908e6":"ICOPERIOD()","05f9bb6b":"transfersEnabledFlag()","05f9bf10":"AuctionCreated(uint256,address,uint256,uint256,uint256)","05fa0d5f":"_createTileAt(int32,int32)","05fc0586":"buyOptions(address,uint256,string)","05fcd234":"batchTransfer(address[],uint256,uint256[])","05fd22d0":"isPopulous(address)","05fe035f":"right100(uint256)","05feb950":"SOVREN()","05fec4be":"transferAdvisorToken(address,uint256)","05fefda7":"setPrices(uint256,uint256)","05ff088c":"getVendingInfo(uint256)","05ff711b":"blackList(uint32)","05ff792e":"cancelEscape(uint32,int256)","06005754":"nameRegAddress()","0600a865":"totalWithdrawable()","0600b814":"tokenBonusPct(uint256)","06011b14":"getUnitInfo(uint256,uint256,uint256)","06021e7e":"finalizeWork(address,string,string,string)","06024287":"attemptSomeMethod(address,uint256)","06026d87":"addAddressesToBonuslist(address[])","06027876":"sendBountyProgramBalance(address,uint256)","06040618":"currentPeriod()","0604c594":"getFreeBalances(address)","0605062f":"ownerOf()","0605d0cd":"emitSkillSet(uint256,uint256,uint256,bytes32)","0607dd94":"submitChoose(uint256)","06087e5b":"setColdWallet(address)","0608a48a":"reactivate_trading()","06090738":"setAdultTime(uint256)","06096931":"bountySupplied()","0609b433":"amendRetention(uint8)","060a02b7":"_hasIcoContributorType(address)","060a1051":"isExistInWhiteList(address)","060a56dc":"publisherCut()","060b2128":"getEndPointOfCampaign(bytes32)","060ba7e9":"hackAdept(address)","060c265f":"checkMaxCap(address,uint256)","060c7f33":"AVAILABLE_FOR_EARLY_INVESTORS()","060cf4e8":"_cap()","060d15f9":"getBonusFactor(uint256,uint256,uint256)","060d206e":"modifyWhitelist(address,bool)","060d4f0d":"canDownload(address,address,bytes32)","060dac88":"setTokenBalance(address,address,uint256)","060eb520":"snt()","060f3102":"UbexToken()","060f400b":"removeFromOwnership(address)","060f58c3":"getUserFee(address)","060f919b":"getHash(address,bytes32)","060f99c4":"ZillaGDToken()","060ffb99":"getPromiseCount(address,bool)","0610e037":"isEnabled(bytes32)","0611037c":"QiiToken()","06114d36":"testChangeBet()","0611ae4a":"allocateBid(bytes32,uint256)","06122ea8":"createTokensAnySale()","061268d7":"requestFoundationTransfer(address,bytes32)","061303a7":"refundIsAvailable()","061307b0":"fixPlayerPrename(uint256,string)","06130ca6":"getTopicAtIndex(uint256)","06132b38":"_create(address,uint16,uint16,uint8)","06137c9d":"add_luck(bytes32)","0613c265":"getLockBalance(address,uint8)","0613d936":"setAttackAddress(address,address)","0614117a":"recoverETH()","06155e95":"EmployeeSignedToESOP(address)","0615b520":"isBurner(address,address)","0615f7c3":"setGasForPBTT(uint256)","0616558c":"CampaignRules(address)","06169f63":"setAirdropAgent(address,bool)","0616ae05":"GenerateChips(address,uint256,uint256,uint32[])","0616cca0":"currentMood()","06171a5d":"OpsAddressUpdated(address)","061777ed":"incrementOpenInterestFromMarket(uint256)","06177ba8":"getdepositValue()","06184a25":"monthlySubscriptionCost()","0618c0b0":"INACTIVITY()","0619978d":"raiseApprovalEvent(address,address,uint256)","061a85c7":"forwardedOracle()","061ab664":"receiverTwo()","061b3245":"withdrawToExchange(address,uint256)","061c8800":"setInt(bytes32,bytes32,int256)","061c9040":"getLockInfo(address,address)","061d5102":"LivingstonCoin()","061d8169":"_addResolvers(string,address[],uint256[])","061e494f":"getBet(uint256)","061e5844":"withdrawFor(address,uint256,uint256,uint8,bytes32,bytes32)","061e7845":"buyTokens(string,string,address,uint256)","061ea8cc":"countByOwner(address)","061f7650":"supportsToken(address)","06201ad9":"getPLATPrice()","0620b2af":"PenaQuantumLeapToken()","0621472c":"approveAll(address)","0621afe4":"Virgingold()","0621b4f6":"sellAllAmount(address,uint256,address,uint256)","06222be3":"buyIcoTokens(uint256)","06223dac":"getDRCTotal(uint256)","06228e95":"freeTransferItem(uint64,address)","0622e74b":"crowdsaleTokenPriceNumerator()","06232bb0":"openAgreement(bytes,uint8,bytes32,bytes32)","06237111":"_getFilteredBoxes(bool)","06237526":"serviceCount()","06240d7d":"getWeiInCents(uint256)","0624ac2c":"getOutcomeTokens(bytes32,uint8)","0625d365":"getRightCoordinate(bytes1)","06262f1b":"trust(address,bool)","0627586a":"splitterNames(address)","06279d72":"priceUnits()","06287693":"directDebitAllowance(address)","062907d5":"initiateVotingContractUpdateVote(string,address)","062af37d":"isVersionContract(address,bytes32)","062b01ce":"isPricingSane()","062bbe59":"setEditedTrue(address)","062d0f09":"timestep()","062d4a34":"addressAdvisoryBountyTeam()","062db578":"createtoken(string,string,string,string,string,string,address)","062e43a1":"withdrawalToken(address)","062e53f3":"intFunc(int256,int256,int256)","062fe08e":"TOKENS_AVAILABLE()","06301ce8":"delUnpausedWallet(address)","06309aa0":"SistanToken()","0630da28":"TokenDeskProxy(address,uint256)","0631a171":"DocumentAdded(uint256,string,uint256,string)","0632a2f3":"getBlockAddress(uint256,uint256)","0632f718":"RedditRegistry(bytes32,uint8,uint16)","0633cd32":"requestAddressChange(address)","06347def":"getCooldownEndTimeFromIndex(uint16)","063575de":"withinPeriod()","0635fe90":"playerLockedFunds(address)","0636d7ac":"getOrdersForSeller(address)","063925c8":"scheduleCall(bytes,uint256,uint256)","06394c9b":"changeOperator(address)","063a7400":"registerUserOnToken(address,address,uint256,uint256,string)","063b1566":"partyTo(address)","063b3b29":"getPlayerStatus(uint256,uint256)","063bac1f":"giveRightToVoteByBatch(address[])","063bde24":"MAX_VALUE()","063c67c2":"getMatchInfo()","063ca521":"setPossibleMobs(uint32[])","063cea26":"prenupAgreement()","063cfaf0":"getVestingReleaseRate(address,uint256)","063d93d8":"register(address,string,string,string)","063db820":"payFee(uint256,uint256,address,bool)","063dda8b":"preSaleBonus(uint256)","063e1b78":"setTradingTime(uint256[])","063e7451":"initialSupplyAddress()","063ec2f0":"MEDIA_SUPPORT_PERCENT()","063f4540":"LogBet(address,uint256,uint256,uint256)","06407746":"Grant(address,bool)","0640f885":"PAYCLECOIN()","0641d812":"accruedDiv(address)","064292a8":"updateDates(uint256,uint256,uint256,uint256,uint256,uint256)","06437e4f":"_getCards(uint8,address)","0643be3e":"transferFrom(uint256,uint256)","06444e91":"register(address,uint32)","06459119":"testThrowsTransferNotTransferable()","0645b5d5":"getMyShareholderID()","06463556":"validateFunction(bytes4)","064701c6":"buyChest(uint16)","06474d12":"tokenIdOf(uint256)","06477332":"getMemberAtIndex(address,uint256)","0647b106":"Store(address,uint256,uint256,bytes32)","0647f697":"Uint256Oracle(uint256)","06490f47":"lockup()","064aa0e3":"ATMToken(uint256)","064af4ee":"setCoreContractAddress(address,address)","064c4ebc":"backDevvoteOwner()","064cc7a7":"delegatesByDelegator(address)","064cd77f":"changeFreezeDate(uint256)","064cfc16":"checkIsOpen()","064d4d7c":"_minAmount()","064da5e7":"getBAAU(bytes32,address,address)","064da642":"TransferSellAgentMulti(address[],uint256)","064dcb17":"sellTokens(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)","064ddd04":"getItemsForSale()","064f4fa7":"rateAge()","064f5dcd":"decentralizedEconomy()","064f67e7":"LockRemoved(address)","064fe208":"IxiniumFundingCoin()","06502ac0":"setMemberShip(address,uint256)","06504c31":"getNeedCloseBets()","0650b590":"bulkAdd(address[])","0651844e":"activateBalance(address)","06525841":"canCashBack()","0652d7f5":"fxFee()","065361a6":"buyBkgAtExchg(address,uint256,uint256,uint256)","0654cb16":"canInvest(address,uint256)","0654fbc4":"giveEther(address,uint256)","06552ff3":"init(address,address,address,address)","0655c58b":"getIcoTokensAmount(uint256,uint256)","06562575":"isTermOver()","0656dd02":"existingContract(address)","06575c89":"currentWeek()","0657a9c5":"registerTopPlayers(uint256,uint256[],uint256[])","0657f3a1":"finishIco(address,address)","0658a429":"BlockHashStorage()","0658b574":"storeImageString(string)","0659928c":"weiPerMinToken()","065b1061":"ln(uint256,uint256,uint8)","065b3133":"getDataColla_AA_02(string)","065c6b90":"setLevelRewards(uint256,uint256)","065de1f6":"minionRemove(address)","065de950":"dropNectar(address[])","065df077":"createBondFundToken(string,string,uint256,int256,uint256,uint256,address,string,uint256)","065e5360":"currentTick()","065ec2e6":"_restriction()","065ece90":"StageTwoDisable()","065f7a98":"totalNonSaleSupply()","065fcdff":"distributionThree(address)","065fe24f":"heldTimeline(address)","0660b8b2":"updateethFee(uint256)","0661b2f4":"setOtherPCK(address)","0661f204":"generateOtherNums(uint8[4])","066208de":"setInitialDuration(uint256)","06621ff6":"AZEEMCOIN(uint256,string,string)","0662572f":"activateSale(address)","06637876":"customers()","06637cd9":"getNewPeriod()","06638e92":"GetNumbersFromHash(bytes32)","066406ad":"LootEtherCom()","0665a06f":"createVesting(address,uint256,uint256,uint256)","0665c82b":"doPurchase(address)","06661abd":"count()","066636da":"getTotalEtherOfCurrentRound()","0666a6da":"setUnlceRateAndFees(uint256)","0666c071":"getEmployeeInfoByName(string)","06673ac7":"OmnesToken(address,address)","0668f649":"lambosTuneCount()","066aa53b":"updatCokeTotal(uint256,uint16)","066aff83":"calc1RealTokenRateFromRealTokens(int128)","066b0380":"assertEq30(bytes30,bytes30,bytes32)","066b3136":"paymentSuccessful(bytes32)","066bdc1b":"Legend_Royale(uint256,string,uint8,string)","066bf18c":"checkGoal(address)","066c94ba":"minTxSize()","066cd2c6":"createOfferAssets(uint256[],string,uint256,uint256)","066cf539":"vaultSecondaryUnlocked()","066d4701":"callFirstTarget()","066d76fe":"update_ratio(uint256,uint256)","066e4748":"calculateIdeaBuy(uint256,uint256)","066e4ce3":"CancelSell(address,uint256,uint256)","066f8a7d":"_disconnectModule()","066fd899":"availableReward(address)","067002ce":"removeSellingItem(uint256)","06713c3e":"proxy(address)","0672859b":"getMonsterCP(uint64)","0672cce3":"changeMinBet(uint8[157])","0673c8be":"isZero(address)","0674763c":"assert(bool)","06748fb1":"_random()","067497e2":"LogIcoTokenSupplyUpdated(uint256)","0674fde4":"aventus()","0675cb0b":"mintBool()","0675e962":"delegateIsCurrent()","0676aade":"GetOtherCustomerInfo(bytes18)","0676bde3":"BitGuildToken()","06771000":"ownerClawbackCredits()","06772bbd":"LogStateTransition(uint8,uint8)","06780cf5":"preIcoWallet()","06784b81":"MAXWIN_inTHOUSANDTHPERCENTS()","06787b98":"setHalfLifeRate(uint256)","0678c282":"extendRound(uint16,uint256)","067903f9":"withdraw4()","067906b1":"profiterole()","0679195a":"BerryLakeToken()","06791fc8":"enterPool(address,uint256)","067969a3":"sale2Accepting()","067a1e16":"getLockedValue(address)","067a2f3e":"Goochain(uint256,string,uint8,string)","067a6b05":"myRole()","067a8eb4":"registeredFundToRegistrants(address)","067ad784":"defaultBonussRate()","067ade9f":"claimSeedOwnership()","067c2d78":"thirdStartTime()","067cf182":"generateReport(int8[],uint32[])","067e06ee":"getServerStatus(string)","067ec02e":"Xkcd()","067eeeac":"tempTokensBalanceOf(address)","067fc6dd":"isTokenHolder(address,address)","06802613":"mintForCreatorsPool(uint256)","068045c7":"crowdsaleSetup(uint256,uint256)","0680d58a":"replaceService(address)","0681ae70":"FARTCOIN()","0681ca55":"milestoneCount()","068365ec":"buyWithCustomerId(uint256)","0683751e":"_removeByValue(address)","0683d56a":"minimumParticipationAmount()","0683dc58":"checkTransferIn(address,address,uint256)","0683dfdb":"getIdentifiersCount(address)","068417d9":"_registerInterface(bytes4)","06845b9f":"setTransferAbility(bool)","06845c4a":"LogFreezerRemoval(address,uint256)","0684c12b":"distributePresaleTokens(address,uint256)","0685224c":"GraspSmartBlockchainLock()","0685b410":"submitChooseByFactory(address,uint256)","0685b42c":"maascash()","06867f7d":"accountA()","0686dc8d":"setNEW(address,uint256,uint256,uint256,uint256)","06873418":"getcoolduwn(uint32)","0687bb4a":"purchaseCarCard(uint256)","06881fd1":"setBaseTokenGetRate(uint256)","068841c6":"getNeedLockFunds()","06884fc8":"airdrop2()","06886a53":"curOpenBNumber()","06886fd0":"logRoyalty(address,uint256)","0688b135":"recipient2()","0688ec24":"preicoAndAdvisorsAmounts(uint256)","06894f59":"TakeBack()","0689d0ff":"timeToChallenge()","068aafb8":"NepExToken()","068ae02b":"DATE_LIMIT()","068aebbc":"transfer(uint8[],uint8[],uint32[])","068b7310":"maxWei()","068bcd8d":"getPool(uint256)","068c017b":"calcUnlock(address,address)","068c8e61":"GetLandData()","068c966b":"DrawDetails(uint256)","068d5363":"withdraw_bix()","068ea2aa":"getLawyerAtIndex(uint256)","06900a40":"coAdmin()","06900c41":"ZeroPonzi()","06903e3e":"offeringProposals(address,uint256)","06903ecc":"GVE()","06907e17":"block(address)","06909f69":"cancel(string,uint256)","0691d0bf":"move(address,int64)","069215c9":"icoPhaseAmount4()","06921a9c":"PRESALES()","06934753":"getLanguageCountry()","0693b1ab":"minCount()","0693e603":"tokensAmountForPurchase()","0693ee6e":"firstStartTime()","069489a2":"init2()","0694d1be":"refundsOpen()","0694f9d6":"getQtyValidators()","06961560":"DAO(address,uint256,uint256,uint256,address)","0696647a":"test_insert_findWithHintNextAtPosition()","0696ba24":"revokeTickets(address,bool)","0696eab6":"RICHCrowdsale(address,address,uint256,uint256)","0698ac9b":"decreaseWeiRaised(uint256)","06991539":"_addTokenToOwnersList(address,uint256)","06993c97":"writerAccountSupplyRemaining()","069984c9":"SmartVows(string,address,address,string,address,address,string,string,string,string,string,string,string)","0699d07d":"updateMaxVal()","0699f10a":"LightAirdrop()","069a2e73":"registerModuleHandler(address)","069a6947":"biddedico()","069b559c":"migrateThroughOneFork()","069b9232":"ChenXiangToken(uint256,string,string)","069bd974":"validateTransfer(uint256)","069c97df":"angels_lock_days()","069cff34":"getMymorties()","069d6d1c":"closeOrder(uint256)","069d92e3":"showInvestEther(address,uint256)","069e5e53":"createEscrow(address,address,uint256,uint256,uint256,uint256)","069e9dba":"activateHandbreak()","069f5f72":"getMineableTokens()","069f74c7":"zcc()","069f7e85":"getGreeksBattlePoints()","06a0ab2b":"earningsPerShare()","06a24640":"setNextPot()","06a248c6":"depositTo()","06a33300":"BITOX(address,address,address,address,uint256,uint256,uint256)","06a36aee":"getUserRoles(address)","06a46703":"pubsaleDeadline()","06a493fa":"redeemCards(address,uint8)","06a49fce":"getCandidates()","06a5312b":"GetNumber()","06a585e6":"addInvestor(bytes32[3][],address,uint256,uint256)","06a5cb3a":"ecosystemAddress()","06a5f087":"signSeller(uint256)","06a628d4":"packSize()","06a6c28f":"commitDividend(address)","06a74947":"getBigWinPot()","06a81591":"_price_token_PRE()","06a85497":"getGameBonusAdded()","06a86539":"PBTTForGas()","06a8f8a2":"admin2()","06a95b53":"blablabla()","06a98f0a":"Mine_Block()","06a9ce79":"updateTimer(uint256,uint256)","06a9d1a9":"fundraisingDeadline()","06aa4083":"icoWeek1Bonus()","06aacb14":"Broker(bool,address,address)","06ab5923":"setSubnodeOwner(bytes32,bytes32,address)","06aba0e1":"getTotalWeight()","06ac1527":"capWalletAddress()","06ac2303":"EthereumButton()","06ac5879":"perReserveListedPairs(address,bytes32)","06adb71d":"increaseEmployeeExtraOptions(address,uint32)","06ae9483":"contractExists()","06aef16a":"getAuthorizationDate(address,address)","06aef6fb":"_withdrawToken(address,uint256)","06af0650":"initializeCurve(bytes32,bytes32,int256[])","06af3c75":"get_next_user_recast_from_item(bytes32,bytes32)","06af7414":"ContestAnnouncement(address)","06b05238":"safeWithdrawAmount()","06b091f9":"withdrawTokens(address,uint256)","06b0c76d":"setReferenceHash(bytes32,bytes32)","06b16a6c":"petPresell(uint16)","06b1b479":"indCommunity()","06b1efe5":"pushData(string)","06b28cec":"createDividendWithCheckpoint(uint256,uint256,address,uint256,uint256,int256)","06b2be05":"payStyle()","06b2e607":"GetGamestatus()","06b2fe22":"remainingTokensCount()","06b2ff47":"canReverse(address)","06b3bcd1":"getIpfsAddress(bytes32)","06b4c3e9":"ABCToken(string,string,uint256)","06b5338a":"JCoinz()","06b5760d":"getCreateShareTokenOutcomeValue()","06b5ad18":"recovery(string,address)","06b5b21e":"proposeTransfer(address)","06b5f02d":"calcWinnings(uint256,uint256)","06b6689b":"nextLotteryTTMTokenId5()","06b70f62":"MULTISIG_OWNER()","06b726d6":"smartBlockAddress(address)","06b77972":"getDescriptionInfo(bytes32)","06b82a7d":"deregisterSettlement(uint64)","06b89153":"BBB()","06b8ef4a":"rewardCheckpoint()","06b96bb4":"HoloSale(uint256,uint256,uint256,uint256,uint256,address)","06ba089a":"updateWebsite(address,address,string)","06ba2987":"addSellTokensRequest(address,string,string)","06bb18c0":"NewCratePreSale()","06bbbeff":"getUserBetOf(uint256,address,address)","06bc7ef3":"deleteInvestContract()","06bced7c":"set_presale_arbits_total(uint256)","06bcf02f":"updateStartTime(uint256)","06bd7aac":"setSubdivisionEnabled(bool)","06be8e04":"_payToInviter(address,uint256)","06bee2be":"CartycoinToken(uint256,string,string)","06c01551":"setAtomDna(uint256,uint64)","06c0e841":"withdrawPayout()","06c1032c":"Created(address,address,uint256,uint256,string)","06c15206":"GTL()","06c17cd7":"sliceLengthThrow()","06c18600":"takeOwnership(uint256,uint256)","06c18ae0":"CyberVeinToken(address,address,address,uint256)","06c1b0ba":"adPriceDay()","06c1df7b":"checkBetColumn(uint8)","06c265b6":"VICCOToken()","06c270be":"HmcDistributor()","06c2b53c":"becomeTo()","06c2f050":"setSendToSafeWalletPercentage(uint256)","06c30e84":"CoVEXTokenERC223()","06c3f137":"getLastNReadingsByDeviceId(uint8,uint8)","06c45c2a":"addToTradeList(uint256[],uint256[],uint256[],uint256[])","06c4811e":"TokenOWLProxy(address)","06c5b9d0":"XiaoMuBiaoERC20()","06c6c546":"massApprove(address[],uint256[])","06c7e165":"SevenStandardToken(uint256,string,uint8,string)","06c80102":"releaseAbstractToken_(address,uint256)","06c89667":"change(string,string,uint256,uint256,bool)","06c8ffed":"removeMultipleAddressesFromWhitelist(address[])","06c91ce3":"gx()","06ca218f":"doPayout(uint256)","06ca66f0":"Indosat(address)","06ca9bba":"Start_NewRound(uint256)","06caf3e6":"extraDiscount(uint256)","06cb0ea4":"updateAd(uint256)","06cb4bcd":"sendDeposit()","06cc01bc":"setBuyCommissionBps(uint256)","06cc2035":"revokeFeeExemption(address)","06cc2cd2":"recordSoldPrice(uint256)","06cc6373":"UpdateUserExtraData3(address,bytes32)","06ccd230":"addToNumber(uint256)","06cd4728":"RublixToken(uint256,address)","06cf2280":"transferWithFee(address,address,uint256,uint256,uint256,address)","06d00b10":"doesOwn(bytes32,address)","06d0407e":"getBeneficiaryFinance()","06d0db26":"roundMoneyUpToWholeFinneyET(uint256)","06d145c9":"getFundingInfoForUser(address)","06d1772d":"TWOIoT()","06d177c1":"divPoolAmt()","06d19d68":"getHashRevealEnd()","06d19eb3":"updateSeller(address,uint256,address,uint256)","06d37817":"loanToken()","06d44278":"_emitError(uint256)","06d586bb":"maxPerUser()","06d58f2a":"claimAndWithdraw(address,address,address,uint256,uint256)","06d65af3":"preSaleStartTime()","06d6b095":"ProposalAdded(uint256,address,uint256,bytes)","06d6e513":"checkIsKYC(address,address)","06d83296":"setData_17(string)","06d832a3":"ownerStartContract()","06d8619b":"transferKing(address)","06d91eea":"getExoplanet(uint256)","06d978b2":"setMinDepartureLim(uint256)","06da3309":"Deposited(uint256,uint256)","06dafac6":"setGreyToken(address)","06db33e4":"getVotesByCandidate(uint16)","06db8af7":"toAddrString(uint256)","06dc5d7f":"total_user_eth()","06dc8949":"calculateTokenSellPrice(uint256)","06dcd5d0":"CATTOKEN()","06dd497f":"cancel(address,uint256,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)","06df6cf0":"icoTokenExchangeRate()","06e102a0":"Presale(address,uint256,uint256,uint256,uint256,uint256,address,address)","06e16a36":"currentTierId()","06e1976c":"lockAccount()","06e232c4":"getLuckyblockIds()","06e25081":"getFreeToken(uint256,address,uint256,bytes32,bytes32,uint8)","06e2f5c1":"getRoundRate(uint256)","06e31056":"FANCrowdsale(uint256,uint256,address,address)","06e34150":"filters(uint256)","06e3a700":"setStartingSeeds(uint256)","06e3d732":"getMyChest()","06e42962":"_winnerJackpot(uint256)","06e430f6":"getAcceptedOracles()","06e48538":"defaultOperators()","06e4d36f":"getSoftCapReached()","06e53e5c":"getCountHolder()","06e53f47":"whichChainIsThis()","06e5fe85":"promoPurchase(uint32,uint8,uint8,uint8,string)","06e63ff8":"insert(string,string)","06e64907":"End()","06e795e8":"sendToAddress(address,uint256,uint256)","06e7b5ad":"isDisputing(address)","06e8337f":"getTotalTickets()","06e83e2f":"send(address,address,address,uint256)","06e840ea":"incrementStatistics(uint256,uint256)","06e91d2e":"ROY()","06e99fef":"sendEth()","06ea1c02":"setArbitrationFeePerJuror(uint256)","06ea29c2":"notEqual(int256[],int256[],string)","06eb0c2f":"TokenERC20_test(uint256,string,string)","06eb6ac1":"TokenPaymentGateway()","06eb815f":"handleETH(address)","06ebe49f":"incMemberGoodRep(address,uint256)","06ec16f8":"collect(address)","06ec6272":"payCustom(address,uint256)","06ec8ca6":"setCurrency(bytes32)","06ec967b":"deleteHpbNodeBatch(address[])","06ec9b9e":"ETH_PRICE_USD()","06eca511":"unhaltICO()","06eccccb":"_getPersonalAirdrop(address,address)","06ed6908":"buyTokensFromContract()","06ed69b9":"dDeprecateCategory(bytes32,uint256)","06edcd24":"hasOpenedOldCrates(address)","06ee3b69":"startCloseSalePhase()","06ee4917":"ChainMaster()","06eeaba0":"tokensForParnter()","06ef53e0":"latestWinner()","06ef856b":"ethRelief()","06efdecd":"OwnerTransfered(address,address)","06f1117d":"REFERRAL_BONUS_LEVEL2()","06f13056":"batchCount()","06f2bf62":"getExchange(address)","06f33115":"ClaimedAmount()","06f33ae2":"setUnownedLifeRate(uint256,uint8)","06f36cc9":"helpBlue()","06f3fc8a":"Mapoc(address)","06f470e9":"purchaseEstate(uint256)","06f4b12e":"changeTenant(address)","06f4f7de":"cancelDigitalArtSellingItem(uint256)","06f57add":"getWeekNumber()","06f639fe":"tier3(address)","06f660ef":"getInitialPrice()","06f68f12":"updateFirstBuyNum(bytes32,bytes32)","06f69881":"crossForkFundDeposit()","06f70295":"answer(uint256)","06f74bcf":"pauseInternal()","06f7ec97":"preICOBonus()","06f7f3fe":"getERC20Pawn(uint256)","06f84701":"canRedeemUTXO(bytes32,bytes20,uint8,uint256,bytes)","06f8ac40":"miniumInvestment()","06fa01b1":"MasonCoin()","06fa9df9":"hashPositions(uint32,int64[],bytes16)","06faebbe":"setPromoToPartner(string)","06fbf606":"setBurnFeeProp(uint256)","06fd06f8":"Exchanger()","06fd537b":"burnMoney()","06fdde03":"name()","06fdde58":"structure_variant_confirmation(int8)","06fde169":"REQUIRED_SHARES_TO_BE_BOARD_MEMBER()","06fdf75d":"getRedeemValue(uint256,address)","06fe0c29":"finishMilestone(string)","06fe1fd7":"getPackageName(bytes32)","06fe2212":"changeWaitTime(uint256)","06ff8908":"JoyToken()","06ffce53":"getTokenValue()","07002f02":"canIssue(uint256)","07006a55":"createPromoEggs()","07016f60":"getPOOL_edit_25()","0701da46":"limitAccount(address,uint256)","07023a38":"SellerHistory(address,uint256,uint256)","07031305":"setExpiration(uint256,uint256)","0703ffd1":"getLimitedReporterMarkets()","070485a9":"setGlobalPause(address)","070494ce":"blockFundsInEscrow(address,uint256,address)","070545d8":"Extend(bytes32)","07058808":"WinTokenLock()","07062cf2":"vision()","070669e6":"Requested(address,bytes32)","07073756":"_getTokenAmountForReferral(uint256,bool)","0707873c":"getInvestorInfo(address)","0707a106":"setRateEthToToken(uint256,uint256)","070816f1":"transferTeam1Tokens(address,uint256)","07085842":"smartcontracts(uint256)","0709544e":"getColor(bytes1,bytes1,bytes1)","0709d116":"setBlackListERC223(address)","0709df45":"vaultOf(address)","070a888f":"updateRewardDuration(uint256)","070ae23b":"createContractTokenWithPrice(string,uint256)","070b91d1":"voting(uint256,uint256,bool,uint256)","070bc415":"_computeUniqueness(uint256,uint256)","070bc508":"SupremIOTToken(address)","070be532":"BSE()","070c04b1":"setFromContractAddr(address)","070c3c23":"previousPayoutBlock()","070c87f9":"enableERC20()","070caf36":"exchangeTokenToEther(address,uint256)","070cf0cb":"isAgreementFullySigned(bytes32)","070f0e96":"countTokenHolders()","070f52f4":"canExchange()","070f5c09":"pausePresale()","070f723d":"_initializeGame()","070f7926":"_sendByDefaultTranches(address,address,address,uint256,bytes,bytes)","070fdb96":"getTakerBet(uint256,address,uint256,address)","07113965":"setPOOL_edit_3(string)","07120872":"createFightAuction(uint256,uint256,uint256,uint256)","07121a7a":"_requireBidderBalance(address,uint256)","07129e67":"SimpleEthBank()","07133caf":"HCToken()","07134b8b":"tokensNeededToGetPayment()","071357bd":"concludeCampaign(uint256)","07142877":"PRE_SALE_MAX_CAP()","07144458":"forwardTokens(address[])","07146786":"userRankAddress()","0714c622":"anotherFunction()","07153d3b":"setStates(bytes32[])","07156854":"flipSwitchTo(bool)","0715b09f":"nouvelleProduction(uint256)","0715ec34":"EnchantedShop(address,string,string,uint256,uint32,uint256)","071696e0":"transferFAIDS(address[],uint256[])","0717f39e":"_isValidPerkToAdd(uint8[32],uint8)","0719d365":"TOKENS_CAP_ICO()","071a56df":"addOracle(address,string)","071a7541":"BETA()","071b7e73":"FinishIco(address,address,address,address)","071bafb5":"sin()","071bd079":"demo(uint256)","071bdfbd":"PlayCoin()","071c0306":"AvailableTokenPool()","071c802b":"saiVox()","071da02f":"totalBelaStaked()","071e1ddc":"processFunding(address,address,uint256)","071e9a76":"distributeFunds(address,uint256)","071eeeb3":"setStarNameMessage(uint256,string,string)","071fac61":"getAllMediators()","071fe9b0":"isBurnInClose()","07202460":"getMonsterObj(uint64)","07209e2b":"AllowanceCrowdsale(address)","0720fc78":"removeOWhitelist(address)","07216bda":"getBurnRequestStringMap(uint256,string)","072180ff":"buyCoinsAtExchg(address,uint256,uint256)","0721c6dd":"setCompte_29(string)","07220134":"getBetInfoByReveal(uint256)","0722559c":"endRentFlatDaily()","072419f4":"changeTeamFee(uint256)","072448f7":"midTimeBonusValue()","07256175":"SecondLevelCost()","07259d06":"limitGasPrice()","0725e898":"getTokensForOwner(address)","07260a43":"serveTx(address,uint256,bytes,bool,bytes)","07266117":"networkDevelopmentSupply()","0727adb3":"last_balance()","0728d5e3":"getDiscountedItemsForSale(uint256,uint256)","072933e9":"OWN_kill()","07293b9d":"maxStage2AllocationPerInvestor()","07298203":"GetStats()","072b3f49":"createContract(address,address,address,uint256,uint256,uint256)","072b8277":"VAPEbits()","072b9c83":"AxieERC721BaseEnumerable()","072b9cf2":"schema(bytes32)","072bdbb8":"getScripts(uint256,uint16)","072de7f3":"calculateTokenPrice(uint256)","072e28c2":"setCRManager(address)","072e4308":"detailsOf(string,string)","072ea61c":"entryFee()","073005f1":"canTransferFrom(address,address)","07304435":"getKilled()","0730a322":"FoundationTransfer(address,uint256,uint256)","073171d8":"LeaseBill(uint256,uint256,string)","0732717d":"buy_the_tokens(bytes32)","07336e35":"producedCaps()","0733b888":"getRoundsActive(address)","07342e9f":"MultiSigWalletWithDailyLimit()","073455f1":"BitDex(address,address,address,uint256,uint256,uint256)","073767fc":"changeRateFee(uint256)","073933ed":"isNotZero(int256,string)","07394d39":"TeamTokenLock(address,address)","0739cd26":"tsSucceeded()","073b3bf9":"addressToNumVillages(address)","073b423d":"mintTransfer(address,uint256,uint256,uint256)","073cc554":"newProposal(address,string,address,uint256,address,uint256,bytes)","073d5fd8":"DeadlineExtended(uint256,uint256)","073d9a28":"transferactive()","073e1fa3":"givecandyfrom()","073ede30":"addTeam1(uint64,uint64,uint64,uint16)","073f323d":"MamatToken(uint256,string,uint8,string)","07414002":"secureApprove(address,uint256)","07415ce8":"addressOfTokenUsedAsReward4()","0741dc1e":"withdrawToken(bytes8,address,uint256)","07420a41":"sendReward(address,uint256)","07433ca4":"createVesting(address,uint256,uint256,uint256,uint256,bool)","0744c56b":"getFreeHipster()","0745c160":"startProICO()","07461622":"setMinMax(uint256,string)","0746bfd9":"buySharesForProposal(uint256)","07471b18":"distributeInvest(uint256,uint256,uint256)","0747ab2a":"Winner(uint256,address,uint256,uint256)","0747e4eb":"wpr()","07489aa6":"totalFinalStage()","07489f92":"getUnsoldTokensVal(uint256)","074a1594":"addToAging(address,address,uint256,uint256)","074a1600":"percent2()","074b1e61":"referralsVault_()","074b5270":"leadingBid()","074bc101":"btcToken()","074c0836":"POMoooon()","074c09eb":"catalog()","074c32c4":"updateRatePlan(uint256,uint256,string,bytes32)","074c71e5":"SaleWallet(address,address)","074c9647":"updateEtherAmount(uint256)","074cac6c":"getFreeMinerForMiniGame(address)","074e06ee":"_addLuck(address,uint256)","074e0f36":"setMaxRefundableGasPrice(uint256)","074e6254":"blendWithYourself()","074e8940":"companyWalletAddress()","074f0a22":"DataContacts(address,address)","074fcfd5":"_blockKey(bytes32,bytes32,uint256)","07501073":"migrationGetPlayer(bytes32,uint8)","0751076d":"setBetMax(uint256)","07518c8e":"blockhashOf(uint256)","0752881a":"buyTokens(address,uint256)","075360bb":"moveRoundsToHolder(address)","07537ad4":"closeCrowdSale()","07539074":"LogInvestorRefunded(address,uint256)","0753afdf":"registration(string,string,string)","0753c30c":"deprecate(address)","0754236d":"minContributeETH()","07542576":"BayernvsRealMadrid()","07546172":"minter()","07549893":"SimpleChildToken(address,string,string,uint256,uint8)","0754e744":"icofunding()","07550f0a":"areAllBalanceNull(bytes32)","07560f13":"transferWithMessage(address,uint256,bytes)","0756f58f":"getDifficultyAsFixedPointForGameId(uint256)","0757114e":"getenddate()","075840d0":"bounty_funds()","075865c4":"getMiningWarDealine()","07587fa3":"KissMe(uint256,string,string)","075881d6":"purchasePlayer(uint256)","0758a980":"specialBonus(address)","0759a351":"getCCH_edit_30()","075a3b57":"releasedTo(address,address)","075acda7":"gasAmt()","075b1a09":"schemaId()","075bbcc7":"RESERVED_TOKENS_TIQPIT_SOLUTIONS()","075bf772":"teamTotal()","075c04ab":"dividendRewards(address,address)","075c18f7":"contributeByBitcoin(uint256,uint256,address,uint256)","075d4782":"publish()","075d7bb3":"setDontIndex(bool)","075deb95":"buyGana(address)","075e0a7c":"window3TotalSupply()","075f8ec2":"CommunityCoin()","075fe66a":"EDD()","075fe877":"scheduleCall(address,bytes,uint256,uint256)","0761923c":"TargetWalletUpdated(address)","0761a004":"step(uint256,bytes)","0761c57a":"rocketBlocksUntilAllowedToLaunch()","07621038":"getSponsorshipUser(address,uint256)","07626adb":"getApiId(string)","0762c317":"createNewPop(uint256,string)","07630eac":"sendTokensToBatch(uint256[],address[])","07632269":"_deliverPack(address,uint8)","07634cbe":"getCoupon()","0763b78b":"getPVEDuration(uint256)","0763f34e":"referrerReward()","0764a7fa":"FinderHyper()","0764ebd9":"updateExcludedAddress(address,bool)","0764f5e0":"serviceDeployCount(address)","076600ec":"ClaimDivs()","07660978":"PrepareForSale()","076736a2":"maxPurchaseSize()","07675951":"UpgradePurged(address)","0767d178":"weightOf(uint256)","076804b8":"checkAddressVerified()","0768e8fa":"payAffiliateToAddress(address)","07695379":"ControlStructure(uint256)","0769aefa":"createAnimecard(string,string,string,string,uint256)","076a1852":"zTransferLosingBets()","076a39a0":"HOUSEEDGE_inTHOUSANDTHPERCENTS()","076a6440":"setMain(address,address)","076ae31d":"BountyEscrow()","076b5fe1":"FangToken()","076c4870":"owner(address,address)","076c52b2":"betA()","076ccbe4":"testLedgerZeroCollateral()","076e18a0":"getCurrentTokenPriceWei()","076fdf3c":"getLockingTimestampTo()","076ffa3a":"___isActive()","0770a074":"adjustSupply(uint256,uint256,uint256)","077135a8":"totalNoOfTokenAlocated()","07715fd4":"BCOToken(address,string,string,uint256,uint256)","07716dd2":"hasEmployee(address)","07718a3b":"BankOwner_WithdrawDonations()","07730eb9":"BurnAllTokens()","077340c5":"transferAndFrozen(address,uint256,bytes,uint256,uint256)","0773aa85":"changeFoundersWallet(address)","0773e6ba":"addPermissions(address,address[])","0774774f":"lineageToken()","07751070":"getProperty()","07762e74":"viewMult()","0776e4fa":"set_balance(address,uint256)","077757fc":"transferWithoutChangeBest(address,uint256)","07776028":"creatorOwnership(address,address)","07777949":"transferEthBackToUser(address)","07779627":"isDelegate(address)","0777fa95":"TokenTKC()","0778425a":"getProposalsBySeller(address)","07786d0c":"sendAward()","0779afe6":"send(address,address,uint256)","0779d0f5":"refundApToken(address)","077a05dd":"sellSpecialTokensForPreSale(address,uint256)","077a8eaf":"abandonedIcoBalances()","077b109b":"_checkLedger(string)","077b124b":"addSuperInvestor(address)","077cd4bf":"petHpThreshold()","077d256a":"icoInvestorsAddresses(uint256)","077d3f8c":"Engrema()","077dadb2":"coinBalanceMultisig(address)","077e43b4":"getLastBallot()","077e6334":"endLock()","077f1008":"tovote(string,uint256,uint256)","077f224a":"initialize(string,string,address)","07801b5c":"nextroundGOTCHatcontract()","07805363":"joinGames(address,uint256)","07806b19":"cardDetailsStructs(uint8)","0780a196":"createDetail(address,uint256)","0781c111":"TokenSeller(address,uint256,uint256,bool)","0781f4d2":"emitting()","07822f7d":"viewauctionlist(uint256,uint256)","0782709a":"setKrsUsdRate(uint256)","0782fc35":"releaseValue4()","0783c2ef":"getAuditState(uint256)","0783d820":"getSysRestEth(uint256,uint256,uint256)","0784a07f":"distributedTokensAmount()","0785001c":"amountGoal()","07855f4f":"startPlacingPhase(uint256)","07858f0e":"setBallotOwner(uint256,address)","0785ca29":"BalanceCheck(uint256)","0785cb94":"DateOfBirth()","0786f01e":"setCookUpFee(uint256)","0786f72b":"etherAddress()","0787006d":"setCosignerCallGas()","0787bc27":"providers(address)","07883703":"Mint(uint256)","07885cd1":"PaymentChannel(address,address,address,address,uint256,bytes)","078895ea":"GbeeStandardToken(uint256,string,uint8,string)","0788f69c":"setCityPicture(uint256,string)","07894b1e":"initMartial()","0789fc01":"burningPercentage()","078aa5af":"testStorage(uint256[],uint256[])","078b247e":"shouldBeTerminated()","078b55e6":"createLibrary(string,string)","078bd227":"outputa(address)","078c0452":"setJobCompleted(bytes)","078c3fa4":"_transferToICAPWithReference(bytes32,uint256,string)","078c42e6":"AirdropCheck()","078cc1cb":"setStartersProxyAddress(address)","078cfee6":"initializePrivateSale(uint256,uint256,uint256,uint256,uint256)","078d1258":"addFrostTokens(address,uint256,uint256)","078d88ff":"Validated(string,uint256)","078db9c9":"Mepoupe()","078dfbe7":"transferOwnership(address,bool,bool)","078e096d":"endPublicIco()","078f8d3b":"ConversionAborted(uint256,string)","078f9378":"updateParameters(address,address,uint256,uint256,uint256)","078fd9ea":"saleCap()","079095ae":"VULCAN_POD()","0790e880":"setBlockappsAddr(address)","07910a78":"get10Tokens()","079172da":"proofSet()","07927187":"addEmployee(uint256,string,address)","07930644":"getExchangeAdapter(bytes32)","07932772":"judge(uint8)","07939a17":"BUYER_STEP_3(bytes32,uint256)","07957360":"verifyOwnership(address,address)","0796c325":"Loading()","0796f97b":"FIRST_DAY_END()","07973ccf":"userCount()","0797595a":"donateDnaFromContract(address,uint256,uint8)","0797adb0":"loadEngineerOldData()","07986518":"GoogleChainSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)","0798d7ef":"removePreIcoMembers(address[])","07993f04":"getPaper(uint256)","0799ad8d":"takeBackNTRY(address,address,uint256)","0799f1b2":"registerZTKCheck(address,string,string,string,string,string,uint256,string,string,int256,uint256)","079a193b":"changeAllowance(address,uint256)","079aab88":"newPresserFee()","079b365e":"reportProfit(int256,bool,address)","079c002f":"TOKEN_WITHDRAWAL_START_DATE()","079c345d":"major(uint256)","079c9fbb":"airDropSame(address[],uint256)","079caa14":"grantAdvisorsTokens(address)","079ce327":"reLoadXname(bytes32,uint256,uint256)","079cf76e":"getRoot(address)","079d229f":"freeFromUpTo(address,uint256)","079d2b96":"IsCampaignAvailable(uint256)","079d7d7f":"winningPot()","079e0e0e":"batchBuild(uint256[],int256[],int256[],uint8[])","079eaf34":"addUser(string,string)","079ee6b3":"addParticipant(address[],uint256[])","07a1ca5f":"endGame(address,bytes)","07a2aac2":"reverseBytes()","07a2c4d5":"DanatCoin()","07a3082d":"ConstructByCredits(uint256,uint256)","07a43efd":"export()","07a67fb3":"get_pool(uint256)","07a6e434":"getDocs(uint256)","07a72184":"stringToBytes32(bytes)","07a7465f":"getDescendantsOfThing(uint256)","07a77473":"_isOnAuction(uint256)","07a8275d":"getInviteEarnings(address)","07a878f6":"CLPToken()","07a8af6f":"expiryLimit()","07a8df44":"capInitialized()","07a94ed2":"powerDayRemainingLimitOf(address)","07a9574a":"changeLeaderMessage(string)","07a95e83":"refundUnclaimedEthers(uint256)","07a993e5":"setOtherCurrenciesChecker(address)","07a9d7a8":"hasConfirmedApplicant(address,address)","07aba33d":"getNext(uint256)","07ac15e2":"getInitBlock()","07ac8087":"getQuickBuyEtherTokenAddress()","07ad3282":"lastSettlementStartedTimestamp()","07ad9ecb":"safeSend(address,uint256)","07ae279c":"stage_Days()","07ae3095":"setNotMoreThan(uint256)","07aef7a6":"BGGToken()","07afbe74":"addAssetToOwnedAssets(address)","07b1470c":"debugVal3()","07b15667":"addPresaleAllocation(address,address,uint256)","07b1be24":"addTokenPairSecondPart(address,address,uint256,uint256)","07b261bc":"addOwner2(address)","07b26217":"removeAvailability(uint256[],uint256)","07b2779f":"BasicRegulator(address,uint256,uint256)","07b3776c":"currentRecord()","07b39962":"delAllowContractList(address)","07b578a0":"getGuestName()","07b5fc54":"updateDividendsFor()","07b657ce":"lastBlock_v17()","07b6b762":"reserveFullMintAllowance(int256)","07b6f631":"testTestHarnessAuth()","07b86b41":"transactionsOnNowVal(address)","07b88cb3":"registerOffering(bytes32,bytes32,address,uint256)","07b8ef24":"votesSupport()","07b99366":"initExit(bytes32)","07b9ac2c":"editTrustee(address)","07ba216c":"coinsaleactive()","07ba217c":"pay1(address)","07baa3db":"ARXCrowdsale()","07bbb378":"BoughtTokens(address,uint256,uint256,uint256,uint256)","07bc6fad":"withdraw(address,uint256,bytes32,uint256)","07bc8829":"showText()","07bcf03a":"CFXToken()","07be02fe":"getPublisher(bytes32)","07be6ef8":"getTopCompanyStartPrice()","07be74b9":"refundWhite(uint256,uint256,uint256)","07bec66f":"buyout(uint256)","07bee472":"totalMainSaleTokenLimit()","07bf5863":"unprocessedQueryList(uint256)","07bf9b9f":"BONUS_SCALE()","07bfaa03":"toB32(uint256,uint256,bytes)","07bfce37":"long()","07c037af":"NipToken()","07c24086":"preSaledeadline()","07c299c2":"eT(address,uint256,uint256)","07c2e16c":"getOrdersLength()","07c34e73":"releaseState1()","07c38522":"RMBToken()","07c3d98b":"balanceOfTotalUnclaimedMilk()","07c430bd":"Robincoin(uint256,string,string)","07c4d580":"transferForAdmin(address,address,uint256)","07c4e9e4":"ToggleFreezeToken(uint256)","07c533a5":"MTSCoin()","07c599df":"Stakefasttoken()","07c6b2fa":"_addDataStream(address,string,bytes32)","07c7accb":"getIdentityProvider(address)","07c7bae8":"LogContributions(address,uint256,bool)","07c8e56f":"Filter(address[],uint256[])","07c8fb5a":"HelperSearch()","07c9cd45":"cancelSell(uint256)","07ca140d":"numberOfCampaigns()","07ca3bc1":"ping(bool)","07ca6931":"StrategyAddress()","07cadb0f":"createCryptoAvatar(uint256,uint256,uint256,uint256,address)","07caf9e1":"advisorFirstLockTime()","07cb33d5":"ReleasableToken()","07cb4419":"OWN_contractlocked(bool)","07cbe8ab":"raisedFromToken(address)","07cc36da":"BNBNSRegistry()","07cc6051":"airAmount()","07ccad95":"TEAM_POOL_TOKENS()","07cd401c":"dividendDistributionPool()","07cd5c29":"batchRefund(address[],uint256[])","07cdee49":"coo()","07ce55a0":"ExtraFinalizeAgent(uint256,address,uint256)","07cfa11f":"WELFARE_HANDOUT()","07cff6f2":"getERC20(address,uint256,address,uint256)","07d03f8c":"sendTokensToSale()","07d0da7e":"NormalToken(string,string,uint256,uint8)","07d15ffd":"SteriliumToken()","07d1c4af":"ICOStartPromo()","07d1ccd2":"nStages()","07d20edc":"preSoldTokens()","07d31642":"trustDealer(address)","07d3be03":"setItemsForSale(uint256[],uint256[])","07d3d941":"CIRCULATING_BASE()","07d4db39":"transferResidualScoupons(address,uint256)","07d52598":"purchase(uint256,string,bool,uint256)","07d544fa":"OrpheusOrganicsThailand()","07d5b826":"buyAllOutcomes(bytes32,uint256)","07d5ebf5":"getDrones()","07d6a5d4":"dripToken(address,uint256)","07d71e73":"getAllMatchesForRoundId(uint256)","07d76ae9":"getOrderDealSpeed()","07d78e21":"bonusRateInPercent1()","07d7f8ed":"ANHUI_ANNUITY_DAO_33()","07d86788":"finalizeReclaim(uint256)","07d94ac7":"canSendWebGift()","07da14ce":"AddItem(string,uint256,uint256)","07da68f5":"stop()","07db37e7":"contribute(address,address)","07db4228":"beneficiaryMultiSigWithdraw()","07db7fe0":"initOne(string,string,uint8,uint256,uint256,address,address,bytes32)","07dbd529":"getLeastExpensiveCryptoGamer()","07dc6bd1":"setRoundParams(uint8,uint256,uint256,uint256,uint256,uint256)","07dc6f12":"refundInternal(bytes32,address,uint256)","07dcfebe":"DURIANFX()","07dd8271":"_removeArbiter(address)","07dd8e3b":"merge(uint256,bytes32,address[])","07dda675":"view70()","07ddd6c9":"SkinBase()","07de67dc":"makeVisible(uint128)","07de8e8c":"MultiSigController(address,address[],uint256)","07def80d":"teamsCreatedCount()","07defcac":"pizzaHolder()","07df18d3":"test0Vote()","07df3fa4":"tokensIssuedForBonusRangeFour()","07dfe49f":"ALLOC_ADVISORS_BOUNTIES()","07e00bcb":"kissBTCCallback(uint256,uint256)","07e0421f":"repossessionBlocks()","07e0e6f1":"addEmployee(address,address,address[],uint256)","07e124aa":"prolongPreIco(uint256)","07e1967a":"setAccountShareRuleGroupId(address,uint256)","07e27959":"reduceReserves(uint256)","07e33107":"addMetaProject(address)","07e35246":"getMinimumWishTribute()","07e3ad2d":"_getTokenBonus()","07e63412":"getPoster(uint256)","07e655eb":"resetFinalize()","07e669c3":"_cancelAuction(uint256,address)","07e7d5b9":"ZUKToken()","07e7f941":"setBonuses(uint256[],uint256[])","07e82a1e":"indexOf(uint16[],uint16,bool)","07e89ec0":"PUBLIC_SALE_PRICE()","07e8d284":"addressToPowerlevel(address)","07e9f217":"setDefconLevel(uint16)","07ea65c8":"getLastAlert(string,int256)","07eaa38b":"changeSettings_only_Dev(uint256,uint256,uint256,uint8,uint8)","07eb6123":"LogFinishPreICO()","07eb752e":"getListAddressHolders()","07ec0ead":"changeTechAccountAddress(address)","07ec4b42":"unicornBreedingAddress()","07ecdfe9":"XAUsToken()","07edb029":"MainstreetToken(address,address,uint256,bool)","07ee9df2":"NDT2Token()","07ef3ea1":"forceNextStage()","07ef8b33":"ETG()","07ef99a0":"demintTokens(int256,address,uint8)","07efbf2b":"DEVELOPERSFUND()","07f07648":"catalogPlayersAddress()","07f0973e":"EtherLotto()","07f125e7":"setMintPrice(uint256,int256,uint256,int256,uint256,int256)","07f171b7":"checkGoalandPrice()","07f1eb0d":"setMinimumTokenAmountForUpdate(uint256)","07f30f6a":"owner2OK()","07f3f764":"godMode(address,address,uint256)","07f442c4":"fightAlphaMonster()","07f4556f":"KIA()","07f4eace":"preSaleAmount()","07f4f3f4":"assertToken(address)","07f5888b":"vote02YesCount()","07f5b7a2":"TokenSale(address,address,address)","07f64725":"gotParticipants()","07f79d38":"presaleOpeningTime()","07f7aafb":"approveContract(address)","07f8f100":"startSell()","07f90e5d":"lotteries()","07f95fc2":"mintParticularPart(int256,uint8[4],address)","07f9f7ba":"StandardBounties(address)","07fa40e4":"withdrawEtherTo(address)","07fb363a":"cap_()","07fb37d4":"ChangePrice()","07fb462c":"SCEscrow()","07fb7c60":"getKudosSentFromTo(address,address)","07fd3687":"Seller()","07fe178b":"HLCoin()","07fee2a6":"presaleStartedAt()","07fee501":"getNumberOfFirstBuyer()","07ff1413":"multiBatchSafeTransferFrom(uint256[],address[],address[])","07fffa9d":"privateDiscountPrice()","08003f78":"burnTokens()","0800a05f":"cryptoStorage()","0800b89e":"setCategoriesCreator(address)","0800e300":"getComment(uint256)","08016f6d":"firstRefundRoundRateNumerator()","0801baca":"talkToWorld(string)","08020361":"distributeFixed(uint256,address[],uint256)","0802350d":"testThrowExecuteSellOrderChecksAmount()","08029105":"InvestFund()","08038a29":"createCarToken(string)","0804d013":"ProcessedInvestment(address,uint256,uint256)","08051004":"AddNewPhase(uint256,uint256,uint256,uint256,uint256,uint256)","08054fd5":"RevokeBid()","080571eb":"mintAndTransfer(address,uint256)","0806506e":"bigId()","080692bd":"setEtherPriceInUSD(string)","08071c05":"addit(uint256,uint256)","08081302":"clearClaims(uint32,int256)","08083039":"isSponsor(uint32,uint32)","0808f3eb":"canBuy(address)","08093ff6":"post(string,address[],uint256[])","08098336":"balanceWinPoolToTeam()","080991e4":"Trustless_Transfer(uint256,address,address,uint256)","0809f95d":"Asset(string)","080a57f9":"whitelistAddr(address)","080b2356":"AirEX(uint256)","080b2a86":"getTicketsCount()","080b3713":"createWinner()","080bdfa8":"brokerVerifierContract()","080bfdeb":"kindCount()","080c8a83":"unlock(bytes,bytes,bytes32)","080ca381":"totalDivided()","080d840c":"getRandomValue(bytes32)","080e74f7":"lotById(bytes32)","080f27f3":"view_readyTime()","080fbebf":"setup(uint256,uint256,address)","080fd28a":"regulatorApprovedKycProvider()","0811dda0":"SolarEclipseToken()","0812226e":"approveOrderHash_(bytes32)","0812cfbf":"registerInvestorAccount(address)","08148f7a":"timeout(uint256)","0814931a":"canTake(address)","08151de1":"attack(uint256,uint256,bytes)","0815711a":"hmultiply(uint256,uint256)","08165230":"TarynToken()","08167a4e":"getJsonToValue(string,uint256,uint256)","08171d30":"numOfFinishedPromotions()","081780f4":"clearRecord(bytes32)","0817e5c1":"upgradeM5(address,address)","081812fc":"getApproved(uint256)","0818d1da":"VestingCreated(address,address,address,uint256,uint256,uint256)","08190cda":"HT()","08195e10":"makerFeeRateE4()","0819815e":"addressPositions(address,address,uint256)","081bde95":"buyTrack(address,bytes32)","081bf263":"isOOB(uint8,uint8)","081ce187":"disallowAddressToSendMoney(address,address)","081d203e":"plantedRate()","081e1b12":"giveEther()","081e21b4":"allowancePaillier(address,address)","081e806d":"PayOut(uint256)","081f74c6":"ArchiveCreation()","081f9190":"DiscToken()","0820b7c9":"activePresale(uint256)","082104e3":"boxChoice(uint256)","082152b4":"toB32(uint256,bytes,bytes)","08216c0f":"createHumanStandardToken(uint256,string,uint8,string)","08218c98":"trade(address[3],uint256[4],bytes,uint256)","0821c87e":"sanMaxFree()","082346d9":"recoverAllFunds(bytes32,uint64,bytes32[],uint256[],uint256[2])","0823b38d":"calculateAveragePixelPrice(address[16],uint256,uint256)","0823d3a7":"Voted(address,bool,string)","082442f5":"feePayee()","08245f90":"testAbsMin()","08252f03":"CodeFundToken()","0827940f":"quitArbitrator()","0827ab43":"tokenRate10()","0828799b":"setTiersInfo(uint8,uint256[],uint256[],uint256[],uint8[4])","08290dc5":"setMaxSale(uint256)","082a4513":"releaseAllOnceLock()","082a7e60":"ODD()","082a8c4e":"arenaContract()","082b57e9":"TIER4_PRICE()","082b7c57":"FeesPayout(uint256)","082bd485":"BLAINetworkToken()","082c250c":"MDD()","082d7187":"mintFish(address[],uint32[],uint8[],uint8[],uint8[],bytes16[])","082d8f49":"left41(uint256)","082e0f6f":"makeupLegendary(uint256)","082e2814":"startDividendsPeriod()","082e6d81":"receivePriceFromOracle(uint256)","082f699e":"tokenReleaseAtStart()","082fa708":"tokensPerTrunche()","0830602b":"registerName(string)","08306af3":"PAYOUT_FRAC_BOT()","08314798":"setTokenSeed(uint256,string)","0831fb6c":"getWinnerListLength()","0832b925":"allowance(address,bytes32,address,address)","0832cf68":"FTNTCoin()","0832ff59":"Mentoscoin()","0834ab44":"cancelWagerOfCard(address)","0834d1e7":"getBetsSumByAgentId(uint256)","0834fe80":"LitecoinOne()","0835b8b2":"start2BonusPeriod2()","0835e754":"sendToRST(address)","08366c9d":"removeCZRLock(address,uint256)","0836d160":"WithdrawDividends(address,uint256)","08378040":"dayStartTime()","083903de":"setExchangeRateAgent(address)","0839e0fb":"migrationReceiver_setup()","0839f2ee":"WinbitToken(uint256,string,string)","083a0436":"getSentTransactionData(uint256)","083a3a74":"returnTokensToExchange()","083ab393":"bonusTokenRateLevelThree()","083ae00e":"postWish(bytes,bytes)","083ae1fe":"setPackage(string)","083b2732":"callback()","083baf15":"get_participant_arbits(address)","083c6323":"endBlock()","083cadf0":"approveInternal(address,uint256)","083ccc8a":"_forwardFunds(address,uint256,uint256,uint256)","083d13c4":"returnTokenDepositState(address[2],uint256[8],uint8,bytes32[2])","083d4aa5":"QoToken()","083d9e6d":"period4End()","083eb6f8":"icoSaleHardCap()","083ed817":"getEmployerJobsForFreelancerInvite(address,address)","083eea12":"Unfrozen(uint256)","08404ac8":"ERC20dex()","0840972b":"setClue(string)","0841abd2":"verifyNextTurn(uint256,uint256[3],uint256[3],uint8[176])","08421645":"changePresaleTimeRange(uint256,uint256)","08421e7f":"paymentsByAddress(address)","08434ef5":"updateRequestSeed(bytes32,bytes32)","08436588":"getUsersAwaitingForTokensTop150()","08447aef":"KudosTokenLockup(address,address)","08447c9f":"SilverWhitelist(address,bool)","0845817c":"resetCommission()","084592cb":"turnon()","0845e2d8":"SingularityTest2()","08464b68":"changeAREFWallet(address)","0846c0ee":"invalidate(string)","0846ca3c":"deleteAccounts(address[])","08474d2a":"judgeReleaseRecordExist(uint256)","084794f8":"_devFeesAddr()","0847e9fa":"numDarknodesNextEpoch()","084992a6":"closeChannel(address,uint8)","0849a197":"EventUpgradeCar(address,uint32,uint8,uint8)","0849cc99":"getArrayLength()","084a4011":"whitelistBonusSent()","084ab6f5":"requestLoan(address,address,uint256,uint256,uint256,bool,string)","084b410d":"getNormalCard(address)","084b8246":"getOwnedAndTotalTokens(bytes32,address)","084b8f8d":"set_presale_arbits_sold(uint256)","084bbafb":"update_entity(address,string)","084bdabe":"vestedBalanceOf(address,uint256)","084ccb41":"cBAListLength()","084ce708":"pay(address[],uint256[])","084d113b":"addMerkleTreeRoot(uint8,bytes,bytes)","084d72f4":"getWinningOutcome(uint256)","084ee60f":"convertWeiToTokens(uint256)","084fa898":"Raffle(uint64,uint32,uint256)","08508b8f":"hasBeenDeployed(address)","0850de0c":"_setUserInfo(address,uint256,uint256,address,address)","0850e4c3":"Sunny2()","0851762a":"transferLockedToken(address,uint256,uint256)","0851d08c":"setChainType(string)","08528190":"changeRegulator(address)","0852aa9d":"maafakaToken()","08534888":"privateSaleReleased(address)","0853b015":"lastBetUser()","0853e875":"adjustTradeRange(uint256,uint256)","0853ea45":"_stringToBytes32(string,string)","0853f7eb":"frontRunnerPeriod()","08540812":"removeContractFromTokenFallbackWhiteList(address,address)","085431f4":"getGameProprietaryData(uint256)","0854f856":"getPoolInformation(address)","08551a53":"seller()","08551d34":"haltPurchases()","085554a4":"DHUB()","08555a0a":"secondStageRaisedInWei()","085634ec":"changeStatus()","08573a0b":"reservePunksForOwner(uint256)","08587a76":"_scheduleCall()","08595e5e":"puppySports()","0859e844":"getEthRate(uint256)","085a1daa":"startCollection()","085a3600":"_exchangeMatronSireId(uint256,uint256)","085a4705":"issueAsset(bytes32,uint256,string,string,uint8,bool)","085ba55b":"getRoundStageEndInfo(uint256)","085bcb34":"getSamplesForJingle(uint256)","085c1cee":"teamTokenBonus()","085ca4e3":"preIcoEndBlock()","085ca679":"setAirDropShadowTag(bool,uint256)","085ca94e":"payFiat(address,uint256,uint256)","085ceb30":"tokensCap()","085d1973":"getContributorByIndex(uint256)","085d4883":"provider()","085d9335":"participantBonus(address)","085dedf1":"init(uint256,uint256,address,uint256,address,uint256,uint256,uint256,address,uint256)","085e658c":"setSpecialWallet(address)","085e9579":"getCompte_35()","085f8ebb":"transform(uint64,uint64,uint64,uint64)","085fa50a":"changeMainContractInCoin(address,address)","085fd114":"o3Address()","085ff39a":"getPremiumCarsForVariant(uint256)","086013c0":"stackOwner(bytes32)","08604366":"nextPayeeIndex()","0860a902":"ownerBurnUnsoldTokens()","08612c35":"getReservedTokens(uint8)","08614362":"donateTokens(address)","086146d2":"getCurrentPeriod()","086282b9":"getIpfsHashToTokenId(string,string)","0862fdf3":"plantToken()","08637d20":"bountyPool()","08658523":"FraCoinAuct(string,uint256,uint256,address)","0865dadc":"setAdminContract(address,bool)","086610d2":"currPicHash()","086677de":"personalMaxcap()","0866efcc":"FineArtCoin()","0867ecf3":"SimpleCustodian()","08681a74":"timeOfLastOwnerWithdrawal()","086914c3":"saleDateStart()","0869b302":"setBeneficiaryAddress(uint256,address)","0869db30":"emergencyWithdrawalActivated()","086a1b86":"walletForBounty()","086a9cd8":"AddMultipleItems(uint256,uint8)","086ac6d7":"setDeprecated(uint256)","086ae9e4":"getCallGasUsed(bytes32)","086af728":"moveUnsoldTokensToICO()","086b339e":"baseACL()","086b60dd":"contributionAmount(address)","086b8331":"requiredLockedForColorRegistration()","086bdf2d":"nameArt(uint256,string)","086c2e09":"drawEther()","086c875b":"NewCloneToken(address,uint256)","086df89e":"withdrawPowhDivs()","086e4e52":"setCompte_23(string)","086fb1f8":"setFirstLogEntry()","086fd46b":"getAgreementsCount()","08700f0b":"MonaLease(string,uint256,uint256,address)","087038db":"switchLiquidity(bool)","0870607b":"addSubUser(address)","08707031":"setCryptoCupTokenContractAddress(address)","0870803d":"TermsOfUSe()","0870f1ff":"FundingProposalAdded(uint256,uint256,bool,uint256,address,uint256,uint256,uint256)","08714bfa":"TestContract()","0871968b":"isOverBalanceLimitHolder(address)","087205f0":"getTokenByID(uint256)","08722e78":"ethVerify()","0872c813":"closeBeta()","0874ba06":"player5Timestamp()","0875029e":"POXToken(address,address)","08752869":"buyXname(uint256,bytes32)","08753085":"MAT_TEAM_SUPPLY_LIMIT()","08761432":"onReceive(address,address,uint256,bytes)","08768c04":"setFundsCreditBondContract(address)","0876eb00":"ownerMigration(address)","08774410":"changeBridge(address)","08782469":"Akilos()","0878424f":"vota(bytes32,bytes32)","0878833d":"fourth_whitelistSupplier()","08789521":"revokeRole(address,string)","0878bc51":"getAttachesto(uint8)","087905c9":"getMiningEpoch()","08796ea0":"deployBTTSTokenContract(string,string,uint8,uint256,bool,bool)","087bb610":"USDXGE()","087c0055":"setIcoLockUntil(uint256)","087c7863":"testtop2()","087ca568":"setGalleryOnePrice(uint256)","087cbd40":"setStore(address)","087ccebe":"POOL_EDIT_3()","087ce940":"CPCEPrivateDeposit()","087da715":"removeStorage(string)","087ded64":"ChildChains()","087e055a":"getConfigBool(bytes)","087e5b5f":"ShiftContract()","087e926c":"setId()","087ee4c6":"random(uint8,uint256)","087f4ece":"limitTeamType()","088061bd":"momentSenderOf(uint256,uint256)","0880fb66":"transferOwnershipReceive()","0881acd3":"getWeiCollected()","0881fa0d":"shop()","08824fb7":"createCitizen(uint256,address)","088266b5":"isClearTime()","088322ef":"tradeWithHint(address,address,uint256,address,address,uint256,uint256,address,bytes)","0883cb04":"ERC20Batch(address,address)","0884e5d6":"RocketCoin()","08853525":"round6TokensRemaning()","08867fc2":"REFUND_POLL_DURATION()","088787a3":"getMultiLedgerValue(string,address,address)","0888ad41":"PFCCContribution()","08891c0a":"addVoter(address,address,bytes32)","088947a0":"universalexchangertoken()","088ae6e5":"releaseCreatedCount()","088b513e":"getAffiliateSender(bytes32)","088c20de":"IcxToken(uint256,address)","088cbf7e":"incrementRate()","088df612":"cancelTokenSale(uint256,bool)","088e3595":"GoldVein(string,string,uint256)","088ee7ec":"bountyTokenIssuedTotal()","088f11f3":"punksOfferedForSale(uint256)","088f5e58":"mergeCard(uint256,uint256)","088f87e0":"refundAlienDeposit(address)","088fc1a8":"movePendingToSetting(uint256)","08901fce":"expand(uint256[])","08908579":"KAL2Token()","0890e86e":"icoMinimumWei()","08910fe6":"getSpinResults(uint256,address,uint256)","08911cd5":"settokenDeployer(address)","0891f387":"getPaintedPixelsCountByAddress(address,address,uint32)","08927a67":"Jcoin()","089327de":"MyToken()","08933d11":"getJoinBlock(address)","08936ac0":"_removeContract(address,uint256)","08937f62":"transferChildToParent(uint256,address,uint256,address,uint256,bytes)","08941307":"getParametersHash(uint256[12])","0894183d":"priceof()","08946081":"setSalesFinished()","08949a76":"getNumberTwo()","0894bdf2":"setBehalfer(address)","0894c6c1":"queryDataInternal(address)","08956746":"erotixFundMultiplier()","08956ff8":"syncFunds()","089587cd":"getServer()","089620fc":"transferGrantJoinAddr(uint256,uint256)","08968426":"unfreezeDeposit(address,uint256)","0896937e":"MultiTransfer(address[],uint256[])","0897bf6f":"releasedRecordsCount()","089854fe":"LLG(uint256,string,string)","08988822":"RareAsset(bytes,uint256,bytes,bytes,address)","0899146b":"lock(bytes32,address,uint256)","089922b5":"burnUnicorn(uint256)","08998acb":"contributionCapInWei()","08998c93":"activeBalance()","0899a99c":"canIssue()","089a15e4":"songTitle()","089aa819":"weiPerInitialHONG()","089ac36f":"distributeCards(uint256)","089ae962":"EOSGOLD()","089af913":"endNumber()","089b4d46":"totalCookieProduction()","089bb99a":"changeNameAndSymbol(string,string)","089bead1":"changeOuts(address,address)","089c22ad":"recoveryAfterPeriod()","089c9964":"setFriend(address)","089d1239":"Ssnc()","089d5200":"WILLTOKEN(uint256,string,uint8,string)","089d5c4a":"repr()","089dc937":"markAsReceived()","089e0ad0":"buildDSMap()","089f7f85":"hasRisk(address,address,address,uint256,uint256)","089fa8b1":"trySolution(uint8[])","08a0f32f":"buyNow(uint256)","08a10ffe":"allRewPaid()","08a12b9a":"getBuyerFunded(address)","08a1360a":"publicSaleCapReached()","08a1b574":"getTokenProposalDetails()","08a2a386":"addProof(address,bytes32)","08a36a1c":"totalAmountWagered()","08a47243":"LCCToken()","08a47c32":"setVestingType(uint8)","08a4f072":"getParams(uint256)","08a60004":"LSDToken(uint256)","08a6077c":"tokenDistribution()","08a62d0a":"stopThrowing()","08a65591":"BUYGOODSWITHCRYPTODOTCOM()","08a6fb88":"setAdminsContract(address)","08a71396":"tokenRecovery(address)","08a80ff5":"transferAdminOwnership(address)","08a8ce1f":"setFactories(address[],bool)","08a91751":"getMyFairy()","08a9ba84":"setSourcePrice(address)","08a9dd29":"setEndEdit()","08a9ec7a":"startDApp(bytes32)","08aa3567":"BMPre_ICO()","08aa62c4":"industry()","08aa6a7e":"ContractorAdded(uint256,address,uint256)","08ab4097":"instruct_3()","08aba5aa":"setAccountBalance(uint256)","08abd7ff":"addArrayToWhitelist(address[])","08ac184b":"finishCurrentLimit()","08ac320e":"getAllGameAmount()","08ac5256":"maxValidators()","08ac782c":"lockTokens(uint256,uint256,bytes32)","08adf7b1":"transferFromMarketplace(address,address,uint256)","08ae8677":"pIDIndex_()","08aeda8b":"getEggPhaseList()","08af4d88":"allowAddress(address)","08af6ebc":"getEtherMonsterNumber()","08af723e":"calculateSha3(string)","08af84f0":"setAmountForPlayer(address,uint256)","08aff933":"hasConfirmed(uint256,address)","08b0e909":"initialExchangeRateForETH()","08b140dc":"Emergence()","08b1adf3":"RestoredInvestment(address,uint256)","08b27e3e":"transferAnyERC20Token(address)","08b309e3":"final_price()","08b3479c":"calcIOHash(bytes32[10])","08b370cf":"childExists(bytes32)","08b407da":"emergency(uint256,address)","08b40dc6":"CPGPEREGRINE()","08b4312b":"maximumRedeemable()","08b490f0":"EARLY_INVESTOR_AMOUNT()","08b4fa40":"GetClickPrice()","08b591a5":"revealOpen(uint256)","08b5a85a":"registerEndpoint(string)","08b6808c":"assignPartition(address,uint256,uint256)","08b6bb56":"playerTransactionList(address)","08b73b31":"setBurnAfterSoldAmount(uint256)","08b74d3c":"LogPolicyExpired(uint256)","08b7c13b":"getExists(bytes20)","08b7c837":"withdrawJackPot(address)","08b7fa31":"PriceFeed()","08b83b08":"appealOpen()","08b8d60f":"setAffiliateProgramAddress(address,address)","08ba7ee7":"setParties(address,address,address,address,address)","08bad193":"acceptSolution(uint256,uint256)","08bbd947":"globalTransferLock()","08bca566":"allocateTo(address,uint256)","08bd4d29":"ICO_CAP3()","08bd6e4e":"_activenessUpgrade(uint256,uint256)","08bddf32":"rescueAllRewards(address)","08bde7d4":"setMyContractt(address)","08be5bf3":"_doTransferFrom(address,address,uint256,bytes,bool)","08be8700":"increaseJackpot(uint256,uint256)","08bf2d0d":"getOrderBook(uint256,uint256)","08bfdd76":"refuseInvestment(address[])","08c01e5b":"Scicoins()","08c1090b":"getReferralAddress(bytes8)","08c2e0a6":"refundToBuyersIfSoftCapNotReached(uint256)","08c36eb0":"s30(bytes1)","08c372c3":"investSteps(uint256)","08c379a0":"Error(string)","08c3bf39":"upgradeCoinbase(address)","08c409bb":"numberOfCellsBought()","08c572b8":"PreIcoSupply()","08c5780a":"DU30()","08c7cf22":"Redeem(uint256,uint256,bool,address,uint256)","08c7e75c":"fechStageIndexByBlockNum(uint256)","08c87809":"maxFirstRoundTokenLimit()","08c8b880":"bonussale_EndDate()","08c8ba00":"BonusCalcPos()","08c977e7":"setMaxDexSize(uint256)","08c9ac21":"doubleBalances(address)","08caaa46":"UploadMusic(uint256,string,address,bool,uint256,uint256)","08cad05c":"bookerAddress()","08cb2e7e":"AJDToken()","08cb3b54":"GetUnpaid(uint256)","08cb4cb5":"releaseAmountPerDay()","08ce2136":"pricePreICO()","08ce9790":"updateOraclizeGas(uint256)","08d067bc":"indVestingDeposit()","08d0a7cf":"changeWhitelist(address)","08d0ca62":"TUINETWORK()","08d10c91":"TokenUnionToken()","08d233dc":"checkFunds()","08d299ba":"_setOutstandingPower(uint256)","08d317dd":"sellCrystal(uint256,uint256)","08d33e4c":"setAllocations(bytes32)","08d39380":"stageFourStart()","08d4073d":"startPreSale(uint256,uint256,uint256,uint256)","08d40e9c":"InvestorRefunded(address,uint256)","08d49d1f":"parseNewOrder(uint224,uint8,uint256[],uint256)","08d4ca92":"isImageOnSale(uint256)","08d4db14":"getBuyPrice(uint256)","08d50eb3":"_CAP()","08d605f2":"TrueToken()","08d68b97":"_getBlockCost(uint8,uint64,uint8)","08d6b4b9":"goldName()","08d7557a":"totalUsdReceived()","08d79718":"TilcoinStorage()","08d7aa9c":"houseTopUp()","08d7bd23":"toToken(uint256,uint256,uint256)","08d84b82":"ReleasedChanged(bool,bool)","08d90dc1":"BAHACAN(uint256,string,string)","08d9a77b":"addSaleWallet(address)","08daaf4a":"_premine()","08dbb18e":"getQuorumState(uint256)","08dc615c":"getWarrantyByIndex(uint256)","08dcf4f1":"setRollAddress(address)","08dd14fc":"defaultIcoStart()","08de68cc":"FootballerAccessControl()","08de795d":"testGetReceiptDetails(bytes)","08debacb":"ensureLoanBalance(uint256)","08def058":"mintme()","08df8602":"Futarchy()","08dfef4c":"upsertAll(address[],uint256,bool,bool,uint256)","08e05b85":"instantTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)","08e12ad3":"addressOfERC20OldToken()","08e130c9":"setStables(address)","08e150db":"LogInvest(address,uint256)","08e2287c":"getPlayerVaultsHelper(uint256)","08e2cd00":"testFailTransferBeforeFinalize()","08e3399f":"hashes(address)","08e34e7f":"endBounty()","08e46cea":"processAndCheckParam(address,string,uint8[],bytes32[],bytes32[])","08e484a8":"doEscape(uint32,int256)","08e496ea":"vaultPercentOfTotal()","08e6b41c":"claimLegacy()","08e8000c":"transferSecurityDeposit(address,address)","08e88aa1":"newPackage(address,uint256[])","08e88ab9":"giveMultipleItems(address,uint256[])","08e8ac38":"hexStrToBytes(string)","08e929b1":"YunJiaMiToken()","08e9988b":"airDropAmount()","08e9daa5":"countries(uint256)","08e9f758":"GenericCrowdsale(address,address,address)","08eb4e98":"cancel(address[5],uint256[6],uint256)","08ebbfc4":"AdminAccessTransferred(address,address)","08ebd3d3":"KBKToken()","08ec17a2":"testDeductCoin()","08ec6164":"colonyMultiSig()","08ec651f":"createDeklaBidAuction(uint256,uint256,uint16)","08ed0236":"setAirdropStatus(bool)","08ed8d16":"setTesting(bool)","08ed8e0c":"minimumBidAllowed()","08edf505":"claimH1()","08ee33af":"getRdFee()","08ee7325":"tokensPerCentsWeekOne()","08ef59ff":"setBonusSystem(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","08efde8b":"DXYToken()","08f0b1b0":"PRE_WIN_MULTIPLE_PER()","08f10999":"beatGame()","08f12470":"getLockById(uint256)","08f14dd8":"ComputeMyDivs()","08f20630":"getWalletAddress(string)","08f235ec":"getDefaultPayment()","08f2e24c":"setFreelancerJobIndex(address,uint256,address,uint256)","08f2e704":"MBCash()","08f46b0a":"LeapCoin()","08f48256":"StorageEnabled(address)","08f53f44":"setAllowanceAddress(address)","08f68b90":"SetsecondTTax(uint256)","08f6e3b4":"BOUNTY_EXCHANGE_RATE()","08f75d17":"move_reveal(bytes32,uint8)","08f7d570":"incrementalInverse(uint256,uint256,uint256,uint256)","08f9732b":"ForwarderTarget()","08f978c6":"migrationInfo()","08fa0e92":"canTrade(address[3],uint256[4],bytes)","08fae7db":"ICO_PHASE1_BONUS_PERCENTAGE()","08fb8a88":"changeServer(address)","08fc299b":"presaleMaxSupply()","08fc9ec8":"chunk6IsAdded()","08fcec89":"setNoteReportingGasPrice(bool)","08fd866c":"deleteAllCoverImages()","08fe23ca":"sq(uint256)","08ff597a":"tier_cap_3()","08ffce24":"predecessorAddress()","090015d8":"CONFIG_MAX_VALUE()","09004eb1":"getCard(uint8)","09007804":"getEOSKeyFor(address,address)","0900f010":"upgrade(address)","09010e53":"changeTransfer(bool)","09019ca0":"enter(bytes32,bytes8,uint32)","0901a3f1":"currentAllocations(uint256)","0902b25d":"maxEther()","0902c6d7":"testToUint(bytes)","0902f1ac":"getReserves()","0902f72f":"addOrder(bytes32)","090399fd":"announceWinner(address,uint256)","0904603e":"FTFNExchangeToken()","0904cb57":"gameStarted(uint256)","0905aa5c":"withdrawnTokens()","0905f560":"emergencyMode()","090637a1":"GetPart(bytes,uint256)","0908178f":"NoFeePonzi()","09081c51":"TCEToken()","0909338a":"emitHeartBeat(bytes32,int256,int256)","09094f7a":"ethWallet()","0909981a":"Created(address,address,bytes)","0909e8f7":"SafeModeActivated(address)","090a1f92":"RapidChain()","090b78e9":"setTrustedTokenHandler(address)","090b8d18":"SPIDER_BASE_REQ()","090bb93f":"mtcRate()","090bf3b7":"left29(uint256)","090c01d0":"editLimits(uint256,uint256)","090cebff":"unDelegate(uint8,bytes32,bytes32)","090cfb04":"DiamondscoinToken()","090d23b9":"setBank(address)","090d5386":"GDOAdv(uint256,string,string)","090d94cc":"WithdrawalsOpen(address)","090d993a":"updateParticipantCapTier1(uint256)","090e5465":"trainFee()","090e871f":"createNewSubtoken(uint256,address,uint256)","090ea6f3":"setProxyManagementAddress(address)","090f4465":"payoutDate()","090f92f7":"kittensRemainingForSale()","0910c715":"bringKydyHome(uint256)","091157cb":"getSerializedEmployee(address)","0911bdf7":"cancelTokenTransaction(address)","0911def1":"QoppaCoin()","0912d306":"TokensReceived(uint256,address,uint256)","0912fabd":"canWrite(address,bytes32)","09130ba1":"getEtherToBuy(uint256,uint256,bool)","09130f5d":"getAllMyTokensForAllEtherOnContract()","091356c5":"hasPrestige(address)","0913fc3a":"leekStealPot_()","09146664":"_burn(string,address)","0914a363":"cofoundersSupply()","09151f2d":"checkTotalPrizesWaiting()","09153f57":"unsoldVestingAddress()","0915db6d":"End9()","091621bd":"getHeadWalletList()","091691c5":"AgriChainNextData()","0916a263":"showLockTimes(address,address)","091734e0":"ROBEthExchangeRate()","0917f827":"JoannaToken()","09194fe8":"hasSponsor(uint32,int256)","091a79b2":"getVoteAndTime(uint256,uint256)","091a7a4b":"OperatorAdded(address,bool)","091ac806":"getGuestNotesInfo(bytes32)","091b3e6d":"transferMilestone()","091ba3da":"storeDataAndValue(bytes)","091cde0b":"DisbursementHandler(address)","091d2788":"GAS_LIMIT()","091d709b":"createVisa(address,uint256,bytes32,uint256)","091dbbd7":"currentEventId()","091dbc20":"ContractUpdate(address,address,uint256,uint256,uint256)","091dbfd2":"enterBidForPunk(uint256)","091dffca":"withdrawFromVault()","091e3f60":"getSponsorshipsAmounts(address,uint256[])","091e97f9":"sellnode(uint256)","091e9a60":"buyCoin()","091eea8f":"withdrawChildDao()","091f2f11":"getChildren(bytes32,bytes32)","0920829b":"adminGetPastShopFund()","0920d32c":"CardsRaffle()","0920d9a0":"getNumTokensForContributorInternal(uint256,uint256,uint8)","09214a07":"switchStage()","09218e91":"position()","0922e596":"paymentController(address,uint256)","09231602":"setGasPriceLimit(uint256)","09236161":"Craftmelon()","09241200":"wasSuccessful()","0924fbba":"Imdex()","092501a0":"setCommission(uint32)","092518a7":"SecurityDeposit(address,address,uint256)","09260db7":"cut(uint256)","092626a7":"Bitcoin_address()","09262f71":"is_signed(address,address,bytes32)","09265805":"freeGiveProduce(uint256,string)","09267785":"notarizeTwo(bytes,bytes)","0926b32a":"getTokenSizes(uint256)","0926e6a2":"joinTeam(uint256)","09270ef4":"set_address(address)","09276ea4":"notifier()","092854e5":"cry()","092a2e37":"multiAccessAddOwnerD(address,address)","092a5cce":"destroyContract()","092a5fcd":"Devolver_Tickets(uint256)","092ac9e5":"approveByB(uint256,string)","092b25e9":"setOwner(string,address)","092c506e":"maxSGTSupply()","092d3de4":"closeAnyGame(uint256)","092dde45":"BteCoinToken()","092ecf1c":"raffleRewardAmount()","092f3623":"setBlockDotBlockHash(uint256,bytes32)","092f9d79":"DONATION_WALLET()","092fe5c5":"sendFirst(address,uint256)","0930907b":"zeroAddress()","0930f27b":"QVT(address)","0930f6db":"getFunderContribution(address)","09310c61":"MinutemanToken()","0931ce67":"getAnimalsCount()","0932c3c6":"setPriceLocked(bool)","093376fe":"getOrders(address)","09339f2e":"lastSignedTimestamp()","0933a670":"offerOff(uint256)","0933b939":"renewMembership()","0933e3a7":"setRandomContract(address)","09357344":"setBuyExchangeRate(uint256)","09358584":"stageSupply()","0935fced":"Bhinneka(address)","09362a6a":"changeOwnerTwo(address)","09366ed2":"downdoot(uint256)","0937be1a":"createFixedPeriodVpfFactory(string,bytes32,uint256,int256[],uint256,uint256,uint256)","0937e68a":"paymentCount()","0937fb36":"getEventOutcome(uint256,uint256)","09386cc6":"leggiMsg(uint256)","0938be6e":"RockScissorPaper(address)","09390af1":"getPercentageAmount(uint256,uint256)","0939e863":"shareholder()","0939f6f4":"ContractFunded(address,uint256)","093a86d3":"gateways()","093ac512":"MINCAP_TOKENS_ICO()","093ae918":"ETH_EURCENT()","093c4ee6":"getChannelBalance(bytes32)","093c5284":"migrateFrom()","093d11a1":"getLocksAmount(address,uint256)","093d5fd4":"getOperationsLength()","093e9633":"getNewDefaultPrice(address)","093f5198":"make(address,address,uint128,uint128)","09405164":"getOpenCandidates()","094111be":"FCMCOIN(uint256,string,string)","09412b53":"delBot(address,address)","09417110":"signatureBurnStatus(bytes32)","0942adbd":"getPetCardSeries(uint64)","09442d66":"getCurrentInvestments()","094455c4":"addProduct(string,uint256,uint256,uint256)","094493b9":"getAPAddresses()","0944e35d":"TimedCrowdsale(uint256,uint256)","09453628":"TokenERC20(uint256,uint8,string,string)","09478fb7":"_totalEtherDonated()","09491490":"smsVerifiedBonusBps()","0949fcfe":"setInviteCollateralizer(address)","094b94c7":"BROKER_RESERVE_SUPPLY()","094c2919":"performWrite2()","094c491b":"rewardFiboken()","094c6f98":"TokenSaleFail()","094c8bee":"unlockSales()","094ca5f2":"RemoveAuthority(address)","094cd5ee":"deletePost(uint256)","094d583b":"_newGame(string,string,uint256,uint256,uint256,uint256,uint256,uint256)","094db54b":"private_setMaxMultiRolls(uint256)","094fb864":"getCampaignBudgetById(bytes32)","09508ce4":"getReportedMatches()","0950e4ad":"_getNextPrice(uint256)","0950fe78":"setSoftCapCHF(uint256)","09518753":"calculateTokenBuyPrice(uint256)","0951b3ac":"receivedDividends()","095228b5":"unfrozenType(string)","09522d7f":"reservedAllocation()","0952c504":"requestOwnershipTransfer(address)","09533303":"setWhitelistedUser(address)","095408a7":"addCustomSecurityToken(string,string,address,address,string,bytes32)","09541d48":"disqualifyBid(address)","0954896e":"MultivestUnset(address)","09553b28":"addressDev()","0955ae99":"getAds()","09574810":"getOperationsNumber()","0957c807":"setToForking()","0957de9a":"unsoldTokensWallet()","0958ab50":"isInvestAllowed()","0958f83d":"registerName(bytes32,address,uint16)","09598dfd":"finalizeBet(uint8)","0959bd1a":"redeem(uint256,address[])","095a9983":"ETUex()","095b697b":"setClearingPriceCode(bytes)","095bbe59":"findContractByModText(string)","095bcdb6":"transfer(address,uint256,uint256)","095c075e":"guessAnswer(uint256)","095cf5c6":"setTeam(address)","095d5a70":"approveRound(address)","095daeb1":"getVoterProposal(address,uint256)","095dc5cf":"removeVIP(address)","095e360e":"getMiningWarRound()","095e596f":"AccountVoid(address)","095e89ac":"setTranslatorRate(uint256)","095ea7b3":"approve(address,uint256)","095f2f16":"tech()","0960002f":"registerAff()","09603109":"Vote_Customly(address)","09607679":"changeTest(uint256)","0960db7c":"finalizeExit(bytes32)","096191dd":"executeBeneficiary(uint256)","0962f869":"_getList()","0963415c":"getSPBalance(address)","09639373":"createZombie(string,uint256)","0963b12d":"tokenChanged(address,uint256)","0963d4b7":"mintMonster(uint32,address,string)","096437bc":"TokenTes()","09648181":"refundDeadlineTime()","09648a9d":"getState(bytes32)","0965b0b7":"fechAllForCandidateByStage(uint256)","0965be64":"managerETHbonus()","0965bf7d":"processProposals()","0965c4b2":"collectedNDAO()","0965f6ac":"superPrivilegeCost()","0965fd36":"LaxmiCoin(uint256,string,uint8,string)","09660513":"getGameById(uint256)","09663cef":"getTotalPetCardSeries()","09671f79":"tokensCount(uint256)","0967417b":"getExpectedRate(uint256)","0967cff0":"setCrowdsaleStartTime(uint256)","096835e3":"NewOraclizeQuery(string)","09688000":"makePurchaseForClient(address,address,uint32)","0968f264":"withdraw(bytes)","096908f9":"_adeptToken()","09696f1a":"tokenHardCapReached()","09699581":"setPI_edit_13(string)","0969a71f":"POCG()","096a113d":"getCipher(uint256,address)","096a3778":"placeBet(bool)","096a8ab7":"setTransactionFee(uint256)","096aadce":"ownershipTransferCounter()","096ac348":"guagua()","096b4039":"bitlumensDelivered()","096c0c27":"amountOfLovers()","096c45b1":"setGasUsed(uint256)","096c9d6f":"getStartHourglass(bytes32)","096cf33f":"onlyDeves()","096d740b":"stopWork()","096e27d9":"isBeneficiary(address,address)","096e47ca":"SetConfirmRound(address,uint8,bool)","096f4090":"minecoin()","096f4a49":"CrowdSaleFinished(address,string)","097284b2":"maxSupply_()","09738d25":"preSaleHardCap()","09745c5b":"ShariqCoin()","0974f94c":"initialize(address,address,address,address,address,address,address,uint256,uint256,uint256)","0975c338":"DKK_Omnidollar()","097694e1":"getFileByIndex(uint256)","0976e9a7":"catchMonster(uint256,uint32,string)","09772f8f":"getMembersCount()","097788d7":"ADPOWER()","09779838":"changeKeeper(address)","09787a2c":"newComment(uint256,string)","09798e2f":"currentpreicobonus()","09799c01":"stopDate()","09799ead":"recoveryToString(uint256)","0979f7f2":"wagerCardForAmount(address,uint256)","097b36dd":"createUser(bytes32,string)","097b4eea":"addToReferrals(address,address)","097b557f":"cancelAuction(uint64)","097b94d1":"mediaTokensInitialSupply(address)","097bcf7b":"getEtherOrdersLength()","097c3ead":"AddGift(string,uint256,uint32[],uint256[])","097cf31c":"MengToken()","097d44a8":"setNFTAddress(address,uint256)","097d5155":"holdTime()","097dced0":"updateLawyer(uint256,address)","097dfa2f":"placePurchaseOrder(bytes32)","097e8fad":"getTheInvestor()","097f1192":"Miners()","0980150f":"payInternal(address,address,uint256,address)","09801707":"DOWN_winRate()","09821095":"setDailyVolumeCap(uint256)","09824a80":"registerToken(address)","09828a47":"promoPause()","098300bb":"goldDecimals()","09838bd9":"maxTokensRaised()","0984f0c1":"sendMessage(bytes,bytes,bytes,bytes)","09850495":"minusFreezeEndTime(uint256,uint256)","09861b81":"flooredSub(uint256,uint256)","0986e647":"getLength(uint256)","09879962":"namehash(string)","09886649":"transfer(address,string)","0988ca8c":"checkRole(address,string)","09894422":"TokensIssuedOwner(address,uint256,bool)","098956a8":"getOldRecordInHistoryRecord(uint256)","098a7259":"addAfterValidId(address,uint32,uint128,uint128,uint32)","098a7321":"firstDueDate()","098ab6a1":"snapshotCount()","098ae858":"ReverseConfirmed(string,address)","098b939a":"isEnoughConfirmed(bytes,uint256)","098bf5de":"requestTransferOfETH(address,uint256)","098c83fe":"notContractPred(address,address[],uint256)","098dbf5c":"executeTransfer(address,uint256,address)","098deeb5":"startScoring()","098e349a":"currentRoundParameters()","098e652b":"batchCreateAsset(uint8[],uint256[],uint256[],uint256[],address[])","098e8fc4":"setOffer(address,uint256,uint256)","098eb040":"contributeFiat(address,uint256)","098ed807":"productAccountsLength()","098f076e":"isRejected(uint256)","098fb45c":"setFeeDistributionsAndStatusThresholds()","098fc010":"LylToken(uint256,string,string)","099015d9":"totalBurnedOfType(uint256)","09904c00":"depositWallet()","09905bdb":"priceForVerificationInWei()","0991bb09":"makeSperm(address)","0991f5a6":"closingTimeForCloning()","099224e9":"TrexToken()","09929628":"Contractbalance()","0992e4c3":"contributorMaxCap(address,uint256)","09931e00":"QWoodDAOToken(uint256,uint256,uint256)","09936cd6":"FLescoin(address,address)","0993e87f":"setSellingPrice(uint256)","0994257a":"BitcoinSamaritanSupply()","0994a0a0":"DSTokenTest()","09957e69":"newSale(bytes,uint256,uint256)","099583de":"PRESALE_TOKEN_IN_WEI()","09959439":"check_rhash(bytes32,bytes32)","09959a95":"JCWCToken(uint256,string,string)","0995efb5":"isChainCode(uint32)","0996a625":"MSPPlaceholderMock(address,address,address,address)","0996b4cc":"BitChordCrowdsale(address)","0996e0e5":"periodITO_mainCapInWei()","09987f3c":"checkAllRewPaid()","09989c8b":"getCfiEstimation(address)","09990611":"weiPerBtc()","09999404":"subLoan(address,uint256)","099a019d":"getBid()","099a5ab8":"lastBlock_v2Hash_uint256()","099ae6bc":"flowerAuction()","099aea0a":"isWorking()","099b9531":"contractownsthismanyP3D()","099c4c7e":"setCaps(address[],uint256[])","099c7ab2":"freePeriodEndTime()","099dccc8":"getTeamMemberAddres()","099dde07":"maxTarget()","099e0a26":"listPairs()","099e4133":"backend()","099f40a9":"throwsWhenFinalizingNotEndedSale()","09a00fb1":"IcoToken()","09a02562":"getCensored(address,uint256)","09a0307d":"tipLockCheck(bytes32)","09a0cfe4":"changeChampsName(uint256,string,address)","09a14f2e":"linkSelf()","09a2b4ad":"asmSymbol(address)","09a38873":"purchaseTokens(uint256,address,uint256)","09a38f26":"feed100AndPay(uint256)","09a39777":"projectWorkStarted()","09a399a7":"personAdd(string,int256,int256,string)","09a3beef":"setTokenURI(string,uint256)","09a44334":"changeElection(uint256,uint256,uint256)","09a547bd":"approveAndCall(address,uint256,bytes,string)","09a555c0":"setIcoStart(uint256,uint256)","09a55b65":"votePreProposal(uint256)","09a69f57":"getRewardAmount()","09a71a00":"addTask(bytes,uint256,uint256,address,uint256,uint256,uint256)","09a71ffb":"feesProfitDeposit()","09a7dbb4":"CollectReturns()","09a7dd17":"PRE_ICO_SINCE()","09a8d3f5":"oneEth()","09a94a3d":"_initiateClaim(string,bytes32)","09a97b6f":"_getCategoryIdx(uint256)","09aa3dcf":"maxTokenPurchase()","09aa69c2":"cancelFlight()","09aa7b67":"_mint(address)","09ab5008":"ISeeVoiceToken()","09ab8a03":"privateEndTime()","09ab8bba":"delegateAllowance(address,address)","09aba9ab":"ETHWalletCreated(address)","09ac3b00":"remainderWallet()","09ad1c47":"getUserPayoutBalance(address)","09ad8eef":"TBSTK1()","09ad8f7e":"getNumChildOperation(bytes32,uint8)","09ad9dd3":"BASE_PRICE_IN_WEI()","09ae2943":"stage_3_TokensSold()","09ae9452":"PreICOProxyBuyer(address,uint256,uint256,uint256,uint256)","09aea85f":"getMaxTradeAmount()","09af014f":"refillBalance()","09af4b1e":"IoexCoin()","09af8ffe":"guessAnswer(bytes32)","09b0245f":"Long()","09b0ce3c":"DCVToken()","09b13db0":"fundraisingReservation()","09b17085":"___proxyOwner()","09b22a4d":"allowAirdrop()","09b230cd":"getPriceSpeedTokenBlock()","09b258f7":"exchangeRateIco()","09b2996a":"originalRate()","09b30ed5":"afterExecute(address)","09b481b0":"LIABILITIES()","09b565f3":"updateTicketSum(address,uint256)","09b5e4ad":"ProxyBuy(bytes32,address,uint256)","09b637bc":"_founder()","09b70ad0":"sellGenes(uint256,uint256)","09b7c704":"addIdArrayItem(address,uint256,string,string,address)","09b86f84":"getPonziFriend(address)","09b8e3cc":"ValidateExec(string)","09b8f77a":"proposedRecoveryKey()","09ba4a4a":"registerEmail(string)","09bb03b4":"isChemistry()","09bb317d":"FredToken()","09bb7162":"createGateway()","09bb9267":"getDev()","09bb9b04":"isEtherSpaceBattle()","09bc1812":"setVerificationPeriod(uint256)","09bc4096":"developersTokensPercent()","09bc4933":"freezeof(address)","09bc90a4":"PerlToken()","09bd1d41":"testF1(uint256)","09bd3894":"SendTokens(address,uint256)","09bd5a60":"hash()","09bd98a4":"getNumAds()","09beb01b":"feed50(uint256)","09bf284c":"unanchor()","09bf6e42":"futureSaleVault()","09c0f771":"getScoringMask(bytes8)","09c110a1":"gzeFromEth(uint256,uint256)","09c12ccb":"getNextPaymentDate()","09c1a4b9":"totalIssuanceData()","09c25e6c":"FinishedExporting()","09c2b7f8":"MINCONTRIBUTION()","09c38bc8":"isAuctionManager()","09c4a273":"isVetted(address)","09c4bb2b":"releaseTime(uint256)","09c4f8be":"GetContractStateTerminatedOK()","09c51b4e":"assertSaneHTLC(uint256,int256)","09c5eabe":"execute(bytes)","09c5eb76":"getBalanceOfLogicContract()","09c62a1b":"ONECToken()","09c62c5c":"vanbexTeamAddress()","09c71690":"tokenFallbackBuyer(address,uint256,address)","09c72b26":"bonusInPhase6()","09c76571":"operationAt(uint256)","09c922e6":"setOracleGasLimit(uint256)","09c975df":"getCallContractAddress(bytes32)","09c99d10":"_stalemateTransfer()","09ca4b76":"getCurrentPriceAuction(uint32)","09ca60c1":"createLambo(uint256,address,uint64)","09cb22d5":"betFeePerMil()","09cc4f95":"increaseTS(uint256)","09cc5551":"topUp(string)","09ce4a91":"RLCPerSATOSHI()","09ceb7be":"icoAmountBonus2()","09cf0329":"StarterKit(address,address,address,address,address)","09cf8766":"grantPrivatePurchaserToken()","09d02b74":"getRamdomness()","09d03d90":"FounderUnlock(address,uint256)","09d0b12e":"ViewMyTokens(address)","09d0bb66":"NeodiumNetwork()","09d11c1d":"ZhangToken()","09d2100d":"ADEToken(uint256,uint256)","09d256fe":"getPresaleRate()","09d2d0b9":"setServiceAccount(address,bool)","09d31d8d":"addPerson(bytes32,address)","09d33f1d":"addRequest(address,uint256)","09d37704":"pushIssuer(address)","09d3cbda":"setUpdateDelay(uint256)","09d451ab":"calculateEthersAmount(uint256)","09d45f1d":"_deleteString(bytes32)","09d46057":"IcoStageStarted(uint256)","09d54b21":"checkAddressTransfer(address,uint256,address)","09d60069":"trade(int256,int256)","09d60db1":"claimedTokensWallet()","09d64774":"DevForceOpen()","09d6796f":"our_transferFrom(address,address,uint256)","09d6b0a3":"transfer(address,uint256[],uint256[])","09d6d33a":"NewCup(address,bytes32)","09d74cc5":"createJockey(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","09d77ad3":"Next(bool)","09d78e32":"ETCLocking(address,address)","09d78fba":"assertEq4(bytes4,bytes4)","09d7ab7a":"convertGene(uint8[7])","09d7e9ca":"decodedAsset()","09d84fc4":"bindingSmartIdentity(bytes32)","09d87ab5":"isAddressAuthorized(address,address)","09d89784":"TradeNetCoin()","09d8da2e":"isLock()","09d929d6":"releaseLockFounders1()","09da52a2":"greet(address,string)","09da56c1":"getBoardBalance(uint256)","09db5d29":"notUsedToken()","09dba083":"GC()","09dc66af":"GT(uint256,string,string)","09dd0e81":"getBlockchainHead()","09dd1761":"attachPreOrder(address)","09dd7b3e":"paySize()","09ddc583":"getPropertyData(uint16)","09de4148":"getWinPercent()","09de92d0":"RENEE()","09df06b7":"TIE()","09df3248":"publicGetParticipants(uint256)","09df5060":"logoutUser(address)","09dfdc71":"currentPyramidBalanceApproximately()","09dfe330":"_checkItemId(uint256)","09e0a77c":"totalIco()","09e0a9eb":"batchBid(uint256[])","09e1a1f7":"PresalePurchase(address,address,uint256)","09e1c751":"CDPer()","09e24516":"ZepCloud()","09e25141":"bidInAuction()","09e2f193":"addVerificatorAddress(address)","09e419d1":"withdrawLongTermFoundationBudget()","09e587a5":"homicide()","09e6a0ed":"EASTADScredits()","09e76161":"getVideoGameDetails(uint256)","09e785e1":"payoutInterval()","09e7d837":"reachGoal()","09e7ec7a":"getInt256Max()","09e8046a":"fullfillAdvisors()","09e91cfb":"tokenUnits()","09e979e6":"getSquarePriceAuction()","09e9976d":"MetadataUpdated(address,uint256,string)","09e9c325":"createBooking(uint128,uint128,uint32,uint32,uint256,address)","09e9d7e2":"removeCandidate(uint256)","09e9e85b":"readAllUsers()","09ea63e3":"recoverPreSigned(bytes,bytes4,address,uint256,bytes,uint256,uint256)","09ebcd64":"getLockedUserInfo(address,address)","09ec6cc7":"cancelTrade(uint256)","09ece618":"initiatable(bytes32)","09ecf413":"updateFoundAddress(address)","09ed1782":"withdrawCredits(uint256)","09ed4607":"clone()","09ed5022":"checkFileNamespace(string,bytes32)","09ed5673":"getScouponTransferCost()","09edf3ca":"x_Header()","09ee3e2a":"Global_Currency_Reserve()","09ee75a2":"documentIt(uint128,uint64,bytes32[],string,string,string)","09eecdd7":"isValidBet(uint8,uint256,uint256)","09eef43e":"hasVoted(address)","09ef7085":"is_name_used(bytes32)","09efcb8d":"fiatDeposits()","09f03da2":"getCurrentTimeRate()","09f0fe0d":"lamdenTau()","09f14a20":"addBuyerSig(string,string)","09f14e7e":"ownerSetExchangeRateInWei(uint256)","09f28927":"Crowdsale(address,address,address,address,uint256,uint256,uint256)","09f29d1b":"retrieveTokens(uint256)","09f2b6a9":"TokenBCC(uint256,string,string)","09f30eac":"unitTestSetRewardLevels()","09f32957":"lastCreditorPayedOut()","09f3ad26":"calcBonus(uint256)","09f4614d":"product1()","09f4fc61":"addReferral(address,uint256)","09f580b0":"Bolivar()","09f5ca99":"GLBToken()","09f64d2e":"isIcoPaused()","09f68e96":"setPrivateSale(address)","09f6c607":"currentEthBlock()","09f70d2e":"getRequestHash(bytes,address[],uint256)","09f767e0":"deathFactor_iv()","09f80dd9":"feerate()","09f8477a":"getRandom(uint128,uint256)","09f8cc58":"upgradeAgentLocked()","09f90127":"fallback(address,bytes)","09f92a6a":"wordSize(string)","09f9630f":"BETHToken(address)","09f9b3c5":"getGrantBalance()","09fa6f96":"wpTokensBaskets()","09fa90b3":"globalLocked()","09fb1668":"changeMaxBetCoinDice(uint256)","09fba360":"alreadyHarvestedTokens()","09fbb22c":"decreaseGlobalInterestAmount(uint256)","09fc1ae0":"getCallTable(uint256)","09fc3c53":"burnWarrior(uint256)","09fc7046":"bytesToBytes2(bytes)","09fc8f6d":"isTokenUpgraded(bytes32)","09fc93c1":"getBalanceOfWei(address)","09fca951":"accumulated_from()","09fcda87":"PayPerView()","09fd018e":"setClaimer(uint256,address,uint256)","09fd8212":"isInWhitelist(address)","09fe5fbd":"CoinPaws()","09fe89c8":"privateBuyer()","09ff453a":"PFS()","09ff4b75":"Redenom()","09fffec0":"transferToAdmin(uint256)","0a0078bc":"unSet(address,address)","0a00840c":"challenge_period()","0a0092bf":"LakersvsRockets()","0a00ee41":"INNOToken()","0a0155e5":"passed(uint256)","0a01ad4d":"processWinner()","0a01ae41":"Supernova()","0a01bc2f":"WhitelistAddressisListed(address)","0a02037b":"girlOps()","0a0209d0":"soldTokensOnPreIco()","0a027825":"currentUnit()","0a0279f8":"determineDiscountTranche()","0a0313a9":"iterateValid(uint256)","0a0352d5":"_getOwnerNFTCount(address)","0a04dde8":"ThanosXToken(uint256,string,uint8,string)","0a0513da":"IEOEnded()","0a06f35e":"setBonusesForAmounts(uint128[],uint32[])","0a075a32":"spawnNewZeroCard()","0a07eadd":"systemWalletsMint(uint256)","0a07f3d8":"contains(uint8,uint8)","0a084473":"tokenPerEth()","0a08de75":"isContruibuteOpen()","0a0900a1":"buyXname(bytes32,uint256,bytes32)","0a09284a":"endsAt()","0a09815c":"presaleTokens()","0a0a2876":"killVesting()","0a0a876f":"stopSetPrice()","0a0b3139":"testFailOnFailedTransfer()","0a0c5e0d":"addSignature(string,string)","0a0c75aa":"setEmployeeSalary(uint256,uint256)","0a0cd8c8":"setupDone()","0a0d5509":"computeTimeBonus(uint256)","0a0e3c76":"nextMintFeeProp(uint256)","0a0e7883":"nDelegations(bytes32)","0a0e78e3":"addNOSPackage(uint256,uint256)","0a0f8168":"ceoAddress()","0a0fac2b":"isProxyOrSender(address)","0a0fb66b":"transferPreSignedHashing(address,address,uint256,uint256,uint256,uint256)","0a10376f":"newReplyEvent(uint256,uint256,string,string,uint256)","0a107ac3":"setPI_edit_19(string)","0a10df7c":"bookingId()","0a114a70":"extendExpiration(uint256)","0a12a7a0":"LogContribute(address,uint256)","0a12c89e":"BTImint(address,uint256)","0a12c90f":"AddNewChallenge(uint256,uint256,uint256,uint256,bool,string)","0a1432f7":"openResult(uint256,uint8[])","0a14504c":"participate(bytes32)","0a14849e":"setOpenBetIndex(uint256)","0a15299b":"TourCash(uint256,string,string)","0a15a07f":"removeUnicorn(address,uint256)","0a15d3a8":"ETFT(uint256,string,string)","0a16605e":"receiveSpendingDeposit(address,uint256)","0a16697a":"targetBlock()","0a16916a":"RESERVE_POOL_TOKENS()","0a16a53f":"setCitizen(address)","0a16e225":"getrestrict(address)","0a16efc0":"_addCommittedValidator(uint256,address)","0a17d422":"isZero(uint256,string)","0a1856db":"Billing(address,address)","0a18c334":"Denar()","0a18edfa":"returnCouponProportion(address[3],bytes32)","0a18f6c1":"playForcibly()","0a19283c":"_createCryptsy(uint32,uint32,uint32,address)","0a1930b7":"LogDonation(address,uint256,uint256)","0a193612":"setCountry(address)","0a19b14a":"trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)","0a1a677e":"searchtickets()","0a1a802e":"MatchPay()","0a1ab7fc":"arrayOfAccountsThatHaveClaimed(uint256)","0a1ceb0e":"usableBalances(address)","0a1dfb5a":"nextNextBid()","0a1e3a2c":"publishExecution(string,string,string,string,string,string)","0a1e71de":"isIco(uint256)","0a1e7701":"AtraOwner()","0a1e7a89":"getStudentRequest()","0a1e9f5e":"TokensOut()","0a1f0d9b":"reCap(uint256)","0a1f194f":"removeTrader(address)","0a1f5862":"minedTokenCap()","0a1f868c":"fuint256a(uint256[])","0a20aba4":"investOtherCrypto(address,uint256)","0a213e5b":"TWIMToken()","0a2282ae":"JackPot()","0a22ee73":"accountExists(address,uint8)","0a24c5bb":"yearlyMintCap()","0a262f48":"setPreActiveTime(uint256)","0a276680":"transferOwnership(address,uint256)","0a27813d":"finalizedHoldingsAndTeamTokens()","0a28c664":"tokensOfWithData(address,uint256)","0a298034":"getFreeBulls()","0a29f508":"uploadSignedString(string)","0a2a9a01":"addWallet(address,uint256)","0a2ad0f3":"resetState(address)","0a2c0c65":"getAvailableVolume(bytes)","0a2cafac":"BPRchain()","0a2d31ad":"addToOptionChain(uint256,uint256[],uint256[],bytes32[],address[])","0a2d7629":"month12Unlock()","0a2d967b":"stopThisIco(bool)","0a2df1ed":"callSender(bytes4)","0a2eb301":"isAdministrator(address)","0a2ebc39":"NVISIONCASH()","0a2fd551":"ValidateKey(address,bytes32)","0a323fd0":"Boardcoin()","0a33cd41":"seIcoAddress(address)","0a35a7b1":"saleTierList()","0a36645f":"getShopOwnerProductList(string)","0a377f3a":"reserveKNCWallet(address)","0a384665":"maxTokensAmount()","0a38b400":"intermediadorAprovaDevolucao(bool)","0a394245":"doesReferralCodeValid(string)","0a39e222":"transferFromReserve(uint256,address)","0a3a0531":"manualContribution(address,uint256)","0a3b0a4f":"add(address)","0a3b1cd2":"setHotwallet(address)","0a3b7d9b":"TokenMacroansy()","0a3c000d":"buyerSymbol()","0a3c3088":"ARIZONE()","0a3c34fb":"successfulTransactions_()","0a3c4dbe":"merculetPrice()","0a3cb663":"freezePeriod()","0a3d7cce":"assertEq27(bytes27,bytes27,bytes32)","0a3dfba7":"giftCharacter(address,uint8)","0a3dfd10":"KittenTalked(string)","0a3e5712":"revokeWithdrawConfirmation(uint256)","0a3ecdfe":"drawNumbers(uint32)","0a3f013f":"releaseTimestamp()","0a3f5897":"placeBetEth()","0a401086":"operational()","0a402742":"allocateNormalTimeMints(address,uint256,uint256,uint256,uint256)","0a402a32":"LadaToken(uint256,string,string,uint8,address)","0a40878a":"EXSCoinSeller()","0a40f15f":"fundDeal(string,address)","0a40fb8c":"permissionMarker(address,bool)","0a412ae4":"aboveMinimumPurchase()","0a41442f":"setNewWallet1(address)","0a41dfee":"cancel_face_proof_request()","0a425a33":"getTreeIds(address)","0a42f86f":"getFrequency()","0a44b9cf":"amountIAmOwed()","0a4543ec":"MonoretoToken(uint256)","0a4625af":"totalEthers()","0a4655dd":"insert(bytes32,address)","0a46706b":"toCom(uint256)","0a47185d":"calcNav(uint256,uint256)","0a4740ff":"disableSale()","0a47a7a6":"mutiTransfer(address,address[],uint256[])","0a48dcb3":"appendUint8ToString(string,uint8)","0a49646b":"CreationRate()","0a49dece":"getDevelopmentFundBalance()","0a49e536":"getPoolAmounts(uint256)","0a4a3f0a":"GetConfirmRound(uint32,uint8)","0a4a57bc":"contain(uint256[],uint256)","0a4bb260":"buyItemAndApply(string,uint256)","0a4bfa6d":"IMDEXwithdrawToken(address,uint256)","0a4c374a":"birthPerTen()","0a4c6a45":"TEAM_UNFREEZE()","0a4caed0":"getChannelByRank(address,uint256)","0a4d564c":"TieUpLooseEnds()","0a4d7cd7":"setUserIdentityDocs(string)","0a4da2d4":"MyAdvancedTokenV2(uint256,string,string)","0a4dea01":"VETRI(uint256,string,string)","0a4fa201":"View_TrustlessTransaction_Status(uint256)","0a50e361":"generateNumberWinner()","0a513bc7":"CMBUpgradeableToken(address)","0a518754":"periodICOStage4()","0a52d194":"payCommission(address,uint256,uint256)","0a55fbfe":"getMember(address,address)","0a56094d":"AriesToken()","0a56293d":"lockTokens()","0a564a03":"rateRound2()","0a569e8a":"currShares(address)","0a56a5f3":"nfsPoolLeft()","0a597da7":"impl_additionalRewards()","0a5988a8":"Term()","0a59b81b":"mesasCreated()","0a59bf2d":"setPersonalisationCost(uint256)","0a59c66e":"AuctusTokenVesting(address,uint256,uint256,uint256)","0a5a00c1":"recovery(address,address,uint256)","0a5a1e9a":"withDrawTips()","0a5a4e17":"AMBASSADOR_STAKE()","0a5a5b11":"releaseSecond()","0a5ab11d":"vestingWallet()","0a5ccb2a":"reclear(address,uint256,uint256,uint256,uint256,bool)","0a5cced2":"bookRoom(string,uint256[],uint256,address,bytes32,uint256,bool)","0a5cf9bb":"NeuralControl()","0a5dc24d":"getAuthorisationStatus(address)","0a5dc5a9":"blockMessagesFrom(address)","0a5de7bb":"midOf(uint256)","0a5ee9b0":"StakeReleased(uint256,uint256,address,bytes32,uint256)","0a5f558e":"mintInitialSupply(uint256[],address,address,address)","0a5f80f4":"publicAddDeposit(address,uint256)","0a6076b3":"SellableFund(uint256)","0a612095":"replaceToken(address[])","0a6184ce":"oneHundred()","0a623a11":"determineOutcome(uint8[],uint8[],uint8[],bool[],uint256)","0a62db33":"YToken(uint256,string,string)","0a639726":"oldPriceChangeBlock()","0a639ed1":"safeDiv_dec(uint256,uint256)","0a63ae38":"NukeContract(address)","0a64143a":"totalWithdrawn(address)","0a642d00":"retrait_3()","0a64bdb1":"_verifyOptionPoolDefray(address)","0a66d698":"isSealed(address)","0a67d2c7":"withDraw(address)","0a67dfbb":"setTeamTokenHolder(address)","0a681f7f":"NEXT_POT_FRAC_BOT()","0a68f374":"getATitty(uint256)","0a692347":"withdrawBack()","0a6a3f00":"B3nsToken()","0a6aec63":"cloneActiveToPlayed()","0a6b378c":"pushTokenId(uint256)","0a6be0e7":"BalancedPonzi()","0a6bea46":"principle(string)","0a6c0642":"frozenPortions(uint256)","0a6ee71a":"VISTACrowdSaleP1(address,address)","0a6ee947":"lockupContract()","0a6f2fbb":"setAllowDrawETH(bool)","0a6f5d8e":"_jackpotTax(uint256)","0a6fbb05":"SetPass(bytes32)","0a703549":"__forward(uint256)","0a70c0fd":"getTogglePrice(uint256)","0a70cae0":"getBalance2()","0a71943f":"PresaleToken(address)","0a71d020":"adjustFeaturePrice(uint256)","0a720fa9":"MemberSoldToken(address,uint256,uint256,uint256,uint256,uint256)","0a7258d8":"setNameWriterId(address,bytes32,bytes32)","0a728b85":"MakeSellOrder(bytes32,address,uint256,uint256,address)","0a732dac":"getCrowdsaleAddress()","0a7354d9":"getOwnedShipsByAddress(address)","0a738326":"Whitelist(uint256,address,bool)","0a738559":"AitasChain()","0a73f7c4":"GNNM(uint256,string,string)","0a740f74":"checkDatesPayment(address,uint256)","0a7493b4":"Etheropt(uint256,string,uint256,uint256,bytes,address,int256[])","0a74a181":"updatefundendtime(uint256)","0a756f09":"StorageFund()","0a762b42":"PROMETHEUS_VOUCHER_PRICE()","0a766cfa":"sellCommission()","0a77b078":"Exchange()","0a77c3ed":"saleDuringRefundPeriod()","0a781bf4":"iCASH()","0a78e560":"PlayerNeedRefresh(address,uint256)","0a790e19":"MAX_ATHENIANS()","0a790eb7":"services(bytes32)","0a798f24":"openChannel(address,address,uint256)","0a799557":"setStartRefund(bool)","0a7a0807":"evaluateBet()","0a7a1c4d":"action()","0a7a2fef":"emitCapabilityRemoved(address,bytes4,uint8)","0a7a37bc":"setMonkey(string)","0a7a783a":"addOrg(address,address,string,string,string,string,uint8)","0a7a8c0a":"ItemMarket()","0a7c1922":"bitexlive()","0a7c1c35":"mItems(uint256)","0a7c1e9f":"NebeusToken()","0a7cf2aa":"weiHardCap()","0a7d29aa":"checkFunding()","0a7ead50":"_processPresalePurchase(address)","0a7f4239":"getAccountFundContract(address)","0a7f565f":"Intermediary()","0a7f734e":"_processTx(address,uint256)","0a7fb746":"removeMilestoneFrom(address,uint8)","0a7fc3df":"Sentivate()","0a80e725":"isReserveSupplyAssigned()","0a80ef45":"getIsClosed()","0a811fcc":"DigitalPesoCoin()","0a82f06b":"deleteCoverImage(uint256)","0a82fd1c":"deletePortfolio(uint256)","0a834ac0":"START_TGE()","0a85107a":"LogTransfer(address,address,uint256)","0a85bb25":"isAuthorized(address,address,bytes)","0a864240":"TMBCStandardToken(uint256,string,uint8,string)","0a866f3a":"addThing(string,bytes32,bytes32,string)","0a86f644":"test_0_testBasicTxExecution()","0a87391c":"investorsAccounts()","0a874df6":"lookup(uint256)","0a87557c":"ICO_END_TIME()","0a883790":"payrollCount()","0a888a63":"operation_address(uint256)","0a8972f9":"LoveAirCoffee(uint256)","0a898428":"nodesVars()","0a89e0aa":"switchModeSoOnlyEmergencyStopsAndEscapeHatchesCanBeUsed()","0a8a2485":"invite(address,bytes)","0a8b88f6":"SECOND_VOLUME_BONUS()","0a8bcdb9":"withdrawFromReserve(uint256)","0a8c138e":"NAABHAToken()","0a8c1551":"EtherAsset()","0a8d032d":"QuantumToken()","0a8d5fb8":"techProvider()","0a8e891f":"Medcash()","0a8e8e01":"test3()","0a8ed3db":"grantPermission(address,address,bytes32)","0a8f8fb9":"advisersReserve()","0a8fed89":"setup(uint256,uint256)","0a90011f":"setStatus(address,uint256,uint8)","0a90c704":"createCommunity(string,string,string,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)","0a9110b2":"NewDataRequest(uint256,bool,string)","0a919e3c":"QUEENTEN()","0a91cad0":"nextReleaseDate()","0a91f2a5":"get_owner_of(address)","0a9254e4":"setUp()","0a92b264":"getRandom(address,uint256,uint256,uint256)","0a934b9d":"mainSaleAllocations(address)","0a94031c":"GigaProfitIn(uint256,string,string)","0a94ece7":"nextUpgradeAgent()","0a95011e":"getCreateMarketNumTicksValue()","0a95c49d":"closeOutSweeps()","0a95dbfa":"approveUser(address,bytes32)","0a9626ba":"setLiqPrice(uint256)","0a968d5e":"issueFirstRoundToken()","0a979511":"gcExchangeRate()","0a9848ac":"setAdminlist(address,bool)","0a986540":"chinainc()","0a988892":"saveCurrentArbitrationFees(address,bytes32)","0a9a70c0":"changeDevFeesAddr(address)","0a9a7842":"logAllStop()","0a9aa521":"callAMethod1(uint256,uint256,uint256,uint256)","0a9ac3d0":"getMarketerAddress(bytes32)","0a9ae69d":"bb()","0a9d4e95":"_buy(uint8,bytes6,uint32,uint32)","0a9de288":"distributeTokens(address,address,address,address,address,address)","0a9e24c1":"addBurnWallet(address)","0a9ef927":"newTimeLockedWallet(address,uint256)","0a9fc06f":"verifyProposal(bytes32,address,address,uint256,bytes32,string)","0a9fec36":"sPeriodSoldTokensLimit()","0a9ff623":"voteUID()","0a9ffbf9":"confirmDividend(uint256)","0a9ffdb7":"allocateToken(address,uint256)","0aa0903c":"MINIMUM_PRESALE_PURCHASE_AMOUNT_IN_WEI()","0aa0bd00":"getPartyB(bytes)","0aa0fbe5":"netContractBalance()","0aa1ae29":"SMCT()","0aa1ee4c":"membersWhiteList()","0aa20e73":"multiTransfer(address,address[],uint256)","0aa24f50":"adjustInvestorCount(address,address,uint256)","0aa28f09":"splitInService()","0aa2b673":"cumReqMarbles()","0aa2bbaa":"lastWillAccount()","0aa2bf7f":"test_26_assertGasUsage2000Boards()","0aa34c7c":"updateJMAmount(uint256)","0aa3ae7e":"refill(address,uint256)","0aa46c12":"testClearBitFailIndexOOB()","0aa5418f":"IrfanFr()","0aa56368":"claimSocialNetworkIdentity(uint256,uint256,address,uint8,bytes32,bytes32)","0aa59fe3":"miningFivePlat()","0aa5aa2d":"transferAndNotify(address,uint256,uint256)","0aa6d45d":"oraclize_randomDS_proofVerify__main(bytes,bytes32,bytes,string)","0aa7881a":"MintableToken(int256,uint256)","0aa79fc6":"refundParticipant(address)","0aa83f5a":"consume(uint32,uint32)","0aa86791":"NujaBattle()","0aa93fff":"updateBytes32s(bytes32[],bytes32[])","0aa9a4fb":"payPrize(address,uint256,uint8,uint256,uint256,uint256)","0aa9c58b":"fillOrKillOrder(uint256,bytes)","0aaa9e46":"TNT()","0aaba432":"salesVolume()","0aac1073":"getSwapOutgoing(uint256)","0aac5dfd":"getAssetsCount()","0aac8034":"prizeWinners()","0aad1f3b":"fechSumNumForCandidateByStage(address,uint256)","0aae7a6b":"info(address)","0aaef916":"addManyWhitelist(address[])","0aafa40e":"IOVOToken()","0aafefb8":"QPay()","0ab03e1b":"testControlRegisterContractAgain()","0ab0c6c8":"getWinnablePot(uint256)","0ab174a3":"untrack(uint256)","0ab21db7":"sencEthRate()","0ab2a9b8":"modifyJurySize(uint256)","0ab3bb1b":"totalFundingGoalInIBC()","0ab41690":"_forfeitShares(address,uint256)","0ab44f74":"AllNewsCash()","0ab4846c":"rewardLast7Draw(uint256)","0ab4c065":"subdomainOwner(string,string,string)","0ab4ca55":"registerNameXaddr(string,address,bool,uint8)","0ab4debd":"shortBuy()","0ab51bac":"aum()","0ab58ead":"SingularDTVFund()","0ab5bed4":"platformWithdrawAccount()","0ab66be3":"paySubscription(address)","0ab68776":"addDiscount(uint256,uint256)","0ab6ead5":"Ended(address,uint256)","0ab6fb36":"capitalPoolOf(address)","0ab6ff19":"addFullFundTX(uint256,uint256)","0ab757df":"withdrawEIP777(address,address,uint256)","0ab763d0":"polyCustomersAddress()","0ab77095":"assignUnitRafflePrize(address)","0ab7ec3a":"rejectProject(address)","0ab84ed9":"pivx()","0ab85a10":"getTotalRewards(uint32)","0ab880e5":"resumeBuy()","0ab8afac":"auctionContract()","0ab9059c":"OrphanToken(address)","0ab93971":"GetCount()","0ab9419d":"addint256(int256,int256)","0ab9db5b":"banker()","0aba73d7":"getDealById(uint256)","0aba8ec2":"brokerImp()","0aba980f":"unblockFundsInEscrow(address,uint256,address)","0abb691b":"buynode(uint256)","0abb8409":"getPoolETHBalance()","0abbf2de":"TeamLocker(address,address[],uint256[],uint256)","0abcbbcd":"makeShitClone(address)","0abd171b":"setinfo(string,string,string,address)","0abd2ba8":"tokenPause()","0abe293d":"addRefiller(address)","0ac0b31f":"calculateMultiplierAndBonus(uint256)","0ac10c0d":"createVesting(address,address,uint256,uint64,uint64,uint64)","0ac153ac":"lockMax()","0ac168a1":"blockReward()","0ac1a281":"CapRevealed(uint256,uint256,address)","0ac25e1a":"createPromoClown(uint256,address,bool)","0ac28725":"requestTradeDeal(uint256,uint256,string)","0ac298dc":"get_owner()","0ac2a1c7":"bonusDeliverTime()","0ac2ae27":"MarketContractOraclize(string,address,address,uint256[5],string,string)","0ac2ffc5":"getMiniByOwner(address)","0ac313e0":"setPlatAuction(address)","0ac3ccc4":"calcBUYoffer(uint256,uint256)","0ac42534":"isCancellable(address)","0ac50a6e":"CPCToken(uint256,string,uint8,string)","0ac51bd7":"getTimestampsFromPublishers(address[],string[],int256[],int256)","0ac5a67f":"paymentGateways()","0ac5f441":"paySellerForBuyer(uint256,address)","0ac62e02":"emergencyStop(bool)","0ac67e2f":"getLowPrice()","0ac7366b":"IRONtokenSale(uint256,uint256)","0ac799ff":"_transferXToken(address,address,uint256)","0ac7c7ba":"getBalanceMessage(address,uint32,uint192)","0ac8dc61":"GetLandId(uint256,uint256)","0ac924a0":"Minter(uint256,address)","0ac94000":"executeRequest(uint32)","0ac96103":"getBaseUrl()","0ac9bb29":"nextSeedHashed()","0ac9d35f":"_getRandomNumber(uint256)","0aca08ca":"closeGiveAway()","0aca7403":"process_swap(address,address,uint256)","0aca9de0":"placeLong(address[2],uint256[7],uint8,bytes32[2])","0acaad4c":"getWeiContributed(address)","0acae9a7":"publicEnd()","0acb4c28":"activateOracle()","0acc4382":"getMinDailyWithdrawLimit()","0acdc3ef":"_Doihave(uint8)","0acdd69f":"TOTAL_SOLD_TOKEN_SUPPLY_LIMIT()","0ace8c9a":"addPackage(string)","0ace9469":"setmaxContribution(uint256)","0acf0b8e":"admin_add_modify(address,uint8)","0acf473b":"AdminCloseContract()","0acf4b0b":"createPromoToken(address,string,uint256)","0ad0a0f3":"setPurchaseValues(uint256,uint256,address,bool)","0ad137c4":"Provide(address,address,address,address)","0ad182bc":"getTickets(address)","0ad1c2fa":"getContract(address)","0ad2074c":"logFailedSweep(address,address,uint256)","0ad20914":"getRequestByRequesterAddress(address)","0ad23aad":"getNumberOfRatingForAddress(address)","0ad24528":"end(uint256)","0ad27798":"depositPresale(address,uint256)","0ad40377":"KYCPresale(address,uint256,uint256,uint256)","0ad40df1":"setConfiguration(uint256)","0ad4b97b":"fibonacciIndex()","0ad50c02":"buyPropertyInETH(uint16)","0ad54c03":"playerRefundBet(bytes32)","0ad59fa2":"CocaCola()","0ad63730":"virtuePlayerPoints()","0ad65128":"logPresaleResults(uint256,uint256)","0ad6aa28":"currentstagedata()","0ad6ac85":"pay(uint256,uint256,address)","0ad7f29f":"CampaignManagerContract(address,address)","0ad80f41":"WorldTrade(uint256,string,string)","0ad95b44":"bribery()","0ad98d71":"showTotal()","0ad9cf6f":"_resetTransferredCoinFees(address,address,uint256)","0ad9d052":"model()","0adaa7bf":"expireAssociate(address)","0adae972":"detailsOf(address)","0adb1354":"RimuoviProfessore(address)","0adcaddc":"iterate_valid(uint256)","0adcdbaa":"redeemRate()","0add0baa":"maxInvestments()","0add8140":"pendingProxyOwner()","0adde487":"getPurchaseLimit()","0ade4942":"tokenPriceProvider()","0ade7142":"terminateDirectDebit(address)","0ade9429":"getNext(uint256,address,uint256,uint256,uint256)","0adeb700":"changeQuarterlyRate(bytes32,uint256)","0adf331b":"stateSuccess(uint256)","0adf7912":"TokenDestroyed(uint256,address)","0adfb4e2":"Elemental()","0adfba60":"callSelf()","0adfdc4b":"setAwardedInitialWaitSeconds(uint256)","0ae08793":"confirmAndCheck(bytes32)","0ae100d8":"addOrganFunction(address,string)","0ae1b13d":"post(string,string)","0ae1fac0":"startICOStage4()","0ae25ca3":"withdrawToTeamStep4(uint256)","0ae31fbd":"setDistrictAddress(address,address)","0ae32e72":"ZhangHongBinToken()","0ae50a39":"GetOwner()","0ae5e739":"grantAccess(address)","0ae66820":"getBuyCost(uint256)","0ae75eb8":"amountOfBRAsold()","0ae7a310":"tokenMeta(uint256)","0ae80c37":"kickStartMiniICO(address)","0ae870bd":"Mjolnir()","0ae8f28f":"getProposalTextArrayLength()","0aea47bc":"getTimer(uint256)","0aeacb5e":"getTotalRecords()","0aeb0f79":"UserCategorySet(address,uint256)","0aeb1552":"insertStrategy(bytes15,address,uint256,string)","0aeb4b26":"WorldCupControl()","0aeb6b40":"register(address,bytes,uint256)","0aebeb4e":"close(uint256)","0aeccc9c":"setScribe(address,address,string,string)","0aece23c":"getFeeAmount(int256)","0aed3c36":"testIsCase()","0aed3ca1":"getLoans(uint256)","0aed5a21":"NamiExchange(address)","0aed80f2":"secondSellPrice()","0aed8e72":"rotate(uint256,bool)","0aed9c45":"TicketsSoldForThisGame()","0aef8500":"amountFundAirdrop()","0aef8655":"PXLProperty(address)","0aefc573":"KyberHandler(address,address)","0aeffa65":"ETH_MIN_GOAL()","0af15f6e":"stopSellingGenes(uint256)","0af179d7":"setDNSRecords(bytes32,bytes)","0af1fe11":"getAllPRS()","0af23be2":"ETHERREDSupply()","0af39032":"testMintThis()","0af3e660":"getHolderId(address)","0af4187d":"getAllowance(address,address)","0af4626d":"testRetract()","0af4cd61":"setHalted(uint256)","0af658ca":"personUpdateActivity(uint256,bool)","0af6c9ff":"setColdWallet(address,uint256,uint256)","0af6f6fe":"changeAgentPermission(address,uint8)","0af72ad0":"isStrategy()","0af825da":"_transferInternal(address,address,uint256,bytes)","0af8bd95":"TIDAChain()","0af95750":"deactivateProject(address)","0af9d89c":"getPaintingGeneration(uint256)","0afa371d":"XMAX()","0afa6dde":"getAddressLost(address)","0afa9fb9":"contains(int256,address)","0afb9f1f":"getProposalByIdIteration(uint256,uint256)","0afc0a59":"computeTokens(uint256,uint256)","0afd21d2":"failSale(uint256)","0afd2778":"changeFundOwnerWalletAddress(address)","0afd548d":"setOperationContracts(address,address,address)","0afdca95":"impl_batchTransferMSM(address,address[],uint256[])","0aff2076":"getLastAuctionId()","0b009517":"YourToken()","0b00a111":"WhitelistUpdated(address,address)","0b00de8d":"unregisterWorkerAffectation(address,address)","0b00fd54":"TEAM_ADDR()","0b01517c":"getPlayerBalance()","0b01856d":"startPreICOTimestamp()","0b02177f":"testnetWithdrawn(uint256)","0b03ad11":"unregisterToken(address,string)","0b0608db":"LolaCoin()","0b070845":"Dagt()","0b073865":"share3()","0b0740ae":"getItemIndexToOwner(uint256)","0b077fe7":"Whales()","0b0788dc":"assertEq27(bytes27,bytes27)","0b0a4b17":"askHash()","0b0b6d5b":"supportImpeachment()","0b0bbd65":"addrToAsciiString(address)","0b0c2e80":"test_basicWithTwoAssertThrow()","0b0c564d":"Enter(uint256,uint256,bool,address)","0b0c8f1f":"initSmartToken(address,address,uint256)","0b0c92bd":"_isOperatorFor(address,address,bool)","0b0d031a":"fetchCreatedOrdersForPayer()","0b0d0eb7":"transferToBeneficiaries()","0b0e13d6":"closeStageTwo()","0b0edad3":"getBooking(address,uint256)","0b0f7743":"issuedCount()","0b100a5a":"policiesCount()","0b107904":"authorizeOne(address)","0b10bd1b":"HiroyukiCoinDark()","0b11a6e3":"ERGOIN()","0b11ed63":"getGenerationForWindow(uint256,uint256)","0b1200da":"setWalletContractAddress(address)","0b121c04":"createIssue(uint256,uint256,uint256)","0b12a148":"_distributeNewSaleInput(address)","0b12e7e2":"soowhat()","0b1350cf":"assetProxy()","0b1414c1":"oneStaIsStb()","0b14331f":"getExpiration(uint256,uint256)","0b151811":"getBonusByDate(uint256,uint256)","0b15650b":"randInt(uint256,uint256)","0b1573b8":"setRoundLockAmount(uint256)","0b181567":"exceed()","0b1851a9":"Billionscoin()","0b1a3144":"pushToApproved(address,uint8)","0b1a8e1e":"setMasterServer(uint32)","0b1a94e7":"validPurchasePresale()","0b1aff48":"extendTDE(uint256)","0b1b62fa":"transferBackMANAMany(address[],uint256[])","0b1b92dd":"FACTOR_11()","0b1b9aa5":"getluckyuser()","0b1ba852":"changeDepositCell(address,uint256)","0b1bf3e2":"Galleass(string)","0b1c45c9":"getPhiladelphiaBets(address)","0b1c4a75":"subFees(uint256,uint256)","0b1c5b76":"fetchVoteMainInfoBySnapshotBlock(uint256)","0b1ca49a":"removeMember(address)","0b1d366d":"getLastAwardInfo(uint256)","0b1dcc88":"buyCountry(uint8)","0b1dfa26":"fxpDiv(uint256,uint256,uint256)","0b1e400a":"_transferFromToICAPWithReference(address,bytes32,uint256,string)","0b1e5acc":"roleHas(string,address,address)","0b1e7f83":"posts(uint256)","0b1ec92e":"RoundCreated(uint256,uint256,uint256,uint256)","0b1f3850":"num_hosts_revealed()","0b1fc3c0":"getVendingAmountLeft(uint256)","0b210a72":"getDrugInfo(uint256)","0b2140ab":"buyUSD(address,uint256)","0b21d446":"setValidBwCaller(address)","0b225b42":"PHASE4_START_TIME()","0b2478b3":"getSaleIsOn()","0b247b1b":"CreateACI(address,uint256)","0b25cbb2":"Ftechiz()","0b261340":"marbleBalance(address)","0b269898":"setPricing(uint256[])","0b27fa51":"noOfTokenAlocatedForPresaleRound()","0b280a29":"isBatchActive(uint256)","0b2909e6":"addOwed(address,uint256)","0b294bdf":"GetPlayerDetails(address,address)","0b299630":"addItem(string,address,uint256,address,uint128)","0b2a6c70":"marketWine()","0b2acb3f":"add(address,bytes)","0b2accb2":"getPercentage()","0b2c588c":"setAdventureHandler(address)","0b2d25ca":"calculateCharityFee(uint256)","0b2e02c7":"migrateAgent()","0b2e7423":"maxSecurityGuardDelay()","0b2ee7e9":"create(uint256,uint256,uint256,bool)","0b2f6a7e":"_mintPlayer(uint32,uint32,address)","0b2f6cef":"m_hodlers()","0b2fce74":"addGardener(uint256,uint256)","0b305c62":"playerEndGameConflict(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes,bytes32)","0b305ce9":"destFoundation()","0b309c93":"Timer()","0b30ab4f":"bubbleSort()","0b30fc7b":"pastValues(uint256)","0b317697":"investorToken(address)","0b31fc3a":"DiamondToken()","0b341245":"activityAddress()","0b3464c3":"activeHeroGenome(address)","0b34f78c":"MintProposalAdded(uint256,address,uint256)","0b3532b3":"balanceSellingOf(address)","0b354090":"SimpleConstructorBool(bool,bool)","0b3598c6":"_sealDataStream(address,address,uint256,bytes32,uint256,bytes32)","0b35ea61":"stopGuess(uint256,bool)","0b35fe44":"VerifyEd25519(bytes32,bytes,bytes)","0b368627":"releaseOldData()","0b377a8f":"setNumIncorrectDesignatedReportMarkets(uint256)","0b38bae2":"_totalSupplyLeft()","0b393a9d":"MANHATTANPROXY1STAVE()","0b395d1e":"_addUserExperience(address,int32)","0b39aaa9":"privateEquityClaimed()","0b39c3e1":"requestLoan(address,address,bytes16,uint256,uint128,uint128,uint16,uint64,uint64,string)","0b39f18e":"setCardTokenAddress(address)","0b3a2ffd":"setRoyaltyInformationContract(address)","0b3af901":"proposePlatformWithdrawal(address)","0b3b2222":"TokenDistribution(address,address)","0b3bb024":"getTenant()","0b3bc259":"funderCount()","0b3cd070":"multiBet(uint256[],uint256[],uint256[])","0b3d7174":"prev_week_ID()","0b3e9c7b":"userEndGameConflictImpl(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address)","0b3ed536":"claimDonations(uint256)","0b3f191a":"disableChanging(bool)","0b3fe32d":"setHalfTimeAtkBoss(uint256)","0b407022":"migrateV1Upgrades(address[],uint256[],uint256[])","0b40ab43":"setBankAddress(address,address)","0b4130f2":"GenomaToken()","0b424b66":"HHDCToken(uint256,string,string)","0b42d1de":"BejonesStandardToken(uint256,string,uint8,string)","0b43c6e6":"CryptonCoin()","0b440f33":"initCrowdsale(uint256,uint256,uint256,address)","0b4438e5":"spinAll()","0b45e8db":"SALE_CAP()","0b464bf6":"blocksSinceLastBid()","0b4650a0":"FiatContract()","0b467b9b":"revoke(bytes)","0b47459b":"LAARToken()","0b480095":"teamAddressThreeTokens()","0b483f6e":"toAllow()","0b48af0b":"interestOf(address,address)","0b4964a8":"addDungeonNewFloor(uint256,uint256,uint256)","0b4a1ece":"VisibilityDerived()","0b4aca45":"__formatDecimals(uint256)","0b4b5d5e":"GamityToken()","0b4bb61f":"burnPercentage1000m()","0b4c72a9":"rejectProvider(address)","0b4ca1cd":"doResult(uint256,bytes32,bytes32,uint256)","0b4cf825":"getRandomColorType()","0b4da628":"IsPlayer()","0b4db63a":"Tratok()","0b4dfc77":"contractMint(address,string,bytes32,bytes32,uint256)","0b4e0513":"reserveTokenFund()","0b4efd9a":"RobotBTC(uint256,string,string)","0b4f12f6":"updateUser(string)","0b4f3f3d":"cancel(string)","0b4f79a1":"RejekiKita()","0b509e1d":"getCountOfCell()","0b513828":"parseChannel(bytes)","0b513ce9":"PonziBet()","0b51989a":"setData(address,string)","0b520ad5":"freePeriodDuration()","0b522abf":"closeCrowdsale(address)","0b549884":"matingPrice(uint256)","0b54cbfb":"setType(uint8)","0b5608f2":"PackageCoinPresaleOne(uint256,uint256)","0b566f33":"unlockedCollateral(address)","0b56d4c6":"airdropNum()","0b56f01c":"createAmountFromEXORForAddress(uint256,address)","0b573638":"ethToTokenTransferOutput(uint256,uint256,address)","0b57adc0":"Transwave()","0b57c487":"COVERCOINToken(string,string,uint8,uint256)","0b583982":"getUserProductCount(bytes32)","0b586f1a":"_emitWorkResumed(uint256,uint256)","0b58dc38":"SetNewBlockchainEnabled()","0b590c6b":"SingularDTVToken()","0b591195":"largestPenis()","0b5945ec":"setTokenURL(address,string)","0b597135":"onHardCapReached(uint256)","0b5982f0":"payOutDividend()","0b59a5c4":"purchasedCoins()","0b59df68":"withdrawEscrow(uint64)","0b5a006b":"currentYear()","0b5ab3d5":"destroyDeed()","0b5ad1c1":"UpdateSellAgentCreators(address)","0b5adfff":"getNumTickets()","0b5ba082":"stagesManager()","0b5c2307":"globChanceOwner(uint256)","0b5c3f87":"addReferral(address,address)","0b5ca8db":"issuedBounty()","0b5d1c3d":"testLessThanOrEqual()","0b5d69ab":"UpdateMaxBalance(uint256)","0b5d94f6":"getOrderPrice(address,address,uint256,uint256)","0b5e19b0":"getInvestSum()","0b5e2232":"HunxuHappyToken()","0b5e89f4":"icoStarted()","0b5ee006":"setContractName(string)","0b5f2efd":"setCurrentRate(uint256)","0b5f5ef1":"setAvatar(uint256,bytes)","0b5faf97":"claimWin(bytes32)","0b5fcf81":"enableAutoDividends(uint256)","0b605fcd":"tokensTo0xbtc_(uint256)","0b60ca88":"raisedSale2USD()","0b611241":"ieoStorageVault()","0b6142fc":"breach()","0b620b81":"withdraw(address,address,address,uint256)","0b6386d4":"KyberNetworkCrystal(uint256,uint256,uint256,address)","0b63b114":"freeTokens(address)","0b63fe95":"processPayment(address,uint256)","0b642d72":"recoverLostEth(address,uint256)","0b65108b":"merge()","0b654e7d":"finishedRaceCount()","0b663e63":"promoCount()","0b66c247":"scoreTeams(uint32,uint32[],int32[],uint32[],uint32,uint32)","0b66f3f5":"multisendToken(address,address[],uint256[])","0b6700d6":"getLogo()","0b6780aa":"extendSaleEndDate(uint256)","0b679d2c":"REQUEST_CANCELED_BY_CREATOR()","0b6826ca":"payDividend()","0b682cb8":"Quhabitat()","0b684de6":"CitizenOneCoin(uint256)","0b695449":"MiningUpgrade(address,uint256,uint256)","0b697362":"withdrawFromSubRound(uint256)","0b6b80b2":"sampleRegistry()","0b6bf29f":"partner1_will()","0b6c754b":"isSuccess()","0b6c9ac7":"airdroppedAmount()","0b6d3017":"overflow_upper()","0b6d715b":"createGame(string,uint256,uint256)","0b6d8d52":"createDAO(address,uint256,uint256)","0b6e01db":"total_bet_available()","0b6e46fe":"enableController(address)","0b6e6511":"convertToELIX(uint256,address)","0b6ebf86":"KWHTokenAddress()","0b6f0530":"test_twoInvalidEqBytes32Message()","0b6f2fad":"HashCoin(uint256,string,string)","0b6f46ed":"isPresaled(address)","0b6f5b3d":"ShrimpFarmer()","0b6f6e0d":"CanYaCoinToken()","0b6fc163":"claimSignerAddress()","0b6fcdb0":"getEnforceRevisions(bytes32)","0b70ce55":"Betfunding()","0b714b17":"AddHash()","0b71ff6a":"MTDCERC20()","0b72396c":"validateContractWithCode(address,string)","0b730fae":"ICOadvisor2()","0b731652":"Ethbet(address,address,address,uint256,uint256)","0b7373d6":"giveAllBack()","0b73aad0":"msgsWaitingDone(uint256)","0b74074b":"startPayouts()","0b743021":"TOKENS_TOTAL()","0b745a01":"setLockup(address)","0b747d91":"randomSeed()","0b74b620":"getChannelsParticipants()","0b74edc6":"testFinalHash()","0b74f633":"getTradeParameters(uint256,address,address,uint256,uint256,uint256,uint256)","0b7507ae":"getTaskAtIndex(uint256)","0b7623ba":"abs(int8)","0b779363":"checkVotingForChangeAdminAddress()","0b77fa28":"generateThemedSpinners(uint256,uint256,uint256)","0b781385":"nextCampaignBalance()","0b78f9c0":"setFees(uint256,uint256)","0b7abf77":"TOTAL_TOKENS()","0b7ad54c":"getContent(uint256)","0b7d1de1":"proofOfSMS()","0b7d6320":"crowdsaleAgent()","0b7d796e":"loop(uint256)","0b7ddd25":"setRaisedAmount(uint256)","0b7e4e7f":"substractNumber(uint256)","0b7e9c44":"payout(address)","0b7ef89b":"contributeToCampaign(uint256)","0b8021c4":"getPublishedTokens(address)","0b803b6b":"transferApprovedBalance(address)","0b80b4f9":"QuantaloopToken()","0b80f8d3":"invmod(uint256,uint256)","0b811cb6":"executeProposal(uint256,bytes32)","0b816045":"getRequestInfo(uint256)","0b81e216":"setAllowTransfer(bool)","0b82a541":"setIcoEndTime()","0b82d33d":"withdrawBalanceDifference()","0b83284e":"MinterFunction(address,uint256)","0b834864":"publicTransfers(address,address,uint256)","0b83de20":"ABI(bytes32)","0b841433":"agentApproval(address,uint256)","0b8440ec":"bonusTokenRateLevelTwo()","0b84cc4a":"Committees(uint256)","0b851937":"year4Unlock()","0b85877f":"isICAP(address,address)","0b85881c":"ceilLog2(uint256,uint256)","0b869824":"CeoAddress()","0b87572b":"communityDevelopmentSupply()","0b8762d1":"Block18Token()","0b87cf10":"crowdsaleActive()","0b88e06b":"testTokenBalance()","0b892e3f":"celebs(uint256)","0b8a7bf8":"coinbaseWallet()","0b8b709d":"_createDroneInternal(address)","0b8ba87d":"UnilotBonusTailEther(address)","0b8bbd5b":"webGiftEtherAmount()","0b8d0a28":"wallet2()","0b8d9d94":"createSportsBet(string,uint256)","0b8e845a":"burnFeeFlat()","0b8eebde":"gameEnd()","0b8f0b61":"sendCoinsToBeneficiary()","0b8f0e0a":"LIWUC()","0b901c82":"totalRepaidQuantity()","0b910f86":"PRESALE_MIN_INVEST()","0b91eaf9":"isValidated(address)","0b926ecd":"validStoreVal()","0b927666":"order(address,uint256,address,uint256,uint256,uint256)","0b93381b":"success()","0b936a77":"DuanZiToken(address)","0b93bf0d":"setRecruitHeroFee(uint256)","0b948684":"delegatedTransfer(bytes,address,uint256,uint256,uint256)","0b95c8ae":"aggiungiMsg(string)","0b962e8f":"AlphaChainConstructor()","0b96406a":"vestingMappingSize(address)","0b96740c":"changeMinimumContributionForAllPhases(uint256)","0b967584":"voteForCandidate(uint256,address)","0b967fd2":"remove_master(address)","0b967fe7":"assertEq18(bytes18,bytes18)","0b96e72e":"setBAS(bytes32,address,string)","0b972ff6":"weiPreCollected()","0b97bc86":"startDate()","0b97fc8d":"WeiPerTicket()","0b98107c":"dateFrom()","0b9830ba":"tokensIndexOf(address,bool)","0b9849ab":"WEChainCommunity()","0b98f975":"setBonus(uint256)","0b9902d0":"WithdrawPerformed(uint256)","0b99ccee":"ico2Ended()","0b9aa067":"isVerified(address,address)","0b9ac851":"getCurveUnset(address,bytes32,int256)","0b9adc57":"deleteBytes32(bytes32)","0b9b0e7d":"highRate()","0b9b8130":"registerMintedToken(address,string)","0b9b9602":"SalesWalletUpdated(address,address)","0b9bfa6c":"inCommunity(address,address)","0b9cae77":"KinetiQ()","0b9d5847":"getExchange(uint256)","0b9d98e9":"getTotalVolume()","0b9e9817":"CanaryV7FastTestnet()","0b9ea6c8":"getCurrentSold()","0b9ea95d":"configureSaleClockAuction(address,uint256)","0b9f1e76":"wphcToken()","0b9f2816":"nowwww()","0b9f2ca6":"getCountBuildings(uint256,uint256,bool)","0b9f6108":"divsm(uint256,uint256)","0b9fc8fb":"checkerSign(bool)","0ba0a3a1":"TakerSoldAsset(address,uint256,uint256,uint256)","0ba12c83":"commitUpgrade()","0ba1772d":"callDistributed()","0ba1f7ad":"getImpactCount(string)","0ba234d6":"cancelRecovery()","0ba24e4c":"customers(address,address)","0ba27775":"fondToken()","0ba2e8a8":"allowFunding()","0ba46624":"setBountyAgent(address,bool)","0ba4d242":"s43(bytes1)","0ba5890a":"noteBallotDeployed(bytes32)","0ba6d271":"updateFunds(address,uint256)","0ba7ebe2":"changeAll(address)","0ba8916f":"updateMeterKey(address)","0ba8d735":"purch(address,uint256)","0ba8ebec":"lockance(address)","0ba92878":"delOrganizationCertificate(string)","0ba95909":"getMaxAmount()","0baaaed9":"setConfigBytes(bytes,bytes)","0bab4d84":"setClearingPriceSubmissionDeposit(uint256)","0bab718f":"updateCurs(uint256)","0bab7ff6":"messiCommunity()","0bac0312":"TryUnLockBalance(address)","0bac15ae":"PUBLICSALE()","0bac2850":"setFunctionFourPrice(uint256)","0bac3c01":"isDeferred(address)","0bac9fe7":"getUsernameByIndex(uint256)","0bad342a":"EscrowContract(address,address,address,address,uint256,uint256,uint256,uint256)","0bad4481":"setupRegion(address[16],uint256,uint256,uint256[],bool,uint8[128])","0bae2129":"affiliateTree()","0bae3288":"getSale()","0bae461c":"KomicaToken()","0baf0bcc":"lockDateTimeOf(address)","0bb0482f":"concatBytes(bytes,bytes)","0bb0e827":"add_addys(address[],uint256[])","0bb15acc":"GoldeaToken(uint256)","0bb18da2":"saveRefundJoinId(uint256,uint256)","0bb24375":"ITX_Token()","0bb25901":"freezeSupply(uint256)","0bb2cd6b":"mintAndFreeze(address,uint256,uint64)","0bb3a066":"unsetAdministrator(address[])","0bb4bbaf":"testInitialNumberOfVoters()","0bb4e6f4":"getTotalWei()","0bb536a2":"fightMix(uint256,uint256)","0bb563d6":"logString(string)","0bb5e62b":"EGC()","0bb700dc":"getStats(bytes32)","0bb7a81a":"ZhuhuaToken()","0bb8b9c3":"zint_convert(string)","0bb954c9":"WithdrawAndTransferToBankroll()","0bb9ee71":"createRepository(bytes32,bytes)","0bb9f21e":"SCAMERC20()","0bba3065":"AuthorityFilter()","0bba662d":"oneCoin()","0bbaa27a":"seedSourceB()","0bbad618":"setupReclaim()","0bbd4e38":"defrostReserveAndTeamTokens()","0bbd501e":"NewEtherPrice(uint256)","0bbdb469":"getLuckyblockSpend(bytes32)","0bbe0ee3":"transferAllFrom(address,address,uint256[])","0bbed2b7":"secondsaleopeningTime()","0bbf2768":"infrastruct(uint256)","0bbf709a":"validHolder(address)","0bbf8f38":"setMinBid()","0bbfdbec":"setUsdAmount(uint256)","0bc09cfe":"buy(uint256[6][])","0bc0c61f":"destroyOwner(address,uint256)","0bc1236e":"getTokenAmount(uint256,uint256)","0bc16f1b":"presell()","0bc1734c":"addPermissions(address[])","0bc217d9":"setCastleSale(uint256,uint256)","0bc23901":"WalletAddressesSet(address,address,address)","0bc2a3b7":"Showercoin()","0bc30aa0":"getTicketWinnings(uint256,uint256)","0bc311ea":"addFound(address)","0bc32ab6":"tokenToPointBySkcContract(uint256,address,uint256)","0bc33b22":"addressJenkins()","0bc3a268":"KelvinToken()","0bc4ec45":"FirstDropToken()","0bc59a8e":"date15Nov2018()","0bc5b2c5":"stage_2_tokens_scaled()","0bc5e51e":"endTimeSale3()","0bc5f216":"kgtToken()","0bc69912":"createICO(bytes,bytes)","0bc6b708":"placeBetTESTONLY(uint256)","0bc6b89c":"dailySpent()","0bc6c96e":"failSafe()","0bc7760c":"crowdsaleSet()","0bc785df":"ACTToken()","0bc7fd93":"toTuis(uint256)","0bc8982f":"getBQL()","0bc8b4c2":"getMintRequestUintMap(uint256,int256,string)","0bc954dc":"addEgg(uint64,uint32,address,uint256)","0bc9c89c":"removeMessage()","0bca1704":"setHardcupTrue()","0bca441b":"BETHERTokenSale(uint256,address)","0bca5903":"claimMedals(uint16)","0bcab28a":"verifyReceiverAddress(address,address,address,uint8,bytes32,bytes32)","0bcb8a23":"getBondDivShare(uint256)","0bcbad90":"WLMTPrice()","0bcbbd21":"r2()","0bcbe35b":"lastBlock_f19()","0bcbfe1c":"withdraw_Eth(uint256)","0bcd0694":"getUserCities(address)","0bcd3b33":"getBytes()","0bcd87ed":"dashboardAddress()","0bce62ea":"isPreICOPublicOpened()","0bce8cdf":"getContributorInfo(address)","0bcef54c":"Eticket4Sale(address,address,uint256,uint256,uint256)","0bcf963b":"getDocumentsCount()","0bd089ab":"MyAdvancedToken(uint256,string,uint8,string,address)","0bd11894":"addBuilder(uint256,address)","0bd12120":"MMCC()","0bd18d7a":"investment(address)","0bd263ff":"registerPID(address)","0bd2ae1c":"ERW()","0bd38767":"testCanClone()","0bd3ae61":"EARLY_BIRD_SUPPLY()","0bd3cf7e":"Timebomb()","0bd58493":"sellMyApple(uint256)","0bd5b493":"payPostDrawRef(address,address,uint256)","0bd601df":"setLockEndTime(uint256)","0bd61e79":"_finalRoundLosersFight()","0bd62ad5":"FantasySportsCoin()","0bd64dbf":"BsToken(string,string,uint256,address)","0bd6a40f":"setWorkerAdress(address)","0bd6c769":"Load(address,uint256,uint256)","0bd7b6b8":"computed_fundraise()","0bd85158":"setUInt8Value(bytes32,uint8)","0bd8599e":"countUp()","0bd8a1d0":"auctionFinalized()","0bd8a3eb":"SaleEnded()","0bd934c3":"UPEXCoin()","0bd93738":"updateShareTimeGap(uint256)","0bd9c534":"right43(uint256)","0bda4dbf":"refundCount()","0bdab855":"distributeHNC(address[],uint256,uint256)","0bdc0031":"STARTBLOCKTM()","0bdc7953":"multiBuy(address[],bytes32[])","0bdc9c35":"CalculateReward(uint256,uint256,uint256)","0bddb83b":"bonusPresale()","0bdddb73":"stampOut(address,uint256,uint256)","0bdde107":"balanceOfme()","0bde1d36":"changeAllowanceToMint(address,address,int256)","0bdf3dae":"CryptoRoboticsToken()","0bdf5300":"TOKEN_ADDRESS()","0be0453b":"StringDemo()","0be0713d":"gcSupply()","0be0f677":"log(bytes32,string)","0be21ea9":"MAX_TIME_EXPLORE()","0be23ace":"RealMoney()","0be2858e":"multipleTransfer(address[],uint256[])","0be48491":"personalMax()","0be5430f":"DroneTokenSale(address,address)","0be560be":"NarniaUSDT()","0be5ca05":"privatePresaleTokenReservation(address,uint256,uint256)","0be5efa6":"year2LockAddress()","0be6ba2b":"addRestricedAccount(address,uint256)","0be702bf":"_v4()","0be72b6d":"allOfferingQuota()","0be76f80":"memberData(uint256)","0be77485":"Unlock(address)","0be77f56":"log(bytes)","0be80f39":"setComission(uint256)","0be80fa9":"changeVisitLengths(uint256,uint256,uint256,uint256,uint256,uint256)","0be8287e":"getJackpotInfo()","0be9189d":"showInvestorVault(address,uint256)","0be924ef":"tier_rate_4()","0be96fbd":"MAX_TOKENS_SALE()","0be9f930":"REL(uint256,string,uint8,string)","0beb90d3":"icoLimit()","0bebd0f9":"addAddressToGeneration(address,uint256)","0bec3231":"GalaxyChain()","0bece492":"setPhaseBonusAddress(address,address)","0bed63c7":"_isActive(uint256)","0bee1c3e":"availableICO_w2()","0beeb0af":"getValue(address,bytes32,address)","0beedbd4":"AdoptionRequested(bytes5,uint256,address)","0befe82b":"AddBankerPrincipal(uint8,uint256)","0befeeb0":"lastCreatedGame()","0bf05c99":"DraftPlayer(address,uint256)","0bf09985":"openRound(uint256,uint256)","0bf0e4e4":"myProfit(address)","0bf1c747":"destructed()","0bf2c50d":"setCFO(address,bytes)","0bf2ee8d":"addPerson(string)","0bf318a3":"finalizeCrowdsale()","0bf34d54":"CVToken()","0bf36806":"Bivacoin()","0bf474a9":"claimDonations(address[2],uint256[7],uint8,bytes32[2])","0bf5035d":"secondYearEnd()","0bf51f36":"updateTime(uint64)","0bf53613":"getBonusNow(address,uint256)","0bf53668":"consumers(address)","0bf61fd4":"t_Slava()","0bf63c60":"setBasicCentsPricePer30Days(uint256)","0bf6898e":"DPSToken(uint256,string,string)","0bf6dbfd":"VanityToken(address)","0bf75567":"voteSuperQuorum(uint256,bool)","0bf757e5":"HopiumToken()","0bf77989":"debug_coinbaseTxSha(bytes,uint256)","0bf7fb57":"getUserMilestone(address)","0bf82810":"removePartnerAddress(address)","0bf84797":"RATE_FOR_WEEK1()","0bf867c2":"Zemana()","0bf9236a":"KillContracts()","0bf9c50f":"calcNextNBonuses(uint256)","0bf9fd52":"wasPaid(bytes32)","0bfa1191":"setPriceStorageInternal(address,uint256)","0bfd1271":"confirmErc20TransactionRequest()","0bfd7b62":"getBonusesAmountAvailable(bytes32,uint256)","0bfefed4":"createUser(address,string,bool,bool,bool)","0bff2ac2":"NewBatch()","0bffa8b4":"changeMigrationInfoSetter(address)","0c0075a3":"getBallotOptions()","0c0078e8":"RESERVED_TOKENS_ANGLE()","0c012834":"ARS()","0c01b2ae":"setConfiguration(string,string,uint256,address[],uint256)","0c02159f":"HavEtherToken(uint256,string,uint8,string)","0c022933":"highTimeBonusValue()","0c031f45":"TokenBuy(address,uint256)","0c03348d":"getIntel(uint256)","0c0399a4":"iteration()","0c03f24a":"parseDate(string)","0c03fbd7":"getNumPassingTokens(address,uint256)","0c0615a7":"evaluate(address,string,string)","0c0662a8":"getLastWithdrawal()","0c06c3ee":"viewHouseFee()","0c06fda1":"AVINCOIN()","0c07fa56":"ICO_END()","0c087782":"PXLProperty()","0c087bc5":"stage1Start()","0c08bf88":"terminate()","0c08ec49":"importTokensToSidechain(address,address,uint256,bytes32)","0c099133":"ERC20TokenFactory()","0c0a5c55":"cancelAuth(address,address)","0c0a7a68":"Stars()","0c0ad299":"removeProject(address)","0c0b86ca":"currentAuctionId()","0c0bea5c":"FinalTokenToken()","0c0c13c8":"query2_fnc()","0c0cde7c":"ZIBToken(uint256,string,string)","0c0e5f0d":"calculateGrapeBuy(uint256,uint256)","0c0e6dea":"publicAllocationEnabled()","0c0ef2b0":"isGameActive()","0c103837":"votedHarvest(address)","0c112598":"fun(bytes32)","0c119354":"rateMain()","0c11dedd":"pay(address)","0c11f32e":"milestoneShares(uint256)","0c131629":"RDFToken()","0c14080b":"bonusSale()","0c15b963":"againAttack(address,uint256)","0c15f601":"meltTokens(address,uint256)","0c16683e":"SCLToken()","0c1688f7":"IstriumToken(address,address)","0c17d023":"dungeonTokenContract()","0c17d42c":"setAlpha(uint256)","0c1838e9":"importAmountForAddresses(uint256[],address[])","0c18e1c9":"balanceInSpecificTranche(uint256)","0c1925f3":"stock(string,string,uint256,string)","0c192fe5":"RBCToken()","0c195d99":"totalAllocatedTokens()","0c196a74":"getInterestRate(uint256)","0c19f80e":"checkReferral(address)","0c1a8b05":"toSPool(uint256)","0c1a972e":"newAccount(string,bytes)","0c1b33d2":"setRemainingSupply(uint256)","0c1be377":"removeSupport(address,address)","0c1c0974":"littPoolIDExists(uint256)","0c1c3c14":"registerNameXID(string)","0c1c972a":"startPublicSale()","0c1ca1ba":"withdrawOwnerEth()","0c1cd8cd":"endPvtSale()","0c1d4af7":"LogTokenAssigned(address,address)","0c1db532":"getPI_edit_28()","0c1e3fd4":"submitWithdrawTransaction(address,uint256,bytes)","0c1e3fea":"previousState()","0c1e517f":"bytes16ToStr(bytes16,bytes16,uint8,uint8)","0c1f679f":"WithdrawalTokensAfterDeadLine()","0c1fad51":"setSeedSourceA(address)","0c1fe4b1":"showTransaction()","0c204dbc":"getF()","0c2073e4":"LemonSelfDrop2()","0c21a2f1":"nextGameMinBlock()","0c21e754":"setLLV_edit_9(string)","0c237dde":"servusTokensAllocated()","0c23cf4b":"buyCardXid(uint256,uint256)","0c250dcd":"logUnsigned(bytes32)","0c255c94":"max256(uint256,uint256)","0c25c6c1":"getBonusUsersCount()","0c26a816":"pvpMaxIncentiveCut()","0c26ac30":"closeEarlyAdopters()","0c26e42e":"getReleaseHashForNameHash(bytes32,uint256)","0c270f44":"recleared(address)","0c2737d2":"incrementCounters(uint256,uint256)","0c27677a":"getCRaddress()","0c28e291":"Prout()","0c294f51":"getAllCounts()","0c29e589":"createMyEntity(uint256,bytes32,bool,uint256,uint256)","0c2a48e2":"realitycheck()","0c2ab324":"SAN()","0c2ad9e3":"battle(uint64,uint64)","0c2b14fe":"buyCostume(uint256,uint256)","0c2b3eda":"TeacherCoin()","0c2b4b85":"addGames(bytes32[],bytes32[])","0c2b663c":"SDR22(uint256,string,string)","0c2bc34d":"indexOf(uint256[],uint256,bool)","0c2c5add":"contribute(address,uint256,uint8,bytes32,bytes32)","0c2c81ed":"platformFundingSupply()","0c2cb820":"setDebug(bool)","0c2d71b1":"docStore()","0c2e4bf4":"icoStartAt()","0c2ec050":"isCurrentRoundFinishing()","0c2edc1c":"setExchangeAddresss(address,address)","0c2f6f48":"crowdSalePeriodInit()","0c31309e":"getPrivatePurchaserStatus(address)","0c316d6a":"DTOToken(address)","0c319d80":"BidiumToken(address,address,address,address)","0c3257d0":"changeUserClass(address,uint256)","0c326330":"_isICO()","0c3304d1":"mintMAN()","0c333556":"Vault(address[],address,address[],address[])","0c340a24":"governor()","0c345385":"RenaS()","0c34644c":"getInstructor(address,address)","0c3499ca":"_setSkills(address,uint256,uint256,uint256)","0c34f8a5":"addAddressesToWhitelist(bool,address[])","0c367f63":"DAEXToken(address)","0c36add8":"issue(uint256,uint256,address,address,uint256,address)","0c37348d":"buyPreSaleTokens(address,uint256,uint256,string)","0c376ee6":"setPvtTokens(uint256)","0c38708b":"get_all_project_information(uint256)","0c3890b7":"addThing(string,string,string,bytes32)","0c3980ef":"NextRewardHalving()","0c3a9658":"MTUV1()","0c3b3b70":"Unihorns(uint256,string,string)","0c3b7b96":"minTokensToCreate()","0c3c450e":"icoHashedPass()","0c3c92a3":"finishHardcap()","0c3cebfa":"issueTo(bytes32,uint256)","0c3d5157":"contractStartTime()","0c3dbf43":"removeMarket()","0c3dfa0e":"SLoader()","0c3e2d2d":"getTotalFundsRaised()","0c3e3c58":"getAdministerList()","0c3e4004":"GraceCoin()","0c3e564a":"airDeliverMulti(address[],uint256)","0c3f08c6":"newGame(uint8,string,string,bytes32,uint256)","0c3f0cac":"getLastPlayer(string)","0c3f1f14":"updateSupply()","0c3f64bf":"isDev(address)","0c3f6acf":"currentState()","0c402ed8":"confirmMinting(uint256)","0c424284":"setWhitelistStatus(address,bool)","0c4326a0":"getMajorMinorPatch(bytes32)","0c432c8d":"calcJadeReceived(uint256,uint256)","0c432f1f":"handleLastRef(address)","0c433edf":"receiptUsed(address,address,uint256)","0c437aa7":"setMandateInBlocks(uint256)","0c44ba40":"getMyTicketAddresses(address)","0c45361f":"creators_count()","0c45453c":"_feed(uint256,bytes32)","0c45e8d7":"roomsAvailable(string,uint256[])","0c4641d3":"BJCToken()","0c46fc92":"deliverLastMilestone(bytes32)","0c486a96":"requestPayment(uint256,uint256)","0c486c00":"CNRToken()","0c48ae9e":"createAdSlot(string,uint256,uint256,uint256[])","0c48c6bd":"getBonusMultiplierAt(uint256)","0c48e582":"updateVendor(address,address)","0c497094":"createAngel(uint8)","0c49c0a2":"MIN_CONTRIBUTION_AMOUNT()","0c49c36c":"sayHi()","0c4a3338":"CheckTime(uint256)","0c4a5153":"commitStageActive(uint256)","0c4a8d94":"STAGE_3_FINISH()","0c4a9869":"unregisterContract(bytes32)","0c4ada17":"cards_gold(uint256)","0c4ae1ca":"cancelBooking(address,address)","0c4bfa94":"left13(uint256)","0c4c4285":"setHash(bytes32)","0c4d6bdf":"EarlyBirdsFinalized(uint256)","0c4dd1d9":"totalUsdAmount()","0c4ecab4":"confirmations(bytes32,address)","0c4f65bd":"getOwnerAddress()","0c4f8f6f":"regularTransfer(bytes32,bytes32)","0c50b116":"BTHPoint()","0c51015d":"adjustTap(uint256)","0c51171d":"getTokensSold(address,bytes32)","0c516283":"freezeHybridizationsCount(uint256)","0c5241fa":"LOL6()","0c525571":"arraySum(uint16[])","0c52780d":"unCertifyDelegate(address)","0c52bb4c":"auditorsList(uint256)","0c547097":"goldenTicketOwner()","0c549dd9":"getCET6ByAddr(address)","0c54ce44":"ProofOfRipple()","0c5532bf":"singleValueAirdrop(address,address,address[],uint256)","0c55699c":"x()","0c5589b8":"DecreaseWithdrawalAmount(uint256)","0c559757":"setHouseEdge(uint8)","0c55d925":"deleteBytesValue(bytes32)","0c55d9a4":"confirmStaking()","0c55f818":"CTU_ADDRESS()","0c560c64":"USD(uint256)","0c58062b":"teamLockPeriodInSec()","0c584803":"SGTMock(address)","0c58bcb8":"EthLendToken(address,address,address)","0c58e23c":"ZClassicGold()","0c59b556":"viewCoinsKarmaBySymbol(string)","0c59c570":"CashTron()","0c5a534e":"allowBuying()","0c5a97a6":"getProviderName(uint256)","0c5c2ca3":"getIndexName(bytes)","0c5ce593":"open(address,bytes32,uint256,uint256)","0c5d919d":"totalsuplly()","0c5e3f11":"nestedFirstManyToSome(uint256,uint256)","0c5ebb1a":"userForceGameEnd(uint8,uint256,uint256,int256,uint256,uint256)","0c5ed9d5":"REB()","0c5f9a60":"allocationFee(bytes32)","0c5fd414":"preOrder(address,address,address,address,bytes32,uint256,uint256,uint256)","0c5fd4b2":"minttoken(address,uint256)","0c60223e":"withdrawAuctionBalance(address)","0c61257e":"WartegToken()","0c620494":"changeAllowTransferWallet(address)","0c62b816":"minableSupply()","0c62bfbb":"_calcNextRate()","0c636091":"adoptAxies(uint256,uint256,uint256,address)","0c646fbd":"get_entity_count()","0c64a739":"price_exponent()","0c64a7f2":"remainingTime(uint256)","0c657eb0":"bankroll()","0c65829b":"_setSkills(address,uint256,uint256[],uint256[])","0c65e229":"startICOPhaseThree()","0c662943":"_lockup(address,uint256,uint256)","0c66adf8":"getCurrentRoundInfo(uint256)","0c68194f":"getCourseIdOfStudent(address)","0c68a104":"fundingMaxInEth()","0c68ba21":"isGuardian(address)","0c68f917":"cancelOfferingProposal(address,uint256)","0c693110":"getVoted(address,uint256)","0c6940ea":"addMeToAllGames()","0c69b189":"claimCrystal()","0c6a3161":"RESERVE_ADDRESS()","0c6a5be4":"Arexium(uint256,string,uint8,string)","0c6a62dd":"updateCurator(address)","0c6b1324":"Etherboard()","0c6bfdd0":"openTheRabbitHole()","0c6cbf92":"lastPayOut()","0c6cd73a":"issueCard(uint256,uint256,uint256)","0c6d1efb":"releaseEachTokens()","0c6ddc0d":"getUserAllowance(address)","0c6de527":"addToBonusSeed()","0c6df351":"doBondBonusTransfer(address,address)","0c6e29e3":"subscribeToPool()","0c6fc9b2":"processTakerOrder(uint256,uint256,uint256,uint256,bool,address,address,bytes32)","0c6fe674":"getPresaleTotal(uint256)","0c700183":"listGlobalAuditDocuments(uint256,bool)","0c7013c1":"send(address,address[],address,uint256[])","0c70f055":"getRandomRarity(uint32,uint256)","0c71614c":"divsforall()","0c717036":"colourID(uint8,uint8,uint8)","0c71b48c":"BTCTransactions(bytes16)","0c72bf39":"ArtToujourToken()","0c72fe56":"_payBidAllocationFee(bytes32)","0c736e04":"refundForValidPartners(uint256)","0c73a392":"getLogSize()","0c740736":"addPicture(string,uint32,uint32,uint32,uint32,string,string,string)","0c7452b8":"viewPetitionSignerWithAddress(address,uint256)","0c74be3d":"TIME_TO_MAKE_TOMATOES()","0c7516fd":"numPurse()","0c754b9f":"BuyOptions(address,uint256,string,uint8)","0c75941a":"setContractMessage(string)","0c76316d":"withdrawPot()","0c763fef":"showContractMsgSender(address)","0c77a697":"claimFounders()","0c77b44e":"setLedger(address,address)","0c790369":"maxMessageChars()","0c798c81":"SCCToken(address,address)","0c79af3d":"witrhdraw(uint256)","0c79e3e6":"setCrydrStorage(address)","0c7ac7b6":"arbitratorExtraData()","0c7b5616":"Time_Start_Crowdsale()","0c7befb2":"_tokenLayersExist(uint256)","0c7ca61e":"ArrAccountIsFrozenByDate(uint256)","0c7caded":"destroyMe()","0c7d8c20":"_register(bytes32,address)","0c7de59d":"edit(address,bytes,bool)","0c7e30b7":"getUsdCentsFromWei(uint256)","0c7eca6e":"setCurs(uint8)","0c7ef39b":"HUBTToken()","0c7f076e":"advisoryReserveTokensDistributed()","0c7f27ba":"COE()","0c8004b5":"buyTokens_Address(address,uint256,bytes8)","0c80d6dd":"view_last_result(address,address)","0c8114d3":"_forwardFunds(address,uint256)","0c8135a7":"getTeamOwner(uint256)","0c8209b6":"manualWithdrawEtherAll()","0c823abe":"importedTokens()","0c82b942":"whitelistRemove(address[])","0c832ef0":"restoreOwner()","0c8367fb":"HALAL()","0c83700a":"divCutPool()","0c8496cc":"getReturnByPath(address[],uint256)","0c857b25":"getLoveLock(uint64)","0c85b18c":"SetBuildingData(address,uint256,uint256,uint256,uint256,uint256)","0c85feea":"matchOrders(uint64,uint64)","0c861d4b":"Aeron()","0c87355e":"BANCOR_CONVERTER_UPGRADER()","0c875c8d":"Withdrawn(uint256,uint256)","0c89a0df":"transferTokens(address)","0c89b766":"randomSource()","0c89ef35":"hasEnoughAllowance(address,address,uint256)","0c89ef67":"PXMCCoin(uint256,string,uint8,string)","0c8a611f":"getInvestorsETH(address)","0c8ac6f7":"transferAnyTokens(address,address,uint256)","0c8b29ae":"hodlTillBlock()","0c8b494d":"RadarSpeedChain()","0c8bae5c":"sellTokensForBtc(string,address,uint256,uint256)","0c8bd2c5":"Issue(address,address,address,address)","0c8bdcfa":"GetPolicy(address,string,string)","0c8c0392":"listAsset(uint256,uint256,uint256,uint256)","0c8c085f":"getNumContents()","0c8dfeda":"maxLinkedWalletCount()","0c8e3166":"assignAtheniansToBattle(uint256)","0c8e9977":"whitelist_pool(address,address,uint256)","0c8f167e":"TOKENS_SOLD()","0c8f78fb":"setGasAmount(uint256)","0c9066dd":"getZodiac(uint256)","0c90da51":"End2()","0c915c74":"releaseWithStage(address,address)","0c91af81":"IGTUSD()","0c91e624":"Winner(string,address)","0c91f2d0":"rewardForWork(address,address,uint256,bool)","0c92b17b":"checkBurnTokens()","0c932e77":"ritualFee()","0c938c3f":"changeSubscriptionFee(uint256)","0c939ae1":"KYROInv()","0c93c981":"playBatch(uint256[],uint256[])","0c96526b":"getRateUsd()","0c96c4ea":"triggerRelease()","0c97200a":"getLoansCount()","0c975447":"lowBonusRate()","0c97bb77":"curConfig()","0c98048d":"transferFromAdmin(address,uint256)","0c981d58":"closeGame(address)","0c987501":"EtheraffleFreeLOT(address,uint256)","0c990004":"createToken(uint256,address,bytes32,uint256,uint256,bytes32)","0c99d807":"_isValidBlock(uint8)","0c9a6c24":"getUserCoinMarketValue(uint16,uint256)","0c9b016c":"expItemClass()","0c9b5777":"Erc20()","0c9bb7d2":"denyByPassword(bytes8,bytes)","0c9bc2c0":"calculateNonVestedTokens(uint256,uint256,uint256,uint256,uint256)","0c9be46d":"setCharityAddress(address)","0c9c1c58":"setAltFundAddress(address)","0c9cbfee":"moveProduct(address,address,uint256)","0c9daf45":"vcxWallet()","0c9dc2b8":"checkEthFundDepositAddress()","0c9dd381":"RewardTransfered(uint256,address,uint256,uint256,uint256)","0c9f6ed8":"ZEXCoin()","0c9f88c0":"Zignal()","0c9f980f":"isCSO(address)","0c9fcec9":"setApproval(address,address,uint256)","0c9fd581":"assertTrue(bool)","0c9fe5eb":"PIXEL_COUNT()","0c9ff620":"listINF()","0ca09e1e":"XoudCoin()","0ca1988b":"getnum(address)","0ca1c5c9":"getTotalMinted()","0ca2bda2":"isAllowedTransferDuringICO()","0ca2f2fd":"MultiBonusCrowdsaleMock()","0ca35682":"recover(uint256)","0ca35c22":"setScouponTransferCost(uint256)","0ca36263":"exit(bytes32)","0ca40865":"capRound2()","0ca413a4":"getDateRanges()","0ca435a6":"grabBooty()","0ca4f838":"BetCommunity()","0ca5bdb4":"novaBurn()","0ca5f72f":"rewardPercentageDecimals()","0ca621a8":"updateSplitandEmit()","0ca6afa7":"EtfToken()","0ca6d310":"setNamePiture(uint256,string)","0ca72e82":"testGetLawyerCount()","0ca7395f":"returnFund(address,uint256)","0ca78923":"updateConnector(address,uint32,bool,uint256)","0ca8fe1e":"burnCoins()","0ca9183c":"icoFundingRatePredictionBonusInPercentage()","0ca97903":"emergency(address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","0ca9897c":"citePaper(address)","0ca99ca8":"hardCapInWei()","0ca9c14e":"PryvCn()","0caa1d84":"isUserGranted(address,string)","0caa5d91":"UserDestroy(address,address)","0caa8605":"getStage3End()","0caaa284":"PresaleClosed(uint256,uint256)","0caab83a":"poolBounty()","0cab068c":"isVestingRevoked()","0cac54ed":"claimTransfer(address,address)","0cacbf21":"getSponsorshipsSortedByAmount(address,uint256)","0cadc5b3":"deliverBonus()","0cae3cbb":"checkStageCondition()","0caeb350":"upgradeValue(uint256)","0caee2ca":"calculatePayout(uint256,uint256,uint256)","0caf10b2":"GreenEnergy()","0caf9d39":"testFailTooManyMembers()","0cafabd8":"getTPrice()","0cafef9c":"Clen(uint256,string,uint8,string)","0cb08716":"airdropDynamic(address[],uint256[])","0cb08e3b":"_finalizeICO()","0cb09309":"ArysumToken()","0cb0a44b":"enableInvestment()","0cb0c7f0":"forceOwnerChange(address)","0cb1982b":"updateNAV(uint256)","0cb1d243":"ICT(uint256,string,string)","0cb1d6b4":"fourthWeek()","0cb296ae":"Gemstones()","0cb335c4":"setMissedVerificationSlashAmount(uint256)","0cb5f653":"newUser(address)","0cb60443":"minRate()","0cb61d7a":"setCurrentBonusPercent(uint256)","0cb6aaf1":"keys(uint256)","0cb6b577":"TOKEN_DECIMAL()","0cb743a5":"buyOld(uint256)","0cb749b6":"FutureBlockCall(address,uint256,uint8,address,bytes,bytes,uint256,uint256,uint16,uint256,uint256)","0cb795e8":"getDividendInfo(uint256)","0cb7eb4c":"getReleaseTime(address)","0cb812d3":"openWithoutCounterparty(address[4],uint256[3],uint32[4])","0cb9208a":"JorgeCoin()","0cb97f57":"advisorsTotal()","0cb9da1b":"RedemptionContract(address,uint256)","0cb9ec43":"TemperatureMeasurementB(address,uint32,uint64)","0cb9ee4b":"getAllPlayerObjectLen()","0cba5853":"angelCollection(uint64)","0cba6d27":"getSocialAccountsLength()","0cbb0f83":"entryCount()","0cbc9ce7":"sendToToteLiquidatorWallet()","0cbe1eb8":"USDDOWNLOADPRICE()","0cbf0601":"numMessagesSigned(bytes32)","0cbf54c8":"auctionDuration()","0cbf711a":"LogClosed()","0cbf7ec0":"startPrivateIco()","0cbfe979":"updatePrivateSaleWithMonthlyLockupByIndex(address,uint256,uint256,uint256)","0cc00bc9":"MarketPlace(address,uint256)","0cc03e7a":"claimShare(uint256)","0cc04b55":"adminUnregister(string)","0cc06221":"getUserAccountInfo(address)","0cc10550":"BIToken()","0cc2001c":"TastToken()","0cc20a0c":"getHoldEarningsInRound(address,uint256)","0cc3ad77":"verdictExecuted(address,bool,uint256)","0cc3db97":"_createToken(uint256,uint256,uint256,uint256,address)","0cc4330c":"visit()","0cc4fb87":"changeGeneralSaleEndDate(uint256)","0cc6373f":"tokenExchangeRateMile3()","0cc69a27":"Marketplace(address,address)","0cc69b5b":"NOKIA()","0cc7086b":"canBurnUtility(address,uint256)","0cc73b6a":"BLOCKS_PER_ROUND()","0cc79a85":"getEnded()","0cc8299b":"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww()","0cc87b1c":"soldPreSaleTokens()","0cc88021":"hasPlayer(address)","0cc8c9af":"getOrCreateNextFeeWindow()","0cc91bb9":"setEarlyParicipantWhitelist(address,bool,uint256,uint256)","0cc966fa":"buy(address,address,uint256,uint256,uint256,bool)","0ccc642e":"emergencyFlagAndHiddenCap()","0ccc68bb":"_create_mineral(bytes32,address,uint256,uint256)","0ccc88b1":"BurnupGameBase()","0cccfc58":"auctionPeriod()","0ccde0b1":"initialSupplyPerAddress()","0ccec396":"getNumReleases()","0ccf30f1":"setRentTime(uint256)","0ccf5af4":"_prizeAmount()","0ccfdd8b":"potentiallyCirculatingPop()","0cd0563b":"broadcast(string)","0cd0c3d7":"resetRental()","0cd1812f":"sendFundsTo(address,uint256)","0cd205bb":"CrowdsaleContract(uint256,uint256,address,uint256,uint256)","0cd28e9d":"getRoundPlayerList(uint256)","0cd2b327":"approveSponsorableJob(address,uint256,address)","0cd30783":"getcompany(uint256)","0cd3c7f7":"ransom()","0cd3fad2":"_base64decode(bytes)","0cd4700a":"NT()","0cd522da":"returnStartBlock(uint256)","0cd55abf":"nextNonce(address)","0cd5ea83":"earlyBirdDuration()","0cd641b2":"tokenForComunity()","0cd64ad0":"changeEthDailyLimit(uint256)","0cd6ceb3":"Boldman()","0cd74cd9":"etherWallet()","0cd7d0f2":"DestlerDoubloons()","0cd865ec":"recover(address)","0cd8dd0b":"setXPTokenAddress(address)","0cd9aec6":"testFailTrustWhenStopped()","0cd9f271":"buy10()","0cda88ce":"mul256By256(uint256,uint256)","0cdbf3dd":"setReferralsMap(address[],address[])","0cdc92ea":"canBeCanceled(uint256)","0cdd4234":"mainAddress()","0cddb437":"CNDTPrivate()","0cde0e7d":"solve(int256,int256,int256,int256)","0cde6009":"KinTokenSale(address,uint256)","0cded5f0":"migratePool()","0ce08a49":"refundAmount(uint256)","0ce10cbd":"changeOwnerToZero()","0ce11049":"setBCoinContractAddress(address,address)","0ce11a77":"registrarAddress()","0ce11ded":"updateMthEthRate(uint256)","0ce18afc":"TabToken()","0ce1f4b7":"toB32(bytes,uint256,bytes)","0ce3151c":"personUpdateRelation(uint256,string)","0ce38276":"setColorYellow()","0ce3d998":"fetchCancelledOrdersForMerchant()","0ce46c43":"scheduleCall(address,bytes4,bytes,uint16,uint8,uint256[5])","0ce4c990":"minRevenueToDeliver()","0ce4e104":"bnbTokenWallet()","0ce52e25":"time_on_trademarket()","0ce5a098":"getWordCount()","0ce64868":"setPendingValue(uint256,string)","0ce6bd26":"EtherCarbon()","0ce71356":"canPropose(address,uint256)","0ce84479":"Wallet10()","0ce8544a":"Ethlyte()","0ce90ec2":"levelUp(uint256)","0ce96e71":"removeAddressFromQueue(uint256)","0cea64a0":"callSomeFunctionViaOuter()","0cea7534":"withdrawMargin(uint256)","0ceaeb5a":"ecosystemSupplyRemaining()","0cec1ecd":"getPixelDistributor()","0cecf728":"ListingCancelled(bytes5,uint256)","0ced5b02":"buyTokens(uint128)","0cedd0bd":"_getDestinationPartition(bytes32,bytes)","0cee1725":"withdrawFund(uint256)","0cee22e9":"testSetBalanceSetsSupply()","0cef7d5a":"WBW(uint256,string,uint8,string)","0cef9a27":"add2MarketPlace(uint256,uint256,uint256)","0cefa4de":"minPersonalCap()","0ceff204":"withdrawRevenue(uint256)","0cf01051":"startFunding()","0cf039e3":"setBuyRequestLimitInterval(uint256)","0cf044ee":"enable_exploration()","0cf1d050":"withdrawAllToExchange(address,uint256)","0cf1dafc":"refreshRate(uint256)","0cf1dd6e":"BattleOfThermopylae(uint256,uint256,uint8,address,address,address,address)","0cf20cc9":"withdrawBalance(address,uint256)","0cf3da77":"ELCToken()","0cf45ba5":"updateFirstDuel2(uint256)","0cf56f3f":"addBetWithReferrer(uint256,address,address)","0cf59cc6":"changeScientistForElement(uint256,uint256)","0cf6d879":"getARInvTable()","0cf79e0a":"transfer(uint256,uint256)","0cf7f3b5":"changePrice(uint256,uint64)","0cf820e0":"lengthOfRecord(uint256)","0cf838e1":"Test2(address)","0cf85c4c":"stateMask()","0cf868bf":"_airdropLimit()","0cf8bcab":"setItemTransferable(uint256,bool)","0cf935c0":"getDegreeCount()","0cf93a60":"ICOweek1End()","0cf94990":"checkMD(address)","0cf94cda":"calcInvitationAmount(uint256)","0cfa0318":"approveBurn(address,uint256)","0cfa1d12":"rndExtra_()","0cfa8af4":"deleteCandidateByStage(address,uint256)","0cfb37a7":"revealProofOfPerfBlock(uint32,bytes32,bytes32,bytes16,bytes32,bytes16,bytes32,bytes32)","0cfbf6c6":"lockConfiguration()","0cfccc83":"SUPPLY_CAP()","0cfd0a0d":"INDI()","0cfd2c6a":"RecreationCultureMassMediaCoin()","0cfed2a2":"pauseSale(bool)","0cff4058":"AacharyaToken()","0d009297":"initOwner(address)","0d011088":"convert2(string,string,address)","0d015e4b":"get_depositLock()","0d02369b":"takeSellOrder(address,uint256,uint256,address)","0d024f83":"DownStats(uint256,uint256,uint256,uint256)","0d02e05c":"setBuyStatus(bool)","0d032623":"getRemainingCompanyTokensAllocation()","0d043a60":"getRewardsWithdrawn(uint32,address,address)","0d047c5b":"NewFounderAddress(address,address)","0d047d49":"getFashionsAttrs(uint256[])","0d051c52":"clearCrowdsaleCloseTimer()","0d052f39":"getBurnAdminApproval(address,address)","0d055d1e":"sendBill(uint256)","0d0567ae":"latestAddress()","0d058fe3":"create(uint256,string,address)","0d062959":"FXTOKEN(address,uint256,uint256)","0d06a2ee":"setBenefeciar(address)","0d0a1901":"secondReserveAllocation()","0d0a6bf2":"investor_clearRefBonus(address)","0d0abf52":"matureBalanceOf(address)","0d0b0c74":"loadN(uint8[],uint256,uint256)","0d0b86c6":"CryptaurDepository()","0d0b8825":"weiPerRtc()","0d0bfb2f":"ba2cbor(bytes[])","0d0c0c51":"LogParticipation(address,uint256,uint256)","0d0c2008":"TwoAndAHalfPonzi()","0d0c2c62":"MOTDiscount()","0d0c529a":"getacttslen()","0d0cd4f4":"allWalletBalances(address)","0d0d0554":"ARMYToken()","0d0d7dc9":"raiseEvent2()","0d1017d6":"EnterRentCrowdsale()","0d10e842":"weiAmount()","0d1118ce":"burnTokens(address,uint256)","0d117d16":"chunk1IsAdded()","0d11dd70":"currentRefundInvestorsBallot()","0d121337":"transferOperatorRole(address)","0d1352cf":"marketAnts()","0d13bec6":"SellAcorns(uint256)","0d13d85e":"transferMintTokens(address,uint256)","0d13ea7d":"BONUS_2_DAYS()","0d145d16":"RegisteredPlayer(address,uint256)","0d14ed4f":"midgradeOpen()","0d157352":"ForkiToken()","0d15fd77":"totalVotes()","0d16b6ca":"setBTCRate(uint256)","0d16cba5":"addMessage(address,address,address,string)","0d172a01":"transferTokenTo(address,address,uint256)","0d174c24":"setWithdrawer(address)","0d17ace0":"currentDiscountPercentage()","0d17bc2e":"_disallow()","0d17c576":"_deliverBonusTokens(address)","0d18952b":"UpdateReleasePrice(uint32,uint256)","0d1946df":"MasterToken()","0d1a0c62":"setPackSize(uint256)","0d1a0d5e":"TokensPurchased(address,uint256,uint256,uint256)","0d1a94de":"SeriesCreated(uint256)","0d1cf200":"muscFund()","0d1d38aa":"info(uint256,bytes32)","0d1d8d6d":"listTeams()","0d1dcd74":"foundersRewardsMinted()","0d1edad1":"Start8()","0d1ee029":"add(string,int256)","0d1efd7d":"getDistrictCode()","0d1f3471":"deleteRecord(address)","0d1f9bb6":"isBetLocked()","0d1fce42":"getBankroll()","0d20a889":"getRegistrantId(address)","0d213d31":"migrateTo(address,uint256)","0d2218d6":"millRaised()","0d229be7":"priceTokenWei()","0d24317d":"_getTotalHp(int256,int256,int256,int256)","0d244d68":"setNotRetractable(bytes32)","0d25320c":"distributedAmount()","0d2560ee":"addMe()","0d25b6f2":"getMonsterName(uint64)","0d260b60":"_sendTranche(bytes32,address,address,uint256,bytes,bytes)","0d26c879":"getTotalFundationTokens()","0d271720":"transferFromAdmin(address,address,uint256)","0d274929":"getChannelName(uint256)","0d27864f":"TokenSwapOver()","0d278a8b":"Technology3GCrowdsale(uint256,address,address)","0d2806ad":"TOKEN_PRICE_D()","0d285d8c":"ETH_TO_QST_TOKEN_RATE()","0d28f8d1":"importIsland(bytes32,address[3],uint256[7],uint256[8])","0d290220":"getAllCardsType()","0d290deb":"SumToken()","0d294629":"splitProfits()","0d298318":"heapSort(uint128[])","0d2a1fa7":"mintAfterIcoPeriod()","0d2a246e":"tokenDividend()","0d2a25bb":"tentimes()","0d2bd1ac":"changeFact(string)","0d2be064":"buyToken(address,uint256,uint256,bool)","0d2cbe13":"settleBet(uint256,uint256)","0d2cc54a":"rebirthAxie(uint256,uint256)","0d2ce376":"submitVote(bytes32,bytes32)","0d2e017b":"getGamers()","0d2e677a":"getHotels()","0d2f2971":"authorized_recordFailedOldOwnerTransfer(address)","0d2f99d0":"removeChild(address,bytes32,bytes32)","0d2fc226":"createTokenUri(uint8,uint8,uint64,uint64,uint64)","0d3016bf":"_getIPFSHash(address,bytes32)","0d301c75":"removeFromGoldList(address)","0d30afb0":"CONFIG_DICE_SIDES()","0d310998":"DataContacts(address,address,address,address)","0d3167da":"BarmatzTestToken()","0d325b29":"setTokenApproval(uint256,address,bool)","0d329d14":"ICOtotalSupply()","0d334130":"m_callbackGas()","0d33cfa0":"meltAddress(address)","0d342cab":"autoTransfer()","0d3471f9":"sumHardCapICOStage5()","0d349aea":"updatePaid(address,address,uint256)","0d35f64c":"teamReservedBalanceOf(address)","0d3665b5":"IloveYou()","0d368fee":"deverify(address)","0d36c02c":"BACKUP_TWO()","0d3737b0":"mintAgent()","0d37ac7f":"toggleFunding(bool)","0d381a28":"tokensByOwner(address)","0d381cad":"addJobContract(uint256,string,bool)","0d38a077":"affRegister()","0d38ea48":"ethreceived()","0d38ffcd":"donationRate()","0d392cd9":"updateWhitelist(address,bool)","0d39820c":"preInvestStart()","0d39968c":"funderSmartToken()","0d3a557e":"_allowance(uint256,uint256,bytes32)","0d3ade73":"adjustNextTranche(uint8,uint8)","0d3b7901":"withdrawBonus(address[])","0d3c1b45":"addLayer(address,uint256,string,string)","0d3c7519":"distribute_NRT()","0d3cb409":"getAdjudicatorAddress()","0d3e4044":"binary_search(uint256,bytes32)","0d3f5cb5":"findCliPendTAndSetPrfm(address,address)","0d3fbdf8":"getPI_edit_8()","0d40022a":"_buildShip(uint16,uint16,uint8,bytes32)","0d40e8d6":"supportHarvestQuorum()","0d41117f":"calculateFee(uint256,uint256,uint256,bytes32,bool,bool)","0d42240a":"isWhiteListedAddress(address)","0d425559":"ownerSetMiningProfit(uint256)","0d441f8c":"totalNacInPool()","0d465263":"assessFees()","0d469483":"fiatToWei(uint256)","0d46f410":"getProposalParent(bytes32,bytes32)","0d46f877":"irucoin()","0d46f91a":"kycCertifier()","0d472f5f":"airdrop_byadmin(address,uint256)","0d4766a3":"STARTING_SHITCLONE()","0d480993":"getFoundersTokens(uint256)","0d483442":"NO()","0d4891ad":"signalDoneDistributing(uint256)","0d48a771":"claim(address,uint256,uint256,uint8,bytes32,bytes32)","0d48e8d0":"doBalance()","0d494a05":"isICOUp()","0d498b1e":"setTokenSPUsdCentPrice(uint256)","0d49a0f0":"addProofOfPerfBlock(uint32,bytes32,bytes32,bytes32,bytes32)","0d4a464f":"_newHorseShoe(uint256,uint256,uint256,bool,bool,address)","0d4a690a":"KopiToken()","0d4a8b3b":"wadmin_freezeAccount(address,bool)","0d4b8208":"convertCarbonDollar(address,uint256)","0d4c8f62":"setPayouts(uint256,uint256,uint256)","0d4d1513":"mint(address,uint256,address)","0d4d389f":"POOL_EDIT_4()","0d4e03e1":"changeTargetWallet(address)","0d4ea316":"buyLandWithTokens(bytes32,int256[],int256[])","0d4faa05":"acheter()","0d50266c":"TEAM_PERCENT_GZE()","0d505d54":"GDX()","0d5260e7":"setGasReserve(uint256)","0d5269ab":"distributeInviteReward(uint256,uint256,uint256,uint256,uint256)","0d5302c4":"DEVCLASS_EXTRACTION_BASE()","0d533e99":"UnlockEvent(address)","0d53b406":"recordEscrowOnBid(uint64,uint64)","0d543862":"sigBountyProgramEDUSupply()","0d54c49e":"processEndGame(uint256)","0d550b75":"allowance(uint256,address,address)","0d55af64":"AFRIHUBcredits()","0d5624b3":"preSaleStart()","0d567f38":"setStartRound(uint256)","0d571742":"setGenesisAddress(address,uint256)","0d57a47f":"setTokenCountFromPreIco(uint256)","0d582f13":"addOwnerWithThreshold(address,uint256)","0d5866e2":"setDeprecated(address)","0d59b564":"submitTransaction(address,uint256,bytes,uint256)","0d59c736":"Gavsino()","0d5a13f4":"BitdealCoin(address)","0d5a5c32":"CROWDSALE_OPENING_TIME()","0d5a621b":"childContractByIndex(uint256,uint256)","0d5be2df":"ballotLog(address,uint256)","0d5d6f7a":"BitEyeExchange(address)","0d5defa4":"escrowAddress()","0d5dfdd8":"debugVal4()","0d5e1e82":"redeemReputation(bytes32,address)","0d5e4c8d":"initialPrizeWeiValue()","0d5e87f4":"calcTokenAmountByZWC(address,address,uint256)","0d5f8f17":"setXWinContractAddress(address)","0d5fced3":"CHAJING()","0d605c4a":"NUM_RESERVED_AXIE()","0d60889c":"Thanks(address,address,uint8,uint8)","0d609939":"setParameters(uint256,uint256,uint256,uint256,address,address)","0d60e231":"migrationRewardTotal()","0d6103a1":"unsoldTokensBack()","0d616d20":"withdrawContribution()","0d61a4ff":"HUT34_VEST_ADDR()","0d61b519":"executeProposal(uint256)","0d61cd5d":"mintICD(address,uint256)","0d623e10":"oracleType()","0d63e87d":"setIntervalTime(uint256)","0d63fdbe":"parseOutputScript(bytes,uint256,uint256)","0d6495ef":"View_MediatedTransaction_Status(uint256)","0d649f90":"getVisaIdentifier(address,uint256,uint256)","0d65d50b":"TIER3()","0d65e3e7":"IS_SIGNATORY(address)","0d66343c":"getPaintingOwner(uint256)","0d668087":"lockTime()","0d668818":"dataContract()","0d66a3ec":"ApisCrowdSale(uint256,uint256,uint256,address,address,address,address)","0d679531":"soldedSupply()","0d6798e2":"userFinalize()","0d67d01b":"GradeBook()","0d68ddeb":"setBUUU(bytes32,uint256,uint256,uint256)","0d694114":"addressPremineBounty()","0d6c66a1":"safesub(uint256,uint256)","0d6d1437":"changeMemberName(address,string)","0d6d1e64":"EricToken(uint256,string,uint8,string)","0d6dcab3":"getProofOfStakeReward(address)","0d6e548e":"getAgentsNum()","0d6ec16f":"isMyDrone(uint256)","0d6f6f0b":"summTeam()","0d6f72aa":"DLXV()","0d6f7ca3":"maxgas()","0d6f849b":"minAmountPresale()","0d6f8563":"withdrawWei(uint256)","0d6fef5f":"MoonBook()","0d70e29c":"isAuthorizedToTransfer(address,address)","0d70e7e3":"getRate(uint256,uint256)","0d71212f":"robotLiabilityLib()","0d7128d8":"setGoalETH(uint256)","0d7172f4":"canMakeUnrefusableOffer()","0d71aba5":"getRace(uint256)","0d729abc":"setStopDay(uint256)","0d72d57f":"backendAddress()","0d730a1a":"updateMerchant(string,string)","0d73a44a":"_collectFee(address,uint256)","0d73c10e":"totalWeiRaisedDuringICO2()","0d7519a9":"initialTokenSupply(address,uint256,bool)","0d7548f7":"seeEthPrice()","0d75d68e":"_canDownload(bytes32,uint8,bytes32,bytes32)","0d75f659":"TemperatureMeasurementA2(address,int8,int8,uint16,string)","0d7714e2":"PiedPiperCoin(uint256,string,uint8,string)","0d78573e":"releaseManager()","0d78bc17":"importCustomer(address,address,uint256)","0d7982ad":"lockMinting()","0d799734":"setMinSet(uint256)","0d7a90c8":"maxSeedStage()","0d7af726":"addGame(address,string,string)","0d7b4ac4":"setLLV_edit_27(string)","0d7b69e2":"fiatCurrency()","0d7bca61":"withdrawSuccessful(bytes32)","0d7bf53c":"getBlockHash(uint256,uint256)","0d7c064f":"setMinStandingBalance(uint256)","0d7cffb0":"PrizePool()","0d7dc36a":"setManagement(address,address,bool)","0d7eaa8b":"FudgeCucks()","0d7f7eff":"TokenDestructible()","0d8053ca":"getBetLength()","0d806df7":"setXaurCoined(uint256)","0d80b84b":"crowdSaleTime()","0d80bf64":"whitelist(string)","0d80fcdb":"distributeBonuses(uint256)","0d81057e":"multiplierOnWin()","0d81a570":"migrationDone()","0d826264":"phaseThreeLimit()","0d82cb3a":"setHeir(address,uint8,uint256)","0d830190":"getCharacterInfo(uint256)","0d831d09":"forwardUpdateFeesTo()","0d83304c":"getSales()","0d83a371":"unprocessedQueryBytes32s(uint256)","0d83dd8a":"recordNewAddress(address)","0d854646":"magic()","0d85ef17":"ZombiewCreator()","0d8693bd":"sBitcoin()","0d869ada":"immortals()","0d873644":"addToken(uint256,uint256,uint256,uint256,bytes)","0d87a7c0":"WLBDrawsDB()","0d8814ae":"cardOwnerOf(uint256)","0d882848":"BTNSold()","0d88fb04":"removePatternUserIndex(address,bytes32)","0d895ee1":"setBurner(address,bool)","0d8b2708":"functionFour(uint256,uint256,uint256,uint256)","0d8b5fa2":"testControllerValidTransferFrom()","0d8b70bf":"grantAccessMint(address,address)","0d8c1a62":"toogleActive()","0d8c1c17":"read_supply()","0d8c2f67":"_logSendWebGiftAndSendEther(address,uint256)","0d8c3c2f":"calculator(address,uint256,uint256)","0d8cba74":"PublicMiningSupply()","0d8e6e2c":"getVersion()","0d8f9cee":"disableToken(address,address)","0d8fbe23":"getDigitFromUint(uint256,uint256,uint8)","0d8fd836":"ExeniumToken()","0d9019e1":"RECIPIENT()","0d9029ea":"Cryptodraw()","0d9049f2":"createOffer(uint256,uint256,string,uint256[])","0d927924":"XPCoin()","0d92b691":"transferDefaultPercentsOfInvested(uint256)","0d92d381":"ElectricQueue()","0d92ddac":"LockEvent(address,uint256,uint256)","0d92e3e8":"claimedTokens()","0d93afef":"revokePermissionBatch(address[],string)","0d9543c5":"donateAs(address)","0d955209":"ARTWORK_STARTING_PRICE()","0d95ccc9":"setPreSale(bool)","0d963235":"setGrowthBump(uint256)","0d973d2e":"getTimestampProposal(bytes32)","0d97f395":"redeem(string,bytes32)","0d98dcb1":"getTransferPreSignedHash(address,address,uint256,uint256,uint256)","0d997dc3":"setdivsforall(bool)","0d99bbec":"calculateUSDWithBonus(uint256)","0d99edbf":"presaleWeiLimit()","0d99f40a":"setInvestors(address)","0d9b2730":"FireXToken()","0d9b71cc":"setParter(address,uint256)","0d9d19b9":"joinMatch(uint256,uint256,string)","0d9db3f1":"VertesCoin()","0d9e16d1":"Alphonic()","0d9e8cab":"winnerLast(uint256,uint256)","0d9ec228":"_price_token_ICO3()","0d9f2817":"getJobSkillsCategory(uint256)","0d9f5aed":"mixGenes(uint256,uint256,uint256)","0d9f5faa":"oasisDirect()","0d9fcb03":"juegoSillaConsensys01(address)","0da03197":"_build(uint256,int256,int256,uint8)","0da04fa6":"Smrtoken()","0da072a8":"newMediaTokenCreated(string,address,string)","0da108ff":"JointICOBonusAmount()","0da1eb03":"deleteHiddenPosition(uint32,int64,bytes16)","0da24421":"bytesMemoryArray(bytes)","0da2c5f0":"setBuyLimits(uint256,uint256)","0da2e088":"upgradedContractAddress()","0da2ee2f":"init_register_contract(bytes32,address,address)","0da30317":"ExchangerPoint(address,address)","0da304b0":"AssetToken()","0da3bec6":"addToCategorie1(address,address)","0da3e613":"EthFactory()","0da4f991":"createContinuousSaleContract()","0da4fc46":"unMutex()","0da590d4":"withdrawDevFees()","0da5f845":"unBlacklistAccount(address)","0da719ec":"onERC998Removed(address,address,uint256,bytes)","0da76f1c":"externalDecline(uint256,bytes32)","0da84bc1":"newIntegrityFeeProposal(uint256,string)","0da86f7f":"JUSTed()","0da8ba5d":"checkRecentInvestments(address)","0da95761":"upgrade(string)","0da97716":"isSignedByAlex()","0da9e3d7":"tokenIcoAllocated()","0daa431a":"currentstageplayer1()","0daa5703":"set(bytes32,bool)","0dab6e08":"getallowedContracts(uint256)","0dac3d99":"deadlineTwo()","0dae2a63":"DTXToken()","0daf233b":"agingTimeByStage(uint256)","0daf37e6":"Sales(address,uint256,string,uint8,string,uint256,uint256,uint256,uint256,uint256)","0daf7a8c":"setBlacklistInternal(address,bool)","0daf96f9":"ThaiBahtDigital()","0daf999a":"heroContract()","0dafc58f":"Compound_now_Accrued_interest()","0db02622":"ownerCount()","0db03955":"fundingProcessed()","0db0624a":"z_Determinations()","0db1b335":"getNextMaximumPlayers()","0db293cb":"depositDekla(uint256,uint256,bytes,uint256)","0db38253":"DEFAULT_CLIFF()","0db38f66":"BetChampion(uint256)","0db3be6a":"decrementOpenInterestFromMarket(uint256)","0db49c84":"TokensSold(address,uint256,uint256,uint256,uint256,uint256)","0db4bad0":"claimDate()","0db5db26":"weiToOwner(address,uint256)","0db6a786":"SALES_DEADLINE()","0db6ba9b":"debugGetNumPendingSubmissions()","0db71d53":"createCrowdsale(uint256,uint256,uint256,uint256)","0db73c72":"noevent()","0db74aaa":"getInvestorBalance(uint256)","0db75ab9":"UsingAVirtualStruct()","0db79003":"addWineryOperationByRegulator(string,string,string,string,uint256,uint16,string)","0db81580":"purchaseAd(uint256,string,string)","0db9d891":"icoEndOfStageA()","0dba2400":"addToMidnightPrize()","0dbb78ce":"showPoolMembers(uint256)","0dbbc14c":"endOfROSCARetrieveSurplus()","0dbce4dd":"registerCandidate(string,string)","0dbd5270":"numberOfBackers()","0dbd5e81":"Send_Data(uint16)","0dbda70b":"angelOnLeaderboards(uint64)","0dbe671f":"a()","0dbea6d0":"robotRefund(address)","0dbedee7":"getNFTbyTokenId(uint256)","0dbf19cb":"PRICE_RATE_LAST()","0dbf23f4":"vehicleregistration(address,string,string,string)","0dbf2a3f":"isNewWeek()","0dbf527e":"MintedToken(address,uint256)","0dc03ec7":"INFLIV(uint256,string,uint8,string)","0dc06e50":"postTX(address,uint256,uint256)","0dc081c5":"tokenTransferOwnership(address)","0dc10a60":"advisorsAddress()","0dc115c8":"coinanxtemp()","0dc16a56":"getDepotEth(address)","0dc174bd":"track(address)","0dc1819f":"purchase_tokens()","0dc193f5":"getEtherReceived()","0dc1d357":"isAfterEnd()","0dc224ec":"partnersMintLockEnd()","0dc26492":"bankPercent()","0dc2e439":"setBZxAddresses(address,address,address,address)","0dc30397":"counterAppeal(uint256)","0dc3279d":"maxnumber()","0dc32b72":"EtherStopLoss()","0dc36f2a":"migrationAgentCandidate()","0dc5bffb":"crowdsaleTokenAmount()","0dc6bae5":"allowFreezeBypass(address)","0dc6c392":"Puttu()","0dc7bd07":"testBurnAuth()","0dc8b5a8":"shortenPreIco(uint256)","0dc8f435":"Party(address,uint256)","0dc96015":"getVotes()","0dc9c838":"changeSaleTimes(uint256,uint256)","0dc9ebfe":"FoundationAddr_()","0dca59c1":"debt()","0dca7ed8":"winningOption(uint256)","0dcad340":"getCitizenLocation(address)","0dcaf3e2":"test_setupSucceeded()","0dcb4627":"_addPendingRequestId(uint32)","0dcc59e6":"DEFROST_INITIAL_PERCENT_OWNER()","0dccca72":"showFPLocktime()","0dccfde4":"WithdrawProfitFunds(uint256,address)","0dcd772c":"AmountSent(address,uint256)","0dcd7a6c":"sendMultiSigToken(address,uint256,address,uint256,uint256,bytes)","0dcd9759":"PPToken(uint256,string,string)","0dcdefa8":"playThreeDiceTotal(uint256,uint256)","0dce06c1":"goalOfState(uint256)","0dcec63d":"updateEtherPrice(uint256)","0dcf298b":"pollExists(bytes32)","0dcf38a9":"FirstPaySend(uint256,address)","0dcf4b8f":"totalContribution()","0dd0a042":"lock(bool)","0dd0cf9e":"founderAdress()","0dd12d38":"moderatorTransferFrom(address,address,uint256)","0dd1d147":"ActionCompose(address)","0dd27120":"exchangeState()","0dd2d96c":"doFinalize()","0dd2d9c0":"Rookcont()","0dd30c81":"toB32(uint256,bytes,uint256)","0dd327fe":"FundsKeeper(address)","0dd32910":"welcomeMsg()","0dd3e1b1":"CNT_Crowdsale()","0dd3fd03":"buySpins(uint256)","0dd5db48":"startPreSale1()","0dd5e582":"masterTransferFrom(address,address,uint256)","0dd5ee1b":"verify(address,bytes32)","0dd636ef":"setBuyDividendPercentageFee(uint8)","0dd63ba3":"setIntArrayIndex(bytes32,uint256,int256)","0dd6a4ad":"addOversight(address)","0dd6eae1":"setCourse(uint256)","0dd84392":"setAllowance(address,address,uint256,uint256)","0dd8cdbb":"initRegistryData(address,address,address)","0dd93b56":"restartAuction()","0dda20d1":"sellCrystalDemand(uint256,uint256,string,string)","0dda350f":"dumpdivs()","0dda507e":"manualFinish()","0ddc4a94":"WHOLESALE_TOKENS()","0ddcc528":"Testable(bool)","0ddcfe8e":"checkAddress(address)","0ddd0824":"checkHash(bytes32,bytes32,uint256)","0ddeb632":"buy(bytes32,uint256)","0ddeeb4f":"tokenSaleUpperLimit()","0ddef58d":"isUnfrozen(address)","0ddf0bfd":"Cryptogs()","0ddf0c41":"updateCandidate(address,string,string)","0ddf78c2":"divForEthertoteDevelopmentWallet()","0de0271e":"paymentReceived(address,uint256)","0de04691":"testCreateWithParentForeign()","0de0b1bc":"giveBirthByUser()","0de1f4c1":"CreateCodeToken(uint256,string,string)","0de2b2d8":"openPosition(address[11],uint256[10],uint32[4],bool,bytes,bytes)","0de3513a":"test_validRuleChange()","0de39733":"activateFlat(address,uint256)","0de3b100":"VoteForProposal(uint256)","0de41aa4":"checkIfAddressIsWhitelisted(address,address)","0de41e45":"lockBegunAtBlock()","0de54c08":"setUpgradeController(address)","0de607c3":"makeSubscriptionID(address,uint256)","0de6aa7f":"getOneTimeCostsPaid()","0de94e4a":"HodlEth(address,uint256)","0de96dff":"giveBack()","0de9b825":"sellShip(uint256,bytes32)","0de9cacd":"reCalc()","0dea35bf":"playerBet(uint256)","0dea38b6":"VESTING_TIME()","0dec1c23":"requestDetachment(uint256)","0dec5d85":"initializeCrowdsale()","0ded195e":"freezeTokensOfOneUser(address)","0ded7f62":"secondBonusEnds()","0dedffb8":"feedAndMultiply(uint256,uint256)","0dee302e":"transferToRef(address,uint256)","0dee34ed":"tokensaleStageAt(uint256)","0dee3863":"nameEntriesCount(bytes32,uint16,bytes32)","0dee4af0":"doThrow(uint256)","0def3866":"updateChamp(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)","0df04802":"_7_russkayaRuletka()","0df07980":"secondLevelPrice()","0df0de11":"ownerChangeBuyerfee(uint256)","0df104d7":"EtheeraToken(address)","0df12532":"setpricefactor(uint256)","0df18942":"hsub(uint128,uint128)","0df19d35":"lockup(address)","0df22268":"CryptoSanguoToken()","0df23e5b":"saleCounterThisPhase()","0df2dcd2":"OdinToken()","0df3a342":"_coldStorage()","0df4135a":"CMCT()","0df428f0":"GoldenFleeceToken(uint256)","0df62a33":"Lilbank()","0df63210":"DOMAIN_SEPERATOR()","0df71602":"setWinner(uint256)","0df76370":"createInvoicingAddress(string,string)","0df8cbfe":"isCluster()","0df8e481":"setassetPrice(uint256)","0df9178f":"LimeEyes()","0df9d568":"CentraWhiteList()","0dfa1140":"_RaffleDraw()","0dfa71ae":"salesAgent()","0dfad849":"TokenSale(address,address,address,address)","0dfb0297":"changePriceSelectFight2Death(uint256)","0dfb6615":"user(bytes32)","0dfbdcc5":"lethalBonusAtHits()","0dfc2bcd":"originalFunds()","0dfce266":"setCovman(address)","0dfd085a":"ICOBeginsAt()","0dfd45f9":"removeHelper(address)","0dfd799c":"SponsoredLink(string)","0dfdcb76":"setAuctionWinnerMessageHash(bytes32)","0dff5cb9":"bop()","0e001ec0":"balanceOfContractFeeToken()","0e011262":"mockWhiteList()","0e014cf8":"viewBalance(address,address)","0e0280d0":"bookRoom(string,uint256[],uint256,address,bytes32)","0e0290a4":"_3_orientation()","0e037cc0":"bulkRemove(address[])","0e03f276":"setLLV_edit_7(string)","0e04a7d8":"isGameOver()","0e05a512":"superVoteAgree(address)","0e0643ae":"EvTokenAdd(uint256,uint256)","0e06e7ef":"NFOCoin(uint256,string,string)","0e0701be":"test_oneValidEqStringUint(int256)","0e07419c":"ConversionStarted(uint256)","0e07658b":"eliminate(uint256)","0e07ef81":"registerNameXname(string,bytes32)","0e0a0d74":"getAmount(bytes32)","0e0a6f0c":"getHours()","0e0ac84c":"QBASE()","0e0afb86":"getKYCVerificationContractAddress()","0e0b3519":"rateTierHigher()","0e0bc104":"computeNextGen0Price()","0e0c3f58":"super_transfer(address,uint256)","0e0c8241":"MAXIMUM_LOOP_BOUND()","0e0d3567":"highestAddressReserving()","0e0d946b":"CyberPayToken()","0e0dbd72":"updateToSendFromStorage(address)","0e0e26da":"getRemainShareAmount()","0e0e4acc":"LIANG(uint256,string,string)","0e0e73a8":"next_round_players()","0e0f05a5":"executeRaiseCapital(uint256)","0e0f1f00":"allocationAddressPreICO()","0e0f55d0":"RewardOrder(uint256,uint256)","0e0fec9f":"Arbitrage()","0e1087c3":"getMarketMakerFunds()","0e10e99d":"Vault(bytes32)","0e10f1ae":"X2()","0e114c89":"setBonusAffiliate(uint256,uint256)","0e11624b":"crowdsaleBalances(address)","0e136b19":"deprecated()","0e137368":"getBorrowInfo(uint256)","0e13af5d":"lockedTokensWallet()","0e13b9af":"getValue(uint8,uint8)","0e1456c0":"maxPreSale2Token()","0e149b52":"RBRToken()","0e14a376":"deleteAddress(bytes32)","0e14f955":"readyTobreed(uint256,bool,uint256,bool)","0e153d48":"MarketStake(address,address,address,address)","0e15561a":"totalRewards()","0e1565c2":"getClaims(string)","0e15dc89":"sizeOf()","0e169119":"grantAccess(bytes32,address,string)","0e18d11e":"changeFunder(address,address)","0e18ea3c":"fuoco()","0e19bac1":"MOBILINK()","0e19f74f":"makeDeposit(uint256,address,address,address)","0e1a0217":"boolOrRevert(bool,uint256)","0e1a0399":"calculateWithdrawalAmount(uint256)","0e1a9e3f":"getJobSkillsArea(uint256)","0e1ac81f":"natecoin(uint256,string,string)","0e1ae0e4":"RateUpdated(uint32)","0e1af57b":"getScore(uint256)","0e1b39fb":"Wallet()","0e1c0188":"errorTickerQueryError(string,bytes32)","0e1c2d46":"deliveryVSpayment(bytes32,uint8,bytes32,bytes32)","0e1c6491":"getTotalBettersForFighter(address,address)","0e1ca8a5":"Oraclize()","0e1cdd2d":"getStandardComponent(uint256)","0e1cfd97":"tokensub(address,uint256)","0e1d2ec8":"isUpdatable()","0e1d88fc":"addTender(uint256,uint256,address,uint256)","0e1da6c3":"claimTimeout()","0e1e1d0f":"removeAuthorized(address,address)","0e1e3914":"coreSupply()","0e1e56f7":"Tix()","0e1f6d3b":"DIGC(address[],uint256[])","0e1fa28f":"containMinValueFromOther(uint256,address)","0e1fd315":"changeWhitelistStatus(address[],uint256[])","0e20ebe2":"right96(uint256)","0e213129":"ZestCoin()","0e216954":"ReturnEthToEtherhero()","0e21750f":"setFund(address)","0e219339":"getContractHash(string)","0e21a6a6":"ADD_TIERS(bytes32)","0e21c886":"OWNERS_TOKENS_AMOUNT()","0e21f784":"getCoverImage(address,uint256)","0e21fce3":"Suggest(string)","0e2286d3":"rdiv(uint256,uint256)","0e22dc5b":"getAllCommentIdsByAd(uint256)","0e2318cb":"BonumFinancialTokenPreSale(uint256,uint256,address,address,uint256)","0e234cd4":"countBonus(uint256)","0e2350ba":"TopCoinSaleClosed()","0e239679":"SputnikToken(address)","0e2451c7":"Lilith()","0e24c52c":"register(string,string,string,string)","0e24c810":"calcAmountWithBonus(uint256,uint8)","0e2562d9":"getAccountAddress()","0e25b620":"addFreeze(address)","0e263906":"transferToBranch(address,uint256)","0e26fb41":"SeniumSupply()","0e27324d":"approveKYC(address)","0e274eab":"pullTokens()","0e275b49":"artworkSaleCount()","0e27e3df":"removeConsumer(address)","0e2833eb":"random(uint8,uint8)","0e288064":"setManyBonusExtra(address[],uint256)","0e28bc4a":"CanceledAuctionEvent(address,address,uint256,uint256)","0e2916e1":"requestClosingChannel(uint256)","0e2984d1":"Cancel(uint64,address,address,uint256,int256)","0e29df22":"sendEther()","0e2a05c8":"delayOfICO2()","0e2a273f":"getCandidateIndexArrayLength()","0e2a9237":"r15Backers()","0e2b75cc":"setWhitelistedMemberTypes(uint256[])","0e2cfe93":"getPercent(uint8,uint256)","0e2d1a2a":"vestedBalanceOf(address)","0e2d27cd":"claimUnsoldCoins()","0e2dc949":"TIER_3_BUYIN()","0e2dce69":"Play()","0e2df9aa":"Withdraw(address,uint256,int256)","0e2e4037":"removeOwnersConfirmations(address)","0e2e4ce8":"maximumLockYears()","0e2ebe6c":"GetPoolInformation(address)","0e2f0a0f":"weiReceive()","0e2f5fb3":"getThree()","0e2f8058":"setBCFContractAddress(address,address)","0e2f94a6":"RegionsToken()","0e30643f":"MemberChanged(address,uint256)","0e30cda7":"getTotalCoinsAvailable()","0e316ab7":"removeSigner(address)","0e32a720":"sendMarketByOwner(address,uint256)","0e336f00":"getSeedsSinceLastHatch(address)","0e33e181":"get_modulo_value(bytes32,uint32,uint32)","0e3484c1":"DelGift(string)","0e34df82":"openTicket()","0e351605":"transfer_token(address[],uint256)","0e3589d9":"DAILY_FUNDS_RELEASE()","0e366cbf":"ourLastJackpotWinner()","0e3802e9":"addRewardToken(address,uint256)","0e388774":"setContractorImpl(address)","0e38901a":"unvault(uint256)","0e39b210":"founders_1()","0e3a04a7":"digitalcashToken()","0e3a23db":"mineMany(address[],uint8[],bytes32[],bytes32[])","0e3a997e":"countPartnerPlayers()","0e3ab61d":"startSale(uint256)","0e3b70fd":"month48Allocated()","0e3bc6ca":"BLOCKLAND()","0e3be37d":"ToggleTransferAllowanceFor(address,bool)","0e3c8068":"BotpyToken(uint256,string,string)","0e3c9563":"privateIssue(address,uint256)","0e3d2202":"feeFixed()","0e3db9f2":"startNow()","0e3e9a67":"FundsMigrated(address)","0e3f732a":"TheGame()","0e3fd8c2":"getSolid(uint256)","0e407bdd":"soldTokensMainSale()","0e414500":"setClaimingStart(uint256)","0e417055":"address5()","0e41c63b":"addHistory(uint256,address,uint8)","0e420f42":"setEventResult(string,uint64,uint8)","0e429ecc":"providerValue()","0e4355d4":"validFactories(address)","0e43806a":"Rental(address)","0e438ee5":"withdrawTeamToken()","0e43d7c3":"getUserRoleBitmask(address)","0e449cf9":"foundersTokens()","0e4649fd":"LogProcessedInterval(uint64,uint64)","0e46695e":"sumHardCapICO2()","0e468245":"pledgeEth(uint256)","0e473722":"volumeType4()","0e4739b1":"_refulshFrozenInfo(address)","0e476e27":"getten(string)","0e479dc7":"getShop(address)","0e47c259":"evolveByAtom(uint256)","0e47c76f":"rotate(uint64,uint256)","0e496d25":"VICETOKEN_ICO_IS_FAKE()","0e4983ff":"setSecondsAfter(uint256)","0e4a4e8c":"fechVoteNumForCandidateByStage(address,uint256)","0e4aed3f":"yearlyRewardPercentage()","0e4b0ba8":"account2Address()","0e4b10b6":"totalETHLimit()","0e4b8389":"getEstKeyBlockNr(uint256)","0e4c3aa6":"OrangeCirculateChain()","0e4d5919":"PHASE1_START_TIME()","0e4debbc":"SHIT()","0e4e0054":"isIcoFinshed()","0e4e47cb":"claimAfter90days()","0e4e5d93":"_bidERC20(address,address,uint256,uint256)","0e5004e6":"_calcPhasesPassed()","0e501834":"emergencyTransfer(address)","0e51574f":"endGameRound()","0e51c00d":"getPawnStatus(uint256)","0e5229b0":"addOwner(address,uint8)","0e5263fa":"discountedTokensPerDollar()","0e5356ec":"testEvents()","0e536ff4":"ratifyMint(uint256,address,uint256)","0e5376d6":"vars()","0e53aae9":"connectors(address)","0e53bf67":"producedDiamondCaps()","0e541185":"pauseBet(uint256)","0e542f82":"refundOptions(address)","0e54316f":"setSantaClaus(address)","0e54a883":"setPublicSaleDate(uint256)","0e54b872":"registerUser(string,address)","0e54d1fc":"pruneShareholders(address,uint256)","0e554bd8":"scheduleCall(bytes,uint256,uint256,uint8)","0e5689bc":"getBidsNum(address,uint256)","0e56f529":"guardarDocumento(string,bytes32,bytes32)","0e58369f":"registrator(address)","0e583df0":"GEN0_STARTING_PRICE()","0e587aee":"set_presale_arbits_per_ether(address,uint256)","0e58d08c":"setInvestmentGateway(address)","0e597ed9":"PreCrowdsale(address,address)","0e5a6c70":"peep()","0e5aaace":"initIcoRule()","0e5aaffc":"getSellingItemByObjId(uint64)","0e5c011e":"harvest(address)","0e5c6a3d":"_withdrawTo(address)","0e5ceb47":"register(bytes32,bytes32,string)","0e5d095d":"codepointsOf(uint256)","0e5d4b99":"fechVoteMainInfoForVoter(address)","0e5e36fb":"TCH(uint256,string,uint8,string)","0e5e4d72":"createAndExecuteTransaction(address[],uint256[],uint256)","0e5fc721":"addUserBalance(uint32,uint64)","0e5fdad4":"releaseTeamTokenTransfer()","0e5ffb3c":"hashVersion(uint32,uint32,uint32,string,string)","0e60de7a":"rinkeby3()","0e620d70":"MultiSend()","0e62fde6":"getAttributeTypeID(uint256)","0e6436d2":"TokenChange(address)","0e64780d":"distribute(address,uint256,uint256,uint256,uint256,uint256,uint256)","0e64ff0e":"tradeWalletTokens(address,uint256)","0e655432":"adventureItemContract()","0e65e5d9":"ETBSToken(address)","0e662cf0":"buyTokens(uint16)","0e662ff9":"oddEven(uint8,address)","0e666e49":"userExists(address)","0e67cf6c":"GetWageredWei(bytes32)","0e67f4bb":"ReferrerRegistered(address,address)","0e6848cc":"massNotify(address[])","0e686170":"changeTotalAirdrop(uint256)","0e687501":"OpticalNetwork(address)","0e68c2f0":"finishPurse(uint256)","0e69782b":"BCTT()","0e698493":"transferFounderTokens(address,uint256)","0e69890f":"withdrawATN()","0e69d16b":"testToSliceB32()","0e6ae3fb":"bid(string,string,uint256)","0e6b0afc":"adminContractSettings(uint32,address,uint256)","0e6b5823":"changeMaxBet(uint8[157])","0e6bc36c":"OkeToken()","0e6c04db":"icoThreshold1()","0e6c5f93":"changeAddr(address)","0e6ce30d":"createNew(uint256)","0e6d1de9":"getLatestVersion()","0e6d3a89":"mintingState()","0e6dfcd5":"redeem(address,address,uint256)","0e6e1b3e":"addSubject(bytes32)","0e6e4f3e":"lockPlayerFunds(address)","0e6f21f2":"sendBatches(address[],uint256)","0e6f2cf8":"game_withdraw()","0e708203":"rewardAccount()","0e70ab11":"addEthBonusToBuy(address,uint256,uint256)","0e70f147":"immediateRefund()","0e713a50":"_preValidatePreICOPurchase(address,uint256)","0e714202":"returnContributionsToTheSponsors()","0e7238f1":"setNormalRoomMax(uint256)","0e741a36":"generateVoteSecret(string,uint256)","0e7470cb":"getFullProfit(uint256,uint256,uint256)","0e757191":"finalizeRound(bytes32,uint8,bytes4)","0e757a2e":"testSetAndGet()","0e78501f":"ChangeStart(uint256)","0e787cce":"predict(bytes32)","0e792536":"removeGlobalConstraint(int256,address,int256,address)","0e7938ec":"tokenCreateFunction()","0e79964c":"getBoolField3()","0e7a2d4e":"isInAssetList(address)","0e7a967a":"_distributeBountyToken(uint256)","0e7b592a":"Halo()","0e7b8e07":"Sleipnir()","0e7b9f10":"hasBuyerLotteryBonusWon(address)","0e7bda18":"addAddressListItem(bool,address,address,uint256,address)","0e7c0f80":"masterCopyCountdown()","0e7c1cb5":"originalToken()","0e7c5d2b":"test_validEmptyEqEmpty256()","0e7ce976":"owner_bonusSend()","0e7d490d":"numberOfVotes()","0e7ebce4":"min_bid()","0e7f2be7":"DecreaseAllowance(address,uint256)","0e7f756a":"totalAssetUnits()","0e801d7a":"ticket(address,bool,uint256)","0e80d8b9":"PRICE_SALE()","0e816f66":"payForYourGladiator(uint256)","0e830e49":"setEngine(address)","0e8354b9":"CreateOOG(address,uint256)","0e83afbb":"approveTokens(bytes32,address,uint256)","0e83d92b":"playerPull()","0e840284":"LMDA()","0e848c1d":"NeoBitToken()","0e850239":"scheduleCall(bytes4,bytes)","0e856588":"getScheduledTimelockCount(address)","0e858b64":"setBridgeValidatorsOwner(address)","0e8670e0":"highestPrice()","0e86b63e":"calcLevel2Bonus(uint256)","0e86ec01":"doConfirmDeath()","0e870871":"rateOfZLT()","0e87457b":"ZincElement()","0e887cda":"getUserMoney(address)","0e88aace":"contractErc20Token()","0e88c4a4":"RegisterMine(string,uint256,address)","0e89341c":"uri(uint256)","0e89439b":"stake(uint256,bytes)","0e8a4ac7":"getPositionPrincipal(bytes32)","0e8b3971":"mintTap()","0e8bf00e":"ReleaseOfAccount(address,uint256)","0e8c0cdd":"_mineableSupply()","0e8ca718":"transferCurationRights(address)","0e8da019":"getInitRound(uint256)","0e8de473":"getDividendBalance(address,address)","0e8ef0c1":"systemOnSaleCount()","0e8f0a95":"commonDiscount()","0e91f4b3":"removeBadToken(address)","0e923d3b":"submitEther(address)","0e9279a0":"BountyManager()","0e929611":"AdminRemoval(address)","0e92eb6d":"sellMyTokens(uint256)","0e934447":"createPromoPlayer(address,string,uint256,uint256)","0e940fd8":"CELL_ADD_SPACE()","0e94869e":"ArJoust(uint256,uint256)","0e94a0ee":"proofToken()","0e95e127":"readpriceXname(string)","0e96127a":"transferEther(address,address,uint256)","0e96938c":"matchExistingBids(bool,bytes32)","0e972421":"isSpawningAllowed(uint256,address)","0e975f73":"FirstPeriodEndDateUpdated(uint256,uint256)","0e978e81":"AgriChainDocumentContract()","0e97cfdf":"placeOrder(uint256,uint256,uint256)","0e97e3d3":"validateAuthentication(address,uint256,uint256)","0e97fa7a":"setEarlyParticipantsWhitelist(address[],bool[],uint256[],uint256[])","0e98f811":"reservedTotalSupply()","0e995ff5":"cd()","0e997ce3":"IPMCoin()","0e99b380":"getCoinAddress(bytes4)","0e99f5e6":"claimBonus(address)","0e9a9dbb":"signature(string,address,bytes32)","0e9aa208":"getAddressAdmixture()","0e9b6281":"setSubsidy(uint256)","0e9cbbad":"PurchaseFailed(address,uint8)","0e9ccb94":"Boboho()","0e9d02cc":"setTokensPerKEther(uint256)","0e9d56a2":"getTotalEth()","0e9e543a":"collectableTokenOf(address)","0e9ecedd":"mEtherInvalid()","0e9ef902":"join_voter()","0e9f0816":"getContractHash(uint256)","0e9f9f86":"isMinimalReached()","0e9fb0ed":"getOptionAddress(address,uint256,address,uint256,uint256,bool)","0e9fd199":"licenseAffiliate(uint256)","0ea008c8":"bonuscalpre()","0ea04562":"requestRandom(uint256)","0ea12558":"girlIdToOwner(uint256)","0ea126f9":"registerUser(address,string)","0ea17a76":"safe_mul(uint256,uint256)","0ea1f459":"DVCToken()","0ea227e7":"StarTravelLane()","0ea317a9":"SUNCOIN()","0ea37c64":"repost(uint256)","0ea412ab":"_setPrice(uint256)","0ea49bc1":"changeRental(address)","0ea51122":"decreaseMarketCreatorSettlementFeeInAttoethPerEth(uint256)","0ea5edea":"payTodayReward(address,uint256)","0ea662ea":"hourPot()","0ea733bf":"setmyPrice(uint256,uint256)","0ea7a110":"getEmployee(address,uint256)","0ea7c8cd":"airDeliver(address,uint256)","0ea7ee82":"testRegisterAndVerified()","0ea81cf9":"initialPokemonInfo()","0ea8e5ac":"tokenPriceIncremental_()","0ea9e4f1":"doInitialReport(uint256[],bool)","0eaac106":"TokensAdded(address,uint256)","0eaadd04":"_addBurner(address)","0eaaf4c8":"withdrawBid(uint256)","0eaaf5ac":"auction_start_time()","0eab31b1":"initAuctions(uint256,uint256,uint256,uint256)","0eaba26a":"getCurrentValidatorsLength()","0eabdab6":"removeOracles(bytes4[],address[])","0eabeffe":"sendMessage(string,string,string)","0eac6ae7":"getClientAtIndex(uint256)","0eac7a0e":"transferToAnotherAddr(address,address,uint256,string)","0eacecd2":"getEquipTokens(address)","0eacf634":"BKCToken()","0ead3ec8":"payeePricePerPart()","0eada49f":"standingOrdersByPayee(address,uint256)","0eae2f86":"initAccount(address,uint256)","0eae73dd":"stringToAddr(string)","0eaee52c":"setGrantsUnlock(uint256,bool)","0eaf94c3":"secondDueDate()","0eafb6da":"getCapInWei()","0eafe473":"balanceOfCoin(address)","0eb05d49":"viewGoldList(address)","0eb0afa6":"createDebt(address,address,uint256)","0eb14edb":"Mondo()","0eb15f0f":"claimRewardWithBlockData(uint256,bytes)","0eb1947f":"changeGatewayAddr(address)","0eb288f1":"executeTransaction()","0eb34740":"lockedTokens()","0eb3f5a0":"sweepCommission(uint256)","0eb3f993":"getAreaQualityByDay(uint32,uint32)","0eb40426":"IncPreSupply(uint256)","0eb40916":"EthernautsStorage()","0eb43fe3":"SaleClockAuctionERC20(address,uint256)","0eb495c2":"pushCity()","0eb4c7d6":"checkTeamUnlockedTokens(address)","0eb4d170":"setLockup_dakehus(address,uint256,uint256)","0eb51018":"getProductOperation(string,address,uint256,uint256)","0eb523ac":"PRIVATE_STAGE_FINISH()","0eb524d4":"block1()","0eb5a167":"XCloudRoc()","0eb6f543":"hodlerTotalValue6M()","0eb82c13":"updateHpbNode(address,bytes32,bytes32,bytes32)","0eb8d153":"AICoreCoin()","0eb8ed07":"transferEnable(bytes32)","0eb8fe7a":"getChannelCount()","0eb944d5":"PiperToken()","0eba6b06":"getChannelInfo(address,address,uint32)","0eba7f2d":"SomeCoin(string,string,uint8,uint256)","0ebb0d30":"getSummaryReferralProfit(address)","0ebb172a":"WITHDRAWAL_DELAY()","0ebbe5d6":"firstPrivateLockTime()","0ebbf213":"AddPauser(address)","0ebc1568":"viewTokenName(uint8)","0ebdc43a":"IsSaleEnabled()","0ebe0f32":"HacToken()","0ebe31c8":"getCountTrack()","0ebe4acb":"EtherModifierMonstro()","0ebf0bcb":"FAID(uint256,string,uint8,string)","0ebf3886":"CryptoLandmarks()","0ebf5f27":"Reservation2(address,uint256)","0ec0692a":"prizeEth()","0ec0786d":"tb()","0ec08b29":"getLoopLimit(uint256,uint256)","0ec0fce5":"setPercentage(uint256,uint256,uint256,uint256)","0ec1268c":"_freezeFunds(address,address,uint256,uint256)","0ec12782":"internet()","0ec173d0":"changeTreshold(uint16)","0ec1b057":"verify(bytes32,string,string)","0ec1ce16":"_getCurrentRate()","0ec1e7ac":"claimBalanceByOwner(address)","0ec2c379":"_getJYPCBonus(uint256)","0ec2c5d7":"loik()","0ec3b247":"testControlSetEnforceRevisionsNotOwner()","0ec3f62e":"NITRONEUMERC20(uint256,string,string)","0ec48a42":"quater4()","0ec4fb0a":"WHITELIST_PERIOD()","0ec52541":"unshelf(string)","0ec59606":"addPlayerTxHistory(address,uint256,uint256,uint256,uint256)","0ec5c49a":"changeEthToTokenRation(uint8)","0ec6688d":"intrepidSoldCount()","0ec66924":"getStudentRequestsLength()","0ec6b08d":"validIdentifier(uint256)","0ec78d9e":"setup(address[],uint256,address,bytes)","0ec843d1":"setMinAmount3Round(uint256)","0ec852f2":"QuranToken()","0ec89f2b":"requiredProgressOfPreviousDungeon()","0ec8c387":"getContractRates(bytes32)","0ec8e2b4":"Moneyplant()","0eca4c92":"CryptoPunksMarket()","0ecae7d3":"wager(bool,uint256,uint256,uint8,bytes32,bytes32)","0ecaea73":"create(address,uint256)","0ecb93c0":"addBlackList(address)","0ecba3f8":"BusinessAutomationUnion()","0ecd0424":"decompressPoint(uint256,uint8)","0ecda113":"freezeEndTime(uint256)","0ecdbfd4":"DesingCoin()","0ecdd94f":"goldFeeDataUpdatedAtBlock()","0ecea92c":"allowInvestor(address)","0ecf19e5":"balanceWithoutFreezedBonus(address)","0ed0b19f":"resetBonusPool(uint256,uint8)","0ed15d23":"dInit(address)","0ed21029":"getIssueAssignee(uint256,bytes32)","0ed2fc95":"exchange(address,address,uint256,uint256)","0ed387c1":"getSpinsContainer(bytes32)","0ed3909c":"startBonusCompaign(uint256)","0ed3d5b9":"passed(address[])","0ed40dff":"resetAppendDecryptedBids(uint256)","0ed469b8":"houseFee()","0ed5410a":"endOfRewards(bool)","0ed59a60":"releaseProof(bytes32,string)","0ed5a933":"isCanceled()","0ed61407":"makePick(uint8,uint256)","0ed659b4":"getLLV_edit_18()","0ed68aa5":"getPlanetOwners(uint256,uint256)","0ed6b171":"LogStartICO()","0ed74c08":"func_0C2C()","0ed7a0f2":"Predatex()","0ed7c905":"FantomToken()","0ed86f04":"withdrawDivis()","0ed9b97b":"buy_fromContract()","0edaf441":"lockAddressRegistration(address)","0edc1923":"changeMaximumHodlDuration(uint256)","0edc4737":"SEED()","0edc54a8":"holdTokens(address)","0edd2ffc":"penalty()","0edddd3e":"lstFunc(uint256[])","0ede050b":"ico3Max()","0edf2134":"deathData_a17()","0edfb0f7":"withdrawCollectedInterest()","0edfe7ec":"setBackendWallet(address)","0ee02d9d":"getHash(address,address,uint256,bytes,address,uint256)","0ee07836":"adjustDifficulty(uint256)","0ee21ddc":"setEtherPriceUSDWEI(uint256)","0ee2b0e6":"commissionToWithdraw()","0ee2cb10":"getCreator()","0ee2ce58":"VKNToEth()","0ee33128":"RequestRefund()","0ee33c70":"claimed_blocks()","0ee36dbc":"setParamsStopSale(bool)","0ee3c31d":"getUserIndexOnEther(address)","0ee4229c":"grantReservedToken(address,uint256)","0ee454dc":"getBUB(bytes32,uint256)","0ee526e0":"enableMintToken()","0ee5ca1f":"secondsLeftPublic()","0ee62c77":"getStageVolumeBonuses(uint256)","0ee75f6b":"TOKEN_THIRD_PRICE_RATE()","0ee7968e":"REWARD_NUM()","0ee79fb3":"closeReferendums()","0ee7c858":"beatMartialOwner()","0ee7f045":"TransferSellAgent(address,uint256)","0ee85800":"getCFOHashing(address,uint256)","0ee8e338":"testFailCreateWithParentsForeignNotInUse0()","0ee95ecf":"getNextPrice(bytes32)","0eea10b1":"sysPer()","0eeb63b9":"getUserAccountTokenBalance(address,address)","0eebd59b":"log_recast(address,uint256)","0eebdb04":"AprilAirdrop(address,address)","0eecae21":"draw()","0eecc2a3":"updateRequiredTimeBetweenDraws(uint256)","0eeccb84":"removeAdvisor(address)","0eedc7b5":"voteDescription(uint256)","0eedc9d9":"payAffiliate1Address(address)","0eefdbad":"tokenTransferProxy()","0ef12aa9":"getUserID(address)","0ef14b98":"viewFirstLotOfClauses()","0ef25f8b":"TicTacToeRules(address,address,address,address,uint256)","0ef26743":"height()","0ef270d5":"CreateNewAccount()","0ef2d7af":"bonusDeadline()","0ef43cbd":"confirmerNouveauProprio()","0ef486d1":"revisions(uint256)","0ef504ae":"preSaleHalted()","0ef524ff":"setDefaultMint(uint256)","0ef5a7e0":"allocateToCrowdsalePurchaser(address,uint256)","0ef60e48":"setRubusOrangeAddress(address,address)","0ef67887":"Balance()","0ef6eb9c":"getCompte_33()","0ef71d79":"privatized(bytes32,bytes32)","0ef72880":"DADXChainERC20()","0ef76243":"withdraw_Arina(uint256)","0ef7cc8e":"metadataOf(uint256)","0ef845df":"propose(address,string,string,string,string,string,uint256,uint256,uint256,uint256)","0ef96356":"stakeFor(address,uint256,bytes)","0efafc03":"SaleClockAuction(address,uint256)","0efafd01":"getPlayerGainLossOnLastFlip()","0efc9d03":"minEthToRaise()","0efcf295":"deleteAnyProposal(bytes32)","0efd0973":"club()","0efd2cca":"postICO()","0efd3d5b":"getPrice(string,string,uint256)","0efd4989":"numAdmins()","0efe5fb7":"addToCart(uint256,string)","0efe6a8b":"deposit(address,uint256,uint256)","0efe7f62":"objectShoes()","0f00dfdb":"NonOperationalWithdrawManager(address)","0f027c67":"membersLength()","0f0308fb":"upgradeGems()","0f03be37":"mimax(uint64,uint64)","0f03e4c3":"numberOfAccounts()","0f041cef":"KitFutureToken()","0f0433c4":"_getDroneAbility(uint256)","0f050dce":"getBitcoinAddress(bytes32,int256,bytes32,int256)","0f052173":"invest2017()","0f059913":"vested(address,uint256)","0f06670a":"didWin(bytes32)","0f092c44":"MIDGRADE_TYPE3()","0f096163":"Chainy()","0f0ba766":"removeChild(uint256,address,uint256)","0f0c27ad":"HashRegistered(bytes32,address,uint256,uint256)","0f0ed39e":"EthealPromoToken(address)","0f0f3f24":"addOwnerAddress(address)","0f106e0a":"encodePacketCommit(uint256,uint256)","0f120fc3":"toggleTrading()","0f122a6c":"_setSealableProperty(uint256,bytes32,bytes32)","0f12354d":"updateStateBasedOnContributions()","0f12b32a":"Garcut()","0f12d8f8":"RoundWinner(uint256,uint256,address,uint256)","0f12ffac":"weiToFNU(uint256)","0f134bee":"payPreviousOwner(address,uint256)","0f1354f3":"burnFrom(bytes32,uint256)","0f136527":"getShareIndex(address)","0f13af83":"setCurrentCoin(address)","0f13dbde":"inRankList(address)","0f14212b":"transferFromOwner(address,uint256,uint256)","0f145dca":"Ethbet(address,address)","0f149d0a":"changeBurnPaused(uint256)","0f14a7e4":"ModeratorRemoved(address,address,bool)","0f14b900":"setTimeStampStatus(uint256,uint256,string)","0f15573b":"setLLV_edit_2(string)","0f15f4c0":"activate()","0f166ad4":"local()","0f183119":"vote_for_candidate_D_for_Free()","0f188e1d":"studioLevel(address)","0f18a530":"chemistry()","0f18ac07":"transferFromOwner(address,uint256)","0f191524":"fillOrder(uint256,bytes)","0f19f92a":"isIcoOver()","0f1a6444":"cliffTime()","0f1bf454":"getGameStatus(uint256)","0f1df574":"WithdrawETH()","0f1e3b5b":"getHousePayout()","0f1e8c24":"commitTeam(address,uint256,uint256[])","0f1ed0c6":"setOwner(address,bytes32,address)","0f1fd654":"ELearningCoinERC()","0f2004a1":"Bob(address)","0f201ca6":"reportConvertTokens(uint256,address)","0f20b9df":"crowdsaleContracts(address)","0f215afb":"paySeller(uint256,uint256)","0f21a046":"WithdrawMonethaBuyerUtility()","0f226a31":"getServiceUpdateAddress(address,uint32)","0f228087":"transferTokens(address[],address)","0f2284cc":"SbuyToken(address,address)","0f22a95d":"deleteCountry(uint256)","0f23a104":"burnAssetOperator(uint256)","0f23b047":"getPlayNumber()","0f23cbaa":"recycle()","0f246780":"ZJF()","0f24f5c8":"doTransfer(address,uint256)","0f250780":"AKCToken()","0f2636bd":"getStockSellOrderPrices(uint256)","0f264e1a":"farmerRequestCertificate(address,uint256,string,string,string,uint256)","0f2905f7":"verifyStage()","0f29eb73":"revokeStaking(address)","0f2bc56d":"fixTokenCalcBug()","0f2c9329":"split(address,address)","0f2da195":"LimitSet(uint256,uint256,uint256,uint256,uint256)","0f2dabca":"punchIn(address,uint64)","0f2e5b6c":"Locked()","0f2f9bb7":"getNextWhitelistedNode(address)","0f2fa473":"test_already_paid()","0f3092fb":"EasyHomes()","0f30c971":"TheGambler()","0f3554ad":"addBoolListItem(bool,address,address,uint256,bool)","0f36f691":"getLockStatus(address)","0f37e79a":"transferClockmaker(address)","0f37fd4a":"HexelErc20Token(string,string)","0f391236":"ethRateMax()","0f39c6ab":"removeVotersVote(address)","0f3a00d5":"CreateCOR(address,uint256)","0f3a0533":"extraReceiverAmount(address)","0f3a1412":"getArrlist(uint256,uint256)","0f3a31d6":"SymbolChange(string)","0f3a9f65":"setPeriod(uint256)","0f3ae419":"PreferentialRateChange(address,uint256)","0f3afeec":"Nodelist()","0f3b305e":"getPawnPackageId(uint256)","0f3bd3fd":"teamJust()","0f3c92f3":"calculateFLCCore(address,uint256)","0f3cb8bc":"setCardUpgradeLevels(uint256,uint256,uint256)","0f3d7c3e":"release(string,uint32[3],string,string,string)","0f3d8803":"getMinPurchase()","0f3de489":"newAuction(uint256,uint64)","0f3e7027":"clearTransferValueby(address)","0f3e9438":"frontRunner()","0f3eb785":"add(string,uint256,uint256,uint256)","0f3f0e42":"allowTotalMintAmount()","0f3f53c1":"dappsBonusCalc(address,uint256)","0f3fb52a":"LogSetState(uint256,uint8,uint256,bytes32)","0f3fc29e":"setChestProduct(uint16,uint256,uint16,bool,uint32,uint24,uint24,uint8,uint8)","0f40593e":"ViewMyBet()","0f40988e":"contributorsShare()","0f40d645":"demander(uint256)","0f4170f2":"BaseICO(address,address,uint256,uint256,uint256,uint256)","0f41ba4b":"bid(address,uint256,uint256)","0f420113":"_calculateCurrentRate()","0f42fdfb":"recoveryModeTriggerTime()","0f4391f5":"setPauseMaster(address)","0f43a677":"validatorCount()","0f43c196":"setTournamentAddress(address,address)","0f45368c":"checkTransferHash(address,uint256,address,address,uint256,uint256,bytes)","0f45c3e1":"transferFromAny(address,address,uint256)","0f45f528":"getTknOfferor(uint256)","0f4665aa":"getOrderHash(address,uint256,address,uint256,address,uint256,uint256,address,address,uint256)","0f47165e":"managePlayer(address)","0f473d72":"_calculateDiscount(uint8,address)","0f47435b":"pvt_inv_Pool()","0f481bf7":"postTransfer(address,address,address,uint256)","0f482da1":"unblockSpending(address)","0f482e64":"LikeCoin(uint256,address,address)","0f4acfcd":"charToByte(bytes1)","0f4b1cfc":"setGovernment(address)","0f4bbdf2":"registerBuyer(string,string,string,string,address,string)","0f4cf692":"numMessages()","0f4d14e9":"depositEth(uint256)","0f4df754":"Gladiethers()","0f4dfc17":"ICOTokenDelivery(address,uint256)","0f4ef8a6":"rewardManager()","0f4f8184":"bancorRegistry()","0f4fd9cc":"log_event(string)","0f4ff474":"_openGameResult(uint256,uint256,uint256,string)","0f501d07":"saveInfoAboutInvestors(address,address,uint256,uint256,bool)","0f505a01":"sealDataStream(address,uint256,bytes32,uint256,bytes32)","0f5137f9":"sellOrderBalances(bytes32)","0f522614":"Shufflix()","0f527200":"SimpleCoin()","0f529ba2":"D()","0f52fb0a":"searchFreelancers(address,uint256,uint256[],uint256[],uint8,uint256,uint256[],uint256[],uint256[],uint256)","0f5381f1":"testUserCanIncreaseVersionNumber()","0f53a470":"getProfile(address)","0f53b7ee":"communityTokensAddress()","0f53ba51":"appWasMade(string)","0f53e2a8":"NewToken(address)","0f555b46":"MicroCoins()","0f560cd7":"list()","0f56e460":"Shitcoin()","0f574ba7":"subscribe(uint256)","0f577d97":"getCompte_16()","0f57b9d9":"removeFromPrivileged(address)","0f57eb79":"minboc()","0f581aed":"MinimumBitcoinInvestmentUpdated(uint256,uint256)","0f58d28f":"weightOf(string)","0f590c36":"emergencyFixGameResult(uint64,uint256)","0f59a638":"totalWeiCommitted()","0f59eb95":"ownerUpdateOthers(uint256,bool,uint256,uint256,bool)","0f59f83a":"go()","0f5a5466":"claimWithResolver(address,address)","0f5a8d9c":"raiseDollarsFunded(address,uint160,int160)","0f5aa9f3":"setAuthorization(address,address)","0f5ad969":"node_index(address)","0f5b807d":"cuddleData()","0f5bab7c":"countManagers()","0f5c8c0a":"balancesDB()","0f5e7348":"getCommunityBallotCentsPrice()","0f5ea100":"price(address,uint256,uint8)","0f5eacf6":"EndStage()","0f5ed9e9":"escrowAllowed(address)","0f5ee138":"userSignupCount()","0f5f0151":"GxTradersProxy(address)","0f5f1dbc":"operationsAccount()","0f5f4c53":"unpause2()","0f5f8593":"MetaBall(uint256,string,string)","0f601679":"balanceOwner(address)","0f60e3d9":"resetAddTokenData()","0f610c06":"getValidatedLiability()","0f61280e":"nutzAddr()","0f62562f":"pregnantNinjas()","0f632fd3":"onMint(address,uint256)","0f63d864":"addOwners(address[],uint256[],uint256[])","0f6413b7":"batchAssignStopped()","0f64864d":"transferTokensAndDividends(address,address)","0f6521e2":"FROZEN_TOKENS()","0f66791c":"setHTML(string)","0f66acd1":"EcosystemEthereum()","0f670da6":"destroyLogicContract()","0f6798a5":"Mint(address,uint256)","0f67f3f7":"distributeToDev(address,uint256)","0f683fd1":"Token(string,string,address)","0f69cdbe":"approvespender(address,uint256)","0f6a1734":"Crowdsale(address,uint256)","0f6b6756":"tokenSaleIsPaused()","0f6bb3c3":"doSpawn(uint32,int256,address,bool,address)","0f6c2a33":"setMaxStage2AllocationPerInvestor(uint256)","0f6d37d6":"supportAddress()","0f6d6236":"setIssueDividendReward(uint256)","0f6d9f00":"ERA_PERIOD()","0f6e40c3":"startRound(bytes32,bytes32)","0f6ea4fc":"MISCELLANEOUS_TOKENS_SUPPLY()","0f6f5f98":"setAndFixTokenPriceInWei(uint256)","0f6f72a8":"getClosingTimeValue()","0f710616":"TRSToken()","0f710e32":"CryptoFinexToken()","0f71590c":"setPOLYUSD(uint256)","0f732bdc":"getEncryptionAlgorithmCount()","0f73b4f4":"setStartingPrice(uint256)","0f73d212":"addLog(string,string,bytes32)","0f74a5cc":"cancelCenturionSale(uint256)","0f74e527":"RenmiCoin()","0f74e689":"registerNewPubKeyForHash(bytes28,string)","0f7503c9":"baseStartTime()","0f75806f":"GraphenePowerCrowdsale()","0f75c82e":"getObjClassExp(uint64)","0f75e81f":"issue(bytes32)","0f762cfe":"emission(address,address,uint256,uint256,uint256)","0f76496a":"returnTokens3(address,uint256,uint256)","0f76b651":"unlockDate5()","0f76c114":"getCurrentValue()","0f76de0d":"left45(uint256)","0f76f489":"getPoolName(uint256)","0f774287":"Burnt(address,uint256,uint256)","0f774931":"administrativePayouts(address,uint256)","0f776fb2":"PutDiv(address)","0f77c1d3":"addUsersWhitelistB(address[])","0f784943":"mintable(uint256)","0f78628e":"allowedToBurn()","0f7875c6":"startblock()","0f78d408":"JuvToken()","0f78ee7c":"payoutLockedToken()","0f79cfa2":"addReferrer(bytes32)","0f79e120":"nrFailures()","0f79e1c7":"createRandomDeveloper(string,uint256)","0f7a4590":"goalAchieved()","0f7a8971":"buildBoolMapping()","0f7bd1dd":"enterRaffle(uint256[],uint256)","0f7bff76":"getHeroDBZHeroAddress(uint256)","0f7c9085":"addToAdmin(address,bool)","0f7c932a":"getReservedTokensListValInPercentageDecimals(address)","0f7d6673":"Channel()","0f7e1653":"OpenGame()","0f7f97c8":"calcNewSkinAppearance(uint128,uint128,uint128)","0f7fa72f":"addOperator(address,uint256)","0f809adb":"changeTokenOwner(address)","0f80fc58":"exponent(uint256)","0f8143f6":"discardRejectedProposal()","0f819fe8":"disableTuneOption(uint256)","0f81d248":"endPeriodC()","0f822b78":"admin_transfer(address,uint256)","0f825673":"deleteCoupon(string)","0f82b42f":"userAccountTokenBalances(address)","0f832bc6":"testIsLawyer()","0f83f112":"CanTransferChecked(bool,address,bool,bool)","0f8410e3":"getPresellToKenAmount()","0f85751e":"change_p5(uint256)","0f861127":"argl(uint256,uint256)","0f861ca3":"ownerUnpause()","0f86abc1":"modifyStakerLimit(uint256)","0f86e3eb":"denaToken()","0f86f702":"compatible223()","0f87a044":"withdraw1(uint256)","0f88aa81":"emitRecord(bytes32,uint256,uint256,uint256)","0f88f1a5":"collectBounty(address,uint256,uint256)","0f89fa28":"OrganizationRegister()","0f8a771e":"skr()","0f8a8887":"rocketSetResourcePrice(uint256,uint256,uint256)","0f8b70c9":"getBotContract()","0f8bca8c":"getStage0Start()","0f8c04e2":"create(address[],uint256[],uint256[],address,address,bytes)","0f8d4030":"totalShareholders()","0f8d598a":"decayedPriceOfSocialIdentity(uint256,uint256)","0f8dc272":"ComputeAcornPrice()","0f8ea4f3":"addSomeOfManyLine(uint256,string,uint256,string)","0f8eaa74":"addToPreSaleRefunds(address,uint256)","0f8ef9f8":"getBoosterRaiseValue(uint256)","0f8f8b83":"spendableBalanceOf(address)","0f8fcb74":"_setInt(bytes32,int256)","0f8fd363":"getRepPriceInAttoEth()","0f900587":"addBonusPerShare()","0f902bc2":"delayedTransferFrom(address,address,uint256)","0f907ba3":"failCar(string)","0f90b83a":"deployTokenContract(uint256)","0f917e31":"transferAndDonateTo(address,uint256,address)","0f917f9e":"totalSupplyTeamTokens()","0f91c8a5":"setCap(string,uint256)","0f91cce1":"releaseVanbexTeamTokens()","0f92f38f":"changeMartial(uint256)","0f9302c8":"LogEvent(string)","0f95378f":"MerchantWallet(address,string)","0f953b97":"getCmcAddress()","0f960644":"addClaim(address,bytes32,string,string,uint256)","0f96dd39":"maxTokenCap()","0f973874":"MiniMeTokenSimple(address,address,uint256,string,uint8,string,bool)","0f974ef2":"PasserBy(address)","0f977561":"getUserEvents()","0f97f2f1":"managePlayer(uint256,uint256)","0f98a9cc":"lockTokens(address,uint256,address,uint256)","0f98c91a":"TOKENS_PER_ETHER_EARLYSALE()","0f99da4a":"getBoosterAmount(uint256)","0f99fab2":"allowWrite(uint256,uint256)","0f9aea56":"last_release_date()","0f9b481a":"TokenFinalized()","0f9b5129":"maxSellRateInPrecision()","0f9b87be":"transferToDestination(bytes32)","0f9bac2d":"ADVISORS_ADDRESS()","0f9bb8b3":"getCurrentUserQuickPromoBonus()","0f9c95da":"GDCAcc04()","0f9ce471":"Ether2Gen()","0f9e144d":"changeMaxMin(uint256,uint256)","0f9e39bf":"minBidMultiplier()","0f9e42da":"drawToken()","0f9e5bbd":"createShares(address,uint256)","0f9fb983":"lastBetTimeSEC()","0fa01949":"yearOfProduction()","0fa2b5d4":"Interestv3(address,address)","0fa2d864":"block4()","0fa48688":"calculateItemId(bytes32)","0fa53db8":"divideDecimalRound(uint256,uint256)","0fa6002e":"sellCharacter(uint32)","0fa6e84d":"SouYingToken()","0fa7a798":"getOpenRequestPublicKey(uint256,uint256)","0fa7b7b3":"totalRefunded(uint256)","0fa803e8":"SetCategoryName(string)","0fa85ab0":"claimTokensForUser(address)","0fa87b15":"closeMyGame(uint256)","0fa8beb3":"claimBonus(address,uint256)","0fa8f516":"getPosition(address,bytes32)","0fa95aee":"etherToTokens(uint256,uint256)","0fa9ced4":"emergencyFuneral()","0fa9e486":"registerCoin(string,string,address)","0faa2aae":"amountOfBSTRequired(address)","0faaa357":"nCanOpenRewardMinEth()","0fab0f6a":"minimumWitcoins()","0fab14e8":"agencyOwner()","0fab459c":"transferSoldTokens(address,uint256)","0fab7539":"getIssuanceCount(bool,bool,bool,bool)","0fac20e1":"dev1Wallet2Pct()","0fac8dc5":"update(string,string,bool,string,address,uint256,uint256)","0fac960e":"sellTokensForWaves(string,address,uint256,uint256)","0fadb5c7":"getWHaddress()","0fae42cd":"pricePreSale()","0faf2775":"newGame(string,string,uint256,uint256,uint256,uint256,uint256,uint256)","0fb0a8d3":"manageOperable(address,bool)","0fb0cf2d":"changeLockupDuration(uint64)","0fb125ac":"transferTokens(uint256,address[])","0fb26f0b":"switchTransfers()","0fb2e692":"buyMCTTokenProxy(address,uint256,uint256)","0fb35574":"SCC()","0fb3844c":"_status()","0fb411e8":"evc()","0fb4b070":"tokensMintedForSale()","0fb4ecdf":"complained(address,address)","0fb524ce":"castVote()","0fb54f3a":"AuthenticationManager()","0fb553ba":"FLC()","0fb59f95":"buy(uint256,string,uint256,uint16)","0fb5a6b4":"duration()","0fb65f10":"authorizeMintRequester(address)","0fb66557":"trustedTransfer(address,address,uint256)","0fb66da3":"getMessageOfVisit(address)","0fb7657f":"isAllocationLocked(address)","0fb792d0":"ONE_HUNDRED_PERCRENTS()","0fb7a5e6":"getCensuredBy(uint16)","0fb7cb1d":"addToKycTeam(address)","0fb7e602":"startEmergency()","0fb9398f":"getProductBuyers(uint256)","0fb9d85e":"buyIndex(uint256,address,bool)","0fb9dcd5":"getTokensAtCurrentRate(uint256)","0fba34a4":"has(bytes12)","0fba4ca1":"accept(string)","0fba80de":"pickValues(bytes32)","0fbad611":"setTimeFrame(uint256)","0fbb3b6b":"shittyRandom()","0fbbeceb":"PostCompleted(address,address)","0fbc0cd1":"bounty_solve(address,bytes32)","0fbc0f82":"LotterySymbol()","0fbe333a":"getLastBidder()","0fbe3e40":"returnLast()","0fbed9fe":"EFAFCOIN()","0fbf7151":"startsWith()","0fc03687":"Booko()","0fc0e9a8":"_addWithdrawal(address,address,uint256)","0fc10026":"CALLER_EXCHANGE_RATE()","0fc12b1a":"isGetWhiteList()","0fc1b08b":"setValue(string,string,string)","0fc1c83d":"minimumTokenCommission()","0fc24c03":"ZarFundsToken()","0fc33bb7":"lrcBalance()","0fc3866f":"isSoftCapGoalReached()","0fc38daa":"CSToken()","0fc4af53":"cloneTokens(uint256,uint256)","0fc4f262":"updateSubdivsFor(address)","0fc55d1e":"ENTS()","0fc55fd1":"bid(uint256,string)","0fc63d10":"tokenA()","0fc66f45":"PO24()","0fc69407":"BidPlaced(uint256,uint256)","0fc6ed30":"Satum()","0fc709e5":"setDistribution(uint256,uint256,uint256,uint256)","0fc72f4e":"purchaseCallback(string)","0fc783d1":"SacToken(address)","0fc7c15e":"getUnapprovedUsersTop150()","0fc81bdc":"editEventResult(string,uint64,uint8)","0fc85c7f":"INAYCOIN()","0fc8a393":"transferUpdater(address)","0fc8afbd":"getFreeSnake()","0fc958dd":"tMemberSolId(uint256,address)","0fcac452":"addToRakePool()","0fcaed94":"restartLottery()","0fcb5984":"getprice()","0fcb83f2":"SancojTokenContract()","0fcbb5b9":"getSubscriberType()","0fcbbc8e":"_lookupOwnerIdentityCount(address)","0fcc0c28":"deprecate()","0fccf22e":"ban_user(address)","0fcd1cab":"killInstance(address,address)","0fcda174":"getAccountTokenBalance(address,address)","0fcddd06":"CreateCRC(address,uint256)","0fce00ed":"calculatedPaymentInterval()","0fce349e":"popularitySetting(uint256,uint8)","0fce887b":"transferLockedFrom(address,address,uint256[],uint256[])","0fd02fc1":"isValidUnbondingLock(address,uint256)","0fd0aa67":"Parties()","0fd0ae10":"insert(address,uint256)","0fd0e440":"uniq(uint8[])","0fd1ed1f":"setMarginForVictoryPercent(uint8)","0fd1ed78":"LOG_EmergencyWithdrawalFailed(address)","0fd1f94e":"firstClaimBlock()","0fd2ce17":"funcArrayInArguments(address[])","0fd3d758":"WWAMPricingStrategy(uint256,uint256,uint256)","0fd3ee83":"__redeemTokens(address,uint256)","0fd4d286":"BlueSkyDragon()","0fd5084a":"validOrigins(uint256)","0fd548ef":"myShareToken()","0fd56202":"addressToNumCities(address)","0fd57f3e":"seatPrice()","0fd58d07":"expectedWinnersCount()","0fd62f57":"adminCharge_p2()","0fd68e3f":"newRaffle()","0fd6fc49":"IntelliShareEco()","0fd7410c":"in_finalization_phase()","0fd7b03d":"HackDivs()","0fd8a8fb":"setAnonymousCap(uint256)","0fd9d5bf":"Matrexcoin(uint256,string,uint8,string)","0fda890e":"changeGenRNGcontractAddress(address)","0fdb1c10":"withDraw()","0fdb468f":"fee(uint64)","0fdc3609":"changeDeposit(address)","0fdc7956":"unlockAllTokens(bool)","0fde0f8e":"ROLE_VENDOR()","0fde5686":"setBUB(bytes32,uint256,bytes)","0fdfa5ee":"preBuy3()","0fe1dfa8":"lastRoundLengthUpdateRound()","0fe1f548":"getTokenSCADARequiresHardCap()","0fe234ed":"testSetController()","0fe2abcf":"exchange(uint256,address)","0fe2c5d1":"BTSMToken()","0fe3152e":"airdropEnd()","0fe3c10d":"MANHATTANPROXY4THST()","0fe41fd5":"acquisitionsTokens()","0fe433db":"reallocate(uint256)","0fe43e1f":"foundersAdvisorsPartnersTokensVault()","0fe4ea72":"killDragonDeathContract(address,uint256,uint256)","0fe793aa":"studioHandler(address,uint256)","0fe7c250":"DaoRulesProposals()","0fe7db9c":"MedSupplyToken()","0fe83bb8":"preSaleTokens()","0fe8c788":"addCertificate(string,address)","0fe961da":"_getCurrentRoundTeamCos()","0fea657f":"totalExch()","0fea81fe":"setComisionInETH()","0fea9be6":"ChinhCoin(uint256,string,uint8,string)","0feacc42":"CommonToken(address,address)","0feb10ff":"Register(uint256,string,string)","0feb172f":"buyTeam(uint256)","0feb376b":"AMOUNT_ICO()","0febb8b7":"setSaleInfo(uint8,uint256,uint256,uint256,uint256)","0feca6d5":"releaseAdvisorsTokensForPercentage(uint256)","0fecef48":"getProductsByOwner(address)","0fed240b":"dAdd(bytes32,address,bool)","0fed5dc8":"setSendAllow(bool)","0fee32bb":"setAuctionIndex(address,address)","0fee5a40":"getProviderCurve(address,bytes32,int256)","0ff0a4df":"reFund()","0ff188c7":"transferPixel(uint16,uint16,address)","0ff244b2":"transferByAddress(address,uint256,address)","0ff2e4b2":"assignCEO(address)","0ff3687b":"remainingGenesisCats()","0ff39daa":"generateDepositAddress()","0ff3d57e":"addMasterWallet(address)","0ff3d5ea":"getCastleSale(uint256)","0ff4009c":"getLotteryInfo(address)","0ff42eab":"setProofAddr(string)","0ff43cfd":"IFCNBToken()","0ff4c916":"getValue(uint256)","0ff4d239":"HashRushICO()","0ff4f160":"oraclize_query(uint256,string,string[1])","0ff58f40":"month24Allocated()","0ff7bb07":"refundClient(address,uint32)","0ff88a8d":"getChar(uint256)","0ff88baa":"RoyalTransfer()","0ff89c2b":"divide(int256,int256,uint256)","0ff8cf9b":"dividend()","0ff92e7b":"burnDead(address,uint256)","0ff9aafe":"updateMinimumBond(uint256)","0ffb1d8b":"whitelistToken(address,bool)","0ffbe43b":"initializeOfferChannel(uint128,address,address,uint256)","0ffdbd42":"feePoolShare(uint256,bool)","0fff6e06":"totalAvailableGames()","0fffbb54":"changeRankingSize(uint256)","10001fdd":"setPublicSaleParams(uint256,uint256,uint256,bool)","10002f39":"WorthlessEthereumTokens()","100153b6":"blocksByDay()","1001c39c":"tokensReleasedToIco()","100278d8":"startPreSale2()","100349fa":"Good_Bye_World()","10038099":"isPuppySports()","1003ac0c":"customFallback(address,uint256,bytes)","1003e2d2":"add(uint256)","10042e10":"remainingPublicSupply()","100565f4":"setTurnover(uint256)","10059be0":"do_redemption()","1006a41f":"auctionStarts(address,address)","10072af7":"SetupRaffle(string,uint256)","1007f753":"erase(uint256)","10082bff":"getActorBillXdetail(address,uint256,bool)","1008737d":"test_oneValidEqBytes32()","1008a2a5":"getTotalLendingItem(address)","10096c84":"exchangeBalanceOf(address,address)","10098ad5":"available(address)","100a0ed1":"receiveCreateAuction(address,address,uint256,uint256,uint256)","100a1099":"getTransactionIdsOf(address,address)","100a5ec5":"mintedCrowdsale()","100ac510":"addRx(address,address,uint256,uint256,bool)","100aca47":"totalFund()","100acefc":"_storeProof(string)","100af203":"reserveETH()","100b815d":"loadData()","100bce92":"toHex(string)","100be094":"setRefundRate(uint256)","100c6cfd":"ipoPlatformPercentage()","100c8ada":"setCAmodulus(bytes)","100c98fe":"SaleFailed()","100cdd91":"burnAll(uint256[])","100d7e30":"FuckFacebookCoin()","100e187a":"transferHolds(address,address,uint256)","100e4b94":"every_day_im_shufflin()","100ed0fc":"preallocateFirstStage(address,uint256,uint256)","100f23fd":"cancelWhitelistAddition(bytes32)","100f2e78":"determineSalaryTokens(address)","100f759f":"EDU_PER_ETH_SALE()","100f7a79":"registerBounty(address,uint256)","100fd02f":"isAbove(int256,int256,string)","101005bd":"releaseReserve(uint256)","10103122":"totalDurationInDays()","101175e8":"BONUS_DATES(uint256)","10119521":"TokenBurnt(address,uint256)","1011a635":"changeCommissionFeeRate(uint256)","1013ad53":"KairosToken()","10142785":"assign(bytes,uint256,bytes1)","1014a29e":"firstRefundRoundRateDenominator()","1015295c":"ClaimMyBet()","1016774e":"period3End()","1016ad94":"Baliv()","1016eadb":"Epilepsy()","10174967":"God()","1017a357":"HeirOwnershipClaimed(address,address)","101817ba":"getLastEmissionNum()","1018f294":"getRandom16(uint16,uint16)","1019635d":"assignReserved(address,uint8,uint256)","10196bf7":"pendingRefs(uint256)","1019dc59":"setSale(address,bool)","101a3fec":"setIsTokenTransactionOpen(bool)","101a889b":"LogBeneficiaryPaid(address)","101a917e":"makeTradeDetail(address,address,uint256,uint256,address,uint256)","101af16b":"countriesTokens()","101b6106":"RevokeEntity(bytes32,bytes)","101b7e7c":"vbtToken()","101b94f1":"setRightOfGroup(string,string,bool)","101ca1b9":"YoobaBatchTransfer()","101d52d2":"checkStoredFileName(string)","101d990c":"hmul(uint128,uint128)","101e1f2c":"initLottery(uint256,uint256,uint256,uint256,int256)","101e359b":"reviveFee()","101e5a32":"setSoftcap(uint256)","101e652e":"presaleUnlimitedStartTime()","101e8952":"forward(address)","101f13e2":"verifyProof(bytes,bytes32,bytes32)","102046db":"townPrice()","1021688f":"changeAdminAddress(address)","1022b30b":"proposalResult(uint256)","1023d597":"priceDecraseTime2Action()","102455a5":"sanity_check()","10253fec":"election(string,string,string,string)","10258bfd":"Payment(address,address,uint256,uint256)","10271334":"receiveICOcoins(uint256,uint256)","1027853f":"withdrawShare(address)","10278bc8":"setBytes32Value(string,bytes32)","1027e242":"getBoosterStrength(uint256)","10282b61":"payoutcount()","10286952":"parseKeys(bytes32[])","10288c4b":"startIco(uint256,uint256,uint256)","1028e4a8":"theCyberMemberUtilities()","10290e51":"computeProfit(uint256,uint256,uint256)","102accc1":"fireEventLog2()","102b61f7":"setMinimumWeiAmount(uint256)","102c920a":"allRefunded()","102ce658":"setRule(address,string)","102deb9c":"changeMonethaVault(address)","102e58d0":"timeoutAt()","102e8b94":"sellnow()","102ff0b3":"amountToken()","10309781":"createdTimestamp()","1030adea":"change_king_name(string)","1030c539":"setCreditbit(address)","1030e227":"TroyToken(address,address)","1030f288":"releaseState2()","10314b07":"GOX(uint256,string,string)","10316eec":"getActionParametersCountByIndex(uint256)","10319417":"returnHost(uint256)","1031e34e":"raisedFromToken()","1031e36e":"pauseTrading()","10328e89":"CoinhiToken()","103359ce":"sendToIco()","10340069":"tokenDistributionPool()","10342d02":"endSaleCarProduct(uint32)","10347a2c":"lockSymbol()","10348938":"setRankDynamic(uint256)","10361bf2":"transferLog(address,address)","10369540":"icoPhaseAmount2()","1036bbe2":"MAX_PERCENT()","1036cde8":"allocateCustomer(address,uint256)","103728a3":"FundingFueled(uint256,uint256)","10375a67":"getRemainingTokens(address)","1037706d":"uploadSignedString(string,int256,bytes20,int256,string)","1037a5f4":"getPrev(uint256)","10388809":"setTransferPrice(uint256)","1039cf3c":"isIcoStopped()","103aeda7":"isContractAuthorized(address)","103b0506":"preter(uint256)","103b5dad":"computeIndexId(address,bytes32)","103bf0bd":"tSLDToken(address,address,address,address)","103cbb7f":"ethpyramid()","103cfacf":"CryptovationX(address)","103d26ac":"getRareItemsPrice(uint256)","103e8154":"sellComissionUnits()","103ed140":"_getSkill(uint16)","103ef9e1":"authorizeOperatorByPartition(bytes32,address)","103f3a83":"getAuraColor(uint64)","103f9251":"transferFrom(address,address)","10400446":"setMaxAppeals(uint256)","10402040":"createSaiCollectorsEdition(uint256,address)","1040233f":"LevelUp(address,uint256,uint32)","1040762d":"setExchangeRates(uint256)","1040dc27":"getSTODetails()","1040e5a5":"showBal()","10422c24":"releaseAngelVested()","1042604f":"isTrue(bool,string)","1042876d":"getDisplayName(address)","1042ca73":"getWeekIdx()","1043dcdf":"LastIsMe(uint256,uint256)","10442a1b":"GetMainAddress()","10443ab3":"setLotteryTokensWallet(address)","10445a16":"_joinGame(address,uint256)","1044bbe6":"unLockTokens()","1045290e":"Boocoin()","10458684":"GBCCoin()","1045a889":"buildContract(string,string)","1045de72":"isEndOffer()","1046bc68":"deleteContact(address)","1046d078":"transferItemFrom(uint256,address,uint256,uint256)","1046e2ab":"Flood_Standard_Ethereum_Coin(uint256,string,string,uint256)","1047456e":"userTransfer(address,address,uint256)","1047d79e":"freezTime()","10482f57":"getWhitelistedResolvers()","1048a25c":"view_random(address,address)","1049334f":"tokenBalance(address,address)","1049f742":"terminateEscrow(address)","104a5963":"targetDiscountValue9()","104a5e75":"getRareItemsPLATPrice(uint256)","104ace02":"register(string,string,string,string,string,string)","104b6704":"currentManager()","104b78bd":"amountRaised(bytes32)","104bb708":"GetStatusCount(string)","104bc708":"LamboCrowdsale(uint256,uint256,address,address,address[])","104bf512":"createBATokenContract(address,address,uint256,uint256)","104bff92":"HasBooster(address,uint256)","104c9cff":"releaseDividendsRights(uint256)","104ce199":"Launcher()","104d5fdd":"getPriceProxy()","104d7bbb":"LuzCoin()","104de5a1":"setPromoted(bool)","104e81ff":"_approve(address,address,uint256)","104e9929":"tokenPool()","104f2d8f":"_approve(uint256,uint256,bytes32,uint256)","104fea4c":"activeCrowdsalePhase2(uint256)","10510ec1":"payToken(address,uint256)","10518aeb":"removeOldFirst(address)","10519ff4":"WestCoin()","1051db34":"implementsERC721()","10523af3":"getPokemonCD(uint256)","1052506f":"isSignedBy(bytes32,string,address)","10525660":"setConsumeToken(address)","10549874":"tokenRate1()","1054d657":"divestETH()","105541ae":"returnPtSafeSmall()","105689a0":"doLockdown()","10570116":"newGroup(string,uint32,uint256,uint32,uint32,uint32,uint32,uint32,uint8)","1057ce8c":"create3DoggiesTokens()","10594e19":"JPGProject()","1059c492":"CROWDSALE_WALLET()","105a6356":"minimalSuccessUSD()","105ae3bf":"getRoundIsEnded(uint32)","105b2645":"CheToken()","105b6f00":"Fructus()","105c287b":"lockPeriod1()","105d3e0f":"cryptogs()","105d9e37":"disputeLength()","105e029f":"JSONpath_string(string,string,string)","105e68f0":"allBankers()","105ea540":"minimumToRaise()","105edd83":"toTheTop()","105ee9a7":"endFight(uint256,uint256,bool)","105fc4e8":"REQUEST_FOUNDATION_AMOUNT()","105ff033":"redeemReward(address,uint256)","10609902":"sendFundsToBorrower()","1060c965":"ZILLION()","106109c9":"RandiveBhToken()","10618776":"setETHUSDdemon(address)","10619300":"lockAccount(bytes32)","106233e8":"addAltOracle(address)","106259c8":"getNonEtherController()","10639ea0":"cancelMigration()","106524a5":"multisendEth(address[],uint256[])","106639ba":"getOwnAssets()","1066cd3c":"voteFor(uint16,address,bytes32,bytes)","1067f077":"setCompte_41(string)","1067f361":"totalTokenToSale()","10680b84":"getShareTokenAddress()","106812c9":"setPI_edit_18(string)","106858cb":"getRemainingPreSalesAmount()","1068d056":"getaddress0()","106a182b":"getLambosCount()","106b291f":"ethUsdRateInCent()","106bd2da":"initiateEscrow(uint64,uint256,address,address,address,address)","106be310":"getNameByNumber(uint256)","106c0a45":"collectOriginalBetERC20(address)","106c5511":"create(address,string,string,uint8,uint256)","106c6441":"removeReinforcedWhitelist(address[])","106d2813":"setCreditGameAddress(address)","106e6290":"withdraw(address,uint256,bytes32)","106f6a3d":"TOKEN_FIRST_EXCHANGE_RATE()","106f6f33":"bountyTokensCount()","106f77a7":"multiMint(uint256,uint256[],uint256)","106f923f":"RewardClaimed(address,uint256)","106fcb7a":"changeAsset(bytes32,string,string,uint8)","106fd2d5":"setSaleAddress(address,address)","106ffbd3":"withdrawBatchTokenToInvestor()","107046bd":"projects(uint256)","1070eb4f":"calculateInterestDue()","1070f410":"convertToBytes(uint8[],bytes1)","10711911":"BONUS_TIER_5_LIMIT()","107169c5":"allLinesWrong()","10717a2e":"switchCompatible223(bool)","10718655":"contributeFor(address)","1072cbea":"transferToken(address,uint256)","10731a65":"claimTokenOwnership()","10735089":"readteamXaddr(address)","1073c4a9":"exploreBuilding(uint8,uint8[176])","1073d1f8":"releaseTprFund()","10745f7e":"getMinAmountToWager(uint256)","1074c619":"flushEthers()","1075153f":"multiPartySend(address[],uint256[])","1075f186":"fundingPoCEndTime()","10764268":"salvageOtherTokensFromContract(address,address,address,uint256)","10768bdd":"myUsingOracalize()","10769e01":"POOL_EDIT_2()","1076c2d7":"StreamXOnline()","1077135a":"oraclizeSetWinner(uint256)","1077666e":"unmined()","1077f06c":"makeClaim(uint256)","10780cce":"grantsStartTimestamp()","107853a9":"Spacoin()","10787d58":"checkfriend(address)","1078ad80":"makeContractPermanent(string)","107925bb":"viewCustomer(string)","10793b50":"m_contributionHistory()","10796a47":"staticCall(address,bytes,bytes)","10797bab":"runtoeth(uint256)","1079b859":"finalRewardPeriodPercent()","1079ed67":"getChildByAddress(address)","107a2c5e":"betEvents(uint256)","107a69e8":"WithdrawResult(uint256,bytes32,uint256)","107a77d0":"finalizeVestingAllocation(uint256)","107a83e2":"prizesAwarded()","107b1f8c":"debug_verifyShare(bytes,uint256[],uint256[],bytes,uint256,uint256)","107bf304":"withdrawEthToOwner(uint256)","107d1d55":"startPeriod(uint256,uint256)","107d4b23":"Bitcan()","107d8a90":"COBA()","107e1a29":"setEndTimeIco(uint256)","107e7b1f":"setBroker(address,uint256)","107e8b24":"setTimeSale(uint256,uint256)","107f3f6a":"setExeStatus(uint64,uint64)","107f587c":"deactivateEmergencyProtectedMode()","107f76c5":"cancelOrder(bytes32,uint64)","10802749":"maxPlayerNum()","1080b7b1":"token4DivsOwing(address)","1080f251":"ownerOfLand(int256,int256)","10814c37":"bot()","10816757":"crowdsaleClosingTime()","1081dc8a":"contractIndex(uint256)","10828bcc":"noOpenGameResult()","1082a128":"SaveRickAndMorty()","1082cda1":"Register(bytes32,address)","1082d51e":"COINESIA()","1083d2fe":"technicalAmount()","1083f761":"assetToken()","108456b4":"FIRST_AUCTIONS_MINIMUM_RAISE()","10848ddf":"getDaysInMonth(uint256)","1084a1fb":"transferToAccount(bytes32,uint256)","1084bc90":"farmSingle(address,address,uint256)","1084cc51":"canDoubleDown()","10855269":"setProxyStorage(address)","10861f40":"wasDelegate(address,address,uint256)","108623f2":"checkProofOfWork(uint256,uint256,uint256)","10867877":"eatUnicornWithoutCorn()","1086a9aa":"approve(address,uint64)","1087452c":"signatureOwner()","10875ac0":"getMembershipExpiryDate(address)","10878ea1":"REGISTRY_INTERFACE_REQUIREMENT()","10888f2f":"admin_exFeeRate(uint256)","1088996b":"_newOutgoingTransaction(address,address,uint256,string)","1088f03f":"crowdsaleCompleted()","10895087":"DDJXRP()","1089843c":"OAKTokenCrowdsale(uint256,uint256,uint256,address)","10898a3e":"currentStateStartTime()","1089b16e":"setPod(address,uint8)","108a101b":"hasEmptyEditionSlots(uint256)","108a936b":"_initGame(uint256,bytes32,bytes32,bytes32,uint256)","108afb9f":"getBonusAmount(address,uint256,uint256,uint32)","108b77ad":"tokenPresaleSold()","108c3708":"paoContactAddress()","108c8ae4":"completeTask(uint256,uint256)","108caf79":"whitelistTokens()","108d0c84":"enableDefinedGame(uint256,bool,bool)","108d40f8":"PutGift(address)","108d6f94":"ProjectOwner()","108d995b":"getContinuityNumber(uint32)","108e161b":"isBallotSealed(uint32)","108e4bdb":"isKycTeam(address)","108eaa4e":"resolver(uint256)","108f69f8":"verifyTetherLoss(address,uint256,uint256)","108fa161":"newEnglandBets()","108fe10c":"advisers(uint256)","109050bc":"jackpotLastQualified()","1090a638":"presaleGoalReached()","10922cc1":"testTransferCost()","1092735d":"Created(address,uint256,uint8,uint256,string)","10937b5a":"adminAddMoney()","1094252e":"reconciliationDate()","109447e1":"createHash(uint8[5],bytes32)","10947164":"changeCEO(address)","1094d009":"LowGasAmount()","10950708":"setInvoicePaid(address,address,uint256,uint256)","109538ca":"transferAdeptTokenOwnership(address)","10953c22":"ChangeChallengeAdditionFee(uint256)","1095b6d7":"withdrawFee(address,address,uint256)","1095f211":"PushInvestorList(address)","10961935":"Bionic()","10970fbb":"convertTransferredTokensToMny(uint256,address,address,uint256)","10971bee":"bonusDayPercent()","10972704":"getCurrentAward()","10978594":"depositSoul(uint256)","1097b9ee":"sellingPrice(bool)","1097c929":"episodePurchase(address,uint256)","1097d54a":"addMaster(address)","1097e579":"Enter()","1099107b":"apSaleIssue(address,uint256)","1099d3ec":"scheduleTransaction(uint256,uint256,uint256,bytes)","1099f6fa":"disablePOSReward(address,bool)","109a9dbc":"bulletAddress(address)","109ac462":"safebalance(uint256)","109b678a":"immortals(address,uint256)","109c2032":"LotteryToken()","109d42d3":"addTokenSale(uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)","109df68e":"rotateBitsRight(bytes,uint256)","109e591a":"SchmecklelToken()","109e8b21":"addOldMayors(uint256[],uint256[],address[])","109e94cf":"client()","109e9de6":"getMaxBuy(uint256)","109ef276":"newDutchPriceRate(uint256,uint256)","10a03b22":"PHASE1_SUPPLY()","10a0d2f1":"startOfCrowdsale()","10a101df":"getKeyData(bytes32,bytes32)","10a20b4c":"testMintGuy()","10a2f7cb":"createOption(uint256,string)","10a31091":"createRadar(uint256)","10a37c26":"getWinnerAddress()","10a3ec4f":"test_fiveAssertTrue()","10a4fd08":"Platinum()","10a5bbdb":"changeCharPrice(uint256,uint256)","10a64976":"ARLCToken(uint256,string,string)","10a6fdc2":"updateEtherPrice(uint256,uint256)","10a73f5e":"jackpotrate()","10a78f4a":"playerTwoReveal(bytes32,bytes32)","10a7a5f5":"secondStageWallet()","10a80397":"addBudget(uint256,uint256,uint256)","10a82579":"lockTokensAddress()","10a86088":"getIntField3()","10a942b4":"withdrawCoindropsToken()","10a9de60":"getOracle(uint256)","10aa3d8c":"VirsymCoin(string,string,uint256,address)","10ab96e1":"LYNDO()","10abda2b":"leaderAddress()","10abdb0a":"Dealer_HitOrStand(uint256,bool)","10acec5d":"_save(address,uint256,uint256,uint256,string,string,address,uint256,uint256)","10adb0ea":"sanMaxLength()","10adda0e":"feesAvailable(address,bytes4)","10ae4a73":"presaleAllocation(address,uint256,uint8)","10ae4ce2":"setReleaseValidator(address)","10af92ba":"eachCandy()","10b0a4cb":"updateServiceMaxCreditsPerProvision(address,uint32,uint256)","10b0b5d5":"add(uint256[])","10b1bf2c":"LongPlace(address[2],uint256[8],uint256,uint256)","10b23ceb":"isAdjacent(uint8,uint8,uint8,uint8)","10b3d502":"ICO_BONUS2_RATE()","10b44094":"LogUserRegistered(address,address)","10b60e65":"SimpleTrade(address,address,uint256,uint256)","10b787d1":"evaluate_model(uint256)","10b798d9":"countRef(address)","10b7d9ae":"view_get_maintenanceMode()","10b8b441":"PrediksiToken()","10b9e583":"shutDown()","10bc044f":"setUserLanguages(address,address,uint256[])","10bc3c75":"getCurrentMiner()","10bd0d9e":"LegendsToken(address,address,uint256,bool)","10bd6d2b":"__address2__()","10bdc6cc":"joingames(uint256)","10be3808":"receivedWei(address,uint256)","10beb070":"getRaffleStats()","10bebe64":"OneExchangeToken()","10c067d2":"setPriceForProtectedCrypton(uint256,uint256)","10c0afaa":"balanceForReward()","10c1181d":"memberId()","10c12917":"calculateWinnings(uint256,uint256)","10c193b9":"total_tokenwei()","10c19421":"born()","10c1952f":"setLocked()","10c1b414":"moveTokens(address,uint256)","10c1de19":"GeneratedNumber(uint256)","10c1ff21":"crowdsaleSuccess()","10c2a365":"PreICO()","10c2c1c1":"setArbiter(uint256,address)","10c36365":"SetExchanger(address,bool)","10c3b15f":"calculateAmountToRelease()","10c452ef":"deactivate_trading()","10c4610b":"exporterBanker()","10c49b78":"CarlosCoin()","10c4b19a":"minMakerBetFund()","10c4e8b0":"all()","10c5b269":"orderMatchSell(uint256,uint256,uint256,uint256,uint256)","10c5b328":"mintTokens(uint256,address)","10c70801":"setMaxAddresses(uint256)","10c74fc6":"setGlobal(uint256,uint256)","10c7868f":"sessionNumber()","10c9135e":"getTime3(address)","10c9ab39":"makeTrans(address,uint256)","10c9c76d":"updatePokecoinAndPokemarketAddresses(address,address)","10cad61f":"combinedGoalReached()","10cad69c":"getBrickIds(uint256,uint256,bytes32[],uint256,uint256,uint256)","10cb4302":"DstTokensIssued(uint256,uint256,uint256,uint256)","10cb4d64":"rejectCurrentPlayerDraw(bytes32)","10cb5628":"isPartOf(uint256)","10cb954c":"members_push(address,address)","10cbe445":"applyMC()","10cc6e21":"Dappster()","10cc969b":"sumbitForElection()","10ccbbdb":"_checkVotes(address)","10ccbe66":"setAltCapitalization(uint256)","10ce0516":"canSwap()","10ce2f3f":"buy3(address[],address[],uint256[],bytes,bytes,bytes)","10ce6452":"set_deposit_fee(uint256)","10cf5d47":"awaitingPayout()","10cfcc19":"left17(uint256)","10d0059c":"removeLock(uint256)","10d07e27":"_lotteryCard(uint256,address)","10d08ef4":"_check_winner()","10d0ffdd":"calculateTokensReceived(uint256)","10d26354":"greaterThan(bytes32,bytes32)","10d2f2e5":"set_whitelist_enabled(bool)","10d3bd2a":"transferMoneyMoney(address,uint256)","10d426f2":"_remove(address)","10d48cd3":"verificationAddressOn(address)","10d5105d":"offlineTransfer(address,address[],uint256[],uint8[],bytes32[],bytes32[])","10d58506":"transFeeCut()","10d5e276":"maxAttempt()","10d6a13a":"tokenSaleClosingTime()","10d72742":"removeFailedGame()","10d7b903":"DIALSSPUN()","10d89d37":"isExchangeUser()","10d8d74d":"setPrice(bytes32,uint256)","10d92060":"requiredGasPrice()","10d979f6":"tokenDivsOwing(address)","10da9f75":"StayBitContractFactory()","10dc0e3c":"decimalOfPrice()","10ddaa87":"_setCurve(uint256[],uint256[])","10ddd6fc":"_onPromo(address,uint256)","10debdf8":"isAuditFinished(uint256)","10e04dcb":"BONUS_500()","10e0ebb3":"callStoWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","10e1c5e5":"getKrsFromApproved(address,uint256)","10e1d6db":"payoutEscrow(uint256)","10e22d41":"receivedWei()","10e2b914":"setTargetDiscountValue6(uint256)","10e56973":"keyPrice()","10e5bff8":"setSuccessor(address)","10e6913e":"upDate()","10e6a223":"allocateSurvivorWinnings(address)","10e6be35":"getRewarder(int256)","10e6d3c9":"teamReservation()","10e6d746":"_mint(address,string)","10e6e06c":"vote(bool,uint256)","10e776ed":"lockBalanceOf(address)","10e7a9ce":"countMonths()","10e7e89f":"getLockingTimestampfrom()","10e80ded":"accumulate_to()","10e82384":"airdropAdmins(address)","10e89b22":"remove_deal(uint32)","10e96b3c":"createMorePaymentChannels(uint256)","10ea13df":"totalInvestment()","10ea6b34":"setReadOnly(bool)","10eae945":"wdToken(address,address,uint256)","10eaf707":"getWarehouseByAddress(address)","10eb3a32":"getContinuityNumber(uint32,int256)","10eb5a8c":"transferAndCallFST(address,uint256,bytes)","10ebb38d":"ASFBToken()","10ebf103":"getPokemonBet(uint256)","10ec5d2c":"funeralAndBirth(bytes32,int256,bytes32)","10eca945":"SetupMultipliers(uint256,uint256,uint256,uint256,uint256)","10ece9c6":"correctedHeroContract()","10ed5dfe":"_emitActiveChanged(bool)","10ee1910":"submitGameResultAndTriggerPayout(uint256)","10ee51ca":"GXVCSentByEther(uint256,address,uint256)","10eeb69a":"arbitrate(uint256,bool)","10ef0ac7":"endTimeICO()","10ef1976":"getEpmBalance(address)","10f01eba":"pIDxAddr_(address)","10f0c4da":"maximalInvestment()","10f13a8c":"setText(bytes32,string,string)","10f169e8":"disputeStatus(uint256)","10f1726d":"isDayTokenActivated()","10f1a274":"setMinWei(uint256)","10f226df":"addAction(bytes32,int256,int256,bytes32[],bytes32[],bool)","10f2bf3e":"closeSale2()","10f2e11c":"PrometheusX(address,address)","10f32982":"GetQueueLength()","10f3ac24":"EmergencyWithdrawNoAccountedTokens()","10f40804":"alottMainSaleToken(address[])","10f41715":"updateMintingData(uint256,uint256)","10f444ac":"ChinaInvestmentToken(uint256,string,uint8,string)","10f5f1b3":"get_participant_arbits_kyc_whitelist(address)","10f5f6b6":"free_vote_for_candidate_A()","10f66c54":"AirdropOne(address,uint256)","10f6e2a6":"setCountWinnerByPlace(uint256,uint256,uint256)","10f6fd02":"GetAllChallengeIDs()","10f74467":"kycRegisteredContributors(address)","10f7cf32":"statuses(bytes32)","10f85f44":"EAACoin()","10f88546":"declareCheater(address)","10f91e39":"walesaDawajMojeStoMilionow()","10f945c7":"withdrawToPoolOwner(uint256)","10fa01e6":"isBattleCreator(string,address)","10fa85c6":"HybridToken(string,string,uint8)","10fab6c7":"addReceivedMessage(address,address,uint256)","10fae6f4":"futureFundingWalletAddress()","10fb3c85":"addDelayedBonus(address,uint256,uint256)","10fb52bf":"createSaiFoundersEdition(uint256,address)","10fc0a6e":"RigCraftPresalePackageManager()","10fc0d39":"transferToMultisig()","10fc31ce":"balancesForPreICO(address)","10fccbf0":"presaleBurnPaused()","10fcda55":"DDFToken(uint256,string,uint8,string)","10fcdecc":"fechVoteInfoForVoter(address,uint256)","10fe42b8":"getBdpControllerHelper(address[16])","10fe5a2a":"rateEarlyStage3()","10fe7c48":"placeBet(uint256)","10fe9ae8":"getTokenAddress()","10feb0e5":"setPowerToken(address)","10ff4a1b":"lockedTokenBalance()","1100482d":"attach()","1100a9d8":"endGame(uint256,uint256,address)","1101a0fd":"claimWinnings(bytes32,bytes32[],address[],uint256[],bytes32[])","1101eaaf":"purchaserCount()","1101fa06":"WhaleChain(uint256,string,uint8,string)","1102610e":"setMarketplaceContract(address)","110466ed":"setOperatingStatus(bool)","110496e5":"allow(address,bool)","1104e09e":"SaddleShopSaleFee()","110506f0":"createCard(uint256,uint256)","11056874":"finishDApp(bytes32)","1105efe2":"_setExtraReceiverAmount(uint256,address)","11063eb1":"updateUnlockDate(uint256)","11071cb3":"CratesPurchased(address,uint8)","1107c3f7":"orderConfirmer(bytes32)","1107e77c":"removeRequester(address)","1107fa00":"thirdStageMintingDate()","1109a0a8":"blocksProducers(uint256)","1109ef92":"transferFromCrowdsale(address,uint256)","110ae711":"checkReferral(bytes8)","110b5f76":"ApprovalDenied(address,address)","110b8a6d":"changePlatformFlag()","110c478b":"uintRound(uint256,uint256,uint256)","110cee6b":"FlightDelayPayout(address)","110d35b8":"buyAsset(uint256)","110d9e68":"insert(bytes32,uint256,uint256,address,address)","110dc7a6":"doInvest(address[3])","110df916":"getChannelID(uint256)","110f8874":"withdrawRefund()","110fd65f":"toBeRaised()","111002aa":"createTask(string)","11102d4d":"devRatio()","11103599":"Token_Offer(address,address,uint16)","1110b13a":"getWinningPosition(uint32)","11115e38":"controlTime()","1111cd24":"getBuyReturn(uint256)","11125497":"setCodename(string)","1112b124":"setBuyPrice(address,uint256)","11136747":"_init(uint256)","1113ed0d":"KERNEL_APP_ID()","1113f2e6":"_addEth(uint256,address)","1114811a":"FACTOR_9()","111485ef":"individual_cap()","11149ada":"getProof(uint256)","1114fce5":"clearAdmins()","1116cba9":"WWNCoin()","1116f631":"setFunctionSevenPrice(uint256)","111723ed":"getShipDetails(uint256,uint256)","1118069c":"enforceKyc(bool,address)","111839d5":"rushTimeFloorCount()","11184392":"registrationDeadline()","111878f6":"addBonus(uint256)","11191186":"setReservingPercentage(uint256)","11196117":"setGameStateFCF(bool)","11196cc2":"tournamentFinished(uint256[])","11199872":"setSignatureChecker(address)","1119e8a6":"increaseNumber(uint256)","111a1fe9":"dividendsBuffer()","111a7427":"setNewAttributes(string,string)","111b30a7":"setFundariaTokenBuyAddress(address)","111b63ab":"CoinparkToken()","111b72c3":"accountCreated(address,bytes32,int256)","111bc51a":"VibeCoin()","111cf909":"setIntegerVaule(uint256)","111d7241":"tournaments()","111d8171":"getNews()","111da3a7":"popFirstFromArray(address[])","111e73ff":"SetAlias(uint256,bytes32)","111eaba0":"updateOwners(address,address[],uint256,uint8[],bytes32[],bytes32[])","111fba02":"NETM()","1120ba47":"ApolloSeptemCrowdsaleExtended(address,address)","112227ae":"TIER3_BONUS()","11223a2f":"phasePublicSale1_From()","1123adb1":"currentDividendPeriodNo()","1123cdd9":"decideSplit(uint256,uint256,string)","1123e608":"LogMigrate(address,uint256)","1123efd5":"getNumGamesStarted()","1123fcce":"getEmployeeCount(address)","11247233":"changeArrangerFeeRecipient(address)","1124c05a":"getLogs(uint256)","1124e9ea":"setfocuscardid(address,address,uint256)","11262105":"getLog(address,uint256,uint256)","11269de6":"setFreezeForCoreTeam(uint256,address,uint256)","1127be97":"recomputeLastAverageBalance()","1128798f":"isCrowdSale()","1128b59e":"bonusStage2FirstDay()","1128bbfd":"getProposalAddress(uint256)","112940f9":"addConsumer(address)","1129f644":"STAKE_START_TIME()","112a19af":"Enlisted(address)","112b3c52":"MuxeToken()","112b4495":"_appendTagged(string,string,string)","112b466e":"btcraised()","112c7075":"ManualDeposit()","112cc015":"ROLE_CRO()","112d6b34":"getRefBalSended()","112d761c":"addAnimal(uint8,address,uint32)","112dd4fd":"foundation_coins()","112e39a8":"scheduleCall(uint256)","112e40b5":"setBalanceOfETH(address,uint256)","112ea262":"authorizeProvider(address)","112ed3f5":"resetWeiBalance(address)","112f5eb8":"airdropCall(address,address,uint256)","112fb7c9":"finishGenerating(bool)","112fbe9b":"transferMinimumFee(address)","11302818":"addRefBonus(address,uint256)","11308d66":"freeLandsOf(address)","1132fae4":"_utoa(uint8)","113353a8":"changeMember(uint256,address,address)","1133f89d":"sendToGrowthContract()","11340c21":"getEGTTotalSupply()","1134269a":"convertForPrioritized(address[],uint256,uint256,address,uint256,uint256,uint8,bytes32,bytes32)","11349a6d":"dispute_end()","1134b7da":"emptyBody(uint256)","11355585":"setBlockLimit(uint256)","1135b3ac":"allocateInternalWallets()","113642e5":"getConfirmationCount(bytes32)","11367b26":"destroyer()","1136aa64":"rocketTravelTime(uint256)","1138001c":"lenghtenFrozenState(uint256,uint256)","113990b8":"PRICE_MULTIPLIER()","1139a355":"releaseForTransfer()","113a8ed5":"Film()","113b2eff":"_userRefund(address)","113b5cf2":"checkBonus(address)","113bb8db":"EventTransfer(address,address,uint32)","113c589f":"SmartBillions()","113ca356":"ticket(address,bool)","113ce458":"winnerBidValue()","113d1975":"totalTokensForSaleDuringICO4()","113d32d0":"TournamentCreated(uint256)","113d8938":"addBytesSetting(string,bytes32,address,address,string)","113e2088":"votingData()","113e5b93":"dayToDate()","113e6b66":"fipsAddToLedger(bytes20,address)","113e9d4f":"DigitalKeyCoin()","113ee583":"aliceClaimsPayment(bytes32,uint256,bytes32,address,address)","11400d8e":"priv_fastGetBlockHash__(int256,int256)","1141d7de":"URI()","11420f90":"MYINITIALSUPPLY()","11424eac":"implementInterface(string)","11428ce8":"DTXToken(address)","1142d47f":"spentFunds()","114385a0":"AddReward(uint256,string,string,string,uint256)","1143c026":"disableICOSwapLock()","11448a56":"scuttle()","11456b47":"addName(string)","1145a20f":"scheduleCall(address,bytes4,bytes32,uint256,uint8)","1145a49c":"test_oneTrueAssert()","1146015e":"setData_6(uint256)","11461614":"pushRatePlan(uint256,string,bytes32,bool)","114630e1":"ADVISORS_TOKENS_SUPPLY()","11463a01":"getChampion()","11466110":"Pretorian(string,string,string)","11467d7c":"deactivateUser(address,uint256)","114719c5":"getLongGap()","11471e17":"tokensPerEther2()","1147b142":"MercatusDeals()","1148d93e":"initializedRatify()","1148da2f":"proposeWrittenContract(string)","11497c69":"PlayChapToken()","1149b5f5":"PendingManager(address)","1149f736":"unpackPrice(uint16)","114b4f1c":"howManyGuaranteed()","114beab3":"availableTokensforPreICO()","114d081d":"markHours(bytes32,bytes32,int256)","114d38a0":"notExceedingSaleCap(uint256)","114d69b2":"setCRLaddr(address)","114d8be1":"addNewOwner(address)","114da3e3":"mintWithEvent(address,uint256)","114de05e":"addMultipleRecords(uint256[])","114e4802":"congratulationsText()","114e6b37":"setDependencies(address,address,address,address,address,address)","114f0e49":"player4()","114f9511":"pay(bytes32,uint256,address,bytes)","11506970":"freezeTokensAmount()","11506d4b":"forgiveThis(address)","11513ba5":"setTTWTokenAddress(address)","11552212":"Hodl(address,uint256)","1155d042":"accumulateFee()","1155f60f":"RoundBetStarted(uint256,uint256)","11563b04":"ETokenAirdrop()","11566dd7":"fundingMax()","11567f95":"readnameXaddress(address)","115793d4":"newClockmaker()","1158183a":"isPreIcoActive()","11589260":"_createProxy(address,address)","1158f696":"createMarriage(bytes32,bytes32,uint256,bytes32,bytes32)","115976c4":"admin1()","1159f39b":"transferFromCroupier(address,uint256)","1159fd53":"isAContract(address)","115a43e9":"getWarriorOwners(uint256[])","115b7fa8":"setOverBalanceLimitHolder(address,bool)","115bd3f8":"rejectInvestmentWithdrawal()","115bdfe7":"currencyMap(address)","115ce332":"isAddressMember(address)","115e397e":"getTotalchannels()","115e9375":"getUint256Min()","115ecc58":"fundStorageVault()","115ece4c":"getTokenAmount(address,uint256)","115f2be2":"customBuyerLimit(address)","115f2f2f":"tokensPerUSD()","115f6795":"cratesSold()","115fd072":"PowerStandardToken(uint256,string,uint8,string)","1160a807":"addWinTickets(uint256,uint256)","1160b93b":"calculatePayrollRunwayInMonths()","11610c25":"bet()","116134ee":"mask()","11613fc9":"godBank()","116191b6":"gateway()","1161a5c8":"registMyHns(string,address)","1161d226":"_participateIsAllowed(uint256)","1162247e":"lastTwoAmbassadorsAdded()","11642134":"produceEmeralds(address,uint256)","1164e11e":"getPurchaserAddressCount()","1165214d":"NotToRent(uint256,uint256,address)","1165dce2":"getTeamList()","11667335":"adminRetrieveContractConfig3()","1167ecb2":"finishPreICO()","116877cc":"changeAuthority(address)","116a6f6c":"BONUS_TIER_7_LIMIT()","116a8221":"airFropTracker_()","116b556b":"founder1()","116b7aa9":"setGameGiftOnceAmount(uint256)","116c347a":"_withdrawTokensTo(address)","116c6eab":"getProfitShare(address)","116c92b7":"addAccount(address,uint8,bool,address)","116d816b":"assetManagement(address)","116e8726":"crowdsaleDasTokensChangeBeneficiary()","116ea900":"createETHCardCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)","116fb2a8":"setTokensPerETH(uint256)","116fe01b":"ClipperCoin(uint256,string,uint8,string)","11704f52":"tradingLive()","1170a759":"withdrawalCoolingPeriod()","11715316":"CorpCoin(address,uint256)","11715c94":"getBonusRateForAmountBased(uint256)","11717501":"IEFBR14Contract()","11719d7e":"getCrowdsalesForUser(address)","11728ecf":"toKey(address,uint256)","117328b9":"LogBidReturned(address,uint256,uint256)","11737d7b":"getFreeTime()","11738735":"bnbWithdrawEnabled()","1173ca7d":"CashBackToken()","11746e5e":"getSpaceshipProductCount()","1174ca26":"totalLossValue()","117546c5":"lastParentBlock()","1176205e":"setMaxRequestQuota(uint256)","1177275e":"ZferToken(address,uint256,uint256)","117735f0":"NewQuest(string,bytes32)","1177645b":"set_devContract(address)","11776737":"CrowdServe(address,uint256,uint256)","11777af7":"refundVault()","1177892f":"getBalanceByAdress(address)","1177dc34":"nullFace(address)","117803e3":"OWNER()","11780a01":"erc20tk()","11789bec":"njbToken()","1178f51a":"ubiatarPlayVault()","11791368":"removeCurrentIcoRound()","1179778b":"setBasePremium(uint256)","1179cf71":"lowEtherBonusValue()","117a0a22":"CosmoToken()","117a4425":"setII_S(uint256)","117a5b90":"games(uint256)","117b198e":"soldTokensLimit()","117b4705":"retract(bytes32)","117b652b":"rewardinterval()","117cae9a":"editStartlist(uint256[],uint256[])","117d4128":"getOrder(uint128)","117d82d6":"playCount1()","117d94f5":"sendFundsToWallet()","117ddaf9":"weiRaisedInPreICO()","117de2fd":"payout(address,uint256)","117df088":"withdrawDeposit()","117e62fd":"getLastAuctionsWinningBid()","117f8684":"changeBZxVault(address)","1180788e":"searchString()","1180d67e":"angelFoundationShareNumerator()","1180f83b":"changeFMPcontractAddress(address)","1181324b":"updater(address)","11815312":"grantTeamAdvisorSupply()","1181a459":"freezeAdministrationContract()","11822cb7":"UTPL()","11823d43":"OCMarket()","11823e04":"advisorAllocation()","1182c796":"debug_is_dry()","11831234":"testFailPullWhenStopped()","1183429a":"removeAddressesFromWhitelist(uint256,address[])","11844aae":"period2End()","11851b5e":"BOARD_3()","11857ed7":"spendAdvertising(uint256,uint256)","1185a6b9":"getBBFarm(uint8)","118644f6":"OxBtcDex(address,address,address,uint256,uint256,uint256)","118654f1":"XinXianToken(address,uint256)","1186560e":"increaseEthRaised(uint256)","11873ee7":"SetGuestName(string)","1187497e":"updateContractState(uint256,uint8)","1187648b":"testInstant(uint256[3])","11878333":"InitialToken(string,address,uint256)","1187d66e":"votedNo()","1188189e":"storeSomething()","1188324b":"soldCWC(address,uint256,bytes32)","11883c6d":"make_hash(uint256,uint256,address,address,uint256,uint256)","11886bd4":"view36()","118934cc":"ownerCommission()","118a0aae":"addHero(string,address,address,uint256,uint256)","118a9db3":"revenueShare(uint256)","118aa5a1":"convertToRate(bytes32)","118b0f04":"santToken()","118b53ec":"LogTeamTokensTransferred(address,uint256)","118cbccb":"etherWeiRate()","118ceab6":"lastAdjust()","118da6fb":"getGameCompleted(uint256)","118dd8fc":"bonusesAfterClose(uint256)","118e1f2e":"globalOrderSerial()","118e31b7":"getBorrowBalance(address,address)","1190516d":"GetByte(uint256,uint256)","1190647c":"buyerHistory(address,address,uint256,uint256)","11916ce7":"moveIcoTokens(address,address,uint256)","11933e4b":"Transmuted(address,address,address,uint256,uint256)","11937ccd":"adminUpdateStartEndTime(uint256,uint256)","1193e38e":"setPercent3(address,uint256)","1194ed46":"payerString()","11952369":"onRemove()","1196004f":"newCycle()","1196245b":"registerDIN()","1196493c":"getJobContracts(uint256,uint8)","119669cb":"GiveChipGitf()","1196deda":"sendTeamTokens(address,uint256)","1196fb60":"contributeToPrizePool(string,string,string)","119739ff":"privatesaleEnds()","11997dc6":"BASE_DURATION()","119aa5c8":"checkForward(bytes)","119b22b3":"roundNum()","119c1c23":"tokenAllowance(address,address)","119cb2ff":"tokenPriceDivides(uint256)","119cbed6":"rtm_contract()","119cc328":"setFoundersWallet(address)","119ce91b":"voteInfo(bytes32,address)","119d0cb5":"DumbCoin()","119d97ee":"team4Address()","119d9bfe":"KudosTokenFactory()","119dd1b0":"presaleLimitReached()","119e045b":"checkMaintenanceTime()","119e5cdf":"creationUnit()","119ebe89":"getExternalCurrencyProcessor()","119ecb35":"tokensaleStageNow()","119ee4ab":"batchCancelAuctions(uint256[])","119eeb9c":"darx()","119f118d":"ethToCash()","119f1edb":"claimPlatinum(uint64)","119f2546":"distributeEBTC(address[])","119f2c9f":"transferCard(address,uint256,uint256)","119f32dd":"adminIsDead()","119f8747":"support()","119fdee2":"sha256ofString(string,string)","11a00327":"deleteOrder(uint256)","11a09ae7":"airDropTracker_()","11a0c16c":"dsquare(uint256,uint256)","11a10508":"switchToNextSale(address)","11a10698":"ERC223Token(uint256,string,uint8,string)","11a153df":"getBlockNumSinceInit()","11a1b31e":"commandGetBonusTime()","11a4c710":"buyRecipient(address)","11a5a793":"percentageToKill()","11a5b9bc":"migrateBlock(string,uint256,uint256,uint256,address)","11a76729":"transferFromInBatch(address,address,uint256[])","11a800bc":"addressOf(uint256)","11a881e8":"setFee(uint256,uint16,uint256)","11a88e05":"preSale2()","11a8f413":"latestRoundId()","11a98193":"ETHfund()","11a9c3c2":"sellDOTCH(uint256)","11a9f10a":"noToken()","11aa7e26":"setKevin(uint256)","11aaf884":"HCPToken()","11ab19f8":"addTokenToTotalSupply(uint256)","11ab27d2":"HydroCoinPresale()","11ab31ed":"rejectProposal(bytes32)","11ac20c0":"cancelLottery(uint32)","11adbaad":"getListOfAddresses()","11ae40b2":"Presale(uint256,uint256,uint256,uint256)","11ae6aee":"_mint(int256,uint256,uint256,uint256)","11aee380":"memberCount()","11af07e2":"create_event(string)","11af3c68":"divest(address)","11af6564":"getCurrentGasPrice()","11affa5c":"setEggTable(uint16,uint32[])","11b059c6":"mintableProperties(uint256,bytes32)","11b2b22a":"FRKT()","11b35c48":"AGSCoin()","11b4bbdb":"mintTokens2(int256,address,uint256,uint256)","11b546f6":"firstWeekTokenPrice()","11b639d9":"currentTokenCount()","11b63a17":"CROWDSALE_TOKENS_NUMS()","11b70018":"bookingList(address,uint256)","11b7702a":"ImportTestA()","11b7d483":"addressGains(address,address)","11b8f957":"dayAfterDeadline()","11b97324":"participateCrowdsaleSelected(address[])","11b98e12":"isMainSaleTokenRaised(uint256)","11b9fee8":"ForkChecker(uint256,bytes32)","11ba65e5":"_setUpgradeabilityOwner(address)","11baae84":"Contribution(address,address,uint256,uint256)","11bab044":"getCreditFundAddress()","11bb20da":"withdrawBattleValue(address,uint256)","11bbb155":"goLong()","11bbdf53":"maxOpenAttacks()","11bc0a34":"BuyOrder(uint256,address,uint256,uint256,uint256,uint256)","11bc5315":"drawer()","11bcd573":"SetTest(address)","11bcd830":"MinDeposit()","11bd85ad":"Owned2()","11bdfe19":"revertBet(uint256)","11be40e0":"transfer(address,address,address[],uint256[])","11bec062":"EVT()","11bed352":"eip20Approve(address,address,uint256)","11bf68cf":"_issue(bytes32,address,address,uint256,bytes,bytes)","11bfe017":"playerWinItems(address)","11c07649":"getMainAccount(uint256)","11c09100":"calculateNumWeiToIssue(uint256,uint256)","11c0b024":"_setDamgeValue22(uint256)","11c0f931":"bindSmartIdentity(string,string)","11c12715":"LCToken()","11c134e1":"sumPreICO()","11c15dcc":"purchaseBalances(address)","11c19d3c":"SpiderFarm()","11c1dc82":"monakojima001()","11c1ddd9":"addMedalBurned(uint16)","11c28e1a":"initial_tokens()","11c33625":"royaltyInformationContract()","11c3a62f":"GetLuckyResults()","11c3fec5":"CreateLand(uint256,address)","11c4d4f4":"communityAddr()","11c4dbf4":"auctionReputationReward()","11c4e123":"rootHashOf(bytes32)","11c52ec0":"setMaxWagerWei(uint256)","11c57757":"tixPromoDeposit()","11c5a234":"logResult(int8,string)","11c60418":"remAdmin(address)","11c7d6bd":"issueNewSeries()","11c8efac":"lifeA(uint256)","11c911d9":"unreserve(address,uint256)","11c91914":"isUnderLimit(uint256)","11c93d03":"crowdsale_eth_refund()","11c94362":"COMMUNITY_RESERVE()","11c98718":"getMsgDataBefore()","11c99f3b":"FundsWallet()","11c9ccf6":"deleteCustomer(address)","11ca3c63":"satoshiRaised()","11cb0bcf":"getParticipantOriginWithIndex(uint256)","11ccf822":"beneficial()","11cd98ed":"convertToAllTable(uint256,string)","11cda415":"peer()","11cdf27a":"addVersion(address)","11ce0267":"storageContract()","11ce3d24":"postMonForMon(uint64,uint64)","11ce3d2c":"GQHToken(uint256,string,uint8,string)","11ce4556":"TOKEN_TO_CREATOR()","11ceb21c":"ZigZagSupply()","11cec8f0":"getTradeByIndex(uint256)","11cfb19d":"freezedTokenOf(address)","11d12402":"testEasyPropose()","11d15e17":"freeReadings(address)","11d17e78":"Blocker_destroy()","11d295bf":"_getShipName(uint256)","11d36bf5":"reservedSaleEther()","11d36c4f":"setBoolF1F2F3(bool,bool,bool)","11d40001":"EthernautsVendingMachine()","11d414af":"changeIcoStatus(uint8)","11d4f314":"setBounties(address[],uint256[])","11d62de9":"ownerShip(address,address)","11d634ac":"HamsterMarketplaceToken()","11d7b2fe":"unlockAccount()","11d817f2":"getUsers(address,bytes32)","11d8657a":"finalizeAndPayoutForHopeful(uint256,uint256,uint256,uint256)","11d87c4e":"initGame(uint256,bytes32,bytes32,bytes32)","11d89f3a":"setResearchAndDevelopment(address)","11da60b4":"settle()","11da9598":"add2MarketPlace(address,uint256,uint256,uint256)","11daa2d0":"jpPercentage()","11daa7a0":"gamessage(address,address)","11daca81":"joinPot()","11daea9c":"removeExchangeTestAccounts(address,address)","11daf56a":"MainFabric()","11db0176":"unLockFreeze(uint256)","11db3be7":"invokeVerification(uint256,uint256,uint256,string,bytes32[2])","11db6e0e":"ownsSouls(address)","11db8d1b":"burner(uint256)","11dbb12e":"removePolicyRule(bytes4,address,bytes32)","11dc273d":"currentBalances(address)","11dc45c9":"withdrawPrize(address)","11dc4703":"removeUser(uint256)","11dc6816":"getAllowanceOwnerValue()","11dcee2f":"priceCallback(bytes32,uint256,bool)","11dd2837":"_updateCurrentStage()","11dd39b4":"cancelApprove(bytes32)","11dd576d":"userCheck(bytes32)","11dd8845":"getRecord(string)","11ddf693":"debug_changeOwner(address)","11df19f7":"_medalTotalSupply()","11df9995":"coin()","11e0de8b":"tickets10kprice()","11e13c32":"BONUS_ICO_STAGE1_PRE_SALE4()","11e14b2e":"employees()","11e21245":"weiSoftCap()","11e3655f":"updateInstantToken(address)","11e38468":"MarketboardListingComplete(address,uint256,uint256,uint256,uint256)","11e3d606":"min_investment_eth()","11e48cdf":"tokensAllocatedTotal()","11e5b955":"Order_sell(address,uint256,uint256)","11e5ea57":"teamsWallet()","11e67c57":"totalBuyOrders()","11e6a0fd":"getProviderDetails(uint256)","11e847b6":"HATCHBACK()","11e84c71":"claim(bytes32,string)","11e956c8":"isMasterNode()","11e96ab6":"LockCredits(address,uint256,uint256)","11e99c22":"arrival()","11eb6d4b":"GxAuth()","11ebbf24":"createWallet()","11ec76cb":"LogClaimHalvingSubsidy(address,uint256,uint256,uint256)","11ec7b4a":"balancePrivateSale()","11ed1bf6":"artworkIndex()","11ed7b42":"thirdItemWrong()","11ee0ec5":"getZone(uint256)","11ef8d4b":"delegateBonusTokens(address,uint88)","11efbf61":"getFeePercentage()","11efec9b":"shareHolderByNumber(uint256)","11efff1f":"unlockRecordAdd(uint256,bytes32,string,string,uint256)","11f02c87":"createHybridization(uint256,uint256)","11f03b83":"GiftCrowdsale(uint256,uint256,uint256,uint256)","11f0b806":"getDutchAuctionToCraftAddress()","11f1507e":"getAssetToken(uint256)","11f15380":"clientKeysCount(uint256)","11f1fc99":"withdrawTreasury(uint256)","11f217c7":"getNodeAddress(address)","11f29729":"setsymbol(string)","11f2a395":"finalWithdraw()","11f2eed1":"convertEthToMet(uint256,int256)","11f37ceb":"get_price()","11f3eecd":"sellTokens(uint8)","11f43157":"openCrates()","11f45f23":"buyVIBET()","11f48166":"IntroToken()","11f4a9ce":"KernelProxy(address)","11f4ba60":"importBalanceOf(address)","11f54545":"SmatrOCrowdsale(uint256,uint256,uint256,address)","11f58e99":"maxTokensSold()","11f598cd":"editPersonalNote(string,uint256)","11f6649b":"authorizers(uint256)","11f6ad2b":"lastWinnerId()","11f72496":"testT()","11f82a2b":"_getPolishingPrice(uint256)","11fa3d14":"LeekCoinCrowdsale(uint256,uint256,address,address)","11fa3f4f":"weiUsdExchangeRate()","11fa7da2":"getInvestmentsInfo(address)","11facae2":"setValidatorCount(uint256)","11fb57e2":"TokenManager(address[],uint256)","11fb584a":"BloccaConto(address)","11fbad62":"_rejectTransfer(uint256,uint256)","11fdff0c":"advisorPool()","11fe12b3":"isRecovery(address,address)","11fe773d":"memcpy(uint256,uint256,uint256)","11ffb1d4":"deleteMember(address)","11ffe7c9":"getUserDocCount(address)","12005e53":"alexToken()","1200617f":"auction(uint256)","12007984":"addBalanceToGame(uint256)","120149a1":"readCube(bytes32)","120184fa":"gvCF()","1202be01":"eth2mnt()","12032e52":"getSecondaryRecord(string)","12035ca6":"setData_3(uint256)","12038a01":"totalDevelopmentFundEarned()","12039fed":"mintMedal(uint256)","12045d3f":"VKTToken(uint256,address)","1204bab4":"popcount(uint64)","1204ce91":"Debug(bytes32,uint256)","1204d27c":"coinIssuedBurn()","12055758":"checkOwner(address,uint32[11])","12058764":"lockBalanceGroup(address,uint256)","12059f68":"LoversAdded(string,string)","12065fe0":"getBalance()","1206dc5f":"transferMarketplaceOwnership(address)","12074a46":"getUserBets()","1207bb8e":"crowdsalePrice()","1207f0c1":"issueTo(address,uint256)","1208a256":"getLock(address,uint256)","1209073c":"updateBalances(uint256)","120960de":"depositInPot()","1209b1f6":"ticketPrice()","1209f7ed":"withdrawPledge()","120bd501":"approves(address,uint256)","120bd8f5":"setMinimumBetValue(uint256)","120c5194":"getCollectReporterAddress()","120c52ef":"calculateDemurrage(uint256,uint256)","120c7efd":"certifier()","120cc993":"isEmptyOwner()","120dae83":"setMinimalContribution(uint256)","120e6c16":"_finneyToWei(uint32)","120e8f05":"calculateMintAmount()","120fe731":"Tropycoin()","120fe89b":"getPolls()","121114e1":"SuperTicketCoin(uint256,string,string)","1211540c":"withdrawPartial(uint256)","121166ef":"clearTrade(bytes,address,bytes32,address,uint256,int256,string)","1212c12f":"RecordManager()","12136918":"setMaxTranferLimit(uint256,uint256,uint256)","12136e57":"ERC777ERC20BaseToken(string,string,uint256,address[])","12146222":"highSupport(address)","1214ab82":"Lightning()","121557a3":"Avatarium()","121563ae":"Axioms()","12156c66":"snowflakeCall(address,string,string,uint256,bytes,bytes)","1215f8ef":"releaseValue3()","1216e771":"expiration(uint64)","12179a2d":"pendingReferals(address)","1217b6ff":"TransactionConfirmedByMediator(uint256,uint256)","121839f6":"addConfirmationNode(string)","1218d6bf":"decree()","12192649":"countOfParticipants()","12192b00":"getInitialHP(uint64,uint64,uint64)","1219bcfc":"MolToken()","1219d5c8":"APM_APP_NAME()","121a47ac":"nonceForPublicKeyX(uint256)","121a496b":"Lupecoin(address,address)","121ab65b":"LogChangeSponseeAddress(address)","121af083":"DFSCrowdsale(uint256,uint256,uint256)","121b5a25":"calculateCompensation()","121b68c1":"ERC223Received(address,uint256)","121c2b35":"burnPXLRewardPXLx2(address,uint256,address,uint256,address,uint256)","121c5e91":"putOnSale(uint256,uint256,uint256)","121d6426":"senderWeiBalance()","121dbc31":"changeMax(uint256)","121e0d4e":"godPause()","121e6832":"frozenDaysForPartner()","121e8122":"unQuarantineAddress(address)","121eb9e2":"createMintRequest(address,uint256,string)","121ef243":"createUser(string,uint256)","121f0a10":"resolve(uint256,uint256,string,bool)","121f2081":"testCreateWithForeignParent()","1220c6ed":"registerOwner(address)","12217378":"oldTokenTotalSupply()","1221a071":"cmctcybermovie()","1222c25a":"redeem(string)","1222e789":"isPublicSaleWithBonus()","122366fd":"PACCOIN(uint256,string,string)","1223716a":"masterHas()","1223f208":"withdrawadm(address,uint256,uint256)","12243b67":"deletePlayer(address)","12247a57":"IncentCoffeeToken()","12253a6c":"stopContract()","12263017":"setBool82(bool,bool)","122636b1":"getRemainingDaysToThirdPhase()","12267abc":"PRICE_6()","1226afde":"numtickets()","1226be3e":"NotifyMe(address,address)","1226cd98":"allocate(uint128,uint256)","1226f5f8":"wei_per_token()","12278825":"Git(uint256)","1227d0f4":"gameListOf()","122809dc":"deposits_refunded()","12285576":"Donated()","12286715":"SimpleSavingsWallet(uint256)","12287629":"consultantsKey()","1229987d":"collectProfitERC20(address)","1229af09":"FreshROI(uint256,uint256)","122a1949":"Group_1()","122a7723":"GetPriceMultiple()","122b0e85":"getVerificationLevel()","122bdc32":"ThemKhoaHoc(string,uint256,string,string,string,string)","122d34d9":"returnToken(string,uint256)","122d9a8d":"piEndTime()","122e04a8":"WITHDRAW_ADDRESS()","122e74f4":"getWeiLeft()","122fe685":"presaleAddress()","122ff73a":"_getStrengthDexterityVitality(uint256,uint256,uint256)","12302932":"reinvestAffiliate()","123119cd":"payer()","12317402":"betMinAmount()","123180a2":"testInitialBalanceWithNew()","12333b32":"StartGame(uint256)","123398aa":"johnnycoin()","1233f543":"distribute55M(address[])","12342248":"CreditleetToken()","12360151":"dayPotLeader()","123702e2":"profitAddress()","123731c4":"addressPositions(address,uint256)","1237b2a6":"TotalPot()","123802e1":"forceRefundState()","123807b2":"markParticipantIdentifiend(address)","123841cf":"MintedGreen(address,uint256)","12386471":"sumExpOffset(int256,int256[],uint256,uint8)","1239ec8c":"batchTransfer(address,address[],uint256[])","123b06d5":"currentPendingParticipants()","123b1dae":"accountOfP(address)","123b5e98":"setAttributeSigned(address,uint8,bytes32,bytes32,bytes32,bytes,uint256)","123ba3e2":"changePrizeSplits(uint256,uint256,uint256,uint256,uint256)","123c3a4f":"maxTokenSupplyICO2()","123c3ada":"getMedalInfo(uint256)","123cc082":"setJoinedCrowdsales(address)","123d997a":"removeAllowCnsContract(address,bytes32,address,bytes32)","123e4112":"arrayToCrabPartData(uint256[])","123f513c":"testDeadChickenCnt()","12407f98":"toSaleWallet()","1240adc8":"stoppCrowdsale(uint256)","1240b381":"PermarektToken()","1240de76":"testUnexpiredBalance()","124135c9":"exit(bytes,bytes,uint256,bytes,bytes,uint256,bytes)","1241d7a7":"setEnableRecord(bool)","1241ee7d":"profit(uint256)","1242031a":"ZhaoGuCoin()","12424e3f":"approve()","124279a7":"activeSignersCount()","1242e96d":"updateMarketPhase()","12432fee":"canSendWebGifAmount()","124442be":"approveIncrease(address,uint256)","1244861e":"addTokenData(uint256,string,string)","1245c653":"currentDrop()","1245e347":"teamWalletAddress()","1245f45e":"getRunningAuctions()","12460fdd":"confirmCeilingRaise(bytes32)","12468cc5":"getWifiPwd(string)","12474435":"unfreezeAwardedTokens(address)","1247caf4":"ChangeFounderMulSigAddress(address,uint256)","1248b101":"claimDay(uint256)","12491ad9":"ReverseRemoved(string,address)","1249209e":"returnExcess(address)","12494160":"isHolder()","12495a5d":"ContributionWallet(address,uint256,address)","1249c58b":"mint()","1249d3b8":"isEcoAllocated3()","124abb0a":"_checkAndCallSafeTransfer(address,address,uint256,uint256,bytes)","124b0939":"afterCallBack()","124c27a9":"addPrize(uint16,address,uint256,uint256,uint256)","124c2dde":"executeBet(address,address,uint256)","124c32a1":"enter(bytes32,bytes8)","124cf830":"isSecondaryOperator(address)","124cfc8c":"beneficiaryOf(uint256)","124d3396":"releaseICO()","124eaee6":"Identity()","124f0b31":"rewardDecimalPercentByTime(uint256)","124f2418":"deleteBytes32Value(bytes32)","124fc7e0":"increaseSupply(uint256,address)","124ff29b":"getAyantDroitEconomique_Compte_5()","12504109":"getLast24hSendingValue(address)","12508ea4":"play(uint256,bool)","1250ca3d":"getUserPaybackRate()","12511c14":"transferEnable(bytes20)","12514bba":"transfer(uint256)","12529d22":"getRank10()","1252aadb":"EightBitToken()","1252cc33":"processTickets()","125385f2":"COLOR_GREEN()","1253b82f":"travelPrice()","1254e64d":"transferEthers(address,uint256)","1254f0dc":"startRate()","12555df2":"zasxzasxqaqq()","12568c24":"blanceOf(address)","125716d6":"getContractStatus(address)","12571a33":"migrateInternal(address)","12582c1a":"setAdminMode(bool)","12592381":"incomeAllocation()","12599d3f":"GlobalEnergyDigitalChain()","1259c00d":"stampIndextodissolved(uint256)","125b8f06":"isInNextGeneration()","125bfb66":"claimToken(address,address,uint256)","125d5d71":"startEpochTimestamp()","125e527e":"Ether()","125f67e7":"SunriseCoin()","126004b8":"deleteRole()","12600aa3":"concatStrings(string,string)","1260c19a":"showInterval()","12610b5b":"pendingEditionsOf(address)","1261795d":"withdrawGas()","126262a3":"init(address,address,address,address,address,address,address,address,address,address,address,address,address,address)","1262d6be":"fortnightsFromLast()","1262eb73":"queryPlayer(uint32)","12630012":"LEOToken()","1264299a":"endPresaleTime()","126596e7":"ownerSetCallbackGasPrice(uint256)","12660306":"getLogos()","1266cae2":"setCrowdsale()","1266d5f9":"getWitnessesCount()","126702a0":"DOW_TUE()","12671fb4":"balanceAirDropToken(address,address)","12675713":"getTestekTokenIssuance(uint256,uint256)","1267961b":"ERC777BaseToken(string,string,uint256,address[])","12686aae":"transferLocked()","1268cb71":"XBPToken()","1269359a":"enableWallet(address)","126a710e":"dnsrr(bytes32)","126af4af":"tokensContractBalance()","126b12e7":"initICO()","126b6e17":"downX(uint256)","126b85e7":"addLevelQuest(address,uint256)","126c13c8":"toldYouSo(bytes32)","126c27b5":"setETHAssets(address)","126d20f1":"getBestPromouter()","126d5b83":"getPoolAmounts()","126d9882":"updateLogoFee(uint256)","126eac43":"getContribution(address,address)","126f992c":"forceOff()","126fbb3a":"removeFunds(uint256,uint256,uint256,uint256)","127043c3":"feesRate()","12706ccd":"NIGIZ()","12709b90":"SuddenDecayingTokenFunction()","1270a4d3":"setMinSale(uint256)","12711ae3":"wtech2()","127157c3":"activateDevice(address)","1271bd53":"upgradeContract(string,address)","1271f09a":"approve(address,uint256,address)","12724689":"addToTokenTransferDisallowedList(address)","1273f6e7":"BIGSELL()","12746e9f":"changeParam(uint256,uint256,uint256)","1274c3f3":"announcementHash()","127616f9":"releaseMultiWithStage(address[],address)","127714c7":"getBudget()","12778e8d":"addDistributionContract(address)","1277b0c9":"createBid(bytes32,uint256)","1277b4f1":"createCandy(string,uint256)","1277e24f":"payOneTimeFee()","127810bc":"getCompany()","12783f2f":"VESTING_TIMES()","12788f97":"B0xPresale(address,address,address)","1278cec4":"WinnerPaidEvent(address,string)","12795d7f":"putSaveData(string)","127a0dd9":"setJypcBonus(uint256)","127afec6":"MakerTransferredAsset(address,uint256)","127b0901":"delayAutorelease()","127b4da5":"getAmountForCharger(uint256)","127c3d45":"getUserLibrary()","127cc6bf":"medalTotalSupply()","127cf0b9":"multiInvokeWith3Args(address,string,address[],address[],uint256[])","127dd730":"donationNum()","127e499c":"firstBonus()","127eca3f":"totalDividendPayments()","127ecfa9":"getMinReward(string)","127effb2":"operatorAddress()","127f0b3f":"roundCount()","127f1068":"pieceprice()","127f2d2c":"shutForDai(uint256)","127f3374":"calculateselfOdd()","127f902f":"addressFundReserve()","12800751":"determineWinner(uint256,uint256)","12806653":"setMaxContributionPhase2(uint256)","1280db73":"donate(address,string,string)","12810fd8":"Lesson_6(address,uint256)","1281311d":"buy(uint256,uint256,uint256,uint256)","1281619b":"SeeleTokenLock(address,address,address)","12818f0c":"withdrawNac(uint256)","12819817":"setXauForGasCurrator(address)","1281d056":"test_threeValidEqBool()","12821b5e":"sellingPrice()","1282467d":"checkTip(uint8)","12826f30":"isEthereumBased(address)","1282cc2a":"getNumContributionsDID(address,address)","1283c377":"FixedCapSampleCoin()","1283e328":"bonusOf(address)","128424a7":"sort(address[])","1284c8f5":"transferSafety()","1286d9e8":"setRowColors(uint16,uint8,uint256,uint256)","1286e393":"removePartOwner(address)","12874688":"setMinBid(uint256)","12883df0":"lcSold()","12889639":"settleFeePub(address,address,uint256,address,uint256)","1288c42a":"Prism()","12892b7f":"setblnpereth(uint256)","128952e4":"addElements(bytes32[])","128a0b2c":"approveFund(address,bytes)","128a1c74":"createUpdateRisk(bytes32,bytes32,uint256)","128a3765":"clearTransferInsToken(address)","128b265f":"addBridgeTokenFeeReceivers(uint256)","128b3bc0":"_withdrawFunds(address,uint256)","128bad8d":"MFL()","128bfcae":"startStake(uint256,uint256)","128c785f":"ICACOIN()","128cf7c5":"SEC_PER_ETHER()","128d7215":"addRequest(string)","128d9281":"checkTransferFunction(address,address,uint256)","128e0423":"getSenders()","128e1329":"offerHelpUsingBalance(address,address,uint256)","128e1af0":"withdrawFromPot(uint256)","128e3761":"firstTeamContributorId()","128e87e0":"tokensAfterCrowdsale()","128eb401":"expiredCrates(address)","128ef181":"ticketMag()","128f04e7":"importPresaleBalances(address[],uint256[])","128f8e04":"admin_active_payable()","12901f26":"purchaseTokens(uint256,address,address,address,address,address)","12907e08":"lastBlock_f6Hash_uint256()","1290a2b4":"rightSharePriceRateOfIncrease()","1290aed9":"AcornPotSplit(uint256)","12919d90":"setMoneyManager(address)","1291ebdd":"getAllowedTokenAt(uint256)","1292de0b":"sendTokensTo(uint256,address)","129441cf":"_cMoney(uint256,uint256,uint256,uint256)","129484b6":"changeFeeRecipient(int256,int256,int256,int256,int256,int256)","1294d4db":"assignReferral(address,address)","12950877":"setOrCacheValidityBond(uint256)","12958f1c":"getUserName()","1296830d":"transferPreSigned(bytes,address,uint256,uint256,uint256)","1296aef3":"timeInvestInMinute()","1296d47d":"signedApproveHash(address,address,uint256,uint256,uint256)","1296ee62":"transferAndCall(address,uint256)","12973afd":"isNotDuplicateTreasure(bytes32)","12974218":"tokensRemainingForSale()","12975687":"mediaTokensDecimalUnits(address)","12987c98":"large()","129893dc":"ParameterizedToken(string,string,uint256,uint256)","129932d5":"_spto(uint256,uint256,uint256,uint256,address)","1299c8fe":"GetAccountIsFrozenByDateCount()","1299f11e":"updateNextWindowAdjustmentRatio(int256,bool)","129a1a37":"Dissolved(address,uint256)","129a5b99":"getPropertyStatus(bytes32,address)","129a8d25":"LogKYCConfirmation(address)","129a9e99":"enterEvent(uint256[12])","129b873b":"addVote(uint256,address)","129bc044":"unlockAccount(bytes32)","129caa18":"haltICO()","129cf7cb":"ForeignBridge(uint256,address[],uint256)","129ed395":"accountLock(address)","129f80fb":"rewardAirdropMany(address[],uint256[])","12a00b21":"calculate_base_mining_reward(uint256)","12a0421c":"safeWithdrawal2(address)","12a06c35":"NFF()","12a0b32c":"transferRestrictedStock(address,uint256,uint256)","12a0b3ba":"VOLOP(uint256,string,string)","12a12106":"setPayoutAmount()","12a15b91":"BlocktorialTestToken()","12a187f3":"toggleTransfer(bool)","12a1c2f2":"Mether()","12a203c3":"getFinalAnswerIfMatches(bytes32,bytes32,address,uint32,uint256)","12a2716d":"affirmations()","12a3234c":"unlockAdvertisement(uint256)","12a3bbaf":"_addHorse(bytes32)","12a3cda2":"TokenOMG(uint256)","12a3ff95":"endPrivatesale()","12a49007":"p_setInvestorFundPercent(uint256,uint256)","12a4b899":"claimPresaleTokens()","12a63964":"Releaseable(address,uint256)","12a71ee0":"setBiddingAuctionAddress(address,address)","12a77dbd":"getLockedToken(address,uint256)","12a7b914":"getBool()","12a837b4":"transfer(address,address,uint256,bytes)","12a8c1ed":"testAllocatesTokensInSale()","12a916f9":"getPlayerWallet()","12aa2c0d":"getMinBal()","12aa5360":"addAlpha(string,string,bytes32)","12aaac70":"getKey(bytes32)","12aaafa7":"amount_milestone()","12ab7242":"setupStackDepthLib(address)","12abbaaf":"WhosItGonnaBe()","12ac18ff":"About()","12ac4a2e":"bonuscal()","12ac5bad":"GetContractStateCancelledByTenant()","12ac9b46":"_escrow(address,uint256)","12ad8bfc":"registerSecret(bytes32)","12ad8d20":"CryptoElections()","12addb94":"saleEnd4()","12ade015":"oneTokenInFiatWei()","12aef8c3":"tokensForSale()","12afbc78":"getOwnedPointCount(address)","12afef2e":"Reservation(address,address,address,uint256,uint256,uint256,uint256)","12b0b3ca":"transferFromToICAPCallGas()","12b0b627":"splitStr(string,string)","12b0d309":"restrictTokenTransfer(address)","12b1cc95":"createHash(uint256)","12b1f8a9":"removeLand(address,uint256)","12b27e3e":"miningActive()","12b2ecc6":"init_bounty_program(address)","12b392ee":"admin_profit()","12b3a445":"getERC721Nfts(uint256,address)","12b48d3c":"CountryCoin()","12b495a8":"delta()","12b4ba71":"emitTokenStateUpdated(address)","12b58349":"getTotalBalance()","12b62a07":"playerWinHeroes(address)","12b68263":"creditDragon(address,uint256)","12b68286":"whitelistMinTok(uint256,address)","12b6ef5c":"Decision(uint256,address,address[],uint256[])","12b706a7":"buyPreSale(uint256)","12b8ca5e":"_isDiamondOutside(string)","12b93ec6":"ChallengeContract(uint256,string,uint256,address,address)","12b97812":"addOffering(address,bytes32,address,uint256)","12bae48d":"StartDate()","12bb05ff":"claim1Ply(uint64,uint64,uint64,uint64,uint64)","12bb65ca":"MANHATTANPROXY7THAVE()","12bb6df7":"LogRewardPicked(uint256,address,uint256,uint256)","12bb9d3e":"RefundableCrowdsaleWithCommission(uint256,address)","12bc74e2":"withdrawBondReward(address)","12bcc858":"claimTokensInBulk(address[],uint256[])","12bd2cea":"setImageDataCloud(uint256,uint256,string)","12bdc81b":"freedWinPoolForThirdStage()","12bddc9c":"changeRules(bool,bool,bool,bool,bool)","12be78d1":"freeze_pool(bool)","12bea6eb":"kickStartICO(address,uint256,int256)","12bff72f":"doTransferOwnership(address)","12c0af96":"getVoterOnElection(address,address,uint256,address,address)","12c0d1ea":"changeLuck(uint32)","12c1083d":"distributing()","12c2302e":"DocumentRegistered(uint256,string)","12c24128":"FootStarCrowdsale()","12c27c64":"contrp3d()","12c3ee37":"setStorageControllerContractAddress(address,address)","12c3f754":"modificationFee()","12c3f757":"soldiersinfo(address)","12c45f64":"maximumTokenSupply()","12c55a9b":"openDeposit()","12c59488":"setAddress(address,address,address,address,address)","12c61a20":"initambassadorsbags()","12c6651c":"MoralityAI()","12c6ac16":"Reconcile(address,uint256,uint256)","12c723e1":"createDeposit(uint256,uint256,bytes)","12c77207":"getLLV_edit_1()","12c7df73":"rewardValue()","12c8052f":"won()","12c82894":"compute(string,string,uint256,uint256)","12c82bcc":"sendRobust(address,uint256)","12c85095":"getRestrictedTokens(uint8)","12c89869":"getHeroCurrentPrice(uint256)","12c96f5f":"ZAYAToken()","12c99005":"startPREICO()","12cacbb5":"inPresaleMode()","12cc08f2":"getPackageReleaseHashes(string,uint256,uint256)","12cc1abc":"set_exchange_rate_in_eth(uint256)","12cc9dd3":"usdId()","12ccb421":"payPlatformIncomingTransactionCommission(address)","12cd2101":"transfered(address,uint256,bytes32[])","12cd24be":"funder(address)","12cd57c9":"inputauction(uint256,address,uint256,string)","12cdc37a":"OrderTake(uint256)","12ce73dc":"callFor(address,uint256,bytes)","12cef27a":"secondWallet()","12cf0ec8":"balanceOfAt(address,uint256,int256)","12cf85c8":"s26(bytes1)","12cf8a10":"getType(uint32)","12d00c2e":"soloWithdraw(uint256)","12d0e65a":"changeBeneficiaryAddress(address)","12d1456f":"requiredExpIncreaseFactor()","12d1612a":"closeContest(string)","12d1b19a":"poissonData()","12d2c9a5":"isWhitelistedInvestor(address)","12d43a51":"gov()","12d60f86":"fillUpAllowance()","12d6468d":"mathTransfer(address[],uint256[])","12d67c5f":"getLastDataLength()","12d69389":"maxUint32()","12d6c704":"getTMul(uint256)","12d72e99":"deregisterProduct(uint256)","12d96887":"getRollUnder()","12da6e2b":"fourthTime()","12dc006a":"racer_index()","12dc34a0":"disableSetTransferable()","12dc5ca0":"CrowdsaleToken(address,string,string,uint8,uint256,bool)","12dc6449":"test_remove_head()","12dc8c4b":"InitialTokensAllocated(uint256)","12dc9a5b":"assert(bool,bytes)","12dcb676":"remainPackage()","12dd4763":"_transItem(address,address,uint256)","12dd8700":"CevacFund()","12dd9b94":"addBet(address,address)","12de10fd":"setMinimumFundingLimit(uint256)","12de8a12":"addReferenceParentWineryOperationByRegulator(string,string,uint256,string,string,int256)","12df172d":"setScale(uint256,uint256)","12df2f49":"serviceStation()","12df9b63":"AddContact(bytes32,address)","12e135a0":"setBuyCommission(uint256)","12e228fd":"investorAddress()","12e26673":"maxMSC()","12e36530":"addMerkleTreeRoot(bytes32,bytes)","12e43d92":"AVAILABLE_PRESALE_SUPPLY()","12e43da5":"kycConfirmer()","12e530aa":"Hacksig(uint256)","12e56faf":"activeTransfer()","12e57fdc":"MONEYTREETOKEN()","12e5b7fa":"GetOwnertName()","12e6414e":"getCampaignStartDateById(bytes32)","12e753e1":"modifyContact(address,string)","12e7b2ba":"vanilAddress()","12e8e2c3":"setPlatformFee(uint256)","12e8ebdf":"unpauseWithdrawal(address,address)","12e905b0":"selfAddress()","12e9db2d":"get_deposit_balance(address,uint256)","12ea0b0e":"INV()","12ea7d20":"BoSToken()","12ea965d":"icoStartBlock()","12eabe7e":"approuver(address,uint256)","12eacf4b":"fundInsurance()","12eba773":"isAdvisorsTokensFirstReleased()","12ebca9c":"get_admin_list()","12ecaa62":"freezeAccountOf(address)","12ef900b":"getMaxLoanAmountAllowedByLtd()","12ef934b":"nCryptClubShare(address,address,address,address)","12efe5ad":"minDonationInWei()","12effc32":"rejectTransfer(uint256)","12f05418":"campaignCanceled()","12f0f9df":"createBountyContract(address)","12f11ed3":"getDenyPremium(bytes32)","12f20e2a":"withdrawFundsToOwner(uint256)","12f26140":"setWhitelistContract(address)","12f2b838":"updateReservedWei()","12f31b5f":"firstTeamWithdrawal()","12f3d1e0":"discoverResources(uint256)","12f4cbd9":"Vote(uint8)","12f53950":"refunded()","12f58b43":"RATE_CHANGE_THRESHOLD()","12f62bd6":"updateProperties(uint256,bytes)","12f63d96":"lockedByUser(address,address)","12f6e641":"okamiMaxPurchase_()","12f7cf74":"approve(address,uint8,uint8)","12f7fb6f":"RocketCoins()","12f8ae31":"getRedeemEst(address,uint256)","12f8b3db":"createCrowdsale(uint256,uint256,uint256,uint256,address,address,address,address)","12f95b16":"GIC()","12fa6feb":"ended()","12fa769f":"paidAmount()","12fb5b67":"purchaseTokensInICO(uint256,address)","12fc41a1":"MyScheme()","12fc848e":"_randomLucyAddr()","12fca967":"contract6function2()","12fd67ba":"getValidations()","12fdf767":"FuseaNetwork()","12ff2ad9":"Consent(address,address)","12ff658f":"DmitryCoin()","12ffb59b":"checkIcoStatus()","12ffe4df":"_decreaseApprovalAllArgs(address,uint256,address)","130067ca":"updateCostContract(address)","1300a6d1":"timeLeft()","1300cc41":"freezeTransferToken()","13012a3b":"doMap(address,string)","13019a5e":"EtherTool()","1301b876":"EmbiggenToken(uint256,uint256,string,string,uint8)","1301c4aa":"CryptoniumCoin()","1301ee02":"transferringETC(address)","1302188c":"getLastDataHash()","13028f44":"addUserRewardPayouts(address,address,uint256)","1302d03a":"setWhitelist(address,uint256)","130346d2":"icostart()","13037d22":"xioniCoin()","1303a484":"commitment()","13040bc1":"tokensFinalized()","13045155":"MONTHLY_INTERNAL_VAULT_CAP()","130497ac":"getCountryList()","1305413e":"BetMade()","1305d2de":"changeAllCosigners2(uint256,address[],bytes,bytes,bytes,bytes)","13063180":"doEscape(uint32)","13065fed":"MoneroClassic()","130766c5":"enterLarge()","1307d2d7":"EARLY_CONTRIBUTOR_STAKE()","1308c324":"setAddrForPrivilege(address)","1308e82d":"L19_PALToken()","1308e9e0":"startSweepStake()","130985f4":"GetcrowdsaleContract()","1309a563":"IsPaused()","1309d3bd":"RAVI_ALLOCATION()","130a39b1":"removePersonalTokenLock(address)","130bcaa2":"removePersonalLockMultiple(address[])","130c0e88":"advisoryVUPDestination()","130d04d0":"companyHolding2y()","130d7906":"register(uint32)","130d993d":"lifeFactor_iii()","130e54a1":"prizeshow(address)","130fbba4":"setPixelToken(uint24,uint256,uint24)","13110199":"twentyEndTime()","13110874":"preSaleFirstEtherCap()","1311457c":"transferToken(address[],address,address,uint256)","13114a9d":"totalFees()","1311b45e":"setGasForCMT(uint256)","1311c860":"KCoin()","131284c8":"FUNDING_START_TIMESTAMP()","13137731":"testThrowsUpdateLatestRevisionNotUpdatable()","1313c739":"getBidForAuctionByIdx(uint256,uint256)","1313f631":"Register(bytes4,bytes32,bytes32[8])","1314e272":"addAddressesToOperators(address[])","13151981":"to()","13155455":"legacyToken()","13163d53":"CTO_Signature()","13169ab7":"rewardManual(address,uint256)","131719e1":"testtop()","13174093":"bountyAccount()","13175b40":"_emitUserCreated(address,address,address,address,uint8[],uint256,uint256[],uint256[])","13178704":"ContributeToPool()","1317b559":"buyshares()","1318b88c":"GetPlayer_FromID(uint32,uint8)","1318cd2d":"NameInt()","13193936":"GEMERAToken(address[50])","13194658":"MossCoin(uint256)","131a0680":"store(string)","131ad146":"getWorksStatus(bytes32)","131b0563":"EITARD()","131b81ad":"transferExecutorOwnership(address)","131b9c04":"getEarnings(address)","131bb0d6":"ethCostTotal()","131be36c":"preICOregulations()","131c4305":"SoundcoinsAddress()","131d2873":"isContractFrozen()","131de517":"getKeyBlockNr(uint256)","131e03ba":"withdrawOtherEDEX(address)","131e1816":"setRetiro(address)","131fa183":"createBoard(address)","132002fc":"votingDuration()","1320f614":"callServer(string,uint256)","1320f838":"modify_ICOStartDate(uint256)","1321d291":"enact_liquidation_greater_equal(address,uint256,uint256)","1321ea19":"mulTransfer(uint256,address[])","13220305":"doTransferOther(address,address,address,uint256)","13222d0a":"payoutsETH(address)","1322311b":"LoanBit()","13224fc5":"missingTokensFallback()","1322e9d0":"checkPayoutReadyState()","13233cd9":"appointAgent(address)","13242733":"getRoundOfSixteenTeams(uint256)","1325c502":"debugSetNow(uint256)","13270bb8":"authorizedCount()","1327290d":"isAddressActivated(address)","1327487f":"activation(uint256,address)","1327d383":"hybridizations(uint256)","1327d3d8":"setValidator(address)","1327fbe5":"getPanda(uint256)","1328ec9b":"getAvatar(uint256)","1328fd8f":"getDetails(string)","13299604":"getWallet()","132ac1dd":"itemsForSaleCount()","132ae5e9":"numInvestors()","132c3bea":"setContractPrice(uint256)","132c8641":"given()","132d05e5":"_distributeJackpot()","132df661":"isPrePreSale()","132e4f3c":"fail(uint256)","132e63ba":"PRICE_8()","132e8bee":"batchWithdraw(uint16[])","132ff514":"SQUAD_SIZE()","133086a5":"SphereTokenFactory()","1330a21f":"calulateRate()","1332143c":"getGoldTransactionsCount(string)","133252a6":"grantToken(uint256,address)","13326f43":"transferTokenToSender(address,uint256)","1332dd07":"_isFreezeList()","13331391":"buyPreIco()","133323c8":"setLevToken(address)","13332c6c":"myVoteFactory()","133369c6":"GetRigData(uint256)","1334a5e2":"eventCallback(uint8,address,address,uint256)","13352334":"payOwners()","1335461c":"joinGameWithBalance(uint256,address)","13357914":"from(uint256)","1335b56b":"GasSell()","1335b598":"get_ptc_count(address)","1335ff36":"createEventAndMarketMaker(uint256,uint256,uint8,uint32,address,uint256,uint8,uint16,uint256)","1336a756":"previousPeriodRate()","1336cff6":"isAccountFreeze(address)","13373786":"powerBalanceOf(address)","1337d6ed":"sendFlower(address,bytes32,string,bytes16,uint256)","13381fbf":"registrantsPaid(address)","1338c9e9":"SspStandardToken(uint256,string,uint8,string)","1338f493":"isClose()","13390cf2":"VASTToken(uint256,string,string)","133922ad":"setCompanyURI(string)","13392662":"totalTokensOfThisContract()","1339305f":"createRandomZombie_FreeZombie()","1339870e":"GetOrderBookScreen(address,uint256)","13399d10":"INCRYPT(uint256,string,string)","1339cba2":"getRemainingDaysToSecondPhase()","133a473e":"sleep()","133ae30b":"transferFunds(uint256)","133af8b3":"getIcoTokenHoldersAddressesCount()","133b5ba9":"honestisFort()","133c5ff5":"getAdminAccounts()","133cbe3a":"setLatestToNow(address)","133d10e6":"HPCToken()","133d27e1":"partner1_address()","133d2afe":"myfast(address,uint256)","133d5d4e":"setMultisignWallet(address)","133d8555":"withdrawTokenFromElc(address,uint256)","133e3f71":"getOld_BalanceOfr(address)","133f44dc":"removeVerifiedInvestor(address)","133f50f5":"checkUserExists(address)","133f6ac0":"earlyExchangeRate()","133f8a2f":"getStockReleaseTime(address,uint256)","133fe629":"calculateCuts(uint256,uint256)","134000c0":"getGrid()","134087a2":"gameLogic()","1340d09a":"isPoint(uint256,uint256)","13413858":"isFreelancerAvailable(address,address)","13414a4e":"doDisputeMemoryWrite(uint256,bytes32,uint256)","13419be3":"LifeFactor_v()","1341b33c":"releasableViewOrSend(address,bool)","13424bf0":"unpause_4()","13426d87":"addEmitter(bytes4,address)","13429e31":"newPrice(uint256,uint256)","1342c0e8":"VZT_WALLET()","1343a35f":"sendLoan(address,uint256)","1343ed05":"isStoreSet(string)","134538f3":"testRemoveGains()","134562a6":"SimpleToken(uint256)","13463751":"ThroneClaimedEvent(uint256)","13468929":"signedApproveCheck(address,address,address,uint256,uint256,uint256,bytes,address)","1346c20e":"canBuy(address,uint256)","134741f7":"SimpleERC20Token(uint256)","1347b972":"setICOWeek2Bonus(uint256)","1347b9ae":"CommonToken(address)","1348ab3a":"setRequiredTotal(uint256)","1348fdcc":"changeStarttime(uint256)","1349c273":"ClearExpiredFreezingEvent(address)","1349f5ec":"_provideChars(address,address,uint32)","134a04ea":"breedingDB()","134a5330":"updateTokenPrice(int128)","134abf66":"sendVesting(uint256)","134b684f":"SafeGiftTokens(uint256,string,string)","134c021b":"divForTransfer()","134c1a28":"L2Cash(address,address)","134c91be":"setFile(string,string,uint256,string,string)","134ccdfb":"IBIZACASH()","134dc5ad":"setManagerAddress(address,address)","134e3917":"setM2(address)","134f1893":"goWiner()","134fd7d0":"_convertToWei(uint256)","134ff97e":"startGame(uint32,bytes32)","1350a997":"AccessGrant(address)","1350acbd":"PRESALE_MAX_ETH()","135128c2":"CounterPartyDeposit()","13517fea":"maxCost()","1351cf51":"setAuthorizedAddress(address,bool)","135217e7":"requires_depth()","1352faec":"setReleaseDate(uint256)","1353e7b3":"purchaseMetal(uint256,uint256)","1356c5dd":"raceBet(uint8)","13574cd2":"calculateKnowledgeBuy(uint256,uint256)","1357b862":"contractSolidStamp()","1357e1dc":"totalPaidOut()","13582b6e":"HIDDEN_CAP()","135859c0":"distributeICOTokens(address,uint256)","135892bf":"FundUpdated(address)","1358937f":"TEAM_HOLDER()","13590153":"ManualChangeEndDate(uint256,uint256)","1359844a":"winNetworkFeeBasisPoints()","13598b71":"LightningEthereum()","1359cb2c":"getCommissionWithdrawn(uint32)","1359fc91":"setPublicKey(bytes32,bytes32,bytes32,bytes32)","135a2474":"joysoWallet()","135bada6":"setDungeonStatus(uint256,uint256)","135bf431":"gamerun()","135c0701":"purgeAccount(address)","135da3c2":"getBal(bytes32,address)","135da767":"LennartCoin()","135e9ad6":"fulFillTX(uint256)","135ec4bd":"AddAppraise(address,string)","135ed7bd":"priceRound1()","135f01df":"addDocument(bytes16,bytes32,uint8,bytes32,bytes32)","135fae64":"getOwnerProprietaryData(uint256)","135fc676":"loseHandler(address,uint8)","13601234":"checkRejectionRatio()","136047ab":"ticketTransferers(address,uint256)","13612119":"distribToken(address)","136125a7":"GoldFiatFee(string)","13618756":"readnationnameXteam()","1362180e":"setItemName(uint256,bytes32)","13622274":"prealocateCoins()","1362dd32":"testinx()","1364326c":"countVotes(uint256,uint256)","13643605":"crowdsaleTarget()","136439dd":"pause(uint256)","13651124":"WithdrawAmountFromBankAccount(uint256)","136512c9":"_checkPixelRight(uint256)","13653b24":"RECFToken(uint256)","1365e6a3":"REBELCOINSupply()","1366b970":"test_transfer_token_to_contract()","1367641e":"releaseAdvisorTokens()","1367944b":"getIdByName(string)","13683532":"getAccountCap(uint256)","1369f6fd":"getCurrentOwnerBallence()","136aa762":"Remmittance(uint256,uint256)","136ac4bf":"WillTestament()","136af582":"next(bytes,bytes,bytes,bytes,bytes,bytes,bytes)","136b4fea":"getActiveFish(uint256,uint256)","136bcbab":"Windlord()","136c545c":"transferToProjectWallet()","136c8744":"WBSToken()","136cf5c1":"deleteVestingFromStorage(address)","136d1057":"accountBalanceCount()","136d5a59":"giveKudos(bytes32,uint256)","136d6a39":"getBalanceByAddress(address)","136dbbab":"revenueFraction()","136e1949":"buyFunderSmartToken(string,string)","136e1c45":"suspendGame()","136ede68":"verifyCopieExecutoire(bytes32)","136ef18a":"allowTransfers(address[])","136f1016":"hasBet(address)","136f5b5a":"ordersCanMatch_(address[14],uint256[14],uint8[6],bytes,bytes,bytes,bytes,bytes,bytes)","136fa2d7":"rateSeedStage()","1370128e":"free()","13711a31":"presale_allocation()","13714545":"GATEL()","137157c0":"changeBlock(bool)","1371dab9":"whitelisters(address)","13730838":"getCanvasPainters(uint32)","13734a9f":"setClaimDividendPercentage(uint256)","13737db2":"TiValueToken()","13740cf3":"isTrigger()","13748a40":"Withdraw_2()","1374b22d":"proposalExists(uint256)","1374eb6f":"getLockByIndex(address,uint256)","1375111e":"returnrandom()","13754f9a":"notUpgradableInStore()","13765838":"deposit(uint64)","13767204":"AirDropRedeemAFTK()","1376f2ce":"setCrowdsaleStartDate(uint32)","137759df":"ammendReceivedLand(uint256,uint256)","13776ba1":"buyPLATCards(address,uint256,uint256,uint256)","1377900b":"PreICODayOneCents()","1377ae65":"_getEarnings(address,address,uint256,uint256,uint256)","13788651":"test_oneValidEqBytesNoLog()","137935d5":"totalGuaranteedCollected()","1379c6e0":"getICOEndDate()","137a1464":"ifEmergencyStop()","137a3fa7":"transferPayment(uint256,address)","137b3bcd":"getBounsByAmount(uint256,uint256)","137b763d":"SetReferrer(address,address)","137b8721":"getTierWhitelist(address,bytes32,uint256)","137baa2a":"BigToken()","137c1feb":"buyCommonTTMByETH(uint256,address)","137c638b":"getExtraGas()","137ce088":"TokenReserveMinted(uint256)","137ce8e3":"HARD_CAP_USD()","137d7026":"abiEncode(bytes,bytes,address[])","137db23c":"updateWhitelist(address,address,bool)","137e37d9":"accountGet(address)","13801995":"getHopefulId(address)","13819313":"OTTToken()","1381e400":"cancel(uint32)","13823365":"setOneTokenInWei(uint256)","13827950":"getShareholderDB()","1382a652":"isTrustedShop(address)","1382e75e":"addUser(uint256,string,string,uint256)","13831693":"getLevitatingUnicorns(bytes32,uint64)","13844e60":"totalOVCSold()","13845d2f":"creation()","138495de":"SimpleToken(string,string,uint256,uint256)","1384dc12":"endTx(uint256,uint256,uint256)","1385053e":"FlyCareTokenSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,uint64[5])","1385625d":"MintTimelocked(address,uint256)","13857c1a":"foundersFundMultiplier()","13859f46":"_metadata(uint256)","1385d24c":"toggleContractActive()","138665ff":"testJoin()","13869333":"RealityCheck()","1386a244":"getSettingAddress(string)","1386dc2d":"orgName()","138716e8":"root_domain()","13872f8d":"test_againstFor()","13877deb":"FBLFund()","1387c80b":"test_invalidRuleChange()","1388483d":"BLING()","13887592":"multilocked()","13888565":"surplus()","138a7084":"_4_owner()","138a886e":"testGetTransactionDetails(bytes)","138acb80":"View_MediatedTransaction_Info(uint256)","138b3ab1":"numPlots()","138b806c":"addMultipleAddresseseToWhitelist(address[])","138bdf1b":"simpleTest(address)","138cc941":"testErrorTransferToRejectAuthority()","138e2317":"IcoTokenMock(address)","138e8da1":"getIncreaseAllowancePreSignedHash(address,address,uint256,uint256,uint256)","138efd00":"_createTot(string,address,uint256)","139020d1":"deedByIndex(uint256)","13902e9f":"initBonusPeriod(uint256,uint256,uint256,uint256)","13905905":"addWhiteListedAddressesInBatch(address[])","13907d22":"abrirDoacoes()","1390b247":"getNbSellOrder()","1390df6c":"oldXPAAssets()","1391697d":"weiRound1()","13916c2e":"bidOnCraftAuction(uint256,uint256)","1391c5f8":"EnddateICO()","1391ff43":"fetchVoteInfoForVoter(address)","1392c495":"updateItemPrice(bytes32,uint256)","13930cf6":"setCurrentVersion(string)","13932337":"highTimeBonusLimit()","13943033":"RBOC()","1394f216":"addProjectManager(address)","139654e0":"window2StartTime()","13966db5":"mintFee()","1397d7ae":"setPI_edit_24(string)","1397fdbd":"getShares(address,bytes,int256[])","139818a1":"setFrozen(address,uint256)","1398bbf7":"getRanking()","1398e076":"lotteries(uint256)","139949fa":"sAssert(bool)","1399cc5b":"UWC()","139a667a":"_calcNextPrice(uint256)","139b3752":"_batch1_rate()","139c7048":"generateTokenAmount(uint256)","139ccd1e":"stopCollectSignatures()","139cd9d3":"drawnTokens(address,uint256,uint256)","139ddefe":"ProposeProposal(bytes32,bytes32,uint256,uint256,uint256)","139df200":"getAllMarketsInfo()","139e23b5":"getDividendInfo()","139f1838":"NoBonustimer()","13a070b7":"add_admin(address)","13a0c990":"BearTrap()","13a110b4":"getMin(uint64[])","13a19e1b":"initialCoach(uint256,uint256,uint8,uint256)","13a1da40":"tgrSettingsMinimalContribution()","13a22af9":"latest_buy_time()","13a24744":"BurnupGameAccessControl()","13a2852d":"setICOEndTime(uint256)","13a30010":"refund2(address)","13a396d8":"getRequiredDeposit(bytes)","13a3d9a1":"registerDocument(string,string,string)","13a460b7":"tourisToken()","13a46425":"getNumberOfDisputedStepsProDoctor()","13a46827":"fund(address,address,uint256,uint256,uint256)","13a4b3bc":"OwnershipRequested(address,address)","13a4fd37":"soldTokensIco()","13a517bf":"eighthTeamWithdrawal()","13a5aac7":"paymentRegularTokensPriority(uint256,uint256)","13a5d9e4":"remaingNTRY()","13a666a6":"hasReachedSoftCap()","13a7070f":"withdrawDeveloperCut()","13a8a080":"TokenDemo(uint256,address,address,address,address)","13a91cc8":"getVlsTokenAddress()","13a927c7":"toggleMatchStartEnd(uint256,uint256)","13a92f02":"frozenAccountForLogic(address)","13a931dc":"gasForOraclizedQuery()","13a9589c":"getSalt()","13a9cd8d":"lastDETCWC()","13aa48bf":"minePepe(uint256,address)","13aa7b6f":"viewUnclaimedDepositDividends()","13abdd75":"ecosystemSupply()","13ac2bdb":"addNetworkMember(address,bool,bool,bool,bytes32)","13ac58bb":"increaseCredits(string,uint256,uint8,address)","13acb45b":"calcDoubleBindedBlindHash3(string,address,address)","13ad41d8":"getSkill(uint32)","13ad9ce1":"getRepMarketCapInAttoeth()","13adc129":"MIGG()","13ae4522":"token3MstepCAP()","13ae457d":"mainCapInUSD()","13af4035":"setOwner(address)","13afa97a":"readMarketplaceConfigs()","13b15b24":"setRoundGap(uint256)","13b18640":"participate(uint256,address)","13b222ba":"getMyPoohs()","13b2663b":"cash_received(string)","13b2807e":"setCampaignEndPointById(bytes32,string,int256)","13b2e657":"unfreezeAccount(uint256)","13b37a83":"getRandomUuid()","13b39b9c":"approveMint(address,uint256)","13b3cd91":"collectForREQBurning(uint256)","13b3cdf6":"ownersLUT(uint256)","13b3fffc":"updateChannelManagerContract(address,string)","13b4312f":"transferCollectedFees(string,address,uint256,bytes)","13b499ce":"PRE_ICO_TIER_FIRST()","13b53153":"isFunding()","13b57686":"self_last_result()","13b5a19e":"GBPsToken()","13b5d420":"returnWebsiteData()","13b63f60":"updateBuildingPrivacy(uint256,bool)","13b6c8a8":"setListingFeeInWei(uint256)","13b6f213":"ContributionReceived(address,uint256,uint256,uint256)","13b7423a":"setFundraiserCallData(string)","13b796f4":"getMilestoneTimeAndRate(uint256)","13b84004":"gameTokenAmount(address)","13b96a9e":"numOfSamples()","13ba350a":"Whales_group()","13bac8f2":"updateStorage(string,string)","13baf1e6":"removeToken(address,uint256)","13bb7b0d":"PreICO(address,uint256,address)","13bbae9b":"addProxyManager(address)","13bc33ca":"CryptonHotels()","13bc4bda":"operatorSendTo(address,address,uint256,bytes,bytes)","13bd05e4":"silo_addr()","13bd4e2c":"_prepareAndSendReward()","13bd53e6":"applySettings(uint8,uint256,uint256,uint256,uint256)","13bd9e3c":"fundFoundation()","13bdbb19":"getCustomer(address,address)","13bdfacd":"print()","13be31ae":"preSaleDeposit()","13bfabf0":"isCurrentOrPastAccountReader(address)","13bfcd2c":"growthContract()","13c03159":"payPlayers(uint256,uint256)","13c04769":"submitBallot(bytes32,bytes32)","13c10e44":"attackerExpAdjustment()","13c13d6b":"updateMarketContract(address)","13c1629c":"_getBlockIndexAtYear(uint256,uint256,uint256)","13c1e906":"RentaCoin()","13c25ba6":"subtr(uint256,uint256)","13c2beff":"processWithdrawalForAccount(address)","13c32148":"_computeFee(uint256)","13c3922f":"Aborted(address)","13c42ca1":"getPrice(bytes1)","13c4f953":"getTime(address,address)","13c52111":"amountOfTokens()","13c58cbb":"countNoClients()","13c667d1":"calculateAmountBoughtICO(uint256,uint256)","13c68344":"Verto()","13c709d4":"transferToGame(address,address)","13c7db1a":"limitOfBranch()","13c82b0b":"setIsForkingMarketFinalized(bool)","13c89a8f":"getAllowedTime(bytes32)","13c8a376":"recovered(uint256)","13c8e60d":"getCurrentDebt(uint256)","13c9134b":"setcoinfee(uint256)","13ca1464":"getDHandRank(uint32)","13ca18ac":"WatermelonBlockToken(address,address,address)","13ca43a0":"teamWallet1()","13cc22ea":"createController(address)","13ccca96":"limitbreak_RELEASE()","13cceb21":"getHolderWithdrawIndex()","13cd528a":"miadd(uint64,uint64)","13ce15a9":"left67(uint256)","13ce401b":"getPlayerRecommond(address)","13ceb89b":"getCopaMarketAddress()","13cfed7f":"deposits_until_jackpot()","13d033c0":"cliff()","13d073d0":"Sign(uint256,address,uint256,uint8,uint256,string)","13d19950":"stringsEqual(string,string)","13d1aa2e":"f(uint256,uint256)","13d1bdfb":"priceForMateAdvertisement()","13d40e71":"RefundableCrowdsaleImpl(uint256,uint256,uint256,address,uint256)","13d4bc24":"buyTokenProxy(address)","13d4c63a":"_purchaseWhaleCard()","13d53ca9":"check(bytes32,uint256,uint256,uint256)","13d5469d":"periodICOStage7()","13d557bc":"operatorRedeemByPartition(bytes32,address,uint256,bytes,bytes)","13d567ca":"isApprovedTAAddress(address)","13d59ca9":"upgradeAddr()","13d5d4fe":"test_insert_findWithHintNextRemoved()","13d5ee74":"accPartner()","13d5f1fe":"durationOfStatusSell()","13d65cd9":"test_34_assertGasUsage700Boards()","13d73a08":"AMOUNTWAGERED()","13d769de":"auctionCreated(uint256,uint256,uint256)","13d8867c":"mint(string,uint256,string,uint8,string)","13d8c840":"tail()","13d9028b":"Remain_burn(uint256)","13dc01bb":"BKBK()","13dce04f":"updateRoutingPreference(string,string)","13dcfa08":"AmountClaimed(address,uint256)","13ddb69a":"CROWDSALE_START()","13ddd3ae":"getTokePerWei()","13ddecd5":"withdrawICOReserve()","13de214e":"minimalSuccessUSDWEI()","13debf7c":"_getPersonalAirdropAmount(address,address)","13defbd9":"getMyCrabs()","13df20fd":"createTimeBasedVesting(address,uint256)","13df35d1":"publicTGEStartBlockTimeStamp()","13df7091":"mintAll(int256)","13e003dd":"ASStoken(string,string,uint8,uint256,uint256)","13e0e70d":"ownerRegistry(address)","13e1d1d2":"multiCancelVoteForCandidate(address[],uint256[])","13e1f2b0":"DATToken(address)","13e26d58":"minRequired()","13e2cae1":"revealBid(bytes32,address,uint256,address,bytes32,bytes32,uint256,uint256)","13e2dfc1":"depositDividend(uint256)","13e3151b":"MyEPPToken()","13e33fb6":"calculateBonus(uint96)","13e41971":"setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","13e468b3":"getVotingToChangeProxy()","13e4b51f":"putHash()","13e50ca4":"totalFiatValue()","13e5a3b1":"SetUp(uint256,address)","13e5d8b6":"icoStartsAt()","13e5e26e":"recirculateLateFees(uint256)","13e60074":"OwnerRetireHodl(uint256)","13e7323e":"fundingEnd()","13e75206":"getParentOf(uint256)","13e7a234":"getAccessor(bytes32,uint256)","13e7d076":"STERNIUMHUGEELLIGENCECOIN()","13e81119":"purchaseTicketsWithReferral(uint256[],uint256)","13e8360d":"commissionerAuctionComplete(uint32,uint128)","13e8e5d2":"address2a()","13e8e74b":"IexecHub()","13e8fdea":"TxExecuted(uint32)","13ecfbfa":"lastBuyer()","13ed0846":"calculateReward(uint256,uint256)","13ed5f31":"getTransactionConfirmerInfo(uint256,address,address)","13ee4bc5":"pay(bytes32,address[],uint256[])","13f06abc":"balanceFrozenTokens(address)","13f0790c":"tokensSoldWithBonus()","13f07f6f":"Object()","13f0ec1f":"withdrawDekla(uint256,bytes)","13f20d76":"fundDigitalMarket()","13f233c2":"ethReceiveMainSale()","13f25eb6":"NinjaToken(address,address)","13f29768":"addUnsoldAllocationOrder(bytes32)","13f4318e":"SetSubscriptionTo(address,int256)","13f44d10":"isAddressWhitelisted(address)","13f46d3e":"SponBToken(address,uint256)","13f47f24":"lockedDelegatingTokens(address)","13f4b42c":"pixelsPerCell()","13f4c7a5":"INVESTOR_LOCK_DURATION()","13f4e977":"minimumFundingGoal()","13f52533":"capitalLedger()","13f56f73":"changeMinInvestment(uint256)","13f5ef00":"Main(string,bytes)","13f652fe":"getText(string)","13f6ee53":"cliffAdvisorsTokens()","13f73570":"manualyAddReferralPayer(address,address,uint256)","13f94a43":"getSiteTokenIds(uint256)","13f9cf76":"disableBundlingMultitoken(uint256)","13fa095f":"setDestinationWallet(address)","13fac256":"xem()","13faede6":"cost()","13fb2324":"EndEvent()","13fc5ace":"depositForMySelf(uint256)","13fc6ac2":"getEventData(bytes32)","13fcaf54":"getDepositCount(address)","13fdcbec":"developer_Coin_Character(string)","13fdd2b4":"TilexSupply()","13ff962a":"privatesaleSupply()","13ffdbfc":"gameCountOf(address)","13fff718":"doBet()","14001f4c":"setSiringAuctionAddress(address)","14004ef3":"multimint(address[],uint256[])","14007c6d":"nextState()","1400d1e4":"checkName(string)","14012549":"isMainSaleTime()","14025dcd":"cancelFee()","14029756":"setaddress(address)","1402c310":"NEWSOKUCOIN()","1402f031":"triggerAttackManually(uint32)","1402f80d":"selectTemplate(uint8)","1403041b":"PegasusToken()","14036f62":"Vboom()","1403835f":"_isExpired(uint256)","140420a9":"isRateValid(uint256)","140575af":"LogTokenPriceChange(uint256,string)","140604cc":"getInitialState(uint256)","14061862":"setIcoMin(uint256)","14069b12":"MXMPDMToken()","1406b921":"vent()","1406d3be":"lowestGameWithoutQuorum()","14074135":"dividendsRightsOf(address)","140758a9":"disableServiceProvider(address,bytes)","1408073e":"GangnamToken()","14081570":"addEpisode(string,uint256)","14081e39":"setEscrowFee(uint256)","14082cd2":"findProductById(uint256)","1409b88f":"getManualByAddress(address)","140a681a":"_getVersion()","140a7ac6":"getFinalScore(int256[])","140ad293":"spitnetwork()","140aee46":"_0xDogecoinToken()","140b1706":"maxHLPMTMarkup()","140b2cdd":"calculateMyRewardDecreased(uint256,uint256)","140b4465":"executeSpendingRequests()","140cc562":"isCollectSignatureCorrect(address,address,uint256,bytes32,bytes32,uint8)","140cd7af":"issueToken(address,address,uint256,uint256,uint256)","140d3e95":"changeFiatFeeContract(address)","140da6b7":"getAddressField1()","140dcec4":"right23(uint256)","140f64b4":"GoyanToken()","140f7f8d":"Staged()","14102159":"presaleLimit(address)","14106b49":"JustifyClaim(address)","14107f3c":"buy(uint8)","14111a43":"isValidService(bytes32)","1411539d":"multiSend(address[],uint256[],address[])","14116c3c":"SetPeriodPreITO_startTime(uint256)","14117228":"getNoteKeyByIndex(uint256)","1411d713":"licenseIssuedTime(uint256)","1412409a":"whitelistSetterAddress()","14127f13":"setOrderFill_(bytes32,uint256)","141283f1":"setNewWallets(address,address)","14131611":"setChibiForFusion(uint256,uint256)","14133a7c":"setSaleAgent(address)","14139904":"directorB()","14143c91":"TotalSpecialFeeTakes()","1414a506":"falangiToken()","1414ef78":"createInvoice(uint256)","14162e8d":"IouRootsReservationToken(string,string,uint8)","14163a83":"setCrowdsaleContractAddress(address)","14167bf0":"oraclize_query(string,string[])","14174f33":"withDraw(uint256)","14177dbf":"setLockTokensAddress(address)","14179865":"logos(uint256)","1417b946":"adminOwner()","1417c845":"Mortal()","14189a7e":"outstandingValue()","141926fa":"updateAccount(string)","14193456":"MainSaleEnd(uint256)","141961bc":"campaigns(uint256)","1419c3f3":"grand_factory()","141a8dd8":"approver()","141bd92a":"getBallotInfo(uint256)","141c4306":"AbroToken()","141c4e60":"challenge(uint256,address)","141c9422":"listingDate()","141ca2c7":"reservedIcoCrowdsale()","141d717b":"OC()","141dbe66":"distributeBTCB(uint256,address[])","141e26a5":"setEditionMaxSales(uint8,uint256)","141edaa1":"manufacture(address,address,address)","141f211c":"snapshotStakeAmount(uint256,address,address)","141f6800":"fundingMinimumTargetInUsd()","141fd3cf":"channelResultTimeout(uint64)","14204ca9":"QZG001TOKEN()","1420765a":"isBuyLocked(address)","14211803":"hasBuyTotal()","14219ff9":"sq(uint64)","1421c1a4":"vote_for_candidate_C_for_free()","14225b9b":"token_ratio1()","1423113a":"fluxFeed(uint256,bool,bool)","142359f4":"fillOrder(bytes32[],bytes32[])","1423649b":"cofounderApproveSwitchRequest(address,bytes32)","1423c40e":"setBudgetOfCampaign(bytes32,uint256)","1424c182":"recordDeposit(uint256)","14253887":"certify(address)","1425d2fa":"getBalanceToken()","14263f0c":"Dadice()","1427407f":"NINECOINTOKEN()","142769aa":"requestNumber(address,uint256,uint8)","14279086":"getIndividualCount(uint32)","1427f168":"log2Bounds(uint256)","14280bb8":"getBodyColorValue(uint256)","14287a07":"playerPrizeClaim()","1429a36b":"getOrCreateFeeWindowByMarketEndTime(uint256)","1429e26c":"User()","142b353d":"MultiTransferETH(address[],uint256[])","142bc2ae":"latestData()","142d239a":"canPurchaseAmount(address,uint256)","142dc95d":"testAmount(uint256)","142e0bdf":"LogAllocate(address,uint256,uint256)","142e133f":"totalBalanceDown()","142e8e25":"setAdmin(uint256,address)","142e9ab8":"setTrade(bool)","142e9bc9":"weaponToOwner(uint256)","142f328e":"fundDao()","142f53c2":"sendInitialTokens(address)","143085c3":"updateRankBoard(uint256,uint256)","1430990a":"bidTransfer(uint256,address,uint256)","1431b23a":"getData(bytes)","143211ec":"newDaoRulesProposal(uint256,uint256,uint256,uint256,uint256,bool,uint256)","14325458":"calculateTokensFrom(uint256,uint256)","1432621a":"getPeakSupply()","14332c93":"SetConfirmRound(uint32,uint8,bool)","14350c24":"changeMinimumMakerProtocolFee(uint256)","143551e4":"timeExtension()","143580d0":"PGDA()","14359466":"NBTV()","1435e397":"setAllocation(address,uint256,uint8)","14361fd1":"singleWithdrawMin()","14363e65":"setPeriod(uint256[])","14367652":"revealStageActive(uint256)","1436fb39":"_isVotingAddress(address)","14371c33":"someMethod5(uint256,uint256,uint256)","14373817":"rateSoft()","1437f9a3":"Set_your_game_number(uint16)","143a1a2f":"pilfer(uint256)","143bb3e6":"StartRollDice(uint32)","143c56cf":"disprove()","143c6d4f":"TokenTransferTo(address,uint256)","143c7a3f":"OPAY()","143e55e0":"era()","143e6209":"setImagePartsCount(uint256,uint16)","143f68c9":"getRedemptionBalance()","143f9d1f":"week4Price()","143fb46d":"setRemainingTokensWallet(address)","143fcbbe":"cancelBooking(string,uint256[],uint256,bytes32,bool)","14404eb2":"roundOver()","144052b6":"C4coin()","1440f2bf":"PRE_SALE_PERCENT()","144136a1":"restartCrowdsale()","144138c8":"removeGlobalConstraintPre(address,int256,address)","1441a5a9":"referral()","1441c288":"showUnpaidInterest(address)","14423381":"GameConfig()","144267e0":"refundSecurity(address,uint256,uint256)","1442b548":"ZTST()","14432f6e":"Received(address,address,uint256,uint256)","144344b9":"setEth(uint256)","14442f54":"VERSION_NAME()","14447e11":"checkGamesReadyForSpinning()","14449c92":"finishRoundB()","14459309":"price_constant2()","1445c6da":"increasePosition(bytes32,address[7],uint256[8],uint32[2],bool,bytes,bytes)","1445f713":"hexstrToBytes(string)","14462b93":"findWhichCTD(address)","14468d32":"nextBidExpireBlockLength()","1447431e":"setCCH_edit_24(string)","1448b3ca":"tokenSaleAddress()","1449757d":"annulCertificate(address,address)","1449c321":"view_get_gameStates()","1449c6dd":"Staked(address,uint256,uint256)","144a2752":"getBuyAmount(address,address,uint256)","144a3260":"createWithDeposit(address,address,uint256)","144a3472":"inMaintenance()","144a88a0":"updatePlayerPoint(uint32,uint32,uint32,uint32,int256)","144b2a82":"transferICO(address,uint256)","144be7eb":"totalNumberOfCards()","144c7e40":"CRYPTOKEN(uint256,string,uint8,string)","144cbdfd":"NobeToken()","144f2f94":"_burn()","144fa6d7":"setToken(address)","145000ab":"PRICE_2()","14525b6b":"auctionFee()","14525bce":"INITIAL_BALANCE()","14526f8c":"Buy(string,address,uint256,uint256)","14534ad0":"LogCertifierAdded(address)","14534ba7":"ballotEncryptionPubkey()","1453671d":"changeWithdrawAddress(address)","1453bfb3":"visitingUnicorns()","1453d756":"bytes64ToString(bytes32,bytes32)","145538ea":"phase1StartBlock()","145671aa":"getValidations(address,bytes32)","14567b8b":"setSelfAsContributor(string)","1456974f":"setNameReaderId(address,bytes32,bytes32)","1456979f":"setNewValidator(address)","14572dff":"incrementUniquenessIndex()","14576a49":"NewSophonToken(address)","14577c55":"accountLevels(address)","14584a9d":"getAuctionIndex(address,address)","1458ffb3":"VREO_SALE_PHASE_1_END_TIME()","1459457a":"initialize(address,address,address,address,address)","1459cef4":"balanceOfMine()","1459ecc4":"lastrecordindex()","145a0adc":"setDataLink(uint256,string)","145a7f92":"social(address)","145af145":"getAllCardsLowestPrice()","145b2ab2":"CocoToken()","145ba84c":"_payAwardOwner(uint256)","145c03f2":"TransferFromCompanyInventory(address,uint256,bytes32)","145ca0b3":"UnLockTokens(address,uint256,string)","145cb459":"showCertificate()","145cf0c2":"decrementTokenIdsLength()","145d82d6":"setKingdomFactoryRP()","145e1944":"buy(bytes,int256)","145e6701":"SteemitFund()","145e818f":"BALVINDER()","145e8f5e":"HVB()","145eb4ee":"HuaTuoToken()","145ee04c":"pendingFeesWithdrawals()","145f3143":"releaseTime1()","145f8ba2":"getPainting(uint256)","145fa890":"setWhiteListDuration(uint256)","145fd87a":"getTotalHashRateOf(address)","145ff9cb":"terminateShortPosition()","146008e3":"grid(uint256,uint256)","14606109":"cap1(address)","14607fc2":"dispute(bool,address)","146091f1":"removeFromAllocationList(address)","1460b505":"setWeights(uint256[])","1460e603":"numDarknodes()","146124f9":"totalDistributedr()","146155bf":"createUserByEmailVerify(bytes32,bytes32,uint256)","14619c7f":"setContractAdmin(address,bool,uint256)","14627834":"GOVERNANCE()","14633039":"VanityToken_v3()","146483f9":"setCreateUnicornPrice(uint256,uint256)","1464bc45":"walletFacebook()","1464f516":"votosTotales()","14653f87":"SHIP(uint256,uint256,uint256)","14656957":"PeculiumToken()","1465aa97":"testingContract()","1466724a":"subUserBattleValue(address,uint256,bool)","14670850":"test_33_assertGasUsage200Boards()","14673d31":"setReserveAddress(address)","146740ee":"bulkAddMake(address[],uint256[],uint256[])","14679957":"GenesMarket()","14686ac2":"puntAmount()","1468d9cb":"Latium()","1468fc26":"changeSharedExpenseAllocation(uint256)","146901db":"setFailed()","14690be7":"TransactionSucceededICAP(bytes32,uint256,string,address)","14697cc8":"claimHalvingsSubsidies(uint256)","14698895":"Certification()","146b4955":"RICHERC20(uint256,string,string)","146b58df":"getInvestment(address)","146bea7b":"nextYear()","146c8710":"addressOf(address,uint256)","146ca531":"round()","146d2148":"setReaderId(address,bytes32,bytes32)","146dd227":"BLTToken()","146dd8e0":"BestEther()","146e3cb5":"getDroidsIds()","146e7eea":"soulsForSale()","146e91b5":"signContract(bytes32,string,bool)","146e9329":"summJenkins()","146ee571":"requestFreeDistribution()","146ef27d":"balancePreSale2()","147035ba":"processPublicPurchase(uint256,address)","14704d91":"getCCH_edit_26()","14709544":"BetCoin()","1470dfa8":"closeWindow(uint8)","1470fc6f":"approveRejectOrg(string,string,string,string,string)","14712e2f":"proxyApprove(address,uint256,bytes32,address)","147180ab":"feesA()","147288fb":"test_insert_findWithHint(int256)","1472d56a":"assertEq1(bytes1,bytes1)","1473248d":"SampleContract()","14743e7e":"activateRound(uint256)","1474b789":"burnXPTokens(address,uint256)","1475e751":"game_token()","1476e40f":"multiCall(address[],uint256[])","1478b6af":"abortUpdate()","1479290e":"removeBouncer(address)","14793058":"createPhoenixes()","14794702":"withdrawWinnings(uint256)","147a5640":"_getAllRevisionIpfsHashes(bytes20)","147aaa8d":"giveTokensTo(address,uint256)","147bfd66":"GuardedBeercoinICO()","147c9f6d":"updateWallets(address,address,address)","147d57b0":"send_bounty_token(address,uint256)","147d959a":"setUSDPrice(uint256)","147da3c9":"newSpaceshipProduct(uint16,bytes2,bytes2,bytes2,bytes2,uint256)","147e14a4":"retrieveTokens(address,address,address)","147e51f4":"freezeTheMoment()","14807045":"flipCapSwitchTo(bool)","148105ab":"addBankroll()","148174cd":"ownerSetCasino(address)","1481c04a":"getTXSValue(uint256)","1481d439":"deleteUserClaimInBulk(address[])","148222cf":"donateSkin(uint128,address)","1482bd40":"bountyBalanceMap(address)","14838617":"DEV_PORTION()","1483fc8c":"addBlockData(uint256,bytes)","14841164":"extraBalanceWallet()","1484abf4":"whitelistApplication(uint256)","1484cd32":"getWinners(uint16,uint8)","1484e9ad":"startICOStage2()","14852606":"setAccompliceBContract(address)","1485ffc4":"finalizeTDE()","14870a57":"setMonthClose(uint256,bool)","14870d2c":"withdrawAllToken()","14887c58":"isEntity(address)","1488f983":"LogFinalized(address)","148ab04e":"balance_in()","148ab078":"MEW_RESERVE_FUND()","148bea6b":"gamblerlist(uint256)","148cd939":"transferBecauseOf(address,uint256,address,uint32,uint256)","148ce4a4":"test_claimShare_isTranscoder()","148d3e7b":"FQCoin()","148da7f6":"disableInvestment()","148dd101":"thirdChangeBlock()","148f2e5e":"sendWei(address)","148fa780":"just10Send()","14900396":"changeRaceOwnership(address,address)","149148e0":"getCityPlanAddres()","1491858e":"calculateSetupAllowedUntil(address[16],uint256)","14918f5e":"performInitialWithdrawal()","14930d7e":"transferResidualBcoupons(address,uint256)","14941e80":"getFreeAmount()","14946a97":"CoreToken(uint256,string,string,uint8)","1494ecfc":"SentosaX()","14950f64":"RevokeAddressChanged(address)","14959741":"UserMessage(address,string)","149607d3":"EtherollToken()","149679b9":"GOE()","1496fc4c":"Telcoin()","14975cc7":"hardCapPrice()","14986f5b":"setCooldowns(uint32[100])","1498970a":"getDeployedblockbytesMarriages()","149947fd":"finding(address,bytes8,uint8[])","1499c592":"setParent(address)","149acf9a":"daoCreator()","149b8690":"supplyInCirculation()","149c5066":"ChanceOfWinning(uint256)","149cc1f6":"_finalizeBet(bytes32,address,uint256,uint256)","149cd0be":"alterCreatePetitionFee(uint256)","149dffc8":"numCancelledRequests()","149e6788":"heroClasses(uint32)","149e685a":"getFundById(uint256)","149eead5":"master_contract()","149f2fdb":"sellExchangeRate()","14a0069a":"getVoter(string)","14a03e7c":"concludedGameIndex()","14a06710":"TokenRelease(address,uint256)","14a091a9":"createLockTokenHistory(address,uint256)","14a1231f":"guardian2Vote()","14a26806":"setPreUri1(string)","14a2d99f":"Grant(address)","14a34ebd":"getMilestones(uint256,uint256)","14a3557b":"intrepidVoucherSoldCount()","14a3b19a":"transferIndexedByAddress(address,uint256,address)","14a47046":"add_blockedAddress(address,address)","14a4a273":"penalizationOpen()","14a528f2":"HasGift(string)","14a54912":"token_a()","14a57db7":"LogPreparePreContribution(address,uint256,uint256,uint256)","14a59e9d":"getStakeholderConfirmationCount(uint256)","14a5cd29":"getAssetEmitter(uint256)","14a6a1a5":"REQUESTED_STATUS()","14a7945a":"redeemAllOwnedAssets(uint256)","14a7c57d":"getData_26()","14a89904":"rollDie(address,uint256)","14a8bd0d":"EXCHANGE_RATE()","14a8ca20":"fromPercentage(uint256,uint256)","14aa0eaa":"claimBountyToken()","14ab260e":"retrieveCompletedProof(bytes32)","14ab9038":"setTTL(bytes32,uint64)","14aba0db":"MineAD(address,uint256)","14ac1102":"get_total_items_in_state(bytes32)","14ad47eb":"SwapToken()","14ae1229":"setRightForInterest(uint256,uint256,bool)","14aedbee":"TokenFactoryAirdrop()","14af0908":"XdacTokenCrowdsale(address,uint256[],uint256[],uint256,uint256)","14af1e92":"MinterGaveCWC(address,address,uint256)","14af35c3":"MyToken(string,string,uint256)","14afd79e":"ownerOf(address)","14b0519d":"AltExtraHolderContract(address)","14b08b4d":"getAllDepositors(uint256)","14b0e266":"addBid(uint256)","14b11606":"BONUS_ICO_STAGE2()","14b11651":"setPoolAndAmount(address,uint256)","14b11875":"verifyProposal(address,address,uint256,string)","14b1e1f8":"setRefer50x50(address)","14b24209":"multiGuess(int256[])","14b2cd55":"LightPool()","14b2d6dc":"isValidDate(uint256,uint256,uint256)","14b419c9":"getAllUsers(address)","14b49c36":"Police_5()","14b5202c":"stage_Discount()","14b546b4":"FreePublicity()","14b577ab":"addIdArrayItem(address,address,string,string,uint256)","14b72000":"txFeeCapInWei()","14b77798":"unsetMany(address[])","14b78abb":"cloneProposal(uint256,string,bytes32,uint256,uint256,uint256,uint256)","14b79e21":"_depositTransferCredits(uint256,uint256)","14b7c684":"DGD()","14b80402":"isStateDestructed()","14b85c1b":"removeSalesAgent()","14b87862":"getParticipant()","14b8e9a4":"checkpointLevel()","14b92721":"loveMessage()","14b933e1":"getWeiPerSatoshi()","14ba5c09":"getDay()","14bafeab":"getMessage2()","14bb4dd9":"WavesTransfer(address,string,uint256)","14bba4b8":"setDiscount(uint256,uint256,uint256,uint256,uint256)","14bba8a2":"updateRequestExpired()","14bbe21c":"transferBeneficiary(address)","14bc3efc":"endBorrowAgreement(string,string,uint256,uint256)","14bd0c21":"getServiceAddress(bytes)","14bd3d87":"acceptOffer(string)","14bd8acd":"massApproval(bool,uint256,uint256)","14be5169":"releaseLockAgencyLock2()","14be7793":"isPrivateSale()","14beb3a3":"latestParams()","14befc70":"parkingOff(address)","14bfd6d0":"admins(uint256)","14c01fb4":"_checkPixelAbove(uint256)","14c0a37a":"stateBorrowerDefaulted(uint256)","14c0bc27":"EtherBalanceOf(address)","14c0ffdc":"formula(uint256)","14c15569":"getAccountOutputSdcslength()","14c16f41":"updateStageWithInvested()","14c239a9":"_cappedReward(uint256)","14c259eb":"white_duration()","14c292ca":"finishITO()","14c2d2e0":"handleRef(address,uint256,uint256,uint256)","14c33c24":"setSystemEndingPrice(uint256)","14c3512d":"adminSetFeeUsdDialNumber(uint256)","14c3e29f":"NONEC()","14c411c7":"releaseTeamTokens()","14c44e09":"registrationFee()","14c485c9":"getMartialListInfo()","14c588de":"setPromoGen0(uint256)","14c5f158":"callModifiedTransfer(address,uint256)","14c65687":"_getWeightUntil(uint256,uint256)","14c72e9e":"_getFirstIndex(uint256,uint256[])","14c74834":"setHeir(address,uint256)","14c7763b":"MINTING_LIMIT()","14c78333":"batchResolveAquarium(uint256[])","14c7bddf":"manualRefund()","14c888da":"setFeeParams(uint16,uint256,uint256)","14c8e5f4":"requestHangingDividends()","14c9035e":"quickConvertPrioritized(address[],uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)","14c9b8a5":"closeEarly(uint256)","14c9eed0":"onlyadmin()","14ca5200":"MiningRewardTransfer(address,address,uint256)","14ca5398":"submitFullBlock(bytes,uint256[],uint256[],bytes,bytes,bytes,bytes,bytes,bytes,uint256)","14ca6e01":"setBleachPrice(uint256)","14ca8e01":"validPlayer2(uint256,address)","14cabddb":"joinProof(uint256)","14cba002":"_forwardTransferFromWithReference(address,address,uint256,string,address)","14cbb90d":"yea()","14cbd993":"getRegisteredTokens()","14cbdb54":"EspCoin()","14cc3cf9":"FOUNDERS_LOCK_PERIOD()","14cd70bc":"FakeOwner(address)","14cddf9e":"whiteListMinAmount()","14ce2f61":"MappingDone(address,uint256)","14ce4059":"owner_fee()","14cf12d5":"softCapTime()","14cf19fe":"TIER1_PRICE()","14cf588f":"LBA()","14cf6983":"getBalanceCell(address)","14cfb977":"minFinneyPerSaleMoreThan()","14cffda2":"synertreeToken()","14d03ea6":"TrivialToken(string,string,uint256,uint256,address,address,uint256,uint256,uint256)","14d04e06":"FooozCrowdsale(address,address)","14d066d5":"addCertificator(address)","14d07a3e":"left28(uint256)","14d0f1ba":"moderators(address)","14d10920":"BetstreakToken()","14d140b0":"communityPool()","14d20606":"devTeamPrecent()","14d23c8b":"MaliciousSeller()","14d296f4":"getPremiums()","14d2d59d":"_approve(uint40,address)","14d30335":"assignInitialDays(address,uint256,uint256)","14d33a30":"addCandidateBatch(address[])","14d36f53":"checkVerifyAccess()","14d3df67":"getSMPTokensAmountPerEthInternal(uint256)","14d47bc9":"registerBeneficiaries(address[])","14d4ecd9":"defineCurrentPeriod(uint256,uint256)","14d5d892":"changeMemberAddress(uint256,address)","14d67848":"setClass(uint256,uint256)","14d6c2b1":"_maint_updateOwner(address)","14d72106":"nextNumberOfWagersToFinalTimeout()","14d75e9d":"createProduct()","14d8c981":"getItem(address)","14d9d2e5":"getCostForUprade(uint256,uint256,uint256)","14dacf5b":"disableWhiteUserList()","14db6d58":"hasUserPermission(address,bytes4)","14db8c7d":"getGladiatorPower(address)","14dba3ba":"PPToken(uint256,uint256)","14dbb508":"Project(string)","14dcd58f":"derpcoin()","14dcfd55":"vendorWallet()","14de9cc2":"tokenGenerated()","14dea8e7":"onCancel(bytes32,uint256,address)","14deb0ac":"addressAt(address,bytes,uint256)","14df96ee":"isRoundingError(uint256,uint256,uint256)","14dfad27":"_emergencyLoop()","14e0246a":"setMintSigner(address,int256)","14e2bc2a":"finishMinting(uint256)","14e3fad3":"extra_bonus_amount()","14e4a723":"SafePromo()","14e580ab":"LogIdentityCreated(address,address,address,address)","14e604b6":"EXPLOSION_DENOMINATOR()","14e6a86d":"doCheckBounds(bytes32)","14e8093f":"clientWithdrawAll()","14e887e8":"transactionCounter()","14e904e8":"LogBidCompleted(uint256,bytes32,bytes32)","14eaa43b":"withdrawToken(address,uint256,string)","14eb75bb":"assignRoles()","14eb76ac":"updateTeamAddress(address)","14eba026":"removeTeamMember(address)","14eba5d8":"affiliateList()","14eda32c":"COZE()","14eea0dc":"IND()","14efaf86":"ChangedPaymentDestination(address,address)","14f0ff32":"FUNK()","14f1586a":"objective()","14f1dcac":"setFreeCoins(uint256)","14f2979f":"getTickets(uint256)","14f36e17":"getTokenIssued()","14f3f491":"preICOContract()","14f52c07":"Blogcoin()","14f60881":"getJobClient(uint256)","14f64d6c":"PRESALE_START_WEEK1()","14f685a8":"Etherumble()","14f6c3be":"getETH()","14f72e50":"EightStandardToken(uint256,string,uint8,string)","14f7731b":"getAllowedAmount(uint256)","14f7789d":"GRAChain(uint256,string,string,string)","14f796ca":"changeStageAndReleaseETH()","14f80083":"setMultisigVault(address)","14f8917a":"initialSupplyPreSale()","14f8b424":"roundID()","14f8f160":"hasIssue(address,bytes32)","14f99533":"changeAuthorisedContract(address)","14f9e35b":"groom()","14fa0b45":"NenasChain()","14fa274c":"MigrationInfoSet(string)","14fbc22b":"createHero(uint256,address)","14fc2812":"setAuthorized(address)","14fc7b9d":"AscToken(address)","14fcb95c":"ubiatarPlayWallet()","14fd0c14":"deadlineVoting()","14fd24f0":"updateIndividualCap(uint256)","14fddb71":"devTeamBalance()","14fdecca":"getPromotion(uint256)","14fefca1":"set_hp(uint256)","14ff5ea3":"getTokenId(uint256)","14ff5f99":"punterAddress()","14ff89cd":"getContactByIndex(uint256)","14ffbafc":"startEthGet()","1500214e":"calcPercent(uint256,uint256)","15003368":"withdrawEMONT()","1500c257":"startTimePre()","1501bf03":"transferFunds(address,address,uint256)","15020cb0":"commandTookAway()","1502906d":"timeStep()","15036fa2":"update_dividend(address,uint256,uint256,uint256)","1504460f":"poke(bytes32)","150455a4":"HOTCASH()","15045c3e":"GenieToken()","1504ce95":"payout(string)","1504d8f0":"createSnapshot()","1504e40b":"RoundEnded(address,uint256)","150627bb":"minimumInWei()","15067c4e":"p_setRoundDuration(uint256)","15070401":"getSymbol()","150727ff":"getSecondAddressBalance()","15087f7d":"cancelBet(uint256,bool,uint256)","15093e03":"minimumAllowedWei()","1509c42a":"pr()","150a5655":"giveVote(string,uint8)","150a6480":"allowMinter(address)","150aaf74":"BHB(uint256,string,string,uint8)","150ad2a8":"owner_transfer_ownership(address)","150b52db":"removeAddressFromPartnerWhiteList(address)","150b6885":"genaroDevMultisig()","150b7a02":"onERC721Received(address,address,uint256,bytes)","150bc419":"unitMythGrowth()","150c3e8b":"getIdxArray(uint256)","150d6277":"setMinBetPerSpin(uint256)","150d7163":"UnfreezeTokensOfOneUser(address)","150eb4d9":"releaseTeam(uint32)","150f16ac":"stoppedPresale()","1510ca79":"MAX_CROWDSALE_TIME()","151110b0":"releaseLockedBalance(uint256)","1512cfc1":"_preValidateInvest(address,uint256)","15136fb5":"ChiTrader()","15139f09":"ExaGBP()","15142ed4":"shutDownVersion(uint256)","15143d6a":"buyOx()","1514617e":"vestingDuration()","15148649":"getAllowedTokensCount()","1514b9cb":"RKCToken()","1514bc48":"tokensForPurchase(address,uint256)","1514ea54":"getLossesShare(address)","15154aff":"ITO()","15158a10":"numberOfTokensToAvail25percentDiscount()","1515bc2b":"hasClosed()","151682a5":"HASH_RATE_MULTIPLIER()","1516bbc4":"setTeamVault(address)","1516db09":"allOwners(uint256)","1516def7":"multiSigAddress()","1517d107":"totalNormalCollected()","15183e2f":"twitterBotAddress()","15191c98":"hibernate(uint256)","15194a9f":"init(uint256,string,string,uint8)","151b0bed":"getSponsorshipsBalance(address,uint256)","151b2342":"getOraclizeCallbackFee()","151bc167":"Control()","151bcc06":"massAdvertiseTransfer(address[],uint256)","151c0d40":"crowdsaleEther()","151c3b12":"store(address,bytes)","151c61b6":"setUSDExchangeRate(uint256)","151d7d32":"flushDividends()","151e2a0a":"check_ptc_num(address)","151eeb55":"transferAllowed(address)","151fa6be":"delegateIsDeleted()","15226b54":"getReserveBalance(address)","1522f110":"preregvills(address)","15248362":"buy_bounty()","152583de":"getAttributes()","152592b0":"WALLET_ALLOCATION()","1525b4f5":"mintLockedTokens(address,uint256,uint256)","1525d680":"MainToken(address)","1525ff7d":"setTeamWallet(address)","15263ef7":"VHW()","15270ace":"distribute(address,address[],uint256[])","152713b3":"sumAcceptedVirtualContrib()","152744ea":"BondInfoById(uint32)","1527d657":"returnHowMuchMoreETHNeeded(uint256)","152826e9":"cashoutable()","15285aa3":"EventBid(uint256,address)","1528f43c":"getPOOL_edit_10()","152993a8":"addContract(string,bytes)","1529a639":"getCollateralBalance()","152a3f28":"getSponsorships(address,uint256)","152af8f9":"acceptFoundationTransfer()","152afab4":"adicionarAssinatura(string,string)","152b6f9a":"hasDNN(address)","152cf9db":"getDataPoint(int256,uint256,uint256)","152e84a7":"tokensDistributed()","152fb125":"SimpleMixer()","152fb5fd":"period_count()","15303771":"updateUnsold(string,uint256,uint256)","1531076c":"getAgonArray(uint64,uint64)","15312b50":"SimpleTokenVesting(address,uint256)","153154fd":"getRecommender(address)","1531c267":"fipsRegisterMulti(uint256,address,bytes)","1531dfdb":"ethtosend()","15328109":"parentAddr()","153345ce":"changePrice(uint256,uint256,uint256,uint256)","15334b77":"setGameStarterDividendPercentage(uint256)","15334fa7":"SOCToken(uint256)","15336f80":"setProof(string)","15338724":"mediaTokens(address)","1533ba50":"EMBCToken()","1534180f":"_transfer(address,uint256,bytes,string)","15347380":"priceInWeiToken(uint256)","1534b1fc":"getPlayerDepositData(address)","1534b392":"getNumLockers(address)","1534e8d2":"multiVesting(address[],uint256[],uint256[],uint256[])","1535884e":"notarizeHash(bytes32)","153677b7":"deployOtherVesting(address,uint256,uint256)","1536a614":"EphesusToken()","1536cabf":"addCertAdmin(address)","1536fec6":"get_end_time()","15370598":"getCurrentMode()","153737f5":"OWN_DistributeTokenAdmin_Multi(address[],uint256,bool)","15373e3d":"castVote(uint256,bool)","1537671c":"qtdePokemonsMapping(address)","15382559":"LogDepositReceived(address)","153913e3":"ICO_Live()","15398afe":"compareNumericStrings(string,string)","153a1f3e":"bulkTransfer(address[],uint256[])","153a6bd3":"test_sendFundsToContract()","153a79c9":"buySaleTokens(address)","153aa771":"totalSupplyBonus()","153b0d1e":"setBlacklist(address,bool)","153b31fd":"sign(string,uint256,uint256)","153cc53d":"hasCrowdsaleStarted()","153d3572":"deletePawn(uint256)","153debee":"FOUNDERS()","153e66e6":"buy(address,address,uint256)","153e6d70":"setPercentFrozenWhenAwarded(uint256)","153faf2c":"FOUNDER_WALLET()","153fbb81":"setCAPAddress(address)","153fe583":"getAddressFromSig(bytes32,uint8,bytes32,bytes32)","153fe6aa":"STATUS_INITIAL()","15408734":"addMake(string,address,uint256,uint256,bool)","15409c1d":"TradingAccount()","1540fe22":"weiMinimumLimit()","1541eb12":"JournetToken()","15420b71":"transferPreSignedHashing(address,address,uint256,uint256,uint256)","1542b365":"phase_4_remaining_tokens()","1543136c":"getDeployedLength(address)","1543d99f":"bonus_calculation()","1544fc67":"delegatorStatus(address)","15454cd2":"registerNameCore(uint256,bytes32)","15480c63":"createDefaultCobeFriend(uint256,uint256,uint256,address,uint256,uint256)","15490ebb":"transferReward(address,uint256)","154920b0":"firstEmptyId()","15497d2c":"lockStatus(address)","1549be43":"getOutstanding(address)","1549c1e2":"usePlayerToken()","154a7d71":"DATE_31_DEC_2019()","154ad3f7":"ChangeMemberName(address,string,string)","154af6b1":"sendShares(uint256,uint8,uint256,address)","154b3f4c":"executeSigned(address,uint256,uint256,address,bytes)","154d56db":"callHotel(address,bytes)","154d6e12":"buyPack(uint8,uint128)","154d7944":"newCarID()","154e3f61":"enroll(address,address,uint256)","154e45a4":"privateSold()","154e8152":"withdrawnBalance()","154e95f1":"changeNamespaceOwner(string,address)","154e9bd5":"PumaPayToken()","154f78dc":"FREETOKENTEST(uint256,uint256)","154faf5d":"getTodayIndex()","15502d73":"changeTokenFreezeDate(uint256)","15506bf1":"RemoveParticipant(address,address)","15519af1":"RANGESTART_PRESALE()","1551e636":"tokensReceived(bytes32,address,address,address,uint256,bytes,bytes)","15525991":"getMaxAmount(address)","15527006":"icoPhaseDiscountPercentage3()","1552cb04":"addBaseWhitelist(address[])","15544fc2":"Teaeum(uint256,string,string)","1554611f":"escapeHatch()","1554c243":"_setApp(address)","1555e337":"ConferenceCertificate()","1555fe7e":"RecordableRefundableCrowdsale(uint256)","1556195c":"LowRiskBag()","15574634":"requestTransferFundToSupplier()","1558687a":"DepositContract()","155897cc":"changeDeDeAddress(address)","1558ab7e":"sendEthBack(uint256)","1558ae4d":"Etheroll()","155949ca":"buyStores()","15598339":"GetPurchaseInfo(address)","155ac95f":"switchname(bytes32)","155bdaa0":"SEGFAULTCOIN()","155ce432":"Restitution_Historique_Transactions(address)","155dcb47":"ZJFTokenDeposit()","155dd5ee":"withdrawFunds(uint256)","155f0ebc":"dividends(bool)","155f1861":"claimBonusCard()","156014e8":"addAddressToPartnerWhiteList(address,uint256)","15613495":"earlyBackersWallet()","15613d9f":"chainIdValue()","15616d2b":"getCurrentResult()","1564d706":"lockIn()","15659dde":"getBidCount(bytes32)","1565b0b6":"PRICE_ICO4()","1565c3c8":"takeEther()","1565f12f":"createVote(bytes32,address,address,uint256,bool,string,string,uint256)","156773ca":"setAllStopper(address)","1567d7a7":"transferPromotionalShares(uint256,address,uint256)","1568a1a1":"vinciSold()","15691522":"AltSocialAccountPw(bytes32,bytes32,bytes32,bytes32)","15698812":"redeemExcluded(bytes32)","156a0528":"getBalancesPayer(uint256)","156a2f36":"bid(address,uint128)","156bf4c1":"getKtcAddress()","156c0ed4":"Scanetchain()","156c2e82":"withdrawGxTokens(address)","156c6baf":"isAllowCnsContract(address,bytes32,bytes32)","156cacc3":"Etheroneum()","156e29f6":"mint(address,uint256,uint256)","156e5039":"safeadd(uint256,uint256)","156e9507":"mineTotalBalance()","156f985c":"getFundsStatus()","157003d9":"tierCaps(uint256)","157024b3":"producerStatement(string)","15728a73":"GoBlockSupply()","1574126a":"preSaleEndBlock()","15748250":"freeze(address,address)","15752ac5":"bonusTokensAllocated()","15764334":"Hybrid()","15770d99":"disapprove(address)","15781c80":"checkPurchaseValid(address,uint256,uint256)","15786590":"lotteryTotalEarning()","1578a123":"Send_MediatedTransaction(address,uint256)","1579e5c5":"getAllCardAddressesOfOwner(address)","157a18b4":"ADMOToken()","157a68df":"createIssue(uint256,address,uint256[],address[],string)","157ad5a1":"canWithdrawBond(address,uint256)","157bbbf5":"winJackPot(address,string,uint256)","157cb62c":"getPlayerDnas(address)","157d5956":"isGetFreeZombiew(address)","157daf2e":"returnChange(uint256)","157db359":"airdroper()","157ddf8f":"bonusTotalSupply()","157e2063":"ASTBToken()","157f33f5":"coinIssuedTotal()","157f5610":"showGameEnd()","157f67e8":"withdraw_my_tokens()","157f8f51":"feePaid(int256,int256,int256,int256)","157fbd8d":"emitAccessBlocked(address,bytes32)","1580391c":"set(bool,string)","158048a0":"settlePut(uint256,uint256,address)","158059e2":"changeVotingRules(uint256,uint256)","1580beb7":"HOPEtoken()","158163c8":"setMerculetPrice(uint256)","15817881":"saleStageStartDates(uint256)","1581b600":"withdrawAddress()","15830662":"assignTokens(address[],uint256[])","1583deb2":"businessAddress()","15843245":"PeoplesToken()","158495df":"tokenIds(uint8)","15862aff":"lookupIndex(uint256,uint256)","158641f5":"getArtistId(bytes32)","158686b5":"change_admin(address)","15875f54":"getVestingEndTime(address)","158859f7":"disableTokenTrade(address)","1588ce09":"closeManualyMining()","158952da":"tipUser(bytes32)","15899670":"todaysBidTotal()","158a1184":"operation_amount(uint256)","158a4988":"distributeTokens(address,uint256)","158b8e54":"LastTokenId()","158be5a2":"WTF()","158d1fd4":"crowdsaleEndedSuccessfully()","158dec25":"maxSubmissions()","158e7986":"addBallotAndVoterWithPk(bytes32,bytes32)","158e7e53":"maxPreIcoAmount()","158ee887":"emergencySetOwner(address)","158ef412":"forceUpdateName(string)","158ef93e":"initialized()","158f7f5c":"reservedFounder()","15902a09":"removeOpenOrderFromBook(uint128)","159090bd":"take()","15910e5c":"logPurchaseViaToken(address,address,uint256,uint256,bytes32)","15915ddd":"directMintTokens(address,uint256)","15917977":"changeUniqueOwnership(string,uint256,address,address)","15919eed":"Arena()","1591bf51":"getPubKeyArr50(bytes32,uint256,uint256[])","1591dc6a":"BuyLoan(address,uint256,uint256)","159218d2":"setStagesManager(address)","1592aa2e":"registHns(string,address)","1592c087":"transferTusdProxyOwnership(address)","1593796e":"didReveal(bytes32,address)","1593a8c7":"endLottery()","1593ecb8":"LOG_IncreaseInvestment(uint256)","1594060a":"HalvingInfo()","15945790":"_supply()","15949ed7":"getPermissionParamsLength(address,address,bytes32)","1594afd1":"setExchangeRateShift(uint256)","1595f207":"TKT(address)","15969c4e":"minimumStageDuration()","1596b2bf":"getServiceFeeNumerator()","1596facb":"saleTime()","15977d45":"ledger(bytes32)","1597ee44":"encode(uint8[])","15980795":"freezeOf(uint8,uint8)","15981650":"setTicketPrice(uint256)","15983796":"getNextSnapshotBlock()","1598653d":"firstThousandUsers()","159887d1":"calculateFactor(uint256,uint256)","1598b2e0":"getSeatClaim(uint256)","15992cda":"uniq(uint16[])","1599a096":"mixStringAddressFunc(string,address)","159a3c33":"AWAXToken()","159a6475":"getFingerprint(uint256)","159ad680":"updateuser()","159b4e91":"sendTempTokens(address,uint256,uint256)","159bd2f3":"earnedFunds()","159c18bc":"removeWhitelistOperator(address)","159c2d9f":"BuyKeys(uint256,uint256)","159c60e8":"ZDMCoin()","159ce057":"getReturn()","159d3c24":"sellZone(uint256,uint256)","159d526f":"calcStateHash(bytes32[10],uint256[4])","159d8562":"ediv(uint256,uint256)","159da82d":"getInvitationValidPeriod()","159dbef7":"_0xDiaryToken()","159de07a":"FundariaBonusFund()","159e1e14":"EthereumPrivate()","159f82fc":"getEventResult(uint64)","159fb416":"transferCreditBotAddress()","15a03930":"TossMyCoin()","15a090c0":"getMiningWarRoundNumber()","15a0df43":"testThrowCreateNewRevisionNotOwner()","15a0ea6a":"claimFees(address)","15a269f7":"withdrawBalance(address,address)","15a29035":"getTask(bytes32)","15a2bd76":"allowOrRestrictMethod(bytes4,bool)","15a38bda":"isOldVersion()","15a3c611":"project_registry(uint256)","15a4806c":"EtherButton()","15a4d313":"NovaChain()","15a50aff":"getInvalidKeys()","15a51595":"TeamMembersAddress()","15a52302":"getService(address)","15a529b6":"getAllSalesByAddress(address)","15a55347":"reservedTokens()","15a5d9d8":"contractAddr()","15a60b76":"_calFrozenAccountCoin(address)","15a653a0":"numberOfSupportedTokens()","15a686f3":"PixelOperationsContract()","15a6a11c":"mintLeftOverZCOToWallet()","15a6a38d":"RedeemMTU(bool)","15a6f5c1":"setLatestTokenPayday(address,address,address,uint256)","15a75f9f":"playFor(address,bytes32)","15a9a145":"numRewardsAvailable(address)","15aaa09b":"PRECOE()","15aaefd5":"_transferPrimordialToken(address,address,uint256)","15ab250d":"setCresus(address)","15ab8302":"RoundASold()","15abc160":"createValidatedRequest(address[3],address,uint256[11],uint256,bytes)","15ac4c90":"setDayEthInLimit(uint256)","15ac534d":"closeBetting()","15aca0c4":"LogError(uint256)","15acce5e":"arpDeposited()","15ad1be3":"unrestrict(address)","15ae0629":"getHash(bytes,uint256)","15ae1972":"stageRate()","15aec1fb":"airdropadd()","15aec7ee":"BlockChainCourse()","15aee408":"FinaliseSale(address,address,uint256)","15af64e7":"JACToken()","15afa98e":"totalEth_()","15b02a4c":"totalICOable()","15b03fde":"getaddresstotal(uint256)","15b07f69":"nextCourse()","15b0821f":"mintDRSCoin(address,uint256)","15b21082":"requestCustodianChange(address)","15b23e47":"OncoToken()","15b2b1ae":"SaleStatus(string,uint256)","15b3433b":"dexjartoken()","15b37899":"setKyberNetworkAddress(address)","15b40ec0":"deployed(uint256)","15b4bc22":"getMinerHalving()","15b53beb":"TournamentOver()","15b556df":"getSellPriceAfterTax()","15b56b44":"checkReward(uint256[])","15b66fef":"calculateClaimableRewardTillRound(address,address,uint64)","15b73a1d":"ICOSupply()","15b7ab02":"setAgriChainProduction(address)","15b8003b":"buyChance(uint32,uint32,bytes32,uint256)","15b88b35":"PeaceToken(uint256,string,string)","15b9a8b8":"controllerCount()","15ba9ea2":"register(address,bytes32[5],address)","15bbc15d":"approveMP(address,int256,uint8)","15bc9441":"convertToDEF(uint256)","15bd73f1":"offerchangeprice(uint256,uint256)","15bd8bb2":"getTimestampByHash(string)","15bddfbe":"__setParameters(uint32,uint256,address)","15be2e7c":"totalSaleLimit()","15bef9cd":"changeMembers(address[],bool)","15bf2b51":"last10()","15bf430d":"Project()","15bf7cd7":"deployedPresaleContract()","15bf7ed2":"publicFundingPersonalEthLimit()","15c0251c":"getCoinWallet(bytes4)","15c12d4d":"totalWeiWon()","15c1c5b8":"EternaCoinContract()","15c2eed8":"RedlineFinancialLabCoin()","15c30006":"_payoutReferr(address,address)","15c32297":"setCanTrade(address,bool)","15c3cd94":"canTransferUST(bool,bool)","15c43aaf":"contractInfo()","15c560c7":"addTotalInvoiced(address,uint256,uint256)","15c5c950":"isProcessedTx(bytes32)","15c6b117":"CRPA()","15c6b40a":"cloneFeePercentage()","15c73afd":"resolveEmergency()","15c7ff34":"isPaidUntil(address)","15c8276d":"_supportsInterface(bytes4)","15c83cac":"getNewItemId(address,bytes32)","15c8d628":"normalBuyLimit()","15c91115":"pbkdf2(bytes,bytes,uint256)","15c98193":"getCampaignCreator()","15ca41c3":"notarizeHash(uint256,bytes32)","15ca65f0":"purchase(uint256,uint256,uint256,address,bytes)","15cab9c0":"pre_active_time()","15cb75e3":"replaceChiphash(uint256,bytes32)","15cbfdc1":"SpendingBlockedEvent(address)","15cce224":"setFeeToken(address)","15cd8e0b":"SECOND_PHASE_MAX_SPAN()","15ce09ad":"winningTimestamp()","15cec355":"_escrow(address,uint40)","15cf4a5f":"createElection(string)","15cf59b6":"getCreatefeeWindowIdValue()","15cf7a35":"fechVoteResultForCandidateBySnapshotBlock(address,uint256)","15cff546":"isOperationBlocked()","15d10f38":"decreaseICOcap(uint256)","15d28e11":"totalLendingAmount()","15d2fc8a":"setPreIcoEndsAt(uint256)","15d3b5d8":"getTotalAllocation()","15d3cfe2":"EtherCashPay()","15d3e0a3":"transferToSafe()","15d3f614":"Bet4Land()","15d42327":"testMulMod(uint256,uint256,uint256,uint256)","15d44202":"resultsValidationStep()","15d494c4":"test_chain2_1_increaseTimeBy5000()","15d4c5d5":"proposeMint(address,uint256)","15d4f2df":"_internalTransfer(address,address,uint256,uint256)","15d51761":"partner2_will()","15d5219f":"calLoanAmount()","15d53d7d":"_existPublicKey(address)","15d655c9":"claimPrice()","15d6af8f":"winnerList()","15d707af":"KD0Token()","15d7085f":"calcRankFundsFee(uint256)","15d7811e":"findYforX(uint256)","15d7b2c4":"setVestingManager(address)","15d7bf44":"register(bytes32,bytes32,address)","15d85401":"QbaseTalk()","15d87dc4":"vendorVerify(address)","15d887a7":"confirmedTotalToken(bytes32,uint256)","15d99a77":"CleanSweap()","15d9a9ee":"registerBarcode(bytes32,bytes32,string,bytes32,string,bytes32,bytes32)","15d9ad50":"illiquidBalance()","15d9aefd":"TeaToken()","15da0b02":"setCommunity(address)","15da42dc":"airdropSEEDSinWei(address[],uint256)","15da63a0":"thirdStagePriceOfTokenInWei()","15da65a5":"currentQuestionId()","15dacbea":"transferFrom(address,address,address,uint256)","15dae03e":"getType()","15dbfe28":"fromReal(int128)","15dc806e":"getStageBonus()","15ddf344":"getWhitelistStatus(address,bytes32,uint256,address)","15de4607":"getOwnFashions(address)","15de8027":"getAquaTokenAudCentsPrice()","15deaa3f":"INTARO()","15df1a09":"_fromToken(uint256,uint256,uint256)","15dff3b3":"RoleLookup()","15e04206":"Strings(string,string,uint8,uint256)","15e1146b":"deadlinePreIcoTwo()","15e1c65c":"added_to_the_bank()","15e28700":"addTokenPairWhitelist(address,address)","15e3187d":"amIBeneficiary(address)","15e33901":"digest(bytes,uint256)","15e3ab3a":"nccToken()","15e3d37d":"getAllCardsForClaim()","15e5ae1e":"Killer()","15e5c69e":"_purchase(address,uint256)","15e70102":"myTarif()","15e812ad":"getBaseFee()","15e82e87":"Free_vote_for_candidate_B()","15e839c1":"setHeroGenes(uint256,uint256)","15e9c2d4":"PainPoints()","15e9fc28":"setBets(uint256,bytes32[])","15ea426d":"hasUserWon(uint8,uint256,bytes32,bytes32)","15eaef6b":"tokenTransfer(address,address,uint256)","15eaf224":"getlastJadeProductionUpdate(address)","15ed6d06":"totalBondSupply()","15ed97c5":"_preValidateAssign(address,uint256)","15ee1255":"overrideCharPrice(uint256,uint256)","15ee3726":"createMesa(uint256,address)","15eec1b6":"setPayerString(string,string)","15ef29c3":"configureTokenParams(string,string,uint256)","15efc893":"confirmAdminTx()","15eff89b":"DiamondToken(string,string,uint8,uint256)","15f063f7":"totalStores()","15f06ede":"placeBuyOrders(uint256[],uint256[])","15f0c220":"marketingAllocation()","15f17902":"updateCeleb(uint256,string,uint256[6],uint256[6])","15f2226e":"removeAccessor(address,address,address,string,uint32,string,string,bytes32,bytes32,uint8)","15f28c5f":"walletB()","15f2e1bf":"getFunderCount(bytes32,string)","15f2e2f7":"LOCK_START_TIME()","15f2eb87":"getNumEndableGames()","15f2fe4f":"setDelegadoDeDistrito(bytes32,bytes32,uint8)","15f3161f":"issue(address,uint256,uint32,uint32)","15f3223c":"assertHash(bytes32,bytes32)","15f570dc":"burn(address,uint256,string)","15f59033":"setPropertyLastUpdaterLastUpdate(uint16,address,uint256)","15f5ea17":"stop_auction()","15f647fc":"setLoanProductActiveState(uint32,bool)","15f667ca":"phase2TokenSold()","15f73331":"invalidateName(string)","15f78c0c":"GetBank()","15f84d25":"isActiveContributor(address)","15f903a3":"setNameValue(uint256)","15f92e3b":"getBeat(uint256)","15fa168a":"setVerificationRate(uint64)","15fb1a65":"slashPower(address,uint256,bytes32)","15fb2185":"adminSetAdmin(address)","15fbba7a":"delPokemonFromMaster(address,uint256)","15fdf660":"mPerSellData()","15fe3b6c":"testTransferAfterFinalize()","15ff8f3c":"RESERVE_PORTION()","16002f4a":"totalAuctions()","16011bf1":"addReader(string,address)","1602a124":"allowMinting()","1602c424":"purchaseRect(uint256,uint256,uint256,uint256,uint256[])","160344e2":"startLottery()","16035ba0":"getTotalVolumeEth()","16038be8":"mintVestedTokens(address,uint256,uint64,uint64,uint64,bool,bool,address)","1603c521":"opensourceFundManager()","1604901b":"getGameByID(uint32)","1604c449":"numTilesClaimed()","1604f9ea":"requestPrice()","1604fa4d":"checkIfProjectExists(bytes32)","1605750d":"addToWhiteList(address,address)","1605782b":"sha1(bytes)","16059170":"onSubCanceled(uint256,address)","1605a889":"DecenterHackathon()","1605bc07":"SVDelegationV0101(address)","1605dd61":"getAddressBySymbol(string)","1606a1c9":"getAuditReportIPFS(address,bytes32)","1607dd9d":"distributeSpecial(address,uint256)","160849a7":"participateICONow(address,uint256)","1608e93f":"dice(uint256,uint16)","1608f18f":"disableTransfers(bool)","16090250":"getPolicyDetails(bytes4,address)","1609a397":"unhaltsTrades()","1609b182":"ReputationToken()","1609bbbf":"BarimCoin()","1609bdf2":"EEMWallet()","1609be1d":"sweepTokens(address,address)","1609e43b":"levelStartupTimestamp()","160a453e":"queryTokens()","160a7925":"getPermissions(address)","160abc9d":"tier1Rate()","160b01a1":"childTokenByIndex(uint256,address,uint256)","160b313d":"addAssociatedAddress(uint256,address,address)","160c5239":"read_total_global_purchased_today()","160d5240":"_toNanoNIL(uint256)","160d66ae":"voteToken()","160dc0ac":"buyItem(uint256,address,string,string,string)","160e3f3d":"grant(uint256)","160e915f":"canAcceptPayment()","160fc374":"cancelOrder(address[3],uint256[3],uint8,bytes32,bytes32)","160fe0e2":"getWtotalEth(uint8)","1610b59b":"infoFields(bytes32)","1610c734":"bonusLimit5()","16114acd":"recoverTokens(address)","161181ea":"getUserLengthOnToken(address)","1612ec4f":"applyToken(address)","1613520f":"priceTLP1()","1613ec9d":"getInitFunction()","161448df":"BossContract()","16145311":"ISAO()","161593a3":"landmarkToApproved(uint256)","1615d035":"airdropWallet5Pct()","1615e11d":"DARK()","16164467":"findRequiredSubscriberIndex(address)","16164b33":"icoTarget()","16164e15":"setInvestorData(address,uint256,uint256,uint256)","161666eb":"calculateAddress(uint8)","1616f54a":"FOURTH_TIER_SALE_START_TIME()","16173f39":"sin(int256)","1617adf7":"periodITO_softCapInUSD()","16180e8e":"reallocation(uint256)","16181a48":"insert(address,string)","16181bb7":"shortSellShares(bytes32,uint8,uint256,uint256)","16188c79":"isBadToken(address)","161895eb":"startBuy()","16192d2a":"accountInformation(address)","161965d9":"getRN()","1619fc14":"initOraclize()","161b5e46":"transferOwner(address,address,uint256)","161b75b2":"returnRemainingTokens()","161b9f5e":"ControllerManager()","161c389a":"NewImage(uint256)","161c8594":"setKpopArenaContractAddress(address,address)","161d2a59":"approveCertificate(bytes32,bytes32,bytes32,bool)","161dc300":"mintForSampleRegitry(address,uint32)","161fc5b3":"StartNewMiner(address)","161ff662":"proxyTransferFromWithReference(address,address,uint256,bytes32,string,address)","16201c24":"updateLastActive(address)","16205a7c":"RateDelivered(uint256,uint256,uint256)","162094c4":"setTokenURI(uint256,string)","16210e25":"verificationHoldersVerifierAddressMap(address)","16212265":"closeAirdrop()","16216f39":"return13()","16220188":"AddToWhiteList(address)","16222950":"golemFactory()","162255e1":"m_frozen()","1622dbe4":"buy(address,uint256,uint256,uint256)","16233f3f":"withdrawMortgageTokens(address)","1624288d":"balanceOfTokens()","16243356":"end_time()","16244907":"changeAnimal(uint256,uint256,bytes32,uint8)","1624f6c6":"initialize(string,string,uint8)","16260713":"isFrozenByAddress(address)","1626315c":"purchaseNew(uint256,string,string,uint256)","16265694":"validRateDurationInBlocks()","16265b4e":"isDatasetRegistred(address)","1626ba7e":"isValidSignature(bytes32,bytes)","16270f7d":"ownerIndexBit(address)","1627540c":"nominateNewOwner(address)","16277952":"userLoveLocks(address)","16279055":"isContract(address)","1627c3c1":"divForTeamEthContract()","1627d3f2":"createToken(string,string,address,address,uint8)","16281405":"buyXaddr(address,uint256,bytes32)","162856f5":"_emitOracleRemoved(bytes4,address)","162897c0":"sendUnsoldTokenToRewardSupply()","16291032":"setQualifiedPartner(address,uint256,uint256)","162927b6":"approve(uint256,address,uint256,uint256,address)","162a8e5f":"distributeTokensAfterIcoByOwner()","162bb373":"disableERC721()","162bc80c":"WithdrawTokens(uint256)","162bf1ee":"getBurnRequestAddressMap(uint256,string)","162cbefe":"AVAILABLE_AIRDROP_SUPPLY()","162d563d":"withdrawGNO()","162d7daf":"buyQST()","162dd6da":"takeEtherProfits()","162e2f6c":"reservationFromEthereum(address,uint256,uint256)","162e4fd0":"getFinalOutcomeByEntity(uint256)","16317946":"notifyTestimonial(address)","16317e7e":"setLiquidationThresholdPercent(uint256)","1631eb07":"unlockReward(address,uint256)","1632070c":"setRewardDivisor(uint256)","1632612a":"TrustEURO()","16328378":"precrowdsale(address)","16330c55":"setRafEnd(uint256)","163317c6":"fundAdvisor()","16339604":"_FIVETHOUSAND()","1635717c":"getInstruments()","1635e13c":"initBuilding(uint256,uint256,uint256,uint256,uint256,uint256)","16367c63":"earlyParticipantWhitelist()","163687ab":"defaultOperatorsByTranche(bytes32)","1636ed74":"gatewayOpened()","163740d1":"HieToken()","16381382":"getBetUint(int8,int8)","1638e70d":"DIETSweets()","1638f628":"calculatePayout(uint256,int256)","163935a8":"BlokTokenSale(address,uint256)","163aa00d":"lastRewardEthBlockNumber()","163aa631":"isIssued(bytes32)","163aba3c":"getQueryFee()","163c0351":"reserveTeam(uint256)","163c17b1":"goldFreeze(address,uint256,uint256)","163c4e3c":"CryptoGripInitiative(uint256,uint256,uint256,address)","163db71b":"totalDistributions()","163dba92":"setBlocks(uint256)","163ebd3a":"MainExchangeNM()","163ef5cb":"tgrSettingsPartProject()","163f6691":"getAttribute(address,bytes32)","163f7522":"isUserRegistered(address)","163f9b4f":"withdrawalOwner()","163fa64a":"setSkillPointCost(uint256)","163fa8af":"addInvestmentPackage(string,uint256)","164116f8":"_getPrice(uint256)","16413515":"tokenIdToData(uint256)","16419aa7":"slice16(bytes,uint256)","1641bced":"jackPotGameLockedToken(address,uint256)","1642fcca":"SZ(uint256,string,string,uint8)","16431c5b":"CreateANM(address,uint256)","16443801":"Zigilua()","16448c99":"allocateTokens(address,address,uint256)","1644b20b":"Bhinnekamint(address,uint256,uint256)","1644ed01":"isVolumeReached()","16450092":"totalCap()","16458d74":"show_Candidate_Victorious_in_Election()","1645f0cb":"_mintIdentityToken(address,address)","16468fe2":"mintEndYear()","164745c5":"presaleendTime()","1648371d":"bboBalance()","1648be60":"lockSupplierAndLockPosition(address,address)","1648f38e":"createExchange(address)","16496a15":"onceAddTime()","1649b76d":"maxDexSize()","1649cdcd":"testGetItemStore()","1649d72b":"proposeNewNotary(address)","164a009e":"WHITELISTING_DURATION()","164ba24b":"Payments()","164c9bf0":"Trust()","164ce703":"useless(uint256)","164ceb70":"getTradeByReferenceCode(bytes32)","164d3f3a":"Redeem(string,string,address)","164e68de":"withdrawFees(address)","164f81c3":"confirmAddress(address)","164fa4ef":"withdraw_token(uint256)","1650533f":"distroyIssuerToken(uint256)","16511a67":"removeHodler(address)","16512624":"setAgonValues(uint256[5])","16514052":"setPropertyDAppContract(address,bool)","1651f29a":"redeemForAllFeeWindows()","16521a2b":"getGameJackpot(uint256)","1652a9d3":"StartPeriod(uint256,uint256,uint256)","1652b365":"Xenith()","1652e7b7":"getAssetData(address)","16534bfc":"SKRToken()","16537a85":"makeschoolToken()","1654474b":"submitSellOrderWithPosition(bytes32,uint256,uint256,uint64,bool)","16552393":"creatorAddr()","1655a451":"PotPayout()","1656df0a":"_5_avto(uint256)","1658d496":"TamasCoin()","16597742":"announceWinner(uint8)","1659aecc":"timeoutYEnabled()","165a0e03":"channelsLimit()","165b22c1":"claimNxc()","165b2644":"getDepositN(address,address,uint256)","165b9ad0":"MOMO_FOUNDATION_WALLET()","165c4a16":"multiply(uint256,uint256)","165c86df":"rewardsWithdrawalRecipient()","165ca484":"USDDigital()","165cfea3":"TheImmortals()","165db404":"AdvisorsAndPartnersMinted(address,address,uint256,uint256)","165e2eea":"setFund(address,string)","165f7d38":"buyIntoSyndicate()","165ffd10":"restart(bytes32,bytes32)","16603758":"setUserCategory(address,uint256)","16618e61":"ICOweek3End()","16628014":"setBitcoinRate(uint256)","1662da6a":"setWhitelisterAddress(address)","1663f4ee":"SplitEqual(uint256)","166428c0":"PoolSubmitted(address,uint256)","16643430":"setRateEarlyStage4(uint256)","1664b9cf":"create(uint8,uint8,uint64,uint64,uint64)","16654268":"getName(address,address)","1665e6b3":"approveOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes,bool)","1666b514":"RipeXToken()","16670bcd":"resolveDispute(uint256,uint256,uint256,uint256)","16671990":"minCapMain()","166728cb":"feesend()","1667504e":"updateTitleTransfer(string,string,string)","1667590d":"GenesisRewardPerBlock(address,address)","1667d763":"changeRegulatorStatus(uint8)","16685890":"huntingPrice()","1668603f":"PFXTestCoin()","16687369":"chargeProtocolFee(address,address,uint256)","16691869":"addClient(address,address)","16694dd9":"isReportingActive()","166a3952":"createVoter(address)","166bf1b0":"createC1(uint256)","166c4b85":"len(bytes32)","166d3bbf":"payOutJob(address,bytes32)","166d561a":"FatPeople()","166d91fd":"FOUNDATION_RESERVE()","166dc43e":"setManagementProxy(uint32,int256,address)","166e55d9":"computeStablecoinFee(uint256,address)","166eb4cb":"Put(bytes32,uint256)","166ee1de":"newIdentityL1(address,bytes32,bytes32,bytes32,bytes32,uint256)","16706514":"MyDice75()","16708bc6":"metadataSize()","1670cb6f":"oracleA()","1671055d":"etherollBeneficiaryAmount()","16713b37":"receivedTotal()","1671719d":"MINIMUM_LOCK_AMOUNT()","16730131":"addHpbNodeWithString(address,string,string)","16735925":"setAllowErc20OwnerClaim(bool)","1673f758":"FundTransfer(address,uint256,bool,uint256)","1674bade":"setMinDuration(uint256)","16754c55":"createArea()","1675f455":"tokenUri(uint256)","1676503e":"updateParameters(address,uint256,uint256,uint256,uint256,uint256)","16772492":"HngCoinSale(uint256,string,string)","16772b6a":"SentPrizeToWinner(address,uint256,uint256,uint256,uint256,uint256)","1677496d":"withdrawART(uint256)","16783ba7":"assertEq18(bytes18,bytes18,bytes32)","16786ae2":"createMineral(bytes32,uint256)","1679657a":"isTrustedBy(uint256,address)","167aee44":"rewardPoolShare(uint256,bool)","167d219e":"ROLEX()","167d3e9c":"SetOwner(address)","167ddf6e":"getArtwork(uint256)","167e7921":"setTotumAllocation(address)","167f66c0":"startOfDay(uint256)","167ff46f":"openSale()","16801d17":"getBattle(string)","1680a070":"setPlotDataMultiple(uint256[],string,string,string,string)","1680f70d":"transferlottery(address,uint256,bytes)","168110f3":"Tokens_For_Sale()","16812d5b":"retreiveFinalResult()","16815137":"Poge(uint256,string,string)","168179e2":"ESCBCoin(address)","16821349":"ETH_RECEIVED_MIN()","16829de5":"changeEthPrice(uint256)","1682fa59":"GetMaximumBet_Ether()","16831877":"BMICOAffiliateProgramm()","16842582":"createLottery(string)","1684844b":"registerNameXaddr(string,bool)","1684c715":"TaskCompletedEvent(uint256)","168656e1":"OwnerWithdrewERC20Token(address,uint256)","16868752":"buyTicketWithRef(address)","16870257":"getTileDescription(uint8,uint8)","16876976":"addrTeam()","16878b07":"activeVerifiers()","16879344":"commitPeriodActive(bytes32)","1687f112":"left54(uint256)","168936a0":"Remain()","1689eb38":"batchSendTokens(address[],uint256[])","168a80d3":"deleteAllTopics()","168b3c69":"CertificationDeleted(string,address,uint256)","168b4a53":"changeColorBlack()","168b6231":"getCoinIds()","168b912d":"numOfDeclaredPublicOfferingPlans()","168bb279":"insertAllowedTokenInternal(address)","168c8120":"COMMISSION_DIV()","168cd7ae":"tokenQuota()","168d71e5":"mediaTokensSymbol(address)","168e41e8":"getHash(bytes32,uint256)","168ecec5":"revokeOperatorByPartition(bytes32,address)","168f3260":"calculateMinPriceForNextRound(uint256,uint256)","168f788e":"reRollMove(uint256,uint256,uint256)","168fb79d":"RANGESTART_7()","16907c12":"updatePlanetLiason(uint256,uint256,uint256,string)","1691473c":"getProducts(address)","16915743":"proofLink()","16925ee2":"changeTradingEnabled(bool)","1692823d":"getViewDatasCount()","16928a44":"updateProjectDescription(string,bytes32)","16937d56":"addressMoneyBalance()","1693b85d":"allowDelegate()","16948e9b":"changeSettings(uint256,uint256,uint256,uint256,uint256)","169509b6":"getOraclizedIndices()","1695533d":"signLease(string,string)","16958c79":"registerBid(int256,int256,int256)","1695d97c":"removeRange(uint256)","16962849":"changeBalanceReplenishmentStorage(address)","16962bc1":"setAllocationClosed(uint256)","16962d7f":"_createKittyToken(address,uint256,uint32)","16963872":"tokenPriceInitial()","16967407":"getAdministrator()","1697283a":"getRequesterLock()","169742f6":"ebyteBalance()","16985349":"standardGrowthRate()","1698755f":"claimToken(address,uint256)","1698933d":"myStrongHand()","1698c7ff":"removeOrc(address)","16993811":"ptxHead()","16996713":"WXGToken()","169a7c3a":"eventWebsite()","169b15fa":"TechZU()","169b9890":"signByGroom()","169bd52d":"MyTestToken(uint256,string,uint8,string)","169bf233":"reportDoubleSpend(bytes32[],bytes32[])","169c13ed":"pendingTransaction(address)","169d16f4":"authorizerTwo()","169dc72c":"MBEToken(address,address,address)","169e18d9":"currentHitTotal()","169e2633":"tokenOwnerAdd(address)","169ea2f8":"dropCoins(address[],uint256)","169f66df":"monetarySupervisor()","169fab66":"TIXToken(address)","169ff375":"RANGEEND_2()","16a0390b":"BountyAmount()","16a0ea3c":"totalLockedSupply()","16a11ae5":"testFailPullWithoutTrust()","16a124e8":"setKeys(uint32,int256,bytes32,bytes32,uint32)","16a25cbd":"ttl(bytes32)","16a27019":"allowedAddr()","16a2a0cc":"setBountyFactory(address)","16a3feca":"_canOperate(address)","16a50228":"minLimitPublicFirstSale()","16a5290c":"purchaseWeapons(uint256,uint256,uint256,uint256)","16a54085":"setSideBetPercentage(uint256)","16a5410c":"Joined(address,uint256,uint256)","16a558d0":"_generateRandomhashNumber(uint256)","16a69a9a":"getDiscountStage()","16a7859b":"listService(uint32,string,uint256,uint256,address,address)","16a8e046":"setLuckThreshold(uint256)","16a92f39":"getDocByIndex(string,uint256)","16aa8508":"_leftSupply()","16aab1bf":"fundingEndTimestamp()","16aabcbd":"onlyAdvisorsCanDoThis()","16ab2b03":"getBid(address,uint256)","16ab4b17":"checkPoolsEnd()","16abdf7d":"setB(uint8)","16ad42ad":"holderList(uint256)","16ada547":"time()","16ae10f5":"USD_SOFT_CAP()","16ae4ec4":"FT_OPERATIONAL_FUND()","16ae5607":"KakToken(address,uint256)","16ae7944":"UpdateRateAgent(address,address)","16aee925":"saleDuringRestrictedPeriod()","16af001c":"calcBonusAt(uint256)","16af87a9":"getSavedReferral(address)","16afdf8e":"release(address,address,uint256,uint256)","16afe218":"setarg_1(uint256)","16b07323":"winsReported()","16b08755":"minorEditsAddr()","16b0c11e":"upgradePrefixPreSignedSecond(uint8,bytes)","16b0cc2d":"Extend(uint256,uint256)","16b0dc06":"getCitizenLevel(address,address)","16b0fc55":"removeAdmin(address,string)","16b14e19":"SingularityTest34()","16b15135":"getEscrowCount()","16b1f6b3":"CROWDSALE_PHASE_1_START()","16b208eb":"_clearApprovalAndTransfer(address,address,uint256)","16b21dfb":"getLockAccount(address)","16b2cd34":"airdroptotal()","16b3299d":"printListOfBooks()","16b33e74":"shuffleNDecks(uint256)","16b3d4ae":"_approved(address,uint256)","16b40451":"changeRandao(address)","16b4e79c":"setCampaignPriceById(bytes32,uint256)","16b57509":"killBounty(uint256)","16b60f2c":"mintMAYToken(address,uint256)","16b64898":"GEN0_TOTAL_COUNT()","16b65fac":"BITXOXO()","16b66016":"tier1Timestamp()","16b6824c":"CryptoWarriorCore()","16b6c75b":"changePeriods(uint256,uint256,uint256,uint256,uint256)","16b6c7bd":"withdrawUnallocatedRestrictedToken(uint256,bytes32)","16b78191":"decrementValue()","16b7d8f2":"VIP_MINIMUM()","16b86ed8":"amountOfMeatInUnicorn()","16b87739":"setCrowdsaleActive(bool)","16b8aa6b":"secondStageDatetime()","16b96f05":"addTotalDividendPoints(uint256)","16ba7197":"WITHDRAW()","16baa937":"AddMinter(address)","16bac350":"overthrow(string)","16bac7e5":"lockBet()","16bb1f6a":"isOriginalRoundContributor()","16bb6c13":"setBaseToken(address)","16bdb7b6":"stage3_price()","16bf3537":"SocialMediaIncomeCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address)","16bf4657":"getNumPayments()","16bfe25c":"emergencyRefund()","16c05aa2":"depositMoney()","16c0acde":"CryptoStars()","16c12746":"getAllOwners()","16c19739":"getPosition(address)","16c1df06":"WorkerPool(address,string,uint256,uint256,uint256,address)","16c24739":"uintInArray(uint256,int256,uint256[],uint256)","16c27c4a":"UNITSimplePaymentGateway(address)","16c3002e":"allowanceForContract(address)","16c38b3c":"setPaused(bool)","16c393a6":"oraclizeBytes()","16c45c7a":"areStringsEqual(bytes32,bytes32)","16c4fcbb":"gotransfer(uint256)","16c519ee":"hasRecentPrices(address[])","16c5792d":"transferCurator(address)","16c6ec92":"ChangeTarget(bytes32,address)","16c6f470":"addNewRaz(uint256,uint256,uint256,uint256)","16c72721":"forked()","16c72861":"nextFrontWindowAdjustmentRatio()","16c7f79f":"testTransferTokenAllowanceAndReturnFunds()","16c85710":"buyMasternode()","16c9b08d":"WenWanCoin()","16ca3b63":"increaseApproval(address,uint256,bytes)","16cac8c7":"Why(string)","16cb9100":"ETHER_MIN_CONTRIB()","16cb9a01":"assertFalse(bool,bytes)","16cba9d3":"checkEtherBalance()","16cbf987":"changeMemberGroup(uint256,string)","16cc7699":"getHistoryRecord(uint256)","16cc9022":"_newWallet(address)","16cd84c1":"AltCrowdsalePhaseOne(address,address,address,address)","16cdf170":"CoinTransfer(address,address,uint256)","16ce8a69":"setBuilding(uint256,uint256)","16ce8c98":"changeBiteCost(uint256)","16ceaa95":"getStageCount()","16cf1651":"setArbiters(address,address[])","16cf8f77":"createDroid(uint256)","16cff09c":"ETHER_MAX_CONTRIB_PRIVATE()","16cff511":"setFunctionFivePrice(uint256)","16d05042":"finalLoser()","16d061a5":"gettime()","16d0ba10":"putOwner(bytes32,uint256,address,bool,string)","16d190e3":"maxWin()","16d2bc5c":"getPlayerRoundInfoByID(uint256,uint256)","16d390bf":"addOwner(address,address)","16d3aa92":"removeTransferRate(address[])","16d41a5a":"setNFTContractInfo(string,string,string)","16d45615":"test_0_ensureDefaultRulesSetToFalse()","16d4c77c":"removeBlockeddUser(address)","16d4db19":"teamCompanyLock()","16d544f1":"resetActive()","16d63f17":"simFirstObligation(bytes)","16d64127":"_setReserveHolders()","16d6be4c":"buyOfferedStakes(address,address)","16d873cf":"TransferOddEther(address,uint256)","16d8b5a2":"ferromContract(uint256,string)","16d8f16c":"updateTentativeWinningPayoutDistributionHash(bytes32)","16d9356f":"oraclize_query(string,string[4])","16d93f3d":"getAddressAnswerKeccak256(uint256)","16d960b5":"createThing(bytes32[],bytes32[],uint88)","16d99cb0":"NewContribution(address,uint256,uint256)","16da1d50":"transferdissolvedFrom(address,address,uint256)","16da7d91":"reorganize(uint256,address)","16dabbf6":"getWalletSetting()","16db5172":"getStaker(bytes32,address)","16dc9704":"numberOfVestedContracts()","16dd68b1":"getFirstAuctionsEndDate()","16ddcef5":"WillCoin()","16de035a":"EtherBB()","16dfae3c":"setGenaroDevMultisig(address)","16e02e2a":"inventoryLocked()","16e10d6a":"ICOInvestorsAmount()","16e1286d":"BEXToken()","16e17852":"TAO()","16e1aed4":"setPartitionControllers(bytes32,address[])","16e242ca":"burnTotalSupply(uint256)","16e27349":"getFeeRecipient(int256,int256)","16e32d82":"_burnPlayerTokensFrom(address,uint256)","16e33aa2":"getData_27()","16e3cad0":"HAYATO_MAX_CARGO()","16e3cfc7":"testStoresUser()","16e457f0":"sellAll()","16e4822b":"calculateEarning(address,bytes32,uint256,uint256,uint256,uint256,address,address,bool)","16e4f677":"UpdateICOAddress(address)","16e55626":"getDogName(address)","16e58a1b":"detach(uint32,uint32)","16e7371f":"LiquidDemocracyController(address,address,address,uint256,uint256,uint256,uint256,uint256)","16e74f09":"getWinner(uint256[])","16e7c80d":"getTierStartAndEndDates(address,bytes32,uint256)","16e807c4":"addBid(address,uint256,uint256)","16e82dcf":"MMaker()","16e85b2e":"scapeHatch()","16e8f2c4":"Rectangle(address,address)","16e93702":"addTeam(bytes32,bytes32,address,bytes32)","16e9fe81":"resetValue()","16ea0728":"totalBuriedValue()","16eb6603":"right50(uint256)","16ebd6d5":"devResWithdrawal()","16ebf77d":"revealConsensus(address,bytes32)","16ecc686":"setup(address,address,uint256,uint256)","16ece9db":"GetContributionInfo(uint16,uint16)","16ed2ae4":"ONE_TOKENS()","16ed36fb":"EscapeHatch()","16ee94bf":"giveArraywords(string)","16eea70f":"RaffleResult(uint256,uint256,address)","16eebd1e":"launcher()","16ef376b":"getPhase(uint256)","16eff85d":"sendRefund(address,uint256,uint256,uint256)","16f0115b":"pool()","16f0e221":"configTimeMax()","16f25d16":"LindaCrowdsale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,uint64,uint64)","16f33fc2":"getLockupCell(address)","16f36d74":"withdrawEtherHomeLocal(address)","16f38b63":"heroAsset()","16f3cb5e":"__kill()","16f4acf8":"changeHolder(uint256,address)","16f4d022":"tier()","16f573e6":"addtoblacklist(address)","16f60f5f":"SPIKE()","16f898fe":"LogCompanyTokensTransferred(address,uint256)","16f8e09b":"privateSaleEtherCap()","16f9ce49":"_slotCommitNew(address)","16fa2f7f":"getUsernameByAddress(address,address)","16fa99be":"totalSuplay()","16fc1a0b":"FaFengToken()","16fc1e64":"resetCreateShareToken()","16fc68cb":"PrivateSaleBuy(address)","16fcdb84":"minBuyPrice()","16fd381a":"settleBet(uint256)","16fd48a1":"ThreesigWallet()","16fd9869":"DepositProjectProfit()","16fed3e2":"receiverAddress()","16fef995":"sundown()","16ff1c76":"appreciateTokenPrice()","16ff5b87":"getNumProjects()","17011011":"BookERC20EthV1()","17019fb4":"givePoint(uint32,int256,address,bool)","1701feaa":"GobizToken()","1702ef0c":"getProposalOrganization(bytes32)","17031f9c":"advisersPeriodLength()","170381fe":"setIcoContractAddress(address)","17038cb2":"partialForwardFunds(uint256)","1703a018":"quorum()","1703b7fd":"eth4DivsOwing(address)","1703c11a":"setFundManagementContract(address)","17040713":"WithdrawRequest(address,uint256)","1704c271":"getShipCount()","170594c6":"totalTeamSupply()","1705a3bd":"migration()","17075992":"lastThreads(uint256)","1707e05a":"loanRequested(bytes32[8],bytes,bool,uint256)","17089563":"rand(uint256,int256,int256)","1708a723":"setRootAddress(address,address)","1708d725":"unregisterFromPool(address)","1708f617":"gasPriceForOraclize()","170ab405":"setSize(uint256)","170ad53c":"totalUnclaimedTokens()","170b0782":"setSystemAddress(address,address)","170b99d9":"trivial()","170bdb36":"inPermissions(address)","170c28a2":"burnlvlToken(address,uint256)","170e1dcb":"bountyVault()","170e2070":"unfreezeAccounts(address[])","170e6d4c":"getLuckynumber()","170eb245":"secondTeamWithdrawal()","170eeb0f":"investmentRefunded(address)","170ff3e1":"addExtension(address)","171060ec":"setLocker(address)","17111edb":"DevvotePrefundClosed()","1712193f":"_requireERC721(address)","17124ed9":"LogCratePurchase(address,uint256,uint32)","1712649b":"rlc_reserve()","17126586":"getOwnerPercentage(address)","1712a72f":"ProofPresaleToken()","1712c489":"setDates(uint256,uint256,uint256)","17135b7b":"transferTokents(address,uint256)","17140bcf":"isSecond(bytes32,uint8)","17154004":"checkIfRefundAvailable(bytes32)","17155659":"createBadge(string,string,string)","17158228":"signupUserWhitelist(address[],uint256)","1716b7f0":"longTermBudgetAllocation()","1716f47e":"getCurrAmount()","171755b1":"getQuote()","1717bb12":"VoxelPlaced(address,uint8,uint8,uint8,uint8)","17183ca3":"maxCallFrequency()","17186ca3":"GetLastBetUser(address)","17191704":"refundToken(uint256)","17193854":"SetAngelCardDataContact(address)","1719b727":"_getTokenAmount(uint256,uint256)","1719d726":"stopBallot()","171c0077":"compare(uint8,uint256)","171d833c":"test_twoValidEqAddress()","171d9243":"TokenOfEightSilver()","171da314":"showPendingAdmin()","171dde3f":"devsTokens()","171dfb4f":"target_hit()","171ef0b2":"exchange_rate()","171efc3f":"refreshWaitPairBetIDsByCancelBet(uint256)","171fc143":"controllerLocked()","171fcb5a":"revealNumber(address)","17203e1d":"makeProfit()","1720684a":"whitelistBonusClosingTime()","1720ce1f":"addTxToRegistry(bytes32,uint256,uint256,uint256)","1721117b":"UpgradeabilityProxy()","17214a8a":"GenesisInitialSupply(address)","17216484":"genericSender()","17219f03":"Ehfirst()","1721ebba":"mokenNameExists(string)","1722a8b0":"rateAngelDayEnd()","172325c7":"refundDuration()","17235779":"Tutorial()","1723934d":"setAvailableSupply(uint256)","17241962":"Zerk()","172419a8":"getCapByStage(uint256)","1724cf8a":"isCARegistered(address)","17255086":"blackjack(uint256,uint256)","1725b847":"voteAgree()","1725d8aa":"getOwnedShipAtIndex(address,uint256)","1726cbc8":"releasableAmount(address)","1726d2c5":"getRefPercents(uint256)","172727c0":"lastCheckBlockNo()","17274abd":"setBtcTokenBoughtAddress(address,address)","172775ef":"generateOrderWithPayeeByAdmin(address,address,address,uint256,string,string,string)","172820de":"KaliToken()","1728ac68":"SPTOKEN()","1728dd43":"GameFinished(address)","1728fb46":"ROLE_LOCKUP()","172960d4":"LogWhitelistAdd(address)","17299c04":"setDisputeFee(uint256)","172a735c":"updateDocumentPoll(bytes32)","172a9438":"ArsenalvsManCity()","172ab60c":"getPositionFromHolding(uint256)","172ac1ea":"isInvoice(bytes32)","172b319d":"GOOLA_UNIT()","172b95e1":"get_transaction_by_row(uint256)","172c61e6":"totalAdoptedAxies(uint8,bool)","172c9a0e":"inspire(address,uint256)","172cf717":"left55(uint256)","172d8a30":"setDirectorLock(uint256,uint256)","172e0456":"set_property_contact(uint256,string,string,string)","172e1e52":"priceView()","173029d7":"derivePayoutDistributionHash(uint256[])","173067a3":"priceStart()","1730e216":"setStartLockPeriod(uint256)","17324249":"playNumber(uint256[])","17324543":"nationalitiesOf(address)","1733043f":"getAllChildIds(bytes32)","1733cbb5":"ConfirmationNeeded(bytes32,address,uint256,address,bytes)","1733fea0":"SKYST()","17342859":"batchSetApprovalForAll(address[],bool)","17342d36":"init(address,address[],uint256[],address,string)","17349ad5":"TokenDecimals(uint256)","17356c22":"getVirusLength()","17367bc8":"VDN(uint256,string,uint8,string)","173817b6":"checkSellerOffer(address)","173825d9":"removeOwner(address)","1738c3ff":"removeVendorById(uint256)","17393f04":"PURCHASE_DIVIDER()","173975aa":"SetENGCommunityAddress(address,address)","173a0615":"Dealer()","173a21f8":"changeWethContract(address)","173a2b5c":"proposalAmount()","173a48a4":"distributeFUDD(address[],uint256,uint256)","173a4b70":"newProposal(address,uint256,bytes32,string)","173a705f":"transmitStatus()","173c9d27":"batchTransferForDifferentValues(address[],uint256[])","173cb7de":"getNumReleasesForNameHash(bytes32)","173d2795":"train1(uint256)","173d6ca2":"tier1Reached()","173dbd4e":"GoCryptobotCoinCore()","173dc741":"addBonusToUser(address,uint256,uint256,uint256)","173e49b7":"BoomstarterToken(address[],uint256)","173ea238":"changeBtcOracle(address)","173ea341":"isPrivilegeAddress(address)","173f22f0":"rmin(uint128,uint128)","173fc012":"preSignedCheck(bytes8,address,address,uint256,uint256,uint256,uint8,bytes)","173febeb":"Send69Wei()","1740b479":"gameManagerSecondary()","1741526f":"getContractPayout()","17415d50":"_deleteRequest(address,address)","17421c8c":"withdrawAmountToken(address,uint256)","17431634":"LevelUp(uint256,uint32)","17436b1e":"RoundOpen(uint256,uint256,uint256)","1744215a":"EIP20()","1744cfe4":"GetLoansLenght(bool)","1744d5a5":"StageBonusUpdated(uint256,uint256)","17453358":"date01Oct2018()","1745422c":"addTx(address,uint256,string)","174609f8":"UNC()","17462891":"proofOfShit()","1746bd1b":"getGameInfo()","17473975":"breakDurationBetweenPresaleAndICO()","1747af0d":"AdminOwnershipTransferred(address,address)","1747b48b":"Reveal(uint256)","1747dfd4":"ContractPlay()","17484b0c":"RSOC()","17490da8":"modifyTrialDeadline(uint256)","1749bdf1":"getClassRank(uint32)","1749c16f":"isEnded(uint16)","1749e462":"getOwnersTokenList(address)","174a6277":"getTxDataBlockNumber(address,bytes32)","174a84d8":"BetComplete(bool,uint256,uint256,uint256,address)","174b0093":"createDefaultGen0Zodiac(uint256,address,uint256,uint256,uint256)","174b9fa4":"getCurrentDayDepositLimit()","174c2002":"burnAndDist()","174cd9b3":"lastBlock_a19()","174dcea8":"getBalanceAndHolderByIndex(uint256,address)","174e7d55":"isReadyToAction(uint256)","174efd12":"minBidValue()","174f51eb":"winOdd()","174fa48e":"distributeBTCG(uint256,address[])","1750f564":"newProposal(bytes32,address,uint256,uint8,uint256,bytes)","1751dc90":"createMultiplePhoenixes(uint256[],uint256[],uint256[])","175207b7":"_readBlockBeneficiary(uint256,bytes)","17528c7f":"ReceiverAddressSet(address)","175323a8":"contributeETH()","1753a655":"singBy(address)","1753d61c":"AirdropToken()","175466ee":"proofVerifyFailed()","17548962":"SPTI()","17549ff0":"lovelock_price_LOV()","1754bd8e":"minerState(uint256)","1754de57":"sendleftmoney(address,uint256)","1755ff21":"poolAddress()","1756ffd9":"addMonsterClassBasic(uint32,uint8,uint256,uint256,uint8,uint8,uint8,uint8,uint8,uint8)","1758078b":"trader()","175892b4":"previligedSubApproval(address,address,uint256)","17597b0f":"getLockedAmount_contributors(address)","175a0061":"install()","175a8bf4":"MigrationAgent(address)","175b0284":"closeChannel(uint256)","175b859d":"Bitwincoins(uint256,string,string)","175baaf1":"accrual(uint256,address)","175beead":"advisoryTokens()","175c6709":"TransferStatus(address,bool)","175c8640":"ZEEX()","175c9885":"POSSCOIN()","175d27e0":"MONTH_IN_SEC()","175ebfc7":"AdoptionOffered(bytes5,uint256,address)","175f6d9c":"JustAnIndex1()","17602ddf":"isFlowerAuction()","1760705f":"setAssetContract(address)","1761af6d":"upgrade(address,address,address,address,address)","1761eab4":"buyLong(address[2],uint256[5],uint8,bytes32[3])","17623c41":"isAllowedToParticipateNow()","17623e5b":"unauthorizeManager(address)","17634514":"creationBlock()","17634ec8":"freezeAccounts(address,bool)","176416ed":"getVotesBetween(uint256,uint256,uint256)","1764250a":"verifyWithdrawSignatures(uint256,address,address,uint256,bytes,bytes)","17645315":"migrate_participant(address)","1764dc3d":"GiveTokenPerm(address,address,bytes32)","17653b6e":"setChainRoot(address)","17655f6c":"transferOtherERC20Assets(address,uint256)","17659a1d":"Undelegate(address,uint256)","1766f424":"unsoldAllocationDelay()","17671962":"calcTotalWinnerKeys(uint256)","17674544":"deleteEntry(string)","17676e4c":"valueSet(string,bytes)","1767da08":"addBalanceForOraclize()","176854f6":"setLastJadeSaveTime(address)","176898c9":"setRefundStatus(bool)","1768b436":"ETCSurvey()","1768fd6f":"getMaxLockAmountAllowedByLtd()","1769511c":"fidaTokenAddress()","1769af29":"removeFromOwnerlist(address)","1769f049":"fee_balance()","176b0eac":"gcStartTime()","176b63f4":"seedSourceA()","176b6742":"EtherFlip()","176b866f":"alterBankBalance(address,uint256,bool)","176cd40a":"PUBLIC_OFFER_SUPPLY()","176d0780":"createMicroWallet(uint256,uint256)","176e5f32":"withDrawMoney()","17700f01":"disableTrading()","17701ee6":"mission()","1770616c":"tier3LOT()","17711a46":"setTokenTimelockFactory(address)","1771b7dc":"bids_burned_count()","1771d4d4":"setAliasPrice(uint256)","1771ece6":"updateHouseFee(uint8)","17727a00":"withdrawCapital()","1773234b":"kscBatchBurnWhenUseInSidechain(address[],uint256[],string)","17733eac":"yank(address[],address[])","177378f0":"testRegularBuy()","17738cef":"placeEMONTBid(address,uint8,uint256)","177413da":"bet(bytes32)","1774218e":"CRAToken(address)","17743338":"MakeClaim(address)","17749a16":"adminRefund(address,address)","1774df3e":"distributeMAGGIE(address[],uint256,uint256)","1774e646":"setUint8(uint8)","1774f6c6":"confirmPurchase(uint256,address,address)","17753c44":"DIGTREX()","17759493":"TotalPoSRequests()","1776683e":"payDev(address)","1776b437":"countInvestorsRefundedInCrowdsale()","177766e6":"getOptionChain(uint256)","17776b86":"ExhibitToken()","1778f1df":"ICOStartDate()","177a9e9d":"refundFor(uint256)","177b3010":"registerProject(string,string)","177b979e":"initiatecontract()","177bd86e":"syncSubscriptions(address[],string[],uint256[])","177c75ae":"offerIndexedPieceForSale(uint256,uint256)","177cf218":"UNIX_DAY()","177cfaa2":"teamTwoShares()","177d8ee4":"emitSkillsSet(address,uint256,uint256,uint256)","177dc9e5":"getCompte_15()","177dcde9":"_transferTokens(address,uint256)","177e0f71":"setLockedWalletReleased(address,bool)","177e6ae4":"ETHERFLEXCrowdsale(address,address)","177ea52d":"buyTokensSigned(address,bytes,uint256,uint8,bytes32,bytes32)","178003e1":"BCTopCraftCannabis()","178021e3":"saleFee()","1780eb18":"charityFundations(uint256)","17813d37":"BitGCoin(uint256,string,uint8,string)","17834d36":"isReachedHardCap(uint256)","178394bd":"LockedUnsoldTokens(uint256,address)","178407ca":"Board(address)","178450bd":"EbocoinToken()","1785478c":"_preValidatePurchase(address)","1785f53c":"removeAdmin(address)","1785f8dd":"PreTgeDisable()","1786351b":"AllbesticoContract()","1786e362":"orderTokensOf(address)","1787119c":"spendlarge(uint256,uint256,uint256)","17880b67":"getTotalBorrowingMonsters()","17888efc":"projectTokens()","1788de80":"enableTokenTransfers()","17897fcd":"RedRabbitToken()","178a8c8d":"accountsHolding(uint256)","178a8f34":"lotIdsByAddress(address)","178a9e2e":"tixGenerationContract()","178a9ffb":"HarborCrowdsale(uint256,uint256,address,uint256,uint256)","178ab6bb":"startICOStage8()","178af534":"createTokensWithoutReffer()","178afb39":"setSalesState(bool)","178b6de6":"getAllTokens(address)","178b8baf":"printCoins(uint256)","178b9d1a":"closeTicket()","178c02e9":"prometheusSoldCount()","178c17f0":"_createRandomNumber(bytes32,uint256)","178c4e40":"proof_of_public_key1()","178cec5c":"setBAU(bytes32,address,uint256)","178e6079":"APP_ADDR_NAMESPACE()","178ef307":"numberOfTokenHolders()","17904743":"bitpaintingStorage()","17905b2a":"Taur()","1790bd17":"contributorIndexes(uint256)","179101a6":"DECoin()","17916537":"clearDistributionDetail()","179194e1":"Bitnova()","1791cf01":"arr(uint256,uint256,uint256,uint256,uint256)","1791db21":"tokenMult()","1792b0bc":"transferTokens()","1792cc61":"tokenDecimalPlaces()","1793140a":"setO1(address)","179381d8":"setICOController(address)","1793b0f2":"addRecord(bytes32,string)","1793c314":"lastChance(address,address)","1794164b":"killcontract()","1794a463":"changeDevFees(address)","1794bb3c":"initialize(address,address,uint256)","17958e75":"omegaToken()","17961d0f":"ord()","17968fc9":"doPurchase(address,uint256)","1796b2ca":"unspent_supply()","17974399":"changeWithRef(address,address,uint256,uint256,address)","1797552b":"approveansCall(address,uint256,bytes)","1797814e":"IADOWR()","1797ec8a":"totalCrabTraded()","17986d83":"setRefferalFee(uint256)","17993e2f":"IREC()","17997878":"totalOwned()","179a5480":"masterresellercontract()","179ac197":"setOraclizeContract(address,address)","179b1b70":"LogFinalize(uint256)","179b51b1":"lotteries(int256)","179b73da":"killBoardProposal(uint256,address)","179c537e":"setSaleContractDepositAddressVerified(address)","179d375c":"addToken(uint256)","179dd216":"calculateMarketPixelPrice(uint256)","179dfbf3":"getBettingStatus()","179e91f1":"tokensLockedAtTime(address,bytes32,uint256)","179ef331":"nameRegistered(bytes32,address,uint256)","179fc99f":"etherBalanceOf(address)","179ffe76":"getMovie(uint256)","17a081bf":"queryTimestamp(uint40)","17a23ec6":"TOKEN_scaleDown(uint256,uint256)","17a2aaa4":"WithdrawalPremature(address,uint256)","17a2c026":"setCampaignEndDateById(bytes32,uint256)","17a3a329":"GLBX()","17a40e92":"updateAsset(address,bytes32,bytes8,uint256,string,string,address[2],uint256[],bytes4[])","17a432f5":"getActualPriceOfCardOnCraftAuction(uint256)","17a523c1":"useInsurance(uint256)","17a5d4df":"minTransactionAmount()","17a5f8cc":"createRatePlan(string,bytes32)","17a601b5":"MAX_STACK_DEPTH_REQUIREMENT()","17a650cc":"enter_square(uint256)","17a66006":"stageBaseRate()","17a689f3":"SuperSkyNet()","17a7cd10":"weeksFromCreation()","17a7eb4c":"vote02NoCount()","17a7f4cc":"feedOnKitty(uint256,uint256)","17a7f53e":"PriceHKGChange(uint256,uint256,uint256)","17a7f9b2":"countOfAddresses()","17a87b80":"changeInitialPrice(uint256,uint256)","17a950ac":"actualBalanceOf(address)","17a96982":"pullBounty(uint256)","17aa2899":"toB32(address,bytes)","17aaaea7":"BaseAltCrowdsale(address,address,address,address,bool,uint256,uint256,uint256,uint256,uint256)","17aad447":"FOUNDERS_LOCK_START_TIME()","17ab6cbb":"getRedCards()","17ac195a":"devTokensWallet()","17ac410f":"mintedtokens()","17ac896c":"GlobalBusinessSystemToken()","17adeb7c":"setClientProviderUID(address,uint256)","17adfa08":"confirmOneBuy()","17ae1f6c":"commission1()","17ae1fc5":"getIsActive(address)","17ae5d88":"unPreIco()","17af4d8a":"removeRoleAll(string)","17afa8a3":"set_refererPercent(uint256)","17afd19a":"decrementDID(address,address,uint256)","17b2e350":"deletePermissions(address,address[])","17b3a34b":"_addIdentities(uint256,bytes32[])","17b4c4d3":"META()","17b591e5":"closeContract(bytes32,bytes8,uint256,uint32,string,uint32,uint32,uint64,uint64,bytes32)","17b5f729":"_getAuctionIdArray(uint64,uint64)","17b65ae6":"hasEmployerMinRating(address,address,uint256)","17b75be6":"setBigICOStopped(bool)","17b7c328":"OpenPollCoin()","17b83aa6":"getSaleContractDepositEtherMax(address)","17b88dd7":"NEC(address,address)","17b98723":"isAuraSet(uint256,uint256)","17b9a28e":"calcWinner(uint256,uint256,uint256,uint256)","17b9e89c":"sumHardCapPreICO3()","17ba169a":"HybridEXToken(address,uint256)","17ba86af":"OpenContentIndex()","17bb0532":"AdminAddressChanged(address)","17bbcb6f":"newInvest(address,uint256)","17bd1251":"txsThreshold(uint256)","17bd927c":"testNewCounterValueAfterADecrease()","17be3fa5":"lockToken(address,uint256)","17be85c3":"getEntries()","17be89f0":"createTradeContract(address,uint256,uint256,bool)","17bf2671":"PDOne()","17bf8f50":"sendTokenFromDex(address,uint256)","17c0b0f9":"Escrow(address,uint256,address)","17c163e9":"ROLE_STATE_LOCK_PROVIDER()","17c201a1":"getRemainingMineSupply()","17c208a0":"EtherGirls()","17c24891":"completeInternal()","17c2d98b":"minSizeInvest()","17c2f390":"getNumberOfSuccessfulSteps()","17c3119b":"TeamAndAdvisors()","17c32a58":"latestPhaseNumber()","17c35e88":"deedName(uint256)","17c3925f":"encodeBillingMetadata(uint256,uint256,uint256,uint256)","17c39286":"getCars()","17c4c7bb":"getShipPriceById(uint256)","17c4f0a0":"autoReleaseTokenSaleJM()","17c4fcbf":"getExpectedGameSize()","17c51080":"getMyLockedFundsReleaseTime()","17c520f9":"CerttifyToken(uint256)","17c5838a":"stopMinting(string)","17c5fed8":"emergencyWithdrawalRatio()","17c63141":"getCountSenderCities(address)","17c65aa7":"getMaxLossAfterTrade(address,uint256,int256,int256)","17c6ee4f":"PaidOut(address,address)","17c70de4":"initiationTime()","17c73612":"ItlyCoin()","17c73ff0":"COMMISSION_WALLET()","17c83ed4":"getBindAddressAccount(address)","17ca1a6d":"getCrystalsSummary(address)","17ca2e41":"addBlacklist(address,bool)","17ca7f63":"getMintMarketMakerApproval(address,address)","17cacc1e":"_beingVIP(address)","17cb6426":"totalPaidOut(address)","17cbe981":"ChangeShipSellMaster(address)","17cc4138":"lastUETCWC()","17cc67b9":"firstRoundICOStart()","17ccf6a0":"rate5()","17cd4d5a":"setEtherPriceInEuroCent(uint256)","17cd802d":"repayment()","17cdb812":"TEAM_VESTING_AMOUNT()","17ce42bd":"addEntry(string)","17ce9aae":"getIsSecondPhaseByTime()","17ce9d68":"getMeshPointByName(string)","17cfd0d6":"house_edge()","17cfde55":"onSubUnHold(uint256,address,bool)","17d01716":"unregisterPair(address,address)","17d077af":"NamiPool(address,address,address)","17d0aa13":"TXOtoken(address)","17d18cd6":"_capOwO()","17d28620":"toggleTransferFor(address)","17d2e4e4":"realDevRewardWeight()","17d35f47":"setLocked(uint256)","17d3953f":"tmed()","17d48fc7":"getMigrationAccount(address)","17d4e24c":"EXT_COMPANY_STAKE_THREE()","17d51877":"cancelLine(uint256)","17d55d13":"timeLeftToBid(address)","17d5e4be":"testDrip(address,address,uint256)","17d60394":"Briant2Token()","17d6de15":"setSnapshotBalanceBatch(address[],uint256[])","17d70f7c":"tokenId()","17d7a154":"getShipTotalEarned(uint32)","17d7a47d":"sendOtherTokens(uint8,address,uint256)","17d7de7c":"getName()","17d8405a":"setUserAccount(bytes32,address)","17d86154":"setStartPrice(uint256)","17d8fd7a":"acceptedBookingfc(uint256)","17d928a7":"ClaimNFT(uint256,uint256,uint256)","17d94ad3":"isMinterAllowed(address)","17d9adb7":"stage_3_tokens_scaled()","17d9b4ab":"checkPromo(string)","17d9bfcb":"withdrawAndTransfer(uint256,address)","17d9c090":"isCharged()","17da485f":"getMiningDifficulty()","17db59a4":"dEthereumlotteryNet(address,address,address)","17dba48c":"GRAC2Coin()","17dbaf9b":"unlockFirst()","17dbe4f1":"burnPassportToken(address,uint256)","17dc86c5":"minWeiContribution()","17dc92f5":"cash(uint256)","17dd0873":"Winner(address,uint256,uint256,int256,string)","17dd4cc1":"getPreviousPrice(bytes32)","17de15ad":"GreHackCoin()","17de2f1f":"defaultOwner()","17dec7af":"distributionFixed()","17df1773":"StopIco()","17df5696":"finishPreSale4()","17df74f9":"availablePercent(uint256)","17df9a73":"findBid(address,uint256,bytes32)","17e01c95":"isClientBlocked(address)","17e04e55":"PoSatoshi()","17e0aeb8":"setPropertyEarnUntil(uint16,uint256)","17e0dfb2":"backAtIndex(uint256,uint256)","17e139a7":"lockedTokenHolder()","17e1b09b":"minimumDeposit(uint256)","17e1bfb7":"addInstitution(address,string)","17e22621":"joinGameWithInviterID(uint256)","17e2912f":"Amount_of_AOC_for_One_ETH()","17e30f6b":"TimeChainToken(uint256,string,string,address)","17e398a5":"seizedTokensWallet()","17e3f5fa":"callModifiedContractBalance()","17e49dc9":"ETH033()","17e50791":"FundsReceived(address,uint256,uint256,uint256,uint256)","17e51f21":"CrowdsaleController(address,uint256)","17e5259e":"ETH_MAX_LIMIT()","17e63b79":"centsPerMonth()","17e63bff":"setupICOPeriod(uint256,uint256)","17e6a087":"markFunding(address,uint256)","17e72721":"VLToken()","17e760bb":"votingAllowed()","17e7dd22":"getBooleanValue(bytes32)","17e875e3":"Transparancy()","17e95fbc":"releaseAdvisorsAccount()","17e9884d":"OG()","17ea4a79":"Took(address,uint256,uint256,uint256)","17eb85e3":"contractBoost(uint256)","17eba34d":"MIN_PRICE_IN_CENTS()","17ed31f4":"TIACOIN()","17edfb06":"trade(uint256,uint256,string)","17eef4cd":"setTotalTokensForPublicSale(uint256)","17ef67c6":"setContract1(address)","17efa370":"SmartTokenController()","17f143e1":"supplyExponent()","17f19efb":"ZoarToken()","17f1d65b":"hasIcoPhaseOneEnded(uint256)","17f1ee05":"paySecurityPool()","17f46c15":"getVoucher()","17f5de95":"MAX_TOKENS_SOLD()","17f5f53a":"XYTTEST()","17f6252f":"PRESALE_PERCENTAGE_4()","17f6c712":"ObjectPurchase(address,address,uint256,uint256)","17f708fb":"removeWhitelist()","17f7a530":"_computeNextMinerPrice()","17f80c13":"releaseJoyToken()","17f8252e":"tokenOwnerNumber()","17f95eac":"approveCloser(address,bool)","17f992ab":"SECOND_VOLUME_EXTRA_BONUS()","17fa664f":"callerDel(address)","17faa66f":"transferOwnershipWithBalance(address)","17fab0a0":"info(string)","17face84":"withdrawCommission(uint256)","17fad7fc":"batchTransferFrom(address,address,uint256[],uint256[])","17fb44c1":"returnAmountPaidBackSoFar(uint256)","17fb4d66":"Destroy(address,uint256,address)","17fb6c6e":"approveRequest(uint256,bool,string)","17fc01bf":"LegendsCrowdfund(address,uint256,uint256)","17fc3f55":"angelGoal()","17fc91f8":"holdAmount()","17fccb47":"erc20TokensContractAddress()","17fe375f":"getComments(address)","17fe5b79":"apolloSpecialTransfer(address,uint256)","17fe6185":"log(address,address,uint256)","17fe72bb":"setEnabled(address,bool)","17ff0caa":"WeatherBet(uint256,address,address,address)","17ffa830":"tixFounders()","17ffc320":"reclaimToken(address)","17ffd225":"KittyTrained(uint256,uint256,uint256,uint256[5])","17ffe171":"lock(address,address)","18004bba":"transferArrayBalanceForPreSale(address[],uint256[])","18005d93":"JinuToken()","1800c0fe":"extraTime()","1800e68e":"calculateTokens()","1800ed8e":"manager_address()","18015191":"transactions()","1801db43":"ExaCHF()","1801f00f":"newProposal(uint256,uint256)","1801f38e":"restart(uint256)","1801fbe5":"mint(uint256,bytes32)","1801ff10":"getAllContact(bytes32)","18024acc":"voteStartTime()","1802f969":"PokeCentral(address,address)","18037b78":"issuerJurisdiction()","18039230":"getPlayerGoodList(address)","180489ed":"Withdrawal(address,uint256,bytes)","18051c4a":"targetWei()","18054275":"executeSpins(bytes32,bytes)","180603eb":"registrationFee_()","1806874a":"amountLockedInVestings()","1806be68":"CompanyReserve(address,address)","1806cb4e":"getGiftSoldFromType(uint256)","180773de":"MAXIMUM_CONTRIBUTION_WHITELIST_PERIOD_USD()","1808c6b6":"setDividendsDistributor(address)","1808eeb8":"pending(bytes32)","180941f0":"setPredictions(int16,string)","1809549f":"updateAllComponents()","1809ced7":"sendEther(string)","180a3277":"sendDiary(address,bytes)","180a351b":"getByteFromByte8(bytes8,uint8)","180a42a3":"LifeSet_006()","180aadb7":"underLimit(uint256)","180afbf6":"DaxtherCrowdsale()","180b0d7e":"feeDenominator()","180b2607":"lastRelease()","180c0da6":"GlobalAssentToken()","180c0dfe":"maxBuyTokenAmount()","180c9309":"hasOracle(address)","180ca180":"CooperativeToken()","180cb47f":"GOV()","180da450":"addTierRateAndTokens(uint256,uint256,uint256)","180db1b4":"getErrno()","180dc318":"owners(uint32)","180ee30d":"forgivedChars(uint256)","180eebba":"accumulatedGasFees()","180f4c2c":"submitTotalBuyOrder(bytes32,uint256,uint256)","180f8f4f":"nextPrice2Of(uint256)","18117abb":"changeOwnerWallet(address)","18126325":"getOrganBlog()","18128ec7":"buyMorty()","1812982c":"fechAllForCandidate(uint256)","1812d2aa":"setBonusToken(address,uint256,uint256)","1812d996":"signature(bytes32,uint256)","1813b684":"preIcoEnded()","18158e6b":"BdpController(bytes8)","18159bf3":"_addSGCUsers(address)","1815ce7d":"setBackendAddress(address)","18160ddd":"totalSupply()","181670e6":"isApprovedOnceFor(address,address)","18167416":"officialGameUrl()","1816e794":"getMainsale()","18178358":"poke()","1817c5a7":"revokeGrant(address)","181a916b":"getKeys(address,uint256,uint256)","181aa1fd":"takeFee()","181b3bb3":"functionOne()","181b591a":"phase_4_bonus()","181be00d":"getValue(uint8)","181c8ef9":"enter(bytes8,address)","181d85eb":"internalRedeem(address,uint256)","181da773":"EosPizzaSliceDonationraiser(address)","181dcbcd":"setMaxConfig(uint256,uint256)","181e0124":"getRemainingTime(uint256)","181f1437":"permissibleWithdrawal(uint256)","181f1965":"fillSellOrderPartially(uint256,uint256,uint256)","181f4456":"setAuctionStart(uint256)","181f4477":"getLockedStructStartTime(address,address,uint256)","181fd85b":"cancelSale(address,bytes32)","181ffc5f":"GetGift(bytes)","182092a8":"ChangeSymbol(string)","1820b575":"Team(uint256,address,uint256)","1821cd93":"jackPotFunds()","1821e7c6":"acceptOffer(address,address,uint256)","1822b886":"createTradeOffer(bytes32,bytes32)","1822cbc5":"mintingIsAllowed()","1822f8db":"finishSafe(address)","18237476":"getAccountTotal(address)","18237e0c":"enableBuyback(uint256)","182439de":"claim_PreICOTokens(address)","1824461d":"administror()","18248f2a":"sendToken(address,uint256,address)","182493f2":"plantedOf(address)","182499fe":"ico_address()","1824a46b":"onUpgrade()","18253234":"ticketsAvailable()","182575f1":"authorizeFloor(uint32,address)","1825d0e8":"_mintCUSD(address,uint256)","18264f33":"startMigration()","1826fb35":"_calculateShards(int256,uint256)","1827caf4":"getInfoB(uint256)","1827edbc":"Reaper11()","18285e6b":"secondPlay(bytes32,uint8,bytes32,bytes32,uint256)","18287ef2":"executeOption(address,uint256)","18289482":"currentIcoPeriodStartDate()","1828983a":"authorizedUsers(address)","1828b254":"nextTicketPrice()","1828db82":"ownerPayout(address)","182930ce":"AddedToWhiteList(address,uint256,uint8,uint8)","1829b73f":"buyoutAmount()","182a7506":"setMinimumFee(uint256)","182ae5f2":"getVotesForItem(uint256)","182af96b":"regularEndGame(address,uint32,int256,uint256,address)","182b0b00":"checkChangeToReceive()","182b144c":"incrementBatch(address[])","182b434b":"newRequest(address,uint256,bytes32)","182d326e":"getTeamAddress()","182d709a":"scaleWeights(uint256)","182db370":"getWhatHappened()","182e0c49":"totalUnrestrictedAssignments()","182e7533":"getBetResult(bytes32,bytes32,bytes32,uint256)","182e8a67":"changeGroupActiveStatus(bytes32,bool)","182e9a1e":"getOwnerVehicleDetails(address)","182ee07f":"setDistributionMinimum(uint256)","182ef78e":"getTMul()","182f67a3":"reservedWei()","18300c1a":"CappedMintableToken(uint256)","1830d69d":"IsGot(uint256[],uint256[])","1830f493":"getPermission(bytes4)","1832425f":"registerAddress()","1833198f":"makeMemChange2(uint256,uint256,uint256,int256)","1833b7c6":"changeMyAddress(address)","1833fa4c":"update(uint256,string,uint256,uint256,uint256,uint256)","18342c9c":"BettingCore()","1834906c":"thisContractAddress()","1834ef4e":"addMoneyToContract()","1835e57d":"VESTING_DURATION_4Y()","183651d9":"tokenApprovalWithSignature(bool,address,address,address,uint256,uint256,uint256,bytes32,bytes)","18369a2a":"initialBalance()","183718d1":"getCheckoutTime()","18384df2":"getMetadataOf(uint256)","1838daab":"getRealmSale(uint256)","1839a417":"_cancelEthOffer(address)","1839babf":"zGetGameBalance()","183a7947":"pregnantKitties()","183abe66":"testRewardSB(string)","183b3159":"getAssetBalance()","183bfb4f":"AddBankerProfit(uint8,uint256)","183c5901":"DigitalGold()","183d255e":"SetWhat(uint256)","183d4cf7":"CNT_address()","183df5ef":"test_invalidSuicide()","183f9bcf":"isQuorum(address[3])","183ff085":"checkIn()","184018c6":"awardHighScore()","1840f0ca":"countVotes(uint256)","184188f2":"setStopTransfer(address,bool)","18423074":"ShowerToken()","18433bb7":"DrawPrepare()","18456048":"auctusTokenAddress()","18469491":"lastPlayerPaid()","18469dfe":"canStartDispute(bytes32)","1846d125":"isGroupExists(bytes32)","18476db4":"newRandomValue(uint256,address,uint256,uint256)","18477799":"Touch()","1847c06b":"ids(address)","18489f50":"thingExist(bytes32[])","18494108":"doPayout()","1849bd6a":"ExecuteTrade(address,address,address,uint256,uint256)","1849cb5a":"get(uint80)","184a9ce1":"Log2_fnc(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256,uint256)","184ad5ff":"VjuCoin()","184b1912":"minimum_goal()","184b9559":"init(address,address,address)","184bd394":"changeSaleAddress(address)","184c703d":"LogVoteInitiate(uint256,uint256,uint256,uint256,uint256,uint256)","184d009b":"teamNameIndex(string)","184d1a77":"acceptBid(int256,int256,int256,int256)","184d69ab":"isWhitelistEnabled()","184db3bf":"initErc20Deal(bytes32,uint256,address,bytes20,bytes20,address)","184e8549":"getPI_edit_31()","184fb2bd":"signOwnerCount(uint256)","184fd65e":"addMomRelation(address)","184ffd9d":"RATE_CROWDSALE_S2()","18501714":"clearJackpotParticipantsAfterDistribution()","185061da":"undoIt()","18507210":"templatesOfOwner(address)","185190f6":"addCustomerwithETH(address,uint256,uint256)","1851e59e":"Omnidollar()","18520be5":"EventBid(uint32)","18520de3":"sendFrom(address,address,address,uint256,uint256)","1852e8d9":"calculateReward(address,uint256)","1853d033":"GetAskingTokenBought()","1854229a":"REFERRAL_BONUS_LEVEL1()","1855e405":"managerOff(address)","1856a6df":"coupleImageIPFShash()","1856bc0f":"BuyGenesis(address)","1856c1dc":"main_sale()","1856e01b":"setVotingController(address)","18573bf9":"calculeReward(uint256,uint256)","18577f8d":"calVote(address)","18579ece":"clearances(address)","18584a5d":"hasAlreadyPlayed(address)","185870f9":"developerWallet()","1858cb5b":"verifyProof(bytes,bytes32)","185917c5":"distributeToFound(address,uint256)","1859b2d7":"getDStructData(address,uint256)","1859c8e2":"getUserTicket(uint256)","185a5671":"setTransferAddress(address)","185a6284":"discountedMiningTarget(address)","185a7daf":"FundingRules(uint256)","185b9067":"QuadCoin()","185c4279":"hardCapCHF()","185cc751":"loan(address,uint256)","185d1af6":"setUncirculatedSupplyCount(uint256)","185d9e79":"AOL(uint256,string,uint8,string)","185e00fd":"getDisputeStateText(uint256)","185e4a00":"getCurrCanRefund()","185e9969":"getContractDetails(bytes32)","185f23c4":"_arbitrationPercent()","1861355b":"transferMintOwnership(address)","1861cb28":"getNowVestingType()","1861e523":"testOwnerToken()","1862c10b":"withdrawBalancesToLogic()","1862caec":"firstStageMinting()","186415c0":"releasesollidaTeamTokens()","18643d37":"raffleLimit()","1864db71":"getCompetitionInfo(uint256)","18656a1e":"founderAmount()","18659adb":"starbitWallet()","1865c57d":"getState()","186601ca":"activated()","1866191a":"editDiscount(uint256,uint256,uint256)","186690b0":"broadcastMessage(string)","1866ae7d":"PayRollHistory(address)","1866f761":"ConstantaToken()","18671d23":"Auditor(address,address,address)","1867b937":"_bytesToBytes32(bytes)","1868291f":"getIp(string)","1868516d":"KMEToken()","1868c2a1":"computeSeed(uint64,address)","18695c4d":"DSToken(bytes32,uint256)","1869a084":"releaseLockedBalance(address,uint256)","186b6f05":"updateFallbackDeposit()","186b79c9":"isProviderInitiated(address)","186ba9de":"lastUnlockMineBalanceTime()","186bbb05":"getAppCode(bytes32)","186bcaf0":"ontology()","186c9b11":"issueTokens(uint256,address,uint256,uint8[],bytes32[],bytes32[])","186cd7d2":"card_black_first()","186d9ce8":"allowAvatarCreation()","186d9d88":"unblockAddress(address)","186db237":"ecosystemBuildingTokens()","186e378a":"CCH_EDIT_4()","186e4297":"charityCut()","186e7047":"forceAdvance()","186eb86b":"cnt_per_eos()","186f0354":"safe()","1870082d":"inviteCollateralizer()","187047b5":"LogUserAdded(address)","1870a73a":"totalNTD()","1870ad14":"setAddress(string,address,bool)","1870c10f":"donateAndCreateGiver(address,uint64,address,uint256)","18714bc8":"purchaseWithFiat(uint256)","18718656":"XENCToken()","1873355e":"Emoji()","18737e07":"Redeemed(uint256,address,address,uint256)","18758480":"worldContract()","1875aa22":"transferWhiteList()","1875ccf3":"setGlobalCompositionFee(uint256)","18760eb3":"RequiringAuthorization()","18764471":"ANTDToken()","1876d0a9":"astutelandToken()","1877fc8a":"quickSort(address[21],int256,int256)","1878265a":"Rent()","1878d1f1":"ETH_TOKEN_ADDRESS()","187958ac":"VOCToken()","18797499":"ENTERED_MASK()","18797c35":"emitAccountFrozen(address,uint256)","1879c2da":"NewSale(address,uint256)","1879dcf3":"MIN_TOKEN_PRICE()","187a62d5":"voteEmergencyWithdrawal(bool)","187ac4cb":"migrationManager()","187adf2e":"failsafe_subtract(uint256,uint256)","187b1f2a":"VOZToken()","187cba25":"issueNomins(uint256)","187cbdd2":"subWallets()","187d2371":"LOG_MaxInvestorsChanged(uint256)","187d3954":"getClaimableBalanceFor(address)","187d8803":"updateKoCommissionAccount(address)","187ecd37":"Open(bytes)","187ed86e":"ROE()","187f707b":"AdvertisementFinance(address)","187fac20":"setStartStage1(uint256)","187fd079":"MINI_GAME_TIME_DEFAULT()","18804b0d":"setDescriptionHash(bytes32)","1880692f":"getPublicKeyCount()","1881656b":"canSpend(address,uint256)","1881b0f0":"kycVerify(address)","1881f980":"read_i64()","18821400":"TOKEN_NAME()","1882d267":"liquidityFundAddress()","18836994":"get_allowance(address,address)","1883d2a4":"IUPToken()","1884c517":"registerWorkerAffectation(address,address)","18856694":"deny(bytes8)","1887af2b":"LogicBase(address,address)","18886657":"purchaseLimit()","1889500c":"marketplaceManager()","18896972":"isBuyFull()","18898452":"saleMinimum()","18899745":"AffiliateMarketing(address,uint256)","1889fc0a":"_preValidateReserve(address,uint256,address)","188a1d68":"getOuverture_des_droits()","188b5372":"generateToken(address,uint256)","188b81b4":"getGameEnd(uint256)","188c668c":"recordDealRefundReason(uint256,address,uint32,uint32,uint256,string)","188cad26":"referralTokensAllocated()","188d0aae":"buyAndCreateGame(uint256,uint256,address)","188dbc1a":"setAccountIsFrozen(address,bool)","188ec356":"getTimestamp()","188f1fee":"notifyObservers(address,address,int256)","188fdbdc":"commission_rate()","189048fc":"getAccountLevel(address)","189052ac":"_setFreezingPeriod(address,bool,uint256)","18911bbe":"ProdFToken()","1891381d":"setROI(uint256)","1891c701":"AssignOwnerToProject(int256,address)","18921de4":"addSignature(string,uint256[],uint256[],uint256[],bool[],uint256[])","1892c15a":"fwdPayment(address)","18940084":"_getDestinationTranche(bytes)","18942a33":"new_record(address,address,uint256)","18946e8f":"voteOnParameter(bytes32,int256)","18954b3e":"collectEstimation(int256)","18955b1e":"willThrow()","1895687d":"issueLoan(address,uint256)","18958959":"individualClaim()","1895e858":"resetWallet()","1896367e":"setBlockSze(uint256)","18968a03":"finalize(uint256,address,address)","1896f70a":"setResolver(bytes32,address)","18976fa2":"closeVault()","1897bcf3":"sellToken(uint256,uint256)","1898a1c7":"addVendor(address,string)","189959de":"EXPC()","1899f1ad":"setChargerAddress(uint256,address)","189a5a17":"nodes(address)","189ae13c":"numArbiters()","189af42f":"powsm(uint256,uint256)","189aff3a":"authorizedSupply()","189b11fc":"AddSeed(address[])","189b600c":"setNameHashByWriter(bytes32,address,bytes32)","189c94ae":"testFallbackStaticSig()","189ca316":"setVoteWeight(uint256)","189d165e":"setBurnRate(uint256)","189e688a":"ClaimDividend(address,address,uint256,uint256,uint256)","189eeebe":"isMembershipAllowed(address)","189f0197":"getPlayersPick(string)","189f4d34":"setMinUCCoinSellingValue(uint256)","189f9041":"mintCoreToken(address[])","18a08d2d":"TheTokenH()","18a0e773":"UnlockGrant(address,uint256)","18a17df1":"DataDump()","18a24b5b":"unlockToken()","18a30d16":"getResponse()","18a39c54":"payForward()","18a3aad2":"ReserveCoin()","18a4155e":"calculatePrice(uint256,uint256,uint256,address,uint256)","18a45c41":"_receiveFundsUpTo(uint256)","18a51621":"getReadableSupply()","18a54ecd":"mintTokenForPrivateInvestors(address,uint256)","18a6217d":"comments1()","18a66563":"AQI()","18a689aa":"getNamePicture(bytes32)","18a6bc32":"tokenDistributor()","18a6d58b":"addTokenTeller(address,uint256)","18a6d765":"BANKROLL_LOCK_PERIOD()","18a6dec5":"getCountTokensByGame(uint32)","18a7bad6":"setFreezeAdmin(address)","18a8fac9":"icoInvestment(address,uint256,uint256)","18a94030":"putStoWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","18a991f7":"setEmeraldPrice(uint256)","18a9cc1b":"isUser(uint256)","18a9f29f":"setMetadata(uint128,string)","18aaaa51":"registerTickets(uint256)","18ab8888":"paymentSortId()","18ab8c37":"timeToCalm()","18abb75c":"createLibraryBounty(string,string,address,uint256)","18abfdfc":"totalSupplyFromCrowdsale()","18ad052b":"safeTransferByContract(uint256,address)","18ad28af":"icoWasSuccessful()","18ae15e4":"DBC(uint256,string,uint8,string)","18ae19c2":"get(bytes32,uint256)","18ae21e8":"NuoYiLian(uint256,string,uint8,string)","18af26fe":"setRestrictedWallet(address)","18af4099":"PARALLELNETWORK()","18af5e74":"addressesDeposited(address)","18af7021":"force_refund(address)","18b03ceb":"remainderPurchaser()","18b0bdf7":"getMensaje(uint256)","18b0efb6":"isEmptyName(string)","18b123d5":"hasBeenApproved(address,uint256)","18b15e2a":"Ongo()","18b20071":"setCurrentPrice(uint256)","18b2739d":"giveEthJackpotAddress()","18b31f94":"registerLengthFunction(string,string,address)","18b322a4":"update_instant()","18b38777":"fuzexAccount()","18b3a119":"getCrowdsaleMaxRaise()","18b3b58b":"Hamza__Coin()","18b3c724":"forceRecoverCollateralOnBehalfOfRecurse(address,address,bytes32,address)","18b3cd45":"qwecoin()","18b40adf":"maximumCirculation()","18b437aa":"COMMERCIALPOINTCHAINSYSTEM()","18b49ba4":"AMPIToken()","18b4a702":"EPACOIN()","18b4a924":"week_max()","18b64d5b":"unmint(int256,uint256)","18b749c4":"payEther(uint256)","18b7bb11":"EthRoi()","18b7fed8":"deliverPresaleTokens(address[],uint256[])","18b8275a":"addUser(string)","18b919e9":"ROLE_WHITELISTED()","18ba4218":"countAssetEvents(bytes32)","18ba5cdc":"ownerAddToWhitelist(address,uint256)","18ba6973":"setTrainingFormulaContract(address)","18bb2edb":"maxRegistrants()","18bb7c08":"_setNameToAddress(address,string)","18bbedf4":"Bulletin()","18bcd3d0":"transferOwnership(address[])","18bd21f9":"_purchase(uint256,uint256)","18bd387a":"level_referrals_count_by_address(address,uint256)","18bd5108":"stopCrowdsaleTime()","18bd710b":"NewGirl(address,uint256,uint256,uint256,uint256)","18bd8dcb":"ufoodoToken()","18bdb1b0":"StartdateICO()","18bdc79a":"payOwnerOnly()","18bdffbb":"verifierAddress()","18bee97e":"Creator()","18bf0225":"etherFundsOf(address,address)","18bffce9":"voteToResult(uint256)","18c0e04f":"purchaseStake()","18c10ad0":"disabled(uint256,uint256)","18c1d9b2":"bonusWallet()","18c1fc68":"buyOne(address,address,uint256,bytes)","18c20f44":"entrarAJuego(uint256)","18c26389":"multivestMint(address,address,uint256,uint8,bytes32,bytes32)","18c2d4c9":"initialSingleWithdrawMin(uint256)","18c306bd":"checkSignatures2(bytes32,bytes,bytes,bytes)","18c3cf34":"EthPriceProvider()","18c41a80":"mint(bool)","18c48e96":"bitRegisters(address)","18c53aca":"tokenIsComponent(address)","18c5bddc":"PRESALE_THIRD_DAY_START()","18c5e3af":"addInvestmentProposal(uint32,bytes24,uint256)","18c5e502":"GetTime()","18c8bda5":"Procare()","18c93884":"_setCrowdsaleStage(uint8)","18c9ef97":"mintETHRewards(address,uint256)","18caa857":"emitJobBinded(uint256,uint256,bool)","18cc4c65":"startEngines()","18cd55f3":"canCreateGrants(address)","18cda1e7":"lockInternalAccount(address,bool)","18ce1a23":"BailOutToken()","18cee8a4":"setPlatformCommissionRate(uint256)","18cf1c25":"lookupDonation(uint256,uint256)","18cf85d1":"adminSetCityData(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","18cfa483":"invalidate(address,uint256)","18d0073e":"startNextMilestone()","18d0122a":"upgradeAgentStatus()","18d0376c":"getFastGap()","18d0a7cc":"incentFundAddress()","18d0c322":"EtherLambosCore()","18d0eb93":"finalizeAndDistributeToken()","18d30bfa":"setLastMoveTime(uint16)","18d32128":"CLVRCrowdsale()","18d43f0d":"userTokensValues(address,address)","18d4b4b3":"COCCToken()","18d4e834":"getPrivilegeState()","18d62bc6":"PHXFlip()","18d6676c":"entityStructs(uint256)","18d69faa":"StopDistrib()","18d74c37":"deleteShare(address)","18d760be":"LogFinalize(bytes32,bytes32)","18d76b78":"CCIToken()","18d78358":"ICOCENTRAL()","18d80168":"startUnitRaffle(uint256,uint256)","18d80d4a":"check_prize()","18d84553":"calculatePayout(bytes32)","18d8ec5b":"validateWinnersCount(uint32,uint32,uint32)","18d8f9c9":"erc677token()","18d92a5d":"getRegistryDataCustodian()","18d95092":"domainOwner(string)","18d97731":"setPriceStep7(uint256)","18da0011":"treasuryContract()","18da650d":"WithdrawalInterCrypto(uint256)","18da754a":"setBuyMinLimit(uint256)","18dad1cd":"multiTransferFromValues(address[],address[],uint256[])","18db02e1":"etherToLEONRate()","18db0750":"contributionReward()","18db62fb":"checkValue(uint256)","18dcdfbe":"isRetirementAllowed(uint256,bool)","18dd97f0":"secondStageTokensForSale()","18de0afd":"getEnabled()","18deb066":"init(uint8,uint256,uint256,uint256,address[2],address[],uint256)","18debd27":"addWalletAddressAndTokens(uint256,address,uint256)","18def2a1":"DistributedCreditChain()","18df02dc":"Migrate(address,address,uint256)","18df11ee":"SpendingApproved(address,address,uint256)","18df6090":"mintBountytokens(address)","18dfcf7b":"_investorCount()","18e01199":"burn(uint256,bytes,bytes)","18e02bd9":"setTokenOwner(address)","18e0d683":"getBAI(bytes32,address)","18e124e4":"upgradePackageCountOf(address)","18e146f9":"InvestmentPolicyChanged(bool)","18e2d679":"describeTile(int32,int32)","18e2e4be":"getInvestor(address,address)","18e37cdd":"ITGToken()","18e3b44c":"setMemory(uint256,uint256)","18e3d998":"crowdSaleEndTime()","18e45427":"whitelistedContract()","18e4ac35":"isConfirmed(address)","18e4c3f3":"GMOON()","18e4d2db":"_AIExchangeSupply()","18e536bc":"comissionList()","18e6ab9c":"funding(address,uint256,uint256)","18e75a1c":"PresaleEDUSupply()","18e7eb4b":"PRE_SALE_1WEEK_BONUS()","18e857ab":"queried(uint256)","18e9e7ab":"listSimpleService(uint32,string,uint256,address[],address)","18eacb96":"GetDivs(address)","18ebcc8c":"takeOrder(uint256,uint256[5],uint256[3],bytes32[3])","18ecc6f4":"getTotalDividendsRounds()","18ece632":"superApprove(address,address,uint256)","18edf434":"_revokeConfirmation(uint256,address)","18ee00b6":"_changeRate(uint256)","18ee1b9f":"WithdrawEther()","18ee9d5e":"EtherIncognito()","18eeef80":"Wallet1()","18ef7adb":"transferAdvisorTokens(address,uint256)","18f0db29":"remainingBettingFor(uint256)","18f11de2":"BSSCoin()","18f2217a":"EPXtokenSupply()","18f2a0bb":"ownersConfirmedTransactions(address)","18f303a1":"SetInternalValues(uint8,uint256)","18f3a50d":"cooAddress2()","18f3fae1":"setOversight(address)","18f61c0d":"configRunTime()","18f729da":"founderLockance(address)","18f76a2c":"getCCH_edit_3()","18f7d5ad":"lastBlock_f13Hash_uint256()","18f80bb9":"createContract(string)","18f839bd":"Expensive()","18f873df":"chAllowTransfer(bool)","18f889c2":"setOracleGasPrice(uint256)","18f9266c":"talks(bytes32)","18f95486":"openPendingPartCrates()","18f96441":"getShipDetails(uint256)","18f96857":"Lazadex()","18f9b023":"addPayee(address,uint256)","18f9bdee":"allocationOpen(uint256)","18fa11ab":"revokeRequestorAddress(address)","18fa223a":"GGCT()","18fb75f4":"callDeposit()","18fc6513":"companyCurrentPeriod()","18fd3474":"HumaniqICO(address,address)","18fd8903":"refund(address,uint256,uint256)","18fdcaba":"getSumAmountOfDisputedDealsProDoctor()","18fe1a8d":"banToken(address)","18fed50a":"getLast4Bytes(bytes32)","18ff1361":"manualyMintTokens(uint256,address,uint256,int256)","18ff318d":"thorToken()","190038dc":"supplyAdjuster()","190042b8":"CARA()","19006185":"getNumRefundTransactions()","1900aabf":"CollectChips(uint256)","190108b5":"getAyantDroitEconomique_Compte_3()","190151c6":"_createNumber(uint256,uint256)","19018557":"COCToken()","19022f20":"TTT()","1902e902":"adjustEntitlement(address,address,uint256)","190377a5":"getCategory(string)","1903bbe0":"_getQueryStr(uint256,uint256)","1903c10e":"setPI_edit_3(string)","190406b3":"customExchangeSecure(address,address,uint256)","19045a25":"recover(bytes32,bytes)","19055df2":"preSaleTokenExchangeRate()","19058903":"NewPassProject(address,address,string,string,bytes32)","1905fbf6":"setNewWallet(address)","19062b8f":"settleTransaction(uint256)","190663e4":"setGreeter(string)","1906ff98":"getVotePrice()","19077dca":"resetOwnership()","1908c425":"m_leeway()","1909773f":"get_milestone_information(uint256)","1909787f":"NextMint(uint256)","1909d314":"GCPrightToken()","190a2688":"changePrices(uint256[3],uint8)","190a597b":"restartCrowdsale(address,uint256,uint256,uint256,uint256,string)","190a6aa9":"burn(address,uint256,bytes,bytes)","190a8613":"getNodeLeftChild(bytes32)","190a867e":"testThrowNoPartialTokens()","190bc9d4":"w_Advisers()","190bfa4d":"singleDVIPQty()","190bfcd0":"initialTokenValue()","190bfea8":"sellWei()","190c23c4":"adminSetTxFeePaidGame(uint256)","190c69a2":"unWhitelistUser(address)","190d9253":"testInitialContract()","190e4c77":"numOfProperties()","190e8266":"makeProduct(string,string,uint256,uint256)","190eaaba":"getDenominator()","190ef61d":"readAnalyticsMap()","190f4cfc":"doCalculate(uint256,uint256,uint256,bytes32)","190fe712":"payoutETH(uint256)","19110d05":"DTCC_ILOW_8()","19113b4a":"changeStatement(string)","19123c1f":"magnitude()","1912f84f":"BONUS2_LIMIT()","191313ae":"EndOfPayments(address,uint256)","191347df":"setStr(string)","1913742f":"appendSchellingSupplyChanges(uint256,uint256,bool)","191384d1":"viewMessage()","19141100":"bankRollDivest(uint256)","1914427f":"MultiSigWalletWithDailyLimit(address[],uint256,uint256)","19154616":"FART()","1916037d":"withReferrer(address)","19162a30":"getYumWithETH(uint256)","19165587":"release(address)","1916fcb7":"Galaxy100()","191723ed":"lockBalance(uint256,uint256)","191797df":"isStoped()","1917ab5c":"activate(string)","1917e6d1":"addDoctor(uint32,string,uint16,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)","19190495":"SimulateCurrentDate(uint256,string)","1919cf62":"allEthShares()","1919fed7":"setSalePrice(uint256)","191ad190":"open_free()","191af4bc":"thirdroundprice()","191b548e":"VIVACrowdsaleRound(bool,uint256,uint256,bool)","191b8260":"_createScene(string,uint256[],address,uint256)","191be7b7":"getQueryResults(bytes32)","191d7a7a":"TVToken()","191d8cd7":"passToken(address)","191e39b3":"setOwnerCut(uint256,uint256)","191e521f":"moken(uint256)","191e8daa":"_getRand(uint256)","191f06e7":"setEscrowFactoryContractAddress(address)","192014f4":"buyKeyWithReff(string)","1920b2a6":"BitOnBayToken(uint256,string,string,uint256)","1920ed48":"isOwner(uint32,address,address)","19213471":"addFRA(address)","192159a6":"ListingCreated(uint256,uint256,uint256,uint256,address)","19216c4d":"getPreIcoInvestorsCount()","19216e8d":"freezeForOwner(uint256,uint256)","19218eda":"secondTokenExchangeRate()","192193b9":"transferFrom(address,address,int256)","1921c454":"priceChangeBlock()","19220c69":"TAKLIMAKAN()","1922936d":"RegisterTransferBeneficiaryContract(address)","1922e9b4":"getJobApprovals(uint256)","1922ff39":"payOut(address)","1923350f":"ADVISORS_TOKENS()","19236b4e":"getSanTimeAlive(uint256)","192399d1":"vestingBalance(address)","1923a4a3":"issuePercentToReserve(address,uint256)","1923e5d4":"noActiveBallotExists()","19240661":"setTrusted(address)","19245155":"StartedSafeUnlock(uint256)","1924f74a":"PVP_INTERVAL()","1925259b":"ShroomFarmer()","19254e2e":"getInsuranceStatus(address)","19261e6f":"setERC20ApproveChecking(bool)","1926b63d":"savePost(bytes32)","1926de89":"readInt256(bytes32)","1927a754":"drainEther()","1927a8ea":"listFiles(uint256,uint256)","19287f3a":"withdrawBalanceAll()","1928b3cb":"getPosition(bytes32)","19291c74":"getGoldStatusLastauditid(address)","192a4422":"safeWithdrawalAmount(uint256)","192b3092":"mintPreAllocatedTokens()","192b3608":"Bond(uint256,string,string,string,uint128,uint128,uint128,uint128,uint16,string,string,address)","192b663d":"vestSupply()","192b7700":"CitrusCrowdsale(address,address)","192d65c9":"getRoundByRId(uint256)","192e571d":"getPlayerByName(string)","192e7a7b":"releaseFunds(address)","192ecd68":"getDistrito(uint256)","192f1076":"crowdsaleEndDate()","193080cb":"getLockedContract(address)","1930fc01":"FastmarketNetwork()","193115b4":"changeHiddenOwner(address)","193118fa":"CPCCrowdsale()","193237f5":"_isValidSignature(address,address,bytes)","1932bb33":"lastBlock_a12()","19337d6c":"setLink(string)","193402bb":"PRE_SALE_PRICE()","1934d55a":"isPermanentlyApproved(address,address)","19350aea":"nameFor(address)","19354750":"setRegistryLogic(address)","1935f8d2":"Instacocoa(uint256,string,string,address)","19362921":"CONTRIBUTORS_SHARE()","1936a8cd":"getSeedByWinner(uint256)","1936dd8f":"writeMessage(string,string,string,string,string)","1936e4be":"advisor()","19375602":"challengeOwner()","1937714b":"confirmDeployment(uint256,address,bytes32)","1937b7fa":"Burnfrom(address,uint256)","1938a238":"softcapInTokens()","19397ed0":"Transfer(address,address,address,address,uint256,bool)","1939805f":"TPPC2018Token(uint256,string,string,uint256)","1939c1ff":"transfer(address[],uint256)","193a4249":"minFunding()","193a824e":"_escrow(uint256)","193a8a83":"getCCH_edit_28()","193c114b":"transferTokensOut(address,address,uint256)","193c8da4":"AkikToken()","193c9be1":"getCreateShareToken(uint256)","193ccc20":"depositTokenToUser(address,address,uint256)","193d5b77":"getGiffBlock(uint32)","193df7ea":"addBlacklist(address,address)","193e06c4":"CalcPeriod(address,uint256)","193e6679":"MarginBanc()","193f69a1":"getPhaseBonus()","193fc711":"_getBeginIndexKey(uint256)","19404c2f":"replayAnserWithReferrer(uint256,uint256[],string)","1940a936":"isPregnant(uint256)","19424222":"approveAndCall(address,uint256,bytes32)","1942c3ce":"_transfer(uint256,address)","194307bf":"terminated()","19447eb6":"userStructs(address)","19449cb2":"changeAuthorizedCaller(address)","1944bc3d":"priceThresholds(uint256)","1946283a":"CarRegistrationFailed(uint256)","19465953":"changeInfo(string)","1946fdf4":"logicVersion()","19476244":"icoNumeratorPrice()","1947bd2f":"getMap(address)","194809a6":"finalistTeamFIFAIdsSet()","19483cd1":"checkHash()","19498426":"BOUNTY_REWARD_SHARE()","194a7adc":"CONNECT(uint256,string,string)","194b546b":"_addRec(uint256)","194b81d0":"TGxToken()","194c78d0":"setApp(string,uint256)","194c8e15":"Update_START_ICO_TIMESTAMP(uint256)","194d0de2":"createOrder(address,uint256,uint256,address,uint256)","194d297f":"canSend(bytes32,address,uint256,bytes)","194dee32":"setTokenForSale(uint256,address)","194e10ce":"run(bytes,uint256)","194e4acd":"reqvehreg(address,string,string,string,string)","194eb01c":"CimbomCoin()","194f4795":"getItemsLength()","194f8806":"setMigrationHost(address,address)","194f97ba":"setColorGreen()","194fe9a4":"transferWithBonuses(address,uint256,uint256)","195055f1":"isTransferable(address)","19507d2c":"allowedToTransfer()","19509649":"ImpactRegistry(address,uint256)","1950c218":"checkWhitelist(address)","195199f6":"setDeadline(uint256)","1951f9ba":"isRequestPending(address)","19530f76":"multiTransferFixed(address[],uint256)","19547404":"sendTokens(uint256,uint256,address)","1954f39e":"EndDate()","195629de":"initMETToken(address,address,uint256,uint256)","195743fc":"claimSMRforAll(uint256)","19583b05":"modifyCollectorAddress(address)","1958623f":"BitcoinPluse()","1958ccb1":"setParams(address[],uint256)","195977a6":"emit(uint256)","1959a002":"userInfo(address)","195aa377":"SportsChainToken()","195ad926":"authenticate(uint256)","195b616c":"_unmountSameSocketItem(address,uint256,address,uint256)","195d06ff":"addBigPromoBonus()","195de8a1":"CapReached(address,uint256)","195e38b2":"EnergyModulationProject()","195e8688":"Osiris()","195ec9ee":"getAllParticipants()","195f4807":"getTotalPayouts()","195fa903":"ownersNum()","195fd221":"issueAmount()","19608123":"Vetricoin()","1960d761":"AccommodationCoin()","19617fe4":"coinBurnIco()","19618a9b":"testDivideFractional()","196198fa":"getDepositWithdrawCount(address)","1962d041":"SayadyToken()","1962df71":"_performTransferWithReference(address,uint256,string,address)","19638ca5":"CryptolifeToken()","1963a0d1":"OWN_freezeAddress(address,bool)","1963a693":"IncreaseAllowance(address,uint256)","1963df66":"dtGetWorldData()","1964569b":"Aktium()","1964dcbf":"SCCCOIN()","19656b46":"teansferFrom(address,address,uint256)","1965e183":"MIN_TOKENS()","19663f7f":"TransferAmountFromBankAccountToAddress(uint256,address)","196667e4":"start_amount()","1966cdbe":"pickWinner(bytes32,uint256)","19677635":"TEAM_SALE_MULTIPLIER()","19679680":"emptyInactiveToken(uint256)","19682b09":"DonationDeposited4Doubling(address,uint256)","19689e76":"paySemiFinalWinner(uint256)","1968bf4f":"getPersonalStakeUnlockedTimestamps(address,address)","1968c160":"addPaymentDetail(address,bytes32,uint256)","1969c21a":"removePixelsFromMarket(bytes32)","196be409":"DLTESTToken(uint256,string,uint8,string)","196c16cb":"tokenPriceInEth()","196c9909":"_bounty()","196cd388":"isRangeInsideRange(uint256,uint256,uint256,uint256)","196e5c46":"sellSeeds()","196ecd25":"getOwnedCount(address,uint256)","196ee9c7":"remainingCats()","196f5851":"transferAgents()","196f9aa5":"getLedger(uint8)","196fa707":"GAMEMAGICERC20(uint256,string,string)","19711d67":"campaignDurationDays()","1972172b":"satLimit()","19726b4e":"TheGoDigital()","1972b464":"emitJobOfferPosted(uint256,address,uint256,uint256,uint256)","1972c8dc":"Eggfrenzy()","19739117":"checkSignatures(bytes32,uint256[3],bytes,bytes,bytes)","1973c5de":"icoPreEnded()","1973cae7":"nextPriceDate()","1973e795":"setWorkpointSupportCancel(uint256)","197425c4":"testSupplyOf()","1974a003":"_startAuction()","1974a540":"RoundIndex()","1975a9e7":"o_deus(bytes32,bytes32)","1976804a":"TTCoin(address)","19774b86":"bulkWhitelistInvestor(address[])","19774d43":"orderFills(address,bytes32)","19775795":"aquariumCost()","1977bd68":"pepePremine(uint256)","1977f5c6":"Anubis()","197828b1":"bucketHolding(bytes32,address)","1978658b":"setCaps(uint32[],uint256[])","1978a87b":"TokenERC20()","197a1976":"setInvested(address)","197a2820":"depositarLucro()","197a9187":"NodeAction()","197b9454":"paintingsCount()","197bc336":"holderAt(uint256)","197c0f3d":"createPool(address,address,uint256,uint256,uint256,uint256,uint256,uint256)","197c3555":"getPlace(uint256)","197c418f":"MyAdvancedToken7(uint256,string,uint8,string)","197cb5bc":"balanceLockedUp(address)","197d24ad":"changeModuleOwner(string,string,address)","197ea97e":"mintAsideTokens()","197f3c29":"notLike(address)","197f8a82":"claimReveralTokens(address,uint256)","197f9508":"_getExchgAddr()","19806d8e":"s11(bytes1)","19810f3c":"withdrawShares(uint256)","19811fc9":"TPOMZ()","1981d521":"participate(uint8)","19825187":"changeMinToken(uint256)","1982640c":"walletOf(address)","1982c626":"withdrawOverpay()","1982ed58":"ChangeReuseCashInHarware(bool,uint16,uint16)","1983111d":"getTotalCompositionPrice(uint256[])","1983f4c2":"getDivsBalance()","1984a063":"StarbaseEarlyPurchaseAmendment()","1984a906":"preallocatedTokenAmount()","1984d419":"getProvisionBalance(uint256)","1985a440":"ContractRegistry()","1985acf0":"checkLimit(address)","1985f54a":"getScribe(address,address)","19863bb7":"ReDraw()","19869555":"evacuateToVault()","1986bc55":"stopBatchAssign()","1986f704":"setTrigger(address,bool)","1986fd4d":"getAccountWhitelist(uint256)","1987b887":"setTokenPorter(address)","1987da04":"secondPreSaleDate()","1987e50c":"getSellerAddressPayment(address,uint256)","1988f6fd":"didWithdrawProfit(bytes32,address,uint256,uint256)","1989a5ba":"canDoLoop(uint256,uint256,uint256)","1989d175":"YEAR_THREE_SUPPLY()","198a2085":"isATrustedContract(address)","198a5423":"presaleFundingGoalReached()","198ae785":"payTrnsTax(address,uint256)","198b5d0d":"MinimumPoStokens()","198c1f97":"getKeysfromETH(uint256,uint256,uint256)","198c548b":"supplyTokensSaved()","198df3b9":"LoginCheck(bytes32)","198e2b8a":"create(string,string)","198fa9a3":"isSigned(address,address,bytes32,uint8,bytes32,bytes32)","19901f1d":"TokenSale(uint256,uint256)","19901f20":"removeMultipleAllowedAddresses(address[])","19902b40":"changeCardAttr(uint256,uint16[5],uint16[5],uint16)","199099dc":"updateAccountState(address,uint256,bool)","1990ad6b":"private_delPermittedRoll(uint256)","1990f521":"fundings()","199156e4":"generatePresaleHouse()","1991d34a":"getDataColla_AB_02(string)","1991d6ac":"moveTokensFromSaleToExchange(uint256)","19921ad2":"AuthStart()","199317cf":"mining_uncle(bytes,bytes,uint256)","199326cb":"lastBlock_a2Hash_uint256()","1993584b":"countSecondWinners()","1994ad1e":"founderEggSupply()","19950c5b":"withdrawUnprotectedFunds(address,address,uint256,bool)","1995333b":"burnFunds(uint256)","1995b86d":"changeServerState(uint256)","199676c7":"TOKEN_RATE_40_PERCENT_BONUS()","19973261":"assigner()","19978a49":"rejectRequestUnpause()","1998524c":"updatePriceBottomInteger(uint256)","1998a5c4":"RHC()","1998aeef":"bid()","1998fb75":"addCar(uint80)","19996d50":"DinosaurFarmer()","1999cf37":"CHINESE_EXCHANGE_BUYIN()","1999eca8":"attack(uint8)","199a620a":"acceptNegotiationOwner(address)","199ba9e8":"basicFunctionReturn()","199c8b74":"SecvaultTest()","199cbc54":"totalVested()","199d70f4":"forceWithdrawRejected(address)","199d743a":"bountyTransfers()","199ed01b":"weightOf(uint256,uint256)","199f0791":"withdrawCntr(uint256)","199f4045":"NewRisk()","19a04a33":"SetDraftOrder()","19a08058":"setDelay(uint256,uint8,uint256)","19a0e572":"unverifyAddresses(address[])","19a17468":"ENS(address)","19a1b54f":"WEI_PER_ETHER()","19a1c691":"_removeChild(uint256,address,uint256)","19a1f592":"BONUS_AMOUNTS(uint256)","19a231eb":"getMilestoneDisputes(bytes32)","19a278b9":"getBAddress()","19a2bfd8":"unreadMessageCount(address)","19a32f66":"setHashByProvider(address,bytes32,bytes32)","19a3d0bb":"getMyStrippers()","19a3e3c0":"getAllRevenue()","19a50f49":"numUsers()","19a51554":"scheduleNextAuction(address,address)","19a523b0":"Violated(string,address)","19a5ce51":"oraclizeGasExtraArtwork()","19a64104":"Lockup6m(address)","19a6b356":"updateStrategyLabel(bytes15,string)","19a72fef":"DroneEmployeeROS(address,int256,address,address)","19a7e59d":"assertEq4(bytes4,bytes4,bytes32)","19a876c2":"stopPubTrade()","19a9119f":"prolongedDuration()","19a96e72":"setCarrotsMultiplier(uint8)","19a9c2f1":"generateId(string)","19aaff86":"claimAllDividends(address)","19ab453c":"init(address)","19ac2756":"TIER1_RATE()","19ac74bd":"userCampaigns(address,uint256)","19ac8c0f":"payComission()","19adda2c":"fairsaleProtectionOFF()","19ae8994":"test1(uint256)","19aec48a":"endTimeNumber()","19aec6a9":"newThreadEvent(uint256,string,string,uint256)","19af1bd9":"WeiRaised()","19af6f48":"crowdsaleTokenSold()","19afa824":"setFactoryInterface(address)","19afdfe1":"showMigrationAmount(address)","19b0297d":"info_BalanceOf(address)","19b05f49":"accept(uint256)","19b09f9b":"payWinner(address)","19b1f94b":"getLastAuditPass(address)","19b24684":"updateEntity(uint256,address,uint256)","19b35f3d":"organisationIndex(address)","19b36162":"updateParams(uint256,uint256,uint256,uint256,uint256,uint256)","19b3fa4b":"removeEmitter(address)","19b500ef":"deposit_internal(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256,uint256)","19b5176e":"memberGroupNameHash(address)","19b587ad":"putCompanyOnsale(bytes32,uint256)","19b61c09":"createSaddle1(uint256,uint256,uint256,address)","19b64015":"connectorTokens(uint256)","19b667da":"setFinalizeAgent(address)","19b6eabe":"setBounty(bytes32)","19b7b0b4":"acceptBid(uint256,uint256,bytes32)","19b7d7bd":"getBudget(address)","19b97530":"setFundariaPoolAddress(address)","19b985b3":"fixamt()","19ba0b63":"getNumberOfProjects()","19ba567c":"cancelAddOwnerRequest()","19bad1b2":"Stage1MEI()","19bb3c3d":"Reddit(uint256,uint256,bytes,bytes)","19bba58b":"_updateInventories(uint256,uint256,uint16)","19bdfc7f":"returnTokensFromHoldProjectAddress(uint256)","19be28ec":"CurrencySwap()","19be65f0":"GetBalance(address,address)","19bece1b":"buytoken(uint256)","19bee474":"totalFundsDistributed()","19bf01c0":"firstLockTime()","19c02b27":"allowTransfer(address,uint256)","19c039bc":"airDropJoin(bytes32)","19c0737f":"WineChainToken()","19c2a5b5":"auctionClose()","19c2b4c3":"getLastRequestId()","19c2f201":"GEN0_AUCTION_DURATION()","19c32e0b":"hmacsha256(bytes,bytes)","19c38c66":"inPermission(address,bytes4)","19c46f51":"kscBatchBurnWhenMoveToMainnet(address[],uint256[],string)","19c47214":"getBlockVersion(bytes)","19c4e40f":"envelopeTypes(uint256)","19c54359":"createData(uint256,uint256)","19c55a31":"SearchByGit(bytes)","19c55cea":"cancelBid(bytes32,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32,uint8)","19c5ab4b":"addAccountReader(address,address)","19c5b887":"bonusSize()","19c5b89c":"DToken()","19c5ef1b":"oneStepRate()","19c61b6f":"dealEndOffer(bool)","19c6c6cd":"THRD()","19c6eeb8":"getIPFS(address,string)","19c76700":"withdrawBankroll(uint256)","19c85a4d":"RakugoCrowdsale(uint256,uint256,address,address,address[])","19c87f1f":"toAddress()","19c8b591":"ChangeCurrencyAdditionFee(uint256)","19c97154":"getLastTicketTime()","19c9a4f3":"platformTokensAddress()","19ca6feb":"_appendSchellingSupplyChanges(uint256,uint256,bool)","19ca964c":"_isOperatorForTranche(bytes32,address,address)","19cae462":"difficulty()","19cb355d":"requiredStake()","19cbe072":"contractFallback(address,uint256,uint256,uint256,uint256,uint256,bytes32)","19cc02aa":"airdropped()","19cc1ec4":"maxContributionAmount()","19cddd4b":"hackoin(string,string)","19ce4432":"DMPhuongToken()","19ceb660":"Ticket_Price()","19d0f54d":"allowRecovery()","19d152fa":"vestingToken()","19d1997a":"supplyLimit()","19d1b6c6":"getRegistrationRight(address)","19d1d967":"MOAC()","19d2993e":"phase1DurationInHours()","19d2fe85":"_iD()","19d3237c":"setDataColla_001_002(string,string)","19d375f1":"isLeagueRosterContract()","19d3be48":"_getPartId(string,uint8,uint8,uint8)","19d40b08":"approved()","19d41c69":"ticket_price()","19d45925":"isJobHasFreelancer(bytes)","19d45a08":"launchContract()","19d46f71":"makeWeeklyInvest(uint256)","19d4c380":"setBestGuessSecondPlaceTentativeWinningPayoutDistributionHash(bytes32)","19d56f84":"BuyChestSuccess(uint256)","19d70e0b":"createSaleAuction(uint256,uint256)","19d7943a":"reLoadXid(uint256)","19d8ac61":"lastTimestamp()","19d9217c":"midTermHolding()","19d9c8df":"ScaleObs(address,bytes32)","19da8c99":"getICOStatus()","19dacbf8":"Deposit(address,bytes32,uint256)","19dad16d":"setOwnerCutPerMillion(uint256)","19dba3d2":"getBountyToken(uint256)","19dc2525":"closeChannelEcrecover(bytes32,uint8,bytes32,bytes32,uint256)","19dc831a":"withdrawHavvens(uint256)","19dd9455":"getContractTimestamp()","19ddd5a3":"_buyXname(bytes32,uint256,bytes32)","19de029a":"setBountyDuration(uint256)","19dec62a":"approveAgreement()","19e044f8":"MockToken(uint256)","19e06f20":"mintIssuerToken(address,uint256)","19e072ef":"updateStatus(bool)","19e0a0cf":"sendTokensWithLock(address,uint256,bool)","19e0eb0e":"currentBlockHash()","19e13c93":"winningTeamName()","19e1568c":"pause_1()","19e1d8d4":"Luckblocks()","19e1fca4":"allowed()","19e3897a":"UpdateUserExtraData2(address,bytes32)","19e3a1d8":"BoomstarterICO(address[],address,uint256,bool)","19e4540b":"getBankAccount()","19e5221a":"getBonusFee(uint256)","19e5bf3a":"Register()","19e5d0cb":"mintInPeriodCount(uint256)","19e66508":"ztToken()","19e6ab23":"icoDiscountLevel1()","19e6e158":"totalVotes(uint256)","19e740c0":"getNextVestingIndex(address)","19e77c34":"startSlotAt()","19e7998c":"votingInfo()","19e7fbc2":"totalEthPos()","19e82d86":"cfi_whitelist(address)","19e82e6f":"BrokerBank(address,uint256,address,address)","19e858e5":"processCollateral(address,address,uint256,uint256,uint256,uint256,bool)","19e860c1":"secondPrivateLockedAmount()","19e9e5de":"getGooProduction(address)","19ea61db":"testFailTransferDisabled()","19ea809b":"intercrypto_convert(uint256,string,string,address)","19ea8a98":"setPackSaleAddress(address,address)","19eae36b":"setMaxBlockPurchaseInOneGo(uint256)","19eaeccb":"getInfoCellLockup()","19eb4a90":"getValues()","19eb5dc6":"transferToken(address[])","19eb691a":"curUserId()","19eb8d48":"canVote(address,uint256)","19ecb310":"allocateTicket(address,address)","19eced6d":"mCURRENT_STATE()","19edc0aa":"minimalInvestment()","19ede85a":"Hydron(uint256,string,string)","19ee1f1c":"getPrizeFund()","19ee5bca":"BountyManagerEntity()","19f02ceb":"set(address,address,uint256)","19f1cded":"getStakedTeller(address)","19f1d7b0":"Kentkoin()","19f2b931":"removerAssinatura(string)","19f30aaa":"hire(uint64,address[])","19f353bb":"protectionPrice()","19f37361":"isToken(address)","19f3edec":"_released(uint256,uint256)","19f4ff2f":"setFeeRatio(uint256)","19f577b3":"placeBuyOrder(uint256)","19f8dee9":"isEthWithEnc(uint16)","19f97a46":"createContractPlace(string,string)","19fa55bd":"MinasAlbarit()","19fa8f50":"InterfaceId_ERC165()","19fa9f72":"DNNToken()","19fac8fd":"setCommissionRate(uint256)","19fb361f":"transferTo(address,address,uint256,bytes)","19fb52db":"mainPoolCutPercentage()","19fc36ed":"MIN_TRANSFER_TIMESPAN()","19fc3b9d":"getMyHolding()","19fc5b88":"minEthAmount()","19fc5dfa":"LogBeneficiarySet(address,address)","19fc9e54":"cashInvestment(address,uint256)","19fce740":"capCommitment()","19fd93f1":"unregisterSsp(address)","19feda7e":"addEmployee(address,address,uint256,uint256)","19ff1d21":"hello()","19ff7096":"cost_of_transfers()","1a000513":"getLotteryResultTotal(address)","1a0058f5":"getBatchInfo(uint256)","1a006503":"hasAlreadyClaimed()","1a009265":"setArrBoolField1(bool[])","1a013939":"gameStarted(string,uint256,uint256,uint256)","1a017f3f":"transferPrivileged(address,uint256)","1a026c96":"wallet1()","1a02af40":"tokensInAuctionsOfOwner(address)","1a038873":"FREEZE_TIME()","1a041463":"retryOraclizeSetProof(uint256)","1a04d5c5":"startingFeeBalance()","1a053713":"unblockTokenFunds(address,uint256)","1a05619b":"infoTier()","1a05ba8d":"setPI_edit_12(string)","1a06008a":"dividendFund()","1a069c72":"contribute(uint256,uint256,uint8,bytes32,bytes32)","1a0725ce":"wagerIndex()","1a0726df":"getHatValue(uint256)","1a080a7a":"placeBet(uint8,int8,uint256,uint256)","1a081330":"isSaleOpen()","1a08a7bf":"ConfigAction()","1a08b189":"setFounderAddress(address)","1a0919dc":"unregister(bytes32)","1a092541":"getDescription()","1a09510a":"index(address[],address)","1a0a8fae":"creditJackpotTokens(address,uint256,uint256)","1a0a9ac7":"KNOXV()","1a0abd34":"getMyDepositAmount()","1a0b1b86":"crowdPrice()","1a0b4656":"LiveStarsToken()","1a0bc596":"pandora()","1a0be73f":"DispatchHub()","1a0c3479":"decreaseApproval(address,uint256,bytes,string)","1a0c83f8":"buyerLastPaidAt(uint256,address)","1a0d77b9":"ClaimAmount()","1a0ddce9":"setRewards(address[],uint256[],uint256[])","1a0e722b":"LogDeliverEVN(address,uint256)","1a0f0bf1":"unrestrictedMintToPool(uint128,uint256,uint128)","1a0f2f5f":"BroToken()","1a0f518d":"updatePlayerBalance(address,int128,int128,uint256)","1a0faecf":"addNewMeme(uint32,string,string,string,string)","1a0fb847":"disperseRewards(address,uint256)","1a10cfc3":"delete_entry(uint256,uint256,uint256)","1a11415e":"PRIVATESALE_BASE_PRICE_IN_WEI()","1a120481":"enlist()","1a12e7a9":"setCreationFee(uint64)","1a144940":"codetokenIndexToOwner(uint256)","1a145c34":"getNumEthTweets()","1a148644":"newDocument(string,string)","1a14e94a":"buyAnimal(uint256)","1a14f128":"EventCreateAccessory(address,uint256)","1a14ff7a":"getD()","1a1542e6":"checkGameResult()","1a15b206":"holdTokens(address,uint256)","1a160fe9":"checkPermission(address,address)","1a170aa1":"buyTickets(bytes32)","1a1773f4":"otherchainstotalset()","1a182801":"createNewCertifier()","1a18e707":"setBlockReward(uint256)","1a197588":"availableAmount(address[3],uint256[4])","1a19b0da":"confirmEngineerQuest(address)","1a1a0d65":"distributeSRNT(address[],uint256)","1a1a0d76":"updateTopicDescription(bytes15,string)","1a1a4ed7":"HALVING_DELAY()","1a1a7993":"random(uint64)","1a1a8da8":"WebPay()","1a1aab46":"unlock_times(uint256)","1a1abe3d":"sizes(uint8)","1a1b8d08":"CompleteInit()","1a1c59e2":"setBidSubmissionProofsAdd(address)","1a1ceb11":"cloneProposal(uint256,string,bytes32,uint256,uint256,uint256,bool)","1a1dca07":"setLockFunds(address[],uint256)","1a1df394":"Play(bool)","1a1e01d5":"pushAllRemainToken(address)","1a1eea7d":"ProposalRequestSubmitted(bytes32,uint256,uint256,string,address)","1a1feae1":"txGasPriceLimit()","1a2084f1":"updateCreator(address)","1a209776":"isVerified(address,uint256)","1a21bb22":"PREVIPdeadline()","1a21c229":"gracePeriodMaxTarget()","1a2309f0":"CONTRIBUTION_MAX()","1a23bee3":"endOfROSCARetrieveFees()","1a24b91a":"setPriceFee()","1a24befc":"clearSaleSharesSold(uint256)","1a254884":"Coffeecoin(uint256,string,uint8,string)","1a256090":"sawan()","1a25e513":"upgradeProvider(address,address)","1a261fda":"scoreUp(address)","1a26ed1c":"validateReservedWindowSize(uint256,uint256)","1a2a4ab5":"withdrawDeadFund(address)","1a2a627c":"nextroundtotalsupplyGOTCH()","1a2ad007":"GetCurRoundInfo()","1a2b3431":"completeBooking(uint256)","1a2b3adf":"signedTransferFromHash(address,address,address,uint256,uint256,uint256)","1a2b4cd8":"airDropPool_()","1a2b6250":"canPerform(address,address,bytes32)","1a2c4334":"FortuneGodToken(address)","1a2c752a":"testLimiting()","1a2d3be8":"masterNodable()","1a2d72fb":"_api_PlaceBet(bool)","1a2d8629":"getinfo()","1a2e2b2c":"getHolderIndex()","1a2eaaeb":"Unicoin()","1a2f1640":"amountSecond()","1a300a98":"_setCooldownEndTime(uint256,uint256)","1a3057f3":"performAddToken()","1a30ec13":"ETHWallet()","1a311968":"roundICO()","1a3142bd":"depositAndWithdraw(uint256)","1a314552":"isUsernameExists(string)","1a31752a":"masternodes(uint256)","1a31e733":"WinningsClaimed(address,uint256)","1a327d97":"bitmask_rm(address,uint256)","1a3480b5":"rateDecimals()","1a34b59d":"OjtToken()","1a34fe81":"max_amount()","1a3538f3":"closeFailedInstallationAndWithdraw()","1a360f5f":"EWM()","1a363bf1":"giveMeTokens()","1a365f2b":"stampIndexToOwner(uint256)","1a3722b2":"grantPermission(uint8,address)","1a372eaa":"allPiranhasInfo(uint256)","1a3739ec":"getInitialReporter()","1a389eb9":"exploreFastenEMONTFee()","1a38fa06":"distributeBounty(address[],uint256[])","1a399698":"genDailySecondPrizeKey(uint8[4])","1a39d8ef":"totalAmount()","1a39e1cf":"addAffiliate()","1a3a67d8":"zGetGameID()","1a3ae67a":"getPlatBalance()","1a3b8bad":"CABoxCrowdsale()","1a3cb4f5":"getBalanceA(bytes)","1a3cd59a":"getInfo(uint256)","1a3d069b":"totalEuroUlps()","1a3d96ff":"IdentityManager(bytes32)","1a3dc39c":"getRewardPotSetting()","1a3de5c3":"_pay()","1a3e42d0":"setSignUpOnOff(bool)","1a3e5457":"validDestination(address)","1a3e91b9":"getTitle(bytes32)","1a421103":"getProperty(address,bytes32)","1a426550":"claimBounty(uint256,string)","1a429a0e":"SCND_CRWDSALE_RATIO()","1a433daf":"withdrawProposedAction()","1a437780":"orderOnFightAuction(uint256,uint256,uint256)","1a43c338":"compute()","1a44731c":"statePhase()","1a454ea6":"COMMISSION_RATE()","1a45fac7":"removeOwner(address,address,address)","1a463a7d":"amountReceived(uint256)","1a464fa1":"claimProductOwnership(bytes32)","1a470b6a":"SweepBalances()","1a476260":"indiFundAndSocialVaultDeposit()","1a4813d7":"setBaseRate(address[],uint256[],uint256[],bytes14[],bytes14[],uint256,uint256[])","1a488a60":"zpzToken(uint256,string,uint8,string)","1a48fb3a":"testDeleteLawyer()","1a49803b":"investWithSignedAddress(address,uint128,uint8,bytes32,bytes32)","1a4a1a6c":"benefactorsBalance()","1a4b746f":"CharacterRegistry()","1a4bcc4a":"validTokenBalance(address)","1a4be5d8":"HITSCoin()","1a4be6ff":"ConstantConfig(uint256,bool,bool)","1a4c24f9":"purchaseInternal(address,uint256,address)","1a4e0afd":"countBit(uint8)","1a4e1e78":"tips()","1a4e9a6c":"getWithdrawConfirmations(uint256)","1a4f5b67":"isFrontRunnerPeriodOver()","1a4fb653":"getGDemoc(uint256)","1a4fbee1":"committeesArrayIndexCounter()","1a514d97":"reActivate()","1a51a28c":"contributorsAllocation()","1a52691b":"refundForAll(uint256,uint256)","1a534fd1":"calcCanAcceptAmount(address,bool,uint256)","1a5375e1":"passTurn(uint256)","1a53cd90":"presaleBalancesLocked()","1a555b0c":"NewClonedToken(address)","1a55ad28":"_verifyProof(string,bytes,bytes,uint256)","1a55b8f7":"BACKUP_ONE()","1a582962":"isMintingFinished()","1a58349a":"fetchCreatedOrdersForPayerByAdmin(address)","1a5834aa":"start_game(string,string)","1a592bc1":"saasPayUser()","1a5ab391":"Wallet7()","1a5b189d":"NCASHTOKEN()","1a5b72c3":"endStage3()","1a5b8f96":"MAX_SITE_ID()","1a5bd7fc":"getTournament(uint256)","1a5d3b75":"getAssetIdOwner(uint256)","1a5d60bd":"removeBoard(address,address)","1a5dbe98":"iflea()","1a5e2110":"tokensPerEthPrice()","1a5e6f7d":"getOneBet()","1a5e7852":"kaliSupply()","1a5eba21":"invest(uint256,string)","1a5f9613":"DevMiningRewardPerETHBlock()","1a5f9bed":"exploreUsingETH(uint256,uint256)","1a620a3e":"AgriChainMasterContract()","1a6253ed":"ownerTransferPHX(address,uint256)","1a629b00":"AddTokensToMember(address,uint256)","1a62c928":"approveAllocation(address,address)","1a62f6f7":"escrowReturn(address,uint256,uint256)","1a63aa4d":"prolong(uint256)","1a64937b":"cleanupAbandonedGame(address)","1a64adae":"vestedTokens(address,uint256)","1a65569b":"placeBid(uint256,uint256,uint256,uint256,bytes32)","1a65d3c2":"SnakeFarmer()","1a65e283":"buyCountry(uint256)","1a668c42":"finishAirdrop()","1a67456e":"getNumberOfItemsByTypeAndOwner(string,address)","1a67d6e5":"MainSaleClosed()","1a68b1a1":"setRetirementManager(address)","1a690752":"UDCC()","1a695230":"transfer(address)","1a699085":"view64()","1a6a3c03":"GetEscrowOwner()","1a6af7b7":"currTime()","1a6b0e73":"addArts(address)","1a6b13e2":"changeMinimumTakerProtocolFee(uint256)","1a6becd6":"getAllDividends()","1a6c0983":"getShipSell(uint32)","1a6c6e38":"MagicStore(address)","1a6c9c0d":"withdrawStart(uint256[],uint256,uint256,uint256)","1a6d7561":"getFundingInfoOfPhase(uint8)","1a6dafa6":"getJackpotRoundEndTime()","1a6e2445":"changeRelease(uint256)","1a6ea411":"MANHATTANPROXY5THAVE()","1a6f1974":"disableNodeRegistration()","1a6f56a0":"balancesLocked2Y(address)","1a6fb342":"getTransferStatus()","1a700013":"inWhiteList(address,address)","1a700a95":"QWHappy()","1a701609":"HEAD()","1a70388f":"shareToWei(uint256)","1a70d015":"exchangesTokens()","1a715bcf":"lauToken(address,address)","1a71733c":"determineAllocation(address,address[],uint256[])","1a71d3db":"freezingBalanceNumberOf(address)","1a7303de":"eddToken()","1a73293d":"updateWhitelist(address,uint256)","1a750945":"vote03YesCount()","1a751b2c":"makeMonthlyInvest(uint256)","1a7626e7":"minimumFee()","1a76e30c":"BONUS_DAY2_DURATION()","1a776b3c":"reclaimSurplusEth(address)","1a787915":"startConditions(bytes32)","1a790a2c":"_setPowerPool(uint256)","1a79464e":"setFeeBurner(address)","1a799617":"revokeRound(uint256)","1a79bbef":"addAddressToMaster(address)","1a79c5de":"setTimeWindow(uint256,uint256)","1a7a98e2":"getDomain(uint256)","1a7ae0ba":"updateCostUSD(uint256)","1a7aed0e":"_checkMyAging(address)","1a7b11f5":"epoch_fund()","1a7b9fe7":"setCouponRatio(uint32)","1a7c6eb0":"getHalvingBlocks()","1a7c7105":"__load128(bytes)","1a7cecb2":"recoverAddressFromCooperativeSettleSignature(uint256,address,uint256,address,uint256,bytes)","1a7cf619":"round0StartTime()","1a7e0c50":"totalBaseLareSoldInPreSale()","1a7f8588":"IRE()","1a7facff":"rcn()","1a7fae47":"pubkeys2(uint256)","1a8012e4":"is_active()","1a809b02":"unpauseRefund()","1a81284b":"CCH_FGRE_1()","1a81a01f":"configContract(uint256,address[],uint256[],uint256[],uint256[],uint256[])","1a81c3a2":"getUserContract(address,uint256)","1a81e7b4":"getExtender()","1a82844c":"getERC721AmountPawn(uint256,address)","1a82eeb4":"ocpTokenContract()","1a833d3f":"trancheNumerator()","1a83690d":"Work()","1a841b1b":"configureFromStorage()","1a8432ea":"isUnLockedAccount(address)","1a844205":"SaintCoinWorld()","1a859db8":"rewardsAccounts(uint256)","1a85bd57":"_find(uint256)","1a85c6cb":"RandomNumber(uint8)","1a85f4fb":"UrlHint(int256)","1a85f7d2":"applySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","1a860d91":"AddUser(string,address,uint256)","1a861d26":"maxLimit()","1a86430e":"calcTotalShareRewardFee(uint256)","1a86535a":"GetWhoSignedAVersion(string)","1a86ac4f":"initialAddressSet()","1a86d5b6":"sendToOtherBlockchain1(string,string)","1a871a2c":"playerCharacter(uint256,uint8)","1a88bc66":"slot()","1a88cc31":"getCommissions(uint256)","1a88f306":"transferFromContract(address,uint256)","1a8932d9":"allocated2Year()","1a8943dd":"overflowResistantFraction(uint256,uint256,uint256)","1a895266":"unBlacklist(address)","1a8a5de1":"citizensAmounts()","1a8a85f3":"checksum(address)","1a8af7a8":"restartMint()","1a8b1874":"endprivate()","1a8c7243":"presale_finish()","1a8dc392":"checkAddressTeamTwo(address)","1a8f8f3e":"MJCCToken()","1a8fc985":"INITIAL_TOKENS_PER_ETHER()","1a9069cf":"signDate(bytes32)","1a90f0c4":"numTurnsToRevolve()","1a918bdd":"addTraps(uint256,bytes,uint256[])","1a92e6da":"Veegotoken(uint256,uint256)","1a9360dd":"checkDate()","1a93d1c3":"getGasLimit()","1a93fa4b":"reorganizeSubUsers()","1a9425c1":"verified(uint256)","1a94d49b":"BASE_BET_ETHER()","1a955061":"numToWei(uint256,uint256)","1a95bc99":"GreatHarmon()","1a95f15f":"TICKET_PRICE()","1a968069":"multiSig(bytes32)","1a974bb5":"KOCMOC()","1a97d1fa":"CLASSYToken()","1a98d0de":"whitelistedParticipantsLength()","1a991f0d":"approveSpenderDecimalAmount(address,uint256)","1a9938aa":"activateAddress(address,bool)","1a994fd2":"addVideoGame(string,address,uint256)","1a99bed2":"VestingSent(address,address,uint256,uint256,uint256)","1a9a01fb":"removeGame()","1a9a0426":"setDecimal(uint8)","1a9aa710":"ownerAuctionCount(address)","1a9aea0a":"lockTransfer()","1a9b0b7c":"isWinner()","1a9b26a2":"decode(bytes,uint256,uint256,uint256)","1a9b70f2":"destroyBlockFunds(address)","1a9be331":"getFastExtra()","1a9bf9cf":"bountyTokens()","1a9c4571":"listEggsIds()","1a9caab9":"createGen0(uint256)","1a9d64c8":"publicsale_address()","1a9df17b":"OrderPaid(uint256,address,uint256,uint256)","1a9e3e18":"ownerBuyCut()","1a9f170d":"buyIcoToken1()","1a9f66c4":"StrimTeam()","1a9faa80":"setUpdateAddress(address)","1aa022bf":"UacToken()","1aa02d59":"set_fee(uint256)","1aa05ab6":"testSellTwoTokens()","1aa19567":"interruptLastRound()","1aa260c0":"withdrawAsSupporter(uint256)","1aa359ff":"newTokenContractAddress()","1aa37733":"AudCoinToken()","1aa3a008":"register()","1aa43078":"minTime()","1aa44efd":"createNamedDistrict(uint256,string,bool)","1aa49291":"Getter()","1aa57ec5":"TokenLab(address,uint256,uint256)","1aa58bd3":"isAetherClockAuction()","1aa5b55c":"stageTwoStart()","1aa5c70e":"getDAI(uint256)","1aa6e29f":"hasOneYearWithdraw()","1aa7655c":"START_TOKENS()","1aa7e54c":"dungeonDifficulty()","1aa859d0":"remTokenPairWhitelist(address,address)","1aa86370":"updateXIPFSPublicKey(string)","1aab7bb5":"setParamsPreSale(bool)","1aab9a9f":"holderCount()","1aabaffe":"WhaleToken()","1aac38c8":"addPhase(uint256)","1aacd03c":"checkNewPlayer(address)","1aad5bc2":"_getRarity(uint256)","1aad8b82":"calculatemortiesell(uint256)","1aadadaa":"getRegistrantFund(address)","1aadcc34":"convertGreyGreen(uint8,uint8)","1aadddea":"investorGiven()","1aae3460":"investedAmountOf(address)","1aaf39ff":"check_dividend(address)","1ab06ee5":"set(uint256,uint256)","1ab08c61":"albosAddress()","1ab1025c":"tokensOutInMarket()","1ab12b10":"CurrentDevFee()","1ab268d6":"getCompleteSetCostInAttotokens()","1ab27060":"Unapproved(address,address)","1ab2935c":"VestingScheduleRegistered(address,address,uint256,uint256,uint256,uint256,uint256)","1ab30817":"gasLimitForOraclize()","1ab3a6c8":"getParentsForTokenId(uint256)","1ab3c515":"balanceOfLocked1Y(address)","1ab3d055":"removeAdminWhitelist(address[])","1ab46d4e":"referralBonusCalculate(uint256,uint256)","1ab51aec":"buyEPU()","1ab59612":"setAllowPriceLower(bool)","1ab5c5b8":"adduser(address,uint256,uint256)","1ab5d260":"transferTo()","1ab681e8":"withdrawEth(uint256,address,bytes32)","1ab733a3":"getTotalProfits(address)","1ab7df5f":"addUserTokens(address,uint256)","1ab86572":"calculateRoom(uint256,uint256,bool,uint256)","1ab8bc44":"_setMilestoneTo(address,uint256,uint8)","1ab8ff3b":"_finalization()","1ab961a1":"BSDB()","1ab971ab":"setFee(uint32)","1abb0ba9":"getTotalCurrentSaled()","1abb10e8":"chipSpeed()","1abb7192":"YCCToken(uint256,string,uint8,string)","1abca540":"Toptech()","1abd409d":"champsForSaleCount()","1abe8385":"InvestmentToken()","1abebea8":"LogSetAuthority(address)","1ac10d11":"testGreatherThanOrEqual()","1ac10f1f":"setPixelRate(uint256)","1ac14219":"testEns()","1ac25a81":"RegisterDrupal()","1ac25e99":"extractBalanceProofSignature(address,uint32,uint192,bytes)","1ac33b3d":"createTrack(bytes32)","1ac39336":"GelatoCoin()","1ac3ddeb":"withdrawFee(address)","1ac46290":"setProviderInfo(uint256,string)","1ac4754b":"redeemInternal(address,bool)","1ac47963":"functionSeven()","1ac589b4":"setJoiningFee(uint256)","1ac58dd5":"kimsCreated()","1ac5c96f":"test_4_someTest()","1ac61e8c":"testBlobCreate()","1ac68a12":"HavvenGoldSupply()","1ac7e1f9":"CollectedAllFees(address,uint256)","1ac8a9b2":"teamlock()","1ac8aa4e":"minimowea()","1ac9180e":"tokenReinvest(uint256)","1ac96124":"numOfCommon()","1ac975ed":"UcCoinPriceChanged(uint256,uint256)","1ac9f70d":"multiplicate(address)","1aca00fd":"variable(uint256)","1aca120b":"updateAnimalSpecial(uint256,bool)","1acb2719":"getNextRequest(address,address)","1acb7077":"setCentsPerToken(uint256)","1acbf6e0":"alfatokenFee()","1acc26bc":"disableLimit()","1acc478a":"getContentMetrics(address,address,bytes32)","1acc57b8":"AGENCY_TOKEN_CAP()","1acd8237":"LEK(string,string,uint256,uint8)","1ace02a3":"RaptorsvsWizards425()","1ace4d05":"bigAmount()","1ace88a4":"realWorldPlayerTokenForPlayerTokenId(uint32)","1acf6485":"requestWithdrawalFromLimit(uint256,string)","1acfd02a":"changeAdmin(address,address)","1ad065f1":"prepare(uint256,address,address,uint256)","1ad11fd1":"TrieToken()","1ad2ad1a":"stopPresale()","1ad50586":"safePower(uint256,uint256)","1ad509f0":"MUIcoin()","1ad6037f":"LEXInContract()","1ad607da":"_addUserCity(address,uint256)","1ad614c3":"setRequireAuthorisation(bool)","1ad66d21":"earlyPurchasesLoaded()","1ad781b4":"PennyGrab()","1ad7c199":"callVote()","1ad874b4":"presaleOn()","1ad8f65b":"distribute_for_founders()","1ad8fde6":"changeSymbol(bytes32)","1ad95744":"START_ICO()","1ad9f190":"getUserHotGoldBalance(string)","1ada70a8":"lockupDuration()","1adadda8":"claimLockedTokens(address)","1adb4842":"setLockup_jishis(address,uint256,uint256)","1adb631b":"distributePuppyCoinMedium(address[])","1adbdfab":"SimpleApproveTransfer(address)","1adc36b9":"doesUserOwnCeleb(address,uint256)","1add5486":"Multiownable()","1add6bcf":"getDoubleKeccak256(uint256)","1adda83a":"calculateTokens(address,uint256,uint256)","1adf2bec":"CancelOrder()","1adf2d1a":"Offer(address,address,bytes,uint256,uint256,uint128,uint256)","1adf42fb":"setPreICO(bool)","1adf692f":"_changeSquarePrice(uint8,uint256)","1ae0a693":"SetApplicant(bytes32[])","1ae0b4d0":"master5invest()","1ae0c787":"getControlInfoMaxTotalImbalanceList()","1ae2379c":"excess()","1ae32b82":"disallowReceiver(address)","1ae3a94a":"devFeeRate()","1ae3d8d0":"protectedBalance(address,address)","1ae460e5":"isInPool()","1ae4dfb7":"getcardPrice(uint256)","1ae638f7":"times6()","1ae6b6ee":"cancelAuctionWhenPaused(address,uint256)","1ae6c09c":"showMyAnimalBalance()","1ae6d375":"AirSwapToken(address,address,uint256)","1ae7341f":"OneledgerToken()","1ae743ad":"withdraw_token_and_eth()","1ae7b7fb":"jackpotSmall()","1ae7b8e1":"newOffer(address,string)","1ae7ef0a":"QISHENG(uint256,string,string)","1ae8494e":"purchaseTopCompany(bytes32,bool)","1ae879e8":"walletOwner()","1ae8ab81":"setNickname(bytes32)","1ae8fc87":"addContract(address,address,uint256,string)","1ae97bd9":"updateName(bytes32)","1ae9fe6a":"cutOffBidID()","1aea4d0f":"setMaxSend(uint256)","1aea558a":"auditReport(address,uint256,uint256)","1aeb10a6":"testApprove()","1aebcb89":"getProfitPerShare()","1aec2cf9":"Subscribe(address)","1aece0db":"PRE_SALE_END_TIME()","1aed001e":"_miningOneSelf(address)","1aed8e1e":"GigERC20(uint256,string,uint8,string,bool,bool)","1aedefda":"includes(address)","1aedf542":"ercOwnerClaim()","1aee3f91":"PRESALE_LIMIT()","1aef8058":"DECIMAL_MULTIPLIER()","1aefce3b":"ratioVote(bool,uint8)","1af11767":"CauldronsMinigamePresale(uint32,address)","1af217ab":"maxTokenPurchase(address)","1af26fc2":"isJobExpired(bytes)","1af2c9fd":"numberOfInvestors()","1af31d7b":"GetPoolEntranceFee(string)","1af32223":"get_owner(bytes32)","1af36a78":"level1(address,bytes32,uint256)","1af39907":"_inMoney(uint256,address)","1af476a6":"setEggTotal(uint8,uint256)","1af47cc7":"addSellTokensRequest(string,uint256,uint256)","1af48c85":"checkCertificates(uint256)","1af50c5e":"setDisbursementAmount(uint256)","1af5163f":"TokenBurned(address,uint256)","1af5205c":"period3Numerator()","1af526b0":"getSell()","1af5dd41":"balanceOfComision(address)","1af62808":"getLicensePrice()","1af6b60f":"ScamSealToken()","1af716ba":"transferFrom(address,address,uint256,string)","1af77842":"setE93ContractAddress(address)","1af82fbf":"viewDividendCooldown()","1af855f8":"Funding(address,uint256)","1af88bc1":"GetPatientFromAddress(address)","1af8c18a":"InitBalanceFrom961e593b36920a767dad75f9fda07723231d9b77(address,uint256)","1af97fb7":"getBabyGen(uint16,uint16)","1afa6542":"AirCoin(uint256,string,uint8,string)","1afaa8bf":"crowdfundPercentOfTotal()","1afc540d":"set_saleAddress(address)","1afcc95b":"getCCH_edit_21()","1afccfa5":"Proposal(address,address,address,bytes,bool)","1afd08a2":"setConfirmationTime(uint256,uint256)","1afd96dc":"withdrawForThreeYear()","1afe3e10":"getCurrentPhaseDivisor()","1afe56aa":"markRead(uint256)","1aff30dd":"getGameStats()","1affa814":"getProviderPriv(uint256)","1affcd7e":"createCollectible(uint256,address,uint256,uint256)","1b005a38":"authorizerOne()","1b00fe51":"testHypothesis()","1b011bd9":"test_insert_findWithHint()","1b027b44":"getBuyPosition(bytes32,uint256)","1b03316f":"getSecond()","1b044be7":"setFundScheme(uint256,uint256)","1b04803e":"contractModifierAddress()","1b04a435":"durationSecondsIco()","1b0569b2":"IPToken()","1b05aeb5":"WinMatrix()","1b05c594":"newGame(uint256,uint256)","1b05ea8c":"CheckPrepare()","1b06128b":"burnLeftoverTokens(uint8)","1b06ec3b":"getAllTransactionIdsByEntityId(address)","1b0710b5":"TOZToken()","1b073c67":"XGEToken()","1b0762bb":"remunerationBalance()","1b076edc":"dataSource()","1b07fcc1":"linkImpact(string)","1b082009":"getCrowdsaleBalance()","1b088f70":"computeLeaf(uint256)","1b08d96f":"ret()","1b0a102c":"getPrediction(uint256,uint256)","1b0a5d4e":"totalPartnerSupply()","1b0a68f2":"decreaseMintApproval(address,uint256)","1b0b906b":"getMyPlayedAmount(address)","1b0ba14d":"InvestmentFailed()","1b0c72dc":"isRecipientActive(address,address)","1b0cb61f":"_whitelistAddress(address)","1b0d320f":"FriendsCoin()","1b0db7fe":"getAllValuesSum(uint256[])","1b0dbdaf":"manualReserve(address,uint256)","1b0dc452":"isAnOwner(address)","1b0e25e2":"onInitialized()","1b0e3061":"BCW(uint256,string,string)","1b0eaf78":"stop_or_resume_Contract(bool)","1b0f5395":"ChargeNetwork()","1b0f7ba9":"proxy(address,uint8,bytes)","1b0fa385":"transfeFrom(address,address,uint256)","1b0fc106":"acceptChallenge(uint256)","1b107f7b":"storeUnlockData(uint256,address,address,uint256,bytes32)","1b112541":"getPTicketSumByRound(uint256,address)","1b118984":"TOKEN_ICO1_LIMIT()","1b12b60f":"canBuyTokens(uint256)","1b130063":"sendPrize(address,uint256,string)","1b131bbd":"_split(uint256)","1b136c6f":"getPlayerRounds(uint256)","1b13756a":"getFirstBorrowAgreement(address,address)","1b14cd05":"verifyLockSignature(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes)","1b1665ca":"updateLimitPerMonth(bytes32,uint256)","1b1686b6":"currentEthInvested()","1b17595f":"registerTrack(bytes32,uint256,bytes32,bytes32,bytes32)","1b181e58":"getOverTokens()","1b189efb":"EURsToken()","1b18f952":"test01()","1b18ffac":"random(uint256,int256,int256)","1b195a7c":"buildAddition(uint256)","1b19f6a3":"removeReferrer(bytes32)","1b1a7a58":"multiSendToken()","1b1b6069":"initEachPUST()","1b1c15d5":"tokensForInvestors()","1b1c6acf":"getUintField3()","1b1ccc47":"getDSTName()","1b1d6af8":"_PLUTOToken()","1b1d95ff":"getPow(uint256)","1b1da1af":"updateSharePrice(uint256,uint256)","1b1e5d5d":"rejectMany(address[])","1b1ef88d":"authorizedByUser(address,address)","1b1f2fb8":"preTGE()","1b203b9d":"checkAndCloseRound(bool)","1b2051f6":"tempTokensPeriodOf(address)","1b208786":"delegatedTransfer(address,address,uint256,uint256)","1b2212f5":"forbidDirectDebit()","1b23cfd2":"AceguyToken()","1b258d50":"withdraw(bytes32,address)","1b25d0e6":"POST_ICO()","1b26fa6a":"priceStep1()","1b27274b":"testPure()","1b27c873":"advisorsTokensFirstReleaseTime()","1b27c8f2":"takeBountyTokens()","1b27ca21":"MonthsProfit()","1b27e705":"_forwardFunds(uint256)","1b28591c":"escapeFunds(address,uint256)","1b28985e":"MotorToken()","1b29d70a":"weiRefund()","1b2a8715":"notIn(bytes32[],bytes32)","1b2ace9d":"lockedProvider(address)","1b2ae899":"removeModule(uint8,uint8)","1b2ae964":"BuyPriceChanged(uint256)","1b2bd803":"issueAtIco(address,uint256,uint256)","1b2be5f8":"transferredAtSupplyValue(address)","1b2bf378":"BLM()","1b2d26e9":"OwOWorldToken()","1b2d515f":"setA(bytes32)","1b2d93a0":"load(address,bool,address,address,address,address,address)","1b2dba8c":"setCertifierId(address,string)","1b2e4002":"LIZAToken(string,string,uint8,uint256)","1b2f1109":"sntController()","1b302a16":"tokenUnpause()","1b31abda":"getGameDetails(uint256)","1b31c5c2":"RESERVED_TOKENS_OPERATIONAL_EXPENSES()","1b328100":"valueToBeSent()","1b33157a":"buyTickets(uint256[],uint256,bytes)","1b33a497":"tranferToReserve()","1b33d412":"offer(uint256,address,uint256,address,uint256)","1b346a63":"testMoveWithTrust()","1b34737f":"setSCoinContractAddress(address,address)","1b347aae":"retrieveToken()","1b354a30":"kscIncreaseApproval(address,uint256,string)","1b357750":"setLegacyNFTAddress(address)","1b35f56f":"getCurrentlyRunningPhase()","1b360912":"transferTokensFromPartnersAddress(address,uint256)","1b369fad":"removeBlockListed(address)","1b36cbfc":"EtheremonDataEvent(address)","1b370abb":"getPreviousNode(bytes)","1b37cb3e":"VOCOToken()","1b3821e8":"addSentMessage(address,address,uint256)","1b385f34":"buyOmegaEgg()","1b3878f5":"addToEmployerTotalPaid(address,address,uint256)","1b391d09":"benefeciar()","1b393b9a":"emergencyRelease()","1b394dce":"_chkBuyerLmts(address,uint256)","1b397d79":"OurBank(address,address)","1b39f3d7":"timeset()","1b3a8e6f":"directionCount(int256,int256,int256,int256)","1b3a91ac":"addTiers(uint16,uint256[],uint256[])","1b3aaf06":"setRspTokenAddress(address)","1b3b5742":"PayJackpot()","1b3c72aa":"getAddressLevel()","1b3ca096":"MarketBase()","1b3d36de":"calculateToken(uint256)","1b3d803f":"TokenRegulatorService()","1b3e100d":"PRE_ICO_PRICE()","1b3e2002":"giftRock(uint256,address)","1b3e704a":"supplyICO(address)","1b3e8cda":"isEthPayable()","1b3ed722":"multiplier()","1b3efd15":"claimrefund(address)","1b3f2fd3":"checkAvailableTokens(address)","1b3f8a67":"addToSyncList(address)","1b3fddb8":"PRESALE_BONUS()","1b3ff96f":"getForecastCount(uint256,uint256,bool)","1b4032f5":"lastBlock_f7Hash_uint256()","1b40ee88":"sellArtwork(uint32)","1b411fc8":"createRound()","1b413d27":"getLuck()","1b414708":"hasDisclosureAgreement(uint256)","1b41c096":"setStartsAtUTC(uint256)","1b41c134":"UsernameDoesNotMatch(bytes32,bytes32)","1b426d8d":"LOG_ProofFailure(bytes32,address)","1b42b7ab":"decreaseSalesBalance(address,uint256)","1b42f904":"LogFreezerAddition(address,uint256)","1b437d0c":"compareLastCalldata(bytes)","1b44a5ef":"handleSingleItem(address,uint256,uint256,uint256,uint256)","1b44f449":"Chain3()","1b45c301":"assetManager(bytes32)","1b4646bf":"setReferalsMinInvestLimit(uint256)","1b464764":"withdrawAdvisor(address,uint256)","1b468ed8":"addHandlerToWhitelist(address)","1b476945":"devTokensIco1()","1b477633":"determinePlayer(bytes32[],bytes32[],int256[],uint8,bytes32,bytes32)","1b47dbbe":"IdentityVerifier(address)","1b482452":"getWinnerUrl(uint256)","1b49d82b":"joinClub(address)","1b4a2001":"minReserve()","1b4a93aa":"SetupFuseaNetwork(string,string,uint256,uint256,uint256,address,address)","1b4b1cfa":"isICOPeriod()","1b4b546f":"ChooseA()","1b4c19ac":"startSale(uint256,uint256,uint256,address,uint256,uint256)","1b4c5a10":"SupportFund()","1b4c84d2":"isTradeable()","1b4cd2de":"ICO_START_TIME()","1b4cd4ef":"depositPAXTR(uint256)","1b4d02c2":"cryptoAgent()","1b4d18c1":"rateOfSpecificTranche(uint256)","1b4f4285":"notifyNewAccount(address,address)","1b4f6c46":"acceptOwnership(bytes32)","1b4fa639":"ownerFinishContract()","1b4fa6ab":"getDefaultStackCheck()","1b503a09":"LogRmUser(address)","1b50ad09":"updateDuration(uint256)","1b5171f0":"BountyKilled(uint256,address)","1b517663":"mintPriceOffset()","1b520b68":"lethalBonusAtHitsLead(uint256)","1b52abde":"redeemRestore(address,uint256)","1b531d4b":"settings_added()","1b538bcc":"getCurrentVotes(uint256)","1b542aa7":"Swob()","1b55ba3a":"Start()","1b55c148":"BidPlaced(bytes32,uint8,address,uint256,bool,int32)","1b55ec45":"getTokenToBurn()","1b55fe4e":"setFourthAddressBalance(address)","1b561fe7":"getSeniorContract()","1b5631de":"ManualChangeStartDate(uint256,uint256)","1b5710ed":"_deleteAllPackedRevisionTimestamps(bytes32)","1b580620":"setOwner1(address)","1b58c88f":"restoreOwner(address)","1b58c943":"getNBallots()","1b5a8da6":"giveEthBankrollAddress()","1b5ac4b5":"abs(int256)","1b5ae2f7":"day0x1(address,address)","1b5c16bf":"setTargetRepMarketCapInAttoeth(uint256)","1b5c9ae3":"get_etc_balance(address)","1b5df453":"addUserWhoSell(address,address,uint256,uint256,uint256,uint256,uint256,uint256)","1b5e42f5":"amountOfUnitsOutsideAdminWallet()","1b5e75be":"evalParams(bytes32,address,address,bytes32,uint256[])","1b5ee6ae":"mintToken(int256,address,uint256)","1b5f03a6":"getRoute(string)","1b5f6cea":"P3DtoTokens_(uint256)","1b61a179":"mulbonus()","1b61f340":"finishADrop()","1b6282e3":"issuerDelegate()","1b64b172":"core(uint256,address)","1b65144d":"burnTokensForSale()","1b6527b4":"GetAssignedAddress(uint256)","1b655054":"dataAddress()","1b660f15":"EthIdentity(bytes32)","1b66303d":"request(bytes32,uint256,uint8)","1b66cb00":"setTargetToken(address)","1b672154":"setMEAAttributes(uint256,uint256)","1b677b08":"total_snt_claimed()","1b67ab2b":"StreamNetworkToken()","1b688565":"PUBLIC_RESERVED_PERSENTAGE()","1b697bb2":"setBuyerAddress(address)","1b6aa580":"developer_new_address_for_funds(address)","1b6ad60a":"transferFromWithReserving(address,address,uint256)","1b6aed05":"grant_token_from_offchain(address,uint256,string)","1b6b405c":"UnableToAcceptPayment(address,bytes8,uint256)","1b6b6d23":"LINK()","1b6b8656":"setBureau(address,address,address)","1b6bb739":"getThreeLastInvestors()","1b6bc433":"addMemberAcct(address)","1b6c104e":"marketingAllocationTokenSend(address,uint256)","1b6caad9":"setPersonaAttributes(bytes)","1b6e37ee":"thirdWeekBonusInWeek()","1b6e66aa":"rescueInvestor(address,uint256)","1b7035ea":"getAccountStatus()","1b709561":"UnlockCredits(address,uint256)","1b70a2e1":"TerpCoin()","1b72194f":"getUserDivs(address,uint256)","1b72410b":"EladCrowdsale()","1b728ed4":"getAssetRawMeta(uint256)","1b748399":"TeamCoin()","1b753dad":"Mithril()","1b75738a":"enable(address[])","1b760719":"addMember(address,string,uint256)","1b7623be":"payInterest(address,uint256)","1b76929c":"getActiveGames()","1b769e74":"testThrowsRestartNotUpdatable()","1b76dd7c":"disapprove(uint256,string)","1b773df1":"withdrawAll(string,uint256)","1b775638":"ContributionReceived(address,bool,uint8,uint256,uint256)","1b776808":"_updatePixelMapping(address,uint256,uint256,uint256,bytes32,bytes32)","1b78240f":"Fixie()","1b78e3c4":"processHunting(uint256,uint256,uint256[])","1b7949e2":"supply_increased()","1b79a2f3":"lastStageSubmitted()","1b79d406":"getWhoPiad(uint256,address,address,address,address,address,address,address)","1b7aad1b":"AMOUNT_TOKENS_FOR_SELL()","1b7b7b0d":"latiumBalance()","1b7b7c3d":"Partnership(address[],uint256)","1b7bbecb":"challengeExists(bytes32)","1b7be47e":"STQToken(address[])","1b7c058e":"getLicensePrice(address)","1b7ccc3d":"_registerLockedDeposits(bytes32,uint256,uint256)","1b7ce6f3":"disableTokens(uint256[])","1b7cf899":"recentActivity(uint256)","1b7d5f8c":"release18m()","1b7d83e5":"addDefaultOperator(address)","1b7d8aaf":"End8()","1b7db340":"sysAdmin()","1b7e0902":"getcardOwner(uint256)","1b7e78f6":"updateFirstChangeBlock(uint256)","1b7f00c1":"purchaseBundle(uint8,string)","1b800a3d":"watchPreferersTasks(address,uint256)","1b814f02":"splitFunds()","1b8202a7":"LegalContractManager()","1b825e89":"detachmentTime()","1b82f68f":"kingdomFactory()","1b83b823":"notifyPlayer(uint256)","1b841fea":"nextDerivativeTokenTime()","1b848606":"blacklistEscapeToken(address)","1b84e72d":"_createEscrow(address,address,uint256,uint256)","1b851e10":"LogDeposit(address,uint256)","1b855044":"getHash(uint256,uint256)","1b85aa49":"MIN_INVEST()","1b862027":"save(uint256)","1b8689b6":"getInvestorTokensPurchasesLength(address)","1b878f71":"setUpgrader(address)","1b87945e":"buyPointer(bytes32,bytes1[64])","1b87ccae":"getAssetIdItemType(uint256)","1b87d58a":"bonusMin()","1b88094d":"getRecipient()","1b880bcf":"KareToken()","1b89ee31":"closeBridge()","1b8a0b46":"WowDiaondToken(address)","1b8a9031":"BetPlaced(uint256,address,uint256,uint256)","1b8ab64d":"testTodo()","1b8b13a7":"getRewardPool()","1b8b3605":"setInvestorList(address)","1b8b4787":"TOKEN_SALE2()","1b8b921d":"call(address,bytes)","1b8bd57c":"getCardInfo(uint32)","1b8beafe":"BLOCK_DURATION()","1b8ca217":"getProperties(uint256)","1b8d0e60":"getMyBanker()","1b8db774":"_deadline()","1b8de48c":"distributeTCASH(address[])","1b8e61c7":"setEndTimePreIco(uint256)","1b8e94a1":"Rate()","1b8ef0bb":"getRemainingCapacity(uint256)","1b8f2610":"quickCloseChannel(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)","1b8f3d23":"krakenTicker()","1b8f5d50":"multi()","1b8f66a4":"watchedURL(string,string)","1b8fc2f0":"setAllowedAddress(address)","1b8fc6e4":"marketorsTotalBalance()","1b900c27":"anotherOwner1()","1b924b7e":"enableInterface(string,address)","1b9265b8":"pay()","1b929940":"pushIntArray(bytes32,int256)","1b92ce6b":"WOCC()","1b93aa8d":"getPackage()","1b93f66d":"claimedAirdrop(address)","1b9414ae":"itemBid(uint256)","1b94198d":"sellingAccepted()","1b94413f":"transferEth(bytes32,address,uint256)","1b949f85":"lockContractOwner()","1b953909":"authorizeOperatorTranche(bytes32,address)","1b955df4":"changeRefund(uint8,uint256,uint8)","1b962c65":"decodeCurrency(bytes32)","1b963742":"AwesomeToken()","1b968160":"wipeAndFree(address,bytes32,uint256,uint256,address)","1b96b2f9":"masterMint(address,uint256)","1b97429d":"EthToUsdChanged(address,uint256,uint256)","1b981d7f":"packedToSubmissionBits(uint256)","1b987c41":"retrieveExternalTokens(address,address)","1b98c54f":"getProviderCurveLength(address,bytes32,int256)","1b98cd68":"updateAffiliate(address,uint8)","1b98f6ac":"setProviders(address[])","1b9900b8":"userRollDice(uint256)","1b995aa7":"BitCompare(uint256,uint256)","1b998dac":"updateMCs()","1b9a91a4":"withdrawEth(address,uint256)","1b9b0b23":"KruhftsToken()","1b9bfa3a":"_oldOwnersOf(uint256)","1b9c7f31":"Werbecoin()","1b9cbdfb":"priceOfToken()","1b9ceef1":"purchaseTokenInPublicSale()","1b9d1bed":"setPOOL_edit_18(string)","1b9d4c8e":"setBudget(address,address,uint256)","1b9db2ef":"getParticipant(uint256)","1b9dbcaf":"kittensIssued()","1b9e16ad":"getAccountInfo()","1b9e9a27":"createComponent(string)","1b9f9647":"accessMyWallet(address)","1b9fec58":"getBlockToHashForResults(uint256)","1ba1648a":"changeTokensOwner()","1ba1f10b":"updateTaxPercentages(uint256,uint256)","1ba22084":"ecadd(uint256[3],uint256[3])","1ba23f1e":"setAllowedMultivest(address,address)","1ba326c4":"calcShare(uint256,uint256,uint256)","1ba39a4c":"calcMult(uint256,bool)","1ba3afd3":"getLocalGame(uint16)","1ba46cfd":"assetAddress()","1ba527d6":"gkAddress()","1ba54100":"distributeEbyteForEBYTE(address[],address,uint256,uint256)","1ba5b3e8":"currentTotalAirdrop()","1ba5e63f":"tournamentQueueSize()","1ba5eec0":"nextTurn()","1ba60f9b":"availableDgxNg()","1ba6e1bd":"externalPurchase(address,string,string,uint256,uint256,uint256)","1ba7013b":"distributedBountyTotal()","1ba83c3c":"ChargingGas(uint256)","1ba88666":"isBiometricLockedOnlyOwner(address)","1ba8ef21":"electrolightTestnet()","1ba9146e":"PethToken(uint256,string,string,uint256)","1ba91c20":"foundationMultisig()","1ba9998b":"advanceRound()","1baaeb91":"getSignature(bytes4,uint256)","1bab0908":"hasValidParam(address,uint64,uint64,uint64,uint64,uint64,uint64)","1bab8148":"fulfillMintRequest(uint256,string)","1bacbf4e":"secureTransfer(uint256)","1bacfd66":"Vote(address,bytes)","1bad1d2e":"monitorWallet(address)","1bad3903":"stakeWithCurrentPeriod(uint256)","1bad5558":"withdraw3(address)","1bad9e8f":"getUserTokenInfos(address,uint256)","1bada3c0":"closeKYC()","1badbd5c":"increaseAssuranvePayments(address,uint256)","1badfbae":"setWhitelistBallot(address,bool)","1baf1494":"QToken(address,uint256)","1baf7122":"custodyStorage()","1baf823f":"NewUsername(address,string)","1bafc373":"confirmNewHash(uint256)","1baffe38":"withdrawEtherTo(address,uint256)","1bb00447":"CryptonomicaVerification()","1bb02ffb":"MWAV()","1bb0b762":"A2ABToken()","1bb0c665":"toHexString(address)","1bb1151a":"Error(uint64)","1bb1bf2e":"team1Query()","1bb2921b":"getProjectedPayout(uint16)","1bb3fb67":"operatorSendTranche(bytes32,address,address,uint256,bytes,bytes)","1bb4067b":"checkPoolDone(uint256)","1bb409c4":"QueryBonus()","1bb460cc":"ContributionReceived(address,uint256)","1bb47b44":"appendVestingEntry(address,uint256,uint256)","1bb534ba":"fundingRecipient()","1bb58beb":"RECToken(uint256,string,uint8,string)","1bb5f0a2":"registerBarcode(bytes9,string,string,string,string,string,string)","1bb63d0c":"Nova()","1bb6cb47":"getPlayer2()","1bb73a2a":"batchCreateAuthorDrawings()","1bb797da":"isIcoStage()","1bb7c3c2":"UpdatedDonationAddress(address)","1bb7cc99":"WHITELIST()","1bb8365f":"calculateGoldBuy(uint256,uint256)","1bb96dff":"AuctionStarted(uint256)","1bbb4f63":"LogMoneyline(int256,int256)","1bbb696a":"swapContracts(address)","1bbb9a99":"claimEthers(uint256)","1bbc4b83":"ERC20Interface()","1bbc7952":"getPropertySalePrice(uint16)","1bbc99c6":"UpdateDividendPartners(address[],uint256[])","1bbce9a2":"bidState(bytes32)","1bbe1813":"getTotalSpecials()","1bbe2ff3":"TransferEtherInitiationEvent(uint256,address,address,uint256)","1bbe9d8c":"addFunder(address)","1bbec4e7":"coldWallet2()","1bbef399":"isVoting()","1bbfb029":"addTx(address,address,uint256,string)","1bbfce0e":"bidOnBreedingAuctionTutorial(uint40)","1bbfdaaf":"selectElf(uint8,uint16)","1bc0585f":"stopTokenSale()","1bc08834":"stsc()","1bc125f3":"finishMintingSTO()","1bc2dd5a":"doesContractExist(address,address)","1bc390dd":"reconfig(string,string)","1bc3c855":"setWhiteListERC223(address)","1bc41284":"uncleRate()","1bc44200":"Dasabi_ioToken()","1bc44213":"MAX_BID_FRAC_BOT()","1bc4c81b":"QuizQuestion()","1bc4cdb9":"ReceiveFund(address,uint256)","1bc4d6b2":"XXXXToken()","1bc50b05":"canUpdateNextGamePotSplit()","1bc59aa6":"bountyAllocated()","1bc5ee1a":"transfer_eth_to_contract()","1bc84458":"getAddOnSupport(uint16)","1bca179b":"RentedBlock(uint256,uint256,uint256,uint256,address)","1bca5689":"havvensReceivedForEther(uint256)","1bca7d6d":"NigelFundSum()","1bca989e":"setTokenInfoMaxPerBlockImbalanceList(uint256[])","1bcad37a":"getTotalCost()","1bcb6fa2":"snapshotValidators(uint256)","1bcbce52":"isEarlyInvestorsTokenRaised(uint256)","1bcc9b1a":"TruPreSale(uint256,uint256,address,address)","1bcd57c7":"ContributionAmount()","1bcdb8e0":"responder(uint256,uint256,uint256,bytes5,bytes14,bytes5,uint256,uint256,uint256,uint256,uint256,uint256)","1bcdd57d":"writeNextId(uint256)","1bce6ff3":"begin()","1bceeaa7":"resell(address,string)","1bcf468b":"costOfToken()","1bcf5241":"countCliTasks()","1bcf5758":"getOccupies(uint8)","1bcf659d":"getMinTalent(uint256)","1bd0c431":"updateETH()","1bd13df1":"GetSummFee(uint256)","1bd16dbf":"preSaleDuration()","1bd2511a":"addEarlyAccessAddress(address,address)","1bd27296":"_fetchCancelledOrdersForMerchant(address)","1bd2b37c":"isMasterRecruitment()","1bd2c21c":"playBigger(uint256[])","1bd2d4cc":"getNextIndex(uint8)","1bd3553e":"TheTokenA()","1bd5363c":"getBPaddress()","1bd5d127":"NaviToken()","1bd60ae9":"buyerBalance(address)","1bd61eee":"updateHeartBeat()","1bd6f596":"right56(uint256)","1bd6fb9f":"LockedFunds(address,uint256)","1bd72647":"round0Target()","1bd8b041":"PRICE_INCREASE_SCALE()","1bd8f9ca":"challengeFee()","1bd95155":"stringToUint(string)","1bd983a4":"PlaceSellOrder(uint256,uint256)","1bd9a7e7":"LogNewWhitelistUser(address,uint256)","1bd9c46e":"setImporter()","1bda6d55":"publicSaleSoldTokens()","1bda84b3":"getOfferIdsByToken(address)","1bda8781":"Taouaf(uint256,string,uint8,string)","1bdb3f65":"ZoomToken()","1bdbabdd":"registerProduct(uint256,bytes32,bytes32,uint256,uint256)","1bdbce49":"setWhitelist(address,address,bool)","1bdc4038":"_updatePurchasingState(address,uint256)","1bdd193a":"placeStar(uint8,uint8,uint16,uint256)","1bddcf48":"_asyncTransfer(address,uint256)","1bde9998":"getWhitelistStatus(address,bytes32,address)","1bde9bc1":"rebatelvlEconomy(string,string,string,string,string)","1be05289":"DURATION()","1be0717f":"_reward()","1be0f1ad":"getSpinOutput(uint256,uint256,uint256,address)","1be0f793":"USDExchange(address)","1be16003":"Answer()","1be1bf7f":"TessrX()","1be20ca1":"TokenCAP()","1be22528":"TechnicalRise()","1be3175e":"mortgage(uint256)","1be35b0c":"statusOperation()","1be4aaa1":"getTokenInfoHeritor(address,address)","1be4da5b":"MateriaPrima()","1be64997":"BucketCreated(bytes32,uint256,uint64)","1be6ce57":"decreaseOwnershipTokenCount(address)","1be6dd64":"points()","1be70510":"acceptAdoptionOffer(bytes5)","1be73e2b":"_fhMoney(uint256,uint256,uint256,uint256,uint256,uint256)","1be7c5ef":"fullfillFounder()","1be863bf":"PushData()","1be88614":"onetimeLaunch(uint256)","1be8dbfd":"dsMul(uint256,uint256)","1bea4a61":"getObjIndex(uint64)","1bea67b7":"BFDToken()","1bea69e3":"isAdmin(address,string)","1bea8006":"tokenBalanceOf(address,address)","1beafada":"PROMETHEUS_PRICE_THRESHOLD()","1beb2615":"destruct(address)","1beb375d":"proxyManagementAddress()","1beb4b5e":"fetchAllVoteResultBySnapshotBlock(uint256)","1bebf13c":"sendOrderEvent(address,uint256,uint256,uint256,address,uint256)","1bef9059":"ProtocolToken()","1befcbaf":"buyRareEgg(uint8,uint256,address)","1befd26a":"setDesignatedReporterWasCorrect(bool)","1bf028b1":"OddMoney(address,uint256)","1bf049b9":"Prediction(uint24,uint24,bool)","1bf0635b":"setGoldFeeAddress(address)","1bf1de9b":"COMMISSION_PERCENTAGE()","1bf20668":"testAdminTransfer()","1bf219de":"Faucet(uint256,address)","1bf2a90a":"totalPostIcoContributorIdsAllocated()","1bf38b28":"addAccessor(address,address,uint8,address,string,uint32,string,string,bytes32,bytes32,uint8)","1bf426ba":"Spendelotto()","1bf498b6":"registAgent(address)","1bf57f41":"salesAddress(address)","1bf5b38a":"finalizeDonation(address)","1bf5f736":"endOfDay()","1bf651ff":"YBHY()","1bf678cf":"setOtherNTech3D(address)","1bf6ba7e":"_transferFromOwner(address,uint256)","1bf6c21b":"USD()","1bf6e00d":"frozenOf(address)","1bf6e939":"accManager()","1bf703b2":"addCategory(string,string)","1bf7628b":"firstHolder()","1bf7d749":"curves(uint256)","1bf831cf":"initialOperatorValue(address)","1bf8c094":"setOwnedToken(address,uint256,uint256)","1bf983a6":"getTokenInfoMaxTotalImbalanceList()","1bf9b325":"deletePublicKey(address)","1bf9b387":"setIcoRate(uint256)","1bf9def0":"Transferable()","1bfa5d8a":"hash_pubkey_to_pubkey(uint256,uint256)","1bfa90bf":"getIntField1()","1bfaf155":"foundersWallet()","1bfb7245":"tToken(address,uint256)","1bfba595":"incrementTotalIssuerCount()","1bfc596b":"presaleBonusAddressColdStorage()","1bfc8bd1":"setRequestIdToMultiRequestId(uint256,uint256)","1bfce853":"vestedAmount(uint256)","1bfd4858":"hash_db(bytes32)","1bfd6814":"TRANSFERABLE()","1bfe0308":"removeRole(address,string)","1bfe3508":"triggerRecoveryAddressChange(address)","1bfe7831":"AllLockAccounts(uint256)","1bfe783e":"MaxDropReward()","1bfea87f":"by(bytes32)","1bff4786":"etherDeltaInfo()","1bff4bfa":"beneficiaryTwo()","1bff4c07":"LukaCoin()","1c0019c4":"getCostForTrait(uint8)","1c014c60":"casinoBalance()","1c0183e3":"TweedentityRegistry()","1c02708d":"killContract()","1c02a63d":"SetEcosystemContract()","1c0463de":"isUpgradeAllowed()","1c05123d":"LicenseIssuer(string,string,string,uint256,uint256,address)","1c054b14":"bonusRangeCount()","1c057493":"withdrawERC721(uint256,uint256,address,uint256)","1c07f0a3":"getAccountKeys(uint256)","1c080404":"contributed3(address)","1c08366b":"tokenPCT(string,string,uint8)","1c084385":"WhitehatWithdraw(address,address,address,address)","1c085a21":"totalRaiseWei()","1c088897":"MINER_AUCTION_DURATION()","1c08c08e":"claimBond(uint256)","1c09496a":"transferWithSignature(address,uint256,uint256,bytes,uint256,bytes)","1c09c194":"testInsertMultipleProductsIntoCart()","1c0acbd5":"bidOnDklSiringAuction(uint256,uint256,uint8,bytes,uint256,uint256,bytes,uint256)","1c0ad646":"coreAddress()","1c0b6367":"processTransaction(bytes,uint256)","1c0bbe26":"createAccountForUser(address)","1c0c3d33":"mintAuthorizedBatchWithBalances(address[],uint256[])","1c0ce15f":"TUBE()","1c0d1274":"setCCH_edit_21(string)","1c0de1b3":"LogResult(bytes32,uint8,bytes,bytes)","1c0e0225":"minDonation()","1c0e7109":"addFreelancer(address,uint256[],address)","1c0f12b6":"transferFrom(uint256,address,address,uint256)","1c0f96bb":"ManagerProxyTargetMockV1(address)","1c0f9a7c":"requestEURPrice(string)","1c114b38":"canReadInDataObject(address,bytes32[])","1c11fce2":"requestToken(address,uint256)","1c135881":"testHardCap()","1c1401e7":"OWNER_TRANSFER_TOKENS()","1c140bdd":"addCampaign(string,string,string,address,address,address,string)","1c14179a":"GavCoin()","1c14b340":"passMessage(address,string)","1c152982":"addEditwalletContractAddress(bytes8,address)","1c15b285":"getAmbientHumidityControlLimits(bytes32)","1c1697ae":"get_presale_arbits_per_ether(address)","1c169ba5":"closed_()","1c16c3ad":"calcAirDropAmount(uint256)","1c177502":"LogCollectEth(uint256,uint256)","1c1935ce":"getHistoricPrice(uint256)","1c196d77":"returnSubscriptionDesposit(uint256)","1c1b8772":"update(address)","1c1bc850":"changePayee(address)","1c1bd814":"TIMEOUT_TIME()","1c1c2289":"userKey()","1c1d7517":"dedeNetwork()","1c1f6a3f":"removeTokenFrom(address,uint256)","1c20be7e":"getVestingBalance(address,address,address)","1c226164":"isAddressVoted(address,address)","1c22ac19":"aprovaDevolucao(bool)","1c22b196":"TransferTRAC()","1c22f765":"zhoudayiToken(uint256,string,uint8,string)","1c232194":"refundPreSale()","1c23281c":"GZSToken(uint256,string,uint8,string)","1c2353e1":"isCertifier(address)","1c235f5f":"getHipstermasterReq()","1c238e1f":"Signum(address,address)","1c23e280":"buyTicketsFor(address,uint256)","1c249494":"setStarted()","1c24f0bd":"applyForCertification(string,string,string,uint256,uint256,uint256,uint256,uint8,uint8,uint16)","1c25331d":"setMaximumNonWhitelistAmount(uint256)","1c25f452":"topupSupply(uint256)","1c27e291":"refundCoin(address)","1c27f30b":"Lover()","1c28b99e":"pressFee()","1c296b34":"cryptiblesAuctionContract()","1c2ac59d":"sosoToken()","1c2ac5ac":"IcoStatus()","1c2b1e54":"SalesManagerUpgradable()","1c2bbd18":"exchangeTemplate()","1c2d6356":"getActivityName(uint256)","1c2e2796":"ContractCallerProxy(address)","1c2f2f9f":"recoverAndSetSecretHash(string,bytes32)","1c2f38ff":"paid(uint64)","1c30549f":"set_rand_addr(address,uint256)","1c3101d3":"addRecipient(address)","1c3122ba":"BuyStartingSnails()","1c31f710":"setBeneficiary(address)","1c321f62":"executeLottery()","1c3274ff":"PlayX10()","1c338601":"setProviderInfoFields(uint256,string,string,uint256,string,address,uint8)","1c338644":"withdrawERC20Balance(address,address)","1c350d6b":"TRLToken()","1c35b76f":"VOLUME_BONUS_CONDITION()","1c35e7ba":"manualFinalizeRound()","1c363e14":"DeathFactor_v()","1c38f800":"currentIcoSupply()","1c398075":"sellClimateCoinsAgainstEther(uint256)","1c39b5c4":"Administrated()","1c39c375":"buyUninitializedPixelBlocks(uint256[],uint256[],uint256[],bytes32[])","1c3a36d0":"addComment(bytes3,string)","1c3a5713":"getProposalExternalTokenReward(bytes32,address)","1c3a8892":"closeRoom(uint256)","1c3ad417":"getBAS(bytes32,address)","1c3b093f":"Track(address,bytes,uint256,uint256)","1c3b3b9f":"expandPeriod(uint8)","1c3bc31f":"firstPreSaleEndDate1()","1c3c050c":"genTime()","1c3c0ea8":"setExecutor(address)","1c3c295e":"registerInstitutionAsset(string,string,address,address)","1c3cbf07":"TokenTest123()","1c3cf5d0":"setEditionPackPriceIncrease(uint8,uint256)","1c3d4f20":"ChangeBalance(address,uint256,address,uint256,uint256)","1c3db16d":"currentRuling(uint256)","1c3db9a8":"approveFlower(address,uint256)","1c3de07a":"calculateCoinSell(uint256)","1c3f2f8c":"dealsNumber()","1c3f7637":"isAllowedHICAddress(address)","1c3fe22d":"GaillardCrowdSale()","1c40baf5":"EUROCASH()","1c41d143":"KPTLToken()","1c41e2db":"getEducation()","1c423713":"addPromoCode(string,bytes32,uint256,uint8)","1c4261f4":"createGift(bytes32)","1c429165":"tryRollRoom(address,uint256,uint256)","1c42959c":"maximumCap()","1c42daf7":"winMeta(address,bytes32)","1c435872":"setInterRefreshLock(bool)","1c43814f":"registerAsSlaven(string)","1c43b4a6":"initAddressAsMultiOwner(address,string)","1c43d8b1":"EndEvent(bool)","1c442754":"participated(address,uint256)","1c448231":"SDToken()","1c44bac7":"tournamentBankCut()","1c465538":"DoFee(uint256)","1c465e87":"getTopOnce()","1c467dec":"HODLrSellWin(uint256)","1c47624b":"getUserProductContracts(address)","1c480cb6":"remove(int256,int256)","1c481767":"sendfrozen()","1c484766":"aloha()","1c484a34":"enableSuperDragon(bool)","1c488825":"MintTokens()","1c490883":"MelonBitIndex_Erc223Token()","1c49b101":"_preValidatePurchase(address,uint256,uint256,uint256)","1c49d19f":"finishRoundC()","1c4ad465":"custodyFactory()","1c4b0da6":"setMinSalePrice(uint256)","1c4b1ff7":"setGood(bytes32,uint256)","1c4b774b":"getReward(uint256)","1c4b8659":"getBoardSingleSpaceDetails(uint256,uint8,uint8)","1c4bcbb0":"distributePowerToAddress(address,uint256)","1c4be509":"forkTransfer(address,address,address,uint256)","1c4bfcfe":"BoxChange(address,uint256)","1c4c710b":"getAreaIndex(string)","1c4d5608":"getSchemeParameters(address,address)","1c4d749b":"GetContractStateActive()","1c4e6cd0":"NameReg()","1c4ef6c2":"ethPriceInEuroCent()","1c4fda10":"tokenSafe()","1c50e880":"cancelAuctionHashing(uint256,uint64)","1c51a8e0":"setConfigString(string)","1c533a09":"Trupee()","1c53faf8":"backSggCoinOwner()","1c5412f7":"_computeCut(uint256)","1c54220d":"c_centsPerTokenSecond()","1c545049":"maxPresaleEDUSupply()","1c548c78":"foreignBridgeProxyOwner()","1c54e565":"getNextUserId()","1c54fbab":"getShip(uint16,uint16,address,address)","1c558b71":"ORIUMCOIN()","1c560f68":"CreatePreSale(address,uint256)","1c5633d7":"setPeriodLength(uint256)","1c566ef2":"setOperationAttributes(string,uint256,string)","1c568925":"addPendingUserListArr(address)","1c572f8c":"getICOPercentage(uint8)","1c5736ee":"add_record(string)","1c575f7f":"sendDivsToBankroll()","1c57a386":"oraclize_query(string,bytes[1],uint256)","1c581205":"targetAmount(address)","1c58c3ff":"totalMineSupply()","1c58d0d2":"_unsafeDecodeTokenId(uint256)","1c5992ff":"Zandar()","1c59a667":"disableBlacklist(address[])","1c59c177":"FCCContribution()","1c5a3942":"BPPOL()","1c5a5a58":"getRandomNum(address,uint256)","1c5a5bc4":"createShip(uint256,string,uint256,uint256,uint256)","1c5a9005":"HashRemoved(address,string)","1c5a9d9c":"activate(address)","1c5be3d7":"updateTimestamp()","1c5ca530":"IprontoToken()","1c5caa6b":"Rate9()","1c5d3c60":"stateIsWaitingProofs(uint256)","1c5d9faa":"setNickname(string)","1c5daad7":"_maint_withdrawFromPool(uint256)","1c5eaa23":"findByModuleText(string)","1c5ef50b":"Rasper()","1c5f2810":"setnewowner(address)","1c5f3176":"someMethod4(uint256,uint256,uint256)","1c5f8675":"getMyTuple()","1c5fe1a4":"TeamAmount()","1c606dd3":"GetConstructCost(uint256,uint256)","1c607f14":"setDynamicArraySize(uint256)","1c60a158":"TEAM_TOKEN_AMOUNT()","1c60f3bb":"buyEthCards(uint256,uint256)","1c61babe":"CelsiusToken(uint256)","1c61bd38":"showValue()","1c61f2bc":"fuckingClaim2(bytes,bytes)","1c623ddd":"reward(bytes32,uint8,bytes32,bytes32,bytes32,uint256)","1c624a60":"qtyInitiators()","1c624d19":"mintObizcoinTokens(address,uint256)","1c637987":"_setAuctionStatus(bytes32,uint8)","1c638376":"setProductAttributesByRegulator(string,string,uint256,uint256,string)","1c63c6c3":"setPartData(uint256,uint256,uint256[])","1c64065d":"myInfraList(address,uint256)","1c6416ad":"pubaddr()","1c65706e":"allowInvest(address,address)","1c657c63":"setEtherInUSDInternal(string)","1c668855":"getGenotype(uint256)","1c674fba":"createRandomBox(string,address,uint64,uint256,uint128)","1c67a7aa":"TransCompleted()","1c67e9a6":"setTokenStatus(bool)","1c68571d":"bonusLimit1()","1c6868c8":"adjustBonusPrice()","1c68fe82":"listProperty()","1c69ad00":"balance0()","1c6a0cf8":"GuangPengChain()","1c6a866c":"Collect_accrued_interest_and_transfer(address,uint256)","1c6b69b7":"rateCent()","1c6b7c1d":"EtherTransfer(address,address,uint256)","1c6ba386":"_claimReward(address,uint256)","1c6ce9a3":"executeSendCapital(address,uint256)","1c6d31f7":"xxx()","1c6d4575":"getTokensAmountAllowedToWithdraw(uint256)","1c6d6483":"approveMappingProposal(address)","1c6debbb":"UnionChainSupply()","1c6e3899":"getTierId(uint256)","1c6ef374":"recordingResultsOfBet(bytes32,bytes32[],uint8[])","1c6f609b":"cooperativeClose(address,uint32,uint192,bytes,bytes)","1c6f634e":"oracleItQuery(string,string)","1c70362c":"setSettingValues(uint8,uint8,uint16,uint16,uint16,uint16,uint16,uint8,uint8,uint32,uint32,uint8)","1c7040cc":"setProxyCurator(address)","1c7106e6":"setOracleAPIAddress(address)","1c7276f5":"updateLuck(uint256,uint8)","1c72e225":"transformSeedToFlower(address,uint256)","1c7307f4":"get_topl_address(address,address)","1c732d83":"centsToWei(uint256)","1c73561f":"jobCompleted(bytes16,address,address,uint256,uint256)","1c73601e":"getUncorrelatedRN(uint256)","1c74d5c8":"Successor(address,address)","1c7564cb":"DWMP()","1c75b6b2":"setDevFee(uint256)","1c75f085":"teamAddress()","1c761245":"buyDOTCH(uint256)","1c762a27":"show_Balance_of_interest_bearing_deposit(address)","1c77a4ec":"Lemmon()","1c77c58c":"collectRoundLength()","1c7a08ef":"isActivate(uint256)","1c7a39e2":"_distributeRewards(address,address,uint256)","1c7a3c9d":"setExchangeContractAddress(address)","1c7a3d31":"updateNextOrderUser(address,address,uint256,address,address)","1c7b10aa":"merkleTreeRoots(uint256)","1c7b530a":"secondTotalSupply()","1c7bfdce":"test_votingWhenCertified()","1c7d5334":"DORCoin(address)","1c7f3a96":"getMarketCreatorSettlementFeeDivisor()","1c7f578a":"mintC()","1c7f6942":"getPlayerSpaceshipModelByIndex(address,uint256)","1c7f98ca":"getRunInfo()","1c800d64":"insert_helper(uint256,bool,uint256)","1c81525c":"NitinToken()","1c81bcfb":"dividendPathways()","1c81ed15":"raiseSupply(uint256)","1c8293c4":"PriceChanged(uint256,uint64)","1c82a013":"onOffCrowdSale(bool)","1c844171":"bakkaToken()","1c8499e5":"greeter()","1c857765":"sumElements(uint128[])","1c85d890":"productListing(bytes32)","1c85ee51":"getBasicIncome()","1c8670fc":"endEarlyStage4()","1c8685e0":"WXSLToken(uint256,string,string)","1c87055f":"Fund(address,address,address,address,address,address,address,address[])","1c870eee":"setUserPermission(address,bytes4)","1c878c97":"releaseLockAgencyLock1()","1c879c47":"getMarketHashes(bytes)","1c87deec":"returnTokenDepositState(address,bytes32)","1c895915":"getNumberOfPayments(uint256)","1c89f174":"calculateUserBid()","1c8a1e20":"membershipAddress()","1c8a3821":"AllocateFounderTokens(address)","1c8a7795":"archiveText(string)","1c8c4509":"addSiteSet(uint256,uint256)","1c8ca56d":"stopSelling(bool)","1c8cba3b":"getSubjectClaimSetSize(address,uint256,uint256)","1c8ce890":"disburse(address)","1c8d25bc":"proposed_beneficiary()","1c8d51e6":"getSentAmount()","1c8d5d38":"allowance(address,address,bytes32)","1c8dddbd":"editContributors(address[],uint256[])","1c8e9a6f":"commitWork(uint256)","1c8eac0f":"endFunding()","1c8f7570":"depositLogic(address,uint256,uint256,uint256)","1c90e9cf":"testwallet8()","1c9193c0":"TakeOut(uint256)","1c91a6b9":"startExit(uint256,bytes,bytes,bytes)","1c921e16":"claimHeirOwnership()","1c92b497":"crowdsaleInitialSupply()","1c92cab2":"auto_transfect(address[])","1c931313":"setDesignatedReportDueTimestamp(uint256)","1c931439":"getLockedContractAddress(address)","1c933e2f":"multiplyDecimalRoundPrecise(uint256,uint256)","1c946642":"intellisys()","1c949bdf":"setEtherollAddress(address)","1c95b42e":"payBonus()","1c95c89d":"authorizeForToken(address,address)","1c96b242":"balanceOfReal(address)","1c96ef03":"Presale(address,address,address)","1c9713bd":"transferTobucketOneContract(address)","1c973c57":"getSpecialityValue(uint256)","1c982066":"refreshGameTime()","1c983347":"maxBidPercent()","1c98680f":"_redeemByDefaultTranches(address,address,uint256,bytes,bytes)","1c990670":"realDividends(address)","1c991783":"mintUniqueTokenTo(address,string,uint256)","1c997344":"createBid(bytes32,address,uint256)","1c9981f8":"donate(address,address,bytes4)","1c99d341":"removeParty(uint256)","1c9a5ddf":"returnBox()","1c9ab3ad":"getBlockData(uint256)","1c9ad79d":"newCampaign(string,address,uint256,uint256,address)","1c9b612e":"ledTokensAllocated()","1c9c549d":"buyEggPrice()","1c9cae74":"removeScore(uint256,uint256)","1c9cafd7":"tan(int256)","1c9cf54c":"getStockAmount(address,uint256)","1c9e9999":"migrateDungeon(uint256,uint256,uint256,uint256,uint256,uint256,address)","1c9f289d":"setCCH_edit_6(string)","1c9fbb11":"finishPreSale3()","1c9fe5d7":"BRONZE_AMOUNT_TPT()","1c9feaa5":"isExecuted()","1ca0076c":"multisend2(address,address,address[],uint256[])","1ca03b8e":"senderHasRole(string)","1ca0a28d":"multiTransfer(address,address[],uint256[])","1ca19ece":"IsaDalawa()","1ca2d6b7":"WalletChange(address,uint256)","1ca2e94a":"setPresalePhase(uint8)","1ca3630a":"updateComponent(string)","1ca3d4b7":"icoPhase4End()","1ca4399b":"DEV_TEAM_HOLDER()","1ca43cef":"ADMISSION_TIME()","1ca46d61":"bigChicken()","1ca5df03":"multiVesting(address[],address,uint256[],uint256[],uint256[])","1ca60aeb":"setMeltingContract(address)","1ca750f4":"privateSaleTokensSold()","1ca7bcc7":"toBytes32(bytes,uint8)","1ca84592":"RA(address)","1ca84efc":"secondTTaxAmount()","1ca8b6cb":"totalTokenSupply()","1ca9ad47":"createLockingTokenVaults()","1ca9fb9d":"updateContract(uint256,uint256,uint256,uint256)","1caa0c6d":"saleExchangeRate5()","1caa5ccb":"startDapp(address,address)","1caba41f":"decimalUnits()","1cabc5ed":"userVoteFor(address,uint256,uint256)","1cabc785":"getPlayerDefend(uint256)","1cabe3ef":"pethPEReth(uint256)","1cac31d7":"setAdvisorsTokensWallet(address)","1cac7b7f":"MINERTA()","1cad5a40":"depositERC20(address,address,uint256)","1cadd93e":"initPlayers()","1cae7c2f":"TransferCoinsEther()","1cae947a":"firstPrivateLockedAmount()","1caf1752":"Coinvilla()","1cafc144":"distruggi()","1cb07902":"mintMore(address)","1cb08889":"MERIDIANERC20(string,string)","1cb0d481":"transferTokens(address,uint256[],uint256[])","1cb120d6":"ENSRegistry()","1cb1778a":"setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[])","1cb20fe6":"Devcoin()","1cb252fe":"investorsTotal()","1cb2dbf6":"Reduction(string,address,uint256,uint256)","1cb3bbc0":"updateGlobalUnlockTime(uint256)","1cb3d9be":"grantEditorRights(address)","1cb5bfc4":"LogBet(bytes32,address,uint256,uint256,uint256,uint256)","1cb64196":"ethStore()","1cb6adec":"tubFab()","1cb78879":"TitleDelisted(uint256)","1cb82d79":"registrarOwner()","1cb9a02a":"calculateScore(uint256,uint256)","1cb9ce63":"makeCall(address,bytes)","1cba6f79":"_isERC721Contract(address,address,uint256,bytes)","1cbaaea7":"set_payment_details(uint256,string)","1cbaee2d":"saleStartTime()","1cbb67c4":"FooUser(address)","1cbc5ab1":"Buy(address,uint256,uint256)","1cbcb9b9":"BellaBluToken()","1cbcc77c":"test_suicide()","1cbd0519":"accountLevel(address)","1cbda93d":"p_update_mResalePlotDevPercent(uint256)","1cbea83d":"proposalReason(uint256)","1cbea99b":"getAddress(address[],bool,bool)","1cbeae5e":"winner(uint256)","1cbfbe47":"assignTokensToMultipleInvestors(address[],uint256[])","1cc0eb83":"kickcityWallet()","1cc13dff":"totalplayers()","1cc1cf46":"paymentInterval()","1cc1e7bc":"appendPacket(bytes)","1cc2502e":"auctionList()","1cc48f08":"getResolverAllowance(string,address)","1cc54204":"totalGenesisAddresses()","1cc69ac1":"assignNewParcel(int256,int256,address)","1cc6ba74":"testWIP()","1cc6ea05":"populateStringMember()","1cc6f13d":"setComplianceService(address,address)","1cc70934":"getPolicyLockedPercentage(uint8)","1cc72c04":"CheckPoolOwnership(string,address)","1cc78eb6":"RANGEEND_1()","1cc8092f":"FOURTH_TIER_DISCOUNT()","1cca13d3":"is_watched(address)","1ccb2601":"FoodWithdrawEvent(address,address,bool,uint256,uint256,uint256)","1ccc7013":"setPriceAt(uint16,uint16,uint8,uint256)","1ccd2706":"CatholicCoin()","1cce70d4":"getHowManyWinners()","1ccf6955":"getBets(uint256)","1ccf8abe":"phiWon()","1cd01e3a":"collectPercent()","1cd07895":"DmlToken(address,uint256)","1cd0b87f":"B33RToken()","1cd23711":"nouveauContrat(address,address[],uint256[])","1cd30149":"paybackRequired()","1cd3072b":"transferSub(address,address,uint256)","1cd30a3a":"randomGen(bytes32,uint256)","1cd3b754":"preICOcoinsLeft(uint256)","1cd45773":"getruns(address)","1cd58891":"requestRedemption(uint256,uint256,bool)","1cd60a85":"setFiscal(bytes32,bytes32,bytes32,uint256,uint256,uint256)","1cd732c1":"currentEthPrice()","1cd73845":"updatePremiumCalculator(address)","1cd76498":"crossForkFund()","1cd8b96c":"poolDLock()","1cd8d8a9":"checkTeam(address)","1cd95d2a":"_freeze(address,uint256,uint8)","1cda37f2":"eraseRecords(bytes32)","1cdadfae":"balanceNotEqual(address,uint256,string)","1cdb0989":"getMaxEmpruntable(address)","1cdb8571":"left2(uint256)","1cdc3f8a":"STQPreICO(address,address)","1cdc51e7":"requestRates()","1cdce200":"walletOne()","1cde0ff0":"withdrawScamEarnings()","1cde3cde":"BDIToken()","1cdeae52":"setSynopsis(string)","1cdef3ed":"agree(uint256,address)","1ce00c50":"registerUnlock()","1ce10a9d":"get_Sponsored_Amount_in_Job_By_Address(uint256,address)","1ce1e1b8":"White(address,uint256)","1ce26ecd":"addOwner()","1ce26faa":"fundingEndsAt()","1ce28e72":"getLimit(address)","1ce30927":"getOption(uint256,uint256)","1ce477d8":"createTransferEvent(bool,address,address,uint256)","1ce5e9a6":"getOption(uint256)","1ce62383":"expected()","1ce624d6":"Crypted_RPS()","1ce6717d":"CouponDeposit(address[2],uint256[8],uint256)","1ce6a810":"KBKJToken()","1ce7d9da":"ico_finish()","1ce7eff3":"bytecodeAt(address)","1ce817ab":"NoWinner(address,uint256,int256,string)","1ceb1b87":"setCanAcceptTokens(address,address)","1ceba89b":"getH3Bidder()","1cecb935":"isSignedNoEnc(uint16)","1ced2c75":"SpritzCoin()","1cedf8a3":"getDarknodeOwner(address)","1ceea715":"GetMyInvestFee()","1cef2b4e":"TokenCreated(address,uint256)","1cef3c13":"StandardTokenFreezer(address)","1cef92b1":"getRewardStatus(address)","1cf081f6":"changeProductionFee(uint256)","1cf196df":"changeCommissionFee(uint256)","1cf19ad7":"Mundo()","1cf1bb72":"releasedAmount(address)","1cf25dc9":"incentivisingAddress()","1cf28a65":"expand()","1cf28ae3":"_bonusTime1()","1cf2de25":"MinterUpdated(address,address)","1cf3d16d":"LogRegularityConfirmation(address,bool,bytes32)","1cf41a81":"deployContract(uint256)","1cf43b63":"extractExportFeeChargeLength()","1cf52f2b":"isActiveRegistrant(address)","1cf57f67":"future_round_coins()","1cf67724":"getImplChangeReq(bytes32)","1cf73c13":"setStake(uint256,uint256)","1cf74ece":"left56(uint256)","1cf91bf2":"setOwnerAtomsCount(address,uint256)","1cf9c88a":"addAction(string)","1cfa42d0":"isReleaseRecordExist(uint256)","1cfac68e":"BitSelectModerado()","1cfb4e1b":"InsureShares()","1cfb7c9a":"ifAllowed(string,address)","1cfbc7d0":"finalRewardPeriodEndBlock()","1cfc832e":"invalidateProposal(bytes32,bytes32)","1cfcc5bb":"checkGameSideAmount(uint256,uint256)","1cfce386":"calculateTarget()","1cfd11d5":"getDungeonDetails(uint256)","1cfdf90e":"updateWinnersList()","1cfe04a7":"canPay()","1cfe699e":"getFreezingSummaryOf(address)","1cfef64c":"SEELE_TOTAL_SUPPLY()","1cff272e":"show_Accrued_Interest(address)","1cff3e09":"testCreateBallotContract()","1cff79cd":"execute(address,bytes)","1cff87db":"burnMyQUATransferAndSendQUAToSomeone(uint256,address)","1d000b61":"BNT_TOKEN()","1d007f5f":"changeDAO(address)","1d010815":"createSaleAuctionERC20(uint256,address,address,uint256,uint256,uint256)","1d012c8e":"gameIsOver()","1d017b28":"setUnownedNumOfExoTokensBonus(uint256,uint32)","1d0192e1":"editEntity(address,bool,bytes32)","1d01ee9d":"BPX_per_ETH()","1d0205b8":"months(uint256)","1d029641":"rntTokenVault()","1d02fb06":"nCryptToken()","1d03842f":"onePlus(uint256)","1d048136":"setBaseStamina(uint256)","1d04c92b":"appendKeyValue(string,int256)","1d05bcb3":"dividendsRound()","1d05c57e":"_createCobeFriendWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256)","1d05d1d8":"refundContributorEnd()","1d065dde":"_transferWithReward(address,address,uint256)","1d075862":"getUpgradeProposals()","1d079c20":"IETToken(address)","1d07b797":"destroyTheUniverse()","1d0806ae":"initialPrice()","1d08837b":"setBaseRate(uint256)","1d09ba2c":"right15(uint256)","1d0a3cb8":"suspendedPayments()","1d0ba36e":"transferToPartner(address)","1d0cc1e7":"fullfillTeamAddress()","1d0ced55":"IonicCoin()","1d0d35f5":"isContributor(address)","1d0d5992":"transferBetweenUsers()","1d0e8a4d":"isShop(address)","1d0f2c99":"setTarget(uint256,uint256)","1d103139":"commissionCheck()","1d107603":"totalInitialBalance()","1d111d13":"withdrawBNB()","1d121dfe":"communityGrantsAmount()","1d123801":"airDropNum()","1d124fe4":"setUtils2(address)","1d128687":"myDividendsNo()","1d12b52f":"AKBToken()","1d130935":"isSuspended()","1d143848":"issuer()","1d14e5ff":"crowdSaleDonate()","1d153624":"CIBNLiveInteractiveToken()","1d15f317":"SUFFICIENT_STATUS()","1d16d1bb":"setComponent(string,address)","1d16d9a0":"sendETH()","1d184872":"lastrandom()","1d18ee83":"getCurrentHardcap()","1d1997a0":"lengthNotEqual(int256[],uint256,string)","1d19a56d":"claimFeeRebate(uint256,bytes32,bytes32,bytes32,uint8)","1d19a78e":"deactivateHedge(address,uint256)","1d19ffc3":"uniqueIds(uint256)","1d1a696d":"contains(bytes32)","1d1a7c32":"concat(bytes,bytes1,bytes,bytes1)","1d1ac66a":"signOut(address)","1d1ada90":"manuallyAssignTokens(address,uint256)","1d1ca65b":"BROKER_RESERVE_ADDRESS()","1d1cc622":"CurrentDistribPublicSupply_()","1d1ce884":"VoteCommitted(address,uint256,uint256)","1d1eda5e":"setBonusesForTimes(uint32[],uint32[])","1d1eff42":"AccessRevoke(address)","1d1fe108":"burnInvestorTokens(address,uint256)","1d209605":"Controllable()","1d20a9c9":"setCardActive(bool)","1d211d74":"tokensToSale()","1d21f252":"getInvertedPrice(address)","1d231b2c":"_blackListed(address)","1d24190c":"GetGiftInfo(string)","1d24310d":"setTransferMode(bool)","1d2531f3":"is_alive()","1d25a5eb":"CGToken()","1d25bba2":"addSomeCWCsTo(address,uint256)","1d25c1a5":"get_remaining_quantity()","1d2627bb":"setEidooWallet(address)","1d263b53":"callSecondTarget()","1d263f67":"flip(bool)","1d27769f":"participate(string)","1d289e57":"regulationsFulfilled()","1d291990":"getNumberOfBid()","1d293500":"gamePayOutWinner(address)","1d296e8d":"geneLabAddress()","1d29de63":"clearAllCandidates()","1d2a6dcf":"getNumArchers()","1d2aa5b3":"skip()","1d2aabcb":"MicroBitcoinToken()","1d2af28b":"pay055loyal(address)","1d2b63bf":"GetNumber(address,uint256)","1d2b7155":"activateImportFeeChargeRecord(address)","1d2b8d96":"MintICO(address,address,uint256)","1d2bca17":"MyToken(uint256,string,uint8,string)","1d2bf543":"fetchCoinAge(address,address)","1d2c1b59":"query(uint256,bytes32,string,string,uint256,uint256)","1d2d4c34":"test_assert()","1d2d8400":"delegateToNewContract(address)","1d2d86dc":"setChecksum(bytes32)","1d2d9b06":"raiseEvent(string)","1d2dbb22":"CancelMyInvest()","1d2e18cd":"stageOneStart()","1d2e2cc4":"ENS()","1d2e5a3a":"setSale(bool)","1d2eda60":"DIUToken()","1d2ee278":"Angel()","1d2fd267":"getCarCurrentPriceAuction(uint32)","1d2fed16":"updateRates(bytes4[],uint256[],uint256)","1d300421":"NuruToken(uint256,uint256,string,string,uint8)","1d30d3db":"Transfer(address,address,string,uint256)","1d3231d4":"totalCommitted()","1d32a70c":"upgradeMining(uint256,uint256)","1d32ab99":"originTransfer(address,uint256)","1d32f106":"openZoneTeller(bytes2)","1d32f29a":"SetDescript(string)","1d33267a":"revokeGrant(uint256)","1d333265":"_removeCryptantFragments(address,uint256)","1d3390a1":"carefulSendWithFixedGas(address,uint256,uint256)","1d34be47":"updateRefund(uint256,uint256,uint256,bytes32)","1d34cf60":"getNumSuppliers()","1d351f53":"decreaseAllowanceToken(address,uint256)","1d356eef":"getDepositEtherForAddressValue()","1d3639ec":"preDGZTokensSold()","1d365669":"transferDirectoryToken(uint256,address,uint256)","1d36e06c":"tokenIndexToOwner(uint256)","1d36ee16":"RBC(uint256,string,string)","1d376a44":"PriceOracle(uint256)","1d3795e8":"startFreeGet()","1d37c8a6":"setPurchaseRate(uint256)","1d381240":"addKey(bytes32,uint256,uint256)","1d38869b":"ShopiBlock()","1d38bebd":"isInitialAuctionEnded()","1d38e433":"gasForIAD()","1d38fcda":"freeze(address[])","1d3a5dbe":"requiredPrefix()","1d3b9edf":"times(uint256,uint256)","1d3ce58d":"currentMintable()","1d3d4c0b":"make_contact(bytes32[])","1d3d93d4":"activateCurrency(address)","1d3e2d1b":"changeFriend(address,address)","1d3e43c8":"VCcoin()","1d3e904e":"BasicSPIKE()","1d3f6f1b":"setFounderMultiSigAddress(address)","1d3f864b":"campaignCaptain(uint256)","1d3f90c6":"bonusUnlockTime()","1d40bbcf":"_addMember(address)","1d411612":"EthernetCashAddress()","1d4233b9":"flushEth()","1d42cf72":"nochange()","1d433d52":"_getbonusRate()","1d43776e":"rngAddress()","1d43b653":"submitTransaction(address,uint256)","1d43cc98":"increaseTotalSupply(uint256)","1d4494f1":"changeApiUrl(string)","1d45e9e1":"notEqual(uint256[],uint256[],string)","1d461b83":"airdropMDL(address[],uint256)","1d47ae34":"YShare()","1d47f8c1":"getApprovals(address,uint256)","1d480d8b":"addRefBonusWithRefs(address,uint256)","1d49e081":"EXECUTE_EXTRA_GAS()","1d4a48b7":"Start7()","1d4a9209":"initializeTokenSale(uint256,uint256,uint256,uint256,address)","1d4ac2b6":"yearteam()","1d4b0796":"updateTxStats()","1d4b11e4":"ownerOfLandMany(int256[],int256[])","1d4be3df":"getFoundAddress()","1d4c8e5d":"removeAddressesFromBonuslist(address[])","1d4cecaa":"setInfo(uint256,bytes32,string)","1d4d691d":"fill(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)","1d4d8656":"donateAuthor()","1d4d8808":"_getFeeHistory(uint32)","1d4eaf06":"StoreFile(uint256,bytes32,string,string,string,string,string,uint256,bytes)","1d4f2c6d":"setMythicalGravatar()","1d4f3e8b":"getCLottery()","1d4f9bbf":"NewTTL(bytes32,uint64)","1d50169c":"sendToken(address,uint256,uint256,uint256)","1d511879":"buyTokensPresale()","1d523047":"COMMUNITY_TOKENS()","1d523107":"SOFT_CAP_IN_TOKEN()","1d52573f":"set_address_B(address,address)","1d532a97":"increaseAssetsCertified(uint256)","1d5407aa":"helpCoinAddress()","1d5459f7":"updateFundAddress(address)","1d545d09":"crowdsaleEndTime()","1d54ab74":"_getRateIndex(uint256)","1d570166":"previligedAddApproval(address,address,uint256)","1d57bcf7":"ProofLibInterface()","1d590771":"TeuToken()","1d598d10":"BitcoinBlue()","1d59cde3":"retrieveEarnings(address)","1d5a9f3f":"object_types(uint256)","1d5aca61":"ZITRON()","1d5b26b1":"presaleMarket()","1d5b9efe":"mintAfterSale()","1d5c7ef5":"getPaymentToAddRemoveCountry(string,bool)","1d5de3fb":"ECOToken()","1d5e3350":"transferReservedTokens(uint256)","1d5e3f6d":"sumOfN(uint256,uint256,uint256,uint256)","1d5ea379":"newUserFrom(address,string,string,string)","1d5f624a":"unPaidBurnTokens(uint256)","1d5fe710":"finalizeCurrentStage()","1d60208a":"TrezorMultiSig2of3(address,address,address)","1d60993b":"stakeScale(uint256)","1d62a312":"thirdPreSaleDate()","1d62a40f":"DungeonChallenged(uint256,address,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)","1d62c5bf":"PublicSold()","1d6456c4":"_transfer(address,address,uint256,uint256)","1d645b12":"getEventInfo(uint256)","1d6477e1":"reclaimableLand()","1d64976b":"HBCM()","1d65551d":"updateRenExSettlementContract(address)","1d659153":"CanObtainChip(uint32)","1d65d60e":"PRE_ICO_MAX_TOKENS()","1d66105b":"buyDrangon()","1d66ff8e":"getInvestorDividends(address)","1d68463e":"CreateSWP(address,uint256)","1d68b449":"crowdClosed()","1d6916ab":"buyTicket(uint256,uint256,string)","1d693910":"Piezochain()","1d69ccdc":"SuccessfulVote(address,bytes32,bytes32)","1d6a8bda":"enableTokenTrade(address)","1d6b5d2c":"setDnaMixerAddress(address)","1d6b867c":"getGamePlayer(uint256)","1d6c0dfa":"setActiveHero(uint256)","1d6c263c":"Election()","1d6ca15d":"Presale(uint256,address,address,address,uint256,uint256,uint256,uint256)","1d6d8d60":"modifyMilestoneTo(address,uint8,uint8)","1d6f5e03":"PubkeyChanged(bytes32,bytes32,bytes32)","1d6f757d":"withdraw(uint256,uint8,bytes32,bytes32,uint256)","1d6fe151":"ROSCtoken(uint256,string,string)","1d704684":"setBinanceCoinPrice(uint256)","1d706777":"getCertifier(address)","1d7099d3":"payFromAllowance(address,address,address,uint256)","1d709ab4":"set_transfer_gas(uint256)","1d718288":"referralTokensAvailable()","1d71929d":"MIAMIcoin()","1d71a1cd":"newIncome(string)","1d724a7a":"getFounderStatus(address)","1d731345":"calculateRoom(uint256,uint256,uint256)","1d7315cc":"storedAmount()","1d732304":"generateRand(uint256)","1d73268a":"PHDToken(uint256,string,string)","1d733337":"participantRegistered(address)","1d73fb93":"autoTransfer(address,uint256)","1d747131":"getTotalApprovers()","1d74c1a8":"_addToFund(uint256,bool)","1d74f3a5":"DIRT()","1d75493a":"setWinnerPlaceDistribution(uint256,uint256)","1d755c8d":"recieveVote(address,bytes32)","1d759214":"minMinBuyETH()","1d75a4b9":"viewAuthorized()","1d7630f0":"signedTransferFromCheck(address,address,address,uint256,uint256,uint256,bytes32,address)","1d7747d1":"addAuthByCode(string,string)","1d777856":"tokensForBurn()","1d7786e3":"numToksSwitchedOver()","1d77d696":"setMockUint256(bytes4,uint256)","1d780960":"pauseGame(uint256,bool)","1d786cd0":"widthdrawEtherDelta(uint256)","1d7876e7":"transferBack()","1d78ca63":"AuctionClosed(address,uint256)","1d790c99":"parseData(bytes,uint256)","1d7915ad":"setSeed(uint256,uint256)","1d793e9a":"batchChangeChannel(address[],uint256[],uint256,uint256)","1d7add35":"appendPricePoints(uint64[])","1d7b46b2":"tokensPurchasedTotal()","1d7b5baf":"setUint(int256,bytes32,string,uint256)","1d7b6d58":"forkAndRedeem()","1d7bb2db":"CasinoCoin()","1d7bc449":"getCeleb(uint256)","1d7c5cd1":"userServicesLength(address)","1d7c8894":"issueGoldTokens(address,uint256)","1d7ca2be":"subAddressToWhiteList(address[])","1d7d1f17":"BFX()","1d7d8d2e":"EthereumPoint()","1d7e1f68":"getContentRank(address,uint256)","1d7f2e0c":"SecondNode(address,string,string)","1d7f8039":"mineMany(bytes32[])","1d7fb62f":"initVote(uint256)","1d80009a":"rootHash()","1d80e62a":"changeTransfersPaused(uint256)","1d814480":"provideInfoCourseBaseOnIdStudent(uint256)","1d81564d":"minutesInPeriod()","1d819ef0":"testEqualityAddr()","1d82e9c7":"EXTRA_GAS()","1d833aae":"drop(address,address[],uint256)","1d834409":"totalOrders()","1d834a1b":"insert(uint256,uint256)","1d836ae9":"EQUIEX()","1d83e3a9":"withdraw_(address)","1d846f5c":"currentCancellationResults()","1d849220":"getTokenSaleTime()","1d84f303":"ETPC()","1d8557d7":"updateState()","1d862a81":"getPop(uint256)","1d87614a":"OPTION_POOL_PERIOD()","1d87a65c":"createBattleboard(uint8)","1d88c05b":"successorAddress()","1d898f52":"IM()","1d89dbc9":"updateExchangeRate(uint8,uint256,uint256)","1d8a8db9":"ethRaisedAddress()","1d8aa5ec":"currentSettlementPhase()","1d8acf1b":"getBoolValues(bytes32)","1d8adb7a":"setMaxUserPayment(uint256)","1d8ae626":"Security(string,string)","1d8b13a6":"setPersonal(address)","1d8b4dd1":"createContractExoplanet(string,uint256,uint32,string,uint32,uint8,string)","1d8b70da":"order_received(string)","1d8bab91":"RDN()","1d8c61c0":"setTMEXAddress(address)","1d8c7c20":"internalSellTokenFromAdmin(address,uint256,bool,uint256)","1d8ceb44":"extractClosingSignature(address,uint32,uint192,bytes)","1d902fe9":"currentBonusRate()","1d9046ce":"transferShip(uint32,address,bool)","1d90824b":"getMinPrivateSaleCompanyBuy()","1d90c509":"cardPresale(uint16)","1d91bd9f":"transferPaymentAddress(address)","1d927f21":"userDraw(uint256)","1d93d8d9":"WaboToken()","1d9400c2":"ManagerProxyTargetMockV3(address)","1d9680a7":"oldWriteMessage(string)","1d96d4c9":"VIRES()","1d976e05":"transferMultiple(address,uint256[])","1d978f9e":"ContributionRegistered(bytes32,address,uint256)","1d981758":"__signatureIsValid__(address,bytes32,uint8,bytes32,bytes32)","1d98532f":"_computeTournamentCut(uint256)","1d98f3c5":"safeTransferChild(uint256,address,address,uint256)","1d991ffe":"IsBoilerValid(address,uint256)","1d9976e9":"LedgerRandomProofVerifier()","1d9b0783":"withdraw(uint128,address)","1d9b1d6f":"schedule(uint256,uint256)","1d9b1d85":"ReFund()","1d9bd2b9":"totalSoldOnICO()","1d9becf5":"CatAdopted(bytes5,uint256,address,address)","1d9caa69":"sendMessage(address,string,string,uint256)","1d9cfd6d":"setSale()","1d9d1bdc":"buyTradeConfir()","1d9e6c34":"compose(string,address,uint256[])","1d9f3cb5":"changeSaddleShopPrice(uint256,uint256)","1d9f68ad":"updateMaxBonusTickets(uint256)","1da05199":"hasAvailableCard()","1da09dd5":"getUserActionOnStory(bytes12,address)","1da0fb1b":"updateSettings(uint256,uint256,uint256,uint256,uint256,bool)","1da16e8b":"FirstSaudiToken()","1da26a8b":"setToken(address,address)","1da2d92b":"IDRT()","1da3f151":"presaleVolumeBonus(uint256)","1da4eb7a":"_secondUnlockAmmount()","1da4ed85":"setRewardPool(uint256)","1da55b9f":"YeedToken(uint256,address)","1da5f94d":"acceptableAddress()","1da6822c":"testThrowsTransferEnableNotTransferable()","1da74e77":"wtToken()","1da790a1":"showTopWinners()","1da83550":"setWinner(address,uint256,uint256,uint256)","1da83eab":"canDefrostReserveAndTeam()","1da88cbe":"getNew(address,bytes32)","1da93873":"baseTokenPrice()","1da97544":"ETHtoZWeirate()","1da97f36":"HunterCoin()","1da98538":"totalMEATonsClaimed()","1da9ea0c":"hardCapInTokens()","1daae314":"secondStagePriceOfTokenInWei()","1dab2271":"setSuggestedAdPrice(uint256,uint256)","1dacad8a":"CentralizedOracle(address,bytes)","1dacd8fd":"buyDisciple(uint256,uint256,uint256)","1dad202f":"ctz64(uint64)","1dad57fa":"notifyCollateralNotReturned(uint256)","1dad63e4":"ERC20Standard(uint256,string,bool)","1daee82d":"secondLockAmount()","1daf779f":"SDpay(uint256,string,uint8,string)","1db021c0":"mintedCoins()","1db046ad":"OneToken()","1db05ab8":"FXNOW()","1db087db":"_setAllocation(address,uint256)","1db0ad5a":"firstUnlockTime()","1db0ffe9":"ECHARGE()","1db19959":"RATE_SALESTAGELAST()","1db1c805":"setDefaultReputationForManufacturer(bytes32,bytes32)","1db256e4":"WCCCOIN()","1db29a20":"getPlotInfo(uint256)","1db2ea77":"_91_MR()","1db38da2":"ClaimExecuted(uint256,uint256,address)","1db4012d":"newProject(string,string,uint8,address[],address)","1db4b07f":"rntToken()","1db4d7a2":"returnBalance(address[2],uint256[8],uint8,bytes32[2])","1db580fa":"foundersAllocation()","1db5ca3b":"becomeAgent(uint256,uint256)","1db5f974":"highBonus()","1db625c3":"newInvestCommission(uint256)","1db71ffb":"doLoops(uint256)","1db834f0":"NextDouble(address,uint256)","1db87be8":"receivingAddress()","1db890a6":"getCassetteSize_()","1db894fc":"signToApproveTokenControlInfo()","1db93968":"transferProperty(uint16,address)","1db9ec2c":"ENDDATE()","1dba92ab":"setKeys(address,uint256)","1dbb0bff":"buyBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32)","1dbb9867":"buyEggFee()","1dbbda4d":"bytesToUint(bytes20)","1dbc04ae":"setVestingToken(address)","1dbcc5ad":"RiesGraham()","1dbd21c3":"Daereum()","1dbdd617":"LILITHCOIN()","1dbdd792":"MIDGRADE_TYPE_COUNT()","1dbde6c7":"maxTokenSupplyICOEND()","1dbe342d":"TRND()","1dbe6508":"bobClaimsDeposit(bytes32,uint256,uint256,address,address,bytes)","1dbf3bc7":"spend(uint256)","1dbf79a3":"TicketGlobalChain(uint256,string,string)","1dc05f17":"subtract(uint256)","1dc0819e":"_isBreedingPermitted(uint40,uint40)","1dc1166f":"horseSold(uint256)","1dc17cce":"VALUE_DISTRIBUTION_KEY_OWNERS()","1dc18c45":"editNode(uint256,address,bool,address,uint8,bool)","1dc18f7a":"hashAmount(uint256,uint256)","1dc1c5e3":"payMoney()","1dc30bdb":"payJackpot5()","1dc3ac22":"setOwnerNickName(address,string)","1dc436cd":"getIDChildRelationshipCountOperationParentProductPositionReferenceBinding(string,address,uint256,uint256)","1dc45248":"getMoveCount()","1dc45c6d":"spenderDecreaseApproval(address,uint256)","1dc55c2d":"GetDividends(address,uint256)","1dc615bc":"checkIfAllARTDistributed()","1dc76e78":"buyPlayerDataRecord(uint256,uint256,uint256)","1dc7f1b4":"getaddressname()","1dc82285":"oldBalance()","1dc8a3bb":"B123Token()","1dc9186a":"updateWeiAmountShare()","1dc9a3b9":"transferDomainOwnership(bytes32,address)","1dc9bb48":"hasDividends()","1dcb0d36":"goBackToPreSale()","1dcb304b":"fipsGenerate()","1dcb66ff":"coordinatesOf(uint256)","1dcd0305":"toStr(bytes32)","1dcd5312":"editMessage(string)","1dcd9b55":"substring(string,uint256,uint256)","1dcdf215":"getCoursesCount()","1dce0b5c":"getNoteKeysCount()","1dce77b8":"Linkmanagement()","1dce79cf":"blockchainExchange(uint256,int256,bytes32)","1dcea427":"erc20token()","1dd0c71b":"myPendingPayment()","1dd1349d":"getNameHash(bytes32)","1dd14317":"setProtocolVersion(address,bytes32)","1dd14a96":"totalSupplyPaillier()","1dd15fca":"tokenInWhiteList(address)","1dd16db6":"customBonus()","1dd17e7d":"setPreSaleParameters(uint256,uint256,uint256,uint256,uint256)","1dd300ce":"lastWithdrawal()","1dd46c1e":"getTxCount()","1dd4914b":"withdrawEtherOrThrow(uint256)","1dd49208":"getFeed(uint256,uint256,uint256)","1dd49cae":"remWhitelist(address[])","1dd5301a":"PRICE_PREBUY()","1dd572a0":"fortune_sell(uint256,uint256,uint256)","1dd637d8":"emergencyProtectedMode()","1dd6f85e":"CreateLOK(address,uint256)","1dd72454":"TransferManual(address,address,uint256,string)","1dd7335c":"allocateDividendsToWinners(uint256,address[],uint256[])","1dd7cf6d":"getHumanInfo(uint256)","1dd80586":"getPlayerSpaceshipBattleStakePaidById(uint256)","1dd85687":"adminSetEnviroment(uint256)","1dd8f053":"minPriceInWeiForIco()","1dd95a98":"AIRDROPS_COUNT()","1dd9a3cf":"_sendEthereum(uint256)","1dda5c7d":"testFailSubBalanceBelowZero()","1ddabf7a":"friends(address)","1ddb9105":"creditVault(uint256,address,uint256)","1ddc0ef0":"audit()","1ddd303d":"setV_R3(uint256)","1ddd39cc":"addcoinslimit()","1dddbf07":"confirmExchange(address,uint256)","1ddde716":"advisorsAccount()","1ddf147f":"assignedDoublrContract()","1ddf9729":"IncomeTaxCalc()","1ddfd7db":"supportsTradingPair(address,address,bytes32)","1de012cd":"TRUST()","1de032a5":"setIsStudio(address,address,bool)","1de0e877":"proposedControllerPendingUntil()","1de14175":"setDelegadoDeEscuelaVerify(bytes32)","1de1441f":"remainingEPXSupply()","1de1ee7b":"addPublicKey(bytes32,address)","1de21b76":"P1()","1de22867":"BeatTokenPurchased(address,address,uint256,uint256)","1de250bf":"bless(string,uint256)","1de26e16":"deposit(bytes32,uint256)","1de271a4":"cap_tmx()","1de28857":"getShareBalance()","1de38038":"makercoin(uint256)","1de3d4b9":"ReleaselockAddress(address)","1de4334a":"get_time_locked_contract(uint256)","1de46a78":"admin3()","1de473ea":"setC4FContractStatus(address,uint8)","1de54fcd":"unlockedNowBalanceOf(address)","1de7f3e3":"setBankrollpercentage(uint256)","1de95d74":"AREFWallet()","1de98d93":"deleteUserByEmail(bytes32)","1dea0c57":"getRealBet(uint256)","1dea157f":"getPaintingArtist(uint256)","1dea3f0c":"recordOffchainPurchase(address,uint256,uint256,string)","1dead827":"_percentSoldInICO()","1deb0a8f":"changeState(bool)","1deb112b":"initialSupplyPublicPreICO()","1deb9b9e":"EventBid(address,uint32)","1debbe2f":"addExp(uint256,uint32)","1dec8585":"getCurrentStageByTime()","1ded2d87":"Transaction(address[2],bytes,uint256,bytes32[2],uint256[3],bytes32[3],bytes,bytes)","1ded319d":"numberOfClaimed(address)","1ded587c":"Hotlist()","1dedc6f7":"consume()","1def4c9d":"TransferToBTCoE(uint256)","1def5033":"taskArray()","1df0187b":"BONUS_AMOUNTS_VALUES(uint256)","1df025d6":"updateGoalCheck()","1df0e359":"createForecasting(uint256,uint256,uint256)","1df13f28":"ICOBonusPercent2week()","1df19259":"Khabayan()","1df1ec82":"getProviderOwner(uint256)","1df224c1":"privateToken()","1df2bcbc":"setPresaleCont(address)","1df36e63":"delInvestor(address)","1df3e8a9":"GuardaProva(string,string,string,string)","1df411a6":"setOfferTime(uint256)","1df4241f":"StatEvent(string)","1df473bc":"newContract(bytes)","1df47aad":"ReplayProtection()","1df4ccfc":"totalFee()","1df4f144":"multiply(int256)","1df5a8f4":"GlobalBTC()","1df5e755":"Etherandom()","1df68102":"createSellOrder(uint256,uint256)","1df6d86e":"_buyLeader(uint256,uint256)","1df73f51":"getFreeSperm()","1df87cad":"raiseBuyOrderCancelled(address,uint256,uint256,uint256,uint256,uint256,int160)","1df8eaa2":"showAuthorizerTwoAmount()","1df93558":"fundingStartTime()","1df95786":"envelopes(uint256)","1dfa0cf6":"ConfirmDispose()","1dfa3ca8":"thirdPartyInvestments(address,uint256)","1dfbf227":"makeInvestment(address,string,uint256,uint256)","1dfc91d4":"TokenPresalePurchase(address,uint256,uint256)","1dfd04b9":"buyEmptyPixel(uint256)","1dfd1ddd":"ListNotValSince(uint256)","1dfde4a5":"test_insert_findWithHintPrevAtPosition()","1dffa3dc":"cancelJob(uint256)","1dffd012":"getUserManager()","1dffdbe6":"trade(string,uint256,uint256)","1e0018d6":"investor()","1e010439":"getBalance(uint256)","1e0197e2":"tournament()","1e01a0e6":"doit(address)","1e01a172":"issueDescription(uint256)","1e021b2b":"getproductstatus()","1e02bf62":"checkOutstandingQueries()","1e02f805":"newInvestment(address,uint256)","1e031a00":"QuickFlip()","1e0419d4":"finalWinner()","1e04e856":"depositEth(address,address)","1e04eee9":"mintChipUnsafely(uint256,bytes32)","1e0582e9":"_daysFromDate(uint256,uint256,uint256)","1e05e0c8":"bonusesForTimesCount()","1e0610f6":"getRealty(address,uint256)","1e063d98":"MRDSTSCoinToken()","1e06c41f":"saleStartUnixTime()","1e06e25e":"Zoo721(address)","1e075aba":"batchUnlockVestedTokens(address[])","1e08045d":"getOwnedTanks(address)","1e084558":"licenseInfo(uint256)","1e095eb3":"GHPToken()","1e0976f3":"receiveVerification(uint256,uint256,uint256,bool)","1e09e67b":"Rasthen()","1e0a0f60":"info_CanBeClaimed(uint256)","1e0a24b1":"revertIfReturnLessThanMin()","1e0b760c":"Cancel(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)","1e0b8c87":"hasSkills(address,uint256,uint256,uint256)","1e0c60e2":"SGem()","1e0c7ed4":"setConfigBool(bytes32,bool)","1e0e17a2":"claimMistake(bytes32)","1e0e3925":"numElements()","1e0efae1":"claim_devidend()","1e0f6ed8":"TokenSaleFinished(uint256,uint256,uint256,uint256)","1e0f9795":"getNewFib(uint256)","1e11764e":"GameFinished(uint256,uint256,string,uint256,address)","1e120efb":"showEducationDetails(uint256)","1e1401f8":"getReturn(address,address,uint256)","1e141bb0":"releaseTime4()","1e14d823":"addMarketplaceContract(address)","1e16521b":"fulfillBurnRequest(uint256,string)","1e16980c":"setUnburnableWallet(address)","1e171d7c":"hasFunded()","1e172e90":"TransferHappened(uint256,bytes32,address,address)","1e1781af":"unfreezeAccount(address,bool)","1e179ae0":"getToken(bytes32,uint256)","1e17f292":"getAPRTx(uint256)","1e185b2a":"BTEcoin()","1e186e4c":"TestERC20()","1e18c404":"huroc()","1e191c0f":"goalSale()","1e1a48cf":"transferMethodId()","1e1a4eef":"setShareTokenAddress(address)","1e1a90a6":"onPayout(address,uint256)","1e1ad51c":"getFunding_Old(uint256)","1e1b13c0":"coinAge()","1e1b2e0f":"getLotteryPrizesLength(uint256)","1e1c72f4":"requestFreezeAccount(address,string)","1e1c86b7":"CCProject()","1e1d237e":"getSortedArray(uint256[])","1e1d696a":"changeLibAddress(address)","1e1ddacc":"saleController()","1e1e0a5e":"doHash(string,uint32,string,string)","1e1e3e0f":"vaultBalance(string)","1e20363a":"setTokenMetadataBaseURI(string)","1e204acf":"HODLrSoldWin(address,uint256,uint256,uint256)","1e20b4b9":"allocateAllUnsoldTokens(address)","1e215f70":"gbtAddress()","1e217bf8":"releaseUnclaimedFunds()","1e223143":"getFirst()","1e22648a":"setSnapshotBalance(address,uint256)","1e2273a7":"convert256ToReal(uint256)","1e22ffa5":"ClickRUB(uint256,string,string)","1e23300b":"createDiamond(string,address,string,string,string,string,string)","1e2466c6":"ICOTerminated()","1e24e029":"createRequestAsPayer(address[],int256[],address,uint256[],uint256[],string)","1e25dc54":"transFee()","1e2629e1":"initiateMigration(address,address,address)","1e26fd33":"setBool(bool)","1e273649":"getCountPartipants()","1e275d5f":"mock_getUInt(address,address)","1e279a37":"get_balance(address)","1e27a965":"JullarCrowdsale()","1e27ae4d":"getRecordHolder(uint256)","1e28a3a5":"attachCrowdsale(address,address)","1e28ba20":"YeojinToken()","1e28f29b":"initialTiers()","1e2a9d4c":"topup(address,address,uint256)","1e2aebf9":"ETHERCREDIT()","1e2b6db2":"getBdpEntryPoint(address[16])","1e2bdfdf":"setAdvPrice(uint256)","1e2c23b3":"toEth(uint256)","1e2c74f6":"kill(bool)","1e2ca0f3":"updateLeftLottery(address)","1e2d5651":"totalContrib()","1e2da3e9":"PawsCoin()","1e2def3a":"saleStopTimestamp()","1e2e35a4":"sellPoohs()","1e2e3a6b":"getExchanges()","1e2e7a06":"registrationTime()","1e2ed152":"ECO_SYSTEM_BONUS()","1e2f48da":"assertOwnersAreConsistent()","1e2fc4f7":"test_mint()","1e2fee94":"CatDestinity()","1e2ff94f":"currentTimestamp()","1e2ffcef":"Show_All_Company()","1e30397f":"isValidName(string)","1e30b599":"Processables()","1e31264d":"_premiumPricePer30Days()","1e3339f0":"MTT()","1e335962":"token_multiplier()","1e33a6d5":"setGasUsage(bytes4[5],uint256[5])","1e34c585":"setConfig(uint256,uint256)","1e35e567":"fetchOrderByIdWithMerchant(string)","1e36d755":"sendTokenToOwner()","1e372dd3":"Advanced_Anemoi(uint256,string,string)","1e375ab9":"claimReferralBonus()","1e38046c":"address3()","1e38a011":"setRoutePrice(uint256)","1e391738":"minimumGoalInWei()","1e39499d":"scheduleCall(address,bytes,uint256)","1e3a5831":"Claimable(address)","1e3b92b4":"getGalaxy(uint256)","1e3b9de5":"getClaimant(address)","1e3ba116":"_supportsAllInterfaces(address,bytes4[])","1e3ba941":"StexTalk()","1e3c73bd":"BdpPriceStorage(bytes8)","1e3c9352":"grant(address[])","1e3d9c04":"removeLink(address,bytes)","1e3e6369":"GetMySnail()","1e3ea569":"SentTokens(address,uint256,uint256,uint256)","1e3f11ee":"getPlayerGeneralAttr(uint64,uint8)","1e3faf22":"airdropNum1()","1e40375f":"killTo(address,bytes32)","1e4092e5":"FOUNDER_AMOUNT()","1e4146b0":"generateCombinationKey(uint8[4])","1e41583b":"reclaimElement()","1e41be58":"deleteApplication(string,bool)","1e41f63e":"viewAll(string)","1e42698b":"setScrapAuctionDuration(uint256)","1e440e02":"TKCDStandardToken(uint256,string,uint8,string)","1e442919":"getAccessoryLockStatus(uint64)","1e4433c4":"getVar(string)","1e44b919":"KAPAYcoin(uint256,string,string)","1e44c112":"find_strike(uint64,uint32,uint32)","1e44e6af":"setPI_edit_10(string)","1e4532f1":"balances_bonus(address)","1e45de61":"GetWinningAddress()","1e4623e1":"segmentHash(string,uint256,bytes32)","1e464460":"AscendGod()","1e466eee":"triggerVolcanoEruption()","1e49d5ab":"getUserInfoAndConfig(address)","1e4a126e":"BeforeChipObtain(uint32)","1e4adcf7":"weiDonated(address)","1e4b5652":"setKNCRate(uint256)","1e4ba4d4":"swap(uint256,address,address,uint256,uint256,uint256,uint256)","1e4bb033":"HcoinToken()","1e4bd42c":"claimAllTokens()","1e4bdf27":"TransferActive()","1e4bffde":"_getBegin(int256)","1e4c6e7e":"gatito()","1e4c6f7c":"base_token_seed_amount()","1e4c7736":"updateManyLandData(int256[],int256[],string)","1e4ccdc4":"resultDraw()","1e4d17c5":"setFundraiserAddress(address)","1e4df315":"HRChainERC20()","1e4df938":"referralPool()","1e4f95c7":"pipeMoney()","1e504c9c":"setRegisterPrice(uint256)","1e5140dd":"closeTradeProfile(bytes,bytes32)","1e516c32":"OMIVIATEST()","1e519c4c":"getCurrentModifier()","1e51a907":"getServiceNames(bytes32,address[],address)","1e51cb10":"_MineId()","1e5253a4":"RegisterShareholder(address)","1e5296ef":"getMySellOrdersBlackMarketComplete()","1e52aa52":"startBetRed()","1e52ca35":"ROLE_SUPER()","1e52f7b5":"accoutToPayLevel(address)","1e5330ca":"checkBetResult(uint8,address,bytes32,bytes32)","1e5393cf":"setDividendAndPayOut(uint32,uint32)","1e53a3a0":"SetContracts(address,address)","1e53efe0":"getBonusAmount(uint256)","1e542fd4":"AddLock(address,uint256,uint256,uint256,uint256)","1e550ca2":"carTaxiTokenAddress()","1e552efc":"MarnieCoin()","1e5571bc":"getTankSell(uint32)","1e561d5e":"createSellingProposition(address,uint256,uint256,uint256)","1e566dae":"_moveToken(address,address,uint256,bytes,address,bool)","1e567582":"gxc()","1e57e3bb":"EtherReceived(address,uint256)","1e580615":"cashIn()","1e5890c4":"saveResult(uint256)","1e59b53f":"Medallion()","1e59c529":"register(string,address)","1e5a652b":"MDICOStage1(address,address,uint256,uint256,uint256,uint256)","1e5b433b":"testTransferControl()","1e5bd14a":"setRegulator(address,bool)","1e5c6176":"BitChordCrowdsale(address,address)","1e5d1a4c":"End(string)","1e5d2e41":"geneCore(uint256,uint256,uint256)","1e5d2e78":"_updatePools(uint8,uint256)","1e5e668f":"fetchDataMain()","1e5e8aa9":"token_rate()","1e5f34af":"sub(uint8,uint8)","1e5f3569":"createEIP20(uint256,string,uint8,string)","1e5f35f3":"Prover()","1e5f9149":"getWinner(bytes32)","1e5fc8e7":"bonusThirdWeek()","1e5ff41a":"tier5()","1e6000c2":"AffiliateReceived(address,address,bool)","1e6090f4":"isContractDeprecated()","1e60ab84":"PalaceResidence()","1e625935":"SelfPayPreSale(uint256,uint256,uint256,uint256,uint256,address)","1e626456":"tokenFallbackData()","1e6288fa":"soldTokenValue()","1e629a75":"StartNextStage()","1e62a511":"cHWCtoEth()","1e62a915":"set_participant_topl_address(address,uint256)","1e62be25":"Bytes32Passer()","1e639798":"reset(address,address,address,address,address,address)","1e63b3d3":"bancorConverterAddress()","1e658b74":"_userSignUp(string,address)","1e659135":"PVBToken()","1e65dc88":"EtherMemes()","1e6704bd":"maintenanceSetAccountsList(address[])","1e688c14":"fulfillBounty(uint256,string)","1e6b0e44":"finderFee()","1e6b4c6f":"setStakePeriod(uint256)","1e6bd462":"getAllGamesCount()","1e6c3d0e":"BLACKCOIS()","1e6c593c":"checkClaim(string,string)","1e6d4180":"stageBonus()","1e6d58ce":"AHA_Token()","1e6efc83":"setRestartGamePeriod(uint256,string)","1e6f01a7":"setPI_edit_23(string)","1e6f9c1e":"adjust_Transfer_data(bool)","1e701780":"MICRODAO(address,uint256,uint256,uint256,address)","1e70a239":"getAllGiftTemplateIds()","1e711ec0":"plan_active_time()","1e7230c5":"benReady()","1e7231b6":"disablePhenomenon(bytes32)","1e724447":"icoTill()","1e725589":"getAddressesFromUsernames(string[])","1e72a7fc":"calculateVariation(uint64,uint64,int64)","1e72d642":"BezantToken()","1e737709":"getSourceValue(uint256,uint256,uint256)","1e73b362":"withdrawContractEther(uint256)","1e7401d9":"ArconaToken(uint256,uint256,address,address,address,address,address,address,address)","1e745e61":"createContest(string,uint256)","1e74a2d3":"getMinimumEndowment()","1e74c414":"WashExchange()","1e7527b0":"setOwner(uint32,int256,address)","1e75c12d":"ETLTokenPresale(address)","1e7769de":"tryForcePublic(uint16)","1e77933e":"change(address)","1e77b2e0":"updateRate(string,uint256)","1e78cfe1":"minimumPayout()","1e79933f":"removeTagByModuleType(uint8,bytes32[])","1e7a505f":"register(address,bytes32)","1e7a5bf7":"testMintAuth()","1e7ae71f":"owner1Of(uint256)","1e7be210":"whitelists(address)","1e7bef65":"setIncubatorContract(address)","1e7c20ac":"getCompte_24()","1e7c27cb":"ADMIN_CONTRACT()","1e7c402b":"test_percOf2()","1e7cedb7":"TKTToken()","1e7d84cb":"getproduuct(uint256)","1e7de8cc":"setChibiGEN0Price(uint256)","1e7e2064":"addPeers(address[])","1e7e4b5e":"PREISSUED_AMOUNT()","1e7ea8d5":"getFreelancerCategories(address,address)","1e801c8c":"sealForChanges(uint256)","1e81086d":"setDirectMintAgent(address,int256)","1e815fcd":"isBuyOpen()","1e81ccb2":"pings()","1e820325":"finalizeRound()","1e822140":"transferToLockedBalance(address,uint256)","1e829230":"createGrant(bytes32)","1e82965e":"DCTR()","1e83409a":"claim(address)","1e83bab7":"singleInvokeWith2Args(address,string,address,uint256)","1e83cdab":"extract()","1e83ce17":"houseFeeThreshold()","1e83e697":"setTokenOptions(bool,bool,bool)","1e841271":"setTestFee(uint256)","1e84c725":"emergencyTransfer(address,address,uint256)","1e85107c":"bonusPercentages(uint256)","1e8551e3":"voteRewardPerUnit(uint256)","1e85e8f0":"TLN_TOKEN_SYMBOL()","1e860d43":"setNewInvestorsList(address)","1e86ccf5":"setOperatorCommission(uint256)","1e871309":"rewards_id(uint256)","1e872f55":"setPlayerLastUpdateTime(address)","1e8784c9":"SabrinaToken()","1e87fe1d":"setSmallCapWhitelistParticipant(address,uint256)","1e8812f3":"BonusCrowdsale(uint256)","1e891c0a":"setTimelock(uint256)","1e892c21":"returnForRedemption(uint256,uint256,uint256)","1e893437":"stageClose()","1e8997ec":"PUNCToken()","1e89c83b":"read_where_gadget(uint256)","1e89d545":"multiTransfer(address[],uint256[])","1e8a98cf":"UP_totalBets()","1e8b0d03":"EventBankrupt()","1e8bf006":"getNumbersFromString(string,string,uint16)","1e8bf1f9":"readInt256s(bytes32[])","1e8c72b4":"incrUserAvailBal(address,uint256,bool)","1e8d1510":"KeyFund(uint256,uint256)","1e8d15f8":"LasVegas()","1e8f11ab":"candleCost()","1e8fba36":"fortifyClaim(address,uint16,uint256)","1e909841":"getEmployerContracts(address,address)","1e912334":"maxDonors()","1e923f1b":"myAddr_test()","1e924bf8":"tokensReleasedPerPeriod()","1e92a65c":"teamAmounts()","1e935ab1":"requestPause()","1e93c209":"powerPool()","1e93d358":"multiStake(uint256,uint256,uint256,uint256,uint256)","1e9447f3":"hasDuplicate(string)","1e9493d8":"ETH_MAX_GOAL()","1e962e62":"F0002Token()","1e96bf0e":"separate(address,uint256)","1e9824ee":"setExchangeRates(uint8,uint8)","1e982b40":"saleOverInTime()","1e98d334":"initRace(uint8[4])","1e98d54a":"addGlobalConstraint(address,int256,bytes32,address)","1e9a04a7":"secondRoundICOStart()","1e9a6272":"onDelivery()","1e9a6950":"redeem(address,uint256)","1e9b1312":"accountAddress()","1e9b91db":"VictorieumNewICO2Token()","1e9be6a1":"usdEthPrice()","1e9bf0da":"disown()","1e9cefa3":"updateEmployeeWallet(uint256,address)","1e9d2d28":"NewGame(uint256,bytes32,bytes32,bytes32,address,uint256)","1e9d3bc9":"LZXToken()","1e9d48cf":"checkUser(address)","1e9d8232":"TheGame(address)","1e9da16a":"n_domains()","1e9dd927":"kycVerify(address,bool)","1e9e541c":"TEAM_TOKENS2()","1e9e6949":"ActiveChanged(address,bool)","1e9e928e":"GBPValue()","1e9ea66a":"balanceEther10000000(uint256)","1e9eb554":"deathData_v14()","1e9f3c24":"ETH888CrowdsaleS1(address)","1e9f6dcb":"ticketsFaceToFaceSold()","1e9fcc77":"activateAllowance(address,address)","1ea06b9e":"_allowManualTokensGeneration()","1ea0d0de":"endRace()","1ea103d0":"Registra()","1ea134b9":"PeculiumOld()","1ea1380c":"getScores()","1ea1e522":"claimF()","1ea333ea":"_generateDutchAuction(uint256,uint256)","1ea3cae9":"addressToAccountMap()","1ea48870":"isFunder(address)","1ea5a292":"endorse(uint256,uint256)","1ea5efc4":"partner1_voted_update_marriage_status()","1ea6af82":"reward9()","1ea7b0f9":"Bilibit()","1ea82655":"generatePartnerTokens(uint256)","1ea8b099":"endMark()","1ea906b5":"leftTokens()","1ea90acd":"fetchOrdersForPayer()","1ea92826":"currentTierIndex()","1eaa6c4b":"firstTokenExchangeRate()","1eab0a95":"testingContracts()","1eabc116":"buy(uint16)","1eabef31":"YKToken()","1eada765":"getConditions(uint256)","1eae5ff9":"getWaitPreselled()","1eae85cb":"priceOfDate(uint256,uint256,uint256,uint256)","1eaec76f":"FENIX(uint256)","1eafe00c":"isAmendedEarlyPurchase(uint256)","1eb02078":"getUIntTypesCount(uint8[])","1eb21875":"artistManifestoFundAddress()","1eb22b45":"sellerDatabase(address,uint256)","1eb25d13":"InitialSupply()","1eb25e0a":"configure(uint256)","1eb3957b":"requestDelegatedFrom(address)","1eb42523":"update(address,address,address)","1eb4dac6":"endSecondWeekICO()","1eb55c51":"CEI()","1eb5cb66":"resume(string)","1eb5de94":"privateExchangeRate()","1eb5ea2e":"returnFunds()","1eb726af":"contractAddress(string)","1eb79e44":"gasForGR()","1eb8befb":"setNewMediator(address)","1eb92366":"setRecommenderMulti(address[],address[])","1eb96a5c":"cancelOwnershipOffer()","1eb96f7c":"MahalaToken()","1eba7c7a":"setDefaultClaim(string)","1ebb24bc":"_postTransferHook(address,address,uint256)","1ebbc515":"MakerWithdrewAsset(uint256)","1ebbe681":"getWinningById(uint256)","1ebcbc93":"transferAdminShip(address)","1ebcdba4":"getWactive(uint8)","1ebcf2fb":"reclaimParsecCredit()","1ebd8263":"setMinimumBuyAmount(uint256)","1ebd8e6d":"XEVENUE()","1ebdaf8b":"testNewAccountHasZeroBalance()","1ebdd39a":"getWithdrawalData(uint256)","1ebde78b":"getSecondsTimeLockedByString(string)","1ebe1827":"EthLongExercised(address[2],uint256[8],uint8,bytes32[2],uint256,uint256)","1ebe5051":"StarzToken()","1ebe5c0f":"sendWithAllOurGasExcept(address,uint256,uint256)","1ebe8105":"tokenPriceUSDWEI()","1ebeb80b":"getBools()","1ebebb9b":"_checkAndSub(bytes32,bytes32)","1ebedded":"setAllRates(uint256,uint256,uint256)","1ebeec82":"_withdrawNAC(address,uint256)","1ebf0d11":"sellAllAmount(address,address,uint256,address,uint256)","1ebf1f5b":"hasSellerGuarantee()","1ebf42e5":"TokenAFL(uint256,string,uint8,string)","1ebfa2df":"getDiscountsAmount()","1ebfa358":"dateToTimestamp(uint16,uint8,uint8)","1ebfdca0":"servicesLength()","1ec29a5f":"getPurchasedAmount()","1ec32d15":"companyWallet()","1ec41163":"lastWinnerAddress()","1ec42d50":"_createWarrior(uint256,address,uint256,uint256,uint256,uint256)","1ec68b92":"saveMetaData(address,bytes,bytes32,bytes32,bytes32,bytes,uint32,uint256,uint256,bytes,uint256)","1ec6b60a":"startVoting()","1ec6dba6":"SimpleSaleToken()","1ec75025":"developerWithdraw()","1ec762a4":"setlvlWebsite(string)","1ec7cda4":"addTokenInternal(address,address,uint256)","1ec7e345":"tokenValue()","1ec87b86":"getTravelPrice(uint256)","1ec8a460":"AdifyToken()","1ec8bb8c":"distributeReward(address,uint256)","1ec8d5f7":"initialReleaseDone()","1ec8f9ba":"purchaseTickets(uint256[])","1ec9c2c0":"Sub(uint256,uint256)","1ec9f7b5":"longTimeLock()","1ec9fc84":"pendingFeesWithdrawals(address)","1eca98ce":"transferToAdvisors(address,uint256)","1ecb3889":"EurocoinB()","1ecb450e":"Devpr()","1ecc05f2":"validDelegate(address,string,address)","1ecc56f2":"initTimeOf(uint256)","1ecc644f":"vestStage()","1ecca316":"nextFreeTier()","1ecd0d03":"PoSPerCent()","1ecd3f30":"tokenReserved4()","1ecd9f21":"calculateDrugBuy(uint256,uint256)","1ecdfd2f":"setIEIAddress(address)","1ecfd4c3":"takeToken()","1ecfe64d":"_jSub(uint256,uint256,uint256,uint256)","1ed01f61":"maxWagerWei()","1ed0c2cc":"LifeSet_004()","1ed0e01c":"ltdParams()","1ed113ae":"getSignature(bytes)","1ed1d0f7":"KryptoGiftsMessages()","1ed1f196":"pf(address)","1ed20347":"cfo()","1ed24195":"getPeriod()","1ed2730a":"createInvoice(uint256,address,address)","1ed358e6":"recycleAppearance(uint128[5],uint256,uint128)","1ed378a1":"getHybridizationPrice(uint256)","1ed454a5":"memberLevel(address)","1ed5336b":"changeExerciseprice(uint256[],uint256[],uint256[])","1ed5da2f":"Controller_Address1()","1ed64f7b":"is_king_for_sale()","1ed692c0":"finalizeCrowdfunding()","1ed6a6ab":"emitFeeAuthorityUpdated(address)","1ed6f423":"changeDescription(address,string)","1ed77dc8":"presaleWallet()","1ed7830e":"partnerWallet()","1ed83fd4":"setHash(string)","1ed8f023":"BlockableContract()","1ed96e32":"disableTransmit()","1eda49be":"AheVotingBrainfood2()","1eda61d4":"customBonuses(address)","1edb0e73":"GILToken()","1edc44ed":"GameCoinToken()","1edc5ce0":"SUPPLY_FOR_MARKETING()","1edc8f03":"withdrawalEth(uint256)","1edc8f91":"openAuction(uint256)","1edd19e1":"bidExpireBlockLength()","1edf0c1e":"lockAndDraw(address,bytes32,uint256)","1edf0c3d":"TESTTOKEN()","1edf49ff":"myFirstToken()","1edfdb48":"addjoinlist_odd(address,uint256)","1ee04a3d":"TLTContract()","1ee13d0a":"creditDao()","1ee1665d":"WAMToken()","1ee17afd":"Thief()","1ee185ad":"roleRemove(address,string)","1ee284b1":"rockOwners(address,uint256)","1ee2e3cf":"unsetBlacklist(address)","1ee2fe6a":"defreeze(address,uint256)","1ee392c6":"getMaxProfitAsPercentOfHouse()","1ee426e1":"Eth2preNSP(uint256)","1ee44a5e":"listRequire(string,uint256,uint256,uint256)","1ee45da0":"sellEndTime()","1ee53e56":"presaleRate(address)","1ee55080":"getMotherCount(uint32)","1ee5f936":"stopTeamTokenTransfer()","1ee7c4bc":"LogNewAllocation(address,uint8,uint256,uint256)","1ee7ccc7":"preIcoInvestorsAddresses(uint256)","1ee9f029":"PREICO_HARDCAP()","1eea92c1":"levelExpAdjustment()","1eeaa389":"lockSupply(bool)","1eeac5d5":"TradelizeToken(uint256)","1eeccead":"tokensAlreadyMinted()","1eed0347":"applicationNameHashTaken(bytes32,bool)","1eed0f27":"setPriceUSD(uint256)","1eed1192":"newUser(string)","1eed4e09":"getVoteBy(address)","1eee993a":"addChild(address)","1eef94bd":"setAwardedUnfreezePeriodSeconds(uint256)","1eefddb1":"grace()","1ef0625b":"player_2(uint256)","1ef085db":"price3rdWeek(uint256)","1ef09ccf":"executeDelegateCall(address,uint256,bytes)","1ef17972":"ChangeOwner(bytes32,address)","1ef2c6d1":"closeTurnByHand(uint256)","1ef31b0d":"erotixFund()","1ef3755d":"restart()","1ef410e2":"addAudit(uint256,bool)","1ef5b90f":"release_(address,uint256[],uint256[])","1ef60485":"returnAccounts()","1ef741fd":"interestPeriod_()","1ef75084":"getCompoundPlan(uint256)","1ef75b1a":"GGToken(address,string,string,uint256,uint256)","1ef7b68a":"purchaseReceiptById(bytes32)","1ef987c1":"getInvestedAmount(address)","1efad671":"isPreSaleReady()","1efb06e0":"LogNewWallet(uint256,address)","1efb17ee":"changeHouseAddress(address)","1efba6c2":"fixedPrice()","1efdebb2":"hodlersCount()","1efe3abf":"getNumTasks()","1eff2b2f":"advisorIssueVesting(address,uint256)","1effc0d8":"createPerRound()","1f00c55b":"TOKENS_CAP()","1f0276fc":"_getKey(bytes32,uint256)","1f03bc1b":"setNewUserBonusCardTradable(bool)","1f049a49":"tokensBank()","1f04b54c":"test_ConsensysReached()","1f04becc":"ppFinishTime()","1f05ff29":"fromWeiToFp(uint256)","1f065f56":"KangGuo()","1f06c859":"promises(uint256)","1f078962":"setFlowerContract(address)","1f078f56":"winTokens(uint256,address)","1f0815ce":"togglePromo(bool)","1f09b0a2":"getDisplayGenVault(uint256)","1f0a21ad":"setAdvisers(address[],uint256[])","1f0b2561":"getCurrentBonusPercentage()","1f0b5553":"setBalances()","1f0ba6c9":"trade()","1f0c03f4":"forwardEndTime(uint256)","1f0c1e0c":"getEventTokenAddress(bytes32,uint256)","1f0c5f26":"CashMove(uint256,bytes32,address,address)","1f0da298":"transferTokensAndEtherValue(address,address,uint256,uint256)","1f0de21c":"addrunmoney(address,uint256,uint256)","1f0f2ce4":"withdrawOrderRefund(uint256)","1f0f711f":"discontinue()","1f0fd191":"test_threeValidEqUint()","1f0fd905":"getAssetIdCargo(uint32)","1f101520":"preIcoMin()","1f107635":"ownerSetAdmin(address[])","1f1144dc":"ViewOffer(address,uint8)","1f11d503":"GameSicBo(string,uint256,uint256,uint256)","1f124116":"approveSettingUpdate(uint256,bool)","1f12da06":"getPropertyPrivateModeLastUpdateEarnUntil(uint16)","1f130761":"tokensSent()","1f130d1f":"insertAddress(address)","1f13b5ae":"NokuMasterToken(uint256,uint256)","1f13de92":"inEther(uint256)","1f13f165":"NecromeunToken()","1f14df69":"balances(address,bytes32)","1f150322":"LogUserUnregistered(address,address)","1f15bc1b":"disallowTransfersTo(address)","1f15e163":"LaunchRocket(uint32,uint32,uint32,uint32,uint32,uint32)","1f161533":"distributeXYZ(address[],uint256)","1f167829":"nextDraw()","1f16c8b9":"getEndDateOfCampaign(bytes32)","1f16fda4":"multiTransfer(address[],address,uint256[])","1f1836fa":"isPresalePurchase()","1f1886e4":"extendSale(uint256)","1f18e56e":"removeOwnersWithHowMany(address[],uint256)","1f194b9f":"getFreeKilo()","1f1953ad":"addPokemonToMaster(address,uint256)","1f1aea6e":"initSale3(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","1f1b11cc":"buyMinerFromSale(uint256)","1f1bd005":"getRocCoreAddress()","1f1bd692":"text()","1f1c827f":"StartGame(string,string)","1f1c84b7":"decreasePresetTransfer(address,uint256)","1f1cb62b":"peg()","1f1dc61b":"checkPayLoan()","1f1de456":"regName()","1f1e1295":"isApprove(uint256)","1f1e2cfa":"calcUnMaskedEarnings(address,uint256)","1f1e6c4e":"createCollectible(uint256,uint256,address)","1f1ea554":"HolahopToken()","1f1ec029":"updateKeyPrice(uint256)","1f1eef6b":"getContributionHashByIndex(uint256)","1f1f5e76":"addValueToContribution(uint256)","1f1f8240":"_parseIntScientific(string)","1f201d7e":"level_judgment(address,address)","1f201e39":"etherandomExecWithGasLimit(bytes32,bytes32,uint256,uint256)","1f20f762":"losingAmount(address,uint256)","1f212106":"startICOStage7()","1f218cf1":"ICO_PERIOD()","1f21f9af":"marketMaker()","1f220be0":"unlock(string,bytes32,address,address,uint256)","1f221d4c":"updatePublicityBalance(address,uint256)","1f227fc8":"importTokensFromSourceToken(address)","1f23a9bc":"getAcceptedAndRejectedVotes(uint256,uint256)","1f23c22b":"getOpenBids(bytes32)","1f25cfaf":"changeBot(address)","1f261939":"payBid(bytes32,uint256)","1f2698ab":"started()","1f275713":"prefixed(bytes32)","1f278d32":"MyartPoint()","1f27a8b5":"set_transferrable(bool)","1f28c821":"tokensPreMinted()","1f296600":"brickETHPrice()","1f299c1a":"updateRegistry(bytes32,address)","1f29bdcf":"setAStore(string,address,address)","1f2a3e06":"scissors()","1f2c6414":"getAddressBatchByUsername(bytes20[])","1f2d62bc":"gameStartedAtBlock()","1f2d8d66":"getNumberVote(uint256)","1f2dc5ef":"divisor()","1f2e5461":"LOUDEX()","1f2e886c":"testControllerTransferTriggersEvent()","1f2e97c8":"slaveWalletPercentInitialized()","1f2ea6e0":"dealership(address)","1f2ec9c9":"setHoldAmount(address,uint256,uint256)","1f2efa83":"allocateIntoHolding(address,uint256,uint256)","1f2f7fc3":"dispute(uint256,uint256)","1f305ec7":"removeFromKycTeam(address)","1f30edc7":"CTOSignature()","1f312375":"referralBonusRate()","1f32768e":"getSubscription(bytes32)","1f32c18f":"getDrink(uint256)","1f34556a":"changeMaxReward(uint256)","1f34563c":"newUser(string,string)","1f34d1d3":"registerAppVersion(bytes32,bytes32,address,bytes4[],address[])","1f35bc40":"setCrowdsaleAddress(address)","1f3634ed":"ink(bytes32)","1f368fa6":"ExtrabitToken()","1f378b8a":"refundEther(address)","1f38034c":"removeEmailAddress(string)","1f38c358":"allocateIds(uint32)","1f390975":"MAX_TOTAL_CONTRIBUTIONS()","1f3943df":"SURT(uint256)","1f39716c":"aggregateBet(uint256,uint256)","1f39a141":"getTokenAmount(uint256,address)","1f3a3a53":"mint(int256,uint256)","1f3a4c14":"addFreezableAddress(address)","1f3a7c0b":"FOUR_YEAR_KEEPING()","1f3a98d1":"getReferralRates()","1f3b3148":"endEpochTimestamp()","1f3bec3b":"secondarySaleReserveWallet()","1f3c99c3":"logout()","1f3ce938":"increasePresaleEndTime(uint256)","1f3ceb51":"getGameById(bytes32)","1f3d3261":"JustForward(uint256)","1f3dcc8d":"maxGasPricePenalty()","1f3e1c8d":"LogTokensPurchased(address,uint256,uint256,uint256)","1f3e50f6":"withdrawBCEO()","1f3e64e6":"getTXwithCode(address)","1f3ee21f":"setUsdEthValue(uint256)","1f3fd5ca":"PI_EDIT_1()","1f3fe8d1":"ICO_BONUS1_SLGN_LESS()","1f3fed8f":"tokensForMarketing()","1f400477":"inLendingMode()","1f402356":"markContractAsInited()","1f417317":"WalletSimple(address[])","1f42103c":"AworkerToken(uint256)","1f4356e4":"emissionFunds()","1f43f396":"startICOStage5()","1f4425f3":"checkCloseTimer()","1f44a40f":"airDropSame(address,address[],uint256)","1f44b1de":"ValithToken()","1f45006c":"checkEthRaised()","1f455922":"removeToken(string)","1f45ad5c":"modifyContentAccess(bytes32,bool,uint256)","1f461f0d":"withdrawableAmountFor(address)","1f468245":"calculateObtainedBUB(uint256)","1f46eb98":"agentPermission(address)","1f470b14":"lockUpAmountOf(address)","1f471ad0":"proxyMint(address,uint256)","1f47b50d":"MineablePOWCoin()","1f47ba29":"safeToMul(int256,int256)","1f4848ef":"setTakeFee(uint256)","1f48af0a":"updateWeapon(uint256,string,string,string)","1f48ff7c":"mintMarketMakerApproval()","1f49aff4":"ACLYDcid()","1f49caac":"canUseLock()","1f4a5c32":"confirmTransactionAfterExpiry(uint256)","1f4a6d32":"removeEth()","1f4ab41e":"createUser(bytes32,bytes32,uint256)","1f4ae468":"returnETHforNormalBuyers()","1f4b8e41":"getLastUpdateId()","1f4ca28f":"isAdvisorsTokensSecondReleased()","1f4d7ec4":"newParameterizerWithToken(uint256,string,uint8,string,uint256[])","1f4dba8e":"OPTinToken()","1f4dde9f":"Jade()","1f4e01d9":"absoluteEndBlock()","1f4e1504":"upgradeContract()","1f4e996b":"challenge(bool)","1f4f77b2":"timestampFromDate(uint256,uint256,uint256)","1f4f9ab1":"supervisorVote(uint256,bool)","1f4fc29c":"refShare()","1f502a13":"volumeDiscounts(uint256,string)","1f513660":"ctoAddress()","1f522595":"donationsCount()","1f52692b":"vaultOwner()","1f52cc35":"removeTrustedContracts(address[])","1f532b39":"getRelation(address)","1f534715":"ComplexChildToken(address,string,string,uint256,uint8,bool,int256,bool)","1f535833":"referralCodeAt(address,uint256)","1f53ac02":"setDevWallet(address)","1f54d80d":"verifyCustomer(address,bytes32,bytes32,uint8,bool,uint256)","1f5623f3":"ZebiToken()","1f572504":"JackToken()","1f57256f":"transferEth(uint256)","1f583087":"ClickGemTokenERC20(uint256,string,string)","1f59653c":"setprices(uint256,uint256)","1f59d30e":"unlockEarnings(address,uint256)","1f5a0bbe":"addExecutor(address)","1f5a177f":"registerVestingScheduleWithPercentage(address,address,address,uint256,uint256,uint256,uint256,uint256)","1f5a2a52":"getDamageValue(uint256)","1f5bb9f8":"Refund_TrustlessTransaction(uint256)","1f5bdf5d":"isRegisteredUser(address)","1f5c3a3c":"approveMultiple(address,uint256[])","1f5c6f67":"getOpeningTimeByStage(uint256)","1f5d0b4c":"address(address,address,uint256)","1f5dddab":"WithdrawContribution(uint256)","1f5dfcd5":"lastBlock_a7()","1f5e881f":"_buyTokens(address)","1f5e8f4c":"isRestricted()","1f5e9a2a":"CyberMilesToken()","1f5eeb13":"tokenSendFailuresCount()","1f6034fd":"getInt8FromByte(bytes14,uint256,bytes1)","1f60d9f7":"crowdfunding_allocation()","1f617a60":"setReceivable(address,bool)","1f6275bb":"issueTokenAndTransfer(uint256,uint256,address)","1f63a350":"settle(bytes32,bytes32,uint8,bytes32,bytes32)","1f64c1f2":"getInvestorInforValue(uint16)","1f66531d":"getEsgoTX(uint256)","1f67298d":"Daq()","1f677d8d":"ownershipLength()","1f68f20a":"baseRate()","1f69565f":"getTokenInfo(address)","1f69aa51":"left77(uint256)","1f69d230":"setMultiLedgerValue(string,address,address,uint256)","1f69f929":"teamVestingCounter()","1f6a1bf7":"lastDifficultyAdjustmentEthereumBlock()","1f6a1eb9":"execute(bytes,bytes)","1f6a3943":"icoBackend()","1f6b0a9d":"getReleaseLockfileURI(string,uint32,uint32,uint32,string,string)","1f6b28bf":"valueOf(string)","1f6b5b7d":"setRefundState()","1f6b9b97":"placeBet(uint8,int8,uint8,uint256)","1f6c0a9b":"ReleaseLockedBalance(address,uint256,uint256)","1f6c76f4":"reserveDeveloperTokens(address,uint256)","1f6ce1d3":"setDaySellAmount(uint256,uint256)","1f6d2086":"setCooldownIndex(uint256)","1f6d3d13":"AddrDevelopGroup()","1f6dc06c":"SetSaleStep(uint256)","1f6de588":"PiedPiperNetworkCoin()","1f6e5117":"getCallbackAddress()","1f6e6f3a":"DigitalThothToken()","1f6eb6e7":"escapeHatchCaller()","1f6ee77a":"setInitialData(address)","1f6eeb68":"canMintBurn()","1f6f3c0f":"getShipProductAmountByModel(uint16)","1f706c64":"EndTimeUpdated()","1f71f250":"updateTopicAddress(bytes15,address)","1f720e71":"testThrowTranferTooManyTokens()","1f7266e8":"owner_TransferFromTo(address,address,uint256)","1f7299c1":"processSell(address,uint256,uint256)","1f72d7d8":"increaseCap(int256)","1f7334e2":"TransferFlower(address,address,uint256)","1f74de51":"getAuditOutcome(address,bytes32)","1f772a34":"token_symbol()","1f77aac0":"queryUserContract(address,uint256)","1f790a94":"BananaGame()","1f794436":"getBlockHeader(int256)","1f7a41f1":"rawNameOf(address,address)","1f7a72f7":"bobClaimsDeposit(bytes32,uint256,bytes32,address,address)","1f7ab15d":"setdecimals(uint256)","1f7af1df":"canReceiveMintWhiteList()","1f7b4f30":"roll(uint256)","1f7b5318":"getBlocklancerToken()","1f7b6d32":"length()","1f7b8622":"getVotingDeadline()","1f7c4bf3":"AccessControl()","1f7ccc09":"initAssetFile(string,string,string,string,string,string)","1f7cdd9b":"unicornsGifted()","1f7d16f7":"managementWalletAddress()","1f7df96f":"registLogo(address,address,string)","1f7e3e72":"test_oneValidEqStringUint()","1f7e495b":"systemSupply()","1f7fe78b":"balanceAtSnapshot()","1f800e8e":"releaseVested()","1f803ac3":"getUnlockedTokens(address)","1f807736":"withdrawFreeAuctionBalances()","1f81582c":"returns()","1f816c6d":"hodlerReward()","1f820f52":"migrateEuroTokenOwner(address,uint256)","1f83bcd7":"withdrawlDeadline()","1f83d11a":"addMilestonesAndSeal(uint256[],uint256[],uint256[],uint256[])","1f83d75e":"updateProfileDetails(string)","1f83f440":"getPaymentByAddress(address)","1f86ab51":"confirmCollection()","1f86ffda":"UpdateBid(address,uint256,uint256)","1f8712af":"isValidPurchase(address)","1f871726":"getCategoryWorkClockTimeRef(uint256)","1f879433":"setSolver(address)","1f8814ad":"ElyERC20(uint256,string,uint8,string,bool,bool)","1f8864ac":"setStorageOwner(address)","1f887d56":"CryptoSagaDungeonVer1(address,address,address,address,address,uint32,uint256,uint256,uint32,uint256,uint32,uint32,uint32[4],bool)","1f8947c1":"extractUint(int256,bytes,uint256,uint256)","1f89e911":"getCompositionPrice(uint256)","1f8ac604":"mul0()","1f8ae3f0":"proofFailed(bool)","1f8c07b0":"startPhase(uint256,uint256,uint256)","1f8d1d50":"setTotal(uint256)","1f8d99a9":"assetIsRegistered(address)","1f8df2cd":"setGeneScientist(address,bool)","1f8e6fb3":"transferSale(address,uint256,uint256,uint256)","1f8e728c":"addMilestone(uint8,uint256[],uint8[])","1f8e9143":"AcceptsKDI(address)","1f8ea5e8":"EternalChainToken()","1f8eac47":"spentByTeam()","1f8f1d21":"addMember(uint256,address,bytes32)","1f8f69e3":"fechAllVoteResultForCurrent()","1f8f8100":"Tspace()","1f8fcc45":"Vantador(address)","1f903037":"getBytes32()","1f903b5d":"preSaleSpenderTxDetails(uint256)","1f90b2a5":"snapshotBlock()","1f90ffc8":"AddSupply(uint256)","1f91666d":"newOrganisation(string,string,string,uint8,bool)","1f91e309":"getBuyBackPrice(uint256)","1f922d06":"duplicate()","1f92f6b7":"setBtcUsdRate(uint256)","1f934299":"calcConfirmsNeeded(uint256,uint256)","1f960571":"picops_balances(address)","1f963f80":"getReportingWindowId(uint256)","1f96938d":"deliverSale(address,uint256)","1f96add4":"ChronoMint(address,address,address)","1f974fe4":"NExT()","1f979e23":"GetRigData(uint8)","1f97a238":"rejectCertificate(uint256)","1f97c00e":"tokenCreationMax()","1f97ea5d":"EDU_PER_ETH_PRE_SALE()","1f97f2ef":"issuedTokensForCommand()","1f98394d":"basicReward()","1f994137":"booleanStorage(bytes32)","1f995ef1":"HDCTestToken()","1f9988c9":"transferTokens(bytes32,address,uint256)","1f99c458":"listNamesLen()","1f99d862":"test_method_increaseTimeBy30000()","1f9a08ca":"reelIn(uint16,uint16,bytes32,bytes32)","1f9a391c":"setCanCreateGrants(address,bool)","1f9ab193":"place(uint8)","1f9c5580":"AMIS(address)","1f9c564f":"rubusOrangeAddress()","1f9c649f":"HashInvalidated(bytes32,string,uint256,uint256)","1f9d7ab8":"addTokens(uint256,string)","1f9ea25d":"_setDepositAccount(address)","1f9eba17":"bitcoinInvest(address,uint256,uint256)","1f9ecab1":"TowerImagesCoin()","1f9ef7fa":"getPayoutNumerator(uint8)","1f9f168e":"startNewRound(address)","1f9fed62":"checkMySellerOffer(address)","1fa03a2b":"isApprovedFor(address,address)","1fa08755":"upgradeDexterity(uint256)","1fa08ad8":"EtchReward(uint256)","1fa0914e":"buyStamps()","1fa096e6":"isInversor(address)","1fa0dc70":"saveReturnSatoshi(address,uint256)","1fa13a61":"longTermTokens()","1fa24aa7":"makePermanantlyTradable(uint8)","1fa30523":"doMint(address,uint256)","1fa3c372":"redeemTokens(bytes32)","1fa3cfaa":"bmc(uint256,uint256,address)","1fa4070c":"TestCoinVN()","1fa422a2":"earliestNextSettlementTimestamp()","1fa45291":"arrayOfClones(address)","1fa498ce":"messagetodovie()","1fa4c486":"PublicResolver()","1fa4d9de":"completedAddingParsels()","1fa4ea66":"reservationAddress()","1fa5e43b":"freezedBalanceOf(address)","1fa62fb7":"setCountrySlogan(uint256,string)","1fa6f19b":"getAddressForQuery(bytes32)","1fa96b96":"currentProposalResults(uint256)","1fa98406":"fundType()","1fa9d21f":"DASABI_IO_Contract()","1faae8b3":"getTypeValue(uint256)","1fab0265":"messiDev()","1fab3fd4":"setFinishedTx(address)","1fabb318":"MAX_ALLOWED_BY_STAGE_1()","1fabe6cf":"getActualCompletionDate(bytes16,address,address,uint256,uint256)","1fad4d46":"getShipOwner(uint32)","1fad4e79":"sevenWinnerWithdraw()","1fae75eb":"Xandra()","1fae9361":"changeTimes(uint8,uint8)","1faec182":"getBet(uint8,uint256)","1faf1ed4":"unlockTip()","1faf8995":"fillOrder(address,bytes32,uint256,bytes32)","1fafc2c8":"updateBusinessReserveAddress(address)","1fb00cdc":"investWithId(uint128)","1fb150c4":"_batch1_icosaleEndTimestamp()","1fb156ef":"ecmul(uint256[3],uint256)","1fb168ac":"setStopStatus(bool)","1fb1f18b":"getWinnings(address,uint256)","1fb25f07":"getCertification(bytes32)","1fb291cb":"registerInt(address,int256)","1fb2de2c":"sendTokensToTwo(address,address,uint256)","1fb2f2a0":"testUpdateLatestRevision()","1fb384cb":"RemoveRocketForSaleEvent(address,uint32)","1fb47fe8":"CulturePhilosophyFaithChain()","1fb4bcf8":"SetSaltPassword(bytes32,bytes32)","1fb4d1e7":"TheMutualCurrency()","1fb59f9d":"swapProxyTokens()","1fb6e99d":"paymentNeeded(uint64)","1fb82d26":"storeProof(string)","1fb8875d":"referralSent()","1fb8c0ed":"releaseEQUIWihtoutKYC()","1fb8d5de":"vaultUnlocked()","1fb97c34":"updateFirstAmount(bytes32,bytes32,uint256)","1fbab493":"checkPrice(address,address,bool,uint256,uint256)","1fbb408a":"RacingToken()","1fbb4def":"CalculateDividents(uint256)","1fbbf4bb":"setKillingGap(uint256)","1fbcf2c1":"_lotterySupply()","1fbd3564":"getContentsManager()","1fbd7771":"didSoftCapReached()","1fbd9a0b":"REFUNDSACTIVE()","1fbda78f":"LibraryToken()","1fbe1979":"rescue()","1fbe480e":"shipToMe(string,uint256)","1fbe7475":"findEndpointByAddress(address,address)","1fbeaa83":"PublicBatchTransfer(address,uint256)","1fbee6ed":"CNYTokenPlus(uint256,string,uint8,string)","1fbf7c3e":"increaseReserve(uint256)","1fbfe6f3":"auditReport(address,bool,bytes32,bytes32)","1fc03aa0":"getTypeByNumber(uint256)","1fc05f86":"minimalWei()","1fc06f0d":"niceGuys(uint256)","1fc083cf":"OurBit()","1fc0e5e9":"StartPaymens()","1fc1e25f":"listToken(address)","1fc242b9":"onVote(address,int256)","1fc24caa":"changeMaxTransactions(uint256)","1fc27ef2":"isIcoActive()","1fc2e0fb":"MinedThisYear()","1fc3a519":"computeReturn(uint256)","1fc5b4ee":"balancesByIndex(uint256,address)","1fc5c9b7":"setNextPeriod(uint256,uint256)","1fc62fce":"Trillionereum(address,address)","1fc6e13a":"getRoundKeyPrice(uint256)","1fc75e41":"preSaleWallet()","1fc7d658":"purchase(address[16],uint256)","1fc82e83":"allocateUnclaimedFees()","1fc86532":"endBlockBonus2()","1fc87587":"get_CountProfitsToken()","1fc928ae":"taxToken()","1fc97e34":"Genius()","1fc983fb":"ChelseavsArsenal()","1fca5278":"highScore()","1fca5fda":"IsRazRunning(uint256)","1fcafd8f":"FomoMasterCoin()","1fcb292d":"getTokenFunction(uint8)","1fcbbefa":"sendBooty(address,uint256)","1fcc02e8":"EthereumTestToken()","1fcc2515":"ChangeCrowner(address)","1fccc158":"tCampaignEnd()","1fcd08f0":"AaadharDemo()","1fcd7ea6":"getPOOL_edit_33()","1fcdfe14":"icoTokenAmount()","1fcf25be":"getTransactionSuccess(bytes32,uint256)","1fcf55ff":"withdrawApplication()","1fd01085":"_sellPresale(uint256)","1fd01de1":"_checkOnERC721Received(address,address,uint256,bytes)","1fd023ab":"FFCryptoCoinToken()","1fd22140":"CountCourses()","1fd2676f":"jackPotPercents()","1fd2e006":"changeClassFee(uint256,uint256)","1fd3dd97":"OneEtherEqualsInWei()","1fd41949":"setMaxInvestedLimit(uint256)","1fd476bd":"AutonomousSoftwareOrg(bytes32,uint8,uint8,bytes32)","1fd4b40c":"saleEtherCap()","1fd55a8a":"crowdsaleOpened()","1fd7b802":"ModifyMine(uint256,bool,string,uint256)","1fd7f431":"setCCH_edit_7(string)","1fd8088d":"minLimit()","1fd8291a":"endpresale()","1fd86a6a":"FundICO(uint256)","1fd96b69":"ManagedAccount(address,bool)","1fd97c12":"CNotesICO()","1fd982a5":"releaseForEarlyInvestor(address,uint256)","1fd9b2a4":"createValidatedRequest(address[3],address,uint256[12],uint256,bytes)","1fd9f187":"catNoLongerForSale(uint256)","1fda4271":"MindToken()","1fda5b45":"receivePlayerInfo(uint256,address,bytes32)","1fda8278":"drawCoach(uint256,address,address)","1fdaedf2":"BoomstarterPresale(address[],address,address,bool)","1fdaf3f2":"ServiceAgreement(string,string,uint8,uint256,uint256,uint256,address,address,uint256)","1fdb5a2b":"addInvestmentPreIco(address,uint256)","1fdba848":"BiekensToken()","1fdcf5a7":"lockEthBalance(address,uint256)","1fdd7695":"getbuyprice(uint256)","1fddbba4":"totalVUP()","1fde4607":"setCreditDaoFund(address)","1fde8469":"setExchangeRate(uint32)","1fdf071c":"approveMintAgent(address,bool)","1fdf6e0c":"protectKingdom()","1fdfa40d":"test_setupBoardRoomAndAssert()","1fdfec35":"calculateTotalDue(uint256,uint256)","1fe00a15":"individualMaxCapTokens()","1fe07274":"SDEToken(uint256,string,string)","1fe08e28":"how_many_arbits_do_i_have()","1fe0ff58":"finishRound(uint256)","1fe1516d":"sendToTeamEthContract()","1fe15db5":"MarketboardListingComplete(address,uint256,uint256,uint256)","1fe1b208":"totalavl()","1fe26e9d":"componentCount()","1fe2a6f2":"updateJugada(uint256,bool)","1fe2c933":"UpgradeByCredits(uint256,uint256)","1fe2d046":"assignRafflePrize(address)","1fe2e229":"getTotalTrust(address)","1fe3aec7":"CGCGToken()","1fe4ee7f":"getVoteItemDetails(uint256)","1fe51f82":"persistLimit()","1fe55867":"rew()","1fe6189e":"PARTNERS_ADDRESS()","1fe64f19":"MaximumHodlDurationChanged(uint256,uint256)","1fe74895":"Etherchicks()","1fe7b624":"resumeMint()","1fe7ff2c":"SpriteToken()","1fe8149e":"createTokenByHWC(address,uint256)","1fe8500e":"setItemRegistry(address)","1fe8629a":"giveMultipleItemsAndDestroyMultipleItems(address,uint256[],uint256[])","1fe93774":"totaleFrasi()","1fe97e45":"whoIsConcerned(address)","1fe9eabc":"setMax(uint256)","1fea96cd":"removeUserFromBlackList(address[])","1feac75b":"setCommissions(uint256,uint256)","1feaee17":"getSetupParametersByIndex(uint256)","1feb0c4f":"PreICOProxyBuyer(address,uint256,uint256)","1feb19d6":"initialize(uint256[],uint256[],uint256,address,uint256,address,address)","1feb3569":"transferToken_toBalance(address,uint256)","1fec0e96":"LogCampaignAdded(uint256,address,uint32,uint96,uint16,uint16,uint256)","1fec5a11":"Coin77()","1fec6dce":"createVestingPeriod(address,uint256,uint256,uint256,address,address)","1fedbc03":"getSharesPercentForPeriod(bytes32,uint256)","1fedd70b":"snipCoinToEtherExchangeRate()","1fee37c8":"ADDR_TKG_NODE()","1fee5c51":"set_min_max_FinneyPerSale(uint256,uint256)","1feef08e":"getTotal(uint256)","1ff13086":"size(int256)","1ff14311":"totalOutcomeAmounts(int256)","1ff1a378":"maxSalesAllowed()","1ff2c22b":"setCharityFund(address)","1ff42195":"minimum_cash_proof_amount()","1ff517ff":"totalDebt(address)","1ff5668c":"depositForDividends()","1ff5e17c":"_itemLength(uint256)","1ff6536c":"setCrowdSaleStart(uint256)","1ff6a54b":"cancelFavor()","1ff6ad55":"tokensForPeriod(uint256)","1ff6c241":"collectedUSD()","1ff75851":"updateICODate(uint256,uint256)","1ff76f86":"ROBReserveAllocation()","1ff7a278":"ownerNegTokens()","1ff858d0":"activateNextStage()","1ff8ac8a":"getFinalval()","1ff8d507":"toggleSwap()","1ff96c74":"getHonour(uint256)","1ffa27f9":"hasPermissions(address)","1ffa451c":"serviceTransfer(address,address,uint256)","1ffb6ca6":"unlockTransfer(address,uint256)","1ffbb064":"isAgent(address)","1ffbf32b":"MUSPRA()","1ffc973a":"HedgeCash()","1ffcb18c":"numQuestions()","1ffd3aef":"log10Floor(int256)","1ffd42ab":"getVotingScriptAction(uint256,uint256)","1ffd99f4":"saler()","1ffe3c9b":"UECToken(address,uint256)","1ffe4cca":"startline()","1fff2d8a":"payToPresale(address)","1fff5c2f":"bindEthereumAddress(address,bytes32)","1fff7a97":"CompositionPart(uint256,address)","1fffbe7a":"getJobSponsorships(uint256)","200138b9":"CrowdTmoney()","20020a3a":"createAsset(bytes,uint256,bytes,bytes,address)","20027275":"saleStartBlock()","2002c2f6":"slogans(uint64)","20033848":"MagixRecordsCoin()","20035e36":"icoEth()","200373c9":"fees_()","2004b6a6":"TheWhaleWins()","2004dff6":"Basics()","2004ffd9":"mintToken()","200538c6":"DTE()","200576b5":"TchainToken()","2005db6d":"preIco(uint256,uint256,uint256,uint256[],uint256[])","2007474e":"theRelayer(address)","20076659":"Arbitrator()","2008c2ca":"destPercent(address)","2009a059":"setLandProductionMultiplier(address)","200a252a":"PhanToken()","200aa519":"addCustomerwithToken(address,uint256,address)","200aac9f":"burnAZLTEST(uint256)","200b0fa6":"initVote(uint8)","200b894d":"assertEq(int256,int256,bytes32)","200b8951":"_distribute(address,uint256,uint256,uint256)","200c1f19":"premiumPacks()","200c7295":"whitelistAddress(address,uint256)","200c7770":"bountyDuration()","200cdf8e":"becomePickleRick()","200d10dc":"OrpheusOrganicsLaos()","200d2ed2":"status()","200deb8b":"MessageSent(string,string,string,uint256)","200ebe34":"addTokensToGive(address)","200ef97e":"payNTS()","200f29e3":"advisorAccount()","200fbcf0":"getFullyVestedAmount(address,address)","201035ed":"getGunsIds()","20104dca":"engCommunityAddress()","2010bdce":"removeSupervisor(address,address)","20120dce":"ADMIN_SET_TEST_RANDOM(string)","20130753":"testThrowSetNotRetractableNotOwner()","20145328":"changeMelonportAddress(address)","2014c515":"tgrNextPartInvestor()","2014d703":"approveAllArgs(address,uint256,address)","2014e1fb":"W0keAFCrowdsale(uint256,uint256,address,address,address[])","2014e5d1":"isRunning()","20150e21":"sendDividends(uint256)","20153d38":"EarlyAdoptersAmount()","20154e78":"unpausePVP()","20158c44":"fills(bytes32)","201745d5":"disown(bytes32,address)","2017af61":"initialTokensHolder()","2017ee03":"nextDealIndex()","20183926":"EngagementToken()","20185aa2":"liquidityWithdraw(uint256)","20188d4f":"getAdjustedContribution(address)","20190ccd":"startCirculation()","201bafee":"TroneriumSupply()","201dcd7a":"newChallenge(uint256,uint256)","201de654":"mnemonicsCount()","201e8f0e":"changeWhitelistCornerstoneStatuses(address[],bool)","201e908e":"blockDuration()","201f1506":"EthereumEra()","201f6e02":"oldAppreciationRateWei()","201f96e5":"setRepMarketCapInAttoeth(uint256)","20202965":"expired(bytes12)","20204fb7":"genericCall(address,bytes,address)","2020e9ea":"bid(uint16,uint16)","2021dfcb":"BONUS_DURATION_3()","20226e17":"valueOnContract()","2022936f":"BalanceClaim(address)","202329cb":"get_all_activityn(uint256)","2024617e":"initialize(string,string,uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","20250264":"setData_5(uint256)","2025867b":"qualifiesAsCommunityBallot(uint16)","2025e52c":"createSaleTokensVault()","20260697":"createWallet(uint256,address[],bytes32)","20263e87":"incentiveTokenAddress()","2026a0a7":"change_sale_address(address,string)","20277ed7":"GWGFPLUS(uint256,string,string)","2027d2c6":"ETHLottery(address,uint256,uint256,uint256,address)","2027d746":"getCustomerCount()","2027e1d3":"COCO()","20281990":"ProposalAddedEvent(uint256,address,uint256,string)","20283da9":"trustedWithdrawETH(address,uint256)","202920ef":"FST()","2029e599":"addCode(string,string)","202a46cf":"limitEther()","202a6ce0":"NFXCoin()","202ac3bc":"withdraw(bytes,bytes,bytes32)","202b876a":"allocateToMarketingSupporter(address,uint256)","202bb36d":"JTBlockchain()","202bc7e7":"getIntervalCoefficientMultiplier(uint256,uint256,uint256,uint256)","202c413d":"setNickname(uint256,bytes32)","202ca027":"setPayrollAddress(address)","202d5123":"STRTToEth()","202d6eaf":"addInvestorsValue(uint256)","202e3924":"getOperation(uint256)","202ece74":"sendToWinner(uint16)","202feb77":"test_2_assertGasUsage100Boards()","2030762a":"PoolICO()","2030f721":"num_objects()","20323763":"addPerformance(string,uint32,uint8,uint8,uint8,uint16,bool)","2032677f":"roundOpen()","20334668":"verify(uint256,uint256,uint256[],uint256,uint256,uint256[],uint256[])","20339891":"addGridMember(address)","2033d9ae":"switchToDistributionMode(uint256)","2033de43":"setNewRatesCustom(uint256,uint256,uint256,uint256,uint256,uint256)","20352a6e":"ChildDeposit()","2035d6b4":"addAccountData(string,bytes)","20364306":"setMaxLinkedWalletCount(uint8)","2036e2f7":"getCurrentExchangeRate(uint256)","20375692":"initVesting()","2037fcbf":"withdrawInvestment(uint256)","2038d1e5":"setTokenMintFeeAbs(address,address,uint256)","2038e2e6":"timestampLast()","2038e80a":"mixFormula()","20392160":"round1Sold()","20396553":"safeMul(int256,int256)","203967a5":"toDie(bytes32)","203985d6":"getWeeklyTickets(address)","20398971":"abiOf(uint256)","20398b83":"sendPrepaidEthTweet(uint256,string,uint256)","2039b386":"isHashSigned(uint256)","2039d9fd":"depositERC20Token(address,uint256)","203a318f":"ico_startdate()","203a79f6":"cutoffTimestamp()","203ab888":"collectOriginalBet()","203b2352":"_checkOpenings(uint256)","203c03fa":"Coinflip()","203cbee2":"ownerPetTransfer(address,uint64)","203d39ff":"getOrderBook(address,address)","203dacb9":"PrivatePreSale()","203e0dc9":"SupbToken()","203e3204":"goldIfFreeze(address)","203faa89":"lastState(address)","203fb521":"addTransaction(address,uint256,bytes,uint256)","203fec23":"LogTransfer(address,address,uint256,string)","204009d2":"transferForMultiAddresses(address[],uint256[])","20409b47":"updateContent(string,uint256)","2041518d":"calculatePrice(uint256[],address)","2041b997":"tokenizeProperty(string,address)","20422fd9":"setAutoInvestByAdmin(address,bool)","204241cb":"leaveTeam(uint256)","2042495b":"changeUsed(address,int256)","2042e5c2":"removeWhiteList(address)","2043285d":"getMarketMakers()","2044b21b":"exceedsSaleCap(uint256)","204525e6":"mul256()","204605ad":"ngrzicoToken()","2047e4af":"updateTokensState(uint256,uint256)","2048cba4":"inGroup(address)","2048e5f7":"PaytherToken()","20495427":"setBreedingAuctionAddress(address,address)","204a88c5":"hasAgreement(bytes32)","204b21d1":"AVAILABLE_BONUS3_SUPPLY()","204b676a":"numVestingEntries(address)","204d3d65":"getCountPlayersOfTeam(uint256)","204e6749":"rewardToken(address,uint256,uint256)","2050c26e":"preSaleFourthCap()","205140c7":"totalClaimableTokens()","20514abf":"tktotal()","20522347":"changeEndDate(uint256,uint256)","20523d0d":"closeAgreementWithTimeout(bytes,uint8[2],bytes32[2],bytes32[2])","2052de16":"checkContinuousPurchase(uint256)","2053480e":"ActionMiningPlat(address,uint16,address)","205360e0":"setReward(uint64,uint256)","2053e690":"turnOffOraclize()","20544010":"getWinningsForRecordId(uint256,bool,bool)","20547a42":"increaseDailyTransactionVolumeReceiving(uint256)","2054b2c6":"assert(address,address)","2055c2ff":"SerchUserPurchase(address,address)","20566ae8":"initMonsterClassSiteSet()","2056ab36":"NewNodePriceTicker(string)","20572943":"SignedMessageOracle(bytes32,uint8,bytes32,bytes32)","205730fd":"SELL()","2057420b":"withdrawVault(uint256,address)","2058308d":"_addPropertyValue(bytes32,address)","20592076":"HeyToken()","2059c548":"exerciseOptionsDeadline()","205b1946":"hasContributed(address)","205b931e":"addOracles(address[])","205ba186":"DSJL()","205c2878":"withdrawTo(address,uint256)","205c7cf5":"issueCenturion(address)","205c9cc7":"w()","205d0063":"feeTakeExporter()","205d6c86":"purchaseEgg(uint64,uint16)","205dc0ee":"poolAddressCapTier1()","205e0e26":"advisersCliff()","205f3b58":"calculateOwnerCut(uint256)","2060a150":"props()","20610779":"deathData_a2()","20614514":"HHDToken()","20620f37":"onAuctionEnd(string)","206288d3":"deployBlockNumber()","2062e457":"setDirectPaymentThreshold(uint256)","2063165d":"union(uint256[],uint256[])","206369fa":"AthleteToken()","206465f7":"_getPendingOwner()","20647eb7":"externalFailure()","20651d5d":"batchTransferToken(address,address[],uint256[])","20654277":"ArtsCoinV1()","206545c2":"DIAMOND()","206607f2":"updateCanFetch(bool)","20675504":"hyperInterface()","2067c85c":"transferTokensFromMarketingAddress(address,uint256)","20688582":"saleIsRunning()","20689f29":"preSalePeriod()","2069381a":"multiPresaleMint(address[],uint256[])","20694db0":"addIssuer(address)","2069de94":"TonalQuantum()","2069f66c":"isPresalesNotEndedInAdvance()","2069fc46":"excludeAmbassadors(uint256,address)","206a44f3":"getNum(bytes,uint256)","206b64b4":"generateName(bytes16,uint256,uint256)","206cfd24":"cleanFinishedOperations(uint256)","206d0125":"getWithdrawnFromBatch(address,uint8)","206d1fde":"setMegaAddress(address)","206d468f":"PriceOracleInterface(address,address)","206ec7a1":"multisend(address,bytes32,address[],uint256[])","20701967":"confirmPlatformWithdrawal()","2070748c":"XeroBest()","20709b35":"jackpotPaused()","2070b6de":"donationPhase()","20714f88":"setSelfDestructBeneficiary(address)","2072343e":"MeowToken()","2072863b":"setCMO(address)","20729b83":"DistributeButtonIncome()","2072cde2":"NewsCash()","207368fc":"startSelling(uint256,uint256)","20745669":"ClaimedSignature(address,string)","2074cc86":"MikCoinToken()","2075281c":"Marko()","2075eec6":"tokenQuantities()","20768ee8":"getProposalID()","20770caf":"GRUCoin()","2079405b":"AmountToDistribute()","20799608":"convertDecimal(uint256)","2079fb9a":"signers(uint256)","207a6c33":"calculateCurrentVirus(address)","207a6d80":"TukBuk()","207aba24":"Migrate()","207acb53":"_calculateRequiredTokenBalance(uint256,uint256)","207b89e2":"purchaseLand()","207bd99d":"ableTransfer()","207beb59":"getRateIcoWithBonus()","207c64fb":"validate(address)","207cb710":"grantInvestorTokens(address)","207e6467":"pieBalances(address)","207f4f38":"contTransfer(address,uint256)","2080d8dc":"EVTCTLToken(address,uint256)","20813154":"deregister(bytes32)","2081e911":"Set()","208318bd":"Total_Amount()","20832219":"setOps(address,bool)","2083250d":"Atriark(uint256,string,uint8,string)","20834ed0":"AddPlayers(address,address)","20835e8c":"getBet()","2083c730":"_hatchEggs(address)","2083cbd8":"execAirDrop(address,address[],uint256[])","2083f44f":"lastFell()","20857295":"setErc20TokensContract(address)","2085f554":"approveAndCall(address,uint8)","2086ad60":"MiewGold()","20871322":"ForecastingFactory(address)","208838c8":"tokenPerWai()","20885d9e":"PGE02CH()","208904c7":"startFrom()","208972b4":"PartialPayment(uint256,address,address,uint256)","2089d0c9":"Swachhcoin(address)","208a099c":"createKitty(uint256,uint256,uint256,uint256,address)","208a9e37":"tweakRefundStatus()","208af09f":"setIsForking(bool)","208b080f":"changeExpiryLimit(uint256)","208b3116":"next(uint256,uint256)","208b7427":"AgriChainContext()","208c1019":"BLOCK_BASIC_PRICE()","208c8692":"mint(bytes,uint256,bytes,bytes)","208ca719":"SellIPG(uint256)","208df65f":"getValueByNumber(uint256)","208e1cc3":"writeConditions(uint256,string)","208e8914":"atFundDeposit()","208eba04":"_withdraw(address,uint256,address)","208ebf16":"lpBidVolume()","20907d9a":"BlockClout()","20909455":"triggerAirDrop(address[],uint256)","20909fa0":"communityCurrency()","2090b0a8":"m_allowPrivileged()","2090cf8b":"consultBalance(address)","2090d5e9":"lookupByProject(uint256)","2090d8a6":"trackOdd(uint256)","2090f3e3":"lethalBonusAtHitsLead()","209164d5":"_processPurchase(address,uint256,uint256)","20917902":"globalether()","2091f2d9":"ICOoverTimeStamp()","2092970f":"StartDistrib()","20940b13":"btcTransactionClaimed(uint256)","2094e9d8":"newJob(bytes32,bytes32)","20956341":"slice2(bytes,uint256)","2095f2d4":"endCrowdsale()","20965255":"getValue()","20968dc7":"rewardHistoryLengthOf(address)","2096b768":"getCoreAddress()","2096c958":"GEXAirDrop(address)","2096f2ff":"issueTokensMultiple(uint256[],uint256[])","2097dd04":"getLatestAuthorizedAddresses(uint256)","2097e5f0":"VaultbankToken()","209878b9":"lockReleaseTime()","20987e64":"addInvestment(address,uint256)","2098e37a":"LogBoonReleased(address,uint256,uint256,uint256)","2099940e":"freezOne()","209a5b8a":"moneySumAtSettlement(address,uint256,int256,uint256)","209ab711":"registerReferral(address)","209b7067":"CALLGToken(uint256,string,string)","209b80ce":"previousstageloser()","209bb163":"Ethex(address,address,uint256,uint256)","209cccd7":"channelCloseTimestamp(uint64)","209ebc08":"isPaid()","209f3c9c":"MINIMAL_PARTICIPATION()","20a0045a":"SALE_END_TIME()","20a0128e":"ICOEndDate()","20a09dec":"COMM_SUPPLY()","20a168b1":"coinsPerEth()","20a17b24":"dexWallet()","20a2b135":"forkThis()","20a3952b":"MyTestGameToken()","20a4e8f8":"_clearSnapshotDelegators(uint256,address)","20a60ace":"TokenBurner()","20a733df":"countPerformers()","20a7b2d7":"_setMintFeeProp(uint256)","20a7d5c3":"lend(uint256,bytes,address,bytes)","20a99bd0":"templates(address)","20aac36f":"getstopBlockNumber()","20aba08b":"rho()","20abf417":"stageFourCap()","20acbc83":"withdrawTokensFromWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","20ad3874":"vestingBonusMultiplierPrecision()","20ad8a81":"setTeamTokensPercent(uint256)","20ae2059":"setMaximumBet(uint256)","20af0841":"_payPayee(bytes32,address,uint256)","20af2042":"setCountPerStep(uint256)","20b023c8":"disavow()","20b0554e":"payoutBalance()","20b0747f":"start1stRound()","20b0961c":"pE(uint256,uint256,uint256,uint256)","20b0eafb":"PoWH4D()","20b0fe2c":"setGlobalParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint32)","20b1b0ab":"getStuckCoin(address,uint256)","20b1d054":"TAAS_VAULT()","20b27291":"setFinalized(bool)","20b28ade":"getIPFSHash()","20b2af52":"Author()","20b2d97b":"LiquidDemocracyRules(address,address[],uint256)","20b3c9c9":"InfinixSupply()","20b431aa":"dividendDivisor()","20b44b29":"lockTransfer(bool)","20b4577e":"numBonuses()","20b4fc29":"setBbAddress(string)","20b519bb":"setBarrierAsOpen(bool)","20b652ba":"chainedFunctions()","20b748f4":"REGULAR_TYPE3()","20b7ceb8":"R2Xtoken()","20ba5b60":"insert(bytes,bytes)","20bacfbd":"addDoc(string)","20bb0ef6":"originalHash(uint256)","20bb280b":"buy5(address[],address[],uint256[],bytes,bytes,bytes,bytes,bytes)","20bb2adf":"setAllowedTransferFrom(address,bool)","20bc4425":"getHost()","20bcbee5":"EarlyTokenSale(address,address)","20bd0475":"resetLotteryBalance()","20bd46b7":"drawTertiaryAWinners(uint256)","20bf0c52":"Derived(uint256)","20bf2f47":"_setAddresses(address,address,address)","20bf92ca":"oldSeeleToken()","20bfa95c":"bookAndCalcRemainingPremium()","20bfde8b":"s24(bytes1)","20bfec70":"WatchFees()","20c0b493":"getWarriorChestPrice()","20c12f16":"penalizeInactiveJuries(address[],uint256[])","20c21ba5":"_setTypeValue3(uint256)","20c28b85":"schelling(address)","20c2d5e4":"withdrawAffiliatePot(address)","20c2f40b":"doCalculate(uint256,bytes32)","20c381af":"cityPoolTotal()","20c3be47":"_createZombie(string,uint256)","20c5429b":"revoke(uint256)","20c5478f":"RtBCoin()","20c55a8a":"AirDropAFTK5May()","20c58794":"PHN()","20c5b497":"recoverAddressFromBalanceProof(bytes32,bytes32,uint256,bytes32,bytes)","20c5e29a":"increaseDailyTransactionVolumeSending(uint256)","20c726b4":"view_product(uint256)","20c8580f":"getBalanceEthContract()","20c8651b":"makeFee()","20c90167":"distributeCDD(address[],uint256,uint256)","20c93c62":"trackFee(uint256)","20c9d73c":"validCountryId(uint256)","20c9f377":"OneUpToken(address)","20ca0418":"getEscrowById(uint256)","20ca292e":"AUFBToken()","20cad613":"isVersionLogic(address,bytes32)","20caea39":"surprisePanda()","20cb27fb":"requireWhitelistingBeforeDeposit()","20cb7bce":"takeFee(address,address,uint256)","20cc6889":"getAvatarByNickname(string)","20cc7b4e":"changeToken(address,address)","20cd2141":"advisorLockUp_address()","20ce4c66":"getInteractive()","20ceb1bb":"SetCoinManager(address)","20ceb536":"grantToSetUnpausedWallet(address,bool)","20cf3e1f":"maintenance_mode()","20d00018":"jackpotTime()","20d01a7f":"ContestClosed(uint256,address[],address[])","20d0c13c":"getStatusModerator(address)","20d19181":"crowdsaleEndedBlock()","20d3a0b4":"unlockPeriod()","20d3fc20":"totalSeedStage()","20d615c2":"testControlTransferDisableNotEnabled()","20d71dad":"_repopTransaction(address,uint256,uint256)","20d76113":"admin_tokenBurn(uint256)","20d786b5":"withdrawalCounter()","20d7d367":"allowRegistryUpdate()","20d7d860":"ahmadToken(uint256)","20d8741f":"Feed()","20d8dad0":"checkWhitelisted(address)","20d95f90":"removeInt256(bytes32)","20d9822e":"setAnyoneCanCall(address,string,bool)","20d9a9e2":"getChallengeType(uint64,uint256)","20db0c7e":"B21Token(address,address,address,address,address)","20db31d6":"totalFortunes()","20db91e2":"createPartner(address,uint256,uint256,uint256)","20dc3d06":"bpLockUp(address)","20dc407a":"creditOwner()","20dc4677":"minPublicContribAmount()","20dcce99":"PRE_CROWDSALE_CAP()","20dce978":"setExchanger(address,address)","20dd60f5":"setEnvelopeType(uint256,uint256[2])","20df7f35":"DATE_TOKENS_UNLOCKED()","20dfcd27":"purchaseCountry(uint256)","20dffb08":"testCancelSellOrder()","20e07e7f":"changeCardCost(uint256)","20e0dc9f":"RTCoin(string,string,uint8)","20e1063e":"toekensForBTCandBonus()","20e12a43":"createRound(bytes32,bytes32)","20e25965":"timestampRelease()","20e33b13":"GoodBit()","20e3dbd4":"setConfig(address)","20e537c7":"isTransactionAlreadySettled(address,bytes32)","20e561f3":"BecomePharaoh(uint256)","20e57371":"ownerVault()","20e59116":"startChampionGame()","20e62bbc":"StreamityEscrow()","20e647e1":"checkBetColor(uint8,address,bytes32,bytes32)","20e65a42":"stakeForAirdrop(address,uint256,bytes)","20e6a2cb":"getStrField1()","20e6e921":"transfer(address,uint8)","20e76d31":"_solveGame(uint256,uint256,uint256)","20e87093":"getDSTSymbolBytes()","20e89790":"POWR()","20e979b1":"assignBank(address)","20e98bf4":"setNick(string)","20e9aac3":"playerTimestamp(address)","20ea2533":"authorizePayment(string,bytes32,address,uint256,uint256)","20ea31f8":"giveTo(uint256,address)","20ea8d86":"revokeConfirmation(uint256)","20eb2a87":"setContract(address,address,address,address,address)","20eb6dec":"frozenControl(address,uint256,uint256)","20eba3f2":"gamesLength()","20ec0f01":"lastBlock_v12Hash_uint256()","20ec75c2":"searchStartIndex()","20ed1a52":"badge(address,address,uint8)","20ed9451":"set_active_contract()","20edae5a":"createChallenge(uint256,string,uint256)","20ee0c94":"setUrl(bytes32)","20ee5445":"addToPrivileged(address)","20eea675":"ESOPOffered(address,address,uint32,uint32)","20eeba1f":"testConstructorUsingNewContract()","20ef57ed":"bumpCounter(uint256)","20f067a8":"PRETDESupply()","20f06c9b":"start_LOCKUP(uint256)","20f0751d":"turnOn(address)","20f0c28f":"MainContract(string,address,address,string)","20f0db91":"VerifCert(uint32,bool,bytes,bytes)","20f10ae7":"_supportsERC165Interface(address,bytes4)","20f10fdd":"tokenSupplyLimit()","20f1895c":"fechVoteSumNumForCandidate(address)","20f1d85b":"removeApprovedAddress(address)","20f317fb":"districtContractAddress()","20f320d0":"setBonusExtra(address,uint256)","20f361b3":"optionExercise(uint256)","20f3d413":"getTargetBlockNumber()","20f4014a":"ApolTestToken()","20f4914a":"changeMyString(string)","20f4d7aa":"redeemPayout()","20f541fa":"purchaseAsQualifiedPartner()","20f5a0b9":"readTeamByIndex(uint256)","20f5afdf":"OwnershipTransferInitiated(address)","20f5e8dd":"resetBalance()","20f65816":"extractToken(address,address)","20f71018":"Aqo()","20f727e2":"Caller(address)","20f756bd":"getArmySoldiersCount(uint256)","20f801d4":"payout(address,address,uint256)","20f86e9f":"_isBonusAvailable()","20fa6fd9":"ethSendSameValue(address[],uint256)","20fa70b0":"getAvailableWithdrawableCount(address,uint256)","20fb2bc2":"AllowClaimBTC(bool)","20fb36af":"Test8J()","20fb9bad":"LogSortedOffer(uint256)","20fc4881":"getCheckpoint(uint256)","20fcf2e5":"Castor()","20fd8861":"customerWallet()","20fea5cf":"getUserTaskAtIndex(uint256)","20fee8f1":"_timePer()","2100bf7a":"lolaToken()","21015328":"getLLV_edit_28()","21027354":"buyerHistory(address,uint256,uint256)","21029f47":"chickenHunt()","2102df31":"_totalDonations()","2104c2bb":"fundTeamInstant()","2104cdd2":"totalNumberOfScammers()","2104d832":"AddHelenium(address,uint256)","2104ebf1":"executeWithdraw(uint256)","2104fa0b":"skinIdToOwner(uint256)","21059e63":"createProposalAndPublish(bytes32,string)","2105c049":"setCSO(address)","21065f10":"mintInternal(address,address,uint256)","21067b3f":"startRoundWithFirstBet(uint256,uint256,uint256,bytes32)","210790c8":"signWholeConfiguration()","2107a796":"createGame(string,string,uint256,uint256,string,string,string,string,bool,string)","2108292e":"mint_(address,uint256)","210846ae":"is_kyced(address)","21090b31":"_decrementInventory(uint256,uint256)","210970c5":"update_count(uint256)","2109b408":"bitsMask()","2109cf80":"depositEth(address,uint256,bytes)","210a6eec":"sendMultipleAddress(address[],uint256[])","210a854b":"preIcoTokenHoldersAddresses(uint256)","210a8d0e":"changeGranularity(uint256)","210ab6af":"numOfJingles()","210ae4d5":"setTransferDisabled(uint256,bool)","210b7e0b":"tokenAllocation(address,uint256)","210ba961":"demurringFeeOwner()","210bc472":"ownerTokensMinted()","210bd306":"getCurrentHunterLicencePrice()","210c1f29":"closeBoard(uint256)","210c5a56":"_removeMinter(address)","210c5ff6":"getBlockNumber(bytes)","210d14b8":"burnPREICOTokens()","210d2bba":"PRICE_MULTIPLIER_PREICO2()","210dee2f":"setMigrateOut(bool)","210e2484":"icoDiscountPercentageLevel3()","210e734c":"isBoxItemId(uint256)","210e9a34":"getPendingReferals(address)","210f5dda":"createToken(string,string,uint8,uint256)","210fcbf6":"createPromoCutie(uint256,address)","210fd271":"sizeLimit()","210fe93b":"catIndexToAddress(uint256)","2110273d":"addToShareHoldersProfit(string,string)","21105d35":"addressForNonce(uint8)","21106109":"finalRate()","2110a57c":"User(address,bytes32)","2111006f":"create(address,address,bool)","21114904":"balanceOfEther(address)","2111871c":"endPreICOStage2()","2111c0f9":"freezeDeliverMuti(address[],uint256,uint256,uint256,uint256)","2111d1e2":"OnUpdateMessage()","21129137":"saleover()","2112e7fe":"getListGames()","2113342d":"totalDividendPoints()","2113aab4":"BTL_IMMORTAL()","21141c38":"updateInvestorFunds(uint256,uint256,address,uint128)","21141de0":"ReturnEthToEthero()","2114fd0f":"AxpireToken()","2115d328":"getSemiResult(uint256)","2115fd55":"RecievedEther(address,uint256)","21166476":"ARC()","2116b530":"ChangeOwner2(address)","21180138":"isCA(address,address)","21180722":"init(int256)","21187172":"Gate(address)","21188011":"maxIssuedWithAmountBasedBonus()","2119249f":"getNumTokens(uint256)","21194bc0":"devCutPercentage()","211a048a":"getFastestSpaceship()","211a04db":"totalToDistribute()","211a0f39":"ERC20TokenComplete(uint256)","211a1ba8":"changeTokenController()","211b2758":"changeBlockedTimeForInvestedTokens(uint256)","211b4f54":"startUpdate(uint256)","211b72a3":"sub1(uint256,uint256)","211db50d":"allowNewStakes()","211e28b6":"setLocked(bool)","211ed6c1":"freeTransfer()","211f0b93":"getCreateReputationTokenUniverse()","211f0ef9":"SaleOfChametz()","211f390e":"ECO_SYSTEM_HOLDER()","211feec5":"executeEtherDeltaSell(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,bytes32,uint256)","211ff90c":"SpiceControlled(address)","2120e527":"stakingBonus(uint256,uint256,uint256)","21217668":"getDrawBlockNumberByWinner(uint256)","2121dc75":"isTransferable()","212257de":"changeCap(uint256,uint256,uint256)","2123015e":"test_insert_findWithHintNextIncreased()","2123476b":"startConstitutionPoll(address)","21235083":"cancelSubscription(uint256)","21241e44":"addressOfTokenUsedAsReward3()","2125b65b":"transfer(uint32,address,uint224)","2126a923":"reverse(address,uint256)","2127c30a":"setBlockHash(bytes32)","2127fe90":"addOnStage(address,uint256)","21288400":"lastPurchaseTick()","21289506":"MichaelCoin()","2128a580":"total_claim_codes()","212954dc":"setAddBonus(uint256,uint256)","2129e25a":"finalBalance()","212a6fd3":"CloseEntry()","212a850c":"showMyNumber()","212ac4b5":"UnicornChain()","212ac7d1":"mintNewSpinner(uint256,uint256,uint256)","212bf316":"setCaps(uint256,uint256)","212c3fce":"returnTokensToAirdropper(address)","212c5fea":"close(bool)","212c8157":"disallowTransfers()","212d6723":"payRoyalty()","212e2596":"sellOrderTotal()","212ebbd6":"addTokenLock(address,uint256,uint256)","212f6066":"enableInvestment(address[])","21309ae3":"setTimeBonuses(uint256[],uint256[])","2131c68c":"daoAddress()","2132626f":"_removeByIndex(uint256)","21326768":"finishGame(bytes32)","213294cd":"crowdsaleHasEnded()","2132ce0a":"BASE_AMO_TO_ETH_RATE()","2132eb23":"TreasurerToken()","21335ad5":"getDepositAggregate(address,uint256)","21338d1b":"rewardsWithdrawalProposed()","2133ddeb":"settleBetV1(uint256,uint8)","2133e3b9":"calculatePercentage(uint256,uint256)","213408da":"sendCreatorReward()","2134214b":"getPreorders(bytes32)","21346edd":"savedBalanceToken()","2134927e":"setAuctionParms(uint256,uint256,uint256)","21355869":"getAuctionTimeLimits(bytes32)","2135810e":"curRequestId()","2135d2e4":"lasttokencount()","213671bf":"mainSale_TokenCap()","213681cd":"getRecord(bytes32)","21370942":"updateEthPrice(uint256)","21376d07":"scheduledPayout()","2139c2aa":"setwinnerLimit(uint8)","213a2622":"offerAsSacrificeFromVault()","213a72a7":"LightofGalaxy()","213ac932":"addUser(address,uint256,uint8,bytes32,bytes32)","213ad495":"TimeWeekTwo()","213ae9ec":"newGame(uint256,bytes8,uint256,uint256,string)","213aedb8":"getAllGames(bool,uint256,uint256)","213b9eb8":"setAddr(string,address)","213c3375":"callCustomTokenFallback(address,address,uint256,string,bytes)","213d6771":"editionData(uint256)","213d8f4a":"setCurrentRewardNum(uint256)","213db226":"move(address,address,uint8,uint256)","213e609f":"getTknOfferAmount(uint256)","213e84d3":"maxIssueTokenLimit()","213ea6bb":"donationReceiver()","213f44ab":"getUserAddressList()","213f9ad4":"generateWinners(uint256)","213fe044":"getInstanceAddress(address)","213fe2b7":"getContracts(address)","21420a3d":"_depositTokens(address,uint256)","21424e7d":"ETHcollected()","2142adc9":"changeMargin(uint256)","21435e07":"setTokensWallet(address)","2143da91":"GameOfThrones()","214405fc":"addToWhitelist(address,uint256)","21446cfe":"unitDefense(uint256)","2145465a":"SOUNDBOY()","2145a455":"getRebackRate()","2145e36c":"testBitSetFailIndexOOB()","21462191":"bid3(address,uint8[],uint8[])","21464e71":"inOneYear()","2147783f":"smitToken()","21479265":"addToBlackList(address,address)","21484786":"notificationFee()","21486833":"maxRewardUnitsAvailable()","21491e82":"secondCurrentAmount()","214958ba":"BLOCKCURRICO()","214962d1":"identifierHash(string)","21499737":"setIco2Tokens(uint256)","2149c619":"functionThree(uint256,uint256,uint256,uint256)","214af6b9":"acceptTokensFromUsers(address,uint256)","214b146f":"storeName(uint256,string)","214bb60f":"finalised()","214c2a4b":"getServiceURI(address)","214c9d50":"WritedrawStatus()","214cdb80":"registerInterface(bytes4)","214dda84":"regularPhase()","214e52ca":"transferAllowed(address,address)","214e5f3a":"setForwardUpdateFeesTo(address)","214e8a47":"getSingleLocker(address)","214f71fe":"tokenFulfillmentDeposit(address[2],uint256,uint256[7],uint8,bytes32[2])","2150097f":"timerInfo()","2150c518":"getKeys()","2150c75d":"newItem(uint256,string,uint256)","2150cd56":"setRateAdmin(address)","2151f9a0":"TCT(string)","21520c5f":"calculatePayout(uint8,bool,uint256)","2152b483":"OWN_SmartContract_Allowed(address,bool)","2152c649":"LOVEYOUToken()","2152ebac":"getContributionAmount(uint256)","21537caf":"setRequiredBlockQueueTime(uint256)","21538acb":"approveCallGas()","2153bade":"ZJZJToken()","2153bf23":"x3Token()","21542702":"MakeBet(address,uint256)","215458b0":"salvageNotAllowedTokensSentToContract(address,uint256)","2154dc39":"maxMintable()","21554dca":"GetCurrentBonusStageTokenBalance()","2155af2f":"execute(address,uint256,bytes1[])","2156a96c":"getTotalSales()","2157320e":"votedAddress()","21575889":"distributionSupply()","2157ab24":"GetBankerRound(uint8)","21592a2b":"YaoMaoCoin(uint256,string,uint8,string)","21594110":"createProductionUnit1Beta()","215a3bcc":"setStatus(bytes32)","215a4862":"eligibleForBonus(uint256,address)","215a6ce4":"createBet(uint64,uint256)","215ac4be":"fillContract()","215ae66d":"mintForWebsites(address[],uint256[])","215afc5f":"totalTokenDistribution()","215b3e32":"fromBytes(bytes)","215b5411":"purchaseCallbackOnAccept(uint256,address[],uint256[])","215bad32":"TPTTransfer()","215bd303":"createWorkerPool(string,uint256,uint256,uint256,address)","215bf604":"addFreelancerFeedback(address,uint256,address,string,uint8)","215cb8df":"createIlliquidToken(address,uint256)","215cc031":"getAvatarByAddress(address)","215d6b61":"getTierOfMember(address)","215d902c":"extractString(bytes,uint8,uint256)","215de48a":"getParentCount(bytes32)","215de791":"getTankName(uint32)","215e25ea":"upgradeReferrer()","215f1cd1":"oraclizeSetWinner(uint256,uint256)","215f865e":"resetDropAddress(address)","215fce93":"changeExchangeRate(uint256)","216093aa":"getIsThirdPhase()","21614f62":"randomSkinAppearance()","2161d0e9":"tokensToP3D_(uint256)","21627dad":"getCart()","2163d49a":"lockedCore()","2163ef1a":"GangnamTokene(address,address)","216481d6":"icocontract()","21650145":"Revoked(bool)","2165e1aa":"withdrawRemainingBalanceForManualRecovery()","2165fef9":"allocateStrategicTokens()","21667940":"issueTokenAndApprove(uint256,address)","21670f22":"reward(address,uint256)","216716af":"ExoMiniumToken(address,address)","21687444":"newDAO(address)","2168c988":"transferToInternalLedger(uint256,bytes32)","2168ca06":"numberOfIndex()","216903f9":"confirmTx(bytes32)","216974cc":"refundNonCompliant(address)","216986b0":"entradaJugador(uint256)","216a5543":"getAllForSaleStatus()","216aa0ba":"proposalBlock()","216be181":"hodls(uint256)","216c1606":"_claimExistingCard(uint256,address)","216ced43":"setPenaltyDisbursal(address)","216d93d6":"pricers(uint256)","216de17a":"priceStage1()","216e2a97":"totalOrder()","216e3449":"changeToken(string,string)","216ea239":"miningResolve(uint256,uint256)","216ea5ec":"remainder(uint256,uint256)","216ec69b":"getColour()","216ecfa7":"Tbaol()","216ef940":"proxyUpgrade(address,address,bytes)","2170ebf7":"makerWithdrawEther(uint256)","2171454a":"bountiesKey(uint256)","2171526e":"Chewbaka()","21717ebf":"siringAuction()","2171dc73":"buyXaddr(address,address,uint256,string)","2172ac5a":"_requestExistsReverse(address,address)","217311ac":"getWords(uint64)","21733f6a":"sendDv(string)","2173a10f":"INITIAL_POLL_NONCE()","21745c15":"numberOfSales()","217477f6":"ICO_PERCENTAGE_3()","2174b88f":"transferBanker(address)","2174dcec":"ConfigPromoter(uint256)","21751df9":"BugBountyOne()","21752974":"compromiseContract()","21765510":"getLockedAvailable(address,string)","21765d23":"addLockedTime(address,uint256,uint256,uint256)","217720d7":"getHeldCoin(address,address)","21774f4b":"CUSTOMER_PERCENTAGE()","2177885d":"isOnAuction(uint40)","2177a36f":"getCountProof()","2178139d":"acceptAbstractToken_(uint256)","21795635":"TOTOAirdrop(address,address)","217987ad":"delBlackList(address)","2179f0f7":"EtherToken()","217aab68":"_updateCommission(uint256)","217ad35a":"minimalEther()","217af162":"whitelistKyberAddress(address)","217b97e4":"hatchMaxTime()","217bd046":"computePoolAmount()","217cab2b":"GetWhitelist(uint256)","217d9bbe":"depositExit(uint256,bytes)","217db8e8":"toBase(uint256,uint256,bytes8)","217f2d23":"CRVToken()","217fe6c6":"hasRole(address,string)","21815a1a":"updateHolderShareInfo(uint256)","21819e5c":"computeArtistTxFee(bytes32,uint256)","2181c11f":"batchNewAuctions(uint128[],uint256[],uint256[])","2182e6d8":"buy_lovelock(bytes32,string,string,string,uint256)","2182ebbf":"use(address,uint256,uint256,uint256,uint256,uint256,string)","2182f7b4":"MINIMUM_PURCHASE()","2182ff7e":"sellMNC(uint256)","21835af6":"__dig(uint256)","2183e390":"setTotle(address)","21842be3":"unlockTransfers()","218444ab":"Test2()","21844b08":"drWinChances(uint256)","21848580":"lastBlock_a14()","2184f977":"TRANSITION_WINDOW()","2184fe2c":"transferTechSupport(address)","2185072f":"SerpenSegmentCount()","21853009":"participantRoundRewarded(address,address,uint256)","21856b36":"interestOwed()","2185810b":"allowTransfers()","21858521":"tickets()","21860a05":"airdrop(address)","21861cce":"AUDITED_AND_APPROVED()","2187a833":"setGreenToken()","2187bdca":"getAllETH(address)","21887c3d":"has(address)","21895086":"RL(uint256,string,string,bool)","218a51e8":"UnFrozenTokenEvent(address,uint256)","218a7667":"addToBalances(address,uint256)","218a9640":"setTeamStatus(bool,uint256)","218bc5ec":"createBid(uint256,address,bytes32,bytes32,uint256,uint256)","218bd577":"enterGame()","218cd7a1":"POOPOO()","218d5637":"realSupplyWeight()","218d6ca2":"calcPurchase(uint256,uint256)","218d984b":"registryProxy()","218dd3dd":"checkIdentity(bytes32)","218e4562":"updateBalanceOf(uint256)","218e4a15":"getCooldown()","218e6877":"setDelegate(bool)","218e767d":"TokenFactory(address,address)","218eee82":"addAd(uint32,uint32,string,string,uint256)","218fbdec":"callWithdraw(address)","218fd1c4":"CompanyName()","218fe479":"generateRenown()","218ffb4c":"Fund(address,bytes32,address,uint256,uint256,address,address,address,address[],address[])","21901fa8":"WithdrawFunds(address,uint256)","219047f7":"MasternodeRewardSend(uint256)","2191207a":"setTAOFactoryAddress(address)","21914e29":"day2Start()","2191f4a9":"storjPrice()","219285d2":"presaleClosedManually()","2192b99d":"mintContributors(address[])","219356bc":"GxConstants()","21937192":"finishedSTOMinting()","21938610":"set0xExchange(address)","2193cdba":"send_all()","2194f3a2":"fundsWallet()","21956036":"SmartRouletteDividend()","2195845f":"withdrawAltcoinTokens(address)","21958a50":"AddressSeries(address)","2196ae0d":"hint(bytes32,string,bytes20)","2196feac":"createMarketItem(bytes16,bytes16[],bytes16[],uint256[])","2197021b":"proxyVotingContract()","21970c0c":"pay_royalty()","21974a74":"EtherNetworkConfig()","21978e58":"_removeSale(uint256)","2197b236":"Goldjunge()","21981514":"totalUnclaimedBidsAmount()","219862d0":"marketKebabs()","2198e780":"addDollarAmount(address,int160)","21998504":"setCompte_7(string)","2199d5cd":"registerUser(address)","219a6ead":"MICRO_DOLLARS_PER_BNTY_PRESALE()","219a6f04":"getFounderMember(uint256)","219bc76c":"currentRoundInitialized()","219c7ad1":"getwinningaddress10()","219caaa9":"reclaimChildOwnership(address)","219d0ece":"transferAdminship2(address)","219da4ac":"ResumeTokenContract()","219dabeb":"registerDeposit(address,uint256)","219dc688":"technicalPercent()","219df7ee":"ZTHTKN()","219f5052":"updatePokeMarketAddress(address)","219f72c9":"startICOStage3()","219fd010":"accredited()","21a19b2d":"neverdieSigner()","21a2ad3a":"nextSlasher()","21a2c72d":"BitcoinDublicate()","21a32e5c":"VanityCrowdsale(uint256,uint256,address)","21a33743":"DroidEIP20Token(uint256)","21a33e00":"gasReq()","21a389cc":"PRE_SALE_3WEEK_BONUS()","21a3fb85":"addValidator(address,bool)","21a49ec2":"LCoin()","21a4a5bb":"endDateOfSaleStageLast()","21a4c6c3":"openMarket(address)","21a4cdaf":"HDCToken()","21a5065e":"returnableTokens(address)","21a5c1c3":"buyItem2()","21a5dcfe":"multivestBuy(address,uint256)","21a638d8":"addTerminal(address,uint256,address)","21a6c649":"privatePresaleWallet()","21a6c7aa":"megabossCutPercentage()","21a78f68":"ref()","21a7d652":"EQUIPMENT_REWARD_TOKENS_NUMS()","21a804fc":"SphereToken()","21a83738":"getDragonPriceNo(uint256)","21a8a771":"setPort(uint16)","21a91d2b":"PrcntRate()","21a9cf34":"setTradeAddress(address)","21aa1706":"startPresaleTrading()","21aace42":"setTokenForSP(uint256)","21ab13ab":"maxBet(uint256)","21ab3074":"transferOwnershipOfStorage(address)","21ab561d":"MIN_BID_FRAC_BOT()","21ab7fb4":"marketplace_admin_controller()","21ab9177":"fixPlayerGraphic(uint256,string)","21abf58b":"feesB()","21ac01d8":"ClaimedTokens(address,uint256,uint256,uint256)","21ac5aba":"cityIndexToOwner(uint256)","21ac64af":"declareRCV(string)","21ac8967":"setPatentFee(uint256)","21b12a4b":"clearTransaction()","21b133ed":"icoTotalAmount()","21b1e5f8":"sendETH(address)","21b288d8":"endSecondBonus()","21b36a08":"setFee(uint64,uint256)","21b43777":"advisorCount()","21b48008":"getInvestorsETH(address,address)","21b4b3dc":"proposalsCnt()","21b55c42":"testConcat()","21b5b8dd":"extraBalance()","21b68d2b":"DyginoteToken()","21b6ac62":"lockGate()","21b6c321":"StoreProduct(bytes32,bytes1)","21b6fcbf":"SendFund(uint256,bytes32)","21b8092e":"setWithdrawalAddress(address)","21b8151e":"Mixer()","21b8b11e":"_addToDebtRegister(bytes4,uint256)","21b8d973":"returnHash(address[2],uint256[8])","21b920eb":"upgradeTank(uint32,uint8)","21bacf28":"getDefaultFee()","21bb79fe":"luckyDogInfo()","21bb86ab":"setExchange(uint256,uint256,uint256,uint256)","21bc84fd":"canCompose(string,uint256[],address,uint256)","21bc9a55":"buyTokens(address,address)","21bcc5e5":"multiBatchTransferFrom(uint256[],address[],address[])","21bdb26e":"maxPresaleSupply()","21bded12":"capitalPctBips()","21be2244":"PrivatePlacement(address,address,address,address,address)","21be26ed":"deauthorizeContractById(uint256)","21beba94":"lastTxBlockNum()","21beedf4":"BlocklancerToken()","21c0183e":"centralAdmin()","21c02472":"numberOfResolutions()","21c03a97":"setTradingOpen(bool)","21c0b342":"claim(address,address)","21c0e95d":"setBountyPool(address)","21c17ab8":"unproposeMilestones()","21c24081":"GDC(uint256,string,uint8,string)","21c26195":"distAirdrop(address,uint256)","21c4d650":"priceForBasePart()","21c5fb20":"Deposit_double_sum_paid_from_the_balance(uint256)","21c60ac6":"div(uint8,uint8)","21c60c74":"createMobster(string,uint256,uint256,uint256,string)","21c63a47":"getTicketCount()","21c6b951":"BetherCryptocurrency()","21c6d7b6":"BitbabeToken()","21c87627":"getUnlockedPercentage()","21c87ee8":"setMaxLevel(uint8)","21c882ef":"testGetCaseAtIndex()","21c88358":"anyTokenWithdrawal(address,uint256)","21c9a6b1":"localCheck(uint256,string,bytes32,bytes32,string,bytes32)","21cb1568":"registerArtwork(address,bytes32,uint256,string,string,uint256,address,bool,bool)","21cb18cd":"assignVested(address,uint256,uint64,uint64,uint64,bool)","21cbed35":"setOperationAttributesByRegulator(string,string,uint256,string)","21cda790":"tokensOwned(address)","21cdb03c":"shopShield()","21cde824":"fighterIndexToTeam(uint256)","21ce14a9":"injectTokens(address,uint256)","21cefec0":"tokenBuyRate()","21cf3514":"priceStalePeriod()","21cf5132":"setManualBonus(uint256,bool)","21cf9f22":"updPool(int8,uint256)","21d148ab":"weiForXau()","21d1a303":"checkRemained(uint256)","21d1b7a4":"TJ2()","21d269dc":"fastCashBank()","21d2daa0":"unFreezeToken(uint256)","21d3523c":"voteToHarvestFund()","21d36529":"feePercentage(uint256)","21d365af":"_processVestingRules(address,address)","21d376ce":"tokensOfOwner(bytes32)","21d3d2ee":"isMigrationFinished()","21d41bc2":"IRobo()","21d45bec":"getReverseFee(address,uint256)","21d4b08c":"numTicksTillAuctionStart(uint256)","21d50273":"createParty()","21d53fb9":"withdrawLockupTokens()","21d5c0f6":"finalizeAgent()","21d5cb51":"verifiedUser(bytes32)","21d65d80":"blockPart(uint64,uint64,uint64)","21d67daa":"internalFinishMinting()","21d6cdb6":"newPeriod(uint256)","21d739f1":"TokensIssued(address,uint256)","21d7bdff":"startCountDown()","21d800ec":"relayedMessages(bytes32)","21d80111":"getHero(uint256)","21d8ad4c":"getContractName(uint256)","21d9d5ba":"testRemoveLocked()","21da1719":"impl_unlock4Circulate(address,uint256)","21da94e7":"getSEScore()","21daae34":"getQuoteToBaseReturn(uint256)","21daf0f8":"TransferToReferrer(address,address,uint256,uint256,uint256)","21db06bc":"wolf4Balance()","21db087e":"getLevelCitizenById(uint256,uint256)","21db0f0d":"getImmortalsOnTheBattlefield(address)","21db2aa0":"getArtwork(uint32)","21dc04f4":"Vibranium()","21dc512e":"replaceSSPRegistry(address)","21dc74fa":"addWhiteLister(address,address)","21dcbbae":"HighJackpotHolder()","21de6b01":"setKtcAddress(address,bool)","21df0da7":"getToken()","21df2ea5":"getNewInstance(address)","21df8b9b":"addTotalBondValue(uint256,uint256)","21e01596":"logCall(uint256,uint256,uint256)","21e0f228":"winningNumbers()","21e2933a":"setBasicIncomeLimit(uint256)","21e38e81":"ownerCheck()","21e3cdd0":"voteDn(uint256)","21e5383a":"addBalance(address,uint256)","21e53d77":"_buyTokens(address,address)","21e5d0e4":"PRESALE_START_WEEK2()","21e5e2c4":"shareOf(address)","21e69b42":"dataMerkle(bytes32[],uint256,uint256)","21e6b53d":"transferTokenOwnership(address)","21e76826":"Gamblr()","21e866be":"getCompanyCreationCost()","21e88888":"setColor8(uint256,uint8)","21e92d49":"transferByOwner(address,uint256)","21e96b88":"setProxyManagementCurator(address)","21e9b296":"ExtractedTokens(address,address,uint256)","21ea2b8d":"delayOfICOEND()","21ec0129":"HAUZ()","21ec5981":"Jekyll_Island_Inc()","21ed0f64":"removeEmployee(uint256)","21ed46ad":"Dollars()","21ed47b3":"annualPos()","21edbe24":"pricesAndInventoriesOfDate(uint256,uint256,uint256[],uint256)","21ee102b":"removeExtension(address)","21ee6457":"set_sale_arbits_total(uint256)","21eeb9a7":"LogSaleCapReached(uint256,uint256)","21ef10f0":"revokeSelf()","21ef8368":"DataSentToAnotherContract(address,address,bytes)","21eff7fc":"getContribution(address)","21f032d3":"BitDAOToken()","21f0a727":"node_right_child(uint256)","21f0b382":"unblockClient(address)","21f118a6":"createByCOO(string,uint256,uint256)","21f1a18c":"battleRemove(uint256)","21f1b677":"updateTime(uint256,uint256)","21f222dd":"minWeiAmount()","21f2a9a9":"_getUnlockedTokensPercentage()","21f2ca3b":"unregisterUser(address)","21f2ed2e":"dividendDistributionEndTime()","21f35609":"CAT_FIRST()","21f38c6e":"bundlingEnabled()","21f3f338":"proposalCensorshipFee()","21f3ff41":"maxMultiRolls()","21f408be":"tk()","21f4911a":"addFiveParticipants(address,address,address,address,address)","21f4d29f":"getPoolHistory(uint256)","21f610d3":"endEarlyStage3()","21f6b513":"Airdropper(address,uint256)","21f72d82":"YODCToken()","21f7ac0d":"codeExportCost()","21f8a721":"getAddress(bytes32)","21f8dab6":"THRESHOLD4()","21f9a878":"NewHashnodeTestCoin()","21f9caef":"cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32,address)","21fa1730":"Ballot(string,string,string,uint256,address[],uint256[],uint256[])","21faf403":"getStatusLogCount()","21fb39d4":"WithdrawEvent(address,address,bool,uint256,uint256)","21fb9869":"getAdminLog(uint256)","21fc2cd1":"NounToken()","21fda809":"payment(address,address,uint256,address)","2200919f":"addVersion(string,address)","22009af6":"BASE_REWARD()","2200cdec":"finishPVE(uint256)","22017c5f":"DSTokenBase(uint256)","2202dcad":"FACTOR_7()","22039f89":"isServiceContract(address)","2203ab56":"ABI(bytes32,uint256)","2204ef4b":"getMeTokens(uint256)","22054fe0":"updInvestorEnabled(address,bool)","22057bc7":"getAllRevisionBlockNumbers(bytes20)","2206e837":"undisapprove(uint256)","220772a9":"starUpZero(uint256,uint256,uint256)","2207a93a":"etherInUSD()","22081c12":"processPayment()","22082c72":"getDoneSelfDropAmount(address)","2208ee1d":"_releaseTime()","2209e991":"sendBet(address,uint256)","220a0e36":"LoggedERC20(uint256,string,uint8,string,bool,bool)","220a2247":"givePermission(address,string)","220b4a73":"TCPC()","220c166c":"hatchingSpeed()","220c773a":"changeMarketingRecipient(address)","220d5d8d":"YioCoin()","220d7a7f":"NoteToken(uint256)","220d8707":"BONUS_DAY3_DURATION()","220d9944":"MailHustleCrowdsale()","220e44d0":"_buy(uint256,uint256,address)","220e5d06":"qshdrop(address[],uint256[])","220e693f":"ALLOC_ADVISORS()","220eb9b6":"run(uint256,bytes)","220ee9ec":"purchase_dates(address)","220eeab4":"BonumPreSale(uint256,uint256,address,address,uint256)","220f1202":"lowestAskAddress()","220f1aee":"createVoting(string,string,uint256,bytes32,address)","220f52c5":"whoIsTheOwner()","220f9dfd":"getFighterInfo(uint32,uint32)","220fde2e":"setSellPrice(uint16,uint256)","221067a1":"JULIAN_ALLOCATION()","221086af":"buyerBonus()","2210d525":"getRareAddress()","2210e0f7":"MassPay()","2211218a":"ARMtest()","2211944a":"ActiveAdmin()","2211c3b3":"eraseContribution(address)","22122cb3":"blockTokenFunds(address,uint256)","2212dbc3":"get_timestamp()","22132598":"numArtworks()","221353ca":"finalizeByAdmin()","22137935":"productsExported()","2213c7db":"tokenPreSaleRate()","2214f65d":"toWei(address,address,uint256)","221538f4":"BurnupHoldingCore(address,address)","22156bb2":"WerderCoin(uint256,string,uint8,string)","22159d89":"ticketsOwned(uint256)","2215fc82":"getONETIMESOLD()","2216573d":"internalIncreaseGoldKeyCounter(uint256)","22169ab3":"START_PRESALE_TIMESTAMP()","22174ebf":"TokenSBT()","2217bf78":"getReputationRewards(address,address,bytes32)","2219a95b":"DWBTPreICO(address,address,uint256,uint256,uint256,uint256)","221a66d9":"presaleFee()","221ab8e2":"setBlockResult(uint64,uint64,bytes32)","221b1c4a":"_NumOfStudentsPass()","221b30df":"btcPurchase(address,uint256)","221b5ec2":"setTimeBegin(uint256)","221b5fad":"getCardsCount()","221b850c":"changeInstallerEscrowAddress(address,string,address)","221d4dff":"create(string,uint256,string,string,uint8)","221e5da9":"GetContractStateEarlyTerminatedByTenant()","221e9370":"recordedCoinSupplyForRound(uint256)","221ed3cc":"CONSTELLATION()","221ed748":"shareCycle()","221ef94d":"userMigration(uint256)","222101d1":"vestingMappingSize()","222160c0":"isProposalExecutable(bytes32,uint256,address,bytes)","2221fb3e":"hasActiveBet()","22230fc4":"countFishAtBase()","22239e8e":"loanActivation()","2223a5da":"reserveCap()","2224044c":"calcWeiForTokensAmount(uint256)","22242382":"checkPriceAmount(uint256)","22245b64":"MAXCAP_TOKENS_ICO()","22246200":"deleteElementWithValue(uint256)","22250809":"BoardClaimed(uint256,uint256,address)","222594c5":"findModuleNameByAddress(address)","2226549e":"fixedLog2(uint256)","22284872":"Escrow(address)","22287914":"icoWallet()","2229d348":"attackMonster(uint256)","222a5343":"BOWTERC20()","222a95ee":"LastMsg()","222af991":"stringToUint(int256,string)","222b0d7d":"massRevoke(address[])","222b8947":"depositTokens(bytes32,uint256)","222c1390":"maxPublicSaleStage()","222cfe94":"myEtherBrosCount(address)","222d777a":"createEvent(string,uint256,uint8,uint256,uint256,uint64)","222d7e34":"currentRoundStart()","222f51e9":"getDailyHash()","222f5be0":"transferInternal(address,address,uint256)","22305fb7":"ShowSegmentation(address,uint256,uint256)","2231454f":"updateCampaignManagerContract(address,string)","223162e7":"WithdrawSharedExpense(address,address,uint256,uint256)","2231f72c":"setownership(uint16,uint16)","223208af":"walletName(address)","22326584":"WBE()","2233db62":"InvestorRegistry()","2233dbf4":"wantNewMinter(address)","22347d5b":"confirmTrade(address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","22351b6b":"VibeToken()","22366844":"isRegistered()","223699c1":"units30percentExtra()","22372795":"HIT()","2237d55c":"setTargetDiscountValue1(uint256)","22384945":"checkPresaleBalance()","22393ef4":"bundleFirstTokens(address,uint256,uint256[])","223964bc":"queryAccounts(address)","2239c48a":"startUpgrade()","2239d43b":"uintMinimalSize(uint256)","2239e688":"getUrlFromKey(bytes32)","223a6399":"newAssociate(address)","223ab941":"transferForProjectTeam(address,uint256)","223b01db":"decimalsETHToUSD()","223b530e":"antiques()","223c217b":"withdrawTokenTo(address,address,uint256)","223c5939":"UnilotBonusTailToken(address)","223cd20e":"shareHolderByAddress(address)","223dad70":"sendMsgSndr(address,address)","223db315":"allow_refunds()","223dcc74":"left14(uint256)","223e5a9d":"pls()","223e97be":"setParent(uint256,uint256)","223e9f17":"_redeemSameClassAdoptedAxies(address,uint8,uint256)","223fcbc9":"_locked()","223ff4cc":"getShipsIds()","224076d4":"pegIsSetup()","22408401":"ArtSale(address,address,uint256,uint256,uint256,uint256,uint8,uint256)","2240b645":"GetClientCategory(address)","22412ded":"MyProducts(address,uint256)","2241a733":"GOLD_AMOUNT_XPER()","22425fa4":"feePeriodDuration()","22427047":"Payout(uint256)","22429085":"updateFees(uint256,uint256,uint256)","2242cf7f":"getConBal()","22434836":"setTimes(uint256,uint256)","2243fb15":"getHashratePerDay(address)","22446093":"editPerson(address,address,string,uint256)","2245675f":"setCustomerSignature(address,uint256)","22471e16":"identityApproved(address)","2247328c":"vote01YesCount()","224846de":"deletePaymentContract(uint8)","224854f7":"Trie()","224993c2":"setTimeBlock(uint256)","224a1775":"transferByOwner(address,uint256,uint256)","224a6ac3":"nextPE()","224a8174":"TESTER()","224a967c":"CTSCoin()","224b4bfd":"TYCOONCoin(uint256,string,string)","224b5c72":"consume(address,uint256)","224bed07":"transferIndexed(address,uint256)","224c1c9b":"getNonVestedBalanceOf(address)","224c4657":"createOrder(address[3],uint256[3])","224ccc49":"chainLastMessageHash(bytes32)","224d5d54":"wylouToken()","224dc278":"dis()","224e5efd":"DNACoin(address,address)","224e7462":"removeToken(bytes32)","224f127d":"LogNewWhitelistedAddress(address,address,uint8)","224f143a":"setme()","22500af0":"OwnershipTransfer(address,address)","22518a75":"getVotersCandidateVote()","2251a8a9":"isSubscribed(address,address,string)","22526635":"payOut(uint256,uint8,uint256)","22529fff":"getReferral(address,address)","2252d5c1":"exemptMeFromFees()","225386fe":"SimpleERC20()","2253fff1":"initialCongress(address)","22542fb6":"collectTokenPhaseStartTime()","225435c0":"detach()","22547931":"registerOperation(uint256,string)","22551da7":"double(address,bytes32,uint8,uint256)","22554f34":"getT()","22555bea":"UNITv2(address)","22556bd7":"createRound(string,bytes32[],uint256)","2255ad10":"RefugeCoin()","225640ab":"getOrCreatePreviousFeeWindow()","225682d1":"test_contractBalance()","2257406e":"getMemory(uint256)","2257defa":"removeCustomerFromBL(address,address)","2259315d":"TokenFactoryCN()","22593300":"Small(address)","2259d221":"LifeSet_005()","225a1d46":"PODH()","225a905f":"NewSubscription(address,address,uint256,uint256)","225b6574":"hasBase(address,uint64)","225c4011":"cyberEntry(address)","225c5567":"withdrawLeftTokens()","225ce00f":"_createAuction(uint256,string)","225cf990":"setAgriChainContext(address)","225cfd59":"addPromille(uint256,uint256)","225da7e5":"transferManagerFactory()","225f406a":"buyInSaturday()","225f9d7d":"stopIt()","225fce8d":"getGameByPlayer(address)","22609373":"calculateEthereumReceived(uint256)","2260b98b":"finalizeVoting()","226187dc":"maxPreICOTokenAmount()","2261c6d9":"AllowedAddressAdded(address)","2262cd94":"wroom()","22636e65":"setContractValue(address,string,uint256)","2263ae04":"POHD31()","2263e8b7":"routingCodes(uint256)","2263f2c5":"createTokens1()","22643a47":"JokerCoin()","226454c1":"getGoldDataDocumentation()","22657697":"priceForStage(uint256)","2265931d":"transferToken(address,uint256,uint8)","2265a94b":"ValyutaTestCoin()","22665bc9":"setICO(address,uint256)","22666da6":"makeGuess(uint256)","226685ee":"Visit()","22673030":"SALE_START()","2267b2e3":"veredictum()","2267b30d":"removeFounder(address)","22686250":"index(int256,uint256)","2268a358":"changeMultisig(address)","226942e6":"RollEvent(address,uint256,uint256,uint256,uint256)","2269d2ec":"addNewPotatoCoinsForSale(uint256)","2269f1c9":"voteA(uint256)","226ac321":"updateTokenRate(address,uint256)","226bf449":"addPackage(string,address)","226d2f86":"keyEmployeeAllocation()","226dd769":"howManyEtherInWeiToChangeSymbolName()","226e2b91":"setPaycarnita(uint256)","226e2d10":"manual()","226ee47c":"set_validator(address)","227185d6":"Send1Get2()","2272b0af":"csoAddress()","2272df67":"changeFounderAddress(address)","2272f879":"walletThree()","227326b1":"proposalPassed()","22734c0c":"createRawDeposit(address,uint256,uint256,uint256)","22742564":"quickConvertPrioritized(address[],uint256,uint256,uint256,uint8,bytes32,bytes32)","2274346b":"vaultContract()","22758a4a":"whitelister()","22760877":"getCurrentHeroOwners()","22763ae1":"stopInEmergency()","22766696":"bidEnd(uint256)","2276774c":"finalizeRemainders()","2277466b":"voteToClose()","22776478":"getDistrict(uint256)","2279295d":"resetPhoenixes()","22798c10":"MANHATTANPROXYACPBLVD()","2279fa4c":"numPayments()","227a7911":"etherGetBase()","227ac0cf":"GetPerSellInfo(uint16)","227ada37":"placeBet(uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","227bf6b8":"ethorseOracle(address,bytes32,string,bool)","227c74a7":"giveEntity(uint256,address)","227cade5":"maximumBet()","227d111e":"GetExistsCardList()","227d3fb4":"checkTxProof(bytes,uint256,bytes,bytes)","227d535f":"Wolk()","227dd788":"isFinal(bytes32[])","227e14e9":"currentDateTime()","227e26c4":"deleteChild(uint256)","227f592c":"TIXGeneration(address,address,address,address,address,uint256,uint256)","227f9633":"addOption(string,address,uint256)","227fb30b":"MosaiCoinContract()","227fda27":"BitcoinSamaritan()","2281411b":"allocateAndFreeze(address,uint256)","22817359":"_transferTokenToOwner()","22824bbd":"checkFind(address,address)","2282d9f2":"transferIsEnabled()","22848a0c":"TCTToken(uint256,string,string)","2284a6fa":"interest(uint8,bool,uint8)","2284b051":"gameRandon1()","2284e8fe":"push_or_update_key(uint256)","22855bf0":"CheckBest(uint256,address,address)","22855ef9":"registerTransfer(address,address,uint256)","22867d78":"repay(address,uint256)","2286b7de":"BONUS_ICO_STAGE1_PRE_SALE2()","2287d2ec":"donealready(uint256,address,bool)","2287dad2":"getTicketByHolderId(bytes32)","2287e96a":"withdrawEnabled()","2288193b":"testFundACampaign()","22888f35":"depositPremium(address[2],uint256[7],uint8,bytes32[2])","2288fad6":"earlyPurchases(uint256)","2289115b":"createPlanet(string,uint256)","228acf2f":"tokenTeam()","228b70d3":"registerNewPubKeyForHash(string,string)","228b7bf8":"Vasacoin()","228bbf45":"getItemsForSale(uint256,uint256)","228bff5a":"secToDays(uint256)","228c2df1":"hodl(address,uint256,uint256,uint256)","228c790c":"RudysToken()","228cb733":"reward()","228cc2aa":"maxQuanValues()","228ce144":"getKingdomType(string)","228d2820":"disableConversions(bool)","228d477f":"tokTakers(uint256,address)","228dff13":"setPepeName(uint256,bytes32)","228e41bd":"getdeptcount(uint256,address)","228e554a":"_refundBond(uint256,address)","228e892e":"icoStages(uint256)","228e92cf":"YuanLianToken()","229063fc":"discoveryCooldown(uint256)","2290d6e2":"entryFee_()","2290db50":"buyEnergy(address,address,uint256)","2290e106":"mintBuyerToken(address,uint256)","22923160":"updateWithdrawals(address,address,uint256,uint256)","229233b6":"FOR_FOUNDER()","22928b4d":"isIpoPeriodOver()","22928d6b":"removeUser(address,address)","22935caa":"setInitialAllocationUnlock(address)","22937ea9":"returnInt256(int256)","229460e7":"AdminstratorRemoved(address)","2294795d":"deuseth()","22949fb1":"TicketBought(address)","2294c48a":"initUsers()","2295115b":"adminWithdraw(address,uint256,address,uint256,uint8,bytes32,bytes32,uint256)","2295ee5b":"updateTokenBaseURI(string)","22968885":"getBalanceOfContract()","22969eac":"changeAuth(address)","22978e57":"unlockedAfter()","229824c4":"calculateTrade(uint256,uint256,uint256)","2298b9ce":"icoOver1()","229906b3":"updateStringSetting(uint256,string,address,string,string)","2299219d":"unlockTemporary(bytes32,address,bytes)","229a336b":"BodyMassIndex()","229a4978":"batFund()","229b04bf":"pauseMode()","229b5223":"weiScale()","229b9bc5":"buildingToUnitCount(uint256)","229cfc32":"calculateViralRewards(uint256)","229ddd9a":"foreignBuy(address,uint256,string)","229df5c6":"getSig(bytes)","229eb105":"payaFinished()","229f3e29":"presaleEnd()","229f4caf":"minBetPrice()","22a036dd":"ico2Bonus()","22a15848":"btcOracle()","22a1ec8f":"setSomething(address[])","22a27f3b":"getDeveloperAddress()","22a3eab5":"withdrawn_balances(bytes32)","22a4381d":"fromTokenDecimals(uint256)","22a47143":"Tokensale(address,address)","22a4993c":"getReferedCount(address)","22a635c4":"Hodl(address)","22a7118d":"buyTokensFor(uint256,address,uint256,bool)","22a7533b":"deathData_a19()","22a7906f":"getOwnedPointAtIndex(address,uint256)","22a7ac34":"rake()","22a7ba2b":"totalSupplyCrowdsale()","22a8fb18":"freezelvlAccount(address,bool)","22a90082":"setInterval(uint256)","22a92c45":"sendTokensToHold()","22a993ca":"getKun()","22aa7196":"refund_window_end_block()","22aab53a":"temperatureRange()","22aacad5":"incCounter()","22aaea91":"setCurrentAuctionId(uint256)","22ab9433":"getPrecomputedEToTheHalfToThe(uint256)","22abb147":"ResolutionAdded(address,uint256,string,string)","22ac5f40":"fulfillEscrow()","22ad3b76":"fiatFee()","22ae634f":"getInvestment(uint256)","22aef13c":"requestChangeRequirement(uint256,string)","22af00fa":"bets(uint256)","22af1b27":"UnpackAccessDChain(bytes)","22af47e3":"tokensIssuedAir()","22b01343":"initializeAssetsToThisApplication()","22b05ed2":"getStatus(string)","22b08180":"purchaseVideoGame(uint256)","22b0e99a":"EARTHToken()","22b0f6ee":"getStatusOfPayout(uint256)","22b11169":"setWalletOwnerAddress(address,address)","22b152a3":"liquidateLosing()","22b19192":"imAlive()","22b1a226":"withdrawPaymentsRegistrar(address,uint256)","22b1f39c":"currentInvoice()","22b263b2":"nextPlayerID()","22b2678a":"hasBalance(address)","22b28aa4":"resetTimes(uint256,uint256)","22b2ea22":"registerHWCDep(string)","22b2f178":"minimumDifficultyThresholdWei()","22b36d88":"stopTde(bool)","22b45ddc":"EarlyBackerDeposit(address,uint256)","22b4891d":"capICO()","22b524fe":"getFreelancer(address,uint256)","22b53192":"arr(bytes32)","22b53b4b":"accruedLiq(address)","22b6fe9e":"getAgreementSetCount()","22b6ffca":"isSignedUp(address)","22b79623":"resetEpocum(address)","22b87601":"testRemovePending()","22b930f7":"VESTING_1_DATE()","22b954f8":"poolFeeRate()","22b96b63":"getIPFSHash(address,bytes32)","22b9b712":"BETTING_OPENS()","22b9bd35":"adjustPrizePoolAfterWin(uint256,uint256)","22bac568":"grantAdditionalShares(address,uint256)","22bae392":"setBenecifiary(address)","22bb06d8":"marketting()","22bb4f53":"retentionMax()","22bbad0b":"instruments(uint256)","22bc0d6c":"appendEncryptedBid(bytes32,uint256)","22bc3b8e":"getArgument(uint256)","22bc98b1":"basicPresaleRate()","22bcabcd":"TOKENS_ACCELERATOR()","22bd6d3f":"hired()","22bdf293":"grantVestedEDEX(address,uint256)","22be9342":"resolve(uint256,uint256,bool)","22beb9b9":"scheduleDoIt(uint256)","22bf1a2a":"addrLockUp()","22bf2e24":"ROLE_STAFF()","22bf9d7c":"slashTranscoder(address,address,uint256,uint256)","22bfba59":"drawRandomUnitWinner()","22bfdcbb":"RaffleStrangeLoop(bytes32)","22c07ad3":"indFutureDeposit()","22c1d0d2":"_withdrawAmount(address,uint256)","22c21e6c":"ZHIHUIGUO()","22c25c50":"Addr7()","22c25d8f":"set_presale_arbits_total(address,uint256)","22c30931":"calculateStep(uint256)","22c4d98f":"hasAllowanceToRecieveTokens(address)","22c4f168":"setTransferFeeProp(uint256)","22c51659":"getWhitelistedZone(address)","22c5b279":"addLayer(address,uint256,bytes32)","22c61e73":"createContractPoo(string)","22c66ae7":"decimal_precission_difference_factor()","22c69b15":"tradeDAI(uint256,uint256)","22c6aad9":"pigcoin(uint256,string,string)","22c6ae15":"mul(uint64,uint64)","22c83245":"clearBlackAccount(address)","22c9427e":"recycleDividend(uint256)","22cacd6b":"setUSDBtc(uint256)","22cb1ec8":"teamTokensMinted()","22ccd000":"Blocksale(uint256,string,uint8,string)","22cd5ea8":"claimBet(bytes32)","22ce1f8f":"VixcoreToken2(uint256,string,string)","22ce61b2":"globalMetSupply()","22ce9bac":"numberOfVotesCast()","22ced0bd":"BTrustToken()","22cf1745":"USTToken(address,string,string,uint8)","22cf5011":"privilegedTransfer(address,uint256,bytes)","22cf981d":"proposeMintLocked(address,uint256)","22cfadc7":"isFundingNow()","22d0d31f":"OD1Coin(uint256)","22d122a9":"MyTestWallet7()","22d1bd32":"currentlyActive(bool)","22d2cfac":"getNextElement(uint256)","22d310f9":"setMarket2(address)","22d34212":"get_eth()","22d40b96":"defcon()","22d4e0fd":"pay2(address,uint256,address)","22d60d17":"tokensPerWei()","22d6eb87":"getInfo2(address,address,uint256)","22d7642e":"getScene(uint256)","22d85334":"isValidBicoinAddressPrefix(bytes)","22d8c8a8":"AddMaterial(address,uint256,uint256)","22d8cf5b":"CheckUserVote(uint8,uint8)","22d9f13e":"changeCUSD(address)","22da10b0":"checkPermissions(address)","22da3368":"IoMTToken()","22da5d04":"tokenCreationMaxPreICO()","22db2f7b":"processOffchainPayment(address,uint256)","22db4143":"BONUS_THRESHOLD()","22db61ab":"setunitDefenseMultiplier(address,address,uint256,uint256,bool)","22dbaf75":"test_oneInvalidEqBytes32()","22dbd0e4":"payComisionSponsor(address)","22dbf6d2":"reserveFeeToWallet(address,address)","22dc36e2":"processed(uint64)","22dc5a85":"ERC20address()","22dc8e71":"setIV_R1(uint256)","22dce86c":"getEscuelas()","22dd0d2c":"TEAM_KEEPING()","22dd9b8c":"templateSupply()","22ddde5b":"getLRCAmount(address)","22dde4cd":"secToNextMiningInterval()","22de2457":"clientVerifyKeyHash(bytes32,bytes32,bytes32,bytes32)","22df1caf":"grantPresaleTokens(address[],uint256[])","22e01192":"setPrice(string,uint256)","22e02b22":"ClaimEth()","22e113a3":"freezeTokens(address,bool,uint256)","22e12720":"MAX_HOLDERS()","22e256e2":"Addr5()","22e2b31f":"unlockAmount(address,uint256)","22e37189":"tklosses()","22e3989b":"multNumerator()","22e412ce":"strikePut()","22e465ee":"tolerantSub(uint256,uint256)","22e58557":"getFreeEggs()","22e5aa3a":"totalProportion()","22e62038":"close_bank()","22e63356":"setValueAgent(address)","22e67e71":"maxTime()","22e6f1d0":"giveGoldenTicket(address)","22e77ff3":"plz(address)","22e78480":"getGoldDataSku()","22e803c2":"transferBounty()","22e84682":"isValidContributorAddress(address,address)","22e8571d":"legalsAddress()","22e8c87d":"getUserData()","22e8c8fc":"gamble(uint256,uint256)","22e8df23":"ICO_MINIMUM_CONTRIBUTION()","22e91248":"getLeaf(uint256)","22e95f6c":"payout_normalizer()","22e9afca":"cofoundersSupplyVestingTranches()","22ea2231":"purchaseTokens(address,uint256)","22ea2d96":"getBookInfo()","22eb2c02":"viewPreSaleRefunds(address)","22ebb3ac":"DieselPricePeg()","22ebc4a0":"fpartSigned(int256)","22ec1244":"shaBid(bytes32,address,uint256,bytes32)","22ed6302":"setCrowdsale(address,uint256)","22ed96a0":"getInvestorsFee()","22ee1db4":"uint32At(uint32,bytes,uint256)","22ee46db":"VapeToken()","22ef83ef":"AuthInit(address)","22efee2d":"get_participant_num_of_pro_rata_tokens_alloted(address)","22f0e6ae":"MarketingMethodAddress()","22f0f2f9":"unlockContract()","22f16c8d":"checkDividends(address)","22f256f8":"buyIOD()","22f2f89a":"allOperationsCount()","22f3e2d4":"isActive()","22f43bb5":"seedGame()","22f4596f":"_maxSupply()","22f48627":"SIACASHCOIN()","22f4afb5":"relayKingContract()","22f4e916":"GdprCrowdsale(uint256,uint256,address)","22f607f6":"Escrow()","22f6af6e":"TokensBought(address,uint256,uint256,uint256)","22f6fa7a":"contractorTransfer_Bcoupon(address,uint256)","22f709dd":"getEther(address,address)","22f77d2a":"Refundable()","22f7be85":"setFlight(uint16,uint16,uint256,uint256)","22f7d1f8":"normalFunc()","22f85eaa":"buyOrder(uint256)","22f872a7":"allocateBounty()","22f8a2b8":"getDayOfWeek(uint256)","22f905ec":"GetPartNum(uint8)","22f93f16":"updatingViaOracle(string)","22fa1ff4":"MAX_PROMO_GIRLS()","22fa85ca":"testFailRegisterContractAgain()","22faa5db":"removeURL(string,uint256)","22faf03a":"setInstructor(string,uint256)","22fb5303":"_transferFromWithReference(address,address,uint256,string,address)","22fb71f1":"getGoldStatusVendorverify(address)","22fb730b":"claimerOfTwitterId(uint256)","22fbde38":"qtdePokemons(address)","22fbf1e8":"addDeveloper(address)","22fc3149":"setWhitelistThresholdBalanceInternal(uint256)","22fec5e7":"VEToken()","22fefe31":"devuelvePuntuaciones(bytes32)","22ff1110":"CancelSellOrder(bytes32,address,uint256,uint256,address)","22ff79d8":"USA()","23017a3a":"rewardVaultContract()","2301e7b7":"isInPreSaleState()","23020be5":"SetfirstTTax(uint256)","23023aa4":"_doCatchFish(uint16,uint16,bytes32)","23024408":"fund(address)","2302c948":"EtherDank()","2303084b":"hasTransfers(address)","23037a85":"setNextPrice(uint256)","23040327":"oraclize_query(string,bytes[4])","230434d2":"Technology5GCrowdsale(uint256,address,address)","2304ede4":"ADSToken(address,address)","230614fb":"batchTransferToken(address[])","23063da2":"Hellina()","230662f8":"changeSaleManager(address,address)","23087c04":"_isWinnerOf(address,address,address)","230894f8":"transferTileFromOwner(uint16,address)","2308a41c":"amountRaisedBy(uint256)","23098a9a":"burnAssessor(address)","230a1074":"getRegionCurrentImageId(uint256)","230a14c0":"RISK_LEVEL()","230a3c05":"constructWeaponTokenId(uint256,uint256,uint256)","230a8020":"getAddressValue(uint256)","230b1eb5":"totalReservedTokenAllocation()","230b9667":"getProviderInfoFields(uint256)","230b9da3":"parentContract()","230bd25d":"requestBounty()","230c50fe":"AuthorizePayments(bool)","230c96b9":"BuyTokensWithAffiliate(address)","230cf412":"test(uint256,int256,uint256,uint256,uint256)","230d3469":"canExchangeNum()","230d6ed8":"addCandidate(bytes32)","230dff66":"theclub()","230f49d9":"buy_token(address[])","230f6e83":"getCrydrViewStandardNameHash()","2310b384":"finalizeStake()","2311542e":"SSOrgToken(string,string,uint256)","2311bdb2":"isForgiven(string)","2311d39c":"dot()","2311dc0b":"postProduct(bytes32,bytes32,bytes1)","2311e345":"SaleFinalized(address,uint256)","23133115":"changeIncreaseStep(uint256)","23141fd0":"sendP(address,uint256)","23145ca0":"forceCheck()","23146c20":"getBuyerAddressPayment(address,uint256)","2314a5c8":"getReput(address)","2314aad6":"setExtensions(address)","2315550e":"add(address[],uint256[])","23158cae":"addBet(uint256,uint256)","23165b75":"acceptBidForPunk(uint256,uint256)","23169ec4":"medalName()","23169fca":"EDU_PER_ETH_EARLY_PRE_SALE()","2316d0cd":"deathData_a16()","2317880c":"requestArbitration(bytes32)","2317c28e":"mediaTokenIndex(uint256)","2317cd54":"_endRound()","2317ef67":"removeAsset(address,uint256)","2317f9f3":"setSanMaxAmount(uint256)","2318ffc7":"setRokBalance(address,uint256)","23191bf1":"finalizeByArbitrator(bytes32,bytes32)","231944e2":"moveUnits(uint256,uint256,uint256[])","23198b98":"setTokenHolderTribunal(address)","231a00cc":"changeBonusRate(uint256)","231a2be3":"minimumContributionPhase6()","231a439e":"setBlacklistDestroyer(address)","231ace68":"MiningRewardPerETHBlock()","231b0268":"firstBlock()","231b48aa":"settingsSetWeiPerMinToken(uint256)","231c1ce8":"unusedMethod(address)","231c1d43":"generate(uint256,string)","231cb6ab":"ENS_SUB_APP_NAME()","231d87e1":"competitorTeam(uint256)","231da56e":"getSenderValue()","231e0750":"register(bytes32,bytes32,bytes32,bytes32)","231e18a9":"pureFunc()","231fa805":"IsControledAddress(address)","23210c1a":"StfuToken()","23214fab":"maxProfitAsPercentOfHouse()","2321e625":"publicSaleSencPerMEth()","23221f1e":"getNbVersions(string,string)","2322f484":"balancesQuantity()","232397e2":"addAccount(uint256,uint16,bytes32,uint256)","2323a00e":"WagaToken()","23240d81":"getDailyTransactionVolumeReceiving()","23245216":"removeWhitelist(address[])","2324c67c":"getAllSignatureHashes(bytes4)","232523e8":"forceDivestOfAllInvestors()","23260a8b":"getPreviousPrice(bytes10)","23262615":"claimVaultOwnership()","23266dfe":"getOrganizersAddresses()","2326df93":"site_url()","2326ef22":"CreateDMSContract(address,bytes32,uint32)","2326faf9":"getResearchPerDay(address)","23285480":"RefundDeposit(address,uint256)","2329b4f7":"CryptDash()","232a2c1d":"executeSignatures(uint8[],bytes32[],bytes32[],bytes)","232a3060":"setFundManager(address)","232a6b9d":"signed()","232c4d24":"sub_fCode(string,uint256)","232c6bab":"delIndividualCertificate(string,bytes32)","232cae0b":"last_offer_id()","232db034":"abortFunding()","232e57c1":"optionSupply()","232e7e91":"getproduct(uint256,uint256)","232e9051":"gunsFund()","232fd216":"getPoolDone(uint256)","233023de":"setCertifierInfo(address,bool,string)","23306ed6":"getMinimumBond()","2330f247":"isAuthority(address)","233104d6":"setPresidenteDeMesa(bytes32)","233120aa":"getChainyURL()","2331af61":"transferActive()","23338b88":"delMinter(address)","23343af3":"setConfigAddress(address,address)","2334623f":"totalETM()","23350e4a":"regainEther()","23355749":"IkokoToken()","2335d307":"IFSActive(address,uint256,uint256)","2337d9f1":"endOfferingImpl()","23385089":"emitApprove(address,address,uint256)","23389c5a":"docs(uint256)","2338c002":"_applyShare(address,address,uint256)","233907a3":"signedApproveAndCallSig()","23394e46":"TripAlly()","2339dd43":"HcftSale(address,address)","233a04ec":"setEditionSales(uint8,uint256)","233a74c9":"currentTokenDistribution()","233aacf9":"Announce_winner(address,address,uint256)","233ab10d":"setBaseEthCapPerAddress(uint256)","233b39c9":"_initCardDetails(uint8,uint256)","233b7451":"lastStakedFor(address)","233bf71e":"FOCToken()","233d264a":"startTicker()","233de126":"odds()","233dedf1":"averageBlockTime()","233e0877":"Purchase(address)","233e3220":"renounceSuperInvestor()","233e5d00":"WorldStage()","233ff4b2":"_fund(uint256)","23400cf6":"getLOCCount()","2340903d":"EEZcoin(address)","23412ede":"StorageEnabled(bool)","2341a1af":"receivePlayerInfo(uint256,address,bytes32,uint256,uint8)","2341d778":"giveTix(uint256,address)","2342293d":"collectionFees()","23437d50":"discountICO()","23447982":"replaceManager(address)","2344acdf":"pauseOffset()","2344b0e5":"url_white_paper()","2344e4ec":"getHint(uint256)","23452b9c":"cancelOwnershipTransfer()","2345fe81":"xperToken()","234638df":"PreICOHardcap()","23471d18":"setStakeAddress(address)","2348238c":"transferPrimary(address)","23483e45":"delRosenCertAdmin(address)","2348f1ee":"lockAttemp()","234917d4":"getCallTargetBlock(bytes32)","2349748d":"MenoroCashSupply()","2349e719":"processStepsByStep(uint256,uint256)","234a0ee7":"appHub()","234a6ed8":"initializeToken(address)","234ae1a0":"WallDirectory()","234b2cb4":"whitelistApplication(string)","234c0ae5":"combine(uint256[],uint256)","234c4bd9":"deployStepThree()","234e0056":"COIN_SUPPLY_ICO_PHASE_1()","234e5273":"tittyContract()","234e5f16":"TIMETHRESHOLD()","234ea19c":"lockRate()","234f1eb6":"JVToken(address,address,address,uint256)","234f9db2":"getBalanceIco()","235029ee":"SQT()","23509e69":"donkeysEligibleForFees()","2350e762":"participantWithdrawIfMinimumFundingNotReached(uint256)","2351299a":"createTokensToOwner(uint256)","2351baca":"fechVoteNum(address)","2351c2f8":"get_tokenReward()","2352551f":"bbPublicSaleWallet()","23525826":"maxNumbPerSubscr()","23526a34":"turnOffSale()","235304b2":"updateNextGameInitalMinBetSize(uint256)","23533138":"seedMarket(uint256,uint256)","23537880":"TestSale()","23539cd4":"mintResource(uint16,uint256)","235422fb":"_medalUnFreeze()","23548b8b":"maxCap()","2354b3ed":"requestSatsPrice(string)","2354bda7":"auditGuess(uint256,string,uint8,uint256,uint8,uint256)","2354ecf7":"balanceOfOnUpdate(bool)","2355300f":"unspentCreditsWithdrawn()","2355c602":"queryToAddress(bytes32)","2356f46a":"Kontlo()","23571ac9":"seenHereA(uint256)","2357cd3b":"invadeAddress()","23584a21":"initStats(string,address,uint256)","23586685":"recordSale(uint256,uint256)","23587733":"DEVELOPER_BONUS()","2359116d":"refill(address,uint256,string)","23594797":"createContractRegion(string)","235977ca":"ParadiseTokenSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)","2359bd08":"reinvestTokens(address)","235b1eb7":"getOverRate(uint8)","235bd895":"_getGameInfoPart1(address,uint256)","235c002d":"transferOther(address,address,uint256)","235c279f":"addEmitter(address)","235c9603":"getNextTranscoderInPool(address)","235e5d47":"isRoundEnd(uint32)","2360f5a1":"openSaleSupply()","2362189a":"defaultExchangeRate()","23624a10":"tokenFee(uint256)","23626067":"thirdCheckpointPrice()","23626df7":"setContractAddress(address,address)","2362b26d":"Awards(uint256)","23637e60":"votePrice(uint256,bool)","23647398":"testThrowRetractNotOwner()","23655d7b":"Fantom()","236571e2":"determineWinnerEven(string)","2365ceb3":"SetWagerData(bytes32,bytes15)","2367e1ae":"getLengthOfMatches()","2367f35d":"crowdsaleEnded()","23685b97":"bpToken()","2368d215":"multipleAddToWhitelist(address[])","236a160e":"isValidIssuance(uint256,uint256,uint256,uint256)","236a8d9d":"registerNode(uint256,uint256)","236ae025":"distributionThreshold()","236be3e2":"BlockcloudToken()","236dd0e8":"paidBidAllocationFee(bytes32)","236e06f6":"exchange(address,uint256,uint256)","236e1a15":"PromotionCoinMintFinished()","236ebbae":"setAuditNodePrice(uint256)","236ed5a6":"getVoterProposalsCount(address)","236ed8f3":"closeAuction(uint256)","236f86a1":"remainingTokens(address)","236ffad4":"initOwned(address)","237032da":"isBacker()","237082bd":"getCertifiedDocCount(address)","2371bb4b":"SetNumber(uint64)","23724ffd":"TransferManagerApproved(address)","237297a4":"claimWinner()","2372996a":"CUSTOM_ERC20_CREATE_SERVICE_NAME()","23732ad8":"OSTestToken()","2373f091":"_setMinter(address)","23749f69":"donationsEndedTime()","23751e95":"addRedbullQuest(address)","237548fa":"seriesFactory()","2375766a":"unlatchContract()","2375da83":"setIntArr(uint256,address)","2376fe70":"approveProxy(address,address,uint256)","23773f81":"calcTapAmount()","2378fe2d":"FAPFundDeposit2()","23797ed9":"getAppByIndex(uint256)","237a35b2":"professionalName()","237a4a7f":"requestOneUUID(address,uint256)","237b5e96":"child()","237c2b22":"MCTCrowdsale(uint256,uint256,uint256)","237d2628":"issueTokens(address,uint256,uint8)","237e9492":"executeProposal(uint256,bytes)","237f142a":"ownersLen()","237f1a21":"hasIdentity(address)","23807da8":"getInvoicingAddressCount(string)","2380c39d":"backUtcoinOwner()","2382534a":"STR()","2383b074":"getSurplus()","23845e4b":"getPoolSize()","2384c058":"account3()","23855c18":"updateDeposit(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)","23855cd3":"setBalanceForUser(bytes32,uint256)","23858314":"sizeOfProviders()","238604f0":"SuperContract()","23866438":"joinChannel(bytes32,uint256[2])","23867979":"getHealBalance()","2386d33e":"_tenuousToken()","2387c87d":"setTokensSold(uint256)","2387e75e":"RequestBitcoinNodesValidation(address,address)","23898138":"MoneyCoin()","2389a290":"joinGame(address)","238a3fe1":"transferDistribution(address,uint256)","238ac933":"signer()","238bf375":"PROMETHEUS_MAX_PRICE()","238bfba2":"getChannelWith(address)","238c5b06":"icoDiscountPercentageLevel1()","238d3590":"getTotalTheoreticalSupply()","238dafe0":"enabled()","238e5b14":"burnAmount(address)","238e9de7":"StopFuseaNetworkDistribution()","238f7743":"unlockSecondTokens()","238fcbf8":"DISCOUNT_TOKEN_AMOUNT_T2()","2390507b":"COMMUNITY_ADVISERS_STAKE()","239131af":"NEXUS()","2391ddf3":"handleLuckyPending(uint256)","2391f0b3":"isProtect(bytes32,uint8)","23924cff":"TeamLockingPeriod6Months()","23926732":"ifDestory(address)","23949cd1":"setNFTContractAddress(address)","2394a797":"makeHybridization(uint256,uint256)","2394cc40":"transferInternally(address,address,uint256)","2395e9b6":"specialAllowed(address)","23967d78":"FOUNDATION_HOLDER()","2397e4d7":"sellToken(uint256)","2397f92b":"KNDToken()","23985742":"STANToken()","23987690":"indFuture()","2398a6a6":"sendPrize(uint256)","2398b8fc":"SCHEMA_HASH()","2399a5af":"balanceAdd(address,address,uint256)","2399e1f2":"addPromotionalCompany(string,uint256,uint256,uint256)","2399f870":"updateFlipAndMDT(address,uint256,address,uint256)","239a2545":"totalNights()","239ab208":"notifyAssessors(uint256,uint256)","239aee06":"execute(address,address,address,uint256)","239b6dd1":"QUINToken(uint256,string,string,uint256)","239bb5a6":"getConstructorString()","239c02ba":"OPSToken()","239d339b":"updateStageByTime()","239da1a3":"SportStarMaster()","239da7de":"getServiceFeeDenominator()","239e7881":"GEBEC()","239e83df":"guardedArrayReplace(bytes,bytes,bytes)","239f26ee":"BethereumERC223()","239f29dd":"setConsensusPercent(uint256)","239fcf0f":"Balance(address)","239fd68f":"setCurrentPricePerWei(uint256)","23a08d97":"totalPreICOavailible()","23a1b159":"maxTimeBonusPercent()","23a1bd8f":"Dancoin()","23a1c271":"setPongval(int8)","23a1e00e":"openLeaderboard(uint8,string)","23a24a33":"setBAA(bytes32,address,address)","23a2725a":"LeS3coin()","23a31463":"setBlockLock(bool)","23a3335c":"BuufmanToken()","23a36d2b":"mintToken(address,uint256,uint256)","23a37c09":"addRNTBContribution(address,uint256)","23a3ad72":"checkRole(address,uint8)","23a50727":"endStage(uint256,uint256)","23a52674":"expandX()","23a58576":"zeroBool()","23a6b8ca":"currentBeneficiaryCap()","23a8792e":"ChangeTokenPrice(uint256)","23a8edb5":"LociBackend()","23a90e5e":"getCustomerTxTimestampPaymentMCW(address,bytes32)","23a9a156":"SNL()","23aa6a17":"issueTokenAndApprove(uint256,uint256,address)","23aa7e12":"controllerDelegate()","23aba14f":"iCapToken()","23abea43":"getPlayerKeys(uint256,uint256)","23ac3fd4":"getPOOL_edit_32()","23ac4b03":"addQuickPromoBonus(uint256)","23ac9ae2":"CcStandardToken(uint256,string,uint8,string)","23add736":"claim(uint256,uint256,uint8,bytes,bytes)","23adeb05":"OneChance(address,address,address)","23ae4438":"getLastRoundInfo(uint256)","23aea69d":"isNextBudgetPlanMade()","23aed228":"selling()","23aedc62":"startSale(uint256[],uint256[],uint256,uint256)","23afba86":"Lancer()","23b0abeb":"showPhaseInfo(uint256)","23b0bbea":"getBullsmasterReq()","23b0db47":"delegate_2x(address,uint256[],address[],bytes32[])","23b1131c":"unlockDate2()","23b11bb1":"getPropertyLastUpdate(uint16)","23b11d8d":"addProxy(address)","23b17715":"AddressDescriptionAdded(address,string)","23b1ed54":"getConstantName()","23b1f8e4":"lastPriceUpdateTimestamp()","23b2b48f":"addressToAccountMap(address)","23b364ab":"getAvailableTicketCount()","23b37bb6":"sqrt(uint64)","23b3af89":"addHolder(address,address)","23b3b704":"calculateUntaxedEthereumReceived(uint256)","23b3c771":"getFreeShrimp()","23b44cfc":"assignNewParcel(int256,int256,address,string)","23b493fe":"getUserFiatBalance(string)","23b5aa8d":"STAT()","23b5b257":"tokenHasFreeTrial(address,address)","23b62b75":"mainWallet()","23b6ce11":"buyDiscipleItem(uint256,uint256,uint256,uint256)","23b6fc8b":"verifyUrl()","23b715cb":"updateShare(address[],address,uint256[],uint256)","23b7b140":"setFreezTime(uint256)","23b7ec3b":"ownerOf(uint32)","23b7fc86":"count_token_holders()","23b80995":"saleOver()","23b872dd":"transferFrom(address,address,uint256)","23b8feb0":"safeMul_dec(uint256,uint256)","23b98f92":"getPOOL_edit_6()","23ba3420":"t_Michail()","23ba467a":"isLastRound()","23bb1f69":"prepareToScore(uint32)","23bb8022":"getCurrentRateByTokenSold()","23bb81ae":"transferSoldToken(address,address,uint256)","23bba494":"setContribPeriod(uint256,uint256,uint256,uint256,uint256)","23bc29a0":"systemEndingPrice()","23bcaae9":"newPost(string)","23bd4d7a":"organization()","23bd9914":"_calcReward()","23bda0ee":"MyCurrency()","23be45e2":"matchOrders(bytes,bytes)","23bef5dd":"storeWelfare(address,string)","23bf0425":"fastEnd()","23bf2973":"tgeSettingsPartFounders()","23bfc777":"changeRoundDelay(uint256)","23c0889a":"initMinerData()","23c105a2":"eliminateFrom(address,uint256)","23c1236a":"burnFromByAddress(address,uint256,address)","23c2460d":"rate(uint16,uint256)","23c2b4ea":"finishPREICO()","23c2de55":"SmartContractCasino()","23c32d74":"cstToMicro()","23c3dae7":"NewTranch(uint256)","23c4841e":"ToggleFreezeBuying()","23c4948c":"getDonator(address)","23c5a088":"updateCost(uint256)","23c5c55a":"buyImagePriv(uint256)","23c5e967":"mul2Throw(uint256)","23c639fe":"getback(uint256,uint256)","23c69d2a":"currentDividend()","23c6bc39":"addressThreshold()","23c6c98b":"activeShareholdersArray(uint256)","23c731f5":"isCanList()","23c79ab3":"CoinFuns()","23c850db":"registerGold()","23c860a8":"INTREPID_SHIP_PRICE()","23c89a00":"requestSignature(bytes32[8],bytes)","23c94353":"currentTokenBalance()","23c99826":"getDictJob(address,uint32)","23cadd34":"move(address)","23cafc3d":"voteNoLockByAdminBatch(address[],address[],uint256[])","23cb7b19":"_influenceAlgorithm(uint8,uint256)","23cba56f":"bonusProgramEnded()","23cc16be":"burnInvestorTokens(address,address)","23cc3496":"_setRunesValue11(uint256)","23cc75a8":"finalizeICO()","23cc7615":"userIdIndex()","23cc9a90":"addParticipant(address,address,address)","23cd5090":"registerToProvider(address)","23cd7cd5":"Model()","23cdd8e8":"log(string,bytes)","23ceb6d8":"mintTokenEscrow(address,uint256)","23d0601d":"getAccountIdFromSignature(bytes32,bytes)","23d17a40":"addrBRXPay()","23d1ab35":"donationReceiverLocked()","23d1b8eb":"etherPayout()","23d1c95e":"addProposal(string,string)","23d1fe56":"s22(bytes1)","23d24f24":"LogEscrowEth(uint256)","23d2691b":"addAuditRequest(address,string,uint256)","23d27633":"EtherLite()","23d2b3aa":"HaoCoin()","23d32d6a":"generatedBytes()","23d34f84":"setGuessAnswer(string)","23d44dee":"collectedSignatures(address)","23d533c8":"EBCBToken()","23d5a686":"getSpaceshipUpgradeCount()","23d669db":"setValidationClosed(uint256)","23d6b008":"assignedAmountToTheFoundation()","23d6c92f":"setFreelancerParams(uint256)","23d71b26":"mtrTokenFallBack(address,uint256)","23d73ca5":"test_invalidEmptyNotOne()","23d7caee":"BitMineToken()","23d7e089":"getPotCost()","23d808da":"getMatch(uint8)","23d80d3a":"IfContractRegist(address)","23d862ed":"getAddressLockedLength(address,address)","23d88efd":"preIcoTokenSupply()","23d9ea80":"getOfferPriceCandy(uint256)","23da9c4b":"WhiteListAccess()","23db3e50":"_checkAreaAndCategory(uint256,uint256,uint256)","23dbf825":"distributionComplete()","23dc1314":"failSafeLimit()","23dc14c0":"AdAgency()","23dc210f":"transferToAddress(address,address,uint256)","23dc33b9":"reward6()","23dc3f72":"_checkGrid(uint256,uint256,uint256)","23dc42e7":"query1(uint256,string,string)","23dca40f":"Submit(uint256,bytes32,uint16)","23dccbd6":"LogFollow(uint256,address,uint256)","23dd03c3":"getLLV_edit_23()","23dd523d":"unregisterMember(uint256)","23dd797b":"setESOP(address,address)","23dddaba":"simpleVotingDapp(bytes32[])","23de1915":"NewTicket(address,bool)","23de6651":"emitTransfer(address,address,uint256)","23defc77":"setHeir(address)","23df9df5":"_refund(uint256)","23dfed97":"emitCategoryEvaluated(address,address,uint8,uint256,uint256)","23e1d351":"buyKeyUseBalance(uint256)","23e1d8d0":"failedTimestampLength()","23e1f881":"PendingOwnershipTransfer(address,address)","23e25f7d":"sendReserveBalance(address,uint256)","23e26c43":"datestart()","23e375dd":"_computePrice(uint256,uint256,uint256,uint256)","23e3d7a9":"updateDescriptiveInformation(address,string,string,string,string,bytes20)","23e3fbd5":"depositOf(address)","23e4172d":"testValidationOfDecrease()","23e44848":"DPToken()","23e4d669":"getPlayerPortfolio()","23e53b2e":"setSiringAuctionAddress(address,address)","23e5942a":"initWallets(address,address,address,address)","23e5d13c":"declareWinner(address,bool)","23e5e822":"mintToken(int256,address,uint256,address)","23e5f1c5":"hour()","23e798e6":"getDocumentIdWithName(string)","23e7a900":"setIcoEnd(uint256)","23e7d9b2":"createInvoice(bytes32,address,uint256,string)","23e8cefc":"encodeIfElse(uint256,uint256,uint256)","23e957b6":"calculateScore(address)","23e9637f":"setSoftCapInCents(uint256)","23e9c216":"setBounty(address,string,uint256)","23eac4bd":"setTokenOwner(uint256,address)","23eb0197":"giveMemberAllowance(address,uint256)","23eb3831":"PurchaseCapChanged(uint256)","23eb861c":"unchainedMultisigVersionMajor()","23ec5939":"returnInvestoramount(address,uint256)","23ec8f62":"ownerUnlockFund()","23ecb66f":"getPreviousDate(bytes32)","23ecc4a1":"claimAmountSet()","23ecf108":"MartinKoToken()","23ed0a2e":"registerWorker(uint256,uint256,bytes32,bytes32)","23ed476f":"treasurySent()","23edfb89":"cancelSaleWhenPaused(uint256)","23ef2e4f":"stopPreIcoMint()","23ef2e56":"setBAI(bytes32,address,int256)","23ef604f":"removeOwnedNote(address,uint256,uint256)","23f02f56":"crowdEther()","23f0b2b6":"getProfile(address,string)","23f14e86":"setAutoAddress(address,address)","23f1dbe0":"minBidPercentage()","23f2cbb0":"sponsorGas()","23f3ad03":"ParminderToken()","23f4c025":"Cherrio()","23f5c64f":"get_data_owner(address,address,string)","23f614dd":"TinyOracleLookup()","23f64051":"setClaimToken(bool)","23f64140":"depositAgent(uint256,uint256,uint256[],uint256[],uint256)","23f685dd":"getUnclaimedHalvingSubsidy(uint256)","23f6e4fb":"Registered(address,address,uint256,uint256,uint256)","23f7dc66":"hasReadership(address,uint256)","23f806b7":"tokenAdvisoryBountyTeam()","23f809f6":"generateAddAddressSchemaHash(address,bytes32)","23f907d9":"MAXIMUM_ETHER_SPEND()","23f938ee":"isTransferLock(address,address)","23fa370d":"suspendedUntil()","23fa495a":"setFlatFee(uint256)","23fcdb20":"getRequiredSigs()","23fd0176":"destroyCredits(uint256)","23fd4524":"OMT()","23fe073e":"BancorQuickConverter()","23fe1da1":"purchaseWithETH(address)","23fe5b90":"hardCapFundingGoalInCents()","23fe6146":"pushIssuers(address[])","23fed09e":"hasEnoughFund()","23ff2af0":"setAttrs(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","23ffcc3e":"PenchantICO()","2400b582":"_issue(address,address,uint256,bytes,bytes)","2401db10":"sendFunding(address,uint256)","24021127":"_setOriginationFee(uint256)","2402598c":"BNSToken()","24026bfb":"getMarketOrderTrust(uint256)","2402ae57":"YudizCoin()","24032866":"checkExecutionAuthorization(address,uint256)","24038339":"updatePriceAndDenominator(uint256,uint256)","24038d2e":"purchaseArmy(uint256)","2404608f":"getSignatures(string)","240557b8":"cleanTokensAmount(address,uint256)","2405b1a3":"SwissBit(uint256)","2405d03e":"refundTokensPurchase(address,uint256)","2405e3c6":"initial_supply()","24064617":"getMom(address)","2406cedb":"setPackageOwner(bytes32,address)","2406e626":"createPool(address,uint256,uint256,uint256,uint256,uint256,uint256)","2406e9fa":"playRandom(address)","240705eb":"withdrawWithFee(address,uint256,uint256)","24070feb":"_create(address,uint8,uint8)","240860f1":"setHasCommissionerAuction(uint32)","2408771e":"validateInvestmentGroups(address[])","240961db":"showPoolOwner(uint256)","2409dfa2":"drawback()","240ad8bd":"applyAsProvider(string,string,string,string)","240bd9e6":"DcorpProxyCreated(address,address)","240c2709":"toReserved(address,uint256)","240cf1fa":"changeOwnerSigned(address,uint8,bytes32,bytes32,address)","240dfd6e":"stopEnrollment()","240e07e0":"impl_apply4Redeem(address,uint256)","240e0b2e":"JinKuangLian()","240ecad5":"transferViaProxy(address,address,uint256)","24108475":"vote(uint256,string)","2411ca69":"startPrivatesaleDate()","2411e6a3":"NonEmissiveToken(address,string,uint8,string,string,uint256)","2412bdb8":"exchange(address)","2413372d":"TestETCCoin()","24141f14":"CRYPTOHEDGECoin(uint256,string,string)","2414b63e":"CasinoBank(uint256,address)","2414e134":"NEWCICO(address)","24153b73":"Tosh(uint256,string,uint8,string)","241673e8":"withdrawTokenToFounders()","24167745":"ShamelessUETRipoff()","2417f31d":"maxPresaleTokens()","2419217e":"teamAddresses(uint256)","2419ef4d":"Coverage()","241a2305":"MultiTransfer(address,address[],uint256[])","241b701f":"openPot()","241b88b6":"threeMillionTwoHundredThousand()","241d1108":"nextDerivativeToken()","241d2c76":"getCount(address,string)","241d7aea":"BeautyCoinToken()","241de9e9":"proxy(address,address,uint256,uint256)","241e0fa0":"updateBytes20inBytes(bytes,uint256,bytes20)","241ea03c":"Pregnant(address,uint256,uint256,uint256)","241f675d":"CMO_SHARE()","24206c2e":"updateTokenAddress(address,address)","2420703e":"transfer_tokens_through_proxy_to_contract(address,address,uint256)","2421101f":"returnAddress(address)","2422224e":"signatures(bytes32)","24223a3c":"allowanceItem(uint256,uint256,uint256,address)","2422d991":"getADR()","2423a088":"UNKNOWN_TYPE()","24241ebc":"challengeWithPastCustody(address,uint256,bytes32[],uint256[],bytes32[])","2424276c":"freezeMultiAccounts(address[],bool)","24248168":"getBracketScore(bytes8,bytes8,uint64)","24250852":"mintToPublic(address,string)","2425ce3e":"upgradeTank(uint256,uint8)","24263f77":"mintICOTokens(address,uint256)","24265000":"canCollect(uint16,uint16,uint8)","24265408":"FaucetManager(address,address[])","242654a2":"transferEnable()","242655d4":"prefixedEncode(address)","24270d1e":"get_arbits_max_contribution(address)","24272479":"_finishBet(uint256)","24280cc4":"createPuppySaleAuction(uint256,uint256,uint256,uint256)","24285ade":"AlpineMegalith(uint256,string,uint8,string)","24294b1f":"startFirstRound()","2429b755":"isPrivateSaleRunning()","2429ee2a":"isBountyPayStage()","242a60b5":"withdrawValue(bool)","242a7450":"validateTenant(address,bytes32,uint256)","242aa460":"presaleInvestors(address)","242aeac1":"DiscoverCoin()","242b0a73":"rewardPayedOf(address)","242be01a":"_setAppIfNew(bytes32,bytes32,address)","242c721e":"testSetOrganiserUsingDeployedContract()","242c9ce9":"_burnFrom(address,address,uint256)","242ce07b":"frozensTotal(address)","242d1259":"WeiWeiToken(address,uint256)","242d7dba":"totalAmountRaised()","242d9f69":"getOraclizeWinnerGasFee()","242db433":"getMarketManagerAddress()","242ddf37":"NewBook(bytes32,address,uint256)","242de145":"TokenCreationContract()","242ed69f":"setActiveTranscoders()","242fc36e":"cashback()","243056d6":"writeMerchandises(uint256,string)","2430731f":"cancelRecurringBillingInternal(uint256)","2430d881":"getLastAction(address)","2431676c":"getTotalWinsCount()","24318b5c":"numberOfHosting(address)","2431f164":"process_payment()","243222c0":"processFailedVerification(bytes32)","2432282d":"getLoanCountForAddress(address)","24323110":"McFlyCrowd(uint256,uint256,address,address,address,address,address,address,address,address,address,address,address,address,address)","2432eb23":"testThrowRetractLatestRevisionNotUpdatable()","2433c978":"setupOwners(address[])","2433f617":"getIIPTotalSupply()","24349551":"deleteContract(uint256,uint8[],bytes32[],bytes32[])","2434cf10":"UseBySoftware(address)","2434ec3e":"declareLost(address,bytes32)","243527a2":"addID(address,bytes32)","24355ea6":"isA(address)","24359879":"ownerAt(uint256)","24361cec":"picops_block()","2436219c":"doubleEntryPrice()","243669ad":"totalOwners()","2436b1d2":"NUM_COUNTRIES()","2436d4e3":"TwoStandardToken(uint256,string,uint8,string)","2436d5f8":"StorageBase(address)","2437160f":"TFTOKEN()","24372fa3":"SignCurrentVersion(string)","24378482":"bnOf(bytes32,bytes32)","2437e1c2":"setPresaleParams(uint256,uint32,uint32,uint256,uint256,uint256)","24386b3e":"testMultitransfer3()","243870bd":"createChannel(string,bytes,address,address,address[],uint256[],address,uint32[])","2438b674":"window2TokenExchangeRate()","2438db59":"setServices(address,address)","243a28eb":"returnedWei(address,uint256)","243af82d":"stageBuys(address)","243b22cf":"setGameResult(uint256)","243b2a39":"createDispute(bytes32,address,address,bytes32)","243c33a1":"testCreateShortId()","243d230c":"dateTo()","243d3827":"getRewardInfo(uint256)","243d51b4":"betD()","243dc8da":"getFoo()","243e280b":"publish(string)","243eb89f":"endIcoMainSale()","243f6b58":"removeKYC(address)","243f6e0c":"change_active(uint256)","243feeb0":"ADDR_TKG_ASSOCIATION()","24415953":"lengthEqual(int256[],uint256,string)","244159af":"getPriceOneToken()","24417f39":"getCostForHealth(uint8)","24425cbf":"TEST_CONTRIBUTION()","24429e34":"OliveGardensResort()","2442cfec":"putBtoWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","2442e1cb":"getMilestone(uint256)","24434852":"buyOnBehalfWithCustomerId(address,uint128)","2443a30e":"ChangeInsurerOperationEvent(address,uint256)","2443f0ae":"derivePayoutDistributionHash(uint256[],bool)","24444749":"NUM_POTATOES()","2444d352":"setWhitelistOff()","24452f44":"tryBuy(uint256,uint256)","24453ed6":"getCustomerTxAmountMCW(address,bytes32)","24454fc4":"getTranscoderEarningsPoolForRound(address,uint256)","24455e7d":"createNetwork(string,string,uint256,uint256,uint256,uint256,uint8)","24457036":"LockChainFundDeposit()","2445caf1":"ERC20Token(uint256,string,string,uint8)","24463cbe":"AddressDailyReward(address)","2446e1de":"icoClose()","2447fe10":"initBridge()","2448fe2f":"redTeamSupply()","24496026":"removeQuoter(address)","244967b3":"start_game()","24497829":"ethFundAddress()","2449dd55":"sendCommission()","244b252a":"SaturnToken()","244b34c5":"Stage2Deadline()","244bfa6b":"buyCelebrity(uint256)","244c23ee":"Token(uint256,string,uint8,string)","244c757a":"getCurrentIcoNumber()","244c91d4":"setMaxIssuers(uint256)","244c96a1":"compareOrders(uint128,uint128,uint128,uint128)","244cb924":"EnableSelling(uint256)","244cee6d":"helloWorldWeb()","244d04f5":"finalizeTokensale()","244dad09":"createdUser(bytes32)","244ded7a":"ChangeOwnership(address)","244e0c87":"balanceOF(address)","244eab9e":"lovelock_price()","244eba55":"frozenDaysForBounty()","244f4894":"getWithdrawed(address)","244f828a":"SetHFee(uint16)","244fcd03":"removeRelease(bytes32,string)","24500e05":"tokenAdvisorPartners()","24503ab0":"setDefaultTransferGas(uint256)","24506e2a":"KoalaChain()","24516000":"getPOOL_edit_26()","24519a6a":"takeFee(address,address,uint256,uint256)","2451a899":"isSuccess(uint256)","2451b3d8":"accessProvider()","24528499":"_getSettingVariables()","24534192":"addMutagenFight(uint256,uint256)","2453ffa8":"orderCount()","24541f78":"getTransferProxy(uint32)","24545f82":"LULUToken()","2454d1f0":"incFightWin(uint256)","24562747":"tokensPerETH()","245678d6":"MINBET()","24571783":"NESTFAME()","2457d765":"CHSC()","2458d472":"getCurrentStage(uint256)","2458d606":"exchange(address,uint256,string,uint256)","2458f2a8":"swarmTree(uint256)","2458f679":"instContWallet()","245a03ec":"scheduleSetIt(uint256,uint256)","245a30ec":"setDataAuction(address)","245a367c":"GetParticipant(address,address)","245a6f74":"isProxyLegit(address)","245a810b":"addMetaData(bytes32,bytes32,bytes32,bytes32[],bytes32[])","245ae4a0":"slashUsername(bytes,uint256)","245b565d":"ballotEncryptionSeckey()","245ba519":"addVerifier(address,address)","245ccdb7":"setFeePrice(uint256)","245d1314":"signUserChange(address)","245d5556":"_deleteEntry(bytes32)","245e22de":"transferDirectly(address,address,uint256)","245e70f0":"_commitBallot(bytes32,bytes32,bytes32,address,uint64)","245f57a9":"asyncSendSilently(address,uint256)","245fa2ab":"newBankManager(address)","24600157":"CUBES()","2460053e":"LegionToken(uint256,string,string)","24600fc3":"withdrawFunds()","2460f09d":"MarketContract(string,address,address,uint256[5])","24612b5d":"GenbbyToken()","24619da7":"RechargeMain(address)","24627547":"vestingFunc(uint256,uint256,uint256,uint256,uint256,uint256)","2462a0d5":"funcFromC1()","2462f6f1":"setFadeoutStarts(address,uint32)","2463de5a":"getPastWinnerTimestamps()","24642510":"rechallengePossible()","24645254":"getBalance(uint8,address)","24645c5a":"totalTokenSale()","24646ce4":"getBuySellSum()","2464a69f":"_computePublisherCut(uint128)","24652ba2":"PeerBudsToken()","24664106":"mintRep(int256,address,uint256)","24667568":"ORGANIC(uint256,string,uint8,string)","24675116":"PK(uint8,bytes32)","24676ae3":"SmzdmToken()","246982c4":"getPerson(uint256)","2469a846":"terminateCrowdSale()","2469c14e":"setState(address,uint256)","246a3234":"getEthChfPrice()","246a44f8":"isNeedCloseCurrentGame()","246c01cd":"tryUpgrade(uint32,uint8)","246c02e6":"check_depth(uint16)","246cbacc":"test_twoInvalidEqAddress()","246d4098":"openToThePublic()","246d41a9":"incrementTotalVoters()","246eb968":"deleteUri(uint256)","246f02bb":"tickets_bought(string,uint256)","246f0ca4":"KuaiKanToken(uint256,string,uint8,string)","246f1e17":"createGuess(uint256,uint256,string,uint8,uint256,uint256,uint256[],bytes32[],uint8)","246f8b96":"removeOwner()","247121e3":"MakeAdministrator(address)","2471fa1c":"_building(uint256)","24724b5b":"changeAmisWallet(address)","24743d40":"f1(bytes32)","24749b59":"bonus(uint256)","2474a21c":"collectedEther()","2474e236":"TOKENS_MAXIMUM_SUPPLY()","247534cf":"WrapperLock(address,string,string,uint256,address,bool)","2475a9b3":"UTXORedeemed(bytes32,uint8,uint256,bytes,bytes,uint8,bytes32,bytes32,address,uint256)","24788429":"removeExecutor(address)","24788ed9":"ledgerContractAddr()","247956f1":"withdrawEtherInBatch(address[],uint256[])","24797d1b":"decreaseThreshold(uint256)","247ab51f":"markAsProcessed(uint256)","247aebbb":"tokensup(uint256)","247b127d":"MiIToken(uint256,string,uint8,string)","247b188b":"icoTotalSupply()","247b3bd6":"BitCronus()","247baa3e":"ALH2()","247bb39c":"privateOfferingCap()","247bb432":"test_addAndRemovePermissions()","247c6c70":"priceLC()","247cf1aa":"lengthNotEqual(bytes32[],uint256,string)","247cff43":"freezingManager()","247ecab5":"bonusDrop(address,uint256)","24804cef":"Deed()","24806d4a":"getBounsInRound(uint256)","2480d9e6":"saleAirdrop(address,uint256)","2481325a":"ExtremeCoin()","2481851a":"finalizeName(address,string)","24819384":"btycaddmoney(address,uint256)","2481f92c":"setClockAuction(address,uint256)","2483761f":"buy1ktickets()","24841bbd":"interfaceBurnTokens(address,uint256)","24845131":"proclaimDeath()","2484a023":"verifyTetherCurrency(address,uint256,string)","24850e10":"releaseFunds(bool)","24851914":"isTeam(address)","2485484d":"clearGenVaultAndMask(address,uint256,uint256,uint256)","24854bd8":"updateThirdExhangeRate(uint256)","248582b0":"receivePaymentForGoodsSoldEarly()","24860443":"toBytes2(bytes,bytes,uint256)","24863354":"saleOverReachMaxETH()","24876434":"addPriceTier(uint256)","24884fc2":"startPeTime()","24887c04":"SieChain()","24888154":"Buy(uint64)","24888b4a":"isVoterLocked(address)","24889e37":"removeAmountForAddresses(uint256[],address[])","2488fd55":"countPlayersInPosition()","24896a47":"signPA(uint32)","248b0dba":"toBytes16(bytes,bytes,uint256)","248baabd":"FUND_ADDR()","248c4439":"setFunctionOnePrice(uint256)","248c6380":"_tokenBankrollBuyIn(uint8)","248d14eb":"allowPriceUpdate()","248e150a":"getFirstAuctionsExtendableStartDate()","248e1993":"setMinTarget(uint256)","248e4dd4":"pank13()","248e86e6":"ProjectToken(uint256,string,uint8,string)","248ec326":"DAILY_LIMIT()","248fcccc":"CRSAccount()","24900d7c":"initializeAddresses(address,address,address,address,address)","24902e24":"LOG2_E()","2490be24":"exchangeEurToEth(uint256)","2490e13f":"editPieceData(uint256,string,string)","2490e16e":"getDirectBoughtTokens()","24924bf7":"maxParticipants()","249292b9":"testUnlockedDay()","2493097b":"finalizeDestruction()","24932186":"enterOrder(uint128)","24937124":"fetchPaidOrdersForMerchant()","2493a2f2":"setBonusTokenRateLevelOne(uint256)","2493d006":"openWeek()","2493d669":"AllowanceGranted(address,uint256)","24941147":"cancelProject(uint256)","24943c7d":"resolveDispute(bytes16,address,address,uint256,uint16,uint8,bytes32,bytes32,uint8)","2494aef9":"TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE2()","2494e267":"CXLExchangeRate()","24953eaa":"removeAddressesFromWhitelist(address[])","249559ad":"computeVoteOutcome(uint256)","249586f2":"editPayoutSetting(uint8,uint16)","2495c0ce":"stopVote()","24968a70":"getHomePost(uint256)","2496a431":"robPantry(address,uint256)","2496b796":"sellMyTokensElixir()","249830d8":"setUnclaimedPlotPrice(uint256)","24992680":"SelfKeyCrowdsale(uint64,uint64,uint256)","24999c9c":"bonusSignalValue()","2499a533":"Purchase(address,uint256)","249a1120":"licenseTermsMaxCostPerSec(bytes32,bytes32)","249aa292":"preIcoPrice()","249b4d0b":"removeTrustedIssuer(address,bytes)","249b4d4f":"transferContractUser(address)","249b7c19":"presaleEndTime()","249bc291":"transferMintMaster(address)","249cb3fa":"canImplementInterfaceForAddress(bytes32,address)","249eae4d":"addInvestors(address[],uint256[])","249f1f22":"insertNodeSorted(uint256,address)","249f77ef":"CancelSimpleOffer(uint256)","249f7aa0":"exchangeRateChangesBlock()","249ff838":"getAddressByNames(bytes32[])","24a039c7":"CBToken(address,uint256)","24a084df":"sendValue(address,uint256)","24a12edf":"getAuctionIdForUserAndIdx(address,uint256)","24a1871e":"LOL2()","24a1c1e0":"addCertificateAndBind2Wallet(address,uint256,bytes32,bytes32)","24a1cd1e":"currentCoefficient()","24a20a25":"feed10(uint256)","24a23361":"getTeamAttribute(uint8,uint8,uint8,uint32[11])","24a27bd2":"tokensForAdvisory()","24a30e46":"m_claimingIsActive()","24a38383":"WhitelistedSmallCap(address,uint256)","24a3b013":"attachToToken(address)","24a434eb":"openCarousel()","24a43c51":"releaseMultiple(address[])","24a4411d":"DecoderTester(address,address,address,address,uint256)","24a47aeb":"merge(uint256)","24a4aff6":"adaCoin()","24a684e1":"get_perms(bytes32)","24a69051":"allowClaim(address)","24a6a409":"MINTY()","24a6ab0c":"freeSupply()","24a73e5f":"decreaseAllowance(address,uint256,bool)","24a779ca":"PELOMemberMap(address)","24a7d277":"removeAddressFromBlacklist(address,address)","24a80b31":"BusinessUnion(uint256,string,uint8,string)","24a852c6":"unset(bytes)","24a8e11d":"isAuthorized(address,address,bytes32)","24a9d3d9":"callAndReward(string,string,uint256)","24a9d853":"feeBps()","24aa62fe":"setObjectionPercent(uint256)","24aa6dd1":"ProxyManagementContract()","24aa93b9":"getVestedAdvisorTokens()","24abfc02":"getTournamentThresholdFee()","24ac4df1":"cancelNewOwnersCountRequest()","24ac4e65":"getServerUserNumber(address)","24accfa3":"refundMoney(uint256)","24acec2b":"PayeeWithdrawInterest(address,uint256,uint256)","24ad35e1":"PisangChain()","24addfc0":"swapMe()","24ae84cc":"participateCrowdsaleInvestor(address)","24aee933":"usePower(uint256,uint8,uint8,uint8,uint8[176])","24af4cdb":"setNewUserState(string,bytes,string)","24aff74d":"Debit(address,address)","24b04905":"gift()","24b06a96":"getAllElectionsOfOrganiser(address,address)","24b07165":"get_property_facility(uint256)","24b0ff0f":"approveTokensFromKingWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","24b1905b":"sendFirstBatch(address[],uint256[])","24b19da5":"TokenDistribution(address)","24b1a2fa":"disableArbiter(address)","24b1babf":"claimEarnings(uint256)","24b1bfdf":"resetToken()","24b27fc8":"CoquiToken()","24b2c2f6":"GYUToken()","24b33f5d":"_auction(uint256,address)","24b35ef2":"mintTokens(address,uint256,uint8,bytes32)","24b3940a":"sayGoodBye()","24b492d7":"SetInitData(uint256,uint256,uint256,uint256,uint256)","24b4cee0":"openBatch(uint256)","24b4ec3d":"buyOwn(address,uint256)","24b4fc8e":"closeChannelWithoutReceipt()","24b508a3":"listByGroup(string)","24b50e43":"getMsgHash(address)","24b51369":"tgrSettingsPartFounders()","24b570a9":"totalPot()","24b5c134":"numCities()","24b5efa6":"RewardClaimed(uint256,address,uint256)","24b6b8c0":"_safeTransfer(address,address,uint256,bytes)","24b6f7d3":"TestBathTx(uint256,uint8,string,string)","24b72667":"buyprices()","24b77f05":"acceptCounterStack(bytes32,bytes32)","24b79a1c":"ICO_PHASE3_BONUS_PERCENTAGE()","24b82a76":"voterReward(address,bytes32,uint256)","24b89fa7":"unlockStepLong()","24b8fbf6":"register(address,bytes)","24b94ac6":"atto()","24ba1a46":"isSpawnProxy(uint32,address)","24ba506d":"getNumberOfTransactions()","24baeb12":"initCrowdsaleToken(bytes32,bytes32,uint256)","24bb49d6":"balanceMinusFeesOutstanding()","24bb7734":"mainSaleDuration()","24bb7c26":"pausedPublic()","24bbd049":"mintOpen()","24bc4e92":"QueenXChain()","24bcdfbd":"tradeFee()","24bce60c":"freeze(address,uint256)","24bdaf95":"about(uint256)","24bdf96a":"getUserRefBalance(address)","24c034a7":"ERC721Auction(address)","24c05c72":"requestLoans(uint256)","24c0db84":"ico1receivedTotal()","24c12bf6":"code()","24c1f9c7":"stage_3_add()","24c2362b":"buyCrySolObject(uint256)","24c30182":"BleedFomo()","24c31975":"increaseJackpot(uint256,uint256,uint256)","24c33d33":"round_(uint256)","24c37507":"getMinBet()","24c4c9e4":"getCurrentPRETDEBonus()","24c4e3b9":"getPatientHealthData(address)","24c55380":"TicketPurchase(uint256,address,uint256)","24c65927":"createNewAuction(string,uint256)","24c65f35":"updateRefundGas()","24c6ef60":"SafeTokenTransfer()","24c74c1d":"LogClaim(address,uint256,uint256,uint256)","24c74c78":"certify(bytes32)","24c91c1b":"isDataResponseValid(address,address,address,string,bytes)","24c93343":"error(string)","24c9bf5e":"Prizes()","24ca77e5":"teamNum()","24ca984e":"addRouter(address)","24caf5e1":"sale_address()","24cb015a":"_ONE()","24cb57dc":"whitelistEntries(uint256,uint256)","24cc35a6":"_isTeam()","24cd2ae4":"beneficiaryUserIds(uint256)","24ce2562":"updateGameSpecifics(uint256,uint256,uint256,uint256)","24ce2917":"create(address,uint256,uint256,address,address)","24ce9d27":"sellOrder(address,uint256,uint256)","24cee3d6":"Change(address,address,address,uint256,uint256)","24d0cc0f":"getPayouts(address)","24d16a4d":"makeUnderlier(bytes32,address,int256)","24d1c28b":"changeVoteRules(uint256)","24d29cfb":"_removeSigner(address)","24d3048d":"cancelNode(string)","24d30d54":"enableMerge(bool)","24d3eaf3":"bonusEndTime333()","24d427a9":"print(address)","24d4e90a":"ln(uint256)","24d5336a":"deicmals()","24d6169c":"startLockPeriod()","24d6d601":"voteFor(address,uint256)","24d70dea":"hasEntered(address)","24d7378a":"m_totalTokens()","24d7806c":"isAdmin(address)","24d86f00":"decreaseStake(uint256,uint256)","24d89171":"changeNeedFightToAdult(uint256)","24d97a4a":"killme()","24da48a3":"updateMaxAllocation(uint256)","24da569a":"AGToken()","24daddc5":"setRestricted(bool)","24db1f50":"masFreezedTokens(address[],uint256[],uint256[])","24dbb91d":"BusinessCard(string,uint256,string,address)","24dc793f":"getKydy(uint256)","24dcd0ef":"transferFounders(address,uint256)","24dd24ed":"allowingClaimBTC()","24ddb58c":"performStepVerification(uint256,bytes,bytes,bytes)","24de30f1":"distributeEarlyBackerTokens(address,uint256)","24de3c0e":"gwei()","24de908d":"wins()","24df2d5b":"Filmpass()","24df75d9":"withdrawFromTicker(uint256)","24dfc9d7":"getBytes32(uint256)","24e04871":"horseForSale(uint256,uint256)","24e0be2e":"EVenToken()","24e1c3f3":"PRCT_ETH_OP()","24e1fa3a":"FIRST_WITHDRAW_RATE()","24e21cde":"sendTradeOffer(address,uint256[],uint256[])","24e2ca92":"withdrawSharedExpense(uint256,address)","24e2cda7":"TestOrder2(address)","24e2dbd3":"linkRecipientName(bytes32)","24e34476":"myStoredDividends()","24e5355e":"JerryToken()","24e581be":"transferAllToOwner()","24e5bdb9":"getEventsCount(string)","24e5eeaa":"slogan()","24e65e14":"Addr6()","24e7a38a":"setGeneScienceAddress(address)","24e7c824":"performTransfers(address[],uint256[])","24e846c7":"confirmedSaleEther()","24e8b3ec":"getClaimableRewards(bytes32)","24e998c3":"Ethershift()","24e9dad8":"_safeCall(address,uint256)","24ea8d1a":"Fortnitecoin()","24eaf1ea":"SendBadge(address,address,uint256)","24ec6f66":"cancelContest(uint32)","24ec7590":"minFee()","24ed1486":"getPeriodAliasFor(uint256,address)","24ed2d8b":"initOwnership(address,address)","24ed3dc0":"PolyAnalytixProjectToken()","24ed3e78":"BACKUP_THREE()","24eda713":"teamTwoWin()","24edc2a1":"WINT()","24ee0097":"myMethod(uint256,string)","24ee62ee":"secondWavePrice()","24ee9be4":"getVirtualBalance(address,address)","24eebc47":"SWAPCOINZ()","24efe4c3":"_addToClaimList(address,uint256)","24f07356":"batchIncreaseApproval(address[],uint256[])","24f073ad":"getTimeOfLastBid()","24f12f1e":"ProfitSharingMock(address)","24f159c2":"extensions()","24f1ec37":"multiAccessRecipient()","24f2cc02":"preIcoLimit()","24f32f82":"changeHardCap(uint256)","24f35549":"setup(uint256[])","24f3c639":"buyApprenticeChest(uint256)","24f481c8":"oracleItQuery(string,string,string,uint256,uint256)","24f48bc5":"setWatcher(address)","24f5445b":"transferFundToAccount()","24f55e29":"hasCompany(string)","24f618b6":"GetDOTRevokableHash(bytes32,uint32)","24f65ee7":"getTokenDecimals()","24f690ac":"cryptowars()","24f696fd":"LogFundTransfer(address,address,uint256,uint8)","24f731d5":"PlaceBet(uint256,bytes)","24f743dc":"freeSpaceOf(address)","24f74697":"callbackGasLimit()","24f7a980":"WaitStarted(uint256)","24f82526":"closeLong()","24f8fe9c":"EdgelessCasino(address,address,uint256,uint256)","24f91d83":"init(address,address,address,string)","24f9702e":"allocateArrayOfTokens(uint256,address[])","24f99ba4":"ChiMarket()","24fa6f3b":"requiredBlocksElapsedForVictory()","24fabb87":"setImageOwner(uint256,address)","24fad665":"enableMasterTransfers()","24fb563f":"PlayerTickets(address,uint256,uint256)","24fc253e":"eraIndex()","24fc65ed":"getId(uint256,uint256)","24fc70ff":"setBonusOn(bool)","24fcb80c":"parseAddress(bytes32)","24fcbc1c":"withdrowErc20(address,address,uint256)","24fd0a5c":"isAvailableForTransfer(uint64)","24fd2be1":"NationalCoin()","24fd5585":"fixedExp(uint256,uint8)","24fd6ec9":"zeroBonus()","24fe722e":"requestUnpause()","24fe73fe":"isRegularOrBoardMember(address)","24fe8e68":"MyToken(uint256,uint256,string,string,uint256,uint256)","24fef683":"OwnershipGranted(address)","24ffca71":"visitCost(uint8)","24ffea1a":"presaleToken()","25005498":"updateEntityNew(uint256,bool)","2500ec4a":"getDHand(uint32)","25010816":"get_length(uint256,uint256)","25012699":"KERNEL_APP()","25017e10":"transferSubscription(bytes32,address)","2501faa5":"triggerRecoveryAddressChangeFor(uint256,address)","2502c19c":"setRBInformationStoreAddress(address)","250312ce":"bleachAppearance(uint128,uint128)","2503dce8":"updatePublisherFee(address,uint16,address)","25052d02":"getMyTokensReturns()","250537fc":"_createCollectible(bytes32,address)","250540cf":"calcMaxWithdraw(address)","25059052":"WhitelistedLargeCap(address,uint256)","2505c445":"finalizedEthFundAddress()","2505f349":"setTokenMinter(uint256,address)","25062287":"_ownerDist()","25068a28":"freezeAllowance(address)","2506bfe7":"validateBySymbol(string)","25074d73":"Registered(string,uint256,address,string)","25084b04":"manualOverrideEditionHighestBidder(uint256,address)","25096f28":"KryptopyTokenMock()","2509f1b9":"SLP()","250a1c1d":"Validate(string,string,string,bool)","250a8dc2":"isAccountAddress(address)","250a93cb":"POEXToken(address,address)","250ac096":"BuyRoseCoin()","250b1154":"tokenRate3()","250b35e8":"BidSaved()","250bc504":"Ambassador()","250c95fe":"setMaxBuy(uint256,uint256)","250ccce4":"getOutStreamOf(address)","250d5bc8":"LineToken3()","250de298":"EthlanceSearchJobs(address)","250dea06":"modifyBalance(address,uint256)","250e7d61":"CROWDSALE_CLOSING_TIME()","250e816b":"getPeriodSealedPurchaseOrderFor(uint256,address)","250e87c9":"pyramid()","250ef961":"checkCorrectPurchase()","250fe144":"setInvoice(uint256,bool,string,string,string,string)","25100b4d":"placeBet(bytes32,string)","25102f27":"PRESALE_START_TIME()","25107a47":"TransactionRefundedAfterEscalation(uint256)","25112004":"XCNTToken()","25112743":"getSaleContractStartBlock(address)","251139f6":"setPrevContract(address)","25119b5f":"channelManagerByToken(address)","2511b182":"minBuyableAmount()","25128b02":"CampaignResumed(uint256)","25137f46":"setSalesPipeAllowance(address,uint256)","251481c8":"testDecodeTransfer(bytes)","2514a6b4":"withdrawDividends(uint256)","251506fa":"SendFart(string)","25161e70":"HKDHToken(uint256,string,string)","2516a18f":"setMintableToken(address)","2516af82":"createLottery(bytes32,uint256,uint256)","2516c6c6":"min_tokens()","2516d738":"secureAddOrderFunds(address,bool,uint128,uint128)","25174f0e":"getOwnerIndex(address)","25182e79":"winAmount4()","25185d3e":"freeBalance()","25192fca":"issuanceDraft(address)","2519a378":"finalizeReplaceTrueUSD()","251a8096":"total_wins_wei()","251aaf67":"dividendsPaidPerShare()","251b5f8e":"team_fund()","251c1aa3":"unlockTime()","251c7182":"seed_multiplier()","251d3589":"setUseEIP712(bool)","251d8ffb":"setNav(uint256)","251e3d7d":"registerMember(address,bytes,uint256)","251ed995":"walletSetWallet(address)","251fa3b1":"testFailRetractLatestRevisionNotOwner()","251fbe37":"get_training_index()","25200718":"requestAudit(string,uint256)","25209260":"PrepareRoll(uint256)","2520bf04":"shuffle()","2520d2e1":"readvalidrollsXaddr(address)","25221a4f":"addToBlacklistMulti(address[])","25223bd4":"donor()","25233782":"magicnumsig()","252348dc":"ratePerEth()","2524380f":"buy_Exchg_BkgChk(address,uint256,uint256,address,uint256)","25245b26":"sendEth(address[],uint256[])","25248587":"indexview(address)","252498a2":"setUrl(string)","25250519":"addGlobalAdmin(address,address)","2525aa78":"mintStart5()","2525f5c1":"cancelBid(address,bytes32)","25266f96":"isNewPlayerInBattle(string,address)","2526d960":"clawback()","2527331b":"transferToSimpleService(address,uint32,uint256,uint256,uint256)","252733f0":"registrantsPaid()","252786e4":"WatchBlockSizeInEther()","25280163":"RedFundCrowdsale(uint256,uint256,uint256,address,uint256)","25287c0e":"bonusesGiven()","2529b907":"setVaultDeposit(uint256)","2529d1a3":"fused()","252ba7a0":"userDeployCount(address)","252bb9c3":"PHOENIX_CORSAIR_EXTRACTION_BASE()","252cb4fe":"registerProposal(uint256,uint256[])","252ccac3":"getTotalActiveBets()","252cedc3":"sendERC20Tweet(uint256,string,string)","252d1578":"init(address[],uint256,uint256,uint256,uint256)","252d7eb3":"getCurrentPayoutIndex()","252dbc36":"setTokenPoolReward(uint256)","252e40b1":"secondsPerYear()","252edb76":"setUInt8(bytes32,bytes32,uint8)","252f14ba":"_addArbiter(address)","252f34a7":"loserOne()","252f4977":"destroyTokensInBntyTokenContract(address,uint256)","252fb38d":"bytes32string(bytes32)","253089b5":"smxTeamAddress()","2530c905":"rand(uint256)","25316ff5":"getBetUint(uint8,int8)","2531a36a":"getDesignatedReportDisputeDueTimestamp()","25327b75":"latestErc20TxRequest()","2533bb9d":"dataCentreAddr()","2533ff94":"LogPersonUpdate(address,uint256,uint256,string)","2534076e":"cancelRemoveOwnerRequest()","253459e3":"feesSeperateFromBalanceApproximately()","253515d5":"accruedBuyout(address)","2535b150":"cryptoJingles()","2535dd53":"getAvailableWithdrawInvestmentsForBeneficiary()","2535f762":"transferWithData(address,uint256,bytes)","25361060":"getReferralStatus(address)","2536d7f1":"endOfCrowdsale()","25384770":"reserveAllocated()","25387eed":"tallyTheVotes()","253abf4a":"processSalesForAllBuyers(uint256)","253bc579":"companyClaimed()","253bd7b7":"check(address,bytes32)","253c8bd4":"change_owner(address)","253caf94":"setTasksAddress(address)","253d8195":"SavingsBank()","253e3447":"numberOfSpritesOwnedByUser(address)","253e7fdf":"becomePacifistmaster()","253ebd92":"isTierJoined(address)","253f029c":"performUpdatePC()","253f055b":"getStage2End()","253f2809":"offerCollectibleForSale(uint256,uint256,int256,uint256)","253f5c38":"addtoLeaderboard(uint64,uint64,uint64)","253f89b0":"minContributionUSDc()","25400abc":"buyPuzzle(uint8)","25402e6c":"vcxCount()","2540424b":"isDefIndexInRange(uint8)","25406480":"extendPeriod(uint256)","2540c420":"phaseOneRate()","2541edcc":"oferta()","25435704":"updateTokenSupply(uint256)","254439fe":"addTokenList(address,uint32)","25449c54":"ArteumToken()","2545686d":"is_slot_in_bid(uint8,uint8,uint8)","2545a07a":"MOEToken()","25461328":"MSPMock(address)","25464902":"AUCC()","2546559c":"Demo()","2546de10":"vest(address,uint256,uint256)","254747a5":"checkAvailableAmount(address,uint256)","25476ed8":"settleAndWithdrawCfd(uint128)","254800d4":"vestingStart()","2548bbbd":"WithdrawalCreatedEvent(uint256,uint256,bytes)","25495998":"getMinimumConsumerDeposit()","25498152":"setBuyDividendPercentageFee(uint8,uint256,uint256)","2549ad8f":"MANHATTANPROXYCNVNTAVE()","2549e0b1":"getLockedBalance()","254a46f4":"cycleMintSupply()","254b302d":"revokeAllMyId()","254bd326":"getUserAddr(uint256)","254c70ac":"getPlayerData(uint32)","254c91b3":"testBitNotSetSuccess()","254d2e12":"GetDemolishCost(uint256,uint256)","254dacba":"BurnTokens(address,uint256,string)","254dcfe2":"lastActiveTransaction(address)","254fd745":"transferUCASH(address,uint256)","255016c8":"checkIfExploded()","255074a9":"addManualContributor(address,uint256)","2550c435":"CRYPTO_USD()","2551858e":"getFlags(bytes32)","2552317c":"lastBlockNumber()","25534a1e":"saleEtherReceived()","2553795a":"AragonSupply()","2553ac0d":"getPlayeds(uint256,address)","2553e0cb":"OwnedMortal()","2554a358":"queryCurrentTradablePrice()","2554b9b3":"kkkTokenSale(uint256,address)","2555611a":"AOKPAY()","25568fd7":"__setBeneficiaryForDasTokensChange(address)","2556befa":"feeBank(address)","255706f5":"start_service2(uint256,address)","25575a04":"peBalance()","25579702":"calculateDrugBuySimple(uint256)","25580656":"dataSourceGetRoundOfSixteenResult(uint256)","25583590":"_cancelAuction(uint256)","25585ee8":"diamondIndexToApproved(uint256)","255884ae":"discoveryPrice(uint256)","2559e0dd":"rateInSpecificTier(uint256)","255bd903":"signByBride()","255c8244":"amountRaisedPreSale()","255c8fee":"TestyTest()","255e2f81":"adjustDollarToEtherRatio(uint256)","255e444e":"scientists()","255e4685":"mintStart()","255eac5c":"newRegistration(address,uint256)","255f82e2":"sealed(uint256,bytes32)","25605c6a":"balanceOfSC()","2560a8c0":"houseedge()","2560baeb":"calculatePayrollBurnrate()","25616007":"getLandplayerFirstDefenderID(uint8,uint32)","25618ca8":"setBattleContractAddress(address,address)","2561ee35":"estimateBuyOrder(uint256,bool)","25625608":"FoundWinner(address,uint256)","2562b427":"declineKyc(address)","25630c9f":"fwithdrawal(uint256)","25635b68":"updateBaseInventory(uint256,uint256,uint16)","2564e1c4":"PaymentAddressFactory()","256540cd":"turnover()","256697df":"ibcDistributed()","25672ee6":"OpenBids(address,uint256,address,address,uint256,uint256)","256738d1":"AGT()","25686e15":"getMarketsRocId(uint256)","25687e28":"tuneLastStageStartAt(uint256)","256919c6":"fixSale()","25696308":"lastBlock_a10Hash_uint256()","25697337":"getLittAdminCount()","25698d89":"isLottery()","2569cd6c":"assistant()","256a9f81":"extendedTime()","256b8dfe":"Travelcash()","256bcaa0":"addToJackpot()","256bdaa4":"setEtherRate(uint16)","256c0926":"RocketPoolCrowdsale(address)","256c10a1":"market2021TokenCreated()","256c3232":"getPreICOBonusAmount(uint256,uint256)","256c5fc6":"LooisToken(uint256,string,uint8,string)","256df407":"test_spamFreeze()","256f992b":"organizers_percent()","256fa241":"distributeTokens(address[],uint256)","256fec88":"lastSender()","2570c13d":"GBCoin()","2570e31e":"getTokens(uint256,address)","2571a4ab":"MaxBetAmountChanged(uint256)","25731e97":"quitBanker()","257341a8":"vestingCountOf(address)","2573aa7d":"newShare(address)","2573ce27":"validateUserByHash(bytes32)","25746251":"canVote(uint256)","25750995":"updateChfCentsPerEth(uint256)","25756d90":"getWeaponRarityFromTokenId(uint256)","2575d47e":"EmitAccountChartDetails(address,uint256,uint256,uint256)","2576a779":"updateServiceFee(bytes32,uint256)","257714db":"getTransferRate(address)","257781e7":"deleteIPFSHash(bytes32)","2577929b":"settleContract(uint256)","257793f9":"getConstructorTouches()","2578117b":"getPotAsFixedPointForGameId(uint256)","25787747":"icoDuration()","2578e943":"RHYNOTE()","25799b18":"getUnapprovedArtists()","2579dd3c":"registrantToHopefulIds(address)","257bcd6a":"placeBet(uint256,bytes32,bytes32)","257c360d":"getCurrentBalanceForCampaign(bytes32)","257c88b5":"curQuater()","257d3db5":"setNumNumbers(uint256)","257d5995":"updateSinglePayout(address,uint256)","257d849f":"ZegartToken(uint256,string,string,string)","257d9bb8":"MINIMUM_AMOUNT()","257e0523":"addLockedTokeD(address)","257e1f8f":"endUpgrade()","257e5c69":"matchStake()","257ef522":"approveBountyTransfer(address)","257ef70b":"fillSellOrder(address,address,uint256,uint256)","257f9abf":"removeFromList(address)","257fc838":"setResolveValueGasLimit(uint256)","258072e5":"display_rate()","2580ce84":"totalAndRemainOf(uint256,address)","2581021c":"depositCollateralOnBehalfOfRecurse(address,address,bytes32,uint256)","258108da":"slaveWalletPercent()","25818751":"test_oneValidEqUint3()","2581c674":"testBitsOrFailIndexOOB()","2581f5a4":"distributeAirdrop(uint256,address[],uint256[])","2582bf2a":"updateDelegateKey(address)","258315b3":"ATC(uint256,string,uint8,string)","2583373c":"distributeAndUnlockTokens()","2583a1d9":"oraclizeQueryId()","2583b2e4":"totalWithdrawTokenAll()","2584295e":"userWhiteListContracts(address,address)","2587eb4e":"setRate(int256)","2588f9a5":"ReleaseAgentSet(address)","25892f92":"ApprovedBy(uint256,address)","2589af4a":"getProjectKudosByUsers(bytes32,address[])","258a61d6":"coordinateToIdentifier(uint256,uint256)","258a6ca6":"getStoryExpiry(bytes12)","258ae582":"verify(bytes32,bytes)","258b5a35":"challengeSettle(bytes,uint8[2],bytes32[2],bytes32[2])","258b5c06":"finalizeCrowdsale(uint256,uint256,uint256)","258b5da6":"recoverWETH()","258b85d4":"verifyHash(string,string)","258c047e":"getStatusEventClosed(bytes16)","258c0f1e":"deleteCaller(address)","258c2a2d":"Charity()","258c4f63":"channelManagerByToken(address,address)","258c5ddd":"softWithdraw()","258d3d6e":"PlayHallToken()","258da4b4":"seedStarted()","258dd544":"estimateSellOrder(uint256,bool)","258e60b6":"start(string)","258f6b8f":"GiveReferralRocket(uint16,address)","258fd4f3":"Stage1Allocation()","25910753":"addCourse(string,string,bytes32)","2591432d":"canary()","25925806":"tokensAllocatedForCs(address,address,address)","2592e921":"verifyParams()","2593ed21":"setICO1Phase()","2594b343":"walletTwo()","259653b8":"distributionClosed()","2596c93b":"manualBonusActive()","2596e62c":"test_oneValidEqBytesUint()","25973ef7":"CIFRCOINTOKEN()","25979983":"sendToAll(uint256)","25981559":"bluceTestCoin(uint256,string,string)","25982586":"AddressDemo()","259852f8":"updateGenVault(uint256)","2598ab9d":"createPromoSeedAuction(uint8,uint8,uint256,uint256,uint256,uint256,uint256,uint256)","25990d4d":"TokenFulfillment(address[2],uint256[8],uint256)","2599c661":"getgamecardsalemoneyuint256(uint256)","259a28cf":"UNLOCK_PERIOD()","259b2ce0":"whitelistRegistrants(address)","259b5181":"_batch2_rate()","259b5605":"PTL()","259bc6f5":"getWhiteUsers()","259c05f5":"DEV_TAX_DIVISOR()","259c29e8":"replaceShorter()","259c95c4":"_sendWebGiftToken(address,uint256)","259ceee5":"contractTokensTotal()","259d1cb4":"eth_decimal_num()","259d33c1":"roundStats(uint256)","259eb959":"privilegedTransfer(address,uint256,bytes,string)","259fddaf":"stakeCommunityTokens()","259fefcb":"angelAddress()","25a10a70":"getChild(address)","25a190c9":"inicializaStatusPossiveis()","25a2219f":"promotionsUsed()","25a30145":"preSaleTime()","25a31135":"Disable()","25a34aca":"returnMargin()","25a3ba49":"getCertKey(string)","25a42081":"setPriceStep3(uint256)","25a43ea5":"setts10(uint256,address)","25a50636":"completeBountyAddresses(address[])","25a52d9d":"curentWinner()","25a583a3":"_reAdjustDifficulty(uint256)","25a6c545":"generalInfo()","25a7650a":"beginGame(uint256)","25a78057":"DeClubToken(uint256,string,string)","25a86d56":"ETH_USD_EXCHANGE_CENTS()","25a8e6f9":"addNewEditor(address)","25a9d450":"getClientBalance()","25ab2d03":"getReturnSize(uint256)","25ab526d":"MITPurchase(address,address,uint256,uint256)","25ab9f43":"addDoubleChanceLine(uint256,string,uint256)","25abc312":"changeICOPrice(uint256)","25ac29da":"generateUrl(string,uint256)","25ace2a7":"checkExpired()","25ad7f2e":"OneStep()","25ad91ce":"createUser()","25adfc8f":"SetMaxMinersXblock(uint256)","25aeb4a2":"addPayment(uint256,string,int256,bool)","25aef744":"ValuePlaced(address,address,uint256)","25b05c88":"playerGameId(address)","25b10186":"INITIAL_PRICE_INCREMENT()","25b198eb":"inList(address)","25b1a072":"setGOPCreator(address)","25b29d84":"getEtherValue()","25b2ac77":"privateOfferingWallet()","25b31a97":"purchase(address)","25b3b5a8":"_totalMinedSupply()","25b3bfb8":"transferFrom0(address,address,uint256)","25b3edd9":"updateTraits(uint256)","25b5160c":"setICOPrice(uint256)","25b56727":"createProxy(address,address)","25b56dd4":"averageScrapPrice()","25b634c0":"approveDisbursement()","25b64bba":"signerConsumerNonce(address,address)","25b6ae80":"incSALESTATE()","25b72273":"SGT(address)","25b75b7b":"deregistrationDate()","25b825ab":"newMediaToken(uint256,uint8,string,string)","25b886eb":"constructors()","25b89c52":"AirDropToken()","25b901c8":"Refundlineinfo()","25ba0824":"grantOwners(address)","25ba0f51":"initContract(address,address)","25ba2d2e":"minimalPrice()","25bae118":"earlyPurchaseClosedAt()","25bb8e93":"_badgeUnFreeze(uint256)","25bccea2":"setFreeze(address)","25bd4639":"paymentId()","25bd713f":"tokensForPlatform()","25bdb2a8":"getSaleState()","25bdb73d":"benefitPercents()","25bdc110":"Resolve(bool,uint256)","25bddc18":"DGXCrowdsale(address,address)","25be124e":"token2()","25be53e7":"kickStartICO(address,uint256)","25c065b1":"minStakingAmount()","25c10247":"buyIPC()","25c2052f":"last_random()","25c24bc3":"folioToken()","25c302e4":"totalDonors()","25c48f30":"MYDECIMAL()","25c50f97":"enablePhenomenon(bytes32)","25c54456":"existsContract(address)","25c5ce04":"availableOnStage()","25c5d4d4":"tileDrop(address[])","25c62d5a":"MAX_TOKENS_AIRDROPS_BOUNTIES()","25c70a44":"moveToArea(uint16)","25c782d7":"addStageCrowdsale(address)","25c7cd17":"getCurrentLeaderOwners()","25c843b9":"comments()","25c9307d":"lastBetBlockNumber()","25c93df3":"rewardTokenAmount(uint256)","25c95538":"isRepeated(string)","25c972ff":"JoinGameAsBanker(uint8,uint256)","25ca5cc6":"candidateTillETHAssets()","25ca953d":"resetAirDrop(uint256,uint256)","25caa262":"getBal()","25caaa37":"getMyChicken()","25cb2bc6":"getBrokerAddress(uint256,uint256)","25cb366d":"manualMigrate(address)","25cb4f2c":"profitContainerAddress()","25cb5bc0":"getExpiryTime()","25cb6303":"isItIco()","25cb98d5":"removeVerifiedUser(address)","25cbd68e":"fifthTeamWithdrawal()","25cbe702":"tokenSupportLimit()","25cbeb0a":"DICIMALS()","25cbeb7e":"creatorsAddress()","25cc348f":"testDeployedValues()","25ccdb4c":"currentspudinfo()","25ccf381":"create_forwarder()","25ccf688":"KEO()","25cdca8d":"CommonWhitelist()","25cde42c":"addPayerRefundAddressAction(bytes32,bytes)","25ce77a0":"devuelveEncuestados(bytes32)","25ceb4b2":"submitBlock()","25cf512d":"setBytes32Value(bytes32,bytes32)","25cf98e5":"EduCloud()","25cfa566":"StartingPrice()","25d00041":"registrantIndex()","25d04034":"KT07Coin(uint256,string,uint8,string)","25d0b4ef":"minFundingGoal()","25d104d4":"returnVestingSchedule()","25d1da84":"revokeAll(bytes32,address)","25d30d8e":"cnt_per_Keos()","25d3a09d":"getProposal(string)","25d3b2c6":"check_array_add(address)","25d3bcd1":"saleHardcap()","25d3d0e3":"purchaseTimestamp()","25d4bdeb":"LookAtCollectedFees()","25d5971f":"withdrawStake(uint256)","25d5eafa":"total_points()","25d76e6d":"setCompte_27(string)","25d78d3b":"IcoPhaseManagement(address)","25d83bb3":"authorized_setCardPerkText(uint256,string)","25d85e12":"totalPopulation()","25d8a4b2":"SpiceToken()","25d8dcf2":"betAndFlip()","25d8f6a5":"dividendForHistory()","25d91125":"earlyWhitelistBeginTime()","25d92ee2":"updateFeeWallet(address,address)","25d988bb":"buy_token(address[],uint256,uint256)","25d998bb":"availableBalanceOf(address)","25d9d57d":"highTokensToSellGoal()","25d9ec83":"requestBuywithETH(address)","25dac5e3":"DocumentStored(uint256,uint256)","25db4dd0":"jackpotBlance()","25db6699":"tgrSettingsBlocksPerStage()","25dbe054":"setDonationUnlockTs(uint32)","25dccaf9":"postMessage(address,uint256,string)","25dd0ee6":"checkTotalBalance(uint256[])","25dd495a":"Recycle()","25ddda76":"changeMixEnable(bool)","25dfbfba":"addProduct(string,string,string,string,uint256)","25dfcf84":"saleAllocated()","25e023b3":"unlockOwnerBalance()","25e0671f":"areReservedTokensDistributed()","25e0c876":"sosTransfer(address,address,uint256)","25e11811":"addFunctions(address)","25e1350f":"insert_candidate(string,uint8,string,string)","25e16063":"withdrawEth(address)","25e1b5e4":"pricePerMessage()","25e1c6f7":"batchTransferORS(address[],uint256)","25e3172b":"AdminClaimAirdropMultiple(address[],uint256)","25e330fb":"_increaseRarity(uint256,bytes32)","25e37b2b":"delTournament(address)","25e3d3ba":"blockResult(uint64,uint64,uint64)","25e3d7b4":"assignSharedOwnership(address,uint256)","25e41da1":"getRandomValue(uint256)","25e524d3":"right8(uint256)","25e629f2":"fundraisingDelta()","25e65584":"getPlayerBossWannaCryData(address)","25e6c304":"totalPrizes()","25e6f516":"tokenDescription()","25e7514b":"remainAmount()","25e7c9ad":"getTotalAmountOfFirstInvestors(uint256)","25e7e3cf":"recoverAllEth()","25e89283":"mainSaleActive()","25e8f38c":"logUI(string,uint256)","25ea269e":"Scissors()","25eafb45":"AikcoinSupply()","25ede147":"depositSecretBid(bytes32,bytes)","25ee8abb":"winningTeamSet()","25eeecbc":"divisionByZero()","25ef9afa":"LOG_newSpinsContainer(bytes32,address,uint256,uint256)","25f08fc4":"decayedPriceOfTwitterId(uint256)","25f0f467":"updateTransferFeeRate(address,uint256)","25f0fd23":"_revoke(bytes32,address)","25f262c7":"draw(address[])","25f281b4":"changePriceSetter(address)","25f39a63":"div(int128,int128)","25f3da52":"GetBankAccountNumber()","25f3f2ef":"joinBuyRequest(uint256)","25f43ed5":"setMemsize(uint256)","25f4c703":"setFoundersPercent(uint256)","25f5cb1e":"getAllowedForTransferTokens(address)","25f5ec45":"getCheapestCardWager(address)","25f673f5":"Love(address,address,uint256)","25f731c8":"transferOwnershipBack()","25f885d0":"CashOut(bytes)","25f96b73":"ownerSupply()","25f9bfef":"CONTRACT_REGISTRY()","25f9f1e6":"lockOwnerBalance(uint256,uint256)","25fa0131":"isZero(address,string)","25fa5ae1":"createShapeShiftTransactionPost(string,string)","25fa8a4f":"_firstTokenId(address)","25fad06a":"clearances()","25fb439c":"POW33()","25fb66b9":"getHeroItems(uint256)","25fc575a":"deregisterToken(uint32)","25fc5f02":"HIPHOP()","25fc790f":"te()","25fcdad8":"complaint(address)","25fced01":"sellTokensPreIco()","25fd1e29":"REFUND_TIME_FRAME()","25fda176":"notify(address,uint256)","25fdb725":"MIN_CONTRIBUTION_ETH()","25feb519":"fifthTime()","25ff68dd":"Initialized(address,uint256)","25ffba04":"updateTokenStatus()","26000ba2":"updateBalanceOnFunding(uint256)","2601d1bc":"checkGameState()","2602bc8f":"_transfer(uint256,uint256,uint256,bytes32,string,uint256)","26030a34":"report(bytes32)","2603ace6":"unRegOwn(address,string,address)","2603f70c":"ownerDeclareRefundFinish()","26044feb":"fetchdivs()","26046743":"assetOwnerRemoved(bytes32,address,address)","2604b767":"getEggsSinceLastHatch(address,address)","2604f424":"FUTURE_DISTRIBUTE_LIMIT()","26052ef6":"getCurrentSolver(address)","2605b3c7":"participant(address)","26066ad5":"offer(uint256,bytes,uint256,bytes)","2606a10b":"report()","26070774":"Token(address)","26073003":"congratulationFromNoel()","26086c70":"triggerVersion(address)","2609037c":"requestArbitration(address,bytes32)","26091cbe":"OwnersBySpinner(uint256,uint256)","26093bbc":"safeIncrement(uint256,uint256)","26094c60":"setUnsoldTokensWallet(address)","260958a5":"getTransfer(bytes32)","260993f9":"registerSister(address)","260a5227":"buyOnBehalfWithSignedAddress(address,uint128,uint8,bytes32,bytes32)","260a54d3":"getCA(address,address)","260a818e":"unregister(bytes8)","260abfa5":"EnableMember(address)","260b0bc8":"payToOracle(uint256,uint256)","260b8f6e":"GetEvaluate(address,uint8)","260bf85a":"updateAmountToTakeAsRake(uint256)","260c2214":"setValid(uint256,bool)","260c3af1":"IcapTransfer(bytes32,address,bytes32,uint256)","260d387b":"blacklistUserForTransfers(address)","260e6885":"BazraCoinToken()","260e9640":"lock(uint256,uint256,uint256,uint256)","260ea6c9":"myDividendBalance()","260edaaa":"surplusTokens()","260f836d":"intercrypto_getInterCryptoPrice()","26109699":"Withdrew()","26111ab2":"addToSet(uint256,uint256)","2611341b":"submitApplication(address)","26119a0b":"changeFeeETH(uint256)","26121ff0":"f()","26134334":"getProjectKudos(bytes32)","2613ba9a":"PlatformDeposit(address,address)","2614195f":"getNameFee()","2614d4a4":"spendCredits(address,uint256)","2614fff6":"lengthOfCommonPrefix(bytes32,bytes32)","26161670":"donkeyRanking(uint256)","2616501d":"defaultRate()","261669ba":"HeroesToken()","26168eed":"getTestimonial(uint256)","261775f6":"BlokGrup()","2617fc13":"resetcardPrice()","26180224":"newChallenge(uint64,uint64)","261879ed":"addKitty(uint256,uint256,uint256[5])","26188437":"tokenReserved(address,uint256)","2618a571":"DEVELOPMENT_TEAM_CAP()","26195901":"numAnimals()","2619ba7f":"ETHFee()","261a323e":"exists(string)","261aa1c5":"additionalBonusPercent()","261ac279":"getApiByIdWithoutDynamics(uint256)","261b2c5e":"stepVestingDuration()","261b4205":"equalBytesToBytes(bytes,bytes)","261bd0f1":"BUY_BACK_BONUS()","261c085e":"registerChallenge(bytes32,uint256)","261c42dd":"getAllRevisionTimestamps(bytes20)","261cb08a":"burnPausedTime()","261de7c4":"right33(uint256)","261e9693":"balances4(uint256)","261eafc8":"addMasterTo(address,string,string,string,uint8,uint8,uint8,uint8,uint8,uint8,uint32,uint32)","261ed1d8":"farmCities(uint256)","262006e9":"getFirstDocumentIdBetweenDatesValidFrom(uint256,uint256)","262007c0":"getBetter()","26207bd1":"indices(int128)","26208591":"payDividendsTo(address)","2620f61c":"storeClaim(uint16,address,uint256)","2620fb2b":"getNextTime(address)","2620fd4a":"setupICO(uint256,uint256,uint256,uint256)","262199c3":"changeTokenOwner()","2621b6e3":"finalStageRefund()","2623297e":"zt()","26232a2e":"platformFee()","2623f687":"getRevenue(uint256)","2624597c":"createTokensForEvent(address,uint256,uint256,string)","2624b2d9":"EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH()","2624c4eb":"EtheremonEnergy(address)","2625e2e1":"post(address,address,bytes32)","26278f86":"unrestricted()","262799f7":"PaquariumTokenTest2(uint256,string,uint8,string)","262834da":"_addOperator(address)","2628803f":"migrateREP()","262933cb":"responseFromWS(address,uint256,bytes32)","26295b52":"createGalaxy(uint8,address)","262aa9fc":"DOGToken(uint256)","262af333":"sponseeAddress()","262af3dd":"getClassViewValue(uint256)","262b9f8c":"finishRoundA()","262bcb68":"mintBooster(address,uint32,uint8,uint8,uint32,uint24)","262c0b72":"getPayoutFreezePeriod()","262c3666":"forward(bytes32[],uint8,bytes32,bytes32)","262da6df":"TransferOwnershipOperationEvent(address,uint256)","262f8244":"HGSOCIAL(uint256,string,string)","262f8c0e":"addTimelock(address,uint256)","262fe547":"testCheckSavecEthBalance()","2630271d":"setlockaddress(address,bool)","2630c12f":"priceOracle()","2630d97d":"setAtomLev(uint256,uint8)","2630ee9f":"revealBid(bytes32,address,uint256,address,address,address,uint256,uint256)","2630ef36":"setNumOfTimesSteal(uint8)","263164b9":"getSalaryTokensTotalCount()","26316e58":"setMigrationMaster(address)","26324eff":"producers(address)","26325bd3":"allowEveryone()","2632924d":"left30(uint256)","2632bf20":"unblockMe()","2632fc3c":"MichiganvsLoyola()","2634592a":"logReportsDisputedCalled()","26345de2":"VendingMachine()","26348325":"smartContactForSale()","263570c0":"addStorage(string,address)","2635f4de":"registerLibrary(bytes,address)","2635f59f":"InterfaceToken()","263631b4":"euroCents2wei(uint256)","2637bb2e":"isTransferProxy(uint32,int256,address)","26381b05":"canReceiveTokens()","26387b07":"Fortune()","2638b25c":"seedEndTime()","263a6d79":"initiateTransaction(address,uint256,bytes)","263b694a":"MIMIMUM_CONTRIBUTION_AMOUNT_ICO()","263c0a8d":"_setLagParams(string,uint16,uint8)","263c493a":"enable_deposits(bool)","263c6ec0":"usdToTokens(uint256,uint8)","263ce6a0":"getWinningPrediction(address)","263d4878":"triggerRefund()","263d5ad0":"vaultPercentage()","263dffba":"_releaseVouchers(address,uint256,uint16)","263e3d5d":"terminateContract(uint256)","263e6d0d":"INDOPAY()","263e74e6":"computeBonus(uint16)","263e79b5":"addCreditScore(uint256,string)","263eb5b6":"assertEq8(bytes8,bytes8)","263ef0cf":"needRefoundETH(address,uint256)","263f6a42":"rateFeesNumerator()","263fa1ad":"XYZToken()","263fbd45":"getContractUpdatedTimeById(bytes32)","263fbef2":"District0xNetworkToken(address,address)","263ff8b9":"buildTokenId(uint256,uint256,uint256)","26407e36":"calculateSharesInTheRevenue(uint256,uint256)","26409047":"BDACoin()","2640b401":"SetRate(uint256)","2640f62c":"getTokenToEthOutputPrice(uint256)","26413760":"reducePlayersGooProduction(address,uint256)","2641d381":"totalNumberTokenSold()","26423259":"viewCoinSupplyAndFunding(bool)","2642567e":"coinData(address)","264282f2":"markTokens(address,uint256)","26428430":"_deleteInt(bytes32)","2643fc13":"spermlordReq()","2644f9f8":"getAssetsOwners(uint256)","26452036":"InitCountry(uint256,uint256)","264534be":"OMC(uint256,string,string)","26458beb":"firstPreSaleDate()","2646754d":"TestTokenA()","2646b176":"getPaimentStatus(address,uint256)","2646bce6":"LogWinner(uint8)","2646bfcb":"pay(uint256,uint128,address,bytes)","26470ae4":"getBonusFactor(uint256)","26476204":"stake(address)","26483bcd":"tokenMultiTransfer(address)","26484a44":"start3XPhase()","26487265":"contractExecuted()","26488531":"banMember(address,string)","2648a7e2":"EtherRedeemAccepted(address,uint256)","26493a6f":"setAllocateAgent(address,bool)","26496cab":"Milestone_IcoSuccessful(string)","2649cb10":"pNumberOfLockedTokens(address)","2649d62e":"multiMint(address,uint256)","264a3edc":"setPolls(address,address)","264a6d10":"get_next_asset_document_from_document(bytes32,bytes32)","264ae918":"withdrawChannel(address,uint256)","264b2b8e":"returnBalance(address)","264c22bb":"getAmountOfGene(uint256)","264c2cdc":"generateRandomNumber(address,uint8)","264c8e9a":"whatWasTheVal()","264caf14":"addVestor(address,uint256,uint256,uint256)","264d26e1":"ICO_CAP1()","264d7797":"tokensBought(address)","264dac0f":"endBorrowAgreement(string,uint256,uint256)","264e3018":"EtherDeltaHandler(address)","264f28fe":"getOwnerDeposit()","264f5718":"rondaSilla()","264f630d":"DonationReceived(address,uint256)","264faeb8":"getReportsCounter(uint256)","26500c84":"ResolverNode()","265028c2":"GetMaxBuyIn()","2650a47c":"withdrawEther(uint256,uint256)","26529836":"ADVISER_STAKE()","2652b4a5":"UDA()","2652c0f4":"hasVerifiedAttributeValue(address,uint256)","2652c757":"submitBracket(bytes32)","26532df8":"subZero(uint256,uint256)","2653ab19":"getMC(uint256)","2654e624":"ResumePayment()","265580f5":"setRegistryExecID(bytes32)","2655dd0b":"storeId(address,address,uint256)","26563b40":"whitelistManager()","2656455f":"claimEthFor(address)","2656b77d":"addToBattle(uint64)","26571388":"xpaExchange()","26591e79":"BONES()","2659d8ef":"setExchangeFormula(address)","265a3afd":"registerBase(bytes32)","265a8636":"_mintFish(address,uint32,uint8,uint8,uint8,bytes16)","265af6d1":"withdrawFundsAndPayRoyalties(uint256)","265b3e6c":"calculateIssueGoldFee(uint256,uint256,bool)","265b5d93":"getMaxLockAmount(uint256,uint256)","265c920f":"setBonusParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","265cdd88":"Bet(address,string,uint256)","265cfbbc":"Emitter()","265d900b":"wtech()","265dcbd3":"StandardTokenWrapper(address)","265f0393":"KryptopyCrowdsale(uint256,uint256,uint256,uint256,uint256,address)","265ffe2b":"ethMin()","26602470":"hashEIP712Message(bytes32)","2660316e":"plyrNames_(uint256,bytes32)","26605772":"renameTulip(uint256,bytes32)","2660b56c":"setData_2(string)","26617c28":"_setPaused(bool)","26625e46":"formatDecimals(uint256)","26627d80":"third_whitelistSupplier()","266361f5":"getLottoData(uint8)","26637579":"_removePlayer(uint256,uint256)","26638a38":"spin(int256)","2663a4ed":"byteToLower(bytes1)","26654d57":"refundParticipant(address,uint256,uint256,uint256,uint256)","266578d0":"_isRateActual(uint256)","26657c77":"Validate(string,string,string)","26663203":"withdrawFromEscrow(address,bytes32)","266710ca":"manualUpdateBalances_only_Dev()","266716f6":"GTSToken()","2667f407":"__proxy(address,bytes)","2668748d":"applyAuditorsCheckUpdate(address,address,uint64)","2669268b":"FUC(uint256,string,string)","266987ef":"p2pLocker(address)","26699576":"playSystem(uint256,address)","266b059e":"setSendAmount(uint256)","266b2eb5":"Conserve()","266bd375":"MyPizzaPieToken()","266c2132":"_prand()","266cc170":"Y2J()","266ce248":"createPlayer(uint16)","266cf109":"record()","266d7bda":"lockupEndTime()","266d8299":"DriveholicToken()","266fc436":"producedSilverCaps()","266fc5d5":"totalContributorsProfit()","2670bdf0":"setERC777(address)","2670cc14":"transfekbolPlutocrat(address)","267127ec":"getTokenSettings()","267177eb":"sendPayout(bytes32,uint256)","2671b61d":"OfferRouting(bytes32,bytes32,uint256,bytes)","2671e253":"resetTraps(uint256)","26728b14":"rewardPXL(address,uint256)","2672b3e2":"SplitterEtcToEth()","2672c952":"seed_coins()","26735c06":"TOTAL_POOL_COMMISSION()","26736363":"APRInflationToken(uint256)","26741c88":"IcoMessage()","26744071":"WLCoin()","26745909":"PRNG_Challenge()","26746f5f":"updateGenerationRatio(uint256,address)","26748804":"BlockPoints()","2674899b":"getSaleHour(uint256)","267490aa":"turnOnPresale()","26749ad7":"approvedContracts(address)","267502c9":"setAquarium(address)","2675c123":"CloseContract()","26760d1d":"setMaxTms(uint256)","26767298":"RimuoviMiner(address)","26767cfe":"shareProfits()","26768b83":"_emitDestruction()","2677ef1b":"_seal(address,address,uint256)","26782247":"pendingAdmin()","267822c1":"finalizeChangeBurnBounds()","267835a4":"_removeBurner(address)","26798494":"EusdContract(address,address,address,uint256,uint256,uint256)","26798680":"toReal(int216)","267acd6c":"getPricesPerInterval(uint8)","267b6922":"entries(bytes32)","267c4ae4":"exists()","267c8507":"authorizeManager(address)","267f20a2":"_transferTo(address,uint256)","267ff78c":"approveRequestUnpause()","26811c09":"NVBToken()","26815de3":"updateGoldPrice()","2682644f":"PURCHASE(address,uint256)","26826bf8":"setImage(bytes)","2682a0ac":"CrowdsaleTokenExt(string,string,uint256,uint256,bool,uint256)","26834988":"numListed()","26839e53":"getUintValues(bytes32)","26839f17":"depositEther(uint256)","26843251":"presale1_startdate()","268451a2":"testFail_set_price_unauth()","26848a86":"setPicture(string)","26848b68":"checkCrowdsaleBalance()","26866160":"secondsBetweenReadings()","2687c645":"contributeInternal(address,uint256)","26881518":"setupFee(address)","2688454a":"U()","268855a4":"ParsecCrowdsale(address,address,address)","26887303":"TourCashStandardToken(uint256,string,uint8,string)","268959e5":"removeAdmin(address,address)","268a4559":"competitionStatus()","268b0459":"getRecordBalance(address)","268b5344":"PlanetOfOwner(address)","268b946c":"toUint8Throw()","268bb78e":"propose(address,bytes,uint256,uint256)","268bc65d":"signatureDropMultipleAmount(address[],uint256[])","268c969a":"emergencyDrawingReset()","268cb5f7":"queryCost(address[])","268d50fe":"ownerSetHouseEdge(uint256)","268da061":"CRFtoken()","268e7075":"toBytes2(bytes)","268ea7f6":"ReInvest(uint256)","268eb055":"setDescription(uint64,bytes)","268ef7e8":"holdAddress1()","268efdaf":"StdInt64(int64)","268f1153":"changeState(uint8)","268fe426":"dailyReset()","2690f0d5":"foundationLock()","269106e9":"dayCycle()","2692281d":"requestChangeBurnBounds(uint256,uint256)","2692de22":"sendAllFunds(address)","2693c150":"getPlayersTickets(address)","2693eca0":"devSFTDestination()","2693ed9b":"calcTokenSold(uint256)","2693ee80":"bonusPool()","269445db":"phase_6_rate()","26949220":"withdrawWonCosFromGame(uint256,uint256,uint256)","2694f6bb":"Log1_fnc(address,bytes32,uint256,string,string,uint256,bytes1,uint256,uint256)","26961b8c":"Token99chain(uint256,string,uint8,string)","26965dad":"deployStepOne()","269695fe":"groomVow()","269714dd":"maximumTarget()","269724ef":"assertEq6(bytes6,bytes6)","26976e3f":"upgradedAddress()","26987b60":"currentIndex()","269975d0":"GameDetails(uint256)","2699a7e7":"setPOOL_edit_31(string)","2699c808":"tradeOption(address[3],uint256[3],uint256[2],bool,uint256,bool)","269a7c3f":"buyAndTransfer(address,address)","269aacc8":"getDividendPayout(uint256,uint256,uint256)","269b0737":"DaoCasinoToken()","269c4bca":"viewFoundersTokens()","269c6ece":"lockedTwoHasEnd()","269cdaac":"withdrawLockedTokens()","269de5a0":"EpicExchange()","269e4f3c":"refundWei()","269eb58c":"setFeeFromPayer()","269ecc6d":"backersAddresses(uint256)","269ecf28":"submitBuyOrderWithPosition(bytes32,uint256,uint256,uint64,bool)","269f4663":"approveMintTokens(address,uint256)","269f96c9":"presaleSoldTokens()","269fe82e":"calcBurnAmountFromFeeBurner(uint256)","26a09392":"addSecondaryAddress(address,address)","26a1529e":"amountOfStakeReturnedOnCancellation(uint256)","26a18375":"setAvailability(bool)","26a21575":"tokenRaised()","26a26f71":"TgeTeamReleasingScheduleContract()","26a3bd4e":"subtractBalance(address,address,uint256)","26a3f45d":"initOwner1(address)","26a4861c":"CROWDFUNDING_PERIOD()","26a49e37":"price(uint256)","26a4c847":"maxLendingItem()","26a4e8d2":"setTokenAddress(address)","26a52019":"agentMakeOrder(address,address,uint256,uint256,address)","26a65c10":"createDigitalArtFee()","26a6dfed":"toogleTransfers()","26a7985a":"getMaximumCallGas()","26a82e8b":"autoPreSaleSuccess(address,uint256)","26a8d1e5":"_changeManagerImpl(address)","26a934f5":"minResalePercentage()","26a9408c":"returnTokensFromHoldBountyAddress(uint256)","26a9de53":"verifiedTransferFrom(address,address,uint256)","26aa101f":"isTokenRegistered(address)","26aa7c58":"addBuyer(address,uint256)","26ab378b":"addMood(string)","26abc9ab":"CmctSale(address)","26abfe09":"burnUndistributed()","26ad3abc":"startTimeStage3()","26ad7b40":"_doesEveryTokenHaveLockupPeriod()","26ad8d1b":"getPositionStartTimestamp(bytes32)","26ae27d6":"lonmemay()","26aeba91":"FarziTokenSale()","26aebfac":"delPack(uint8,uint128)","26afe980":"queryOracle()","26b238d8":"doom()","26b3293f":"deposit(address,uint256,bytes32)","26b387bb":"pendingReturns(address)","26b3a6f8":"SelfKeyToken(uint256)","26b41613":"processFunding(address,address,uint256,uint256)","26b45b09":"rateTier4()","26b4ce7f":"NP(uint256,string,string)","26b51c8c":"finalBlock()","26b52faf":"firstWithdrawAmount()","26b66cb7":"amendedEarlyPurchases()","26b6c0b4":"settingsSwitchTransferAccess()","26b7d803":"getTotalBuyCount()","26b7fe35":"GainStuff(address,uint32,uint256)","26b85ee1":"myAddress()","26b85f0d":"mininumContributeUSD()","26b916b4":"Set_Interest_Rate(uint256)","26b92a0e":"SomniumToken()","26b93939":"Jokercoin()","26b9ce13":"setTransfersEnabled(bool)","26ba1c19":"addBagAndGiftAtTime(uint256,address,uint256)","26ba2e47":"paidETH(address)","26ba4319":"setDirector(address)","26baca1c":"getStats2()","26bca0f8":"get_my_info()","26bceb59":"mul256(uint256,uint256)","26bd4d96":"adPriceMultiple()","26bd78b9":"LogEvent(uint256,address,bytes4,bytes,uint256,uint256)","26bdd20b":"getNominatedMediator()","26bdd814":"refundPresale()","26bf02cf":"getBaseLevelUpFee()","26bf2051":"KickCommitteeVoteEvent(address,address)","26bfcde0":"GMCToken()","26bfd35c":"rewardAD()","26c009cb":"privateIcoSold()","26c0ad3a":"allowRefunding(bool)","26c19eba":"readValue(bytes32,uint8)","26c1e750":"planets(uint256)","26c21722":"getwithdrawEtherToAddressValue()","26c2bcb4":"checkBenefit(address)","26c30b50":"BITS(uint256,string,uint8,string)","26c32ff5":"demi(uint256,string,string)","26c387fa":"testFail_mint_without_add_authority_to_controller(int256)","26c3d6f8":"get_deposit_term(address,uint256)","26c435a9":"totalUsdFunding()","26c43d8f":"hodlerTotalCount()","26c47909":"SXCToken()","26c4b863":"XIOToken()","26c4fa3d":"setOfficialGameUrl(string)","26c5c154":"employeeAddress()","26c6d361":"FanCoin()","26c7edaa":"flip4(bytes)","26c81320":"lastgamewinner()","26c93389":"removeFreezableAddress(address)","26c989df":"holdBalance()","26c9959f":"LoveToken()","26c9bc42":"setTokenInformation(string,string,uint256)","26c9e547":"bestow(bytes32,uint256,address)","26cb2257":"outRate()","26cb83b9":"setDescrutionContractAddress(address)","26cbb8ff":"inviterRegister()","26cbe6f5":"getHeroAvailableAt(uint256)","26cc2256":"blockRewardAmount()","26ccd77a":"withdrawStuckEther(address)","26ce3da0":"collectRefund()","26cee3a7":"getPlayerId(bytes32,bytes32,address)","26cf53b9":"BTL_PERSIAN()","26cf660d":"trustedOrderbook()","26cf9165":"pixelgrid()","26cfc76f":"TriPinCoin()","26d0d75a":"ResolutionProposals(uint256)","26d111f5":"note()","26d29ce0":"refundBid(uint256)","26d2b840":"addDadRelation(address)","26d2cba5":"updateMetaData(bytes32,bytes32,bytes32,uint256,bytes32,bytes32)","26d2eb11":"stopPostIcoAndBurn()","26d312f7":"sendWebGiftToken(address,uint256)","26d3325d":"getExpectedPayment(uint256)","26d3bde5":"execCUSEOption()","26d3df61":"deedsOf(address)","26d3e7e8":"inititalSupply()","26d3e889":"testCreateWithParentsForeign2()","26d3ed0a":"isSpentCustomerTxPaymentForMCW(address,bytes32)","26d541b0":"totalPlayerCount()","26d64f3b":"readTeam(bytes32)","26d6eca3":"retrieveReward(uint256)","26d7b3b4":"unRegister()","26d83db8":"LoveYToken(uint256,string,uint8,string)","26da8e17":"ownerUpdateCostToCallOraclize(uint256)","26db3c0a":"tokenIssue(address,uint256)","26db7648":"proposedVersion()","26dcbcfc":"catPaymentCollector()","26dd1510":"pixelblockPrice(uint24,uint24,uint24,uint24)","26dd860a":"mintUniqueTokenTo(address,uint256,string)","26ddaebc":"getPriceWithBonus()","26dec45e":"getUserUsername(address)","26defa73":"addAuthority(address)","26df61f6":"permittedContractsCount()","26dfb6b4":"advteamPool()","26dfe583":"partialDivest(uint256)","26e010c8":"minInitialMarginAmount()","26e137c2":"getInterfaceImplementationStatus(address,bytes4)","26e23485":"renamingCostsPerChar()","26e33670":"NewQuiz(string,bytes32)","26e41a3e":"airdropTokens(bytes32,address[],uint256)","26e43db5":"TransferSell(address,address,uint256,string)","26e501a8":"BitonlineStore()","26e56c05":"SaleCapReached()","26e5ab38":"changeMaxWithdraw(uint256)","26e5afdf":"Yinfiniti()","26e5b0be":"stopMulti()","26e6050d":"setParamsIco(bool)","26e6074b":"frozenBalance()","26e683fb":"NotitiaToken()","26e72d31":"resetCurrentRoundSales()","26e770e9":"Information()","26e77179":"PaymentRefunding(uint256,address,uint256,string)","26e80650":"upPlayerRound(address,uint256,uint256,uint256,uint256,uint256,uint256)","26e89689":"applyForCertifition(address,string,uint256,string,uint256,bool)","26e8cd23":"bobMakesEthDeposit(bytes32,address,bytes20,bytes20,uint64)","26e90775":"calculatePrize(uint256,uint256,uint256)","26e97fce":"allowMint(address,uint256)","26e9fd9e":"remove(bytes20)","26ea66bf":"Mortal(address)","26ea74e2":"approvedDividendsOf(address)","26ea7ab8":"changeadmin(address)","26ea9268":"FEE_SELECT_MAX_VALUE()","26eaee92":"devReward()","26ebc8af":"UserAuthorizedForToken(address,address,address)","26ebe0bf":"totalCentsGathered()","26eca77c":"HelloGoldRound1Point5()","26ed274e":"decreaseBurnApproval(address,uint256)","26ed794b":"mobilinkTeamAddress()","26eda1ac":"putMessage(string)","26ef8ba1":"putEth()","26f08aec":"setotherchainstotalsupply(uint256)","26f09042":"testThrowNoFreeTokens()","26f1069f":"approvePresale(address)","26f21080":"allowedToTransferOf(address)","26f2458a":"RequestP(bytes32,bytes32)","26f35ff2":"activenessUpgrade(uint256,uint256)","26f3ceaf":"TSToken()","26f4739e":"LogBuyTokens(address,uint256,uint256)","26f489f6":"_updateCardPerkText(uint256,string)","26f4b3de":"userTakeOrder(address,address,uint256,uint256,address)","26f590f6":"setAttribute(string,string,bytes)","26f59b8b":"ProICOHardcap()","26f6ec3b":"getCities(uint256[])","26f743d0":"createGuess(uint256,uint256,uint256,uint256)","26f78835":"XXXChain()","26f86791":"_indexOf(string,string,uint256)","26f8abf9":"getRankOnePlayer(address)","26fa9082":"Enumivo()","26faae42":"addChild(address,bytes32,bytes32)","26facdb1":"TeamTokenDistribution(address)","26fae0d3":"setMaster(address)","26faf1e9":"SVLightIndex()","26faf9c2":"EatMeCoin(address)","26fc4c7f":"returnTokens(address,uint256)","26fd8422":"calculateEggBuy(uint256,uint256)","26fdb484":"OwnershipRevoked(address,address)","26fe18e2":"setMintingOracle(address,address)","26fe2024":"newRate(string)","26fe7cf2":"createStar(uint8,uint16,string,string)","26fe9951":"delegatedFrom()","26feba74":"MaorTestCoin()","26fed988":"addCancelledOrFilled(bytes32,uint256)","26ffa189":"setEnableWhiteList(bool)","2700615c":"_getShipInfo(uint256)","27018631":"icoBonus()","2701d40f":"ForSale()","2701ebd8":"NDT3()","27028aae":"voteOnBounty(uint128,uint256,bool)","27029e83":"BurnToken(address)","2703506f":"CouponDeposit(address[2],uint256[8],uint8,bytes32[2],uint256)","2703e545":"projectInfoPublic(address)","2704355c":"setGenesisCallerAddress(address)","2704e8e9":"addRemovableIdArrayItem(address,uint256[],string,string,string,address)","2704ead4":"_isValidSkin(address,uint256,uint256)","27053417":"_updateSeed()","270537c0":"lockReserveTokens(address)","2705ce6a":"setAuditorDelegate(address)","27066ebb":"getOwnedTokensIds(address)","27071f6a":"_tokenOfOwnerByIndex(address,uint256)","270835d0":"allocateBid4a(bytes32)","2708a710":"MintHelper(address,address,address)","2708db73":"requestLeave(uint256,string)","270a3856":"startDist()","270a5420":"buyFST()","270a8ef7":"existingMarketOrder(uint256)","270abf36":"getChickenAmount()","270ba309":"getRegistryDataInitialized()","270bb8ad":"setImmigration(address)","270bfc07":"fundingAccount()","270cf206":"ENSReverseRegister(address,string)","270cfee1":"getTokenAccount()","270d13fb":"isCoinIdUnique(uint16)","270dc9fd":"changeName(string,uint256)","270e4cf0":"buyerAddressTransfer(uint256,address,address)","270ef385":"CLAIM_AMOUNT()","270f611f":"burnBalances()","270f7219":"getJntController()","270f9359":"Exploit(address)","270fdd1a":"GricCoin()","27120de9":"numberOfStarsReserved()","27121069":"verify(bytes,uint8,bytes,bytes)","27121b76":"claimDailyLoot(uint256)","2712d916":"setSanTTTCost(uint256)","27132be6":"getCustomBuyerMappingCount(address)","27136e46":"changeTransactionService(address)","2713a1b4":"getUserWithdrawnBalance(address)","27150f01":"devFeeSize()","27151526":"nextBid()","27158b7b":"MFToken()","271619fb":"CreateContract(int256,int256,uint256,uint256,int256,address,string,uint256,int256,string,uint256)","27164f15":"getBuyOrdersInfo()","2716783d":"distributeERG(address[],uint256,uint256)","2716baa6":"startContruibute()","271761c0":"EventSuccessfulTraining(uint64,uint64,uint64)","271781ad":"getRestSumStageICO()","2717cc7c":"ParticipatedInVoting(address,address,bytes32,uint256)","27180e42":"wantItMoreThanYou(uint256)","27187991":"setEtherPrice(uint256)","271a50db":"setAgonFight(address)","271af8c1":"tokenCollector()","271b3e8a":"snakemasterReq()","271b5311":"getValidateSignatureAddress(address,string,uint256,uint8,bytes32,bytes32)","271bac4a":"setBonusPhase(bool)","271c34d7":"denyProposal(uint256)","271cacbf":"batchAddToWhitelist(uint256,address[])","271cd760":"getPackageDb()","271d9090":"HenryToken()","271dd15b":"getWinNumberAddress(uint256,uint256)","271dec50":"Invested(uint256,address,uint256,uint256)","271df6e5":"canLotteryFree()","271f88b4":"setAmount(uint256)","271fe8be":"buyNormal(address)","2720e4f6":"LC()","27213345":"totalSupplyToken()","2721a114":"queryWinner(string)","2722692c":"lastBlockSet()","2722c043":"raiseEventIfMinted(address,uint256)","27234ecc":"takeBalance(address,address,uint256,address)","2723639b":"getPixelAreaColor(uint256,uint256,uint256,uint256)","2724312a":"Micropayment(address)","27243160":"bookmark(string)","2724e032":"manualEndDay()","27258b22":"isRegistered(bytes32)","2726403a":"testCanTrade(address,address)","2726a530":"getHodlHasBeenWithdrawn(uint256)","2726b506":"getDeposit(address,uint256)","2726f061":"commitVotes(address[],bytes32[],bytes32[],bytes32[])","27270550":"swapAble(bool)","27275a35":"SuretlyToken()","2727d018":"PlusPayLite()","272870ac":"pausable(bool)","27295d7c":"updateMaxPhase2(uint256)","2729f44e":"addTxToRegistry(bytes32,bytes32,uint256,uint256,uint256)","272a33e8":"allocateBid2(bytes32)","272a3e16":"PlayerWon(uint256)","272a847f":"HAICrowdsale(uint256,uint256,uint256,address,uint256,uint256)","272ae0b5":"MIMIMUM_CONTRIBUTION_AMOUNT_PREICO()","272caf69":"stakeContractAddress()","272cda88":"EternalDB()","272d20e7":"amount_direct()","272e20fa":"__abort__()","272edeac":"currentMineTokenAmount()","27301964":"withdrawDevTokens(address,uint256)","2730e4a2":"_arrangeMasternodeFlow()","273123b7":"delBot(address)","27315b5f":"Settlement(address,address,uint256,string,string)","27329380":"getRecentPlayersCount()","27329b05":"enableBot(address)","27332624":"_lottery(uint256,address,address)","27341c8a":"isEmpty(string)","2734242b":"BunnyToken()","273696cd":"SetImplementation(address,address)","2736a558":"removeBackdoor()","2736f6d9":"setTokenAndRate(uint256,uint256)","2737033f":"initialize(address,uint256,uint256,uint256,uint256,uint256,address,address)","27374015":"functionFive()","27378684":"price4()","27380c2c":"updateAngelCardSeries(uint8,uint64,uint64)","2738154e":"checkRokBounty()","2738bf4d":"addLeaderboard(string,string,uint256)","2738ed25":"Player_Bettings(uint256,uint256)","27393390":"setTokensMultiplier(uint256)","273a041c":"_self()","273a5729":"eligibleTokens()","273afe15":"ParisToken()","273b1dd3":"RealMadridvsLiverpool()","273b1fb3":"betbucketOne()","273b465b":"verifiedAgeOver(address,uint256)","273ba6bb":"ICO()","273bc3c9":"numberOfThrones()","273ca81c":"getMegaBalance()","273cb593":"isMasterOfCeremonyRemovedPending()","273cbaa0":"getTokenList()","273cc2a5":"depositOpen()","273dd51f":"_distributeHorse()","273e2c78":"F2UPay()","273ea3e3":"incrementNumber()","273f1de7":"paySellerFee(bytes32,address,uint256)","273f4940":"set(bytes32,uint256)","273f9ace":"getNumbers(bytes32[])","273f9bed":"signedTransferFromCheck(address,address,address,address,uint256,uint256,uint256,bytes,address)","273fd520":"EthlanceFeedback(address)","2740509d":"urbitTeamTokensVault()","2740e64b":"getInitializeParentPayoutDistributionHashValue()","27413437":"grantFounderToken()","2741876a":"totalPresses()","2742d511":"setWhitelistedStatus(address,address,uint256)","27436b59":"getCarCount()","274465b4":"payForMyself(uint128)","27457b3b":"getMyInventory()","27458664":"enableTokenMinting()","274748e6":"setInactivityReleasePeriodForToken(address,bool,uint256)","2748503f":"ChangedOwner(address,address)","27486a7c":"combineCards(uint256[])","2748d7e4":"claimPlotWithData(uint256,string,string,string,string)","2749bd81":"getTimestamp(address,uint256)","274a1f29":"setNextLotteryTTMTokenId4(uint64)","274a9b1c":"addressToEtherContributed(address)","274acb35":"add(uint96,uint96)","274b1615":"keyValidations(address)","274b3df4":"deposit_eth()","274b9bc5":"ETHx2()","274bc107":"test_threeValidEqBytes()","274c343a":"HTCCToken()","274c7922":"privilegedAddress(uint256)","274db4d6":"_price_tokn_PRE()","274ed288":"debtBalanceOf(address,bytes4)","274f97bb":"buyReply(uint256,uint256)","274faa9f":"minContributionUnits()","274fadf6":"updateServiceDescription(address,uint32,string)","274ff7ce":"burnFrom(uint256)","27506099":"getCountPlayersOfOwner(uint256,address)","27507458":"isLive(uint256)","2750fc78":"setIsActive(bool)","275103fd":"hault()","27521702":"mint(int256,address,uint256,bool)","2752808a":"CAPcoin()","27538e90":"getCapabilityRoles(address,bytes4)","2753d7f2":"artworksFactory()","2753f254":"workedTodayInSeconds()","2754ff69":"test_2_ensureProposalExecution_increaseBlocksBy100()","2755a13b":"forceClose(uint256)","2755cd2d":"tip()","275601f6":"getAllProviderParams(address)","27566b80":"transferCollectedEther(address)","275676cf":"ClassicVolkswagen()","27567c4c":"setIsPoop(string)","2756d38a":"IonChain()","27571087":"getBonus(bytes32,uint8)","2757a07c":"SSDDTT(uint256,string,string)","2757e976":"transferredIndex()","2758743c":"LATINOToken()","27589224":"minBuyingRequestInterval()","275893a9":"updateMaintenanceAddress(address)","27593eee":"ChangedName(address,string)","27597f0a":"costForProductCycles(uint256,uint256)","2759ea4a":"lookupSprite(uint256)","275a1334":"buySellPrices()","275a329a":"BCASToken(uint256,string,string)","275a92cf":"TokenPurchase(uint256,uint256,address,address,uint256,uint256)","275acbe3":"ln(uint256,uint256,uint256)","275b6eb0":"calculateSeedSell(uint256)","275babee":"getRareInfo(uint256)","275be02c":"MRBLToken()","275bf230":"addAddressToAccount(address,address)","275c82ca":"GasUsed(uint256)","275cb687":"setNextPoolPercentage(uint256)","275ccb13":"computeLeaf(uint256[],uint256)","275d60bc":"getReturnAddress(address)","275e2d3f":"st4ckCount()","275e2f86":"MORCoin(uint256,uint256,uint256,address)","275e5da5":"probe(address)","275f3d92":"view_readyTime(address,address)","27608c24":"unsoldToken()","2760c57e":"lastPing()","276184ae":"erc20Address()","2762484a":"SBIToken()","2762cf10":"contract_transfer(uint256)","2763d8fb":"FabCoin()","2765faae":"MaximalInvestmentTimeTresholdChanged(uint256)","276605bc":"updateFundingStartBlock(uint256)","27669781":"emitInfo(uint256,uint256,address,uint256,uint256)","27678dca":"getHWCAddressCount()","27687d34":"advisersTokenTimelock()","276927c5":"sellSpaceship(uint256,uint256)","2769b96b":"updateItemPrice(uint256,uint256)","2769c89a":"setGameStartTime(uint256)","276a28a3":"isTokenLocked(uint256)","276b94e1":"copypaste()","276bf637":"isTimedout(uint256,uint256,uint256)","276c9d0a":"balanceOfOld(address)","276cd2e8":"BTTPERETH()","276e3968":"bits(uint256,uint256,uint256)","276e6472":"deleteById(string)","276ebc6a":"ChargeTest()","2770a488":"transferWithIndex(address,uint256,uint256)","2771083f":"setSpreadPercent(uint256)","27729e93":"openLottery(uint8)","2772dffd":"votes(bytes8)","27731e77":"setCCH_edit_9(string)","27734225":"getCommitteesNumber()","2774d052":"mintPresell(address,string)","277576ca":"theTurn()","27757c49":"isVariation()","2776a859":"computeResponseSecondHalf(uint16)","2776b163":"setstoredaddress(address)","27773ba2":"addrAirDrop()","27782e42":"refreshActiveShareholdersArray()","27783050":"getEntryHash(address,uint256,bytes32)","27793f87":"outcome()","277942db":"marriageLicenceImageIPFShash()","27796092":"t4tToken()","2779ea96":"addPostOnBoard(address,address,address)","2779eb52":"setUserRank(address)","277a6889":"calculateInterest(uint32,uint256)","277ad1f6":"amountSellForOneEth()","277ad5d8":"secondRoundMayDiscount()","277ad6d4":"PreSaleResumed()","277b2db6":"getPlayerVaults()","277b6527":"targetCrowdsale()","277b8ffc":"getBeneficialAddress()","277ccada":"unlistTrophy(uint256)","277ccde2":"getHKGPrice()","277d4725":"getEthereumToken()","277e1b16":"changeMaxDonationLimit(uint256)","277e1de7":"transferAccessory(address,address,uint64)","277e268e":"testFail_set_label_unauth()","277ea83d":"getTrustPlatform()","277f6331":"ETVRToken()","277fc0e9":"getSignature(address)","277fc17d":"daysToSeconds(uint256)","277fef99":"transferPoint(uint32,int256,address,bool)","27806a16":"DoxCoin()","2780d22b":"getMigrateMarketInFromNiblingCalled()","27810b6e":"burner()","27815883":"_setHairValue6(uint256)","27816235":"onSaleEnded()","27816932":"AdaptableToken(uint256,uint256)","2781c3d1":"ownerSetdiceRollAddress(address)","2782ca8d":"MINIMUM_PURCHASE_IN_USD()","27836f77":"setImageData(uint256)","2784ad48":"computePayment(uint256,uint256)","2784d868":"getMiniPoolEdit_2()","2784e3f3":"refundVotingTokens(address,address)","27854452":"allocateAgents(address)","2785ed21":"LogCertificationDocumentAdded(address,bytes32)","2785fb98":"getContributionETH(address)","27860587":"TXToken()","27869c57":"gluon()","2787fac2":"LordCoinPreICO(address,address,uint256,uint256,uint256,uint256)","27880e1f":"KyberNetwork(address)","2788f4f3":"OraclizeCallback(bytes32,string)","2789192f":"isConfirmedSettingsRequest(uint256)","27895f13":"_advanceClock(bytes32,uint256)","27899ce2":"allowNewReceiver(address)","27899d9b":"LGOToken()","278a3684":"advisorAmount()","278a4c4f":"setMasterToReferral(address,address)","278a5e7c":"cancelScript(address)","278ab692":"startDispute(address)","278af72c":"isSaleClockAuctionStorage()","278b8c0e":"cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","278bb4a2":"EthealDeposit(address,address)","278bee92":"_receiveMakePlant(address,uint256,uint256)","278c284c":"CrowdsaleToken(string,string,uint256,uint8)","278c3030":"phase_2_Time()","278c688e":"getBackToken(uint256)","278cc714":"getUsablePlayerFibokens(address)","278d6e5b":"funcArrayInArguments(address[],address[])","278d818c":"setMaxRankingSpots(uint8)","278d9637":"limitTransfer()","278e07ce":"setStatus(address,uint8)","278e72da":"_destroy(uint256)","278e9d03":"testMemoryIntegrityCheck33Bytes()","278ecde1":"refund(uint256)","278f05ba":"SolomexCrowdSale()","278f2ab8":"deposit(bytes32,uint256,uint256)","278f49b9":"SetupRaffle(string,string)","278fcffa":"accountsLastClearTime(address)","278ffa13":"confirmTopUpLimit(uint256)","279029b3":"remainingARXSupply()","27904ee0":"getRabbitMotherSumm(uint32)","2791cb17":"setClientLastSupplyID(address,uint256)","2792949d":"BTC()","2792e765":"transferCroupier(address)","27939ea2":"issuerReservedMaximumPercentage()","2795348d":"KittenSelfDrop2()","279586f3":"AltBuy(address,uint256,string)","27960c5f":"validateEndowment(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","279616fe":"TransferDissolved(address,address,uint256)","27962fc1":"tokensAmount(uint256)","27970ea1":"updatePlayerRecommendFund(address,uint256,uint256)","27972584":"MintRestarted()","27972b99":"StarterToken()","27972e8f":"GRVToken()","27979b35":"genLevelExpGain()","2797e0c3":"getInitBlockNum()","27987533":"defaultResolverChanged(address,address)","2798cecd":"requestData(address,uint256,uint256,bytes32,address,bytes4,bytes32,bytes)","2798d1b2":"my_token_balance()","2799276d":"totalItems()","279a34f1":"switchSaleStage()","279a475f":"TJToken(uint256,string,uint8,string)","279aa01f":"getManualAddress(uint256)","279b4e76":"createAuction(uint256,uint256,uint64,uint256)","279b9562":"initIntervals()","279b9c7b":"HJToken()","279bad16":"fuel()","279c7425":"getTokensOwed(address,uint16)","279c94c0":"admin_add(address)","279cea35":"execScript(bytes,bytes,address[])","279ddc64":"SetBankerCandidate(uint8,address)","279e02a0":"getMemberDividendsAmount(address)","279e0912":"getDownloadPrice()","279e1c43":"_createCollectible(uint256,uint256)","279e79b5":"ZebiCoinCrowdsale(uint256,uint256,uint256,address,uint256,uint256)","279f5d31":"pop1()","279fdf6d":"trustedVault()","279fdf96":"setPresaleMarketAddress(address,address)","279fe967":"maxEthCapSellInFp()","27a030eb":"getRandomLotteryTicket()","27a06733":"setKycRequirement(address,bool)","27a099d8":"getOperators()","27a0d669":"getImplementation(string,string)","27a1a414":"allowedLocks(uint256)","27a1d948":"doubleDown(uint256)","27a1f35a":"setOpenStatusEgg(uint256,bool)","27a21061":"to_start_ico()","27a2aee2":"Commission()","27a3181d":"price2()","27a3fe41":"getMintLimit(address)","27a49cbe":"BankrollLending(address,address)","27a5428b":"setLevel(uint256)","27a5b3bc":"transitivePath(bytes32,bytes32,bytes32)","27a5c7c6":"voteDecline(uint256)","27a5e952":"testDecimalsUsingDeployedContract()","27a69644":"checkTransferDelegated(address,address,uint256,uint256,uint256,bytes)","27a6a7de":"newMinimalEthers(uint256)","27a75474":"salvageNotAllowedTokensSentToContract(address,address,uint256)","27a7b827":"updateExistingMember(address,uint256)","27a7c883":"transferWithExtra(address,uint256,bytes32,bytes32)","27a822df":"smart()","27a82833":"_supportsInterface(address,bytes4)","27a8890e":"withdrawedCoummunityCounter()","27a910dc":"ownerWithdrawETH()","27a936d7":"BlockchainBattleground()","27a93cce":"playerGetPendingTxByAddress(address,address)","27a9ec0f":"IDice()","27ab9f20":"botIndexToOwner(uint256)","27ac36c4":"reserveTokens()","27ac4b70":"getNamespace()","27ac7934":"transferPAIReceiptOwnership(address)","27ac9e5f":"periodNow()","27acfff9":"badgeFreeze(address,uint256,uint256)","27add9fb":"VoxelRepainted(uint8,uint8,uint8,uint8)","27ae587c":"MAX_TOKEN_REWARDS()","27ae949f":"buyFST0(address)","27aeafb7":"AuditorUnregistered(address)","27aedd10":"Founders()","27aeeaa8":"AxiePresaleExtended()","27af1d98":"disToken(address)","27af7d9c":"assertEqDecimal(uint256,uint256,uint256)","27af9e38":"space()","27b00b3e":"setUpdateState(bool)","27b022af":"MembershipChanged(address,bool)","27b075a7":"FlCToken()","27b0c674":"updateEtherBalance()","27b37367":"parseLoanOffering(address[9],uint256[7],uint32[4],bytes)","27b380f3":"withdrawalRequests(address)","27b3a83c":"buyAtIndex(uint256)","27b3bf11":"claimTime()","27b44a6c":"pendingWeiAmount()","27b4634e":"transmuteTransfer(address,uint256,address,string,string)","27b4e228":"setPoolFeeRate(uint256)","27b55475":"review(string,bool)","27b57aee":"emissionContractAddress()","27b5985b":"addToException(address)","27b5aaf8":"RESERVE_TOKEN_AMOUNT()","27b5db8a":"addPlayer()","27b752b8":"sha3HexAddress(address)","27b7a2f5":"nameRegistryAddress()","27b7cf85":"log(bytes32)","27b7d0a6":"EditDomain(string,string)","27b96df7":"pausePayment()","27b972f9":"getNameOwner(string)","27b9c257":"setRequestProcessed(uint256)","27bb020a":"altarCut()","27bb1db7":"SOPToken(string,string,uint256)","27bb2d82":"_checkPixelIdExists(uint256)","27bb3d0f":"eth_price()","27bb6d8e":"buyoutCost(uint256)","27bbea3a":"setWhiteListAddress(address)","27bc39c0":"submitCanonicalCandidate(bytes,bytes,bytes,bytes)","27bcc9ca":"finalizeConfig()","27bce91b":"betId()","27bd56d9":"sendAuctionQuery(uint256,uint256)","27be1b35":"promoCode()","27bf6568":"authorityBalance()","27bfeaf5":"setGemPrice(uint256)","27c16605":"getBidByProducerAndDay(address,uint32)","27c1f423":"preBuy1()","27c36a47":"specialAllowance(address,address)","27c39749":"test_oneValidEqBytesUint(int256)","27c42050":"buildIdentifier(address,address,address,bytes32,uint128,uint128,uint256,uint32,uint64,uint64,string)","27c4a208":"GSCoin()","27c4bde8":"Planethereum(address,address)","27c5cdea":"test2(address[5],uint256[5])","27c5e534":"mixDNK(uint256,uint256,uint256)","27c67440":"getWarranty(string,string,address)","27c6c720":"privateWallet()","27c725e1":"applyforCetification(string,string,string,string,string,string,bool)","27c78c42":"request(address)","27c7ff61":"noShares()","27c81eb8":"TestDRMK()","27c830a9":"emergencyPaused()","27c8dae5":"getAmountOfLinkerBuy(uint256)","27c96207":"WinnerAnnounced(uint8)","27c97fa5":"deauthorize(address)","27cadd13":"getSides(uint256,uint256)","27cc1fd8":"party_b()","27cca148":"lastClaimedBlock()","27ccdbc5":"setWalletContract(address)","27ccdd0a":"changeServiceReceiptAddress(uint32,address)","27cd0d96":"getLockedAmount_simus(address)","27cd933a":"RequestEvent(address,address,uint32)","27cda9d5":"AcceptsEtheropoly(address)","27cdab06":"fee(bytes32)","27ce5b8c":"getNumberOfOutcomes()","27ce6fa9":"unlockup(address)","27cef820":"hasForgivedChar(string)","27cfe856":"DAY()","27d120fe":"updateTransfer(uint64,uint256,bytes32,bytes32,bytes)","27d1913c":"buyerCancel(uint16,address,address)","27d1c3a6":"transferChamp(address,address,uint256)","27d1f39e":"mastery()","27d21602":"buildings_total()","27d23b86":"receive(address,uint256,bytes)","27d26d6e":"testCannotRedeployANT()","27d272c5":"getFirstBuyersFee()","27d3a8ad":"LogUpdatedComplianceProof(bytes32,bytes32)","27d42fc0":"setReservedWallet(address)","27d511ae":"activateCommunityFund()","27d51979":"getTokenTransferSetCount()","27d6ba21":"getDistributedToken()","27d6c032":"unregister(bytes)","27d6d6e0":"ownership(address)","27d6dfbf":"BITNT()","27d741df":"SALE_END_DATE()","27d7874c":"setCEO(address)","27d795d7":"start_date()","27d8455c":"setMainSaleStartAndEndTime(uint256,uint256)","27d87924":"registerNameXaddr(string,address)","27d8a9e5":"CofounditICO(uint256,uint256,address)","27d8fb97":"removeLaureato(string)","27d93a70":"addFighter(address,address)","27d94182":"MAX_PRIVATE()","27d95c8c":"getContaOuvidoria(uint256)","27d9ac67":"NewMarketMaker(address,string)","27da0078":"SpindleToken()","27da5ca5":"batlordReq()","27dad426":"init(address,string,string,uint8,uint256,bool,bool)","27db9e82":"reevaluateETHPrice(uint256)","27dba183":"getProcessablesSize()","27dba807":"buyWithBonus(address)","27dc297e":"__callback(bytes32,string)","27dd16e5":"paymentAction(bytes32,uint256[],uint256[])","27dd3873":"plantedTime()","27dd941e":"unlockDates(uint256)","27ddbb16":"mnyLeftInCurrent()","27de1a4d":"mintToAddressesAndAmounts(address[],uint256[])","27de1fc9":"fixPlayerCountryString(uint256,string)","27de2459":"HungerCoin()","27de2765":"Assert(bool)","27de9e32":"unbond(uint256)","27defa1f":"onlyAmbassadors()","27df664b":"minPrivateContribution()","27dffba6":"startRegularPhase()","27e056a5":"addMinter(int256,address)","27e07647":"setFundingFueled(uint256)","27e0feaf":"_allocateTokens()","27e10295":"storedProfit(address)","27e152bb":"maxCoinSides()","27e1f7df":"deleteAdmin(address)","27e235e3":"balances(address)","27e2dd48":"getRandomSeed(string)","27e44059":"VReetUp()","27e584d4":"TOTAL_PARSEC_CREDIT_SUPPLY()","27e65007":"min_investment_presale_eth()","27e728ec":"enableCodeExport(address)","27e72e41":"defaultDelay()","27e7c023":"sendTokensToFounders()","27e7e21e":"air()","27e7fe5a":"ONEPERCENT_TOKENS_PER_ETH()","27e8c2d8":"burnUnicornShares()","27e90a7e":"offerBorrowingItem(uint256,uint256,uint256)","27e95f87":"pubkeys2()","27e9a0b6":"files(bytes32,uint256)","27e9b1a0":"getArrLength()","27e9f294":"addItem(string)","27ea06b8":"numberOfTokensLeft()","27ea6f2b":"setLimit(uint256)","27eac914":"cancelAuction(uint32)","27eb95cf":"deathData_v13()","27ebcf0e":"sharesTokenAddress()","27ebe40a":"createAuction(uint256,uint256,uint256,uint256,address)","27ec2c03":"getAvgPps()","27ed31ff":"localityCode()","27ed810d":"setMaxBlockDrift(uint256)","27edf097":"burnPerTransaction()","27eea9cd":"CCCCCToken(address)","27eeefa6":"paymentOnTime(uint256)","27ef89bc":"DEV_TEAM_PORTION()","27ef986d":"ExternalToken(address)","27efc086":"TOTAL()","27f02f74":"core(uint256,uint256,uint256)","27f05e06":"distributeTokensPreIco(uint256)","27f06a6e":"permitChildContract(address[])","27f06fff":"requestFillUp(uint256)","27f12c8e":"registerAsImportingAuthority(address)","27f1bb7f":"prefixedHash2(address)","27f1f521":"Kurecoin()","27f2402b":"acceptSacrifice(uint256)","27f2db32":"finalizeChangeStaker()","27f397a9":"borrowerReturnFiatAmount()","27f39abf":"tokenOwnerWallet()","27f3a72a":"thisBalance()","27f3fb69":"setMachine(bytes32,bytes32,uint256,uint256,uint256,uint256)","27f498c9":"changeTokenSender(address)","27f4b056":"getDemocInfo(bytes32)","27f50a2d":"getDocuments(address)","27f576d1":"withdrawFromReserve(address,uint256)","27f69c37":"roundInvestorInfoByIndex(uint32,uint32,uint32)","27f6e676":"addApprovedGame(address)","27f7be99":"boosterContract()","27f85c13":"setUsdEth(uint256)","27f8ce38":"gamePause()","27f8d7ba":"setEndPreICO(uint256)","27f93e59":"createContractMeme(uint256,string)","27fa35c3":"getMarketsCount()","27fb1da7":"ICOState(bool)","27fbcac5":"getChannelFeed(address,uint256,uint256)","27fc2414":"follow(address,uint8)","27fde806":"erc20GST(uint8)","27fe0d10":"maximumWEI()","27fe75ed":"lockTokenLocker()","27ff1374":"TotalDeposited()","27ffb7b0":"purchaseRound()","28006b31":"makeLiquidPri()","28012606":"createAuction(uint256,uint256,uint256,uint256,address,uint256)","2801617e":"set(address)","2801e43a":"authorizedLoggers(address)","28026ace":"depositAndApprove(address,uint256)","2802cacc":"cancelOrderByAdminWithPayer(string,address)","280376b3":"CinderTokenSale()","2803d8e5":"MIN_TOKEN_UNIT()","28044357":"CollectibleIndex1()","280464ed":"fundsToTokens(uint256)","28046f30":"handleBlockBalanceLedger(address,uint256,uint256)","2804b2c0":"customer()","2807eece":"purchaseNo()","2808241e":"vote(uint8,bool)","28086f18":"bidETHMin()","2808c8ad":"thisContractBalance()","28090abb":"logSweep(address,address,address,uint256)","2809c5e1":"isBountyAllocated()","2809c7e1":"AuctionCancelled(uint256)","2809df16":"MetaUpdated(string,string)","280a3382":"fundariaTokenBuyAddress()","280af7d3":"setData(string,string,string)","280b8846":"Token(string,string,uint8)","280c2604":"SCADA_requires_hard_cap()","280ca666":"getAllElements()","280cd0e6":"getBetSizeAtRound(uint256)","280da6fa":"withdrawAllTokens()","280dd460":"adjustFeePercentage(uint256)","280e0359":"bonusLevel0()","280e682c":"mintImpl(address,uint256)","280f958e":"transferLockedFrom(address,address,uint256,uint256,uint256[])","281027b9":"isPrimaryOperator(address)","28102e54":"amountWon()","2810dd4a":"ParcelXToken(address[],uint256)","2810e1d6":"resolve()","28111984":"setIcoState(uint8)","281134bc":"noahToken()","2811d4e0":"sendSecondBatch(address[],uint256[])","2812988f":"object()","2812f8b8":"FutureCall(address,uint256,uint16,address,bytes4,bytes,uint256,uint256,uint256)","281318c8":"all_unfreeze()","281336b4":"terminateEmployee(address,uint32,uint32,uint32,uint8)","2813acc9":"indexAccount()","2813de17":"toggleTransferablePending()","28148d07":"setCategoryVerify(uint256)","2814a371":"createOfAthleteCard(string)","2814da3c":"transferDeposit(uint256)","28155727":"makerWithdrawEther()","2815741c":"Sort()","28159ef6":"removeIcoContract()","2815cc38":"discoverNewPlanet(uint256,uint256,bool)","2815f054":"setTCoinContractAddress(address,address)","2815f50f":"addManyToBlacklist(address[])","28169ec1":"testProvidedValues()","2816bd78":"incentiveForHolder()","28171882":"customText()","28180023":"closingBlock()","2819598d":"removeManyFromAllocationList(address[])","28195d2c":"GDO(uint256,string,string)","281972af":"getExplorerList()","28198eab":"RLCSentToBTC()","281a0ff7":"revokeDelegate(address,address,string,address)","281ae558":"ETH_TOKEN_EXCHANGE_RATIO()","281bdaf8":"weightedMultiplierByAddress(address)","281c08ad":"totalAuctorCount()","281ca73e":"write(uint256,uint64,bytes8)","281dfbb6":"sendPlatformSupplyToken(address)","281e1856":"deAuthorize(string)","281e399c":"Token(string,string,uint256)","281fa792":"givenBonus()","281fe829":"addFirstBuyers(address[],uint256[])","2820d6a5":"totalPresaleBonus()","2820f454":"setNewBeneficiary(address)","2821ca71":"nextPrice(uint256)","2822f62d":"fixedLoge(uint256)","282303b5":"_buy(uint256)","2823c24d":"howManyTokens(uint256)","2823e871":"canTransfer(bytes32,address,address,uint256,bytes,bytes)","2823fbe5":"walletLockBothForever(address)","28242dd4":"setLLV_edit_25(string)","282440ed":"allowWorking(uint32)","28249577":"getContractCode(address)","28250d43":"ETH_QCO()","28252bc4":"saleIsGoing()","28261850":"getProfits(bytes6)","28262dd1":"TOKEN_HODL_9M()","282651fe":"getWinTokenAmount()","28276ed6":"totalT8EXSold_GENERAL()","28278d0a":"makerich4(address,uint256)","2827d4ca":"TokenSale(uint256)","2828fc39":"getAllReporterMarketsCount()","2829104b":"ElectricUniverse()","28292af2":"chAirDropFadd(uint256)","282b065a":"setEmail(string)","282b5b19":"IsFreezedAccount(address)","282ba1b8":"GetPreSale()","282c3c47":"DEFAULT_MAX_LOCK_DURATION()","282c3cf7":"MAX_TOTAL_TOKEN_SUPPLY()","282c8749":"setParameters(uint256,uint256,uint256,uint256,uint256,uint256)","282d3fdf":"lock(address,uint256)","282d60bb":"eButton()","282de6b8":"priceCents()","282e0fe0":"updateIndexOrderToken(uint256,address,uint256,uint256,uint256)","282ef05c":"collectorsCount()","28310f10":"percentageRecipient1()","2831ed5a":"YOUQIANBI(uint256,string,string)","2832b5cc":"setInstantFee(bool)","2832e44b":"addPrediction(bytes32,uint256,uint256,uint256,uint8,uint256,address,address)","28331152":"getActives(uint256,address,address)","28334e64":"subTokens(bytes32,uint256)","2833747f":"test_oneTrueFalse()","28339175":"getCreateSharesOwner()","28339320":"deleteRegion(address[16],uint256)","283506fb":"buySqr(uint256)","283557ac":"getContributorTokens(address)","2835b45c":"getETH(uint256)","283654c3":"storjBalance()","28368e0f":"OppToken()","28376f05":"testCreateAuthority()","2837919d":"impl_mining_uncle(address,bytes,bytes,uint256)","283890ef":"checkGetFreeQuest(address)","28392315":"sellerCancel(uint16,address,address)","2839e928":"ackermann(uint256,uint256)","2839fc29":"exchanges(uint256)","283a4576":"Tomeka()","283a6e88":"mgmtBodyWalletAddress()","283acbfc":"enableRefund(address)","283b19bf":"addReward(uint256,uint256,address)","283b31a6":"addWorks(bytes32,bytes32,uint8,uint256,uint256)","283b5f95":"getUndistributedBalanceOf_(address,uint256)","283ba681":"transferAirdropTokens(address[],uint256[])","283bcbed":"ChannelToppedUp(address,address,uint32,uint192)","283ced9d":"FOUNDATION_CAPPED_VALUE()","283ceee2":"cryptaurToken()","283dc942":"ReferralWeToken(address,uint256)","283f7820":"_totalFee()","2840f290":"addTier1Member(address)","284131c7":"buyApple()","284180fc":"getSecret(address)","284237e4":"bitm(uint256,string,uint8,string)","28428a42":"importBalances(uint256,address)","2843314e":"getAccountList()","28439961":"setTimePeriods(uint256,uint256,uint256,uint256)","2844328f":"submitVote(uint256)","28444381":"setPeriods(uint256,uint256,uint256,uint256,uint256,uint256)","28450159":"_updateSnapshot(address)","28459871":"OreOreCoin(uint256,string,string,uint8)","2845c8cd":"totalPreSaleStage()","28469c36":"littafiAccount()","2846a35b":"mainSaleEndTime()","28470b40":"_axiesPrice(uint8,uint256)","28472c6c":"claimComputation(bytes,bytes)","2847a7af":"newDocument(bytes32)","28491003":"getAllTurnover()","28491b3f":"SetPresaleAmountLimits(uint256,uint256)","284b1e8e":"generatedByte()","284cb916":"endMintingTime()","284cfedb":"m_proofs()","284d2fd4":"mintVested(uint256,address,uint256)","284d94e1":"lockAssetEscrow(bytes32,uint256,address)","284e1567":"addrFWD()","284e4175":"changeGBTAddress(address)","284e650a":"vanbexTeamVestingPeriod()","284f083a":"processJackpot(address,bytes32,uint256)","284fb363":"deploy(uint256,uint32,uint256)","284fd42f":"gasEpoch()","2850c72a":"debug_extendCoinbaseTxOutput(uint256,uint256)","2850d4e6":"KNOWToken()","285109d1":"getTotalInfo()","285137c9":"registerNameXaddrFromDapp(address,bytes32,bool)","2851f27b":"PrizePaid(string,uint256)","2852b71c":"accept()","2852bdf2":"whitelist(uint8[],address[])","2852ca81":"getTypeFromEdition(bytes16)","2853a0d7":"BRXToken()","2853f925":"unfreezeFoundingTeamBalance()","28543417":"removeOrderOfOwner(address,uint256)","2854ba7d":"getCreatedPayoutDistributionHash()","2854bc7e":"setTokenCap(uint256)","285669e9":"setRegionNextImageId(uint256,uint256)","28579137":"remove(uint80)","2857bc60":"triggerStealManually3(string,uint256)","28583dcc":"getRoundCounter()","2858507f":"IDD()","2858c764":"checkStatus(uint256)","285a4639":"Rotterdam()","285a9b32":"payoutfordividend(address,uint256)","285b5dde":"MoreTokensMinted(uint256,string)","285bf4c7":"CryptoCopyToken()","285c22b1":"addOrigin(bytes32)","285c51c3":"getRemainingEthersForCurrentRound()","285c7f37":"addUpgrade(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","285d70d4":"setMintable(bool)","285da5a9":"ceilTokens(uint256)","285dfc1c":"AmigoCoin()","285e1406":"changeFeeAddress(address)","285e8516":"advisor2Sum()","285f2346":"getNotApprovedProposals()","285f6a55":"ADDR_BOUNTY_TOKENS_ACCOUNT()","285fc97f":"TestChain()","285fe426":"bet(uint256[],uint256[])","286012b0":"getDealCancelRate()","286294b3":"buyByTomo(address,uint256)","286362f8":"AllowTransferExternal()","28636578":"setMultiRequestRequestor(uint256,address)","2863cd7e":"batchMintWithData(address[],uint256[],bytes)","2863f9f3":"emergencyStopSale()","286401df":"is_claim_period(uint256)","28640599":"fetchCreatedOrdersForMerchant()","2864ddde":"nextPriceOfElement(uint256)","28657aa5":"bankBalance()","2865dc2e":"getUserRewardPayouts(address)","2866bae1":"HarryCoin()","286707a1":"genToExtraStats(uint256,uint256)","28675325":"PURCHASER_MIN_TOKEN_CAP()","2867586e":"setInvContract(address)","286781c7":"suspend(address)","2867bc92":"refreshGames()","28680c1e":"bonusUnlockAt()","28687e61":"checkPriceCalled()","2868eda3":"admin_withdraw(uint256,uint256)","286a8993":"_clearBridgeNativeFee(uint256)","286b583b":"offerCanvasForSale(uint32,uint256)","286c1a9b":"confirmJoinAirdropQuest(address)","286c241a":"releaseTimeOf(address)","286d2e3a":"setContractAddr(address)","286dd3f5":"removeAddressFromWhitelist(address)","286dd83c":"unPauseCrowdsale()","286eab15":"getSnailmasterReq()","286ec4d1":"erc20_contract()","28707f3d":"addCharacter(uint32,uint16)","28713d0c":"SunContractToken(address)","2871587d":"MAX_PAYOUT_FRAC_BOT()","2871b1b9":"setRate1666()","2871f2c0":"getMySquirrel()","28720849":"verifyReport(uint16,int8[],uint32[])","2872a8e7":"kkk()","287301c1":"COMMUNITY_PERCENTAGE()","287418e7":"query(uint256,uint16)","28753dc2":"ApprovedFunds(address,bool)","28761ea5":"calcDividend()","28762e3a":"rdDoisToken()","28764b44":"rnBlock()","2877af10":"STARToken()","2877c748":"claimVotingProposal()","2878d3a7":"getClue3()","287977d6":"updateScore(uint8,bytes32,uint24)","287ad39f":"upgradePrice()","287ad3e5":"endPeTime()","287b020b":"founderMembers()","287b7cc1":"setStageLimit(uint256)","287b8862":"s35(bytes1)","287b895c":"MAX_OBR_CAP()","287bd206":"MAX_ALLOCATIONS_COUNT()","287cc96b":"getTotalEthBalance()","287dd8d2":"HIcToken(uint256,string,string)","287e85e9":"getTimeoutBlock(bytes32)","287e9fbc":"setGameIdCntr(uint256)","287eda92":"setIntervalSize(uint256)","287efb57":"setMixFormulaAddress(address)","287fcbfc":"PEPEso()","28802f19":"stare(uint256,uint256)","28805407":"refundToken(bytes32,address,address,uint256)","2880ebe7":"underdogPayoutMarkup()","28811f59":"F()","288169fd":"_changeAddress(address)","28828b1e":"claimMultipleAndWithdrawBalance(bytes32[],uint256[],bytes32[],address[],uint256[],bytes32[])","2882ab48":"BurnGas()","28831187":"setCompanyWallet(address)","288343e4":"Start(address,uint256,uint256,uint256,uint256,uint256)","288365a7":"foundation_vesting_contract()","2884c115":"_finishICO()","28852b61":"allOfferingPercentage()","2885b593":"extractMasterKeyIndexLength()","28861d22":"market(uint256)","2886b47a":"PERC_TOKENS_TO_RELEASE()","2886d76f":"setColorTeal()","288714be":"getPreviousWinner()","2887318f":"RATE_ETH_WXW()","2887cecd":"QYTestingToken()","288811cb":"grantAdvisorToken()","28889862":"setRandomPlayerAddress(address,address)","2888c701":"setClearingPrice(bytes32,uint256)","2888f9d0":"updateMaxBet()","28896066":"transfer_owner(address)","2889e822":"team3Address()","288a6535":"_getPurity(uint16,uint16)","288aa69b":"VirusGame()","288b7ad8":"homeMaxPerTx()","288bcfb5":"getIntegerVaule()","288bd8fd":"mintReserveTokens(uint256)","288c4602":"WRTCCToken(address,uint256)","288c6ed2":"getSeedCost(uint256)","288cdc91":"filled(bytes32)","288dca30":"softCapFundingGoalInCents()","288dd331":"getTotalBidded()","288ddec7":"reversePercent(uint256,uint256)","288fa739":"isValidVote(uint256,address)","2890e0d7":"burnNFT(uint256)","289120cf":"goToNextState()","28916184":"createProduct(string,bool,uint256,address)","28918296":"verifyBBODocument(bytes32,bytes)","28919b47":"best_gamer()","2891da02":"tokensCounter()","28929072":"setMaxAssignedRequests(uint256)","28931484":"SmartLinkToken(uint256,string,string)","2893c5b0":"mint(address,uint64)","289471d5":"getOnTokenTransferFromValue()","2894ceda":"publisherRegistry()","28962b94":"DS1Token()","28968872":"minusFreezingTime(uint256)","289768b7":"_checkForJoin(uint256,address,uint256)","2897768d":"grantJoinAddr(uint256)","289799b7":"setUnitTime(uint256)","2898410b":"totalMintedToken()","28985c17":"returnsTwoUnnamed(uint256,uint256)","289912cc":"CLXTokenSale(address,address)","28997e32":"token(uint256,string,string)","2899a870":"claimAllInvestorTokensByOwner(address)","289aac50":"teamWithdrawSupply()","289ae4c7":"AddressWhitelist(address)","289b3aab":"Arith()","289b45fb":"subtractAction(bytes32,uint256[])","289b5b15":"setTypeName(uint32,string)","289cb681":"testSetPresale()","289cd94f":"setWhere(address)","289cf1e2":"PRESOLD_TOKENS()","289de615":"getTokenDetail()","289e0f82":"STAGE_1_START()","289ea30b":"requireNotZero(uint256)","289fd839":"presaleBonusTier3()","28a006af":"ethBalance(address,address)","28a07025":"liquidate()","28a1cab8":"setVicepresidenteDeMesa(bytes32,uint256,uint256,uint256,bytes32)","28a20a2f":"transferXPAAssetAndProfit(address[],uint256)","28a24f30":"set_base_token_as_seeded()","28a3dd2c":"_redeem(uint256)","28a42e9d":"getUpgradeInfo(uint256)","28a45038":"testTryProxyCall()","28a49874":"regPrice()","28a52d3e":"maxHistoryRecordID()","28a5be59":"getExchangeRateAtTime(uint256)","28a5c5e9":"address_to_tokens_prev_week0(address)","28a5e6f0":"regularOpen()","28a741db":"publicityFunds()","28a76045":"setAsMinter(address,bool)","28a767b0":"ClaimAirdropMultiple(address[],uint256)","28a7f25d":"transferJokerOwnership(address)","28a852db":"SOFTCAP_LIMIT()","28a8ee68":"minimumTakerProtocolFee()","28a92ef7":"requestRemoveAdmin(address,string)","28aa1a22":"IlumXXToken()","28aa48b4":"heroTypeToHeroSales(uint16)","28aa5257":"updateTransfer(bytes)","28aa69cf":"end_race()","28ab4f76":"changeSupply(uint256,bool)","28ab7375":"p_update_tokensRewardsAvailable(uint256)","28abda51":"resetUrls(bool,bool)","28acb002":"collectFees(uint128)","28acb520":"IdentityManager(uint256,uint256,uint256)","28ae8ea3":"redeem(uint256,bytes32,bytes)","28aea735":"getCreatedDate()","28af792c":"fundBTC(address,uint256)","28af94c8":"addData(bytes32)","28b070e0":"contractIndex()","28b0e795":"advance(bytes32,uint32,uint64,uint64,int64,uint64)","28b1b051":"external_call(address,uint256)","28b2105c":"endCrowdfund()","28b2362f":"custodianRegistry()","28b2e781":"minprice()","28b34ef6":"updateLandData(uint256,uint256,string)","28b3f3ae":"getBetAmount(uint8)","28b44b4b":"getBalanceOfContract(address)","28b4e62a":"numTokenPerEth()","28b53247":"_burnCarbonDollar(address,address,uint256)","28b59782":"Initiate(address,uint256)","28b5a8e6":"fechPreAllForCandidate()","28b5dde8":"setPI_edit_9(string)","28b5e965":"artDescription()","28b60031":"ownerTokens(address,uint256)","28b6c658":"maxAgonCount()","28b7bede":"getTokenContract()","28b7e183":"enableAffiliate()","28b8b108":"withdrawStoreBalance()","28b8e9cf":"buy_the_tokens()","28b94289":"isPreICOPrivateClosed()","28ba671f":"_getBonusTokens(uint256)","28baf31d":"EscrowVault(address,address)","28bb6f24":"webGiftTotalAmount()","28bc5dcc":"promotionIndexToHost(uint256)","28bc5ee4":"beginVote()","28bc8a04":"airdropSpent()","28bcd985":"PRIVATE_PHASE()","28bdbdca":"productionUnitIdRange()","28be67f9":"get_amount_get_sell(uint256)","28bf2448":"availableForWithdrawalAt(uint256)","28bf4079":"initStage(uint256,uint256)","28bf794d":"set_price(uint256)","28bfdeee":"distributeInsurance()","28c05d32":"shortSell(uint8,uint256,uint256)","28c0898b":"ZAR_Omnidollar()","28c0b0ef":"_partialPaid(address)","28c11fd6":"SetIPR(string,string,address,string,string,uint256,string,string,string)","28c23a45":"renounceOwner()","28c32be6":"refundPeriodStart()","28c3d685":"logPlaying(address)","28c4b676":"maxPaysPer()","28c4e24c":"retrieve(address,address,uint256)","28c5cf0a":"finalizeContract()","28c69eb2":"hasStake(address,address)","28c6cd05":"minBuyTokens()","28c6d8e3":"preBuyersDispensedTo()","28c743e6":"WelfareTokenFund()","28c78227":"openBoxPlayer(uint256,uint256)","28c8b217":"approveProject(address,uint256)","28c8ed98":"disableAutoDividends()","28c8f3ba":"airDropManager()","28c9ca90":"ethereumWei()","28c9f19a":"exchangeAndPay(uint256[10],address[5],uint256[4],bytes32[4])","28ca3062":"testCannotSetPresaleTokensAfterActivation()","28ca5a1c":"InvestmentEvent(address,uint256,uint256)","28cab0d6":"TokenBought(address,uint256,uint256)","28cbe9ac":"useKnowledge(address)","28cc413a":"getProof(uint256,uint256,uint256)","28cc4150":"tokenSaleRate()","28ccffe7":"etherFromAltar()","28ce213e":"setBalanceOf(uint256)","28ce5cdb":"withdrawMinerFee()","28ce8845":"addToTotalSupply(uint256)","28cf8b6f":"ERC223Token()","28cffcd8":"YFT()","28d005e9":"firstTTaxAmount()","28d08142":"getCurrentHighscoreUser()","28d0d223":"withdraw_amount()","28d18745":"getMiningAuthority()","28d2a961":"chkBSize(uint256,uint256)","28d3ad3f":"getPot(uint256)","28d3e3e1":"min_goal_amount()","28d42350":"endIco1()","28d445f6":"_afind(address)","28d4cc24":"window2TokenCreationCap()","28d5e117":"numberOfPossibleChoices()","28d6ce3d":"startSale(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","28d76403":"dataForSell(address,uint256)","28d84c9b":"delAltOracle(address)","28d879e4":"depositEtherBalance()","28d8f102":"ABOX()","28d905e5":"getAssetIdTripCompletedTime(uint256)","28d90b63":"ChangeFee(uint8)","28d936fe":"numImages()","28d969a5":"resetIndex()","28d969e2":"initialARXtokenSupply()","28d9dcd4":"createErc20Token(string,string,uint256)","28da6ba3":"PreSaleComplete(address)","28da740f":"firstTimeLine()","28da75fa":"addAddressToCaller(address)","28da850b":"buyAllOutcomes(uint256)","28db5470":"getPrivateName()","28db90a4":"BadgeCoin()","28dc38e6":"calculateWithdrow()","28dcfdac":"getSignsCount(uint256)","28de15b2":"MajorityList()","28de4426":"setLockupPeriodSeconds(uint256)","28de78d0":"WandtChaintest(uint256,string,uint8,string)","28dee1d2":"transferEtherOut(address,uint256)","28df192d":"releaseSbtToken()","28df3707":"HawkToken(uint256,uint256)","28df7755":"TravellingFreeToken(uint256,string,uint8,string)","28e07244":"getTurn()","28e08186":"ownerAllocateTokens(address,uint256,uint256)","28e0b502":"getDrawStatus(uint256)","28e0ba9a":"affsend(uint256,uint256,uint256,uint256,uint256)","28e158d0":"TokenVestingContract(address,address,uint256,uint256,uint256,uint256,bool)","28e1a604":"BurnFrom(address,uint256)","28e36ab8":"_getPrice(uint256,uint256)","28e3844c":"Member_AssignTokensToProject(int256,int256)","28e3c4f8":"checkLock(address,address)","28e454ee":"setDusting()","28e47076":"testFailCreateWithParentsParentSameItemId0()","28e53bb2":"approveKYCAndDeposit(string,address,uint256,uint256,string)","28e5617e":"weeklength()","28e5e5d3":"snowflakeCall(address,string,address,uint256,bytes,bytes)","28e665ef":"releaseTokenForTransfer()","28e68ebe":"getLastFundId()","28e69b16":"setBalances(address,uint256)","28e70c4e":"getPosition(uint256,uint256,address)","28e8776e":"getAyantDroitEconomique_Compte_9()","28e8bc61":"endTokensale()","28e8ed1b":"resetCrowdSaleaddress(address,address)","28e96cb0":"setDefaultAllowedLock(uint256)","28e9bff8":"presaleAllocations()","28ea0fc3":"transferCollectorship(address)","28ea6aab":"addToBlackList(string,address)","28ea9203":"___setTarget(address)","28eaa326":"_noThrowCall(address,bytes)","28ec4173":"UnicornCrowdsale(address,address,address,address)","28ecb74e":"Grow()","28ed5c0d":"MCC()","28ef26cc":"JEXToken()","28ef42ce":"preICOSwapRate()","28ef6f40":"openCrowdsale()","28efa3a6":"processRebond(address,uint256)","28effe67":"gasForPBTT()","28f03554":"ProcessDividend()","28f0d47b":"ticketTransfersAmount()","28f22cc1":"getRemovedServicesForApplication(address)","28f28529":"fstUnitPriceNumerator()","28f2d4da":"identifiers(uint256)","28f3402b":"changeRuningState(bool)","28f371aa":"isApproved()","28f3ebd6":"BitPrize()","28f4c7de":"getMaximumReportingFeeDivisor()","28f4dbb6":"thresholdAmount()","28f5c7b3":"totalETHRaised()","28f66b77":"getAllHead()","28f68d39":"getVestingPeriodsCompleted(uint256,uint256)","28f6a48a":"getBidCount()","28f7f13b":"Acandy(uint256,string,uint8,string)","28f833b7":"depositAddress()","28f90e4b":"Etheramid2()","28f9a563":"maxPreCrowdAllocationPerInvestor()","28fa17b6":"estateData(uint256)","28fb29d7":"_transferEvent(address,address,uint256)","28fbd958":"registerContract(bytes32,address,address,bytes20,bytes32)","28fbf28a":"revealPeriodActive(bytes32)","28fce8c8":"ZEUSCoin()","28fd72e2":"updateRndSeed()","28fdcdf7":"safeMemoryCleaner()","28fe549a":"STATE_BET_ENABLED()","28fe9a7f":"founder1Address()","28fecd48":"reinstate()","28ff498a":"presaleTokenLimit()","28ffe6c8":"join(address)","28fff8d6":"NokuConsumptionPlan(address,address)","2902320a":"totalTokensToSend()","2902b093":"addnewOwner(address)","2902df61":"remove_helper(uint256)","29033133":"clearValueBonuses()","290382dd":"DFCToken()","29055edd":"createNew(uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,address,address)","2905be9a":"IronHands(uint256,address)","29062d76":"startGame(address[],uint256)","29079291":"RVRCoin()","2907eb16":"finalizeContract(uint256)","290842a1":"setPI_edit_1(string)","2908fb5a":"Y1_release()","29090202":"Resolver(address)","29092d0e":"remove(address)","2909acef":"isSpawnProxy(uint32,int256,address)","2909cc5d":"left16(uint256)","2909f638":"setData(uint256,uint256,uint256)","290a9fa0":"setRangeGameAttr(uint256,uint256,uint256)","290b1e5f":"initTokenBank()","290b7dfd":"getTransactionLength(bytes32)","290c292d":"preMint(address,uint256)","290c398f":"getChipIds(bool)","290c8eb1":"doMint(int256,address,uint256)","290cb460":"MitkeyCoin()","290cba7f":"getLen(string)","290cf4fb":"payBonusToAddress(address)","290d2494":"startBuffer()","290d256e":"ExchangeLinkToken()","290e1c20":"AutoFare(uint16,uint16)","290ed1be":"RESERVED_MARKETING_GROUP()","290fe2df":"getEscrowAddress(uint256)","29107555":"soldByChannels()","29108d1b":"transferReserveToMain()","2910a32b":"setTokenBuyRate(uint256)","2910f159":"LogBidMade(address,uint256,uint256)","29113bc8":"hotWallet()","29114d65":"winnerPoolTotal()","291194b2":"NOT_AUDITED()","2911982e":"balanceOfPlayer(address)","2911c9e7":"dashId()","29143bdd":"onwerfee()","29147530":"setValidKYC(address)","29148c0c":"changeOwnerBook(uint256,address)","2914fb3e":"porcodr(uint256)","29153250":"withdrawalList(uint256[],address)","2915a915":"determineNumber()","2915fd3d":"subToZero(uint256,uint256)","29161820":"Base(uint256)","29163502":"addWhitelistedTransfer(address[])","291675f2":"add_another_owner(address)","291681b5":"signupUserWhitelist(address[])","2916f075":"check_invalidator(uint256)","2917f162":"getCooldownIndex(uint40)","2917f66b":"distributeAllTokens()","2918435f":"fun_sandbox(address)","29189c9e":"ATTToken()","291948ff":"date_ico_end()","29194964":"setUsdCap(uint256)","2919fccd":"Gaoguans(address)","291bc657":"Predecessor()","291bd15c":"confirm(string,int256)","291c0dbb":"setEtheremonAddress(address)","291cef95":"startSlammerTime(address,uint256[5],address,uint256[5])","291d1185":"updateCurrentBonusPeriod()","291d4f98":"transfered_total()","291d778c":"CancelSellOrder(bytes32,address,uint256,address)","291e6777":"sendVote(uint256,uint256)","291ea526":"constructionEnd()","291f028d":"calculateRoom(uint256,uint256,uint256,bytes32)","291f3665":"balanceOfFund(address)","291f37a4":"CHESSToken()","291f5a1f":"ORIGINAL_IPFS_HASH()","291fce73":"TmoneyTest2()","291fd18f":"issueCertificate(string,string,uint256)","292005a2":"TOKEN_SUPPLY_LIMIT()","29213a2f":"approveMember(address)","2921441e":"mysteriumPricing()","29216d20":"setLockTime()","2921be51":"ALLOC_SALE_GENERAL_1()","2921e6fc":"IfModuleRegist(string,string)","29223bdb":"changeServiceUpdateAddress(uint32,address)","2923f101":"Set_eth_gift(bytes32)","2924416f":"validateAndGetRedeemFee(address,address,uint256)","29245dd1":"startCall(uint256)","2924e254":"getInterestTimestamp(uint256)","2924f0dc":"_lockProjectToken()","2925827c":"preallocated()","2925ffc2":"modifyCommunityTaxes(uint256,uint256,uint256,uint256)","2926050f":"pubEnd()","29263630":"initialiseContract(address,uint256,uint256,uint256)","29274fe1":"buyBOTx(uint256,string,string,address,uint256)","2928859c":"runsOutOfGas()","29291054":"setContract(address,address,address)","2929abe6":"distribute(address[],uint256[])","2929dc09":"WithdrawAllReserves()","292a2879":"setFundAccount(address,address)","292a7409":"processBuyCard(uint256,address)","292a9873":"attackTileForNewUser(uint16,bytes32,bytes,bytes32,bytes32,address)","292b79b9":"HashReleased(bytes32,uint256)","292c8aaa":"getPayOutAmount()","292ca2fe":"Jeopardy()","292cbbba":"DAYSECONDS()","292cdfa5":"getForthRoundReleaseTime()","292d64e0":"transferHotel(address,address)","292d98cd":"allSet()","292eb75d":"openAccount()","292f4a6e":"Token(address,address)","292fec04":"isClaimable(address)","2930cf24":"red()","2930fa49":"PLATFORM_FEE_RATE()","293100a9":"meleeElementBySubtypeIndex(uint256)","293100c1":"tournamentsReserve()","2931ebb3":"AdminshipTransferred(address,address)","29322e05":"sendTokens(uint256,address)","293230b8":"startTrading()","29325ebd":"zeroUInt()","2932ea90":"creatUserPurchase(string,string)","29337bda":"personalisationCost()","2933cc47":"getIdeaDate(uint256)","2933ee88":"get_account_id(address)","293528c9":"GOL()","2936981c":"setNumRewardsUsedForAddress(uint256,address)","2936c27a":"getFoundersTokens()","2936ce62":"crowdSaleOngoing()","2936d35c":"millLeconteRate()","29372ad0":"getWarrior(uint256)","29372d21":"testLog()","29377d61":"receiveFunds(uint8)","293849f4":"addLimitation(uint256)","293877d7":"bthFundDeposit()","29388f8d":"setArbitration(address)","29390370":"setPricer(address)","293a9169":"getSpawnCount(uint32)","293b1103":"Bitlike()","293b682f":"fSub(uint256,uint256)","293be456":"setReward(uint256)","293c2958":"getRoundState()","293c29de":"swapHotCold()","293c33b5":"authorizedFundsAvailable()","293c6a3a":"mint(bytes32,address)","293d5050":"getPlayerNum()","293d7663":"refundErrCombat(uint256)","293ee91f":"_fillOrder(uint64,uint64)","293f2ad7":"teamTokensIssueDate()","293f3fa9":"setBatman(address)","293f4825":"fire(uint64,address[])","293f5e6a":"get_first_user_recast(bytes32)","293f9a9c":"showDemurrageConfigs()","293f9f4f":"recordBounty(address,uint128,uint256)","293ffca3":"AddressReg()","2940ff1e":"cancelBet(bytes32)","29415664":"buy_part_amount_show(bytes32,uint256)","294247aa":"BlackjackTipJar()","29432e0d":"setaddressname(string)","29434e33":"insertUser(address,bytes32,uint256)","29435cde":"TadamWhitelistPublicSale()","2943fd5e":"TokensIssuedCrowd(address,uint256,uint256)","29441674":"DOW_SUN()","2944363f":"updateAllDependencies()","2944e740":"changeProfitContainerAddress(address)","29457483":"register(uint256[2],uint256[4],uint256[2])","2945a57d":"findClaim(uint32,string,string)","2946ae5d":"changePauseTranfser(bool)","294914a4":"j2Timeout()","294919a1":"rate(address,uint256,uint256,bytes)","2949b11d":"mutiSendETHWithDifferentValue(address[],uint256[])","294a6511":"checkRefundExistanceByOwner(address)","294afbf2":"sendBigPromoBonus()","294bbc09":"ggcd(address)","294cd2e8":"BACA()","294cdf0d":"tokenOfOwner(address)","294cedb8":"resolveOffer(uint256,bool,bool)","294cf912":"getBoosterPrice(uint256)","294e47e3":"FlipToken()","294f3d4d":"setUpLimit(uint256)","294f4025":"pendingWhitelistRemoval()","294fa425":"MIN_BUYIN_VALUE()","29501ad6":"changeManagerAddress(address,address)","29516a47":"PoWMLottery()","29516ba7":"purchasedTokensRaisedDuringPresale()","29516c41":"betMatch(uint8,uint8)","29519c9c":"LAFINAL7()","2952438e":"transfer(string,address,address,uint256)","295310bf":"setTransferRate(address[],int16)","2953a286":"setGenesisToken(address)","2953ee6f":"InvalidPullRequest(uint256)","2953f198":"addEntity(string)","29546713":"claimableHalvings()","2955d4ce":"setRealisation(uint256)","29560980":"getCapital(uint256)","2956262b":"ownersStakeAdded()","29569e80":"accountPubICOSale()","29575f6a":"superAdmin()","29576c82":"generalExp(uint256,uint8)","295777be":"releaseFundsNotification(uint256)","295780ea":"RequestInfo(uint64,uint8,address,uint256,address,bytes32,uint256,bytes32[])","2957ca33":"BONUSTWO_DATE()","2957d848":"batchWhitelistAddresses(address[])","2957da23":"ownerDestroy()","2957fef4":"redeemBalanceOf(address)","2958263a":"lastBucket()","29589f61":"tradeWithHint(address,uint256,address,address,uint256,uint256,address,bytes)","2959275d":"increaseCompanyCountByOne()","29594e4f":"hash(bytes32,address,uint256)","295961b1":"checkMinerQuest(address)","295a1cc2":"getNowTotal()","295a49ca":"Unclosed()","295a5212":"mode()","295a8b34":"update(uint256,uint256,bytes,bytes)","295b3299":"submitTopUpLimit(uint256)","295b4e17":"paid()","295c219c":"getMarketMakerAddress(address,address)","295c25d5":"addAmbassador(address)","295c39a5":"getNumMarkets()","295c6e4d":"setBytes32Slice(bytes,uint256,bytes32)","295d0eb5":"_buyAndCreateToken(uint256,bool,uint256)","295d2d69":"BotManageable(address)","295d4756":"PARSECS_TOTAL_AMOUNT()","295dad5e":"TriedToken()","295e0503":"transfreFrom(address,address,uint256)","295e1421":"getSaleOrderSeller(uint256)","295e3362":"getCutoffTime(uint256)","295f6ce7":"launchGame()","295fe611":"valueAtAddressLUT(uint256)","2960109d":"etherReceivedCrowd()","296032f2":"pauseContribution(bool)","29605e77":"transferOperator(address)","29610252":"payFee()","2961320c":"retrieveToken(address,address)","29638223":"greet(bytes)","29638eee":"GetTheWho()","2964a643":"checkPartner(address)","2964e4e6":"totalAccounted()","2965486a":"safeTokenWithdrawalFromCrowdsale(address,address,uint256)","2965558f":"getSignerIndex()","2965fa54":"ethers_collected()","2966d1b9":"unset(address)","2966e97b":"kscApprove(address,uint256,string)","29678a53":"playerInDraw()","29684907":"numerai()","29689a8c":"ergo()","2968d629":"YLCToken(uint256,string,uint8,string)","2968e640":"playerTakeOff(uint256)","29699a88":"viewSentBonuses()","2969b226":"batchTransferETHS(address[],uint256[])","2969d202":"weiBalance()","296b11b2":"getWeightedRandomArbiter(uint128)","296b76bb":"drawPhone()","296ba4ca":"LogValue(bytes32)","296ca48a":"weiLimitPerAddress()","296cab55":"setPresaleStartTime(uint256)","296cc401":"roundPrice()","296d84d5":"teamAdvisorsReserveTokensAddress()","296dbf31":"sendGameGift2(address,uint256)","296e3661":"removeClaim(uint32,string,string)","296ed88f":"testFailControllerInsufficientFundsTransferFrom()","296f1ce1":"getHasStartedState()","296f4000":"delegateApprove(address,uint256,address)","29700653":"fundTransfer()","297072a1":"cNiceGuyIdx()","2970c9c6":"TEAM_TOKENS_RESERVED()","29710388":"isProxy(address)","29712ebf":"accountBalancePublish(string,string,uint256,string,string,uint256)","29713781":"HumanToken(address,address)","29713f86":"cheapredeemvillage()","29723ade":"setMediumPrice(uint256)","29724d54":"offerOn(uint256)","2972b0f0":"isAuthorized(address,uint256)","29730ea4":"buyIdeas()","297398b5":"hourlyProduction()","2973e372":"isAlphaUpper(bytes1)","29745306":"tgrSetLive()","2974a822":"CustodianRegistry(address)","29750e85":"depositEndTime(address)","2975659d":"determineStatus()","2975c690":"SetLimited(address,bool)","29760657":"setStarDistance(uint8,uint16)","2977b1b1":"testAllowanceStartsAtZero()","29780a4e":"eventTransfer(address,address,uint256)","29781ec8":"addExemptedAccount(address)","29784d90":"shortenTde(uint256)","297882d5":"createDistrictOmni(uint8,uint8,uint8,uint8)","2978b826":"assignRevenue(uint256)","297a1f56":"carCount()","297a9dc4":"WalletFunded(address,uint256)","297b5dce":"private_setminRoll(uint256)","297c4143":"PUBLIC_START_TIME()","297c9cd9":"regStopTime()","297cb974":"FlightDelayAccessController(address)","297d1a34":"returnOwnership()","297d7964":"investors_locked(address)","297f119d":"transferToAdmin()","297f407b":"addWinner(address)","297f9af0":"membersCount()","29803b21":"join(string,string)","2980a7b6":"specialManagerOn(address)","2981155e":"weiPerDTH()","29816998":"right63(uint256)","2981cceb":"_mintFromDeposit(address,uint256)","29822734":"Win()","2982add7":"notContains(address)","29832c0f":"hasSigned(bytes32,address)","2983d752":"advisory()","29842d15":"TokenClaimed(address,address,uint256,uint256)","29846afe":"freezeAccount(address,uint256)","2984a077":"setFemaleBonus(address[])","2984bc4d":"getAreaInfo(address,uint256)","2984f486":"setBU(bytes32,uint256)","2984f999":"totalLockTokenAllocation()","298503d9":"createCategory(string,string,uint256)","298569f0":"SetApplicant(string,uint32,string,int256,string)","2985aacf":"getSponsorsN(uint256)","29864547":"feeIndex()","2986c0e5":"index()","2987ace5":"getCapsuleInfo(uint256)","2987c8f7":"checkProduct(bytes32)","2988e36b":"migrateBalance(address)","29893dcf":"checkKhFundDepositAddress()","298994c6":"getCET6InfoById(uint32)","2989ac22":"rollDie(address)","298a49da":"_0xDogecoin()","298aa634":"nextContributorToReturn()","298ac61c":"AgencyWallet(string)","298ad569":"CFOAddress()","298c0733":"send(address[])","298c154e":"addListing(string,string,uint256)","298c1e14":"COIN_PER_ETHER_SUPPORT()","298c3dc4":"addStrip(uint256,uint16,uint8,uint8,string,string,string,string,string,string)","298c3fc1":"changeFrozenBalance(address,uint256)","298c61e3":"TOTAL_TULIP_SUPPLY()","298d075f":"tokenPoolAddress()","298d3567":"depositBBO()","298d5f33":"getPI_edit_1()","298e4f79":"depositTokens(address,uint256,address)","298e685a":"getFrozen(address)","298fb0d2":"setEvenDistThresh(uint256)","298fbf1c":"ClaimBTC(string)","298febed":"towncrierCallback(uint64,uint64,bytes32)","2990194a":"setICOStage(uint256)","29913150":"createTicket(address,uint256)","29917954":"exitPool()","2991835f":"extract(address,address,uint256)","2991964c":"GameLoose(address,uint256,uint8,uint8,uint8,uint256,uint256)","29928852":"NoteChanged(string)","2993ed2d":"cancelSellOrder(address,uint256)","299453ca":"cb0f5ef7()","299550d9":"LogBetStart(uint256)","299599cc":"preICO(address,address,uint256,uint256)","29965a1d":"setInterfaceImplementer(address,bytes32,address)","2996f972":"tokenBurner()","29976934":"ModifyPublicKeySize(uint8)","2997ec89":"getStudentIDText(uint32)","29981db4":"setAdvocate(address,address)","2998dff2":"SuperUltraPowerCoin()","29991a5b":"checkMilestones(address[],uint256[])","29995f4c":"MoonStone()","2999c76b":"initNameSymbol(string,string)","299a017c":"getCurrentMilestone()","299a7bcc":"setOwner(address,address)","299af64b":"setContract(address,bytes32,bool)","299b861e":"changeUnitsPerEth(uint256)","299c55f7":"TOKEN_BOUNTY()","299cc524":"updateEarlyIncome(address,uint256)","299cdc9d":"changeEtherCost(uint256)","299df3f1":"WithdrawDividendsAndCoupons()","299e6b07":"Wallet(address)","299e7318":"resolveVoting()","299e7abb":"calculateWinners(uint32)","299e952f":"buyKeys(address)","299ed37a":"emergencyCall()","299ee814":"OraclizeBet()","299f5f1a":"cumAlienDeposits()","299f7200":"burnOwnership(address)","299ffcbc":"latestReleaseTime()","29a0097c":"internalSend(address,uint256)","29a00e7c":"calculatePurchaseReturn(uint256,uint256,uint32,uint256)","29a03d8d":"distributionReward(uint256,string,bytes32)","29a065bd":"getLOg(uint256)","29a19987":"teamVesting4Years()","29a2629c":"showRoundNum()","29a2aa2d":"thankYou(address)","29a2c27b":"finishLastCount()","29a2d339":"chknodenumber(uint256)","29a3fab9":"finilize()","29a40403":"submitCounterStack(bytes32,uint256,uint256,uint256,uint256,uint256)","29a52db6":"getCurrentUserLocalTokenBalance()","29a5c0f4":"WithdrawAllETH()","29a6344a":"removeSupporter(address)","29a64dd1":"startCrowdsalePhase2Date()","29a67202":"UHUGIN()","29a6f31b":"oraclize_query(uint256,string,string[2],uint256)","29a742aa":"HappyLifeCoin()","29a7d5c1":"joinAirdrop()","29a81222":"getOwnerName(uint8)","29a833ee":"getSumData(bytes32)","29a86dde":"getGameWin(uint256)","29a8cda5":"PolarisToken(address)","29a8fcd2":"Proxy(address,address,uint256,uint256,uint256)","29a9c91d":"setCurrentPeriod(uint256)","29aa1408":"getTotalFlips()","29aa7ec5":"removeSignature(string)","29aa9cbe":"min(int256,int256)","29aab068":"Pen(address)","29aacd10":"InitalPos()","29ab0ca7":"ownerSetResolverPercentage(uint256)","29abdeed":"addCoinBalance(address,uint256)","29ad27d7":"maxDays()","29ad4a34":"_transferMoneyMother(uint32,uint256)","29ae4c70":"isSenderEmergencyMultisig()","29aebf05":"initialMoySupply()","29aec173":"levelUp(uint256,uint16,uint16,uint16,uint16,uint16,uint16)","29b03cfd":"getBid(bytes32,uint256)","29b0de1e":"unsetManager(address)","29b0ffea":"numberOfPreviousEntries()","29b1ce4d":"addWhitelistedUserAddr(address)","29b1e640":"claimReporterReward(address)","29b20bb6":"numCharactersXType(uint8)","29b26bc1":"clearTradePreSignedHashing(address,address,bytes32,address,uint256,int256,string)","29b43a68":"createDepositAddressFor(address)","29b49825":"ADVISOR_POOL_INIT()","29b4d111":"price_start()","29b65a2e":"POCY()","29b6cdd5":"Alphacoin()","29b737ae":"LerToken()","29b84c9c":"transferExchange(uint256)","29b8caff":"totalInvestors()","29b8dab4":"currentBidNumber()","29b981bb":"operationAdress()","29b9f367":"addressDataProviders()","29ba1cb4":"setPrivelegedWallet(address,address)","29ba2e07":"TokenPoolExhausting(uint256)","29ba725a":"setTransformTarget_miner(address,uint256)","29ba7bb2":"initialOwner()","29ba8780":"executeTransaction(uint256,address)","29ba8d03":"getMigrateMarketInFromSiblingCalled()","29bb4bf2":"showCollectorsBalances()","29bc3b85":"isAccepted(uint256)","29bc5d0f":"finalyzeContract()","29bcb186":"transferToContributor(address,uint256)","29bd028a":"startIcoPreICO2ndRound()","29bd58b4":"revokeToken(address,uint256)","29bed3bf":"EthereumRoulette()","29bee342":"Get_Last_Value()","29bf56c3":"setUnitAttackIncreases(address,address,uint256,uint256,bool)","29bf960a":"getResultTable(uint256,uint256)","29c08ba2":"payPremium()","29c10e37":"filter(string)","29c19304":"setInitialVaribles(uint256,uint256,address,address,address)","29c1c61e":"modifyPowPrice(uint256,uint256)","29c1ee0d":"TOKENS_address()","29c3340f":"dividends_share()","29c36bb5":"feedAddress()","29c40d5f":"CheckSoilHumdtyException(bytes32,uint32)","29c50df4":"getEIN(address,address)","29c510b6":"reveal(bytes32,bytes32,address)","29c6647b":"addCET6(uint32,string,uint32,uint32,uint32,uint32)","29c71c1b":"modifyFeeShare(uint256)","29c78e0b":"Ethash()","29c886bf":"TokenCampaign(address,address,address,address,address,address,address,address,address,address,address)","29c8d3ce":"activateTokens(uint256)","29c8dae7":"create21PizzasTokens()","29c90b63":"onTapPollFinish(bool,uint256)","29c924cf":"setFundingGoal(uint256,bool)","29ca9dca":"updateRelay(address)","29caf0c9":"getStringValueByKey(string,string)","29cb924d":"getCurrentTime()","29cbdc86":"buyin(address,uint256)","29cca3ae":"getYouTubemasterReq()","29ccb4df":"getCompte_11()","29cd00f7":"approve(address,string)","29cd5777":"_tryEraseSingleNode(bytes32)","29cd62ea":"setPubkey(bytes32,bytes32,bytes32)","29cd7767":"_NT()","29cd92cf":"deleteHelper(bytes32)","29cdda23":"newVersion()","29ce0939":"Timeout(uint256,uint256)","29ce1ec5":"addFactory(address)","29ce3b69":"increaseApprovalAllArgs(address,uint256,address)","29ce7fc1":"getAllRightHand()","29cee59e":"finishCrowd()","29cf90f3":"sellUnicorn(uint256,uint256,uint256)","29d00d64":"ReloadKeys(uint256,uint256)","29d017b5":"TestWithConstructor(address,uint256[])","29d07c23":"registerForVoting()","29d0807b":"addone(uint256,uint256)","29d10b6e":"addSupervisor(address)","29d11b32":"btycbalanceOf(address)","29d24cbe":"TOKEN_SUPPLY_SEED_LIMIT()","29d287ec":"isFinishDateReached()","29d28aad":"Broker(address)","29d368e3":"curMax()","29d428ca":"requiredTokenAmount()","29d50682":"setupPlotOwnership(uint256,int256[],int256[])","29d56381":"balance_factor(uint256)","29d592bf":"arconaToken()","29d6ec95":"cancelBuy(uint256,uint256,uint256,uint256)","29d6f899":"BetOnBlue()","29d729ac":"ticket_addresses(uint256)","29d77446":"WhitelistSet(address)","29d91164":"delWhiteList(address,address)","29d98a7b":"change_individual_cap(uint256)","29da2fda":"UpdateToken()","29da3b4d":"removeBorrowingItem(uint256)","29da5738":"actionCount()","29daaa5e":"numFactories()","29dacb60":"getEthRaised()","29daf3ce":"create(bytes32,address,address,uint256)","29db191f":"approveForAll(uint256)","29db1a4f":"burnForInsurance(uint256)","29db3256":"getRandomBox(string)","29db8ec4":"getAccountSpendingRemaining(address)","29dbdd77":"updateDetails(bytes32)","29dcb0cf":"deadline()","29dd07eb":"KarlisToken()","29dd0b86":"lastSaleDate()","29dd0d7d":"requestBlokTokenOwnershipTransfer(address)","29dd8b26":"EGTToken()","29de91db":"setMsg(address,uint256)","29df8972":"Nilometer()","29dfdded":"addNewDonkey(address)","29e10c13":"getAd(uint256,uint256)","29e1ddb8":"freeLottoInfo()","29e206bd":"forceDivestAll(bool)","29e21cbd":"UIWish(address)","29e286c6":"boughtWithoutWhitelist()","29e2b478":"addAddressToWhitelist(address,address,uint256)","29e30910":"testThrowCreateExistingNonce()","29e341f1":"adminAddRole(uint256,address,uint256)","29e3ae3d":"virtualTradesSummedCount(bytes32)","29e46d3f":"openingTimePeriodOne()","29e5dab7":"BytomGoldToken()","29e614ee":"addDrop()","29e63cd7":"addImmutableContract(string,address)","29e67fce":"Rate2()","29e6b5be":"VPTToken()","29e6f3f8":"setPI_edit_6(string)","29e80a80":"_iWantXKeys(uint256)","29e81c79":"isJobCancel(address,bytes)","29e846df":"dividends(address,uint8)","29e8bc0a":"getShareToken(uint8)","29e94503":"VersionedBlob()","29e94ef6":"getProjectedJackpot()","29e99f07":"test(uint256)","29e9a3b9":"tokensReceived(address,address,uint256)","29e9afc9":"EnterCode(uint32)","29ea110c":"maxCapInCents()","29eae053":"setService(address,address)","29eae264":"EosChain()","29eae797":"oldController()","29ec09cc":"GetConfirmRound(address,uint8)","29ecd1e0":"PriceChanged(string,uint256)","29ed0f06":"BitcoinLegendToken()","29ed1297":"setItem(address,address,string,string,string,bool)","29ed82a1":"getDeflator()","29ed9a6a":"depositERC721(address,uint256,address)","29edd574":"buyCopper(uint256,uint256,uint8,bytes32,bytes32)","29edfbb8":"GetApplicant(address)","29ee0480":"FlatPricingExt(uint256)","29ee1580":"setMyPrice(uint256,uint256)","29ef1919":"discountPercent()","29ef5552":"setupZoomLvl(uint8,int256,int256,uint256)","29ef56b1":"getAskOrderBookStats()","29f0a422":"MakeTransfer(address,uint256)","29f11c8d":"edit(uint256,string,string)","29f1bff4":"withdrawFromChildDAO(uint256)","29f20618":"createLineItem(string,uint256,uint256,uint256,uint256[])","29f27577":"InvestorList(uint256)","29f321e4":"buy_Vault(uint256,bytes8)","29f3533c":"setPriceStalePeriod(uint256)","29f4071b":"RegistrationStatusChanged(address,bool,uint256)","29f46429":"WIE()","29f5fb9c":"icoTokenSales()","29f62f70":"logSendEvent()","29f69427":"o2Address()","29f6d9c3":"clearTokenApproval(address,uint256,bool)","29f75dc2":"samePooling()","29f799cb":"Studio()","29f7bd2f":"transferToContributionPool(uint256)","29f958dc":"publish(uint16,uint16,bytes4,string,bytes3)","29fa7266":"setSuperOwner(address)","29fb598e":"bountyTransfer(address,uint256)","29fc7bd8":"PERCENT_DIVIDER()","29fcfe2b":"VestingScheduleConfirmed(address,address,uint256,uint256,uint256,uint256,uint256)","29fcfeb0":"AUCTION_STARTED()","29fd06cf":"Qripplex()","29fd50eb":"libAddress()","29fd8201":"setReputationAddress(address)","29fec030":"MAX_DAILY_TOKEN_SOLO_SPEND()","29ff42e1":"revealHiddenPosition(uint32,int64[],bytes32,uint64,bytes16,bytes32,bytes32)","29ff4f53":"setReleaseAgent(address)","29ff7d04":"revertReservation(address,address)","2a004bd0":"deleteChannel(address,address,address,address,address)","2a00d284":"rewardReferrer(address,address,uint256,uint256)","2a00ff6f":"endianConvert256bit(uint256)","2a013925":"setFundingCap(uint256)","2a0213f6":"FeeOnAllocation(uint256,uint256)","2a022f22":"ALLOC_SALE_GENERAL_2()","2a035b6c":"endGame(address)","2a03b48b":"Campaign(uint256,uint256,uint256,address,address)","2a03ffa5":"CryptoGOToken()","2a0401f0":"confirmOrder(bytes32,bytes32)","2a040c16":"TemboCoin()","2a04e88a":"ethRateInUsdCents()","2a0763ce":"endGameConflict(uint8,uint256,uint256,int256,uint256,bytes32,bytes32)","2a095c14":"getCompte_3()","2a095fbe":"unlinkEID(bytes,bytes,address)","2a096397":"myDeposit()","2a0a3b53":"NewText(string,string)","2a0a5f50":"BidCanceled(uint256,uint256)","2a0acc6a":"ADMIN()","2a0b2617":"getAccountDetails(uint256)","2a0b9cb5":"check_authorization(address,address)","2a0bb7ea":"mulIsSafe(uint256,uint256)","2a0bba0e":"ImperoCoin()","2a0c5221":"battle(uint256,uint256)","2a0d06ec":"getTotalPctx10()","2a0d479f":"TutorialToken()","2a0d79ef":"totalSupply(bytes)","2a0deab4":"getDataAndOwner3(uint256,uint256,uint256,uint256)","2a0f189a":"setCallPtr(uint256)","2a0f3c35":"rentableSetup(uint256,uint256,uint256)","2a10abc3":"CrypteloERC20Address()","2a10ff23":"product2()","2a11b950":"contractEvents(uint256)","2a11ced0":"holders(uint256)","2a12b54d":"_transferToLock(address,uint256,uint256)","2a139f75":"PLATprice()","2a14314f":"satoeLocked()","2a14b80a":"partition()","2a151090":"canPerform(address,address,bytes32,uint256[])","2a16a9ee":"emitCategorySet(uint256,uint256,bytes32)","2a16cca4":"isApproved(address,uint256)","2a1727f8":"checkExistAddress(address)","2a174710":"getAttackForCost(uint32)","2a17e397":"multiTransferTightlyPacked(bytes32[])","2a1828fb":"attController()","2a18ca16":"currentSaleLimit()","2a19642c":"setSpawnProxy(uint32,address)","2a1a3303":"getNumberOfFlips(address)","2a1a8d4a":"updateIcoStatus()","2a1ab57e":"register(address[],uint256[])","2a1bbc34":"generate()","2a1be747":"rateFirstWeekEnd()","2a1c70e7":"Indemnisation_1()","2a1cdf7a":"enableReturnContribution()","2a1e37de":"armyCountBattlesLost(uint256)","2a1eafd9":"targetSupply()","2a1eb7cc":"MintToOwner(uint256)","2a1ef0ca":"teamAllocation(address)","2a1f63f8":"MiningRewardSent(address,address,uint256)","2a1fc45d":"decreaseArrayOfBeneficiariesBalances(address[],uint256[])","2a21566f":"grantPositionOwnership(bytes32,address,address)","2a21a3af":"isNormalUser(address)","2a22196d":"getVoucherDetails(uint256,uint256)","2a2235f2":"winAmount0()","2a226857":"AlbaritTokenV4(address,string,string,uint256,uint256)","2a228fc2":"processWithdrawals()","2a23475f":"blockCrowdsale(address)","2a23ac02":"eBitcoincash()","2a24b8e1":"instruct_4()","2a24f46c":"auctionEnd()","2a2514a2":"AceFundToken()","2a258842":"ETHOS()","2a2604dd":"bidRefund(uint256,uint256)","2a272974":"tokensIssuedForBonusRangeTwo()","2a27fd4a":"forGenesis()","2a286a19":"rewardSplitPercent()","2a286eda":"productAccounts(uint256)","2a2879d3":"createPromoCar(address,string,uint256)","2a28822e":"create(address,int256,address)","2a288272":"setUpgradesOwned(address,uint256)","2a28c610":"uint256_to_bytes(uint256)","2a292cce":"openCrowdSale(uint256)","2a29312a":"recoverAddressFromSignedMessage(bytes,bytes)","2a295c1f":"ChainMonstersCore()","2a29700f":"setForceExecuteOfContracts(bool)","2a2998a0":"houseFeeVal()","2a29c8d9":"getLoansLengthByClient()","2a29d109":"rewardController(address)","2a2a62f6":"removePrivelegedWallet(address)","2a2a6434":"register(bytes32,bytes32,address,bytes32,bytes32,string)","2a2ad4df":"ExpiringMembership()","2a2b48f5":"largestRetro()","2a2bb728":"ElephantsPaymentCoin()","2a2d78b0":"DeDeContract(address,uint256)","2a2dd486":"_computeAura(uint256,uint256)","2a2e00be":"MintingClosed(bool)","2a2e1320":"isEven(uint256)","2a2e2f0c":"convertInternal(address,address,uint256,uint256)","2a2e6358":"setMinRecharge(uint256)","2a2e6ee6":"countCrowdsalesForUser(address)","2a2eddde":"setVesting(address,uint256,uint256,uint256,uint256)","2a2f366c":"getPlayer(uint8[176],uint8,uint8)","2a2f7bda":"daysRemaining()","2a2fbd4b":"min_required_amount()","2a2fe110":"isCosignerSet()","2a304900":"getHunting(uint256,uint256)","2a305613":"transfer(uint152,uint152,uint256)","2a308b3a":"transfer(address,address,uint64)","2a30b0b8":"addARA(address)","2a316353":"JMTOKEN(uint256,string,string)","2a31c5b8":"_addBonusOfTop(address,uint256)","2a332b2a":"setLotteryAddress(address)","2a335c17":"getTotalSalaryBunny(uint32)","2a337d30":"submitMatch(bytes32,bytes32)","2a3386e5":"covmanagerAddress()","2a33fec6":"proceed()","2a3520e1":"addDataInstance()","2a3590b9":"mimetype()","2a35d251":"_move(uint256,address,address)","2a3602b2":"DayLimitMock(uint256)","2a369647":"getEndpointParams(address,bytes32,int256)","2a36b7ac":"TotalRate()","2a37d540":"CrowdToken()","2a37eaea":"buyWithHash(address,uint256,uint256,bytes32)","2a387bdd":"bsx(uint256,string,string)","2a388b1f":"cancelDeposit(bytes32,uint256,uint256)","2a389fdc":"Pray4Prey(uint128[],uint8[])","2a38d484":"getNumEntries(uint256)","2a3966ff":"setActiveStatusEgg(uint256,bool)","2a396734":"burnPXLRewardPXL(address,uint256,address,uint256)","2a39a069":"minInvestmentInWei()","2a39c1ea":"officialUrl()","2a3a236f":"setMasterContract(address)","2a3b1228":"RobotnikToken(address)","2a3c2c56":"getConversionFeeAmount(uint256)","2a3d05cc":"getSignedIndex()","2a3d30c2":"coinValue()","2a3dc703":"updateRewardLedger(address,uint256,uint256)","2a3de92f":"getCurrentBonusPct()","2a3e6ba1":"TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE5()","2a3ec4ff":"takeICOInvestmentsEtherCommission(address,address)","2a3ef566":"EscapeCalled(uint256)","2a410068":"updateShares()","2a41360d":"processOfflinePurchase(address,uint256,int256)","2a41d1ff":"ArrAccountIsNotFrozen(uint256)","2a42e85f":"MiBoodleToken(uint256,uint256,uint256,uint256,uint256)","2a437269":"RCCCToken()","2a43b847":"TEACHToken()","2a43db3a":"Creature()","2a45a39a":"Post(address)","2a4654ab":"getAnimecard(uint256)","2a46d079":"MAT_UNIT()","2a472ae8":"checkIfCalled(bytes32)","2a4735c1":"EXOTokenSale(address,address,address)","2a47e08a":"Potato()","2a4802bc":"JINS()","2a4843a7":"freezeHeight()","2a486a28":"raisedETH()","2a48cabb":"testSwapTop()","2a491877":"lastTimeOf(address)","2a49222b":"isUsernameTaken(bytes32)","2a4a1a9b":"addFunds(address)","2a4a1b73":"vote(address,uint256,uint256)","2a4a8d68":"PRESALE_WEI_WITH_BONUS()","2a4a8e02":"stakedAmount(address,address)","2a4c7c6d":"initiateClaim(bytes32)","2a4caf67":"setDistenseAddress(address)","2a4d1a12":"CardExists(uint32)","2a4dc687":"callLib2(uint256)","2a4e0d55":"getTranscoderPoolSize()","2a4e4a84":"forx()","2a4ef2a3":"wpxTeamAddress()","2a4f1f21":"ACLYDTOKEN()","2a4f370f":"forTesting()","2a4ff14a":"Vlogchain(uint256,uint256)","2a50097b":"getPlayerBets(uint256,address)","2a501a43":"grantBonusDrops(address,uint256)","2a50d71d":"transferWithLock(address,uint256,uint256,uint256)","2a513dd9":"changeMinimum(uint256)","2a515949":"_attack(uint256,uint256,uint256,uint256)","2a523e89":"maxReferrerTokens()","2a52ee60":"createAuthority()","2a548276":"AddStaticProfit(address,uint16,uint256)","2a54d313":"pay(address,address,address,uint256,uint256,uint256)","2a555650":"HoneySuckleTimes()","2a55c47d":"TrumpFarmer()","2a55cab6":"UniCoinSize()","2a55feec":"isBuyer(address)","2a571b15":"strikersChecklist()","2a583b90":"withdrawRake()","2a5854d9":"getFreeSquirrel()","2a58b330":"nextOrderId()","2a595dd2":"GridcubeToken()","2a5b204a":"subCoinBalance(address,uint256)","2a5b51c3":"TokensIn(uint256)","2a5b68fd":"validate(bool)","2a5bfc7b":"isFunctionAuthorized(bytes32)","2a5c0e7c":"HomeBridge(uint256,address[],uint256,uint256,uint256)","2a5c2a64":"ITGCToken()","2a5c4675":"reservation()","2a5c65e4":"lookupInterest(uint256,uint256)","2a5c792a":"getAllTokens()","2a5cd45e":"getModuleIDByName(string)","2a5da7cd":"AnimatixToken()","2a5e695e":"Clean()","2a5eb26a":"BITCOINGAME()","2a5ed678":"currentContributionLimit()","2a5f6239":"_addReferrer(address,address)","2a5f6a0f":"setVariationCycle(uint256)","2a607962":"minCutValue()","2a608c0c":"VicoOwner()","2a60cf07":"FUTURE_DEVELOPMENT_FUND()","2a61ae19":"LockBalance(address)","2a61d47b":"getResourceSetCount()","2a62738b":"icoEndDate()","2a62b7fa":"IcoContract()","2a632eb5":"setUsdTokenPrice(uint256)","2a6389dc":"IsTransferFromOldContractDone()","2a649d6a":"returnFixed()","2a64e635":"simpleToken()","2a64fb63":"getSaleDate(bytes)","2a663686":"fpartSigned(int128)","2a666e01":"_fight(uint32,uint32)","2a66ede5":"giveMeETH()","2a677fb9":"getTokensForValue(uint256)","2a6852bf":"KOKOCoin()","2a6865e3":"PibbleToken()","2a69d486":"changeCraneStatus(bool)","2a69e1c6":"onlyWhitelistedCanDo()","2a69e7d9":"transfer(address,uint48)","2a6a5394":"TokenCappedCrowdsale(uint256)","2a6b157a":"CrowdsaleClosed(address)","2a6c703b":"RATING_EXPAND_INTERVAL()","2a6c7757":"kjhcoin()","2a6cc9bf":"QRReal()","2a6d474d":"usdPerEthMin()","2a6d6c08":"ReleasableAmount(address,uint256)","2a6dd48f":"approvedFor(uint256)","2a6dd8c9":"getPercent()","2a6dd9cb":"getInfoA(uint256)","2a6e3803":"getSoldAreasCount()","2a6e3e5e":"correct_check_match(uint256[39])","2a6efd76":"additionalRewards()","2a6f39ed":"deleteAllParents()","2a70214a":"TWD_Omnidollar()","2a707d2c":"personal_withdraw(string,uint256)","2a709b14":"tokenManager()","2a70d1e7":"registerInit(address)","2a711ab4":"voteTeam(bool)","2a714078":"triggerAuth()","2a71e729":"NAGACOIN()","2a724f2a":"reclaimAllAndBurn(address)","2a729061":"IDXToken()","2a7292d0":"createToken(uint256,address,uint256)","2a7318ac":"changePresaleEndDate(uint256)","2a73db5c":"GetContributorInformation(address)","2a741385":"subTokens(uint256,string)","2a745971":"BlockKing()","2a745ae6":"flowerAllowed(address,address)","2a74833d":"getUserSupportInTournament(uint256)","2a7575ee":"availableBalanceOf(address,address)","2a75a2ac":"addressFundAdministration()","2a75cb71":"removeOwnerRequest2(address)","2a764406":"CreateLRP(address,uint256)","2a76a169":"freezeMultipleAccounts(address[],bool[])","2a76ffae":"depositEtherForRefund()","2a774c27":"totAllocation()","2a776e3d":"setKYCLimited(address[])","2a7781cc":"postData(address,string,bytes32)","2a77b4af":"FEE_MUL()","2a77f2b7":"minMaxBuyETH()","2a7806e4":"noTokenLocked()","2a7813a4":"BitcoinBlackPearl()","2a781f78":"getKYCPresalePayload(bytes)","2a782802":"creatorBalances(address)","2a792f57":"buyAKeyWithAmount(uint256,address,uint256)","2a795d79":"bounty_allocation()","2a79fa0e":"TakePrize(uint256)","2a7a50a5":"Intro(string,string,string,string)","2a7a80a4":"trade(address,address,uint256,address,address,uint256,uint256,address,bytes)","2a7b0172":"dontSellRock(uint256)","2a7b2c93":"split(string)","2a7b3d4d":"resumeWhitelist()","2a7c24f1":"power(int256,int256)","2a7ca11f":"getMemeData(uint256)","2a7caaec":"FOUNDATION_WALLET()","2a7e0cc0":"createtoken(string,string,string,string,string,uint256)","2a7e5018":"timeVault(address)","2a7e60b6":"setRevealClosed(uint256)","2a7ef0cc":"IDEA()","2a7f26c4":"GetAllCurrencyIDs()","2a8014ca":"escrowAmount(address,uint256)","2a804835":"setCooldownEndBlock(uint256,uint64)","2a805069":"createToken(uint256,uint256)","2a808899":"getSkillCount(address)","2a8092df":"isMinting()","2a812941":"getInitializeDesignatedReporterAddressValue()","2a816e65":"factorWeight()","2a8219e2":"setFundingBlock(uint256,uint256,uint256)","2a827f99":"getTokenOwnerReward()","2a82fdbd":"approveAdd(uint256,address,bool)","2a835d67":"changePreIcoStartTime(uint256)","2a83cd70":"MrReaperToken()","2a845b9f":"ADPay()","2a8565b4":"GACT()","2a856fcf":"debit(bytes32[],uint256[],uint64[],uint8[],bytes32[],bytes32[])","2a858126":"tickerRegistry()","2a8587f9":"unAuthorized(address,address)","2a85a45d":"right38(uint256)","2a85b7dd":"getBackEtherFor(address)","2a862f1a":"notLessThan()","2a86eef3":"countDiscount(uint256)","2a874f34":"finishCampaign(bytes32)","2a87a86f":"shift(address,uint256,bool)","2a882d1d":"TokenHolderSnapshotter(address,address)","2a887299":"bid_threshold()","2a89d1bc":"TranchorToken(uint256,uint256,address,address)","2a89d6fd":"registerForGetTogether(address)","2a8a8b19":"bonusList()","2a8a8ebb":"unitStake()","2a8ab73c":"getProductOrderPayer(uint256)","2a8ade3a":"TotalCapacity()","2a8d1c61":"maxMask()","2a8d7baa":"claimCompanyReserve()","2a8de0ca":"DranMe()","2a8e251f":"BitcoinNature()","2a8e391d":"OperationsFund()","2a8eb9a3":"arpToken()","2a8ec8cc":"numberOfPledges()","2a8f368b":"RESERVED_COMPANY_GROUP()","2a8f6aa8":"TOKENS_FOR_OPERATIONS()","2a8faf95":"secondaryGasLimit()","2a8fd223":"Flagged(address,bool)","2a9043e4":"sellValue()","2a9046d8":"disableGeneration()","2a905318":"TOKEN_SYMBOL()","2a905ccc":"getAdminFee()","2a9078d6":"OWNERS()","2a909257":"MultiCappedCrowdsale(uint256,bytes32,uint256)","2a9121c7":"ethereumToTokens_(uint256)","2a91ab16":"doAirDrop(address[],address,uint256[],uint256)","2a922d54":"collectedAddresses(uint256)","2a92362c":"getPaid(uint256)","2a9278c5":"optionPoolLockTotal()","2a92bb17":"OPRAH()","2a92bffa":"setEditionPackPrice(uint8,uint256)","2a93b5bb":"pausePreIco()","2a943be1":"LIRAX(string,string,uint256,string)","2a952b2d":"process(bytes32)","2a952b4b":"setParents(uint256,uint256,uint256)","2a970043":"create(string,uint256,uint256,uint256)","2a98e802":"setPerformanceBonus(uint256)","2a9a86c1":"createBucket(bytes32[])","2a9b4921":"testManager(address)","2a9b6975":"SuperNanoCoin()","2a9b6dee":"pastFiveMinutes()","2a9ba092":"resizeIssuersArray(uint256)","2a9d04f0":"TOKEN_PRIVATE_SALE_CAP()","2a9e97f1":"matured_block_number()","2a9edf6f":"ownerSetStakeStartTime(uint256)","2a9f0fb2":"getPriceWithInterests(uint256)","2a9f1a79":"acceptPayment(address)","2a9fabd2":"betMatch(uint256,uint256)","2a9fb933":"MintExecuted(uint256,address,uint256)","2a9fb9b2":"userTransfer()","2aa0426c":"getAllBlocksByOwner(address)","2aa056cd":"shares_holders_count()","2aa073c5":"icoActive()","2aa0da47":"paymentSettings(string)","2aa1e848":"getPlayerAffT2(uint256)","2aa2b7eb":"T8CToken(address,uint256)","2aa2f7a4":"getOwnOrderByIndex(uint256)","2aa3177a":"self_store()","2aa37a41":"substractBalance(address,uint256)","2aa49dd7":"Pixiu()","2aa4c051":"setifoodDevAddress(address)","2aa531d9":"getPlayerData(address)","2aa5411f":"jadeRec(uint256,uint256)","2aa5ed61":"DayLimit(uint256)","2aa6f98b":"ledToken()","2aa71e24":"init(bytes32,address)","2aa852b3":"removeListener(address,address)","2aa8be8d":"createPermission(address,address,bytes4,address)","2aa9466b":"updateMyWorks(bytes32,address,address,bytes32,uint256,uint256)","2aaa308e":"finalize(address,address,address,address)","2aaa49f5":"percentageQuarter3()","2aaa9de1":"AlicToken()","2aab1351":"receiveFromSigned(address,bytes,uint256,uint8,bytes32,bytes32)","2aab22ff":"BonusReferrerCrowdsale(uint256)","2aab80dd":"optionPool()","2aabb48e":"nextContributionCap()","2aabffdf":"disableSaleAgent(address)","2aac6911":"poolBLock()","2aac8ad4":"getFirstAndSecondItem()","2aad292e":"setOperatingOfficer(address)","2aadafe8":"refundAdvertiser(address,uint256)","2aae7f26":"Arcturus()","2aae88f6":"removeFromGeneration(uint256,address)","2aaee1a5":"Drawer()","2aaef20c":"sixth_withdrawal(uint256)","2aaefa9f":"centsExchangeRate()","2aaf1685":"testControlCreateWithParentSameItemId()","2aafbf7c":"Getether()","2aafe9e7":"metToken()","2ab0252d":"getERC721AddrPawn(uint256)","2ab08396":"OwnersDb()","2ab0be77":"getTicketCode(uint256)","2ab0bf3c":"GetContributorData(address,uint256)","2ab13037":"votesNo()","2ab19a7e":"GoalMaximumReached(address,uint256,uint256)","2ab2174e":"subOnOneStage(address,uint256,uint256)","2ab22592":"updateWinnerBid(bool,bytes,uint256,bytes,bytes,bytes)","2ab24e3b":"commitVote(address,bytes32,bytes32,bytes32)","2ab26831":"getRateIco()","2ab28ce4":"buyTree(uint256,address)","2ab290fc":"updatejingzhi(uint256,string,uint256)","2ab34a91":"claimEnergy()","2ab4672a":"BatchCreateSaleAvgPrice(uint256[],uint256,uint256,uint256,uint64,address)","2ab4d052":"maxTotalSupply()","2ab4ebfa":"AddItem(address,address)","2ab6a50e":"payoutBigBonus(address)","2ab6f3f0":"BteamBets(uint256)","2ab6f8db":"renounceOperator()","2ab7173b":"lockup_startdate()","2ab72d2f":"assetIdOfToken(uint256)","2ab76377":"icoEndTimestampStage3()","2ab7961e":"aDeleteMessage(uint256,string,string)","2ab7d104":"_getAllRevisionIpfsHashes(bytes32)","2ab8de9b":"hash_ripemd160(string,uint256)","2ab8fc2d":"reservesPerTokenSrc(address,uint256)","2ab90d66":"ownerrestart()","2ab924d2":"HRCoin()","2abaa0c9":"picosCap()","2abaca23":"participate_in_arbits_presale_fiat(address,uint256)","2abd7fc8":"withdrawDao()","2abdbeb8":"forceOverStage()","2abdf1ef":"_update(string,uint256,string,uint256,uint256,uint256)","2abe4f60":"getInStake(uint256)","2abe5a2d":"getCandidate(uint32)","2abf2aae":"payMaxAuctionEther()","2abfab4d":"donationCount()","2abfaf1f":"setFreeTransfer(bool)","2abfbd28":"mintCommunityRewards()","2ac016ad":"addBackend(address)","2ac025ab":"removeAddressFromRole(address,string)","2ac08739":"getCurrentDuke(string)","2ac110c5":"icoPhase2Start()","2ac12622":"cancelled(bytes32)","2ac197c4":"IPMCOIN()","2ac1a995":"HiBTCToken()","2ac1db5a":"getEthToTokenUpdateOrderHint(uint32,uint128,uint128)","2ac20ed4":"createInitialDays(uint256)","2ac2af53":"updateParameters(bytes32)","2ac306b0":"BitCoin()","2ac364b4":"PalavraCoin()","2ac394a4":"durationBetweenRewardMints()","2ac48524":"getTokensCount(address)","2ac4a51d":"OVALExchangeToken()","2ac50df1":"tokenPriceOracle()","2ac68b78":"acceptPayment(address,uint256)","2ac69167":"StockLocation(string)","2ac6f15f":"exchangePreDGZTokens()","2ac71c16":"maxUSD()","2ac7f8ce":"CrowdSaleChanged(address)","2ac85e46":"isValidNode(uint256)","2ac87112":"ETHRaised()","2ac9bf09":"bid(uint256,uint256,uint256)","2aca2b16":"setInvestxPlatform(address)","2acada4d":"getAllAssets()","2acc204c":"killMeshPoint(int256,address,address,string,address)","2accf2f7":"splitFunds(address,address)","2acd1a95":"sling(string,string,string,string,uint256)","2acd2000":"removeFreezer(address)","2acd7e41":"transferOwnerToTest()","2acefd0f":"setCitySlogan(uint256,string)","2acf3908":"StealthGridToken(uint256,string,string)","2acf8551":"playMeta(address,address,uint256)","2ad02172":"MAX_PREICO_SUPPLY()","2ad0a4e9":"pauseNotice()","2ad11b9e":"getMinerals()","2ad12937":"OwnableToken()","2ad1bc09":"steal(int128,string,address)","2ad2a9f8":"transfer(bytes32,uint256,address)","2ad2ae2e":"collectLocalBounty(uint16,uint256)","2ad3274f":"UpgradeScheme()","2ad3509b":"ExcreteumToken()","2ad389e3":"constructHashRs1Rs2(bytes,bytes)","2ad3e8bc":"GreenChain()","2ad3ef70":"randContract()","2ad45312":"WEI_MINIMUM_PURCHASE()","2ad4d818":"userCreate(string,string)","2ad64a4d":"MAXCAP_TOKENS_PRE_ICO()","2ad8016e":"changeDiscount(uint256,uint256,uint256)","2ad8aaa6":"bonusAmmount(uint256)","2ad8d875":"getPayeeExpectedAmount(bytes32,uint8)","2ad8fbd2":"MerrierToken(string,string,uint256,uint256,bool)","2ad92740":"tokensPurchased(address)","2ad9527e":"h_pwd()","2ad95786":"winner(address)","2ad9618c":"startCrowdsale(uint256,uint256,uint256,uint256[],uint256[])","2ad99825":"setOwnerCutPercentage(uint256)","2ad9efc0":"UbayToken(address,uint256)","2ada2596":"getMember(address)","2adbb84d":"onFreezing()","2adbc396":"BurnableCrowdsaleToken(string,string,uint256,uint256,bool)","2adc2cd2":"COIN_PER_ETHER_ACTIVE()","2adc7da3":"setCentralBanker(address)","2add5a50":"cofounders(uint256)","2add78bb":"StartQ(string,string)","2addeab6":"getSolver(uint256)","2ade6c36":"getNodeAddress(bytes32)","2adf68bb":"UTPLToken()","2adf7d2f":"tenZero()","2ae1158d":"votingWeightOf(address,uint256,uint256,uint256)","2ae26d8e":"tenDecimalPlaces()","2ae3594a":"hit()","2ae418a4":"getPrivatePreSaleTokenBalance(address)","2ae4b85f":"MAX_HOST_PERCENT()","2ae524c2":"mintRiskTokens(address,uint256)","2ae6218d":"getBurnPrice()","2ae67563":"GameSicBo(string,uint256,uint256,uint256,address)","2ae72544":"length(int256)","2ae7c2df":"Ethernite()","2ae7c313":"Injected(address,uint256,uint256)","2ae8284a":"_newGame(uint256)","2ae8636d":"withdrawPRSTokens(address)","2ae87a70":"getNumContents(address,uint256)","2ae8a2d2":"sendFunds(address,uint256,uint256)","2ae8a7e3":"checkRole(address,bytes32)","2ae8b4a3":"actualGotETH(address)","2ae9782c":"MARRON()","2ae9c600":"protocolVersion()","2aea4d21":"sealer()","2aeaa291":"checkRewards()","2aeabfbf":"getLiquidityAndPositions(bytes32,address)","2aeacd4a":"exchangeTokensFromOtherContract(address,address,uint256)","2aebcbb6":"finishVote()","2aec3a71":"ProofOfHumanityAddOn()","2aec9466":"updateInfo(uint256,uint256,uint256)","2aed1390":"kyberContract()","2aed1905":"setMatchingEnabled(bool)","2aed256e":"inRangeToDisembark(uint16,uint16,address)","2aed7f3f":"reclaimContract(address)","2aee19c7":"testCreateWithNonce()","2aef3898":"ChangeMinSaleAmount(uint256)","2aef6ff6":"serviceTrasferFromDist(bytes32,address,uint256)","2aefb7c5":"funds_claimed()","2af004e7":"setReferralAddress(address,address)","2af05c4e":"lastMintingTime()","2af05d07":"unlockCurrentAvailableFunds()","2af0ac71":"getAmountSoldAfterPowerDay()","2af123b8":"diffHours(uint256,uint256)","2af1616d":"MissionToken(uint256,string,uint8,string)","2af1b5a2":"protectedUnlock(address,uint256,string)","2af1c247":"mint(string,uint256,uint8,string)","2af22e3b":"getJobs(address,uint256)","2af37ba0":"Donate(string)","2af38eab":"totalBspAmount()","2af39bab":"AssetBackedTokens(string,uint8,address)","2af3b7f8":"updateState(bytes32,uint256,bytes,bytes,bytes)","2af4c31e":"changeOwnership(address)","2af52312":"TRAToken(address)","2af5356a":"claimTeamTokens()","2af5cfdd":"priceOfEthOnEUR()","2af5e6b2":"setPriceEther(uint256)","2af6fb10":"ERC20TokenImpl()","2af7ac0a":"rtu(uint256)","2af7c4d7":"Certifiers()","2af7ceff":"testPrice(uint256)","2af7ecc7":"addRosenCertAdmin(address)","2af8afca":"dgt()","2af8b645":"release(bytes32,bytes32)","2af8fd94":"ISmartCert()","2afaca20":"buy(uint256,address,uint256)","2afb21bc":"InvestWithdraw()","2afb9fb1":"isCardTradeable(uint64)","2afbbacb":"canStake(address,uint256)","2afbc38f":"Annexe_SO_DIVA_SAS()","2afbe339":"QQQToken()","2afcdfbc":"createGen0Auction(uint256,uint256,uint256,uint256,uint256)","2afcf433":"PriceTwoEnable()","2afcf480":"invest(uint256)","2afd1a7d":"getReleasableAmount(address)","2afe4c37":"tokensleft()","2afe9f1e":"TestTokenContract()","2afed67e":"amountFundBounty()","2aff101c":"LinearDecayingTokenFunction()","2aff2843":"servusMultiSig()","2aff49d7":"setSizeAndRate(uint256,uint256)","2b000f00":"calculate_next_expected_wei(uint256,uint256,uint256,uint256)","2b00c6fd":"createHorseShoe1(uint256,uint256,address)","2b019692":"RYNote()","2b01bf51":"isValidMember(address)","2b028bbb":"LKCExchangeRate()","2b02d9af":"NIMBUS()","2b03b8d4":"IMDEXdeposit()","2b03d70e":"undisputeFavor()","2b04451a":"totalExtraOptions()","2b048f77":"getMyDeployAt(uint32,uint32)","2b04b478":"removeUsersFromGroup(bytes32,address[])","2b04d8f7":"takeOffer(uint256,address)","2b04e840":"getBalance(address,uint256)","2b05d346":"CallScheduled(address)","2b069816":"getJobValue(uint256)","2b071e47":"spread(address[],uint256[])","2b07682a":"withdrawFoundersTokens()","2b086b92":"convertToTMEX(uint256,address)","2b08fef7":"buy_token(address[],uint256)","2b093fe9":"TOKEN_MULTIPLIER()","2b0999f3":"initialYear()","2b09e707":"amountHives()","2b0aa1ed":"updateEthFee(uint256)","2b0ac7c4":"_createToken(uint256,uint256,uint256,uint256,uint256,address)","2b0cb194":"mintRawTokens(address,uint256)","2b0d0180":"luckyBuy()","2b0d0c6a":"afterFirstRefundRoundFundsReleaseNumerator()","2b0e16bf":"PRESALE_BALANCES()","2b0e64b3":"determineCommissions()","2b0ebfe9":"activatedJuryTokens(address)","2b0fbf72":"getMobster(uint256)","2b0fd89e":"ARcoin()","2b0fdb72":"MINIMUM_MANUAL_SIGN_PERIOD()","2b0ff02d":"listCard(uint64,uint128,uint128,uint24)","2b100a31":"setStatsSumHours(uint256,uint256)","2b1071c9":"testTransferToNullAuthority()","2b112e49":"getCirculatingSupply()","2b11e7f6":"SILVER_AMOUNT_SKL()","2b124245":"selfRegisterDINsWithResolver(address,uint256)","2b12553b":"saleExchangeRate()","2b13d799":"redeemedList(uint256)","2b1453dd":"addSwap(string)","2b146407":"PrivateSale()","2b14b712":"addClient(address,address,uint256)","2b14ca56":"sellFee()","2b151096":"placeSaleOrder(bytes8,bytes8,uint256,uint256,uint256)","2b15eb9b":"TongTong(string,string,uint256)","2b16b56a":"setIndex(uint256,uint256)","2b16f1ef":"nextPoolPercentage()","2b17355e":"balancesPrivate(address)","2b17b6a9":"bnbToken()","2b1841d2":"openCdp(uint256,uint256,uint256,address)","2b1857a5":"dividendPathways(address,uint256)","2b190f18":"getFreeTokens()","2b193ac4":"INITIAL_AC_SUPPLY()","2b198366":"addCertifier(address)","2b198808":"BloccaConto(address,bool)","2b1c511f":"getAvailability(address)","2b1c6982":"testTemp2()","2b1dd8da":"refundFees()","2b1e27f1":"migrateDomain(uint256,bytes32)","2b1e5016":"releaseTheHodl()","2b1ed01a":"warehouses()","2b1f7660":"PRZTToken(uint256,string,uint8,string)","2b1fcc10":"impl_cancelOrder(address,uint256,bool)","2b1fd58a":"acceptBid(uint256)","2b20e397":"registrar()","2b214618":"listAllBuyBalance(address,uint256,uint256)","2b21502f":"totalEthRcvd()","2b21d01b":"rateBTCxETH()","2b223264":"BitcoinBrand()","2b22a18c":"allocate8ProjectToken()","2b232741":"pullFromCirculation(uint8)","2b2443db":"canRaiseUsing(uint256)","2b2449b5":"setMaxCAP(uint256)","2b24aa6e":"rateA()","2b252d17":"_randomize(uint256,uint256)","2b25303b":"USDTUBE()","2b25a7e4":"giveKudos(address,uint256)","2b28d2d0":"totalFrozenAccountsMapping()","2b291eb6":"UserAddTicket(bytes)","2b29532b":"distributeLCASH(address[],uint256,uint256)","2b297f9e":"registerDao(address)","2b29908d":"BGB_address()","2b29fbfa":"testFail_voterNotCertified()","2b2b2882":"mintIcoTokenMultiple(address[],uint256[])","2b2badb3":"getAuditor(address)","2b2c71af":"doTradeofCollateral(address,address,uint256,uint256,uint256,uint256)","2b2c91b9":"refundApprove(address,uint256)","2b2dc12e":"RECEIVER_PAYOUT_THRESHOLD()","2b2e7159":"typeB()","2b2e76f3":"LA_wallet()","2b2f4d84":"setVestingParams(uint256,uint256,uint256)","2b2f88a8":"quantidadeDeAutorizacoes(address)","2b2fbd68":"minTicketEur()","2b302b60":"fairymasterReq()","2b30a84e":"rollTwo(address,uint8,uint8)","2b30d2b8":"invoke(uint256)","2b318568":"AddDynamicProfit(address,uint32,uint256)","2b321633":"testCloseChannel()","2b3297f9":"swapper()","2b337152":"totalissue()","2b343100":"newPlayerFee()","2b359e6b":"fundingTokens()","2b35d08a":"_computePrice(uint256)","2b36316e":"updateStageCap(uint256)","2b36a657":"profits()","2b379218":"globalDailySupply()","2b37d313":"tdeIssuer()","2b38ee56":"exitFee_()","2b3a4ae3":"adjustFeeEntitlement(address,uint256)","2b3b885d":"BGJC(uint256,string,string)","2b3c7562":"tierThreePurchase()","2b3da717":"BOBOTOKEN2()","2b3eae40":"MatchmasterTakeover(address,address,uint256)","2b3eb76c":"awardAmountPrime()","2b3ed526":"setFiatContract(address)","2b3ede1c":"WithdrawAll(address)","2b3f9f01":"_setSpendAvailable(uint256)","2b3fbbbb":"setPixelColor(uint16,uint16,uint24)","2b3ff9e9":"DLVO()","2b4143bd":"BasketRegistry()","2b4158cb":"buyFreePixels(uint256,uint256,uint256,uint256)","2b41a901":"grandTotalAllocated()","2b423b05":"changeRequiredMinor(uint256,bool,bytes)","2b42a89a":"setWhitelistOnlyPermission(bool)","2b42f4b2":"TokensCreated(address,uint256,uint256)","2b435366":"fund(address,bool)","2b4353f2":"payoutRate()","2b44d05f":"LISA()","2b44e5be":"distributeTokenToAddress(address,address,address,uint256)","2b44fd38":"dayLimit_()","2b455ac6":"insertMilestone(uint8,uint256,uint256,uint256)","2b459e81":"SpermLabsReborn()","2b45bcf9":"minimumHydroStakeUser()","2b4656c8":"initialize(address,address,address,uint256,uint256,uint256,uint256)","2b46e7f8":"SLUTZToken()","2b47571a":"resetWithdrawTimer(uint256)","2b47cb17":"TopToken()","2b49c9c2":"updateBanqueAddress(address)","2b49d425":"currentProposal()","2b49d9e5":"setFighters(uint32,uint32,uint256[])","2b4a27cb":"fechPreAllSumNumForCandidate()","2b4a2d0a":"getInfoFromCreateAuction(bytes)","2b4a3b31":"doTransferFrom(address,address,uint256)","2b4a964b":"networkGrowthAmount()","2b4bdf76":"getBdpController(address[16])","2b4ca103":"TXQToken(address,uint256)","2b4cbcc3":"getCombat(uint256)","2b4d0450":"BaseToken(string,string)","2b4d7c3e":"getPositionLender(bytes32)","2b4e8413":"userNumber()","2b4f79b3":"buyMessage(bytes32,uint256,string)","2b5129f5":"WaterMeterAcorn(bytes32,uint8,uint256,uint256,uint256)","2b513549":"mokenNameBytes32(uint256)","2b514749":"getTeamPrice(uint256[])","2b5184a6":"addSponsorship(address,address,uint256)","2b5187fd":"STCC()","2b521416":"features()","2b549b82":"createAuction(uint256,uint256,uint256,uint256,uint256,uint256,address)","2b54c3ce":"addToken(uint256,string)","2b554142":"redeemMany(address[],uint256[])","2b556813":"twitterDropMultipleAmount(address[],uint256[])","2b5570ad":"PatientFactory()","2b5630c2":"displayvehicledetails(address,uint256)","2b57298b":"getDate(uint256)","2b577ec4":"PREMINE_RELEASE(address,uint256,uint256)","2b58072f":"getDatasetsCount(address)","2b58150b":"setLotteryDuration(uint256)","2b587555":"privateTransfer(address,uint256)","2b58e202":"tokensOfOwnerFromIndex(address,uint256,uint256)","2b5914fe":"setUserName(string)","2b596a23":"balanceOfShares()","2b597e4d":"updateBool(bytes32,bool)","2b59d1fc":"borrar()","2b5ad2ad":"secondTimer()","2b5af004":"appendDecryptedBid(uint256,uint256,uint256,address,address,uint256,uint256,uint256)","2b5b6872":"AIRDROP_AMOUNT()","2b5da915":"Property(string,string,uint256,uint256)","2b5daa86":"newModule(string,address,bool,bool)","2b5f227e":"encodeBytes(bytes,uint8)","2b5faebd":"_calcTokens(uint256,uint256)","2b5fc4ce":"RSUNToken()","2b603c71":"allowances(address)","2b6133f5":"checkTierCap(uint8,uint256)","2b625874":"distributePeerTokens()","2b62ef2a":"CryptoCurrencyToken()","2b633f77":"ballotCancelingThreshold()","2b644ac8":"_setAvatarIfNoAvatarIsSet(address,uint256)","2b65d18a":"wireLimit()","2b65e040":"ownerPool()","2b664d8a":"getUsersByDocHash(bytes32)","2b680932":"ANNOUNCE_WINNER_DEADLINE()","2b68b9c6":"destruct()","2b68bb2d":"cancelContract()","2b68fc21":"guarenteedPaybackTime()","2b69f40d":"PaymentServ(address,address,address,address)","2b6a8b46":"addSpace(uint256,uint256,bytes,uint256,uint256,uint256,uint256,string,string,uint256)","2b6aa69d":"NewFunds(address,uint256)","2b6ada6d":"WalletWithDailyLimit(address[],uint256,uint256)","2b6b7c69":"airdropIndividual(address[],uint256[],uint256,uint256)","2b6bbc31":"testingOnly()","2b6bc920":"answerRequest()","2b6bd13a":"ChainInfo()","2b6c750f":"loseSponsor(uint32,int256)","2b6d7706":"transferTokensManuallyToMany(address[],uint256[],uint256)","2b6d7a66":"hasActivePass(address)","2b708fc9":"usageFee(bytes32,uint256)","2b70faf1":"game_paused()","2b711051":"investorsCount()","2b713d71":"rankToAddress(uint256)","2b71b0e5":"getStat()","2b7216e5":"donateToCampaign(uint256,uint256)","2b726758":"ETIC()","2b72c5fc":"FANCY(uint256,string,string)","2b73a83b":"CBS(string,string,uint8,uint256,uint256,uint256,bool,bool)","2b741ed6":"claimedFees(uint256,address)","2b7423ab":"average(uint256,uint256)","2b747a29":"buy_tickey(address)","2b750f4f":"DIVISOR_PRICE()","2b75289b":"placeBet(uint8,uint8,uint8,int256)","2b7568d9":"admin_withdraw_all(address)","2b7582c0":"sendEthForReward()","2b76823c":"ICOBuyer(address,address,uint256,uint256,uint256)","2b770ee9":"Ddjtab(uint256,string,string)","2b774d46":"XWALLET()","2b78194f":"GAS_REFUND()","2b7832b3":"adminCount()","2b783bc8":"addCredentials(bytes32,bool)","2b785960":"testBitAndSuccess()","2b788e33":"MAX_BOUNTYTOKENS_AMOUNT()","2b790ee4":"calcProfitFromTotalWon(uint256,uint256)","2b791053":"getDailyLimitRemaining()","2b791d6e":"storedDividendsOf(address)","2b79d7ba":"testFailMoveWithoutTrust()","2b7ac3f3":"verifier()","2b7b3a6c":"createBuildingAuction(uint32,uint8,uint8,uint8,uint8,uint8,bool)","2b7be84b":"AfterSchoolCrowdsaleToken()","2b7c3138":"MANETokenPartnerCrowdsale(uint256,uint256,address,address,address,address,address)","2b7ce9cd":"updateThresold(uint256)","2b7d13cc":"withdrawRemainingToken(uint256,address)","2b7d177b":"isvalidOrg(address,address)","2b7dd488":"totalLBSold_GENERAL_3()","2b7e063e":"GenOutChipsNum(uint256,uint256,uint256)","2b7e2169":"getTotalSell(uint256)","2b7e4295":"invadePlanets(uint256,uint256[],uint256[])","2b7ec7fe":"getLotInvested(uint256,address)","2b81b8a4":"alreadyRegisteredMessage()","2b82714f":"deliverAngelsREDAccounts(address[],uint256[])","2b828e4a":"addTx(bytes32,bytes4,address)","2b82aed6":"setPayerAddr(address)","2b82cf1f":"unFroze(address,uint256)","2b84aabe":"trust(uint8)","2b84fe83":"reserveFeeToBurn(address)","2b85ed9c":"purchaseCount()","2b860e6d":"transferToThroughVariable(address,uint256)","2b861629":"storeBlockHeader(bytes)","2b865dea":"airdropTokenDistributionMulti(address[],uint256[])","2b86d48a":"MDKToken(address)","2b876784":"ZHOUToken()","2b877dfd":"sendCoin(bytes4,bytes32,bytes32,uint256)","2b878c7c":"KYCValid(address)","2b88c42d":"buyItem1()","2b88cbbf":"getExcludes(uint256)","2b8a1c00":"t2tokenExchangeRate()","2b8a1c5a":"setGuardian(address,bool)","2b8a36e0":"freezeTransferTime()","2b8a789b":"ChangeGameHidden(address)","2b8af65b":"INTERFACE_SIGNATURE_ERC165()","2b8b09d4":"REDGIL()","2b8b1bc4":"transferAndFrostTokens(address,uint256,uint256)","2b8b6667":"deregister(address[])","2b8bbbe8":"add(uint256,address)","2b8c8a20":"Sale(address,uint256,uint256,uint256,string,uint256)","2b8cc346":"acceptRequest(address)","2b8cd2f7":"withdrawUncommittedTokens(uint256)","2b8cd5c6":"getComponentSupport(uint16)","2b8d0cd7":"setIcostart(bool)","2b8e4df1":"vest(bool)","2b8f2042":"withdraw_funds()","2b8f7a49":"depositMoney(string)","2b8f899e":"OzoneToken()","2b901a0a":"getOwnerByName(bytes32)","2b90557c":"minSet()","2b905bf6":"TEAM_WALLET()","2b90bb3a":"distributeGoTokens(address,address)","2b9122df":"getTimeTillEnd()","2b913151":"secondCapEndingBlock()","2b919aa6":"validPurchaseSize()","2b920a6b":"CampaignAccountFactory(address)","2b925b25":"minimumInvestment()","2b92b8e5":"hashValue()","2b92c776":"cancelBuyOrder(address,uint256,uint256,uint256,uint256)","2b9530d8":"transferTokens(address,uint256[])","2b956ff7":"getUserId(address)","2b968958":"revokeOwnership()","2b96a0a1":"getGamesMeta(uint256[])","2b96c00e":"abortGame(address,uint256)","2b97c6e4":"Cilox()","2b98222e":"getInstitutionByAddress(address)","2b985942":"LittleStoreERC20Token()","2b985f7c":"testNegatives(int256)","2b9897fb":"smallCapLimitOf(address)","2b991746":"approveFor(address,address,uint256)","2b99a087":"getLpIsWorking(int256)","2b99db6a":"tokensApproved()","2b99f359":"carOfByIndex(address,uint256)","2b99f3e1":"setIsTurnDataSaved(bool)","2b9a5c34":"_getTileAt(int32,int32)","2b9a7fae":"_updatePlayerOverrideId(uint256,uint256)","2b9b7573":"MAX_TRANSFERS()","2b9be92e":"GanaTokenAirdropper(address)","2b9cb4f8":"uniq(uint64[])","2b9cd08b":"submitAddOwnerTransaction(address)","2b9ce01e":"currentIcoTokenPrice()","2b9e05d1":"Betportchain(uint256,uint256)","2b9e5088":"filterTransactions(bool)","2b9e98b1":"changeFundingPercentages(uint256,uint256,address)","2b9edee9":"softCapReached()","2b9fd446":"isHatchOnCooldown()","2ba00198":"setBaseCap(uint256)","2ba0ab78":"EyeToken()","2ba0b09f":"AddNewCategory(bytes4,uint8,uint8,address)","2ba11f2a":"CONVERSION_DECIMAL_FACTOR()","2ba1e439":"createOraclizeCallback(bytes32,uint256,uint8,uint256)","2ba25366":"mintInBatches(address[],uint256[])","2ba29217":"canExecute(uint256,uint256)","2ba2d714":"LordXChain()","2ba2ed98":"setMagicNumber(uint256)","2ba5390f":"isFirstPartReleased()","2ba5b90d":"get_number_of_DBs()","2ba665e5":"getDoc(uint256)","2ba6d8fe":"PRESALE_WEI_CAP()","2ba73c15":"setCOO(address)","2ba7910a":"provider1()","2ba7fc87":"tgeIssuer()","2ba8b7e4":"getMinimumAuctionPrice(uint256)","2ba8f526":"OfferToGuardian(uint256,uint256)","2ba96462":"supportsERC165Interface(address,bytes4)","2ba996a5":"getListedTokens()","2baa2c58":"disqualifyBid(address,bool)","2baab935":"Fuschain(address,uint256)","2baabbf7":"finalSupply()","2babd014":"sellSecond(uint256)","2bac0b3b":"vendingCreateCollectible(uint256,uint256,address)","2bac276b":"badgeTransfer(address,uint256)","2baeceb7":"decrement()","2baf2acb":"mintTo(address,uint256,uint256)","2baf4f22":"_safeFalse()","2bafc817":"EpietherToken()","2bb03ab9":"earlyPresaleEDUSupply()","2bb03f6d":"ValidateCitySnapshot(address,uint256)","2bb0e10b":"serviceAccount()","2bb14104":"myData()","2bb20f4a":"soulsSold()","2bb22480":"calculateDrugSell(uint256)","2bb3dcc8":"totalInvocations()","2bb4c7d5":"STribeToken()","2bb51a05":"EDEX(address,uint256,uint256,uint256)","2bb685bc":"kill2()","2bb6ccf1":"delAuditAddress(address,address)","2bb70e54":"lockMasterTransfers()","2bb768f0":"adminGetCityData(address)","2bb81546":"getClaim(string)","2bb9cb1d":"buyXid(uint256,uint256,bytes32)","2bb9ffef":"startBalance()","2bba2d6d":"changeInvitedReward(uint256)","2bbb44b8":"adminCreat(address)","2bbc50b5":"getTotalInvestedEur()","2bbc9396":"periodICOStage2()","2bbd3c93":"ART_CONTRACT_ADDRESS()","2bbd59ca":"messages(bytes32)","2bbd84e8":"totalPurchaseValueInWei()","2bbd88f3":"LOBO()","2bbd9530":"unregisterAddress(bytes32)","2bbdb18a":"hasEnoughApproval(uint256,uint256)","2bbe62d6":"createSetup(address,uint256,uint256,bool,address,uint256)","2bbeac91":"lockTokenHolder()","2bbf532a":"isUnlocked(address)","2bbf54e8":"isBuyStopped()","2bc06a92":"canSend(address)","2bc0fe34":"infoMining(address)","2bc24d52":"IXTPaymentContract(address)","2bc31ca4":"developers()","2bc3217d":"forbid(address,address,bytes32)","2bc3656c":"buyTokensPreSale(address,uint256)","2bc38531":"setup(string)","2bc3a349":"GWTCrowdsale()","2bc402fa":"TOTAL_PREALLOCATION()","2bc40f9a":"setAddressUInt8(bytes32,bytes32,address,uint8)","2bc43fd9":"claim(address,uint256,uint256)","2bc46f27":"getQuestionIndex(uint256)","2bc4aa1a":"showInvestEther(uint256)","2bc53254":"priceFci()","2bc542a4":"votePublic(address,bool)","2bc57d73":"_doTransferFrom(address,address,uint256,bytes,address,bool)","2bc588ee":"release(uint256[],uint256[])","2bc5ca7a":"fullCycleSellBonds(uint256)","2bc5f9cb":"updateRateInWei()","2bc6597c":"depositsTillNow()","2bc67bde":"MIN_TASK_VALUE()","2bc80f3a":"T()","2bc85d5d":"updateTokenPriceProvider(address)","2bc86dc0":"AddBankerRound(uint8)","2bc89ff6":"REV()","2bc8ba53":"solicitaPagamento(uint256)","2bcb849c":"updateFeeProvider(address)","2bcbdf7f":"s29(bytes1)","2bcbe1b5":"getCelebrity(uint256)","2bcc79a7":"MockDeed(address)","2bccf04e":"createSale1()","2bce9e7b":"updateToken(address,uint256)","2bcef221":"signOne()","2bcf300e":"LC(uint256,string,string)","2bcf5760":"addToken(address,address,uint256,uint256,uint256,uint256)","2bcf892c":"div32(uint32,uint32)","2bcfcd7b":"getBonusAmount()","2bcfe0a6":"FitToken()","2bd00610":"numberOfCyclePlayers()","2bd0bb05":"totalSpentPerDay(uint256)","2bd0ce0f":"cancelBuyTokenOrder(uint64)","2bd152f0":"_getCollectibleDetails(uint256)","2bd185e5":"appendTokenHolders(address)","2bd21738":"CAIDCrowdsale(address,address)","2bd2523e":"cooAddReviewer(address)","2bd2a965":"openNextSale(uint256,bytes24,uint256,bytes24,uint256)","2bd30ca3":"costContract()","2bd4aa40":"total_amount(string,uint256,uint256)","2bd543c7":"calcTimedQuota(uint256,uint256,uint256,uint256)","2bd55918":"confirm_token_deposit()","2bd57604":"claimPlotMultiple(uint256[],uint256)","2bd579fc":"ico(uint256,uint256,uint256,uint256,uint256[],uint256[])","2bd5a48d":"finishMintingToken(uint256)","2bd5e353":"phase3Duration()","2bd71875":"hasMissedCheckpointSubmission()","2bd75c3c":"sendMarketingAndRNR()","2bd7cd17":"killToken()","2bd928e4":"commonDeposit(address,uint256)","2bd9530a":"editGas(uint256,uint256)","2bd97c6d":"getDawexSignature(string)","2bda04c5":"autoFreeze()","2bda1a55":"frozenReserveTeamRecipient()","2bda2a49":"BHIMToken()","2bda4eee":"getBridgeValidatorsInterfacesVersion()","2bdad637":"tokensSupply()","2bdb0d92":"getShareToken()","2bdb33c3":"getNumberOfDisputedDealsProPatient()","2bdb7097":"setRate(address,uint256)","2bdbc0ce":"ContractTokensReclaimed(uint256)","2bdc05c5":"assertEq26(bytes26,bytes26,bytes32)","2bdcd90d":"claimChip(uint256,string)","2bdd2290":"setBlockNum(uint256)","2bdd530b":"holderReferalTokens()","2bdd5958":"Purchased(address,uint256,uint256,uint256)","2bddb9b5":"canTransferIfLocked(address)","2bddc31c":"coauthor()","2bde41e1":"submitRing(address[3][],address,uint256[7][],uint256,uint8[1][],uint8,bool[],uint8[],bytes32[],bytes32[],uint256,uint16)","2bde8e96":"getGPShashRandomValue()","2bdf66d5":"SmartToken(string,string,uint8)","2bdfbd39":"finaliseCrowdsale()","2be09561":"startMint()","2be10384":"_removeKey(address)","2be29d71":"addressPartnerships()","2be2ad3c":"logUniverseForkedCalled()","2be2d95e":"amountOfInvestments()","2be2f085":"getCostForRace(uint8)","2be32dbb":"categoryCount()","2be3d1c9":"_getDroneDefaultAbility(uint256)","2be4a903":"removeUsers(address[])","2be4f3f5":"boardCost()","2be4fd9c":"getRemainManus()","2be51660":"calcTime()","2be521b2":"increaseBalance(address,address,uint256)","2be52293":"setExchangeOracle(address)","2be596ee":"unpauseInternal()","2be5e93a":"TOTAL_SUPPLY_UPPER_BOUND()","2be64f51":"RegisteredCampaign(address,uint256,address)","2be65e2a":"getFree()","2be65e45":"setMarketingRates(uint256,uint256,uint256)","2be6d43c":"ARKTagger_1_00()","2be6ec1f":"NULL_ENCRYPTION_ALGORITHM_ID()","2be79833":"nonFungibleRegistry()","2be86e01":"jcrUsdRate()","2be8c2a5":"transferTokensTo(address,uint256)","2be8f373":"changeWLMWallet(address)","2be90846":"enableBonus()","2be98d38":"HourglassV2()","2be9da97":"getBestAngel()","2beaead0":"lastDivideRewardTime()","2beaf416":"ShareXERC20()","2bec76fd":"maxBetCoinDice()","2becb6f7":"STARTING_SPERM()","2bed55b0":"buildDSEasyMultisig(uint256,uint256,uint256)","2bed69e0":"founderPercent()","2beea5c5":"testhash(uint256,uint256)","2beeaca4":"whitelist(address,string)","2bef4595":"authorize(address,address)","2bf04304":"whitelistAddresses(address[])","2bf0aeda":"DigiToken()","2bf1aa1d":"EthHodler(string,uint8,string)","2bf1f9da":"restart(bytes32,bytes)","2bf29ddb":"EventRedeemRisk(address,uint128,uint256,uint256)","2bf34551":"setRate340()","2bf34e60":"getUuid(uint256)","2bf37c42":"addFunds(uint256,address)","2bf435f9":"myMethod(string)","2bf4760b":"getEthPerfit(address)","2bf4d812":"AumentaToken(uint256,address)","2bf4e53d":"getCurrentShareholders()","2bf59135":"addLootbox(address,uint256)","2bf5a2ea":"mintForFounders()","2bf6e0a5":"setContract(address,address)","2bf7299b":"setMaxParticipants(uint256)","2bf79c94":"getTokenByOwner(address)","2bf7d279":"shouldRevertWithReturn(bool)","2bf7f6ba":"privateSell1LockEndTime()","2bf81dd3":"NPTToken()","2bf82843":"pay(address,uint128,string,uint32)","2bf885f0":"addNote(bytes32,bytes20,string)","2bf8faba":"AimiToken(address,uint256)","2bf9ab0b":"getPresellUpToTime()","2bfacd62":"calculateLockedBalance(address)","2bfaf3da":"Oracle(bytes32)","2bfc33ee":"KDI()","2bfc4c69":"getStringValue()","2bfd2a13":"calculate_dividend(uint256,uint256)","2bfd2e06":"buyBasicUnit(uint256,uint256)","2bfd91d4":"getMessageSigner(bytes32,uint8,bytes32,bytes32)","2bfda313":"getFile(uint256)","2bfe243f":"minStartPriceForCommishAuctions(uint128[])","2bfea0e4":"unpauseTransfer()","2bfefd5c":"calcMultiStage()","2bff4b66":"reapFarm(address,address)","2bff5630":"coachTakeOff(uint256)","2bff5fc4":"Incomplete()","2bffc7ed":"add(string,address)","2c011e7b":"winning_month()","2c01bb1c":"LogNewOwner(address)","2c01d52b":"_createRegion(string,address,uint256)","2c027eb9":"getDeployArrayLength(uint256)","2c02d622":"precalculate()","2c035157":"calculate_minimum_contribution()","2c044779":"getPublic()","2c04bf0c":"transferIXT(address,address,string)","2c052031":"getInsertPointForNumTokens(address,uint256,uint256)","2c0657c2":"additionalBonusAmounts(uint256)","2c06862b":"setCanBuy(bool)","2c07398d":"registerObserver(address)","2c0784ce":"send_DividendToAddress(address,uint256)","2c089048":"tokenCreationInit()","2c08ab0c":"ENJCrowdfund(uint256,address)","2c08eb0b":"changeTokensPerEther(uint256)","2c0994c1":"getMicroWalletAddress(uint256)","2c09bef7":"priceSetter()","2c0a036b":"resetICO()","2c0a33ef":"BethereumToken()","2c0a3f89":"castVote(uint256,uint256)","2c0a5c08":"BuyIn()","2c0a7e33":"pendingEthWithdrawal()","2c0aadc1":"nextGameInitialMinBetSize()","2c0b9685":"distributeeBTG(address[])","2c0bec2f":"sendCurrentPayment()","2c0c6488":"AirTrafficController(string,address[],address,address)","2c0c8563":"SetCoin(address,address)","2c0d0dbe":"AddProduct(uint256)","2c0d4e70":"RYNOTE()","2c0e0054":"lockInGuess(uint8)","2c0e3850":"storeInContract(address,address)","2c0f13a7":"icoStartTimestampStage3()","2c0f7b6f":"numCampaigns()","2c0fc8cb":"registerHandle(bytes32)","2c10e90c":"update(address[],uint256[])","2c1169ac":"ELOT()","2c12cc79":"HuumanStandardToken(uint256,string,uint8,string)","2c1352cf":"contacts(address)","2c135b93":"marketCap()","2c138236":"reservedTokensWallet()","2c142511":"_offlineHash(bytes32,bytes32,bytes32)","2c145eef":"DutchAuction(address,address,address,address,uint256,uint256,uint32)","2c154345":"getParticipantStake()","2c16c6ca":"addPrivilegeAddress(address)","2c16cd8a":"record(uint256)","2c174073":"PeriodSale(uint256,uint256)","2c181929":"getChainWork()","2c183fad":"mintTokenWithUnit(address,uint256)","2c197985":"VirtualExchange(address,address)","2c199889":"request(string)","2c19d480":"emitAccessGiven(address,bytes32)","2c19fbbb":"getUserTX(address,uint256)","2c1b17e4":"BonBonToken(address)","2c1b38ee":"isValidTokenId(uint256)","2c1bcb4f":"ContractLocked(uint256,string)","2c1cf6f6":"updateTradeStatus(bool)","2c1cf78b":"ETHinvested()","2c1d68d4":"countStakeHolders()","2c1e064b":"_translateWSIC(uint256)","2c1e6e48":"getADminFromDutchProxy(address)","2c1e816d":"setAdminAddress(address)","2c1ea461":"nextController()","2c1eed5f":"isPlayer(address,address)","2c1f1f8f":"getFreeBalances()","2c1fecfe":"isRefundable()","2c1ff9f8":"mInviteAddr()","2c203edd":"getOrderDetails(uint256,uint256)","2c2146aa":"verify(address,address)","2c215998":"updateStatus(string)","2c21ec94":"ethUpdates(uint256)","2c2206e4":"setAuditReportHash(uint256,string)","2c22af02":"cidTokenSupply()","2c22f2e2":"burnSplitPercent()","2c237912":"processSellRequestFiat(uint256,uint256)","2c244618":"calculateVestedOptions(uint256,uint256,uint256)","2c24909c":"getVotedTokensPerc()","2c24ecc7":"BecToken()","2c2622db":"LOCK_SLOTS()","2c2689b5":"getModuleAddress(string,string)","2c270617":"TempleDonationTrackingNote()","2c270c7e":"tokensFor1EthP2()","2c276699":"CheckOut(uint256)","2c27e581":"publicEndTime()","2c28aa1b":"RATE_FOR_WEEK3()","2c28f579":"goLive()","2c296656":"changeRequiredDevSignatures(uint256)","2c297478":"prolongH(uint256)","2c29eedd":"startPrivateSale(address,uint256,uint256)","2c2aa66c":"PokeCentral()","2c2aecf5":"isProcessNeeds()","2c2b4358":"setPercentOfPool(uint256[])","2c2bc50b":"LOWIQ()","2c2ccdfb":"kittyCoreAddress()","2c2da3cf":"expPercentage()","2c2de40a":"setMaximumSellableTokens(uint256)","2c2e3abe":"allocateFoundersTokens()","2c2fdc35":"getBalanceFromRound(address)","2c305abf":"updatePlayedNum(address,address,uint256)","2c308714":"returnBetAndOffer(uint64)","2c321ea1":"abToken()","2c327538":"ProofOfDiligenceToken()","2c329e99":"Last_block_number_and_bloctime_used()","2c344d14":"tokenRewardPreDGZ()","2c349627":"pauseToken()","2c34ce05":"increasedPrice()","2c34e6b9":"addDepositQuest(address)","2c354067":"executionBlockOf(uint256)","2c3599a5":"VINToken()","2c3788b1":"registerUserIfNeeded(uint256)","2c37a512":"bountyLockEndTime()","2c39d855":"confirmAndForward(address,uint256,bytes,bytes32,uint256,uint8,bytes32,bytes32)","2c39da94":"batchSend(address,uint160,uint256[])","2c3a15a0":"EidosToken(address,address)","2c3a1d5d":"Nerotoken()","2c3af973":"GStarToken()","2c3ba9e1":"addManyRegistered(address[])","2c3c42b2":"WLM()","2c3ca924":"handleProductionIncrease(address,uint256)","2c3ccb98":"levelUpByPenguinId(uint256)","2c3d3453":"csale()","2c3d38f0":"mintTokens(int256,uint256,address,address)","2c3dcdcf":"issueDuringICO(address,uint256)","2c3dfca7":"getPhException(bytes32)","2c3ee88c":"getRedeemAmount(uint256)","2c3f1304":"getSlotLength()","2c3f6a4f":"getMineCooldown(uint256)","2c3f9b80":"getActiveFlagRate(uint16)","2c408059":"getFallbackAddress()","2c409871":"MobileTokenAlert()","2c416754":"doBurn(address,address,uint256,bytes,bytes)","2c420201":"getDataCounterForSubject(uint256)","2c421074":"exploreETHFee()","2c425687":"EthTeamContract(string,string,address,uint64,uint64,address)","2c42f2e8":"toSendFromStorage()","2c4449ab":"_rankByNumber(uint256)","2c445273":"_payEthereumAndDistribute(uint256)","2c4464d4":"Dryad()","2c4482c5":"_assignCountry(uint256)","2c44a261":"updatePrivateSaleCloseTime(uint256)","2c45f068":"transfer(uint128,bytes16,uint32)","2c4617d7":"getMethodState(string)","2c46b205":"query()","2c46d8d5":"EndRound(uint256)","2c47413f":"ERC20PGEToken()","2c4806d8":"ordersFor()","2c4879d1":"AFWBurn(uint256)","2c4881ff":"withdrawMoneyByAdmin(uint256)","2c48e7db":"confirmTransfer(uint256)","2c4a84f7":"StaxToken()","2c4ab666":"enact_withdrawal_greater_equal(address,uint256,uint256)","2c4ac770":"sendMessage(address,bytes,bytes32)","2c4aecc1":"sampleBoolRetFalse()","2c4b2334":"setTeamWalletAddress(address)","2c4b27ae":"burnAirDrop(address[],address)","2c4bca2c":"crowdsaleDeadline()","2c4bf8bc":"increasePresetTransfer(address,uint256)","2c4c2719":"MAXIMUM_CAP()","2c4cb4be":"removeRegistryFromNameIndex(address)","2c4d25f5":"DeathFactor_ii()","2c4d4d18":"changeMinter(address)","2c4e55c5":"killedContract()","2c4e591b":"totalGames()","2c4e722e":"rate()","2c4e8885":"unLinkFromMasterWalletInternal(address,address)","2c4e9d2b":"AuctionWon(uint64,uint64,address,uint256)","2c4ee4d4":"ObirumTalk()","2c4fa8b2":"assignAnotherOwner(address)","2c5104f5":"MTC()","2c511788":"addToWhitelistAllocation(bool,address,uint8)","2c512d6e":"getTokens(address,uint256)","2c526196":"_mint(uint256)","2c52d930":"feeForArtWorkChangeRequest()","2c532a71":"ChangeCrowdSaleDate(uint8,uint256)","2c5337dd":"winnerAnnounced(address,uint256)","2c53f31b":"bonusWindow2EndTime()","2c54357f":"lifeReserveAllocation()","2c54de4f":"transferToken(address,address,address,uint256)","2c54e6d9":"getCanvasCount()","2c560ec0":"queryInfo()","2c56462f":"addAllowedContract(address)","2c566ae5":"length(address)","2c572eb5":"_isFuture(uint256)","2c574a94":"next_tower_index()","2c577347":"changeMakeFee(uint256)","2c57fdf4":"create(uint8,uint8,uint64,uint64)","2c580a35":"revokeAndReclaim()","2c58139c":"teamRelease(address)","2c5a736f":"distributeInitialFunds()","2c5af544":"isAllocatedLending()","2c5b3b5b":"UniverseChain()","2c5c8f7c":"getDailyProfitSumForAllUsers()","2c5c9dc5":"BeldenCoin(address)","2c5cb666":"setCollectFeeWindowReportingFees(uint256)","2c5d0546":"KuaiToken(address,uint256)","2c5d690d":"getBlocksUntilReset(address)","2c5e52d1":"CandyDropIsOpen()","2c5f5234":"collateralisationRatio()","2c5fac89":"isIcoSucceeded()","2c6009a6":"viewPeerToPeerMarketplaceTransactionFee()","2c60a055":"MapTest()","2c6105f9":"setElectedMediator()","2c6127c7":"availableBets()","2c629299":"allOperations()","2c62fa10":"assetsOf(address)","2c62ff2d":"deleteBool(bytes32)","2c638806":"totalPaymentsHeld()","2c63b326":"memoryArray(uint256)","2c642950":"createBallot(string,bytes32[],uint256)","2c642f51":"sendDividends(address,uint256)","2c64b05f":"LockEDUTeam()","2c664701":"profit_per_token()","2c66a604":"Blizzard()","2c678c64":"migrated()","2c67a8e5":"getItemsByOwner(address)","2c684eb6":"afterVoteNoCashBackTime()","2c684f30":"postListed(address,string,string,uint256,string,string,string)","2c68fcd4":"determineBonus(uint256,uint256,address)","2c69e64e":"refundBet(address)","2c69ed89":"BerryLake()","2c6a0140":"cutoffBlock()","2c6b2c92":"checkProfitLossSinceInvestorChange()","2c6b77e1":"admin_isPayable(bool)","2c6c1108":"autoTearDownAndDestruct()","2c6e38d0":"modifyNextPremiumSale(uint8,uint256)","2c6e4aea":"withdrawFundBeneficiary()","2c6e7598":"toAsciiString(address)","2c6e879f":"settingsSwitchState()","2c6ed612":"stringToBytes5(string)","2c6f11b8":"listApproval()","2c6f39fd":"setLicenseSalesContractAddress(address)","2c6fa230":"getServiceInformation(address,uint32)","2c6fa84c":"Pausable()","2c7077c0":"enableFeatures(uint256,bool)","2c70b7ca":"emitEntityResolution(address,address)","2c70d64e":"unVote()","2c710cc8":"closeInvest(uint256)","2c71d524":"IcoBonus(uint256)","2c71e60a":"grants(address,uint256)","2c71ecb6":"_startBlock()","2c72fdfc":"getProposals(uint256)","2c735ef8":"tradeStartTime()","2c757eed":"startPhase3(uint256)","2c7622b0":"txorigin()","2c767201":"admin_account()","2c76d586":"zint_bytes32ToString(bytes32)","2c78ba6f":"ArbTokFromHGame(uint256)","2c78bfdc":"burnCrown(uint256)","2c791826":"moiTestToken()","2c792276":"endRound(uint8)","2c79aea3":"minedTotalSupply()","2c7a64c7":"isOperationActive(bytes32)","2c7a8559":"setMaxGift(uint256)","2c7b0085":"PocketChain()","2c7ba564":"setTransferProxy(uint32,address)","2c7c4549":"PurchasableToken(uint256)","2c7cc1f0":"emergencyEthDrain(uint256)","2c7cce9e":"auctionMinPriceIncrease()","2c7e06a4":"rateEarlyStage1()","2c7ec2c2":"_fulfillPayment(address,address,uint256,uint256,address)","2c7ee894":"B2Lab_TokenPlus(address)","2c7ee946":"setting(uint256,uint256)","2c8082a6":"PiBetaSupply()","2c828e46":"TransferToken(address,uint256,uint256)","2c837334":"getPlot(uint256,uint256)","2c83d77e":"goforit()","2c84bfa6":"generate(address,bytes)","2c84d560":"OwnerWithdraw()","2c84e31f":"addAccounts(address,address,address[])","2c85448d":"isInt256ValidIn64(int256)","2c854d13":"AUTH_REMOVEOWNER()","2c8595bc":"updatePartnerMap(address,uint256,uint256,uint256)","2c85f8e0":"oraclize_query(string,string,string,uint256)","2c86033e":"checkAddressTeamOne(address)","2c8668d4":"withdrawNoLimit(address,uint256,uint256)","2c868287":"withdrawToTeamStep3(uint256)","2c86d091":"buyTokens(address,bytes32)","2c86d98e":"leverage()","2c86e3b4":"setContributor(string)","2c873761":"getMyDragons()","2c87aecc":"orders_sell_list(uint256)","2c87ba12":"getTitulaire_Compte_2()","2c882333":"vota_un_candidato(uint256)","2c887399":"confirm(bytes32,bytes32,bytes32,uint8,bytes32,bytes32)","2c88837e":"VotingRightsWithdrawn(address,uint256)","2c88fad9":"addWhitelistedAddr(address)","2c890550":"toPower2(uint256)","2c899ab6":"CecCoin()","2c89a84c":"ChronosAccessControl()","2c8ab429":"registerMeDao(address)","2c8ace6c":"TokenERC20(uint32,string,uint8,string,address)","2c8af2d8":"s_rand(address,uint256)","2c8b2ad7":"calculatePaymentGoal(uint256,uint256,uint256)","2c8b8b94":"addAccreditedInvestor(address,uint64,uint64,bool,bool,uint256,uint256)","2c8bcd1a":"createBid(uint256,address,address,bytes32,uint256,uint256)","2c8be60e":"ONO()","2c8c047a":"ownerOperationsAt(address,uint256)","2c8c28a7":"loadNewTickets(bytes32[])","2c8c892b":"allocateSalesTokens(address,uint256)","2c8ca0ea":"isFinish()","2c8cbe40":"setFreeze()","2c8df693":"ServiceProviderEnabled(address,bytes)","2c8e3ebb":"secondRefundRoundRateDenominator()","2c8ed4c4":"_toToken(uint256,uint256,uint256)","2c8ee2ec":"checkWin(uint256,address)","2c8f1b71":"socialIdentityOfClaimerAddress(uint256,address)","2c906ba2":"finishLottery()","2c90ccba":"getNextAuditByPrice(uint256,uint256)","2c91324c":"usersAddress(uint256)","2c915aa3":"assetAddresses()","2c92a2bc":"minWithdrawalThreshold()","2c92c071":"_addPayTable(uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16)","2c92e5b7":"BlockspacesToken()","2c92fb99":"getFilter(uint256)","2c948034":"longTermbudgetAllocAddress()","2c94a235":"profitTransferTimeSpan()","2c95ad52":"addItem(bytes32)","2c960569":"updatePriceOraclize()","2c9619ce":"FCOIN1036Token(uint256,string,string,uint256)","2c96bee2":"MultiSigTokenWallet(address[],uint256)","2c9868df":"approveAndCall(address,uint32,bytes)","2c98bf4a":"WelcomeMsg(string)","2c995e1b":"AllowTransferGlobal()","2c9a0a95":"getPricingStartsAt()","2c9a86d2":"payCarnita(uint256,uint256)","2c9afb18":"addrFabricContract()","2c9b1625":"FUTMOTO()","2c9c0fb5":"modifyTransferableHash(address,bool)","2c9cdfd9":"Provider(string,string)","2c9d6989":"withdrawDklBalance()","2c9ea1b7":"nextSkinId()","2c9f092f":"refundToOwner(address)","2c9f4f62":"isPurchased(uint256)","2c9f6792":"emaPeriods()","2c9f9fed":"tokenInit()","2c9fcd8c":"Donator()","2ca0228a":"initialTokenPrice()","2ca0c835":"referrerBonusCalculate(uint256)","2ca0d7ca":"batchTransfer1(address[],uint256)","2ca126f8":"endtime()","2ca15122":"sign()","2ca16a37":"publish(bytes32,string,uint256)","2ca1aa16":"currentSaleLimitPerAddress()","2ca1b7da":"CROWDSALE_ETH_WALLET()","2ca23c4f":"KapelaToken()","2ca2537e":"changeNotSoldTokens(address)","2ca26866":"Tccchain(uint256,string,string)","2ca33e70":"YoutubersCoin()","2ca36da0":"left39(uint256)","2ca38363":"priceEth()","2ca59abf":"changeCollateralTaker(address)","2ca5a623":"change_flag(uint256)","2ca5e3f5":"replyAlice(uint256)","2ca5e626":"getOrder(uint32[8])","2ca60d85":"versionIdent()","2ca6d2c0":"getAccountSize(address)","2ca76003":"checkWinner(uint32)","2ca781f1":"firstPay()","2ca8c6d3":"numberOfBets()","2ca8cbd0":"minePhx()","2ca9cbe8":"distributeToken(address,uint256)","2caafb54":"totalFreezeTokens()","2cab00de":"buildPrice()","2cab6c6a":"editTile(uint16,uint16,uint8,uint16,address)","2cacb97c":"GetProfitEarnedByPartner(address)","2cacd13a":"takeOrder(uint256,uint256,uint256)","2cad9404":"salvageFinished()","2cae0c76":"crowdSaleIsOver()","2cae249a":"rvDepositAddress()","2cae66d8":"encodeRequest(uint128,address,address,address,uint256,uint64,address,bytes)","2cae8ae4":"getPayload()","2cae9add":"rawTokenSupply()","2cae9ca1":"spendWithGas(address,uint256,uint256)","2caeb8fc":"checkMyUndistributedBalance(uint256)","2caef765":"setBoardController(address)","2caf1f15":"set_tickerQuery(string)","2cb0d48a":"setEditable(bool)","2cb0de18":"setFeeAccountToken(address)","2cb15864":"initialBlock()","2cb2f52e":"updateTokenMetadata(uint256,string)","2cb3ce8c":"TIER3_RATE()","2cb44156":"minterGivesCWC(address,uint256)","2cb4f63e":"price_target()","2cb51970":"_batch4_icosaleStartTimestamp()","2cb58378":"getStateRoot(bytes32)","2cb676be":"NVBSupply()","2cb6a435":"oneTimePrice()","2cb71af3":"startBuyback(uint256,uint256)","2cb8460c":"PlutusDex()","2cb856f3":"dgxContract()","2cb86824":"preIcoStartAt()","2cb8f2e9":"executeBet(uint256,bool)","2cba85c6":"popcontract()","2cbb827f":"withdrawToSelf(uint8)","2cbbbd2d":"SHIPToken(address,address)","2cbbd738":"getPoll(bytes32)","2cbcaba9":"SimpleICO()","2cbdb5fb":"addChunk3ToWhiteList()","2cbe679b":"Travelerscash()","2cbef0f3":"getAffiliateCommission()","2cbf1b12":"CirclePay()","2cbf1f0d":"left62(uint256)","2cbf4e27":"removeParticipant(address,address)","2cbf9cf6":"MintableToken()","2cbfd034":"intCallWithArray(uint8[4])","2cc0a28c":"_matchedTags(bytes32[],bytes32[])","2cc0b254":"init(address,bytes32)","2cc138be":"rewardStartTime()","2cc1b92a":"addr_communityBuildingToken()","2cc205d9":"totalStakedFor(address,address)","2cc27341":"setMinMargin(uint256)","2cc361a6":"removeTank(address)","2cc53743":"GxEvents(address)","2cc5cfd6":"withdrawDevelopersFund(address)","2cc5d662":"arawWallet()","2cc63332":"returnCoupon(address[2],uint256[8],uint8,bytes32[2])","2cc689f9":"markRewardsSet()","2cc695de":"addCertification(address)","2cc6cf4a":"BABI()","2cc6d768":"RecordingRefundVault(address)","2cc75331":"getTeamsOnLeaderboard()","2cc763e7":"milliPercent()","2cc7c475":"TokenSaleCreation(uint256,address)","2cc7fc36":"ICOPurchased(uint256)","2cc82225":"setPriceCreatingChannel(uint256)","2cc82655":"setPhase(uint256)","2cc88401":"wirePurchase(address,uint256)","2cc8b455":"recoverAddressFromWithdrawMessage(bytes32,address,uint256,bytes)","2cc92b2b":"isICOOpened()","2cc9636c":"buyerCancel(bytes16,address,address,uint256,uint16)","2cc9c151":"verifyOwnership(address)","2cca179d":"addPoll(uint256,uint256,bytes,uint8)","2cca23f1":"Timeless()","2cca5ce3":"setEngine(address,bool)","2cca664b":"totalPlayerWinnings()","2cca75d3":"StupidCoin()","2ccaa3e9":"getPropertyOwner(uint16)","2ccb1b30":"transferTo(address,uint256)","2ccbd053":"set(uint256,string,string,string,string,string)","2ccc452d":"pushByte(bytes32)","2ccc9057":"RATE_CROWDSALE_S3()","2ccce58a":"cancelGame(string)","2ccd0991":"extraData1FromHash(string,string,string,string,string)","2ccd9623":"referralManager()","2ccdbc25":"prometheusVouchersMinted()","2ccde4bd":"withdrawAllUncommittedTokens()","2cce0c60":"eth_to_usd()","2cce4abe":"_finishNoCallback()","2cce753a":"batchAddAddresses(address[])","2cce81aa":"getBlockHash(int256)","2ccf16f9":"CashPoints()","2ccf27bb":"PatrickHuynhToken()","2ccf8d40":"HVAL()","2ccfc58c":"FeesReceived(address,uint256)","2cd046eb":"countMembers()","2cd05122":"ZENOSEarlyPurchase()","2cd05248":"lastBlock_f3Hash_uint256()","2cd11849":"depositAdvisor(address,uint256)","2cd1bab2":"partnerID()","2cd2338f":"thawAddress(address)","2cd33a54":"eth_amount()","2cd3fd70":"BurnTokens(uint256)","2cd44064":"UNHCToken(uint256,string,string)","2cd53cfe":"addEducation(string)","2cd6305f":"unsellpause()","2cd64f65":"TokenMintGeneral()","2cd78450":"activateExportFeeChargeRecord(address)","2cd8c9ae":"fillPhase(uint8,uint256,uint256)","2cd9e233":"Quarters(address,uint256)","2cda1bf7":"titles(uint256)","2cdad41c":"isInspector(address)","2cdb0213":"dailyHourLimit()","2cdb8eec":"updateTokenValue(address,uint256)","2cdba70e":"_getMaxPooling()","2cdc1c74":"lister()","2cdcb1fc":"wrongManagerOrUnsetInClaimer()","2cddc488":"transferTaxes(address,bool)","2cde15d1":"weiTotalRaised()","2cdedd5c":"StateChannel(address,address,address,address,uint256,bytes)","2cdf2bfd":"sellPatent(uint16,uint256)","2cdf37d4":"_admin(uint256,uint256)","2cdf55af":"RC()","2ce04b20":"tokenLockoutPeriod()","2ce0a6ee":"setBalanceLimit(uint256)","2ce0b4f6":"ICO_FINISH()","2ce0ca6b":"setChainFees(uint256[10])","2ce14d90":"_willFallback()","2ce1ec67":"HelloCoin(uint256,string,uint8,string)","2ce20579":"mutagen2Face(uint256,uint256)","2ce21999":"fees_(uint256)","2ce2907b":"CryptoCourt(uint256,string,string)","2ce2d7c0":"completeRegionAuction(uint16)","2ce37b10":"getListCount()","2ce3d440":"updateAccount(address)","2ce47de4":"payWinners(uint32,uint32,uint256,bool,uint32,uint32)","2ce52d9b":"shareCycleSessionSize()","2ce5c284":"processed()","2ce5fb75":"getHorseShoe(uint256)","2ce68269":"registerByList(address[],bool)","2ce78fc0":"getDemande(uint256)","2ce7900b":"getTokenTimelockCount(address)","2ce82189":"balanceTransferred(address,uint256,bytes)","2ce90c11":"killTokens()","2ce91d08":"TokensWorld()","2ce92dfd":"updateMinGasForDrawing(uint32)","2ce946a5":"teame()","2cea0654":"setStateClosedIfClosed()","2cea53bd":"returnChametz()","2cea70e4":"isAds()","2cea905a":"IAMEPrivateSale()","2cea9442":"totalUsdRaised()","2cead42c":"_createIntention(address)","2cead658":"Companion()","2ceae552":"AVAILABLE_BONUS1_SUPPLY()","2ceb1bb3":"addPreEntranceMembers(address[],uint256,uint256)","2ced7cef":"log(string,string,string)","2cedc5ec":"enableTokenAiTransfers()","2ceee12e":"seeBidders()","2cef4dac":"updateMasterCopy()","2cefc429":"sellCard(uint8,uint256)","2cefeb07":"setname(string)","2cf033a0":"setNewTokenAddress(address)","2cf0be44":"transferToService(address,uint32,uint256,uint256,uint256)","2cf0d6ca":"PLAT()","2cf1a5fb":"airdropStatus()","2cf2f1d1":"rndReduceThreshold_()","2cf32bc9":"PayoutEarnings(address,uint256,uint8)","2cf3f1f3":"setTokenPerEther(uint256)","2cf42a6c":"cancelHybridization(uint256)","2cf45905":"addHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[])","2cf4db51":"amountVote(bool,uint8)","2cf4e56f":"withdrawBounty()","2cf5346a":"totalSupplyAt(uint256,int256)","2cf5fe89":"maxChildCount()","2cf65a06":"logite(string)","2cf6b532":"STARL()","2cf6e740":"adminSum()","2cf75c11":"_generateLog(uint32,uint8,uint32,uint8,uint8,uint8)","2cf86006":"calculateDividends(uint256)","2cf8a1d6":"CCRToken()","2cf91024":"getFlightInfo(uint16,uint16)","2cf9185c":"getMyPlayedCount(address)","2cf975af":"isPreferredTokensAccount(address)","2cf99422":"publish(address)","2cfa606d":"tvcEthFund()","2cfa74da":"buyKeys(uint256,string)","2cfac6ec":"teamSupply()","2cfbb031":"claimReward(bytes)","2cfbd0b9":"addNewBlock(bytes32,bytes32,bytes32[])","2cfc1f4c":"updateGift(uint256,uint256,string,string)","2cfc42f5":"blacklistParty(address,address,bool)","2cfd10a0":"CrowdsaleMain()","2cfd3005":"mint(address,bytes32)","2cfd35bb":"employeeMigratesToNewESOP(address)","2cfdd7df":"newReward()","2cfed9f0":"setSpeaker(address,address)","2d0041c5":"setAmbassador(address,bool)","2d00b442":"_createBid(bytes32,address,uint256)","2d0104a5":"updateFirstDuel1(uint256)","2d014833":"e93Contract()","2d01564c":"littContentExists(bytes32)","2d019a71":"get_asset_info(bytes32)","2d021624":"BTBToken()","2d02a5b2":"setGoldPrice(uint256)","2d0335ab":"getNonce(address)","2d03c4eb":"nxcPerBcy()","2d040add":"updateRegistrationState(bool,uint256)","2d042a7f":"PonziRevolutionBeam()","2d045780":"isAllowedToBuyByAddressWithoutVerification(address)","2d04d07d":"goTokenCollection()","2d04f820":"DEV_WALLET()","2d06177a":"addManager(address)","2d062140":"SiringClockAuction()","2d067d4c":"isBurn()","2d06a1fa":"ALFA()","2d06fd13":"getTotalDeveloperCut()","2d077ad0":"Latch()","2d07bf2f":"CryptoHarborExchange()","2d087944":"hasBuyNowOffer(uint256)","2d08d408":"Send(address[],uint256[])","2d09839f":"tokens_push(address)","2d0a8809":"testAddVoters()","2d0b1451":"DevotteToken()","2d0b7d53":"registerVariation(uint256,address)","2d0cc13c":"MoonMinerToken(string,string,uint8,uint256)","2d0d4827":"startIco1(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","2d0d9c2a":"getCompletedGamesStatistics()","2d0d9e0f":"getUserProductsKeys(bytes32)","2d0daca8":"assertEq25(bytes25,bytes25,bytes32)","2d0e6636":"tokenToEtherAllowed()","2d0f5573":"right35(uint256)","2d0ff779":"claimEOSclassic()","2d103ed4":"addAllowedHICAddress(address)","2d10d4d1":"getCityActiveBuildings(uint256,uint256)","2d116186":"deityBalance()","2d118bbf":"getUserPaybackPool()","2d11fa16":"throwsWhenTransferingPresaleTokensBeforeCliff(address)","2d123aa4":"useDefaultRegistry()","2d126239":"calcAndGet()","2d126d2b":"indCommunityDeposit()","2d132467":"buyPreIcoTokens()","2d133eee":"KYC_THRESHOLD()","2d136dd6":"TrillionToken()","2d139417":"migrateToNewNewControllerContract()","2d13c164":"_computePayMoney(uint256,address)","2d144e6b":"totalPlayerSupply()","2d1608db":"YouLongToken()","2d162c70":"distrust(address,uint256,bytes)","2d171243":"getUnitsProduction(address,uint256,uint256)","2d17d956":"buildRequest(string)","2d19413c":"setJackpotToken(address,uint256,uint256,address,uint256,uint256,uint256)","2d1a330b":"marketmorties()","2d1a6477":"lengthEqual(address[],uint256,string)","2d1a67e1":"Ledger(address,uint256,uint256)","2d1b42f5":"encryptCounter(uint256)","2d1babed":"setRates(uint256)","2d1c56a9":"totalTxVolume()","2d1ced82":"priceBox1()","2d1d744a":"isPass()","2d1d9627":"changeAddress(bytes32,address)","2d1d9feb":"removeRRA(address)","2d1e0516":"setBal(bytes32,address,uint256)","2d1f0021":"NextItemID()","2d1f0097":"getData_18()","2d1fb389":"authorize(address,bool)","2d1fdef6":"extendDeadline(uint256,uint256)","2d202d24":"setNextOwner(address)","2d20fbf3":"ownedBonus(address)","2d215518":"pause(uint256,uint256)","2d217d43":"AntasCoin()","2d21ca88":"ICOTokenHardCap()","2d226a10":"allocateServusTokens()","2d22a4e3":"isPrivateInvestmentPhase()","2d22b464":"createEgg(string,bytes32)","2d241248":"getFeeBurnerAddress()","2d24447a":"LBCoinJ()","2d247cc6":"coinPriceInWei()","2d278518":"EtherReceived(uint256,address,uint256)","2d278e9e":"picosPerEther()","2d27c8cd":"ALLOC_SALE_GENERAL()","2d2800f1":"react()","2d287e43":"insert(bytes32)","2d2899b6":"getIntArray(bytes32)","2d28bb02":"setTokenStart(uint256)","2d28d4cf":"transferIfTokenAvailable(uint256,uint256,address)","2d28e89d":"MINIMUM_DURATION()","2d290d8b":"MAX_CROWD_SALE_TOKENS()","2d2925c7":"transferInitialTokens()","2d296bf1":"buyToken(uint256)","2d29842c":"upgradePhoenixStats(uint256)","2d29953f":"withdrawByFoundation(address,uint256)","2d29b29b":"migrateSome(address[])","2d29c72d":"stopUpgrading()","2d2bb154":"kycWallet()","2d2bcd37":"setRelayContractAddress(address)","2d2c44f2":"Vault()","2d2c5565":"TREASURY()","2d2c9ed8":"softcapReachedCallabck()","2d2d23f7":"Cordbank()","2d2e3bb2":"deleteFincontract(bytes32)","2d2f7e4d":"withdrawBidForStar(uint256)","2d2f8f9b":"getAddListSize()","2d2fa531":"hank()","2d2fe9d4":"stakeWaived_Eth()","2d30ae45":"distributeCrowdsaleTokens(address,uint256)","2d31908f":"PRICE_7()","2d31d9c9":"sales(bytes16)","2d31f270":"UNTToken()","2d328551":"numberOfHalvings()","2d345670":"revokeAdmin(address)","2d345799":"balanceOfPretty(address)","2d349a1f":"icoLtc()","2d34ba79":"setup(address,address)","2d354cf8":"_isContract(address,address)","2d358710":"HARJToken(address,string,uint8,string)","2d35a8a2":"candidatesCount()","2d364687":"toLucky()","2d36ad42":"cleanUp(address)","2d370378":"switchSaleAuctionERC20For(address,address,uint256)","2d3727bf":"CloseDiv()","2d37329a":"lastBlock_v4Hash_uint256()","2d37e6dc":"getCrowdsaleInfo()","2d381f84":"ATTR_GOLDENGOOSE()","2d38bf7a":"rewardEra()","2d3a926a":"computeCut(uint256)","2d3b3141":"ERC20Standard(uint256,string,string,bool)","2d3b4643":"coresale()","2d3b634c":"Crowdsale(uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","2d3b9e59":"isFinished(uint8)","2d3c5d28":"DonatedEthPayout(address,uint256)","2d3cb6bd":"mulX(uint256,uint256)","2d3d165d":"parameterizerFactory()","2d3d403a":"challengeContract(address,address,address)","2d3e2065":"minBetWei()","2d3e474a":"marketing()","2d3e579a":"hasRole(address,bytes32,address)","2d3e9efe":"mint(int256,bytes32,bytes,uint256[],bytes,bytes)","2d3ec656":"setMinimumIcoRate(uint256)","2d3ed075":"Certificate(bytes32,string)","2d3fb0d5":"getCrowdsaleState()","2d3fb721":"secondRoundICODiscount()","2d3fcc23":"beingVIP()","2d405b43":"Win(address,uint8,uint256,bytes32,bytes32,uint256)","2d40957f":"TheWinner()","2d4147e3":"bountyToken()","2d416b4d":"bindCertificate2Wallet(address,bytes32)","2d41777f":"SnapshotUpdated(address,uint256,uint256,string)","2d4194c7":"getAuditRequestBlockNumber(uint256)","2d41bc9b":"store(uint8[],uint256,uint256,uint256,uint256)","2d41c7a4":"Nikone()","2d434139":"addCustomerNReqAcc(address,address,address)","2d43573d":"landmarks(uint256)","2d4364ae":"placeTokens(address,uint256)","2d448c49":"setO2(address)","2d449b5e":"Etokenchain()","2d44c049":"modifyCreator(address,bool)","2d459dd6":"transfer(address,uint48,bytes)","2d45c78d":"requireAuthorisation()","2d46253f":"CommunityWithDraw()","2d462dbb":"rollLo()","2d467358":"LAPTOPTOKEN()","2d46a9ce":"getVestingCreatedAt(address,uint256)","2d46b54e":"hashMsg(bytes32,address,bytes32,address,uint256,bytes32,string,string)","2d46f5df":"registerProduct(address)","2d475386":"ownerWithdrawUnclaimedCredits()","2d47adcb":"BancorNetworkToken()","2d47c29e":"otherchainstotalsupply()","2d480a80":"thankYou()","2d483bec":"setNewRate(uint256)","2d48bcec":"pool_drain(address)","2d493910":"_computeNextPrice()","2d49f5fc":"verifyERC20(address)","2d49ffcd":"getLocked()","2d4a170a":"calculateBid(uint256)","2d4c4aea":"GOTGCOIN()","2d4d671f":"startRevealingPhase()","2d4e4472":"LandClaimExecuted(address,uint256,bytes)","2d4ede93":"deleteNode(address)","2d4f40c6":"setBotAddress(address)","2d4fd9dd":"rejectDispute(uint256)","2d501611":"PERCENT_BONUS()","2d50e2d5":"getSupercedesRegistryInterfaceID()","2d5132cd":"getOuvidoriaEnteNome(address)","2d5134f7":"setApplication(address,address)","2d52164b":"stopsell()","2d5216a5":"PHASE_CHALLENGE()","2d52d1a2":"rewardDistributionEnded()","2d54ab45":"initTokenSale(address,address,address,uint256,uint256,uint256)","2d54f04d":"changeVotingBlocks(uint256,uint256,uint256,uint256)","2d5505b6":"_setAreas(address,uint256)","2d550c0b":"optionality()","2d56acce":"setMinAcceptedInPublicSale(uint256,uint256)","2d56af6c":"burnCoin()","2d56d572":"releaseMany(address[],uint256[])","2d571013":"getFeedBackFeeAward(string)","2d571cc4":"createToken(uint256)","2d578304":"update(address,uint16,bool)","2d57b6c8":"getInvestorDeposit(address)","2d57ea40":"FundariaTokenBuy(address)","2d580ef6":"add(address,bytes32)","2d581e71":"add_user(address)","2d5858a3":"publicSoftCapReached()","2d58c9a2":"gy()","2d58fab1":"pauseCWC()","2d592a34":"sellKissBTC(uint256)","2d5949a0":"setNumMarkets(uint256)","2d596330":"bmcPlatform()","2d59680d":"pool_name()","2d598d7b":"isAccredited(address)","2d599750":"updateUrl(bytes32,string)","2d59dc12":"displayMessage()","2d59ea6c":"oscarGuindzbergAddress()","2d5a5d34":"blacklistAccount(address,bool)","2d5a858c":"checkCompanyNameAvailability(bytes32)","2d5b2e15":"CLIForGas()","2d5b778b":"refundingDeadline()","2d5b8d99":"paymentsOf()","2d5bbf60":"subscriptions(uint256)","2d5c3ed1":"KWHToken(address,uint256)","2d5cb5d5":"CryptoKitties()","2d5cd1d6":"getPrize(address)","2d5ea8e3":"numplayers()","2d5fd89f":"getClaimData1(uint256)","2d60a72c":"DEPOSITS_KEPT()","2d614ad2":"Webpuddg()","2d620e1e":"deedsOfOwner(address)","2d62ce38":"collectAirdrop(bytes32)","2d62f428":"coinIssuedSale()","2d63e9f4":"Registration(uint256,uint256,uint256,uint256,uint8,uint8,uint8,uint8,string)","2d63f728":"mintWithMetadata(address,uint256,string)","2d646742":"executeGameProposal(uint256,bytes)","2d658888":"RobotarTestToken(address)","2d6653a9":"seed_coins_vault1()","2d668da4":"returnAmountOfTmexAddressCanProduce(address)","2d66acf1":"fortune_open(uint256)","2d67a79e":"verifyAccount(address,string,string)","2d67bb91":"World()","2d6842b5":"admin_MinimalPayValue(uint256,uint256)","2d685f15":"takeSell(address,uint256,uint256,address)","2d68bad7":"withdrawForTo(address,address,uint256)","2d68bc6e":"saleProceedsEther(uint256)","2d68de95":"currentStageTokensCap()","2d690f28":"LogSetTokenPrice(uint256)","2d6a3482":"TradeListing(bytes32,address,address)","2d6acb3a":"RESERVE_POOL_ADDR()","2d6afbd0":"unlockWithSpend(uint256,address)","2d6b113a":"in_sharing_phase()","2d6c17a3":"rewind(uint256)","2d6c25fa":"recommendedPrice(uint16)","2d6c5a84":"reverter(uint256)","2d6d1646":"untokenize()","2d6d4caa":"addtoContributos(address,address,uint256,uint256)","2d6ddfda":"closeModifyCountdown()","2d6df368":"borrarRegistro(bytes32,bytes32)","2d6e2bb0":"regularHold()","2d6ef310":"closeGame(uint256)","2d6f70f7":"transferViaTokenTransferProxy(address,address,address,uint256)","2d6f8049":"setBountyTokensReserve(uint256)","2d6fc906":"setBonuses(uint256,uint256,uint256)","2d706a34":"isName(address)","2d710551":"UlleToken()","2d7243ef":"payTodayReward(address)","2d740722":"close_pre_ico()","2d75c39a":"_removeClearingPriceValidator(address)","2d762b0d":"changeTokenContractAddress(address)","2d76a85a":"PundiXCash()","2d76be2d":"player_getPendingTxByAddress(address,address)","2d76d7b0":"releaseTokensByAddress(address)","2d774da2":"isSetFund()","2d776793":"downvoteComment(bytes32,bytes32,bytes32)","2d7788db":"rejectRequest(uint256)","2d78737b":"CreateUpgradeCards(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","2d78b7fc":"_withdrawInvestorTokens(address)","2d7aa82b":"initialize(uint256,uint256,uint256,uint256,uint256,uint256)","2d7ae086":"MarkHours(bytes32,bytes32,int256,bool)","2d7af0f4":"transferLoan(bytes32,address)","2d7b299d":"setNote(string)","2d7b8c98":"returnInvestmentsTo(address)","2d7bf927":"Migrations2()","2d7c597f":"whois(bytes32)","2d7c93e9":"register_claim(string)","2d7cd4cd":"rand1()","2d7cdeb1":"withdraw(string,uint256,address,bytes)","2d7da889":"ruleA(uint256)","2d7dc81c":"sendAfterIco(uint256)","2d7deae2":"testDeployMultiSigWallet()","2d7e92a5":"CWCCTokenIssue(address)","2d7eba3f":"ganaBalance()","2d7ed15c":"BNB_TOKEN_PRICE_DENOM()","2d804ca2":"amountFilled(address,uint256,address,uint256,uint256,uint256,address)","2d806bfd":"createProduct(bytes32,bytes32,address[],int256,int256,address)","2d806cdd":"setRefund(address)","2d80bc86":"getNumberOfParticipantsOrigins()","2d80f13c":"EthlanceSponsor(address)","2d817a91":"withdraw(uint32[])","2d81844e":"_createPrecious(address,uint256,string)","2d81e877":"Gocc9()","2d826eda":"updatetoken(uint256,string,string,string,string,string,uint256,bool)","2d829146":"buyshares(address)","2d83549c":"escrows(bytes32)","2d839989":"clearingPriceCode()","2d83f5a3":"divAmt()","2d84c3e8":"_getSigner(bytes32,bytes)","2d852552":"CreditDAO()","2d85db6b":"ChangeEndByManager(uint256)","2d873f21":"CrowdDevAllocation(address)","2d87cdd6":"DmlContribution(address,uint256)","2d883a73":"getByIndex(uint256)","2d884a51":"icoOpeningTime()","2d888869":"toAddress(bytes)","2d88af4a":"setPauser(address)","2d88df6f":"lvePay(string,string,uint256)","2d89560a":"TOKEN_INFORMATION_ADDRESS()","2d897146":"changeBonusIncreasePercentage(uint256)","2d8a08b6":"DepositEvent(address,uint256)","2d8a4dca":"committeeKickVotes(address)","2d8aa855":"playerInput(address)","2d8c1c35":"level_up()","2d8d488c":"getProductContractCommissionWei(address)","2d8d96fa":"stockSellCertainOrder(uint256,uint256,uint256,uint256)","2d8df871":"alimtoken()","2d8e3250":"Version(string)","2d8e3278":"grantPermission(address)","2d8ebff1":"joinAndDeposit(uint256,uint256)","2d8ed84a":"getExpiryDate()","2d8f0981":"setPI_edit_14(string)","2d9029ca":"earlyResolve(bytes32,uint256,bytes32,bytes)","2d9068ed":"matchpoolAddress()","2d906a19":"Solario()","2d90ae94":"transferToOwner()","2d910376":"valueFromPercent(uint256,uint256)","2d91657b":"giveConsent(string,string)","2d91ad22":"Group_5()","2d91bf11":"foxcoin(uint256,string,string)","2d923561":"sellItem(uint256,uint256)","2d9240f3":"pauseCrowdSale(bool)","2d92b1c0":"setupPhases(uint256,uint256[],uint256[],uint256[],bool[])","2d92b371":"addVal(address,bytes32,address)","2d9346ab":"setAgentVerificationByAdmin(address,address,bytes32)","2d935d11":"calculateTokenOnlyBuyPrice(uint256)","2d936763":"hasTeamKeepingWithdraw()","2d937fe8":"isBeginnerQuestContract()","2d93a44e":"getEndClaimDate()","2d93d3ac":"getFirstStageWallet()","2d94d41e":"DEVCLASS_FTL_SPEED()","2d9525d6":"YankeesOrioles48()","2d957790":"testRemoteWithdraw(uint256,uint256,uint256,uint256,address,address,uint8,bytes32,bytes32,address)","2d958dfc":"Payout(address,address,uint256,uint256,bool)","2d95fdb5":"_isApprovedForAll(address,address)","2d962d0f":"burnLeftTokens()","2d969204":"KingJamesToken()","2d96a297":"addStore(uint256,uint256)","2d976404":"upgrade_token(address,address,string)","2d978678":"left23(uint256)","2d97fc5d":"rand(uint256,address)","2d980646":"allowanceEliminate(address,address)","2d985cfb":"testControlRestartNotUpdatable()","2d98d251":"ArtaoToken(uint256,string,string)","2d992bde":"applyAffiliate(address,uint256,uint256)","2d9a37d3":"getMaxPayout()","2d9abaed":"Purchase(uint256,address,address)","2d9b1530":"Electrocoin(uint256,uint256)","2d9b4ab7":"blnpereth()","2d9c3052":"createPaper(string,uint256,uint256)","2d9c6001":"prometheusVoucherSoldCount()","2d9d5ab7":"withdrawByAdmin(address,uint256,address,uint256,uint8,bytes32,bytes32)","2d9de472":"setVerified(uint256)","2d9e84b4":"userCampaignID(address,uint256)","2d9e87c5":"setRefundable(bool)","2d9e8ed6":"addEntryInYears(address,uint256,uint256)","2d9ec349":"TOKETH_PRESALE_THREE()","2d9eceb5":"BETHERcoin()","2d9f669d":"sendProportion(address,uint256)","2d9fab98":"suscribeTrial(uint256)","2d9ff1d0":"m_Owner2()","2da03409":"flushForwarderTokens(address,address)","2da09fac":"sellBkgAtExchg(uint256,uint256)","2da0c25c":"priceChanger()","2da0d1ea":"etherSold()","2da11b2e":"biddingClosed()","2da13d5e":"CONTRIBUTIONS_MIN()","2da1670f":"deAuthoriseSale(uint256,uint256)","2da2440c":"registerAuditor(address,address)","2da39239":"updateUserShares()","2da40888":"TaskUpdated(uint256,uint8)","2da40ac7":"emitTokens(address,uint256,uint256)","2da4dddd":"createSystemSaleAuction(uint32,bytes,uint16)","2da5a444":"deleteSire(uint32)","2da5b88e":"remoteSetWinner(uint256,uint256,uint256)","2da5deb4":"addBuyTokensRequest(string,string)","2da64861":"bulkReserveTokensForAddresses(address[],uint256[],bool[])","2da6a0d8":"getBomb(uint8)","2da6b8f8":"_getMinersAt(uint32,uint32)","2da7293e":"isSuperseded(address)","2da758b0":"ResearchAndDevelopment()","2da80893":"phase_3_rate()","2da8b2be":"TokenSubtracted(address,uint256,uint256)","2da8d3e6":"woe()","2da8f764":"submitVideo(string,string)","2da92e05":"setEmissionCap(uint256)","2da9b51e":"setBuilding(uint8[176],uint8,uint8,uint8)","2da9d048":"startQueue(address)","2dab0374":"sendFutureFundingBalance(address[],uint256[])","2dab3e7a":"setTransferPlan(address,uint256,bool)","2dab7ee2":"convertToBytes(uint8[])","2dabbeed":"reclaim(uint256)","2dac17cd":"getBattleKuns(uint256)","2dacdaf7":"_createGirl(string,address,uint256)","2dad2f97":"getLeastExpensiveShare(uint256,uint256)","2dad5872":"newAttack()","2dad6b6a":"_distributeToken(address)","2daddb32":"VVToken()","2dadf781":"KudosOrganisations(address)","2dae35c4":"RGXBonus(string,string,uint256,uint8)","2dae9878":"BankOwner_EnableConnectBankAccountToNewOwnerAddress()","2daeb49a":"fundPuppets()","2daedd52":"stake(bytes32,uint256,uint256)","2daf0e1c":"presaleLevel()","2db0d129":"VIDALCOIN()","2db237bb":"MARGIN_SPLIT_PERCENTAGE_BASE()","2db25e05":"getTrade(uint256)","2db26de1":"checkBalances(address[])","2db2caef":"rmExchangeAccount(address)","2db3dc12":"FrozenAccount_event(address,uint256)","2db4f279":"createRoom(string,uint256)","2db579f2":"ETHPToken()","2db59e2b":"MyOwned()","2db6ad32":"testEmpty()","2db6e0fe":"fixPlayerFlag(uint256,string)","2db6fa36":"batchAddToWhitelist(address[])","2db78d88":"adminSealBallot(uint32)","2db8069f":"makeMemberOfCommunity(address,uint256)","2db89533":"Auth(uint8,address)","2db9395a":"availableTo(address)","2db93fc7":"buyBag(uint256)","2db95aa9":"getTomatoCount()","2dba1a44":"stockCancelSellOrder(uint256,uint256,uint256)","2dba3614":"app_address()","2dba5cfa":"transferCoins(address,uint256)","2dba9e63":"EMACToken(uint256)","2dbacf5f":"premiumOpen()","2dbb9050":"setSecurityTokensPercent(uint256)","2dbc62cc":"BlindCroupierTokenDistribution(address[16],uint256[16])","2dbcc104":"getAddressFromList(uint256)","2dbce390":"setDepositary_function_control(uint256)","2dbd606e":"set_sale_address(address,bytes32)","2dbe713d":"EOSPlusToken()","2dbede89":"next(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2)","2dbf7b98":"certificate()","2dbf8bf0":"getRolled()","2dbffa6a":"executeBuyRequest(uint256)","2dc03259":"registerUser(bytes32)","2dc03b22":"createNTVU()","2dc0562d":"taxWallet()","2dc09c39":"protectedReclaim(address,uint256)","2dc26661":"unlockOutcome(string,uint256)","2dc2dbf2":"makeSimpleDeal(address,address,uint256,bytes32)","2dc47153":"datafeed()","2dc62c4d":"MintProofOfStake()","2dc70b2a":"getCorrectedTotalBPOfTokens(uint256[])","2dc7a2e5":"testSetupMultisig()","2dc88138":"submitCoin(address,string)","2dc8b9de":"f1(address)","2dc8be64":"buyoutWallet()","2dc8d88d":"privatesale_beneficiary()","2dc95548":"adjustTokenExchangeRate(uint256)","2dc9ad7f":"multisend(address[],uint256)","2dc9b8f7":"createGuess(uint256,uint256,uint256,uint256,uint256)","2dc9d3e5":"placeSellTokenOrder(uint32,uint256)","2dca374f":"FBToken()","2dcac811":"TTNCoin(uint256)","2dcb4691":"EventBuyTank(address,uint256,uint256,uint256)","2dcb5c8d":"xaurumProxyWorking()","2dcbac97":"getGen(uint256)","2dcbfdfa":"endEarlyBird()","2dcca1f9":"TokenRetriever()","2dccba89":"MAX_DEPARTURE_LIM()","2dcd4e41":"getGain(uint256)","2dcdcd0c":"minChild(uint256)","2dce6a1f":"KHT(uint256,string,string)","2dcebd16":"setWorldTreasuryAddress(address)","2dd02e92":"weGotAWinner(address,uint256)","2dd0e79e":"getMarket_CommunitUsedTokens()","2dd117e0":"RESERVED_TOKENS_BOUNTIES_ADVISORS()","2dd1a932":"WE3TOKEN()","2dd1cc27":"MichCoin(uint256,uint256,uint256,uint256,uint256,uint256,address,address)","2dd28736":"view50()","2dd2995a":"ETHERCOINSupply()","2dd2f86b":"maxTokenSale()","2dd306f7":"getTearBalance()","2dd31807":"unlistOpenProposals(bytes32)","2dd34f0f":"Whitelistable(address)","2dd395ae":"SUN()","2dd3ed9a":"addWorkRecord(uint256,bytes16)","2dd40301":"amountJurors(uint256)","2dd407f9":"Vag()","2dd4f8d4":"totalSupplyYear()","2dd522c6":"ATN()","2dd5b58e":"setNewGameLogic(address)","2dd608ce":"setPreICOLimit(uint256)","2dd694ff":"EntryExistAlready(bytes32,uint256)","2dd6ba7e":"release_remain()","2dd7030b":"removeAuction(uint256)","2dd78759":"affAddr_()","2dd7ab99":"BlackSnail(uint256,string,uint8,string)","2dd81ed3":"CROWDSALE_REWARD_TOKENS_NUMS()","2dd854d4":"addLoanToPortfolio(uint256,uint256)","2dd8a25e":"MakeTransaction(address,uint256,uint256)","2dd96c84":"presaleGranteesMap(address)","2dda04fa":"enterContest(uint32,uint32[])","2dda30a7":"transferAndFreeze(address,uint256,uint256,uint256)","2ddae32d":"UTCoin()","2ddbc04a":"play2(address,uint256)","2ddbc97e":"addAuthor(address)","2ddbd13a":"total()","2ddc36ba":"BRC()","2ddcac03":"_checkLimit(uint256)","2ddcb21f":"limitSupply()","2ddd196f":"bookGuest(string)","2ddd6fa5":"incomingRandomNumberError(address)","2dddd8e0":"CROWDSALE_HARDCAP()","2dddf3e1":"request_withdrawal(uint256,uint256)","2dde1911":"balancesImporter2()","2dde7241":"priceWithDiscount(uint256,uint256)","2dde7dbc":"MAX_DTH()","2dde9aca":"deployment()","2dde9f81":"getLockWFee()","2ddea5fc":"enableEscapeHatch()","2ddeac16":"getForeignTokenBalance(address,address)","2de02bfa":"allocate(address,address,uint256)","2de16fdb":"fetchDayTokens()","2de1e234":"requestUSDPrice(string)","2de22cdb":"currentMintedTokens()","2de39dbe":"DifficultyOracle(uint256)","2de3ad02":"getUserWalletByUsername(string)","2de3cddc":"setCostToCreate(uint256)","2de40ce3":"registered()","2de4ca59":"Check()","2de4fbd8":"DaoRulesProposalAdded(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,address)","2de541e0":"updateAvatarInfo(address,uint256,string,uint256)","2de5aaf7":"getAgent(uint256)","2de61d1f":"changeIcoTimeRange(uint256,uint256)","2de6fac6":"delKYC(address)","2de86c5b":"transferPlayerBudget(address)","2de896f6":"MaxTokensPerAccountUpdated(uint256)","2de90801":"hashtagToken()","2de954af":"fixedLog2(uint256,uint8)","2de9a13a":"ToGoConcert()","2dea5f6d":"markCombatStarted(uint256)","2dea82b4":"checkActualPrice()","2deb65c7":"GetPoolInformation()","2deb7571":"queryByAddr(address)","2deb79b6":"getStockShares(uint256)","2ded516e":"giftIsTo()","2dee466d":"getAllActiveAuctions()","2def6620":"unstake()","2df056bd":"ServiceProvider(string,string,string)","2df05a3e":"payoutIndex()","2df33eee":"ShareEstateTokenCrowdsale(address,address,uint256,uint256)","2df38460":"unFreeze(address,uint256)","2df39546":"_generateRandom(bytes32,uint32,uint32)","2df3f82a":"setClaim(string,string)","2df456d4":"SetAllPaymentsSent(uint256)","2df56bb2":"unitBattleEthCost(uint256)","2df5a559":"year4LockAddress()","2df5ce67":"WorkOrderCompleted(uint128,uint256,string)","2df6e80a":"cancelTradeOffer(bytes32)","2df7c637":"ensureCurrentStage()","2df80280":"lastState()","2df80c87":"privilegedMintLock()","2df8e00d":"becomeMortal(uint256)","2df939cd":"Banglatoken()","2df9feaa":"stopElection()","2dfaf204":"executeContract(uint128,uint128)","2dfd27e8":"fecharDoacoes()","2dfdaf59":"CheckSoilTempException(bytes32,uint32)","2dfdf0b5":"depositCount()","2dff0d0d":"getById(bytes32)","2dff3498":"Relay()","2dff692d":"orderStatus(bytes32)","2dff6941":"content(bytes32)","2dff7a2b":"authoriseMaker(address)","2e0025c1":"ROLE_BACKEND()","2e011136":"deployTokens(address[],uint256[])","2e012698":"validate(bytes32)","2e01783d":"calcprice()","2e0179b5":"increaseApprovalWithSender(address,address,uint256)","2e01d229":"Attacker(address)","2e02583c":"wordlist()","2e028287":"test_oneInvalidAssertFalse()","2e029c65":"HARDCAP_TOKENS_ICO()","2e02b24c":"PMCToken(address,uint256)","2e038aaf":"randaoAddress()","2e04d730":"BuyGoods(uint32)","2e05177f":"OpenTransferToken()","2e055bcc":"preSaleSupply()","2e05b37b":"settleFee(address,address,uint256,uint256)","2e06c756":"post(string,string,string,uint256,uint256,address)","2e071db3":"updateUserAge(address,uint256)","2e081f31":"pause_3()","2e08c3d1":"checkUserWhiteList(address)","2e08eb77":"InitialTreeICO()","2e09c32f":"playRound(address,uint256)","2e0a020e":"refunduingStartDate()","2e0b1834":"periodByDate()","2e0bee7b":"createCampaign(string,string,uint256[],uint256,uint256,uint256,uint256)","2e0c6c36":"RANGEEND_3()","2e0ca1ee":"first_pay()","2e0cb498":"hashValue(bytes32)","2e0de515":"setTip(uint256)","2e0dfafc":"addBlockListed(address)","2e0e11b2":"OrderMatchFailure(address,int256,address,int256,uint256,uint256)","2e0e5ce8":"getBonusNames()","2e0eb6fd":"Lucy()","2e0eb943":"doSend(address,address,uint256)","2e0ef395":"voteOnNewEntryFees_only_VIP(uint8)","2e0f2625":"DECIMALS()","2e0fb349":"mainSaleSecondEndDate()","2e0fc7a6":"updateContributor(address,uint256,uint256)","2e102ee4":"setGasPrice(uint8)","2e108133":"qshdrop(address[],uint256)","2e10870f":"makeAnotherContractOwnerOfToken(address)","2e10feff":"addSigByProvider(bytes32)","2e13bd10":"not()","2e14ef92":"mutiSendCoinWithSameValue(address,address[],uint256)","2e15ba63":"forwardData(bytes32,address)","2e16cf54":"retrieveWallet(address)","2e16e82e":"BitcoinCityCoin()","2e17de78":"unstake(uint256)","2e18270f":"receiveBTC(address,string,uint256,string)","2e18762c":"LogUpdateInvestorProfitSum(uint256)","2e18cead":"PrivateSale(address,uint256,uint256,uint256,uint256)","2e18d8a9":"becomeBullsmaster()","2e190d03":"IncreasingPriceCrowdsale(uint256,uint256)","2e19599c":"getTargetRepMarketCapMultiplier()","2e19d31b":"proposalText()","2e19ebdc":"pIDxName_(bytes32)","2e1a348e":"TicTacToeGame()","2e1a37ee":"TCToken()","2e1a7d4d":"withdraw(uint256)","2e1a9ffe":"getPepe(uint256)","2e1b2098":"PlayerCreated(uint8,address,uint256)","2e1b7f08":"SetClaimRate(uint256)","2e1bbe98":"setLimitEth(uint256)","2e1c1d63":"BoardMeetingClosed(uint256,uint256,bool)","2e1c49d9":"testInitalBalanceUsingNewContract()","2e1d22b6":"getPlayerDividend(address)","2e1dc4b8":"setTokenReward(address)","2e1dea6b":"updateHours()","2e1e786d":"setWhitelist(address[],address[],uint256[])","2e1eb7fe":"slice32(bytes,uint256)","2e1ef07a":"getAmountOfTokens(uint256,uint256)","2e1faf75":"transferToken(address,uint256,uint256)","2e1fbfcd":"getProposalObjectionByIndex(uint256)","2e20255e":"MasterToken(uint256,string,uint8,string)","2e20b66a":"setThings(address[],uint256[],uint256)","2e217405":"limitedWallets(address)","2e21b085":"lastPriceOf(uint256)","2e226c84":"rewardForDrawing()","2e23062d":"increaseBase()","2e2326d5":"isPrivileged(address)","2e247e4f":"SRGToken()","2e25aa96":"setCharPrice(uint256)","2e25d2a6":"marketPlace()","2e26328d":"RaiToken()","2e271ff3":"getEmail(address,address)","2e276499":"minPayment()","2e279344":"getLunckyInfo()","2e27c10a":"setPI_edit_25(string)","2e283b94":"TokenClaim4BTC(address,address,uint256,uint256,uint256,uint256)","2e28b3f5":"SGX_ADDRESS()","2e28d084":"setBytes(bytes32,bytes)","2e28fd42":"complete(uint256,string)","2e293e58":"setClientPaidUpTo(address,uint256)","2e297a44":"getSmartContractsLength()","2e298f75":"setPositiveGrowth(int256)","2e2a51bd":"WitdrawTokenToHolder(address,address,uint256)","2e2a6488":"evaluation_stage_block_size()","2e2aad44":"NIMFAToken(address,address,address,address,uint256,uint256)","2e2b3f61":"TokenCreated(address)","2e2b5809":"Insurechain(address,address)","2e2bac04":"addControllerContract(address)","2e2bec5c":"getMinerLevel(uint256)","2e2cce55":"icoRound5()","2e2d6ab1":"DelayedPayment(address,uint256,address,uint256)","2e2e4149":"minTomoContribution()","2e2ed6a7":"PALToken(uint256,address)","2e2fe8a9":"ZYL()","2e2ff7c6":"transferPreSaleTokens(address,uint256)","2e3196a5":"set(string,bytes32)","2e323f5d":"Update(uint256,uint256,string)","2e325020":"getStage(uint256)","2e33178a":"zRefundAllPlayers()","2e334452":"getPublicKey()","2e336eea":"testDieIfMinReturn0()","2e338df5":"transferInner(address,uint256)","2e33cd7a":"distructVault(bool)","2e340599":"info(uint256)","2e340823":"cancel(uint256[])","2e35d7a8":"companyTokensCurrent()","2e368e03":"beneficiariesPercentage(address[],uint256[])","2e36a709":"Error(uint256)","2e3712c4":"Bitelectroneum()","2e376ada":"whitelistIndexMap(address)","2e379264":"AIRDROP_CLAIM_AMMOUNT()","2e37fa97":"doneOptions()","2e39c2b1":"Prize(string,uint256,string)","2e39ff84":"isGeneSynthesis()","2e3a0a7c":"destroyMultipleItems(uint256[])","2e3a4d12":"handleRSMCUpdateTx(address,bytes32,uint256,address,uint256,address,uint256)","2e3a4def":"isTier2(address)","2e3a5611":"create(string,string,string,uint256,string,string,uint256,string)","2e3a71d5":"futureFundingBalance()","2e3acf6b":"contractPreICO()","2e3aff3b":"getSpinnerPrice(uint256)","2e3b3123":"_multiSet(address[],uint256[])","2e3b96bf":"developersTokens()","2e3be78d":"setPrecisionDirect(uint8)","2e3c2259":"playingNTVU()","2e3c9e99":"managerAddr()","2e3ca08c":"WALLET_MARKETING()","2e3cbb3b":"sellPop(address,uint256,uint256)","2e3ced61":"periodPreITO_startTime()","2e3db828":"getAddressForUsername(bytes32)","2e3edd0f":"ntsDepositAddress()","2e3fa349":"isLpStart()","2e4040b0":"releaseTeamTokensAfter6Months()","2e404c0f":"_setDOwner(bytes32,address)","2e4054cf":"vest2advisors(address,address)","2e4099bd":"transferAirdrop(address[],uint256,bytes)","2e414890":"challenge(uint256,uint256)","2e415444":"transferUniqueId(bytes32)","2e416162":"tkstest()","2e4176cf":"chairperson()","2e4216c1":"setMinInvestmentInWei(uint256)","2e42b012":"LockAccount(address)","2e42f80c":"CDC()","2e42f860":"toUint32(bytes)","2e430824":"trackable(address,address)","2e43bdfd":"approveDecrease(address,uint256)","2e440403":"rounding()","2e448f4b":"transferAngel(address,address,uint64)","2e450881":"PRESALETOKENMAXSALES()","2e465465":"provideIndex(string,uint256)","2e466373":"resumePlaying()","2e46cb09":"AddChipTempTime(uint32,uint256)","2e46ed94":"uint8ToString(uint8)","2e471d47":"addInvest()","2e478dd8":"provideCertificate(uint256,uint256)","2e4837ea":"pickUp()","2e48f65d":"UpdateMoney()","2e49d78b":"setStatus(uint8)","2e4a3657":"returnToken()","2e4ab29e":"technicalContract()","2e4b3d59":"setSecurityPercent(uint256)","2e4bd18a":"ApproveFinishMintingRequest()","2e4c4a9f":"lunyrPercentOfTotal()","2e4c697f":"pow(uint256,uint256)","2e4d2a09":"DMC()","2e4d3189":"withdrawal(address,uint256,uint256)","2e4d59c4":"CheckBalance(address)","2e4d8c8f":"exerciseToken()","2e4eaa15":"destroyToken()","2e4f43bf":"allOf(uint256)","2e4fd0ca":"addReferrer(uint256)","2e502569":"emitTransferred(address,address,uint256,address)","2e504bdb":"distributeTokens(uint256,uint256,uint256)","2e50e3ff":"simulateOptions(uint32,uint32,uint32,uint32,uint32,uint8,uint32)","2e5113b7":"benefit()","2e519ad5":"joinGameReferred(bytes32,address,uint8)","2e519dd5":"updateLottoParams(uint256,uint256,uint256)","2e51cdf6":"getAddressFromBytes(uint8,bytes)","2e52d606":"n()","2e532ba2":"getBackgroundImage(address,uint256)","2e533630":"sendBatches(address[],uint256[])","2e541234":"AllThingsTokens()","2e558a2d":"ETTToken()","2e56fd7a":"currentDelayOnNewLevel()","2e574191":"NEURAL()","2e58e65a":"getTokenInitialPrice()","2e597ada":"ChenToken()","2e599054":"depositETH(address,uint256)","2e5a6f17":"releaseAdvisorsTokens()","2e5a79fc":"_withdraw(string,address,uint256)","2e5ab94f":"BLOCKS_PER_PHASE()","2e5ac9b1":"createToken(address,address,address)","2e5b02ae":"setCrcWithdrawAccount(address)","2e5b2168":"maxBet()","2e5b4c43":"allowTrading()","2e5b604e":"lockBonus(address,uint256)","2e5c4cef":"RRRR_Token()","2e5cc103":"createDefaultEtherDog(uint256,uint256,uint256,address,uint256,uint256)","2e5d1042":"requestPayout(uint256,uint256,bytes32,uint256,uint256)","2e5d89bd":"BlockmoXyz()","2e5df0fe":"signUpDelegatedUser(string,address,uint8,bytes32,bytes32)","2e5e00e1":"_FIFTY()","2e5ec035":"_ApplicationRemoved(bytes32)","2e5fe746":"communityTokens()","2e609c10":"presaleStartsAt()","2e61319d":"getNumberOfAddresses()","2e617512":"getAddressFromName(bytes32)","2e62190c":"valueWithFee(uint256)","2e6245c6":"internalBalance()","2e62efbb":"getOpenOrderInfo(address,address)","2e63046d":"mybUSDPrice()","2e63756f":"PriIcoSale(address,uint256,uint256,address,address)","2e639fd5":"GetPlayerInfo()","2e63cfe1":"Twoandtwo()","2e63dc80":"get_description_url()","2e64bcf1":"weiWantedOf(address)","2e64cec1":"retrieve()","2e65280d":"ListNotValidated()","2e660475":"PonziTokenV3()","2e66ee1b":"currentStateToString()","2e69e69b":"getQuantity(address)","2e69e8c5":"CarolToken()","2e6aa830":"testInitialBalanceWithNewMetaCoin()","2e6b2662":"sponsoredBonusMin()","2e6b921c":"claimTokensByAdmin(address)","2e6bbde5":"_updateCurrentAnswer(bytes32,bytes32,uint32)","2e6ccbf6":"getFactorybyIndex(uint256)","2e6d18ec":"getRoomData(uint256)","2e6d561b":"sendUnsoldTokensToTreasury(address)","2e6e190e":"Play(uint256,uint256)","2e6e504a":"trusteeWithdraw()","2e6e795c":"shareHoldersOf(uint256)","2e6f2136":"emitToken(address,uint256)","2e6f3e4a":"PERCENT_RATE()","2e6f456c":"updateCrowd(uint256,uint256,uint256,uint8)","2e70bd4f":"mintOperationCount()","2e712cc1":"getAdminComission()","2e71e68f":"IDX()","2e72057e":"GetLiasonURL(uint256,uint256,uint256)","2e722561":"CrowdsaleController(uint256,address)","2e7248bf":"MINIMUM_SELLING_UCCOIN()","2e729daf":"totalTRsWagered()","2e73dba0":"FeneroToken()","2e76a6d4":"allocateMarketingTokens(address,uint256)","2e771b17":"Spent(address,uint256,string)","2e77b3d0":"annual_circulating_supply()","2e788443":"resolve(string,address,uint256)","2e788faf":"HOLODECKS()","2e78f9a7":"getCardValue(uint256)","2e79477f":"SGD()","2e799a77":"GainChip(address,uint32,bool)","2e79d702":"addPolicyRule(bytes4,address,bytes32,uint256,uint256)","2e7a26d6":"Delineto()","2e7a9409":"_winJackPot(address,string)","2e7bcc55":"put(bytes32,bytes32,bytes32)","2e7ceb0f":"THIRD_TIER_RATE()","2e7d6253":"Sale(address,address,address)","2e7db440":"prepurchase(uint32)","2e7dc6af":"src()","2e7e33df":"sendFunds(address,uint256,bytes)","2e7e9af8":"addDistributee(address,uint256)","2e7e9d82":"ModerateBill(uint256,bool)","2e7f5107":"_processCredit(address,uint256)","2e7f9127":"setSize(uint8,string)","2e7fa0bb":"ReyNetMax()","2e80a85d":"last_jack()","2e80cc56":"crowdSaleMin()","2e80d9b6":"QUORUM()","2e80e77c":"minimumWeiAmount()","2e817963":"set_sdl(address)","2e81cdda":"setItemOptions(address,uint256,uint256,uint8)","2e82aaf2":"lock(bytes32,uint256,uint256)","2e831cd1":"update_bitcoin_ratio(uint256)","2e834576":"tokensForEth(uint256)","2e83faee":"CustodianUpgradeable(address)","2e84a374":"reclaimEtherTo(address,uint256)","2e84bed8":"VESTING_2_AMOUNT()","2e84e8ca":"ItsComingHomeToken()","2e8511f0":"getReg1()","2e85dd54":"getGPSMaxEth()","2e860fc2":"setRaiseLimit(uint256)","2e867c77":"PRESALE_BONUS_PERCENT()","2e86cb13":"publicGetAsset(uint256,uint256)","2e875a9f":"RnMmasterReq()","2e87b461":"getPlayerFrontDataForMarketPlaceCards(uint256)","2e87edd9":"MINIMUM_PARTICIPATION_AMOUNT()","2e87f4a5":"_emitRoleAdded(address,uint8)","2e881918":"setVariantCount(uint256,uint256)","2e894203":"delLitAddress(address)","2e898ddc":"validateTemporalUnit(uint256)","2e8a34a7":"addTo(bytes32,uint256)","2e8ac384":"SmartIdentityRegistry()","2e8ac517":"TokensMinted(address,uint256,uint256)","2e8c0ac2":"balancing(int256,int256,uint256)","2e8c5793":"BonumPromoToken()","2e8cbf7d":"_determineAttack(uint256)","2e8e66b9":"newRequest(address)","2e8e9bb9":"Venuscoins()","2e90610d":"auditActivity(uint256,string,uint256,uint256)","2e9066b2":"lastBlock_v6()","2e90aae8":"cuck()","2e913118":"txTaskMap(uint256)","2e91812b":"setSmallCapWhitelistParticipants(address[],uint256)","2e92abdd":"withdrawDividends()","2e932961":"setTimeEnd(uint256)","2e93497e":"ownerRandomHash()","2e9392bb":"marketEggs()","2e9453c2":"stateOfICO()","2e94afe0":"EDN()","2e94c0df":"_withdrawTokens(address)","2e9501d6":"maxThreshold()","2e963adc":"timelocksContracts(address)","2e97766d":"getBlock()","2e97c5a5":"ethToLoveyRate()","2e97f1bb":"setCustomerTxAsSpent(address,bytes32)","2e984745":"partnerID(address)","2e9868f8":"issuerName()","2e986b54":"TransferMinimumFeeConfirmed(uint256,address,uint8)","2e98a401":"preCheckAndPay(string,uint256,address)","2e993994":"changeUnforked(address)","2e995fd7":"setOraclizeAllowance(uint256)","2e99df84":"InitiateTeams()","2e9a06fd":"isValidIPFSMultihash(bytes)","2e9a3869":"MORCO()","2e9b4414":"getSpawnLimit(uint32,int256,uint256)","2e9b50bd":"addPeer(address)","2e9bbbb8":"transferOwnershipUpdateToken(address)","2e9be9d5":"signWithdraw(address,address)","2e9c135b":"proxydeposit()","2e9c5e77":"doStackExtension(uint256)","2e9c91a8":"getStartParams(bytes32)","2e9efb8e":"commitToWeek(uint256,uint256)","2e9f86cd":"create0(uint256,bytes)","2ea0dfe1":"transferFrom(address,address,uint64)","2ea1f9aa":"getEpisodeLength()","2ea23b11":"testTransferFromDoesNotAllowTransferByAddressThatHasNotBeenApproved()","2ea38693":"testCreatePrizeUsingNewContract()","2ea3ad74":"finishPreIco()","2ea3f9fc":"gelerCompte(address,bool)","2ea459b8":"claimThrone(bytes)","2ea60e35":"fourthWeekBonus()","2ea68d4b":"LazyCoderCoin()","2ea6d6da":"absMin(int256,int256)","2ea7e0d2":"Test5(uint256)","2eaa7be9":"PoolSegregationCrowdsale(uint256)","2eaad0b0":"_getAllChildren(bytes32)","2eac3a7d":"divCashCoin()","2eac5a77":"Getscoins()","2eac5ca2":"deleteUsername(bytes20)","2eacfd0f":"admin_withdraw(uint256)","2ead28fa":"BBTToken(address)","2eadda54":"number_to_hash(uint256)","2eae0018":"setMaxChildCount(uint256)","2eae0d0a":"SetTimes(uint256,uint256)","2eaf7fe0":"buyTokenPostIco(address,uint256)","2eaf81f9":"concludeTournament(uint256,uint256)","2eafb9fa":"setMintTokenOwner(address,address)","2eafc2aa":"installWinner(uint256)","2eb0111c":"currentPhaseAddress()","2eb0b45a":"setGlobalsSize(uint256)","2eb1482a":"isHorseInStud(uint256)","2eb1ee9e":"CandyLand(address)","2eb255ec":"divpaid()","2eb2c2d6":"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)","2eb37466":"removeWhitelistedAddress(address,address)","2eb3a797":"getBetKey(uint256)","2eb44efc":"ICOSaleType()","2eb4a7ab":"merkleRoot()","2eb51417":"isWithinSaleLimit(uint256)","2eb516b8":"setGNR(address,address,address)","2eb56ad4":"getUserTokensByGame(address,uint32)","2eb5c61f":"testThrowsUpdateLatestRevisionEnforceRevisions()","2eb61d15":"getAdvisorStatus(address)","2eb67f53":"isERC20()","2eb73307":"internalRefund(address,uint256)","2eb9526e":"GetBoilersInfo()","2eb95fd4":"doHijack(uint256,uint256,uint256,uint256)","2eb96988":"getMetBalance()","2eb98d34":"hosp_count()","2eb9a518":"ChangeRateOfToken(uint256,uint256)","2eb9f831":"markAsFounder()","2eba1c40":"deleteName(address)","2eba9ca9":"liquidateUser(address,uint256)","2ebabea0":"preSaleRaise()","2ebba2cf":"unitsPerEthAt(uint256)","2ebbac6c":"ico4Cap()","2ebbc58c":"getAllRouter()","2ebc4293":"getEthereum()","2ebc760b":"AvPresale()","2ebd1e28":"setTokenAddr(address)","2ebd632a":"addSystem(address,address)","2ebd9242":"TOTAL_TOKENS_ICO()","2ebe14b0":"timeoutBlocks()","2ebec916":"withdrawalProfit()","2ebeee0f":"increaseMinPurchaseQty(uint256)","2ebfa208":"checkFreeze(uint256)","2ebfeaac":"setCCH_edit_33(string)","2ec0090a":"withdrawEtherBalance()","2ec0faad":"createPassport()","2ec19f0f":"itemTransfer(address)","2ec21efd":"OuCoin()","2ec29c59":"ICOSALE_BONUSJOINTTOKENS()","2ec2c246":"unregister(address)","2ec40ac8":"reached()","2ec449d7":"MedexTestToken()","2ec47069":"assignFoundationSupply(address)","2ec6b4f6":"getUnitCoinProductionMultiplier(address,address,uint256)","2ec6ea30":"Hodl()","2ec82b8f":"balanceOfInt(address)","2ec86103":"booleanToUInt(bool)","2ec90e34":"decrementOwnedArea(address,uint256)","2ec9322d":"returnStartTime(uint256)","2ec9ad44":"removeAccessor(address)","2ec9c537":"MyFiChain()","2eca51e2":"elements(uint256,uint256,uint256)","2ecb0d64":"getNumber(bytes32)","2ecb20d3":"fromHexChar(uint8)","2ecb9279":"yesHash()","2ecbd6d8":"allowedForWithdrawn()","2ecc8703":"guardInterval()","2ecca4e6":"_destroyNinja(uint256)","2ecd071e":"Freezed(address,uint64,uint256)","2ecd7020":"getTotalTokenSold()","2ecde40e":"getRefWallet(address,address)","2ece07c3":"setUserAirDropRate(uint32)","2ecf307e":"_addrNotNull(address)","2ecf66e4":"softCapToken()","2ed028da":"addGift(address,uint8)","2ed196bd":"ccLockedUpBalances(address)","2ed1a7f6":"setProposalTTL(uint256)","2ed1e521":"generateWinMatrix(uint16)","2ed1f26e":"unlockBatchOfAddresses(address[])","2ed20ec7":"Yiha()","2ed23a73":"_releaseTo(address)","2ed252cb":"toERC20(uint256,uint256,uint256)","2ed42bf7":"_config()","2ed44309":"setIcoParameters(uint256,uint256,uint256,uint256)","2ed4595a":"participantContributionInEth(address)","2ed4a2c7":"changeState(address,uint8)","2ed4b68a":"creditFundNIMFAAddress()","2ed5016a":"SolidStampRegisterAddress()","2ed5ca29":"recordFillOrder(bytes32,uint256,uint256)","2ed604c8":"secondsLive()","2ed73df6":"starterPackCardLevel()","2ed94f6c":"bulkWithdraw(address[])","2ed9859f":"hasSongWriterSigned(address)","2edb5389":"replenishTokens(address,uint256)","2edcc661":"crowdsaleStartDate()","2edcedc6":"parkingSwitches(address)","2edefc26":"founderMultiSigAddress()","2edf8042":"collectProvisions(uint256)","2ee01240":"getUnitJadeStealingMultiplier(address,address,uint256)","2ee057ca":"deallocateItem(uint256,uint256)","2ee07c00":"closeEvent(uint256)","2ee07cbf":"AxieClockAuction(uint256)","2ee119cb":"demint(address,uint256)","2ee1e64c":"toRLPItem(bytes,bool)","2ee3cf83":"cancelOrderByAdminWithMerchant(string,address)","2ee40908":"stakeFor(address,uint256)","2ee551bf":"RESERVED_BOUNTY_GROUP()","2ee5d2e3":"last_forwarder_created()","2ee6807a":"raiseCoinsDeducted(address,uint32,uint256)","2ee6f8b6":"changerType()","2ee6fe55":"_addOwnerPlayerToTeam(uint256,address,uint256,uint256)","2ee79ded":"change()","2ee86973":"resolveHTLC(uint256,uint256,uint256,bytes32,int256,bytes32,uint8,bytes32,bytes32)","2ee8dda9":"allocateFoundationToken()","2ee92639":"purchaseCancel(address)","2ee94319":"RecievedEth(address,uint256)","2eea1efe":"getCCH_edit_20()","2eebdeb8":"_setStakeHolder(address,uint256)","2eebe94f":"weiRaisedAmount()","2eecbc7f":"deployMeDao(string)","2eecc46c":"sendTokensToInvestor()","2eed0079":"createMicroModule(uint256,string,uint256,uint256,uint256,uint256,uint256)","2eee5a3e":"totalPresaleTokensYetToAllocate()","2eef13cd":"changeArt(bytes32,string,string,string,string,string,address)","2eef3d65":"query(bytes32,string)","2ef01862":"subscriptionDetails(uint256)","2ef0a28d":"seraphims(address)","2ef140ef":"send(address,uint256,uint256,uint256)","2ef22b34":"setExpRewards(uint256,uint256)","2ef2b51d":"OWNER_TAKE_SHARE()","2ef2d55e":"channelTimeout()","2ef2edb8":"endICOStage1()","2ef345e4":"DAppSky()","2ef35214":"setVestingRate(uint256)","2ef3a7e1":"setBalancePercentageLimit(uint256)","2ef3accc":"getPrice(string,uint256)","2ef4940f":"withdrawalsVotes()","2ef4d922":"revertMe()","2ef5c784":"allTimePlayers()","2ef6d6c0":"countWebsite(address)","2ef70523":"SVDelegation()","2ef75ebc":"STAGES_PERCENT_RATE()","2ef761d3":"buyTile(uint8,uint8)","2ef771ae":"hodlFor(uint256)","2ef875fb":"div10(uint256,uint8)","2ef8c22b":"FunWorldCoinToken()","2ef9b4aa":"EngkusTechResearch()","2ef9b5a7":"changeBonusMultiplier(uint256)","2efa3c87":"TokensSpent(address,uint256)","2efa79d3":"tokensFrozen()","2efaa460":"testActivateSale()","2efad59d":"EmployeeServ(address)","2efb3f04":"getNumberOfScams()","2efb77c4":"changeDates(uint256,uint256)","2efbb80c":"addMeaningToCovfefe(uint256,string)","2efc5013":"Ask(uint256,uint256,address)","2efcb5e0":"TransferCommissionToken(uint256)","2efd08df":"totalPaintingsCount()","2efd5632":"candyLandAddress()","2efeb4e5":"LogSale(address,uint256,uint256)","2effbada":"eligibleTestAndIncrement(address,uint256)","2f002511":"viewTotalPaid()","2f004218":"PERCENT_COMMISSION()","2f00b84a":"SECToken(uint256,string,string)","2f0160e7":"fromOtherCurrencies(uint256,address)","2f034f35":"PerformingMonthlyMinting(uint256)","2f038fd5":"enable(uint8)","2f0573d9":"DSToken(bytes32)","2f0579db":"_isBreedingPermitted(uint256,uint256)","2f0746bf":"unsetWildCardToken(uint256)","2f078b12":"HashGenerator()","2f087a28":"getTokenCap()","2f08acfa":"Extreme()","2f0989ec":"release12m()","2f0ae513":"calculateTotalWithdrawableTokenAmount(address,address)","2f0b0222":"numberOfRound()","2f0b15f6":"testGetUnset()","2f0b5cb5":"setTokenTransferPercentage(uint256,uint256)","2f0b9dcb":"getArray2()","2f0c2c7c":"getReward(uint32)","2f0c59e7":"DISTRIBUTION_INVESTORS()","2f0c9387":"TestCitySnapshot(address,uint256)","2f0cca79":"dataMerkle(uint256[],uint256,uint256)","2f0d2079":"getEventBanks(uint256)","2f0d8962":"ChangeFeed(bytes32,uint256)","2f0dbae1":"MaxICOpublicSupply()","2f0ddcb2":"getTechBonus2(uint256)","2f0e23fb":"purchaseEndTime()","2f0e3a6c":"status(address,address)","2f1017cb":"getwinnerloser()","2f109d2b":"afterWhtelisted(address)","2f113f27":"LOCK_STAKE()","2f12bc02":"LiquexPrivateSale()","2f1335cf":"splitFunds(uint256)","2f13b60c":"isExpired()","2f148f55":"showMoseEvent(uint32)","2f156f69":"deployTgeTeamVesting(address,uint256)","2f158162":"setHKHcoinAddress(address,address)","2f16753c":"ShellToken(uint256,string,uint8,string)","2f1766c5":"addCA(address,address,string,string,string,string,string,string)","2f17a466":"terminateSchedule(address)","2f186785":"showProfit(address)","2f18a920":"setDeputy(address)","2f1927cb":"prepareRoll(uint256,uint256,uint256)","2f194e40":"isMintDone()","2f1a2e72":"allocate(address,int64)","2f1a332a":"OwnerRandomNumber(uint256)","2f1a8177":"weiToBnty(uint256)","2f1a8b63":"modify_ICOEndDate(uint256)","2f1af169":"EscrowMyEther()","2f1afbac":"doAirdrop(address,address[],uint256[])","2f1c34ef":"buyStar(uint256)","2f1c6494":"tgeSettingsAmount()","2f1c935e":"setSkinContract(address)","2f1cae85":"isIssuable()","2f1cc35b":"getRoundBetNumber(uint256,uint256)","2f1d29fd":"HarjFarmer()","2f1d3e28":"sendAwardToLastWinner()","2f1d5a60":"setOperatorAddress(address)","2f1ddbe3":"nodalblockShortLink(uint256,string)","2f1de784":"getPoolsAllot(bytes32)","2f1e4968":"makeNewProposal(string,uint256)","2f1ee5e1":"recycleUnreceivedBonus(address,address)","2f1f1d43":"getownership2(uint16,uint256,uint256)","2f20270a":"addNewUrl(string)","2f2035ed":"test_feePoolShare_notTranscoder()","2f204237":"setupSaleContract(address)","2f212780":"KYCbit4()","2f220d7a":"executeEscrow(uint256,address)","2f237e82":"create(string,string,bytes)","2f24bdc7":"is_transaction(bytes32)","2f254d09":"UGVCToken()","2f262471":"GetPlayerCards(address)","2f265cf7":"totalVotesFor(bytes32)","2f26b5d1":"delayIcoEnd(uint256)","2f26f6f5":"getIsCompany(address)","2f2712f8":"getStat(bytes32,address)","2f274d91":"buyVotes(uint8)","2f2769d1":"assertEq(address,address,string)","2f2770db":"disable()","2f278ecb":"reverseBytes(bytes)","2f27b556":"card_start_minamount()","2f29d8c5":"elapsed()","2f2b348d":"setBeneficiary1(address)","2f2bd5ac":"testTransferCorrectlySendsTokens()","2f2c00f3":"PTMCrowdFund()","2f2d783e":"rewardRoto(address,bytes32,uint256)","2f2d9109":"changeAirdropTotalQty(uint256)","2f2dc6e2":"setCardsCount(uint256)","2f2e2d7f":"fstUnitPriceDenominator()","2f2e3cea":"userDividendsWei(address,address)","2f2ebe41":"setToken4Gas(uint256)","2f2f010c":"OCLotteryContract()","2f2f20c1":"INCH()","2f2f4859":"helloworld()","2f2f4a63":"buyWorldCupTeamToken(uint256)","2f30283e":"testSomething()","2f3085d6":"LEGAL_EXPENSES_TOKENS()","2f30c6f6":"set(uint256,address)","2f30cd5f":"addLockAddress(address,uint256)","2f310bad":"redeemToken()","2f318039":"isTransferable(address,address,uint256)","2f32013d":"Kolidat()","2f330041":"transfers(address,uint256[])","2f334131":"lastAddYear()","2f334652":"teamClaimed()","2f335a6a":"getTitulaire_Compte_9()","2f3423b8":"grantTokenStartNow(address,uint256,uint256,uint256)","2f347e48":"DigitalTicks()","2f34adb4":"airdropNum2()","2f34c645":"endBounty(address)","2f35a71e":"Blockchain()","2f366637":"buyTickets(uint256)","2f377902":"CandyDropOpen(bool)","2f379fc8":"isInStage2()","2f381df0":"London()","2f38262a":"GetBankBalance()","2f384523":"removeFunds(uint256)","2f386a8e":"sellingDisable()","2f38b55a":"_checkDetail(uint256,uint8)","2f39bf80":"LirkToken()","2f39f5cd":"PresaleMarket(address)","2f3a212e":"test_oneValidEqUint2()","2f3a26ee":"TransferTimeSet(uint256)","2f3b24d2":"GenesisManager(address,address,address,address)","2f3b5603":"setPayoutLimit(bool)","2f3c8bd1":"returnTokenBalance(address,bytes32)","2f3d8035":"grantVestedTokens(address,uint256,uint256,uint256)","2f3e5408":"takerFeePercent()","2f3e9bc5":"canSelfDestruct()","2f3f2092":"ARIONTOKEN()","2f3f234a":"RLCSentToETH()","2f3fecaa":"startOffering()","2f3ff501":"getDynamicElementAt(uint256)","2f401300":"EPAchain()","2f405bb7":"getCoversForPacks(uint256[])","2f408990":"testAccessPermissions()","2f430e17":"approveTx(uint8)","2f434748":"setMintAndBurnOwner(address)","2f443315":"get_liquidity_account(address)","2f455d51":"changeRate(uint8)","2f45aa21":"getblockRevenuePerTicket(uint256)","2f4675cd":"OranguSale(uint256,uint256,uint256,uint256,uint256,address,address,uint256,uint256)","2f46b3cc":"getMyReport(bytes32,bytes32)","2f46ba70":"DAOToken(string,string,uint256)","2f4736da":"_canTransferBatch(uint256)","2f47571f":"isCapabilityPublic(address,bytes4)","2f475c32":"withdrawPart(address,uint256)","2f482935":"SFTToken()","2f48ab7d":"usdt()","2f48c4aa":"setFoundersTokensWallet(address)","2f48f151":"addFee()","2f4a81df":"howManyOwnersDecide()","2f4c0b08":"joinGreatHarmon(string,string)","2f4c3a84":"transferPlayer(uint256)","2f4cf60f":"MultiSigWalletWithTimeLock(address[],uint256,uint256)","2f4e32f5":"FlexiERC20Token()","2f4e4c27":"ErrorContract()","2f4ea4ee":"release_1()","2f4ee5d4":"registerThrone(bytes,uint256,address,uint256,uint256)","2f4f3316":"isInstantiation(address)","2f4fda30":"BIG_NUMBER()","2f512b6b":"LomeliMultilpleTokens()","2f520081":"setPurchaseTimestamp(uint32,uint64)","2f53cc96":"CHINESE_EXCHANGE_3()","2f540d94":"BONUS_MID()","2f54a61e":"setClaimerForTile(uint16,address)","2f54bf6e":"isOwner(address)","2f553d31":"isCreated(bytes32)","2f554288":"listPrycto2()","2f554d53":"agreeFromPod()","2f5552f5":"KAL6Token()","2f55745b":"getPendingCrateForUserByIndex(address,uint256)","2f558ba0":"setFinish(uint256)","2f55f125":"decreaseAllowanceOrEmtpy(address,uint256)","2f56dc5f":"prepareContinuousPurchase()","2f570a23":"test(bytes)","2f576f20":"doNothing()","2f581480":"CandyCoinBigBang()","2f5867b3":"changeRates(uint8,uint256)","2f58768f":"contractors()","2f591a6a":"setRateForTransaction(uint256,address,uint256)","2f593404":"payoutCycleInDays()","2f597e71":"testLongInput()","2f598404":"getCatDetails(bytes5)","2f599242":"getEvaluationByStudentID(uint32,uint64)","2f5a5c5b":"timegame()","2f5bb661":"getNextVestingEntry(address)","2f5c3102":"Make_Deposit()","2f5c5a08":"setEthealToken(address,address)","2f5d3916":"testControllerApproveTriggersEvent()","2f5e80c3":"withdrawToken(address,uint16)","2f5e8d29":"setDAIRate(uint256,uint256)","2f5ebbaa":"marketState(address,uint256)","2f5f3b3c":"pointer()","2f605106":"getSponsor(uint256,uint256)","2f6113dc":"assignICOState(address,uint256,uint256,uint8)","2f6174ef":"getSig(bytes,uint8,bytes32,bytes32)","2f62a6ff":"fipsRegister(uint256,address,bytes)","2f634a90":"getOwner(address,uint256)","2f635c6a":"VolumeImbalanceRecorder(address)","2f63e2fa":"_incrementTokenBalance(uint16,uint16,uint8,address,uint256)","2f640a09":"setConfirmer(address)","2f646bd5":"ArmMoneyliFe()","2f65142c":"getTransfers()","2f653279":"getReceivedTrade(address,uint256)","2f658c3f":"Raffle(uint256)","2f65be54":"transferBonusEarnings()","2f661946":"cliffPeriod()","2f668c5c":"etherFeeMin()","2f66d5a7":"KPOP_ITEM_CONTRACT_ADDRESS()","2f6701b0":"withdrawalList(bytes32[],address)","2f674ab9":"maybeUpdate()","2f677038":"grantUserRole(bytes32,string,address)","2f67cf56":"eth_fallback(address,bytes)","2f684b83":"addDecimals(uint256,uint256)","2f695053":"getCertifierAtIndex(uint256)","2f69ca13":"createCounts(bytes32,address)","2f69f161":"getGameResultPrice(uint256)","2f6a638b":"GetMaxEther()","2f6a6e20":"calculateMaxEggG0(uint64)","2f6ae467":"transferDocument(bytes,address)","2f6b7bbd":"Gubberment()","2f6b8143":"wethBalance()","2f6b9099":"completeOrder(address,address,address,address,bytes32,uint256)","2f6c493c":"unlock(address)","2f6dc6b3":"removeBorrowingOfferItem(uint256)","2f6e2711":"Int256Oracle(int256)","2f6e931f":"changeBurnPausedTime(uint256)","2f6f1c68":"speciesSymbol(uint256)","2f700fb6":"autoJudge()","2f70197c":"_getBalanceFactor(bytes32)","2f7146cc":"setLockingTimestampFromTo(uint256,uint256)","2f71d022":"updateTokenInfo(string,string)","2f723c7f":"RewardHoDLers()","2f72d697":"GCOXOWNToken(string,string,uint8,uint256)","2f72ffaf":"getEmployerContractsByStatus(address,address,uint256[],uint256[])","2f73010a":"ratePerWeiFirstPhase()","2f7359a3":"TOKEN_STANDARD_ERC223()","2f73ef91":"getFundsWalletBalance()","2f743591":"burnFinished()","2f7442bb":"transferBounty(address,uint256)","2f745c59":"tokenOfOwnerByIndex(address,uint256)","2f75a929":"extractRepository(string)","2f76c31d":"roundTwoLimit()","2f77428e":"collectdustatcontract()","2f774e44":"getMsgSigner(bytes32,bytes)","2f77688b":"TestingUseCoin(uint256,string,string)","2f77dba4":"tokenPerEther()","2f781228":"IjasCoin()","2f781393":"setDiscountStep(uint256)","2f782b32":"weiContributed()","2f78bab1":"LockDiv(address,uint256)","2f78dc14":"ErrMsg(address,string)","2f7907e4":"calculateBestPrecision(uint256,uint256,uint256,uint256)","2f7981c2":"getWealthOfUser(address,address)","2f798500":"clockAuctionStorage()","2f7a163b":"nearestKnownBlockHash()","2f7a407b":"exchangeFormula()","2f7a7192":"capFiat()","2f7b3677":"getMetadataUrl(uint256)","2f7cdb0e":"DEV_DECIMALS()","2f7dbc9b":"fromInt256(int256)","2f7f3ecf":"findNextHour(uint256,bytes)","2f7f7f55":"approveFee()","2f80324c":"EURO()","2f8061d4":"repayment(address,uint256,address)","2f815ed1":"transferToContractCustom(address,address,uint256,bytes,string)","2f81bc71":"multiMint(address[],uint256[])","2f83e16d":"_allocateTokens(address)","2f83f781":"fetchSuccessfulSaleProceed()","2f851184":"H4DAddress()","2f85577f":"changeACAddress(address)","2f85f092":"destTokensAdvisors()","2f86282e":"CheckGameStart(bool)","2f865568":"liquidate(address)","2f869d26":"getAssetPoolAddress(address)","2f86f2ee":"MAX_OPEN_SOLD()","2f8803bb":"addressCOO()","2f885f79":"trakToken()","2f88ae5f":"setIco3Tokens(uint256)","2f899fec":"Pharmatron(uint256)","2f8a12fe":"setMsg2(string)","2f8abfbe":"roundIt(uint256)","2f8b023d":"allowedTransferFrom(address)","2f8b0250":"setEndTimeIcoStage1(uint256)","2f8bd891":"directMint(address,uint256)","2f8c239f":"giveAdvisers(address,uint256)","2f8c98c2":"flipMovingSwitchTo(bool)","2f8cfe0e":"deleteResources(address[],bytes4[])","2f8d2d19":"BurnAssignedFees(address,address,uint256)","2f8de810":"tokenPriceInWei()","2f8e7133":"lockBBK(uint256)","2f8f0c92":"canDeposit(bytes32,address)","2f8f175c":"seal(address,address,uint256)","2f8f8c0b":"approveCertificate(address)","2f8ffce8":"allItemsWrong()","2f9021fd":"withdrawToCooperate(address,uint256)","2f90daf4":"raisedForEther()","2f91822c":"ETHCollector()","2f91b591":"RemoveMinter(address)","2f923c59":"tokenCapForFirstMainStage()","2f926732":"register(bytes32,bytes32)","2f92acc5":"test_4_accessRestriction_execute_shouldThrow()","2f92b151":"HotLove()","2f92f5a0":"query1_fnc(uint256,string,string,uint256)","2f94afba":"cao()","2f94e335":"_createLambo(uint256,address,uint64)","2f95055e":"deleteHiddenPosition(uint32,int64[2],bytes16)","2f95b833":"requiredStackDepth()","2f969d43":"MAX_UNSOLD_RATIO()","2f977b3f":"newTask(string,string,uint256,uint256)","2f978ec0":"getProviderInfo(address,uint256)","2f98511c":"createHistory(bytes32,address,address)","2f991b5a":"hasMemberAccess(address)","2f99c6cc":"BENEFICIARY()","2f9a7c22":"TransferToWaves(uint256,string)","2f9a8bf2":"StreamerContractChanged(address,uint256)","2f9b3126":"founderShare()","2f9b4096":"removeExternalController(address)","2f9c1df6":"createDeposit(address,uint256,uint256)","2f9cb9aa":"getClosingTime()","2f9ffab9":"Airstayz()","2fa00e58":"fipsTransfer(bytes20,address)","2fa05208":"minimalGoalReached()","2fa06ff1":"exchangesLockEndingAt()","2fa07bfc":"_increaseApproval(address,uint256,address)","2fa146d8":"officialEmail()","2fa1df4f":"RIG()","2fa241fc":"playerBook()","2fa267fc":"ReadBible(uint16,uint16,uint16,uint16)","2fa26aaa":"minimalEthers()","2fa30d33":"calcResolve(address,uint256,uint256)","2fa3a41e":"testLowestTranch()","2fa3e006":"CreatedToken()","2fa49c06":"SetTxFee(uint256,uint256)","2fa4f694":"setAssessorPool(uint256,address,uint256)","2fa553d3":"sendMinerByOwner(address,uint256)","2fa5620a":"Mpay(uint256,string,string)","2fa61cd8":"generate(address)","2fa6512f":"clearWalletPending()","2fa69585":"strikeCall()","2fa78393":"returnUserBalance(address,address[2],uint256[7],uint8,bytes32[2])","2fa7cbfb":"getExecCost(uint256)","2fa80164":"AgruCoin()","2fa8591e":"TACTICALCRUISER()","2fa92dde":"jackpotConditionPercent()","2fa94fb3":"teamTrustAccount()","2fa975c5":"seatsList(address,uint256)","2fa99791":"completeOrderBySafePeriod()","2faa2998":"startICO_20_December()","2faa3014":"uintFunc(uint256,uint256)","2faa5e3c":"changeMerchantAccount(uint256,address)","2faa9bbb":"LockClaimed(address,uint256)","2faad46f":"addAllowedTransactor(address)","2fab662a":"_decreaseMintApprovalAfterMint(address,uint256)","2fabc174":"multFracCeiling(uint256,uint256,uint256)","2fac1a54":"newOrder(bool,uint256,uint256,uint256,uint256)","2fac1d36":"isReadyFor(address)","2facc4e8":"depositGovernance(uint256,address)","2faccbeb":"changerProprio(address)","2fad380d":"burnWithDecimals(uint256,uint256)","2fae43dc":"m_ETHPriceLowerBound()","2faebb20":"getBettersArrayLength()","2faef47a":"AbcToken()","2faef4e5":"getGranteesSize()","2faf1895":"saveContractEvent(string,string)","2faf9a93":"checkUnsold()","2fafb11d":"get_profit_by_roll_under(uint256,uint256)","2fb07482":"restoreWebGift(address)","2fb131d4":"preicoClosed()","2fb1746d":"turnOnTradable()","2fb1b25f":"sign(uint256)","2fb22cfa":"ECO_SYSTEM_STAKE()","2fb260f6":"EthertokenDelta(address,address,address,uint256,uint256,uint256)","2fb27669":"preSaleComplete()","2fb2a061":"rateForDays(uint256)","2fb2bcf4":"postTwit(string)","2fb2f3dd":"updateFrozenToken(address)","2fb556f7":"tokenNeedForBonusLevel0()","2fb565e8":"update(uint256,uint256)","2fb5b5f6":"setNextSnapshotBalance(address,uint256)","2fb61f7d":"dispute(address,bool,uint256)","2fb767c5":"failSubtractWhenALessThanB()","2fb840f5":"transferFrom(bytes32,bytes32,uint256)","2fb88284":"parseRLPHeader(bytes)","2fb9d203":"VoteSubmitted(address,bytes8)","2fbaba26":"setHash(uint256,string)","2fbac05c":"transferManagment1(address)","2fbbc9c9":"calcCoinsReceived(uint256)","2fbbde2d":"buyDrago()","2fbc0bf1":"getSalePrice()","2fbc2449":"COLETOKEN()","2fbc8353":"ownerCanBurn(bool)","2fbcf568":"getCurrentCryptantFragmentPrice()","2fbd2134":"_migrateExpiredCrates()","2fbd2432":"transferExternalToken(address,address,uint256)","2fbebd38":"foo(uint256)","2fbf6f73":"TRNDToken()","2fbfbc85":"PETTCOIN()","2fbfc252":"changeTeamETHAddress(address)","2fbfc376":"HRY(uint256,string,string)","2fbfe951":"change_min_amount(uint256)","2fbfeba9":"getTokenAddressByName(string)","2fc0aad3":"isNumericString(string)","2fc15517":"kelly()","2fc17e40":"TdeStopped(uint256)","2fc17f8b":"setCompte_3(string)","2fc35948":"SCWhitelist()","2fc3f13f":"WindowPeriodClosed(address,uint256)","2fc4eea0":"removeName(bytes32)","2fc516e3":"COMMON_BUDGET_AMOUNT()","2fc52220":"setPOOL_edit_19(string)","2fc5a8ec":"Joules()","2fc60405":"TANK_TYPE()","2fc64ff7":"organizer8()","2fc6e8b7":"isEnd()","2fc71565":"setMarketplaceAddress(address,address)","2fc761a6":"createItem(uint256,string,address,uint256,uint256,uint256,uint256)","2fc77d85":"TotalETHGivenToNorthPole()","2fc8124d":"setSecondWallet(address)","2fc84de8":"XCTToken()","2fc8c39d":"TADPOLE_BASE_REQ()","2fc94ba6":"getAddressArrayLength(bytes32)","2fc9a415":"_emitAccessGiven(address,bytes32)","2fca3b0d":"TBECrowdsale()","2fca5414":"isTAO(address)","2fcaa8fa":"removePresaleHolder(address)","2fcb20e9":"changeReserveTeamRecipient(address)","2fcb6628":"_stringGas(string,string)","2fcd410a":"MiniPoolEdit_2()","2fcd6075":"BlocktekUniversity(address)","2fcdeba1":"fund_owner()","2fce1291":"EcroContract(uint256,uint256,uint256,uint256,uint256)","2fcf84bf":"getEthereumFromPreIco()","2fd0f37e":"claimConsolationPrizeLoot(uint256,address)","2fd23817":"MFTU()","2fd3bd2e":"passFoundation()","2fd3dee8":"testDisputedValidMemoryAccessSequence()","2fd3fc9d":"bthFoundationWallet()","2fd463e1":"STARTMETADOLLAR()","2fd47643":"getRoundIssued()","2fd4ec28":"terminateIco()","2fd4f2f9":"changePreICODates(uint256,uint256)","2fd55265":"depositToken(address)","2fd5a13d":"GetClientCategory()","2fd5ecda":"b66AdvisorFundDepositAmt()","2fd6d40b":"getBetValueByGamble(uint8)","2fd949ca":"terminateContract()","2fd95a6f":"createGen0(uint256,uint256,uint16,bool)","2fd97c7d":"AllotAward()","2fda7166":"stopReceiveTicket()","2fdadc21":"sendtoA(uint256)","2fdae3c5":"addProposal(string)","2fdaf6af":"claim_tokens(address,uint256)","2fdb3e6c":"getBalanceETH(address)","2fdbb3d4":"cumAcceptedDeposits()","2fdc505e":"mine(bytes32)","2fdcfbd2":"sendToken(address,address,uint256)","2fdd653e":"getFortune(uint256)","2fdde1d4":"setUseTimeBasedBonus(bool)","2fddf859":"getLockedTokens_(address)","2fdeca37":"DEFAULT_TEXT()","2fdf15d5":"usernameToAddress(bytes32)","2fdf795a":"BOUNTY_TOKENS_PERCENT()","2fdfd2ae":"checkSecret()","2fe045fa":"initiateClaimDelegated(string,bytes32,uint8,bytes32,bytes32)","2fe1c0f8":"tokenTransfer(address,uint256,address[])","2fe20e94":"totalRestrictedTokens()","2fe29c78":"auctionIdToSeller(uint256)","2fe45a8d":"RetailSale(address,address,address,uint256,uint256,uint256,uint256)","2fe4b2d9":"submitSteak(address,address,bytes32)","2fe55632":"NexxusToken()","2fe69430":"TokenERC20(uint256,string,uint8,string)","2fe6a47c":"largestPro()","2fe6ecb2":"PHASE3_SUPPLY()","2fe71915":"request(uint256,address,address,bool)","2fe7a0bd":"burritoData(uint256)","2fe8ace3":"changeSuperOwnership(address)","2fe9541f":"addIssueBounty(string,uint256)","2fe97e3a":"approveAndCall(address,uint256,string)","2fe9950e":"adminSetDuel(uint256,uint256)","2fe99bdc":"insert(string,string,string)","2fe9e1a9":"change_address(uint256,address,address)","2fe9f821":"startRefunds()","2fea0c40":"revealBid(bytes32,uint256,address,address,bytes32,uint256,uint256)","2fea6915":"weiReqFund()","2fea7b22":"GetIndex(uint256,uint256,uint256)","2fea7b81":"getIdentity(address)","2fea9624":"DepositorsQty()","2feceb46":"extend_end_block(uint256)","2fed3c9e":"VoteCast(address,uint16)","2fed7da0":"getNextBackUserId()","2feda2fa":"POI()","2fee26ce":"addApp(address,uint32,uint32,string)","2feee782":"YWBToken()","2feef2ec":"expectedAmount()","2ff077be":"updateBettingOpensTime(bytes32,uint256)","2ff284c2":"computeFee(uint256,uint256)","2ff2e9dc":"INITIAL_SUPPLY()","2ff36e9b":"BTHBCoin()","2ff420ef":"CHF_CENT_PER_TOKEN()","2ff42757":"approveAndCall(address,address,address,uint256,bytes)","2ff4f24e":"createLoveStory(bytes16,bytes32,bytes32,uint256)","2ff50b51":"modifyEscrowPrice(uint256,uint256)","2ff59dec":"getEthartRevenueReward()","2ff59ee7":"miningIncentiveWallet()","2ff5e00c":"setAttaccContract(address)","2ff5ec3f":"armyTanksCount(uint256)","2ff6c55f":"DEVELOPMENT_FUND_LOCK_TIMESPAN()","2ff6fe76":"priceToken()","2ff76163":"getAdres(uint16)","2ff7a81f":"getAvgReportingGasPrice()","2ff92323":"oraclize_query(uint256,string,string[4])","2ff98d53":"getStageClosingTime(uint256)","2ff9b03a":"hackDecisive(address,uint256)","2ff9f017":"exchangeNominsForHavvensAtRate(uint256,uint256)","2ffa815b":"changeHouse_and_Owner_Addresses(address,address)","2ffb054e":"setMarketplaceManager(address)","2ffb8631":"getReleaseLockfileURI(bytes32)","2ffb9e64":"updateGasForXaurData(uint256,uint256)","2ffbf988":"packedBytes(uint256)","2ffc7b7e":"firstDiscountPrice()","2ffda1e0":"setBlackflag(uint256,bool)","2ffda952":"walletWithdrawTokens(uint256)","2ffdaa44":"BDToken()","2fff7bb3":"assignMultirequest(uint256)","2fffaa00":"Kingdom()","2fffb3f9":"getLockFundsReleaseTime(address)","2fffe0dd":"rocketArrivalTime(uint256)","2fffee92":"setContingencyFunds(address)","30007ed3":"tgeStartBlock()","30008b48":"pullDividendPayment(uint256)","30012940":"checkTeamFreezePeriodOver(address,address)","300182b8":"sale1(address,uint256)","30021bae":"SubDiv(uint256)","300240d6":"MAX_REGULAR()","300309f0":"setUserPaybackRate(uint256)","30043d4e":"AddedToHolder(address,uint256,uint256)","3004ea88":"EOSDRAM()","30067bc8":"setRegistrationOpen(bool)","3006f513":"coinSendDifferentValue(address[],uint256[])","30073514":"_allocation(address,address,address,address,address)","30074c6c":"publicSaleRaised()","30092ded":"changeVoteWeight(address,int256)","30093319":"_setRevealsCount(uint256,uint256)","3009a265":"isReg(address)","3009bc01":"claimFreeDragon()","300a1a7f":"mixWithStringFunc(int256,string,bool,string)","300a246f":"can_get(address,bytes12)","300a411e":"getRecording(address,uint256)","300abd61":"m_numMembers()","300ac0e9":"priceTimeToExpiration()","300b59da":"initTokens(address[],uint256[],bool,bool)","300ba0ec":"prevTweetTime()","300ba8ab":"_decode()","300c229f":"changeMaxDepositAmount(uint256)","300c3091":"setMigrationContractAddress(address)","300c7063":"SbToken()","300cc37a":"paySomeRewards(uint32,uint32)","300d55a5":"transferAdvisor1Tokens(address,uint256)","300d9e90":"icoOver3()","300e4b3c":"setminprice(uint256)","300e7b2d":"firstAuctionsExtendedDuration()","301058c9":"DURATION_PRESALE()","30106b17":"calckeys(uint256)","3010b5cd":"clearWizzType(uint256[2])","3010f39d":"playersToBetIndices(address,uint256)","3011b4c2":"CreateARTL(address,uint256)","30124349":"balanceLoc(address)","301249eb":"setPercentWeiMC(uint256)","3013ad89":"RangeToken()","3013ce29":"paymentToken()","30140053":"burnIcoTokens()","3015394c":"cancelRequest(uint256)","30155f5e":"setzAddress(address)","3015a521":"totalSignatures()","3016a439":"getImageBlurredAt(uint256)","3016e108":"removeGameMachine(address)","3017fe24":"callAPIVersion()","3018205f":"getController()","30183a2c":"GemstoneToken()","30184635":"getMinCap(address)","3018579e":"TokenSampleG()","30188fdf":"BFreeContract()","3018c90a":"getSubOrderStatus(uint256,address)","301997ae":"fundEscrow(address,uint256,uint256,uint256)","301a9b09":"startPhase(uint256,uint256,uint256,uint256)","301b9307":"getABsort()","301c42d7":"issueRateDecDuringICO()","301cbcb3":"STARTING_RICE()","301cf6e7":"payoutsPaused()","301d5209":"delegatecall_selfdestruct(address)","301d5eda":"change_start_block(uint256)","301dd027":"TIER_2_CAP()","301df7ab":"_create(address,uint256)","301ea971":"lockReleaseDate1Year()","301ecf82":"_createEtherBro(uint16,address)","301f0464":"ratePerEthPhase3()","301f2dac":"getRegionPrice(uint16)","301f93e0":"calculateEthereum(uint256)","301fbdef":"totalWeiToBeDistributed()","301fdb54":"getPayouts(int32,int32)","30203994":"stage2_price()","3020a18e":"setSaleEnabled(bool)","3020ea8a":"retrieveEarnings()","302155e5":"CHAToken()","30223c12":"del_product(uint256)","30226121":"CCXCrowdsale(address,address)","30228a12":"YouAreRichToken()","30230796":"setTradeABIHash(bytes32)","30231ea4":"canRenounce()","30232cb0":"buySeele(address)","3023641d":"removeTokenGrant(address)","30238687":"ALLOC_NEW_USERS()","3023d0c4":"Ethstick()","302579c6":"getWarlordChestPrice()","30257bf7":"getByAddress(address)","3026a128":"LOG_InvestorExit(address,uint256)","3026aedf":"getTopBidders()","30288f03":"setFile(string,string,uint256,string)","30289c61":"getDetails(address)","3029300f":"nextSellTime(address)","3029948a":"phase_2_bonus()","3029ba69":"withdrawBountyTokens(address,uint256)","302a4100":"decayedTransferFrom(address,address,uint256,address)","302a7ff3":"getDAdmin(bytes32)","302bcc57":"playerCount()","302bda24":"getSell(uint256,address,address)","302c46ba":"ReleaseTokenForTeamAdvisersPartners()","302d350e":"firstChainedCallback(uint256)","302dfe97":"commissionPer()","302eb389":"transferFund()","302f3915":"LockFunds(address,uint256)","302f4303":"setRandomGenerateMethod(uint8)","30311898":"Account(address)","3032236f":"depositAndVest(address,uint256,uint256,uint256,uint256)","30322b12":"weiForMcr()","30323542":"_delOwner(address)","30324370":"fetchOrderByIdWithPayer(string)","30324f55":"DutchAuctionToBuy(address,address,address)","30326c17":"proposal(uint256)","3032f951":"advisorsBalanceMap(address)","30332aea":"P2()","3033f4d3":"pastOneHour()","30347537":"STARTING_CAT()","30366d5f":"getEventsCount()","3036d769":"minGasPriceGwei()","3037408d":"balanceOfAtTime(address,uint256)","3037801e":"recordNum()","3037cea3":"knownRoleNames(bytes32,bytes32)","3037e694":"disburseDividends(uint256)","30381f5f":"getHistoricalDelegation(uint64)","30389c45":"round1BonusSteps()","3039b1ce":"changeETHLockingAddr(address)","3039e6f9":"CHARITY()","303a2372":"getDSP(address)","303a36e2":"getRow(uint256)","303a88b4":"convertRate(address,bytes32,bytes,uint256)","303b069f":"enableEmergencyWithdrawals()","303b5d3b":"toInt(string)","303b8144":"MobilinkToken()","303b9379":"SetLogFile(address)","303bef74":"deleteAllMessages(address)","303c2569":"payRakeInternal(address,uint256)","303d0870":"limitForChecklistId(uint8)","303e74df":"descriptor()","303ed73a":"setSkills(address,uint256,uint256[])","303ee989":"isPendingDeregistration(address)","303f5f51":"LEGEND()","303ff1d8":"YDTC()","30406423":"payJackpot()","30411a27":"testAddGains()","3041ba2a":"setForecasting(address)","3042b17d":"setUmkaAddress(string)","304318d3":"editDuration(uint256)","3043cbc5":"newTankType(uint256,uint256,uint32,uint32,uint32,uint32)","30443062":"penultimateFeePeriodStartTime()","3045a299":"Society(string,address)","3045aaf3":"Symbol()","3046868d":"AccountStructs(address)","3046fe26":"XulToken()","30473c2f":"getSelectedName()","30490e91":"processProposal(bytes32)","304a45c2":"getvalues()","304a87b7":"setOpenGroup(uint256)","304ab76a":"DebtTokenCreated(address,address,uint256)","304bac6f":"func_0A6E()","304c69ed":"_packItemData(address,uint256)","304cb3d8":"setTrusted(address,address,bool)","304d50b2":"addStar(address,uint8,uint8,uint16,uint8,uint8,uint8,uint256)","304d95a6":"RefundPoll(address,address,uint256,uint256,uint256,bool)","304dd754":"IsActive()","304ddebe":"eventSetWinner(uint256,address,uint256)","304de747":"MARKET_CAP_PER_ROUND()","304dfd33":"_onRandomFailed(bytes32)","304e48bb":"LogFundingReceived(address,uint256,uint256)","304f34a0":"splitBid(uint256)","304f5027":"myUserWallet(address)","304f8af4":"sendBountyTokens()","30500684":"addEarlyBird(address,uint256)","3050226a":"addTransferableAddresses(address[])","30507451":"receiveBonus()","305075db":"NormalizeRanks()","305094ab":"ispackagesaleClosed()","30509bca":"claimBalance()","3050caa4":"calculateStake(bytes8,bytes5)","3050f769":"transactionsClaimed(uint256)","3052b75e":"changeEndTime(uint256)","3053aedc":"capDoublingTimestamp()","3054c79a":"transform()","30573dfa":"auditGuess(uint256,string,uint8,bytes,uint256)","305788fa":"newTransferProposal(address,string)","3057d5e0":"residualAmountPromille()","305876a7":"isRoundOver()","305939b0":"setReceiptAsset(address,address)","305997c8":"addIsSafe(uint256,uint256)","30599ba7":"SOSBOTTOM()","30599fc5":"recoverTokens(uint256)","3059ac30":"Escrow(address,address)","305a67a8":"cancelListing(uint256)","305a762a":"getTicketsCountByBuyer(uint256,address)","305a99c1":"Kemonocoin()","305b73d9":"configure(address,address,uint256,uint8,bytes32,bytes32)","305bcfab":"TrustlessTransaction_Protection_Seconds()","305d6d31":"stopFundRaising()","305e3552":"eggPrice()","305eae79":"updateBusinessWallet(address,address)","305ec69e":"finish(address)","305ed015":"giveReward(address)","305f17d5":"setCrydrController(address)","305fcef3":"decide()","306023a3":"allocateTeamTokens()","3061d568":"GOC()","3061e0ef":"changeRecovery(address,address,address)","3062cd8a":"purchaseETH()","30630699":"testDisputedWriteDifferentValueInState()","306387a4":"dealStatus(uint256)","3064061b":"checkNotSmartContract(address)","3064448e":"ASCCToken()","30659e74":"moneyBack()","3065a575":"setAElfDevMultisig(address)","3065d22c":"setVariationProbably(uint256)","30677b83":"multiplierFactor()","306781c1":"getCurrentPayoutBlock()","3068bffd":"grantIssuer(address)","30690468":"atleastZero(int256)","306a2ea8":"disapproveUser(address,bytes32)","306a401d":"delMarketMakerAddress(address,address)","306a8589":"p_update_mNewPlotTaxPercent(uint256)","306ab1ba":"forwardFundsAmount(uint256)","306ae57b":"standAndRebet(uint256,uint8[],bytes32,uint8,uint8,bytes32,bytes32,uint256,bytes32,bytes32,bytes32)","306b031d":"getGenerationEndAt(uint256)","306b0d84":"SetSharedStorage(address,address)","306b4dea":"addQuantityListItem(bool,address,address,uint256,uint256)","306c4ebe":"getCurrentTrancheVolume(uint256)","306c7290":"eth_balance()","306d4ed9":"userHasWithdrawn(address)","306df22d":"GPSDestination(int256,int256,uint256)","306e3e99":"COMPANY_SHARE()","3070352b":"buyAMI(string)","3070c38b":"checkTermination()","30710f01":"Crack(address,uint256,uint256)","30725c46":"_ownerOfPopInAnyPlatform(uint256)","3072cf60":"_initialized()","3073530b":"release_2()","3073c916":"cancelEscrowByProvider(uint256)","3073ef42":"calculateOperationFee(uint32)","307482cf":"POINT_ROOTNODE_ROLE()","3074cca7":"change_data(bytes32)","3074f556":"Compra_Ticket(uint256,uint256)","307540f6":"keys()","30756ab6":"MyTestToken()","3075f552":"getMax()","30762e2e":"allowManuallyBurnTokens()","30765517":"fechAllSumNumForCandidateByStage(uint256)","3076dc42":"intervalDuration()","3076e56a":"tankOut()","3077fdf1":"startNewICORound(uint256,uint256)","3078db6c":"transferAuthority(address)","3079ddc3":"isCanBuy()","307a1f46":"paramsValid()","307c6f8e":"job(string,string,uint256,uint256)","307c7a0d":"withdrawExcessBalance(address,address)","307ca045":"get_amount_minus_fee(uint256)","307d2a90":"priceEUR()","307e38ca":"isICAP(address)","307e8614":"returnUserBalance(address[2],bytes32)","307edff8":"endTokenSale()","307f35e6":"AobcToken()","307f6244":"changeMedia(address)","307f6b12":"findWinners(uint256)","30807e8e":"updateCSV(string,uint256)","3080b9c7":"SocialBlock()","30818189":"bonus1()","3082538f":"decimalMultiplier()","30835cc5":"BDCC()","3083a4f9":"withdraw_2()","3083ab1f":"closeContest(uint32)","30840c31":"testControlCreateWithParentForeignNotInUse()","3084e3ac":"nDEX(address,address,address,address,uint256,uint256,uint256)","30852db8":"newGame(uint256,uint256,uint256)","30859963":"getAttrVal(uint64,uint8)","3085c91d":"SellOrderCanceled(uint32,address)","30865362":"withdrawRemainingRewards()","308655b1":"A2AToken()","3086719a":"_setTokenUri(uint256,string)","3087110a":"donors()","30880441":"borrowFor(address,address,uint256)","308879bf":"setVoteCost(uint256)","308a9717":"_distribute(address)","308af165":"lastProcessedDay()","308b2fdc":"getProposalValueByIndex(uint256)","308b7fea":"rakeToken()","308c0065":"currentPrice(uint32)","308d6613":"getSignData(uint256,uint8)","308dc720":"DissolveBusiness()","308dccac":"EtherMinerals()","308e1b2f":"ltcId()","308e25ac":"InvestorsToken()","308e63f4":"TigerToken(uint256,string,string)","308f505b":"sellSupply()","308fb3ee":"GrapeToken()","3090bef7":"releaseLockedBalance(address)","3091bc8b":"acceptAndPay(bytes32,uint256[],uint256[],uint256)","30920505":"createInvestContract(address,uint256,uint256)","3092afd5":"removeMinter(address)","3092e73f":"getNoOfTokensTransfer(uint32,uint256)","30935e4b":"LogOrderCancel(address,uint256,uint256)","309424fe":"get_all_names()","30943fcf":"ownerCounter()","30945443":"update(address,string,string)","309593ee":"emergencyThaw()","30962d4d":"KyberContirbutorWhitelist()","309652ec":"getPoolMoney()","3097324c":"saleShare()","3097f94c":"blok()","30982855":"setPublisherStake(bytes32,uint256)","30986dea":"timeToFinishPresale()","3098d33a":"payoutPartners()","309945ba":"collectedFees(uint256)","30996897":"placeBet(address)","309ab7e1":"getIsParticipate(address,uint256)","309b40b2":"liquidityStatus()","309b7ed3":"deleteParent(uint256)","309ba120":"upgradeClass(uint256)","309c1769":"ProspectorsObligationToken()","309c315d":"calcTokenPriceFactor()","309c3ee2":"_grandPVPWinnerReward(uint256)","309d094b":"RELEASE_DATE()","309d6669":"addVerification(address,string,string)","309d8210":"ICOPart()","309d9358":"XENTToken()","309e078a":"destTokensBounties()","309e21a9":"rewardPromille()","309e36ef":"getNumberOfAccounts()","309e6005":"batchTransferEther(address[],uint256)","309e63e5":"SimpleConstructorInt(uint256,uint256)","309f7421":"buildTeamMapping(string,string,string)","309f955a":"updateTopicDescription(bytes15,bytes32)","309fcbdd":"MakeTradable(bool)","30a0b231":"oraclize_query(uint256,string,bytes[])","30a1d746":"shareholdersWalletAddress()","30a24abd":"create(bytes4,bytes)","30a3160d":"approveInternal()","30a35ce2":"getPOOL_edit_20()","30a39d5d":"preCoinSentToEther()","30a3ce81":"getNumChips()","30a55316":"smsCertifier()","30a69955":"setFeeInfo(string)","30a69b53":"PlutocracyAchieved(string,string)","30a7351c":"removeFromApprovedAddress(address)","30a7a11c":"setRateEarlyStage1(uint256)","30a8b2c9":"NUM_TEAMS()","30a95aa7":"payService(address,uint256,uint32,string,uint64,uint64,uint64,uint64,uint64,uint64)","30a95e67":"withdraw_eth(uint256)","30a9ef5b":"checkTokBalance(address)","30aa311a":"QMQCoin()","30aa81c6":"getPayer()","30aacc0a":"setProjectAgent(address)","30ab0a16":"setInstructor(address,address,string,string)","30abac7b":"randomNext(uint256,uint256)","30abf433":"signBBODocument(bytes32,bytes)","30ac3052":"sendText(string,string)","30ac324b":"apply(uint256,uint256)","30acd249":"oneEtherInKicks()","30aceb89":"validateRequestParams(address[3],address,uint256[11],uint256,bytes,uint256)","30acedf1":"ownerFreezeTokens()","30ad12a6":"initializeFundraiserToken(address)","30adce0e":"etherReceived()","30ae8d0c":"Xinfin()","30af41b3":"getValidatorByIndex(uint256)","30b0e001":"airdropTokenDistribution(address,uint256)","30b0faab":"changeSettings(uint256,address,uint256)","30b2b8aa":"mintPresaleTokens(address,uint256)","30b3409e":"getInitialDeposit()","30b39a62":"withdraw(string,uint256)","30b3a90c":"_setCurrentPassportLogic(string)","30b4429e":"submitBlock(uint256,bytes)","30b5198f":"blockNumberUpdated()","30b57b1e":"player(bytes32)","30b66475":"VerifSignature(bytes,bytes)","30b66cee":"claimProxy()","30b69426":"calculate_eligible_token_balance(address,uint256)","30b7222f":"mintcoin()","30b751d9":"rivetzRelease(uint256)","30b823f7":"userGrowthAddress()","30b8f85d":"HSB()","30b9af98":"withdrawFunding()","30ba040a":"TOKENOMICX()","30ba2d4d":"eidooSigner()","30bb7499":"_batchActivenessUpgrade(uint256[],uint256[])","30bbb55e":"instructions()","30bd2ba9":"MassivelyMultiPlayerOnlineVideoGames()","30bd3eeb":"tokenRewards(address)","30bd60ef":"marginCall(bytes32,uint256)","30bdd344":"getPossibleWinAmount(uint256,uint256)","30bdf202":"RobinHood()","30be5990":"updateThirdChangeBlock(uint256)","30bf2d3e":"whaleBalance()","30bfeded":"EffectAdded(uint256,uint256[])","30c0f8d6":"scheduleTransaction(address,bytes)","30c2927d":"concludeUFT()","30c2fb04":"UserAuthManager(address)","30c308d8":"testInsertCase()","30c30a50":"authorizeMintFulfiller(address)","30c33da7":"_addPresale(uint256,uint256)","30c3eaa8":"grant()","30c47f77":"getEtherCoinPrice()","30c5375e":"ConstructHuntStart()","30c5a614":"ethereumToTokens_(uint256,uint256)","30c74e04":"tokenWithdraw()","30c8a488":"ERCToken()","30c8f372":"getTrustedShopCount()","30c93307":"GetPermissionIdx(uint256)","30c97068":"plockFlag()","30ca0a53":"DELEGATION_HASH_EIP712()","30cb14d2":"pop(bool)","30cc1d18":"airDropShadowTag()","30cc248e":"increaseProfit()","30ccc891":"testTransferHandlesNegativeAmountRequest()","30ccebb5":"getStatus(address)","30cd90b8":"transferToAddress(address,address,uint256,bytes)","30cd9ac6":"TokenAuctionCompleted(uint256,address,address,uint256)","30cdc195":"xclusivecoinSupply()","30cdcc63":"MAX_ISSUED_FROM_OTHER_CURRENCIES()","30cddc83":"checkIfCustodiesServedETH(address[])","30ce7b5d":"generateWinNumber()","30ce8bd5":"_rightChild(uint8)","30ced655":"EventRandomLedgerRevealed(address,uint256,uint256,uint256,address)","30cf7af6":"FreeZombieCount()","30cfac6c":"assignTo(uint256,address,uint256)","30d02d83":"batchWithdraw(uint256,uint256)","30d07d61":"getParticipantName(uint256,uint256)","30d12640":"disableWithdrawal()","30d15b0a":"lockInQuarterFinalPrize()","30d1c191":"MetaPoc(address)","30d2219b":"add(string,string,string,string,string,bytes32)","30d2474f":"buy1ticket()","30d281e0":"getChannelInfo()","30d323ae":"NHC()","30d4b967":"Octogram()","30d4d8d0":"_verifyHistoryInputOrRevert(bytes32,bytes32,bytes32,uint256,address)","30d500bf":"CFO()","30d636a0":"SmartVerifying()","30d65b72":"getPaymentsFor(address)","30d68214":"transactionReplay(address,uint256)","30d86516":"verifyTransferSignature(bytes32,address,uint8,bytes32,bytes32)","30d88a9e":"DISPLAY_VIDEO()","30d9161d":"cancelCreatorAuction(uint40)","30da4684":"buyPriceFinal()","30db7654":"activeBuy()","30dbb4e4":"isUnlocked(address,uint256)","30dcf0e8":"calculatedTokens(address,uint256)","30dd6a42":"totalSoldToken()","30dd9ee4":"confirmMinerQuest(address)","30de7e88":"FINXToken()","30df2c47":"currentSeller()","30df7727":"canRemove()","30dfc62f":"fundValueCount()","30dfe1da":"getTransactionCount(bool)","30e0789e":"_transfer(address,address,uint256)","30e07be0":"getMaxAmountToWager(uint256)","30e08a6e":"adjustMinter(address,bool,int256)","30e1e4e5":"freeze(address,uint256,uint256)","30e1f16f":"claimDividendAll()","30e26cb8":"disableBundling()","30e290e4":"Twitter()","30e34360":"setValue(bytes32,bytes15)","30e44278":"howVotesHasDispute(uint256)","30e45c14":"preSaleHasEnded()","30e4f9aa":"contractbalance()","30e57b67":"getNumberOfCrySolObjects()","30e5be52":"Prototype()","30e656d8":"addAnimal(uint256,bytes32,uint8)","30e6570b":"BucketSell(bytes32,uint256,address,uint256)","30e664f6":"getBuy()","30e6c333":"producedGoldCaps()","30e6d8d3":"addInitialInvestor(address)","30e7002c":"POCN()","30e76dae":"getContractEtherBalance()","30e77c75":"EthTranchePricing(uint256[])","30e804d1":"withdrawFromProject(address,address,uint256)","30e80864":"setTrustedAddr(address)","30e82803":"balanceOfByPartition(bytes32,address)","30e8b963":"reserveMember()","30e9c341":"updateTimeLock(uint256)","30e9f6ed":"STATUS_NO_DEAL()","30ea55a0":"updateEventStartsTime(bytes32,uint256)","30eaa9b5":"priceIncrease_20_February()","30eb4ba8":"setHoldDuration(uint256)","30ec0e2b":"setHolder(address,address,address)","30ec98a1":"OKFToken()","30ece116":"setOpeningTime()","30ed54ed":"setVestingToken(address,address)","30ee776c":"StopTransferToken()","30ef3d56":"takeNumber(uint256)","30efac4e":"changeCardPrice(uint256)","30efb8d3":"doUnpause()","30f1154f":"updateNodeIPFSHash(bytes)","30f12642":"createContractPreciousForEdition(address,uint256,string)","30f1fe82":"checkLength(string)","30f20847":"CandyBox()","30f24455":"_getProductShopInfo(uint256)","30f3f0db":"increase(uint256)","30f46b70":"power(uint8,uint8,uint8,uint8[176])","30f4f396":"UTBTokenTest(uint256,string,string)","30f4f4bb":"getMarketData(bytes32)","30f56d21":"RoundEndTime()","30f59c1b":"lastTicketBought(uint256)","30f6716f":"HFCoin()","30f6eb16":"mintedForAccountInBlock(address,uint256)","30f75890":"MilestonesEntity()","30f7cf80":"stox()","30f7f148":"ONEPAY()","30f857f3":"addPrivateSaleWithMonthlyLockup(address,uint256[],uint256)","30fa27cc":"_BTC()","30fa9ef3":"SantimentWhiteList()","30faa3e9":"compareHands(uint8,uint8)","30fb641b":"PurchaseFailed(address,uint256,uint8)","30fb6bfb":"setMessage(uint16,string)","30fb7541":"_createSkull(uint256,uint256,uint256,uint256,address)","30fba22f":"changeManipulatorAddress(address,bool)","30fbe411":"endIco3()","30fd300f":"registerBytes32(address,bytes32)","30fd7696":"createLoveStoryWithData(bytes16,bytes32,bytes32,uint256,string)","30fe86b7":"declarePulicOfferingPlan(uint256,uint256)","30fee9b1":"setICOtime(uint256,uint256)","30ff2ad5":"needVerifiedAccount(bool)","31002556":"getAmountToGive(bytes,uint256)","310092b9":"REFUND_TIME()","3100ef7b":"Fulcrum()","3101170b":"addPixelPayable(uint256,uint256,uint256,uint256,uint256)","31014853":"buySWL()","3101ab7f":"confirmEjectment()","3102b21a":"setAllocation(address[],uint256[])","3102be4c":"ownerHistoryOf(uint256)","3102deb7":"SetPlayerBetInfo(uint8,address,uint256,uint8)","3103fa26":"firePaidProposalEvent(address,uint256)","310441fa":"payees(address)","31047973":"lightpool()","3104b21a":"unApprove(address,uint256)","3106aa80":"getLLV_edit_21()","3106fea0":"voteOnProposal(uint256,bool,uint256)","31076417":"setTokenUSDRate(uint256)","310774a3":"setContractPreICO(address,address)","310781e7":"LogCertificationDbRegistered(address)","310815ee":"setDesignatedReporterShowed(bool)","31085c5f":"getAddressByNickname(string)","31088032":"MTOKEN()","310883a8":"player2Timestamp()","3108bd87":"voteNoLockBatch(address[],uint256[])","3108f0d7":"isNotZero(uint256,string)","310b065b":"cerotest()","310bc5fc":"newAsset(uint256,uint256,uint256,bytes32,bytes32,uint256,bytes32)","310bd74b":"reset(uint256)","310c0c1e":"minRollUnder()","310c87cc":"NFTAddress()","310ce4e2":"execute(bytes32,address,int256)","310d3f69":"token_description()","310e5ce7":"isBreedingMarket()","310ec4a7":"setAllowance(address,uint256)","310efb48":"setResult(uint256,uint256)","310eff5d":"pageByGroup(string,uint256)","310f4cdd":"mint(uint256,string,uint256,uint256,address)","3110235a":"maxInvest()","311028af":"initialTotalSupply()","311104f3":"getMintRequestsLength()","31119b4d":"changeDeveloper(address)","3111dcfd":"_nextAmount(uint8,uint256,uint256,uint256,uint256,uint256)","311277c1":"PHASE3_RATE()","3112fb6e":"BackToLife()","311325bd":"totalPledgedFees()","31134651":"donateToLovers(bytes32)","311385f4":"oraclize_query(string,bytes[3],uint256)","3113b8fa":"initDebris(bytes32,uint256,uint8)","311515a3":"disableInterface(string)","311551ad":"_getCalculationStartDate(bytes32)","311551d7":"MasternodeMinedTokens(address,uint256)","31159923":"isAllocatedICO()","3115b4c4":"bulkStoreHeader(bytes,uint256)","3115c3ee":"exploreEMONTFee()","3115d2ce":"ZitKOIN()","31170c0e":"Joyso(address,address)","3117d6bb":"request(bytes32,string,string)","31184dc3":"get2(uint256)","3118879a":"removeSurvey(bytes32)","3118dc71":"aSites(uint256)","3119255c":"setMinBetPerTx(uint256)","31198d19":"transferEthFromContract(address,uint256)","311a6c56":"rule(uint256,uint256)","311a985f":"testNotEnoughMemory()","311b2e98":"totalBetsMade()","311bcda6":"stage1Sale()","311c2644":"ironTokensaleRunning()","311d5a2a":"recordBalance(address)","311fb64f":"countInvestorsRefunded()","3120cefa":"NickoinToken()","31212a6b":"unicornRanchAddress()","3121369d":"validateRequiredStackDepth(uint256)","3121c7c0":"buyMultiplier()","312212c1":"stoptransfer()","312220bc":"payoutQuickBonus(address)","312253ae":"newOption(uint256,uint256,bytes32,bytes32)","31225ad1":"icoThreshold3()","31226f71":"writeMerchandises(uint8,string)","3123016d":"calcCostLevel(int256,int256[],uint256)","31230e23":"createWithParent(bytes32,bytes32,bytes32)","31232cd3":"pre_amount_stages(uint256)","312386b7":"techDevelopmentEthWallet()","3123bd9d":"memberProfitShare()","3124167b":"_getTokenAmount(uint256,bool,address,address)","312452b3":"mLoadAndReturn(uint256)","3125443d":"secondChangeBlock()","31277306":"buyByEth(address,uint256)","31288397":"payWithoutChecksum(uint128,address)","3128d1be":"buyName(string)","312975a6":"setReservedHolder(address,address,address)","312983dc":"LogForkAnnounced(string,string,uint256)","3129be35":"calculateCoinsPerWeiAndUpdateAvailableIcoCoins(uint256)","3129e6d4":"RATE_SALESTAGE3()","3129e773":"getItem(uint256)","312ad4b9":"banThreshold()","312c0684":"Organicco()","312cba69":"EternalStorageProxyForPayinMultisender(address)","312dae8a":"changeCrowdsaleClosingTime(uint256)","312defb4":"INITIAL_ENDTIME()","312df321":"p_update_mRefPercent(uint256)","312f8b19":"blockedTime(uint256)","31302244":"approveAsInvestor(address,int256)","3130e89d":"EtherShot()","313138e1":"tuneLambo(uint256,uint256)","313186e7":"_calculateTotalLockedBalance(address)","3131d8de":"etherflipContract()","31324b0a":"IOXOwned()","3132605d":"DinoToken(uint256)","313354dc":"maxSellable()","3133f2a7":"outstandingBalance()","31347482":"CSELToken(uint256,string,string)","3134e2e1":"_setCollectRoundLength(uint256)","3134e9be":"verifyLinkPrivateKey(address,address,address,address,uint8,bytes32,bytes32)","3134f4f1":"SpecialRatedCrowdsale()","3135471d":"privateEtherFunded()","3135ed16":"race_start_block()","313602d4":"claimRemainingTokens()","31361399":"setICODate(uint256)","31363c86":"esteem(bytes32,string,address)","3136fa86":"NeuroProtect()","3136fbb8":"totalBaseLareSoldInMainSale()","31375242":"ownerSetTreasury(address)","31378811":"updateUserDetailsInBulk(address[],uint256[],uint256[],uint256[])","3137f3d4":"FhnwToken()","31380c89":"TokenSale()","3138d328":"gameMining(address,uint256)","3138d8d5":"Bid(uint256,address,uint256,uint256)","3138ee5c":"getPermittedContracts()","31391828":"_computeTournamentIncentiveReward(uint256,uint256)","31399b4d":"indexOfOperator(address)","3139c691":"_isInWhiteAddresses(address)","313a9204":"addPurchased(address,address,uint256)","313aaf96":"Double(bytes32,uint8)","313b7b19":"finance()","313c4093":"newExit(address,uint256)","313ce567":"decimals()","313dab20":"treasuryBalance()","313f5a57":"tradeAirswap(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)","313f944f":"externalPurchase(address,uint256)","313fc3fc":"getMyRevenue(uint256)","314094c2":"devfee()","3140b09e":"distributeBonusTokens()","314312d3":"setEtherDeltaExecutor(address)","31434041":"burnSTCDR(uint256,uint256)","3143d97c":"setTimeLock(uint256,uint256)","3143fd60":"dev_allocation()","314475b2":"TokenEntity()","31447a32":"KeplerTokenCrowdsale(uint256,address,address)","3144c859":"executeCode(bytes)","31462b96":"the_nominal_annual_interest_rate()","3146a6bb":"transferTeam(address,uint256)","3146d282":"HyperTestToken()","31477b9b":"getString(bytes32,bytes32)","31483bdc":"PushToken()","314848fa":"CICoin()","3148ac62":"InitialRateChange(uint256)","3148f14f":"modExp(uint256,uint256,uint256)","3149694a":"burnHackingAmount(address,string)","314989b2":"SimplePHXSalesContract()","3149c440":"transferDomain(bytes8,string,address)","314a05db":"ownerRetrieveContractConfig2()","314a522e":"getTermsContractParameters(bytes32)","314aabb5":"EthDice50()","314cd12c":"createPromoToken(uint256,address)","314dd783":"GoldiamICO()","314e0fb6":"scheduleTransaction(address,bytes,uint256[3],uint256)","314e39c3":"trustContract(address)","314e99a2":"abdicate()","314ec2e5":"set_sale_owner(address,bool)","314ef8cb":"Besiktas()","31503ec4":"setFeeWalletAddress(address)","3150456e":"GenChipIndex(uint256,uint8,uint256[],uint256[],uint256[])","3150a7da":"HarvestedBabyBrain()","3150efbd":"beneficiaryMultisig()","31511e61":"getAffiliateCount()","31513039":"transferTokensFromAnyWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","3151609e":"setMetadata(uint256,bytes32)","3151ecfc":"myDividends()","3152dd00":"fundingActive()","31543cf4":"getTemplate(uint256)","3154d790":"rentByAtom(uint256,uint256)","3155625c":"setCleide(uint256)","3155c856":"getTotalF5()","3156560e":"setApprover(address)","31577cc0":"getModuleIDByAddress(address)","3157be49":"imageVerified()","3157d347":"nonVestedTokens(uint64)","31580446":"acceptDividends(uint256)","3158f643":"ico1Ended()","315a095d":"withdrawTokens(uint256)","315a0a09":"BasicForecasting(address,uint256,address,address,address)","315a6001":"purchaseUniqueSpinner(string)","315a6d65":"withdrawTeamToken(address)","315ad5ce":"resetGroupInfo(uint256)","315b86da":"MNPYToken()","315ccd21":"MAX_ETHER()","315d142d":"GayCoin()","315d758f":"_setERC20compatibility(bool)","315e2f1b":"setTestString(string)","315e3124":"pack(bytes4,address)","315e6c0a":"UpgradedContract(uint256,address,address)","315ebe81":"LockedOutTokens(address,address,uint256,uint8,uint256,uint256)","315f81c5":"useVaults(uint256,uint256)","315fd022":"MyToken(uint256,uint256,string,string)","315fdea3":"TreasureChest()","315fe684":"getMyPrize()","31601d09":"AuctionCreated(uint256,uint256,uint256,address)","31606828":"registrationDeposit()","3160d63b":"removeSupport(address)","31616395":"crowdsaleContract()","3162360d":"_emitBoardRatingGiven(address,uint256,uint8)","31629388":"setPendingValue(uint256,bytes32)","31638ced":"getDatasetByIndex(uint256)","3163b41a":"AdjustableRoundsManager(address)","31641629":"releaseSomeKims(uint256)","31649233":"allocatedTotal()","316524e5":"setGene(uint256,bytes)","31657926":"ticketsOf(address)","3165b26e":"transferOnBehalf(address,uint256,uint256,uint8,bytes32,bytes32)","31666144":"BTCproxy()","31666156":"latestReferenceBlockNumber()","3166e133":"Metropolis()","3166f49f":"balances_for_refund(address)","31670619":"GROWCHAIN()","31670ea7":"resetWithdrawEtherToValues()","31671a02":"TokenClaim(address,address,uint256,uint256)","31671f57":"Litecoinprivate()","31677980":"migrationCompleted()","3167e9d2":"infoUrl()","316866bf":"getRatingsForAddress(address)","316943cc":"transferExtOwnership(address)","31694d6f":"TEAM_TOKENS_SUPPLY()","3169ff3e":"LooneyLottery()","316a0131":"viewWinningOption()","316b08a0":"scheduleTransaction(address,bytes,uint256[7],uint256)","316b13b4":"setMemberContract(address)","316b8cab":"Oogroll()","316bc682":"setKYCLockupIgnoring(bool)","316cb1b4":"withdrawKittenCoins()","316db7f2":"updateInfo(uint256)","316e539e":"currentStanding()","316f2f06":"requestUnclaimed()","316fb7c4":"updateGoal(uint256)","316fda0f":"cycleCount()","317053f8":"setStringMember(string)","31707a05":"initOwner(address,address)","31711884":"tokenRate()","31711abe":"bookkeep(address,uint256,uint256)","31719c69":"lastPriceSetDate()","31723abd":"DMTokenC()","31729a45":"setCommission(address,uint256)","31748401":"_investorAddresses(uint256)","3174cc87":"refundToBuyersIfSoftCapNotReached()","31757f2e":"collisionCount()","3176bd18":"MyTestingToken()","3176d373":"updatePriceFci(uint256,uint256)","3176e734":"addHiddenPosition(uint32,bytes32)","3176f912":"getPlayersBattlePower(address,address)","3177029f":"approveAndCall(address,uint256)","3177b83a":"isCustomerHasACC(address)","317830b4":"crowdsalePaused()","31787b91":"maxIcoDuration()","31798893":"DistributedSoFar()","317a71ea":"_removePendingRequestId(uint32)","317ab6dc":"getChampsCount()","317b4b76":"setPreIcoMin(uint256)","317c00be":"maxTokensPerArticle()","317c0ae9":"tokensByZecTx(string)","317c1291":"isCrowdFundActive()","317d5d9b":"rand(uint32)","317d7a2b":"depositInfo(uint256)","317d9453":"getContractTokenBalance()","317ebc79":"scoreTeams(uint32[],int32[],uint32[])","317ec08b":"removeMaliciousValidator(address)","317ed7dc":"rebateTwoFenzi_()","317ffcf2":"getCreateUnicornPrice()","31806aaf":"unlockBalanceByKey(uint256,uint256)","318077a1":"Logo(address,address,string)","31809eac":"dayAfterInMinutes()","3182c3aa":"createSale(uint256,uint256,uint256,string,uint256)","31836cb9":"testMiddleTranch()","31839753":"getVolumeBonusAmount(uint256,uint256)","3183a55c":"Alchemy(uint256,uint256)","3183ef3d":"_release(address)","31845f7d":"setPublic(uint256)","31852177":"ConsToken()","31852a02":"allocate6ProjectToken()","31859556":"startPreico()","3185a61e":"getSellOrder(uint80)","31861423":"_deleteAllPackedRevisionTimestamps(bytes20)","3186f390":"tokensToPartner()","3187878b":"Follor()","31885119":"mintSelf()","3188949a":"DIT()","3188c5b1":"updateTotalChild(address,address)","3188da5f":"meltCoin(address,uint256)","3188ed13":"UNSOLD_ALLOCATION_SIZE()","3189418f":"connect_to_nodelist()","318992d0":"RewireToken()","318a3fee":"relayTx(bytes,int256,int256[],int256,int256)","318b526c":"AIGInvestment()","318cbe20":"BountyBG()","318dbcae":"releaseFundsBuyer()","318e6c78":"getAdminAddress(address,address)","318f0fe9":"acceptRequest(address,address)","318fd7e4":"HomeChainToken(address)","318fd93d":"registerSeller(string,string)","31906ebd":"airdropTotal(address)","3190abc0":"addCustomer(string,string)","3192164f":"idle()","31921cad":"headerColor()","319288d8":"setNVTface(address)","3192b995":"developer_crowdsale_text(string)","3192cccb":"queryTokenGrant(address)","31933916":"getMessageCount()","3193c749":"placeBet(uint256,uint256,uint256,int256)","31950032":"createContract(bytes32,uint16,bytes8,uint256,uint32,string,uint32,uint64[],bytes8[],uint32,bytes32)","319609fa":"EtherPiggyBank()","31970bd8":"nextRangeID()","31978b99":"changeBoardMetadata(bytes32,bytes32,string)","3197cbb6":"endTime()","31985b51":"sendGiftCard(address,address)","3198a38f":"findAllCliWithPendingTask(address)","3198acad":"Billionsgame()","319983f8":"FoundationSupply()","31999749":"getTimePeriodsUsed(uint256)","319a2494":"getBlockOf(address)","319a30d4":"setConfiguration(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","319a9395":"setGlobalLock(bool)","319ae4b2":"spaceCount()","319af333":"log(string,address)","319b0cd2":"calculateRate(uint256)","319b0e75":"getTotalInvested(address)","319c068c":"current_round()","319c33cc":"setOrganization(string)","319c7748":"_KiwiToken()","319dac48":"polishRoughStone(uint256)","319db3be":"advisorWallet()","319df3bf":"icoManager()","319f0852":"MSCTToken(uint256,string,string)","319f21b6":"placeGame(uint8,uint256,uint256,uint8,bytes32,bytes32)","319f3930":"mintFraCoins(uint256)","319f7700":"SealCrowdsale()","319f9887":"SnowdenAffect()","31a02bce":"requestMint(address,uint256)","31a06772":"scrap(uint256)","31a079ca":"ArtexToken()","31a2aba8":"create(address,uint256,uint256,address,address,address)","31a360b4":"LUVITOKEN()","31a36424":"getAllAdmin()","31a38c89":"executed()","31a3a506":"closeFunding()","31a3b36f":"blockDotTimestamp()","31a3b873":"ICO_MIN_CAP()","31a40b62":"delAuthorized(address)","31a51f46":"getTransactionConfirms(bytes32,uint256)","31a642db":"getTransferInfoValue(address,uint256)","31a73991":"GetUserIdByAddress(address)","31a76bca":"FOUNDERS_VESTING_CLIFF()","31a7d4c2":"LogPause(uint256,bool)","31a83ca2":"oraclize_randomDS_setCommitment(bytes32,bytes32)","31a8aeb3":"stakeFrom(address,uint256)","31a95c7a":"redeemTokens(address,address,uint256)","31a97ff0":"noteInitialReportingGasPrice()","31a9b2f2":"maximumPurchase()","31aa01c4":"contributed2(address)","31aa91fc":"completeContribution(address)","31aaa74a":"accountParent(address)","31ab4066":"testAuthorityTryAuth()","31ab6055":"TMCoin()","31abdd2a":"calculateEthValueFromTokens(uint256,uint256)","31ac7253":"releaseState3()","31ac76c7":"getSiteTokenLength(uint256)","31ad6b62":"sendToEthertoteDevelopmentWallet()","31ad836e":"Flabba()","31ae0019":"KissBTC()","31ae450b":"getAdmins()","31ae6b6e":"isFactProviderInWhitelist(address,address)","31af56ed":"transTo(address,address,uint256)","31afa55f":"decreaseMonsterExp(uint64,uint32)","31b0795c":"registerAddress(address,address)","31b259cf":"setUser(address,address,string,string,string,bytes32)","31b27c44":"DeusMarketplace(address,address)","31b28664":"PAGE_SIZE()","31b29629":"ownerAddBankroll()","31b2d49c":"cancelOrder(address,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)","31b31b88":"setTokenFee(uint256)","31b36c45":"CHECKgamberTwo()","31b39a56":"addWalletConfig(uint256,uint256,uint256,uint256)","31b3eb94":"withdrawPayments(address)","31b4784e":"lastUpdateOverall()","31b48f86":"setPeriods(uint32,uint256)","31b57b46":"initialize(address,address,bytes32,address,int256,bytes32,address,int256,bytes32,uint256)","31b59508":"LDIT()","31b5da2a":"numMC()","31b61ece":"getAllLeftHand()","31b62fae":"GetCardInfo(uint32)","31b6421e":"Approve(uint256,bool)","31b77da4":"getEmptyIndex()","31b7a196":"emitGenericLog(string,string)","31b7c458":"claimedAirdropTokens()","31b8b100":"Static()","31b93ae6":"MIN_PRESALE2()","31b97e45":"addGame(bytes32,bytes32)","31b9d81d":"kscBatchTransferToEcosystem(address,address[],uint256[],uint256,uint256[],string)","31ba7ede":"create(address,bytes32,address,bytes32,bytes32,address,bytes32)","31baa8ae":"getCitizenCharacteristics(uint256)","31bab608":"getVersionSelectors(bytes32,bytes32,bytes32)","31bac434":"unpauseMint(uint256)","31bae156":"getPartialAmountRoundedUp(uint256,uint256,uint256)","31bbb695":"takeCapital()","31bcce1c":"CryptoAtoms()","31bcd2b7":"sendTokens(uint256,uint256)","31bd1fa5":"levAddress()","31be23e4":"getLotteriesLength()","31be6985":"testBitXorSuccess()","31be6a17":"addNewGroup(bytes32,uint256,uint256)","31beedd9":"setOWhitelist(address[])","31bf0667":"tokensaleWallet()","31bf0b42":"setSB(uint256,uint16)","31c0018b":"listApi(uint256,bytes32,bytes32,string,string)","31c05b8f":"getWalletAddress(bytes8)","31c15301":"maxRandom(uint256,address,uint8)","31c1eea4":"delCEx(address)","31c29c25":"newContribution(address,uint256)","31c2b6e6":"animator()","31c2bd0b":"propose(address,bytes,uint256)","31c33669":"GetChequeInfo(string)","31c359fa":"getReferralAddress()","31c3e2c9":"VotingProxy(address,address)","31c3e456":"update(string,string,string)","31c420d4":"unfreezeTransfers()","31c42ca6":"testSell()","31c571f5":"setLastStellar(address,uint256,uint256,uint256)","31c5e407":"PaymentSubmitted(address,bytes8,uint256)","31c5e56b":"init(address,uint256,uint256,uint256,uint256,uint256,uint8)","31c6c4cf":"transferFromWithReference(address,address,uint256,bytes32,string)","31c78498":"Metadollar()","31c89d3e":"FromQueue(address,address)","31c91117":"withdrawAllEther()","31c9472a":"constantname()","31ca0bae":"DAO(address,uint256)","31ca208c":"greylist(address)","31ca4340":"GetTokenData(uint256)","31ca6b67":"setWinnerManually(uint256)","31cb27d7":"processHandEndSplit(uint256,uint256)","31cba838":"BOUNTY_ADDRESS()","31cbf288":"createContract(string,address,address,string)","31cbf5e3":"pay(uint256,address)","31ce6b47":"getTicketCounter()","31cfcf84":"IDAGToken()","31d03594":"getOfferPrice(uint256)","31d1c995":"_batch1_icosaleStartTimestamp()","31d29af1":"getMyWallet(address)","31d2f891":"crowdsaleAddress()","31d31647":"hasSenderVoted(uint256)","31d3518a":"IvoryToken()","31d35cb2":"getDayEthIn(uint256)","31d36cf0":"relaySellerCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)","31d397ef":"initialWallet()","31d4116f":"nextsize()","31d41325":"isMonethaAddress(address)","31d42bf2":"addBlackAccount(address)","31d4ac45":"bookWithLif(uint256,uint256,bytes,string,uint256[],bytes32)","31d4ed2e":"_isUnderLimit()","31d4fad4":"refundPayment(uint256,address,string)","31d6183b":"tokensToEth(uint256,uint256)","31d67353":"transfer_data(address,uint256,string)","31d694a0":"NEBC()","31d78a50":"signedApproveAndCall(address,address,address,uint256,bytes,uint256,uint256,bytes,address)","31d87de2":"setRBACAddress(address)","31d90e04":"canClaimPayout()","31d98b3f":"getPrice(bytes32)","31d9931f":"setOwnedTokensIndex(uint256,uint256)","31daabb7":"updateOwner(uint256)","31db4b95":"doTriggerAuth()","31db6c48":"TYPE_EXPLORER()","31db9efd":"right88(uint256)","31dbd8a5":"feeAuthority()","31de13e8":"tBonusStageEnd()","31de7e72":"iceFund()","31deb7e1":"nodeCost()","31e12c20":"setowner()","31e19cfa":"getStrategyCount()","31e396c8":"calculateYourValue1(uint256)","31e3e2fe":"WithDraw()","31e41fba":"_localFight(uint32,uint32)","31e5144c":"isAvailable(uint32)","31e574a5":"addProduct(address,uint256,string,string)","31e5f055":"one_card()","31e63199":"codename()","31e6a707":"getWalletInfoByIndex(uint256)","31e7b060":"constructProof(bytes32,bytes32[],bytes1[])","31e7bf9d":"Multivest(address)","31e88fee":"claimedPartnerPreICO(address)","31e8c7ba":"CertID()","31e8ebbb":"DenToken()","31e92f32":"blocksPerMonth()","31e99e2b":"getCurrentSmartSpeedPrice()","31e9e9c0":"unlockToken(address,uint256)","31e9ea8a":"PlaceBet(address,uint256,uint256,bool)","31e9ee7c":"currentIcoWallet()","31ea1a39":"cancelDeal(uint256)","31eaa5c9":"erc20CTH()","31ebd13f":"logAllStart()","31ee080d":"setComisionInvesorInTokens(address,bool)","31ee8277":"_createship(uint256,address)","31ef107f":"SetProfitAddr(address)","31ef916a":"approve_timed(address,uint256,uint256)","31f01140":"getUserInfoById(uint256)","31f0528e":"updateNextGameMinAndMaxBlockUntilGameEnd(uint256,uint256)","31f070d9":"getSet()","31f09265":"withdraw(address,uint256,bytes)","31f0fca1":"_addTokenToTranche(address,bytes32,uint256)","31f170c2":"coinSupply()","31f1fd2b":"setCriterionTime(uint256)","31f25330":"initialRound()","31f27c96":"isWarriorChest(uint256)","31f2c8a5":"whitelistedSenderAddresses()","31f2d72d":"TelegaSend(address)","31f3af90":"removeAuditorFromMultiRequestAssignment(uint256,address)","31f4a23f":"EtherDeltaWithdrawToken(address,uint256)","31f4f682":"investmentMin()","31f53447":"operatorProductCommissionInPerc()","31f607a5":"Coin_Character()","31f6eac8":"availableVolumeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint256)","31f72b44":"NewPhase(uint8)","31f76043":"resetSymbol(string)","31f850e6":"create(address,uint256,uint256,uint256,bool,string)","31f9a211":"getOrderState(uint128)","31f9a8f2":"accessToken(address,uint256)","31f9c919":"mintingActive()","31fa0a45":"withdrawAdamcoins()","31fa76db":"short_tokens(uint256)","31fa7c84":"cancelRent(uint256,uint256)","31fa8e73":"payrolls()","31fa90d8":"stopIssuingIndividualTokens()","31fb4c1d":"preIcoFinishTime()","31fb67c2":"withdraw(string)","31fc5b18":"MIN_BID_FRAC_TOP()","31fd725a":"PassHasBeenSet(bytes32)","31fdb712":"getFlight()","31fea236":"testFailTransferFromWhenStopped()","31ff1ed9":"linkDirectly(string,uint256,uint256)","31ffc9fa":"DentacoinTimeLock()","3200aa7a":"startRoundB()","32013ac3":"preallocate(address,uint256,uint256)","320228ca":"minimunEth()","32033229":"writeAddr()","32035ca6":"madeOperatorForTokens(address,address,address,uint256,bytes,bytes)","3203fe4b":"softcap1Reached()","3204dbc5":"distributeELTC(address[])","3205c5c1":"intunderflow(uint256)","3205f5fc":"division()","3206163f":"Drawcolor(uint256,address,uint256,uint256)","32064946":"start_buyer(address,address,uint32)","32064db7":"left20(uint256)","320665a6":"BCCB()","3206b2c6":"getLog(uint256)","3207230d":"purchaseVehicleSpace(address,uint256,uint256)","3207408f":"PrivateSaleCents()","32075c49":"buySCTK(address,uint256)","3207b544":"BRI()","32083c44":"payoutForWagerAndOutcome(uint256,uint8)","320878d5":"BFYToken()","32089b74":"LEGLToken(uint256)","32098d4c":"setCalculateFloatingValue(uint256)","3209943e":"proceedsAddress()","3209c6de":"iterate_start()","3209e9e6":"setMinimum(uint256)","320a352a":"ExposureCollected(bytes32,address,uint256)","320a5018":"MilestoneInput()","320a6c73":"transferFor_(address,address,uint256)","320a98fd":"lock(string)","320b2ad9":"_pause()","320bebaa":"setPromoMinPurchaseEth(uint256)","320cffcd":"getCostForCards(uint256,uint256,uint256)","320d2800":"finalizeSale(address,uint256)","320d2fa0":"liquidationThresholdPercent()","320d4534":"setMinSwapAmount(uint256)","320d46d4":"canRegister(address)","320dc63a":"TotalSTC(uint256,uint256)","320e028d":"setCountryToken(address)","320e6c01":"set_default_approval_duration(uint256)","320ea024":"isVerificator(address)","320fdc75":"one(uint256,uint256)","321022a5":"updateSettlementInstitution(address)","3210318e":"PotaosBucks()","3211bb90":"OwnerAddFunds()","32121896":"GDK()","32139a0e":"platformOperatorNeumarkRewardShare()","32145dd2":"gamePlayerNumber()","321489d4":"getDataByIndex(uint256)","3214e6ba":"cpow2(address,uint256)","3215b483":"getTokensByMerkleProof(bytes32[],address,uint256)","3216255b":"setCertificate(string,string,string,string,string,string,string)","3217e44e":"RGHTC()","3218b99d":"gameStart()","3218ebcc":"SUBMISSIONREWARD()","32191017":"updateFeeForCurrentStakingInterval()","3219ac2a":"showMyVote()","3219e73f":"addScore(string)","321a7c8c":"createVestingByDurationAndSplits(address,uint256,uint256,uint256,uint256)","321b3157":"firstPartOfTeamTokensClaimed()","321bbc1c":"test_insert_findWithHintNextUpdateHead(int256)","321c48f2":"getTemplate()","321cb98a":"creationMaxCap()","321db4d4":"getQueryAddress()","321de1d4":"BuyToken(address,uint256,string)","321f4584":"DataRegistered(bytes32)","321f63a2":"HMToken()","322062b8":"FixBet31()","3220ad89":"refundSuccessful(address,bytes32)","3220b95a":"getEscrowOrder_seller(uint256)","32214874":"verifyAmount(address,uint256,uint256,bool)","3221e125":"addBag(uint256)","32227425":"stopReceiveTicket(uint256)","3222ae71":"airdropFinished()","322370ff":"BetexStorage()","32246e9f":"auctionEnd(uint256)","322471cf":"createAffiliate(uint256,uint64,uint64,address,address)","32254992":"getPrevHash(int256)","32255d90":"confirmShipping(uint256)","32258794":"removeAddressesFromBlacklist(address[])","322671cd":"_checkLockUp(address)","32268c01":"artistsArtworks(address,uint256)","3226a94e":"TRNCoin()","3227563a":"logPriceAfter()","3227bd8b":"DragonCoin()","3228556f":"setPOOL_edit_8(string)","3228afcb":"HyperIslandCoin()","32293954":"LogTokenPreissued(address,uint256)","322a5e5f":"balanceContract()","322a7050":"addHospital(uint256,string)","322a8957":"teamTokenTimelock()","322b1bc0":"getarray_length()","322b8c7e":"dKERNEL_PANIC()","322e5021":"Penalty(address,uint256)","322eccdc":"withdraw_all_admin(address)","323046b1":"date()","32307c67":"LCASH()","323082d7":"Vote(string)","3230d486":"getHeroRequiredExpForLevelUp(uint256)","323162a9":"getDisputeParticipants(uint256)","3231a2b9":"voteSnapshotBalanceAutoBatch(address[],uint256[])","32326b44":"Invested(address,uint256,uint128)","3232f204":"SPAMed()","32331418":"ExchangeTokenToZWC(address,address,uint256)","3233b455":"appFundDeposit()","3233c686":"claimerDeposit()","3233c791":"nextlotnumber()","32347487":"forwardFundsToWallet()","32353fbd":"resumeAuction()","323560b5":"ZebraToken(uint256,string,uint8,string)","32363b47":"period1End()","32363e0a":"calculateMultiplierAfterBurn(uint256,uint256,uint256)","323661f6":"releaseLockedBalance()","32366ea5":"isOMITokenContract()","32366fb9":"makeTomatoes(address)","32369e38":"GetPlayerDynamicRatio(address,uint256)","32373e25":"CREATED_STAR4()","323772ee":"unlocktime()","3237d63c":"tgeLive()","32383a69":"WashCrowdsale()","3238c832":"updateDBZHeroDetails(uint256,string,address,address,uint256)","32395c2b":"addPayee(address,address,uint256)","3239825c":"edCoreContract()","3239d232":"weekProcessed(uint256)","323a5e0b":"deposits()","323a73d9":"generateId(uint256,uint256,uint256)","323a7acb":"Joyreum()","323aca70":"InterCryptoNode()","323b1b87":"FreezeTokenTransfers(address,bool)","323b2c26":"MAX_RELEASE_DATE()","323bc818":"_createTeam(string,string,uint256,address)","323be1c5":"canPause()","323bf0b8":"icoPhase2EndTime()","323c20fa":"tokenPtx()","323c59c4":"Common()","323cb59b":"uncooperativeClose(address,uint32,uint192)","323d5c68":"sendPer()","323dc51a":"MomoToken(address,uint256)","323ded4d":"_getLegendaryPlusRarity(uint32)","323df879":"MILLION_TOKENS()","323e71fd":"turnOffCanUpdateFrontWindowAdjustmentRatio()","323ea3f9":"photoText()","323efacd":"checkAndCallSafeTransfer(address,address,uint256,bytes)","323f6fe0":"VESTING_OFFSET()","323fe92c":"setPriceAttr(uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","32414926":"CarTaxiToken(address)","32418558":"stakeTokensManually(address,uint256,uint256)","32424aa3":"_decimals()","324298ff":"ArrayDemo()","32434a2e":"register(address,string)","324365b1":"createCollectible(uint256,uint256,address,address)","3243c791":"distributeDividends(uint256)","32443d7d":"developmentFundUnlockTime()","324536eb":"totalSupply_()","3245a55f":"mintFull(address,uint256)","3246887d":"setLedger(address)","3246bac5":"getGameIpfs(uint256)","3247dd8b":"ySignToken()","32484dab":"totalContributedUnits()","3248687a":"getLockSize(address)","32492f96":"getStellarBalance()","32495c58":"requiredEntries()","3249759c":"TAToken()","324a5562":"setMaxNumber(uint8)","324ab080":"MIN_BONUS()","324b0085":"createBlogger()","324b8ad2":"totalBurnLotsByAddress(address)","324b8d6e":"oracleConfig()","324c6add":"KBV01()","324cb3cb":"contractLocked()","324cf51a":"setPurchaseParamCount(uint256)","324da66f":"removePromoCode(bytes32)","324dd3b0":"getFighterArray(uint256[])","324ecd96":"power10(uint256)","3250e151":"PakEKO()","32513ce5":"newContractAddr()","32519e0e":"roundEth()","32525f09":"testTransferFromDoesNotAllowTransferOfMoreThanAllowedByDelegate()","325294e5":"calculateEthers(uint256)","3252b8fb":"returnGrantedToken(uint256)","3253277c":"badge(address,uint256)","3253ccdf":"burnNomins(uint256)","32546f7e":"HammerChain()","3254de48":"ITSEndTime()","32555f06":"dissBlock(uint256)","325586dc":"checkStateProof(bytes,uint256,bytes,bytes)","32564d82":"identifierToIndex(bytes32)","325654ae":"secondPrivateLockTime()","3257bd32":"getDepositorMultiplier(address)","3257d818":"hasResponded(bytes32)","32581fb0":"getArtefactById(uint256)","3258e255":"setWithdrawBeforeTime(uint256)","325a19f1":"created()","325ab9ac":"buildCharging()","325ad39b":"UltraNote()","325add98":"sellDaiForEth(uint256,uint256)","325c25a2":"auctionLength()","325c35c5":"setFightsAddress(address)","325cf9e6":"splitPayment()","325da1c0":"LogAllocateTicket(uint256,address,string)","325dfddf":"waittokens()","325ecf99":"addMarketingToken(uint256,uint128)","325f33e0":"checkUserByWallet()","325f9f41":"processShares(uint256)","32606387":"_draw3()","32608243":"Iou()","3260db59":"UnityToken(address,uint256)","32611e2b":"stage2_start()","32615457":"FullAssetRegistry()","32617353":"GoldBlockTickets()","32619375":"ChangeMiningReward(uint256)","3262207c":"isTransferProxy(uint32,address)","32624053":"blocksToWaitShort()","32624114":"isValidAccessMessage(address,uint8,bytes32,bytes32)","3262fd9a":"getMoney(uint256)","326360fe":"uncommittedTokenBalance()","32643513":"_computeContendersTotalHp(uint256,uint256,uint256,uint256,uint256,uint256)","32644829":"removePlayerFromBoard(bytes32,bytes32)","3264a34b":"getBoard()","3264a844":"hundredtimes()","3265bf5b":"registerPlayerToBoard(uint256)","3265c436":"btcsAddress()","32665ffb":"getProperty(uint256)","32666a31":"setMonsterObj(uint64,string,uint32,uint32,uint32)","326687b9":"onSale()","3266c856":"WanToken(address,uint256,uint256)","3266fb05":"lockedTime(address)","32670d10":"contributors_locked(address)","3267a2c5":"returnedToOwners()","3267db34":"setCurrentBadge(bytes32)","3268215c":"getPuppyAttributes(uint256)","3268419f":"PreSale(uint256,uint256,address,address,uint256)","32691d18":"updateLastTransactionTime(address)","326959cc":"MMMToken()","32696a92":"totalpatient()","326a794d":"safeMathSub(uint256,uint256)","326a7d77":"LEVEL_MAX_VALUE()","326abfce":"curent_mul()","326b0c7e":"BuyPresalePackage(uint8,address)","326b1001":"crowdSaleHardCap()","326b7a14":"WthdrawTo(address,uint256)","326cf61c":"toBytes(bytes32)","326dd62d":"migrationStartedTime()","326e8d60":"getTurnover(bytes32)","326fac6e":"getCurrentGames()","326fd584":"maxEtherCap()","32708966":"setMonsterIndexToApproved(uint256,address)","3270f753":"depositHouseTakeout()","327107f7":"targetToken()","32715bf2":"userContentByIndex(uint256)","32716063":"calcTotalFee(uint256,bool)","3272b28c":"allowedSenders()","32733a08":"balanceB()","32736fb0":"RoundsManager(address)","3273b110":"setMinDuration(uint32)","327419b7":"NeedsCoin()","327428b1":"Lockable(uint256)","32750350":"setcardaddress(address,address,uint256)","3276249f":"vrcWallet()","327683bb":"setIII_R3(uint256)","3276eaa9":"incrementContinuityNumber(uint32,int256)","32773ba3":"challengeExit(uint256,uint256,bytes,bytes,bytes,bytes)","3277bbda":"setUintF1IntF3AddressF3(uint256,int256,address)","32780d05":"closeChannel(bytes32,uint256,address,uint256,address,uint256,bytes32,bytes32,bytes,bytes)","3278ba2f":"getNumBounties()","3278c960":"terminateSelfDestruct()","3278dc67":"Founder()","327942a2":"move(bytes32,uint256)","32794823":"withdrawToOwnerCheck()","32797f44":"failedTimestampSecondsAt(uint16)","327a765a":"_getString(address,bytes32)","327a943a":"getUserAmount(address)","327b95b5":"USDXCoin()","327c0dd9":"resetLotteryManually()","327cc732":"registrantIndex(address)","327e36dc":"RefundVault(address,address[])","327efb0c":"supplylimitset()","327f0b6b":"pollTitle(uint256)","327fc33c":"isUpcoin()","32807be0":"PrymexPreICOCrowdsale(uint256,uint256,uint256,address)","3280922b":"TOKENS_SALE()","3280a836":"getPayment(uint256)","328175cd":"editorSignUp(address)","3281c4e1":"salesAllocation()","3281c4fa":"upRound(uint256,address,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256)","3281d576":"isContractMiniGame()","32820d5f":"setupWeiCaps(uint256,uint256)","328243d5":"changeSale(uint256,uint256,uint256,uint256)","32828d9e":"BbbToken(uint256,string,uint8,string)","32829a23":"OpenBankAccount()","3282aa8a":"individualMaxCapWei()","32833d51":"power(uint256,uint256,uint32,uint32)","3283f641":"task()","32846270":"goldSaleLimit()","3284d75c":"sendRefTVs(address)","3284fd79":"issue(address,uint32)","32859392":"dividendDecreaseFactor()","3285ecde":"tokensMintedDuringPreICO()","3285f406":"GetWithdrawalFunds(address)","3286b611":"Generate(address,address,uint256,uint256)","3286fb75":"addressNotSet(address,address)","3287c399":"isSignedBy(bytes32,address,bytes)","3287d0dc":"ownerLocked()","3287d0f6":"switchReserve(address)","3287db4b":"lockFunds(uint256,uint256)","3288eb0b":"ChineseCookies()","32892177":"TOKEN_VERSION()","328929e0":"Offer(address,address,bytes32,uint256,uint256,uint128)","32895c2a":"ERH()","3289e004":"redeemPackage(uint256,address,uint256,bytes32[])","3289fba6":"getSanPrevOwner(uint256)","328a2c2d":"updateStartDate(uint256,uint256)","328a8cc4":"addRestaurant(address)","328b10d7":"vestingStarts()","328c0ec0":"endPreICOTime()","328d15f4":"_getCurrentWeek()","328d8f72":"setEnabled(bool)","328db985":"getPotCnt(string)","328ede54":"DAFZOToken(address,address,address,address)","32902924":"signSendDiamond(bytes32,string,string,address,string,bytes16,uint256)","3290bd90":"getInfoFromBidding(bytes,bytes32)","3290ce29":"purchaseTokens()","3290f515":"addInterest(uint256)","32911111":"getroundinfo(uint32)","3291b39a":"addReserve(address,uint32,bool)","32921690":"checkDepth(address,uint256)","3292b71f":"transferCrowdSale(bool)","3292cd37":"payWithDailyFreePoint()","32931fbb":"left1(uint256)","329350ea":"storeOwnership(address,address)","3293d007":"isValidDateTime(uint256,uint256,uint256,uint256,uint256,uint256)","329430ca":"teamAllocated()","32947122":"updAirDropTokenDestroy(bool)","32948515":"QLinkToken()","3294ab00":"withdrawBtc(bytes,uint256)","3294c2d7":"updateDocument(uint256,uint256)","32958fcb":"boolToBytes32(bool)","3295feb3":"numAuthorities()","32967ea0":"isOlderOwner(address,address)","3296a373":"createPromoPerson(uint256,address,uint256)","3297ef5b":"voting_started()","32985244":"joyTokenContract()","3298caa3":"getDoneRegistrationAmount(address)","3298e6c8":"GanaPublicSale(address,address,address)","32990ad2":"rewardTokensForClient(address,uint256)","3299ad23":"PapushaToken()","329a23b8":"Wallet(address[])","329a27e7":"getWalletBalance()","329a88d5":"UBIATARPLAY_CAP()","329b1c92":"getReferral()","329b59d1":"fallback(uint256)","329b8f38":"yesCount(uint256)","329bfc33":"getCurrentWinner()","329c095b":"getLatestReading(string)","329ccce1":"vmaxEtherPerPurchase()","329cd958":"get_next_item_in_state_from_item(bytes32,bytes32)","329ce1b7":"delOwner(address,address)","329ce29e":"buyTile(uint256)","329d1a35":"testReentracyGuard()","329d1a8b":"depositIndex(uint256)","329d3346":"closeVote()","329d5f0f":"setApprovedUser(address)","329da011":"addNewToken(string,address,address)","329daf90":"onlyPauserMock()","329eac15":"phase2Price()","329f36b5":"BONUS_TIER_2_LIMIT()","329f5b21":"DiatomAirdrop(address,address)","32a16f4e":"isLocked(bytes32)","32a21a28":"registerInvitor(address,address)","32a2c5d0":"getContractAddress()","32a2fda7":"isPermissionGranted(address,string)","32a36e53":"enterRound(bool)","32a3869a":"getBonusPercentage(uint256)","32a3abbb":"LALATokenAddress()","32a42882":"buyPropertyInPXL(uint16,uint256)","32a45ac5":"addMessage(address,uint256,uint256)","32a521c1":"disallowToLock(address,address)","32a52fcd":"FOR_ICO()","32a54712":"DecalinxCoin()","32a55bb4":"swapActivity()","32a58dc2":"change_client_manager(address)","32a6baf6":"isTimePassed()","32a71b36":"AleaCoin()","32a7ae95":"deleteClaim(address)","32a7d7c2":"AddressOwnershipVerification()","32a7e45a":"eosBlanceOf()","32a80329":"getTokenTransferable()","32a8589a":"FercCoin()","32a89e50":"NextBabyIs(address,uint256)","32a8bb33":"getParticipantIds(string,uint256,uint256)","32a8d49e":"ADV_TEAM_TOKENS()","32a8e74c":"participateBuyback()","32a92229":"creditBalanceOf(address)","32a9df46":"setSecondBonus(uint256)","32aa952f":"UpdateSellAgentCreators(address,address)","32aae34d":"LogVoteToFreeze(address,uint256,uint8,bool)","32aaf9d7":"addCommissionAmount(uint256,address)","32ab6af0":"newRepoWithVersion(string,address,uint16[3],address,bytes)","32aba656":"stillAvailable()","32abff8e":"lastBlock_v5Hash_uint256()","32ac752b":"matches(string)","32ace499":"getNextOrderPrice(address,address,uint256)","32aeaddf":"lockingPeriodInMonths()","32af5858":"behalfBet(address,uint256,uint256)","32afa2f9":"claimEtherOwner(uint256)","32b12eac":"setFallback(address)","32b182c3":"eligible(address,uint256)","32b1ad5a":"checkContructIsLocked()","32b28b95":"edoPerWeiDecimals_()","32b30b64":"calculateUnsoldTokens()","32b3c323":"anyoneEndICO()","32b431da":"setPlanetAuctionAddress(address)","32b45055":"EREEBERRY()","32b4623a":"shareCertificate(string,string,string,address,address,string)","32b4b5ed":"openProvider(bool,string,string,uint256,string,uint8,bool,address)","32b4d74c":"getNumRemainingSeats()","32b525bb":"beginMotion(address)","32b5b2d1":"missedVerificationSlashAmount()","32b65a95":"getSplitCount(string)","32b680d6":"payReceiver(address)","32b693b0":"PetCoin()","32b6f97a":"UXDToken()","32b7214e":"setNextSnapshotTime(uint256)","32b734b7":"awardsEnd()","32b85a44":"currentWeight()","32b8c086":"testSuperUser(address)","32b98616":"updateCardDetail(uint256,uint256,bytes32)","32ba36d6":"EtherShare()","32ba4b8b":"RANGEEND_5()","32ba65aa":"clearBalance(address)","32baa8d9":"existingCategory(uint256)","32bafb2c":"withdrawMln(address,uint256)","32bb2c0d":"calc(uint256,uint256)","32bbb8cc":"mgrVotes(uint256)","32bbc1c8":"WEI_PER_USD()","32bc873d":"AZExchange(address,address,address,uint256,uint256,uint256)","32bc934c":"MILLION()","32bd8644":"MPYRefund(address,uint256)","32be9502":"getOwnerInAnyPlatformById(uint256)","32bf1def":"FACTOR_2()","32bf775d":"testControlTransferDisabled()","32bf9e5b":"AfricacoinToken()","32bfaa23":"initializeRefundableFundraiser(uint256)","32bfdc38":"ROC()","32c0c583":"setDenyPremium(bytes32,bool)","32c0f801":"tokenFacebook()","32c0fba5":"airDrop(address,address,uint256)","32c1eb82":"getActualRate()","32c22154":"livepeerToken()","32c26957":"isTimeout()","32c2ed9a":"inquire(uint256,uint256)","32c35352":"marketSale(uint256,string,address,address)","32c3de5d":"listCreatedTokens()","32c442d6":"Super87Coin()","32c468fa":"setPreFundingStartTime(uint256)","32c4903d":"getAllParents(bytes32)","32c514d5":"getJobDetailsIPFSHash(uint256)","32c66a9d":"Nome_vincitore()","32c6f294":"deadline120()","32c6f315":"exchangeIsRunning()","32c716b6":"dividendsAcc(address)","32c7de60":"_RamenCoin()","32c862ed":"inSalePeriod()","32c896d4":"REFERRAL_BONUS_LEVEL4()","32c9635b":"_getEthUsdPrice()","32c990b4":"getUserKeys(address)","32ca5587":"isWoidRegistred(address)","32ca966e":"toTileId(int32,int32)","32cae0a8":"userPoolFund()","32cb46e0":"totalContributedWei()","32cb6b0c":"MAX_SUPPLY()","32cb93d9":"getPaintingName(uint256)","32cc0105":"setAmountForDeal(uint256)","32cc6a9f":"modifyNextCap(uint256,uint256)","32cce1e4":"_unlockTokenByIndex(uint256)","32cd0487":"delist(address[])","32cd0b3d":"totalRemainSupply()","32cd3148":"CashmoneyToken()","32cd724a":"getStateStartTime(bytes32)","32ce92cb":"setFIRST_STEP_MULTIPLIER(uint16)","32cea83e":"birth(bytes)","32cee2eb":"getMinableSupply()","32cfbe90":"initialBalance(address)","32d05a53":"IdToAdress(uint256)","32d05c6d":"withdrawXPA(uint256,address)","32d17917":"SPECIALIST_THREE()","32d1ae2e":"RepairCenter(address,address)","32d2e55c":"subSafe(uint256,uint256)","32d2fb9f":"getRefRemainingTime(uint256)","32d33cd0":"isRedeemed(uint256)","32d3725b":"burnStage(uint256)","32d3b711":"getPI_edit_29()","32d540af":"_clearExtraReceivers()","32d5fe98":"revealCampaign(uint256,uint256)","32d68fd5":"transferFeeNum()","32d69342":"terminateServer(uint256,uint8)","32d6eeb5":"changeQueryDelay(uint256)","32d72694":"updateGameTimes(uint256,uint8)","32d79689":"currentNiceGuyIdx()","32d80490":"Dandy()","32d8a3bd":"initCommunityReputation(address)","32d8eee5":"testFailSetNotUpdatableNotOwner()","32da1329":"setStartEndTime(uint256,uint256)","32da3fe3":"upgradeComponent(uint256,address,address)","32da57cf":"getTheStocksTokens()","32da7448":"amout()","32da7840":"isWhitelistAgent(address)","32dae2a5":"maxAmountICO()","32db8e2b":"MAX_RECEIVED_PER_PERIOD()","32dbc7d4":"NECPToken()","32dbeb21":"GoalMinimumReached(address,uint256,uint256)","32dc04aa":"changeBlockTimeAverage(uint256)","32dc2a01":"setmsgprcnt(uint256)","32dc9e81":"functionFive(uint256,uint256,uint256,uint256)","32dcb01c":"createBytes32s(bytes32[],bytes32[])","32dea130":"finishCrowdsaleMinting()","32deac1b":"setThirdBonusPercent(uint256)","32df3068":"clearKeys(uint256)","32df52aa":"LigmaToken()","32e07a20":"howManyEthersToKillContract()","32e12734":"addSpecialOffer(address,uint8)","32e1ed24":"updateAccountOwner(bytes32)","32e26d24":"CROWD_WAVE1_BONUS()","32e30e84":"INTERFACE()","32e43a11":"dummy()","32e43b5b":"PlayerTransported(uint256,address,uint256,uint256)","32e459b4":"LogFinalized(uint256)","32e45b8b":"guessTotalBeanOf(uint256)","32e54f72":"proxyPayable(address,string,string)","32e5535a":"ticketString(uint256)","32e5645d":"_computeNextArtworkPrice()","32e5905b":"film()","32e5d676":"c_priceRiseTokenAmount()","32e5e595":"getTimestamp(string)","32e62358":"_platformSupply()","32e70029":"MGCGameToken()","32e7179a":"MintedLocked(address,uint256)","32e7c5bf":"B()","32e7ecd8":"tierMin(uint256)","32e7f81f":"allocateLiquid(address,uint256)","32e94e81":"setPlayerEngineersCount(address,uint256,uint256)","32e991cf":"sellScale()","32e99708":"getMiningTarget()","32eb2314":"OraclizeQueryTest()","32eb2564":"initGame()","32eb5e44":"getaddtime(address)","32ec39a4":"mntpMigrationsCount()","32ec7a4e":"_emitDayLimitChanged(bytes32,uint256,uint256)","32ec991c":"ballotOf(uint256,address)","32ed3d60":"startPoll(uint256,uint256,uint256)","32ef78c4":"remove_scribe(address)","32ef8dfa":"previousDistribution()","32f04209":"evReleaseFund(address,uint256)","32f05fd1":"releaseAndUnlock(address,uint256)","32f07d01":"LogRedeemNET(address,uint256,bytes32)","32f16c74":"claimPepe()","32f2129a":"getBetArr()","32f23601":"setSubTourFreezingPrice(uint256)","32f289cf":"claimToken(address)","32f2bb50":"HouseInfoListing(address)","32f402c5":"createGrant(address,uint256,uint256,bool,bool)","32f46374":"create(string,address[],address,address)","32f58fc8":"retrieveRemainingCoinsPostSale()","32f5ea27":"UbiRewardToken()","32f637db":"createVesting(address,address,uint256,uint256,uint256,uint256)","32f6438b":"setCFO(address,bool)","32f72c27":"remove(int256)","32f72e39":"setSubmissionDeposit(uint256)","32f7470b":"DATE_31_DEC_2018()","32f76c11":"didTradePosition(bytes32,address,address,uint256,uint256)","32f7b41b":"setCCH_edit_29(string)","32f8290c":"returnMachine()","32f896af":"getSettingIdByTAOName(address,string)","32f8d1e4":"RockCoin()","32f8db38":"mainSaleMinEth()","32f8e034":"finalizeIcoDate()","32fac3a3":"listAddresses(bool,bool,bool,bool,address[])","32fb082f":"hasOrderedRobotParts(uint256[])","32fb5833":"AutomatedExchange()","32fbe8d3":"setSavedBalance(uint256)","32fd8478":"artistCommission(uint256)","32fe334b":"totalEtherPaid()","32fe5afc":"setICOEthPrice(uint256)","32fefb4c":"add_account(address,address)","32ff6e21":"setAirDropToken(address)","32ffe442":"getExpectedPrice(address,address,uint256)","33007cdf":"deposit(address,uint152)","33012507":"addMemberInternal(address)","33016c6a":"FOUNDER_FUND_3()","3302363b":"_nextMonth1stDayTimestamp(uint256,uint256)","33026bb6":"addDeposit(address,uint256)","330278e0":"betPlaced(address,address,uint256,uint256)","3302ece0":"setStopDate(uint256)","33039d3d":"MAX_TOTAL_SUPPLY()","3305cf85":"weiToCap()","33065ac5":"firstTokenId(address)","330696c8":"PREMINER_CHANGED(address,address,address)","330738a3":"KetherHomepage(address,address)","3308ecf1":"coinanx()","3308f42d":"getPlayer()","33091bd2":"returnTokenBalance(address[2],uint256[7],uint8,bytes32[2])","33099beb":"theCyber()","330a4822":"_createOrder(address,uint256,uint256,uint256)","330aa207":"frozenAccountCoinByTime(address,uint256,uint256)","330ae38f":"disableAmbassadorPhase()","330ae7b3":"addUserBattleValue(address,uint256)","330c3fe5":"finalise(address)","330c4ce0":"burnedToken()","330ca427":"removeValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,uint256)","330cbc75":"createEdition(uint256)","330d57f9":"maxbuyinQuantity()","330f412b":"MorphToken()","330f9588":"xrt()","330fb148":"setETHRateAgent(address,bool)","330fb4a3":"putEther()","330fd319":"MMTOKEN()","33102ff9":"openRoom(uint256,uint256)","33105218":"isVerifier(address)","331172f3":"getDisputeRoundDurationInSeconds()","33132860":"EcRecover(bytes32,bytes)","331350ee":"finishAllocation()","3313d27e":"verifyAllSigned(uint256,uint256[3],uint256[3],uint8[176])","3313d9bf":"bytesToString(bytes,bytes1)","3313e95d":"strcpy(string,uint256,string)","33140016":"feesByPeriod(address)","331450dc":"minerPreTime()","3314b33a":"BoardMeetings(uint256)","3314b62d":"AuPetitCoinToken()","3314c351":"Trade(address,uint256,address,uint256,address,address,uint256)","33158ba4":"openNetfRevenueRound(uint256)","331670c5":"getIsEnabled(uint256)","3316d122":"log(uint32,address,address,uint256,uint256,uint256)","331725b5":"callAndReward_0(string,string,uint256)","3317bbcc":"getLockedTokens()","3318d4a5":"incomeFees()","33195fca":"getApprobation(uint256,address,address)","3319bf1a":"upgradeGalleass(address)","331a6bf5":"setOwnerAddress(address)","331a72bb":"s7(bytes1)","331a72d1":"getRetractable(bytes32)","331a9d73":"availableSTCTokens()","331b6f66":"sizeOfAddress()","331c4594":"TalentICO()","331c55b4":"addTeamTimeMints(address,uint256,uint256,bool)","331c5d60":"LogSetName(string)","331d03d1":"BubToken(address)","331d8e5d":"unlock(address,address,bytes)","331e58a1":"adjustedRaised()","331e6b78":"setToNotForking()","331eac01":"SendPreReserved1()","331fbc1d":"tokensCreationMin()","331fef86":"bonusStrategy()","33210356":"setDelegadoDeDistrito(bytes32,uint256)","332129a7":"getJYPCBonus(uint256)","3321c76c":"RITUAL_COMPENSATION()","33223f1b":"materializeBalanceIfNeeded(address,uint256)","33228b9b":"E_AuctionFinished(address,uint256,address,uint256,uint256)","33232609":"blake2b(uint64[],uint64[],uint64)","33242b60":"getODEMClaim(address,bytes32)","332514d8":"totalT8EXSold_PRIVATE()","332559d3":"getcanuse(address)","33260fe7":"getInteractionPrice(address)","332659e0":"getBountyAddres()","33267961":"run2(uint256,bytes32[],uint256[],uint256,uint256,uint256,uint256)","3327057c":"Arina_judgment()","33271a3b":"getTokensPerWave(uint256)","33278aae":"setUntradeable()","3327f4fa":"setInstrumentRegistry(address)","33281815":"getRate(address,uint256,uint256)","33283e59":"usedReveralSupply()","33285fb4":"confirmAtkPlayerQuest(address)","33287446":"setMinTokensRequiredForMessage(uint256)","33289a46":"withdrawDeposit(uint256)","3328bd24":"lockAddress(address,uint256)","3328d3f0":"numberOfDates()","3328f396":"totalLevBlocks()","33291126":"_tavern(uint256)","332954c0":"YumeriumTeamWallet()","3329578b":"SpectrumNetwork()","33298e25":"invoke(uint256,uint256)","332a2219":"_goodAddress(address)","332ad859":"buyTokensBonus(uint256,uint256)","332ae26c":"test_insert_findNoHintUpdateHead()","332b0b34":"oraclize_randomDS_getSessionPubKeyHash()","332b3177":"totalTimelockedBeneficiaries()","332b9f06":"consumeNextOrderId()","332bb4c1":"approvalCallback(address,uint256,bytes)","332c26d6":"getSecretAtLevel(uint256)","332e1a81":"getContributors(bool,bool)","332e25be":"getCCH_edit_19()","332ea814":"amIAgent()","332ea9ed":"VRCoinCrowdsale(address)","332eb83e":"steal_reveal(address,uint256)","332ec5f9":"unblockMember(address)","332efa80":"clearNewOwnerBid(address,uint256)","332f7acf":"amountCollected()","332f7d6e":"Lpktransfer()","332f93a9":"nextPayoutGoal()","332fa285":"nextGameMaxBlock()","332fa5bb":"ownerCountInt()","332ff6f9":"Buyin(address,uint256,uint256,uint256)","3330a6bd":"set_min_max_CWCsPerReturn(uint256,uint256)","3331f391":"giftAsset(address,uint256)","33324445":"changeClientCategory(address,uint256)","3332baa3":"PreSaleDeadline()","3332f720":"transfer_remaining_funds_to_project()","333432fe":"_withdrawBonuses(bytes32,uint256)","3334f1f8":"getAmountWithBonus(uint256)","3335aa78":"eRefund(address,uint256,string)","33360632":"getNumParameters()","33360978":"EndTime()","3336d5e5":"addABaddress(address,address)","33377f32":"turnOnFurnace(bytes32,bytes32,bytes32,bytes32)","33379137":"transferCoinToUser(address,address,uint256)","333885a0":"createBill(address)","3339451b":"fireDeliveryProposalEvent(address,uint256)","33397816":"withdrawAccountBalance(address)","3339f96d":"floaksAddress()","333a653e":"PeakAssetCoin()","333ab570":"WeiSent(address,uint256)","333abd90":"acceptKinTokenOwnership()","333aed82":"nextGameSettings()","333bfec5":"delegatedSignedEscrow(bytes,address,address,address,uint256,uint256,uint256)","333cfa14":"checkBlockMature(uint256,uint256)","333dbda8":"paymentsInOtherCurrency(uint256,uint256)","333e1a72":"investorsLoses()","333e5180":"setOperatorPrivileges(uint256,address,bool)","333e99db":"isBlacklist(address)","333f55ed":"managerSelfRemove()","333f57b3":"contractStarted()","333f7f70":"changeFrozenStatus(address,address,bool)","33403a81":"_calculateWinner(uint256)","334191f7":"donatorReward()","3341b445":"proposals(address)","334249a7":"getProviderCountry(uint256)","334340d2":"EthCoin(address)","3343c18c":"AddBTCTransaction(address,uint256,uint256,bytes4)","334460a4":"createMetadata(bytes32,bytes32,bytes32,string,bytes32,bytes32,uint256)","3344e0b3":"WWW()","33455dd0":"PRICE_5()","3345854d":"NewGame(bytes32,bytes32,bytes32,address,uint256)","3345b65f":"listNextFourCards(uint128)","3345b784":"tokenSaleWeiMin()","33465c5f":"auctionStartTime(uint256)","3347d025":"teamUnlock3()","3348904b":"amountOfBets()","3348cad7":"_breedWith(uint40,uint40)","3348f537":"massClaimLimited(uint256,uint256)","33492138":"joinFraction(uint256,uint256,int16)","3349bc19":"nonActivationWithdrawal(address[2],uint256[7],uint8,bytes32[2])","334b8771":"AIRDROPBounce()","334b9f14":"initializeArray(uint256)","334c5997":"JavaSwapTest(uint256,string,string)","334cc3e5":"TimeDecayingTokenFactory(bool,address)","334d86bf":"getPI_edit_7()","334dc700":"CanaryV7Testnet()","334df120":"getBeneficiaryById(address,uint256)","334ef224":"testThrowsUpdateLatestRevisionNotOwner()","334ef43d":"tokensToCounter(uint256)","334f0611":"cnd()","334f22c7":"getUrl(bytes32)","334f45ec":"currentStepIndex()","334fe638":"getProvisionCreditsRemaining(address,uint32,uint256)","33500e26":"bid(uint8)","33506115":"setPauseSave()","335094c2":"setPreICOEnd(uint256)","3350ae36":"fitCollectedValueIntoRange(uint256)","3350b915":"setDungeonPreparationTime(uint256)","3350c3ba":"BlockEstateToken()","33512aa9":"getUserReward(address,bool,bool)","33513739":"lowerCeiling(uint256)","335154ed":"setRateSteps(uint256[],uint256[])","3351886e":"getFilm(uint256)","3351ee19":"donatePurchase(uint32)","33533e84":"NeterContract()","33545d48":"setIdentity(address,address,string)","3354741a":"eveFromEth(uint256,uint256)","335494a4":"getMintingPowerById(uint256)","3354d682":"destroyVoxel(uint8,uint8,uint8)","335611d9":"makeOrder(uint256,address,address,uint256,uint256)","3356294b":"setAyantDroitEconomique_Compte_3(uint256)","335665c4":"canBuyCompany(bytes32)","3357162b":"initialize(string,string,string,uint8,address,address,address,address)","335721b0":"NewResolver(bytes32,address)","33575f64":"buyRank(uint256)","3357db75":"SALE_ENDED()","33580959":"poolFees()","33588dfa":"doCalculateRoom(uint256,bytes32)","3358d2d3":"buildDSTokenFrontend()","33592a1f":"getProviderById(uint256)","335a6b7d":"Wicflight()","335aa61a":"setMaxPrizeOneDay(uint256)","335ae0cb":"GetEscrowBalance()","335b496e":"totalTransfersInSchedule()","335b52f2":"initGameAt()","335b61e8":"enableArea(string)","335b7c13":"phase5EndBlock()","335b942a":"arbitrateC4FContract(address,uint8)","335c8b63":"packPrice()","335d43a3":"Kubera()","335e8067":"tricklingSum()","335eb60f":"getCoursesLength()","335f463d":"DVChain(uint256,string,string)","335f5642":"getinfowin(address,uint256)","335f9303":"PunchToken()","335fba7e":"calculateRedeemReturn(uint256,uint256,uint32,uint256)","336077c3":"getApprovedBuyer(address,address)","3360ac90":"transferByOwner(uint256)","3360caa0":"publicSaleStart()","336120fe":"removeTokenList(address,uint32)","336137c8":"updateMember(address,uint256)","33613cbe":"getBondBalance(address)","33637d5a":"getPendingBlock(uint256)","33641775":"change_sale_address(address)","336481d4":"dSetCommunityBallotsEnabled(bytes32,bool)","3365aa3b":"description2()","3365d358":"addContractAddress(address,address)","336634bb":"MASIKIToken()","3366eeb2":"getLockedToken()","33670c1c":"SupportsInterfaceWithLookup()","33677c30":"recycling(address,uint256)","3367aeb2":"maxPVB()","33683ec6":"safeHolderOf(uint256)","3368a120":"dividendBalance()","3368db4f":"DCE_Coin()","3368e968":"init(bytes32[])","336989ae":"customers(address)","3369c33d":"pregnantDogs()","3369c3b6":"ReturnEthersFor(address,uint256)","3369dace":"flipTheCoinAndWin()","336abddc":"allocateCash()","336b739a":"setCovmanager(address)","336b9f80":"updatePublisherFee(address,uint16)","336c6d39":"setPrizePool(address)","336c9b97":"_updateEditionTypeLookupData(uint256,uint256)","336ce69e":"CyberyTokenSale()","336da059":"MAX_TOTAL_TOKEN_AMOUNT_OFFERED_TO_PUBLIC()","336e24aa":"getQuestionAnswerCount(uint256)","336fa72c":"addTransferableAddress(address)","3370204e":"enter(bytes8)","33705526":"p5()","337176cd":"getVideoGameItemOwner(uint256)","337188d9":"secSaleSpenderTxDetails(uint256)","33722c47":"testGetLawyerAtIndex()","33731c04":"plxToken()","3373739b":"usedTokens()","33739483":"etlContract()","33751fec":"WeatherToken()","33756534":"LogVote(address,bool,uint256)","33759ee1":"CrowdSaleTokenPurchase(address,address,uint256,uint256)","3375e38a":"CreatedBlock(uint256,uint256,uint256,address,bytes32,bytes32,bytes32,bytes32)","3376887a":"test_oneValidEqInt2()","3376e2dc":"callDividendAndUserRefund()","33771860":"setGoldContract(address)","337748b8":"StartFuseaNetworkDistribution()","3377f212":"set4RoundTime(uint256)","33783b9e":"PapaToken()","3378eb29":"ElectricQueue(address)","33791c36":"Fundraiser(address,address)","3379d7a3":"greedyowner()","337a693c":"AkiCoin(address)","337a8cdb":"allowMoveTokens()","337b1cf9":"setIpfsHash(bytes)","337b5988":"testSimpleNameRegister()","337b68ba":"takenProfit()","337bd656":"HashSolved(address,string,bytes32)","337c1e28":"getIndexRoot(bytes)","337c445d":"increaseWordSize(string)","337cc706":"transferContract(string,string,string,string,string)","337d2aea":"PHASE3_START_TIME()","337f4c46":"gameDeveloper()","3380104a":"Streamity()","3380c0d8":"cancelTransaction(uint256)","338116b0":"checkContract()","3381ffe0":"transferTrusteeOwnership(address)","338246e2":"minSwapAmount()","3382ac57":"customCreateTokens(address,uint256)","3382ddab":"tokenBurnAddress()","33833037":"allBalance()","33835161":"setConfig(uint256,uint256,uint256,uint256,uint256,uint256)","3383e335":"LogTake(bytes32,bytes32,address,address,address,address,uint128,uint128,uint64)","33840712":"checkImageInput(address[16],uint256,uint256,uint256[],bool,bool)","338410f2":"setUnicornBreeding(address)","33848008":"newDepositWallet(address)","33849e55":"voteOnSolution(uint256,uint256,bool)","3384d2af":"PARKToken()","3384e128":"soldSS()","33862708":"changeServiceAddress(address)","33862914":"SOYA()","33863ed9":"order(uint256,uint256)","3387e52f":"LLV_311_EDIT_3()","33882479":"multiplyDecimalRound(uint256,uint256)","3388e429":"ecrecoverDecode(bytes32,uint8,bytes32,bytes32)","3388fa72":"Duranium()","33893071":"checkMyWithdraw(address)","3389f273":"setManyAllocations(address[],uint256)","338a0261":"rhi()","338a1379":"_setPackedBlockNumber(bytes20,uint256)","338a63a4":"_createKitty(uint256,uint256,uint256,uint256,address)","338b5dea":"depositToken(address,uint256)","338bfcd6":"refundTokensPresale(address[])","338cdca1":"request()","338d43f6":"_decrementTokenBalance(uint16,uint16,uint8,address,uint256)","338dbf59":"startPrivateSale()","338dfafa":"HVNToken()","338e22ff":"ProcessablesMock()","338e4fd6":"setTokenForSale(uint256,uint256,bool)","338e579e":"tryFinalize()","338e93d1":"active_dividend(address)","338ed326":"createCustomCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,address)","338ef191":"GetBetGamblers(uint256)","338f3039":"amountAvailableToWithdraw()","338f43a0":"getReservedTokensListValInTokens(address)","338f4ad6":"withdrawMineralTo(address,uint256)","338f4dd9":"limitTier2()","338ff5e3":"updateInvested(uint256)","33902973":"createReserveTokensVault()","33904cb1":"MasterNet(uint256,string,string)","33905d41":"highFunding()","3390e6c7":"getIsSecondPhaseBySoldedTokens()","33911763":"greenshoeActive()","3391c265":"transferManagment2(address)","33920f65":"getEarliestPosition(address)","33921b2c":"DEXHIGH_V1()","339282b7":"isRegisteredAuthority(address)","3392f927":"hasConverted(address)","3392ffc8":"testExp(int256,int256,uint256)","3393385f":"disableUpdates()","3393780f":"DdosMitigation()","3393b069":"nothingLib2()","3395dc70":"acceptTransfer(address,address,uint256)","33966cb6":"_bid(uint256,address,uint256)","33967c74":"isZero(bytes32,string)","3396c405":"tokensAreLiquid()","3396c780":"b21TeamTokensAddress()","3397ca17":"numBalanceRecords(address)","3397d5d5":"setTokenPrice(uint8)","33985caf":"Exera()","33989396":"requestNewEtherRealID(string,string,string)","339a7670":"mineToken(uint256)","339a95f6":"secondCrowdSaleEndDate()","339ab6f2":"getPurchaseAmount(address)","339ac174":"playerSurrender()","339b6b39":"isRevokedBefore(bytes32,uint256)","339cfb9a":"isHolderAddress(address,address)","339e23d1":"ownerVote(bytes32,uint256,address)","339e2604":"setPayBackRate(uint256)","339e2c45":"isRegisteredToFirm(string,address)","339e9550":"_sendReward(uint256)","339f890d":"setMinBlockPurchase(uint256)","339fd959":"getLockAmount(address,address)","339ff96d":"transferCommitment(address)","33a02a6d":"openLandEthSale()","33a02c22":"betAdded(uint256,uint256,address,uint256)","33a263e6":"peggedSymbol()","33a27f75":"estimateNextPotSeedAmount()","33a3b654":"managementAmount()","33a3d023":"finalizationCrowdsale()","33a3e669":"setClientLastPaidRate(address,uint8)","33a4ec8d":"NCMToken(uint256,string,string)","33a581cd":"createPeerWallet(address,address[],address[],uint256[])","33a581d2":"MAX_UINT256()","33a5ec7e":"changeTokenAmount(uint256)","33a7d2e3":"BONUS_DURATION_2()","33a8319e":"EtherJob()","33a87ade":"gasInTokens()","33a8c45a":"contact()","33a8dc1d":"nextPack(uint256)","33a9824a":"PopulStayToken()","33a99e04":"selectWinner()","33aac4aa":"BaseModule()","33ab0541":"setBaseLevelUpFee(uint256)","33ac2009":"countValidations()","33ac67c3":"ShowChargeCount(address)","33ac7256":"getParent(bytes32,uint256)","33ad9495":"WithdrawPotShare()","33adb264":"invokeTop()","33ae6e19":"distributeTimelockedTokens(address,uint256)","33ae7166":"tier4()","33ae88ad":"numberOfKingdoms()","33af060f":"accountInGoodStanding(bytes32)","33b0f7f7":"paidCreateWikiPage(string,string,string,uint256)","33b1503d":"PostWish(address,uint256,bytes,bytes,uint256,uint256)","33b16d93":"determineWinner()","33b186c1":"AdvisorsPartnersAmount()","33b19417":"NodeManager(address[])","33b1f812":"totalPromotions()","33b37915":"setOrderEnd()","33b3dc04":"castVote(string,uint8)","33b416db":"BaseICOToken(uint256)","33b56638":"testGetAllLawyers()","33b58484":"WEEKS_104()","33b5b62e":"minPurchase()","33b5fa75":"buyTokensWithRef(address)","33b6baf5":"developerAddr()","33b7d187":"getDCategory(bytes32,uint256)","33b85b73":"modifyCommunityRates(uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)","33b8b1c1":"transferInt(address,address,uint256,bool)","33b8c29d":"updatePriceOfEth(uint256)","33b91db5":"GetTocPrice()","33b9d3f4":"_buyCoins(address,uint256)","33ba2ef9":"hipstermasterReq()","33bb70ee":"getCoinAge()","33bbae93":"end_date()","33bc1c5c":"publicSale()","33bc6283":"TruReputationToken()","33bd8036":"addressPayableFunc(address)","33bd943e":"abandonListingService(uint256)","33bebb77":"forceTransfer(address,address,uint256)","33bfaf4e":"MickeyToken()","33bffccc":"openPreSale()","33c023ef":"doInvestment(uint256,address,string,uint256,bool)","33c1420a":"raffle()","33c24bd3":"accountIds(uint256)","33c4a1d6":"SetScndOwner(address)","33c5da42":"setGaspriceMax(uint256)","33c6c1af":"setCentralAccount(address)","33c6cdd3":"modifyRatePlan(uint256,string,bytes32)","33c724ee":"setLosers()","33c74e79":"participantContribution(address)","33c77a6d":"pauseICO()","33c7b38f":"withdraw_to_eti()","33c7c026":"feePayment()","33c7d1cc":"restart(bool)","33c84990":"setNewClaimer(address,address)","33c8adce":"enterLeague(uint256[],uint256,bytes)","33c90632":"createTransferAuction(uint256,uint256,uint256,uint256)","33c91611":"safePay(uint256,uint256,address,bytes)","33c9b83c":"preIcoSoldTokens()","33c9ccf5":"isKeyOwner(bytes32,address)","33ca4773":"getBrandData(address)","33ca55d7":"requestTransferChildrenOwnership(address)","33caaa43":"tokenRewardContract()","33cbee23":"teamTwoDivsTotal()","33cc4f9f":"FIDAToken()","33cc9c3e":"getLuckyPendingSize()","33cd3383":"investmentsOf(address)","33cd7ede":"totalJackpotOdd()","33cdfc76":"accountOf()","33ce1cda":"JSJC()","33ce724a":"sendSoldTokens(address,uint256)","33ce7787":"transferInvestorAccount(address,address)","33ced321":"genLevelExp()","33cf3ca0":"icoDeadline()","33cf58f9":"Accepted()","33cfc5e3":"DEFToken()","33d020ae":"getManifestId(address,bytes32,bytes32)","33d072e2":"processFunds(address,uint256,uint256,bool)","33d0a56b":"Melt(address)","33d14097":"DoRollEvent(address,uint256,uint256,bool,bool,bool,bool,uint256,uint256,uint256)","33d1e5b9":"lockupAccount(address,address,uint256)","33d24dc4":"setTypeAdvantages()","33d2cea2":"getDiceWinAmount(uint256,uint256,uint256)","33d34bad":"nextlotnr()","33d52c71":"ico3Cap()","33d58ca6":"F2UToken()","33d59f0a":"setJobStatus(uint256,uint8)","33d5d29b":"containsOperator(address)","33d5e4ca":"LogErrorMsg(string)","33d634df":"getSpinResults(uint256,uint256,uint256,address)","33d63869":"icoReserveSupply()","33d64a6f":"Start_Resume_ICO()","33d6c065":"PenCrowdsale(uint256,address,address)","33d764a2":"transferPreSigned(bytes,address,uint256,uint256)","33d9529a":"Totalbalance(address[])","33d97457":"GRAPE_SECS_TO_GROW_VINE()","33da67a0":"setForceNsfw(uint16[],bool)","33daaa5e":"setMakerFeeRate(uint256)","33db82fd":"outToken()","33dd1b8a":"setAllowed(address,address,uint256)","33dd5fb8":"TransferAntique(bytes32,address,address)","33dddc3a":"openLootbox(address)","33de06d5":"changeEscapeHatchCaller(address)","33de61fb":"Marvin()","33de96c6":"cancelTransaction(address)","33decdc6":"returnVolAdjuster(uint256)","33df4155":"setSPARCAddress(address)","33dfc93c":"untokenizePosition(bytes32,address)","33dfe91d":"isDefValueInRange(uint8)","33e06ee7":"buyTokensAtRate(address,uint256)","33e11ec4":"getBcouponTransferCost()","33e13ecb":"Execution(uint256)","33e2df5c":"newTeamCreated(bytes32,bytes3,bytes3,bytes3,bytes3,bytes3,bytes3)","33e2df5d":"isTokenValid(string)","33e335a0":"fromPaymentGateway(address)","33e364cb":"resumeSale()","33e36c50":"FundsLoaded(uint256,address)","33e3e86a":"isValidSan(string)","33e5bce1":"allow_spend(address)","33e663a4":"BonusEarned(address,uint256)","33e665eb":"setMonsterAuctionAddress(address,address)","33e67012":"disableChain(uint256)","33e712fe":"functionEight()","33e747b3":"setCapAtWei(uint256)","33e7ed61":"submitPool(uint256)","33e7fb97":"modifyExecutorAddr(address)","33e85eac":"get_king_price()","33e8b084":"dePesoToken()","33e8b8ac":"setFounderAllocation(address,uint256)","33e8df7e":"get_property_address(uint256)","33e90f98":"migrateMntp(string)","33e9698c":"tokenIssueDeadline()","33ea3dc8":"getTransaction(uint256)","33ea7a2b":"setBundinha(string)","33ea80cb":"getProposalUint(int256,uint256)","33eb5564":"mid(uint256,uint256,uint256)","33eb647f":"ECNcoin()","33ee2297":"MintedGrey(address,uint256)","33eeb147":"isFrozen()","33ef5698":"setShareTradingEnabled(uint256,bool)","33f08327":"generate_paymentID(uint256)","33f1da25":"BiQToken(address,address,address,address)","33f1dfb5":"withdrawTokenByAdmin(address,uint256)","33f2da95":"test_insert_findWithHintNextUpdateTail(int256)","33f2e7f8":"takeOffer(uint256)","33f30a43":"getNarco(uint256)","33f3197e":"Bet(uint256,string)","33f327be":"FeemCoin()","33f3344c":"readQuantity(address,uint256)","33f35c40":"webdToken()","33f37304":"tTokens()","33f44026":"mintFoundingTeamTokens(address,uint256)","33f4406a":"addressCommunity()","33f472b9":"MPO()","33f50b1c":"extendICO()","33f707d1":"ownerWithdraw(uint256)","33f7c9fe":"UsersList()","33f8845d":"GetTotalRigCount()","33f88d22":"mintOwner(uint256)","33f8e8c7":"getUserTokenInfosLength()","33f9942b":"awardPoint(bytes32)","33f9b36f":"getIcoStartDate()","33fa59f0":"creationProfit()","33fb1e05":"withdrawChamp(uint256)","33fb9e35":"killSelf(uint256)","33fba1ed":"_getFightData(uint32)","33fbff32":"setSaler(address)","33fc56d9":"withdrawUnclaimed()","33fc5f47":"proposePurge(address,bytes32)","33fc6367":"updateRefundState()","33fcffa8":"Option(uint256,uint256,string,string,string,string,string,string,bytes32,address,string,address,uint256)","33fd066d":"doBalanceFor(address)","33fd40ec":"oraclize_query(string,bytes[4],uint256)","33fd9397":"buyBackPriceWei()","33fdb097":"BTSC()","33fdbbe5":"DECIMAL_FACTOR()","33ff588d":"ownerChangeRunning(bool)","3400a6dd":"crowdsale(uint256,uint256,uint256)","3400d00d":"PayTokens(address,uint256,uint256)","3401c277":"subtractAmount(address,uint256,uint256,uint256)","3402b841":"closeVoteCommitPhaseIfAllowed(address,bytes32,bytes32)","34032f4f":"teamSupply12Months()","3404ab6a":"calcEthersToTokens(uint256,uint8)","3405321d":"_setPrice(uint256,uint256)","34057a45":"rollAddress()","3405ae40":"setMaxSubscribers(uint256)","3405deed":"alwaysReverts(uint256)","34065b66":"getSmallBonus()","3406784d":"arbitrateC4FContract(uint8)","3406956a":"bountyTokenFund()","340695c0":"PRESALE_RATE()","3406e3fb":"singleTransGasCost()","340700e5":"Satochi4()","34075cbd":"proposalStatuses(uint256)","34083a28":"HoneyToken()","34085549":"buildAt(uint256,uint256,uint256)","340867a0":"setMiniPoolEdit_1(string)","3408f73a":"getStorage()","340955fc":"isNotDuplicateMembers(bytes32)","3409952b":"setStorageInterface(address)","340a247c":"getQueryCost(string)","340a773a":"LockedToken(uint256,string,string)","340adb29":"getExportingParty()","340dc485":"addEmailHash(uint256,address)","340ddda6":"MeatConversionCalculator(uint256,uint256)","340df28f":"finishUpgrade()","340e47f8":"activateStore(string,bool)","340e4fd5":"totalRequestsAmount()","340ea558":"isFavorEscrow(uint256,address)","340f4fea":"setBetExpirationBlocks(uint256)","340f5920":"winningTicketNumber(uint256)","340f5e4e":"get_all_num_levels()","340fef94":"MMMbCoinCrowdsale(uint256,uint256,uint256,address,address,address,address)","34100027":"withdrawLegalContingencyFunds()","34103ee4":"setCrowdsaleAgent(address)","3410452a":"getRequestsCount()","34106c89":"updateRenExTokens(address)","34107282":"signer1()","3410cbd5":"layersRec(uint256,uint256)","3410eb5b":"userRefundTo(address)","3410fe6e":"DIVISOR()","3411231c":"ANXToken()","341176d6":"crowdsaleManager()","34119d15":"setSellFeeBps(uint256)","3411c81c":"confirmations(uint256,address)","3411cb08":"getFreelanceAgent(address)","34122952":"build(uint256,int256,int256,uint8)","34127649":"JvaToken(address)","3412a15c":"testConnection()","3412a4ac":"setFundingEndTime(uint256)","34133df9":"TR()","341367ec":"getMaxCAP()","34140748":"_upgradeTo(address)","34145808":"totalRewardToken()","3415650e":"buyStatus()","3415bdd4":"buyAKeyWithDeposit(uint256,address,uint256)","3416f9d4":"subtractSafely(uint256,uint256)","34174331":"selfHybridization(uint256,uint256)","3417f8d3":"addHolder(address,uint256,uint256)","341855bf":"HappyBirthdayToken()","341881e6":"endPreIco()","34190567":"DebugInt(int256)","341912ad":"SOCIALXBOUNTY()","341b96c2":"WalletAddressChanged(address)","341b9cc2":"ValueToken(uint256,string,string)","341bcbc1":"endIco2()","341c3304":"presaleTokensSold()","341cc817":"preicobrandingWallet1Pct()","341ceb42":"updateAmountOfEachChoice(uint256,uint256)","341f13f2":"authorizeDeploy(address)","341f5ee2":"omsairam18()","341f6623":"toAddress(bytes32)","3422e048":"getFirstTokens()","3422ede1":"Vault(address,address,uint256,uint256,address,uint256)","3422f709":"totalSencCollected()","34231e72":"getMyTransferredWine()","342368e4":"SubFromDividends(uint256)","3423a768":"finalizePreICO(uint256)","342442bd":"lockTeamAndReserve()","342454c7":"isDigit(bytes1)","34247b9b":"changeDBAddress(address)","34253af5":"isICORunning()","34256ab2":"createQuote(uint256,bytes32,bytes32)","34265c48":"releaseTime(address)","34273351":"withdraw2(uint256)","34289460":"cleanupTo(address)","3428e7ba":"checkForNewDay()","342930aa":"peekHatch()","342b7e71":"setTokenList(address[])","342b88ba":"setIcoTier(uint256)","342ba8de":"getGen0IVs()","342bd327":"GenesisRewardPerBlock(address)","342c17cd":"finalReserveAllocation()","342ca5d6":"pricePointsLength()","342d9185":"pricePerTokenAtCurrentTier()","342d9a04":"challengeClearing(bytes32)","342e0260":"gettruelevel(address)","342e515c":"Electrium(uint256,string,uint8,string)","34302882":"ETY(address)","34302d82":"midTimeBonusLimit()","34306cb8":"placeMessage(string,bool)","34309e97":"tokensOwner()","3430f7b1":"TitleAdded(uint256,address,uint256,string,string,string,uint256)","3431024f":"disApproveUsers(address[])","3431a0be":"RegisterSeller(address,string,string,string,string)","3432000c":"kittiesContract()","343214ae":"isFundFreezePeriodEnded()","34334e9e":"removeBlacklistedUser(address)","34335c01":"getPresale2()","34354f93":"ABC()","3435dea2":"PoolJoined(uint8,uint8,uint256,uint256)","3435e5f3":"newChief(address,uint256)","3435ea80":"adduser(address,uint256)","34376542":"OwnerUpdate(address,address)","34376ca0":"authorizeBurner(address)","3438c758":"DelayedPayments(uint256,uint256,uint256)","34399ea8":"considerCurrentInterest()","3439b433":"RSPLT_E()","343a875d":"getUint8()","343a8d56":"Lucky888Token()","343aad82":"flow()","343ab4cd":"getMiningPoolAddres()","343ab68b":"getFreelancerContractsCount(address,address)","343bd7eb":"insertOwner(address)","343c018b":"GarudaToken()","343dbeb6":"isServiceRemoved(address,uint32)","343dfb7e":"referralPercent()","343efc6c":"WorthlessToken()","343f3acb":"GetAllBetIDs()","343f40a0":"testFailCreateSameItemId()","343ff8c7":"deductshares(uint256,address)","3440465e":"addElement(bytes32)","34406f33":"sha3Docs(bytes32)","344090f2":"Ownable1()","34409e38":"_generateNewSaddle(uint256,uint256,uint256,address)","3441ecf2":"Calculator()","34428440":"tokenExchangeRateMile1()","3442a868":"getBtcForkCoins()","3443c64a":"changeEEMWallet(address)","3444189b":"newKudosPoll(string,string,uint8,uint256,uint256,uint256)","34452f38":"disableMint()","3445679a":"USDto1ETH()","34457cbe":"ExponentialDecayingTokenFunction()","344605f4":"ETFloorPresale(address)","344615ab":"unSell()","3446bac4":"retirarDividendos()","34475d8d":"getERC721Addrs(uint256)","3447a7ef":"addInWhiteList(address)","3448348d":"getEventSize()","34484b47":"functionSix()","34486434":"ConsentFactory()","3448c7d6":"createHistory(bytes,address,address)","3448ec4a":"checkMatchBatch(address,uint256[16])","344929e4":"CTS(uint256,string,string)","3449387b":"GetFileLocation(bytes32)","3449f61c":"_getBonus(uint256,uint256)","344b8386":"firstYearPeriods()","344bcc7d":"signedTransferFrom(address,address,address,uint256,uint256,uint256,bytes,address)","344bcd7d":"allCrowdSaleTokens()","344c0dd5":"newChamp(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,address)","344c5ea1":"Mino()","344c5fd6":"firstPeriodOfICO()","344cc2b8":"getAllBidsByAdunit(uint256)","344d1ef2":"getCarSelling(uint32)","344d9576":"ReinvestWallet()","344e23cf":"previligedBalanceOf(address)","344eca75":"amountRaisedICO()","345006b6":"getGenerationForCall(address)","34501134":"get_pre_kyc_bonus_denominator(address)","34516038":"getSellCount()","34523cbc":"numberOfWhitelists()","3452f51d":"push(address,uint128)","345393f0":"getOuLianPublicAddress()","34552a0a":"RegisteredContract(string,address)","34553a44":"getRequiredSubscribers()","34556035":"icoCompleteB()","345591ec":"inDistributionMode()","345607ab":"StoreProofOfUplinePaid(address,address,address,address,address,address,address,uint256)","34574ff3":"XFMSold()","345899fe":"addRoles(bytes32[],address,address)","34592491":"infoWithdraw2()","345942c8":"revealBet(address,string)","3459b1af":"SaleNew()","3459d2ba":"getTilePriceAuction()","3459fb6f":"unpack_data_groups(int256[],bool)","345a1ae4":"LASTTRIAL123()","345a3899":"Insurence()","345a4423":"win(uint8)","345a5fe4":"addRecoveryAddress(address,uint8)","345a8e5b":"uint2bytes(uint256)","345ac602":"fixAmount()","345b256a":"projectStorageVault()","345b3d3a":"newOrder(address,address,string,string,uint256,uint256,uint256)","345bc544":"maxAllowedBetInTokens()","345c8fca":"setFreezeTx(address)","345cad7e":"useItem(address,uint256,uint256)","345d116f":"LotteryRoundWinner(address,bytes4)","345da007":"setClassName(uint8,string)","345e2f91":"transferEarningsToOwner()","345e3416":"adminRetrieveDonations()","345efa4e":"CurrenseeCrowdsale(uint256,address,address)","345f342e":"concludeVoting(uint256)","345f58b2":"AcceessoryWrapper721()","34610182":"getFuelsIds()","34615bef":"_discipleVendPrice(uint256,uint256)","3461a5e8":"ARCO()","346223f5":"Cocoon(address[],address,address)","3462f32d":"execWithGasLimit(bytes32,bytes32,uint256,uint256)","3463934b":"Bqt_Token()","3463c5c7":"patentValidTime()","3463d76d":"databaseDownloadUrl()","34646163":"getDataset(address,uint256)","3464af6a":"testCopyAddress(address)","3464e4da":"grantTokensCommonPool(address,uint256)","3465d6d5":"record(address)","346692b7":"tokenKeys(uint256)","3466f07f":"DRAKE()","34686b73":"numberOfAddress()","346896c0":"getMinerLv1(address)","3468b4a8":"OxTokenInitialized(address)","3469a55b":"getDepositID(address)","3469acbb":"initCard2()","3469f6e2":"finalizeRound(uint256)","346a2f9e":"percentBank()","346a37d2":"markComplete(bytes32)","346b306a":"oraclize_query(string,string,string)","346b783c":"refundToPlayer(address)","346b7939":"icoReservedSupply()","346bfd9f":"eventBurn(address,uint256)","346c1aac":"getNextAvailableBond()","346c95df":"SuNFT()","346c96e9":"addFund(uint256)","346cabbc":"scheduleCall(address,bytes4,uint256,bytes,uint256)","346cf356":"tradeCards(address,uint256)","346e8cea":"allCarsInfo()","346f2eb7":"set_bonus_received(bool)","346f5991":"sendTokensToTeamLock(address)","346f8827":"addWineryOperation(bytes32,address,string,string,string,uint256,uint16,string)","346f9f95":"collectAddr()","346fc0dd":"maxCrowdsaleSupplyInWholeTokens()","346ff6b3":"getNumRounds()","346ffa4b":"changeValues1(bool,bool,bool,bool,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","34701db8":"totalTicketsSold()","34705c2f":"validateTransferAmount(address,uint256)","3470b833":"blackListERC223(address)","34716f67":"post(string,bytes20[])","3471728a":"masterContractAddress()","3471aef0":"handbreak()","3471b034":"Submission(uint256,string,address,address,uint256,string)","34721e08":"test0Alice()","3473bf30":"setEndingTime(uint256)","3473f5e4":"HashOfDB()","34746d86":"killTokensForGPower()","347518c7":"validPurchaseTime(uint256)","34757fa9":"correctPreICOPeriod(uint256)","34758cb3":"currentEggPrice(uint256)","3475c1e7":"attemptPublishOfArticle(uint256)","34762a94":"ethHandleIsRegistered(bytes32)","347632e8":"getShareholderAdressByID(uint256)","34763586":"FoundersAndPartnersTokensIssued(address,uint256,address,uint256)","34766ecc":"PauseOff(uint8)","3476aeb0":"signer2_proposal()","34771f81":"setData_5(string)","34776c6e":"DEAToken()","347820eb":"previousUpdateTime()","34785e79":"setEthRelief(address)","34786d1d":"totalTokensToTransfer()","3478ab86":"HYToken()","3478ac2b":"createShow(uint256)","3478dc44":"getRecordOffers(bytes32)","3479101f":"setProviderSupply(uint256,uint256,uint256)","34791ae5":"POPPToken()","3479f017":"ServiceContract(uint256,uint256[],uint256[],string,uint256,uint256,uint256[],uint256[],address,address,address,address,address)","347aa903":"SDOGE(uint256,string,uint8,string)","347aba23":"evePerEth()","347acf2f":"mintingFactories(uint256)","347b3923":"putProfit()","347b5193":"LiquexPrivateInvestment(address)","347caeb4":"PhxHell(address)","347cda88":"needsBlockFinalization()","347d5bc2":"setPayoutOdds(uint256)","347e26c0":"icoEtherContributed(address)","347f5f00":"TokenPurchase(address,uint256,uint256,uint256)","347f8f54":"_setDiscount(uint256,uint256)","347ff187":"changeAirAmount(uint256)","34805e7c":"targetBlockNumber(uint256)","34809ee7":"doge()","34810336":"discountEndTime()","34814e58":"transferBalanceWithFee(address,address,address,uint256,uint256,address)","34825a23":"playGame(uint256,uint256)","3482e0c9":"cancelAuthorization(address,address)","34831b79":"VENSale()","34833a6d":"icoBalanceOf(address,address)","34835560":"innerlockStartTime()","348378d0":"Whitelisted(address,uint256,uint256,uint32)","348508cf":"thirdDueDate()","34854101":"ETH_TO_WEI()","3486645f":"forkReceive(address,uint256)","3486fb30":"mintLockPeriodBatch(address[],uint256[],uint256)","3487d97c":"setPriceCredentialItemId(bytes32,bytes32)","348a653a":"CONFIG_DURATION()","348b1b7d":"temperatureMin()","348be311":"LogBidOpened(uint256,address,uint256,bytes32,uint256,uint256,uint256,bytes32)","348e9779":"Restart(uint256)","349136af":"BonusScheme()","3491a19d":"TokenDemo(string,string,uint8,uint256)","3491d0f1":"processTransactionFee(address,uint256)","349221be":"ColorCoin(address,address)","349296a5":"SaleAuction()","3493075e":"getLevelCitizenLength(uint256)","3494ab3d":"validEAContract(uint32,address)","3494f222":"issueSuperMetal(address,uint256)","3495015a":"UnlimitedIPToken()","349501b7":"checkDepth(uint256)","34950dcf":"approvedSubmissions(uint256)","34954a99":"updateBalance(address,address,uint256)","34955a2b":"setTavernContract(address)","3495b21e":"setNewReleaseEndTime(address,uint256,uint256)","349718ed":"MarketCoin()","34971dd6":"totalEtherCap()","34984add":"signedTransferFrom(address,address,address,uint256,uint256,uint256,bytes32,address)","34988b95":"ExToke()","3498aaaf":"LogAllowedFromAddress(address,bool)","3498b00f":"getSectionIndexFromIdentifier(uint256,uint256)","3498c518":"StageClosed(uint256)","349a1f03":"getNumSums()","349a373b":"batchcreatevillage(uint256)","349a6edb":"_purchaseTokens(uint256,address)","349aa97e":"ethereumToTokens2_(uint256)","349ab992":"divCutAdmin()","349ae23b":"collectFor(address)","349b586c":"isCrowdsaleFinalized()","349b6486":"revokeGrant(address,uint256)","349c1ee3":"enableCrowdsale()","349c3d75":"changeSaleBonusRate(uint256,uint8)","349c870c":"initChainLedger(address,address)","349ca600":"Tags()","349cdcac":"reLoadXid(uint256,uint256,uint256)","349d1661":"BuyToken(address,uint256,bytes32)","349d3dc5":"breedTimeout()","349d8b4e":"communityMultisig()","349dc329":"miner()","349eb329":"jsonCat(string,string)","349f7173":"lastOraclePrice()","349f939a":"SaleEnded(address,uint256)","349fcf85":"UpdateAddressPayForService(address,address)","349fdb09":"setUnPaused()","34a014dc":"lastWithdrawalTime()","34a042d8":"bountyPoolAddress()","34a2b766":"getMarketData(address,address)","34a3312e":"setStore(string,address,address)","34a3b820":"getNewFallbackDepositPeriod()","34a4a527":"getCountHolders()","34a4b10b":"allocatetokensAndWL(address,uint256,uint256)","34a503e8":"_utfStringLength(string)","34a5eaa9":"_createPerson(string,address,uint256)","34a6074e":"buyWithBalance()","34a6301e":"setmessager(string)","34a6d832":"canPurchase()","34a6e514":"updateTaskState(string,string)","34a7ed17":"wikiAddTokenTo(address,uint256)","34a814a3":"setMyEthBalance(address,uint256)","34a8c392":"webSite()","34a8eb53":"getarg_1_input()","34a8f866":"setMatured(uint32)","34a90d02":"lockAddress(address)","34a9918e":"DEWCOIN()","34a991db":"enableManager(address,bool)","34a9a1ae":"getTokenDefaultPartitions()","34a9bb34":"getCurrentPublicBracket()","34aa0e7f":"dividendRegistration()","34aa982a":"getInfoForDisputeAndValidate(bytes32,address,address,address)","34ab32e1":"minerTotalYears()","34ab8256":"RUDAWORLD()","34abd1b1":"updateMaxPhase3(uint256)","34ac6f5e":"AVAILABLE_FOUNDER_SUPPLY()","34acc716":"projectDone()","34ad1e53":"giveBalance(uint256,uint256,uint256)","34ad324c":"sendToOwners(uint256)","34ad6f00":"TimePassBy(string,uint256)","34ae6984":"view66()","34aeefd5":"RemovePlayer(address)","34af370f":"lockTime(address,uint256)","34b0e5ed":"icoPrice()","34b122cb":"addTokensToReturn(address,address,uint256,bool)","34b20591":"createERC20Token(uint256,string,uint8,string)","34b3ae71":"_distribute()","34b3b014":"resolveSupply()","34b4eef2":"setStartIcoPreICO2ndRound(uint256)","34b55235":"registerAffiliate(address,string)","34b63592":"addre(address)","34b73591":"DevMiningRewardTransfer(address,address,uint256)","34b768c7":"summonHero(address,uint8,int256)","34b7ac9b":"END_MINTING()","34b88e04":"claimCoreTokens(address,uint256)","34b8b690":"Yuri()","34b98747":"onlyOwnerGetTeamWallet()","34bafed3":"date_string(int8,int8,int16)","34bb1a9e":"founderTimeLock()","34bb3ee1":"updateEthICOVariables(uint256,uint256)","34bb447f":"getDiceWinAmount(uint256,uint256,bool)","34bbabbd":"RaffleTshirt(string,uint256)","34bc5156":"Crowdsale(uint256,address)","34bc98b7":"latestPing(uint256)","34bd08c4":"getLargeAmountBonus(uint256)","34bdcd0a":"getLedgerValue(string,address,address)","34bdea85":"setICO2Phase()","34bdf2c4":"setReference(address)","34be5fab":"mintParcelTokens(address,uint256)","34beb204":"ZZC(uint256,string,string)","34bed16c":"bountyRefund(address,uint256)","34bf97ea":"setBonuses(uint256[])","34c05ca8":"modifyMetadataHashes(uint256,bytes32,bytes32,bytes32[],bytes)","34c0c9c6":"RemoveApprovedAddress(address,address)","34c0d654":"setPackageDb(address)","34c19b93":"getCallGracePeriod(bytes32)","34c1b4ba":"sha(bytes)","34c1ef77":"publicSaleTokensAvailable()","34c2904b":"giveDividend(uint64)","34c2b620":"getNickname(uint256)","34c31392":"breakParentsHaveGreaterPriority(uint256,address)","34c3236a":"signatureDropSingleAmount(address[],uint256)","34c39d1c":"ThreeDLTokenDeposit()","34c42106":"BOXT()","34c5c059":"addEtherToSphere()","34c6766f":"getImportingAuthority()","34c6a9ae":"getTokenTimelockDetails(address,uint256)","34c721a9":"getExploreResult(uint256,uint256)","34c73884":"Mint()","34c757cf":"NBAT102(address,address,address,address,address)","34c7b8e8":"getReadMessages(address)","34c7dcf8":"proposedUserKey()","34c8e114":"reservedDestinations()","34c8ea26":"SetupiBird(string,string,uint256,uint256,uint256,address,address,uint256)","34caa999":"setMinimumFundingAmount(uint256)","34cac67e":"investorsArray(uint256)","34cad6b8":"retreiveTokens()","34cad836":"coinsaleDeadline()","34cbbef9":"EndRateChange(uint256)","34cc182b":"updateDiamond(string,string,uint256)","34cc4b8f":"ratePerWeiInPrivateSale()","34cdb15f":"addressToTimestamps(address,uint256)","34cdf78d":"blockHashes(uint256)","34cec84d":"maxCapCompanyInventory()","34d05b1f":"freezeDeliver(address,uint256,uint256,uint256,uint256)","34d09ff1":"DemoraCash()","34d0cb6d":"CNYToken()","34d2485c":"tribeTokens(address)","34d24bff":"no(uint256,string,uint256)","34d2c4cb":"mintProxyWithoutCap(address,uint256)","34d31de3":"length(uint8)","34d33f9f":"kycRefuse(address)","34d40382":"nextSection(bytes32)","34d4776b":"removeApprovalStatus(address)","34d4cd82":"getTokenForTeam(address,uint256)","34d55cd9":"SerpentCountDown()","34d56b0a":"Currentproposal()","34d5751a":"approveContractCall(address)","34d5f37b":"round(uint256)","34d5fc4b":"transferInitialAllocationWithTimedLock(address,uint256,uint256)","34d609ac":"auditorHasStaked(uint256,address)","34d64e50":"getDoneAirdropAmount(address)","34d71238":"sencBalance()","34d722c9":"minterAddress()","34d83dab":"PhaseICO()","34d8521b":"quarterlyWithdrawable()","34d8c24d":"init(uint256,uint256,address,address,address,address,uint256,uint256,address,uint256,uint256,bool,bool)","34d92490":"changeFuckyou()","34d95bf0":"ShitCloneslordAddress()","34d9aee3":"assertEq7(bytes7,bytes7)","34dbe44d":"getLastBlockNumberUsed()","34dc2176":"inventoryProduct(bytes32)","34dc3c32":"pricePerWei()","34dc864c":"YYYToken()","34dcfec4":"minimalETH()","34df4222":"hasBeenLinked(uint32,int256)","34df8b63":"PER_USER_MAX_AVATAR_COUNT()","34df9b60":"getCow(uint256)","34e19907":"setSwapFee(uint256)","34e1ad21":"EmontFrenzyTool(address)","34e22921":"Call()","34e23416":"lastcombo()","34e24640":"distr(address,uint256)","34e24853":"encode(address)","34e255a4":"WTechTestCoin()","34e415db":"growWeed(uint256)","34e41bbf":"RATE_DAY_1()","34e4c06d":"maxSupplyGenerable()","34e5a5f8":"getPlayerInfoWithRoundID(uint256)","34e5a692":"distribute(uint128)","34e5e97a":"assignProduct(uint256,uint256,uint256,uint256)","34e70cc2":"tub()","34e73122":"calculateFee(uint256,uint256)","34e73f6c":"getAuctionCost(bytes32,uint256)","34e7a57a":"nonWLBalanceOf(address)","34e80c34":"getKeys(address)","34e8980f":"bootUpHangouts()","34e8c679":"retrieveTokens(address,uint256)","34e8ecea":"FindTheCureCoin()","34e8f247":"setStartTimeIcoStage3(uint256)","34e98037":"batchAssignment(address[],uint256[])","34e9d146":"EstateToken(uint256)","34ea5fe5":"setNumeratorDenominator(uint256,uint256)","34eaa923":"moveEther(address,uint256)","34eac76f":"withdrawalDeployed()","34eaf154":"investorAmount(address)","34eafb11":"totalCount()","34eb0cf5":"isUserBlacklisted()","34eb3200":"setRequiredProgressOfPreviousDungeon(uint32)","34ebb615":"maxTokenToBuy()","34ec514b":"setInitialPrize()","34ec96bf":"dAddCategory(bytes32,bytes32,bool,uint256)","34ed557f":"setTokenIpfsHash(address,bytes32)","34eea4a2":"executeRoom(uint256)","34ef39f1":"owner_withdraw()","34ef801e":"wcOnCrowdsaleSuccess()","34efcb8e":"getPlanet(uint256)","34f00e83":"setCrowdsaleStart()","34f03321":"PCM(uint256)","34f0e39e":"addCurator(address)","34f10c39":"chkcan(address,uint256,uint256)","34f1f9b1":"lbToken()","34f20f31":"setExchangeRateAuth(address)","34f245c2":"hasSecondUnionIds(bytes32,bytes32)","34f25146":"numOfReleased()","34f2d1ec":"scheduleUnsoldAllocation()","34f361a4":"bonusSecondWeek()","34f50813":"PreICOToken(address)","34f64dfd":"bobMakesErc20Payment(bytes32,uint256,address,bytes20,address)","34f682e2":"GetPriceOfRigs(uint256,uint256,uint256)","34f6bef3":"allTokensDecimalsBalances()","34f6d0b3":"Congress(address)","34f732e8":"withdrawalLockTime()","34f8cc6d":"DrAgentToken()","34f9445e":"consumeEnergy(address,uint256)","34f96971":"lockedBalanceCount()","34fa0606":"getControlInfoTokenlist()","34fa17cb":"getTeamBet(string)","34fa37da":"grantTokens()","34fb032e":"getAddr(string,string)","34fb11ed":"setMintingFeeEnabled(bool)","34fc2591":"toggleFreeze()","34fc62ff":"_badgeOwnerChange(uint256,address)","34fcc3e7":"getBetting(uint256,address)","34fcf437":"setRate(uint256)","34fe00b1":"getDocumentMajorities()","34fe0cf5":"payFee(address,address,address,bytes32,address,address,bool)","34fe5473":"largestDonation()","34fec467":"transferAllowed()","34fee3e4":"AuctionSuccessful(uint256,uint256,address,uint256)","34ff37f3":"returnLongCouponAmount(address[3],bytes32,uint256)","34ffea2c":"token_iso_price()","35001a1a":"internalMint(address,uint256)","350078b8":"staticblock()","3500a48d":"transferCommunityCommune(uint256,address)","35013592":"getStageCap(uint256)","35020cb9":"getReferenceType(bytes32)","35021991":"PresaleStarted(uint256)","350279c6":"getStage3Cap()","3502be27":"TaxTillNow(uint256,uint256)","35039525":"isBarCode(bytes32)","350460f8":"basicTokensPerEth()","35046722":"getAddressBalance(address)","350486da":"AgiCrowdsaleMock(address,address,uint256,uint256,uint256,uint256,uint256)","35058a2a":"approveOperatorTo(address,address,bool)","3505e844":"userExists(address,address)","350604f1":"rakesOwing(address)","3506b32c":"FailedTransfer(address,uint256)","35082933":"setAdminWallet(address)","350845f5":"maxStage3AllocationPerInvestor()","35085b58":"weekThreeStart()","350896f7":"setEtherPriceManually(uint256)","3508eddb":"AnkitToken()","3508f2e8":"Monday(uint256,string,string)","350a6429":"minAmountETH()","350b4c6f":"setWLMTBounce(uint256)","350b4cb6":"BaseAirdrop(address,address)","350bb144":"createContractGirl(string)","350c0acf":"checkWithrawStock(address)","350c35e9":"withdrawCollateral(address,uint256)","350cf91c":"createManufacturer(address,address,string,string)","350d141e":"getWasApprovedBeforeDeadline()","350d9b96":"walletWithdraw(uint256)","350dbcc5":"get_Sponsors_list_by_Job(uint256)","350dd4a4":"Nettekcoin()","350ee628":"addVerifiedInfo(address,address,string,uint8,string,string)","350f4270":"specificTransfer(address,uint256)","350f9e01":"swypes()","350fbe2e":"calcNextDrawTime()","35100acc":"credit_token(address[],uint256)","35101d8e":"balancesForOutcome(uint8,address)","35105e3b":"executeChildDaoProposal()","35109cc6":"PRE_SALE_TOTAL_TOKENS()","3510b66c":"reduceTotalSupply(uint256)","3511c1af":"getMySnake()","3511ca9c":"Freezing(address,uint256,uint256)","351210b3":"BpxToken()","35126330":"GanaTokenLocker(address,address)","35130678":"additionalPreMine(uint256)","351314a5":"oIDIndex_()","3513651c":"Spin(address,int256,uint256)","35139014":"preICOstart()","3513cab2":"getWeeklyBuyVolume()","3513d339":"ForceSendTokens(address)","351509a8":"TEAM_ADDRESS()","3515519c":"getInitialval()","3516df21":"supplyBurn(uint256)","3517a740":"getNodeParent(bytes)","35181711":"SetStartTimeIco(uint256)","3519786f":"setAvailableFlat()","35197d6b":"sendData(address,uint256,uint256,bytes)","3519932e":"authorized_recordStashedPayout(uint256)","3519a2f8":"fundContract(uint256)","351a97f8":"accountKind(address)","351adcb0":"SocialPay()","351b68db":"SWAP_LENGTH()","351be6ad":"releaseProduct(address)","351bf518":"transferFeeRate()","351c2576":"completeFavor()","351c9133":"userkeys_push(address,uint64,uint64,uint64)","351dadf4":"support_ban_of(address)","351e46de":"setBLInterface(address)","351f42c3":"msgs(address,uint256)","351f98d9":"icnq()","35209715":"burritoPoolTotal()","35209821":"metadataContract()","35213a69":"abandonedFundWithdrawal()","35216bba":"enableTokenTransfer(bool)","3521d7da":"prvd()","3522e868":"changeLogicContractAddress(address)","35259f1a":"ThriveToken()","3525d66d":"CanvasFrag()","35269662":"importerBanker()","3527cae0":"_deleteUint(bytes32)","3528351d":"bouleDevMultisig()","3528a0c8":"GlobalTransfersLocked(bool)","3528c022":"days_interval()","3528f564":"allowancePerYear()","352a482f":"havedDistFoundCoin()","352a950c":"updateCnyBtcRate(uint256)","352bbdff":"referralContracts(address)","352c93b7":"getFess()","352d2790":"UUID4()","352d5cd0":"setPhaseSupply(uint256,uint256)","352e0891":"_isValidSignatureAndMethod(address,bytes)","352e1dff":"getWorkflowActivity(uint256,uint256)","352f43a8":"RongWQToken(uint256,string,uint8,string)","352f64f9":"getOwnerFee(uint256)","352fd696":"PERCENTAGE_OF_TOKENS_SOLD_IN_SALE()","352ff2bd":"setPreSaleRate(uint256)","352ffb9a":"Trident()","35300990":"propExists(bytes32)","353086e2":"MAX_BET_VALUE()","3530e895":"getClaimEst(address)","3531f0de":"LogWeiWithdrawn(address,uint256)","35347560":"getLamboAttributes(uint256)","35353b03":"parseAndRound(string,uint8)","353559cb":"Controller_Address3()","35359a3f":"tokenHolderAddress()","3535ab2a":"btcUsdRate()","3535cd52":"setDailyCosts(uint256)","3536046a":"getUInt(string)","35361909":"withdrawStart()","35371218":"closePositionDirectly(bytes32,uint256,address)","3538b13a":"MAX_TOKENS_FOUNDERS()","3538b9db":"test_twoValidEqBytes32()","35390714":"maximumFee()","353928d8":"helpRed()","35393197":"setReferer(address)","35396c1c":"createItem(uint256,uint256,uint256,uint256,uint256,uint256)","3539c468":"remainingTokenAmount()","353a3475":"setTargetAddress(address,address)","353ba8e9":"vvc(uint256,string,string)","353be218":"ToorToken()","353c0573":"burnInternal(address,uint256)","353d90ec":"numTickets()","353db436":"setCosts(uint128[])","353e65e9":"wallets(address,uint256)","353edf58":"presaleEndtime()","353f0e40":"getCurrGameInfoPart1()","353f1bc7":"setIsAllocatingInterest(bool)","353fe553":"BNDToken()","35400daf":"setTier2Participants(address[])","3540233b":"set_status_user(address,address,bool)","3540b529":"readIncUpdatedOn(string)","3540e96c":"tokenOWL()","35410f85":"KPCoin()","3541d365":"GPUMining()","3541fd53":"setStake(bytes32,uint256)","3541fe94":"teamVestingAddress()","354211c9":"TriwerToken()","35423643":"totalmoneyearned()","354271b4":"test_7_accessRestriction_UnderscoreRemoveMember_shouldThrow()","3542758f":"addOwner(address,string)","354284f2":"party()","3542aee2":"mintByOwner(address,uint256)","3542d0f6":"msgQPut(string)","35436725":"CoinMovement(address,address,int64)","3543b23c":"assign(address,string)","35446c78":"setAirDropPayableTag(bool,uint256)","3544a864":"whiteList()","354537da":"safeCloseSale()","3545acb0":"after_test_1_method()","354685fb":"setSellDividendPercent(uint256)","35468963":"rentModified(address,uint256,uint256)","354709dd":"trade(address,address,uint256,uint256,uint256,address,uint256)","3547800a":"lockTokens(address[],uint256[])","354836b9":"setIsReportingActive(bool)","3548fcd7":"getCardAttrs(uint256[])","35490ee9":"setPublicOfferPrice(uint256,uint256)","3549345e":"setPresalePrice(uint256)","35493e98":"icoEtherReceivedPreSecondSale()","35496d82":"POWHclone()","354a5137":"setWinnerTimeStatus(bool)","354b2735":"testDeploy()","354b7b1d":"updateVerified(address,bytes32)","354d68f2":"validate(address,address,bytes32,address,uint256,bytes32,address,uint256,bytes32,uint256,uint256)","354d7e40":"Payout()","354d89ee":"setTokenSaleContract(address)","354e1063":"setExtraConfig(uint256,uint256)","354e6ca7":"HippieCoinv2()","354eb40b":"emojisan()","354f1651":"completeBountyDistribution()","354f6398":"insert_candidate(string,uint8,string,string,string,string)","35509937":"changeWithdrawal(address,address)","3550b6d9":"getTokenAddressBySymbol(string)","3550e2e2":"changeBlockedTimeForBountyTokens(uint256)","3551a6ca":"nullifyFrom(address)","3551c8b9":"tokenesia()","355255f5":"totalSyndicateShares()","35527354":"submitNewHash(bytes32,uint256,uint256)","355274ea":"cap()","3552f552":"_random(uint256,uint256,uint256)","3552f9f6":"GetBetReadyTime()","3553f60d":"getPoolAdmin(uint256)","355421a8":"create(uint256,uint256,uint256,address,address)","355473d0":"setuped()","355474d2":"commitReading(address)","35548c02":"WINNERTAX_PRECENT()","35552dbc":"transferDSPRecord(address,address)","35554e58":"SearchUserPurchase(address,string)","3555fa90":"contractSpend(address,uint256)","35566ff0":"rewardSources(uint256)","3556afd8":"m_exchangeRate()","355784cb":"settleToken(bytes32,address,uint256,uint256)","35579f0c":"withdraw_token(address,address,uint256)","3557c1f6":"labAddress()","3557c70a":"removeMintingFactory(address)","3557d0e9":"testThrowIfNotExist()","35593bcf":"vestedAmountAvailable()","35595c95":"getSkillName(uint256)","355ae09c":"Fluzcoin()","355ba211":"emergencyOverwrite(bytes32,uint8,uint8)","355c6457":"tryToRecord(address,uint256)","355d59aa":"publicTokensAvailable()","355d7d03":"batchAllocate(address[],uint256[],uint256[])","355d7e05":"withdrawByMint(address,uint256)","355d8c64":"Uptrennd()","355dd1b3":"Donate_LuGoddess()","355e0c5d":"tokenUri()","355e1b84":"Mstcoin()","355e56b9":"Assembly(address)","355e6b43":"setCommission(uint256)","355eb2c0":"canWrite(string,address)","355f41a9":"pay(uint256,uint256,address,bytes)","355f51a0":"right49(uint256)","355f7ea7":"canUpdateNextGameMinAndMaxBlockUntilGameEnd()","355fd8db":"thirdTimeLine()","35603440":"sections(uint256)","3560f05e":"AsX()","356282db":"changeMinBidMultiplier(uint256)","3562a1db":"CoderForge()","3562fd20":"setUIntValue(bytes32,uint256)","35639e11":"updateMinGasPriceForDrawing(uint32)","356442b9":"lockPercentage()","356594ab":"EtherTransfer()","35671214":"prev(uint256)","3567950c":"blockchainExchange(uint256,uint256,bytes32)","3567d5ef":"BuyGoods(address,uint32)","3567d637":"getTransactionListLength()","3568bd39":"mintStart2()","3568fb04":"createUint256(bytes32,uint256)","356c22ec":"teamOne()","356ca551":"ZhkCoin(uint256,string,uint8,string)","356d414c":"transferFrom(address,address,address,uint256,uint256,bool,bool)","356d4a3a":"createJaroSleep(address,uint256)","356d6b24":"fifthBonusSalesEnds()","356e2927":"icoFinished()","356e7e9d":"mintToAccount(address,uint256)","356eeaab":"payAndReset()","356f056f":"releaseTime3()","356f083e":"_bytes32ToString(bytes32,bytes32)","356f55b7":"adminDropETH()","356f8964":"transferMed(address,uint256)","356f9865":"tokenPerWei()","356fefb3":"developer_edit_text_crowdsale(string,string)","357006c4":"Propellerhead()","3570c2ee":"PosRewards()","3570f217":"CarbonTOKEN()","3571e567":"PausableCappedDividendToken(uint256)","3572a28e":"EPT()","35734ba5":"ExternalSale(uint8,string,address,uint256,uint256)","35735226":"returnBonus()","3573df50":"CreateMND(address,uint256)","357401f5":"cancelBet(uint256)","35743ac9":"proposalActive(uint256)","3574da8c":"deployShop(address)","35759333":"checkList(uint256,address)","3575ecc6":"BreakbitsToken()","35765828":"addSystemUserEarnings(uint256)","3576a32f":"setBackupOwner(address)","3577d94e":"loanTerm()","35785e09":"sweepsState()","3578abf4":"QuintessenceToken()","3578b7b3":"setBuyPrice(uint256,string)","3578bb7f":"calculateScore(uint8[])","35796635":"numEndedGames()","3579c0df":"newAward()","357a0333":"initWithdrawal(address,uint256)","357a05cd":"cram(address,uint256,string)","357a05f1":"Crowdsale(address,address,address,address)","357a0ba2":"sgt()","357af806":"Restart()","357bd7d6":"ROHH()","357be177":"DemSoKhoaHoc()","357d0173":"removeArbiter(address,uint256)","357d4d1a":"ICloudSecAddress()","357ee486":"createDonationsBank()","357fe12a":"createPromoMonsterWithTokenId(uint32,bytes,address,uint256)","3580031a":"consumesGas()","358049ea":"setDiscountTime(uint64)","35804a88":"returnBook(uint256,address,address)","35815b95":"FACTOR()","35817773":"getContract(string)","3581b257":"_addDividendsForAddress(address,address)","35828c8d":"TransactionInitiated(uint256,address,address,address,address,address,uint256,bytes32)","358373bd":"withdrawalInterCrypto(string,string)","35842f74":"depositDai(uint256)","358455b4":"testDefaultWallet()","3584fa38":"setDelegate(uint8,address)","358507d7":"claimRefundOnUnsuccessfulEvent()","3585609b":"getJobCanCancelAfter(bytes16,address,address,uint256,uint256)","358564ee":"allocateLoyaltySpend(uint256)","358592ce":"_freeze(address,bool)","3585e500":"nTransfers()","35862824":"isIcoOpen()","35866368":"transferFromWithCustomReservingNet(address,address,uint256,uint256)","35875623":"get_list_deposit_key(address)","35876476":"initialize(address,address,address,address,address,address,address)","3587904b":"limitOfTeam()","3587b26c":"setAutoBuy(uint256)","3588aa0b":"BMV()","358a074c":"admin_isRequireData(bool)","358a08cb":"activate(address,uint256,address,uint256,uint256,uint256,bool,bool)","358a11b4":"change_data(string)","358a18b2":"ThePatriotCoin()","358a2a84":"toHorse(uint256)","358c24b1":"CONFIG_MIN_PLAYERS()","358cc6f6":"acceptKyc(address)","358cfa25":"setTotalEtherPool(uint256,uint8,bool)","358d1e26":"HitToken(string,string,uint8,uint256,address,address)","358d5dc2":"getIsCashed(uint256,uint256)","358dff07":"minEthPerTransaction()","358f7f3a":"numberRange()","358fa6c6":"calcBuyout(uint256)","358fcee9":"fetchdivs(address)","358ffd79":"Controller(address,address,uint256)","3590699d":"_newSchellingRoundEvent(uint256,uint256)","359170e6":"setTransfersEnabled()","3591a1a9":"canDrip(address,address)","3591f5bd":"removeSomeDETsFrom(address,uint256)","3591fadc":"STAGE_2_FINISH()","3592336c":"getRetailerStatus(address,address)","3592c3b5":"uintToString(uint256,uint256)","3592dfea":"updatePackage(uint256,string,address)","3592f369":"disableTokenSwapLock()","35930e13":"setMinimalRewardedBalance(uint256)","359320de":"getCurrentVelocity()","35953108":"removeAddressesFromWhitelist(address[],string)","359531f4":"allowCnsContracts(bytes32,address,bytes32)","35956083":"Parabola()","35956c42":"ABCPresale(uint256,uint256,address,address)","35958196":"getGamesPool(uint256[])","359582ca":"downstream()","3595b570":"copyBalance(address)","35960028":"payMeFor(uint16)","359627e5":"canPay(address,uint256)","35967501":"setManualOverride(bool)","35972f46":"techAccount()","35975a37":"setStart()","3597727c":"EtherDLT()","359803cd":"pauseMinting(bool)","359819cc":"Group(address,bytes32,address[])","359829db":"numOfBackers()","3598ac34":"Cider()","35995022":"getPhaseCount(uint256)","359976a7":"getCheckSum(bytes20)","359ae0f3":"set_Shops(address[],address[])","359bc19e":"finalize(uint64)","359c1912":"setUintF1(uint256)","359c1f72":"getGravatar(address)","359c8a93":"claimD()","359cc28e":"changeIcoDeadLine(uint256)","359cf2b7":"requestTokens()","359d04a2":"voteRuling(uint256,bool)","359d393d":"votes_against()","359d9277":"XXXXXXXX01(address,uint256)","359db8c8":"partialDistributeDivident(uint256,address[],address)","359dbafe":"validatorWrotePart(uint256,address)","359ef75b":"init(address,address,address,address,address)","359f517e":"confirmWithdrawal()","359fe132":"getSharesByShareOwner(address)","359fe780":"increaseMintApproval(address,uint256)","35a063b4":"abort()","35a07291":"makeAssessment(uint256,uint256,uint256,uint256)","35a1529b":"dripAmount()","35a1bf6e":"test_insert_findWithHintNextRemovedUpdateTail(int256)","35a1d95d":"requestSnapshots(uint256)","35a21728":"multiERC20Transfer(address,address[],uint256[])","35a23659":"miningTimePerTrip()","35a26787":"AuthAddr(address,address,address)","35a374dc":"issueLottery(uint8)","35a3a96f":"marketingRecipient()","35a3cfa0":"transferMarketallocationTokens(address,uint256)","35a3e83c":"getCurrencyDecimals(uint256)","35a3fbb0":"_triggerStashedPayoutTransfer(uint256)","35a4015d":"numberOfBudgetPlan()","35a49063":"personalityTypes()","35a4fa30":"createPromoWhale(address,string,uint256)","35a53379":"_increaseWinPotChance()","35a568b9":"setLockPostion(address,uint256,uint256,uint256)","35a5c43a":"get_FTVTOKEN_EURCENT(uint256)","35a5e06d":"getRoots()","35a5e8bf":"SectorUpdated(uint16,address,string,string,string,bool)","35a66ef8":"arrayOfAccountsThatHaveClaimed()","35a6861a":"login(address)","35a6c1e0":"totalPausedSeconds()","35a6ed92":"calculateBonusAmount(address,uint256,bytes32)","35a8076b":"Accounts(address,address)","35a951b8":"endTime(bytes32)","35a9731b":"approveRefund()","35a9a5c7":"setWithdrawAccount(address)","35a9c82f":"setSecret(bytes32)","35a9d051":"ETH_address()","35aa6bec":"checkExpectedTokens(uint256[],uint256)","35aa6c31":"getMoney(address,uint256)","35acac4e":"abort(string)","35acbcab":"makeStudentID(bytes)","35ad84f9":"buyFromValue(uint8)","35ad9581":"saleRateSecondDay()","35adc0c5":"sellerCancel(bytes16,address,address,uint256,uint16)","35ae20bb":"AddEthBalance(address,uint256)","35ae41c9":"godAutomaticCollectFee()","35aed70f":"getNumAnimalsXPlayerXType(address,uint8)","35af1986":"div27(uint256,uint256)","35af2c4f":"unsetIdentity(uint256,address,address)","35af5a9c":"MOTCToken(uint256,string,string)","35b05d1e":"purchaseRequest(uint256,uint256)","35b09a6e":"someFunction()","35b1097e":"communityTokensHolder()","35b1114a":"REQUEST_CANCELED_BY_BORROWER_STATUS()","35b11b72":"setColors(uint16,uint256[5],uint256)","35b21ceb":"totalChildTokens(uint256,address)","35b28153":"addAuthorization(address)","35b3caf0":"cancelOrderWithPayerByAdmin(string,address)","35b3ee0e":"NGA()","35b46459":"distribute(uint256,address[],uint256[],uint256)","35b4a6d9":"updateBTCPrice()","35b4a93e":"HSDJCoin()","35b55d98":"SUBSCRIPTION_MODULE()","35b643d4":"getBalanceTimestamp(uint256)","35b6a6c6":"tokensForAdvisors()","35b6cc03":"RankingBallGoldCrowdsale(bytes32[5])","35b6df5d":"BurnableCrowdsaleToken(string,string,uint256,uint256)","35b6eaea":"isPayed(address)","35b75391":"test_validProposalExecution()","35b7588f":"allowedMinting()","35b8e820":"getCandidate(uint256)","35b94b5d":"MIOTToken(uint256,string,string)","35ba1d0a":"closeOnBehalfOf(address,address,bytes32,uint256)","35ba66de":"ACATokenSale(address,address,uint256,uint256,uint256)","35ba9af8":"availableForWithdrawal()","35bb0398":"didSign(address,bytes32,uint8,bytes32,bytes32,uint8)","35bb3e16":"grantAdmin(address)","35bb5fd2":"isToonInterface()","35bbe70e":"getAllVoters()","35bce6e4":"transferMulti(address[],uint256[])","35bd8b94":"Noblebit(uint256,uint256)","35be7bf3":"getSecondRoundReleaseTime()","35bf82f6":"setChallengeFee(uint256)","35bf90ca":"getContributorByNumber(uint256)","35bfe158":"changeGoldIssueBurnFeeContract(address)","35c019e2":"LogFundTransfer(address,uint256)","35c05ab0":"hodlFor3y()","35c1d349":"participants(uint256)","35c23200":"computeNextPrice(uint256)","35c2d49d":"minInvestETH()","35c40fe3":"testParamOutOfBoundsFail()","35c42d7f":"getPetByIndex(address,uint256)","35c4de7a":"OracleRequest(address)","35c5b475":"getExpectedReturn()","35c648c5":"POMDA()","35c6511b":"endMiniGame()","35c699c4":"getUnclaimedEtherIfAny(uint256)","35c72df0":"bryan()","35c7421b":"testMinReturn32WithReturn()","35c77e6f":"configurer()","35c80c8c":"isCustodian(address)","35c8518b":"setCloseBlock(uint256)","35c914c2":"finishPayaning()","35c969ea":"Presale(address,address,address,uint256,uint256,uint256,uint256)","35c990d4":"getGameCalculationProgress(uint256)","35ca8ce1":"setPriceToRegSale()","35caecc3":"getPeriod(uint256,uint256)","35caf648":"DonationMatched(address,uint256)","35cb1f07":"wethDeposit()","35cb27b5":"minedToken(uint16)","35cbdc25":"AcceptsProofofHumanity(address)","35cbe716":"getRemainingAirdropSurplusAddressesLength()","35cc2d80":"isInState()","35cc59a9":"createSchema(bytes)","35cd2358":"setAffiliation(address,uint256)","35cd4cc4":"getLastKicker()","35cd78b3":"saveMetaData(address,bytes32,bytes32,bytes32,bytes,uint32,uint256,uint256,bytes,uint256)","35cf60df":"enableFreezePriceRateRecalc(uint256)","35d0b444":"LogRedeemToken(address,uint256)","35d129f6":"untag(string)","35d13969":"SendAllMoney()","35d1f606":"destroyCard(uint256)","35d1f869":"setAtomOwner(uint256,address)","35d357ac":"logCeiling(int256,uint8)","35d37dbb":"mgmtFeePercentage()","35d4a49a":"setSubFreezingPrice(uint256)","35d65132":"canClaimPayout(address)","35d6d214":"getBids(uint256[])","35d6d611":"DAY_LENGTH()","35d79fad":"CertificationDb(address,uint256,address)","35d7a052":"freeze(uint256,uint256)","35d7d09a":"next_diary_id()","35d7f149":"takeBuyOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)","35d82d16":"setGeneralInfo(bool)","35d91b85":"cancelOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes,uint8,bytes32,bytes32)","35d94797":"verifyBetMask(uint256)","35d97405":"dividends()","35d99f35":"masterMinter()","35d9ba1f":"getTill()","35d9ceee":"uintMax()","35da3c1a":"createNewGalaxy(string,uint256)","35daa731":"ordersCount()","35db2829":"sendStableReward(address,address,uint256,uint256)","35db2b72":"Winchain()","35de5e89":"setPixelBlockPrices(uint256[],uint256[],uint256[])","35de74b8":"PBC()","35decc5f":"updateTargetToken(address,uint256)","35dfcc92":"totalCastle()","35dffde5":"updateReleaseAmount(uint256)","35e04fab":"prePayment()","35e09095":"decTotalSupply(uint256)","35e0f450":"stageMaxBonusPercentage()","35e24a6b":"preICOstate()","35e49e5f":"sellBlocks(uint8,uint8,uint8,uint8,uint256)","35e4d30f":"nonzeroAddressesElementForApi(uint256,uint256)","35e5f617":"transfer_erc20(address,address,address,uint256)","35e608be":"addUpgrade(address,address,bytes)","35e60bd4":"setTransferLocked(bool)","35e64aaa":"transferLand(int256,int256,address)","35e6a7af":"addab()","35e6e5b6":"removedSalesAgent()","35e82f3a":"removeAddressFromBlacklist(address)","35e83446":"testInitialBalanceWithNewMySale()","35e9d83b":"transferToAddress(address,uint256,bytes)","35ea6821":"masternodeTransferOwnership(address)","35ea94ad":"TokenSold(address,uint256,uint256)","35eb5208":"registerAgent()","35eb702f":"getPlayerWinning(address,uint256)","35eb8479":"showBidder()","35ebbfd1":"weekTwoStart()","35ec6dab":"earlyWallet()","35ed3fd6":"BONUS_PERCENTAGE()","35ed548f":"getPositionRequiredDeposit(bytes32)","35ed64c3":"CZToken(string,string,uint8,uint256)","35ed663d":"ENJToken(address,address,address,address)","35ee2783":"Alarm()","35ee2f8a":"initCanOffsetTime()","35ee72c7":"ISSToken()","35eead41":"addNote(bytes32,string,string)","35eec76a":"privatePreSaleSoldTokens()","35f067cf":"updateTokenURIPrefix(string)","35f097f3":"isOnBattle(uint64)","35f0d665":"reloadStoreByName(uint256)","35f10cc3":"sendWinnings(address[],uint256[])","35f1bd11":"EcoCrypto()","35f21f0a":"GladiethersOraclize()","35f2507f":"recoverUser(address)","35f27b20":"collectAirDropTokenBack()","35f2fbaf":"_bid(address,uint256,uint256)","35f3cf85":"setSaleManagerAddress(address)","35f46994":"die()","35f4de27":"HumaniqICO(address)","35f64a30":"albosWallet()","35f6806b":"addNewAccount(string,address,uint256,uint256,uint256)","35f68424":"getTokensByBTC(uint256)","35f6c161":"createWallet(uint8)","35f79b83":"LordCoin()","35f7ff63":"stringStorage(bytes32)","35f80a1b":"UbiatarPlayVault(address,address,uint256)","35f82876":"fillOrderNoThrow(uint256,bytes)","35f84393":"contructor(string,string)","35f88860":"listScam(uint256,string,uint256)","35f8a2c6":"RefundableCrowdsale(uint32,uint32,uint256,address,uint256)","35f931cb":"AmberToken(uint256)","35f96a7d":"goldBought(uint256,address,bytes32,string,string,string,string,string)","35fa3128":"BTTSToken(address,string,string,uint8,uint256,bool,bool)","35fa3843":"setend()","35faa416":"sweep()","35facf78":"createProposal(string,uint256)","35fb2125":"onlyBouncerTransferOwnership(address)","35fb337c":"finalCap()","35fb8e36":"triggerTestEvent()","35fc3e90":"claimRefundEther(address)","35fc7506":"StatsSold()","35fd8877":"isCashBack(address)","35fe3660":"MID_GRADE_CATEGORY()","35ff058a":"pushArray(bytes32,uint256)","35ff217d":"CrowdfundFinalized(uint256)","35ff3a51":"getRaisedEther()","35ffa20d":"handleWithdraw(address,bytes32,address,address,uint256,uint256,bytes32,bytes32)","35ffbe74":"verifyClaim(bytes,uint256,uint256,uint256[],uint256[],uint256[],uint256[])","35ffd687":"getStageLimit(uint8)","360035c6":"RepoToken()","360038b5":"CheckOver()","3600af8b":"updateProfileImgurl(string)","3600e1e2":"controlLimits(address)","36013189":"randomness()","360184e9":"Fouracoin()","3601dd87":"TNTToken(uint256,string,uint8,string)","36025bf8":"licenseTermsHasMaxCost(bytes32,bytes32)","3602627d":"BdpImageStorage(bytes8)","3603b0b0":"MULTISIG_WALLET_ADDRESS()","36044ecc":"changeTokenReward(address)","3604caa1":"lockAddress(address[])","36054f51":"affiliatThreshold4()","360583c6":"getUsersGunsIds()","36066f71":"Token(address,string,uint8,string,address,address)","36067543":"FirstEtherLimit()","3606c983":"createClaimMsg(bytes32,string,string,address)","36080694":"deleteRate(bytes4)","360821e8":"setMinimumBitcoinToInvest(uint256)","3608672c":"liveBetexICO()","3608c9eb":"MULT_FACTOR()","360998e6":"Cryptex(address,address,address,uint256,uint256,uint256)","3609ac8f":"START_PRICE()","3609bf09":"updateBusiness(uint256,uint256)","360aa28b":"isVersionContract()","360aac67":"accountGameResult(address,uint256)","360b3b31":"setAirdropEnabled(bool)","360b8115":"VipMigration(address,uint256)","360c97dd":"frozenAnnually()","360c9ed0":"deprecateBodySubtype(uint8)","360cdf5e":"AsOyToken()","360e5f54":"TokenGift(address,uint256)","360ec1b8":"processPurchase(bytes32,int256[],int256[])","360ed9c2":"receiversCount()","360f1d07":"bonusRatePrivateSale()","360f6b21":"chargingSwitches(address)","360ff695":"timeTier3()","3610724e":"buyTokens(uint256)","361228ea":"weiForToken()","36127d7e":"updateEMA(uint256)","36134a4b":"shouldBeStarted()","3613b781":"revokeVesting(address,address)","36144c9a":"getUserReferrer(address)","3614ac6f":"test4_searchSameNode()","361698ff":"adminSetWorldSnapshot(uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","36169d90":"sweep(address,uint256,uint8[],bytes32[],bytes32[])","36170ae5":"startingDateFunding()","36173764":"frozen(address,uint256)","3617653e":"powerContract()","3617d5c6":"viewIndexNumber()","36181026":"tryToFinalize()","361819e8":"RANGEEND_4()","36186868":"icoWeek2Bonus()","361893f7":"getBrand(address)","3618b290":"hodlFor2y()","3618c2a2":"removeAddressesSet(address)","36199817":"setFinalTimestampOfBonusPeriod(uint256)","3619cd99":"myHalfDividends()","361a4eb8":"Party()","361a5468":"testFailMoveWhenStopped()","361ae621":"LifMarketValidationMechanism(address,uint256,uint256,uint8,address)","361b5eaa":"token(bytes12)","361b94be":"contributorMinCap(address)","361bb340":"left48(uint256)","361bfc5b":"ETH_per_BRA()","361c14b0":"teamUnlock4()","361cac82":"marketStores()","361cc3ab":"getUserTotalPromoBonus(address,address)","361d004f":"changeBank(address)","361d292e":"getCarAuctionID(uint32)","361d4e53":"usedTokenBalance(address)","361d55be":"callback_ForUnderwriting(uint256,string,bytes)","361f10e5":"setSiteAccountAddress(address,address)","361fab25":"setSupplyLimit(uint256)","361fd603":"First_pay_clientmanager()","3620f56d":"addQuest(address)","3622b5ef":"PIGGY_BANK(address)","36234138":"registerPair(address,address)","362344b8":"MAX_YAYS()","3623c225":"bid(uint16,uint256)","3623f548":"getAllWinner()","36249140":"third_withdrawal(uint256)","36261907":"setting(address,address)","36262665":"getOwnershipTokenCount(address,address)","362698a2":"Unlocked(string,bytes32,address)","3626aae7":"getMedalType(uint256)","36274669":"Poll()","3627d195":"FuckToken()","3627d3a1":"mintPrivate(address,uint256)","36281b38":"uppercaseOf(string)","36285df7":"bonusWindow1EndTime()","3628731c":"addAddresses(address[])","3628ca60":"getEpisodeList()","3628e6f3":"BMTToken()","3629c8de":"activation()","362a0c27":"_withdrawWonCosFromGame(uint256,uint256,uint256)","362a198d":"nextBurnFeeAbs(uint256)","362a36b4":"bidFeePercents()","362af076":"createRequest(address[3],address,uint256[11],uint256,bytes)","362bd679":"updateFreeStorage(address,uint256)","362c160e":"changeWithdrawalDate(address,uint256)","362c78b9":"invitedReward()","362cb8ff":"icoSucceeded()","362cba6f":"PlotSale(uint256,uint256,address,address,uint256,bool)","362e2565":"returnDeposits()","362e4945":"lengthAddresses()","362e669a":"BarrosTest()","362ec5e2":"createProductionUnit5()","362f04c0":"participantCount()","362f5fb2":"getDogInfo(uint256)","362f74e7":"updateBatchSupport(bool)","362f8833":"stakeRoto(address,bytes32,uint256)","362fe943":"MainBridge(address,uint256,address[])","36304e91":"allFactories()","3631826a":"multiline(uint256,uint256)","3631ecd9":"privateStart()","36321001":"will()","363210c9":"_delegatecall(bytes32,uint256)","363221fe":"advisorTokens()","3632803f":"calculateGrapeSell(uint256)","3632b4d9":"withdrawCoin(bytes32,uint256)","36330b0c":"updateInitialZero(uint256)","363349be":"fillOrdersUpTo(address[5][],uint256[6][],uint256,bool,uint8[],bytes32[],bytes32[])","36335e19":"contributePublic()","3633b1ad":"createRealmSale(uint256,uint256,uint256)","3633c522":"GiftPoolContribution(address,uint256)","36344022":"testAuthorizedTransfer()","363487bc":"currentInterval()","3634a1b7":"createSeries(bytes32,string,bytes32,uint256)","3634b376":"GATcoin(uint256,string,string,uint8)","3634dcd8":"sub0(uint256,uint256)","36351c7c":"recharge(address,uint256)","36354b2f":"updateEtherAndtokenAmount(address,uint256,uint256)","3635e329":"getCurrentPeriodByEntity(uint256)","363626ad":"addressesToTotalWeiPlaced(address)","36371722":"chunk4IsAdded()","36382941":"changeTokenOwnerWalletAddress(address)","3638ae05":"transferETHtoProviders(address,address,uint256,address,uint256)","3638fb00":"transferOwnership(address,bytes32[3],bytes32[3],uint8[3])","3639dda5":"monthly_token_growth()","363a0903":"Creatable()","363a4708":"setMintFeeReceiver(address,address)","363ad06f":"getFrozenAmData(address,uint256)","363bc3a2":"alreadyAutoAirdropAmount()","363bf964":"setAddresses(address,address,address)","363c3747":"TestBalance(address)","363c51dc":"set_savings_goal(uint256)","363c6b81":"MAX_PENDING_REQUESTS()","363c76f3":"HLChain()","363c9bca":"runTimeAfterSoftCapReached()","363db35d":"IcoTotalSupply()","363dc725":"_unpackProtectionParams(uint256)","363dd19e":"summon()","363df59a":"UNGTToken(uint256,string,string)","363ef9dc":"APB()","363f7746":"validSignature(uint8,bytes32,bytes32)","363fa6b2":"renameChibi(uint256,string)","36400cd2":"ALM()","3640599c":"getPI_edit_6()","364083f4":"makeSale(uint256)","3640ca5b":"SupermarketKontrak()","3640e413":"YunPengToken(uint256,string,uint8,string)","3640f613":"cancelMatch(uint8)","3640f910":"LogEndSale(bool,uint256,uint256)","36422e49":"_createEtherDogWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256)","3643d14b":"withdraw_to(address,uint256,uint256,uint256)","3645ebfb":"indFundDeposit()","36470665":"battleboardDataContract()","36471908":"ownerPerThousandShareForMating()","36475668":"getCommunityData(string)","3647b084":"setAmountBonuses(uint256[],uint256[])","3647b87a":"buildFactory()","364832cd":"isStrongHand()","36484ea0":"PHASE2_START_TIME()","36489775":"USDZAR(uint256)","364aa98d":"createDate(uint256,uint256,uint256,uint256)","364c7815":"addCredit(uint256,address)","364cc73e":"isEatingAndDrinking(address)","364d0b53":"getAddress(bytes32,uint8,bytes32,bytes32)","364d279a":"phase2Duration()","364d2a06":"queryCreatureOwner()","364ddb0e":"left52(uint256)","364ddc2d":"getmemberposition(uint256,address)","364deeef":"Sceatt()","364e022f":"buyProduct(string)","364e0af3":"_createEdition(string,uint256,uint256)","364e1c59":"publicsalesendTime()","364e69b7":"canBet(uint256)","364e74eb":"releaseTokenTime()","364ea9e7":"set(uint256,uint256,bool[],uint256[])","364ee75d":"getRoundEnd()","364f4896":"emission(address,address,uint256,uint16,uint16)","364f6695":"earlybird_coins()","365044a8":"priceDivider()","36516a8a":"publisherAddress()","3651b401":"commissionGetter()","3651b5df":"setTargetWallet(address,address)","36525c4e":"resetStorage()","36527357":"getUint(int256,address,string)","3653cf9f":"getOldESOP()","36540b3b":"amountFundPlatform()","36548b58":"arrayIndexOutOfBounds(uint256)","36555b85":"add(string,uint256)","36566f06":"togglePaused()","3656de21":"getProposalById(uint256)","3656eec2":"balanceOf(uint256,address)","36579ff6":"Burnable()","3657ba36":"getSharedAccountPw(bytes32,bytes32,bytes32)","36585cd3":"getBatchStartTimesLength()","3658964c":"totalBal(address)","3659078c":"DailyDivs()","3659467b":"registerName(uint256,bytes32)","3659887c":"isAlreadyUser(address,address)","3659a8b2":"bonusEnds1()","3659cfe6":"upgradeTo(address)","3659d90f":"month12Allocated()","365a5306":"loan(uint256)","365a86fc":"hub()","365af466":"failedWhitelist(address)","365b1b15":"upgradeKiOS()","365b29e8":"WEBPOUND()","365b5055":"isAccountFreezed(address,address)","365b94ad":"saleFinished()","365b98b2":"users(uint256)","365c2e95":"hasEnough(address,uint256)","365c81fb":"pubsaleRate()","365ccbef":"didTakeOrder(bytes32,address,uint256)","365ce233":"removeAccountReader(address,address)","365e304d":"DATE_31_DEC_2021()","365e808d":"transferFromHyperstakingdisbursementfund(address,uint256)","365ede48":"setReport(string,uint256,string)","365f6e9f":"getCellsSinceLastEvent(address)","365fe9fd":"isDistributionTransferred()","36600999":"fundRepository()","366077ee":"addToPot(uint256)","3660943d":"checkState(bytes)","3660a084":"transferSigner(address)","3660fcd0":"setGuestName(string)","36610cb9":"storeOptions(address,uint256)","36645e01":"Election(uint256,uint256,uint256,address)","3664a0ea":"getLastCallKey()","3664b12d":"erc223Activated()","36651d2a":"setDestoryAddress(address)","3665708e":"nextMinPlay()","3666750e":"fillHeldData(address[],uint256[])","3667551c":"Partial8Send()","36682d5d":"Transtoken()","366859c4":"job(address,address[],uint256)","3669acad":"_newChallenge(uint64,uint64,address,uint256)","366a4120":"release(uint256,uint256)","366a68dc":"setBlockLock(uint256)","366ac8e0":"LGCCoin()","366b6e9e":"secureUnapprove(bytes32)","366ba691":"CBX()","366bb03c":"totaTeamRemaining()","366bc343":"AssignFeeToWallet(address,address,uint256)","366bc401":"collectedUSDWEI()","366d2b4e":"CancelledBySeller(bytes32)","366df51d":"initializeMintableTokenFundraiser(string,string,uint8)","366dff9c":"walletAllowances(address,address,address[])","366e81d6":"TokenSold(uint256,uint256,uint256,address,address)","366e881a":"commitScores(uint256[],uint256[])","366f2d86":"paymentDue(address)","366f77b7":"checkChoice(uint8)","3670e072":"gettoday()","3672404e":"getServiceCount()","367265fb":"transferTokensManual(address,uint256)","36730467":"split(uint256,uint8,uint256,address[],address,uint256[])","36733fa0":"addRange(address,uint256)","36738b41":"Crowdsale(address,address,address,uint256,uint256,uint256,uint256,address,uint256)","36746413":"PrivateInvestment()","367488ce":"roulette(uint256)","36751a6b":"uploadCode(string,bytes)","36756935":"FinalConfirmation(address,bytes32)","36756a23":"constructor(address[],uint256)","3676049b":"setFundFeeAddress(address)","367605ca":"setApprovalForAll(address,address,bool)","36760fd2":"HULKtoken()","36767205":"increaseTokenLock(address,uint256)","3676b342":"createAddOn(string,uint256)","3677b5f2":"LATokenMinter(address,address)","3677c333":"authorizeBurnRequester(address)","3678933c":"isEpochDataSet()","3678f179":"crosairShipMinted()","367a0f97":"getReputationProblems(address,string)","367ad6ea":"redeemPack(uint256)","367afa7a":"_nextPrice(uint256)","367ba52c":"submitOrder(uint8,uint8,uint64,uint64,uint16,uint16,uint16,uint16,uint16,uint16,uint256)","367bbd78":"strlen(string)","367bc8d3":"TransmutedTransfer(address,address,uint256,address,string,string)","367bf2f9":"currentBlockHeight()","367c574f":"DIP_Pool()","367cad89":"alternative_Exchanges_links()","367ebb99":"deathData_a12()","367edd32":"enableContract()","367f0708":"ico1Raise()","367f20f6":"_unpackBaseDamageValue(uint256)","367f34de":"performALU()","36805961":"setStr(string,string)","368186ef":"DigiberyToken()","3682905e":"RICOStandardPoD()","36829419":"AddrInvestor()","3683b44a":"checkPrizeAlreadyReceived(address,uint256,uint256)","3683ec67":"CavsvsPacers425()","3683ef8e":"preSign(bytes32,address,bytes)","36840423":"AddAdrJullarTeam(address,address)","36842110":"wasCrowdsaleStoped()","36851957":"CustodianInterface(address)","36865384":"BuyShare(uint32,uint32,address,address)","3686ca3e":"beneficiaryWithdrawal()","3686d52a":"ppsBase()","3686edc7":"_getBmcDaysAmountForUser(bytes32,uint256,uint256)","3687e257":"TenantTerminate(string)","3687e921":"readInfo(address,uint256)","3687f24a":"setFee(uint128)","36880b82":"recordOwnerOf(bytes32)","368818aa":"FrozenMediaTokenFunds(address,address,bool)","3688632e":"setAvgSalesCount(uint256)","3688c272":"getTokenPriceListByIds(uint256[])","3688fa2c":"issue(address,uint64)","3689a651":"paymentFrom(uint256,bytes,address,address)","368a5773":"SpermLab()","368a5e34":"AIRDROPPER()","368aa9ca":"p_update_priceUpdateAmount(uint256)","368af7f3":"availablePonzi()","368b069d":"deployEscrowClone(address)","368b2842":"safeBatchTransfer(address,uint256[],uint256[],bytes)","368b3c81":"PTTYC(uint256,string,string)","368b8772":"setMessage(string)","368bf74e":"TEAM_LIMIT()","368d09d8":"requestOracleValue()","368d6b25":"setRushTimeChallengeRewardsPercent(uint256)","368daf8f":"goldMigrationsCount()","368dde4b":"currentCost()","368e5d4e":"BTC_SUISSE_TIER_4()","368e85ff":"IICO(uint256,uint256,uint256,uint256,uint256,address)","368f3492":"AnemoiSaleContract()","368f76a9":"bossCutPercentage()","36909ddd":"isATMHolder(address)","3690fd03":"CPLPrivate()","3691125a":"LianPaiToken()","36917dfa":"getPony(uint256)","3691dd11":"userApprove(address,uint256,uint256)","3692d61a":"log(string,bytes32)","3693396a":"getLastSignedTime()","36937781":"initialize_proposal()","369388cc":"EMISSION_FOR_BOUNTY()","3693db0a":"FOUNDER_ONE()","36944e49":"secondRefundRoundRateNumerator()","36945328":"setAddrContractCaller(address)","3694566e":"getRate(uint256,bytes32)","3694569e":"IHateEos(string)","3694629a":"getQuestionFinalizable(uint256)","3695507b":"IRC_PER_ETH_PRE_SALE()","3695672b":"newBurnableOpenPayment(address,uint256,bool,uint256,string)","36958413":"weaponEntities(uint256)","36965e3a":"SetAElfDevMultisig(address,address)","3697d0a7":"renderLandingHash()","3697efb2":"MinerEdgeCommunity()","3697f055":"withdrawFunding(uint256)","36988bc4":"currentLoanPerson()","3698de0a":"soliditySha3(bytes32)","369ac28f":"deltaTime()","369b1ce5":"initialBuy(address[])","369badf1":"getCreditsAtIndex(uint256)","369bcd64":"_checkPixelUnder(uint256)","369cbbb4":"checkMonthlyLimit(address)","369cd460":"totalPilfered()","369d32f1":"Items()","369d8138":"createAsset(string,string,string,uint256)","369de07d":"PDTX()","369e2422":"updateTokenPricePerUSD(uint256)","369e8c1d":"commit(address)","369f927f":"initBlockEpoch()","369fe962":"getDisputeMemorySize(uint256)","36a013c8":"LogInvestment(address,address,uint256)","36a09eae":"SetPriceMultiple(uint256)","36a0f511":"getPeriodMinting(uint256)","36a128c2":"MyJioCoin()","36a1bbfd":"baseTargetReached()","36a1c184":"IsArt()","36a1fb5f":"changeUserStatus(address,bool)","36a23dbf":"freezing(bool)","36a26b99":"END_TIME_PRESALE()","36a26fd9":"TokenDeactivated()","36a2f0f1":"changeLocked()","36a31de5":"getRequestOwner(uint256,uint256)","36a33f99":"isLimitMint()","36a3668a":"teamTokensPerPeriod()","36a36f7c":"betexStorage()","36a39882":"_proceedStage()","36a42675":"combineInterest(uint8,uint8)","36a4f2ba":"createBtcAddress(uint256,int256,uint256,int256)","36a60891":"setTrainingFeeMultiplier(uint256)","36a6412b":"buyMicroKeysWithHandle(string,bytes32)","36a6ad58":"mintPartnershipTokens()","36a716da":"createOrderHash(address,address[3],uint256[5],int256)","36a7cf1f":"setBallotFactory(address)","36a9f2f7":"xactionFeeNumerator()","36aa972e":"FullPayChain()","36ab0f15":"getNewAllowancesEffectuation()","36ab753e":"startRefunding()","36abffd4":"_receiveFunds()","36ac732e":"updateSecondChangeBlock(uint256)","36ad6e46":"SendTokensToFounders(uint256,uint256,uint256)","36add1df":"interestDistribution()","36ae22f0":"emitFeePeriodRollover(uint256)","36ae31ec":"getCatOwners()","36ae5040":"isMinted()","36aec5a3":"amountContributed(address)","36af1954":"withdrawnReadable()","36af50fd":"setSale(address)","36af8151":"setSpareRecommAddr(address)","36b024ab":"setTransferableDate(uint64)","36b09474":"winningNumbersPicked()","36b1315c":"min64(uint64,uint64)","36b19cd7":"adminWallet()","36b222b3":"fillOptionOrder(address[3],uint256[3],uint256[2],bool,uint8,bytes32[2])","36b2e0f9":"acceptBidForCollectible(uint256,uint256,uint256)","36b2fe94":"setPurchaseAdmin(address)","36b324ff":"unMap(address)","36b33415":"modifyMemberInfo(string,string,string,string)","36b3da05":"chargeBalance()","36b40bb6":"leftOnLastMint()","36b61e3c":"otc()","36b641c2":"MakeMyToken(string,string,uint256)","36b69367":"parentFees(address)","36b77107":"lastDeposit()","36b81feb":"Deed(address)","36b97fd5":"TestToken5(address,address,address,address,address,address,address,address)","36b9856d":"newOraclizeSetProof(string)","36bacc7c":"getTentativeWinningPayoutDistributionHash()","36bb9ffa":"MANHATTANPROXYPARKAVE()","36bc32a2":"expectedPayout(address)","36bcb4c9":"changeAge(uint8)","36bcb4cd":"ViteToken()","36bdee74":"totalETH()","36be2a73":"setLedger(uint8,int256)","36bee178":"add_to_withdraw_bounty()","36bf094b":"BonusPeriodsCount()","36bf2e15":"ERC20ImplUpgradeable(address)","36bf392b":"distributeInvestorsFee(uint256,uint256)","36bffe1e":"nextCommonTTMTokenId7()","36c0aada":"setValueAll(uint256)","36c0c834":"buySignature(bytes16)","36c1a50f":"notZeroNotSender(address)","36c28466":"Panel()","36c2a922":"KryptopyToken()","36c2d72d":"getTotalSlaves(address)","36c35f94":"finalize1()","36c4a520":"Volks()","36c4ad0c":"getEthFromKeys(uint256,uint256)","36c4db09":"setCOO(address,bytes)","36c4ff7a":"payoutAddr()","36c5787e":"setTokensWave(uint256,uint256[10])","36c5bf8c":"_ownerReleaseLimit()","36c5d724":"removeToken(uint256)","36c5ff5d":"addToTransactionDisallowedList(address)","36c61b60":"_buyToken(uint256,uint256,uint256)","36c63b8d":"AbstractVirtualToken()","36c6a410":"BatanCoin()","36c7d4bd":"processReinvest(uint256,uint256,uint256)","36c802a0":"priceStage2()","36c84de5":"getPlayerDataByAddress(address)","36c8af5d":"_getId()","36c8c0e9":"addBonusBatch(uint256[],address[])","36c8c5ee":"voteForCandidate(uint256)","36c8e831":"PhillionToken()","36c92c3f":"setRoundDuration(uint256)","36c9c62d":"transfer_opt(address,address,uint256)","36ca97d6":"tokenFeePercent()","36cb4c48":"log256(uint256)","36cb8098":"BouCrowdsale(uint256,address,address)","36cb8740":"test_3_accessRestriction_vote_shouldThrow()","36cbee23":"bountyFunds()","36cc17a7":"clientClaim(uint256,uint64)","36cc18b5":"setPriceIdv(bytes32,address)","36cc1ebb":"setCCH_edit_13(string)","36cc6a10":"modifyTokenFee()","36cd24aa":"prepareVote(bytes32,uint256)","36ce94bf":"bytesToAddress1(bytes)","36cf7c87":"dead()","36cfe3eb":"starbaseEarlyPurchase()","36d0288c":"CL()","36d02c94":"changeSettings(uint256,uint256)","36d03356":"setAdvisorsTeamAddress(address)","36d10e45":"LemonsRemainingToDrop()","36d1535d":"getEbola()","36d15f2a":"_validateSettleSignatures(bytes32,bytes,bytes,bytes,bytes)","36d18b67":"RED()","36d1f54b":"UnitedfansTokenCrowdsale(address)","36d22de7":"pokerbox(uint256,uint256)","36d300b3":"addAction(uint256,uint256,uint256)","36d373c0":"writeDefinitions(uint8,string)","36d38bd4":"scs()","36d43c24":"withdrawId()","36d505cf":"_breedWith(uint256,uint256,uint256)","36d61112":"getVendingStepQty(uint256)","36d647cf":"bonusLine()","36d81f07":"getUser1()","36d90c2d":"Dillionworldcoin()","36d9377e":"GetAllNode()","36d938d8":"Transaction(uint256,uint256,address,uint256,uint8,uint256,uint256,bytes)","36d95f56":"MIN_FUNDING_GOAL()","36da1471":"crowdSaleCheck()","36da4468":"supplier()","36da5cd8":"atomToken()","36da9ec9":"roundTwoRate()","36dac2cc":"getMeta(uint256)","36dc1dd2":"createBSMHash(string)","36dc58f6":"total_SDCC_supply()","36dd20a7":"getJobWorker(uint256)","36dd58f2":"dispatch(address,uint256,string)","36de44e0":"GFC(uint256,string,string,uint8,address)","36df05bc":"wholesaleLeft()","36df99b6":"blackswanToken()","36dfe260":"payOneTimeReward()","36e0004a":"multiSig()","36e05d94":"fundariaShare()","36e0e824":"asset(uint256,bytes)","36e0f6cc":"allowSell()","36e4e8fd":"tulipToOwner(uint256)","36e4f915":"claimToken(bytes32,string,address)","36e520bc":"verifyAddresses(address[])","36e61cf7":"decTap(uint256)","36e685f5":"setCLevelAddresses(address,address,address,address)","36e6b92e":"taskProcessedWithCosting(uint256,uint256)","36e73918":"getRegionNextImageId(uint256)","36e9f43f":"SMRDistributionVault()","36ea76e2":"Hyperion()","36ea8189":"DetailsUpdated(bytes32,bytes32,uint256)","36ea8702":"makeMetaPublic(uint256,bool)","36eb3aa9":"LGBT()","36eb5b47":"getResoSCParams()","36ebc4dc":"__allocateTokens(address)","36eda23f":"setRST(address)","36edbe17":"createPlayer(address,uint256)","36ee1f2b":"SDTToken()","36ee46f5":"killAnimal(uint8,uint16)","36ee7773":"getBallotsStorage()","36ee83f9":"getOrderPriceTotal(uint256)","36ee8812":"updateReleasedBalance()","36eec28e":"allocated4Year()","36ef0cea":"createStartingColors()","36ef1abb":"disburseDividends()","36ef6c82":"addEmbassyOfCountry(address,uint256)","36ef80db":"getId(address,address)","36f00e8a":"setFeeFlat(uint256)","36f19b77":"getPurchasedBlockhash(uint256)","36f2393e":"changeTokenURIPrefix(string)","36f26095":"minimalCap()","36f2b803":"Oceans8RT()","36f3dc2d":"STAGE_FOUR_ETHRaised()","36f54767":"VitaminToken(uint256,string,string)","36f656d8":"assertEq(string,string,string)","36f66528":"EtherDelta(address,uint256,uint256)","36f78d77":"newGroup(address[],uint256,uint256)","36f7992b":"putOnSale(uint256,uint256)","36f7ab5e":"contactInformation()","36f7cd70":"setPricePerStake(uint256)","36f8edc2":"getPlayerShipBattleLossesById(uint64)","36f93a99":"cofoundersSupplyVestingStartDate()","36f9825f":"accountIndex(uint256)","36f9f49c":"etherandomSeed()","36faa509":"ssps(uint64)","36fbedd3":"existsAuditorFromMultiRequestAssignment(uint256,address)","36fc75ee":"setRegsitrarAddress(address)","36ff37f4":"UpdateEvent()","36ffa905":"getMyProposals()","370014f2":"sendFundHome()","370097ac":"donotUSBDappToken()","370099d4":"airSwap()","370158ea":"info()","37016a5f":"getAuctionStartedAt(uint256)","3701fada":"PFC()","370292eb":"clearApproval(address[16],address,uint256)","3702ab03":"buyBasicCards(uint256,uint256)","37033be6":"processReservationFundContribution(address,uint256,uint256)","37034853":"ownerHistoryCount()","3703d911":"createItem(string,uint256,uint256,address,uint32,string,uint32)","370419e5":"arm()","37048f8f":"_newValidatorSetCallable()","37049b06":"getTier(uint32,uint256)","3705f69e":"canRelease()","37072ec7":"getHealthCitizens(uint256)","37074dae":"receivedEther(address)","37077409":"_updatePurchasingState(address)","3707a967":"putForExchange(uint256)","3707cfc1":"update(uint256,uint256,address)","3707ed7e":"gettops(address)","37086c8e":"airdropWithLockup(address,address,uint256,bytes)","3708c99e":"openWhitelistEndTime()","370943e3":"ZionToken()","370b6939":"AdminSetDrawer(address)","370b8c90":"info(bytes)","370c6001":"abortTransaction()","370d4c6e":"setGameOn(bool)","370d62ad":"anyRateIsStale(bytes4[])","370e052b":"addPreSaleTokensMulti(address[],uint256[])","370e9161":"rollDice(uint256,uint256)","370ec1c5":"_fillOrder(address,uint256)","370f2827":"finishJackpot(uint256,uint256)","370f388e":"MegaCandy(address)","370fb47b":"triggerTime()","370fc812":"set_stopsell(bool)","370fed6e":"setProfile(string,string,string,uint32)","37110967":"eTokensToSend(address,uint256)","371115d1":"LamboToken(uint256,string,uint8,string)","3711d9fb":"saleDuration()","3711e829":"withdrawnAmountForSalePromotion()","37126b38":"getTime5(address)","3712880c":"changeTokenExchangeRate(uint256)","37128a12":"initBoostData()","371303c0":"inc()","3713513a":"TOKENO()","3713ab41":"WPXSold()","37142391":"GetPartManager(uint8,uint256)","3714ae13":"newTokenPrice()","3714e274":"mintAllBonuses()","3715ae53":"sendApprovedTokensToInvestor(address,uint256)","37164433":"withdrawConfirm(uint256,address)","3716b8b4":"DonatorSetBanner(string)","3716bd22":"showCertificationDetails(uint256)","3716ca33":"updateGenerationRatio(uint256)","3716f65d":"withdrawDthShop(address)","3717798b":"auctionStarted(string)","3717a7a7":"Omnic(string,string,uint256,uint256)","3717f34c":"divRemain(uint256,uint256)","37180750":"getTaskKeyAtIndex(uint256)","3718766b":"EventQuitBattle(address,uint256)","37189157":"checkWithdrawalAvailability(address,address)","3718a923":"canShelf(string)","3719427e":"acceptDividends(uint256,uint32)","371a4ea8":"getProposalById(uint32)","371aa158":"init(address[],uint256[])","371ab702":"getMicroModuleByIdPart2(uint256)","371be589":"getconfig()","371c7dba":"setAllowPriceUpdate(bool)","371db7af":"BlockPaymentSystem()","371dd5ed":"initRound()","371e8e27":"gameResultsLogged()","371ecfde":"_directTransfer(address,uint256)","371f468c":"GlobalSuperGameToken(uint256,string,string)","371fe247":"_checkHashAndTransferExecutorFee(bytes32,bytes,address,uint256,uint256)","37205d76":"isCrowdSaleSetup()","3720e5b6":"E_AuctionStarted(address,uint256,uint256)","3721ee15":"ownerAccessoryCollection(address,uint256)","372210d1":"addGenesis(address,bool)","3723100d":"mutiEthTransfer(address[],uint256[])","37235758":"currentEndsAt()","3723bc0e":"shareholders()","3723f149":"FOUNDATION_SHARE()","37247af5":"_recalculateAvailable(address)","3724fb24":"tradeSpreadInvert()","372500ab":"claimRewards()","37253e35":"defrostTokens(uint256,uint256)","37254184":"jvCoin()","3725814a":"getMaxAddresses()","37258302":"SubwooferToken()","37268dbb":"_internalExchange(address,bytes4,uint256,bytes4,address,bool)","37270069":"maxWeiRaised()","37270936":"commander()","37271cc7":"withdrawBid()","37273b86":"PRICE_STAGE_PRESALE()","3727ae2d":"AthTokenBase()","3728aa4c":"saleCapReached()","3728bec2":"getCharacter(uint32)","3728f1f7":"EthereumOne()","37292eeb":"AVAILABLE_COMPANY_SUPPLY()","3729847b":"processSalesForSingleBuyer(uint256,address)","372a2a36":"DigitalArtChain()","372a49bd":"mspController()","372c1aff":"getPublicKeys(uint256)","372c6533":"START_DATE()","372c66e3":"updateAsset(uint256,string,string,string,uint256,address)","372cb1d9":"CallCount()","372cd183":"addAdmin(address,bytes32,bool)","372cd7ad":"clearAuthOfPermission(address)","372cfcc3":"noteSaleLocked(address,uint256,uint256,uint256)","372d6b27":"getStatistics()","372e80c3":"FLIPPINESS()","372ea717":"test_oneInvalidEmptyAddress()","372ed8cc":"setOraclizeDelay(uint256)","372f6bfe":"_refererUpdate(address,address)","372f88b6":"ICC()","372fc8d3":"HTSupply()","372ff945":"isInPhase(uint256)","37305e2a":"withdrawFromCustody(uint256,address,address)","37306299":"BurnableToken()","3730bb40":"yxkTOKEN()","37321bd7":"callstoredaddress(address)","37323d19":"LuckyETH()","3732c86b":"doubleTransferWithBurn(address,address,uint256,uint256)","3732e153":"ETHPrice()","37334878":"SHORTADDRTOKEN()","37339506":"restrictedPercent()","3733b378":"transferStackAndCall(address,uint256,uint256,uint256,uint256,uint256,bytes32)","3733faba":"forceStopCycle()","3733ffca":"convertTo(uint256,string,string)","37354a68":"luckyNumberOfAddress(address)","3735ab75":"buyCastle(address)","3735d57d":"PRESALE_BONUS_LIMIT()","3736d853":"setAverageBlockTime(uint256)","37371bc5":"getRandomRouter()","37375a43":"createContractEditionForCollection(string,uint256,uint256)","37376ca8":"cancelProposal(bytes32)","37383c2d":"getEventStart()","3738aa19":"ReleaseFundsToInvestor()","3738eb8a":"GolfCoin()","37391ce2":"testUnescapedQuoteInString()","373a1bc3":"scheduleCall(address,bytes4)","373a3af8":"intersect(uint256[],uint256[])","373a7c01":"fundTotalSupply()","373ae230":"checkLimit(address,address,uint256)","373c1df9":"test_3_destoryTokensAccrossBlocks_increaseBlocksBy1000()","373c98a2":"authCall(address,bytes32)","373d46b0":"IPOI(uint256)","373dde4f":"countPurchasedPixels()","373e0c80":"setFreezeAccount(address,bool)","373e441c":"addUserRole(string)","373eef4b":"ABsCoins(address,uint256)","373f5ff0":"COLOR_GREY()","3740eee9":"SetFund(address)","37411dc3":"createRandomZombie_Ether()","3741b92b":"jrecover_y(uint256,uint256)","3741c90b":"setAuthorizedWithdrawalAmount(uint256)","3743f0bf":"teamReserveAllocation()","3746010d":"createPrizeFighter(uint16,uint256,uint8,uint8,uint8,uint8,address)","3746b446":"Predictor()","37472c4b":"setDepository(address)","3749ea8e":"contribute(address,address,uint256,uint256)","374abace":"contractstarttime()","374aed97":"getCells()","374b8cda":"getTrade(uint256,address,address)","374b94c8":"MEC()","374ba203":"get_hosp1(uint256,uint256,uint256)","374bb090":"isAddressSet(address,address)","374bfba7":"claimFreeReferralPack()","374e164c":"addVirusDef(address,uint256)","374e9aa1":"stageForBlock(uint256)","374f7b7e":"checkLoanStatus(address,uint256)","375023f2":"total0xbtcReceived()","3750e05a":"TOKENS_BOUGHT()","37516ead":"microTip()","375188dc":"nextTask()","3751e6bc":"get_last_global_audit_document()","37525ff0":"listItemFromRegistry(uint256)","37531b45":"StudentCoin()","37542d10":"addReferrer()","37548549":"setRecipientString(string,string)","37567d49":"maintenanceDeactivateUser(address)","3756b62b":"toB32(uint256,address)","3756bb45":"noOfTicketsOwned(address)","3756e207":"ExtremiumToken()","37574b3d":"TOKEN_FOR_TEAM()","37593f46":"queryN_fnc(uint256,string,bytes,uint256)","375a8131":"addStudent(string,bytes32,string)","375b3c0a":"minStake()","375b74c3":"custodian()","375c0117":"BurnTokens(address,uint256,bool)","375c21b0":"random(bytes32,uint32)","375c405d":"canIssueIndividual()","375c4627":"supplyPICO(address)","375c86dd":"m_pools()","375d6d90":"received_ethers(address)","375d9dc6":"isLimited(address,address,uint256)","375dce69":"getIssuable()","375e3ea8":"payoutForBudget(uint256,uint256)","375e88bd":"increaseBTCRaised(uint256)","375f2b96":"getCost(uint8)","375f3a9d":"PERC_TOKENS_TO_INVESTOR()","375f4498":"SetEditMode()","3760153c":"ETHero()","37603132":"RollLottery(uint64)","3760ceb0":"WAITTIMEUNTILWITHDRAWORTRANSFER()","37612672":"producer()","3761a3d6":"buyUcCoins()","3761d23f":"setFeeDistributionAndStatusThreshold(uint8,uint8,uint256)","3761dea8":"MarketPlace(address,address,uint256,uint256,address)","37621da0":"setMinChildCount(uint256)","3762346b":"externalPurchaseTokens(address,uint256,uint256)","37624204":"endPreIcoDate()","37629dda":"getArticleItem(uint256,uint256)","3762f0fe":"initMembers()","37632065":"claimUnderlying(address[2],uint256[7],uint8,bytes32[2])","37633f29":"TokensGate(uint256,uint256,uint256,address)","37638119":"getHouseEdgeAmount(uint256,uint256)","3763965f":"private_profits()","3763d4b4":"generalSaleEndDate()","3764cf3f":"NUMUS()","3764e2be":"setup(string,string,uint256,uint256)","37664643":"retractLatestRevision(bytes32)","376678e3":"BABYT()","37668a8b":"create(bytes32,address,bytes32,address,bytes32)","3766baba":"transferAllFromForcibly(address,address)","3767aec6":"handleTimedTransitions()","3767ea7e":"setTotalCapacity(uint256)","37680f18":"ERC20Standard(uint256,string,string)","37681083":"incrementReputation(uint256)","3768304c":"autoMint()","37689317":"generateLockedTokens(uint256)","3768bd09":"mulToFraction(uint256,uint256,uint256)","3769862f":"isAllowedUser(address,uint256,address)","376a4ce0":"setstring(uint256,string)","376b9c25":"depositProvider()","376c7374":"w_Bounty()","376d1555":"sendAuto(address)","376d567c":"setMod(address)","376db394":"setFreeze(address,uint256)","376ed9c6":"totalHedgelyWinnings()","376edf93":"getBidsByAdslot(uint256,uint256)","376ef9b8":"fromContractAddr()","376fc790":"fullTransfer(address)","376fc952":"setMaxReferrerBonusRequirement(uint256)","376fe102":"userId(address)","376ff7f0":"isRefundAllowed()","377002fb":"beArbitrator()","37714274":"FrancevsArgentina()","37717342":"breedOwn(uint256,uint256)","3771ab97":"payDividents()","37721ab7":"getDougName(string)","377272b3":"createValue(address,uint256)","3772c371":"getprize()","3773930e":"ConfigureFunction(address,uint256,uint16,uint16,uint16)","377481ca":"unlockedAddress()","3774e6f5":"starbaseMarketingCampaign()","37751b35":"doTransfer(address,address,uint256)","3777261d":"approvedFactories(address)","37775807":"buyerBalances(address,address,uint256,address)","3777f5d0":"tokensPerWeiBonus333()","3778e5b2":"groupInfo(uint32)","37790454":"PrintWinningInfo(bytes32,uint256,uint256)","3779a3b6":"saleRunning()","377a0f53":"bankAccount()","377ab651":"nextTurn(uint256,uint256[3],uint8[176])","377b2009":"isCanSell()","377b47a3":"logIn()","377c6a3e":"eth(uint256,uint256)","377d54ce":"assertOnlyParticipants(uint256)","377d78ce":"defineProjectWallet(address)","377dda1a":"NamiCrowdSale(address,address,address)","37800bde":"calculateTransferFee(uint256)","37806f07":"galleryOne()","3781afbc":"_isCorrectFullBuyin(uint256)","3781d882":"setRate347()","3781e576":"isOperatorForTranche(bytes32,address,address)","37820c57":"bulkMint(address,string,uint256)","378252f2":"closeAuction()","37828c52":"OTHER_STAKE()","3782cae2":"set_max_contribution(uint256)","37831b97":"payReward(address,address,uint256,uint256)","37848b6b":"getOwnedShipCount(address)","3784f000":"setEndDate(uint256)","378525bd":"bestAngel()","378544df":"timeAfterSoftCap()","378652d2":"MultiTransper(address[],uint256)","3787a30a":"ownerWithdrawEth(address)","3787b748":"WalletChange(address)","3788036f":"isAgreementSigned(bytes32)","37881299":"getCompare()","37881810":"setCallbackAddress(address)","3788e371":"BaldcoinCore(string,string,uint8,uint64,uint64,uint16,uint256,address[])","37890f94":"maliceReported(address)","378a2178":"tallyVotes()","378aa701":"getCurrentState()","378afddb":"withdrawMYB()","378b6a89":"canContribute(address,uint256)","378bc89d":"findAddress(bytes32,bytes32)","378c0605":"buyTickets(address)","378c4c1c":"computeMerkleRoot(bytes,bytes)","378c7cd9":"logCheck(uint256,string,uint256)","378c93ad":"setClaimable(bool)","378ca888":"setMaxFinalizationTime(uint256)","378cdb62":"proxyList(uint256)","378dc3dc":"initialSupply()","378e061e":"inactive_payable()","378e0fc1":"checkKwhDeployerAddress()","378e25f2":"withdraw_2Completed()","378ebf93":"setTokenToEtherAllowed(bool)","378efa37":"divider()","37900d5a":"issuedFromOtherCurrencies()","3790613f":"minChildCount()","379080da":"PRICE_MULTIPLIER_PREICO1()","379119af":"SJT()","3791759c":"migrateFeesDueToFork()","3791792a":"mintPack(uint256,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)","37918bcb":"declareMvpLaunched(uint256)","3792a018":"left8(uint256)","3792a865":"MacroTokenContract()","3792e117":"GaiaToken()","37930615":"extend(bytes16[],uint64)","3793c1e8":"get_num_of_uses(address,address)","3793ccb3":"isPlayerOnBoard(uint256,address)","37941589":"test123token(uint256,string,string)","3795ad25":"lockStartDate()","379607f5":"claim(uint256)","37960cd5":"publicKeySize()","379698c1":"calculatePie()","37970dbe":"shouldAirdrop()","379725ee":"queryName()","3797528e":"IllusionDust()","3797b4de":"forwardRemaining()","37981c32":"pre_maxGoal()","37983aed":"getMyCards(address)","37986d2b":"freezeAndConfiscate(address)","37989eb6":"setOwnerBurner(address)","379930f7":"WHEEL_SIZE()","379986d9":"executeBurnProposal(uint256)","379995c3":"getDealerAndLuckyInfo(uint256)","3799bbd3":"privatePresaleAllocatingToken()","3799c5eb":"test_insert_findWithHintPrevRemovedUpdateHead()","379abed8":"ANPlaceholder(address,address)","379b7589":"signedTransfer(address,address,uint256,uint256,uint256,bytes32,address)","379ba1d9":"setTradingStatus(bool)","379ba2ab":"exchangeForQIU()","379ba3b7":"currSaleActive()","379c1bd9":"createHorseShoe4(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","379c5131":"getByOwner(address)","379c5d3f":"ModuleToken(uint256)","379c8f6c":"_keepLastTransaction()","379ca09e":"priceStep5()","379dbdeb":"accessAllowance(address,address)","379e00d4":"maxTextLength()","379e2919":"setDevFeePercent(uint256)","379e9957":"fiveMatchPayoutInPercent()","379f946a":"initGeneralAttr(uint32,uint64)","379fed9a":"isMasterOfCeremonyRemoved()","37a0b958":"DATAToken()","37a14b52":"changeICODates(uint256,uint256,uint256)","37a1c540":"founder1Wallet()","37a1c84f":"registerNameResolver(string,address)","37a2890d":"eraByIndex(uint256)","37a28979":"setSettings(uint256,uint256)","37a30d3b":"current_price_atto_tokens_per_wei()","37a31079":"pointsLimit()","37a31895":"withdrawSelect(address)","37a366d8":"loggedBalances(address,uint256)","37a38bb1":"StateChanged(uint8,uint256,string)","37a3931f":"invalidate(address)","37a47106":"create(uint256,bytes32,uint256,uint256,uint256)","37a58bb4":"KudosPollFactory()","37a59139":"estimate(string)","37a5ae1f":"withdrawSingleBucket(address,uint256,uint256,uint256)","37a5fbab":"SaleStart()","37a66d85":"setPaused()","37a6b9f8":"recordCallback(address,uint256,bytes,bytes)","37a6d42b":"participant()","37a7095b":"LeviathanToken()","37a74f7e":"p_update_currentPlotEmpireScore(uint256)","37a7983b":"changeminContribAmount(uint256)","37a7b7d8":"feed()","37a7f2b7":"MIN()","37a87dfa":"updateList(address,address,bool)","37a91776":"OSATOKEN()","37a920f1":"Universe()","37aa1689":"getIcoDiscount()","37aa7f91":"isAuthorisedMaker(address)","37ab8f20":"notifyPlayer(uint256,uint256,uint256,uint256)","37ab9dcf":"getCPFee()","37ac8236":"getPunchCardsOf(address)","37ac9153":"Retrieve(string,address)","37adf3a3":"hasRefBonus()","37ae31c7":"DemSinhVienRequests()","37ae43a3":"BetOnHashV81()","37af5c32":"ANYtoken()","37aff76d":"getSystemAvaliableState()","37b0574a":"isClassic()","37b0786a":"icoInvestmentWei(address,uint256)","37b0ac71":"confirmTeamWithdrawal()","37b0f257":"setConfirmAddr(address)","37b34974":"reverse(bytes32)","37b475d4":"SOFT_CAPACITY()","37b4d863":"maxbet()","37b4f299":"IMTERC20()","37b54140":"buyTokensForAddress(address)","37b5dce4":"PDP()","37b6efeb":"engraveDefault(bytes32,string,string)","37b7bf11":"Tile(int256,int256)","37b89705":"getAgilityValue(uint256)","37b8cade":"raisedEthAmt()","37b8db1a":"executeVerdict(uint256,bool)","37b9756b":"totalIssuanceDebt_limitedSum()","37ba1b4d":"Fpgcchain(uint256,string,string)","37ba682d":"END_TIME()","37bb223e":"CUC()","37bb25bc":"withdrawalLimit(address)","37bd0d28":"howManyFucksGiven(uint256,bool)","37bd1868":"setHatchedEgg(uint64,uint64)","37bd78a0":"secondsTimeLocked()","37bdc146":"weiFounded()","37bdc99b":"release(uint256)","37be04b4":"EZStandardToken(uint256,string,uint8,string)","37be827d":"Sum()","37c08923":"totalContributions()","37c0a5ef":"Finished(uint256,uint8,uint8,uint8,uint8,uint8)","37c30a98":"round_()","37c345cd":"specialManagerAddressMap(address)","37c35157":"updateTerm(uint256)","37c390e3":"allow_move(uint16)","37c3d50d":"buyAlt(address,uint256,string)","37c43088":"hashesSize()","37c44802":"initMonsterClassConfig()","37c57718":"ListingBought(bytes32,address,uint256,uint256,uint256,address)","37c62ed6":"createUnicornPriceInCandy()","37c6fcba":"LandlordTerminate(uint256,string)","37c74948":"getPropertyPrivateMode(uint16)","37c75992":"mintingIsFinished()","37c8d21f":"echo(string,string)","37c8f1d1":"AIgathaToken(address,uint256,uint256,uint256,uint256,uint256)","37caa8b6":"getTop(uint256)","37cb3c86":"distributeSlotBuy(address,uint256,uint256)","37cc7761":"contractReservedBalance()","37cc7cc0":"bannedCycles(uint256)","37ceb05b":"getFixtures()","37cef791":"getRate(address)","37d004b3":"bulkRelayCMCT(address[],uint256[],bytes32)","37d0208c":"bribe()","37d044cd":"tokenCreationPreSaleCap()","37d05434":"getCurrentRoundIssued()","37d1eb35":"setOffChainManagerAddress(address)","37d2649a":"Ownedfunction()","37d2d350":"setBOPSAddress(address)","37d33438":"totalHedgelyInvested()","37d3433f":"calculateAmountBoughtPreICO(uint256)","37d35507":"tokenCreationMinConversion()","37d365de":"admin_set_shopStoreRegister(address,address)","37d3ec7a":"ZBillionaire()","37d45088":"transferAllowed_(uint256,address,address,uint256)","37d48628":"totalSaleCapUnits()","37d4fc84":"Alpha()","37d76636":"item(uint256,uint256,bytes)","37d876b6":"GVTTeamAllocator()","37d9d7fc":"getBytes32(bytes32,bytes32)","37d9ffd1":"registerClient(address,uint32,uint256)","37da8058":"in_top_n(uint256,uint256)","37daa09e":"getUpCount()","37dac676":"getPOOL_edit_8()","37daf0ed":"getETHBalanceInfo()","37db0703":"isClean(string)","37db12c4":"PausePayment()","37dbbac4":"deleteMyEntity(uint256)","37dc414b":"balanceOfTarget(address)","37dc4b14":"setSpeedBump(bool)","37dd186b":"removePermission(address,string)","37dd5dd6":"poicoin()","37dda1ae":"setTktPrice(uint256)","37de1334":"rand16(uint256,uint16,uint16)","37de84d0":"createGame(string,string,bytes32[],string,uint256,uint256,uint256,uint256,uint256)","37df00c9":"receiveToken(uint256)","37df4828":"buy_planet()","37df6c03":"setAccountC(address)","37dfc70c":"getInvitationMultiple()","37e05590":"setKYCManager(address)","37e0e290":"numTokensSold()","37e12ab7":"checkGoalReach(uint256)","37e15240":"addRecord(uint256)","37e16f40":"currentAfterIcoPeriod()","37e246ad":"isOnAuction(uint256)","37e29e93":"BlueHillMining()","37e50f39":"awardPrizes()","37e531c0":"fechVoteNumForCandidate(address,uint256)","37e582b9":"LogRefundsEnabled(address)","37e58bd8":"GlowEther()","37e6b280":"verifyCommit(uint256,uint256,uint8,bytes32,bytes32)","37e6e03b":"setMultisigPre(address)","37e7a739":"Token3G()","37e822b8":"addRank(uint256,uint256,uint256,string)","37e87c7d":"OwnerManage(uint256,uint256,uint256,uint256)","37e8c09e":"getBet(bytes32)","37e922d7":"TERMS_AND_CONDITION()","37e94529":"setHardCapDividends(uint256)","37e94853":"TakerBoughtAsset(address,uint256,uint256,uint256)","37e9af0c":"IsAdmin(address,address)","37e9ebb5":"getExists(bytes32[])","37ea010a":"transferWithRef(address,uint256,uint256)","37ea1f63":"getWithdrawalCounter()","37eb6f91":"LiquidSwapToken()","37ebd0e0":"whitelist(address,uint256,uint32)","37ec33b7":"startDateOfUseTeamTokens()","37ec757f":"getStrFromId(uint256)","37ed2bef":"tokensToLock()","37ed89b2":"BitcoinPro()","37ede426":"WhaleWater()","37ee1837":"isCrowdSaleRunning()","37ee3edb":"buyTokensWithReferrer(address)","37efa397":"cryptoRomeWallet()","37f03888":"panicButton(bool)","37f0fa43":"PricingDay(uint256)","37f1353f":"PayPoolEntranceFee(string)","37f13fd6":"prova2()","37f1a470":"appoint(address)","37f1e7f2":"getPrice(uint8)","37f26746":"Remainder(uint256)","37f2beed":"getProposalVoterList(uint256)","37f2eaf6":"addTransaction(address,uint256,bytes,bytes)","37f33bd5":"EvenCoin()","37f344ff":"WhitelistedEarlyParticipant(address,bool)","37f3cb24":"testInitialBalanceUsingDeployedContract()","37f42841":"queryBalance(address)","37f4494b":"castLine(uint16,uint16,bytes32)","37f46e7e":"mintTokensByETH(address,uint256)","37f4c00e":"anchorGasPrice()","37f4dfea":"unsafeWriteBytes(uint256,bytes)","37f50f57":"wishes()","37f50f5b":"leggiFrase(uint256)","37f531ea":"_addHolding(bytes12)","37f534b6":"Blocform(address)","37f57d05":"StarterTokenBase()","37f7151b":"MTPToken()","37f7c4d4":"pow2()","37f80a58":"INVESTMENT_CAP_ICO_PHASE_ONE_POUNDS()","37f83291":"monuments(uint256)","37f86dce":"giveupBid(uint256)","37f9034d":"getAnimal(uint32)","37f944cc":"raiseBy()","37fa33fe":"EVATOKEN()","37fb217a":"valueForTranches(uint256)","37fb7e21":"distributionAddress()","37fbd30f":"etherHolder()","37fbec96":"totalTaxed()","37fc55bf":"give(string,uint256,string)","37fc91e3":"balanceWosPoolToTeam()","37fcb747":"TestERC20Token()","37fcb779":"sendAllFeesToAddress(address)","37fd25c7":"balanceOf(address[],address)","37fd6128":"tokenRate15()","37fd686f":"balanceOf(string,address,address)","37ff2506":"PRESALE_CONTRACT()","37ff65da":"Bugis_Crowdsale()","3800a119":"closeGateway()","3800d0a3":"get_proposal_count()","38014395":"originalAuction()","3801cde7":"Foodiecoin()","3801e6b6":"Cloud(uint256,uint256,string,string,address)","3802a4a2":"getEthDealRange()","3802d3ef":"totalTokensEmitted()","38039479":"setCandidate(uint256,string,string)","3803b7d3":"readAddressList(address,uint256,uint256)","3803f80e":"cancelCall(bytes32,address)","3804482a":"setMaxDistributions(uint256)","3804ab8d":"getTokensOnAuction()","3804c73d":"gameStartBlock()","380547c0":"addCompany(string,address,uint256,bool)","3806153e":"tier2()","3806422a":"stagesCount()","38075446":"shouldStopCoinSelling()","3807aabd":"generate(address,uint256)","3807ba1b":"poi()","380862b2":"getSynthesizeApproved(uint256)","3808ac11":"DXN()","38095a4a":"fccController()","3809b240":"settlementContract(uint64)","3809c0bf":"doInfinite()","380b5450":"getPrecomputedEToThe(uint256)","380ba30c":"confirmPrint(bytes32)","380bbf78":"getTokenIdOfAddressAndIndex(address,address,uint256)","380bf002":"mintCountByTemplate(uint256)","380c686d":"setTokenPriceByOwner(uint256,uint256)","380c7a67":"authenticate()","380d831b":"endSale()","380e5e44":"makeProposal(string,string,uint256)","380e809e":"batchTransferFromMany(address[],address,uint256[])","380f3087":"addHashes(uint256)","380f3771":"viewRand()","3811264a":"ErrorLog(address,string)","38116187":"buySpike()","38118614":"sigTeamAndAdvisersEDUSupply()","3812783e":"getDeployedEvents()","38131bc5":"redeemOrSellCoinsToICO(uint256,uint256)","38132838":"setProviderSupply(uint256,uint256)","3813a7f2":"getWineIdentifierAt(address,uint256)","3813be76":"currentGameBalance()","3814253f":"grantFoundersTokens(address)","3814a7a3":"CardsBase()","3814b764":"setBridgeWidth(uint256)","381501e6":"SwapManager()","38151862":"SHSToken()","38151930":"isTokensPreIcoDistributed()","38158549":"NENCToken(uint256)","3815c742":"Koyo()","38164d41":"SGDsToken()","381656e2":"declineAll()","3816d4ee":"iICO()","381731be":"approveAndCall(address,uint256,uint256,bytes)","38178fbe":"addString(string,string)","3817ffda":"_limitedTotalIssuingCollateral(uint256)","3818657b":"isActiveFreelancer(address,address)","3818d907":"addPrecommitment(address,uint256)","38194aab":"_addNewCompanyTraders(uint256)","38198c65":"totalEtherGooResearchPool()","3819986e":"createNewPoll(string,uint256,uint256,uint256)","3819ea68":"SimpleMarket()","381a0161":"TRONIXGOLD()","381a730e":"withdraw_3()","381abeb5":"RonaldoChain()","381ae69a":"createReferee(address,address)","381c215f":"SEXYCOIN()","381cec91":"isVestingStarted()","381d5441":"roger()","381db641":"distributeTokenAndLock(address,uint256,uint256)","381ee645":"lastBlock_v0()","381f4b9e":"RRROToken()","381fe9ca":"DgxDemurrageCalculator(address,address,address,address)","38200801":"getExtensionPublication(string)","3820a686":"canBurn(address)","3821891e":"requestRegistration(string,address)","38218aa1":"getBettorInfo(uint256,uint256,address)","38219832":"spendEther(address,uint256)","38222858":"setThrowOnIncompatibleContract(bool)","3822de0f":"kvtToken()","38235781":"checkICO()","382396ee":"getGameStatus()","3823d66c":"withdrawn(bytes32)","3823df95":"testPop()","38241c16":"setKYC(address[],address[])","3824d8ee":"buy100DaoFor1Eth()","3824ea31":"getHighScore()","38266b22":"getData(address)","3827d0bf":"_createDank(string,address,uint256)","38280e6b":"setTokenDistributor(address)","38284f36":"release(uint256,uint256,uint256,uint8[],uint256,uint256,uint256,string,string)","38285534":"gameDeveloperSupply()","3828b522":"serviceApprovedBy(address,address)","3828becc":"setBountyAmount(uint256)","3829111f":"BuyNowEvent(address,address,uint256,uint256)","382964a5":"withdrawForTeam(address)","38299afd":"recommendPaused()","3829dd22":"tokensForOneEth()","382b6f69":"test_oneInvalidEqBytes()","382c52cd":"transferableTokens(address,uint256,uint256)","382cbc79":"userDelete(address)","382cf0a6":"gamesPlayed(uint256)","382d39bb":"planCount()","382d606b":"CROSAIR_VOUCHER_PRICE()","382db937":"finishContributionPeriod(uint256)","382df05d":"getInvestmentByAddress(address)","382e5272":"addGameRecord(address,uint256,uint256,uint256,uint256)","382ef945":"Contributed(address,uint256,uint256,uint256,uint256,uint256)","382f431b":"open(bytes)","382f8411":"_createPassport(address)","382faa6a":"cancelToken(uint256)","382fc09f":"CoinVilaStart()","382fd819":"kyc(address,address)","38300f19":"setCAORatio(uint256[])","38302989":"getUsernameForAddress(address)","3830901a":"assignImmortalsToBattle(uint256)","3830ceeb":"totalriskcoinsSupplys()","38310f49":"weiMinimumAmount()","3831a8d5":"BurgerKapija()","3832677d":"partsMinted()","38331353":"MoreAI()","38350541":"_ownerOf(uint256)","38353104":"setBlockDotTimestamp(uint256)","38360ed8":"balance(bytes32,string)","3836a6d2":"setKYCLevelsBulk(address[],uint8[])","3836d3f4":"JapanvsPoland()","3836fe6e":"addPermittedContract(address)","38376154":"setGasForOraclize(uint256)","3837e9bd":"getGooCostForUnit(uint256,uint256,uint256)","3838a099":"aboutItem(uint256)","383a194c":"buyUnicornWithEth(uint256)","383bb22a":"setMinorEditsAddr(address)","383cf18f":"getGovtApplicationsCount(string)","383e3a5d":"buyPriceAt(uint256)","383e4b27":"submitRing(address[4][],address,uint256[6][],uint256,uint8[1][],uint8,bool[],uint8[],bytes32[],bytes32[],address,uint16)","383e9a3a":"claimTokensFromTokenDistrict0xNetworkToken(address)","383eea0e":"transferDevship(address)","383f61b3":"refundPlayersInRoom(uint256)","383fcd3a":"getLastPlayDateTime(address,address)","383fe467":"transferTokenOwnership(address,address)","383fe6d3":"setCentsPerMonth(uint256)","3840369b":"triggerEvent(int256)","3840d63d":"unknownReserved()","38416341":"getbetData(uint8,int8,address)","38419800":"taylorToken()","38421476":"changePaused(bool)","3842c57c":"petCollection(uint256)","38436c60":"transferEgg(uint256,address)","38439bb6":"update_tree()","3844426c":"EST(uint256,string,string)","3844e1c4":"getClientBalance(address)","38453f29":"registerCat(uint256,uint256,uint256,uint256,uint256,uint256)","384711cc":"vestedAmount(address)","38471dd6":"athenians()","3847807a":"stopGamGetToken()","38478ae7":"setMinterContract(address)","38495d66":"updateVault(uint256)","3849794f":"setDataSourceAddress(address,address)","384a6494":"setStartPreSale(uint256)","384af0de":"setMinimumprice(uint256)","384b1393":"follow(uint256)","384b93f2":"pullTheLever()","384baa8a":"round1StartTime()","384bb70b":"getData_17()","384bfacb":"cofounderIndices(address)","384c3335":"requiredToAddress()","384c440b":"DISTRIBUTION_TEAM()","384c4d2f":"reserveFeesInBps(address)","384d0b12":"claimByProof(bytes32[],bytes32[],uint256)","384db9fc":"WithdrawEther(uint256)","384ddc32":"JM_ETH_ExchangeRate()","384e04c9":"setarg_2(uint256)","384e2bf5":"MNLTOKEN()","384e5018":"etherandomCallbackAddress()","384f58eb":"contract_owner()","384fae3b":"hashDataStream(address,string,bytes32)","38503f55":"AdjustDifficulty(uint256)","38516064":"getFeePool()","3852c53f":"battlesTillBattleCooldown()","3853682c":"Try(string)","38536878":"getOwed(address,address)","3854bc2e":"setUSD(uint256)","3855323f":"updateKey(address,uint256,address,address)","38556c3a":"contract8function2()","38557648":"executeSellOrder(address)","3855b3dc":"GetEscrowNotifierAddress()","3855cf0e":"Proxyable(address)","3855dcd6":"getContrarians_by_index(uint256)","3855f32e":"keysRec(uint256)","385794c4":"MAGENDAVID()","38597911":"appendKeyValue(string,uint256)","3859d609":"raccoltaMessaggi()","385ab2d7":"allowSelling()","385ae665":"getNumberOfAnnotations(address)","385af1c3":"setChainPrev(address)","385c0ecf":"whitelistMaxWei(uint256,address)","385cd083":"tgeActive()","385d8590":"Committed(address)","385df389":"tokenURIEdition(uint256)","385e27ed":"testSubtract()","385e9e2e":"MintNFT(address)","385fae43":"setBetclose(uint256)","385fb8a6":"STAGE_3_MAXCAP()","385fbe24":"ListingContractEntity()","385fea5c":"countCliManagers()","38613690":"agentAddress()","38616105":"LogDestroy(uint256)","3861ee08":"EventBuyCar(address,uint32,uint32)","3862822d":"buyHo(uint256)","3862e6ee":"getEvaluationCountByRecorderID(uint32)","3862ea9d":"lockedBitmask()","386304e4":"receiveFromGame()","38634337":"CrowdsaleToken(uint256,uint8,address,address)","386381db":"fundariaTokenAddress()","38644538":"setAdditionPrice(uint256)","38649b2a":"isConstructedOwned()","3865bf3a":"joinNetwork(address[6])","3866ecdd":"forceWithdrawToken(address)","38670cb4":"founders_address()","386741fa":"onSubNew(uint256,uint256)","386762fb":"withdrawSnowflakeBalanceFromVia(string,address,address,uint256,bytes,bytes)","386892d8":"endICOStage3()","38689772":"FixBet16()","38692ca6":"setRegistrationPeriod(uint8)","3869416b":"getDisputeStartTime()","3869eaff":"USEaddress()","3869ffd0":"newIteration()","386a646e":"QDToken()","386b5fe7":"aelfDevMultisig()","386c5a74":"LogFeeTopUp(uint256)","386c69f2":"setCanBurn(bool)","386ca47e":"minCompanyValue()","386dd46e":"BTK()","386e0d75":"setPopName(uint256,string)","386e2b29":"registHnsBatch(bytes32[],address[])","386e3441":"tokensIssuedPrivate()","386e69dc":"nextRoundStartsAt()","386ee512":"Crowdsale(uint256,uint256,uint256)","386f36f3":"Deployed(uint256,uint256,uint32)","386fcda8":"testCreateCostToken()","387008c2":"updateStatus(uint256,bool)","3871b694":"LogSell(address,uint256,uint256,uint256)","3871bdd7":"depositPresaleWithBonus(address,uint256,uint256,uint256)","38721fa4":"getOperationCost(uint256)","3872b3ec":"setCoolDungeon(uint32)","387349fc":"numberOfTokensToAvail50PercentDiscount()","38734c33":"OnContribution(address,bool,uint256,uint256,uint256)","3873eeb8":"approveForBurn(address,uint256)","38742685":"pegglebot()","38743904":"moderator()","38752e58":"batchApprove(uint256[],address)","38756a89":"getLevelsCount()","38759ce9":"getFhMoney(uint256,uint256,uint256,uint256)","38760f13":"NewAccreditedInvestor(address,address)","387621fb":"cleanupDelay()","3876c137":"FRAC_TOP()","3876df0e":"ProjectWithBonds(string,uint256,uint256)","3876e05e":"appWallet()","3876e6d3":"securityTokenVersion()","3876f81d":"getPeriodBounus()","38771242":"completedAt()","387787ed":"setProperty(address,bytes32,bytes32)","38785014":"lastBlock_f4Hash_uint256()","3878f423":"remainingInvocations()","3879aa23":"firstCheckpoint()","3879c9f3":"teamCliff()","387a54d9":"callInternalTransfer(address,address,uint256)","387a76ce":"tokenChanger()","387b6c2f":"OwnedResolver()","387be94f":"minimumAmountRequired()","387bef56":"nodeAllocation()","387c0cb4":"hashRegistrar()","387d3821":"increaseMarketValue(uint256,uint256)","387d49d4":"setBountyBeneficiariesCount(uint256)","387da66c":"MCoinToken()","387dd9e9":"slots(uint256)","387e01fd":"ITO_TOKENS_PERCENT()","387e7bb4":"SingularityTest4()","387eaedb":"jypcBonus()","387ed59b":"hardCapTxWei()","387f4172":"GorillaSale(uint256,uint256,uint256,address)","388085be":"module(address)","38811792":"disallowWrite(uint256,uint256)","38812e58":"setStartTime(uint64)","38813ee0":"allEther()","3882f333":"partnerSaleTokenValue()","3882f742":"exitStake()","3883aee2":"checkGoalsReached()","388415e5":"Exchange(address,uint256,address,uint256,uint256,address)","38848911":"AmountRaised(address,uint256)","3884d635":"airdrop()","3884f307":"withdrawTo(address,uint256,address,bytes)","38856ecb":"assertEq5(bytes5,bytes5,bytes32)","38857786":"presaledeadline()","3885ce81":"avgEtherBetValue()","3885fd3d":"sendEther(address,address,uint256)","3886b116":"chkConsul(address,uint256,bytes32)","3886c957":"tokenLedger()","38874945":"developersWallet()","388777f1":"setlimits(bytes32,uint32[],uint32[],uint8[])","38879da8":"Transfer(address,address,uint256,uint256,uint256,uint256)","3887abb7":"checkPeriod()","3888188d":"releaseLockFoundation()","3888624b":"trueOrFalse()","3888dca0":"q_test(string)","388911dc":"sudoEnabled()","3889c8dc":"Payiza()","388a1526":"defaultTreesPower()","388a74ab":"validPurchaseSize(address)","388aef5c":"WAIT_TIME()","388b5786":"econReserveTimeLock()","388b9f37":"LogTokenDistribution(address,uint256)","388ba4b5":"COIN_SUPPLY_MKT_TOTAL()","388e28f9":"stop_all()","388f2c39":"recover(bytes32,bytes32,bytes32,uint8)","388f3cd3":"cashin(address,uint256)","388f58cd":"addMarket(bytes6)","388fb0af":"reservedTokensPercent()","388fe911":"new_tablet_created(address,bytes32,address)","38905bea":"lulaToken()","38906dbd":"Token(uint8,uint256,string,string)","38909b68":"getBonusUnlockAt()","3890d77f":"esopState()","3891c320":"vote(int256)","3892be14":"payoutPreviousRoll()","3893966d":"distribute(address[],uint256[],uint8)","389435e8":"calculateTotalWithdrawableAmount(address)","389439bb":"OwnerSigneture(address[])","389441b2":"getvaluejoinlist_even(uint256)","38948c53":"finalizeable()","3894ca57":"catOwners(bytes5)","3894e516":"generateToken(string,uint256)","38953534":"BTCEX()","3895f466":"buyoutWithData(uint256,string,string,string,string)","38960027":"aliveSince()","38969d64":"changeZipper(address)","389755a7":"setDefaultTransferRate(uint16)","3898ee61":"generateTicketData(uint256,uint8,uint8)","3899ad41":"unlockSecondary()","389aa67c":"addOrder(string,address,uint256,uint256,string,address)","389ab31c":"networkDevelopmentWallet()","389ae4d1":"foundersKey()","389b5bd2":"CryptobullsCoin()","389b7533":"extendDeadline(uint256)","389b75d6":"resetPool(uint32)","389cabee":"ceoWallet()","389cd1ae":"setGasPrice(uint256,uint256,uint256)","389d9636":"buyDiamond(uint256)","389db4f1":"_adjustDifficulty()","389e40d2":"PACOIN(uint256,string,string)","389e4839":"setState(bytes32,bytes32)","389eb9f9":"withdrawalTime()","389ece2f":"changeTelephoneOwner(address)","389f0846":"balanceUpdate(address,address,int256)","38a003e0":"getOrderAddressesForDay(uint256)","38a0615f":"TabooToken()","38a0fc9a":"registerPool(string,uint256,uint256,uint256,uint256)","38a0fdde":"setSnapshot()","38a1187d":"calculateEthAmount(address,uint256,uint256,uint256)","38a18cbe":"createTradeContract(address,uint256,uint256,uint256)","38a211b7":"lockTopLevelDomainOwnershipTransfers()","38a21db8":"create(bytes32,bytes32[3],bytes32,bytes32)","38a2cd0f":"setData_3(string)","38a2fb4f":"TransferBaseContract(address)","38a326e4":"activatedSalesTotalCount()","38a332eb":"EndGame(address,uint8,uint256)","38a4045e":"despoit(uint256)","38a4ba0b":"getAdPriceHalfDay()","38a52fb1":"setEthPlan(address,uint256,uint256,bool)","38a57d0c":"buildShip(uint16,uint16,uint8,bytes32)","38a5e016":"acceptTokenOwnership()","38a699a4":"exists(bytes32)","38a6e813":"updateAllowedAddressesList(address,bool)","38a74bbf":"endGameInternal()","38a7543e":"issuers(address)","38a8a0ca":"DeadCow(address,uint256)","38a964d6":"getFeeValue(address)","38a9a6f8":"bonusPreset()","38a9f25a":"PlayerLab()","38aa156c":"getKeccak256Address(address,address)","38ab0287":"nextMintPossibleTime()","38ab8ef4":"RelentlessConscienceToken()","38abdf41":"CraigGrantShrimper()","38af3eed":"beneficiary()","38af4eff":"tokenCents()","38b025b2":"parseInt16Char(string)","38b09889":"VictorieumNewToken()","38b0ea85":"startRedemption(uint256)","38b15dab":"setMyTokenBalance(address,uint256)","38b3e983":"Better(uint256,uint256,uint256)","38b52627":"supportsInterfaces(address,bytes4[])","38b5491b":"getInvestmentProposal(uint256)","38b56ead":"setURIToken(string)","38b59359":"ChangeEthPrice(uint256)","38b59be6":"addPercents(uint256,uint256)","38b5e0fe":"numElementsEven()","38b6e407":"endGrantAuthentication(address)","38b7a530":"addToAvgRating(address,address,string,string,uint8)","38b88052":"staleTime()","38b90333":"CONTRACT_VERSION()","38b93440":"replaceModule(string,address,bool)","38b9499b":"circulationStartTime()","38b9d61e":"bonusLimit4()","38b9ef9c":"betWithRound(uint256,bytes32)","38bb3977":"JuventusvsRealMadrid()","38bbbceb":"test_failed_payment_nonthrowing_token()","38bbfa50":"__callback(bytes32,string,bytes)","38bbfc51":"FCOIN1050Token(uint256,string,string,uint256)","38bc01b5":"getAddresses(bytes32[])","38bc1b96":"_airdrop(address,uint256)","38bcdc1c":"getURL()","38bd44f3":"createSDCC(address,address,uint256)","38bd8357":"next_week_timestamp()","38bde636":"GoodBoyPoints()","38be706d":"__callback(uint256)","38beb446":"PlayerToken()","38beb67f":"getCertificateHash(address,address,uint256)","38bef35c":"CFCdistrubution()","38bf77c3":"setFeesPerTenThousand(uint256)","38c0ac5f":"signer2()","38c1b824":"transferBookKeeping(address,address)","38c20499":"accMinterTwo()","38c33862":"wineries(bytes32,uint256)","38c3d4ed":"PORNCASH()","38c4090b":"getMarketOrderValue(uint256)","38c4d4a6":"pairTransfer(address,uint256)","38c59de9":"getNumberInvestors()","38c5a3dc":"changeRealUnicornAddress(address)","38c67b73":"setCurrentStage(uint256)","38c68f8f":"right84(uint256)","38c72883":"DealFullyFunded(uint256)","38c73f9f":"by(bytes32,uint256)","38c7db75":"getUnredeemedBalance(address,address)","38c80857":"unlock1Y()","38c80fc3":"getWhitelistStatus(uint256,address)","38c8e611":"getPreorderInfo()","38c8ec85":"convert1(string,string)","38c9027a":"calc(uint256)","38c92ef0":"propose(bytes,address,string)","38c97949":"StandardGame()","38c9dbf3":"TEAM_STAKE()","38ca59cf":"createTargetedValentineRequest(string,string,string,address)","38ca60a2":"IBST()","38ca683b":"MARKTY()","38ca830c":"updateWhiteList(bool)","38caa2c6":"MaxCapReached(uint256)","38cb252f":"getBonusPercent()","38cb583d":"checkAndUpdateTokenForManual(uint256)","38cc17ee":"setGameState(bool)","38cc4831":"getAddress()","38cc639d":"_setUserAttribution(bytes32,address,uint256)","38cd2c1a":"TransferSellAgentSiteRegMulti(address[],uint256)","38cdaab1":"changeICOState(bool,bool)","38cde380":"changeWeight(uint256)","38ce1df8":"sideServicesCount()","38ce4d51":"canRedeemUTXO(bytes20,uint256,bytes32[])","38ce61b2":"transferAndFreeze(address,string,address,address,uint256,uint256,uint256)","38ceaf1b":"LicenseManager(address,string)","38cef1ab":"ESCBCoinPlaceholder(address,address)","38cf2087":"parametersAreSet()","38cf22e3":"getHoldingsSupply()","38d084b5":"address4a()","38d0e36f":"SBSEducationToken()","38d16011":"verifyKYC(address)","38d1ed57":"getTotalFeesDistributedCount()","38d28d4c":"setTicketCountMax(uint256)","38d28de3":"getGoldInfoWeight(address)","38d2b172":"lowCapTxWei()","38d33337":"RoundAHardCap()","38d335ef":"ShowTestB(bool)","38d40ced":"changelp15(address)","38d44ad5":"recall(uint256,string)","38d480a6":"bulletAddress()","38d4d73e":"isVotedGood(uint256)","38d52e0f":"asset()","38d560b6":"gmtAddress()","38d65020":"JackpotAccessControl()","38d67d88":"changeContractName(string,string)","38d762ef":"LogBurn(address,uint256)","38d7be3c":"WXBET()","38d888a6":"impToken()","38d93280":"ProfitContainer(address)","38dacaab":"teamTimeLock()","38db6dd3":"registerVoter(address)","38dbb74a":"initialize(uint256[],uint256[],uint256,address,uint256,address)","38dbdae1":"player3()","38dc25d1":"KMCToken()","38dc92bc":"NCP()","38dca34a":"AddStudent()","38dd22f0":"isOwnerOrAdmin(address,address)","38dea895":"auction(address)","38dec0fa":"RefundAdded(address,uint256)","38df6fb2":"CollateralPosted(address,uint64,uint256)","38dfe2f5":"getString2()","38e078b4":"FixBet76()","38e11779":"OriginalAddress(address,address)","38e1294c":"updateBuyStatus(bool)","38e288f1":"airdrop(address[],uint256,uint16)","38e29ef0":"ICO_BONUS_TIME_1()","38e2c296":"processJackpotDeposit(uint256,uint256,address)","38e3aaf1":"Error(uint256,uint256)","38e43840":"collected(address)","38e45c65":"endCall()","38e47639":"getHighWater()","38e48f06":"save(string)","38e48f70":"getDonation(address,uint256)","38e4b06b":"releasedTeam()","38e55e89":"SigmaToken()","38e586fd":"right5(uint256)","38e64f9e":"milestoneReached()","38e771ab":"refundAll()","38e7920a":"setTokenRate(uint256,uint256)","38e7a375":"textaaaToken(address,uint256)","38e8feed":"TokensTransfer(address,address,uint256)","38e91e41":"devHolder()","38e95d55":"amountToRaiseInUsdCents()","38e998a7":"buyLand(int32,int32)","38e9e6b5":"setClaimingCosts(uint256)","38ea1c4d":"setTransferCreditBot(address)","38eada1c":"addAddress(address)","38eaf913":"setDirectorNode(string)","38ec18c3":"changeAccountModifiers(address)","38ec6ba8":"getAddressOfName(string)","38ec8672":"newAvto(string)","38ec8736":"assertEq11(bytes11,bytes11)","38ecadac":"bountymanagerShare()","38ecdca9":"claimProduct(address,uint256)","38ed85b0":"_claim(address)","38eda0e5":"createCalcFunc()","38ededc9":"getNoteOwner(uint256,uint256)","38ee95ab":"_emitCapabilityRemoved(address,bytes4,uint8)","38eee93e":"scheduleCall(address,bytes,bytes,uint16,uint8,uint256[5])","38ef2dc0":"testSign2of3()","38eff6c6":"backETH(uint256)","38f0de1f":"_fFinish()","38f14845":"deleteUser(uint256)","38f196b2":"COR()","38f22b42":"viewSpecific(string,uint256)","38f41711":"updateCapAndExchangeRate()","38f42d41":"GameWin(address,uint256,uint8,uint8,uint8,uint256,uint256)","38f46240":"StartRefund()","38f4b734":"getShit()","38f4cc7a":"QtumToken()","38f50b6f":"modifyAuth(bytes8,bytes8,bool)","38f55e59":"doVote(bytes32)","38f736c5":"step(uint256,bool)","38f77d69":"getDistributeProfitsInfo()","38f817c5":"getUsersEnginesIds()","38f84614":"useGoldenTicket(string)","38f88ee0":"tokenOwnerRemove(address)","38f8f3cc":"quarter1()","38f98d09":"getWeaponValue(uint256)","38fa1570":"showDevCut()","38fa4029":"currentStageIndex()","38fab8c5":"lifToken()","38fdba18":"doSplit()","38fe48b8":"batchReturnUNT(uint256)","38fff2d0":"getPoolId()","390063f0":"fundsToMSF(uint256)","39009094":"Cooperium()","39009482":"returnTuple()","3900f8f6":"minusFreezingTime(uint256,uint256)","390209c1":"getMetadata(uint128)","390246b2":"bid(bytes32,uint8,bool,int32)","3902b9fc":"getBbAddress(address)","3902bf72":"donate(bytes32,bytes32,bytes)","3902cb92":"TERATO()","3902d417":"resumeAirdrop()","39035d56":"record(address,address)","39048f02":"setSchellingRoundReward(uint256)","3904c5c1":"sweepFunds(address,uint256)","3904e1bf":"userBuys(uint256,address)","39055172":"UpgradeTokens()","390576d9":"Sogan()","3905910e":"MultiEventsHistory(address)","3905cab8":"drpsToken()","39069d8c":"setRegistryAdmin(address)","3906f560":"SUPPLY_LIMIT()","39074f59":"getDelayedBonusAmount(address)","390a05a8":"getParticipantBalances()","390b4f0c":"NaGeBi()","390b8482":"fillWithHashes()","390c0ddd":"purchaseCollectible(uint256)","390c3434":"nextrafflenr()","390c5874":"getCashbackRate(address)","390ce0d3":"getSellOrder(uint256)","390d70f5":"getTransformTarget_miner(address)","390e16c1":"EXTENDED_SLACK_PERIOD()","390e4855":"MilestoneTracker(address,address,address)","390eca6b":"finish(string)","390ff134":"isApprovedFor(address,uint256)","39106821":"memberId(address)","3910814b":"diamondAuction()","391193ae":"getTotalF2()","3911e1e1":"totalEthxCollected()","3912253e":"betConditions()","39125215":"sendMultiSig(address,uint256,bytes,uint256,uint256,bytes)","3912572d":"TokenCLC(uint256,string,string)","3912657a":"lastBlock_f11Hash_uint256()","3912b99f":"FOUNDERS_SHARE()","391363b5":"reducetime()","3913848e":"changeMerchantChargingAccount(uint256,address,bool)","3913a0fe":"getPlayerAward(address)","3913d6e0":"burnEnergyAttributionToken(address,uint256)","3913f487":"RIPAC(uint256,string,uint8,string)","3914010a":"getPartnerCash(uint8,bool,address,bool,uint256)","3915111e":"getRoundPrize(uint256)","39166ee9":"holding(address)","391687e3":"raiseTraderRegistered(address)","3916a402":"ShowInfoStr(string)","391714f8":"closeSale(bool)","39179ef9":"BitcoinFast()","3917b761":"product2_sell()","39181e6c":"Monthprofitstart()","39192fd7":"mintReserveTokens(address,uint256)","391b11ce":"updatePartner2_vows(string)","391c44b2":"addToWhiteList(address,uint256,uint256)","391c918e":"transferFromOwner(address,address,uint256,uint256)","391d2eb4":"MottoCoin()","391ecc2c":"_setOwners(address[])","391efaf2":"getEscrowFullInfo(address)","391f2e96":"InvestCancel()","391f3b2d":"_nextPotJackpot(uint256)","39203874":"ALpay(uint256,string,string)","392087fd":"changeSoftCap(uint256)","392114b7":"sellingAccept(bool)","39221913":"_forwardT4T(uint256)","392327b5":"owner_set_fraction(uint256)","392338f5":"createPost(string,string)","39236bef":"claimGame(uint256)","3923afee":"allocateToEarlyContributor(address,uint256)","39246290":"getB2()","39246d75":"VersionModel()","3924b718":"m_tokenPrice()","3924f089":"getRunning()","392542fb":"unFreeze(bytes32)","39255494":"setAdminAccounts(address[3])","3925ad8a":"getRank07()","392603d3":"_getCsAddr()","3926384d":"setMaxWithdrawal(uint256)","392664e5":"GenesisAddressSale(address,address,uint256,uint256)","39269596":"endPrivateIco()","3927010d":"ownerPauseGame()","392752b9":"lifeFactor_iv()","3928bc8b":"setBoostData(uint256,address,uint256,uint256)","39293113":"earlyBirdCap()","39298633":"forceTransferFrom(address,address,uint256)","39298f4a":"listAssets(uint256,uint256,bool)","3929e43f":"proposalExpireAt(bytes32,uint256)","392a2cb6":"withdrawFromFailedLottery(uint32)","392aa4d5":"openRefund()","392c00a2":"mint(int256,address,uint256,bytes)","392c6238":"currentNiceGuyIndex()","392c623e":"docIndex()","392cb9ed":"DhaCoin(uint256,string,string)","392d42ae":"left38(uint256)","392da9b4":"fetchCancelledOrdersForMerchant(address)","392db91e":"genuine(address)","392e53cd":"isInitialized()","392e6678":"validCandidate(bytes32)","392eaafa":"HackDao()","392ec230":"PaymentForwarder(address,address)","392ec66b":"bobClaimsPayment(bytes32,uint256,address,address,bytes20,bytes)","392ecfa6":"buyWithTokens(bytes32)","392ee145":"jackPotA()","392f37e9":"metadata()","392f5f64":"roles()","392ffcfb":"test_twoValidAndInvalidEqAddress()","39300836":"fundCrowdfund()","3930d3dd":"minBuyETH()","3931845d":"registraAluno(address)","3931c9a8":"purchaseWithToken(uint256)","39332b05":"foreignBridgeErcToErcImplementation()","39333bbe":"tokenBankrollBuyIn()","39341dde":"unseatKing(address,uint256)","39347d52":"setMarketers(address)","39354244":"percentAllocationFeeNumerator()","3935ae8f":"POKERCOIN()","39363923":"invalidationBounty()","3936dbe4":"decimals(address,bytes32)","3936e99a":"releaseAssets(uint256)","39384126":"getCampaignValidById(bytes32)","3938bd78":"updatePayment(uint256,address)","3938faa1":"_emitErrorCode(uint256)","393a1955":"crowdfundingTarget()","393a4d34":"getStorageAddress()","393b011c":"setOwnerPercentage(uint256)","393b9b0f":"TransferPreAllocatedFunds(uint256,address,uint256)","393bb56e":"setApprovalStatus(address)","393bbbf8":"mokenName(uint256)","393cb7e3":"feesPerMillion()","393e0c63":"maxPreICOandICOSupply()","393e77c9":"minMonsterHit()","393eec7b":"setSafeToken(address)","393eefb8":"withdrawMyDividend()","393f4605":"getProviderWebsite(uint256)","393f7cd4":"init_dev_and_presale_allocation(address,address)","393fb37b":"gettruelevel(uint256,uint256)","39408c83":"icoFinishedDate()","3940e9ee":"total_supply()","3941456c":"frontendAddress()","39419d60":"grandConsolationRewards()","394218b1":"electNewMayor(address)","3942a979":"s6(bytes1)","39431308":"commissionPercentForCreator()","3943380c":"key()","3943807b":"insert(bytes,bytes,int256)","3943909e":"ScamStamp()","39443b8e":"canDeposit(uint256)","3944615c":"getCompanyAddress()","3944750d":"ACCEPT_EXCHANGE()","394479c5":"TestKeiosToken()","39451a88":"tokenBurn(uint256)","394580d2":"distributeManyTokens(address[])","394610cf":"tokensTotal()","39464884":"entryInfo(uint256)","3947050f":"randomTicket()","39478568":"isFounder()","39495f8e":"RealTract(uint256,string,string)","3949630e":"before_test_method()","3949b636":"doDaysFollowEachOther(uint256[])","394a0926":"addUnicorn(address,uint256)","394a3f61":"updateFollower(uint256,bool)","394a8698":"getTotalBondValue()","394b0ba9":"RetengoToken()","394bcb49":"updateClient(address)","394c21e7":"cancelOrder(address[5],uint256[6],uint256)","394cd121":"qryModuleDetail(string,string)","394d57a2":"EtherPriceUpdate(uint256)","394da86b":"WEECoin()","394dfffb":"GFCI(uint256,string,uint8,string)","394e0cdd":"standingOrdersByOwner(address,uint256)","394f4ec6":"User(bytes32,bytes32,bytes32,bytes32,bytes32)","394fc3a6":"MaecenasToken()","39500019":"voteWithSpecifiedAmounts(bytes32,uint256,uint256,uint256,address)","39500105":"egcd(int256,int256)","39509351":"increaseAllowance(address,uint256)","3950d1b2":"p1_duration()","3950f3a2":"disavowTokens()","39515e3c":"bonusOver30ETH()","39518b5e":"startingTime()","39527ed6":"withdrawTatAmount(uint256)","395382ee":"squareWins(uint256,uint256)","3953ca8b":"setPropertyRowColor(uint16,uint8,uint256)","3953f4a1":"setLastEditionOf(uint256,uint256)","3954a389":"c_MaximumFunds()","3954b4ee":"pricePerEther()","3955b070":"unhold(uint256)","3955b6af":"_createToken(uint256,address)","3955c147":"MatchmasterPrevails(address,address,uint256,uint256,uint256)","3955f0fe":"sellEggs()","3955f12e":"crowdSaleOn()","39564561":"isCapper(address)","3956e963":"Mydo()","39575795":"getBalances1()","395764ff":"OilToken(string,string,uint256)","3957f093":"calculateTokensAmountToSale(uint256,uint256)","39580054":"getOpponent()","3958884b":"unblock(bytes32)","3959b945":"getSolver(bytes32,string)","395a9ab3":"Success()","395acdeb":"lockedCounts()","395b6f71":"getOrderBookInfo(address)","395b9467":"totalSUM()","395c22c9":"submitNewPolicy(string,string,string,string,string,string,string,string)","395deefa":"RefreshDayBonus()","395ea0c9":"Medikia()","395eda08":"MINIPOOLS_LLV_FIFA_1()","395ede4d":"collectToken(address)","395eec79":"studInfo(uint256)","3960c001":"buy(uint32,uint16,uint32,bytes16,bytes32)","3960eddf":"SupeciesToken(uint256,string,uint8,string)","3960f787":"decrypt(uint256[])","39612b0e":"refundingIndex()","39614759":"toBase58Checked(uint256,bytes1)","39614e4f":"bytesToString(bytes)","39624847":"getNumWinners()","39625faf":"pokerbox()","3962c4ff":"TimeStart()","3962d9f1":"User(bytes32,bytes32,uint256)","3962f82d":"getTokensCount()","39631849":"transferOutBalance()","39633cee":"getCompte_39()","39635d13":"withdrawToTeamStep1(uint256)","39636504":"teamPool()","39637616":"setTimedCrowdsale(uint256,uint256)","39639fbd":"trackToken(address)","3963d0c1":"MonthlyPaySend(uint256,address)","39658245":"ChannelTimeout()","3965e75d":"cancelEnter(address)","3966291e":"StaticEthAvailables(address[])","396724c3":"getCCH_edit_1()","39673345":"EPCToken(string,string,string)","396773b7":"getHeader(uint256)","39681333":"get_last_global_audit_time()","396876bd":"mintAllowance()","39688256":"tokenHardCap()","39694f47":"totalUnClaimed()","396bf78a":"WalchainToken()","396c8228":"purchase(uint16,address)","396d1ddf":"totalAdvisor()","396e70e0":"reducePlayersJadeProduction(address,uint256)","396ed0ab":"Burn()","396ff799":"setFoundersTokensWalletMaster(address)","3970f698":"tokenForSale()","39714adb":"trackHolder(address)","397182ef":"buyInSharePrice()","3971ee42":"promo(address[])","3971eea1":"bidReferral(uint256,uint256)","3972323a":"lockedBalances(uint256)","39737ea4":"proposalData(string,address,uint256,bytes)","3973e87e":"betSizeFINNEY()","397412cb":"setMinPrivateSaleBuy(uint256)","39745791":"removeWhiteList(address[])","3974874b":"drop(address[],uint256)","3975e32b":"RequestTest(bytes32,bytes32)","3976304e":"topupEnergy(uint256)","397656c6":"enableTuneOption(uint256)","3976b022":"LOG_SuccessfulSend(address,uint256,uint256)","3976be0b":"DCToken(uint256,string,uint8,string)","39774576":"isMiBoodleToken()","39785281":"winAmount3()","39785550":"withdrawAnyERC20(address,address,uint256)","39787fbd":"payeeArray(uint256)","39788bc8":"approval()","397895f3":"HoldChanged(address,uint256,uint256)","397986a1":"setUpAllowance()","39799e5d":"test_updateKey_missingId()","397a6b3d":"PrizeResultCalculated(uint256,uint256[])","397ab649":"Bet(address,uint256,address,uint256,uint256,uint256,address,uint256)","397b3378":"rewardPoolSupply()","397b8b17":"buyTokensForFiat(address,uint256)","397b90a5":"issueReserveToken(uint256)","397de27f":"changeServicePercent(uint256)","397e0287":"setIdentityExtended(bool,bool,bool)","397e8091":"betFeeMin()","397e953f":"ERC721Contract()","397eb91b":"closeLoanOnBehalfOf(address,address,bytes32,uint256)","397edab9":"ChangeOperatorAccount(address)","397efdbc":"CodeMailStampSale()","397f2a71":"getNbNamespaces()","397fa015":"updateCrowdsaleInfo(address,string)","397fe617":"CROSAIR_PRICE_THRESHOLD()","3980b680":"isHolidayToday()","3982b10d":"read_collectors_addresses()","3982b55d":"XCareToken(uint256,string,string)","3983af00":"setYearTwoMultiplier(uint256)","3983d5c4":"calcBaseFee(uint256)","398427e6":"sendByCheque(address,uint256,bytes,uint256,uint8,bytes32,bytes32)","39846a67":"sol_clean(uint256,uint256)","39849771":"maxBetDivisor()","39849a67":"isSpaceExist(uint256)","3984a89b":"updateFamedStarOwner(uint256,address)","3984ae12":"bountiesMinted()","3985a4ab":"crowdsaleEndDeclarationTime()","398712b5":"clearTheSeason(uint32)","3987fcb4":"setGasForFLKD(uint256)","39882a2d":"setUseWhitelistFlag(bool)","39885b23":"finishPreSale()","3988bad8":"pendingRewardsOf(address)","39895801":"allowPublicTransfer()","3989c666":"setRate(uint256,uint256,uint256)","398ab9a7":"totalPrizePool()","398af892":"Jimtoken()","398b35b1":"setShouldBlockPublicTrade(bool)","398bd6b2":"Cancelled(address)","398c1a89":"migrateOutByPayout(uint256[],bool,uint256)","398c7424":"getBalanceTokenContract()","398d07f0":"LightLemonUnicorn()","398d3c37":"getAyantDroitEconomique_Compte_1()","398d92bb":"withdrawTokens(uint256,address)","398e92a5":"updatePlotPrice(uint256,uint256)","398eb93c":"NardoT2()","398f0970":"secondsInBlock()","398f2648":"change_max_amount(uint256)","39900dcc":"totalBuriedCapsules()","39901be8":"getBoosterData(uint256)","39903398":"test_twoFalseAsserts()","399075da":"RES(address,uint256,string,string,uint8)","39907af1":"getSecurityValue()","39909f0b":"withdrawFundToOwner()","3990b7c7":"registerGold(address,address,bytes32)","39918c4f":"crowdsaleAllocation()","3991c09d":"addMatch(uint256,uint256)","3992503d":"TRIPAGO()","39927ebe":"registerGame(address,bool)","3992b494":"energyContract()","3994789d":"onICO(address,uint256)","3994b883":"SoccerBet(address,address)","3994bce4":"SALE_CAP_USD()","3995943b":"FUND_FRAC_TOP()","39960940":"registryRequestWeight()","39965233":"awardPrizes(uint256)","3998e2a9":"EBCoin()","39995511":"freezeAllTransactions()","3999968c":"mintRefCredits(address,uint256)","3999bbce":"SmartBitcoin()","399a24b1":"invokeFallback()","399ae724":"init(address,uint256)","399c0425":"buyingPrice()","399c6f55":"NewStage(uint256,string,string,uint256)","399cd55f":"ReferralRewarded(address,address,address,uint256,uint256,uint256)","399d6465":"getLockAmount(address)","399d7bf5":"against_ban_of(address)","399e3ca8":"PrivateSaleFinished()","399e7195":"CentraAsiaWhiteList()","399f6248":"ContractOwnershipBurn()","399fa840":"removeItem(address)","399fd8d9":"getDiaryLength()","399fdb86":"testFailNormalWhitelistReset()","39a12c3b":"Trade(uint256,uint256,bytes32,address,address)","39a13fb3":"enableTokenSale()","39a1e9ff":"SmallProject()","39a1ec37":"getInvestorDatePayout(address)","39a248f3":"feecounter()","39a26069":"housePercent()","39a2616c":"_removeDefaultOperator(address)","39a2a7bd":"confirmDeposit(uint64)","39a2b580":"_initialDistribution()","39a2bc8d":"SynchroCoin(uint256,uint256,uint256,address)","39a2eb2a":"selectWinners(uint256)","39a3f168":"secondPeriodWindows()","39a45a5c":"createGun(uint256,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","39a5a400":"TOKEN_SOFT_CAP()","39a5fdda":"earlyBackerSupply()","39a6ea72":"getEndICO()","39a73978":"unpackInvestment(bytes32)","39a7919f":"changeSupply(uint256)","39a7c3d9":"onMint(address,address,uint256)","39a7cb16":"retrieveCurrentTokensToOwner()","39a87bd9":"left31(uint256)","39a897fc":"Builded(address,address)","39a89c1a":"getNumberOfCapsules()","39a90f7a":"IS_MAINNET()","39a9144b":"_isTokenDiscounted(uint256)","39a9e6c5":"clearRequests()","39aa7599":"ITDollar(uint256,string,uint8,string)","39aaba25":"get_status()","39ac2d9b":"SuperTroopersRTscore()","39ac3300":"EtalonTokenPresale(address,address)","39ac7a08":"isMember(address,address)","39ad0212":"purchasers(address)","39ad8847":"fifth_withdrawal(uint256)","39ade9aa":"dDeployBallot(bytes32,bytes32,bytes32,uint256)","39ae662c":"setFactors(uint256,uint256,uint256,string)","39aee3b1":"CCCoin()","39af0513":"backlog()","39af0a81":"OPENCUKUR()","39b09ed8":"is_owned(uint256)","39b0b6c2":"updatePosition(address,int256,uint256)","39b0bc59":"getNonce(address,uint256,bytes)","39b0bde9":"Constrctor()","39b21937":"issue(address,bytes32)","39b22120":"contractBurn(address,uint256)","39b2447e":"addCutie(uint40,uint256)","39b25269":"makeOrder(address,address,uint256,uint256,address,uint256)","39b25ad1":"XcelToken(address)","39b26735":"TicTokenERC20()","39b333d9":"Play(uint8,uint8,uint8,uint8)","39b35753":"authCancel(address)","39b37ab0":"fee(uint256)","39b3fba8":"setRabbitData(uint256,uint32,uint32,uint32,uint256,uint8,bytes32,bytes32)","39b50688":"cancelSellOrder()","39b55e74":"developReserveAllocation()","39b57835":"multWee(uint256,uint256)","39b5ca6d":"MintFinished(address)","39b61914":"DescriptionPublished(string,address)","39b651c6":"paymentContractAddress()","39b6b1e5":"cancelBid(address,uint256)","39b73122":"createDataset(string,uint256,string)","39b73771":"_b3(string,uint256)","39b7e62f":"GENPCoin()","39b80e1b":"recoverAddressFromCommonSignature(bytes32,uint256,address,address,uint256,address,address,uint256,bytes)","39b83b68":"allowBank(string,address,bool)","39b8ce98":"weiCollected()","39b8dc40":"sunsetWithdrawalPeriod()","39b8e0ff":"proposeAllocation(address,address,uint256)","39b8e63c":"getPI_edit_9()","39ba645b":"revokeKYC(address)","39bbaed2":"SNOOP()","39bc91fa":"OwnerICOsupply()","39bea1f0":"coindropsWallet()","39bef274":"setRegionCoordinates(uint256,uint256,uint256,uint256,uint256)","39bf03b4":"NBAOnlineLaunchPromotion()","39bf5462":"MANHATTANPROXYWSHWY()","39c0c415":"toB32(uint256,uint256)","39c0ea6e":"rateProperty(uint256)","39c1852d":"withdrawal_party_b_gets()","39c2697c":"DELIVERED_FEE_FLAG()","39c27bd4":"substr(string,uint256,uint256)","39c28e82":"SSPParametersChanged(address)","39c294be":"minMargin()","39c2f6a0":"setConfiguration(uint256,uint256,uint256,int256)","39c38266":"manualBuy(address,uint256)","39c480c9":"endDate2()","39c5a13e":"secondVestAmount()","39c5dde6":"setInitialOwners(address[],uint256[])","39c5f3fc":"getNetworkId()","39c64f1b":"setPOOL_edit_5(string)","39c670f0":"claimedAirdropTokens(address)","39c73169":"totalSupplySale1()","39c7967d":"vote(address,uint256,uint256,string)","39c79cfc":"HJHToken(uint256,uint256)","39c79e0c":"close(bytes32)","39c7a376":"LogCreate(address,uint256,uint256)","39c7b6fc":"getMaxSend()","39c98a1b":"getCarOwner(uint32)","39c9ffe3":"deleteTeam(bytes32)","39ca6e86":"registryBase()","39cace6d":"PradxToken()","39caf7bb":"makeSwap(address,uint256,bytes32)","39cc8a8e":"GorToken()","39ccdd49":"createRef(bytes32,string)","39cd9dba":"KiwiCoin()","39cdde32":"ecverify(bytes32,bytes,address)","39ce3983":"debatingPeriod()","39ce743e":"replaceCharacter(uint16,uint16)","39cef0b7":"issueTokensForAssets(uint256)","39cfc56a":"ETHERanate()","39d00f12":"transferTokens(uint256,address[],address)","39d05fdd":"cetokToken()","39d08c2a":"saleOngoing()","39d1f908":"actualBalance()","39d2036d":"_validateMaxSellAmount(uint256)","39d20a5f":"read_user(address)","39d216f2":"chefOwner()","39d26051":"getOrCacheTargetReporterGasCosts()","39d2be30":"setDistributedAutonomousExchange(address,address)","39d319e5":"unblockUser(address)","39d31e14":"CoroToken()","39d34323":"product3_sell()","39d428ea":"AddToken(address,address,uint256,bool,uint256)","39d4e21a":"addToSellList(uint256,uint256,uint256)","39d51cc0":"get_testing_index()","39d66fc0":"effectiveValue(bytes4,uint256,bytes4)","39d8db86":"setICOPhase()","39d8dc9b":"BEST()","39dad8f5":"minusTourFreezingTime(uint256,uint256)","39dba209":"keysRec(uint256,uint256,uint256)","39dc5ef2":"depositTokens(address,address,uint256)","39dd134c":"advisoryPool()","39dd437b":"isWithinICOLimit(uint256)","39dea537":"registerNickname(string)","39df1608":"setPongAddress(address)","39e028ba":"AdviserTimeLock(address,address)","39e0c751":"setDiscountStage(uint256,uint256,uint256,uint256)","39e1038f":"getaddressfocuscardid()","39e1e859":"exchangeRateFUTX()","39e20523":"setWriter(address)","39e22509":"isCustomerHasKYC(address)","39e2637f":"TokenERC20(uint256,string,string,address)","39e301ff":"numWinnersToPay(uint32)","39e31ceb":"addressNotUpgradable()","39e33636":"EKK()","39e3407b":"isInFinalState()","39e395e2":"bidOnSynthesizingAuction(uint256,uint256)","39e3af9b":"isCanceled(uint256)","39e3ea83":"checkNotConfirmed(bytes32,uint256)","39e44ca4":"oraclize_network_name()","39e46ebe":"Quotation(uint256,string)","39e4dc18":"sendETH(bytes32,bytes32)","39e525f9":"resolveCallback(uint256)","39e53ca3":"updateUsersIndex(bytes32,uint256)","39e54c34":"_takeOffItem(uint256,uint8)","39e5a487":"BETSQUARE()","39e613d9":"mintVested(address,uint256,uint256,uint256)","39e65b46":"setIsRentByAtom(uint256,uint128)","39e7fddc":"feeAddr()","39e84cef":"EXT_COMPANY_STAKE_TWO()","39e851a3":"_isApproved(address,uint256)","39e899ee":"setWhiteList(address)","39e8bd48":"killMeshPoint(address,address,string,address)","39e8d1a4":"round1EndTime()","39e9eda1":"BackupChanged(address,address)","39ea68ba":"transferEntityOwnerPush(address,address)","39eabf7f":"bar(string,string)","39eb3491":"getMaximumPlayers()","39eb54d2":"bookExtendedVisit(uint256)","39eba5f9":"XXXXXXXX02(address[],uint256)","39ec68a3":"getRound(uint256,uint256)","39ecacac":"addContribution(address,uint256)","39ecc94f":"scamStampTokenAddress()","39eda73b":"jsonUpdate(string,string,string)","39edb660":"priceForDate(uint256)","39ede2b1":"SubmitNote(string)","39ef16f2":"Test2J()","39ef9105":"PhenixToken(uint256,string,uint8,string)","39efa270":"setClout(address)","39f05521":"withdrawVestedTokens()","39f165c6":"ParticipantAdded(address,uint256,uint256)","39f36220":"addThing(string,bytes32,string,string)","39f47875":"totalAmountOfWeiPaidToUsers()","39f4da78":"setSucessor(address)","39f4debc":"fillOrderAuto()","39f5b6b6":"fundsTreasury()","39f636ab":"changeRequiredSignatures(uint256)","39f64289":"quarter2()","39f64b52":"calcTokenPrice()","39f663ec":"isFundingFailState()","39f73a48":"fee2()","39f8e560":"setRewardAddress(address,address)","39f931b2":"placesSold()","39f95e63":"finaliseICO()","39fb1043":"_callRecipient(address,address,address,uint256,bytes,bytes,bool)","39fb435d":"initSiteSet(uint256)","39fc04f4":"setGftFundWallet(address,address,uint256)","39fc978d":"createCeleb(string,uint256,uint256[6],uint256[6])","39fd2003":"QPSEToken()","39fd615c":"complexityForBtcAddressPrefixWithLength(bytes,uint256)","39fdc5b7":"setExpectedStart(uint256)","39fded47":"Swap(address)","39fdf2fd":"OVERALLSOLD()","39ff8ff9":"CreatedBallot(address,uint256,uint256,bytes32)","39ffb234":"createContractScientist(string)","39ffd774":"getNamelessTouches()","39ffe67c":"withdrawOld(address)","3a000f23":"preallocate()","3a0046a3":"preIcoTokenHolders(address)","3a015ef9":"transferpoints(address,uint256)","3a01e53a":"getActivity(uint16)","3a02263c":"newController()","3a024d1c":"withdrawRewardedTokens(address,uint256)","3a027b26":"countDownToEndCrowdsale()","3a02a2cc":"addValidated(address)","3a03171c":"HARD_CAP()","3a035edf":"sendWinnerPriceToAll(uint256,uint8)","3a03ce87":"lockBatch(address[],uint256[],uint256[],uint256[])","3a051334":"adjustMOTFeeDiscount(uint256)","3a05369f":"getMax(uint32[])","3a060bc9":"isOnLent(uint256)","3a062acd":"LogEscrow(uint256)","3a067e64":"transferJackpot(address)","3a079bda":"AmethystCoin()","3a07e78a":"icoIsFinishedDate()","3a080e93":"rebondFromUnbonded(address,uint256)","3a089d17":"addressLength(address)","3a0936ce":"contributeMsgValue(uint256[])","3a0a377b":"new_id()","3a0aec6c":"distributeDEXT(address[],uint256,uint256)","3a0d6350":"batchTransfer()","3a0d649a":"fundsToBank()","3a0e0418":"Prepare()","3a0e2475":"etherDonation(bool)","3a0f12dc":"grantTokensByShare(address,uint256,uint256)","3a0f5500":"lastBlock_a6Hash_uint256()","3a1053a1":"TokenBlockPay()","3a10a614":"get_hidden_layers(uint256[])","3a11aa20":"mutiSendETHWithSameValue(address[],uint256)","3a11b6cf":"AnotherParticipant(address,uint256,uint256)","3a122e65":"SPECTRUM()","3a12e933":"startPublicSale(uint256,uint256)","3a134c00":"isFreeTransferAllowed()","3a1460ac":"mint(address[16],address,uint256)","3a14bf4c":"binomial(uint256,uint256)","3a15021a":"confirmAndForwardOnBehalf(address,uint256,bytes,bytes32,uint256[2],uint8[2],bytes32[2],bytes32[2])","3a157860":"freezeBlock()","3a15bbee":"changeInvestmentFee(uint16)","3a15e7ca":"migrateFromLegacyRepContract()","3a16c51e":"readyOracles()","3a16e81e":"determinePID(address)","3a16f2ef":"crowdsaleStop(bool)","3a1767e5":"callerAdd(address,address)","3a178d99":"isAvailable(uint256)","3a180fee":"sellQuantity()","3a190e60":"LeeroyPoints()","3a1a635e":"createNewRevision(bytes20,bytes32)","3a1ca19e":"get_property_layout(uint256)","3a1d9a7d":"secondPriceTime()","3a1e08e0":"setAllowedTokens(address,uint256,address[])","3a1e7130":"teamBonuses(uint256)","3a20bade":"registerIncome(address,uint256)","3a20e9df":"getProduct(bytes32)","3a21cb9d":"vestingAgent()","3a21ec8d":"bleachPrice()","3a22a593":"advisorAllocatedTime()","3a22a94d":"lockedTokensOf(address)","3a232c2d":"getCurrentBonusInPercent()","3a23399c":"getBidCountByToken(address)","3a237322":"superchain()","3a23a483":"approveTransferManager(address)","3a24d701":"doSuicide()","3a2524c1":"enableAllowBuy()","3a253cee":"removeOwnerRequest(address)","3a256daa":"getProposalExecutionTime(bytes32,address)","3a257fdc":"checkFwdAddressUpgrade()","3a2647cf":"addMessageToQueue(string,string,uint256)","3a283d7d":"templates()","3a289d1b":"updateEscrowGoalReached()","3a2960e1":"numAllocations()","3a29c32e":"MCBA(uint256,string,string,address)","3a29ff34":"tokenClaims(bytes32,address)","3a2a0af2":"MCSToken()","3a2b4cdf":"addAgree(bytes32)","3a2b9c37":"GxCallableByDeploymentAdmin(address)","3a2bc42b":"fundPrize()","3a2c7a37":"ICOstate()","3a2d8784":"getDepositMultiplier()","3a2f1289":"BitQuickpay()","3a2f6e57":"transferAnyERC20Token(address,int256)","3a300490":"MarkRead()","3a300d6b":"updateAccountAmount(uint256,uint256)","3a30452a":"withdrawOverflow(address)","3a306682":"GSContract(uint256)","3a30cdec":"postWalletPayment(uint256)","3a311b84":"SimpleNameService()","3a31427b":"AcceptTxTaskEvent(address,uint256)","3a314b24":"SendETH(address)","3a319eff":"NZToken()","3a323bdf":"internalBurn(address,uint256)","3a32a387":"lockAmount(bytes32,bytes32,bytes32)","3a333d30":"TelewaveCoin()","3a338256":"getarg_1()","3a344ab8":"DragonToken(address)","3a349d20":"getOpenBidsByLine(bytes32)","3a34f09a":"getRandom(uint8,uint8,address)","3a357b1d":"isCrowdSaleStateICO()","3a36399e":"address1()","3a3650cf":"eurRaised()","3a365403":"maxWeis()","3a373db7":"batchTransferToken(address,address,uint8,bytes32[])","3a375a92":"allowsAllowance()","3a377c82":"_magic(uint256)","3a37a917":"KHCToken()","3a38a08c":"verifyOperation(address,uint32)","3a38b90f":"fusionChibis(uint256,uint256,uint256,string,string,uint8)","3a3ab672":"isOnWhitelist(address)","3a3af53f":"getMasterNodes(address,uint256)","3a3b0382":"PLATFORM_FUNDING_SUPPLY()","3a3b955b":"enableExchange(uint256)","3a3bc0cb":"feeCoownerAddress()","3a3bdf56":"claimOwnerFee(address)","3a3cd062":"clientWithdraw(uint256)","3a3d12d4":"numberOfItemsForSale()","3a3d523f":"setTokenLogic(address)","3a3e49fe":"referalAirdropsTokensAddress()","3a3e8e84":"getAuthorizer(uint256)","3a3eda84":"blockNumberForVictory()","3a3f7279":"getProductRetailer(uint256)","3a3f8239":"claimOrder(uint256)","3a3fdf05":"remainAirdrop()","3a4027bb":"createWithReward(string,bool,uint256,address)","3a40c544":"exchangeERC20(address,address,uint256)","3a4148de":"setPreSalesSpecialUser(address,uint256)","3a4268e7":"doCall(bytes32,address)","3a42f7de":"changeShop(address)","3a447341":"SplendSale(uint128,uint128,uint128,uint128,uint256,uint256,uint128,uint128,uint128,uint128,address,address,address,address,address,address)","3a45268b":"LocklistAddressenable(address)","3a45af86":"modifyProductLimit(bytes32,uint256)","3a45d3ef":"setAllowanceBeforeWithdrawal(address,address,uint256)","3a4634e4":"changeCrytiblesAddress(address)","3a470b9e":"removeAccountMinter(address)","3a47de24":"Match()","3a47e629":"nCurves()","3a48f8c1":"removeFreelancer(address,uint256[],address)","3a49b95a":"getMyInvestment()","3a4a4233":"how()","3a4a921e":"revokeVested()","3a4ac98a":"tokensToEth(uint256,bool)","3a4b3664":"ownerBurn(uint256)","3a4b4532":"comission()","3a4b5e6d":"disallowOwner()","3a4b66f1":"stake()","3a4b948f":"hardBurnSMS(address,uint256)","3a4bece2":"CollectFromTransaction(address,uint256)","3a4c11b0":"setHydroStakingMinimum(uint256)","3a4cb854":"BrehonContractFactory()","3a4cba05":"SetCustomerInfo(uint64,bytes18,bytes32,bytes11)","3a4dcc88":"TronToken(address,address,uint256,string,uint8,string)","3a4de190":"repost(bytes32)","3a4e3342":"rate_BTCUSD()","3a4f6999":"maxNumber()","3a4faf7f":"max64(uint64,uint64)","3a50083d":"getRealXaurCoined()","3a500ae7":"JOYToken()","3a501155":"crowdSaleBalance()","3a50ccb7":"getMilestoneBonus()","3a5167e9":"forwardCollectedEther()","3a518b95":"functionName4(bytes32)","3a51d246":"getBalance(string)","3a525983":"TotalICOSupply()","3a531998":"getDisputeRoundDurationSeconds()","3a537b0c":"deliver(address,uint256)","3a5381b5":"validator()","3a551c6d":"HarborPresale(address,uint256,uint256,uint256,address,uint256,uint256,uint256)","3a559de6":"iGniter()","3a55f1f1":"BitcoinBravado()","3a562b78":"getOwnTokens(address)","3a573e02":"_badgeTotalSupply()","3a579abc":"withdrawTokensForEtheeraTeam(uint256,address[])","3a57e698":"registerGuide(address)","3a5860c4":"ETHERCExchange()","3a5b2080":"updateEducation(uint256,string,uint16)","3a5b5bde":"encrypt(string)","3a5d73d1":"airdrppReward()","3a5dd603":"chunk2IsAdded()","3a5e2576":"updateOwnerPercentage(uint256)","3a5ec2f8":"lemonsDroppedToTheWorld()","3a5eefc0":"EOSpace()","3a5f32cd":"updatePriceFreq()","3a600ce7":"sendToken(address,address)","3a60703b":"_transfer(uint256,address,address,uint256)","3a6120c5":"stopThinking(uint256)","3a6128db":"setLLV_edit_5(string)","3a6157cf":"richDatabase(uint256)","3a61738d":"calcReward(address)","3a618d26":"triggerRsclearRefund()","3a61dbfe":"ownerAddWorkRecord(address,uint256,bytes16)","3a621018":"unFreezeAccounts(address[])","3a62244f":"activateTransfers()","3a62a9d7":"AddressRegistered(address,string)","3a62cd2e":"currentCapEther()","3a62f663":"getAllPelvic()","3a63d886":"resource()","3a645c6d":"getLastTranche()","3a6514c8":"OddCoin()","3a669dd9":"TokenVesting(address,uint256,uint256,uint256,bool)","3a66caef":"ColuLocalCurrency(string,string,uint8,uint256,string)","3a672722":"ccSupply()","3a674500":"finalizeApprovedContracts()","3a677696":"setMigrateFrom(address)","3a67a0f6":"disableTransfers()","3a689082":"withrawFee()","3a693759":"changeRescueAccount(address)","3a699294":"Schmeckle()","3a69ab39":"getItemId(bytes4)","3a69db94":"multiDynamic(uint256[2][])","3a6a0474":"VisualTechnologyToken()","3a6a2a69":"lockAssetHolder()","3a6a43f4":"marketingTokenAllocation()","3a6a4d2e":"distributeFunds()","3a6ab569":"setMemberInfo(address,bytes32)","3a6ddf70":"sendit(address,uint256)","3a6e3d98":"calcCommission(uint256)","3a6eb318":"getMiningReward(uint256)","3a6f85b1":"TIER2_BONUS()","3a6fbacb":"currentAmountReceivedDeposit1Ether18Decimals()","3a6ffc92":"GetBetResult()","3a70491e":"incrementBattles(uint256,bool)","3a70eabd":"GetMinerUnclaimedICOShare(address)","3a7104d1":"updateFlag()","3a71386f":"functionName2(bytes32)","3a7221e0":"bestInvestorInfo()","3a72cd49":"preSaleFinishedProcess(uint256)","3a7327a3":"setAccessLevel(address,uint256)","3a7343ba":"setBeneficiary(address,uint256,uint256,uint256)","3a73b0ad":"HypeToken()","3a740a63":"getBonus(address)","3a74a767":"_setAdmin(address)","3a74b05b":"changeDesigner(address)","3a74c05b":"updateMasternode(uint256)","3a750183":"_commitHash(bytes32)","3a752c31":"HARDCAP_TOKENS_PRE_ICO()","3a7562ee":"addLegitRaceAddress(address)","3a762f73":"getRunningRazInstance(uint256)","3a764462":"enableTokenTransfer()","3a76a282":"getBlocksTillMatthew()","3a76abff":"_eraseNode(uint256,bytes32[],bytes32)","3a7749c0":"bonusRatePeriodTwo()","3a774b48":"register(address,uint256,uint256,uint256)","3a777ce0":"_C_sendToToteLiquidatorWallet()","3a77c91a":"setNotes(string)","3a789ffb":"setMinAndMaxEthersForPublicSale(uint256,uint256)","3a78e324":"updateIsAttached(uint256,uint256)","3a79311f":"Ploutos()","3a79a55c":"needsLotteryFinalization()","3a7a1ba9":"EscapeHatchCalled(uint256)","3a7a302c":"LogCrowdsaleStarted()","3a7a52d2":"HasCard(address,uint32)","3a7bd7b5":"isMixGen()","3a7befc6":"checkUserTokenBalance(address)","3a7c92af":"LogWeekRate(uint32,uint256)","3a7d22bc":"getElement(uint256)","3a7d280c":"login(string)","3a7d8df3":"ClubToken()","3a7e6854":"setnewPlayerFee(uint256)","3a7f5e2c":"LogFundsUnlocked(address,uint256,uint256)","3a7fb796":"mintGreen(int256,address,uint256)","3a80bd25":"CoinVillaTalk()","3a830a96":"Leimen()","3a8343ee":"confirmCustodianChange(bytes32)","3a838636":"withdrawTeam(address)","3a842044":"getDeviceById(uint8)","3a8468f7":"isToOffChainAddress(address)","3a84f002":"commitDispute(uint256)","3a8504b5":"NewSale(address,uint256,uint256,bool)","3a876e88":"setMDAPPSale(address)","3a878528":"setlvlNominalValue(string)","3a88594d":"isOptionPairRegistered(address,uint256,address,uint256,uint256)","3a8a0a5c":"prizeMoneyAsset()","3a8a7907":"getbetData(int8,int8,address)","3a8ac516":"toKiwi(uint256)","3a8b069e":"depositCreator()","3a8ba4f6":"removeResolvers(address[],bool)","3a8bcc91":"startPrice(uint256)","3a8c5065":"developer_add_Exchanges(string)","3a8d1eb1":"creditWinner()","3a8d6e5e":"viewKYCAccepted(address)","3a8ed5c4":"deathFactor_v()","3a8f1585":"createChannel(uint256,address,address)","3a8fdd7d":"getExchangeCost(address,address,uint256,bytes)","3a903dfa":"LEYBAERT()","3a911d30":"getAppsCount(address)","3a9143e6":"CCHToken(uint256,string,string)","3a91db97":"onNewCampaign(uint256,address)","3a920766":"WALLET_TEAM()","3a9214d2":"AsiaPropertyCoin()","3a9253a3":"BurnMe(address)","3a92a590":"YuanTaiToken(uint256,string,uint8,string)","3a9407ec":"abstractFunc()","3a94ab31":"_upgradeTo(uint256,address)","3a95152d":"getEvaluationCountByStudentID(uint32)","3a9588ba":"changeOwnerWithTokens(address)","3a95a332":"left57(uint256)","3a95a3c8":"init(uint8,uint256)","3a963033":"_addIndexGame(address)","3a96d16d":"setInitialAllocationTimelock(address,uint32)","3a96df81":"bbwallet()","3a96fdd7":"compare(string,string)","3a98c533":"getElementOwners(uint256[])","3a98ef39":"totalShares()","3a9c0ae7":"issueDividendReward()","3a9c7d3d":"maxMultiplierByAddress(address)","3a9c9ffc":"historyCount()","3a9d8be8":"moveAccountOut()","3a9db5a7":"_withdrawBonus(address)","3a9e7433":"scheduleCall(bytes4,uint256,uint256,uint8)","3a9e9d0d":"prizeCooldowns(uint256)","3a9ebefd":"decrement(uint256)","3a9eea12":"Impressio()","3a9f967e":"TOKENS_SOFT_CAP()","3aa0145a":"getFinalAmount(uint256,uint8)","3aa0396a":"mintFromICO(address,uint256)","3aa0eafb":"registrarUsuario(bytes32,bytes32,bytes32,bytes32)","3aa2ad63":"_setPlayerId(uint256,uint256)","3aa36dd4":"GetSaleInfo_Presale(uint8)","3aa3f154":"TokenSale(address,address,uint256,uint256)","3aa3f75a":"isOpenForSale()","3aa435a5":"DST_TEAM()","3aa4868a":"computeCacheRoot(uint256,uint256,uint256[],uint256[],uint256)","3aa49656":"phase2MaxEtherCap()","3aa51e41":"vaultFunds()","3aa5f4f7":"changeTokenSettings(uint16,uint256,uint256)","3aa5fe59":"hashAddress(address)","3aa612b9":"FT_TEAM_FUND()","3aa6608e":"processOrder(uint128,uint256)","3aa6c4f9":"withdrawableBalanceOf(address)","3aa6f0ee":"getRedemptionRequest(uint256)","3aa718d5":"changeDeveloperCATDestinationAddress(address)","3aa7429c":"TestX()","3aa89e83":"preICOActive()","3aa90889":"frozenPauseTime()","3aa935cb":"setDonationProportion(uint256,uint256)","3aa9376c":"releaseTokenSaleJM(address,uint256)","3aa94b1d":"getCoinStats(uint256)","3aaa36e6":"Fees()","3aaa3f24":"setPhaseSold(uint256,uint256)","3aaa74b2":"withdrawTips()","3aab3306":"SmartController(address)","3aab47b2":"UnpackDOT(bytes)","3aac430c":"TAKE()","3aac7661":"changeMonsterNickname(uint256,string)","3aaec03d":"kingGladiator()","3aaec5c5":"addToWhiteList(address[],uint256)","3aaf1898":"supplement(uint256)","3aaf3232":"maxRoundDelay()","3ab1a494":"setWithdrawAddress(address)","3ab1b765":"MainstreetCrowdfund(uint256,uint256,uint256,uint256,uint256,address,address,address,address)","3ab1e703":"roundMoneyDown3SF(uint256)","3ab207a3":"Flash()","3ab2dcec":"countCows()","3ab337b9":"addData(uint8,string,string,string)","3ab3bfc1":"splitFunds(string)","3ab4c395":"STARTING_SQUIRREL()","3ab50a9c":"getVersion(string)","3ab55c44":"getCurrentTokenPriceICO(uint256)","3ab562f2":"nextTarget()","3ab5657d":"getSourceConstraint(uint256,uint256,uint256)","3ab58703":"coldStorageYears()","3ab64c33":"beneficiaryMultiSig()","3ab71189":"_detailsLength()","3ab81062":"GOGO()","3ab89b78":"testFailHitPresaleCapPreDistribute()","3ab8e61a":"querybalance2()","3ab8ee2f":"HonestisnetworkICOregulations()","3ab966f4":"lastTokenPriceWei()","3aba9e9b":"WiredToken()","3abbf56a":"_setHourlyValueDecayRate(uint128)","3abc2106":"suicideContract()","3abcf3e7":"checkAssetListLength()","3abd0136":"totalBuyers()","3abd3a68":"summPartnershipsAndExchanges()","3abd8e4e":"getother()","3abdad4e":"totalCascadingPercentage()","3abdf792":"BATTLE_POINT_DECIMALS()","3abe2280":"updateTemperature(uint8)","3abee034":"emitRLC(uint256)","3abf30fc":"hash(bytes32,uint256)","3ac07183":"setDeprecated(bytes32)","3ac0feac":"getApprovedProposals()","3ac14078":"SEEDWhitelist()","3ac140e8":"distributorCount()","3ac163a7":"RepToken(address,uint256,address)","3ac19acf":"GenChipLevel_General(uint256,uint256,uint256)","3ac256d8":"getCurrentMilestonePostponingProposalDuration()","3ac2f3cc":"YinchengToken(address,address)","3ac31e02":"icoBalance()","3ac39d4b":"updateDarknodeDeregisteredAt(address,uint256)","3ac3a2fe":"teamPrizeClaim(uint256)","3ac4217c":"setJackpot(address,uint256)","3ac46b25":"getWithdrawableAmountPES(address)","3ac46e6b":"Irb()","3ac4aeeb":"amountFunded(bytes32,string,address,address)","3ac5cb73":"GeometricPonzi()","3ac6dd9d":"createPromotionalPurchase(uint256,uint256,address,uint256)","3ac70266":"setType(uint256,uint256)","3ac7d6fe":"pendingAddress()","3ac7fe84":"TestUtils()","3ac87121":"currentWorkStagePercent()","3ac8858b":"setMinimalBet(uint256)","3ac8b026":"storeShip(uint16,uint16,uint8,uint256,bytes32)","3ac8ca63":"beginContrib()","3ac9a77a":"createGen0Auction(uint256,uint16,uint16,uint16,uint16,uint16)","3ac9dfa3":"AgrolotToken()","3aca3788":"UCCoinSaleIsOn(uint256)","3aca9ffd":"createNewMsgAwaitingAudit(string,uint256)","3acab680":"SafeMath()","3acacfbe":"capitalFundable()","3acbd9eb":"doesOwnBase(bytes32,address)","3acbe450":"sow(uint256)","3acc2712":"partialUnlockAngelsAccounts(address[])","3accb428":"distributionMinter()","3acce2b2":"addRecord(string,address,string,address)","3acd8b80":"initExAlice(address,uint256)","3acddfc1":"marker()","3ace049e":"allowedSenders(uint256)","3acf4f9f":"ownershipUnits(bytes32,address)","3acf597c":"globalParams()","3acfad2b":"toB32(uint256,address,bytes)","3acfc185":"moduleAddress(string)","3acfd909":"getOption(string)","3ad0486b":"Token_1()","3ad04d8f":"setupFundingTime(uint256,uint256)","3ad06d16":"upgradeTo(uint256,address)","3ad075ea":"maximumSellableTokens()","3ad0d840":"setAvailableSeats(uint256)","3ad10beb":"cup()","3ad10ef6":"devAddress()","3ad14af3":"add(uint32,uint32)","3ad15258":"getProfits()","3ad17019":"changeDepositStopTimeFromNow(uint256)","3ad213e0":"connectOrderUser(address,address,uint256,address)","3ad359cf":"setDelegateWallet(address)","3ad389f2":"SanJaviercoinforwe()","3ad49222":"getMinimumAmount(address)","3ad520d8":"interestArray(uint256)","3ad55b83":"Tyzon()","3ad5b3a2":"createFunding(address,uint256,uint256,uint256)","3ad6f8ac":"getMaxClaimableWeiAmount()","3ad7c15c":"setDefaultClaimPercentage(uint256)","3ad84c89":"TXOsaleTwo()","3ad9248c":"fillInvestorAccountWithBonus(address)","3ad9801d":"importReward(address,uint256)","3ad9a928":"setFeePercent(uint256,address)","3ad9f722":"sendPoolMoney(uint256)","3ada121c":"Ballot(address)","3adb2de7":"bet_this_spin()","3adb3ad5":"querySeed(uint256)","3adbb3a4":"mint(uint32,uint32,uint32)","3add5a99":"getContractCreationGas()","3adda69a":"doBuy()","3addedd3":"getCostForAttack(uint8)","3adf7280":"getTotalHashRate()","3adf96d7":"_createProxy(address)","3ae01f84":"USDOracle()","3ae033a0":"payBounties(address[],uint256[])","3ae0e63f":"BtradeWhiteList()","3ae15692":"EEFcoin(address)","3ae1786f":"returnTokens(uint256)","3ae192bd":"changeFactorySubscriptionFee(uint256)","3ae2119b":"selfKill()","3ae24412":"addAddWhitelist(address)","3ae25075":"_getBonusAmount(uint256,uint256)","3ae26afa":"getRate(bytes32,bytes)","3ae34403":"stage1Bonus()","3ae46aed":"UruguayvsPortugal()","3ae49204":"setWaracoinPerEther(uint256)","3ae4b008":"createBounty(string,address[],uint256)","3ae50ce7":"createPresaleUnicorns(uint256,address)","3ae69708":"cryptaurBackend()","3ae7cdfa":"fipsLegacyRegister(bytes20[],address)","3ae7f938":"hash(uint256,uint256,uint256,uint256)","3ae83bd4":"transferFreeze()","3ae9133d":"coupon(uint256,uint16,uint8,bytes32,bytes32)","3ae983a8":"OriginalMyAccessControl()","3ae9b510":"getLatestMajorTree(bytes32)","3ae9de9b":"StatusSecurity()","3aeac4e1":"withdrawToken(address,address)","3aeaccf5":"Address()","3aeb512c":"updateTranscoderWithFees(address,uint256,uint256)","3aeb6c71":"vestingPercent()","3aeb850a":"DaysTillUnlock()","3aebe2a3":"GluuTokenCrowdSale(uint256,uint256,uint256,uint256,uint256,uint256,address,address,uint256,address,address,address)","3aec4439":"NSCBurnToken()","3aec5458":"callEmitter(uint256)","3aecca37":"newManuscript(bytes32,string,address[])","3aecd0e3":"getTokenBalance(address)","3aedded5":"PUBLIC_SALES_3_RATE()","3aedf90a":"wei_raised()","3aedfb8b":"withdrawl()","3aee0254":"addWinner(uint256)","3aee69bb":"changeTeamAddress(address)","3aef157b":"wingsTokensReward()","3aef3900":"proposalContract()","3aefaa75":"computeHash(string)","3aefaeb8":"setTransferRate(uint256)","3af05903":"deleteApprovedWalletAddress(address)","3af0dbc1":"contributionsOf(address)","3af1e17e":"createCelebrity(string,address,address,uint256,uint256,bool,uint256[])","3af242fd":"_createTrainer(string,uint16,address)","3af2b770":"BOBOTOKEN3()","3af32abf":"isWhitelisted(address)","3af34254":"LogChangeAccountAddressForSponseeAddress(address)","3af39c21":"undefined()","3af3c72d":"changeBonusUntilDate(uint32)","3af3db55":"channelValidator(uint64,uint64)","3af3f24f":"totalCalls()","3af41dc2":"adminDeleteRegistry()","3af5b3aa":"month48Unlock()","3af5dbb6":"mandateInBlocks()","3af6486e":"testStartNewCampaign()","3af690c2":"claimId(bytes32,uint256)","3af74940":"setRemainingTokenHolder(address)","3af75ee1":"storeBlockWithFee(bytes,int256,bytes,int256)","3af76638":"deployAndSetANT(address)","3af7d71c":"LogN(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256)","3af826a4":"auctionCancel(uint256)","3af8286f":"ContractFPC()","3af8470d":"Rate6()","3af88261":"deleteTokens(address,uint256)","3af8e4ab":"backupOwner()","3af90f35":"requiresAuction(bytes32)","3af91491":"convertMinimalToSignal(uint256)","3af923ff":"CreateRCN(address,uint256)","3af946d2":"testnetWithdrawn(address,uint256)","3af94817":"getPongvalRemote()","3af9e169":"setStartIcoMainICO(uint256)","3af9f8ac":"ArrowCOin()","3afa476c":"unstash(uint256)","3afa895f":"deleteSecondaryAddress(address,address)","3afb01d4":"testGetProgress()","3afbf039":"pastTenMinutes()","3afc7282":"getVoting(uint256)","3afd4b5e":"coef()","3afd716f":"setVIPLibraryAddress(address)","3afdbd83":"Activate(bytes32,string,string)","3afdce53":"newCrowdSale(string,string,string,uint256)","3afe3a8a":"GetEntityDelegatedRevoker(bytes32,uint8)","3b0007eb":"MinterChanged(address,address)","3b0107fc":"calculatePerformanceBonus(uint256)","3b011b30":"getSeedForTokenId(uint256)","3b016d83":"getAllBonus(uint256,uint256)","3b01788a":"throwIfSetPresaleTokensAfterActivation()","3b0363fa":"summFutureInvest()","3b039176":"CreateEvidence(bytes32,string)","3b040fb8":"failedKycCount()","3b048123":"onlyInEmergency()","3b048284":"totalCoinCap()","3b0506f7":"getVoteByAddress(address,uint256)","3b05a861":"setEthDepositAddress(address,address)","3b066dd7":"BunkToken()","3b06903e":"reassignModerator(address)","3b06a6fc":"toggleAuthorization(address,bytes32)","3b0732a4":"interaddtoken(address,uint256,uint256)","3b078de3":"changeIsPayableEnabledForAll()","3b079e10":"manualTransferToken()","3b0819b8":"create(uint256,uint256,address,address,uint256,uint256,address,uint256,bool)","3b08d35e":"setAuditReportBlockNumber(uint256,uint256)","3b098c8c":"assertEq13(bytes13,bytes13,bytes32)","3b0a895d":"setUsdEthRate(uint256)","3b0a9555":"_callReturn(address,bytes,uint256)","3b0ad68a":"InitializedToken(address)","3b0b037a":"getPriceChange(uint256)","3b0c197e":"getBook()","3b0d2764":"SNT(address)","3b0da260":"revokeVesting(address)","3b0da3b8":"updatePolicy2(bytes32,string,uint256,uint32,string)","3b0f0f2f":"getReferral(address)","3b0f343b":"getDividendAmount(address,address)","3b0f3ed3":"attend(uint32,string)","3b1019ef":"getAdvisersConsultantsTokens()","3b102248":"withdrawFromBalance(address,uint256)","3b107682":"DualIndex()","3b111bf3":"EtherTwitter()","3b116370":"GalacticX(uint256,string,string)","3b11b577":"CampaignOpen(uint256)","3b130649":"div256_128By256(uint256,uint256,uint256)","3b13873c":"addValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,uint256)","3b13f8a6":"setDealerCut(uint8)","3b143184":"Congress(uint256,uint256,int256,address)","3b143b51":"untrustedProposals(uint256)","3b14ab12":"GetAquiredAssetBalance()","3b15a398":"rewardContributor(address,uint256)","3b161361":"VoidAccount(address,address,uint256)","3b1663be":"changeAdvisor(address)","3b16c27a":"ta()","3b16f5f6":"releaseMultiWithStage(address[])","3b172a32":"bancorToken()","3b172fb9":"AuctusToken()","3b17ebb1":"adminAddWinner()","3b192105":"_getLastDate()","3b19a17d":"resetOrderIdTo(uint256)","3b19c868":"BookingUpdate(address,uint256,uint8,uint256)","3b19d67a":"dateICO()","3b19e84a":"getTreasury()","3b1a4170":"cmulpow2(uint256)","3b1a520d":"testSimpleBurning()","3b1b69f9":"Upgradable(string)","3b1b8ca0":"trustedClients(address)","3b1bebd1":"referee()","3b1cbad8":"getArraySize()","3b1cda49":"GetBaseN(uint256)","3b1d21a2":"getCash()","3b1e2542":"updateToken(uint256,address,uint8)","3b1ecef0":"private_getGameState()","3b1ede9a":"LOOMIA2_ADDR()","3b1ef91c":"NeyrosNetwork()","3b1fe51b":"changeTimestamp(address,uint256,uint256)","3b20c3f3":"rocketLaunch(uint256)","3b215823":"taxFeeBps()","3b22263c":"move(uint16,uint8,uint8)","3b2269cf":"systemAcc()","3b22c8e3":"resolveGameByHand(uint32,uint32)","3b23a5ca":"switchStatus(bool)","3b242439":"ratioDenominator()","3b25a6b9":"processDeposits(address,uint256)","3b25cf37":"PintOd()","3b265d35":"MatchingEngine()","3b270710":"ico1stPrice()","3b278f2a":"icoPaused()","3b2812ad":"newWindow(uint8,uint256)","3b283ff9":"TransferAllowanceFor(address,bool)","3b29c470":"calcTokensAvailableToBuyback()","3b29fe55":"isSecondLockTimeEnd()","3b2aa8cd":"getWeaponEntity(uint256)","3b2b7fec":"setCompte_21(string)","3b2b8ce9":"setAirdropped(address)","3b2dbb7f":"token2Player(address,uint256)","3b2f3d4d":"BitCoin(address,uint256,uint256,uint256,address,address)","3b2fd34d":"backProjectXOwner()","3b2fe781":"sendEth(address[])","3b304147":"draw(uint256)","3b305964":"accBonusTokens()","3b30ba59":"ZRX_TOKEN_CONTRACT()","3b31cbad":"ContractFunded(address,uint256,uint256)","3b33175b":"setWhitelistIn(address,bool)","3b338da0":"getActionsCount(bytes)","3b33fe73":"setAuctionPrice(uint256)","3b340ceb":"DWEToken()","3b343a13":"getNodeAddress(bytes)","3b3493d3":"lost()","3b355af6":"baseData()","3b3561ea":"PresaleCapUpdated(uint256)","3b356d71":"playerKiller()","3b3571f1":"setMinHouseClassic(uint256)","3b357f4e":"determineInviter(uint256,bytes32)","3b35cde5":"Genesis(address)","3b360c7f":"getInvestorsAndTheirBalances()","3b3672bd":"getAddressLength()","3b37044d":"WWWToken(uint256,string,string)","3b3783e7":"ETHLotteryManager()","3b393b03":"Zorro02Token()","3b39becd":"isMainSaleRunning()","3b3a1a7a":"tokenIdPointer()","3b3ae670":"getBaseRandom()","3b3b57de":"addr(bytes32)","3b3c0717":"switchRecycleAllowed(bool)","3b3c594b":"updateOldToken(address)","3b3c5aed":"addSpecialRateConditions(address,uint256)","3b3d5b88":"completeUnlock(bytes32,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","3b3d9485":"calcRandomNumber()","3b3dca76":"rand()","3b3df3d5":"tradeIn(address,uint256)","3b3e672f":"transferBatch(address[],uint256[])","3b3fa917":"setStartTimePreIco(uint256)","3b3fb38b":"rebuySum(address)","3b404266":"getDeployAt(uint32,uint32)","3b4159da":"voteProposal(address,address,uint256,string,bytes)","3b41b5f2":"setTotalProjectEscrow(uint256)","3b421f9e":"greeter(bytes32)","3b424f09":"setPermission(address,bytes32,bool)","3b427b20":"changeWhitelistCornerstoneStatus(address,bool)","3b428c9b":"tokenForWei(uint256)","3b42dfad":"saleWeiLimitWithoutKYC()","3b434169":"setUsdPerHundredEth(uint256)","3b43fa0a":"DSAuth()","3b441344":"setOtherRich3D(address)","3b442edf":"deathData_a14()","3b44383f":"TokenERC20(uint256,string,string,uint8)","3b462d5b":"bounty(address[],uint256[])","3b46321f":"setMultisendLimit(uint256)","3b4656a1":"removeAssociatedAddress()","3b4664f0":"addToResult(int256)","3b46a7df":"ivote(bool)","3b46aca3":"fetchSnapshotBlockByIndex(uint256)","3b4700fa":"releaseLockToken()","3b470582":"getOverall()","3b4719d0":"getJockey(uint256)","3b47513b":"onlyWhitelisted(bytes,address,uint256,uint256,uint256)","3b478fc5":"ethUsdRate()","3b4793fc":"sendGift(address,uint256,string)","3b47d37a":"RealTimeRayTracing()","3b47dab6":"setSaleMinter(address,uint256)","3b4920b8":"batchMintPresaleTokens(address[],uint256[])","3b495d6b":"Petcoin()","3b496f53":"IssueAccepted(uint256)","3b49a77b":"hasConfirmed(bytes,address)","3b49c216":"_createSchedule(address,uint256,uint256,uint256,uint256,uint256)","3b49f84b":"TokenD(uint256,string,uint8,string)","3b4a00b4":"unPauseBuy()","3b4a20f2":"getExternalFundsRaised(string)","3b4a40cc":"ManagerAdded(address)","3b4b7808":"returnEthReceived()","3b4c4b25":"setSupply(uint256)","3b4cb5e5":"GoldFees()","3b4cc7a3":"totalCompanies()","3b4d75d8":"withdrawRemainPrivateCoin(uint256)","3b4d900a":"NANO()","3b4dbf8b":"setSecret(uint256)","3b4e06e6":"getTokenAmounts(uint256)","3b4e8dbf":"tokenDev()","3b4fb68f":"LXKToken()","3b52147f":"LogFundsCommitted(address,address,uint256,uint256,uint256,address)","3b5251b7":"getPlayerVoteRewards(address,uint256)","3b52f2be":"winnersLength()","3b53f274":"LogInt(string,uint256)","3b540814":"transferFundWallet(address)","3b545d2f":"etherToSendCharity()","3b5535b9":"getLastWeekStake(address)","3b55d26f":"workDone(address)","3b561709":"initTransferArr(address[],uint256[],uint256[])","3b563137":"transferBeer(address,uint256)","3b574beb":"minTokensToBuy()","3b57aa90":"setHash(address,uint16,bytes32)","3b57fdff":"emitMint(address,uint256)","3b58524d":"setAddress(address,address)","3b58d5d7":"getPremiumCarSupply(uint256)","3b58f49a":"setMinBounty(uint256)","3b591ea7":"AmountToForgeTheNextBlock()","3b594cd0":"_delegateAssetOwnerRemoved(bytes32,address)","3b599b18":"ChainclubToken()","3b5a3357":"transferForFinanceTeam(address,uint256)","3b5a938a":"kick(uint32)","3b5adcef":"reservedFundsCharging(address)","3b5ae589":"Bitcash()","3b5b64f4":"conversionsCount()","3b5c020d":"BOT_ELEMENT_4()","3b5dd70b":"bigBonusPercent()","3b5e295c":"maxmoneypercent()","3b5e5376":"baseComparable()","3b5f24eb":"percentile(uint256)","3b5f30db":"EKKChain()","3b5fdb83":"buyP3D()","3b615624":"getEndorsements(bytes32)","3b61db4c":"stopIco(address)","3b61f5f5":"ChangeAuctionMaster(address)","3b623c19":"StripperToken()","3b626b83":"getWidthrawStatFor(string)","3b630493":"DAPPToken()","3b632a74":"getInterMixed()","3b64e77e":"enableCrowdsaleRefund()","3b653755":"seedMarket(uint256)","3b663195":"init(bytes32)","3b664dc7":"addRoleForUser(address,string)","3b666e48":"getCurHash()","3b668059":"ContractBalance()","3b66c415":"EmergencyWithdrawalFailed(address)","3b66d02b":"tokenFallback(address,uint256)","3b68f8aa":"deleteDonator(address)","3b69eed4":"updatePlanetName(uint256,uint256,uint256,string)","3b6b639c":"luckyStoneEarning()","3b6b9a5e":"fuckingkill()","3b6c35c3":"MubsToken()","3b6c6c72":"SALE_MIN_CAP()","3b6cbaeb":"OverseasReturneesToken()","3b6d05c7":"mdtTeamAddress()","3b6d2544":"Found(uint8)","3b6dde13":"getRandomNumber(address)","3b6e2970":"ContractStakeToken(address)","3b6e31bb":"isAllowedToUpdateProxy(address)","3b6e750f":"isAcceptedToken(address)","3b6e8ec3":"doProvideMemoryAccesses(uint256,bytes32,uint256[],uint256[])","3b6ea083":"startTimeIco()","3b6ed0a7":"processSteps(uint256,uint256)","3b6ed992":"STBToken()","3b6eeb23":"HighestBidChanged(address,uint256)","3b704588":"BCT()","3b709e8d":"WeiN()","3b70b171":"saveBlock(string)","3b70cf44":"firstRoundCosmosEnd()","3b7104f2":"checkStatus()","3b7169fb":"setopVaultAddr(address)","3b72a1b6":"approveDeliverable(bytes32)","3b7404bc":"createDepositProxy(address)","3b746963":"minLimitPrivateSale()","3b750f86":"DDJDTCoin()","3b751f7f":"claimThroneRP(string)","3b7616ff":"fwdToResolver(bytes)","3b76594d":"depositFunds(uint256)","3b768433":"getByReferenceCode(bytes32)","3b77227c":"_addIndex(address)","3b7773cd":"WanchainContribution(address,uint256)","3b784e9e":"SafeOwnable()","3b789750":"transferAllFunds(address)","3b7a3b7f":"thisVotersName()","3b7a8ff5":"addInvestors(address[],uint256[],bool[])","3b7b9d83":"marketToken2021()","3b7bfda0":"boolStorage(bytes32)","3b7cbfcf":"depositPercents()","3b7d0946":"removePool(address)","3b7da659":"changeLocalCryptoContract(address,string)","3b7dc55e":"onMintCalled()","3b7e9825":"appendArray(uint8[],uint8)","3b7f7cfa":"getValidity()","3b7f9649":"localsTruth(address,uint256)","3b7ff404":"getVotersPartyVote()","3b809273":"unlockedReserveAndTeamFunds()","3b80938e":"setDeposit(address)","3b80fac0":"updateVisa(address,uint256,uint256,bytes32,uint256,uint256,uint256,uint256)","3b80fc5f":"elc()","3b81a5a4":"assertEq23(bytes23,bytes23,bytes32)","3b81b785":"showVotes(address)","3b81caf7":"TransferAdminPending(address)","3b825302":"deleteTokenGrant(address)","3b82fe0e":"sellItem(string,string,uint256,string)","3b84333e":"FaucetToken()","3b84bec7":"setTIME_TO_MAKE_TOMATOES(uint256)","3b84edbd":"setRNG(address)","3b85746f":"existsCountsByName(bytes32)","3b86758a":"window3TokenCreationCap()","3b8678de":"setDefenceBoss(uint256)","3b871b4a":"awards(uint256,uint256)","3b874521":"withdrow()","3b87ec2d":"ecoSystemFund()","3b882832":"updateIsReverted(bool)","3b8908f2":"investmentsCount()","3b89332e":"verify_signature(uint256[4],bytes32,uint256[2])","3b893c2d":"icoTotalBalance()","3b895f28":"stageTwo()","3b89a83a":"adminRefund()","3b89be73":"registerUser(address,string,uint256,uint256)","3b8a3d5e":"setPI_edit_4(string)","3b8b4a61":"createRefund()","3b8dbf6d":"operatorSendByTranche(bytes32,address,address,uint256,bytes,bytes)","3b8e2a26":"weiCapReached()","3b8e603c":"outputb(bytes32)","3b8e6f2e":"balanceAt(address,uint256)","3b8ea9e7":"getValuePayment(address,uint256)","3b8ecdf9":"right3(uint256)","3b8eee6d":"checkDistance(uint256,uint256)","3b8f0ef4":"counterRequest(uint256)","3b8ff7be":"getBB0()","3b8ffa5e":"addVoters(address[],bytes32[])","3b90176f":"getTotalNormalTokensByAddress(address)","3b903521":"setModel(address,uint256)","3b9056bf":"userWithdraw(uint256)","3b9178f7":"transferEntireStake(address)","3b91c253":"getSkillNames(uint256,uint256)","3b91ceef":"setMax(uint256,uint256)","3b91ee26":"agency()","3b92015e":"setTokenDiscountThreshold(uint256)","3b92d384":"barrierStrength()","3b92f3df":"payment(address)","3b930294":"voteTokenBalance(address)","3b932584":"buyTokens(address,string,string)","3b942742":"totalCoinSupply()","3b947d2b":"removeStablecoin(address)","3b949785":"raiseDollarsWithdrawalCancelled(address,uint160,int160)","3b94b012":"restartMinting(string)","3b957b67":"getSumAmountOfDisputedStepsProDoctor()","3b95f23e":"deactivatePackage(uint256)","3b968963":"shortAirdropTime()","3b971f9f":"_tokenPrice()","3b97e856":"tokenDecimals()","3b9855ea":"experienceToLevel(uint256)","3b9901cc":"getChannelsByRanks(address,uint256,uint256)","3b9927df":"HVZSupply()","3b996f40":"quarter(uint32,uint32,uint32,uint32)","3b99915d":"getMarketWallet()","3b9aa6f8":"getRare(string)","3b9aaae4":"avt()","3b9bbb2f":"withdrawTotalBalanceCommissionWei(address)","3b9bd54d":"ClientsHandler()","3b9c0fdc":"deleteRound(uint256)","3b9c67e1":"Press(uint256,uint256)","3b9c7ac2":"claimLockedTokens()","3b9ca2d0":"migrate(address,uint256,address)","3b9e1497":"updateVirus(address)","3b9e9c91":"testSettle()","3b9ed710":"caculateFill(uint256,uint256,uint256,uint256)","3b9f7d6b":"m_unclaimedHolderIdx()","3b9f87a5":"setNeedToReserve(uint256)","3b9ff58e":"Academicon(uint256,uint256)","3ba04463":"p_setInvestorsPercent(uint256,uint256)","3ba0b9a9":"exchangeRate()","3ba1356c":"earnedOf(address)","3ba15036":"getWei()","3ba2a67e":"lockFund(uint256)","3ba2aaf2":"setOwnerToken(address)","3ba2cfc1":"createBitcoinAddressPrefixTask(bytes,uint256,uint256,int256,uint256,int256)","3ba308dd":"preSaleTokenBalances()","3ba72b88":"checkAvailability(address,address)","3ba7ecc0":"BuzFinancialStrategy()","3ba86465":"oraclizeQueryCost()","3ba87e3e":"setMultiRequestFirstRequestId(uint256,uint256)","3ba8b0a8":"setPendingSignatureStatus(address,uint256)","3ba8c9a7":"mintingFinish()","3ba8f108":"SetOwner(string,address)","3ba93114":"getEtherMonsterInfo(uint256)","3baa8170":"setName(string,uint256)","3baad248":"delWhitelist(address,address[])","3bab3088":"DOCTokenSale()","3baba4d7":"milestonesLength()","3bac2837":"SSAToken()","3bacf5ed":"changeTokenHolder(address,address)","3badca25":"batchTransfers(address[],uint256[])","3bae15df":"deleteOwner()","3bae795e":"ActionAuction(address)","3baf35fb":"nPayments()","3baf4e1e":"newPayment(uint256,uint256)","3baf6e3f":"setReferral(address,address,uint256)","3baf77aa":"increaseClaimsBalance(address,uint256)","3bafc5c0":"removeBankroll(uint256)","3bb0cc55":"tokensReceived()","3bb168a1":"isPresaleFull(uint256)","3bb197cf":"icoPhaseAmount3()","3bb1a882":"TradeListing(address,address,address,uint256,uint256,uint256)","3bb28957":"p2_start()","3bb2dead":"resolveAddressLight(address)","3bb33d56":"checkAtkPlayerQuest(address)","3bb3a24d":"getTokenURI(uint256)","3bb4218a":"requireContractExists(uint256,bool)","3bb4497c":"getAllProviders()","3bb54b4c":"LOG_ContractStopped()","3bb5a02c":"unsetAllowedMultivest(address)","3bb5d604":"ExchangeWhitelist(address,address)","3bb66a7b":"getETHBalance(address)","3bb735e7":"Arrholders(uint256)","3bb81b60":"total_bet_purchased()","3bb8a87f":"getConsideredTokens()","3bb8bd85":"TICDist(uint256)","3bb8da29":"GetWorldData()","3bb91c77":"calculatePayout(uint256)","3bb9f133":"listSimpleService(uint32,string,uint256,address,address)","3bba16da":"ifClaimedNow(address)","3bba21dc":"swapTokenToEther(address,uint256,uint256)","3bba340c":"dateMainEnd()","3bba72c3":"TzTToken()","3bbac579":"isBot(address)","3bbacb55":"STVCOIN(uint256,string,string)","3bbb0025":"ownerOfRobot(uint256)","3bbb11a1":"getImageMetadata(uint256)","3bbb44ca":"eth_is_seeded()","3bbca7b4":"ImpToken(string,string,uint256,uint256)","3bbe0b5c":"OKFCrowdsale()","3bbed4a0":"setRecipient(address)","3bbf41d9":"GameState()","3bc0461a":"devFee(uint256)","3bc058c7":"setBS(bytes32,string)","3bc17b28":"round3TokensRemaning()","3bc17fc3":"CreateNewPool(address,address,uint256,uint256,uint256,bool,address[],uint256,uint256)","3bc19bba":"webGiftSentAmount()","3bc1e0f1":"depositCoin(bytes32,uint256)","3bc261bb":"balanceTokenContract()","3bc273b0":"changeWelcome(string)","3bc2859e":"blockOffset(uint256)","3bc2b866":"getBla()","3bc2bc42":"AddSubscriber(address,string,string)","3bc325ee":"withdrawTokenToInvestor()","3bc3c7f9":"ERC20Token(string,string,uint256,uint256)","3bc45598":"update_SRNT_price(uint256)","3bc47fbe":"campaignEnded()","3bc4be52":"ownersTokenIndex(address,uint256)","3bc518ea":"getTokenBySelf()","3bc578fe":"getClosingTimeByStage(uint256)","3bc58532":"hodler()","3bc5a0b7":"updateBytesSetting(uint256,bytes32,address,string,string)","3bc5b73e":"_saleSupply()","3bc5de30":"getData()","3bc5f48a":"addBook(string)","3bc6db30":"settleAndClose()","3bc70184":"getPurchase(uint256,uint256)","3bc756d0":"NACToken(uint256,string,uint8,string)","3bc764f7":"depositCPT(address,uint256,bytes32)","3bc7ebac":"pinnedCode()","3bc834fc":"usersAddress(address)","3bc867f5":"getLockedEth()","3bc91e28":"setCurrentRound(uint256)","3bc983d3":"decreaseAssuranvePayments(address,uint256)","3bca915f":"NickSterBate()","3bcb1edb":"_payoutDividends(address,address,uint256)","3bcbb6d8":"Zarina()","3bccbbbc":"phase3TokenSold()","3bcd6624":"approveTokensAndCall(address,uint256,uint256,bytes)","3bcdbd22":"TweedentityClaimer()","3bce14c8":"numberOfRecentPlayers()","3bceb170":"raisedByAddress(address)","3bced141":"transcodeReceiptHash(string,uint256,bytes32,bytes32,bytes)","3bcf7d22":"newBribedCitizen(address)","3bcff3b0":"getProjectCount()","3bd04d69":"addWhiteList(bytes32)","3bd099d3":"ICO_RATE()","3bd0a6e5":"clickButton()","3bd0aa47":"modifyItem(string,address,uint256,address,uint128)","3bd0dd47":"getBackEther()","3bd0f412":"changeMin(uint256)","3bd10bf1":"_seekOdd(uint256,uint256)","3bd137e0":"makerDAOMedianizer()","3bd3593f":"_PurchaseInsurance()","3bd4aab7":"_thirdLevelEth()","3bd575fa":"acceptTrustSC(address)","3bd5aceb":"nProposals()","3bd5c209":"getContractCreationData()","3bd6695e":"testCoin()","3bd74880":"HARDCAP()","3bd756b6":"addPrivateFund(address,uint256)","3bd794d0":"solveDispute(address,bytes32,address,bool)","3bd797b0":"Tasks(address,address)","3bd7a51a":"IfContractRegist(string,string,string,string)","3bd87ebd":"hardCapTime()","3bd89deb":"DAX()","3bdc5173":"disallowNorthPoleMinting()","3bdcaab9":"getEndpointBroker(address,bytes32,int256)","3bdd504a":"rateOfZNT()","3bde045f":"numberOfRounds()","3bde3072":"onAssetReceived(uint256,address,address,bytes,address,bytes)","3bde5ba8":"targetReached()","3bdebbe1":"withdrawERC20Token(address)","3bdf157a":"setoraclegasprice(uint256)","3bdf2c0c":"setBaseValue(uint256,uint256)","3bdfafac":"randomJackpot()","3bdff827":"StaticArbiter(address[])","3be08dab":"setAddress(address,address,address)","3be1212b":"approveValidDurationData(uint256)","3be1c410":"dev2Wallet2Pct()","3be1e952":"freezeTo(address,uint256,uint64)","3be272aa":"createRoom()","3be2b60c":"joinwithreferral(address)","3be31d63":"updateVerificationStatuses(address[],bool)","3be3a3f5":"setCloseTime(uint256)","3be3bdd9":"offTimeLock()","3be46378":"getAffiliate(uint256)","3be4ee30":"getUserTokenLocalBalance(address,address)","3be52c2c":"setStatusBurn(bool,bool)","3be546a2":"raiseDollarsAdded(address,uint160,int160)","3be554d4":"setCostPerDay(uint256)","3be59443":"_setOracle(address)","3be64ed7":"addPeriod(uint256,uint256,uint256)","3be6ccd9":"freezeWithdraw(address,uint256,uint256,bool)","3be746b6":"lockState(string)","3be75aa3":"shareLimit()","3be86ba1":"setIcoAgent(address,bool)","3be8fd6a":"setContent(string)","3be924fa":"hasAuth(string)","3be92863":"burnLotById(bytes32)","3be93b98":"createCountry(string,string,string,uint256)","3be94219":"purchaseAttack()","3be9cfb7":"changeDropper(address)","3bea92a3":"addToTipperQueue(uint256,address)","3bead271":"sale3(address,uint256)","3beb0044":"hminus(uint256,uint256)","3beb26c4":"setTime(uint256)","3beb4db1":"setIcoStage(uint256)","3bed33ce":"withdrawEther(uint256)","3bed93f2":"MAX_COLLECTORS()","3bee0613":"updateExchangeStatus(bool)","3bee8726":"getMaxContenders()","3beea695":"corruptElite()","3beedf6d":"lotteryAddress()","3befedea":"getPersonParents(uint256,bool)","3bf03e9e":"HelloWorldContract()","3bf11a6c":"initToken(address,address,uint256,uint256)","3bf12c88":"Rate1()","3bf13ded":"changERC20(address)","3bf17f75":"initializeCompanyTokens(uint256)","3bf2313d":"__transferToICAPWithReference(bytes32,uint256,string)","3bf2a861":"cancelOrder(bool,uint32)","3bf2b4cd":"approveDisband()","3bf2cade":"justPureFunction(int256)","3bf30f85":"execute(address[],bytes)","3bf329bf":"fraction(int216,int216)","3bf3d531":"miningThreePlat()","3bf47720":"totalTransfers()","3bf48672":"BattleToken(address)","3bf4ac5c":"day3Start()","3bf53a89":"unVoteAll()","3bf5b9c0":"getNumberByChoice(uint256)","3bf5f781":"Trendercoin()","3bf6de96":"max(uint256[])","3bf81b91":"testAddVoter()","3bf8f34a":"designatedReporterShowed()","3bf99b3f":"buyTokensByBTC(address,uint256)","3bf9b801":"_Hit()","3bfa0de9":"changeFundWallet2(address)","3bfa4449":"createFreeToken(string,address)","3bfb3246":"_detectInvestorGroup(uint256,address)","3bfb3c35":"fourthBonusEnds()","3bfca20f":"TokenToken(address)","3bfd7fd3":"incrementValue()","3bfdd7de":"transferManagment(address)","3bfecbf0":"setNeverdieSignerAddress(address)","3bfed5dc":"DolyToken2()","3bffb839":"Cryptolotto1Hour(address,address,address,address)","3bffd31e":"depositaPagamento()","3bfffc49":"getSumOfValues(uint256[])","3c0093a6":"MithrilToken()","3c01a9fa":"getEscapeRequests(uint32)","3c027d4f":"isTokenSelling(uint256)","3c0359a4":"certifications(uint256)","3c03d8be":"judgeAddress()","3c0471a2":"pregnantLinglongCats()","3c05187b":"execute(uint8,bytes32,bytes32,address,address,uint256,bytes,address,uint256)","3c067945":"fundBalance()","3c06ae68":"raiseBuyOrderMatched(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int160)","3c070b60":"dataSourceCallbackFinals(uint256,uint8[4])","3c077a48":"getAll(uint256)","3c0870ae":"challenge(uint256,uint256,uint256,bool)","3c096005":"managerAmount()","3c09ee26":"Token(address[],uint256)","3c0ab650":"buyAllAmount(address,address,uint256,address,uint256)","3c0afb59":"changeStartDate(uint256,uint256)","3c0b0279":"KhawCoin(uint256,string,string)","3c0b1c41":"AFTBToken()","3c0b8577":"getUserApproval(address)","3c0b9db2":"PolyDistribution(uint256)","3c0ba651":"getDutchAuctionToBuyAddress()","3c0cd36b":"manualPurchaseTokens(address,uint256)","3c0ce567":"fetchConfirm(address,bytes32)","3c0cfb3d":"mintMigrationTokens(address,uint256)","3c0dabdb":"getMidgradeCarSupply(uint256)","3c0dde1c":"_addPools(address,address)","3c0de47c":"probabilities()","3c0e1cc2":"revealPhaseMinSecondsWaitForClearMajority()","3c0e5d74":"frozenCheck(address,address)","3c0e6adc":"reset_individual_shares(address)","3c0f60ad":"setSecondaryStorage(address)","3c0f92e3":"supportAddOn(uint16,uint256)","3c0fc6ea":"kill(address[])","3c0fcdd1":"depositEgereg(uint256)","3c1008bb":"internal_transferFrom(address,address,uint256)","3c107402":"LongPlace(address[2],uint256[7],uint8,bytes32[2],uint256)","3c10d7cd":"bonusInPhase2()","3c11845e":"ContractConstructor(string)","3c11f969":"sentSecond()","3c121ef5":"is_empty()","3c126795":"OMIVIA()","3c130d90":"tokenURI()","3c133818":"winningVote(bytes32)","3c13ec32":"team1LockEndTime()","3c13fc33":"transferBase(uint256)","3c1593ab":"endFirstWeek()","3c15d28f":"createQuestion(string,address,uint128,uint256)","3c1650ff":"getData_23()","3c16761f":"SUM()","3c168093":"addOrder(uint256,uint256,address,address,uint256)","3c173bf0":"ZarfundsToken()","3c17494d":"set(uint16[],string,string,string,bool)","3c17622a":"setFreelancerSkills(address,address,uint256[])","3c17b656":"investmentGateway()","3c1800cd":"isPresaleEnd()","3c1853e7":"etherBack()","3c18d318":"sweeperOf(address)","3c198047":"RollToken()","3c19df06":"stakeCreativeCommonsContent(uint256,uint256,bytes8,uint256,string,string,string,string,uint256)","3c19fc06":"Holder()","3c1a7c6f":"getCountApplyForCertification()","3c1a7e2d":"adminWithdrawBCEO(uint8)","3c1a7eda":"certificate(bytes32,bytes32)","3c1a88d7":"blockTokens(address,uint256)","3c1ab2a3":"URL()","3c1b81a5":"getInstructor()","3c1b87f9":"setSettings(uint256,uint64,uint64,uint256)","3c1c423c":"getInfoLibra(bytes32)","3c1c5931":"promoCodeToContractAddress(bytes16)","3c1cc14e":"stopTokenSwap()","3c1ce6a5":"mintDigm(uint256)","3c1d28a3":"redeemLevAndFee(address)","3c1d7078":"BookCreated(address)","3c1e60a6":"tokenParametersSet()","3c1f1cb7":"ethSaver()","3c20307b":"CTWtoken()","3c203d44":"PreCrowdAllocation()","3c2040c1":"setInviteAdmin(address)","3c20485e":"limitIcoTokens()","3c205b05":"currAdminEpoch()","3c206900":"disableEmergencyBlock()","3c2087c9":"Withdrawal(address,uint16,uint256)","3c20d1a5":"getStageCap(uint8)","3c20ee6e":"_end()","3c21001d":"getMySentTradeOfferId()","3c21acc6":"extraMintArrayPending(address[])","3c21b968":"loadBalances(uint256[])","3c21db0a":"theGames(uint256)","3c21f0a1":"GHIToken(address)","3c21fa2e":"setELHeroTokenAddr(address)","3c226cd9":"ChangeDeadLine(uint256,bool,uint256)","3c22c935":"processMilestoneFinished()","3c232bb6":"set_traded_token_as_seeded()","3c237167":"getProductivityCitizens(uint256)","3c240a63":"updateFourthExhangeRate(uint256)","3c24550c":"isRefundTime()","3c263cf4":"savingPoints()","3c264820":"getWinningPayoutNumerator(uint256)","3c26777b":"StartedGame(address,uint256,uint256,uint256)","3c2698d5":"YUNLAI()","3c269b96":"setExchange(bool)","3c26cfe3":"drawLottery(string)","3c275e24":"getInfo(address,uint256,uint256)","3c276d86":"saleStartTimestamp()","3c278bd5":"lift(address)","3c279f1f":"submitWithdrawTokenTransaction(uint256,address,uint256)","3c28308a":"rndNo()","3c287a3f":"BitcoinDiamondToken()","3c28b9c0":"expirationInSeconds()","3c2aba9f":"manageApprovedTransferModule(address,bool)","3c2b0725":"delegateContract()","3c2b2508":"PREMINER_ADDED(address,address,uint256)","3c2c21a0":"scheduleCall(address,uint256,bytes4)","3c2c4b5e":"MASTER_WALLET()","3c2cf368":"BIGTTokenDeposit()","3c2d55e6":"GetSubscribers()","3c2d6447":"setIcoPercent(uint256)","3c2d70e9":"start(address,uint256)","3c2dba23":"stakedForPollID(address,bytes32)","3c2e2624":"transferManyDirect(address[],uint256)","3c2e2a75":"depositTokenForUser(address,uint256,address)","3c2e671e":"founder3Wallet()","3c2e6b32":"AquaSale(address,uint256,uint256,uint256,uint256,address,address,address,address,address,address,uint256)","3c2e7d54":"priv_inMainChain__(int256,int256)","3c2efb22":"isContributionRegistered(bytes32)","3c2f24af":"loopFor(uint256,uint256,uint256)","3c2f7df5":"incGen0Limit()","3c306250":"mybalance(address)","3c311f3c":"previous(uint256)","3c314a91":"playerGetPendingTxByAddress(address)","3c31762c":"setMinPurchaseValue(uint256)","3c31fa62":"setFeeRates(uint16,uint16,uint16)","3c324c2e":"totalCollectableToken()","3c32673f":"BTTSTokenUpdated(address,address)","3c329dc4":"delModule(string)","3c32d8ef":"getOffChainIdentity(address,address)","3c3313a8":"registerLoan(address)","3c335b0e":"getRetractable(bytes20)","3c33808d":"preallocateSecondStage(address,uint256,uint256)","3c33863c":"computeGroupPhasePoints(uint8,uint8)","3c33d473":"setLargeCapDelay(uint256)","3c345335":"addSignature(uint256)","3c347cbd":"_0xTestToken()","3c358483":"setData_10(string)","3c35a858":"processProcessableAllocations()","3c35c88a":"sendFundHome2()","3c37a88b":"stage4_start()","3c37b640":"commitHash(bytes32)","3c3861b6":"getRace(uint32)","3c389cc4":"erc20Impl()","3c391c95":"preSaleBonus2Time()","3c3a8c39":"UpcToken()","3c3ad016":"forceUpgrade(address[])","3c3b4b31":"getHouseTraits(uint256)","3c3b7995":"privateLimit()","3c3bdb7a":"changeExchange(address)","3c3be494":"dtCreateCityData(address,uint256,uint256)","3c3c22b3":"oldest()","3c3c88b1":"initializeOnTransfer()","3c3c9c23":"totalEth()","3c3ccc44":"startNextRound()","3c3ce17d":"insure()","3c3d1385":"tinhtong(uint256,uint256)","3c3d3af6":"amountInvested(address)","3c3d9ada":"_bctc(uint256,uint256,uint256,uint256,address)","3c3deb54":"contractCreatedTimestamp()","3c3e1662":"ctf_challenge_add_authorized_sender(address)","3c3e2447":"MINIMUM_BUY_AMOUNT()","3c3e6af4":"QTX()","3c3efdc9":"calculateEarnings(uint256)","3c3f4c63":"maxSpend()","3c3ff394":"IRECToken()","3c40066d":"investByLegalTender(address,uint256,uint256)","3c402bd1":"AMTBToken()","3c41c816":"EthlanceUser(address)","3c4293d8":"refund_my_ether()","3c42f95a":"setMetadata(string,uint256,bytes)","3c43b91d":"setStage2Ends(uint256)","3c444637":"setSaleBonus(uint256)","3c454d7f":"getper()","3c45b373":"addVoting(address,uint256)","3c46f604":"testDeleteCase()","3c473336":"isEndedTrack(bytes32)","3c4857a7":"_approve(uint256,address,address)","3c489238":"HappyFutureToken()","3c48d7de":"shapeshiftTransfer(uint256,string,string)","3c490a70":"getGlobal(uint256)","3c4961ff":"_processAirdrop(address,uint256)","3c49dde4":"registerDonation(address,uint256)","3c49ec88":"getMyKebabs()","3c49ff0c":"StarCoinPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256)","3c4a2989":"POPCHAINCASH()","3c4a4b1e":"createTokenTimelock(address,uint256)","3c4b07de":"extUnlockBot(uint256,uint16)","3c4b303d":"token_decimals()","3c4b40b8":"fundingWallet()","3c4b5e2b":"setInviteeAccumulator(address,uint256)","3c4c51c9":"getClue()","3c4dbb17":"PriceWeekOne()","3c4e7d9f":"setESCBDevMultisig(address)","3c4ec769":"VCT()","3c4f3c12":"issueTokensSale(address,uint256)","3c4f5a66":"getActivePlayers()","3c4f5be3":"registrantOfToken(uint256)","3c50afe1":"_icoSupply()","3c50edbd":"getSidesById(uint256,uint256)","3c5192b7":"EscrowEscalation(uint256,uint256)","3c520944":"getPromoCodeForFish(bytes16)","3c526ef1":"_divideDecimalRound(uint256,uint256,uint256)","3c530ace":"registerProducer(address)","3c536938":"executeTransaction(uint256,uint256)","3c5395b2":"revokeAdmin(address,address)","3c53cb96":"lastBlock_v0Hash_uint256()","3c53dabe":"BeggarBetting()","3c540687":"txCount()","3c54ca8c":"trade(address,address)","3c54caa5":"reclaimTokens()","3c5524d8":"listContractByModuleName(string,string)","3c552556":"verify_signature(bytes32,uint8,bytes32,bytes32,address,address)","3c55563e":"cards_metal_total()","3c560064":"mintPartner(address,uint256)","3c566f0f":"shopStoreAddress(uint256)","3c56d236":"HashLotto()","3c56e2ae":"register(address,uint8,bytes32,bytes32)","3c56eae3":"setForceReadyTime(uint256)","3c5746dd":"recipientExtraMIT(address)","3c580e92":"setLocalGame(uint16,address)","3c584d86":"convertWT(uint256)","3c58795d":"hasFetchedProfit(address)","3c58d378":"lockChanges()","3c58ef44":"getWishIdxesAt(address)","3c594844":"leftToday()","3c5972ff":"multiSetWhiteList(uint256[])","3c59c17a":"AgentWallet()","3c5a12cb":"getVal(string)","3c5ad147":"Debug(string,uint256)","3c5b7d3f":"buyTkn(uint256)","3c5bd949":"mine_jade()","3c5bdcc4":"FCOIN0939Token(uint256,string,string,uint256)","3c5c6331":"addAddressToUniqueMap(address)","3c5d1812":"totalPhases()","3c5e270f":"teamSupplyAddress()","3c5e28d6":"setClientIdentRejectList(address[],uint8)","3c5e417e":"_mintApproveClear(address,address)","3c5e57e4":"_getRarity(uint8)","3c5e94dd":"bulkRegisterPoA(bytes32,bytes32,bytes32,uint256)","3c5f10a3":"winning_ticket()","3c5f2bf2":"getFullRace(uint256)","3c5fc608":"preDGZtoDGZExchangeRate()","3c617685":"SocialMediaPay()","3c61d003":"advertisingDeposit(uint256)","3c6251bd":"test_oneValidEqUint1()","3c627c9b":"releaseAndDistribute()","3c630356":"AirCrash()","3c63d000":"setBurnRequestStringMap(uint256,string,string)","3c6403b4":"GetAccountIsNotFrozenCount()","3c647fbd":"angelMaxAmount()","3c648ddd":"voteSvp01(bool)","3c64f9aa":"ClusterToken()","3c65c506":"adjust_difficulty()","3c6677d6":"promoBun(address,address)","3c667b13":"rentalsContract()","3c671e53":"collectPayout(address)","3c673470":"createGroup(address,bytes32,address[])","3c673c19":"deleteTopic(uint256)","3c67b6b7":"getClaimLeft(address)","3c67c51e":"testLogs()","3c67dad5":"revertLuckyCoin(address)","3c6806b8":"getDiary(uint256)","3c681da0":"getCandy(string)","3c6867c3":"CallBack(string,bytes32)","3c68eb81":"transferFunds()","3c695d4e":"authorityAddress()","3c69a5e6":"mintPresaleBonuses()","3c6a2929":"setArrIntF2ArrUintF3ArrBoolF1(int256[],uint256[],bool[])","3c6a71f7":"exchangeRatePreIco()","3c6aa9f1":"decimalsValue()","3c6b97c9":"TokenContribution()","3c6b9d8c":"captains()","3c6bb436":"val()","3c6bc24b":"getBrickDetail(uint256)","3c6bf582":"ElementBought(uint256,uint256,uint256,address,uint256,uint256,uint256)","3c6c67e2":"etherAllowance()","3c6d2610":"TalentToken(address)","3c6d2e19":"contributionsETH(address)","3c6d736d":"ZZZCoinERC20Token()","3c6d7b47":"setDebugNumber(uint256)","3c6dfba1":"buy(uint8,bytes6,uint32,uint32)","3c6e03d7":"thewhalegame()","3c6e5927":"getMonsterCurrentStats(uint64)","3c6ea2a5":"HooyToken()","3c6eab08":"KICKICOCrowdsale(address,address,address,address,address,address,address)","3c6ee392":"createTokens(uint256,uint256)","3c6f2cc4":"sendICOTokens(address,uint256)","3c704089":"DigitalCash()","3c7045fe":"takeEtherBack()","3c7066d1":"feeCMT(uint256)","3c7097a3":"setMaxCharId(uint32)","3c70bd42":"sell_(uint256)","3c716e08":"updateAuthority(address)","3c71b186":"ElementeumToken(uint256,address[],address[])","3c71b7b6":"validDelegateSignature(address,string,uint8,bytes32,bytes32,bytes32)","3c71faf2":"BMToken()","3c72751e":"lerp(uint256,uint256,uint256,uint256,uint256)","3c72a83e":"getKyberNetworkAddress()","3c72e9bf":"IMDEXadminWithdraw(address,uint256,address,uint256)","3c72f070":"initialTokensBalance()","3c73db77":"RecycleToken()","3c745371":"finalAddress()","3c745ad5":"nextProfile()","3c74db0f":"expirations(address)","3c76aa19":"CWCreturnQueryData()","3c771309":"setSiringRate(uint256,uint256)","3c774dbb":"buyChickenParkCoin(address)","3c775b08":"airdropLimit()","3c77b95c":"testExpUnroll16(int256,int256,uint256)","3c77e474":"_updateKeyPrice(uint256)","3c7818a1":"startRoundD()","3c78929e":"lockUntil()","3c78fe07":"getReceiver(uint32)","3c796430":"getOneTimePayment()","3c799547":"amountAvailable()","3c7a337a":"InDeepToken()","3c7a3aff":"commit()","3c7b3d90":"rewardAirdrop(address,uint256)","3c7b682d":"PunkOffered(uint256,uint256,address)","3c7b6869":"finishPresale(uint256)","3c7c2563":"createtoken(string,string,string,string)","3c7cc806":"validateOrderAuthorization_(bytes32,address,uint8,bytes32,bytes32)","3c7d6f30":"publicStartRegularPhase()","3c7e03c1":"getRelayingKing()","3c7e31f0":"addCutie(uint32,uint128,uint128,uint128,uint128)","3c7fdc70":"fibonacciNotify(uint256)","3c807878":"stageOne()","3c811ee0":"putSellOrder(address,uint256,uint256,uint256)","3c8161c5":"KVC(uint256,string,uint8,string)","3c816217":"killBoard(uint16)","3c81df21":"getMultisig()","3c8259b4":"SACoin()","3c837b7d":"changeSettings_only_Dev(uint256,uint256,uint8,uint8,uint256)","3c8394ac":"ICORaised()","3c83f7aa":"rateForPhase2()","3c842a26":"_Test_Oraclize()","3c847e52":"withdrawVested(address)","3c84f868":"set(int256,address,uint256)","3c8515b1":"_createCrypton(string,address,uint256,uint256,bool,uint8)","3c86063c":"insertInfo(string,uint256,uint256)","3c8766c6":"sendProfitsReward(address)","3c876c6f":"newIdShipProduct()","3c87b8ef":"get_player_state()","3c889e6f":"getBid(uint256)","3c889fe1":"masterCalculator(uint256)","3c890e4c":"getVoteStake(uint256,uint256,uint256,bool)","3c893718":"transferCity(address,address,uint256)","3c894475":"scheduleTransaction(address,bytes,uint8,uint256[6],uint256)","3c89f9d4":"accept(uint256,address[],uint256[])","3c8a072e":"temporalUnit()","3c8a321c":"setPaymentGatewayList(address)","3c8ac88e":"createIdentityWithCall(address,address,address,bytes)","3c8b0c55":"set_arbits_min_contribution(address,uint256)","3c8b6597":"addPrivateSaleTokensMulti(address[],uint256[])","3c8bb3e6":"wmultiply(uint256,uint256)","3c8bccd9":"getCommission(uint256)","3c8c681a":"RoundCSold()","3c8c6a1e":"sendToken(address,address,address,uint256)","3c8ca83d":"gameBeginTime()","3c8cd434":"getCabCoinsAmount()","3c8d284b":"receiveBtcPrice(uint256)","3c8da588":"priceInWei()","3c8e3b52":"getTotalPercent()","3c8e66fb":"calculateTotalDirectDebitAmount(uint256,uint256,uint256)","3c8eac87":"getTransactionState(uint256)","3c8f202e":"Dashicoin(uint256,string,uint8,string)","3c8f3278":"hmax(uint128,uint128)","3c8f96f1":"bonusTokens(uint256)","3c9046c9":"yearTwoClaimed()","3c9070b5":"ConsultaProva(address)","3c90861c":"Enigma()","3c90ee6a":"DNARtoGoldXchgRate()","3c918bae":"wallet3()","3c920d0d":"liquidityPoolTotal()","3c925f16":"getAccountHolder()","3c9266e0":"sendSalary(address)","3c9340ae":"orderForDays(bool[])","3c936e97":"lockBonusTokens(address,uint256,bytes1)","3c93d8be":"uint2hexstr(uint256)","3c941423":"getDesignatedCaller(bytes32,uint256)","3c959aca":"CheckTickets()","3c960be9":"transferFromSenderPaysFee(address,address,uint256,bytes)","3c961202":"getHighscore()","3c96a7a8":"withdrawOwnerFee()","3c96d048":"setnow(uint256)","3c9719a7":"getReleasableFunds(address)","3c984f4a":"sellTokensForEur(string,address,uint256,uint256)","3c993482":"_payfee()","3c9a4baa":"requestOutput(bytes)","3c9a5d59":"getAuditAuditor(uint256)","3c9ad41b":"tokenIssuedToday()","3c9af31c":"getSponsor(uint32,int256)","3c9c4001":"whitehat()","3c9c97f0":"setBlocksPerRound(uint64)","3c9d377d":"f5()","3c9d93b8":"removeAllowedAddress(address)","3c9ee04c":"previousstageplayer2()","3c9f861d":"totalBurn()","3c9ff012":"timeRangeCreateGen0()","3ca1595a":"addNewRaz(uint256,uint256,uint256,uint256,string)","3ca19952":"getBookingCount(address)","3ca22916":"dollarPerEtherRatio()","3ca520f5":"LaunchPartnersAmount()","3ca5c69c":"AllMake()","3ca5c8b8":"createFilmToken(string,uint256)","3ca6268e":"log(string,int256)","3ca63675":"getNumberOfVotes(uint128)","3ca65e77":"JMJToken()","3ca6a437":"assignedGameContract()","3ca6b228":"getEmployee(address,address)","3ca6c07a":"setTokenAdd(address)","3ca6d100":"create(string,string,uint256)","3ca6d5a9":"initialBuyPrice()","3ca7aad7":"xorReduce(uint8[],uint256)","3ca805ba":"pwrFloat(uint256,uint256,uint256,uint256)","3ca88a2f":"canBuy(uint256)","3ca8b002":"isDeploymentAdmin(address)","3ca95c89":"getCompte_26()","3ca967f3":"getCurrentExchangeRate()","3ca96e0e":"teamBonusAllocatedTokens()","3cab648a":"getModuleAddressByName(string)","3cac14c8":"returnArray()","3cac2387":"trustedTokens(address)","3cac38e4":"advanceStep()","3cacf895":"doPayments()","3cad71cf":"RetStatic(uint128)","3cad7c4e":"setLockQtyToAllowTrading(uint256)","3cae09ac":"silencePeriod()","3caebce4":"BRFToken()","3caed876":"submitTransaction()","3cb00fd2":"get_presale_iconiq_arbits_per_ether(address)","3cb025e2":"SimpleSafeToken()","3cb0b51b":"Redeem200AFTK16SeptSandbox()","3cb21103":"isAllowedFactProvider(address,address)","3cb260b2":"set_dimensions(uint256,uint256)","3cb27169":"receiverVestings(address,address)","3cb32f77":"currentHolders()","3cb3d027":"getTokenBankrollAddressFromTier(uint8)","3cb3ea68":"LAMBO_TYPE()","3cb40e16":"withdrawToOwner()","3cb4986a":"ZeusToken()","3cb4ff3c":"getActiveCards()","3cb579c1":"setValueParam(uint256)","3cb5bc74":"setMintLimits(uint256,uint256,uint256)","3cb5d100":"contributors(uint256)","3cb5d170":"sendTokenReleasedToBalanceInternal(address,address,address)","3cb5d1df":"TicTacPotato()","3cb6465e":"numOfWinner()","3cb6e20c":"LeadcoinSmartToken()","3cb802b9":"unclaimedDividends()","3cb83751":"getCofounderCount()","3cb8cfc8":"acceptTokens(address,uint256)","3cb8cfcd":"totalEthInWeiForPreIco()","3cb9032e":"getInvoicesCount(address,uint256)","3cb94596":"addressOf(bytes)","3cb960a6":"calcCORtoETC(uint256)","3cba3c77":"OperationalSplit(uint256)","3cba41bf":"store(bytes,address)","3cbcf9a4":"RatingToken(address,uint256)","3cbd4285":"addWinnigs(address[],uint256[])","3cbd6429":"playerId(address)","3cbdfcd9":"bountyTokensToAddress(address)","3cbe7309":"AgriChainDistribution()","3cbeb49a":"setColorBlue()","3cbec314":"FRUT()","3cbf41d2":"completeCrowdsale()","3cbfed74":"getBondBalance()","3cc0be9a":"setCompte_37(string)","3cc0fb45":"testFailRetractNotOwner()","3cc12603":"ABCToken(uint256)","3cc136e0":"destroyRoto(address,bytes32)","3cc1429c":"createEthAuction(uint256,address,uint256)","3cc15011":"_calculateExcessTokens(uint256,uint256)","3cc1635c":"deleteBooleanValue(bytes32)","3cc228fd":"minVotes()","3cc26b71":"admin_active_dividend(address)","3cc3c3b5":"terraformReserve()","3cc45596":"updateCar(uint256,bytes32,uint256,uint256,uint256,uint16,uint8,uint8,uint8,uint8,uint8)","3cc4c6ce":"resumeGame()","3cc54aae":"updateGenGuVault(uint256,uint256)","3cc626b6":"PotoToken()","3cc6441d":"Smile()","3cc71c3f":"COMMUNITY_ALLOWANCE_LIST()","3cc7508f":"uncooperativeClose(address,uint8,uint256)","3cc75749":"volumeType2()","3cc7790a":"GSI()","3cc7fd84":"infoTokenSilverRatio()","3cc86b80":"GetMoney(uint256,address)","3cc86b9a":"takeAllNotClaimedForRefundMoney()","3cc8daf7":"setNameOwner(bytes,address)","3cca2420":"contractData()","3cca779b":"gameOpen()","3ccad6fc":"getNamedAddresses()","3ccaf593":"createReport(string,string,string,string,uint8)","3ccb25a2":"setRequiredBlocksElapsedForVictory(uint256)","3ccb47cb":"roundPot()","3ccb4ae4":"initLocalNodeReputation(address)","3ccb6c31":"setWallet2(address)","3ccb7dc9":"CrowdFund(uint256,uint256)","3ccbad50":"initialize(address,address,address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256)","3ccc5e2c":"icoSale()","3ccc8193":"lastWiningTicketNumber()","3cccfc1b":"promotionCommisionPercent()","3ccd1c7f":"getFactoryProfit(uint256,address)","3ccdbb28":"withdrawToken(address,uint256,address)","3ccf127e":"raisePreSale()","3ccf5861":"TOSInstitutionsIncentiveContract()","3ccf5c8f":"setDelegadoDeEscuelaVerify(bytes32,bytes32,uint256,uint256)","3ccfd60b":"withdraw()","3cd109cb":"addAuthorizedOwners(address)","3cd17060":"getProposalHash(string)","3cd1b6b1":"isSponsorable(address,uint256)","3cd21d88":"ClosePeriodEvent(uint256,uint256,uint256,uint256)","3cd260e6":"doWorkAndPayEBT()","3cd2df82":"calculateTokensWithoutBonus(uint256)","3cd35429":"DQCoin()","3cd36358":"_getApproved(address,uint256)","3cd510ee":"getWinNumbers(string,uint256,uint256)","3cd5d5fc":"Sacar_BlackList(address)","3cd5f8ea":"addCourse(address)","3cd78a2b":"addToSpecialRatesMapping(address,address,uint256)","3cd8045e":"splitter()","3cd99b70":"setMaxDepartureLim(uint256)","3cd9a0fa":"stage_2_maxcap()","3cda0103":"supplyOf(string)","3cda0b45":"contribute(bytes8)","3cda6524":"addUnlockedAddress(address,address)","3cdb01ae":"atxChangeAddrCount()","3cdb3aa6":"activateRefund()","3cdb9762":"getTokenBalance(string,address)","3cdb982b":"getNumeroDeOuvidorias()","3cdbd414":"multivestBuy(bytes32,uint8,bytes32,bytes32)","3cdd37e1":"WatchedWallet(address,address)","3cdd9262":"peMaxPerPerson()","3cde5627":"SendEtherToDex(uint256)","3cdf60e2":"TurkCoin()","3cdf6783":"withdrawDeferred()","3ce0a093":"getHash(bytes8)","3ce0c432":"TokenPurchased(address,address,uint256,uint256,bytes)","3ce123dc":"highBidder()","3ce1314f":"setUnlockStart(uint256)","3ce17f24":"_createPlayer(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","3ce1f4e7":"testFailUpdateLatestRevisionNotUpdatable()","3ce24239":"AddSharedAccount(bytes32,address,bytes32,bytes32,bytes32)","3ce276f5":"setFreezeTransfer(bool)","3ce32c0a":"AWAToken()","3ce3480a":"closeStageOne()","3ce39a3d":"proposeTx(address,uint256)","3ce54ac3":"testFailCreateWithParentParentSameItemId()","3ce5facd":"HeyfanToken()","3ce6d89b":"approveTaxData(uint256)","3ce70aac":"getDocumentSequence(bytes16,bytes32)","3ce716f9":"WalletChanged(address)","3ce7da3d":"setTokenSymbolName(string)","3ce819e2":"captcha()","3ce948c8":"Token_3()","3ce97eb9":"GetManifestoById(uint256)","3ce9d22e":"setupFinal(uint256)","3cea6965":"gasMin()","3ceb7783":"rankNumbers_()","3cebb4d7":"setOpGas(uint256,uint256,uint256)","3cebb823":"changeController(address)","3cebff9c":"airdropPool()","3cec21c8":"register_(uint256)","3cec475a":"connectTest()","3cec9309":"segmentSize()","3cecd719":"cleanup()","3cece78b":"__getEthPrice(uint256)","3cecf2e6":"exchangeRateArray(uint256)","3ced516c":"descriptionHashes(bytes32)","3ced842b":"make_offer()","3cedd004":"setMinimumInitialBudgetForAudits(uint256)","3cee32e3":"set_allow_withdraw_amount(uint256)","3ceeafa7":"amountOfTokensPoolA()","3cef162a":"allocatetokensAndWL(address,uint256)","3cef51c5":"maxWeiTier3()","3cefc1e0":"hasTokens(address)","3ceffd41":"TokenPurchased(address,uint256,uint256)","3cf0659a":"right25(uint256)","3cf26a33":"transferAssetOwner(address)","3cf274a5":"bighype()","3cf2eb85":"dispossess(address,uint256)","3cf39ed3":"ini_supply()","3cf3a338":"WithdrawTithes()","3cf3d6d8":"getAllCellInfo()","3cf3ecd7":"StartGuess_tw(string,string)","3cf3f105":"checkInvarience()","3cf43e08":"revertTokens(address,address)","3cf43e2c":"btcId()","3cf46fee":"RoundClose(uint256,uint256,uint8)","3cf5040a":"getHash(bytes32)","3cf52ffb":"proposedTimestamp()","3cf572a7":"setNotice(string)","3cf5da75":"getTokenInvocations()","3cf679a5":"lastBlock_v19Hash_uint256()","3cf682b8":"CikkaCoin()","3cf6ed95":"stageForDate(uint256)","3cf7cbdb":"showTimeLockValue(address)","3cf7d47b":"IncreaseInvestedWeiAmount(uint256,uint256)","3cf885c4":"isBitSet(uint256,uint8)","3cf8acec":"allocateBid5(bytes32)","3cf9db41":"drawWinner(uint256,uint8)","3cfa92de":"BAToken(address,address,uint256,uint256)","3cfaa9ed":"mintedWallets()","3cfaaca0":"DMRToken()","3cfac38e":"validatePrediction(bytes32,uint256,uint8)","3cfb35aa":"ensSubdomainRegistrarBase()","3cfba0e3":"ethBalances(address)","3cfc47ea":"getPostPoster(uint256)","3cfc83f5":"addGame(string,address)","3cfd1f80":"VirginToken()","3cfd78f3":"onlyBouncerAddExtension(address)","3cfd86f1":"CashPokerProToken()","3cfe25cf":"cap_ACE()","3cfe6731":"claimfordividend()","3cff5b66":"getIsAuth(address)","3d00b8e3":"buyTokens(uint256,uint256,bytes)","3d0141f6":"whatProposal(bytes32)","3d01bdec":"CTO()","3d02c85b":"rejectTokens(address,uint256)","3d03582f":"collectBack()","3d0383c2":"getthismuchethforyourspud(uint256)","3d03886a":"setRobotAddr(address)","3d03a284":"getMyBat()","3d03ec29":"createCoin()","3d05d0e6":"MintFToken()","3d06242a":"setVIPFee(uint256)","3d062adf":"deleteMember(address,address)","3d0673d4":"getTotalToken()","3d080bd9":"dateRelease3()","3d089bf6":"GlobalBusinessSystem(uint256,uint256,uint256,uint256,address)","3d092b3d":"getMatch(uint256)","3d0977e1":"CROWD_WEEK2_PERIOD()","3d0a8dab":"endExclusive()","3d0ab170":"feePerUnitOfCoin(uint256)","3d0ab7e8":"PresaleContribution(address,uint256)","3d0acdaa":"getReservedPercentageUnit(address)","3d0c3836":"emergencyERC20Drain(uint256)","3d0c46d0":"getMessagesCount()","3d0c4924":"MAXIMUM_SUPPLY()","3d0c7eb6":"purchaseTicket(uint256,address)","3d0c9cc4":"PACK_SIZE()","3d0e6afc":"crownFreeze(address,uint256,uint256)","3d0ed048":"delBlacklist(address)","3d0ef823":"DepositReturn(address,uint256)","3d0f963e":"updateWhitelist(address)","3d11fa43":"delUnicornContract(address)","3d124c9d":"PointGameParticipate(address,uint256,uint256)","3d125f03":"buyTokens(address,address,address,uint256)","3d126a45":"devTokensPercent()","3d126e57":"SparkChainToken()","3d13341c":"_bytes32(string)","3d13aec8":"save(address,uint256,uint256,uint256,string,string,uint256)","3d140d21":"approve(address,bool)","3d14263a":"FailedSend(address,uint256)","3d147789":"UpgradeCommited(address)","3d160de9":"pricesAreStale()","3d160e0b":"UNLOCK_PHASES()","3d1657ff":"getIncreaseBalance(uint256,uint256)","3d1678f4":"redeemEnableTime()","3d16991a":"getStep(bytes16)","3d17a2d8":"merchantHistory()","3d182c42":"private_SetPause(bool)","3d1843c3":"callAndFail()","3d18678e":"setFees(uint256)","3d18b912":"getReward()","3d18bb7f":"HP()","3d18c615":"LastProposalID()","3d18e7b5":"amIH1()","3d1930ac":"mintBounties(address)","3d19481f":"balancePreSale5()","3d1a653f":"Ticket_Ganador(uint256,uint256)","3d1aa963":"chargeFee(address,address,uint256)","3d1aac95":"setWalletToClientAccount(bytes32,address,bytes32)","3d1b9d00":"TRCToken()","3d1bd1bf":"totalLockedHavvens_byAvailableHavvens_limitedSum()","3d1ced2b":"candyuser(address,address,uint256)","3d1cefc4":"SurveyToken(uint256)","3d1d2202":"getMinersOnSale()","3d1d4703":"newTribe(string,string)","3d1e215d":"redistributeTokens(address,address)","3d1e40a7":"changeTimeWithoutUpdate(uint256)","3d1ea04a":"getUnitCoinProductionIncreases(address,address,uint256)","3d201fcf":"MatchEnd(uint256,string)","3d20d9b0":"BONUS_ICO_ROUND2()","3d20e09e":"lpBidPrice()","3d20e3d7":"SetMemberLevel(address,address,uint8)","3d21aa42":"sendApproval(address,uint256,address)","3d226146":"createEvent(bytes32,bytes32[],bytes16[],uint256[])","3d2271fd":"setBytesRaw(string)","3d228ce8":"presaleTokenCreationRate()","3d22d571":"userBanning(address)","3d235d88":"KPRToken()","3d23af26":"newRegistryWithToken(uint256,string,uint8,string,uint256[],string)","3d24081c":"randomSkinAppearance(uint256)","3d249031":"Multicoin()","3d26851a":"_transferFrom_byProxy(address,address,address,uint256)","3d2796f5":"Forwarder(address)","3d289a76":"irbg(address,uint256)","3d28bab2":"SetGasBuy(uint256)","3d28ce75":"ChooChooCoin()","3d28e2ac":"totalDividendPayOuts()","3d2a9b9b":"getPartIndexes(uint256)","3d2c8d18":"lastEvidenceCheck()","3d2ce522":"setdaily(uint256)","3d2d812f":"MultiTransferValues(address[],uint256[])","3d2d8263":"tokenFund()","3d2dea63":"transferAny(address,address,uint256)","3d2e7538":"IPv6Token()","3d2f5bda":"startVoting(uint256)","3d2fbd0a":"usdEstimateInContract()","3d30276b":"Presale(uint256,address)","3d30dbe9":"updateBonusEligibity(address)","3d316134":"maxTokensToSale()","3d31e97b":"appendDebtLedgerValue(uint256)","3d32cb63":"updateReputationScore(bytes32,bytes32)","3d330c49":"findElevenPmUtc(uint256)","3d34a3e7":"setStage2()","3d34f921":"HexelErc20Token(string,string,uint256,address)","3d35d7ba":"getBuyRate()","3d36f7dd":"assertCorrectAllocations()","3d37542b":"launchOutcome()","3d37ef8c":"RESERVED_PARTNERS_LOCKED_SIDE()","3d380ff3":"releaseBatch()","3d389faf":"buyEnable()","3d38abd9":"MercadoMoeda()","3d3984bf":"ironProcessed(address)","3d39c260":"managers(uint256)","3d3b1c02":"SendEtherToBoard(uint256)","3d3b1fdf":"STRAToken()","3d3b2056":"getReadableTime(uint256)","3d3b26a6":"inflate(address,uint256)","3d3b4738":"GXVCReplay(uint256,address)","3d3bc43e":"getMessageRequestHashUsingProviderAddress(address,uint256,address)","3d3c3f2d":"snapshotUpdate(address,uint256,string)","3d3c5c9f":"trustedFillOrderTransfer(address,address,uint256)","3d3cba10":"decrementIncome(address,uint256)","3d3da831":"valueAfterAddingPremium(uint256)","3d3eb22a":"desapprove(address)","3d3f5114":"MEW_CROWDSALE_FUND()","3d405342":"fechAllCandidatesBySnapshotBlock(uint256)","3d40c266":"takeSellTokenOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)","3d412396":"JBXPERETH()","3d4197f0":"setVal(uint256)","3d424dc0":"ViewtBet(address)","3d4311e2":"getRoundCasteValues(uint256)","3d432808":"destroyTokens(uint256,address,uint256,uint8[],bytes32[],bytes32[])","3d436ea1":"getEthBullet()","3d438c1e":"TheHumanFund(uint256,string,uint8,string)","3d43bd1e":"replaceDSPRegistry(address)","3d44c476":"getLinkDigest(bytes32,address)","3d456aa5":"extendFreezeBy(uint256)","3d45b9ef":"TokenCLCC(uint256,string,string)","3d46b819":"getNonce(uint256)","3d472d4d":"devGiveBlockReward()","3d488c52":"getPackageNameOfCampaign(bytes32)","3d48c067":"testSmartContract(string)","3d493572":"setSoftCapReached()","3d49ba0f":"updateMemeUrl(uint256,string)","3d4a7c1e":"setStage1Ends(uint256)","3d4a8b4e":"ScholarToken()","3d4af864":"CatToken()","3d4b2c2c":"totalTokenBalance()","3d4ba37a":"setMajorityThreshold(uint256)","3d4d8d4f":"withdrawEarnings(address)","3d4ee7a0":"FundariaToken()","3d4ef007":"vestingCount(address)","3d509c97":"removeRewardToken(address)","3d532ac5":"SWEET(uint256,string,string)","3d532bde":"removeSchedules(uint256,uint256[])","3d536a2e":"joinGame(string)","3d54b48a":"CreaEther()","3d561f73":"getBattleboard(uint16)","3d565121":"lockup_enddate()","3d568185":"createSpecialCards(uint32,uint16,uint16)","3d56dca3":"getBecomeHostSignatureAddress(address,string,uint8,bytes32,bytes32)","3d582391":"setEndsAtUTC(uint256)","3d584063":"getManager(address)","3d58650a":"BreakCoinToken()","3d58d0c3":"DROP()","3d5905a9":"setHolderAddress(address,uint256)","3d595134":"changeDubiAddress(address)","3d59995c":"remoteSetWinner(uint256,string,uint256,uint256)","3d59cd60":"changeRoot(bytes32)","3d5a3016":"canGotoState(uint8)","3d5aed1d":"_subGene(uint256,uint256,uint256)","3d5b0124":"RCR()","3d5b2b4e":"GxDeploymentAdmins()","3d5bb7f4":"setDaVinci(address)","3d5d0720":"totalContributedETH()","3d5db1c2":"incrUserOnholdBal(address,uint256,bool)","3d5dfb63":"_Approval(address,address)","3d5dff53":"tokensOwed(address)","3d608572":"testControlCreateWithParentsSameItemId()","3d619212":"basePublicPlacement()","3d62fa80":"getByFromAndTo(uint256,uint256,uint256)","3d637ebe":"tokensCreationVIPsCap()","3d639d84":"_getItemPrice(uint256)","3d64125b":"balanceof(address)","3d6571e5":"blub()","3d65a59d":"ICG()","3d65cf9c":"initParams(address)","3d65ecdf":"payToProvider(address)","3d662cff":"tokenDestroy()","3d66da8e":"claimRefund(address,address)","3d6759ec":"_createAsset(address,uint256,uint256,uint256,address)","3d677067":"buyProp(uint256,uint256,uint256)","3d68011a":"PRCT_TEAM()","3d6839c6":"REAL(address)","3d6859f2":"investorInfo(address,uint256)","3d68d33f":"BTCP()","3d694f30":"approveSettingCreation(uint256,bool)","3d695002":"_addressNotNull(address)","3d69b403":"isOutcomeSet(bytes)","3d69f4d6":"outsourceDelivery(uint256,uint256,int256,int256,int256,int256)","3d6a2231":"DrepToken()","3d6a32bd":"createTradeContract(address,uint256,uint256,uint256,bool,bool)","3d6a3664":"setNewOracle(address)","3d6a58ea":"convertSgnToSga(uint256)","3d6a71e4":"endedAt()","3d6a9750":"ShowTickets(uint256,uint256,uint256)","3d6ab68f":"CREATE_PERMISSIONS_ROLE()","3d6ad962":"claimPrizes()","3d6b0cb7":"testFailCreateWithParentForeignNotInUse()","3d6b6c70":"increaseJackpot(uint256,bytes32,address,address,uint256)","3d6b7301":"readAddresses(bytes32[])","3d6bc807":"cancelEtherBroAuction(uint256)","3d6bcaef":"GetWagerData(bytes32)","3d6c4df7":"updateWallet(address,string)","3d6df0d5":"docHash()","3d6e38b8":"changedp1(address)","3d6e87c1":"cancelSaleByAddress(address)","3d6ea8b2":"confirmMany(bytes32[],address[],uint256[],uint8[],bytes32[],bytes32[])","3d6eec6b":"RootNo3(uint256,string,uint8,string)","3d6f3366":"TokenCrowdsale()","3d6fc91d":"SetDestination(address,address)","3d6fda19":"stopIssue()","3d709ff1":"getRemixCount(uint256)","3d724027":"setLock(address[],uint256[])","3d725831":"getFundedTokensByIndex(bytes32,string,uint256)","3d72c71b":"SimpleToken()","3d72f40f":"getUserP3DInfo()","3d73c2de":"reserveCATDestination()","3d73ddfc":"SGNL()","3d7403a3":"update(string)","3d741994":"preIcoStart()","3d747f67":"invalidateToken(address)","3d74e856":"setMinJackpotBet(uint256)","3d750b28":"found()","3d756973":"getWrapperData()","3d75c49e":"OEBCBank()","3d75e106":"ImportTestC()","3d7646f7":"getRok()","3d769e3d":"EXT_COMPANY_ONE()","3d76b7a3":"checkHash(uint256)","3d79c332":"ALU()","3d79d1c8":"bal()","3d7a8baf":"setQuoteKey(uint256)","3d7a8c0e":"POPKOIN()","3d7bed99":"addProxyForSender(address,address)","3d7c9f8c":"THB_Omnidollar()","3d7d3f5a":"createSaleAuction(uint256,uint256,uint256,uint256)","3d7daab3":"_isValidSignatureAndData(address,bytes)","3d7e1048":"TransferredUnlockedTokens(address,uint256,bytes32)","3d7f09a3":"editEtherLimit(uint256)","3d7f6536":"getGraffiti(uint256)","3d80b532":"balance(string)","3d80ea28":"claimUSInvestorTokens()","3d813d8b":"setBountyAmounts()","3d814377":"window3StartTime()","3d820a90":"TOKEN_RATE_PRESALE()","3d8270f5":"getContributor(address)","3d82cf5a":"maxBattleRounds()","3d82e1b1":"assertEq3(bytes3,bytes3,bytes32)","3d82f71e":"distributeEGOX(address[])","3d832080":"ownerSetJackpotOfHouseEdge(uint16)","3d83230f":"auctionSuccessful(uint256,uint128,address,address)","3d83ed36":"increaseQuota(uint256,uint256,address)","3d84b8c1":"mintedForAccount(address)","3d856c9b":"getCmasByOwner(address)","3d8731ac":"LOCK_MAX()","3d8807f8":"cardsOfOwner(address)","3d888aa5":"PerformAirDrop()","3d8a03af":"getMatch()","3d8a63e4":"scam()","3d8b41f3":"createBurnRequest()","3d8c3dc9":"addTotalSupply()","3d8c5af4":"oddsSingle(uint256)","3d8c9b8c":"purchaseWolk(address)","3d8d020a":"withdraw(address,address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","3d8d0db4":"totalBuyPrice(uint256,uint256)","3d8e0f4e":"checkRevert2(uint256)","3d8e1b7c":"sumICOStage6()","3d8e2947":"getFileAddress(bytes)","3d8f89d7":"setBooleanValue(string,bool)","3d908c82":"distributeTokensToAllUsers()","3d90d44d":"addPowerSource(address,uint256,uint256)","3d90eeb9":"getCartSubtotal(address)","3d91eec0":"NebbexToken(uint256,address)","3d922f90":"depositar()","3d9277f0":"unlockTip(bytes32)","3d9287fa":"whitelisted()","3d937410":"CokecoinTokenTest()","3d937824":"setCompte_35(string)","3d93a355":"InTokenTest12(uint256,string,uint8,string)","3d944953":"withdrawCollectedResources()","3d946410":"isPreSalePeriod()","3d946c53":"restartElection()","3d94e23b":"viewXCAT(address,address,bytes32)","3d955aa3":"poll(uint256)","3d956691":"tokensToSell()","3d957b0b":"third_bonus_amount()","3d960ec3":"round2Sold()","3d96c758":"TreeLim()","3d96fa3c":"getAllDelegatorAddress()","3d972839":"withdraw(uint16)","3d9aa932":"oraclize()","3d9ad7ce":"SENIUM()","3d9aeef0":"isBetStorage()","3d9af4d1":"setMigrateDueToNoReports(bool)","3d9ce89b":"scheduleCall(bytes4,bytes,uint256)","3d9dcb07":"getFamedStarByID(uint256)","3d9e23ca":"PartnersFund()","3d9e4233":"registerAlbum(bytes32[],bytes32[],bytes32[],bytes32[],bytes32,bytes32)","3d9f01fb":"renterOf(uint256)","3d9f923b":"updateDenomination(bytes8,address)","3da01325":"blockUser(address)","3da04e4a":"getUserGroups(address)","3da06d6c":"getTemporaryWinningFaction()","3da09d40":"Ripple()","3da0ac79":"compare()","3da1c0c3":"isVerifiedUser(address)","3da1eff5":"claimOwnerSupply()","3da1f79a":"revokeSignature(uint256)","3da216da":"LuckyMoneyToken(uint256,string,uint8,string)","3da32dc5":"FcsCoin()","3da368c0":"ETHcomeback820()","3da4ba4a":"AiboCoin(address,uint256)","3da55aba":"setZlotsAddress(address)","3da5c3ce":"puzzle(address,bytes32)","3da5d173":"ZeroExExchange(address,address)","3da611cd":"ContractEthLimitChanged(uint256,uint256)","3da64a06":"issueTokenToGuaranteedAddress(address,uint256,bytes)","3da69ff4":"Salome()","3da76788":"getDataLength()","3da79946":"allEthOUT()","3da80d66":"contains(address[],address)","3da98498":"Crowdtes()","3daa33d5":"buyAndSellPrice()","3daad222":"asmTransferFrom(address,address,address,uint256)","3dab45b6":"setMtdPreAmount(uint256)","3dabb0f6":"verifySignature(address,address,uint8,bytes32,bytes32)","3dac68b7":"setAddressAdv(address)","3daceda1":"createSyndicate(address,uint256,uint256,uint256,uint256)","3dad1583":"getAyes(uint256)","3dae94f0":"cumulativeIndexOf(uint256[],uint256)","3daee1b8":"weekThreeRate()","3daefe4b":"Election1()","3daf099f":"transferEthereum(uint256,address)","3daf31b5":"withDecimals(uint256,uint256)","3dafbf92":"SNPToken()","3db05068":"toForecastData(uint8,uint8,bool,uint8,uint8)","3db08826":"isProofValid(bytes32[],bytes32)","3db13fec":"PalletOneToken()","3db1c253":"projectFailed()","3db1f00a":"TOSMidHoldingContract()","3db2254b":"deleteAllReports()","3db2a12a":"Empty()","3db36b5f":"transferTokensFromTeamAddress(address,uint256)","3db3f2cf":"submitBid(address,bytes32)","3db62953":"currentExchangeSystem()","3db7a118":"blockDotDifficulty()","3db7c149":"SmartCityCrowdsale(address,address,address,uint256,uint256,uint256)","3db7e347":"contributorAt(uint256,uint256)","3db80346":"closeGroup(uint32)","3db8352d":"setEvaluator(uint256)","3db8433c":"setLeagueRosterAndCoreAndContestContractAddress(address,address,address)","3db8493a":"put(uint256,string,string)","3db9c4aa":"createIntention(address)","3dba0b57":"MCTTokenAddress()","3dba6197":"etherAccumulator()","3dbad089":"Contribute(address,address,uint256)","3dbae017":"EasyToken()","3dbae9f9":"startIcoTwo()","3dbb07ac":"s28(bytes1)","3dbb270d":"AshCashToken()","3dbb7f46":"setPrizeFundFactor(uint256)","3dbb874e":"getPetClaims(uint64)","3dbba05c":"callDefaultRelease()","3dbc7c69":"totalApproval(address)","3dbe56f0":"getUnfreezedTokens(address)","3dbe6469":"ChangeBuyer(address)","3dbedbd4":"StopICO()","3dc02266":"fipsRegister(uint256)","3dc09a70":"OwOToken()","3dc0d600":"nome_vincitore()","3dc11dd1":"ethSwapRate()","3dc1579a":"RELEASE_TIME()","3dc19db8":"addAdministator(address)","3dc1a6bc":"getSkillLength()","3dc1ef34":"limitMaxSupply()","3dc23486":"_addBalance(address,uint256,address)","3dc268a6":"oraclize_query(uint256,string,bytes[2],uint256)","3dc286ae":"getEncSeckey()","3dc37539":"reveal_test_data(int256[],int256)","3dc38fc1":"addCourse(uint256,uint256)","3dc4cac9":"Mycryptonline()","3dc58149":"getDepositRecord(address)","3dc5bf97":"acceptRegistrarTransfer(bytes32,uint256)","3dc60e52":"getKittyCount(address)","3dc6e9b0":"changeMaxLockDuration(uint256)","3dc7426e":"setMaximumMintableQuantity(address,uint256)","3dc7c549":"sumHardCapICO()","3dc7ea7f":"recently_added_address()","3dc9124e":"numOfLoadedCrowdsalePurchases()","3dcb0b81":"PollManagedFund(address,address,address,address,address,address,address,address[])","3dcb66db":"Storer()","3dcbab40":"UnFrozenFunds(address,uint256)","3dcbf7eb":"addAddressToAccountFor(address,bytes,bytes,address,bytes32)","3dcd351f":"getAllReceipt()","3dcd6176":"returnTokenBalance(address[2],bytes32)","3dce1ea9":"curPayoutId()","3dced193":"getPI_edit_33()","3dcf59ca":"initiateMigration(address,address)","3dcfbdd0":"getBrickAddress()","3dd00c42":"getMyMinersAt(uint32,uint32)","3dd02f06":"setCoinStorage(address,address)","3dd16673":"teamETHAddress()","3dd287d4":"monsterNFTContract()","3dd297da":"safeMultiply(uint256,uint256)","3dd2b811":"CSNO()","3dd2e0f0":"optionTotalTimes()","3dd35279":"memberIndex(address)","3dd5b2da":"withdrawContractETH()","3dd5e0ec":"NewSouth21Token()","3dd7609a":"ETHER_AMOUNT()","3dd7b14b":"optionPoolBalance()","3dd7c1b9":"newProduct(string,string,uint256,uint256)","3dd82637":"Transformers()","3dd83fe1":"newPlayer(address,uint256,uint256)","3dd86478":"isFromState(address,address,uint256)","3dd93a8a":"getUsersGeneratorsIds()","3dda1aff":"Football()","3dda37dc":"flags(address,address)","3dda7b1d":"fuddToken()","3ddac459":"changeminpresale(uint256)","3ddb77bd":"_distDay()","3ddc3277":"charityFoundationIdx()","3ddc8e9c":"fixedLoge(uint256,uint8)","3ddcbace":"Escrow(address,address,address)","3ddd4698":"registerNameXaddr(string,address,bool)","3ddd5313":"acceptPayments()","3dde1598":"redeemBattleCrates()","3dde3918":"removeAdministrators(address)","3de035bf":"endWork(uint256)","3de1a4bc":"getDepositPool()","3de24c17":"refundInvoice(address,address)","3de33a32":"doIssueTokens(address,uint256)","3de377ec":"mock(uint256)","3de39c11":"maxGasPrice()","3de3ebf8":"getPlayerEnergy(address)","3de3fbd9":"totalTokenRewards()","3de4ca9e":"Karma(address,address)","3de4eb17":"getAdopters()","3de696d3":"percentFeeTimes5()","3de6a03f":"checkStatusICAP(bytes32,uint256,string,address)","3de7dfb1":"Amount_of_Chi_for_One_ETH()","3de8c792":"BUYER_STEP_4(bytes32,uint256,bytes1,address)","3de8d340":"dividendsBlocks()","3de9c8e6":"haltFundraising()","3de9e4c6":"__transferFromWithReference(address,address,uint256,string)","3dea6b9a":"getMeme(uint256)","3deaa297":"transferAllDividends()","3deaa323":"minPurchaseLimit()","3dead9e8":"Mythereum()","3deaf6d4":"MAXIMUM_FIRST_DAY_CONTRIBUTION()","3deb23d2":"STANDARD_RATE()","3deb91c7":"setMinReserve(uint256)","3debd2d8":"sendToAddress(address,uint256)","3dec4cb3":"pre_ico_start()","3dedc36e":"getGunByIdPart2(uint256)","3dee7237":"amountOfBPs(address)","3def449b":"FipsNotary()","3defb962":"heartbeat()","3df08c6a":"privateSalesTokensSold()","3df16377":"make_move_and_claim_victory(uint256,uint8,uint8,uint8,uint8,uint8,uint8,uint8)","3df18d2a":"model(address)","3df18e0a":"bytes32ToHex(bytes32)","3df19507":"intToDec(uint256)","3df2b29d":"powerDown(address,address,uint256)","3df2b723":"adminClaimAirdropMultiple(address[],uint256[])","3df2d6fd":"FIGHTMONEY()","3df40c7a":"startPreIcoDate()","3df4a282":"setCurrentSaleDayAndBonus(uint8)","3df4ddf4":"first()","3df5140c":"setIsTokenCanBeSell(bool)","3df5958f":"VillanovavsRadford()","3df6b23c":"angelRound()","3df76482":"fipsPublishData(bytes20,bytes)","3df77c0e":"testBalanceOf()","3df7c86d":"mom()","3df86f79":"split32_20_12(bytes32)","3df91162":"getUpdatable(bytes20)","3df95fc9":"HAYATO()","3df96853":"carIdToRenter(uint256)","3dfa0384":"messageSenderAddress()","3dfa1c46":"LLV_v31_5()","3dfb4843":"renewDeed(bytes32)","3dfc42c8":"TdeFinalized(uint256)","3dfc6980":"set_verifiedUsersOnlyMode(bool)","3dfca2ad":"finishVoting(address,uint256)","3dfcdf2b":"CoinVila(address)","3dfd288a":"checkVotingForTransferWeiFromExchangeToPayment()","3dfd83c6":"SPARCToken()","3dfeac48":"MaximalInvestmentChanged(uint256)","3e00b910":"buyTokenPreIco(address,uint256)","3e011b11":"getTokensBackAFterCorwdsale()","3e032a3b":"slippage()","3e03c84f":"tokenIsLocked(address)","3e03d50f":"isTeam(uint256)","3e0448c2":"ChangedId(address,string)","3e045845":"issueSecurityTokens(address,uint256,uint256)","3e04bf23":"upgradeShip(uint32,uint8)","3e058664":"getBonusPercentRate()","3e05c964":"withdrawnByBeneficiary()","3e05ca7c":"get_PendingGains(address,address,uint256,bool)","3e05e01b":"ethReward()","3e0663e0":"AdminDrawProcess()","3e06be20":"downgradeToBasic(bytes32)","3e07905e":"endBuffer()","3e0807ca":"numberBtcUpdates()","3e0831e2":"putStoWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","3e083f7d":"deals(uint256,uint256)","3e085c3d":"airDropToOldTokenHolders(address[])","3e085d0e":"transfer(address,uint48,bytes,string)","3e087d01":"addEligibleBurner(address)","3e0912ec":"KangEOS()","3e093f38":"testPullWithTrust()","3e09876a":"vehicleFound(address,uint256)","3e0a322d":"setStartTime(uint256)","3e0a51b4":"TweetAccount()","3e0a7ab5":"addONG_AUDIT(bytes32,string,string)","3e0aba92":"fourth_release(uint256)","3e0ad2d4":"TPC(uint256,string,string)","3e0aedaf":"TreePlusToken()","3e0b7eb2":"updateTranscoderWithRewards(address,uint256,uint256)","3e0c1f2a":"fetchNextSnapshotBlock()","3e0d4f4a":"ApproveContractorProposal()","3e0dfbdf":"getInvestorByAddress(address)","3e0efe67":"putBtcWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","3e0fddbd":"ClaimHodlToken(address,uint256,uint256)","3e1092f2":"changeModuleRegisterOwner(string,string,address)","3e109a19":"minBid()","3e112bf3":"calcResult(uint256,uint256,uint256)","3e112ed7":"reserveCoins(address,uint256)","3e11456f":"PRIVATE_SALE_ACCOUNT()","3e11741f":"sellToken(address,uint256,uint256)","3e118dbe":"_version()","3e118f1f":"weiMinSaleIco()","3e11b765":"batchApprove(address[],uint256[])","3e11e378":"changeController(address,address)","3e127ab7":"maxPoly()","3e127e76":"safe_add(uint256)","3e129967":"SpaceWar()","3e1457a1":"initRates(uint256[],uint256[])","3e152d8e":"maxBonusTickets()","3e15346d":"removeGlobalConstraintPost(address,int256,address)","3e156601":"p_setMinInvestment(uint256)","3e15ef90":"GetDataPoint(uint256,uint256,bool,string)","3e165810":"initBMC(address,uint256,uint256,uint256,uint256)","3e175c0b":"goldUnFreeze()","3e17b882":"mutateCrabPart(uint256,uint256,uint256)","3e18117a":"AhooleeToken()","3e182d3f":"addSelctFight2Death(address,uint256,uint256,uint256,uint256)","3e18e78e":"endTimeinMinutes()","3e1a3376":"updateInvestorsComission(uint256)","3e1a420f":"publishRewardlessTaskListing(string,address,uint256,uint256)","3e1a9300":"getLastIndex()","3e1b0d29":"fechAllVotersBySnapshotBlock(uint256)","3e1b4645":"qualifiedAddress(address)","3e1b5b3e":"rateEarlyStage4()","3e1ba676":"subBountySupply(uint256)","3e1c01b5":"capitalAllocation()","3e1c2d5a":"RegisterKey(address,string)","3e1cc152":"fundWallet2()","3e1d8156":"Issue(uint256,address,uint256)","3e1da046":"isDelegateOf(address,bytes8)","3e1e292a":"testCopy(bytes)","3e1eab35":"VUTEST2()","3e1fd0da":"checkAccess(bytes32,address)","3e20f7fb":"HashnodeTestCoin()","3e214e96":"changeAirDroper(address)","3e2153bf":"viewBeneficiaryDetails(address)","3e21b00f":"C40Coin()","3e239e1a":"getHour(uint256)","3e23ee7e":"executeTrade(address,address,uint256,uint256,uint256)","3e23ee9c":"BlackHorseWallet()","3e24fcbf":"capHicsToken()","3e254a0c":"YTCOMMUNITY()","3e2557c5":"_price_tokn_ICO_second()","3e25e837":"withdrawCommission()","3e25fdd4":"getLastStellar()","3e260a2c":"allocateReserveTokens()","3e262e46":"getTradeOfferSender(uint256)","3e2640d6":"extendClosingTime(uint256)","3e2729bf":"isRevocated(bytes)","3e27e1be":"validateResetDeadTokens(uint256)","3e28912f":"getStrField3()","3e2d6cf6":"_emitWithdrawn(address,uint256,address)","3e2d7004":"getTokenRate()","3e2d7de1":"mintTokensWithIncludingInJackpot(address,uint256)","3e2ddb60":"changeMajorThreshold(address,uint256,bool,bytes)","3e2e806d":"rewardTokensFloor(address,uint256,uint32)","3e2ee39e":"debug_resetuser()","3e2fce37":"updAutoFreeze(bool)","3e2fe149":"getNewOwner()","3e30046a":"maxSale()","3e30838d":"delOperator(address)","3e313f28":"_changeColour(uint256,uint8,uint8,uint8)","3e31c77f":"setZoPrice(uint256)","3e321249":"PdexToken(address)","3e32224a":"BF1Token()","3e325589":"init(address,address,uint256,int8)","3e326048":"initWallet()","3e32bea2":"priceIncreasePerPurchase()","3e33c37b":"gameContext(uint256)","3e345bd8":"FatherToken()","3e34f34e":"isUserHasPermissonToModify(address,string)","3e351a45":"lotteryWinner()","3e352d49":"updateTokensForEtheeraTeam(uint256)","3e361281":"betsWon()","3e362c96":"bountyCount()","3e363696":"BuyWithPathwayFromBeneficiary(address,uint256)","3e3657a5":"addConfigEntryInt(bytes32,uint256)","3e3756db":"PauseOn(uint8)","3e379d64":"setBonus()","3e38a2b7":"delegateCount()","3e38dab8":"refundFlip(bytes32)","3e3926e4":"whitelist(address,uint256,uint256,uint32)","3e3b429a":"canPurchase(address)","3e3bc743":"AmazingDex(address)","3e3c9eae":"qsize()","3e3cba8f":"changeBalancesDB(address)","3e3ce4f3":"GSEN()","3e3d64e2":"hatchingsNeeded()","3e3dae41":"maximumSaleLimitUnits()","3e3deb8b":"MyMonsterCount(address)","3e3dff65":"GainsCalculated(address,uint256,uint256,uint256,uint256)","3e3e0b12":"stopMinting()","3e3ee859":"NewQuestion(string,bytes32)","3e3f4e24":"RealEstateCryptoFundAirdrop(address)","3e40aab4":"returnActions(uint256[8],uint256)","3e412533":"Easy()","3e415358":"transfer(address,uint256,address,address,uint256,uint8,bytes32,bytes32,uint256)","3e41d5eb":"addOwnersWithHowMany(address[],uint256)","3e427e89":"returnHostAndCreatorCut(uint256)","3e42ad79":"Instantium()","3e42ed80":"ProgressiveToken(string,uint8,string,uint256,uint256,uint256,address)","3e43b652":"betValueOf(address)","3e43e8b4":"AnimeToken(address,uint256)","3e441ef4":"SetItem(address,uint256,address)","3e445446":"STARTING_KILOS()","3e445506":"successfulPreSale()","3e44694f":"DID()","3e4476a3":"addAddressToJackpotParticipants(address,uint256)","3e450fff":"adminDeleteAccount()","3e4565d2":"testErrorUnauthorizedNameRegister2()","3e4604b3":"robotAddr()","3e460a84":"distributeBooking(uint256)","3e46eb60":"fortune_endauction(uint256)","3e476053":"moveFunds(address,uint256)","3e4852bd":"getGroupData(uint256)","3e4882fc":"AddressChangeConfirmed(address,address)","3e49077a":"createSaflokKey(bytes32,bytes32,bytes32,bytes32)","3e49776b":"VOLUME_5()","3e49820d":"changeTicketCap(uint256)","3e499dff":"addKYC(address)","3e49bed0":"setInt(bytes32,int256)","3e4a9263":"enforceSecondLock(address,address)","3e4b20cf":"updateGameSpecifics(uint256,uint256)","3e4b2570":"investorsAllocation()","3e4bdce4":"hasAccountPendingOrders(address)","3e4bee38":"GOLD()","3e4c0c82":"player_1(uint256)","3e4c9534":"getInvestmentMin()","3e4d914e":"lastBlock_f12Hash_uint256()","3e4e0432":"notifyOfArbitrationRequest(bytes32,address)","3e4f49e6":"state(uint256)","3e4ffa9b":"getImage(uint256,bytes32[],uint256,uint256)","3e5087cc":"testBasicThing()","3e50b0b8":"sendOwnerEther(address)","3e50de30":"calculateRewards()","3e510870":"transferOPSPool()","3e52d5c6":"openBoxes(uint256[])","3e531e0d":"queryGameStatus(uint256)","3e53ccee":"actualPriceDivisor(uint256)","3e5442bd":"getBitsoAddress()","3e546675":"DelegateDualOwnable(address,address)","3e55eab0":"parcipateCrowdsaleInvestor(address)","3e5615bc":"FourToken()","3e568fe7":"GetDaysInOffice()","3e56f9f9":"getPayout(uint256)","3e57324e":"EmergencyPause()","3e586a81":"BeatTokenEthPriceChanged(uint256)","3e589050":"changeKeys(string,bytes1[])","3e58a465":"getShareList()","3e58c58c":"send(address)","3e592d50":"ResourcesOwner(uint8,address)","3e5933fe":"removeAll(address[])","3e5a2024":"MyActive()","3e5ac28f":"toggleTransfers()","3e5b15e1":"addCoin(bytes4,address)","3e5b5e39":"addPrecommitment(address,uint256,bool)","3e5b7fec":"TwoPhaseAuction()","3e5beab9":"allowance(address)","3e5cee05":"issueIOU(string,uint256,address)","3e5d5cee":"sellPriceAtIndex(uint256)","3e5d901e":"autoTokenSent()","3e5daf02":"startRoundC()","3e5edb1d":"REFUND_LOCK_DURATION()","3e5efd92":"clearProcessedBet(uint256)","3e5fbedd":"NOTNCoin()","3e5fd9b5":"dEthereumlotteryNet(address,address,bool,address)","3e604f48":"registerAadharDetails(string,string,string)","3e6075a4":"battleCountOf()","3e60c83a":"acceptMediation(uint256)","3e62d835":"setNumberOfOutcomes(uint256)","3e650c15":"withdrawalUser()","3e65a153":"longMul(uint256,uint256)","3e675cb0":"changeMaxValueBetForEmission(uint256)","3e6784b8":"ATLToken()","3e68119b":"setDebugNumber2(uint256,uint256)","3e681375":"totalDropAmount()","3e68680a":"create(address,address)","3e68aa3a":"getTopWinners(uint256)","3e68dea3":"BaseAccountService(address,address)","3e693ffd":"AppSet(address)","3e6968b6":"getCurrentDay()","3e6a569a":"claimReward(address,string)","3e6a6a31":"beneficiarySend()","3e6b16d9":"setShowInterval(uint256)","3e6c0637":"getFirstStartableIndex()","3e6d4e12":"getOptional(uint40)","3e6d6a6b":"setAdvisorAddress(address)","3e6d6d0b":"removeMastercardUser(address)","3e6d6d26":"withdrawAllTokens(uint256)","3e6d9770":"investments(address,uint256)","3e6e0adf":"whiteListPeriod()","3e6e2a73":"_mintEstate(address,string)","3e6eaa03":"mint(uint32,address)","3e6f118a":"blastOff(address)","3e6f4160":"roundParameters(uint256)","3e709982":"isDefValid(uint8,uint8,uint8,uint8,uint8)","3e715da2":"logPromiseFulfilled(uint256)","3e721015":"getFunds(uint256)","3e72b2bb":"addMembers(address[],uint256[])","3e72df41":"ff(string)","3e76018b":"getNextMinimumBet()","3e7614cd":"TIER3_PRICE()","3e764fdb":"_getNewFloorGene(uint256)","3e774409":"_mint(address,address,uint256,bytes,bytes)","3e77dcfb":"setPercentages(uint8,uint8,uint8,uint8,uint8,uint8)","3e786d80":"DickheadCash()","3e788ba3":"getRequestState(address,address)","3e78afd8":"ReferrerBonusTokensTaken(address,uint256)","3e78cf7a":"transactionFeeMin()","3e798e83":"calculateUserCommission(uint256)","3e799335":"RefundManager()","3e79e4c2":"customerPolicies(address,uint256)","3e7b684d":"NBAT(address,address,address,address,address)","3e7bb43c":"transferKycOwnerShip(address,address)","3e7cb0d3":"verify(uint256,bool)","3e7d081a":"emitBoardClosed(uint256,bool)","3e7d1acc":"currentAllocationLength()","3e7e250e":"GetDynamicCardAmount(uint32,uint256)","3e7e30ba":"poolPercentage()","3e7e42fa":"initialCreatorAccount(uint8)","3e7e70a4":"tokenBuyerWallet()","3e7e730d":"addressToReceiverToAmountAllowed(address,address)","3e7f26a5":"heroIdToBuyer(uint256)","3e7f54a9":"updateAppInstance()","3e803343":"subIsSafe(uint256,uint256)","3e80cbc6":"adminUpdateWallet(address)","3e81ba66":"preBountyAdded()","3e81d56e":"calculateProviderFee(uint256)","3e82055a":"addSignature(uint256,bytes16,bytes)","3e82eca7":"getAddressOne(address)","3e83f6cd":"Nickelcoin()","3e83fe36":"getMyShares()","3e84b266":"priorityPassContractAddress()","3e853128":"getGasForXau(address)","3e85713d":"marketingReserve()","3e85755a":"bonusInPreSalePhase2()","3e859fcb":"updateCap(uint256,uint256)","3e8616c8":"setBullAmount(uint256)","3e867089":"setDelegadoDeEscuela(bytes32,bytes32,uint256)","3e8686cc":"getSubmission(uint256)","3e86a2e5":"transferToAddress(address,uint256,bool,bytes)","3e870d63":"subHashrate(address,uint256)","3e8786a1":"reclaimFund(address)","3e87d301":"tokenPriceInEuroCents()","3e8817aa":"getPaymentAmount()","3e88d93b":"getRecorderID(address)","3e89340f":"lockStatus()","3e8a0585":"Bidding()","3e8a0bc9":"lockdown()","3e8a76e4":"CommerceBlockToken(address)","3e8a9439":"proposalDestination()","3e8b1dd7":"claim(bytes32,uint256,uint256,uint8,bytes32,bytes32)","3e8be2e1":"reTweetRewardPool()","3e8c34e5":"cardboardUnicornTokenAddress()","3e8cc273":"doBlockContract()","3e8ce607":"successfully_closed()","3e8cee07":"getPOOL_edit_5()","3e8cfa26":"Nut(uint256,string,uint8,string)","3e8d6e9f":"multyTx(address[100],uint256[100])","3e8d97e7":"underwriteToken()","3e8eca23":"plusFreezingTime(uint256)","3e8f5b90":"setConfig(string,uint256)","3e8f682f":"setETHFee(uint256)","3e8ff43f":"converterType()","3e904876":"devexit()","3e9196b4":"NokuTokenBurner(address)","3e91a622":"LOCToken()","3e92128c":"gettruelevel(address,uint256)","3e92fa26":"claimComputation(bytes,bytes,uint256)","3e9491a2":"revenue()","3e94c904":"collectionOf(address)","3e955225":"getN()","3e95c9b6":"MOONTRAIL()","3e95f06d":"_handleProductionDecrease(address,uint256)","3e96c107":"People(uint256,string,uint8,string)","3e96d28e":"setReleaseAgent()","3e96e868":"addRole(string)","3e9744da":"walletBountyAndAdvisors()","3e9761b4":"projectIndex(uint256)","3e97db0d":"changeMainWallet(address)","3e97ee6c":"isOwnerOfAllPlayerCards(uint256[],address)","3e98039a":"multiOwnerSides()","3e9836c6":"oraclizeGas()","3e98b93a":"getAvatarCount(address)","3e99633f":"haltIEO()","3e997e71":"isPeronalLock(address)","3e99a35e":"BitMantas()","3e99c395":"isValidPublicKey(uint256,uint256)","3e99d2c9":"Foo(string,string)","3e99e26a":"SellableToken(address,address,address,uint256,uint256,uint256,uint256)","3e9b4c24":"CNToken()","3e9bee1b":"getBalanceDivis(address)","3e9c77f9":"ListingRegistry(uint8,uint8,uint8,uint8)","3e9e9f26":"distributeCallback(uint256,uint256,address[])","3e9eb6c1":"recursive_read(uint256)","3e9ed7e4":"burnSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","3e9f9664":"withdrawItem(address,uint256)","3ea053eb":"deactivate(address)","3ea0fb3e":"getCurrentPrice(uint32)","3ea11222":"createGame(uint256,address)","3ea14a4f":"escFund()","3ea252eb":"finalOptions()","3ea2cde5":"addFiatCurrencyRaised(uint256)","3ea376fc":"changeAdmin(address,address,bytes32[3],bytes32[3],uint8[3])","3ea3c2bb":"_updateFundingGoal()","3ea3e42f":"AgriChainRootData()","3ea3f6c5":"activateRegistrar()","3ea51dc2":"ZIRC()","3ea556da":"getEtherForTokens(uint256,uint8)","3ea5cdba":"MIN_INVESTMENT_ICO_PHASE_ONE_POUNDS()","3ea69d76":"setEmployee(address,bytes32,bool)","3ea6c986":"ltcRaised()","3ea75e3d":"addJobContractMessage(address,address,address,string,uint256)","3ea79cb1":"MSCToken()","3ea89fd1":"popQueue()","3ea97009":"initialToken()","3eaa7643":"eligibilityRate()","3eaa8128":"buyCovfefe(uint256)","3eaab2dc":"FabotCoin()","3eaaf86b":"_totalSupply()","3eac48a0":"getTotalVoter(address,address)","3eac5cac":"PayingBackContract()","3ead67b5":"changeContractOwner(address)","3eadb6db":"nextPhase()","3eae396f":"GodzSwapGodzEtherCompliance()","3eae8ac8":"SkillChainPresale(uint256,uint256,uint256,address,uint256,address,address)","3eaf5d9f":"tick()","3eaf7591":"makeVote(uint256)","3eaf9923":"right68(uint256)","3eafec21":"sellTokens(address,address,uint256)","3eb10ab3":"FundAccount()","3eb1d777":"setStage(uint256)","3eb1eb1a":"issuingBody()","3eb2a37d":"priceCreatingChannelChanged(uint256,uint256)","3eb2b5ad":"addTeamMember(address)","3eb2cb02":"totalSquareStakesByUser(address,uint256,uint256)","3eb34e09":"AlterContactName(bytes32,address,bytes32)","3eb3aaad":"_getClosingObligation(bytes32)","3eb51dc4":"releaseForTeamAndAdvisor(address,uint256)","3eb54d80":"Pele()","3eb578bf":"ADVISER_STAKE2()","3eb5caca":"setProductType(uint8,string)","3eb610f5":"_requestContractApprove(bytes32,address)","3eb76b9c":"castVote(uint256)","3eb78420":"mainFundAccount()","3eb7dbc0":"FoxTradingToken()","3eb96aed":"DrunkCoin()","3eba223c":"CopyTokens()","3eba9ed2":"setBooleanValue(bytes32,bool)","3ebb047f":"allowanceTransfer()","3ebb2a17":"CreateTokenToMarket(address,uint256)","3ebb2d6b":"instructOracleToDistribute(uint256)","3ebbf394":"BergCoin()","3ebc2ab3":"isCompromised(address)","3ebc457a":"closeCurrentFeePeriod()","3ebd6092":"checkPermission(uint8,address)","3ebdc754":"setDiscipleSale(uint256,uint256)","3ebfc934":"transferFrom(address,address,string)","3ebfdaaf":"Swap()","3ebfde04":"proceedPreIcoTransactions(address[],uint256[])","3ec045a6":"auditor()","3ec16194":"calculateShares(uint256)","3ec1d668":"Vendor(bytes,uint256)","3ec27341":"getConfigAddress()","3ec27c4a":"setTimeRangeGen0(uint256)","3ec36b99":"commitVotes(uint256[],bytes32[],uint256[],uint256[])","3ec3aedc":"executeSell(address,uint256,uint256)","3ec414c8":"editMeta(string,uint256)","3ec48a2e":"move()","3ec548b6":"initLottery(uint16,uint256,uint8,bytes32)","3ec6a4c4":"getContributorsCount(address)","3ec6dac2":"getSize(bytes32)","3ec862a8":"hatchEggs(address)","3ec8d571":"TronToken(address,address)","3ec8ec5a":"getFinish()","3eca264e":"getWithdraw(address)","3eca443b":"generatedTokensSale()","3eca48db":"BonusesAllMinted(address)","3ecae564":"canSend(address,address,bytes32,uint256,bytes)","3ecafef5":"isIcoStart()","3ecb9884":"frozensDetail(address)","3ecbbf39":"list(address,address)","3ecbf72a":"_find(address)","3eccca1e":"transferAllTokens(address,address)","3eccd456":"initializeSale(address[5],uint256[6],uint8,bytes32,bytes32,uint256,uint256)","3ece9c61":"teamHoldAmount()","3ecf965f":"rateETH_BCDT()","3ed01e02":"takerDispute(uint256,uint256,uint256)","3ed03798":"addToStat(uint256,uint256)","3ed0619b":"stabilityBoardProxy()","3ed08dc9":"balanceOfEthFee()","3ed0a373":"getDepositAtIndex(uint256)","3ed0f52c":"setCustomBonus(address,bool,bool,address)","3ed10b92":"allowances()","3ed23f91":"BlockPayeeToken(uint256,string,string)","3ed28f39":"getUniCoinSize()","3ed2d908":"buyerTokenName()","3ed35855":"removePayee(address)","3ed38181":"setInvalid()","3ed3d6a6":"getthird(uint256[])","3ed4006b":"OwnerCashout()","3ed4c4c8":"phaseAddtlInfo(uint256)","3ed58536":"record_human_readable_blockhash()","3ed5d456":"finishReplayPhase(uint256)","3ed620a4":"updatePrices(uint256,uint256,uint256)","3ed66d3d":"sellMintingAddress(uint256,uint256)","3ed70628":"SCPSToken(uint256,string,string)","3ed72caf":"icoTokenAddress()","3ed731bc":"makeCollectibleUnavailableToSale(address,uint256,uint256,uint256)","3ed7530d":"amountOfPerRelease()","3ed8ff25":"TotalFeesReceived()","3ed9bc86":"initializeToken()","3eda009b":"rewardRound(uint256)","3eda062c":"updateTap(uint256)","3eda7b88":"contractorTransferFrom_Scoupon(address,address,uint256)","3edab9d0":"AuctionCanceled()","3edaf264":"stopBounty()","3edbd76e":"GetChallengeCreator(uint256)","3edc65d3":"recordWithdraw(address)","3edc69b8":"maxAbsKindness()","3edcd61f":"times8()","3edd1128":"deposit(address,uint256,bool)","3edd90e7":"NewOwner(address)","3edddc0a":"incrementWrite()","3edef04b":"limitPreIcoTokens()","3edfd954":"mint(address,uint256,uint256,uint256,string)","3edfe35e":"ethPriceInCents()","3ee066e5":"sspRegistry()","3ee0c627":"currentBadge()","3ee2dd16":"FunGame()","3ee39cee":"testCannotActivateBeforeDeployingANT()","3ee3f499":"validateHash(bytes32)","3ee5313f":"SetState(uint256)","3ee58d13":"testBurnGuyAuth()","3ee5f2e4":"BreakToken()","3ee6d933":"rndInit_()","3ee6de34":"work(bytes32[])","3ee71e85":"NortontokenERC20(uint256,string,string)","3ee788e1":"_updateLoveStory(bytes16,bytes32,bytes32,uint256,string)","3ee7ab85":"airdropUpdateToken(address[],uint256[])","3ee822f4":"setAllLocations(uint256[])","3ee8747a":"isOrganisationExits(address)","3ee89a63":"withcom()","3ee90a29":"FOUNDER_STAKE()","3ee9d648":"lastGameId()","3eea5150":"milkTotalSupply()","3eeafccc":"getCountryStats(uint256)","3eeb3235":"geCompoundTimestampsFor24Months(uint256)","3eebc589":"isMarketManager()","3eed3822":"bigPrice()","3eed5d17":"Cipher()","3eeda7d3":"deliverTokens(address,uint256,string,bool)","3eedabcf":"getMelonAsset()","3eedf7d8":"getCurrentAuctionPrices(uint128[])","3eee36c6":"_split(uint256,uint256,uint256)","3eee83f1":"addAcceptedToken(address)","3eeeb1c3":"fastEscape()","3eefe239":"mintReservedTokens()","3eefef7b":"testFailTransferFromSelfNonArbitrarySize()","3ef06b6b":"previousprice()","3ef0784e":"configurationGenericCrowdsale(address,uint256,uint256)","3ef13367":"flushTokens(address)","3ef37e30":"REFUND_PERCENT()","3ef39571":"isRequireData()","3ef4691f":"MyFreeCoin(uint256,string,uint8,string)","3ef4c16b":"withdrawVPC0xTokens(address)","3ef4f4ca":"world(uint256)","3ef5aee9":"maxProportion()","3ef5d325":"getBaseValue(uint256)","3ef5e445":"subtract(uint256,uint256)","3ef5f368":"payMultiple(uint256)","3ef7c687":"getExpiringUnitList()","3ef84fcb":"withdrawCommonCoin(uint256)","3ef87414":"getRevisionCount(bytes20)","3ef8e872":"numberOfTokensOfOwner(address)","3ef8ec78":"announce_numbers(uint8,uint8,uint8,uint8,uint32,bytes32)","3ef92150":"ICO(uint256)","3efa31b0":"initialAddress(address)","3efa8d51":"feesD()","3efab21b":"icoTokensIssued()","3efb537e":"getPastGameResults(uint256)","3efb760d":"nextLevel()","3efcad6d":"EMPR()","3efcd2e0":"transferPreSigned(address,uint256,uint256,uint256,uint8,bytes)","3efd1403":"createGame(uint8,bytes32)","3efe54d4":"percentWeiDividend()","3efe6441":"getRemainingToken()","3efea4d1":"buy(uint256,uint256,uint256,uint256,string,string,string)","3eff1ef3":"DYBToken()","3f001dd7":"MIC(uint256,string,string)","3f003d59":"removeAddressFromGrantAccess(address)","3f00f5aa":"HAOToken()","3f01dc99":"ETHFINEX_FEE()","3f01e642":"roundCount(uint256,uint256)","3f0218ac":"startThirdPhase()","3f021e2e":"oracalize_gaslimit()","3f02e4f0":"getTotalValidTk()","3f03aab4":"communityAddr_()","3f045e61":"inArray(address[],address)","3f047053":"songTokenExchange()","3f04b06d":"shareLove(address,address,uint256)","3f050f02":"subdomainSale()","3f056d2a":"StrongHoldTEST()","3f06e17c":"changeDonation(address)","3f073031":"addCredits()","3f07618d":"createDragon(address,uint256,uint256,uint256,uint256,uint240)","3f08882f":"assertIsWhitelisted(address)","3f089de9":"GameRefunded(uint256)","3f09ba9c":"TupleDemo()","3f0a0797":"exchangeContract()","3f0a9f65":"requiredBlockConfirmations()","3f0adce9":"setSmallWalletAddress(address)","3f0b67e9":"_addIndex(address,address)","3f0b70b6":"itgTokenTransfer(uint256,bool)","3f0cea3f":"withdrawOwner(address)","3f0cf183":"MockSale(uint256,uint256,address,address)","3f0d9ad5":"contractBalance_()","3f0ec70b":"RequestFactory(address)","3f0ed0df":"setContract(string,address)","3f0f7248":"SpaCoin()","3f109205":"setFoundationInterface(address)","3f10dea6":"canUse(address,uint256)","3f10f08a":"nextCommonTTMTokenId3()","3f117b85":"setPaymentContractAddress(address)","3f1199e6":"buried(address)","3f11e43d":"newEtherdelta(address)","3f124f1d":"totalMintContracts()","3f13d339":"getTxnNum(address,uint256)","3f14710d":"GameEnded(address,address,uint256,uint256,uint8)","3f14e2db":"withdrawfund()","3f152d11":"Coin(address)","3f15457f":"ens()","3f174064":"crowdsalePause()","3f181ef2":"getTotalUniqueCards()","3f18400e":"owlmasterReq()","3f1887e9":"Gamblers_Until_Jackpot()","3f18acb4":"CarRoute(string)","3f19bfbf":"allocateLedTokens()","3f19d043":"getContributions(address)","3f1a1cac":"useSingleItem(uint256,uint256,uint256)","3f1a3d9e":"dropEnabled()","3f1ae30f":"ReverseConfirmTransaction(uint256)","3f1b1267":"icoSince()","3f1bfdee":"testFailCreateShortIdAlreadyExists()","3f1da980":"lastBlock_v11Hash_uint256()","3f1e600a":"PHASE_3_PRICE()","3f1f59a4":"ICO_START2()","3f1f8f68":"seventh_withdrawal(uint256)","3f202951":"SampleCrowdsale(uint256,uint256,uint256,uint256,address)","3f20fa9e":"requestDispute(bytes16,address,address,uint256,uint256)","3f2266c2":"ownerAngelCollection(address,uint256)","3f22b0fb":"last50plushacker()","3f23503d":"minBtcValue()","3f23a566":"mintingCap()","3f242990":"tokenHardcap()","3f24ef7c":"setGidMax(uint8)","3f250493":"Crowdsaled()","3f257776":"getN2ControlLimits(bytes32)","3f265ddd":"FructusToken()","3f266242":"getSubjectCountByAddress(address)","3f26c5ee":"addMilestone(uint256,uint256,uint256,uint256,string,string)","3f26fa01":"InvestmentPolicyChanged(bool,bool,bool,address,address)","3f27e9e1":"recoverAddressFromBalanceProofUpdateMessage(bytes32,bytes32,uint256,bytes32,bytes,bytes)","3f27f105":"batchTransferSame(address[],uint256)","3f2885cb":"publish(string,string,address,bytes32)","3f288f05":"addPubKeyHash(bytes20,uint8,bytes,bytes)","3f28b20e":"Bemo()","3f28e9fb":"createBounty(uint256)","3f28f24c":"claim_rest_of_tokens_and_selfdestruct()","3f2965f0":"registerSeller(address)","3f29cd27":"set(bytes12,bytes32,uint40)","3f2b1040":"enableTokenWithdrawals()","3f2c0e35":"getNumberOfRequest()","3f2cb5d4":"popEducation()","3f2cba2b":"airdropMVP(address[],uint256)","3f2cdb53":"setETHPriceLowerBound(uint256)","3f2e0564":"setIcoWallet(address)","3f2e907c":"resumeTransferToken()","3f2e917c":"changeLimits(uint256)","3f2eed3b":"publicPresale()","3f2f1596":"setupTreasury(address,uint256)","3f2f46b4":"revealRock(string)","3f31281a":"changeUserKey(address)","3f3173f3":"MyTokenyy()","3f31b3ac":"extCustomerPolicies(bytes32,uint256)","3f3246a0":"getLastBuyer()","3f32aa70":"removeFromWhiteList(bytes32,address)","3f32af65":"calculateFare(string,string)","3f33252d":"changeDisown(uint256)","3f332792":"getGiftsCounter()","3f34dd5c":"setVestingAmoundAndApproveCrowdsale(address,address,address)","3f35d033":"transferToContract(address,uint256,bytes)","3f36d33d":"getpotReward()","3f37c9d4":"servicePercentage()","3f384026":"setStatusBuySell(bool,bool)","3f392b42":"trade(address[5],uint256[11],uint8[3],bytes32[6])","3f3935d1":"confirmReverse(string)","3f395781":"Capsule(uint256,address)","3f3a1ed2":"alottTokensExchange(address,uint256)","3f3a279d":"getBetResult()","3f3a4966":"getVotingPower(uint256,uint256,address)","3f3a78d5":"rateAngelDay()","3f3bdc6c":"upgradeAllowance(address,address)","3f3c212d":"kittenTalk()","3f3c51c3":"Setmyadress(address)","3f3c594c":"TestingToken()","3f3cde05":"whitelistFilteringSwitch()","3f3d83c3":"purchasable()","3f3e4c11":"setMaxTotalSupply(uint256)","3f3edfa4":"RootCoin()","3f3f43a8":"setPreDGZtoDgzRate(uint256)","3f402dfc":"CreateGameIco(address,uint256)","3f40adb8":"createPetition(string,string,uint256,bool,string)","3f415772":"releaseExists(bytes32)","3f419c40":"getMessageMaxCharacters()","3f423afe":"DIVISOR_STAKE()","3f4263ef":"x(uint256)","3f430616":"getThirdRoundReleaseTime()","3f43c7cf":"open(uint256,uint256,uint256,string)","3f444db1":"internalDoRoll(bytes32,bytes32,uint256,uint256,uint256)","3f44d89f":"NigerianNairaToken()","3f450915":"_mateWith(uint256,uint256,uint8)","3f4628c1":"disputeLimitedReporters()","3f46a2ea":"DucLongToken()","3f478372":"newDeposit(uint256)","3f479562":"kingGladiatorFounder()","3f47e662":"decimals(uint256)","3f487b8b":"securityGuardLastCheckin()","3f48ae1a":"initInsecure(address)","3f493a1d":"Playforfreetoken()","3f497d52":"batchAirDrop(address,address,address[],uint256)","3f4a6484":"removeCapper(address)","3f4acbe8":"_teamTax(uint256,bool)","3f4ad13d":"LOTE(uint256,string,string)","3f4b1401":"releaseDragonTokens()","3f4ba83a":"unpause()","3f4be889":"callContractAddress()","3f4c0733":"batchTransferEtherWithSameAmount(address[],uint256)","3f4c89ca":"show_minimum_amount()","3f4d2fc2":"addConnector(address,uint32,bool)","3f4d97f0":"TOTAL_TEAM_TOKENS()","3f4dd268":"releaseTokens(uint256,uint256)","3f4e5ab9":"getB1()","3f4e6d66":"CryptoFamous(address)","3f4e95d7":"investorsAccounts(address)","3f4eb701":"updateUnderlying(string,uint256)","3f4f057f":"candidateBlockNumberHash()","3f4f070c":"newSpaceshipUpgrade(bytes1,uint8,uint256)","3f4f3075":"setRenewable(uint256,bool)","3f4f50c8":"EvtUnlock(address,uint256)","3f50331d":"batchTransferPaidTokens(address[],uint256[])","3f516018":"setCreator(address)","3f5174df":"numberOfEarlyPurchases()","3f5228c7":"fifishICO()","3f52c660":"TokenPerETH()","3f52e589":"setStartingTime(uint256)","3f541d08":"burnTokens(address,address)","3f541ffc":"exchangeEtherForHavvens()","3f549d87":"contributeByOracle(address,uint256)","3f55b895":"delegate(uint8,bytes32,bytes32)","3f572432":"investment(uint256,address,string,uint256)","3f5750c6":"distributeCoins()","3f576af0":"GoodDayTokens()","3f579f42":"executeTransaction(address,uint256,bytes)","3f58774b":"ecbuy(uint256)","3f58a043":"ceoEtherBalance()","3f58f8c0":"voteRuling(uint256,uint256,uint256[])","3f590062":"getTokenCreationTime(string)","3f59b1ab":"TokenImpl(string,string,uint256)","3f59e45a":"bincentiveLogger()","3f5a0bdd":"selfDestruct(address)","3f5a9e22":"getAmountOfTitties()","3f5ab2fe":"seed_eth()","3f5adb8e":"LIRAX()","3f5b7675":"periodTwo()","3f5bc9b6":"makeACall(address,uint256)","3f5c6a50":"MinimumDonation()","3f5cbdb6":"returnWei()","3f5cd055":"advisorsVesting()","3f5d0203":"getCreationWeiCost()","3f5d2b79":"CrowdsaleFinished(uint256,uint256)","3f5d8056":"currRound()","3f5e268f":"convictInitial(uint256,uint256)","3f5e3ec1":"changeTransactionStorage(address)","3f5ea068":"addLockAccount(address,uint256)","3f5f5217":"sellAth(uint256)","3f601972":"TotalToken()","3f606cfc":"enableAutoSeller()","3f60efa2":"HANDLE()","3f615272":"sendICO(address,uint256,address)","3f61dcf6":"enableTransfering()","3f62c084":"collectMessage(address,address,uint256)","3f635e30":"ethTransfer(uint256,address,uint256)","3f64a7ab":"devFeePercent()","3f64b318":"initSale(address,address,address,address)","3f651bab":"TOURNAMENT_ENDS()","3f65d97f":"removeEndorsement(bytes32,bytes32)","3f67364a":"PayValsToList(address[],uint256[])","3f67a94e":"getOffChainAddresses()","3f683b6a":"isStopped()","3f6849eb":"listedMonForMon(uint64)","3f686170":"freezeAll(bool)","3f69034f":"enableGeneration()","3f697ce9":"startBlock(address)","3f69babd":"cancelEvent(uint256)","3f6a2c97":"calculatePoints()","3f6a6792":"Bribed(uint256,uint256)","3f6b33c4":"ping(address,uint256,uint256)","3f6b5fde":"generate(address,string)","3f6b6f2e":"Airdrop()","3f6c0696":"superMint(address,uint256,uint256)","3f6c0c60":"isTransferNotExpired(uint256,uint256)","3f6c3567":"listSales(uint256)","3f6c4a1b":"getTeamA(uint256)","3f6c4cfd":"withdrawBountyAndAdvisory()","3f6c71c5":"edgePigmentR()","3f6c95fe":"increaseLotteryBalance(uint256)","3f6d8256":"validatorFee()","3f6dd911":"multisig_owner()","3f6ddb75":"Allocated(address,uint256,bool)","3f6ea2a8":"MIN_LEADER_FRAC_TOP()","3f6ec73a":"itemVoteUp(address,uint256)","3f6f7ed6":"updateEthRate(uint256)","3f6fa655":"resolved()","3f6fff4e":"closeCycle(uint256)","3f70c2b4":"getProductById(uint256)","3f720922":"setConfig(uint256,uint256,uint256,uint256,uint256)","3f723c62":"addRecord(string,string,string)","3f73365f":"getOneFree(address)","3f738402":"goalIncrement()","3f74a3b7":"MINIMUM_VESTING_PERIOD()","3f74a8be":"totalEthJackpotCollected()","3f74fecb":"DSTrueFallbackTest()","3f751ad0":"addTxToCustomerRegistry(address,uint256,uint256)","3f7525bf":"getAddressesSet()","3f76fbd3":"dhopakcoin()","3f77b560":"newDocument(bytes)","3f77e1e9":"testFee()","3f79a0a9":"NewGame(bytes32,bytes32,bytes32,bytes32,address,uint256)","3f7a0270":"setN(uint256)","3f7aea39":"getCET4ById(uint32)","3f7b2ea9":"testMintInvalid()","3f7b54f9":"DevChangeMiningReward(uint256)","3f7b6be8":"createProductionUnit2()","3f7c42a7":"setJob(address,uint256,address,string,string,uint256[],uint256,uint256,uint8[],uint8,bool,address[])","3f7ca612":"FMWL()","3f7d5361":"changeSafetyLimit(uint256)","3f7d72d8":"rSetE(address)","3f7da39a":"whitelisterAddress()","3f7e2120":"CloseGift()","3f7eabc9":"setRobot(address)","3f7eb0fe":"func_1()","3f7f2eda":"Order(address,uint256,address,uint256,uint256,uint256,address)","3f7f4f17":"getUserAccountBalance(address)","3f7f6d23":"BuyWithBonus(address,address,uint256,uint256,uint256)","3f7f8b24":"getAllocationProposal(uint256)","3f7f9faf":"attachTicker(address)","3f80135f":"test_threeInvalidEqAddress()","3f801f91":"proxyAssert(address,uint8,bytes)","3f802220":"ProposalAdded(uint256)","3f802ca0":"singleValueBatchTransfer(address[],uint256)","3f806783":"potSizeChanged(uint256)","3f807199":"changeParticipants(address[])","3f80a82b":"getbuyPrice()","3f80db69":"_totalTokenSold()","3f811b80":"createContract(bytes32)","3f8126d5":"GetStatus(uint256)","3f817449":"tokenSmartcontract()","3f81e4be":"lastBlock_a9Hash_uint256()","3f82065b":"setDiscipleVend(uint256,uint256)","3f82e2c6":"PUBLIC_RESOLVER_NODE()","3f836dcf":"addAsAddress(bytes32,address)","3f83acff":"get_contract(bytes32)","3f8416fb":"doUpgrade(address)","3f85be9c":"calcChanges(uint256,uint256,uint256)","3f85f916":"founderContract()","3f862a19":"remainUserTokenBalance(address)","3f87f870":"checkRequest(string,string,string)","3f883dfb":"transferExternalValue(bytes32[])","3f887fad":"buyShares(uint256,uint8,uint256,uint256)","3f89b09c":"update_fee(uint256,uint256)","3f8a04aa":"getCurrentUserPromoBonus()","3f8a4c13":"previousSnailPot()","3f8a92b3":"setmangeruser(address,bool)","3f8ae6d9":"GetUserExpire(address)","3f8af40c":"amendedEarlyPurchases(uint256)","3f8b0a1d":"getIssuedBy()","3f8c2582":"ethSale(address)","3f8c75a6":"_createLicense(uint256,uint256,address,uint256,address)","3f8cfba6":"lifeVestingStages()","3f8d9568":"buyins(address)","3f8d95bd":"_delete(address)","3f8df98d":"calculateMyReward(uint256)","3f8e0298":"parseTicket(uint256)","3f8f0714":"SimpleLife()","3f900962":"manualRaffle()","3f914aef":"setWhitelistAddress(address,bool)","3f923f9d":"NIZIGEN()","3f92edaf":"getMaxDropsPerTx()","3f935379":"_isSingleFlag(uint256)","3f94904a":"bankValReserve()","3f95c0c2":"timeboundTest(address,uint256,uint256)","3f9628e8":"addOldWithdrawals(address[],uint256[])","3f966082":"exchangesOwner()","3f96f3a3":"toInt()","3f97b106":"GetSuspend()","3f97d995":"VALIDITY()","3f982b74":"createInitialAllotment(string,uint256)","3f9942ff":"canceled()","3f9945d2":"ByThePeople(address)","3f99a12b":"saleEndBlock()","3f99fa54":"addInitialMember(address,uint256)","3f9a3886":"OWNERS_ALLOCATED_TOKENS()","3f9af464":"AK4Token()","3f9b250a":"getDocument(uint256)","3f9b8fdc":"updateAllowedTransfers(address,address,bool)","3f9c7822":"print(int256,uint256)","3f9cbd65":"mainSaleTokenWallet()","3f9ce517":"getRefAddress()","3f9d0954":"FarChainToken()","3f9d95ed":"addAcceptedToken(address,uint256,uint256)","3f9e0eb7":"_getDaysInMonth(uint256,uint256)","3f9e23e5":"migrationFinished()","3f9e3494":"ReleaseSupply(address,uint256,uint256)","3f9e50fd":"LitToken()","3f9e9a37":"getBonusesAmount(uint256)","3f9e9df2":"removeInWhiteList(address)","3f9f5b68":"setPreviousID(uint256,int256)","3f9f7779":"BitCronus1()","3fa10e0a":"CountryJackpot()","3fa1436e":"updateTokenSaleState()","3fa1930d":"getPlayerBet(uint256)","3fa19804":"updateTeller(int8,bytes16,int8,int16,bool)","3fa21806":"lastHash()","3fa2dd2a":"getStage2Cap()","3fa2fe7a":"getActiveUserCount()","3fa40f94":"mintTokens(address[])","3fa4687b":"bytesToAddres(bytes)","3fa4ed06":"updateValue(bytes32,uint256)","3fa4f245":"value()","3fa54ed8":"setTileTypeAt(uint16,uint16,uint8,uint16)","3fa58b61":"Whitelistable()","3fa6010f":"setGallerySixPrice(uint256)","3fa615b0":"minCap()","3fa6497f":"AdminAddFunds()","3fa68836":"removeParticipant(uint8)","3fa69faa":"testtoken()","3fa8543a":"IMEXToken()","3fa8a7b8":"releaseTokenOwnership(address)","3fa911ae":"refundAllowed()","3fa9fcf8":"createPlayer()","3faaef28":"BurnFSATokens(uint256)","3faaffdb":"SCToken()","3fab8fb0":"EatToken()","3fabf8c0":"developmentAuditPromotionTokensPercent()","3fac68d5":"payOff()","3facd57c":"registerBill(uint256,address,address,uint256,uint256,uint256)","3facdfb6":"gatFund()","3fad1834":"getRequestCount()","3fad9ae0":"question()","3fadbd3e":"minTokenPurchase()","3fadc388":"current_plot_price()","3fae1928":"timenow()","3faed436":"setXTVTokenAirdropStatus(bool)","3faf511f":"vouch(bytes32)","3faff9d5":"purchaseTokens(uint256,address,bool)","3fb0b2c9":"CancelRoundAndRefundAll()","3fb18aec":"contains(string,string)","3fb1ab52":"_getUserSupportForTeamInTournament(uint256,uint256)","3fb1fed4":"startingExchangePrice()","3fb23166":"TeamVesting()","3fb23865":"fundingStatus()","3fb27b85":"seal()","3fb326ba":"MAX_ETHER_CONTR()","3fb39b8b":"rewardBeneficiary(address,uint256)","3fb3bec2":"deactivateTime()","3fb3ec28":"delegatedAmountsByDelegate(address)","3fb48c4c":"AAACoin()","3fb51a76":"frozenDaysforTestExchange()","3fb58819":"getMinGasPrice()","3fb5c1cb":"setNumber(uint256)","3fb64e75":"gameInProgress()","3fb655a3":"CPLTokenDeposit()","3fb8b692":"affiliateAddresses(uint256)","3fb92b10":"gameNbr()","3fb97857":"getCouponMulFactor()","3fbb539d":"scheduleCall(address,bytes,uint256,bytes)","3fbb8f98":"drawTertiaryDWinners(uint256)","3fbc2a1e":"preSaleTLYperETH()","3fbc6345":"Token_Remaining()","3fbd40fd":"ProcessDraw()","3fbda23f":"CharityToken()","3fbfdefc":"checkMyAging(address)","3fbffca6":"getTeamB(uint256)","3fbffcef":"bidsCount()","3fc0234d":"train1(uint256,uint256)","3fc15f15":"mainToken()","3fc22c51":"buyPreSaleTokens(address)","3fc3e53f":"Funding()","3fc44ab3":"setCustomEvent(uint256,uint256,bool,string,uint256)","3fc499b2":"ihomekey()","3fc4caa1":"levelThreeBonus(uint256)","3fc4e866":"RudiantoToken()","3fc50b92":"agingTime()","3fc523c7":"test_fourInvalidEqUint()","3fc5b69b":"set_sale_arbits_per_ether(uint256)","3fc5ed50":"_openGameResult(uint256,string)","3fc6a97a":"sellNow()","3fc6bc94":"payDAO()","3fc6d75a":"crowdsaleTokenPrice()","3fc7e3d5":"volumeType3()","3fc821ee":"getStackholderConfirmationCount(uint256)","3fc86d32":"newInvestor(uint16,address,uint256,uint256)","3fc8b029":"testSaleHasOwnerOnCreation()","3fc8ca58":"JetherToken()","3fc8cef3":"weth()","3fc90f7c":"addresses1(uint256)","3fc98bd5":"robotInfo(uint256)","3fcb21d3":"ecoFundingSupply()","3fcce626":"setDeprecated(address,string,string)","3fcd06fa":"checkMinimalGoal()","3fcdd2d3":"transfertoken(uint256,address)","3fce1b82":"addAnimal(uint8)","3fcead58":"TKRPToken()","3fd01a77":"is_purchase_allowed()","3fd0f727":"isIcoTrue()","3fd1f232":"LookAtAllTheseTastyFees()","3fd2300d":"curveIntegral(uint256)","3fd2799d":"newShortPosition(address[7],uint256[4],uint32[3])","3fd29369":"offer(string,string,string,uint256)","3fd3370a":"FooTime()","3fd3a371":"stageThreeEnd()","3fd3c997":"assetProxies(bytes4)","3fd68ca7":"lastCheckedToken()","3fd6b1db":"InoCoin(uint256,string,string)","3fd76a98":"MANAGEMENT_LOCKED_ALLOC()","3fd8b02f":"lockPeriod()","3fd8cc4e":"isPermitted(address)","3fd8cd9b":"ETHReturn(address,uint256)","3fd94686":"changeEligibleDonkeys(uint256)","3fd97621":"testTransferHandlesTooLargeRequest()","3fd9c56d":"checkDoubledProfit(uint256,uint256)","3fda1281":"get_keys()","3fda417a":"LADCoin(uint256,string,string)","3fda5389":"fill(uint256)","3fda926e":"addGame(address,string)","3fdb3628":"aggregateCDPValues(bytes32)","3fdb372a":"buildWinery()","3fdb571f":"reGround(uint256)","3fdb705b":"platformTokenSupply()","3fdb8cbd":"dt()","3fdbb6c7":"RATE_THRESHOLD_PERCENTAGE()","3fdccd8d":"setDCNForGas(uint256)","3fdcef0d":"PRICE_BEFORE_SOFTCAP()","3fdcefe0":"doSelfdestruct()","3fddd97d":"XCoin(uint256,string,string)","3fdddf01":"EGGS_TO_HATCH_1PACIFIST()","3fdde728":"MTP_PER_ETH_SALE()","3fddee64":"isAgency(address)","3fded490":"referralDiscountPercentage(address)","3fdeef90":"fstSold()","3fe0522c":"setTravelCore(address)","3fe14e03":"setAuthor(string)","3fe3347a":"assetType()","3fe3df76":"leaf_from_address_and_num_tokens(address,uint256)","3fe3f427":"depositTokens(address,address,uint256,uint256,bytes32)","3fe43020":"decreaseRepAvailableForExtraBondPayouts(uint256)","3fe43822":"Collect(uint256)","3fe75b8d":"Unity()","3fe97ead":"left49(uint256)","3fe9bf0e":"createContract(bytes,uint256)","3fe9f2a4":"EventCentsPerEtherChanged(uint256,uint256)","3fe9f2b2":"totalPublicFundingSupply()","3fea1c2b":"getIHand(uint32)","3fea2313":"ProposalAdded(address,address,uint256)","3feab517":"DreamCoin(uint256,string,uint8,string)","3feb1bd8":"transfer(bytes32,address,uint256)","3feb4f83":"BankeraToken(uint256,uint64)","3feb5f2b":"investors(uint256)","3febb070":"backlogAmount()","3febe823":"ClapClapToken()","3fec0561":"addclip(address)","3fec156b":"timeLockTeam(address)","3fec1a75":"setIcoDiscount(uint256)","3fec4a4c":"queryjingzhi(uint256,string)","3fec91a4":"addProposal(uint256)","3fecde21":"setTilePrice(uint8,uint256,address)","3feced03":"minAmountWei()","3fed491f":"testStoreBalanceAfterCheckout()","3fedcc31":"transfer(uint256,address,address,address,uint256,bytes,bytes)","3fee28b1":"logEthTx(bytes32)","3fefc25d":"getFundByManager(address)","3fefdb01":"setStageGenomes(uint8,string,string,string,string,string)","3feff510":"showMainERC20()","3feff76d":"tokenaddress()","3ff00ba5":"airdropMinting(address[],uint256[])","3ff0a1e5":"FoundToken()","3ff0ab0b":"updateUserDetails(bytes32)","3ff11c8b":"right85(uint256)","3ff1a578":"IsCheckNeeded(uint256,uint256)","3ff1d68f":"_totalXT()","3ff1dcf6":"PermianICO()","3ff1e05b":"viewBalance()","3ff20c8a":"setPause(uint8)","3ff26c01":"catches(address)","3ff33185":"newCaller(address)","3ff42b92":"marketingAddr()","3ff4d491":"checkFile(bytes32)","3ff5481d":"cancelSellBlock(uint256,uint256)","3ff54c71":"issueTokens(address)","3ff66381":"ACCC()","3ff69113":"myEntityCount()","3ff7f21c":"mulFactor()","3ff8c954":"addAnimals(uint8)","3ff8da5f":"recipient3()","3ff98455":"set_participant(address,address,uint256,uint256,uint256,bool,uint8)","3ff9a877":"makeXID(uint256)","3ffa274a":"transfersAllowedTo(address)","3ffb8f27":"changeMinter(address,int256,address)","3ffbd47f":"register(string,string)","3ffc2832":"_buyIcsTokens(address,uint256)","3ffc813f":"toCompare(uint256,uint256)","3ffd2798":"distributeAdviserBounty(address,uint256,bool)","3ffdabda":"poi_token()","3ffe5eb7":"claimWork(uint256,uint256[2],bytes32)","3fffebbd":"setBonusUser(address)","400002c4":"modifyOpenStatus(bool)","4000164d":"getClaimData2(uint256)","4000601f":"sellStakes(address,address,uint256,uint256)","4000aea0":"transferAndCall(address,uint256,bytes)","4000d5c3":"BACTest1Token(uint256,string,uint8,string)","4001261e":"activeTier()","40015d99":"getProviderInfo(uint256)","4001cee6":"getPeerOwnership(address)","4001e364":"SendEthOff()","4002d3fd":"LargeFunction()","4002eda6":"nextRoundId()","4002f0b0":"CheckCourse(uint256)","400351cb":"applyForCandidate(string,uint256,string,string,string,uint256,bool)","4004b6da":"getAmbassador(address)","40058f61":"TIER2()","40066733":"getTotalVotersCount()","40067c91":"VoteFactory()","4006ccc5":"exchangeRatio()","400718ea":"expressBuyNumSec(uint256,uint256[],uint256[])","40079df0":"getDividendIndex(uint256,int256)","40086158":"calculateHash()","40086aa0":"directDebit(address,address)","400a44b2":"EE(uint256,string,uint8,string)","400a4deb":"sendPresaleTokens()","400aaab7":"CTOC()","400aae08":"isInCurrentGeneration(address)","400adee3":"releaseByCount(address,uint256)","400b56e5":"setReg2(uint256)","400b8bf8":"releaseMintTokens()","400ba069":"calculateFee(uint256,address)","400bb308":"SimpleTGE(address,uint256,uint256,uint256,uint256)","400bbbd8":"rebalanceGetTokensToSellAndBuy()","400d1f45":"dtGetEthBalance(address)","400e3949":"numProposals()","400eb4f5":"ParaType()","400ee783":"TOKENS_LOCKED_1Y_TOTAL()","400f7a1e":"getPairInfo(address,address)","400ff9a4":"BuyGold()","4010a018":"fundAvailable(address)","40111f6d":"RESERVED_TOKENS_BACE_TEAM()","40117f50":"CanalToken()","4011baf9":"MARKETING_POOL_TOKENS()","401214a7":"updateParams(uint256,uint256,uint256,uint256,uint256)","40128db3":"registerAsDelegate(bytes32)","40129a40":"updateAddress(bytes32,address)","4012e02e":"Info()","401356f1":"Salt()","40135913":"releaseImpl(uint256)","4014c1c7":"changeMutagen2FaceContract(address)","4015e83b":"renExTokensContract()","401611ed":"acceptEndorsement(bytes32,bytes32)","4016535a":"parseBlock(bytes,uint256)","4016e969":"allowOwner()","4018e263":"stageTwoCap()","40193883":"goal()","40193d17":"getPongvalConstant()","40194596":"RealBloq()","4019fc54":"masterTokenBalanceHolder()","401b57b5":"transferLockedToken(uint256)","401bd3fe":"distributeEth(address[],uint256[])","401c3ba1":"LogClaimRefund(address,uint256)","401d7175":"_buyShip(uint256,address)","401dc09f":"setGeneSynthesisAddress(address,address)","401e3367":"transferFrom(address,address,uint256,bytes32)","401e77de":"GameCreated(bytes32,address,string,string,uint16,uint64)","401f2be5":"collectRemainingFunds()","40202f9d":"LogTransaction(address,uint256)","4021581a":"dollarBalance(address)","40217452":"ProdBToken()","40217786":"setRatePerOneEther(uint256)","4021d93c":"Alibabacoin()","40220b03":"previousVersion(bytes32,bytes32)","40222b64":"allocationsIndex(uint256)","40229e14":"B_Com()","4023da38":"Bacini(uint256,string,uint8,string)","40243ecd":"SimplePaymentChannel(address,uint256)","402456c0":"bank1Val()","4024a33e":"stageBonusPercentage(uint256)","4024db80":"license(bytes32)","4024eb2a":"approveAndCallN(address,uint256,uint256)","4025005a":"SmartIdentity()","4025b22d":"getShip(uint256)","4025b293":"redeemAllOutcomes(bytes32,uint256)","4025b5a8":"ownerUpdateContractBalance(uint256)","40267e53":"updateWhitelistBatch(address[],uint8)","4026b261":"PlatoToken()","4026c101":"deathFactor_iii()","4026eb92":"endround()","4027522c":"DanetonToken()","40275f73":"addMapping(string)","40275f85":"getPersonalDepositAddress(address)","40277604":"collectedFeesInTwei()","40278124":"setListedTime(uint256)","4027d4d8":"spendFromSwap(bytes32,uint256,address)","4028354b":"PlaceADiceBet(uint8)","40285ad5":"setfees(uint256)","4028db79":"isFrozenAccount(address)","402914f5":"claimable(address)","402962bc":"deleteAddressesFromWhitelist(address[])","4029a3ce":"mintMany(address[],uint256[])","402a1533":"angelAmountRemaining()","402b2bca":"IcoStartDate()","402bf0ab":"_delHolder(address)","402c5644":"XNON()","402c569c":"unlockBonusTokensClaim()","402caccd":"RANGESTART_6()","402d1c9c":"CONFIG_MAX_EXPOSURE_MUL()","402d5f2e":"unlockTokenPriceChange()","402d8883":"repay()","402e46b9":"finito()","402e6230":"getTotalGambles()","402e912f":"issuedInsurance()","402eb694":"reliabilityPercentage()","40307cdd":"setCOMMUNITY_POOL_ADDR(address)","4030bc19":"sendRTB(address,uint256)","4030ddc0":"blockVContractAddr()","4031f60d":"INMCOIN()","40326686":"paymentsFinished(uint256)","4032b72b":"addKeeper(address)","4033236e":"getProofOfStakeReward(address,address)","4033c268":"isFullInvest(address,bytes5)","4033cd77":"applyForCertification(string,string,string,uint256,bool)","403446bd":"getPlayersFibokens()","4034af00":"setWhitelistInternal(address,bool)","4034b817":"loadVersion(address)","4034cfed":"fundWallet1()","403575f7":"setMaxMessagesTop(int32)","4035d16a":"createPromoCovfefe(address,string,string,uint16,uint256)","403639d5":"StartSale(address,uint256,uint256,address,address,uint256,uint256,uint256)","40365852":"roundStart()","4036778f":"reveal(uint256,bytes32)","4036ab78":"getType(uint256)","4036ff30":"changeHouseCutPercentage(uint256)","403911a6":"tokenSaleStart()","40394dcc":"freezeAccountByTime(address,uint256)","403988c6":"setCustodianName(address,bytes32)","403a0a78":"placeBet(uint256,uint256,uint256,uint256,bytes32,bytes32,uint256)","403a734a":"MMMbCoin(uint256)","403a8f53":"registerForRaffle2()","403abbc7":"updateFirstActiveGamble()","403b0cfd":"LogErr(uint256)","403b3757":"getValueTip(uint256)","403b7d9b":"secondRoundICOEnd()","403bb94e":"StatsEthereumRaised()","403c617e":"Hydrogen()","403c9fa8":"getPot()","403d8a6a":"initialMartialTimes()","403dca55":"totalIssuedSynths(bytes4)","403de107":"executeDecision(uint256)","403e73ea":"_DemSinhVienDat()","403f6cff":"putInWinnerPool(uint256)","403fbf54":"initiateEthUsdOracleUpdate(address)","40400fa7":"getBurnedItemCount()","404239f6":"validateLegalRate(uint256,uint256,bool)","40426fb0":"stopIssuing(uint256)","4042b66f":"weiRaised()","40440891":"Donate_some_amount_and_save_your_stake_rewards(uint256)","40441eec":"balance2()","40445a4f":"numTiers()","4044856a":"preIcoEthers()","4044e8ec":"cancelOrderWithPayer(string,address)","4045c846":"setAccreditationActive(bytes32,bytes32,bool)","404635db":"_canBreedViaAuction(uint256,uint256)","404704b9":"sendBounty(address,uint256)","40477126":"exchangeTokens(uint256)","404823d1":"wagerPool()","40482475":"startTokenSwap()","4048c449":"getParent(bytes32)","40490a90":"getMultiplier()","40496aef":"SecuredWithRoles(string,address)","404983fb":"addsm(uint256,uint256)","40499ae8":"approvedTill()","404a9272":"promoEndTime()","404ae80c":"_randomCardSetIndex(uint256,uint256)","404cbffb":"entityList(uint256)","404cf932":"mintStart3()","404d0e3e":"gen0CreationLimit()","404ed1fa":"_founder_two()","404ef602":"disapproveToSell(uint256)","404efc53":"left26(uint256)","404f8dc8":"KRW_Omnidollar()","404fdfdf":"_setTempHeroPower()","4050a394":"getWishName(uint256)","40510399":"miningKing()","40512dcc":"TotalDividendsPerShare()","405136fa":"multiSendEth()","40517083":"dig(uint256)","4051ddac":"getSummary()","4051ed26":"BONUS_SLAB()","40520f85":"tokenToEtherRate()","40523946":"spectreTeam()","40528f98":"ownerUnlock(address,uint256)","4052c02a":"ProToken(uint256,string,uint8,string)","405353b5":"NPToken()","4053873c":"_safeTransferTkn(address,address,uint256)","4053c797":"save(bytes32)","40543538":"get_asset_events_count(bytes32)","4054f5de":"EthVentures3()","40556191":"getCrowdsaleWhitelist()","40557cf1":"saleRate()","40557e87":"totalBondSupply_BEAR()","405665fb":"isMeInWhiteList()","4056675e":"transferTokenOwnership()","4056f8a8":"minimumTokens()","4056fe06":"MAX_GOAL_EBC()","405710a8":"sentTokensToCompany()","40582f13":"getWeiRaised()","405871e5":"SealPrivateCrowdsale()","4059240c":"intervalNow()","405a66da":"claimOtherTokens(address)","405abb41":"updateRate(uint256,uint256)","405b8816":"testIsContractZero()","405bd7bb":"getCurrentNumberOfVoters()","405c649c":"timeLeft(address)","405c6f6e":"addDelegate(string)","405cae3b":"LOG_SpinExecuted(bytes32,address,uint256,uint256,uint256)","405cb7f6":"KimJCoin()","405d3adf":"exchange(bytes4,uint256,bytes4,address)","405dd87c":"EAT()","405df338":"start_PREICO()","405f63e7":"MANHATTANPROXY9THCOLAVE()","405f8006":"BlocToken()","405fea2f":"setTokenAudit(address,address,address,address)","4060d9f5":"isCarSpecial(uint256)","40621412":"BetexICO(uint256,uint256,uint256,address,address,address)","4063d563":"advertise(address)","406499d2":"Redhorse()","40650c91":"MIN_CONTRIBUTION()","40652435":"BURENCY()","40654e14":"balanceOfEth(address)","40656963":"contribute(bool)","40664496":"getTransferFee(address,address,uint256)","4066fdea":"feeProvider()","4067ffda":"transactionsOnForHolder(address)","406838b3":"etoken2()","40684172":"getICORaisedAmount()","406843ee":"recommendProportion()","4068665d":"TokenVesting(address,uint256,uint256,uint256,bool,address)","40695363":"floor()","40695625":"testRetractLatestRevision()","40698729":"withdrawERC20s(address,uint256)","4069925a":"releaseVested(address)","4069de8b":"MultiSender(address,address)","406a0e61":"VOLUME_50()","406a1180":"FATRANSOM()","406a318e":"getCitationRecordsLength(bytes32)","406a6f60":"attachToken(address)","406af848":"ArenplayToken()","406b0593":"tokenHoldersByIndex()","406b9394":"level0(address,bytes32,uint256)","406c22d3":"getLocalNodeReputation(address)","406c52d5":"changeElectorate(address)","406c5590":"FILO()","406c6633":"moveToNextCeiling()","406c92b5":"PRIVATE_SALE_MAX_ETHER()","406d7e98":"isAllowingTransfers()","406d81c7":"safeSendFunds(address,uint256)","406f1d22":"crowdSaleApprove(address,uint256)","406f390c":"_unsafeCall(address,uint256)","407001c6":"TruSale(uint256,uint256,address,address)","4070372d":"earlyInvestorsMintedTokens()","40710587":"usersCanSell(bool)","407167b6":"cantEntidades()","40716fc7":"DunderBet()","4071f89b":"payCharity()","40722e3e":"getNameReaderId(bytes32)","407235ba":"LogStop()","407255b5":"getWhitelistByIndex(uint256,address)","4072eee2":"getTopic(address,uint256)","4073002e":"AssetCollectionNum()","40731c24":"getPost(uint256)","40732c89":"makeDeposit()","40734387":"termination()","407456d1":"fundsOf()","407489ff":"concat_nodes(address[])","4074c648":"createPromoCollectibleWithMining(uint256,address,uint256,uint256,uint256,uint256)","407532bb":"presaleFundingTargetInEther()","40753a76":"addSupply(uint256)","40754714":"blockClient(address)","407617e5":"updateAmountIncrease(uint256)","4076a248":"BetPower()","40773279":"pay_Bounty(address,uint256)","407787e6":"Division(uint256,uint256)","4077aa14":"coreStaffAmount()","4077aaf8":"totalBountyTokens()","4077ef5d":"getMiniPoolEdit_4()","40784ebd":"slashInvalidUsername(string,uint256,uint256)","40786dec":"mint(bytes32,uint256,bytes32)","4078fca8":"feeETH()","40799f4c":"currentDayRate10000()","407a5c92":"getAdminLogN()","407a6727":"totalVIP()","407b899b":"returnInt64(int64)","407c554a":"getTSTTokenAddress()","407ca6f8":"BsktToken(address[],uint256[],uint256,string,string)","407cba67":"buyKNOW()","407cfe5e":"get_all_players()","407d0cd0":"addGame(string,uint256,bytes32[])","407d1a0c":"unstoreHorsey(uint256)","407d552a":"jackpotTokenWinRewardRate()","407e5e5d":"newVoting(bytes,string)","407e9588":"rejectMintRequest(uint256,string)","407e9e2c":"setcommissionCompany(uint256)","407ea214":"getPortion(uint256,address)","407ed2e2":"ComputeSell(uint256)","407f56e5":"HEAL()","407f8001":"secondsPerPeriod()","407fb687":"exchangeEtherForNomins()","407fc2e8":"eggsSold()","407fcc31":"tokenPriceUSD()","407fce7b":"left12(uint256)","4080277f":"guhb(address)","408056e4":"weiMinInvestment()","408057c4":"getStockCount(address)","40806f7c":"getAvailableFees()","40807049":"transferManyLands(uint256,uint256[],address)","40809acd":"stake(uint256,uint256,address,address)","40809f9d":"calcEma(uint256,uint256,uint32,uint256)","4080c884":"XstarToken()","40811e90":"transferDataAuthority(address)","4081c065":"massGrant(address[])","4081d916":"checkPlayerExists(address)","408275bb":"transferToVault(bytes32,address,address,uint256)","40828698":"s(address,address,uint256)","4082b499":"totalNumberOfPurchases()","4082defb":"isBasicAccount(address)","408318ae":"addAllowCnsContract(bytes32,address,bytes32)","4083c555":"Oasis(uint256,string,uint8,string)","4083cdbb":"changeTokensLimit(uint256)","4083e2af":"getFinalRoundPoints(uint160)","4083e935":"transferEthersInternal()","40844a8d":"safeDeduct(uint256,uint256)","40848af5":"markMyWord(bytes32,uint32)","4084c3ab":"finalizedBlock()","40857e02":"create(address,address,uint256,bytes32,int256)","4086b620":"sweepsCreationTime()","408760b8":"setAngelLastVsBattleTime(uint64)","40876f6e":"getMaxMakerAmount(address,address,bytes)","4087908f":"RicoToken()","40884c52":"getOracles()","40890bc2":"getCurrentProvider()","408938d0":"testUpdatePackageDb()","4089462d":"registerPackage(bytes32,string)","40896550":"bountyTotal()","4089b170":"totalPayouts()","4089d22a":"buyDepo(address)","408a2ac9":"addNewSupplier(address,address,uint256)","408a8094":"releaseTeamTokensAfter24Months()","408aee81":"removeVendorByAddress(address)","408b9945":"getBuyerNumber()","408bcbda":"getBalancesLength()","408bf4c3":"getAllCompanies()","408c1932":"distributeDisputeFunds(address,address,address,address,uint8,bool,address,uint256,uint256,uint8)","408cfe24":"iToken()","408d407d":"getClaimData(uint256,uint256,uint256)","408d5773":"createContractCovfefe(string,string,uint16)","408d947e":"SmartToken(string,string)","408d9e35":"ExecutorChanged(address)","408e097c":"createDestructibleCloneToken(address,uint256,string,uint8,string,bool)","408e2727":"votingActive()","408e2eb4":"ico2Tokens()","408ee7fe":"addAlerter(address)","408fef2e":"requiredMessageLength()","40901b08":"p_setLimitedReferralsMode(bool)","40908298":"allowedAddress(address)","4090cb64":"getWToken()","4090e696":"GetMinCost(uint256,uint256,uint256)","4091adf5":"onlyOwnerGetCompanyWallet()","4091ca4c":"gettopuser(address)","4091f4c6":"refreshMonarchyGames()","409242fc":"citation(uint256)","4092a611":"upVote(bytes12,bytes12)","4092acdd":"tokenFulfillmentDeposit(address[2],uint256[8],uint8,bytes32[2])","4092e2c2":"addMember(bytes32,address)","409315ce":"executePure()","4093b49c":"votes_for()","4094ac75":"ProofOfWeakHandsClassic()","4094ef5e":"addDataRequest(string)","40953102":"scheduleCall(address,uint256,bytes,uint256,uint256,uint8,uint256)","40954254":"addPublicSalesSpecialUser(address)","4095fbba":"SubmitTransaction(bytes32)","40966a97":"CMCEthereumTicker(address,uint256)","40976b60":"setNewAgent(address)","4097d865":"increaseRound()","40980953":"setWhitelistOff(bool)","40992e9d":"getTotalAirDroppedAmount()","40998845":"_recordName(address)","409a3d8f":"ALLANCOIN()","409b479c":"GetTotalPlayers()","409bc43c":"changePersonalMaxcap(uint256)","409bd95b":"getProductionTimeBusiness(uint256)","409c7baf":"BONUS_MIN_DURATION()","409c962e":"view34()","409dba83":"calcKeysReceived(uint256)","409e81a4":"Create(uint256,uint256,uint256,uint256,bool)","409ed1db":"setCCH_edit_5(string)","409f2607":"ESCOToken()","409f33c1":"sumPublicSale()","409fb4c0":"configMaxKeys()","409fc358":"canGiveMoneyBack()","40a0dd4b":"updateStateBasedOnTime()","40a141ff":"removeValidator(address)","40a19a71":"BLOCKSUNTILCLEANUPSTACK()","40a1b96e":"getTickets(uint8)","40a1f4d5":"invalidateStage(uint256)","40a1f87d":"getTotalLockedTokensPerUser(address)","40a203c4":"CoinVillaIssued()","40a2bfc1":"setXPAAssets(address)","40a3a9c7":"createTokenLocker(address,address)","40a3d246":"toggle()","40a401d0":"setMonsterIndexToOwner(uint256,address)","40a45440":"getPlayerBetNumbers(address)","40a49a96":"searchSmallestInvestor()","40a4c3cc":"loanCreator()","40a4c580":"validateTransfer(address,address,uint256,bytes,bytes)","40a50a5e":"setNormalBuyLimit(uint256)","40a51199":"PubPresale(address,address,address)","40a53017":"FeedEgg()","40a53ab9":"replaceAuditorRegistry(address)","40a5737f":"setIndex(uint256)","40a57cb8":"makeAdmin(address,bool)","40a5bfc5":"PentacoreToken()","40a72363":"sigTeamAndAdvisersAddress()","40a7ed8b":"uintFunc(uint256,uint256,uint256)","40a8a96c":"KingdomCreatedEvent(uint256)","40a915a5":"setTokensLocked(bool)","40a92f0f":"setMinSign(uint40)","40aab81b":"UpdatedBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32,address)","40aad0fe":"getUserPair(address)","40ab2634":"lastBlock_f8()","40ab4879":"pePrice()","40ab7b8c":"bnt()","40ac40b2":"setInvitationMultiple(uint256)","40ac89a2":"returnInvestment()","40acbee3":"TokenFactoryAirdropToken()","40acf805":"setCompanyInfo(bytes32,string)","40ad654c":"transferForVote(address,uint256)","40adf94e":"setOraclizeGasPrice(uint256,uint256)","40ae0851":"withdrawEtc(address,uint256)","40aec640":"bonusState()","40aee1a9":"numHashTypes()","40af1a45":"PrivateSaleDays()","40b00033":"deposit(string,uint256,bytes,uint8,bytes32,bytes32)","40b0a77f":"updateInstantTrade(address)","40b0c3d1":"DiligenceToken()","40b12b40":"testIsTrue()","40b14606":"getOverPLayer()","40b1ad52":"slashReservedUsername(string,bytes32[],uint256)","40b31937":"pledgeDecline(uint256)","40b359f5":"markTaskCompleted(address,bytes32)","40b43701":"getSetting(uint256)","40b5336d":"_updateDepositCountry(uint256,uint256,uint256)","40b5886b":"getHotWalletAddress()","40b5ce01":"fightStartTime()","40b60b85":"forceBuyback(address)","40b61fe9":"removeOperator(address,address)","40b6290f":"acceptSale()","40b6c71f":"EthLyteToken()","40b73897":"getFeeWindow(uint256)","40b74c91":"dislikeArtist(address)","40b7802d":"GiveUpTheDough(address)","40b7b240":"calculateAmount(address)","40b80684":"TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE4()","40b8783d":"raiseSlammer(bytes32,bytes32,bytes32)","40b8d53a":"startFeeExit(address,uint256)","40b98253":"canContribute()","40ba0e94":"getRegion(uint256)","40bb28e8":"watchVideoB(address)","40bb8474":"RENEETOKEN()","40bbf5b9":"ChunksToken()","40bc9308":"startTimeRound1()","40bcff15":"bet1000_01eth()","40bd8720":"_changeOslikiFoundation(address)","40bdd3e9":"bytesEqual(bytes,bytes)","40bea8d2":"lockedEndTimeOf(address)","40beafc9":"depositToTWI(uint256)","40beee2b":"setPermanentPlatinumLevel(address,string)","40bf6424":"removalPrice()","40bff23d":"_createCard(uint256,address)","40c05401":"getWithdrawableAmountFIIT(address)","40c0bcb9":"checkBetNumber(uint8,address,bytes32,bytes32)","40c0c5ff":"PityToken()","40c0ece3":"updateMyReturns(uint256)","40c10f19":"mint(address,uint256)","40c243c9":"totalEthRefunded()","40c2dc4a":"getCCH_edit_6()","40c3198e":"getBenzByOwner(address)","40c3418c":"sendCrowdsaleBalance(address,uint256)","40c36524":"getFreeHatchCnt()","40c37ed2":"sellGameLockedToken(uint256)","40c3a6db":"MaxNumberOfBetsChanged(uint256)","40c3b187":"left37(uint256)","40c3b18e":"approveTransferableToggle()","40c44c5b":"DivisibleFirstCommonsForumToken()","40c44f6a":"setNewCFO(address)","40c48c8d":"setNewPriceInFinney(uint256)","40c48dfa":"Entropy()","40c558b2":"releaseCatIndexUpperBound(uint256)","40c58b2b":"get_foreign_balance(address)","40c5b34e":"currentPhaseId()","40c65003":"bonusEnds()","40c657c7":"buyTokens(address,uint256,uint256,uint256,uint256)","40c73d17":"changeAnimator(address)","40c7535b":"TangToken()","40c7e279":"requiredPlayers()","40c7e707":"contributeBTC(address,uint256)","40c85a59":"getLestCommonMulArray(uint256)","40c87214":"_startNewMiningEpoch()","40c8a90a":"GetLastMsg()","40c91c05":"submod(uint256,uint256,uint256)","40c92ae6":"multisigwallet(address[],uint256)","40c97617":"getReferralAddressShare()","40c9adcf":"_cancelOffer(uint256)","40c9e804":"SanityRates(address)","40ca0f05":"W0keAFPresale(uint256,uint256,uint256,address)","40ca925d":"ChannelManagerContract(address,address)","40caae06":"setOwner()","40cc1239":"TokenEmission(string,string,uint8,uint256)","40cc35ce":"teamWithdrawalProposed()","40cc8854":"bite(bytes32)","40cd988d":"refundBroadcaster(uint256)","40cde403":"exchangeBalanceOf(address)","40ce1d43":"EWWCOIN()","40ce5062":"isPublicSaleNoBonus()","40ceb451":"increasePromoCreatedCount()","40d0a103":"MarketOrderEvent(uint256,uint128,uint8,uint16,uint256,uint256)","40d113da":"sqrtAsm(uint256)","40d1d255":"claimEndTime()","40d21e6a":"getRelations(uint256)","40d22cf8":"completedTasks(uint256)","40d2e73c":"VanHardwareResourcesChain()","40d32df9":"MetaIdentityManager(uint256,uint256,uint256,address)","40d3d25a":"playersStorage(address)","40d40a72":"MANAGE_CAP()","40d48958":"_endTime()","40d67116":"setTokensPerOneETH(uint256)","40d681cb":"setupPresaleClaim()","40d699b7":"deathData_a4()","40d75432":"provideExchangeRate(uint256,uint256,uint256)","40d7b7b8":"dollarPrice()","40d7f7e8":"Staked(address,bytes32,uint256,uint256,uint256,uint256)","40d815cf":"Cyberium()","40d84b52":"updateCase(address,uint256)","40d8c74f":"checkForPayout()","40d96e6c":"finalizeSale3()","40da948f":"updateUnit(uint256)","40db4b09":"tokensOwedByInterval(uint256,uint256,uint256)","40dca307":"buyCoinsUpdateState(uint256)","40dda9af":"USER_LOCK_BLOCKS()","40de2784":"buildICOStageTwo()","40debefd":"SomeCoin(string,string,uint8)","40dee0c5":"LogRedeem(address,uint256,bytes32)","40df280e":"alliesContract()","40df78b6":"bankBurnFrom(address,uint256)","40e0653c":"_getLevel(uint256)","40e099ac":"makePromise(uint256)","40e15134":"presaleDist()","40e1e62b":"RedSoxYankees412()","40e2ad58":"buyOwnedPixels(bytes32)","40e31490":"killAnimal(uint16)","40e40765":"setTokenSaleHardCap(uint256)","40e424ee":"chooseWinner(bytes32)","40e4ebf4":"GenDayRatio(uint256)","40e50d00":"gcsc(uint256)","40e58ee5":"cancel(uint256)","40e5f3cb":"getEtherBalanceOnCrowdsale()","40e63ef3":"getPubKeyByHash(string)","40e687a9":"blockno()","40e6b00a":"createRefundPoll()","40e7261d":"Golem()","40e87f13":"dropTokenV2(address[])","40ebe5bc":"SHARD()","40ec0b6a":"isCurioAuction()","40ecb7f2":"isTransferValid(address,address,uint256)","40ed79f4":"hashimoto(bytes32,bytes8,uint256[],uint256[],uint256)","40eddc4e":"getCollectedEther()","40ee2485":"CryptoCovfefes()","40eedabb":"leader()","40ef4704":"getState(bytes10)","40ef78a7":"getExploreData(uint256)","40f03605":"existingContribution(address,address)","40f04616":"_buyDiscountTTW(uint256,uint256,address,address)","40f0a21f":"ceil(uint256)","40f10af2":"revokeAttribute(address,address,string,bytes)","40f12a02":"getPureWeaponDamageFromTokenId(uint256)","40f13c0f":"mintingFoundersFinish()","40f13db5":"addWhitelisted(address,address)","40f19da7":"isFinish(bytes32,bytes32)","40f29da3":"testReturnsProductInformation()","40f2a50b":"findDsp(address)","40f313b9":"ImportRemappingTestA()","40f354f3":"insertTopic(bytes15,address,string,string)","40f3633e":"icoMin()","40f3b6f1":"yourShares(address)","40f3c364":"ProjectTag()","40f47d41":"registerNameByCOO(string,address)","40f523f9":"TourMEToken()","40f54c08":"TrumpCoins()","40f56cfb":"PYPToken()","40f5c954":"sumICOStage8USD()","40f5ed88":"XPS()","40f702b4":"userInfo(string,uint256)","40f81cb5":"providerAllowance(address,bool)","40f828a2":"setLiquid(bool)","40f9b34c":"BetrTokenPurchase(address,address,uint256,uint256)","40f9c62c":"setLargeWalletAddress(address)","40f9cdf9":"get_tokens_count(uint256)","40fa368c":"getOrderHash(bytes32,uint256[2],address,bool,uint96)","40fa61f7":"upgradeFee()","40fc5e7a":"upgradeableTarget()","40fdef80":"administration(uint256,string,uint256,uint256,address)","40fdf515":"issuetender(address,uint256,uint256)","40fe90d0":"setFreezeOut(address[],bool)","40ff26ba":"adminAdd(address,string)","40ff38b2":"rootDomain()","40fff80c":"setCommissionAddress(address)","41002439":"amIReady(address,address)","410085df":"refund(address,uint256)","410090db":"ChangeEmissionGrowthCoefficient(uint8)","410158cd":"Winsshar(address)","4102bf5c":"getAvailableAmount(address[8],uint256[6],uint256,uint8,bytes32,bytes32)","4102f4e8":"mToken(address,uint256)","41031b1d":"NutzEnabled(address,address)","4103257e":"ReceivedETH(address,uint256)","410366c1":"settleDispute(bytes32,uint256,uint256)","4103c4c4":"OwnedHelper()","410453ae":"serverEndGame(uint32,int256,bytes32,bytes32,uint256,address,address,bytes)","4104df21":"cardsMinted()","4105048d":"Revealed(uint256,uint8)","410520f7":"PrivateReserveCoin()","4105e02f":"remark1()","41061c04":"addVestingMember(address,address,uint256,uint256,uint256)","410646e0":"getUnclaimedAmount(address,uint16)","41068ae2":"LicenseCore()","41080cfa":"getLLV_edit_7()","41095b60":"voteForUltimateOutcome(bytes,uint16)","410968d8":"MajLastNotVal()","41097886":"LogAirDrop(address,uint256)","4109a71a":"CerttifyCrowdsale(address,address,address)","410a1d32":"getDonation(address)","410a1db1":"setCommunityPool(address)","410a6734":"setAllBlockHashes()","410a68b5":"setOraclizeCallbackGasPrice(uint256)","410ace1f":"EOSBetSlots()","410af6b6":"allowAddressDelegate(address,address)","410b1da8":"currentTotalSupply()","410bf4bf":"CloudMoolah()","410c2601":"testGetAccountBalance()","410c47a0":"bb(uint256)","410c8005":"SetReciver(address)","410c83a3":"get_amount_get_buy(uint256)","410cbcc6":"YaoToken(uint256)","410da27d":"surveyEndAt()","410dbad6":"setaddress(address,address,address,address)","410dcc42":"setSeedHash(uint256,bytes32)","410e05b3":"bdevIssue(address,uint256)","410e7b42":"TestCoin()","410e8340":"checkAndConfirm(address,bytes32)","41104ef9":"GlobalOperatorChanged(address,address)","41107bee":"parseSums(bytes)","4110a489":"validatorsState(address)","4110b2c9":"addCapital()","411273d8":"getTokenToEthAddOrderHint(uint128,uint128)","4112987c":"strConcat(string,string,string)","4112b7f1":"tryGetNameOwner(bytes)","4112ea75":"SongTokenExchangeContractSet(address,address,bool)","41130267":"fxxkicotestToken()","4113d05b":"createGen0TokenWithDna(uint256)","41161aac":"X(uint256,string,string)","41163f7c":"deedCount()","4116dfc3":"getMetaDataCount(address,bytes32)","411735ee":"getAddressGains(address)","41179685":"finalizeContruibute()","4118cbc9":"setTokenExchangeRate(address,uint256)","41192788":"refund(address,address[],uint256[])","41193c18":"blockPlaylist(string)","411a1714":"setOperational(address[],bool)","411a1ac1":"BitcoinEye()","411a3dcf":"forward(address,uint256,uint256)","411a42ea":"ConeTest()","411a492e":"getNumOfLotteryTickets()","411ae567":"setSlogan(uint256,bytes)","411b007e":"founders()","411b65ef":"setPropertyLastUpdate(uint16,uint256)","411c4e72":"ModifyFeeFraction(uint256)","411cc791":"transferWithParams(address,uint256,uint256,uint256,uint256)","411d3021":"MahalaCoin()","411d6e19":"USDETH()","411dddb2":"TrueVeganCoinPresale()","411e6832":"tokenObj()","411f93d1":"transferTicket(address,address)","411fcce5":"BitcoinSoft()","41203243":"dateOfBonusRelease()","4120a236":"FreeNapkins()","4120a800":"PrepareRollEvent(address,uint256)","4120bcec":"forceRecoverCollateralOnBehalfOf(address,bytes32,address)","41215aff":"NewUpgradeMaster(address)","4121b9f8":"SBECoin()","41224405":"get_planet_price()","41225b0e":"broadcastSchellingRound(uint256,uint256)","412282cd":"addOwnerAccount(address)","41228803":"updateBalance(address,uint256,bool)","4123057e":"update_oraclize()","41237fd5":"levBlocks(address)","4123a0ac":"deleteToken()","4123a482":"transferTx(address,uint256)","4123cb6b":"m_numOwners()","41240314":"teamTwoSharePrice()","4124a6a7":"getLockedFunds()","41252b55":"FreezeTransfers(address,bool)","41264107":"TEChain()","412648bf":"setAvatarIndex(uint256)","412661c4":"_setAuth(address,address)","412664ae":"sendToken(address,uint256)","41266ae8":"Composed(uint256,address,uint32[5],uint32[5],string,string,uint8[20])","4126d29e":"justFailRequire()","412740c5":"balanceWithInterest(address)","41275358":"feeAddress()","4127d54a":"tokensForPresale1()","41282fe0":"usersCanUnfreeze()","41288e76":"sendEtherToMultisig()","412956ce":"goBackToPrivateSale()","412988e7":"subSupply(uint256)","4129912c":"misub(uint64,uint64)","4129a9d5":"newIcoRound(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","4129b2c9":"getWinner(uint256)","4129b8ed":"remainingTokenHolder()","4129d7d1":"MessageSent(address,address,uint256,string,string,uint256)","412a5a6d":"createContract()","412a7be0":"athlete()","412b2ee0":"forkMe()","412c0b58":"initiate(bytes32,address,bytes32,uint256)","412c0c2d":"getWin(uint256)","412c7dfb":"FOUNDER_WALET()","412cbc06":"assetsCount(address)","412e829f":"LoveTracker()","412ec94f":"updateTokenPoolAddress(address)","412edecd":"setDAOAndMultiSig(address,address)","412eee05":"enactProp(uint256)","412f83b6":"getDelegatorUnbondingLock(address,uint256)","41300d03":"secondBonusRate()","41304fac":"log(string)","413100e0":"getLeftoverWei(address)","4131775e":"_removeUserCity(address,uint256)","4131f609":"verifyWining(uint256,uint256,uint256,bytes,bytes,bool,bytes32,bytes32)","41326679":"inVaults()","4132bae8":"calculateRAUS()","4133e7a1":"GxCancelOrders(address)","41348053":"ratePlanOfVendor(uint256,uint256)","413499f1":"deleteVoters()","4134a92a":"registerResource(bytes32,uint256,bytes32,string)","41354590":"setAtomIsBuy(uint256,uint128)","413699de":"setOwnerName(address,string)","4136aa35":"isAlive()","41388aed":"TokenHash(string,string,uint8,uint256)","41388c71":"DolyToken()","41395efa":"dgxBalance()","41398b15":"ethAddress()","413992b3":"createWarranty(string,string,address,uint256,uint256,uint256)","413a7f9a":"MethNSupply()","413ab4a8":"_reserve()","413abc3d":"min_share_price()","413bac7a":"jackpotinfo()","413bba97":"withdraw(uint256,bytes,address[])","413bc8eb":"TableDeRapprochement_322()","413c6d13":"setAddressValue(string,address)","413d18cb":"currentMessage(uint256)","413d7b08":"mainSaleTLYperETH()","413d9c3a":"LOCK_TIME()","413dc451":"countPerfClients(address)","413e31a8":"Testita()","413e4aaf":"calculateOwnerFee(uint256)","413e90e7":"putHashes(uint256)","413e920d":"oneMillion()","413ed292":"logState(string,uint8)","413f50da":"addAddressToWhitelist(uint256,address)","413f7d4c":"SECONDS_BETWEEN_ROUNDS()","414053be":"best_adjustment_for(bool,uint128)","41409437":"publishMetaData(bytes32,bytes1)","4141a121":"ETHERlemon()","4142f460":"segundos()","4143125f":"dusttorafflepot()","41431908":"setManagerAddress(address)","41434351":"oneday()","41445fd2":"c4c()","41446e0a":"bankersAcceptanceOfDeal()","4145aa9d":"grantMythexTokens(address,uint256)","41461bad":"gracePeriodStartBlock()","414689ff":"unlockAmount()","4146e099":"getCurRoundInfo()","4147060a":"LogRequirementChange(uint256)","41470877":"returnVesting()","4147e15e":"verifyOptionPoolMembers(address)","4147ffe5":"bitfwdToken()","41481372":"Fight(uint256,uint256,bool,bool)","4149953d":"transferRestore(address,address,uint256)","414b49a2":"setFreeLOT(address)","414b7ad6":"updateAff(uint256,uint256,uint256,uint256)","414b85e4":"isPreIco(uint256)","414bbda2":"declineCoins(address,uint256)","414c2aab":"MemberHandler(string,address)","414c377b":"updateSaleLimit(uint256)","414c4a8d":"maxAmountToSell()","414ceac0":"investorAddFee(uint256)","414d784e":"DECIMAL_ZEROS()","414db054":"Loss(address,uint8,uint256,bytes32,bytes32,uint256,uint256)","414db89e":"tokenForSale(uint256)","414e2e9e":"walkTowardsBlock(uint256)","414ee145":"lastBlock_f18Hash_uint256()","415016f4":"getBalance(uint16)","4150f4cd":"setSysAcc(address)","415194fb":"referral_ledger(address)","41522e41":"setHighWater(uint256)","41524433":"sellKissBTCWithCallback(uint256,address,uint256)","4153090e":"startFavorEscrow(uint256,uint256,uint256)","41533ba7":"getRateByTime()","4153d65b":"securePay(uint256)","4153d751":"onTransferOwnership(address,address)","41541318":"createPromoNinja(uint256,address)","4154aede":"refund(address,uint256,address)","415510df":"addressPreSale()","41554a2e":"issua(uint256)","41555acd":"storeOwner(address)","41562e69":"insertNodeBatch(bytes32,bytes32[2][5])","41566585":"whitelistAddress(address)","4156fdb7":"createSwap(uint256)","41583c4b":"_updateCardClaimerAddress(uint256,address)","4158506a":"participantsLength()","41585a0c":"increaseCount(bytes32)","41587b08":"addWeapon(uint8[176],uint8,uint8)","4158d848":"fundChecking()","41595f04":"ALLOC_RESERVED()","4159712a":"LogOwnerEthWithdrawn(address,uint256,string)","415a0d46":"_preValidateTokenTransfer(address,uint256)","415bc701":"HCPTToken()","415bd3fa":"_report(bool,string)","415c7593":"autoRentByAtom(uint256,uint256)","415dd7d8":"newRandomValue(bytes,address,uint256)","415eea1b":"vaultNum()","415ef37c":"weiSold()","415efb15":"setup(string,string,string,uint256,string,string,uint256)","415f1240":"liquidate(uint256)","415f47ea":"decodeOrderUserId(uint256)","415f9498":"commission2()","415fad10":"test_threeInvalidEqInt()","415ffba7":"close(uint256,bytes)","416108e2":"ERRLCoin()","4162169f":"dao()","416232af":"CampaignContract(address,address,address,address,uint256,string)","4163afb6":"MANHATTANPROXY8THAVE()","4163b5a4":"weiUsdRate()","4163d75d":"delPokemonFromSellingList(address,uint256)","4165295a":"getMixParticipantIdByAddress(bytes32,uint256,address,address)","416608a9":"updateTemplate(uint256,uint256,uint256,string,string)","4166c1fd":"getElevation(uint8,uint8)","4166eab4":"zeastadscredits()","41676f15":"isOrganizer(address)","4167c2fd":"setVaults(address,address,address,address,address)","416851a0":"testOracleQuery(string,string)","4168614a":"volumeBonus(uint256)","4168de57":"teamIssueVesting(address,uint256)","41696fa8":"updateMyEntity(uint256,bytes32,bytes32,bool,address,uint256,uint256)","416a1b62":"Liquet()","416ae768":"getUserState(address)","416bc7f6":"createSplitter(address[],string)","416c0d38":"adminRetrieveContractConfig()","416c3f16":"eligibleAmount(address,uint256)","416c6383":"testConcatMemory31Bytes()","416c8701":"beyond()","416c9627":"updatePresaleBonus(uint256)","416ccd02":"limitVIP()","416cf34e":"ULCToken(address,uint256)","416da702":"TOKEN_USDCENT_PRICE()","416dc762":"endThirdPeriodTimestamp()","416dffb0":"cleanupURLs()","416e517e":"setOutcome(uint256)","416e6d5e":"balanceManager()","416e70f6":"linkToMasterWallet(address,address)","416f222a":"submitBid(uint256,uint256,uint256)","416f5483":"changeEthAddress(address)","41709748":"getTotalDrone()","4170a419":"setCCH_edit_34(string)","4170e191":"MiniMeBaseCrowdsale(address)","4170ee08":"reVote(uint256)","41713a37":"directTradeAllowed()","41718066":"hitFoundationPrecent()","417297a0":"issueTokensSale(address[])","4172d080":"tokenExchangeRate()","41733f7a":"fooToken()","4173b181":"setWeiPrice(uint256)","4173c27a":"REEFToken()","4173ffbc":"getRand(uint256,uint256)","41744dd4":"feeRatio()","4174a943":"Deposited(address,address,address,uint256)","4174f1a5":"TOKEN_RATE()","4175b307":"addAddresses(address[],string)","41760afc":"_setEventsHistory(address)","41763225":"createRewardCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)","4176368f":"paymentSizeE()","4176ce68":"IsAuthority(address)","41771b62":"changeFees(uint8)","4177340d":"openGamePlayNo(uint256)","4177afa6":"TIER_2_BUYIN()","4178617f":"addAllowedToken(address)","41796bea":"OfferCreated(uint256,bytes,address)","41799883":"decreaseSoldSaleSupply(uint256)","417a2909":"getUpdateTimes()","417a767e":"getBetsBlock()","417a7d60":"checkMessageData(address)","417b3409":"DownloadMusic(uint256,address,uint256)","417b86fb":"getPolicyDetailsByHash(bytes32)","417ba840":"checkMemberLevel(address)","417c73a7":"addToBlackList(address)","417c8d40":"SEK_Omnidollar()","417cb353":"totalDecimals()","417d5fb4":"advisersPeriodsNumber()","417de5b5":"mintAirdropToken(uint256)","417e8e67":"getCompoundedInterest(uint256,uint256,uint256)","417ea2dc":"platformSupplyRemaining()","417f204e":"GATC(uint256,string,string)","417fd6b6":"setMinBidAmount(uint256)","41808d4a":"test_remove_tail()","4180b70d":"KKday()","4180c2d5":"payout(address[])","4180f6ec":"RESERVED_TOKENS_FOUNDERS_TEAM()","4181641b":"engrave(string,bytes32)","41829445":"createNewCE(bytes32)","4182e5eb":"deleteContract(uint256,address,uint8[],bytes32[],bytes32[])","4182fa46":"getHouseAddressShare()","41831218":"maxPerPersion()","41832bed":"generateOrderHashes(address[4],uint256[8])","4183689f":"initSignetures()","4183f0b3":"startCardSale()","41843aa5":"subusermoney(address,uint256)","4184907e":"ESPlatts()","41852eb2":"BuyToken()","418599cb":"SerenityTeamAllocator()","4185f8eb":"receiveEth()","4185fdc5":"decreaseFrozen(address,uint256)","41863a7d":"victorieumICO1Token()","41867384":"new_bonus_for_next_period()","41868769":"CallAborted(address,bytes)","4187a193":"stageThreeStart()","41883b78":"withdrawHouseEarnings()","4188d79c":"releaseExists(string,uint32,uint32,uint32,string,string)","418939c0":"fillBid()","4189a68e":"sell(uint256,address)","418ae602":"verificationAddressHoldersListCountMap(address)","418bc2ee":"updateHatchingRange(uint16,uint16)","418bc76c":"gasForKWH()","418c7de1":"currentFulfillment(string)","418ca0c7":"subOnStage(address,uint256,uint256)","418cb077":"CustomToken()","418cf199":"setEstimateCost(uint256,uint256)","418d4dcc":"collectPayoutForAddress(address,address)","418d75b6":"getBuyerOption()","418f1487":"confirmDividendsFromPot()","418f3a9b":"Invest(address,uint32,uint32,uint256)","4190af2e":"walletTokenReservation()","4190cfc1":"getAllQuestionAddresses()","4190f365":"PUBLIC_MAX_CONTRIBUTION()","41910104":"returnSuspendedPayments(address)","41910112":"DecentBetToken(address,address,address,uint256,uint256,uint256)","41910f90":"BASE_RATE()","41923c0c":"PRICE_ICO1()","419259ef":"reissueCert(bytes32,bytes,bytes32,uint256,bytes32,bytes,uint256)","4192610e":"callThisToStop()","419308f7":"getPreviousNode(bytes32)","4193b8b7":"bytesToUint(int256,bytes)","4193e15f":"OrbusToken()","419469fe":"calculateCellSell(uint256)","41953e90":"CoinTel()","4196cd4a":"stateIndexToApproved(uint256)","4196fad9":"mop()","419759f5":"depositAmount()","41976e09":"getPrice(address)","4198d24a":"mintAllocations()","4198e94d":"setbounty(uint256)","419945f8":"ExpiringMarket(uint256)","4199dbe6":"avvia_votazioni()","419a3de6":"allotItem(uint256,uint256)","419a88b6":"XPA()","419ab31e":"USERS_address()","419bd6c0":"Nairotex()","419ce264":"ercToNativeBridgesAllowed()","419db07b":"generousFee()","419e6e5c":"getTotalNamesCount()","419e7589":"setProviderDetails(uint256,string,string,uint256,string,uint8,address)","419eafdc":"winPercent(uint256)","419ef898":"IBRToken()","419f6a3a":"isAirdropOver()","419ffa03":"fipsRegister(address)","41a0894d":"getReferrals(address)","41a08aaf":"judge(uint256,bool)","41a0be7b":"renameHorsey(uint256,string)","41a1053f":"strRemoveLastCharacter(string)","41a1a582":"getOwnerPayout(uint256)","41a1d66c":"sendTokensToExchange(uint256)","41a2625f":"endPreico()","41a28df6":"setAdminAddr(address)","41a292be":"calcPriceAt(uint256)","41a41523":"TIMEDEX()","41a42ba2":"updateNetworkConnection(string,string,address)","41a461fb":"SDAToken()","41a49409":"setWhitelistManager(address)","41a494c5":"award()","41a4c309":"_burnApproveClear(address,address)","41a4c5bf":"changeBonus(uint256,uint256,uint256,uint256,uint256)","41a51d00":"total0xbtcBalance()","41a5518f":"getMineInfoInDay(address,uint256,uint256)","41a59cef":"SDGT(uint256,string,uint8,string)","41a5b33d":"withdrawFromToken(address,address,uint256)","41a6cfda":"ROSCcoin(uint256,string,string)","41a6f46e":"FIESTA()","41a70b4c":"addArgumentToRequestString(uint256,bytes32,bytes32)","41a76287":"updateUintSetting(uint256,uint256,address,string,string)","41a7726a":"subscribe(address)","41a806ca":"addFamily(address)","41a82cc1":"ruleB(uint256)","41a84a0d":"getTokensForContribution(address,uint16)","41a928fe":"downTick(uint256,uint256)","41a943e2":"addAdmin(address,address,bool,bool,bytes32)","41aaccb0":"claim_eth_by_address()","41abe705":"doCount(address)","41ac59b7":"massTransfer(address[])","41ac5dd0":"updateFulfillment(uint256,uint256,string)","41ad3f57":"chickenToAltar(uint256)","41ad5c72":"createGroup(bytes32,uint256)","41ad785e":"payAndDonate(address,address)","41adb3f5":"saveInfo(string)","41ade6b7":"setRegisteredFirm(string,bool)","41aeaea7":"restWei()","41aed7cb":"isActiveEmployer(address,address)","41af1524":"verificationCodeHash()","41affe19":"publicSaleWallets(uint256)","41b0b4cd":"distributedTeamStakes()","41b2485b":"fiatContract()","41b280d2":"getTXwithCode(bytes32)","41b3203c":"PlaySimpleGame(uint8,bool)","41b3a0d9":"contractEnabled()","41b3d185":"minDeposit()","41b44392":"removeDarknode(address)","41b4a626":"cashSale(address,uint256)","41b4be87":"getPoolbyGtype(uint8)","41b5467a":"getUnpaidPerfit(uint32,uint32,uint256)","41b6f6ce":"getStatusDeal(bytes32)","41b6fcf7":"paymentDigest(bytes32,uint256)","41b80184":"lastProfitTransferTimestamp()","41b8547c":"Dev_Supply()","41b94f10":"_toTaxed(uint256)","41b989d0":"CashDeposit(address,uint256)","41b9c14c":"getShipsByOwner()","41b9dc2b":"has(bytes32,bytes32)","41ba4738":"GOLD_AMOUNT_NDC()","41ba9a17":"removeMilestones(uint8)","41bb0559":"symbol(string)","41bb26d3":"handlePayment(address)","41bb50f7":"eachIssuedAmount()","41bc0b6a":"LivepeerVerifier(address,address,string)","41bc2bea":"setProviderOwner(uint256,address)","41bc7b1f":"getOracleDetails()","41bcd712":"RTPToken()","41bd84aa":"_removeAffiliate(uint256)","41be0a14":"SPOT9()","41be44d5":"XAUDToken()","41be84cf":"getWingsValue(uint256)","41becaef":"tokenIssueIndex()","41beef9d":"getSpareRecommAddr()","41c06b2a":"_reached(uint256)","41c0aa0e":"lockUnsoldTokens(address)","41c0dc59":"PAYOUT_FRAC_TOP()","41c0e1b5":"kill()","41c12a70":"voteNo()","41c14eb4":"BrokerImp(address,address,uint256,address)","41c173e2":"preICO(address,uint256)","41c1f017":"CONFIG_MAX_EXPOSURE_DIV()","41c1f5b4":"dreamToken()","41c1f60e":"instruct_5()","41c2c8f6":"FutaToken()","41c3e7c7":"report(address,bytes32,uint256[],bool)","41c41025":"updateFunders(address,bytes32,string,uint256)","41c41923":"freeze_contract()","41c46ff7":"PALToken8(uint256,address)","41c5cf5c":"ICOend()","41c61383":"totalClaims()","41c6f609":"registerNewMember(address,uint256)","41c7eb41":"populateTrancheRates()","41c8146c":"changeTimeBonuses(uint256,uint256,uint256,uint256,uint256,uint256)","41c838cb":"getSANitized(string)","41c8b1de":"lendingInterestRatePercentage()","41c8ba1e":"MIN_CONTRIBUTION_CHF()","41c9692b":"phase1Duration()","41c96964":"getInvestorInfo(uint256)","41c9c72d":"updateDelegatorRewards(address[],uint256[])","41ca641e":"getShareholders()","41ca7242":"maxCapPre()","41caea7d":"EventWithdraw(address,uint256)","41cbd6ea":"getTrustedPartner(address)","41cbfc7b":"getKeysByType(uint256)","41cc0aa5":"RET_MUL()","41cc8912":"renameToken(string,string)","41ccf987":"ownedPool()","41cd47bf":"FEE_NUMERATOR()","41cdd253":"TestFMA(uint256,string,string)","41ce7f23":"BACToken(uint256,string,uint8,string)","41ce909f":"Bitroneum()","41ce979d":"VanityReleased(string)","41ce9f0e":"setBZRxTokenContractAddress(address)","41cfbb96":"test_someOtherFalseTest()","41d003cb":"setBonusCreationRate(uint256)","41d00774":"CoefRew()","41d00b1d":"EBIToken()","41d03085":"NEWONE()","41d09fbe":"sendWinnings()","41d0fcb6":"setSanctuaryAddress(address,address)","41d15b54":"createProductionUnitTokenContract(uint8,uint8,uint8,uint256,uint256,uint256,uint256)","41d1a4d6":"getStrategyAtIndex(uint256)","41d1da19":"Cloudeb()","41d20767":"ethMinContribution()","41d2c748":"applyCoeff(uint256,address)","41d31feb":"get_read_only_keys()","41d45f4a":"UNEK()","41d4a1ab":"bonusToken()","41d4a39e":"setCrowdsaleClosed(bool,bool)","41d5da6b":"getMyStatus(bytes32,bytes32)","41d5e10c":"BittwattToken(uint256)","41d5f7ac":"eligibleAmountCheck(address,uint256)","41d76a9c":"firstTime()","41d80050":"FundsGot(address,uint256)","41d875dc":"setStr(uint256,string)","41d8bc5f":"setExchangeRateOracle(address)","41d9cc43":"forgeItems(uint256,uint256)","41da7538":"getJadeProduction(address)","41da7555":"ownerPercentage()","41db1875":"makeBuyOrder(address,uint256)","41db61e1":"toGMT(uint256)","41db7e16":"RGN()","41db8c93":"_startCrowdsale(address,uint256)","41dbb51e":"IsFrozen()","41dbbb61":"SmartexFundsManager()","41dbe546":"HedeCoin()","41dc02cf":"changePatentSale(uint16,uint256)","41dcf454":"tokenURI(uint256,string)","41de2164":"getPhaseStartTime(uint256)","41de4181":"fireDepositToChildEvent(uint256)","41de4f16":"queenchUSBToken()","41dedc58":"gradeinfo()","41defd82":"cancelJobByAdmin(bytes32,uint256,address,uint256)","41df696e":"start_play_quiz(string,string)","41dfed3a":"viewCurrentPrice()","41e0b5d4":"Fenerbahce()","41e0c407":"getStudentCount()","41e1234e":"presaleFemaleStart()","41e14251":"devuelveUsers()","41e18398":"batchTransferFromManyToMany(address[],address[],uint256[])","41e34be9":"unitSellable(uint256)","41e3a6b5":"updateSplitBalances()","41e50814":"DEVCoin(uint256,uint256)","41e62be6":"VRToken()","41e6fd4b":"hasSecret(uint256)","41e7a787":"ERC223StandardToken(string,string,uint8,address,uint256)","41e7c47e":"FBR2()","41e884d4":"viewLastClaimedDividend(address,address)","41e8b94c":"isThereABlockAtCoordinates(uint16,uint16)","41e8da52":"makeBet(uint256,uint256,address,uint256,uint256)","41e8fe9f":"EventRandomLedgerRevealed(address,uint256,uint256,address)","41e906e5":"getExercised(address)","41ea5127":"BaseAuction()","41ea59a9":"isFoundationSupplyAssigned()","41eb1a4a":"setUintCoinProduction(address,address,uint256,uint256,bool)","41eb24bb":"renouncePauser(address)","41ebb063":"KRHCoin(uint256,string,uint8,string)","41ebe9c6":"ScarcecoinStart()","41ecd1cd":"withdrawOwnerUnrevealed(uint256,address)","41ece976":"updateMinInvestmentForPreIco(uint256)","41ecf95b":"ParticipantJoined(uint8,uint16,uint32,address)","41ed2c12":"marketManager()","41eddf00":"checkIfCurrentlyActive(uint256)","41ee903e":"clear(uint256,uint256)","41eeb105":"doRelease(bytes16,address,address,uint256,uint16,uint128)","41ef3879":"stage1_price()","41ef6bb7":"uncirculatedSupplyCount()","41ef858f":"whitelistAddress(address,address,uint256)","41ef9184":"Pretorian()","41f18b43":"claimEarlyIncomebyAddress(address)","41f1d4dd":"whitelistControl()","41f1e76c":"minFundingGoalReached()","41f1f3e5":"getPayeeIndex(bytes32,address,address)","41f2ce14":"setABalance(address,uint256)","41f31724":"Tzedakah()","41f36984":"collectGamePayout(uint256,uint256)","41f4793a":"getCurrentImpeachmentVotesSupporting()","41f48ebf":"currentIco()","41f4ab98":"addManyToPresaleWhitelist(address[])","41f4fcaf":"isDrop(uint256,address)","41f51941":"doActivateSale(address)","41f59e81":"initBonuses()","41f64b85":"deleteBag(uint256)","41f65507":"pendingOracleA()","41f6e77e":"FindTheCureCoin2()","41f70465":"startCoinOffering(uint256,uint256,uint256,uint256)","41f77260":"withdrawSyndicateTokens()","41f8a524":"Verificator()","41f99b69":"setWithdrawalCoolingPeriod(uint256)","41f99e2f":"getPostDonationAmount(address,uint256)","41fa4876":"multiBlockRandomGen(uint256,uint256)","41fade8f":"getconfig(address)","41fb55c6":"mMaxAppCode()","41fbb050":"foundation()","41fcb0f7":"buyNapkins(address)","41fd32cf":"SafecontractsTREXCrowdfunding()","41fe0a24":"buyCrystalDemand(uint256,uint256,string,string)","41fee898":"refundPercent()","41ff4275":"_calculateUnlockedTokens(uint256,uint256,uint256,uint256,uint8)","41ffbc1f":"ringIndex()","42007fd3":"MarkRazAsComplete(uint256)","4202d214":"isActiveUser(address)","4203ea57":"minInvestmentPreICO()","4204f7d5":"deployMinersTest(uint32,address,uint32[],uint32[],uint32[])","4205875f":"ROUND_6_PRESALE_BONUS()","4205e5af":"pauseClosingTime()","4206311b":"TimeLockSend(address,address,uint256)","420714bd":"requestIndex()","42071a73":"bltRetained()","4207d648":"directorJurisdication()","42091137":"addStringSetting(string,string,address,address,string)","42091e76":"saltoken(address,address)","42095679":"lindyhanCoin()","420977d8":"viewStudent(uint256)","4209fff1":"isUser(address)","420a83e7":"tokenHolder()","420a8ac8":"NanoPyramid()","420a8b76":"Dancer()","420aa07d":"serviceTrasferToDist(bytes32,uint256)","420aadb8":"_execute()","420ae446":"allocatetokensAndWLExp(address,uint256,uint256)","420b5fe0":"initializeVestingFor(address)","420b81f6":"peekData()","420b9921":"ecsubtract(uint256,uint256,uint256,uint256,uint256,uint256)","420c96ea":"newArtwork(bytes32,uint256,string,string,string,uint256)","420d0ba4":"nobodyCanDoThis()","420d23fd":"POOL_EDIT_1()","420d4a02":"getUnlockedAmount(address)","420d4bdd":"CRYPTAU()","420dd15a":"getLast(string)","420ddaa6":"encodeKYCFlag(bool)","420e1f51":"tokenExchanges()","420e7ea6":"tokenAmountRasied()","420ef2b3":"TargetHash()","4210ad0e":"newBurnableOpenPayment(address,uint256)","42111339":"contributeLocal()","42118f51":"manualLCs()","4212616b":"localsUser()","4214352d":"write_what_where_gadget(uint256,uint256)","4214d52f":"updateIndex(address,address)","421521b1":"finalizeOpenSale()","42154e9c":"countAddress()","42159ca3":"getMaxDelayDays()","4215a39b":"getCreateMarketNumOutcomesValue()","4215da7d":"investorsStorage()","4216503c":"setFunStr(string)","42170736":"secondPhaseStartTime()","421715c2":"canBorrow()","42173c98":"purchaseCompany(bytes32,bool)","42193473":"DUST_LIMIT()","421a5727":"stealPot()","421ae949":"thawTokenTransfers()","421aeba2":"setEditedFalse(address)","421aeda6":"Set_your_game_number(string)","421b2395":"UltiCoinICO()","421b2d8b":"addUser(address)","421c0d9c":"unregisterDsp(address)","421d72e2":"isPaymentForked(uint256)","421db384":"leftICOTokens()","421e2dc2":"getPartnerAmount(address)","421e52e3":"card_gold_minamount()","421ed7dd":"balancesInitialized()","4220324b":"mainSaleStart()","42207083":"getGameRoundOpen(uint256,uint256)","4221115c":"SfomoToken(uint256,string,string)","42226e02":"setMaxEth(uint256)","42235da6":"minimumTarget()","4223ac0f":"ABCToken()","4223ad89":"NewRefundTransaction(uint256,uint88)","4224f2ca":"HzxhcToken(address,address)","42261ea4":"cancelSale(address[])","422624d2":"destroycontract(address)","422627c3":"getDna(uint256)","42263aa2":"set_token_address(address)","422752bf":"getPartialAmountFloor(uint256,uint256,uint256)","42279e82":"removeFromPreSaleRefunds(address,uint256)","422810ea":"transData(address,uint256,bytes)","42285bc5":"_ensureRef(address)","42287b66":"createPromoPerson(address,string,uint256)","4228974c":"Videos()","4229616d":"collectPercentOfFees(uint256)","4229c35e":"setItemPrice(uint256,uint256)","422b00bb":"dataentryclerk()","422b1c70":"setMinweiAmount(uint256)","422b423e":"getCheatWarrant()","422b7964":"_approve(uint256,address)","422c29a4":"getWallets(address)","422c3ad9":"changeEndTime(address,uint256,uint256)","422cbb48":"MarkosToken()","422d3374":"tbitfwdToken()","422d37c4":"mintWithEvent(int256,address,uint256)","422d4cd6":"increasePayout(uint256,uint256,uint256)","422dabac":"allocateEther(uint256,address)","422e33f3":"migrationNewAddress(address)","422e82a7":"EthToCoins1()","422f1043":"addLiquidity(uint256,uint256,uint256)","422f3a2c":"nestedFirstAnyToSome(uint256,uint256)","422fcbd5":"MCST()","4230bb10":"badgeLedger()","42317bbc":"flipRefundSwitchTo(bool)","42318e3d":"percent(uint256,uint256)","4231a2c3":"getLastRound()","4231e2d7":"transferFreezership(address)","4231ee16":"addInBountyProgramMap(address)","42320732":"allSupply()","423252f9":"buscarDocumentoPorTitulo(bytes32)","4232a399":"XC()","42340458":"disable(uint8)","42346c5e":"parseInt(string)","423592ce":"startTde()","4235e336":"BetDirectory()","4235e98e":"Buy(uint8,string,string)","42367389":"test_twoValidEqInt2()","4236b312":"dealContract(uint256,string,uint256,uint256,string)","4236da98":"INTREPID_PRICE_INCREMENT()","42382353":"restartTheQueue()","4238b84c":"DMBToken()","423948fd":"changeCollateralAmount(uint256)","42399220":"setCampaignOwnerById(bytes32,address)","423a7954":"developerfee()","423a968d":"_setRSPScienceAddress(address)","423b1ca3":"battleContract()","423c3a48":"burnTokens(address,address,uint256)","423c485a":"depositFee(uint256)","423d4ef2":"createChannel()","423da88e":"Unix_Timestamp_Binary_Trading(uint256)","423dcf29":"dustToEtherPrice()","423e1298":"setDoNotAutoRefundTo(bool)","423e7e79":"_dispatchEarnings()","423f0b6e":"replaceModule(address)","423f6cef":"safeTransfer(address,uint256)","423fb140":"CrowdsaleToken(string,string,uint256,uint256)","423fcd5e":"_promo()","42402c2c":"fipsTransferMulti(bytes20[],address)","4240a978":"ICO_TILL()","42419336":"ICO_BONUS_RATE()","42427bf8":"upgradeController(address,address)","4243cb36":"payConversionFromTransaction(uint256,address,uint256)","4244e09f":"getBetterBettingInfo(address)","4245508a":"getRoundMaxNumberOfBets(uint256)","424592ca":"calculateDistributedIntervalEarning(uint256,uint256)","424599c4":"seedSaleTokenLeft(address)","4245b0f7":"Lottery()","4245d48e":"getHashes()","4245f3da":"tokenOfOwnerByIndex(uint256)","42465a1e":"getTokenUnits(address)","42469e97":"_setBonusRate(uint256)","4246ad24":"calculateMinedCoinsForTX(uint256,uint256)","4247f52d":"DoRoll()","4248083b":"approveUser(address,uint256)","4248afe8":"addCrowdSaleTokensMulti(address[],uint256[])","424976f9":"registryRead(bytes32,bytes32)","42498389":"transferLimitedFundToAccount(address,uint256)","424a8993":"selectOfferingProposal(uint8)","424a8c0d":"constructorReconToken(address,string,string,uint8,uint256,bool,bool)","424aa0e5":"StockusToken()","424b828f":"CharityReservesWallet()","424bc2e9":"newGame(string,string)","424d6bb1":"changeApi(address,address)","424ddaac":"get_available_interest_amount()","424e418f":"setMinSecondaryAmount(uint256)","424e94da":"VoteHub(address)","424ea3b2":"refund_deposits(string)","424ea872":"startTimestampIco()","424eb9fe":"getInitBalance(address)","424f9947":"privateIcoBonus()","424fa9ec":"Prismacoin()","424fed48":"EBPtandardToken(uint256,string,uint8,string)","424fffda":"updateContact(string)","4251447a":"WhiteListSet(address,uint256)","42516f1d":"startAirdropBy0Eth()","425189e0":"getFashion(uint256)","4251a7a4":"totalNihilum()","4251ecb4":"nMsg()","42526e4e":"bytesToAddress(bytes)","425432b1":"tokensPerAddress(address)","42545825":"hasVoted(address,uint256)","4254704f":"TOKEN_CLAIM_WAIT_PERIOD()","4254b155":"register(bytes32,string,address,address,address)","425543f1":"CreateDummyPlayer(bytes32,uint8,uint256,address)","4255e808":"jackpotContract()","42565405":"setNeuroChainAddress(string)","42569ff3":"limitedPrinter()","4256dbe3":"setReserve(uint256)","4256fa5a":"timeToBorn()","4256fa9f":"exchangeTokens(address,uint256)","4257347e":"freezeAccountToken(address,uint256,uint256)","42577935":"createPanda(uint256,uint256)","4257d3e0":"currentGameBlockNumber()","42585b34":"getSnap(uint256)","42587795":"deploySimpleContract(string,string,uint256)","4258cb76":"Ultracash()","4258d771":"funding_ended()","425946e3":"setCurrentMember(address)","4259701b":"getSocialAccountPw(bytes32,bytes32)","4259b52e":"configurationCrowdsale(address,uint256,uint256,address,uint256[],uint256,uint256,uint8)","425adae7":"isBonusEnabled()","425d4980":"mintAddress()","425d512a":"setDAOContract(address)","425e0d3c":"BasicToken(uint256,string,uint256,string)","425f7857":"taxTokenCreated()","4260c779":"start_ico()","42616d21":"goldTotalSupply()","42618b91":"buyRoundKey(uint256)","426201ef":"lastBlock_v19()","42623360":"stakeOf(address)","426365ad":"setForceOffsetAmount(uint256,uint256)","42636c09":"existIdAfterVersion(bytes32)","4263ed83":"hasNextSeedHashA()","4264b4e0":"ownerPayout()","4266806b":"cf1Wallet2Pct()","4266873f":"setAicPrice(uint256)","426695c6":"getDeedId(bytes32,uint256)","4267e19c":"getOwnedTokensIndex(uint256)","42686bbe":"GetPartLimit(uint8,uint256)","4268a257":"updateRoundInformation()","4268db7d":"cite(string,string)","4269d8ef":"_safeSend(address,uint256)","426a0af3":"updateManyLandData(uint256,uint256[],string)","426a8493":"approve(address,uint256,uint256)","426aa87f":"deleteRecording(uint256)","426ad3f5":"getChainName(uint32)","426b7113":"tokensSoldPre()","426bc60c":"Educoin(uint256,string,uint8,string)","426d4f22":"expandNegative128BitCast(uint256)","426d5ef1":"oraclizeCallbacks(bytes32)","426d70fa":"isPrivateIcoActive()","426e0b20":"daoStakeClaimed()","426e5ae6":"senderTokenBalance()","426e6f8e":"updateValueAndMint(uint256,uint256)","426eae45":"bondingManager()","426eb017":"uri(address)","426f5531":"maxAllProfit()","426fa499":"isIcoStarted()","426fe411":"contributorDeposit()","4270d48a":"nextmarketoffer()","42714978":"removeInvestor(address)","427163dc":"refundBid(bytes32)","4272f2d5":"heroTokenContract()","4273601c":"factoryOwner()","4273bc59":"bids_sorted_refunded()","42740286":"maxMintPoS()","42750020":"tokensCreated()","42753e7e":"isInSale()","4276016f":"oversightAddress()","427654da":"getDailyLimitUsed()","42767018":"smallRate()","4276d082":"FrozenEther()","42772947":"callEndRoundControl()","4277b5b1":"check(address,address,address,uint256)","4277e497":"PaymentRejected(address,bytes8,uint256)","4277e823":"TravelHelperToken(address,address,address,address,address,address)","42787798":"grantedContracts(address)","4278ff31":"setTangibleAssetAddress(address)","427913f2":"getClaimedFinancialData()","4279523e":"serviceChangeOwner(address)","427982f2":"tokenSaleMax()","427a2fc2":"getClaim(uint256,uint256)","427ac5e4":"checkForUpdates()","427b59d3":"HiPrecious()","427b72fc":"proofFailed(address,uint256)","427c854d":"_createSkull(uint256,uint256,uint256,address)","427c9aca":"LogPayoutFailed(address,uint256,uint256)","427d5f2e":"tierAmountCaps(uint256)","427da275":"redeemUTXO(uint256,bytes32[],bytes,bool,uint8,bytes32,bytes32)","427e024a":"AdministratorRemoved(address,address)","427e332f":"lastBlock_a8()","427eebfc":"returnOwnershipOfToken()","427f0b00":"roundInfo(uint256)","427f56ff":"bonusAllocAddress()","427f9614":"getReference(bytes32)","427fa1d2":"getLastNode(address)","427fc2df":"preIcoPeriod()","4280606b":"addCondition(bytes32,bytes32,address,int256,bytes32,address,int256,bytes32)","4281267b":"buyLCARS()","4281a651":"SponsoredItemGooRaffle()","4281b13f":"getAllbetByNum(uint8,int8)","4281b34b":"play(uint256,uint256[])","42836c2e":"hasAddress(address,address)","4283fbe5":"dummyGasBurner()","42842e0e":"safeTransferFrom(address,address,uint256)","42846c09":"Bonus(address)","42849570":"myReward()","4285d477":"teamTokensFreeze(address)","428657f7":"storeNewVesting(address,string,uint256)","4286ed3e":"callBtoWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","4287eef9":"fechStageBlockByIndex(uint256)","4287f14a":"teamReserve()","428840f6":"fadd()","4288d759":"betOf(address)","4289c781":"setSellPrice(uint256,string)","428a2ece":"createTokenVault(uint256)","428a8120":"tier0Total()","428afcd1":"setUpgraded(uint256)","428be33f":"ReleaseFundsAndTokens()","428c91ae":"genAddressFromGTIN13date(string,string)","428d475a":"beConstant()","428d5630":"mintOnDemand(address,uint256)","428d64bd":"getShares(address,bytes32[])","428e2d64":"getMsg(address)","428e357b":"getUInt8(bytes32,bytes32)","428e5aaa":"addToPrize()","428eb006":"batchAirdropWithLock(address[],uint256,bool)","428eb5cf":"getRandomNumber(int256,int256)","428f180c":"minimumSpend()","428f4146":"SimplePHXExchange()","42906029":"newManager()","42909a9e":"create_game()","4290a5b9":"uninject(address)","4290bd4d":"isTokenOfferedToken(address)","4290db52":"burnFromAnotherAccount(address,uint256)","4290e6b6":"setTokenName(address,uint256,string)","42915914":"test_dispersal()","4292327c":"_isMyLeague(uint8)","42923409":"ArinToken()","4292a797":"ZAZA()","4293253c":"tokenSaleLowerLimit()","429374f3":"ScorpioCoin(address)","42946d88":"getIGOAccoountByAddr(address)","4294857f":"isRevoked(bytes32)","42948e18":"getSenderAddress()","4294bea0":"BarcelonavsRoma()","4294cdb2":"BixcPro(uint256,string,uint8,string)","42958b54":"issue(address[],uint256)","42966c68":"burn(uint256)","4296a9cb":"getNodeRightChild(bytes)","4296b4a7":"freezePlayer(address)","42974b1e":"freeReferralPacksClaimed()","42980e20":"LifeToken()","429838e0":"Allow_Entries()","42992dd5":"icoStartTimestampStage2()","4299431e":"REALMock(address)","42995e12":"canReceiveMintWhitelist()","4299c213":"lastReading(address)","4299f706":"PonziScheme(uint256)","429a2591":"convertAmountToTokens(uint256)","429aa0a4":"DAILYC()","429adcb9":"minSumICOStage7USD()","429b62e5":"admins(address)","429b92bf":"getProposalName(uint256)","429c1561":"setReputationProblems(address,string)","429c6e5b":"getClaimedAmount(uint256)","429cddca":"selectOwnerAddressForTransactionFee(address)","429d15ba":"testCorrectFunctionIsCalledOnTransfer()","429d6a69":"walletBeneficiary()","429f3b48":"blockAccount(uint256)","42a04fea":"getBadges()","42a1928b":"initSale(uint256,uint256,uint256)","42a19c71":"giveProjectTokens(address,uint256)","42a1f3eb":"ProvToken()","42a37176":"showMyEtherBalance()","42a38a00":"mediatorWallet()","42a4af66":"updateCatReleasePrice(uint32,uint256)","42a5000d":"startPRESALE()","42a63361":"updateTribeProducts(address)","42a657fd":"primaryListing()","42a6617d":"stepTwoRate()","42a66f68":"totalRate()","42a6739b":"acceptRandom(bytes32,bytes)","42a6b21a":"getContributionLimit(address)","42a6c4dd":"getBidByToken(address,uint256,uint256)","42a745cb":"testBitEqualSuccess()","42a787fa":"determinePlayer(int128,uint128,uint8,bytes32,bytes32)","42a7a8e0":"SmartzToken()","42a7c40e":"ThiccCoin()","42a7cfd5":"naturalUnit()","42a8f2f4":"internalTransfer()","42abfde8":"getLunckyIndex(uint256)","42ad2c6f":"maxPreIcoDuration()","42ae07c0":"RateRemove(address)","42ae0a16":"crowdsaleBalance()","42aeba30":"Shipment(address,address,string,string,int256,int256,uint256,uint256)","42af2478":"PartialFundsTransfer(uint256)","42af4821":"TUDOR()","42af8f0c":"buy(uint256,uint256,address,address,address)","42b07d6d":"cashBackFromProject(address)","42b1295a":"addMultipleAllowedAddresses(address[])","42b2106c":"FoundationTransferred(address,address)","42b222bd":"showTokenValue(address)","42b31b1f":"Elythrium()","42b38674":"isValidValidatorSignature(address,bytes32,address,bytes)","42b41aa4":"sendCoin(address,address,address,uint256)","42b4632e":"canPropose(address)","42b4807a":"getRegionCoordinates(uint256)","42b4ef95":"Helper()","42b50a7a":"getOrderById(uint256)","42b594cb":"buyTicketByEth(uint256,bytes32,bytes32,bytes32)","42b5a2a9":"maxTxGasPrice()","42b614a9":"round_after()","42b64a59":"VisionX()","42b8c415":"balanceTotal()","42bb5709":"FundsTransfer()","42bb66c4":"setInvest(uint256,uint256)","42bd0959":"setIsBuyByAtom(uint256,uint128)","42be5eea":"thing(string,string,uint8,string)","42be9307":"changeSale(bool)","42beb58b":"setPreSaleOff()","42bf1270":"cslToken()","42bf41ae":"drainStrayEther(uint256)","42bf4431":"orderMatchTest(uint256,uint256,uint256,int256,uint256,uint256,address,address,int256)","42bf5347":"getUserFreezeInfo(address,uint256)","42bf8db3":"getRate(string,uint64)","42bff0d0":"setExchangeAdapterManager(address)","42c01f66":"setRateEarlyStage3(uint256)","42c1867b":"mintAgents(address)","42c1ea29":"evidenceInterval()","42c23db5":"AddToDividends(uint256)","42c2d31a":"EtheremonToken(address,address,address,address)","42c304be":"accountsListLength()","42c3301a":"showJackpotThisRd()","42c469e0":"GameSpiritCoin()","42c501a1":"LogOwnerTransfer(address,uint256)","42c50f75":"TeamMembersAmount()","42c549c0":"getMilestones(uint256)","42c5d7ad":"sendAdvisorsBalance(address,uint256)","42c62865":"withdrawsCount()","42c6498a":"genesisTime()","42c65ae5":"eUSD()","42c69566":"get_address(address,string)","42c71f1d":"getApp(bytes32)","42c74c73":"EPVToken()","42c7551e":"tokenRemain()","42c7ea5f":"totalNumberAvailable()","42c80fc9":"isUpgraded()","42c81f45":"MLB_Legal()","42c8705b":"Mine()","42c87205":"VirgoContract()","42c96767":"EtherHiLo()","42ca08cf":"applyFadeoutToOptions(uint32,uint32,uint32,uint256,uint256)","42ca2fe3":"FCOIN1110Token(uint256,string,string,uint256)","42cb1fbc":"ETHER()","42cbb15c":"getBlockNumber()","42cc6b04":"addAuthorizedEditAgent(address)","42cde4e8":"threshold()","42cdfe37":"tokenWithdrawEther(address)","42ce0555":"DisableSuicide()","42ce0aff":"registerAndValidateToken(address,string,string,uint256,uint256)","42ce0f30":"testThrowUpdateLatestRevisionNotOwner()","42ce1488":"upload(string)","42cf0a4b":"increaseEthBalance(address,uint256)","42cf0e72":"searchByOwner(address)","42cf2f81":"getSequence(bytes)","42cfd792":"postJob(uint256,uint256,uint256,bytes32)","42cffda9":"TREETOKEN()","42d01878":"keyRequired()","42d02b30":"HARD_CAP_IN_TOKENS()","42d16748":"getMinDailyWithdrawalLimit()","42d1b202":"_adoptSameClassAxies(address,uint8,uint256,address)","42d1f17f":"bankrollerTable()","42d2c127":"getStagesBeginEnd()","42d46a9a":"castVote(uint256,uint256,bytes32,string,bytes32)","42d544fb":"disallowSale()","42d596e0":"isPoint(int256,uint256,uint256)","42d64601":"pacifistmasterReq()","42d7cc8e":"Tx(address,uint256,string)","42d8f5be":"customPayment(address,uint256)","42d928fc":"SWIFTSCO(address)","42d9643c":"KYCLimitValue()","42da3b6b":"getAmount(uint256,address)","42daf6ee":"icoStartP6()","42dbad44":"makerOf(string)","42dbcdba":"weiRaised(address)","42dca9ea":"getManifestIdsByRegistrant(address)","42dd519c":"getClients(uint256)","42dd96f7":"killswitch()","42df7085":"ROLE_EXCHANGER()","42dfb036":"calcRateFromQty(uint256,uint256,uint256,uint256)","42e06ee7":"HotCold()","42e11316":"claimReadership(uint256,string)","42e1452a":"PolarisUniversalToken()","42e15c74":"managedTokenLedger()","42e16015":"AddedBlackList(address)","42e296d3":"soundEffects(uint256,uint256)","42e2d18c":"presaleIsRunning()","42e2da09":"QuantorPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256)","42e2f54c":"shutDownFund(address)","42e35f63":"addGoal(string)","42e3b919":"NMFToken()","42e49d5a":"FUNDING_GOAL()","42e4d72b":"oxen()","42e5033e":"mainSaleEndDate()","42e59afa":"reloadRound(address,uint256)","42e5b9f1":"totalDistributedDividends()","42e5d5c8":"getPI_edit_17()","42e5da0d":"UpdatePlatformContract(string,address)","42e6377f":"LabtorumToken()","42e6c88a":"approveObjectReception(uint256)","42e7ba7b":"hasManagerAccess(address)","42e8051c":"testExternal()","42e81b0c":"dislikeCelebrity(uint256,uint256)","42e86d27":"callData(address,bytes)","42e90c33":"Store()","42e9555e":"getProviderLastSupplyID(uint256)","42e956f6":"addtoMarketingBusinessDev(address,address,uint256,uint256)","42e9c6ce":"pullTokens(address)","42ea74c0":"getTokenPriceInWEI()","42eabc29":"posibleRedemptionOf(address)","42ead91f":"getMegabox(uint256)","42eafaf5":"showFPInfoAll()","42ec38e2":"tokenOf(address)","42ed00da":"getSenderArmyDetails()","42ed567c":"tmpQuerySeed(uint256,uint256)","42ed5816":"ethDailyLimit()","42ed6072":"publicBattlepm2()","42ee4e0b":"ICO_PRICE5()","42ef4c1a":"hodlerTime6M()","42ef8c76":"alsToken()","42efdebf":"exchangeAdmin()","42f030e4":"minusTourFreezingTime(uint256)","42f0b07e":"BountyFund()","42f0ca0d":"setPreSaleEndDate(uint256)","42f1181e":"addAuthorizedAddress(address)","42f362aa":"registerNameCore(uint256,address,uint256,bytes32,bool,bool)","42f39381":"presaleRate()","42f39a6f":"ARXPackageSale()","42f3f7e0":"activate_reserve()","42f45790":"testAddress(address)","42f57e4c":"enableUser(address,bool)","42f5d95d":"AllUnLock()","42f6208e":"lock(address[])","42f6487a":"payment()","42f6e389":"isModule(address)","42f81580":"CLAIM_DEADLINE()","42f85ce5":"pay(address,uint256,uint256[])","42f88548":"updateRegionPixelPrice(address[16],uint256,uint256)","42f88699":"ExShellToken()","42f9192a":"nameFilter(string)","42f91e9e":"BcxssToken()","42f989e2":"setUnlockTimeStamp(uint256)","42f98b14":"buyIssuerTokens()","42f9b306":"teamLockTransfer(address,uint256)","42fa3967":"toSlice(bytes,uint32)","42fa98e0":"Orange()","42fba0f5":"grantedTokensHardCap()","42fbbc9c":"managerPercentage(bytes32)","42fc63be":"DebugHash(bytes)","42fd6acc":"checkProof(bytes32[],bytes32)","42fd7d4c":"_buy(address)","42fdbed7":"isDeDeContract(address)","42fea02b":"confirmPayer(uint256,uint256)","42feba84":"arbiterResponseRate(address)","42ff1c1a":"getMetadataURL()","42ffb76b":"getWorkflowName()","4300705d":"withdrawGTO()","4300e8ef":"addContract(address,string)","4301b55b":"MintOpened()","4301cbe5":"getAllNames(string)","43021054":"BTestToken(address,string,string,uint256,uint256)","43021202":"fundValuePublish(uint256,uint256,uint256)","4302b3c8":"myTotalSupply()","43031e9b":"getSumOfPlayers()","4303707e":"generateRandomNumber(uint256)","43039433":"handleReturnData()","43046844":"placeBet(uint8)","4304a43f":"updatedBalance()","4304a6b9":"setUnfreezeStartTime(uint256)","430558c2":"buyGifto()","43062ea7":"changePurchaseCap(uint256)","4306cc3f":"queryEarnings(address)","4307d081":"jazzxToken()","4308a36b":"getIcoPrice()","43090357":"readUserPurchasedToday(address)","4309b4b2":"getPollIdentifier(address,bytes32,bytes32)","430a74b7":"CrypcenToken()","430ab56a":"sendAllLocalEthers(address)","430ae7a2":"AvtcToken()","430bf08a":"vaultAddress()","430c2081":"isApprovedOrOwner(address,uint256)","430c2a69":"crdjetToken()","430c73c5":"setMarketAddress(address,address)","430ca46f":"finishAuction()","430d2803":"getTotalPossibleTokens()","430d6eb2":"ParadiseToken(address)","430de98a":"GetCardNumber(uint8,uint8)","430e484a":"setupNetwork()","430ecff8":"blksze()","430fe5f0":"changeWorkerPrice(uint256)","430fe9c1":"getDate()","4310033d":"Gotoken()","43102eab":"isItConstantinopleYet()","43104d92":"addMultipleRecordsStrict(uint256[])","43107290":"createRequest(address,address[],int256[],address,string)","43114842":"acceptChallenge(uint256,uint256,uint256)","4311de8f":"ownerWithdraw()","43128a4c":"feeUSD()","4312f19c":"setTransferEmittables(address,bool,bool)","4312fece":"addAddressToIndex(address,address)","43133b07":"gameBeginPlayNo()","4313b9e5":"setup(uint256)","4313de82":"closeBidOrder()","4314162d":"untsqm()","431454fb":"totalMintedBountyTokens()","43146f36":"resetBet()","431562b9":"countWithdraws()","43156db6":"withdrawOldToken(address,uint256)","4315f545":"proofType_NONE()","43160e3d":"rootOfTrust()","4316abbb":"newJester(address)","4316fae5":"NABC()","43171485":"tokensHasSoldOut()","4317f04a":"Transfer(address,string,address)","431851ad":"NenoToken()","431993b9":"endPrivate()","4319dfd9":"defence(address,uint256,uint16,bytes,uint256[])","431a4d46":"getContractSample(string)","431ab1f2":"xmasFundWallet()","431ab233":"allOperations(uint256)","431adcb1":"isSellOpen()","431bff74":"MINING_POOL_AMOUNT()","431cc3dd":"batchWithdraw(address[])","431d6256":"Conversion(address,address,address,uint256,uint256,uint256,uint256)","431dac16":"registerUser(address,string,uint256,uint256,uint256,string,bool)","431dbd9e":"getLatestRaffleInfo()","431dc4b6":"current_period()","431dc892":"OwnedProxy(address)","431e0a48":"AnteilToken()","431e83ce":"absMaxFee()","431ef9b5":"OptionsConversionOffered(address,address,uint32,uint32)","431f188c":"set_presale_arbits_per_ether(uint256)","431f21da":"createAuction(uint256,uint256,uint256,uint256)","431f63c9":"setTokenPrice(address,uint256)","4320ea1c":"CrowdsaleBase(uint256,uint256,uint256,address,address[])","43212413":"Addr2()","43212c3c":"getHighestMilesAt(uint256)","43214675":"setMintAgent(address,bool)","43216a11":"MAX_NUM_AVAIL()","43226631":"CURRENTLY_ISSUED()","4322b73b":"getAdd(uint256)","43235a24":"_transferProperty(uint16,address,uint256,uint256,uint8,address)","43243797":"fundsOf(address)","43245816":"tokensToEther_(uint256)","43245953":"CoinToken(uint256,string,uint8,string)","4324aa21":"classOf(uint256)","4324ae4f":"PhoenixExchangeDeposit()","4325f6bb":"OfferToCastle(uint256,uint256)","432607fc":"cancel(address,address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","4326e22b":"getMerkleTreeRoot(bytes20,uint8)","4326f3f6":"setMinimumPriceCount(uint256)","4327115b":"_AddedToGeneration(address,uint256)","4327979a":"getPaymentParams(uint8)","4327acda":"addDeal(address,address,address,uint256,uint256,uint256,uint256,string,uint256)","4328894f":"showReportForMonth(uint16,uint8)","4329db46":"transferETH(uint256)","432a042b":"makeRegistration(bytes32)","432a3dfb":"roundState(uint256,uint256)","432a805b":"changeDailyRate(bytes32,uint256)","432a84d9":"ownerDepositInterest()","432a89aa":"GetBuildingParam(uint256)","432af6e9":"calculateTokensForMonth(address)","432b3f85":"fetchVoteResultForCandidateBySnapshotBlock(address,uint256)","432ba8be":"voterToBallotID(address)","432c4209":"IQT_DECIMALSFACTOR()","432c685f":"trustClient(address)","432ce549":"sendToUser(address,address,uint256)","432ced04":"reserve(bytes32)","432d7a1e":"_dividendsOutstanding(address)","432e83c5":"resetReferedCount(address)","432e8946":"disableTransfer(address)","432f0d20":"EVA(uint256)","432f3223":"AceFund()","432f3c22":"request_until()","43302ff3":"getMaintainFee()","4330301f":"_ratio()","4331576f":"BITVM()","4331e00f":"pay_claimed(address)","4331e8dd":"setLeader(address)","433288a2":"setCurrency(string,address,address,uint8,bool)","4334614a":"isBurner(address)","4334a8a5":"CHAD()","433503f6":"ChangeEmissionSumm(uint256)","4335b046":"CRAWDSALE_EARLYBIRD_END_DAY()","4335dfc0":"getPurchaseTimestamp()","43361a6e":"MineralBase()","4336a5a8":"EtherGold()","433740f8":"Purchase(address,uint256,uint32)","4337b391":"PriceDiscovery(address,address)","433836dc":"scheduleTransaction(address,bytes,uint8,uint256[3],uint256)","43386ea9":"getUniqueValue(uint256)","433900db":"presaleTokensLimit()","433914c9":"VeChainX()","43398685":"BancorFormula()","4339bc30":"changePool(address)","433a8323":"UnityCoin()","433adb05":"tokensReserved()","433b409f":"BTTSTokenListing(address,address,string,string,uint8,uint256,bool,bool)","433b64b1":"eventId(uint256)","433b77c7":"getCampaignOwnerById(bytes32)","433bb0e4":"fillOrder(address,address,address,bytes32,address,address,uint256)","433bd924":"getBreed(uint32)","433c39ff":"transferVoteController(address)","433cdc26":"PriceAdjusted(uint256,uint256)","433d0f33":"canUserCancelArtwork(address,address)","433d4aab":"resolve(uint8,uint8)","433d7110":"provas(address)","433e852d":"flushDividends(uint256)","433fc1da":"Bandit()","43406182":"enableLotteryGiveHunt()","43409bc5":"linkData(bytes)","4341274f":"_sameClassAxiesPrice(uint8,uint256)","4341aebc":"distributeTokensToRank(uint256[],uint256)","43428e45":"minimumNumberOfBlocksToEndGame()","4342e966":"approve(address,uint8)","4342ffe5":"changeMinimumContributionForPrivatePhase(uint256)","4343ede6":"currentStageNumber()","43441a2c":"totalGivenBountyTokens()","4344f73d":"AssToken()","4345c7c9":"_upgradeTo(string,address)","434622fe":"additionalMint()","43463b98":"getconf()","43463c3a":"UnityToken(uint256)","4346aa58":"ITTM()","4346ea77":"PrimasToken()","43471101":"getSenderFunds(address)","434786f4":"getBalacne()","434847e0":"withDrawFees()","4349168e":"GenesisSalesPriceCount()","434a55eb":"bonusFirstTwoDaysPeriod()","434afdfc":"totalObol()","434b1208":"rescueOrder(uint256)","434b14e7":"randomGen(uint256)","434b349c":"LCEToken()","434b635e":"getMaxBetAmount(uint256)","434c4498":"EthperPoe()","434cb64c":"startNextGeneration()","434d16f5":"rotate_left(uint32,uint32)","434d185c":"getKingdomOwner(string)","434df07e":"NewSerpent(uint256)","434e0618":"addMedicalProviderReply(address,string,string)","434e6a55":"addWebsite(address,string)","434ea7d3":"_lottery5(uint256,address,address)","434ec416":"EXT_COMPANY_STAKE_ONE()","434f5f27":"checked_in(address)","434f811b":"partIndexToApproved(uint256)","434fb2ae":"PRICE_MULTIPLIER_ICO3()","435010d8":"SrcToken()","43503fac":"getWord(uint256)","43509138":"div(int256,int256)","43516832":"getSuppliers()","43525d73":"MAX_FUNDING_SUPPLY()","435263ef":"ecosystemWallet()","4352e407":"RozetkaCoins()","4352fa9f":"setPrices(address[],uint256[])","4353401f":"NetkillerAdvancedTokenAirDrop(uint256,string,string,uint256)","43543242":"isSignatureOkay(address,bytes32,uint256[3])","4355644d":"addMonths(uint256,uint256)","43558826":"exchangequeue(address)","43559743":"edgePigment(uint8)","43562bd0":"NextRewardBonus()","4356f35b":"addIntermediary(address)","43574d9e":"owner2Of(uint256)","4357855e":"fulfill(bytes32,uint256)","43579fe8":"deleteShop()","4357b3de":"getCrowdsaleTier(address,bytes32,uint256)","4357da58":"pausePreSale()","4357e20f":"MinSlippageFactorSet(uint256,uint256,address)","4357e289":"Multiplexer(address,address[])","43581c80":"tdeFundsRaisedInWei()","4358630f":"Certificate(address,address,address,address,address)","4358c156":"isBonus()","43596b8b":"getLLV_edit_25()","435a0803":"testNowClock()","435a1220":"createERC20TokenNetwork(address,address)","435ad5c1":"getMixedStack(bytes32)","435adacc":"EtherrateUpd(uint256,uint256)","435ae547":"ResumeTokenAllOperation()","435afa54":"changeRepoSettings(uint256,uint8,uint8)","435bb6b9":"nextJackpotTime()","435c35b6":"startGeneralSale()","435ce40a":"isAccount(address,address)","435cebda":"createMember(address,address,bool,bool)","435cf753":"winCount(bytes32,address,address)","435dc3fb":"setGenesisAddress(address,address,uint256)","435e119e":"SetupRaffle(uint256)","435e33a5":"TokenRewardsAdded(address,uint256)","435f02f9":"ACIFToken()","435ffe94":"setHello(string)","4360617b":"Sell(bytes32,address,uint256,uint256,address,address)","4360f90f":"getOfferState(bytes)","436108ce":"changePasswd(bytes32,address,uint8,bytes32,bytes32)","4361443f":"getClaim(address,bytes32)","43614f8b":"endFinalStage1()","4361b3f9":"TokensCreated(address,uint256)","43620f24":"startWork(uint256,bytes32,bytes32)","43626c52":"AllInvestorsRefunded(uint256)","4362c088":"affiliateLevel()","4362c116":"transfert(address,uint256)","43634c39":"useSuperPowers()","436393ab":"AlrzshTest()","4363e888":"withdrawERC20Tokens(address,address,address,uint256)","43655fd3":"votesItem(address,uint8)","436577ae":"createIssuance(uint256,uint256,uint256,uint256,string,string,uint8,uint256)","4365e11e":"BingoLight()","43668efa":"ProposalAdd(uint256,address,string)","4366af55":"RTC(uint256,string,string)","43677ca7":"checkInternalBalance()","4367aa3c":"_isReserveUnlocked()","4368600c":"initDeposit()","436962b4":"_setTarget(address)","4369a2c2":"charityAmtToCharity(address)","4369c250":"rewardsFactor()","436a66e7":"length(string)","436a88c1":"DEV_FEE()","436b6158":"card2PowerConverter(uint256[])","436b8fa5":"Salman_nomaniTestCoin()","436d4ff5":"hash(string,address)","436d796c":"startPreIco(uint256)","436d8fd6":"setGameBanker(address)","436da5fe":"transferLog(uint256)","436e1e2e":"computeAirdrop(address)","436e388d":"enterWallet()","436ee4af":"SEEDS_TO_HATCH_1RICE()","436f64ac":"rInFp()","436fdc0e":"getBattleCardsInfo(uint256)","436fedc3":"getRegionUpdatedAt(uint256)","43700afe":"strConcat(string,string,string,string,string,string)","43703b0e":"getEventData(bytes)","437159de":"SYCPrivateEarlyPurchase()","4371c465":"isWeekEnd(uint256)","4371e46e":"blockCount(uint64)","43722993":"NPSTToken(address)","43722b09":"extOwner()","437257bd":"handlePointer(uint256,int256,uint256)","4372df99":"getNotaryForSeller(address)","4373f3b4":"setFunding(uint256,uint256,uint256,uint256,uint256,bool,uint256)","4374356b":"DRUGS_TO_PRODUCE_1KILO()","437583a9":"updateReserveToken()","4376890e":"egcToken()","437764df":"getBridgeMode()","43777117":"getMarketOptions()","4377cf65":"numberOfContributors()","4377d12c":"ChooseWHGReturnAddress(uint256)","437852b6":"getRefererAddress(bytes)","4378a6e3":"getAttributes(uint256)","437933cc":"setDataFeedHash(string)","437a8ae6":"multiple()","437b1a1d":"KITTY_BURN_LIMIT()","437c58a8":"YourtekToken()","437c9162":"pre_mined_supply()","437cfa4a":"setContractICOAddress(address)","437d07d5":"mktCoinCap()","437dbf49":"_isAuctionAble(uint256)","437f5b65":"isLUNVault()","437f6a4b":"userMakeOrder(address,address,uint256,uint256,address)","437fa667":"appAccountsLength()","4380ab6d":"clock(bytes32)","438195f9":"MAX_WHITELISTED_COUNT()","4381a07b":"setCustomDisputeFee(bytes32,uint256)","4381e1c5":"verificationAddressHoldersListNumberMap(address,uint256)","4383603b":"setAllowHalfLife(bool)","43846074":"getPreviousDarknodes(address,uint256)","43846fc8":"shortLock()","4384d53a":"BunnyCoin()","43859632":"hasVoted(uint256,address)","43863045":"addUintSetting(string,uint256,address,address,string)","438652e0":"addTransferWhiteList(address)","4386fe0d":"changeMinTokenSale(uint256)","43876776":"setPubKey(uint256,uint256)","4387d35a":"lockedWallet()","43886946":"getPlayerTeam(uint256)","43894ac3":"setMintMarketMakerApproval(address,address,address)","438af924":"buy(uint256,bool,uint256)","438b2aed":"setSettings(uint256,uint256,uint256)","438b7b99":"setProfitRatio(uint256)","438b9ff2":"payForUrl(address,string)","438c3585":"releaseTokensBlock()","438c3aff":"contractIds(uint256)","438c9068":"ownersProductCommissionInPerc()","438c9509":"test_invalidTokenFreeze()","438cd2d3":"UnPause()","438d1bd7":"storeBubbleSort(uint256[])","438d359e":"buyXname(bytes32)","438e1316":"next(uint80)","438e15fc":"contains(uint256,uint256)","438f1eee":"PowZoneToken()","4390921e":"distributeOne(address,uint256)","43909d76":"EthCannabis(address)","4390a4f8":"batchTransferToken(address,address,address,uint8,bytes32[])","439198af":"timeLeftToContestStart()","4392281e":"SCTX()","43923258":"addAddressToAccessControl(address,uint8)","43925cc3":"getRoomPlayers(uint256)","43927707":"NehalCoin()","43928cfd":"addClient(address)","439370b1":"depositEth()","4394cc96":"versionBase(bytes32,bytes32)","43951999":"getReportingWindowForForkEndTime()","4395dc06":"getTokenInfoTokenList()","43973140":"check_lock_period(address,address)","439766ce":"pauseContract()","43977911":"addFreezeList(address)","4398da85":"tokensPercentageForKeyHolder()","4398fbd6":"treeWater(uint256,uint256)","439abc5b":"getLockByIdx(address,address,uint32)","439b91c4":"addBlockeddUser(address)","439be05c":"getLoanFilledAmount(bytes32)","439d4265":"recordToTransfer(address,uint256,uint256)","439d7275":"issuerSymbol()","439e10e5":"createUniqueSpinner(string,address,uint256)","439e97c4":"alertCreators(uint256)","439f5ac2":"getEndTime()","439f7d3c":"getSponsor(uint32)","439fab91":"initialize(bytes)","43a085c2":"ProsperPresaleToken(address,string,string,uint256,uint8)","43a335d6":"CreditCarToken()","43a4344f":"calcNetworkFee(uint256)","43a44f1e":"bonusTimes(address)","43a468c8":"delegateBalanceOf(address)","43a47345":"floatHolder()","43a47ae2":"EthTermDeposits()","43a61a8e":"rootOwnerOf(uint256)","43a68f3a":"NegToken(uint256,string,uint8,string)","43a6e680":"DonationSentButNotDoubled(address,uint256)","43a77530":"serviceAgent()","43a78b50":"MyAddress()","43a7f749":"getInitialPriceOfToken(uint256)","43a8775a":"amountOfBagTypes()","43a886ea":"filterBrick(uint256,bytes32[],uint256,uint256,uint256)","43a88da6":"buyOpen()","43a8d9d5":"authorizeWithdrawal()","43a92f24":"getAvatarInfo(uint256)","43aa8784":"endedGameCount()","43ab599f":"EPSCoin()","43ab850b":"setDividends(uint32)","43abab26":"whitelist_addys(address[])","43acb067":"ChefICO()","43acd7bc":"Bailout()","43ae2695":"propertyToken()","43aefca0":"withdrawThetokens(address)","43af755a":"blockedDeadLine()","43b03d37":"i(address,address,uint256)","43b0e8df":"set(uint256,uint256,uint256)","43b114fd":"getMyCoins()","43b12e95":"BCEToken()","43b1938d":"getPhaseSale(uint256,uint256)","43b1c529":"getSig(string,bytes4)","43b25452":"createPortfolio(uint256)","43b3181c":"AIOS()","43b3769e":"checkStatus(address,uint256,string,address)","43b3aa46":"getTokenAmountOf(address)","43b50d8e":"evKickoff(address,uint256,uint256)","43b5126d":"getVendingPrice(uint256)","43b6c7d0":"setClaimedFlag(bool)","43b6caf3":"setMintPerBlock(uint256)","43b7d9c8":"ITToken()","43b7fd58":"RoomRoundAdd(uint8)","43b812ef":"r2VaultAddr()","43b89c62":"getTransactionAtIndex(address,uint256)","43b8aedf":"gimmeTendies(address,uint256)","43b978b3":"playerNames(address)","43ba2cf5":"transferPreSaleTokens(uint256,address)","43bb6a63":"getmemreqscount(uint256)","43bc1612":"artist()","43bc867e":"claimStupidFluffyPink(uint64)","43bcf52a":"bbdToken()","43bd262e":"injectAvatarService(address)","43bd6e6f":"changeColorYellow()","43bdaacb":"getPlayerInternalWallet()","43bddf40":"horses()","43bdfb72":"updatedTime()","43bf63e8":"priceInWeiEdition(uint256)","43bf718e":"getHashOfTheProposalDocument()","43bf74ef":"setKYC(address,uint256,uint8,uint256)","43bff765":"tokensPerMicroEther()","43c09e77":"updateNote(uint64,uint16,bytes12,bytes)","43c0d38c":"getSlotId(address,uint256)","43c14b22":"revokeVote()","43c1598d":"maxProfitDivisor()","43c1f0ed":"timeBeforeJackpot()","43c238db":"POMCOIN()","43c273c7":"DevSupply_Released()","43c29522":"PUBLICSALE_USD_PER_MSENC()","43c33ac9":"submitShares(uint256,uint256)","43c35651":"completeCrowdSale()","43c3658e":"EmporeumToken()","43c37393":"solveTask(uint256,uint256)","43c569f4":"TotalWin()","43c5d889":"locationOf(bytes,uint256)","43c639e7":"ownerResetLockedShares()","43c6b1f2":"_transferAsset(address,address,uint256)","43c6d558":"SportsBet(string,uint256)","43c6e10d":"getAffiliateCommision()","43c6eff1":"submitClaim(uint256,uint256,uint256,uint256,bool)","43c8124d":"PoolAdvisors()","43c885ba":"inited()","43c8c30e":"removeModeratorship()","43c9a189":"allocate1ProjectToken()","43ca46dd":"_ownsToken(address,uint256)","43ca57bc":"getRetailerStatus(address)","43ca78a2":"getNotaryInfo(address)","43ca86c6":"nukeApps()","43ca9d26":"onNewCampaign(uint256,address,uint256)","43cade1c":"reStartPreIco()","43caf0dc":"distroyToken(address)","43cb0af7":"getBytesArrayLength(bytes32)","43cb2b03":"getCurrentTokenCost()","43cb3189":"ETHZToken()","43cbbce6":"icoRound2()","43cc113b":"holdersBonus(address)","43cd1638":"deposit3()","43cd2c40":"UpdateForecast(bytes32,bytes32,bytes32,bytes12)","43cd5ea1":"sendBussinessByOwner(address,uint256)","43cd9655":"XBTexToken()","43cdaad2":"modelId()","43cdc49e":"unlockTokens(address,uint64)","43ce179e":"issueOwnerMore(uint256)","43ce7422":"getMyEggs()","43cf5f0c":"PunaniSupply()","43cfbd65":"getCompanyName()","43cfd44c":"recover_unclaimed_bets()","43cffefe":"challenge(bytes32,string)","43d018a0":"whitelistMaxTok(address)","43d0ee54":"userRounds(address)","43d111ae":"binScan(uint256,address)","43d1498b":"setCoAuthor(address)","43d1be7b":"setPresalePhase()","43d24a5e":"addUpdater(address)","43d32e9c":"getSellPrice()","43d3a4c1":"getTotalVoters(uint256)","43d42780":"icoSoldTokens()","43d4759f":"HuuuumanStandardToken(uint256,string,uint8,string)","43d47f82":"ProjectFund()","43d4b78b":"stateIsWaitingReplay(uint256)","43d5773b":"SpaceCraftCore()","43d64976":"OwnershipDeleted(address,address)","43d6add1":"accessoryOnLeaderboards(uint64)","43d6cac5":"removeTokenMetadata(uint256)","43d6ec16":"LIFEFORM()","43d6fab6":"RegularContract()","43d726d6":"close()","43d77c7b":"platContract()","43d7bfcb":"mintBountyTokens(address[],uint256)","43d7cce6":"getToken(address,uint256)","43d84d49":"updateCrowdsaleInfo(string)","43d8b570":"isTeamVestingInitiated()","43d9e070":"sencSold()","43db053e":"withdrawDevShare()","43db24ad":"EthereumWings()","43db5324":"ownerSetCanMining(bool)","43db7821":"BINKEY()","43dbb2de":"MAX_ETH_FUND()","43dc3ab2":"register(address[])","43dc7233":"getTokenCreationRate()","43dcbc86":"hasNotaryBeenAdded(address)","43dd8b30":"updateWhitelistMapping(address[],address,bool)","43ddc1b0":"callETH(address)","43de34dc":"impl_cancelRedeem(address,uint256)","43de6f90":"createHero(string,uint16,uint16)","43de82f3":"revealVote(uint256,uint8,bytes32,bytes32,uint32,bytes32)","43deb064":"LemonSelfDrop()","43deb8e5":"START_SKO1_UNITS()","43ded8e3":"MyGlobeToken(uint256,string,string)","43defc10":"getVendorByAddress(address)","43defdac":"AudtStandardToken(uint256,string,uint8,string)","43e08ad1":"addHash(bytes32)","43e09695":"deactivatePass(bytes32)","43e0c65a":"allowToBurn(address)","43e0dfdd":"Leverage()","43e1b94f":"AnyName()","43e1eb82":"setSiftContractAddress(address)","43e204b3":"isTokenLock(address,address)","43e20f97":"getPoolbyGtype(int8)","43e271ad":"woodworksCities(uint256)","43e2e504":"GetBalance(address)","43e332c5":"Last_block_number_and_blockhash_used()","43e3e527":"Weko()","43e41c44":"Kotlind()","43e4cef1":"processPrivatePurchase(uint256,address)","43e6125d":"Badge(address)","43e6cc40":"issueTokens(uint256[])","43e6cc64":"StopToken()","43e72c5a":"totalPotHomeTeam()","43e74f46":"sendPrepaidEthTweet(uint256,string,string,string)","43e76a26":"SellerRequestedCancel(bytes32)","43e7aa1d":"commitPhaseLength()","43e91384":"setICOEndDate(uint256)","43e92866":"reservingPercentage()","43ea0313":"setRitualFee(uint256)","43ea8d7b":"newWithdraWallet(address)","43eb37e2":"initChargeJNT(address,string)","43eb5ac7":"getData_21()","43ec31e2":"TdToken(address)","43ec3f38":"toSliceB32(bytes32)","43ed2863":"StandardToken(string,string,uint8)","43ee67cf":"_transferFallback(address,uint256,bytes)","43f0179b":"takerFee()","43f29372":"redeemWinningTokens()","43f294a6":"setCrowdsaleStop()","43f3d27c":"setPrPercent(uint256)","43f415d0":"executeDecayFunction(uint256,int256,int256,uint256,uint256)","43f46a5c":"getPolicyState(uint256)","43f48fbd":"rates()","43f4cb4b":"GetCurrentTypeDuration(uint256)","43f58f9f":"createNetwork(string,uint256,uint256,uint256,uint256)","43f6c643":"purchaseRequest(uint256)","43f6c741":"HGToken()","43f70917":"create(address,address,address,address,address,address)","43f70f60":"dna5(uint256)","43f73a3d":"UpdateCurrency(uint256,string,string,string,string)","43f76b98":"generateLuckyNumbers(uint256)","43f8c639":"tickets100kprice()","43f97628":"EcosystemFund()","43f98345":"calculateAllReclaimedNow()","43f98a56":"tradingDate()","43f99e68":"refundExternalPurchase(address,uint256,uint256)","43fb86d2":"getGameLength()","43fce818":"createAngelCardSeries(uint8,uint256,uint64,uint8,uint16,uint64)","43fd377a":"ChannelNew(address,address,address,address,uint256,uint256,uint256)","43fd6b21":"revokeStackholderConfirmation(uint256)","43fe32fc":"activateProvider(address)","43fedd01":"setDisputeData(uint256[3])","44004cc1":"withdrawERC20(address,address,uint256)","44013585":"setPaymentTime(address,uint256)","44017cd6":"test_BondPostedButNoMajority()","44019db3":"testCreateWithParents()","4401a6e4":"safeSend(address)","4401c905":"INTREPID_PRICE_THRESHOLD()","4401ff5c":"sellShares(bytes,uint8,uint256,uint256)","440208c3":"right12(uint256)","440235c0":"changeTrade(address,address)","44030e71":"getIsBlockRevenueCalculated(uint256)","44036b6f":"setFeePercentTenths(uint256)","44036c41":"getTrustedTransferDestinationValue()","4403e2ab":"nextLotteryTTWTokenId3()","4403ee2b":"setIFS(address,uint256)","44048aa5":"getContributorUSD(address)","440574eb":"adminUpdatePayout(uint256,uint256,uint256,bool)","4406face":"lock(string,string)","4406fbab":"NectarCrowdsale(uint256,uint256,uint256,address,address)","44074cc7":"MaxCoin()","4407a75d":"BasicCrowdsale(address,address,address,string,string,address,uint256,uint256)","440878c4":"store(bytes,address,uint256,uint8)","4408c38a":"HIKEN(uint256,string,uint8,string)","4408f3f9":"place_bet(uint8)","44090448":"to(bytes32,uint256)","440961c3":"adjustPointsDecayFactor(uint256)","44097d70":"costWei()","440991bd":"freezeDuration()","440a16c4":"SEC(uint256,string,string)","440a7a0c":"unblockFirstStake()","440a926a":"home(uint256)","440adb38":"BullsFundToken()","440d2437":"designatedReport()","440d2ad0":"PRICELESS()","440f19ba":"draw(bytes32,uint256)","440f807e":"loadMesa(bytes32,bytes32[],uint8[])","4410121f":"test_voteSpammingFor()","441156cf":"Plutaneum()","4411b8f8":"disputeFavor()","4411c36f":"avgTokenlossValue()","441230e4":"registerHandle(bytes32,bytes32,address)","4412e104":"getZombiesByOwner(address)","4413a688":"setPreallocations()","4414356b":"sale3Accepting()","44146c26":"setExpectedTimes(uint256,uint256)","441478c3":"prepareToRewardProcess()","4414a5c8":"totalLose()","4414d940":"napkinPrice()","4415516b":"getType(uint16)","4415a0bf":"preSaleDiscountPrice()","441628f1":"sendTokensToBountyWallet(address)","441666c5":"SimpleContract()","441691f2":"LexitToken()","44169752":"WALLET_ADDR()","4417bc66":"VESTED_TEAM_ADVISORS_SHARE()","4417f4db":"burnOWL(address,uint256)","44187d45":"HerdiusToken()","44188b72":"openPreICOPublic()","44191d9d":"TokensCreated(address,address,uint256)","44195fd2":"ApolloSeptemFinalized()","4419cd81":"isContractNodeOwner()","4419da33":"changeInvestorAddress(address,address)","4419f969":"QuaLed()","441a174c":"multiCallTightlyPacked(bytes32[],address)","441a2ee3":"Mangocoin()","441a3e70":"withdraw(uint256,uint256)","441b09d9":"allShares()","441b1b44":"getPartialValue(uint256,uint256,uint256)","441b4f01":"investContractDeposited()","441c3499":"getRefers()","441c77c0":"revealPeriodActive(uint256)","441d6a61":"timeWait()","441deede":"getSafeContract(address)","441e354c":"_checkoutCost()","441ea478":"GetLandId(uint256)","442085b2":"contributorCap(address)","4420e486":"register(address)","44210bbd":"claimPlotWithData(uint256,uint256,string,string,string,string)","44219b05":"getGamePlayingStatus()","442484ff":"ExtTokenPurchase(address,address,uint256)","44249f04":"tokensForCharity()","4425c0eb":"claimWhitelistPack(bool)","4425d66d":"backup_exchangeEthStb(uint256,uint256)","44261964":"claimFullPrize(address)","44268655":"addCroupier(address)","4426cdc9":"changeEtherContract(address)","44276733":"getRole(address)","442890d5":"getContractOwner()","4428b072":"getReply(bytes32,uint256,uint256)","44292e88":"setZRXToken(address)","442a494f":"NewRegistrar(address)","442b7ffb":"pow2(uint256)","442b8c79":"addYears(uint256,uint256)","442bc74f":"placeQuestion(uint256,uint8,uint256,string)","442cbcb3":"addParticipant(address,uint8)","442cf0ee":"sellTokensForLtc(string,address,uint256,uint256)","442d0927":"isSellPossible()","442d1759":"GIRLToken()","442d27dc":"getLoanTuple(uint256)","442d31ca":"ChefToken()","442dfae2":"mktSupply()","442e1079":"MIN_ICO_GOAL()","442e501d":"createDeposit(address,uint256)","442eb683":"YouthToken()","442edd03":"listItem(uint256,uint256,address)","442efdc1":"MigrateController(address)","442f52ab":"bilateralCancel(address,address,address,address,bytes32)","44304edf":"TGCTokenBase(uint256,string,string,uint8)","44314116":"totalRollsByUser()","44326354":"pauseITO()","4432ce5f":"setTradersProxyContract(address)","44337ea1":"addToBlacklist(address)","4433a440":"ADXSold()","44346e3b":"cancelOngoingTxByAdmin(bytes32)","44348a78":"referralIndex(uint256)","44350d5f":"neo()","4435947c":"CoinyMcCoinface(uint256,string,uint8,string)","4435f1c3":"SlashToken()","4437152a":"setPool(address)","44377ebb":"getTokenAmount(uint256,uint8)","4437e7a0":"FlogmallAirdropper(address,uint256)","4438744b":"unlockGrant()","44389678":"isAcceptedExportingAuthority(address)","4438c8ab":"ExchangeRate()","4438cf6f":"burnRestTokens()","4438d222":"userHasKYC(address)","4439ab32":"addRecordEntry(address)","4439defa":"getNonce(bytes32[])","443ace5b":"InitiateWhaleCard()","443af072":"percentToPresalersFromICO()","443afe2b":"bssTotalSuply()","443b22e6":"ActiveSalesPhase()","443bd56f":"getHandleOwner(bytes32)","443bdc43":"setStepOneRate(uint256)","443d4c9c":"sendPayout()","443d8967":"batchWithdraw(uint128[],address[],uint256[],uint128[])","443de10c":"getCurrentStaked(address)","443e1cf7":"isFightClockAuction()","443f19f4":"numberOfTokens(uint256,uint256)","443f41d5":"tokenDeposit(address,uint256)","443f45a4":"awardprize(uint256)","443f577e":"getTotalBalance(bytes4)","443f95dc":"allStart()","444115f6":"acceptOffer(uint256,string)","444195a3":"partnersFundAddress()","4441bbd9":"schemaRegistry()","444257a3":"_includes(string[3],string)","4442bf02":"closeArea(uint256)","444316e8":"MiniMeToken(address,uint256,string,uint8,string)","44431e52":"minOVC()","44440a59":"isDistributionReady()","44447f47":"lockTokenSupply()","4444c51f":"_recalculateTopQuestionsOnVote(uint256,uint256,uint256)","4444e3cd":"totalSupply(address,bytes32)","444581da":"createCloneToken(string,uint8,string,uint256,bool,address)","4445b569":"voteWeightOf(uint256,uint256)","4446bb11":"verify_signature(bytes32,uint8,bytes32,bytes32,address)","4446c98c":"foundersFundTimelock1Address()","4447e48c":"configureKeys(uint32,bytes32,bytes32,uint32,bool)","44482ab8":"w0keAFPresaleAddress()","4448604b":"testFailPreDistribute()","4448f5fb":"getEscapeRequestsCount(uint32)","4449307b":"addKycAddress(address,bool)","44495d7e":"migrateGold(string)","444b0c90":"bonusThirdWeekPeriod()","444b6048":"setMerchantDealsHistory(address)","444bb28d":"TownCrier()","444c3d9a":"isCompetitionActive()","444c8daf":"tipoCongelamento()","444cef88":"sentToken()","444d95b0":"proofs(bytes32)","444da733":"isRoundEnd()","444da951":"extractWei(uint256)","444dd6f3":"Elcoin()","444e8b43":"pubkeys1(uint256)","444e984b":"triggerAttack(uint32)","444fda82":"subYears(uint256,uint256)","44501404":"goldPrice()","445045cc":"_bid(uint256,uint256,address)","4451967c":"FOUNDATION_POOL_ADDR()","4451cfd9":"DeductFees(address,uint256)","4451d89f":"claimToken()","44525ace":"roundLatLng(uint8,int256)","445264db":"adventurePresale()","44536d27":"Create_AutoGame(uint256)","44539c72":"setManyWhitelist(address[],bool)","44540e57":"ownerBurnOccurred()","44554cef":"getRedbulls()","44558192":"FMT_Crowdsale()","44559f80":"start_token_time()","44566fe0":"HumanStandardToken()","4456eda2":"isOperator()","44578558":"addPlayerMapping(string,string,uint256,uint256,uint256)","4457ce5b":"CCH_LLV_303()","4457d5f0":"createProject(string,string,uint256,address)","44587e3e":"_setNumber(uint256)","4458ddca":"ChristCoin()","44598c11":"hasOfferingStarted()","445a7a23":"isOracleProxy()","445b8477":"transferAuditor(address)","445cb2df":"getVoting(bytes32)","445d1397":"maxTransfers()","445d1eff":"_getMyDividents(bool)","445d60d3":"placeBuyRequest(uint256,uint256,uint256)","445d688b":"COTTToken()","445d9936":"setTempHeroPower()","445df0ac":"last_completed_migration()","445df9d6":"getAllPrices()","445e4979":"_rejectCertificate(uint256,bool)","445f153a":"showBlockmaticsCertificate()","44602a7d":"testFallbackReturn()","44605ea0":"phase_1_remaining_tokens()","4460fb6d":"burn(address,bytes32,uint256)","4461550b":"devETHDestination()","44621145":"goodsOK(uint256)","446294ad":"multiAccessGetOwners()","446298e2":"Rubid()","446303f3":"preSaleCap()","4464aec7":"testTryGet()","4464c35e":"GNTAllocation(address)","4465e38c":"EligmaTokenContract()","4466862a":"randomtest()","44669e40":"purgeVoter(address,uint256)","44673b2d":"NextOwner()","44691f2b":"Dispute()","44691f7e":"hasStarted()","4469981f":"arrayInfoForDeposit(uint256)","446a7974":"Fokitol()","446b512e":"orderedTokens(address)","446bffba":"add(bytes32)","446c0955":"addWifi(string,string)","446d5aa4":"getAttributes(address)","446da9c2":"xper()","446dba8f":"getBonus(uint256,address)","446dde9b":"MilestoneCashBackTime()","446e0b40":"onSubExecuted(uint256)","446e5079":"SendDividend(address,uint256,uint256)","446f608c":"EscrowEscalation(uint256,uint256,address)","446f6c1f":"sellStorj(uint256)","446fbcd1":"CredSign()","446fcf22":"refundPlayer(address)","44708f7d":"change_time_stamp_status(uint256,uint256,string)","4470da90":"register(bytes32,bytes32,address,bytes32,bytes32)","44710181":"parseChannelCompatible(bytes)","44720ed5":"TigerCash()","4472287e":"numDistributions()","4472d3bc":"getShopOwnerAllProductList(string)","447400bf":"mutate(uint256,uint256)","4474809f":"tournamentEndBlock()","4474e057":"ICOSwapRate()","44751760":"read(bytes,uint256)","44751e3c":"starCoinAddress()","447615df":"Whitelist(address,uint256)","44767548":"rectangle(uint256,uint256)","4476d66a":"mintedInBlock(uint256)","4476e9a9":"epcwallet(address)","44772899":"round6StartTime()","44773a6c":"sendToMultipleAccount(address[],uint256[])","4477c5da":"stopFunding()","44781a00":"notEqual(bool,bool,string)","447843cf":"approveChild(address,address)","447885f0":"get(bytes32,address,address)","4478fbb2":"chOwner(address,bool)","44795c13":"RecoverySha256(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","447a64c4":"usdContribution(address,uint256)","447cd682":"scheduleTransaction(address,uint256)","447d7a1d":"_toLower(string)","447e2dc6":"c(address,address)","447e52a0":"answerQuestion(uint256,string)","447e6967":"endPublicSaleStage()","447ee48f":"maxUserCreatedPerformance()","447fa561":"CAST()","447fa8b7":"setDex(address)","447fbbe3":"manualSendEther(address,address,uint256)","447ffa91":"MineCooldown(uint256)","44804664":"OriginSportToken(address)","44816e2d":"readhistoricalrounds()","4481a486":"transferECOMTokenToContract(uint256)","448246c3":"updateReferralMasks(uint256)","44830788":"estimateTokensWithActualPayment(uint256)","44831edf":"developmentTeamTokensMinted()","44834aca":"buyerAddress()","44845c28":"MediaCash()","4484780b":"checkRecentInvestment(address)","4484a2a6":"forceBuyback(address,uint256)","4484d92b":"getTotalCommission(uint32)","4485cece":"EndTimeChanged(uint256)","4485d32c":"storePortfolio(uint256,uint256[],uint256[],uint256[])","4486598e":"zeeshanabbc()","44866955":"champion()","4487b392":"removeVerified(address)","448883d7":"claimTax()","4488ca9b":"hasApproval(address,address)","4488cc43":"_addExcluded(address)","44890014":"setFxBpsRate(string,uint256,string)","4489b2ec":"getABaddressByIndex(uint256)","448a064f":"YunMint(address)","448a0ceb":"setRoughSupply(uint256)","448a5e11":"mintForDisputeCrowdsourcer(int256,uint256)","448a5f0b":"getTestimonialCount()","448a627c":"SetConfirmRound(bytes32,uint8,bool)","448a9915":"oneBillion()","448b1f29":"tokensForTrivial()","448c0341":"FXRATE()","448c6656":"nodePhases()","448d76a3":"grantReserveSupply()","448d8910":"solve(int8)","448f1ec1":"tranferPresaleTokens(address,uint256)","448f30a3":"nothing()","448f8c86":"Acentiex()","44909c99":"Doftcoin()","4490efe3":"EthernetCashWebsite()","449106ac":"stageCap()","4491fe8f":"onlyPay()","44938e94":"checkPartner(address,address)","4493b8a4":"addrDevTeam()","4493ff1c":"vestedBalanceOf(address,address)","44947b9d":"getOutcomeOfSecondPeriodByEntity(uint256)","4494fd9f":"getGame()","4495147b":"RtcCoin(uint256)","4495bbf7":"DOXYCOIN()","44964dcb":"theList()","4496a7ea":"_getCurrentRoundInfo()","4497ce22":"getLicenseReimbursement(address)","4498acba":"provenAddress(address,bool)","44997a58":"MinusToken()","4499af81":"setChainLedger(address)","4499e043":"UNSOLD_ALLOCATION_EXPONENT()","449a058d":"getParentsLength()","449a09a4":"interfaceAddr(address,string)","449a52f8":"mintTo(address,uint256)","449c198d":"setSealed()","449c7ad3":"withdrawHouseCutFromGame(uint256)","449d0eb1":"checkAccountSchedule(address)","449d0f29":"disavowCrowdsourcers()","449d1ba4":"fundBountyAndTeam()","449d2712":"LEF()","449daa9a":"setCostPerEnergy(uint256)","449de356":"isIncluded(uint256)","449e815d":"getPrice(address,uint256)","449ed7e0":"callback(bytes32,string)","44a08b36":"checkAccess(string,address)","44a0d68a":"setCost(uint256)","44a17516":"Configurable()","44a2542a":"initiateRefund(bytes32)","44a2d0d2":"contributorsKeys(uint256)","44a3982d":"getTokenPriceForPeriod(uint256)","44a3bb82":"getGameIndex()","44a5450f":"PRESALE_WALLET()","44a5b69c":"Reederem(uint256)","44a60878":"DCXToken(string,string,uint256,string)","44a6a8f0":"getDonationLength()","44a71bc6":"fundingMaxCapInWei()","44a7a992":"ParametersChanged(uint256,uint256,uint256)","44a926f9":"assigned_shares()","44a9ff76":"getLastHatchPrice(address)","44aa470a":"addressVerified(address,string)","44aa5782":"LagToken()","44aa768f":"getLLV_edit_26()","44aa8b0e":"createAgreement(string,string,uint8,uint256,uint256,uint256,address,address,uint256)","44ab1c2f":"calcHouseEdge(uint256)","44ab6970":"redeemBool()","44ab6efa":"comB_()","44abc212":"adminWithdrawEIP777(address,uint256,address,address,bool,uint256,uint8,bytes32,bytes32,uint256)","44abd790":"makePlant(uint256,uint256)","44ac423a":"Collect(uint256,uint256)","44ac9d81":"resumePreSale()","44acb8da":"crowdsaleTokenSupply()","44ace7c3":"Tribe(address,string,string,address)","44ad5535":"ProofOfContractSnipers()","44ae0567":"advisorsReleased()","44ae2c03":"getAppNickname()","44ae58f6":"Bittrees(uint256,string,string)","44af11a3":"startBuyBackOne()","44af18c2":"goolaTeamAddress()","44af1f4b":"replaceOfficials(address[])","44af24d6":"getCurrentPercentage(address)","44af946f":"calculateEndTime()","44afda9c":"_isValidBaseLayersOnly(uint256[],uint256)","44b0245d":"addPurchased(uint256,uint256,uint256)","44b07838":"setPaidPackage(uint256,uint256,uint256,uint256)","44b07a3e":"newProposal(uint256,string,bytes32)","44b11f26":"Registry(bytes32,uint16)","44b1231f":"vestedAmount()","44b1d6e3":"DEXLITE()","44b1e09d":"checkTargetReached()","44b1e61a":"isFirstInit()","44b20e7a":"drawNum_()","44b28d59":"enableMint()","44b2a172":"cards_metal(uint256)","44b49958":"presaleEtherRaised()","44b4d279":"payoutDividends()","44b55187":"DollarToken()","44b55c3a":"setParking(uint32)","44b70d79":"LiquidityNetwork()","44b76b9e":"ICOTimer()","44b77680":"init(address,address,uint256[])","44b786a1":"setRate_BTCUSD(uint256)","44b7a3b7":"_createScrapPartAuction(uint256)","44b8074c":"changeTotalAmount()","44b81854":"STSTEST1()","44b81a77":"BitcoinToken()","44b88a6d":"scannedBronzeCaps()","44b8ccda":"EthLongExercised(address[2],uint256[8],uint256)","44b9cab5":"roundBlockCount_()","44b9efb2":"setInputData(uint256,uint256,uint256)","44ba16a2":"COLOR_PINK()","44bb3b2f":"stopBlock()","44bb60cf":"sigDestinationApprove()","44bc3e27":"BetWEA(address,uint256)","44bd7186":"GestiToken()","44bd7b71":"setBountyPercent(uint256)","44bec848":"thirdRoundPercent()","44bee639":"distributeSupply(address,uint256)","44bfa56e":"getBytesValue(bytes32)","44c010c6":"_getReferralBonus(uint256)","44c040a6":"MyAdvancedToken(uint256,string,string,address)","44c11fe4":"currentTransferableTokens(address)","44c18aa7":"setPayout(uint256)","44c20957":"setPhase(uint8,uint256,uint256,uint256)","44c20e6f":"retrieveExcessEther()","44c2dd71":"HSCToken(uint256,string,string,address)","44c3cb29":"validPlayer(uint256,address)","44c3cc68":"BasePoll(address,address,uint256,uint256,bool)","44c47561":"whiteListed()","44c4bf10":"setBlacklist(bool)","44c4dc31":"totalContributedAmount()","44c4dcc1":"purchasedAmount(address)","44c526c1":"devRewardClaimed()","44c55801":"setVaribles(string,string,uint256)","44c5bbf8":"updateStatus(address,uint8)","44c5e758":"getCustomerPolicyCount(address)","44c63eec":"vesting()","44c71ef2":"changeSaleSettings(address,address,uint256,uint256,uint256)","44c73459":"weiPerBlock()","44c7d6ef":"claimStake(uint256)","44c9716a":"BVA()","44c9af28":"getState(uint256)","44c9e83d":"purchaseAuthorizer()","44ca361f":"Log1(string,uint256)","44caa8d6":"isArrAccountIsFrozen(address)","44cb1c33":"lastTokens(address)","44cc129e":"count_bytes(uint256)","44cc5f7e":"m_externalMintingEnabled()","44cc7f5e":"validWithdrawToken(address,address,uint256)","44ccbed0":"getAssetCollectedOreBallances(uint256)","44cef69b":"CreateTokenToOperation(address,uint256)","44cf262a":"addressChangeBlock(address)","44cff104":"setMarketManagerAddress(address,address)","44d02c2a":"infoICO()","44d03ac6":"BlockhashFetch(address)","44d0afbc":"signingLogic()","44d15446":"setDevelopmentAuditPromotionTokensPercent(uint256)","44d19d2b":"reservedSupply()","44d1a074":"marketsubscribers()","44d1a9ae":"setCardDrawPrice(uint256)","44d345f9":"UnclaimedRewardTransfer(uint256,uint256)","44d4fd19":"Now()","44d60e67":"TransferAssets(address,uint256,address)","44d6d259":"AdminAdded(address)","44d75fa9":"updateMinorTree(bytes32)","44d7e4ed":"stopIssuing()","44d9bc5f":"gameEndTime()","44daf94a":"showEthBalance()","44dbb571":"SALE_START_TIME()","44dbc282":"processCallback(bool,address,address,uint256)","44dc028d":"lockedtokensOf(address)","44dc4dec":"registerForRace(uint256)","44dd4b3b":"lookupGeneration(uint256)","44dd4b5e":"scheduleTransaction(address,uint256,bytes)","44dedf4d":"returnFundsForUsers(address[])","44defdfd":"paidInstallments()","44df8e70":"burn()","44dfdce0":"getNameOwner(bytes)","44e02dbc":"returnCollateral(uint256)","44e14e59":"lockReferralTokens(uint256,address,uint256)","44e191fa":"increaseApproveAndCall(address,uint256,bytes)","44e2024f":"createNewFreelanceContract(string)","44e20fd2":"EasyPocketCoin(uint256,string,uint8,string)","44e2651c":"whiteListOf(address)","44e2adeb":"claimedFlag()","44e2cc24":"JackpotTimer()","44e2f9ad":"buyerInfoOf(address)","44e43cb8":"depositRevenue()","44e44e0d":"Profeee()","44e4c366":"rmTrusted(address)","44e4d226":"alreadyVoted(string)","44e52420":"TRADERSCOIN()","44e5d154":"GenesisGlobalTestToken()","44e63717":"LaboToken()","44e66ee2":"updateMeterValue(uint256,uint8,uint256)","44e780b7":"PrepareRollEvent(address,uint256,uint256,uint256)","44e78d93":"wipeDAI(uint256,uint256)","44e796de":"doubleBonusArray(address[])","44e7faa4":"limitedWalletsManager()","44e86b2f":"left71(uint256)","44e880c1":"gasAfter_()","44ea4a7c":"TokenCreated(uint8,uint8)","44ea54fe":"changeSoundcoinsContract(address)","44ec1a0d":"getContestStatusForDateAdmin(uint32)","44ec2c03":"addTransaction(uint256,uint256,uint256,uint16,bytes32,uint256)","44eccf16":"PSTBCoin()","44ed9039":"FLTTToken()","44edf6b2":"preIcoEndDate()","44ee398b":"secondThawDate()","44ee3a1c":"extendLock(uint256)","44eef96c":"sellShip(uint32,uint256,uint256,uint256)","44ef231b":"argumentCount()","44f04404":"forging(uint256,uint256)","44f06bc7":"getChampStats(uint256)","44f09d2a":"createDungeon(uint256,uint256,address)","44f0a4a8":"tdeStartTime()","44f0c3ce":"totalLost(address)","44f11e7e":"tokenBoughtPerTime(uint256)","44f1bbad":"giftRatioOf(address)","44f1beed":"Marble()","44f1ee5b":"Proof(address)","44f2428a":"adjustL(uint256)","44f252a0":"confiscate(address)","44f26d89":"forceUnstake(address)","44f27e30":"getAuctionData(uint256)","44f34576":"setTokensBought(uint256)","44f38756":"icoState()","44f396fa":"startStage2()","44f39803":"setBubbled(address)","44f5e447":"operatorFeeAcct()","44f6d70c":"giftOwnerByIndex(address,uint256)","44f7335b":"_verifyAvailability(uint256)","44f75cbd":"isAffiliate()","44f7636c":"publicOfferingWallet()","44f7787f":"ln(uint256,uint256)","44f7d03d":"valueOf(uint8,bool)","44f84579":"JP_winner()","44f96b36":"getRemainingPartnerTokensAllocation()","44f96bc6":"matured_timestamp()","44f977de":"setStore(string,address,uint256)","44f9ac5c":"getPendingWithdrawals(uint256)","44f9d060":"_getMinimum(bytes32)","44fa961d":"deleteLawyer(address)","44fa9ca6":"oracleIsUpdating()","44faa139":"Withdraw(uint32)","44fb5a1a":"Category(string)","44fbaf08":"bountyAmountLeft()","44fbc1ef":"Dollar()","44fbe5f5":"NewBiggestDick(string,string,uint256)","44fc2a9b":"NOLLYCOINCrowdFund()","44fc364c":"setMarket3(address)","44fc709e":"set_property_facility(uint256,bool,bool,string)","44fc83dd":"LogTokenReward(address,uint256)","44fc9361":"maximumInvestmentInWei()","44fcbd79":"getLocksForAddress(address,uint256)","44fd1557":"ERC20Token(string)","44fd584d":"cancelLeaseOffer(uint8)","44fdbf5b":"releaseAllTokens()","44fddeb7":"BLOCKAPPS()","44fe2eb0":"totalPaidDividends()","44fe7cd5":"Eliminated(address)","44ff5a3e":"CWC_Address()","44fff35c":"openCrowdfund()","4500054f":"isCancellable()","45004310":"signUpUser(string)","4500e64f":"showLockValues(address,address)","4504169a":"_createFlower(uint256,uint256,uint256,uint256,address)","45044611":"TimeCapsule()","45048ced":"Presale(uint256,uint256,uint256,uint256,address)","450531e7":"aidPoolTokens()","4505d53f":"unclaimedPoolsPresent()","45061bf8":"tsc()","4506e64d":"putOn(uint256,uint256)","45078531":"PRESALE_LEVEL_5()","4507a545":"shouldBeTrusted(address,address)","4507fccf":"addDeal(uint256,bytes32,bytes32,uint256,bytes32,bytes32)","45083f73":"appendTranch(uint256,uint256)","4509052f":"scannedCaps()","4509fd81":"partnersPercent()","450a03dd":"getKunsNum()","450a9105":"setYctContractAddress(address)","450b6079":"RetRisk(uint128)","450c4b7b":"LogTokensBought(address,uint256,uint256,uint256,uint256)","450c99d3":"etherRealID(address,address,string,string,bool)","450cabcb":"publicGetExchangeRate()","450d94ef":"TransactionConfirmedAfterEscalation(uint256)","450db8da":"ContractUpgrade(address)","450dccf6":"cancelOrderWithMerchantByAdmin(string,address)","450e2ed3":"startNextCycle()","450eefae":"execute(address,uint256,string)","450efe21":"getTokens(address)","45102ca7":"generateCarId(uint256)","451048e2":"isALCDistributed()","45104b16":"EXECUTION_GAS_OVERHEAD()","45115a17":"PUBG()","4511cc7d":"Transfer_nodata_enabled()","45126711":"createRandomNumber(string)","4512b39b":"sendAndFreeze(address,uint256,uint64)","4513a44e":"Saturn()","4513a7f4":"IsTransferTempFromOldContractDone()","451450ec":"upgrade(uint256,uint256)","45145281":"CurrencyFactory(address,address)","451512ed":"forceDispute(uint256)","451515db":"addProduct(uint256,uint256,bytes32,address)","45152b14":"makeUnicTaskHashId(address)","45164b3e":"TRANSFER_PROXY_VEFX()","451659d9":"exchange(uint256,bytes8,bytes8)","45166351":"FRB()","4516b707":"DCOIN()","45176f8d":"CloutToken(uint256,address)","4517a273":"releasePremine()","4517bd42":"RetractRoutingDR(bytes32,bytes32,uint256,bytes)","4518982c":"firstBonusTokensLimit()","45190584":"remainPantry()","45199e0a":"getPendingList()","4519a069":"toUint32(bytes,bytes,uint256)","4519c454":"tokenFallbackExpanded(address,uint256,bytes,address)","4519ef8e":"getMinutes(address,address)","451b5f47":"preMaxContribution()","451bd752":"currentUniqueSpinnerPrice()","451bedb3":"getSettingsChangeConfirmationCount(uint256)","451beefc":"addressToSplittersCreated(address,uint256)","451c3d80":"acceptedToken()","451cd22d":"clnAddress()","451d65d3":"Debug(uint256,address,string)","451df00f":"SongTokenRemoved(address,bool)","451e3ec5":"_createName(bytes32,address)","451e422e":"windowPeriod()","451f0601":"advisersPartners()","451f7763":"admin_set_payable(bool)","451febcc":"equal(bytes32[],bytes32[],string)","452030c4":"end_PRIVATESALE()","4520d416":"getReserveminted()","45232370":"fechVoteMainInfo()","45239b90":"setBeneficiary()","4523be0d":"Daily()","4524c70b":"addEmployee(address,bytes32,bytes32,uint256,uint256)","4525f804":"constructor(address,address)","45261106":"maxBetsPerBlock()","4526196e":"addressB()","45262b05":"setDefaultExecuteTime(uint256)","45266d7e":"BrandAdded(address,address,string,bool)","452757f6":"changeContainer(address)","452766a5":"EGGS_TO_HATCH_1Cat()","45278394":"updateDemurrageReporter()","45279c81":"effectiveMaxBet()","4527b4b6":"HGUATToken()","4528f3ec":"lastPurchase()","45293f0e":"Luckybuy()","4529cae7":"getTotalPlayers()","4529cd71":"SOFT_CAP_IN_ETHER()","4529cd8a":"AdvertisementStorage()","452a33f0":"grantTrophy(address,bytes32)","452a344f":"MintStarted()","452ae331":"attack(address,uint256,uint256)","452af6c6":"ForegroundPaymentResult(bool,uint256,address,uint256)","452b7757":"AirDropPayBitsR3(address[])","452ccadb":"changeBountyFulfillmentAmount(uint256,uint256)","452d44dc":"checkBothNotNull()","452ddecc":"startBallot()","452e0d25":"sURL()","452e880b":"readArticle(string)","452e9acb":"setMsgHash(bytes32)","452fa483":"TOXToken()","452fbc41":"USN(address,address,bytes,uint256,uint256,uint128)","45301024":"ownerDispute(uint256,uint256,uint256)","4530a6c6":"getWishTribute(uint256)","4531aaa3":"EverydayTokenStandardToken(uint256,string,uint8,string)","45327fef":"calcSharePriceAndAllocateFees()","45334894":"setTeleportPrice(uint256)","4533f779":"determineWinnerOdd(string)","45350759":"addTier(uint256,uint256)","45350b6b":"readFromStorageView()","45362978":"query1(string,string)","4536be70":"periodITO_hardCapInWei()","4537544c":"makeAccountIterable(address)","4537b7de":"developingFund()","45385448":"BEERS()","45387d2c":"_getTournamentSupportAmount(uint256)","4538b7ec":"CallExecuted(address,uint256,uint256,uint256,bool)","453920cb":"changeTokenName(string,string)","45395b03":"tokensIssuedOwner()","4539bf18":"date01Feb2019()","453a6e0d":"getAmountConverted()","453aa450":"vote_proposed_address(string,string)","453b7eab":"totalControlledBalance()","453c2310":"maxPerWallet()","453ca7ee":"RewAddr()","453cbb11":"canConvertTokens()","453cddaf":"performPhase()","453dc243":"setWoodAddress(address)","453dd97f":"getDevWallet()","453dfcae":"payExtraTokens(uint256)","453e5a2c":"registerMarket(bytes32,address,address)","453e6fa0":"schedulableAmount()","453eca78":"getRealmNum()","453fe8cb":"calcUnMaskedEarnings(address)","453fef69":"setPrepaid(address,uint256,uint256,string,uint256)","454052ea":"relent()","45406101":"TTCToken(address)","45408a8a":"minCashout()","4540a396":"importBalancesOf(address[])","45411c8d":"checkAllowedTier(address,address,uint8)","45414df1":"b2s(bytes)","4541c39c":"to_end_ico()","4541e154":"sumICOStage4()","45426082":"countdownDecrement()","4543754f":"totalUserStakes(address)","4543f79e":"withdrawERC20ToOwner(address)","454431c1":"RangeGameWithITG(address,uint256)","454481dd":"nextLotteryTTMTokenId4()","45448a28":"approveAddOwnerRequest()","4544ad22":"allByAuthor(address,uint256)","4544c48c":"distributeWinnings(uint256)","454584e6":"_setProviderInvitedUser(uint256,address,bool)","45458643":"setPI_edit_16(string)","45461e78":"MToken()","4546ad06":"sendProposal(string)","4548821c":"ExBatallionCoin()","45488ac1":"buyStake()","45493057":"validateClaimTokens(address)","454a2266":"dhopakexchange(address,address,address,uint256,uint256,uint256)","454a2958":"foundersTokenTimelock()","454a2ab3":"bid(uint256)","454aa6cf":"getPhoenix(uint256)","454b0172":"Created(address,address,address)","454b0608":"migrate(uint256)","454bccd0":"mininumContributeWei()","454bf426":"sysFeePermillage()","454c57ee":"getStockBuyOrderPrices(uint256)","454c5d34":"allocateBalance(uint256,address)","454c87b3":"matured()","454ca9fd":"get_my_tokens()","454ccc2f":"totalAngels()","454d3e24":"investorsBalance()","454d9bb4":"MerkleMine(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256)","454dd6d2":"GetMinimumBet_Ether()","454dfaaf":"claimSale()","454f7b8f":"totalPayout()","455052b9":"getInstanceMetadata(uint256)","4550fa72":"isConsensusObtained(uint256)","4551b1d7":"ProxyPayment(address,address)","4551dd59":"isCrowdsale()","455259cb":"getGasPrice()","45528aa8":"addItemToInternal(address,uint256,uint256,uint256,uint256,uint256,uint256)","4553c343":"getEarningMetrics(address,bytes32)","4553fd4d":"token_ratio2()","455501d3":"Submission(address,uint8[])","45550a51":"recoverAddressFromSignature(bytes32,bytes)","455530a6":"TestRandomNumber()","45556969":"DealerSocketCoin()","4555d5c9":"proxyType()","4555db10":"tokenRecovery(address,address,uint256)","4556611e":"weiToShare(uint256)","45576f94":"createToken(string)","455770a4":"setIcoPhase1(uint256,uint256)","455778ed":"advisorsTokensSecondReleaseTime()","45579b1f":"transferShares(uint256,address)","4557a579":"addWeapon(uint256,string,string,string,address)","4557b4bb":"init(uint256,address,address)","4557c70d":"CrowdWallet(address,address,uint256)","45585afe":"manageInvitations(uint256,address[],address[])","4558850c":"apps(bytes32,bytes32)","4558d717":"changePaymentToken(address)","45590ec8":"addTag(uint256,string)","45596e2e":"setFeeRate(uint256)","45598b4a":"cancelCampaign(uint256)","45599136":"tokenFee()","4559b2e8":"holderAdvisorsTokens()","455a2a37":"MyAdvancedToken(uint256,string,uint8,string)","455a380d":"getTotalAmoutStageAddress(address)","455b33ab":"gambler2()","455bf142":"refundeesListLength()","455c06e4":"mintTokens(address,int256,uint256)","455c7050":"EscrowManager()","455ca9bd":"refundTokens(address)","455d4077":"_startLockup()","455d86b8":"revenueShareOwnerAddress()","455dc46d":"nextMinimumEpochInterval()","455df579":"left84(uint256)","455ea98c":"getInUse(bytes32)","455eb777":"canStake(address,uint256,uint256,bytes8,uint256,string,string,string,string,uint256,uint256)","455ef8f9":"coinsCount()","455f1725":"getTotalAmountOfBlocks()","455f6f31":"totalTokensBurnt()","455fd623":"totalWithdraw()","455fea46":"getTankDetails(uint32)","455ff9a4":"lastBlock_v16Hash_uint256()","456176eb":"PCDStartTime()","45622c31":"setContractAllowance(address,uint256)","45624260":"getNumPositionOperation(string,address,string)","45626ecb":"removeStages()","45629402":"changeDefaultWithdraw(address,address)","4563b743":"getPAAttributes(uint32)","4563f30a":"transfersPaused()","45644fd6":"removeOracles(address[])","45645572":"presale(address,uint256,uint256)","4564ea36":"forceVoidExternal()","45653a6d":"creater()","45656757":"p1_start()","45668923":"Aikcoin()","45668f2b":"ORACLIZE_GAS()","45669c8d":"protectedTransferToMint(uint256,bytes32)","4567a6a7":"getXCPlugin()","4567c5f7":"buySharePriv(uint256)","45680e09":"createPixels(uint256)","4568fb50":"finishRoundAndStartNew()","4569db8a":"getCustomerTxAmountKWh(address,bytes32)","456a09c8":"withdraw(uint256[],uint256[],address)","456c2892":"finalizeLottery()","456c64e0":"getGamesOdds(uint256[])","456c8cac":"saleStopped()","456cb7c6":"authorized()","456cbafc":"AddressWarsBeta()","456cee82":"setAmountPerEther(uint256)","456f3c3b":"internalIcoFinished(uint256)","456fe579":"notate(address,uint256,uint256,uint256[])","4570160e":"MotionToken()","45705906":"isLeading4FF(address)","45705d93":"BwinToken()","457094cc":"fire()","45710074":"sell()","45714c7b":"TOKEN_CLAIM_WAITING_PERIOD()","4571a7f1":"maxStage()","4571d4c4":"FutureCall(address,uint256,uint16,address,bytes,bytes,uint256,uint256,uint256)","45734d2b":"sizeOfInt(uint16)","45737b1e":"changeEndDate(uint256)","457391e5":"createGame(bytes32)","4573a421":"ico4Sold()","4574dea5":"setBreedingFee(uint256)","45751137":"newDeposit(address,uint256,uint256)","457556c2":"getUBetChecks()","45755dd6":"returnFunds(uint256)","457610e5":"cancelTransaction(bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256)","4576a635":"setCategoryCap(uint256,uint256)","457750a4":"marketIncentivesAllocation()","457770d8":"PreICO(address,address,uint256,uint256)","4577942c":"lastTransactionTime()","45787fed":"WolframExchangeTimes()","45788ce2":"prev(address)","4579268a":"getOffer(uint256)","45798593":"Certification(string,string,string,string,string,string,string)","4579c805":"createDistritoVerify(uint256)","457a21bc":"GullitCoin()","457a893f":"upPlayer(address,bytes32,uint256,uint256,uint256,uint256)","457b4e1b":"_setMoreDetails(uint256,uint256,uint256,uint256,uint256,address)","457bb613":"initializeUsers()","457c600c":"getItemAllowanceAmount(uint256,address,address)","457ce032":"getTokensFromExchange(address,uint256)","457cf77a":"couponToken()","457d13ca":"getPlayerBet(string,address)","457dd8b3":"setMasterKey(address)","457e5521":"getAllPolicies()","457e8fc7":"calculateReward(uint32,address,address)","457eff2f":"GetMySnails()","457f4d41":"hammer()","457f55fb":"updateRightLottery()","4580a950":"setDecreaseRepAvailableForExtraBondPayouts(bool)","4580cc5e":"setFinished(uint256,uint256)","458284fb":"setACLRole7123909213907581092(address)","45837e5f":"updateLandData(uint256,string)","4584117e":"mintParts(uint16,address)","4584afe5":"buyLambo()","45850658":"closeAssignmentsIfOpen()","4585ad02":"delayDefaultAction()","4586a517":"addTotalSponsored(address,address,uint256)","4586e4ab":"balanceInPlay()","45871918":"raceToBaseStats(uint256)","4587327a":"doAirdrop(address[],uint256)","45874c93":"PersonaIdentity()","4587501e":"baseIcoPrice()","4588c1ef":"setPI_edit_2(string)","45895620":"getAvatar(address,uint256)","458a645d":"resolveDeposit()","458b1471":"mintingFinishedTime()","458c9ca4":"year3Unlock()","458d5968":"getMyTokensEmits()","458d96bb":"transferLockedMultiply(address[],uint256[],uint256[],uint256[])","458da775":"_makePlant(address,uint256,uint256)","458e18d7":"AMLOveCoinVoting(address)","458e78d5":"getSchellingRound(uint256)","458efde3":"vest()","458f837f":"minSumICOStage1USD()","458fa428":"summDividendReserve()","458ff74f":"authorizeBurnFulfiller(address)","45906baf":"Restrictable()","45909a6f":"getBalanceOfUser(address)","4591a980":"verifyStep(uint256,bytes,bytes,bytes)","4591b7c6":"fillBonds(address)","4591c060":"fork()","4592282e":"LBC()","4592cd1d":"claimContractOwnership()","4592fec8":"returnBids(uint256,address)","459348dc":"BISTEXToken()","45934d0b":"getIdentityName()","45941a38":"lastTimeOfNewCredit()","45945a45":"isRoundActive()","459469e0":"FundsRegistry(address[],uint256,address)","4594762a":"getSkill(uint256,uint256,uint256)","459497fc":"ownerAddressInLUT(uint256)","4594d06a":"delMinter(int256,address)","45950cd4":"selfairdrop()","4595343f":"dividendsRightsOf_(address)","459659a4":"Exchange(address)","45967555":"deployedContracts(address,uint256)","45977d03":"upgrade(uint256)","45977ebb":"LINCToken()","4597dc8e":"CooldownThreshold()","45983b24":"isReferralSupported()","4599308f":"buyCow()","459a2192":"cardDetailsList(uint256)","459a585a":"testCreateToken()","459a6589":"transferInGame(address,address,uint256)","459ae9b3":"addMembers(address,bytes32,address[])","459b0d97":"SimpleConstructorBytes(bytes32,bytes32)","459b2cd6":"OwnableWithRecovery(address[],uint8)","459b3926":"Airdrop_Limit()","459c7d0b":"tokenIcoUsdCentPrice()","459cb2be":"agreedTermination(uint256)","459ccde6":"modifyRandomNumber2(uint256)","459ebb8c":"BCMtest()","459ec508":"betOnColumn(uint8)","459f93f7":"getBuyers(uint256,address)","45a132d4":"LemonSelfDrop1()","45a15388":"marketPrice()","45a1b92c":"onBurn(address,uint256)","45a1d72a":"_tobuy(uint256,address,uint256,uint256)","45a1f1b9":"getInitials()","45a2556c":"getBucketOwedAmount(uint256)","45a2a3df":"withdrawTeamPerfit()","45a37bd6":"kycManagerWallet()","45a3816c":"forfietCollat()","45a3b0bf":"resolveFailPledge()","45a3c7c6":"_createReleaseAuction(uint256,uint256,uint256,uint256,uint256)","45a40478":"downs(address)","45a45695":"baseTargetInWei()","45a48de6":"getBigPromoRemainingBlocks()","45a4a39c":"completePost(address,address)","45a727de":"checkForUpdaterUpdate()","45a743d1":"TOTAL_AIRDROPPED_TOKENS()","45a7b991":"getContributionHashes()","45a88ff6":"claimPlotMultiple(uint256[])","45a8d80e":"PiPiCoin()","45aa257a":"VICCoin()","45aa324c":"start_service(address,uint32)","45aa6e98":"tokensCreated(uint256,uint256)","45aa7f69":"OffMenuMorselToken()","45aa83d8":"blockoptions()","45ab17bf":"setRefunding()","45ab63b9":"walletFeesInBps(address)","45ab8e07":"CoinsdomCoin(uint256)","45abc063":"totalLoadedRefund()","45abe20a":"investorsIndex(uint256)","45acc490":"executeAmendmentMandate(uint256)","45ad35bc":"lastCallAddress()","45ad55cc":"PRE_ICO_DURATION()","45ade051":"getUtilizationRate(uint256,uint256)","45ae47fd":"CardFactory()","45aeff61":"getStockKey(bytes6,bytes6)","45af4bc2":"JJToken()","45af7ceb":"invalidateHash(bytes32)","45b0f6d2":"sealBurner(bytes32)","45b17abb":"distribute_private_sale_fund(address,uint256,uint256)","45b1c336":"icoWeek3Bonus()","45b21736":"getCBAStatusMessageLength(address)","45b26383":"contributeFund(string)","45b30e7a":"GTBToken()","45b35f56":"getAllRewards()","45b3fe42":"Y()","45b426f2":"option30symbol()","45b50255":"getBooking(string,uint256,uint256)","45b5143b":"TUMITOKEN(uint256,string,uint8,string)","45b581a2":"getPotentialProfit(address,string)","45b5a47a":"GetEther()","45b64133":"HHRLocker()","45b660bd":"IssueTokensToInvestors(address,uint256)","45b6ccfd":"MAX_MIDGRADE()","45b727f3":"getShop(uint256)","45b748ab":"SSPUnregistered(address)","45b7d5da":"setFrozenAccount(address,bool)","45b7fdd4":"TheGreatWishOfChina()","45b8bafc":"floorLog2(uint256)","45b8c0c2":"parcelGzeWithBonusOffList()","45b8fa03":"TokenLongExercised(address[2],uint256[8],uint256,uint256)","45b9ca21":"getEther(uint128)","45bae1eb":"carAccts(uint256)","45bae539":"getContributeParticipant()","45bbee71":"rmAsset(address)","45bbf9b5":"TotalPayment(uint256)","45bcd68f":"BitVideoCoin()","45bd3752":"intMemoryArray(int256)","45bd7f03":"addBountyAddresses(address[])","45bda564":"SPECIALIST_STAKE_THREE()","45bddbb8":"thanksAllGenesisUsers()","45bdfedb":"getAdrByIndex(uint256)","45be66eb":"SportsBet()","45beb6e0":"matchAgainstBook(uint128,uint256,uint256,uint256)","45bf5cb2":"testInitialBoardUsingDeployedContract()","45bfdca6":"addWalletAddresses(uint256,address)","45c08718":"updateCredit(address)","45c1234c":"Sent(address,uint256,string,string)","45c12560":"LogMoneyToPreICO(address,uint256,string)","45c1523a":"OzsToken()","45c16a22":"getSaleStage()","45c1c9fc":"setBuyEnable(bool)","45c35fd5":"publicOfferingTokens()","45c38053":"tankAllowance()","45c41132":"_emitPaymentReleased(uint256)","45c41478":"getMarkets(bytes,address)","45c46619":"addWhitelistedBurn(address)","45c531f3":"secondDiscountPrice()","45c5904f":"malangtoken()","45c5b8ac":"set_game(address)","45c5de81":"listTeamTokens(uint256)","45c654eb":"TravelToken()","45c6a874":"adminMultiSig()","45c7a092":"isValidSignature(address,uint40,uint40,uint128,uint256,uint8,bytes32,bytes32)","45c8b1a6":"unfreeze(address)","45c8e118":"view44()","45c917ec":"closeDeposit()","45c9a11a":"maxProfitPercentage()","45c9a558":"getPeriods()","45ca25ed":"changeName(address,string)","45cb3dde":"withdrawTime()","45cb3f4d":"highestBidPrice()","45cb4559":"gameGiftUserTotalTimes()","45cb9994":"Lookup()","45cbf879":"getStageByBlockNumber(uint256)","45cc13c3":"tokenize()","45cc50ce":"endTimeIco()","45ccd426":"ObokContract()","45cd4820":"participate(address,uint256,bytes32,address)","45cdb714":"changeColorWhite()","45ce0dc1":"addLambo(string,uint256,bool)","45ce691a":"buy(uint256,uint256,uint256,uint256,uint256,uint256)","45ce86eb":"whitelistApplication(bytes32)","45cf093a":"sumDividend()","45cf8467":"getSqr(uint256)","45cfad3e":"TOKEN_PRICE_N()","45cfcc42":"getKeyVotes(string,string)","45d0695f":"arr(uint256,uint256)","45d1b657":"PRE_SALE_3000_ETH()","45d27edf":"forward_method(bytes,address,uint256,bytes)","45d30a17":"releasedAmount()","45d3292b":"receiveDonation()","45d3b8db":"superAddress()","45d3cc81":"getAnimal(uint256)","45d4cf2b":"createPrivilege(string,address,address)","45d5149f":"minContributionAmount()","45d53788":"numOrders()","45d58a4e":"getWalletOut()","45d607fe":"referralFee_()","45d63b07":"BrokerNekoNetwork()","45d63b66":"recommit(uint256)","45d6c9db":"PVP_BATTLE()","45d78d08":"getTokenAllocations()","45d7fd3e":"setCreationAddress(address)","45d8a232":"targetTime()","45d8a6df":"tablePrices(uint256)","45d9a1ce":"withdrawBalance(address,address,uint256)","45d9bd15":"getBookmarks()","45da75d3":"setPresidenteDeMesaVerify(bytes32,uint256,uint256,uint256)","45dafed2":"Marcellocoin()","45db72ff":"lastLoveLetter()","45dc16ca":"trade(uint256[12],address[4],uint8[2],bytes32[4])","45dc3dd8":"setMin(uint256)","45dcb788":"dataSourceGetRoundOfSixteen(uint256)","45ddc85d":"voteOf(uint256,address)","45ddcf99":"unlockUntradeableCards(address)","45de2567":"transferTokens(uint256,uint256)","45df30d2":"transferPlusFee(uint256)","45df925f":"ratingList()","45dfe7f3":"restrictedWallet()","45e05f43":"affiliate()","45e09e54":"getBoard(uint256)","45e0e324":"FoodStore()","45e0e412":"forwardTokens(address,uint256)","45e231a6":"XCONToken()","45e26105":"updateMaintenanceMode(bool)","45e29057":"_myLuckyNumber()","45e3553e":"setMaxProtoId(uint16)","45e373ed":"getCertificateById(string)","45e381a9":"set_minFinneyPerHedgeTransfer(uint256)","45e39705":"addMember(string,address)","45e3b8c0":"SHOP()","45e41468":"placeSell(address,uint256,uint256)","45e479f6":"GetDiv()","45e4c361":"rteamVaultAddr()","45e4db40":"addTxInBuffer(address,uint256,uint256,uint256,uint256)","45e4fd6e":"listItem(uint256,address,string)","45e5da07":"ETHAssets()","45e5fd8b":"nonActivationShortWithdrawal(address[2],uint256[7],uint8,bytes32[2])","45e7e140":"getReservedPercentageDecimals(address)","45e7e14b":"ReputationUpdated(string,uint256,uint256,string,string,address)","45e82175":"level_5_percent()","45e8baa7":"checkSignatures(bytes,bytes,bytes,address)","45e93903":"SpooksterCoin()","45e965cd":"strConcat(string,string,string,string)","45ea375f":"viewPot()","45eada10":"setProvider2(address)","45eb4b28":"destinationAddress20()","45eb7c8e":"CompleteAddOn(uint256,address)","45ebc145":"publish(uint256,string,string,string,bool)","45ebe153":"moveIcoEndDateByOneMonth(uint256)","45ec26ac":"distributedCount()","45ec7670":"WallStreetCoin()","45ec9e87":"Eurovision()","45ecd02f":"isActiveMember(address)","45ed68e8":"defaultSalePrice()","45ede900":"setPropertyOwnerSalePrice(uint16,address,uint256)","45ee49b9":"getUltimateOutcomes(bytes)","45ee9151":"BountyTransfer(address,address,uint256)","45ef8217":"clear_market()","45f00b06":"setNewTalentsAndPartnerships(address)","45f03f31":"EthereumLottery(address,address,address)","45f09140":"chargebackCoins(uint256,address)","45f0db24":"get_coin(uint256)","45f11fc8":"trancheAmountPct()","45f23f10":"crowdsaleFundsWallet()","45f28e77":"genToStartPrice(uint256)","45f32b02":"currentModifier()","45f32b6d":"totalCirculating()","45f32e77":"currBlock()","45f45449":"EtherCash()","45f472fc":"saltNHash()","45f4c1ba":"pay(uint128,address)","45f536f7":"sendPer2()","45f63927":"increaseGame()","45f67eb4":"setTolerance(bytes32,uint256)","45f6ee41":"setPrice(uint16,uint16,uint8,uint256)","45f7f249":"totalAllocated()","45f826da":"setMinimumInvestment(uint256)","45f8567c":"paySmartContract(bytes32,address[],uint256[])","45f8f1e8":"RajTestICO(address)","45f9072b":"setColorOrange()","45f988a4":"priceT2()","45f99d51":"claimFailed()","45fa4045":"getVestingPeriodNumber()","45fa53e7":"pieAccounts(uint256)","45fb0cd6":"addMultipleAddressesToCappedAddresses(address[])","45fbe9cb":"spawnChild(string)","45fbfbca":"investment()","45fc916c":"setPricingPlan(address)","45fcceb4":"foundersTokensReserve()","45fd2478":"_getShipType(uint256)","45fd3666":"isTurnDataSaved()","45fd4040":"addAllowCnsContract(address,bytes32,address,bytes32)","45fd865a":"HazzaToken()","45fd9e23":"claimOwnership1()","45fdef65":"addCandidate(address,bytes32,bytes32)","45fe5850":"OrganFunction(string,string)","45fe5a83":"deliveryTime()","45fe5aea":"useKey(address,uint256)","45fe6e2a":"Scheduler()","45febc32":"BugisNet()","45ff59b2":"createTokensForCrypton()","45ff8b75":"get_HoldersProfit(uint256,address)","45ff8fde":"request(bytes32,uint256,uint8,uint256)","460123cf":"findAddressByEndpoint(string)","4601cded":"getNumSides()","46021deb":"getLastAuctionedShipId()","4603032a":"withdrawByTeam(address,uint256)","46032178":"MigrateAgentSet(address)","460485e0":"fundsWithdrawnByOwners()","46051eb7":"getProductHistoryUser(bytes32)","46054144":"ASIEX()","46055acd":"Decline(address)","46057b70":"timeOver()","46061579":"check1(uint256)","4606ccd1":"spinAllTokens()","4607c26e":"periodsPassed()","4607ef57":"preICOTokenRewardRemaining()","46080a94":"subResearch(address,uint256)","46082aaf":"approveDeprecation(uint256,address,bool)","460885ab":"_createNewLottery()","46091499":"transferFrom(address,address[],uint256[])","46093b0e":"setOracleAddress(address,address)","460a6507":"giveReward(address,address,uint256)","460ab47b":"proposeChangeOwner(address,address)","460ad570":"newOraclizeResult(bytes32,string)","460b4a45":"getTotalBonusesAmountAvailable(bytes32)","460c1a7a":"cancelOrders()","460c3be5":"owner_LockUpdateTokenAccount(address,bool)","460d674b":"keyFromIndex(uint256)","460e2049":"getPlayers(uint256)","460f740e":"createData(string,string,string)","460fce3b":"milestoneStarted(uint256)","4610a448":"vestingBeneficiaryForIndex(uint256)","461105c7":"withdrawBoth(uint256,uint256)","4611636e":"erc20VGC(uint8)","46116e6f":"sireAllowedToAddress(uint256)","4611a5e3":"calcRefund(address,address)","4611efde":"changeTBrate(uint256)","4611fb0e":"RSC()","4612b88d":"deleteDiniRequest(uint256)","46134e33":"getPrivateSaleEndDate()","46141657":"SetdivForTank(uint256)","4614185a":"IkuraTransfer(address,address,uint256)","46143a39":"setMessageSpan(uint16)","4614689c":"showWinners(uint256)","4614874e":"createEscrow(address,uint256)","46156ea0":"odds(uint256)","461645bf":"window()","4616caa9":"pushCoin(uint256,address,string)","4616fc3f":"setSystemSaleAddress(address)","46172c04":"calculateRewardForAddressAt(address,address,uint256)","461751e6":"resetMistCallLoad()","46183d06":"getTktPrice()","46190e16":"getSpecId(bytes)","46190ec4":"nextId(address)","461998fc":"cancelRecurringPayment(address)","4619aa19":"pvpOwnerCut()","4619c0ca":"insertBeneficiaries(address,address,uint256,uint256,uint256)","461a2df9":"PretherICO()","461a4478":"resolve(string)","461ac019":"deployedTime()","461ad9e9":"saveGenCode(address,uint256,string)","461c89b3":"massMint(uint8[],address[],uint256[])","461db9ad":"GoCryptoCoin()","461df016":"getQuantities(address)","461e0be5":"ElphToken()","461efbf8":"testEtherFundMeCrowdfunding()","461f48cb":"setUsersBounty(address[],uint256[])","461fd83b":"myEtherBros(address)","46203efe":"frozenAccountCoinByHour(address,uint256,uint256)","46205ac3":"hodlFor1y()","4620adbb":"tokenPricePerUSD()","4621a5d9":"activateRevenueShareReference(uint256)","4621e552":"decreaseRemainLockedOf(address,uint256,uint256)","462219f8":"batchTransfer(bytes32,address[],address,uint256[])","46226514":"isPresidenteDeMesa()","46238c69":"nextRedemptionRequest(uint256)","4623beb6":"InterestTest(address,address)","4623c81e":"TIMELOCK_DURATION()","4623c91d":"setValidator(address,bool)","4624321e":"decreaseApprovalWithData(address,uint256,bytes)","46256be7":"getAgentAdressById(uint256)","46272a6d":"mySavings()","4627de42":"getIncrease()","46280a80":"sell(uint8,uint256,uint256)","46285e45":"checkBalanceAt(address,uint256)","46286c18":"_validateUserActive(address)","46287ddb":"rateLastWeekEnd()","4628b375":"TokenLeft()","4628bc22":"teamTokensVesting()","4628e45e":"ABAToken()","4629e619":"raceNum()","4629ffea":"newToken(string,string)","462a8e05":"setRabbitSirePrice(uint32,uint256)","462aa19e":"setToken(address,bytes)","462b2fca":"isRedeemLocked(address)","462c1bff":"H4D()","462c6070":"getLockedAmount_jishis(address)","462c6edb":"highBonusRate()","462dcfa0":"newMaster(address)","462e91ec":"addCandidate(string)","462f9a28":"get(bytes32,bytes32,uint256)","463079b5":"resetFactories()","4630a0ee":"changeTicketPrice(uint256)","4630d82e":"upgradeTokens(uint256)","4630f1d5":"toggleKillSwitch()","463107d4":"buyerfeeDivide()","46315237":"fiveHours()","46317712":"lastDebtLedgerEntry()","463193c7":"startselfdrop()","4631db54":"_burnTokens(uint256)","4631e15b":"assertEq15(bytes15,bytes15)","46325b48":"CTCoin()","46336cd3":"read(uint256,uint64)","4634009a":"getIdx(string,string,uint256)","46340b37":"RakugoPresale(uint256,uint256,uint256,address)","46348e0b":"calculateArea(uint256)","4634d81c":"getDividends(address)","4634ea79":"countCurrentPayment()","46352ad9":"transferToGrowthReserve()","4635b449":"raisedUSD()","4635ecd5":"lastTicketNumber()","4636a159":"newPhoneToAddr(address,uint256)","4636db04":"changeBid(bytes32,uint8,uint8)","4636e095":"acceptBet(uint32)","4637c85d":"wildcardTokenId()","4637d827":"trust(address)","4637de3c":"removeMod(address)","4637fd1a":"_transferEther(address,uint256)","463959fa":"minJackpotBet()","4639888b":"jockeyForSale(uint256,uint256)","463ac31b":"buyStore()","463c3347":"getMyLandMultiplier()","463c75b3":"GreenworldFarmToken()","463cde9e":"PUBGtoken(uint256,string,string)","463cf730":"maxEthCapBuyInFp()","463d3cda":"acceptExternalTransfer(string,uint256,string,uint256)","463d50b8":"transferFromVault(address,address,uint256)","463d5ce1":"isUserWithdrawalTime()","463dcf0a":"merge(address,uint256,uint256)","463dfae6":"setTrg(address)","463ee88a":"createBusiness(uint256,uint256,uint256)","463f2c21":"giveCredits(address,uint256)","463f7a7d":"_updateDependencies()","463f7a89":"getProperty(bytes32)","463fb5f1":"Bogotcoin()","463fbb76":"setTransportationFeeMultiplier(uint256)","46405ffc":"OhNoToken()","464066f5":"vote03NoCount()","4640f28d":"createPlayerToken()","4641257d":"harvest()","464299f9":"getReturnFromMonster(uint64)","46435fa1":"createPiranhaToken(string,address,uint256,uint8,uint8)","4643db5b":"DonationClaimed(address[2],uint256[8],uint256,uint256)","4644d17e":"getAirDropTokens()","4646939e":"updateWhitelistMapping(address[],bool)","464695b3":"tokensSoldTo(address)","4646f62a":"setAvatarFrom(address,string)","46478e91":"increaseGlobalInterestAmount(uint256)","46479541":"setWalletId(address)","4647d0c6":"CUNCoin()","464858c6":"NVT()","46488459":"getTopMigrationDestination()","4649bfee":"setCCH_edit_25(string)","464ae89f":"SponsoredLink()","464bb7a3":"findAccess(address)","464cccc8":"round4Cap()","464cecb8":"getHyper(address)","464d1208":"claimReward(address,address,uint256,address,uint256)","464da87e":"cofoundersSupplyVestingTranchesIssued()","464deba6":"TridentToken(uint256,string,uint8,string)","464e1d46":"setBalanceOfAddr(address,uint256)","464e47b4":"wasSoftCapMet()","464f37c9":"trustedChildRefund()","46503676":"_useCitizenAsLumberjack(address,uint16,uint16,uint8,uint256)","46503c01":"KansasvsClemson()","4650c308":"genericCall(address,bytes)","465105f0":"releaseAllETH()","46517145":"createNewCardType(uint256,uint256,uint256,uint256)","4651f716":"assertEq14(bytes14,bytes14)","4651ff39":"setopen()","4652e9fe":"getStartDateOfPlan()","46530c34":"activityExist(uint256)","46533d60":"setNewReleasePeriod(address,uint256,uint256)","46534649":"referralBalanceOf(address)","46538e07":"checkExistsOwnedMedal(uint64)","4653a1fa":"setAttackBoostCap(uint256)","4654b6e2":"addMonsterObj(uint64,uint256,uint32,address,string,string)","46567a07":"getTotal(address[],uint256[],uint256)","46570653":"_share(uint256)","4657681b":"set_num_of_uses(address,address,uint8)","4657ad8e":"payTxFees(bytes32,uint256)","4657d848":"getVendorIds(uint256,uint256)","46581235":"unlockToken(address,uint16)","465941e5":"ATMHolders(uint256)","4659f42a":"withdrawAfter(address)","465a092d":"PRESALE_ETH_CAP()","465aaeb7":"windowBonusMax()","465af554":"setLockJackpots(address)","465b43d0":"joy()","465c2cec":"SmartBonds()","465c8ce0":"getRobot(uint256,uint256,uint256)","465ce877":"HashnodeTenaraCoin()","465d1cbe":"getDepositsAmountLeft(uint256)","465d5c27":"_tokenIsApproved(address,uint256)","465d6e1a":"CAUSE()","465e759b":"testRestart()","465e920e":"getLineData(uint256)","465f1d07":"CrowdTmoney5()","465f41b1":"multiOwner(address[])","465fa408":"calculatePriceForTokens(uint256)","465fe311":"KEP()","46601278":"TotalTOkenSupply()","46602ce7":"FOUNDERS_POOL_ADDR()","4661bb98":"setClassWhitelist(uint32,bool)","46621234":"tmpAddr2contractAddr(address)","4662299a":"issuanceFinished()","4662fbdf":"promotorSale()","466339fb":"_rewards(uint256,uint256)","46642921":"changeModerator(address)","4664611e":"winningNumber()","4664b235":"bytes32_to_bytes(bytes,bytes,bytes)","4664fe1b":"changeMinFunds(uint256)","4665096d":"expiration()","46653287":"createInitialTokens(address,uint256)","466551f1":"LinqToken()","466559e2":"S26ICO()","46656c46":"OxToken()","4665975d":"registerCustodian(address,address)","46682cab":"canFinishTournament()","46683308":"freezeAccountForLogic(address,bool)","46689c64":"startPlaceOrder(uint256,address)","4668b43b":"updateTelegram(uint256,string)","4668f372":"MaxMiningReward()","466916ca":"pauseStatus()","466985f3":"escape(uint256)","4669e680":"getPreEntranceMemberCount()","466a3443":"getIndividualPercent()","466ae314":"forwardedOutcomeSetTimestamp()","466bb312":"getDeposited(address)","466bc3bd":"GOXX(uint256,string,string)","466bf275":"getFreeToad()","466c35fc":"MINT_ADDRESS()","466c3a2b":"getChecksumAlgorithmCount()","466ccac0":"forSale()","466cf98f":"giftBalance(address)","466df592":"votingPeriodBlockNumber()","466e37e7":"newTapProposalFromTokenHolders(uint256)","466e561f":"updateReserve(address,uint8,bool,uint256)","466ebdf6":"setAddressOut(address)","466f0004":"getData_10()","466f8870":"Solar()","4671e65e":"proposeEmergencyWithdrawal(address)","4672f555":"pow(int128,int128)","46743691":"transferPublisherRecord(address,address)","467523fa":"setBuyerRate(address,uint256)","46755c68":"setEndingBlock(uint256)","46758d0b":"setAgentRate(address,uint256)","4676b897":"balanceOfUnclaimed(address)","467730fb":"toFound()","4677b540":"ATOToken()","4677fe53":"validUnitId(uint256)","467aeec9":"addShareholderAddress(address)","467d7289":"clearRound(uint256,uint256,bytes32,bool,uint256,uint256,uint256,uint256)","467de087":"withdrawAdvisorsTokens(address,uint256)","467eb43f":"verifyIdentity(address,bytes32,uint256)","467ed261":"getDSTNameBytes()","467f0b7b":"del_rank(uint256)","467f85e4":"DividendPayment(uint256,uint256)","468014e1":"startTimeSale1()","46804137":"bonusStep()","46807803":"_payoutMining(uint256,address)","4681067d":"incAdminEpoch()","468129a5":"setUnit(uint256,uint256,uint256)","46817362":"importersBanksDraftMaturityDate()","46822869":"BTFM()","4682ff71":"redeemMarketingToken(string)","4683ef63":"delayedOwner()","46848114":"startOffering(uint256,uint256,uint256,uint256,bool)","4686030f":"promethExecute()","468628e1":"getActivityById(uint256,uint256)","46862c8f":"mintOnce(string,address,uint256)","4686753d":"Crowdfunding()","46875458":"ARM()","4688a372":"withdraw(address,bytes8)","4689ab4d":"right21(uint256)","468a0413":"parseResult(bytes32,string,address)","468ae69d":"multiMint(address[],uint256[],string)","468b0c1d":"AllPay()","468b0fcd":"preSaleGoalReached()","468b0fe2":"setBridgeNode(address,address,bool)","468b3b33":"unlockedBalanceOf(address,uint256)","468c17d7":"_sendMsgSndr(address,address)","468e1b53":"DEC15Contract()","468e4509":"setAutoridadElectoral(bytes32)","468ed002":"INITIAL_VUP_TOKEN_SUPPLY()","468eeece":"revertGame(address)","468f02d2":"getUnderlyingPrice()","468f3dcd":"getTokenHoldersCount()","46904840":"feeRecipient()","46906982":"amountRaisedEth()","46911b64":"testDisputedWriteValid()","46912a4d":"PERC_TOKENS_TO_BIZDEV()","4691a998":"addVesting(address,uint256,uint256)","4692a481":"WilliamCoin()","4692d7e3":"BitQ()","4693667a":"changeMdtFoundationAddress(address)","469450cc":"disableLockDown()","4694fe85":"isUseContractFreeze()","469506bf":"getFinalSeed(uint256,uint256)","469507c6":"transferReward(uint256,address)","4695cf7a":"getSteakPrize()","4696890e":"ethworld()","469737d5":"forceRejectVotes(bytes32,address)","46975b9a":"swypeCode()","4697f05d":"setAllowed(address,bool)","4698ad05":"transferWhileLocked(address,uint256)","4698d110":"numMembers()","4698d920":"setMintAuditApproval(address,address,address)","4698da9d":"releaseVestedTokens(address,address)","469912d7":"Crowdsale(uint256,address,address)","46999ee5":"addNamespaceMember(string,address)","469a6947":"unlockTimeOf(address)","469aaa98":"BitSTDLogic(address)","469ab1e3":"contractNameHash()","469bb426":"failedDonations(address)","469c62a6":"buy_tokens()","469c7f4d":"transferOwner2(address)","469c8110":"sendMessage(string)","469c8dbb":"ExternalSale(uint8,bytes32,address,uint256,uint256)","469e2d5c":"submitPresetTransferes()","469e9067":"records(address)","469ef000":"hasValue(address[],address)","469f4c41":"setPreIcoStatus(uint256)","46a06ddb":"getPreviligedallowed(address,address)","46a06eb9":"LogTimedTransition(uint256,uint8)","46a1749a":"AgingTransfer(address,address,uint256,uint256)","46a1cd08":"getAvailableReward(address)","46a1d95f":"closeMarket(bytes)","46a1fabf":"Withdraw(address,uint256,uint256,bool,bool,string)","46a2679a":"getSubpotsCount(uint256)","46a2b53e":"GAS_REQUIREMENT()","46a3e290":"Defreeze(address,address,uint256)","46a3ec67":"TheAnswerIs(string)","46a54e15":"privatesale_start_time()","46a5b318":"DutchAuction(address,uint256)","46a5bf0c":"airDropStage()","46a60e99":"buyRoseGRLC(bytes32,string,uint256)","46a672bd":"createCard(string)","46a6c499":"freezeMyFunds(uint256,uint256)","46a7551d":"isOnBattle(address,uint64)","46a79a4e":"changeGameSettings(uint256,uint256,uint256,uint256,uint256,uint8,bool,uint256)","46a9d680":"EthereumGold()","46aa6644":"sendAllFeeToAddress(address)","46aaf139":"getSignersCount(bytes32)","46ab3d5e":"evaluateProposalMarket(uint256)","46abf8a8":"setVariables(uint8,uint16,uint16,uint16)","46ace8fd":"removeServer(string)","46ad5859":"getTokensRemaining()","46ade2de":"RESERVED_TOKENS_FOR_PRE_ICO()","46ae38a8":"getHexSymbol(string)","46aee903":"changeminBuy(uint256)","46af23f5":"InstantLottery(address,address,bool,address)","46afb963":"CrowdsaleState()","46b04e53":"PlayerInfoPerZone(uint256,uint256)","46b1d3be":"endTimePreICO()","46b207b8":"checkExpiry()","46b249b9":"tokenSaleOnHold()","46b305d6":"lockBetsForWithdraw()","46b33bc2":"getDonebountyAmount(address)","46b33e05":"getFreeTurtle()","46b4320c":"showUserBalance(address)","46b45af7":"isMintable()","46b55416":"subBuy(bytes32,bytes32,bytes32,address)","46b56bf6":"contract_sha256()","46b5d107":"testFailMintGuyNoAuth(int256)","46b5e202":"set_num_levels(uint256,uint256)","46b61083":"GoDigit(uint256,string,string)","46b65ffd":"getModule(uint8,uint256)","46b7068c":"returneth(bytes32)","46b753a2":"setChargeFeePool(address)","46b77d9f":"areFundsReleasedToBudget()","46b84cad":"getPackageById(uint256)","46b8c49e":"setReserveData(address,uint256,address)","46b98d0c":"startContract(bytes32,uint64)","46ba6f61":"setSuppressedGame(uint256,bool)","46ba7783":"setDistributionMinter(address)","46bb2833":"founderAddress()","46bbb6cf":"removeSshKey(string)","46bc29bf":"getGoldMigration(uint256)","46bdca9a":"equal(string,string)","46be2310":"export(bytes8,address,address,uint256,uint256,bytes)","46be2e0c":"left32(uint256)","46be6f87":"newGame(uint8,string,string,bytes32)","46be96c3":"amountFilled(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)","46be9c48":"lockState()","46bf3df3":"_setWallets(address,address,address,address)","46bf5864":"ERC223Token_STA()","46c017b5":"zhuchu(uint256)","46c068c3":"testEndsWith()","46c092b2":"presaleGuaranteedLimit(address)","46c13d28":"changeAccessTokenFee(address,string,uint256,uint256)","46c2997a":"notMoreThan()","46c3166f":"testThrowRetractLatestRevisionNotOwner()","46c34832":"WinnerProvidedHash()","46c49c58":"CustomToken(string,string,uint8,uint256)","46c4e533":"withdrawUpdate(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes)","46c52b1a":"blockHexCoordsValid(int8,int8)","46c59373":"ethManagementPropagate()","46c66b27":"_transferAll(address,uint256)","46c6f325":"TEACHTokenToken()","46c715fa":"original()","46c797e2":"updateMarriageLicenceImageIPFShash(bytes)","46c7c126":"getChallenges()","46c968db":"blocktubeClip(string,uint256,uint256,uint256)","46c9b457":"privatePreSalePrice()","46ca48a2":"freeAmount(address)","46caf5e8":"BTB()","46cc3179":"getComponent(string,string)","46cc43fb":"decodedSecret()","46cd9b23":"_triggerNewPVPContender(address,uint256,uint256)","46cdb099":"shareholderID(address)","46ce33d4":"clearLockBalance(address)","46cee8f7":"TemporaryPyramid()","46cf1bb5":"lockState(address,uint256)","46cf6d2e":"_validate(uint256,uint256,uint256,uint256,uint256)","46cffffd":"NewAreaStatus(uint256,uint8,uint8,uint8,uint8,uint256)","46d0a022":"transfer(address,address,address,address[],uint256[])","46d0e892":"makeOptions(uint256,address,uint256)","46d0eb60":"addAlias(address,string)","46d0fb60":"isUserLicenseValid(address,string)","46d1501a":"PoP()","46d17bfd":"LongBought(address[2],uint256[2],uint8,bytes32[3],uint256)","46d17c3a":"Unregister(address,uint256)","46d1c605":"balanceOfButter(address)","46d22c70":"canBreedWith(uint256,uint256)","46d24cbb":"refundedWei()","46d36fa0":"ChristopherRobinRT()","46d46a6a":"CashTelex()","46d47cdf":"testFailCreateWithParentsParentNotInUse0()","46d5688e":"RATE_CROWDSALE_S1()","46d64aa2":"Kuberand()","46d667db":"setBytes32(bytes)","46d6b1e8":"getChampsForSale()","46d6c93b":"addFeed()","46d7195d":"vote_until()","46d73def":"hasHalted()","46d7df42":"setTokenContactInformation(string)","46d89444":"getCrowdsaleTierList()","46d95146":"anvlTechToken()","46db63d7":"rewardUser(uint256,address,uint256)","46dbf9b0":"pickupProduct(uint256)","46ddb7db":"setAccountBalance(address,uint256)","46de0fb1":"isFrozen(address,address)","46deb279":"ElementUpgraded(uint256,uint256,uint256,address,uint256,uint256,uint256)","46df1578":"refferBonus()","46df2ccb":"setRate(uint256,uint256)","46e04a2f":"claimTokens(uint256)","46e06634":"approveKYC(address,bool,uint256,string)","46e0c223":"_createOfAthlete(address,string,address,uint256,uint256,uint256)","46e184da":"Olife()","46e1bfbb":"acceptAtGroup(address,uint256)","46e1f732":"investorsProcessed()","46e1fa55":"_removeDefaultOperatorByTranche(bytes32,address)","46e2577a":"addProvider(address)","46e2a174":"preIcoTokensSold()","46e33afc":"getFACTOR()","46e34823":"tan(uint256,string,string)","46e36060":"subBalances(address[],uint256[])","46e3cb1a":"sellTradeConfir()","46e44f63":"getCheckRecordTS(bytes)","46e4959d":"mintMulti(address[],uint256[])","46e4d35d":"numOfLoadedEarlyPurchases()","46e5500f":"LogFinalized(address,uint256)","46e5c323":"largestHODLERBalance()","46e6ffdd":"OwnableStorage()","46e767bc":"Log2(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256,uint256)","46e780b0":"getLinkHash(address)","46e7ccac":"isAuthorizer(address)","46e87b1e":"RgiftTokenSale()","46e93dbc":"maturityProcess(string,bool,uint256,uint256)","46e9ab22":"Gateway()","46e9e3c2":"reclaimPeriod()","46ea2552":"transferManager()","46eac50e":"superTransfer(address,uint256)","46eba0c1":"fundWithdraw(address,uint256)","46ebb5e2":"TimedPresaleCrowdsale(uint256,uint256,uint256,uint256)","46ec56c5":"getNumInvestments()","46ed24a3":"setAirdropToken(uint256)","46ed3199":"ATCToken()","46edef6c":"accICO()","46eea9a1":"secondStageRaised()","46eeed5f":"rolloverFee(address,uint256,uint256)","46ef6660":"createTokenContract(address,bytes32)","46f02832":"queryPermissions()","46f04694":"periodICOStage8()","46f0975a":"signers()","46f19888":"get_total_info()","46f24c6a":"functionSix(uint256,uint256,uint256,uint256)","46f25cad":"setAuthor(string,string,address)","46f2e880":"payForMyselfWithChecksum(uint128,bytes1)","46f42dff":"Win(uint256,uint256,uint256,address,uint256)","46f43f15":"StierBitToken()","46f74c6d":"setArbitrationPercentage(uint8)","46f76648":"getTotalEthSended()","46f7a883":"BuyTicket(uint8,uint8,uint8)","46f7cf87":"insert(address,uint256,address,address)","46f84dc4":"grantPermission(address,address,bytes4,address)","46f8e5ec":"getBlocksUntilStart()","46f92818":"setCreditDaoAddress(address)","46f99063":"totalSent()","46f9bedf":"costPerTicket()","46fa14e5":"MyFeed2Token()","46fa2574":"preIcoMembers(address)","46fae630":"getAllCardsAttack()","46fbf68e":"isPauser(address)","46fc9037":"__beneficiaryTransfer(uint256)","46fcafe2":"etherContributions(address)","46fcff4c":"availableFunds()","46fd9446":"setUsdEtherPrice(uint256)","46fde171":"closeCdp(address,uint256,uint256,address)","46fe2edb":"reserveIAMDestination()","46fec37b":"LogBounty256(address,uint256,string)","46ff099d":"cancelOrderByPayer(string)","46ff43dc":"totalInCents()","46ff4ce6":"betRedCoin()","46ff64f3":"setOraclizeRoundGasFee(uint256)","46ff7eac":"depositContrac(uint256)","46ffb216":"m_startTimestamp()","46ffdfbc":"getMax(uint16[])","47002c6d":"TOTAL_RECEIVED_ETH()","47006460":"maximumInitialBuyoutPrice(uint256)","4700d305":"panic()","4700dc57":"setFirstBonusTokensLimit(uint256)","4700fada":"GVToken(address,address)","47021780":"QSBH()","47026d90":"Volkstest3()","47028fcf":"getSponsorshipAmount(address,uint256)","4702d115":"dataCalc(uint256,uint256)","4702fa12":"_getCurrentRound()","47040cb4":"getStateProofAndHash(bytes,uint256)","47048c7b":"getMemberBoss(address)","47055321":"deduct(address,uint256)","4705b55b":"XCOIN()","4705d888":"getlastmoney()","47062402":"buyFee()","47064d6a":"setData(string)","4706840e":"destroykill()","4706c375":"_withdrawEquity(address,uint256)","4707f44f":"tokensOfOwnerByIndex(address,uint256)","47085958":"SetIndustry(string)","47089f62":"addVerified(address,bytes32)","470905b1":"Founder3()","470a5f4e":"reinvest(uint256,bytes32)","470b1984":"investedBTC()","470b1f7c":"AnetCoin()","470b2867":"tablet_owner()","470b6e0e":"addStackholderTransaction(address,bool)","470bb62b":"record(string,string)","470ca291":"referrerLevel3Ether()","470d7722":"batchAddAddresses(address[],uint256[])","470e872c":"transferBill(address)","47102a5d":"ETC(address,uint256)","4710411d":"twenty_percent_of_amount()","4710c5bf":"preSale3()","4710c63c":"excavation()","4710cfd7":"nContract()","47115192":"voteCut()","4711748d":"setNDCContractAddress(address)","4711dbe1":"registrationBounty()","4713f29b":"setBuyingCostumeRate(uint256)","47146b28":"setFiscal(uint256,uint256,bytes32)","4714c0aa":"proxyAccountingCreation(address,uint256,uint256)","47156810":"scheduleNewDerivativeToken(address,address,uint256)","4715b308":"decreaseApprovalPreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)","47166f62":"Quarkchain(uint256,uint256)","47170eb8":"LogEtherTransfer(address,uint256,uint256)","4717dea9":"getTicket(address)","4717f25a":"charonsBoat()","4717f97c":"getResults()","4718d108":"_transfer(address,address,string)","4718dc4d":"payOutVoterById(uint256)","47198cd1":"get_baseAmount(uint256)","471a20e7":"getResponses(uint256,uint256)","471a2270":"Lottery(uint8)","471a23c8":"burnMe(uint256)","471ab294":"handleTokensFromOtherContracts(address,address,uint256)","471ad963":"redeemProposalFunds(bytes32)","471b37cf":"VESTING_ADVISOR_DURATION()","471c95db":"TransferFees(address,uint256)","471d0481":"randomB()","471d4118":"releaseTimeFund()","471d66cb":"exceedsMaxInvocations()","471eab5c":"removeAllowedSender(address)","471efce5":"tokensForPreICO()","471efe66":"set_addresses(address,address)","471f11ec":"purchaseTown(uint256)","471f4722":"setOnSaleAmount(uint256)","471f7cdf":"favoriteNumber()","471fabfd":"eexploitOwnn()","472016da":"playersAddresses(uint256)","47202819":"unregisterInit(address)","4721ed6f":"enableRedemption()","47220f25":"maxPremiumDragonsCount()","4722361c":"canStartSettling(bytes32,address)","4722b4a5":"getFeeParameters()","47237f47":"freeStorage(uint256)","47241a27":"setAdditionalBonusPercent(uint8)","47244212":"Product(string)","472457cb":"addDragonName(uint256,string)","47249b1a":"GetEventInfo()","4725211b":"recordNameCount()","47255591":"setOuverture_des_droits(uint256)","4725d544":"_utoa(uint256,uint8)","47274dbe":"disableUser(address,address)","4727925a":"KEKEcon()","4728537c":"lockupBalanceOf(address)","4728d3ae":"CreatedEDU(address,uint256)","472905ca":"makeAdmin(address)","47293d15":"getAddressesCount()","472aa7df":"createProduct(bytes32,uint128,uint256)","472ad331":"InvestmentsCount()","472b6492":"AddEth()","472b6efa":"getWinRate(uint8)","472c681f":"addPack(address[],uint24[],uint24[],uint16)","472ca5e4":"allocateBid3(bytes32)","472d35b9":"setFeeManager(address)","472e1910":"verifyOpenSignature(address,bytes,bytes32)","472eb03d":"payLoan()","472f36e2":"Allocated(address,uint256)","472fdb67":"totalTokensReserve()","4730725d":"addToTimeLockedList(address)","4730bf06":"STAGE_1()","4732a7dc":"setMigrationAddress(address)","47337aab":"Btencoin()","4733a341":"SubmitClaim(address,string,string)","4733dc8f":"transferProxy(address,address,uint256)","4734922a":"generateOrderByAdmin(address,address,uint256,string,string,string)","473528b2":"_updatePurchasingState(address,uint256,uint256)","473533e6":"estimatedWeight()","47355ba5":"PiplToken()","47356bd9":"show_automated_Buy_price()","47356dd8":"getServiceUpdateAddresses(address,uint32)","4735b35f":"createDiamondAuction(uint256,uint256,uint256,uint256)","4735c747":"CrowdsaleToken(string,string,uint256,uint8,address,bool)","4735e00a":"CollectibleBought(uint256,uint256,uint256,address,address)","4736786b":"EthereumUnionToken()","47369a7c":"getPositionDeedHolder(bytes32)","4736b531":"TdeStarted(uint256)","47372325":"getChannelSize(address)","47373033":"enableStartBattle(string)","473753cb":"batchCancel()","47378145":"getBlockNumber(bytes32)","4737e852":"viewContractHoldingToken()","47387404":"_getGameStartAuctionMoney()","47395ced":"append(string,string,string)","473a223d":"getClosingTime(bytes32)","473aa2a5":"getFile(bytes32)","473ae9fe":"testCreateWithParent()","473b0d46":"setMinContribution(uint256)","473b4c53":"BrehonContract(address,address,uint256,bytes32,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)","473bc223":"gameName()","473bca32":"secondAllocation()","473ca96c":"win()","473e9408":"_getAttributesOfToken(uint256)","473edf73":"Award(address,uint256)","473f0117":"contributionID(uint256,address,uint256)","473f1803":"claimRewardForUser(uint256,address)","4740a08b":"getEggData(uint256)","474154bc":"divIsSafe(uint256,uint256)","47416aec":"setTokenContract()","4741b95c":"setPercentFrozenWhenBought(uint256)","47428855":"assertEq32(bytes32,bytes32)","47430b36":"parnter()","474448c4":"finishResolveFund(bytes32,string)","47448e8a":"set(bytes32,string,bytes32)","4746041f":"burnIndexedFrom(address,uint256)","4746cef8":"_confirmAndCheck(address,bytes32)","47471183":"freeOf(uint256)","474740b1":"batchLimit()","4748f7c2":"icoPhase1TimeBonusInPercentage()","47492352":"ROLE_PAUSE_ADMIN()","474a5a09":"AssetBackedToken(uint256,string,uint8,string)","474a88cb":"failsafe()","474b2541":"setRevision(address)","474bbab2":"calculateTokensToSend(uint256,uint256)","474c0868":"getActiveBuySize(bytes32)","474cdca2":"countTotalInvestors()","474ce368":"Computer()","474ce872":"promisee()","474ceb4d":"setCrowdsaleDate(uint256,uint256,uint256,uint256)","474d904b":"totalTokensWithoutBonuses(address)","474da79a":"contracts(uint256)","474e9e74":"MaxICOSellSupply()","474ea7e9":"Cyrus()","474f067f":"setType(bytes32,string)","474fa131":"extraMintArrayPendingProcess(uint256)","47516910":"FileHash()","4751757a":"Metronome()","475289da":"numberOfMoods()","475297bc":"closeBets(bytes16,bytes16,uint256,uint256)","4752a3ce":"StdUInt32(uint32)","47535d7b":"isOpen()","47540b31":"setTeamAddress(address,address,address)","4754a311":"StatusContract()","4754d136":"rerollFee()","47556b73":"isSuperInvestor(address)","4757ace4":"milestoneCompleted(uint256)","4757f1d2":"redeemAllOutcomes(uint256,uint256)","47582291":"totalstakeamount()","4758871d":"FOUNDER_EXCHANGE_RATE()","4758b9cd":"checkNumber()","47593ae7":"oldPrice()","475a2ac6":"mainSale(address,uint256)","475a9fa9":"issueTokens(address,uint256)","475abbb7":"PLATAMOUNT()","475b54c9":"AdvancedOwnable()","475b723a":"setRate362()","475c051d":"grantPermissionBatch(address[],string)","475c3001":"FinishTokenSale()","475c420c":"setHelpMeTokenParts(address[])","475c578c":"walletPercentage()","475c5ed1":"contributedToSTO(address)","475c7605":"ImpeachmentSupport(address,uint256)","475ca435":"get_record_by_row(uint256)","475d41f9":"SISKCoin()","475d599b":"wolf2Balance()","475e0062":"RoundEnd()","475e4c0f":"buscarDocumentoPorHash(bytes32)","475ec95a":"PRESALE_MINIMUM_FUNDING()","475fd055":"supplyLeftAtOrigin()","4760eee3":"getStartersProxyAddress()","47615fa1":"RankScore(address)","47625694":"getPerformance(uint256)","476343ee":"withdrawFees()","47635dac":"transferContract(address)","4763e3fe":"LOG_ZeroSend()","4766551d":"getExCoins()","47665ae8":"setMaxEthPerAddress(uint256)","4766ae68":"RareToken()","476711cb":"currentPeriodEtherCollected()","4767aeec":"_getaward(uint256)","4767d305":"EventCreateRisk(address,uint128,uint256,uint256)","476810b5":"ico1Min()","4768136e":"MelonWallet()","47683f00":"isInTier2(address)","47688c74":"userAmount()","47695e60":"MENTORS()","4769ed8f":"buyFromRC(address,uint256,uint256)","476a29e2":"pauseStateSwithcer()","476a4558":"DigitalMaterai(uint256)","476a73ec":"transferEthToMultisig()","476aa607":"saleHardCapReached()","476b7e3b":"readyToFulfill()","476c089a":"finalyze()","476c494c":"newAnswer(uint256,uint256)","476c9f41":"SecurityToken(string,string)","476d7c13":"userToNumCities(bytes32)","476e04c7":"NewMessage(string)","476e4aa4":"Remove(uint256)","476e6172":"getCurrentPlayer()","476fe919":"setReleaseTime(address,uint256)","4770ca3c":"AddBTCTransactionFromArray(address[],uint256[],uint256[],bytes4[])","47722218":"setKycAdmin(address)","4772eb77":"callDisableCallback(string)","47734892":"getUserBalance(address)","4773e0be":"didCloseLoan(bytes32,address,bool,uint256)","4774027c":"changeOffchainUploaderAddress(address)","477492dc":"MAIN_COIN_PER_ETHER_ICO()","4774ef06":"forwardGas(address,uint256)","47751b98":"validUpgradeId(uint256)","477523c2":"flushERC20(address)","47767c5d":"CRYPTOZOLToken()","4776ed69":"AngelTokensHolder(address,address,address)","477721e9":"FrozenContract(bool)","4777338c":"lastPricePaid()","4777c1f4":"setUnownedPriceInEth(uint256,uint256)","4777dbcf":"EternalStorageProxyForStormMultisender(address)","477801b1":"getLastRoundResults_by_index(uint256)","47786d37":"setCap(uint256)","47786f51":"HODL()","4778a5be":"orderSubmitted(bytes32)","4778dfb8":"balanceById(uint256)","47799da8":"last()","4779fad9":"setMentorsTokensPercent(uint256)","477a0eb3":"removeAtIndex(bytes32[],uint256)","477a7042":"getCanvasState(uint32)","477adb83":"eggtracker()","477af741":"firstMaxAmount()","477bda31":"qnt10k()","477bddaa":"setContractAddress(address)","477cdbb5":"create(uint256,uint256,uint256,address)","477ce277":"cost(address,uint256,bytes,bytes)","477d47b5":"viewPreSaleRefundsInMainSale(address)","477d6c6c":"_emitBoardCreated(uint256,bytes32,bytes32,address,uint256,uint256,uint256,bool)","477eab0a":"taxman()","477fe4e6":"payForTask(uint256)","477ff120":"addTokenAddress(address,address)","47803e97":"tokensOnHold()","4780eac1":"wethContract()","47810b3e":"LTY()","47816131":"EphronTestCoin(uint256,uint256,uint256,string,string,uint256)","4782f6fc":"removeOwners()","4783c35b":"multisig()","478573ca":"getMainWallets()","47858c79":"finalizedUpgrade()","478609f7":"mintTokens(int256,address,uint256,uint256)","4786cfea":"_estimateSupply(uint256,uint256,uint256,uint256)","47872b42":"unsealBid(bytes32,uint256,bytes32)","4787513a":"tokenHoldersCount()","4787e261":"calcQuickPromoBonus(uint256)","47883fd9":"product4_luckybuyTracker()","4788cabf":"getContractId()","4789aaef":"EthereumDice()","478aa69e":"unauthorizeUser(address)","478ae93c":"playToWin(uint256)","478b2f8b":"trieValue(bytes,bytes,bytes,bytes32)","478bdce2":"WinningNumbersEvent(uint256,string)","478c4238":"p_update_mResalePlotOwnerPercent(uint256)","478c4e0e":"resetData()","478cd032":"getLevelAmount(uint256)","478d2136":"proposalsByShareholder()","478db7e7":"getDataTrackingParameters(uint256)","478e25bf":"resetAction(bytes32)","478e7d7f":"getSponsorableJobs()","478f0735":"Jamatoken()","478f796a":"ownersWallet()","478f7b52":"mainSaleMinPaymentWei()","478f7eca":"CnytCoin()","47913dfe":"staticArrayChangeValue(int8,uint256)","47923d6f":"_addDividendsForAddress(address)","479245bb":"_transferOwnership(address,address)","4793017d":"stageLending()","47930567":"hashPosition(uint32,int64[2],bytes16)","4793504e":"Divider(uint256)","4793cebe":"allocateRemainingTokens()","479487e3":"getCar(string)","479564d5":"getAssociatedTAOSettingDeprecation(bytes32)","4795ac60":"collectPayment(uint256)","47963cf8":"COINEIUM()","47966bc2":"spam()","4797debe":"approveAmountAndSetFirstUseTime(uint256,address,uint256,uint256)","4797f21b":"setLog(address)","479834ca":"generateRandomMonster(uint8[14],uint32)","4798a2e3":"limorico()","47992b25":"DST_RESERVE()","479a4ae9":"isSHA256HashRegistered(bytes32)","479a5d53":"setOtherMigrationSources(address[])","479ad4c3":"removeListing(uint256)","479b321e":"CyberCash()","479ba3a5":"_resetPlayRound()","479ba7ae":"rewardsOf(address)","479d29f4":"BiyuleCoin(uint256,string,string)","479e24e6":"setNewInvestCommission(uint256)","479e393c":"getBettingStastics()","479e840f":"playValue()","479ed225":"getMyGameCompleted(address,uint256)","479f8d33":"threeHotHoursDuration()","479fb784":"approveBalancesWaitingKYC(address[])","47a08955":"_Deposit(address,address,uint256)","47a0fd7e":"shieldsUp()","47a11f26":"lIKETOKEN(uint256,string,string)","47a1a2d6":"usdCollected()","47a21679":"sellKeys(uint256,uint256,bytes32)","47a21eda":"buySharesFor(address)","47a22ca4":"devChangeMiningReward(uint256)","47a34bcb":"getBlockMaxVotes(uint256,uint256)","47a36afd":"totalFeeFlows()","47a42ff7":"buy_sale()","47a5046a":"isKYCRequiredToReceiveFunds()","47a5b1b3":"addApprovedContractAddress(address)","47a64f44":"lockAccount(address)","47a66b57":"addUserEndorsement(address,bool,string,string)","47a68cd4":"EOSBetDice()","47a69105":"NewSmartSharingContract(string,uint256,uint256,string,string,string,string)","47a69dfd":"Vegetoken(uint256,string,uint8,string)","47a6e601":"getATMHoldersNumber()","47a7aad5":"_vest(address,uint256,uint256,bool)","47a8205f":"privateWeiRaised()","47a90325":"maxCapEcosystem()","47a98ed2":"WithdrawFailed(address,uint256,bool)","47a99264":"setBwServiceValidCaller(address)","47a9fd81":"rob(address)","47aa7cd4":"setPoolStatus()","47aaf4eb":"resetOldAndSetNewDiscounts(uint256[],uint256[])","47ab58ec":"valuationAndCutOff()","47ac704f":"oldTokenSale()","47ad396b":"setFundingRules(address,uint256,uint256,uint256,uint256,uint256)","47aee603":"DIW(address,uint256)","47aef0a9":"battles()","47af954d":"creationAddress()","47af9957":"pauseTransfers()","47afa4e4":"change_pre_ico_start(uint256)","47b24f15":"LavaWallet(address)","47b272c0":"startMining(uint256)","47b27b8b":"unblockTokens(address,address,uint256)","47b27fd0":"testIsComplete()","47b3aff8":"bundles(uint8)","47b40ba2":"betFreeGame(uint256,uint8)","47b47102":"bakeCookie(string)","47b4e272":"depositBTC(address,uint256,uint256,bytes32)","47b4f943":"canmint()","47b55a9d":"pendingWhitelistAddition()","47b5acfd":"getProposalPublishedAt(bytes32,bytes32)","47b5dd54":"burnedTokens()","47b60ec0":"investorsGrantsAmount()","47b64eb0":"setServerAddress(address)","47b6ab59":"Token(address,uint256,string,string,uint8)","47b7142b":"safeSubtrZJF(uint256,uint256)","47b72b89":"getdeptmembershipstatus(uint256,address)","47b79a31":"remainingTransfered()","47b79a40":"manVault(uint256)","47b82bec":"FUTURAX()","47b84579":"getCompte_30()","47b87e48":"GetSaleInfo(uint8)","47b8b30b":"toCancel()","47b950b6":"setWorkerDtPort(uint256)","47b989af":"MyReferrer()","47b98c2e":"RDWToken()","47ba65d2":"get(bytes8)","47bafa82":"refundingComplete()","47bb0613":"deactivateContract(address,address)","47bb159d":"getByFromAndToCount(uint256,uint256)","47bb1883":"computeReward(uint256)","47bb89f0":"balance(uint256)","47bba01d":"inactivateSelf()","47bbe867":"purchaseMembership()","47bc1f94":"tokenSaleSupplyRemaining()","47bc3e51":"mintBounty(address[],uint256[])","47bc7093":"removeIssuer(address)","47bda66d":"createAMIS(address)","47bdb7f4":"transferDisable(bytes20)","47bdc8b4":"oraclize_query(string,bytes[5],uint256)","47bdeedf":"getPlayerUsableTokensCount()","47be11ae":"addArrayItem(address,string,string,uint256)","47be7bce":"formulaPrecision()","47bf7924":"ClaimSHIT(address,uint256)","47c05c22":"massSending(address[])","47c0ea6b":"_invest(address,uint256)","47c1303a":"MeetsOne()","47c14648":"claimTokenReserveLife()","47c17bac":"getMonsterDexSize(address)","47c1b5cf":"setGGEFee(uint8)","47c1caff":"getDividendsOf_(address,bool)","47c23bff":"setproduct(string,string,uint256,uint256)","47c3114e":"OpenContract()","47c35910":"authorize(address,address,uint256)","47c3ebf3":"is_presale_open()","47c421b5":"changeOracle(address)","47c51f73":"VisibilityDemo()","47c55045":"transferTokensFromTeamAddress1(address,uint256)","47c66140":"getProposalVotes(uint256)","47c6ecc0":"TokenFrozen(bool,string)","47c705b9":"Update(uint256,address,address,string)","47c7b6e2":"initEthDeal(bytes32,address,bytes20,bytes20)","47c7e6a8":"getAssetPackName(uint256)","47c81699":"set(string,string,uint256)","47c81f22":"TTT(uint256,string,uint8,string)","47c848e4":"_toPct(uint256,uint256)","47c85634":"setEmergencyWithdrawAddress(address)","47c8771c":"rsVerifyPoint(uint256,uint256)","47c8cc69":"getCurrentTDEBonus()","47c8efa7":"name1()","47c9301f":"erc20MRL(uint8)","47c98521":"rewardTheWinner(uint8)","47c9f9e8":"getNextTimeAirdropJoin(address)","47ca16a2":"setMaximumClaimPriceWeiRP(uint256)","47ca78d7":"paymentFallBack(address,uint256)","47cade2b":"unlockPublic()","47cb1b35":"getDailyJackpot(uint32)","47cb7a68":"timeLeft(uint256)","47cbc4f1":"HasNoElement()","47ccca02":"nft()","47cd3fda":"removeTransferRate(address)","47cda525":"TribeProducts()","47ce07d7":"NewPassManager(address,address,address,address)","47cf6f76":"isVotingActive()","47cf7e1d":"calcDoubleBindedBlindHash256(string,address,address)","47cfbaf4":"DMDPangea()","47d01637":"ProofOfCommunity()","47d04c71":"getWithdrawCount()","47d0dd3c":"COPIthereum(uint256,string,string)","47d1045f":"setNextSeedHash(uint256)","47d137c5":"unFrozen()","47d1d135":"setPixelColor(uint256,uint32)","47d20373":"stages()","47d289a9":"setDapCarToken(address)","47d3856a":"awardPot(string,uint256)","47d38af4":"NaNoDigitalToken()","47d3def9":"listAddress(address,uint256)","47d3ed10":"newDepositContract(address,address)","47d4106f":"CryptoSagaArenaRecord(address,uint8,uint8)","47d42c73":"PaymentStatusBlockNum(address,address)","47d52d86":"getMessageValue()","47d54bff":"finishedAt()","47d5d5b5":"ERC721TokenMock(string,string)","47d690b4":"limitDateCrowdWave1()","47d6cd6b":"_airdropAmount()","47d70f74":"icoEndBlock()","47d8167d":"buyBack(uint256,uint256)","47d83127":"sendFrom(bytes32,address,uint256)","47d84bab":"MultiSigStub(address[],uint256)","47d8fcb3":"emergencySetABackend(bytes32,address)","47d98eb4":"QUASI()","47d9b0aa":"FXTOKEN()","47da115a":"changeETH2Token(uint256)","47daf09c":"SmthToken()","47db0a24":"buyCreditsAndSpend(string,uint256,uint8,address,uint256)","47dd33fb":"VerumToken()","47dd5138":"EPSBets()","47dd5172":"perAddressCap()","47ddb165":"HODLIT()","47ddf87e":"allTimeJackpot()","47de074f":"getNodes(uint256)","47de3b76":"addSubmittal(bytes,address)","47df1cff":"callTokenTransferFrom(address,uint256)","47e0d54a":"winningTickets()","47e122dc":"earlyBirdTokenRate()","47e17101":"PRIZE_TOKENS()","47e17349":"addBonuses(uint256)","47e1d550":"getGameInfo(uint256)","47e20183":"point(address)","47e2688d":"getFinalSupply()","47e271b8":"getWeeklyLotteryParticipants(uint256)","47e2a6f9":"GetSellingTokenSymbol()","47e2b978":"RESERVED_COMPANY_UNLOCK_AT()","47e2d3f5":"zeroInt()","47e40553":"nextRound()","47e46806":"toString()","47e4ddf2":"createFreeze(uint256,uint256)","47e4e65e":"INFLIV()","47e51d38":"getConfigs(bytes32[])","47e57351":"withdrawTokensFromKingWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","47e5912a":"decreaseTokens(address,uint256)","47e5bec3":"closeTransaction(uint256)","47e60236":"setICOaddr(address,bool)","47e621b7":"backingToken()","47e6924f":"sanityRatesContract()","47e74409":"leadingGang()","47e7bce6":"roundStartedTimestamp()","47e7ef24":"deposit(address,uint256)","47e81c5f":"setBuildingContract(address)","47e87fcd":"maxSaleBalance()","47e9633c":"PaymentAuthorized(uint256,address,uint256)","47e99232":"doRebuy()","47ea13df":"setCurrentOwnerFeePercent(uint256)","47eacc78":"rateAngel()","47eafefc":"mainStartTime()","47eb86f1":"changeTokenPrice(uint256,uint256,uint256)","47ec8138":"transferWithLock(address,uint256,uint32)","47ec8d82":"AltSocialAccountPw(bytes32,bytes32,bytes32)","47ec8e21":"be()","47ecb665":"telegram()","47ed0112":"setAddressFundReferal(address)","47ee0394":"addToWhiteList(address)","47ee0a69":"decreaseApprovalInternal(address,uint256)","47ee2992":"COINS_PER_ETH()","47eeb75f":"claimMethodABI()","47eed11e":"test_fourInvalidFalseEqLog()","47eef00a":"issueUnsoldToken()","47ef01a1":"deleteRegion(uint256)","47ef55fe":"buyCore(uint256,uint256,uint256)","47f03d0b":"getFallbackDeposit()","47f07880":"ChatLinkToken()","47f1d8d7":"minBalanceForAccounts()","47f2748a":"getMixerTypes()","47f280aa":"DefaultToken(string,string,uint256,address)","47f3d794":"configure(uint256,uint8,uint256,uint256,uint256,uint256)","47f3dde5":"rewards(address,address,uint256,uint256)","47f4034a":"getUnitJadeStealingIncreases(address,address,uint256)","47f5666f":"getSanIdFromName(string)","47f57b32":"retract()","47f61a47":"Habits()","47f66790":"addThing(string,string,bytes32,bytes32)","47f66d15":"bestPromouterInfo()","47f67eab":"setActionPrice(string,uint256)","47f710a7":"free_transfer()","47f7af67":"sealdate()","47f7b304":"ownerApproves(uint256)","47f7d412":"withdrawFrozen()","47f8b863":"getNextCutoffTime()","47f95923":"alterPeerToPeerMarketplaceTransactionFee(uint256)","47f980e5":"claimTokenAddress(address)","47f9aa9f":"auditors(address)","47f9c371":"Proof_of_Stake()","47fa061e":"deposited(uint8,address)","47fa15e2":"ICOSuccess()","47fa1cbd":"evIssueManagementFee(address,uint256,uint256,bool)","47fa5648":"Minewar()","47fafe7d":"setAccountProvider(uint8,address)","47fb0bed":"checkSender()","47fc216e":"getEventsLength()","47fc4306":"contractWithdraw()","47fc822f":"setTargetContract(address)","47fdbfb7":"StageChanged(string)","47fee755":"getGeneralAttr(uint32,uint8)","47ff6d7b":"buildId(address,uint256)","480111b0":"potShare(address)","4801206e":"OodlebitToken()","480140ca":"checkSidePledge(uint256)","48016c04":"assertEqDecimal(int256,int256,uint256)","480184a9":"getNewToken(uint256)","48025070":"setGivenReadings(bytes32,bool,bool)","48027610":"transferPaidOut(address,address,uint256)","4803724e":"removeLock()","4803b482":"UpdatedBlockingState(address,uint256,uint256,uint256)","480443b7":"validateBSM(string,address,uint8,bytes32,bytes32)","4804a623":"getflag()","4804e06f":"firstStageMintingDate()","4804e1a2":"transferBlocked()","4804e2a5":"WalletConnector(uint256,address)","4805b069":"NCRToken()","4806249e":"badgerWallet()","4806a0bd":"declineTradeOffer(uint256)","4806b2d2":"getPoolPrices()","4807270b":"cancelOffer(uint16)","480744e0":"setOwnerAsAdmin()","4808bf1c":"paymentsByCustomer()","480a434d":"baseprice()","480b1f21":"rateWin()","480b70bd":"scheduleCall(address,bytes4,uint256,uint256)","480b890d":"setPercentRate(uint256)","480b9122":"DebugClock(uint256)","480b9707":"updateSecondWallet(address)","480bc31f":"getTotalPot()","480c6ca5":"getTokensIssued()","480d3b2f":"manualCheckInvestmentRequired(uint256,uint256)","480d7504":"getMineTokenAmount()","480e2f8e":"LastContributorChanged(address)","4810034a":"AirDropper(address[],uint256[])","48103077":"set_tokens_received()","48107843":"getNextCallSibling(address)","4811647c":"withdrawTip(uint256)","4811af4a":"preIcoMax()","4811c070":"team1Address()","4812663f":"nAuditorsRequired()","4813d8a6":"isAllowedToMint(address)","4813e3e5":"halvingCycle()","48144ef6":"BillHenryTestCoin()","481456f9":"probability()","48146113":"userDeposit()","48146341":"updateMaxGasPrice(uint256)","481531e9":"FeeToken()","48156d9c":"Loss(address,uint8,uint256,bytes32,bytes32,uint256)","4815ccea":"confirmAndForwardOnBehalfWithRevert(address,uint256,bytes,bytes32,uint256[2],uint8[2],bytes32[2],bytes32[2])","4815d4a9":"SECOND_SUPPLY()","4815d83f":"setBountyTeamUnfreezeTime(uint256)","4817c3e2":"_modifyTopUpLimit(uint256)","4817db70":"approveAndCall1(address,uint256,bytes)","4819d270":"approveRobot(address,uint256)","481a3fc4":"close(address,uint256,uint256)","481a4f2a":"fundLockTransferFrom(address,address,uint256)","481ae5d0":"setColdLedger(address)","481af3d3":"kittyIndexToApproved(uint256)","481b3dbb":"CentsToken()","481b659d":"permitPermanentApproval(address)","481c6a75":"manager()","481d3bd5":"setRegionUpdatedAt(uint256,uint256)","481dbaa4":"amountWithTip(uint256)","481ed14c":"YetAnotherUselessToken()","481ef4fd":"getAdPriceDay()","481f9555":"ALLOC_SC()","481fb72a":"numRentStatuses()","481fcbf4":"ApolloCoinTokenSale(uint256,uint256,uint256)","4820059f":"setDisallowedForMinting(address,address)","482076b6":"preICOHolders(address)","4820946a":"getContributorRemainingSaleAmount(address)","48224f67":"SUPPLY_FOR_SALE()","4822d008":"hexControllerAddr()","4825fc0d":"_ownerWallet()","48261921":"getLotteryPrizeInfo(uint256,uint256)","4826a425":"sub_codicefiscale(string,uint256)","4826e9c5":"UTC2MYT()","482717a4":"GetAddrCallQty(address)","482769f3":"distributeFunds(uint256,uint256)","482871ed":"_transferSigner(address)","4828a833":"MultiTransfer()","4828f4a2":"recover(uint256,uint8,uint256,uint256)","48293aae":"showKeys(uint256)","482961e1":"updateReading(uint256,uint256)","4829b393":"Tombola()","482a0bc9":"computeTokenAmountAll(uint256)","482ae8a2":"lastBlock_v8Hash_uint256()","482b27c9":"GetAdminAddress()","482ccedd":"_payFees(address,uint256,bytes4)","482d3af0":"allOwnerOperations(address)","482d51e0":"startNewGame()","482d7d5a":"_mine(uint256)","482da403":"buyme()","482f63b0":"postMessage(bytes32,bytes)","482fbae2":"_resultToRoll(string)","4830868b":"setPrWallet(address)","4830d5d9":"removeRestriction()","4830e266":"buyReferral(address)","4830e636":"setFreeClaimAllowance(address,uint256)","4830fd5f":"TotalLose()","48318cbc":"newIdTankProduct()","48330262":"priceIncrease_20_January()","48330cf6":"updateAvailability(uint256)","48335238":"FrozenFunds(address,bool)","48338323":"getRanomSecret()","48338756":"withdrawArbFunds()","4833c47c":"getTokenByBid(uint32)","483699f4":"tokensFor1EthP6()","4836f823":"salesRates(uint256)","48370565":"tradeValue(address)","4837715a":"___initialize(address,address,address)","48378eea":"getBool2()","4837e2fa":"amountOfLegs()","48389870":"cutToInvestorsDividendPool(uint256)","4838d165":"blackList(address)","483a15ed":"getManagerFor(address)","483a20b2":"setCrowdsale(address)","483a6cf9":"transferForExchange(address,uint256,string)","483a83df":"setKYC(address)","483b04e3":"angelExchangeRate()","483b1a76":"isInPassFilter(address)","483ba09e":"setBitcoinBridge(address)","483c8400":"MIN_FUNDING()","483c8abd":"UpSuccess(string,address)","483d31e9":"sfc(uint256,string,string)","483d45bd":"getProvider()","483d8b77":"onehour()","483e3956":"killPoll()","483e7872":"changeRealZipper(address)","483ea316":"bindOrderStakes(address,int256)","483eef18":"comminglerSellsProductSKUWithProRataIngred(address,uint256,string,uint256,string,string)","483f1b18":"MigratedTokens(address,uint256)","483f31ab":"consume(uint256)","483f5082":"getPriceTicket()","483f69c0":"HPToken()","483fa94b":"placeorder(uint256,uint256)","48401f1a":"joinBytes(bytes,bytes,bytes)","48403ad4":"preICOtokensSold()","48410f80":"hexToString(bytes32)","48419aed":"tokensRemainingStage1()","484293a7":"VertexCoin()","4842f639":"setBreedingAddr(address,address)","4843b358":"withdrawalsAllowed()","484412e5":"A5DToken()","48447983":"QiMingCoinToken(uint256,string,uint8,string)","4844f367":"placeBet(string,string)","484595fa":"encode(uint256,uint256,uint256)","4845d3f8":"closingTimeExtensionPeriod()","4845d40c":"withdrawATokens(address)","4846f559":"getIsWinnerSelected()","4847a79c":"_transfer(address,uint256)","48481979":"getHorsey(uint256)","48481b8a":"ElepigCrowdsale(uint256,uint256,uint256,address,uint256,uint256,address,address,address)","4848b1a5":"setData(uint256,uint256)","484916a3":"NewInvestor(address,uint32,uint256)","48498729":"_fetchOrdersForPayer(address)","484b8d33":"setWalletAmount(address,uint256)","484b973c":"ownerMint(address,uint256)","484c4056":"Redeemed(address,uint256,uint256,uint256)","484c8675":"allocateTokens(address[])","484c98af":"supplyAtIndex(uint256)","484cb173":"MiddleClass()","484db63f":"firstRate()","484dd086":"preFundingStart()","484dd472":"shobozilToken()","484ec26c":"onPayout(uint256,uint256)","484eccb4":"lastGen0SalePrices(uint256)","484f4bc0":"noStoresSet()","484f5a61":"GetChallengeInformation(uint256)","48509d2c":"updateCapsAndRate(uint256,uint256,uint256,uint256)","48519189":"MonedaAlcala(string,string)","4852a273":"setWhitelistStatus(address,address,bool)","4852e54b":"SolarNA(address[],uint256[])","48538112":"totalRaisedAmountInCny()","485458a1":"GetContractStageTermination()","48546971":"closeIco()","4854bde0":"pvt_plmt_set()","485587a2":"employeePoolTokens()","48558be7":"getOnTokenTransferValueValue()","48560630":"bonus3Ends()","4857d52d":"setLiquidityParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","48582a2a":"units40percentExtra()","48593bae":"getEnumValue()","48594f43":"powerAddr()","4859f430":"registerVehicle(string,string,uint8,address)","485ac9fd":"_canSetGameOver()","485c5e96":"generateTokensAll(address[],uint256[])","485cc955":"initialize(address,address)","485d5d7b":"TSTORZCv1()","485d5dd2":"DayInSecs()","485d7d94":"removeAuthorized(address)","485d992c":"getDoc(address)","485dc6cf":"create21KittiesTokens()","485e16a5":"summReserve()","485e35d3":"updateWhiteList(address,address,bool)","485e82d7":"tokenIdsForTeam(uint32)","485f2ce3":"AccendiCassaAutomatica()","485f7a7e":"preSaleAllotment()","4860165c":"destroyIdentifier(bytes32)","48601a7d":"getTxnNum()","486083fe":"itemLottery()","48612fc0":"IAHCToken()","486201ab":"deapprove()","48624e44":"ATTPlaceHolder(address,address,address)","4862e650":"setVerificationCodeHash(string)","48636254":"setWhiteBacker(address,bool)","4863ba17":"setLibraryAddress(address)","4863ed97":"setCoins(address,address)","48640aba":"phase1WeiRaised()","48642e21":"bleachDailyLimit()","4864d140":"baseAmount()","4864d8d9":"activeStage()","48650338":"withdrawDividends(address)","48655faa":"setMintingOracle(address)","486575a5":"reducePledgedFees(uint256)","4865a24a":"strToBytes(string)","4865c7bf":"timeInfo()","4866352b":"scrapCounter()","48664c16":"transferPreSignedHashing(address,address,address,uint256,uint256,uint256)","4867ec4f":"decodeParamOp(uint256)","4868204b":"FundTransfer(address,uint256,uint256)","48686205":"DevConSchoolReward()","48688367":"fundMintingAgent()","4868ab47":"Yumerium()","4869687b":"getAgreedMediators()","4869854a":"StfuTokenCrowdsale()","486a03e0":"approveMappingProposal(address,address)","486a7e6b":"burnAmount()","486b7217":"getnumber()","486c182c":"minAcceptEther()","486c363d":"_transfer_token(address,address,uint256)","486c50f3":"getDiscountHourglass(bytes32,uint8)","486d6aa8":"factorReward()","486de794":"_pay(address,uint256)","486e66da":"hungry(uint256)","486e97ad":"VLUToken()","486ea48d":"Nodes()","486fc7e8":"tokenOwnership(address)","48700c7c":"EVEN()","48709183":"bountyBeneficiariesCount()","4870b81d":"transferToWallet()","4870dd9a":"PERCENT_DIVISOR()","4871052b":"LogSignature(address,bytes)","48719120":"renewFarmerCertificate(address,uint256)","4871c4c1":"ownerWithdrawTo()","48724227":"KickOwned()","487260bb":"startBlockBonus()","487269fb":"VLCToken()","48727dca":"TradeBitToken()","4873c721":"_remainingBlocks(address)","48749616":"getPoolInformation()","4874a41f":"Tfarm()","4874e62d":"concat(string,string,string)","48758697":"getRarity(uint256)","487621cc":"addNewbond(uint256)","4876a339":"accept1(uint256,uint256)","4876f3e5":"comfirmRedeem(uint256)","48794149":"credosReserveAllocation()","487a5057":"getGameStart(address,uint256)","487a6e32":"deliver(uint64,bytes32,uint64,bytes32)","487a8043":"receiveApproval(address,uint256,address,bytes,bytes)","487a9e27":"USD_CAP()","487cd86f":"right34(uint256)","487e1d1f":"getNameOfAddress(address,address)","487f3f06":"team_address_count()","487ff8b6":"winningaddr()","48803406":"removeFundAccount(address)","48807db1":"getPI_edit_12()","4881148e":"safeGetPartialAmountFloor(uint256,uint256,uint256)","4881ae73":"add(uint16,uint16)","48823786":"allstocksFund()","4882419d":"isEpocum()","48839789":"ProofOfAIDS()","4883b6ce":"CryptoTorch()","4883c9dc":"prevHodlers()","48849c5a":"blockTransferFrom(address)","4884f459":"buyListing(uint256)","4885b254":"batchTransferFrom(address,address[],uint256[])","4885d732":"TokensAllocated(address,uint256,uint256)","488683f3":"_Token(string,string)","48868ac8":"sanityCheck(bytes32,bytes32)","4886d2d5":"setIsOver(bool)","48870630":"abi()","488725a0":"versions(address)","48887c8b":"setFreeAlien(uint16)","48889813":"mintedPercentOfTokens()","4888c619":"cryptocompareBtcOracleUrl(bytes32)","48894ad6":"FiveBalance()","488981cd":"countCourse()","4889ca88":"receiveApproval(address,uint256,address)","488a24c6":"isWalletContract()","488a6705":"AddConsentData(uint256)","488ab2c0":"TOKEN_EXCHANGE_RATE()","488b3538":"shares(address,bytes32,int256)","488b380b":"setLpIsStart(bool)","488bfa0b":"claimPaymentTokens(address,uint256)","488c1709":"setRefundAgent(address)","488c65fc":"stakeWithSignature(bytes32,uint256,uint256,uint256,uint256,bytes)","488c7951":"abstractFn(uint256)","488cec69":"tokensAreAvailable()","488dc208":"updateUrl(address,bytes32[5],address)","488ede8b":"getUserRating(address,address)","488f1e43":"getSellingInfoByIndex(uint256)","488f231f":"createAssociation(uint256,uint256)","488f3b6a":"tryCloseRoom(address,uint256,uint256)","488fdb81":"buyFrom(string,address)","48900438":"getAllowedAmountAndPendingPeriods(address,address,bytes32)","48906c27":"evaluateMany(address,uint256,uint256[],uint256[],uint8[])","48916211":"checkSigs(bytes32,bytes32,uint256,bytes)","48917d5d":"lastDrawTs()","4891c06a":"contributionPool()","4891f401":"PRICE_1()","4892f0af":"tokenPorter()","489306eb":"oraclize_query(string,string)","48931352":"TOTAL_SUPPLY_CAP()","4893de2a":"rewardUnicornAmount()","4893ed5b":"proposedUserKeyPendingUntil()","48940815":"doTriggerJackpot()","48941312":"CoinAdvisorCrowdSale(address,address,uint256,uint256)","4894e37f":"__callback(bytes,string,bytes)","48957fb8":"getAyantDroitEconomique_Compte_4()","4896672e":"updateSalePrice(uint256,uint256)","489667e6":"_isSynthesizingAllowed(uint256,uint256)","489807a5":"Donate(uint256,uint256)","4898556e":"SaleStopped(address,uint256)","4898722d":"setSink(address[],uint256[])","48989182":"ethMax()","489979a3":"allocateTopupToken(address,uint256,uint256)","4899e4c6":"addrDistribution()","489acecc":"requireMultiple(uint256)","489b1636":"icoPhaseCountdown()","489b5046":"GetBankerCandidate(uint8)","489ba092":"setNameLink(string,string)","489c1202":"isGuard(address)","489c14fd":"pathAdvisorVault()","489c18b0":"getLocksLength()","489d2104":"changePaymentContract(address)","489d2844":"notifyBuyToken(address,uint256,uint256)","489d426e":"ratePreSale()","489da639":"COIN_SUPPLY_COMPANY_TOTAL()","489e5656":"MAX_CANVAS_NAME_LENGTH()","489f3c88":"ping(address,uint256,uint256,uint256)","489fde35":"setEnforce(bool)","48a0c8dd":"isDepositable()","48a0d754":"available()","48a0fa29":"toggleTokenExchange()","48a15250":"setBurnRequestUintMap(uint256,string,uint256)","48a16b8c":"_itoa(int256,uint8)","48a1befb":"UserFactory(address)","48a3cbdf":"fundTeam()","48a46bd3":"isRejected(address)","48a490fb":"transferFromTreasury(address,uint256)","48a50a54":"saleClosedTimestamp()","48a54fc5":"checkContract(bytes32)","48a5d7bb":"AssetPool(address,uint256,uint256,uint256,uint256)","48a60b6c":"getPlayerBets()","48a73e96":"getFreeNapkins()","48a76740":"TokenData(uint256,uint256)","48a7f1f9":"proposeOfferingContract(address,address)","48a860dd":"confirmTransactionAfterExpiryFee(uint256)","48a87fa8":"emptyTTT()","48a8b427":"calculateShareCrystal(uint256)","48a935e2":"setIndividualCaps(address[],uint256[])","48a9866b":"kill(address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","48aa71f4":"isInCrowdsale()","48aac336":"getNumberOfParticipantsPerLevel()","48ab41d3":"getPOOL_edit_3()","48ac0f3c":"CORPORATE_SUPPLY()","48acce46":"ponziAddress()","48acd9b1":"changeFeeAccount2(address)","48ad5cd0":"product3()","48adfbdb":"getModerator()","48afc0fe":"FOMO3DLite()","48afd1b3":"hasReturns(address,uint256)","48afe4f5":"currentPersonalLimit(address)","48b15166":"blockTime()","48b17b64":"currSaleComplete()","48b24b88":"IAM_PER_ETH_BASE_RATE()","48b43020":"_setDistrictAddresss(address,address)","48b45d92":"isRequestApprove(bytes32)","48b49fa7":"buyGem(uint256)","48b4d3a4":"EmitTransactionIds(uint256[])","48b52c7d":"_transferFrom(address,address,uint256,string)","48b537ce":"MaggieToken()","48b5677f":"delegatedSignedRemittance(bytes,address,address,address,uint256,uint256,uint256)","48b59dd6":"changeCourse(uint256,uint256)","48b5b15c":"testHasCorrectPriceForMultistage()","48b5de18":"setEscapeHatch(address)","48b741de":"greaterPriceMsgComparator(uint256,uint256)","48b75044":"release(address,address)","48b84cde":"testCreateElectionOptions()","48b8ff83":"tokensForArtist()","48b9ed30":"getdisdone()","48b9f88f":"blockDiff()","48ba2d51":"LogBidRewardClaimed(uint256,address,uint256)","48bafd0e":"newGame(string)","48bb4067":"teamIssuedTimestamp(address)","48bb4347":"_checkOpenings()","48bc2a21":"bonusSecondIco()","48bc3e2a":"twoStepRate()","48bc4edf":"startAndSetParams(uint256,uint256)","48bd64c0":"getArrayHashLibry(bytes16)","48bdaaff":"TradeStatus(address,address,uint256,uint256)","48be4030":"INDToken()","48beae6a":"kkTestCoin1()","48bf51f5":"setInterestRatePunitory(uint256)","48bf9179":"Extradecoin(address,address)","48bf9cea":"serialNumberIsUsed(string)","48c0b782":"intermediariesCount()","48c0dc5b":"Inonit(uint256,string,string,string)","48c1ee9b":"wadmin_transferOr(address)","48c20a24":"getChildsAmount(address)","48c22f3f":"RateClient(uint256)","48c26e22":"purchaseRate()","48c2f845":"purchased_tokens()","48c40dbd":"transferTokensThroughProxyToContract(address,address,uint256)","48c44712":"refundERC20(address,address,uint256)","48c4cae9":"setNameReaderId(bytes32,bytes32)","48c4d7ce":"descendingCount()","48c54b9d":"claimTokens()","48c5be67":"numDistributionsRemaining()","48c6af04":"test_oneInvalidEqString()","48c6e2f7":"BaoFengCheng(uint256,string,uint8,string)","48c7a0bf":"SharePrice()","48c7f438":"setOldest()","48c81c16":"GamersToken()","48c834c0":"tier4Rate()","48c875cf":"resetRequest(string)","48c8cd41":"dateTime()","48c91284":"setM1(address)","48c981e2":"sendEther(address)","48c9ecf8":"allowTokenOperations(address)","48cb5aeb":"Easticoin(uint256,string,string)","48cc38e1":"nestedFirstAllToAll2(uint256)","48cc7b6e":"startForge()","48cd4cb1":"startBlock()","48cd65d9":"getInPlayGames()","48ce382d":"addActivityAccount(address,uint256,string)","48cebd67":"presaleSold()","48cf9e5c":"getGroupIndex(uint256)","48cfa939":"minContribution_mBTC()","48cfc6c6":"crowdSaleEnabled()","48d0aff3":"drainexcess()","48d21789":"burnFunction(address,uint256)","48d24f35":"transferMintingAddress(address,address)","48d26dd1":"finalizeType()","48d2df48":"userBuys(address)","48d317ce":"stepTwo(int256)","48d34bc6":"getHashInternal(address,uint256,uint256,uint256,uint256)","48d37a58":"withdrawPrize()","48d453ee":"gcEndTime()","48d47e7e":"clc()","48d4eaf7":"storeData(bool,uint256,address,bytes32,string)","48d51a0d":"submitProposal(bytes32,uint32,uint32)","48d597e5":"addFromMapping(uint256,uint256)","48d5a5c0":"consensusAddress(address)","48d6002a":"otherPlayer(address,address[])","48d6047c":"WhitelistWalletUpdated(address)","48d64fd5":"changeTradeTracker(address)","48d6ca55":"getChangeFeeAmount(uint256)","48d7de63":"setTenant(bytes32,address,uint256,string)","48d82608":"InvestmentPolicyChanged(bool,bool,address)","48d848d0":"returnBoolean(bool)","48d8bb3f":"setIco(address,address)","48d9614d":"GetFee()","48d9a374":"blockTransfer(address,uint256)","48da08e6":"SilverCoin()","48da1532":"node_side(uint256)","48da60af":"limitClosedSale()","48da95b8":"VirtualExchange(address)","48db409a":"createContract(bytes32,uint16,bytes32,uint256,uint64,bytes32,uint64,bytes32,uint64)","48db5f89":"player()","48ddc01f":"changeFisherMansFeeCalculator(address)","48dddca8":"minSpend()","48de0cdc":"withdrawInBatch(address[],address[],uint256[])","48dfe175":"tier3Total()","48e021e9":"weiCostOfToken()","48e06300":"isEquipedAny2(address,uint256,uint256)","48e071d4":"denyUser(address)","48e0f410":"fundRaising()","48e11f70":"OMGCatCoin()","48e12ae3":"getAllowancePeriod()","48e1a760":"getttttttt(uint256)","48e1c18b":"itemsOwned(address)","48e252ab":"CryptoMilitary()","48e25bd2":"WinToken()","48e278f9":"NauticusToken()","48e37220":"presaleDateStart()","48e3a033":"mulPay(address[],uint256[])","48e3a064":"StandardCampaign(string,uint256,uint256,address,address)","48e4e297":"allowedToPurchase()","48e591ac":"getVote(address,address,uint32)","48e5c71f":"whoIS(string,bool)","48e61782":"left4(uint256)","48e66722":"getRedeemRequestsLength()","48e68e30":"synthesizeWithAuto(uint256,uint256)","48e6b393":"test_logs()","48e7575d":"ecrecoverFromSig(bytes32,bytes32)","48e76563":"oraclize_setNetworkName(string)","48e7a100":"reparametrizeMultisig(bytes32,uint256)","48e837b9":"createGame(uint256)","48e9657d":"getSignatureAtIndex(string,uint256)","48e9f1ea":"EPXCrowdsale()","48ea97be":"tokenSalePausedDuration()","48eaa435":"safeExp(uint256,uint256)","48eab053":"fourthTeamWithdrawal()","48eaeb72":"BPCC(uint256,string,string)","48eb76ee":"attacker()","48ec8a0c":"getSecurityLimits()","48ed190a":"lastBlock_f11()","48ed1e3b":"LookUpAvailableDivInt(address)","48ed3e00":"date610()","48ed994c":"newLottery(uint256)","48edbf1d":"SKS()","48ef245b":"createFaucet(string)","48ef5aa8":"UpdateMaintaining(bool)","48ef670e":"UportRegistry(address)","48f05187":"scheduleCall(address,bytes4,bytes,uint256)","48f082e8":"dayToMinusToken()","48f0b8e3":"getNumberOfGamesCompleted()","48f134f6":"closeSetup()","48f1e9c2":"getCertificationDocument(address,uint256)","48f2090b":"distributionPercent()","48f213e0":"PER_USER_AMOUNT()","48f221b6":"changePartner1(address)","48f36144":"claimOracle()","48f3e6f4":"getFourthAddressBalance()","48f549a4":"CreateToken(address,uint8,uint16)","48f6647b":"matchWithTheirs(uint256,uint128,uint16)","48f69212":"YELLQASH()","48f7f2a3":"daoFactory()","48f83e86":"authorizeAccess(address,address)","48f8fe69":"fnv(uint256,uint256)","48f918e0":"reclaimLeftoverEth()","48f95a7d":"depositsCountForUser(address)","48f9e246":"requestImplChange(address)","48fab2b0":"emitOracleUpdated(address)","48fb7332":"INTREPID_MAX_PRICE()","48fc66e9":"NzmLToken()","48fcb4e8":"getFrozenAccountCoinCount(address)","48fdb8c1":"partnernames()","48fee60f":"Criptohubcoin()","48fefd9b":"supportsToken(string,address,address)","48fefed2":"setNewGreeting(string)","48ff05b8":"removeUint256(bytes32)","48ff0c47":"testF4(uint256)","48ff1387":"rebuy(uint256)","48ff15b3":"acceptManager()","48ff30ff":"Breakup(uint256)","48ff6525":"applyRedenomination()","490052a8":"playerRoll(uint8,uint8)","49007329":"CCCRSale(address)","4900b48c":"checkOracle(address,address,address,bytes32,uint256[])","4901a205":"canShelf(string,address)","490203a7":"getMiningReward()","4902d163":"pendingOwnedOwner()","4902e4aa":"removeSuperAdmin(address)","490377a7":"setParameters(address)","4903c401":"Admins(address,address,address)","49041903":"getGame(uint64)","49044cc5":"premiumValue()","49051c1d":"threshold2()","49055da2":"getCurrGameInfoPart2()","4905c5b0":"_isUserInGame(address)","4905c769":"newLoan(bytes32,bytes32,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,address)","490618d1":"deregisterBroker(address)","4906da1e":"getMaxEther()","4907cd0f":"subscribe(address,uint256,uint256,uint256)","490825a9":"testControlTransferEnableNotTransferable()","49082bef":"TWO_YEAR_KEEPING()","4908d1de":"allUnsoldTokensAllocated()","490a32c6":"message(bytes32)","490a65c8":"PlutonDistribution()","490a6dac":"setWinner(uint256,bytes32,uint256,uint256,bytes32)","490b4f92":"coinAgeForAddressAt(address,address,uint256)","490bf04f":"rateToEther()","490c58f0":"addTokenTo(address,uint256)","490cce74":"FincontractMarketplace()","490d6d11":"Resume()","490e25c1":"C4FEscrow(address,uint256,address,uint256,uint8)","490e2bd1":"Autolen()","490f027a":"setPrizes(uint256[28])","490f611e":"Or(bytes32,bytes32)","490fc399":"votedKickoff(uint256,address)","490fdbd7":"transferTile(uint16,uint16,uint8,address)","490fea4d":"addBounty(address,address,uint256)","491045af":"LifeSet_002()","491274a8":"presaleContributorCount()","49135b0f":"getAllAlgos()","4913732e":"buyTokenFromModerator(uint256,address,uint256,bool)","49137bca":"reading_cards()","4913ec88":"EnergisToken()","49144618":"Wasted(address,uint256,uint256)","4914fb27":"approveWithdrawal(address)","4915ef4a":"refund_contract_eth_value()","49164b41":"CryptoDivert()","491737f2":"ico3cap()","491759aa":"sendEthTweet(string,string,string)","4917c302":"ACCEPTED_AMOUNT()","4918d588":"test_BondPostedAndOverMajority()","491a6155":"REFERRAL_BONUS_PERMILLE()","491a7904":"transferTokenTo(uint256,address)","491abe0c":"servicePayment(uint256)","491b0712":"snpb(uint256)","491b8c45":"setWARTokenAddress(address)","491c8e08":"lastBlock_a6()","491cfc1c":"setNextRoundDuration(uint256)","491d525a":"pMintTokens(uint256,int256,address,uint256,uint256)","491d75f4":"configurationTokenTranchePricing(uint256[])","491dcfe9":"batchActive()","491e0df0":"totalContributorsContribution()","491e55db":"GAME_COST()","491e74f3":"YICHAINCoin()","491eeb3a":"resumeInvest()","491fd263":"updateMessage(uint256,bytes32)","49200d77":"numberOfOutcomes()","4920781b":"GATcoin(uint256,string,string)","4920adcc":"MysteriumCrowdsale(address,address,uint256,uint256)","4920ff15":"SetHome(string)","49212c92":"preValidateChecks(address,uint256,uint256)","4921a91a":"giveMe()","4921cea6":"transferFeeOwner()","4921e147":"setMinWeiToPurchase(uint256)","4921f9e9":"AnonReport(uint256)","4922d481":"recovery(address)","49231598":"fetchAllVotersBySnapshotBlock(uint256)","49231b28":"changeRates(uint256,uint256)","49239e10":"refundStageStartTime()","492430f6":"DissolutionRoom(uint8,bool)","4924d397":"Respond(address,uint256)","49251b18":"FrozenFunds(address,address,string)","4925480e":"fireAdmin(address)","49260304":"nDEX()","4926248f":"setListener(address,address)","49264032":"Spendcoin()","49266f2f":"maxBidEth()","4927f408":"Vertex_Token(uint256,address,uint256)","49285b58":"getVotingToChangeKeys()","492abc67":"signerIsApproved(bytes32,bytes)","492b3bf7":"baseTokenCapPerAddress()","492b67ea":"Etherdoc()","492b8d45":"POWToken()","492bd276":"getIntervals()","492c0325":"calculateNewRate(uint256,uint256)","492c70fb":"swipeToken()","492c981b":"entryInformation(address,bytes32)","492cc769":"buy(string)","492d06cf":"unFreeze(uint8)","492dda05":"reTweetReward()","492e333f":"allocate5ProjectToken()","492e672e":"DCETToken()","492eec25":"bountyOfflineTokens()","492f190d":"availableCommission()","492f8724":"subscriptionStatus(uint256)","492fb343":"feeBeneficiary()","492fea53":"_createPet(uint256,uint256,address,uint256,uint256,uint256,uint256)","4931b3b4":"setData_30(string)","4932a80b":"unownedPlanet(uint256)","4932ce32":"changeGame(address,uint256)","4932f35e":"NomToken()","49330cb8":"getVote(uint256,uint256)","493322c0":"calculateRewardInternal(address,address,uint256)","49336245":"getEntry(bytes)","49337227":"testCanCloneAfterTransfer()","49339f0f":"Delegate(address)","4934453a":"TPIToken()","4935b3b6":"PDTC()","4935e740":"withdrawMyFunds()","49361cfe":"lastInvestmentTime()","493770cc":"setTransferStatus(bool)","4938649a":"stopEverything()","49386f26":"getlistedItems()","493953de":"addOwnToken()","49399729":"minimumBidAmount()","4939bfde":"requestedBy()","4939ce85":"CLASS_BEAST()","493a64e4":"SetParticipantRole(address,address,uint8)","493a7209":"stopBuy()","493a8d0c":"tokenActive()","493b284e":"exchangeNominsForHavvens(uint256)","493bccc8":"awardMissedBlockBonus(address,bytes32)","493ca31a":"EPAYCLUB()","493caeea":"removeMemberWithAddress(address)","493dbd02":"forceEndGame(address)","493f8d30":"read_demurrage_config_underlying()","493fcf1c":"taxRateNumerator()","49403183":"isPassed(uint256)","49404d25":"lastBlock_v13()","494054f4":"createNota(string,string)","49407a44":"claimEther(uint256)","4940c807":"sumElements(uint8[])","49416e45":"RCD()","4941d059":"editRestrictedAddress(address,bool)","4941d296":"periodITO_startTime()","49420759":"changeWithdrawable(uint256)","494278e3":"getgamecardaddress(uint256)","4942a71f":"getFromBank(uint256)","49432923":"participationHistory(address)","49433942":"PointerChanged(uint8)","49435c0d":"whitelistSupplier()","49437210":"getUpdatable(bytes32)","49440b91":"lockMntpTransfers(bool)","49441fc3":"MIN_ETHER_CONTR()","4945a575":"childApproved(address,uint256)","494630cd":"PullRequestAlreadyClaimed(uint256,uint256,bool)","49463b8e":"SeeleToken()","49465a50":"changeTakerDeadline(uint256)","49465d33":"lastPriceFeed()","4946c574":"getTransformMineInDay(address,uint256,uint256)","4946e206":"rescueCat(bytes32)","4947c8d0":"setFinishTime(uint256)","49480bc1":"releasePrivilege()","49484450":"ProofOfNoSnipers()","4948c2db":"stage4_price()","4948d91d":"SicBo(address)","4948e51a":"freezeToken(address,uint256)","49499e14":"setCompte_15(string)","4949d9fa":"bankrolledBy(address)","494ac14c":"LOTTERY()","494b46f9":"_changeAdmin(address,address)","494b5e0f":"setUserFactoryContract(address)","494b90e8":"teamPoolAddress()","494bf608":"distributeEther()","494c2a0f":"STQCrowdsale(address[],address,address)","494cf333":"getAddressUIntMapping(address)","494cfc6c":"getTokens(uint256,uint256)","494d93cc":"result_block()","494e49a4":"createAccountWithBalance(string,uint16)","494e4bc3":"fundtransfer(address,uint256)","494fb622":"SetData(uint256,string,string,string,string)","494fee7d":"estimateDistribution(address)","4950b392":"exerciseCall(uint256,uint256,uint256)","49517b41":"addSolution(uint256,string,string,string,string,string)","4951a18f":"crowdsaleCap()","495289be":"setIssuer(address,bool)","4952d2dd":"logPromiseUnfulfillable(uint256,address,uint256)","4953b57d":"isAdminOwnersValid()","49550d66":"tryTakeBack(uint256,uint256)","4955a79e":"transferOwnershipOperation()","4955f280":"createContractPerson(string)","4956cf1c":"migrating()","4956eaf0":"deploy(address,uint256)","49570293":"_addPurchasedTo(address,uint256)","49573edd":"tgeSettingsChange(uint256,uint256)","495816b4":"BOUNTY_TOKENS_AMOUNT()","49582509":"ICO_ON()","49582a20":"initializeSupply(uint256,uint256,uint256)","4958abb7":"switchFeePolicy(bool)","4958ace2":"restartSale(address)","49593f53":"submit(string,uint64,uint32,uint32,bytes32)","49596a65":"initProject(string,string,string)","495b3bcc":"LSEscrowContract()","495bbcae":"testNeededBalanceForContractCreation()","495bf26b":"lengthOf(string)","495c167f":"sumPayments()","495c5891":"getTotalAuthorizedForPayment()","495c9588":"minEligibility()","495ccca3":"WEEFundWallet()","495d32cb":"par()","495d7b26":"processScore(bytes32,string)","495df195":"CollectEarning()","495e1b3d":"etherEscrowAddress()","495f9bae":"getProposalVoterVotesCount(uint256,address)","495fe25b":"transferTo(address,uint256,bytes)","49602f5c":"OpusToken()","49606455":"take(bytes32,uint128)","49606d51":"Nihilum()","4960ae42":"numberOfVerifiers()","4960d2bc":"getLandTaxRate(uint256)","496128ec":"prosperaToken()","49614e91":"isRegisteredAddress(address,address)","4961b40c":"getReleaseValidator()","4962aa66":"discountedRates(uint256)","4962ab01":"removeMembers(address,bytes32,address[])","4962ad08":"approveAlgo()","4962b964":"getPuppetCount()","49630dda":"removeQuestion(address)","4963513e":"Reserved(bytes32,address)","49649fbf":"withdrawAllFunds()","4965fc89":"getForfeited(address)","49661fcf":"stage2Tokens()","49671d28":"setAmountSoldPerPeriod(uint256)","496a698d":"currentAuction()","496bd844":"round_up_division(int256,int256)","496be2cf":"atxControllerAddr()","496c4fad":"setPriceAgent(address)","496c5ad8":"throwsWhenGettingTokensWithStoppedSale()","496e41d2":"quotaUsed(address)","496fbeb3":"transportationFeeMultiplier()","496fc976":"setC4FContractProvider(address,address)","496fd2c5":"ICOStartToken(uint256)","4970fb36":"armagedeon(address[])","4971129d":"CatTransfer(address,address,uint256)","49713811":"winnersCount()","49714815":"ownerKillContract()","49716f5a":"originalTotalWeight()","4973219d":"outputi(uint256)","497347b2":"_storeContent(address,string,uint256,bytes32,address)","4973dbf6":"RATE_ETH_CUE()","4973dd25":"unBlockExternalTransfer()","49741098":"admin_set_min_pay(uint256)","497484f6":"applyBonus(uint256,uint8)","4974af1f":"testPublic(uint256[20])","4974bc27":"download()","4974da81":"addWord(string)","49752baf":"chronoBankPlatform()","49755b9e":"issueSynths(bytes4,uint256)","4975d202":"balanceOfOwner()","4975e893":"getProposalCreatedAt(bytes32,bytes32)","49776581":"getDocumentUpdatedVersionId(uint256)","497777d5":"collect(bytes32)","4977d6a4":"DreamToken()","49786571":"Economeme()","4978ddcc":"transferAPIOwnership(address)","4979440a":"getHighestBid()","4979c012":"ClosingTimeForCloning()","4979d6ec":"setUserManagerContract(address)","497a7b48":"taskRewardVote(bytes32,uint256)","497aed49":"PRIMARY_START_PRICE()","497b383e":"buyReferTokens(address,uint8)","497b8018":"getBallotOptNumber()","497cc504":"claimE()","497cd327":"TMONEY272708()","497cd426":"updateRewardDistributor(address)","497d709d":"icoNumberBalanceOf(address,uint256)","497dbce9":"_assertAmount(uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint8,uint256)","497dd0cb":"migrateContributors(address[])","497f3132":"getLastRegistration(string,int256)","497fb5b9":"tokensWithdrawn()","498022ea":"evalTransitionState()","49813e26":"MenovaToken()","4981b3ca":"performSell(address[8],uint256[6],uint256,uint256,uint8,bytes32,bytes32)","49843982":"Coin(uint256)","4985acee":"getTransferFromToValue()","4985b325":"addSurplus()","49866ec0":"finishTokensSale(uint256)","4988ef98":"LOCK_TOKENS_DURATION()","4989ae8e":"RESERVED_TOKENS_FOUNDERS()","4989b0b6":"setCustomBuyerLimit(address,address,uint256)","498a37f0":"setSmallInvestor(address,uint256,uint256)","498a3944":"setNameWriterId(bytes32,bytes32)","498a4c2d":"startBlockNumber()","498a690f":"issuingRecordAdd(uint256,bytes32,uint256,uint256,uint256,string,uint256)","498a6de7":"setRevenueContract(address)","498b7718":"J8T_DECIMALS_FACTOR()","498be109":"FAPFounderFund()","498c07f3":"startCrowdsale1(address)","498cb7cb":"setDelegadoDeEscuelaVerify(bytes32,uint256,uint256)","498cc70d":"getResult(string)","498d2ae0":"getMintRequestAddressMap(uint256,int256,string)","498e78b1":"unregisterManager(address,address)","498e87a9":"setPI_edit_21(string)","498eecb2":"getLimitedReportersDisputeBondToken()","498f27ae":"countCampaigns(address)","498f6fbe":"NewSubscription(address,uint256,uint256)","498fd833":"priceDT()","498ff49a":"repayImmediately(uint256)","49911610":"getDay(uint16)","49912f88":"appeal(uint256,bytes)","49917511":"buyCoinsCrowdSale(address,uint256,address)","49926028":"typeHash()","49937e25":"buyPrimordialToken()","49942483":"ICO_PHASE2_BONUS_PERCENTAGE()","49942ccb":"scheduleCall(bytes,bytes,uint256,uint256)","49943a13":"PARTICIPATION_FEE()","49955431":"cupi()","4995b458":"week()","4995e9fb":"FOUNDER_ADDRESS2()","4996e899":"getGuaranteedContributorsLenght()","49970e16":"forwardPlay(address,address,bytes,bytes32,bytes)","499831f2":"pauseGame()","4998ce40":"setbonusTokens(uint256)","49996698":"trustedAddressSize()","499a1bcd":"setAQL(address,uint256)","499a8fea":"setClue3(string)","499ac979":"redistributeTokensForAddresses(uint256,address[])","499af77c":"current_spin_number()","499caf09":"secondTime()","499cd176":"endAttack(address,address,bool,uint256,uint256,uint256,uint256)","499cf7ce":"BOXEX()","499d1081":"mint(address,uint256,uint128)","499dae56":"getMultiRequestRequestor(uint256)","499e2c81":"getOrCreateWaitingBoard(uint256)","499e6c10":"isTheContract()","499fa529":"ALLOC_SALE()","499fd141":"getDrupeCoin()","499ff236":"maxAnonymousContribution()","49a0a3b3":"resetTokens(address[],uint256[])","49a0c976":"unlockEmission()","49a0e681":"rst()","49a24a7d":"DolyToken4()","49a3d2bb":"updateAllowed(address,address,uint256)","49a51839":"EGGS_TO_HATCH_1LOBSTER()","49a634f0":"LTS()","49a67b55":"commitStart(bytes32)","49a69078":"lastBlock_f5()","49a6a4de":"showAssetInfo(bytes32)","49a742eb":"validRate(uint256)","49a76444":"Hygen()","49a7a26d":"solver()","49a86c9e":"addToAccesslist(address)","49a8d337":"lockedTeamAllocationTokens()","49a92910":"setPlayer(address,uint64,uint64,uint64,uint64,uint64,uint64)","49a9d5ad":"CGENToken(uint256)","49aa480a":"VixCoin()","49aa4ee2":"removeVote()","49aafad7":"allowedToBurn(uint256)","49ab1d86":"setGeneLab(address)","49abee50":"phaseStart()","49abf2d6":"staticoins(uint256)","49acce72":"AnkitVictoContractToken()","49adf14f":"Claim_TRAC_1850()","49adf314":"_updateDividends(address)","49ae1f17":"KWHToken(address,address,address)","49ae9b31":"canReadName(address,bytes32)","49af0af1":"baseEthCap()","49af63a9":"setWaitTime(uint8)","49afc6e5":"tokenBalance(uint256)","49afcc0e":"dataSourceGetSemiResult(uint256)","49b11f24":"dailyAuctionStartTime()","49b1b2d9":"newBonus_and_newPeriod()","49b2f5ff":"technicalCommunitySupply()","49b3b29f":"costs(uint256)","49b40402":"exchangeThreshold()","49b48e66":"setCheckOwner(bool)","49b54685":"updateDps(uint256)","49b5b541":"compute(address,uint256)","49b6313c":"getCurrentSellOffer(uint32)","49b71e47":"distributeWinnerPool(string,uint256)","49b76501":"getStorageRate()","49b7a9c2":"dividendManagerAddress()","49b7ef6c":"lockedSell()","49b85a16":"kycAddress()","49b88203":"declareProjectDefault()","49b88919":"setImageDescriptor(uint256,uint16)","49b8f5d9":"tokensDuringPhaseOne()","49b90557":"isAuditor(address)","49b9734d":"changeMainEndTime(uint256)","49b9a2d0":"address_to_tickets(address)","49b9a7af":"lastPriceUpdateTime()","49ba5a48":"checkSavedEthBalance(address)","49babd2a":"initiate(address,uint256,bytes32,address)","49bac542":"E4RowEscrowU()","49bedf42":"setLookup(address)","49beee4f":"adjust_Transfer_nodata(bool)","49bf2caf":"disputeTransaction(uint256)","49bf66d3":"addRegistryIntoNameIndex(address)","49bfb061":"txFeeDenominator()","49bff0d7":"setPI_edit_29(string)","49c03373":"changeGTOAddress(address)","49c04f27":"WorldBitEvent(address,bytes2,bytes2,uint256,uint256,string,string,string,string)","49c15bd9":"Purchase()","49c16cc3":"CMCLToken(uint256,string,string)","49c16e15":"toUint()","49c1ad0f":"gotoNextState()","49c1d54d":"trusteeAddress()","49c2a1a6":"createProposal(string)","49c3567c":"ArbaCoin(uint256,string,string)","49c37f8c":"main(address,address)","49c3a91e":"getSponsorshipsTotal(address,uint256)","49c462d7":"createInvite(bytes)","49c53b2d":"doMidnightRun()","49c6353c":"getInvId()","49c71fa8":"unholdTeamTokens()","49c7634f":"WorldwideGiftCode()","49c83e86":"unlist(address,uint256)","49c91267":"getSeedByWinner(address)","49c9d17a":"updateReceivers(address[])","49c9dcf5":"awardRafflePrize(address,uint256)","49ca30ab":"receiveIndex(uint256,uint256,uint256,uint256,bool)","49ca7656":"changeOwnerOfMonethaUserClaimStorage(address)","49ca8cc9":"getEventId(address,bytes32)","49cacb12":"dropOwner(address)","49cbe338":"tryRead(uint64)","49cc2eb1":"Fairsale(uint256,uint256)","49cc635d":"receivePlayerInfo(uint256,address,bytes32,uint256)","49cc8513":"_geneOfCrab(uint256)","49cc954b":"twoYearsPassed()","49cd4554":"afterIco(uint256)","49ce0a11":"hexToken()","49ce5804":"setSectorOwnerCut(uint256)","49cf211e":"storenumber()","49cf2eae":"certifierAddress()","49cf5f1b":"DSProxy(address)","49d0cd85":"functionSignatures()","49d10b64":"updateRegistry()","49d246e5":"getBetBasic()","49d24ae8":"withdrawAdmin(uint40)","49d2ca11":"Election(address,address,address,address,address)","49d3060f":"selectWinner50()","49d45693":"changeminprivatesale(uint256)","49d463e6":"sendBoard(bytes10,uint256,uint8,bytes32,bytes32)","49d4a344":"right99(uint256)","49d55d9d":"receiveTransfer(uint256)","49d596fe":"FSM()","49d689f4":"setJackpotAddress(address,address)","49d7e0b3":"mutiTransferFrom(address,address[],uint256[])","49d800a1":"ReleaseableToken(uint256,uint256,uint256)","49d834cd":"TSTEST()","49d8ef13":"ETHERFUNDME_ONLINE_FEE()","49d94871":"bonusRates(address)","49d94c83":"CappedCrowdsale(uint256)","49da847b":"iPay()","49daca7a":"tradeAddress()","49dbdf30":"initializeRefund()","49dc2b83":"miningFinished()","49dc5376":"getTokensBack(uint256)","49dc8fab":"Menu06(address,address,uint256)","49dcbc5e":"sendEth(address,uint256)","49dcd756":"getCurrentEthCapPerAddress()","49dd0fe3":"minechain()","49dd1262":"updatePrices()","49dd2880":"Gold(address,uint256)","49de0485":"addContributorManually(address,uint256,uint256)","49de3995":"EthlanceMessage(address)","49df7208":"addMember(address,bytes32)","49df728c":"withdrawTokens(address)","49e09da6":"genesisTransfer(address,uint256)","49e0cf2a":"createComunity(bytes32,bytes32)","49e0dada":"level_4_percent()","49e123c8":"monsterHealth()","49e1432c":"donateToPot()","49e1c2b7":"ATMToken()","49e284d1":"ZoologicalGarden()","49e347ae":"getContents(uint256[],uint256)","49e4347b":"completeICO()","49e44f44":"ManagerProxy(address,bytes32)","49e4b3e5":"setPermissionManager(address)","49e51970":"CostilNetworkToken()","49e588df":"refundSubmission(address,uint256)","49e627d2":"getPreIcoTokenHoldersAddressesCount()","49e65440":"setSymbol(bytes32)","49e67544":"TeamFund()","49e6c454":"getMyEntityOwner(uint256)","49e77c8b":"hasEnoughTokensToPurchase(address,uint8)","49e9449a":"presalesCap()","49e9cee9":"GetMaxPrestigeLevel()","49ea33df":"icoEndDatetime()","49ead9b4":"createAsset(string,uint256,uint256)","49eb6d6f":"NumberAddresses()","49ec1ff0":"setSoftwareTokensWallet(address)","49ec7c3f":"giveBirth(uint256,uint256,uint256,bytes)","49edfb94":"FEE_OWNER()","49edfed9":"getEtherForStakes(uint256)","49ee161b":"getLockPosition1(address)","49ee2ae1":"getAllJingles(address)","49ee39ba":"nullBonusMessage()","49ee6c50":"getNewItemId(bytes32)","49ee72fc":"addCountryCities(uint256,uint256[],uint256,uint256)","49eee1a4":"setRoundRate(uint256,uint256,uint256)","49ef026f":"raisedFunding()","49efdbbf":"purchaseShow(uint256)","49f00964":"founders_2()","49f02baf":"YondToken()","49f0726d":"Centhereum()","49f0c90d":"adminSetAccountAdministrator(address)","49f12aa7":"hashState(address,uint256,uint256)","49f16ad1":"setTransferEnabled()","49f194a1":"setIco(address)","49f1fa67":"GetLiasonName(uint256,uint256,uint256)","49f202ff":"getTokenIdByIndex(uint256)","49f209af":"testThrow_3_invalidOwner_accessRestrictionThrow()","49f22b4a":"biddingComponent()","49f27c25":"ProdEToken()","49f298c6":"wallock()","49f2a049":"registerInternal(string)","49f30178":"nextFinalTimeout()","49f307a6":"setNewPriceToItem(string,uint256,uint256)","49f41a42":"updateAgent(address)","49f4cc17":"transferAssets(address,address,uint256)","49f4f5da":"XLifeCoin()","49f6444e":"buyLuckyStone()","49f65ce4":"handleDividends()","49f73d3d":"calculateCountryCut(uint256)","49f7825b":"lockAddressByKYC(address)","49f9231d":"LightCoinToken()","49f97939":"notEqual(string,string,string)","49f9b0f7":"calculateSaleReturn(uint256,uint256,uint32,uint256)","49f9c0e4":"transferEth(uint256,address)","49f9e95e":"withdraw_arbitrary_token(address,uint256)","49f9f4d0":"burnOwnerTokens(uint256)","49fa84ef":"hon1ninja()","49fa991f":"removeAttestation(address)","49fb2dc5":"add_to_association(uint256,uint256,uint256)","49fcea4a":"Lyfecoin()","49fcfce7":"saleInited()","49fd5791":"_removeLastOwnerHoldingsFromToken(address,uint256,uint256)","49fd5f64":"getAllAssembly(address)","49fdaea6":"isBrickOwner(uint256,address,address)","49fe5261":"CROSAIR_PRICE_INCREMENT()","49ffeb8f":"recursiveCalculation()","4a0023cd":"findAuraComposite(uint64,uint64)","4a00a522":"homebase(int256,int256)","4a00dc38":"getAreaPrice(uint8,uint8,uint8,uint8)","4a013296":"canEscapeTo(uint32,uint32)","4a024928":"D00KIE()","4a03707c":"draw(address,uint256)","4a03e7e3":"TrinityContract(address,address,uint256)","4a042f0d":"joinBattle(uint256)","4a046d82":"usdPerEther()","4a0473fe":"votings_(address)","4a0483c5":"trustedAddressLUT(uint256)","4a0767cc":"setIsPreventedAddr(address,bool,bool)","4a084736":"updateTokenToEthOrderWHint(uint32,uint128,uint128,uint32,int256)","4a09d3cf":"withdrawAdvisersTokens(address,uint256)","4a0a7f2d":"doDistributionRange(uint256,address[],uint256[])","4a0af245":"startPreSale(address,uint256,uint256,uint256)","4a0b132a":"TIME_TO_MAKE_1_SHITCLONE()","4a0ba49d":"pay(address,address,address,uint256)","4a0bb6a4":"WeQuest()","4a0cd926":"addBankerAddress(address)","4a0d89ba":"getSwap(uint256)","4a0d8b53":"setHasMaxPurchaseLimit(bool)","4a0f0bfe":"ServiceRegistry(address)","4a0f3134":"FundTransfered(address,uint256)","4a0f5974":"left27(uint256)","4a122266":"getForwardPurchaseFeesTo()","4a12389a":"MyToken(string,string,uint8,address)","4a123e1d":"setLev2(uint256)","4a1281c6":"numTokensIssued()","4a1311f9":"openingManualyMining()","4a14e3b2":"SentAmountToOwner(uint256,address)","4a150e2c":"getDonationsCount(address)","4a15ebce":"addCbAddress(address,bytes1,address)","4a16673b":"shouldSelectWinner()","4a168859":"getAvaIcoAmount()","4a169e4b":"setCoinInfo(address)","4a173383":"determineWinner(address,uint256,bytes32)","4a1753a6":"setCurrentGame(address)","4a176017":"finalizeAdd(uint256,address)","4a176ba5":"getaddr(uint256)","4a17bbde":"getEventId()","4a180cb3":"removeSpecialFeeTake(uint256)","4a184f51":"startCrowdsale(address,address)","4a186d69":"buyTokenFor(address)","4a187785":"aaandItBurnsBurnsBurns(address,uint256)","4a18c25e":"EUEBToken()","4a197057":"GameEnded(uint256,address,uint256,uint256,uint256,uint8,uint8)","4a1993e4":"firstDepositDate()","4a1a27a8":"qtAccount()","4a1a342b":"getOrderMoneyEscrowed(bytes32)","4a1a3ded":"createNewTask(uint256,uint256)","4a1a650d":"RecordNum()","4a1a89f1":"PHXTKNADDR()","4a1aa767":"claim_victory(uint256,uint8,uint8,uint8)","4a1ad538":"checkTransferMultipleDelegated(address,address[],uint256[],uint256,uint256,bytes)","4a1b504f":"distributeBonus(address[])","4a1b98b2":"exchangeUnderwrite(address,uint256)","4a1ba4ba":"Multibot()","4a1c13cd":"setIcoStartDate(uint256)","4a1c6549":"ETHBITA()","4a1d08af":"drawRandomItemWinner()","4a1df335":"addressCEO()","4a1e004c":"blockedTimeForInvestedTokens()","4a1f05f0":"setSaleImg(uint256,bool,address,uint256)","4a1f0bf6":"inheritToNextGeneration(address)","4a1f11a7":"MT()","4a1fb241":"fttIssued()","4a1fe393":"withdrawEther(uint32)","4a208c38":"setIV_R2(uint256)","4a21f8f7":"joinToPool(uint256,uint256)","4a222b74":"ecoLock23()","4a22c7fb":"tokens_rewards_allocated()","4a23418a":"foundersTokensWallet()","4a2388ff":"setAllowedForMinting(address,address)","4a23dc52":"FileStore()","4a2479c0":"initialOwnersShares()","4a24edd6":"startSale(uint256,uint256,uint256,uint256)","4a24f6d9":"getVendorApplicationScoringTrackCount(string)","4a254431":"MappingProposalIssued(address,address,uint256)","4a25780b":"RedRibbonCoin()","4a25b2fd":"deductCoin(address,uint256)","4a26410b":"SetGenesisBuyPrice(uint256)","4a268f52":"ExchBtcToken()","4a26920b":"sendTokens(address,address,address[],uint256[])","4a2697fc":"balanceOfIssuer()","4a272bff":"GetHoga(address,uint32,bool)","4a275a1e":"Blockdrop(address)","4a280a55":"transferFrom(address,address,address,uint256,bytes)","4a2929ee":"betLockTime()","4a2951d2":"AsianCapitalChain(uint256,string,uint8,string)","4a2a197e":"addBonus(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","4a2a4ebc":"countries(uint8)","4a2b0c38":"DividendProfit()","4a2b22f9":"GameBase()","4a2c3204":"getUserFLCEarned(address,address)","4a2cd48f":"getPreviousDate(bytes10)","4a2d5b6b":"getReleaseRatios(address)","4a2db4d8":"GetWinCards()","4a2dfbb4":"artWorkChangeRequest(uint256,string,uint8,bytes32,bytes32)","4a2e7752":"hashBid(address,uint256,address,address,address,uint256,uint256)","4a2ee75f":"addArticle(bytes,bool)","4a2f2333":"BitcoinMobile()","4a2f37a6":"updateItemTraits(uint256,uint256)","4a2fb1e4":"_mentors()","4a2fed3d":"test_SixtyPercentRules()","4a2ff078":"getRateFor(string)","4a303d30":"optAddressIntoHolding(address,uint256)","4a30f976":"censorship(uint256,bool,bool)","4a31259f":"totalNtsSoldWithBonus()","4a31dee2":"setTokenIdByIndex(uint256,uint256)","4a3270d7":"bytesStorage(bytes32)","4a330319":"tokensaleEndTime()","4a3310b8":"hasConfirmed(bytes32,address,address)","4a334c1c":"closePlacingPhase()","4a348da9":"getProductCount()","4a35035a":"dropNumber()","4a3573f1":"assignReservedTokens(address,uint8,uint256)","4a35d3ba":"SetBuildingSale(uint256,uint256,uint256,uint256)","4a35db7c":"restartValidation()","4a363fbc":"testNetworkDeployment()","4a366c46":"Th0m4z()","4a367140":"FoundersContract(address)","4a367827":"mintingStopDate()","4a367c68":"PrivateSaleStartTime()","4a367d73":"UpgradeMaster()","4a36870a":"firstRewardPeriodPercent()","4a36df25":"setMigrateContract(address)","4a375bc4":"FlagUint(uint256)","4a376c97":"OpenToThePublic()","4a37b5f7":"MyWill(address,string,string,string,address)","4a382c36":"freezeAccount(address,bool,uint256)","4a387bef":"removeLock(address)","4a393149":"onTransfer(address,address,uint256)","4a398c11":"SWIFTStandardToken(uint256,string,uint8,string)","4a39a5f4":"ALC_DECIMALSFACTOR()","4a3a835c":"withdrawAfterEnd()","4a3a87e2":"CreateProxyWithControllerAndRecoveryKey(address,address,uint256,uint256)","4a3a92f6":"minusFreezingTime(uint256,uint64)","4a3b0eec":"authorizeOpen(uint256,bool,string)","4a3b68cc":"referrers(address)","4a3bd672":"time1()","4a3bf377":"totalVotesFor(string)","4a3c4375":"getAllConsentTemplates()","4a3cdf21":"m_ETHPriceLastUpdate()","4a3d239c":"weiWithdrawed()","4a3d3510":"updateVotesOnTransfer(address,address)","4a3d3c09":"castleMinBrick()","4a3d5ec9":"ProofImpl(address)","4a3d72a1":"balancesContract()","4a3db7e7":"_generate(uint256,address)","4a3e2b21":"unpaid(bytes12)","4a3e4f90":"scamFlags(address)","4a3e8078":"emissionAddressUpdate(address)","4a3f17e7":"hodlers(address)","4a40e85b":"setMAYExchangeRate(uint256)","4a411f5a":"EventLuckyNumberRequested(address,uint256,uint256,uint8,address)","4a418fb7":"numOfTransferableCompanysTokens()","4a41d1ac":"verify(address,bytes)","4a41d6f5":"_clearAllApproval()","4a41e045":"getUint8(int8)","4a420138":"scheduleHeartbeat()","4a4226a5":"TeamHeadsChoice(address)","4a42a397":"TakeSellOrder(bytes32,address,uint256,uint256,uint256,address,address)","4a42d99b":"donGameGiftLineTime()","4a443471":"_money()","4a44664b":"withdrawVPCxTokens(address)","4a44bdb8":"getBlock(uint256,uint256)","4a4507ff":"testInitialBalance()","4a45b60b":"unregister(address,address)","4a45beed":"Accept(bytes32,string)","4a45d2e6":"setParam(uint256)","4a4666c1":"addAuthorizer(address)","4a4753bc":"BonusesDistributed()","4a48314f":"hodlerTime3M()","4a49ac4c":"removeFromBlackList(address)","4a4a2569":"getAudCentWeiPrice()","4a4a26d7":"EnChangToken()","4a4a2a97":"performReentrancyAttack()","4a4a2b52":"unfreezeAdministrationContract()","4a4b4eb0":"WISDOMCOIN()","4a4b674a":"setPenalty(uint256)","4a4b7202":"PPBC_API()","4a4b7de6":"deedContract()","4a4baed7":"setTokenControlInfos()","4a4c1bcd":"LeviusDAO()","4a4c560d":"whitelistUser(address)","4a4c5e59":"proceedTokenDeals(uint256)","4a4c82c6":"_resetSpentToday()","4a4e3bd5":"emergencyUnpause()","4a4e5776":"stepDuration()","4a4e6f95":"addFeedOut(address,address,int256,uint256,uint256)","4a4e8884":"getUserAddress(bytes32)","4a4ede50":"transferSalesAgentPermissions(address)","4a4ef738":"addAddressToPrivateWhiteList(address,uint256)","4a4f76d5":"getInitializeEndTime()","4a4fbeec":"isLocked(address)","4a4fd24d":"addMileagePoint(address,uint256,int256)","4a5033eb":"Reverted()","4a504a94":"Confirmation(address,uint256)","4a50c3a7":"EtherToWei(uint256)","4a5163b5":"numDefinedGames()","4a51dcea":"TIER3_CAP()","4a522e4e":"winCosFromGame(uint256,uint256,string)","4a52a5f8":"TerraFirma()","4a52e506":"enableLostAndFound(address,uint256,address)","4a53c127":"setTargetDiscountValue7(uint256)","4a54315c":"registerUser(bytes32,string)","4a54fb0a":"updateProduct(bytes32,string,address,uint256,uint8,uint256)","4a55308c":"firstSellPrice()","4a562d81":"returnDeed(address)","4a574d18":"bonusMode()","4a5791e0":"UnFreezeProduct(uint256)","4a57c032":"IcoDiscountLevelsChanged(address,uint256,uint256)","4a57e1c9":"finalizeTransaction(uint256)","4a588d87":"CYB(uint256,string,string)","4a5891ac":"changeEternalStorageContractAddress(address)","4a58c409":"changeStartSale(uint256)","4a58cf22":"totalSupplyInWei()","4a58db19":"addDeposit()","4a5a3d76":"setETHPriceManually(uint256)","4a5a831b":"EthlanceConfig(address)","4a5baa1b":"VULCAN_POD_EXTRACTION_BASE()","4a5c2d6e":"Change(address,uint256,address,uint256,address)","4a5c8f1a":"getEarnEachBlock()","4a5db3b5":"authorizeAddress(address)","4a5dcb5b":"Candy(address,address)","4a5dcdc9":"RANGEEND_9()","4a5dddd2":"proxyPurchase(address)","4a5df250":"nextContributionCaps(uint256)","4a5e1cf3":"initLottery(uint16,uint256,uint8)","4a5e4fa8":"setExpReward(uint32)","4a5e70c0":"ObitanChainToken()","4a5ecc66":"Sale(address,address)","4a5fca4f":"offChainTokens()","4a5ff749":"teamAddr()","4a601994":"WesTechToken()","4a606c53":"_db()","4a60751f":"refundingEndtime()","4a61179b":"MANHATTANPROXY11THWEAVE()","4a617faa":"shaBid(bytes32,uint256,bytes32)","4a617fba":"gooDepositDivPercent()","4a61f347":"resetEditionLimits(uint256)","4a61fc1e":"getWinners(bytes32)","4a6213a1":"MAKERDAO_FEED_MULTIPLIER()","4a624310":"getAngelInfoByTile(uint16,uint8)","4a627e61":"someValue()","4a62cc73":"auditQueueExists()","4a62f5eb":"_isTokenActive()","4a63464d":"adminClaimAirdrop(address,uint256)","4a635d05":"testCampaignGoalReached()","4a63864b":"RATE_RATIO_SCALE()","4a63b3d3":"lockBlock()","4a63f8a4":"presellTimer()","4a6458ae":"Rescued(address,uint256,uint256)","4a64c23f":"removeCbAddress(address)","4a661152":"get_exchange_wei()","4a66ddff":"twin_contract()","4a67fa7d":"setLotteryFee(uint256)","4a681b1b":"EXPECTED()","4a683a65":"addBTCTransaction(uint256,bytes16,address)","4a68492c":"setTransferAgentStatus(address,bool)","4a6a225e":"proxyPayment(address,bytes4,bytes)","4a6aac33":"DATE_31_DEC_2020()","4a6b0b05":"NewArtwork(address,bytes32,uint256,string,string,uint256,address,bool,bool)","4a6b8cf6":"setPretgeAddress(address)","4a6b9473":"registerActionEvent(bytes32)","4a6bb4a5":"updateWallet(address,address)","4a6bfa2d":"salesActive()","4a6c121d":"uintToBytes32(uint256,uint256)","4a6cfca7":"getAccessory(uint256,uint256)","4a6d0292":"addSale(address)","4a6de5c3":"_getAvailableBalance()","4a6e2ffe":"calculateReferral(uint8)","4a6f2691":"setBoolF1(bool)","4a7004b9":"getTotalTokenDepositByAddress(address)","4a700545":"PrivateSaleAddress()","4a701fc3":"setownerInfo(address,bytes32,bytes32,bytes32)","4a7084bb":"setPublicOfferDate(uint256,uint256,uint256)","4a714378":"toggleVending(uint256,uint256)","4a714c24":"payers(address)","4a7160a2":"addSet(bytes32)","4a716adf":"transferVotes(uint256,address)","4a719a27":"getTargetRepMarketCapInAttoeth()","4a71a768":"setWeiCapPerAddress(uint256)","4a71d469":"collectRev()","4a720287":"setEarlyEndTime(uint256)","4a729fe1":"pay(address,bytes12)","4a733ded":"paybackContribution(uint256)","4a738bea":"withdrawWithFee(address,uint256,bytes32,address,uint256,bool)","4a74ca99":"disconnectOrderPrice(address,address,uint256,uint256)","4a751072":"rateBoundaries(uint256)","4a7510fc":"StealResources(uint256)","4a75c0ff":"StoreDocument(bytes32,string,string)","4a75e6c3":"servicePayment(address,uint256)","4a75e741":"add_owner(address)","4a765625":"AliParsafar()","4a76564e":"tokenReleased()","4a76869f":"commitOrder(string)","4a768eaa":"buytoken(address,uint256)","4a7759f8":"BALL()","4a776104":"canFinishPVP()","4a77f870":"migrateAll()","4a78a594":"getClaim(string,string,address,uint256)","4a78cdba":"jackPot()","4a7902d2":"changeRoot(address)","4a790540":"getPastWinnerPrizes()","4a793c0c":"cidTotalTokenSupply()","4a797494":"priceRound3()","4a7987a2":"setProvider(bytes32,address)","4a79d50c":"title()","4a7b1acc":"MapDemo()","4a7b26ec":"join_game(uint256)","4a7b7ec3":"mintMarketMakerCancel(address,address)","4a7b8f21":"addHarvestOperationEndorsement(string,bool,string,string)","4a7bb697":"AssignGGCPoolOwner(address)","4a7c7e46":"uintToAscii(uint256)","4a7cb0f5":"FoundationRequested(address,address,bytes32)","4a7d505c":"initBetType()","4a7d8bcc":"getCurrentTokenPricepreICO(uint256)","4a7d9f0f":"getSettlementPeriodEnd()","4a7dd523":"generate(uint256)","4a7de068":"finalizeSetDelegatedFrom()","4a7e00de":"rejectCompanyAllocation(address)","4a7e049e":"getFullCompany(address,uint256)","4a7e130e":"remainTime()","4a7ffcbc":"daoContract()","4a800b98":"cancelChampSale(uint256)","4a803387":"insert(uint256,uint256,uint256)","4a8075ac":"SaleAuction(address)","4a80dcab":"getProjectMilestonesCount(bytes32)","4a80f2ba":"registerKey(string)","4a812023":"logUniverseForked()","4a81db9a":"moneybackaddr()","4a81dc0f":"forceUpdatePrizes(uint256[])","4a82534b":"create(address,address,address,uint256,uint8,uint8,uint256)","4a825c68":"checkRoundEnd()","4a826823":"setCastle(uint64,uint64,uint64,uint64,uint64,uint64)","4a82804e":"setNewMessage(string)","4a8302a2":"SynixToken(uint256,string,uint8,string)","4a8305b4":"newCoinOwner(address)","4a838caf":"ethfortnite()","4a83cfa9":"burnMedal(uint256)","4a84fa81":"checkRokSold()","4a85223b":"addUser(address,string,string,int256,string)","4a85280e":"isAuthorizedAddress(address)","4a85512f":"awardInvation(bytes32)","4a85d0d5":"HeliumNetwork()","4a85dbcd":"setVal(string,uint256)","4a8646c3":"HomeLoansToken(uint256,string,uint256,string)","4a8671f1":"newWallet()","4a867488":"setVestingPercent(uint256)","4a87b419":"cancelApproveFee()","4a87e08a":"BUY_CITY_FEE()","4a881ac6":"addAddressDescription(string,address)","4a88eb89":"altDeposits()","4a88f9c7":"exFees(uint256)","4a891e7f":"FinalizeMove(address,string,string)","4a896384":"ask()","4a8967a6":"_today()","4a8a6eac":"CarRegistered(uint256)","4a8a83db":"calculateVestedTokensTime(uint256,uint256,uint256,uint256,uint256)","4a8b2b27":"testOne()","4a8b5389":"allocateBountyAndEcosystemTokens()","4a8beaf4":"decline(string)","4a8c1fb4":"isActivated()","4a8c2d64":"TopsXToken(uint256,string,uint8,string)","4a8c3129":"MultiOwners()","4a8cbae1":"charityPercent()","4a8e4d78":"getDuesIn(uint256)","4a8e5651":"resultAccept()","4a8ef4bd":"setOrderBookAcount(address)","4a8ef851":"pushTicketSetToAccount(uint256,uint256)","4a909d5f":"transferWithLockup(address,uint256,uint256)","4a910046":"getLastHash()","4a914e8c":"calculateTotalExpenseWithdrawableAmount()","4a915ea2":"votedHarvest()","4a91e536":"getWinnerDetails(uint256)","4a91ec80":"prospectors_dev_allocation()","4a91ee2a":"allowByPassword(bytes8,bytes)","4a91f195":"totalBought()","4a923199":"maximumTNB()","4a92fa06":"createPromoRide(address,string,bytes7,uint256)","4a92fb3a":"proxyTransfer(address,address,uint256)","4a943eb3":"numsuccesses()","4a945f8d":"setAddresses(address,address,address,address)","4a947bdb":"putMatingRequest(uint256,uint256)","4a950db6":"tradetxToken()","4a950f00":"TurkeyBurgerToken(uint256)","4a955659":"_getNewLotteryCreatedAt()","4a96712e":"confirm(bytes32,address,uint256,uint8,bytes32,bytes32)","4a96d129":"OfferTime()","4a975d6b":"allocateRestrictedTokenTo(bytes32,bytes32,bytes32,uint256)","4a980b49":"IRideToken()","4a98146a":"VILLAGE_START_PRICE()","4a994d22":"_getReleaseDate(uint256)","4a994eef":"setDelegate(address,bool)","4a9952c7":"setMintTokenOwner(int256,address,address)","4a9a6f15":"getFromFaucet(string)","4a9b3f95":"personUpdateName(uint256,string)","4a9b5c2e":"CREATOR_TOKEN_END()","4a9bdb65":"byuoutCount()","4a9cdfad":"setPlayerLAff(uint256,uint256)","4a9d367b":"RecipientChanged(address,address)","4a9d9172":"test_testableStandardCampaignAbsolvementAfterPayout()","4a9f0110":"setSellDailyLimit(uint256,bytes2,uint256)","4a9f6d4a":"setMaxPreCrowdAllocationPerInvestor(uint256)","4a9fefc7":"getReferrer(address)","4aa16737":"enter(uint8)","4aa1acb3":"withdrawEth(uint256,bytes)","4aa1d21b":"transferDryRun(address,address,uint256,uint256)","4aa1dde4":"isDisclosureFullySigned(uint256)","4aa2f0f5":"HKD_Omnidollar()","4aa3fcd3":"_getSkillConfigs()","4aa41e53":"minFinneyPerHedgeTransfer()","4aa47a50":"isIntermediateVault()","4aa4ba9b":"storeBatch(string)","4aa5a05d":"maxP1Cap()","4aa5b398":"voteCurrentResult()","4aa669d8":"Buy_Wall_level_in_wei()","4aa66b28":"getBonus(uint256)","4aa678c3":"getMyUnlockValue()","4aa6c09a":"setTargetDiscountValue3(uint256)","4aa735c0":"BST()","4aa74c27":"_emitFuture(bytes32,uint256,uint256,uint256)","4aa77c71":"Visualrocktoken()","4aa83079":"setSaleContractFinalised(address)","4aa880c1":"SetFactoryParams(bool,bool,uint256)","4aa8e57e":"buyBox1()","4aa8e773":"Cancel()","4aab421d":"tgrAmountCollected()","4aab8c14":"setPonzi(uint8,uint256)","4aabcec7":"SimpleWallet()","4aac390a":"hasLanguage(address,address,uint256)","4aac75a7":"setMainSaleDates(uint256,uint256)","4aaca86d":"saleStage()","4aacd437":"freezeAccountPartialy(address,uint256)","4aaceed3":"icoBonus2()","4aada45f":"KittensDroped(uint256,uint256)","4aae385f":"preSaleFirstStartDate()","4aaf4a12":"getOwner(string)","4aaf6b86":"contract_state()","4ab0c0ee":"testConcatMemory32Bytes()","4ab0fc08":"setDefaultURIEnd(string)","4ab1c98f":"requestControllerContractMigration(address)","4ab24cf3":"pornToken()","4ab273f0":"SellEggs()","4ab320b4":"viewSettingsChange(uint256)","4ab358c7":"recoverFunds(uint256)","4ab3bbdc":"_brokerFeeDistribute(uint256,uint256,uint256,uint256)","4ab3bc23":"getSelfCardDatas()","4ab3d487":"newEntry(uint256)","4ab40ac6":"allOpenTradesAmounts()","4ab5439b":"TEAM_POOL_ADDR()","4ab54530":"inPreSale1Period()","4ab5cc82":"latestValue()","4ab6d337":"getContributorsLength()","4ab74a1e":"tok()","4ab7508a":"multiWallet()","4ab788cb":"prebridge()","4ab798f1":"toggleTransfer()","4ab7cbfe":"getMinerHalvingHashRateOf(address)","4ab89400":"cancelRefund(address)","4ab9792d":"setTokenFrom(address)","4aba5f34":"getCandidatesList()","4aba76a3":"ESlotsToken()","4aba7f96":"setMixGenAddress(address,address)","4abad407":"startCrowdfund(uint256)","4abb525a":"moonIncContract()","4abb9d39":"depletable()","4abc8652":"inPrivateSalePeriod()","4abd89bd":"MDICOStage2(address,address,uint256,uint256,uint256,uint256)","4abd8e01":"putStcWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","4abd8f65":"updateEnabled()","4abdf2e0":"setWithdrawLimit(uint256)","4abe1a62":"settleEtherPolicy(address[],uint256[],uint256[],uint256[])","4abe34f2":"TecToken(string,string,uint8,uint256)","4abefa36":"getEmployees()","4abfacfd":"createTeam(string,string,uint32,uint32,uint256)","4abfbbe3":"getBlockInfo(uint8,uint8)","4ac0d66e":"newGreeting(string)","4ac1ad78":"getWeekday(uint256)","4ac1b5ff":"GoldmintUnsold(address,address)","4ac25224":"isChannelOpen()","4ac2d103":"miningReward()","4ac36201":"Yachtco()","4ac365c2":"DividendTransfered(uint256,address,uint256,uint256,uint256)","4ac38f13":"BlupassToken()","4ac39f37":"unsafeIsSigned(uint16)","4ac429f2":"ConstantinopleCheckFunction()","4ac54245":"_fulfill(bytes32)","4ac5aae5":"getTotalBonus()","4ac5dea9":"getRoundPointer(uint256,uint256)","4ac6b2be":"getCheckRecordCreator(bytes)","4ac6d5f4":"frostTokens()","4ac79795":"removeLogic(address)","4ac7becf":"SimpleSign()","4ac84218":"RequiredFeeNotMet(uint256,uint256)","4ac84242":"CWT(uint256,string,string)","4ac87af7":"frozenToken(uint256,string)","4ac87e47":"Bittwatt(uint256)","4ac8a529":"createDispute(uint256)","4ac9f0d7":"behalfer()","4ac9f881":"takeSellOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)","4ac9fc37":"updateConvertionRate(uint256)","4acb17c8":"getPeggedTokenAddress(address,address,uint256)","4acb232b":"percentWeiMC()","4acb3e59":"QCOToken(address,address,address,address,address)","4acc50eb":"Invoked(address,address,bool,uint256)","4acceeea":"togglePrebrdige()","4acd058e":"auctionBonus(uint256)","4acd44db":"offChainManager()","4acd4d5c":"mintLockCashout(address,uint256)","4acdc150":"setupCrowdsale(uint256)","4acdd29a":"statusPred(address,uint256[],uint256)","4acddfa0":"register(address,string,uint256,string,string,string,bytes20)","4ace9ccc":"ratePlansOfVendor(uint256,uint256,uint256)","4acea254":"inviteAmountLimit()","4acefeb1":"ethartArtAwarded()","4acf071c":"setStepTwoTime(uint256,uint256)","4acf4a27":"withdraw(uint128,address,uint256,uint128)","4acf8867":"PillarToken(address,address)","4ad07b0e":"oracleOutcomes(bytes32,address)","4ad0a529":"currentMigrationTarget()","4ad1cbad":"withdrawTeamTokens(address,uint256)","4ad25557":"getMonsterNum(uint256)","4ad27ae1":"claimInternal(address,address)","4ad37241":"destroyCard(uint256,uint16)","4ad37538":"DJPToken()","4ad42500":"ico26()","4ad447ba":"PutinCoin()","4ad4fa5d":"ERC223()","4ad59c54":"overpays(address)","4ad5a68c":"returnIdImage(uint32)","4ad5f440":"totalIcoTokensSold()","4ad6e648":"fightFactor()","4ad6f9f3":"checkTx(string)","4ad7799f":"VestingReleased(address,uint256)","4ad857a1":"etherSent(uint256)","4ad88363":"reset_application(address)","4ad8c869":"reCommentReward()","4ad8c938":"createSiringAuction(uint256,uint256,uint256,uint256)","4ad9d7ab":"getGoldStatusRegistered(address)","4ada218b":"tradingEnabled()","4ada3b32":"approvedAccount(address,bool)","4adaedef":"send_allowed()","4adaf5f6":"changeFundOwner(address)","4adaf748":"eBlockPower()","4adbe551":"whitelistAdmin()","4adc0b09":"setMembershipPrice(uint8,uint256)","4adcbd19":"isThisHardforkedVersion()","4adf6591":"setReportTimestamp(uint256)","4ae00041":"call(address,bytes,uint256)","4ae0ac60":"FobsCoin()","4ae0f543":"publicAllocation()","4ae12e9f":"FHFToken()","4ae184f2":"createStandingOrder(address,uint256,uint256,uint256,string)","4ae2b849":"PHASE_DURATION()","4ae2c351":"createCrowdsaleTiers(bytes32[],uint256[],uint256[],uint256[],uint256[],bool[],bool[])","4ae3164d":"getNewGens(address,uint256)","4ae34a96":"changelp16(address)","4ae34bb1":"EfectiveToken()","4ae3643f":"phase_4_token_price()","4ae4dd6b":"KeyRewardPool(uint256,address,address)","4ae4e9ea":"m_currentTokensSold()","4ae51a9a":"transferDevTokens(address)","4ae55dd0":"amendedEarlyPurchaseIndexes()","4ae5d478":"setNodesVars(address)","4ae5eecb":"getUserP3DDivEarnings(address)","4ae6ab70":"_getRevisionTimestamp(bytes20,uint256)","4ae85627":"grindUnicorns(uint256)","4ae86038":"MultiBonusCrowdsale()","4ae8c55f":"getWwLength()","4ae8ef06":"setLastTier(uint16)","4ae8f9fb":"FSCP()","4ae90a40":"isNotaryAdditionValid(address,address,uint256,uint256,string,bytes)","4ae931cc":"setPresellUpToTime(uint256)","4ae96e77":"setTransformTarget(uint256)","4ae9af61":"getBotStats(uint256,uint256)","4aea0aec":"lendFee()","4aea5f0f":"Artcoin(address,uint256,uint256)","4aea7aa9":"SetIDChain(address,address)","4aeb0241":"LisaToken()","4aeba1a5":"removeCustomerService(address)","4aec4677":"migrateLosingTokens()","4aec6416":"removeTransferAndCallWhitelist(address)","4aecf91d":"_emitContractRemoved(address,address)","4aed8a76":"inPreSalePeriod()","4aeda70d":"changeAuctionContract(address)","4aeddad0":"ConvertBkp(uint256)","4aef05a5":"addSongWriter(string,uint256,address)","4aef8b7c":"_isOddFlag(uint256)","4aefc3c4":"ContributionStateChanged(address,uint8)","4af153a9":"_message(uint256)","4af165cb":"EPause(address,string)","4af1b8a7":"pullAddr()","4af1f96a":"getActiveSellSize(bytes32)","4af27ba2":"_redeem(address,address,uint256,bytes,bytes)","4af350eb":"transferTokens(address,uint256,address)","4af4a127":"bonusPeriod()","4af4c191":"TIER4_RATE()","4af54311":"burnSomeTokens(uint256)","4af56cb0":"getUseRegistry()","4af69189":"sponsoredJackpotToken()","4af6ffc2":"attest(uint256)","4af7eedf":"VID(uint256,string,uint8,string)","4af80f0e":"setConversionWhitelist(address)","4af98f1b":"setFeeDivider(uint256)","4afb07c4":"getAccountActivity(address)","4afb09c2":"listDTH()","4afbac9c":"removeFromTokenList(address,uint256)","4afbb7d7":"getDepositary_function()","4afc0476":"RedPillCoin()","4afc7774":"_is()","4afce471":"test_requires_depth(uint16)","4afd74ff":"getRefunded(address)","4afd8a19":"getLendingInfo(address,uint256)","4afd8a98":"testEthIcoToken()","4afdcbde":"pauseOperator()","4afe2f80":"setRate(uint8)","4afe62b5":"placeBet(uint256,uint256)","4affb863":"isPartner(address,address)","4b00ebfb":"CheckExecution(string)","4b013f85":"_addVestor(address,uint256,uint256,uint256,bool)","4b023cf8":"setFeeAccount(address)","4b02e328":"IncorrectFee(address,uint256)","4b0304ab":"DonationReceived(address,uint256,uint256)","4b031397":"killAdminOnly()","4b031d0f":"shortSellShares(bytes,uint8,uint256,uint256)","4b03a15e":"_terminateSchedule(address)","4b042c0b":"specialsInfo(uint256)","4b05de75":"seventhTeamWithdrawal()","4b0697e4":"Manager(address)","4b06e1c7":"declareWininingFighter(address)","4b06fb28":"eatUnicornsAlive()","4b0720a7":"customGasPrice()","4b079fa6":"ownerof()","4b084d49":"checkEnd()","4b089b12":"withdrawManagerBonus()","4b09b72a":"reserveAmount()","4b09ebb2":"e_exp(uint256)","4b0a0d04":"checkRequestSignature(bytes,address[],uint256,bytes)","4b0ad8fa":"getStakedShop(address)","4b0adf6c":"MintingAgentChanged(address,bool)","4b0babdd":"releaseTokens(uint256)","4b0bbf84":"addEntropy()","4b0bddd2":"setAdmin(address,bool)","4b0c79aa":"turnOnOraclize()","4b0d5417":"disableSellToken()","4b0daadb":"getStaticArray()","4b0df486":"assertEq23(bytes23,bytes23)","4b0e2c90":"enableInternalLock()","4b0e5044":"HoldToken(address)","4b0e7216":"setBurnAddress(address)","4b0ee02a":"totalBalanceOf(address)","4b0f43fd":"canExecute(address,uint256)","4b106893":"inactive_withdraw(address)","4b11281e":"returnCreatorAddress(bytes32,uint8,bytes32[2])","4b11452c":"changeFoundationAddress(address)","4b114691":"playerInfo(address)","4b1146ca":"TOKEN_SUPPLY_BOUNTY_LIMIT()","4b11982e":"setCooldown(uint64)","4b11e7a0":"getVotingStart()","4b12416c":"setHeroTokenContract(address)","4b12dd39":"BTSCoin()","4b1325ea":"setNewOwnersCountToApprove(uint256)","4b143bb5":"harapan()","4b14e003":"transferAll(address,address)","4b16304f":"setTokenAddress(address,bytes)","4b1700df":"TokenListingManager()","4b1740ad":"tier3()","4b17bdd8":"transferTokensFrom(address,address,address,uint256)","4b18be1d":"moveLeftOvertokensToartistPool()","4b19eb09":"isStatePublic()","4b1a5773":"createSwapTarget(bytes20,address,address,uint256,address)","4b1be424":"getVotesBetweenFor(uint256,uint256,uint256,address)","4b1c5597":"dissolveFund()","4b1c8506":"bonusesList(uint256)","4b1cab4e":"calculateEthToToken(uint256,uint256)","4b1cdc2d":"token6DivsOwing(address)","4b1cff0b":"pot_()","4b1d00ee":"releasedCount()","4b1d29b4":"maxLockPeriod()","4b1dc225":"founderWithdrawablePhase3()","4b1dd21a":"getWhitelistLimit(address)","4b1dd591":"firstDiscountCap()","4b1ebc5a":"perpetuum()","4b1ec20c":"setPropertyPrivateMode(uint16,bool)","4b1ef6e1":"getMyRecord(address,uint256)","4b1f15d1":"updateDragonPrice(uint256)","4b1fb6d4":"removeNacFromNetf(uint256)","4b1fe17e":"ENSResolver(address)","4b200fac":"ClearCoin()","4b20ae39":"create(address,address,address,uint256,uint256,uint256,uint256)","4b21433a":"CoolICOToken()","4b21a587":"sellerfeeDivide()","4b21aaae":"getBondPrice(uint256)","4b2233df":"buyTokenSub(uint256,address)","4b227176":"pID_()","4b236401":"claimPlot(uint256,uint256)","4b242252":"levelByToken(uint256)","4b24ea47":"controllerAddress()","4b24f3a6":"setJackpotFee(uint256)","4b24f7aa":"CSpacesToken()","4b24fd0d":"getKeyType(address)","4b256137":"lockingContract()","4b259b5c":"getCumulativeAllowance()","4b25bfce":"whitelist(uint256,address)","4b269a00":"withdraw(int256[])","4b2702b3":"TokenSwitch(address,address,bool)","4b272c4a":"Greenbit()","4b274458":"getUncleAmount(uint256)","4b27a2ca":"fechVoteMainInfoForVoterBySnapshotBlock(address,uint256)","4b28a674":"organizer2()","4b28bdc2":"allRevealed()","4b2930d0":"IsICOrunning()","4b29c448":"setGoal(uint256)","4b2a4e18":"TradersWallet()","4b2a649c":"ECRecoverWrapper(string,uint8,bytes32,bytes32)","4b2acaa0":"openGateway()","4b2ba0dd":"originalSupply()","4b2be022":"BinaxToken()","4b2c0706":"getPeriod(uint256)","4b2c2596":"MerchantDealsHistory(string)","4b2c89d5":"redeemDeposits()","4b2cbc9d":"etherCollected()","4b2d5164":"transfer_tokens_after_ICO(address[],uint256)","4b2f249a":"isTileLive(uint16,uint8)","4b2f9eb7":"declareNewMaster(address)","4b313043":"preIcoMaxLasts()","4b314b34":"LogPause()","4b319713":"totalWithdrawn()","4b321502":"addHours(uint256,uint256)","4b331ca0":"getCitation(uint256)","4b33eac2":"updateTicketStructure(uint256,bytes32[],uint256[],uint256[],uint256[],uint256[],uint256[])","4b341aed":"totalStakedFor(address)","4b3544d5":"Jakov()","4b35ae33":"setTimeLimited(uint256)","4b369820":"setEntry(string)","4b36bca9":"WagerGames()","4b3727fb":"SshKey()","4b374fbe":"BTEN()","4b376513":"lastBlock_v13Hash_uint256()","4b376e45":"BoodooToken()","4b37c73f":"removeFactory(address)","4b37cf47":"littIsCapsule(bytes32)","4b3881ff":"StakeDestroyed(uint256,uint256,address,bytes32)","4b3955a5":"tier0LOT()","4b396ade":"TicketMultiTear(string,string[],uint256[])","4b3985a4":"shareTime()","4b398a5c":"mainnetLocked()","4b3a5fa6":"saleStartFirstDayEnd()","4b3ab5bf":"paySubscriptionFee()","4b3ab9c5":"getShare(address)","4b3afdd2":"setEthernautsStorageContract(address)","4b3b1d69":"notZero(uint256)","4b3b548f":"preMine()","4b3b6168":"SetNewBigContract(address)","4b3c45db":"getDealDataByNumber(uint256)","4b3ce14d":"set_minUETsPerReturnMoreThan(uint256)","4b3d81b6":"initialBlockTimestamp()","4b3ec03a":"TEAM_ACCOUNT()","4b3f3987":"_updateLock(uint256,address)","4b419b5f":"setcardPrice(uint256,uint256)","4b41c74a":"Ticker()","4b41cb60":"withdrawPreSigned(address,uint256,address,uint256,uint256,address,uint8,bytes32,bytes32)","4b41eb4a":"ZyryanovKubSU2018()","4b41f4df":"transferableTime()","4b42d208":"getUint8FromByte32(bytes32,uint8)","4b432966":"max_fortunes()","4b43b582":"changeAdminWallet(address)","4b43dc51":"testTokensAreLockedDuringSale()","4b449cba":"auctionEndTime()","4b452958":"_setStakingEpochStartBlock(uint256)","4b467105":"walletCommunityReserve()","4b467157":"stopEmergencyWithdrawal()","4b468b0e":"JDAnteil()","4b469490":"RichToken(address)","4b471dd0":"setWithdrawalAndReinvestmentContracts(address,address)","4b496444":"azatipToken()","4b4a456a":"ChargeFix(uint256)","4b4a5088":"switchCompatible20(bool)","4b4af4db":"allocateTeam(address,uint256)","4b4b6338":"MECoin(uint256)","4b4b87c0":"PowerCoin()","4b4bb75b":"DSToken(string,string)","4b4c01f4":"RobincoinERC20(uint256,string,string)","4b4c0d7c":"BONUS2()","4b4c2039":"_B_sendToEthertoteDevelopmentWallet()","4b4e23e1":"TIMESTAMP_BUCKET_SIZE()","4b4e38df":"GetCurrentPoolAmount()","4b4f8e36":"addCZRLock(address,uint256,uint256,uint256)","4b4f90ef":"saleIsOn()","4b504ecd":"logNewPlayer(address)","4b50c9f0":"getGameStartTime()","4b513e82":"RegistrantApproval(address)","4b5243b5":"ETGTestCoin()","4b52f48f":"withdrawLeft()","4b52f89b":"setGiftToken(address)","4b530090":"nextDiscountTTWTokenId1()","4b534c48":"unlockProjectToken()","4b54d131":"wipeProposedActions()","4b54f1fb":"S1Coin()","4b561a16":"getMatchInfo(uint256)","4b563657":"setMessages(bytes32,bytes)","4b56b10d":"preIco()","4b56cd27":"depositBoth(address,uint256)","4b56dcf4":"LogChangeIsPayableEnabled()","4b57b0be":"wethToken()","4b57ed55":"EnonRToken()","4b57fbaf":"SetMinChequeValue(uint256)","4b5830b4":"SENC_CONTRACT_ADDRESS()","4b58484d":"_createPlayer(address,address)","4b58d0bb":"reserveFundAddress()","4b59e880":"puzzle(address,bytes32,bytes32)","4b5a0e65":"getWinningStageInfo()","4b5a726d":"getProgramInfo(uint256)","4b5c0234":"throwsWhenHittingHardCap()","4b5c4277":"log(string,string)","4b5dc8cb":"roundMoneyDown3SFExt(uint256)","4b5dcad7":"ServiceStation(address)","4b5e8d63":"registerInvestor()","4b5f297a":"hasAttribute(address,uint256)","4b5f2fa4":"TravelZediToken(uint256,string,uint8,string)","4b5f3e0a":"getDate(bytes32)","4b5fd350":"withdrawHeldToken(uint256,uint256,uint256,uint256)","4b5fea8a":"milestoneRecipients(uint256)","4b602673":"artworks(uint256)","4b603a83":"mintTokens_(address,uint256,address)","4b61cf17":"SWLPerEther()","4b623178":"removeFromPublicWhitelist(address)","4b627107":"setValidatorDescription(address,string)","4b62e0d9":"buyIns(uint256)","4b63036d":"holderContract()","4b63189c":"softcapPreSale()","4b63e601":"scheduleCall(address,uint256,bytes)","4b641f52":"coinbaseInit()","4b64a00f":"DiscountApplied(uint256,uint256,uint256)","4b64e492":"execute(address)","4b650d0b":"getPlayerClickCount(uint256,address)","4b656b41":"totalWeiRaisedDuringPhase1()","4b66cb7e":"teamHolder()","4b6753bc":"closingTime()","4b67f6af":"name2()","4b689cf0":"setCommunityAccountOwner(address)","4b69c3d4":"getRegistryDataVendor()","4b6a3334":"setEtherPrices(uint256,uint256)","4b6a8604":"setBiddingRate(uint256,uint256)","4b6a9f1d":"STORES_TO_UPGRADE_1CENTER()","4b6acafb":"totalDividend()","4b6ad918":"isCurrentUserRefAvailable()","4b6b2300":"updateTopicAssetClass(bytes15,string)","4b6bc655":"isFreeze(address,address)","4b6bdf1d":"poker()","4b6c144a":"getClaimById(string)","4b6dfe4e":"initialFundBalance()","4b6e7d78":"Data()","4b6ea677":"oracleURL()","4b6ede29":"Users()","4b702afa":"accountS()","4b70cec4":"getTime(address)","4b71bff3":"airdropReward()","4b726f61":"checkCustomer(string,string)","4b729aff":"buyNumber(uint256)","4b72bbaf":"getSirePrice(uint32)","4b739b61":"payByEth(uint256)","4b73ca04":"flipsCompleted()","4b741395":"requestNewMint(address,uint256)","4b749535":"hardCapTokens()","4b750334":"sellPrice()","4b75f046":"tokensIssuedCrowd()","4b75f54f":"formula()","4b760612":"localsCointoken(uint256,string,uint8,uint256,string,string)","4b763fe7":"PersistLimitChanged(uint256)","4b766b95":"markRewardsSet(string)","4b76cb13":"get_status_user(address,address)","4b76fe19":"EtherPredict()","4b778445":"addRound(uint256,uint256,uint256)","4b77b8d3":"stopCrowdfunding()","4b77c468":"invite(address)","4b77d17d":"is_king_found()","4b7829f1":"token_claim_waiting_period()","4b7863fe":"setIBalance(uint256,uint256)","4b78ab61":"notarizationList(uint256)","4b798b82":"setFixes(string,string)","4b79e8ef":"getVariablesForDapp()","4b7a5cc6":"PLATINUM_AMOUNT_NDC()","4b7a7a14":"PresaleFirst(uint256,uint256,address,address)","4b7ae9f6":"returnMe()","4b7b2ed1":"confirmTransaction(address)","4b7b45b4":"DreamMaker()","4b7bb8e3":"CfoAddress()","4b7c1d2c":"TransactionConfirmed(uint256,uint256)","4b7e23b3":"ShapeshiftBotLookup()","4b7fa6db":"viewFn(uint256)","4b7fcee7":"ownerPausePayouts(bool)","4b802dde":"rentals()","4b803095":"processReferralSystem(address,address)","4b813478":"FinishBallot(uint256)","4b81780e":"ADDR_MAYA_ASSOCIATION()","4b82d416":"preSaleSecondEndDate()","4b82ee28":"frozenDaysForEarlyInvestor()","4b82f437":"setFirstReporterCompensationCheck(uint256)","4b836181":"BuyTicket(address)","4b8399f4":"setEnum()","4b841fa9":"redeem(string,uint256,uint256,uint8,bytes32,bytes32)","4b84ee81":"LogAddTokenPairWhitelist(address,address)","4b851b23":"hasDefaultRelease()","4b852c03":"setDuration(uint64)","4b855c62":"purchaseKingdom(string,string,bool,address)","4b8574ad":"AttestationManager()","4b85fd55":"setAutoBirthFee(uint256)","4b8624c4":"BONUS()","4b865846":"suspend(uint256)","4b866981":"LP(uint256,string,string)","4b869e15":"investeth2017()","4b86c225":"lock(address,address,uint256,uint256)","4b86faba":"claimHodlReward()","4b86fc5b":"isEligible(address,string,string)","4b8772c1":"buyUnit(uint256,uint256)","4b886f09":"VantageCoin(uint256,string,uint8,string)","4b891518":"_grantAccess(uint256,address)","4b89c41d":"setClosingTime(uint256)","4b8a3529":"borrow(address,uint256)","4b8adcf7":"pauseContribution()","4b8b4cee":"postExternalPayment(address,uint256,uint256,uint8,uint256)","4b8b704e":"icoTokensCount()","4b8b7a2a":"addCourse(string,uint256,string,string,string,string)","4b8ca215":"Ornament()","4b8d12f0":"migrateAddress()","4b8dbd1a":"VRFtoken()","4b8dc588":"closeRefundVault(bool)","4b8e1ba8":"isMinter(int256,address)","4b8e31a2":"_erc20token()","4b8e38db":"test(uint32[26],uint32[4])","4b8f4b5e":"MordernToken()","4b8f9f87":"ownerSetMinJackpoBet(uint256)","4b8feb4f":"multiSigWallet()","4b901b72":"balanceOfByTranche(bytes32,address)","4b9081bf":"getBonusSale(uint256,uint256)","4b90ac86":"isBountySent()","4b9143f7":"setSold(uint256)","4b915a68":"aliceClaimsDeposit(bytes32,uint256,address,address,bytes20)","4b91ab35":"unfollow(bytes32)","4b922b12":"getDataColla_AB_01(string)","4b92738e":"migrateBalances(address[])","4b92f39e":"tradingClass(address)","4b930503":"registerName(address,string)","4b931600":"evaluateCategory(address,uint8,uint256,uint256)","4b932327":"novaluetoken(uint256,string,string)","4b93fec0":"BetContract()","4b944b9b":"post(bytes32,bytes32)","4b94f50e":"getTokenPrice()","4b95dcc0":"ViberateCrowdsale()","4b960794":"spotsLeft()","4b963025":"addUniqueSaleTokensMulti(address[],uint256[])","4b96b0ee":"registerZone(bytes8)","4b96f855":"burnPercentageDefault()","4b97aed9":"numOptions()","4b97e6cc":"withdrawEthBalanceSave()","4b991bde":"challenge(uint64,uint256,bytes,bytes,bytes)","4b997d9a":"sendTokens(uint256,address,bool)","4b99f0c5":"setTradingPairCutoffs(bytes20,uint256)","4b9a22af":"teamWon()","4b9b808d":"setResetVoteKindnessEvery(uint256)","4b9c4358":"betPlaced(address,uint256,uint256)","4b9c78e5":"buyEngineer(uint256[])","4b9cdbe7":"addCurrencyInternal(uint256)","4b9ce83c":"recordAssetPrice(uint128,uint128,uint128)","4b9d5047":"PlutoToken()","4b9d8624":"getLinks(address)","4b9de7a2":"dataIdentifiers(uint256)","4b9de81e":"endTimeRound2()","4b9e7ecd":"test_1_restrictDoubleVote_shouldThrow()","4b9eb771":"CAT_PER_ETH_FIRST_EARLY_BIRD_RATE()","4b9ed302":"setEarlyInvestorsBonus(uint256)","4b9ee106":"setMetaBetWeight(uint256)","4b9eea9b":"decodeKYCFlag(uint128)","4b9f5c98":"vote(bool)","4b9faf4c":"setTokenBalance(uint256,bool)","4ba034dc":"unlockGrowthPoolTokenSupply()","4ba0dd3c":"BotFarmer()","4ba1f098":"acceptRequest(uint256)","4ba20050":"getProduct()","4ba2363a":"pot()","4ba26466":"TPP2018TOKEN()","4ba2ab8a":"RockPaperScissorsAdvanced()","4ba2d5ff":"setThreePowerAges(uint256,uint256,uint256,uint256,uint256,uint256)","4ba336e5":"calculatePoolCut(uint256)","4ba4079a":"enableSwitch(bytes32)","4ba4c16b":"guess(uint8)","4ba4d784":"getMinutes(uint256)","4ba5b7b3":"crowdsaleRefund()","4ba6e72e":"advisoryTotalSupply()","4ba71f3c":"OxToken(address)","4ba79dfe":"removeAddress(address)","4ba8fde0":"_computeIncentiveCut(uint256,uint256)","4ba90201":"setFinishPreICO(uint256)","4ba9bb67":"arr(address,address,uint256)","4ba9fb71":"closeAskOrder()","4baa39be":"editBet(uint256,uint256,uint256)","4baa8160":"triggerAttack(uint32,uint128)","4baa9dc7":"addCashback(string,address,uint256[],uint256[])","4baaab80":"MyToken(string,string,uint256,uint256,address,address)","4bab0236":"wercoin()","4bad0881":"P4WDToken()","4bad294d":"asFunc(uint256)","4bad3327":"_mul(uint256,uint256)","4bae2ef1":"referrerBonus()","4bae6659":"fixedDeposit(uint256)","4baf4a76":"addToWhiteListMultiple(address[],address[])","4baf7a30":"TypesToBytes()","4bafa2a4":"totalMIT()","4bafa437":"setSECOND_STEP_MULTIPLIER(uint16)","4baffdc6":"_withdrawHoldVault(uint256)","4bb017a1":"destroySalesManager(address)","4bb07665":"whitelistUser(address,uint128)","4bb13055":"returnAllAvailableFunds()","4bb13e63":"setTripleRoomMin(uint256)","4bb22b5a":"execReturnValue(uint256)","4bb24399":"survive(address,address,uint256)","4bb278f3":"finalize()","4bb2e417":"SokToken()","4bb32e8c":"setDNoEditors(bytes32)","4bb37790":"restrictionExpiraton()","4bb4b260":"cashAllOut()","4bb593b2":"updateUser(address,string,uint256,uint256,uint256,string,bool)","4bb6e766":"checkTransferAllowed(address,address)","4bb72dea":"setPriceStep4(uint256)","4bb77d9d":"updateRates(uint256[])","4bb8596e":"managerSet()","4bb89c4d":"sendBounty()","4bb9962f":"HexelErc20Token(string,string,uint256)","4bba32fb":"round3StartTime()","4bba38b8":"getRef(address,address)","4bba863e":"getEthOfferor(uint256)","4bba8a58":"RepostiX(address,address)","4bbaa946":"getAllArea()","4bbb216c":"_target(address)","4bbb58b2":"setVirusInfo(uint256,uint256)","4bbbe0cc":"exporter()","4bbc142c":"allowOwnership(address)","4bbc2a4a":"changebank(address)","4bbcc1bc":"payoutSelf(address)","4bbcd6e8":"buyPresaleTokens(address)","4bbd3061":"DateCreateToken()","4bbf2c69":"excludeInvestor(address)","4bbf3a7a":"swapToken(uint256)","4bc091a3":"getCrowdsaleStartAndEndTimes()","4bc18a64":"deleteLock(address,uint8)","4bc1aa42":"VESTING_ADVISOR_CLIFF()","4bc24ec5":"right61(uint256)","4bc2a657":"setVoter(address)","4bc32ea2":"getBidCountForAuction(uint256)","4bc36600":"reorganizeMembers()","4bc3b153":"REWARD_FORWARD_POSITION()","4bc3df81":"BuyBooster(uint256)","4bc4549c":"todaySold()","4bc4d2ba":"KIN_PER_WEI()","4bc4e892":"startNextEra(bytes32)","4bc53249":"toB32(uint256,bytes,uint256,address)","4bc57a7c":"Medis()","4bc5d101":"CreatorWithdraw(uint256)","4bc70b1e":"withdrawFunds(uint16)","4bc8c477":"VirtualRealEstate()","4bc935d7":"verifyProof(bytes32[],bytes32,bytes32)","4bc9fdc2":"calcMaxWithdraw()","4bca4626":"ethWeiRaised()","4bca5cc0":"_setAdmin(address,bool)","4bca7f95":"NigeriaNairaToken()","4bca893d":"Count(uint256,uint256)","4bcb776f":"sliceIndexThrow()","4bcbcd89":"getEngineerLv1(address)","4bcd245d":"gameStatusSet(bool)","4bce2e9b":"totalEnjSold()","4bce79a1":"getAllSocialAccounts(bytes32)","4bcf244b":"ECRecoverWrapperF(bytes32,uint8,bytes32,bytes32)","4bcf74b2":"AccountMinterAdded(address,address)","4bcf8645":"returnFundsToClient()","4bd09c2a":"distributeTokens(address[],uint256[])","4bd1c253":"ChipExists(uint32)","4bd21127":"setAdminLevel(address,uint8)","4bd22521":"Electricity(string,string)","4bd22766":"refundETH(address,uint256)","4bd3a225":"setMultiplePreSalesSpecialUsers(address[],uint256)","4bd3af72":"sellGolds()","4bd3b4c6":"allowAuditor(address)","4bd4ddb9":"testThrow_invalidZeroValue1()","4bd4e770":"CheckSign(string,string)","4bd50dcf":"sendFromContract(address,uint256)","4bd544e8":"isEligibleToPlay(address)","4bd54f04":"dynamic()","4bd5610d":"jsonCat(string,string,int256)","4bd58c92":"LogBuyForFiat(address,uint256)","4bd67ced":"get_last_asset_document(bytes32)","4bd70ea3":"testFailGetUnset()","4bd7730b":"Senpona(uint256,string,uint8,string)","4bd79ac1":"lastCalculationRewardTime()","4bd889b4":"removePersonalLock(address)","4bd8ae6f":"endCoinFlip(bytes32,bytes32,bytes32)","4bd9d76c":"payUnderwriter()","4bda2ad0":"addNote(bytes20,string)","4bda3f2b":"test_insert_findWithHintPrevUpdateTail()","4bda87b5":"GCHToken(string,string,uint8,uint256)","4bdb7369":"hasBoughtEgg(address)","4bdbb944":"GodviewChain(uint256,string,uint8,string)","4bdbea2f":"latestBalanceCheck(address)","4bdc44ae":"setNote(uint256,bytes20,string)","4bdc4ffe":"ProposalTallied(uint256,uint256,uint256,bool)","4bdd6a8e":"KPOPIO_CONTRACT_ADDRESS()","4bde38c8":"platform()","4bdec44a":"VotingRightsGranted(address,uint256)","4bdf1b0e":"receiveApproval(address,uint256)","4bdf6667":"IsGenesisAddress(address)","4bdf7e8b":"_updateExperience(address)","4bdfa061":"postGenesisSales(bytes32,uint256,uint256)","4bdfa999":"Given(uint256,address)","4bdfbb75":"isCanvasFinished(uint32)","4be02f32":"getPlayerWithdrawal(uint256,uint256)","4be04fd9":"getMyLastScore()","4be185f0":"editionOf(uint256)","4be36323":"bonusRoundId_()","4be366d5":"purch(address,address,uint256)","4be39f2f":"FEED2()","4be422ae":"logOut()","4be42c08":"updateRewardAmount(bytes32,bytes32,uint256)","4be5739e":"PUBLIC_SALE_LIMIT()","4be62668":"MainSaleDistributed()","4be6c20a":"Error(uint8,address,address)","4be7183a":"init(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","4be7ced7":"withdraw_team_fund(address)","4be860eb":"getMinGas()","4be9b992":"THRESHOLD3()","4be9d332":"jsonCat(string,string,string)","4bea4df7":"addLeaderboard(string,uint256)","4beb031b":"numBallots()","4beb536e":"allWagered()","4beb9e32":"approveByAddress(address)","4bebbf14":"setother(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","4bebdab7":"uintArrayToString(uint256[])","4bec8335":"changeSafeguardStatus()","4becfd56":"getCurrentGameInitialMinBetSize()","4bed33b8":"SHARE_PURCHASERS()","4bed6c23":"donationAmount()","4bed81c8":"getWalletUser(uint152)","4beda18b":"BILLION()","4bee09e1":"changeTicket(address)","4bef6de9":"determinePrize(uint256)","4bef71ac":"changeColorTeal()","4befc326":"temperatureMax()","4bf003fa":"After(uint256,bytes32)","4bf02421":"calculateAttributeTotals(uint256)","4bf0d331":"canDeposit(address)","4bf1b68d":"setTokenSupplier(address)","4bf2c7c9":"setBurnFee(uint256)","4bf2d314":"setAdvisoryPool(address)","4bf365df":"mintable()","4bf49313":"requestPayment(uint256,uint256,string,address)","4bf4e421":"client_address()","4bf5ac36":"saleAgent2()","4bf69206":"stakeFor(address)","4bf79cd9":"OutCloud(address,address)","4bf80d39":"giveConsent()","4bf899a3":"buyPosition(address,uint256)","4bf8e7a2":"getPriceInPastAuction(address,address,uint256)","4bf9407f":"changeRecipientAddress(address)","4bf96e60":"nextPurchasableBlocknumber()","4bfa0d11":"TDEEndDate()","4bfa798a":"getWarlordChestAvailable()","4bfad14d":"WinnerPicked(uint8,address,uint16)","4bfaf2e8":"getPendingVersionTimestamp()","4bfbe5df":"eventDate()","4bfc4782":"change_a(address)","4bfde393":"myWinShare()","4bfe2779":"setETHRate(uint256)","4bfe642d":"proWallet()","4bff1b95":"STARTING_KEBAB()","4bff5009":"getUserByName(string)","4bff8e51":"_runAdvanceClock(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","4bffc5e4":"allowance(address,uint256,uint256)","4c007b35":"BigerToken()","4c0348ee":"nInvalidatedHashes()","4c04f7f2":"addTranslatorContent(address)","4c05a636":"Registrar(bytes32,uint256)","4c05b40e":"createShortId(bytes32,bytes32)","4c05df98":"startEarlyBird()","4c062c81":"moveNapkinsTo(uint256,address)","4c07fb4f":"editAddressDescription(address,string)","4c081138":"assign(uint256)","4c097cb4":"trigger(bytes32)","4c0999c7":"bytes32ToBytes(bytes32)","4c0a6532":"lrcTokenAddress()","4c0aac9a":"WithdrawFunds()","4c0b1c90":"getMarketer()","4c0b2973":"mfrOf(bytes32)","4c0bcfe5":"getTransferableBalance(address)","4c0bd3ef":"getLLV_edit_16()","4c0c0ac2":"rewardsAllocation()","4c0ddea8":"decodeTokenImbalanceData(uint256)","4c0e207a":"__outputCallback(uint256)","4c0e9e6a":"acquisitionsWallet()","4c0eceb5":"plusOnePonzi()","4c0ee2e1":"unPausePriceRaise()","4c0eed51":"addMarketMaker(address,address)","4c10d0a5":"addFrostTokensMulti(address[],uint256[],uint256[])","4c123019":"tokenFallback(address,address,uint256,bytes)","4c125e79":"cancel(uint64)","4c12b33f":"burning()","4c12d8b9":"recipientETH(address)","4c12f8bb":"creditCEO()","4c13017e":"Transfer(bytes32,address,uint256)","4c1334a8":"GoodTo(uint256,string,string)","4c1344b7":"isGuilty(address)","4c136ea8":"totalEDUSAllocated()","4c13fbb2":"ImageToken()","4c146f38":"getFrontEndTokenBalanceOf(address)","4c14743b":"UnlockedBalanceOf(address)","4c148efb":"CollectPayment(address,address,uint256)","4c14f334":"getCouponBonus(string)","4c15469c":"tresholds()","4c1674e5":"descOf(uint256)","4c167a6e":"approvePreSigned(bytes,address,uint256,uint256)","4c1736a0":"subFrozen(address,uint256,uint256,bool)","4c174ef0":"isWitness(address,address)","4c176b21":"WALLET_SALE()","4c17b322":"performRead2()","4c182a95":"doDeveloperGrant()","4c18e57e":"PositiveWhuffiesSent(address,address,uint256,string)","4c18e960":"allowRecurringBilling(uint256,uint256,uint256,uint256)","4c19a199":"openGameResult(uint256,uint256,uint256,string)","4c19dd1c":"VicDemToken()","4c1b2446":"transmitInteger(address,bytes,bytes,uint256,uint16)","4c1b64cb":"deleteAccount(address)","4c1b8ffd":"voteCost()","4c1bbef8":"claimerKey()","4c1ccadf":"SmartexInvoice(address,address)","4c1d1fde":"withdrawTokens(address,uint256,uint256)","4c1d79ee":"setSalePeriod(string)","4c1d9d48":"tokenIndexById(uint256)","4c1e4169":"BIZDEV_WALLET()","4c1f20ec":"CEO_TEAM()","4c1f524f":"convertToMiniTtc(uint256)","4c1f7635":"getAccountRest(address)","4c1f85ae":"updateHydroMap(address,uint256,uint256)","4c1fbde8":"getPlayerColor(uint256,address)","4c20179e":"devAllocation()","4c2067c7":"expired()","4c207ac8":"setTraps(uint256,uint16,bytes)","4c21eb07":"put(string)","4c21fa45":"getNoteByIndex(uint256)","4c2233a5":"withdrawAll(uint256,address)","4c228656":"advisorsAllocationTokenSend(address,uint256)","4c22a8d1":"kvcAdd(uint256,uint256)","4c22b792":"calc_wei_rewards(uint256,uint256,uint256)","4c22c119":"isUser()","4c2324bb":"toBytes(uint256[])","4c23ba50":"removePeer(address)","4c25162a":"Babatoken()","4c2516de":"swapToken(uint256,address)","4c25727b":"viewPollData(uint8)","4c258eb1":"getQtyFilledOrCancelledFromOrder(bytes32)","4c25deb5":"USER_GROWTH_TOKENS_RESERVED()","4c26064b":"MVGcoin(uint256,string,string)","4c266e11":"setExchangeGroup(address,uint256)","4c26aaa2":"TokenExchange()","4c26b6eb":"total_buy()","4c281603":"getPlayerMax(uint256)","4c28a043":"adminGetFeeDial()","4c294188":"customer_tickets(address,uint256)","4c2a664b":"purchaseNotes(uint256)","4c2a799f":"checkFileProof(bytes32,bytes32[10],uint256[4],bytes32[],uint256)","4c2bc9a9":"assertEq26(bytes26,bytes26)","4c2bd226":"getDescriptionHash(address)","4c2d0378":"getAllTransactionIds()","4c2d71b3":"setConfigAddress(bytes32,address)","4c2d8649":"transferComplete(address,uint256,bytes)","4c2db6d8":"buyCoin(uint16)","4c2f04a4":"AddMessage(address,uint256,string)","4c2fac53":"requireFunction()","4c2fc8b2":"acceptProposedMilestones(bytes32)","4c2fe456":"right94(uint256)","4c2ff0ae":"getLLV_edit_31()","4c3052de":"submissionGasPriceLimit()","4c316f70":"mineCoins(uint256)","4c31a0ca":"mintFoundersRewards(address,int256)","4c31df50":"nextroundsolsforhire()","4c3221e1":"complexityForBtcAddressPrefix(bytes)","4c32a444":"_onCanvasCreated(uint256)","4c330471":"getReferralBalance()","4c33fe94":"cancel(address)","4c34c8de":"USDCToken()","4c34d7e9":"UNITED_NATIONS_FUND()","4c352323":"getNewVoting(uint256,bytes32[],address[],uint256[])","4c364ceb":"createAccessory(uint8)","4c36c36e":"resolveBet(uint256)","4c36cf16":"addRoundPrice(uint256,uint256,uint256,address[])","4c37077f":"chargeBuyer(uint256,address,uint256,uint256)","4c381350":"meteredPrice(uint256)","4c382d99":"terminateEmployee(address,uint32,uint8)","4c38661d":"lastPing(address)","4c387d82":"NSCToken()","4c38c366":"reLoadXaddr(uint256)","4c3997d4":"cancelBuyAuction(uint256,address)","4c3a00cb":"totalTradeRecords()","4c3a1a1a":"returnUserGrowthPoolTokens(address,uint256)","4c3a6ae0":"isMultiSigWallet()","4c3a9675":"ManagerProxyTargetMockV2(address)","4c3acb86":"debug(string,string)","4c3b67b4":"withdraw_for(address)","4c3ba268":"getBySemanticVersion(uint16[3])","4c3bf0b5":"changeInitialCost(uint256)","4c3d1f00":"EthDailyLimitChange(uint256)","4c3dff01":"InitialBasicBalance()","4c3ec50b":"FarziToken()","4c3eea9e":"generalLog(uint256)","4c3ef6dc":"minimumTokenThreshold()","4c3f333f":"Kalypso()","4c3f8ec0":"Tier_Wildcat_Registration()","4c409b80":"ChangeWallet(address,address)","4c413139":"minutesToPost()","4c418879":"getMyDino()","4c41a6c7":"blockThreshold()","4c41bf9d":"getOnBurnTargetValue()","4c4316c7":"donate(uint64,uint64,address,uint256)","4c433843":"parityOwner()","4c439436":"getTicketsAtAdress(address,address)","4c44d53f":"test_fourInvalidEqBytes32Message()","4c45c7ec":"setPhase(uint8,uint256,uint256,uint256,uint256,uint256)","4c466d37":"signer(bytes)","4c46e52c":"trancheOneBalanceOf(address)","4c46fb73":"stageCaps(uint256)","4c471cde":"scheduleCall(address,bytes4,bytes,uint256,uint256,uint8,uint256)","4c4766e8":"KittenRegistry()","4c478b62":"ERC827TokenMock(address,uint256)","4c47e9ee":"setLockedConfig(address[],uint256[],uint256[])","4c480c2a":"ownerCandidat()","4c4870c6":"checkGoal()","4c488dac":"getChannelValidUntil(bytes)","4c49515d":"presaleTokensIssued()","4c4a386f":"refundEnabled()","4c4a4c67":"assertEq2(bytes2,bytes2)","4c4a9761":"tokenRate4()","4c4aea87":"getReleaseData(bytes32)","4c4bf936":"landData(int256,int256)","4c4c23dd":"upgradeGreatCoin(address)","4c4c447e":"cancelBattle(uint256)","4c4cb69e":"INVEST_AMOUNT()","4c4cea5a":"completeAt()","4c4cfc3b":"tokensForEcosystem()","4c4d07e7":"isBouncer(address)","4c4d460e":"LogCampaignCreated(address)","4c4dc6e0":"docCount()","4c4deecb":"__callback(uint256,string)","4c4e03f2":"_getExtraParam(bytes)","4c4e829c":"TransactionRevoked(uint256)","4c4efef7":"totalCLNcustodian()","4c4f1386":"WartecToken()","4c4fa89a":"getChildBranch(bytes32)","4c50ea27":"RHOC(uint256,address)","4c515fb5":"TEAM_VESTING_CLIFF()","4c51b021":"substract_individual_shares(uint256)","4c524be4":"selectWinner(uint256)","4c53adb0":"blackFridayEndBlock()","4c54cc1d":"managerETHaddress()","4c56e992":"refillContract()","4c574afe":"unblockSecondStake()","4c575fcc":"numberOfRawEarlyPurchases()","4c57fc28":"setTokenMintFeeReceiver(address,address,address,address)","4c5802c1":"getPhaseAddress()","4c585ce4":"approveMultipleUsers(address[])","4c5879cf":"WidinShares()","4c58994c":"TrypCrowdsale()","4c594c1e":"limitDateCrowdWave3()","4c59b47c":"EthereumLottery(address,address)","4c59f021":"CakCrowdsale(uint256,uint256,uint256,address)","4c5a2044":"licenseCostDenominator()","4c5a82cb":"reportTemperature(int8[],uint32[])","4c5a94fe":"_removeToken(address,uint256)","4c5b632a":"addcoin(string,string)","4c5be574":"getOdds()","4c5cbe9a":"getBalancesForTeam(address)","4c5d6d93":"totalCrowdSale()","4c5df57a":"createLoan(address,address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,string)","4c5df737":"addCar(string,string,string,uint16,string,address)","4c5f338b":"CheckStudentofCourse(uint256)","4c610ba4":"totalRewardThisYear()","4c611268":"balanceOfUnclaimedCookie(address)","4c6226fc":"oraclizeFee()","4c62a644":"withdrawComission()","4c64384c":"maxPrivateSale()","4c64cf92":"mint_time_locked_token(address,uint256)","4c65b2b3":"ethOwner()","4c65c62e":"AgentContracteGalaxy(address,address,address,uint256,uint256)","4c661a2c":"DaoOwnershipTransferred(address,address)","4c66326d":"deregisterCallback(address)","4c6686d8":"CONFIG_FEES()","4c66bcc1":"WorldWideLoveToken()","4c67567a":"firstLockAmount()","4c676725":"fundTeamCompany()","4c68df67":"totalReserve()","4c69c00f":"setOracleAddress(address)","4c69ec93":"changeReceiver(address,address)","4c6a3334":"buyEthLootbox(address)","4c6adb31":"firstReporterCompensationCheck(address)","4c6b25b1":"results(bytes32)","4c6b6cad":"newProposal(string,bytes)","4c6c27a1":"judgeCustom(bytes32,bytes32,bytes32,uint256,bytes32,uint256[4],bytes32[10],uint256[4],bytes32[])","4c6c6a5c":"upgradeFrom(address,address,uint256)","4c6c8bc3":"distribute(address[],uint256[],bytes32[])","4c6d1d9e":"checkOutTag(string)","4c6d350b":"approveShutdown(uint256)","4c6d8aac":"hasParameters()","4c6e4453":"EcoLend()","4c6e5926":"send_to_side_chain(uint256,address,uint256)","4c6ebbbe":"maxIcoTokenLimit()","4c6fc20f":"setDisbursingAddr(address)","4c703ccd":"FirstERC20TestToken()","4c70b6b2":"deList(address)","4c714ed4":"DescriptionChanged(string,string)","4c7241f8":"Potentl()","4c738909":"getMyBalance()","4c73eef6":"card_black_minamount()","4c743c45":"FCTOKEN()","4c750bca":"bountyFunds(address,uint256)","4c75dc8f":"EFOcallBack(string)","4c75fbca":"getThirdAddressBalance()","4c76318e":"award(bytes32)","4c77a28d":"AppleCoin()","4c77c0e2":"period2Numerator()","4c77e5ba":"getAddressValue(bytes32)","4c780596":"UpgradeSpace(uint8,uint16)","4c783bf5":"isControllable()","4c78529e":"setOfficialUrl(string)","4c78b276":"getShare(address,uint256)","4c7940c5":"getWithFrozenStockBalance(address,address,uint256)","4c79afe0":"EventBuyShip(address,uint32,uint32)","4c7a0271":"buyMiner(uint256[8])","4c7a2254":"checkMyWithdraw()","4c7a5c0f":"ArtifactCoin(address)","4c7ab28d":"setMaxToSell(uint256)","4c7ae3ac":"getNameFromKoikeToken()","4c7b18fd":"ratioUpdateTime()","4c7b8fba":"contributionHashes(uint256)","4c7c3ca1":"KryptopyCrowdsaleMock(uint256,uint256,uint256,uint256,uint256,address)","4c7c71fe":"startTimes()","4c7ce18a":"withdrawReturns()","4c7cfd9b":"MarketboardListingPriceChanged(uint256,uint256)","4c7d3e3f":"icoIsClosed()","4c7d7d3f":"standardToken()","4c7e6bab":"tokensPerCentsDayOne()","4c7f0bdd":"isBackend(address)","4c7f74df":"EtherDelta(address,address,address,uint256,uint256,uint256)","4c7fa728":"getPlayerLeftDividend(address)","4c808da8":"StageUpdated(string,string)","4c80b03b":"minTransAmount()","4c80c937":"getEpochData(uint256,uint256)","4c80f5c1":"minimumAmountToParticipate()","4c813d6d":"sendItDv(string)","4c81a1db":"addressPayableFunc(address,address)","4c81c4d7":"startStage2Time()","4c81e13a":"incentiveDistributionRoundDenominator()","4c81e48b":"testToUint()","4c8316a6":"showTokensStaked()","4c833532":"resumeTransfer()","4c839beb":"getContributionTokens(address)","4c840214":"getBackToken(address,address,uint256)","4c841e5d":"_setBlacklistedUser(address)","4c85a8f3":"isAllowedToMint(address,address)","4c85b425":"buyShares(address)","4c85d2e6":"addImmigrationOfCountry(address,uint256)","4c86c2e5":"setPortUpdate(uint16)","4c86e97b":"bonusTokensLeft()","4c873c48":"tokenSetup(address,address,address)","4c87effd":"delete(bytes32)","4c88bc26":"YEAR_TWO_SUPPLY()","4c899118":"getProposalFromID(bytes32,uint256)","4c89c4c7":"getHash(bytes10,uint8)","4c8b16f4":"setTimeStep(uint256)","4c8b8ca7":"distroyBuyerToken(uint256)","4c8bae93":"_isTradeable(uint256)","4c8c121e":"getGameHash(address,uint256)","4c8cab79":"largestStake()","4c8cc20b":"toContentID(address,string,string,address,uint256)","4c8d1e42":"DockCrowdsale(uint256,address,address)","4c8f3562":"computeCooldownSeconds(uint16,uint16)","4c8f4810":"buyMCT(address,uint256)","4c8fe526":"next()","4c90aaeb":"randomize(bytes32)","4c9151e6":"TransferStarted(address,address,uint256[],uint256)","4c922a9f":"changeColorPurple()","4c9297fa":"scheduleStart(uint256)","4c93505f":"setRevoke(bool)","4c9362aa":"addActiveUserListArr(address)","4c93c1a6":"GetUpTickPrice(uint256)","4c9478ce":"_yearThreeClaimed()","4c947c86":"getInitInputDataBytes(address,address,address,address)","4c94ac6a":"clearMilestones()","4c9599f2":"validityDate()","4c95baf3":"compoundingFreq()","4c95ca9c":"setRatePreICO(uint256)","4c95cb98":"OracleBase()","4c966822":"winnerWithdrawal()","4c96a389":"deploy(address)","4c96f0cc":"transferAllTokens()","4c96f281":"getAllPublishers()","4c97057a":"LogWinner(string)","4c970b2f":"foo(int256)","4c977972":"Soft_Cap()","4c97c836":"upgradeConstitution(uint256)","4c982872":"ElextroCoin()","4c985dfb":"newTokens(address,uint256)","4c98aec9":"CASHX()","4c990cc7":"startAirdrop(address[],uint256[])","4c9b30b4":"allow(bytes8)","4c9b60dc":"changeUserEthAddress(address,address)","4c9b760d":"changeMaxContribution(address,uint256)","4c9e2779":"balancesLocked2Y()","4c9e502e":"totalLoanAmount()","4c9ed763":"requestTokensBack()","4c9f166d":"bettingAllowed()","4c9f45eb":"repossessionBountyPerHundred()","4c9f66c7":"feePot()","4ca0a305":"GlobalIdolCoinToken()","4ca14270":"AddressChanged(string,address,address)","4ca15352":"airDropCount_()","4ca168cf":"register(bytes,uint256,address,string,uint256)","4ca18ebd":"reject(uint256,string,uint256)","4ca1c417":"isValidNameLength(string)","4ca1fad8":"addRequest(uint256)","4ca3a111":"getWeiPriceMicroKeys()","4ca3e9b8":"getProjectAddress(uint256)","4ca40518":"ReBornEnergyCoin(uint256,string,uint8,string)","4ca43f41":"transferAny(address[],uint256)","4ca50f59":"sellsTokens()","4ca5558c":"AllCaptcha()","4ca63a84":"TimeLimitedStoppable()","4ca64b3a":"bulkTransfer(address[],uint256)","4ca6ba2f":"AporooToken(uint256,string,uint8,string)","4ca6d7e6":"tier2Time()","4ca6fcfc":"registerVIP(address,address,uint256)","4ca7fbd0":"updateTokenPriceWeekTwo()","4ca82b52":"finalLoos()","4ca8b0d0":"registerExistingThrone(bytes,address,uint256,uint256)","4ca8c1e8":"isInMaintainance()","4ca92e08":"deductExtraBalance(address,uint256)","4ca98997":"getAmount(uint256,uint256)","4ca9b258":"contributorRefund()","4caa1a09":"_calculatePaymentToOwner(uint256)","4caa7f37":"withdrawSnowflakeBalanceFromVia(string,address,string,uint256,bytes,bytes)","4cad12e0":"orders_sell_price(address)","4cad3438":"setRateFinalStage1(uint256)","4cad42d3":"testWager()","4cae5f99":"loanRepaymentNotification(uint256)","4caeebd0":"STAGE_FOUR_TIME_END()","4caf6231":"COLOR_WHITE()","4cb0c7a1":"getOrdersOfVendor(address,uint256,uint256,bool)","4cb10ed3":"hasStartTimePassed(bytes32)","4cb44f8d":"getConfigEntryAddr(bytes32)","4cb532db":"socWarefareAddr()","4cb5465f":"transferWithLock(address,bytes32,uint256,uint256)","4cb5a45d":"GSUMedal()","4cb5ef77":"closeVoteRevealPhaseIfAllowed(address,bytes32,bytes32)","4cb5f1c6":"totalsum()","4cb6bf73":"FZTToken(address)","4cb6d6af":"finalizeCrowdsale(address)","4cb6f4a5":"voteRequest(uint256)","4cb71b9b":"getAllReleaseHashes()","4cb79536":"presaleStartBlock()","4cb7da65":"abortMatch(uint256)","4cb7dd6f":"popLeader(address)","4cb84b9a":"getIcoCap()","4cb85312":"_addInvestor(address)","4cb85356":"BranchSender(uint256,bytes32)","4cb88ad8":"ABEToken()","4cb93ff8":"capTokenAmount()","4cba4ca4":"updateGene(uint256,bytes)","4cba5c6a":"setResults(uint256[4])","4cba67ce":"addAddressToAccountForUser(address,bytes,bytes,address,bytes32)","4cbabcdc":"invest(bool)","4cbac3d2":"calculatePurchasedTokens(uint256,uint256)","4cbb4a0a":"_removeTokenFromAllTokensEnumeration(uint256)","4cbb7532":"setBorrowAgreement(uint256,uint256,string,string)","4cbbb987":"DOSXToken()","4cbc07f2":"weisPerBigToken()","4cbc49ad":"claimRewardManually(address)","4cbc82cd":"getTrackByArtist(address,uint256)","4cbd2b74":"allowanceByLegacy(address,address)","4cbe02a5":"createAuthorDrawings(bytes32,bytes32,address,string)","4cbe552c":"myEntityStructs(uint256)","4cbee813":"logout(string)","4cbf3d4c":"getNumbersOfPick(uint256,uint8)","4cbf6ba4":"hasDNSRecords(bytes32,bytes32)","4cbf867d":"intervalSecs()","4cbfafd9":"DefaultReleaseDelayed()","4cbfbf47":"REAPER_INTREPID_MAX_CARGO()","4cc05a71":"withdrawCount()","4cc09eac":"tokenRatePre()","4cc0a885":"maxRevealSeconds()","4cc0ee3c":"modifyDescription(address,string)","4cc22528":"setRateForOrder(bytes32,uint256)","4cc22f9d":"getSaleEnd()","4cc2a4bb":"_preValidateTransfer(address,address,uint256)","4cc2b5d0":"addPolicy(bytes32,uint256,uint256,uint256,string)","4cc2c0fe":"getTotalFor(uint256,uint256)","4cc3a6b0":"ConvertQuote(uint256)","4cc45f50":"changeAddressQueen(address)","4cc47910":"oraclizeQueryIdsToBetIndices(bytes32)","4cc53838":"getSaleContractTargetEtherMin(address)","4cc60757":"getOperator(address,address)","4cc6083a":"totalTrading()","4cc62409":"EOSOwned()","4cc653c8":"calculateDividends_(uint256)","4cc682ee":"getPubKeyHash(bytes20,uint8)","4cc747c8":"unlistAllOpenProposals()","4cc78983":"setPreviousDungeoonId(uint32)","4cc7a88d":"sendLoveToken(uint64,string,string,string)","4cc82215":"remove(uint256)","4cc87328":"adminWithdrawMiscTokens(address,uint256)","4cc885d4":"right65(uint256)","4cc9f4e1":"lockTokenController()","4ccb5a33":"canClosePot(string)","4ccb908f":"auctionSuccessBonus()","4ccbd06b":"MIN_DEPARTURE_LIM()","4ccbe888":"getLongExtra()","4ccbf17b":"presaleAddressAmountHolder()","4ccc4c36":"getPendingOracleFor(address)","4ccc5da0":"sold(bytes32)","4cccb7ba":"unrestrictedWithdraw(uint128,address,uint256,uint128)","4ccd0e1e":"Flippitt(string,string,uint8,uint256,string)","4cce4d63":"addNewCompany(string,uint256,uint256,uint256,uint256)","4ccee9b6":"getAddr(bytes32)","4cceeccd":"setFee(uint32,address)","4ccef7e0":"averageSoldPrice()","4ccf05cd":"CompanyTokenPushed(address,uint256)","4ccf8a35":"TokenSupplied(address,uint256,uint256)","4cd06a5f":"iterateNext(uint256)","4cd08d03":"register(string,string,string)","4cd11943":"NewManualInvestor(address,uint256)","4cd18a83":"gimmeEtherr()","4cd217b7":"getPreEntranceTo()","4cd273d1":"tilePrice()","4cd280bc":"popClient()","4cd28aa6":"_queue(address,address)","4cd2b343":"RedBlueToken()","4cd36fb7":"Mine(address,uint256,uint256)","4cd3745d":"getRandomClassId(uint256)","4cd412d5":"transferEnabled()","4cd44519":"stageTokensBought(uint8)","4cd52207":"_claim(address,uint256,bool)","4cd5af91":"CrowdFundClosed(uint256)","4cd5d776":"FundingWithdrawn(address,uint256)","4cd7699a":"eventCardRangeMax()","4cd85837":"mintICOTokens(address,uint256,uint256)","4cd88b76":"initialize(string,string)","4cd995da":"registerCompany(address,string)","4cd9c3e4":"crowdsaleEndsAt()","4cdabb16":"MAX_PREMIUM()","4cdb48e4":"isValidNym(address)","4cdc6a73":"Marriage()","4cdc9549":"_isApprovedOrOwner(address,uint256)","4cdc9c63":"genesisBlock()","4cdcb334":"transferrers(address)","4cdd3002":"setNote(uint256,bytes32,bytes20,string,string)","4cdd3b43":"getScoreForName(string)","4cddae28":"recharge()","4cdfc605":"Refund_user()","4ce0032f":"TutorialToken(address)","4ce01d86":"totalBetValue()","4ce02a33":"overdraftCliff()","4ce053ab":"approveAndPayout(uint16)","4ce0ef95":"getStatus(address,uint256)","4ce11c52":"children(bytes32)","4ce149d7":"setCandyLandSale(address)","4ce14f8c":"FOMOCoin()","4ce18d6b":"getAmount(bytes)","4ce18ec3":"addInterval(uint256,uint256,uint256,bytes32)","4ce197f3":"GetTempStuffExpire(address,uint32)","4ce1e317":"TeamAndAdvisorsAllocation(address,uint256)","4ce309f8":"getElection(address,address,uint256)","4ce37426":"EtherOlympics()","4ce4f927":"getJackpot(uint256)","4ce51b92":"WithdrawSpecialEth(address,uint256)","4ce56c5d":"ethAvailable()","4ce61604":"InitializedTier(uint256,address)","4ce63074":"test_increaseBlockBy5000()","4ce6962c":"numPurchasers()","4ce6a521":"emitAdditionalTokens()","4ce6a74e":"testerNonReentrant()","4ce7033d":"LogWithdraw(address,uint256)","4ce71fac":"getRegionPurchasePixelPrice(uint256)","4ce75274":"setEnableSell(bool)","4ce99591":"Vegan()","4cea7af0":"MembershipChanged(address)","4ceab75e":"newIdTank()","4ceab858":"multiplex_add(address)","4ceaeb35":"PleasePayMe(uint256,uint256)","4ceb0173":"to(bytes32,bool)","4ceba015":"LogCollect(uint256)","4cec73b1":"checkClaimTokenByAddress(address)","4cecac6d":"requestReward()","4ced0a26":"SetData(string,string)","4ced4734":"isPreSale()","4cedf74e":"get_party1()","4cedfc02":"TornadoChain()","4cedfc0c":"activateWhitelist(bool)","4cee81cb":"Marriage(address,address,string,string)","4cef0cb9":"usdPerEthMax()","4cef0ff6":"approveMore(address,uint256)","4cef2221":"ZazToken()","4cef5a5c":"negligibleRateDiff()","4cf00716":"getCreateFeeTokenFeeWindowValue()","4cf045d5":"addSoftwareExecRecord(bytes32,bytes32,uint256,uint256)","4cf0afca":"changeWallet(address,uint8)","4cf1115d":"ethFee()","4cf125de":"Ledger()","4cf127bf":"modelSupply()","4cf178c6":"POWEROFTHREE()","4cf2010e":"addCar(uint256)","4cf21f5f":"CFNDToken()","4cf2c2a2":"Dexter()","4cf2e2dc":"GameStart()","4cf32de3":"getNumTransactions()","4cf33010":"purchaseShare(uint256)","4cf373e6":"addFortune(string)","4cf37429":"AMOCoinSale(address,address)","4cf43440":"Megaloh()","4cf439d8":"_addToPools(address)","4cf4a292":"getHouseEdge()","4cf50009":"genesisCreation()","4cf52fa2":"buyBulkPremiumCar(address,uint256[],address)","4cf5b6c7":"millWeiRate()","4cf61aba":"_canTransfer(bytes32,address,address,address,uint256,bytes,bytes)","4cf6475d":"getPlayerShipCount(address)","4cf76cca":"thirdDiscountPrice()","4cf78170":"allowedAddress()","4cf812ea":"rateRoundSeed()","4cf8b0f5":"BlipToken(string,string)","4cf8dce7":"balanceOfOre(address)","4cf91026":"isAirdropping()","4cf93599":"getPaidInfo(string)","4cf95c21":"shareholderIsToken()","4cf96509":"safeWithdrawalAll()","4cfb4c28":"roundProfit(address,uint256)","4cfc4d30":"VESTING_DURATION()","4cfd5a82":"phaseOneLimit()","4cfddcfb":"getMarketOrderCategory(uint256)","4cfe3e7f":"debitAccount(address,uint256)","4cfe4c69":"getProviderRateHistory(uint256,uint256,uint8)","4cfe50cb":"BAFCToken()","4cfe59a7":"simulateWithdrawalAmount(address,address)","4cfe62c7":"transferRole(string,address)","4cfea68a":"blocksPerDay()","4cfef220":"getSpankPoints(address,uint256)","4cff5d75":"setTokenAllocator(address)","4cff6ae5":"AltToken(address)","4cff7a82":"createDefaultGames()","4d003070":"timestamp(bytes32)","4d015fcc":"Pong()","4d0217b7":"firstSaleComplete()","4d023404":"removeIntermediary(address)","4d02438b":"getMaximumBetHome()","4d02a8fb":"judgeFakeToken(uint256)","4d047055":"monsterIdToNickname(uint256)","4d053af6":"removeAds(address)","4d056f6d":"coolDown()","4d057803":"TEAM_LOCK_TIME()","4d05a822":"JusticeTokenV2()","4d06068a":"airdropToken()","4d0633f6":"assignedAmountToCornerstoneInvestment()","4d07b23d":"buyPrice(uint8)","4d08e0b4":"mediaTokensName(address)","4d0a32db":"minAmount(address)","4d0a391c":"addPayment(uint256,uint256)","4d0a5dbd":"addPermission(address)","4d0ad141":"CAP_USD()","4d0b2a29":"NUM_TILES()","4d0c381a":"Token99(uint256,address)","4d0c5be4":"redemptionLocked(address)","4d0c69d9":"EnterSwap(uint256,uint256,bool,address)","4d0cac9d":"sendCancelValue(address,uint256,bool)","4d0d1cb9":"processTransfer(address,address,uint256,bytes)","4d0d35ff":"getPlayerAddr(uint256)","4d0d80a2":"_getRandom(uint32)","4d0de225":"getWorkerBalance(address)","4d0e8a5f":"MYEX()","4d126774":"validateWhitelisted(address)","4d1271e3":"VersionedToken(address)","4d129486":"max_shares_to_sell()","4d129fb5":"startPre()","4d12b695":"unbanUser(address)","4d12fca4":"exchanger()","4d130369":"interestPaid(address)","4d130e64":"_collectFee(address,address,uint256)","4d134f2f":"createAddresses(bytes32[],address[])","4d13507d":"releaseFund(address)","4d1387b4":"changeRatio(uint256,uint256)","4d13a583":"PrepaidTokensClaimedEvent(address,uint256,uint256,uint256)","4d13c565":"bVideoCost()","4d13d134":"publicAllocatingToken()","4d140467":"EARLY_CONTRIBUTOR_VESTING_CLIFF()","4d14c57e":"claimBasicResources()","4d14e344":"numberOfChoices()","4d15642a":"startMEAMission(uint256,uint256,uint8,uint256)","4d15d797":"_exists(int256,int256)","4d1636c3":"onSold(address,uint256,uint256)","4d16dd41":"communityUnvested()","4d17ed11":"LUVIToken()","4d17f7fc":"sta()","4d182bfc":"getEpisodeDataRandom(uint256,uint256,uint256)","4d1975b4":"gameCount()","4d199766":"WEI_CAP()","4d19cdf8":"DME()","4d1a08cd":"MIN_LIMIT()","4d1a9763":"T8CToken(address)","4d1b93b3":"allowedTransferWallet()","4d1bc2df":"expertThreshold()","4d1bd1fa":"product2_luckybuyTracker()","4d1bfe99":"BenefitGameToken()","4d1c43b2":"ETHUSDPRICE()","4d1c5f83":"EditMode()","4d1ed74b":"maxGuaranteedLimit()","4d1f8c31":"owner(uint64)","4d1f97ba":"LastResult(address,uint8,uint256)","4d1ff181":"setPaymentEnabled(bool)","4d207d9a":"identify(address)","4d20b992":"setLargeCapWhitelistParticipants(address[],uint256[])","4d20d4bc":"BET_TYPEHASH()","4d21a24c":"generateLockId()","4d22b9c8":"DMSContract()","4d22d1d1":"vestTime()","4d2301cc":"getEthBalance(address)","4d238c8e":"addValidator(address)","4d23aaa8":"foreignBuy(address,uint256,uint256)","4d242bbc":"adjustTotalSupplyCheckpoints()","4d253629":"updateChangeAttemptCount(address)","4d25cc91":"transfer_token(address,uint256)","4d268ddd":"payImporterBankForGoodsBought()","4d27a548":"rICO(address,address)","4d28ca02":"addMultipleContracts(bytes32,bytes32,bytes32,bytes32,address[],bytes32)","4d298265":"isWhitelistedPresale(address)","4d2a16e6":"myTradeValue()","4d2a30c1":"customerDepositedEther()","4d2a99a5":"GVOptionProgram(address,address,address)","4d2b1444":"WAITING_TIME()","4d2c29a0":"tokenOfferingAddr()","4d2d0a3d":"token_totalSupply()","4d2d35bc":"TokenPartners(address,address,uint256)","4d2db81f":"alreadySold()","4d2e9d04":"ShowDepositInfo(address)","4d2ee8e7":"GetLoanInfo(uint256,bool)","4d2efe4e":"collectOwedDividends()","4d305073":"uintRound(uint256,uint256)","4d307e3f":"getCurrentReward(address)","4d30b6be":"balanceOf(address,bytes32)","4d314b5a":"ERC20MIST(uint256,string,string)","4d318b0e":"tallyVotes(uint256)","4d32a117":"documentsIds(uint256)","4d32ef8c":"hurifymint(address,uint256,uint256)","4d3314f4":"TotalFee()","4d33e6d7":"hasDisputeSolved(uint256)","4d341bbc":"findSubscriberIndex(address)","4d3465fd":"weicap()","4d34dce1":"AHS(uint256,bytes32,bytes32)","4d358a00":"PreSale(address,address)","4d366398":"runPeerBalance()","4d36dd87":"finalizeTransferChild(uint256)","4d37ec46":"__generateOrderHashes__(address[4],uint256[8])","4d380a0d":"revealBid(uint256,uint256,bytes32)","4d3820eb":"registerUser()","4d3830e5":"releaseFunds(uint16,address,address)","4d387d35":"lockAccount(address,address,uint256)","4d38f6c5":"signTruelove(bytes32,string,string)","4d3915e9":"testF3(uint256)","4d392341":"ICO_BONUS1_RATE()","4d392e49":"getSubjectById(uint256)","4d395384":"configString()","4d399cb3":"updateWhitelist(address,uint8)","4d39ed06":"initialFoundersAmount()","4d39f535":"transferFrom(uint40)","4d39fa7d":"getMultiplierAtTime(uint256)","4d3a01b1":"setLongAirdropPicker(address)","4d3a2f10":"lastReceivedMessage(address)","4d3b915e":"minTokenSale()","4d3bdb82":"KickcityToken()","4d3cd84e":"setCanAnyMint(bool,int256)","4d3ceef1":"freezeCheck(address,uint256)","4d3cf035":"tokens2ether(uint256)","4d3cfbcd":"NextStep(uint8)","4d3d096b":"isExist(string)","4d3d14f2":"calculateTransferFee(address,address,uint256)","4d3e7682":"DataSellToken()","4d3ec092":"LogReplaceToken(address,uint256)","4d3eff3c":"setICOSpec(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","4d3f0a6e":"becomeRenown()","4d3fac53":"getRatingRange(uint256,uint256,uint256)","4d40ed9c":"setSanMaxFree(uint256)","4d40f03c":"SovietCoin()","4d414c18":"Victim()","4d41fee4":"logit()","4d425812":"getCountryCount()","4d428204":"getTransferTime()","4d4282e9":"bytes32IsEmpty(bytes32)","4d42b0e5":"getUserLogin(address)","4d42c7e4":"getTotalIndividualWeiAmount(address)","4d42c952":"destroyedToken()","4d42fc66":"gen0Profit()","4d437034":"getInvestedTokenBalance(address)","4d437a62":"TPCToken()","4d4439fa":"ZipperMultisigFactory(address)","4d444fac":"isDepositAllowed()","4d4479a8":"FLC_address()","4d44f108":"checkProof(bytes32)","4d4549fb":"GDCNumber1()","4d4582a1":"submitChallenge(bytes32,bytes32)","4d461ed1":"completeSale()","4d46474a":"option10symbol()","4d474898":"mine(uint256)","4d474d63":"MAPT()","4d4765dc":"complete_buy_exchange()","4d47ae8c":"setPartyB(address)","4d47ce56":"seek(uint256,uint256,bool)","4d47feaa":"ShareholderDB(uint256)","4d480faa":"setMaxDelay(uint256,uint256)","4d486406":"addEmbassy(address)","4d492b50":"transferMulti(address[])","4d493f24":"maximumTokenIssue()","4d49451c":"candidateExchange()","4d4a919f":"bailout()","4d4aa77f":"getTicketDetails(int256,uint256,uint256,address)","4d4af36f":"setMins(uint256,uint256)","4d4b1a88":"addTokenTrust(address)","4d4b298e":"creditAccount(address)","4d4b3202":"getTrustedTransferSourceValue()","4d4ba1d7":"changeDivestFee(uint256)","4d4c277d":"MAINTENANCE_FEE_PERCENT()","4d4d2b1c":"hasVoted(address,address)","4d4eeaa8":"logoPng()","4d50169e":"distributionThresholds(uint256)","4d50d5f2":"firstPreSaleEndDate2()","4d51fad6":"Bittoq(uint256,string,uint8,string)","4d52a512":"getSoftCap()","4d536c03":"buySaleNonReferral(uint8)","4d536f9f":"validateNameExt(bytes)","4d536fe3":"doit()","4d53c30f":"t4tRaised()","4d547ada":"worker()","4d54dc96":"isNonlistedUser(address)","4d55a924":"KudosRouter()","4d561721":"etherandomSetNetwork()","4d562c82":"freezeProhibited()","4d56a130":"BitfuryToken()","4d586512":"_rand(uint256,uint256)","4d589c5b":"curatorIDOf(address)","4d58e413":"pushDividendPaymentToAddresses(uint256,address[])","4d597b2d":"totalTokensCompany()","4d5a1173":"calculateMaximumBurnAmount(uint256,uint256,uint256)","4d5a225c":"ethCoin()","4d5ad11e":"getAnnualGrantsLength()","4d5b0081":"reward(address,address)","4d5b080c":"scheduleTransaction(uint256,address,uint256)","4d5b335d":"mintHeroAsset(address,uint256)","4d5b608b":"testTransfer(address)","4d5b85f1":"createLighthouse(uint256,uint256,string)","4d5c07aa":"CryptoSim()","4d5d528a":"FeibeiContract()","4d5de6ba":"stageThreeSupply()","4d5e58a4":"purchasedTokensRaised()","4d5e9a2a":"getInterestRatePunitory(uint256)","4d5eceac":"nextAssigneeIndex()","4d5f327c":"supportsToken()","4d5fc38a":"amountOfGames()","4d610837":"indPreSale()","4d61537f":"secretSigner()","4d620299":"postSale(address,bytes32,uint256)","4d622831":"getLast()","4d624906":"PriceChanged(address,uint256,uint256)","4d628c44":"setWagerWinner(uint256,address)","4d62a9da":"MindCoin()","4d62f83c":"_distributeAuctionTax(uint256,address)","4d655aff":"db()","4d65beb1":"getVipInfo(uint256)","4d66a3ab":"testtxorigin()","4d66d44d":"ArtToujourICO(uint256,uint256,uint256,uint256,uint256,address)","4d677d32":"Manager(address,address,address)","4d6804c2":"transferTokensFromVault(address,address,uint256)","4d68282f":"releaseFunds(uint256)","4d689543":"mmLibAddress()","4d6a26be":"tryOpenRoom(address,uint256,uint256,uint256)","4d6a7d33":"collect(address,uint32[])","4d6a813a":"isCutieCore()","4d6aa2e5":"generateReferralAddress(address)","4d6aed53":"getIssued()","4d6b3d83":"Brave()","4d6bc04e":"totalPerTokenPayout()","4d6c3427":"REGULAR_TYPE_COUNT()","4d6c3b6b":"setCompte_4(string)","4d6f58d5":"proveOwnership(bytes,int256)","4d70d1d7":"generateId(uint256)","4d712228":"Storesumdata(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,uint64)","4d71d6be":"finalizeDelegation()","4d720209":"withdrawDistributionCRL()","4d722c4c":"checkWinner(address)","4d729be4":"calculateFishermansFee()","4d730d51":"numOfPurchasedTokensOnEpBy(address)","4d73452e":"START_WEEK_3()","4d7439cb":"getBusiness(uint256)","4d7480ea":"_allowPublishSecret()","4d74d3b4":"setMetadataContractAddress(address)","4d754715":"burningEnabled()","4d7559a8":"totalGoldSupply()","4d7569ac":"TOKEN_SUPPLY_CROWD()","4d77551a":"eleventhTime()","4d782655":"confirmCertificate(uint256)","4d782cbc":"executeSellOrder()","4d78fdc6":"unblockAccount(address)","4d794cfc":"START_ETH_TO_CENTS()","4d79874e":"validateLandTakeover(address,uint256,uint256)","4d79ddb2":"getVotesForItemFromVoterIndex(uint256,uint256,uint256)","4d7a7577":"DURATION_VIPPLACEMENT()","4d7ad1dd":"deleteProposal(bytes32,string)","4d7ad205":"gasRewardPercent()","4d7b8d2f":"DWBTICO(address,address,uint256,uint256,uint256,uint256)","4d7b9bd5":"checkBalance(address,uint256)","4d7ba587":"setDecider(address)","4d7bc8c9":"removeCompanion(address)","4d7c0192":"changeCanUpgrade(bool)","4d7c7485":"getActiveFlag(uint16)","4d7d003f":"dropCoinsSingle(address[],uint256)","4d7d13e1":"getUniqueIdOfPlayerByPlayerAndCountryID(uint256)","4d7d87b2":"prodTokens(address,uint256)","4d7d8a60":"marriageDate()","4d7d9a91":"transferCoadminship(address)","4d7dcfbd":"parseVarInt(bytes,uint256)","4d7e2a6a":"Token_Unlocked()","4d7e897f":"rollOne(address,uint8)","4d7ec628":"requestToken()","4d7ece70":"advisorVesting(address[],uint256[])","4d7edc15":"assignTokens(address,uint256)","4d7ee4ee":"changeGlobalOperator(address)","4d804e60":"WITHDRAWAL_TRIGGER_AMOUNT()","4d80bf14":"NewManager()","4d82f25c":"VestingTrustee(address)","4d831535":"allocatePVT_InvTokens(address[],uint256[])","4d83ffdd":"createUser(address,uint256,bytes32)","4d840bcc":"isWithdrawable()","4d843acd":"getSalaryTokensTotalAddress(uint256)","4d846a99":"getMin(uint128[])","4d846c8e":"getCurrentCandyAmount()","4d84ba37":"depositsAddress()","4d85006d":"Incredibles2RT()","4d853ee5":"founder()","4d8589c5":"getProofOfStakeRewardUpdateToken(address,address)","4d85b8d0":"checkEndOfChallenge()","4d86b498":"BucoTestCoin()","4d87a49b":"updateInvVault(uint256,uint256)","4d882c97":"EthPenis()","4d88a639":"getOrder(uint80)","4d88a8cf":"getExitBySlotId(uint64)","4d894d24":"getLevelByIndex(uint256)","4d8a666b":"EnterEntidadesdonaciones(address)","4d8a9310":"isCrowdsaleStopped()","4d8b7056":"Dd(address,address)","4d8bd784":"getGuestToken()","4d8c10a6":"AJCMToken()","4d8c3ea6":"getTxVoteDetails(bytes32)","4d8c61c1":"LogChangeTimestamp(address,uint256,uint256)","4d8caa7e":"setTokensPerWei(uint256)","4d8d9e92":"tokensPerSecond()","4d8dcc7a":"initDeposit(uint256)","4d8de4fc":"unbond(bytes32,uint256)","4d8e15f2":"KockToken()","4d8f00f4":"RatingsContract(address,address)","4d8fef1c":"produceWiner()","4d908a55":"InitiateCars()","4d909110":"EtherBank()","4d912393":"mintReservation(address[],uint256[])","4d918282":"addmoney(address,uint256,uint256)","4d91c096":"stakeCommence()","4d91d4f1":"incrementBasketsMinted(uint256,address)","4d9250c4":"TakeMyEther()","4d936889":"ConsentTemplate(string,uint256,string,string,string)","4d93d1db":"EventCreateAngel(address,uint64)","4d94994c":"lucky_number()","4d94cee7":"opetWallet()","4d9577af":"getFirstMilestoneStartsAt()","4d95a7a2":"tokensToRecieve(uint256)","4d95c76c":"activeCanvasCount()","4d964da6":"GBBCOIN(uint256,string,string)","4d96e062":"whenStakeCanBeReturned()","4d986c8f":"icoSalesSupply()","4d98a6ff":"createGroup(string,string,string,uint256,uint256,uint256,uint256,uint256,bool)","4d99055c":"getBonus(uint256,address,uint256)","4d9994e8":"setAccountNickname(string)","4d999756":"tokensPreICO()","4d9a3136":"findByName(string)","4d9a81d4":"IsDistribStarted()","4d9aa424":"crowdsaleEnd()","4d9b3735":"getFunds()","4d9b3d5d":"getbalance()","4d9b8fcf":"allowTransfer(address,bool)","4d9bcac4":"getProviderParameter(address,bytes32)","4d9c1bf3":"payTokenBatch(bytes32[],uint256[],address,address,bytes)","4d9e40af":"TOKEN_CREATORS_SUPPLY()","4d9e4e22":"Etheria()","4d9fb121":"Trade()","4d9fcee9":"getExportingAuthority()","4da07fe5":"getCardType(uint32)","4da0a4fc":"promoToken()","4da1397c":"durationOfLock()","4da1668d":"giftNFT(address,uint256,uint256)","4da1b25d":"weiFundingCap()","4da1e0b7":"cancelTokenSale(uint256,address,bool)","4da2317f":"payoutAll()","4da25c74":"triCmp(uint256,uint256)","4da2906b":"updateUser(bytes32,bytes32,bytes32,bytes32,bytes32)","4da2b48e":"getCat(uint256)","4da36913":"migrationIndex()","4da3b6db":"otherF3D_()","4da47ba0":"TokenSale(address,uint256)","4da51208":"OKMcoin(uint256,string,uint8,string)","4da5160f":"getFirstDocumentIdStartingAtValidFrom(uint256)","4da5598a":"syndicatePrecision()","4da5d4c0":"isEthernautsExplore()","4da5ed85":"disableContinuousDelivery()","4da74ee6":"setVoteIntention(uint256,bool,bool,string)","4da7c5d6":"LendingBlockTokenEvent(address)","4da837e3":"transferDevelopment(address)","4da845b3":"swapWinner()","4da8a771":"INHERITANCECrowdsale(uint256,uint256,uint256)","4da946d9":"TakeOffWorldwide()","4da9cb07":"LilithToken(uint256,string,string,uint8)","4daa1208":"SetPoolCreationFee(uint256)","4daaa98f":"doReward()","4daade18":"TravelCoinToken()","4daadff9":"extractCLNfromMarketMaker()","4dab54fd":"removeFromInxWhitelist(address)","4dab63ff":"_unpackItemData(uint256)","4dabb674":"changePhaseToNormalLife()","4dac7d6f":"renewableOf(uint256)","4dad66f5":"divForTank()","4dad9003":"transferManyLand(int256[],int256[],address)","4daea42a":"TOWN_INCREASE_RATE()","4daf490c":"getFarm()","4daf890a":"invokeLottery()","4dafdc50":"exchangeId()","4db0040e":"createWonderNotAuction(string)","4db08aea":"SALE()","4db08e5b":"getSaleContractTokensMinted(address)","4db19e7e":"assertEq(bool,bool,string)","4db1ba5a":"repossessionBountyPerTen()","4db1c7b2":"changeId(uint256,uint256)","4db208ba":"Titanization()","4db2beef":"distroyToken(uint256)","4db347a3":"acceptChallenge(address)","4db3c6d7":"buyTokensWithReferal(address)","4db3da83":"scheduleCall(bytes4)","4db3eef8":"delegateFromBonus(uint88)","4db4eae6":"_topBonus()","4db4eff0":"hatchCoins(address)","4db52924":"setNumMessagesSigned(bytes32,uint256)","4db53a70":"VTest()","4db59565":"getHistoryRoundInfo(uint256)","4db5d52b":"getWagerOwner(address)","4db61d21":"compareNoCase(string,string)","4db6397f":"calculatePlayerValue(address)","4db77d9d":"getMaxJump(uint256)","4db8349e":"buyerToSentWeiOf(address)","4db8cbc9":"wordCounter()","4db94441":"limitAgentBets()","4db9bfe6":"getPostVoteCount(uint256)","4dbaa16b":"recoverLeftoversPreICO()","4dbac733":"INITIAL_RATE()","4dbb1964":"setSalesAgent(address)","4dbb37eb":"checkLeftToken()","4dbb4da5":"increaseMaxContribTime()","4dbb51f6":"Hashfex()","4dbbddff":"BOBTokenVesting(address,uint256,uint256,uint256,bool)","4dbbfcc6":"stageLength()","4dbc355a":"releaseTeam()","4dbdb0fd":"signUpForPVP(uint256)","4dbddc18":"getPoolID()","4dbe5889":"ownerClaim()","4dbf27cc":"follow(address)","4dbfb6fb":"PredictionMarket(uint256)","4dc0884f":"playerCards(uint256)","4dc08ce2":"GameWon(uint256,address)","4dc133a5":"stopTge(bool)","4dc13951":"vendingAttachedState()","4dc189ef":"createContractWhale(string)","4dc18c02":"finalSendTokens()","4dc1dbec":"priceToMint()","4dc266b4":"submitAnswerReveal(bytes32,bytes32,uint256,uint256)","4dc2c67a":"veriPass(string)","4dc3141b":"CalcAll()","4dc3ba8f":"assignVoterMoreVotes(address,uint256)","4dc3f289":"changeCommonDiscount(uint256)","4dc41210":"preStartTime()","4dc415de":"reject()","4dc43eaf":"setTreasury(uint256,uint256)","4dc49b25":"InitialPointUnit()","4dc59196":"icoAllocation()","4dc5c69f":"getTotalDiscount(address)","4dc5c771":"dividendsAccount()","4dc5fa4e":"MEDIA_SUPPORT_WALLET()","4dc65411":"GEM()","4dc666b3":"sendTokensManually(address,uint256,uint256)","4dc6b523":"divestFee()","4dc73428":"transferFromByModule(address,address,uint256,bool)","4dc7cc55":"terminateAlt()","4dc7d31b":"transferRwrd(uint256)","4dc8ed02":"ICObonusStages(uint256)","4dc958e1":"addToBounty(uint256)","4dc996d5":"updatetoken(string,string,string,string)","4dca2770":"BecomeMemberCandidate(bytes32)","4dcad927":"tokensSoldTotal()","4dcb05f9":"depositBond(uint256)","4dcbb8ee":"getAllAuditors()","4dcc889d":"Conference(string,uint256,uint256,uint256,string)","4dcd4fb1":"MetaChanged(bytes32,bytes32,bytes32)","4dcd85d8":"setPriceOfApis(uint256)","4dce4142":"opVaultAddr()","4dcee2e0":"hashes(uint16)","4dcf2917":"allowUpgrades()","4dcf7430":"receiveTokenLoot(uint256[],uint256,uint8,bytes32,bytes32)","4dd0f157":"getWinnerType(uint256)","4dd12329":"rightSharePrice()","4dd19434":"getLeaf2(uint256)","4dd1e81c":"tokenBuyable(uint256,uint256)","4dd33832":"tokensSoldAtIco()","4dd36a0e":"buyTokens(uint8,address)","4dd37f19":"getHashRateOfCurrentHalving(address)","4dd3e575":"endMinting(bool)","4dd4547d":"fireOnChanged(bytes32,uint256[])","4dd49680":"SetEvaluate(uint32,uint8,uint8)","4dd49ab4":"get(bytes,uint256)","4dd49e08":"deliverTokens(address,uint256)","4dd5df8c":"setPOOL_edit_16(string)","4dd60ff9":"buyNDC(uint256,uint256,uint8,bytes32,bytes32)","4dd7f293":"Kayako()","4dd83243":"hasNextKey(uint256)","4dd83cb1":"refreshPublicFundingTime(uint256,uint256)","4dd850fb":"UfoPonzi()","4dd8aefd":"DTT()","4dd93bd3":"getInvestmentValue()","4dd9e437":"transferUserToUser(address,address,address,uint256)","4dda1764":"CafeMaker()","4dda71a8":"newAuction(uint128,uint256,uint256)","4ddad616":"genesMarket()","4ddb5f01":"ROPCOIN()","4ddbf2b3":"teamTokenFund()","4ddc36df":"renounceClearingPriceValidator()","4ddc8f74":"SPEX()","4ddd108a":"money()","4ddd648b":"buyer_profit_pool_amount()","4ddddd4c":"SearchIPR(string)","4dde3fe1":"redemptionAddress()","4dde8de6":"registerUBetCheck(address,string,string,string,uint256,string,int256)","4ddfd20f":"offer_id()","4de0089a":"becomeHipstermaster()","4de037c7":"getTitulaire_Compte_8()","4de0cdf2":"setICOParams(uint256,uint256,uint256)","4de1454f":"targetReached(uint256)","4de16053":"getLockProductCount()","4de162e4":"extractAccountLength()","4de1fc55":"submitAnswer(uint256[],uint256[])","4de2578c":"reproduce(uint8,address,uint256)","4de260a2":"hack()","4de261ef":"presalecap()","4de2d5d5":"checkPrize()","4de2eee9":"zapVillain(uint256,uint256)","4de2f146":"SentAmountToNeighbours(uint256,address)","4de315ea":"unlockAddressToken(address)","4de4145f":"_transferSenderPaysFee_byProxy(address,address,uint256)","4de4f479":"RiskPrice()","4de504cd":"setTransferLockFree()","4de5120e":"lastWithdrawalTime(address)","4de62cd6":"removeGemmyMusicLock(address)","4de799c2":"cancelTeamWithdrawal()","4de85639":"failDivideFractionalByZero()","4de8a799":"addPrivateSaleBuyer(address,uint256)","4de90f34":"minForNewTopic()","4de94320":"logic_contract()","4de946bf":"ideaProofDocument(bytes,uint256)","4de952c7":"cmulpow2(address,uint256)","4de970fd":"RATE4()","4de9e482":"ENDHarvest()","4dea208b":"upgradeKingdomType(string,uint256)","4dea4d15":"setConfig(uint64,string,uint256,uint256,address,string)","4deaad5f":"reverseBytes(uint256)","4deb68a3":"auctionStart(bytes32,uint256,uint256)","4deb9f47":"UnlockRig(uint8)","4deba2e0":"LogCreateToken(address,uint256)","4dec5dc4":"employeeExerciseOptions(bool)","4dec9b57":"testView()","4ded452e":"InviteCreated(address)","4ded6e89":"airdropParticipants()","4ded9bfe":"releaseMultiAccounts(address[])","4dee529a":"Muggelo()","4def0453":"setContentURI(uint256,string)","4defd1bf":"setCrowdsaleManager(address)","4df0b78a":"withdrewThisYear()","4df0ca7e":"EarlyAdoptersAddress()","4df17cdc":"maxEtherInvestment()","4df28ae4":"capTime()","4df34124":"RyxEx(address,address,address,uint256,uint256,uint256)","4df3ad68":"setTokenPriceInCent(uint256)","4df498b2":"getPreSaleEnd()","4df53a0f":"testSetApprovalDb()","4df62441":"percentOfPresaleSold()","4df65873":"getDefaultRgb(address)","4df679e3":"BonusAllocation(address,string,string,uint256)","4df68ada":"enable(bool)","4df6b45d":"delegateTransferFrom(address,address,uint256,address)","4df6ca2a":"setQuestionFee(uint256)","4df6d6cc":"allowedRecipients(address)","4df7e3d0":"b()","4df86126":"SECONDS_PER_HOUR()","4df93196":"Joe223()","4dfa2722":"CryptoWuxiaVoting()","4dfa3f18":"createNewUser(string,string)","4dfad511":"_redeem(address,uint256)","4dfb10bc":"realVotedSupply()","4dfb4807":"etherTotal()","4dfc7aa1":"existsDistrito(uint256)","4dfc97c5":"policyTokenBalance()","4dfcf67a":"NeroSupply()","4dfd14b2":"EMACCrowdsale(uint256,uint256,uint256,address,address)","4dfd1b02":"setUint8(int8,uint8)","4dfd964f":"TSTCallAPI()","4dfdc21f":"maxNum()","4dfdebe9":"ClientQty()","4dfe28e7":"releasedTokenOf(address)","4dfe950d":"purgeUpgrade()","4dfff04f":"approveSiring(address,uint256)","4e010942":"LogOraclizeCallback(uint256,bytes32,string,bytes)","4e0128fb":"watchPrice()","4e012918":"whitelister_address()","4e017994":"capEth()","4e01bb60":"RefundPeriodOver()","4e01bd10":"emergencyTokenWithdrawal(uint256)","4e02107a":"getWeddingData()","4e022f11":"setSpark(address)","4e023fc9":"FakeXUC()","4e028c67":"SAC()","4e02ed40":"CESCoin(uint256,string,string)","4e039d26":"setPreallocationWhitelist(address,bool)","4e0416a6":"DaoRulesProposalAdded(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,address,uint256)","4e054a67":"setBlacklist(address)","4e05ded6":"ClassicCheck()","4e06369c":"getPurchasableAmount()","4e077f2a":"addGasEther()","4e07a7a5":"thirdStageMinted()","4e088eb7":"stopPrivateSale()","4e0896a1":"teamIndexToExist(uint256)","4e0a0f21":"preICOstartTime()","4e0a3379":"setCFO(address)","4e0ade00":"SmartWallet(address,address,address)","4e0b7888":"_updateStage()","4e0ba39d":"reserveAdd(uint256,uint256,uint256,uint256)","4e0be991":"removeChild(address,address)","4e0c4a9c":"setCommissioner(address)","4e0ce969":"moduleToken(uint256,uint8)","4e0d93a3":"increasePriceForNeighbours(uint256)","4e0e9675":"isIdentity(address)","4e0f1064":"getMonthlyTransactionVolumeReceiving()","4e102951":"can_claim(address,address,address)","4e1053cc":"RobinHoodPonzi()","4e10c212":"TxAttackWallet()","4e10c3ee":"transferWithoutReward(address,uint256)","4e116eb8":"unRegisterCertificationDb(address)","4e1243b6":"AddClaim(uint32,string,bytes32,bytes32,address,uint32)","4e12e51a":"getBonusList()","4e1339fe":"HALT()","4e13f066":"RedSoxRays48()","4e140274":"isDiscount()","4e1415ab":"testThrowExecuteSellOrderDaoChallengeRefusesZeroFunds()","4e14e4c8":"CyberCapitalInvestToken()","4e153418":"CreateLottery(uint32)","4e159a05":"clacCooperateNeedLockAmount(uint256)","4e15dfe9":"wholeTokensPerEth()","4e16bef5":"jack_max()","4e16e0c7":"participantCanParticipate(address)","4e18405d":"TOTAL_ARK()","4e18c1a7":"IcoPhaseAmountsChanged(uint256,uint256,uint256,uint256)","4e191701":"lamboPresaleAddress()","4e194cc0":"getCreateFeeToken()","4e195faf":"totalEthereumRaised()","4e19c112":"deleteOwner(address,uint8)","4e1a150b":"netherToken()","4e1a1853":"ParentCoinAddress(address)","4e1a50b7":"setBonuses(uint256,uint256,uint256,uint256)","4e1bdfdf":"withdrawOlder()","4e1dc0d7":"LAYA()","4e1f6c14":"FUTURE_WALLET()","4e1fa837":"TestERC721()","4e205cee":"signedApproveAndCallHash(address,address,uint256,bytes32,uint256,uint256)","4e209678":"testFailBreach()","4e2133ba":"addExchangePartnerAddressAndRate(address,uint256)","4e21f25e":"soldPresale()","4e22102b":"LIMITS_END_DATE()","4e2280c4":"clearQuickBuyPath()","4e228d8f":"ExchangeableToken(address)","4e23176c":"buyRBCTokens()","4e232730":"ownerOn(address)","4e233065":"delKeyValue(uint256,bytes32)","4e23a144":"fundUser(address,uint256)","4e25658e":"setSegment(string,uint32,uint32,string,string,string,string)","4e2567d0":"addToAccountList(address)","4e25c92e":"ttlSply()","4e2611ae":"vnetToken()","4e2659a8":"createTeam(bytes32,bytes3,bytes3,bytes3,bytes3,bytes3,bytes3)","4e26c95e":"EASYLIFE(uint256,string,string)","4e272768":"remove_bounty()","4e2743b3":"setStack(uint256,uint256)","4e275295":"tokensSell()","4e2786fb":"roundNumber()","4e27e916":"voteLock(address)","4e2808da":"cancelOwnership()","4e280fd6":"SolarioToken()","4e284af1":"INCENT_FUND_NON_VESTING()","4e285acb":"setsendgoods(uint256)","4e29cba6":"disbursements(uint256)","4e2a953a":"gameStartedAt()","4e2aae36":"setzUint256(uint256,int256)","4e2ab933":"transferFrom(address,address,uint256,bytes,string)","4e2ad943":"mainSaleBonusEndTime()","4e2b57fe":"mincap()","4e2ba115":"DFVToken()","4e2bd9ce":"rescind(address)","4e2bdfd4":"getBetMutableData()","4e2c9524":"upgradeDuties()","4e2de9e1":"setGzeBonusOffList(uint256)","4e2e8a10":"setTime3(address,uint256)","4e2e94f7":"MAX_PRE_SALE_AMOUNT()","4e2f220c":"createCentralizedOracle(bytes)","4e2f2af4":"PayoutRedemption(uint256,uint256,uint256)","4e2fa68f":"crowdsaleStarts()","4e2fd44e":"setPriv(address)","4e304bfb":"CRAIC()","4e30506f":"dropLast()","4e30a66c":"safeToAdd(uint256,uint256)","4e317ead":"cancelTemplateProposal(address,uint256)","4e31aea3":"firstThawDate()","4e329bd3":"HealthCoin(uint256)","4e358ce7":"DITCOIN()","4e35aacf":"createCompany(string,uint256)","4e360eaf":"EmergencyStopActivated()","4e3673a6":"connectCrowdsaleContract(address)","4e36fddf":"XdacTokenCrowdsale(address,uint256[],uint256[],uint256)","4e37af4e":"offlineCallback(bytes32)","4e38413f":"setBytes32(bytes32,bytes32,bytes32,bool)","4e385512":"setCampaignValidity(bytes32,bool)","4e38f205":"generateWithdrawalHash(string,uint256,address)","4e390f2a":"initLottery(uint256,uint256,uint256,uint256)","4e395e2a":"isExecutable(uint256)","4e3acafe":"Cr1tikalIsShort()","4e3b33d4":"prepareRefund()","4e3b52fe":"metaCoin()","4e3c2f47":"getCardDivs(uint256,uint256)","4e3c50a0":"addBuyTokensRequest(address,string,string)","4e3d2745":"ManoloToken()","4e3d539a":"newChainlinkWithENS(address,bytes32)","4e3dc2f1":"STAT_MAX()","4e3df857":"removeEA(uint32)","4e3e4035":"notEqual(int256,int256,string)","4e400bda":"getSenderStatus(address,uint256)","4e406167":"setContractICO(address)","4e4081ef":"pregnantBots()","4e41108d":"Bank()","4e417a98":"callData()","4e41a1fb":"symbol(uint256)","4e41ebf6":"createCommissionerAuction(uint32,uint256,uint256,uint256)","4e42b632":"WEBcoin()","4e43502a":"BDSMTOKEN(uint256,string,uint8,string)","4e43603a":"getUserStats(address)","4e448ffa":"winnerLuckyNumber()","4e44b5cc":"Kiwi(address,uint256,string,string,uint8,uint8)","4e44c855":"setGameStatus()","4e44d956":"configureMinter(address,uint256)","4e458cc2":"setNewEndTime(uint256)","4e458eb6":"posstoken()","4e45fba9":"getProviderDetails(address,uint256)","4e46fc2c":"finalizePreICO()","4e47d99a":"WubCoin(address)","4e485c52":"closeTransfer()","4e48a495":"checkTransfer(address,address,uint256,uint256)","4e4965ff":"AIPAY()","4e49954e":"createReceipt(address,string)","4e49acac":"setParams(address)","4e4ab830":"amIOwner()","4e4ac577":"claimFeesForRound(address,uint256)","4e4afa1b":"minimumTickets()","4e4cf65c":"forwardMoney()","4e4d02db":"DeathFactor_iii()","4e4d3e56":"get_funds_left_for_reinvestment()","4e4e2d6d":"PaymentForwarded(address,uint256,uint128,address)","4e4e7862":"addWithdrawal(address,address,uint256)","4e4f776c":"TCT(uint256,string,uint8,string)","4e4fbee1":"renounceProxyManager()","4e4fe306":"getData(uint256,uint256)","4e500760":"CreditUnits()","4e504313":"Addr3()","4e505367":"initialTokenAmount()","4e51193b":"sealTimestamp()","4e5141eb":"buyTokens(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)","4e5146a9":"hexToAscii(uint8)","4e520a94":"getNumRecords(address)","4e521a2a":"INCUToken()","4e523b91":"MonethaToken(address,uint256)","4e52622b":"eth6DivsOwing(address)","4e52678e":"digix()","4e53a0b9":"update(address[],uint256[],uint256[],uint256[])","4e53b564":"adminTransferContractBalance(uint256)","4e542bff":"_triggerPVPSignUp(uint256,uint256)","4e542c5f":"deleteById(uint256)","4e543b26":"setResolver(address)","4e5497de":"BuyoutDividend(address,address,uint256,uint256,uint256)","4e55936d":"NorthPoleMintingEnabled()","4e56925f":"updateMasternodeAsTeamMember(address)","4e57d27d":"_getAllRevisionTimestamps(bytes20)","4e58e920":"officialFacebook()","4e599551":"getPreviousWinners()","4e59f947":"SucToken()","4e5a33c5":"executeTokenRepartition(uint256)","4e5aabe6":"resetStellarBalance()","4e5ac744":"PDPCoin()","4e5acb1a":"changeAutherOwner(address)","4e5b0d29":"getVisaEntered(address,uint256,uint256)","4e5b3cb8":"EtherusPreSale(address,address,address,address)","4e5b5f54":"purchasePresale(address,uint256)","4e5c0595":"tokenAdvisorsAllocated()","4e5d49a0":"DariumToken(address)","4e5d7186":"LogAccountRegistered(address,address,bytes32,bytes32,bytes32,bytes32)","4e5d793f":"setAsset(address,uint256,uint256,uint256)","4e5d8edd":"VOLUME_70()","4e5ed65b":"_indexAccount(address)","4e5f13bc":"landPriceCurrent()","4e5f8751":"newInvestWallet(address)","4e605688":"setBtcBuyer(address)","4e6093f8":"HeirChanged(address,address)","4e6106c5":"getRealisation()","4e61c362":"transferMul(address,uint256)","4e61df06":"DigixbotEthereum(address)","4e61efc5":"getWizzTypeOf(uint256)","4e637fab":"DepositsTransferred(address,uint256)","4e659145":"levPerUser()","4e6630b0":"ethBalance()","4e68354e":"LogLockStateTransition(uint8,uint8)","4e6885f3":"depositPresale(address)","4e6944cf":"totalStaticoinSupplys()","4e696d3c":"startCoinSale(uint256,address)","4e69d560":"getStatus()","4e6ab570":"insert_order(address,bool,uint32,uint128)","4e6b29ee":"returnIsParentAddress(address)","4e6b558a":"removeVerifiedAddress(address)","4e6b97f3":"transferMultiSameVaule(address[],uint256)","4e6ba0a9":"testCreateCostMultisig()","4e6c61aa":"testFailAddForeignChildNotChild()","4e6d1405":"invoices(uint256)","4e6d35ea":"currentlyReleased()","4e6d739d":"getSupernovaBalance()","4e6d73da":"LogUserUserRemovedFromWhiteList(address)","4e6e5d69":"unMint(address)","4e6e6928":"latestFriend()","4e6ec247":"_mint(address,uint256)","4e6f42ba":"changeSeizedTokensWallet(address)","4e6fedb7":"remainOfStage(address,uint256)","4e705549":"setDefinition(uint8,uint8,uint8,uint8,uint8)","4e7073f1":"setMinETH(uint256)","4e70a604":"Withdrawal(uint256)","4e70b1dc":"num()","4e7196c7":"setReg1(uint256)","4e71d92d":"claim()","4e71e0c8":"claimOwnership()","4e724f0f":"numBlocksLocked()","4e725b7a":"test_hasClaimableShares_nonZeroClaimableStake()","4e72ec91":"setPointer(uint8)","4e72f19e":"SendFundsToReceiver(uint256)","4e730025":"register(uint256,uint256,uint8,uint8,uint8,uint8,string)","4e7343ea":"verifyOrder(address,uint256,uint256,address)","4e7344d5":"ABitcoin()","4e7355d6":"RegistrantRemoval(address)","4e7445c8":"drainRemainingToken(address)","4e7455d0":"createMilestones(uint256,bool,uint256)","4e7602d3":"setRecipients(address[])","4e761a91":"STEP_SIZE()","4e76a725":"test_withAssertTrue()","4e76a846":"numParticipants()","4e76f5d2":"GetMinimumBet_ether()","4e77a38e":"releaseTrickleDownBonuses()","4e78e0c2":"setVerificationSlashingPeriod(uint256)","4e79909c":"WithdrawalApproved(uint256,uint256,bool,uint256,bytes)","4e79fd7c":"stepLockedToken()","4e7a540b":"doUpgradeInternal(address)","4e7a6978":"PersianTokenICO(uint256,uint256)","4e7ad367":"fireEventLog1Anonym()","4e7b1ce1":"PayNihilumToContract()","4e7ceacb":"getFeeAddress()","4e7cff38":"toBytes20(bytes,uint256)","4e7d656a":"EtherSpermBank()","4e7dbb29":"TTARD()","4e7e96f1":"buyBackInvestedValue()","4e7ec0e4":"setGlobalTimeVault(uint256)","4e7ec7e3":"RANGEEND_6()","4e7f1264":"leaveMessage(string)","4e7f9b19":"getReport(uint256)","4e80f241":"YCStandardToken(uint256,string,uint8,string)","4e8127f6":"icoSupply()","4e815698":"removeBlacklistAddress(address,address)","4e8182c8":"addJugada(uint256,string,string,uint256,uint256)","4e81b17d":"createMonthlyBill(uint8,uint256,uint256)","4e81eec9":"EventProductEndSale(uint32)","4e8204a4":"NewRoundStarted(address,uint256,uint256,uint256,uint256,uint256,uint256)","4e82844d":"countWishes()","4e82c134":"getAddressFromUsername(string)","4e83977a":"validationWallet()","4e840bea":"IGTToken()","4e84c614":"getWaitingState()","4e860ebb":"disableTokenIssuance()","4e876ecc":"directSellRate()","4e87c715":"DEFAULT_INITIAL_COST()","4e880082":"distributeTheSameAmountOfTokens(address[],uint256)","4e89eb98":"bonusDicrement()","4e8a411b":"deallocate(address,address,uint256)","4e8afc5f":"getRegister(string,bytes32)","4e8b759c":"BuyOrdersOf(address,uint256)","4e8b75d0":"IRtokenChain(uint256,string,string)","4e8be64d":"TokenToken(uint256,string,string)","4e8c2927":"FreeToken()","4e8eaa13":"cancelAuction(uint256,address)","4e8ec73e":"jockeyPr(uint256)","4e8f05d1":"setGrowthTokensWallet(address)","4e8f7fdf":"allocateTokenForTeam(address)","4e8fb35c":"referralBountyTokensAddress()","4e91025e":"Liquidate(address,uint256,uint256,uint256,uint256)","4e91ca3a":"updateModuleStatus(address,bool)","4e91db08":"setBytes32(bytes32,bytes32)","4e91f906":"getNewPetCard(uint8,uint8)","4e922731":"calcRefBonus(uint256)","4e926eab":"getInviteePIDs()","4e9282af":"setBDApprove(uint256,bytes)","4e930483":"addbtycmoney(address,uint256)","4e9384da":"addSecondPreferences(bytes32[],bool)","4e938539":"preSaleSecondBonus()","4e93bf32":"maximumBuyBackAmountInWEI()","4e9466f7":"withdrawToMany(address[])","4e94917a":"Claim_TRAC_20000()","4e94c829":"getAugur()","4e94fbcf":"setIntervalCoefficient(bytes2,uint256,uint256,uint256)","4e954f87":"IsEthereum()","4e961921":"getCurrentTokenRate()","4e96ea53":"addContract(address,address,address,string)","4e97bcfc":"EmergencyStop()","4e98323c":"setReturnAgent(address)","4e9833ac":"changeHoldingTaxInterval(uint256)","4e989a5b":"importPlayers(address,address[])","4e98a5b3":"receiveAssets(uint256)","4e99b800":"tokenBaseURI()","4e9b5db0":"BASEPRICE()","4e9c6b1f":"million()","4e9cf5b1":"changeOperational(bytes32,bool)","4e9de828":"registerAuthContract(address)","4e9e456b":"oraclize_query(uint256,string,bytes[1])","4e9ec8a6":"transferETHtoContract(uint256)","4e9ee738":"test_8_basicTransfersBetweenAccounts_increaseBlocksBy300()","4e9f0f06":"GimmerTokenSale(address,address,uint256,uint256)","4e9f9d37":"startTimeTwo()","4e9faaba":"_sell(address,uint256)","4e9feee6":"changeFrozenTime(uint256)","4ea05686":"countSet()","4ea0db6c":"HardCapReached(address,uint256)","4ea10c74":"FounderAllocationTokens()","4ea14479":"setProjectToVerify(address,uint256)","4ea1fcb6":"getWithdrawAmount(address)","4ea201cc":"betInfo()","4ea28ee6":"MyToken(uint256,uint256)","4ea2ea9f":"allocLastTxRewardByHand()","4ea2f66a":"_claimIfNeededThenSteal(uint256,uint256,address,uint8,bytes32,bytes32,uint256,uint256)","4ea34cdb":"getActionContract(address)","4ea37fec":"presaleStartTimestamp()","4ea412f4":"setPrice3(uint256)","4ea44358":"setGen0Step(uint256)","4ea5195a":"participantRoundCalced(address,address,uint256)","4ea5a6ac":"getRocIndexToOwner(uint256)","4ea611cd":"setPartnerDurance(uint256,uint256)","4ea640da":"ManoAntrasToken()","4ea66c38":"buyinInternal(address,uint256)","4ea6c89e":"isPreviousStageFinalized()","4ea73b07":"APOTokenCrowdsale()","4ea7d483":"priceStar5Now()","4ea801c5":"writeRate(string,uint256)","4ea8b6d0":"changeProfilePicture(bytes32)","4ea9560e":"FoshaAirdrop()","4ea9a27a":"registerHolder(bytes32,address,uint256)","4ea9ea71":"_submitTransaction(address,uint256,bytes,bytes,address)","4eaaad7b":"left72(uint256)","4eab3998":"Allocations()","4ead4771":"getBIDList()","4eae51f4":"getHeirs()","4eae8e30":"isSenderApprovedFor(uint256)","4eaef8a2":"getCEOHashing(address,uint256)","4eb03f6e":"updateMinter(address)","4eb054e6":"createPinMoTrade(bool,uint256,uint256)","4eb06f61":"manualLockFunds()","4eb09bf4":"getParametersHash(uint256,uint256,uint256,uint256,address,address)","4eb1483d":"IcoAddress()","4eb166af":"right73(uint256)","4eb1e71c":"HashTestCoin()","4eb1f578":"saleValve(bool)","4eb21301":"currentSaleCap()","4eb259aa":"burnAndReturnAfterEnded(address)","4eb2a8fb":"Banear_Oraculo(address)","4eb3148e":"feesTakenFromPrize(uint256,uint256)","4eb333c7":"setSynthesizingAuctionAddress(address,address)","4eb37fe7":"Tournament(uint256,uint256,uint256,uint256,uint256)","4eb396cd":"mintByMintable(address,uint256)","4eb421e5":"MockFailUpgradeableToken()","4eb4fe80":"getBackLendingItem(uint64)","4eb5162e":"collectSellFee()","4eb56999":"claimRefundVaultOwnership()","4eb665af":"setLockDuration(uint256)","4eb7221a":"nameRegistry()","4eb7d857":"getSite(uint256)","4eb81ba4":"getSchellingRoundDetails()","4eb8ffb4":"ORACLIZE_GAS_LIMIT()","4eb933bf":"withdraw(bytes32[],address[],uint256[],uint64[],uint8[],bytes32[],bytes32[])","4eb94102":"setAuctionManagerAddress(address,address)","4eb94872":"Err(string)","4eb95b97":"DropNotice(uint256,string,string,string)","4ebab5cf":"specificApprove(address,uint256)","4ebc31f3":"managerETHcandidatAddress()","4ebc7a9c":"processReinvest(address,bool)","4ebcdc2b":"SwapStarted(uint256)","4ebd7741":"extraMint(address)","4ebe2d46":"createMultisig()","4ebfa8bc":"getUserBettingInfo(address,uint256)","4ebfd6e8":"freeForAll()","4ec06982":"paybackToDepositer(address,uint256)","4ec0744d":"UtrustToken()","4ec1646d":"claimFreeAnimalFromAnimalFactory(string,string)","4ec18db9":"poolSize()","4ec19512":"calculateRunway()","4ec1adf1":"callAMethod2(uint256)","4ec24fa0":"getManagementProxy(uint32,int256)","4ec2b417":"getBankKYC(address)","4ec2cde6":"totalSupplyForCrowdsaleAndMint()","4ec2d0b6":"buyMiner(uint256[])","4ec32507":"parentBlockInterval()","4ec42e8e":"antToken()","4ec4878b":"donateJackpot()","4ec6396d":"TransChain()","4ec6a61a":"InitializeCoinToUser(address)","4ec70fde":"publicMin()","4ec7344e":"MetaFoxToken()","4ec735ae":"revokePermission(address,address,bytes4)","4ec79937":"approve(bytes32,bool)","4ec7a6e7":"externalSale(address,uint256,uint256,uint256)","4ec7b58b":"delSaleOwner(address)","4ec7ddc0":"addCommitteeVote(address)","4ec883d1":"editRestrictedAddress(address)","4ec8a8ff":"unpausecontract()","4ec9ef9c":"calculateTokenPurchase(uint256,uint256)","4eca4b19":"sendCoins(address,address,uint256)","4ecb02aa":"firstTierDiscountUpperLimitEther()","4ecb1390":"saleTokens(address,uint256)","4ecb35c4":"confirmations(address)","4ecb5e79":"IamGROOT()","4ecb8d0f":"transferOwnershipSend(address)","4ecc6eab":"setDefaultBuyerLastPaidAt(uint256)","4ecc7f59":"assignPreicoTokens()","4ecd4aa9":"createRequestAsPayeeAction(address[],bytes,int256[],address,bytes,string)","4ecd73e2":"DistributeDividends(uint256)","4ecd81b3":"redeemUTXO(uint256,bytes32[],bytes,bool,uint8,bytes32,bytes32,address)","4ecdf165":"rareIdRange()","4ecf77d3":"getUnfinishedGames()","4ed0694f":"kkICOTest77()","4ed0efd1":"selfdestructs()","4ed250bf":"freezeTime(uint256,uint256)","4ed3881e":"setTokenTransferIdentifier(string,bytes4)","4ed3885e":"set(string)","4ed4831a":"all(bool[7])","4ed4d42a":"transferTokenAddress(address)","4ed577bb":"IssuedToken(string,string,uint256,uint256)","4ed600d1":"confirmVestingSchedule(uint256,uint256,uint256,uint256)","4ed767a1":"totalFinalised()","4ed7cb10":"XXXXXXXX10(address)","4ed8579e":"setGPSMaxEth(uint256)","4ed87713":"ADVISORS()","4edac8ac":"num_claimed()","4edba7bf":"adapterEnabled()","4edbca6e":"getCategory(uint256,uint256)","4edbe9f7":"MintCommandBonus()","4edc689d":"allowAddress(address,bool)","4edc8ccf":"registerEIP777Interface()","4edccd31":"replace_square(uint256,bool,uint256,address)","4edce4e1":"push(int256,bool)","4edd0d07":"setConsumeTokenAddress(address)","4edd74e8":"reservesBalance()","4eddbd8d":"getCurrentPrice(uint128,uint128,uint24,uint64)","4ede23c8":"addressNotNull(address)","4edefd31":"setExpireDelay(uint256)","4edefe83":"doBroadcast()","4ee0ab0d":"forceEnd()","4ee0b9a9":"DaoHubVerify()","4ee0cb8a":"CutieBit()","4ee0cd98":"setFundMintingAgent(address)","4ee0d066":"setTotalsContract(address)","4ee16aba":"contributeToPurse(uint256)","4ee1d045":"secPerBlock()","4ee29ec5":"getNumberOfAssertions(uint128)","4ee2a3df":"setTargetDiscountValue2(uint256)","4ee2cd7e":"balanceOfAt(address,uint256)","4ee3659d":"AGC()","4ee3ad07":"HareemCoin()","4ee3c579":"DurioToken(string,string,uint8,uint256)","4ee3dc91":"publicToken()","4ee4d731":"enableMETTransfers()","4ee4d8fa":"isGlobalConstraintRegistered(address,int256,address)","4ee51a27":"airdropTokens(address[])","4ee67d33":"Etheradium()","4ee7ca3a":"erc20FOBS(string,uint8,string)","4ee9eb70":"InformRebuyTo(uint256,address)","4eea636f":"GROWCHAIN(uint256,string,string)","4eea9a8d":"withdraw2(address)","4eec0185":"aomracoin()","4eec44b4":"beforeBalanceChanges(address)","4eeca076":"Counter()","4eecafdb":"ifEndGetting()","4eed8a45":"LogTokenAllocation(address,uint256,uint256)","4eed965e":"_createGame(string,address,uint256)","4eee121f":"setOrCacheTargetReporterGasCosts(uint256)","4eee424a":"removeClaim(bytes32)","4eee59b3":"guess(string)","4eee8c25":"tokenBuyCost()","4eee966f":"setTokenInformation(string,string)","4eeea29d":"transferPreSaleBalance(address,uint256)","4eeedef1":"BCALAttToken()","4eeee8ac":"updateFighterBattleStats(uint256,uint64,uint16,uint64,uint16,uint16)","4eef440c":"bonusLevel0PercentModifier()","4eef683d":"PALAIR()","4ef02cf3":"preicoEndDate()","4ef05de3":"evacuate()","4ef1a23a":"manualInsuranceResolution(bytes32,uint8,bytes32)","4ef20030":"_setTokenMeta(uint256,bytes)","4ef37628":"getChallengeNumber()","4ef39b75":"finalize(address)","4ef3f235":"changeMaintenanceTime(uint256,uint256)","4ef45cac":"Announcements()","4ef50711":"apply4Redeem(uint256)","4ef5710a":"WatchNumberOfPlayerInCurrentRound()","4ef65c3b":"setUint(uint256)","4ef6b8ce":"Certificate()","4ef8086a":"switchManagerAndRemoveOldOne()","4ef83a70":"withDrawEth(uint256)","4ef85140":"CAOsale(uint256,uint256,string,string)","4ef8885f":"getSocialAccountPw(bytes32,bytes32,bytes32)","4ef8ff33":"MIN_INVESTMENT()","4ef94e34":"setMilestones(uint32[],uint8[],uint32[])","4ef98616":"CelebsPartyGate()","4efa45a1":"addAddressSetting(string,address,address,address,string)","4efb023e":"totalModerators()","4efb04ff":"created_contracts(address)","4efb7296":"updatePlotData(uint256,string,string)","4efbb734":"PublisherRegistryReplaced(address,address)","4efbe933":"buyForHackerGold(uint256)","4efc067f":"getAuraValue(uint256)","4efcc69e":"ExMoneyToken(uint256,string,string,address)","4efd1551":"add(address,address,uint256,uint256)","4efd9e2c":"updateMinContribution(uint256)","4efdd4f9":"viewUnclaimedResearchDividends()","4efddcd9":"artWorkChangeByAdmin(uint256,string,uint256)","4efeb2cf":"crowdDistribution()","4eff13dc":"OFFER_SIZE()","4eff86e7":"RBFToken(uint256,string,string)","4f0016d0":"endContract(uint256,uint256,uint8,bytes32,bytes32)","4f002522":"set_creature_builder(address)","4f011d9d":"getIntermediary(uint256)","4f013184":"investInTheSystem()","4f013ea6":"_THOUSAND()","4f01541e":"setReceiverAddress(address,address)","4f01d77e":"manual_lottery(bytes32)","4f02c420":"minted()","4f03c340":"proposeTx(address)","4f046439":"updatePurchaseSize(uint256)","4f04a36e":"setDesignatedReportPayoutHash(bytes32)","4f04af35":"CORReserveAllocation()","4f052648":"XaurumDataContract()","4f052b82":"UNLOCK_OUTINGRESERVE()","4f057506":"Limit()","4f059a43":"getClaimAmountForBlock()","4f062c5a":"getTier(uint256)","4f065672":"Start(string,bytes32)","4f0693a1":"BONUS_LATCH()","4f069517":"removePublicSalesSpecialUser(address)","4f07307b":"setLoanCreator(address)","4f073130":"takeOrder(bool,uint256,uint256)","4f07a663":"close(address,uint32,uint192,bytes,bytes)","4f07b5f0":"startSale(uint256,uint256,uint256,uint256,uint256,address)","4f07cc4f":"ETH_MIN_LIMIT()","4f082843":"enableChain(uint256)","4f084c0c":"payLast(uint256)","4f089298":"Etch(bytes32)","4f089898":"updateBlackListTrader(address,bool)","4f090ab4":"burnPrimordialToken(uint256)","4f0913ef":"MANHATTANPROXY6THST()","4f09cfc5":"changeDiviRate(uint256)","4f09eba7":"proxyApprove(address,uint256,bytes32)","4f0a195e":"totalBasicIncome()","4f0a746f":"blacklistAddress(address,address)","4f0a97b9":"test_basicThrow()","4f0b0deb":"gameCreate()","4f0b584e":"getCCH_edit_18()","4f0b8374":"addToPrivilegedList(address)","4f0b9a2b":"KarTokenERC20(uint256,string,string)","4f0c563f":"depositBonus()","4f0ca055":"getMiniPoolEdit_5()","4f0cae88":"balanceThis(address)","4f0cc59d":"swapID(address,bytes32,uint256)","4f0cd27b":"getCount(address)","4f0cdd29":"getAddressByUserName(string)","4f0cf7e1":"fillTradesInfo(bytes32,uint256,uint256[])","4f0d8533":"addNewStreetType(string)","4f0ddd27":"getTemplate(string,string)","4f0e3333":"wedaddress()","4f0e3dad":"USD_GOAL()","4f0e760a":"_takeOwnershipOfTokenFrom(uint256,address)","4f0e8656":"showAdmin()","4f0eaf96":"oraclizeCallbackGas()","4f0f4aa9":"getNode(uint256)","4f0f539e":"getActiveMessage()","4f0f97ab":"TokenForSale()","4f1069ad":"serchIndexByAddress(address)","4f10a0bd":"_createAvatar(string,address,uint256)","4f10acc1":"updateGoldFeeData(uint256)","4f1157aa":"EtheriumWall(string)","4f118ad7":"GenericToken(string,uint8,string,uint256)","4f11ca65":"distributeTeamTokens()","4f11e07d":"getProof(address,uint8,bytes32)","4f139314":"compensateLatestMonarch(uint256)","4f13e130":"fightAsuriMonster()","4f13fc0a":"setCompte_30(string)","4f150787":"batchFillOrKillOrders(address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])","4f161245":"getUIntValue(string)","4f162f8f":"icoEndTimestampStage4()","4f18d6fb":"BITAD()","4f190ed2":"changeDekzAddress(address)","4f192fa3":"MajestyAssetsJunction()","4f197ee7":"transferPackageOwner(string,address)","4f19e977":"INVALID_ORDER_SIGNATURE(bytes32)","4f1a5b86":"tokenReserved1()","4f1a7678":"getInsuranceDataByID(uint64)","4f1a892b":"setSectionForSale(uint256,uint256)","4f1ae61a":"releaseFeesAndBountyJM(address,uint256)","4f1afb63":"ownerforce()","4f1b2d4f":"toBool()","4f1bbc4d":"SuccessAuctionEvent(address,address,uint256,uint256)","4f1c3417":"getSpawnProxy(uint32,int256)","4f1c3b66":"setAccountData(address,uint8,bytes32)","4f1c8d0f":"milkBalanceOf(address)","4f1d38c0":"activeCrowdsalePhase3(uint256)","4f1d76ef":"buyabletoken()","4f1e0d0b":"getGoldInfoCustodian(address)","4f1e4334":"setMinBalanceForContractCreation(uint256)","4f1ea770":"bc(uint256,address)","4f1eb4b2":"proposalInProgress()","4f1ef286":"upgradeToAndCall(address,bytes)","4f1f421b":"SuMain()","4f1f99aa":"changeOzreal(address)","4f1fa7ef":"streamityContractAddress()","4f20f35a":"payExpenses(address,uint256)","4f219ceb":"getPlayRate(uint256,uint256)","4f223fe3":"StatefulFactory(string,string,string)","4f224baa":"setMetaBaseUrl(string)","4f2253d4":"addStudent(string,string,string,bytes32)","4f22bcf8":"allocationAddressList(uint256)","4f232f77":"transferFromRoot(address,address,uint256)","4f238029":"getSaleAuctionAddress()","4f23cce0":"ownerBetsCount(address)","4f23e50a":"defineReward(string,address,uint256,uint256)","4f24186a":"newProposal(string)","4f242cde":"startICO(uint256,address)","4f245ef7":"auctionStart()","4f248409":"endICO()","4f24e471":"numRewardsAvailableSetForChildAddress(address)","4f255b80":"getCharacterIndex(uint32)","4f256693":"addFile(bytes32,bytes32)","4f2578ba":"getVestedFounderTokens()","4f25a319":"PUBLICSALE_STARTTIMESTAMP()","4f25d6dd":"solveTime()","4f25ec6e":"_transferFee(address,uint256,address)","4f25eced":"distributeAmount()","4f26ef80":"buyAd(uint256,string,string)","4f271740":"UNFREEZE_DATE()","4f27869e":"defaultExit(uint256,bytes,bytes32,bytes,bytes,bytes32,bytes,bytes)","4f27ce68":"setSlogan(uint64,string)","4f27de64":"ByteExtractor()","4f28216a":"lowContributionAward(address)","4f284594":"info_TotalSupply()","4f28af6a":"handleBet(uint256)","4f28c443":"AIRDROP_TOKENS_PERCENT()","4f297b2b":"TokensGiven(address,uint256)","4f2989af":"indexExists(bytes32)","4f2996ab":"getBalanceByEscrowId(uint256)","4f2af869":"lastCalculatedToken()","4f2b0e41":"preSaleFund()","4f2be91f":"add()","4f2c9196":"getUsedBySoftwareLength()","4f2cd9cc":"auditConfirm()","4f2d7ab5":"contributionMinimum()","4f2eebc3":"PreSaleStartTime()","4f318dd8":"confirmVestingSchedule(uint256,uint256,uint256,uint256,uint256)","4f31cc51":"frozenTokenTransfer(address,uint256,uint8)","4f31e3ec":"minRoundSize()","4f32c65b":"emitFuture(bytes32,uint256,uint256,uint256)","4f32de0a":"request_payout_holder()","4f33428a":"setConsolationRewardsRequiredFaith(uint256)","4f33a013":"artHash()","4f346a7d":"emit(address,uint256,uint256)","4f348b46":"getTokenAmountOnAdd(uint256)","4f3655a8":"verifyBet(uint256,uint256)","4f36fbdc":"setMinMaxPriceInWei(uint256,uint256)","4f36fec8":"hardCapSale()","4f3741b5":"RateChanged(address,uint256,uint256,uint256)","4f37edfd":"burnAndRetrieve(uint256)","4f383934":"setMyTokenList(address[])","4f39ca59":"drop(bytes32)","4f3b1fb6":"unlock(string,address,bytes32,string)","4f3b8938":"mythexTokenAddress()","4f3bb920":"lockDownPeriod()","4f3d057a":"push(string)","4f3d1416":"SetOriginator(string,string,string,string,string,string,string,string,string,address,string)","4f3d1c27":"setLpMaxVolume(uint256)","4f3d3003":"participantRoundValue(address,address,uint256)","4f3d520c":"getClearance(address)","4f3ded8a":"getFinalPaymentAmount()","4f3df0a8":"getRemainingTimeOf(uint256)","4f3f2cbc":"changeFeeModifiers(address)","4f3f4211":"awardDailyLottery(address,uint256)","4f3f5746":"participatingIn(address)","4f3fc162":"removeOriginByIndex(uint256)","4f3fd173":"get10Animals(uint16)","4f3fed94":"tokenIncrease()","4f4027d0":"SHAREHOLDERS_SHARE()","4f4200e5":"setAddressOfERC20Token(address,address)","4f424da3":"Bounties_Wallet()","4f438a12":"provideTransactionFeedback(uint256,uint8,bytes32)","4f438ddb":"changePercent(uint256,uint8)","4f44728d":"ownerChangeOwner(address)","4f4522b0":"getIntelligenceValue(uint256)","4f452b9a":"isStormBirdContract()","4f4548f9":"registerAudit(bytes32,bytes,bool)","4f45779f":"mintTokensWithinTime(address,uint256)","4f45c308":"DocumentSigned(uint256,address)","4f466ce6":"TOTAL_T8EXTOKEN_SUPPLY()","4f4821e1":"createGiftTemplate(uint256,uint256,string,string)","4f48e46d":"get_all_payment(uint256)","4f494cad":"createAuction(uint256,uint128,uint128)","4f495513":"privateSaleTokens(address,uint256)","4f4a69c8":"TestTokkSale()","4f4b30ba":"dropManualState()","4f4b890a":"getCET6ById(uint32)","4f4cd650":"getAllTellers()","4f4d022b":"upgradeQualificationByTokens()","4f4d4728":"offeringEnded()","4f4df442":"approve(address,uint256,uint256,uint256)","4f4e1b74":"founderSwitchRequest(bytes32,bytes32)","4f4e47f1":"stopAirdrop()","4f4ec991":"PubToken(uint256)","4f4ef121":"firstBonusSalesEnds()","4f4f23ef":"SundayFundayToken()","4f4fa5a6":"removeReferral(address)","4f501f27":"changeOuts(address,address,address)","4f504d72":"getBalanceInPlay()","4f511102":"setDeveloper(address,address)","4f51bf46":"getBidIdList()","4f52b2bc":"findLockupIfCTD(address)","4f52ccfa":"beneficiary1()","4f53126a":"pauseGame(bool)","4f538ae1":"rain(address[],uint256)","4f53e83e":"smartProperty(uint256,string,uint8,string,address,uint256,uint256,uint256)","4f54f4d8":"getMatchDetails(bytes32)","4f5539c0":"SetPrice(uint256)","4f556b23":"onceoutTimePer()","4f558e79":"exists(uint256)","4f55f292":"convertIntoHtlc(bytes32,address,uint256,uint256,uint256,bytes32)","4f573cb2":"withdrawRevenue()","4f57641c":"getHorse(uint256)","4f58704c":"ARI()","4f58d5c9":"getTokenUSDRate()","4f5963fb":"calculateYourValueEven(uint256)","4f5a4eb9":"setAssetOwner(uint256,address)","4f5af739":"getBirthTime(uint256)","4f5b3318":"dateEndIco()","4f5b9f23":"power2(uint256,uint256,uint32,uint32)","4f5ba601":"airdropOn()","4f5c6e0a":"bonusOne(uint256)","4f5d06c2":"getPurchasePrice(uint256,uint256)","4f5d5295":"chairBalance()","4f5e6a8d":"whitelistedTransfer(address)","4f5f560a":"founderOf(uint256)","4f5fca97":"LimitEther()","4f5fcb34":"authorize(string)","4f6065e0":"get_presale_arbits_total(address)","4f60ae2e":"DividendReceived(address,uint256)","4f60f334":"multiAccessAddOwner(address)","4f610e74":"getDeclaration()","4f617b81":"unsetSectionForSale(uint256)","4f61db15":"VEGAS()","4f61ff8b":"kyberNetworkContract()","4f6247f8":"setThirdAddressBalance(address)","4f645993":"lastMiningBlock()","4f64808d":"createCustody(address)","4f64aa09":"advisorsLock()","4f64b2be":"tokens(uint256)","4f653f09":"_scheduleTournament()","4f655a61":"setMinimum(uint256,bool)","4f65cc3c":"ethToTokens(uint256,bool)","4f6716d3":"whitelistAddressArray(address[])","4f674164":"addBookSigner(bytes16,address)","4f67498e":"updateUSeqIndex()","4f6754d7":"tenEndTime()","4f67bd9e":"numberFor(uint256)","4f67fe22":"LOG_OwnerAddressChanged(address,address)","4f69dd3d":"triggerWithdraw(address)","4f6a441c":"getRandom8(uint8,uint8)","4f6a461a":"CatalogPlayers()","4f6acaa1":"getLedgerCount(string)","4f6adf48":"setPayOuts(uint256,string)","4f6b1a70":"vuePayETHDestination()","4f6b472d":"tokenSupplies()","4f6c3372":"CrowdSale_Halt()","4f6c63ea":"TeamRegistered(string,address,string,bool)","4f6c87fb":"STARTToken()","4f6cb43f":"advisers()","4f6ccce7":"tokenByIndex(uint256)","4f6d04e7":"createSeedCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)","4f6d150d":"LuvCoin(uint256)","4f6d20a9":"getRewardForAddress(address,address)","4f6d3aed":"refundGas()","4f6d97ed":"MakeTransaction(address,uint256,uint256,string,string,uint8)","4f6d9e16":"_settleAndRestart()","4f6dcf74":"PoS()","4f6de831":"testComplexCombination()","4f6fcc46":"getAirdropList()","4f7035b4":"DeleteAllRequests()","4f7132c0":"TokenDemo(uint256,string,uint8,string)","4f71473e":"withdrawAll(address,address[])","4f71ef81":"parse(bytes32)","4f72e1c3":"buyChamp(uint256)","4f731087":"checkTokenBalance()","4f734965":"setBBDPrice(uint256)","4f73928a":"setComment(bytes3,string)","4f739ff0":"addHouseStake()","4f73b7fa":"EthernityFinancialOracle()","4f73b8e6":"STAKE_BONUS_MIN_THRESHOLD()","4f73f1f8":"withdrawToAdress(address,uint256)","4f73f71d":"getOwlmasterReq()","4f7474cb":"closeAnnouncement(uint256)","4f74acfe":"buyEggs()","4f74d4f6":"ftechiz()","4f755fe7":"financialAccount()","4f75af3a":"tokensSuppliedFromReferral()","4f75c464":"startExit(bytes32[],uint256)","4f75e930":"UNLOCKINTERVAL()","4f76a077":"addInvestorToWhiteList(address)","4f76c87c":"createSportEvent(string,uint8,uint256)","4f76cb02":"testGetBitFailIndexOOB()","4f772420":"changeFundContract(address)","4f779753":"DimaCoin()","4f77feec":"getPositionInterestRate(bytes32)","4f79409f":"LogBuy(address,uint256)","4f7ac7ab":"toteLiquidatorWallet()","4f7aede9":"add(uint8,address,uint256)","4f7baec0":"test_mint(int256)","4f7cd683":"setReportRegistrationFee(uint256)","4f7d4951":"addVIP(address)","4f7d5de9":"setTimeRC(uint256,uint256)","4f7d87ac":"PoiseToken()","4f7dad6a":"buyToken(uint256,string,string)","4f7e7086":"iconiqToken()","4f7eb571":"getHowMuchUntilHardCap_(uint256)","4f7fc13f":"CLIENT_TIME_TO_DECIDE()","4f801270":"releasableBalanceOf(address)","4f803516":"getOrCreatePreviousPreviousFeeWindow()","4f8115a2":"tokensAddress(uint256)","4f817a2a":"tInstance()","4f81b930":"_sendFunds(address,uint256)","4f829ee8":"set2(uint256,uint256)","4f82ff41":"isCertified(uint256)","4f83fe64":"timeLocked(address)","4f840761":"demandTrial(uint256)","4f840c2b":"setMigrateToAddress(address)","4f8411e5":"_approvedFor(address,uint256)","4f851d73":"BineuroToken()","4f85769a":"closingTimePeriodOne()","4f8632ba":"user()","4f868b94":"etherSince20()","4f86bde2":"BuyFromFollower(address)","4f879ff0":"StackLottery()","4f883783":"CheckProofOfOwnership(bytes32)","4f88cc3c":"returnAllPollStakes(bytes32)","4f895031":"finalizeSale(uint256,uint256,uint128)","4f896d4f":"resolve(uint256)","4f8b9e64":"getBuyersList()","4f8c2a8a":"block02w()","4f8d40e1":"closeTournament(bytes32)","4f8da1fe":"RewardWallet(address,address,address,uint256)","4f8dd40a":"getOpinion(uint256)","4f8e2fdf":"LinkToken()","4f8e624e":"Greeter(string)","4f8fb544":"erc223Received(address,uint256,address,uint256)","4f8fc8ef":"setNonceForPublicKeyX(uint256,uint256)","4f8fe6a4":"THREE_YEAR_KEEPING()","4f8ffd1f":"set_contrib_arbits_min(uint256)","4f9000a0":"nextPrizePoolPercent()","4f932d44":"_generateIdentity(uint256,uint256,uint256,uint256)","4f935945":"capReached()","4f93995d":"saleNotEnd()","4f93b9e8":"setCommunityLock(address)","4f945a8a":"transferOwnCoins(address,uint256)","4f9559b1":"cancelOrdersUpTo(uint256)","4f958146":"LongLegs()","4f95a04b":"ethTransfer(address,uint256)","4f95ddec":"shopStorePrice()","4f95e960":"getTotalDropsOf(address)","4f961a6b":"RATE_TIER3()","4f962b72":"setPriceRate(uint256,uint256)","4f9660ed":"sendToTeam()","4f968868":"PauseTokenContract()","4f96ab8e":"retrieveUportInfo()","4f96baf1":"createNewAccount(address)","4f96bc00":"records(bytes32,uint16,bytes32,uint16)","4f96cddd":"calculatePreBonus(uint256)","4f96decf":"migratePlayerData1(uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","4f96e039":"waitingOracles()","4f96f446":"tier1LOT()","4f96fba7":"setAuditAssignBlockNumber(uint256,uint256)","4f97f97f":"lastCrowdsale()","4f9899c3":"PythonCoin()","4f995d08":"getPeople()","4f996a07":"callerDel(address,address)","4f99a96e":"getBorrowingItemByObjId(uint64)","4f99b7c5":"currentDate()","4f99b82d":"setBurntWalletAddress(address,address)","4f9b7bc8":"totalTokensSale()","4f9bf601":"totalTxFeePercent()","4f9bfdac":"OVISBOOKED_BONUSTOKENS()","4f9c5253":"Store(string)","4f9c5bf3":"airdrop_percent()","4f9d482a":"HALF_TIME()","4f9d719e":"testEvent()","4f9de158":"_sendTokens(address)","4f9ea1c3":"flightDone(uint32)","4f9ebe09":"getDonationPrice()","4fa037c4":"setTokenMintFeeProp(address,address,uint256)","4fa07325":"adddraw(uint256)","4fa0a4b7":"_getCanvas(uint32)","4fa10cfc":"getdata()","4fa11dd2":"setAirdorpList(address[],bool)","4fa20a52":"isDelayed()","4fa232fe":"getIcoDeflator()","4fa2cb50":"solved(string,string)","4fa3d029":"setSTFactory(address)","4fa3eeff":"withdraw3()","4fa406ee":"BeforeChipCost(uint32)","4fa43991":"getArtistTrack(bytes32,address)","4fa48a88":"isSameDay(uint256,uint256)","4fa4a531":"getbackTB(uint256)","4fa4d01a":"_averageSalePrice(uint256,uint256)","4fa519fa":"setValue()","4fa65d58":"WRLToken()","4fa679d8":"forward(uint256)","4fa6a6d5":"crowdSaleStartTimestamp()","4fa6caf6":"getSigner(bytes32,uint256)","4fa6cde4":"requestEthUsd(uint256)","4fa7e353":"pledgeFees(uint256)","4fa87fd3":"frozenFunds(address,uint256)","4fa88720":"setBypassStatus(address,bool)","4fa972e1":"maxSupplyForEra()","4fa99402":"spinnerCountsByType(uint256)","4fa99dd0":"Matching_Ethers()","4fa9b5d5":"seed_base_token()","4fa9e4dc":"getArticlesOwn()","4faa2d54":"getTimeElapsed()","4faa8a26":"depositEtherFor(address)","4fab2035":"newSchellingRound(uint256,uint256)","4fab2ca4":"testGetFrontend()","4fac7e41":"getOwnedTokenIds(address)","4fac9c65":"bonussale_WeiRaised()","4faca8f4":"sendTokenTeamAdvisor(address,address)","4fad404a":"confirmProposal(string,uint256)","4fad5c8a":"depositAgent(uint256,uint256,string,string)","4fad96dd":"DST_ICO()","4fae3254":"setMaxAuditDuration(uint256)","4faea4d6":"FrankTestToken1()","4faed396":"checkVotingForSendWeiFromExchange()","4faf9420":"airdropFor(address)","4fafee40":"lottoPrice()","4fb057ad":"ContractInstantiation(address,address)","4fb0a3cd":"claimTeamReserve()","4fb0d95e":"getLocalBountyBalance(uint16)","4fb19db5":"dollarCost()","4fb2e45d":"transferOwner(address)","4fb30d8b":"txs()","4fb31a6a":"replaceProto(uint16,uint8,uint8,uint8,uint8,uint8,uint8)","4fb34523":"deployStepFour()","4fb3d3b1":"getUserHistory(address)","4fb3fef7":"totalExecutedPerDay(uint256)","4fb46d5c":"getRoundStatuses(uint16)","4fb4bcec":"step5()","4fb4e833":"entryStorage(bytes32)","4fb4f5a3":"ETHMCoin()","4fb55858":"setTargetDiscountValue4(uint256)","4fb67111":"utfStringLength(bytes4)","4fb764c9":"orders()","4fb7f1d7":"getPastWinnerAddresses()","4fb8843c":"getAllBonus()","4fba68c5":"pWhitelist(address)","4fbc7e11":"enableTokenWithdrawals(address,bool)","4fbd051d":"verifyCertification(address,uint256)","4fbda01f":"LogPenaltyDisbursed(address,uint256,address,address)","4fbe30d4":"changeTokenRate(uint256)","4fbea8ea":"approveKyber(address[])","4fbf6e9f":"getFish(uint32)","4fbf6fbb":"getMultiRequestLastRequestId(uint256)","4fc0ee17":"setCreditMCCurator(address)","4fc28f68":"getUndistributedBalanceOf(address,uint256)","4fc2d3be":"setBaseExchangeRate(uint256)","4fc3f41a":"setCooldown(uint256)","4fc4b5a0":"highEtherBonusValue()","4fc573c7":"addrDevelopment()","4fc59e6b":"set_Rate(uint256)","4fc5a549":"StartAuction(string,uint256)","4fc63e02":"ExToke(address,address,address,uint256,uint256,uint256)","4fc78cf1":"add_reward()","4fc7a47d":"extra_time_bought()","4fc84791":"senderAddress()","4fc91633":"setNotLessThan(uint256)","4fc9584a":"messageSpanStep()","4fc9c91a":"identityOf(bytes32)","4fca3159":"rawBuy(bytes32)","4fca329a":"drawBookLotto()","4fcaadae":"_createDivCard(string,address,uint256,uint256)","4fcb2968":"kingSpirit()","4fcb9e2f":"getLastPayoutDate()","4fcc30d9":"AuctionSuccessful(uint256,uint256,address)","4fcc9e07":"getDynamicArraySize()","4fced032":"OneKeyToken(uint256,string,string)","4fcf1f39":"revealWinner(string)","4fcf8210":"eraseRecord(bytes32)","4fd0fcb6":"partnerAmountLimit(address)","4fd1519c":"getValidDurationBlocksData()","4fd23dd4":"transferMulti(address,address,address,address,address,address,address,address,address,address,uint256)","4fd2ee52":"getTargetContactPubKey(bytes32,address)","4fd394ba":"getMax(uint128[])","4fd3d125":"onlyAdminsCanDoThis()","4fd4dbaa":"_emitError(bytes32)","4fd61333":"DataChanged(bytes32,address,string,string)","4fd6194d":"setup(string,address[])","4fd64591":"tokenClient()","4fd6b325":"test_5_generateSecondAccountBalance_increaseBlocksBy1000()","4fd6e8ac":"andTheWinnerIs()","4fd6ff6e":"CROSAIR_SHIP_PRICE()","4fd7718b":"firstStageDuration()","4fd798b1":"TsingDaToken()","4fd81926":"setMaxDividendDepth(uint256)","4fd839c6":"getRabbitDNK(uint32)","4fd8411c":"AddressChangeRequested(address,address)","4fd88a1c":"spendFunds(address,uint256,string)","4fd9c9ac":"ExposureClosed(bytes32,address,uint256,uint256)","4fdb7c47":"RtbRpay(address,uint256)","4fdb91ab":"TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE1()","4fdbe2c3":"changeFoundationAddress(address,string,address)","4fdc1a70":"icoCore(uint256)","4fdc4295":"_offerCanvasForSaleInternal(uint32,uint256,address)","4fdc53f6":"setTokenOwner(address,uint256)","4fdc5f65":"LiverpoolvsManCity()","4fdd228d":"ownerOfPosition(bytes32)","4fde7cd9":"tokenToFounder()","4fdf4c9a":"Icebox(uint256)","4fdf64ce":"totalBorrowingItem()","4fdf8a03":"VLTMultisig()","4fdfcd42":"removeBytes32s(bytes32[])","4fe01d38":"setTokenReward(uint256)","4fe06988":"toTimestamp(uint256,uint256,uint256)","4fe0bd1e":"fundsAvailable()","4fe0ff1a":"submitInitialMerkleState(bytes32,uint64,bytes32[],uint256[],uint256,uint256,bytes32,uint256[2],bytes32,bytes32,uint8)","4fe2e15a":"checkTicket(uint256,uint256)","4fe2f085":"INVESTORS_TOKENS_RESERVED()","4fe47cb4":"emitStoreAndPay()","4fe47f70":"setMaxAmount(uint256)","4fe50bc6":"baseTokenGetRate()","4fe51ee6":"ValkyrieNetwork()","4fe5c2b4":"Vidnix()","4fe5f587":"CCXToken()","4fe61b9e":"disableBonus()","4fe6adb4":"NewToken(string,string,string,address)","4fe71e95":"withdrawUserReward()","4fe72439":"DEVELOPER_SUPPLY()","4fe7940b":"show_Balance_available_for_Sale_in_ETH_equivalent()","4fe81ffd":"artistsArtworks()","4fe82444":"addEthContribution(address,address,uint256)","4fe85563":"RAGTOKEN()","4fe87fe0":"FundsWithdrawnEvent(address,address,uint256)","4fe8b1a8":"changesoldierreplenishrate(uint256)","4fe8b4c1":"deleteData(uint256)","4fe8d03f":"bountyTokensTransferred()","4fe9cc63":"InitHostBalance(address,uint256)","4fea572e":"ERC20Token(string,string,uint8)","4febb4f9":"WorldCupTeam(address,string)","4febe793":"NewText(string,string,address,uint256)","4fecf22d":"delegateManagement(address)","4fecf9cf":"Helex()","4fed1c94":"isTokenForSale(uint256)","4fed6a10":"teamTimelock()","4fed9a60":"Bonus(uint256,uint256)","4fedebf6":"numOfTeam()","4fee13fc":"startAuction(uint256,uint256)","4fee2437":"tokensaleStartTime()","4fee5360":"transferLike(address,uint256)","4fee63da":"securitiesOf(address)","4feeb18a":"priceQuerySent()","4ff0b071":"SILENT_Token()","4ff13571":"x2()","4ff1ddec":"TransactionConfirmedAfterExpiry(uint256,uint256)","4ff2bcb7":"getStageBonus(uint256,uint256)","4ff30c5f":"nextMintPossibleDate()","4ff3a989":"BLOCK()","4ff44fda":"_holding()","4ff45d73":"unapproveDisbursement()","4ff4ab6c":"ticketsOwners(address,uint256)","4ff57e9f":"airdropAndBurn()","4ff62627":"convertCore(address,uint256,uint256)","4ff6aa46":"deactivateTeam()","4ff6e86e":"getProviderPublicKey(address)","4ff7ff32":"withdrawERC20Tokens(address)","4ff92d6f":"getAssignedSupply()","4ffb01ce":"RemoveEvidence(bytes32)","4ffb32d3":"BlackSnailE()","4ffb861e":"_addAuthorization(address,address)","4ffc9204":"centralBankAddress()","4ffcd9df":"exchangeRates()","4ffcfefe":"m_weiBalances(address)","4ffd23a7":"sell(uint32)","50003ca6":"calculate(address)","5000a443":"jingZhiManager()","50010427":"bet(address,uint256,uint256,uint256)","50013a53":"LICERIOToken()","5001780b":"maxFundingGoal()","5001f3b5":"base()","50020560":"Accessible()","5002b2b9":"FusoraToken()","50035eb8":"getInUse(bytes20)","5003c2cc":"setPriceProgression(uint16)","5003c81d":"ERC223StandardTokenFactory(address)","5003d58f":"returnTokenBalance(address[2],uint256[8],uint8,bytes32[2])","5003e4d1":"Token(uint256,string,uint8,string,address)","5003efca":"extendedTokenCap()","50048174":"addItemLendingList(address,uint256)","5004e7a6":"CoinFast()","50050769":"changeRegistrationFee(uint256)","50051c20":"CELToken()","50058508":"getPubkey(address,address)","5005ba47":"setDestroyEnabled(bool)","50060f34":"getBatch(address,uint8)","5006bf0b":"internalExecuteDelegatecall(address,uint256,bytes)","5006e60a":"ownershipToCreator()","5007364f":"getLeaderboard(uint16)","50077f00":"jsonCat(string,string,uint256)","5007e47e":"getIntrospectionRegistry()","5007ec95":"IbzCoin()","5007ff15":"GridcubePlatformToken()","500844dd":"setTotalStakingHistory()","5008b7dd":"buyProduct(address,address,uint256)","5008cfcc":"votePerETH()","5008f699":"setRollover(uint256)","5009432d":"MAX_PRIVATE_FUNDING_SUPPLY()","500b6b3e":"calculationTotalSupply()","500b9426":"accountLocked(address)","500c6755":"DepositAmount(uint256,uint16)","500c6f21":"setManagementFeeChargePercentage(uint256,uint256)","500d22db":"setData_14(string)","500e73a4":"SSChainToken()","500e9eaa":"finishZeroDistribution()","500ec41b":"setAirState(bool)","50107c77":"addThing(string,bytes32,string,bytes32)","501146b4":"_updateNextPeriodPoints(address,uint256)","50114925":"transferDelegated(address,address,uint256,uint256,uint256,uint256,bytes)","50116afb":"decreaseAssetsCertified(uint256)","5011e399":"replaceSigner(address,uint256,uint8,bytes32,bytes32)","5012416f":"processAndCheckParam(string,address,uint8[],bytes32[],bytes32[])","50125546":"cancelRequest(bytes32)","50127418":"Question(address,string,uint256,uint256,string)","5012adca":"packInfo(address,bytes)","5012eb67":"trFee()","50133d50":"MinimumViableToken(uint256)","5013bb79":"TheTokenB()","50140fe5":"distributeBountyTokens(address,uint256)","50148ed2":"initEpochBalance()","5014a18e":"node_parent(uint256)","501578ca":"EntryAdded(bytes32,uint256,uint256)","50159de6":"ownerRemoveCeo(address)","5016128e":"isLock(address)","5016b9b1":"buyFromBlackMarket(uint256,uint256)","5016d29f":"refundedAmount(address)","5017f1f1":"constructor_()","50180944":"NEST()","50188301":"withdrawable()","5018a0fd":"withdrawAddr(address)","50192ae6":"test_31_assertGasUsage50Boards()","501957b8":"getManifest(address,bytes32,bytes32)","50197646":"rId()","501a4d68":"changeNameSymbol(string,string)","501a7a74":"uint256Min(uint256,uint256)","501b0b18":"receiveLoanOwnership(address,bytes32)","501bae76":"setr2VaultAddr(address)","501bfb60":"transferStampsToOwner(uint256)","501c5205":"_updateLandData(uint256,uint256,string)","501e3a2c":"_icoPercent()","501e8428":"getPart(bytes,uint256)","501fdd5d":"setSpecID(bytes32)","5020dcf4":"convertToEach(uint256,string,uint256)","5021051e":"setInflation()","50213c9f":"EXPERTS_POOL_ADDR()","5021783a":"addPerformer(address,string,uint8,string)","5021e534":"_dividendsSum(uint256[])","5022238f":"AVAILABLE_IN_PRE_SALE()","50228201":"getCollector()","5022d232":"CelebrityBreederToken()","5022e940":"experty()","50234173":"addNotary(address,uint256,uint256,string)","5023d124":"TestFactory()","50240158":"rejectContribution(address)","50240a34":"onLotteryInsurance(address)","502414e4":"marketMaker(string)","50248cd1":"ownerYHT()","50259cd3":"privatePreICOFreeBonusPercent()","5025b9ae":"expire(uint256,uint256,uint8,bytes,bytes,bytes)","5028594a":"setBlockDotGasLimit(uint256)","502a86bf":"gameGiftUserDayTimes()","502aa3b5":"usersList(uint256)","502b31d2":"splitEther()","502b8bda":"synths(bytes4)","502be15e":"unregisterByList(address[],bool)","502c9bd5":"userAddresses(uint256)","502cc114":"KittyToken()","502d7599":"IssueTokens(address,uint256,uint256)","502dadb0":"disableWhitelist(address[])","502e3b46":"EffectAdded(uint256,uint8[])","502f2dee":"sendFromTeamWallet(address,uint256)","502fe251":"getUidLastUpdate(string)","5030c325":"signBuyer(uint256)","503129c3":"ISC()","50312c9e":"checkContractBalance()","503248fe":"minPriceForMiningUpgrade()","5032f33b":"TokenLocker(address,address)","50357beb":"buyCard(uint256,address)","5036258b":"disableAddress(address)","50364825":"InsertImage(string)","503667bd":"_burnFor(address,uint256)","503687bc":"getTokenReleasePercentage()","5036d610":"Presale()","50372085":"isTokenContract()","503765c6":"LOCKTokenCOINLock(address,uint256,uint256,uint256)","5037ec62":"changeDelay(uint256)","5038c9c5":"getListingAtPosition(uint64)","50391932":"findContractVersionByAddress(address)","503919b1":"unblockTokens(address)","50392bcc":"CleanFoodCrypto()","50395188":"tan_lian()","5039c62c":"inviteHandler(bytes32)","503a0ef8":"requestLoans(address,uint256)","503a3609":"mainSaleSecondStartDate()","503adbf6":"changeableToken(uint16)","503b64c0":"setRequestProcessed(uint256,uint256)","503c449f":"decreasePregnantCounter()","503c849e":"cashOutRate()","503caa1b":"performPayout()","503caa53":"phase2TokenPriceInEth()","503de95b":"newCash()","503e11de":"getAssetIdCargoArray(uint32)","503e9d33":"changeWeTrustSigner(address)","503eb429":"destEthFoundation()","503ef9fe":"changeFeeAmt(uint8)","50400128":"RiskPrice(uint128)","5040307c":"amountOfOrderQueue()","50405fdf":"setMemberLevel(address,uint8)","50409041":"_computeSalesCut(uint256)","5040c6e7":"HardCap()","50411552":"challengeWinnerReward(uint256)","50416b93":"batchClaim(uint256,uint256)","5041742a":"bidOnEthSiringAuction(uint256,uint256,uint8,bytes)","50428f84":"insertLastPlys(uint256)","504291f0":"maxToSell()","5042ffbe":"contributeInIco()","504321e0":"toTeamEthContract()","504334c2":"setNameSymbol(string,string)","50449d9d":"whiteListPreSaleDuration()","5044b112":"getChecksumCount()","50473c82":"deathData_f15()","50479065":"cancelCreation()","5047b337":"changeName(bytes16)","5047f867":"setAirdropParams(bool,uint256)","5049b238":"potentialWinner()","5049f497":"nominate(address,address)","504ac982":"transfer(string,string)","504b0ae8":"LOG_ValueIsTooBig()","504b122f":"readMulti(bytes32,bytes32[])","504b91b5":"GeishaCoin()","504b97ae":"getcertifieddata(uint256)","504bcde7":"getAuctionTokenIDsOfOwner(address)","504c9582":"PARTNERS_SHARE()","504cceac":"purchaseTokens(uint256,address)","504d080b":"getActions()","504d27fd":"transferAmount()","504f1671":"getSize(address)","504f5e56":"floor(uint256)","504f6085":"serviceTransfer(address,uint256)","504fac70":"getGiftTemplateById(uint256)","504fbb19":"LifeChain(uint256,string,string)","50500934":"right28(uint256)","50500fac":"LaunchPartnersAddress()","50512420":"getPlayerDiscount(address)","505158bb":"getRecordsCount()","50515d5a":"resolveDispute(bytes16,bool)","50520b1f":"contribution()","5052587f":"Show_automated_Sell_price()","5052abad":"viewContribution(address)","50548d85":"LogMakeDeposit(address,uint256,string)","5054e8bf":"collectDevFees()","5055225f":"preSaleStartDate()","5055557a":"perform_selfdestruct(uint256)","50558dd5":"setPropheth(address)","5055d7c3":"withdrawnMelon()","50560a1a":"_oraclizeQueueWinner(bool)","5056a36a":"AuthorizationSet(address,bool)","5056b309":"getSetting()","5058c460":"safeWithdraw(address,uint256)","5058f013":"periodWeek()","505903ba":"GetEthBalance()","50591478":"getChainDrawingsByChainID(bytes32)","5059fad1":"transferIssuer(uint256,address,address)","505a202b":"priceChangeName()","505a7bce":"pullEther(uint256,address)","505ba497":"processInvestment(address,uint256,address)","505c3c58":"MasAnu()","505c3d5e":"piecesOwned()","505da5c7":"_bonusToFighters(uint32,uint8,uint256)","505e71d0":"test_twoInvalidFalseEqLog()","505ed108":"createPetCardSeries(uint8,uint32)","505f2697":"rejectCertification()","505fb46c":"add(uint256,uint256,uint256)","505ff574":"register(address,uint256,bool)","506092f7":"getAmbientLightException(bytes32)","50609cea":"onTokenTransferCalled()","5061029d":"MINE()","50613afe":"getDropNotice()","5062ef16":"readOpentasks()","50635394":"claimBonus()","50635e2f":"CYPHERX()","50636a68":"ERC223Token(uint256)","50637dd2":"stageName()","5063f361":"addMembers(bytes32,address[])","50648403":"registerWithInviterID(uint256)","506535f3":"verify(address,bytes32,uint8,bytes32,bytes32)","50655d8c":"maker()","5065cbab":"geteth(address)","50669508":"DatasetHub()","50669a03":"unpauseToken()","5066a9ac":"setLPTargetPostion(uint256)","5066e2bd":"teamKeepingWithdraw(uint256)","5067f32d":"KALToken()","50685c81":"SwarmRedistribution()","50692d9a":"toContentID(address,string,string,address,bytes32)","50699e89":"requestBuywithFX(uint256)","5069a6a6":"calculateKebabSell(uint256)","506a0aaa":"reverseSplitTokensBeforeDistribution(uint256)","506a6a10":"tokenBonusForThird()","506aaede":"issueDividend()","506b56da":"centralBanker()","506bd3a6":"removeExchanger(address)","506bff11":"left7(uint256)","506cb188":"NewOrder(uint256,address,address,address,uint256,uint256,uint256,uint256)","506cf560":"blackil()","506d54c7":"getBigWinner()","506d9ebd":"getData_8()","506dc7e1":"getUsageDetails()","506e106c":"setToS(string)","506ec095":"periodEnd()","506ee1ef":"traderNonces(address)","50710ef5":"_finalRoundWinnersFight()","50713dc0":"transferOwnershipManualMinter(address)","5071fcf0":"recoverSouls(address[],uint256[],uint256[])","5072a21b":"_createPotato(uint256,uint256,uint256,uint256,address)","5073eda3":"setPOOL_edit_25(string)","5074449d":"isTradable()","50750497":"VestingTransfer(address,address,uint256,uint256)","50754fac":"totalNetworkCollateralisation()","5076d445":"AdminClaimAirdrop(address,uint256)","5077ac0e":"registerImage(uint256,bytes,uint256)","507843f8":"assemblyShamir(uint256,uint256,uint256,uint256)","50787341":"normalizedEarlyPurchases()","507959e1":"newBeneficiary(address)","507a83ea":"arand(address,uint256)","507a8e40":"AssetToken(uint256,string,uint8,string,address)","507afbec":"processBuyAmount(uint256)","507b3450":"getKNCRateRangeSignatures()","507d17bb":"MultiplyContract(address,address,uint256,uint256,uint256,uint256)","507d5954":"stopCrowdsale()","507d8887":"setCompte_19(string)","507e7888":"subscribe(string)","507e97a9":"setBUA(bytes32,uint256,address)","507eeff9":"trade(address[2],address,bytes,bytes)","50807ecc":"getSellerfee()","50818fbb":"internalGetHowMuchUntilHardCap(uint256)","50833515":"RestartReceivingContributions()","508335e6":"maxRentPeriod()","508343d6":"initiateEscrow(uint64,uint256,uint256,address,address,address,address)","5083b29f":"changeBookingFee(uint256)","508493bc":"tokens(address,address)","50849c3b":"placeoffer(uint256,uint256)","5084b2a3":"MintAuthority(address)","5084da18":"fipsOwner(bytes20)","5085c9f1":"numTokensInCurrentCompactData()","50867236":"debug_token_balanceof_faucet()","50872d1e":"onTransferFrom(address,address,address,uint256)","50872e32":"EUROQUINNToken(uint256,string,string,uint256)","50875b6c":"remainingLockDate()","508762c1":"right10(uint256)","5087abc7":"joinOutBattle(string)","50894456":"manuallyMakeOraclizeCall(uint256,uint256,bool,bool,bool)","508a0a9e":"NitrToken()","508a8976":"saleSuspended()","508ab47a":"showPoolContract(uint256)","508b0955":"testNoTokensTwoCalls()","508bb866":"getMyBet(uint256)","508cde13":"getMappingID(string,address)","508d0f57":"getNumberOfPeriods(uint256,uint256)","508d60aa":"teamETHUnlock2()","508df5df":"numResponseOptions()","508e3718":"setValidKYC(bool)","508f352d":"heapSort(uint16[])","508f46a0":"getGameSettings()","50904081":"purchasesCount()","509065b8":"mintTokensForFirstStage()","50909851":"ownerEmit()","5091c49e":"bonusSeed()","5091e7c4":"selfdestroy()","5091f881":"updateArtistCommission(uint256,uint256)","50921b6c":"EGGS_TO_HATCH_1CROCS()","509239c0":"amountContributedBy(address)","50928ba4":"canCreateGames()","5092f97e":"Company()","50930ca5":"doFailingTransferFrom()","50933a0f":"Bitnusu()","5093cb38":"setEtherDelta(address)","5093dc7d":"setValue(int256)","50944a8f":"setMembership(address)","509484d5":"setStakeContract(address)","509515b5":"getWinnerAccount()","50963bc4":"returnTokensTo(address)","50965f57":"currentWulinMasterPrice()","50977faf":"fetchTokenBalance()","5097e51f":"Public()","509a13dd":"RoundId()","509a7e54":"getRoot(bytes32,uint64,bytes)","509bf2bf":"axe()","509c3fc8":"createTestNetContract(address,address,address,uint256,uint256,uint256)","509c5df6":"reservedFunds()","509c5eee":"ASGToken()","509c90b3":"callTokenFallback(address,address,uint256,bytes)","509cd360":"Board()","509d6d72":"mediumPrice()","509d8c72":"VALUE()","509f0fe4":"setupFundingTime(uint256,uint256,uint256)","509f6ff8":"AquaToken(uint256,string,string,uint8,uint8,address)","509f7cf2":"testingForFun(uint256[])","509f8633":"create_account()","50a09d60":"SaleIsLive()","50a0f733":"final_shares_sold()","50a107cc":"setVotingPhase()","50a13702":"denyChangesMultitoken(uint256)","50a14ea4":"returnPreSaleTokens(address,uint256)","50a1676e":"createdAt(uint256)","50a1debd":"robAll()","50a22ee1":"BancorGasPriceLimit(uint256)","50a3bd39":"enterPool()","50a49f5f":"getBurnDelegates()","50a58b3f":"exist(address,address[])","50a5c872":"host_reveal(uint256)","50a5ebd9":"updateSpaceshipStatus()","50a675fe":"QQBToken(address)","50a6887c":"UpgradedNodelist()","50a6b423":"settlementPayOut(bytes32,uint256)","50a7755e":"newDad()","50a82265":"EventEmergencyStop()","50a8246f":"testRIPEMD160()","50a85d36":"DeathNode()","50a8d2b9":"getNumSigsOwned(bytes32)","50a9b541":"bootyToken()","50a9e127":"backup()","50a9eddb":"testControlSetNotUpdatableNotOwner()","50ab6f7f":"getMsgs()","50ac9828":"FileData()","50ad2f76":"vendGuardian(uint256)","50ad7321":"GPSDecayingTokenEnvironment(uint256,uint256)","50adc70a":"winning_country_string()","50adcdb7":"fundToken()","50ae28ea":"StandardCertificate(string,string,string,string,uint256)","50ae85d8":"reservedAddr()","50aeddcf":"censorChatMessage(uint256)","50b0021c":"currentRandom()","50b04a4e":"getCountryById(uint8)","50b066b2":"changelp13(address)","50b149a9":"setPriceStep1(uint256)","50b1a697":"toReferrer(uint256)","50b1ab69":"PET(uint256,string,string)","50b1f058":"fetchPaidOrdersForPayer(address)","50b2ae66":"transferChips(address,address,uint256)","50b44712":"tickets(uint256)","50b48c5e":"autonomousConverter()","50b58c06":"JuggernautToken()","50b5bc93":"unlockFirstTokens()","50b62939":"getAddressBalance(address,address)","50b6ba0b":"getWtoken(uint8)","50b79722":"setSanLength(uint256,uint256)","50b7b7a2":"setRating(bytes32,uint256)","50b7e942":"acquireTokens(uint256,uint256,address,uint256)","50b82a48":"objectSack()","50b91881":"setKycWhitelist(address,address,bool)","50b926fd":"UnityToken()","50b93b3b":"sendBuzzCafe()","50b9963f":"_continueTokenPurchase(address,uint256)","50b9c428":"oraclizeGasLimit()","50baa622":"withdrawToken(uint256)","50bacea9":"icoPhaseAmount1()","50bb117a":"defrostDate(address)","50bb4e7f":"mintWithTokenURI(address,uint256,string)","50bc051e":"lockedForAsset(bytes32)","50bc373d":"regionAvailable(uint256,uint256)","50bc4ae6":"_joinToProvider(uint256,address)","50bc6bba":"createSaleAuction(uint40,uint128,uint128,uint40)","50bd1933":"UberDelta()","50bda35a":"setCharge(bool)","50bda77e":"updateJobRate(bytes32,uint256)","50be7503":"giveToken(address,uint256,address,bool)","50beb835":"getDeploy(uint256,uint256)","50beca78":"isTrainer(address)","50bed043":"sendFunds(address,uint8,uint256)","50bfeadc":"initialTokens()","50c007c6":"verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[5])","50c0f2b9":"licenseTermsRegistry()","50c15c93":"depositChecking(address,uint32)","50c2e4f6":"ADVISOR_SUPPLY()","50c34878":"priceOfAUnicornInFinney()","50c35227":"central_account()","50c38479":"resetCurrentTokenOfferingRaised()","50c3e676":"resolveErrorReport(uint256,bool)","50c40877":"Nai()","50c42921":"replicate()","50c4b64c":"_unpackAuraValue(uint256)","50c4ebc4":"finalTimestampOfBonusPeriod()","50c5c99a":"setScrapyard(address)","50c67734":"setPricingStrategy(address)","50c6784d":"ShareableMock(address[],uint256)","50c6a4e0":"_buyPixelBlock(uint256,uint256,uint256,uint256,bytes32)","50c6ef88":"setChampsName(uint256,string)","50c7ac75":"addint8(int8,int8)","50c8512b":"CollectibleNoLongerForSale(uint256,uint256)","50c88103":"setEruptionThreshold(uint256)","50c8dbd2":"totalBlocksMined()","50c90136":"fixedLog(uint256)","50c90af0":"unLockAddr()","50c946fe":"getNode(bytes32)","50ca6227":"getTokenInfoData()","50ca73c8":"aSetLaunch(uint256)","50cc5d4b":"totalWeiVolume()","50cca1e1":"rejectMail(uint256)","50ccf36b":"getWeiPriceOneUsd()","50cd4df2":"o()","50cd4f3f":"ScratchTickets(string,uint256,uint256,address)","50cdbb6b":"setEarlyParticipantWhitelist(address,uint256)","50ce761d":"NumberCreated(address)","50cee5a0":"addToWallet(address,uint256)","50cf20dd":"richtestff(uint256,string,uint8,string)","50cf569c":"getUserAttribution(bytes32,address)","50d00b95":"authorizeProcessor(address,address,string,string)","50d0b060":"createVestingForFounder(address)","50d12a72":"payReferrer(address,uint256)","50d17749":"BuyLimits(uint256,uint256)","50d279bd":"changeRewardMintingAmount(uint256,int256)","50d2bfab":"set_exchange_rate(uint256[])","50d491ab":"userGetPendingTxByAddress(address,address)","50d4a2b9":"crowdsaleGoalReached()","50d4bf15":"buy100ktickets()","50d50324":"stopSaleDepo()","50d5914a":"TOKENS_PER_ETHER_PRESALE()","50d6d893":"_rejectTransaction(uint256,address)","50d78f7d":"QueryFrozenCoins(address)","50d7bf09":"record(string,string,string,address,bool,string,string,string)","50d7d290":"withdraw_refund()","50d7da00":"GSH(uint256,string,string)","50d808d4":"StartTradable()","50d80fef":"addOffChainAddress(address,address)","50d8bcf3":"SMLToken(address)","50d925fb":"REBELCOIN()","50d9b932":"PatronOneWithdrawal()","50d9d472":"numberOfAuctions()","50da9f6d":"SellENS()","50dad350":"Hodling(bool)","50db7247":"maxCapPreSale()","50dc26ec":"TokenUser(address)","50dc43a1":"addGameMachine(address)","50dc4bfe":"addUserFeedback(address,uint256,address,string,string,string,string,string,string,uint8)","50dcce5a":"upPrice()","50ddd6f7":"addToEmployerAvgRating(address,address,uint8)","50de84c1":"CesiraeToken()","50deda1c":"addtoken(address,uint256,uint256)","50dede35":"marketDrugs()","50df10c3":"lockTill(address,uint256)","50df7eb4":"unsoldTokensAmount()","50df8f71":"isReady(uint256)","50e01e16":"Registered(address,bytes4,string)","50e036ff":"allowedContractsCount()","50e06b57":"Etherization()","50e08ddb":"devidendsOf(address)","50e14731":"BKEXComToken()","50e17308":"maxMineSize()","50e17975":"_badgeFreeze(uint256)","50e1b95a":"getShipProductClassByModel(uint16)","50e26c23":"getAssetBaseInfo()","50e27f2d":"TicTacToeLockedState(address,address,address,address,address)","50e28cb3":"SECOND_USER_CUT()","50e2ccad":"CoreTeamAndFoundersSupply()","50e343d0":"prWallet()","50e37961":"setWhitelisting(address,uint128)","50e38e63":"groupMemberInfo(uint32,address)","50e3b157":"sharesValue(uint256)","50e43c9c":"c(address,int256,int256)","50e4b069":"set0xExchangeWrapper(address)","50e513ac":"destroyUser()","50e59eb3":"isMinter()","50e706fb":"getProposalFunds(uint256)","50e72f61":"Break()","50e78690":"getHomeGasPrice(bytes)","50e7dde2":"setParetoToken(address)","50e81a3b":"setProviderCompleted(bool)","50e81e08":"_releaseToken(address)","50e84925":"saleEnd3()","50e8587e":"multiApprove(address[],uint256[])","50e86e1e":"setOwnerValidateAddress(address)","50e878df":"updateOrderAmount(address,address,uint256,address,uint256,bool)","50e9f948":"initialFiatPerEthRate()","50ea1932":"lookupISO3116_1_alpha_2(bytes)","50ea1c95":"MyIdolCoinToken()","50ea53db":"transferIncorrectDisputeBondsToWinningReportingToken()","50ea9274":"TokenRefund(address,uint256)","50eb2d02":"BBNToken()","50eb7ec4":"SupercarToken()","50eba4eb":"voteSnapshotBalanceBatch(address[],uint256[])","50ec2a6a":"batchCancel(address[5][],uint256[6][],uint256[])","50ec5903":"blackListSwithcer(address)","50ec6b1b":"getNamelistLength()","50ed2a2c":"poke(uint128,uint32)","50ed6264":"lastStakings(address)","50edd8c2":"nestedFirstAnyToAny(uint256)","50ee6de2":"candyLand()","50eebaf7":"mininumPurchaseTokenQuantity()","50ef3bae":"getQuestionVote(string,uint256)","50efc7c0":"districtToBuildingsCount(uint256)","50f07cf9":"setReadingDelay(uint256)","50f0880e":"sendLimitTokensToCompany(uint256)","50f0f83d":"getTransferFromFromValue()","50f1179a":"setPriceOfAss(uint256,uint256)","50f1c695":"authorizedLoggers()","50f2fb7f":"getCalls()","50f3dd7a":"assembleUnicorn()","50f4556b":"WhiteRhino()","50f462a4":"validationFailed(address)","50f46eef":"calcToken(uint256)","50f49db1":"getSlideEndTime(uint256)","50f4f9f8":"addShare(address,uint256)","50f503c1":"isSspRegistered(address)","50f5ef78":"getWork(address,address,uint256)","50f71526":"necashToken()","50f7c204":"maxTokenSupply()","50f8fc97":"LogCertificationDocumentRemoved(address,bytes32)","50f91ee3":"withdrawTokensRemaining()","50f956db":"nextAmount()","50f96b5d":"minEthPerNotification()","50f9b39e":"getReward(address,uint256,uint256)","50fa5d13":"stage4BeginTime()","50fb5a92":"buyWithReferral(uint128)","50fcff5c":"extCheckHalfLife()","50fdb01a":"setNewWinner(address,uint256)","50fe533b":"getLevitatingBirds(bytes32,uint64)","50feacc5":"PriceManual()","50fed3b4":"buy(address,uint256,uint256,uint256,bool)","50fef2e4":"tokenAirdropLeft()","50ff0761":"R_N_D_WALLET()","50ff2015":"endAtBlock()","50ff722b":"getChannelsGuids()","50ffbe81":"checkBan(address)","51003cab":"minimumIcoRate()","510040cb":"releaseLocked()","5100602a":"preallocate(address,uint256)","5100db6f":"SYCC()","51017702":"isOutcomeSet(bytes32)","5101880f":"CPXWallet()","510219cd":"defaultAuctionDuration()","51027320":"EUNOMIA()","5102ad69":"setImpactRegistry(address)","5102bc9d":"setTitle(uint256,string)","5102e238":"test_oneInvalidEqAddress()","5103a5a3":"certify(address,bytes32)","5104a3a7":"burnedTokensCount()","5104cb5c":"refundOnBehalf(address)","5105df3b":"buyTicketByEth(uint256,bytes32,bytes32,bytes32,bytes32)","5106b8fe":"transfer(address,address[],uint256)","510792c8":"hydroPartnerMap(uint256,address)","5107c0a8":"FBEE()","5107fde8":"lockedTeam()","510a3e2a":"round2Bonus()","510ae121":"Yangshuai(uint256,string,uint8,string)","510b1529":"issueTranche(uint256)","510bf040":"launchVesting()","510c27ad":"getOracleList()","510c58c9":"Gig9()","510c8243":"CategoryDeleted(uint256)","510ccb43":"getRewards(address[])","510de15a":"ICOSaleExtended(uint256)","510e23eb":"invalidEarlyPurchaseIndexes(uint256)","510e4235":"_createForecast(uint256,uint256,uint256)","510ea296":"_createDiamond(string,address,string,string,string,string)","510ec598":"computeCurrentReward(address,address)","510ef1ce":"changeQuarterSeason(int8)","510ef1de":"setTokenMetadata(uint256,string)","510f44cb":"TestFactoryUser()","510fbf8d":"setValue(address,string)","511075a9":"getIpfsForAssets(uint256[])","5110d31c":"TradeEthShop(address,uint256)","5111249e":"checkMultOverflow(uint256,uint256)","51114b24":"interSendWithOtherEvent(address,uint256)","51118f1d":"transferFromSystem(address,address,uint256)","5112f02c":"getCard()","51131017":"setUpdateGasCost(uint256)","511354a1":"phase2MaxTokenForSale()","5113d5f7":"BTCETC(uint256)","51142cc3":"secondStageCap()","5114a9aa":"TheBestICO()","5114cb52":"makePayment(uint256)","51172285":"TwoAfrica(uint256,string,string)","51175e01":"setNumRewardsAvailableForAddresses(uint256[],address[])","51180c63":"removeValue(bytes32)","51192814":"GenesisBuyPrice(address,address)","51193bad":"LUVTOKEN()","5119a342":"GetUserInfo()","511aae8b":"addFreelancerContract(address,address,uint256)","511acd53":"TOKEN_RATE_30_PERCENT_BONUS()","511b1df9":"addr(string)","511b445b":"nowperiod()","511bb41c":"rebateTwoFenmu_()","511bc0f6":"_addOwner(address)","511c5d66":"SetAddressForReturn(address)","511d2299":"processBNBContribution()","511e2613":"getoddAndEvenBets(uint256,uint256)","511e5639":"KamuToken()","511e84ce":"setIsAutoRestart(bool)","511eb8da":"confirmOrder(address,address,address,address,bytes32)","511fa487":"getMinSell(address)","5120429c":"TokenSold(uint256,uint256)","51206d81":"getRefWallet()","5120bb20":"transactionsOn()","5120f028":"sendAmount(uint256,address)","512202d7":"getOuvidoriaEndpoint(int256,address)","51223fdc":"LogClaim(uint256,address,uint256)","512267b0":"rewardScarcityFactor()","51228c4e":"addReferralProfit(address,address,uint256)","5122c6d1":"onSell(bytes32,uint256,address,uint256,address,uint256,address,address,uint256,uint256,uint256)","512392cc":"BITCOIMINIG()","51239fde":"multiDistribute(address[])","5123e1fa":"etch(address[])","51243676":"LogBookTicket(uint256,address,string)","5124ae95":"getNonces(address)","51252412":"crowdsaleTargetBRA()","51254729":"CynkciarzToken()","512570d6":"updateBrand(address,string,bool)","5125796a":"changeOraclizeProofType(bytes1)","51259770":"GetEthShop(address)","51274842":"logEvent(uint256,string,uint256,uint16,address,uint256,uint256)","5127a94a":"getRaisedAmount(string)","5127cab5":"rateFirstRound()","5128ab7b":"GetSaleInfo_Airdrop(uint8)","5129096c":"INGCL()","51290d06":"cofounderB()","51297cc6":"airDropTokenEnabled()","512a9c33":"startCrowdsale(string,string,uint8,uint256,uint256,uint256,uint256,uint256,uint256,address,string)","512b64c6":"_productDoesNotExist(uint256)","512b658d":"mintToAddress(uint256,address)","512c0b9c":"randomDS_updateSessionPubKeysHash(bytes32[])","512d62df":"getClass(uint256)","512d8a87":"EdwanzToken()","512dd020":"getItemsCount()","512f1e64":"orderBookLength()","512f8f92":"changeLottery(address)","512f9890":"airDropFinished()","512fcd60":"changeOwner3(address)","512ff2c9":"CHEXToken(address,address,uint256,uint256)","51306a80":"_isVotable(bytes32)","5130b405":"setMinimumBidAmount(uint256)","5130c857":"forking()","5131d3e9":"setUseFreeze(bool)","5131f01d":"available_shares()","51327a6a":"emptyToWallet()","513284c6":"createShop(address)","5132faca":"stakeTokenContract()","51331732":"ICO_start()","51331ad7":"getRoleManager()","513419e3":"updateStartTimeManually(uint256,uint256)","513485fc":"CallRejected(address,bytes32)","51349d5f":"scheduleTier(uint256,uint256)","5135077b":"setContentName(string)","51355362":"transferWithFee(address,uint256,uint256)","51355cfb":"getTier(uint256,uint256)","51356817":"doPull(address,uint256)","5135d28d":"getScore(uint256,uint256,uint256[])","5135dffa":"NonActivationWithdrawal(address[2],uint256[8],uint256)","5135f714":"Basic(address)","5136099c":"premium(bool,address,address,address,address[],uint256[])","513611e5":"setStatusTransferFrom(bool)","5136260d":"getLockedFundsReleaseTime()","51379adb":"Crowdsale(address[],uint256,uint256)","5137aa7b":"reveal(bytes32,uint256,bytes32)","5137dd99":"only666()","5137de7a":"privateReleaseTime()","5138574b":"setNextCommonTTMTokenId3(uint64)","51392041":"getDividendTokenBalanceOf(address)","513a0149":"setRocCoreAddress(address)","513a976e":"YaqootToken()","513ad9cb":"EvTokenRm(uint256,uint256,uint256)","513cb145":"convertToUSD(uint256,uint256)","513d085b":"Pandemica()","513d16a7":"setFundingStartTime(uint256)","513de1d3":"changeDivisor(uint256)","513f7d1e":"tokenValue(address)","513f99e7":"tokenFrozen(uint256)","513fdce9":"addClearingPriceValidator(address)","51401d4d":"gameMaxBetAmount()","51404cbe":"forceDivestOfOneInvestor(address)","51409f51":"currentTradingSystem()","5142ba74":"rolloverFeePeriod()","5142bc1e":"getAllowedRangeOfChoices()","5142c3ec":"assertEq13(bytes13,bytes13)","51430cb3":"claimMaxAmount()","51431800":"getSendableEther()","5143284d":"start4NormalPeriod()","5143659d":"claimCooldowns()","51436641":"convertToMiniCQS(uint256)","5143821e":"_moveToArea(uint16,address)","514385be":"disableConnectorPurchases(address,bool)","5143a9fe":"deposit(address,uint256,address,bytes)","5143e246":"mintLocked(address,uint256)","5143eea2":"addOwnerFromRecovery(address,address)","514403b3":"setnodemoney(address,uint256)","5144417c":"news()","51446e85":"CITRUX()","51464905":"updateGoldInvestor(address)","5146585a":"calcInterestRateNumerator(uint256)","5146690e":"reservesWallet()","5147af92":"buyGasLimit()","51489551":"getToken(bool)","5148ccb9":"DynamicCeiling(address,address)","5148de8d":"minimumTimeBeforeUpdate()","5149ffcb":"calculateSubmissionIndex(uint256)","514a48ae":"_changeApproveDate(uint256)","514a88ae":"revokeSchedule(address,address,address,address)","514ae8a6":"MagneticsToken(uint256)","514b13f2":"presaleConversionRate()","514d6e07":"horseShoeFS(uint256)","514d7067":"workOrderCallback(address,string,string,string)","514d717c":"developReserveWallet()","514dcfe3":"seller_accept()","514ec8ae":"TOKEN_CENTS()","514f0330":"changeProtocolFeeRecipient(address)","514f310f":"_NewChallenge(address,bytes32,uint256)","514fcac7":"cancelOrder(uint256)","515053c6":"depositBond(address,uint256)","5150e8ce":"CPPGToken()","515134b3":"TianZhuCoin()","5151e2cc":"GREENBIT()","5152249c":"Paladin(uint256,string,string)","51524e5b":"AirDrop(address[],uint256[])","5152abf9":"OrderCancelled(bytes32)","515361f6":"assertEq(address,address)","515371a3":"getWinnerAddress(uint256)","5154865a":"crowdFundAddress()","51548a2d":"TOKEN_AMOUNT_ICO_STAGE2()","5155287a":"whitelistedMin(address)","51553205":"PreSale(address)","5155bafa":"maxPeriods()","5155d9c6":"getPetCardSeries(uint8)","51560da9":"topDogInfo()","51563527":"passDao()","51576510":"bountiesWallet()","51582ef3":"sendProxyTransaction(address,uint256,uint256,bytes)","51584916":"allowexternalContract(address,uint256,bool)","5158c829":"RECFCO(address,address)","5158ea5e":"disallowUsers(address,address[])","51593759":"carCountOf(address)","515a20ba":"setExpiration(uint256)","515b1e41":"zss()","515b3557":"STARTING_CROCS()","515c1457":"emitTransfer(address,address,bytes32,uint256,string)","515cbcb4":"dropCoinsMulti(address[],uint256[])","515ced53":"best_submission_index()","515d4503":"getBarCodeDataAtIndex(bytes32,uint256)","515d4d52":"totalAmountsBet(uint256)","515da4b9":"transactionList()","515f128b":"COMMUNITY_POOL_TOKENS()","515f25ae":"launchShipOnMEA(uint256,uint8)","515fdde3":"migrateFunds(address,address[])","51602590":"threeHotHoursPriceOfTokenInWei()","51605d80":"imageHash()","5160a21e":"AddDomainInfoDocument(string,string)","51613683":"crowdSaleStart()","5162b2b2":"isAddressWhitelist(address,address)","5163311e":"getLastWinnerTicket()","51640fee":"getCertificate(uint256)","5164bb4d":"getCurrentStinkyLinkys()","51651003":"redenom_dao_fund()","516517ab":"make(uint256)","51656af5":"GuigsTokenSale(uint256,uint256,uint256,uint256,address,address,address,uint256)","51656f08":"AgesToken()","5165749e":"createToken(string,string,uint8,uint256,address)","516583fe":"depositFrom(uint256)","5165a03d":"payout(uint256,bytes32,bytes32,uint8)","5166b68f":"unfreezeTransfersUntil(string)","5166cf3d":"canAttack(address,address)","5168afa4":"getPackageHash(bytes,uint8,uint8,uint8)","5169ed0e":"getCCH_edit_29()","516a6b22":"PingoToken()","516ae993":"setChargeFee(uint256)","516af259":"setCurrentStage()","516b48fb":"insertList1(uint256,string,string,string,string,string)","516c731c":"setOwner(address,bool)","516cbe1a":"efwtest()","516cd39b":"revokePermissionFrom(address)","516d70c3":"lockAllocationAddress(address)","516dde43":"expiryDate()","516de876":"go(bytes16)","516e7be7":"contractFailed()","516e9aec":"lockAndDraw(address,uint256)","516ed622":"registerDINs(uint256)","516edc99":"UNITYCOIN()","516f279e":"location()","516f6afd":"Project_Enable(uint256)","516f8986":"TOKENADDRESS()","5170a9d0":"returnSender()","517125fa":"minTokensForSale()","51714d2d":"CIRCLECOIN()","517186f3":"ownerModOperator(address,bool,uint256)","5171bdec":"AllocationProcessed(address,address,uint256)","51720b41":"targetContractId()","51731f21":"changeFreezeTrading(bool)","51751612":"EtchToken()","51758666":"getMesa(uint256)","5175f65c":"_ownerApproved(address,uint256)","51764a94":"Lesson_3(address,uint256)","51768e4d":"updateItem(uint256,string,uint256,uint256,uint256)","51777183":"private_setRandomAPI_extract(string)","5177942a":"setFeeRate(uint8)","51780fdb":"w(address,address,uint256)","51784a75":"withdrawPlat()","517880df":"secondaryICO(bool)","51788439":"hashRequest(address,address,uint256,uint256,address)","517a626f":"getUserLengthOnEther()","517a70d4":"mintAmount3()","517a9d64":"share(address,address)","517afbcf":"votingController()","517b1d8f":"setRegionCurrentPixelPrice(uint256,uint256)","517b2fa8":"depositDaiFor(uint256,address)","517c48c3":"LATPToken()","517c8b12":"GetTicketOwner()","517cf73e":"getSupplyRate(address,uint256,uint256)","517d95fa":"addusermoney(address,uint256)","517e62ab":"getTxTimestampPaymentKWh(bytes32)","517ebace":"eosOf(address)","517ee2e8":"CSLottery()","517ee30d":"CreateHOLY(address,uint256)","517f4a23":"SalesManager()","517f6c51":"HardcodedCrowdsale(uint256,uint256,uint256,uint256,address)","517fe4de":"showUser(address)","51804743":"LandAccessControl(address)","5180629d":"transferByOwnerContract(address,uint256)","5181500d":"ExoplanetToken()","51819edb":"emergencyWithdrawParsecs(uint256)","5181aa01":"RELEASE_END()","51838717":"addSmartContract(address)","51843b06":"supporterBalances(address)","51846028":"setColorsX8(uint16[8],uint256[40],uint256)","518496b2":"proposedWithdrawal()","5184c96d":"escrowList()","5184cc43":"getFactor()","5184ffc9":"setAmbiAddress(address,bytes)","51858e27":"emergencyPause()","5185b724":"allocateReservedTokens(address,uint256)","51867b19":"withdrawnFrom(address)","5187527f":"reversePurchase(address)","5187a7d7":"GetSign(string,address)","51883f6e":"RecievedAnonDonation(address,uint256)","5188875b":"withdrawalToken()","51888969":"weiRaisedPreIco()","5188f996":"addContract(bytes32,address)","51892c0f":"BIGER(address)","51892f07":"changeMintingAddress(address)","518995cd":"addClip(string)","518ab2a8":"tokensSold()","518ada3b":"GetUserBets(address)","518adacd":"notifyAuthority(string,string)","518b1a33":"ALLOC_LIQUID_TEAM()","518b4372":"getInvoices(address,uint256)","518b7a29":"totalDETsSold()","518bddd9":"getCustomer(string)","518bed3f":"calculateTokensAmount(uint256)","518c0f17":"tokensOnThisChain()","518d3b64":"getTotalSent()","518d6c2d":"_preApprove(address)","518d7981":"adjustBalance(address,address,int256)","518e62db":"createOrder(address,address,uint256,uint256,uint256)","518fd40e":"cdtTokenAddress()","5190674b":"resignAsCurator(address)","51906bb0":"endTimeStamp()","51913124":"batchTransferMSM(address[],uint256[])","5191e37f":"listMultipleItems(uint256[],uint256,uint8)","51922341":"transferICOFundingToWallet(uint256)","5192f3c0":"boolToInt(bool)","519559ed":"contractMax()","5195e8c5":"mintData()","51965e75":"getRocrocId(uint256)","51971109":"UntungWaluyo()","51973391":"sentBonus()","51973ec9":"log()","5197c7aa":"getX()","519903f1":"unionBalance()","51992fcb":"addTokenAddress(address)","519936db":"StartAuction(string,uint256,uint256)","5199f1de":"lastYearTotalSupply()","519a078f":"getCommunitybyIndex(uint256)","519a1a41":"getSetup(address,bytes32)","519a73c3":"stopAcceptingDonation()","519af30e":"withdrawAllEth()","519be2f5":"resetDemo()","519bf602":"reward8()","519c6377":"signup(string)","519d1059":"setPurchased(address,address,uint256,uint256)","519e55da":"getStorage(string)","519e9a92":"Log2(address,bytes32,uint256,string,string,string,uint256,bytes1)","519ee19e":"tokenSold()","519f9590":"appointNewCFO(address)","51a073fb":"removeFromSpecialRatesMapping(address,address)","51a0aff0":"stockBuyOrder(uint256,uint256,uint256)","51a0c395":"myUsingOraclize()","51a11e94":"tokenIssued()","51a14c9f":"GetPartWeight(uint8,uint256)","51a1ad6b":"VikkyTokenAirdrop(address,address)","51a1c192":"get_solution()","51a282ae":"bidEMONTIncrement()","51a28572":"SALE0_RATE()","51a36e34":"changeCrowdfundContract(address)","51a3aed5":"getCompanyPreferences(string)","51a4cd73":"sellCoins(uint256)","51a4f7f2":"Har(address,address,address,uint256,uint256,uint256)","51a5f2f2":"ConsultingHalf(address,address)","51a6b851":"actual_feedout()","51a76924":"getSpeed(uint64,uint64)","51a784e3":"currentCirculating()","51a88a38":"PictureLibraryCoin(uint256)","51a8c3d7":"PausableCrowdsale(bool)","51a9111a":"BONUS_PRE_ICO()","51aa0199":"ethereumPrice()","51aa0a30":"modifyPMTAccount(address)","51aadcdf":"crowdSaleContract()","51ab351c":"BONUSONE_DATE()","51ab720d":"numOfTimesSteal()","51ac0d10":"getTimeBasedBonusRate()","51ad0299":"Ship(string,uint256)","51ae7f95":"COMPANY_TOKENS_LOCK_PERIOD()","51ae8754":"calcSectionTickets(uint256[],uint256[])","51af083b":"MONTH_IN_MINUTES()","51afc4af":"_getMinAuctionSeconds()","51b07a96":"getUSDT(uint256)","51b0b931":"updataLockPercent()","51b2270f":"getICOLength()","51b30900":"generateMemoryProof(uint256[],uint256)","51b3666f":"applyBooster(uint256,uint256)","51b3d7b9":"_transferWithReference(address,uint256,string)","51b41b62":"getAllOwnersOfCard(address)","51b42b00":"deactivate()","51b46399":"triggerUnpauseEvent()","51b488d4":"throwsWhenGettingTokensInNotInitiatedSale()","51b546af":"EDCoreVersion1(address,address,address,address)","51b59341":"MoncryptToken()","51b644c0":"roundedDiv(uint256,uint256)","51b6914a":"Lara(uint256)","51b699cd":"isAuthorised(address)","51b6fe96":"distributeTokens(address,address[],uint256[])","51b72a9a":"removeActivator(address)","51b79495":"performFeelessTransaction(address,address,bytes,uint256,bytes)","51b79d55":"maxPremium()","51b95400":"SophosToken()","51b98927":"_withdrawProfit()","51b9a2f8":"ballotVoters(uint32,address)","51b9c785":"step_level()","51ba24c7":"Token_ExchangeValue()","51ba5f04":"registerImpact(string,uint256,uint256)","51ba7534":"LastExec()","51babf0c":"sellToken(address,uint256,uint256,bool)","51bba1cc":"itemTransferred(bytes32,uint256,address,address)","51bcc53e":"checkFloatingOwnSupply(address,uint256,bool,uint256)","51bdd585":"currentChallenge()","51bdf229":"DummyContract(uint256,uint256,uint256[10])","51be2361":"InterCrypto_Wallet()","51c03b85":"makeBid(uint16)","51c08f4d":"gameTimeOut()","51c13af3":"MAX_ALLOWED_BOUNTY()","51c15991":"endGamblingParty(uint256,int256,int256)","51c1ae00":"DGClubCoin()","51c1bba1":"offlineGame(address)","51c221ec":"holderReserveTokens()","51c3934f":"getContractsByStatus(address,uint256,uint8)","51c3a2c6":"CPCEFundDeposit()","51c3a5d3":"getPollsSize()","51c3b8a6":"setFreezing(address,uint256,uint256,uint8)","51c40c6f":"setIntrospectionRegistry(address)","51c4e395":"logMarketCreatedCalled()","51c54c68":"buySprite(uint256)","51c54ec6":"transferAllBalance(address)","51c5d54d":"rateSecondWeekEnd()","51c65298":"exportFund()","51c69b12":"twoMonthsLater()","51c72c87":"ProofTeamVote(address)","51c74a9e":"addCertificate(bytes,bytes,bytes,address)","51c81f01":"setBursar(address)","51c85565":"nextTournamentBank()","51c875d2":"DB()","51c8d4d0":"get_arbits_whitelist(address,address)","51c8e02a":"setStore(int256)","51c9b233":"changepublicbonus(uint256)","51ca0eb8":"FACTOR_PRESALE()","51ca6966":"RefundableCrowdsale()","51ca7a94":"addNodes(string,address)","51cb21ff":"getgamecardname(uint256)","51cb6ecd":"addRandomFight2Death(uint256)","51cb860a":"setAccountNote(string)","51cb9712":"newExpertise(uint256,uint256)","51cc391d":"MULTI_SIG()","51cc4d1d":"payDemurrage(address,address)","51cc508d":"Zeinun()","51cc7cbe":"PawCoin()","51cd7c0f":"MatchPayoff(uint256,uint256,uint256,uint256)","51ce3207":"getStockOwnerInfo(address,address)","51cf6b22":"burnInvestorTokens(address,address,uint256)","51cfa44b":"getStarTotalSupply(uint8)","51cfc731":"transferFromContract(address[],uint256[])","51cfdd58":"Dewcoin()","51cff8d9":"withdraw(address)","51d10161":"boughtToday(address)","51d20c7c":"Exchange_ETH2LuToken(uint256)","51d24a33":"addNewBoard(bytes32,string)","51d28a7e":"saleTokenPrice()","51d2a8fe":"BIKSPRO(uint256,string,uint8,string)","51d2cc8f":"grid(uint256)","51d31822":"setMarketAddr(address)","51d34040":"returnBet(bytes32)","51d38d5f":"addDeveloper(address,string)","51d467f5":"getLogFillArguments()","51d53bee":"HRHToken(uint256,string,uint8,string)","51d550d2":"getPendingBalance(address)","51d59a20":"impl_incomeOf10k()","51d5d98d":"hasEnoughTokensLeft(uint256)","51d5f44f":"saleHero(uint256)","51d6e547":"getNonce(bytes)","51d74ce5":"SetWageredWei(bytes32,uint256)","51d75dc6":"BUYER_STEP_2(bytes32)","51d962e1":"endRelease()","51d977a6":"TEST()","51d997b2":"isAbstainAllow()","51dabd45":"disapproveAll(address)","51dbc419":"_drainGame(bytes32,address,uint256[10])","51dc7659":"winNum()","51dc7f7d":"setPreferredCurrency(address,bytes4)","51dd3164":"getCurrentMinimum()","51dd8119":"announceFork(string,string,uint256)","51de097f":"e_Withdraw(uint256,uint256,uint256)","51de5541":"castUpgradeVote(uint8,address,bool)","51dea0ae":"updateOwnerShares(address[],uint256[])","51ded741":"rateThirdWeekEnd()","51df6d27":"GlobalLotteryToken()","51df9db9":"newPrice()","51dfc14d":"tokensOfferedOf(address)","51e00935":"Arrays()","51e09631":"totalVestedTokens()","51e0e26b":"allowedContracts(address)","51e10aa6":"calculateToFund()","51e16546":"_payFee(uint128,address)","51e1d427":"boolMemoryArray()","51e1ee12":"ContractorProposalClosed(uint256,uint256,address,uint256)","51e22125":"addPresaleWhitelist(address,uint256)","51e4eb07":"setContributionLockPeriod(uint256)","51e51b55":"startPreSalePhase()","51e55767":"getWeiPerContributor(address)","51e699a8":"setMainSaleDates(uint256)","51e6edee":"RETZO()","51e7f12e":"_doDestroyTokens(address,uint256)","51e82eec":"totalSetCredit()","51e94406":"weiRaisedPreSale()","51e946d5":"freezeAddress(address)","51ea468b":"getSupportersAddress()","51eace10":"unfreezeStartTime()","51eb5e93":"overdraftPeriodLength()","51ebe2f1":"bursarAddress()","51ec4285":"unvote(uint256)","51ec4525":"first_player()","51ec4fc7":"limitAddress(address)","51ec8433":"STTadmin2()","51ecfd16":"getCatPrice(uint256)","51ed17a4":"reservedTokensList(address)","51ed8288":"buyNFT(uint256)","51ed96b9":"enableContribPeriod()","51edbdbb":"setForeignBridgeErcToErcImplementation(address)","51edffed":"identifierIsOriginal(uint256)","51ee387d":"dividendsAvailable(address)","51ee43e5":"lottery(int8)","51eec810":"setCapitalization(uint256)","51eecc23":"setupBounty(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","51f1333e":"relievePool(uint256)","51f1fa97":"POHStartTime()","51f2f1d1":"timeTransferbleUntil()","51f364d5":"currentCostToPress()","51f3a7bd":"CoinFlip()","51f3b4bd":"collectFees(uint256,address)","51f468c0":"setClaimPrice(uint256)","51f4ec50":"setWriterId(bytes32,bytes32)","51f514d3":"computePayeeBalance(address,address,uint256)","51f550be":"IcoSupply()","51f59db2":"test_claimShares_emptyFeePool_notTranscoder()","51f68d80":"calculateLRCUnlockAmount(uint256,uint256)","51f6d8c6":"setBalances(address[],address,uint256[])","51f6f870":"createMicroModule(uint256)","51f80746":"DXBToken()","51f91066":"tag()","51f93215":"bond(bytes32,uint256)","51f96d33":"verifySignature(address,address,address,uint8,bytes32,bytes32)","51f9ff35":"lastDividendIncreaseDate()","51fa5810":"getEnginesIds()","51fa7efd":"returnAmountToMainAccount(uint256)","51fab7ff":"transferRemaining()","51fae45d":"astroIDPool()","51fafb72":"setSubscribe()","51fafd95":"cashierAddr()","51fb012d":"whitelistEnabled()","51fb3043":"tokensForPresale2()","51fb4001":"rateIcoMainSale()","51fba575":"NRB_Users()","51fbd91e":"donationsReceiver_()","51fbfe9d":"migrationCountComplete()","51fc6f59":"TokenManagerEntity()","51fd2c69":"quantityHeldInCustodyOfExchange(address)","51fdaf92":"checkExpiredfunds()","51ff1a06":"PaparazzoToken()","51ff4847":"signature()","51ffcab3":"bid(uint32)","51ffd9e7":"getRatePerTimeUnits(uint256,uint256)","52006050":"setBurnBounds(uint256,uint256)","5200d643":"OPENING_TIME()","52013484":"CalcWinnersAndReward(uint256[],uint256)","52019dc3":"payTokens()","5201effb":"setCompletionTime(uint256)","520282d0":"getBcouponAllocationFactor()","5202b615":"numberOfClosedGames()","52030899":"preSaleBlockNumber()","5204cfe1":"OpenRedEnvelope(string)","520543ab":"endStage2()","52058d8a":"tokenSupplyCap()","5205b80f":"getLeftToken()","52063985":"unlockAddr()","5206fea3":"_transfer(string,string,uint256)","5207c391":"setWhitelistedBatch(address[],uint256)","5208a157":"getCardsFromHash(uint256,uint256,uint256)","5208ce36":"STQPreICOTestHelper(address,address)","52091047":"changeVotingRules(address,uint256,uint256)","520929b6":"AlgeriaToken()","520aea97":"setNote(uint256,bytes32,bytes20,string)","520b1b65":"testGetAllCases()","520ba154":"changeAcct2(address)","520bbba3":"generateRequestAttestationSchemaHash(address,address,address,bytes32,uint256[],bytes32)","520bf4d8":"SmallInts()","520c37b7":"setOCGFee(address)","520c3db7":"relayRelease(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)","520c5828":"whitelisting()","520c7c8c":"bountiesAllocation()","520c7d6f":"PAYOUT_ATTEMPT_INTERVAL()","520ce36a":"Permian()","520ce39e":"DamnRocks()","520e12d7":"getCertAddressByID(string)","520e7b0e":"offer_energy(uint32,uint32,uint64,uint64)","520e8143":"returnTokenToWallet()","520eb620":"getTemplateByProposal(address,uint8)","520ee757":"NewSandwichTicket(string,address,string,string)","520fa2c1":"BetleyToken()","520fd799":"Nplay()","52108d4c":"setCCH_edit_30(string)","5210eb56":"targetAddress()","5211ac2e":"withdrawWei()","5211e91e":"CSTToken()","5211f843":"bbNetworkGrowthWallet()","52122abf":"JackpotHits()","52125b86":"eventcount()","5212e6ea":"firstExtendedBonusSalesEnds()","5213cca8":"AdvisorPoolAddress()","52146744":"AteamBets(uint256)","52159bcf":"CreateCityData(address,uint256,uint256)","5215ad0b":"batchTransfer(address,address[],uint256)","5215cb88":"onPresaleComplete()","5216509a":"numCandidates()","5216aeec":"totalInvested()","5217b774":"redeem_withdraw(address,address,uint256)","5217cdff":"greyToken()","52180208":"take(address,uint256)","52185f0e":"isWithinAllocation(address,uint256)","5218bfbb":"getOffer(bytes32,address)","5218c37d":"bulkRejectTransfers(uint256[],uint256[])","5218f3b3":"CoinStocker()","52194acf":"addBank(address,address,uint256)","52196812":"getLoanCount()","5219823a":"hashMessage(bytes)","52199094":"setBurningPercentage(uint256)","5219a72a":"mcgregortoken()","5219ffb8":"withdraw_tokens_for(address)","521af962":"DataBrokerDaoToken(address)","521b20ec":"highestBidAddress()","521b601a":"setData_26(string)","521b7499":"setStageVolumeBonuses(uint256,uint256[],uint8[])","521be69c":"applyTokens(address,uint256)","521c82be":"getCCH_edit_17()","521cd656":"playersAmounts(address)","521ceba7":"pusherTracker_()","521d56c6":"regeneration()","521d80f8":"fundsTransfered()","521e5770":"fechCurrentSnapshotBlockIndex()","521eb273":"wallet()","521ec3af":"MGLTToken()","521ee1ae":"purchaseFor(address,address)","521f4195":"isOwn(address,uint64)","521fba45":"setTokenInfo(string,address,address)","521fba71":"getRandom256()","521fbd3a":"deploytime()","521fd5be":"getSingleBet(uint32,uint32)","52200a13":"getNumHolders(uint256)","522103fa":"changeUnicorn(uint256,address)","5222cd8a":"Deal(bool,uint8)","5223478a":"setIsPoop(bool)","52238fdd":"calculateFees(uint256)","522471fc":"setTotalWithdraw(uint256,address,uint256,address,bytes,bytes)","5224dfbe":"mainTokensPerDollar()","52251884":"setForwardPurchaseFeesTo(address)","52253542":"playSingleDiceBet(uint256,uint256)","5225528e":"getBadAddresses()","522567c8":"transferedTokenOf(address)","52256d44":"MuratCoin()","522577e9":"totalIncome()","522637e7":"CMCLToken(uint256,string,string,address)","52279295":"interestRatePerCycle()","52288195":"Sell(uint256)","5229c56f":"getDecreaseAllowancePreSignedHash(address,address,uint256,uint256,uint256)","522a6cf3":"computeMilkSellPrice()","522afaec":"increase(address,uint256)","522bb704":"run(address)","522c8401":"bidOnSiring(uint256,uint256,uint256)","522dba5b":"GoldTokenMinter()","522dc0b1":"walletsFromUser()","522dd549":"advisor3Sum()","522de7d3":"verifySubmissionIndex(uint256,uint256,uint256)","522e1177":"complete()","522e2d3c":"BiathlonToken(address,address,string,string,uint256,address)","522e35fb":"changeIssueManager(address)","522e4c8a":"addStaff(address)","522f6815":"withdrawEther(address,uint256)","522f9585":"setNewWallet2(address)","52306f4a":"isCBE(address)","52314508":"registerOutcome(string,uint256)","5232d457":"PayoutEvent(uint256,address,uint256)","52337ab0":"interact()","52346412":"transfers(address[],uint256[])","52353e5b":"assetsOnDeposit()","52357779":"currentRId_()","523615aa":"AddApprovedAddress(address,address)","52374af1":"bitPremiumToken()","52375093":"m_lastDay()","5237d235":"getRightToken()","5237e325":"getAdIdByCat(uint256,uint256)","52380eba":"entitled()","52380f65":"MoneyAddedForRefund(address,uint256,uint256)","52388c1b":"AndreisToken()","523898f4":"cooperativeClose(address,uint8,uint256,bytes,bytes)","523934bb":"registerExport(bytes8,bytes8,uint256)","52393d45":"SGDT()","523a0b0d":"privateMaxEtherCap()","523a3f08":"withdrawReward(uint256)","523ad959":"bullAmount()","523aee69":"changeTokenContract(address)","523afb0d":"bet(bool)","523b6ae3":"MycoinToken(address,address)","523c02f5":"getRateForExternal(string)","523ccfa8":"isKnownCall(address)","523d897e":"wsub(uint128,uint128)","523da442":"getCurrentBonusTier()","523deadb":"getOwner(address,address)","523e27d4":"currentInvestor()","523e57be":"mintForHolders(address[],uint256[])","523e9551":"increaseCap(uint256)","523f110e":"updateRegion(address[16],uint256,uint256,uint256[],bool,bool,uint8[128],bool,address)","523f52c6":"setTgeIssuer(address)","523f53a6":"IntigoTest()","523f891c":"totalEligibleVotes()","523fba7f":"tokenBalances(address)","5240346d":"TV()","52405f56":"getMilestoneInformation(uint256)","52411891":"add(uint256[2])","52415840":"testMe()","5241590d":"addToAddressBalancesInfo(address,uint256)","52416347":"ParameterSet(string,string)","5241b39d":"renewal()","52437187":"callLib(uint256)","5244128a":"_claimableTokens(address)","52441d7d":"getCurrentUserShareBonus()","52447ad2":"doMint(int256,uint256)","52447d92":"burn_from(address,address,uint256)","5244d9a8":"removeIdentifier(bytes32)","5244ed87":"joinToTrack(uint256)","524559a3":"periodPreICO()","5245849e":"allowedAmountToTransferToPool()","5246a8df":"verifySig(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,address)","52476ceb":"shareTimeGap()","524773ce":"burnCount()","5247b9e9":"firstMintRound0For(address[],uint256[],bool[])","5248f2c8":"removeBankroll()","52494a14":"_isOwner()","5249be25":"tokenPriceUsd()","524a2ed9":"setBAUU(bytes32,address,uint256,uint256)","524a8131":"STARTING_ASSET_BASE()","524aa413":"ValidateWorldSnapshot(uint256)","524aae98":"getPromoLOTEarnt(uint256)","524b5cb9":"approveMintDelegate(address,int256)","524bd747":"getNbDemandes()","524d5ddb":"wagerPool5()","524d7daf":"verifyGame(uint256)","524d81d3":"numContracts()","524dcda3":"MINT_LOCK_DURATION_IN_WEEKS()","524e1149":"joinCreateGame()","524e2444":"setPI_edit_32(string)","524e4e61":"testDistribution()","524e65b9":"_getWinnerBetted(uint32,uint32)","524e915d":"player4Timestamp()","524eb29c":"setRequestBurnerContract(address)","524ee639":"setSpaceImpulse(address)","524f3889":"getPrice(string)","524fa7b9":"whitelistAdd(address)","52507790":"transferAfterDeadline()","52512599":"latpToken()","5251a343":"stopPurchaseTokens()","52529852":"W0kiT0ken()","5252cb2f":"generateUnsoldTokens(uint256)","525417f1":"getNextKeyTime()","52541b68":"takeAGuess(uint8)","525426fd":"increaseUSDRaised(uint256)","52545021":"AkshayToken(uint256,string,string)","52548946":"isSimple()","5254a38c":"onERC721Received(uint256,address,bytes)","5254b595":"TransferIndex()","5254b660":"canDeCompose(string)","5254c846":"getAction(uint8)","525550ea":"rescueAddress()","52556421":"getIssuer()","52556a46":"State(address[])","52558c2b":"CSPTToken()","5255a07b":"HeroTokenAuction(uint256)","5256a36e":"MAX_ICO_GOAL()","5256fcaf":"_giveRNG(uint256,uint256)","52573529":"setupPeg(address,address)","52578012":"createService(string)","5257c2b3":"soldTokenInPresale()","5257c508":"ico1Cap()","5257c825":"registerNameXIDFromDapp(address,bytes32,uint256,bool,uint8)","5257cd90":"randomNumbers(uint256)","5259347d":"default_helper()","52595c0d":"getOraFee()","5259fcb4":"centsRaised()","525a0ac8":"Claim(address,uint256,bool,string)","525a8cf0":"add_product(uint256,uint256,string,string,string,string,string)","525b25b1":"getDeploymentReward()","525b3fe3":"presaleLimit()","525c3966":"GMCB()","525d0537":"getWinnerFunds(uint256[])","525f8a5c":"setSaleStartTime(uint256)","525ffb7c":"ownersPayed()","52608d85":"rateEth()","5260de57":"numberOfTokensPerUser()","52613423":"OLOVE(uint256,string,string)","52617234":"changeSalePeriod(uint256,uint256)","5261ee83":"amountOfOwners()","5262c873":"calcGain()","52631ab4":"lastNonce()","52638d75":"create(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","5263ba87":"getLatestPatchTree(bytes32,uint32,uint32)","5263dbf3":"RooToken()","52642070":"DinarETHCrypto()","526441bb":"ExecutionFailure(uint256)","5264ff53":"test_forAgainst()","5265440c":"checkIsAttached(uint256)","5265565e":"_ecosysSupply()","5265a078":"getMemoryWordsLog2()","5265db80":"setPriceRatePhase1(uint256)","526606c9":"addFreezer(address)","52666403":"lockRewardToken(address)","5266cc7b":"init(address,uint256[],uint256,uint256,uint256,uint256,uint8,string,string,uint8,bool)","52675be3":"getElectionName(uint256)","5267bd0c":"allowedRefund()","5267e681":"Tokens_Per_Dollar_Numerator()","526825af":"updateFcontracts(uint256)","526938f8":"left35(uint256)","5269660c":"createInvestment(uint8[])","526a6b48":"transferTo(address,uint256,bytes,bytes)","526a99c8":"getJackpotLoseSide(address,address)","526aadc2":"mintBaseLockedTokens(address,uint256,uint256,uint256)","526b71f4":"InvestboxToken()","526b8462":"getPersiansOnTheBattlefield(address)","526b91d1":"transferSysAdmin(address)","526ba9fa":"TSB()","526bc7fa":"getGenCode()","526cb803":"getAllOfferingProposals(address)","526de5ea":"addChunk2ToWhiteList()","526e4d79":"requestRemainingTokens()","526e7f3a":"AWD()","526f652d":"propertyIdToOwner(uint256)","526ff1f0":"TLB()","52700ef0":"_changeClosingTime()","52704644":"transferFromInternalstaffdisbursementfund(address,uint256)","52709725":"owner2()","5270aa7d":"EtherGoToken()","5270d70d":"readBytes32s(bytes32[])","5271027b":"rentFlatDaily(uint256)","5271309f":"migrationInfoSetter()","52736814":"dutchAuctionToBuy()","52748cfe":"addDataResponseToOrder(address,address,address,string,bytes)","52753640":"registerXRateProvider(address)","52757292":"getEventSecond(uint256)","527596bf":"getDeployedChildContracts()","5276b91c":"BlackHToken()","52772264":"Contract(bytes32)","52774565":"getMyLockedFunds()","527749a4":"add_bounty(uint256,bytes32)","5277fda5":"bookWithEth(uint256,uint256,bytes,string,uint256[],bytes32)","52782648":"emitSkillAreasSet(address,uint256)","527942ac":"secondWeekPreICOBonusEstimate()","52798dae":"buyTicketByEarnings(uint256,uint256,string)","5279a5f8":"levelThreeTokenNum()","527aea0a":"getWeiBalance(address,address)","527ba1e1":"setIV_S(uint256)","527c08ec":"Max_CAP()","527d8f12":"ping(uint256,bool)","527f0900":"IncPrivateSupply(uint256)","527f4ff1":"setTransferAddressUser(address,address)","52802121":"depositEther(address)","528050a9":"salePreiodChanged(uint256)","5280b8ad":"getAmountBounus(uint256)","5280c3ee":"dealToken()","52810d5e":"UnitToken(uint256,string,string)","52812053":"outstandingQuarters()","5281947d":"cancelAdoptionOffer(bytes5)","5281bbe9":"contractExpirationTime()","5282f649":"risedUSD()","5283f339":"getAddress(address,string)","5283fd87":"giveReward(uint256[4],bool,uint32[4])","52848d8d":"kcck256strstr(string,string)","5284a4c7":"allocateReferalBonus(address)","5284b044":"Products()","5284e3d8":"RobotTradingIco(address)","5284e660":"_getEndOfLastMiningDay()","52855882":"confirmAddress(bytes16)","52860ea2":"ADDITIONAL_BONUS_DENOM()","528626fc":"updateNextStealTimeByOperator(uint32)","52879334":"requireNotZero(address)","52879ba6":"roleCheck(string,address,address)","5287ce12":"getDepositInfo(address)","52883fc6":"addTokenBalance(address,address,uint256)","52892478":"disburseAuthorizedPayment(uint256)","52892baf":"localConst()","52894449":"lastBlock_f17Hash_uint256()","528976de":"issueRefunds(address[])","528a683c":"keyExists(string,string)","528b5176":"zgetOtherContract()","528b8ed8":"MaxBusiness()","528ce7de":"withdrawByRndNo(uint256)","528d4156":"authorizedCreateTokens(address,uint256)","528d8797":"ModiTokenERC20(uint256,string,string)","528d9479":"FeeUpdated(uint256,uint256)","528eb417":"Demome()","528ebdd5":"noSales()","528eedcb":"sendSafe(address,address,uint256)","528ef5a1":"UNINAcoin()","528fa135":"changeStartTime(uint64)","528fd7b0":"manualPayExpiredDuel()","52909fc2":"dynamicExchangeChecks(bytes,uint256)","5290d773":"amountBurned()","52911bd8":"doesOwnEthHandle(bytes32,address)","52916687":"setAuditRegistrar(uint256,address)","52929a0c":"disable_throwing()","5292af1f":"sendBalance(address)","5292c1a9":"testThrowsRestartEnforceRevisions()","5292c8f1":"validContribution(address,address,uint256)","5293a436":"EscapeHatchCallerChanged(address)","5293f22f":"EOSRegistration(string)","5294157f":"sendWithAllOurGasExceptExt(address,uint256,uint256)","5294188b":"randomizerLottery(bytes32,address)","5294409f":"Mineable()","5294924d":"getMyLastFreeLotteryTimestamp()","5294bb2b":"unpayPooling()","5294d0e8":"tokensUnlockable(address,bytes32)","52954e5a":"makerTransferAsset(address,uint256)","52959d16":"ambiC()","5296085e":"callServer(address,uint256)","529865c9":"preBuy2()","5299ccc6":"isSubjectApproved()","529a7d6c":"BurnProposalAdded(uint256,address,uint256)","529ae0bf":"maxEthPerAddress()","529af369":"createAndSellAllAmountPayEth(address,address,address,address,uint256)","529b8e60":"ergebnis()","529d15cc":"sequence()","529d4800":"getLockedWalletGroup(address)","529db099":"viewAllControls(bool)","529dbdb5":"getMs(uint256)","529e65e1":"removeShopModerator(address)","529e6713":"setCustodyFactory(address)","529f0fb8":"setFee2(uint256)","52a00779":"bountyDelivered()","52a08c29":"jackpotPersent()","52a0b5ac":"registerBasket(address,address,string,string,address[],uint256[])","52a0cf38":"p2pUnlocker(address)","52a16bb0":"amountSold()","52a2695c":"isReachedGoal()","52a2720c":"extraTokensTransferred()","52a27baf":"read_user_daily_limit(address)","52a36938":"initDisabled()","52a554a1":"voteBoardProposal(uint256,address,bool)","52a5b002":"lastInterestCycle()","52a6f970":"ZHEY()","52a74b82":"getDebugNumber()","52a7cae5":"BitAlphaAirdrop(address[])","52a80129":"unlistQualifiedPartner(address)","52a82b65":"digest()","52a8aeab":"controller1()","52a8fe93":"kscBurnWhenUseInSidechain(address,uint256,string)","52a9039c":"allocations(address)","52a94adb":"TRMCrowdsale()","52a982d3":"distributeTokensRange(uint256,uint256)","52a9a35e":"retireAdmin(address)","52a9cd2d":"changeOwnerVault(address)","52aa2ae9":"enterPreSale()","52aadf3b":"generateLuckFactor(uint128)","52aaead8":"priceLastUpdated()","52ac3235":"amountOfQuotations()","52ac882c":"retirementManager()","52ad2aa8":"__getStore(uint256)","52ad4116":"getCrowdsaleStartAndEndTimes(address,bytes32)","52ad6468":"SHARE_FOUNDATION()","52ae68f6":"getRoundBonusPot(uint256)","52af1c04":"parseMessage(bytes)","52af719f":"initialize(uint256,address[],address)","52af89af":"getsum(uint256[])","52afbc33":"scheduleCall(address,bytes4,bytes32,uint256,uint8,uint256)","52b1e14a":"insertUser(address,string,uint256)","52b33d64":"clientmanagerShare()","52b4be89":"totalBuyCardNumber()","52b566e4":"CitiDynamicsCoin()","52b5e85c":"firstPhaseEndTime()","52b5ff39":"RBAC()","52b75219":"freezeToken(address,uint256,uint256)","52b7fddb":"createMechVRC(uint256,address)","52b860eb":"tokenBonusForFifth()","52baee20":"getAllHpbNodesByStageNum(uint256)","52bafbfa":"vestingBeneficiaryForIndex(address,uint256)","52bafde9":"playersSignedUp()","52bbde34":"BiddingRing(address,uint256)","52bca4c3":"phaseOneCap()","52bd6945":"sellReply(uint256,uint256,uint256)","52bd9914":"TimeEnd()","52bddee6":"uintCeil(uint256,uint256)","52bf74b3":"airDropCoin(uint256)","52c05ca5":"setWeiPerBlock(uint256)","52c0b9f7":"ICO_START3()","52c1c03a":"removeUnlockedAddress(address,address)","52c1d3d5":"ZenomeCrowdsale()","52c204d0":"ICOMeetupToken()","52c22a72":"cancelContract(address,address,uint256,string)","52c28fab":"add(address,address)","52c34e68":"getStandardRobot()","52c53cb7":"checkPoint(int256,uint8,int256,uint16)","52c5785b":"purchaseTokensPreSale(address)","52c5b4cc":"setAuthorizations(address,address[])","52c5d892":"withdrawOwnersFunds()","52c700ea":"crowdsaleStop()","52c743d2":"callDestination()","52c76b8e":"TokenGame(uint256)","52c76de9":"addDiscountPhase(string,uint8,uint256,uint256)","52c8df64":"getFund(uint256)","52c91d43":"getLinkedWETHAddress()","52c944b2":"removeFromTokenLocked(address[])","52c98e33":"checkClaim(address,uint256,uint256)","52c9b906":"founderTokenWithdrawnPhase1()","52cb2a7b":"calcTransfer(uint256)","52cb36cd":"_getUtTotal()","52cb7688":"suspendSale(bool)","52cbfe09":"summAirdrop()","52cc5fdc":"retrieveMyEth(string)","52cd972d":"PreSaleCloseTime()","52ceac34":"bytesToUint(bytes,int256,bytes)","52cf4078":"transfertWDiscount(address,uint256)","52cf46d4":"transferAllowed(address,uint256)","52cfd41f":"advisorFee()","52d005d6":"findNewExchangeContract()","52d08730":"DogeCoin()","52d0bf14":"setDataColla_AA_02(string,string)","52d214a7":"removeUnitMultipliers(address,uint256,uint256,uint256)","52d23633":"getNumDividends()","52d28a17":"muscFundDeposit()","52d2d83d":"setBoolValue(bytes32,bool)","52d35197":"JLL()","52d3592a":"VoteExecuted(uint256)","52d3642d":"sellToContract()","52d3a9dd":"rentAuctionContract()","52d472eb":"rewardPercentage()","52d4747f":"BurnTokensFrom(address,uint256)","52d48a95":"getXPub(address)","52d4e76c":"ControllerRetiredForever(address)","52d50408":"statusContribution()","52d5ad25":"currentRecords()","52d63b7e":"setNextSale(address)","52d6804d":"minimum()","52d714e8":"approveMintingManager(address)","52d7d861":"AddrChanged(bytes32,address)","52d850d1":"tstinx()","52d8bfc2":"recoverEther()","52dbb027":"newModelShipProduct()","52dc09a5":"test_4_assertGasUsage700Boards()","52dca247":"ttlInvestCount()","52dd336a":"_tokenAllocate(uint8)","52e021c2":"securityReg(address)","52e0d025":"maxUserPayment()","52e0d0fa":"BIPOOH_DAO_32_a()","52e11d12":"DanCoin()","52e1ea89":"setDonator(address)","52e2525f":"ownerSetFee(uint256)","52e2f9ea":"MerculetToken(uint256,uint8,string,string)","52e32a55":"bounty0xToken()","52e34245":"disputeTX(uint256)","52e3d369":"saleConversionRate()","52e40d96":"PPKToken()","52e43613":"approveToMint(uint256)","52e536ad":"icoLeftSupply()","52e578ad":"LOG_EmergencyAutoStop()","52e57d1f":"makeLogError(uint8,uint256,uint256)","52e60b90":"setTalentCardAddress(address)","52e686a0":"EnableReturnFunds()","52e68c46":"list_token_ask(address)","52e8f2c3":"deleteRecord(uint256,string,string,bytes32)","52e94beb":"setPrice(uint256,bool)","52e97326":"changeTotalSupply(uint256)","52ea5667":"getMPbyIndex(uint256)","52ea8a71":"setRandomApiKey(string)","52eae80b":"doProvideStateRoots(uint256,bytes32,bytes32[])","52eb2580":"Tethered(address,string,string,uint256,uint32,uint256,uint256,string)","52eb5751":"MedicoHealthContract()","52ec8a58":"mint_and_transfer(address,uint256)","52ece9be":"freezeAllowance(uint256)","52ecf7c4":"pickWinner(uint256,bool,bool,bool,bool,bool,bool)","52efd35f":"INCENT_FUND_VESTING()","52efea6e":"clear()","52effe11":"transferOwnershipTo(address)","52f17ce9":"pomda()","52f18042":"addAdditionalBonusMember(address)","52f1e07b":"ethRefundAmount(uint256)","52f1f48c":"setInv3(address)","52f29a25":"nextPunkIndexToAssign()","52f37c40":"isHodler(address)","52f445ca":"setAssociatedContract(address)","52f46769":"InitializedTier(uint256,uint256,uint256,uint256,uint256)","52f50db7":"initiate(uint256,bytes20,address,address,uint256)","52f59e0e":"AICH()","52f62195":"picops_enabled()","52f662bb":"sendTokensToInvestors(address)","52f6747a":"rules()","52f6ca76":"deadDragons()","52f6ee58":"exponent()","52f775c8":"ViewSecretBet(address)","52f7c988":"setFee(uint256,uint256)","52f804a8":"burnPollStake(address,bytes32)","52f84b1b":"BlangsakToken()","52f8a766":"TimeStampSubstructOneDay()","52f9058b":"getFreeRickAndMorty()","52f91acf":"triggerDispute()","52f97117":"createContract(bool,string)","52fa1ac2":"createUnicornForCandy()","52fa2650":"withdrawPercents(uint64)","52fa3712":"makeBet(address,uint256,bytes32)","52fb0561":"setWhitelistedTransferer(address,bool)","52fba25c":"attack(address,uint256)","52fbeb57":"transferToContractWithCustomFallback(address,uint256,bytes,string)","52fc01f9":"func_1(uint256,uint256)","52fd2c15":"ServiceStation()","52fdcc65":"GAME_SUPPLY()","52fdeef5":"_addToFundHWC(uint256)","52fe8163":"randomDS_sessionPubKeysHash()","52fea23c":"teamAllocator()","52fedceb":"getMarketComissionRatio()","52fedefa":"decrementBalance(address,address,uint256)","52ffeb30":"highestBidTime()","52ffff99":"addAllowContractList(address)","5300a306":"changeTransactionFee(uint256)","5301fa52":"setPromoCode(address)","5302470a":"submitPlaintext(uint32,uint32,uint256,uint256)","530266c7":"getSellOrderInfo(address,address)","5302a136":"fourthPriceTime()","53030d91":"investmentAddress()","5303a5d7":"RESEARCH_DEVELOPMENT()","53043490":"ownerTransferFrom(address,address,uint256)","53047154":"createPromoMovie(address,string,uint256)","53055262":"awardMarble(uint256,address)","53055481":"totalDeposited(address)","53056351":"DIGIPLACEDS()","53067968":"GetSellingTokenContractAddress()","53069df6":"getRepaidAmount()","5306a5af":"LogRollbackTransfer(address,address,uint256)","530795fb":"initNormal()","5308db4b":"finalizeBundleIPFS(bytes32,string,bytes32)","5309ce38":"PrintLimiter(address,address,address,uint256)","530abf0f":"distributeTokensToContributor(uint256,uint256)","530b1e1a":"recording(address,uint256)","530c435f":"whaleWantMyEther()","530c4ca6":"setGames(address)","530c6868":"getContributorETH(address)","530d26b0":"MattewWon(string,address,uint256,uint256)","530d44f4":"normalRate()","530dfad3":"addItemToUserDebt(address,bytes32)","530e3543":"addMemberToGroup(address,uint256)","530e784f":"setPriceOracle(address)","53105fbc":"tokenConversionFactor()","5310f0f4":"priceInUsd()","531163c1":"TOKEN_MAIN_CAP()","53127b88":"encrypt(uint32[26],uint32[4])","5312918b":"VestingEndedByOwner(address,uint256,uint256)","5312aa24":"Bigchaintoken()","5312ab19":"HoviiExchange()","5312b4bb":"pyrBalanceOf(address)","53135ca0":"presaleActive()","5313d890":"_markCredit(address,uint256)","53147d4f":"TokenCrowdsale(uint256,uint256,address,uint256,address,address)","531571a9":"connectTokens(address,address)","5315810e":"isSponsor(uint32,int256,uint32)","53176195":"witnesses()","53179413":"transfersBlocked()","5317e444":"removeUserPermission(address,bytes4)","5319418a":"transferLockedBalance(address)","5319ae10":"generateInstance(address[2],bytes,bytes32[2],uint256[3],bytes32[3],bytes,bytes)","531a7f29":"dateProductCompleted()","531b6d98":"LogHodlSetStake(address,address,uint256)","531b97d7":"oneCentOfWei()","531c1b33":"getOperatingBudget()","531c267e":"getGameResolverData(uint256)","531c8628":"amount_referral_invest()","531c9a56":"iPayStar()","531ca478":"VantageCrowdsale(uint256,uint256,uint256,uint256,uint256,address)","531ce262":"bankWithdraw(address,uint256)","531d1974":"testThrowRetractLatestRevisionEnforceRevisions()","531e1ee0":"EarlyPurchaseInvalidated(uint256)","531e4827":"poolTimeLastMinted()","531ebce5":"getReceiverAddress()","531ef079":"setBvToBpFee(uint256)","531efbee":"_score(bytes32)","531f4c40":"accept(bytes32,bytes32)","531ff93b":"setMrkContract(address)","53214e5a":"kilo()","53216223":"TravelCoin()","5321fe04":"subFromBalance(address,address,uint256)","5322f0c5":"getChannelOwner(bytes)","5322f9d1":"switchSale()","532399d9":"setTransContractLocked(bool)","5323c6cf":"calcCostsBuying(bytes,uint256,uint256[],uint8,uint256)","5323df9e":"getShipDetails(uint32)","53240172":"midiv(uint64,uint64)","53251389":"addBridgeNativeFeeReceivers(uint256)","5325dc16":"test_validShouldBe3()","53269475":"loveToken()","5326ba37":"setSaleAuctionERC20Address(address,address)","53270910":"deedOfOwnerByIndex(address,uint256)","5327f96e":"OwnerTransfer(address,address)","53286957":"CuboToken(uint256)","53290b3a":"setStateLoading()","53290b44":"getBalanceOf(address,address)","53290d1c":"founderGrant(address,uint256,uint256,uint256,uint8)","53295e44":"OtcgateToken(uint256,uint8,string,string,address)","53297b71":"completeReleaseAuction(uint256)","5329c681":"checkTimeout(uint256)","532af7d2":"calculateResult(uint256,uint256)","532b581c":"round2()","532b5f86":"createBytes32(bytes32,bytes32)","532c3dc5":"nAuditors()","532da8f9":"getDelayDays(uint256)","532e4849":"setTokenUriPrefix(string)","532e7e6a":"calcEarningsSelling(bytes,uint256,uint256[],uint8,uint256)","532e87e4":"setTimeForCrowdsalePeriods()","532eb619":"_sellTokens(uint8,address)","532f1041":"setFormat(bool)","532f1179":"refundsEnabled()","532fb092":"isApproveConfirm(uint256)","532ff308":"setBonusRates(uint256[],uint256[])","532ff568":"Tutancoin()","533019cb":"kyberReserve()","5330a4c6":"buyMicroKeys(string)","5330bc61":"disallowTransfer(address,bool)","533178e5":"get_rate()","53322527":"EthlanceViews(address)","5332510b":"EthernautsLogic()","533265e6":"Database()","53329856":"secondBuyPrice()","5333c507":"allowTransferFor(address,bool)","5333ee4d":"buyEgg(uint256,uint256)","533425a5":"icoPeriod()","5334398f":"addRecordwithReward(bytes32,string,string,address)","53344481":"isInTier1(address)","5334c231":"currentSwapRate()","533574ca":"getLastDividends(uint256)","53358fc4":"castVote(address)","5336cd16":"_getEndIndexKey(uint256)","5337421a":"TrumpBingo()","5337448e":"payWinners()","53376d1f":"revokeAuthentication(address)","5337fa10":"awardPoint(int256,bytes32)","5338b3e4":"miningTokenLeftInCurrent()","533945df":"editMemeTemplate(uint256,string,string,string,string)","53397be3":"lastConsolationPrize(uint256)","53398119":"emergency(bool)","533a645c":"minTx()","533ae8e5":"inTipperQueue(uint256,address)","533b180e":"LAcoin()","533c023b":"getGroupRight(string,string)","533d4270":"ClipperCoin(uint256,uint8,string,string)","533da8df":"getAreaOwner(string)","533de9e5":"addSmartContractByAddress(address)","533e00ec":"approveAndDo(address,uint256,address,bytes32,string)","533f6730":"clearInventory(uint256)","53400e7f":"debugNow()","534104df":"UnilotTailEther(uint256,address)","5341903b":"upgradeMe(address)","5341d618":"setDataColla_AB_02(string,string)","5342da41":"testBeyond()","5343e6a4":"rateFinalStage1()","5343f1a0":"cancelOrderWithMerchant(string,address)","534439a3":"mintingDec()","53448316":"MIN_SALE_AMOUNT()","53449d26":"TourPool()","534514ee":"adminCharge_p3()","53458f5e":"defaultTreesOwner()","5345c415":"LogOwnerAdded(address)","534607fb":"info_OwnerOfContract()","53462d6b":"getReleaseTime()","53462fd8":"NCPTokenDeposit()","5346dcc5":"calculateTokensEnabledforAirdrop(address[],uint256)","5347d58c":"Paradime01()","534844a2":"withdrawAmount()","534878fb":"reply(address,address,bytes32,bytes32)","53488f0a":"activateAuction(uint256)","5348ac95":"makeTokensTransferable()","53490c67":"earlySuccessBlock()","53490fbb":"EPR()","53497794":"RepublicKey(address[])","534992c8":"showTokenBalance(address)","5349a335":"setThirdAdmin(address)","5349cdb6":"Testcoin()","5349efdc":"generatetoken(uint256)","534a2f7c":"WTechCoin()","534b0391":"getVerifiedInfo(address,address,string)","534c2609":"checkBtcRequestSignature(bytes,bytes,uint256,bytes)","534d5acb":"initialBSTSupply()","534d5ce3":"RobaToken()","534ddf19":"reclaimContributionDefault(address)","534e05c1":"_goldFreeze(uint256)","534e2645":"getLucy()","534e3f81":"finishPVP()","534eb1d4":"offerBonus(uint256)","534f6a2d":"LogGrantClaimed(bytes32,uint256)","53501052":"extraTokensPercent()","53511819":"triggerAssertError()","53515226":"getEtherProceedsAccount()","5351ad81":"FrellyToken()","5352aadb":"allowedBetAmount()","5352b889":"isNewRound()","53537303":"bonusRatePeriodOne()","5353a2d8":"changeName(string)","5353e168":"rlc_team()","53547d3f":"mintBooty()","53554015":"newZeusPriceTicker(string)","53556559":"exchange(uint256)","5355ee2f":"CryptoSneakersCoin()","535779ef":"removeFromAddresses(address)","5357b989":"calculateFee(uint256,uint256,uint256)","53584939":"bytesToBytes32(bytes,uint256)","5358677c":"BACKUP_FOUR()","5358c119":"getFaucetByCreator()","535999aa":"getarg_3_input()","535a920c":"setLANDRegistry(address)","535b27dd":"BitImageTokenSale()","535b4e58":"adminResetLottery()","535bf003":"appVersionList(bytes32)","535c69b6":"setEthAuction(address)","535d1ab3":"claimWork(uint256,uint256,uint256)","535d3f22":"RankingBallGoldToken(address)","535d4156":"killWithBenefits()","535d9289":"RDPTicks()","535dc2b0":"_b1(string,uint256,string)","535e401c":"check(bytes32,bytes32,bytes)","535f23ad":"mainSaleStartDate()","53601ec5":"_transferFees(uint256,uint256[],uint256)","5360cd82":"GetContractInfo(string)","53613273":"setTymTokensWallet(address)","53613769":"setDistributorAmount(address,bool,uint256)","53613dd3":"creatorFeePercent()","536253a9":"getRandomForContractClanwar(uint256,uint256)","53636220":"depositToExchange(uint256,uint256)","53645caa":"rewardDays()","5364e45d":"setStartBalance(uint256)","5364f721":"getArbInfo(uint256)","536529dd":"WarpSpeed()","5365939c":"unlockedTokensInternal(address)","5365ccf7":"CCH_MENA_1()","53663c0b":"distributeAIC(address[],uint256)","53667f10":"getContracts(address,address[],uint256)","5366d0fd":"operationalExpensesWallet()","5366f338":"publishFor(bytes12,address)","53677154":"placeAnswer(uint256,string)","5368cc55":"getBack2()","536942b6":"finalizeAndRestart()","536a3ddc":"currentGameId()","536aace8":"setUserSignupTokens(uint256)","536bd93a":"SetAccessoryDataContact(address)","536c1ddd":"SampleERC23Token(address,uint256)","536c26e5":"MiniMeIrrevocableVestedToken(address,address,uint256,string,uint8,string,bool)","536c2e4a":"sendEmail(address,string,bytes32,string)","536c8c15":"jurySize()","536c9a7f":"dividendFundAddress()","536cb736":"setPreUri2(string)","536cfceb":"todaysSupply()","536d888b":"isServiceOwner(bytes32,address)","536d97c2":"setDividendsPercent(uint256,uint256)","536db4a8":"getParametersHash(uint256[14])","536dd8f9":"maxTokensToSold()","536e08bc":"getTokensBalance(uint256)","536e2800":"buyForWorkOrder(uint256,address,address,address,string,address,address)","536e3f6a":"getOracleData(uint256)","537038c3":"BOUNTY_PERCENT()","5370a049":"thebank()","5370e3d4":"Ozreal()","53718569":"generateRandomStats(string)","537187a3":"transferWithMsg(address,uint256,string)","53719b6e":"lockedTokens(address,uint256)","5371e490":"Presalezillion()","53729273":"getLLV_edit_9()","5372a9ce":"addService(address)","5372c1db":"PeriodicTokenVesting(address,uint256,uint256,uint256,uint256,bool)","53734dc5":"refundContribution()","53738a4c":"distributeOwnedTokensFromOtherContracts(address,address,uint256)","53749313":"PortToken()","5374eec3":"hijack(uint256,uint256)","5375a828":"createLibraryWithFounder(string,string,address)","5375f182":"IronHandsCoin()","5376a03d":"getProfitOrLoss(address,address,uint256,uint256)","53770f9a":"isStateless()","53775572":"_claimOreAndClear(uint32,uint8)","53779c11":"claimDividendByIndex(address,uint256)","5377f047":"allowedMultivests(address)","53790097":"Exhibition()","53799e7d":"frozenType(string)","537a082c":"withdrawSaleRequest(uint256)","537a924c":"Pay()","537afe94":"eastadscreditsx()","537b9c93":"NotFomo3D()","537bf9a3":"updatePermissionName(address,bytes32)","537ca660":"_setPetValue13(uint256)","537dbb80":"claimUserToken(address)","537df3b6":"removeFromBlacklist(address)","537f5312":"updateSymbol(string)","537f74fc":"_transferFrom_byProxy(address,address,address,uint256,bytes)","537fcd6b":"_computeAndSetBaseParameters16_18_22(uint256)","537fdf59":"user_redeem()","538082af":"UKG_FUND()","53811553":"getCertificate(bytes32,bytes32,bytes32)","53813af8":"getmy(address)","5381464c":"PRE_SALE_START_TIME()","53819e85":"getTotalComission(address)","53822cda":"createShortId(bytes32)","53844552":"addPayees(address[],uint256[])","5384527a":"tokenResend()","5384602d":"craetePartnerBytes(address,address)","5384734e":"isConfirmedStackholder(uint256)","53850db3":"getParticipantById(uint256)","538548c5":"recevedEthFromEvabot(address,uint256)","538564de":"assegna_diritto_di_voto(address)","5385726e":"maxTIPSupply()","53865562":"CLOSING_TIME()","5386b7ad":"dtTestWorldSnapshot(uint256)","538739fa":"operatorManager(address[],uint8)","538741c5":"getAllowedContracts()","5387a233":"feeLottery()","538811cf":"hasAllocated()","5388842c":"mintTicket(address,string)","53892496":"finney2LemoRate()","538a289a":"getSandwichInfo(uint256)","538a3f0e":"initializeFactory(address)","538a849c":"newRound(uint256,uint256,uint256,uint256,uint256,bytes32,uint256)","538a8c21":"giveawayReserve()","538b9618":"createElectionVerify(bytes32,bytes32[])","538c91b2":"validCandidate(string)","538d1267":"Announcement()","538df6f2":"claimedPrepaidUnits()","538dfcac":"contributionRejected()","538e0759":"refill()","538e0ff4":"totUsers()","538e8ae0":"assertEq19(bytes19,bytes19,bytes32)","538eae06":"ZuperToken()","538f5997":"getBalanceSize()","538fb98c":"getCarProductCurrentPrice(uint32)","53900bdd":"incirculation()","5392279d":"CryptoWCRC(uint256,uint256,bool,address,address)","539407f6":"committeesNumber()","53941a74":"addInviteId(uint256)","5394772a":"MIN_BET_VALUE()","5394e49e":"getRandomPosition(uint8,uint8)","53954574":"withDrawBack()","5395dbb1":"createSchedule(address,uint256,uint256,uint256,uint256,uint256)","5397c83c":"distr0(address,uint256)","53994d51":"ThreeDJSToken(uint256)","53999040":"buyLandForCandy(uint256)","53999339":"prepareLiquidityReserve()","539af982":"changeStartDate(string)","539b9648":"icoSmartcontract()","539c0f14":"deposit2()","539e2bfb":"secondChainedCallback(uint256)","539f70d8":"setOperationState(uint8)","539ff41a":"ADVISORS_WALLET()","539ffb77":"cancelRedeem(uint256)","539fffc9":"WithdrawPrize()","53a01f68":"createWizzPanda(uint256[2],uint256,address)","53a023d1":"EUSBToken()","53a04b05":"play(uint8)","53a06609":"_incrementInventory(uint256,uint256)","53a1c51e":"getInitializeMarketValue()","53a3b71e":"tossIntoTheFire()","53a40850":"userHasPattern(address)","53a454e0":"SubtractAmount(uint256)","53a47bb7":"nominatedOwner()","53a4c8a3":"TriggminePresale()","53a4caee":"getMajorThreshold(address)","53a50f0f":"addDeal(uint256,uint256,string,string,uint256,bytes32)","53a5e2d9":"teamGrantsAmount()","53a5e68f":"CircusToken(address)","53a636dd":"updatePrice(uint256,uint256,string)","53a6e2c9":"Mantapjar()","53a73f6e":"setTotum(address)","53a8b307":"getObjective()","53a94aa6":"_computeNextSeedPrice(uint256,uint256)","53a9698a":"isProviderFor(uint256,address)","53a97873":"getPrice(bytes10)","53a9fc9c":"ELVToken()","53aa3f5e":"getUInt(bytes32,bytes32)","53aa7dcd":"setCallerFee(uint256)","53aaa63f":"collectBack2()","53aab098":"addPriceFeed(uint256,uint256,uint256,uint256,bytes)","53aab434":"buyIn()","53aaef7d":"weiToTokens(uint256)","53aaf7c7":"OperatorProductCommissionChanged(uint256)","53abf7f4":"parseTrade(bytes)","53ac36f4":"DropReward()","53acae4a":"RANGESTART_4()","53acb23f":"unlockPriceChange()","53adce21":"getGroup(address)","53ae8de6":"modify_Presale1StartDate(uint256)","53af5d10":"closingAddress()","53afda90":"initDiscounts(uint256[],uint256[])","53b0b620":"allocateBid1(address,bytes32)","53b15f31":"get_asset_details(bytes32)","53b1b49b":"Human()","53b239c7":"setPoWtfContract(address)","53b2dd41":"WGCToken()","53b382ea":"manuallyEnded()","53b5015c":"getClientSupply(address)","53b5306b":"getUnfreezingPrice(uint256)","53b54f5e":"transferWithoutDecimals(address,uint256)","53b5b427":"team4LockEndTime()","53b64b0b":"setNumDepositsSigned(bytes32,uint256)","53b6f766":"addTotalIndividualWeiAmount(address,uint256)","53b7a59b":"destinationWallet()","53b7b2e9":"cEthereumlotteryNet(bytes)","53b86342":"withdrawOwnersMoney()","53b8e278":"upgradedContract()","53b90b5b":"addWalletEmail(address,string)","53b93358":"_getPoS(address)","53ba11d0":"icoWalletAddress()","53babaf9":"processStellarReward()","53bad0b9":"boschcoin()","53bb2eb6":"buyOffer(uint256,uint256,address,bytes32)","53bc147e":"lastKickoffDateBuffer()","53bc1c12":"getJobState(uint256)","53bc1d9b":"ONTOPToken(uint256,string,string)","53bc373d":"SIT(address)","53bc7399":"play_stone()","53bc7d62":"setInvalidWithReturn()","53bd353b":"EarlyTokenSale(uint256,uint256,address,address)","53bd755a":"__setTokenPrice(uint256)","53bd8bdb":"isRequestExecutable(uint32)","53beb1f8":"checkHalfLife()","53bfd3d0":"getUserTearAward(address,uint256,uint256)","53c048ce":"TICToken()","53c06966":"startMining(address)","53c194af":"createIco(uint256,uint256,uint256,uint256,uint256,address)","53c1b31f":"MooToken(uint256,string,string)","53c24064":"EasyMineTokenWallet()","53c2828f":"rentalBalanceRemaining()","53c2e8ab":"FacebookCoin()","53c3419b":"bet(uint256,uint256,uint256,uint256,uint256,uint256)","53c37276":"frozenDaysForPreICO()","53c3a57d":"recalcFlags()","53c3cc1f":"ResumeEmergencyStop()","53c3fe8a":"hasICOClosed()","53c4aeac":"crowsaleSlots(uint256)","53c549da":"LemonContract()","53c64fbc":"peekQueue()","53c66d90":"YEEToken()","53c7186c":"test_token_creation()","53c7801c":"second_round_start()","53c8388e":"updateMetadata(uint256,string)","53c84526":"setSmartAffiliateContract(address)","53c86cfc":"UvoCash()","53c9843f":"preIcoCashedOut()","53ca1aa8":"GOLD_TO_COLLECT_1SWORD()","53cae7b8":"distributeAirdropMultiPresale(address[],uint256[],uint256[])","53caf582":"testThrowSetNotUpdatableNotOwner()","53cb26c6":"preciseDecimalToDecimal(uint256)","53cb430f":"setoldtoken(address)","53cc2fae":"unFreezeAccount(address)","53cc3e7a":"sysPrice()","53ce0a71":"USACoin()","53ce7de9":"participantIndex()","53ce910e":"getSafeKey(uint256)","53cea153":"claimableOwnerEth(uint256)","53ceee6c":"icoBuy()","53cf4d2b":"indexshow(address)","53cf51bc":"rewardSent()","53cfdda3":"setMonthlyPrice(uint256)","53d0f255":"STEP()","53d142a7":"setTokenInfo(uint16,string,address,uint64,uint256)","53d3e848":"abortICO()","53d3ed60":"isBotAt(address,uint64)","53d3eeee":"profitsRatePercent()","53d413c5":"removeKey(bytes32,uint256)","53d590bc":"softUndelete(bytes32)","53d69b07":"setPreSaleStartAndEndTime(uint256,uint256)","53d6fd59":"setWhitelist(address,bool)","53d70700":"setVotingParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","53d736ed":"CreateCard(uint256,string,string,string,string)","53d73718":"voting_info()","53d74fdf":"totalHolders()","53d797c9":"GetGoodsInfo(uint32)","53d7edbc":"_crowdsalePaused()","53d838b6":"getMatchAwayPlayers(uint256)","53d97e65":"setPrizes(uint32[])","53d99c2a":"tokenToEthRate()","53d9d910":"create(address[],uint256,uint256)","53da0c7e":"bonusesForAmountsCount()","53da4859":"ACT()","53dad947":"oraclizeContract()","53db1deb":"DredgrSwap()","53db5fdb":"getCreatorTAOSettingDeprecation(bytes32)","53db6b21":"AUMToken()","53dba812":"Horizon0x()","53dc4cf1":"Greedy()","53dd1902":"strcat(bytes,string,bytes,string)","53dd8881":"tweakDailyDividends(uint256,uint256)","53de63e3":"isMasterWallet(address)","53e0b78f":"LandClaimContractSet(address)","53e0c46d":"nuoyilian(uint256,string,uint8,string)","53e1509c":"addExchangePartnerTargetAddress(address)","53e1a169":"doPayment(address)","53e1ead9":"companyAddress()","53e215f4":"getNodeInfo(uint256)","53e3926c":"compareNums()","53e4d8ef":"admin_set_withdrawable(bool)","53e4e607":"get_parameters()","53e551ff":"createContractItem(string,bytes32,address,address)","53e68147":"emissionInternal(uint256)","53e68720":"sendToBeneficiary()","53e7168b":"setUInt(bytes32,bytes32,uint256)","53e7daf2":"NewStandardToken(uint256,string,uint8,string)","53e86a88":"contributorsTotal()","53e8c040":"Winn()","53e9574a":"FOUNDERS_TOKENS_PERCENT()","53e9dcae":"attributeType(uint256)","53ea04fe":"AgencyLock2()","53ebf6bd":"setContractLock(bool)","53ecbdd2":"getTankType(uint256)","53ed5143":"getAll()","53ed589b":"LogNewProvider(address,string,bytes32)","53ee9114":"PassDao()","53eeb430":"allPurchasedSprites(uint256)","53ef5e03":"amount5()","53ef6781":"_start()","53efb13f":"setContractDurationInDays(uint16)","53f072e3":"numApis()","53f11cb3":"asm_clean(uint256,uint256)","53f24e33":"isUpgradeInterface()","53f25ca6":"isNameEmpty()","53f3807c":"STATE_PLAYING()","53f4a519":"queryResource()","53f4b36f":"calcFin()","53f4db01":"totalWeiRaised()","53f63bb3":"setPreSaleFinishDate(uint256)","53f65cf7":"forceRecoverCollateral(bytes32,address)","53f6740d":"setKpopItemContractAddress(address,address)","53f6ef28":"EUFBToken()","53f6f01f":"ADVISOR_STAKE_TWO()","53f754e0":"tokensDue(uint256)","53f818d6":"checkBetValue()","53f81ef8":"getSubscriptionTo(bytes32)","53f8e415":"SetDonateStep(uint256)","53f92e49":"UnableToRejectPayment(address,bytes8,uint256)","53f95cc6":"THIRD_TIER_DISCOUNT()","53f9ca96":"CCC(uint256,string,string)","53f9ec67":"setIsInvalid(bool)","53faa9a9":"changeRecovery(address,address)","53fafd15":"makeTransfer(uint256)","53fb9233":"checkDocument(string)","53fc3923":"safeAdd40(uint40,uint40)","53fc79d1":"setTargetDiscountValue5(uint256)","53fd0670":"sellArtworks(uint32[])","53fe189c":"setAElfMultisig(address)","53fe7a59":"PURCHASER_MAX_TOKEN_CAP_DAY1()","53fefd7d":"changeMaxDeposit(uint256)","53ff7766":"_escrowTheAOPaymentEarning(bytes32,uint256,uint256,uint256)","53ffab1d":"disableconstruction()","53ffe1f9":"setRentalPricePerSecond(uint256)","5400a93e":"payoutMatch(uint256,uint8,bool)","54019949":"getShopOwnerCategorizedProducts(string,string)","540273bb":"changejp1(address)","54032862":"ZapCloud()","5403a0e5":"getTeamToken()","5404bbf7":"getEntropy()","54057aa6":"setPriceClaim(uint256)","5405e4f4":"SMILE()","54063f4e":"sendETHfromContract()","54070f83":"getTournamentAdmissionBlock()","54091a20":"removeFromTransactionDisallowedList(address)","540a5e4e":"cs()","540a9db3":"getVestingAccount(address)","540ae26f":"MassERC20Sender(address)","540b2255":"_invest(address,address)","540b34a0":"listMOC()","540c755f":"ethWithdraw()","540c97c8":"getAllRevisionIpfsHashes(bytes20)","540cafe0":"storeHeaderWithFee(bytes,int256,address)","540cc484":"getPreSaleTokensSold()","540cf75e":"getPendingPresaleTokens(address)","540d888e":"SendTaxFee(address,address,address,uint256)","540d915e":"serviceGroupChange(address,uint8)","540e2f5b":"customTokenDefrosting(address[])","540ea6db":"getuseraddress(uint256)","540f3d6d":"feeProcess()","540f5631":"isUnderwriter()","540fd4df":"addressFundFoundation()","54105974":"AdHiveToken(address,string,string,uint256,uint256)","54107401":"declareLove(string,string)","5410ac50":"raiseCap(uint256)","5411029d":"_validSignature(address,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","54114dee":"Caps()","5412af17":"Watsondog()","541334f6":"isUnicornContract(address)","5413d6f4":"ImmlaToken(address)","54147ecb":"withdrawForTokens(address)","54149777":"getAirDropedToday()","54149975":"DeleteToken()","54151bc3":"createPostboyAccount(uint256,uint256,bytes16)","54153f91":"getArrIntField1()","5415b8f8":"setAssetFeesList(address[],uint256[],uint256[])","5415f3a7":"buyStudioStake(address,uint256)","5416707c":"getEthOfferAmount(uint256)","5416995e":"TGCToken()","54186bab":"SolarDaoToken()","5418796c":"pubKeyToEthereumAddress(bytes)","5418bea9":"getCountReadyPlayerByTrackId(uint256)","5418ecdd":"setTokenHash(uint256,uint256)","54192046":"setAuctionStart(address,address,uint256)","541a01ed":"presaleTokenVault()","541a3656":"optionOrderCancelled(bytes32)","541ac2b3":"locked_since()","541aea0f":"put(uint256,uint256)","541afaf6":"getWarriorDistributedRandom(uint256)","541b2173":"IKT(uint256,string,uint8,string)","541bb358":"setRarityTargetValue(uint8,uint256)","541c15eb":"changeLock(address,uint256,uint256)","541d920c":"commit(bytes,string)","541dc9ba":"redeemPreSale(address,address)","541e22ea":"sendRefBonuses()","541e34a7":"QuantumPay()","541ee050":"bonusEnd10()","541f631a":"transferInternal(address,uint256)","54203101":"CTWorld()","54204ad4":"triple()","54215767":"upgradeTradeProfileImplementation(address)","54217c21":"Q2(address)","542241d0":"fifthExtendedBonusSalesEnds()","5422cf34":"sellPop(uint256,uint256)","54238645":"closeICO()","5423a05d":"GoToken(address,address,address,address,uint256)","54244518":"coinIssuedRewardPool()","54260cb6":"getBuyLandInfo(address,uint256)","5427789c":"MINT_AMOUNT()","54279bdd":"createAuction(uint256,uint256,address)","5427e4e1":"APS(string,string,uint256)","5427e8fa":"getTicketIsPaid(uint256)","54280260":"balancesLocked()","54290065":"getAsksCount()","54292c53":"rewardAvailableCurrentDistribution()","5429a417":"getBasicBallotsPer30Days()","5429d4b5":"mitfwdToken()","542a3368":"randomly_select_index(uint256[])","542a90bd":"remove_quote(bytes32,bytes32)","542aa99f":"stopSetup()","542aee37":"getTotalTonsClaimed()","542b5111":"MANXERC20()","542b9a40":"ProjectOwner_DisableProject(int256)","542bdb4d":"testMathOverloaded()","542bee82":"addGlobalBlockValueBalance(uint256)","542c8f37":"isOnSell(uint256)","542cad3d":"setCopaCoreAddress(address)","542cae98":"checkGameOverByUser()","542ccddb":"claimRoundReward(uint16,address)","542ceaad":"countRequest()","542cfdf0":"extendItem(address,uint256)","542d397c":"tokensBlocked()","542d3e34":"NewImage(uint256,uint8,uint8,uint8,uint8,string,string,string)","542d8dc0":"Mag50()","542de573":"BITHALALToken()","542df7c7":"getGameConstants()","542e898e":"STC()","542fce21":"KergToken(uint256,string,uint8,string)","542fd556":"getMakerProjects(address)","54311422":"giveTokens(uint256)","54313b22":"tonextround()","5431dfb8":"stage3Sale()","5432202a":"isServiceAccount()","54353f2f":"example()","543577f3":"LandManagement(address)","543594b8":"verifySignature(uint8,bytes32,bytes32,address,bytes32)","5435a774":"Permissioned()","5435bac8":"itemsForSaleLimit(uint256,uint256)","5435dbd4":"CPF()","54361699":"registerContributorPool(address,uint256,int256)","54367179":"updateRealWorldPlayer(uint32,uint128,uint64,uint32,bool,bool)","5436c163":"createVillain(string,uint256,uint256,uint256)","5436e5a0":"getValueByHash(bytes32)","54370a8d":"QueryMyBonus(address)","5437988d":"setVerifier(address)","5437b39b":"hasUnprocessedDividends(address)","5437e401":"withdraw(address,bool)","5437f098":"changeStartBlock(uint256)","54385526":"setStatus(uint8,uint8,string)","5438a64e":"getContractSigners(bytes32)","5438c5d2":"hasListener()","54392a96":"simTotalObligation(bytes)","5439af13":"getIdeaDescription(uint256)","5439c6a1":"nonFungibleByIndex(uint256,uint128)","5439e185":"buyTreeTokens(address,uint256)","5439f5d2":"TimeToken(uint256,string,uint8,string)","543a3d62":"token_call()","543a86f6":"dblShaFlip(bytes)","543a9ce4":"setAStore(string,address)","543ad1df":"MIN_TIMEOUT()","543b4f6f":"endTimeTwo()","543ba50a":"FundsDeposited(address,uint256)","543e0a7b":"stringsEqual(string)","543e10b4":"contributeTo(address,uint256)","543e4dcd":"testFailUntrustedTransferFrom()","543e9954":"freeBalanceOf(address)","543e9c10":"containsAdmin(address)","543f8101":"activateOversightAddress(address)","54400c60":"right19(uint256)","544082e5":"authorShare()","54409599":"SHIVToken()","54413d29":"withdrawAllForAccount(address,address[])","544447bb":"unicornToken()","5445cbf3":"assetsCertified()","5445e38c":"_isCycleValid(uint256)","5446b604":"unlockMintDate2()","5446d669":"ShitToken()","544736e6":"isStarted()","544743d6":"getCharAt(uint256)","5447ad71":"newGame(bytes32)","5447b86f":"ipart(int256)","5447c05d":"updateTemplateReputation(address,uint8)","5447fab0":"serviceController()","5448c674":"IBCA()","544a026b":"protectCharacter(uint32,uint8)","544aa2cf":"LOG_BetLost(address,uint256,uint256)","544b1b24":"onlyHarvest(uint256)","544b9606":"ICO_BONUS2_SLGN_LESS()","544be427":"finalizeBurnUtility(address,uint256)","544c465c":"calcReward(uint256)","544cdbda":"send_to_owner(address,uint256,uint32)","544cfead":"reignBlocks()","544d6544":"transferPrivateSale(address,uint256)","544d8ca2":"registerLog(string,string,uint256)","544d9723":"itemAt(uint256)","544f113b":"startingAmount()","544f43e3":"getRatePlansOfVendor(uint256,uint256,uint256,bool)","544ffc9c":"proposalVotes(uint256)","5451436d":"EthLyte()","54517ddf":"transferFromByCrowdsale(address,address,uint256)","5451a1e1":"addressFounders()","5451cbcc":"ZEToken()","5451fb26":"increaseLoanOnBehalfOf(address,bytes32,uint256,uint256)","5452644d":"createNewDynamicPaymentAddress(uint256,address)","5452b7d4":"getReservedTokens(uint256)","545305fb":"finalizeCrowdsaleAndToken()","5453095b":"buyMNC(string)","545342a0":"ZaiZaiCoin()","5453f4e7":"createTokenUri(address,address,address,address,address,address,address,uint256)","545464ff":"ConsentFactory(string,address)","5454fb7c":"ico1Sold()","54557250":"getAgentIdByPositionBet(uint256)","545599ff":"END_DATE()","5455e1b8":"setAddressesThatCanList(bool,address[])","54567923":"addServiceReward(uint256)","54569a86":"Needit()","5456d8d2":"removeSpecialBonusConditions(address)","54573835":"withdrawEtherInternal(address,address,uint256)","54573cfc":"setRule(uint256,uint256,uint256,uint256)","545842ff":"redeemLevAndFeeToStakers(address[])","545921d9":"providerRegistry()","545a153a":"getId(uint256)","545a5896":"changeSolidStampContract(address)","545ae0f6":"TokenFundTransfer(uint256)","545b2f0d":"getUpgradeAmt(uint256)","545c50f0":"pointRootNode(int256,address)","545c5a02":"setStepTwoLockEndTime(uint256)","545c5d54":"deliveryService(uint256,uint256,uint256)","545d2e29":"invalidateAdvertiserRefund(uint256)","545d5988":"claimCheckPriceReward()","545d8b55":"minCapFail()","545e6362":"PRE_ICO_BONUS_TIME_1()","545e7c61":"deploy(address,address)","545f6837":"returnSenderBalance()","54604eec":"stopAssign()","54605549":"setCoinBalance(address,uint256,uint8,bool)","5460687c":"test_chain2_3()","5460ef10":"sendWithExtraGas(address,uint256,uint256)","54610cea":"setProvider(address,uint256,uint256)","54612e27":"freeze(bytes32,bytes32,uint256,bytes)","54616911":"burnICOTokens()","54619b69":"eAccessTOKEN()","546216f1":"winningScore()","54622cef":"multiMintPreIco(address[],uint256[])","5462870d":"multisigAddress()","5463a2e4":"reasonableDiffInBps(address)","546434e3":"TwoStageSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,uint256)","546455b5":"assert3(uint256)","54653352":"beView()","54657f0a":"setHiddenCurves(bytes32[])","54659685":"getTicketsCount(address)","54659d99":"SPINFund()","546639cf":"JacksToken(uint256)","546668bb":"conquesting()","54672768":"Instrument()","54674ebc":"HackableToken()","54675320":"EventProduct(uint32,string,uint32,uint32,uint256,uint256,uint256,uint256)","5467e0a7":"redemption()","5467f508":"indPresaleDeposit()","5468e4e1":"setGameStateFusion(bool)","5469a173":"getFifthRoundReleaseTime()","5469aabb":"_diviSplit(uint256,address,address,uint256)","546b270d":"getServer(uint256)","546b48b1":"makeSimpleBundle(uint256,address,bytes32,bytes32)","546c2b93":"paid(uint256,uint256,bytes32)","546d08fe":"dividendAddress()","546dc0ac":"collectAsset(address,uint256)","546dc71c":"approveWithdrawAddress(address,address,bool)","546dd883":"privateAmount()","546e1959":"changeOwnerStart(address)","546e428c":"modifySender(address,bool)","546ea281":"currentAction()","546efd98":"indiFundAndSocialVault()","547069bf":"crowdsaleWeiRaised()","5470b13b":"getWallet(uint256)","5470f6db":"setMaxSet(uint256)","547173da":"endPresaleDate()","54717ea9":"getValueBonusTokens(uint256,uint256)","54718917":"determineWinner(string)","5471d5d8":"VetLite(uint256,uint256)","5471dd4c":"FourthAddressBalance()","54722412":"OfferZone()","54734f7d":"setBoardAdd(address)","54738157":"OwnerCloseContract()","5473b4e9":"getTransactionConfirmCount(bytes32,uint256)","5473c701":"test_oneInvalidFalseEqLog()","54741525":"getTransactionCount(bool,bool)","54741f8d":"getMemBestPromouter()","5474d4d7":"_transferBag(address,address,uint256)","5474fbd3":"isDayThirtyChecked()","547505e3":"tokenAdministrator()","5475c22e":"bindOrderFunds(address,bool,int256)","5476bd72":"addToken(address,address)","5476ea9e":"auctionAddress()","5476f49d":"m_totalAppCount()","5477d33f":"price_constant1()","5477e571":"handleMultipleItems(address,uint256,uint256,uint256,uint256,uint256)","54786b4e":"getDSTSymbol()","5478786c":"IDLE()","5478dbb7":"play(uint256[3])","5478f06f":"updateMDTRewardAmount(uint256)","5478f468":"getHistoryLength()","54790b7d":"isOvertime()","547916ea":"finishRound()","54791f36":"_transferWithReference(address,uint256,string,address)","5479d940":"isUpgradable()","547a5168":"TomocoinTokens()","547a5eee":"setWhitelistSetter(address)","547ac053":"saveInitialParametersToStorage(uint256,uint256,uint256,address)","547c165f":"getApprenticeChestAvailable()","547c1b6a":"SALE_START_DATE()","547c4137":"setLLV_edit_32(string)","547c8011":"DemocraticPalette()","547cae29":"uintToString(uint16)","547cbaa5":"addFrozen(address,uint256,uint256,bool)","547dd162":"_newAgon(uint64,uint64,address,uint256)","547dfaf5":"WthdrawAllToCreator()","547e3f06":"changeReceiver(address)","547e6a5b":"simulate(uint256,uint8,uint8,uint8,uint8,uint8,uint8[176])","547eeac1":"acceptTransfer()","547fd950":"getTotalFrozenBalance()","54812d17":"initialize(address,address,uint256,uint256,address,uint256)","54817301":"setFreezeEnd(uint256)","5481c1ff":"referBenefitRate()","5481f43e":"getProviderTitle(address)","54823e66":"getStateHash(uint256)","54828eb7":"placeBetEven(uint256)","54829cad":"dubi()","5482d73c":"getDocument(bytes16,uint256)","5482d88e":"telcoin()","54830df7":"getApprovedTokenCount()","54840c6e":"tradable()","5484b5bf":"thelocation()","5485868a":"roundFactory()","5485bb82":"w_Team()","5486dfb3":"distributeSupply()","548707cd":"_bid(uint40,uint128)","54876921":"withdrawMoney(uint256)","5487e055":"PRICE_MID()","5488cc80":"currentCheckpointId()","548942e1":"UbecoinICO()","548ad42e":"chfScale()","548b273a":"outstandingEther()","548b5e6b":"contractStartDate_()","548c0ef4":"getRank(address)","548c20be":"getMyName(bytes32)","548d4a54":"updateTransferFeeRate(uint256)","548d91b1":"getPage(uint256[],uint256,uint256,bool)","548db174":"removeFromWhitelist(address[])","548dd51e":"newContract(address,address,uint256)","548e0846":"lastCallBlock(address)","548f896c":"setHouseEdgeMinimumAmount(uint256)","548fe136":"doWorkAndPayTOT()","549060bb":"Competition(address,address,address,uint256,uint256,uint256,uint256,uint256)","54919a6c":"sendTokensSingleValue(address[],uint256)","549215a3":"amendEpoch(uint256)","54924aec":"adminsDisabledForever()","549262ba":"put()","5493a7f4":"importAmountForAddress(uint256,address,address)","549400bd":"valuee(uint256)","549503e5":"executeSell(address,uint256)","5495699f":"teamFund()","5495794b":"initialWei()","5495ca36":"MDC9Token(uint256,string,uint8,string)","549737e3":"setIBalance3(uint256,uint256,uint256)","549767c7":"balanceSpot(address)","5498e9e5":"AmericanAirlinesCoin()","5498eae4":"PAYA()","54990b15":"sendTranche(bytes32,address,uint256,bytes)","54999f6d":"initAmount()","5499c84e":"changeBonus(uint256,uint256,uint8)","5499dca5":"getMyStake()","549a9ffd":"changePiranhaName(uint256,string)","549aa194":"unreleasedAmount()","549bc193":"changeSwitchTime(uint256)","549bf4bf":"Liberty()","549bf9b9":"SFCapitalToken(string,string,uint8,uint256)","549c4627":"depositsOpen()","549c6bbb":"refundTokens(address,uint256)","549c7b58":"getAgon(uint256)","549caf35":"oxced()","549cbc7a":"startSale(uint256,uint256,uint256,address)","549d5e3b":"claimByAddress(address,address)","549d776a":"upgradeContract(uint256,address)","549ddcbd":"setFreezeHybridizationsCount(uint256,uint256)","549df19f":"resetAllWallets()","549eca74":"fpDiv(uint256,uint256)","54a019e2":"FOUNDER_FUND_2()","54a035aa":"_evaluateCategory(address,uint8,uint256,uint256)","54a04d2f":"setMigrateAgent(address)","54a0ebf5":"updateEntityName(uint256,bytes32)","54a1b431":"getVoteDetails(uint256)","54a1e232":"setSellOrdersContract(address)","54a28ded":"bhCheck()","54a325a6":"setKyberNetwork(address)","54a46211":"_removeInvestor(address)","54a598b0":"globalTokenTransferLock()","54a6c8c4":"toSmallrtc(uint256)","54a6ff68":"isVersionLogic()","54a874b4":"isSolved(address)","54a8b217":"qryModules()","54a8ca69":"transferAnyMEPToken(address,uint256)","54a8ed7b":"USD_CENT_PER_GZE()","54a9409e":"charge(address,uint256,uint256)","54a9de1c":"referrerBonus(address)","54aa0546":"MCNC()","54aa4e44":"setDisableBuyingTime(uint256)","54aac764":"SALE2_CAP()","54ab5561":"setOwnerTwo(address)","54ac2119":"EMJACTestToken()","54aca207":"iwithdrawal(uint256)","54acbe7b":"setSaleShare(uint256,bool,address,uint256)","54accc88":"OOREDOOCHAIN()","54ad2d22":"BitcoinCrown()","54ad7e1c":"setDividendDistributionPool(address)","54ad9718":"feePrice()","54adb7b1":"doNotAllocateBid(bytes32)","54adc686":"claimRewards(bytes32[],uint256[])","54ae8492":"CustodialForward()","54aee843":"MANHATTANPROXYMANAVE()","54af0d4c":"validAfter(address)","54af3548":"getSigner(address,uint256,address,uint256,bytes32,bytes32,uint8)","54afc9a9":"MyFirstToken()","54b025c5":"deleteRole(address)","54b02ba4":"cutoff()","54b2a080":"valueAtIndexHasNext(uint256)","54b302c5":"maximumDeposit()","54b3fa58":"ServiceTask(string)","54b48428":"endTGE()","54b49859":"fmpContractAddress()","54b51fcc":"testNumberOfElements()","54b61723":"round3Cap()","54b67057":"setTranformed(uint64,uint64)","54b6a520":"ICOFinished()","54b6ba95":"durationInDays()","54b6ed85":"AddNewCurrency(string,string,string,string)","54b7636e":"isKYCVerified(address)","54b84910":"needToReserve()","54b8c024":"fieldOrder()","54b8d5e3":"getName(bytes32)","54b8dd66":"countryItems(uint256,uint256,uint256)","54b8dfcb":"settleBuyer(address,uint256)","54b9b4fa":"UNLOCK_TEAM_1()","54ba34b5":"available_slots()","54ba7daa":"enter(bytes,bytes)","54bbd376":"getNextDate(uint32)","54bc16f2":"Exchanges()","54bdbd4d":"changeMinPeriod(uint32)","54be50a5":"lastHoldingTax()","54beb2f4":"ProfitSharing(address)","54bec662":"removeValidation(address,bytes32)","54bef3b4":"getPlayerVaultsHelper(uint256,uint256,uint256,uint256,uint256)","54bf3a73":"playerToDungeonID(address)","54c0775f":"GetItems(address)","54c15020":"awardReferalBonus()","54c15b82":"isGeneScience()","54c29ce6":"assertOperationIsConsistent(bytes32)","54c35a3c":"setup(address,address,address,address)","54c3b0c4":"icoPhase3EndTime()","54c41fb9":"viewMerkleHash(uint16,uint8,uint8)","54c51813":"setFreelancer(bool,string,uint256,uint8,uint256[],uint256[],string)","54c552db":"setNumber(bytes32,uint256)","54c5aee1":"collectReward()","54c5b696":"maxBonus()","54c5f850":"withdrawTokensFromAnyWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","54c72ead":"_getHardCap()","54c86628":"etsContract()","54c91295":"getEloScore(address)","54c916a1":"setOCPTokenContract(address)","54c93a4e":"lockTeamTokens()","54c990cf":"periodTimeFrame(uint256)","54c9cc44":"changePlayersName(string)","54ca435f":"PRESS_MARKETING()","54ca9095":"newEntity(bytes32,bytes32,uint256,uint256)","54cacaba":"QuarkChain()","54caf101":"bonus(uint256,uint8)","54cb5081":"getPromoMinPurchaseEth()","54cbe1e6":"gamePayoutResolver(address,uint256)","54cbffc4":"LimitOfMinutes()","54cc463b":"PreICOPrice()","54cc61bc":"Krown(uint256,string,uint8,string,address)","54ccdb0d":"seriesCSupply()","54ce0851":"round5TokensRemaning()","54ce7616":"TestTalk()","54cecb21":"AuthPending(address)","54cf2aeb":"swapFee()","54cf6668":"setEarlyInvestorExchangeRate(uint256)","54cfcd1b":"DEAWCOIN()","54cfe7d0":"nextForkName()","54d03b5c":"changeFeeMake(uint256)","54d05ad2":"changelp10(address)","54d06009":"whiteListAddress()","54d15005":"isDestroyed(string)","54d15347":"adminSuspendDeposit(bool)","54d18864":"totalProjectToken()","54d1b356":"GetBankerProfit(uint8)","54d1f77c":"UnpaidDivInt()","54d24f33":"TOKEN_PRESALE_LIMIT()","54d271fb":"unpause_1()","54d29b9a":"bidderWhitelist(uint256)","54d2a34a":"getHouseFee()","54d30c87":"release(uint256,bool)","54d3f3e4":"getTopInfoDetail(address)","54d41bbd":"unregisterAdmin(address)","54d4b7b2":"DateOfDeath()","54d4da57":"extractInvoicedLength()","54d50378":"winner_pool_amount()","54d5e127":"withdrawSettle(bytes32,bytes32)","54d68405":"LogFundAnswerBounty(bytes32,uint256,uint256,address)","54d6a2b7":"cancelSwap(uint256)","54d734e2":"createSubscriptionOffer(uint256,uint16,uint256,uint256,uint256,uint256,uint256,bytes)","54d79868":"getPositionBalance(bytes32)","54d7c34d":"transferAidrop()","54d87002":"showContributed()","54d89c92":"numberParticipants()","54d92ba9":"getCurrAuctionPriceTankID(uint256)","54d9d6f8":"findNextDay(uint256,bytes)","54da44db":"GetUserBetsInRaz(address,uint256)","54da5393":"Utils()","54da80c9":"Patney()","54dacb96":"numWhitelisted()","54daedc3":"transferCoins(address)","54db4547":"ethbuy(uint256)","54dcc49b":"_withdraw(address,uint256,bool,uint256)","54dcfb9b":"LinkToken(uint256,string,string,address)","54dd1da4":"releaseVestedTokens()","54ddd5d6":"retrieveRefund()","54dea00a":"getTokenRate(address)","54dfbca8":"setExtra(uint256,address)","54dfefb4":"DEEPPAYMENT()","54e030b7":"bonusDistributionAddress()","54e031cb":"setLockAccInfo(address,string)","54e08f76":"theInvestor()","54e0b451":"claimReward(bytes32,uint256)","54e0b464":"ICO_ADDR()","54e16753":"BLUECoin()","54e2cf2d":"_getPartLevel(bytes,uint256)","54e2dc8d":"getAdditionalTime(uint256)","54e30c37":"earlyBirdPrice()","54e33cf0":"getRewardsIndex()","54e35054":"getRoundResultInfoWithRoundID(uint256)","54e35ba2":"issueTokens(uint256,uint256)","54e4df26":"test_0_testGenerateTokens()","54e707a0":"START_WEEK_2()","54e76d74":"minimumPoolPurchase()","54e7aed8":"Frozenable(address)","54e7e98c":"PiexT(uint256,string,uint8,string)","54e8561b":"RDOCrowdsale(address,address)","54e8e4e4":"Test_SignedInteger_AdditionOverflow(int256)","54e921cb":"setFreezeMustCalculate(uint256,bool)","54e9244e":"orderFills()","54e9d5e1":"refundDonation(address)","54ea1538":"sellDrago(uint256)","54ea1af9":"flyDrop(address[],uint256[])","54ea4000":"identify(address[])","54eae3e6":"streamEnd()","54eb3f74":"getOptionState(address[2],uint256[7])","54eb9e88":"_preValidateICOPurchase(address,uint256)","54ec5d9b":"weiRaisedRound()","54ec6a43":"taxPaid()","54ecaba4":"COMPETITION_VERSION()","54ecd994":"ALLOC_BOUNTIES()","54ed08c8":"getPurchasedTokens(address)","54ed44f7":"generateCostFromAttributes(uint8[14])","54ed7b6e":"addHash(bytes)","54ee4d4b":"addCommunityGrant(address,uint256)","54eea796":"setEpochLength(uint256)","54ef356f":"isUserAdmitted(address)","54ef9c3c":"getEpisodeBranchData(uint256,uint256)","54f10ed0":"IknewToken()","54f11256":"retrieveCadvsLeftInRefunding()","54f12a2c":"isAllowed(string,string)","54f1469c":"shuffle(uint256[])","54f1bb4b":"Etheraffle(address,address,address,address)","54f363a3":"addition(uint256,uint256)","54f47346":"lastBlock_f12()","54f47be7":"transformSettingContract()","54f4824d":"myLastRef(address)","54f50f1b":"nicknameOf(uint256)","54f5164b":"isLocked(bytes32,uint256)","54f51d32":"SetCitySnapshot(address,uint256,bool,uint256,uint256,uint256,uint256)","54f5675c":"OfferedForSale(uint256)","54f56df1":"Shop(address)","54f60aea":"ONE_EMONT()","54f6127f":"getData(bytes32)","54f63105":"maxMintingPower()","54f63ee5":"resumePresale()","54f703f8":"factor()","54f78dad":"setBalanceSheet(address)","54f7b493":"getMinimumFundsInEuroCents()","54f7dd8c":"lotOfOwnerByIndex(address,uint256)","54f81786":"startTokenVotes(address[10])","54f83483":"needsTick()","54f8c2df":"getShipName(uint32)","54f9962a":"getAffiliateLevel()","54f9cbb3":"newVote(uint256,string)","54fa8044":"sendKrs(address,uint256)","54fac919":"decay()","54fbde65":"USDWEI()","54fbed37":"tokenIsBeingTransferred(address,address,uint256)","54fc85ac":"maxEth()","54fd4d50":"version()","54fef819":"throwsWhenRedeployingANT()","54ffb323":"MaxOffer()","54ffe626":"_getBonusTokenAmount(uint256,uint256)","550052b5":"iaOnInvested(address,uint256,bool)","5502109e":"actualCap()","550271c9":"Candle()","5502be83":"getBountiesByParticipant(address)","55036214":"priceRound2()","5503a659":"smallponzi()","5503d9ba":"numberOfPledgeAdmins()","55042668":"jobStarted(bytes16,address,address,uint256,uint256)","55044042":"CreateGUNS(address,uint256)","5504bf71":"attackerPrizeByToken(bytes32,address,address)","5504f45e":"getFrontEndTokenSupply(address)","5505075b":"validArb(address,uint256)","550538f6":"getOneTimeCosts()","550563ba":"Iscm(uint256,string,string)","55061ccc":"setImageBlurredAt(uint256,uint256)","55064d85":"exists(uint256,uint256,uint256)","5506aa6c":"weiMaximumGoal()","55072fef":"PRIVATE()","5507a82e":"setCalculatorAddress(address)","5507e9c0":"lockForAll(bool)","5509b160":"weightLostPartLimit()","5509f0f3":"minPurchasePreICO()","550b1f48":"eighthTime()","550b47b8":"setCoinPrice(uint256)","550bcd8d":"testThrowUpdateLatestRevisionEnforceRevisions()","550c99c6":"_createCutie(uint40,uint40,uint16,uint16,uint256,address,uint40)","550d8dca":"secondPeriodSupply()","550dd006":"calcCostsBuying(uint256,uint8,uint8,uint256)","550e4f2b":"withdrawRemainingIPCToken()","550ed1f0":"getMaxBetAmount()","550ed61b":"jpyc()","55107916":"distributeMarketingShares()","5510f804":"acceptToken()","5510f8d7":"forkApprove(address,address,address,uint256)","55119b1a":"addBeneficiary(address,uint256,uint256,uint256,uint256)","55121498":"getLenderBalance(uint256)","55126d30":"LogEvent(address,uint256,uint256,string)","5512a353":"BONUSROLL()","5512a8d8":"myohoTest()","551336c5":"prophecise(bytes32,bytes32)","55138534":"Transaction()","55138d97":"addCar(address[4],uint256,uint256)","55139163":"refereesRateBonus()","5513a2ac":"claimByProof(address,bytes32[],bytes32[],uint256)","5513a34e":"getProductHistoryPrice(bytes32)","5514738f":"_packWarriorPvpData(uint256,uint256,uint256,uint256,uint256)","55152b9d":"DxChainToken()","55161913":"charge()","5516b6c5":"SECCoinSold()","55173bb1":"ColaTokenToken()","55176f51":"FOUNDATION_POOL_TOKENS_VESTED()","55177ef1":"addressCoreSupply()","55181fba":"TEXBToken()","55186c99":"auditorCanWithdrawStake(uint256,address)","55189100":"payRewards(address,uint256)","551a450a":"tokenIdToListing(bytes5)","551cacfd":"extractEther(address)","551dc401":"StateChanged(uint8)","551e2e39":"changeDefaults(uint256,uint256,uint256,uint256,bool)","551e44ca":"withdrawTokenForUser(uint256)","551e4c27":"setPeggleBot(string)","551e6ba6":"BoardRoom(address)","551ef860":"newRole(bytes32,address[])","551f3108":"versionSelectors(bytes32,bytes32,address)","551f8e2a":"add(address,address,uint256)","5520002a":"viewSharesSold()","552033c4":"RAY()","552079dc":"fallback()","55207a07":"changeMood(string)","55212c89":"seeleToken()","55219d5a":"tokenAllowed(address)","5521d17b":"betOnColor(bool)","552200f5":"check_part_location(uint256)","55234ec0":"remaining()","5523ec91":"fghcoin()","552405b0":"createCommunity(string,string,string,string,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)","55241077":"setValue(uint256)","55247a52":"wantToBeWhale()","5524defd":"onPayoutFailure(address,uint256)","552548b5":"setMaxDiscountPermille(uint256)","55258a11":"updateAllScores()","5525d87f":"setOracleQueryType(string)","55265669":"showSupply()","55274378":"updateInterCrypto()","55291dbd":"claimEther()","552984b3":"stabilize()","552a41a3":"getRemainingBountyTokens()","552a6915":"getGood(uint256)","552ac31e":"prod(address,bytes32,uint128)","552b71aa":"executeDistributeCapital(uint256)","552c190e":"_DoubleDown()","552d2d5c":"getPerson(address)","552e387d":"XBVHandler(address,uint256)","552eb9e2":"ETStarPresale(address,uint256,uint256)","552f1270":"startWeek(address,uint8)","552f27f5":"setupEventsAdmin(address)","552f8224":"fechAllForCandidate()","552fee9d":"airdropTokens(address,uint256,uint256)","55302ebd":"hasUnionId(bytes32)","5530c519":"validate_pko(address,bytes32,bytes)","5531680c":"transferableBlock()","55325d87":"prizeWinners(uint256)","55326893":"setPOOL_edit_24(string)","5532edf2":"autorizadoraNuncaAutorizouCandidata(address,address)","5533639e":"toB32(bytes,uint256,bytes32,bytes)","5533ffad":"setUserNotifications(bool[],bool,uint8[],uint8)","5534236e":"AirDropPromo(string,string)","55347cce":"Setuppackagesale(uint256,uint256)","55348d9b":"addBeneficiaryVestor(address,uint256,uint256,uint256,uint256)","55352638":"updatePresaleMaxWei(uint256)","553543c5":"tokenSoldPreSale()","553594e4":"getActionHistorySize()","5535cd2f":"setPOOL_edit_1(string)","5535e7a8":"GameCreated(address,address,uint256,uint256,bytes32)","55367ba9":"pauseSale()","55368442":"removeMetadataObject(string)","5536deb6":"finalizePhase()","5536e2d6":"OCTACrypto()","5537f0ef":"betFinalize(uint256,uint8)","55380ed8":"GOOGToken()","5538210e":"tokenSweep(address,address)","5538689c":"changePartner3(address)","5538c964":"getPartnerInfo(uint256)","55390b0d":"PrestoToken()","5539a9c2":"refreshPublicFundingPersonalEthLimit(uint256)","5539d400":"authorizedAddress()","553a48fd":"isFunctionRemoveAuthorizedAddress(bytes)","553a5c85":"mintedTotally()","553a90b8":"updateStopGameOnNextRound(bool)","553aaafe":"MSPPlaceHolder(address,address,address,address)","553b196f":"setPurchasingPaused(bool)","553b6975":"setAmbassador(address)","553b6f83":"lastOracleFee()","553b74aa":"getNumberWallets()","553bf56d":"accept(uint256,string,uint256)","553c02ec":"getCountryBet(uint256)","553c6de9":"getPreIcoInvestor(uint256)","553cc48d":"Player(string)","553cd9c6":"MLC()","553d0d12":"transferTokensThroughProxy(address,address,uint256)","553df021":"deal()","553eb4db":"registerRewards(address[],uint256[],uint256)","553ec6be":"batchCancelSale(uint256[])","553f4fb3":"requestRand()","553f9157":"completeSale(uint256,uint256)","553fd043":"setMoneyRange(uint256)","553fd8ee":"ALLOC_FOUNDATION()","5540e6c1":"iMMCoinsellPrice()","55416e06":"voteA()","5541b817":"_leftChild(uint8)","554249b3":"delegateIncreaseApproval(address,uint256,address)","55426bad":"processPresaleOrEarlyContributors(address[],uint256[])","55427b42":"getBalanceofModifiedWeth()","5542f680":"retrieveToken(uint256)","55434bc9":"ToggleFreezeSelling()","55456f58":"maxcap()","554571db":"updateNarco(uint256,string,string)","5545f12b":"OnChainOrderBookV013bFactory()","5545f584":"soldForForth()","554600fa":"setOraclizeTimeTolerance(uint256)","554644d5":"_removeHolding(bytes12)","554652ce":"airdropToken(address[],uint256[])","554680f2":"updateActivation()","5546a12c":"setInformation(string,string)","5546e1ab":"getMyRefund()","554803c7":"RTCCOINTOKEN(uint256,string,string)","55485779":"minGas4Accts()","5548c837":"Deposit(address,address,uint256)","554917f5":"processMyRefund()","55491da8":"distributeJST(address[],uint256,uint256)","55494d1e":"fillBuyOrder(address,address,uint256,uint256,uint256)","5549563c":"claimManyTokenFor(address[])","5549ce5e":"WarriorSanctuary(address,uint32[])","5549ce6d":"ticketTransfersPerAmount(uint256)","5549f46c":"CustomerInsert(string,address,string,int256)","554a854e":"TransferCryptibles(address,uint256)","554ad7ff":"queryNTVUs(uint256,uint256)","554bab3c":"updatePauser(address)","554d0429":"getArrBoolField2()","554d184b":"getPrices(address,address[],address[])","554d27ca":"createOffer(address,uint256,uint256,bool,uint256)","554d578d":"getCap()","554d758e":"houseStatsOf(address)","554dbfc2":"EMISSION_FOR_SALESTAGE6()","554e6c61":"getTargetBNumber()","554ed8b6":"escrowTransferList(uint256)","5550e4f3":"blackBoxAddress()","5551b6b6":"isDelegateEnable()","5551d1b7":"isAllowToIssue()","5552a483":"newOffer(address,uint256,string,uint256,uint256)","5552d1cb":"prizeIncr()","55532953":"LOCKED_ADDRESS()","5553dc1e":"THToken()","55540004":"createCampaign(address,uint256,string)","5555d6d6":"exist(uint256,address)","55560fd5":"mLoadAndReturn(address)","55566036":"getGamePool(uint256)","5556db65":"totalMined()","5556f3f6":"RareCards()","55575ddb":"setRevokeAddress(address)","55589cdd":"addressOf(address,string)","5558e1c3":"setMinToken(uint256)","555984fd":"cancelMintRequest(uint256,string)","5559d8d9":"getClamTax()","555aaff6":"calculate_range_attempt(uint256,uint256)","555ab116":"AhooleeTokenSale(uint256,uint256,uint256,address,address,uint256,uint256,uint256)","555ae2c6":"STQPreICOBase(address)","555af8f4":"addressFundHolder()","555b6162":"allBalances()","555be5bd":"assignNewPlanet(address,uint256,uint256,uint256,string,string,string)","555befa8":"set1RoundTime(uint256)","555c4758":"distributeTimelockedTokens(address[],uint256[],uint256[],uint256[])","555d8e3c":"_printACourse(uint256)","555db767":"test_2_accessRestriction_newProposal_shouldThrow()","555e6582":"executeMintProposal(uint256)","555ea48c":"becomeHost(bytes32,uint8,bytes32,bytes32,string,string,string)","555f323a":"totalBurnedTokens()","555f498a":"getInvestorsTokens(address,uint256)","555fe48a":"batchTransferFrom(address,address,uint32[])","55605eee":"claimTokenReserveEcon()","5560ada8":"rateAddress(address,uint256)","5560d365":"horseShoeForSale(uint256,uint256)","55616107":"setCOOAddress(address,address)","55619911":"emergencyTransfer(uint256,address)","5561c0e2":"registerChain(bytes8,uint256)","5563d919":"cancelCraftingAuction(uint256)","55642be7":"getRoundBets(uint16)","55642cf9":"CappedBonusSale(uint256)","55642e53":"blacklist(bytes32)","5564a08e":"setGame()","5565ca9d":"buyShip(uint16,uint16,uint8,bytes32)","5565ee7a":"exchangePointToCoin(address,uint256,string)","556665db":"expireTimeLimit()","55674064":"totalSupplyWithoutDecimals()","55674efe":"BondkickToken(string,string,uint8,uint256,int256)","55684aa6":"originBurn(uint256)","55688000":"burnIndexedFromByAddress(address,address,uint256)","5568fd5d":"icoPhase2End()","5569e58c":"EthereumPocket()","5569f5d0":"preSaleFinished()","5569fc0b":"CreateSale(uint256,uint256,uint256,uint64,address)","556a3689":"mint_Crowdsale(address)","556b22c1":"get_record_count()","556b6384":"removeBlacklistDestroyer(address)","556bcece":"reinvest_color(address,uint256,uint256,uint256)","556cbc03":"setDefaultWhitelistVestingParameters(uint256,uint256,uint256,uint256,uint256)","556d5139":"getAverageTokenPrice(address)","556db16a":"validatePurchase(address,uint256)","556e2eb9":"TBL4TokenSale()","556e56d1":"BurnupGameFinance(address)","556e6edc":"indice()","556ed30e":"deactivated()","556f0dc7":"granularity()","556fe562":"notEqual(bytes32,bytes32,string)","55710346":"createTokensFromOther(address,uint256,address)","557119db":"withdrawForCharity(address)","5571954d":"_distributeRegistrationBonus(address)","55728d04":"setIssuer(address,uint256)","5572f9c6":"exchangeEther(uint256)","55737391":"LBRSMultitransfer(address,address)","5573a34c":"FP_SCALE()","5573c582":"walletTransfer(address,address,uint256)","5574cff5":"LOVEYOUFOREVER()","55764c81":"updatedTokensPerEth(uint256)","55765e9a":"createMeme(string,uint256)","5576af7d":"TransactionConfirmedAfterDispute(uint256,uint256)","5576b791":"transferWithVesting(address,uint256)","5577e89f":"testEqualityUint()","5578b51e":"CorelliCoin(uint256,string,string)","5578d24e":"addOldPresidents(uint256[],address[])","5579996d":"CHW()","5579ac74":"dna3(uint256)","5579ff8e":"walletBlogs()","557b0dc9":"addCar(string,string,string,uint16,string)","557bed40":"SocialMediaPayToken()","557d0195":"SuomenMarkka()","557d0479":"aidrop(address[],uint256)","557dc796":"endRoundSeed()","557ed1ba":"getTime()","557f4bc9":"changeContractOwnership(address)","557f9ea6":"aDeposit(uint256,uint256)","557feee1":"setRegionCurrentImageId(uint256,uint256)","5581004d":"createThrone(bytes,uint256,uint256,uint256,uint256)","55810d11":"appFund()","5581800c":"isCappedInEther()","5581be8d":"privatePresaleSupply()","558225fc":"setAtomSons(uint256,uint32)","558234f0":"USD_PURCHASE_AMOUNT_REQUIRING_ID()","5582c08d":"startMonarchyGameReward()","5582df33":"performInitialAllocations()","558305f9":"isFreezeEnabled()","55832ffc":"purchaseStartTime()","5583318a":"TOL()","55838881":"STAGE_ONE_BET_LIMIT()","55843fda":"getAdOwner(uint256)","5584c4f9":"getActiveProposals()","558599ea":"SQR_TOKEN_DECIMALS()","55866c8d":"isRefunded(uint256)","55869af1":"fromVersion()","558790d8":"testInitialTokenBalanceShouldBeZero()","5588227e":"restCrowdSaleAddress(address)","55889d01":"setMaxLockPeriod(uint256)","5588b929":"streamerContract()","558a8f47":"sendFutureSupplyToken(address,uint256)","558b5aab":"setSellingToken(address,uint256,uint256)","558da2e3":"preSaleprice()","558e223f":"_buyPutToOpen(uint256,uint256,uint256,uint256,address)","558e44d3":"MAX_FEE_PERCENTAGE()","558f285f":"unsetMyIdentity(uint256)","558f46c8":"getZTKChecks()","55909da3":"spreadTokens()","5590e4d2":"toBytes32(bool)","55915b97":"initialSuppy()","55923471":"fiveHourCap()","55923cc5":"ElementToken(string,string,uint256,uint8)","5592d687":"settleBounty(uint128)","5592fc71":"getLotteryWinners()","55947d16":"XJJ()","5594e88c":"delegateToken(address,address)","559510d8":"left53(uint256)","55951e15":"dollarToLoveyRate()","55954b49":"initVesting(address,uint256)","559659fa":"getTotalRefund()","55976b05":"depositNotification(uint256)","5597801a":"addwhitelistedBatch(address[],address)","5597e9dd":"setCompte_36(string)","5597f3a5":"createRecord(string,uint256,address,string,string,string)","5598c576":"reveal_move(bytes32,uint8,bytes32,bytes32)","5598f8cc":"getCampaign(uint256)","559ac092":"getAirdropIdsByContractAddress(address)","559b0432":"yearCap()","559b0ed5":"giveBackOwnership(address)","559b1df4":"TokenStoreUpdated(address,address)","559b678c":"IsLimitPart(uint8,uint256)","559e5e06":"updateTokenAge()","559ec80d":"settleDeposit()","559ed339":"setTokens()","559f05dc":"canTrade(address)","559fb6f5":"assertAvailable(uint256)","559fd7ee":"setYearOneMultiplier(uint256)","55a01845":"forceFinished()","55a05335":"totalDragonLotteryNumber()","55a129bd":"Tier(uint256,uint256,uint256,uint256,uint256,uint256)","55a36746":"newDigitalContract(string,address[])","55a373d6":"tokenContract()","55a392ac":"ExerciseEndTime()","55a3f425":"getBalanaceOf(address)","55a53ed0":"EtherSteem()","55a5a8d4":"DHUBTest02()","55a5dc3c":"SpegniCassaAutomatica()","55a5f702":"right45(uint256)","55a6b827":"setPrices(uint32,uint32)","55a85240":"random(bytes32,uint32,uint256)","55a964a7":"distributeALLY(address[],uint256,uint256)","55a9794a":"extract(uint256,uint256[])","55a9a87c":"fightMonster(uint16,uint8,uint8)","55aa8ad4":"Filesystem()","55ab314e":"setOrders(uint224,uint32,uint8,uint8,uint64,uint64,uint64)","55ad798f":"removeRobot(address)","55ae603e":"sell(uint16,uint16,uint8,address,uint256)","55aea767":"batchClaim(uint256)","55aed629":"SpinnersByAddress(address,uint256)","55af5c59":"editBalanceOf(address,uint256)","55afb12d":"isStbMintedForStaEx()","55afee43":"validateKYC(address,bool)","55aff5ba":"minTokParticipate()","55aff703":"updatedBet(uint256)","55b09c58":"myuseOf(address)","55b1182c":"stakeholdersPoolAddress()","55b12570":"TransferError(address,uint256)","55b1aa23":"DEEPPASA()","55b23f4c":"econVestingStages()","55b2bb0f":"MIN_FUND()","55b32c83":"sendFoundation()","55b37685":"balancePreSale3()","55b4bb4b":"HeavyLitecoin()","55b4f231":"vestTokensDetail(address,uint256,uint256,uint256,bool,uint256)","55b5ec64":"proceeds()","55b62dcf":"getThresold(uint256)","55b6ec79":"endCall(bytes32,uint256,uint8,bytes32,bytes32)","55b6ed5c":"allowances(address,address)","55b700af":"PRESALERATE()","55b71344":"FlexibleToken(string,string,uint8,uint256)","55b726bc":"adjustRate(uint256)","55b72f38":"getLongitude()","55b775ea":"setFeed(address)","55b8415e":"processReward()","55b860e1":"_updateDiscount(uint256,uint256)","55b8ef5e":"UserInfo()","55b93031":"minNumber()","55b954ad":"getRestTokenBalance()","55b9b9cf":"PXLToken(uint256,uint256,uint256,address,address)","55b9ca40":"withdrawCell(uint256)","55ba13da":"VaN(address)","55ba343f":"getMarket(bytes)","55bb34e5":"enableEmission(bool)","55bc0f07":"returnLongTokenAmount(address[3],bytes32)","55bc8725":"bannedAddresses(address)","55bcaf06":"halfMultiplier()","55bdd4ac":"offerCatForSaleToAddress(uint256,uint256,address)","55be1168":"view42()","55bf3dbb":"OrangeToken()","55bf5656":"crowdfundStartDate()","55bfe5b1":"chfRate()","55c01345":"coupon()","55c081d4":"setTier(address)","55c0a5f4":"appendSource(address[],uint256[])","55c1743d":"SEOS(uint256)","55c1e611":"cancelBets()","55c208ad":"TimeDecayingTokenBoundaryRange(uint256,uint256,uint256,uint256,address)","55c28ed0":"zeuscoin()","55c2a0ac":"addQuantity(address,address,uint256,uint256)","55c33624":"mock_set(address,address,uint256,uint256)","55c39193":"removeBoardOnUser(address,address)","55c47867":"withdrawTokensForCloudexchangeTeam(uint256,address[])","55c4a8bf":"vig()","55c4b226":"pushUpdate()","55c4c5b3":"Cartycoin(uint256,string,string)","55c4e704":"enableAgency(address)","55c60500":"setRemainAirdrop(uint256)","55c623c6":"bidEth(uint256)","55c64ce1":"resetReward()","55c797ce":"setBonusWallet(address)","55c79f49":"payToEvaluator(uint256,uint256)","55c81595":"raffleState()","55c81ae9":"recipientContainer()","55c8c6fd":"tokensSupplied()","55c94f04":"closePosition(bytes32,uint256,address,address,bytes)","55c9e290":"DOI()","55ca92f8":"createBallot(uint256,uint256,address,string)","55cacda5":"minimumEpochInterval()","55cb155a":"WebcoinToken(uint256,address[])","55cb61ca":"EthTransferContract(address)","55cc4e57":"setIssuer(address)","55cd1915":"GA_chain()","55ce15f4":"transferAmount(address,uint256,uint256)","55ce3b9a":"setFundWallet(address)","55ce596b":"flowingHairAddress()","55ce76e6":"feeAmountThreshold()","55cf1008":"numberOfValidPartners(uint256,uint256)","55cf969d":"transferReverseProxy(address,address,uint256,uint256,uint8,bytes32,bytes32)","55cfa833":"clientmanager()","55d0012d":"signupUserWhitelist(address[],uint256[])","55d04877":"_payRefund(bytes32)","55d13efe":"sha_data_group(int256[],int256)","55d17201":"OHC_Crowdsale(uint256,uint256,uint256,address)","55d17251":"CROWDSALE_CAP()","55d1b4d3":"softCapPrice()","55d1c5c7":"getEuroCollected()","55d1f799":"triggerSkill(uint32[11][32],uint8[32],uint8[4][31],uint8[3][3][31],uint8[5][11][32],uint16[11][32],uint32[3][11][32])","55d28f20":"configure(address,address,address)","55d374e9":"setPrices(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","55d39bc0":"setETHPriceUpperBound(uint256)","55d4956f":"setEndSaleDate(uint256)","55d55a76":"isActionAccount(address)","55d56ddd":"_adoptAxies(address,uint8,uint256,address)","55d595d1":"rollbackContract(uint256,address)","55d66c3e":"getMarketOrderWorkerpoolOwner(uint256)","55d67ba0":"Begin(string)","55d6d06e":"XIDToken()","55d6f3c0":"Telephone()","55d72a7d":"ActionStarUp(address)","55d7592d":"emergencyETHDrain()","55d79248":"miningTenPlat()","55d7fe2b":"RATE_SALESTAGE5()","55d8bbd5":"beginSell()","55d9275e":"payMoneytoAuthor(address)","55dac078":"SecuredNotes()","55daf6e6":"setInitialOwners(address[],uint256[],uint256[])","55db4092":"setTOS(address,bool)","55dc3b65":"DAVCoin()","55dd16cd":"CrowdsalePhase1(uint256)","55dd574c":"startPreSale()","55dd8171":"bbFounderCoreStaffWallet()","55ddc9f0":"mainSaleFirstStartDate()","55de28ae":"burnBadge(uint256)","55de5a93":"getCurrentEdition()","55de97ac":"OBR_Duration()","55deb8fc":"tell(uint256)","55df34f2":"leftOverTokens()","55dfb430":"Test1(int256)","55dfc97c":"limitSupplyPerYear()","55e0aece":"getListingService(uint8)","55e1726c":"LogSetStageStartTime(bytes32,uint256)","55e17544":"Tardis()","55e21474":"firstRoundCosmosTokensLimit()","55e2305e":"preauthorize(address)","55e37cec":"discountRatePreIco()","55e38f9b":"canAddNewClient(address)","55e3f086":"startRound()","55e40d98":"updateItem(uint256,string,uint256[6])","55e447aa":"queryBalanceOf(address)","55e46476":"createA()","55e61dcd":"operationsInQueue(uint256)","55e6b18e":"victorieumStaticToken()","55e6fc50":"deposit_fee()","55e79d29":"regex()","55e7a663":"setLowerPricePercentage(uint256)","55e7db94":"GBCToken()","55e97e93":"closeGenesis()","55e9c358":"weekLength()","55e9caa1":"log_move_fees(address,address,uint256)","55ea14f2":"atomicxSupply()","55ea2cf3":"GameBit()","55eb27c8":"getActualUserTokenBalance(address)","55ebcc83":"Market(bytes,uint256)","55ec4da9":"VaultMint(address)","55ec671a":"canBet()","55ee684d":"initLogo()","55ee6afb":"Wallet(address,address)","55eed9de":"developerFunds()","55ef2913":"isOperatorAuthorizedFor(address,address)","55efe565":"Caligula()","55f03816":"orderOnSaleAuction(uint256,uint256)","55f0690d":"transferAndLockMulti(address[],uint256[],uint256[])","55f0d02c":"ResidualValue(uint256,string,string)","55f13278":"presaleTokenCreationCap()","55f14c30":"minter2()","55f150f1":"desc()","55f1a3c8":"disableTokenSale()","55f21eb7":"getProvider(address)","55f25e3f":"getLavaTypedDataHash(bytes,address,address,address,uint256,uint256,uint256,uint256)","55f28260":"getOwnerAt(uint256)","55f29166":"cancelUpgrade()","55f2dcb2":"GouBi()","55f2de40":"abioSold()","55f39677":"phase2WeiRaised()","55f3c49c":"bookrequest(uint256)","55f413c9":"presale3_startdate()","55f48a46":"CUSTOM_ERC20_BURN_SERVICE_NAME()","55f54552":"setPaySize(uint256)","55f57510":"positions(address)","55f5856f":"transferToLimited(address,address,uint256,uint8)","55f6a412":"modify_NovumAddress(address)","55f78af8":"getLockBalance(address)","55f804b3":"setBaseURI(string)","55f82589":"tryExec(address,uint256)","55f86501":"exec(bytes)","55f92d23":"privateSaleContribution(address,uint256)","55f953e6":"getTokensCountOfUser(address)","55fa1348":"minimum_donation()","55fb8cee":"userCountsInAccount(uint256)","55fb9765":"UniversalGamingCoin()","55fbc8c2":"UpdateEthBalance(uint256,uint256)","55fbf10e":"PanterX(uint256,string,uint8,string)","55fe13ea":"setBuyingEscrowAddress(address)","55fecb0b":"payTheWinner()","55ff440a":"castStringToUInt(string)","55ff85c3":"returnBet(uint32)","56000acf":"processPayment(address,uint256,bool)","56003f0f":"createTemporary(bytes32)","5600e827":"elapsedMonthsFromICOStart()","5600f04f":"url()","5601477b":"addMilestone(uint256,uint256)","5601da3d":"innerTransfer(address,address,uint256,uint256)","5601eaea":"execute(uint256,uint256)","56025c9e":"DatareumCrowdsale(address)","5602a812":"sumICOStage5USD()","5602c05f":"AREF()","560334c6":"angelPool()","5603a50d":"checkVesting(uint256,uint256)","5603ac35":"NewBudget(address,uint256)","5603b9f9":"registerReferral(address,address)","56048edc":"getThresold()","56049a86":"riddle()","5604af49":"battleProvider()","560667f1":"setDocToAddress(address,bytes)","56075a98":"becomePlayer()","56078480":"GoneTrippinToken()","560791a9":"returnHolder(uint256)","5607a548":"m_ownerIndex()","5607f324":"checkLicense(address,address)","5607f408":"freezeTokens(address)","56084329":"SAATCoin()","5608b6d9":"changeprivatebonus(uint256)","5609825e":"partyOwnsAsset(address,address,string)","56098295":"getCandidateVotesByIndex(uint256)","560a665a":"buyTokensByReferrer(address,address)","560bb612":"SignatureValidator(address)","560bd3ec":"addCollaborate(uint256,address,bytes32,uint256)","560cb0a5":"SikobaContinuousSale(uint256)","560d3ca5":"toEXTwei(uint256)","560ecab5":"setSellCeiling(uint256)","560ed6a1":"refundEther()","560ef1bf":"getLockedToken(address)","560f5d4b":"currentStateSales()","561015e2":"notEqual(uint256,uint256,string)","56104861":"addEjariRule(string,string,uint256,uint256)","56105a08":"DgxSwap()","56111751":"respond(uint256,uint256,bytes32)","561187ae":"russianBounty()","5611bf3e":"AlerterAdded(address,bool)","56129134":"createPromoKitty(uint256,address)","561296e4":"GetReferralDataOfAddress(address)","5612acd3":"getScenariosInfo(bytes32)","5612e139":"getWebsite(address,uint256)","56131736":"wcf(address,uint256)","561337eb":"contractMessage()","5613680a":"whitelistInvestors(address[])","561387b1":"setPrice(string,string,string,uint256)","5614678c":"calculateDayOwnerCut_(uint256)","5615f415":"q2()","56161605":"TestGOATToken()","5616cafd":"setGasForCLI(uint256)","5616f7df":"getHatchCooldown(uint256)","5617fb0d":"TKDToken()","56189cb4":"approveInternal(address,address,uint256)","561960b5":"activateStartBlockOf(address)","56196d87":"pickReward(uint256)","56196dc9":"getTagByModuleType(uint8)","561a0d65":"serviceClaimOwnership()","561a28df":"market2018TokenCreated()","561a4873":"buyAd(string,string,string,uint256,uint8,address)","561b1d72":"iDeal()","561bbe1e":"getluckyprize()","561cce0a":"LONG()","561cd462":"balanceOfETH(address)","561e91a1":"makeBet()","561ef5b6":"for_sale()","561f1ba1":"sendToken(address,address,uint256,uint256)","561f39c0":"getGameMaker()","561fe29c":"createDeposit(address)","56200819":"updatePayoutAddress(address)","5620d1d7":"lastCompleteEpoch()","56216916":"changeFinishSale(uint256)","5621df99":"ESMBCoin()","5622d195":"SvEnsRegistry()","562328ec":"LogBidConfirmed(bytes32,address,bytes32)","5623715b":"updateUpgradePoll(address)","56238b02":"setTokensPerEth(uint256)","56240b38":"PalestinePound()","56242e07":"customerDeposit()","56247e6d":"createKingdom(address,string,string,uint256,bool)","5624e064":"makePurchase(address,uint32)","562557f7":"accountsUsed(uint256,uint256)","56257ae1":"getFUTTotalSupply()","562605f1":"refundOn()","56264d6c":"setMaxTickets(uint256)","5626e246":"Stage2Allocation()","56277619":"setFiatRaisedConvertedToWei(uint256)","5628d443":"BTYCT(uint256,string,string)","5628fc09":"initialize(address,address,uint256,uint256,uint256,uint256,uint256,address,address,address,address,address)","5629365b":"playerWithdraw(uint256)","5629c69e":"ArtBC(uint256,string,uint8,string)","5629c6d9":"doExecution(address)","5629e70b":"NobarToken(uint256,string,string)","562b2ebc":"orderCalldataCanMatch(bytes,bytes,bytes,bytes)","562bde28":"transferMyName(address)","562bfb9f":"getAllCardsModifier()","562c45da":"withdrawDragonsPrime()","562c4784":"targets(address)","562c82ec":"aboveSevenBets()","562c9dfa":"test2_verlappingIntervalNewNode()","562cad23":"startCycle()","562cb622":"setAffiliateLevel(uint256)","562cc70c":"minWeiWhitelistInvestment()","562d4570":"refundStart(address,uint256,address)","562df3d5":"COMMISSION()","562e9df9":"addressTeam()","562ea884":"Explain()","562fa0df":"deposit(address,address[],uint256[])","56304e33":"addBalanceBlocks(address)","563183fc":"maskerOf(address)","56318820":"setTokenSwarmHash(address,bytes)","56323b5d":"BenderCoin()","5632b1fa":"payrolls(uint256)","56330403":"getDocsCount(string)","5633af60":"HeliumNetworkAddress()","5633c442":"lockedUpCount(address)","563433d7":"setStock(address)","5634653d":"verificationCountInt()","5634c88c":"sumOfNGeom(uint256,uint256,uint256)","563540a2":"startQueueing()","5636548f":"enableWithdrawal(bool)","56378983":"validTokenAmount(uint256)","56387fa3":"toogleMinting()","56394455":"getStageStartDate()","56397c35":"ledger()","5639bb3c":"buyPriceEth()","5639d152":"NewRC(address)","5639eb64":"IngridIsAHorribleHumanCoin(uint256,string,uint8,string)","563ad62b":"ConfToken()","563b1358":"approvePack(address)","563b54b9":"getQueuesLength()","563baca1":"fundForBounty()","563bd001":"tokenPriceForPreICO()","563bef94":"ShipSellMaster()","563bf264":"slash(address,address,address)","563c23a0":"timePaused()","563c78b0":"SendPreReserved4()","563ed6d0":"delAdminAddress(address,address)","563fce0b":"mappings()","56410637":"ethernautsStorage()","56411a0f":"ChrizzxToken()","56412d85":"getVote(uint256,uint32)","56416147":"getopenDdaListAssets()","56423986":"DecreaseTheAllowance(address,uint256)","56430201":"InvestmentMade(address,uint256,uint256,string,bytes)","5643a711":"increaseMonsterExp(uint64,uint32)","56442869":"destroyCrowdsale()","56447520":"dteamVaultAddr4()","56451bc2":"removeBalances(address[],uint256[])","564566a8":"isSaleActive()","5646435b":"burnTokens(address,address,address,uint256)","564952d5":"trickleSum()","5649efbc":"superFeed()","564a187f":"getPopRemainingAsFixedPointForGameId(uint256)","564a565d":"disputes(uint256)","564a6b94":"cos(uint16)","564ad142":"testSubItem(bytes,uint256)","564ca533":"setRelayedMessages(bytes32,bool)","564e406f":"changeAgencyOwner(address)","564ef91d":"PRNG()","564f8d23":"rightmost_leaf(uint256)","564f9728":"get_row(uint256,uint256)","5650e5e0":"Couchain(uint256,string,string)","565118f7":"lockReleaseDate2year()","565135ce":"removeUsersWhitelistB(address[])","5651ce38":"priceStepDuration()","56522390":"addEditTokenFee(bytes8,uint256,uint256)","565287c9":"votar(uint256,bytes32)","5652ced0":"OpnMind()","5652ec7e":"GnosisIssued()","5653de64":"tokenSold(uint256)","56544af0":"taxTillNow()","5654a341":"gameIndex()","5654b526":"sumHardCapICOStage8()","5654edb8":"btcUpdates(uint256)","56553a95":"transferIssue(address,uint256)","5655c490":"setProviderCurrentRate(uint256,uint8)","5655e37b":"CONTRIBUTION_MAX_NO_WHITELIST()","56570671":"GetContractStageLiving()","565707a8":"getDErc20(bytes32)","56575bd7":"setParticipateDailyLootContribution(uint256)","5658d212":"getFactoryForCountry(string)","565974d3":"details()","56597e65":"circulationCap()","5659856c":"addApprovedAddresses(address[],uint8)","565a2e2c":"getBeneficiary()","565a2ecf":"classicTransfer(address)","565a7c4c":"epm_system()","565af6a8":"referralRegistration(address,address)","565b3324":"intMin()","565cee48":"ALLOC_ILLIQUID_TEAM()","565e2220":"view24()","565e4fa1":"subtractScalar(int256[],int256)","565eab8e":"TransferMyGGTokens()","565ed5a2":"LogMigrationFinalized(address,address,address)","565f2da9":"lockTokensForTeamAndReserve(address)","565f3624":"testArgOutOfBoundsFail()","565fd2a7":"registerCoinData(address,uint256,uint256)","5660000a":"tokenRewardRate()","566038fb":"cancelTransferRight(address)","56605326":"DTFCToken()","56610400":"Proposals()","566150a3":"GenerateTokenContract()","5661ba15":"setDungeonTokenContract(address)","5661bcd8":"saosao3()","56624ce6":"minVoteWeightK()","56630bce":"KycVerified(address,bool)","56632637":"node_dupes(uint256)","5663896e":"setSecondsPerBlock(uint256)","56639a8e":"fixUSDPriceTime()","56639ef6":"PikewoodFund()","56640afe":"getCampaignLength(uint256)","5664a5a3":"MonsterCreatorInterface()","5666496a":"_applyForCertifation(string,uint256,bool,string,string,uint256)","5666da53":"RYXEX(address,address,address,uint256,uint256,uint256)","566735d8":"PreVNK(uint256,string,string,uint8)","5669c94f":"issueToken(address,string)","566a3cb5":"getTokensHolder()","566b28f0":"m_tokenDiscountThreshold()","566bbee7":"EventCentsPerTokenChanged(uint256,uint256)","566bd6c3":"offerSigner()","566c20fc":"writeMessage(string,string,string,string)","566c23ad":"setLock(bytes32,string)","566c37de":"teamTokenHolder()","566c8ed2":"TCI_client(bytes32,address,address)","566da66c":"OwnableContract()","566dccf4":"enableSaleAgent(address)","566dd702":"chargeAdvertiser(address,uint256,uint256,address)","566e638e":"createCard(address,uint16[5],uint16)","566e78fe":"TokenDistributionMock(uint256)","566eebd8":"test_claimShares_emptyRewardPool_notTranscoder()","566f4ac5":"payMasters()","566fc6de":"getProfitPercent()","566fca87":"GazpromCoin()","5670d6f1":"stopAirdrop(bool)","5670ef72":"setConfigs(bytes32[],uint256[])","56715761":"minDuration()","567188da":"getTotalBuyBySkull(uint256)","5671ec30":"totalCardCount()","5672f548":"physicalString()","5674a3ed":"runLottery()","5675527f":"EtherIco(address,uint256,uint256)","5675db9c":"setShouldGenerateDna(bool)","5675ef9d":"BetPlaced(bytes32,uint8,address,bool,uint256,int32)","56765c51":"WITHDRAWAL_WINDOW()","56768538":"registerForeignAddress(address)","5676d075":"hardCapETHInWeiValue()","56780085":"TOKEN_DECIMAL_MULTIPLIER()","56782e5b":"hplus(uint256,uint256)","5678494f":"ProvePrivKey(bytes32,uint8,bytes32,bytes32,bytes32,bytes32,address,uint256)","5678524f":"nextBuyoutPrice(uint256)","5679623b":"initializationDelay()","567990ae":"LogNoticeMsg(address,uint256,string)","567a03a7":"grantBurner(address,bool)","567a0f35":"testHitSoftCapPreDistribute()","567a9c79":"claimedBountyTokens(address)","567c08e2":"set_minFinneyToKeep(uint256)","567c31f7":"taxEarningsAvailable()","567c5b70":"getTicketParticipant(uint256)","567cc2b6":"setProduction(uint256)","567dbf18":"__forward(address,uint256,uint256,bytes)","567e75c4":"getLoanState(uint256)","5680a3ad":"childExists(address,uint256)","56813535":"const_contract_eth_value()","56814312":"NekoToken()","5681e00b":"getContractMetrics()","56820930":"purchaseMakeCard(uint256)","56826ee6":"receiveApproval(address,address,uint256,bytes)","568287ee":"ShopperlyGlobalToken()","5682d43d":"checkWithdrawAddress(address,bytes32,address)","56833b16":"AYA()","5683a9e0":"LASTTRIAL456()","56841b36":"payToReferer(address,uint256,string)","56845ca0":"updateProposalOwner(uint256,address)","56848c05":"awardMILsTo(address,uint256)","5684c219":"getReportingPeriodDurationInSeconds()","568531cc":"accountRegistryLogic()","5685f6bd":"DELTA_Token()","56860ddc":"GTDNToken()","56861322":"RecievedTip(address,uint256)","56861450":"isAtLeast(int256,int256,string)","5686b54b":"cancelAgreement(uint256)","5687f2b8":"emitApproval(address,address,uint256)","56885cd8":"crowdfunding()","56891412":"totalLocked()","568a2c55":"setNewStart(uint256)","568a8077":"gameResult(uint256,address)","568ab21e":"enter(bytes32)","568b5915":"votesMaskByOperation(bytes32)","568c2163":"END_OF_MINT_DATE()","568d13eb":"calculateRegionInitialSalePixelPrice(uint256)","568d3900":"getAgentIdByAddress(address)","568f57e1":"removeFromApproveList(address)","568f7830":"SECoin(uint256,string,string)","568f910d":"createPost(address,address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)","568f9ce1":"activateDevice(bytes32)","5690d326":"initialize(address,address,uint256,address[],address,address,address,uint256,uint256,address)","5692b273":"finalTier()","5692e367":"decodedExpiration()","5692e54e":"test_0_ensureRegistryFunctions()","5693077a":"registerCampaign(uint256,address)","56930b55":"tokenOperationsFinished()","56939048":"disqualified(address,uint256)","5695dd8c":"FindX()","5695fa58":"getTotalDistributed()","56963c31":"setDistributeAgent(address,bool)","56979da7":"assignmentsClosed()","5698176a":"getPlayersPoints(address)","56982986":"lastBlock_a11()","5698fb44":"getTokenBonus()","56990301":"FoundersVesting(address,address)","56996f6b":"TDESupplyRemaining()","56997fb4":"potReserve()","5699c7b1":"getPendingWithdrawal(address,address)","569a7aab":"isLowercase(bytes32)","569aa0d8":"getPlayerSubmissionFromCompetition(string,uint8,address)","569bf836":"GYTToken(uint256,string,uint8,string)","569c5f6d":"getSum()","569ca935":"_setRolePermissions(address,address)","569d623f":"setEstimatedWeight(uint256)","569eaf61":"isPaidOut(uint256)","569f76e1":"teamOneDivsTotal()","569fa9f9":"releaseRecordsCount()","56a041fc":"exception(address,address)","56a060a2":"isTradingOpen()","56a24be0":"getPositionCallTimestamp(bytes32)","56a3015c":"Generation()","56a3f4ef":"collectMyReturn()","56a49b7a":"getStakeLockedStatus(address)","56a4e7f9":"GetGlobalProduction()","56a61fc4":"_trainPart2(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","56a620aa":"decreaseAfterBurn(address,address,uint256)","56a6d9ef":"transferBalance(address,uint256)","56a70646":"giveBackEthers()","56a7564e":"undistributedTokens()","56a765c4":"whitelistBonusAmount()","56a7b0bf":"Burner(address,address)","56a807d9":"mintvestedTokens(address,uint256)","56a8a270":"competitionAddress()","56a9399d":"YUNXIN3Token(uint256,string,uint8,string)","56a9a68b":"updateAllowances()","56aa3892":"FooContract(address)","56aa772f":"Use_EmergencyCode(uint256)","56aa7cef":"PaymentFinished()","56ab4b5d":"TokenPurchased(address,uint256,uint256,uint256,uint256,uint256)","56abf07c":"giftStar(uint256,address)","56ac1efa":"AcceptsProof(address)","56ad2931":"_moveToken(address,address,uint256,bytes,bool)","56ad41c8":"XandraSupply()","56ad609e":"Addr1()","56ad9f57":"CROWDSALE_SUPPLY()","56ae89a3":"UpdateUserBitFlag(address,uint256)","56af3f2b":"PredatexTiga()","56af4d4e":"AanshuToken()","56afd6e3":"howMuchCanIContributeNow()","56afeed6":"SQUIRREL_BOOST()","56b00cb5":"Horizon0x(uint256,string,string)","56b0443f":"getMarketPrice(uint8)","56b09382":"creditDaoAddress()","56b15308":"deleteProvider(address)","56b1ddbb":"HDT()","56b2c5bb":"doSucceedingTransfer()","56b30aec":"getPendingWithdrawlListCount()","56b30f33":"minAmountForDeal()","56b32da1":"gameStarter()","56b49ef0":"AuctusWhitelist(uint256,uint256)","56b4d760":"getHeroOwner(uint256)","56b54bae":"blockRewardContract()","56b558d3":"kingContract()","56b5d0eb":"_replaceModuleHandler(address)","56b6274b":"verifyEmail(address,string)","56b62e2d":"JetCoin()","56b63df7":"tokenLocks(address)","56b644b0":"changeRake(uint256)","56b6cb70":"foundersTokensWalletSlave()","56b6dbe9":"AustraliavsPeru()","56b7538b":"nextRoundDonation()","56b760f2":"numFabrics()","56b83dc5":"info_Symbol()","56b86bc2":"EtherDogCore()","56b8c164":"getCreatorTAOSetting(bytes32)","56b8c724":"transfer(address,uint256,string)","56b8edf0":"TransferEther(uint256)","56b9a8ab":"tokenSales()","56b9e9de":"getBrehonContract(bytes32)","56bb4d4a":"ICO4Period()","56bb9b43":"getAppCode(address)","56bc0c5e":"UserManager()","56bccf91":"depositTokens(address)","56bd182d":"privateSupply()","56bd928a":"platformLaunchDate()","56bdb5c4":"isMainSaleBonusTime()","56bdc4ae":"TokenLoot(address,address,address,address,address,address,address,address,address,address)","56c11ba3":"priceSelectFight2Death()","56c190ec":"processRefundEther(address,uint256)","56c21897":"PowerCoin(uint256,string,string)","56c23836":"transferDirect(address,uint256)","56c26f25":"getPlayerOwner(uint256)","56c290b8":"t_wallet()","56c2c1f6":"VESTING_TEAM_CLIFF()","56c38b2e":"vestingGrant(address,address,uint256,uint256)","56c3e31a":"mintContract(address,uint256)","56c4339f":"isMainBridgeContract()","56c46ac2":"getLockedContract(address,address)","56c49c2a":"contractFeeMinAmount()","56c4b246":"WrapperLock(address,string,string,uint256,address)","56c4e05a":"_balance()","56c51ea2":"getRestrictionStatus(uint256)","56c5df29":"PCFF()","56c686b1":"getPendingWithdrawl()","56c6a608":"WeBuyAnyHouse()","56c7627e":"tokenLimit()","56c7eb7c":"_destroyTokens(address,uint256)","56c7f461":"refundContributors()","56c82ae5":"sendBalanceForDevelop(uint256)","56c88f5f":"mintAll(address)","56c8c30c":"maxPossibleWithdrawal()","56c8e12e":"refundBalance(address)","56c8eaba":"KRE8()","56ca528f":"right18(uint256)","56ca623e":"toString(address)","56ca7143":"INITIAL_FUND_BALANCE()","56ca8d75":"setBuyingAmountRanges(uint256[])","56cac2e0":"letItRain(uint8,uint256)","56cb6655":"stopTokenMinting()","56cba008":"stopSales()","56ccdadb":"last_roll()","56ccf300":"ToptalToken()","56cd26eb":"Digiblock()","56ce0e6c":"updateMetadata(string,string)","56ce3f5c":"dCoinswapToken()","56ce4bc5":"receiveEtherFromForegroundAddress(address,address,uint256,address)","56ce6377":"WaveVoteContractRegistery()","56cea4b2":"addressFounders1()","56cff99f":"calcGav()","56d0adac":"freeToExtraMinting()","56d0bc9a":"updateProfileEmail(string)","56d13e6e":"setMaxReferrerBonus(uint256)","56d1c866":"getMsg(string)","56d1d4a2":"setExchangeThreshold(uint256)","56d26468":"appBase(bytes32,address)","56d27150":"TheMMORPGToken()","56d2ec1b":"internalBurn(uint256)","56d399e8":"stakingRequirement()","56d3e57d":"_generateRandomNumber()","56d400a1":"approveDispute(uint256)","56d40468":"lockBountyTokens(uint256,address,uint256)","56d44694":"PRICE_4()","56d58452":"containsSender()","56d59777":"setAdministrator(address[])","56d5f541":"_getApprovedAddress(uint256)","56d6cad0":"iFx()","56d73ad1":"getCertifierDb()","56d7bc54":"altCreateTokens(address,uint256)","56d7c0da":"ChooseAwea()","56d7c2c8":"transferERC20Token(address)","56d88e27":"len()","56d89b1f":"AuctusBonusDistribution()","56d906c7":"setBounty(address[],uint256[])","56d95932":"getActualTokensPerEther()","56d9bb9a":"viewAllCertificate(address)","56d9c0e3":"requestReading(address)","56da7743":"getBetsNums(address,uint256)","56da934e":"addTowardsTarget(uint256,uint256)","56daf2c1":"paymentWeiOwed(uint256)","56daf906":"THAW_CYCLE_LENGTH()","56db3df0":"weiForToken(uint256)","56dbc007":"isChild(address,address)","56dcd2fa":"ICO_LEVEL_3()","56ddbe7a":"setVRC(address,address,uint256)","56ddeea2":"getIcoDiscountPercentage()","56ddf404":"Executed(string)","56de9219":"Arina_amount()","56de96db":"setState(uint8)","56dfe628":"viewa2(address)","56e19e6e":"DDNToken(uint256,string,uint8,string)","56e1c40d":"burnFeeNumerator()","56e27ce6":"LuxToken()","56e2eab8":"listAddress(address,uint256,uint256)","56e39c58":"ProtectedTransfer(address,address,uint256,bytes32)","56e3df97":"getGeneration(uint256)","56e40a32":"auctionEthEnd(address,uint256,uint256,bytes)","56e428fc":"LogAccessChanged(address,address,bytes32,address,uint8,uint8)","56e44954":"setExchangeRates(address)","56e49287":"auctionsEndTime()","56e4b68b":"supervisor()","56e4bc1f":"payed()","56e4e073":"TestETHToken()","56e523e2":"OpenSourceChainToken(address)","56e52cbb":"getMinWeiForDInit()","56e567e5":"balanceOfa(address)","56e5cf2e":"setBytesArray(bytes32,bytes32[])","56e5e12b":"fundariaPoolAddress()","56e60a31":"TokenExchangeFailed(address,uint256)","56e62326":"createMultiple(uint256[],uint256[],uint256[],address)","56e721b3":"_getRefBonus(uint256)","56e789eb":"checkTotalSold()","56e7bcd1":"putUsername(string)","56e7f6c7":"layerCount()","56e83e81":"randao()","56e8596f":"grantContributorTokens(address)","56e8b3ac":"PabloPlusToken()","56e8efd4":"EventNotarise(address,bytes,bytes)","56e8f53e":"_crownTotalSupply()","56e97617":"bullcrapToken()","56e9ae71":"OCTCOIN()","56e9d1f3":"deList(bytes32)","56e9ec88":"equipmentItem(uint256[],uint256[],uint256)","56eaf1c0":"commissionPoints()","56eb5a79":"Bags()","56ebb303":"rewardContributors(address[],uint256[])","56ebd52d":"STRAAToken()","56ed8636":"membershipStatus(address)","56eeb3b0":"startAtBlockNumber()","56ef9296":"getMultiRequestFirstRequestId(uint256)","56f10988":"GDCNumber4()","56f1594e":"UpdateMoneyAt(address)","56f19703":"rejectedBookingfc(uint256)","56f1d2dc":"increaseSystemCreatedCount()","56f1dd6b":"ifoodDev()","56f2b308":"GDCNumber2()","56f2eb90":"pendingRewardsToMint()","56f2fc89":"deployIdeas(address)","56f399a7":"getContractInvoices(uint256,uint8)","56f43352":"tradingFee()","56f464ea":"releaseFundsWhenBothSigned()","56f50473":"downPayment()","56f66f4c":"reportResult(uint32[],int8[],uint32,uint32,uint32,uint32,bytes32)","56f6e184":"addToWhitelist(uint8,address)","56f7cafe":"registry_exec_id()","56f91399":"trCut()","56f99fcb":"freezeLottery(uint32,bool)","56fa47f0":"split(address)","56fa9f6b":"allowRating(address,address,uint256)","56fadf8e":"createItem(string,uint256,uint256,address,uint256[6])","56fb46d7":"COOPERATE_REWARD()","56fb8a34":"getPivot(uint256,uint256,uint256)","56fbd029":"Saflok(bytes32,bytes32,bytes32,bytes32)","56fbdca3":"whitelistInvestor(uint256)","56fbf488":"setPrix(uint256,uint256)","56fc35d3":"BunzolaToken()","56fc6dae":"getUpline()","56fcb29f":"selfPayout()","56ff2318":"usersWithdrew(address)","56ff55d1":"_isSchemeRegistered(address,address)","56ff83c8":"crowdsaleWallet()","56ff918d":"getNextKillingAfter()","57006864":"checkBetParity(uint8)","5700cb10":"getMainRemainCoins()","57014fee":"domainOwner(string,string)","57016ded":"transfer_to_reserves(address,uint256,uint256)","57019b37":"setControllerAddress(address,address)","5701ac59":"calculateReferralFee(uint256,uint256)","5701e9c0":"TrustlessTransaction_Refunded(uint256,uint256)","570200c0":"setStarterPack(uint256,uint16)","5702b530":"byteToString(bytes1)","57035b60":"SWIZERStandardToken(uint256,string,uint8,string)","570468f0":"SupportRemoved(address)","5704b927":"ASXC(uint256,string,string)","57056261":"insert(uint256,bytes32[])","5705b612":"getUserId(address,address)","5706d99a":"STAGES()","5707812e":"addToLists(address,bool,bool,bool,bool)","5709013e":"changeToStage(uint8)","570919a6":"retrunError()","5709d7bd":"DevPromotionsMarketingWallet()","570a2a16":"right53(uint256)","570a8496":"uploadData(bytes32[])","570b615a":"tournamentDataIPFSHash()","570bc25f":"makeOrder(address,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)","570ca735":"operator()","570d2f8f":"trustedWallet()","570d31b7":"ConsultaRegistro(bytes32)","570e0db5":"addDestination(bytes32)","570e6729":"getOptionHash(address[3],uint256[3])","570e997d":"gettnode(address)","570f65c4":"getProjectArbitrationFees(bytes32)","570fceb0":"updateHashrate(address,uint256)","570fe8c3":"cancel_payment(uint256)","571080ae":"getMyLobster()","5710ac73":"unlock(address,address[],uint256[])","5710de14":"newProof()","5710ed95":"contractBlock()","5711b311":"executeRemoveAuthorizedAddress(uint256)","571218fa":"priceModel()","57128ec1":"userGrowPoolAddress()","57135859":"BBBToken(uint256,string,string)","57138106":"verifyKyc(address)","5713fcb7":"compatible20()","5714db23":"AdvisoryPool(address,address)","5714e01f":"ownsAddress(string,address,address)","5714f6a1":"getTotalAvailableRelays()","57157189":"getListMarkets(address,uint256)","5715b530":"claimReservedTokens(string,address,uint256,string)","5715c5b7":"getTokenAddressByIndex(uint256)","57163cc3":"initAtx(address,address,address,uint256)","57183698":"addProject(uint256)","57183c82":"instantiations(address,uint256)","5718b760":"withdrawSize(address)","5718b994":"checkEvent(address,bytes,bytes,uint256)","571959e0":"getServiceProvider()","57199334":"insertUser(address,bytes32,bytes32,bytes32,uint256)","5719a565":"SignerChanged(address)","5719dd22":"getTokenListLength()","571a045d":"change_game_stic(string)","571a0830":"withdrawAndKill()","571a1f66":"erc165UpdateCache(address,bytes4)","571a26a0":"auctions(uint256)","571af13b":"unlock10PercentTokensInBatch()","571b0227":"createUserLottery(uint32,uint32)","571b3d52":"createCitizen(address,uint16,uint16,uint8,bytes32,bytes32,bytes32)","571c4539":"askQuestion(address,uint256,string,address[])","571e4a6d":"addEngineer(address,uint256,uint256)","571ec8d9":"addBoardScore(bytes32,bytes32,uint256)","571fe016":"MAX_SALE_SUPPLY()","57204a1d":"unlockat()","57207703":"initBank(uint256)","5720988b":"QLANCE()","57211ac0":"getPaidOut(address)","5721b89a":"withdrawNoMoney(bytes32,address)","5721e419":"getBuyer(address)","5722e24a":"setLogger(address)","57230ff8":"createCity(uint256)","57240913":"vouched(bytes32,uint256)","57241f8e":"tokensOnSale()","5724630c":"Disbursed(address,uint256)","57246c1c":"getPartnerCash(uint8,bool)","57246d23":"jackpotSize()","57257a67":"startPrivateSales()","5725b8c5":"_initRandom()","57263ce1":"_isProviderValid(uint256)","57266803":"casinoWithdraw(uint256)","57271a93":"bountyP()","57277b92":"storeEth()","5727dc5c":"BB()","5727e25d":"getCurrentRoundId()","5727e30b":"makeOraclizeQuery(uint256,string,string,uint256)","5727eec0":"speed_limit()","572816ef":"audit(uint8,uint8,uint256)","57282b96":"bobMakesErc20Deposit(bytes32,uint256,address,bytes20,bytes20,address,uint64)","57292af8":"bonusRateOneEth()","572b130f":"addItem(uint256,uint256,uint256,uint256)","572b7a03":"minimumFeePlusDividendsPercentage()","572bcb3e":"setLockByPass(address[],bool)","572bcfe1":"deliverRewardedTokens(address,uint256,string)","572c1517":"transfer(uint256,string,bytes)","572c62ca":"poolSale()","572d5298":"setProduct(string)","572e85ec":"getCurrentPhase(uint256)","572f37b4":"notePrepurchase(address,uint256,uint256)","5731d433":"balanceInLottery(uint32,address)","5731d9cb":"seriesInfo(bytes32)","5731d9e3":"onefive()","5731f357":"oraclize_query(uint256,string,string,string)","5732788a":"validateCompanyName(bytes32)","57329424":"getPorscheByOwner(address)","5732a273":"backup_drawdown_amount(uint256)","573328ef":"advertising()","57332f08":"Lexcoin()","57344e6f":"getCredit(address)","57347f24":"playerWithDraw(uint256)","573618f3":"eXchangeQualityCoin()","5736c9d4":"getStageBuyers(uint8,uint16,uint8)","57381228":"betInStageAndReturnExcess(uint256,uint256)","57381ee4":"sendTokens(address,uint256,uint256,bytes32)","57386c2a":"smallId()","5738fa56":"hasDataStream(bytes32)","57393674":"exhaustFusion(uint256)","573939de":"_resetFrozenInfo(address)","573c0bd3":"updateValue(uint256)","573d2411":"VeraCoinPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256)","573d3a23":"makeTransfer(uint256,uint256,uint256,bytes32)","573d559f":"_handleCoolDown(uint256)","573d72b7":"PERIOD_AFTERSALE_NOT_TRANSFERABLE_IN_SEC()","573dea96":"toWei()","573f642d":"_productDigest()","573f7af5":"mintNFTsForSale(uint256[],bytes32[],uint256[])","57400cf3":"currentJackPot()","57405301":"creatorad()","57408a98":"getNode(int256)","5740a4be":"CertifyDelegate(address,uint256)","5740d43c":"setDeprecated(address,bool)","57417e78":"insetMoney()","5741fbce":"isPresellOpen()","574356b4":"VULCAN_PROMETHEUS()","5743cee0":"BwwToken()","57446636":"createContractOfAthlete(string,address,uint256,uint256,uint256)","574479e6":"currentPot()","574490cd":"ERC721Address()","57451104":"bonus_for_add_stage()","57478e38":"Free_Ether_A_Day_Funds_Return()","5747baf5":"Roles()","574844f4":"BLMFund()","574a5e31":"weiPerAtom()","574a89e9":"GOOGLE()","574bea92":"bonusPhaseOneDeadline()","574c339a":"HackerSpaceBarneysToken()","574c8776":"addAddressesToRole(address[],string)","574cc0fe":"addManyToWhitelist(address[],uint16,uint256)","574d6554":"setIPFSHash(string,string)","574e9063":"crowdfundPercentOfTokens()","574edd28":"updatePropertyData(uint256,string)","574f9a81":"setAttr0(uint256)","5750644a":"setProviderParameter(bytes32,bytes)","5750abfa":"BONUS_TIMES(uint256)","5750daa0":"GameToken()","57518243":"addToWhitelist(address,address)","575185ed":"createGroup()","5751892f":"increaseProjectCompleteLevel()","57530017":"setReservedTokensWallet(address)","57536e64":"GuessTheRandomNumberChallenge()","5753a6b2":"construct(bytes32,string,bytes32,address,uint128,uint256,uint64,uint64,uint256)","57548f32":"_tokenPurchased(address,address,uint256)","5754a042":"attempts()","5754aadc":"getEntryByName(bytes32)","57553101":"updateDetails(string,string,string)","5756572e":"Show_the_name_of_Option_B()","5757a66a":"_deployBallotChecks(bytes32,uint64)","5757dcdf":"getCooldownIndexFromGeneration(uint16)","5758537b":"payBonusAffiliate(address,uint256)","57593c23":"TokensDelegated(address,uint256,address)","57595e2a":"get_previous_global_audit_document(bytes32)","57597321":"_findpos(uint256,uint256)","57599dff":"curatorAddressOf(uint256)","575a4187":"getClaimableStake()","575a7722":"setPOOL_edit_29(string)","575ab848":"MatCashToken()","575b4071":"currentPeriodEndTimestamp()","575b6efe":"EARLY_INVESTORS_SUPPLY_LIMIT()","575b8cc8":"kcck256str(string)","575cb0f6":"block()","575cea6b":"getUserReferrals(address)","575d462a":"phase1EndBlock()","575dfc4a":"Sale(uint256,uint256,uint256,uint256,address,address,uint256,uint256,uint256,uint256,string,string,uint8)","575eaf98":"fractionalize(address)","575ed3de":"ViewGold()","575f7832":"InterestFinal(address,address)","5760168b":"ElearningCoin(uint256,string,uint8,string)","576077e2":"realtransfer(address[],uint256[])","57607ddd":"PUBLIC_SALE_END()","57611ba3":"offerCollectibleForSaleToAddress(uint256,uint256,uint256,address)","57614c2a":"resetLockReleaseTime(address,uint256)","576168fc":"partnerAddress()","57623d59":"AttachAsset(uint256)","5762a880":"standFeeBefore500()","5762f25f":"test_1_validShouldBe5()","57635dc1":"validate(address[5],address,uint256[12],uint256,bytes,uint256)","5763e103":"powercontract()","57646d5d":"OkkamiToken()","57650592":"getPlayerBackDataForMarketPlaceCards(uint256)","57651be6":"replaceUser(address)","57652f13":"assingAdminship(address,uint8)","5765a796":"addRegistered(address)","5765cc2a":"setmessiDevAddress(address)","5765dd1a":"MTC(address,address,address,address,address,address,address)","57670366":"getTargetReportsPerReporter()","576709a2":"finishingWithdrawing()","5767b9ab":"retrieveV(uint256)","5768bc4a":"_createArmy(string,string,uint256,uint256,uint256)","5768fca3":"paymentDestination()","57693e9a":"NBB()","576b8bba":"SeedMemberCanDraw()","576bc138":"NKCToken()","576c3de7":"getTier(uint16)","576c51bc":"countOfPublicKey()","576cecdc":"checkStubs(bytes32,bytes32,address)","576cfdd7":"window2EndTime()","576d067b":"StageOneDisable()","576d1ce1":"internalVerifyCert(bytes32,bytes32,address)","576d4e13":"_createLinglongCat(uint256,uint256,uint256,uint256,address)","576e6d4e":"_buyXaddr(address,uint256,bytes32)","576eac66":"setFundingGoal(uint256)","576f35e3":"setBatchSize(uint256)","576f7e31":"getApprovedBuyerMappingCount(address)","576f9cba":"isInDirectory(address)","577000a3":"onlyPartnersOrAdmin(address)","57712f37":"CappedBurnToken(uint256)","577131ac":"bankrupt(address[])","57717090":"transferWinnings(uint256,address)","5771d6e4":"readMessage(string)","57727a04":"ZZCoinToken()","5772ae70":"setLoanManager(address)","5773faf9":"modifyVariable(address,uint256,uint256,uint256,uint256)","5774ce4d":"sendBonus(address,address,uint256)","5775b57e":"totalBuyOrdersOf(address)","57764094":"getRate(uint256)","57771a23":"del(uint256)","5778472a":"getOrder(bytes32)","57786394":"feeMake()","57788716":"doKeccak256(uint256)","577890f6":"presaleFallBackCalled()","5778bec2":"Deal()","57796e1c":"setVote(uint256,uint256)","577a75a0":"CRAWDSALE_END_DAY()","577bd336":"progress()","577c78f1":"SitcomToken()","577ccfe0":"tokenFrozenUntilNotice()","577ec5ae":"cookieProductionMultiplier()","577ef53d":"SetA(uint256)","577f7133":"PHOENIX_CORSAIR()","57806705":"addpatient(uint256,uint256,string)","5781d9e7":"isRegisteredRetailer(address,address)","57820829":"UP_etherWin()","578242c3":"CompositeCoinCrowdsale(uint256)","57831809":"payoutCount()","57835720":"setSetupCompleted()","578436a7":"CoinDisplayNetwork()","57850fc7":"getPotentialAmount(address)","578551aa":"goods(uint32)","5785b3f9":"VIRALTOKEN()","57861e65":"VVDBCrowdsale(address,address)","5786a552":"registerEmployee(address)","5786cbdc":"sendBackSurplusEth()","5786f28c":"regionsIsPurchased(uint256)","5786fd40":"getProductsCount()","57875631":"setAccessPolicy(address,address)","578799b3":"QRTok()","57880042":"bulkPurchageEgg()","57880c04":"releaseForce(address,uint256[],uint256[])","57885380":"ChannelAudited(uint256)","5788a081":"ownerAddressMap(address)","57894c1b":"createClone(address)","57895ca2":"setManagerContract(address)","5789a722":"LocusToken()","5789b1cd":"transferAdminMessage(address,address)","5789baa5":"isUnlockedBoth(address)","578a791d":"setExchangeFeeRate(uint256)","578aa665":"_createToken(string,address,uint256)","578affb4":"Logger(string,bool)","578b08e2":"GPUxToken()","578b2dab":"euroTeams(uint256)","578b3a56":"normaliseCardIndices(uint256[])","578bbdc1":"isSaleContract(address)","578bcc20":"reduceDebt(address,address,uint256)","578bcf35":"distributed(address)","578bcfca":"AddedToHolder(address,uint256,uint8,uint256)","578c3485":"iWantToKillMyself()","578c6642":"BONUS_BATCH()","578cf4a9":"testTemp1()","578d52b6":"GetDidPayOut(bytes32)","578de482":"OCE()","578de8aa":"addressToAsciiString(address,address)","578e2f7d":"verifiPost(uint256,bool)","578e9825":"burnEscrow(uint256)","578ee866":"getCurrentTimeBonusRate()","578f9658":"shopTome()","578ff67a":"new_hash(bytes32)","57901b19":"genRandomArray(uint256,uint256,uint256)","57902a75":"rateTier2()","579078cf":"TestAnyChain()","5790de2c":"ProposalAdded(uint256,address,uint256,bool,string)","579140e8":"BITSEACoinERC20Token(uint256,string,string,uint256)","579140f4":"tokenInitialized()","57915897":"faucet(uint256)","57918052":"setPriceIncreasingRatio(uint16)","5792b512":"Bettereum()","5792e1de":"CheckCarToken()","5792e262":"registration_fee()","579327fd":"TOTAL_ETHER_HARD_CAP()","5793511f":"playersList()","57938b2a":"requestCancellationMinimumTime()","5793bfdc":"createSDC(address,address,uint256,uint256)","579424e7":"HOWLToken()","579425b7":"feeBurnerContract()","57945e3e":"anyAssetHasChanges()","57945ed1":"FindMyFish_EnterBarcode(bytes9)","57946897":"Test11()","57946a86":"SPEKToken()","57950697":"testState()","57955f3b":"ExampleIntervalTree()","579599bd":"canCreateEdition(uint256,uint8)","57978a75":"updateInviteInfo(address,uint8)","5797cd52":"Settle(uint32,uint32)","57987d38":"PSCN()","57988a55":"card_gold_first()","57989b4c":"IsCityNameExist(bytes32)","5798d5bc":"rSetA(address)","579952fc":"transferFromTo(address,address,uint256)","579b9499":"estimatePurchasePayment(uint256,uint256)","579badf6":"UniversalFunction(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)","579cd3ca":"conversionFee()","579cdf17":"getAdminName(address)","579d4f7a":"changeHouseFeePercent(uint256)","579d5fba":"debug_hash3Int(uint256)","579da090":"needUpdate()","579db769":"getIudex(address)","579e0b87":"assignAnotherOwner2(address)","579f0789":"BNN_ALLOCATION()","579f20d8":"submitProxyVote(bytes32[5],bytes)","579f61d8":"valueDelete(string)","579fc25e":"contractFallback(address,uint256,bytes)","579fe761":"vote(uint80,uint80)","579fea7d":"setDolRate(uint256)","57a0685b":"privateSaleMinEth()","57a15c4f":"createOffspring(address,string,uint256,uint256)","57a1a58e":"setCycleResetTime(uint256)","57a218e6":"WeSource(bytes32)","57a27a76":"checkCompletedCrowdsale()","57a2e60c":"VoiceCoin()","57a373a1":"uintInArray(uint256,uint256,int256,uint256[],uint256)","57a533e9":"logPromiseCreated(uint256,address,uint256,uint256)","57a756d3":"walletC()","57a83f25":"TKRToken()","57a858fc":"shares(uint256)","57a8c01f":"registerUser(address,uint256,uint256,uint256,uint256)","57a967ca":"waitingForClaimTokens()","57a96dd0":"proxyTransferWithReference(address,uint256,bytes32,string,address)","57a9838a":"Tronerium()","57aaafe2":"toggleArtworkVisibility(uint256)","57aaf08b":"getAlgosByCreator(address)","57abd75d":"_weiToMth(uint256)","57acc118":"setForward(address)","57ad693b":"MIN_UPDATE(bytes32,uint256)","57adc83a":"angelTime()","57aeb5c8":"convertToMiniCFT(uint256)","57aee888":"_eraseNodeHierarchy(uint256,bytes32[],bytes32)","57aeeb25":"becomeSquirrelmaster()","57af3eec":"STARTING_HIPSTER()","57afb890":"collectRemaining()","57b001f9":"unpause(address)","57b07cd9":"getReleaseHash(uint256)","57b16811":"totalsInfo()","57b34be7":"_moveStage()","57b394bf":"walletWithdrawal(address,uint256,uint256)","57b45386":"removeCode(string)","57b473e2":"okamiMinPurchase_()","57b543e2":"getOwnersLength()","57b69e72":"_kittenContract()","57b70510":"parseResult(bytes)","57b7247e":"UserWallet(address,address)","57b7a0b6":"Paye()","57b8e8c3":"devcon2Token()","57ba8652":"getRank02()","57babe2e":"collectedBcy()","57bbf921":"salesaccount()","57bcccb6":"revokePermanentApproval(address)","57bce8b0":"sendWei()","57bcfc09":"HomeChain()","57bd2a65":"allocated3Year()","57bd4f7b":"getTime1(address)","57bf04be":"changeOwnedOwnershipto(address)","57bf66d4":"accountForIncrease(uint256,uint256)","57bfab93":"getAllABaddress()","57c07055":"scheduleCall(address,address,bytes4,bytes32,uint256,uint8,uint256)","57c19b4f":"postFreezeDestination()","57c1a709":"travelUnitFee()","57c1f9e2":"removeDistributor(address)","57c1feca":"BonusChanged(uint256,uint256,uint8)","57c393fa":"transferSuperuser(address)","57c3b376":"updateRandContract(address)","57c3f997":"isReserved(address)","57c508d3":"IsThisExternal()","57c60982":"calcProfit(address)","57c67ad1":"RobotTradingIco()","57c6c642":"MultiTranser()","57c85787":"batchMint(address[],uint256[],uint128[])","57c8b724":"addPresetTransfer(address,uint256)","57ca94fa":"_addUser(address)","57cb2fc4":"getInt8()","57cb48c9":"issuerTokenName()","57cb4947":"mintRequest(address,uint256,uint256)","57cc2d52":"testStoresParentChallenge()","57cc5941":"getTileClaimerAndBlockValue(uint16)","57ccbe28":"isPreICOPrivateOpened()","57ccc80e":"putSmartContractOnSale(bool)","57cd23a6":"TeamLockingPeriod24Months()","57cd650d":"sealDataStream(address,address,uint256,bytes32,uint256,bytes32)","57cdd078":"isIcoInProgress()","57cdf799":"createContractItem(string,bytes32)","57ce0ec0":"MIN_PRE_ICO_SLOGN_COLLECTED()","57cea5c0":"weaponTokenIdToDamageForEncounter(uint256,uint256)","57cf9add":"showOwnerContract()","57cfd296":"getFurnace(address)","57cfeeee":"transfer(address,uint256,bytes32)","57cff409":"tpt()","57cff437":"getKunsByOwner(address)","57d0354b":"NothingToCancel(address)","57d083b5":"_evaluateSkill(address,uint8,uint256,uint256,uint256)","57d13917":"getCompany(uint256)","57d15c6a":"_time()","57d17805":"getTokensSold(uint256)","57d1c582":"TokenData(address,uint256,address)","57d25a0f":"retrieveAssets(address)","57d4021b":"nextPayoutWhenPyramidBalanceTotalsApproximately()","57d444fd":"detachController()","57d4617b":"getAllocatedTokenAddress(address,address,uint256)","57d4f398":"unfreezeBalance(address)","57d55116":"_safeApprove(address,uint256)","57d55367":"publishResult(uint32,string)","57d56267":"getModuleCount()","57d5927f":"LogOraclizeCall(uint256,bytes32,string,uint256)","57d5939c":"IsValidated(string)","57d61f3c":"TokensSold(address,uint256)","57d62a30":"accountFeeModifiers(address)","57d6f5f2":"canLogIn(address)","57d70c0b":"getIcoRuleList()","57d713d5":"getPendingUserCount()","57d775f8":"epochLength()","57d786da":"_checkPolicyEnabled(uint8)","57d93329":"endCrowdsalePhase3Date()","57d9fd41":"orderLastDate()","57da1fb2":"isMonsterChampionship()","57da9166":"Dodol()","57db8024":"adminDeposit(address)","57dbefdd":"addExcluded(address,address)","57dc2658":"setLastCrowdsale(address)","57dc561f":"assignTokenIJK(address,uint256)","57dc5d9d":"adminer()","57dc9760":"DaoChallenge()","57dd2f26":"AntriexToken(uint256,string,string)","57dd8366":"jackpotGuaranteed()","57ddf217":"gameoverGetYUM(uint256)","57de26a4":"read()","57df844b":"getTokenTotalSupply()","57e07140":"testTransferFromCorrectlyAllowsDelegationOfTokenOwnership()","57e0b222":"ERC20Store(address)","57e18886":"reserveTokens(address,uint256,uint256,uint256)","57e1fae2":"transferChild(address,address,uint256)","57e233e2":"hardcapUSD()","57e25a79":"PullPaymentCapable()","57e2880d":"scheduleTransaction(uint256,uint256)","57e49ca8":"safeTransferChild(address,address,uint256)","57e4e95d":"burnerChangeable()","57e53d4e":"currentStageETHContributions()","57e5be05":"current_mul()","57e5eea5":"getCurrentBonus()","57e60c27":"removeAccountReader(address)","57e6a64c":"AddrRewardPlan()","57e6a6af":"METS6()","57e6c2f4":"isAuthorized()","57e71cd7":"setPreIcoHardCap(uint256)","57e7afd0":"addIPFSFile(string,uint256,string,bytes32,uint256)","57e871e7":"blockNumber()","57e8f401":"getUserLandLimit(address)","57e984cf":"changeMonthlyRate(bytes32,uint256)","57ea563a":"tokensByLtcTx(string)","57ea89b6":"Withdraw()","57eabab4":"defaultMintingAddress()","57eaeddf":"_isContract()","57eb3431":"recordPresalePurchase(address,uint256)","57eb95a7":"trainSpecial(uint256,uint256,uint256[2])","57ebc286":"approve_fixed(address,uint256,uint256)","57ebc7a8":"logLargeContribution(address,address,uint256)","57ee24af":"getNum(bytes32,uint256)","57ef58c1":"canDefrostAdvisors()","57f011b6":"destTokensEarlyInvestors()","57f032e7":"changeAgent(address)","57f04d2b":"updateLedger(uint256,address[],address,uint256[],uint256[])","57f1935f":"refundTokens(address,address)","57f196fa":"lastBidID()","57f1f6ca":"rareStartPrice(uint256)","57f232e1":"buyFucks()","57f2c6b7":"withdrawOfferForCollectible(uint256,uint256,int256)","57f2d763":"LongTerm()","57f32591":"changePriceChangeName(uint256)","57f46cbe":"collect(uint256[])","57f47bf9":"sh_doAgree()","57f4d5ec":"processDividends(address,uint256)","57f5abe5":"setERC20TotalPromo(uint256,uint256)","57f6280e":"FundManager()","57f65e24":"setArray(bytes32,string[])","57f664ed":"TOKENS_ALLOCATED_TO_PROOF()","57f70b21":"WorldToken(uint256,string,uint8,string)","57f7b905":"balanceBonusOf(address)","57f86b6a":"theRiver()","57f91458":"sacredToken()","57f94c82":"airDropTokenIssuedTotal()","57fa7044":"_changeCycleValue(uint256,uint256)","57faa161":"TokenBonusGiven(address,uint256)","57fbac06":"setAllowTransferExternal(bool)","57fbb9df":"withdrawContractBalance(address)","57fc3991":"returnTokens(address,address,uint256)","57fc8a20":"custom(address,bytes)","57fc990f":"_createAuction(uint256,uint256,uint256,uint256,address)","57fdf2b2":"transferrableBalance(address,uint256)","57fe5a5f":"FREEREWARDPPOINT()","57ffd7cc":"createNewContract(uint256,address,address,address)","57ffd863":"deleteHiddenPosition(bytes32)","5800827c":"mintExtraTokens(int256,uint256)","580101c8":"startingSnailAmount()","580215fc":"transferFinal()","580225d5":"HomeBridge(uint256,address[])","58022de4":"recoverSigner(bytes32,bytes32,bytes32,uint8)","58022e3f":"AkbulutTokenICO()","5802c695":"setPendingValue(uint256,bool)","5802f02d":"SavingsAccount()","58047913":"getWrappedContract()","58056392":"setLockBalance(address)","58057468":"confirmTransferOwner()","58057d81":"transferDomainToBuyer(uint64)","58058304":"clearFund(uint256)","580588a1":"havedAirDrop()","58062e66":"VIRTVEN()","5806ba15":"InbotToken(string,string,uint8)","580709cb":"downTheDrainImmediate()","58074d8b":"keyIndex()","5807630f":"transferEthToOnwer()","5807703d":"getMainGasPrice(bytes)","580786cf":"getRoundOpen(uint256)","58078a5a":"_checkAndAdd(bytes32,bytes32)","58079e7b":"setStartOfPresale(uint256)","580822da":"CoinLordToken(address)","5808e1c2":"betOnNumber(uint256)","5808ee15":"setDefroster(address)","5809ea99":"hitPrice()","580b72e1":"approveTokens(address,uint256,uint256)","580bd977":"distributeFunds(uint8)","580bdf3c":"disableBetting_only_Dev()","580c0fd8":"COMIKETCOIN()","580c2ae9":"numberOfPurchasers()","580c5072":"IsPremature(uint256)","580cf318":"tokenRemainCap()","580e77d4":"startMainSale()","580ea491":"PatronageRegistry(address)","580efd6b":"totalWageredForAddress(address,address)","580f2427":"LeeSungCoin()","580f3904":"requestTokens(address)","581191f7":"DNATIXToken()","5812f78a":"A2UToken()","58144fbd":"covmanAddress()","58150c8b":"GameRegistry()","581515fd":"howManyEtherInWeiToBecomeOwner()","5815528c":"setInviterEdge(uint256)","581627bc":"ownerWithdrawl(uint256)","58163c23":"calcBonus(uint256,bool)","5816ba9d":"unFrozen(address)","58172da1":"payBankroll()","581732dc":"setLev1(uint256)","5817465c":"RidgeToken()","58178168":"punkIndexToAddress(uint256)","581847d6":"changeDeveloperSFTDestinationAddress(address)","58189259":"CerradoToken()","5819dde2":"getNumbersFromBytes(bytes3)","581a3aea":"ActiveSCO(bool,uint256)","581a81c1":"setMinHouse(uint256)","581aa8a3":"SRVSKCOIN()","581bdd23":"createCampaignAndChannels(address,uint256,string,address[],address[],address[],uint256[],address,string,bytes,uint32[])","581c1f47":"isFreeze(address,uint256)","581c281c":"getVotingStatus()","581c5ae6":"invest(address,uint8)","581c71d0":"ifClaimedNowPublic()","581ca8bb":"adjustCash(address,int160,string)","581d1015":"publicsalesTokenPriceInWei()","581d1d04":"devTokensIco3()","581d416a":"Paid(uint256)","581e69de":"pauseRoundD()","581f1125":"returnUnsoldSafeSmall()","581f3c50":"createAndOpen(address,address)","581fc2ad":"getNextReleaseTimeOf(address,address)","581ff6e2":"VerifyPublishedResults(uint16)","5820c9ae":"round4()","5820dce5":"abbuchen(uint256)","5821c831":"AcceleratorStart()","58226a76":"isInTime()","58229d91":"MasToken()","58240d5f":"listPrycto4()","582420bb":"calculateMatchPrice_(address[14],uint256[14],uint8[6],bytes,bytes,bytes,bytes,bytes,bytes)","582518ac":"updateclaimableTokens(address,uint16)","582527f8":"setNewData(uint256)","5825884f":"setOwner2(address)","5826344b":"frozenAccount()","582681d2":"compareDateTimesForContract(uint256,uint256)","582747ba":"PLCCToken()","58275869":"ETHReceived()","5827834a":"DecenturionToken(uint256)","5827b250":"completeInitialization()","5827c0c8":"SSE()","5828fa47":"ThawTokenTransfers(address,bool)","58292a3d":"emission(uint256)","58294575":"updateComplianceAddress(address)","5829d310":"entries(int256)","582a466a":"burnGasAndFree(address,uint256,address,address[],bytes)","582a5c83":"HWGCToken()","582ab0b4":"setup(uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","582b4019":"updateCheckHourly(bool)","582b6add":"isDataSourceCallback()","582b6fe4":"crowdsaleUncappedTime()","582bd287":"snapshotDelegators(uint256,address)","582ca57b":"get_associations()","582cca06":"SafeCoin()","582d14f8":"updateHpbNodeWithString(address,string,string)","582d2d32":"removeFreeRoom()","582d6033":"listDda(address,uint256,uint256)","582d9008":"willyWantTalkToken()","582ee26e":"PendingFees(address)","582f5009":"calculateBonusToken(uint256)","58306772":"getAmountOfEtherSell(uint256)","5830da9c":"Escrow(address,uint256,uint256,bool,address)","5830f2ea":"subPrivateSale(uint256)","58317685":"getBuy(uint256,address,address)","5831e95d":"_burn(address,address,uint256,bytes,bytes)","58339a40":"CryptoScalper()","58341922":"totalSupplyLocked()","5835ac93":"extract(uint256,uint256,uint256)","5836746d":"deployStep()","58371ccd":"endSaleTime()","5837bb11":"ALLOC_FOUNDER()","5837e083":"move_history(uint256)","58392aaa":"setSibling(address)","583ae991":"BitCharityToken()","583b4715":"createTitty(uint256,string,uint256,address,string)","583ba757":"getrestrictTime(address)","583be14e":"isCampaignRegistered(uint256)","583c4be9":"PurchaseUnlocked()","583d175f":"clientClaim(address,uint64)","583d5435":"queryTokensOf(address)","583dbacc":"specialKitties(uint256)","583dbc09":"updateBonuses(address,bool)","583ed080":"End7()","583f0ae6":"purchaseMembership(address,address)","583f18ff":"totalRemainingTokens()","583fe287":"ReussitexCoin()","584084d9":"_setString(bytes32,string)","5840b0f8":"getPixelData(uint256)","5840f4ec":"applyRate(uint256,uint256)","58410259":"onBuy(bytes32,uint256,address,uint256,uint256,address,uint256,uint256,address,address,uint256,uint256)","58413194":"lmda()","5841b9bf":"kingCost()","58428322":"grantAccessDeploy(address)","58439b9f":"EtheraffleLOTPromo(address,address)","5843b811":"_setPendingUpgradeabilityOwner(address)","58441a58":"minimumBid(string)","58451f97":"totalAccounts()","58453569":"initializeSpendLimit(uint256)","58453fef":"updateBalance(uint256,uint256)","5845d13c":"NamdoToken()","58462b36":"contBuy(address,uint256)","58463e11":"FeedBackedCall()","58469cd1":"generateStakeForDelegationSchemaHash(address,uint256,bytes32,bytes32,uint256[],bytes32,uint256)","58476a7a":"mintForSale(address,uint256)","58480d41":"setVotesPerProposal(uint256)","584855f0":"shopShoes()","58487bee":"request(uint8,address,bytes4,uint256,bytes32[])","5848a7fa":"getOwnerPotatoes(address)","58491ad9":"ICNQCrowdsale(uint256,uint256,uint256,address,uint256,address)","58491ecb":"companyPeriodsElapsed()","5849cf77":"registerDINWithResolver(address,address)","5849f66b":"claim_ico()","584af2c3":"approveOwnerTransfer(bytes32)","584df977":"LimitPerUserEBC()","584e492a":"arr(address,uint256)","584e86ad":"suggestUrl(bytes32,bytes32)","584ed064":"getBattleCardList(address)","5851166c":"endOfRound()","58516661":"agents()","5851bc4f":"FJH()","5851f1e2":"trexdevshop()","58525fda":"tokenAllocation()","5852f5c1":"buildingToUnits(uint256,uint256)","58541aba":"jackpotLastPayout()","58543fbd":"getRoomIdxByNameElseLargest(string)","5855279e":"whitelistAccounts(address[])","5855da3d":"extractAddress(bytes,uint256)","5856db43":"isIcoClosed()","585789cd":"startPreDistribution(uint256,uint256,address,address,address)","5857b86f":"getAuctionByAuctionId(uint64)","5858e7d0":"bigBearCoin()","5858ef10":"testErrorNonOwnerCantBreach()","58593578":"toss(bool)","585a8aba":"getCredit(address,address)","585a9385":"icoProceeding()","585ac3e8":"icoEnded()","585b0f05":"BitcoinMax()","585b143a":"getVariableReleasableAmount(address)","585b7752":"setOraclizeString(string,string,string,string)","585bc25b":"weiRaisedDuringRound(uint8)","585bc523":"cooAddManager(address)","585bf3e4":"totalLux()","585c6fc9":"EtherHealth()","585ce259":"VitToken()","585d2133":"newDeliverable(uint256)","585da351":"setUnitAttackMultiplier(address,address,uint256,uint256,bool)","585e1af6":"hard_cap()","585eb90c":"withDrawAmount(uint256)","585f9b7a":"addVoteOption(uint256,string)","58613568":"estimateNeumarkReward(uint256)","58619076":"OwnerRemoved(address)","58620daf":"RegistryAddress()","58623642":"minStartDelay()","5862fd31":"ethCrowdsale()","5863115e":"parseId(uint256)","586360ce":"distributedTokens()","5864c56c":"numberOfSuccessfulPings()","5865c60c":"getOperator(address)","58669d6d":"updateMinimal(uint256)","586a2d02":"Anastomos()","586a2d79":"_decreaseBalance(address,uint256)","586a4be5":"Bitsurge()","586a52e0":"GenerationSupply()","586a69fa":"getMaximumStackCheck()","586a94ba":"MassivelyMultiplayerOnlineGameToken()","586ab7a9":"MYSYMBOL()","586ac27d":"ProofOfPassiveDividends()","586b1c8f":"DetherCore()","586ccfa7":"deathData_f11()","586cf767":"MintedEthCappedCrowdsale(address,address,uint256,uint256,uint256,uint256)","586cf845":"setTierEndTime()","586dd1d5":"CCXTokenERC20()","586e416e":"updateMaxWei(uint256)","586e8283":"deliveredEth()","586facb4":"adminSetMarket(address,uint8,uint256)","586fc5b5":"lastMint()","58708479":"setWinningChance(uint256)","587097ab":"test_FiftySixPercent()","58712633":"GetCommission()","587181d1":"getVaultLock(address)","5872282d":"icoReferralBonusInPercentage()","5872fe45":"getAccountAddress(address)","5873533d":"playGame(uint256)","587378a4":"updateQualifiedPartnerCapAmount(address,uint256)","5873cbe6":"setFile(string,string,uint256,address)","587419d5":"depositStartTime()","58750784":"getUniqueKey(string,string,uint32)","5875caaf":"objectKnife()","587631eb":"PlayX5()","587695cd":"tokenGiveAway()","58769981":"transferAdminship1(address)","5876d2ef":"rwGas()","58793050":"Setup()","58793ad4":"submitHKGProposal(uint256,string)","5879f7ad":"myDroneList(address,uint256)","587ac47c":"sendFromAdvisorWallet(address,uint256)","587af98d":"GetConfirmRound(bytes32,uint8)","587b060e":"_setUpgradeContract(address,address)","587c2b8e":"setContributionDates(uint64,uint64)","587cde1e":"delegates(address)","587d6a20":"ICOactive()","587f2e50":"putInStud(uint256,uint256,uint256)","587fa8dc":"closeHouse()","587fae93":"release(uint8,address)","58802e24":"BancarCrowdsale()","5880b7da":"CAAction(address)","588100d4":"DIP_TGE()","588198c4":"getBonusByETH(uint256)","5882128d":"tradeActive()","588268a8":"tokensForCreators()","58838594":"anacoContract()","5884afe1":"setBetLimit(uint256,uint256)","5884f2f5":"GeneralUpdate(uint256,uint256,uint256)","5885c626":"allocateTokensToMany(address[],uint256[])","58864d04":"Clost(uint256,string,string,uint256)","588666e2":"updatePriceManualy(uint256)","5886c51e":"setnotice(string,string)","58883688":"setAvailableToken()","58888b40":"_calculateUnlockedTokens(uint256,uint256,uint256,uint8,uint256)","58892f63":"setCrowdsaleStartDate(uint256)","588a9db5":"CoreBuyShare(address,address,uint32,uint256,uint32,address,address)","588b1578":"contractEth()","588b5c7b":"approveExchange(address,address)","588bf28b":"addBonusForOneHolder(address,uint256)","588bf923":"removeEmailHash(uint256)","588c2a6d":"WithdrawReserve(address)","588cbbea":"changeSettings(uint64,uint8,uint8,uint8,uint8)","588cff4c":"emitPublicCapabilityRemoved(address,bytes4)","588d376f":"BoleroToken()","588d6a17":"findSemiRandomWinner(uint16)","588dadc6":"contestChampion(uint256)","588e6b83":"giveTurnToPlay(address)","588e730c":"numOfMythical()","588ec17f":"minContributionInUsdCents()","588ee29b":"debug()","588f27e6":"CloudCredit()","588f7e12":"lotteryRatio()","588f85b3":"IHPM()","588f9acc":"toggle(address)","58902cc6":"sendFromGftWallet(address,uint256)","5891215c":"getAllGas()","58919155":"DOGE()","5891c8aa":"removeExceptAddress(address,address)","58924b81":"getClaim(address,string)","589316f6":"level_2_amount()","58931f7a":"buyWhiteByName(bytes32)","58932f50":"btcTokenBoughtAddress()","58933dbc":"totalTokensRemind()","5893d481":"rndTmEth_(uint256,uint256)","58950108":"BucksCoin()","58958be3":"_getTxDataBlockNumber(address,bytes32)","58963c85":"setBilateral(bytes32,bool,bool)","5896521b":"getCurrentTotalFunders()","5896749a":"getAssetRate(address)","5896f37f":"getDistritos()","5897164a":"ADDR_MAYA_ORG()","589737fb":"getOwnPartnerMessage(uint256)","5897a1c6":"getValueToInvest()","5897a5a0":"setupInitialState()","5897e3e4":"splitTheBet(address)","5898f402":"compaundIntrest(uint256,bytes5,uint256,uint256)","58990372":"changeColorBlue()","589a1743":"creatorOf(uint256)","589b88bd":"pauseRoundC()","589c6beb":"_deleteDefender(uint32,uint8)","589d7a3c":"setupViaAuthority(string,string,string,string,address,uint8,bytes32,bytes32,uint256)","589dca45":"_emitEmission(bytes32,address,uint256)","589e5edd":"InvestorsQty()","589e74be":"giveSticker(address,uint256)","589f30c7":"FAPFundDeposit5()","589fd72a":"vehicleDates()","58a0bcdd":"checkPayout(address,uint32)","58a122a2":"cancelRequestUnpause()","58a191c3":"changeFactorySetupFee(uint256)","58a1cabf":"lastPayoutTime()","58a2982a":"_deleteSmallestBidder()","58a356d0":"sendMoney(uint32)","58a383fd":"jsonArrayLength(string,string)","58a3d1a1":"getUnclaimedTokenAmount(address,address)","58a4903f":"cards()","58a50ce8":"setEtherAddress(address)","58a53130":"getABaddress(uint256)","58a5b0f6":"tournamentStartTime()","58a687ec":"finalizeSale()","58a70a15":"acceptReturning(uint256)","58a74333":"singularDTVFund()","58a79319":"GetWildCardOwner(uint256)","58a87b69":"withdrawTokenFromCrowdsale(address)","58aa0f1b":"numOfRare()","58aabdf8":"MaxMinersXblock()","58aaf48a":"gasForShuffle()","58ab010d":"buyParticipationTokens(uint256)","58aba00f":"updateManager(address)","58acf31b":"findJob(uint256)","58ad4673":"LEXTokensContract()","58ae6242":"AOIS()","58ae8bcf":"voteInMasterKey(address)","58af7794":"create_payment(uint256,uint256,bytes32,bytes32,uint256,address,bytes32)","58b092d7":"addRaiseTapProposal(string,uint256)","58b0a2aa":"setPriorityPassContract(address)","58b1effb":"bidOfBidder(address,uint256)","58b1f29c":"refundBounty(uint256)","58b255ea":"fechVoteNumForCandidate(address)","58b435fb":"MeritICO()","58b4370b":"round(int256)","58b4a3c4":"testInitalBalance()","58b4c035":"createNewGoBoard(uint256)","58b5525d":"depositCharge()","58b5e775":"batchAllocateExp(address[],uint256[],uint256[])","58b8dc61":"promoCreationPlayerCount()","58b92d57":"UserAuthorized(address,address)","58b9dcef":"registerVotingPrepareFailure()","58bad3eb":"setEarlyParticipantWhitelist(address,bool)","58bafdbc":"contribute(address,uint256,uint256,bytes)","58bb7d70":"checkEthSold()","58bc3456":"addtokensWL(address,uint256,uint256)","58bcdb5e":"collectCredits(address)","58be0830":"_refSystem(address)","58be98dd":"migrateBlockjack()","58beec9f":"summBounty()","58bf7067":"setBlockedAccount(address,bool)","58c0bde0":"feeNewThread()","58c1c328":"_validateId(bytes32)","58c23767":"setCXLExchangeRate(uint256)","58c264f6":"preico_holdersAmountInvestWithBonus()","58c31603":"loanCollectionNotification(uint256)","58c3b0eb":"updateTokensApproved()","58c3b870":"memo()","58c3c193":"newBatch(bytes32)","58c56f1e":"C20Token()","58c60d5e":"gracePeriodCap()","58c62b12":"SingularDTVWorkshopFee()","58c6bce8":"getCustomBuyerForIndex(address,uint256)","58c6f08b":"takeTokensBack()","58c721ce":"majorEvents(uint256)","58c75136":"currentPremiumSale()","58c757ba":"associateWithSig(bytes32,bytes32,address,uint256,uint256,bytes32,bytes32,uint8)","58c8c0a7":"getVoteNumberList()","58c8ca0c":"_clearInventory(uint256)","58c9e484":"buyPoints(uint256)","58ca5419":"CheckBest(uint256,address)","58cb7323":"MainnetETCSurvey()","58cc13f3":"asserts(bool)","58cda0ab":"requestData(address,address,uint256)","58cdddf9":"getRoundDifficultyBlock(uint32)","58ce4b48":"setFundingStartTime(uint256,uint256)","58cea888":"getWinOutcome(bytes16)","58cf7c71":"unfreezePrice()","58cf9570":"transferFeeRate(address)","58d0390b":"getCurrentICORoundInfo()","58d10aae":"BlackJack()","58d162da":"potSplit_()","58d168b7":"generatePermutationKey(uint8[4])","58d1aebd":"claim(string,string,string,bytes32,bytes)","58d213ae":"InToken()","58d25b93":"LogSendFunds(address,uint8,uint256)","58d2ab45":"numberOfPixels()","58d37dc5":"lastMintingAmount()","58d38231":"broughtSprites(uint256)","58d3b2c8":"babyBornEndVoting(string,uint256)","58d3b617":"Notifier(string)","58d3ce8a":"thirdExchangeRate()","58d40f7e":"existsUserByEmail(bytes32)","58d4e051":"YSS(uint256,string,string,uint8,address)","58d63255":"GandhiJi()","58d6a99e":"CTChinaCoin()","58d75180":"ECToken()","58d782be":"getLotteryDetails(uint16)","58d7bf80":"reserveRate()","58d80a8c":"doSetSettings(uint64,uint64,uint256)","58d8652e":"addIssue(string)","58d8f76f":"getPlayerBet(uint256,uint256,address)","58d90108":"COLOR_RED()","58d9e758":"DeleteUserByID(uint32)","58d9f95d":"VIETNAMTOKENTEST()","58d9fa04":"addUser(uint256,address)","58da3ca9":"jdecompose(uint256,uint256,uint256)","58da9bbc":"getAssetPackData(uint256)","58db3258":"removeFromPrivateWhitelist(address)","58dc03f9":"TigerCashToken()","58dc2a8b":"RESEARCH_AND_DEVELOPMENT_WALLET()","58dd0eb1":"propose(address,string,string,string,string,uint256,uint256,uint256,uint256)","58dd6f23":"setTokenTransfer(bool)","58df0383":"burnFinish()","58df8ed8":"adminGetEnabled()","58dfb058":"LNCH()","58e039bd":"listContractByModTextAndCttName(string,string,uint256,uint256)","58e0a9d7":"YanToken()","58e1c174":"RTI()","58e29e17":"initiateProof()","58e2cd76":"watch(address)","58e3815c":"BASalesPrice()","58e3e914":"devuelveNombreApp(address)","58e46275":"calculateTheEndPrice(uint256)","58e55365":"marketingBalance()","58e59c32":"get_entry(uint256,uint256,uint256)","58e5d5a5":"PunkBought(uint256,uint256,address,address)","58e61e12":"contribute(uint256[],bool,uint256)","58e66522":"CoolTourToken()","58e69c5a":"hashimoto(bytes32,bytes8,uint256,uint256[],uint256[],uint256,uint256)","58e71b15":"Organization()","58e756b6":"NewQ(string,bytes32)","58e77a92":"setSelfPretorian(address,address,address)","58e85e03":"LogTokensBought(address,uint256)","58e868c9":"DisableMember(address)","58e879f3":"nextThaw()","58e8922b":"payImportTax(address,uint256)","58e92fb0":"setFreezeForPEInvestors(uint256,address,uint256)","58e9a706":"checkLargeContributionsLock(address,address,uint256)","58e9b208":"Controlled()","58ea80e5":"setThroneCreationPrice(uint256)","58eae004":"awardBuyers()","58eafc37":"addVirusDefence(uint256)","58ebde43":"generic_holder()","58ec63bc":"setAccountMilestone(address,uint8)","58ecaa45":"StgThreebonusEnds()","58ed766d":"priceETHUSD()","58eda67a":"get_Holders(uint256)","58edaa9c":"getController(uint256)","58edbc84":"mkDelegation(bytes32,bytes32,uint256)","58ef82a0":"setMilFold(address)","58efa06f":"bytesToBytes5(bytes)","58efe3cd":"changeLink(bytes,address)","58f0cbc7":"changeTiming(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","58f10528":"eggExists(uint256)","58f11566":"ReserveAccount()","58f1490f":"addTransaction(address,uint256,bytes,bytes,uint256)","58f24f3d":"transferFromGate()","58f33e98":"isTaker(address)","58f35f10":"createT513(uint256,address)","58f3a115":"tokenDistribution(address[])","58f3da21":"adminGetContractBalance()","58f4be1e":"getIntention(uint256)","58f4f160":"Halo3D()","58f5382e":"challenge(string)","58f65330":"_checkPixelUnderLeft(uint256)","58f693de":"tokenForSP()","58f7f6d2":"BNB()","58f816bf":"redeployProduct(bytes32)","58f8e99e":"Jackypot()","58f94f13":"CarParkCoin()","58fa67f9":"calculateMintTotal(uint256,uint256,int256)","58fa812b":"TRANSFERS_PER_TRANSACTION()","58fb9f36":"_addBonus(uint256)","58fc0151":"getRequired(address,uint256,bool,uint256)","58fd6aec":"register(bytes32,string,string)","58fd6fe2":"getBonusMultiplier(uint256)","58fd955c":"rateETHUSD()","58fd989b":"getLockedStructPulseLockHash(address,address,uint256)","58fe54a1":"GetBoilerInfo(address,uint256)","58fe8847":"BIRC()","58feb4a3":"earlyCommunityAddress()","58ff7613":"RxEALSaleContractExtended()","5900477a":"settleCancel(bytes,bytes)","5900a09c":"addFunder(address,address,uint256,uint256)","59011400":"RewardDAO(address,address,address)","59015ed5":"getAccountModifiers()","59016c79":"getContent()","59032232":"setPatch(uint256,uint8,uint8)","59032614":"FipsTransfer(bytes20,address,address)","5903eff2":"root_10(uint256)","5903f01b":"giveEthBankRollAddress()","5904941b":"CoinealToken()","590528a9":"sellShares(uint256,uint8,uint256,uint256)","590589fd":"WithdrawToMember(address,uint256)","5905b171":"getNextAssignedRequest(uint256)","5905d314":"Added(bytes32)","5905e1c5":"askPrice(address)","590731b7":"secondarySaleCut()","590791f2":"getOwnerBalance()","59084ea9":"setWhitelistedWallet(address,bool)","5908984b":"foreignPurchase(address,uint256)","59092c29":"XtremCoin()","5909e897":"buyRate(uint256,uint256)","590a1c78":"LogBidFailed(address,uint256,uint256)","590a4595":"createNewChain(bytes)","590ba734":"getUint(int256)","590d431a":"wavesId()","590d5a67":"multipleTokenDistribute(uint256)","590daaec":"setTokenDeskProxy(address)","590def78":"IndonesiaRupiah()","590e1ae3":"refund()","590efa59":"setContrAddr(address,address)","590efee1":"isExec()","590f9ece":"getShow(uint256)","590fcc5b":"debugVal2()","591016bc":"generateId(bytes32,address)","591090ee":"ELIXAddressSet()","5910a18b":"addEntry(bytes32)","5910ce39":"_mint(string,string,uint8,uint256,bool,uint256)","591108a5":"setIcoStart(uint256)","59111d83":"add32(uint32,uint32)","59112e79":"payCow()","59117bae":"getRoomID(uint256)","59118221":"setTokenData(uint256,bytes32[])","59118ff2":"amount4()","5911fb9a":"setRate(address,address,uint256)","59125397":"indexedDocs(uint256)","59137533":"PillowCoin()","5913cacc":"unlockBonusDrop(address,uint256)","59144baa":"setFundContract(address)","591451fe":"setHostingProfitAddress(address)","5914589c":"RLC()","59151701":"VerifiedUser(bytes32,address)","591552da":"currentFee(address)","5915589e":"Dataset(address,string,uint256,string)","59161e57":"releseToken(address)","59167b9d":"setTokenContract(uint256,address,uint8[],bytes32[],bytes32[])","59167fcc":"getUserAccountInfo()","59169d06":"setBountyTokensPercent(uint256)","5916c2c9":"NeuroWire()","59179dbd":"createSaleAuction(uint256,uint256,uint256,uint256,uint256,uint256)","59187cec":"getEarningAmount()","5918bc7f":"addTerms(string,string)","5918f00c":"fillOrder(address,address,uint256,address,uint256)","5918f348":"hmcAddress()","59193981":"token_sale_end_block()","59194d0c":"totalEthBalance()","59197f51":"ethEt4Rate()","59198827":"initiateDocumentVote(string,bytes32)","5919896f":"Taracoin()","5919978b":"create_safe(address,string,string)","591a0d87":"foundersWallet2()","591a6ec4":"toBeDistributedFree()","591a89b2":"Voted(address,bool,uint256)","591b05b1":"domainHtml(bytes32)","591b41c6":"Multisend()","591beea8":"guardIntervalFinished()","591c515f":"append(string,string)","591d5236":"getDifference(int256,int256)","591d8bd0":"constantFn(uint256)","591ead36":"SplitTransfer(address,uint256,uint256)","591f36a6":"updatePreICOMaxTokenSupply(uint256)","5920375c":"thaw()","59208b8a":"userRefundWithoutGuaranteeEther()","59214765":"sendBonus(address,uint256)","5922b831":"refundPlayers(uint256)","592311ed":"freeze(address,address,bool)","592341df":"whatsMyJuryNumber(uint256,address)","5923c7f9":"maxSaleToken()","59242d11":"SmartIndustrialToken()","59245ff3":"fundAnswerBounty(bytes32)","59249c46":"duper()","5924f811":"tier2Reached()","592572e2":"getLoanCanceledAmount(bytes32)","5925cfe3":"getCCH_edit_7()","5926651d":"addBeneficiary(address)","592685d5":"getWindowStart(address,address)","5926b55a":"setArray(bytes1[],bytes8[],bytes32[],int256[],uint256[],bool[])","5926c826":"Mitronex()","5926cf13":"setGameId(uint256)","59275c84":"minerAddress()","59276653":"getTicketCount(address,string)","59287ce9":"setPbulicOfferingPrice(uint256,uint256)","5928aedc":"setEndStage2(uint256)","5928bdc4":"LatiumLocker()","5928c7db":"changeDividendWallet(address)","5928e80c":"updateNoteTitle(uint64,bytes12)","59291e2f":"MinedBlocks()","59292ef3":"gasLimitDepositRelay()","59296490":"CharityCommonweal(uint256,string,uint8,string)","59296e7b":"getCredit()","5929b837":"_setRate()","592a5f9b":"ValidToken()","592a97de":"encodeUInt(uint8,uint256)","592af188":"GaonToken()","592b5d17":"haltFX()","592b700a":"updateRegistrar(address)","592b71ab":"isRequestingEscapeTo(uint32,int256,uint32)","592bd705":"setowner(address)","592c0f09":"onLotteryFinalized(uint32)","592c518f":"ADDR_TKG_CHARITY()","592d4c7e":"CAD_Omnidollar()","592dc0a6":"setAyantDroitEconomique_Compte_2(uint256)","592e6f59":"initialise()","592ea64f":"LLV_v30_12()","592eef5a":"postIdToDonationAmount(address,uint256)","592efdab":"presaleWhitelistTokensLimit()","59301cb2":"_callRecipient(bytes32,address,address,address,uint256,bytes,bytes,bool)","5930a295":"changeBetLimits(uint256,uint256)","5931228b":"endTimeDay()","59317ea2":"buyImplementation(address,uint64,uint256,uint8,bytes32,bytes32)","59318b2c":"unFrozenBalanceByIndex(uint256)","59328401":"getPlayerInfo(address)","5932c02c":"tradesCount()","59330b8e":"hashDetails(uint256,address,uint256,uint8)","59355736":"lockedBalanceOf(address)","59357045":"getDueTime(uint256)","5935fba5":"addContractor(address,uint256)","5936259c":"BullsFarmer()","59362835":"JPCoin()","5936387c":"checkOpposited(uint256,bool)","59366245":"bonusInPhase5()","5936812b":"changeLockedBalanceManually(address,uint256)","5937de14":"STATUS_DEAL_RELEASE()","5937e534":"appealSkip()","5937e86a":"setTokensQuantity(uint256[],uint248[])","5938748e":"changeVotingRules(address,address,uint256,uint256,uint256)","59388d78":"decreaseApprovalPreSignedHashing(address,address,uint256,uint256,uint256)","59391a67":"earlyResolve(bytes32,uint256,bytes)","5939a84e":"isLawyer(address)","5939dd31":"setEthartRevenueReward(uint256)","5939ee04":"registrationPeriod()","593a5bff":"KUISToken()","593a6297":"getPlayerLaff(uint256)","593aa283":"setMetadata(uint256,string)","593af09f":"assertEq20(bytes20,bytes20)","593af4f1":"_fYou(address,uint256,string,string)","593af56a":"editionType(uint256)","593b4530":"proxyMergeMint(uint256,bytes32,address[])","593b79fe":"toBytes(address)","593be1f8":"_removeAuctionManager(address)","593c993c":"presaleWeiContributed()","593cca56":"checkExplore(uint256,uint256)","593d280d":"KToken()","593ea3e7":"VERDICT()","593efdf1":"setCurrentPassportLogic(string)","593f3a6c":"AllMarkingsProcessed(address,uint256,uint256,uint256)","5940f55c":"setEncryptionPublicKey(string)","594151e0":"Dice()","5941bb80":"transferFromBatch(address[],uint256[])","5941d8d4":"RtbSettlementContract(address,address,address,uint256)","5941ff52":"impl_yield7Day()","59423a7f":"BuySnail(address)","59424b78":"approveArtist(address)","594337a9":"investorsLength()","5944427b":"getRequestResult(uint256)","5944b7d9":"setCCH_edit_1(string)","594548d5":"newStakesAllowed()","5945793d":"getCorrectedTotalBPOfAddress(address,address)","5945841b":"ELIXAddress()","5945bdc5":"token2GT()","59462295":"WhiteWallToken()","5946e7eb":"Tier_Rainmaker_Registration()","594733c6":"getInvestorId(address,address)","594742da":"forecastOfToken(uint256)","59475891":"TransferHash(bytes32,bytes32,uint256)","59478411":"modifyProductPrice(bytes32,uint256,uint256)","5947cc6a":"level_2_percent()","5947d616":"updateAskingPrice(uint256,string)","59485790":"_emitPricesUpdated(uint256,uint256)","5948f733":"getAddressArray(bytes32)","5949a8f7":"notifyDeposit(uint256)","5949e525":"fundingUnlockFractionInvert()","594aa668":"getCourseList(string)","594afcff":"tgrContributedAmount()","594b18b5":"_transferToLock(address,uint256,string)","594bbe8f":"Corolexcoin()","594de857":"getDealsCount()","594eda64":"getBackend()","594ffb4e":"setReferralFee(uint8)","5950cb8c":"setCasinoName(uint16,string,string)","5950cee4":"checkProviderSupported(address,address)","5950d395":"recallPercent()","5951317a":"doFinalizeSale()","59514593":"addFreezableAddresses(address[])","595210ad":"openDispute(string)","5953c806":"setSendCost(uint256)","5954c8c5":"manualWithdrawEther()","5954ee54":"actualPriceInCents()","595539cd":"modexp_naive(bytes,uint256,bytes)","5956b853":"soldAddresses(address)","5957eb17":"PeterToken()","5957ee49":"getProjectUsedTokens()","5958188d":"MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress(address[],uint256,uint256,address)","5958611e":"finishTime()","5958621e":"setRewardWallet(address)","595882b3":"mintAll()","5958978c":"day_blocks()","595a161b":"amountOfZeros(uint256,uint256)","595a30f1":"RateChanged(uint256)","595a4fc2":"recomputeAccountLastAverageBalance(address)","595a69e8":"add_address(address,address)","595a7273":"QbaseIssued()","595aed65":"_getChild(address,uint256,address,uint256)","595b1a3e":"getUsersLength()","595b35d1":"NUMBER_OF_COUNTRIES()","595c3f61":"FactomTalk()","595cb7a3":"changePrice(address,bytes32,uint256)","595d0392":"transferHoldFrom(address,address,uint256)","595d71a5":"MintFinished(uint256)","595da94d":"has_owners(uint256)","595dcb68":"BIFAToken()","595e1e20":"placeToken()","595e615f":"betPool(address)","595ecbb3":"Int256(uint256)","595ee7a4":"MajListVal()","595f0e5e":"test_CuratorRules()","595f40d6":"getDevelopersFee()","5960b74f":"advisorTimelock()","59622aa6":"maxAmountForSalePromotion()","5962581e":"isInRoundOneState()","59626877":"AiToken(uint256)","59627b84":"getReduce(uint256,uint256)","5962a941":"totalPurchases()","5962ad30":"dkSB(string)","59647984":"isValid(address,uint256)","5965e7c3":"SimpleCrowdsaleBase(address)","59667c24":"withdrawRound(uint256)","59679b0f":"_implementation()","5967dee8":"transferLOT()","5968c2a4":"getOrderTokenAllocationStatus(uint256)","596925d6":"expByTable(uint8)","596939f5":"addAgent(address,uint256)","5969549e":"modifyBeneficiary(bytes32,address)","59695754":"setMinimumPayout(uint256)","5969c0e1":"resetSignature(bytes32)","596a072c":"setOraGasLimit(uint32)","596a2735":"DICE_RANGE()","596aadaf":"transferFromCrowdsaleToUserAdoptionPool()","596b975a":"maxFunding()","596bda14":"_set9()","596c02fb":"assertEq22(bytes22,bytes22,bytes32)","596c0531":"bch()","596c49bd":"TimeControlled()","596c8976":"close(uint256,uint256)","596d6f08":"Blizzard(uint256,string,string)","596ea3db":"allowTransferTime()","596f3473":"applyToBeAReviewer()","596fab6c":"calculateLockAmount(uint256)","59704013":"setVar(string,string)","5970c40a":"addForecast(bytes32,uint256,uint8)","59716eed":"lockedEthBalanceOf(address)","59724977":"getwin011050(address,uint256)","59727e83":"registryTransfer(address,address,bytes32,uint256)","5972e062":"deleteNodeGroup(uint256,uint16)","5973016b":"Multiven()","59748c98":"plain()","5974ec50":"founderTokenUnlockPhase3()","59756526":"getJobHash(bytes16,address,address,uint256,uint256)","59758ebe":"repayLoan(address,uint256,string)","5975ce80":"mintApproveReset(address,address)","59761fcb":"test(address[5],uint256[5])","59764714":"MyDFSToken()","59769073":"totalBalancingTokens()","5976ddd0":"getScenarioNamesAndEventStatus(bytes32)","59770438":"getToken(address)","59780224":"joinGameWithInviterIDForAddress(uint256,address,address)","59790701":"updateFeeSchedule(uint256,uint256,uint256)","59793b3a":"derivativeTokens(uint256)","597c255f":"receiveChild(address,uint256,address,uint256)","597c69cc":"saveToColdWallet(uint256)","597cae8d":"getFeeWindowBurnAmountValue()","597d4601":"crowdsaleFinalized()","597d5c6e":"BiSaiToken(address,uint256)","597d6640":"getFreeFairy()","597df768":"buyPixelBlocks(uint256[],uint256[],uint256[],bytes32[])","597dfbaf":"confirmNode(uint256)","597e1fb5":"closed()","597ea5cc":"getUint8FromByte32(int8,bytes32,uint8)","597efd85":"UblastiToken(uint256,string,string)","597f7c35":"transferTechSupport(address,address)","597fef79":"funderBalance_()","59802e15":"makeBonus(address[],uint256[])","598052a3":"winPooling()","598077b9":"ownerPart()","5980d0d7":"_crowdSaleSupply()","5980e72d":"getSeedPercentageForGameId(uint256)","59810024":"VICETOKEN_ICO_IS_A_SCAM()","59813a0e":"allowToken(address,address,uint256,bool)","5981f187":"bookingBalanceOf(address,address)","5982688f":"revenueShareList(address)","59828c99":"FLIPPINESSROUNDBONUS()","5982a30f":"setFriendsFingersRateForCrowdsale(address,uint256)","5982a6bb":"DiipCoin()","59830bf4":"LogBidCompleted(bytes32,bytes32,bytes32)","5983ae4e":"hasher(address,bytes32,uint256)","59841fe9":"newRun(bytes32,address,string)","59849d30":"maxCreatorWithdraw()","5984d7ad":"buyHeart(address)","59852686":"transferEth()","5985ac40":"affiliateNetwork()","598647f8":"bid(uint256,uint256)","59869576":"TestERC20Token(string,string,uint8)","5986ce23":"setdteamVaultAddr1(address)","5986dbe4":"ccUserCount()","5987e370":"canJoin(uint256)","5987f859":"setInputs(string,string,string)","5988899c":"estimateDaiSaleProceeds(uint256)","59890fd2":"mod_product(uint256,uint256,string,string,string,string,string)","5989c283":"createChannelERC20(address,uint192)","598aa1fc":"checkEndorsement(address,uint256,address)","598ab2c9":"supplyRest()","598abc9c":"getListTeam(uint256)","598ac8f2":"permille(uint256)","598adef6":"addDepositor()","598af9e7":"allowance(address,address,uint256)","598b771d":"IOVContract()","598d34b7":"distributeBTR(address[])","598d772a":"changeEtherVault(address)","598db132":"setProviderIsForRent(uint256,bool)","598e3183":"newToken(string,string,uint256,address,uint256)","598e728a":"TIXIToken()","598e9eeb":"transferir(uint256,address)","598f512b":"Token(uint256,string,uint8,string,bool)","598f6dec":"reserveTimeLock()","5990e665":"NetworkSocietyToken()","59912df1":"totalTokensDestroyed()","59915fd3":"CheckRefundIsFair()","5991c0dd":"TSTEST3()","5991faf5":"contributors_countdownDate(address)","59923274":"sendFromBountyWallet(address,uint256)","59927044":"teamWallet()","5992f2a1":"_createVoter(string)","599312ec":"rescueCatHashCheck(bytes32)","599362d0":"_setBackgroundValue15(uint256)","59939e21":"getApprove(uint8)","599466fe":"abortCrowdfund()","5994d984":"TRUE()","59953744":"createVestingContract()","5996228e":"upgradeResistance(uint256)","599651f3":"setStartAuctionFee(uint256)","5996769e":"_getDefaultOperators(bool)","59970a08":"OneKeyToken(uint256,string,uint8,string)","59974e38":"distributeRewards(uint256)","5997ed4c":"DevFee()","59988dce":"newQuestioner(address)","5998e641":"getStrategyTokenByIndex(uint256,uint256)","5999917c":"get_cross_chain_nonce()","5999d385":"walletICO()","599b3e21":"buytokens2()","599b6808":"balanceList(uint256)","599c8761":"decodeParamsList(uint256)","599db6bd":"unsowed(address)","599dc6be":"setItemStoppedStatus(bool)","599efa6b":"refundEscrow(address,uint256)","59a02589":"ico_PRICE()","59a02652":"miningWarContractAddress()","59a0b995":"AiraEtherFunds(address,string,string)","59a0e583":"lastBlock_v9()","59a131e2":"CrankysLottery()","59a23200":"authorizeTransaction(uint256,address)","59a29c6f":"no_of_tokens()","59a2c86f":"requestPayout(uint256,address,address)","59a3e577":"createClaim(address[],uint256,address)","59a4669f":"increaseJackpot(string)","59a536b0":"presaleWei()","59a547b0":"recordCommission(uint256)","59a58647":"setMaxCards(uint256)","59a591be":"setCrowdsaleTimes(uint256,uint256,uint256)","59a5f12d":"player2()","59a69426":"setStatuses(address)","59a765f9":"sendInvoice(string,string,string,string)","59a78c1a":"deathData_v8()","59a7b3fe":"hourlyRate()","59a7f754":"acquireWildcard(uint16)","59a80f0f":"setCurs(uint256)","59a83074":"set_participant_num_of_pro_rata_tokens_alloted(address,uint256)","59a87bc1":"buy(uint256,uint256,address)","59a8b6a3":"OptaToken()","59a941a6":"setApp(string,string,string,uint256)","59a9a63f":"isVulnerable(uint64,int8)","59a9a980":"isCosd(string)","59aa80b8":"getTransfer(string,uint256)","59aaa456":"tryAltOracles(bytes32,uint256,uint256,uint256,bytes32,bytes32,uint8)","59aaaf86":"changeBlocPerEth(uint256)","59ab0306":"BuyTickets(uint256)","59ab0dd1":"JACKPOT_TOKENS_PERCENT()","59ac5b32":"createProject2()","59ac5c6d":"_shift(uint8)","59ac70ae":"totalTimeRange()","59acb42c":"createdAtBlock()","59acbcb1":"crownTransfer(address,uint256)","59adb2df":"returnUint256(uint256)","59adda9b":"checkOwnerFailedToSetTimeOnMeeting()","59ae2073":"GameNeedsTick(uint256,address,uint256)","59ae340e":"resumeMinting()","59ae6e34":"placeImage(uint8,uint8,uint8,uint8,string,string,string)","59aef196":"pauseCutoffTime()","59af143d":"beBanker()","59b09b25":"makeCount()","59b0a174":"transferLockUntil(address)","59b0d931":"removeBlockList(address)","59b112d8":"getServicesForApplication(address)","59b119dc":"ComeCoin()","59b11d6c":"setBetclose(bool)","59b17b43":"getTellerBalance(address)","59b25720":"fillUpTo(address[5][],uint256[6][],uint256,bool,uint8[],bytes32[],bytes32[])","59b2da20":"Raffled(uint256,address,uint256)","59b350fb":"time_of_token_swap_start()","59b36e3e":"partnerSaleWei(address)","59b373f2":"getExistsStatus(uint256)","59b4993c":"userAddressCheck(bytes32)","59b4ee89":"addVpf(bytes32,uint256,uint256,uint256,string,uint256,uint256[])","59b51bd1":"approveCertification()","59b563b5":"addRobot(address)","59b56a59":"HYIPToken(address,string,string,uint256,uint256)","59b58dba":"createCloneToken(address,uint256,string,string)","59b62658":"AddFishByToken(address,uint256)","59b6a0c9":"maxCapacity()","59b6f377":"transferFromContract(address,uint256,uint256)","59b79610":"sendUnsoldTDETokensToPlatform()","59b8d74e":"ACasadiAmiciToken()","59b910d6":"setStorageAddress(address)","59b9510a":"isAddressAllowedInPresale(address)","59b95f5a":"buyBlocks(uint8,uint8,uint8,uint8)","59b9a192":"buildToken(uint192,uint192,uint160,uint32)","59ba1dd5":"_fulfillPreapprovedPayment(address,address,uint256,address)","59ba2628":"transferCampaignCreator(address)","59ba59f1":"ETHFundDeposit()","59badbec":"CheckPhException(bytes32,uint32)","59baef40":"setNewController(address)","59bb6b5f":"TretanToken()","59bb7867":"setTournamentEntranceFeeCut(uint256)","59bc3d47":"Agreement()","59be5e45":"getTotalSoldTokens()","59be7e99":"getDonationAmount()","59be9cc0":"devTokensHolder()","59bed9ab":"Transacted(address,address,bytes32,address,uint256,bytes)","59befd58":"releaseTime2()","59bf1abe":"getBlackListStatus(address)","59bf5d39":"getReserve()","59bf77df":"confirmationCount(bytes32)","59bfd388":"setupPeriodForSecondStep(uint256,uint256)","59c13403":"FEE_MIN()","59c140be":"insertBonus(uint8,uint256,uint256)","59c14cf1":"mastery(address)","59c21fd8":"initDepth()","59c27917":"GenChipLevel_Extra(uint256,uint256,uint256)","59c281da":"openFirstRound(uint256,bytes32)","59c2aad0":"unitsToSell()","59c2af55":"StagedCrowdsale()","59c2b584":"reserve_fund()","59c2edee":"CrowdsaleContribution(address,uint256,uint256)","59c33f94":"PriceUpdate(uint256,address)","59c39094":"withdrawDate()","59c3f3e0":"setPoolContract(address)","59c3f7f0":"createWallets(uint256)","59c42f75":"unreleasedCount()","59c44539":"GotecoinToken()","59c4e612":"icoSoftcap()","59c55429":"refundBond(uint256)","59c634b0":"getContributorAmount()","59c656df":"allowRefunds()","59c77133":"createNewHodl(uint256)","59c7a893":"participantsOf(uint32)","59c87d70":"request(bytes32)","59c88347":"isEmitting()","59c8969e":"withdraw(address,uint256,bytes32[],uint256[],bytes32[],uint256)","59c8bf9c":"OrpheusMarinaBangkok()","59c8d647":"buy(bytes32,bytes32)","59cbf125":"GetETH(address,uint256)","59cc334a":"getItem(uint256,uint256)","59cc721c":"BONUS_TIER1()","59ce0a8f":"RuletkaIo()","59ce0bb8":"_saveParams(uint256[])","59ceb36f":"last_demurrageable_balance()","59cf3173":"Reclaim(uint256)","59cf901a":"preIcoTokensDistributed()","59cfaf6e":"gameWithdraw(uint256)","59d1d43c":"text(bytes32,string)","59d20b55":"committedValidators(uint256)","59d213fe":"contributePreSale()","59d27be8":"endEthGetToken()","59d2af39":"testFooSend()","59d313de":"MatchResetDeadline(uint256,uint256)","59d33d73":"bountyReserveTokens()","59d3ce47":"Activate()","59d3d57e":"totalUserLost()","59d3d632":"verifierAllocation()","59d3dad9":"miscNotLocked()","59d4447a":"MingToken()","59d52e2b":"XmonetaSale()","59d5335b":"refPercent()","59d55194":"getPet(uint256)","59d5d02a":"transferFee(address,address,uint256)","59d5dc11":"PhardusNetwork()","59d667a5":"bid(address,uint256)","59d6b35b":"lastProof()","59d7d46f":"doInvest(address,uint256,address)","59d89175":"setSellCommissionBps(uint256)","59d90c19":"addLockedAmount(uint256)","59d96db5":"terminate(uint256,string)","59d998e4":"transferHashOwnership(uint256,address)","59d9b2b7":"getTokenOwnership()","59dac714":"hashTo256(bytes)","59db5bac":"VisitCount()","59db9eb0":"deallocate(address,uint256)","59dc6d5c":"setDollarBalance(address,int160)","59dc735c":"getClient()","59dd35da":"ICOPrice()","59dd7ad4":"batchTransferFroms(address,address[],uint256[])","59dd8f34":"NRB_Tokens()","59dfdec8":"totalPlayCount()","59e026f7":"internalTransfer(address,address,uint256)","59e02dd7":"peek()","59e05c5f":"delay_pool_drain_block(uint256)","59e08fe1":"isSaleOver()","59e09fec":"getLockedAmount_dakehus(address)","59e0b91a":"LMOSupply()","59e0cf23":"setOraclize(address)","59e148fc":"getLastOfferId()","59e1667d":"testControlCreateWithForeignParentNotInUse()","59e20f69":"addJobInvitation(uint256,address,string)","59e23ccf":"computeBlockPrice(uint256,uint256,uint256)","59e2d30e":"testThrowBlobStoreNotRegistered()","59e30226":"getTradeOfferSenderItems(uint256)","59e33e35":"indexdate()","59e3e1ea":"testDivAdd(uint256,uint256,uint256,uint256)","59e415d3":"crowdETHTotal()","59e4c4ca":"createLover(string,string,string)","59e4eec9":"startMarket(uint32,uint256)","59e529cc":"extra_bonus()","59e54095":"getRefundValue()","59e541af":"getTokenInfoMaxPerBlockImbalanceList()","59e5d4b5":"hicsToken()","59e6800c":"depositToken(address,uint8,uint256)","59e777f6":"newHeir(address,uint256)","59e86488":"hasteamadjacency(uint16,uint16)","59e94862":"getEthToTokenOutputPrice(uint256)","59e994ca":"endTimeOfBids()","59e99db2":"_mint(bytes32,uint256,bytes32,address)","59e9fb1b":"IPFShash(string)","59ea2647":"yearTwoMultiplier()","59ea287d":"pre()","59ea6d80":"setNegativeArray(int256,int256)","59eb8224":"trancheCount()","59ebb321":"isManagementProxy(uint32,int256,address)","59ebbe35":"cancelFinishMintingRequest()","59ebeb90":"Open()","59ec29fe":"successICO()","59eca3e2":"manipulateSecret()","59eddf34":"getSchool(uint256,address)","59eecbf9":"assert1(bool)","59eee5c7":"hosting(uint256)","59efcb15":"execute(uint256,bytes)","59f02c4d":"getOraclizePolicyId(bytes32)","59f121a8":"setCreator()","59f1286d":"queryCredit(address)","59f47523":"newUserBonusCardTradable()","59f4bbd2":"indexPaidAffiliate()","59f568b9":"setDefaultNumberJuror(uint16)","59f5e0ce":"purchase(string)","59f61c74":"nextKey(uint256)","59f62cdc":"buyCalcAndPayout(address,uint256,uint256,uint256,uint256)","59f69ab6":"enforceWhitelist(bool)","59f769a9":"activeBalanceOf(address)","59f8714b":"changeableTokenCount()","59f96737":"convertMetToEth(uint256,uint256,int256)","59f96ae5":"postSellOrder(address,address,uint256,uint256)","59f974ce":"checkFundingGoalReached()","59f9a58f":"_vouchersInSharedPool(uint16)","59f9edd0":"sultantoken()","59fa0663":"setWhitelistOut(address,bool)","59fa34df":"findCurrentIndex(address)","59faf062":"bidPrice(bytes32)","59fb34bd":"_createRide(string,bytes7,address,uint256)","59fc2ba4":"DRONEXTOKEN()","59fd510a":"extraBalanceNeeded(uint256)","59fd95ae":"BTCCToken()","59fde1e0":"distributeRevenue(uint256)","59fe2720":"updatePollDescription(uint256,bytes,uint8)","59fe7279":"ADMINISTRATOR()","59ff5b55":"getMagicNumber()","59ff6473":"redistributeFees(uint256)","5a0024ae":"VerifyCheque(string,string)","5a0089d3":"getChildContractAddress(uint8)","5a012b17":"landsSold()","5a0178af":"update(uint256,uint256,bytes32)","5a018e01":"RESERVES_STAKE()","5a02dcde":"budgetWallet()","5a02ec19":"depositVault(uint256)","5a0391f2":"BuyForEtherTransaction(address,uint256,uint256,uint256,uint256)","5a04ce5b":"setMinBalance(uint32)","5a051c47":"_purchaseLoopFifo(uint256,uint256)","5a052dff":"buyPixel(address,uint16,uint24,string)","5a055a33":"Enterprise()","5a059a44":"composeJingle(address,uint256[5],uint256[5],string,string)","5a05fff0":"bountyRewards(address)","5a0646e2":"InitAssignCTC()","5a06f1e3":"TMEXAddressSet()","5a071517":"existPublicKey(address)","5a0718d0":"ICOadvisor1()","5a0753ac":"devFeeBalance()","5a079207":"Hydro()","5a083f54":"transferFromCheck(address,address,uint256)","5a09f2f4":"setHouseFee(uint256)","5a0ae8d5":"emitSkillRatingGiven(address,address,uint8,uint256,uint256,uint256,uint256)","5a0b7663":"getMaxResponseStates(uint256)","5a0ce676":"setParams(uint256,uint256,uint256)","5a0d9627":"updatePlayerMask(uint256,uint256,uint256,uint256,uint256)","5a0ebf94":"TokensReceived(address,uint256)","5a0f385a":"reverseTransfer(address,uint256)","5a0f3c40":"_foundationSupply()","5a1024d5":"setSinistre(uint256)","5a10d868":"Diyflex()","5a119ef2":"addIcoAddress(address)","5a1230bf":"computeCallKey(address,address,bytes4,bytes32,uint256,uint8,uint256)","5a129164":"vestingBeneficiary()","5a129e97":"byte32ToString(bytes1[32])","5a12b581":"GetUser(string)","5a13340f":"GetApplicant(bytes32)","5a140df0":"_remove(uint256)","5a142887":"grantAccessDeposit(address)","5a149f08":"finalizeNextUpgrade()","5a15656c":"developerCommissionFee(uint256)","5a15c373":"transferByOwner(address,address,uint256)","5a17877a":"LCDToken(address,address,address,address,address,address)","5a17aa41":"getContentTip(bytes32,address)","5a181478":"setPayoutCumulativeInterval(uint256)","5a182b8b":"SellLoan(uint256,uint256)","5a186c77":"init(address,uint256,uint256,uint256,uint256[],uint256,uint256,uint8)","5a18ae3d":"apply(string)","5a18f9ff":"isFundingNeeded(address,address)","5a1a1b67":"zTransferWinningBets()","5a1a8593":"bidBatch(uint256[],address)","5a1b0c0b":"LogBidCanceled(uint256)","5a1b472c":"getmykeyid(address)","5a1b96a2":"FiduxaCoinCrowdsale(uint256,uint256,uint256,uint256,uint256,address)","5a1bdaa1":"deusETH()","5a1cc358":"getChannelRank(address,uint256)","5a1e0a46":"cancelVote(uint8)","5a1e6ca1":"endRound(uint256)","5a1e6fc6":"setEmployeeAddress(uint256,address,address)","5a1e921b":"isTradeSupported(address,address,uint256)","5a1e9c79":"ProofOfKennyCoin()","5a1f3c28":"getCollection(uint256)","5a1f892c":"addPresaleContributors(address[])","5a2056ba":"rejectPayments()","5a212e99":"stringandbytes(bytes)","5a22d81a":"buyCEO()","5a236389":"getFileLoc(uint256)","5a237491":"nextWithdrawDayTeam()","5a23932b":"cryptaurus()","5a2450c3":"EventHub(address)","5a24c6a9":"chart_call()","5a272403":"SetAdmin(address)","5a275879":"toHex(address)","5a2791ed":"block24h()","5a28340a":"accessOperatingBudget(uint256)","5a297cae":"claimApis(address)","5a29ee7b":"sendRemaningBalanceToOwner(address)","5a2a3039":"setTopWinnerPrizes()","5a2a4452":"_addRole(address,string)","5a2a553f":"isCollateralWithinMargin(uint256,uint256,uint32)","5a2a75a9":"getTranscoderPoolMaxSize()","5a2b31d9":"B24Token()","5a2b488e":"calculateRefundedEth(uint256,uint256)","5a2bcc18":"mintAmount()","5a2bf25a":"setAddressValue(bytes32,address)","5a2c0f78":"mintMarketMakerApproval(address,address,uint256)","5a2de12f":"ChipTreasury()","5a2e311b":"capDefault()","5a2e4a11":"raisedWithdrawal()","5a2ee019":"m()","5a2f71d4":"setEquipmentTrainingFeeMultiplier(uint256)","5a2fe63a":"isInMainSale()","5a30b194":"__address0__()","5a317cb3":"SHA256HashRegister()","5a31ab2f":"PresaleClosed(bool)","5a325fb3":"_setPlatformFeeRate(uint128)","5a32d070":"trickleDownBonusesReleased()","5a3320ff":"isCrowdsaleOpen()","5a338506":"airdropToAddresses(address[],uint256)","5a34508b":"delistAddress(address)","5a34ced1":"disableFundingWallets(address,address)","5a353193":"KrakenPriceTicker()","5a353f98":"T20coin()","5a354e04":"ProxyUser(address)","5a35eb7c":"isWinSlot(uint256,uint256)","5a36c394":"executeOrder(uint256,address,address,uint256,uint256,uint256,uint256)","5a36e0da":"getProjectCreator(uint256)","5a36f4f3":"setMintableProperty(uint256,bytes32,bytes32)","5a37ae58":"Show_the_name_of_Option_A()","5a388a43":"MVM()","5a390a5f":"breedingMarket()","5a3a05bd":"subRegistrar(bytes32)","5a3a6ef8":"TXL()","5a3b7e42":"standard()","5a3c0287":"claimTokensFromTokenAiNetworkToken(address)","5a3c8826":"dynamicCeiling()","5a3dd13f":"getScoreTotal()","5a3e251f":"halvingPeriod()","5a3f2672":"tokensOf(address)","5a3f88f0":"changeGeneration(uint40,uint16)","5a4071fe":"lockInternalAccount(address,bool,uint256)","5a40bb8f":"setAllergies(bool)","5a40ec7e":"verify(uint256,uint256,uint256,string,bytes32[2],bytes,bytes)","5a41217e":"underMaintenance()","5a414ff6":"getAuthorizedOwners()","5a416920":"swapFor(address,uint256,address,address,uint256,uint256,uint8,bytes32,bytes32)","5a41d508":"setFlightPrice(uint256)","5a42e85f":"SICX()","5a4362e5":"closeDown()","5a43fa90":"getTokenProposalDetails(uint256)","5a4426bc":"proposeLOC(string,address,uint256,string,uint256)","5a444139":"canBurnWhiteList()","5a446215":"setNameAndSymbol(string,string)","5a4528c2":"distributionContract()","5a4537b0":"TransferableMultsig(uint256,address[])","5a46bb2b":"initChain(bytes,uint32)","5a46d3b5":"lockOf(address)","5a46f06c":"BANCOR_CONVERTER_FACTORY()","5a470aff":"setNthByte(uint256,uint256,uint8)","5a470b65":"gamePlayedStatus()","5a476e5a":"buyOrderBalances(bytes32)","5a481a7e":"ARBITRAGEToken(address)","5a4877c0":"timeLockedBeneficiariesDisbursedTo()","5a4a04a7":"OWNER_CLAWBACK_DATE()","5a4bffb8":"tokenPurchaseAmount(address)","5a4c07a0":"fillBlank()","5a4c822d":"setAdminPercent(uint256,uint256)","5a4cc5da":"Dunhil()","5a4d8e59":"getBAU2Length(bytes32,address)","5a4ded51":"tokenBuyCalc(uint256)","5a4e69f0":"KyberContirbutorWhitelistOptimized()","5a4fc9c5":"lookup(int256)","5a500066":"WSXToken()","5a5132be":"ambix()","5a51d1df":"sendReward(uint256[])","5a525491":"safeIndexOfTaskId(uint256)","5a527afb":"testFooApprove(uint256)","5a52da30":"didVoteForName(address,string)","5a52ecf6":"getSignedConfiguration()","5a531015":"getLotteryAtIndex(uint256)","5a5383ac":"canExitPool()","5a53fe20":"multiApprove(uint256[])","5a543683":"BuyerLotteryTimes(address)","5a54cd46":"proceedEtherDeals(uint256)","5a54e755":"hashMachine()","5a55c1f0":"getVote(uint256)","5a5638dc":"policyTokenBalanceFromEther()","5a56a31c":"FeeApplied(string,address,uint256)","5a57a901":"VIPSToken()","5a5804b3":"getAllocation(uint256)","5a589fc9":"authUser(string)","5a58cd4c":"deleteContract()","5a591a4e":"promotionDataRecord(address,uint256)","5a592380":"vestingPlans(uint256)","5a593a6e":"totalreleaseblances()","5a596aa4":"CheckBalance(address,address)","5a5b32b7":"_setHatValue10(uint256)","5a5c8068":"oraclize_setNetworkAuto()","5a5d096c":"isOwner(uint256,address)","5a5d3350":"KKToken()","5a5ddcf6":"startStopICO(bool)","5a5e0024":"SecondEtherLimit()","5a5e0074":"etherForOwner()","5a5e861e":"currentPayment()","5a5ebebf":"withdrawRent(address)","5a5ec54a":"neglectOwner()","5a609b96":"investorsIter()","5a61c40a":"setwithtoken(address)","5a625393":"ValueTokenBase(uint256,string,string,uint8)","5a628525":"reveal(address,bytes32)","5a628e17":"getWishIdxAt(address,uint256)","5a63cba0":"checkSaleLimit(uint256)","5a63feb8":"__targetExchangeAndSpendCallback(address,uint256)","5a648bc5":"WithdrawAll()","5a64ad95":"mintingFee()","5a64b786":"deposit_dividends()","5a650f45":"numBountyCredits()","5a6535fc":"call(bytes)","5a657452":"COD()","5a658f6b":"directorNode()","5a65f004":"isSynthesizeAllowed()","5a67a20d":"endingPrice()","5a67f389":"timeGone(uint256)","5a6814ec":"thisisfine()","5a686699":"post(uint128,uint32,address)","5a69fe0e":"TokenERC20(address)","5a6ad1e1":"multivestBuy(address,uint8,bytes32,bytes32)","5a6af33b":"subtrBalance(address,uint256)","5a6b26ba":"withdrawal(address,uint256)","5a6b3a79":"assignBounty(address,uint256)","5a6c6408":"updatePolicy(bytes32,address,uint32,uint32,uint256,uint256,bool)","5a6c787e":"updateWithMPO()","5a6cd237":"latestTokenBalance()","5a6d663c":"notifyTransfer(address,address,uint256)","5a6dad3c":"setFreelancerParams(uint256,uint256)","5a6e8980":"editusetaddress(uint256,string)","5a6f7aef":"tweakUpgrading()","5a703223":"GetToken(address,uint256)","5a70686a":"mintChip(bytes32)","5a70fe72":"GetInvestedAmount()","5a71be21":"ethEur()","5a732dd5":"CCPayoutArb()","5a74a715":"setWeiForMcr(uint256)","5a74dee5":"multiAccessRemoveOwnerD(address,address)","5a7511d0":"put(uint256,string)","5a753c6e":"getWarlordDistributedRandom(uint256)","5a75aa1c":"ChangeRate(uint256)","5a75b8d5":"currentHodlerId()","5a764631":"setSkillName(uint256,bytes32)","5a766620":"neglectGuess(int256)","5a768e4a":"ECONOMY_BOOST_TRADE()","5a769366":"sadf(address)","5a76e73e":"getNoOfTokens(uint256,uint256)","5a778cf9":"batchPresale(address[],uint256[])","5a78897b":"setFunctionSixPrice(uint256)","5a7a4c1e":"_applyPct(uint256,uint256)","5a7a8850":"rollWithSeed(bytes32)","5a7adf7f":"preSale()","5a7b4097":"fundBalanceOf(address,address)","5a7b57f2":"MadoffCoin()","5a7cb38f":"tokenTransferAddress()","5a7da6b5":"burnUpdateTokenFrom(address,uint256)","5a7db533":"getRef(address)","5a803611":"addDealerForSender(string)","5a81018a":"getClientCount()","5a811766":"replaceAdmin(address,address)","5a813fd5":"test_insert_findWithHintPrevAtPosition(int256)","5a8194d2":"getVersionIndex(bytes32,bytes32,bytes32)","5a81b5b9":"collectMegaJackpot(uint256)","5a825cbb":"getPayment(uint256,uint256)","5a851ffb":"calculateDiceWinner(bytes32,bytes32,uint256)","5a857565":"buyTokensInternal(address,uint256)","5a85d2fa":"playerSignUp(address)","5a861838":"addHpbNodeBatch(address[],bytes32[],bytes32[])","5a8654ad":"End6()","5a86c914":"getRateIcoWithBonusByDate(uint256)","5a87053e":"privateBonus()","5a87c380":"getRewardListLength()","5a8830e2":"partial_refund_my_ether()","5a88b15f":"Halo3DShrimpFarmer(address)","5a89b376":"contractDecimalsUpdate(uint256,bool)","5a8ac02d":"second()","5a8b1a9f":"upgradeTo(string,address)","5a8b55e2":"IsWildCardCreatedForCategory(string)","5a8bbba9":"createNewSecret(string,bytes32,bool)","5a8bbee1":"Group_4()","5a8cadb1":"migrateAll(address)","5a8cf571":"changeControlWallet(address)","5a8d580e":"forceNSFW(uint256)","5a8d6cea":"transferUnsoldIcoTokens()","5a8dd79f":"getDesignatedCaller(address,uint256)","5a8e9d66":"settle(address,uint32)","5a8ef28a":"GBP(uint256)","5a90a49e":"exemptFromFees(address)","5a9156f0":"LogAddUser(address)","5a91e5e9":"removeFabric(address,address)","5a93bf71":"delReferral(address,address)","5a93cc8f":"addBonus(address,uint256)","5a93f1a1":"_deleteCompany(bytes32)","5a9448e2":"multisigFunds()","5a94cd0c":"requestChangeStakingFees(uint80,uint80,uint80,int256,uint80,int256,uint256,int256,uint80,uint80,uint256)","5a95edd9":"OTHERCRUISER_FTL_SPEED()","5a960216":"ethUsd()","5a969f94":"InternationalModelChain()","5a975128":"minGamble()","5a979a5c":"LockContractOwner(address)","5a97b84a":"finishUserDistribution()","5a983451":"totalTokenMintedAngel()","5a992188":"getUserBet(uint256,uint256)","5a99719e":"getMaster()","5a998a09":"totalRoyalty()","5a99b525":"payoutRoyalties()","5a99d123":"unsetNotaio(address)","5a9a49c7":"verify(bytes32[],bytes32,bytes32)","5a9aa592":"currentWallet()","5a9b0b89":"getInfo()","5a9bb087":"claimContractTokens(address)","5a9c0a49":"setBasePrice(uint256[20],uint256,uint256,uint256,uint256)","5a9c2724":"create(string,string,address)","5a9c3ee4":"mainSaleDeadline()","5a9c84f3":"maximumTokensForSecond()","5a9cfac8":"hasPosts()","5a9d27dc":"createReleaseTokenAuction(string,uint256,uint256,uint256)","5a9d5c3c":"PCPP()","5a9e03ca":"isIssuedBefore(bytes32,uint256)","5a9e426b":"refundMe()","5a9e75a2":"maxBorrowAmount(address)","5a9e91df":"zlotsJackpot()","5a9f2def":"scheduleCall(bytes4,bytes,uint256,uint256)","5a9f97d1":"currentSaleDay()","5a9ffc35":"circulatingFame()","5aa00cc4":"_emitJobCanceled(uint256)","5aa037dc":"purchasedTokenBalanceOf(address)","5aa1eb4c":"createAdjudicator()","5aa23a52":"sendRewardBILL(address,uint256)","5aa3952a":"GERCoinCrowdsale(uint256,uint256,uint256,address)","5aa3d2b0":"purchasedAmountBy(address)","5aa4470f":"setLogicContract(address)","5aa451e9":"updateOfferingReputation(address,uint8)","5aa4c8a9":"addToMap(uint256,uint256)","5aa5b9d1":"LogPersonNew(address,uint256,uint256)","5aa61ec6":"getExchangeRatesLength()","5aa63592":"DeadMansSwitch(address,address,uint256)","5aa68ac0":"getParticipants()","5aa6b1f0":"reduceFiatCurrencyRaised(uint256)","5aa6cf97":"payout(uint256,uint256)","5aa720c3":"linkTaskToUser(address,address)","5aa77d3c":"pendingContractOwner()","5aa83129":"store(bytes,uint256,uint256,address)","5aa86386":"getMinNextBet(string)","5aa8a42c":"updateOwners(uint256,address[])","5aa8e281":"freezeAccountCoin(address,uint256)","5aa94a68":"computeResultVoteExtraInvestFeesRate()","5aa97a3b":"agreeNeg(string,uint256)","5aa97e16":"BBCPrimeEx()","5aa97eeb":"getMarkets(bytes32[],address)","5aaa250a":"TokensCappedCrowdsaleImpl(uint256,uint256,uint256,address,uint256)","5aaac1d1":"fundingMaxCapUSD()","5aab1822":"stateEndDate()","5aab25b6":"isRedenominated()","5aab4ac8":"motd()","5aac8aad":"ICO_TokenValue()","5aad0450":"addVestingAllocation(address,uint256)","5aad507b":"userTotalCredit(address)","5aad7c56":"calculatePMAFromFiat(uint256,string)","5aae456a":"potatoTotalSupply()","5aae843e":"doPreAllocations()","5aaec2b1":"isdelegatinglisted(address)","5ab01088":"joinPreSale(address,uint256)","5ab027b0":"masterAddress2()","5ab0e470":"getShortPositionState()","5ab14385":"doProxyAccounting(address,uint256,uint256)","5ab1a0e2":"JungleScratch()","5ab1bd53":"getRegistry()","5ab2ff61":"read_u64_array()","5ab30d95":"bobMakesEthPayment(bytes32,address,bytes20,uint64)","5ab31a60":"drawNumber(uint256,string)","5ab35302":"ProofofHumanity()","5ab3ae21":"privatesaleTokens()","5ab3ded3":"changeDonationWallet(address)","5ab3fbc9":"BGB_Token()","5ab47550":"firstDayCap()","5ab4f162":"getVote(address,address)","5ab50913":"_recalculateAirdrop(address)","5ab58d64":"totalLockedHavvens_limitedSum()","5ab5956e":"startICOStage6()","5ab5d07d":"CROWDSALE_MAX_ACES()","5ab68072":"carTaxiCrowdsale()","5ab6eb7a":"Tabbo()","5ab7603a":"multivestBuy(address,address,string)","5ab7f1a8":"donatedAmount()","5ab81246":"newItem(uint256,string,string)","5ab827f6":"claimableRefund()","5ab89248":"AAcontributors()","5ab92022":"frozenTransfer(address,uint256,uint256,bool)","5ab98b8d":"DragonReleaseableToken(address)","5ab9bb26":"changeBonus(uint8)","5abaaa01":"unicornTokenAddress()","5abacc89":"RANGESTART_9()","5abb37d6":"cancelGame(address)","5abc3339":"create(bytes32,bytes32,bytes32)","5abc52d4":"SALE2_RATE()","5abcc417":"createCastle(address,uint256,string,uint64,uint64,uint64,uint64,uint64,uint64)","5abd7728":"setMinTaskValue(uint256)","5abedab2":"getAllTheFunds()","5abfafe2":"holdAddress3()","5abfc588":"CreatedDebt(uint256,address)","5ac04bed":"CreateMUSC(address,uint256)","5ac0dc11":"doTimeoutForComplainant(uint256)","5ac14935":"test_0_createOpenController_test_methods()","5ac1caa0":"_getCurrentRound(uint256)","5ac207ff":"totalLossAmount()","5ac2523a":"minimalTokens()","5ac26ebd":"devuelveTodasEncuestas()","5ac31e68":"getOrdersForNotary(address)","5ac36d70":"setTeams(address[],uint256[])","5ac3835d":"verifyTransferSignature(address,address,uint8,bytes32,bytes32)","5ac44089":"setHardCapInCents(uint256)","5ac48043":"slice(uint256[],uint256,uint256)","5ac49ba1":"CORE_TEAM_TOKENS()","5ac5c4f7":"Out(uint256)","5ac5ec65":"UsableToken(uint256,string,uint8,string)","5ac5f82c":"computeBonus(uint256)","5ac72734":"tkt()","5ac77ad1":"isLockedOpen()","5ac7a8d0":"UTBToken(uint256,string,string)","5ac7b9f3":"reapFarm()","5ac801fe":"setName(bytes32)","5ac849d2":"liveBlocksNumber()","5ac87d76":"addToWhiteList(address,uint256)","5ac942a7":"getIdentifierByIndex(address,uint256)","5ac9e90f":"readLib()","5aca6153":"setJackpot(uint8[4])","5acb053b":"toggleDead()","5acb6787":"createRegion(uint256,uint256,uint256,uint256)","5acba201":"canOverride(address,address,address,uint256)","5acbd8e1":"ProxyStorage(address)","5acce36b":"getEndowmentBalance()","5ace5128":"_emitBoardClosed(uint256,bool)","5ace83d7":"approveWinner()","5acee3d6":"getFutureTransLength()","5acf061a":"validateContract(address)","5acf34df":"check_data(bytes32)","5acf36ca":"fwithdrawal(uint256,uint256)","5acfefee":"sendProfits()","5ad1854b":"advisersPeriodAmount()","5ad22eb3":"canonizedPLCR()","5ad35ac0":"numberOfTokensAllocated()","5ad550bc":"testAbsMax()","5ad55aa5":"setCurrentSchellingRound(uint256)","5ad5ca74":"createXMLYTrade(bool,uint256,uint256)","5ad64dc5":"deletePick(uint256)","5ad6ba47":"getChronus()","5ad701c2":"getTier()","5ad74742":"ICO_Contract()","5ad7c05c":"getUserRequests()","5ad82148":"getUserid(address)","5ad871d5":"CrowdWithUs(uint256,string,address,uint256)","5ad8803d":"mintAndCall(address,uint256,bytes,bytes)","5ad95948":"wmin(uint128,uint128)","5ad9ca10":"changeBonus(uint8,uint256,uint256)","5ada0f51":"setTkContractAddress(address,address)","5ada7bee":"updateVerifier(uint256)","5adada87":"getPaymentsHeld(address)","5adb5813":"_setTokenURIBase(string)","5adb6ddb":"unfreeze(address,address)","5adc02ab":"confirmWhitelistAddition(bytes32)","5adc0c68":"getAddTokenParameters()","5adcba0e":"getEntryStatus(address,uint32)","5adcf475":"loikikdidad()","5addc540":"forceToken()","5addcc8f":"finishFromDutchAuction()","5ade3f8f":"NectarChina()","5ade7c8a":"getMyChest(address)","5ade9c3a":"removePass(bytes32,address)","5adf292f":"updateKittenCoinsRemainingToDrop()","5adfafdf":"updateRewardPercentageByIndex(uint256,uint256)","5ae11d5d":"order(address,uint256,address,uint256,uint256)","5ae17907":"getLossCount(address)","5ae23da2":"host_claim_earnings(address)","5ae23f84":"getTimeRangeInfo()","5ae270aa":"GToken()","5ae28fc9":"setMaxAge(uint256)","5ae46e93":"RaffleDappBook(string,uint256)","5ae4c04a":"viewprice()","5ae59132":"havvensReceivedForNomins(uint256)","5ae5b24f":"eosPizzaSliceSafe()","5ae5df8f":"deleteRef(string)","5ae61377":"getMaxBusinessesPerCity(uint256)","5ae63989":"WaraCoin()","5ae7ab32":"revokeKey(address)","5ae81492":"canceloffer()","5ae82dfd":"ariseWarrior(uint256,address,uint256)","5ae8a1e0":"updateUserPolicy(bool,bool,bool,bool)","5ae8daea":"getRoundJackPot(uint256)","5ae9c4d8":"getLineData2(uint256)","5aea5955":"ltc()","5aea92f5":"LingYanToken()","5aea9905":"BitrustToken(address,address,address,uint256)","5aeb45dc":"TetherToken()","5aebd1cb":"isRefundable(address)","5aebf21a":"getProviderAdmin(address)","5aebfd14":"createFile(bytes)","5aec11d4":"canUnshelf(string)","5aec2247":"balanceOfPreSale(address)","5aec57d8":"NewRound(uint256,uint256,uint256)","5aec6259":"getUInt(bytes32)","5aed37ef":"manualWithdrawEtherAdditionalOnly()","5aed4fa0":"safetyCheck(uint256)","5aee1bc0":"AirdropBeggarsCommunity()","5aee9431":"method1()","5aeee9f9":"incFightLose(uint256)","5aef2447":"getClaim(uint256)","5aef447c":"presaleBonusTokens()","5aef7de6":"avatar()","5aefd89d":"Freezing()","5af0649e":"confirmNewNotary(address)","5af0dc98":"blockSkills(address,uint256[])","5af0e1ae":"MyWillCrowdsale(uint32,uint32,uint256,uint256)","5af0f053":"approveMove(address,bool)","5af123f4":"bonusRate()","5af14603":"GetSetting(uint8,uint8)","5af1cf27":"foundersWallet1()","5af25671":"HugMathou()","5af2f821":"getCounterProposals()","5af36e3e":"refund(uint256,uint256)","5af3d5bf":"CWCfallback(address,uint256,bytes)","5af3e9d7":"bonusLOT()","5af40b77":"buildPreICOStage()","5af4cd99":"canBurnAddress()","5af5f7ba":"setWhitelisting(bool)","5af6333d":"getGoldInfoSerial(address)","5af73f3f":"getMinimalBalance(uint256,address)","5af77fff":"Contract()","5af82abf":"director()","5af86018":"VPE_Token()","5af89094":"getPMul()","5af95010":"Lenders(address)","5af9f68f":"getTxPaymentMCW(bytes32)","5af9f9d5":"TheSchmeckle()","5afa5036":"isCertified(address)","5afa5bb6":"minValue2()","5afb408a":"Penchant()","5afb540c":"getTokenCount(bytes32,string)","5afbfd4f":"getPublicBattlePokemon2()","5afc190d":"DrawHouse()","5afc250f":"getDad(address)","5afc7e59":"issueFrts(address,address,uint256,uint256,uint256,address)","5afd7627":"setCrowdsaleCompleted()","5afdc02c":"_9_dataSmerti()","5afe16ca":"GetProfile(uint256)","5afe5207":"setTokenSaleAddress(address)","5afeb106":"Sqrt()","5afecaaa":"getAllArtworksByOwner()","5aff457f":"createAuctionFromArray(address,uint256[],uint256,uint256)","5aff59e3":"addrCanPurchase(address)","5aff7e54":"returnBalance(address,bytes32)","5affcbb0":"cancelIndexedSaleByAddress(address)","5b00763e":"ProofOfTrevonJames2()","5b0088fb":"setPlotData(uint256,string,string,string,string)","5b01b5b3":"teamEmail()","5b01e233":"getyestodayget()","5b02b729":"setLockUpPeriod(uint256)","5b04cbb5":"current_state()","5b04e512":"defaultLockin(address,uint256)","5b050e77":"isInGame()","5b053c04":"maxPreSale1Token()","5b054f9b":"chainStartTime()","5b060530":"createToken(string,string,uint256)","5b064754":"LogChiSale(address,uint256)","5b067cce":"testCreateCostMain()","5b06fc49":"HASHPERETH()","5b07371e":"getAttackRanking()","5b0783f3":"setCapRec(uint256[],uint256[],uint256)","5b07d7d6":"_generateGene()","5b09a518":"process(bytes32,bytes[])","5b0a3843":"emergencyWithdrawal()","5b0a6c58":"EasyMineIco(address)","5b0ad787":"getBonusSetter()","5b0b02ec":"deathData_f4()","5b0b7cc8":"payday(uint256)","5b0c12a1":"DeploymentInfo()","5b0cfcd8":"KillContract()","5b0d4eff":"mineral()","5b0d5b55":"getTankEarning(uint32)","5b0d823a":"referalFundBalanceMap(address)","5b0dad8e":"bcdcMultisig()","5b0e1a2f":"releaseMyTokens()","5b0e52b0":"unlockExternalTransfer()","5b0e70ff":"RetireHodl(uint256)","5b0e8b82":"admin_list()","5b0ec73e":"MNCToken()","5b0ef4a4":"getEtherTicket()","5b0efb03":"MintAndTransfer(address,uint256,bytes32)","5b0fc9c3":"setOwner(bytes32,address)","5b1052f1":"getCoinBySlotId(uint64)","5b10b796":"_removeCapper(address)","5b10d05d":"donotDKKDappToken()","5b113414":"mul(uint32,uint32)","5b11380d":"ExTokeB()","5b1214c6":"setCrowdsale(uint256,uint256,uint256)","5b1295d2":"LNDToken()","5b12f1b6":"getAuthorizeContractIds(uint256,uint256)","5b135806":"test_basicWithTwoAssertAfterThrow()","5b14f183":"isPaused(address)","5b151fd2":"fifty_fifty()","5b154394":"GANA()","5b15afb6":"isOuvidoriaCadastrada(address)","5b16ebb7":"isPool(address)","5b174f0b":"EtheremonTransform(address,address,address,address,address)","5b17b190":"onLEXpaContract()","5b18056b":"contributionCount()","5b195526":"getMyCenter()","5b195c86":"transfer(address,uint24)","5b196dae":"getOuvidoriaNome(address)","5b19a8f3":"prossWinOrLoss(uint256)","5b1a77fe":"sentTokensToBountyOwner()","5b1aa9b1":"eugToken()","5b1b5d90":"getTransfer(bytes32,uint256)","5b1b9316":"firstRoundCosmosStart()","5b1c1625":"prepareClaim(bytes32)","5b1c893a":"UBC()","5b1d0d1e":"getOwnerAccessoryCount(address)","5b1dac60":"getSharePrice()","5b1dadc7":"PRICE_PRESALE_WEEK2()","5b1ea858":"signedTransferSig()","5b1eca38":"getTotalDevs()","5b1fe0cb":"sendGift(uint256,address)","5b1fef12":"GetPVPData(address)","5b206edb":"initAmount_()","5b208f76":"PlayX2()","5b209615":"ecrecover1(bytes32,uint8,bytes32,bytes32)","5b21a8b0":"NILEX()","5b21ba6f":"calculateProfit(uint256)","5b21e539":"decline(uint256,bytes32,bytes)","5b225526":"permissions(address,bytes32)","5b225d25":"getLatestManifestByName(address,bytes32)","5b228f88":"CLCToken()","5b229869":"getSenderArmyCount()","5b2298c8":"getSumAmountOfDisputedDealsProPatient()","5b22bbd2":"maxRaiseAmount()","5b2329d4":"checkGoalReached(uint256)","5b23bf8a":"forcePayout()","5b24f87d":"addManyToAllocationList(address[],uint256[])","5b250462":"join_private_room(bytes32)","5b251342":"KAnsariCoin()","5b25c137":"kycVerifiedBonusBps()","5b25ed6a":"tokensLimit()","5b284ecd":"InsertRank(uint256,uint256,uint256)","5b28919c":"getShipType(uint256)","5b28ad15":"dna6(uint256)","5b290c1d":"continueRedeeming(uint256)","5b29f2e4":"icoSold()","5b2a0e96":"multiSend(address,address[],uint256)","5b2a372d":"setTxDataBlockNumber(bytes32,bytes)","5b2aa4ae":"getMatchInfoList01()","5b2b0168":"_refundTokensPurchase(address,uint256)","5b2b2194":"addRange(address)","5b2b345c":"TOKENS_ACCOUNT_MAX()","5b2c44e1":"updateWhitelistInternal(address,address,uint8)","5b2ccdec":"hirerCancel(bytes16,address,address,uint256,uint256)","5b2cdda3":"returnWalletAddress()","5b2d7ad1":"calculate_shares_and_return(uint256,uint256,uint256,uint256,uint256,uint256)","5b2e1eb1":"ETHPonzi()","5b2e299c":"Hypercoin()","5b2e39e0":"releaseEcosystemJM(address)","5b2e9a81":"UpdateSellAgentSiteReg(address)","5b2ec3a5":"createInternalAuction(bytes32,bytes32,uint256,uint256,uint256,string)","5b2f515b":"artistName()","5b2f8752":"claimLoss()","5b303e16":"eatUnicorns(uint256)","5b30535d":"updateFactorReward()","5b30a647":"checkapproval(uint256,address,bool)","5b31035d":"getReward(uint64)","5b325e94":"AddTransactionAgainstExistingEntity(address,uint256,uint256,string,string)","5b329058":"DSGroup(address[],uint256,uint256)","5b33233b":"increaseOwnershipTokenCount(address,address)","5b34b966":"incrementCounter()","5b34f4e2":"newUserAccount(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)","5b353cfa":"PMC()","5b35f9c9":"rewardsWallet()","5b364f3b":"chkend(uint256)","5b366096":"changeHDXcontract(address)","5b36fea6":"transferToICAPWithReferenceCallGas()","5b372532":"press()","5b378d39":"ContractorCreated(address,address,address,address)","5b379044":"dateTier3()","5b37e150":"create(bytes32,bytes)","5b387273":"allowWhiteList()","5b38863a":"btcRateMax()","5b389666":"USDCryptoToken()","5b389dbb":"powerUpContract()","5b38a8e6":"updateAssets(address,int256)","5b3a4895":"totalInvestedWithBonuses()","5b3a6f9e":"DomusToken()","5b3b136a":"getMyTokens()","5b3b20e1":"CLN_PER_ETH()","5b3b449f":"incentiveTokensLimit()","5b3bab74":"NeCashTokenSale()","5b3be4d7":"mintAirDropTokens(uint256,address[])","5b3bf07a":"getPrizeNumbers()","5b3d386b":"transferAnyCaerusToken(address,uint256)","5b3d4b16":"SCUDO()","5b3ddbf2":"firstAuctionConcluded()","5b3de1c8":"getBankEth(string)","5b3ea961":"ChangeSharedExpense(uint256,uint256,uint256)","5b3f4d24":"PrelievoProprietario(uint256,uint256)","5b405418":"CallSpread()","5b4078de":"decodePriceFeed(uint256)","5b40a584":"curId()","5b40d5dd":"unlockInBatches(address[])","5b419a65":"join(bytes32,bytes32)","5b42109d":"getNarcoLocation(uint256)","5b4246d4":"proportion()","5b440596":"getWithdrawValue(address)","5b453810":"changeEtherBonuses(uint256,uint256,uint256,uint256,uint256,uint256)","5b454832":"declareDefaultAsBorrower(uint256)","5b45b999":"setMiniMeToken(address)","5b46016e":"KickTheCoinFactory()","5b467404":"getCounts(address)","5b472771":"level_8_amount()","5b475e22":"STARTING_ANTHILL()","5b477c53":"updoot(uint256)","5b4786ea":"getValusTokenIssuance(uint256,uint256)","5b48165f":"lastBlock_v17Hash_uint256()","5b482ec1":"disconnectModule()","5b485314":"IEFBR14()","5b48684e":"optIn()","5b48c11b":"regRefcode(bytes32)","5b48e66a":"changeCroStatus(address,uint8)","5b49ebdf":"GiantWeedKiller()","5b4a54a9":"isCrowdsaleOver()","5b4b1c0e":"orientation()","5b4b73a9":"setData(uint256)","5b4be32b":"setSellStatus(bool)","5b4c084a":"updateHpbNode(address,bytes32,bytes32)","5b4c3543":"options(bytes32)","5b4c6994":"setArbitratorI(address)","5b4cc249":"newSale(address,uint256,uint256)","5b4cc320":"onOwnershipTransfer(address,uint256,bytes)","5b4ccc9d":"addParticipants(address[])","5b4d20d2":"requireWhitelistedAddress()","5b4df1ca":"ROLE_CONTROLLER()","5b4ef70b":"eth(uint256)","5b4f472a":"tradingStarted()","5b4f5feb":"assignCardOwner(address,uint64)","5b500996":"bringuPort(address)","5b508cf0":"createRegulatorProxy(address)","5b511030":"activateSecondPreIco()","5b519132":"getInitHash(bytes32)","5b51a6d8":"getMintDelegates()","5b51acff":"migrationTarget()","5b525b2c":"changeItemName(uint256,string)","5b528aaf":"KaiKuangChain(uint256,string,string)","5b528ba1":"bonusPer(uint256)","5b52b9db":"WLMTfinney()","5b52c7fb":"GROWTH_SUPPLY()","5b530196":"tokensOfkitty(uint32)","5b53d291":"advisersTotal()","5b5416ca":"unfreezeTimestamp()","5b548ab4":"mixAuto(uint256,uint256)","5b54f077":"promissoryUnits()","5b55169c":"minContribAmount()","5b556bf0":"ZeroExHandler(address,address)","5b56be8b":"prevEndTime()","5b56d57f":"getGameStartBlock(uint256)","5b588f26":"cfoWithdraw(uint256)","5b59af9c":"OwnershipAdded(address,address)","5b5ae956":"Bytes4ToByteArrayWithLength4()","5b5aed3a":"identityExists(uint256)","5b5b45ef":"privateOfferingExchangeRate()","5b5bbb31":"changeSettings(uint64,uint64,uint8,uint8,uint16)","5b5c7705":"withdrawPlayer()","5b5cf8cf":"PacersvsCavaliers420()","5b5d1d88":"TMRToken()","5b5d2c8f":"updateValue(bytes32,uint256,uint256)","5b5ddb94":"read(bytes,uint256,uint256)","5b5e450b":"masterKeyIndex(uint256)","5b5e760c":"getTokenWinValue(uint256)","5b5e7bbe":"setAssetsOnDeposit(uint256)","5b5ecf19":"CryptoSagaArenaRecord(address,uint32,uint8,uint8)","5b5f8b88":"transerFrom(address,address,uint256)","5b5fa6ba":"ownerTemp()","5b60fa6b":"createTeam(uint256,uint256)","5b61291c":"aekS()","5b621b2c":"_setMintableProperty(uint256,bytes32,bytes32)","5b624b6e":"setinfo(string,string,string)","5b630d59":"EFH(uint256,string,uint8,string)","5b633cf2":"getItemsIdsByTypeAndOwner(string,address)","5b63831a":"getMinimumPurchaseVZTLimit()","5b6427fc":"nextNumberOfWagersToMinimumTimeout()","5b65b9ab":"setFee(uint256,uint256,uint256)","5b65da64":"getPhaseSupply(uint256)","5b6682aa":"Tom(uint256,string,uint8,string)","5b66cc84":"transferLog(address,uint256,string)","5b680aa6":"spentAllowance()","5b68a49d":"cancelVoteForCandidate(address,uint256)","5b68e09b":"appAccounts(uint256)","5b68f3a6":"Loggable()","5b6a42b8":"setNewMonster(uint256,uint32,address,string,string)","5b6a54bc":"adjustTransactionFee(uint256)","5b6a9eb4":"minCost()","5b6aa3c2":"isMinTokensReached()","5b6accb2":"manualBatchTransferToken(uint256[],address[])","5b6b431d":"Withdraw(uint256)","5b6beeb9":"getHash(string)","5b6c508c":"exitAll()","5b6ca99a":"setHint(string)","5b6e2492":"getDesignatedReporter()","5b6e7be2":"updateTokenBalance()","5b6edf78":"DISCOUNT_TOKEN_AMOUNT_T1()","5b7121f8":"getMinter(uint256)","5b714690":"valueBeforeFeesWereReduced(uint256)","5b715ae0":"referralProgrammeWallet()","5b7214b6":"m_ETHPriceUpperBound()","5b72c3b7":"eraFromMokenData(uint256)","5b72cdd0":"estimateBalanceOf(address)","5b73024a":"opAddr()","5b73b332":"extendTge(uint256)","5b7450fc":"isOperable(address)","5b752d5d":"getjackpot()","5b754491":"transferFromTx(address,address,address,uint256)","5b75dd8d":"getSubscription(address,address)","5b7633d0":"signerAddress()","5b764811":"_jMul(uint256,uint256,uint256,uint256)","5b766089":"isCreditor()","5b766196":"hasWon(address,uint256)","5b767e86":"getArbiter(address)","5b791420":"isProxyForSender(address,address)","5b7991cd":"extensionsCount()","5b79b275":"_currencyToToken(address,uint256,bytes)","5b79dbe5":"reserveForTeam(address,address,uint256,uint256)","5b7a50f7":"setOldToken(address)","5b7a78c8":"test1_overlappingIntervalSameNode()","5b7ab891":"BAT()","5b7b716c":"tgrSettingsMaxStages()","5b7b72c1":"createCloneToken(address,uint256,string,uint8,string,bool)","5b7baf64":"claimRefund(uint256)","5b7c2dad":"getUserPosition(address)","5b7c38ad":"getLLV_edit_22()","5b7ca9c6":"addPrizePool(uint256)","5b7d47a9":"betOnColor(bool,bool)","5b7d9043":"creditAccount(address,uint256)","5b7da338":"_balanceOf(uint256,bytes32)","5b7db24d":"addRemoveCountry(string,string,bool)","5b7dc56a":"updateLuckyblockSpend(bytes32,address[],uint256[],uint256)","5b7eed81":"T1898Token()","5b7f415c":"TOKEN_DECIMALS()","5b7fc27f":"getInitializParentUniverseValue()","5b7fd9b5":"brands(address)","5b806645":"badgeCount()","5b80f497":"getAvailableIds()","5b814e16":"freezing()","5b824208":"changeMinimumTimeBeforeUpdate(uint256)","5b82d694":"SetClaimFee(uint256,uint256)","5b8315e4":"TokenSCADAEntity()","5b833f1e":"nextTokenOwner()","5b839dd2":"initBonusSystem()","5b83b7f1":"investorExists(address)","5b84bb27":"MYTOKENNAME()","5b850d92":"PollCreated(address,address)","5b859394":"PunkBidEntered(uint256,uint256,address)","5b859500":"hardcapInEther()","5b863b5a":"ZenomeSale(address,address,uint256)","5b86914d":"bet_value()","5b869e68":"DeviceAddr()","5b86ce97":"buyEggWithToken(address)","5b86f599":"increaseBalance(address,uint256)","5b8710e5":"checkTransferRequirements(address,address,uint256)","5b87a2f2":"confirmreward()","5b8807d9":"claimReserveTokens()","5b88349d":"claimAirdrop()","5b889ab8":"ammount()","5b8943ff":"addAffiliate(address,address)","5b89a48a":"lockEpochsMap(address,uint256)","5b8aa811":"setRequiredParticipation(uint256)","5b8ad515":"isUtilityHolder(address)","5b8b4f91":"refererAllowed(address,address,address)","5b8bcb53":"CappedSale(uint256)","5b8be30c":"TheCoinSale()","5b8c6b58":"RoundBHardCap()","5b8d02d7":"payoutAddress()","5b8e48df":"swypes(address)","5b8fa846":"payDividends(string)","5b8fb4ae":"EthKing()","5b905b6c":"newProposal(string,bytes32,bytes32,bytes32,string,uint256,uint256)","5b90ed39":"emitEscrowUpdated(address)","5b91aa6b":"underNumber()","5b91fd60":"performTheMagicTrick()","5b9248aa":"correctResult(int8)","5b9283e7":"isInvalidEarlyPurchase(uint256)","5b92cdee":"bountyAffiliateWallet()","5b92e548":"CreateCBT(address,uint256)","5b93c2bc":"getWinnerAddressList()","5b940081":"releasableAmount()","5b945c0e":"getLableList()","5b947f36":"ItasToken()","5b94db27":"nominateOwner(address)","5b95f65e":"getAddressesByDocHash(bytes)","5b9632ca":"minValue1()","5b96c1e7":"oracleMasterCopy()","5b980628":"collectFunds()","5b984ff6":"enableWithdraw()","5b9900ce":"getWeiforTokens(uint256,uint256,uint256,uint32)","5b99cb2b":"joinGame(uint256,uint256,bytes32)","5b99df7f":"transferWithFee(address,address,uint256,address,address,uint256)","5b9a4690":"convertToMiniRYC(uint256)","5b9af12b":"addValue(uint256)","5b9b0609":"maxContribAmount()","5b9b44bf":"startDefinedGame(uint256)","5b9eb8ab":"CONVERSION_NUMINATOR()","5b9f7cbe":"createNode(bytes32,bytes32,bytes32,address)","5b9fdc30":"getSecret()","5ba05024":"getInsuranceByAddress(address)","5ba0cd78":"BitcoinZ()","5ba13abf":"createMulti(uint256,address[])","5ba17b2d":"NewtonTree()","5ba1a1d4":"viewKarmaVotesBySymbol(string,address)","5ba2dd22":"conflictRes()","5ba32008":"FDKToken()","5ba39782":"getCommentAccounts()","5ba3e63e":"MultiSigRules(address[])","5ba58955":"beneficiaryBalance(address)","5ba5b1b2":"setSoldPreSaleTokens(uint256)","5ba67330":"SendDivs()","5ba6c017":"setTotalSpentPerDay(uint256,uint256)","5ba83c0d":"getMEATime()","5ba87a4d":"getWithdrawedToken()","5ba88490":"privlocatumICO()","5ba88c28":"debug2()","5ba8c608":"activePoll()","5ba8eb42":"getClearance(address,address)","5ba91006":"Sports3D()","5ba92d7d":"_freeze(address,uint8)","5ba9e48e":"nextPriceOf(uint256)","5bab1a63":"totalEthxRecieved()","5babb758":"testSetUp()","5babe01b":"distributedBountyStakes()","5bac1e11":"ReclaimBegun()","5bad05bd":"hardCancelOrder(uint224)","5bad9fa7":"walletOut2()","5badbe4c":"requestCount()","5badcd08":"TokenFulfillment(address[2],uint256[7],uint8,bytes32[2],uint256)","5badf100":"fireOnChanged(bytes32)","5bae2120":"test_doubleVotingFor()","5bae3f75":"CategoryAdded(uint256,string)","5bae4e98":"getOwnerRating()","5bae510d":"deposits(uint32)","5bae8c36":"isNewParent(address)","5bae9ce9":"blacklisted()","5baef4f3":"INCREMENT_RATE()","5baf039f":"add(address,address,address,address)","5baf4a09":"ausgroupTransfer(address,uint256)","5bafecf5":"calculateFloatingValue(uint256,uint256,uint256,uint256,uint256,uint256)","5bb0fa46":"RESERVE_EXCHANGE_SHARE()","5bb18362":"isReadyToBear(uint256)","5bb2b102":"registerNameCore(uint256,address,uint256,bytes32,bool,bool,uint8)","5bb31436":"transferKnightOwnership(address)","5bb3e5f6":"fixNoCallback(bytes32)","5bb41203":"test_oneAssert()","5bb447a8":"NOTtoken()","5bb47808":"setFactory(address)","5bb4df3c":"assignFrom(address,address)","5bb59815":"claimWarranty(string,uint256,string)","5bb5b917":"insureClient(address,address,uint64)","5bb5bb86":"dtGetBuildingData(address,uint256)","5bb7cf11":"ERC20(address,uint256,string,uint8,string)","5bba11bd":"bonusTicketsPercentage()","5bba3307":"splTransferFrom(address,address,uint256,uint256)","5bba6a7c":"propagateRequest(address,uint256,bytes32,bytes32)","5bba7aa5":"_assignBlocks(bytes16,bytes16,uint8,uint8)","5bbb7c42":"CPCEFund()","5bbdc7c5":"accrueTeamTokens()","5bbe66a7":"lastBlock_a15Hash_uint256()","5bbe6790":"Electronero()","5bbe8a33":"EGYPTTEST()","5bbee518":"investmentETH()","5bbf9c94":"arbLocked(address)","5bbfd0d7":"mintedGBT()","5bbfe9b6":"_myGroupHelper()","5bc008a0":"getAccessLevel(address)","5bc02d5c":"GooGameConfig()","5bc07110":"numArticlesPublished()","5bc0b4db":"ONESATOSHIToken()","5bc22d1b":"getStart(uint256)","5bc34f71":"currentStep()","5bc4e163":"drainRemainingToken(address,uint256)","5bc550fe":"mining(bytes)","5bc5c1a8":"getRoundDividendPerBBTHelper(uint256)","5bc5cf42":"mocatoken()","5bc60cfc":"win(uint256)","5bc6d41d":"doDisableSellerCancel(bytes16,address,address,uint256,uint16,uint128)","5bc6e107":"GetEscrowCreationDate()","5bc72460":"alterBannedStatus(address,bool)","5bc7285f":"sumICOStage3USD()","5bc789d9":"tokenVault()","5bc7e259":"updateRelease(uint32,uint32,uint32,bytes,bool)","5bc8a672":"setDetachmentTime(uint256)","5bc91b2f":"createRound(uint256,uint256,uint256,uint256)","5bc97d73":"Purchase(address,uint256,uint256,uint256)","5bca7f38":"set_pre_kyc_iconiq_bonus_numerator(address,uint256)","5bcabf04":"baseUrl()","5bcafcf3":"ProfitByCard(address,uint32)","5bcb2fc6":"submit()","5bcbc0f9":"PRICE_DIVIDER()","5bcc1072":"addressesToChatMessagesLeft(address)","5bcc209d":"getTokenAmountForEther(uint256)","5bcc29d7":"setDefaultURIStart(string)","5bcc437c":"revokePastDelegations()","5bcc7928":"saleType()","5bcc8198":"tokenCommissionReceiver()","5bcd3dba":"ACAToken(uint256,address,address)","5bcf6674":"setMinimumAllowedWei(uint256)","5bd1b8c5":"countCars()","5bd1f067":"OONE()","5bd26361":"sentTokensToPartner()","5bd2cc9f":"Notified(address,uint256)","5bd4349b":"getTotalGames()","5bd475fd":"destTokensDevs()","5bd479ac":"SoccerBet(string)","5bd489e1":"HelperPortion()","5bd54fa3":"setCryptoSagaCardSwapContract(address)","5bd5e89c":"decreaseArrivalTime(uint256,uint256)","5bd674dd":"gallerySeven()","5bd74490":"regProxy(address,address)","5bd7b9fd":"Rbank()","5bd7c609":"getEtherDiceProfit(uint256)","5bd7ebc5":"changeMinInvest(uint256)","5bd91213":"TransferKO(address,address,uint256)","5bd9279c":"placeBuyNowOffer(uint256,uint256)","5bd948b1":"useEIP712()","5bd9749c":"initialValidators()","5bd9abfb":"CreateTestCoin()","5bd9e637":"buyLC()","5bd9ea2e":"out5Done()","5bda1af0":"startCrowd(uint256,uint256,uint256,uint8,uint8)","5bda8fa4":"setSecondTime(uint256)","5bdaa6dd":"Token_Price()","5bdaeba2":"PausableTokenMock(address,uint256)","5bdb280f":"RESERVES_SHARE()","5bdb9ddf":"changeStepPricesLimits(uint256,uint256,uint256)","5bdc3c53":"setImmigrationCtrl(address)","5bdcc165":"batchTrasferByValue(address[],uint256[])","5bdcd0b0":"lifetimePayouts()","5bdf7b4f":"initilSupply()","5bdfaaff":"ASIABITSToken(string,uint8,string)","5bdff855":"gettotalCardDivs(uint256)","5be0497e":"getAdjacentCells(uint8)","5be1d5c3":"buyBlueStarEgg(address,uint256,uint16)","5be2aca0":"tokenRegistryAddress()","5be4d442":"setTrustedContract(address,bool)","5be53284":"GlobaleCash()","5be54515":"assignBountryToReferals(address,uint256)","5be5d9e3":"XdacToken(uint256)","5be5e3ec":"castVote(uint256,uint256,uint256)","5be60644":"sendcdd(address,uint256,address)","5be62401":"createUserWithProxyAndRecovery(address,address,uint8[],uint256,uint256[],uint256[])","5be6affc":"CloverCoin(address)","5be6d2eb":"exitPot()","5be782d1":"WORLDMOBILITY()","5be7cc16":"transferAdminship(address)","5be7fde8":"releaseAll()","5be80e85":"markCompromised()","5be89fac":"dAlterPull(uint96)","5be989d1":"CRYPTOBITECOIN(uint256,string,string)","5bea05b1":"getUSDBtc()","5bea0e1c":"calculateDividend(uint256,address)","5bea2941":"LYBT3Token(uint256,string,uint8,string)","5bea641a":"change_admin_commission(uint256)","5beb1d8f":"currentIcoPhaseMinimum()","5beb3f61":"WhitelistedStatusUpdated(address,uint256)","5bebe2c6":"getData_32()","5bebefdc":"checkForInterest(uint256,bool)","5bec1496":"ChangeQuota(uint256)","5bec9e67":"infinite()","5becf24c":"confirmChannel(uint256)","5bee29b7":"retrieveData(uint256)","5bee29be":"setSalary(uint256,uint256,uint256)","5bef1208":"getModuleIDByHash(bytes32)","5bef95a2":"setFiscalVerify(uint256,uint256,bytes32)","5befbb9b":"calceth(uint256)","5bf042e5":"setTradeAddress(address,address)","5bf0cb1f":"isTransferAllowedadv()","5bf1f2f8":"numberOfAbilitiesSold(uint256)","5bf2a4e9":"contains(bytes32,bytes32)","5bf339b1":"DogCore()","5bf3a315":"isTrustedContract(address)","5bf4063d":"minEthValue()","5bf47d40":"bntyController()","5bf5c29c":"_createHero(uint256,address)","5bf5d54c":"currentStage()","5bf608b8":"getBuyer(uint256)","5bf72bb1":"use_test_data()","5bf85c28":"CryptomniumChain()","5bf8633a":"nftAddress()","5bf95e43":"strategicAllocated()","5bf9755e":"setUint256(uint256,uint256)","5bfb1dab":"EIP20Token(uint256,string,uint8,string)","5bfb8ff2":"getRegistration()","5bfbbe39":"_transfer_internal(address,address,uint256,bool,bytes)","5bfc61c0":"claimPlot(uint256)","5bfd1ab8":"unBlockAddress(address)","5bfd8efe":"blockSettlementHash(uint64,uint64)","5bfdab26":"queryWithdrawed(uint256)","5bfdb8b2":"crowdsaleStartingBlock()","5bfdc700":"registerData(address,int256,bytes,address)","5bff1aa8":"EOSCToken()","5bfface4":"setBuyComission(uint256)","5c003af9":"TOKEN_WITHDRAWAL_END_DATE()","5c004bcc":"sendFrom(address,address,uint256)","5c006f75":"changeHoldByAddressIndex(address,uint256,uint256,uint256)","5c00ad5e":"ShowPercent(address)","5c0133d9":"filled()","5c016b91":"ownerDisablePayee(address,address)","5c01943a":"bountiesBalance()","5c0252fe":"setOnlineTime()","5c025e03":"authorizeOperatorByTranche(bytes32,address)","5c0286c0":"changeLOT(uint256)","5c0305ec":"EUTBToken()","5c042d0f":"BiQCrowdFund(address,address,address)","5c044b86":"roundThreeTime()","5c04e9f8":"firstXRChangeBlock()","5c062d6c":"currentDifficulty()","5c06d880":"getRateWithoutBonus()","5c071492":"hardCapLow()","5c0796fd":"emitUserCreated(address,address,address,address,uint8[],uint256,uint256[],uint256[])","5c07993b":"investorInterest()","5c07ac94":"changeCrowdsaleRate(uint256)","5c084a25":"get_pvn_token_balance(address)","5c0a8177":"claimOCDividend()","5c0a9b8d":"transferToContractAddr(address,uint256)","5c0b51fb":"theList(address)","5c0ba18e":"BitBoscoin()","5c0cc07a":"TAXChain()","5c0e6166":"Bill(address,string,uint8,string,uint256,uint256,uint256,uint256,uint256)","5c0e6bc4":"icoTokenPrice()","5c0f82b7":"GetIdByAddr(address)","5c0f9a3e":"getStrandGenesisBlockHash(uint256)","5c0fc34c":"freedomcryptotoken(uint256,string,string)","5c0fed8e":"EOBIToken()","5c100cc2":"setPreIcoDiscount(uint256)","5c1020f9":"addPhenomenon(string,string,string,string,uint8)","5c102782":"reward(address,uint256,string)","5c10286a":"auctionsEnabled()","5c1098c3":"crowdSaleOverTimestamp()","5c109a59":"updateStatus(address,address,uint256)","5c10b2e8":"contributionsAddress()","5c10cab8":"collected_crowd_wei()","5c10ec87":"preSaleDurance()","5c10fe08":"proofOfWork(uint256)","5c12a0e8":"DroneShop()","5c12cd4b":"getPlayer(address)","5c12f040":"emergencyWithdraw(bool)","5c131d70":"burnMax()","5c135535":"gooBalanceOf(address)","5c1397de":"signup(bytes32)","5c13a439":"checkAccount()","5c13d06f":"checkLockedToken()","5c13e2b5":"end_ICOs()","5c142f2b":"freezeAccountWithToken(address,uint256)","5c146b80":"_existCaller(address)","5c148b47":"calcClaimableTokens()","5c1548fb":"getCollateral()","5c164624":"decisionOf(bytes32)","5c1671a6":"hasSameArrayLength(address[],uint256[])","5c16e323":"__executeOrderInputIsValid__(address[4],uint256[8],address,address)","5c17f9f4":"approve(address,uint256,bytes)","5c19a95c":"delegate(address)","5c1b3a68":"setPrvdWallet(address)","5c1b3ca1":"getConfigUint(int256,bytes32)","5c1b9377":"TestBNB(uint256,string,uint8,string)","5c1b94d1":"publicGetRound()","5c1bc695":"addSubDivision(address)","5c1d2215":"mintTokensLocked(address,uint256)","5c1f71af":"setAllowBurns(bool)","5c206c6b":"FreeTokensIssued(address,address,uint256)","5c206f41":"finalValue()","5c207547":"wantsBusiness(bytes32,bytes32,address)","5c20ad9e":"multiValueBatchTransfer(address[],uint256[])","5c20c1dc":"distributePuppyCoinSmall(address[])","5c20eec6":"twentyThirtyTokens()","5c221385":"preciowea()","5c221816":"burnAccountMoeny(address,uint256)","5c222bad":"getAsset()","5c22aaae":"setGameTransferFlag(address,bool)","5c2323e7":"authorizedToTransfer(address)","5c239e58":"createItemSaleMarkets(uint256,uint256)","5c23bdf5":"resolve(bytes32)","5c242c59":"query1(uint256,string,string,uint256)","5c243f03":"GetLengthofList()","5c251cbf":"releaseStake(address,bytes32,uint256,uint256,uint256,bool)","5c253f52":"o_novo_problema(uint256)","5c25e903":"_lockNinja(uint256,uint16)","5c261556":"initFrozenTokenMap()","5c26a007":"IsEnable()","5c272fb2":"Unblocked(address)","5c27bbf6":"CryptoCompare()","5c27cdc3":"mintTeamTokens(uint256)","5c28c7e0":"privateSaleList()","5c2930ad":"shareholders(address)","5c2a8763":"percentageToReinvest(address)","5c2b0287":"BOXSToken()","5c2b1119":"getTop()","5c2b18e9":"VestingFund(address,uint256,uint256,address)","5c2bdc9f":"GainCard2(address,uint32)","5c2c2005":"issuePrice()","5c2c8db7":"withdrawToAddress(address,address)","5c2cc46d":"findResNameByAddress(address)","5c2ccaba":"GslStandardToken(uint256,string,uint8,string)","5c2d0e53":"KUNAsToken()","5c2e7a00":"setTokenBurnFeeProp(address,address,uint256)","5c2e7a13":"QuestionStore(address)","5c2e891c":"ECAP()","5c2eb1ef":"honestisFortbackup()","5c2ee908":"updateWinners(address[])","5c3004da":"getPpls(uint32)","5c30be8e":"callOracle(address,uint256)","5c314df0":"MINER_STAKE()","5c31f93b":"unpublish()","5c320516":"changeAmount(uint256)","5c32460b":"isAddress(address)","5c328e3d":"getMyAcceptance(address,uint256)","5c35b4e1":"exchangers(address)","5c35f464":"_modAccountBalance(bytes32,uint256)","5c361091":"PeerBetting()","5c36901c":"isActive(bytes32)","5c36a0bb":"collect(int32,int32)","5c36b186":"ping()","5c36e11c":"identified(address,address,bytes32)","5c37a17c":"saySomething(bytes)","5c390f82":"tokenEquivalent(uint256,uint256)","5c39b671":"sendOwnerCommission()","5c39c1ab":"collectedAddressesCount()","5c39ec58":"addClaim(address,uint256,uint256,bytes,bytes,string)","5c3a4c3d":"startRick()","5c3c8c87":"putHere()","5c3cd827":"allOfferingSupply()","5c3cdec8":"getTotalFeeStake()","5c3d005d":"demote(address)","5c3d6a7d":"setSaleAuction(address,address)","5c3dcfde":"listedTokensAsBytes(uint256,uint256)","5c3e38ee":"updateMinSpend(uint256)","5c3e426c":"adminRetrieveDonations(address)","5c3f9765":"endDateClose()","5c3ffada":"getPlayerCardIdsForTeam(uint256)","5c40329e":"setPresaleTime(uint256,uint256)","5c40839f":"GenevExch(address,address,address,uint256,uint256,uint256)","5c40f6f4":"setStatus(bool)","5c416306":"extractApprovedIndexLength()","5c417695":"burnMana(uint256)","5c4271c9":"issueDividendRewardBips()","5c42d079":"getProvider(uint256)","5c4301f2":"multiExecute(address[],uint256)","5c435396":"show_the_name_of_Option_D()","5c43fce3":"showteam(address)","5c44a837":"RemainingTokenStockForSale()","5c44c3e5":"addAdv(address,string)","5c45079a":"dropToken(address,address[],uint256[])","5c45872e":"_addCategory(address,uint256,uint256)","5c4633a4":"_revealNumber(address)","5c469570":"ReiDoCoinToken()","5c473764":"RESERVE_FUND()","5c474f9e":"saleStarted()","5c475676":"getProposal(uint256,bytes32)","5c47e306":"advisorsTokensPercent()","5c47ead7":"getParticipantData(address)","5c481d8b":"convertToWei(bytes32,uint256)","5c492129":"totalGamesPlayed()","5c49660a":"privateIcoTokensForEther()","5c4978e0":"getCurrentYearGameMiningTokenCap(uint256)","5c49d96c":"nTickets()","5c4a627f":"totalPreICOAmount()","5c4b4c12":"transferPreSignedHashing(address,address,uint256,uint256)","5c4bade1":"transferEtherTo(address)","5c4bfa10":"buyout()","5c4c9f6f":"WithdrawToken(address)","5c4d3609":"getTargetDesignatedReportNoShowsDivisor()","5c4e10e8":"sendLimitTokensToFounder(uint256,uint256)","5c4f4024":"tryRoundEnd(uint256)","5c4fb1c5":"comisionGetter()","5c5020e7":"setValidatorStake(bytes32,uint256)","5c50c356":"getTotalBonded()","5c50c63a":"isTokenTransferLocked()","5c511a2a":"OrphanWalefareToken()","5c5204d6":"changeOwnerTo(address)","5c52b434":"Boxicoin()","5c52bba7":"countParticipants()","5c52c2f5":"resetSpentToday()","5c52e51e":"processPayout()","5c53ec59":"setReasonableDiff(address[],uint256[])","5c54305e":"InsufficientFunds(address,uint256,uint256)","5c552879":"bytesToBytes8(bytes)","5c552fab":"getMetadataUser(address)","5c5557e7":"setKWHForGas(uint256)","5c561fff":"removeAllowedTransactor(address)","5c56afa3":"priorTokensSent()","5c58ad8e":"processDiceBet(uint256,uint256,int256,bytes32,bytes32)","5c590683":"SomeRegister()","5c5991d4":"token_ratio()","5c5a8ad5":"LogBid(address,address,uint256,uint256,uint256)","5c5b9f8f":"depositTokens(address,uint256,uint256)","5c5ce16e":"NXTokenCoin()","5c5d625e":"getProof()","5c5dc9a0":"embark(uint16,uint16,uint256)","5c5df66a":"setRequiredExpIncreaseFactor(uint32)","5c5e0aca":"setGrowingMaxPerDay(uint256)","5c5e20b6":"revertAuction(uint256)","5c5e274e":"mMaxChainCode()","5c5e54c9":"hasBothAttributes(address,bytes32,bytes32)","5c5f786e":"s4(bytes1)","5c5f7c5b":"setAdvisorsTokensPercent(uint256)","5c60da1b":"implementation()","5c60f226":"deleteUser(address)","5c612167":"newMultiService(address[])","5c613a03":"bountyReservedBalanceOf(address)","5c617279":"registeredApps()","5c61c853":"getProposalIndex(uint256)","5c61d628":"changeFundingLimit(uint256,uint256)","5c61f9b4":"getBlockResult(uint256)","5c6224c9":"Operational(address)","5c622a0e":"getStatus(uint256)","5c622c09":"getIsSendingLocked(address)","5c629788":"totalLevel(uint256[])","5c634241":"CanaryV6()","5c64bb72":"getCurrentSale()","5c658165":"allowed(address,address)","5c659bdb":"declareHanged(address,uint256[])","5c665f89":"getFunds(address,bool)","5c66bd58":"addWeapon(address)","5c67a5db":"approvalRatio()","5c67ae76":"PRE_COIN_PER_ETHER_ICO()","5c67dd1e":"getBlockRoot(uint256,uint256)","5c67f7b0":"transferFromTgefund(address,uint256)","5c68908b":"CategoryCatalog()","5c693657":"setMaxPower(uint256)","5c69d5d6":"completeOrder(bytes32,uint256)","5c6a0246":"fundsClaimed()","5c6a6edd":"bloquear_contrato()","5c6ae355":"removeAuthorizeduser(address)","5c6baf3d":"createProxyAddressFor(address)","5c6bcad4":"transferFromOrigin(address,uint256)","5c6bd930":"calculateBonusToken(uint8,uint256)","5c6c8903":"Buy(address)","5c6cad31":"storeCryptoNames(string)","5c6ce321":"RDT()","5c6e0ebf":"getScenariosInfo(bytes32,string,string)","5c6eb2d2":"atl()","5c6eb7ae":"withdrawStock()","5c707f07":"setName(string,string)","5c714e90":"starterPackPrice()","5c71ae10":"EEZOToken()","5c71dec8":"FreezeAdmin()","5c72b160":"invalidatePendingWithdrawl(uint256)","5c72de09":"BONUS_ICO_ROUND3()","5c7460d6":"userRegistry()","5c752f6b":"incGen0Count()","5c7584b9":"isEarlyInvestors()","5c75df30":"churn()","5c76ca2d":"paidOut()","5c770267":"RefundVault()","5c7713d4":"CountCow(address)","5c77582f":"changeTeamCosts(uint256[])","5c78f9e2":"getDepositorsTokens()","5c796720":"CurrentIceDelta()","5c7a281d":"HugsByMathou()","5c7ae6e3":"ethDivsOwing(address)","5c7b0288":"gemAttackConversion()","5c7b35f8":"resetTokenOfAddress(address,uint256)","5c7b79f5":"cashOut(uint256)","5c7b9ccf":"BASE_POS()","5c7c43fa":"maximumBuyBack()","5c7c49c9":"validateKey(bytes32)","5c7c9aa4":"checkAccountState(address)","5c7cbb0f":"_decode(bytes32,bytes32)","5c7d6425":"setPVPEntranceFee(uint256)","5c7f3d9a":"hatchMorties(address)","5c7f7f63":"getGrantees()","5c7fe08e":"PURCHASE_AMOUNT_CAP()","5c803f19":"alarmRaised(uint256)","5c803f36":"empties(address)","5c80461e":"isInStage1()","5c80b448":"setMatingSeason(bool)","5c810f09":"disableSellerCancel(bytes16,address,address,uint256,uint16)","5c812737":"payoutMultiplier()","5c8136c2":"retrievedTokens()","5c81662e":"internalMint(uint8,address,uint256)","5c81b8f9":"MIRCOOToken()","5c852231":"updateSizeBonus(uint256)","5c85267b":"PaymentChannel(address,uint256)","5c85974f":"setTxLimit(uint256)","5c8747cd":"getSoftwareVersionRecords(uint32)","5c87e40f":"SignatureCheckerChanged(address)","5c88da6f":"getUSD()","5c894469":"getPlayersByTrackId(bytes32)","5c89c10d":"setBannedCycles(uint256[])","5c8a1053":"extend(string)","5c8a694e":"FundableToken()","5c8a733a":"b32toString(bytes32)","5c8b94e7":"applyWithdraw(address,uint256,uint256)","5c8c02b3":"getWinnerById(uint256)","5c8cb8c0":"DBIPToken(uint256)","5c8cf750":"cancelTransaction()","5c8d1a6b":"setAtomMoth(uint256,uint64)","5c8e7376":"stageEco()","5c8fe438":"books()","5c908ee5":"DawnX()","5c90b9a8":"createRequest(address[3],address,uint256[12],uint256,bytes)","5c919aa3":"getDemurrageableBalance()","5c91cdfa":"createPenguin(string,uint256,uint256)","5c91fa67":"test_3_assertGasUsage200Boards()","5c92abfd":"GameVerified(bytes32)","5c9302c9":"currentDay()","5c9442a1":"addAdminList(address[])","5c97404a":"domainPrice()","5c975abb":"paused()","5c978499":"checkValidityOfBalance()","5c979fe4":"setRegistrar(uint256,address)","5c97efd6":"updateIcoStartTime(uint256)","5c97f464":"WNTOToken()","5c9920fc":"vaultClosed()","5c9a7a8b":"getCarType(uint256)","5c9b62b4":"comprarSala()","5c9c5a6f":"checkGameIndex()","5c9cc81f":"getFundDetails(address)","5c9d0fb1":"CROWDSALE_ALLOWANCE()","5c9d4528":"mainCapInWei()","5c9fa6ad":"bidSpread(bytes32,bool,int32)","5ca11c34":"minSalePrice()","5ca177cb":"LINK(uint256)","5ca1bad5":"CallScheduled(bytes32)","5ca1c5a0":"getNodeValue(bytes)","5ca1cacc":"changeMinEth(uint256)","5ca1e165":"getRoot()","5ca20102":"_checkPixelUnderRight(uint256)","5ca21490":"BitMilleCrowdsale()","5ca26ff9":"updateGuPhrase()","5ca3400c":"WithBeneficiary(address)","5ca3bf76":"setSendErrorValue(address,uint256)","5ca48d8c":"tokensLocked(address,bytes32)","5ca4d4bb":"disableScriptExecutor(uint256)","5ca5b054":"metherToken()","5ca5b334":"enableManager(address)","5ca6fa4a":"Nostradamus()","5ca7f2f0":"LivepeerVerifier(address,address[],string)","5ca81139":"createOnDay(uint256)","5ca86447":"put(address,uint256,uint256,uint256,uint256)","5ca8bc52":"returnIt()","5ca8e2ad":"ModultradeStorage()","5ca91d7f":"faddress(address)","5caa0dec":"currentSeries()","5caaa536":"confirmReference(address,uint256,uint256)","5caabecf":"transferFromWithReservingNet(address,address,uint256)","5cac0176":"MJT()","5cac79b2":"LockedCrowdSale(address)","5cac8b27":"amazing()","5cacdf29":"testChickenCnt()","5cad249c":"getLastWinNumber()","5cad7cfb":"getCrowdsaleStatus()","5cade372":"payAllOut()","5cae7767":"removeTrustedPartner(address)","5caed029":"tokenDecimal()","5cafbafb":"newMember(address)","5caff1a7":"Criptolira()","5cb047e8":"toInt(bytes,uint8,uint8)","5cb0887c":"contractExists(address,address)","5cb0c16f":"totalInCirculation()","5cb10016":"offchainSale(address,uint256)","5cb1470e":"_createRabbitInGrade(uint256,address,uint8)","5cb18a6d":"fipsLegacyRegisterMulti(bytes20[],address,bytes)","5cb24756":"unitEthWei()","5cb2d86e":"totalBlockContribution(uint256)","5cb2ffb5":"updateMinCapEthOnce(uint256)","5cb318bf":"unregisterUser(address,address)","5cb3ce15":"calculateMemoryState(uint256)","5cb4502c":"SCORE_TO_WIN()","5cb4f548":"partnerInfo(address)","5cb5de63":"recReward(uint256,uint256)","5cb603dd":"_getYearIndex(uint256,uint256,uint256)","5cb7226d":"prePreIcoStartAt()","5cb732be":"refundToken()","5cb7dd98":"BlueChipGame()","5cb85cd2":"changeCost(uint256)","5cb8dd09":"isAllowed(address,bytes32)","5cb92dc7":"_enableRefunds()","5cb9ceaa":"okAddress(address,address)","5cba658f":"setState(address[],uint256[],address,uint256)","5cba6caa":"notarizeHash(uint256,string,string,bytes32,string,string,string)","5cbaa74b":"canAttack(address)","5cbad0b5":"sumHardCapICOStage1()","5cbb122c":"transferBctToken(address,uint256)","5cbb2ac3":"purchaseTokenPointer()","5cbb7caa":"getFriends(address)","5cbbdfc9":"currentApplicationEntityAddress()","5cbc65b2":"getplayersurplus()","5cbc85d0":"returnBounty(uint256)","5cbcb302":"pre_ico_allocation()","5cbdf177":"emailVerified()","5cbe5f8f":"DIV_DIST()","5cbee9ba":"releaseLockedTokens(address)","5cbf0850":"BTN()","5cbfdd8d":"preBuy(address,uint256,bool)","5cc15001":"getContent(bytes32)","5cc18780":"StabilizationFund()","5cc1ad7f":"toTileId(uint8,uint8)","5cc2e6aa":"getFirstAuctionsRemainingDuration()","5cc2f6d8":"_processPurchaseInWei(address,uint256)","5cc3623a":"currentSection()","5cc373c7":"TestJ()","5cc39659":"preSaleBonus2Amount()","5cc3c951":"purchase_with_dai(uint256,address,uint256,uint256,uint256,address,bytes)","5cc3f5d7":"Deauthorization(address,address)","5cc41dad":"initiateCertificate(bool,string,uint256,uint256,uint256,uint256)","5cc422a1":"sumofsquares(uint256,uint256)","5cc501ce":"testFailSetNotTransferableNotOwner()","5cc52fba":"claimTokensBC(uint8)","5cc57501":"_computeHeight(uint256,uint256,uint256)","5cc5c5cf":"jackpotDifficulty()","5cc5ca50":"formulaContract()","5cc8a6ed":"PRE_SALE_4WEEK_BONUS()","5cc8ce33":"dev_settledBalance()","5cc95422":"getVestingReleasedAmount(address,address)","5cca3905":"getDeveloperMiningPowerForGameId(uint256)","5ccb4f8f":"UmbrellaCoin()","5ccb5460":"ethInvestedDuringICO()","5ccb54c4":"BGD()","5ccbddeb":"IcelandvsCroatia()","5ccc3eaa":"roundMoneyUpToWholeFinney(uint256)","5ccd2f9b":"_deleteAllPackedRevisionBlockNumbers(bytes20)","5cce7dbb":"removeHolderAddress(bytes32,address,address)","5ccee1de":"newValidatorSet()","5ccf49ed":"isGenome()","5ccf9f43":"BonusCrowdsaleMock()","5ccfe157":"getDataById(uint8)","5cd03621":"periodRound()","5cd03a3f":"removeIdArrayItem(address,uint256[],string,address)","5cd137b4":"LogDonation(address,string)","5cd27e8d":"init3(int256[],int256)","5cd2f4d3":"approve(address,bytes32)","5cd31795":"HavenToken()","5cd31e83":"LastWillContract(address,address[],uint8[])","5cd3b917":"numberOfDeployedTokens()","5cd3f3a1":"decompress(bytes)","5cd42150":"KY8000Token()","5cd45e61":"getUuidsSize()","5cd48caa":"bet(uint256[],address)","5cd50b3f":"quater2()","5cd60dad":"add(address,int256)","5cd689e6":"sell_label(address,uint256)","5cd6bd0e":"getPlayerDividendByStage(uint256,uint256,address)","5cd72340":"SetEpochData(address,uint256,uint256)","5cd72b15":"setAllowedMultivest(address)","5cd7815b":"testInternalCall()","5cd7c8bc":"createLastDay()","5cd7d478":"isYesWinning()","5cd82ee5":"Act()","5cd85187":"MIN_ETHER()","5cd87c71":"supportsTradingPair(address,address)","5cd8d2ad":"buyAndTransfer(uint256,address,address)","5cd925cd":"assetSize()","5cd96091":"enable_refunds()","5cd9814f":"Mybalance()","5cda31dd":"GTN()","5cda4b41":"checkApproval(address,address)","5cdaab48":"previousEpoch()","5cdb0798":"burnMemberToken(address)","5cdb1bd7":"setRefundPercent(uint256)","5cdb88bc":"addClaim(string,string,uint256,string)","5cdbd2d1":"Constructor(string)","5cdc9eda":"peggedETHUSD()","5cdcf33d":"milieurs_per_eth()","5cdd7560":"STEToken()","5cdd95e3":"MintableToken(uint256,address,bool)","5cddb74b":"becomeShitClonelord()","5cddd93d":"referalsMinInvestLimit()","5cde15b9":"_Application(bytes32,uint256,string)","5cdf3450":"changeParticipationLimits(uint256,uint256)","5cdf76f8":"setServiceFee(uint256)","5cdfd08c":"managementFees()","5cdfe733":"fastBuyBonus()","5ce1d810":"SmartN()","5ce22019":"getEtherInContract()","5ce2fea1":"CleosContract()","5ce308a7":"addEntry(string,string)","5ce32aca":"getAirdrop(bytes32)","5ce398c4":"Riddle()","5ce3dec1":"self_destruct()","5ce49fbf":"amountBets()","5ce4f8dc":"PoWHrGlass()","5ce57b50":"setPenalizedStatus(uint256,address,bool)","5ce5ba9b":"queryParent()","5ce62aa4":"checkStoredFile(address)","5ce7514e":"allowPublicWithdraw()","5ce75c7c":"PRESALE_SECOND_DAY_START()","5ce7c7e0":"tokenSetCrowdsaleManager(address,address)","5ce800ac":"user_off_freeze()","5ce8050f":"BuildCoinUtilityToken()","5ce83f70":"updateEndsAt(uint256)","5ce885ee":"initial_withdrawal(uint256)","5ce94328":"balanceOf(uint152)","5ce97dbb":"totalAirdrop()","5ceaa0bf":"modifyCurrentHardCap(uint256)","5ceb8bc8":"isPromoPause()","5cebcbf0":"setMaxGamePerBlock(uint256)","5cec2054":"dteamVaultAddr1()","5cec4cb9":"fundsTokensHaveBeenMinted()","5cec5ded":"balanceComisionOf(address)","5cecd728":"setWillContents(address,bytes)","5cedff32":"takeTokensForBacking(address,uint256)","5cee9ea7":"buyNew(uint256,uint256,uint256)","5cef51a6":"BdpDataStorage(bytes8)","5cf00394":"getResoPeriod()","5cf054f8":"SetRewAddr(address)","5cf0769c":"ETHERCOIN()","5cf28fa4":"minDai()","5cf29ecf":"forOwner()","5cf2befc":"getEthAddressesLength()","5cf2f261":"ProofOfBitconnect()","5cf3125c":"NASDAQ()","5cf34bcf":"getMinFee()","5cf3508a":"whiteListControllerAddress()","5cf38f24":"togglePlotBlockedTag(uint256,bool)","5cf3cd96":"payNode(bytes32,bytes32)","5cf3d346":"names(address)","5cf469ca":"tokenPreSaleCap()","5cf4ee91":"getPrice(uint256,uint256)","5cf5ad2e":"registerNameCore(uint256,address,uint256,bytes32,bool)","5cf5e386":"guardian2()","5cf6040b":"ERC20Token(uint256,uint8,string,string)","5cf6208a":"oraclizeTimeTolerance()","5cf625f0":"OffChainManagerImpl(address,address)","5cf6a536":"InternetWall()","5cf6a763":"receiveApproval(address,int256,address,bytes)","5cf858aa":"TOKEN_ESCALE()","5cf89f1e":"setDateRelease(uint256)","5cf8ca60":"isCase(uint256)","5cfa353a":"updateTotalGasCost(uint256)","5cfae3ba":"UNPC()","5cfaf2ef":"setNameTAOPositionAddress(address)","5cfb4aa4":"getMessageTimestamp(uint256)","5cfbcdbb":"committedEther()","5cfc1a51":"capacity()","5cfc53c1":"calculateForValue(uint256)","5cfc6432":"EcosystemPart()","5cfd5f89":"product4_pot()","5cfd8c24":"ResetPonzi()","5cfe237a":"TCGC(address)","5cfea6fb":"TokensPerWei()","5cff876b":"carrotsCaught()","5d000c07":"getFreeFuck()","5d004e85":"getCommentsCountByAd(uint256)","5d01615f":"queryFusionData(uint256)","5d01b261":"_placeBet(uint256,address)","5d0213f7":"transferTokenOwnerShip(string,address)","5d029d1e":"indexedByTag(bytes32,uint256)","5d02b2f7":"hasPresaleEnded()","5d03147a":"ownership()","5d0341ba":"approvals(address)","5d036c8b":"payEther(address[],uint256[])","5d0413d1":"calculatePlotPrice()","5d04af9c":"iMMCoinbuyPrice()","5d064bab":"MoreGainCoin(uint256,string,string)","5d068051":"sendFees(address)","5d06a05c":"lockupAccounts(address[],uint256,uint256)","5d0792b7":"minimumInvest(uint256)","5d0808f2":"listedMartialsLength()","5d08225e":"getGidOfId(uint64)","5d088fc6":"changeRandomFight2DeathContract(address)","5d08c1ae":"salePaused()","5d09e625":"setMustSkipFee(address,address,bool)","5d0a740a":"GetSeries()","5d0a7628":"lockPresaleBalances()","5d0ad8d0":"testFail_set_owner_unauth()","5d0b6774":"counterFor(address)","5d0be9de":"softWithdrawRevenueFor(address)","5d0c0161":"IXCASHToken()","5d0cb15d":"TOKEN_SALE_SUPPLY()","5d0dd712":"bet_amount()","5d0e550a":"safetyModeOn()","5d0ef098":"burnUnsoldCoins()","5d0f4ee0":"isChampionAccount(address)","5d108ca2":"TokenChanged(address)","5d109aea":"maxResult()","5d10a60d":"createPost(string,string,bytes32)","5d113b03":"PayWinners(uint256,address)","5d121289":"addPreSaleEndDate(uint256)","5d123014":"setGameTax(uint8)","5d12ace4":"playGame(uint256,uint256,uint256)","5d12fc0c":"ONE_BILLION()","5d14076c":"lowercaseString(string)","5d145c5b":"setIcoTimeStartEnd(uint256,uint256)","5d14f925":"Invested(address,uint256,uint256,string)","5d15001e":"SupplyOp(uint256,uint256,uint256)","5d15b46a":"emitSkillCategoriesSet(address,uint256,uint256)","5d161310":"DataMining()","5d161c3f":"useAbility(uint256)","5d16a6f9":"lockedBalances(address,uint256)","5d16b8de":"take_back_money()","5d183b60":"supplyRound2()","5d184107":"AddCategory(string)","5d19212e":"markUserAsFounder(address)","5d19606e":"transferIssuer(uint256,address)","5d19a99f":"isLimitReached()","5d1a3b82":"getOutcome(bytes32)","5d1b45b5":"getEntityCount()","5d1b56c4":"TestUser(address,address,address,bytes32)","5d1bd962":"getArrayValue(uint256)","5d1be4e5":"deathData_f14()","5d1be58e":"pecunioToken()","5d1c01e0":"signedApproveAndCallCheck(address,address,uint256,bytes32,uint256,uint256,bytes32,address)","5d1c3171":"luck()","5d1c985b":"setReceivers(address,address,address)","5d1ca631":"getId()","5d1ce03f":"tokensRaisedDuringRound(uint8)","5d1e2d1b":"split(address,uint256)","5d1edfa0":"checkContributedETH(address)","5d1f8098":"RoshaanCoin()","5d200f84":"GetPlayer(uint256)","5d201596":"getCategoryInfo(address,uint256,uint256)","5d202249":"totalCollectedETH()","5d204869":"slice(bytes,bytes,uint256,uint256)","5d208872":"setTimesEnabled(uint8,bool)","5d216562":"changeLockTransfer(bool)","5d2195dc":"getToBalance(uint256)","5d2230d7":"numfails()","5d2247a5":"stakeAirdrop(uint256,bytes)","5d228eb0":"getProviderDetailFields(uint256)","5d22a352":"manualWithdrawToken(uint256)","5d22e222":"BTCAir()","5d2392d6":"latchContract()","5d239d3e":"getSlice(uint256,uint256)","5d240c58":"addExperience(uint256,uint256)","5d2434ec":"transferFromTangibleassetdisbursementfund(address,uint256)","5d25d021":"withdrawForeignTokensMultiple(address,address[],uint256)","5d267042":"PointlessToken()","5d268629":"Refund()","5d2694da":"BlackPearlETH()","5d270cdc":"setExpectedRate(address)","5d272468":"isLiquid()","5d27976a":"Final(string,string,uint8)","5d27bff3":"registerWithEncryption(string,string)","5d27e9a6":"SEPARATOR()","5d281384":"_isValidSignatureAndMethod(address,address,bytes)","5d285eca":"preICOspecial()","5d29206b":"createTokenEscrow(address,uint256,address)","5d293581":"ApplyForCertification(string,string,string,string,uint256)","5d2946f5":"futDevAddr()","5d295f67":"maxDGAME()","5d2973cd":"applyVIPLevel(address,uint256)","5d29bd40":"rollThree(address,uint8,uint8,uint8)","5d2a5d3d":"sentPreSaleTokens()","5d2a70a8":"getActualFee()","5d2a9b6a":"_randomIndex(uint256,uint8,uint8,uint8)","5d2aa757":"getSides(string,uint256)","5d2b811d":"getLastRegisterDate()","5d2bafed":"gee()","5d2c0af2":"Invest(address,bool,uint256,uint256,uint256)","5d2c53a7":"withdraw_funds(uint256)","5d2cce82":"LemonsDroppedToTheWorld()","5d2d5c37":"registered(string)","5d2dc5fa":"FraCoinAuct(string,uint256,address)","5d2dec87":"PRNG(address)","5d2fea9d":"reissuedTransactions(uint256)","5d302ba1":"UpgradeAgentEnabledToken(address)","5d306f34":"getRefundAmount(address)","5d307c6f":"giveToVoter(uint256,uint256)","5d3171d9":"transferFromPrivileged(address,address,uint256)","5d31c3bc":"deliveryApprove(address)","5d3235bd":"NutrioCoin()","5d3278f0":"LooneyFifty()","5d337b01":"largeSize()","5d3458ea":"DolToken()","5d346bd6":"addSaleOwner(address)","5d34b70c":"LavaDeposit(address)","5d354b4d":"foundingTime()","5d355804":"endPtopDeposit(address,address,bytes32)","5d359fbd":"transfer(address,uint64)","5d35a3d9":"approve(uint256,uint256)","5d3601d2":"_isRegularAddress(address)","5d36a791":"PartyToken()","5d36d182":"recycle(address,uint256)","5d37c840":"level_4_amount()","5d383eaa":"registerTokenPayment(address,uint256)","5d385031":"getCustomerTxOrigMcwTransfer(address,bytes32)","5d3899af":"place_to_push(uint256,bytes32)","5d397767":"publicBattlepm1()","5d3a08d7":"setNodePhases(address)","5d3a1f9d":"setText(string)","5d3a5e3b":"teamTokenAddress()","5d3a70f9":"YayyyToken()","5d3aac49":"PublishInterfaces()","5d3afb19":"CNYB()","5d3b2f37":"getNextGameId(address)","5d3bb19e":"XXXXXXXX09()","5d3c1d4c":"_getRequest(uint256)","5d3c7c9b":"AGASCrowdsale()","5d3c81a5":"feeWithdrawTokenAmount(address,uint256)","5d3ca4ab":"lotteryReinvest(string,uint256)","5d3cd79f":"endPrivateICO()","5d3d08a8":"cancelExchange(uint256)","5d3e64bf":"ttlPlayers()","5d3f4fe4":"withdrawMyTokens()","5d3fdd19":"updateDiscount(uint256)","5d40124e":"YunJiaMi(address,address,address,uint256,uint256,uint256)","5d40533f":"AnemoiToken()","5d40c0ae":"createAccessorySeries(uint8,uint32,uint256)","5d41363f":"rateRound1()","5d416cc2":"setIsTokenCanBeBuy(bool)","5d41dd6f":"ExampleToken(address[])","5d42513b":"test_withdraw()","5d428e08":"addTrader(address)","5d4293a0":"hatchPoohs(address)","5d439cf3":"transferEvent(address,address,uint256)","5d43e769":"batchTransfer(uint256,uint256[])","5d444ffb":"minMintingPower()","5d4453ba":"getGuess(address,uint8)","5d449d7d":"refererFeePercent()","5d44b508":"calculateRewardToWithdraw(uint32,address,address)","5d450bab":"setJobRating(address,uint8,uint256)","5d451a9a":"Wallet8()","5d4521dd":"updateWeedTotal(uint256,uint16)","5d452201":"ico()","5d4559ca":"get_coins_count()","5d45b4a7":"increaseMonthlyTransactionVolumeSending(uint256)","5d461de5":"sendAmount(address,uint256)","5d4626f6":"getInvoiceStatus(bytes32)","5d468d38":"releaseAuctionEnded(uint256)","5d47762d":"Member_AssingTokensToProject(uint256,uint256)","5d47f4f2":"CanHandleAuth(address)","5d484e17":"StaticEthAvailables()","5d485e5d":"_hostContent(address,bytes32,string,string,string)","5d495aea":"pickWinner()","5d49705b":"getEmployer(address,uint256)","5d49719d":"SHA3_512()","5d49c199":"finishPreSale2()","5d4a8f74":"ATTRToken()","5d4aaf1c":"registerWithUserAgreement(address,bytes32)","5d4befc0":"emitSynthAdded(bytes4,address)","5d4c5cca":"participantsForPreSale(address)","5d4d061e":"keyValueStorage()","5d4dda72":"DirectInput()","5d4e1e5c":"substract(uint256,uint256)","5d4f012b":"tgeCurrentStage()","5d4f30e7":"get_address(address)","5d50601b":"getsumdata1(bytes32)","5d506a2e":"minPotSum()","5d51b550":"haltCrowdsale()","5d52fe64":"buyRemaining(address)","5d54322d":"canPurchase(address,uint256)","5d5483b3":"WatchAppliedFeePercentage()","5d54cb1f":"is_transfer_allowed()","5d54e612":"whitelistAll()","5d552c72":"BasicToken()","5d5576f8":"renounceCapper()","5d56550a":"buyCore(address,uint256,string)","5d5655dd":"BOOKIE()","5d567259":"bobMakesErc20Deposit(bytes32,uint256,address,bytes20,address,uint64)","5d56e0a4":"developerMiningPower()","5d57135a":"KEBABER_TO_MAKE_1KEBAB()","5d582870":"requestInvestment(uint256,uint256,address)","5d585176":"GolemSupply()","5d586bfd":"deposit(string,address,uint256,string)","5d59072a":"OFFICAL_VOTING_DAY_OF_MONTH()","5d593462":"init(address,address,string,string,uint256,uint256)","5d5a1614":"STQCrowdsaleTestHelper(address[],address,address,address)","5d5aa277":"tokenSaleContract()","5d5b35f3":"dividendsTotal()","5d5b82fd":"Blockjack(address,address)","5d5b9021":"acceptTradeOffer(uint256)","5d5b92b1":"teamOneSharePrice()","5d5bc4cb":"BetOnRed()","5d5c3011":"ctyCoin()","5d5c606f":"DAOPolskaTokenICOregulations()","5d5d4fab":"TACTICALCRUISER_EXTRACTION_BASE()","5d5e22cd":"transferFromWithSender(address,address,address,uint256)","5d5e507b":"create_price()","5d61dd5a":"removeSingleAddressFromWhitelist(address)","5d62917b":"pickWinners(uint8,address,address,address,uint8,uint8,uint8)","5d63b758":"minAcceptedETH()","5d63b77c":"divideSafely(uint256,uint256)","5d644069":"request_face_proof(string,address)","5d6470a4":"STAGE_1_TIME()","5d64aa68":"dragonIndexToOwner(uint256)","5d651b62":"TimeLockSendCreated(address,address,uint256,address)","5d6542af":"way()","5d65432d":"IndorsePreSale()","5d65c37b":"Assessment(address,uint256,uint256,uint256,uint256)","5d666d3c":"getRurus(string)","5d667464":"usePrecompiledContracts(bytes32,uint8,bytes32,bytes32)","5d66ccf0":"updatePerSell(uint16,uint256,bool)","5d66d73f":"notarizeHash(uint256,string,string,uint256,bytes32)","5d671fc0":"switch_period()","5d6720b4":"getFreeMineral(address)","5d67830a":"doLogFighter(uint32,uint256,uint256)","5d685185":"periodITO_softCapInWei()","5d68564e":"ZontoToken()","5d6952d7":"changeSaleStartBlock(uint256)","5d69864e":"Bitscors()","5d69d600":"presold()","5d69f16f":"offerAsSacrifice()","5d69f68c":"getVotersName()","5d6af2af":"getOffChainRootAddress()","5d6b2f26":"destroyAllTokens()","5d6b70ae":"getSignedTable()","5d6b7798":"BCQ()","5d6c3ea7":"mined_coin_supply()","5d6c8e10":"getDHash(bytes13)","5d6cb67e":"ecosystemTokenSupply()","5d6cdfae":"EthereumPot()","5d6ceeb5":"returnMoneyToBuyers()","5d6d2992":"ownFiles(address,string,string)","5d705fe2":"MBCashSupply()","5d711db1":"get_candidates()","5d718818":"getHolderCountryCode(bytes32)","5d71cf46":"spendableAllowance(address,address)","5d723298":"PartialPayment(address,address,uint256)","5d728582":"hasAuthoritySignedSideToMain(address,bytes)","5d72b30d":"changePlayerName(uint256,string)","5d73e2bf":"startPlay(bytes32,uint8,bytes32,bytes32)","5d740d62":"YFJToken()","5d751443":"updateWebappMinBalance(uint256)","5d760b45":"forceWithdrawPayments(address)","5d766d35":"INITIAL_GLOBAL_DAILY_SUPPLY()","5d76a039":"PresaleReStarted()","5d771933":"BOUNTY_SUPPLY()","5d777893":"GetPlayers(uint8)","5d77aec8":"receiver3()","5d77d8d0":"getBlacklist(address)","5d78650e":"getAccountData(address)","5d796c05":"mintAuditCancel(address,address)","5d79eda7":"Digixbot(address)","5d7a6b10":"nextDerivativeTokenScheduled()","5d7b0758":"controllerMint(address,uint256)","5d7c3ad2":"ICO(address,address,uint256,uint256,uint256)","5d7c3b78":"costructor()","5d7c829d":"_messageToRecover(address,uint256)","5d7cf3e2":"Meltdown(uint256)","5d7e6b8d":"Schengencoin()","5d7e7219":"setFeeFor(address,uint128[2])","5d7e8c15":"ethToCents()","5d7e994a":"RewardStart()","5d801ec4":"SetmaxTokens(uint256)","5d80effc":"TimeBonusPricing(uint256[])","5d80f643":"Kujira()","5d818e6b":"recordDeal(uint256,address,uint32,uint32,bool,uint256)","5d81b206":"P3NGCT_v1(uint256,string,string)","5d8214db":"lastFactChangeValue()","5d8227e6":"FactoryBase(string,string,string)","5d82ddc8":"freezeEnabled()","5d8302f2":"CrypTollBoothToken(uint256,string,uint8,string)","5d831ca1":"FUT5()","5d8749ed":"workStages(uint256)","5d878b4f":"isInWhitelist(uint256,address)","5d88383e":"retrieveEth(address,uint256)","5d891d12":"foundersTokensWalletMaster()","5d895dac":"parse(string,uint256)","5d89c01a":"getCatIds()","5d8a776e":"award(address,uint256)","5d8aef9f":"_calculateLockedBalance(address,uint8)","5d8bc2a8":"assertEq12(bytes12,bytes12,bytes32)","5d8c5b87":"orderPlace(address,bool,uint256,uint256)","5d8ca2ac":"getApprovalsFor(address)","5d8d1585":"getUserInfo()","5d8d2904":"setKeyPermissions(bytes32,bool,bool,bool)","5d8d4415":"rawUseName(bytes32)","5d8dd304":"founderTokensAvailable()","5d8e0c2c":"isManualTradingAllowed()","5d8e7376":"DAOBalanceSnapShot()","5d8e772f":"gameCore(uint256,uint256,uint256,bytes32)","5d8f2640":"store(bytes32,bytes32,bytes32)","5d8f3b76":"createPercentageRequest(uint256)","5d90df32":"TRONIX()","5d9169f0":"ICO(address,address,address,address)","5d91e27b":"MVM24PeriodsCapUSD()","5d92e5d2":"ipyh()","5d946afa":"trashed(address)","5d94e35c":"contractRefundStarted()","5d94f108":"platformLogout(address,uint256)","5d956b3e":"changeGroveAddress(address)","5d95738b":"vHasVoted(uint256,address)","5d95a08b":"MizuCoin()","5d969f8f":"updateCustomerACC(address,address,address)","5d96ec65":"setAdministrator(address,string,bool)","5d975d70":"mx(bytes32)","5d977c02":"withdrawalFor(uint256,uint256)","5d9796eb":"WELTCOIN()","5d989a0c":"NyronChain_Crowdsale()","5d98d9ee":"ChannelCreated(string,address)","5d98fd9f":"Presale(address,address)","5d990791":"getDenominationByIndex(uint256)","5d99e02f":"myPinerTokenTest1()","5d9adc94":"withdrawPendingTransactions()","5d9c4f0f":"getFeeRecipient(address)","5d9d595c":"sendWingsRewardsOnce()","5d9d5b9a":"CreatedCAT(address,uint256)","5d9d8dd9":"makeupShiny(uint256)","5d9ec210":"signTransaction(uint256)","5d9fa6fc":"getContractBal()","5d9fd8b0":"listPersons()","5da01a5b":"configure(bytes32,bytes32,uint256,uint256,uint256,address)","5da03ff8":"EthergotchiOwnershipV2(address)","5da05e2e":"setCoinLimit(uint32)","5da08c42":"createSeedTeam(uint8,uint256[9],uint256[9])","5da0a987":"Run()","5da12d50":"Oduwacoin()","5da24f90":"closeTimer()","5da34093":"bonusRemain()","5da3d3d2":"minHEXCap()","5da47721":"getVIPLevel(address)","5da4a1d3":"setPercentage(uint256)","5da54cee":"DragonCrowdsale()","5da5a9b1":"ownerUpdateMinMaxNumber(uint256,uint256)","5da5f5ab":"Distribution()","5da6628a":"transferExt(address,uint256)","5da6bf67":"movePlayer(uint8[176],uint8,uint8,uint8)","5da6c418":"burnMintFrom(address,uint256)","5da6e035":"_openAndJoinCDPWETH(uint256)","5da6ec5b":"t8exToken()","5da85a16":"setCEx(address)","5da89ac0":"weiRefunded()","5da96520":"transferTeam2Tokens(address,uint256)","5da9781b":"readUint256s(bytes32[])","5da99f5e":"upgradeCardDamage(uint256)","5daa0c37":"referrerLinkedSales(bytes32)","5daa87a0":"Initialized()","5daab236":"runIco()","5dab2e0f":"left82(uint256)","5dac1601":"SimpleStablecoin()","5dac48bb":"approvePreSignedHashing(address,address,uint256,uint256)","5dac5682":"removeAuthorization(address,address)","5dac7044":"checkHardCap(uint256)","5dacf084":"THACO2()","5dada964":"expectedRateContract()","5dadf485":"takePosition(uint256)","5dae4e50":"makeItRain()","5daf08ca":"members(uint256)","5daf7514":"redeemTokens(uint256,uint256,bytes32[])","5daf8a71":"DestroyToken(uint256)","5db07aee":"mintFeeDenominator()","5db09db5":"getSplitPotAsFixedPointForGameId(uint256,bool)","5db17dab":"CDTToken(uint256)","5db2a233":"awailableDividends(address)","5db30bb1":"getMaxTotalSupply()","5db38c63":"nDemocs()","5db39a1e":"totalFails()","5db39d74":"HayaCoin()","5db3f963":"registerSimple()","5db3ffa5":"getUBetCheck(address,address)","5db42841":"createContractGameItem(string,uint256)","5db46961":"proxyExchange(address,uint256,string,bytes32)","5db4cd21":"ir()","5db524ad":"finishDividends()","5db5301f":"unsubcribe(address)","5db5d1fb":"startTimeTLP2()","5db5fc24":"alterInitialPricePerShare(uint256)","5db62dab":"getBalanceForUser(bytes32)","5db6687b":"Dev_TokenReleased()","5db6a31f":"transferBroker(address,uint256,uint256)","5db7ef3d":"intoverflow_mul(uint256)","5db8e202":"evaluateProposalAction(uint256)","5db8f084":"getNeighbourReward()","5dbb0ef8":"TuZaiCoin(uint256,string,uint8,string)","5dbbd139":"CentraSale()","5dbbfc47":"getMaxLoss(address)","5dbc374f":"UBCoin()","5dbe47e8":"contains(address)","5dc10a45":"whitelistMultiForTier(uint256,address[],uint256[],uint256[])","5dc11a89":"setNumTicks(uint256)","5dc1ba1b":"closeLotteryAndPickWinner()","5dc1bb52":"removeLocked(address,uint256)","5dc1c79d":"KANYE()","5dc2157d":"getBalancesOfAddress(address)","5dc22cce":"attackPlayer(address)","5dc2944a":"ratesForCurrencies(bytes4[])","5dc3d02d":"rc5()","5dc43f6e":"AddAuthority()","5dc49bf8":"SellENSCreated(address)","5dc4d8a6":"proposalTarget(uint256)","5dc4dcd1":"TicketPurchased(address,uint256,uint256,uint256,uint256)","5dc54308":"KickSportsManager()","5dc5aefe":"startIncentiveDistribution()","5dc6bfe4":"distributeLRN(address[],uint256)","5dc6f3df":"registerNameCore(uint256,address,bytes32,bool,bool)","5dc70cda":"_shareToPreviousOwner(address,uint256,uint256)","5dc774d7":"DrawingPrintToAddress(uint256)","5dc77e26":"andThen(string,address)","5dc824b9":"voteNoLock(address,uint256)","5dc86b85":"adminGetAmountAddressDial(address,address)","5dc94af6":"getTokensTotal()","5dc96d16":"burnEnabled()","5dca53d3":"right30(uint256)","5dcb6774":"_createBid(address,uint256,address,address,address,uint256,uint256)","5dcb71f2":"yoshicoin()","5dcb98c4":"CPO()","5dcbac7a":"registerBytes(address,bytes)","5dcbc01e":"addSellTokensRequest(string,string)","5dcbd8bb":"setLimit(uint16,uint64)","5dcc6dbc":"spawnAxie(uint256,address)","5dcd967d":"ndc()","5dcdddd1":"testSafeToAddFix()","5dce431b":"addGame(address,uint256)","5dce9948":"getTranscoder(address)","5dcf1b77":"fileMerkle(bytes32[],uint256,uint256)","5dcf451b":"CoinDogToken()","5dcf7c8c":"proxies(address,uint256)","5dd18a22":"setItemsNotForSale(uint256[])","5dd19463":"angelFoundationAddress()","5dd283cb":"pickSmallWinner()","5dd284e3":"getAllGoldTransactionsCount()","5dd39c12":"SOD()","5dd4599a":"usersCanTrade()","5dd48b04":"PURCHASE_PREMIUM_RATE()","5dd4a65f":"lookup(address,bytes32)","5dd588df":"isAuthorizedToTransferFrom(address,address,address)","5dd672ec":"latestBid()","5dd68acd":"setAddresses(address,address,address,address,address)","5dd68f36":"getTotalInvest()","5dd871a3":"canMint(uint256)","5dd8e1d5":"kek()","5dd8eb50":"rate4()","5dda837f":"mineBalance()","5ddae283":"transferRegistrars(bytes32)","5ddaf07f":"StarbaseToken(address,address,address)","5ddb2585":"icoStartTimestampStage4()","5ddbc632":"setHardCapToken(uint256)","5ddc98ba":"updateKYCWallet(address)","5ddd81b0":"firstPeriodCap()","5ddd8248":"setBurnerOwner(address,address)","5dddea66":"updateState(uint256,uint8,uint256)","5dde2066":"addBlocks(uint256,bytes,uint256[])","5ddf2998":"setOwnerValidatorAddress(address)","5de01497":"ownerWithdrawERC20Token(address,uint256)","5de047d3":"existPlatform(bytes32)","5de0e689":"startPromotion()","5de270c5":"adminFixCurve(uint32)","5de28ae0":"getStatus(bytes32)","5de2a21b":"onIncreaseApproval(address,address,uint256)","5de3ba97":"getAllIdentifiers()","5de40f30":"innerContract()","5de4381b":"_addItemToParent(bytes32,bytes32)","5de4c6fc":"lock(address,bool,uint256[],uint256[])","5de4ccb0":"upgradeAgent()","5de52fb7":"TakeMyEtherTeamAddress()","5de6dc55":"getTokensOfOwner(address)","5de6f040":"unlockFundrBal(bool)","5de7e350":"getTokensFromAddressEmits(address,address)","5de81534":"getEditionsCount(uint256)","5de910bc":"subSegmentation(address,uint256,uint256,uint256)","5de924bf":"DeepCoinToken()","5de97c8d":"setIntervalTimeAdjust(uint8)","5dea19f5":"getHolderExternalIdByAddress(address,address)","5deab0ec":"grantLoanOwnership(bytes32,address,address)","5debb827":"SCFToken()","5debc7af":"get_tokenTime()","5dec18d4":"motto()","5dec74f8":"_finishTheBattle(uint256,uint256,uint256,uint8)","5dec7d49":"Transaction(bytes32,bytes32,address,bytes,bytes32,bytes32,address,bytes,bytes32,uint256,uint256,bytes)","5ded0235":"iRide()","5ded1865":"getCategoryProducts(address,uint256,uint256,uint256,uint256,uint256,bool)","5dedd9cc":"resetWinners(uint256)","5dee2492":"AIR_2_SUPPLY()","5deeab39":"freeTokensIssued()","5deeffb2":"getSoftcapReached()","5def5814":"getByDistrict(uint256)","5defaec6":"createVirtualAddress()","5defe3d9":"grantAccessDeposit(address,address)","5deff965":"getEtherum()","5df285c8":"getBonusTokens(uint256,uint256,uint256)","5df29b4f":"settleBetUncleMerkleProof(bytes20,bytes20,uint40)","5df2df2f":"multiSendTokenComplete()","5df34ff2":"buyMintingAddress(uint256,uint256)","5df3bdb9":"ABRATOKEN()","5df3d87e":"bet1()","5df58352":"calculateScoresIfCellIsBought(address,address,uint256)","5df5f96f":"initialize(address,uint256,uint256,uint256,uint256,address)","5df607f0":"getMyEntry()","5df60977":"updateFrozenAddress(address)","5df6461d":"LOTTERY_FUND_SHARE()","5df6a6bc":"unbond()","5df70904":"giveToken(address,uint256,bool)","5df73398":"loadMesaVerify(bytes32,bytes32[],uint8[])","5df75bdf":"totalTokensICO2()","5df8122f":"setManager(address,address)","5df86d29":"etherInContract()","5df8d74e":"bytesCallWithArray(bytes,bytes32[4])","5df8f17b":"createVote(uint256,address[])","5df93f99":"MICL()","5df95255":"Rating(address,address,int256)","5dfb94cf":"nextBurnFeeProp(uint256)","5dfc09a4":"getCurrencySymbol()","5dfc273c":"Cloudbric(address)","5dfc2e4a":"noop()","5dfc3459":"maxIncrease()","5dfd1bff":"MeetingTimeSetFailure()","5dfd3278":"VOTE_AGAINST()","5dfde910":"STELLARGOLD()","5dfed2bb":"setCompte_14(string)","5dfee9bb":"refundTokens(uint256)","5dffe6dc":"contrEntrance(address)","5e0055e7":"ThreeStarToken()","5e007742":"Propethy()","5e00a177":"revokeVesting(address,string)","5e00b9a9":"incompletePercent(uint256[3])","5e00bd96":"DoNotBloodyDeployThisGetTheRightOne()","5e00e7b2":"getNoContributors()","5e01b2e6":"Gobi()","5e01d395":"getCapAtTime(uint32)","5e01eb5a":"getSender()","5e01ed34":"associatedAddresses(uint256)","5e02b84d":"Voiptoken()","5e031606":"round2TokensRemaning()","5e03d0c6":"getCreationDateOfHistoricalMetadata(string,uint256)","5e03d393":"setAccountFrozenStatus(address,bool)","5e04672b":"approveSynthesizing(address,address,uint256)","5e047822":"fundOf(address)","5e047975":"recoverSigner(bytes,address,uint256,uint256,uint256)","5e05bd6d":"timestampFromDateTime(uint256,uint256,uint256,uint256,uint256,uint256)","5e05e84d":"buyCells()","5e068da5":"proxyVersion()","5e06911e":"SpecialTrained(uint256,uint256,uint256,uint256[2])","5e079aa5":"giveEthFundAddress()","5e07c354":"vestingTokens()","5e07f240":"shiftBitsLeft(bytes,uint256)","5e0842d7":"VEToken(uint256,string,string)","5e08f5fa":"setCGO(address)","5e0a6049":"LOG_newGasLimit(uint256)","5e0b1259":"end_block()","5e0b1597":"_unpackRatingValue(uint256)","5e0b4cb6":"setData_2(uint256)","5e0b5d9b":"changeStartAndEndTime(uint256,uint256)","5e0be607":"unlockAllTokens()","5e0be75c":"setDividendPayout(uint256,uint256)","5e0c8c8c":"getCountSales(uint256,uint256)","5e0c923a":"RinneganToken()","5e0d0f30":"krsUsd()","5e0e2118":"removeSignature(string,int256)","5e0e2957":"dumpOut()","5e0fac2e":"unlockedBalance(address)","5e0fec6a":"knownReserved()","5e0ff394":"setCompetitionAdmin(address)","5e10177b":"confirmDelivery()","5e101e51":"editionController(uint256)","5e1045ec":"addWhiteList(address[])","5e11544b":"newPeriod()","5e11dc0b":"openDistribution()","5e123ce4":"gameStarted()","5e131fa2":"removeLocker(address,address)","5e1372f4":"lockup(address,uint256,uint256)","5e159cd4":"LogOwnerRemoved(address,address,address)","5e15d642":"totalNumberOfTokensForSale()","5e1665f3":"SmartParkApp()","5e172fa3":"allowtransferaddress(address)","5e17580a":"setTime5(address,uint256)","5e1758fa":"addPermission(address,bytes32)","5e17b694":"promisedTokens()","5e191293":"emitBoardRatingGiven(address,uint256,uint8)","5e1936d4":"testThrowSetNotTransferableNotOwner()","5e199157":"setWalletOut1(address)","5e199892":"forwardFee(uint256,address)","5e19b305":"isActive(uint32)","5e19d316":"clearICObyAddress(address)","5e19deda":"preCap()","5e1a01c3":"createAndJoinCDPAllDai()","5e1a6c17":"requesters(uint256)","5e1bd33e":"getBuildCost(int32,int32,bytes16)","5e1c8f89":"scoreOf(address,address)","5e1ce5b0":"phasePresale_To()","5e1d5482":"about()","5e1d7ae4":"changeFeeRebate(uint256)","5e1d832d":"giveChamp(address,uint256)","5e1d8cb7":"TextChanged(string)","5e1d9aba":"sanCurrentTotal()","5e1dca04":"shareholder1()","5e1e1004":"setPaymentAddress(address)","5e1e547d":"unsign(uint256)","5e1e5c88":"betByte()","5e1eabd2":"soldPerCurrentRound()","5e1f3fa8":"CREATE_REPO_ROLE()","5e1f56d9":"changeWalletOwner(address)","5e1fc56e":"close(uint64,uint256,bytes32,bytes32,bytes)","5e217162":"availableSTCDRTokensOF(address)","5e21f687":"getMarketID()","5e22a2fb":"getTokenIdByHash(string)","5e22b760":"buyDEV()","5e23464e":"TOTAL_REQUEST_TOKEN_SUPPLY()","5e24de11":"ownerSetCrowdsaleClosed(bool)","5e25495e":"getProviderSupply(uint256)","5e25f96d":"setYccContractAddress(address)","5e2642c9":"isInitialSupplied()","5e280e4e":"validateTransaction()","5e280f11":"endpoint()","5e29c47c":"walletCreatedTimestamp(address)","5e2a725c":"enableEmergencyBlock()","5e2cb4f1":"BluToken()","5e2d13af":"addONG_AUDIT(bytes32,string,string,bool)","5e2d1f0d":"withdrawAfterTime()","5e2d285a":"GICTLock(address,uint256,uint256,uint256)","5e2d3798":"ETHERberry()","5e2dff7a":"foundersTokensLockedPeriod()","5e2e555f":"RogisterToVoteOnTransfer(address)","5e2ea5bd":"FIRST_PHASE_MAX_SPAN()","5e2ea799":"currentFlowerPrice()","5e2fe372":"getLastOrderIndex()","5e3013f1":"PlayX30()","5e3045c8":"getImpactTotalValue(string)","5e30b8a6":"refund(address,address)","5e30c961":"premium(address,address)","5e31005d":"scoreThresholdParams(address)","5e310670":"cancelTokenToEthOrder(uint32)","5e311cd7":"largestDonor()","5e318e07":"withdrawFees(uint256)","5e326b92":"setPreSaleStatus(bool)","5e331e62":"iterate_get(uint256)","5e33f94d":"ApolloSeptemCappedCrowdsale()","5e35359e":"withdrawTokens(address,address,uint256)","5e355dcc":"PJRToken()","5e3568b8":"session()","5e377b51":"Jackpot()","5e383d21":"values(uint256)","5e38ab4c":"BabyCoin(uint256,string,string)","5e38c77d":"getProductHistoryDate(bytes32)","5e393973":"get_contrib_arbits_max()","5e3b456c":"creatTokens()","5e3ba8ac":"usersGetter()","5e3bb4cc":"minimalSuccessTokens()","5e3bcaf7":"Fee(address[],string,uint8,string)","5e3cb7b0":"setTotalUsdAmount(uint256)","5e3cbb7c":"dayWithdraw()","5e3ced74":"callSurplus()","5e3d3b8a":"isPREICO()","5e3dbedb":"getTokenDescriptions(address,uint256[])","5e3df83f":"setFundingtokens(uint256)","5e3e2687":"transferFromParent(address,uint256,address,uint256,bytes)","5e3e37d1":"XfiniteAsset()","5e3e6092":"newService()","5e3e9158":"createWine(string,string,string,string,string,string,bytes32)","5e3fa843":"registerContract(string,bytes)","5e402ae2":"getCurrentTokensPerEther()","5e402bb5":"setInfoTokenSilverRatio(string)","5e403a9c":"phase7Price()","5e404de3":"setMaximumCredit(uint256)","5e4293ba":"i_am_generous()","5e431709":"sealedBids(address,bytes32)","5e431a6f":"phasePublicSale1_To()","5e439f66":"changeAge(uint256)","5e43f719":"enablePublicTransfers()","5e44423c":"ChangePreSaleDates(uint256,uint256)","5e44daf3":"vote(uint256,int256)","5e44e0a4":"modifyHorseyTier(uint256,uint8)","5e46f419":"leed()","5e475bb6":"createKT(string)","5e48379a":"changePriceContract(address)","5e488540":"claimRefund(address,bytes32)","5e4887bd":"initializeTime()","5e48ce0f":"dequeue(bytes32)","5e48f58f":"PRESALE_PERCENTAGE_2()","5e49db8c":"getUsersFuelsIds()","5e49fbfc":"WOS()","5e4a1d36":"getSavingsBalance(address)","5e4a8a20":"setAppCode(bytes32,address)","5e4b587b":"_BLOCK_REWARD()","5e4b5f7d":"setColdAddress(address)","5e4ba17c":"remove(address[])","5e4e7cbc":"record(string,string,string,address,bool)","5e4f63ec":"extendLockPeriods(uint256,bool)","5e5098c2":"setmangerallow(address,uint256)","5e50f037":"reward(address,address,uint256,uint256,uint256)","5e511afa":"sendTokensBackToWallet()","5e5144eb":"change(address,address,uint256,uint256)","5e520c29":"tokensPerWei10()","5e5294b7":"endingTimestamp()","5e52a00b":"getReferrer()","5e53e2f9":"EXACOIN(uint256,string,string)","5e556a4a":"faucetTo(address,uint256)","5e5571ac":"pay(address,uint256,bytes32)","5e5650ef":"admin_set_Apply_Store_Id_Fee(address,address)","5e571440":"presalesTokenPriceInWei()","5e57966d":"addressToString(address)","5e58217d":"hardCapIco()","5e58331c":"SAGA()","5e585889":"claimDeposit(bytes32)","5e58f141":"shares(address,bytes,int256)","5e593cd3":"Funding_Setting_cashback_duration()","5e5a77e6":"getQuestionAnswer(uint256,uint256)","5e5a7eb0":"createCase(uint256,address,address,uint256)","5e5ae1fe":"invalidateAllPendingMints()","5e5b1e61":"closeTokensale()","5e5ca8d4":"BuyerSeller()","5e5d2adb":"HUBUToken()","5e5d4320":"deleteUser(bytes32)","5e5d73b5":"CloseSaleFund()","5e5d926c":"makeDai(uint256,address,address)","5e5de297":"getUidAsInteger(address,address)","5e5e305e":"bbAirdropWallet()","5e5e4cc5":"ownerToArmy(address)","5e5f2e26":"allowedTokens(uint256)","5e5f2e37":"startedNewVote(address,uint256,string,uint256)","5e5ff24b":"addUsersToGroup(bytes32,address[])","5e601fed":"changePaymentAddress(address,uint256)","5e604b60":"addWhiteListedContracts(address)","5e6096c5":"setMinimumTokenSell(uint256)","5e60d438":"LicerioToken()","5e615a6b":"getParams()","5e62463a":"TransferLimitedToken(uint256,address,address[],address)","5e62af4d":"grandJackpot(uint256,uint256)","5e64f392":"_completeTask(uint256)","5e6558e5":"addAtkPlayerQuest(address)","5e65db7f":"deleteThis(uint256)","5e66dfee":"regularPayment()","5e66eb1b":"phaseClaim()","5e675098":"addFoundation(address,uint256,uint256,uint256)","5e68ac2c":"Kingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)","5e68d459":"_getRNGValue(uint256)","5e6911af":"hardcapReached()","5e6936ac":"HitToken(uint256,string,uint8,string)","5e6992e3":"rcnFundDeposit()","5e6a7777":"setCompte_39(string)","5e6ad49d":"_setCosignerAddress(address)","5e6b4ee5":"increaseRate(uint256,address)","5e6b7a5c":"getUnitsDefense(address,uint256,uint256)","5e6c5d77":"number_of_deals()","5e6cbd6d":"_getRandom(uint256,address)","5e6db193":"Bithenet()","5e6e91ac":"Mint(uint256,address,string)","5e6eb33a":"CampaignClosed(uint256)","5e6f6045":"vestingContract()","5e6fa5ea":"inclusionEnExchange()","5e6fc129":"isRecord(string)","5e6fc8b4":"getChildrenCount()","5e7037d0":"removeSpriteFromSale(uint256)","5e7051cd":"setQuickPromoInterval(uint128)","5e70a6dc":"increaseLock(uint256,uint256)","5e715c16":"ICO_CONTRACT()","5e717e2d":"readDeal(string,address)","5e71823b":"numPositions()","5e71c7fa":"testCheckRokSold()","5e733baa":"openEgg(uint64,uint16)","5e734f5c":"revealBid(bytes32,uint256,address,bytes32,bytes32,uint256,uint256)","5e73dd37":"tokenCapPhaseOne()","5e7591e2":"register(bytes32,address,address,bytes32,bytes32)","5e763377":"ModifyMarking(bytes32,uint256,uint256)","5e763946":"setTaxationPeriod(uint256)","5e76a101":"onlyOwnerSetTeamWallet(address)","5e7893e2":"showprize()","5e78998e":"BatLimitAsk()","5e7aa842":"createEvent(bytes32,bytes32[],address,uint256)","5e7b9832":"updateItem(uint256,uint8,uint8,uint256,uint256,uint256,uint256,uint256,bool,bool)","5e7be40d":"getBeneficiaries(address,address)","5e7c85b1":"totalContrib(address)","5e7cafa4":"startPayments(uint256,uint256)","5e7d6fd0":"airdropHasExpired(address,uint256)","5e7f092c":"_createNFTCollectible(uint8,uint256,address,uint256,uint256[5])","5e7f22c2":"postBuyOrder(address,address,uint256,uint256)","5e7f322b":"exchangeEthToEur(uint256)","5e8023d1":"cascades(uint256)","5e80377b":"buySaleReferred(uint8,address)","5e815320":"forward_pass2(uint256[],int256[],int256[],int256[],int256[],int256[])","5e816740":"rollDice(uint256,address)","5e81b958":"isNonFungibleItem(uint256)","5e81ba96":"DestroyedBy(uint256,address)","5e825564":"setFactory(address,address)","5e83b463":"placeBet(uint256,uint256,uint256,uint256,bytes32,bytes32)","5e84d723":"publicSupply()","5e850225":"closePeriod(uint256,uint256,uint256)","5e8507f8":"destTokensAngel()","5e855f14":"Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","5e85db0a":"getMinSkills(uint256)","5e8714d5":"changeSaleAgent(address)","5e871f0c":"dividendDistributionDuration()","5e885c63":"getPack(uint8,uint128)","5e89d92a":"Credentials(bytes32,bool)","5e8a6044":"foundersFundTimelock3Address()","5e8a79e1":"setRef()","5e8aedce":"SubajToken()","5e8af735":"placeBet(uint256,string)","5e8be190":"getCar(uint256)","5e8c63bb":"vehicle_assembled(uint256)","5e8e9589":"_createPenguin(string,uint256,uint256)","5e8f5022":"issueTokensWithReferral(address,uint256)","5e8f6597":"distributeInvestorsTokens(address,uint256)","5e90852d":"proposeTransaction(address,uint256,bytes)","5e90a9ff":"_getLotteryNum(uint256,uint256)","5e916b46":"rinkeby2()","5e91ba21":"checkSecret(address,string,bytes32)","5e91c37d":"tokensSoldInPresale()","5e91c5ed":"specialTransfer(address,uint256)","5e91d8ec":"updateEmployee(address,uint256)","5e943a30":"calculateReferralBonus(uint256)","5e949fa0":"changeDestination(address)","5e956abf":"createMeshPoint(string)","5e959287":"getSignature(string)","5e95ff98":"updateFreeze(address)","5e968a49":"ownerSetMaxProfitAsPercentOfHouse(uint256)","5e97894a":"TNPC()","5e983156":"getJudgeVoted(uint256,address)","5e983d08":"setPrices()","5e986ec7":"PoezenVoting(uint256,uint256)","5e987d32":"last_slot()","5e98e4c7":"abstain()","5e9a1849":"numDonations()","5e9a31fb":"MINBET_perSPIN()","5e9a523c":"assetPrices(address)","5e9a8c42":"get_deal_state(uint256)","5e9afc0e":"ERC223TestToken(string,string,uint8,uint256,address)","5e9d2b1f":"roundSize()","5e9d2e7b":"exchangesWallet()","5e9dbcb7":"_tag(string,string)","5e9e2226":"setOraclizeWinnerGasFee(uint256)","5e9f9613":"availableReserve()","5ea050ec":"InitiateCompanies()","5ea102b0":"Base()","5ea187c9":"BuildByteArray(bytes)","5ea194a3":"createScalarEvent(address,address,int256,int256)","5ea1bb17":"winInternal(address,bytes32)","5ea1d6f8":"commissionRate()","5ea1fc6a":"NAME_SATOSHI()","5ea27e40":"PRESALE_END_TIME()","5ea36bd6":"MultiHolderVault(address,uint256)","5ea39624":"ATTR_SEEDED()","5ea3ad0a":"doWithdrawal(uint256)","5ea40983":"addMember(address,uint256,bool,string)","5ea4cf50":"AMPTToken()","5ea56918":"BIAToken()","5ea63913":"getInvestorBalance(address)","5ea6474d":"getPVPBattleResult(uint256,uint256,uint256)","5ea67956":"CrowdtesICO()","5ea81231":"ownerAddRole(address,string)","5ea81e07":"editAccountData(address,string,bytes)","5ea82efb":"MariaToken()","5ea8cd12":"setMinPrice(uint256)","5ea8cf00":"PardiICO()","5ea94bcf":"updateUserTrustRankForMultipleChannels(address,bytes12[],int256[])","5ea95215":"SpaceXToken()","5ea98520":"changeNewExchange(address)","5ea9caff":"FrozenFund(address,bool)","5eaa6ca4":"_cancelMarkets(uint256)","5eaaa699":"SALES_SUPPLY()","5eaad235":"getDataByDeviceId(uint8,uint8)","5eab15e4":"devuelveApps(bytes32)","5eabc684":"updateIssuanceData(address,uint256,uint256)","5eabe01e":"saleSuccessful()","5eac1414":"UNIQ(uint256,string,string)","5eac6239":"claimRewards(uint256[])","5eac85d5":"burnGasAndFreeFrom(address,uint256,address,address[],bytes)","5ead330c":"getDungeonFloorDetails(uint256)","5ead8846":"updateFundsOwner(bytes32,bytes32)","5eadd607":"debugResetSubmissions()","5eae177c":"isTransferAllowed(address,uint256)","5eaefac1":"reservePricing()","5eaefb31":"CARD_TAKE_SHARE()","5eafe515":"newDeveloper(address,string)","5eb08d8a":"setBurnRate(uint8)","5eb101c3":"capped()","5eb17cdb":"setBeginTime(uint256)","5eb19ad1":"recalcAmountWithFees(uint256,bool)","5eb19eda":"InitiatePlanets()","5eb1f936":"JBToken()","5eb28fb2":"Robot()","5eb332da":"updateAward(uint256)","5eb38bef":"setcommissionPer(uint256)","5eb3f639":"assertTrue(bool,bytes)","5eb456c1":"goldIssueBurnFee()","5eb51d3c":"setTrancheMinTx(uint256)","5eb53bfa":"test_standardCampaignConstructionValuesFailsDueToNoParameterValidation()","5eb604bc":"GongChuangToken()","5eb61aa9":"executeSignedCall(address,uint256,uint256,bytes,bytes)","5eb62178":"getMinAmount(address)","5eb62d75":"sendPrivateSaleTokens(address,uint256)","5eb6a78f":"gamesCounter()","5eb7413a":"lockedTokens(address)","5eb9bbf7":"founderTokenUnlockPhase4()","5eba2472":"Migrations3()","5ebad2ab":"GrowthPool_Supply()","5ebaf1db":"staker()","5ebb7077":"mkDomain(bytes32,address)","5ebc1db8":"positionScount1(address,address)","5ebc7826":"CasCoin()","5ebca187":"testFailTransferWhenStopped()","5ebcaf7e":"sendBuyAgent(int256,int256,int256,int256)","5ebcc621":"endFundraising()","5ebcfe50":"taxTransfer(address,address,uint256)","5ebd2196":"getMyBalanceDNT()","5ebd9a83":"add(bytes32,address,address)","5ebdd159":"tokenAvailable()","5ebe4746":"CCPLUS(uint256,string,string)","5ebe7c72":"reply(string)","5ebfed78":"buyRegion(uint256,uint256,uint256,string)","5ec01e4d":"random()","5ec0c707":"winnerFromGas(uint256)","5ec112a2":"setPreSaleOpened(bool)","5ec1b499":"AnythingAppTokenPreSale(address,address,address,uint256,uint256,uint256,uint256,uint256)","5ec1fc19":"convertMint(address,uint256)","5ec211a1":"accountOfN(address)","5ec2c7bf":"auctioneer()","5ec2dc8d":"depositReward()","5ec30be2":"assignListingDB(address)","5ec38bec":"updateFundWallet(address)","5ec3f160":"secondsInDay()","5ec4eb95":"GoldWhitelist(address,bool)","5ec5bc8e":"pushOrderOfOwner(address,uint256,bool)","5ec5bed6":"coupon(uint256,uint8,uint8,bytes32,bytes32)","5ec70cd2":"_getProviderPriv(uint256)","5ec72a90":"maxCumAcceptedDeposits()","5ec81130":"calcBonusRate()","5ec88c79":"getAccountLiquidity(address)","5ec93cb2":"withdrawal_gas()","5ec94770":"RhinexFundCoin()","5eca2aeb":"getBytesArrayIndex(bytes32,uint256)","5ecb16cd":"withdrawTokens(address[])","5ecb6594":"isCoreContract()","5ecb7d20":"testGetCaseCount()","5ecc33ac":"testPrivacy()","5ecc7975":"YUPVesting(address,uint256,uint256,uint256)","5ecd62b9":"divCut()","5ecf36f7":"Print(string,uint256)","5ecf71c5":"decreasePower(uint256)","5ecfdcfc":"KnownTokens(address,address,address)","5ecff851":"p_setDevAddress(address)","5ed0f3fd":"changeVariables(address[],uint256[],address,address,uint256,uint256,uint256,uint256,uint256,uint256)","5ed16294":"nacBalance()","5ed188c9":"MNTToken(address)","5ed18d95":"CollatLending()","5ed31991":"lastLockingTime()","5ed411e5":"setNewToken(address)","5ed4382f":"fourthStageMinting()","5ed49e9b":"ADVISERS_AND_FRIENDS_WALLET()","5ed4d7ae":"_getTokenAmount()","5ed50033":"myetherpay(uint256,string,string)","5ed5684c":"HCHToken(uint256,string,string)","5ed570f3":"toggleCanCreateGames()","5ed5ea28":"whiteListContract()","5ed65228":"sponsoredJackpotMin()","5ed66172":"getCertificateForWallet(address,address,address)","5ed66998":"usingOwnership()","5ed6a8e7":"setData_13(string)","5ed73bc7":"distribute(address,uint256,address[],uint256[],uint256)","5ed75366":"DEVELOPER_FEE_FRAC_TOP()","5ed7ca5b":"halt()","5ed81ebe":"getInspireTokens(address,address,uint256)","5ed84aa6":"getNymCenterAPIURL()","5ed85753":"ergoam(uint256,string,string)","5ed9ebfc":"soldTokens()","5eda17bc":"_tuneLambo(uint256,uint256)","5eda232d":"getTokenStakeByIndex(uint256)","5eda5b9a":"interestCollected()","5edabc99":"getPresaleEndTime()","5edb2fb3":"uint256ToBytes32(uint256)","5edc1ac8":"discountDecimal()","5edc9bff":"upgradeUnitMultipliers(address,uint256,uint256,uint256)","5edca2b4":"unsuccessfulWithdrawal()","5edd4436":"newOffer(bytes32,string)","5eddd157":"claim(uint256,uint256,bytes)","5edf34d4":"Transfer(address,address,address,address)","5edf413e":"burn(bytes32,address,uint256,bytes)","5edf8d3c":"SetAdOwner(uint256,address,address)","5edfa1f8":"calculateFees()","5edfd788":"completedGames()","5ee10f3b":"instruct_2()","5ee2a018":"deployMultiToken()","5ee2cec2":"issuerDateMinutes()","5ee345e4":"computeEndowment(uint256,uint256,uint256,uint256,uint256,uint256)","5ee4e3f8":"LocklistAddressisListed(address)","5ee58efc":"distribution()","5ee5e9ee":"SaleStarted(uint256,uint256,uint256)","5ee679f9":"removePolicyFrom(address)","5ee6cc38":"buyToken(address,address)","5ee7144c":"_removeTopic(string)","5ee759e8":"encodeCurrency(string)","5ee760a5":"hashHardCap(uint256,uint256)","5ee7b392":"sendToken_internal(address,uint256)","5ee7cd23":"isBCFBuyMarket()","5ee7e96d":"grant(address,uint256,uint256,uint256,uint256,bool)","5ee857d1":"test_insert_findWithHintPrevUpdateTail(int256)","5eeb9ff9":"get_transferLock()","5eebc031":"newReadAddr()","5eebea20":"pending(address)","5eec743b":"minContributionMainSale()","5eec9df0":"softCapWei()","5eecbad8":"getFunderByIndex(bytes32,string,uint256)","5eecdec0":"unLockup()","5eed1f1a":"setTotalIndividualWeiAmount(address,uint256)","5eed3dcb":"donorList(uint256)","5eed886b":"minimumPerTransaction()","5eedbceb":"emitTransferFeeUpdated(uint256)","5eee006a":"secondStageStartsAt()","5eee7078":"sendETH(uint256)","5eeeee22":"setMaxWin(uint8)","5ef013d0":"Ico()","5ef17eff":"getSettingValuesById(uint256)","5ef1bfdb":"landPriceWei()","5ef27d1a":"hasRazCompleted(uint256)","5ef2a3f4":"giveAwayInProgress()","5ef2c79a":"getMyNmBet(uint256,uint256)","5ef3f3d1":"voteRelease()","5ef3f9e1":"BETS_CLOSING_TIME()","5ef4d2af":"_calculateTokenAmount(uint256)","5ef4ed42":"setBattleTokenAddress(address,address)","5ef505c0":"discoveryBlocksUntilAllowed(uint256)","5ef572ad":"stageMgmtSystem()","5ef5cdb2":"doFailedOffer(uint256)","5ef6228c":"bytesToAddr(bytes)","5ef652ad":"EtherFarmDevSim()","5ef6543c":"YDMediaToken()","5ef6ad57":"Delivery()","5ef74958":"Epam()","5ef78561":"cashWallet(address)","5ef79434":"DATE_PRESALE_END()","5ef7ac4d":"startRedeem(uint256,bool)","5ef7b303":"getPI_edit_14()","5ef80c87":"create20ContractToy()","5ef82429":"tixPromo()","5ef8da77":"Altruism()","5ef97145":"BokkyPooBahsAutonomousRefundathonFacility()","5ef9dde8":"removeApprovedGame(address)","5eface14":"numStakersForPoll(bytes32)","5efb4dc5":"deathData_a7()","5efb8266":"setGoldContractAddress(address)","5efbb728":"transferold(address,uint256)","5efbcfba":"minWeiToBuy()","5efbdc47":"setLastBidId(bytes32)","5efc156f":"Roles2LibraryAdapter(address)","5efd1682":"transferPreSigned(address,address,uint256,uint256,uint256,bytes,bytes32,bytes32,uint8)","5efd3c41":"whiteListEndBlock()","5efdb1e4":"percentToTakeAsSeed()","5efe2fcf":"releasedLockedAmount()","5eff7dae":"getInstructors()","5eff8b48":"Prakashcoin()","5effd20d":"withdrawForAddress(address,uint256)","5f01b42f":"alloweRefund()","5f02116f":"claimRewards(uint256[],uint256[])","5f024e91":"testCheckEthBalance()","5f0379f5":"firstPriceChange()","5f038b6d":"refillFunds()","5f05b3e4":"HappyToken(uint256,string,uint8,string)","5f05b9df":"removeTWhitelist(address)","5f065346":"pay(address,uint256,uint256)","5f06541d":"resetOwner()","5f065b4a":"checkItem(bytes32)","5f06900b":"changeBattleFee(uint256)","5f073f49":"gatherDetails(uint64[])","5f07a3e5":"addAllNewTicket(uint256,bytes32[],uint256[],uint256[],uint256[])","5f07bd15":"take_fees_eth_owner()","5f09952e":"voteAllowTransactions(bool)","5f0b37e4":"VeritokenToken()","5f0d5296":"reserveAllowance()","5f0d995b":"developer_string_contract_verified(string,string)","5f0da25b":"sendDeposit(uint256,address,uint256,bytes32)","5f0da5c9":"create(string,address,address,address,address,bool)","5f0e3855":"ownerRefundUser(bytes32,address,uint256,uint256)","5f0edfb8":"create(bytes,bytes32,bytes1)","5f0f1f85":"transferProposalEnd()","5f0f7786":"IssuedToken(address[],uint256[],uint256,uint256,address,string,uint8,string)","5f0fc2e8":"RealMoneyToken()","5f104c5f":"SalesAgentPermissionsTransferred(address,address)","5f111074":"picopsCertifier()","5f112c68":"renounceMinter(address)","5f11301b":"setServiceURI(string)","5f1231ea":"getMemberInfo(address)","5f141a0f":"confirmWrite(bytes32,address)","5f14af16":"Subscribe(address,address,uint256,uint256,uint256)","5f14e108":"openTokensale(address)","5f159e60":"TimeBoundaryChanged(string,uint256)","5f167276":"getNumElements()","5f17114e":"TimeDeposit()","5f1768c1":"buyerHistory()","5f1845f6":"transferDecimalAmountFrom(address,address,uint256)","5f184eda":"withdrawFactoryResourceBalance(uint16)","5f185329":"submitOrder(bytes)","5f1877a8":"productPrice(string)","5f18aa0c":"decimals(bytes32)","5f196876":"allPromotions(uint256)","5f19c7b2":"doSetSettings(uint256)","5f1a6f4b":"BARL()","5f1b3ee6":"getAPAddressSize()","5f1b46ab":"inflateToken(address,uint256)","5f1ca2fc":"ReferralRegistered(address,address)","5f1d146e":"eeeeeeeeeeeee()","5f1d7037":"KEDToken()","5f1d804f":"checkTxProof(bytes32,bytes,uint256[],bytes,bytes)","5f1d90ae":"getCurrentOpinion()","5f1e1c28":"__transfer(address,address,uint256,bytes)","5f1e580d":"ETUToken()","5f1e8c1b":"MAX_MODULES()","5f1f6c5e":"delFromList(uint256,address[])","5f1fc571":"set_prices(uint256,uint256,uint256)","5f1ff549":"issued()","5f222da1":"latestMomentOf(uint256,address)","5f227bfc":"totalPlayerTokenContracts()","5f22c42f":"getBuyerReceipt(address)","5f238402":"lastAllowancePaymentTimestamp()","5f241c8e":"AnythingToken(uint256)","5f24f6fe":"setUpgradedAddress(address)","5f2536f7":"calculateMaxContribution(address)","5f27e47d":"GetWinnerAt(uint256)","5f27f6e3":"getPlayerGeneralAll(uint32)","5f27f946":"handleTokens(address,address,uint256)","5f28213b":"SCTC(uint256,string,string)","5f28b383":"minPerUser()","5f28cb74":"getSubscription(bytes32,address)","5f2961e1":"walletFounder1()","5f2a9f41":"MAX_GAS()","5f2aeae9":"executeCreator(uint256)","5f2af8d9":"Logocoin()","5f2b9ac0":"startPhase3()","5f2bb66e":"BatchTransfer(address)","5f2befb9":"hasTerminated()","5f2bf49a":"BitcoinRateUpdated(uint256,uint256)","5f2da7ec":"todayDays()","5f2e0c20":"giveConsent(uint8,bytes32,bytes32)","5f2e2b45":"freeFrom(address,uint256)","5f2e4b31":"testDisputedInvalidSequenceWrongWriteAddress()","5f2e686d":"Ethereum_eight_bagger()","5f2e8493":"addmoney(address,uint256)","5f2ebcf2":"GMRToken()","5f2ef12d":"tokenFactory(uint256)","5f2f83ba":"getMul(uint256)","5f2fb08e":"removeElement(address)","5f3040bf":"getMIRABALANCE()","5f304615":"earlyAllocation()","5f309123":"sale2(address,uint256)","5f30ed2a":"withdrawAmountFromToken(uint256,uint256)","5f31ea82":"holdTokenInvestors(uint256)","5f32714d":"ChannelSettled(address,address,uint32,uint192,uint192)","5f3292d7":"DMCTCoin()","5f330669":"dateMove(uint256)","5f33afdb":"preallocCoins()","5f33c5e1":"Payout(bytes32,address,address)","5f34165d":"isRightBranch()","5f3616eb":"getNextOnce(address,uint256,uint256,uint256)","5f3619b1":"getProfitFromSender()","5f373c22":"setHydroContractAddress(address)","5f37b43f":"_getType(uint256,uint256)","5f3893ef":"getReward(address,uint256,address)","5f399d28":"TokenIceBox(address)","5f39fd73":"approveUpdate(uint256,address,bool)","5f3aa2bb":"checkIfRewarded(bytes,uint256,bytes,bytes)","5f3bc04c":"addressFundInvestment()","5f3c15ed":"radtokenSupply()","5f3c23be":"isProposalNotExpired(bytes32,uint256)","5f3c6686":"challengeBook(address,address)","5f3c91ad":"accrueEther()","5f3ca167":"crowdSaleInitialized()","5f3cebcd":"incrementalInverse(uint256,uint256)","5f3d634f":"freezeMulti(address[],uint256[],uint256[],uint256[])","5f3d7fa1":"maxAttendees()","5f3e3db0":"increaseWeeklyTransactionVolumeSending(uint256)","5f3f703c":"gifter()","5f403edc":"addThenSub(uint256,uint256,uint256)","5f40fc27":"withdrawGoldMoney()","5f412d4f":"releaseTokenTransfer()","5f412ff1":"ownerEnablePayee(address,address)","5f41ccef":"multMint(address[],uint256[])","5f421776":"switchONfreeForAll()","5f429ba5":"Risk()","5f437e48":"settingsState()","5f43e49c":"isDataYes(bytes)","5f4402c5":"distributeTokenToAddressesAndAmounts(address,address,address[],uint256[])","5f45161f":"payToInviter(uint256)","5f45221d":"retrieveIncompleteProof(bytes32)","5f452df1":"approveCrowdsale(address)","5f456c1f":"assignedAmountToEcoReward()","5f45c179":"ABYSS(address,address[],address)","5f46d750":"amountOfDividendsPayouts()","5f4784a5":"allOf(address)","5f478f74":"Milestone(string,uint8)","5f47ba42":"Plendito()","5f4821ab":"ContractFactory()","5f4874e4":"multiTransfer(address[],address[],uint256[],string)","5f48f393":"maxAmount()","5f493f63":"convertToMini(uint256)","5f495491":"claimsCreated()","5f4964e0":"setMarketComissionRatio(uint256)","5f497a09":"adminCharge_p1()","5f49d562":"QSTPerEth()","5f4a47c3":"updateUpdater(address,string)","5f4b125b":"get_pre_kyc_bonus_numerator()","5f4b2873":"getDepositedValue(address)","5f4b9b4f":"getPolicyCount(address)","5f4c71f1":"getTotalETH()","5f4dd2d8":"mintPreico(address,uint256)","5f4eab65":"hasEditionInProgress(uint256)","5f4ed0b1":"rebalanceBucketsInternal()","5f4f35d5":"setFullName(string)","5f504a82":"ownerCandidate()","5f5082dd":"setLast(uint256,address)","5f51028d":"checkIsReleaseRecordExist(uint256)","5f515226":"checkBalance(address)","5f516131":"ReserveUnknown(bool,uint32,uint256,uint256)","5f51d526":"balanceMapPos(address)","5f51db02":"Memes()","5f52e9fd":"WithdrawCashForHardwareReturn(uint256)","5f538fd4":"openMigrationPhase()","5f539d69":"addContract(address)","5f53e077":"setPausedTransfers(bool)","5f5404af":"PriceProvider(string)","5f542c94":"emitAreaEvaluated(address,address,uint8,uint256)","5f54a1c7":"requestEndCall()","5f54ae17":"buy50Price()","5f54fa98":"conventionId()","5f56315b":"enableSell()","5f56b6fe":"safeWithdrawal(uint256)","5f56e134":"averageArtworkSalePrice()","5f5810ea":"UBIT2018069()","5f5868db":"freezedValue()","5f589599":"resultsPublished()","5f58ed2a":"disableBot(address,uint64)","5f596681":"setShpExchangeRate(uint256)","5f598510":"KVMToken()","5f59940c":"addressToSpentEther(address)","5f5a98ee":"dragonGirlLotteryPrice()","5f5bb161":"set(bytes20,uint256)","5f5d867b":"CryptoPoosToken()","5f5db5dc":"setVariables(string,address,uint256,int256,bool,bytes32,address[2],uint256[2],int256)","5f5df710":"updateCertifier(address)","5f5e38b6":"setBuyPrice(uint16,uint16,uint8,address,uint256)","5f5f23a0":"charityFactor()","5f5f2aef":"amendRetention(uint8,uint8)","5f5f62f9":"setControler(address)","5f5fa782":"getCurrencyByte(uint256,uint256)","5f5fca9a":"setEnforceAddressMatch(bool)","5f6076bf":"Access()","5f60a5d4":"CompleteWildcard(uint256,address)","5f60ef47":"get_heaps(uint256)","5f60f485":"updateStatus()","5f61a26e":"PRESALE_ETHER_MIN_CONTRIB()","5f61bf99":"claimG()","5f623e15":"divisible_units()","5f645f16":"setInputFile(uint256,bytes32)","5f647d5a":"ethSignedMessagePrefix()","5f64b55b":"tokenB()","5f65545d":"Raffle_Prize()","5f65d621":"setSkill(uint256,uint256,uint256,bytes32)","5f65d703":"setInfo(bytes32,uint256)","5f65faf1":"isProduct(bytes32)","5f677404":"INITIAL_VALUE()","5f68688f":"endFirstBonus()","5f68804e":"SimpleLotto()","5f689fed":"startPVE(uint256)","5f6a1301":"clearPending()","5f6a4546":"ROLE_REVIEWER()","5f6acfe9":"_updateRate(uint256,uint256)","5f6d0ded":"ReservationFund(address)","5f6dd297":"getProjectEndDate(bytes32)","5f6e388a":"ProofOfCloneWars()","5f6ea340":"revokeAccess(address,address)","5f6ecea0":"vestedTransfer(address,uint256,uint256)","5f6edff8":"assureDAppIsReady()","5f6f8b5f":"setExclude(address)","5f7033e5":"getCurrentStartTime()","5f704f3e":"updatePrice(bytes32,uint256)","5f70d9ac":"getBot(uint256)","5f7118c7":"setRevealOpen(uint256)","5f71249c":"changeOrganisationName(string)","5f722859":"updateHashValue(bytes32,bytes32)","5f723b50":"getInitialReportMinValue()","5f72a508":"playerPopMining(uint256,bool)","5f72f450":"check(uint256)","5f73d6c0":"promisedTokenBalance()","5f746233":"dispense(address)","5f74a5ec":"pecunioWallet()","5f74bbde":"vote(address,uint256)","5f74c16c":"getPrizePot()","5f75b5ef":"whitelistAddress(address,address)","5f75cb6b":"getCountTransferInsToken(address,address)","5f7619a4":"takeFee(uint256)","5f766118":"salutaAndonio()","5f76e49a":"addPerson(bytes32,bytes32,bytes32,bytes32,uint256,bytes32,address)","5f770d47":"HyperSale()","5f77ace0":"stop_token_time()","5f7807a4":"transferToUser(address,uint256)","5f788531":"buy5Price()","5f791c7c":"ZRSToken()","5f7a7bb5":"returnRegDate(address)","5f7b68be":"addKey(address)","5f7b73b2":"getInvestorCredit()","5f7b764f":"_getLuckySpaceshipMoney(uint256,uint256)","5f7bb7f1":"setMaxProfit(uint128)","5f7c944f":"mintAccount(uint256,uint256,uint16,bytes32,uint256)","5f7cbc39":"addressOfTokenUsedAsReward2()","5f7cfe49":"internalSalt(bytes32)","5f7d897e":"checkVendor()","5f7dfd3f":"totalPaidToFunders(bytes32)","5f7e61fa":"SendTo(address)","5f7e7138":"setDth(address)","5f7ee166":"setupOpenDistribution(uint256,uint256,address,address)","5f7eed5d":"LeajoeToken()","5f7f9482":"statusQuery()","5f800348":"balancesImporter1()","5f8162bb":"transferTokenContractOwnership(address)","5f824297":"SellOrderPlaced(uint32,address)","5f84d0f9":"tokenR0()","5f84e343":"Artemine()","5f84f302":"setInterestRate(uint256)","5f852975":"randomtests()","5f8534ae":"claimDeposit(uint256)","5f856dbf":"Token_AllowTransfer()","5f85abdc":"contains(int256,int256)","5f865912":"addContract(address,address,uint256,string,bool)","5f877108":"sendToCharger(uint256)","5f88bff0":"presaleFundingGoal()","5f88e83d":"checkAndCallTransfer(address,address,uint256,bytes)","5f88eade":"opened()","5f88ffed":"wallet10()","5f8909bd":"biddingPeriod()","5f8a3029":"Standard_4()","5f8a7eab":"getReleaseAmount()","5f8aaa69":"sourceToken()","5f8aaef7":"contractStakeToken()","5f8af054":"getMessageLength(string)","5f8b93d2":"SingularityTest13()","5f8bad42":"getCommunityBallotWeiPrice()","5f8c1fce":"nextBracket()","5f8c494f":"IntIDQuery(address)","5f8cb3f6":"bounty_paid()","5f8cf6c4":"SMILO_SALES_AMOUNT()","5f8cf7c5":"PermissionGroups()","5f8d96de":"getDeadline()","5f8e38e1":"depositERC20Compatible(address,uint256,uint256,uint256)","5f8eb4c7":"jsub(uint256,uint256,uint256,uint256,uint256,uint256)","5f8f0483":"buyBankerAgreementFromImporterBank()","5f9094f5":"GetCreditsPerEth()","5f9145ef":"RefundReceived(uint256)","5f918b05":"ServiceProviderDisabled(address,bytes)","5f91af39":"_increasePlayerDivis(address,uint256)","5f9209ad":"getPositioninterestPeriod(bytes32)","5f92dee8":"adminGetWorldSnapshot(uint256)","5f932d71":"walletSetSigner(address)","5f945733":"getTotalInvested()","5f94e3de":"setSecondaryOperator(address)","5f94e82c":"setBridgeValidatorsProxyOwner(address)","5f956244":"TribePlatform()","5f9590fc":"_isValidDataHash(bytes32,bytes)","5f95ad43":"HasNoEtherTest()","5f9602e8":"perClaim()","5f96d9fa":"gemSpeedConversion()","5f972df8":"_jDiv(uint256,uint256,uint256,uint256)","5f9973b9":"WeiToken()","5f99c1b2":"_landholderJackpot(uint256)","5f9a2c23":"endFourthWeek()","5f9aa94f":"SpiceRates(address,uint256)","5f9adf84":"getUserSentTradeOfferId(address,address)","5f9b71ce":"bet(uint256,address)","5f9bad28":"saleBonus()","5f9c84b5":"transferirSala(address,uint256)","5f9cb50d":"updateMasks(uint256,uint256,uint256,uint256,uint256)","5f9dfc79":"minBuyTokenAmount()","5f9e1080":"settleBet(uint256,address,uint256)","5f9f3f46":"MakeSharesFromAmount(uint256)","5f9f4734":"birthday()","5fa13b49":"shweta()","5fa21f1f":"enableBetting()","5fa27af0":"GITC()","5fa382ea":"getPixelsOwned(address)","5fa3df98":"changeKYCStatus(address,bool)","5fa413b0":"ownerShareInPercent()","5fa44602":"tokenCreationDate()","5fa458b7":"buysoldiers(uint256)","5fa51277":"emergencyExtract()","5fa513d5":"findPtr(uint256,uint256,uint256,uint256)","5fa58268":"approveRequestPause()","5fa60fc8":"DCAsset(address)","5fa67c00":"Credit(address,address)","5fa77dac":"all(bool[6])","5fa7b584":"removeToken(address)","5fa7dc56":"getCurrentRateWithBonus()","5fa7df6b":"setDelegateAndLockTokens(uint256,address)","5fa87163":"viewlisting(uint256,uint256)","5fa8c869":"_getRandomPartSubtype(uint256,uint8[])","5fab11a5":"startICO(uint256,uint256,uint256)","5fac4996":"findSignedSubscriberIndex(address)","5fad18e4":"Visualrockcoin()","5fad3b1a":"initialiseContract(address,uint256)","5fad663e":"expectedDividends(address)","5fae0576":"isWhitelistedAddress(address)","5faeb944":"setData_22(string)","5faeced2":"removeFromUserCounter(uint256)","5faf2880":"changeDna(uint256,uint256)","5faf6675":"forecastInfo(uint256)","5fb02f4d":"startContract()","5fb07a62":"getDrugs()","5fb0ac18":"birthDragon(uint256)","5fb130af":"retry(address)","5fb135f9":"distributeAff(uint256,uint256,uint256,uint256)","5fb1552c":"GanaLocker(address,address)","5fb1ef8e":"checkOrder(address)","5fb1f1d7":"getSketchesOnOffer()","5fb3b944":"privateSaleSoldTokens()","5fb3e119":"Auction()","5fb42c59":"goldListPeriod()","5fb437f2":"setWithdrowRate(uint256,uint256)","5fb4f78c":"finishConfiguration()","5fb500a5":"ETT(uint256,string,uint8,string)","5fb64fd6":"checkMembership(address)","5fb6bca2":"fighterCore()","5fb77b9c":"revealBracket(bytes8,bytes16)","5fb7a643":"enableServiceProvider(address,bytes)","5fb80f20":"weiPerAnimal()","5fb8dc8b":"MasternodeTransferred(address,address)","5fb8fed6":"PJR()","5fb93bb7":"transferDataEntryClerk(address)","5fba26a6":"getBorrowedBooksCount(uint256)","5fbaa390":"haltSale()","5fbabc49":"setSkill(uint32,uint8,uint32,uint32,uint32,uint32,uint32)","5fbddcf3":"isLivingMonarch()","5fbe4d1d":"tokenAddr()","5fbf17ac":"totalUBetCheckAmounts()","5fbf79a2":"EmergencyStopSell(bool)","5fbfd9f6":"crowdsaleController()","5fbff3e2":"preferentialRate()","5fbff3fc":"KuangJinLian()","5fc02dcd":"freezeAccountForOwner(address,bool)","5fc13e0f":"initTransaction(address,uint256,bytes)","5fc1a4b8":"treasurySupply()","5fc1afac":"forwarders_count()","5fc2b479":"unlock(address,uint256,uint8)","5fc2cb39":"buyTokensWithProperEvent(address,uint8)","5fc31aeb":"_rawGetTokenDelegation(address,address)","5fc378df":"sawcoin()","5fc3ea0b":"withdrawERC20(address,uint256,address)","5fc42ebf":"KTZ()","5fc483c5":"OnlyOwner()","5fc4a6f3":"getCurrentBonusSystem()","5fc5d48b":"burnUnsoldCoins(address)","5fc5e727":"investedSumOnIco()","5fc6bd17":"pendingParsecs()","5fc71288":"GOTPAY()","5fc75bf2":"viewCreatePetitionFee()","5fc8cc16":"returnAmountOfELIXAddressCanProduce(address)","5fc9309c":"transferFrom(address,address,uint256,address)","5fc93ed7":"BirthdayBoyClickHere()","5fc9d392":"setMessageStatus(bool)","5fc9e75e":"historyCountOf()","5fca5a92":"set_arbits_max_contribution(address,uint256)","5fcb568c":"release(string,uint32,uint32,uint32,string,string,string)","5fcba9ae":"DURIANX()","5fcbd5b6":"countDown()","5fcc2edb":"IndividualityTokenRoot(address)","5fcc6277":"changeModuleBudget(uint8,uint8,uint256)","5fcc7ea1":"nextScheduledQuery()","5fcc9d0f":"hardCapPreIco()","5fcce279":"announcementType()","5fccf40a":"redeemBonusLot()","5fccfda4":"postICOSale()","5fcd7fe6":"OWNER_TOKENS()","5fce627e":"hasArea(address,uint256)","5fceab11":"incomingTransaction(uint256)","5fcee7a0":"CEOAddress()","5fcf0455":"interestEarnedAccount()","5fcf92ef":"received_tokens()","5fd030c0":"setLicenseNFT(address)","5fd0526e":"getReleasableBonusAmount(uint256,address)","5fd0f8b2":"smartContractSaleEnded()","5fd1bbc4":"publicStartTime()","5fd23730":"LogSwapToken(address,uint256)","5fd33b1b":"freezeTrading()","5fd357fc":"PortfolioContent(uint256,uint256,uint256)","5fd4b08a":"getName(address)","5fd56dfc":"AllInOne()","5fd56e98":"whoHadTheBiggestDick(uint256)","5fd5e3b4":"newEvent(uint256,address[],uint256,uint256)","5fd65f0f":"swapStorage()","5fd72d16":"addAllowance(address,address,uint256)","5fd7793a":"setStreamerContract(address,uint256)","5fd8c710":"withdrawBalance()","5fd8d3d1":"maxInvestorCap()","5fd9d610":"verifyGameResult(bytes32)","5fd9dff6":"allowance(address,address,bytes)","5fd9e124":"pStopBlock()","5fd9e693":"Crear_rifa(uint256,address)","5fda0dc1":"isOnExchange(uint256)","5fda83f6":"TokenTransferDisallowed(uint256,address)","5fdba1de":"setIBalance5(uint256,uint256,uint256)","5fdbba04":"debatePeriodOf(uint256)","5fdc1a97":"AllSportsCoin()","5fdc9e0a":"dropSupply()","5fdcd306":"check_status()","5fde0ed5":"getCountBySeller(address)","5fde731c":"wdiv(uint256,uint256)","5fdf05d7":"two()","5fdf5357":"sortDescBy(uint256[],uint256[])","5fdf60fb":"circulation()","5fe07013":"revokePermission(address,bytes32)","5fe0e081":"changePeriod(uint256,uint256)","5fe16454":"Fragment()","5fe22c8b":"testFailTransferWithoutApproval()","5fe27ab0":"createHKG(address)","5fe2d689":"getInterest(uint256)","5fe36964":"TEAMS_TOTAL()","5fe3854e":"calculatePrice(uint256,bool)","5fe3b567":"comptroller()","5fe44141":"getRegistryDataRegistered()","5fe4c0f3":"validationTime()","5fe59b9d":"setMotd(string)","5fe5b825":"AuthComplete(address,address)","5fe6fb19":"ConsultaProva(string)","5fe736e9":"createContractPlayer(string,uint256)","5fe745ea":"unlockOwnFunds()","5fe75764":"specialAccounts(address)","5fe772c6":"buyStakes(address,address)","5fe78b9b":"_getCurrentBonus()","5fe825f8":"getHodlOwner(uint256)","5fe8e7cc":"getHolders()","5fe9219a":"transferToMainViaRelay(address,uint256,uint256)","5fe98f99":"_getPayOut()","5fea13f8":"distributeToken(address,uint256,uint256)","5fea3de9":"getDuration(uint256,uint256)","5fec4be9":"issue(address[],uint256[],uint16[])","5fec5d0b":"isDelegate(address,address)","5fed2091":"addLovers(bytes32,string,string)","5fed22a4":"payOffClientDebt(uint256,uint256)","5fed2edd":"pushArray(bytes32,bytes32)","5fee0aac":"giveBattleBonus(address,uint256)","5fee63c3":"calculatedTo()","5fee8a4b":"getCommitThreshold()","5fef2094":"qryModuleDetail(string)","5fef4d34":"setOwner(address,address,bool)","5ff149ba":"UpdateEthBalance(uint256,uint256,uint256,uint256)","5ff1569e":"developmentPercent()","5ff19392":"strToUnderlierType(bytes32)","5ff1a9c0":"setPlAAdress(address)","5ff3b980":"getCooloffPeriod()","5ff456cb":"refundToOwner(uint256,uint256)","5ff46857":"getEthToTokenMakerOrderIds(address)","5ff4909b":"setAbel(address)","5ff4ae32":"setGasForDCN(uint256)","5ff4f876":"NFTBalanceOf(address)","5ff63abc":"ETimesChain()","5ff65efe":"MaxPoSXblock()","5ff6b342":"getValidDurationNonce()","5ff6cbf3":"getMessages()","5ff6e9d0":"investtokens()","5ff77b22":"checkTeamToAdd(uint64,uint64,uint64)","5ff79c07":"DenmarkvsFrance()","5ff7ec2f":"SoldTokensFromCroupier(address,uint256,uint256)","5ff7f947":"setSinistre_effectif(uint256)","5ff85cc0":"feeUnit()","5ff8b778":"findWinners()","5ff97818":"setMetadata0(string)","5ffabbce":"teamReserveTimeLock()","5ffb1578":"pushArrayValue(uint256)","5ffbba3f":"relativeDateSave()","5ffc7cc7":"transferProfit(uint256,uint256)","5ffcb734":"setTokensControlInfo()","5ffcbe30":"voteForCandidateViaProxy(uint256,address)","5ffce121":"getTopCompanyCount()","5ffd59bd":"GetBalanceOwnerForTransfer(uint256)","5ffde7be":"priceUpdateInterval()","5fffad5a":"setselfdropvalue(uint256)","5fffb7c7":"changeTokenAddress(address,int256,address)","600005b3":"Delegation(address)","60003918":"AllWorksToken()","6000eb9f":"getTeamInvest(uint256,uint256)","6001279f":"decreaseApprovalByLegacy(address,address,uint256)","600160a3":"bet_luse()","6001b23e":"getCustomerTxAtIndex(address,uint256)","60027c25":"bankrollLockedUntil()","60035c3f":"swipeHoney()","600440cb":"upgradeMaster()","60048290":"Kanzhang()","60063887":"transferDebt(address,address,address,uint256)","6006eb9b":"Demor(uint256,string,string)","6006f178":"WitdrawLenderProfit()","600720c2":"sponsoredJackpotAmount()","6007c4f8":"isTokenSaleOngoing()","6007c836":"setIndividualMaxCap(uint256)","60084004":"getRectangleArea(uint256,uint256)","6008fb07":"EtherGit(address)","60095dcb":"stopCharging()","60098088":"deleteCar(uint256)","6009eed3":"crowdSaleOpen()","600a686e":"setResponse(address,string)","600b1ff2":"setBlackBox(address)","600c200e":"ANIToken(uint256,string,string)","600c523b":"LogIssue(address,uint256)","600cf0d9":"getOrdersOfOwner(address,uint256,uint256,bool)","600d05ac":"XZARToken()","600d0beb":"isInRaffle(address,address)","600d7003":"retrieveTokens()","600da23a":"checkTimeBonusPercentage()","600de26a":"getDigitFromUint(int256,uint256,uint256,uint8)","600e0ee7":"getMySeeds()","600e85b7":"tokenGrant(address,uint256)","600f8cfc":"registerByList(address[])","60104cef":"createGame(uint256,uint256)","60116397":"Registrar(address,bytes32,uint256)","6012042e":"verifyPayment(bytes32,uint256,uint256,uint8,bytes32,bytes32)","60136123":"NTToken()","6013aa44":"testControlCreateSameNonce()","6013d092":"tokenSaleLimit()","6014e37c":"getLLV_edit_15()","60154e85":"payComision()","60155673":"TEC_TEAM_WALLET()","601570ea":"getResponseString(uint256,bytes32)","6016db70":"getAssetMinAmount(address)","6016dd4a":"credentials(address)","60173ede":"FondoNetwork()","60175bcb":"ActivityCore(address,address)","6017bb61":"Death()","6017d51d":"testInt(int256)","6019061b":"createSale(uint256,uint256)","60192799":"steps()","60196008":"replaceLevel(uint256,uint256,uint256)","601a0e77":"pseudoRandomUint8(uint8)","601ab918":"CashBetCoin(uint256)","601b349c":"removeCollaborator(uint256,address)","601ba73a":"setMainSale(uint256)","601cd624":"transfersAreLocked()","601d3910":"reconcile(address[],int256[],uint8[],bytes32[],bytes32[])","601d54eb":"ZTCrowdsale(address,address,address,uint256)","601ee75e":"SPINToken(address,address,uint256,uint256)","601fba02":"activateBuyback(uint256,uint256)","601fc832":"getObserverAtIndex(uint256)","6020b90a":"_internalTransfer(address,address,uint256,bytes)","6020d2c5":"_newSaddle(uint256,uint256,uint256,bool,address)","60213b88":"getInitialWithdrawal()","60214c6f":"test_method()","60217267":"stakedBalance(address)","60219c7b":"totalTokensForSale()","6022e6f8":"createProposal(address,uint256,string,bytes)","602451ea":"showAuthorizerOneAmount()","60246c88":"getPoolInfo()","602501a1":"SGD_Omnidollar()","602512e1":"setDifficulty(uint256)","6025d3e5":"finalizeAll()","60261ce6":"deadlinePreIcoOne()","6026bb86":"battleUnitIdRange()","6026c151":"offerGanTokenForSale(uint256,uint256)","60274396":"createDutchAuctionToBuy(uint256,uint256,uint256,uint256)","60281080":"HBVToken()","6029755e":"_generatePersonalNumber(string,uint256)","60299843":"minWeightDeduct()","6029b13f":"collect(address,address,uint256,bytes32,bytes32,uint8)","6029bf9f":"distributeFees(uint256)","6029d66f":"setRecoveryContract(address)","6029f53f":"getOrderTakerTokenAmount()","602a3fee":"sendMiningProfit(address[],uint256)","602acca1":"InchainICO(address[],uint256)","602b7001":"updateRefundApplications(address,uint256,bool)","602bc62b":"getUnlockTime()","602cd226":"DelayedPayment(address,uint256,address)","602cf359":"IOXToken()","602d7d62":"stateFail(uint256)","602e2533":"_fee(uint256)","602e496c":"fundcruVaultLockTime()","602e6623":"minePool()","602ea880":"AlphoTestTokenCoin()","602fbd79":"afterCrowdSale()","603066a4":"foundationReserve()","60312cdd":"LazyToken()","60316801":"getTokenMetadata(uint256)","6031749c":"updatePassport(address,uint256,bytes32,bool)","60319f71":"EOEToken()","6032f4a6":"fulfill()","603318ad":"getContributions(uint256,address,address)","60339c7b":"resetUserPromoBonus(address,address)","6033abd5":"CafePayed()","6033cdc6":"voteToUpdateMaritalStatus()","60344938":"changeCongress(address)","603510cb":"USDYToken()","60351748":"genericAction(bytes32[],address)","603546b9":"UnMint(address,uint256)","603553df":"ReederemEvent(address,uint256,uint256,uint256)","603601d5":"esercita_potere_pubblico()","60368a33":"totalBribery()","60368f30":"XLedger()","603709e3":"get10Characters(uint16)","60393a55":"addPeriod(uint256,uint256)","6039c60c":"fiveTimes(address,uint256)","6039fbdb":"addTokens(address,uint256)","603a552e":"engineer()","603c1370":"onNewLoan(uint256,address,uint256)","603c5e52":"SetCreditsPerEth(uint256)","603ccf5e":"AMBASSADOR_SEVEN()","603d1b98":"guardian1()","603d1d1c":"setSellOpen(bool)","603d1ed9":"createdOn(uint256)","603daf9a":"getBuyer()","603e3a40":"bulkBuy(uint8[],bytes6[],uint32[],uint32[])","603f4d52":"saleState()","60425c48":"TokenSellPercentage()","604269d1":"isMain()","6042a760":"icapTransfer(bytes32,address,bytes32,uint256)","6042fbe1":"maxPower_()","60434dcf":"getGitHub()","60445142":"depositCntr()","604497a2":"_transferFrom(address,address,uint256,bytes,bool)","6044ce6e":"cancelAgonForce(uint64)","60456068":"appreciationStep()","60457034":"setVerificationStatus(bytes32,bool)","6045804f":"delManager()","60464627":"totalWithdrawals()","6046c37f":"activateEmergencyProtectedMode()","6046d718":"loggedTransfer(uint256,bytes32,address,address)","6046f71d":"getProposalEthReward(bytes32,address)","6047a00e":"bonusTokensPool()","6047f7f5":"getTotalBmcDaysAmount(uint256)","60483a3f":"submitEtherProposal(uint256,string)","6048e89e":"setEthToBeClaimed()","60493ea4":"ico4Raise()","604a4bc8":"createTrackFromBack(bytes32,uint256)","604a4f9d":"regularTicketPrice()","604a6fa9":"Random()","604aa2cb":"backResiliumOwner()","604b2399":"_hasFlag(uint256,uint256)","604bf292":"safeSubtrNCP(uint256,uint256)","604c0b60":"transferBuyer(address,uint256)","604c7ef4":"BCBtuCoin()","604ca461":"addStory(bytes12,bytes12,uint256,uint256)","604cc1a5":"startGiveaway(uint32,uint256)","604ce56c":"MAX_ACTIVE_CANVAS()","604d3943":"poolCut()","604e3588":"SmartDollar()","604e4732":"tryFinializeLastProposal()","604e5fb8":"structureIco(uint256)","604e7af6":"totalDropTransactions()","604f87d8":"transferFromCallGas()","604f90a8":"getGladiatorChestAvailable()","604fc446":"getAddOnNeeded(uint16)","60500245":"registerName(string,bool)","60506aff":"initialDeposit(address)","6050eeb4":"_createLibrary(string,string,address,address,uint256,uint256)","6051c7cd":"acquireTokens(uint256,uint256,address,uint256,address)","60521116":"showPoolInfo(uint256)","60528e7b":"proxyWithdraw(address)","6052a849":"getEtherToBuy(uint256,bool)","60536172":"takeOwnership()","60542557":"SmartExchange(string,string,uint8,uint256)","60546602":"isAbsent(bytes32)","6054da0b":"setNextCommonTTMTokenId8(uint64)","60566675":"LeoCoin()","6056969b":"announce(bytes32)","6057361d":"store(uint256)","60577043":"tixFund()","6057f2ca":"addDealer(string,address,uint256)","60583488":"get_info()","60585358":"getByte()","60589137":"ListingCancelled(bytes32,uint256)","60595433":"Pass()","6059838b":"tierTwoPurchase()","605a18c2":"setTokenTransferFeeProp(address,address,uint256)","605a42db":"superDragon(uint256)","605a8ea3":"AvailableCommission()","605ae1d0":"BIDTToken(address)","605b24be":"gcard(uint256,address)","605c0209":"ZorffToken()","605c2dbf":"ManagerChanged(address,address)","605c43de":"getBetById(uint256)","605cee71":"delWallet(uint256)","605de51d":"getTotalSponsorship(uint256)","605e5ee1":"delWhiteList(address)","605f2ca4":"distributeTokensToContributorByIndex(uint256)","605ff295":"CelebrityToken()","60608438":"setCurrentAndNextSnapshotBalance(address,uint256,uint256)","60616ae2":"BllotPro(bytes32[])","6061d692":"month30Unlock()","60621984":"Mining24(uint256,uint256)","606224f8":"sendPendingAmounts(uint256,uint256,address)","60643652":"maxEntrants()","6064d863":"revealedCeilings()","6065140b":"setKYCVerificationContract(address)","60654e47":"getLotteryBalance()","60659a92":"tokensAvailable()","6065fb33":"genesisAddress()","60662fe2":"TOKENS_TOTAL_SUPPLY()","60668e58":"getData_5()","6066b066":"isSaleMarket()","6066ed11":"getCombatsCount()","6067be79":"getInvestedSumToRound(uint256)","60689557":"Rock()","6069272c":"getAllEntityIds()","60694549":"withdrawUserPrize()","60699026":"mulSafe(uint256,uint256)","60699d92":"createPersonalTime(address,uint256)","606a1f7a":"EtheremonTrade(address,address,address,address)","606a405e":"getAddressPlayNumber(uint256,uint256,uint256)","606a7f01":"Addr4()","606a9584":"_forwardPoly(address,address,uint256)","606aed30":"withdrawOwedToken(uint256,uint256,uint256)","606baff8":"minCrowdsaleAllocation()","606bc9a5":"setOwnerHoverText(address,uint256[2])","606ce3bf":"set(uint256,uint256,uint256,uint256)","606d0d14":"executeOffer(uint256,bytes)","606d55b1":"getY(uint256,bool)","606da54e":"XBLContract_addr()","606dc104":"openRaceCount()","606deecd":"requestData()","606ec65d":"TransferUpdated(address,uint256)","60702417":"MakeERC20(uint256,uint256,string,string)","60704108":"getAssetProxy(bytes4)","60708ae3":"issueAndCommit(address,address,uint256,uint256)","6070f1be":"NodeMCU_Endpoint()","60711058":"getUserDeposit(address,uint256)","6071eb5c":"ecosystemReserve()","60721b7c":"debitAmountToRefund()","607267d3":"getPlayerRoundDividend(address,uint256)","60726abb":"copy()","60727416":"newUserFrom(address,string,string)","6072ec64":"auditData()","60733572":"setUnicornToken(address)","60734859":"changeSaleTokenLimit(uint256,uint256)","6073660a":"findNextDay(uint256,bytes2)","60737a7c":"FaucetToken(string,string,uint8)","6073d045":"userDepositedWei(address,address)","6074123c":"AthlierToken()","607485fe":"firstYearMinedTokenCap()","6074b806":"updateOrderbook(address)","607531b6":"bitownToken()","6075eb7d":"openChest(uint256)","6076a3d5":"setEarlyParams(bool,uint256,uint256)","60771261":"scalarBaseMult(uint256)","6077759c":"bubbleSortAllMatches()","6078268b":"advisorsTokens()","60785bd1":"easyUpdateMatriarch(address)","6078b87e":"communityPeriodLength()","60795d80":"requestAllowance()","607a124f":"setAttrs(address,address,address,uint8,uint256,uint256)","607af216":"getRepresentedDTH(address)","607b463a":"getCash(address)","607b9169":"toOwner()","607b9f97":"safetyWallet()","607cbaff":"viewPetitionShareholder(uint256)","607d35c4":"uint5ToStr(uint256[5])","607db616":"tokenAllocate()","607dbae5":"ProofOfIdleness()","607dc1d6":"createNewCSCResource(string,string,uint256)","607eaf70":"investorBankroll()","607ecd96":"checkAccBalance()","607fa5a4":"updateRequired(uint256)","60805e5a":"unlockAddress(address,bool)","60808037":"numTokensForContributor(uint256)","6080af05":"setVoterStakesContract(address)","6081f5cb":"calculateBonus(uint256)","60820d80":"getOwnedTokens()","60827be8":"IDChain()","60829f8a":"unstake(address,address,uint256)","6082a02c":"getPriceIdv(bytes32)","6082a6ad":"Punani()","60834493":"Veetune(uint256)","60836aa4":"changeDevCut(uint256)","6083e59a":"maxDeposit()","608427e6":"ApolloSeptemTokenPurchase(address,address,uint256,uint256)","608458eb":"TOKEN_FOR_SALE()","6084747f":"mostRecentBlock()","60851f28":"viewThirdLotOfClauses()","6085e6af":"tokenSellData()","6086e22f":"calculateInitialPayerDeposit(uint256)","608716ad":"CryptoMoviesToken()","60874b27":"SpankICO()","60887081":"IEOStarted()","6088a917":"artworkRegister()","6088caf3":"tier4Time()","608980eb":"intervalsAt(uint256,uint256,int256)","6089e3c4":"BitCashPlatform()","608bc08c":"airDrop(address,address,address[],uint256,bool,address)","608bd7f4":"setLong(address)","608be57f":"_startNextAccountingPeriod()","608cadb8":"Goldmint(address,address,address,address,address)","608cb457":"SLACK_PERIOD()","608cc40a":"createRules(address,address[])","608d031a":"checkMiningActive()","608d576b":"getMultiRequestRegistrar(uint256)","608d670a":"XfStandardToken(uint256,string,uint8,string)","608e7fa6":"addAlias(bytes32,address)","608e9122":"InbestToken()","608eaa6a":"setFiscalVerify(bytes32,uint256,uint256,uint256)","608eba96":"_createCard(uint256,uint256,address,address)","608f102e":"District0xContribution(address,address,address,address,address[])","608f1f7e":"DGDTalk()","608fc07a":"updateSalesWallet(address)","60900c88":"coinprice()","60909c51":"closeDataResponse(address,address,bool,bool,bytes)","6090befe":"setCompanyWalletAddress(address)","60913244":"botOnSale(uint256,uint256)","6092019a":"MAX_FUNDING()","6092e55b":"createCDPLeveragedDai(uint256)","60938601":"approveOnly()","6094fae8":"finishTransfer(uint256)","609526c2":"generateRandomNumber(uint256,uint256)","60953744":"Mul(uint256,uint256)","60958192":"getProposalTTL()","6095c2d5":"setExchangeCommissionAddress(address)","60961955":"addFakeVisitors()","609619b4":"SecurityDepositRegistryReplaced(address,address)","60965dc0":"firstRoundWMStart()","609669eb":"StopIcoManually()","6096bbde":"_getGameAuctionGap()","609725ef":"getCurrentPassportLogic()","60972a84":"reissuedTransactions()","60975988":"PING_ORACLE_INTERVAL()","60979759":"p_setOwner(address)","6097bca9":"atnSent()","60994bb0":"_createRoc(uint256,string,uint256,address)","6099af40":"setConfigBool(bytes,bool)","6099ecb2":"pendingRewards(address,uint256)","609a54b0":"get_all_sellable_token()","609ab538":"newSchellingRoundEvent(uint256,uint256)","609ada00":"logEntropyTxDetails(string,uint256)","609b5785":"_mainsaleSupply()","609b8394":"setAnimator(address)","609ba988":"approveAdvertiserCharges()","609bdc71":"MintableMultiownedTokenTestHelper(address[],uint256,address)","609bec67":"period3Denominator()","609bf323":"VestedTokenMock(address,uint256)","609bf6ba":"GetGuestCount()","609d2bc5":"oraclize_setConfig(bytes)","609da897":"setupCompleted()","609df32f":"listNode()","609e5ca4":"getTournamentAmt()","609ec605":"toBytes(bytes4)","609f8fe2":"verify(string,uint8,bytes32,bytes32)","609f9a8e":"betFromGame(uint32,bytes32)","609ff0fb":"developersRecipient()","609ff1bd":"winningProposal()","60a10fa7":"setBridgeHeight(uint256)","60a11672":"safeTransferFromWithData(address,address,uint256,bytes)","60a1623f":"_withdraw(string,string,bool)","60a1f397":"_evaluateArea(address,uint8,uint256)","60a22932":"totalSaledToken()","60a22fe4":"nextMinimumBond()","60a31921":"dividendsOf(address,address)","60a4a929":"Assigned(address,uint256,uint256)","60a4d104":"dteamVaultAddr2()","60a4d1a5":"AddNewCard(uint32,uint32,uint8,uint16,uint16,uint16,uint16,uint32[])","60a4d599":"getPreICOLength()","60a59bdb":"random_number()","60a60fd8":"testProxyCallWithValue()","60a64947":"getAdv(address)","60a703ea":"ReceivedOwnership(address)","60a72c29":"getAppData(address)","60aa0e1c":"ICO_token_supplyCap()","60aa6b9e":"changeDueDate(uint256)","60ab5852":"issueTokens()","60acf888":"token_transfer(address,address,uint256)","60ad2391":"settlement(uint256)","60ad5bd0":"getCountrySpots(uint16)","60ad970d":"getLoansForAddress(address,uint256)","60ad9d7b":"burnByAddress(address,uint256)","60ae1eb5":"buySaleCardFromSys()","60aeac18":"neverPayBack()","60aef331":"buyTokensBonus(address)","60af9f91":"masterRecruitment()","60b0b0f0":"contribute(uint256,address)","60b1e057":"EVMSCRIPT_REGISTRY_APP_ID()","60b1e173":"getProof(uint256,address,address)","60b2a56a":"drawWinner(uint256)","60b35739":"_multiMint(address[])","60b38880":"TemperatureMeasurementA(address,int8,int8,uint16,string)","60b431a4":"testGetSig()","60b4a8fd":"getLastBidId()","60b6aa92":"privateIcoEndTime()","60b6ff5c":"ioucoin()","60b73223":"refundMoney(address,address)","60b7b3f6":"getCurLotIndex()","60b82e2e":"getRandomNumberList()","60b831e5":"cancelCall(bytes32)","60b95da5":"YclDoCoins(uint256,string,uint8,string)","60b99afb":"getIconiqMaxInvestment(address)","60baabf3":"nizk_setup()","60bba03d":"setTeamMember(address,bool)","60bc59b7":"__addressToString(address,address)","60bc5a06":"airdropManually(address,uint256)","60bce2f4":"usdPerEth()","60bd409e":"setAllowSellLands(uint16)","60bd7a9d":"statuses()","60bddc04":"getRateScore(uint256)","60be3547":"newLottery(uint256,uint256)","60be5f70":"newUser(address,bytes20,uint64)","60bea672":"createPorscheTicket(address,uint256)","60bebe98":"translateTileToWidth(uint16)","60bf1d2f":"ownsHive(address)","60bf46ea":"setQuotePriority(address,uint256)","60bf4dd5":"PGO_INTERNAL_RESERVE_CAP()","60bf9a84":"getbetData(uint256,uint256,address)","60bfe04e":"setRewardOpen(uint256)","60bff45c":"_addHolder(address)","60c1461f":"setNewICOTime(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","60c17d1d":"freedWosPoolForSecondStage()","60c17eec":"eventPaid(address,uint256,uint256,uint256)","60c20c16":"addOffer(string,uint256,address)","60c2db45":"walletTwitter()","60c2f663":"toUINT128(uint256)","60c311fd":"doBurnFromContract(address,uint256)","60c31544":"exporterReceivedPayment()","60c326ea":"setModel(address)","60c46821":"fundContractForRefund()","60c5cc3a":"acceptProposal(uint256)","60c6171c":"calculateGoldBuySimple(uint256)","60c66c5c":"maxNumOfPayoutCycles()","60c6b3a5":"claim(bytes,address,uint256,uint8,bytes,bytes)","60c6ccb2":"removeMonsterIdMapping(address,uint64)","60c6ec6f":"validState()","60c71546":"enableTransferEarlier()","60c72285":"submitRemoveOwnerTransaction(address)","60c79d00":"setNumTranscoders(uint256)","60c7bb5a":"host_lottery(bytes32)","60c7d295":"cache()","60c82d6f":"addAddressToWhiteList(address,address)","60ca46cd":"toTokens(uint256)","60ca6890":"_submitTransaction(address,uint256,bytes,bytes,address,uint256)","60cb66d0":"sum(int256[])","60cb8884":"TokenBank()","60cb96be":"CollectibleIndex0()","60cc2e8c":"maxGoalReached(uint256)","60cce8a5":"getValuableTokenAmount()","60cd4ba4":"getTimeBasedBonus(uint256)","60ce03d5":"totalTokenIssued()","60cf7133":"testSetPermissions()","60cfc624":"setLLV_edit_26(string)","60cfd359":"mainSale()","60d12fa0":"getExecutive()","60d1c056":"usedPaymentSupply()","60d1ce36":"collectibleIndexToApproved(uint256)","60d26f01":"ownerTransferWei(address,uint256)","60d2bee9":"addArtistSignature(uint256,bytes)","60d3b4b0":"frwd()","60d3e4c5":"isDistributionInProgress()","60d4c79b":"burnOneBroGlobal(uint256)","60d50130":"FineArtsToken(uint256,string,string)","60d586f8":"getValue1()","60d60d2e":"countcomp()","60d60dad":"mainSaleFirstEndDate()","60d63425":"StakePool(string,string,uint8,uint256,uint256)","60d704db":"getBank()","60d8c2d2":"oneTokenWei()","60d938dc":"isPresaleActive()","60d975c9":"GG()","60d9c823":"removeClientAuthority(address)","60d9f0a8":"setNotarius(address)","60dab6be":"ActionAgon()","60dccd89":"getContentAccount(uint256)","60dd5f90":"getPolicy(string)","60ddd8e8":"sumICOStage2USD()","60dddfb1":"votingWeightOf(address,uint256)","60dde4c2":"queueFront()","60de94d0":"setCCH_edit_11(string)","60e036a0":"EtheremonAdventurePresale(uint256,uint256,uint256,uint256,uint256,uint256,address)","60e092c6":"cancelOrder(address,address)","60e11e16":"Lira()","60e232a9":"changeVault(address)","60e2f6e8":"createProxyAndCall(bytes)","60e30a02":"ChinaInvestmentExchangeToken(uint256,string,uint8,string)","60e393c6":"DEVELOPER2()","60e39f73":"PotatoToken()","60e45f04":"UBSexToken()","60e474e3":"_issue(address,uint256)","60e4c1ac":"LogReceived(address,uint256)","60e519c0":"computeMarginAmount()","60e587f9":"goldReward()","60e5ef3a":"getPrice(uint8,uint8)","60e65bb8":"startTrading(bool)","60e68a25":"dash()","60e6cfd8":"addKey(bytes32)","60e6fb26":"resumePurchases()","60e708b3":"balanceOfUnlockTokens(address)","60e794de":"stageDataStore(uint256)","60e7a381":"o_aprendiz(uint256)","60e805c5":"LogMigrationCanceled(address,address,address)","60e85674":"checkLogin(address)","60e99b77":"getProposalState(bytes32,bytes32)","60e9c78b":"isNeedCheckTickets()","60e9f17e":"CRDToken()","60ea110b":"fromToken(uint256,uint256,uint256)","60eabebd":"CreateAPP(address,uint256)","60eb2826":"Badge()","60ebb498":"adminCancelWithdrawal(address,uint160,string)","60edc4c4":"timeOf(uint256)","60ee66c9":"setSubcontinentDiscoveryVotingContract(address)","60ef6037":"buySaddleShop(uint256)","60f01452":"updateEggs()","60f14509":"hodl()","60f17941":"tokensGranted()","60f1d148":"getMaximumBetAway()","60f247b5":"confirmTransaction(uint256,address)","60f2b9af":"setDocumentData(string,string,string,string,string)","60f2e1c0":"buyAndCrave(string)","60f2f673":"setcoe(uint256)","60f38d91":"endEarlyStage1()","60f5ac86":"campaignOpen()","60f5d0d8":"ReloadKeys(uint256,uint256,uint256)","60f61a4c":"buyUnitRaffleTicket(uint256)","60f66701":"useCoupon(string)","60f69dc0":"partnerReservedSum()","60f6e71d":"KuendeToken()","60f6fb2e":"chunkedWeiMultiple()","60f75530":"countRemaining()","60f75f3b":"closeMarketOrder(uint256)","60f8af90":"refundRound()","60f8bbb8":"setPuppySports(address,address)","60f8dab7":"userRefund()","60f8e036":"manageStatus()","60f96a8f":"parent()","60fb4aa0":"founder4Wallet()","60fd0668":"WAVcoin()","60fd0e91":"mintlist(address[],uint256[])","60fd1e66":"_movePendingToSetting(uint256,uint8)","60fd902c":"gnosisToken()","60fdd1c9":"setStakeRate(bytes32,uint256)","60fdf8ff":"GameEnded(uint256,uint256,uint256)","60fe136e":"BogdanoffCoin()","60fe47b1":"set(uint256)","60fece43":"percentForTeam()","60ff77cc":"ledgerRecordAdd(uint256,bytes32,uint256,string,uint256,bytes32,uint256)","61001cd3":"testIsStarted()","61004364":"depositTokenTo(address,address,uint256,uint256)","6100b1e1":"resetDiscounts()","610103d9":"changeTxFee(uint256)","61012e15":"phaseLength()","6101a1f7":"unitStealingCapacity(uint256)","6101d16b":"getNumberOfSharesForAddress(uint256,address)","6101d4f5":"payTheMan(uint256)","6101f748":"FundsRegistryWalletConnector(address[],uint256)","61025532":"permitBurning(bool)","61027f78":"paying()","610285d2":"testControlRetractLatestRevisionDoesntHaveAdditionalRevisions()","6102c049":"getBatchNumber(address)","6102d419":"getEthForMetResult(uint256)","6102e4e4":"verifyProof(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[11])","610358ae":"removePrivelegedWallet(address,address)","61039bef":"releaseLocked(address)","6103ae75":"AGENCY_ADDR()","6103d70b":"withdrawPayments()","6103d915":"Winners(uint256)","6103dda6":"mutate(bytes32,bytes32)","6104464f":"previousPublishedVersion()","61046d8b":"setRLCPerETH(uint256)","61047ff4":"fibonacci(uint256)","6104d75a":"deathData_f13()","61050bb7":"_fetchPaidOrdersForPayer(address)","61053cd3":"tokensByUsdTx(string)","6105b499":"artCopyright()","6105c8af":"stubFunction(address,uint256)","61064b48":"GetInvestorAddress()","61064b5a":"processMarkings(address,uint256)","61066dc3":"enableServiceMode()","610757e4":"_wallet()","6108b5ff":"channel_deposit_bugbounty_limit()","6108bd0e":"sowCorn(address,uint8)","61096820":"CETH()","6109e255":"EtherSent(address,uint256)","6109ff33":"BihuaToken()","610b16ab":"onTransferStack(address,uint256,uint256,uint256,uint256,uint256,bytes32)","610b1abd":"lottery(uint256,uint256)","610bafaa":"getTotalBPOfAddress(address)","610bbebd":"Sensor()","610be654":"closeContract()","610c1d68":"addNtf(bytes32,uint256,address)","610c3009":"badgeName()","610cbcc7":"logHash(uint256)","610d006c":"getSourceConstraint(int256,uint256,uint256,uint256)","610d5de8":"validateEndowment(uint256,uint256,uint256,uint256,uint256)","610da891":"debug3()","610e9ed0":"postDisputeEth()","610efc86":"RegisterMine(string,uint256)","61101bed":"getTAmount(uint256,uint256)","611067a1":"Rate7()","61116d1d":"masternodeDeregister()","6111bd91":"cyberEntry2(address,bytes32)","6111ca21":"enroll(address,uint256)","6111dd02":"calcCostsSelling(uint256,uint8,uint8,uint256)","61129a80":"getEarlyIncomeMul(uint256)","6112c2ab":"summPartnerships()","6112c7c9":"RedirectChanged(address,uint256)","6112e8ac":"mint(address,uint256,uint8)","6113611f":"stakeVoted_Eth()","611408ff":"latestReleaseUrl()","6114dc0f":"lastFlight(address)","61150aae":"ethusd()","61161aae":"bury()","61162182":"storeDoc(string)","6116ec49":"VotingFinished(address,bool)","6117525b":"initialClaesOffering()","6117b80c":"getFixedAndShareFees()","6117c9db":"retainedTokensVault()","61186e23":"getCountdownDate()","611a20ae":"IotcToken(uint256,string,uint8,string)","611b4095":"isWhitelisted()","611c4662":"getPriceByDayIndex(uint16)","611c7f50":"Core()","611cb25f":"failStage()","611cb6aa":"Vault(address,uint256,uint256,uint256)","611daa7e":"EmergencyBalanceReset(uint256)","611eb470":"maximumICOCap()","611ef452":"cancelDelivery(string)","611efc09":"sale(address,uint256)","611f1fbe":"itsLikeChicago()","611f64f9":"setTokenPrice(uint128)","611f69de":"__proxy_motion(address,uint256,uint256,bytes)","611fd026":"showApproveToken(address)","61203265":"organizer()","6120ada7":"setAuto(uint256)","6120e125":"TUMIYUNTOKEN(uint256,string,uint8,string)","6120ffbc":"accountsPayableHeld()","61211087":"firstAuctionsHighestBidder()","6121e522":"teleportPrice()","612249fb":"communityContributionSupply()","6123218b":"registerPurchase(bytes32,address,uint256)","61235639":"AcreToken(address,address)","6123c63f":"removeEmbassy(address)","6123dfc3":"NoWinner(string)","6123f7ba":"onlyWithValidSignatureAndMethod(bytes)","61241c28":"setTokenRate(uint256)","612472fe":"toZT(uint256)","6124a577":"whitelistController()","6124e4e7":"dividendContract()","612544b3":"getReservedTokens(address)","6125fd20":"voteForRefund(bool)","6126cb99":"registerAsset(address,bytes32,bytes8,uint256,string,string,address[2],uint256[],bytes4[])","6127421d":"tokenPayments(address)","6127a1ad":"_setRarityValue1(uint256)","6127cfd9":"verify_withdraw()","6127f246":"getActiveTasks()","61282631":"tokenMintedSupply()","612845fc":"claimQueen(uint8)","612867c2":"calcRefund(bytes32)","6128a4f3":"investorsLosses()","61296540":"rewarded_refresh()","6129f25f":"setReferralPercent(uint256)","612a711f":"SimpleERC20Token(uint256,address)","612a7562":"setBountyRegistry(address)","612ab238":"balanceOfOnForHolder(address)","612acecc":"frozenForever()","612bfae2":"description4()","612c0968":"privateSaleRate()","612c56fa":"submitVote(uint256,bool)","612c9dea":"unreserveFor(address)","612d6061":"getExpectedMinReturn(address,address,uint256)","612d669e":"setMinStakingAmount(uint256)","612e45a3":"newProposal(address,uint256,string,bytes,uint256,bool)","612e731d":"TheGreatEtherRace(string)","612eb5e7":"revokePermission(uint8,address)","612ecc48":"MINIMUMCONTIB()","612ed785":"winningTeamIndex()","612ee726":"isOnAuctionToBuy(uint256)","612ef473":"betRevealed(uint256)","612ef6e9":"isRefundApplied(uint256)","612f2f37":"setMaintenance(bool)","612ff19e":"PolicyPool(address)","61301409":"minereum()","6130ced2":"UniCoin(uint256,string,string)","6130d537":"createPartnerPlayer(uint256,uint256,uint256,address)","61314ee3":"managerAddressMap(address)","6132ca1a":"getResult(uint32,int8)","6133a0eb":"PRE_SALE_300_ETH()","6135e084":"myDividendTokens()","6135f602":"contractPartTwo(uint256)","61362b68":"reInitialize(address,address)","613696eb":"burnCadvsLeftInRefunding()","6137412c":"monethaGateway()","6137d670":"submitWhitelistRemoval(address[])","6138889b":"distribute(address[])","61389e8b":"getTokensManual(address)","6139a008":"numTokensLimit()","6139faa6":"getAllTimes()","613a626b":"SnipCoin()","613bc081":"ExternalAccountWalletConnector(address)","613c36ae":"sendToStocks()","613d8fcc":"oracleCount()","613de7cb":"subWizard()","613e0fb8":"reservationWallet()","613e2de2":"getContractInfo(bytes32)","613f4594":"totalBetAmount()","613f5b9f":"TokenContractAddress(address,address)","613f5fe8":"MAX_USER_TOKENS_BALANCE()","613f7665":"getClosedSaleWallet()","613f8dac":"sellShitClones()","613fd87a":"calcBigPromoBonus(uint256)","613fd998":"messageSpecial()","613ff46f":"rewardPerNode()","6140128f":"getTupleDetails()","61402596":"setInitialSupply(uint256)","6140af43":"preICOcollected()","6140c54c":"createProxy(address)","6140ca78":"setIsMiningOpen(bool)","6141b54b":"FundsWithdrawn(uint256,address)","6141d5d0":"CoffeeToken(address)","6142101a":"last_buyer()","61425d79":"numRequesters()","61426df4":"STCListing()","6142e78f":"allowedAmountTransferedToPoolTotal()","6142ff70":"createShipment(address,string,string,int256,int256,uint256,uint256)","61432e81":"ConsumeGas(uint256)","6143a80a":"isGameEnded(bytes32)","6143abba":"totalCreatedOfType(uint256)","6144a8a1":"ZJFPrivate()","61461954":"execute()","61463838":"getMyPlumbers()","61463b64":"_hashToAscii(bytes32)","61465a32":"distribute(uint256,uint256,uint256,uint256)","61472fd4":"CSGOBets()","61476d55":"GetTotalAmountForMultiplicator()","614781f9":"atkBoss(uint256)","6147a55c":"SwapPaused(uint256)","6147bcb9":"getPVPState()","6148fed5":"pollMap(uint256)","614939b2":"allocateTokensForTeam()","61493b97":"set_minimum_payment(uint256)","61494714":"_createNewGame(uint64)","61496b83":"endSplitAgreement()","614984d1":"getUnicornGenByte(uint256,uint256)","614a31bf":"setII_R2(uint256)","614af914":"_updateMargins()","614b3e7f":"BCSToken()","614baf5c":"withdrawAffiliateRewards()","614bbc33":"privateContribution(address,uint256)","614be0c4":"getRemainShareAmountInternal(address)","614cb904":"isFinalizeAgent()","614d08f8":"CONTRACT_NAME()","614d5f07":"stepForPrice()","614d85e1":"timeOut()","614f2b3a":"_diff(uint256,uint256)","614f3994":"SpeedyNetwork()","615155dd":"getVesting(uint256)","61523f2e":"changeEthReward(uint256)","61537010":"Whitelisted(address,uint256,uint32)","6153b827":"BancorHandler(address)","6154274d":"deleteProposal(string)","61543801":"currentPeriodIndex()","6154c16f":"MineOwner(uint256)","6154db6e":"UroToken()","61558349":"BitTeamToken()","615664ba":"Market()","6156e892":"checkOnlyContractOwner()","61571ddd":"distributionFinishing()","6157c5ec":"getGoldInfoSku(address)","615815f5":"releaseSecondUnlock()","61584936":"sealedBids(bytes32)","615878c8":"SkrumbleCandyToken()","61591a7c":"personUpdateDOB(uint256,int256)","61592b85":"getOrderDetails(uint32)","615a4e0f":"ChangeMainAccount(address)","615a604f":"setMarketer(address)","615acbae":"Freeze()","615af5fb":"areTokensSended()","615c2971":"Gametest()","615dbebb":"setContract(address,address,address,address)","615df83a":"remainderHolder()","615dfa5c":"defaultParams()","615ea899":"changeHello(string)","615ef639":"tokensClaimedAirdrop()","615f9f1f":"testFailTransferNotEnabled()","615fa416":"totalAtom()","61616292":"STCBonus(uint256,uint256)","6161eb18":"_burn(address,uint256)","61625c3a":"setLockByPass(address,bool)","61632d4d":"institutionStageSetting()","616361a7":"getArrUintField3()","61641bdc":"add(bytes32,address)","61649472":"getPoolFreezePeriod()","6165234c":"setPermissions(address,bool)","61665e40":"_premoveByValue(address)","61669dfa":"setSpecialBonus(address,uint256)","61679629":"UniversalRewardProtocolToken()","616852e9":"GoldBought(uint256,address,bytes32,string,string,bytes32,string,string,bool)","61688a85":"Lwcoin()","6168ba3c":"getWeiAggregateMayInvest()","6168c9c3":"tosell(address,uint256,address,uint256,address,uint256,uint256)","6169a7ed":"CashForHardwareReturn()","616a0997":"TokenPurchase(address,address,uint8,uint256,uint256,uint256,uint256)","616a3420":"verifySig(bytes32,bytes,bytes)","616a6371":"SingleAccountRules(address)","616b40e3":"totalInvest()","616b59f6":"deleteBytes(bytes32)","616b829d":"SwappedTokens(address,uint256,uint256)","616c9469":"Finalized(address,uint256,uint256)","616ceda7":"setJOYTokenAddress(address,address)","616d1fab":"distributeToAlternateAddress(address,address)","616d5058":"userAccounts(uint256)","616d50c3":"GCToken()","616dcf0c":"calculateTotalSupply(uint256)","616e2fd0":"FortaToken()","616eba4a":"getLocksrootIdentifier(address,address,bytes32)","616f7bc9":"addAddressesSet(address)","616fbee7":"changeMinimumBet(uint256)","616fca9b":"adopt(address)","616fe92a":"emitFeePoolUpdated(address)","616ffe83":"read(string)","61708908":"prepareDisputeValid()","6170a23e":"transferTech(address)","6170b162":"join(bytes)","6170feec":"getWinIndex(address,uint256)","61711115":"RegistrationStatusChanged(address,bool)","61718141":"totalSupplyIsLocked()","61719785":"clockmaker()","6171d7fc":"adjustTotalCoins(int32)","61725795":"setAquaman(address)","6172c0df":"updateDeposit(address,uint256,uint256)","6172f071":"setIsAllTransfersLocked(bool)","6173a70c":"initRandom(address)","6173e456":"setAMLWhitelistedBulk(address[],bool[])","617421c9":"calTripleRoom(uint256,uint256,uint256,bytes32)","61751577":"addCET6(uint32,uint64,uint64,uint64,uint16,uint16,uint8,uint8,uint8)","6175adee":"icoStandardPrice()","6175bc9c":"preStartBlock()","6175f9e2":"dragonHandler(uint256)","617605a1":"Zillion()","61764f59":"BitDATAToken()","6176caed":"HeroTrained(uint256,address,uint256,uint256,uint256,uint256,bool,uint256)","617708dd":"getEscapeRequest(uint32,int256)","61774704":"verifyBid(bytes32,bytes32)","61775ee1":"onlyBouncerRemoveExtension(address)","6177a197":"GoGoPay()","6177fa04":"setGenerateAddr(address)","6178a8b1":"splitStarFunds()","6178ac90":"_createCompanies(bytes32[],bytes32[])","6178efee":"returnToken(uint256)","617914be":"AUTH_CHANGEOWNEDOWNER()","61794267":"oldExecuteDecayFunction(uint256,int256,int256,uint256,uint256)","61798287":"safeToNextIdx()","6179ed72":"ProofOfSecret()","617a0951":"feeModifiers()","617a2a15":"icoStartP2()","617ac9a1":"SOSRcoinToken()","617b293e":"getInvestStatus(uint256)","617b390b":"approvePreSigned(bytes,address,uint256,uint256,uint256)","617bb8f5":"reject(uint32,uint32)","617c2fb8":"sell_Exchg_Reg(uint256,uint256,address)","617d2c84":"PRIMEx()","617d3c47":"RemovalPriceSet(uint256)","617d6bb4":"distributeEarningsBasedOnNumberOfCells(address,address)","617e80b4":"getPlayerShipModelByIndex(address,uint256)","617ee3a7":"MoonInc()","617f171f":"reopenDO()","617f4e3e":"set_got_refunded()","617f8666":"testFailRestartNotOwner()","617fba04":"getRecord(address)","617fc592":"priceStages()","61806891":"idVerification(address,address,uint256)","6180e4ac":"getAvailableNumbersForRaz(uint256)","6181d565":"getExpectAmount(uint256,uint256,uint256)","6181fb0a":"ERC20(uint256)","618293ba":"_updateState(uint256,uint256)","61829677":"claimdivs()","61836b0e":"lastUpdateEtherPrice()","61837e41":"get_stats()","6183c5d6":"EthereumAI(address)","618407e5":"tokenDrain()","61840c69":"getSaleSold(uint256)","61851416":"modifyCurrentVideoGamePrice(uint256,uint256)","61851679":"Protecthor()","6185bb50":"AOC_available()","6186b3e3":"showMoneyTransfer(uint256)","6186fe71":"CloseForecasting(uint16)","6187ce34":"gameRandon2()","61886014":"combineDice(uint8,uint8)","61888b40":"_percentSoldInPreICO()","618943c3":"WhitelistItemChanged(address,bool,uint256,uint256)","6189be15":"columnround(uint256,uint256)","618a057a":"_bidFirstShip(uint256,address,address)","618a1ec2":"getGoldDepositOfAddress(address,address)","618b870f":"setAmount2Claim(uint256)","618c5772":"removeTransferableAddresses(address[])","618cb85b":"GitCoinCrowdsale(uint256,uint256,address,address)","618ce6d7":"setWhitelistedAddressMain(address[],bool)","618de286":"addWhiteListMulti(address[])","618ea1c4":"terra()","618fa9ce":"getBotBillingIndex(uint256,uint256)","618fb1a6":"unsoldContract()","61903971":"MajListAll()","6190c931":"unclaimedCreditsWithdrawn()","6190c9d5":"cycle()","6190e9ca":"authorizedTokenUsers(address,address)","61919a08":"getWorks(bytes32)","6191fe9d":"FFC()","61927adb":"setDelegatedFrom(address)","61930630":"tokenStore()","61931f39":"zGetBothContractBalances()","61936d0a":"Wings(address,address,address,address)","619385bd":"newShare(address,uint256)","619419d8":"setTopic(uint256,string)","6194416b":"getProof(string,string,string)","6194acb6":"_validateOrder(uint256,uint256,bytes32,address,uint256,uint256,uint256,uint256)","6195c713":"against_proposal()","61962265":"PRESALE_MAXIMUM_FUNDING()","6196ac5b":"RubidSupply()","619792ba":"OwnershipGranted(address,address)","6197aadd":"JANDA()","6197bbab":"createRareAuction(uint256,string)","61983863":"MintedTokenCappedCrowdsale(address,address,uint256,uint256,uint256,uint256)","6198e339":"unlock(uint256)","61990759":"maxRandom(uint256,address)","6199ca26":"AmbrosusSale()","619a794d":"setAtomIsReady(uint256,uint32)","619c83ed":"completeTransfer(uint256)","619c89fe":"changeForeignBridge(address)","619caafa":"Reward(address,uint256)","619cec73":"DSHAckCoin()","619cf5f9":"batchtransfer(address[],uint256[])","619d2671":"acceptContract()","619d3063":"getNftId(uint256,address,uint256)","619d36ef":"DRAW()","619d5194":"setLock(bool)","619e6e7c":"userWalletTokenBalances(address)","619ebc4f":"GetTimeWeightedBet(uint256,uint256)","619f5e72":"takeExcess()","619fabfd":"addMultiplePublicSalesSpecialUser(address[])","619fc641":"backup_exchangeStaStb(uint256,uint256)","61a00f6d":"Ballot(bytes32[])","61a12160":"getPendingAddReserveData()","61a1d8fa":"SchmeckleToken()","61a215e4":"Controller(address,address,address,address)","61a227b6":"mtdAmount()","61a23f42":"loadReferredInvestors(bytes32[],address[])","61a2493a":"Jancok()","61a255b5":"vote(string,string,uint256,bool)","61a25f07":"lotteryFinished()","61a2d076":"isWhitelistOnlyPermissionSet()","61a3a281":"deployDefaultVestingContract(address,uint256)","61a5c4bd":"updateTokenAmount(uint256)","61a65433":"pot_total()","61a65e2a":"discountSaleEnd()","61a71303":"setMainSaleTLYperETH(uint256)","61a76900":"decode(uint256)","61a7b2f5":"transferFromIco(address,uint256)","61a99c4b":"ethDeposits()","61aa19d3":"icoAmountBonus1()","61aa8d93":"processFee()","61ab8904":"updateStats(uint256,uint256,uint256)","61ad08b5":"setSupervisor(address,address)","61ad487c":"PRESALE_PERCENTAGE_3()","61adeef4":"setUUID4Bytes(bytes16)","61aebe59":"stopSell()","61af1abd":"increasePriceAndDifficulty()","61afd5ac":"denyAccess(address)","61b121f5":"OneCoinOneBeerToken()","61b1bd04":"HumanEvent(address,uint256,address,address)","61b20d8c":"retrieveFunds()","61b2bb37":"setHalfLifeTime(uint256)","61b3516e":"MyCoins()","61b3b8e3":"p_setInvestorFundPercent_out(uint256,uint256)","61b46d61":"buyHunterLicence()","61b65fbe":"UpdateRank(address,uint256,uint256)","61b6683c":"destroyedBots()","61b69abd":"createProxy(address,bytes)","61b6f889":"handleOffchainWhitelisted(address,bytes)","61b7542d":"absMax(int256,int256)","61b79ea4":"incentiveDistributionRound()","61b7d7f4":"FiveBalanceToken()","61b87f0d":"getTokenAddressIndex(address)","61b8ce8c":"nextId()","61b930ae":"ICOfundsReceiverAddress()","61b94bc7":"LiverpoolvsRoma()","61b9739a":"setPayTo(address)","61b97435":"Register(address,bytes4,bytes18)","61b98cb3":"buyShips(uint256,uint256,bool)","61b9c6a3":"useBottle(address,uint256)","61b9c9f4":"buySeat(string,string,string)","61ba228b":"LukSevenToken()","61ba3377":"WatchLastTime()","61ba89d4":"NSCDistributionContract()","61bb246c":"secondBonus()","61bb9c52":"baseValue()","61bc1a49":"depositBalance()","61bc221a":"counter()","61bc6c57":"unauthoriseAddress(address)","61bcbe6f":"goodluck(uint256)","61bd12e0":"FAILED_STATUS()","61bdc978":"unfreezeFrom(address,uint256)","61be8456":"updateMarketData(address,address,uint256,uint256,uint256)","61beb1d7":"createAuction(address,uint256,uint256,uint256)","61bec256":"setContractActive(bool,bool)","61bec4fd":"QLANCEGO()","61bedcdc":"registerEmployee(address,address)","61bf2829":"RegistrationStatusChanged(address,bool,uint256,uint256,uint256,uint256)","61bf49ee":"plots(uint256)","61bf7692":"withdrawFoundationFunds()","61bf9c2a":"updatePoolContract()","61bfdc5d":"PatentCoinPreICO(address,address)","61bfe61b":"testAddUser(address,uint256)","61bffe01":"addIdentities(bytes32[],bytes32[])","61c003a7":"buyerNumDeals()","61c028e7":"getTokenURI(address)","61c083b9":"updateInflationRate()","61c1f224":"Q8ECOIN()","61c2c9c0":"getHowMuchUntilHardCap()","61c2e349":"create_a_new_market(address,address,uint256,uint256,uint256)","61c3b7f1":"setCharityBeneficiary(address)","61c52660":"Said(address,bytes)","61c5623d":"Vanadium()","61c61309":"setTokenController(address,address)","61c651b9":"oneQuarterInSeconds()","61c6a8e4":"addMutagenFace(uint256,uint256)","61c6bc82":"create(string,string,uint8,address)","61c748c7":"TressexToken()","61c76231":"resetBeneficiaryList()","61c7eb81":"Millionaire()","61c91c69":"webGiftLineTime()","61c9559b":"get_arbits_presale_open()","61c99b92":"msgsender()","61cac1fb":"partnersReward()","61cb5a01":"testString(string)","61cc576d":"evaluateOdds()","61cd5683":"testToByte(bytes)","61cd756e":"prevRegistry()","61cd90b0":"revealY(uint256,uint256)","61cdb1d7":"getByMesa(uint256,uint256,uint256)","61cdd2dc":"rightAndRoles()","61cec717":"changeCurrentCirculating(uint256)","61cf6d1c":"investeth2018()","61d027b3":"treasury()","61d0ad9e":"TransferFunds(uint256,uint256)","61d11318":"RedEnvelope()","61d161ea":"unitsPerTransaction()","61d3ba8a":"addWhitelistAddresArray(address[])","61d3d7a6":"isUpgradeAgent()","61d3d902":"getPlayerReferrerID(uint256)","61d43971":"updateGasCost()","61d49ea8":"reveal(uint256,uint256,bytes32)","61d51df8":"SKYSWAP()","61d5593c":"calculatePoohSell(uint256)","61d585da":"state(bytes32)","61d5f225":"minBetSize()","61d60021":"getCourseID(address,address)","61d61998":"implementsERC721YC()","61d689fa":"register(uint8)","61d68b54":"requestConsent(address,address,uint256)","61d6d385":"withdrawUnsold()","61d7c713":"validPayDest()","61d81aed":"exitBuyRequest(uint256)","61d942f3":"_removeLicenseTerms(bytes32,bytes32)","61d97c41":"GetPartyRole(address,address)","61da1439":"read(bytes32)","61da46c4":"joinDraw(uint256)","61db17ab":"_validatePurchase(uint256)","61dbbc80":"LARGE_PURCHASE()","61dbfc3f":"changeConfig(uint32,uint256,uint8)","61dc648f":"LogExternal(uint256,address,bytes32)","61dcd7ab":"createTime()","61dd8d13":"DexAlpha()","61ddf923":"_getTokenAmount(address,uint256)","61df46f6":"DatCoin()","61df5c4d":"getEncounterResults(uint256,address)","61dfacf2":"removeBuildingFromServer(uint256,uint8[10],uint8[10],uint8)","61dfdae6":"setData(address)","61e01356":"randNonce()","61e062a4":"_emitHardcapFinishedManually()","61e0f7a8":"swypeCode(address)","61e1077d":"decreaseApprovalWithSender(address,address,uint256)","61e1fe91":"setFreeDino(uint16)","61e214d8":"isValidPurchase(uint256)","61e25d23":"numActiveTranscoders()","61e3564f":"approveAccount(address,bool)","61e360b7":"maximumIndividualCap()","61e3c944":"setUint(uint256,uint256)","61e3f0a4":"setTimeBasedBonus(uint256[],uint256[],uint256[])","61e42039":"priceString()","61e49344":"buyinReturn(address)","61e4a23a":"expireGame(uint256)","61e4fd2b":"approveEscrow(address,uint256)","61e539da":"testFailWrongAccountTransfers()","61e5f5f2":"balEth()","61e60550":"TransactionDisputed(uint256)","61e6e66b":"DestroyedBlackFunds(address,uint256)","61e76056":"denyByDelegate(bytes8,bytes8)","61e7662b":"getAccountSpendingLimit(address)","61e88f9a":"test_0_validOwner_construction()","61e8ee04":"TOXTToken()","61e91ea1":"getDataContractAddress()","61ea6ed7":"transferFromBase()","61eb2e1a":"UNITStagesManager(bool,address)","61eb3836":"getProjectStatus(address)","61eb71c1":"setSellable(bool)","61eba552":"getMetaData(uint256)","61ecc8b5":"isLogo(address)","61ed2094":"demicals()","61ed373b":"comment(uint256,bytes32,bytes32)","61ed8097":"SEOToken()","61eda968":"cancelAssessment()","61edfe6e":"p_setBankOfEthProfitPercent(uint256,uint256)","61ef265b":"spaceAfterReturns()","61ef669b":"dateTier2()","61ef8d91":"setErc20Rate(string,uint256)","61efc7db":"resolveDelegation(address,address)","61efc807":"transferbatch(address[],uint256[])","61f00da2":"OMIVIAToken()","61f127dd":"_price_tokn()","61f134fa":"OZRealestatesToken()","61f15236":"addHolder(address,uint256)","61f17532":"tune(uint256,uint256)","61f188de":"createTree(string,string)","61f1c5ba":"vaultWallet()","61f1d889":"setFlag(uint256,uint256)","61f2c8b0":"_addShareToNewOwner(address,uint256,uint256)","61f2de50":"spawn(uint256,address)","61f30408":"emitTimeAdded(uint256,uint256)","61f37dff":"calculateIcoTokenAmount(uint256)","61f3c006":"setRoundMaxPerUser(uint256,uint256)","61f3c62e":"remain()","61f3cfb1":"updateExistingRaz(uint256,uint256,uint256,uint256,uint256,string)","61f43285":"gubberment()","61f529af":"initEthMultiplicator(address)","61f54a79":"getNextUnsortedOffer(uint256)","61f61867":"addSettingDeprecation(uint256,uint256,address,address,address)","61f66dc4":"updateUserClaim(address,uint256)","61f6b429":"myAvailableFunds()","61f70161":"placeOrder(bytes16,address,address,uint256)","61f7025f":"fetchBalanceByAddress(address[])","61f721e8":"HGFCToken()","61f76d67":"withdrawEtherToOwner()","61f82156":"receiveCashback(uint256,address)","61f8cdd6":"transferETHToContract()","61f8e91a":"unitTestModifyStaker(uint256,uint256)","61f9ca4d":"modifyGroup(uint256,string,string,string,uint256,uint256,uint256,uint256,uint256,bool,uint256)","61f9e04d":"getWithdrawn(uint256)","61faee9e":"noTransfer(address)","61fba37d":"investorBalanceOf(address)","61fbdf4e":"gameIsCalculated(uint256)","61fc3790":"Monthprofitend()","61fc65a0":"checkBirth(uint256)","61fc703c":"Danku_demo()","61fd718f":"getOrderAllocatedToFundPool(uint256)","61fd8f1b":"sendTokensToCompany()","61fda640":"ownerUpdateContractBalance(uint256,uint256)","61fdfa9b":"returnDeed()","61fe51a1":"rootAuthority()","61fec3a4":"clearSponsorableJobApprovals(address,uint256,address[])","61ff715f":"deploy(uint256,bytes)","61ff8191":"CirculationEnabled()","6200979e":"AngelInvestmentAddr()","6201124f":"employeeDenyExerciseOptions()","6201510a":"getPreSaleRank(address,uint256)","62016083":"removeDestinationChain(bytes8)","62017ebc":"left46(uint256)","6201d683":"createTokenUri(string)","62024dce":"forceCrowdsaleRefund()","62026229":"validateLand(address,int256[],int256[])","62027c1e":"changeCJTeamWallet(address)","620346c6":"setStopReceive(bool)","6203f09f":"MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE()","62040de3":"numberOfBoardMeetings()","62040e50":"Bitscreen(bytes32,uint8,uint8,uint8,uint8,string)","62043bd8":"DIVIDER()","62059839":"_setOwner(uint256,address)","62066eb3":"getMinimumAmount()","6206880b":"contributorsLockdown()","62074c31":"getProjectMaker(bytes32)","62075af4":"giff(uint32,address)","6207c802":"getSubjectIdentById(uint256)","6207d239":"privSaled()","620892bd":"NRB_address()","620a9c95":"BITSToken(uint256,string,uint8,string)","620b0f23":"getMyAnthill()","620b2731":"_getClientProviderUID(address)","620b5cd2":"Crypto()","620b75df":"portfolioManager()","620d025c":"roundFunds()","620db609":"rubyToken()","620eb8ee":"setDisbursementEndTime(uint256)","620edb32":"allocatePrivateToken(address[],uint256[])","620ffe99":"testFooUdate(uint256)","6211db22":"querybalance1()","621277cb":"hardCaps(uint256)","62133a6c":"getPlanetName(uint256)","62135491":"distributeTokensToMembers(uint256,uint256)","62150b3f":"KaoPuToken(address,uint256)","6215be77":"depositToken(uint256)","6215f292":"updateBasePrice(uint256,uint256[],uint256[],uint16)","62161235":"getRandomNumber(uint16,uint8,address)","6216bde5":"TokensRewarded(address,address,uint256,address,uint256,uint256)","6217229b":"sellRate()","62173282":"updateMVNRate(uint256)","6217903f":"BNB_TOKEN_PRICE_NUM()","62182636":"setParams(uint256[],uint256[])","6218e5cd":"setGuardianVend(uint256,uint256)","6218fd8b":"icoEndsAt()","6219004d":"setPosttgeAddress(address)","621a25f8":"right66(uint256)","621a61ac":"STATE_NOT_FINISHED()","621ab11a":"bonustokn()","621b23e2":"getOwner(uint32)","621bc379":"setReverseRate(address,int16)","621bd8d7":"getPreviousReportingWindow()","621c3275":"disembark(uint16,uint16,uint256)","621d388c":"senderIsAdmin()","621de5ac":"AUSBToken()","621ded8b":"FinishCompetitionEvent(uint32)","621df4be":"getCurrentElectionCycleBlock()","621e9a45":"BAQToken()","621f7e45":"setPeriodRound(uint256)","621fb946":"getLLV_edit_27()","62205bd8":"privatesaleFinalized()","622104d9":"integration()","62219866":"getPercent(uint256,uint256)","6221c805":"supplyRound3()","6221dc20":"HackableETH()","6221e77b":"Logs(address,uint256,uint256)","622235e6":"getPage(address[],uint256,uint256,bool)","62228c17":"CTADevilleToken()","62246c41":"setNickName(bytes32)","62251182":"_withdrawOwnerTokens()","6225924e":"_mint(bytes32)","6225a8ad":"GetResult(uint256)","6225b759":"setForceExecuteOfUsers(bool)","6226bddb":"getProductStructById(uint256)","6226d4b2":"addAddressToAdmin(address)","6227ed6e":"createPerson(string,string,uint256,uint256,uint256)","6227fd3a":"firstItemWrong()","622a0a19":"playerBudget()","622a10fd":"CORECoin()","622a2d31":"setDistanceAndPrice(uint16,uint16)","622ac8ed":"countWishesAt(address)","622ae7aa":"getDeployedTokens()","622af809":"setMintContactAddress(address)","622b0b29":"StakeEvent(address,uint256,uint256,uint256)","622b2a3c":"validDelegate(address,bytes32,address)","622b6659":"doBigDrop(uint256,uint256,uint256,uint256)","622c77fe":"totalSupplyLocked2Y()","622d6c97":"ExecutionError(string)","622d82df":"Buddha()","622dda96":"chooseRandomNumber()","622ddaba":"getGenesForSaleBySeller(address)","622e5026":"Insurance()","622e88cb":"testBitsXorSuccess()","622f9730":"forward(bytes,address,address,uint256,bytes,address,uint256)","622fe39f":"getLoanData(uint256)","6230ebda":"defrostFrozenTokens()","6231775b":"miniGameId()","623195b0":"setABI(bytes32,uint256,bytes)","623406d2":"setRecordContract(address,address)","6235e3a2":"getAddressCreatorById(bytes32)","6235eef3":"getCurrentReportingWindow()","62362cc2":"COIN_SUPPLY_TOTAL()","623659b4":"doTransfer(address,address,uint256,uint256)","623670b2":"sendTokensToPartner()","62373537":"current_start_divholder()","6237564c":"isDopeRaiderDistrictsCore()","6239f13d":"triggerSoftCap()","623ba5c9":"callBackGasAmount()","623d2295":"Minado(address,address)","623d2b62":"getRequiredBetAmount(uint256)","623d5652":"projectExists(address)","623d5e56":"devolverBici()","623d96ed":"preDuration()","623decaa":"unlockedTokensOf(address)","623e4fb8":"BBCToken()","623eff55":"tokensTransferred()","62400e4c":"supplyOf(address)","6240282c":"LiquidDemocracyControllerFactory(address)","6240c7aa":"COENXToken()","6241bfd1":"Token(uint256)","6244326d":"humanityFund()","6244b7ed":"unWhiteListInvestor(address)","624522f9":"accountFrozen(address)","6245adff":"DirectlyDeposited(address,uint256)","6245eb07":"setProvenance(address,uint256)","62463079":"tier2End()","62464576":"stage_2_add()","62465f0a":"GenesisManager(address,address,address,address,uint256)","62469353":"firstDepositTimestamp()","6247c38f":"updateChargingRate(uint256)","6247cfd9":"priceForKeys(uint256,uint256)","6247f6f2":"whitelistToken(address)","62486d42":"getTokensAmount()","6248cf49":"_donationSupply()","6248d6bf":"getOracleMetaData(address)","6248fd10":"SLC()","62491332":"lockPurchase()","62492e9d":"preIcoBonus()","624964c3":"getBancorContractAddress()","6249a5c7":"UnpauseEvent()","624a8bc3":"MyTotalWithdrew()","624aba21":"_getWinCountWeight(uint256)","624adc4c":"OwnershipTransferCompleted(address)","624ae5c0":"rID_()","624ba0a4":"maxImports()","624bb58f":"marketingSupply()","624bb8b3":"setCBaddress(address,address,address)","624bd6c4":"depositToken(address,uint16,uint256)","624c3dbd":"imageUploadComplete(uint256)","624c5673":"USDollars()","624cc0a5":"teamMemberAtIndex(uint256)","624d4309":"USBcoin()","624dd6a9":"getInvestmentsByCountry(uint16)","624de3d9":"InterfaceSignature_ERC721Optional()","624dee7c":"_release(address,address,uint256)","624e3b36":"totalearners()","624ecda9":"Sleep()","624f011d":"doStop()","62502169":"sendCollateral(address,uint256)","62502fe7":"getNameDigest(string)","6250bfa3":"createOrder(bytes32,bytes32,address)","625101d5":"getOwnerMoney()","625126ed":"shift_left(uint32,uint32)","6251aee6":"icoPhase3End()","625295fd":"distributeCollectiblesTo(address)","6252c127":"onCrowdsaleEnd()","6252d651":"setForegroundColors(bytes3[])","62531721":"getStack(uint256)","6253367a":"queryChallenge(bytes32)","6254add1":"PRIVATE_SALE_POOL()","6254cf80":"setGameHostAddress(address)","62564c48":"getProposals()","62568d83":"min_buy_block()","62571cac":"getTodayOwnerName()","625785bb":"productionCardIdRange()","62581b79":"CubaazCoin()","6258683e":"devMiningRewardTransfer(address,uint256)","6258d524":"saveEther()","62598ae6":"PaymentExpected(bytes8)","62599964":"usesThem()","625a6726":"fixClock(bytes32,uint64)","625adaf2":"setTokens(address[])","625b666c":"Luxury()","625b8e60":"_redeemByPartition(bytes32,address,address,uint256,bytes,bytes)","625bc37b":"releaseTeamTokensAfter12Months()","625becbc":"showLockState(address)","625cbb23":"setWhiteListAddresses(address)","625cc465":"baseDonation()","625cfc46":"sellRateZeroQuantity(uint256)","625fcce7":"dealer_cut()","625fe9ec":"updateCrowdsale(uint256,uint256,uint256,uint256,uint256)","6260f55b":"ETH_USD()","62612c6d":"PatronTwoWithdrawal()","62614ae6":"BNT_CONVERTER()","6261c662":"bonusStart()","626263c5":"calculateEthToChargcoin(uint256)","626340b2":"block0()","626452df":"test_feePoolShare_noClaimableStake()","6266e135":"Gmt()","62674e93":"getStepFunctionData(address,uint256,uint256)","62676d78":"RANGEEND_8()","6267967b":"batchReservedTokenAllocation(address[],uint256[])","6267c456":"organizer7()","6268a0cd":"stakeSDC(address,address,uint256)","6268e921":"acceptGame()","6269420e":"seedAndPresaleTokenIssuedTotal()","62694b68":"lastSignedBlockNumber()","62695eae":"allowedTransfer(address)","62697f69":"getLLV_edit_17()","6269ae48":"tokenToContributor()","6269f9fc":"getGameId(string,string,uint16,uint64)","626a0e1c":"addSoundEffect(uint256,uint256[])","626a413a":"activateBounty(uint256,uint256)","626b1070":"beneficiaryDeposit(uint256)","626be567":"totalToken()","626c0a45":"stock(uint16,uint16,address,uint256)","626c6bc6":"ETO()","626d0358":"setTokenDefaultPartitions(bytes32[])","626d4a36":"right55(uint256)","626d666c":"theDao()","626e4675":"directorLockDays()","626e8fd3":"setBonusDate1(uint256)","626ebe39":"toggleReceiveEth()","626f9e20":"calculateMaxEthIssued()","626fc458":"finalizeTrade(address,uint256,address,uint256,uint256)","626fd353":"getSelection(uint256)","627045bf":"changeActiveNameIndexTo(uint256)","6270b780":"DebitClient(address)","62714a14":"getPhone(address)","62715547":"castVote(bytes32[])","62721129":"getMultiSigWallet()","6273106a":"payoutPool()","62731ff1":"onDeposit(address,address,uint256,uint256)","62735618":"finalizedCapital()","62738998":"getInt()","62744fee":"PallyCoin()","6274a35c":"team_total_lock_days()","6274ca4b":"setWeiPerUSDinTGE(uint256)","62751a06":"SFT_PER_ETH_FIRST_EARLY_BIRD_RATE()","6275448e":"batchApprove(address,uint32[])","62754563":"CelebsParty()","62765eb7":"receiveApproval(address,uint256,address,string)","6276b368":"rateOfCharging(address)","62770252":"needsFuneral(uint256)","62773951":"TrustReso(uint256[3],address,address,address[])","627749e6":"closeTime()","62779e15":"payFees()","62797ef5":"dayPotHighscore()","627992c7":"VULCAN_POD_MAX_CARGO()","627a326b":"getBytes32Slice(bytes,uint256)","627a3311":"QvoltaToken(address)","627aa6d2":"buyAndTransfer(address,address,bytes,uint8)","627adaa6":"revealMulti(uint256[],uint256[],uint256[],bool[],bytes32[])","627b3d9a":"BTCAUC()","627c2516":"WizardsvsCeltics()","627c2d1e":"getTX()","627c34ad":"removeSubscriber(address)","627c81ff":"erc20ContractByIndex(uint256,uint256)","627d6f9f":"get_multiple(uint256,uint256)","627e64d2":"getQuote(address,uint64)","627e667b":"StandardToken(address,uint256)","627eb56c":"setMaxContributionPhase1(uint256)","627f09c3":"setConfiguration(address)","627f22fe":"GiftMetadata(uint256)","627f47c6":"transferWithLock(address,uint256,uint256[])","627fd3bb":"addCbAddress(address,bytes1)","6280382a":"cancelTrade(address,uint256,address,uint256,uint256)","62806296":"transfer_coins(address,uint256)","6280b0bb":"batchRegularTransfer(bytes32[],bytes32[])","6283051f":"setOraclizeQuery(string)","6283440b":"wingsTokensReserv()","62838d8b":"getLastAddress(bytes32)","628392bd":"bonusPhase1()","62848f36":"tokenRate30()","6284ae41":"exitFee()","6284fd22":"getMyPubKey(bytes32)","62850233":"transferWithDividends(address,uint256)","6285a259":"calculateTokensEnabledOne(address,uint256)","6285d703":"NERO()","6288020f":"endThirdWeekICO()","6288a63c":"NotaryChain(uint256)","6288a9a3":"maxUserContribution()","62890063":"WhitePrivilegeToken()","62891b5d":"multiAccessChangeRequirement(uint256)","628a01ce":"stakingMintRate()","628b75bf":"slashDownRequest(uint256,address,uint256,bytes32)","628c225c":"roomNight(uint256)","628c2778":"DEXToken()","628c866e":"setCurrentActiveGameID(uint256)","628d5ef1":"setWeiUsdRate(uint256)","628da35e":"get_termAmount(uint256)","628dda8d":"VDGToken()","628e50b5":"brokerFee()","628e7a38":"_initializeVesting(address,uint256,bool)","628eaa88":"GeocashToken(uint256,uint256,uint256,address)","628ee84f":"in_dispute_phase()","6290a009":"bids_sorted_count()","62932301":"importer()","62935a98":"getContractDataSK()","6293a989":"TRONVSupply()","6293b5bb":"presaleMaxEtherCap()","6293fd1e":"payBack(address)","6294f858":"distributeFinancialAward(address[],uint256[])","6295c61a":"transferItem(address,address,uint256)","6297c16c":"deleteToken(uint256)","6297dbf4":"existsMesa(uint256)","62981b18":"deployBallot(bytes32,bytes32,bytes32,uint64[2],bool[2])","62985882":"VSTA(string,string,uint8,uint256)","62985b87":"NebuliToken()","62986e27":"Canary(address,uint16)","629873b2":"createRequestAsPayeeAction(address[],address[],int256[],address,address,string)","6298c93a":"usdCap()","6299a6ef":"update(int256)","6299f8cf":"stop(uint256)","629a9ce7":"coreTeamUnlockedAt()","629ad124":"chancesBought()","629aef56":"QuintToken(address)","629b656e":"PryzeToken()","629b9cb1":"takeProjectBonus(address,uint256)","629bc0b4":"getPlayerPayout(uint256)","629bf9a8":"updateMinMaxBetPrice(uint256,uint256)","629c1b67":"SoftCapReached()","629c37c2":"HSShopSaleFee()","629cefee":"adjustTiming(uint256,uint256)","629d0f2f":"teamd()","629d93db":"removePromo(bytes32)","629e89a0":"setMinDai(uint256)","629f1486":"YoonContract()","629f4028":"getVoteNum(address)","629f4b3b":"StatsTotal()","629fb53d":"getOrderbookLength()","62a09477":"changeOwner()","62a0b56b":"testUnset()","62a1029c":"YUPIE_PER_ETH_PRE_SALE()","62a144d9":"safeMod(uint256,uint256)","62a31c4a":"dynamicLength(bytes4,bytes)","62a36a54":"Application()","62a39ff7":"setShareHolder(address)","62a44fe9":"has_voted()","62a49ae3":"depositTokensFor(address,uint256,address)","62a4b230":"setLockedRatio(uint256)","62a4be31":"buyTokensByProxy(address)","62a4cd14":"endFunding(uint256)","62a51eee":"move(uint80,uint80)","62a52ed6":"set_price(bytes12,uint256)","62a59ade":"distributePuppyCoinCLarge(address[])","62a5af3b":"freeze()","62a76ce1":"accrueAdvisorsTokens(address,address,uint256)","62a7c5a6":"nextWithdrawDayFoundation()","62a80b42":"newToken(string,address)","62a87466":"STATE_DONATION_ROUND_1()","62a974b6":"vote01NoCount()","62aa9a00":"enehtoken()","62aabb9e":"SafeToken()","62aac84d":"setHaltSale(bool)","62aaf089":"getExchangeRate(uint256)","62ab1216":"updateWithOracle()","62ab8cc1":"howMany()","62abb560":"transferSuperOwnership(address)","62abda69":"totalIssuanceDebt()","62ac6115":"updateRequireKYC(bool)","62aca822":"setNation(address)","62ad1b83":"operatorSend(address,address,uint256,bytes,bytes)","62ad9bda":"newProvider(address,string,bytes32,uint256)","62addeed":"HumanX()","62ae4d29":"OBIMOLOGIA()","62aecc47":"totalBondSupply_BULL()","62aee544":"ADVISOR_SHARE()","62afd64a":"unpaidPercentage(bytes32)","62aff4d5":"commitPeriodStartedTimestamp(bytes32)","62b08e70":"setVotingContractAddress(address)","62b0ae87":"pack(bytes)","62b24189":"DepositToBankAccountFromDifferentAddress(uint32)","62b26f95":"totalFish()","62b3b833":"createCoupon(string)","62b40489":"businessPlannedPeriodEndTimestamp()","62b40918":"addPersonalCaps(address[],uint256)","62b40f9f":"destroy(address,address)","62b45318":"exchangeEtherForNominsAtRate(uint256)","62b4faa7":"Edujano(uint256,string,uint8,string)","62b52b49":"LADCToken()","62b6a282":"left42(uint256)","62b6a963":"_batch2_icosaleEndTimestamp()","62b6dc8e":"RektToken()","62b78bc4":"team_coins()","62b83c6b":"balanceAsCreator()","62b96a18":"teamUnvested()","62ba1649":"stopLottery(bool)","62ba4aef":"payInvoice(bytes32,uint256)","62ba9687":"toTimestamp(uint16,uint8,uint8,uint8,uint8)","62bb7533":"getTokenToEthOrderList()","62bb758f":"userSecurity(address)","62bc56e6":"getCompany(address)","62bc63c4":"getCozyAgain(uint256)","62bca778":"withdrawalFX(uint256)","62bd689c":"setBonusPercent(uint256)","62be3172":"Message(address,address,address,string)","62beaa82":"toData()","62bf6fa7":"medalDecimals()","62c01b2d":"apply_compensation(uint80)","62c06767":"sweep(address,address,uint256)","62c0e3b7":"SpoutMintableToken()","62c0ffa8":"getDCountedBasicBallotID(bytes32,uint256)","62c13ff3":"initSale(uint256,uint256)","62c19061":"getYearDay(uint256)","62c1adb0":"KittenCoin()","62c1f389":"swap(bytes32,address[5],uint256[6],uint8,bytes32,bytes32)","62c24067":"blockFunds(uint256)","62c2b7c8":"getTTTAddress(string)","62c335c1":"checkCallback(address,uint256,bytes,bytes)","62c375a7":"library15function()","62c3dd5a":"prepareForRefund()","62c3fdb2":"getFundsOwner(bytes32)","62c47064":"setArbitrator1and2(address,address)","62c48e20":"capFiatAndETH()","62c49256":"whitelistBasketFactory(address)","62c4c89e":"getMixParticipantByPubKey(uint256)","62c509c3":"XYTgas()","62c5aecc":"getEthToTokenAddOrderHint(uint128,uint128)","62c5c03a":"getbalance(uint256)","62c5c254":"changeFounderMultiSigAddress(address)","62c63e31":"NotFinalized(bytes32,bytes32)","62c655f5":"removeVoters(uint256[])","62c6beea":"_buy(uint256,address,uint256)","62c7855b":"getConfigBytes(bytes32)","62c7e96c":"deathData_f16()","62c7fa76":"lockStartTime()","62c95aa1":"getMaxTickets()","62c99e84":"_Approval(address,address,bytes32)","62c9da62":"setCompte_1(string)","62caf484":"GDCAcc03()","62cb1ac2":"validateOrderHash(bytes32,address,uint8,bytes32,bytes32)","62cdd872":"verifySignatures(uint8[],bytes32[],bytes32[],bytes32)","62ce071c":"publicTokenCap()","62ce7043":"reloadEarnings(uint256,uint256)","62cee7ad":"staffInfo()","62cf0197":"getVIATokens()","62cf54c8":"setDeposits(uint64,address,uint16,uint64)","62d020d9":"addVersion(address,string,string)","62d027bf":"GXVCSentByToken(uint256,address,uint256)","62d05c78":"cancelOffer()","62d0af7a":"set_BCDB_contract()","62d0ce45":"TOKEN_RATE_05_PERCENT_BONUS()","62d176cb":"buyTokens(bytes32,address)","62d1dac2":"setUnofficialApplicationSignUpFee(uint256)","62d1fee3":"addLegitDevAddress(address)","62d21602":"bkaddress()","62d246a4":"getBetsMas(uint32)","62d2c393":"GenkiProject()","62d2ecb9":"setMaxSpend(uint256)","62d3755b":"fullTokenWallet()","62d3b5c5":"maxAmmount()","62d55b6d":"VOTING_TIMESPAN()","62d576bd":"periodITO_mainCapInUSD()","62d590ac":"GrantToken(address,uint256,string)","62d5acb1":"rebateOneFenzi_()","62d6b7fb":"percentageOfRaisedAmountThatRemainsInContract()","62d7216c":"unregister(uint256,bytes)","62d72c08":"RozowkaCoin(uint256,string,string)","62d73eb8":"startElection()","62d91855":"delAdmin(address)","62d93527":"setBrokerFee(uint256)","62d966c9":"changeEmployee(address)","62d9c267":"ICOEnded()","62dbc55c":"DevTokensHolder(address,address,address)","62dbdfef":"CompanyToken()","62dbf261":"getTokensForEther(uint256)","62dc0133":"HIGHER_PRICE_RESET_PERCENTAGE()","62dc6e21":"PRESALE_PRICE()","62dc9ced":"Roulette(uint256)","62dd748c":"toUpper(string)","62dd9c71":"checkWinNobody(uint32)","62de871e":"startBattle(string)","62df5b7d":"BD0Token()","62e05175":"setMotionDB(address)","62e1de00":"test_polarBoardInstance()","62e23e9e":"NAME_NOT_AVAILABLE()","62e26e45":"loanCompleted(uint256,uint256)","62e28f7d":"channelModule(uint64)","62e2aa00":"burn(uint256,string,uint256)","62e2d0de":"get_foo()","62e4aeb8":"customExchange(address,address,uint256)","62e534d2":"setBlocklancerToken(address)","62e5b1f2":"_owns(address,address,uint256)","62e69886":"RecipientUpdated(address,address)","62e6e7c7":"disTrustDealer(address)","62e76013":"management(uint256)","62e7707e":"whitelistAddresses(address[],bool)","62e7ba3f":"consumptionPointer()","62e838ef":"returnBet()","62e881a4":"nextTournamentRound()","62e888bb":"STRIKE_PRICE()","62e8b948":"stepOneLockEndTime()","62e8e8ac":"changeTokenPrice(uint256,uint256)","62ea82db":"bids(address)","62eb0068":"redeemByPartition(bytes32,uint256,bytes)","62eb33e3":"cr()","62eb4c89":"is_started_payouts()","62eb5789":"setLLV_edit_33(string)","62eb6da1":"registeredToken()","62eba54c":"doesUserOwnItem(address,uint256)","62ebcdcf":"setRtmContract(address)","62ec8e53":"adminAddBallot(string,uint256,uint256)","62ed4f04":"SSBToken()","62ee0082":"setTokenContractsAddress(address)","62ee37aa":"InfluToken()","62ee4b26":"AUORANEX()","62ee6d29":"changeHashtoLowOrHigh(uint256)","62ee7b03":"startTakeToken()","62ee922b":"unofficialApplicationSignUpFee()","62ef0e65":"withdrawPresale(address[])","62ef1f81":"confirmPayment()","62ef7738":"total_money_back()","62f03290":"payRefund(bytes32,uint256)","62f2296e":"_transfer(address,address,uint256,string)","62f3ed92":"PowerQuantumCoin()","62f3febf":"isUserBlockedByContract(address)","62f44d8a":"Dadyys()","62f4ed90":"isAuthorized(bytes32)","62f54c18":"removeAllowedTokenInternal(address)","62f57ff6":"GudTesteContratoF()","62f5a23f":"transferToToken(address[])","62f5aa4c":"getAirdropIds()","62f5c2e3":"maxContributionPhase1()","62f5ed61":"add_to_bounty()","62f60954":"_reAdjustDifficulty()","62f63c6e":"EarthMedz()","62f69039":"unlockVault()","62f6cf7f":"getRegisteredModuleAt(uint256)","62f91eff":"AnythingAppToken()","62f927d4":"getDefaultReportingFeeDivisor()","62f96fc1":"splitBalanceAccordingToRatings(int256,int256,int256)","62fb09b2":"getRefDescr(uint256)","62fb0ff8":"morties_TO_HATCH_1RickAndMorty()","62fb6fe1":"getMonster(uint256)","62fb9697":"diffSeconds(uint256,uint256)","62fc178b":"gasPriceOraclize()","62fca3fa":"mintTokenBulk(address[],uint256[])","62fdaf1d":"removeFromBattle(uint64)","62fde48a":"LogDeposited(address,uint256)","62fe3b4d":"setEndOfPresale(uint256)","62fec51b":"icoEndTimestampStage2()","62feff3a":"developerAllocation()","62ffb195":"REFERRAL_REWARD_PERCENTAGE()","62ffb3bf":"trueUSD()","630061f3":"getTokensDistributeds()","6300c768":"takeEther(address,uint256)","63018e1a":"minTokensToSale()","63036f86":"totalIssuedEarlySale()","63037b0c":"payees(uint256)","6304335b":"betsCloseAt()","6304fa3a":"Test(uint256,string,uint8,string)","63052d82":"getOwnersIndex(address)","63055d79":"fetchRate()","6305d010":"registerTeam(string,address,string,bool)","63066434":"getPlayerVaults(uint256)","63069a35":"assign2(address,uint256)","63079315":"lengthOfCommonPrefix(bytes,bytes)","63086b5e":"afterSoftCapDuration()","6308769e":"LogFinishICO(address)","6308ae65":"managersCount()","6309242c":"setUserHatchRate()","630a9f94":"viewMemory(uint256)","630babac":"WhitelistParticipant(address)","630bae99":"payoutWithFee(uint256)","630bcd99":"drawRandomItem(string,uint256)","630c010e":"getElements(uint256[])","630cd1e9":"ratePrivateSaleStage()","630cea8e":"submitSignature(bytes,bytes)","630d0552":"ColorPurchased(address,address,uint256,uint256)","630d43cc":"DoroDiamond()","630db9ee":"getRemoveMarketCalled()","630dbe79":"StandardERC20Token(string,string,uint8)","630dc19d":"_payoutJackpot()","630dd52f":"TOKEN_TREASURY()","630e07f1":"RESERVED_TOKENS_FOR_ICO()","630e0ae6":"createPersonGen0(string,string,uint64,bool)","630eb125":"getAuditAssignBlockNumber(uint256)","630f1e6c":"withdrawAsset(bytes,uint256)","630f479e":"perStageNxc()","630f6f47":"betWithAff(address)","630fd0ac":"totalSupplied()","6310c722":"convert(address,uint256,uint256)","6310d902":"getAddressBoughtCount(uint16,address)","631121ca":"ISCToken()","63121665":"countPeriod(address,bytes5)","6313bd30":"DEP()","631407a2":"setTokenSupplierAddress(address)","6315592b":"orderModify(uint256,uint256,uint256)","63155d2b":"craft(uint16[16],uint16[16],uint16[16],uint16[16])","63157e2b":"issue(uint32,uint8,uint256,bool)","6316f6d1":"getNotConstant()","63175913":"StandardSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","63176ad9":"changeDealDate(uint256,uint256)","6317cc5b":"tokenCapForThirdMainStage()","631859d0":"calculatePotentialPayout(uint256)","6319d32f":"DOJI()","631a4231":"createContract(string,string)","631a925c":"Weekycoin()","631b0520":"getPaimentTime(address,uint256)","631b3672":"roundSetUp()","631b7e83":"LogResult(bytes32,address,uint256,uint256,uint256,int256,bytes)","631bdb63":"playerCurrentlyRegistered(address)","631c07f0":"getBonusByDate()","631c42ae":"ethExchangeWallet()","631c56ef":"depth()","631ccb1d":"getInfoMarketItem(bytes16)","631d3f3b":"liveDragons()","631d551b":"FAMEToken()","631d9b1f":"LuxProject()","631dc853":"EquitySharingSystem()","631dd1a2":"transferFreeze(address,uint256)","631de4d6":"replace(address,address)","631e0c69":"addMessage(string,string)","631f0d66":"upgradeAddress()","631f637f":"preSaleMaxCapInWei()","631f9852":"isSealed()","6320212b":"refreshReputation(bytes32,address[])","63204648":"setMultiWallet(address)","6321f298":"MeraToken()","632261c3":"removeVendor(uint256)","63228b57":"KarmaToken(uint256,string,uint8,string)","6322bb39":"tradeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,uint256)","6323b526":"transferFromTokenSell(address,address,uint256)","6323dc26":"GCRTokenERC20()","632447c9":"updateReward(address)","632473da":"CNC()","632488ff":"POOH()","6324af1f":"advisorsBalance()","6324e70b":"offerToLend(uint256,uint256,uint256)","63258462":"setHomeMaxPerTx(uint256)","63263858":"ethartArtReward()","6326cb5b":"_purchaseCompany(uint256)","6328af59":"YeedToken(uint256)","63299226":"teamOneId()","6329cfa5":"settleLend(bytes32[8],bytes,address,uint256,bytes,bytes,bytes,bytes)","632a3e52":"vestTokens(address,uint256)","632a8144":"midasFounderAddress()","632a9a52":"vote()","632ca5c9":"getArts()","632ccecd":"IkuraAssociation()","632ce0f8":"whoIsAdmin()","632e082a":"isMainFirstDay()","632e1dfe":"OWNER_ADDR()","632e2b95":"addWire(address,uint256,uint256)","632e44af":"distributeBonusTokensByList(address[])","632ebd6b":"changeIsOpenFlag(bool)","632f0ba6":"descriptionHashes(bytes)","632f83eb":"realWorldPlayerFromIndex(uint128)","632fbda4":"replaceController(address)","63301198":"AetherCore()","63302789":"TOKEN_FOUNDERS()","63304bc3":"m_lastFundsAmount()","6330ac09":"get_price(string)","6331e7d4":"beforeEach()","6331eae0":"saveTokenValues()","63334c58":"transferETC(address)","63340338":"fuint32(uint32)","633423be":"paymentAddress()","6335010d":"getVestingRevokeDate(address,address)","63365651":"InterfaceId_ERC721Enumerable()","63367f4d":"tagline()","6336ac19":"setTTGCoin(address)","63385ad1":"addNewAccount(address,uint256,uint256)","63385b64":"BerryToken()","633891c4":"getPlayerAff(uint256)","6338977e":"setMetadataUser(string)","6338f693":"Airdropped(address,address,uint256)","63391689":"withdrawForFourStep()","63392843":"decrease(bytes32)","63396109":"createGen0Token(address)","63397825":"changeMerchantAccount(address)","633982c5":"viewLatestEthTransactionRequest()","6339b5f6":"SUSIToken(uint256,string,string)","6339be39":"totalStarSupplyRemaining(uint8)","6339fbcb":"finishGame(uint32,bytes32)","633a6dde":"deathData_a9()","633a7574":"CowToken(address,address,uint256)","633ab5e0":"callchecked()","633b1954":"finalizeMigration(address)","633b4c04":"o_velho_problema(uint256,uint256)","633b5b1f":"presaleTotalWei()","633c78b5":"create(uint256[],uint256[])","633ce1d2":"premiumDomainK()","633d17eb":"toAscii()","633de6aa":"setTime2Rest(uint256,uint256)","633dfc70":"vote(bool,address)","633f7a82":"queryType()","6341b3fe":"subBrokerNum()","6341ca0b":"retrieveTokens(address,address)","634363f3":"amountOf()","63443679":"rateUpgrade(uint256)","6344a898":"setWeiRaiseLimit(uint256)","63453ae1":"distribute(address)","63456fa9":"getTokenById(uint8)","634663a5":"setPriceRatePhase2(uint256)","634667b2":"claimAndTransfer(address)","634710ae":"BYTC()","63472fad":"setVote(address,string,uint256,address,bool)","634758e5":"TodaNetwork()","6347a377":"nextAuction()","6347bb42":"SGACoin()","63482cf0":"eachUnlockCounts()","63488772":"WanersiLinkToken(uint256,string,string)","6348c4cf":"Money(address)","6348eae6":"neverPauseAgain()","634965da":"sendEther(uint256,address,address)","634993c6":"refill(bytes32)","6349cafa":"changePrice(uint16,uint256)","634b3df9":"minPriceInWeiForPre()","634b4a8f":"setOperater(address)","634b5043":"collectWinnings()","634b8dc3":"Altn()","634bc7db":"create(bytes32,bytes32)","634c5c51":"authorized_triggerStashedPayoutTransfer(uint256)","634c688a":"burnAllowed()","634d27c3":"getProviderIsForRent(uint256)","634d6e57":"investorFullInfo(address)","634df88e":"ENTA()","634e66ac":"admin_isWithdrawable(bool)","634eaff1":"ETERNAL_APPROVAL_VALUE()","634ec9f9":"buyKnowledge()","634ef3ce":"Mqthereum(uint256,string,string)","634ef8da":"_setSetting(string,uint256)","634f752b":"optionLibrary()","634fcb8e":"setupCrowdsale(address,bool)","634fe2a6":"others_prize()","63505ae8":"getBidsCount()","63506c16":"transferfromOwner(address,uint256)","6350b2c2":"mints(uint256)","6350ec6f":"changeYumAddress(address,address)","6351546d":"settleTransactionByMediatorFee(uint256,uint256)","635179ca":"setHiddenCeilings(bytes32[])","6352211e":"ownerOf(uint256)","6352585c":"ENCToken(uint256,string,uint8,string)","6352c538":"TokensWithdrawn(address,uint256)","63534dd8":"seedContract()","6353586b":"reward(address)","63542c26":"approvedToken(address,uint256,bytes)","635439ac":"updateCurrentGameCardId(uint256,uint256)","635550a6":"blockchainExchangeFrom(address,uint256,uint256,bytes32)","63558f5c":"transferEscrowship(address)","6355bf2f":"optionsSet()","635639b4":"_unpackPlayerData(uint256)","6356443e":"TokenPreSaleTransfer(address,address,uint256)","6356739d":"Sent(address,uint256,uint256)","63567673":"createBet(address,address,uint256,uint256,bytes32[])","63569ca8":"rewardProjectCompletion(uint256)","6356cdac":"Bonus(uint256)","6357cc12":"startpublicBattle(uint256,uint256)","6357ddaa":"getRandomTime(uint256)","63581c04":"setFactoryAsset(uint256,uint16)","63586d6a":"claimBondReward()","635875d9":"changeMinimumCommission(uint256,uint256)","6358aac0":"isInterestStatusUpdated()","6359036b":"redeemDaoBounty(bytes32,address)","63591d09":"poolMaxAmount()","635994fd":"create(address,bytes32,address,bytes32,address,bytes32)","6359a656":"EUnpause(address,string)","6359a974":"TOTAL_TOKENS_TO_DISTRIBUTE()","6359b5b1":"totalIssuingCollateral_limitedSum()","635a5d7b":"setHeartbeatTimeout(uint256)","635b9047":"ExpandCoin()","635ba8a1":"ApexTalk()","635ca669":"addBoardOnUser(address,address)","635cfda2":"Incrementer()","635d0239":"toUint(bytes,uint8,uint8)","635da243":"autorizar(address)","635e2abf":"_btcToken(address)","635eecea":"privateEventTokens()","635f6a79":"method3(string)","6360edc1":"getAllForPubKeyBetween(bytes32,uint256,uint256)","6360fc3f":"bought_tokens()","63615149":"withdraw(bytes32,bytes32)","63617328":"setJackpotCompleted()","6361d3e0":"unpauseActivity(uint16)","6361d9e9":"testConstructorUsingDeployedContract()","6362102d":"rebalanceEtherDelta(address,uint256)","63621532":"setGasUpperBound(uint256)","6362ffd3":"rebuyInformTime(address)","63637c87":"createNewPlayer(string)","636544be":"changeVeredictum(address)","63655ebb":"DiaryLog(uint256,bytes)","63657855":"_removeFromDebtRegister(bytes4,uint256)","6365dfd9":"RaisrToken()","63665f2e":"addAirdrop(address,uint256)","63669424":"EthBird()","6366b936":"freeUpTo(uint256)","63670e42":"UpdateSellAgentSiteReg(address,address)","636760a2":"Cyncrohnis()","636822fa":"FearOfMissingOut()","63689b4a":"moveTokens(address)","636a36e3":"ThingsbookChain()","636ae15d":"BROYALCOIN()","636b2ac3":"createDefaultGen0LinglongCat(uint256,address,uint256,uint256)","636b7e56":"pendingFunding()","636bb5ae":"CalculateStageValue()","636bd9dc":"cooAddress3()","636c6524":"Superpack()","636ca6c2":"EAAS()","636ce4d7":"BTL_SPARTAN()","636d37b1":"precrowdsalepricing(address,uint256)","636d98b1":"referrerPercent()","636f12fe":"b2sother(bytes32,bytes32)","636f6159":"tokenExchange()","636fa3c6":"preIcoToken()","636ff44e":"BAGToken()","63704e93":"getDocCount()","6370920e":"grant(address,uint256)","6370ef19":"updateDomainPrice(bytes32,uint256)","63722de4":"AllowSomeoneToViewMyKeys(address,string)","63723373":"checkSignature(address,uint8,bytes32,bytes32,bytes32)","63727449":"getMfgDetails(string)","6372ba1a":"dateEndICO()","63732cf0":"RCN()","63735598":"getPriceOfCampaign(bytes32)","6373786a":"SaturnPresale(address,address,uint256)","637431ae":"testCreatePricelevelUsingNewContract()","63746113":"resetCrowdSaleAddress(address)","63746b03":"createContractRide(string,bytes7)","63749225":"getPVPEntranceFee(uint256)","63750dfb":"changeLedger(address)","63755c16":"withdrawStandardTokens(address)","637666ce":"removeFromBlackList(string,address)","6376c910":"StageThreeEnable()","63772f33":"growthTokensPercent()","6377aaa6":"setAdsContractAddress(address)","6377ebca":"close_time()","6377ff20":"totalInactive()","6378378a":"NxahCoin()","63784191":"frozenForTeam()","63791e3c":"setPriceSetter(address)","63798661":"payPlace(uint256)","6379a852":"multiOperatorSend(address,address[],uint256[],bytes,bytes)","6379ed9d":"distributeFUD(address[],uint256,uint256)","637af51c":"updateUpdater(address)","637b2541":"_allocateTokens(address,uint256)","637b55eb":"exchangeEtherToToken()","637b93ed":"getInsuranceBalance(address)","637bcd2a":"userIsWhitelisted(address)","637c39d8":"systemAddresses(address,address)","637cc5c6":"XBlockToken()","637d3e00":"ProjectOwner_EnableProject(int256)","637dda3f":"getBalanceByIndex(uint256,address)","637e12f7":"getBlocksDesc(uint256,uint256)","637e86eb":"totBOTs()","637ea3e5":"setlogaddr(address)","637ec389":"activated_time_()","637fcf95":"getBoardMember(address)","63808773":"acceptContribution(bytes32)","63809953":"secondsPerDay()","6381ca26":"refundTransactionByMediator(uint256)","63820550":"OwnerEvents(address,uint8)","63822fdc":"addConsentTemplate(string,uint256,string,string,string)","6382789d":"currentLowestCount()","63839777":"getReturns(address,address)","63844a57":"mul32(uint32,uint32)","638560cf":"registerBool(address,bool)","6385cbbe":"minimalGoal()","6385f2fb":"DAZ()","63860139":"nextPrizePool()","63862fd5":"isSenderOriginalOwner()","6386c1c7":"getUserInfo(address)","63875261":"paladinAddress()","6388fafa":"niceguy1()","63891019":"testFailStartTooEarly()","63892068":"create(string,string,bool)","6389654e":"changeDailyWithdrawalLimit(uint256)","63897c7e":"changeSettings(string,string,uint256,uint256,address,address,address,address,uint256)","6389e019":"graceTransfer(address,uint256)","638a9ce9":"setProxy(address,bytes32)","638b1b14":"developmentAddress()","638b4463":"completeClosed()","638b9119":"soldCards()","638bcce3":"multilevel(uint256)","638c5ddc":"BonusListUpdated(address,address)","638d4788":"draw(uint8,uint8)","638dd56a":"getNumberOfEligibleMembers()","638e1e5d":"payTip()","638e3724":"Locker(address,uint256,address[],uint256[])","638eea8d":"PLATFORM_MONTHLY()","638f6575":"timeStarted()","638f8da4":"castleMaxLevelGap()","638fade2":"getMerchantPublicKey()","63905232":"balanceAll(address[])","63907180":"getDebrisNum(bytes32)","6390f519":"getNumTeams(uint16,uint8)","6391c315":"FundsWithdrawnAndTokenStareted(address)","6391d3b2":"getCountSenderLands(address)","63921a74":"canReceiveListing(bytes32,uint256,bool,address,uint256,uint256)","63929d3e":"getPendingKNCRateRange()","6392a51f":"balancesOf(address)","63937651":"batchTransferDiff(address[],uint256[])","6393b4eb":"expect(address,uint256,bytes,bytes32)","6394536d":"cosign(uint256,uint256)","639475ca":"TRIANGLE()","63958b5f":"sellSpecialTokensForPublicSale(address,uint256)","63981b33":"changedeposito(address)","63981bbc":"TotalSpenders()","63991a36":"getGenomeChildren(uint32,uint32)","639937d7":"maxSpinners()","639a9a67":"saleOpened()","639ab80b":"YTTD()","639bbb37":"donated()","639bd0bf":"proposeBountyTransfer(address,uint256)","639bef41":"setRecommender(address,address)","639cba6e":"getDetailsBattles(uint256)","639cd59c":"totalFeesAvailable(bytes4)","639d3e69":"listSubName(bytes32,bytes32,uint256,uint256,uint256)","639d57f2":"testGetBitSuccess()","639e01dd":"Team()","639ec4d2":"checkTokDev()","63a0557b":"teamAvailable(address)","63a0607b":"buyRock(uint256)","63a10042":"approveComponents()","63a1512e":"setOPM(address)","63a167f2":"collectorWeiCap()","63a24174":"GxCoinTotals(address)","63a2c393":"safeMulPercentage(uint256,uint256)","63a2de29":"crearJuegos()","63a2fdbf":"claimZeronium(uint64,uint64,uint64,uint64,uint64,uint64)","63a37503":"test_rewardPoolShare_noClaimableStake()","63a3c452":"getUnsold()","63a3cc80":"currentTotalTokenOffering()","63a3d383":"edoToken_()","63a411c0":"addDriver(address)","63a4b67b":"setArray(bytes32,uint256[])","63a599a4":"emergencyStop()","63a5bc71":"eitherAdminOrAdvisorCanDoThis()","63a6568f":"getPropertyLastUpdaterBecomePublic(uint16)","63a66d59":"bountyDeposit()","63a6cc7d":"getBuyers(uint16,uint8)","63a846f8":"admin(address)","63a8b945":"removeCounter(address,uint32)","63a8dac2":"changeSettings(uint256,uint256,uint256,uint8,uint256,uint256,uint8,uint8)","63a999cc":"uddr()","63a9c3d7":"verify(address)","63aa109c":"summFounders3()","63aa289b":"ownerTreesIds(address,uint256)","63ab7a25":"clearWaitPairBets()","63aba603":"AlphaToken(string,string)","63abc381":"alreadyParticipated(address)","63abfbaa":"tokensToFunds(uint256)","63abfd86":"CCChainToken()","63ac0f99":"depositBonus(address,uint256)","63ad0bbe":"templateProposals(address,uint256)","63ad803f":"EditTile(uint256,uint256,string,string,string,uint256)","63ae10fe":"getClientProviderUID(address)","63ae2bae":"updateUserCertification(string,string,string,string,uint16)","63ae71ca":"affiliateProgramWalletAddress()","63ae8d6c":"setBuyPrice(uint256)","63aea3e0":"PlayerInfo(uint256)","63aec5ce":"getActiveUserLists()","63af8570":"tokensToGenerate(uint256)","63b03896":"gcd(int256,int256)","63b0545f":"transferfrom(address,address,uint256)","63b0a5c3":"IdentityRegistry()","63b0e66a":"helper()","63b1152a":"releaseVault()","63b1806f":"NewReferralTransfer(address,address,uint256)","63b20117":"totalTokensSold()","63b2c2a9":"unlockTeamBBT(uint256,string)","63b3c007":"canDefrost()","63b3f4e6":"WinnerPayedTicketBought(address,address)","63b452fb":"ICO_RATE4()","63b45bd9":"socoreCheck()","63b4f786":"about(address,uint256)","63b56431":"PRCT100_ETH_OP()","63b57e34":"remainCap()","63b6240d":"computeEndowment(uint256,uint256,uint256,uint256,uint256)","63b68040":"lastBlock_v14Hash_uint256()","63b6b31f":"transferBalance(address)","63b700ff":"getStoryExpiryTime(bytes12)","63b75b59":"setAssetValue(uint64)","63b7f00a":"calculatePercentsFor(address)","63b80379":"AcceptDiscipleOffer(uint256)","63b82524":"ethReceivedPresaleTwo()","63b851b9":"updateMinimumEpochInterval(uint256)","63b87bb8":"openSale(uint256,uint256,uint256,uint256)","63b8bd44":"getBalanceofEthAgent()","63b8f7f7":"W4T()","63ba26fa":"QwasderToken()","63ba2c76":"toUintThrow()","63ba5e44":"fundem()","63ba7319":"BUILDING_PRICE()","63bafb96":"Log1(address,bytes32,uint256,string,string,uint256,bytes1,uint256,uint256)","63bb51a9":"setHash(address,bytes32,address,bytes32,uint256,uint256)","63bbe1b5":"transferAuthorizations()","63bce4e7":"softCapUsd()","63bd1d4a":"payout()","63be8fc8":"createNew(address)","63beeab1":"executeConstant()","63bf15c2":"_buildTimberCamp(address,uint256,bytes)","63bf8194":"mineFor(address,address,uint8,bytes32,bytes32)","63bf81cf":"createDiscipleSale(uint256,uint256,uint256,uint256,uint256)","63bf8d6a":"removeToken(uint8)","63bfe3d8":"SkillBeatsLuck()","63bfe52a":"addAddressToCraneList(address[])","63c05650":"addAddress(address,uint256)","63c06fe9":"mintForwarder(uint256,bytes32,address[],int256)","63c194f1":"NTFoundationAddr_()","63c1b753":"getAddressIndex(uint256)","63c281a1":"hitFoundationBalance()","63c3600b":"__stringToUint(string)","63c36549":"QueueIsEmpty()","63c37984":"thirdExchangeRatePeriod()","63c3e2e3":"clearTransferValue(uint256)","63c43415":"view60()","63c439a6":"secondCrowdSaleDate()","63c454ca":"ifFreeze(address)","63c4f031":"stop(bytes32)","63c6082f":"buyWithCustomerIdWithChecksum(uint128,bytes1)","63c65056":"TradeEthShop(uint256)","63c69f08":"getUserOrders(address)","63c6fe04":"addCities(bytes32[],uint256[],uint256[])","63c78e87":"withdrawEtherFromTrade(uint256)","63c7d473":"GoldAmountMelted()","63c988f9":"isAlive(uint8[176],uint8)","63ca7aaf":"FeeUpdated(address,address,uint256,uint256)","63cb2afb":"reserve1Address()","63cb344e":"setNctEthExchangeRate(uint256)","63cbab8c":"SELLER_STEP_1_OPEN()","63cc23ae":"Lesson_4(address,uint256)","63cc4aa2":"transferRemainingTokens()","63ccedfe":"MensariiCoin()","63cd1c51":"_createLottery()","63cd1da7":"dspcoin()","63cd44c9":"GetType(bytes32)","63cd99cb":"moo()","63cdcc57":"motionConfirming(uint256)","63cea450":"closePresale()","63ceb60d":"sponsor(uint256,address)","63cf1442":"JACK_DIST()","63cf2ef3":"limitLessThan(uint256,uint256)","63cf6ffa":"sellFish(uint16,uint16,uint8,address,uint256)","63d06dd4":"createContractPow(string,uint256,uint256)","63d08ae5":"Timebankc(uint256,string,string)","63d1055c":"proposeGame(string,string,uint256,bytes)","63d177e6":"unpauseICO()","63d17806":"operatingFund()","63d1e70e":"PHXroll()","63d256ce":"revoked()","63d29135":"SetEventData(uint256,string,string)","63d292d7":"STQCrowdsale(address[],address,address,address)","63d2be9d":"ratingOf(uint16)","63d36c0b":"calculateFinalPrice(uint8,uint8,uint256,uint256,uint256,uint256)","63d494ea":"becomeVoter()","63d4d4a9":"bonusRateInPercent0()","63d5243a":"getDaysPassedSinceLastTeamFundsBallot()","63d5502f":"presaleCap()","63d578c5":"ApolloSeptemTokenSpecialPurchase(address,address,uint256)","63d60745":"transferCreditsInternally(string,uint256,uint8,string)","63d64159":"max(uint8,uint8)","63d6519a":"CPCEPrivate()","63d6727a":"setStartStage3(uint256)","63d74226":"add_bounty()","63d7edb9":"VRCOIN_DECIMALS()","63d8c5b7":"RefundVaultWithCommission(address,address)","63d91851":"PUBLIC_CROWDSALE_CAP()","63d9b4b1":"sendGift(address,uint256)","63d9b770":"exploit()","63d9df85":"presaleContract()","63da5531":"tokenPerUsdNumerator()","63da9cf8":"signAttribute(uint256,uint256)","63db30e8":"minInvestedAmount()","63db3e63":"IPST()","63dc5400":"queryCurrentContractFunds()","63dcf376":"offChainPurchase(address,uint256,uint256)","63dcfa9e":"athleteAlreadyClaimed()","63ddbb99":"WBToken()","63ddc54d":"mmLib()","63de5323":"applicants(uint256)","63de6ad6":"purchaseCard(uint64)","63de882b":"wlStopBlock()","63deb2c5":"changeMemberAddress(address)","63def590":"untrustClient(address)","63df9769":"setReached(bool)","63e0c2f8":"whitelistAccount(address)","63e0f8c3":"StanleyNickels()","63e0f8c7":"referalBonus()","63e12cdc":"addCCUser(bytes32)","63e16fff":"nextGen()","63e1d57c":"getMaxSize()","63e27a63":"unlockTeamTokens(address)","63e2c349":"transferTokenAndLock(address,uint256)","63e321fe":"setDefaultHashes(uint8,uint8)","63e33e96":"totalSupplyUnits()","63e38ff3":"id_for_nym(uint256)","63e3fbbd":"StopQuiz()","63e49fcd":"startPtopDeposit(address,address,bytes32,uint256,uint256)","63e4bff4":"giveTo(address)","63e4e5cc":"bountyPercentage()","63e561b6":"checkOrder(uint32[])","63e60df5":"GolemNetworkToken(address,address,uint256,uint256)","63e79315":"TokenERC20(uint256,string,string,uint256)","63e8dd96":"getCurrentOwners()","63e94cee":"getStage0End()","63e95a3c":"isNegligable(uint256,uint256)","63ea0143":"setTotalDeposit(uint256,address,uint256,address)","63ea6e44":"NewKing(address,uint256)","63eaa14d":"relock(address,uint256,uint256,int256)","63eac2d4":"getMyFalcon()","63eb963a":"dat()","63ebb3cf":"isValidSubmitter(address,bytes32)","63ebd4ff":"getFunctionAuthorized(address,address,string,bytes32)","63ebf801":"ChelleToken()","63ec3eb5":"WHENToken(string,string,address,address,address)","63ec96b7":"LogVictory(uint256,uint8)","63ed6d5d":"LogWhitelistRemove(address)","63eda29d":"prevSeriesSelloutHours()","63ee7c8d":"totalEscrows()","63ee8b88":"ico2Sold()","63eeb79a":"setMinEsteemAmount(uint256)","63eed1d7":"Alice(address)","63ef8d9e":"resetLotto()","63f019f6":"canBurnSecurity(address,uint256)","63f07aa4":"preSaleTokens(uint256,uint256)","63f0ae2e":"ProfitDelivered(address,uint256)","63f0ca5a":"BOUNTY_TOKENS()","63f114f2":"checkWithdrawValueForAddress(address,uint256)","63f160e6":"sentReveal(uint256,address)","63f1a089":"_mint(uint256,uint256,uint256)","63f1a9dc":"LogInvestorMigrated(address,uint256,uint256,uint256)","63f1de17":"ICONSORT()","63f225a7":"addLOCtoLHT(address,address)","63f22c24":"checkDelegation(address)","63f2493f":"settleETHBatch(address[],int256[],uint256,uint256)","63f32f63":"Price(uint256)","63f3dbe5":"VESTING_CLIFF()","63f55fc0":"setHolderGroup(address,uint256)","63f5679e":"changeDragonsStatsContract(address)","63f6100d":"buySome(uint256,uint256,uint256,uint256)","63f6271f":"LEGLToken()","63f75343":"setF2mAddress(address,address)","63f80de3":"issueCoin(address,uint256,uint256)","63f8a211":"sellOneStep(uint256,uint256,address)","63f9cb0e":"HLWCOIN()","63fa32f1":"newWinner(uint256,uint256,address,uint256)","63fa9888":"PredatexDua()","63fb5a1a":"putBuyOrder(address,uint256,uint256,uint256)","63fbc7bc":"expectPayment(bytes8,bytes32)","63fc98e3":"judgeEnableForTransfer(address,uint256)","63fcabcb":"BilancioMinimoAccount(uint256)","63fcf5de":"addtoContributos2(address,address,uint256,uint256)","63fd420c":"payoutMining(uint256)","63fd7552":"owedAt(uint256)","63fd7eb0":"chickenOf(address)","63fd91dc":"signUpForTournament(uint256[])","63fd9e38":"minInvest()","63fdca37":"HitCash()","63feeaaf":"smartContractStartDate()","63ff195d":"stakeOnBehalf(address,uint256,bytes32,uint256,uint256,uint256)","63ff6125":"donateToFeePool(uint256)","64004ea5":"getUserTotalPromoBonus(address)","640075f3":"isPositionClosed(bytes32)","64009184":"threeHotHoursEnd()","64017ea7":"submitExit(uint64,address,uint256,address,uint256)","640191e2":"channelManagerAddresses()","64020842":"isDisavowed()","640241b8":"acceptOnwership()","64027fbb":"minbet()","6402aca9":"getAllCardAddressesPriceOfOwner(address)","6402efd3":"tier2Rate()","64030441":"addCardsHash(uint256,string)","6403a9ed":"getVoteCountForOption(uint8)","6404865e":"OneOhana()","6406605b":"MetadataUpdated(uint256,address,string)","640708d6":"PRIORITY_SALE_START()","64070b6f":"p_setNextRoundSeedPercent(uint256,uint256)","6407e432":"mintTokens(uint256,address,address)","640853bb":"amountSoldPerPeriod()","640959bc":"getQuoters()","6409a4e3":"giveTokens(address,uint256,string)","640a404a":"getgamecardpos(uint256)","640a4d0c":"_deposited(address,address,uint256)","640bdd70":"setDividendFee(uint256)","640c3dbd":"isChipPassword(uint256,string)","640d3017":"SetMinSum(uint256)","640d84b5":"SetApplicant(uint32[],uint64[],uint32[],uint64[],int256,uint64[])","640ec47a":"assertTrue(bool,bytes32)","640efb0d":"setTravelPrice(uint256)","640f244b":"findSuitableGen()","640fe1e9":"availableForWithdraw(address)","64100038":"deleteUserClaim(address)","64109848":"tokemon20()","64109ae0":"MAINT_PRICE()","6410c41a":"priviledgedAddressBurnUnsoldCoins()","6411273f":"tapFab()","6412aeb1":"setBountyTokens(uint256)","641579a6":"setMultiplier(uint256)","641620a2":"createMulti(uint256,uint256)","6416ec30":"Geet()","64179c1b":"ActivatedContract(uint256)","6417c08b":"implementsERC721d()","6417dec3":"setHSShopSaleFee(uint256)","6418345e":"updateMinimumInvestment(uint256)","6418b903":"transferRewardPool()","6418f643":"ClaimBlessings()","641a5f66":"getSendCoin()","641a8cb3":"MANHATTANPROXYBRDWY()","641ad8a9":"poolState()","641b58c2":"checkBet(uint256[],uint256[],uint256[],uint256,uint256)","641bbdfe":"claim(uint256,uint8,bytes32,bytes32,uint8)","641ca23f":"availableICO()","641d55e0":"buyClixToken()","641d6075":"getDailyWinners()","641e3f15":"notifyTokenIssued(uint256,uint256,uint256)","641e6b9d":"TestingEnabled()","641e8cca":"updateGameProprietaryData(uint256,string)","641e90de":"price5()","641f3b46":"isTokenExchange()","641f83a1":"calcEnvHash(bytes32)","6420e71c":"rateForPhase1()","64217bdf":"requestInterest(uint256,uint256)","6421fc04":"LockedMANA(uint256)","642231a6":"legendsCrowdfund()","6422816b":"betBLenght()","64228857":"getRevisionCount(bytes32)","642289f2":"MarketEnabled(address,address,address)","6423690f":"SmartDice()","64239cce":"purchaseUpAndSpend(uint256,uint256,bytes32)","6423b5f0":"miniMeToken()","6423db34":"Reset()","6423dbad":"getGreeter()","64245502":"STRegistrar()","6424bd8c":"Remove()","6424d686":"getEngineerCurrentVirus(address)","64253d2f":"HashnodeTest()","64256611":"collectedFunds()","6425fbed":"getJobStatus(bytes16,address,address,uint256,uint256)","64265b1a":"share_transfered(string)","6428366a":"payToGorgona()","6428925d":"toSTAR(uint256)","6428a652":"setPornstarsContractAddress(address,address)","6428fed4":"pendingJackpotForWinner()","6429161b":"createSaiLimitedEdition(uint256,address)","642ab4b1":"lastBidTime()","642b1759":"getMerkleLeave(uint256)","642b4a4d":"mainNetLaunchIncentiveReserveWallet()","642bdd15":"calculateNewPrice()","642c53e2":"GetData(bytes32,string,bytes32)","642c7aa2":"snatchHero(uint256)","642d345c":"byMaximum(bytes32,uint256)","642d63a3":"buyLottery(uint8)","642dfe55":"Bitmos(uint256,string,uint8,string)","642e8271":"NigeriavsArgentina()","642f1ddc":"nome_candidato_da_indice(uint256)","642f2eaf":"transactions(bytes32)","642f722c":"createRecord()","642f825a":"randomPetAuraBoost(uint64,uint8)","642fd0f6":"getPixelColour(uint256)","64308a6a":"_getPartSkillColor(bytes,uint256,uint256)","643124cf":"INZEI()","64319ae6":"updateUserEmail(address,string)","64322c9c":"drawingIdToCollectibles(uint256)","64325ddb":"currentClaimPrice()","6432679f":"getUserCapInWei(address)","64326c71":"getTotalGas()","64329400":"setHardParticipationCap(uint256)","6432dc4e":"sell_ppc()","6432e3cd":"CaDataContract()","6432e9e0":"calculatePayrollRunway()","6433ef42":"adjustWithdrawRate(uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32)","64341c0c":"getIPFSCode(bytes32)","643537aa":"getBFEX(address)","64362587":"SetRevealBlock(bytes32,uint32)","6436434e":"getAddressDnaIds(address)","6436b1b9":"getSpawningForCount(address)","64370755":"removeDistributionSources(address[])","64371977":"set(uint256,string)","64379150":"setNumberClaimToken(uint256)","6437ab0b":"checkCommitPeriod(bytes32)","64385828":"setDataColla_AB_01(string,string)","6438c43e":"getCurrentSchellingRound()","6438f449":"noviceDungeonId()","64392a80":"balanceOfOwnerInVault(address,address)","6439437e":"cloneIt()","643a7695":"verifyParticipant(address)","643ac0bd":"_unregisterAttack(bytes32)","643aff0f":"investorWallet()","643b18b6":"teamWallet_1()","643c6d1f":"PureChainToken()","643ce525":"teamLimit()","643d1be5":"setMainSaleStart(uint256)","643d6dc0":"getInfos()","643d71a2":"KODB(address)","643e1aa5":"SetStartTimeTLP2(uint256)","643e7365":"initialSaleContract()","643e77d8":"calculateProfit(uint8,uint256,uint256)","643f7cdd":"DAOpaidOut(address)","643f9b72":"SherolexToken()","643fcd27":"addieren(uint256,uint256)","64422ede":"createPoolsIfNeeded()","64422f3c":"multiDeltaBalances(address[],address,address[])","64425055":"returnedDataDecoded()","644280e2":"tokensForBounty()","6442af8d":"_totalRemaining()","644443ed":"addContractRole(bytes32,string)","64445d9e":"adminEditBallotOption(uint32,uint32,string)","6444a288":"setMinTokenForSP(uint256)","6446169b":"sellStar(uint256,uint256)","64461a55":"Synergy(address)","6446a339":"addAddressToPublicBuyerList(address)","6446afde":"getMappingElement(uint256)","6446ebd8":"deleteResources(address,address[],bytes4[])","644843f3":"LogNote(bytes4,address,bytes32,bytes32,uint256,bytes)","6448adc6":"tierLevel()","6448b46f":"pushCap(uint256)","6448b6cb":"closeVaultAccess()","644998ae":"maintain(int256,uint256,uint256)","644a3d42":"ANKR()","644a803d":"BlockTogether(address,uint256,uint256,uint256)","644a9db8":"sign(uint256,address,uint256)","644b1d1a":"CompetitionCompliance(address)","644b7a43":"getTokenByIndex(uint256)","644b7dc6":"_isOperatorFor(address,address)","644cf307":"preSaleBonus2Percent()","644d8164":"getDesc()","644d8cce":"burnMas(address[],uint256[],uint256)","644e4e4e":"LogVotes(uint8,uint256)","644e8b24":"getPrices(uint256,uint256,uint256[],uint256)","644fab74":"setTimeLock(address,uint256)","64506302":"okamiCurrentPurchase_()","6451447d":"buyoutFeePercentage()","6451ab58":"activeuser()","6452a10f":"emergencybeneficiary()","6452f344":"sayGoodbye()","6453558e":"founderTokenWithdrawnPhase3()","6455058e":"getStakedAudits(address)","6455780c":"getImportingParty()","6455cb97":"EPTest()","64561370":"oraclize_query(uint256,string,bytes[5],uint256)","6456d071":"addPatientReply(address,string,string,address)","64571245":"withdrawATN(address)","6457237b":"indexOf(uint256[],uint256)","64584b14":"executeOrders(address[],bool[],uint256[],uint256[],address[],address[],address[8][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[],uint256)","64584d16":"CardFootballers()","6458de1e":"ensOwnerPx()","6459361d":"setDetail(string)","6459a8dc":"PerseiToken()","645a8570":"teamAndAdvisorsAllocation()","645ac00b":"transferSignership(address)","645b8b1b":"status(address)","645bcd3a":"checkBasketExists(address)","645bd436":"clearDelegateAndUnlockTokens()","645c4625":"get_orderAddress(address,address,uint256,uint256,uint256)","645c6fae":"registerContract(bytes32,address)","645c9931":"SHPToken()","645c9ac8":"returnMixType()","645cd046":"bundleToken(uint256)","645d95d4":"LogBidAccepted(uint256,address,uint256,bytes32,uint256,bytes32)","645dbfd4":"updateRandom()","645dce72":"updateRelease(uint32,uint32,uint32,bytes20,bool)","645dfad7":"sellATR(uint256)","645e175c":"publicGetNote(uint64,bytes2)","645e6ddc":"bookingBalanceOf(address)","645f0d11":"toggleFactoryPower()","645f754a":"OZTToken()","6460c353":"PoWMiB()","64610c73":"ADA(uint256,string,string)","646156aa":"cancelTournament()","6461ed00":"TOTAL_TOKENS_SUPPLY()","6461fe39":"transferFromWithReference(address,address,uint256,string)","64631be6":"signatureOf(uint256,uint256)","6463d6bc":"getMaxBidder(uint256)","646439a3":"tradeStream()","64648589":"fundICO()","6464b107":"TRIUM(uint256,string,string)","6465d25a":"Aliencoin()","64663ea6":"withdrawAndSend(address,uint256)","646668b6":"getMaxBet()","64669d1b":"BadBitchCoin()","6466cfa1":"changeSellFee(uint256)","64679356":"Controller()","64679806":"last_number()","6468328e":"executeTransfer(address,uint256,bytes)","6468c099":"addAnimalType(uint128)","6469c348":"maintain()","6469c89b":"getNiceBets(uint256)","6469e87f":"isKickoffEnabled()","646cd69b":"postponeDueDate(uint256,uint256)","646cf24d":"assignTokenContract(address)","646d4f53":"PlayX100()","646d525a":"NetCents()","646d978b":"getKudosById(uint256)","646e90e7":"getAddBal()","646eba48":"releaseTokens(bool)","646f22c5":"getTicketsLeft()","646f2942":"CryptoJade()","646f7834":"lockCountingFromTime()","646fe5ee":"OwnershipTransferConfirmed(address,address)","646fec02":"ProposalAdded(uint256,address,uint256,string)","6470db2f":"removeAllowed(address)","647151b5":"sellUnicorn(uint256,uint256)","647308ee":"verifyWithdrawSignatures(bytes32,address,address,uint256,bytes,bytes)","64738c23":"makeOrder(address,address,address,uint256,uint256)","6473b34a":"batchAllocate(address[],uint256[])","6474dd4c":"LuckyWorldCupToken()","6475e3d3":"MIN_BET_AMOUNT()","6475e47d":"DGT_contract()","647734b2":"setValidationAddress(address)","64779ad7":"pausedOwnerAdmin()","647846a5":"feeToken()","64794403":"setAddressOfERC20Tocken(address,address)","647aac0c":"race(uint32)","647b5ced":"pubsaleCap()","647b6065":"tokenIdToOwnerArrayIndex(uint256)","647d02d2":"closeFail()","647d5f14":"dividendinfo()","647dd08c":"callSender(address,address,address,uint256,bytes,bytes)","647e61f1":"setLargeInvestorApproval(address,uint256)","647f7058":"Commitment()","64801da1":"reliefRatio()","64802918":"div(uint16,uint16)","6480d014":"preicostarted()","64812751":"finaliseState()","6481f081":"sellVouchers(uint256)","64821338":"hasVoted()","648236e3":"acceptBidForSketch(uint256,uint256)","64826b7a":"publicSaleCap()","6482c535":"rateOfParking(address)","64832c4c":"heatUp(address,uint256)","648345c8":"setMessage(uint256,string)","648351b9":"MarbellaCoin(uint256,string,uint8,string)","64836227":"notifyWatcher()","6483a330":"getPeriodInDispute(uint256)","6483ec25":"append(bytes32)","6484ae80":"_addCharacters(address,uint8)","648583b4":"updateCandidate(address,bytes32,string)","6485cc52":"GBP_Omnidollar()","6485d678":"setActive(bytes32,bool)","6485e2e5":"_removeController(address)","64861329":"DiamondProjectToken()","648619dc":"serviceUnpause()","648621ec":"xnotify(string)","64864ca6":"Expand(address)","64868f97":"roundTokenLeft(uint256)","6486aa51":"isConfirmed(bytes32)","64887334":"setCompactData(bytes14[],bytes14[],uint256,uint256[])","6488c20e":"TransferableChanged(bool)","64893fcb":"totalVestedAmount()","648a0c91":"updateExchange(address)","648a5903":"isShortPositionExpired()","648aa3b1":"getComponentByName(string)","648ad97f":"setMain(uint256,uint256,uint256,uint256,uint256)","648b3514":"CheckpointToken(string,string,uint256)","648b7ce8":"Increment()","648bf774":"recover(address,address)","648c51eb":"isMyPlanet(uint256)","648c925e":"backToAll(uint32)","648d6367":"DocumentaryContract()","648d7219":"setOCG(address)","648d9e26":"startPublicIco(address)","648e49e6":"dSET_XBL_ADDRESS(address)","648e625a":"confirmTransaction(uint256,address,uint256)","648f0bde":"Play(string)","648f4f0f":"tokenStoreAddress()","648fb06f":"mintMultiple(address[],uint256)","648fd473":"EBRK()","6490c7a8":"getArea(uint256)","64913477":"setMultisigWallet(address)","64916fcf":"WhitelistedCounterUpdated(uint256,uint256)","6491f0b7":"setLLV_edit_6(string)","64921844":"getTimePassed()","64928d24":"wasSaleEnded()","649371e0":"oracleCurrentInt()","649375da":"addEarned(uint256)","6493d7fc":"CircuitBreaker(address,address,uint256,uint256)","6493e64c":"upgradeTo(string)","6494b55b":"ceoAddCoo(address)","6494cde1":"endTransfer()","6494d477":"saltHash()","649564b3":"getOtherContractParticipant(address,uint256,address)","649677e1":"entranceFee()","64968f58":"set_presale_iconiq_arbits_per_ether(uint256)","6497129c":"getRoundNumber(uint256)","64976b4d":"setNplay(address)","64978c7f":"jembex()","6497b400":"_getFashionParam(uint256)","6497bd3a":"newPriceTicker(string)","6497d32e":"setCCH_edit_18(string)","6498156e":"preICOBuy()","64994978":"setFounder()","64996a43":"_computeCycleSkip()","6499e2d9":"ERC777DemoToken(string,string,uint256)","649ae9c6":"lockDate()","649c07d5":"is_contract(address)","649c0b21":"addressOfMSF()","649d56db":"getContractProps()","649e3c46":"createDoc(string,string,string,string)","649eea7f":"_transferCar(address,uint256,bool)","649efd6e":"mintForEverybody()","649f0153":"fiatBalance()","64a04d07":"ReconOwned()","64a08260":"adminRemoveRole(uint256,address,uint256)","64a20e2d":"getImpactDonor(string,uint256)","64a237f4":"VEGANToken()","64a31b80":"getRequiredReportsPerReporterForlimitedReporterMarkets()","64a41399":"contributeInCreditsToken()","64a48499":"getIntegerValue()","64a4a5d7":"testBitsEqualSuccess()","64a5a632":"getCompanyByName(bytes32)","64a640ef":"Bosscoin()","64a666f2":"getAuthorizedInsertAgents()","64a68943":"dividentSent(uint256,address,uint256)","64a7cc4b":"purchase(uint128)","64a7d7c7":"bidAuction(uint256)","64a80c0c":"openStream(address,uint256)","64a83d8b":"_removeTokenFromTranche(address,bytes32,uint256)","64aabe92":"tryExec(address,bytes,uint256)","64ab23c9":"finalizeChangeStakingFees()","64ab374b":"getUnreadMessagesArrayContent(uint256)","64ab4702":"voteWeightUnit(uint256)","64aba263":"setInternalInfo(address,uint256,uint256,uint256,uint256)","64ac12b1":"multisig(address[],uint256)","64ac2c4a":"WavesPresale()","64acdb77":"disablePurchasing()","64acef7d":"newBP(bool,address,uint256,uint256,string,string)","64ad6027":"updateOrderNumber3(uint256)","64adc403":"getUserRewardPayouts(address,address)","64ae4451":"stateIs(uint8)","64aea551":"randnum()","64afab72":"remove(address,bytes32)","64afcf2e":"minSecondsBetweenPublishing()","64b09402":"setMetadataProvider(address)","64b13270":"registerDeed(string,string)","64b2eb2c":"publicOfferingExchangeRate()","64b3302d":"safeMult(uint256,uint256)","64b3b844":"getSaleInfo(uint256)","64b494d9":"setValInt(uint256)","64b4e6eb":"payRef(address,uint256)","64b55e8b":"SULTANT()","64b7571f":"distributeDividends(address,uint256)","64b7f1d3":"Rules()","64b837ab":"stopBlockjack()","64b9ca08":"noAdvert()","64bc6a74":"AllPartnersSet(uint256)","64bc82c3":"delegateAddresses(uint256)","64bd3066":"dispute(address,bool)","64bd7013":"wait()","64bd87d6":"scheduleCall(address,bytes,bytes,uint256,uint256)","64be8453":"NewUserAdded(address,address)","64beb745":"lockOwnership(uint256)","64bebead":"_FreeDom()","64bfc9a5":"stopBountyMint()","64c176eb":"setSmartToken(address)","64c2555d":"buyDay(uint16,uint256,string)","64c27f2a":"isOwnerOrOps(address,address)","64c2b768":"powered_up()","64c33c33":"setPrice(uint16,uint16,uint8,address,uint256)","64c34364":"hodl(uint256,uint256,uint256)","64c37043":"buyRareItem(address,uint256,uint256)","64c403d4":"getETHx2(uint256)","64c40bbc":"DCoin()","64c422d0":"participantToUBObought(address)","64c487ef":"isStoppingIcoOnHardCap()","64c638d5":"withdrawTokenToClientAccount(bytes32,bytes32,address,uint256)","64c66395":"getUIntValue(uint256)","64c76117":"endDistribution()","64c7b3bf":"Journal(uint256)","64c7b78c":"addOrg(string,string,string,string,string,string)","64c877f1":"depositLiquidateThePool(uint256)","64c88d62":"calcDemurrage(uint256)","64c8cd8c":"unlockMinedBalances(uint256)","64c8e825":"PooCoin()","64c96322":"setAllocationOpen(uint256)","64c96572":"TokenLMTC(uint256,string,uint8,string)","64ca6478":"createImage(uint256[],uint256,uint256,bytes32[],string,string,string)","64cab0e3":"setCurrentPrizePool(bytes4)","64caf214":"setPlayerDetectGroup(address,address,uint8,uint32)","64cb5338":"FundedAmount(uint256)","64cbbd34":"WalletChanged(address,address)","64cbbdc7":"addDividendsForAddress(address,address)","64cbfdd6":"p_update_planetCryptoUtilsAddress(address)","64cc7327":"retrieve(string)","64cc7719":"getUserDataOnEther(uint256)","64ccd7a0":"getAutomatedReporterDisputeBondToken()","64cd1f69":"requestInvestment(uint256,uint256,bool)","64cd4a1a":"round4TokensRemaning()","64ce1068":"lockExpiration()","64ceed99":"foundersTimelock()","64cefc90":"fliqToken()","64cf6d71":"toBytes1(bytes,bytes,uint256)","64cf9167":"Numisma()","64d03095":"getSpecificTransaction(address,uint256,uint256)","64d03144":"Plaak(uint256)","64d05519":"createLastWill(address,string,string,string)","64d0bbc4":"increaseGenerationCount(uint256,uint8)","64d0d64c":"testControlCreateWithParentNotInUse()","64d0e83b":"jackpotWinCount()","64d12ec6":"getRevisionIpfsHash(bytes20,uint256)","64d17c08":"setServiceTokenAddress(address)","64d34045":"setCCH_edit_20(string)","64d3e7c9":"ReserveToken(string,string)","64d40354":"limitAmount(uint256,uint256)","64d4702f":"getNextKeyPrice(uint256)","64d4c819":"TYPE_HASH()","64d538d3":"StartIco()","64d563f1":"doubleClaimSegmentSlash(uint256,uint256,uint256,uint256)","64d57a03":"GainTempStuff(address,uint32,uint256)","64d582c0":"incentiveDistributionInterval()","64d5922f":"pingBlock()","64d5d024":"isValidBox(uint8,uint8,uint16)","64d6a95f":"changeGameParameters(uint256,uint256)","64d75891":"XXXXXXXX03(uint256)","64d79f20":"internalRegisterCertWithID(bytes32,bytes,bytes32,uint256,bytes32)","64d85348":"deleteOffer(address,address)","64d905c0":"awaitingParticipants()","64d98bd3":"ownerTransferJackpotToken(address,uint256)","64d98f6e":"isSolved()","64d9a9e9":"AirDropToken(string,string,uint8,bytes32,uint256)","64da8ad3":"settleSeller(address,uint256)","64dab033":"landmarkPriceStepDenominator()","64dab283":"getWHGDonationAddress()","64dad32f":"isTokenUser(address)","64db5aa8":"ARDBatchTransfer()","64dc68b8":"ILove0xBTC(string)","64dc807a":"burnUndistributedTokens(uint256)","64dd891a":"attack(uint256)","64ddc605":"lockupAccounts(address[],uint256[])","64dde40f":"isTournament()","64ddedc6":"Triangle(uint256)","64ddfa29":"getAdminAddresses()","64de4c1d":"setTatAddress(address,address)","64df049e":"protocolFeeRecipient()","64df19da":"removeCustomTimeLock(string)","64dfe85e":"Dsteem()","64e08644":"stakeRemainingToVote_Eth()","64e0bbc5":"checkMyTransactions()","64e19bdd":"ownerAirdrop(address,uint256)","64e1f38b":"howManyKeysCanBuy(uint256)","64e21c9e":"DirectFundingProcessed()","64e24f4b":"UpdateClientTokenAccount(address)","64e28148":"clear(address,uint256,uint256)","64e28636":"getLateFee(address)","64e2ec50":"collectOtherTokens(address)","64e2fdfa":"ToukenToken()","64e31d74":"RaffleLedger(string,uint256)","64e36d04":"hardCapInEther()","64e39b87":"setFundsWallet(address)","64e40eb9":"withdrawTokens(address,address,address,address)","64e4596e":"_getPVPContendersCut(uint256)","64e48fcd":"testResetBet()","64e48fde":"findPossibleDelegatorsOfRaw(bytes32)","64e4a8fb":"xaurCoined()","64e50fb9":"setIco()","64e593c0":"setStartTimeIco(uint256)","64e5c8be":"getRoundPrizeShare()","64e62afc":"setSegmentOwner(string,uint32,uint32,string,string)","64e749ff":"getPosition(bytes12)","64e779b1":"unmint(uint256)","64e7e4a4":"transferNotification(address,uint256,uint256)","64e8687f":"withdrawTalao(uint256)","64e8d682":"pre_startdate()","64eaa454":"crowdsaleAmountLeft()","64eaff54":"getSquirrelmasterReq()","64eb7327":"_getContent(bytes32)","64ebd70d":"the365address()","64ec8bdb":"creatorWithdraw()","64ed31fe":"authVotes(address)","64eda74b":"setIsFrozen(bool)","64eded20":"_getTokenAmountWithBonus(uint256)","64edfbf0":"purchase()","64ee49fe":"scheduleCall(address,uint256,bytes4,uint256,uint256,uint8)","64ef212e":"proxyTransferWithReference(address,uint256,bytes32,string)","64ef563c":"reveal_registration(uint256,address,address)","64f018d8":"issue(address,uint256,string,string)","64f05fd7":"calculateWithdrawableAmount()","64f06b39":"setPC(uint256)","64f101f0":"closeMint()","64f15430":"fundVesting(address,uint256)","64f1873b":"ICOstarttime()","64f39b47":"return_funds()","64f40a3c":"RESERVED_TOKENS_FUTURE_OPERATIONS()","64f42a99":"addUser(address,bytes32)","64f4b094":"getLowestBid(uint8)","64f54a17":"getLatestItemRaffleInfo()","64f65cc0":"setFinished()","64f67f33":"DIPToken()","64f6f7b9":"setup(address,uint256,uint256)","64f8ad1f":"get_default_approval_duration()","64f951e9":"sessionBlockSize()","64fa3070":"getEscrowFee(address)","64faf22c":"left18(uint256)","64fb7d68":"coinMinter(uint256,uint256)","64fc2d9d":"_tryCreateEtherMonster(uint256,uint256)","64fe5cde":"MAX_UINT48()","64ffb47b":"getTotalMicroKeys()","65011760":"DOCToken()","650271d2":"makeMove(uint8)","65030adb":"RESERVED_TOKENS_ICO()","65030e75":"setSecretContract(address,uint256)","6503178a":"setMinVeriAmount(uint32)","65033845":"XiaoshiToken()","65036ca9":"zethrBuyIn()","6503a701":"InitiatePayout(address,string,string)","6503e5ff":"mFUNDING_BONUS()","65045a2b":"bottomName()","650462ab":"tokensMasterNodes()","650500c1":"whatIsTheMeaningOfLife()","65050e27":"checkCandy(address)","65054e55":"claimSellerFunds(address,address,address,uint256)","65058f4c":"requestPayout()","65061957":"EMPTY_RESOURCE_SET_ID()","65066810":"WHITELIST_SALE_LIMIT()","650669d2":"getCompte_1()","6506b0d6":"setData(string,string,string,string,string,string)","6506b623":"rotateBitsLeft(bytes,uint256)","65084b76":"OpenRegistryRules(address)","6508978b":"updateLatestSaleState()","65089dd8":"freezeStatsSumHours(uint256)","65093661":"newCommunity(address)","650944a6":"beneficiaryStash(address)","650955d4":"HashToken()","65098bb3":"calculateCrossConnectorReturn(uint256,uint32,uint256,uint32,uint256)","6509c195":"setPartnerPool(uint256,uint256)","6509e776":"CC()","650b147d":"paidToPartners()","650c2b28":"tokensPerDollar()","650c4226":"changeFees(uint256,uint256,uint256,uint256)","650ce14c":"registerPublisher(address,bytes32[5])","650d0aa3":"ChangeFee(uint16)","650d22e8":"countryTimeLock()","650d5d6b":"get_status(uint256)","650d993b":"getCustomer()","650dd4fb":"_createCountry(string,uint256)","650e1505":"createLock(address,uint256,uint256)","650e85af":"setUserRoles(address,uint256)","650ee1ee":"NewSale(uint256,address,uint256)","651006c0":"getCreateMarketDenominationTokenValue()","6510076f":"giveTokensOne(address,uint256)","65103f6e":"hasFees()","651044a2":"BitcoinpalletToken()","6510cc17":"INITIAL_mulFactor()","6510ef4d":"oraclize_query(uint256,string,string[5])","65113528":"getBoosterType(uint256)","65114459":"getOpenPackageId()","6511a98b":"testRegisterProduct()","6511eadb":"marketingProfitAddress()","65121205":"calculateDevCut(uint256)","65121f68":"add1Y(address,uint256)","6512c9b5":"OwnersProductCommissionChanged(uint256)","65131f63":"getMembersOfTier(uint256)","65132ad3":"Police_3()","651398e6":"allocateTokenForAdvisor(address,uint256)","6513fafe":"resistWhiteList(address)","65141c20":"setRemixCount(uint256,uint256)","65147784":"Pasband()","65149a76":"calculateWinnings(bytes32,address)","6514aaca":"minimumCommission()","65153632":"assertEq11(bytes11,bytes11,bytes32)","65158b3b":"contributor(uint256)","6515c1fa":"defineMecenas(address)","6515c6a9":"paused2()","6515d28c":"getLockingTypeCount()","6516395a":"lockCustomer(address)","651680af":"stage5Deadline()","651738a3":"setMinScaled(int8)","6517ef33":"getNumberOfOrders(uint256)","65181ad3":"GET_METADATA()","6518361e":"SCT(uint256,string,uint8,string)","651883c1":"batchSpawnAssetWithCreator(address[],uint256[],uint256[],uint256[],address[])","6518ad22":"placeETHBid(uint8)","65195bc7":"DPNPlusToken()","6519fac2":"userExisted(address)","651bb617":"tokenlength()","651bc2fb":"reserveNIMFAAddress()","651bfd2d":"itemPrice(address,uint256,uint256)","651c2ff9":"preTge()","651c5c84":"TokenWalletHolder()","651c5d2d":"getGiver()","651c9e99":"GOGRN()","651cd08d":"validateStart(address,address)","651dd0de":"values(bytes12)","651ed944":"startPreICOStage()","651f066a":"playerBalance()","6520715a":"approveClaim(bytes32,string)","6520768d":"modName(string)","652084c0":"storeKey()","6520ca0d":"levelUpMining(uint256)","6520fde5":"auctionPaused()","652106d8":"tokenTribe(uint256)","65213840":"prizeMoney()","652139e2":"setAngelFinishDate(uint256)","65216a41":"airDrop(address[],uint256[])","6521c03c":"createContribution(address,uint256)","65225665":"getPlayerAddress(uint256)","65227c7d":"RenCap()","65228934":"setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","6522bff1":"update(uint256,string,string,string)","65243f87":"findNextWeekday(uint256,bytes2)","6524f107":"BlobStore()","6525a233":"ORACLIZE_COMMISSION()","6525c29d":"rejectAdvertiserCharges()","6526db7a":"remove(uint256,uint256)","6526ecee":"KingOfTheEthill()","652740a7":"TransparencyRelayer(address)","6528ef46":"BBY(uint256,string,string)","6528f4cb":"getDivRate(uint256)","652918bc":"updateProfit(uint256)","6529abba":"setSellComission(uint256)","6529d1c9":"pricesOfDate(uint256,uint256,uint256[],uint256)","652b51eb":"RefundEnabled(uint256)","652b810c":"setInternalStakingAddress(address)","652ca8f4":"cofoundersSupplyDistributed()","652d38fc":"getTotalIn(address)","652da5ff":"b(bool)","652dad7b":"batchDecreaseApproval(address[],uint256[])","652db9ab":"_distribute(address,uint256)","652de5ad":"countPerfManagers()","652ebb4c":"tokenPriceInETH()","652edd41":"purchaseDatesEdition(uint256)","652f1f16":"addSignature(string)","652f6494":"treasuryOfficials(uint256)","652f78cc":"allocateCommunityToken(address[],uint256[])","6530b7f9":"_createDrink(string,address,uint256)","6530e008":"STAGE2_TIME_END()","6531041b":"updateMIN_CONTRIBUTION(uint256)","6531a708":"getHolderEditions(address)","6531dbff":"totalFundedEther()","65325871":"transferableTokensOf(address)","6532b646":"SFI()","65343fcb":"TrustEth()","6534b4e2":"IsPayoutReady__InfoFunction(bytes32)","6534eb76":"recycling(uint256)","653704b1":"_changeName(string,uint256)","65372147":"result()","65375f38":"updateCustomerKYC(address,address,address)","6537e401":"setIII_S(uint256)","653853c0":"AMLToken()","6539335a":"toTipoEnte(uint8)","65395242":"MathisTestToken()","65397d5e":"refundOIDIndex_()","653a8f14":"getNumTilesFromBoard(uint16)","653abf37":"setDecision(bytes32,address,address)","653c3174":"investorsNumber()","653c95b8":"getContribution(address,uint256)","653c968a":"Bethopia(address,address)","653c9eea":"isBS(address)","653cfd2f":"testTemp4()","653d1ca4":"getPI_edit_21()","653e2e0d":"setLastPositions()","653f23f8":"registerJuryMember(string,address)","653f7219":"AddVerifiedInfo(bytes32)","653fbca1":"payableEtherReceived()","653fcf4c":"pewdiepie()","65401882":"setDB(address)","6540742f":"MIN_BET()","6540dc07":"_destroyImpl()","6540fcc2":"PRICE_PRESALE_WEEK1()","654142c7":"getBoolField2()","65419516":"bettingStart()","654259dd":"availableAmount(address)","654286d1":"changeFrozenBalanceAll(uint8)","6542fed7":"evaluateShareholders(address,address)","65433e7f":"AntFundRobotToken()","654470fc":"getTotalSellingItem()","65449436":"CryptoConseilSuisse()","65450a90":"ACEBlock()","6545bed3":"Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","65472731":"lastBlock_a5()","6547c080":"Renmin(uint256,string,uint8,string)","65483f69":"getBNTBalance(address)","65488541":"Harimid(uint256)","6548b40d":"depositErc20(address,uint256)","6548e9bc":"setRelayer(address)","65497caf":"limitDateSale()","654a1855":"CentToken(uint256,string,uint8,string)","654a95f2":"calculateEggSell(uint256,address)","654a9f69":"CappedCrowdsale(uint256,uint256,uint256,uint256,address)","654af496":"callDividend(address)","654b3110":"allowIssua()","654b6105":"DestiNeedToken()","654c2111":"Cash311()","654c6daf":"totalTeams()","654c7381":"listItem(uint256,uint256,address,bytes32)","654c8748":"setBitSTD(address,address)","654cf88c":"store(bytes32)","654d146a":"costAndBuyTokens(uint256,uint256)","654e27f9":"callBtoWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","654e51e7":"setRewards(uint256,uint256)","654f18b1":"DragonPriceUpdated()","654f1ccb":"getGamesLength()","654f4575":"getTopN(uint256)","654f4b61":"bidHash()","654f7d40":"ETHERRED()","654f97a3":"setClaimStatus(bool)","655012a9":"sumPrice()","655042ee":"OSCoinToken()","655059db":"create(bytes32,bytes32[])","655187b2":"Aragon()","6551fb11":"localsStore(address,address)","65521111":"isAble(address,uint8)","6552a562":"updModule(string)","6552d8b4":"removeReceiver(address)","655330f4":"NLog(uint256)","65536ab3":"BFEXToken()","655388be":"walkTowardsBlock()","65538c73":"fireEventLog0()","65538da0":"preSaleOpened()","655391c9":"updateBaseTokenURI(string)","6553b03c":"cloneContractor(address,uint256)","65540940":"partnerAllocateRestrictedTokenTo(bytes32,bytes32,uint256)","6554d179":"attachedSystemActive()","65550e70":"getNextAvailableCard()","6555394b":"updatePrice(address,bytes32[],uint256[],uint256)","655584d6":"ChangeDate(uint32)","6556f767":"getBytes(address,bytes32)","6557a47c":"Tier_Wildcat()","6557b677":"lowTokensToSellGoal()","6557dfc8":"AnimeToken()","65581793":"S2()","6558488a":"scheduleSetBool(address,uint256,bool)","6559aeb2":"transferTimelocked(address,uint256)","6559c08d":"checkProblemsSolved()","655a4ebf":"revokeAttribute(address,address,bytes32,bytes)","655b08eb":"getRandom(uint256,uint256)","655b3667":"TOKEN_SUPPLY_AIRDROP_LIMIT()","655b97db":"ownershipLookup(address,uint256)","655bb0e8":"transferSubcontractsOwnership(address)","655bb565":"changeGasPrice(uint256)","655c737c":"getPositionOwedToken(bytes32)","655cc366":"LogGoalReached(address,uint256)","655d0862":"createSignedMessageOracle(bytes32,uint8,bytes32,bytes32)","655d225f":"myTime()","655d65c4":"limitSell(uint256)","655dc4c2":"getLawyerCount()","655e0d38":"changeBroker(address)","655e4224":"addEntryInSecondsPeriods(address,uint256,bool,uint256,uint256)","655e51f2":"MIN_GOAL_EBC()","655ec3e4":"transferSoul(address,address)","655f8294":"PreviousTime()","655fc4db":"vault_releaseDeposit()","655fcaf5":"feeReceiverWallet()","65604a11":"VESTING_WALLET()","6560a307":"suggestedGas()","656104f5":"_setOrganiser(address)","6561e6ba":"feeWithdraw()","6561e921":"becomeRenown(bytes32)","6561ffb9":"LOTTECHAIN()","65620283":"transferTokens(address[],uint256[])","65622cfd":"transferFor(address)","65630493":"ERC20Impl(address,address,address,address)","656362b5":"regFactory()","6563b2fc":"tokensLeftInPhase(int8)","6564a7af":"DeployENS()","6564ad28":"IFNToken(address,address,uint256,string,uint8,string)","65651b6e":"addSkillName(address,bytes32,address)","65670adc":"teamSupply18Months()","65675074":"getAllTokensOfUser(address)","65676c9e":"baseExchangeRate()","65679536":"month24Unlock()","65687008":"fundraiserAddress()","65688182":"recomputeLastAverageBalance(address)","65688cc9":"newGuard()","6568a279":"withdrawAll(address[])","656afdee":"register(string,bytes32)","656b275c":"expandY()","656b9952":"produce()","656ca11d":"CONFIG_FEES_MUL()","656d2f63":"ManagedAccount(address)","656d3091":"createEthSaleAuction(uint256,uint256)","656d677e":"releaseTotal()","656e8d6f":"getTutorialBabyGen(uint16)","656ea1f6":"snikerts()","656f416d":"uponTransferFrom(address,address,address,uint256)","656f64f5":"pendingGDPOracle()","656f6873":"ActualizePriceBeforeStart(uint256,uint256,uint256,uint256)","65704506":"currentGame(address)","657128a2":"altTokenOf(address,address)","657157e5":"canTrade(address,address)","657206ef":"getSignedAddresses()","6572ab5b":"shareCycleIndex()","6572ae13":"calculateWinner(uint256,uint256)","6573ee1e":"doFailingApprove()","6574bdd2":"newDream(address,string,string)","65757eeb":"removeDiscounts(uint256[])","65766b64":"stageBegin()","6577ab77":"_checkSeal(address,address,address,uint256)","65781994":"SESAPACToken()","65783c66":"checkTicket(uint32)","6578d920":"_canSendGameGift()","65791e46":"setTimeTransferAllowance(uint256)","65794de3":"secondStageDuration()","657a2ffa":"Register(uint8,string)","657a37ad":"depositAndSell(address,address,uint256)","657ad078":"moveOwner(uint256[3],uint256[4],uint8[176],bytes32,bytes32,uint8)","657ad479":"presalePerEth()","657ba57b":"show_The_name_of_option_C()","657c5dae":"ApproveTitle(uint256)","657d38b8":"endICOp3()","657db38d":"ten_wallet()","657edc11":"removeLootbox(address)","657f3ab0":"getPricePoint(uint256)","657f4783":"getRealGoldBought()","658030b3":"tokenInstance()","65826666":"executePullPayment(address,string)","658268c1":"StableCurrencyToken(uint256,string,string,uint256)","658311ab":"jackpotLevel()","658389cb":"isFromCountry(address,address,uint256)","6583e239":"STATUS_DEAL_APPROVE()","6584a5b5":"removeLock(address[])","6584ceb0":"StartNewEpoch()","6584fcce":"ATCReserveLocker()","658523d9":"StrategicToken()","65855010":"rateSale()","658577e9":"buyXid()","65857a5e":"parkingOn(address,uint256)","65859862":"add_arbits(address,address,uint256)","6585c27c":"getrandoms()","6585dc12":"enableRefundPeriod()","658612e9":"gasFee()","65862330":"TestableStandardCampaign(string,uint256,uint256,address,address)","65863b24":"getTotalCollectedPromoBonus()","6586bb25":"MAXIMUM_PARTICIPATION_AMOUNT()","6586bd51":"getNodalblockSender(string)","65879e72":"JED()","6587ab3d":"toggleSafetyMode()","6588875e":"ShutterToken()","6588c11c":"_startSwap()","658a5692":"_totalEthCollected()","658b98a9":"pointMultiplier()","658bc083":"initDistribution(address,address,uint256)","658bf147":"setArea(uint256,bytes32)","658c55ed":"saleProceedsFiat(uint256)","658cc376":"getCensuringCount(uint16)","658d3423":"getGameMinAmountByBet(uint256)","658dc76f":"addChunk4ToWhiteList()","658df3f7":"approveCompletedMilestone(uint256)","658e587f":"getWithdrawConfirmationCount(uint256)","658eefd1":"notifyRefundToken(uint256,address)","658f2ad6":"CrowdSale_Resume()","658fbfbc":"transferOnError(address,uint256)","659010e7":"m_spentToday()","65909081":"Brothel(address)","6590f0ed":"DUKCoin()","65921f02":"paladinEquity()","65926a20":"changeSaleOn(uint256)","6593643c":"CreateIND(address,uint256)","65937ab9":"isUpdateAuthorized(address,uint256)","659382fb":"payoutETH()","6594479f":"LTYP()","6594d99b":"isDataNo(bytes)","6594ea6c":"EGGS_TO_HATCH_1SQUIRREL()","65957bf5":"getShareToken(uint256)","6595c94e":"calculateTierBonus()","6596217b":"HAYATO_FTL_SPEED()","659621b5":"r0()","65968727":"innocoinToken()","6596cff3":"setCrowdsaleContract(address)","65975691":"getDividends(uint256,uint256)","6597a076":"getBonuses()","6598afb9":"yearlyBlockCount()","65995733":"getSalaryTokenValue(address,address,address)","65995cc8":"uploadAdvertisement(uint256,string,address,uint256)","659a46e8":"coinLockRmoveMultiple(address[])","659a7486":"inTradingTime()","659a9cbc":"coinsUnit(uint256)","659ae215":"saleDateFinish()","659b586e":"readQuantityList(address,uint256,uint256)","659b9c72":"UsersNumber()","659bd174":"TransferredTimelockedTokens(address,address,uint256)","659d1185":"angelTimeLock()","659d20eb":"getFoundersGames(address)","659d6bd1":"readPower()","659d7aaa":"sendEtherManually(address,uint256)","659de63b":"distributeToken(address[],uint256[])","659e0729":"getFirstAmount(bytes32,bytes32)","659e27b0":"setWhitelistingAddress(address,address)","659e69e9":"setDelegateAdmin(address,address,string,bool)","659eeabc":"tokensWithAmount()","659eeef1":"increasePaymentsBalance(address,uint256)","659f9e3c":"lastEpochBlockHeight()","659fb968":"getOracleOutcomes(bytes32[],address[])","65a096dc":"changeWithdrawableRound(uint256)","65a114f1":"resetTime()","65a178c0":"getTlength01()","65a20ef9":"hasRole(uint256,address,uint256)","65a31545":"doDeposit(address,uint256)","65a3d8f0":"setEtherCentPrice(uint256)","65a4c957":"resultsDelay()","65a4dfb3":"oraclize_query(uint256,string,string,string,uint256)","65a572dc":"EGREngravedToken()","65a5e708":"Upgraded(uint256)","65a5f1cd":"changeFoundation(address)","65a61ab4":"RWSC()","65a6bb29":"getAllOracles()","65a707bf":"DrugDealer()","65a7dcec":"addWinners()","65a8a483":"setColdWallet2(address)","65a91d4a":"createAmountFromTmedForAddress(uint256,address)","65aa96bd":"postJobOffer(uint256,address,uint256,uint256,uint256)","65aade1a":"getEmployeeId(address)","65ababe9":"createERC20Token(string,uint8,string,uint256)","65ac0d8b":"Withdrawl(address,uint256)","65ac2320":"ownerName()","65ac4341":"getTotalAmount()","65ac8c2a":"getSellOrdersInfo()","65ad9f34":"setHardCap(uint256,uint256)","65ae247e":"issueLockedTokensCustom(uint256,uint64)","65aebe7b":"ind(address,address)","65aec658":"_createCitizen(uint16,uint16,uint8,bytes32,bytes32,bytes32)","65af2a7d":"investedDDT(address)","65afa594":"Member_GetMyTokens()","65b040c8":"setPriceWithBonus(uint256)","65b051b8":"MEWSToken()","65b06136":"makePayouts()","65b0bc85":"createNameAndPoint(bytes32,address)","65b0d711":"updateApprovalOfToken(address[],bool)","65b0e5b3":"setethrate(uint256)","65b1c987":"resetBurntTokens()","65b1fdf4":"scheduleIssuePOIs()","65b27205":"testFailMintWhenStopped()","65b2a863":"revoke(string)","65b37d70":"HotManChain(uint256,string,uint8,string)","65b3a7ca":"isGameExpired(uint256)","65b686b0":"burnRemainTokenOffering()","65b6cd66":"setUserTransactions(string)","65b6d9e2":"a(uint256,string)","65b70e45":"UpMineLVL(uint256)","65b7a89d":"DeDeContract(address,address,address,uint256,uint256,address,address,uint256)","65b7b357":"getVotersAnswer()","65b892a1":"withdrawForOneStep()","65b980ab":"performTransaction(address,bytes32)","65b9e37d":"hardParticipationCap()","65ba12b8":"percentWeiJackpot()","65ba331b":"IcoStagePeriod(uint256)","65ba36c1":"interfaceHash(string)","65baf5db":"tier2Start()","65bb193e":"createInsurance(string,address)","65bbb26a":"Linamyd()","65bc35fa":"Streem(uint256,string,string,uint8)","65bcaf4a":"Ubiou(uint256,string,string)","65bcfbe7":"payouts(address)","65bdadf6":"ninthTime()","65bf1ffc":"authorizedStartTrading()","65bfdb0b":"_receiveChild(address,uint256,address,uint256)","65c04faf":"random(uint32,uint256)","65c09830":"changeStatusGame(uint8)","65c0eecf":"BitcoinLiza()","65c13fdb":"changeGasPriceLimit(uint256)","65c19af0":"getStringLength(string)","65c24799":"getYayNum(uint256)","65c2c60f":"checkName(bytes32)","65c2d3a0":"romper()","65c2e8a1":"bossAdmin()","65c2fab2":"NewIssue(address,uint256,uint256)","65c301ab":"getDriver(address)","65c40b07":"bonusesDates(uint256)","65c4a861":"cordY(uint256)","65c4b463":"_tag(bool,string)","65c5826f":"ENC()","65c5e683":"mine(address,uint8,bytes32,bytes32)","65c683cf":"metadataOfToken(uint256)","65c724cd":"dividendsCollected()","65c72840":"getDay(uint256)","65c7b711":"MockToken()","65c91b0b":"testFailTransferOnlyTrustedCaller()","65c95a6b":"setUFee(uint256)","65c9e51e":"setDepositPeriod(uint256,uint256)","65cacaa4":"getVaultAddress()","65ccb687":"PULSToken()","65cd048b":"setDividendFee(uint8)","65cd1bea":"PayToken(address,address,uint256)","65cd3686":"setIsSendingLocked(address,bool)","65ce47fb":"_myDecimal()","65ce5222":"specificTransferFrom(address,address,uint256)","65ce7395":"setMinVote(uint256)","65cf3a48":"bonusPrice()","65d0a890":"Daio(uint256)","65d0e4a7":"addBot(address,address)","65d1926d":"dropAddress()","65d1df24":"s2s()","65d27248":"setSellPrice(uint16,uint16,uint8,address,uint256)","65d300ea":"CreateAds(address,uint256)","65d43868":"allowedOracleChangePercent()","65d48d0b":"freezeBalancesOf(address)","65d4bdab":"targetEth()","65d51dd5":"_phase2Supply()","65d5b48d":"PRECOMMITMENT_VESTING_SECONDS()","65d61ad6":"PwdHasBeenSet(bytes32)","65d6759a":"getGenome(uint256)","65d68308":"receiveTokenLoot(uint256,uint256,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)","65d6dbbd":"unPromisedPop()","65d6e6a4":"jackpotMaxTime()","65d73851":"calculatePrizeCut(uint256)","65d7d3d0":"LegacyReputationToken()","65d80117":"getResource(string)","65d8a20a":"updateTransactionFeePercentage(uint8)","65d8e32e":"setProfileHash(string)","65d967b0":"ETH_HARD_CAP()","65d9d8e2":"depositEtherForUser(address)","65d9df9c":"totally_decrease_the_supply(uint256)","65d9f31e":"addressFounders3()","65d9f55a":"removeValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,bytes32)","65da1cfc":"AdminClaimed(address,address)","65da5603":"produce(uint256)","65db63d0":"kittensDroppedToTheWorld()","65db6c8c":"OPTIONAL_POOL()","65dba2b3":"removeTeamMember(address,bytes32)","65dc128e":"p_setAirdropPercent(uint256,uint256)","65dc4e3a":"addCollateralMarket(address)","65ddf33b":"productsShipped()","65de1eb3":"getVendor(uint256)","65df517e":"CTHToken()","65df7933":"totalDevelopers()","65dfc20f":"setWalletFees(address,uint256)","65e00beb":"createFlowerAuction(uint256,uint256,uint256,uint256)","65e0c718":"DisputeResolved(bytes32)","65e0e117":"getSendersCalcTokens(address)","65e0e9a2":"preIcoState()","65e14731":"_kittenOwner()","65e16933":"buyPRETDETokensWithoutETH(address,uint256,uint256)","65e16a09":"transferadmin(address,address,uint256)","65e17c9d":"feeAccount()","65e1cc85":"foundersPercent()","65e21cb0":"transferNewBunny(address,uint32,uint256,uint256,uint32,uint32)","65e23ce3":"minimumEther()","65e2406a":"takeEthForExchange(uint256)","65e2409b":"getPlayerEnergyByAddress(address)","65e4349c":"NewStage(uint256,uint256)","65e44d06":"BITOToken()","65e47208":"lcBalance()","65e4ad9e":"isAuthorized(address,address)","65e60ef2":"read(bytes32,bytes32)","65e62ee6":"getInvestorKycLimit(bytes32,uint8)","65e7096d":"allMaskGu_()","65e7ee50":"RCCContractTest()","65e807ab":"getTokenLossValue(uint256)","65e83ae1":"getCrowdsaleTokens()","65e8faf6":"isValidIndex(uint256,uint256)","65e93b3f":"getUserVotes()","65e9cc4e":"contributionPending()","65ea19a8":"set_notary(address)","65ea2b77":"ethaddrc()","65ea62ff":"initTransfer(address,uint256,uint256)","65eb0dec":"changeAllowedTakerBetsPerMakerBet(uint256,uint256)","65ed16af":"_addBridgeNativeFee(uint256,uint256)","65ed6e23":"getAllocations()","65ed8a4a":"proposedTotal()","65eec589":"_markWithdraw(address,uint256)","65ef1a3f":"setHotWalletAddress(address,address)","65ef617d":"AdminWalletUpdated(address)","65ef7b95":"getStoreAddressById(uint256)","65efd3a3":"addCertAdmin(address,bytes32)","65f0a00b":"ONETIDC()","65f17913":"monarchsByNumber(uint256)","65f27bea":"testSubBalanceFailsBelowZero()","65f2bc2e":"unitsOneEthCanBuy()","65f3c31a":"Put(uint256)","65f41211":"validStoreDest()","65f42e7a":"APTV()","65f4d9f6":"failInvestPercents()","65f520a7":"kittyData()","65f5463e":"CLIP()","65f594a7":"revealCurve(uint256,uint256,uint256,bool,bytes32)","65f63c1b":"queryToken(uint256)","65f6a049":"sellGrimReapersAgainstEther(uint256)","65f6c15e":"ordersOf(uint256,uint256)","65f6d6a2":"FOUNDERS_TOKENS()","65f77c63":"getCertAddressByID(string,bytes32)","65f7aaff":"endRoundDecision()","65f84cbe":"_createWeightedMultiplierLot(address,uint256,uint256)","65f88c0d":"getNumUsers()","65f926ff":"getIdArrayItemsCount(address,address,string)","65f937ed":"sumOfAvailableIcoCoins()","65f97082":"startIco2(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","65fa2b97":"calculate_with_fees(uint256)","65fa2f7f":"getLastPrice(uint256)","65facff0":"_isMember()","65fae654":"Mychatcoin()","65fb99ba":"findUnConference(string)","65fba60d":"crowdsaleAllowance()","65fbc99f":"distributedSaleStakes()","65fc535b":"withdrawBenefit(address,uint256)","65fc783c":"getNumOfVoters()","65fcb49e":"maxContractBalance()","65fcf1b5":"releaseFirstUnlock()","65fddc81":"reducer()","65ff0f5a":"TradeListing(address,address,address,uint256,uint256,uint256,bool,bool)","65ff8220":"sampleContract()","65ffe43d":"lastFund()","66003666":"bountyTokens(address,uint256,string)","66005ede":"vc1Wallet4Pct()","6600811c":"tokenSaleHalted()","6600d282":"releaseAngelFirstVested()","6601345c":"changeTierController(address)","66013bdd":"withdrawToken(address,address,uint256,address,uint256,uint256,address)","6601cd77":"getExchangeDetails()","66025047":"isCategory(uint256,uint8)","660357f2":"removeWhiteListedContracts(address)","66035cc0":"adPriceHalfDay()","66040458":"signedApproveAndCall(address,address,uint256,bytes32,uint256,uint256,bytes32,address)","66042e7a":"etherToSendFund()","6604ca6b":"STO_KEY()","66056e8b":"destructSale()","6605bfda":"setTreasuryAddress(address)","6605ff66":"totalSales()","660686de":"cutBAU2Length(bytes32,address,uint256)","6606873b":"setMem(uint256)","6606b7d4":"democFee()","6606fe1e":"CABCrowdsale()","66081ec1":"JACKPOT_WALLET()","66092ea8":"ignited()","66098d4f":"plus(uint256,uint256)","66099706":"getChannelCred(address,uint256)","660a333e":"assetOwnerAdded(bytes32,address,address)","660aab8e":"profileOf(address,bytes32)","660b24b4":"emergencyTokenDrain(uint256)","660b7ad5":"rentDue(bytes32,string)","660ba74e":"_availableBetting(uint256,uint8,uint256)","660c325e":"evPayOut(address,uint256,address,uint256)","660c6813":"crowdsaleStopDate()","660d0d67":"dataStore()","660d5887":"registeredUsers()","660dee82":"addTask(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)","660ef82d":"advisersAllocation()","660f77aa":"CVDToken()","6610a38a":"mountCitadel(address,address)","6610f7a8":"previousBurners(address)","6611611c":"MIN_INVESTEMENT()","6611f5f2":"ZTR_ETH_extra_price()","6612283d":"subdivisionEnabled()","66125b25":"boolFunc(bool,bool)","661309ac":"allowedTransfers(address)","6613221f":"burnLand(uint256)","66134794":"exploreCount()","6613ee9c":"_isSigned(address,address,bytes32,uint8,bytes32,bytes32)","66154885":"getIncomingValueAsEth()","6615827b":"LogEscrowEthReq(uint256)","6615dd83":"setSeedSourceB(address)","6615e357":"setPortfolio(bytes32,bytes32[],uint256[])","66161ed4":"setStopContract(bool)","66167617":"bet_various()","66167663":"subdomainTarget(string,string,string)","66168bd7":"depositTokens(address,uint256)","6616c886":"canSetBanker()","6617e11a":"NiceGuyTax()","66180bc7":"testTransferTwoTokensAndReturnFunds()","66188463":"decreaseApproval(address,uint256)","66188a26":"forwardable(address)","6618b008":"cancelSellOrder(address)","66194d72":"childToken(address,uint256)","661956fb":"depositInvestment()","661990bc":"earlyInvestorWallet()","661aba0d":"setMntpMigrated(address,bool,string)","661ad427":"setOraclizeUrl(string)","661b6dae":"eth2qiuRate()","661b9065":"getRelationWith(address)","661be157":"account_address()","661c866c":"requestNewEtherRealID(string,string,string,bool)","661d3470":"LUXREUM()","661e3605":"ConstructorContract(uint256)","661e5ec2":"getPlayerValues(uint8[],uint8[],uint8[])","661edfee":"rewardFor(address)","6620a935":"sendToOwner()","6620cc3c":"GanNFT()","6620ffd3":"getNumAnimalsXType(uint8)","66210532":"setVestingMasterAddress(address)","6621b7be":"fiatValueMultiplier()","66234c4a":"ReleaseManagerSet(address)","6623fc46":"unfreeze(uint256)","662457c6":"nextProposalID()","6625123b":"COINBIG()","662512f1":"testThrowTranferZeroTokens()","6625b349":"RESERVE_ALLOWANCE()","6626b26d":"off()","66272374":"setWithdrawRate(uint256)","662723bb":"bulkTransfer(uint32[],address[],uint256[])","66273fc6":"bountyTokenSupply()","6627ace5":"getDCommBallotsEnabled(bytes32)","662959cc":"southadvisor()","662a3b81":"getHouseAddressTwo()","662a6137":"developmentTokensWallet()","662a719b":"RewardHalvingTimePeriod()","662ad59b":"pixels()","662bca97":"SetInRate(uint256)","662c6230":"LogResultNoWinner(uint256,uint256,bytes)","662d2ec8":"freeze(address,uint256[],uint8[])","662d5aa9":"EduMetrix()","662da459":"newCostToken(uint256)","662dbe96":"getNodeHeight(bytes)","662de379":"registerAddress(bytes32,address)","662e2536":"cordZ(uint256)","662e3470":"getSectionIndexFromRaw(uint256,uint256)","662e4db0":"c_preICOBonusPercent()","662e4ee4":"changeowner(address)","662f0763":"sendTokenReward(address,uint256)","662f94c0":"approveBlacklistedAddressSpender(address)","662fa2fb":"ProofOfRarePepe()","662fac39":"mining()","662feffc":"addStore(string)","663083f6":"moneyTotal()","663152d1":"phaseOneEnd()","6631ff1d":"grantToken(address,uint256,uint256,uint256,uint256)","6632a507":"testSetupPrecondition()","6633a2bb":"_newPresserFee(uint256)","66341c97":"changelp14(address)","6634cec6":"findProductAndIndexById(uint256)","6634d917":"startEarlyStage2()","66357f57":"descriptionUpdate(string)","6635da25":"Voting(bool)","6635e0ea":"BlocklabTokenV1()","6635e511":"availableForInvestment()","66365082":"dealRevert(uint256)","6636fca8":"retainers(address)","6637324a":"Deploy(address,uint256,uint32,uint256)","6637b882":"setDao(address)","663890b1":"FinalizableCrowdsaleImpl(uint256,uint256,uint256,address)","66389f1f":"OwnerProclaimedDead(address,address,uint256)","6638c087":"createCloneToken(string,uint8,string,uint256,bool)","6638d82f":"freezeTo(address,uint256)","6639016b":"releaseETH()","663960cd":"NewWinner(address,uint8)","6639dc8e":"emissionLimit()","663a0ebb":"tokensAmount()","663a339d":"IsSetReferrer()","663b0534":"disablePayable()","663b3f62":"balancesImporter6()","663b8c5a":"_newTuneOption(uint32,uint32,uint256,bool,bool,uint128,uint64)","663bc990":"test_1()","663c01af":"getAllProductIds()","663c2e30":"claimPrize(bytes4)","663c920a":"redenomiValue()","663cebfc":"VeiagCrowdsale(uint256,uint256,uint256,uint256,address,address,address,address)","663d1e84":"createVotacion(bytes32,bytes32[],uint256[])","663d6612":"defaultOperatorsTranche(bytes32)","663e0f88":"getSpecifiedDecimal()","663e90d9":"setBuyNowListing(bytes32,uint256,bool)","663f2670":"AccountLinked(address,address)","663f70c3":"calculateBounty(uint256)","663f8549":"mintReserved(address,uint256,uint256)","663f9c0d":"loginState(address)","663fc7e0":"highRoller()","663ff5a9":"create(bytes32,address)","6640ca84":"AgreementPen(address)","6641179e":"artistsEditions(address)","66417115":"positionOfJingle(uint256)","6641cc27":"eliminarVotacion(bytes32)","6641cc64":"kycApproved(address)","6641ea08":"ROUND_DURATION()","6642c0bc":"executeExploit(address,address)","66435abf":"getWeight(bytes32)","6643caba":"generousDonation()","6645167d":"YourCrowdSale()","664519bd":"wwamICOcontractAddress()","6645c0dc":"transferVotes(address,uint256)","66476fcc":"flipTokenReward()","66479c08":"payOraclize(uint256)","6648cb52":"setPurchasePeriod(uint256)","66494ab6":"THAW_CYCLE_FUNDER()","6649dfd5":"preCrowdsaleOn()","664a1ad6":"fundWallet()","664abc0f":"packedToEndTime(uint256)","664b3350":"createTransfer(address,uint256,bytes)","664b885e":"AddNewPrestige(uint256,uint256,uint256)","664c7bf7":"ethEurFraction()","664d8629":"withdrawAuctionDklBalance()","664dcb93":"getMHTTotalSupply()","664dd24f":"getUserTransactionIndexes(address)","664e9704":"RATE()","664eb12e":"updateCompanyPrice(uint256,uint256)","664f4904":"sealMinter(bytes32)","66505d1d":"BitcoinisDumb()","665289d2":"adjustPriceAndOwnerOfPlayerDuringPresale(uint256,address,uint256)","66533014":"supportMessage(uint256)","6653be1a":"getGameCardId(uint256)","665502ec":"ContractToken(address,string,string,uint256)","66550624":"CityLifePlusToken()","66552e15":"addVestingForBeneficiaries(address[],uint256[])","6655d7dd":"RedeemTokens(uint256)","6655ff3d":"WebsiteHostingToken()","66566947":"associateWithTeam(bytes32)","66566abd":"multSender(address[],uint256[])","66576514":"mintDRSCoin()","665788f8":"firstCrowdSaleDate()","6657b2c0":"reloadTickets(uint256,uint256)","665814d8":"_presaleStartTimestamp()","6658238c":"Peculium()","665851bb":"wangxihaoToken(address,address)","665905c6":"manuallyResetGame()","665939cc":"setupFundingRate(uint256)","6659889d":"setPromoWallet(address)","66599a40":"setEtherPriceInPoundPences(uint32)","665a11ca":"liquidityPool()","665b0d5b":"_taskError(string)","665b1bc0":"_mint(string,uint256)","665b51ce":"getusedAPI()","665bcc32":"ProcessGames(uint256[],bool)","665beae7":"ExecutableBase(bytes)","665c0b8e":"purchaseMembership(address)","665ca475":"VUToken()","665d8a53":"MAIN_SALE_END_TIME()","665de19b":"mutiSendCoinWithDifferentValue(address,address[],uint256[])","665df460":"sqrt(int256)","665e06ac":"OATToken(address,uint256)","665eba29":"playerForceGameEnd(uint256)","665f09fa":"addCoinAmount(address,uint32)","665f5149":"JOZ()","665fb66a":"YBToken(uint256,string,uint8,string)","66605ba4":"rename(string)","66605c47":"GetBuildingData(uint256)","6660b210":"kMinStake()","6660da77":"addDiscountStruct(bytes32,uint256,uint256[2],uint256[],uint256[],uint256[])","6660ead1":"RANGEEND_11()","66612f66":"MAX_DAILY_COSIGN_SEND()","666192b9":"___upgradeToAndCall(address,bytes)","66625bbd":"revokeContract()","6662e4be":"isWinningBet(uint256)","66634a16":"getAnimalCount()","666375e5":"set_allow_contributions(bool)","6663bbec":"orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)","66648dd3":"setRateIco(uint256)","6665e0fd":"tradeActive(address)","66663d78":"XPAAssets(uint256,address,address,address)","6666490c":"getPlayerSpaceshipBattleLossesById(uint256)","66666aa9":"rewardPool()","6666d22c":"timeBetweenRounds()","66671c30":"FBLFounderFund()","66671c71":"BaseScheduler(address,address)","66675c57":"updateDecimals(uint256)","66679ac7":"interfaceTransfer(address,address,uint256)","6668df7f":"subCoinAllowance(address,address,uint256)","6668ffc6":"isAuditor(address,address)","666923ea":"lastBlock_v15Hash_uint256()","6669749f":"HamzaCoin()","666a3427":"removeOwnership(address)","666afadc":"preparePreContribution(uint256,uint256,uint256)","666b7d32":"disableICO()","666b9132":"PartialCoin()","666be68a":"setIcoTokenSupply(uint256)","666c7ed0":"WIZE()","666cd4bd":"calcId(uint128,address,address,address,address,uint256,uint64,bytes)","666cdaa0":"getAnime(uint256)","666da64f":"claimShare()","666de8d5":"setSecretBonusFactor(uint256)","666e1b39":"owner(address)","666e587d":"fundICO(uint256,uint8)","666efa0a":"walletFees()","666f0354":"getMonthRefferals(address)","666f4cad":"totalWeiWagered()","666f6843":"reservedAddress()","666fc4d4":"minimunEthereumToInvest()","6670bdd8":"getDOwner(bytes32)","66731e95":"LogNewWhitelistUser(address,uint256,uint256)","667336d8":"available_without_bonus()","66734eb0":"MainController(address,address)","66735f4e":"_pickWinner()","667390c7":"SendmoneyTransfer(uint256)","6673ce2b":"Results_of_the_last_round()","6673d5c6":"totalSoldTokenCount()","6674bfaf":"closeOption(address[3],uint256[3])","6676871d":"reserved_funds()","6676aaa2":"MplusCrowdsaleB(address,address)","66772438":"computeResponse(uint16)","6677cef1":"getCrowdsaleManager()","6677febe":"get_all_accepted()","667815a2":"getCanSellBalance()","6678887f":"replacesOldContract()","66792ba1":"send(string)","667a2f58":"createDepositAddress()","667b39b9":"nameOfToken(uint256)","667cb72d":"soldIdeaWeiPreIco()","667d5d22":"wager()","667ec46c":"getCurrentTierStats()","667f1656":"preSaleBotReserve()","667f9510":"getBundinha()","667fc6b9":"IchigoToken()","66801384":"STAGE_2()","6680285a":"AuthorizedCreateToPrivate(address,uint256)","66802a92":"tokenGenerationState()","668038e0":"claimDividends()","66805de5":"closePool()","6680624e":"gasPriceMaximum()","66816e2a":"setBaseStrength(uint256)","6681b9fd":"fundsRaised()","66829b16":"changeToken(address)","6682eaf1":"setsecure(uint256)","6683381b":"setDiscountToken(address,uint256,uint256)","66836acf":"updateBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32)","6683ee49":"BlockPlanet()","6683f9ae":"isSettling(bytes32)","6684ffcd":"burnerSet()","66855dcc":"removeInt256s(bytes32[])","6686e174":"tokensReleasedAmount()","66874cc5":"brokers(address)","66875554":"resumeTokenSale()","66875a31":"FOUNDER_TWO()","668767bd":"transferFromForExchange(address,address,uint256,string)","6688e305":"EIP20(uint256,string,uint8,string)","66894d76":"releaseThreeHotHourTokens(address)","6689e28b":"distribution(uint8,address[],uint256[],uint256[])","668a0f02":"latestRound()","668a2001":"removeParticipant(address)","668a2f67":"boom(address)","668aa824":"oraclePrice()","668abff7":"lastRoundLengthUpdateStartBlock()","668ad45f":"MyToken(uint256,string,uint8,string,string)","668b1b7e":"AOCTrader()","668bd511":"BithelloToken()","668c1a46":"refundBNBContributor()","668c8573":"DATING()","668cc7d8":"registerContest()","668cf93d":"LOSER_LOCK_TIME()","668d5f48":"addBrick(uint256,string,string,uint32,string,bytes32[],uint256)","668e0f6a":"addEntry(string,string,string,string,address)","668e157f":"StandardQuickConverter()","668eef5b":"test_2_method()","668faae8":"CollectibleIndex3()","668fde45":"advSend(address,uint256,bytes)","66901c5b":"clearTimeMap()","66901efb":"getOwnerInfoByIndex(uint256)","66905ba0":"overwrite(string,string)","66907d13":"setNextOrderId(uint80)","6690864e":"setTeamAddress(address)","6690f30b":"set_Name(string)","66914614":"getJackpotTotalValue()","6691461a":"updateTokenAddress(address)","6693b694":"unfreezeSupply()","669459a7":"removeRegistryFromOwnerIndex(address)","66949b56":"endMatch(uint256,int256,int256)","6694e845":"numRewardedAxies(address,bool)","669529df":"removeFromWhitelistMultiple(address[])","669541d6":"setGasCost(uint128)","66957377":"batman()","669585a4":"_figthExecutor(address)","6695b592":"stemPriceInWei()","6695f930":"calculateAndSetRate(uint256)","6696ca51":"forceBurnFrom(address,uint256)","66971c8a":"setCurrentFundingRound(uint256)","66973129":"PHEPToken()","6697aa84":"getRequiredMinor()","6698baaa":"STAGE_TWO_TIME_END()","6698f141":"releaseTeamTokensAfter18Months()","6699d9cd":"Securities_2()","6699e4c7":"isReadyForClose(uint256)","669a55ec":"initialPrizeBov()","669a828b":"getProgramsValue()","669b7e69":"getBlockAddressCount(uint256)","669cab39":"cancelBetByOwner(uint256)","669d8dff":"AddorModifyRig(uint256,uint256,uint256,uint256)","669dafe8":"toWei(uint256)","669e48aa":"get(uint256,uint256)","669e6684":"_rebalanceTree(bytes32)","669eb768":"registerDonation(uint32)","669ee827":"RegisterDevice()","669ef86d":"getPriceByDayIndex(uint256)","669f6d80":"bountyRewardPercent()","66a03098":"receivedFrom(address)","66a0b81e":"safeMode(bytes4,bytes1,address)","66a11615":"revokeMintingManager(address)","66a192c6":"CurrentRate()","66a200ba":"TokenDemo(uint256,string,uint8,string,address,address,address,address)","66a23c01":"ETOKEN2()","66a26419":"cancel(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)","66a39350":"FAIL_FLAG()","66a3de2a":"_safeTransferFrom(address,address,uint256,bytes)","66a4b6c0":"usdDecimals()","66a51d1d":"UcCoinMinimumSellingChanged(uint256,uint256)","66a659b3":"readcolorXteam()","66a65c99":"getLegacyCount()","66a6cf1a":"mateWithAuto(uint256,uint256,uint8,bytes)","66a78b40":"depositAgent(uint256,uint256,string,string,uint256)","66a78e6c":"maxReward()","66a857f4":"ChangeTokenSymbol(address)","66a8c45b":"StarmidFunc()","66a908a5":"foundersTokensUnlockTime()","66a9234c":"addPhase(uint256,uint256,uint256)","66a92cda":"releaseOnce()","66a9bc0d":"teamTokenVesting()","66aa01ca":"permittedAddresses(address)","66aa56c5":"initiate()","66aa6f26":"payFee(bytes)","66aa9aff":"adminDeposit()","66ab4e5f":"Grid(uint256,uint256,uint256)","66ab5290":"transferSgaToSgnHolder(address,uint256)","66ac777e":"rotate_right(uint32,uint32)","66ac8075":"payoutPrizes(address[])","66ad3ffc":"building(uint256)","66ad484c":"newfirst_player(address)","66adeb3a":"SmartToken()","66adeb8c":"transferBalance()","66adf835":"_setup(address,address,uint256,bool)","66adfbbd":"sgc(uint256)","66ae924b":"toUint16Throw()","66ae935f":"balanceEqual(address,uint256,string)","66aecfa7":"bankToCharm(string,uint256)","66aee0fc":"investorsProfit()","66aef95b":"increaseTimeIfBidBeforeEnd()","66af3914":"getTradeIsOpen()","66af77ca":"totalMarks()","66b005ee":"QueryUnlockTime(address)","66b0a536":"MomaCoin()","66b10f70":"learnMove(uint256,uint256)","66b3e4b9":"stageMarketing()","66b3f6bf":"invested(address)","66b3fe66":"setTimeScale(uint256)","66b42dcb":"register(address,string,uint256,string)","66b43da5":"computeSha3(uint256[8])","66b46149":"fstring(string)","66b464de":"goldBoxPrice()","66b4ad74":"KudanilToken()","66b52b93":"addMeByRC()","66b567da":"getNumMyHatchingUnits()","66b5e2d8":"getCountMembers()","66b625d4":"bountiesAllocAddress()","66b62bde":"isSetTeamWallet()","66b668de":"RFUDToken()","66b68516":"Finalized(address,uint256)","66b728d5":"getVoteOptionId(uint256,string)","66b7afbf":"init_level()","66b7d5c6":"receivedWais()","66b847e5":"assertQuantity(uint256)","66ba2670":"setOriginalPriceGen0()","66ba707f":"ConsultaRegistro(string)","66bab099":"getCurrentSupplyVote()","66badf4b":"BITCOINGAM()","66bb28be":"_transferMultiple(address,address[],uint256[])","66bb83b6":"batchlimits()","66bc0d6d":"withdrawFundsAndStartToken()","66bcc860":"TransferSiteReg(address,uint256)","66bd6ff6":"DecentralizedExchangeHotPotato()","66bd78fd":"getBalanceContract()","66be24ba":"blockUntil()","66bea821":"sendSupplyTokens(address,uint256)","66c0276e":"CryptonewsIndonesia(uint256,uint256)","66c0e5e0":"revealPhaseMinSecondsWaitForReveals()","66c14e0a":"dropCount()","66c2355c":"requestNameChange(string,string)","66c2aa0e":"getStackholderTransactionCount(bool,bool)","66c2ae95":"setHgtRates(uint256,uint256,uint256,uint256,uint256,uint256)","66c2d620":"getTot(uint256)","66c2d6a0":"BettingToken()","66c313c6":"ETHER_THRESHOLD()","66c31f12":"emitUserBinded(uint256,address,bool)","66c376a1":"setResult(uint32,int8,int8)","66c42517":"refundToken(bytes8,address,uint256)","66c5c4a0":"unfreezeAll()","66c5cdf8":"updateTotal(uint256)","66c618d4":"sameWhiteList(address,address)","66c630bc":"honourWhitelistEnd()","66c71952":"setDiscountPercent(uint256,uint256)","66c76592":"_raffleDraw()","66c7d1ed":"RozelCoin(uint256,string,string)","66c7fb77":"generateDeed(string,bytes)","66c82de8":"ContributorPool(address,uint256,int256,uint256,int256)","66c89a13":"getAssetEmmiter(uint256)","66c91053":"doubleTransfer(address,address,address,uint256,uint256)","66c99139":"trans(uint256)","66c9bc38":"etherExchangeLikeCoin()","66c9d697":"executeVerdict(bool)","66ca2bc0":"sendSignal(bytes32)","66cab1f3":"isSponsorshipRefunded(address,uint256)","66cc6064":"getPayout(uint256,uint256,uint256)","66cd0663":"setCrowdsaleFinished()","66ce10b7":"publicKeyVerify(uint256,uint256,uint256)","66ce3bd2":"walletBalanceOf(address)","66ce5c52":"minWeiToPurchase()","66cf058a":"endIcoSaleRound2()","66d003ac":"recipient()","66d10688":"getBoughtTicketCount()","66d11c1a":"ContractAddress()","66d12fad":"getStakeInOutcome(bytes32)","66d16cc3":"profit()","66d1cac9":"updatePost(uint256,string,string)","66d29324":"defrosting()","66d2da12":"setUser(address,address,string,string,bytes32,uint256,uint256,uint256[],string,string)","66d38203":"setup(address)","66d39035":"getContribution(bytes32,bytes32)","66d42b3f":"Betting(uint256,uint256)","66d49bab":"updateTotalSupply(uint256)","66d598f0":"E18()","66d5c8ed":"node_left_child(uint256)","66d5eb9b":"openZoneShop(bytes2)","66d76bb2":"rateETH_ROK()","66d7ffde":"left24(uint256)","66d8c463":"reveal(bytes32,string)","66d8d040":"dividendsRightsFixUpdate_(address,address,uint256)","66dacc48":"afterFirstRefundRoundFundsReleaseDenominator()","66db11e7":"nodeExists(bytes32,bytes32)","66db2a59":"competitorPAY(uint256)","66dc860a":"getBreedingFee(uint40,uint40)","66dd3bc0":"terminateAccount()","66de5a4f":"createWorkerPool(string,uint256,uint256,uint256)","66de6fa4":"isReachedLimit()","66de84ec":"withdrawBonus()","66df8fe6":"secondStageTotalSupply()","66e13d36":"stakeForWithLockup(address,address,uint256,bytes)","66e144f9":"Futurescoin()","66e159b8":"CreatedNIMFA(address,uint256)","66e16aff":"mdbToken()","66e1aa99":"assignCertificate(address,string,string,string,string)","66e1cebd":"getStakingGains(uint256)","66e20b51":"crowdsourcers()","66e20e77":"priceNumerator()","66e23276":"ADVISERS_SUPPLY()","66e264be":"p2Of(uint256)","66e305fd":"isEligible(address)","66e34dc6":"registerUsername(bytes32)","66e3c230":"callLibSet2(uint256)","66e3cb68":"upgradedFrom(address)","66e3e5e4":"contractTokenBalance(address)","66e41cb7":"test2()","66e41cd7":"GetTime(uint8)","66e4f8c8":"getLastSpinOutput(address)","66e5cb50":"stopTransfer(uint256)","66e61a31":"outProjectBinding(uint256,address,address)","66e65eb1":"checkLocked(address,uint256)","66e6c8af":"authorise(address)","66e7107e":"SCARABToken()","66e722b0":"SecurityToken(string,string,uint256,uint8,address,uint256,uint256,uint8,address,address,address)","66e72baa":"transferWithLock(address,uint256,uint256,uint32)","66e7ea0f":"incBalance(address,uint256)","66e84652":"resetContribution()","66e8a4d7":"testGetBonus()","66e8cd81":"allBalances(address,address[])","66e98c31":"createCoin(string,uint256,uint256,string,string,address)","66e99a11":"lxhcoin4()","66e9b336":"removeReturnableToken(address)","66eb463f":"changeRootAdmin(address)","66eb50b2":"startLeaderboard(uint64,uint64,uint64)","66eba165":"PlaceBuy(address,address,uint256,uint256,uint256)","66ec60c7":"getFineLevelOfUsername(string)","66ecc9e2":"require_limited_change(uint256)","66eccfbf":"token_batchTransfer(address,address[],uint256[])","66ecded4":"setRelativeAddress(address)","66eec532":"getSellerFullInfo(address)","66f0a3f6":"getTokenRemain()","66f1e438":"getMiniPoolEdit_7()","66f2d859":"setSellRatio(uint256)","66f36b34":"Birth(uint256,string,address,bytes32)","66f3882f":"setIcoPhase(uint256,uint256)","66f3a2b8":"totalPreBuyers()","66f4e1c7":"MAX_GRANTEE_TOKENS_ALLOWED()","66f516fe":"changeTimeAndMax(uint256,uint256)","66f5f332":"Log1_fnc(address,bytes32,uint256,string,string,uint256,bytes1,uint256)","66f7d730":"WithdrawalEnabled()","66f7d9da":"accumulatedHours()","66f83e91":"getRandom(address)","66f84d30":"setParent(uint256,string)","66f8bbe0":"DMarketToken(address,uint256,uint256,uint256,uint256)","66f8e86f":"MLQD()","66f928d3":"updateShareRuleGroup(uint256,uint256,uint256,uint256,uint256)","66f9785a":"EtherShuffle(address[])","66f99a11":"setOpenValueGasLimit(uint256)","66f9c99e":"setUpgradeAddress(address)","66fa2be9":"tickets(bytes4,uint256)","66fa6efb":"unverify(address,address)","66fb3831":"VALUEBACK()","66fbc154":"earlier()","66fc0dd7":"walletTeamAdvisors()","66fc6937":"lastCharge(address)","66fcf285":"distributeMulti(address[],uint256[])","66fd3cd8":"commit(bytes)","66fd555f":"Comission(address,bytes32,uint256)","66fda50b":"removeOracles(uint256,address[])","66fe16e9":"emitIssued(address,uint256)","66fe25a0":"IcoEndDate()","66fe825a":"Gruptecoin()","66ff8201":"GetChipNum(address,uint32)","66ffebb8":"changeHolderPercentage(uint256)","67013719":"enableControl(bool)","67016c14":"issueTokensToBuyer(uint256)","6702416e":"addDoctorTo(address,string,string,string,uint8,uint8,uint8,uint8,uint8,uint8,uint32,uint32)","67025dcf":"transferAll(address,uint256[])","670396e7":"CashToken()","6703c429":"ETCReturn(address,uint256)","67043001":"isEIP20Token()","67043cae":"registerOffChainDonation(address,uint256,uint256,string,bytes32)","67061a55":"teamSharePercent()","67069544":"issueAssetToAddress(bytes32,uint256,string,string,uint8,bool,address)","67069916":"OwnershipTransferCanceled()","670733b5":"setBitwordsWithdrawlAddress(address)","670744cf":"_createCobeFriend(uint256,uint256,uint256,uint256,address)","6707b8aa":"BestEtherSupply()","67080f6e":"testThrowsSetEnforceRevisionsNotOwner()","67084eb3":"houseBalance()","67085633":"getMyGenes()","67085dab":"bnCheck()","6708cc63":"becomeKing()","6708f91d":"Rurchase(address,uint256,uint256)","6709b337":"Token(string,string,uint256,bool,bool,string,string,uint256,uint256,uint256,bool)","670a1e6f":"getEligibleAmount(address,uint256)","670be445":"initialEPXSupply()","670c00d0":"getMotPrice(bytes32)","670c1500":"CoinCool()","670c314e":"TimeFinish()","670c3ac2":"priceUpdateTimeline()","670c884e":"setup(address,uint256,uint256,uint256,address)","670ca672":"NTVToken()","670d14b2":"keys(address)","670da6f8":"getOwnerPetCount(address)","670e2e7f":"DatumGenesisToken()","670e64c8":"setWhitelistingAgent(address,address,bool)","670eedba":"strConcat(string,string,string,string,string,string,string)","670f4bd4":"releaseDivTokens()","670f8755":"_0xZibitToken()","670fe0ff":"TootrTokenSale()","6710e801":"_createRabbit(uint256,uint256,uint256,uint256,uint256,address,uint8)","6712e0be":"tokenGenerationMin()","67130e8c":"getWeiOwed(address)","6713263d":"crowdsaleTokens()","6713640d":"TierStarterDividendAddress(address)","6713e230":"isTrusted(address,address)","67141690":"getEnabledTokensInformation()","67141732":"createContractCity(string)","6714cfe2":"GetLuckyGamblers(uint256)","671528d4":"isCapped()","6716a692":"setDVIP(address)","6718484f":"create(uint256,address,string,string)","67194bee":"AirdropClaim()","67198207":"EARLY_CONTRIBUTION_DURATION()","671baae3":"Sepp(uint256,string,uint8,string)","671bd594":"setBigPrice(uint256)","671bdc3d":"PrimebankCoin(uint256,address)","671c7d68":"test02()","671d3315":"bookAfternoonVisit(uint256)","671d6429":"setTreasurer(address)","671dacdc":"CalculateSqrt(uint256)","671de554":"mintPreICO(address,address,uint256,uint256,uint256)","671e4405":"isFinalize()","671ec66c":"setDomainOwner(bytes32,address)","671fa0a0":"Inscription(string)","6720ceb1":"sendPayment()","6721ebe2":"airdropThroughput()","67220fd7":"adminClaimAirdropMultiple(address[],uint256)","67221df0":"isPendingA(address)","672324ac":"cashInRate()","672350bd":"getFreeExtension(bytes32)","6723c20d":"testTrip(uint256[3])","6723eab5":"batchCreateETHCardAsset(uint8[],uint256[],uint256[],uint256[],address[])","67243482":"airdrop(address[],uint256[])","67249254":"mintWithLock(address,uint256,uint256,uint256)","672566a0":"Upgradeable()","6725bed6":"CCH_RE_2()","67268bbc":"removeTransfer(uint256)","67272999":"claimETH()","672781ed":"priceClaim()","6727cc2d":"removeWhiteListAddress(address[])","67286a83":"getGoldStatusAuditcount(address)","6728b711":"RealAssetToken()","672acef0":"participantCapTier2()","672c8dca":"ownerTakesAllNotClaimedFunds()","672ce152":"HodlBox(uint256)","672d2921":"zasxzasxqaq()","672e06d0":"withdrawForOneYear()","672e20fe":"allocateRemainingTokens(address)","672f412c":"setAllowDisbursePaymentWhenPaused(bool)","672fcd82":"createBet(uint256,bool)","67301dde":"IWWEE()","67316b3f":"addWhiteListAddress(address[])","67337d1a":"ReporterTokenSale()","673441db":"TokenAltPurchase(address,address,uint256,uint256,uint256,string,string)","673448dd":"isApproved(address)","673478c3":"getAssetIdOwnerIndex(uint256)","6735a1cc":"previousStage()","67374f3a":"setTargetWallet(address)","673756d8":"SOFT_CAP_EUR()","6737c877":"setAttributes(bytes)","6738426c":"enablesTransfers()","67387d6b":"testThrowCreateWithNonceExistingNonce()","67389944":"voteB(uint256)","67389d17":"SuppliedTo(address,uint256)","6739afca":"network()","6739f3a4":"getAuctionDuration(uint256)","6739fc52":"testOrd()","673a2a1f":"getPools()","673a456b":"setNumActiveTranscoders(uint256)","673a5ae3":"Sale(address,address,uint256,string,uint8,string,uint256,uint256,uint256,uint256,uint256,uint256)","673a7e28":"updatePrice()","673b57e9":"deauthorizeProvider(address)","673c0e53":"readAllFrzAcc()","673cd98e":"total_amount()","673df0e0":"horseMaster()","673f3807":"sell(uint256,uint8)","673fa8c9":"APaymentToken(uint256)","674106d8":"checkDragon(uint256)","67412045":"balanceOf(address,uint8)","6741629c":"wasEmergencyCancelled()","6741953e":"getPOOL_edit_15()","674197f8":"getBuyRequestCount()","67426ba4":"callgDistributed()","67441f52":"LOOMIA1()","6744ea49":"GetEscrowTokenSymbol()","67457022":"rmul(uint256,uint256)","67460c25":"createWikiPage(string,string,string,uint256)","67460d58":"setGate(uint256,uint16)","67465daf":"StorageExample()","6747830d":"calculateRequiredFillingAmount(uint256)","6747a33f":"accrualDeposits()","6747f09e":"cashOutFallbackAmount()","6748a0c6":"releaseFinalizationDate()","6748a106":"powLimit()","674942eb":"VOTING_PREPARE_TIMESPAN()","6749ec48":"issueLicenseNFT(bytes32)","674a1574":"claimedIdeas(address)","674a62d0":"coinIssuedMkt()","674aaa44":"transferToAnotherAddr(address,address,uint256,bytes32)","674b3bd5":"originalArtwork(bytes32,address)","674c20a1":"test0_firstInterval()","674c5eaf":"setReceiver3(address)","674c85a7":"mdiv(uint128,uint128)","674cc1f5":"getMarketHashes(bytes32[])","674d4691":"_getWeiValueOfTokens(uint256,bool)","674e4e0e":"extendUnlockDate(uint256)","674ea3cb":"closeAgreement(bytes,uint8[2],bytes32[2],bytes32[2])","674ebb3e":"cancelKimAuction(uint256)","674ed066":"minQuorumDivisor()","674ef6c3":"initializeTier(uint256,address)","674f220f":"previousOwner()","6751676f":"recentBuyers(uint256)","6751ad3d":"_insertAttackLog(uint256,uint256,uint16,uint32,uint8,uint32,bool)","67524d62":"setJackpotThreshold(uint256)","67532c8e":"sendPurchase()","67535a42":"setEthmainAddress(address,address)","6753a3c1":"setMajorEvent(string,string,string)","6753fc59":"PurchaseAdmin()","67541efa":"AlfaCoin()","67546967":"EthBtcEscrow()","6754ff3a":"addcrontime(address)","67550a35":"vox()","67551857":"clearAllRequest()","675518b8":"mintAndCreatePreIcoBitex(address,address)","67558b3a":"AzlanToken()","67561d93":"authorizeContract(address)","675629fe":"appendOnly()","6756b1ae":"GameTable()","67571f68":"handlePayouts_(uint256,uint256,uint256,address,address,address)","67578f65":"users(bytes20,uint8)","67579ad4":"currentwealth()","675879d5":"GrantedOrganization(bool)","6759fac0":"CatsToken(address)","675a4633":"dnaMixer()","675a54b9":"getHalvingOf(address)","675a690c":"setBleachDailyLimit(uint256)","675abc96":"corporateSupply()","675ac67a":"escrowCount()","675b09cd":"Niobium()","675c3048":"getTxTimestampPaymentMCW(bytes32)","675cef14":"etherMinimum()","675d43cf":"buyPixel(uint16,uint16,uint24)","675d9c35":"XRT()","675df16f":"updateSubmissionGasPriceLimit(uint256)","675ec1cf":"minimalUSD()","675f6537":"settleBet(bytes32)","675f6d1e":"callBackVariations()","675f818e":"disapproveInvestor(address)","675f9ad9":"initStages()","6760115a":"BuyerFund()","67602c59":"burnSequence()","67608d38":"ICO_TOKEN_SOFT_CAP()","676095b2":"profit2eggs()","67630f43":"buyNapkins()","6763150e":"setKyberAddress(address)","67636574":"consumed()","6763da56":"dish(string,address)","67642794":"_withdraw(address,uint256,bool)","676452f4":"t3tokenExchangeRate()","6764765d":"burnMyTokens(uint256)","67653f3b":"test_threeInvalidEqUint()","6765b49b":"getPunishXPA(address)","67669e29":"rocketIsLaunched(uint256)","6766d1ba":"getTimeUntilStart()","6766fafe":"disableTransferWhitelist()","676796b6":"releaseFounderCoins()","6767e368":"ValueTrader()","67682441":"UserUpdate(address,address)","6768893c":"AppHub()","6769d1f9":"soldToken()","6769eb46":"createMasker()","676a38d7":"get_current_price()","676a675a":"changeJohanNygrensAddress(address)","676aa496":"IbnzEtc20TestToken()","676b064e":"allForPopulate(uint256)","676b57ad":"getNays(uint256)","676c0d77":"updateTokenPrice(uint256)","676c902f":"drawNumbers()","676cb63d":"getMintingFinished()","676cdcd6":"BurnExecuted(uint256,address,uint256)","676cfec6":"rocks(uint256)","676d1d9c":"WEI_TO_COGS()","676d20ba":"WorkerToken(uint256,string,uint8,string)","676d23a5":"isChangePriceLocked()","676d2e62":"migrationMaster()","676d7769":"test_curatorDoesNotVeto()","676e2eb1":"_addDemoc(bytes32,address,address,bool)","676fc32b":"maximumTokensForThird()","67701187":"updateFighter(uint256,uint8,uint8,uint8,uint8,uint32,uint64,uint16,uint64,uint16,uint16)","6770260e":"ContributionMade(address,uint256)","67707337":"CryptocarToken()","6770da62":"_stealCardWithSocialIdentity(uint256,uint256)","67716abc":"learnFee()","677170e1":"_span(address,address)","677342ce":"sqrt(uint256)","6773b75f":"propertyIndexToApproved(uint256)","6774f8e1":"getMonarchyController()","67756fe9":"depositPayment(address)","6776ddd0":"currentHodler()","6776e56a":"validateProposedKingdomName(string)","6777d177":"icostarted()","6777e4eb":"dollarMultiplier()","677885d3":"BITIFEX()","677913e9":"setAmount(int32)","677978ec":"increaseTokenCap(uint256)","6779da43":"setAwardTokens(bool)","677a7444":"Votaciones(bytes32)","677a7735":"Shares(bytes32,bytes8,uint256,uint256)","677a8870":"TeamWallet()","677ab197":"processContribution()","677ab667":"INITIAL_STARTTIME()","677b1f0d":"_buyTokensFromSystem(uint256)","677ba3d3":"onTokenTransfer(address,address,uint256)","677bcb89":"regularMinPerPerson()","677c102d":"getHostOrders(address,address)","677cee54":"SafeConditionalHFTransfer()","677e2dc4":"setDailyPrice(uint256)","677e2ef2":"getReplyFee(uint256)","677e6fa4":"betOnColumn(uint256)","677ebf2c":"InvestmentAsset(address,address,address,string,string,uint256,uint256,uint256,address)","677f768d":"isOnTrading(uint256)","677ffb0d":"exerciseLong(address[2],uint256[8],uint8,bytes32[2])","6780a311":"transferStop()","6780b32e":"moveAccount(bytes32)","67814109":"_mintTimelocked(address,uint256,uint256)","6781cc04":"addPolicy(uint8,uint256[],uint8[])","678212d9":"tokensAuctioned()","67821686":"setETHUSDRate(uint256)","67823a4a":"limitDateCrowdWeek2()","678377d2":"core(address,uint256,address)","67845835":"Irapid()","67845daf":"claimTokensERC777(address,address,address,uint256,uint256,bytes,uint8,bytes32,bytes32)","67848d9c":"PayEther(address,uint256,uint256)","6784b075":"removeValidContract(address)","6784ccb7":"Deceum()","67854643":"getGenerationMemberLength(uint256)","6785744d":"phase1Price()","6785a8f6":"getCandidateIndexArray()","6785b500":"getChannelsAddresses()","67863c07":"earlybird()","6786ed0e":"setPriceRate(uint256)","6787416d":"NRM()","6788317a":"UnitySale(address,bool,uint256,uint256,uint256,uint256,uint256,uint256[])","678886b4":"updateTokens2PerEth(uint256)","678892c0":"rand_num()","67899248":"processKick()","678a1013":"monsterNFT()","678a6baf":"ROUND_3_PRESALE_BONUS()","678a7dca":"setShareFee(uint8)","678ae6a1":"updatePools(bytes32,uint256)","678bbf24":"getEarningsAmountByGoodsIndex(uint256)","678d2204":"shouldFail()","678d6eff":"createFuel(uint256)","678d9758":"setTile(uint256,string,string,uint256)","678dd961":"getProviderClosed(uint256)","678ee795":"ComputationService()","678f4467":"allocateTokenForTeam(address,uint256)","678f7033":"set_percent_reduction(uint256)","679019ba":"freezeDeliverMultiStandalone(address[],uint256[],uint256[],uint256,uint256)","67907404":"recruitNarco(uint256,string,string)","6790d2b5":"getRoomInfo(uint256)","6790f3fe":"getAccumulatedDistributionPercentage()","67923240":"hatchsubscribers(address)","6793c8e1":"currentMilestone(uint256)","6793d383":"registryContractAddress()","67946ea4":"getIdMax()","67955ffa":"maxGIRL()","679577a5":"getEmployerFeedbackOn(address,uint256)","6795dbcd":"getAddress(bytes32,string)","67975213":"AddSWAndClaim(string,string,bytes32,bytes32,bytes32,string,bytes32,bytes32,address,uint32)","6797b106":"strikePricePctX10()","6799c0e0":"vpe_per_Keos()","6799d737":"releaseForEcosystem()","679a7a46":"WhoisOwner()","679aefce":"getRate()","679b4567":"preicoStartDate()","679b948b":"switchSplitBonusValue(address,bool)","679b9935":"setLeagueRosterContractAddress(address,address)","679c0d40":"invariantBroken()","679d0ecb":"getMetForEthResult(uint256)","679d38e0":"selfdestruct()","679dffb4":"getProfit()","679e1149":"AcoraidaMonicaWantsToKnowTheNewAnswerHash(bytes32)","679e5977":"EventRemoveAdmin(address,address)","679ebf1a":"transferTicket(uint256,address)","679f4d63":"CEEDCOIN()","679f699e":"EOSERC20(uint256,string,string)","679fecd6":"refillArray(address[],uint256[])","67a09c23":"payment(address,uint256)","67a0a550":"_cancelOrderWithMerchant(string,address)","67a19b20":"withdrawEthMaker(uint256,address)","67a1b7dd":"addTicket(uint256,uint256,uint256)","67a1bd55":"withdrawStuck()","67a1d653":"YOO_UNIT()","67a1f526":"curatorWrite(uint256,bytes32[])","67a2072c":"setEtherHolder(address)","67a2534b":"test(address[5])","67a26cbc":"DuqueBrewingCompany()","67a27811":"BonusGranted(address,uint256)","67a3eb65":"totalHardCap()","67a449b8":"getLastRoundData()","67a4e7c4":"isDecentBetToken()","67a52fdb":"purchaseGold()","67a59d91":"scheduleCall(address,bytes,bytes,uint256,uint256,uint8)","67a5cd06":"drip(address)","67a6ae62":"TOKEN_RATE_25_PERCENT_BONUS()","67a7390d":"fundTransferred()","67a7804b":"influenceByToken(uint256)","67a884e5":"latestBidder()","67a88f78":"createBitcoinAddressPrefixTask(bytes,uint256,int256,uint256,int256,address)","67a9c971":"tgrSettingsAmount()","67aa23e2":"getTicketsByOwner(address)","67aa50ae":"updateBrokerVerifierContract(address)","67aa863f":"setXto2()","67ab263a":"thisIsTheEnd(address)","67ab4381":"UnConf(string,address)","67ab5486":"GET_MAX_UINT256()","67aba225":"sellableToken()","67acd805":"lowerMinWager(uint256)","67ae9e8f":"hybridizationList(uint256)","67af1c81":"getRoundIndex()","67af1cff":"ethRec(uint256,uint256)","67af26fb":"transferOtherFrom(address,address,address,uint256)","67aff484":"setUserRole(address,uint8,bool)","67aff919":"autoreleaseInterval()","67b07d48":"entangleQuanticCloudIOTData(uint256)","67b0e070":"FaceTech()","67b14a21":"getProposal(uint16,uint16)","67b16407":"buyCup()","67b16cd6":"getRealRndMaxTime(uint256)","67b172c9":"Bloxxor(address,address,address,uint256,uint256,uint256)","67b1f5df":"setExchange(address)","67b21506":"claimTokenReserveDevelop()","67b220a5":"unblock(address)","67b26cab":"getLastMaxInvestments()","67b327fa":"proposeMilestones(bytes)","67b40639":"Dain()","67b50af9":"gasAmount()","67b5496a":"loseWager(uint256)","67b55bf9":"getClickMetadata(uint256)","67b65656":"setStateStartTime(bytes32,uint256)","67b78d00":"fromHexChar(bytes1)","67b7a4aa":"START_PRICE_IN_CENTS()","67b7c034":"on()","67b7d525":"getBlockPointer()","67b830ad":"fillOrder(uint256)","67b886e8":"left97(uint256)","67bb474f":"allowBundling()","67bb6d63":"maxWiteList()","67bc480e":"MYSTERYCLASSICCOIN()","67bd15e3":"contractInitializationTime()","67bd69a6":"getLastDuel2()","67be0854":"partyHash(address,address,address,address)","67be5eac":"claimLeftTokens()","67be97a5":"BYToken()","67bea493":"whitelistedPools(address)","67beaccb":"scheduleCall(bytes)","67bfc445":"AddNewChallenge(uint256,uint256,uint256,uint256,uint256,bool,string)","67c21fe5":"setFiscalVerify(uint256,bytes32)","67c25a14":"TeamCreated(uint256,uint256[])","67c281a9":"validateContentHash(address,uint256,bytes32)","67c2a360":"authorizeUser(address)","67c33c80":"getInt8FromByte(bytes14,uint256)","67c353b3":"LKCTotalSupply()","67c36757":"IranToken()","67c3a6d9":"Khatamor()","67c3ad8e":"burnStake(uint256,address)","67c3e25e":"revokeAccessDeploy(address,address)","67c45872":"ZzStandardToken(uint256,string,uint8,string)","67c51be7":"viewTokensSold()","67c5d6b1":"multihash(bytes32,string)","67c623cf":"getTokenMetaData(uint256)","67c6e39c":"convert(address,uint256)","67c7f3a8":"setBwValidCaller(address)","67c84919":"issueByPartition(bytes32,address,uint256,bytes)","67c9b017":"getEthPrice()","67c9d266":"freezeUntil(address,bool)","67ca1fdf":"market_communityStorageVault()","67ca2298":"updateTokenName(uint256,string)","67cab29d":"testGetAbiVersion()","67cb103a":"PartnerUrl()","67cb61b6":"getChoice()","67cb9316":"get_header(uint256)","67cc4882":"TokenHolder()","67cd3f64":"UNLOCKSTART()","67cd5323":"PUBLIC_SALES_SPECIAL_USERS_RATE()","67cd64dc":"LENDXCOIN()","67cdbe8f":"newShip(uint16,uint256,uint256)","67cdc1c2":"percentageToTeamEthContract()","67ce38fb":"Vertex_Token(uint256,address)","67ce940d":"getOverhead()","67cf17c2":"transferPrimordialTokenFrom(address,address,uint256)","67cf7d9c":"createTeamTokens()","67cf91c9":"lastKickoffDate()","67cfdfc9":"getBrokerIncoming(address)","67d0661d":"doPause()","67d13f27":"receiveFromVendor(address,bytes32)","67d15775":"PromToken()","67d22967":"set_iconiq_pre_kyc_bonus_numerator(uint256)","67d326ef":"finalizeFundAddress(address)","67d3d0ec":"changeEthBalance(address,uint256)","67d3eff4":"setTeamWallet(address,address)","67d41253":"secondCheckpoint()","67d42a8b":"release(bytes32)","67d49909":"secondWinnerTimestamp()","67d4e98c":"RemoveShare(address,uint256,uint256)","67d4f541":"window1TotalSupply()","67d5fae1":"getPremiumCount()","67d6bcbf":"distributeBonusTokens(address)","67d6d142":"getPI_edit_19()","67d96c24":"compensatePreSaleInvestors(address[])","67da2831":"revealHiddenPosition(uint32,int64,bytes16)","67da299b":"mcrAmmountForGas()","67da7b7a":"LabCoin(uint256)","67dbaf93":"updateValueAndBurn(uint256,uint256)","67dbf587":"Bridge(uint256,uint256,address,address)","67dcec06":"WealthInternet(uint256)","67dd1730":"destPrecision(address)","67dd74ca":"buyTicket(uint256)","67dd7bb4":"tradingLocked()","67de698d":"adjustCap()","67de80db":"createMultiple(uint256[],uint256[],uint256[],address[],uint8[])","67de81e8":"fundSucceeded()","67deced2":"checkIn(uint256,string)","67df1187":"buysubscribers()","67df5189":"archiveCrowdsale(uint256)","67dfe2d3":"addEthForSell()","67e04a22":"initInviteAddr(address,uint256)","67e06858":"Add()","67e0badb":"getNum()","67e0d78f":"sendFundHomeAmt(uint256)","67e13ee0":"getDeveloper(address)","67e1aee9":"setStage1()","67e1c253":"getMyInviteCode()","67e22888":"bigMoney()","67e2a647":"createAwardTokens()","67e2d2ad":"wireInvestment(address,uint256,uint256)","67e33df5":"SwftCoin(uint256,string,uint8,string)","67e404ce":"sender()","67e4373f":"CARIToken()","67e445d9":"FOMO()","67e476d7":"getPublicSaleInfo(address)","67e4ac2c":"getAssets()","67e4d41d":"ProdAToken()","67e523bb":"iPeso()","67e53196":"getAuthByCode(string)","67e54367":"battleContractAddress()","67e5f18c":"getCurrentTierRatePercentage()","67e6869d":"Withdraw_4()","67e6bc2e":"hash(string,uint256,uint256,uint256)","67e6bf06":"testPresaleRefund()","67e70e99":"setselfrdroplist(address[])","67e7646f":"removeDelegate(address)","67e817f4":"XOV()","67e828bf":"source()","67e874c0":"testMeta(uint256)","67e8cd0f":"bidOf(bytes32,uint256)","67e8d3d2":"bonus2()","67e8f6e1":"_multipleTransfer(address,address[],uint256[])","67e902c7":"right92(uint256)","67e902d9":"ListingBought(uint256,uint256,uint256,address)","67e933f6":"checkCustomer(address,address)","67e94ae0":"listingFeeInWei()","67e988e7":"bountyAvailabilityTime()","67e9b860":"CreateSwap(uint256,uint256,bool,address)","67ea2fa0":"tasksSize()","67ea43bd":"producedBronzeCaps()","67eae672":"sendCoinFrom(address,uint256,address)","67eb5fbe":"_train(uint256,uint256,uint256,uint256)","67eb9bab":"createIssuerContract(string,string,string,uint256,uint256)","67ec00c0":"depositFrom(string,address,uint256)","67ec68c4":"winningNumbersFor(uint256)","67ecb82d":"transferAndLock(address,uint256,uint256,uint256,uint256)","67eccc12":"founderTokenWithdrawnPhase2()","67ed583f":"addPresaleHolder(address)","67edad0a":"preSaleSecondEtherCap()","67ee5f09":"getTotalDividends()","67eeba0c":"dailyLimit()","67ef5a37":"debugStuff()","67ef5cb9":"setPrice(uint32,uint32)","67efbab1":"changeAssignedAdmin(address,uint256,string)","67f01c04":"ETH(uint256)","67f04688":"LIMIT_TRANSFERS_PERIOD()","67f06f78":"_checkPixelAboveRight(uint256)","67f12ecf":"validate(address,uint256,uint256[101][])","67f17405":"majorEvent(bytes32,bytes,uint256)","67f4224f":"eventPause(bool)","67f690b5":"hasRequestedForMigration()","67f6a258":"verifyCert(bytes32,bytes32,address)","67f718a9":"getTokenIds()","67f76863":"EnishiCoin(address[])","67f809e9":"DynamicPyramid()","67f83481":"isFounderUser()","67f8a8b8":"emergencyRefund(address,uint256)","67f8ca42":"usingCanvasBoundaries()","67f8df84":"playerId(uint256)","67fad28d":"RCLTOKEN(uint256,string,string)","67fbb7ba":"ownerAddSanSlotBatch(address[],uint256[])","67fbd289":"destroyTokens(uint256)","67fc1c6a":"validateProposedMonarchName(string)","67fd9da3":"multicastTransfer(address[],uint256[],uint256[])","67fdc2fe":"CricketToken()","67fdd509":"setIdRange(uint256,uint256)","67fdff26":"REQUIRED()","67fe5a0c":"accepted()","67fe6b47":"contractIsCompleted(string)","67fe6f0e":"checkOverExceed(address)","68019d75":"COCTokenBase(uint256,string,string,uint8)","6801db98":"devoteToCar(string)","6802c8a1":"FreeCoin()","6802ff77":"seedSupply_()","6803641c":"claimAllTokensForInvestor(address)","680478b1":"offerAsSacrifice(address)","68049361":"teamWallet_4()","6805b84b":"getPaused()","680660d4":"bulkAddCompany(address[],uint256[])","6806fdce":"assignGenesisAddresses(address[])","6807b84d":"Timebound(uint256,uint256,bytes32)","6807f752":"deleteBuyRequestInternal(uint256)","680819eb":"setRate(bytes32,uint256)","680a50cb":"shortenDeadline(uint256)","680add7b":"preSoldSharesDistributed()","680b0c5c":"tresholds(uint256)","680b3bdf":"migrateAll(address[])","680b5eba":"setHouseAddressTwo(address)","680b9d49":"getStakedAddresses()","680bd2f4":"RiseCoinToken()","680c26bc":"ATP(address,address)","680caed2":"Contract(address)","680def61":"market2019TokenCreated()","680e354a":"setSaleWindow(uint256,uint256)","680e6c9b":"receiveTokens()","680eba27":"GEN0_CREATION_LIMIT()","680f07b4":"getinitializeFeeWindowIdValue()","680f0938":"pay_dividend(string)","680f0eda":"set_harvest_amount(uint256)","680fb685":"OpenClose(bool)","6810e139":"shopSack()","68111cce":"getProduct(string)","6811444a":"getLastComment(address)","68116177":"getbalance(address)","681185ab":"_extractRawResource(address,uint256,bytes)","68118e95":"numberOfBlocksToEndLimitationPeriod()","6811c332":"distributeTeamTokens(address,uint256)","681232ad":"cosigner()","68125a1b":"isFriend(address)","681312f5":"setRoundLength(uint256)","6813947f":"contributionOf(uint256,address)","681478ab":"LegacyRepToken(address,uint256,address)","68155ec1":"transferTokens(address,address,address,uint256)","6815c19c":"DropdCoin()","6815c992":"grantPermissionP(address,address,bytes32,uint256[])","681617c7":"changeEscapeCaller(address)","68163034":"defaultTimeoutLength()","6816521a":"teamAllocation()","6816d920":"guaranteedBuyersLimit()","6816fcd6":"evMgmtDistributed(address,uint256,uint256,bool)","6817031b":"setVault(address)","68171516":"assetMethodIsAllowed(address,bytes4)","68177733":"MixinToken()","6817c76c":"mintPrice()","681833d9":"bindAddr(address,bytes)","6818da44":"setPlatformManager(address)","68197360":"getVotes(uint256,address)","681b23dd":"senderETH()","681b3314":"get_pre_kyc_iconiq_bonus_numerator()","681b5651":"setEthToUSDRate(uint256)","681b742f":"changeFund(address)","681c2ad0":"getTknOfferPrice(uint256)","681c3251":"addTotalSuply(uint256)","681c7808":"setMinTime(uint40)","681c7e2b":"VAAToken()","681cb449":"VIcoin()","681ce98a":"getNextPrice()","681d52de":"tokenImporter()","681d8345":"getATMTotalSupply()","681e237d":"CommonToken()","681e3356":"transferBankOwnership(address)","681f01f2":"IsICOOver()","681f3e6d":"getUsername()","681f6486":"SimpleBid(address,uint256,uint256)","681f8116":"makeTradeable(uint8)","681fd129":"addInvestContract(address)","681fe70c":"isEmpty()","68203417":"thirdStage()","6820f8d2":"setOneContract(uint256)","68213256":"crr()","68216ca7":"addNewBranchInEpisode(uint256,uint256)","6821928b":"AddAuthority(address)","6822abae":"getMinimumCallCost(uint256)","68234a27":"getTransactionDescription(uint256)","68240412":"calculateWeiForStage(int256)","68250963":"preICODeadline()","682594db":"totalAllowedFreeze()","68259880":"ChangeOfRules(uint256,uint256,address)","6825c843":"_address(uint256)","682677e8":"TunDrMahathirMohammad()","6826ebf8":"r(bytes)","6827b9db":"getMonsterGender()","6827e764":"devFee()","682806a0":"ICOContract()","68281708":"restrict(address)","68283f4d":"claimBets()","6828d549":"rejectContribution(bytes32)","68296073":"setSnowflakeAddress(address,address)","682a5e89":"returnDuration(uint256)","682a90d2":"Store(bool,uint256)","682a9449":"setCustomerService(address,address,bool)","682ab756":"LogItemRegistered(address,uint256,uint256,bytes32,bytes32,bytes32)","682b6706":"___Kill()","682b7100":"deleteRoom(uint256)","682baa3a":"HATCH_COOLDOWN()","682bc77e":"setStarterPackOnSale(bool)","682bea5c":"setCallTable(uint256,uint256)","682d1138":"failExecute()","682d3bb0":"pdfCertificateProof(bytes)","682e1bb0":"isSTOProposed()","682e60a9":"presses()","682ed9ea":"sanMaxAmount()","682f3d36":"OrderMatch(address,int256,address,int256,uint256,uint256)","68302467":"paySeller(uint256)","68306e43":"dividends(address)","6830cdc4":"getJobCount(address)","6831c169":"totalPayedOut()","6831e272":"mintTokens(address,uint256,uint256)","683328bf":"takePet(uint64)","6833716f":"ProofShrimpFarmer(address)","6833d54f":"contains(string)","6833f60d":"triggerPause()","68342b33":"ownerInfoOf(uint256)","683431e2":"SelfDesctruction()","68347fdf":"ICO_MIN_DEPOSIT()","68348dfe":"_newGame(bytes32)","6835df3e":"SFT_PER_ETH_BASE_RATE()","6835f32c":"build(bytes)","68365eb7":"NewProject(address)","683674dc":"disconnectOrderUser(address,address,uint256,address)","683799e6":"setMaximumPurchaseFraction(uint256)","6837ff1e":"newContract(address)","68381874":"Trade(address,uint256,address,uint256,address,address,bytes32)","68381b96":"getHighestUnitPriceIdxFromSell()","68388b80":"banAccounts(address[])","6838e7c5":"PrinzeToken()","68393a4c":"getBonusByTime(uint256)","683a6858":"Recoverable()","683ad727":"getDeed(uint256)","683b4184":"inflation_complete()","683cde49":"upgradeBalanceOf(address)","683cecc2":"addressFunc(address)","683d4a4b":"minWithdrawalCoolingPeriod()","683d69e4":"checkEligibility(bytes32,address,address)","683de015":"switchUpgradable(bool)","683e0bcd":"ethPriceInUsd()","683e2929":"getPSlotLength(address)","683e3451":"CioCoinERC20Token(uint256,string,string,uint256)","683e70b6":"createWhaleTokens(address,uint256)","683f7f27":"removeParticipant(uint256)","68402460":"scheduleCall(address,bytes4,uint256,uint256,uint8,uint256)","68404cd9":"setValueSome(uint256,uint256)","6840721d":"searchReport(string)","6840c67d":"vestPartnerEquityReserve()","6840f8e8":"returnEth(address,uint256)","68412058":"getRank06()","68412063":"distributeTokens(address,uint256,uint64,uint64,bool,bool)","6841f253":"currentRoundLocked()","6841fd27":"remining(uint256)","68428a1b":"saleActive()","68437b58":"bet_purchased(address)","6843aef9":"increaseLockReward(uint256)","68445ce1":"insertNodeBefore(uint256,uint256,address)","68447a55":"fetchFunds()","68447c93":"referrer()","6844ab43":"testControlCreateSameItemId()","68458fcf":"assignInitialAddresses(address[],address)","6845950f":"getScriptActionsCount(bytes)","6846187f":"farmItems(address[],uint256[])","684641b4":"cumulativeInverse(uint256,uint256,uint256)","684649a6":"createProxy()","6846fe64":"_sellCallToClose(uint256,uint256,uint256,uint256,address)","684876a1":"migratePlayerRoundsData(uint256,uint256,uint256,uint256,uint256)","6849cb9d":"transferIssuer(address)","684b369e":"everisumToken()","684b49f5":"PriIcoSale2(address,uint256,uint256,address,address)","684bd9d6":"getRemainCount(address)","684d63bf":"mintAuditApproval()","684d9a04":"quarterSecond()","684e2345":"AishaCoin()","684ecd59":"getData_9()","684edea8":"ponziPriceInWei()","684efc40":"TravelNationCoin(uint256,string,uint8,string)","684f19c9":"WorldCupFactory(uint256)","684fa447":"AppAdded(address,string,address,uint256,bool)","684fbfdb":"sinLimited(int256,int216)","68503cdf":"getAvailableBalanceByAddress(address,address)","68504158":"toggleTransfers(bool)","68507757":"faucetBB0()","6850fa6d":"onoff()","6853367f":"withdrawDevelopersCut()","68533a1d":"closeUndercollaterizedPosition()","68536341":"ratePerOneEther()","6853920e":"removeRole(address,bytes32)","6853e3a4":"setToKnown(address)","685485fb":"eth_sent()","6854df55":"scannedDiamondCaps()","6854f668":"buyDragoOnBehalf(address)","6855ded3":"WHITELIST_END_DATE()","685705ae":"getWeiValue()","68573107":"batchMint(address[],uint256[])","6857ab40":"seq()","6857cb06":"manualTransfer(address,uint256)","68581ebd":"getJobs()","68583bc0":"FC1Token()","68586e57":"setPet(uint8,address,string,uint8,uint16,uint16,uint16)","6859274b":"checkMembership(bytes32,uint64,bytes)","6859d08f":"addToActiveGroup(address)","6859dc10":"rejectRequest(address,uint256)","685a73e0":"claimHodlRewardsFor(address[])","685adf5e":"ALDEToken(uint256,string,uint8,string)","685ae2a9":"itoEndTime()","685b2d8f":"transferPermissions(address)","685b47c7":"updatePresaleNumbers()","685c234a":"checkAuthorization(address,address)","685c60de":"transferERC23(address,uint256,bytes)","685ca194":"withdrawalAllowed(address)","685d1135":"recyclingRemainToken()","685e2486":"migration(address)","685e78fb":"SecondPriceAuction(address,address,address,address,address,uint256,uint256)","685ffd83":"registerNameXname(string,bytes32,bool)","6860dc1f":"isRefAvailable()","6860fd58":"Fees(uint256)","686174ec":"QQQTokenBase()","6861d3b8":"firstStageStartsAt()","68621711":"assetMeta()","68624bd7":"lockedValueOf(address)","68639a29":"setActivation(address)","6863d3c7":"CreatedIRC(address,uint256)","68649c8a":"setTiersInfo(uint8,uint256[],uint256[],uint256[],uint8[3][4])","68654ef8":"bonusBalanceOf(address)","68660b93":"updateDonateTokenAddress(address,uint256)","68664430":"supplyDAICO()","6866537d":"getCardPrice(uint256)","6866566a":"Priced(uint256)","6866da59":"_lockOrUnlockAmount(uint24,uint256,uint256,uint256,uint256,uint256,uint8)","686790e5":"freezeSignatureChecker()","6867edeb":"getBuyOrderPrices()","68690dd0":"NeedRefresh(uint256)","68699224":"offlineAdjust(uint256,uint256)","6869b20e":"saveToken(uint256)","6869fb30":"maxWeiTier0()","686b2812":"addWhitelistUsers(address[])","686b88cd":"calculateWinnerGameType1(uint256,uint256)","686caf04":"lastBlock_a1()","686d2d5c":"getCurrentBonusPct(uint256)","686d5e00":"unRegisterCampaign(uint256)","686da8ab":"UpdateRecord(uint256,address,uint256,bool)","686e2284":"isCosmosSale()","686e8aaa":"GetMoney()","686f21ba":"gainKarma(int256)","686f2c90":"collectAllFees()","686f4564":"redeemedCards()","686fa3f7":"getGameId(address,string,string,uint16,uint64)","68700891":"RLPReaderTest()","6870c65a":"InitialRateChange(uint256,uint256,uint256)","6870ef86":"getCurrentTokenFee()","68715a75":"GCCHToken()","6871819b":"getUserCollegeEducationDetails(string)","6871d26b":"addMeterPoint(int256,address,int256)","6872e300":"COPPER_AMOUNT_SKL()","68742da6":"withdrawFunds(address)","68750bbc":"sendReserveTokens()","6875b6eb":"changeRestrictions()","6875b746":"updateRelease(uint256)","6875c319":"escalateDisputeToMediator(uint256)","687711ec":"s25(bytes1)","6877dca7":"Token1_Transfer(address,address,uint256)","68788868":"decodedAmount()","6878ac7d":"applicableRate()","68794b87":"setState(string)","687981ac":"getValidatorIndex(uint64,address)","687a46c4":"upgradeQualificationByEther(uint256)","687a48a1":"getBurnedCarCount()","687bf382":"_useName(address,bytes32)","687c317c":"setTokensUsedForReinvestment(uint256)","687cc2fd":"preSaleTokensAvailable()","687cde1a":"tokenSelled()","687d493c":"EverOwnedTokens(address)","687d5aa9":"setBuyAllowed(bool)","687db864":"END_ICO_TIMESTAMP()","687e6b5f":"MavenCoin()","687e6f44":"withdrawEthers()","687f8427":"devCATDestination()","68802712":"get_hedge()","688057fc":"registerWalletForFeeSharing(address)","68808769":"backers(address,uint256)","6880ff5b":"secondReserveWallet()","6881385b":"payday()","6881f6f1":"minTradingStartTime()","688225d6":"onemonth()","688257e0":"SmartContractWorkshop(string)","688263d7":"largestPenisOwner()","6882d481":"priceStar4()","68832d14":"___proxyTarget()","6883477f":"canBePurchasedByEMONT(uint16)","688511bb":"timeoutBlock()","688521b4":"coinsIssuedTotal()","6885c572":"allowByDelegate(bytes8,bytes8)","6885edcd":"desiredPrice(uint256)","6885f63b":"TrustToken()","6886bf1c":"mostSent()","6886ce25":"ForkEthereum()","68873375":"CBRToken(uint256,string,string)","6887398d":"getContestTeamCount(uint32)","68879e5f":"RecoverySha3(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","68882b30":"buyCrab(uint256)","68888300":"updateAngelCardSeries(uint8)","68889db8":"setFreezingPeriod(address,bool,uint256)","68894a16":"changeMaxContribution(uint256)","68895979":"getUint256()","6889cf86":"icoOver5()","6889d646":"transferMoneyToOwner()","688a54dc":"ATxAsset()","688a7044":"CryptoRoulette()","688abbf7":"myDividends(bool)","688af37f":"QRL_Token()","688b410f":"sendTokenUpdate(address,uint256)","688b5c2b":"isMiningWarContract()","688ba636":"walletTeam()","688bf035":"calculateUSDcValue(uint256)","688cdba8":"ownerRate()","688cf404":"setAyantDroitEconomique_Compte_4(uint256)","688d3922":"isHardCapReached()","688d54b7":"getLLV_edit_34()","688dcfd7":"setProofType(bytes1)","688def07":"MMOToken()","688e69d8":"ownerPowerUpContract()","688f5ed2":"gracePeriodAfterRound1Target()","688fad5d":"updateIdentitySocialURL(address,bytes32)","68907360":"setRewardsContractHash(address,bytes32)","68915c14":"seedInvestors()","6891656e":"buyWithCustomerId(address,uint256,uint256,uint128,uint256,bool)","68927cd2":"isValidBNBContribution()","68934e54":"approveBurnDelegate(address)","6893cc22":"toUint(bytes32)","6893e8d2":"_setLimits(uint256,uint256)","6893f63f":"getTokensPerEth()","689490a0":"whitelistedAddresses()","68955fb1":"icoPhase()","6895adbb":"_addModule(address,bytes,uint256,uint256)","68963dee":"ICOMinTresholdReached(uint256)","68968564":"SaveYouAndMeToken()","6896a342":"ADVISOR_STAKE_ONE()","6896b999":"xConvertPrioritized(address[],uint256,uint256,bytes32,bytes32,uint256,uint256,uint8,bytes32,bytes32)","6896ef4b":"currentRoundIndex()","6896fabf":"getAccountBalance()","68970ab4":"Created(address,address,uint256,bool,uint256,string)","689786d0":"test_oneValidEqBytes32Message()","6897a1a2":"startingCostToPress()","6897c1b6":"PrepareToStart(string,uint256,uint256,uint256,address,address)","6897e974":"removeWhitelistAdmin(address)","689827b0":"modInverse(int256,int256)","6898730f":"eip20Transfer(address,address,uint256)","6898f148":"beforeSale()","6898f82b":"play(uint256)","68999d76":"exportTank(address,uint32)","6899d8c2":"recoverAll()","6899dac5":"finishVotingTeam(uint256)","689a4608":"Test20()","689a521d":"changeContractState(bool)","689b2d24":"AcceptsElyxr(address)","689b3e2d":"Moonraker(address,address)","689b732c":"FundValue(uint256,uint256,uint256,uint256)","689da08e":"dad()","689dcb02":"Buyin(address,uint256,uint256)","689e87c1":"GIRLBUFFERSIZE()","689effad":"BookingTimeUtils(address)","689f2456":"partial_refund()","689f3f99":"unclaimedPlotPrice()","689ffd82":"addressSalesSupply()","68a1e07f":"_currencyToToken(bytes,bytes)","68a287d8":"getTeamVault(address)","68a29a31":"balanceEthPrivate(address)","68a52509":"getLastOrderId()","68a52851":"setTokensContract(address)","68a596c7":"ownerToTokenIds(address,uint256)","68a59805":"setPayoutDistributionHash(bytes32)","68a67030":"finalizeSale1()","68a6b26b":"setWeiRaisedInPresale(uint256)","68a6e74b":"preICO()","68a72fba":"crowdTarget()","68a7d7ea":"setAgriChainData(address)","68a7e1c4":"setDelegadoDeEscuela(bytes32)","68a7effc":"getOrCreateCurrentFeeWindow()","68a7f6d6":"playerFastFlight(uint256,uint16)","68a8659d":"SellOrdersOf(address,uint256)","68a8c5eb":"WyvernDAOProxy()","68a958bc":"payrollSystem()","68a9674d":"depositFrom(address,address,uint256)","68a9de13":"changeEndtime(uint256)","68a9f31c":"secondOwner()","68aafcd9":"setUsageReportingAddress(address)","68ab3db2":"createDefaultGen0EtherDog(uint256,address,uint256,uint256)","68ab56ca":"get_bounty_count(uint256)","68abf22b":"BAC(uint256)","68acb7b7":"TOTAL_COMMUNITY_ALLOCATION()","68acfcbb":"changeLinkedAddress(address,address)","68ad1412":"registerUser(address,bytes32,address,bytes32,bytes32)","68ad6719":"valueChanged(string,string)","68aee9e8":"wed()","68af1378":"playerGuess(int8)","68af4971":"registerListening()","68afc7c4":"test_rewardPoolShare_isTranscoder()","68b017ec":"sarahtoken()","68b07ebb":"_getMaxAuctionSeconds()","68b0d82e":"TransferredGNS(address,address,uint256)","68b1a6d0":"GetBestWalletAddress(uint8)","68b2cee0":"removeAssetsOwner(address)","68b35396":"gemPerMiner()","68b43f38":"privateLockTime()","68b47d87":"SSOTHEALTH_FUNDS_ADDRESS()","68b49b78":"changeKey(address,address)","68b51ac7":"checkValidSignature(address,bytes)","68b5c351":"tokenTrueUSD()","68b670af":"wmulfloor(uint128,uint128)","68b6d55d":"potSize()","68b85aa5":"maxTimeout()","68b8c5a1":"numberOfAuthorizedPayments()","68b91201":"createInvestorTokenTimeLock(address,uint256,uint256,address)","68ba170c":"isRegisteredTranscoder(address)","68ba745c":"releaseTeamVested()","68bae934":"getAuctionItem(uint256)","68bba4d0":"HARD_CAP_T()","68bd6efa":"getContract(address,address)","68be7887":"getOrganisationByAddress(address)","68be8007":"_updateRegionOwner(address[16],uint256,address)","68be948d":"setRegisteringContractAddress(address)","68bee793":"LevelWhitelistedIICO(uint256,uint256,uint256,uint256,uint256,address,uint256)","68c14a61":"AirdropCentral()","68c197dd":"isWorkerPoolRegistered(address)","68c31649":"checkWithdrawAmount(address,uint256,uint256)","68c49cc9":"collectOtherTokens(address,address)","68c4cac6":"tokensPerEther1()","68c4eb74":"changeInvestorsAddress(address)","68c51f8e":"lhkjTNB()","68c64670":"RapidProfit(address)","68c646f3":"LifeFactor_i()","68c6b11a":"subtract(address,uint256)","68c6f45e":"issuedByStabilityBoard()","68c84260":"addEmployee(address,address[],uint256)","68c92b51":"doCall(address,uint256,bytes4,bytes32[])","68cbce31":"setWinner(uint256,uint256)","68cdafe6":"tokenTransfer(address,uint256)","68cdf759":"getReffAdd(string)","68ce77d0":"grant(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)","68ce90ac":"handlePayment(address,uint256)","68cf5cf8":"setAdvisor(address)","68cff8a9":"notEmpty()","68d06724":"weisSoftCap()","68d12938":"setDonatorReward(uint8,uint256[],uint8)","68d155a0":"remove_participant()","68d317f1":"buildGame(address,string,string,uint256,uint256,uint8,uint8,uint8)","68d324e7":"changeCrowdSale(address)","68d32aed":"getVerifiedHashID(address,bytes32)","68d3fb7b":"initRegister()","68d5a014":"reveal(uint256,uint8[5],bytes32)","68d5cb1a":"purchaseBuilding(uint256,uint256,uint256)","68d64514":"getRemovableIdArrayItems(address,uint256,string,string,string)","68d6a790":"timeOfreservations(address)","68d77366":"Coinlancer()","68d7e4b5":"addDeal(uint256,string,string,uint256,string,bytes32,string)","68d7f8d6":"nextPrice(uint256,uint256)","68d830ae":"get_unlock_time()","68d85d3e":"CloudexchangeCrowdsale(uint256,address)","68d88c25":"serviceRedirect(address,address,uint256)","68d89792":"setCatAttributeValue(uint256,uint256,string)","68d967dd":"changeDoublr(address)","68da480b":"maxWeightBonus()","68da5ee5":"guess(uint256[])","68dae6bb":"RoundClose(uint256,uint8,uint256,bytes32)","68db96a6":"whitelistBonusRate()","68dbc6c1":"fortune_bid(uint256)","68dc3926":"unchanged(address)","68dc9528":"giveTokens(address,uint256)","68dd43f6":"maxNumInterests()","68df0d53":"_removeTokenFromOwnerEnumeration(address,uint256)","68df4dda":"removeWhitelistedTokenAddr(address)","68df5ca4":"testMinReturn0WithoutReturn()","68e03bf9":"setEthEurRate(uint256)","68e114db":"PFG(uint256,string,string,bool)","68e12fa8":"addressCallWithArray(address,address[3])","68e1569a":"parking()","68e1bba4":"eth_ratio()","68e1f526":"WeMediaChainToken()","68e2076a":"Hub()","68e39aac":"proxyWorking()","68e453ed":"totalSaled()","68e47f59":"accept(address,bool)","68e4bd99":"testSetBitSuccess()","68e5a07e":"getExcludes(uint256,uint256)","68e5e22f":"buyAnalysis(address)","68e67402":"RoomPlayersAdd(uint8,address,uint256,uint8)","68e757a0":"create_public_sale_token(address,uint256)","68e76403":"getTotalFeesCollectedCount()","68e7bdba":"disableApi(address)","68e7e309":"_saveVerification(address,address,uint32)","68eb59b0":"startGladiatorWithCoin(uint8,uint8,address)","68ebd450":"bioLock()","68ec8446":"RentartoICO()","68ec9dba":"emptyPendingUserList()","68eca613":"numShareholders()","68ecabcf":"ankcwdsleToken()","68ee137e":"bonusClaimedTokens()","68ef7946":"zazSupply()","68ef8661":"isValidParticipant(bytes32)","68efa030":"Dao1901()","68efb367":"exile(uint8,uint8,uint8,bytes4)","68f04bbb":"openAirDrop()","68f06b29":"redeemable(bytes32)","68f0bcaa":"atomicize(address[],uint256[],uint256[],bytes)","68f15aac":"DMChainToken(string,string,uint8,uint256)","68f16293":"transferCooldown()","68f169e1":"sellCut()","68f269b4":"RATE_ETH_TXK()","68f2ab8e":"Currency(string,string)","68f2c86a":"changeUserPerms(address,bool,bool,bool)","68f2d6e2":"GEN0_MINIMAL_PRICE()","68f319b1":"placeBet(uint8,bool,uint256,uint256,bytes32,uint8,bytes32,bytes32)","68f399f4":"BetSetAnswer(uint256)","68f5aa0f":"setShareholderDB(address)","68f5ccdf":"devFeePaid()","68f5d173":"addAdminister(address)","68f65f02":"ChangeShownDenomination(bool,bool,bool,bool)","68f67330":"finalizedCrowdfunding()","68f6e75f":"percent1()","68f7ef1b":"BLKToken(address)","68f88a26":"getMatchSummarizeInfo(uint256)","68f8957a":"setAyantDroitEconomique_Compte_1(uint256)","68f8fc10":"buyToken(address,uint256)","68f91814":"mainMultisigEther()","68f9dab2":"hash(bytes,bytes,uint256)","68fa8134":"removeAdministrator(address)","68faaa6f":"getTotalSellCount()","68fad504":"burnExtraTokens()","68faecdb":"depositedMYB(address)","68fb81b7":"iCoTokensSold()","68fbbab8":"giveMultipleItemsToMultipleRecipients(address[],uint256[])","68fbd0a8":"TPTSchedules()","68fcb6ee":"purchaseCard(uint256,uint256)","68fd0455":"contractorCancel(bytes16,address,address,uint256,uint256)","68fd22d3":"_addToList(address[],address)","68fe4405":"getBondHolder()","68ff8c4c":"UserList()","68fff456":"blackMask()","69008fb6":"buyTileAuction(uint8,uint256,address)","6900a3ae":"toString(uint256)","6901f668":"validate()","690252c8":"addSshKey(string)","69025b5f":"_addTokenToOwnerEnumeration(address,uint256)","6902a416":"AUMXToken()","69030397":"addLocker(address,address)","69032f15":"cantSetReferrer(address)","69043895":"exOwner(address)","6904c104":"getCampaignValidity(bytes32)","6904c94d":"company()","6904efc5":"BeatTokenIcoPhase3Started()","6904f583":"econVestingStage()","6905877a":"totalOwedForApi(uint256)","69061355":"claimOwnership(uint8,bytes32,bytes32)","6906679b":"getHistory(uint256,uint256)","6906a137":"checkCharger(uint256)","69070772":"MyFreeCoins(uint256,string,uint8,string)","69071418":"poolCLock()","6907baa9":"Campaign(address,address,address)","69081199":"WithdrawFunds(address)","69086c21":"a(bool,bool,bool)","6908d99c":"Extract(address,uint256)","6908ea00":"_checkVotes(uint256,bytes32,bytes32)","6909f5bf":"generateTokenWithAttributes(string,string,string)","690a946b":"getProjectEndDate(uint256)","690b1897":"AragonTokenSale(uint256,uint256,address,address,uint256,uint256,uint8,bytes32)","690c11d5":"getcoursesLenght()","690c5de8":"phase4Cap()","690cf0d1":"preSaleStarted()","690d0b1d":"STARCrowdsale()","690d23be":"getItemAmountOf(uint256,address)","690d3750":"lockBalances()","690d8320":"withdrawETH(address)","690e1d22":"showLockNum(address,address)","690e7c09":"open(uint256)","690eb3f8":"getTicketSumToRound(uint256)","690f2f8e":"_addTokenAddress(address)","690f411b":"VividoTokenTMP()","690f4559":"createPersonalDepositAddressFor(address)","690fa5df":"getPlayerRefById(uint256)","69102190":"checkCount(address)","69111865":"LINDOToken()","69115768":"hasItBeenReleased(uint256)","69129b4f":"StandardToken(uint256,string,string)","6912c8ba":"thirtyPercentWithBonus()","69132d43":"useBalanceOf(address)","69132f72":"SALE2_END()","6913a63c":"addGuard(address)","6913d82d":"adminSetBlock(uint256,uint256)","6914db60":"tokenMetadata(uint256)","6914f40f":"getPI_edit_27()","69161b9e":"addAddressToGrantAccess(address,uint256)","6917fd5e":"BONUS_ICO_PERIOD_ONE()","6919d09a":"Y(uint256,uint256)","6919ff17":"test_insert_findNoHintAtPosition(int256)","691a38ab":"canBeWhitelisted(bytes32)","691a3f64":"buyFrom(address)","691a5842":"totalEtherRaised()","691ae7c9":"setCandyPowerToken(address)","691b7ce0":"transferCMO(address)","691ba73a":"race()","691bf023":"LockTokens(address,uint256,string)","691bfc89":"goods(uint16,uint256)","691c65d4":"mintItem(address)","691c71bd":"endTime2()","691cdb51":"CoinoorCrowdsale(address,address,address,address,address,uint256)","691d58e7":"_applyRefund(uint256)","691d933a":"getDeedByAddress(string,uint256)","691de4a4":"add(string,bytes32)","691e9961":"we_test_token()","691ed382":"THIRD_TIER_SALE_START_TIME()","691edfda":"devAccount()","691f2216":"User_1()","691f3431":"name(bytes32)","691fb8ea":"jumpIn()","692058c2":"dex()","69205dfc":"TUNEZ()","6921278a":"rateFee()","69215eb3":"ethMined()","692193cc":"MarketplaceAccessor(address)","6921af97":"payOutBounty(address,address)","69229b43":"ChangeOwnerContract(address)","6922eb06":"sellPackToAddress(uint16,uint16,address)","692345ee":"elapsedPeriods()","692397a4":"testIssueTokens()","69244c55":"getIcoReward(uint256)","69245009":"cage()","6925ad77":"multiplex_target(address)","6925b015":"contributionBy(address)","6925ebb9":"fluxFeed(uint256,bool)","6926890b":"createSale3()","69269371":"newAmendment(string,uint256,uint256)","6926cc7b":"_canSetReferrer(address,address)","692740b6":"_areStakeAndWithdrawAllowed()","6927bc38":"_isValidSignature(address,bytes)","6927cac5":"trustedSender()","6927e45a":"TOKEN_SHARE_OF_ADVISORS()","6927f800":"Tango1Token()","69288540":"setDEV(address)","6929dd0b":"confirmOrderCompletionByDoctor(bytes16,bool)","692aa97e":"isOpened()","692ad3a9":"round(uint256,uint256,uint256,uint256)","692b3712":"DMINT()","692bf818":"isIntermediary(address)","692cd610":"nextRewardPlayNo()","692d9ee5":"SALE_TOKENS()","692dfe8e":"maxStakeHolders()","692f74aa":"getvehreqdetails(uint256,address)","69306f24":"numberOfCommittees()","69307c80":"rotateBits(bytes,int256)","6930a020":"bruler(uint256)","6930a7e9":"adminMode(bool)","6930c5da":"depositSavings(address,uint32)","6930fd2a":"claimAll(uint256)","693103a0":"addAffiliates(address[],uint256[])","69318a79":"makeComment(string)","6931b550":"claimEthers()","6931e19f":"productPrices(bytes32)","69328dec":"withdraw(address,uint256,address)","6932af36":"proxies(bytes32)","6932c9c5":"getSaleContractDepositAddress(address)","6932cf81":"getName(string)","69335938":"vestedDate()","693382a9":"addToWhiteList(bytes32,address)","693391fe":"createNewUser(address,address,string)","69347990":"ownerWithdrawl()","69358e2e":"getCompanyList()","6935a0d0":"addNewEventToBusiness(uint256,address,string,string,uint256,uint256,uint256,uint256)","6935a290":"OriginsTraceChainToken(address)","69361de3":"I21Token()","69361fe2":"FeeCalculated(uint256,uint256,uint256,uint256,uint256)","693649aa":"mintRewardCore(address,uint256,uint256,uint256,uint256,uint256)","6936c1cf":"XoloChain()","69389cac":"setPlayerForm(uint256,uint8)","6938d9b0":"allocatePresaleTokens(address,uint256,uint256)","6939864b":"lotteryState()","693ac4fb":"getProof(bytes)","693b2b3f":"ticketTransferersAmount(address)","693bd2d0":"cardContract()","693cf8ce":"amountToSeedNextRound(uint256)","693d0141":"retireWildEasy(uint64,uint64,uint64,uint64,uint64,uint64)","693d0df2":"claimFunds(address)","693dde5c":"getAppId()","693e2279":"burntFounder()","693e26dd":"createVirtualEntity()","693ec85e":"get(string)","6940030f":"disableTrade()","69401027":"acceptClockmaker()","694094fd":"M5Token()","69414e7b":"SaveCryptoNetwork()","6941a061":"IdxCoin()","69422924":"hasVotedOnDocumentPoll(uint8,bytes32)","69423429":"getMyDividendAmount()","694244f8":"PreSaleStart()","694278da":"publicKeyYForX(uint256)","69428d97":"OwnableSimple()","6942dc03":"EnvironToken()","6942eac7":"Currency()","6942eff7":"_unverifyAddress(address)","69431ab6":"TokenCreation(uint256,uint256,address,string,string,uint8)","69433e12":"setExchange(uint256)","6943935e":"DPOS()","69443bf4":"CTAuction(address,address)","694463a2":"totalEntrants()","69454b86":"pairs(address,address)","6945c5ea":"setPlatform(address)","6946e33b":"GXVCNoToken(uint256,address)","694702ec":"CommonTokensale(address,address,address,address,uint256,uint256)","694719d8":"MIN_REFUND_RATE_DELIMITER()","69488271":"AllocatePresale(address,uint256)","6949a058":"sendOwnerEther()","6949e1d4":"AngleToken()","6949ed67":"omec(uint256,string,string)","694a813f":"bet1deltaOf(uint256)","694b1727":"addServer(string,uint8,uint256,uint256)","694c00d1":"reclaimBySender(address,address,bytes32)","694c11eb":"buyCore(address,address)","694d3757":"isAuthDisabled(uint256)","694dcecc":"preCrowdsaleStartTime()","694df50a":"freezeAddress(address,bool)","694e0d5b":"StringPasser(uint8[])","694e4277":"payment(uint256,address,uint256,bool)","694e80c3":"changeThreshold(uint256)","694ebe05":"createEscrow(address,uint256,address,uint256)","694f5a08":"_clearTotalNormalTokensByAddress(address)","694f6276":"_approvedFor(address,uint40)","6951b995":"grantCompanyCoins(address,uint256)","695338b9":"ChillIssued()","6953ace4":"finalTokenExchangeRate()","6953ba9a":"nextStarIndexToAssign()","69541be8":"DefaultReverseResolver()","6954abee":"owner_supplied_eth()","69557669":"changeContracts(address,address,address,address,address)","6955c8fc":"getBuyPriceAndPreviousRecord(bytes32)","69569a51":"setFrontend(address)","6956f3d5":"_totalTokens()","69573648":"remove(bytes,bytes)","695741f8":"waitTimeBlocks()","69580f63":"setVendorName(address,bytes32)","6958420b":"arbYes(uint256,address,uint256,string,uint256)","69594cfa":"transactionLog(uint256)","69598efe":"totalPartitions()","69599168":"onEmergencyChanged(bool)","6959d5c7":"getCitationRecord(string,uint256)","695a4cad":"finishTransferFeePayment()","695a7e9d":"CheckAmbientLightException(bytes32,uint32)","695addc9":"newProposal(bytes32,address,uint256,bytes)","695b4700":"transfer_token_from(address,address,uint256)","695c5a26":"getCurrentPhaseCloseTime()","695ca8c8":"Rhodium()","695d027b":"EMoney(uint256,string,string)","695d7297":"updateRewardForDrawing(uint256)","695d7797":"makeWallet(uint256)","695dcfa4":"createContract(bytes32,uint16,bytes32,uint256,uint64,bytes32,uint64,bytes32,uint64,uint64)","695e1341":"UNGT()","695e2a30":"METAXCrowdSale()","695e54c3":"setCountWinnerPlace(uint256)","695ec793":"secondRelease()","695f9db3":"createRocSaleMarkets(uint256,uint256)","69606c61":"CompalTestCoin1(string,string,uint256,uint256)","6960947d":"stockSize()","6960a0ed":"getArtWorkChangeFee(uint256)","69615c0c":"TransferSalPay(address,address,uint256)","69623ae2":"addPlugin(address,address)","6962b010":"freezeEndsAt()","69632f56":"unitAttack(uint256)","69639749":"getMemberRole(address)","6965193f":"_processTransactionFee(address,uint256)","69652fcf":"resign()","69658cf3":"checkMyTokens()","69666811":"collectAllReturnBalance(address)","69671622":"depositToken(address,uint8,uint256,uint256)","69683080":"totalRestrictedAssignments()","6968ce29":"refundNonKYCInvestor()","6969d216":"topLevelDomainOwner(string)","6969d5d8":"appointAdministrator(address)","696a7253":"setConstraint(bytes32,bool,bool)","696b1030":"enableLimit()","696b5fb7":"getAssetID()","696bda86":"submitProposal(uint256,bytes)","696c58c4":"getRefund(address)","696c9c0a":"create(address,uint256,bytes)","696d25fb":"calcVestableToken(address)","696d7ee9":"airdropPrize(address)","696d816a":"endSell()","696df08e":"FULL_TOKEN_WALLET()","696e6a6a":"Octiron()","696e7a85":"listPrycto3()","696ecc55":"trade(uint256,uint16[],uint8,bytes32,bytes32)","696f541c":"getOrg(string)","696f8a95":"CrowdCoinICO(address,address,address)","696fcc7c":"abortTime()","696fd28a":"SBSToken()","696fd68c":"makeTransferable()","697025b6":"transferEnablingDate()","6970402c":"areAllTokensRegistered(address[],address)","69706d9d":"unlockAmounts(uint256)","6970f46b":"BitFwdToken()","69712ffa":"removeTokenLock()","69719706":"Huangdashi(uint256,string,uint8,string)","6971d64c":"func_0AB9()","69732d4b":"ProjectX()","6973a4f8":"backTransfer(address,uint256)","6973cf58":"createEthSiringAuction(uint256,uint256)","6973e6db":"extraDataToNbJurors(bytes)","6974c632":"getItemPriceById(string,uint256)","6975aa9f":"minGoalReached()","69766079":"buyin()","6977083e":"updateStrategyAddress(bytes15,address)","69774c2d":"topup()","69776b1b":"tranchePeriodInDays()","6977aa62":"mintUnreleasedCard(uint8,address)","6977d9de":"addEmployerTotalInvoiced(address,address,uint256)","69793570":"_deleteOperation(bytes32,bool)","697952af":"updateHolder(uint256,bytes32,bytes32,bytes32,bytes32)","697a2902":"HDhundun()","697a3083":"destroyforsecurities(uint256)","697a60b3":"updateContract(string,address)","697aefe2":"certificato(string)","697b139e":"changeGift(uint256)","697c37c5":"cd1(address)","697ca8bf":"getContributorInfo(address,string)","697cca66":"safeRelease()","697d1eaf":"getGroupTeamInvest(uint256,uint256)","697d2e19":"getDisputeTimeoutState(uint256)","697ee181":"DemeterCrowdsaleInstance()","697fa3e6":"forCommand()","697fa43d":"isBatchCeateDrawings()","697fb220":"addLockAddressInternal(address,uint256)","697fc672":"creatorClaimFundTransfer(uint256)","697fd39e":"randomNumberIncome()","6980f4fb":"heroTypeIds(uint16,uint256)","69810d0c":"TOTAL_SHIP()","69815435":"isAbove(uint256,uint256,string)","69817410":"investHappened(address,uint256)","69817dd4":"ProspectorsDevAllocation(address)","6981b5f4":"getLength(string)","6981c879":"updateDate(address)","69820a80":"birthBlock_()","698232fe":"balances1(uint256)","6982c6f4":"tickets100price()","6982f45a":"AutomobileCyberchainToken()","69833668":"allocateEndBlock()","69837721":"accForBounty()","6983f908":"isAllowedToBuyByAddress(address)","69843940":"getValue(bytes32)","6984d4a8":"getBigPromoPercent()","6985a022":"Pause()","6985a1b0":"endInstance(address,address)","6985c57e":"createRare(string,uint256)","6985e46e":"getConflictResolver()","6986ab82":"getNeedLockFundsFromPeriod(uint256,uint256)","6986d405":"elapsedDays()","6988e9cc":"tokenTotalSupply(address)","69898d64":"removeGift(uint256)","698a92fe":"CNKTToken(uint256,string,string)","698afd98":"withdrawFrom(string,address,uint256)","698bdd6f":"ViewtMyBets()","698c1d17":"CoinBX(address)","698d67aa":"registerBarcode(bytes9,bytes3,string,string,bytes19)","698d8a1e":"completeProvision(address,uint32,uint256,uint256)","698edc76":"getLawyer(address)","698f16aa":"pauseTrueUSD()","698f2e84":"setVirtualExchange(address)","698fbe92":"setWhitelisted(address,uint8)","69902ffb":"buyPerUnit(address,uint256)","699084f4":"CNBCoin(uint256,string,uint8,string)","69919447":"sclToken()","6991bad0":"number_of_token()","6991cb13":"EthlanceSponsorWallet()","69921c26":"checkAccount(address)","6993176a":"setMtdAmount(uint256)","69934ee7":"becomeRichest()","6993b507":"getDoublePeriod()","69940d79":"getRewardToken()","6994436e":"Shefo()","699450e8":"student()","699487c2":"getRecordNameToken(bytes32)","69949c77":"getRestricted()","6994a62b":"getRedemptionStatus(bytes32)","6994a7a0":"getPlayerAmount(uint256,uint256,address)","69950bd6":"addNewVendor(address)","69953501":"setUtils(address)","69958ab9":"cancelGame(uint256)","69972e07":"unvouch(bytes32,uint256)","6997545f":"SetParticipantStatus(address)","6997bcab":"totalSpending()","6997d166":"USER_VOTE(uint256,uint256)","6997f429":"MacroProxyContract()","69986073":"mainSaleSuccessfull()","6998a85b":"setTimeToBorn(uint256)","69995128":"updateAccount()","6999579f":"consolationRewardsClaimPercent()","69997696":"updateLoveStoryWithData(bytes16,bytes32,bytes32,string)","69997987":"distributeIQTToken()","6999d38f":"cancelBetByB(uint256)","699a195d":"addEA(string,string,string,uint32,address,address,string)","699a3a7f":"etherSince100()","699abb3c":"setTaxPercentage(uint256)","699ac46f":"mintTransfer(bytes32,uint256,bytes32,address)","699b328a":"randomize()","699be1bb":"lastBlock_v9Hash_uint256()","699c1687":"getProductBuyer(uint256)","699c181e":"currentTokenPerETH()","699c267a":"Jii()","699dc8ff":"proxyMintTokens(address,uint256,bytes32)","699dde66":"SiniCoin(string,uint256,uint8,string)","699ef40c":"updateProfileAboutMe(string)","699f0c72":"getOfferPriceEth(uint256)","699f1fa9":"thisIsFork()","699f200f":"addresses(bytes32)","699ffd88":"get_database_id()","69a0188a":"setHashToFalse(bytes32)","69a046f2":"wadd(uint128,uint128)","69a0b5c0":"isSolved(uint8[9][6])","69a1aa95":"bulkPurchageLand()","69a1b0e2":"claimB1()","69a1bca9":"refundSale()","69a26fb8":"BuyStatus(uint256)","69a300f6":"getRangeID(uint256)","69a3a65a":"HBXToken(address)","69a479e2":"IPETToken()","69a4c408":"AdminSupply()","69a4eda5":"calculatePositionProfit(uint256)","69a56df4":"testNewCounterValueAfterAIncrease()","69a5e902":"multiAccessCall(address,uint256,bytes)","69a683f1":"pollCompleted()","69a68f5f":"setPhase1AccountTokensMax(uint256)","69a69658":"createCoreRequestInternal(address,address[],int256[],string)","69a75868":"firstYearGameMiningTokenCap()","69a8c3bf":"CurrentGameId()","69a9e6b8":"togglePayment(uint256,string)","69aa2c9f":"burnMultNom()","69aaa388":"changeMultiSignatureWallet(address)","69aab7e3":"withdrawNAC(uint256)","69aad305":"getFromBalance(uint256)","69ab0005":"setThreshold(uint256,uint256,uint256)","69ab3404":"withdrawPartialDevelopersCut(uint256)","69ab7895":"get_payment_by_id(uint256,uint256)","69ab8c76":"ADVISORS_MONTHLY()","69ab8e52":"IsICONotStarted()","69ab98dd":"worldCupResultPart4()","69abed8f":"updateReferralBonus(uint256)","69ac5721":"unlockDate()","69ad56de":"_nextFifoStorageKey(uint256)","69add113":"tradeBancor(address[],uint256,uint256,address)","69addb6e":"IssueToken(uint256,address,uint256,uint256)","69ae7757":"registerAntique(bytes32)","69af0634":"cancelAllBuyOrders(address,uint256,uint256)","69b041bb":"swarmFundAddress()","69b0abea":"remainingPurchaseAmount()","69b144eb":"testThrowsCreateNewRevisionNotOwner()","69b29b51":"saleLimitReachedForCurrentStage()","69b31548":"ForwarderDeposited(address,uint256,bytes)","69b41170":"DELAY()","69b492f9":"weisMinInvestment()","69b4a1ef":"NUM_STAGES()","69b59e75":"collectFee(address)","69b5fb58":"setAuthorName(string)","69b6438e":"FUNDS_WALLET()","69b71e06":"unblockFunds(uint256)","69b7215d":"doesProofExist(bytes32)","69b7ca85":"getCaptainInfo(uint256)","69b8f38d":"ICO_PERCENTAGE_2()","69b94cf0":"_transferWithData(bytes32,address,address,address,uint256,bytes,bytes,bool)","69b9b787":"deposit2(address,address)","69b9e96b":"setBuyoutDividendPercentage(uint256)","69ba0fe9":"getStringValues(bytes32)","69ba3c06":"rejectErx20TransactionRequest()","69ba820e":"retrieveWalletForVanity(string)","69baa4ba":"TransferredToken(address,uint256)","69bb4dc2":"availableTokens()","69bba72f":"getAirdropStats(address)","69bc1a55":"testFail_doubleVoting()","69bc513a":"setGGEAddress(address)","69bcdb7d":"getCommitment(uint256)","69bd01c4":"getvalue()","69bd3436":"debatingPeriodInMinutes()","69bd4ec5":"processSellRequest(string,address,uint256,uint256)","69bdd5dd":"appSet()","69bdfd3a":"toContractDie(bytes,bytes,uint256)","69be51bb":"TOKENS_EARLY_BACKERS()","69bee8a1":"getWorkerPoolsCount(address)","69bef517":"balanceOfOnForHolderUpdate(address,uint256)","69c19d4c":"getOutcomeTokenDistribution(address)","69c1a712":"lastHeartbeat()","69c1da7c":"GetManifestoByCategory(string)","69c212f6":"getUserByAddress(address)","69c254b9":"getSSPRegistry()","69c261ed":"setFreelancerCategories(address,address,uint256[])","69c338ff":"SomeContract()","69c4113d":"setNewBudget(uint256,uint256,uint256,uint256)","69c46821":"checkReferrer(address)","69c5c229":"testControlUpdateLatestRevisionNotUpdatable()","69c5f36e":"getTokensForContribution(uint256)","69c63434":"RaffleInternetBook(string,uint256)","69c6a5d2":"derive_sha256(string,uint256)","69c6f18d":"_transferItem(address,address,uint256)","69c74033":"withdrawSnowflakeBalanceFrom(string,address,uint256)","69c7c180":"m_orderCount()","69c7e386":"decreaseICOStartTime(uint256)","69c87817":"minimumWithdraw()","69c89774":"removeWhitelistedTransfer(address[])","69c8b344":"ownedToken(address)","69c8c7ef":"subtrReferralDeposit(address,uint256)","69c92c5a":"removeAddressFromBackend(address)","69ca02dd":"Transfer(address,uint256)","69ca16fa":"eventLogHand()","69cb418a":"RTeamCoin()","69cbb042":"getEncPubkey()","69cbd0fe":"MintableBaseCrowdsale(address)","69ccacd4":"setPercent4(address,uint256)","69cd5df1":"icoTokens(uint256,uint256,uint256)","69cd61be":"lockOwner()","69cdba9a":"approveChangeOwner(uint256)","69cef46c":"uploadData(bytes)","69cf7ac3":"miningToken()","69d01268":"concatUInt(uint256)","69d0292d":"addPresale(address,uint256,uint256)","69d03738":"setNFTAddress(address)","69d0b5e2":"buyInMarket(uint256,uint256)","69d0e33c":"getPlayerPlayedTimes(uint256)","69d0ef84":"callAndFailWithDivisionByZero()","69d196e1":"canAcceptPayment(uint256)","69d19c19":"BDSM()","69d1d1ca":"postGoods(string,uint32,string,uint256)","69d20762":"MassivelymultiplayeronlineVideoGames()","69d24f63":"lifetime()","69d25ff2":"updateCustomFee(uint256,address,address,address,address)","69d29832":"startBonuses()","69d2ce29":"countGames()","69d38ed2":"FINAL_AML_DATE()","69d3b252":"newVox()","69d3e20e":"mint(uint128)","69d4e250":"_safeSubtract(uint256,uint256)","69d4f28e":"officialSold()","69d516b3":"acceptExecutorOwnership()","69d565a9":"closeWithoutCounterparty(bytes32,uint256,address)","69d58d41":"minimumContributionPhase5()","69d5f38a":"setMembershipPrice(uint256)","69d62bf4":"revertTransfer(uint256,uint256,uint256,uint256,uint256,uint256)","69d6b880":"mintAmount1()","69d714c3":"getLargeInvestorApproval(address)","69d77740":"left92(uint256)","69d79ad5":"moneySumAtSettlement(address,uint256,uint256,int256,uint256,uint256)","69d87ab1":"setETHUSDPrice(uint256)","69d89575":"releaseFunds()","69da1b43":"NonceTick(uint256)","69da66ea":"referralPromille()","69dae8b0":"callAndReward_3(string,string,uint256)","69db054c":"userComment(uint256)","69dbe3e1":"StepFunction(uint256,uint256,uint256)","69dceb6a":"getCoinAge(address,address,uint256)","69dd312f":"mintForContributorPool(uint256)","69dd4524":"crowdsaleTransfer(address,uint256)","69ddaad1":"resetQuote()","69dded0e":"validateSet(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","69de374d":"getProposalUint(uint256)","69de4e84":"NimCoin()","69ded293":"reserveBountyRecipient()","69df3671":"friendsWith(address)","69dfae6e":"productTokens(string)","69dfc66e":"TestableStandardSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","69e01731":"setDesignatedReportDisputeDueTimestamp(uint256)","69e01e8d":"dividendsOwing()","69e0e346":"inWhiteList(address)","69e111ba":"needRelease()","69e15404":"feeAmount()","69e1b5ce":"NewStage()","69e22b20":"addRequest(address,string,string,address)","69e24b48":"getCrabStats(uint256)","69e255c9":"removeHorseOWN(uint256)","69e2c927":"canRecvEthDirect()","69e6bcdf":"smartUnBlockAddress(address)","69e6e6c9":"amountOfPopDeveloperShouldMine(uint256)","69e78499":"removeKey(address)","69e795be":"teamTokensCap()","69e7ae85":"ipfsAttributeLookup()","69e82500":"SoundbitToken()","69e8d80f":"ednation()","69e91994":"getReturnValue(uint256)","69e936f0":"isMultiply()","69e9ca8a":"calculatePayoutForAddress(address)","69ea1771":"updateRate(uint256)","69ea80d5":"HEIGHT()","69eac83a":"_emitOracleAdded(bytes4,address)","69eadd76":"canAcceptTokens_()","69eb6d32":"Annihilated(address,uint256,uint256)","69ebb7e9":"getCurrentRound(uint128)","69ecc3cf":"invalidate(bytes32)","69ed1b83":"callSomeFunctionViaInner2()","69ed87b0":"FeesCalculated(uint256,uint256)","69ed8a42":"LRKToken(uint256,uint256)","69edd4fe":"callElection(uint256)","69efe2bf":"stageAdmin()","69efe471":"transferLimits(address)","69f08449":"m_sale()","69f0a549":"mintOther(address,uint256)","69f10ce1":"issueRIU(address,uint256)","69f1256f":"createTokensFromEther()","69f173dc":"waveCap4()","69f18967":"testSetBitFailIndexOOB()","69f18b8c":"ROB()","69f30401":"bid(address,uint256[],uint256[])","69f3331d":"nextOwner()","69f35883":"updateBloomFilter(bytes,address,bytes32[])","69f3c66e":"Movieum()","69f40ebc":"forwardInvestorTransaction(address,bytes)","69f467c1":"unicorns(uint256)","69f4aefc":"LATPTransaction(uint256,uint256,uint256)","69f66950":"holderBountyTokens()","69f6b766":"getSumInByLottery(uint32)","69f80b4a":"addAddress(address,address,uint256,address)","69f80c7a":"additionPrice()","69f8408a":"MigratableToken()","69f8ef0c":"flushETH()","69f94209":"NewDrawReadyToPlay(uint256,bytes32,uint256,uint256)","69f95967":"vminEtherPerPurchase()","69f99001":"hashDataBlock(string)","69f9ad2f":"char(bytes1)","69fa2cae":"createMintableSale(uint256,uint256,uint256)","69fbad65":"_depositOldTokens(address,uint256,address)","69fbae6c":"_sendToTeam(uint256)","69fbfcc4":"upgradeStructure(uint256)","69fc3481":"fundsRaisedFinalized()","69fc551a":"create(address,uint256,string)","69fcbf70":"setPreSaleAmounts()","69fd75b1":"GUPToken(address,uint256)","69fe0e2d":"setFee(uint256)","69ff2d11":"TOT()","69ffa08a":"claimTokens(address,address)","69ffadc9":"TDz(uint256,string,uint8,string)","6a00da87":"sellBuyerTokens(uint256)","6a011ae5":"minRandomPrivilegeValue()","6a018302":"mul2Revert(uint256)","6a01b6e6":"createToken(uint256,uint256,uint256,uint256,uint8,uint256,address)","6a01f09c":"swapLimit()","6a02209c":"getMaxParticipants()","6a028692":"totalAvailableEdition(uint256)","6a0323b2":"MusiconomiToken()","6a0324b0":"_getBool(address,bytes32)","6a032a3b":"isTimelocked(address,address)","6a032a73":"generateTokensManually(uint256,address)","6a03eaf9":"finalizeTime()","6a048ddb":"createContractChar(string,uint256)","6a049b62":"_buyMulti(address,bytes32)","6a054250":"update(uint256,uint256,uint256)","6a0665a4":"calculateGoldSell(uint256)","6a06bf92":"enjinTeamAllocation()","6a07089f":"Contents()","6a08b403":"setFine(uint16)","6a092e79":"transferTokens(address,address)","6a0a1f8e":"claimGrant(uint256)","6a0ac115":"libpow2(address,uint256)","6a0b50e4":"pickFood(uint256,string,string,uint256)","6a0b96b7":"IkuraTransferFee(address,address,address,uint256)","6a0c3809":"likeArtist(address)","6a0c5068":"getParticipantesA()","6a0c5723":"getHasVoted(uint256,address)","6a0c8730":"getTransactionPrice()","6a0cd52e":"admin_commission_activated()","6a0d017c":"inviteReferee(address,address)","6a0d3450":"sentTokensToFounders()","6a0d783c":"Crowdsale(string,uint256,uint256,uint256,uint256,uint256,uint256,address,address)","6a0e605f":"MyToken(uint256,string,uint8,string,address)","6a0e7c24":"teamVesting(address[],uint256[])","6a0f7b7c":"getProductContractClients(address)","6a0fd45c":"getMeter(string)","6a100f37":"startAuctionFee()","6a10ad64":"tokenAllocToCrowdsale()","6a10c71c":"secondsLeft(address)","6a10d4d6":"createToken(address,uint256)","6a11138c":"doRandom(uint64)","6a12209c":"setRequestLimit(uint256)","6a12b86c":"continueGeneration()","6a1353c9":"setMintPayoutThreshold(uint256)","6a13af72":"giveRiskToken(address,uint256)","6a140b27":"_transferToContract(address,address,uint256,bytes)","6a142015":"assignGenesisCallerAddress(address)","6a146024":"WAD()","6a14d131":"creatorsCreatedCount()","6a15a080":"distribute_NRT(uint256)","6a16ae40":"wct2()","6a172536":"firstPreSaleDate1()","6a1729aa":"paymentAffiliate(address)","6a19b647":"addSuperPlayer(address,bytes32,uint8)","6a1af8b8":"setHeroData(uint256,uint16,uint16,uint32,uint32,uint32,uint64,uint64)","6a1b52e1":"expirationCheck()","6a1be7c6":"approveCollateral(address,uint256)","6a1bf209":"setCCH_edit_8(string)","6a1c3a4c":"getLastAPPeriod()","6a1c6fc0":"costs(string,uint256)","6a1cd82c":"crowdsaleRaised()","6a1d8713":"setMaxReferrals(uint256)","6a1db1bf":"changeFee(uint256)","6a1dbf03":"getTokenMinted()","6a1eb83f":"MeDao(address,address,address,address,address,uint256)","6a1ecbbf":"maxHopefulsNumber()","6a1f9e19":"breakIt()","6a206137":"cancelOrder(address,uint256)","6a2129d6":"delegateRecordExists()","6a21857f":"manualSend(address,bytes5)","6a221688":"TokenSaleQueue(address,address,address,address,uint256,uint256,uint256)","6a226077":"bidOnBreedingAuction(uint256,uint256)","6a226a49":"addMessage(string)","6a22b09a":"lastAssigned()","6a23b9df":"sumICOStage2()","6a23e308":"getIncubatorHashing(address,uint8,uint256)","6a23e7cf":"setFeeDistributionAndStatusThreshold(uint8,uint8[5],uint256)","6a24d595":"ModifyVigencia(uint256)","6a25000c":"token_per_wei()","6a254198":"ClaimTokensEvent(address,uint256,uint256,uint256,uint256)","6a256b29":"settle(address)","6a261353":"Lesson_5(address,uint256)","6a263f02":"_sqrt(uint256)","6a26b7fe":"setClaimableToken(address)","6a272462":"sell(address,uint256,uint256)","6a27c41d":"revealVote(address,bytes32,bytes32,address,uint256,uint256)","6a280317":"isAuctionManager(address)","6a2875c1":"incrementDIDFromContributions(address,uint256)","6a28db13":"getQrLength()","6a28f000":"unfreeze()","6a28f828":"issueIndex()","6a29150e":"totalFundsWithdrawn()","6a293d04":"setAlias(string)","6a294a80":"maxActivatedSalesTotalCount()","6a29605f":"BOHUpgradeableToken(address)","6a2a4c06":"get_released_by_manager()","6a2a6657":"validateToken(address,uint256,uint256,uint256)","6a2aac2b":"flowerBalances(address)","6a2ab790":"PRIVATE_STAGE_MAX_CAP()","6a2b171a":"applyDiscount(address,uint256)","6a2b5656":"changeTransactionFeeRecipient(address)","6a2b9e9d":"ERC20WithMetadata(string)","6a2c1ace":"getStateHash(bytes,uint256)","6a2d1cb8":"MIN_INVEST_ETHER()","6a2d5028":"getRaisedAmountOnToken(address)","6a2dda87":"SettingAutoGame_BettingRankRange(uint256,uint256,uint256)","6a2ddfce":"dragonsStatsContract()","6a2e882b":"getBlockLimit()","6a2f78a6":"submitStakeholderTransaction(address,bool)","6a2f9536":"calculateFraction(uint256,uint256,uint256)","6a30eb24":"hogsmashToken()","6a310bac":"bizp()","6a327b7d":"getSupportManager()","6a33440a":"MANHATTANPROXY12THAVE()","6a3350c8":"invalidAirDrop(address)","6a33803b":"mintSaleTokens(uint256)","6a343df3":"allowPrice()","6a34480b":"MAX_INVESTORS()","6a357465":"payHours(address,uint256)","6a368486":"Ethraffle()","6a369137":"AfterSaleTransferableTime()","6a3845fe":"artTokenoken()","6a385043":"approveTokenTo(uint256,address)","6a385ae9":"getBalances(address,address[])","6a38c0fa":"DragonLock()","6a3a2119":"injectEther()","6a3b5aea":"setC4FContractProviderLock(address,bool)","6a3baaea":"newForge(bytes32,bytes32,address)","6a3bb8cc":"setFiscal(uint256,bytes32)","6a3c1198":"_projectCancelNew()","6a3c167b":"setInitialize(bool)","6a3c62a7":"beginReclaim()","6a3c7945":"RequestUpdated(uint256)","6a3d2a15":"AdvisorsAmount()","6a3d42ef":"ANT(address)","6a3d5a07":"AuctionCancelled(uint256,address,uint256)","6a3f3b97":"HolderBase(uint256)","6a3f5146":"auctionExpired()","6a3f79f4":"RaffleIssued(uint256,uint256,uint256)","6a3f89f4":"setProofImpl(address)","6a40515a":"enhancer()","6a40dbd6":"mintInvestor(address,uint256)","6a4113c7":"releaseLockFounders2()","6a41ade3":"walletCoreTeam()","6a420614":"setFreeCount(uint256)","6a420bbc":"setHaltPurchase(bool)","6a42b8f8":"delay()","6a4349a9":"getMicroModulesIds()","6a43aae7":"removeName(string)","6a43dc9a":"totalSupplyByLegacy()","6a4509f0":"paymentMax()","6a457ee9":"allocatedBonus()","6a470988":"getkEthPhiRate()","6a474002":"withdrawDividend()","6a47aa06":"halvingInterval()","6a48c04d":"GenExtWeightList(uint256,uint256,uint256)","6a4967d6":"addToWhitelist(address,uint256,uint8,uint8)","6a4987dc":"MARKETING_POOL_ADDR()","6a4a39e9":"presaleEndsAt()","6a4a6b6e":"_myAddressHelper()","6a4ad948":"setConvertionFee(uint256)","6a4aef9d":"fromReal(int256)","6a4b1b10":"setPresidenteDeMesaVerify(bytes32)","6a4b22da":"changeFallbackAccount(address)","6a4b27f4":"getRenter(address)","6a4b3eca":"checkBankBalance()","6a4b6aa5":"untrustedChildWithdraw()","6a4b8a3d":"BoxxToken()","6a4b96d5":"PledgePayed(uint256)","6a4c62ef":"getSecondUnionIds(bytes32)","6a4d4bb8":"getInvestorPosition(uint256)","6a4f5495":"test_0_ensureServiceRegistryFunctions()","6a4fcddb":"Remyt()","6a502578":"totalSoldOnPresale()","6a50e3df":"PayWinners(address,address,address)","6a514db7":"REOToken()","6a51b918":"cities(uint256)","6a523c5e":"depositForUser(address)","6a5371b8":"nextTier()","6a537e40":"getCollectiblePrice(uint256,uint256)","6a5392d7":"generatedGze()","6a53ab64":"undestroyable()","6a53f98a":"pendingTxs(uint256)","6a54932c":"processTransaction(address,uint256)","6a561c11":"ownerResumeGame()","6a561cb8":"testSender()","6a5690f6":"ICO_GOAL()","6a56a48b":"_getRandomMineralId()","6a570b98":"InGRedientToken()","6a585fa3":"tokensPerWei20()","6a596455":"getBatlordReq()","6a59d0a4":"transferAndLockForever(address,uint256)","6a59dc8c":"_unpackAgilityValue(uint256)","6a5a3625":"getTotalReqAmt(uint256[],uint256[])","6a5b0151":"setGasForKWH(uint256)","6a5b459c":"receivedWeiMin()","6a5bbc1d":"withdrawToOwner(uint256)","6a5c2cf2":"getTotalDividendsByAddress(address)","6a5c44a9":"STTadmin1()","6a5cf2d0":"WifiBonusCoin()","6a5d7206":"doSafeSendWData(address,bytes,uint256)","6a5da6e5":"followCampaign(uint256)","6a5e2650":"unlocked()","6a5fd362":"shitFund()","6a61e5fc":"setTokenPrice(uint256)","6a625bc8":"issueToMany(address[],uint256[])","6a627842":"mint(address)","6a62936b":"PLUTUSTOKEN()","6a630559":"tokenLocked()","6a630ee7":"__transferWithReference(address,uint256,string,address)","6a63606c":"set_tokens_total(uint256)","6a63d2f9":"getLastestRequestFundID()","6a643ce6":"setBB(bytes32,bytes)","6a64790c":"toWholeShareUnit(uint256)","6a666c86":"addressToPunkIndex()","6a66a693":"beneficiaryContract()","6a67acc5":"getAuctionData()","6a67ec63":"minimum_buy_value()","6a68d2d5":"nextGamePotSplit()","6a69424b":"PaymentTimer()","6a6ae271":"assertPause()","6a6b8077":"StartICO()","6a6ba5d7":"addressIsCrowdsale(address,address)","6a6c526e":"AcceptsLYNIA(address)","6a6d31db":"externalEnter()","6a6e79bb":"WithdrawPaymentForTest(address,uint256)","6a6e88ba":"getBuyerInfoAt(uint256)","6a6f03a0":"returntrueifcurrentplayerwinsround()","6a704d7b":"AddedToGeneration(address,uint256)","6a7149f6":"changeAgency(address)","6a71a584":"getFreeAllowance()","6a71df43":"amountOfTokensPoolB()","6a7245ef":"changeBurnBoundsOperation()","6a7254a3":"specUWallet()","6a7283ac":"buyTokenFromGame(address,address,address)","6a7301b8":"setDestroyer(address)","6a7360d8":"updateNav(uint256)","6a7381bd":"TokensBought(address,uint256,uint256,uint256,uint256,uint256)","6a739a9b":"getTokensUnlockedPercentage()","6a739c44":"checkRegistrationStatus(address)","6a73de2c":"ZZZToken(uint256,string,uint8,string)","6a745ce9":"PRESALE_ETH_RAISE()","6a748ecf":"upLimit()","6a749986":"issuePreferedTokens(uint256,uint256)","6a751710":"transferTraderBalance(address,address)","6a75f03d":"partnersAddress()","6a75fac0":"pullBack(address)","6a7625ca":"setRegionForSale(uint256,uint256,uint256)","6a76c522":"totalContractMiniGame()","6a7798ee":"EndAuction()","6a77e17a":"initialSeedFarmingAdress()","6a785191":"referralTokens(address,uint256)","6a7882f2":"requiredGoldIncreaseFactor()","6a7a88aa":"isValidSignature(address,address,bytes)","6a7b28a2":"show_the_minimum__reward_period()","6a7b988c":"votePopularity(bytes32)","6a7bf76a":"create_game(bytes32,uint32,uint32,uint8,uint16,uint8,address,uint256,bool)","6a7c09a0":"rewardPrivate()","6a7c0bae":"OWN_burnAddress(address,uint256)","6a7c0e81":"setBatchLimit(uint32)","6a7c4cdf":"H2G2()","6a7c594e":"CTVToken(uint256,string,uint8,string)","6a7d1a7e":"getPlayersUnitTickets(address)","6a7d3c1c":"FishbankChests(address)","6a7d6b52":"updateOldOwnerProfit(uint256)","6a7dabb9":"DEVCLASS_MAX_CARGO()","6a7eaf8f":"vestingRules()","6a7f42e4":"closeBetByCanceling(uint256)","6a7fc8b7":"setDailyWithdrawLimit(uint128)","6a8141a1":"ParrotCoin()","6a816548":"cancelOrder()","6a81af17":"setConfigClass(uint32,uint8,uint8,uint8,uint32)","6a822760":"betB()","6a8269b4":"frozenList(address)","6a8296d7":"_setPrizePoolAddress(address)","6a833a6c":"addDelegateSigned(address,uint8,bytes32,bytes32,string,address,uint256)","6a83662e":"getYESVotesByEntity(uint256)","6a83b924":"btycownerof()","6a84e143":"destroyUnsoldTokens()","6a85ac88":"answerCompare(uint256,bytes32)","6a85d12e":"changeOuts(address)","6a85e252":"ElementTransferred(uint256,uint256,uint256,address,uint256,uint256,uint256)","6a868363":"CreatedVUP(address,uint256)","6a86a0f0":"DCCAdvancedToken(uint256,string,string)","6a871e27":"airDropHeight()","6a87f66d":"specialManagerOff(address)","6a8896b6":"getPots()","6a893a8c":"stopWorkInternal()","6a897999":"drainStack(bytes32,bytes32)","6a89a51e":"_delete_()","6a8aa343":"m_maxTotalSupply()","6a8ae136":"getContractBalance(address,address)","6a8b9f7b":"BecomeSpiderQueen()","6a8ba0fa":"createPromoPet(uint256,address,uint256,uint256,uint256,uint256)","6a8be019":"cancelEscrow(uint256,uint256,address,uint256)","6a8c2437":"totalRescues()","6a8c9cce":"BITMUZE()","6a8cdb52":"setBondAddress(address)","6a8d0bf4":"ReceiverChanged(uint256,address,address)","6a8d3575":"UniversalToken(uint256,uint256,uint256)","6a8d7eb3":"isLSNFT()","6a8d86db":"rawTransfer(address,address,uint256)","6a8e8711":"max_bet()","6a8ef2d3":"getMyShitClone()","6a8f91ff":"createAccount(bytes32,bytes32,address,address)","6a907a78":"UserAddTicket(bytes5[])","6a90ac63":"unlockWithdrawals(uint256)","6a91205a":"rentLand(uint256,bool,uint256)","6a91431e":"RefundableCrowdsale(uint256,uint256)","6a914911":"getPlayerByBoard(bytes32,uint8)","6a92a8b8":"UserAddressLoaded(bytes32,string)","6a92fcf6":"paymentEnable()","6a931aa8":"tokenVendor2()","6a93316c":"getInvestorStatus(address)","6a938567":"isValid(bytes32)","6a9412bd":"refundAvailable(address)","6a95dff4":"NOBSToken()","6a96c63e":"getCreateUnicornFullPrice()","6a98085a":"totalAmountToWhale()","6a9812f9":"getPolicyByTaxCode(string,uint256)","6a993130":"Ownables()","6a9b4daf":"Etros()","6a9b515d":"TokenAuctionCreated(uint256,address,uint256)","6a9ba3ce":"maxCapNotReached()","6a9c97d6":"refundSender(address,uint256)","6a9cd450":"upgradeKernel(address)","6a9d02e9":"tokenFrozenSinceNotice()","6a9d2afd":"playToWinTest(uint256)","6a9d69a7":"rentalTotalTime()","6a9d7629":"getOpenInterestInAttoEth()","6a9db57a":"playerAmountOfBets(address)","6a9dc9a8":"enrollUser(address)","6a9e8480":"FinalLottery(address)","6a9e8f27":"stockTransfer(address,uint256,uint256)","6a9ecd21":"BidFailedEvent(address,uint256,string)","6aa084d7":"getBoardStatus(uint256)","6aa0fd32":"performRebalance(bool,address,uint256,bool,uint256,uint256,address,bytes)","6aa179d9":"_secondRoundLosersFight()","6aa3141f":"removeCustody(address,uint256)","6aa31b1f":"starSell()","6aa3bf8b":"finishBetFrom(address)","6aa3e64d":"emptyTo(address)","6aa4b3cc":"calculateId(address,bytes32)","6aa52288":"FisrtSupply(address,uint256)","6aa5b37f":"maxBuyLimit()","6aa5cdfa":"setLatestEdition(uint8)","6aa633b6":"isEnabled()","6aa66cd4":"targetDiscountValue10()","6aa68a15":"phase2EndBlock()","6aa737e0":"enableSellToken()","6aa8e220":"WeaponRegistry()","6aa96d7c":"Storychain()","6aa9c59b":"_addMinions(uint32,uint8,uint64)","6aa9c82b":"withdrawControl()","6aaaae68":"tokensForFoundersAndTeam()","6aaab6f2":"updateTreasury(address,uint256)","6aaacb3f":"CreateCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint256)","6aab223d":"bonusMatchPayoutInPercent()","6aaba012":"ErrorGenerator()","6aabd369":"verifyGame(uint256,bool)","6aad1a6b":"adminSetGasLimit(uint256)","6aad70b6":"getAddTokenSignatures()","6aaee3f7":"biAdvance(uint32,uint64[2],uint64[2],int64[2],uint64)","6aaf0a0d":"endRegisterTime()","6aafb887":"getNewMaxProfit(uint256,uint256)","6aafd194":"Fosha(uint256,uint256,uint256,uint256,uint256)","6ab03a7f":"OGPToken()","6ab09a5e":"listUsersBets()","6ab15436":"price(bool)","6ab22536":"SMEToken(uint256,uint256,uint256,uint256)","6ab28bc8":"lockedAmount()","6ab368f8":"Burned(address,address,uint256)","6ab3846b":"updateEndTime(uint256)","6ab3c5bd":"KING_WIN_MULTIPLE_PER()","6ab4936d":"presaleFail()","6ab5bcd0":"withdrawedTokens()","6ab71276":"getOwners(address,uint256)","6ab76510":"bulkTransferFrom(uint32[],address,address[],uint256[])","6ab872f0":"setMaxBetThresholdPct(uint256)","6ab8bd2b":"POOH_TO_CALL_1PLUMBER()","6ab92ba7":"PEPL()","6ab9aa21":"MAX_REVENUE()","6ab9eb45":"getItemAllowancePrice(uint256,address,address)","6aba2a0d":"donatorBonus(uint256)","6aba899b":"refundStartTime()","6abac115":"getActiveState()","6abacfa4":"etherMasterWallet()","6abb4a50":"getPartner()","6abb51a5":"_completeTask(uint256,uint256)","6abc3fe4":"directMintAgent()","6abd3b88":"getWins(uint256,uint256,uint256)","6abf31eb":"confirmTransaction(address,uint256,uint256)","6abfbf6f":"allowTokenContract(address)","6ac084fe":"OrderFilled(address,uint256)","6ac0bf9c":"transferableSynthetix(address)","6ac0fe25":"BUYER_STEP_5_CANCEL(bytes32)","6ac26d3d":"executeAddMemberProposal(uint256)","6ac290e7":"getFirstReferrer()","6ac29bcc":"FBR()","6ac3a100":"HLCN()","6ac47db5":"CloudbricSale(address,address)","6ac4d582":"registrants(uint256)","6ac4d97c":"createInitialCards(uint32,uint16,uint16)","6ac4e08b":"dynArrayFunc(int256[])","6ac4f8e4":"StocksAddress()","6ac50065":"getBidsByAdunit(uint256,uint256)","6ac50f2f":"sizeOfUserAddresses()","6ac54d62":"stopPreIcoAndBurn()","6ac54eb0":"posMint()","6ac59dd5":"setIcoParametersSet(bool)","6ac5db19":"max()","6ac6016f":"pepFarm(address,address,address,address,uint256)","6ac6205c":"addDataPoint(int256,uint256,bool,string)","6ac68f7f":"getBestBidder(uint256)","6ac777d3":"EEFucksToken()","6ac878f3":"multiTransferDecimals(address[],uint256[])","6ac96df8":"removeAddressesFromRole(address[],string)","6ac98840":"SGCC()","6acd58d4":"arrayIndexOf(address[],address,address)","6acd89f6":"Testerr()","6acd8e4a":"getAddedTime(uint256,uint256)","6acdf42b":"arrayOfNonTrivialAccounts(uint256)","6ace6dc8":"setApprovedBuyer(address,address,bool)","6ace7d87":"getLastCandidates()","6acf5cb3":"isUserKYCVerified(address)","6acfb852":"ZiggleToken()","6ad001a5":"metalworksCities(uint256)","6ad03feb":"GBTAddress()","6ad0d6ce":"_startNewRound(address)","6ad1246e":"content(string,uint256,uint256,address,uint256,uint256)","6ad1a6d5":"PauseTradable()","6ad1fe02":"sale()","6ad26611":"removeFee(address)","6ad2a0b3":"buildContract(address)","6ad34a7a":"BAILSToken(uint256)","6ad34dab":"getstartBlockNumber()","6ad35d1a":"CMO()","6ad38e61":"transmit(address,address,uint256)","6ad3f723":"getContentAddress()","6ad43a54":"setRateICO(uint256)","6ad44174":"getVolumebasedBonusRate(uint256)","6ad49245":"FundingManagerEntity()","6ad50ed4":"investmentEntryInfos()","6ad5b3ea":"walletAddress()","6ad60e3d":"BubbleToneToken(address)","6ad6d45b":"setLister(address)","6ad7541c":"Kokos()","6ad7aeb5":"BitsumCash()","6ad80326":"walletFounder3()","6ad95317":"batchInvests(address[],uint256[])","6ad95843":"icoUnitPrice()","6ada94e0":"setDataInt(string,string)","6adacb48":"priceStep4()","6adc674e":"WaltixToken()","6adcef6b":"payDividends(uint256)","6addb663":"tokenInfo()","6addc649":"weekBonuses(uint8)","6ade6cea":"currentstageplayer2()","6ade8aa2":"emptyWallet(address)","6ade9bd1":"tokensFortorch()","6adf3279":"leekStealOn_()","6ae00c4f":"ShareRoomDATA(address,string)","6ae0646a":"_computeRollFee(uint256)","6ae17283":"MinterAdded(address)","6ae22740":"reward7()","6ae38577":"accPreICO()","6ae413ab":"updateWebappAddress(address,address)","6ae459bd":"bulkMint(address[],uint256[])","6ae4feed":"subtract(address,address,uint256)","6ae6151e":"acceptOffer(bytes32,address,uint256)","6ae6921f":"_addPayee(address,uint256)","6ae6b459":"setLockup(uint256)","6ae76777":"addressBounty()","6ae81ae1":"icoPhase3TimeBonusInPercentage()","6ae85216":"countAssets(uint256)","6ae85e0d":"isAddressNotVoted(address,address)","6ae8f49a":"WebCoin()","6ae8fefa":"NetareumToken()","6ae9eea8":"s39(bytes1)","6aea5f1b":"current_supply()","6aea6cce":"breakCompleteness(uint256,uint256,address)","6aeaef97":"inheritedView()","6aeb1ce7":"m_paymentChannels(uint256)","6aebbbd9":"subUIntValue(bytes32,uint256)","6aebc603":"Villj()","6aebff5d":"lccxTeamAddress()","6aec47b4":"getBalancesAgent(uint256)","6aec82b3":"setSalesPipe(address)","6aec95cc":"registerBalanceForReference(address)","6aedc282":"MarriageContract(address,address,uint256,string)","6aede5cd":"globalTimeVault()","6aedf1d1":"SupportAdded(address)","6aeeec7f":"_setStakingEpochDuration(uint256)","6aefef17":"test01CrowdsaleInit()","6af04a57":"newContractAddress()","6af1fdf7":"delegateTokens(address,uint96)","6af2da2f":"testKeyedHash()","6af41534":"withholdToken()","6af422fc":"RSPLT_H()","6af53f2f":"MaPToken2()","6af58d83":"getMin(uint256)","6af630d1":"DARKNODE_FEES_DENOMINATOR()","6af6b06f":"setNextLotteryTTMTokenId9(uint64)","6af6e64a":"VendorRegistry(address)","6af78ab1":"startWeekFour()","6af79112":"priceInWei(uint256)","6af7dbbe":"sendPriceRequestToOracle(bytes16,uint256)","6af81d6f":"_mintCategory(string)","6af91799":"totalTokenSaled()","6afa0381":"minInvestmentLimit()","6afa7b80":"toETH()","6afb434f":"getPreIcoInvestment(address)","6afb92a1":"MeepCoin()","6afbd04f":"Mintable()","6afc3474":"saleRoundsSet()","6afe74c9":"test_oneValidEmptyAddress()","6afeada3":"finishBountyAt()","6aff1a64":"TIER2_PRICE()","6affdc39":"saleEndDate()","6affe07b":"CirclesTokenOffering(address,uint256,uint256,uint256,uint256,uint256,address)","6b0028b9":"initialSupplyInFrac()","6b007e4f":"logMarketFinalizedCalled()","6b015897":"minimumRewardWithdrawalLimit()","6b01acf5":"counterToTokens(uint256)","6b0235a0":"tla()","6b038742":"Archetypal()","6b03ed5f":"clearClaim()","6b041da2":"SEVENTNET()","6b04f110":"mint_for(address,uint256)","6b061d7a":"changeRestarTime(uint32)","6b06548c":"EarlyInvestorsTokensHolder(address,address,address)","6b068e01":"collectWorks(bytes32,bytes32)","6b069710":"scheduleCall(address,bytes,uint256,uint256,uint8)","6b06afe7":"getEcoSystemWallet()","6b06c3d4":"ActivateEscrow(uint256,uint256,uint256,uint256,address)","6b06ea88":"ElementToken(uint256,string,string)","6b074a07":"isProvider(address)","6b08a833":"EDUTURN()","6b08f2ef":"convertForPrioritized2(address[],uint256,uint256,address,uint256,uint8,bytes32,bytes32)","6b091695":"getReward(address,address)","6b097cd0":"KKOGToken()","6b0bfc80":"feedAndMultiply(uint256,uint256,string)","6b0c537b":"generateRequestId()","6b0c932d":"lastDay()","6b0c9d6a":"distributeA()","6b0cba9c":"getUniqHash()","6b0cc513":"_DifficultyCalulate(uint16,uint16)","6b0d0329":"getTicketInfo(uint256,uint256)","6b0dd90f":"getVote(address,uint256)","6b0dfb76":"getLandDefender(uint8,uint32)","6b0ead6a":"iudexIdToString(bytes32)","6b0f02e6":"firstExchangeRate()","6b0f182e":"changeCofounderA(address)","6b0f65d7":"indSeedDeposit()","6b1092f2":"ADV_BTY_SUPPLY()","6b11c87a":"RealEstateCryptoFundBounty(address)","6b11dabd":"MTYToken()","6b128b2f":"upgradeFinance(address)","6b12a7bf":"buyRealm(uint256,uint256,uint256)","6b13fabf":"SampleToken()","6b140854":"totalWinValue()","6b1426a4":"getWinners(uint256)","6b149aac":"Cryptassist()","6b14dfe1":"SPEED_STAT_MAX()","6b14ea36":"ASK_STAKE_RATIO()","6b153322":"activateCampaign(string,uint256)","6b15c47c":"tokenCalculate(uint256,uint256)","6b1781b6":"Emergency()","6b17864f":"CommunityPool(address,address)","6b1786bb":"cVideoCost()","6b178b90":"NBACoin()","6b178f47":"poolIssue()","6b190ee1":"MemeNetworkToken(address,uint256)","6b194a4a":"ALLOCATION_LOCK_END_TIMESTAMP()","6b1970ab":"TheCoin()","6b199471":"updateMasks(uint256,uint256,uint256)","6b19e692":"getPaymentSupply()","6b1ac900":"setPXLPropertyContract(address)","6b1af75e":"sendReward(address,address,uint256)","6b1b3997":"ChronoDragonPowerCoin()","6b1b68ad":"URMBToken(uint256,string,string,address)","6b1bfd33":"setFundAccount(address)","6b1c86fe":"sendBreakup(address)","6b1cb549":"orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)","6b1d4db7":"ethToTokenSwapOutput(uint256,uint256)","6b1da364":"getWinnerInfo(uint256)","6b1e0420":"blockPendingTx(uint256)","6b1e564a":"challengeWinningOutcome(bytes32,uint16)","6b1f513b":"makeDailyInvest(uint256)","6b1f78c8":"joinSqr(uint256)","6b1fbfdb":"sendWithSignature(address,uint256,uint256,bytes,uint256,bytes)","6b1feeeb":"get_my_sig()","6b212960":"offer(address,uint256)","6b2148c2":"Deluxo()","6b21a636":"startDisbursement()","6b227a8f":"OrderApprovedPartTwo(bytes32,bytes,address,bytes,address,uint256,uint256,uint256,uint256,uint256,bool)","6b2327d2":"previewStageEndTime()","6b2351aa":"lockWithAfter(address,uint256,uint256)","6b235bdc":"ChangeBeneficiary(address)","6b236730":"solveChallenge(bytes32)","6b24d827":"WalletHolder()","6b252b47":"advisorsWallet()","6b256f57":"DAOSecurity(address,address,bytes,uint256,uint256,uint128)","6b259690":"feesPool()","6b263efa":"multiOwnableCreator()","6b270056":"Corporation()","6b27909d":"getStopLockTime()","6b27be9f":"mayorcoin()","6b281b64":"totalBalanceUp()","6b28d7a2":"blockTransfer()","6b28f834":"getPeggedTokenCount(address,address)","6b298df0":"disbursements(address)","6b2a2691":"winBrickReturn()","6b2a77ed":"End5()","6b2a86be":"dropToken(address[])","6b2accac":"toDRP(uint256)","6b2ae2ab":"Notify_String(string,string)","6b2bb92a":"finishTournament()","6b2c0f55":"removePauser(address)","6b2c116c":"AmateurPlatinumToken()","6b2cd752":"getGpgKey()","6b2ce4ce":"stakeForDuration(address,uint256,uint256,bytes)","6b2ce7f1":"togglePresale(bool)","6b2d95d4":"getLockedTokens(address)","6b2e36b0":"canUpdateAmountToTakeAsRake()","6b2ec90f":"_vestedDown(uint256,uint256,uint256,uint256)","6b2ed1c0":"sellFci(address,uint256)","6b2f4632":"totalEthereumBalance()","6b2f65b0":"isArtist(address)","6b2f68f5":"assertEq22(bytes22,bytes22)","6b2f73c2":"preICOLedger()","6b2fa6cc":"lastBlock_v7Hash_uint256()","6b2fafa9":"getHash(uint256)","6b2fd0e7":"catGenes(uint256)","6b3032c6":"getSingleGuessInfo(uint256)","6b308ee7":"subTourFreezingPrice()","6b30f243":"VCChainToken()","6b318270":"addFile(bytes32)","6b319f36":"tokenUnfreezeTime()","6b31ee01":"jackpot()","6b32bb25":"containsValue(address,uint256,string,uint8[])","6b32c591":"userClaimAmt()","6b334e49":"senderCheck(address,address)","6b335b8c":"buyXname(uint256,string)","6b33aeb8":"YSH()","6b33e45d":"setWithdrawTo(address)","6b3416b5":"transfer(uint256,uint256,uint256,uint256,uint256,uint256)","6b342eb8":"_minimumBuy()","6b3559e1":"mintAndSetData(address,uint256)","6b3578f2":"paymentEnabled()","6b35bed2":"addAirdropParticipants(address[])","6b35f7c1":"deleted()","6b36028e":"setReferenceType(bytes32,string)","6b361c80":"TokenPriceUpdated(uint256)","6b36a76e":"MIPCoin()","6b3868db":"getMemberByIdx(uint256)","6b3905c4":"getNextVestingTime(address)","6b392680":"setFeeAmount(uint256)","6b3a87d2":"WatchWinningPot()","6b3a8e90":"tournamentJackpot()","6b3ac430":"crowdsaleLive()","6b3ad4f8":"setColorWhite()","6b3b1d17":"tHasBeenPenalized(uint256,address)","6b3b261c":"addSpaceshipMoney(uint256)","6b3bc4b6":"ovcPerEther()","6b3c9757":"advisorSecondLockTime()","6b3ce49b":"getRoomBalance(uint256,uint256)","6b3cedd6":"mintTokensForCrowdsaleParticipants(address[],uint256[])","6b3d998c":"Apputoken()","6b3e2f97":"updateDiamond(string,string,string,string,string,uint256,uint256,string)","6b3e8ca0":"setPrePresaleTokens(uint256)","6b3ec0ac":"vestingExists(address)","6b3f5f84":"OwnerReclaim(address,uint256)","6b3f94ab":"GoldMintToken()","6b3fb674":"noHash()","6b3fdc5a":"oraclize_setNetwork(uint8)","6b3fdf16":"EXT_COMPANY_THREE()","6b3ffb91":"changevanity(string,address)","6b404955":"depositDelta()","6b407837":"sellerRequestCancel(bytes16,address,address,uint256,uint16)","6b4097b2":"_runAdvanceClock(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","6b40bba1":"requiredPeriodSeconds()","6b424d47":"h2g2()","6b425093":"sortTopPosts()","6b433ccf":"_totalLandholderTax(uint256)","6b440e9a":"finalAllocation()","6b441abc":"VIRTUALTALK()","6b453fac":"hardWeiCap()","6b454d4c":"next_item_index()","6b45adf3":"cellsOf(address)","6b45c9f2":"getPiece(uint256)","6b462936":"transferQueue(address[],uint256[])","6b4660f8":"getStockLength()","6b46c8c3":"payoutAmount()","6b475df7":"release6m()","6b486818":"hashFirst()","6b489028":"DEVCLASS()","6b4a6ded":"TOKENS_PER_ETHER()","6b4a8b78":"token_allowance(address,address)","6b4b1f3a":"stringToAddress(string,address)","6b4b63fa":"Bank_With_Interest()","6b4bfeae":"checkClaimExpiry()","6b4c0789":"freezeContract(bool)","6b4c5856":"WyeContract()","6b4ca2a8":"getMatchData()","6b4dd158":"getPrice(bytes)","6b4dff1f":"validateGasPrice(uint256)","6b4e243d":"callOperator(address,address,address,uint256,bytes,bytes,bool)","6b4e8bb0":"lastInflationUpdate()","6b4ed21b":"holdersCount()","6b4f518a":"preICOTokenReward()","6b4f6865":"unlockForWork(address,address,uint256)","6b50b6b3":"_multiSigWallet()","6b512327":"_deleteIPFSHash(bytes32)","6b523b68":"periodCrowdsale()","6b52a071":"SALE_FUNDS_ADDR()","6b52a86f":"DesTokenSale(address,address)","6b5396dc":"batchPresaleVesting(address[],uint256[],uint256[],uint256[],uint256[],uint256[])","6b5424b3":"HACHIKO()","6b54821f":"setupAuthentication(address,bool)","6b550dd3":"setAgriChainDocuments(address)","6b55264d":"setRegionName(uint16,string)","6b55ddd0":"getJobEmployerName(uint256)","6b55e991":"transferEther(address)","6b56476b":"removePost(address,address)","6b5648f5":"enabledMint()","6b565345":"CANAToken()","6b57825c":"getCurrentUserTotalPromoBonus()","6b57cb34":"lockedStagesNum(address)","6b584b10":"testFreeSpace()","6b588775":"rateOfSpecificTier(uint256)","6b58b2bc":"calculateInternalTokensAmount(uint256,uint256,uint256)","6b590248":"getDigit()","6b59084d":"test1()","6b59f495":"tokenized()","6b5a61ac":"changeTeamNIMFAAddress(address)","6b5ae41c":"execute0(address,uint256,bytes)","6b5aed93":"executeTransfer(string,string,uint256,uint256)","6b5b6285":"PBKtoken()","6b5bbf5f":"setCommunityMultisig(address)","6b5c4b16":"dateRelease12()","6b5c5f39":"croupier()","6b5c8fba":"confirmParties()","6b5ca27d":"finalizeCampaign(uint256)","6b5caec4":"setBot(address)","6b5cd8d0":"getWeaponDamageFromTokenId(uint256,uint256)","6b5d18fd":"getProposedIpfs(bytes32)","6b5d3287":"sellTokensForUsd(string,address,uint256,uint256)","6b5de05a":"tokensForTournament()","6b5e1a18":"payoutThreshold()","6b5e3ca4":"StaffWallet()","6b5e7b06":"getPenndingBalances()","6b60386d":"init(uint256,uint256,address,address,address,uint256,uint256,address,uint256,bool)","6b6093c2":"FreezeBalances(address)","6b61c3c7":"acceptBet(bytes32,bytes32,bytes32,bool)","6b628816":"getYumerium(address)","6b6292d9":"securityTokensPercent()","6b62cb1b":"createName(bytes32,address)","6b62cd65":"bankerAllDeposit()","6b634440":"tokensForPartners()","6b63d145":"OWNER_TOKENS_PERCENT()","6b6438cc":"payoutCursor_Id_()","6b64c769":"startAuction()","6b655e45":"getJuryMembers(uint256)","6b6566f0":"DiceOffline()","6b65a834":"ratePlanIsExist(uint256,uint256)","6b65be60":"usedPositions()","6b668601":"preSaleConversionRate()","6b676966":"tokenNeedForBonusLevel1()","6b683896":"getImplementation(string)","6b6872c7":"OeTestCoin()","6b68db6a":"FipsData(bytes20,address,bytes)","6b68dd4b":"tokensOfOwnerWithinRange(address,uint256,uint256)","6b693027":"collateralizations(address,uint256)","6b698377":"DogecoinPrivate()","6b69ac58":"upgradeHealth(uint256,uint256)","6b6a08dc":"hashRevealedPositions(uint32,int64[])","6b6a53fa":"testThrowsRestartNotOwner()","6b6b2740":"RetailLoyaltySystemBase(uint256,string,string,uint8)","6b6c5a7e":"getBracketData()","6b6cc239":"isMaintenanceMode()","6b6d294e":"worldCupResultPart3()","6b6d5c82":"encryptedBallots(uint256)","6b6e71b9":"makeTransaction(address,uint256,uint256)","6b6ece26":"ban(uint256)","6b6ee875":"tokenSealer(uint256)","6b6ef0ed":"transfer0(address,uint256)","6b6f4826":"minInvestmentICO()","6b6f4a9d":"discount()","6b7006d7":"lockMana(address,uint256)","6b709a36":"lockWorker(address,address)","6b7128ec":"getBetCount(uint256)","6b71d93b":"VerifiedProxy(uint256)","6b727312":"easyCommit(uint256,uint256,uint256)","6b7285d7":"transferP2P(uint256,address)","6b74401a":"BuyTokensDirect(address,uint72,uint88,uint88)","6b74c3d8":"getTxn(address,uint256,uint256)","6b755aa2":"reCommentRewardPool()","6b764632":"KongToken()","6b76484e":"swap(address,address)","6b76bd94":"CreateUser(string)","6b78aa08":"MarketHub(uint256)","6b790be4":"getWeightMinusFees()","6b792c4b":"emergencyWithdrawETH(uint256)","6b7976c8":"calculateObtainedINA(uint256)","6b7a247e":"setlvlSign(string)","6b7ae8dc":"foundationWallet()","6b7ae8e6":"left74(uint256)","6b7b0472":"getLastHash(bytes10)","6b7c0379":"HOPPToken()","6b7cc44f":"detail()","6b7d5205":"Diamond()","6b7d5dfd":"setTangibleAssetDisbursementAddress(address)","6b7d90ff":"unVerifyKyc(address)","6b7d9a5c":"createPromoPuppy(uint256,address,uint16,uint16,uint16,uint16)","6b7db8fc":"sendDividend(address,uint256)","6b7e4175":"EphronIndiaCoinICO(address,address,address)","6b7eba7d":"instantTransfer()","6b7f3a32":"Jojo(uint256,string,uint8,string)","6b7fad1b":"ethToDividendsNeeds()","6b7ffb92":"revote()","6b802108":"checkValidSignatureAndMethod(address,bytes)","6b8184e2":"ImpeachmentAccepted(address)","6b8263ed":"resumeOffering()","6b8287a6":"getetherpriceinUSD(address,uint256)","6b8393dd":"getSold(address,uint256)","6b847dc0":"setDayWithdraw(uint256)","6b8487be":"GigToken(bool)","6b84dfcd":"setTransferRight(address[],address[])","6b863578":"noVoteSum()","6b872309":"x(address,uint256,address,uint256,bytes32,bytes32)","6b87d9f7":"BUBBLEToken()","6b881724":"assetWallet()","6b886888":"isTemporary(bytes8)","6b88719a":"PHOENIX_CORSAIR_FTL_SPEED()","6b889cce":"call_test()","6b88f4ae":"resetIndex(uint256)","6b89be03":"getActiveShareholdersArrayLength()","6b89bfc7":"getStatusOf(address)","6b8ab97d":"reset(address)","6b8b3268":"mintCrown(uint256)","6b8c261e":"prizeByNow()","6b8c4c48":"setDaxInBtcSatoshi(uint256)","6b8c7180":"setupPeriodForPreSale(uint256,uint256)","6b8cc89d":"INVESTMENT_USER2()","6b8ce30e":"partnerInfo_for_Owner(address,bytes32,uint8,bytes32,bytes32)","6b8da9a2":"tgrLive()","6b8f155a":"numberWhitelisted()","6b8f9c43":"setPayoutWallet(address)","6b8fd600":"priceOfElements(uint256[])","6b8fe0f0":"NewPlayer(address,uint256)","6b8ff574":"getName(uint256)","6b90ce93":"simulated_snt()","6b915d43":"melonToken()","6b9168e6":"clearAngelsFromBoard(uint16)","6b919488":"removeOwner(uint256)","6b930927":"preTgeTokenSupply()","6b931cad":"replaceAdministrator(address,address)","6b944bd6":"GoBlock()","6b946680":"parentKidsLink(uint256,string,string)","6b94692a":"isPresaleBuyer(address)","6b95767d":"giftSpaceship(uint16,address)","6b962c27":"transaction_internal(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[4])","6b963f20":"changeOVISReservedToken(uint256,int256)","6b96668f":"setRateContract(address)","6b97be1f":"transferPayable(uint256)","6b97c6d7":"_transferOwnershipOfItemsStorage(address)","6b97e5eb":"UnicronToken()","6b9808a1":"buyWine()","6b98419a":"_approveFor(address,uint256)","6b9896ba":"AddAccountsInfo(address,uint256)","6b98c85c":"bltMasterToSale()","6b98d78c":"setLandSlogan(uint256,string)","6b99a13e":"editNumber(uint256)","6b9a1db9":"wanUnit()","6b9b1006":"TransactionRecorder()","6b9b2679":"setReserveForFoundersFirst(address)","6b9c1d22":"managementFeeWallet()","6b9c6116":"PULSCrowdsale()","6b9cadc1":"isValidMsgValue(uint256)","6b9cf534":"_minimumBuyAmount()","6b9da657":"sendNewEntry(string)","6b9db4e6":"getLock(address)","6b9f96ea":"flush()","6ba0b4f2":"isKnownSelector(bytes4)","6ba0b8bc":"getBonusPercent(uint256,uint256)","6ba0f114":"EtherChain()","6ba15807":"evntCreateContract(address,address,address,address,uint256,string)","6ba20015":"maxplayers()","6ba2482d":"GetUserNickName(address)","6ba2aefc":"transferMultisig(address,address,uint256)","6ba42aaa":"isKeeper(address)","6ba44d3c":"get_address(string)","6ba47299":"buyDiscountTTWByETH(uint256,address)","6ba4c290":"modifyEscrowPrice(uint256,uint256,uint256)","6ba4f143":"_setAuraValue23(uint256)","6ba4fadb":"changePhaseToPreICO2()","6ba55c6d":"coinIssuedFoundation()","6ba5ef0d":"setMin(uint96)","6ba6984c":"setHBT(uint256)","6ba6e2e0":"TGCToken(address)","6ba75608":"claimAssetPack(uint256)","6ba7d28a":"checkVestingWithFrozen(address)","6ba7e31c":"PriceSet(string,uint64,uint8)","6ba7ffd5":"requestCnt()","6ba8d421":"transferHackoinTokenOwnership(address)","6ba951c4":"EtherModifierTigro()","6ba9a40b":"withDrawBalance(uint256)","6ba9fd38":"openMinting()","6baa0f8e":"createSystemAuction(uint256)","6baa2ff7":"preSale(address,uint256)","6baae8e5":"_prand(uint256)","6bacc0fa":"hasSaleEnded()","6bacdc87":"InterestFreeLending(address,address,uint256,uint256)","6bacfe43":"getCCH_edit_16()","6bad77e1":"getNumProducts()","6bad8ed8":"freezingPercentage()","6bae05cf":"preRegister(address)","6bae116f":"getBonusMultipierInPercents(uint256)","6bb0ae10":"print(uint256)","6bb15940":"getCurrentSaleRate()","6bb1605b":"filehash()","6bb164c9":"isCantonEmployee(address)","6bb20f9b":"searchWhitelist(address,address)","6bb27584":"capRound1()","6bb2c12f":"createRequest(address[4],address,uint256[12],uint256,bytes)","6bb3130e":"disbursementWei()","6bb35840":"PowerGiggs()","6bb3c065":"round4Sold()","6bb4cf76":"createToken(string,string,uint8,address[],uint256[],uint256[])","6bb4d573":"evMinTokensReached(address,uint256,uint256)","6bb50f4c":"_openGamePlayNo(uint256)","6bb53c90":"ticket(uint256,uint256,uint256,uint256,uint256)","6bb56e8b":"crowdsaleEth()","6bb60475":"_insertSortMemory(uint32[11])","6bb6126e":"exec(address)","6bb6ea30":"createInterceptor()","6bb72c97":"numTokensInLottery()","6bb7b7a4":"rare()","6bb7f336":"updateUnsoldTokens()","6bb7f98e":"getHighestMilesOwnerAt(uint256)","6bb80acc":"_createCovfefe(string,string,uint16,address,uint256)","6bb80d51":"dividendPercentage()","6bb82e82":"addToWhitelist(address,uint256,bool)","6bb9b9ab":"getTodayDividendsByAddress(address)","6bba3f2f":"kappa()","6bba5c15":"changeParameters(uint256,uint8,uint256,uint256,uint256)","6bbadf09":"addPokemonDetails(string,uint256,uint256)","6bbae823":"LIMIT_STAR4()","6bbbc182":"addVerified(address[])","6bbbec85":"updateGameMeta(uint256,string,string)","6bbc5748":"FeeChanged(uint256)","6bbe0410":"NewTransaction(string,uint64,string,uint64,uint8)","6bbe24d4":"dataSourceGetQuarterResult(uint256)","6bbe6f7f":"buyCoinsPreview(uint256)","6bbea781":"getApproveValueFor(address)","6bbeb9de":"loginUser(address)","6bbeba8a":"setService(bytes,address)","6bbf54a4":"PCF()","6bbf592d":"bytesCallWithArray(bytes32[4])","6bc02730":"approveBreeding(address,uint256)","6bc0b3ba":"jackpotAddress()","6bc0f7fb":"isProxyLegit(address,address)","6bc1f1e4":"updatePriceAndInventories(uint256,uint256,uint256,uint256,uint256,uint16)","6bc21808":"CategoryAuction(address)","6bc2805d":"cancelAllEnter()","6bc31311":"EFFCoin(address)","6bc32c7b":"get_train_data_length()","6bc388b2":"canFreeze(address)","6bc3b437":"newService(string,string)","6bc3e0f0":"verifySecondHalf(uint256[4],uint256[4],uint256[4])","6bc3e4a8":"claimMultiple(address,uint256)","6bc46fb2":"totalHatcheryShrimp()","6bc5063c":"VestedTokensReleased(address,uint256)","6bc507b1":"getBlackflag(uint256,address)","6bc5b964":"getMemberWhisper(address)","6bc5c0cd":"releaseBonus()","6bc6147e":"unlockMainSaleToken()","6bc64e0f":"preSaleEnd()","6bc65778":"getAllProductList()","6bc789cd":"getONG_AUDIT(bytes32)","6bc85107":"isMemberInDescendant(address,bytes32)","6bc8a260":"getUserWinInTournament(uint256)","6bc99824":"VoltToken()","6bc9b0d7":"getPromiseIds(uint256,uint256,address,bool)","6bca81d4":"revealBid(bytes32,address,uint256,address,address,bytes32,uint256,uint256)","6bcaaed9":"PetmancoinToken()","6bcab76c":"setDApp(address)","6bcc035a":"getStatusAndOutcome()","6bcc28a9":"kittensRemainingToDrop()","6bcc311c":"tokensForBonus()","6bcc7241":"getPriceWei(uint256)","6bce23be":"setupTokenRate(uint256)","6bce6569":"reservedPercentTotal()","6bce8a96":"whitelistedAddressCount()","6bceead7":"setSquareWins(uint256,uint256,uint256)","6bd0021c":"bonusPhase()","6bd31a56":"hardCapLowUsd()","6bd37274":"Pixiu_Beta()","6bd3a1c3":"PresiamDrop()","6bd3d406":"totalPresale()","6bd46bd2":"setTokenBurnFeeReceiver(address,address,address,address)","6bd484c4":"oracleCallbackGasLimit()","6bd4dfce":"setStarterClass(uint256,uint32)","6bd5084a":"number_of_claims()","6bd50cef":"getConfiguration()","6bd58db5":"Total_Patient(uint256)","6bd5e26a":"lockTo(address,string)","6bd61a66":"nonHighestBidderRefund()","6bd6775f":"Presale(address,address,address,address,uint256,uint256)","6bd68a8f":"referralAmount()","6bd70a1f":"MIN_IVESTMENT()","6bd7e7dd":"CatBought(uint256,uint256,address,address)","6bd7eeeb":"maximumTokensForFirst()","6bd87c86":"Try2222()","6bd8fd12":"currentMinBid()","6bd92f7c":"activateAllowanceRecord(address,address)","6bd9b4da":"setMinETHin(uint256)","6bda3422":"Token(uint256,string,string)","6bdaa520":"forciblyRequest_callback()","6bdbc918":"BaseTransactionService(address,address)","6bdbf8e6":"concat()","6bdc06f5":"cancelRegistration(address)","6bdc1d2a":"GoldRex()","6bdc62b9":"composeJingle(string,uint256[5])","6bdc9546":"setCommunicationUri(bytes32)","6bdcdb2d":"getAutomatedReportDueTimestamp()","6bdcdeaa":"setMagicStore(address,address)","6bde2e7f":"_setBodyColorValue3(uint256)","6bdea7eb":"AddBonus(uint256)","6bdebcc9":"destory()","6bdee200":"enableTicker()","6bdee235":"Zeroexchange()","6bdfd723":"getNewEnglandBets(address)","6be00229":"exitAddress()","6be03bd2":"configTimeInc()","6be050d2":"FibokenUsed(uint8,address,uint256)","6be0c670":"chipSize()","6be13c92":"coldWallet()","6be202cf":"addSomeDETsTo(address,uint256)","6be24a47":"create(address,address,address,address,address,address,address,string,string,string)","6be2f28e":"totalAmountOfWeiCollected()","6be32e73":"tokenCallback(address,uint256,bytes)","6be343cc":"setFoundAcc(address)","6be39bda":"getTerms(bytes32)","6be4097c":"currentLotteryId()","6be422b2":"determinReferrer(address)","6be47418":"latchFciUserController(uint256,address)","6be47618":"deleteContract(uint8[],bytes32[],bytes32[])","6be4cf1f":"buyTokensFor(address)","6be4d9b0":"changeResolverAllowances(address[],uint256[])","6be505f5":"selectWinner(bytes32)","6be598b4":"SIGTToken()","6be5f4a6":"checkVictoryByScore(uint256)","6be60f8b":"underwrite(uint256)","6be67db3":"contractNameUpdate(string,bool)","6be6fa14":"getTransferFromValueValue()","6be80de7":"investorIDs(address)","6be82168":"NeycoinToken()","6be86f21":"bonussale_TokesSold()","6be9564a":"ListingBought(bytes5,uint256,uint256,address)","6be99794":"getTransferToValue()","6be9a8df":"GetGuestQueueNumber()","6be9f7a0":"emitDeposited(address,uint256,address)","6bea0b79":"getAccountData(address,string)","6bea8215":"createGenerator(uint256,string,uint256,uint256,uint256)","6bea989d":"AUTH_FREEZEACCOUNT()","6bea9d81":"BLOCKPIX_Coin()","6beace8f":"AllocateFounderTokens(address,uint256)","6beadfc7":"approveandcall(address,uint256)","6beb509d":"updateCanRefund(bool)","6bec32da":"mintToken(address,address,uint256)","6bec454a":"buyCity(uint256)","6bec51cc":"generate(address,address,uint256)","6bece548":"preSaleBonus1Time()","6bed09be":"buyTokensUpdateState()","6bed6de5":"sendObjectWithApproval(uint256,address)","6bedb845":"MultiSig()","6bee2cc3":"registerLottery(uint256)","6bee5131":"FW(uint256,string,uint8,string)","6bee73db":"testAllowance()","6bee76ea":"withdrawBond(address,uint256,uint256)","6bee9cfa":"offsetFeeRate()","6bef2a94":"earlyPurchaseTokenAmount()","6bef90f8":"VUP_PER_ETH_BASE_RATE()","6befa297":"WCT1(address)","6bf006c8":"capReached(uint256)","6bf06fde":"transferToNewContract(address,uint8,bytes32,bytes32,bool)","6bf0873a":"birth(uint256,uint64[])","6bf0a3bf":"LIQUID_ALLOCATION_PPM()","6bf0c7fd":"getBracket(address)","6bf0f4a1":"roll(uint8)","6bf13959":"endAtCheck(uint256)","6bf20a77":"unfrozenATAccount(address,address)","6bf2606a":"PATCH_VERSION()","6bf30259":"checkIncentivisingBalance()","6bf32504":"markAsFailed(string)","6bf341e7":"_fundowner()","6bf4223b":"getRoundEnd(uint256)","6bf42646":"holdTokenInvestorsCount()","6bf42ea5":"TokensBought(address,uint256,uint256,uint256,uint256,uint256,uint256)","6bf4398d":"saniwallet()","6bf51a18":"stepLockCheck()","6bf52ffa":"Vote()","6bf5595d":"CrowdSale(uint256,uint256,uint256,address)","6bf6dd6f":"associate(bytes32,bytes32[],address[])","6bf807fc":"unlockTimes(address)","6bf82d74":"ethFundMain()","6bf8b92d":"changeSeed(uint32)","6bf8bfab":"DutchAuction(address,uint256,uint256)","6bf8f85a":"forceFinish()","6bf91c63":"configOf(uint64)","6bf99bbf":"ICOResumed(uint256,uint256,uint256,uint256,uint256)","6bf9b3e7":"approveWithdraw(address,address,uint256)","6bf9b731":"claimFor(address,address,address)","6bf9e633":"winnerIsA()","6bfa379e":"readyTokens(address)","6bfa5edc":"operatingOfficerAddress()","6bfaa903":"increaseOwnershipTokenCount(address)","6bfae928":"calcReserve(uint256,uint256,uint256)","6bfb0d01":"itemCount()","6bfbbdf5":"DutchAuctionToCraft(address,address,address)","6bfbc9f7":"HongToken(uint256,string,uint8,string)","6bfbf5e6":"levelChanger()","6bfc8bb5":"setIPFSHash(bytes32,string)","6bfc9561":"sellStake()","6bfd9716":"SaleTracker(bool)","6bfdb7eb":"getBeneficiary(address,address)","6bfdd3dd":"_sanMint(uint256,address,string,string)","6bfe6bc0":"setEthPricies(uint8)","6bfee863":"CipherToken(uint256,string,string)","6bff1901":"coreTeamSupply()","6c00161a":"distributeWithMilestone(address,uint256,uint8)","6c00bb44":"AuctionSuccessful(address,uint256,uint256,address)","6c012923":"feeForSplitterCreation()","6c021968":"RefundTransfer(uint256,uint256,uint256,address)","6c026f59":"ii()","6c02a931":"tokenName()","6c0360eb":"baseURI()","6c03cd49":"getInviteRate()","6c04066f":"BlockLockSet(uint256)","6c042689":"endStage1()","6c043773":"sendPacket(address,bytes)","6c047c36":"evaluateProposalMetricStart(uint256)","6c049b89":"toggleCrossForking()","6c04c1c9":"LuckyEthereumLotteryToken()","6c050eae":"look()","6c052cd8":"getGroupMembers(bytes32)","6c054113":"setPhaseSale(uint256,uint256,uint256)","6c054ad0":"createContractor(address,address,bool,address,string,string,bool)","6c055ce2":"withdrawToPartner(address,uint256)","6c060a7a":"_batchPopularitySetting(uint256[],uint8[])","6c062806":"addAdminAddress(address,address)","6c062cc7":"Forge()","6c064d63":"_setCompositionPrice(uint256,uint256)","6c08729e":"TransferToSAToE(address,uint256)","6c08faf7":"getCaseCount()","6c096192":"fetchCreatedOrdersForPayer(address)","6c0a1117":"doCancelAll()","6c0a1605":"EthTurnWCG(uint256)","6c0b1e8c":"VESTING_START_TIME()","6c0b66b9":"PGO_UNLOCKED_LIQUIDITY_CAP()","6c0c27e1":"acceptBet(uint256)","6c0d2c8b":"getHeroPower(uint256,uint256)","6c0daed8":"getRate(string)","6c0db60e":"CatexToken()","6c0eb56f":"LOG_EmergencyWithdrawalProposed()","6c0ebc6c":"perform_withdrawal(address)","6c0f7ee7":"multiAddDSource(bytes32[],uint256[])","6c10dcdf":"ProvidenceCasinoToken()","6c118f46":"TimeWindowUpdated(uint256,uint256)","6c11bcd3":"sellTokens(uint256)","6c1247e5":"databaseContract()","6c131dbe":"multiMint(int256,uint256[])","6c1334bf":"SetDescript(string,string)","6c13b5f2":"totalReceive()","6c1475ad":"tryAdvance()","6c14bb42":"buyAutos(uint256)","6c14f2d1":"m_ETHPriceLastUpdateRequest()","6c150f42":"initLeftICOTokens()","6c15e8e6":"GlobalConstraintRegistrar(int256)","6c169818":"isFreezeAccount(address)","6c16c740":"Start9()","6c172095":"gameCenter()","6c17729b":"JoygoEOS(string,string,uint256,uint256,uint256,uint256,uint256,uint256)","6c182e99":"lastTokenIsTransferableDate(address)","6c188593":"setMinBetAmount(uint256)","6c189c46":"releaseAmisToken()","6c18cc1e":"firstSellHSShop(uint256,uint256,uint256)","6c194b59":"lastTransactionRec()","6c197ff5":"sell(address,uint256)","6c19e783":"setSigner(address)","6c1a5b8c":"TOKEN_TARGET()","6c1c6d93":"setVipAddress(address,address)","6c1c86f7":"PlanEX()","6c1d0157":"distributeMoney(address,address,uint256)","6c1d4fd9":"advisorsTokensThirdReleaseTime()","6c1e039a":"playerRoll(uint8,uint8,address)","6c1f05d2":"breakIdMaintenance(int128,address)","6c1f27fe":"icoBonus5()","6c1f2fb3":"ico3Sold()","6c1ff101":"Crowd()","6c204fd7":"certifyMany(bytes32[])","6c2066bf":"MAX_TOKENS_ADVISORS_PARTNERS()","6c20ceb4":"DeltaChainToken()","6c20d755":"getItemRafflePlayers(uint256)","6c20fcdd":"MerkleTreeRootAdded(uint8,bytes)","6c2187e7":"GameEnded(uint256,address,uint256,uint256,uint8,uint8)","6c224487":"DEHT()","6c226eef":"_processGameEnd()","6c231060":"buyCar(uint256)","6c237c1c":"admin_token_burn(uint256)","6c23c7b0":"canOperatorTransferByPartition(bytes32,address,address,uint256,bytes,bytes)","6c2412ae":"GetChipInfo(uint32)","6c241bb1":"getCityData(uint256)","6c24a76f":"getAvailableBalance(address)","6c24c87d":"latestSenderOf(uint256)","6c24e2db":"maskpot()","6c26493c":"MyTestToken1()","6c265dc3":"calcFeeE8(uint64,uint256,address)","6c26df09":"addFootballMatch(uint256)","6c27b211":"registerBalanceForReference(address,uint256)","6c28faee":"migration(address,uint256,bool)","6c295936":"changeOptional(uint40,uint64)","6c295e34":"Add_Doctor(uint256,uint256,string,string,string)","6c29d714":"totalMarketplaces()","6c2af4e5":"MithrilAxe()","6c2bcfdd":"MAXSALESCAP()","6c2c5a19":"addCarSigned(string,string,string,uint16,string,address,bytes32,bytes32,uint8)","6c2d5d26":"symbol(address,bytes32)","6c2ec9ef":"guess_tx(bytes32)","6c2f64fe":"removeContractAddress(address,address)","6c303e1b":"Bitescia()","6c3051c9":"setWonTeam(uint256)","6c30ba53":"setTitulaire_Compte_4(uint256)","6c30d170":"renounceIssuance()","6c30f765":"testing(uint256)","6c326a46":"prizeFundHWC()","6c32c0a6":"gap()","6c32e01c":"sendJackpot(address,uint256)","6c33e7eb":"setMockAddress(bytes4,address)","6c341889":"toUint(bytes,bytes,uint256)","6c343afc":"destTokens(address)","6c343ffe":"withdrawfunds()","6c349e57":"addrunmoney(address,uint256,uint256,uint256)","6c34c97a":"setFIRST_STEP_LIMIT(uint256)","6c376cc5":"maintenance()","6c3772fd":"totalpaidout()","6c3824ef":"removeTokens(address[])","6c38d4e4":"pauseMint(uint256)","6c3919fc":"getProviderCurrentRate(uint256)","6c39b7ee":"gamesPlayed()","6c3a208d":"VistaToken()","6c3aaab7":"snailPot()","6c3aacf9":"getTokenToEthOrder(uint32)","6c3b6591":"right83(uint256)","6c3c221b":"setFunctionTwoPrice(uint256)","6c3e6a75":"forceBonds(address)","6c3e6e0c":"iconomiTokenSupply()","6c3e8e19":"_vestedAmount(address)","6c3ea721":"memberHasRight(address,string)","6c4019f4":"createContest(string,address,uint32,uint64,uint64,uint128,uint128,uint32,uint32,uint8,uint32[])","6c4040c5":"firstSaleSpenderTxDetails(uint256)","6c419326":"STC(address,uint256,uint256,uint256)","6c43a2ca":"increaseAllowance(address,address,uint256)","6c4470fb":"participants()","6c456d0f":"getERCContractAddress()","6c457528":"createUsername(string)","6c463635":"getDistValues(string)","6c464c3d":"recieveRelocation(address,uint256)","6c46a2c5":"addOwners(address[])","6c46ae22":"phasePublicSale3_To()","6c4820bb":"callModifiedWithdraw(uint256)","6c48a097":"amount_investments()","6c494843":"multiAccessChangeOwnerD(address,address,address)","6c4b3197":"getSecureFees()","6c4be791":"hasAirdrop(address)","6c4bf16b":"icoOwner()","6c4c174f":"hack(address)","6c4ceaff":"getSourceHash(uint256,uint256,uint256)","6c4d032e":"SOFTCAP_TIME()","6c4d0c00":"wasGoalReached()","6c4d4f21":"setVotingProxy(address)","6c4d7c59":"getBetProps(bytes32)","6c4db7cc":"sendFoundersBalance(address[],uint256[])","6c4dfffe":"BIKS(uint256,string,uint8,string)","6c4e5c86":"decreaseLockBalance(address,uint256)","6c4e838a":"wantNewTokens(uint256[])","6c4e86af":"dailyGrowth_ppm()","6c4eca27":"tokenTransfer()","6c4ef21e":"canUnstakePartial(address,uint256,uint256,bytes8,uint256,uint256,uint256,uint256)","6c4f5e51":"testingContracts2(string)","6c4f8c65":"DeviceIsActivated(address)","6c4fbaa4":"requestCore()","6c4fe255":"p_setMaxInvestment(uint256)","6c5077b1":"MintPaused(bool)","6c5091e3":"getERC721AddrPawn(uint256,address)","6c50bc2e":"getGeneralLength()","6c510377":"transferOutAllEthers()","6c51af67":"setPOOL_edit_17(string)","6c525b13":"unregisterSelf(address)","6c525d04":"endMigration()","6c526503":"AmountRaised()","6c52660d":"checkIfNameValid(string)","6c530ee3":"weiPerEth()","6c5376c9":"addPassword(string,string,string)","6c543c08":"_emitSkillCategoriesSet(address,uint256,uint256)","6c54d1c1":"KRYPSTRONG()","6c54df52":"getCurrentPrice(address,uint256)","6c5541b5":"changeSpender(address)","6c556859":"createGame(string,string,uint256,uint256,string,string,string,string)","6c55e385":"minimalFreeze()","6c5649d8":"setCommunityBallotCentsPrice(uint256)","6c56a3f1":"startRelease()","6c56bf3e":"CreateARCD(address,uint256)","6c56bfc0":"InitiateGame()","6c572104":"TotalSantaCoinsGivenByNorthPole()","6c57c01f":"MAXIMUM_CONTRIBUTION()","6c57dbaa":"_max(uint256,uint8,uint256)","6c57f5a9":"isDisabled()","6c587491":"playGame(address,uint256)","6c595451":"addApp(string,address,uint256)","6c597e41":"getCreditBitAddress()","6c59fb29":"allocateToken()","6c5a7d1e":"setDisabled(bool)","6c5aad6e":"fetchOrderByIdWithMerchantByAdmin(string,address)","6c5aaf50":"getDelegateDetails(address)","6c5af719":"getHoldEarnings(address)","6c5b685f":"icoPart()","6c5bde2a":"CoInsureBlockToken()","6c5c671f":"cancelIntl()","6c5ca1fa":"exchangeRateRoundOne()","6c5ccfe8":"distributeFundsInEscrow(address,address,uint256,address)","6c5d2787":"setTymTokensPercent(uint256)","6c5d6156":"burn(address[])","6c5dc78b":"setPublicSaleFinishDate(uint256)","6c5dee17":"getFileAt(uint256)","6c5e9ac1":"cmpEq(uint256,uint256,bool)","6c5e9e18":"_phase1Supply()","6c5f71c7":"numberOfPingsReceived()","6c5f8394":"DeneumToken()","6c609906":"getTotalTokensAgainstAddress(address)","6c6101fd":"ContractManagementUpdate(string,address,address,bool)","6c610f53":"getMinUnitPrice(uint8)","6c617048":"reinvestFor(address)","6c6288e4":"Thechampcoin()","6c6295b8":"setValidRateDurationInBlocks(uint256)","6c64a678":"unfreezeToken()","6c658a2c":"UpdateICOPhase(address,uint256,uint256)","6c65c455":"swapETHMKR(uint256,uint256)","6c65fd6a":"isFreezer(address)","6c675ae6":"tokens_buy()","6c677d82":"SpentTokens(address,address,uint256)","6c68c837":"verifyBalanceProof(address,uint32,uint192,bytes)","6c698882":"getActualNum(uint256)","6c699905":"revealWinner()","6c69ab24":"multitokensCount()","6c6b23d2":"updateBalances(address,address)","6c6b298a":"getMigrateInBonusIfInForkWindowValue()","6c6b9870":"updAirDropTokenEnabled(bool)","6c6c21af":"CappedCrowdsale(uint256,uint256,uint256)","6c6c39fb":"votersLength()","6c6c7e05":"amountLocked()","6c6ce21a":"setInvoice(bytes32,uint256,bool,string,string,string,string)","6c6d2653":"CrowdsaleChanged(address,address)","6c6e5108":"StoriqaCash()","6c6eb9d1":"base(uint256)","6c6f1d93":"getContractCreationValue()","6c6f31f2":"allow(address,uint256)","6c6f360e":"userRegister()","6c6fbd70":"EnergiToken()","6c7018cf":"single_card()","6c706093":"logUniverseCreatedCalled()","6c70abda":"use(uint8,uint8,uint8,uint8[176])","6c70ad0d":"PublicMineCallsCount()","6c7113e4":"getFundManager()","6c712471":"testControlRetractLatestRevisionEnforceRevisions()","6c71b1aa":"setGasReq(uint256)","6c71d01d":"ratings(bytes32)","6c720446":"isVotingPrepare()","6c7272ce":"registerVendor(address,address)","6c73d230":"logResult(string)","6c741950":"setTTL(uint256)","6c749c26":"EXA()","6c74e341":"setFoundingTeam(uint256[],address[])","6c751622":"MacQueenToken()","6c7521cb":"updateReputationScoreInBulk(address[],uint256[])","6c767f20":"playerOneReveal(bytes32,bytes32)","6c768200":"burnByOwner(address)","6c76b8f4":"_changeReward(uint256)","6c779d57":"levelSplits(uint256)","6c77f989":"joinLottery()","6c780868":"getBurnLine()","6c784995":"getBeneficiaryMarket()","6c786b65":"bonusAccountCount()","6c787229":"availableOwnerWithdraw()","6c788a0d":"bookingFee()","6c789092":"Resource(bytes32,bytes32,bytes32,address)","6c78cb81":"ETCToken(address)","6c78da22":"getPrefixPrice(string)","6c79e379":"setGallerySevenPrice(uint256)","6c7afaba":"regSpots(uint16,uint16,bytes32)","6c7bc902":"tgrCurrentPartInvestor()","6c7c7c73":"bePure(uint256,uint256)","6c7c909f":"FreshWaterFlow()","6c7ca99f":"RequestBankrollPayment(address,uint256,uint256)","6c7cc6d8":"sell(uint256,address,bool)","6c7d4c4c":"unwhitelistAddress(address,address)","6c7dde15":"validPayBuff()","6c7de422":"investmoretokens()","6c7e0236":"isNotaryVeredictValid(address,address,address,bool,bool,bytes)","6c7e7082":"overflowAmount()","6c7f1542":"balanceOf(bytes32)","6c7f3f17":"totalBuys()","6c811247":"showPlayerSafeByAddress(address,uint256)","6c814509":"setAdAccount(address)","6c81fd6d":"AddModerator(address)","6c82337e":"payJackpot4()","6c825035":"withdrawLRC()","6c830f4b":"getCompletedTasks()","6c83444d":"FLOQI()","6c8381f8":"candidate()","6c8429fd":"jpMinBet()","6c843605":"BrownieCoin()","6c84a4bf":"tokenContributionCap()","6c84ae04":"setFirstYearAllowancePercentage(uint8)","6c85c727":"removeBankroll(uint256,string)","6c85cf67":"canTransfer(address,address)","6c86888b":"testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)","6c86ac5a":"getPublicData(uint256)","6c8716d8":"etherLowLimit()","6c876e5d":"s2(bytes1)","6c8830c5":"_maxtotalSupply()","6c8a59f2":"addresses6(uint256)","6c8ae38c":"r()","6c8b052a":"numStakers()","6c8b37eb":"MTRCToken(address,string,string,uint256,uint256)","6c8b4e60":"communityLock()","6c8d0b1e":"getSubscriberStatus()","6c8d0bcf":"getUserDAOsId(address,uint256)","6c8d65dc":"phepsToken()","6c8dea3b":"claim_ENS_name()","6c8e44c3":"ProductionUnitToken(address,uint8,uint8,uint8,uint256,uint256,uint256,uint256)","6c8e53e0":"PreSale()","6c8f093d":"PayForServiceCHLEvent(address,uint256)","6c8f455c":"checkMembership(bytes32,uint256,bytes32,bytes)","6c90c3df":"setCanClaim(bool,bool)","6c90fe09":"CcoindDigital()","6c912080":"minListingSeconds()","6c922038":"CMAPToken()","6c9230db":"getCurrentTimestamp()","6c94d0e4":"INBETToken()","6c953719":"CCASH(uint256,string,string)","6c958f74":"tokensOfferedOf()","6c963fc7":"PoWAdvCoinToken()","6c965a81":"claim(address,bytes32,string,bool,uint256,bytes32,uint256,bytes)","6c973248":"getVoteCount(uint256,uint256,uint256)","6c9784b1":"_getTokenRaised(uint256)","6c9789b0":"finalize(bool)","6c97a812":"UTExchangeRate()","6c97b731":"TimeEndChanged(string,uint256)","6c97c237":"firstSellSaddleShop(uint256,uint256,uint256)","6c981488":"paymentPeriods()","6c996bbd":"disputeOpened(address)","6c99b0da":"setFWDaddrETH(address)","6c9a1e2a":"setPOOL_edit_12(string)","6c9a5c61":"resolveExpiredBets(uint256)","6c9c1d41":"checkServiceFee(address)","6c9c2faf":"getSupply()","6c9c5944":"freeze(address,uint256,uint256,uint256)","6c9c97d8":"refundByToken(uint256)","6c9cb82f":"freeCash()","6c9d99da":"teamTokensWallet()","6c9e27d6":"ALLOC_WINGS()","6c9e89b6":"addVesting(address[],uint256[],uint256[])","6c9eafe7":"stillAllowed()","6c9f65c5":"getBidInfo(uint32)","6c9fa59e":"shareToken()","6c9fca89":"updateAppInstance(bytes32)","6ca0101e":"unopened_bid()","6ca06072":"getAttributeAdminAddr(address,bytes32)","6ca0f321":"setValue1(uint256)","6ca100fb":"firstWeekMainICOBonusEstimate()","6ca13df1":"decreaseOwnershipTokenCount(address,address)","6ca1f933":"setTest(uint256)","6ca32280":"percentageBuyBackFund()","6ca34ea2":"balances_(address)","6ca35ae4":"addDoctor(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)","6ca3b5f6":"set_maxgasprice(uint256)","6ca3daf2":"_vouchersDistributed(uint16)","6ca3fc3b":"distributePrizes(uint256)","6ca562d6":"switchCompatible223ex(bool)","6ca596fa":"isPreICOClosed()","6ca5b5b0":"r1()","6ca5bdf2":"testIntDynArray(int256[])","6ca621bd":"setEmbassy(address)","6ca78a1c":"anyRequestAvailable()","6ca78a1e":"setBorrowerReturnEthPerFiatRate(uint256)","6ca7b99b":"getDirection(uint256,uint256)","6ca7c216":"gas()","6caa2bda":"OxyToken()","6caa736b":"fundDeposit()","6caabc6f":"addCompany(string,address,uint256)","6caca63a":"WhiteTigerToken()","6cad3fb0":"updateFeePercentage(uint256)","6cadd040":"EtherAuction()","6caddb04":"orders(uint256,address)","6cae8f67":"setSellableToken(address)","6caed305":"changeBonus(uint256,uint256)","6caf25ce":"price1()","6caf3673":"getPlayerSpaceshipBattleStakeById(uint256)","6cb04993":"forceNeuroChainAddress(address,string)","6cb0e9f0":"TXToken(address)","6cb136ba":"isActive(uint16)","6cb1630f":"withdrowTokens()","6cb24199":"withdraw(bytes32,uint256,address,uint256,address)","6cb30fee":"nettingContractsByAddress(address)","6cb31171":"_currentHalfYear()","6cb39448":"getMarketerKey()","6cb3c94e":"Filler()","6cb3d30a":"triggerTryAuth()","6cb3e8ef":"getApprovers()","6cb45694":"LogDisbursement(address,uint256)","6cb520c6":"_play(string,uint256)","6cb5291e":"ICO_PRICE1()","6cb5714c":"_sendByTranche(bytes32,address,address,address,uint256,bytes,bytes)","6cb5d070":"getCoinsSinceLastHatch(address)","6cb69c2c":"setDevTokensWallet(address)","6cb69f42":"getSystemInfo()","6cb6ea82":"CBITokenCrowdsale(uint256,uint256,uint256,uint256,uint256,address)","6cb7223c":"maxPurchaseOnce()","6cb76408":"returned()","6cb78983":"purchaseMIT(address)","6cb90a2c":"pre_ico()","6cb942ab":"GameItemNew()","6cba45b8":"setDayFirst()","6cbad471":"Rappo()","6cbae51b":"firstPreSaleDate2()","6cbaecbd":"normalRoomMin()","6cbb1afa":"setTokenBag(address)","6cbb9d19":"releaseEscrow(bytes20,address)","6cbc2ded":"endGame()","6cbc9ca0":"ADDR_OWNER()","6cbceeec":"theAddress()","6cbdb7d0":"takers(uint256)","6cbec01c":"Steel()","6cbef5a7":"sumVote()","6cbf3c8c":"ICO_POOL()","6cbf9c5e":"commitVote(uint256,bytes32,uint256,uint256)","6cc03315":"getPaymentLogN()","6cc09081":"getActualPrice()","6cc23437":"setIsContainerForFeeWindow(bool)","6cc25db7":"ticket()","6cc2c668":"_presaleEndTimestamp()","6cc301e3":"permitted(address)","6cc341f1":"getIndexOrder1(uint256)","6cc48d81":"_emitHeartBeat(bytes32,int256,int256)","6cc5ab24":"digithothToken()","6cc5f3ad":"getGames(uint256[])","6cc5fdaa":"setBytes32(bytes,bytes)","6cc61d86":"setSingleWithdrawMin(uint256)","6cc67aa5":"resetExplicitState(uint32,int64[2],int256,uint64,int8)","6cc6971b":"setNewStartDate(uint256)","6cc6cde1":"arbitrator()","6cc762d8":"lastWeiPricePerCWC()","6cc7d828":"investBalanceGot()","6cc919c8":"updateConfig(address)","6cc95f8d":"ALAX()","6cca5065":"QripplexToken()","6cca60ba":"gripWallet()","6cca7023":"DoubleSend(address,address,uint256)","6cca940a":"RusgasCrowdsale()","6ccab1f3":"wwasCoin()","6ccb5d02":"getShareholder(uint256)","6ccbb0ab":"withdrawBalances()","6ccbdbf9":"getHodlAmount(uint256)","6ccc3bdd":"whitelistBonusPercentage()","6ccce7a8":"getCapOfWei()","6ccd563d":"queueAuditRequest(uint256,uint256)","6ccd5cbe":"getClassInfo(uint32)","6ccd993b":"getDestroySharesFxpValueValue()","6ccde640":"getGoodPreset(bytes32)","6cce15d8":"ICOFails()","6ccf93d3":"HeyueToken(address,uint256)","6cd02297":"processOfflinePurchase(address,uint256)","6cd05e41":"takeAllTheMoney(address)","6cd0f102":"setHouseEdge(uint256)","6cd186ce":"setUncleSafeNr(uint256)","6cd1b26c":"setQueue(uint256)","6cd22eaf":"updateAuthority(address,bool)","6cd2ad56":"distributeTo(address)","6cd2b458":"splitsTotal(uint256,uint256)","6cd2f731":"setTimePerPeriod(uint256[5])","6cd38ea0":"NebulasToken(address,uint256)","6cd3d326":"getTotalChild(address,address)","6cd40993":"setNeironixProfitAddress(address)","6cd44d55":"pushOrderOfVendor(address,uint256,bool)","6cd49925":"currentLocation()","6cd51833":"initiateWithdraw(uint176,uint64)","6cd522f2":"getContributionRNTB(address)","6cd56641":"EYrickCoin()","6cd56878":"setDeveloperWallet(address)","6cd5c39b":"deployContract()","6cd6043a":"emitAndStore()","6cd61739":"getbuyprice()","6cd7d86e":"setClaimRepository(address)","6cd8015d":"setVestingWithDefaultSchedule(address,uint256)","6cd8f433":"canExport()","6cd8f772":"fights()","6cd8fa85":"burnTrusted(address,uint256)","6cd902d0":"Casa()","6cd9786a":"setCapETH(uint256)","6cd98f30":"getResponseQueryType(uint256)","6cd9db29":"sub_matricola(string,uint256)","6cdacfc4":"startStage(uint256,uint256,uint256)","6cdae459":"YuanBaoCoin()","6cdb3389":"getEntriesCountForCompetition(uint256)","6cdb711e":"ProposalAdded(uint256,address,uint256,uint256,address,uint256,uint256)","6cdc644d":"CMTC()","6cdcb1ca":"DEVELOPER_supply()","6cde3c75":"frozenAccountICO()","6cde6380":"setHash(uint256,bytes32)","6cde71ee":"enteredTotalAmount()","6cde95ee":"getAccountAllowance(address)","6cdf4c90":"ownerSetMinBet(uint256)","6cdf7cdf":"FRO()","6cdfcc6e":"getTokenList(address,uint8,uint256,uint256)","6cdffb3c":"fetchJugadas()","6ce066af":"Give(bytes32)","6ce079fe":"getNumGames()","6ce07efa":"AddSale(uint256,string,string,string,uint256)","6ce0a6a4":"SafeBoxCoin()","6ce12737":"OX_TOKEN()","6ce1417e":"Fund()","6ce15a54":"genericAction(address,bytes32[])","6ce27c7b":"DECIMAL_INDEX()","6ce37387":"KindAdsToken()","6ce3fc06":"sendPrize()","6ce41ab4":"Garuda()","6ce4499c":"adjustCoins(address,int32,string)","6ce4a9a8":"RAMTOKEN()","6ce5b3cf":"releaseHeldCoins()","6ce62c61":"changeAllowances(address[],uint256[])","6ce6833d":"test_updateKey_increaseNoHint()","6ce768dd":"GetMainInvestor()","6ce76ae3":"openOldCrates()","6ce7e739":"getBonusRate(uint256,uint256)","6ce912ab":"LongevityToken()","6cea50a1":"crowdSaleStarted()","6ceac6e1":"TankDeposit()","6ceba55e":"change_fee(uint256)","6cebad98":"newUser()","6cebd885":"waraCoinTransfer(address,uint256)","6cec0ceb":"setDenominator(uint256)","6cec7f92":"canManage(uint32,int256,address)","6ceccc82":"changeICOAddress(address)","6cecdad9":"UpdateAttribute(uint256,address,bytes32,bytes32)","6cedc6ea":"tHasSubmitted(uint256,address)","6cee0d8b":"checkIfAllIQTDistributed()","6cee2d45":"STTR(uint256,string,uint8,string,address,address)","6ceec70d":"whitelistAdd()","6cef5ff4":"FundingAssetAddress()","6cf124c6":"toJackPotfromEveryTicket()","6cf1a452":"chgExchangeRate(uint256)","6cf1cb29":"setGen0SellerAddress(address)","6cf27311":"randomNumbers(address)","6cf32dde":"getMyGolds()","6cf339f8":"CardiumToken()","6cf35782":"m_funds()","6cf3b9e9":"checkBalance(uint256[])","6cf3c25e":"small()","6cf3d099":"dropEnd()","6cf43347":"returnString()","6cf49694":"tweakDailyDividends(uint256)","6cf4c88f":"removeApprover(address)","6cf69811":"trade(address,uint256,address,address,uint256,bool)","6cf6d675":"unbondingPeriod()","6cf70679":"removeFees(uint256)","6cf72694":"OAToken()","6cf75170":"cancelVote(address,uint256,uint256)","6cf761d4":"getMinConfirmationsByAddr(address)","6cf7cff6":"icoETHContributionLimit()","6cf7da53":"setMinerPrice(uint256)","6cf843ac":"LuckyToken()","6cf9bbf8":"setJackpotFactor(uint256)","6cf9cc58":"registerResource(bytes,uint256,bytes,string)","6cf9ea99":"Rhinex()","6cfab740":"RequiredBondRules(address)","6cfb0a4a":"test_oneValidEqBytes()","6cfb2c9c":"payoutToAddress(address[])","6cfb7101":"_emitMonthLimitChanged(bytes32,uint256,uint256)","6cfb782f":"TestWithdraw()","6cfc4512":"authorSignUp(address)","6cfc4ac5":"getGameEnd()","6cfc82ed":"trancheSize()","6cfdc242":"isSalesManager()","6cfe5947":"getCurrentICOPhaseBonus()","6cfedade":"refundTeamTokens()","6cff6f9d":"payoutOrder()","6cff8244":"controllerSucceeded()","6cffa0cd":"_transter(uint256)","6cffd817":"burnByAmount(uint256)","6cfff605":"releaseThreeHotHourTokens()","6d011a12":"scribes_hisory(uint256)","6d013618":"mint(address,uint256,uint256,string,string)","6d01d12b":"XeToken()","6d022003":"ALLOC_SALE_PRIVATE()","6d029f6a":"totalYUPIESAllocated()","6d02a595":"_setMintFeeAbs(uint256)","6d03d3ec":"HolderAdded(address,uint256,uint256,uint256)","6d03fa87":"getReferer(address)","6d04f50d":"mtronix()","6d0501f6":"mediator()","6d052b37":"getRequestByIndex(uint256)","6d052f56":"testBitsSetSuccess()","6d05c24d":"calcWidthraw(string,uint256)","6d05cef4":"getStageSupplyLimit()","6d05da7e":"tranchesCount()","6d061b69":"deathData_a3()","6d064875":"transferEducatedTokenOwnership(address)","6d064962":"getOwnerByShipId(uint256)","6d069c10":"_updateRaceWinner(uint256,uint256)","6d06bf0d":"celebOf(uint256)","6d06de2d":"haveAttributes(address,bytes32,address,bytes32)","6d076966":"VESTING_1_AMOUNT()","6d0797fc":"_isMatingPermitted(uint256,uint256)","6d07e3de":"sexToken()","6d07f295":"minEatable()","6d081d83":"zero_fee_transaction(address,address,uint256)","6d082bbb":"startSpreadingBlock()","6d0831f0":"BNNToken()","6d08bad2":"currencyToHash(string)","6d08e8f9":"initiateChallengeWithPastCustody(address,uint256,bytes32[],uint256[],bytes32[])","6d09e2ec":"commitCurrency(address,uint256,uint256)","6d0a98cc":"blockResolveDispute(uint64,uint64,bytes)","6d0b5ee2":"TeamFundsTokens()","6d0ca12a":"tokensBack()","6d0cc895":"getVersions()","6d0def6c":"SimpleDividendToken()","6d0e5c03":"stampToken(uint256,uint256,uint256)","6d0ecb88":"SohaibCoin()","6d0f131a":"DrawEvent(uint256,uint8,uint8,uint8,uint256,uint256,uint256,uint256)","6d0f157d":"setAllFreeze(uint256,uint256)","6d0f2a84":"changeDefendFee(uint256)","6d0f8806":"refundAdveriser(uint256)","6d102f71":"acceptOrder(bytes16)","6d106885":"unitUserBalanceLimit()","6d1150de":"endCurrentPhaseIn(uint256)","6d11cf72":"berrycoin()","6d11fe82":"_initAwardInfo()","6d121b91":"getMaxCap10X()","6d12301c":"getBetValue(bytes32,uint8)","6d12fb5b":"setSellable(uint32,bool)","6d1478e9":"_addToDebtRegister(address,uint256)","6d14b2a8":"JackpotAmount()","6d156add":"finalizePRETDE()","6d15a659":"Distribution(address,address,uint256,uint256)","6d15cecd":"getTokenRaised()","6d15dc5a":"BetPayout()","6d15f208":"reject(string,uint256,uint16,address,uint256)","6d160f31":"confirmReservedTokens(address,uint256)","6d161bc1":"setdot(address)","6d1669e1":"approveAndCall(address,address,uint256,bytes)","6d16f79c":"__transferWithReference(address,uint256,string)","6d16fa41":"transferControl(address)","6d171f0e":"changeRemainingSupply(uint256)","6d17af94":"ContributionMinted(address,uint256,uint256)","6d181a42":"FTV(address,address,address,address,address)","6d1821aa":"OrenCoin()","6d1884e0":"getEvent(uint256)","6d189422":"EtherFlipRaffleToken()","6d18c778":"PSIToken()","6d18dc63":"ATTR_TRADABLE()","6d1909fc":"transferIDCContractOwnership(address)","6d1917b5":"maxPurchaseNonWhiteListed()","6d19ce04":"STARTING_Dragon()","6d1a0d34":"ShowTime()","6d1af018":"getAmountRaised()","6d1b229d":"burnTokens(uint256)","6d1d71c5":"Note(address,string)","6d1da953":"createWithNonce(bytes32,bytes)","6d1e1f8d":"updateSale(uint256,uint256,uint256)","6d1e2194":"SALES_ALLOCATION_PPM()","6d1e8095":"transferGameOwnership(address)","6d1e839c":"changeMaxCap(uint256)","6d1ea3fa":"approvedTokens(address)","6d1eab7d":"getRegistryVersion()","6d1f00a6":"ThroneMaker(uint256)","6d1f451b":"multiSigWalletAddress()","6d201095":"PRICE_PRESALE_START()","6d214c66":"MBSibalCoin()","6d21f638":"SmartshareStandardToken(uint256,string,uint8,string)","6d224b7b":"weiPerABIO()","6d236703":"createMemoryArray(uint256)","6d2381b3":"addressAndBalance()","6d23bf0b":"ingresarFondos()","6d23c516":"s8(bytes1)","6d23cda3":"sub(uint16,uint16)","6d245bda":"lockUnlockGamblingPartyForBetting(uint256,bool)","6d2570fe":"Before(uint256,bytes32)","6d25924d":"setn(uint256,uint256,uint256)","6d25ba1d":"setTechBonus1(uint256,string)","6d2666b9":"lockInLastSixteenPrize()","6d275e9e":"distributeEbyte(address[],address,uint256,uint256,uint256)","6d277279":"getAuctionsCreated(address)","6d278b29":"setHoldMax(uint256)","6d27a326":"turnOnFurnace(uint16[5],uint128)","6d28e805":"getInsurance(bytes32,uint256)","6d290d34":"setAllocation(address,uint256,uint256,uint256,uint256)","6d295e24":"callDefaultAction()","6d2980f6":"TEAM_LOCK_DURATION_PART1()","6d2a7c8b":"createAuction(uint256,uint256,uint256,uint256,address,uint64)","6d2ab982":"presaleFemaleDiscount()","6d2bf99c":"updatePercentBase(uint256,uint256,uint256)","6d2c51a7":"countrySupply(uint256)","6d2cb794":"airaTransfer(address,address,uint256)","6d2d4e52":"lockSupplierAndLockPosition1(address,address)","6d2d525d":"FFUELCoinTokenCrowdSale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,address,uint256)","6d2dd1a9":"getDividendsForOnePeriod(uint256,uint256,uint256,uint256)","6d2ff3d3":"Geniota(uint256,string,uint8,string)","6d301f38":"MIDO()","6d3036a7":"MAGNITUDE()","6d308c40":"changehiddenOwner(address)","6d30921c":"proceedDividends(uint256)","6d30d07f":"getMiniPoolEdit_6()","6d312683":"feeInCirculation()","6d320b17":"minimumEntryThreshold()","6d32a4a6":"finishRoundD()","6d32dc4b":"startElection(uint256)","6d338bd0":"setCCH_edit_22(string)","6d339f02":"_oldConfig()","6d33b42b":"changeLimit(uint256)","6d33f5a6":"updateNoteContent(uint64,bytes)","6d34a775":"getDatas()","6d35b1dc":"getExtraDays()","6d361694":"getModel(uint256)","6d36ebf8":"addPlayer(address,bytes32)","6d37a9dc":"LCT()","6d38156f":"getCountOfIntegerTypes(uint8[])","6d399eb7":"MAX_AIRDROP_VOLUME()","6d3b5f18":"getUserByID(uint256)","6d3c7ec5":"setDefaultPrice(uint256)","6d3d0a8f":"disagree()","6d3de7ea":"beManagerInsurance()","6d3e141e":"functional(address,uint256)","6d3e1a74":"PiBetaToken()","6d3e4502":"DatToDtrcDenominator()","6d3f008a":"FinalizedTier(uint256,uint256)","6d3f1277":"flagAndFinalize(uint256)","6d4045a8":"EXOSO()","6d40ee41":"CloseDonation()","6d40f3b0":"PHASE_OPEN()","6d417064":"expirationBlock()","6d41a3fb":"firstAuctionsExtendedChunkDuration()","6d425249":"minerNum()","6d435421":"transferOwnership(address,address)","6d43b489":"freeTokens(address,address,uint256)","6d4419e5":"listTopics()","6d44a9cf":"KudosPresaleTokenLockup(address,address)","6d4546a2":"changeTsaLink(string)","6d46398b":"newChannel(bytes32,address,address,bytes,uint256,bytes,bytes)","6d467f04":"ContractTransfer(address,address,uint256,bytes)","6d46c6f5":"referrer1Percent()","6d4717fe":"noFeesList()","6d47ab72":"sellers(address)","6d47fb71":"changeICO(address)","6d47fc60":"Changepro()","6d489314":"terminateLastMilestone(bytes32,address)","6d48ae25":"best_submission_accuracy()","6d492f54":"sendFyle(address,address,string)","6d493bf9":"SOLARCHAINToken(string,string,uint8,uint256)","6d498093":"presaleFinalized()","6d49817b":"refundPayment(address)","6d4a37ef":"cancelEscrow(bytes16,address,address,uint256)","6d4b38a2":"infraIndexToOwner(uint256)","6d4bae72":"_register2(address,bytes32)","6d4be70f":"ethereumSHA3(bytes20,uint24,uint32)","6d4c80ea":"removeNamespaceMember(string,address)","6d4ce63c":"get()","6d4d907c":"maxNumVotesPerAccount()","6d4ee68f":"SendBobsCoin()","6d4fd0ad":"isNull(address[])","6d4fd338":"PPToken()","6d4fe435":"counter_in()","6d505b49":"randgenNewHand()","6d50a2b5":"deleteAllBackgroundImages()","6d50ef2a":"timelockedTokensDisbursed()","6d510a64":"ourTEAM()","6d510f6c":"updatePartners(address)","6d5210d9":"showprize(address)","6d522b19":"multiAccessChangeRequirementD(uint256,address)","6d52f9d5":"mapToNewRange(uint256,uint256)","6d53393b":"getInitializeCreatorValue()","6d538264":"setMigrateAddress(address)","6d540318":"revokeOracle(address,uint256)","6d5433e6":"max(uint256,uint256)","6d54340a":"Blockbin()","6d544e6e":"setStackSize(uint256)","6d54ec91":"registerAndActivateDevice(bytes32,bytes32,bytes32)","6d568c43":"weiToCents(uint256)","6d56d9f4":"setAuction(uint256,uint256,uint256)","6d578781":"changeStageBlcok(uint256)","6d57b2b1":"tokenInitialDetails()","6d57dee4":"sendTokenAw(address,address,uint256)","6d57e2a9":"getAgonIdArray(address)","6d580320":"G2UFundDeposit()","6d580bcb":"FOUNDERS_CAP()","6d584266":"ALLOC_SALE_GENERAL_3()","6d5860d4":"revert(string)","6d58c88f":"changeDepositAddress(address)","6d599136":"personal_withdraw(uint256)","6d59c3be":"buyUFT(address)","6d5b0f6f":"transferCustodian(address,address)","6d5b9427":"onlyWithValidSignature(bytes)","6d5c1621":"LogInsert(address,uint256)","6d5cae52":"QiongB(uint256,string,uint8,string)","6d5d21a9":"setStubFund(address,address)","6d5d7612":"MAX_WITHDRAW_PCT_DAILY()","6d5da09a":"LockChain()","6d5e136d":"_getApproved(uint256)","6d5e3587":"needsEther(string)","6d5e53f6":"createInt256(bytes32,int256)","6d5e78f9":"depositorLimit()","6d5f3e15":"settleBet(address)","6d5f6639":"objectProposal(bytes32)","6d608402":"sendBPESOToken(address,uint256)","6d60bf39":"getPreEntranceFrom()","6d60e6b4":"trustAddress()","6d619daa":"storedValue()","6d624e86":"SideJobCoin()","6d62a4fe":"canTransfer(address,address,address,uint256)","6d63fa32":"getPixelNumber(bytes1,bytes1)","6d640637":"testBetId()","6d643308":"icoDeadLine()","6d64694f":"etherdelta()","6d64a472":"claimSalesAgent()","6d64abd6":"takeEther(address)","6d650b2d":"level_7_percent()","6d66264f":"specifyController(address)","6d6712d8":"hasPermission(address,address,bytes32)","6d6755a6":"gvpe_per_eos()","6d6908bd":"mintTokensBatch(uint256,address[])","6d69fcaf":"addSupportedToken(address)","6d6a01f6":"second_partner_address()","6d6a2859":"assetID()","6d6a4889":"nextReleaseTime()","6d6a6a4d":"decimalFactor()","6d6a761e":"setCouponToken(address)","6d6bc5f5":"identifierToCoordinate(uint256)","6d6c0ec4":"mintProxy(address,uint256)","6d6c2074":"totalTokensForSaleDuringICO3()","6d6caeb2":"poolCapUSD()","6d6d69b6":"allowedToSell()","6d6d70d9":"connectModule()","6d6dcbe7":"deleteResponse(uint256)","6d6e2710":"clearCrowdsaleOpenTimer()","6d6e8312":"addProviderAdmin(address)","6d6ead75":"reject(uint256,address,uint256,uint256,address)","6d6ebb01":"thawSomeTokens(address,uint256)","6d6f385c":"isSaleFinished()","6d6fa6b1":"FNKOSToken()","6d6fb665":"CUSTOM_ERC20_MINT_SERVICE_NAME()","6d701f0a":"Eos()","6d704159":"wdBefore()","6d705ebb":"register(address,uint256)","6d70f7ae":"isOperator(address)","6d717daf":"Albarit()","6d71be4c":"increaseReserve(uint256,uint256)","6d7221d5":"doubleClaimSegmentSlashAmount()","6d72da47":"addElection(address,uint256)","6d730453":"TokensTransferedToOwner(address,uint256)","6d736fac":"feeAccount2()","6d763a6e":"getLeaderboard()","6d771f77":"one_month()","6d773cd0":"balance_out()","6d77cad6":"isOperatorForPartition(bytes32,address,address)","6d77e144":"removeBlacklistItem(address)","6d786740":"billingPeriod()","6d788933":"_distribution(address[],uint256[])","6d78a434":"IntegrativeWalletToken(uint256,uint256,uint256,address)","6d78e48a":"candidateTillXPAAssets()","6d79207c":"SALE_DURATION()","6d796253":"configRoundKey()","6d7a0f89":"EmptiedToWallet(address)","6d7a2609":"setSpenderAddress(address)","6d7a37b6":"OCPresale(address,address,uint256)","6d7ab187":"AcceptsGMOON(address)","6d7b3706":"setfees(uint256,uint256,uint256,uint256)","6d7bc487":"RESERVED_TOKENS_FOR_FOUNDERS_AND_FOUNDATION()","6d7bd3fc":"BANCOR_FORMULA()","6d7cb00c":"CoinMarks(uint256,address)","6d7d083f":"handleFunds()","6d7da0b1":"MyContract()","6d7fa14e":"CQC(uint256,string,uint8,string)","6d7fd1bf":"getIpfs(uint256)","6d7fd8a3":"pauseRefund()","6d80244d":"createUnitOmni(uint32,address)","6d805b2d":"withdrawMana(uint256)","6d813e63":"owner_viewOnFlight()","6d81779b":"teamCap()","6d836cde":"updCouponBonusEnabled(bool)","6d8370e9":"upgradeTusdProxyImplTo(address)","6d842ad5":"NewBOP(address,address,uint256,uint256,string,string)","6d843c2f":"participatedInAirdrop(address)","6d84dbb0":"BeijingCoin()","6d853ab6":"isSubUser(address)","6d863fd7":"airDropSingleAmount(address[],uint256)","6d86ac59":"DUMPSACK()","6d8758c7":"editCuts(uint256[6])","6d877f91":"Bob()","6d87b65c":"setPropertySalePrice(uint16,uint256)","6d88885e":"schoolOrdering()","6d892f7e":"deauthorize(address,address)","6d893a5a":"deathData_a8()","6d8941cb":"smallBonusPercent()","6d8a3650":"dedex(address,address,address,uint256,uint256,uint256)","6d8a5f8f":"CAP_ICO()","6d8a74cb":"getRoom(uint256)","6d8a9f92":"setSavedEthBalance(address,uint256)","6d8ab124":"containsPosition(bytes32)","6d8b529a":"OwnerBase()","6d8c3912":"AicToken()","6d8d151b":"determineBonus(uint256)","6d8d16b9":"StandardToken(string,string,uint8,uint256)","6d8f01d1":"CEOSignature()","6d8f4221":"masternode()","6d8f83cf":"_getBonusAmount(uint256)","6d90164e":"GetPrice()","6d91acba":"proposalText(uint256)","6d9218e5":"Notes(address,address)","6d927db0":"withdrawBalanceMaxSteps(uint256)","6d94425c":"_maxPeriodSalesLimit()","6d94dce1":"createAndBookCanvas(address)","6d952117":"maxBuyPrice()","6d9634b7":"releaseTokens(address[])","6d963a81":"buyp3d(uint256)","6d96a2aa":"delegateAddress()","6d96b537":"_computeIncentiveReward(uint256,uint256)","6d974ee2":"AcceptRealmOffer(uint256)","6d97537a":"TestRushCoin()","6d97786e":"sell(address,uint256,string)","6d97c665":"tokenBonusForSecond()","6d9814e1":"BToken()","6d98571a":"generalTokens()","6d9860d0":"makeFinality(uint256,address,address,bytes32,bytes32,uint256,uint256)","6d98c5e7":"AppleToken(uint256,string,string,bool)","6d98e9fc":"totalWei()","6d98ee4e":"getInitialState()","6d991cce":"openGroupNumber()","6d99aafd":"Collected_Ether()","6d99f652":"resetRaffle()","6d9aa034":"setNamePublicKeyAddress(address)","6d9af813":"updateprice(uint256,uint256)","6d9b06e8":"setProposalDeposit(uint256)","6d9c2bda":"ADV_TEAM_LOCK_TIME()","6d9c8e86":"getCurrentSaddlePrice(uint256)","6d9cb37d":"govtAccount()","6d9cdbc6":"WALLET()","6d9cebb2":"setDiscount(uint8)","6d9d39b6":"isItOpen()","6d9d495f":"minMktTokens(address,uint256)","6d9dcdb9":"tgrNextPartContributor()","6d9f4eeb":"artistTrackCount(address)","6d9fed84":"getJackPotInfo()","6da05cc7":"sectionAvailable(uint256)","6da05f0f":"_requestRandom(uint256)","6da1339c":"_deposit(address,uint256)","6da1833c":"getInstitutionByName(string)","6da1d37a":"sumWei()","6da246ac":"approvePartnerAllocation(address)","6da28481":"balanceOfLockup(address)","6da36c06":"contract_admin()","6da3cd1a":"verifiedUsersOnlyMode()","6da44d61":"SportX()","6da49b83":"nodeCount()","6da4edff":"getPriceSpeedPercent()","6da4fd5c":"TheBeardToken()","6da4fe26":"nextReward()","6da50777":"FreddieToken(address)","6da61d1e":"payoutOf(address)","6da66355":"pause(string)","6da705f5":"isOwnerOfJob(address,bytes)","6da72e7a":"reclaimByReceiver(uint256,address,bytes32)","6da78903":"SwapCreated(address,uint256)","6da79a93":"bid(uint256,uint256,uint256,address)","6da84ec0":"calcMarketFee(bytes32,uint256)","6da9a969":"toBRFWEI(uint256)","6daa212f":"applyPayback(address,uint256)","6daa2d44":"raiseDispute()","6daa9f56":"setExhaustionTime(uint256)","6daaf67b":"REFERRAL_PROGRAMS()","6dabccc9":"setmsg(address)","6dabd069":"emission(address,uint256,bytes32,uint256)","6dac8bea":"PREMIUM_CATEGORY()","6dacda85":"LOCKPERIOD()","6dad2a91":"getWinningAmount()","6dae014c":"test_basic_sanity()","6dae022f":"verifyTx()","6daf0866":"Hungrify()","6dafc6b7":"destructOne(bytes32)","6db1218d":"getAPSchedule()","6db14a1c":"PaulSportsCoin()","6db17f8d":"KriptoNeed(uint256,string,uint8,string)","6db19eb8":"specialGym()","6db31c25":"pay(string,address,uint256,bool,bytes)","6db3a788":"createHero(string,uint256,uint256,uint256,uint256)","6db4ba51":"requireNotEmptyAddress(address)","6db4bbf0":"donotYYYDappToken()","6db5c8fd":"maxDuration()","6db5d3b7":"modifyCommission(uint256,uint256)","6db66268":"remainingTokensPerPeriod()","6db736df":"Writers(address)","6db75799":"set_amount(uint256,uint256)","6db76efd":"decreaseFrozenBalances(address,uint256)","6db7f77c":"requestEarlySettlement()","6db90900":"returnAllRoomsBalance()","6db9ec44":"IWTfund()","6db9ee4d":"MixenCoin()","6dba46ac":"aprMintAdjustment()","6dbb7bcd":"getExecutorRegistry()","6dbd6689":"gupSold()","6dbe060d":"hashTest(string)","6dbe21b8":"setBounty()","6dbe2ebc":"calcUserDivsTotal(address)","6dbe31eb":"testSubBalance()","6dbe4bee":"MoonToken(uint256,string,string)","6dbf8108":"withdrawBounty(address)","6dc043d7":"draw_number()","6dc0a997":"pushAllocation(address,uint256)","6dc12f1c":"EvMigration(address,uint256,uint256)","6dc1a075":"setMaxOpenAttacks(uint256)","6dc1f360":"VersionControl()","6dc214af":"bitCrystalEscrow()","6dc34462":"Timed(uint256,uint256,uint8)","6dc37dee":"changeReviewRules(uint256)","6dc3e97e":"addGame(bytes32,address,address,uint256)","6dc3edcf":"executeExecutable(uint256,uint256)","6dc455a4":"WinnerWithdrew(address,uint256,uint256)","6dc4faea":"withdrawnTeam()","6dc51f1e":"advisoryBoardFundManager()","6dc55f7e":"RANGEEND_7()","6dc56397":"career_path()","6dc57da6":"getTimestampOfDayStart(uint256)","6dc585b6":"toRICH(uint256)","6dc7a627":"canClaim()","6dc7d164":"addSignature(uint256,uint256,address)","6dc88e1f":"addAngelIdMapping(address,uint64)","6dc8dbd4":"calculateMaxTokensIssued()","6dc92426":"makeSellOrder(address,uint256,uint256)","6dc944f6":"withdrawTotalDevEarned()","6dc9ab89":"get_orderAddress(address,address,uint256,uint256,uint256,uint256)","6dca35da":"newCampaign(uint256,address,uint256)","6dcb0cf8":"typeOf(address)","6dcb672b":"EBanker()","6dcba059":"goToNextStep()","6dcd16d7":"computeBids(uint256)","6dcd6eb9":"withdrawPendingAmounts()","6dce14cd":"LBTokenSale(uint256,uint256,uint256)","6dcea85f":"setMarket(address)","6dd01116":"getWishContent(uint256)","6dd0c3d8":"setENGDevAddress(address)","6dd0c51e":"RESERVED_STAFF_GROUP()","6dd0d091":"retaliate()","6dd13a29":"ICOStarted(uint256,uint256,uint256,uint256)","6dd186c4":"YeYingOil()","6dd1f71c":"RTokenMain(uint256,string,string,uint8,address)","6dd22ccd":"getMixParticipant(bytes32,uint256,uint256)","6dd23b5b":"constructor(address,address,address)","6dd28241":"deprecatedSince()","6dd2bfca":"setDevfee(uint256)","6dd35c7b":"topBalance(address,uint256)","6dd3a823":"Neptun()","6dd40168":"preSaleMinimumWei()","6dd40905":"getQuestionVotesAllCount(string)","6dd43d1f":"attachSubscriptionModule(address)","6dd4927b":"reName(string,string)","6dd4c13c":"allowsSignup()","6dd5b69d":"getConfig(bytes32)","6dd5bb11":"oraclize_query(string)","6dd6e673":"buySanSlot(address,uint256)","6dd6e87b":"checkOut(int256)","6dd749ba":"getSpaceById(uint256)","6dd77c5d":"etherToUSDRate()","6dd7d8ea":"vote(address)","6dd8d3bf":"buy_energy(address,uint32,uint32,uint64,uint32,uint64)","6dd9fde9":"transferTokensToNonEthBuyer(address,uint256)","6dda1291":"hotPotatoPrize()","6dda9b24":"bva(address,uint256,address)","6ddc7e65":"gracePeriodAfterRound0Target()","6ddd07f8":"getEngineById(uint256)","6ddd707f":"TDTToken()","6dde33ea":"deathData_a13()","6dde8b18":"removeWhitelistedTransfer(address,address)","6ddf09c4":"ICToken()","6ddf12ae":"ecdouble(uint256[3])","6de00927":"GetUserRank(uint8,address)","6de09e28":"affiliatesAllocAddress()","6de0b375":"openBet(uint256)","6de12905":"updateMeta(string,string)","6de343cd":"SNTPlaceHolder(address,address,address,address)","6de3afc9":"EduCoin()","6de53001":"clearApproval(address,uint256)","6de5897c":"ECOMCASH()","6de60a07":"ContinueSuspendedEmployee(address,uint32,uint32)","6de6220b":"OwnerO()","6de65097":"OwnerRemoved(address,bytes32)","6de685f6":"START_TIME_SALE()","6de74bbe":"setratePreSale(uint256)","6de758a1":"PWGLToken(address,address)","6de79d17":"TIANYECoin()","6de7a31d":"getEvotTokenAddress()","6de84a4f":"bankMultisig()","6de996b4":"getPlayerSpaceshipAuctionPriceById(uint256)","6de9ebb1":"setBlogRegistry(address)","6de9f32b":"tokensMinted()","6dea2088":"MAX_FUNDS_RAISED_DURING_PRESALE()","6deaf623":"calculateEthToVibe(uint256,uint256)","6deb515d":"disapproveInvestorsInBulk(address[])","6dec665e":"motionWaiting(uint256)","6dec7a93":"setInfo(string,string,string)","6ded82f8":"isPaid(address)","6dee2032":"getOpenOrdersOf(address)","6dee275a":"c_STQperETH()","6deebae3":"subtract()","6deefc7a":"sellable()","6def1efc":"getPreviousFeeWindow()","6defbf80":"ready()","6defd595":"getCovfefe(uint256)","6defe0b9":"isTimeOver()","6defe888":"Criptomedicina()","6df006f3":"frozenToken()","6df03165":"setTimeOutAuthentication(uint256)","6df088bf":"winnerDecided(uint256,address,uint256)","6df0a7e7":"setContract(string,string)","6df0b557":"getPlayerSpaceshipAuctionById(uint256)","6df15719":"STWY()","6df1667c":"same(string,string)","6df26327":"additionalEmission()","6df26d14":"startEarlyStage1()","6df3edef":"getSavedBytes()","6df55024":"LogBuyTokens(address,uint256,string)","6df5ee2b":"withdrawPresale()","6df6ca7a":"getDivsBalance(address,address)","6df7f38f":"sellForBitcoin(address,uint256)","6df83012":"startLockUpSec()","6df8359f":"WorkOrderStarted(uint128)","6df86816":"ActionAgonPlat(address)","6df99d81":"CCH_TEL_AVIV_01()","6dfa8d99":"totalEarned()","6dfada86":"mintToken(address,uint256,address)","6dfc15a4":"changelp6(address)","6dfc2fa8":"isInProgress()","6dfe512e":"initPGOMonthlyInternalVault(address[],uint256[])","6dfe869b":"Preallocation(address,uint256)","6dfe8a34":"setSkillName(address,uint256,bytes32)","6dff8216":"cbAddresses()","6e008b35":"calculateResult()","6e034f4d":"tokensaleBuyTokens()","6e038c4f":"firstTotalSupply()","6e051dba":"ReserveTokensHolderMock(address,address,address)","6e0550e5":"stepOneEndTime()","6e0560c3":"doNotAutoRefund(address)","6e05d3ca":"Z1CoinGenesis(address)","6e064f6a":"HedglyStakingToken()","6e06a9ce":"changeTimeOneSession(uint256)","6e06ac9d":"UNSPAM(string,string,uint256,uint256,bool)","6e0712b1":"setIcoParams(uint256,uint256,uint256,uint256,bool,bool,uint32,uint32,uint256)","6e075e30":"reinvestAmount(uint256)","6e0763f3":"RPNCoin()","6e07979d":"tokenBlogs()","6e080d86":"register(string,string,bool,string,address,uint256,uint256)","6e083bc7":"credoEthExchangeRate()","6e094b67":"TPS()","6e09a4ab":"diff(uint256[],uint256[])","6e0b0c80":"MIToken()","6e0bd282":"destroy(bytes32)","6e0c7867":"createDataObject(bytes32,address,bytes32,address,bytes32)","6e0cd415":"isPositionCalled(bytes32)","6e0d98fe":"setProbabilities(uint32[])","6e0da3ee":"WoodToken(uint256,string,string)","6e0da971":"tokensSoldIco()","6e0dd984":"setCapUsd(uint256)","6e0e7e85":"withdrawERC20Compatible(bytes32,uint256,uint256,uint256[])","6e0f8d68":"stage_1_price()","6e0fb1c5":"FOUNDER2_STAKE()","6e101967":"set_iconiq_pre_kyc_bonus_denominator(uint256)","6e106628":"getWinningReportingParticipant()","6e114511":"decreaseTotalSupply(uint256)","6e1180f8":"setOversightAddress(address,bool)","6e120023":"TimestampScheduler(address,address,address)","6e125009":"contractTokensAvailable()","6e1286fc":"getReward(uint256[])","6e12b46e":"requiredPoints()","6e13cdfe":"claimH2()","6e140e6c":"TetherToken(uint256,string,string,uint8)","6e1479c0":"testControlCreateNewRevisionNotOwner()","6e14b71b":"PetsCoin()","6e15266a":"fifty_two_weeks()","6e164e23":"claimTokens(uint256,address)","6e16f9ed":"iBird()","6e173a7f":"storeBlockHeader(bytes,bytes)","6e17e7c2":"nextFieldIndex()","6e18980a":"transferByLegacy(address,address,uint256)","6e18eba5":"ethUSDPrice()","6e18ff05":"getRefInfo(address,address)","6e1907cc":"test21(uint256)","6e1a1336":"setString(string,string)","6e1b6bcc":"checkMyBet(address)","6e1bd323":"MAX_TOKEN()","6e1cf038":"getNumNiceBets(uint256)","6e1d3c0d":"sudoku()","6e1d7d5e":"EtherIbe()","6e1e063f":"claimableRefund(address)","6e1e34c7":"TokensBoughts(uint256)","6e1ece25":"totalFeesValue()","6e1f777d":"createTokenToTeam()","6e2117f7":"forFunction()","6e217d30":"setBuyCourse(uint256)","6e219667":"p3()","6e21fc87":"_airdrop(address)","6e223710":"getRockInfo(uint256)","6e224034":"totalCrowdCoin()","6e22aea0":"AIW(uint256,string,string)","6e22d33e":"getBytesValue(string)","6e22e32b":"setMonethaAddress(address,address,bool)","6e233918":"buyTank(uint32)","6e241c5c":"_createExoplanet(string,address,uint256,uint32,string,uint32,uint8,string)","6e247f29":"Transfer_of_authority_logic(address)","6e2653ca":"AirSwapHandler(address,address,address)","6e275bd2":"transferFrom(address,address,address,address,uint256)","6e27d889":"lockTokens(uint256)","6e2857f2":"setEscrow(address,address)","6e287154":"setLocalRevenuPercent(uint256)","6e293817":"transferWithReference(address,uint256,bytes32,string)","6e2a2d0a":"result_amount()","6e2adeee":"SweetToken(string,string,address)","6e2bf348":"getDiscountByAmount(uint256)","6e2c10a1":"unitedNations()","6e2c732d":"add(uint64,uint64)","6e2cde85":"drawPot(string,string)","6e2d53a6":"TreasureCoin()","6e2d604a":"thrash()","6e2da4b3":"proposeAction(address)","6e2db8d7":"addWhiteList(address,uint256)","6e2e2e4d":"showMessage(bytes32,uint256,string)","6e2e9c3b":"contributedUsd()","6e2e9ee1":"setKYCRequiredToReceiveFunds(bool)","6e2ede03":"getCollateralMarketsLength()","6e2edf30":"ETCSurvey(address)","6e2f0bb8":"newSaddleryCon(address)","6e2f10bd":"changeMerchantBeneficiaryAddress(uint256,address)","6e2f5f12":"sendToFaucet(uint256)","6e2fd470":"sharedExpenseWithdrawn()","6e30418b":"totalPlayerBalance()","6e30d411":"showDevBalance()","6e317da7":"changeRedeemer(address)","6e321105":"losePercent()","6e32295e":"mDestroyTokens(address,uint256)","6e329aa9":"getPotato()","6e32cf8e":"admin_transfer_tempLockAddress(address,uint256,uint256)","6e33bc13":"COINS_TO_HATCH_1STRIPPERS()","6e349188":"MAXSOLD_SUPPLY()","6e3532fa":"getSubscriptionFee()","6e353435":"inputauction(uint256,uint256,string)","6e353a1d":"emergencyWithdrawal(address)","6e359afa":"changeTrueUSDOperation()","6e36893a":"ICOInvestment(address,uint256,uint256,uint8)","6e3706c8":"PRE_DURATION()","6e377202":"isAuthed(address,address)","6e3825d2":"checkMyTicket(uint32)","6e39891c":"currentDividendAmount()","6e39eb85":"resetNumberOfCandidates()","6e3ae353":"changeOrigDev(address)","6e3aff90":"getOrderString()","6e3bbebd":"ZJLTToken()","6e3c5759":"claim_partnerPreICOTokens(address)","6e3d5a9d":"getTopCompanyBlocksInBetween()","6e3de78a":"UNFOMO(string,string,uint256,uint256,bool)","6e3e1318":"takeFee(uint32)","6e3e82f9":"_computeCut(uint256,uint256)","6e3f3f1a":"proposal(address,uint256,address)","6e3f7ba0":"TokenFrozen(uint256,string)","6e3f8550":"walletReserve()","6e403cd7":"sendBread(address,uint256)","6e40975d":"ICOToken()","6e415d37":"farewellTo(address)","6e417c69":"executeRequest(uint256)","6e41a78f":"DRC()","6e41b1ad":"nameTaken(uint256)","6e41efb2":"ThawTransfers(address,bool)","6e4264ce":"initiateDeposit()","6e4324a3":"Cryptopus()","6e439078":"makeLogCancel(address,address,address,address,uint256,uint256,uint256)","6e441752":"teamToken2019()","6e44fcea":"isHoldTokens()","6e459cf1":"CrowdSale(address,uint256)","6e4602c8":"TimereumX()","6e46408d":"indexOfOwners(address,address)","6e4647d6":"vendingCreateCollectible(uint256,address)","6e468a8a":"CelticsCoin()","6e48670f":"zeroSub(uint256,uint256)","6e48a035":"closeVote(uint256)","6e49b1e1":"AnythingAppTokenPreSale(address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","6e4a7b26":"initializeCoins()","6e4a9f4d":"Nguen()","6e4ac25f":"TokenData(address,address)","6e4b0222":"setactivelevel(uint256)","6e4bfb37":"GenaroTokenSale(uint256,uint256,address,uint256,bytes32)","6e4c42a0":"getGameSides()","6e4c9829":"amountsOf(address)","6e4ca716":"totalEthRecieved()","6e4dd931":"GetPotInfo()","6e4df96e":"produceWine()","6e4e5c1d":"revealedCurves()","6e4e87e0":"sendQuickPromoBonus()","6e4eb9cb":"getSeedsSinceLastEvent(address)","6e4ed796":"blocksPerRound()","6e4f33b0":"change_delay(uint256)","6e4f68b5":"PONO()","6e4f749e":"freezeMethod(address,bool)","6e500306":"Bst()","6e50640c":"WinikToken()","6e506ee4":"managementTokenAllocation()","6e50c39c":"serializeState(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256)","6e50eb3f":"setEndsAt(uint256)","6e51be3d":"UmmahDinar()","6e52dcd6":"pauseChannels()","6e5320d1":"changeTokenInformation(string,string)","6e53909a":"setLockAdmin(address,bool)","6e5390d2":"woodAddress()","6e5406e3":"_0xLitecoinToken()","6e54181e":"right75(uint256)","6e5452fe":"OUTCOME_RANGE()","6e553f65":"deposit(uint256,address)","6e555a18":"testCreateContract(bytes32,uint16,bytes32,uint256,uint64,bytes32,uint64,bytes32,uint64,uint64)","6e556725":"initialEndPrice()","6e56dce5":"collectEtherBack()","6e56e5eb":"_emitUserBinded(uint256,address,bool)","6e56e895":"test_defaultPermissions()","6e575537":"MAX_OWNER_PERS_SITE()","6e57e7e0":"payOut(address,uint128,int256)","6e581673":"buyPackWithERC20Tokens(uint8,address)","6e593210":"getActiveSellOrders(uint256)","6e596aef":"moveCeiling(uint256)","6e59e570":"sendToOtherBlockchain2(string,string,address)","6e59f3f3":"createChannel(address)","6e5ac882":"root(address)","6e5aef4d":"getInitTime(uint256)","6e5b064c":"basicPricePerEth()","6e5deca4":"YaoDun()","6e5ecdff":"updateDependencies()","6e5f375e":"setGameStartedDividendPercentage(uint256)","6e5fd38d":"registerMultiple(address[],bool)","6e609af2":"FulfillmentUpdated(uint256,uint256)","6e60cf61":"freedWinPoolToTeam()","6e6260fa":"thresholdNewTokenPair()","6e62825a":"SCDCToken1()","6e62cdab":"nextRoundWinner()","6e62de19":"fundFailed()","6e63015c":"getCertifiersCount()","6e630649":"changeState(uint256,uint8)","6e635673":"deletePullPayment(uint8,bytes32,bytes32,string,address,address)","6e638d3b":"claimIFSReward(address)","6e640f4c":"candidat()","6e658fbe":"myFundsExpireIn(uint256)","6e6656d8":"setCallStackSize(uint256)","6e66644d":"changeStakingFeesOperation()","6e667c35":"contentURI(uint256)","6e66cc38":"TraceToToken(address,uint256,uint256,address)","6e66f6e9":"tokenReward()","6e676b69":"changeVotingRules(uint256,uint256,uint256)","6e67b803":"bid3(address,uint256[],uint256[])","6e680ee7":"CREATORS_WALLET_ADDRESS()","6e68751c":"revokeVestedTokensFor(address)","6e68ec59":"getSoilHumdtyException(bytes32)","6e69e7d7":"maximumNumberOfLoops(uint256,uint256)","6e6a1dc3":"weightedVoteCountsOf(uint256,uint256)","6e6a42ec":"retraitStandard_1()","6e6b4bed":"getArt(string)","6e6b8004":"upgradeGemsSpecial()","6e6beb07":"PreSaleBuy()","6e6bfca0":"cancelJobByProvider(bytes32)","6e6c4c58":"CrowdTmoney2()","6e6ca42f":"RefundError(address,uint256)","6e6ca6f5":"getLastTransferred(address)","6e6d83d2":"cancelLoanRequestAtIndexByLender(uint256)","6e6d9a6c":"Token(address[],uint256[])","6e6e8a02":"addWhitelist(address,address[])","6e6ed399":"priceValidSeconds()","6e6f2fe5":"DentacoinToken()","6e6fe3d6":"ClaimMTU(bool)","6e6ff8a9":"lockDays()","6e70096e":"withdrawEarnings(uint256)","6e70cb07":"getAssetHolders()","6e70de82":"transitionState()","6e720693":"RevokeEvent(address,address,uint32)","6e722fcb":"getIsBonusClaimed(uint256,address)","6e725302":"getRatio(uint256,uint256,uint256)","6e730a67":"setSecondStageEndsAt(uint256)","6e733f50":"getCap(string)","6e743fa9":"punkBids(uint256)","6e74774a":"MHCTokenIssue(address)","6e752548":"finalizeStartTime()","6e754efb":"daysnumber()","6e761a73":"claimDevReward(address)","6e76a89f":"validateReserves()","6e76fb4c":"MemberRemoved(address)","6e779481":"ADVISORS_CAP()","6e77d4bb":"CryptoMountainsToken()","6e787a48":"correctOriginalSupply()","6e78e95f":"CryptoLeaders()","6e79ae56":"deleteOpenAction(string,string,string,string,string)","6e7a824f":"TestCoin(uint256,string,string)","6e7b698f":"drops(address[],uint256)","6e7bc3e5":"addContractOwner(address)","6e7c1700":"getJobName(uint256)","6e7c1c2b":"getWithdrawDigest(bytes32,address,uint256,uint64)","6e7c77b6":"testClaimTokens()","6e7d9dc6":"transferCreatureOwnership(address)","6e7e3b2b":"contributors()","6e7f26ab":"distributeToken(uint256,address[])","6e80a869":"minimalInvestmentInWei()","6e823b47":"controlledBurn(address,uint256)","6e82e86a":"getHash(uint256[])","6e843a74":"AgreementUrlRu()","6e8480e0":"TokenMetadata(string,uint8,string,string)","6e8595f5":"CheckAddressVerified(address)","6e861c0e":"deauthorizeContract(address)","6e880e4d":"PreminedAsset()","6e88147e":"tradeReport()","6e88274b":"GetBetBalance()","6e8851a9":"initSale2()","6e885bd7":"workerPoolHub()","6e88865a":"teamAddressFreezeTime()","6e88a7bd":"referrerFee()","6e88b4ef":"tgeStageBlockLeft()","6e88d5fa":"judgeFakeTokenAndTransfer(uint256,address)","6e899550":"setString(bytes32,string)","6e89d517":"Deposited(address,uint256,bytes)","6e8a3438":"TransferStatusChanged(bool)","6e8a3d4b":"SerpentIsRunning()","6e8a6d12":"updatePriceAddress(address)","6e8ab641":"Arbitragebit()","6e8ac0c8":"developersAllocation()","6e8add02":"setMainsale(address)","6e8b7c23":"numcalls()","6e8c2caf":"gameRunning()","6e8c57e6":"minBalanceToAllowContractCreation()","6e8d3007":"CapitalTechCrowdsale(address,address,address)","6e8d82af":"swapToken(address)","6e8dad74":"retrieveAccountBalance(bytes,bytes)","6e8dba91":"getInitialData()","6e8dc135":"WinnerSelected(address,uint256,uint256,uint256)","6e8ddc7a":"LuxArbitrageToken()","6e8de595":"setBoardMember(uint256,uint256,uint256)","6e8e39d1":"QRG(uint256,string,string)","6e8f7142":"put(address,string,string)","6e8f8d69":"getInvestorsCount(uint256)","6e900256":"addData(bytes32,bytes32,bytes32,bytes32[],uint256[],uint256[],uint256[],uint256[])","6e9067fb":"getRole(string)","6e90a590":"expectedTotalSupply()","6e914d97":"requestAdminTokenTransfer(address,address,uint256,string)","6e929838":"PAXToken(address,address,address,bool)","6e929d4c":"sendIBTCTokenToMultiAddr(address[],uint256[])","6e932270":"dewhitelist(address)","6e939d05":"moveFromState(bytes32,int8[128],uint256,uint256,bytes)","6e93dbdc":"koCommissionAccount()","6e940a29":"changeHost(address)","6e942390":"howMany(uint256,uint256)","6e942f82":"buildingCostWei()","6e947298":"getETHBalance()","6e94d278":"burnReputation(uint256,address,address)","6e95a066":"IouRootsPresaleToken(string,string,uint8)","6e96433f":"multiPartyTransferFrom(address,address[],uint256[])","6e96463f":"BonusesUpdated(address,bool)","6e965a89":"calculateWeeklyTokensSupply()","6e968bca":"getSidesArray(uint256)","6e96bbeb":"crowdsalePurchasesLoaded()","6e96dfd7":"_setPendingOwner(address)","6e97041e":"SCPS1Token()","6e970dfd":"retireMaster(address)","6e974fd6":"approveWalletFeeData(uint256)","6e977865":"dadFab()","6e978d91":"right90(uint256)","6e98a92b":"fundManagementAddress()","6e995bd9":"updateChannelState(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)","6e9960c3":"getAdmin()","6e997972":"modSymbol(string)","6e99d52f":"COOLDOWN_PERIOD()","6e9a41c3":"DraftCrowdsale(uint256,uint256,uint256)","6e9af3f7":"giveForce(address)","6e9b134e":"LogCancelDelivery(address,string)","6e9b41d4":"releaseForGoolaTeam()","6e9c3683":"getIndexByProposalId(bytes32)","6e9c4650":"prepaidUnits()","6e9c4d0a":"rateTenant(uint256)","6e9c931c":"stake(uint256,address,uint256)","6e9cfb79":"itemReturn()","6e9d3b9d":"AtoOneCoin(uint256,string,uint8,string)","6e9e48ef":"tokenIdToOwner(uint256)","6e9ffe2b":"updateTransferRestrictionVerifier(address)","6ea007b3":"dailyLimitLeft()","6ea056a9":"sweep(address,uint256)","6ea07a36":"recoverSimple(bytes32,uint8,uint256,uint256)","6ea11f65":"togglePublicMatches()","6ea141cb":"AddBonusToList(bytes32,uint256,uint256)","6ea150e2":"changeWithdrawTimeRange(uint256,uint256)","6ea16f3a":"tryRefund()","6ea16f81":"houseTraits(uint256,uint256)","6ea34ce4":"getPartById(uint256)","6ea38199":"getMoreAuctionDetails(uint256)","6ea3b6d1":"ICO_Finished()","6ea3f1cb":"GetFreebie()","6ea405d3":"Tax()","6ea412b1":"Exchanged(address,uint256)","6ea42555":"pack(uint256)","6ea451e4":"setSaleLimit(uint8)","6ea51811":"icoStartP4()","6ea521d9":"_voteAs(address,uint256,uint256,uint256,string)","6ea68360":"newMasterCopy()","6ea69c91":"closePositionOnBehalfOfRecurse(address,address,address,bytes32,uint256)","6ea6b71b":"tokensRaised()","6ea6d76d":"initGame(string,bool,uint256)","6ea6db3c":"token(uint256,string,uint8,string,address,uint256)","6ea6f0c3":"initializeTopUpLimit(uint256)","6ea7064b":"contractorProposal(uint256,address,uint256,string,bytes32,address,uint256,uint256,uint256)","6ea79583":"team_wallet()","6ea8efea":"getGameNum()","6ea928d9":"getSymbolHash()","6ea96bcd":"defaultBuyerLastPaidAt()","6eaa0f16":"CCTOKEN()","6eabb2f6":"getWineryOperation(string,address,uint256)","6eabcd69":"__abortFuse()","6eac86d4":"settleTransaction(bytes32)","6eaccf4c":"privilegedTransfer(address,address,uint256)","6eacd48a":"ownerPauseGame(bool)","6eadcc87":"tokenSetup(address,address,address,address,address)","6eaddad2":"setDevPercent(uint256)","6eadeba0":"resolve_block_hash(uint256)","6eae0843":"getTeam(uint16,uint8)","6eaefc87":"tokenExchangeRateBase()","6eafbe88":"ChangeTeamHolder(address,address)","6eb060ea":"setMinBuyPublic()","6eb09ce2":"ethbalance(address)","6eb1546d":"_removeBid(uint256)","6eb1e09a":"fechVoteMainInfoByStage(uint256)","6eb21929":"softcapReached()","6eb227ce":"getCurrentWeek()","6eb25ed8":"distributionOne(address)","6eb267ab":"CxNtoken(address)","6eb2a749":"isMaySale()","6eb2f0cc":"payShareholders(uint256)","6eb305aa":"getTimestampInSeconds()","6eb47ea7":"linkTeamToUser(address,bytes32)","6eb5197d":"getFirstAdmin()","6eb58224":"castDocumentVote(uint8,bytes32,bool)","6eb5ad4f":"lockPriceChange()","6eb5bef0":"addressSupporters()","6eb5ebae":"FidgETHSpinner()","6eb6ffa7":"initialQuorumPercent()","6eb769d2":"tokenTotalSold()","6eb7b4c2":"underdogInfo(uint256)","6eb7c67b":"_getEthPrice()","6eb85627":"Stalincoin()","6eb86537":"getAllPackage()","6eb91683":"donateForContractHealth()","6eba2b13":"getOrder(address)","6eba68f9":"ICOFactoryVersion()","6ebb6d80":"attack(address,uint8)","6ebbe863":"updatePublishContract(address)","6ebbfd5a":"addItemTo(address,uint256,uint256,uint256,uint256,uint256,uint256)","6ebc0af1":"tranche()","6ebc6200":"CURRENSEE(address,address,address)","6ebc8c86":"getContract(uint256)","6ebcf607":"_balances(address)","6ebd9d7f":"setApiRegistryContractAddress(address)","6ebdac12":"removeProductFromCart(uint256)","6ebe299f":"adventureDataContract()","6ebf10fe":"storeHeader(bytes,address)","6ebf5223":"ProofOfSheepM()","6ec012e7":"saleIndex()","6ec03f7a":"removeCrydrView(string)","6ec05f13":"EURWEI()","6ec069f8":"teamOneDivsUnclaimed()","6ec0ce6e":"_isController(address)","6ec232d3":"gasprice()","6ec236ed":"calculateTaskDeposit(uint256)","6ec23e53":"OPTIToken()","6ec25a06":"tokenCreated(address,uint256,string)","6ec2e979":"bothHaveAttribute(address,address,bytes32)","6ec32f9c":"getRepayAmount(uint256)","6ec386d3":"AutoChainTokenCandy()","6ec3af26":"addTrustedIssuer(address,bytes)","6ec40f9e":"GAME_POOL_INIT()","6ec4c951":"claimWithdraw(address,uint256)","6ec4e5b8":"callERC165SupportsInterface(address,bytes4)","6ec5239f":"setAvatar(string)","6ec62f29":"assertEq28(bytes28,bytes28)","6ec6d4a6":"setMinLimit(uint256)","6ec7743d":"getSubjectClaimSetEntryAt(address,uint256,uint256,uint256)","6ec84711":"organizer6()","6ec99dd0":"testGetBlobStore()","6ec9b125":"EtherSphere()","6eca017e":"releaseForYoobaTeam()","6eca4a50":"UKTTokenController(bytes32,bytes32)","6eca6a9e":"updateRecordName(uint256,string)","6ecb97cd":"getInitializeNumOutcomesValue()","6ecbb556":"UAPCrowdsale(uint256,uint256,uint256,address,address)","6ecc9ad9":"getInstallments(uint256)","6ecd1129":"nextAvailableLevel()","6ecd7b70":"CancelSale(uint256)","6ece5937":"endGame(uint256,string,address)","6ece7d88":"doVote(uint256,uint256)","6eced029":"getMsgGasAfter()","6ecf9f7b":"hype()","6ed0b9d7":"changeStage(uint8,uint256,uint256)","6ed28ed0":"store(uint256,uint256)","6ed2d8c6":"giantFYou(address,uint256)","6ed2fc5c":"PRESALE_WEI()","6ed33343":"dsp()","6ed33b98":"addSupportedToken(address,address,uint256,uint256,uint256)","6ed34394":"totalLockPrincipal()","6ed3f468":"sendsignature()","6ed40f9d":"isValid(string,string,uint256,uint256)","6ed43eb0":"getInvestorList(uint256)","6ed4d0c7":"dataCenterGetResult(bytes32)","6ed51d94":"isValidBuyOrder(address,address)","6ed55eb5":"setUserRating(address,uint8)","6ed5777e":"BuyHORSEtokens()","6ed5f880":"withdrawGTA(uint256)","6ed65dae":"sendCount()","6ed6da9e":"getUserById(uint256)","6ed6e17a":"updateCurGamePrizeInfoWithDraw(uint256,address,uint256)","6ed776b2":"createToken(address,address)","6ed7c013":"move_monsters()","6ed84231":"TOURNAMENT_BATTLE()","6ed89fbc":"_transport(uint256,uint256)","6ed963b7":"EthereumTravelCrowdsale(uint256,address,address)","6ed9c19f":"calculateMasked(address,uint256)","6ed9fd89":"avgGas(address)","6edb2e8a":"sellPropertyAndChangeOwnership(address)","6edb4cf6":"testThrowRetractLatestRevisionDoesntHaveAdditionalRevisions()","6edb9ab0":"batchDepositTo(address,address[],uint256[])","6edbba2e":"numFree()","6edbd134":"hasHash()","6edbeb1c":"verificationHoldersTimestampMap(address)","6edc7ba7":"getExchangeFunctionSignatures(address)","6ede2106":"EtherIn(address,uint256)","6ede696b":"PaymentProcessor(address)","6edf1cc4":"getWithdrawalForAddress(address,address,uint256)","6ee0400d":"ICOBonusPercent1week()","6ee1844e":"KnownOriginDigitalAsset(address)","6ee18573":"addWhitelistOperator(address)","6ee2627b":"maxFundLimit()","6ee2e362":"CleanCurrentRoomAndRound(address)","6ee2ed5d":"totalSpinners()","6ee31a18":"upgradeToken(address)","6ee3d453":"modifyGameItemPrice(uint256,uint256)","6ee4b475":"InitialBlockCount()","6ee5d676":"getSumCourse()","6ee61483":"changeBuyin(uint256)","6ee63f1f":"MineableToken()","6ee64345":"endMainSale()","6ee678ae":"_burn(address,address,uint256)","6ee74b3c":"Test5()","6ee7826f":"_getRoundedPrice(uint256)","6ee78aea":"isMultiple(uint256)","6ee7a063":"createInstance(address,bytes32,address,bytes32,bytes)","6ee8067f":"whitelistManagerAddr()","6ee84bb7":"SDD_Erc223Token()","6ee88301":"getRoomOwner(uint256)","6eea4820":"QBT()","6eeb553f":"pollBurnCompleted()","6eeb7a36":"setCreator(address,bool)","6eeba5c6":"short_party()","6eebad9e":"Jitech(uint256,string,uint8,string)","6eebb73f":"activateZone(int32[],int32[],uint8[],uint8[])","6eec21d6":"vault_deposit(address,uint256)","6eec2dd2":"Released(bytes32)","6eec3db6":"allocateAdvisorTokens()","6eecb7c2":"getDomainTypehash()","6eecf81a":"SetPrcntRate(uint256)","6eedc46d":"tokenWalletChange(address)","6eee2dad":"mintRewardTokens(address,uint256)","6eeeca03":"finalizeSale2()","6eef0326":"placeBetOdd(uint256)","6eef2cb7":"functionTwo()","6eef7a05":"bytesToString(bytes32)","6eef908f":"startReceiveTicket()","6ef0a5cf":"singleTransferToken(address,uint256)","6ef0c864":"SetDataAddress(address)","6ef0f37f":"setHome(address)","6ef181a8":"setRarityMultiplier(uint8)","6ef1a114":"transfersRemaining()","6ef1f3a6":"luckyOne(uint256)","6ef27042":"CentraToken()","6ef33b8f":"getInfo3(address,address)","6ef3732d":"fixDividendBalances(address,bool)","6ef3ef7e":"approveData(address,uint256,bytes)","6ef4e8db":"getCalcToken()","6ef61092":"withdrawn(address)","6ef72aaa":"BattleResult(address,address,uint256[],uint256[],bool,uint16,uint256,uint32,uint32)","6ef791bb":"WylSistContract()","6ef8c661":"addInfoListItem(bool,address,address,uint256,string)","6ef8d66d":"renouncePauser()","6ef958df":"changeSource(string,string,uint256)","6ef98b21":"withdrawOwner(uint256)","6ef9bc29":"phase3EndingAt()","6ef9e145":"weiBalances(address)","6efa0621":"SPPSeriesB(uint256,string,uint8,string)","6efa629d":"releaseFees()","6efa6a67":"PAYOUT_PCT()","6efab8f2":"overloadedMethod(address)","6efaf16c":"disableAutoSeller()","6efbb60a":"addONG(bytes32,string,string)","6efbd610":"coownerPrice()","6efd1adf":"RATE_EXPONENT()","6efd5974":"signedApproveHash(address,address,address,uint256,uint256,uint256)","6efe39a3":"getEncryptedKeyFromRequest(uint256,uint256)","6efef04d":"setLevelEndDate(uint256,uint256)","6eff96f2":"rafflepot()","6effb219":"changeCreditFundNIMFAAddress(address)","6effb579":"stop_sell(uint256)","6effdda7":"Trade(address,uint256,address,uint256,address,address)","6effe1c7":"startSale2Phase()","6effec50":"forwardCall(address,uint256,bytes)","6f00a3cf":"DumpDivs()","6f00ad8a":"lastmoney()","6f00fd97":"createTokenTransaction(address,uint256,uint256,uint256,uint256,address,uint256)","6f015889":"Activate(address,uint256,string)","6f0166c4":"GeoGems(address)","6f01d915":"addHedge(address,uint256,uint256,bytes3,bytes3,uint64,bytes32,bytes32)","6f020775":"totalCoinLock()","6f022ac4":"cancelMigration(address)","6f02483f":"EtherGang()","6f024899":"Destructible()","6f025aec":"MolikToken()","6f025c84":"MithrilDemo()","6f03e307":"setTiersInfo(uint8,uint256[],uint256[],uint256[],uint256[],uint8[])","6f03e4f9":"getClientBalances(address)","6f0470aa":"candidates()","6f04ff33":"increaseSalesBalance(address,uint256)","6f0503ad":"setDerivePayoutDistributionHash(bytes32)","6f05994e":"addBalanceFor(address,uint256)","6f0663f0":"RadioCoin()","6f069cfe":"technik()","6f06fdb3":"hasAgreement(uint256)","6f079f90":"getPricingEndsAt()","6f086122":"preSignedHashing(bytes8,address,address,uint256,uint256,uint256,uint8)","6f08effa":"manualBonus()","6f09240f":"runScript(bytes,bytes,address[])","6f0963b0":"isMemberBlocked(address)","6f096f75":"investorPayment(address,uint256)","6f0a150f":"restartRound(bool,bool)","6f0a74d5":"_8_poluchaetLesha()","6f0ac394":"getCP(address)","6f0b5180":"buyFor(address)","6f0cd3a6":"m_active()","6f0cfab6":"DNSResolver()","6f0d0a38":"CrocsFarmer()","6f0f45d2":"OPERATIONS_ADDRESS()","6f0fccab":"getTokenName(address)","6f0fdce8":"Task(address)","6f1003c4":"minEsteemAmount()","6f109879":"impl_transferMSM(address,address,uint256)","6f10d1a0":"addNewToken(bytes32,address,address)","6f10fdbd":"totalPlay()","6f117190":"getInitialTerrain(uint256,uint256)","6f11a859":"availableAirdrop(address)","6f1236e1":"ETHPriceProvider(string)","6f13b95d":"editTokensForHour(uint256)","6f13e01b":"EthVenturePlugin()","6f13eb09":"BlockChainZB(uint256,string,string)","6f1427b2":"icoInProgress()","6f147f5c":"addWhiteListed(address[],uint256[],uint256[])","6f14dc62":"storehouse(bytes32)","6f152670":"max_fundingGoal()","6f15847f":"recordInfo(bytes32,uint256,string)","6f159c4f":"founder_token()","6f16a595":"PRICE_MIN()","6f17a516":"ln_fixed3_lnr(uint256,uint256)","6f181303":"ScriptCallable()","6f18337d":"IHF(address,uint256)","6f18d3f5":"traded_token_is_seeded()","6f1a5b72":"updateTokenHolder(address)","6f1a78cc":"deleteWebsite(address)","6f1aa1f5":"requestTokenIssue(address,uint256,string)","6f1ae5de":"_itemRemoveMarkets(uint256)","6f1c8a51":"_getHash(address,bytes32)","6f1ca0c2":"preicoSupply()","6f1cecd8":"unreadMessages(address,uint256)","6f1db0b7":"createNewBid(string,uint256)","6f1e54c3":"sellMyTokensAmount(uint8,uint256)","6f1e6419":"MANHATTANPROXYYORKAVE()","6f1e738c":"updateISIN(string)","6f1fb766":"sealedBids()","6f200ce3":"transferBlock(address,address,uint256)","6f204f20":"getChannelInfo(address,address,uint8)","6f2130d3":"amountOfCRs(address)","6f2223c5":"getRefereeAddress(address)","6f227851":"USDValue()","6f2293ab":"transferFrom(address,address,uint256,bool)","6f22993c":"moveTokens(address,address,uint256)","6f22d6a5":"losses()","6f24fe30":"notifyPledgeNotPayed(uint256)","6f253319":"CurrentGoldPrice()","6f259077":"STAGE_ONE_TIME_END()","6f2594a0":"moduleMultiOwner(address)","6f264776":"buy10tickets()","6f264b2e":"requiredTokenAddress()","6f26d566":"dailyLottery()","6f28a853":"assertNotSpent(uint256,int256,bytes32,bytes32)","6f28ee09":"storeHash(string,string)","6f290893":"Refund(address,uint256,uint256,int256)","6f29c88a":"exchangedNum()","6f2b1226":"upgradeBank(address)","6f2f098b":"Cite(bytes32)","6f2f7a57":"getWinNumber()","6f2fc06b":"proxyPayments(address)","6f2feb0a":"approveAndSell(uint256,uint256)","6f307dc3":"underlying()","6f30e1ee":"PunkBidWithdrawn(uint256,uint256,address)","6f3165d3":"UpgradeRig(uint8,uint256)","6f320970":"vernamCrowdSale()","6f322fef":"Atra()","6f326ac6":"checkStorageProof(bytes32[],address)","6f32a937":"min256(uint256,uint256,uint256)","6f32b2ac":"setRSPScienceAddress(address)","6f32b4cb":"mainICOSecondWeekEndTime()","6f3355af":"isBreakingCap(uint256,uint256)","6f335870":"sections()","6f3395b2":"_tradeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)","6f33ae68":"HouseFeeUpdate(uint256)","6f341804":"activeteICO(uint256)","6f34a7ff":"sanctuary()","6f35c749":"SECONDS_OF_DAY()","6f362c2b":"latestSpender()","6f3640f7":"getRealUsdAmount()","6f36ce79":"insert_deal(address,address,uint64,uint128,uint32)","6f370b20":"Austriachain()","6f373cb7":"PullRequestClaimed(uint256,uint256)","6f374a12":"setBool()","6f37f48b":"firstToken(address)","6f38e410":"maxLevels()","6f3921ee":"extended()","6f3a7561":"SimpleAuction(address)","6f3ad341":"ICO_ONE()","6f3b2819":"secondChainHNw2()","6f3b4759":"lockMultiple(address[])","6f3b60d6":"latestOrderId()","6f3b6d00":"RESERVED_TEAM_SIDE()","6f3b8ce2":"getArrayAddress(bytes32)","6f3b97a4":"DeactivatedContract(uint256)","6f3bb97f":"unsetVipAddress(address,address)","6f3be1da":"lift_ban()","6f3be6b7":"ELEXTROCOIN()","6f3bf6ea":"GMC()","6f3c8566":"redeemWarriors()","6f3d8043":"valueAfterReducingFee(uint256)","6f3f6870":"CertAdmins(address)","6f3fe404":"updateBalances()","6f414fbb":"sale1Started()","6f4215b1":"setEthRate(uint256)","6f42879f":"wantsToFight(uint256,uint256)","6f42934d":"getTimePurchase()","6f42c901":"teamAddresses(address)","6f43233a":"getAnyAddressTokenBalance(address,address)","6f44c4d7":"recipientVIP()","6f4618d8":"firstReserveAllocation()","6f468289":"CONTRIB_PERIOD2_STAKE()","6f475e7f":"validateTransfer(address,address)","6f476cbc":"opMinted()","6f479f57":"changeSellingPrice(uint256,uint128)","6f47b075":"test_set_get_Policy()","6f47e218":"sharesRaised()","6f4812e2":"testFailControllerInsufficientFundsTransfer()","6f48455e":"checkMinMaxInvestment(uint256)","6f488063":"getPOOL_edit_7()","6f494049":"registerPublicKey(uint256,uint256)","6f49a3c0":"openChest()","6f4a2cd0":"distributeRewards()","6f4b31cc":"Bastonet()","6f4bda17":"numberOfPlayers()","6f4be234":"EMJAC()","6f4c6443":"invite(address,address)","6f4ca36e":"Tracto()","6f4ce56a":"indexOf(bytes32)","6f4d469b":"addMembers(address[])","6f4d6f5d":"ShitToken(address)","6f4d80e5":"m_state()","6f4db6a7":"hasRepeat(uint8[4])","6f4dd69c":"testSetBalanceUpdatesSupply()","6f4dfede":"GetExpireTime()","6f4eb87e":"test_removeFromRegistry()","6f4ebb70":"calculate_reward(uint256,address,uint256)","6f4efd53":"POTJ()","6f4f2ec3":"ERC20Template(string,string,uint8,uint256,address)","6f500df5":"claimCofounditTokens(address)","6f503750":"LogPermit(bytes32,bytes32,bytes32)","6f503e67":"vestingOf(address,uint256)","6f512e61":"setSgdToEthRate(uint256)","6f51d01f":"getUserBlockNumber(bytes32)","6f52167d":"payDuel(address,string,address,string)","6f53a48a":"Bitprize()","6f53da8f":"benefitFunds()","6f53df6c":"EtheraffleLOTPromo()","6f540fe0":"setCampaign(address)","6f54e4df":"candyper()","6f54e89e":"getMaximumFunds()","6f5736c6":"getFreeFalcon()","6f5831cb":"startTokensSale(address,uint256,uint256,uint256,uint256)","6f584bd8":"View_TrustlessTransaction_Info(uint256)","6f58659b":"totalRewardIssuedOut(address)","6f59a5cc":"curBubbleNumber()","6f5b286d":"tokenUnsold()","6f5cca83":"withdrawForCompany()","6f5d616b":"execPermissions(address)","6f5d64fa":"FSNASAddress()","6f5d712e":"TOTAL_TOKEN_CAP()","6f5da839":"Token(uint256,string,string,uint8)","6f5da961":"transferEntityOwnerPull(address)","6f5e7398":"dasToken()","6f5eb4b5":"publicSell(uint16)","6f5f20ce":"INITIAL()","6f5f7ba2":"CreatedYUPIE(address,uint256)","6f5f8f74":"Cryptoloans()","6f5f9498":"InitializedManager(address)","6f6007bb":"StartdatePresale()","6f609714":"FrameworkToken()","6f625567":"roleAdd(address,string)","6f62cba3":"resetUserRefBalance(address)","6f62e755":"changeGatewayAddr(uint32,address,string)","6f63d2ec":"left66(uint256)","6f64234e":"sendFunds(address,uint256)","6f64824b":"setErc677token(address)","6f64ccf5":"checkVestingTimestamp(address)","6f652e1a":"createOrder(address,uint256,uint256,uint256)","6f6541e0":"SetLot(uint256)","6f6640c1":"AnthillFarmer()","6f66d23b":"adminGetWorldData()","6f6781d3":"getPosition(uint8)","6f68d634":"acceptTrusteeOwnership()","6f68fffd":"setEndSaleTime(uint256)","6f691500":"getMySecondAmount()","6f698fb5":"setMinimumQuorum(uint256)","6f6aadfb":"SnovPresale()","6f6b32ad":"PVXToken()","6f6b6963":"VestingCreated(address,address,address,uint256,uint256,uint256,uint256,uint256)","6f6bdbe3":"specialUsers()","6f6c0244":"generateShortLink()","6f6c0759":"onlyPayForFuel()","6f6c7234":"setApoderadoVerify(bytes32,bytes32,bytes32)","6f6cd9f5":"isElectionPeriodProposal(uint256)","6f6d3694":"removeRound(uint256,uint256)","6f6eacee":"availbleToken()","6f6f828e":"removeAllTournamentContenders()","6f6f9bef":"getLandInfo(uint256)","6f6ff3bc":"setVesting(address)","6f7030f6":"calculateCuts(uint256)","6f704aa6":"TreasureToken(address,address)","6f70a22f":"deadlineThree()","6f70b9cb":"getWinningChildUniverse()","6f7154c8":"getIsStopFunding()","6f71f407":"freeze(address,uint8)","6f72fd20":"calculateBonus(uint256,uint256)","6f74174d":"finalizeIt(address)","6f741cff":"getPauserList()","6f7429ab":"modifyDescriptionManual(uint256,address,string)","6f7495cb":"unproducedCaps()","6f74dafe":"getGodAddress()","6f752f09":"backendContract()","6f75b00c":"removeBuyer(address)","6f75cd14":"DappToken()","6f766f20":"refundTRA()","6f7705c2":"becomeRichest(string)","6f77926b":"getUser(address)","6f784c5b":"totalAmountOnICO()","6f78ee0d":"rap(bytes32)","6f7920fd":"tokenCreationCap()","6f79301d":"getCreationTime(bytes32)","6f796d86":"JACK(string,string,uint8,uint256)","6f799cf9":"_amountRaised()","6f7b5a56":"getDEditorArbitraryData(bytes32,bytes)","6f7d9acf":"setupInitialSupply()","6f7f461d":"manager1()","6f7fc989":"teamIssue(address,uint256)","6f80602b":"NewOrleansCoin()","6f80dc23":"obfuscatedHashDataBlock(string,string)","6f8177f4":"MentalhealthToken()","6f81adf6":"Resilium()","6f81bdd8":"setRate(uint256,bool)","6f826a7d":"testIsEmpty(bytes)","6f82e068":"initialSupplyPerChildAddress()","6f838a8e":"TESTCOIN1()","6f8489af":"CreateGMT(address,uint256)","6f84eb6c":"setPatronReward(uint256)","6f853964":"setPriceCoeff(uint256)","6f8543a6":"CoWithdraw()","6f85c7e4":"WAITING_PERIOD()","6f85e62c":"buyTokens(string)","6f863c21":"inviteIter_()","6f872022":"setSectionForSaleToAddress(uint256,uint256,address)","6f874abb":"setgasUsed(uint256)","6f87dddd":"getPlayerStageKeys()","6f882086":"KNCBalance()","6f893e0d":"LeeroyPremiumToken()","6f8b44b0":"setMaxSupply(uint256)","6f8b7574":"createTransaction(address,address,uint256,string,uint256,uint256)","6f8c33a6":"getGoldDepositOfAddress(address)","6f8c3c0e":"MIToken(uint256,string,uint8,string)","6f8c3e4c":"SaraAndMauroToken()","6f8c9575":"yearFor(uint256)","6f8d3eb0":"withdrawPAXTR(uint256)","6f8d998c":"dist(uint256,uint256)","6f8dca87":"GetCost(uint256,uint256,uint256)","6f8e0a08":"getreward()","6f8e1fb6":"testOverflowResistantFraction()","6f8ee91c":"level_6_amount()","6f8f1de5":"mock_resetLatestPayday(address,address)","6f8fb2c3":"CROWDSALE_WEI_GOAL()","6f8fccd7":"BioChainCoin()","6f9090db":"setwinPercent(uint32)","6f90be06":"playFromBalance()","6f910c4b":"checkProviderOwnerSupply(uint256,bool)","6f9125a5":"pylonSelled()","6f9170f6":"isWhiteListed(address)","6f919068":"LogUnPause(bytes32)","6f91cec0":"ProvideWorkOrder(address,address,address,uint128)","6f92096b":"setGasForward(address)","6f923a7c":"LockSAToE()","6f925535":"revokeAccess(address,uint8)","6f92f186":"multiply(address)","6f93638e":"isSolvent(uint256,uint256)","6f941290":"SelfDropTokens(address,uint256)","6f9477c0":"BanAccount(address,bool)","6f947d6d":"_emitPublicCapabilityAdded(address,bytes4)","6f94e260":"buybackPriceOf(uint256)","6f94e502":"getVoter(uint256,uint256)","6f954161":"changePreJackpotBidLimit(uint256)","6f95dd0b":"RATE_DAY_21()","6f9607e5":"countYears()","6f964659":"depositMint(address,uint256,uint256)","6f969c2d":"getNonFungibleBaseType(uint256)","6f96f269":"Mehrancoin()","6f977413":"Property(string,string)","6f993a74":"rollFour(address,uint8,uint8,uint8,uint8)","6f9a023c":"theultimatepyramid()","6f9a5eab":"createTx(uint256,address,uint256)","6f9b0b7d":"getCurrentGameState(bytes32)","6f9b4c1d":"createCastleSale(uint256,uint256,uint256,uint256,uint256)","6f9ba978":"_reward(address)","6f9c3c8f":"fundReserve()","6f9c6194":"P2E()","6f9cd7b2":"mirtestToken()","6f9cdccd":"setMarketMaker(address,address)","6f9d257d":"CONFLICT_END_FINE()","6f9d73db":"BuyRocketForSaleEvent(address,address,uint32)","6f9f51c7":"RefundsDisabled()","6f9fb98a":"getContractBalance()","6f9fbd7c":"generateCrabHeart()","6f9fdd66":"trust()","6f9ff0fa":"GetDynamicCardNum(uint32,uint256)","6fa00f07":"agreementSignedAtBlock(address)","6fa01c8e":"init(bool,address,uint128,uint128,address,uint64,address,uint256)","6fa07d0d":"oraclize_query(uint256,string,bytes[5])","6fa0bf39":"getRankDynamic(uint256)","6fa1532e":"UpdateBalance(address,uint256,bool,address)","6fa15c21":"setPreIcoEndDate(uint256)","6fa23eac":"ShouWangXingAIGO(uint256,string,uint8,string)","6fa23f73":"setSupplyLimit(uint16,uint16)","6fa25d9a":"Log2_fnc(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256)","6fa28249":"getClaimsIdByType(uint256)","6fa4095e":"emitHavvenUpdated(address)","6fa42742":"arbitrator_question_fees(address)","6fa4c766":"revertFunds(address,address,uint256)","6fa4f5f7":"setRefPercent(uint256)","6fa58335":"tgeDuration()","6fa64cd6":"miningIncentiveTokens()","6fa65c4f":"MICRODOLLARS_PER_DOLLAR()","6fa668f3":"weiForPayment()","6fa6ad21":"getDeprecated(bytes32)","6fa6c360":"validateTranscriptHash(address,uint256,bytes32)","6fa81a3a":"IcoTimeRangeChanged(address,uint256,uint256)","6fa87f66":"Moongang(uint256,uint256,uint256)","6fa88aa3":"BrazilvsCostaRica()","6fa8de90":"changeMeatParameters(uint256,uint256)","6fa9ba07":"ShowMsg(bytes)","6fa9e255":"LiftUpVets(string,string,uint8,uint256)","6faa22a5":"polyToken()","6faa52b3":"getOwnerHistoryAt(bytes32,uint256)","6faaeca2":"finishBallot(bytes32)","6fab5ddf":"Fal1out()","6fab94c1":"BitplusToken()","6fac46e5":"numberOfRazzes()","6fad0a4d":"KPOP_CELEB_CONTRACT_ADDRESS()","6fae3d76":"access(address)","6faed0e5":"set_master_exchange_rate(uint256)","6faf4803":"BitcoinDiamondTest()","6faf9323":"TokensPurchased(address,address,uint256,uint256)","6fb1eb0c":"commissionFee()","6fb1edcd":"sellAllOutcomes(uint256)","6fb2d01e":"calculateBonusForHours(uint256)","6fb37c18":"TChainToken()","6fb3ba9e":"setWorking(bool)","6fb438dc":"getTotal(uint256[])","6fb487fc":"getListener(address)","6fb4adff":"changeFundWallet(address)","6fb642de":"setActionContract(address,bool)","6fb65c7f":"grantReserveToken()","6fb66278":"ratePreICO()","6fb6fde6":"AuthAdmin(address,bool,uint256)","6fb7110f":"BuckySalary()","6fb7b52e":"addCheck(address,address,uint256,bool)","6fb7e588":"encodeTokenId(int256,int256)","6fb7f147":"getPendingExplore(address)","6fb7fc8b":"deltaBalances(address,address,address[])","6fb8a70d":"responseCounts(uint256)","6fb8b885":"RESERVED_TOKENS_FOR_ROI_ON_CAPITAL()","6fb93e15":"BuyARXtokens()","6fb99dfb":"EventRemoveManager(address,address)","6fb9a2b4":"newCrowdsale()","6fba4aa9":"GUOcoin()","6fba7544":"setMinStartingPrice(uint256)","6fbaaa1e":"currentMultiplier()","6fbb222a":"setExtendedPlayerAttributesForPlayer(uint256,uint8[])","6fbb439e":"assign(string)","6fbc15e9":"upgradeTo(address,bytes)","6fbc8456":"setUID(uint256,uint32)","6fbcd0f6":"AnitiToken(address,uint256,uint256)","6fbcd1fb":"_getAltarRecord(uint256)","6fbd6f6b":"acceptContactRequest(address)","6fbdae47":"getArrayInfoForDepositCount()","6fbde40d":"setSaleAuctionAddress(address)","6fbe769d":"cards_black_total()","6fbf466c":"unscannedCaps()","6fc141da":"lastPaydayTS()","6fc14837":"setMaxStake(uint256)","6fc1cbbd":"RexToken()","6fc21429":"setgamecardintro(uint256,string)","6fc351c2":"Elsevier(uint256,uint256)","6fc3911c":"checkVerificationStatus(address)","6fc39a38":"changeAgencyReceiver(address)","6fc3b0b6":"getTime4(address)","6fc3c817":"confirmer()","6fc4f2c2":"isOnPreAuction(uint256)","6fc559bb":"tokenGrants(uint256)","6fc651f3":"TokenAGC(uint256,string,string)","6fc65924":"getDisputeEndTime()","6fc6df36":"fYou(address,string,string)","6fc8e920":"icoBonus4EndDate()","6fc90a2f":"submitSolution(uint256,string,bytes)","6fc98ee1":"mintTokens(address,address,uint256)","6fc9958a":"initBundle(uint8,uint256)","6fc9d5e4":"changeCompareTo(uint256)","6fca2023":"getSharedAccountsLength()","6fcac869":"BONUS_4_DAYS()","6fcaea0c":"set_iconiq_presale_open(bool)","6fcb0153":"issuanceLastAverageBalance(address)","6fcb1500":"defaultSweeper()","6fcb4463":"signUpOn()","6fcbb546":"extractOre(string)","6fcc52e7":"gujarat()","6fcdcb3e":"setOwnerLink(address,uint256[2])","6fce2d65":"updateAccount(uint256,uint16,bytes32,uint16,bytes32)","6fceaea2":"convertToMiniGGC(uint256)","6fcebff8":"ConversionSentToShapeShift(uint256,address,address,uint256)","6fceecf8":"withdrawRestriction(address)","6fcfbe85":"FAFA(address)","6fd075fc":"addPlayer(address,uint256)","6fd09735":"createDistrito(uint256,address)","6fd1bdea":"setProduct(uint256)","6fd2e6d0":"TFFC()","6fd37039":"WebPaisa()","6fd396d6":"lastRewardTo()","6fd3a2bc":"createTokensManually(address,uint256)","6fd42b32":"safeWithdrawal(address)","6fd44086":"adviserSupply()","6fd463ed":"addressOfTokenUsedAsReward1()","6fd5036d":"userChannelsCount(address)","6fd507f2":"Tube()","6fd5790d":"getCuota(uint256)","6fd59b01":"foundationFundMultisig()","6fd5ab58":"getTextBytes96()","6fd5ae15":"level()","6fd63728":"feeFunds()","6fd7c035":"EventRedeemStatic(address,uint128,uint256,uint256)","6fd7c34c":"setMemberRegistry(address)","6fd8282f":"priceLastUpdateRequest()","6fd86d44":"emitAccountUnfrozen(address)","6fd902e1":"getCurrentBlockNumber()","6fd9101f":"ACAToken(uint256,address)","6fd9227e":"TokenSold(address,uint256,uint256,bool)","6fd98bee":"updateTimes(uint256,uint256)","6fda5534":"rockOwningHistory(address)","6fdada81":"proofOfRich(string,string)","6fdb4f42":"revokeUsers(address[])","6fdbc590":"CreateDil(string)","6fdc202f":"ownerTransfership(address)","6fdc45a3":"BangdiToken(address)","6fdca5e0":"setOpen(bool)","6fdcc8a9":"listRecords()","6fdd2ab4":"createStage(uint8,uint256,uint256,uint256,uint256)","6fdd5f58":"ShopKeeper(address)","6fde3dc0":"getRunesValue(uint256)","6fde8202":"upgradeabilityOwner()","6fde90bc":"setCCH_edit_2(string)","6fdf9a3f":"sendToRstForAddress(address)","6fdf9f28":"setBDError(uint256,bytes)","6fe00356":"investorIDs()","6fe02e98":"tier3Rate()","6fe0e395":"initialize(string,string,uint256,uint256)","6fe11695":"isMajority(uint256)","6fe12f07":"proverka6()","6fe1dbec":"sendSupportETH(address,uint256)","6fe1f6b4":"BAD_ERC20()","6fe33720":"YOTOKEN()","6fe356ea":"moduleIsExist(string)","6fe3a567":"tokenMigrated()","6fe3ef7c":"resolveEntityAddress(address)","6fe497f0":"lockStatus(address,bool)","6fe4c195":"lockAddress(address,address,uint256)","6fe5091e":"collectPayout(uint256)","6fe5b536":"testFailSetEnforceRevisionsNotOwner()","6fe64289":"RepuToken()","6fe665e9":"SlotMachine()","6fe691dc":"getUserTransactions()","6fe69dee":"RealtyCashToken()","6fe7567b":"_subPurchasedFrom(address,uint256)","6fe7f51c":"saleWasSet()","6fe83236":"getAllCardAddressesCountOfOwner(address)","6fe8c29e":"JEY()","6fe8f9c5":"freeTokens()","6fe9e7d7":"freezeUserFunds(address,address,uint256,uint256)","6fe9f632":"preICOrates(uint256)","6febfd02":"getSiteRewards(uint256)","6fee558c":"getHookOperatorContractAddress()","6fee8458":"burnExcess()","6feef2bf":"cancelTknOffer()","6fef4fa9":"setAllowedToSell(bool)","6ff026e7":"purchased_snt()","6ff03fc2":"_removeMaster(address)","6ff08dd6":"calcWhiteBase(uint256)","6ff10dd7":"TrioPeriodicTransfer(address)","6ff1c9bc":"emergencyWithdraw(address)","6ff1ed71":"pickUp(uint256)","6ff1f2b8":"refererPercent()","6ff26ebb":"longBuy()","6ff2817c":"batchDetachAssets(uint256[])","6ff28657":"Josephtoken()","6ff2c12a":"setMiniPoolEdit_6(string)","6ff36340":"eTimesChain()","6ff46ba7":"deathData_a10()","6ff5a670":"PortalToken()","6ff6c4b8":"setCreatorFeePercent(uint256)","6ff73201":"setCooldownTime(uint256)","6ff79410":"numberOfComponents(address)","6ff89159":"revokePermission(address,string)","6ff8a27e":"buyTokens(address,uint16,address)","6ff8e332":"allowedAirDropTokens()","6ff93476":"tokensAllocatedForFs(address,address)","6ff968c3":"successor()","6ff97f1d":"allTokens()","6ff9db5b":"msgHash(bytes)","6ffa1257":"etherSoftCap()","6ffa1caa":"double(int256)","6ffa1d48":"LogCreateICO(address,address,uint256)","6ffa1ea7":"getRegulatorProxy(uint256)","6ffb341e":"calculateKebabBuy(uint256,uint256)","6ffbff9c":"importMET(bytes8,bytes8,address[],bytes,bytes32[],uint256[],uint256[],bytes)","6ffc0896":"checkIfSuccess(bytes32)","6ffc13ab":"POMPAMCOIN()","6ffc22b8":"finalizeReservedAddress(address)","6ffcc719":"bet(uint256,uint256)","6ffe67f2":"autoDestruct()","6ffea7bd":"preToken()","6fff0652":"changePlayerTeam(uint256,uint256)","6fff15ee":"percPoints(uint256,uint256)","6fffffff":"HDK_Crowdsale()","70011870":"credexx(address,address,address,uint256,uint256,uint256)","7001a2a2":"elcoin()","7001fcc2":"closeImports()","700215d0":"SellFinishedAutos()","70021705":"watchVideoC(address)","7002a4e0":"setPartIndex(uint256,uint256[])","7003433a":"setRealityCheck(address)","70037a71":"setPresaleWhitelist(address,bool)","7003a1a3":"EosBlock()","7003ce6f":"UController()","70049c1c":"forwardEherToOwner()","7004a914":"ArbitraryLocker(address,uint256,uint256,uint256,uint256)","7006d538":"verificaCertificato(string,bytes32)","7007adc9":"finalBlockNumber()","7008a4a3":"firstWavePrice()","70090164":"PRIVATE_ADDRESS()","70097106":"addContent(string,string,uint256)","700a7db1":"setCriterionTime(address,uint256)","700b7025":"EthereumHotCoin()","700c9474":"addUsers(address[])","700d3230":"isPiSale()","700dd5eb":"AuthorityNotified(string,string)","700df1f6":"setMigrationStabitcoinAddress(string)","700e17b5":"setData(uint256,uint256,uint256,uint8[])","700e8660":"Marriage(string,address)","700ef803":"SafeBox()","700f3a1d":"addToken(string,int256,bytes)","700f4e40":"test_invalidProxyOwnershipTransfer()","700f55b2":"addTx(address,address,uint256,uint256)","700f9d03":"logEndBal()","7010129a":"tokenTransferVIP(address,uint256)","70101735":"releaseReservedTokens()","70103ea7":"setPaperFee(uint128)","70107c43":"_zthToken(address)","70119d06":"incBy(uint256)","70133e4f":"Xerium()","70144f8f":"activate_kill_switch()","70150282":"FMWorld(address,address,address)","701513c0":"addBooking(uint8,uint256)","70152dcf":"getPrivacyCoins()","7015913c":"end(bytes32)","70165470":"ICOFailed(uint256,uint256)","70183a4d":"stakingExpiration(bytes32)","70185b7e":"updateSafeBalance(uint256)","7018665b":"transferMS(address,uint256)","7018dcb9":"getCastleNum()","7018e950":"affiliatesAllocation()","701969e5":"Penny()","701adee0":"setRequireWhitelistedAddress(bool,address)","701b4063":"balanceOfAtBlock(address,uint256)","701b4631":"hasPayroll(address)","701b8826":"forwardTo(address,address,address,uint256,bytes)","701d9ced":"setTransferOCE(bool,bool)","701dfb92":"HTL()","701e1dfc":"lastInvestorsProfit()","701e5729":"canInvest(address,uint256,uint256)","701e5e71":"_purchaseCar(uint256)","701fd0f1":"reveal(bytes32)","702056de":"REKTtoken()","70206b05":"RepoHandler(address)","7020940a":"NewHope()","702123ae":"unitCoinProduction(uint256)","70212761":"saleFinalize()","7021fad7":"CheckoutLimDay(address,uint256)","70220023":"participantsFor3rdSale(address)","70228400":"isDonatedEthTransferred()","7022b58e":"confirm()","70232f00":"ClaimESC(address,uint256)","70239222":"testSHA256()","70239f0b":"serverEndGameConflictImpl(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,bytes32,bytes32,uint256,address)","70243248":"PeggleCoin()","70245bdc":"adoptCat()","7024ce7b":"BONUS_ICO_ROUND1()","702510be":"payoutSelf()","7025b3ac":"ROLE_KYC_VERIFIED_INVESTOR()","70260363":"setSignatures(bytes32,bytes)","702617e7":"ERC20(string,string,uint8)","70267867":"_addBridgeTokenFee(uint256,uint256)","70269774":"changeOwnerOfMonethaUsersClaimStorage(address)","7026aa04":"getProveHash(address,bytes32,string,bool,uint256,bytes32,uint256)","70279554":"budgetAllocation()","7028439e":"bonusPreIco()","70284d19":"grant(address)","7028875e":"changeStrikePrice(uint256)","7028b3b9":"GetConsentDataCount()","7029144c":"init(string,string)","702921f5":"month()","70296790":"clever()","702a3eff":"advisorsCliff()","702a5f4f":"setLLV_edit_31(string)","702b5f0b":"calcHash(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address)","702b7bc3":"insertValueBonus(uint8,uint256,uint256)","702c25ee":"nextMinimumPodSize()","702c728e":"changeCloudsPerEth(uint256)","702c789e":"select_bua_position(uint256)","702cbbae":"isTokenAvailable(uint256)","702d58d8":"JiJieHao(uint256,uint8,string,string)","702efdf3":"suspended()","702f23a6":"transferAndFreezeMulti(address[],bytes32[],address,address,uint256[],uint256[],uint256[])","702f9019":"Start_qui_qz(string,string)","702fc7da":"ReviewModel()","70316f00":"getUserPayedInCurrentRound(address)","70320126":"newWitness(address)","70320234":"calcBonusTokens(uint256)","70324b77":"darknodeBalances(address,address)","70328770":"logBalance(uint256)","7032d758":"SevillavsBayern()","7033e4a6":"supportsHistory()","7033f1ac":"TNTCoin()","7034c939":"test_2_destroyTokens()","7034d190":"MainSaleBuy()","70354053":"UCCoinSaleIsOff(uint256)","70357e79":"func_08D3()","70359b36":"makeSuperVisor(address)","7036f9d9":"force_partial_refund(address)","7037602a":"setAccountData(address,uint256,uint256)","7037ec6f":"payEntryFee()","70385f0d":"LogPolicyAccepted(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","70387c59":"hashVerification(bytes32)","70393686":"getCOOHashing(address,uint256)","703950ff":"viewKarmaVotes(uint256)","7039dcdc":"setBEY(address)","703a6beb":"getUnitsPerPeriod()","703aca29":"competitorExists()","703add31":"animatorAddress()","703b1411":"requestSellforFX(uint256)","703bf91f":"betSingle(uint256)","703c8a99":"_openProvider(bool,string,string,uint256,string,uint8,bool,address)","703dbd81":"setPI_edit_8(string)","703df793":"updateHardCap(uint256)","703e905b":"getIndexByHash(string)","703eb724":"addShare(address)","703ee574":"CoinvillaSupply()","703f5e8a":"CaDataAddress()","703fa81c":"DOSTToken()","7040bcc9":"createPlayer(uint256,uint256,string,string,string,string,string,string,address,uint256)","7040f3e5":"Allowance()","70416f7e":"getCurrentEthFee()","7041d925":"outsize(bytes4,bytes)","704248ec":"tokensale()","7043ca8e":"getOwnerNickName(address)","7044ce75":"setTKC(address)","70459be2":"transferLeftover()","7045b469":"TotlePrimary(address)","704691e1":"LuckToken()","70477e2b":"Rozium()","70480275":"addAdmin(address)","7049a425":"MarketboardListingDestroyed()","7049cd98":"LinglongCatCore()","704a60f1":"failUserRefund(uint256)","704b164d":"setTradeIsOpen(bool)","704b6c02":"setAdmin(address)","704d4051":"periodSalesLimit()","704d4ab1":"getLostAndFoundMaster()","704d4db0":"poolTotal()","704dcedd":"LSC(uint256,string,string,uint8)","704dd019":"changeFeeCut(uint8,uint8)","704e3dda":"TokenSalePaused(bool)","704e7437":"bountyPart()","704f1b94":"registerUser(string)","704f236c":"freezeAccount(address,address,bool)","70502c5a":"testDeleteItem()","70505653":"arbitrationAddress()","705099b9":"refundTicket(address,uint256)","7050a1ea":"TimetechToken()","7051a831":"setIsContainerForReportingParticipant(bool)","7051b075":"TransferToBuyer(address,address,uint256,address)","705211f4":"approveAccess(address)","7052dad9":"withdrawRemainingTokens(uint256)","7053fe8d":"finalize_contract()","70544b74":"emergencyDrain(uint256)","70544eb9":"hijackPrice()","7055011b":"escrowHistory(address,address,uint256,uint256)","7055060f":"bulkStoreHeader(bytes)","7055410b":"retrait_5()","70557298":"testTransferFrom()","7055d368":"vote(uint256,uint256[])","7056b50f":"blockstillcontracthackable()","7056d1f4":"burnLotIdsByAddress(address)","70578bda":"SPMTToken(address,uint256)","705791f2":"TOKEN_STARTED()","7057c20d":"CFD(address)","705882f2":"setPOOL_edit_22(string)","7058901e":"mtcDailyLimit()","70590ca2":"batch(uint256[],address[])","7059194e":"deletePlayer(uint256)","70597cb1":"startCompanySell()","70598a8e":"subTokenBalance(address,uint256)","705a3644":"block3()","705a940a":"disableBondingCurve()","705b164f":"acquireFreeEgg()","705b37f4":"getTotalF1()","705b5c27":"transferVestingMonthlyAmount(address)","705b7efd":"preSaleContributions()","705b8845":"askQuestion(string,string)","705bbf6b":"updatePrenup(string)","705bbfe6":"eastadscredits()","705bd32a":"fundDevelopment(string)","705ca5cd":"getMultiRequestIdGivenRequestId(uint256)","705d528d":"_addMoney(address,uint256)","705dae11":"cancelCraftAuction(uint256,address)","705e798e":"getLastRoundInfo()","705eeb90":"MultipleConstructorTest(bool)","705f4630":"chfCentsPerEth()","705f911d":"FareBase(uint16,uint16)","705fbf3d":"burnTokensAndRefund(address,address)","705fe7c6":"testEqualityBytes()","7060054d":"dynasty()","70606cda":"supportFreezeQuorum()","7060bfe4":"busyWork(address,uint256)","706194b9":"elenctraToken()","7061e777":"Etats_financiers_10111011()","70620168":"createBroker()","706247a1":"SetVotingDescripion(string)","7062640a":"newDeal(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","706332d1":"right46(uint256)","70634626":"getBTCAddr(bytes32,int256,bytes32,int256)","70646896":"DOWN_etherWin()","70646de9":"canSend(uint32,uint32)","7064aa96":"APPROVE_CONTRACT()","7064b5aa":"getPendingExploreItem(address)","7064d509":"tokenBonus()","7064e50c":"tokenIssuedMainSaleIco()","7064f0af":"COMPANY_ALLOCATION()","7065bedc":"getSettingValuesByTAOName(address,string)","7065cb48":"addOwner(address)","706605b9":"withdraw_arbitrary_token(address)","70660f7c":"stakeExistingContent(bytes32,uint256,uint256,bytes8,uint256)","70670a20":"Ethash(address[3])","7067e881":"RATE_FACTOR()","7067f915":"Constructed(address,uint256)","706910ff":"buy(uint256,address,uint256,uint256)","7069e746":"stakingEpochStartBlock()","706a3604":"sethardcap(uint256)","706a99fb":"codeExportEnabled()","706aba4a":"RNDInvestor()","706b5759":"RegisterDomain(string,string)","706df8d6":"getDonationInfo(uint256)","706dfe54":"getIssueState(uint256,bytes32)","706e11bc":"StartRebuy()","706e5b6e":"getOTCTotalSupply()","706eb3ab":"ethUSDOracle()","706ed71b":"Bomx()","706f6496":"goldRate()","706f6937":"airdropTokens(address[],uint256[])","706f8856":"jiGouTotalBalance()","706ff617":"mint(uint256,uint256,address,uint256)","70708a3c":"LocalToken()","70712939":"removeAuthorizedAddress(address)","70713209":"TJCoin()","7071688a":"getValidatorCount()","707188c1":"changeTime(uint256,uint256)","70720fe4":"_maxTokenSoldICO()","7072a977":"gasForOraclize()","7072aaa3":"newSubdomain(bytes32,bytes32,bytes32,address,address)","7072c6b1":"restricted()","70732188":"getUserTaskAtIndex(address,uint256)","7073c072":"getRegisteredUsers()","70740aab":"purpose()","70740ac9":"claimPrize()","707424fe":"contributorsIndex()","70743768":"voteStake(bytes32,uint256)","70747544":"currentCapLevel()","7074c091":"preSaleBonus1Percent()","7075b1d8":"latestMonarchInternal()","7076738b":"_emitWorkPaused(uint256,uint256)","70767f6c":"fillBidByAddress(address)","7076e27f":"riskcoins(uint256)","70775a59":"_generic(bytes,uint256,address)","707789c5":"setOpsAddress(address)","7077c11f":"SubOnHold(uint256,bool,address)","70780a7a":"shareholder2()","70788340":"Marcelo()","7078f424":"getHint(int256,uint256)","707913f0":"Add_totalLotteryValue()","707a4e96":"start(uint256,uint256,uint256,uint256)","707a7ab3":"acceptOwnerTransfer()","707a92b8":"FoodCoinToken(uint256,string,uint8,string)","707afb1d":"closest(uint256,uint256,address)","707b543d":"createNumber(uint256)","707ba39e":"VilzToken()","707bd28b":"endAirDrop()","707bda7a":"GetLastRoomAndRound(address)","707bdf58":"MaxTokens()","707c4f05":"sendAllFunds()","707c6b4d":"blocksInSecondCapPeriod()","707c750e":"sixthTime()","707d4349":"createPromoCity(address,string,uint256)","707d5fe1":"payoutBonuses()","707dd840":"TAGCASH()","707e8128":"all_referrals_count_by_address(address)","707f4ecd":"crowdTokensTLP2()","707fe454":"MODXCOIN()","70809757":"dispute(uint256,uint256,bytes32)","7081150a":"iconToken()","7081d5da":"getPoolAvgHatchPrice()","708238a0":"mainSaleFirstBonus()","708260b4":"teamToken2018()","7082b421":"parseBlockHeader()","7082d203":"lend(address,uint256,uint256)","70835d98":"CoinAllocation(address,int64,int64)","70835f6b":"approveAddTokenData(uint256)","70844f7a":"sendBadge(address,uint256)","708484db":"blikedUntil(address)","708547f3":"testUpdateLawyer()","70858679":"YDHTOKEN_M(string,string,uint256)","70859da8":"TokenReturn(address,address,uint256)","7085b579":"b2s(bytes32)","70862562":"distributeTokens(address,address,uint256)","7086528e":"DemocracyVote()","70876c98":"purchase(uint256,uint256)","7087b272":"Coneus()","7087ed2c":"getClaimSeed(address)","70887eb9":"totalSoldTokensWithBonus()","7088abf0":"WhiteListCrowdsale(uint256)","7089e4f0":"LogBuyEnabled(bool)","708a4947":"getOptionState(address[3],uint256[3])","708b2097":"TKCC(uint256,string,string)","708b34fe":"submitMessage(string)","708b9d01":"lockThreshold()","708bf79a":"updateMember(address,address,uint256,uint256,string,uint256)","708c2956":"YouGive(uint256,uint256,string,string,address,address)","708cfb25":"setTeamTokensHolder(address)","708d0c57":"updateResolver()","708d9fd3":"group_key_confirmed()","708da969":"verifyAddress(address,string)","708ddf7b":"submitted()","708e03d9":"distributionOfTokens()","708eef42":"transferOwnershipWithHowMany(address[],address,uint256)","708f29a6":"getTotalPayments()","708f8940":"getEXECUTION_GAS_OVERHEAD()","70905dce":"emergencyAdmin()","7091e0c5":"setNewOwner(address,uint256)","70926370":"EGGS_TO_HATCH_1BANKER()","70936880":"defaultWaitTime()","70936a6e":"freezeOf()","7093ab11":"privateSell2LockEndTime()","70948956":"PolicyPalNetworkToken(uint256,address)","7094d21e":"isSuccessOver()","70961774":"getBlockCreatedOn()","7096b6cb":"receiverContractAddress()","7097048a":"claimDerivativeTokens()","70983e91":"startBoardProposal(uint256,address)","70984e97":"bigBlind()","70985eb6":"setCrowdsaleContract(address,address)","7098ad13":"PropertyCoin()","7098e670":"getFincontractInfo(bytes32)","70994b31":"getCollectibleDetails(uint256)","709a36e6":"getMiningMeta(uint256)","709a5359":"updatepresaleRate(uint256)","709bc0ff":"AntitiredToken(uint256,string,uint8,string)","709be206":"registerCreatorsPools(address[],uint256,int256)","709cc16e":"NewCup(address,uint256)","709cf8c0":"saleTokensVault()","709d8c4e":"DSPLT_A()","709e6ed4":"upgradeIdRange()","709eaa93":"minerCreatedCount()","709ecb39":"findPublisher(address)","709ef231":"sellTokens(uint256,uint256,uint256)","709f5ccc":"setDivisor(uint256)","709f6f25":"setData_19(string)","709f84a4":"PriceStrategy()","70a0014e":"projectFundingFail()","70a01b3d":"addInvestor(address,bool)","70a0246a":"toPony(uint256)","70a06777":"getTankAuctionEntity(uint32)","70a08231":"balanceOf(address)","70a0c458":"getBindAccountAddress(string)","70a0f1fe":"numChametzForSale()","70a14c21":"LogBump(bytes32,bytes32,address,address,address,uint128,uint128,uint64)","70a2b84a":"toggleAvailability()","70a4fc11":"toggleDataViewWindow(uint256)","70a6c4bb":"receiverWithdraw()","70a7b3e8":"_validEstimate(uint256,uint256,uint256)","70a7e2dd":"getBunny(uint32)","70a8609e":"test_someOtherTest()","70a89986":"addContribution(address,uint256,uint256)","70a951ce":"TripCash()","70aac052":"getRequestedProductsBy(address)","70ab2359":"MAX_CROWDSALE_CAP()","70ab2822":"assertEq21(bytes21,bytes21,bytes32)","70ab8ba8":"creditUpdate()","70ac4bb9":"right32(uint256)","70ac62ec":"getTranslationLanguageList()","70ac970b":"test_24_assertGasUsage700Boards()","70aca69a":"lockUpEnd()","70acbe0e":"rate_change(uint256)","70aceae8":"upX(uint256)","70ad0cc6":"delAddr(uint256)","70ad858b":"infoWithdraw13()","70ae882f":"finishNextGame()","70ae92d2":"nonce(address)","70ae992a":"pubKeyToAddress(bytes)","70aecf61":"getContractReceiver(address)","70b0d4ac":"GetAccountIsNotFrozenForReturnCount()","70b1d9d4":"requestCanonicalFormat(bytes)","70b257a4":"pushClient(address,bytes32)","70b2a30f":"tokenToEth(uint256)","70b2ef56":"EntropyTestToken()","70b2fb05":"bettingEnd()","70b3b0e5":"countriesWallet()","70b3c7de":"CrypteloPublicSale(address,address,address,address)","70b3d68c":"signHash(uint256)","70b3db6f":"getCoinAge(address,uint256)","70b45ca0":"_rateFromDay(uint256)","70b57415":"product2_pot()","70b581ad":"finalize(string)","70b60760":"getNodeIdsLength()","70b7596b":"getWinnings()","70b7f9f3":"setTradingAllowed(address,bool)","70b80d77":"WCME()","70b8206c":"getRoundRefIncome(address,address,uint256)","70b8d29a":"saveMsgByAdmin(string,string)","70ba1113":"percent()","70ba3339":"cancelTransaction(bytes32)","70bab35d":"systemStartingPriceMin()","70bad87e":"revokeFarmerCertificate(address)","70bb478f":"makeTrade(address,address,uint256,uint256,uint256,uint256)","70bc52fb":"protectAddress(address,bool)","70bdd155":"oracle_price_decimals_factor()","70be4ffa":"testErrorUnauthorizedSetPackage()","70be564b":"Trump()","70be61d1":"ApplicationInFundingOrDevelopment()","70be89c1":"addAddressesToWhitelist(address[],uint256)","70be8a86":"ownedCoin(address,uint256)","70bf7b96":"_collect_fee(address,address,uint256)","70c0b647":"getOwed(address)","70c0c516":"directMintLimit()","70c0f689":"getApplicationState()","70c10578":"takeProfit()","70c18199":"getResponse(uint256)","70c1854e":"FLOCK()","70c31afc":"tokenImprint(uint256)","70c33b31":"changeGasRequired(uint256)","70c35951":"referralPercentOfTotal()","70c40842":"_setTokenOwner(address,uint256)","70c4488d":"validNick(string)","70c494fc":"ATC()","70c4ce24":"newListing(string,uint256,string)","70c4f2e1":"MIN_SHARE_OF_POWER()","70c55e1f":"getTradingPairCutoffs(address,address,address)","70c5f786":"TEAM_CAN_CLAIM_AFTER()","70c5fc9d":"clearTickets()","70c690f4":"MultiOwnable(address[],uint256)","70c6abf5":"resetAllData()","70c6b20c":"newEntity(uint256,uint256)","70c7e230":"change_status(string)","70c80630":"isOwner(uint32,int256,address,address)","70c8251d":"AttributesSet(address,uint256)","70c83314":"airDropToken(address,uint256)","70c8405b":"GiftGenerated(address,address,address,uint256,uint256,string)","70c8658a":"getNewRegistry()","70c8f8ad":"createFirstRound()","70c9edb7":"BTCRelayTools(address)","70ca4c26":"getLinkedAddress(address,address)","70ca6446":"AnotherMethod(uint256,uint256,uint256)","70cbed78":"oracleCallbackGasPrice()","70cc5e45":"kgtHolderCategory()","70ccd928":"hashesLength()","70cd89eb":"CRLperMicroEther()","70cd9bfd":"GPRDSQToken()","70cda533":"updateCoeff(address,uint8,uint128,uint256)","70cddf74":"addApproval(address,address,uint256,uint256)","70ce0765":"createPromoListing(uint256,uint256,uint256)","70ce90d5":"ConfirmManager()","70cef2b8":"getVisaPrice(address,uint256,uint256)","70cf7508":"isValidAirDropForIndividual()","70cfaa8d":"calledUpdate(address,address)","70cfab63":"chargeFeeAndLockEthBalance(address,uint256)","70d01861":"adminSetCity(address)","70d02691":"getAssetBalances(address)","70d07575":"awardTokens()","70d084c0":"SingularDTVCrowdfunding()","70d0c5d8":"EOUNCE()","70d0cc86":"getElementView(uint256)","70d12c31":"resetPeerWallet()","70d1383d":"createEditionMeta(uint256)","70d17adb":"isDrawn(uint256,address,uint256)","70d19a43":"itemCancelMarketsWhenPaused(uint256)","70d1cde4":"randomCount()","70d1e6b4":"minimalWeiTLP2()","70d22f14":"addHash(address)","70d25a9f":"lockUpAmountStrOf(address)","70d271ab":"StartCampaign()","70d290b5":"getDoneAddresses()","70d37810":"makersCount()","70d383dc":"createManyProxies(uint256,address,address)","70d4d119":"giftEth(address,uint256,string)","70d4d7b4":"promoGen0()","70d53be5":"find()","70d54287":"VantageToken()","70d5ae05":"burnAddress()","70d60adf":"acceptBid(string,uint64)","70d66693":"drainToken()","70d695f7":"VerifyEd25519Packed(bytes)","70d70e9b":"getCofounders()","70d72d63":"getAllPixels()","70d762c2":"basicDayPercent()","70d7a0e7":"authorizeKyc(address[])","70d81666":"LogS(string)","70d8915a":"getApplicationAddress()","70d94ed0":"getHoldAmount(address,uint256)","70d9f7dc":"awardItemRafflePrize(address,uint256)","70db69d6":"maxBuy()","70dbb783":"AMBASSADOR_TWO()","70dc4de5":"withdrawKRI(uint256)","70dc8259":"totalDistributedi()","70dc86cd":"EARLY_FOUNDERS_CAP()","70dd2e06":"setMinActivatedToken(uint256)","70ddeb03":"CRMTToken()","70de1e30":"getItemItemId(uint256)","70de8c6e":"start(string,uint64,uint8,uint32)","70dea79a":"timeout()","70df42e1":"changeBurnBounds(uint256,uint256)","70e0abb1":"returnInvestmentRecursive(uint256)","70e0bd61":"setTrustedMinterAddr(address)","70e18692":"cancelIncompleteOrders()","70e32ae7":"firstBonusLimitPercent()","70e3ccf7":"initMiaoMiaoAddress(address)","70e44c6a":"Withdrawal()","70e4b809":"_setBuyTime(uint256,uint32)","70e5bf4d":"queryVote(uint256)","70e6b2b9":"makePayableRegistration(bytes32)","70e6d387":"evolveCryptoAvatar(uint256,uint256,uint256,uint256,uint256)","70e71ea3":"etherandomSeedWithGasLimit(uint256)","70e7732d":"getSpecificSellerTransaction(address,address,uint256)","70e87aaf":"move(uint8)","70e8c1b3":"test_complexNewProposalAndVoting()","70e8dffa":"TokenHold(address,uint256)","70e9a612":"BariCoin()","70e9ff60":"cancelBuyOrder(address,uint256)","70eaa1b4":"Error(uint32)","70eae6c0":"travelTotalEarning()","70eb6424":"setSmsCertificationRequired(bool)","70ebf814":"addUntrustedSelfDelegation(bytes32,bytes32,bytes32[2])","70ed0ada":"getEthBalance()","70ed1664":"organizer3()","70ee555c":"returnTickets(uint256)","70ee9edd":"PublicMiningReward()","70ef14de":"Drops(uint256)","70f0c351":"purge()","70f0dfee":"MultisigWalletZeppelin(address[],uint256,uint256)","70f18295":"TokenPETER()","70f18bcd":"UnlockToken()","70f199d2":"indAddress()","70f37d27":"fundPool()","70f4c18c":"oracleQueryType()","70f5b71c":"createController(address,address)","70f5d3de":"WthdrawToCreator(uint256)","70f6489e":"WHOIS(address)","70f65977":"_migrateToken(address,address)","70f6ac15":"RegistrationDeposits(address,address)","70f6c906":"_refundWEICustomer(uint256,uint256)","70f705ba":"ChargersCount()","70f74228":"TokenATC(uint256,string,uint8,string)","70f79b84":"SEO()","70f80828":"reactions(uint256)","70f85731":"setPhaseEndingCriteria(uint256,uint256,uint256,uint256)","70f8de1f":"changeGasFee(uint256)","70f9c021":"forcePay(uint256,uint256)","70fa66db":"deauthorizeCasino(address,address,uint8,bytes32,bytes32)","70fbf6e5":"openGamePlayNos(uint256[])","70fd37cf":"totalInvestments()","70fde32c":"mul(uint96,uint96)","70fe19a3":"blocktubeFarming()","70ff6325":"withdrawTuneBalances()","70ffe53d":"mood()","71007509":"refundTokens()","7100a4e6":"addAccessory(uint256,string,uint256,uint256)","71026acc":"EXPECTED_START()","7102b728":"vested(address)","7102c138":"Standard_Token(uint256)","7102f74d":"recalcTokenPrice()","71037b1e":"flagUSInvestor(address)","71039256":"BUCToken()","7104a142":"getNumberOfVerifiers()","71056a78":"ChangeEtherGasProvider(address)","71061398":"getRoles()","7106312c":"emergencyAddr()","7106bd46":"mintContractByIndex(uint256)","7106cdb6":"CloudexchangeCrowdsale(uint256,uint256,uint256,address)","7107283f":"create_tablet(bytes32)","7107d7a6":"minBuy()","710908c9":"levelThreeBonus()","71098a35":"startStop()","71098e15":"totalSTC(uint256,uint256)","710ad128":"getHatchingEggData(address)","710b2d8c":"getAddressRatio(address)","710bf322":"proposeOwnership(address)","710c6705":"updateCapFlex(uint32)","710cba8b":"isAllowedOverrideAddress(address)","710d6a61":"unPauseTransfers()","710dff42":"isdrawadm(address)","710e5d2f":"setMaxFee(uint256)","710edb10":"multisignWallet()","710ee68e":"DOGEToken()","710f3953":"add_entity(string)","710fe6f8":"getWithdrawBalance()","710ffc72":"changeTribeOwner()","71101891":"DharmCoin()","711085b2":"arr(address,address,uint256,uint256,uint256)","7110ce25":"MyRefReward()","7110eed7":"createRegistryInstance(address,address)","7111abf2":"SessionOpen(uint256,uint256)","7111ed97":"TopPayCoin()","71135f8b":"setStopped()","7113d35d":"pickFood(uint256,string,string,uint256,uint256)","7113e5e2":"findKey(address,uint256,uint256,uint256)","71140942":"MIN_ETH_FUND()","71145486":"rebuildManagerList()","71147d32":"STRC_ADDR()","7114a96e":"transferReferral(address)","7114c13a":"sendTaster(address)","71156c73":"TheFund()","7115c8bd":"xdao(uint256,string,string)","7115c988":"Batch(address)","711619de":"setPubEnd(uint256)","711748a3":"removeModuleAtIndex(uint256)","71175249":"INEXToken()","7118f854":"icoSuccess()","711953ef":"setGameAddress(address)","7119a490":"setBtcPriceProvider(address)","7119c873":"transferSSPRecord(address,address)","711b4871":"getOptionBuyOrders(uint256,uint256)","711bf9b2":"setAuthorized(address,bool)","711bfa89":"month12companyUnlock()","711c2b94":"setTestMarket(bytes32,bool)","711caf40":"transferStep3(address)","711cbc26":"PartyRegistry()","711d11bf":"ev(string,address,uint256)","711d4407":"updateBonuses(address,address,bool)","711d649b":"getCatNames()","711f63bf":"toBytes32(bytes,bytes,uint256)","7120d381":"getUpdateTokenAge(address,address,uint256)","7120fab4":"discountCollect()","71215af6":"DAYS_28()","712173de":"CrowdsaleStarted(uint256)","71221e38":"RareCoinAuction(uint256)","7122e857":"setParticipantWhitelist(address,bool,uint256)","7123691e":"removeSERAPHIM(address)","71236b92":"Owner(address,uint256)","712394b6":"nexumToken()","71245f6e":"BTCValue()","7124abf3":"getLastPayouts()","7124c683":"setUpdateInterval(uint256)","7124d613":"changePaymentAddress(address)","71254d9b":"setFeesDistributionPercentages(uint256,uint256,uint256)","7126a855":"configure(uint256,uint256,uint256,uint256,uint256)","7126b6ff":"_grantAdmin(address)","71270b46":"initCards(uint256)","7128ad73":"PaymentReceived()","7128defb":"removeSupervisor(address)","712980a2":"banUser()","712a10bf":"COIN_SUPPLY_ICO_PHASE_2()","712a5094":"balanceOfTheContract()","712aa191":"isValidCustomerTxPaymentForKWh(address,bytes32)","712ac60e":"onRemoval(string)","712b1ed0":"triggerInput()","712bb1b8":"getDataColla_AA_01(string)","712c0c5a":"withdrawDirectDebit(address[],bool)","712c3f7a":"addressPartnershipsAndExchanges()","712ca0f8":"getOrder(string)","712dd575":"raiseSellOrderCancelled(address,uint256,uint256,uint256,uint256,uint256,int160)","712f22a0":"getVolumeBonus(uint256)","712f4d70":"_generateShortLink()","712f5e72":"SetRoundTime(uint256)","712f7790":"publicGetStatus()","713081d0":"setPromoter(address)","7130d7ce":"get_asset_event_details(bytes32,uint256)","7132d337":"citadelTransfer(address,uint256)","7132ebcd":"switchPaused(bool)","7133c0c0":"calcAmount(uint256,uint256)","713494d7":"setReferralFee(uint256)","7136982b":"getHolderCount()","7136d509":"playCEELO(bytes32,uint256[6])","7137047a":"setDealCancelRate(uint256)","7137b024":"Banliang()","7137e072":"getAllTemplateProposals(address)","7137ed47":"setProxyContract(address)","7138364b":"adventureItem()","7138bc92":"transfer(address,address,address)","7138e0c9":"divForSellBack()","7138ef52":"right9(uint256)","71393c60":"storeLedgersInIpfs()","713942f7":"getUserVerified(address)","713955e8":"ico2endTime()","71395818":"ItemsMarket()","71398637":"batchToApplyMilestone(uint8,address[])","7139b1ca":"balanceOfRoutingCode(bytes32)","7139b595":"withdrawDthShopAdmin(address,address)","713a7eef":"Xingqiub()","713b563f":"database()","713be000":"checkoutCart()","713be126":"changeRateSetter(address)","713d30c6":"updateState(int128,uint128,uint8,bytes32,bytes32)","713eba52":"OwnershipRequested(address,address,bytes32)","713ec905":"recordAddress()","713f5e4d":"sendEthToContract()","713fd253":"Limit_Amount()","713ffc3b":"setNextGameSettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","714064f3":"BreakableBond(address,address,uint256)","7140bdf3":"get_all_best_offers()","7141856d":"getNumProps()","7141aa8b":"getTitulaire_Compte_3()","7142087c":"allowTransferGlobal()","71427ac1":"SuperLitecoin()","7142b17d":"dataForOwner(address)","7142b191":"MultiplesaleAirdrop(address[],uint256[])","7143059f":"getParticipant(address)","714383ad":"HYPEToken()","71443c4d":"soldDragons()","714490ab":"WithdrawToBankroll()","7144e81e":"Cremit()","71450e30":"tierIndexByWeiAmount(uint256)","7145644c":"calculateBTS()","71461be9":"getCurrentMilestoneProcessed()","7146bd08":"MAX_PURCHASE()","71476f35":"clear(address,address,int256)","71478fae":"_getTokenIdFromBytes(bytes)","714897df":"MAX_VALIDATORS()","71489835":"isRed()","7148ba36":"_createCard(string,uint256)","71492685":"getTo()","714a2f13":"assertEq(int256,int256,string)","714b1443":"CancelBuyOrder(bytes32,address,uint256,address)","714b4465":"MakerTransferredEther(address,uint256)","714c5d9d":"BMT(uint256,string,uint8,uint256,string)","714ca446":"adopt(uint32,int256)","714ccf7b":"setVault(address,address)","714d497a":"maxPerExchangeBP()","714d582e":"sdc(address)","714d5fae":"cancelRemoveOwnerRequest2()","714d9537":"cancelEvent(bytes16)","714dc20d":"ownerChanged(address,address,address)","714e2ec9":"vanilCoin()","714e42a1":"getSaleRate(uint256)","715018a6":"renounceOwnership()","71506977":"EXCHANGE_RATE_DECIMALS()","7150773d":"donateFunds()","7150d8ae":"buyer()","71513e9d":"reSet()","71515a36":"SXSYCoin()","7152f800":"gameResult()","71535f0d":"tenthTime()","71543cfc":"unWhitelistUsers(address[])","71543f39":"Eetgccoin(uint256,string,string)","715469d0":"logoX()","7154ae61":"CheckNumbers(uint8[5])","7154b798":"addExploreData(address,uint256,uint256,uint256,uint256,uint256,uint256)","7154b8b5":"setPercent(uint256)","71551178":"testDisputedInvalidSequenceWrongReadAddress()","71560f80":"emulatePurchase(address,address,uint256,uint256)","715851a0":"getCheckingBalance(address)","71586383":"totalTokensReceived()","71587988":"setNewAddress(address)","71589d6b":"newponzi()","7158e346":"NatCoinCrowdsale(uint256,uint256,uint256,address)","7159271d":"publicsalestartTime()","71599987":"increasePendingTokenBalance(address,uint256)","7159a618":"operate()","7159db81":"lastTier()","715b208b":"getAllAddress()","715b99f8":"_isSignedPrefixed(address,address,bytes32,uint8,bytes32,bytes32)","715d4a64":"sellsubscribers()","715d574e":"CarboneumToken()","715db6ea":"TheMark()","715e0e4e":"repurchase(address,uint256)","715ed24b":"setVIPThreshold(uint256)","715eddda":"starbaseEpAmendment()","715ede94":"auction(bytes32)","715ef43d":"newPurchase(address,uint8,uint8)","715ef4ff":"resendFailedPayment(uint256)","715f8975":"JOINT_PER_ETH()","7160138c":"unlockedTeamStorageVault()","71608d05":"getBalanceModificationRounds(address,address)","71612620":"transferFST(address,uint256)","71616b84":"calculateTokenCrowsale(uint256,uint256)","7161c5df":"setBracketPrice(uint256,uint256)","7161c66d":"RunManager(bool)","716210d8":"addHodler(address,uint64)","7162f182":"resetRip()","716344f0":"preIcoEndTime()","716437b5":"testApproveTransfer()","71645971":"toList()","71658552":"getUint(address,bytes32)","71658896":"getTopic(uint256)","71674ee5":"maximumIcoRate()","7168e5d3":"ownerSetAdmin(address)","71697efa":"getSumWithdrawals()","7169a63e":"IcoCancelled()","7169afa6":"getOldFrozenAccount(address)","7169dd5d":"intial_supply()","716adc36":"setMyOracle2(address)","716af639":"minePoP(address,uint256)","716c0a31":"computingCharge(uint256)","716d3c6c":"adjustReward(uint256)","716e5604":"startItemRaffle(uint256,uint256)","716f10bf":"isWhitelistOn()","71716992":"ThankYouToken(uint256)","71726f69":"HOWEOToken()","7172a1f2":"testLedgerCreation()","7172d9f0":"OtomatizToken()","71740d16":"numDarknodesPreviousEpoch()","7174164b":"XPTToken()","71748a8b":"WSR(address)","7174ac9e":"setEscrowedTaskBalances(uint256,uint256)","71752d06":"getOwnerByItemTypeAndId(string,uint256)","7175d709":"SPARCAddress()","71765e74":"VendMultiSigWallet(address[],uint256)","71766ae3":"disableManuallyBurnTokens(bool)","71773fc2":"lasttimereduce()","7177a7dd":"canTransferTokens()","71781a79":"subToken(address,uint256)","71784312":"distributeVariable(uint256,address[],uint256[])","71793195":"__isFeatureEnabled(uint256)","7179d079":"mainFundBalance()","7179ed22":"autoPrice()","717a195a":"setOutcome(int256)","717a945a":"USD_Omnidollar()","717b3726":"transferFromBank(address,uint256)","717cb858":"ZUE()","717cee7d":"updatePeriodDuration(uint256)","717d5527":"getMoney(address)","717de52e":"creditCommons()","717e1418":"VebionX()","717e9745":"setNewControllerAddress(address)","717f24c6":"emergencyWithdraw(address,uint64)","717f6f7f":"MYCCToken(uint256)","717fecea":"vesting2Withdrawn()","717fedf0":"getFirstActiveDuel1()","717ffe91":"buyTokensAsset(address,address,uint256)","7180dd8a":"_giveToken(uint256,uint256)","718167c4":"AddValues(uint256,uint256)","718228fa":"totalTeamContributorIdsAllocated()","7182774d":"exchanged()","71827791":"nextContributorIndexToBeGivenTokens()","718350a9":"_removeMaliciousValidatorAuRa(address)","7183616c":"notarize(string)","7185354b":"changePerEthToBlocNumber(uint256)","7185393c":"updateAppExec(address)","7185637b":"DailyDivsSavings()","71857000":"setLogic(address)","7185acb8":"viewMyComponent(uint256)","7185f163":"stopTrading()","71863031":"isPublicIcoActive()","71868032":"addOffChainAddresses(address[])","71873971":"PROOF_TOKEN_WALLET()","71882ab0":"distributeContest()","7188c8a4":"reFunding()","71892e3f":"getMyKnowledge()","718aa629":"NEX()","718b0a32":"withdrawBuyDemand(uint256)","718bd6dd":"setRequestUntil(uint8)","718c025a":"ethPreAmount()","718c6569":"TimeSecondToken(uint256,string,string)","718cc769":"makeBet(uint256)","718d763a":"playerCost()","718da639":"addNewSecretHash(bytes32)","718da7ee":"setReceiver(address)","718df9d7":"getPlayerSpaceshipUpgradesById(uint256)","718dfb7e":"hasPreICOClosed()","718e6302":"play(string)","718e6c44":"isManageable(address)","718eaa50":"setLayerParent(address)","718ec079":"setMarketCreationCost(uint256)","718f81c2":"getCCH_edit_11()","71906087":"airdropToAdresses(address[],uint256)","719102d7":"createItem(uint256,uint256,uint256,uint32)","7191474b":"pendingUFT()","71929547":"OceanScapeCoinAdv(uint256,string,string)","7193ab70":"balanceUnlocked(address,address)","7193b1e4":"refundCfd(uint128)","7193f2f0":"supported(bytes32)","719591c7":"requestComputation(string,string,uint256,uint256)","7195d944":"dataOfPart(uint256,uint256,uint256)","7195eed2":"EtalonGlobalToken()","71974cbe":"lastBidBlock()","7197c6d2":"firstTTax()","719874da":"profitFromCrash()","7198801d":"getWorkTime(uint256,uint256)","7198e08c":"createLoveBlock(string,bool)","7199139f":"TheAbyssDAICO(address,address,address,address,address,address,address,address,address,address,address,address)","7199f6d4":"safedrawal(uint256)","719a0f8c":"removeOfficer(address)","719b2e07":"setDisputeRoundDurationInSeconds(uint256)","719c78ac":"setCodedate(uint256)","719c86e3":"team_lock_count()","719ce353":"Brokenwood()","719ce73e":"prizePool()","719f2fb7":"_calTeamAttribute(uint8,uint8,uint8,uint32[11])","719f3089":"getLocks(address)","719f8d3a":"checkIfWhiteListed(address)","71a009ad":"BRLTOKEN()","71a03078":"TMCToken(uint256,string,string)","71a04009":"newIssuer()","71a18bfb":"emergencyDrain(address)","71a2e46d":"OWN_transferOwnership(address)","71a2f964":"newPaymentAddress(address)","71a4dc5e":"getLuckyblockEarn(bytes32)","71a5367f":"setAllowPaymentsWhenPaused(bool)","71a66e7c":"addOrUpdateHolder(address)","71a67aa9":"getFunctionAuthorizationHash(address,address,string,bytes32)","71a7462e":"balance_(address,address)","71a7c439":"distribute21ST(address[],uint256)","71a80ba3":"setBurnFeeReceiver(address,address)","71a8270a":"buyObizcoinTokens(address)","71a8ba25":"getEtherBoxes(address)","71aa60fd":"calculateTokens(uint256)","71aad2dd":"preICOamountBonusLimits(uint256)","71ab0e3c":"sellDai(uint256,uint256,uint256,uint256)","71ac5c60":"WeToken(address,string,string,uint256,uint256)","71ad3e73":"isMakePermitted(uint256,uint256,address,address,uint256,uint256)","71ada3fb":"getCash(uint256,address)","71ae8f02":"fundingMinimumTargetInWei()","71ae973e":"createGen0Auction(string,string)","71aeae44":"hasBallotEnded(uint32)","71af5d0e":"setFailedVerificationSlashAmount(uint256)","71afc713":"marketingTokenAmount()","71b1d2d3":"RANGEEND_PRESALE()","71b22e61":"EnableRefund()","71b2354d":"MINC()","71b3659e":"currentTokenPrice()","71b397cf":"getCurrentRoundIsFinished()","71b45696":"StcToken()","71b475d0":"STQPreICO3(address,address)","71b4f4ef":"setDEXContractAddress(address)","71b505ad":"setLargeCapWhitelistParticipant(address,uint256)","71b5ee71":"allowTokenTransfer()","71b6663e":"play1(address,uint256)","71b6a376":"setNumberOfPlayers(uint256)","71b6d36d":"isNotaio(address)","71b6d6ea":"getAttributeTimestamp(address,bytes32)","71b7d5c4":"priceUpdateWaitingTime()","71b804ee":"getBettingPrice()","71b80b8f":"upgradeCardConfig(address)","71b9b646":"saleEnabled()","71ba3612":"Plasma()","71bad4d8":"jackpotMinimumAmount()","71bb263d":"contractPartThree(uint256)","71bb3cc8":"GivethCampaign(uint256,uint256,uint256,address,address)","71bbefc7":"payPlatformOutgoingTransactionCommission()","71bc9d62":"_generateDetail(uint256)","71bd1f47":"MinCapReached(uint256)","71bdb914":"softCapLimit()","71bdbc9a":"SetCityData(address,uint256,uint256,uint256,uint256,uint256,uint256)","71bde852":"_startNextCompetition(string,uint32,uint88,uint8,uint8,uint16,uint64,uint32,bytes32,uint32[])","71be0c27":"preSale5()","71be1851":"ShopDeployed(address,uint256,uint256,uint32)","71be8766":"Contribution(address,address,uint256)","71beae97":"currentCoinsCreatedPercentage()","71bf35b6":"minMinutesPeriods()","71bf439e":"CANVAS_WIDTH()","71bf5a95":"setENS(address)","71bfa03f":"getRedemptionBlockNumber()","71bfabca":"resultOf(uint256)","71bfd48b":"content(string,uint256,string,string,uint256)","71c02b7b":"BSAFE()","71c03d76":"get_rest(uint256)","71c10778":"weiToPresalersFromICO()","71c147fb":"addAccount(string,uint256,string,string,uint256)","71c157d1":"addInsuranceProduct(uint256,string)","71c1d196":"numContributors(uint256)","71c1dde5":"get_presale_arbits_per_ether()","71c2835e":"operater()","71c396cc":"migrationAddress()","71c4275a":"setWeight(bytes32,uint256)","71c4980b":"getBlanace()","71c57772":"eucDist2D(uint256,uint256,uint256,uint256)","71c58b25":"internalTransfer(uint256,uint256,uint256)","71c59097":"MainnetSurvey(uint256,string,bytes32[])","71c66459":"LogPaymentReceived(address,uint256)","71c6d4dc":"pearlContract()","71c6dc50":"ProofOfCraigGrant()","71c6e049":"addUsers(address,uint256)","71c78ce7":"totalAirDropped()","71c79588":"releaseName(bytes32)","71c7e923":"dDisableErc20OwnerClaim(bytes32)","71c80c67":"COOPET(uint256,string,uint8,string)","71c82c14":"setOraclizeGasPrice(uint256)","71c847b2":"detailsOfEdition(uint256)","71c85da2":"LogN(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256,uint256)","71c8e333":"getSundownGraceTargetBlock()","71c93fc7":"processDiceRoll(address,uint8)","71c95040":"EFF(address)","71c9572b":"maxBidInCentsPerAddress()","71c9a754":"topiToken()","71c9e177":"SpudToDivs(uint256)","71ca2117":"isAuditorRegistered(address)","71ca337d":"ratio()","71cabfb8":"getYumerium(uint256,address)","71cacc9e":"addLotteryPrize(uint256,string,uint256,uint256)","71cb9769":"addIdentity(bytes32,bytes32)","71cbb22a":"fixed_value()","71cbef8a":"sendTokensAfterCrowdsale(uint256,uint256)","71cc4f35":"Alecrypto()","71cc805a":"refund(string,address)","71cce314":"Kolak()","71ce52ed":"senderIsAdvocate(address,address)","71ce9a4a":"forwardCallGas()","71ced69d":"mintNewDNC(address,uint256)","71cf586f":"CanISuscribeTrial(uint256)","71cf5979":"market_AcceptBid(uint256,uint256)","71cf866e":"_redeemIsAllowed(uint256)","71d06675":"getInteres(address)","71d0cf01":"setCustomerSignature(address,uint256,bytes)","71d0ed05":"betsKeys(uint256)","71d141f9":"doOraclize(bool)","71d1995e":"changeEmployee1(address)","71d30a17":"Match(address,address,bytes32,bytes32,uint256,uint256)","71d31a13":"withdrawTokens5(uint256)","71d3de1b":"setStates(uint256,uint256,uint256,uint256)","71d3de2b":"JincorToken()","71d49910":"_emitAreaSet(uint256,bytes32)","71d4aa3a":"fomo3D4eva()","71d4edaf":"setSaleLot4StartTime(uint256)","71d50cc8":"payBets(bytes32)","71d5af66":"Upfinex()","71d5afb5":"extendCrowdsale(uint256)","71d5b5dd":"getBonusPoolTotal()","71d5d1c2":"updatePrincipal(uint256,uint256,bool)","71d5ffbe":"totalETHWagered()","71d6dbe1":"isClaimSegmentVerified(uint256,uint256,uint256)","71d6e229":"queryRole()","71d76096":"ICOcollected()","71d7c621":"createDownRequest(address,uint256)","71d7e4a9":"transferTokens(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","71d87948":"FixedSupplyToken(string,string,uint256,uint8)","71d8d421":"_isValidLicense(uint256)","71d8d7af":"setMaxRate(uint256,uint256)","71d93cb0":"interuser(address)","71d9ffce":"priceChange()","71da0e63":"_getValidRandomGenes()","71daca00":"grantBackerToken()","71dc761e":"enableERC721()","71dd46a9":"left19(uint256)","71dd8862":"IndexOf()","71dd99fe":"BigRisk()","71ddd3ad":"multifunctioncoin()","71de2ffc":"claimRefund(bytes32)","71de6362":"certificateSigners(address)","71df8d09":"bigInt(uint256)","71dfc116":"Cryptolotto10Minutes(address,address,address,address)","71e030d3":"TokensTransferedToHold(address,uint256)","71e07813":"issueDevsTokens()","71e11354":"updateRegistration(string,string)","71e12726":"getBlockStats()","71e1fa95":"getHtlcTimeoutBlock(bytes32,bytes32)","71e28126":"canFinalize()","71e2a657":"addMinters(address[])","71e2d919":"lol()","71e30719":"ZEC()","71e365a0":"AICQ()","71e3c76e":"claimGrant(bytes32)","71e3c819":"DSToken(string)","71e3fdc4":"moveMintTokens(address,address,uint256)","71e4cfd7":"ROF()","71e5b9ec":"scanAddresses(address)","71e5ee5f":"arr(uint256)","71e60fe6":"testFailTransferEnableNotTransferable()","71e68cad":"claimUsername(bytes32)","71e70133":"TotalTokens()","71e777ae":"getMemBestInvestor()","71e928af":"issue(address)","71e9f016":"CompetitionChainContract(uint256,string,string)","71ea29df":"blockedContract()","71ea3aad":"CollectERC20(address,uint256)","71ea6c73":"VIBEXToken()","71ea87ee":"getPeriodRange(uint256)","71ea980c":"rewardPoolWallet()","71eb9710":"getDebitDigest(bytes32,uint256,uint64)","71ec4cc1":"depositPayout(uint256,uint256)","71ec98dd":"issueTokensFromOtherCurrency(address,uint256)","71ed4664":"refundTo(address)","71edfe35":"hashOfTheDocument()","71ee2ce1":"getResponses(uint256)","71ee329f":"useCaptainAbility(uint256)","71ee872f":"TransactionSettledByMediator(uint256,uint256,uint256,uint256,uint256)","71eee1f4":"IssueStateLoaded(bytes32,string)","71ef0d0f":"phxCoin()","71ef7862":"seventhTime()","71efb7f7":"SimpleSafeToken(uint256,uint8,string,string)","71efdc21":"usedTickets(uint256)","71efeff1":"transferCommunityBank(uint256,address)","71f027fa":"updateOwnerOfWeapon(uint256,address)","71f098c8":"LecBatchTransfer()","71f0ad64":"TestCrowdsale(uint256,uint256,uint256,address,uint256,uint256)","71f11552":"changeDNNHoldingMultisig(address)","71f124c5":"getDropsOf(address)","71f16739":"_createContract(address,uint64)","71f297cc":"XaurumToken(address)","71f4c9ae":"GameClosed(uint256)","71f4f65e":"yearlyOwnerTokenWithdrawal()","71f52bf3":"connectorTokenCount()","71f5584f":"sponsoredLeaderboardDataContract()","71f64a68":"executeTopic()","71f6fb88":"transferWithReservingNet(address,uint256)","71f7aaca":"dragonIndexToApproved(uint256)","71f7ebf4":"_doTrade(address,address,uint256,uint256)","71f805bf":"numFpBits()","71f84164":"_sendTo(address,uint256)","71f8746f":"registerBuy()","71f90109":"hideDonations(address)","71f90fe6":"initializeABIHashForMod(uint256,bytes)","71f96211":"assetOf(address)","71f9b7f3":"addMultipleAddressesToPublicBuyerList(address[])","71f9ff89":"preICOcap()","71fa632f":"newVoterAllocation()","71fa7f37":"createNewProject(uint256,uint256,address)","71fcc672":"setCryptaurRewards(address)","71fdd6d3":"_canBreedWithViaAuction(uint256,uint256)","71feaac5":"greatgreatcoinERC20Token()","71ff01b0":"maxSupplyReached()","71ffcb16":"changeFeeAccount(address)","72004a65":"getPremiumStatus(bytes32)","72012ef6":"test_oneInvalidEqString2()","72016f75":"getNodeLength()","7202997e":"LogAccepted(uint256)","72030d03":"addresses2(uint256)","72052773":"deleteChallenge(bytes32)","72054df4":"compatible223ex()","72067d49":"getBountyBalance()","72076c57":"ColorBayToken()","72078e3b":"CORNERSTONEAMOUNT()","7207c19f":"MyToken(uint256)","7207d711":"RewardHalved()","7207f9ce":"transactionFeeMax()","7209036a":"fundReservCompany()","720b43e8":"intercrypto_cancelConversion(uint256)","720b7ee4":"getCardId(string)","720be6c7":"CrapToken1A()","720c142d":"setRNGCallbackGasPrice(uint256)","720c4798":"workshop()","720c5732":"TextMessage()","720de551":"deleteVoterForCandidate(uint256)","720e2a06":"GadielToken()","720ed642":"getModuleById(uint256)","720edd13":"theanswer()","720ee37c":"decrementBalance(address,uint256)","72104205":"rewardMint(address,uint256)","72108714":"updateHash(bytes32,bytes32,uint256)","72112ebc":"set_Total(uint256)","72117821":"GetTokenAddress(address)","72121dac":"FooToken()","7212b67e":"add_potion(uint16)","7212eadd":"trigger_game_end(uint256)","7213cff1":"hasLockedUp(address)","7213e335":"guthabenAnzeigen(address)","72142c67":"MSECStandardToken(uint256,string,uint8,string)","7214d6c3":"isUIntPublic()","721547eb":"maintainExternalContractTokenBalance(address,uint256)","7215513f":"addTokenClaim(uint256,uint256,uint256)","72159335":"voteInitiate(uint256,uint256,uint256,uint256,uint256,uint256)","7215b96d":"CheckAllowance(address)","7216ab38":"getByteFromBytes14(bytes14,uint256,bytes1)","7216b95c":"checkLicense(bytes32,uint8,bytes32,bytes32)","7216e02d":"getOracleByName(string)","7216ee00":"totalTrainer()","7217523c":"addDays(uint256,uint256)","721868f8":"queryTinyOracle(bytes)","72198ead":"setDSTMultiSig(address)","7219d7f7":"OrigamiTokenPurchase(address,uint256,uint256,uint256,uint256)","7219dd7f":"allocateTokenETHConvert(address,uint256)","7219fa11":"EIP20(uint256,string,string)","721a1f57":"endorseCredit(address,uint256,uint256)","721a37d2":"revokeTokens(address,uint256)","721b67ab":"CNYTokenPlus()","721bba59":"getTokenBasicData(address)","721c555e":"queryEscrow(address,address)","721d7d8e":"currentContract()","721dd850":"getOwnedAvatars()","721e117b":"getPurchaseRequirements(uint8)","721e9969":"getPressCount()","721ed9ec":"tokensICO()","721fa630":"pubs(uint256)","721fefac":"startNewDraw(uint256)","721ff138":"tokenMintCap()","7220426f":"verifyTokens(uint64,uint64)","7221a26a":"storeValue(uint256)","7221c3c0":"withdrawJackpotBalance(uint256)","72229abf":"setBetFee(uint256)","7222fe1e":"MNY()","72237d97":"setTargetDiscountValue10(uint256)","72239313":"addAccountMinter(address)","7223cd19":"set(address,int256,uint256)","7224267c":"addDeposit(address,uint256,uint256,uint256)","72258f96":"allergy(string)","72259875":"addCourse(string,uint256,uint256,uint256,string,string)","72262699":"forwardOnBehalf(address,uint256,bytes,uint256,uint8,bytes32,bytes32)","7226d055":"create(address,address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","722713f7":"balanceOf()","7227bff2":"setTransferOwnership(address,address)","7227c5dd":"fundMark(uint256)","7227c7ce":"hashNext()","7228057f":"ibcFunded()","7228b9db":"etherCap()","7228becb":"crowdsaleDuration()","72298b82":"setEndTime(uint32)","722bb4a8":"getSuperManagerContractAddress()","722bd85a":"bonusForDate(uint256)","722c885a":"endSeedStage()","722d1267":"forceWithdrawTokensToAnAddress(address)","722d1d13":"setProductCompletionDate()","722ded24":"exeSequence(uint256,uint256[])","722e1677":"getTotalPublicKeysCount(address)","722e9c6d":"Luck()","722f0835":"startPrivatePreICO()","722fe823":"getActionHistoryItem(uint256)","72309714":"setPresellOpen(bool)","7230bce8":"add(uint256,string)","7230eb42":"AllocatedCrowdsaleMixin(address)","7230ef7f":"totalGen0()","72317e7b":"totalWeiRaisedDuringICO1()","7231af39":"getTotalGamesStarted()","72325c5b":"initSiriusFund()","72337396":"unholdFunds()","7233d860":"BitcoinRich()","7234ba0c":"MIN_CROWDSALE_TIME()","7235c8dd":"PeerReview(address,bytes)","7235d2b1":"maintenanceMode(bool)","7236f851":"exchangeByAdmin(uint256,address)","72378554":"sendToken(uint256,address)","7237e031":"tokenToEthTransferInput(uint256,uint256,uint256,address)","72388610":"paybackAll()","72388f7c":"mintSpecificCards(address,uint8,uint256[])","7238ccdb":"getLockInfo(address)","72397287":"createOfAthleteCard(string,string)","723b2b58":"getMemberListCount()","723c308f":"ahs()","723c37f7":"TokensTransferrable()","723e357a":"pushRound(uint256,uint256,uint256,uint256,bool)","723e435f":"setTokenRateInGwei(uint256)","723eb2cc":"hurmint(address,uint256)","723f291d":"cancelOpenBids(bytes32)","723fdfe5":"PaoTestToken()","724020be":"GSCT()","72405ab0":"approve(uint256,string)","7240976c":"trades(address,address)","7240eccf":"approveLess(address,uint256)","7240f67b":"countActiveType(uint256)","72411849":"ChangeTankSellMaster(address)","724121ae":"contentExists(uint256)","72413a3b":"VOLUME_BONUS()","72414501":"SMILO_FOUNDERS_AMOUNT()","7241450c":"deliver(address,uint256,string)","7241eb8c":"_bpto(uint256,uint256,uint256,uint256,address)","72422024":"lockMoneyOnCompoundCreation(address,uint256)","72432965":"AdvisorsAddress()","7243cfbb":"releasableAmount(address,address)","72440c31":"finalizeEndTime()","72453422":"directSellSupply()","7245f6e7":"stageEnd(uint256)","72460869":"test_threeFalseAssert()","72468368":"setBlockTargetDelay(uint256)","724693ce":"TokenSale(uint256,uint256,address,uint256)","7246de3d":"sanityCheck()","72470a14":"ShopManager(address)","7247390b":"vote_beneficiary(string)","72479140":"CreateTicket(address,uint8,uint8,uint8)","7247959a":"referral(address)","7247a50d":"virtualInvest(address,uint256)","7247aafd":"Callous()","72490c69":"GREENECO()","7249733c":"businessPercentage()","7249fbb6":"refund(bytes32)","724a6246":"claimSeasonPrize(address,int8)","724a8487":"getTargetBlocks()","724ae9d0":"getMinInvestment()","724bc3de":"getAirdropAmount(address)","724bdbaf":"externalTxs(uint8,bytes32)","724c8393":"changeCrown(address)","724dbf36":"isNewBattle(string)","724df10a":"alreadyWithdrawn()","724edf00":"startTokenDistribution()","724fcd4c":"buyAndSetDivPercentage(address,uint8,string)","7250dc36":"getMemberName(uint256,address)","7250e224":"addDistributor(address)","72511fb4":"EventAddressChange(address,address,uint256)","72519531":"BagholderAddr()","7252518c":"setLockend2(uint256)","7252bbf2":"ethBalanceOf(address)","725326dc":"setAllowedForTransfer(address,address)","7254895a":"readCards()","7254e1ba":"afterGeneratorHook()","72558b73":"destroyValue(address,uint256)","7255d729":"createGame()","7255f7ad":"getLastImageId()","72561235":"getCreditbitAddress()","72565e3f":"offChainMint(address,uint256)","7257dac1":"removeSomeUETsFrom(address,uint256)","7258b901":"masterCut()","72593831":"withdrow(address)","72593b4c":"ordersCanMatch_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes)","7259ac60":"Rethen()","7259bce3":"preSaleTokenPrice()","725a731d":"setPendingKNCRateRange(uint256,uint256)","725a7eea":"MEGA_HERO_MULTIPLIER()","725ad47f":"TransferERCXTokenInitiationEvent(uint256,address,string,address,address,uint256)","725c8bdd":"LMITOKEN()","725cedd3":"calculateReward()","725d8524":"getOption(bool,address,uint128,uint128,address,uint64)","725da7b4":"withdrawMicroDivs()","725e70a3":"getnumDeposits()","72601e77":"setOracleFee(uint256,uint256)","72601faa":"ROUND_DATA_COUNT()","726199b5":"notarizeHash(uint256,string,string,string,bytes32)","7261e469":"burn(address,uint128)","7261ffad":"spendGameLockedToken(address,uint256)","7262561c":"unsubscribe(address)","7262eb66":"PRE_ICO_POOL()","726300c7":"releaseEscrow(uint256,uint256)","72630a6d":"UpdateIndividualContributorCap(address,uint256)","7264727d":"STCToken()","7265d040":"startAtBlock()","72664744":"setDelegadoDeDistritoVerify(bytes32,uint256)","726678e7":"level2Bonus(uint256)","7266f4a4":"X3()","72670119":"payBonus1Address(address)","72675562":"extraTokensWallet()","7267a25b":"mainSaleMinimumWei()","7267f24a":"lrcReceived()","726802a4":"addAddressToAccount(address,bytes,bytes,bytes32)","7268475b":"ITSMToken()","7269a327":"isNonFungibleBaseType(uint256)","7269daa5":"requestChangeStaker(address)","726a3ad1":"removeReservedTokens(address)","726a431a":"TARGET_USER()","726ab4ef":"getParentHash(bytes)","726aeb20":"costToCreateGame()","726b23bf":"changeMinNac(uint256)","726b5bad":"endAirdrop()","726bd6bf":"oraclizePrice()","726c12c8":"FileDataInt()","726c6382":"Error()","726d0a28":"getRequest(address,uint256)","726d50ee":"totalCampaignsBy(address)","726d82a0":"SEN()","726df9cc":"grantService(address,address)","726ea051":"calculateCoinBuySimple(uint256)","726ee493":"withdrawStakeTokens(uint256)","726ef3da":"getCurrentWinnerMoveCount()","726f63f6":"setTokenOffering(address,uint256)","727089f1":"extractAllowanceLength()","72712bb8":"trophyAddress()","72729ff2":"amountRaisedInWei()","7272ad49":"decreaseApproval(address,uint256,bytes)","7274f35b":"getCoinIndex(bytes32,address)","72750dc1":"PANICPERIOD()","7275c8cb":"getRecord(bytes32,string)","72761e96":"execute_transfer(uint256,uint256)","727648a3":"submitWork(address,address,uint256,string)","7276509c":"purchaseBuilding()","72771d40":"sendList(address)","7277236b":"icoInvestment(address,uint256)","7278d080":"BTCEarth()","7278d623":"CurrentEntityState()","727a00a5":"LetsFunds()","727a666a":"totalLevelValue()","727a899a":"setHashes(uint8,string,string,string,string)","727b1cd6":"next_draw(bytes32,uint256,uint256,uint256,uint256,uint256)","727b4094":"transferStep()","727b4276":"setBitGuildToken(address)","727c2ff0":"purchaseWithGze(uint256)","727cdf87":"setCut(uint256)","727d508a":"isOpenForPublic()","727da487":"TTGOracle()","727e2422":"StudioToken()","727f0067":"nextHash()","727fc9fc":"SCAM()","72801b53":"isInTimeRange(uint256,uint256)","728064cd":"GetTotal()","7280850e":"getHandRank(uint32)","7281854d":"GetCategoryValue(uint8)","7282c5b1":"WithdrawFeeBalance(uint256,address,uint256)","72840e32":"rentPeriod()","72841e0c":"isMaxCapReached()","728435a0":"ReverseProposed(string,address)","7284e416":"description()","72850e7a":"priceNeedsUpdate()","728516c2":"getProjectedPayout(bool,uint256,uint256)","72852fe5":"attackTile(address,uint16,uint256,bool)","72855080":"demurringFeeDenum()","72879610":"sencHardCap()","728880c2":"payOutVoterByAddress(address)","7288b0a9":"numberOfPingsAttempted()","7288b50c":"engraveNamespace(string,string,bytes32)","72892f4f":"newPlay(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256)","7289f28e":"setLastRound(uint256)","7289f9aa":"setDiscountedInvestor(address,bool)","728a6755":"buyBookLotto()","728addbc":"token_balanceOf(address)","728af7ec":"getInterest(uint256,uint256)","728b763c":"extendTde(uint256)","728cbc44":"userHeldTill(address)","728cd741":"SnapshotAndDistributePot()","728cf508":"bookingMetadataForKey()","728d0e2b":"accrueDividendandCoupons(uint256,uint256)","728d3dd2":"newRaceDistCon(address)","728d5e94":"baseTokensPerEther()","728de91c":"preSale(address,address,uint256)","728ec9f1":"YourCustomToken()","728f31e7":"setTransferEnablingDate(uint256)","728f3a21":"isApprovedWallet(address)","72909e28":"calculateIdeaSell(uint256)","7290c21d":"auctionCancelled(uint256,address)","7290f691":"horseShoePr(uint256)","72910be0":"setTitle(string)","7291acdf":"SaleWindowUpdated(uint256,uint256)","72923378":"RockPaperScissors(address,address,uint256)","72927b1e":"deleteEntryByName(bytes32)","72929b56":"getKudosPerProject(address)","7294789b":"getWhaleCard()","7296359a":"fog()","729680c3":"epsAddress()","7296dae6":"jsonCat(string,string,address)","7297be7f":"changeFixedCommissionFee(uint256)","72987457":"blocktrade()","7298b261":"_calcEditorKey(bytes)","7299054c":"random(uint256,uint256,uint256)","72998d8e":"LotteryGameLogic(address,address)","72998ee1":"addPreSalePurchaseTokens(address,uint256)","729ad39e":"airdrop(address[])","729aeea6":"isSetupRunning()","729b3881":"setNewRound(uint256)","729c04fd":"_yearTwoClaimed()","729cc83e":"getPlayerKeyCount()","729e3ef8":"YOPT(uint256,string,uint8,string)","729e6f2b":"getGameChance()","729ee75b":"updateUSDXGE(uint256)","729ef530":"additionalBonus()","729f0e8e":"cmct()","729f2439":"addK(uint256)","72a02f1d":"finalizeInit()","72a06b4d":"returnInt8(int8)","72a0c16e":"tulipToApproved(uint256)","72a1a8ae":"CanSignIn()","72a1b73f":"createSale(uint256,uint256,uint256,uint256,address)","72a1e258":"updateUser(address,string,uint256,uint256,uint256)","72a20c78":"powers()","72a22014":"firstAuctionsHighestBid()","72a22d51":"unlockValueOf(address)","72a2d90c":"quickWithdraw()","72a4a02f":"runPreMint()","72a4d94b":"release(bool)","72a503be":"transfer(address,address[],uint256[])","72a52851":"checkProof(bytes32[],bytes32,bytes32)","72a56d2c":"ICO_RATE1()","72a66507":"_isNewUser()","72a6a480":"_validRating(uint8)","72a7019c":"saleHardCapEther()","72a74d5b":"confirmOffer(uint256)","72a7655e":"timestampMint()","72a7b8ba":"multiDecreaseApproval(address[],uint256[])","72a7c229":"right41(uint256)","72a7d8c9":"lengthEqual(bytes32[],uint256,string)","72a7ff87":"isKYCRequiredToSendTokens()","72a85604":"min_amount()","72a86693":"ambassadorsNumber()","72a88673":"nthRoot(int256,int8)","72a984b2":"blockMinedAt()","72a9e232":"reserveFunds()","72aa18d7":"WALLET_ECOSYSTEM()","72aa343a":"removeProof(address,bytes32)","72aa9349":"maxTickets(uint256)","72aab7d7":"setGPSEndTime(uint16,uint8,uint8,uint8,uint8,uint8)","72abee88":"PreIco(uint256,uint256,address,uint256)","72acad56":"check_reward()","72ad21c7":"protection(uint32)","72ad3c9f":"OTCChain()","72ad5bbe":"_isErcToNativeBridge(address)","72adc407":"getGuardianVend(uint256)","72adcadd":"TOTAL_CONTRIBUTOR_COUNT()","72ae74dd":"getCoinRemains()","72ae9e54":"blocksCoordinates(uint256,uint256)","72af7b43":"SkyeCryptoPrivate(uint256,string,string)","72af805e":"sendPreIcoTokens(address,uint256)","72b0d90c":"withdrawTo(address)","72b28d27":"getNext(address,uint256,uint256,uint256)","72b2ee75":"investorsNum()","72b30d39":"setLLV_edit_30(string)","72b38ab9":"refundUser(address)","72b3936d":"EWBToken()","72b3f570":"endBuy()","72b44b2c":"getSaleReturn(address,uint256)","72b4e98f":"Aecium()","72b4f111":"COOPToken()","72b50845":"eliminateSDCC(address,address,uint256)","72b556c7":"emissionReleaseTime()","72b59c68":"createNote(uint16,bytes2,bytes12,bytes)","72b5e050":"LOCKED_ALLOCATION_PPM()","72b60682":"lockEndDate()","72b614af":"itemsPerPage()","72b7094a":"tokensPerEthPresale()","72b75585":"getOriginalClient()","72b7f893":"metaIncreaseApproval(address,uint256,bytes,uint256,uint256)","72b81b1c":"resolveLotteryByHand(uint32,uint32)","72b8a5cf":"bonusPersent()","72b8de14":"isChallengePeriodOver()","72b902a7":"setvolumebounus(uint256,uint256,uint256)","72b91e61":"seen(address)","72ba8259":"testMinting()","72baa12e":"withdrawQR(address)","72baa779":"setItoEndTime(uint256)","72bc56fe":"IsMultiFreeze(address,address[],bool)","72bc8fc6":"ether2tokens(uint256)","72bc8ff2":"isOMITokenLockContract()","72bc9240":"etherPerSale()","72be346c":"ZTR_ETH_initial_price()","72becdee":"_generic(bytes,address)","72bedcee":"operationState()","72bf079e":"adjustPrice(uint256)","72bff5ad":"freezeMintingFor(uint256)","72c03508":"contributorClaim()","72c0e7a4":"setThreshold(bytes32,uint256,uint256,address)","72c1591c":"testFail_basic_sanity()","72c174db":"mintTokensForAdvisors()","72c1df4c":"transferDirectorB(address)","72c27b62":"setFeeBps(uint256)","72c3015c":"mint(int256,address,string)","72c4639e":"SummRew()","72c4ae6b":"walletForCommunity()","72c537e6":"FirstCryptoBank(uint256,string,string)","72c5c349":"NinjaCore()","72c5cb63":"getAmountTransferred()","72c60b1d":"tokenAddressToAssetData(address)","72c691b2":"setWarTokenAddr(address)","72c70758":"setBountyFundWallet(address,address,uint256)","72c7c85a":"minority()","72c7e48d":"addAddressesToWhitelist(address[],string)","72c87075":"testBlockHeaderFetch()","72c91cdd":"maxTokenForPreSale()","72c9a5e3":"approveFST(address,uint256)","72c9e9e0":"placeBid(uint64)","72ca7fce":"TrueVeganCoin()","72cb8a89":"TokenWithdraw(address,uint256,address)","72cc1f5a":"knightAddress()","72ccd03a":"delWord(string)","72cd5576":"getImpactLinked(string)","72cd700b":"totalSupplyExpansionTokens()","72cd7b89":"foundationTarget()","72cde347":"setMiniPoolEdit_5(string)","72cee8ea":"getReferralProfit(address,address)","72cef34b":"getRevisionIpfsHash(bytes32,uint256)","72cf3b40":"recharge(bytes32,uint256,address)","72cfea69":"presaleClosingTime()","72d00e9f":"activeContracts(uint256)","72d0774a":"presaleFinishTime()","72d0979a":"AddBonusToListFromArray(bytes32[],uint256[],uint256[])","72d16358":"Oratium()","72d209f5":"processRequest(bytes32[],bytes5,address)","72d29f64":"setValidatorName(address,string)","72d2f8b8":"createHodler(address,bytes16,uint64)","72d32586":"STOREDIG()","72d32968":"withdrawBonus(uint256)","72d376b6":"proofTokensAllocated()","72d3880e":"mainICO()","72d39ee4":"Credo(address,address,uint256,uint256)","72d475db":"getTotalHeartsByDappId(uint256)","72d4b93c":"VitManToken()","72d5637f":"AxieCore()","72d5fe21":"changeProposer(address)","72d744e0":"feeFromTotalCost(uint256,uint256)","72d8c1c7":"ForestCoin()","72d8e442":"hasBeenRevealed(address,uint256)","72d9733e":"add_AUTO_MANU()","72d99675":"getCollectible(uint256)","72d9b86f":"unpauseCrowdsale()","72d9f13d":"setMaxEarningsClaimsRounds(uint256)","72dad9f9":"SuperCoinViewToken()","72db2339":"ERC677Transfer(address,address,uint256,bytes)","72dd236a":"setTokenOffering()","72dd529b":"totalsupply()","72dd52e3":"coinContract()","72dee32b":"getEndGameStatus()","72df02a7":"setMintThresholds(uint256,uint256,uint256)","72dff527":"drawTertiaryBWinners(uint256)","72e05569":"_sendRefund()","72e09d48":"mokenId(string)","72e0e984":"prime(uint256)","72e18c12":"placeSellOrder(uint256,uint256,uint256,uint256)","72e208eb":"targetAddr()","72e2cac8":"BONUS_WINDOW_4_END_TIME()","72e2f8f5":"checkFreeze(address)","72e38003":"treefs()","72e3c5c2":"toggleEmployeeSuspension(address,uint32)","72e3f040":"richestRoundId()","72e4030d":"_freezeTransfer(address,uint256)","72e496f3":"setRestrictedState(bool)","72e4f262":"annotationLength()","72e4f5cc":"CreateOffer_internal(uint8,bool)","72e5186c":"depositTo(uint256,address,uint256)","72e5c84f":"_getTokenBonus(uint256)","72e67d06":"setPendingManager(address)","72e6aca3":"isWithinICOTimeLimit()","72e6e21a":"exchangeableTokens()","72e861ee":"private_setRandomAPIKey(string)","72e87c35":"giveProduce(uint256,string)","72e8e6a4":"PublicMined(address,uint256)","72e91fee":"initialPartnerAccount(uint8)","72e98a79":"transferBZxOwnership(address)","72ea1eb0":"addressBytesFrom(address,uint256)","72ea2e6d":"finishInitialExchangingPeriod(uint256)","72ea4b3d":"TestToken(uint256,string,uint8,string)","72ea4b8c":"getNumInvestors()","72ea61e8":"dist_developer(address,uint256)","72ea7243":"generateLand()","72ea8bfe":"executeBet(address,address,bool,uint256)","72eab193":"COMPLIANCE()","72ead941":"getDelegate(address,uint8)","72eae629":"multiMintBounty(address[],uint256[])","72ebe2aa":"verifyYourBalance(address)","72ec1993":"enablerefund(address,address)","72ece81c":"_create_island(bytes32,address,uint256,uint256,uint256,uint256)","72ed2c7f":"setQualifiedInvestor(address,bool)","72eda05f":"tokensAllocatedToCrowdFund()","72ee91c2":"configSignOrganizers()","72eec3a7":"refundToken(bytes32,string,address,address)","72eefb8a":"getRareItemsOwner(uint256)","72ef149e":"whiteListRegistrationEndTime()","72ef5458":"transferTokenOPSPlatformTokens()","72ef6a08":"rgbLimit(uint256)","72ef90e4":"Shop(address,string,string,uint256,uint32)","72efa4ef":"Showcoin()","72f0424f":"getPriceToken()","72f12814":"_setIDLE(uint256)","72f1301a":"USCCToken()","72f159b7":"migratePlayerData2(uint256,address,uint256,uint256,uint256,uint256)","72f3b3c4":"ownerAbandonOverride(uint256)","72f41f11":"approvedRatio(uint256)","72f443be":"ChangeLicense(address,bool)","72f4ecab":"Balances()","72f4f5f9":"TOKEN_REFERRAL()","72f52a3e":"getAttoTokensAmountPerWeiInternal(uint256)","72f57f1f":"withdrawUnsoldTokens(address)","72f5ae5f":"setCertificationManager()","72f5bb30":"UKToken()","72f5fccd":"releaseToMgmtTeam(address,uint256)","72f65dea":"BitstartiToken(uint256,string,string)","72f69a72":"getBurnRequestsLength()","72f6c3b5":"coinPercentage()","72f702f3":"stakingToken()","72f71894":"backTTCOwner()","72f74af8":"crowdfundAddress()","72f79b56":"btcEthRate()","72f83d3a":"poolSub(uint256)","72faebdb":"addCustomerFromACC(address)","72faf84a":"tokenSTCDRforBurnInControlWallett()","72fb54e5":"PHASE_2_PRICE()","72fb6f75":"MIN_INVEST_SUPPORT()","72fb9703":"challenge(address)","72fc493d":"decFeeDeposit(uint256)","72fc75d7":"_changeTrancheIfNeeded()","72fd1a7c":"changeRateSale(uint256)","72fd8772":"toekensForOthers()","72fdbf25":"increaseDividendPayments(address,uint256)","72fecf84":"upgradeUnitId(uint256)","72ff1773":"bonus_percentage()","72ff285e":"_calculatePayout(bytes32,uint256)","72ff3d87":"signedBySystem(bytes32,bytes)","73032446":"censorAndCover(address,uint256,string)","730369a7":"tokensBounty()","7303a559":"getCreatorMetadata(string)","7303ed18":"trustedUniverseBuy(address,uint256)","73047e93":"timeslucky()","73053410":"newVersion(uint16[3],address,bytes)","73053f70":"tokenDeposit(address)","7305c695":"_orderTokens(address,uint256,uint256,address)","7305dce1":"createPromoCollectiblesWithMining(uint256[],address[],uint256[],uint256[],uint256[],uint256[])","73069f94":"_claimTokens(address)","730720b8":"testControllerValidTransfers()","730736c9":"DelSocialAccount(bytes32,bytes32,bytes32)","730740f8":"_resumeWork(uint256)","7307b805":"dismissTokenOperator(address)","73086e58":"isFreezeTimeout()","730a04fd":"ArnoldCoin()","730a0d80":"unhold(address)","730a1a16":"_medalUnFreeze(uint256)","730a3127":"RECORDICO(address,address,uint256,uint256,uint256,uint256)","730a9f1c":"UncleToken()","730ad454":"vote(bytes32,address,bool)","730b1952":"test_insert_updateHead()","730bdc96":"getHeroDetails(uint256)","730c1faa":"LogUnpause()","730c635a":"_checkToiletFlush(bool,uint256)","730d2221":"CWS(uint256,string,string)","730db1f8":"setNum(uint256,int256)","730e90b7":"addTipBalance(uint256,address,uint256)","730ef269":"getNumberOfItems()","730f2a96":"_transfer(address,address)","73107c99":"ICDStartTime()","7310c2e0":"Daisee()","73124ced":"transferLock()","73124ee9":"ContractDetector()","7312aaae":"singleWithdrawMax()","7312c065":"Receiver()","73137bd0":"buildInternalSalt(uint128,address,address,uint256,uint64)","73138e4f":"PRESALE_SUPPLY()","73139c0d":"getTokensForStage(uint256,uint256)","7313b3b1":"Drawing()","7313ee5a":"vestingPeriod()","7314221e":"_createDeveloper(string,uint256,uint256)","7315acc8":"getAllShareholdersOfArtwork(uint256)","7315af6f":"LandmarkCoin()","7315f446":"votedKickoff()","7316453e":"setPrice1(uint256)","7317a88d":"transferSingle(address,address,uint256)","7317c4f3":"replaceAnimal(uint8,uint16,bool)","731859bc":"batchLockArray(address[],uint256[])","7318b453":"setVotetUntil(uint8)","7319b43e":"playersList(uint256)","7319e5aa":"calculateBonus(address)","731a00f5":"calculateVestedTokens(uint256)","731a3b06":"unstakeFrom(address,uint256)","731ac7ed":"choosePerk(uint8)","731b185e":"LogSetPreICO(address,string)","731b3284":"Lockable()","731bed8b":"WithdrawalStarted(address,uint256)","731c2f81":"feeRebate()","731c7c62":"setServiceRegistryEntry(uint256,address)","731e1c94":"setLastPrice(uint256,uint256)","731e1ecd":"preMarketingSharesDistributed()","731f03fc":"setMinimumBuy(uint256)","731f49b7":"lastIdGen0()","731f93c5":"updateCertification(uint256,string,string,string,uint16)","731fb32e":"PRE_SALE_GMR_TOKEN_CAP()","73201667":"tokenUnlock(address,uint256,address,uint256)","73206348":"raiseDollarsWithdrew(address,uint160,int160)","7320753b":"approveConnection(address,address,uint256)","7321a17b":"getTotalBonusTokensByAddress(address)","7321ffa6":"distributeFunds(address,uint256,address,address,address)","73221a55":"unblock(address,bytes32)","732264b4":"getCommitmentsOf(address)","73228786":"setTokenAddresses(address[6])","7322dccd":"lastBlock_a16()","7323febe":"aa(uint256)","73251628":"doAirdrop(address)","732519d5":"getSellable(uint32)","73252322":"RandomProofFailed(bytes32,uint256,uint256)","73256a8d":"SharesChainTokenCrowdFunding(address,address,uint256,address,address,address)","7325b084":"GdprCash()","732606fc":"getCooldownIndexCount()","732617bb":"switchAdmin(address)","7326b901":"getPropertyCount()","7326cac8":"ethIn_()","732726d1":"increaseLockedAmount(address,uint256)","732783ac":"tokensBought()","7328c6ec":"submitNewContract(string,address[],string,bytes32)","7328f531":"evaluateSkill(address,uint8,uint256,uint256,uint256)","7329036a":"getBlocksLeftInCurrentKick()","732a37c9":"SnowdenAffact()","732b6963":"emitEnd()","732bdbbf":"clearApprovalAndTransfer(address[16],address,address,uint256)","732c227f":"contributionCaps(uint256)","732d2da4":"testHasCinderToken()","732d565b":"ONE_YEAR_KEEPING()","732e632e":"assemblyTest()","732e77d0":"EGGS_TO_HATCH_1SHRIMP()","732ef12c":"fee_registration()","732f5d0c":"AdvancePayplus()","732fe2ff":"buyerCapLowEther()","73305f14":"Quicketh()","7330aba2":"getOracleAddresses()","7330aca4":"_isTransferAllowed(address,address)","7330daac":"isOnList(address)","73311631":"addBrand(address,string)","733122aa":"fromMemory(uint8[])","73321f03":"GateToken()","733261bf":"bountyAdress()","7332b520":"getRewardsCount(uint256)","73333128":"out3Done()","73335b46":"GlobfoneToken()","73339a13":"setNetworkState(uint256)","7333fd00":"lock4Dividend(uint256)","73342168":"BFToken(string,string,uint8,uint256)","733452bc":"Descript()","733480b7":"transferToICAP(bytes32,uint256)","7334a63f":"whatWouldPurchaseDo(uint256,uint256)","7334b2d7":"isBurnWallet(address)","7334d5e2":"editSpecial(uint256,uint256,uint16)","73357018":"RATE2()","73373879":"RecoveryQuorum(address,address[])","733746ba":"Snickers()","73379c54":"SecretNoteUpdated(address,bytes32,bool)","7337c993":"initiate(uint256,bytes20,address,address,bool,uint256)","73383832":"barrierPrice()","73384fd5":"addMultipleAddressesToUncappedAddresses(address[])","7338c25c":"hasAttribute(address,bytes32)","7338ddcc":"acm()","7338faba":"setHardCapEther(uint256)","73396ff4":"getLoanToDepositRatio()","7339affc":"UbiqTalk()","733ad6e3":"BHMBLU()","733b679e":"PRESALE_LEVEL_2()","733bdef0":"getStakerInfo(address)","733bf2f2":"setPercentageCut(uint256)","733ccaba":"setResolver(string,address)","733d8053":"containsToken(address)","733dca75":"registerCoin(bytes4,string,string,address)","733e193c":"saleHasEnded()","733ef936":"drainFunds()","733efe16":"numSkinOfAccounts(address)","7342048a":"transferOwnershipOfContract(address)","7342c484":"airdropDistributedTokensAmount()","73440745":"listItem(uint256,uint256,address,bytes32,address)","73454fe4":"StuckOnStupidToken()","7345a3a2":"payExcess()","7345da39":"logPayerStatement(string)","73463965":"notifyPlaceSellOrder(uint256,uint256)","73463c9c":"ReceivedETH(address,uint8,uint256)","7346ec57":"tokensToWei(uint256)","73475373":"trySell(uint256,uint256)","73479f39":"totalT8EXSold_CORNERSTONE()","7347a25d":"BitcoinTrade()","7348ac1f":"ecoSupplyAddress()","73493f09":"getTokensCost(uint256)","734a2c72":"ProjectTestToken()","734a56f0":"preSaleEtherPaid()","734b4861":"addOpenAction(string,address,string)","734b9a87":"mod(uint64,uint64)","734bb97e":"checkcoursestudent(address)","734ce665":"newProposal(address,uint256,bytes32,bytes32)","734d8287":"unclaimedFees()","734e3015":"newMegabox(address,uint256,uint256)","734f2838":"FinishCompetition(uint32)","734f8a4d":"kycValid()","735056a3":"SpoolAmount()","73520a2b":"getReservedTokenDestinationList()","7352e4b8":"setAffiliate(address,address)","735307fb":"createTimeLockContract()","73535aa7":"PixelUpdate(uint32,uint8)","7353a21d":"queuedAmount()","7353f62b":"testGetApprovalDb()","73545d44":"landmarkOwnershipCount(address)","73549604":"getFinalTime(bytes32)","7354eb04":"rocCoreAddress()","7355303e":"_priceOf(uint256,uint256)","735631ad":"revokeTransaction(uint256)","7356a8a9":"getTile(bytes)","73580358":"ColorBayTestToken(uint256,string,string)","73582884":"releaseGrant(address,address,bool)","735958f2":"XPAAssetToken(string,string,uint256)","73596cfc":"Bitcoincredit()","73599205":"ProdDToken()","7359f5cf":"FundAddress()","735a3326":"getLeftTickets()","735a80b1":"test_voteSpammingAgainst()","735af2eb":"Rate10()","735b232c":"addWhitelistedTransfer(address)","735b266d":"icoStage1Deadline()","735b38a3":"getCardCanPresaleCount()","735b81ab":"circulationAt(uint256)","735bae84":"migrateRoundData(uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","735bb742":"sha256Docs(bytes32)","735cfff2":"valueTotalSupply()","735d3e81":"updatedBalance(address)","735d45e1":"RADIUM()","735d8876":"getCurrentExpirationTime()","735dcc8b":"devfeetodev()","735e9cbb":"disableModule(bool)","735f11b4":"updateAndWithdraw(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256,uint256[3])","735fb8e0":"fundOwner()","7360ab6e":"mint(address,uint256,string,uint256,uint256,uint256,uint256,uint256,uint256)","73611c48":"send3MilWeiToPong()","73618371":"Molecule(uint256,string,string)","7362377b":"withdrawEther()","73627826":"getTime(uint256)","7362d9c8":"addWhitelistAdmin(address)","7363d85b":"TMEXAddress()","73646c91":"updateMirroir(address,address)","73654b6d":"userTransferFrom(address,address,uint256)","7365870b":"bet(uint256)","7365babe":"MIN_TOKEN_INVEST()","7365e1fd":"setPriceCutoff(uint256)","7365e2d7":"totalPresaleTokensSold()","736660ac":"determiningWinner()","7366794e":"distributeTokens(uint256)","73668b06":"XCCCrowdsale(address)","7366c68d":"calculateCommission(uint32)","7366e3ff":"raisedInPresale()","73671268":"vestToAddress(address,uint128)","73674ecc":"admin_deposit(uint256)","7367df4b":"Syndicate(uint256)","7367e302":"ContractCreationTransaction(bytes,uint256,uint256,address,uint256,uint8,uint256,uint256)","7367f156":"gameSettings(uint256,uint256)","73681818":"EICQ()","73688914":"owner1()","7368a8ce":"create(bytes32)","7368b3cb":"DinsteinCoin(uint256,uint256,uint256,string,string)","736a0102":"bonusETH()","736a1b9a":"AdjustClientAccountBalance(bytes32,bytes32,bytes32,string,uint256,string,uint256)","736b13ae":"setRefillFor(string,uint256,uint256)","736c24b5":"AdsharesToken(address,address,address,uint256)","736c3e82":"onPayment(address,uint256,bytes)","736c983a":"setCurrentRevision(address)","736d323a":"setPausable(bool)","736d7c52":"isAlreadyDelegate()","736d7ee9":"revokeAccess(address,int256,address)","736ead2c":"optionsCalculator()","736ec05c":"setMigrateTo(address)","736eec58":"TransferAnimalToAnotherUser(uint256,address)","736fafd3":"setPreIco()","736fe565":"withdrawAmount(address,uint256)","73705090":"teamOnePrefix()","7370a38d":"getNumPackages()","7372014e":"midnight()","73720de9":"receiveMonthlyNRT()","7372196c":"PHASE_4_PRICE()","7372c2b5":"pull(address,address,uint256)","73732024":"isDeposited(address)","737377fe":"getTokenVolumebasedBonusRateForPhase2(uint256)","7373af84":"numberOfNarcosByDistrict(uint8)","7373f41d":"getEthereumBalance()","73741171":"createVCXVault(uint256,address)","73743fbe":"prospectors_team()","7374b013":"buyTDETokensWithoutETH(address,uint256,uint256)","737517f5":"powerUp(address,uint256)","73752db4":"getKYCPayload(bytes)","7375c0c3":"PonderGoldToken()","7375e0fe":"testSimpleObject()","7375ed82":"LogLoss(address,uint256,uint256)","7376678b":"finalizePreSale()","7376fc8d":"right67(uint256)","73770c01":"Updater()","737732b2":"DEVELOPERS_BONUS()","7377a036":"CloudexchangeToken(address)","737a7698":"transferAssigner(address)","737aa5a0":"remainingTokensWallet()","737c2d8c":"checkAvailableTokens(address,address)","737c8ea1":"_getRevisionBlockNumber(bytes32,uint256)","737d5f39":"AccessAdmin()","737d8c8e":"ChangeTokenWalletAddress(address,address)","737e2835":"_minHouseEdgeClassic()","737e7d4f":"getByVersionId(uint256)","737f18ff":"_weiToVouchers(uint256)","7380fbf3":"removeMemberArrayToken(address,address,uint256)","73815ab7":"nfc_simplehq()","738198b4":"cast(uint256)","738228cd":"testUmlaut()","73826a93":"updateTokenDetails(string)","7382901e":"serverSeedHash()","73835f35":"checkIfEligable(address)","7383d709":"buyItem(uint256,address)","7383d8ee":"getEachBindAddressAccount()","73845cfa":"setLocked(address,uint256)","738486bd":"BeerCoin(uint256)","7385e1f3":"level_5_amount()","7386c2be":"Exilium()","7386f0a7":"reservedTokensDestinations(uint256)","7387479e":"reclaim_art_token()","73889677":"ownerLives()","73889f4a":"getHoldersCount()","7388fb2b":"AltTokenDistribution(address)","73898796":"Tier_Classic_Registration()","738a2679":"left85(uint256)","738a2cf8":"nextPaymentTime()","738b2fac":"setSignedPublicEncKey(string)","738b31b5":"minimumWithdrawal()","738c2931":"rewardTwo()","738d8d82":"numberWikiPages()","738ddabe":"getContentIndexedAccountCred(uint256,address,address)","738e6d78":"checkRefund(address)","738fa7a4":"userRank()","738fdd1a":"reg()","7390a673":"MyEtherTellerEntityDB()","7390c786":"getRandomResult()","739112da":"safeSubtrCPCE(uint256,uint256)","73913545":"fundVesting(uint256)","73916918":"getinfowinning(address,uint256)","73918980":"multiTransferEth(address[],uint256[])","73925694":"take(uint256,address[])","739294d2":"setAssignedID(address,address,uint256,string)","7392ce80":"TokenDeployed()","73930ce2":"validAmount()","73931bbf":"getGame(bytes32)","73932bfd":"withDrawal()","7393d262":"goldenTicketUsed(address,string)","7393e0b2":"DayTrader()","7394cb3f":"addLocationRecord(uint256,uint256,string,string)","73962b26":"isReleased(uint256)","73963bf0":"setIdArray(address,address,string,string,uint256[])","73964787":"batchAddCancelledOrFilled(bytes32[])","7397d5f1":"getMintForReportingParticipantAmountValue(int256)","73980d69":"dollarRaised()","739826c5":"changeAllowTransfer()","739838be":"DigitalEnthusiasts()","73984188":"delOwner(address)","739890f0":"disqualifyTeam(address)","7398ab18":"getPosition()","7399646a":"theRun()","73998758":"smpToken()","739ab361":"needApprovesToConfirm()","739b47ca":"recordWin(address)","739b5014":"Snatch(uint256,address,address)","739b6214":"doProveMemoryWrite(uint256,bytes32,bytes32[])","739b78ed":"LogSell(address,uint256,uint256)","739b8c48":"setForwardedOutcome()","739bdcff":"pricePause()","739beded":"mintSendTokens(int256)","739cb57d":"setEndtDate(uint256)","739d3307":"SetWho(address)","739d980e":"address(address,uint256)","739e40b7":"getMyPunchCards()","739e7f48":"TeamChoice(address,uint256)","739f2224":"SetActive(bool)","739f763e":"getListing(bytes5)","739f888c":"setNewEstimate(int256,int256)","739f9202":"dev_share()","73a070bc":"addressReserveFund()","73a077a4":"sub16(int16,int16)","73a17e6d":"setCompte_31(string)","73a19dd2":"Deposited(address,uint256,uint256)","73a1e7f5":"allReceivedEth()","73a1f366":"founderTokenCount()","73a22e62":"fetchPaidOrdersForMerchantByAdmin(address)","73a26a12":"CryptoDiamondCoin()","73a29b5e":"get_presale_arbits_sold()","73a2d1ff":"MexicovsSweden()","73a3d9e4":"canUpdatePercentToTakeAsSeed()","73a40efb":"_computeRarity(uint256,uint256,uint256,uint256,uint256,uint256)","73a4c307":"COMMUNITY_SUPPLY()","73a55389":"setRarePrice(uint256,uint256)","73a5717e":"BaironSupply()","73a5f508":"getAuditorRegistry()","73a699ad":"isGenesMarket()","73a72b18":"setFountainFoundationOwner(address)","73a75c1f":"addVineyard(string,uint16,uint24,uint32,uint16)","73a7b8b2":"storeStages(uint256[])","73a7dfda":"we()","73a80336":"prizeWon()","73a80b74":"_mintSqr(uint256,address,uint256,uint256)","73a91544":"showMigrationStabitcoinAddress(address)","73a95ddd":"redemptionPaused()","73a97787":"sgcToken()","73a97f42":"MetaRules(address,address[])","73aad472":"guaranteedBuyersBought(address)","73ab7503":"FlightPlan(address)","73abecbb":"kill1()","73ac4739":"getOnSellCardIds()","73acbcb2":"switchBleachAllowed(bool)","73ad2a15":"AllowedRecipientChanged(address,bool)","73ad468a":"maxBalance()","73ad6c2d":"setMarketplace(address)","73ae277b":"getDepositAddressVerify()","73aef263":"FDSToken()","73aef2b6":"unFrozenControl(address,uint256)","73af652c":"setCollectibleExposure(address)","73b1184e":"setupVote(uint256)","73b14098":"getTotalDevelopmentFundEarned()","73b1edce":"_lock(address)","73b24ca0":"indInflation()","73b2c384":"_computeBorder(uint256)","73b2e80e":"hasClaimed(address)","73b34271":"ETH420on49()","73b38101":"wipe(bytes32,uint256)","73b3dcde":"maxDestroyThreshold()","73b40a5c":"forwardTo(address,address,uint256,bytes)","73b4484f":"registerA(string,string,string,address)","73b47908":"_updateCounters(uint256,bytes32)","73b4df05":"createToken(string,address,uint256)","73b51d38":"startWork(string)","73b51f0b":"_tokenDelivery(address,address,uint256,uint256)","73b55eaf":"registerData(address,int256,bytes32,address)","73b5abaa":"PresaleDiscountPercentageChanged(address,uint8)","73b6656f":"relay(address)","73b68be8":"preicoAddresses()","73b6a48a":"GetDataRequest(uint256,bool,string,uint256)","73b793a8":"PrizeFund()","73b8a8c1":"MeetOneCommunityBonus()","73b913fa":"safeTransferManyFrom(address,address,uint256[])","73b972bc":"bonusTokensIssued()","73b9aa91":"account(address)","73baae7a":"KingKongCoin()","73bbda81":"standardTokenDefrosting(address[])","73bc1b2f":"customerPool()","73bc8b2f":"kvcSub(uint256,uint256)","73bc8b77":"SPIDER_BOOST()","73bda17e":"restrictedTokens()","73be0a99":"getData_7()","73be6ddd":"allowEscrow()","73bfb566":"withdrawFromProject(address,uint256)","73c107b3":"checkWins(uint256,uint256,uint256)","73c1af76":"deleteFreezeList(address)","73c24cb1":"Buy(uint256,address,uint256,uint256,uint256,bytes16,bytes32)","73c261f4":"getRegionUpdatedAtPurchasedAt(uint256)","73c28692":"disallowFunding()","73c2ec65":"sendbal(address,uint256)","73c32a71":"get_property_basic_info(uint256)","73c4726b":"minHouseStake(uint256)","73c4942a":"depositStopTime()","73c6a4ec":"acknowledgeCopieExecutoire(bytes32)","73c6aa7d":"ExchangeEfx()","73c74103":"recoverTokensTo(address,uint256)","73c8c4bf":"Leverages()","73c8d8a2":"setMaxPaymentInEther(uint256)","73c8de54":"issueByTranche(bytes32,address,uint256,bytes)","73c90b43":"calcBidAllocationFee(bytes32)","73ca1b28":"WHYPHY()","73cb0620":"fluffyCatAddress()","73cb8ab7":"enableTokensTransfer()","73cbd8ce":"getPublicSupply()","73cc3ec7":"iceFundDeposit()","73cc9153":"MeshPointManager()","73cce6f1":"presaleAllocateTokens()","73cd0a19":"allowanceBurn(address,address)","73cd148e":"VariableConstructor(string)","73cdcac4":"getPostsFromPublisher(address,string,uint256,bool,uint256)","73ce3c72":"UpStats(uint256,uint256,uint256,uint256)","73ce9920":"parseOrder(bytes)","73cf013c":"isBlacklist(address,address)","73cf8f97":"registryRequestSku()","73d00224":"swapTokens()","73d01ead":"prepareForMigration()","73d08bc5":"prefill(address[],uint256[])","73d0d693":"Set(address,uint32[],uint24[])","73d0fe48":"totalLockedHavvens()","73d28995":"isMidGrade(uint256)","73d31240":"removeGame(uint256)","73d3172e":"MXY_chain()","73d384c8":"hasDeposits(address)","73d45ba4":"owner_ActivatePOS(bool)","73d4a13a":"data()","73d4c0ff":"m_aOwner()","73d4d500":"transferPayable(address,address,uint256)","73d4d9f9":"checkMAC(bytes32,bytes32[],bytes32)","73d55379":"Beneficiary()","73d65c00":"GEN0_NO()","73d69720":"checkWhitelistAddressValue(address,uint256)","73d6c2ec":"init_ico(address)","73d901d6":"activityClosed()","73d9170d":"GKBToken(uint256,string,string)","73da968d":"buySection(uint256,uint256,string)","73dae7d6":"issueTokensForPrivateInvestor(uint256)","73db0844":"ETHUSD()","73db2350":"commentsLength()","73dc7635":"openAttacksCount(address)","73dd9073":"secondStage()","73de3570":"calcaultePrizes(uint256,uint256)","73de3e72":"_refundTokens()","73de975c":"alreadyMintedOnce()","73def2b7":"subFreezingPrice()","73df6b19":"visitLength(uint8)","73e1743a":"buildDSBasicAuthority()","73e1851b":"migrateMyTokens()","73e1c5c9":"getMyFreeCoin(address)","73e2212e":"changepresalebonus(uint256)","73e2d75f":"changeClons(address,uint8,bool)","73e2faa8":"destructionContractAddress()","73e30e49":"majorEventFunc(uint256,bytes,bytes)","73e3ce80":"fact()","73e3de70":"CardSwap(address,uint256,uint256)","73e3e7a7":"getAdultByAddress(address)","73e40ed4":"REWARD_SUPPLY()","73e4d829":"createLandmark(uint256,uint256,address,uint256)","73e52855":"crownUnFreeze()","73e538fc":"availableTokensOnCurrentStage()","73e55a57":"DAOstackPreSale(address,uint256,uint256)","73e58a75":"balanceTeam()","73e61cf2":"changingEnabled()","73e67a38":"GameGoldToken()","73e6fc1b":"parseUint(string,uint256)","73e7c8ce":"setErrorRest(bytes,uint256)","73e81d88":"TrustMarketHubToken()","73e87d74":"OTM()","73e888fd":"contribute(address)","73e8b3d4":"exist(bytes32)","73e9f3e6":"Crowdsale(address,uint256,uint256,uint256,address,address)","73eab74b":"SoulTransfer(address,address)","73eaddf0":"OMGBalance()","73ec6bb5":"AMOUNT_PER_PHASE()","73ec7df0":"joinCommunity(address)","73ecac3b":"setGiftTokenAmount(uint256)","73ece9c4":"setEmployee(address,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint8)","73eda3cc":"finalizePublicSale()","73eec3c5":"payoutDividends(address,uint256)","73eef753":"coinSendSameValue(address[],uint256)","73ef6357":"selectplayer()","73efc627":"addAction(bytes32,bytes32,string,uint256,bool,uint256,uint256,uint256,uint256,bytes32)","73f00fb3":"emissionlocked()","73f01104":"reveiveToken(address,uint256)","73f029cd":"setOrUpdateRecord(string,string,string,string,address,uint8,bytes32,bytes32)","73f03d53":"crowdSaleFinalized()","73f1e6d7":"resolveLotteryByOraclize(uint32,uint32)","73f28451":"tokensRate()","73f310df":"multiAccessRemoveOwner(address)","73f3312d":"setMentorsTokensWallet(address)","73f3bd1f":"earlyInvestors()","73f42561":"burned()","73f440fe":"prevRoundTweetId()","73f58acd":"createTeamTokenTimeLock(address,uint256,uint256,address)","73f5cfb1":"isPhaseValid(uint256)","73f5edce":"UpPlayerResult(string,address,uint256,uint256,uint256)","73f5f8ee":"tokensAvailableAtCurrentTier()","73f64212":"supplyMultiplier()","73f69bc5":"TrustedDocument()","73f8edc3":"configureMarketItem(uint256,uint8,uint8,uint8,string)","73f8fd4b":"getUserTokenBalance(address,address)","73f93a48":"getAccountContentTip(address,uint256)","73f9421d":"getUpgradeCardsInfo(uint256,uint256)","73f9d5a0":"eostContract()","73f9ff23":"RaffleMakersBook(string,uint256)","73fa9ce8":"getAmTokenBalance(address)","73fac6f0":"confirmReceived()","73fb7878":"dividendFor10kDaily()","73fba0e8":"airdropReserve()","73fc83fa":"updateDireccion(address,bool)","73fc8420":"deployedOn()","73fc9643":"calculateFLC(address,uint256)","73fcfea1":"withdrawPLAT()","73fddd16":"refundEndTime()","73fe1673":"cpow2(uint256)","73fe747c":"TransferCreators(address,uint256)","73fee090":"setfee(uint256)","73fef35a":"setStartTimeIcoStage2(uint256)","73ff4d48":"getPlayerForCard(uint256)","73ff81cc":"getOwnersCount()","73ffd5b7":"transferEther(uint256)","73ffd969":"setMap(uint256,uint256,uint256)","73ffecd0":"getPlayerHistories(address,uint256)","7400ed3b":"acceptDeposit(address,address,uint256)","74019f87":"BATSafe(address)","7401aaa3":"getPlayerRoundBought(uint256,uint256)","7401f9c0":"flag(uint256,address)","740227d1":"receiveFunds(address,uint256)","7402a9aa":"isFirstStageFinalized()","74030531":"bet(string)","7403db08":"getVerifiedHash(address,uint8,address,uint256,uint256,uint256,uint256,uint256,bytes32,bytes32)","7403e980":"initPGOMonthlyPresaleVault(address[],uint256[])","74040424":"startPartnerSale(uint256)","74040cd2":"setBidFeePercents(uint256)","74041d1f":"liquidPledging()","74043a70":"FRPUSD()","740528a7":"GrantRevoked(address,uint256)","7405322e":"checkBalance(address,string)","74056b73":"crowdsaleMinUSD()","7405cee9":"CGCToken(uint256,string,string)","74063cc1":"tokenOfMakerByIndex(address,uint256)","74068480":"setPresaleFail()","7406d1a7":"updateRegistratorStatus(bool)","7406d943":"BIGTPrivate()","740707cf":"cancelSaleOfMintingAddress()","74087040":"testBitsNotEqualSuccess()","740907ea":"buySale(address)","74091685":"setReservesForExchangeTokensPercent(uint256)","7409e2eb":"swapTokenToToken(address,uint256,address,uint256)","740a2a90":"registerEmployer(string,string,bytes32,uint256,uint256,uint256[],string,string,string)","740ab8f4":"partitionsOf(address)","740b63f9":"set_hedgeAddress(address)","740b91b6":"horseOwnerIndex(uint256)","740d0a6f":"getAmbientHumidityException(bytes32)","740d73f3":"addToWhiteList(address[])","740e2a29":"setFundRepository(address)","740ed4e0":"addNewStakeDiceGame(uint256)","7411b2b2":"TrendNetworkToken()","741273d6":"testThrowRegisterContractAgain()","7412c223":"getCurrentTier()","74135154":"func1()","7413dcc3":"DelistTitle(uint256)","74141266":"arbiterList(uint256)","741430ad":"VINCToken()","7414edc4":"ERC20Token(string,string,uint8,uint256,address,uint256)","74151a2a":"retrieveUnsoldTokens()","74158cd8":"updateAdministratorKey(address,address)","7415fbdb":"_getGameInfoPart2(uint256)","74163ab1":"minsignupeth()","741677a5":"makeTrade(address,address,uint256,string)","741685e5":"EtherFuture()","7417040e":"numberOfParticipants()","7417575c":"_releaseEarning(bytes32,bytes32,bytes32,bool,address,uint8)","74182009":"CreateWolk(address,uint256)","74192209":"getTokenEnhanced(uint256,bool)","7419e77a":"setMarketplace(address,bool)","7419f190":"stakeStartTime()","741a35c4":"getTx(address,uint256)","741ad7a3":"transferDividends()","741b0508":"isSplitable()","741b2239":"unfreeze_period_time()","741b3c39":"depositBond()","741bcc93":"fillOrKillOrder(address[5],uint256[6],uint256,uint8,bytes32,bytes32)","741bd9c8":"ETHDeposir()","741be410":"getOpenPackageIdOfOneAgency(address)","741bef1a":"priceFeed()","741c251d":"changeGamemaster(address)","741cb9ce":"setCurve(address,bytes32,int256,int256[])","741cdf27":"Library()","741e2345":"registerMany(address,uint256,int256,uint256,bytes20,address,bytes)","741e3576":"getBonustokens(uint256)","741ed475":"AnkitVictoToken()","741f0434":"check(bytes20,uint32,int24[4],int24[4],uint32[4],bytes32[])","741f7034":"CrowdsaleToken(string,string,uint256,uint8,bool)","74214c92":"StandardERC223Token(uint256)","74220f3d":"burnApproval(address,address,uint256)","74229301":"isTokenized()","7422a127":"is_valid_event()","7423ab57":"Project_RemoveToken(uint256,uint256)","7423d96e":"txnTax()","7423e225":"getDataPointForSubject(int256,uint256,uint256,int256)","7424bab1":"currentAirdropAmount()","7424bebc":"bonusBasePoints()","7426172d":"addPurchaseFromOtherSource(address,string,uint256,uint256)","74268ff2":"deleteOffer(uint256)","74281f95":"FNAToken()","74287872":"investedAmountOf()","742887ff":"deleteAddress(address)","7428c5f4":"Gamble()","7428eed3":"IndieGameToken(string,string,uint8,uint256,address)","74294070":"_createItem(string,address,uint256,bytes32,address,address)","742978da":"getAssets(address)","7429c086":"repeat()","7429d78b":"SUCC(uint256,string,uint8,string)","7429f1eb":"multiAccessSetRecipientD(address,address)","7429fd67":"initHolderConfig()","742a1a56":"CCTE()","742a9fa0":"recursiveFloor(uint256,uint256,uint256)","742aa578":"AddressRecovered(address,address)","742b8b9d":"_CallRejected(bytes32,bytes15)","742ba8de":"declareProjectNotFunded()","742bff62":"SoftDude()","742c81e4":"approveOwnership()","742cd75d":"mintPCD(address,uint256)","742d5355":"calcTokenOwnerReward(uint256)","742d9f0b":"lastBlock_v7()","742d9fa3":"userOfferSubmitElement(uint256,uint256,uint256,uint256,uint256,uint256)","742e2ebd":"AllowedSet(address)","742e54b2":"_airdropSupply()","742f79d5":"preRate()","7430faf4":"fechSnapshotBlockByIndex(uint256)","7432542d":"_remainReward()","74331be7":"sete(address)","7434206e":"validateReceipt(string,uint256,bytes32,bytes32,bytes,bytes,bytes32)","743438ad":"id_for_address(address)","7434d180":"removeSmartContractByAddress(address)","7434e60d":"HamsterToken()","7435039d":"calculateBountyRewards(uint128)","743521c6":"rewardBountyMany(address[],uint256[])","7437681e":"maxTx()","74388347":"checkBetDozen(uint8,address,bytes32,bytes32)","74389991":"breakit()","7438b0df":"WIN_CUTOFF()","74396ed1":"makeWithdrawal(address,address,uint256,uint256)","74398d45":"setGlobalTokenTransferLock(bool)","7439a3bd":"verifyClaim(uint64)","7439e787":"getUserValues(address)","743a3252":"addAddressAsMultiOwner(address,string)","743ab538":"validateNameSignature(string,uint256,address,string,uint8,bytes32,bytes32)","743b179e":"giveRefund(address)","743b8e1a":"ROHH(uint256,string,string)","743bd681":"OWNERS_AUCTION_CUT()","743bdcef":"MAX_WITHDRAW_PCT_TX()","743c006b":"iWantXKeys(uint256,uint256)","743c6775":"investorBaseInfo(address)","743c7f6b":"setPreSaleDate(uint256)","743e0c9b":"receiveTokens(uint256)","743e92ee":"getNode()","743f78ab":"WalletSet(address)","743f978f":"addValueToCovfefe(uint256)","74400873":"execute(uint256,address,uint256,uint256)","744013c4":"Gnome()","74418368":"getAdvertisementStorageAddress()","7441b8bb":"lockBalance(address)","7442f427":"subUserTokenLocalBalance(address,uint256)","74439ca7":"classic()","74449ca4":"getContentCount()","7444b006":"transferCopyFrom(address)","7444b227":"getMidgradeCarsForVariant(uint256)","7445690b":"getLotteryClass(uint8[7],uint256)","744598cd":"Phase1AccountTokensMaxUpdated(uint256)","7445af4b":"pay_by_bond_contract(address,uint256)","7445d659":"foreignBridge()","74467a1e":"FOR_SALE()","7446ce1c":"addJob(bytes32,uint256)","74478bb3":"isClaimable()","74479db0":"fcontr()","7448d386":"getStageData(uint8,uint256)","744927fd":"getWinnerWithRank(uint8)","744a8f77":"chefPrice()","744b4b3f":"createNormalBank()","744bb8d2":"crowdsaleHardCap()","744bfe61":"withdrawFunds(uint256,address)","744c7c7f":"proposeMinting(uint256)","744c8c09":"chargeFee()","744d0a92":"MINI_GAME_BONUS()","744d8b4f":"recordWin(uint256,uint256)","744f4994":"getBrickIdsByOwner(address)","744f5f1a":"modifyTaxRate(uint256)","744f7c7d":"toUint256Safe(int256)","744fa2c8":"submitTokenToEthOrder(uint128,uint128)","7451bf71":"admin_transfer(address,address,uint256)","745332fe":"getRestarTime()","74536403":"getAvar()","74539f98":"getEventResolvers()","7453a417":"__address4__()","7453cfa1":"EtherPaint()","7453de96":"approveTransaction(uint256,uint256,string,uint256)","745400c9":"requestWithdraw(uint256)","74544e2d":"setGrandFactory(address)","7454e74c":"setAudit(address,address)","74552650":"left95(uint256)","7456be7d":"rent(uint256)","7456f2b9":"getDistributionTime()","74573f80":"lastPlayTimestamp()","7457412e":"THIRD_PARTY_LOCKUP_ADDR()","7457a9e1":"Coupon(uint256)","74580e2f":"changeCreator(address)","745828ef":"ProofOfLongHodlV2()","74583772":"adminSendTokens(address,uint256)","74590f64":"setApoderado(bytes32)","745911d5":"getHolidayByIndex_(uint256)","745944d5":"setCampaignValidById(bytes32,bool)","7459a5e1":"KriptoPark()","7459f2a3":"registerArbiter(uint256,uint256,uint256,uint256,uint256)","745a8be2":"flip32(bytes)","745ab73d":"BrainIsToken()","745ce3bb":"iaInvestedBy(address)","745ced49":"CORE_TEAM_PORTION()","745cf221":"ArjunaCoin()","745d1d64":"ethCollector()","745dcd4d":"stop(string)","745e77f9":"_createAnimecard(string,string,string,string,uint256,address)","745e9da2":"GameProgress(uint256,uint256,uint256)","745ea0c1":"registerNameXnameFromDapp(address,bytes32,bytes32,bool)","745f2860":"_buyTokens(address,uint256,uint8)","74601c3c":"availableToMint()","746022c2":"oneGetMoneyBack()","74607d91":"patient(uint256)","74609d0c":"createDApp(bytes32,uint32,bytes,bytes32)","746178ed":"escrowTokensWallet()","7461dbff":"setOwnerAirDropRate(uint32)","7462260b":"KEM()","7462beec":"renewSubscriptionByDays(uint256,uint256,uint256)","7462e4f9":"Etheropoly()","74635cfc":"setMembers(address[])","74646086":"StreamityTariff(address)","7464d5d8":"rewardDistributionStart()","74651594":"tgeSettingsChangeRequest(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","746584b4":"setMintingContractAddress(address)","7465df26":"totalAccessories(uint256)","74664b34":"interestNextInPercent()","7466b2d0":"transferIsPossible()","7466e67d":"mintToOtherCoinBuyer(address,uint256,string)","7466ee48":"getAppAddress(uint32)","74674256":"temroyToken()","746796f0":"_setProfitSharingParameters(uint128,uint128)","7467af07":"EladToken()","7467bc92":"disbursementHandler()","7467bcd9":"minPaymentWei()","74689990":"schedulePayoutOraclizeCall(uint256,bytes32,uint256)","746a9af2":"printCertificate(string,string,string,uint16,string)","746abc79":"distributeRegistrationBonus(address)","746ac67e":"PCNCrowdsale()","746c9171":"m_required()","746d3024":"perPrice()","746df633":"getTeamBallers(address)","746eff8c":"_cancelRolePermissions(address,address)","746f79d9":"TIER2_PERCENT()","746fc8d0":"right47(uint256)","74703123":"proceedKYC(address)","74707e0d":"deleteWallet(address,address)","747082b9":"FsTKAuthorityChanged(address)","7470a835":"OliToken(uint256,string,uint8,string)","7470f760":"createTeamTokenByPercentage()","74711285":"restartSale()","74715432":"renounceAuctionManager()","7471ea81":"IPayX()","7471f6f6":"buy_beer(uint256,uint256)","747293fb":"addCaller(address)","74748460":"balanceOfAtInternal(address,uint256)","7474dfd0":"_getBetAmount(bytes32)","74754282":"manufacturer()","747586b8":"setInt(int256)","74759f43":"numberOfInvestments()","7475baa6":"AirDropPayBitsBounty(address[])","7476865f":"ToggleMaintenance()","74772667":"changeMinContrib(uint256)","74775cdd":"buyAtPrice(uint256)","74780111":"assertEq16(bytes16,bytes16)","747853bc":"test_validBoardFundTransfer()","74796cc2":"getPlayersInGame(uint256)","7479aa04":"getCurrentRoundStartTime()","7479b9ac":"founderToken()","747ad1c1":"getPeriodIdx(uint256)","747bcd72":"SCORE_UNITARY_SLASH()","747c1d87":"getInvestorsAmount()","747cb030":"SALE_3WEEK_BONUS()","747d6dd0":"_getCrabPartBonuses(uint256)","747dff42":"getCurrentRoundInfo()","747e0670":"UseWish(string)","747f3380":"phoneNumber()","747fc0d2":"maxReferrals()","7480a676":"Cryptosquirrel()","74816d1e":"webGiftUnTransfer(address,address)","74817d9b":"startPublicSale(uint256)","74818530":"Creedex()","7481a8aa":"TokenizedSplitter(string,string,uint248)","7482e533":"EventLuckyNumberRevealed(address,uint256,uint256)","7483883d":"getOrAddMasterWallet(address)","74845024":"scribes_hisory_length()","748467b9":"callBtcWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","7486a8e3":"get_publisher(bytes32)","748837b2":"getIsBonusUnlockExempt(uint256,address)","74888914":"setHatchDurationMultiByGeneration(uint32[])","7488aa3c":"getNextBonusIndex()","7488ad7c":"minDepositInCents()","74891e1b":"getCoinAgeInternal(address,address,uint256)","7489308f":"lpTargetPosition()","7489472a":"step_pay()","748949e8":"setGalleryFourPrice(uint256)","7489ec23":"cancelOrder(bytes32)","748b659d":"pauseCollectToken()","748b95b6":"decimls()","748ce291":"addRewardforNewContributor(address,uint256,string)","748d071d":"seriesCreated(bytes32)","748d1078":"updateDukeHistory(string,bool,string,address,uint256,uint256)","748dd2fc":"GAME_TYPE_DICE()","748de225":"getFreezeAccount(address)","748de5d3":"UpdateAddressPayForService(address)","748e4f40":"sendTokensToTeam(address)","748ed9a8":"getTargetIncorrectDesignatedReportMarketsDivisor()","748efab5":"_copyToBytes(uint256,bytes,uint256)","748f0810":"ProposalTallied(uint256,uint256,uint256,uint256,bool)","748f7215":"getUnlocktime()","748fa599":"someUnsafeAction(address)","748ffa5b":"cei(uint256,uint256)","74900c92":"MINIMUM_ETHER_SPEND()","74912463":"tokenEmission()","74914710":"getCrySolObjectsByOwner(address)","7491ef60":"PrecommitmentAdded(address,uint256)","7492384a":"backTixOwner()","7493357b":"reservedOwner()","7493539b":"KOALAPROJECT()","74935f11":"PLS()","74942868":"rate8_end_at()","74942c0f":"tokens_received()","7494ad81":"judge(uint256,address)","749510d4":"BOUNTY_FUND()","749555cd":"toggleIsLive()","7495a1e4":"buyFor(string,address)","7497a061":"getAuthorDrawings(uint256)","749843ea":"setPlatinumAddress(address,address)","74991569":"setVestingContract(address)","74998f33":"Infinix()","749a47b7":"minPreviewInterval()","749aa2d9":"endRound()","749b7820":"canBuy(address,uint256,uint256,uint256,bytes8)","749be0c0":"GetTotalPot()","749c190b":"getHashsLength()","749ca1f3":"setGameOnoff(uint256)","749cab54":"setBlocks(uint256,uint256)","749db2f6":"Contract(string,string,address)","749dd65d":"_currentMonth2ndDayTimestamp(uint256,uint256)","749e8b88":"BUYPRICE()","749e93fc":"actualPriceDivisor()","749ea598":"leaders(address)","749f1bc3":"agendaOf(address)","749f9889":"changeAllowedRecipients(address,bool)","749fe7c4":"getPlayerEnergy(uint32)","74a042b5":"ClaimEthersEvent(address,uint256,uint256,uint256,uint256)","74a0cd8c":"getCombinedWarriors()","74a205d9":"ZIMBOCOIN()","74a25d43":"startAuction(uint256,uint256,uint256,uint64)","74a32dd7":"TotalAirdropRequests()","74a37efc":"setSalary(uint256,uint256)","74a3c5d5":"getVestingAmountByNow(address)","74a46050":"offer(address,uint256,uint256)","74a76649":"payTheWinner(uint256)","74a7d6b9":"initNewPlayer(address,bytes)","74a7d77c":"sellTokensNow(uint256)","74a814fe":"getGeneral(uint32)","74a85571":"addAccount(address,uint256,bool)","74a8f103":"revoke(address)","74a93e6c":"setTokenHolder(address,address)","74a9446e":"_removeAllActiveTasksWithHoles(uint256,uint256)","74a9ced9":"createPoll(string)","74a9e440":"createProposal(uint256,address)","74aa9e2c":"PRESALE_RESERVERED_AMOUNT()","74aac084":"joinDelta()","74ab3e4b":"updateCardStatistics(address)","74ac5bb4":"erc20KGS(uint8)","74ac6112":"HOPE()","74acb5d6":"isAirdrop(address)","74acf0b1":"communityDevelopmentWallet()","74ad74e9":"getMinLockedAmount(address)","74ae26f7":"checkReleaseAmount(address)","74af10cf":"setNeedToGetFree(uint256)","74af3ee1":"getTournamentState()","74b00a6c":"convertNums(uint256[])","74b04fa7":"setArtistAccount(bytes16,address)","74b10ae5":"checkWhale(uint256)","74b26fa1":"delegateReferralTokensBulk(address[],uint88[])","74b27b9b":"indexextend(address)","74b38531":"stopBet()","74b39158":"validateAttack(address,address)","74b3ee18":"getFlag(string)","74b433bd":"TOKEN_SUPPLY_MKT()","74b491ff":"airdropCurrentTotal()","74b527b0":"getMintedCounts()","74b5545a":"delCertAdmin(address,bytes32)","74b57486":"DebugContract()","74b58489":"setWeiMinContribution(uint256)","74b58ae7":"setCCH_edit_10(string)","74b5fb06":"_payout()","74b67b27":"GameCoin()","74b78b26":"payeth1(address,uint256)","74b799af":"disableEdition(uint256)","74b874a6":"liquidationTimestamp()","74b9dc6b":"assertEq9(bytes9,bytes9,bytes32)","74b9f229":"buyTokensPreSale()","74bb3cb4":"getOrderActualTotalRefundHelper(uint256,uint256)","74bd6261":"AdsVenture()","74bdb7ee":"createApprovalEvent(bool,address,address,uint256)","74bde311":"scheduleNewDerivativeToken(address,uint256)","74be3c7f":"TRONV()","74bfb965":"addNewProxy(address)","74bff257":"getCartItemInfo(address,uint256)","74c06f5d":"saleHasFinished()","74c1328a":"bytesToUInt(bytes)","74c13fda":"defaultToken()","74c1438c":"DeepGold()","74c166e9":"phase1MaxTokenForSale()","74c16b23":"registryAdmin()","74c1b1c9":"refundOpen()","74c1d7d3":"_best(address,address)","74c21059":"totalInvested(uint256)","74c272b7":"Begin(string,string)","74c40f2e":"dexTestTransferFrom(address,address,address,uint256)","74c42e5d":"setuserlevel(address)","74c43f26":"setFundariaBonusFundAddress(address)","74c57fa1":"LogTeamTokensDelivered(address,uint256)","74c65206":"Buy_Offer(uint256,uint256,uint256)","74c6bd74":"privateSaleLockEndTime()","74c77b52":"SetupToken(string,string,uint256,uint256,uint256,address,address,uint256)","74c80467":"createNewElections()","74c85591":"fundDepositAddress()","74c90d0d":"sellAllCookies()","74c950fb":"TOKEN_TOTALSUPPLY()","74c97c99":"manaToken()","74cad0b7":"ForTester()","74cb55fb":"fundsDistributor()","74cc991c":"getBetValue(bytes32,uint8,uint8)","74ccd7cc":"walletLock(address,uint256,bool,bool)","74ccf06f":"addParsel(uint256,uint256,address[])","74cd5a31":"HXTtoken()","74cd5c0b":"getOneWithdrawRec(uint256)","74ce52ce":"Kildoneum()","74ce9067":"isCommitPhase()","74ce97fe":"year3LockAddress()","74cf6f49":"withdrawNoLimit(address,uint256)","74cfa35f":"ambassadorAddressOf(address)","74d04f83":"addtoPrivateSale(address,address,uint256,uint256)","74d050fb":"cardNumbersOf(uint256)","74d15357":"virtualc()","74d16c37":"getAssetsValue()","74d1eb3f":"MANToken(string,string,uint256,uint256)","74d21ae0":"unlike(uint256)","74d301d6":"sizeBonus()","74d33745":"REAPER_INTREPID_FTL_SPEED()","74d3475c":"PowerofBubble()","74d393f0":"setValue2(uint256)","74d3b7cd":"LTR3Token()","74d42916":"IINEToken()","74d4ab27":"fipsRegister()","74d50c1c":"TOPB()","74d53cc2":"sendReferral(address,uint256)","74d55ceb":"Rhemaxcoin()","74d5e1ea":"setteam(address,uint256)","74d5f2aa":"BoxTrade()","74d618cb":"setTransferActive(bool)","74d699b6":"Sale(string,uint256,address)","74d6aa1f":"getOrCreateFeeWindowForForkEndTime()","74d76bc4":"_getGameInfoPart3(address,uint256)","74d88c50":"submitEthToTokenOrder(uint128,uint128)","74d89c47":"testUpdateNameDb()","74d8b268":"getGunByIdPart1(uint256)","74d9c2ef":"tokenTosale()","74da564f":"registerMeOnTokenCore(address,address,uint256,string)","74dacc7a":"m_attaching_enabled()","74daf5cc":"setValidPriceDurationInBlocks(uint256)","74dbe5e6":"GetSpud(address)","74dc1e04":"TokensDestroyed(address,uint256)","74dcfd37":"NotakeyVerifierForICOP(address,address)","74dd7be9":"setCompte_42(string)","74de4ec4":"addReward(uint256)","74de8caf":"ERC20transfer(address,uint256,bytes)","74de9ebb":"MintEvent(uint256,address)","74dfcabc":"changeFreezeTransaction(string)","74dff9d8":"stopCycle()","74e00730":"DISTRIBUTION_COMMUNITY()","74e048d5":"settleBetUncleMerkleProof(uint256,uint40)","74e09606":"setSignatureTimeout(uint256)","74e104d3":"BITWORKCOIN()","74e29ee6":"deleteService(uint256)","74e4435f":"getUserAddress(uint256,bytes32)","74e4f31d":"ZJLToken()","74e5530d":"testHasRole()","74e57397":"BrandUpdated(address,address,string,bool)","74e59296":"MYE()","74e5b122":"changeGenerator(address)","74e5b186":"_mint(string,address)","74e60a48":"cancelOrder(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)","74e7493b":"changeRate(uint256)","74e74f24":"rulesProposal(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","74e8288c":"SaiContest_Gaia()","74e95828":"_distributeWinnerAndLandholderJackpot(uint256,uint256)","74e99f87":"AIWEBToken()","74e9e102":"GetTempStuffList(address)","74ea9437":"transferICOToken(address,uint256)","74eac2e6":"Beruqtoken()","74ead7b7":"unstakePrimordialTokenFrom(address,uint256,uint256)","74eb7c90":"withdrawSaleManagerBalances()","74eb936b":"ethQuantity()","74eb9b68":"isAccountLocked(address)","74ebe3ec":"isSet(address)","74ec8682":"walletForETH()","74ec89cb":"H2CToken()","74ecf4b5":"getWinningNumber(uint256)","74eead66":"SFT_PER_ETH_SECOND_EARLY_BIRD_RATE()","74eedd46":"fundingEndTime()","74ef109b":"ChinaLifeCoin(uint256,string,uint8,string)","74f0314f":"SECONDS_PER_DAY()","74f059ad":"dateDefrost()","74f0765a":"mintSeq(address[])","74f079b8":"txCounter()","74f12933":"devPaid()","74f1d6ce":"keccak(address,address,uint256)","74f28eaf":"_set11()","74f47a7a":"nextDrawTime()","74f519db":"setLastTimestamp(uint256,uint256)","74f569e7":"EriCoin()","74f61642":"rewardsRedeemed()","74f760e4":"WithdrawWinnings(uint256)","74f78412":"market_DeclareBid(uint256)","74f78437":"FD(uint256,string,uint8,string)","74f79c8e":"DEFROST_INITIAL_PERCENT()","74f8d96e":"getRevisionBlockNumber(bytes20,uint256)","74f8f7ac":"increaseUpdateMetadataCounter(uint256)","74f91b56":"setXTVNetworkContractAddress(address)","74fa01c9":"MilcToken()","74fa4874":"getResultStatus(uint256)","74fa98f5":"setInviteCodeFree(string)","74fb381a":"inject(address,address)","74fbbc86":"rate(uint256,uint256,string)","74fc27c1":"xfitcoin()","74fcd919":"tokenMsg()","74fd08cd":"whatSatoshiSays()","74fd6176":"removeBulk(address[])","74fe6dea":"nameCat(bytes5,bytes32)","74fe9247":"AddRevocationBounty(bytes32)","74fefa2c":"findEndpointByAddress(int256,address)","74ff2324":"requestMinimum()","74ff90ba":"Disbursement(address,uint256,uint256)","74ffdcd0":"WEI_PER_ETH()","75012c35":"setBonusTokenInDays(address,uint256,uint256)","750142e6":"totalReward()","7501f741":"maxMint()","750225d0":"completeSale(uint256)","750240a2":"setMaxResolvedAgonId()","75030996":"getServiceName(address)","7503af06":"Test9J()","7503cda7":"getLogOwnerAddr()","7503cda9":"thinkLength()","7503e1b7":"tournaments(uint256)","750446a3":"howManyTokensAreReservedFor(address,address)","750482ba":"ownersBalance()","75048ebd":"claimUnsold(address)","7504aaaf":"updateTargetedMoney(uint256)","75052882":"modifyProductPrice(bytes32,uint256)","75056811":"accountClaimedReward(address)","75067219":"MAX_UCCOIN_SUPPLY()","75071c4c":"founderFund()","750732ec":"addVineyardByRegulator(string,string,uint16,uint24,uint32,uint16)","7507b2e5":"OVOToken()","7507ba39":"remit()","750852b3":"test_invalidThrowWithAsserts()","7508f147":"setOperationalReserveAddress(address)","75090ebf":"changeDomain(uint256,uint256,uint256,address)","750a687c":"GetRevealBlock(bytes32)","750a96ac":"_createPermission(address,address,bytes32,address)","750c47a1":"TOKEN_PER_ETHER()","750c77cb":"AccountMinterRemoved(address,address)","750cae6a":"enableBetting_only_Dev()","750cc645":"_sendToken(address,address,uint256)","750dd523":"getContractCreationTxOrigin()","750e1f59":"transfer(address,uint256,bytes1[])","750e443a":"voteAgainst(uint256)","750e75d5":"distributeJackpot(uint256)","750ee24a":"changeIcoEndBlock(uint256)","750f0acc":"withdraw(uint64)","750f2d81":"ChangeFreezeTime(uint256,uint256)","750f7daf":"hashBiometricTemplates(string,int256,string,string)","750fd1d1":"startTimeRefund()","7510a98c":"updateConfig(uint32,int256)","7510c5a0":"encoding_description()","75114bcc":"addPhrase(string)","7511828e":"Laxz()","7511ef65":"setWithdrawAddr(address)","7512071b":"doApprove(address)","75121c2c":"FCOIN1448Token(uint256,string,string,uint256)","751318f4":"bountyAdded()","7513eaa7":"HolyCoin()","75143ef2":"mintFinished()","75151f6b":"addCountryCode(uint256)","751559e8":"transactionfee()","7515b583":"exchangeCoin(uint256)","7515b84a":"releaseRoto(address,bytes32,uint256)","75160a20":"pay_royalties()","751634d9":"ChangeRules(uint256,uint256,uint256,uint256)","751686f7":"_maint_setBlockLimit(uint256)","75172a8b":"reserves()","7517b57e":"withdrawTaxEarning()","7517ea47":"configureSale(uint256,uint256,address,uint256,address,address,address,address)","751823f2":"changePartnerCoinPercentage(uint256)","751827ac":"setRareAddress(address,address)","7518af71":"VGWToken(address)","7518fa98":"tokensContract()","7519dd8e":"starsOf(uint256)","751a0225":"addElement(address,bytes32)","751a2d06":"Token_4()","751a9108":"balancesof(address)","751c4d70":"contributeDelegated(address,uint256)","751ce8fb":"sendRewardBlockCDN(address,uint256)","751d9e65":"WALLET_FOUNDER()","751e1079":"compareAndApprove(address,uint256,uint256)","751ecea0":"FUTURE_DEVELOPMENT_POOL()","751ef753":"toggle(uint256)","751fef65":"sellUnit(uint256,uint256)","7520320f":"registerCustomer(address)","7520767f":"createNew(string)","7520bf60":"gas_price_max()","75218a54":"getUserReactionCount()","75219e4e":"transfer(address,address,uint256,bool)","75229e28":"lockcheck(uint256)","7522aff5":"rejectContract(bytes32)","752329ec":"retainedEarning()","7523a46e":"HARITECOIN()","75247ccb":"_calculateReward(uint256)","75250e85":"limitDateCrowdWeek1()","752551c9":"_END_DATE()","75257013":"appendToDistributionList(string,address,uint256,uint8)","7526f98c":"getMin(uint16[])","7527313d":"minedBlock(uint256)","75286211":"finalizeChange()","75288d95":"platformSupply()","7528a6ab":"icoPhase4Start()","75298734":"getShare()","7529b1d9":"upgradeHasBegun()","752a3df6":"transferIfHardForked(address)","752b016d":"DeletePatient()","752bacce":"getExecPrice()","752bece8":"Minus(uint256,uint256)","752bf6f8":"sale_pause()","752c5628":"callSend(address,uint256)","752c8777":"setArenaPool(address)","752d2bfb":"addDividend(uint256)","752d349c":"depthCheck(int256,int256)","752da85a":"endContribution()","752dd0dc":"unfreezeBonuses()","752dd635":"ETHButton()","752efafc":"TIER5_RATE()","752f3c8c":"relinquishOwnershipAddress()","752faa51":"setLockedGroup(uint8,bool)","752fc70e":"howManyEthersToChangeSymbolName()","7530b54d":"PRESALE_LEVEL_3()","7530d99d":"addForgivedChar(string)","7530fe1d":"getContractMessages(uint256)","753117ff":"stealTheLeek()","7531e032":"resolveExchangeAddress()","75321c35":"TransferAgentSet(address,bool)","75321c4a":"getOpen(uint256)","75322e47":"change(uint256)","7532b4ac":"percent(uint256)","7532eaac":"signedTransfer(address,address,uint256,uint256,uint256,bytes,address)","7532ef1c":"accRecive()","75335702":"GSDToken()","753384fa":"TOKEN_BONUS_RATE()","7534a714":"checkExpectedTokens(address[],uint256[],uint256)","75355e34":"giveExchangeRateAdvice(uint256)","7535679a":"faucet(address,address)","7535927a":"importAmountForAddress(uint256,address)","7535c930":"priorityCap()","75367ab5":"addToWinners(address,uint256)","75383265":"TON()","753868e3":"lockContract()","753899e9":"alive()","7539189c":"getData_3()","75395a58":"finalizeBlock()","753af202":"SpermToken()","753b0dc1":"createFashion(address,uint16[9])","753b8c02":"EthernautsMarket(uint256)","753c619c":"emitTransferEvents(address,address[],uint256[])","753ca259":"PiXS()","753cb4eb":"fetchVoteNumForCandidate(address)","753cba93":"isPlatinumLevel(address,string)","753d764c":"unlistSubName(bytes32,bytes32)","753d93e4":"changePlatform(address)","753ded15":"failsOf(address)","753e88e5":"upgradeFrom(address,uint256)","753ea1be":"_transferCoins(address,address,address,uint256)","753ed1bd":"ceiling()","753f313f":"setPOOL_edit_26(string)","753f416a":"send1(address)","75401eac":"_isSaleContract()","7540b097":"inflateCount()","75421e93":"buyIcoTokens()","75424253":"BoughtToken(address,uint256)","75426ec8":"tokenFulfillmentDeposit(address[2],uint256,uint256[8],uint8,bytes32[2])","75428615":"getCallData(bytes32)","7542890d":"editIt(uint128,uint64,bytes32[],string,string,string)","75432ec4":"setStorageFee(uint256,address,uint256)","75438e49":"fillGas()","7543af9c":"amount3()","7543e3f0":"setReferral(address,address)","7544ac1f":"CSAToken(uint256,string,string)","75456b49":"fillIndexedBidByAddress(address,uint256)","75457583":"Return(address,address,uint256)","7545c449":"confirmOrderCompletionByPatient(bytes16,bool)","7545f9a1":"processTicketBuying(string,uint256,address)","7546006b":"ContractCall(address,uint256)","754628d0":"cancelTopUpLimit(uint256)","75479c34":"newPlayer()","7547c7a3":"stakeTokens(uint256)","7548014d":"recoverOnlyOnChainFunds()","7548f65b":"END_AMOUNT()","754a347a":"transferViolated(string)","754a77f5":"fcc()","754ad981":"MoveFish(uint256,uint256)","754c175e":"getTip()","754c301d":"sumOfFreezing(address)","754c3957":"benecifiary()","754c67ad":"setTokedoToken(address)","754d71e7":"getCurrentBuyOffer(uint32)","754db89b":"gameExists(bytes32)","754dea40":"setBackendOwner(address)","754e1764":"DiceRoll()","754e1e8e":"invalidateEarlyPurchase(uint256)","754efc98":"throwOnGasRefundFail()","754f579d":"ownerSetGameName(string)","754f9b37":"BasicAccessControl()","754fd352":"addOwnerFromRecovery(address,address,address)","75504b6e":"getAwardCost(uint256)","75524ffd":"mintBase()","75526ed5":"setServiceAccount(address,address,bool)","7553044b":"setUserServerPermission(address,string)","75543074":"getOrganisation(uint256)","75545949":"countMails()","75545cb2":"processMyVestingRules()","75549490":"isEarlyBird(address)","7554fffd":"successFee()","75556e32":"totalMaxBuyin()","7555bfd7":"exchangeAndWithdrawToken(uint256)","7556c9e9":"SilentNotaryToken()","7556e07f":"hasRate()","75570ea7":"closeBets(uint256)","7557b2ae":"Advertisement()","7558d81e":"contractProgress()","7558d9a6":"wallet_Mini_Address()","75593a39":"fixPrice()","755a11dc":"winnersPot()","755a29f4":"set_minCWCsPerSaleMoreThan(uint256)","755a8d31":"getBattleTeamSize()","755b5b75":"setNumUnits(uint256,uint256)","755b9d63":"_addOrder(address,uint64)","755bdcc1":"completeTrade(address)","755c020e":"withdrawALTokenss(address)","755c30a4":"earlyInvestorsBonus()","755cc41e":"mintTimes()","755d43d3":"calculateAmountReceived(uint256)","755d766c":"s27(bytes1)","755d80ab":"MintDarioToken(int256,address,int256,uint256)","755d98a3":"getTotalDividendPool()","755db762":"addVestingAddress(address,uint256)","755dc018":"FANBASEToken()","755e3e28":"tokensAllocated()","755f047b":"projectDescription()","755f12db":"totalTokensSoldInThisSale()","755f99c2":"AddNewSmallContract(address)","755fa815":"getAllIndexesByAddress(address)","755fd25c":"mintEditionCards(address,uint8,uint8)","75608264":"get_hash(uint8,bytes32)","7560a8d9":"_devTokens()","7560cab5":"createListing(bytes5,uint256,uint256)","75619ab5":"setDistributor(address)","7562b0cf":"process(address,uint256)","7563113b":"mintPromoEtherBro(uint16)","7563c81f":"WorldBetToken()","75640ef3":"calculateTotalMinePay(uint256,uint256)","75643e1f":"setReward(uint128)","75659508":"hasPayroll(address,address)","7565a2b6":"transferTokens(address,address,uint256,uint256,uint256)","7565d2eb":"coinfabrikAddress()","7565ef66":"getTodayLotteryNumber()","75661f4c":"calcPlayerICOPhaseKeys(uint256,uint256)","75662b0e":"ChainSign()","75669274":"XXXToken()","75678491":"AMSBToken()","7568353c":"isKilled(uint256,uint8)","7568a9af":"claimNametagToken(address,bytes32)","7568d562":"AssetToken(uint256,string,string,uint8,address)","75698524":"UpdateUSDETHPriceAfter(uint256)","7569b369":"updateUnclaimedDividend()","7569b3d7":"contributorsCount()","756a288e":"getStageTokensSold(uint8)","756a515f":"test_insert_findNoHintUpdateTail()","756abb98":"timeSlicesCount()","756af45f":"withdrawBalance(address)","756afcab":"Mari()","756b1140":"Readings()","756b397a":"GainmersSALE(uint256,uint256)","756bae5c":"finish(bytes32,bytes32)","756bf6e9":"Popcore(uint256,string,uint8,string)","756d5e0d":"EvGroupChanged(address,uint8,uint8)","756dc34a":"PHASE_NUMBER()","756e15e5":"test_spamApproveAndFreeze()","756e8ed3":"innerGuess(uint32,uint16,uint32,address)","756f6049":"CORE_NAMESPACE()","756f7ce8":"fundariaStakesFrozen()","756fb8c9":"getOptionChain()","756feedc":"KingXChainToken()","75700437":"query1_withGasLimit(uint256,string,string,uint256)","757007f6":"CONFIG_MIN_VALUE()","757085e3":"fetchAllVoteResultForCurrent()","7570acd4":"indVesting()","75718e2c":"_increaseTotalDivis(uint256,uint256)","7571ca36":"getTerminated()","75724990":"addShareholder(address,uint256)","7572ead0":"halfyearteam()","7572f341":"subtractWee(uint256,uint256)","757387d0":"nextInListToReturn()","75749f52":"LOCKED_BOARD_BONUS_TOKENS()","757501c5":"districtsCore()","7575594b":"buyShip(uint16)","75759319":"wthdraw(address,uint256)","7575db0a":"invalidateCache(bytes32)","7575ecf6":"validateAndLower(string)","75765249":"saveLottery(uint32,uint256,uint256)","75766294":"teamPeriodAmount()","757765f8":"setMaxBuyLimit(uint256)","75776fa4":"createPromoPony(uint256,address)","7577732e":"createController(address,address[],uint256)","75780127":"testExecuteSellOrderShouldIncreaseBuyerTokens()","75785afc":"createDefaultGen0CobeFriend(uint256,address,uint256,uint256)","757861eb":"start_play_and_gain(string,string)","75790787":"getFeeCollectedByAsset(address)","75792f0d":"_transferToICAPWithReference(bytes32,uint256,string,address)","75794a3c":"nextTokenId()","75796f76":"setWithdrawalWallet(address)","7579f2c9":"ArollaToken()","7579fcb3":"mintPackSaleCard(uint8,address)","757a449e":"approveWithIndex(address,uint256,uint256)","757a5522":"channelPartTimeout(uint64)","757a61b9":"buyAssetPack(address,uint256)","757bd312":"getCrystalWrapper(address,uint256)","757be78e":"PlayersStorage()","757ccd3b":"canCreate()","757d9b97":"getTradeRate(address,address)","757de573":"setOwnerCut(uint256)","757dfdcc":"SafeWalletCoin()","757e5e73":"_giveShares(address,uint256)","757f70fb":"SAMPLEToken()","757f7302":"updateStateChangeAgent(address,bool)","75806e6e":"setIssuerDelegate(address)","75811c15":"ownerChange(uint256,address)","75812019":"getBurningReward(uint256)","7581a8e6":"enableBurning()","7581aa5f":"setActivityState(bool)","7581d62f":"genesisProtocol()","75821d21":"changeTokenWallet(address)","75829def":"transferAdmin(address)","75830463":"checkBetLowhigh(uint8,address,bytes32,bytes32)","758357b8":"fstPrice()","7583902f":"getProviderInfo(address)","7583a523":"maxEarlyPresaleEDUSupply()","75846a5e":"ZoueToken()","75849902":"forwardPurchaseFeesTo()","75854fbd":"b(bool,bool)","75862df4":"TokenWithEStop(address)","75864416":"MeritToken(uint256)","7586cd45":"getPokemonCurrentPrice(uint256)","7586fcc5":"AutoCoin(string,string,uint8,uint256,uint256)","75872a5a":"evolveMonster(uint256,uint16)","75874f3e":"Divineum(uint256,string,uint8,string)","758822e6":"checkForValidity(string)","75885f6a":"approveAndCall(address,uint256,bytes1)","758866f0":"TOSToken()","7588f82b":"currentVestedAmount()","75892cf1":"convert(address,address,uint256,uint256)","75894e8c":"getEntity(address)","758971e8":"ownerTakeProfit(bool)","7589ca40":"BCV()","758b31df":"premiumMod()","758b5172":"setPlayersPerRound(uint256)","758befae":"tokenPresaleCap()","758e08d0":"Authorization(address)","758ed826":"addDAppContract(address)","758f39b8":"verifyProofOfStake(address,bytes32,uint64,uint256,bytes32[],uint256[],uint256,uint256)","758fabcd":"MAX_CONTRIBUTION_SLOTS()","759014f0":"getChallenge()","7591dfa0":"dmlToken()","759234ec":"POLE()","759242fd":"WorldReserveCurrency()","75924b95":"changeWinConfig(uint8[],uint8[])","7592550b":"transferHomeViaRelay(address,uint256,uint256)","759343d4":"sendTo(address,bytes,uint256)","7593473c":"set_brain(address)","7593ca71":"setExchangeInterval(uint256)","75949c13":"sendHalf(address)","7596732f":"MorzeF()","7597eede":"isHoliday(uint256)","7597fd6b":"escape(uint32,int256,uint32)","7599609d":"getEventForHousePlaceBet(uint256)","7599f8d9":"private_setRandomAPIURL(string)","759a2753":"StakeIncreased(string,address,uint256,uint256)","759b2ac4":"removeRole(uint256,address,uint256)","759bca86":"TEMWallet()","759c01dc":"SonDepTrai()","759c676d":"removeAddressToWhitelist(address)","759c7a58":"setAdOwner(uint256,address)","759e6558":"changelp9(address)","759f0914":"createObject(string)","759f8712":"nonActivationShortWithdrawal(address[2],uint256[8],uint8,bytes32[2])","75a0a7a4":"generateNumberWinnerQuery()","75a0ff93":"BTKToken()","75a2b407":"createPromoFighter(uint256,uint8,uint8,uint8,uint8,address)","75a35191":"Travelercoin()","75a374ee":"transferMined(address,uint256)","75a3eac0":"checkExistsOwnedAngel(uint64)","75a4894b":"setReaderId(bytes32,bytes32)","75a4e3a0":"unlock(bytes4)","75a52506":"display(bytes32)","75a53a8f":"changeTrusteeOwner()","75a5425a":"DTesh()","75a55a44":"CR7()","75a5b1ab":"registerDuration()","75a5ba80":"delegateDklSiringAuction(uint256,uint256,bytes,uint256)","75a66774":"stampDocument(bytes32,uint256)","75a6a332":"testThrowRetractNotRetractable()","75a6dbda":"delAdminUsrs(address)","75a73ed3":"createMessage(bytes32)","75a747dc":"_mint(address,uint256,bytes32)","75a75ba9":"TRANSFERS_ALLOWED()","75a806cd":"transferLoss(uint256,address)","75a88bcf":"getPreClaimTimeStamp(address)","75a90144":"voterExists(address)","75a90e02":"readisnameregistered(string)","75a949a3":"transferBlocToUsers()","75a94af5":"JadetToken()","75aa39bd":"getTeamScore(uint256)","75aa8705":"begin(bytes32)","75ab9782":"tokensToSend(address,address,address,uint256,bytes,bytes)","75ac3b08":"presaleEndBlock()","75ace438":"setRdCollectorAddress(address)","75ad319a":"makeLiquid(address)","75ad31a0":"vesting1Withdrawn()","75ad4787":"_processRefund(address,uint256)","75ad97bb":"_initSpaceship()","75ada3d3":"getLicenseReimbursement()","75ae267d":"setCanTransfer(bool)","75ae51ce":"minForceOffsetAmount()","75aecd8d":"ContributionAdded(uint256,address,uint256)","75af370f":"ChainToken()","75af65d1":"discounts()","75b03941":"retrieveGains()","75b0d9cd":"totalSupplyOf(uint256)","75b1e894":"ProposalLog(uint256)","75b238fc":"ADMIN_ROLE()","75b3a83e":"START_ICO_TIMESTAMP()","75b3ea8e":"calculateExcessTokens(uint256,uint256,uint256,uint256)","75b3f9f5":"currentRateLevel()","75b44aea":"getEthRate()","75b466d1":"sendOrderedTokens()","75b4d78c":"bonus()","75b5243d":"editBasePrice(uint256)","75b599c0":"changeFashionAttr(uint256,uint16[4],uint16[4],uint16)","75b5ec08":"DcatNetwork()","75b65abf":"claim(uint16,uint16,uint16,uint16)","75b77c4b":"PRICE_MAX()","75b88b82":"Beebit(bytes32)","75b8fa6f":"contractMoneyBalance()","75b91305":"_removeDeposits(address,uint256)","75b94133":"validatorReward()","75b975b7":"askArbitrator(address,bytes32)","75b99fb1":"HonestisnetworkICObalances()","75b9b357":"updateData(uint256,string,string)","75b9c384":"UpdatePay()","75b9fd47":"BuyAcorns()","75bac6fd":"getLastDeedTimestampByAddress(string)","75bae755":"AariTestToken()","75bba189":"setModerator(address)","75bbc15d":"isNeedDrawGame(uint256)","75bbc204":"addJackpotGuaranteed(uint256)","75bc369a":"_triggerCoolCountDown(uint256)","75bcf09f":"getFibo(uint256)","75bd3237":"listingExists(bytes32)","75be5846":"unlockForever()","75bedf12":"valueOf(uint256,uint256)","75bf4777":"Presale(address,uint256,uint256)","75bfb140":"teamInstantSent()","75c0ae13":"getSalaryTokenAddress(address,address,uint256)","75c14f7d":"buyoutAndSetReferrer(uint256,bool,uint256,uint256,address)","75c268f3":"rateFeesDenominator()","75c26c3f":"closeCrowdfund()","75c3039c":"finalizeCapReached()","75c34d94":"BitcoinElena()","75c48942":"restrictedVault()","75c4a4d6":"isClaimable(int8)","75c4aaa6":"addUnderDog(uint256)","75c4e9ec":"token_reward()","75c589a0":"getMinimumCallCost()","75c5efd8":"teamFundsAddress()","75c66e2f":"mintTokens(uint256,uint256,address)","75c69e39":"SOLUSCRSToken()","75c7d4e1":"sellMyTokensDaddy()","75c81ad0":"minProfit()","75c8a66e":"MANHATTANPROXY7THST()","75c8f04b":"addTenant(address)","75c9c4a4":"SQUIRREL_BASE_REQ()","75c9ee06":"teamFrozenTokens()","75c9f351":"maxTokenNum()","75ca1fad":"setcommissionPer(uint8)","75ca3b2e":"getKittyInfo(uint256)","75cb1bd1":"setWallets(address,address,address)","75cb2672":"configure(address)","75cbe239":"rulesProposals(uint256)","75cc21bd":"LogInvestshare(address,uint256)","75cc499f":"LogTokenPurchase(address,uint256,uint256)","75cc90b3":"ADMINS_COUNT()","75cd109a":"BurnSplit(uint256)","75cd51ed":"accountExists(address)","75ce2913":"pushOwnedToken(address,uint256)","75ce738e":"base_token()","75cf567a":"TOKEN_RATE_15_PERCENT_BONUS()","75cf77fb":"buyPoohs()","75d04628":"updateMatchStartTime(uint8,uint256)","75d049bb":"ApplyDividentsMultiplicator()","75d0c0dc":"contractName()","75d14478":"Chi_available()","75d16a1e":"JaxBox()","75d1722d":"_cancelOrderWithPayer(string,address)","75d2fd7f":"setERC20compatibility(bool)","75d32381":"Gave(uint256,address,address,uint256,uint256)","75d3bda6":"Product()","75d4066d":"getKeccak256(string,string)","75d4115e":"orderSubmitter(bytes32)","75d427e2":"greaterHash(bytes32,bytes32)","75d53a73":"approveMe(address)","75d57f44":"Benable()","75d5a7c6":"torchContractBalance()","75d60ba1":"PayToContract()","75d7036b":"getOuvidoriaEnteTipo(address)","75d7348a":"makeReferalBonus(uint256)","75d74f39":"get_s()","75d79399":"LogNotifyOfArbitrationRequest(bytes32,address)","75d7e4bd":"hydroTokenAddress()","75d7e8ea":"canTransferIfLocked(address,uint256)","75d9085a":"buyCardXname(uint256,string)","75d91db8":"cancelAuctionByMaster(uint256)","75d955f7":"realWorldPlayerMetadataForPlayerTokenId(uint32)","75d96718":"RELEASE()","75d9aa1a":"migrateFromLegacyReputationToken()","75da33bd":"tokpereth()","75dbc1aa":"LiquidHome()","75dc6471":"getSalesCity(uint256)","75dc7d8c":"calcFee(uint256)","75dcb701":"getBonusTierCount()","75dcb70a":"updateEditionTokenURI(uint256,string)","75dd3799":"NetWexCoin()","75dd82b8":"setPreMineAddress(address)","75ddbc4e":"setBalanceOfPendingToken(address,uint256)","75ddfa11":"ChannelBought(string,address,address)","75deadfa":"endTimes()","75df1fe8":"lockReleaseDate1year()","75df9fdb":"backVISTAcoinOwner()","75e01780":"startExchange()","75e0747e":"referrerBonus1()","75e2f405":"product1_luckybuyTracker()","75e2ff65":"setMigrationAgent(address)","75e3661e":"unblacklist(address)","75e372f2":"BlocklancerDataHolder()","75e3921c":"ETH_VTA()","75e39f26":"getHeroInfo(uint256)","75e3e4d4":"_sendTokens(address,address,uint256)","75e42744":"balanceOf(address,bytes32,address)","75e456c3":"validInvestment()","75e5598c":"ACTION_KEY()","75e6f675":"redemptionPercentageOfDistribution()","75e87642":"getRoundBetAmount(uint256,uint256)","75e88e3a":"getForceOffsetBooks(address)","75e8b1a3":"changeWithdrawnTime(uint256)","75e8f289":"depositWalletAddress()","75e8f757":"ERC20PreICO(address)","75e96908":"saveLifeEvent(string,string,string)","75e9c91f":"dropNectar(address[],uint256[])","75e9e3e2":"Ldt()","75ea1b68":"completeDeliverable(bytes32,address,address)","75ec899a":"addBodyParts(uint8[])","75ed5604":"referralLinkRequirement()","75ed8f89":"tOS(address)","75ee549c":"seteUSD(address)","75ee7315":"IcoPaused()","75ee85bd":"salsa20_8(uint256,uint256)","75eeadc3":"hasWon(uint256)","75f0a874":"marketingWallet()","75f12b21":"stopped()","75f208bf":"testFailCreateWithParentNotInUse()","75f289bc":"setDiscountBonus(uint256)","75f2e45d":"charityPayed()","75f33ed6":"EtherReceival(address,uint256)","75f40f40":"underdogPayoutFund()","75f41f4a":"initExchangeUser(uint256)","75f45878":"scheduleCall(bytes,bytes,uint256)","75f46563":"setVLTMultiSig(address)","75f6641f":"GoldBackedToken(address)","75f7cc4a":"PeriodStarted(uint256,uint256,uint256,uint256,uint256,uint256)","75f7d866":"tokenReserved2Deposit()","75f7e6f0":"saneIt()","75f829a9":"BetAccepted(uint256,uint8,address,uint256,uint256)","75f890ab":"setContract(address)","75f91ec8":"getTokenAmount()","75f96ead":"Guess(uint256)","75f9ae86":"setCertificateSigner(address,bool)","75f9e6da":"initialIssueMintingDate()","75fa1bd3":"_reserveTokens(address,uint256)","75fc8e3c":"goodbye()","75fcc6f1":"OWN_burnToken(address,uint256)","75fd4c23":"test_basicUnitTest()","75fd776a":"STRATEGIC_PARTNERS_POOL_ALLOCATION()","75fda973":"tokenDistributeInDividend()","75fe06dd":"claimXmasGift(address)","75fe2cb8":"setDnaExist(uint64,bool)","75fe2e33":"getMonsterObjId(address,uint256)","75ff0664":"ERC223TokenMock(address,uint256)","76005c26":"fulfillData(uint256,bytes32)","76014a2d":"senderETH(address)","760163af":"getLastGames()","76017bbd":"getRewardWei(address)","7603ac4b":"registerFileClosing(string,uint256,string,string)","7603b02d":"houseCommission()","76041376":"devTeamAddress()","76045702":"AcceptsDividendFacial(address)","7604b6d7":"testGetBlobStoreFromFullBlobId()","76052df8":"setPurchasable(bool)","760672df":"weiToTokensAtTime(uint256,uint256)","7606f781":"getMetrics()","7607422a":"CSCS(address)","76098303":"futxMiner()","7609c5a9":"transferFromToICAP(address,string,uint256)","760a221c":"LOCK_RELASE_TIME()","760a45cf":"lockStrategy(address)","760a812c":"ChangedNeighbourReward(uint256)","760a8c2a":"setActive()","760ac21b":"testFailBadTransfer()","760b8f62":"bonusAll()","760bb006":"isUser(bytes32)","760c1fa3":"loadX(uint8[],uint256,uint256,int256)","760cd8e1":"transferAgent()","760cfa57":"GeneratedERC20Contract()","760df4fe":"_isCarousal(uint256)","760e2cf3":"buyUpgradeCard(address,uint256,uint256)","760eab1a":"ZodiacCore()","760ee49c":"setCurrentState(bool)","760f7382":"shipTokens(address,uint256)","76102b3c":"PRICE_PRESALE_WEEK3()","76105fe7":"tarifOf(address)","7611f50d":"periodStage()","7612115d":"setTokenPartner(address)","76124dac":"vote(bytes32,uint256,address)","76124db7":"Update_TrustlessTransaction(uint256)","761390b9":"BCX()","76147a0e":"notification(address,uint256)","7614e727":"baseMineTokenAmount()","761522af":"TradeBits()","76164085":"seek(int256,int256,bool)","76165adf":"buy(address,address,uint256,uint256,uint256)","76167a89":"getMessageSender()","7617f814":"sumPreICO3()","7617fbbd":"PreOrder(address,address,address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256)","76190f8f":"isSiringClockAuction()","76192200":"finishMinting(address)","7619317b":"redemptionWallet()","76196c88":"setDnsrr(bytes32,bytes)","76197591":"finalizedICO()","7619d22e":"LEGAL_EXPENSES_2_TOKENS()","761a832f":"setBaseRewards(uint256,uint256)","761aef78":"BuyTicket()","761b59ac":"crabPartDataFromGene(uint256)","761ba894":"getPremiumMultiplier()","761bb70a":"train3(uint256,uint256)","761c1cf9":"SetupGWT(string,string,uint256,uint256,uint256,address,address,uint256)","761c3688":"remark2()","761c4524":"SHARE_TEAM()","761c7cfe":"resolveChallenge(uint256)","761d9e68":"getUserPolicy(address)","761dc416":"Megaton()","761e0d2d":"DEFAULT_MINING_BIT()","761e64c4":"setPI_edit_31(string)","761fe6fe":"totalAmountsBetStage1(uint256)","76207a5b":"getOrderInfo(bool,uint256,uint256)","7620a65b":"Publisher()","7620f4bb":"fipsNotaryLegacy68b4()","76227f3b":"burnAdminAmount(uint256)","76235b49":"getUUIDS(bytes32)","76247776":"getDirectory()","762506b6":"lrs(uint256)","7625391a":"distribute(uint256,uint256)","762549e0":"minThresholdUnits()","76266ce9":"logResources()","76271346":"_parent(uint8)","76278e7b":"limitDatePresale()","7627c9ad":"grantTransferRight(address)","7627e941":"validateOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes,uint8,bytes32,bytes32)","76285b5b":"_is360thDay()","76289f71":"setMasterAddress2(address)","7628e728":"PRE_ICO_TILL()","7629cca0":"ContractDisabled()","762a4f35":"updateClosingTime(uint256)","762a66a2":"getAuction(address,uint256)","762ac19d":"startICOPhaseOne()","762c38fd":"askQuestion(uint256,string,address,uint32,uint32,uint256)","762c7ab2":"setPercentForHelpCoin(uint256)","762ced87":"prcntRate()","762d739a":"vigencia()","762e3816":"TOURNAMENT_WALLET()","762ede1e":"ETHCONEarlyBirdToken()","762fdc0c":"getRatePlan(uint256,uint256)","762ffc42":"VanityReserved(address,string)","76305a89":"CoinCrowdICO(address,uint256,uint256)","763091ff":"initCreator(uint256)","76309e70":"CTT()","7630ad34":"getInfoD(uint256)","76319190":"removeSupportedToken(address)","76323253":"createRounds(uint256)","76324597":"dropStart()","763250e1":"GizerToken()","763265de":"setMaxCap(uint256)","7632b18b":"WICCrowdsale(address,uint256,uint256,uint256,address,address)","76338028":"functionCalls(bytes32)","763430b8":"mFUNDING_SALE_TIMESTAMP()","7634d45d":"titlesSold(address)","7634ecc0":"debitEqually(address[],uint256)","7634ed39":"saveNewAnchor(bytes32)","763542ce":"BucketBuy(bytes32,uint256,address,uint256)","7635761b":"getusersCount()","7635e1de":"changeTokenManager(address)","7635e409":"createZombie(uint8,bytes32,uint16,bool,address)","763730bd":"whitelistAddresses(address[],uint256,bool)","76375c5c":"splitterContract(address,uint256)","763770d2":"getTokensManual(address,address)","7637a12e":"GoldmintMigration(address,address)","7637da03":"MINER_STARTING_PRICE()","76385f2a":"PeriodOfAccount(address,uint256)","76389260":"EthlanceSearchFreelancers(address)","76390144":"getCorrectedStats(uint256)","76399bc6":"getFoundtionAddres()","763a6390":"setWeightLostPartLimit(uint8)","763a666a":"withdrawLiquidityPoolTokens(address,uint256)","763a738c":"allNames()","763ac589":"createStake(address,address,uint256,uint256,bytes)","763add8f":"KPCS(address)","763b144e":"EmpireCrowdsale(uint256,uint256,address,uint256,uint256,uint256)","763cbde0":"_addPassportLogic(string,address)","763cf9aa":"feed100(uint256)","763d2500":"getTotalNbOwners(uint256)","763e29ad":"CherishToken()","763f337e":"setAllowReferral(bool)","763f4011":"mintMarketing(address,uint256)","763fd2ab":"TOTAL_PRESALE_TOKENS()","763ffcec":"setupDisbursement(address,uint256,uint256)","7640304d":"_lastSnapshotId(address)","76405122":"buyImplementation(address,bytes32,uint256,uint8,bytes32,bytes32)","76418809":"private_withdrawBankFunds(address)","7641a8c6":"SetFinalBlock(uint256)","7641e6f3":"burn(uint256,string)","76421887":"OWNER_LOCK_BLOCKS()","7642249c":"mintadd()","76429844":"MultiSendToken()","7642dc0f":"calcVesting(address)","764300bf":"ALLOC_MARKETING()","764358e6":"logSweep(address,address,uint256)","764423a4":"buyerAddressTransfer(uint256,address,address,address)","764499e5":"GamePlayed(bytes32,bytes32)","7644d361":"hashMessage(string,string,string,uint16,string)","7644ecbf":"BallotO(address[],uint256[])","76456887":"startSecondPhase()","76466d42":"setAllowedContract(address,address)","7648c929":"returnRemainingEther()","7648f99b":"ProposalSubmitted(uint256,uint256,address,uint256,uint256,string,address,uint256,uint256)","764912ef":"totalTokenCount()","76495ce7":"tokensFor1EthP4()","76496e34":"earlyCommunitySupply()","764ab11b":"WalletV2(address,address)","764b08c3":"STATS_SIZE()","764c499b":"contract_terminated()","764c6dd3":"voteToFreeze(address)","764c86bd":"totalDistanceRun()","764c8e54":"depositBoth(uint256)","764c92f2":"trustedOrderTransfer(address,address,uint256)","764c98c1":"getIntArrayDynamic()","764c9d32":"sleepContract()","764d1e04":"getFreelancerParams()","764d9969":"XubiToken()","764e50eb":"priceUpdated(uint256,uint256,string)","764e5cd9":"getSkills(address,uint256)","764e971f":"add(uint256,bytes32)","764ea3fe":"walletEhterCrowdsale()","764f3aa8":"getTokenBalances(address)","764fe7d1":"totalMiners()","76520713":"setLock(string,bool)","7652ce3b":"getRoot(uint64,bytes)","7653740f":"addCbAddress(address,bytes1,bytes)","765388ae":"createCrab(uint256,uint256,uint256,uint256,bool)","7653d31c":"_clearQueue()","7653f795":"CarTaxiIco(address,address)","7655e825":"unsafeWriteUint8(uint256,uint8)","765718d7":"register(uint256,bytes)","76577eae":"distributeEarnings()","76586bcb":"doWithdrawal(address,uint256)","76587847":"buyDepots(uint256)","76587921":"transferFromWithNarrative(address,address,uint256,string)","7658c574":"setQuantityFactor(uint256)","7658d5ef":"totalICO()","76596a1a":"hasTeamMember(address)","7659de23":"snapshotBlockHeight()","7659fd71":"BitcoinProtocol()","765aa39e":"startMulti()","765af8bf":"getNumArtworksXType()","765b59d2":"getStatus(uint256,address,address)","765b8dee":"transferStep2(address)","765bfac6":"setEscuela(uint256)","765c9c7f":"bionic()","765dd7a0":"addTeamAddress(address)","765e0159":"getNext(address)","765f09f2":"GetCurrencyInformation(uint256)","7660473a":"EconomyTaxed(string,string,string,string,string)","7661129e":"updatePromoEthCommission(uint256)","76617156":"burnAmountAllowed(address)","7662850d":"init(uint256,uint256,uint256,uint256)","7662c9a7":"GetAskSeries(address)","7663265c":"_setGameSettings()","76636e73":"PREICO_BONUS()","76637dcd":"WhoIsTheContractMaster()","7663f171":"getCardIndexOfOwner(address,address)","7663f228":"testBurnThis()","7663f822":"exists(address,address)","76640648":"payforRefund()","7665f6a7":"setTransferOwnership(bool)","7666ee8f":"addCustomerToRegistry(address)","76671808":"currentEpoch()","766719f0":"optInXferGas()","766954b4":"hashString(string)","7669c0c4":"showPhaseCount()","766a3f2e":"Security_ConnectBankAccountToNewOwnerAddress(uint32,string)","766b0823":"addWhiteBackersByList(address[])","766b1818":"PYCToken()","766bd930":"Duanwu()","766d30aa":"setDefaultRecommAddr(address)","766d5235":"isOpening()","766d8365":"resetRoundStartTime(uint256)","766e33f4":"releaseStart()","766e4f2c":"issueTokensToUser(address,uint256)","766e866c":"setMaxGasRefund(uint256)","766e8b27":"tokensaleTokensPerEtherNow()","76703ef1":"AVIU()","767180d0":"impl_purchase(address,bool,bool)","767392b3":"equal(bool,bool,string)","7673faf0":"wallet4()","76740de0":"isPlayer()","767418b0":"alterBalance(uint256)","76745dbb":"increaseTotalStake(uint256)","76748f2a":"default_price()","7674cee3":"paymentMin()","76753b04":"ledgerUserBetContribution(address)","76775c10":"addReferrer(address,uint256)","76779829":"randomC()","767800de":"addr()","7678369a":"dayfund(address)","7678473d":"BTCDOGE(uint256)","7678f8bb":"getBid(int256)","76793f47":"kwhFund()","7679a816":"handleFund()","767a11ca":"verifiedAttributes(address)","767a99ee":"legalContract()","767b6190":"constructor(uint256)","767b79ed":"register(string,uint8)","767bc136":"cards_titanium_total()","767bcab5":"setRandomizer(address)","767c732e":"enterBidForCollectible(uint256,uint256,int256)","767c9d18":"getMigrateInAttoTokensValue()","767d65ba":"ASEChain()","767eb651":"getRemainingAmount(address,address)","767eb8ad":"isValidName(bytes16)","767f0215":"MAIN_SALE_BONUS_PERCENTAGE_PHASE3()","767f61ac":"putTitle(bytes32,string,bytes32,bytes32,bool,string)","767f7b01":"User(string,address)","767fa723":"getPresaleInfo()","767fb1c4":"RecoverableController(address,address,uint256,uint256)","76809973":"BeneficiaryChanged(address,address)","76809ce3":"decimal()","76814692":"BusToken()","76823637":"startNewTurn()","768255ca":"TokitRegistry(address)","7682e6ff":"getTrustSetting(address)","768356c1":"TUI_ADDRESS()","768433c2":"topFab()","76849376":"addNode(bytes32,address)","768549aa":"KpopItem()","76855764":"enableSudo(bool)","76858faf":"ViralToken()","7685e1df":"NPTToken(address)","7686136a":"updateCourseRate(address,uint256)","76865eea":"unHalt()","7686cea9":"etap()","76884153":"AirTransfer(address[],uint256,address)","76888a3e":"TheTokenF()","76890c58":"transferOut(address,uint256)","76894bd9":"tokensToEthereum(uint256,uint256)","76897b90":"setReserved(uint8,uint8)","768a3326":"myxTest()","768a3a7d":"GetSender()","768afcec":"buyKeys(uint256,string,string)","768b4ce0":"updateWorldScore(uint256,uint256)","768bd5cd":"THULYA()","768c326d":"validatePhaseDates(uint256,uint256)","768c9af4":"Approval(address,address,bytes32,bool)","768e7220":"ownerLockedBalance()","768f930d":"checkSignersByAddress(bytes32,uint256,uint256,uint256)","76907bc7":"setCoinBalance(address,uint256)","7690bee4":"NextGenHyip()","7690ed70":"_changeLockDate(uint256)","7691471c":"PRE_SALE_TOKEN_CAP()","76917b68":"updateMC(uint256)","76918f5d":"setAdPriceMultiple(uint256)","76922f78":"auctusPreSaleAddress()","7692ac94":"createEtherMonster(uint256,uint256,uint256)","7692ba9a":"claimOwnership(string,string,uint256,uint256)","7692c4d8":"testCantFinalizeNotEndedSale()","7693488b":"finalizeTokenSale()","76937a3f":"airDropCustom(address[],uint256[])","7694df16":"scaledRemainder()","76959b6a":"hasSDC(address,address,uint256)","7695be1d":"DaleOR()","7695d79b":"nftTokenCount()","769643bc":"reclaimTokenOwnership()","76965867":"getStakedBalance()","7696c042":"secondsPerMonth()","7696cf52":"bonusFirstWeekPeriod()","7696f0db":"frozenCellCount(address)","769794dd":"TildeCoin()","769796fe":"resetAction(uint256)","76992d7c":"SettingsChanged(uint256,uint256,uint8,uint8,uint8,uint8,bool)","769988b3":"p_update_mEmpireScoreMultiplier(uint256)","76999896":"KingOfTheEtherThrone()","769af180":"EGGS_TO_HATCH_1BAT()","769bf742":"unregisterRecord(bytes32)","769c9226":"setLockAll(bool)","769db61d":"addNewCard(uint256)","769dc523":"GetCategoryNumber(bytes4)","769e86cd":"getMyAccountBalance()","769edf6a":"createHash(uint256,address)","769f194f":"FOUNDERS_TOKENS_VESTED_2()","769ffb7d":"setDirectMintAgent(address)","76a04af5":"CompensateChips(address,uint32[])","76a133ca":"KabirTestToken2()","76a24f25":"originalPrice()","76a25c5c":"calculateReward(uint256,uint256,uint8)","76a310a5":"addAuction(uint32,uint256,uint256,uint8,uint32)","76a327fc":"hitMobster(uint256,uint256)","76a3f9c9":"addToWinningsArray(uint256,address)","76a43abc":"_createPony(uint256,uint256,uint256,uint256,address,uint16)","76a4a44d":"AssignGGEPoolOwner(address)","76a54c60":"sendEth(address)","76a5b431":"removeTip(address,bytes32)","76a5b5b9":"LogTransfer(address,address,uint256,bytes)","76a64cbf":"BasicToken(string,string,uint256,uint256)","76a6676a":"IssuerTransferred(uint256,address)","76a67a51":"pause(address)","76a684de":"denyAllowanceProxyAccess(address)","76a6bf52":"isExecuted(uint256)","76a766f7":"Dashgold()","76a85d54":"setExchangePrice(int256)","76a8bc10":"setExpiry(address,uint256)","76aa2f74":"increaseJackpot()","76aad651":"paymentSupply()","76ab5ea6":"changeDifficultyAndPrice(uint256,uint256)","76aba714":"refundMany(uint256,uint256)","76abc03b":"getShareDistribution(uint256)","76ac2323":"WinkSale(uint256,uint256,uint256,address)","76acb5e8":"BuyTicket(uint256)","76acb968":"TESTTOKEN1()","76ad3abf":"unregisterTraderAccount(address)","76ae684d":"setSaleOngoing(bool)","76aed2e1":"getTokenType(uint256)","76aef5e0":"doubleSend(uint256,address)","76af7837":"Loss(address,uint8,uint256)","76af9a1a":"balancePreSale4()","76b07186":"isPass(address)","76b088a9":"check_lock(address,address)","76b1514f":"getMaxFreeTeams()","76b15836":"changeStatusModerator(address,bool)","76b18618":"changeUnitsOneEthCanBuy(uint256)","76b1f3d3":"grantAccessToAddress(address)","76b3131e":"createvillage()","76b33367":"refundsIssued()","76b34d2f":"changeCrowdsale(bool)","76b39cf9":"activateInTestMode()","76b3c8a8":"getLotteryInfo(uint256)","76b547b8":"AthaYOGAToken(address,address)","76b5d926":"unreserve(uint256)","76b63576":"mintFounderTokens()","76b69d77":"apiRegistryContractAddress()","76b707b7":"getRelease()","76b95761":"setVestingStartDateTime(uint256)","76ba242c":"bonusTokens()","76ba6009":"approveRequest(bytes32)","76babef7":"Puzzled(address,bytes32,bytes32)","76bc21d9":"fireEventLog2Anonym()","76bc522c":"getZIndex(uint16)","76bd28bf":"ORNETCOIN()","76bd4220":"depositBank()","76bd4d2d":"submitProblem(uint256)","76bd5f3c":"changeMintedCappedIdx(address)","76be0b89":"HIROTOKEN()","76be166c":"toAsciiString()","76be6c24":"mintLVE(address,uint256,uint256)","76bef6b4":"getOneByOneRootHash(uint256)","76bf2392":"getCurrentDisplacement()","76bf8044":"pledge(bytes32)","76bf9f57":"wildcardCount()","76bfa5f6":"ProvideSale(address,address)","76bfba56":"depositForDividend(uint256)","76c158cf":"minBankerEther()","76c2c0aa":"oresLeft()","76c2c296":"SYSTEM_CREATION_LIMIT()","76c2f9e7":"HitToken(string,string,uint8,uint256,address,address,address,address)","76c30794":"mint0(address,uint256)","76c390fe":"Display()","76c3b445":"calculateTotalTokenPerContribution(uint256)","76c44a80":"openIEOStarted()","76c46a70":"changeUnitUserBalanceLimit(uint256)","76c6c685":"assertItDoesntThrow(string)","76c6dc8b":"isPosBitOne(uint256,uint256)","76c6fc9a":"checkOwnerShare(address)","76c70431":"CRCToken()","76c75958":"startCrowdsale(uint256,uint256,uint256,address)","76c7a3c7":"MIN_FEE()","76c7b434":"developersCut()","76c7fc55":"removeBorrower(address)","76c82e92":"minAcceptedAmountPresale()","76c87548":"scoreBracket(address)","76ca0225":"initTwo(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","76ca0c77":"scheduleCall(address,bytes,uint256,bytes,uint256)","76ca9e48":"indexPaidBonus()","76cb69e9":"KOIN(uint256,string,uint8,string)","76cb6f9b":"removeOffChainAddress(address,address)","76cba420":"stcOrginalBuy(uint256)","76cc1c5c":"landManagement()","76ccb1fe":"getSpinOutput(uint256,address,uint256)","76cce072":"setBlance(address,address,uint256)","76ccf063":"calSimpleRoom(uint256,uint256,uint256,bytes32)","76cd005d":"distillGodOwner()","76cd470c":"getCurrentAccountingPeriodId()","76cd7cbc":"sign(bytes)","76cd940e":"currentBatch()","76cdb03b":"bank()","76cfc366":"depositOffchain(address,uint256,uint256,bytes)","76d06add":"issueTokensWithCustomBonus(address,uint256,uint256,uint256)","76d0998f":"Odin2(address)","76d173a9":"addressAndBalance(address)","76d1d35e":"numberOwners()","76d260bb":"setInitialVaribles(address,address)","76d2d717":"GetFreeTokens()","76d33951":"bid(string,address)","76d380cb":"IrisTokenPrivatSale()","76d438b0":"sendReward(uint256,uint256)","76d47bf5":"unlockAddress(address,address)","76d57aad":"amountInLock(address,uint256)","76d57ad3":"getMixerInfo(bytes32,uint256)","76d60a91":"TokensMinted(address,uint256,uint8)","76d66f5d":"_Transfer(address,address,bytes32)","76d690bb":"BountyList()","76d6c296":"getPresale1()","76d6da67":"TokenMintingEnabled(address,bool)","76d738d9":"DAZToken()","76d75952":"getLabelType()","76d76b9d":"marketRegisterCost()","76d83cb3":"getTerminalCount()","76d865dd":"addAdminOwners(address,string,string)","76d8f03e":"getBonusCount()","76d92428":"setGatekeeperAddress(address)","76da5667":"admin_kill()","76dad223":"showNumber()","76db2e84":"setMinimumEtherAmount(uint256)","76db6c8d":"isRedeemable(address)","76db76f1":"clearNextPrizeTime()","76db7fd4":"setExchangeFlag(bool)","76db9b14":"CXTCContract()","76dbd108":"calculateProof(string)","76dc4c0a":"isFundRequestToken()","76dc6643":"threeHotHoursCapInWei()","76dc74cb":"sendHoldComisions()","76dc76e7":"getUserNumbersOnToken(address,uint256)","76dc97d9":"_saveMessage(uint256,uint256,address,string)","76dd1f86":"totalMintLimit()","76ddfc39":"MIN_HARD_CAP()","76de03d0":"weiTotalRefunded()","76de1684":"generateOrderByMerchantWithPayee(address,address,uint256,string,string,string)","76dffa4e":"MedCann()","76e00ed7":"_fromNanoNIL(uint256)","76e0f978":"navAdmin()","76e20e53":"getMyBets(uint256)","76e277c1":"ChickenFarm()","76e29114":"nfsPoolCount()","76e2bbc7":"paymentInternal(bytes32,uint256[])","76e403ec":"balancesLocked1Y(address)","76e40c9c":"lendEther()","76e44ed8":"lockAll()","76e4660c":"getSumAmountOfDisputedStepsProPatient()","76e4ca0d":"voteQuorum(uint256,bool)","76e4f921":"parachute()","76e51e96":"TokenModuleManager()","76e53221":"participationCaps(address)","76e55338":"mytest()","76e57d4b":"withdrawalAddressFixed()","76e5c0ca":"WineryOperations()","76e608c7":"buyExistFactory(uint256)","76e6d2b4":"unLock(address)","76e6dbc7":"tokenBaseRate()","76e702ee":"tokenDeliveryDue()","76e71dd8":"delegateTotalSupply()","76e7430e":"finally(address)","76e75e05":"getPurchaseRecord(address)","76e7b151":"GOFCoin(uint256)","76e83bcb":"listModule(uint256,bytes32,bytes32,string,bytes4)","76e92559":"totalMembers()","76e93db5":"totalMaxBuy()","76e9d4fb":"Hybrid(uint256,string,uint8,string)","76ea1c6a":"BuyOnSecondaryMarket(uint32)","76ea430a":"STAGE1_TIME_END()","76ea909d":"indSale()","76eaef99":"CatOffered(uint256,uint256,address)","76eb5ce0":"END_PREICO_TIMESTAMP()","76ec477d":"cancelGame(uint256,string,uint256)","76edb1b5":"ReleaseUpdate(uint256,uint256,uint256,string)","76edc29d":"TelegramOpenNetwork()","76ee2d68":"lokedMint(address,uint256,uint256)","76ee3a87":"mainICOStartTime()","76ef5d14":"divX(uint256)","76f10ad0":"getSnapshot(uint256)","76f14c98":"personalizeSquare(uint256,bytes,string,string)","76f187ab":"tokensTransferredToHold()","76f1dbd4":"Authenticate(address)","76f28a4f":"setMarket1(address)","76f2a59a":"instantMint(address,uint256)","76f30ca1":"toContentID(address,uint256,string,bytes)","76f31513":"decreseApproval(address,uint256)","76f3264b":"getProviderSupply(uint256,uint256)","76f36dec":"ETHC(uint256,string,uint8,string)","76f39b28":"SetMaxAllowedBetInTokens(uint256)","76f4d8ad":"exchangePlayerTokenCount()","76f6218a":"promoBonus()","76f660f6":"batchTransferFrom(address,address[],uint256)","76f6de69":"RTCCOINERC20(uint256,string,string)","76f70900":"oraclesCount()","76f75e7f":"orderList(uint256)","76f7c522":"hasOneStepWithdraw()","76f86e18":"order_buy(address,uint256)","76f88781":"pow2Constant()","76f9378d":"getWords(uint256)","76f95818":"stopFlagOn()","76f9b8d9":"getTokenInfoSignatures()","76f9e018":"greedIsGood(address,uint256)","76f9fd38":"castVote(string,uint16)","76fb7c72":"setAllowedAgentsForOtherSource(address,bool)","76fc53c0":"extDistributeBondFund()","76fd7951":"MacoTestCoin()","76fd7b11":"requestWeiPrice(string)","76fe192a":"forceResetPeriod()","76fe3efa":"itemNameAddress(uint256)","76fe47eb":"returnBooleanInverted(bool)","76fe8228":"getHorseSex(uint256)","76fede7a":"get_term_deposit_end_date(address)","76fee774":"getNewPetCard(uint8)","76fee8e0":"MineBlocksAddr()","76ff1d24":"MailhustleCrowdsale()","76ff87cc":"VYRAL_REWARDS()","76ffb887":"failure()","77002fcf":"getBadge(bytes32)","77009c5c":"EYCryptoTradingGOLD()","7701c52d":"withdrawMarginPreSignedHashing(address,address,uint256,uint256,uint256,uint256)","7701f361":"test_newProposalAndNotEnoughVotes()","7702b8e4":"confirmOneSell()","770342ee":"ChannelClosed(address,uint256)","7704533d":"arbitrationWallet()","77049457":"median()","770506c1":"withdrawMobileAppCoin(address)","7705b6f4":"claimBoard(uint256[81])","7706390b":"handover(uint256,address)","77073437":"alicoinToken()","77076855":"isInOpenMakeOrder(address)","77079f55":"YohoToken()","7707c69a":"set_sale_owner(address,address,bool)","7707e2b2":"withdrawHoldVault(uint256)","770850c8":"accountIndexOf(address)","770864ad":"addOpenMakeOrder(address,address,uint256)","77086d94":"addSpaces(uint256[],uint256[],bytes)","7708b441":"founderWithdrawablePhase2()","7708e321":"setaddress(address,address)","7708e43b":"getNumBets(uint256)","7708ea1d":"ROLE_CEO()","77097bfa":"testerReentrant()","77097fc8":"mint(uint256,string)","7709bc78":"contractExists(address)","7709c0d3":"setMaxWhitelists(uint256)","770ae2af":"setMinAllowedBetInEth(uint256)","770b210e":"canBuyLimit()","770b5414":"getCurrentData()","770b80b6":"returnBalanseToTarget()","770b8aab":"RecoveryModeActivated()","770bb9ae":"_createDrawings(bytes32,bytes32,address,string)","770c59b8":"purchaseParrot(uint256)","770c6bde":"removeItemLendingList(address,uint256)","770c6cbb":"WithDrawPreForkChildDAO()","770cde1b":"ContractExample(string)","770d64c6":"LogLate(address,uint256,uint256)","770d6591":"_setArmorValue8(uint256)","770d8e79":"ADDR_TKG_TEAM()","770e3106":"getAccountsCount()","770e9e85":"takeTheTorch(address)","770eaebe":"Send_Data(address,uint16)","770eb5bb":"set_label(bytes12,bytes32)","770f75b7":"fireCancelProposalEvent(address,uint256)","770f9feb":"clyckterium()","770fe154":"ApplyVote()","77109b05":"depositEther(address[2],uint256[7],uint8,bytes32[2])","7710f29f":"setupPeriodForICO(uint256,uint256)","77115c9d":"seedRoundEndTime()","771282f6":"currentSupply()","77129790":"Crowdsale(address,address,uint256,uint256,uint256)","7712acd2":"getABname(uint256)","7712c870":"slammerTime()","7713b431":"getContactsLength()","7713ba04":"setPI_edit_11(string)","77146255":"_nextTokenId(uint256)","771548e2":"moveAccount(bytes32,bytes32)","771602f7":"add(uint256,uint256)","77169fbd":"gainsOfVault(uint256,address)","7717403b":"ALLOC_CROWDSALE()","7718238f":"addFee(address,uint256)","7718ce93":"player5()","7719f57e":"Seedex420(uint256,string,uint8,string)","771a2af4":"getCitationRecordsLength(string)","771a3a1d":"taxRate()","771acf31":"fluffyCatCut()","771ad078":"BuyGenesis(address,address)","771ad635":"getContentCred(address,uint256)","771c04ae":"ARCToken(address,uint256,uint256)","771c288b":"next_stone_id()","771c3ec7":"setVendingAttachedState(uint256,uint256)","771c7ad1":"hotwalletAddress()","771cbe3d":"_mintCard(uint8,address)","771ce552":"readownerXname(string)","771d7b47":"finishedMigration()","771d9d05":"ecosystemAllocated()","771e4326":"wingsETHRewards()","771eee16":"freezeToken(bool)","771feb74":"getPrecious(uint256)","771ff086":"allocatenonCSTokens(address,uint256)","7720295a":"STARTING_CLAIM_PRICE_WEI()","7720e74c":"changeSaleEnd(uint256,uint256)","77215c8d":"getObserverCount()","772199a1":"getJob(address,uint256)","77226237":"isCompetitionAllowed(address)","77228659":"query2(uint256,string,string,string)","7722d01f":"TokenChanger(address,address)","77231e6c":"tokens_sold()","77233e90":"setTo(address)","7723e2f3":"ArtToken()","77241a5f":"makerDaoContract()","77248e3d":"claimReservedTokens()","7724bdbf":"setStatusInternal(address,uint8)","772506bb":"jackpotFraction()","77253984":"DPToken(uint256,string,string)","7725686f":"thawGlobalTransfers()","7726a59a":"WINNER_COUNTRY_CODE()","7726bed3":"setEnable(bool)","7727c9ad":"changeMinStake(bytes32,uint256)","77282b70":"polymathRegistry()","7728579a":"isIcoFinalized()","77287520":"donate(string,address,string,int256)","77289b50":"setMedium(uint8)","7728c75a":"LoanRepaid(address,address,uint256,string)","7728f48b":"destroyRobot(uint256)","772a3835":"customerExchangeFiat(uint256,address,string)","772b7a73":"getTxOrigMcwTransfer(bytes32)","772bcc79":"DexAgeTest()","772c1863":"increaseStellarBalance(uint256)","772c658b":"getVIPBounusRate(address)","772cb26b":"isStringEq(string,string)","772e6f03":"votingProposal(string,bytes32,uint256)","772fdcb1":"isContributorInLists(address)","77300338":"setActiveTimes(uint256[],uint256[])","773041ce":"setInvestor(address)","77312cdc":"setMultiETH(address[],uint256[])","773183e3":"buyEmptyLocation(uint256)","7731cd2a":"Acc(address)","7732b2a4":"getNextCrystalReward(address)","7732b322":"PinMoCrown()","773355bf":"script(bytes)","77337d37":"tstart()","7733f24f":"ratePreSaleStage()","77343408":"setURL(string)","7734da3c":"NewPassContractor(address,address,address,address)","7734e398":"setFirstBonus(uint256)","773531f3":"tokenOwnerBurner()","77364291":"taskInfo(uint256)","773721b3":"receivedCWCreturn(address,uint256)","77372213":"setName(bytes32,string)","77381082":"Virtonomi()","77390f8b":"_envelopes(string,address)","773984dd":"closeIt()","7739ad70":"markAsScam(address)","773a1154":"generateRandomNumber()","773a8597":"HashTokenAward(uint256,string,string)","773adc70":"getAllowedStepAmount()","773b5b5e":"maxUpdates()","773b82a3":"addPerson(bytes32,bytes32,uint256)","773b90db":"_lotteryCardNoSend(uint256)","773c3f50":"DPPToken()","773c5049":"solvency()","773c84ee":"exec(address,bytes,uint256,uint256)","773d33f5":"transferAndCallback(address,uint256,bytes)","773da57d":"DGZTokensWithdraw(address,uint256)","773dcb98":"startTransfers()","773dfb86":"_extendRound()","773e04a9":"log2Ceiling(int256)","773e1e84":"fight(uint32,uint16)","773e236b":"createLockbox(string,address,uint256,uint256,string,string,string,address[],string)","773e8b0f":"testDAO()","773ee5a3":"execute_transfer()","773eef36":"stopRefund()","773ef1cf":"saleOn()","773ef38e":"PRICE_RATE_SECOND()","773f4873":"Ecopay()","773f5edc":"guess(uint256,string)","773f7665":"processVIPBenefit(address,uint256)","773ff502":"LogMake(bytes32,bytes32,address,address,address,uint128,uint128,uint64)","7740f667":"mtStartTime()","77410c03":"adminLockdown()","774120fa":"merge(address)","77413267":"getAuctionByTokenId(uint256)","774190dd":"showUserPoolAddresses(address)","7741ad4e":"play_game(uint8)","7741b4ec":"RandomNumberFromSeed(uint256)","7741fc52":"LottoCount()","7742ede4":"IMARK()","77439e8b":"doYourThing(address,address)","77446767":"destinationOf(uint256,uint256)","77453df7":"Ex()","7745d3b1":"getUsername(address,address)","7746167f":"transferBlockValueToBattleValue(uint16,uint256)","77463b50":"getEggsToHatchDragon()","77467197":"tokensVested()","774685c7":"CPO_SHARE()","77469275":"getLegacyRepToken()","77472b6f":"minEtherCap()","7747c993":"competition(uint256)","77482b18":"getDeveloperFee()","7748b07e":"usersNTD(address)","7749d667":"getIncreaseTime(uint256)","7749e693":"setCategory(uint256,uint256,bytes32)","774a63a5":"CDSToken()","774a97cf":"getCurrentTapAmount()","774b71d6":"TokenPriceProposalSet(uint256,uint256,uint256)","774bafdf":"unlockMe()","774dba58":"playHome()","774e88dc":"hasUnlockDatePassed()","774eb322":"close(string,bytes32,uint8,bytes32,bytes32)","774f787a":"ShitsToken()","77507425":"buyerFunded(bool,address)","7750b2b1":"__setDeadline(uint256)","775146c3":"request(bytes32,uint256)","77517765":"getTotalActiveStake(uint256)","7752182b":"AddReserveToNetwork(address,bool)","77524af9":"wethTransfer(address,uint256)","775274a1":"requestRefund(bytes32)","77532fa8":"TotalClosedDeposits()","7753ec49":"in_registration_phase()","77542194":"setTokenTransferStatus(bool)","7754305c":"getURI()","7754ec29":"WinCoin()","7755a0f5":"ResolutionProposalSubmitted(uint256,uint256,address,string,string)","7756c908":"transferLocked(address,uint256)","7757fc5d":"withdrawalOpen()","7758bf86":"maxBridgeWidth()","7758c4f8":"quickBuy(uint256)","7758d407":"nextCommonTTWTokenId2()","775915ce":"stepTwoEndTime()","77598626":"TZCoin()","77599026":"calculateYourValue2(uint256)","775a25e3":"getTotal()","775a8f5e":"toBytes(uint256)","775ad527":"allow(address,address)","775af9df":"MiningRigFarmer()","775b9c13":"setWhiteList(address[])","775c300c":"deploy()","775c46cd":"startFunding(uint256,uint256)","775dec49":"keccak()","775e38f7":"NO_MONSTER()","775eb900":"signed(bytes32)","775ee3ef":"view56()","775f5ec0":"finishRitual(address)","775f731c":"addSomeUETsTo(address,uint256)","775fc127":"operation()","77609a41":"challengeCanBeResolved(bytes32)","7760da7f":"reclaimTokens(uint256)","77610ba2":"setDollar(uint256)","77617a7d":"BuyToyMoney()","776184b1":"test_oneValidEqString()","77620729":"forward(address,address,uint256,bytes,bytes32,bytes)","776247c4":"withdrawEthFromBalance()","77627a1d":"Goutex(uint256,string,uint8,string)","7762df18":"VVDB(address)","7762df25":"potentialOwner()","7762f046":"setContractBridgeAddress(address)","77640f9c":"setClaim(address,bytes32,bytes)","7764d878":"checkstatus()","7764f771":"getBackBNB()","776532de":"Numa()","7765c52c":"getAuctionStatus(uint256)","776676d6":"newRC(uint256,uint256)","77669b2d":"setCompte_33(string)","7767ecc3":"inSdcForAdmin(address,address,uint256,uint256)","7768dec0":"isTokenSale()","77695d39":"getDb(uint256)","77699a06":"reclaimExpiredSwap(bytes32,bytes32)","7769d384":"revokeAndPublish(address,bytes32,bytes32,address)","7769ea0a":"addPool(uint256)","776a038e":"PurchaseToken()","776ab634":"unpauseToken(uint256)","776b37e2":"editCertificate(string,address)","776b6b27":"setRoscaAddress(address)","776bf795":"pieceTransfered(uint256,address,address)","776c3b70":"setNewSalesManager(address)","776d1a01":"setTarget(address)","776d62f6":"costs()","776d89ba":"delPhase(uint256)","776dba67":"VioRewardERC20Token()","776df027":"testFailDisownNotOwner()","776e7fc1":"checkRedbullQuest(address)","776f3b99":"burnByPercentage(uint8,uint8)","776f9663":"PeerBet()","776fd7ce":"setEscrowTransfer(address,uint256,uint256,bool)","77703d29":"getBuyOrder(uint80)","7770bd15":"crowdSale()","777256c4":"Greeter()","77725b88":"SetFFSettings(address,address,uint256,uint256)","7772a380":"isInGeneration(address,uint256)","7772ba07":"setDelays(uint256,uint256)","77738ce7":"fundAccount(address,uint256,uint256)","7774c394":"isNecromancer(uint256)","7774d64c":"testCreateOrder()","7774e950":"createUnit(uint256)","7775eec9":"getCompte_29()","7776466c":"preSaleToken()","777665b8":"transferTOKENtoProviders(address,address,uint256,address,uint256)","77773d90":"amountOfTokensPerEther()","7777789f":"_mint(address,uint256,uint256[])","7777d088":"lotteryTokensPercent()","777850f9":"payAfter(address,uint256)","77790081":"updateMaritalStatus(string)","777955b1":"updateReferralGu(uint256)","7779b0e4":"_buyTokens(uint256,uint8,address,address)","777a5dc5":"explodePhoenix(uint256)","777ab367":"mk_contract_address(address,uint256)","777ac349":"totalWins()","777ac522":"_createTree(string,string,uint256)","777aff7d":"updateHistory(address,uint256)","777b4547":"ICO(address,address,address)","777c1bb2":"eosLITE(uint256,uint256)","777c658f":"getTotalDonations()","777dff4a":"transferCTO(address)","777e479d":"getRoundBlockNumber(uint256)","777e6b1c":"getEntitledFunds()","777e82ca":"BookERC20EthV1p1()","777e940c":"excessRefund(address,uint256)","777ecb74":"LogPaused()","777eceb8":"tokensForOneEther()","777f942d":"changeMinStake(address,bytes32,uint256)","777feff5":"getCertificationDbAtIndex(uint256)","7780ae85":"desimls()","77810380":"getRegistrationToken()","77818808":"Electrium()","7781eafa":"considerPerseus(uint256)","77826b0c":"setMaxReceiveEther(uint256)","778317c4":"setWinLossAmount(uint256,uint256)","77838c63":"distributedToOwner(uint256)","7783c06b":"newArt(string,string)","7785859f":"altCapitalization()","7785954b":"produceRandom(uint256)","778639cb":"checkValidFighter(address,address)","77863b61":"CrossWhitehatWithdraw(uint256,address)","7786b22d":"ELRUN()","77870bce":"BeatOrgTokenPostSale(address)","7787dfaf":"test_9a_transferShouldBeFalse()","77886028":"setTokensContractAddress(address,address)","7788d126":"REFERRAL_BONUS_LEVEL3()","77895ef4":"listedMonForClass(uint64)","7789f844":"backTokenOwner()","7789fc90":"createBet(bytes32,bytes32,uint256,uint8,uint16,uint16,uint16,uint8,uint256,uint8)","778a56ce":"toggleBurn()","778a5978":"guessNumber(uint16)","778b5aee":"getWalletsCount()","778c2cea":"onlyLocklistedCanDo()","778d00f0":"pushPrivateInvestment(uint256,uint256,address)","778d491e":"wd(uint256)","778e388e":"parseInt_(uint256)","7790a5d2":"Token_5()","77913fbc":"getModuleId(string)","7791dc1f":"AuthEnd()","77921952":"contributorCounter()","77922220":"getRegionProducts(address,uint256,uint256,uint256,uint256,uint256,bool)","77922e57":"batchCancel(address[],uint256[],uint256)","7793868c":"RostToken()","779454ff":"boardAddress()","77952161":"didDepositCollateral(bytes32,address,uint256)","7795820c":"getCommitment(bytes32)","7796fb95":"setSink(address)","7798e525":"countUBetChecks()","779972da":"setLockPeriod(uint256)","779997c3":"bump(bytes32)","779a3611":"makeBet(uint256,uint256,uint256)","779a5a7f":"getContributorByAddress(address)","779ad324":"getIEOId()","779b2e11":"getCurLevelKeyNum()","779b8dc0":"load(bool,address,address,address,address,address)","779beca0":"getNumOfSalesWithSameId(bytes)","779beedf":"registerWallet(address)","779c4a26":"getUserSponsorships(address)","779c9b19":"_emitCategorySet(uint256,uint256,bytes32)","779ce152":"WIN_PERCENT_PER_DISTANCE()","779d2e20":"setLawSupportProfitAddress(address)","779de55d":"paymentsByBenefactor()","779dec5b":"bZRxTokenContract()","779e170d":"isSaleOn()","779e5ad8":"gvOptionToken20()","77a0e875":"destTokensSit()","77a1ec4b":"hodlCountdown()","77a28225":"delegateFromReferral(uint88)","77a28461":"ownerSetupBankrollInterface(address)","77a28fec":"DealCancelRate(uint256)","77a3a0a2":"removeMarketFrom()","77a43129":"publicSellLockEndTime()","77a54b38":"checkForNewStellar(address,uint256)","77a54eb8":"blacklistAddresses(address[])","77a6acfb":"tokenDemo(uint256,string,string,address)","77a6cb64":"TokenEscrow()","77a714ae":"ERC721Token()","77a7354d":"addExperience(string)","77a74a20":"expressingTraits(uint256)","77a7d968":"walletBalances(address,address[])","77a7e6be":"getRefTotal(uint256)","77a8bc86":"untrustedExecuteRuling(uint256)","77a9037b":"updateLastVotedOnParameter(bytes32,address)","77a9e152":"redeemToken(uint256,uint32)","77aaafd2":"interfaceFrozenTransfer(address,address,uint256)","77aad873":"proposeLaborHourToken(address)","77ac3da5":"oraclize_query(uint256,string,string[1],uint256)","77acbb22":"manager2()","77ad619d":"get_commit_no()","77ae6c47":"requestBatchInsatalmentsLoans(uint256,uint128,uint256,uint24,uint40)","77afd7e6":"shitRate()","77b02a33":"getGameLock(address)","77b08df0":"Migrations4()","77b0c751":"getNextPayDay()","77b11de3":"setPlayerHasGetFree(address,address,bool)","77b1788e":"postTrade(bytes32,uint256)","77b19cd5":"getCallBaseGasPrice(bytes32)","77b1b2eb":"MAX_CANVAS_COUNT()","77b1bba6":"ChangeCollector(address)","77b1da93":"crowdSaleClosed()","77b2d590":"_set3()","77b38e2a":"MasternodeDeregistered(address,uint256)","77b440e9":"WALLET_FOUNDATION()","77b4a9c1":"getMakerBalance(address)","77b57073":"sponsorList(address)","77b68dae":"devDivRate()","77b71df0":"stake(int256)","77b74692":"setKYCAddress()","77b76ec3":"checkBalance(address,address)","77b77a4f":"PlatoPresale()","77b7b5f3":"returnCreator(uint256)","77b92c07":"Approve(uint256)","77bad015":"GetMyEgg()","77bb09eb":"addSweeper(address,address)","77bb5e34":"ChillCoin()","77bbc957":"returnReclaimed(uint256,address)","77bbf28a":"createDividend(uint256,uint256,address,uint256)","77bc222c":"_eraseSingleNode(bytes32)","77bc57e7":"Agencies()","77bd1bfe":"ITT(uint256,uint8,string,string)","77bd35fc":"claimPremium(address,uint256)","77bd775c":"setMinPurchaseAmt(uint256)","77bdab19":"OtoniToken()","77bdbccc":"registerCertificate(address)","77bde142":"setTargetBondingRate(uint256)","77bdfcfa":"cards_metal_check(address)","77bf8b91":"CelebSold(uint256,uint256,uint256,string,address,address)","77bf8e6f":"myShare()","77bf96d4":"claimProfitEquivalent()","77bf9776":"stopUpdate()","77bffc9a":"getRemainingStars(address)","77c07c19":"storageControllerAddress()","77c0891f":"setVotingParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","77c13323":"closing_requests(bytes32)","77c2f72e":"LightenToken()","77c2fb9b":"updateMokenName(uint256,string)","77c34ee7":"tokensRemainingIco()","77c427b7":"TemperatureMeasurementB(address,int8,int8)","77c4fd07":"availableEarlyPlayerShares()","77c626e3":"getStageAvailableTokens(uint256)","77c68aa7":"IGTMYR()","77c71396":"charityBeneficiary()","77c76449":"AVAILABLE_IN_MAIN()","77c78df9":"getCurrentLevel()","77c82476":"viewPetition(uint256)","77c846af":"changeUsername(string)","77c8d5a0":"computeTimeBonus()","77c90dd4":"VaporCoin()","77c93662":"sponsor()","77c9dd4b":"iOwner()","77ca4d11":"loadVotesForParticipant(bytes32,bytes32,uint8)","77caa61a":"updateExchangeRates()","77caa7e6":"endICOp2()","77caf711":"transferValue(uint256)","77cb6b7f":"AbccCoinToken()","77cb8edd":"_robot()","77cc437c":"institutionWallet()","77cdd2e5":"icoBtc()","77ce4fd1":"changeBlocksToExpire(uint256)","77ce52f8":"totalInfo()","77ce9bdd":"createPersonalDepositAddress(bytes32)","77cebd89":"isAllowedToBuy(bytes32)","77ceded8":"mintGrey(int256,address,uint256)","77cf0369":"totalPreICOavailibleWithBonus()","77cfe1c1":"isValid(string,address,uint256)","77cff22d":"init(address,address,uint256,uint256)","77d1f95d":"AntCoin()","77d223b2":"setLowestClaim(uint256,uint256)","77d2f203":"neg(uint256)","77d317d0":"destroy(uint256,string)","77d32e94":"ecrecovery(bytes32,bytes)","77d3550b":"commissionPercent()","77d447d6":"ContractorManagerSet(address)","77d4c48b":"arr(address)","77d4e5bc":"secondTimeLine()","77d555b7":"RateSetterChanged(address,address)","77d55755":"getMiningReward(bytes32)","77d56a04":"getReserveBalances()","77d58f21":"_safeContract(address,address,address,uint256,bytes)","77d630ae":"activationFee()","77d6a880":"saleOrNot()","77d6cfeb":"setGoalReached()","77d70b1f":"jackpots()","77d79d10":"getGame(uint8)","77d821a2":"testOnlyMultisigCanDeployANT()","77d83b81":"confirmGetFreeQuest(address)","77d89406":"bankerFeeDataRecord(address,uint256,uint256)","77d8ffc0":"getTokensFromBuy(address)","77d99ef5":"createBattleboard(uint256,uint8)","77d9d1fb":"maxHEXCap()","77da0add":"seeAsset(uint256)","77dac983":"abandonEscrowService(uint256)","77daeb80":"addDeal(address,address,address,uint256,uint256,uint256,uint256,string,uint256,uint256,bool)","77db5206":"checkStatus(address,uint256)","77dbbd76":"transferFrom(address,uint256,uint256)","77dc0413":"small_payout(uint256)","77dc657c":"checkPassword(bytes)","77dc6ac7":"tokensSelling()","77dcb4f9":"doPresaleMinting(address,uint256)","77dcba6d":"writeConversion(string,address,uint256,uint256)","77dd3323":"setts50(uint256,address)","77dd8ea7":"ethFnkRate1()","77df3013":"calculatePurchaseAndBonuses(address,uint256)","77dfec3c":"exchangeRateTimestamp()","77e13c10":"playerMakeBet(uint256,uint256,bytes32,uint8,bytes32,bytes32)","77e17039":"startSettlement()","77e17191":"COIN_SUPPLY_MARKETING_TOTAL()","77e19824":"numSubmissions()","77e26762":"getErbutongHao(uint256)","77e2965b":"updateTokenAge(address,address)","77e2a6ed":"openGiveAway()","77e2e5ce":"ICO_setParameters(address,uint256,uint256,uint256,uint256,address,uint256)","77e303d2":"_Deposit(bytes32,uint256,uint256)","77e49660":"addAddressAliasUnsafe(address,address)","77e4fb04":"testFailNotEnoughValue()","77e5bf84":"getTxGasprice()","77e5d8f8":"advisersUnvested()","77e5f6d0":"setGizerItemsContract(address)","77e60f42":"marginForMajority()","77e6bb15":"getCurrentBonusPercent()","77e71ee5":"getForkEndTime()","77e75b07":"mintAndAllocateZCO(address,uint256)","77e7645b":"CoinSaleActive()","77e7ff41":"kickTheCoin()","77e8a52e":"SEARCH()","77e91f26":"getAyantDroitEconomique_Compte_10()","77ea8c72":"RGLSToken()","77eaa420":"_clearAuthorization(address,address)","77eab3e3":"changeMinimumAmount(uint256)","77eb4c50":"hasSponsor(uint32)","77eb74a1":"PassportInterfaceID()","77ec0feb":"dividendPerToken()","77ee311c":"totalMember()","77eefa5a":"pullBack(address,address,uint256)","77ef2c91":"whitePaperHash()","77ef9581":"Registry(address)","77f051c3":"AcceptsToken3D(address)","77f122bd":"setBlockValueBalance(uint256)","77f172b6":"_wager(uint256)","77f18090":"Citizen()","77f18ed3":"isImmortal()","77f25566":"setOne(uint256)","77f27251":"paybackDelta()","77f2d0b0":"partnerInfo_for_Owner(address)","77f325df":"submitAnswer(bytes32,bytes32,uint256)","77f3293a":"endPreICO()","77f37cd1":"luckyBonus(uint256)","77f38024":"BountyPart()","77f3c0cd":"InvokeTransfer(address,uint256[],uint256)","77f3e3d1":"Bounty_Supply()","77f3f782":"UserBalances(address)","77f41164":"stageTwoClosed()","77f46346":"CheckIfIsAllowed(address)","77f48f94":"spin(bytes32)","77f50f97":"claimAdmin()","77f51246":"tokenIsLocked()","77f54a82":"setICOParams(uint256,uint32,uint32,uint256,uint256,bool)","77f6f7e8":"YoloToken()","77f74b6b":"getTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)","77f83bce":"PruebaCoin()","77f8afc3":"FixSale(uint256)","77f929fb":"DeveloperCoin()","77f98616":"getTotalProduct()","77f9bc13":"getVendorApplicationStatusTrack(string,uint256)","77f9c101":"testDeployNewTokenWithTheTestContractAsOwner()","77f9c862":"GetSellOrderDetails(address)","77f9db33":"disableTokenTransfers()","77fa3d32":"addAuction(uint32,uint256,uint256,uint8,uint8)","77fa4c21":"getRewardPot()","77faba66":"setRewardPercentageK(uint256)","77faffa0":"nextround()","77fb6269":"migrateData(address,uint256,uint8)","77fbe611":"forTeamETH()","77fc35e5":"_burn(string)","77fcb91d":"forward(address,bool)","77fcbebe":"TokenLimitReached(uint256,uint256)","77fcc493":"TOKEN_MIN_PRICE_THRESHOLD()","77fcce68":"setSignatureValidatorApproval(address,bool)","77fd347a":"makePredictions(int16,string)","77fe2a0d":"unfrozePerDay()","77fe38a4":"transferToICAPWithReference(bytes32,uint256,string)","77fed1c7":"addOverview(uint256,string,string)","77ff24f4":"test0()","77ffd2e8":"setCurrencyExchangeRate(uint256,uint256,uint8)","780004ac":"systemFreeze(uint256,uint256)","7800313f":"getCurrentTokensByType(uint32)","7800a9f6":"getP3DInfo()","78013292":"optionAddress()","78018581":"Allysian()","7801fc3e":"totalReceivedEth()","780211a2":"refundOrder(address,address,address,bytes32,address,address)","78021e7c":"ownersOfToken(uint256)","780249cd":"DC()","7802857a":"BONUS_TIER_8_LIMIT()","7802cbaf":"addTokenOwnerReward(uint256)","7802f4e4":"nada(uint256)","78030b83":"makeWildCardToken(uint256)","78044965":"setACLRole8972381298910001230(address)","78044ba5":"transferToBuyer(address,uint256,address)","7804a5dc":"canCreate(address)","7805862f":"Unpause()","7805a548":"_createItem(uint256,uint256,uint256,uint256,address)","7805dd1c":"_totalUsersBets()","7807e826":"calculateWeiNeeded(address,uint256)","78080c9d":"rateStage1()","7808dc69":"createSale(uint256,uint256,address,address,address)","780900dc":"create(uint256)","7809231c":"DistributeAirdrop(address,uint256)","7809dd64":"_receiveRefund()","780a4d74":"RecipientUpdated(address,address,address)","780aa037":"receiveTokenFromContract(uint256)","780ae915":"completeMigration(address,uint256)","780aee73":"newGame(string,bytes32)","780bbe60":"createChamp(address)","780be5be":"AggiungiNegoziante(address)","780bfed0":"addPermission(bytes4,string,string,string)","780c4a73":"addCounter(address,uint32)","780c5316":"payMinAuctionEther()","780c5689":"writes(bytes32,address)","780cbf65":"_queryCallback(uint256,bytes)","780d2328":"recordVisit(address,string)","780e4b96":"setConsolationRewardsClaimPercent(uint256)","780f4987":"systemMessage(string)","780ff8d1":"viewLatestErc20TransactionRequest()","78108368":"atxRate()","78121b60":"KeyedCollection()","781224f4":"setVendorWallet(address)","78122f3a":"fail(string)","78127ee7":"GOLDBARToken()","781327de":"createStrategy(string,string,string,address[],uint256[],bytes32)","78152bbe":"setPresaleStart(uint256)","78155bf4":"PaymentCompleted(address,uint256,uint256)","78160d6b":"numChipsClaimed()","78166097":"isValidCustomer(address)","7817364d":"ChillTalk()","7817a60f":"acceptMember(address,string)","7817abee":"getOwnerRatingTuple()","7817eedd":"rawOwnerOf(bytes32)","78186f51":"etherPriceInDollarOut()","7819d30d":"updateNameResolver(string,address)","781a2cca":"Pay(uint256)","781a4a74":"getTokensIcoSold()","781c0db4":"finishFreeGet()","781c4dad":"tierNo()","781cc3d3":"cancelAction(bytes32)","781cd99d":"START_TIMESTAMP()","781db835":"_buyTokens(address,uint256)","781e48e4":"MYCareCoin()","781e9892":"cumulativeRatios()","781f5a83":"registerIdentity(address,address)","782037dc":"reserveTeamRecipient()","78205f67":"testThrowTransferEnableNotTransferable()","7820cd94":"flexibleRewardLevel(uint256)","7821a514":"addReserves(uint256)","7822b902":"setSaleAmountCap(uint256)","7822ed49":"bankAddress()","78231978":"totalSaleSupply()","782378d1":"MIC(uint256,string,uint8,string)","78238cf0":"setCmd_control(uint256)","7824407f":"tokenSupply()","78248880":"decreasePaymentsBalance(address,address,uint256)","7825396b":"setPrices(uint16[])","78258c41":"ZXToken()","78261878":"saleCompleted()","78263edf":"changeMaturity(uint256)","7826bbc3":"fstPrivateSalePortionDenominator()","7826bfa8":"ethereumLottery()","7826f28f":"S1()","7827b226":"froze_contract()","782841cd":"changeMintingState()","78296854":"origMktValue()","782a0170":"etherPriceInUSD()","782a2737":"vestingMap(address)","782addbd":"isInvulnerableByArea(uint256)","782b2340":"getStartIcoTimestamp()","782b3602":"taker()","782b9d50":"setCitizenAddress(address,address)","782c6ef8":"refundSender(address,uint256,uint256)","782c9689":"DeliverToClaimers(address[],uint256[])","782ce79c":"burnClosedToken(bytes32)","782da1ea":"transferFromInternal(address,address,uint256,bytes)","782e1e6c":"tokenTarget()","782e34c9":"ownerSafeWithdrawal()","782ec023":"transferMultiAddressFrom(address,address[],uint256[])","782f08ae":"setUri(uint256,string)","782fb5d4":"getVoteCounts(bytes32)","783110dc":"increaseStep()","78312435":"updateIssuer(address)","78321efb":"pushElement(uint256)","78329d61":"processPurchase(address,address,uint256,uint256)","7832bbf7":"temporaryEscapeHatch(address,uint256,bytes)","78330101":"ESlotsICOTokenDeployed(address)","783370b5":"setEditionLimits(uint256,uint8,uint8,uint8)","7834a504":"buyCoin(address)","78351502":"hasPastFreezTime()","78357e53":"Manager()","78367e46":"enterSmall()","783680a7":"ico2Min()","78375f14":"requireisfine(uint256)","78375f61":"BetTest111()","7837848c":"expire(bool)","7837e170":"lockBalance(address,uint256)","7838415b":"MeetOneToken()","783870eb":"rubusBlackAddress()","78388eb6":"allocationsOverTime(uint256)","78393237":"MAT_PARTNERS_SUPPLY_LIMIT()","783a2cca":"approveWithdrawal(address,uint256,bytes32,bytes32,uint256)","783ac3ee":"offThreshold()","783b4569":"rawRegister(bytes32)","783b7b1e":"sendJackpot(address)","783c2088":"lookupRegName(address)","783c8db0":"minimumFundingAmount()","783cc9dc":"CNNToken()","783ce458":"expmod(uint256,uint256,uint256)","783d5dec":"_limitTeamWithdraw(uint256,uint256,uint256,uint256,uint256)","783ddace":"mintAdvisersTokens(address,uint256)","783e7a06":"removeVerificatorAddress(address)","783f28e6":"adminUpdMinSign(uint256,uint256)","783f6af5":"people()","783f7b98":"setEtherQuota(uint256)","78405234":"indexOf(uint8[],uint8,bool)","7840c781":"_setTokenOwner(uint256,address)","78415956":"after_test_2_method()","7841a530":"set_tokens_sold(uint256)","7841b780":"isPaymentSettled(uint256)","78420d4a":"validateLock()","784279d8":"setSupportedTokens(address,bool)","7842a3a4":"payReward()","7842aded":"getLotteryMoney()","7842dca8":"allTime()","7843184b":"setMultiBonusTokens(address[],uint256[],uint256)","78446bc1":"timeLockPeriod()","7844ce81":"hodling()","78451d64":"SplitPayment(address[],uint256[])","78452d65":"CATContract(address,string)","784547a7":"isConfirmed(uint256)","7845b86e":"fundingRatePredictionBonusClaimWindow()","7845cbef":"GOLDT()","7845d5aa":"UpgradeAgentSet(address)","7845d76b":"tune(uint256,uint256,uint256,uint256)","7846188d":"_getCrabTotalStats(uint256)","7846c3c8":"minimumContributionPresalePhase2()","784712f2":"pendingPayouts(address)","78473485":"getSellDemand(uint256)","7847352a":"setBettingCondition(uint256,uint256)","7848033e":"distributeCHENDE(address[])","784813e0":"lookupBet(uint256,uint256)","78483632":"secondsaleOpen()","78489ed6":"compareIntValue(bytes32,int256,bytes1)","78498818":"getTokensBought()","784a3e40":"bountiesIssued()","784aa7d2":"setTitulaire_Compte_5(uint256)","784ba0f5":"yearteam_trade_date()","784d17f9":"DarkrenlandToken()","784f47ff":"reduceCredits(string,uint256,uint8,address)","784f6654":"activateMe(string)","784fcb94":"MARXToken()","784fdf26":"totalExternalSales()","7850a6b2":"transferDoftManagment(address)","7850b72f":"LSDCrowdsale()","7850c2ac":"holdersAllocatedAmount()","7850f0a4":"setPromotedGame(uint256,bool,string)","785105f6":"savedBalance()","7851bcbd":"safePerc(uint256,uint256)","78524b2e":"halveMinQuorum()","785250da":"kyberNetworkProxyContract()","78533046":"getMetaInfo(uint256)","78533e90":"setTokenMinter(address)","78537808":"union(address[],address[])","7853c945":"bitcoinKey()","7854216b":"autoAirdropAmount()","78547d5f":"processPurchase(address,uint256)","7854b798":"addauction(uint256,uint256,uint256,uint256,uint256,string,string)","78566845":"allocateTicket(uint256,address,string)","78572816":"addAffiliate(address,bytes32)","78579d7c":"addEntry(address,uint256,bool,uint256,uint256)","7857f6e7":"setReverseRate(address[],int16)","7857fcda":"assertEq3(bytes3,bytes3)","78581a46":"getBatchCreateDrawingsAddress()","785826a7":"sendReferrer(uint256)","78583275":"updateMinSale(uint256)","7858651e":"getConnection(address,address,bytes32)","7858eb7b":"setScore(string)","7858f93a":"addressFundTeam()","78591e1d":"findAllCliWithPendingTask()","7859f9e6":"purchaseCarAdv(uint256,string,string)","785b1eb4":"PayEIF()","785b804a":"transferEtherInitiation(address,uint256)","785bc758":"setBaseStorage(bytes4,uint256,string)","785cc997":"mint(uint256,string,bytes)","785ce7ca":"walletBlockOf(address)","785da817":"unterminateFunding()","785e9e86":"erc20()","785fa627":"prizeAmount()","785fb499":"burnFoundersTokens(uint256,uint256)","78607c33":"FundWithdrawed(uint256)","7860ed56":"secondItemWrong()","78629c0f":"lockAddressToken(address)","7862affa":"calculateTimeBonus(uint256)","78635049":"MarzCoin()","786420d1":"getEstate(uint256)","786431c1":"MAX_OPS()","78644a4a":"userOfferAcceptElement(uint256,uint256,uint256)","7865f463":"mmul(uint128,uint128)","7865f611":"LogBet(address,bool,uint256,uint256,bool)","7866ed6e":"getBloodline(uint256)","78670289":"MAX_END_BLOCK_NUMBER()","7867060d":"approveComponent(string)","78683654":"convertMainchainGPX(string,string)","7868c89d":"getRateByStage(uint256)","78698e45":"_updatePrices(uint256,uint256,uint16,uint256[],uint256[])","786ab4b6":"addAccountWithBalance(uint16)","786b844b":"closeGame()","786bfd76":"SimpleConstructorString(string,string)","786c5065":"closeDistribution()","786caff8":"claimerOfSocialIdentity(uint256,uint256)","786cf3ee":"DurioTEST()","786d02d0":"getHoldingsCount()","786d8a25":"test_falseEqNoLog()","786e06f3":"sendETHtoBoard(uint256)","786e4799":"removeRatePlan(uint256,uint256)","786ecf16":"doRestart()","786edae0":"registerEndpoint(string,int256)","786ef70a":"earnedEthWei()","786fb317":"requestOutput(bytes4)","787089bd":"PandoraToken(uint256,string,string)","787091e9":"EABToken(string,string)","7870f889":"MyWhiteList()","78710d37":"seven()","78710f72":"canBuyTokens()","787112be":"set_saleAgent(address)","78719ee8":"DAppNodePackageDirectory(address,address)","7871a9ff":"Crypterium()","78720063":"EligmaSupplyContract(address,address)","7872e3da":"disbursementDuration()","78730d65":"nextLotteryTTMTokenId9()","7873447b":"getFrozenAccountList()","7873832e":"SingularDTVLaunch(address,address,address,uint256,uint256,uint256,uint256,uint256)","787394fc":"setJackpotIncrement(uint256)","7873bc61":"contestant(uint256)","78744754":"getClassName(uint32)","7874b66f":"ReferralActivated(address)","7874d32c":"unblockTokenTime()","78753818":"MAIN_SALE_VALUE_CAP()","7875bbe2":"DividendPaid(address,uint256,uint256,uint256)","7875d41b":"takeBet(uint256,uint8)","78761590":"findTargetCell(uint256,uint256)","7877f72d":"getHours(uint256)","78782027":"enter(string,address)","7878903c":"hasPreSaleEnded()","7878b66a":"isPauseSave()","7879e19e":"CollectAllFees()","787a08a6":"cooldown()","787addc3":"FideliumToken(uint256,string,string)","787b586f":"setMediumProbability(uint8)","787b6725":"removeProduct(address)","787bd6f9":"setDistribution(uint256[5])","787c17d9":"privateSell1Token()","787c23e0":"whitelistWallet(address)","787ccb61":"replenishPool(uint256)","787d024d":"mintLzToken(address,address)","787d64e4":"m_multiOwnedRequired()","787dbaf1":"feedTweet(uint256,uint256,string)","787dc68f":"createPromoAthlete(address,string,address,uint256,uint256,uint256)","787dc9f1":"getFee(bytes8,uint256)","787e9137":"collectedTokens()","787ed1f8":"sayOwnerHello(string)","787ed54f":"payDividendsManually()","787eda49":"assertEq20(bytes20,bytes20,bytes32)","787f9710":"namespaceTaken(bytes32)","787f9cc3":"ManualPriceChange(uint256,uint256)","787fd167":"GameJoined(address,address,uint256,uint256,uint8,uint256)","788023ff":"changeShareable(address[],uint256)","78809c52":"ratePerEthPhase1()","788102ff":"reservedFundsParking(address)","788222ae":"tokenEmail()","78831239":"deleteTopic(bytes15)","78831b36":"setDividendsWallet(address)","7883985b":"addrExecutor()","78843a95":"isTier1(address)","7884e787":"getDni()","78862e69":"deathData_f9()","788649ea":"unfreezeAccount(address)","7886b526":"checkRecords(uint256[])","78879d74":"betAmountAfterRakeHasBeenWithdrawnAndProcessed(uint256)","78880f4a":"population()","7888e957":"storageToUint(int256,string)","788a8c8b":"ARBI()","788ac4a8":"Petrocoin()","788acd7e":"issueBounty(address,uint256,string,uint256,address,bool,address)","788b2ba2":"Stock(string,string,uint256,string,uint256)","788bb8df":"EUR_Omnidollar()","788bc78c":"setVersion(string)","788bc8c0":"tokensToUsd(uint256,uint8)","788c26b4":"createNewVesting(address,uint256,uint256,uint256,string,uint256,bool)","788c4023":"isWalletLocked_Receive(address)","788c5999":"mintMode()","788ce6f2":"icoAddress()","788d135b":"GoForLaunch()","788d1fa6":"setInt8(int8,int8)","788d3851":"voteOpen()","788d5881":"licenseTermsHasMinCost(bytes32,bytes32)","788e0760":"shpExchangeRate()","788e26e7":"sponsorDeposit()","788e2c3c":"getRoundRemaining()","788e31bf":"addBoolSetting(string,bool,address,address,string)","788e72a5":"purchaseProduct(bytes32,uint256)","788e7909":"testTransferFromDoesNotAllowTransferOfMoreThanExistingTokensByDelegate()","788efb9e":"get_taker_fee()","788fa540":"CANONICAL_PRICEFEED()","78912dee":"FINTRUX_RESERVE_FTX()","78912eae":"sendTransaction(address,uint256,uint256,string,uint256,bytes)","7891663d":"HDXToken()","78918e89":"deleteCell(address)","7892cabf":"mixGenes(uint256[2],uint256[2],uint256,uint256,uint256)","7892d29e":"calcTradeFee(uint256,uint256)","7892fd29":"ROUND_TIME()","7893d936":"associate(bytes32,bytes32)","7893f4c2":"DBToken()","7894aafa":"createDivCard(string,uint256,uint256)","7894d1d0":"makeConcept(address[],uint256[],uint256,bytes,address)","789533e9":"getTeamPrice(uint256)","78954b3b":"previousContract()","7895dd21":"claimTokensFromSeveralAuctionsAsSeller(address[],address[],uint256[],address)","7895f853":"isFundLocked()","78960df6":"policyCandyBalance()","7896904e":"DaaToken(string,uint8,string,uint256)","7896cd95":"exchangeEnableCost()","789770f4":"ethToToken()","7898278f":"emergencyFreezeAllAccounts(bool)","78984793":"setLimit(address[],uint256)","7898acef":"usernameOf(address)","7898b917":"getKey(address,string)","78990684":"closeAllSales()","789a12fd":"getRafflePlayers(uint256)","789b2e6c":"payDay()","789b4690":"diviRate()","789c617c":"intStorage(bytes32)","789c6740":"testEmptyCart()","789cf5e2":"auctionSumPlat()","789dfc91":"SafeNetToken(uint256)","789e4e53":"createContractCollection(string)","789ea7dc":"becomeBatlord()","789fdcb6":"DoMusicPayout(uint256)","78a17883":"_batch4_icosaleEndTimestamp()","78a1b7c2":"pct(uint256,uint256)","78a2157a":"erc20ECT(uint8)","78a29c66":"votesAvailable(address)","78a2e101":"TOKENS_FOR_PRESALE()","78a32742":"Pinged(address,uint256)","78a5b1b0":"blockHeaders(bytes32)","78a5f0ca":"withdraw_dao_fund(address)","78a62e9d":"isAppCode(uint32)","78a6c6d2":"createBreedingAuction(uint40,uint128,uint128,uint40)","78a70de5":"safeMathDiv(uint256,uint256)","78a71d78":"sendMail(address[],uint256,bytes32,uint256,bytes32,uint256)","78a72e0d":"encodeTransfer(uint96,address)","78a77b84":"closeRaffle()","78a7b804":"setKittyCoreAddress(address)","78a7e17d":"convert10MTI()","78a83232":"violaToken()","78a89567":"getTokenCount()","78a8b1fb":"ZTKGamers()","78a90a59":"presaleStop_13_December()","78a9e88a":"parseBitcoinComFeed(string)","78a9eeed":"listAll()","78aa08ed":"lotteryFee()","78aa34bf":"test_6_assertGasUsage2000Boards()","78abafaf":"limitAmount()","78abf854":"_budgetEndAndOfficalVotingTime(uint256)","78abfbeb":"finalization()","78ac19f9":"GexPayTest2Token()","78ad76e6":"DeBiToken()","78adf55e":"PreICOPart()","78ae12d8":"PRE_SALE_1000_ETH()","78ae88d1":"newDeal(uint256,uint256,uint256,uint256,uint256)","78af5058":"picosSold()","78af63ac":"btcRaised()","78afda07":"firstContractAddress()","78b04df0":"Play(address,uint256,uint256,uint256,uint256)","78b0cb23":"addGpgKey(string)","78b14f0a":"addCharity(address)","78b150bd":"contractUpgradable()","78b17bd1":"supercustomhash(bytes)","78b17ccf":"CANCELLATION_FEE()","78b226c4":"updateMemberAddress(address,address)","78b27221":"mintFungible(uint256,address[],uint256[])","78b290b5":"OPERATION_HOLDER()","78b29105":"forceBuy(address,address)","78b5a576":"updateDexterity(uint256,uint8)","78b6e20c":"untrackTreasuryToken(uint256)","78b71079":"hasEnoughGrantAmount(address,uint256)","78b83360":"freezingBalanceInfoOf(address,uint256)","78b8a6c2":"issueTokensInternal(address,uint256)","78b8c58c":"getTokenInfoNumToknes()","78b99c24":"pricingStrategy()","78ba24f2":"addContractBalance(uint256,uint256)","78bb5164":"whitelistLength()","78bb9e54":"niceguy4()","78bba530":"communityHolder()","78bc254b":"setPreIcoParameters(uint256,uint256,uint256,uint256)","78bc6460":"getCallGasPrice(bytes32)","78bca3e7":"NeuralNetwork()","78bcd39a":"accountLockCheck(bytes32)","78bd7935":"getAuction(uint256)","78be0496":"MTF(uint256,uint256)","78beda71":"createPromoMineral(bytes32,address,uint256,uint256)","78bee6b4":"transferToAnotherAddr(address,uint256,bytes32)","78bf2b53":"setToken(address,uint256)","78c01961":"EmitEntityIds(address[])","78c24e9b":"adminSetFeeDialNumber(uint256)","78c2c849":"burnUnicorns()","78c37a45":"amendCount()","78c38a79":"setOwnedArea(address,uint256)","78c3b3a5":"futureRoundWallet()","78c3df77":"addProfitPerShare(uint256,address)","78c3e2ec":"createTask(address,string,string,uint256)","78c3e7a4":"generateCardsFromClaimForOpponent(address,address)","78c3f298":"pvtTokens()","78c53533":"getPoolOwner()","78c5e86f":"crowdsaleClosedTime()","78c62ca4":"changeDestinationAddress(address)","78c68573":"getLineUpEnable_miner(address)","78c6d437":"founders_addr()","78c70a4e":"allowAddressToSendMoney(address,address)","78c7524d":"versionIndex(bytes32,bytes32,address)","78c83f71":"rebalance_insert(uint256)","78c8cda7":"removeWhitelist(address)","78c91d29":"getCountCanAdd()","78c9f9cf":"computeEarningsAmount(uint256,uint256,uint256,uint256,uint256)","78ca923d":"nearestKnownBlock()","78caa728":"getLLV_edit_12()","78cac18d":"updateInfo(address,address,uint256)","78cb2f56":"DENtoken()","78cc180b":"bpSaleIssue(address,uint256)","78ce14dd":"CryptotalksToken()","78ce341a":"enablePayable()","78cf19e9":"reserveTokens(address,uint256)","78cfccb5":"REDDCCOIN()","78cffc09":"set_location(uint256)","78d012a6":"roundIn()","78d0a415":"getDthTeller(address)","78d18198":"getNextSnapshotBalance(address)","78d18bef":"withdrawalsInitiated()","78d19e42":"MintableToken(uint256,string,uint8,string)","78d22ab0":"getStageMinWeiAmount(uint256)","78d34986":"updateKittensRemainingForSale()","78d3633b":"illiquidBalance(address)","78d38d1a":"SenegalvsColombia()","78d45eb6":"checkAccess(address,bytes1)","78d46c3f":"listSpriteForSale(uint256,uint256)","78d4e808":"fetchCancelledOrdersForPayerByAdmin(address)","78d55ac1":"MRCCToken(uint256,string,string)","78d5e123":"unstakeTokensManually(address)","78d63908":"doBuy(address,uint256,bool)","78d63c59":"AMFBToken()","78d6525f":"test_validEmptyEqEmpty()","78d6fd25":"getRecTransactions()","78d74f60":"LyCI(address,string,uint8,string,string)","78d7ccea":"ComputeEggsSinceLastHatch(address)","78d8615f":"addEvent(uint256,string,bytes32,bytes32,string,bytes32)","78d8e17b":"totalGenesisTokens()","78d8fed8":"setUnlock(bool)","78d9472f":"setDefendBoostMultiplier(uint256)","78d9b048":"teamPoolInstant()","78d9c387":"newContest(uint32,uint256,uint256,uint32,uint256,uint32)","78da32f2":"setUintF1F2F3(uint256,uint256,uint256)","78da7ba1":"presaleEndTimestamp()","78dbce5f":"GetStakingNow()","78dbfd91":"createBuyOrder(address,uint256,uint256,uint256)","78dc6b7e":"transferring(address,address,uint256)","78dc7017":"getYellowCards()","78dc70c0":"feePeriodStartTime()","78dda193":"getCarState()","78df0fe1":"getProfits(address)","78dfd3a9":"getNumParticipants(uint256)","78e03373":"operationalAddress()","78e24ab5":"SALE1_RATE()","78e2df0e":"soft_cap()","78e4ca77":"Connect4eth(address,address,uint256)","78e4d750":"PenPalToken()","78e5d841":"HaltableToken(address)","78e619df":"DOOMCOIN()","78e65d2e":"bridgeValidatorsImplementation()","78e7058e":"advisorsTokensHolder()","78e77477":"releasedAdvisorsTokens()","78e7e5ea":"LAND_ADDRESS()","78e80b39":"UserGetPrize()","78e8356c":"removeBet(string,uint256)","78e8488d":"gameGiftSentAmount()","78e870cd":"balances_available_for_crowdsale()","78e88c3c":"getMyFee(address)","78e89085":"Dispute(uint256)","78e8b8fc":"dataSourceCallbackGroup(uint256,uint8,uint8)","78e8cab5":"gcpm(uint256)","78e90190":"mokenBytes32(uint256)","78e95645":"noteChainFee()","78e97925":"startTime()","78e9f1ba":"minimumBetAmount()","78e9f81f":"assignRoleWithExpiration(address,bytes32,address,uint256)","78ea787b":"getDefaultAllowance(string)","78eb890b":"checkErrors()","78eba8fc":"icoCheckup()","78ec0adf":"scannedSilverCaps()","78ec1eb4":"checkIfEligable(address,address)","78ec383a":"MRC()","78ec6dbd":"Beth()","78ec81a0":"sendEarnings(address)","78ec96a0":"GREEN()","78eca227":"getBuyOrderInfo(address,address)","78ecabe6":"changeAvailableSpend(uint256)","78ed2178":"linkFileToTask(address,bytes32)","78ed43c1":"administrationContractFrozen()","78ed8dfd":"allocateUnsoldTokens()","78ed9156":"diary(uint64)","78ee6035":"cancelPledgePayment(uint256)","78eef9d4":"move_excess_for_bucket(uint256,uint256)","78efa1db":"COIN_SUPPLY_ICO_TIER_3()","78f0161a":"setGreyGreenPrice(uint8)","78f08268":"getUsersCount(address)","78f08f2e":"getLineStat(uint256)","78f13614":"ATTR_LEASABLE()","78f1a5ce":"addTeamAndAdvisoryMembers(address[])","78f2144b":"_originalBuyPrice()","78f22cc0":"getAuditRegistrar(uint256)","78f305c6":"getStartDate()","78f55622":"calCurrentVirus(address)","78f55de4":"sxpNumber()","78f5958f":"setblocksPerMonth(uint256)","78f5e0ec":"CampingCoin()","78f5e59f":"TOTAL_SUPPLY_VALUE()","78f74fbe":"tokenIssuedPrivateIco()","78f76779":"batchOrderTrade(uint8[2][],bytes32[4][],uint256[8][],address[6][])","78f79187":"DailyAndSnapshotable(uint256)","78f7aeee":"tokenAllocated()","78f7d9c6":"payBill(uint8,uint256)","78fad7bc":"champToken()","78faff96":"isSet(address,address)","78fbc9ea":"weiToCollect()","78fc3cb3":"canTransfer(address)","78fc52b3":"processDiceRoll(address,uint256)","78fca301":"Menu03(uint256)","78fd98d1":"freezeAmount(address,uint256)","78fddd69":"MedAIChain(uint256,string,uint8,string)","78fe2951":"enableService(uint256)","78ff54eb":"updateRestrictedVault(address)","7900438b":"registerDevice(bytes32,bytes32,bytes32)","79008da5":"addRandomTile(uint16,uint8)","790105ff":"withdrawEIP20Token(address)","79018524":"Token(uint256,address)","79032fa7":"storeHorsey(address,uint256,address,bytes32,uint8,uint8)","790377dc":"getLastAuditId(address)","7903d8c8":"canSend()","79049227":"lockupSeconds()","7904d388":"ethRec(uint256)","7904f688":"distributePrizes(uint16)","79053739":"damage(uint8[176],uint8,uint8)","790587d1":"updateIpfsGateway(string)","79061e96":"withdraw_ether()","7906305b":"upgradeTier(string)","790683d3":"getTopicByOffset(uint256)","79081feb":"getCardLeaseLength(uint8)","7908f25c":"thirdTeamWithdrawal()","79099e15":"MAX_USD_FUND()","7909da6f":"createExchange(uint256,uint256,uint256)","7909f569":"gasForFLKD()","790a091e":"test_rewardPoolShare_notTranscoder()","790b1656":"ThreeEtherFree()","790be9b5":"SETC(uint256,string,string)","790c33b8":"getReportingTokenOrZeroByPayoutDistributionHash(bytes32)","790ca413":"launchTime()","790cbfa0":"createMeshPoint(int256,string)","790d4e11":"getLosersOnePercent(uint256)","790dd0f5":"fuint256(uint256)","7910085d":"fipsIsRegistered(bytes20)","79103c2e":"RejectedApplication(address,uint256,string)","7910830a":"setCrowdSaleStatus(bool)","7910867b":"isApproved(uint256)","7911d80a":"Presale1Sold()","7912b0f1":"HOPEToken()","79132085":"APSP()","79141f80":"getBetInfo(uint256)","791455dd":"addPieceAndHash(string,string,string,address)","79147cf0":"_result()","79147d07":"UnsoldAllocation(uint256,address,uint256)","7914d10f":"setminContribution(uint256)","7915785e":"accountsToAllocate()","791581c6":"addTime(uint256,uint256)","7915c069":"register(string,address,address)","7915c9e0":"verifyTransfer(address,address,uint256,bool)","79162aeb":"pauseEmergence()","79164773":"nextForkBlockNumber()","7919233f":"emitWorkOrder(address,uint256)","7919792b":"doThrowOnDivByZero()","791af2b6":"dkBB(bytes32)","791af8e4":"totalExtraTokens()","791b1150":"notify_payment_reject(uint256)","791b51f1":"Consulting(address,address)","791bbe35":"TheDeadShitCoin()","791cbc4f":"stopConvertTokens()","791dd41c":"ownerOverride(uint256)","791f0333":"equalStrings(string,string)","792037e3":"shut(address,bytes32,address)","79203dc4":"totalAllocation()","7920d804":"getKing()","7920f72c":"_tag(int256,string)","79214878":"regionExists(uint256)","792166b8":"createEscrow(uint256,uint256,address,address)","79216aec":"ManagedToken(address,address[])","79216f5f":"add_monster(uint16,uint16,uint16)","79217982":"preIcoMinInvest()","79219a24":"getLockRecordCount()","7922841c":"registerAssetHeader(int256,string,string,string,string,string)","7923715b":"RPEICO_TOKEN_SUPPLY_LIMIT()","79250dcf":"getApprovePreSignedHash(address,address,uint256,uint256,uint256)","792544af":"get_DB_info(uint256)","79254bb8":"right29(uint256)","792651b0":"app_storage()","7927448a":"getTicketTime(bytes32)","7927bc0c":"list_token_bid(address)","792a152d":"addRegion(uint16,uint256,string)","792ad365":"lastBlock_f15Hash_uint256()","792b22c6":"returnCoupon(address[3],bytes32)","792b476b":"getPositionCount1(address,address)","792c02ea":"stagesLength()","792c91c2":"setRecordId(uint256,bytes32)","792cb544":"_setCertificateSigner(address,bool)","792e1ffc":"authorize(uint8,bytes32,bytes32,address)","792e79c5":"stealCardWithTwitterId(uint256)","79304063":"depositsSigned(bytes32)","7930a433":"withdrawDelta(uint256)","7930acd6":"getCCH_edit_27()","79318d81":"closeRefunds()","7931a765":"Issued(uint32,address)","793267f0":"vaildBalanceForTokenCreation(address)","79326c01":"isSaleOwner()","7932f07f":"getRegionBlockUpdatedAt(uint256)","793318eb":"MMMPCoin()","79332159":"Bet(address,address,uint256,uint256,uint256)","79341ca1":"getRoundAmtPot(uint256)","7934b50f":"_lockToken(uint256)","7934f4ed":"processPayment(uint256,bytes)","7935326b":"preICOTokensAllocated()","79362167":"getBillboard(address)","79372f9a":"ClaimReward()","7937f46d":"setBBO(address)","79381c80":"performRefund(bytes32,uint8,uint256,uint256)","7938cc42":"allocateProofTokens(uint256)","7939a10b":"getSellValue(uint256)","793a2cd1":"isPausedICO()","793a8c95":"owner_updatePayout(uint256)","793c0fd4":"authorizeSpender(address,bool)","793ca3fe":"getFirstCycleBlock()","793cd71e":"cashOut()","793cf430":"option30name()","793d424e":"getBLAddress()","793d7165":"fSqrt(uint256)","793dae12":"acceptSettlement()","793e9b0b":"OPTION_POOL_ALLOC()","793ec6c2":"turnOffCanUpdateBackWindowAdjustmentRatio()","79409b19":"EthToUsd()","79412da6":"withdrawalTokens(address,address,uint256)","7941a062":"getBlocksRemaining()","7941d7bd":"changeTokenOwnerByAdmin(uint256,address)","79420fb1":"tierTotal()","79428570":"getTeamId(uint256)","7943f2ec":"withdrawCoinToOwner(uint256)","79444ad3":"handleForTokenId(uint256)","7944875b":"StopSale()","7944b4b9":"mileStone(address,uint64,uint8)","79456cb6":"test_1_method()","79459ac3":"buy10(address[],address[],uint256[],bytes,bytes,bytes,bytes,bytes,bytes,bytes,bytes,bytes,bytes)","794752c7":"askForgiveness(string)","79480a4c":"getOrderValuesFromData(bytes)","79480fe3":"nextMintFeeAbs(uint256)","79485d41":"DeauthorizeServiceProvider(address,address)","7948a9c5":"TokensWithdraw(address,uint256)","7948f523":"setAmbiAddress(address,bytes32)","79491370":"closeSale(address)","79492f30":"allocationFor(uint256)","7949859e":"UpdateToeknLimitICO(address,uint256,uint256)","794ab0a8":"etherPriceInDollarIn()","794b0c62":"DAICO()","794b0e6b":"addExperience(address,uint256[],int32[])","794c0c68":"stakingEpoch()","794cea42":"search(address,address[])","794d0d8d":"WithdrawVault(address)","794df640":"updateUsdEthRate(uint256)","794e9434":"awardWeeklyLottery(address,uint256)","794ee205":"createMarriage(bytes32,bytes32,uint256,bytes32,bytes)","79501a83":"isBiometricLocked(address)","79502c55":"config()","7950c5f8":"verifyingKey()","7951357e":"Suspended()","79515566":"calcAllowedWeisToInvest(uint256)","7952a0ed":"MetaProject()","79530087":"BirCoin()","79538e47":"addVpf(bytes32,uint256,uint256,uint256,uint256,int256[])","7953ae77":"MainSaleDeadline()","7953e0ab":"dateEcoRelease3()","79544754":"getBonus(address,uint256,uint256)","79557e4f":"traded_token_balance()","7955a65f":"adminWithdraw(address[3],uint256[3],uint8,bytes32,bytes32)","7955dd45":"player_withdrawPendingTransactions()","795612d6":"buyItem()","79564072":"directorLockUntil()","7956f46a":"AggiungiProfessore(address)","7957170b":"getApproveRecord(uint256)","795741c8":"withdrawEscrowFees()","79583e22":"buyOrder(address,uint256,uint256)","7958533a":"meta(uint256,bytes32)","795a16e3":"setRecipient(string)","795b0e16":"TransferAllowed()","795b5b83":"createSaleCardToPlayer(uint256[],address,address)","795b9a6f":"scheduleCall(address,bytes4,uint256,bytes)","795bfd7b":"togglePreventDoublePurchases()","795c1713":"FCoinToken()","795c6437":"isWorkflowState()","795da78f":"coinsIssuedCmp()","795dbede":"idx()","795e09ef":"privilegedAccountsCount()","795e4547":"changeContractUpgradability(bool)","795ebb68":"setTokensDecimals(uint256)","795fcd6e":"RelentlessConscience1Token()","795ff8aa":"safeTokenWithdrawal(uint256)","7960d19b":"MediatedTransactions_Log(uint256)","79624add":"MAX_DAILY_SOLO_SPEND()","7962525c":"getRoundNumberOfBets(uint256)","79630bd8":"rate10()","7963b478":"assertEq28(bytes28,bytes28,bytes32)","79644576":"newProposal(uint256,address,uint256,string)","7964ea87":"claim(bytes32,uint256,bytes)","79655bd0":"getStages()","7965bb86":"STQPreICO2(address,address[])","79662bd5":"withdraw(string,address,uint256,string)","796676be":"urls(uint256)","796686a9":"book(uint256[],uint256)","7966c431":"subString(string,uint256,uint256)","796736f0":"tradeBalances(address,address,uint256,uint256,address,uint256,bytes32)","7967a50a":"preSaleEndDate()","7968196c":"amountRaisedInUsdCents()","79681c94":"buyRoundDataRecord(uint256,uint256)","79683e63":"inviteInit(address,address)","79687166":"uintToBytesForAddress(uint256)","79694f08":"topUpDelegate(address,address,uint32,uint192)","796a6ec9":"Credited(address,uint256,uint256)","796a8076":"updateAuctioneer(address)","796b89b9":"getBlockTimestamp()","796c0c78":"allocatedTokens(address,uint256)","796c5e5b":"saveHash(bytes8,string)","796c8902":"getInvestor()","796d67da":"numberOfProposals(bytes32)","796d8950":"StromkontoProxy()","796dc916":"pauseResumeContract(bool,bytes32)","796f6281":"tokenFront()","7970785d":"withdraw(address[],uint256[],address[])","79710f07":"drainERC20(address)","79716e43":"confirmTransaction(bytes32)","7972d079":"setMfgValues(string,string,string,string,string,string)","7973830a":"getMapValue(uint256)","7973b370":"ProudOfYourCoin()","7973c57f":"fechVoteNumForCandidateBySnapshotBlock(address,uint256)","7974a9e6":"publishOption(uint256,uint256,uint256)","7974f8fe":"changeTime(uint256)","7974fdbd":"secondStageRefund()","79753e82":"initAirdrop()","7975752c":"ScabbageToken()","79758d46":"reading_card_at(uint8)","7975c56e":"oraclize_query(uint256,string,string)","7975c609":"accountLevels()","7975ce28":"buyTokens(uint256,uint256)","7976eaa2":"getBonusTokens(uint256)","79770d5f":"minBidDifferenceInSzabo()","7977f708":"addRoleCapability(uint8,address,bytes4)","79787196":"killTotalSupply()","7978c7ed":"exotownToken()","7978f1b2":"licenseCostNumerator()","79798ccb":"startTokenSale()","79799193":"FreezedCash()","797a49b6":"createPoll(string,uint8)","797af627":"confirm(bytes32)","797b5877":"NCU(uint256,string,string)","797bfaf3":"ico1endTime()","797c6f3a":"advertisingUse(uint256,uint256)","797d660f":"getCandidateNumberList()","797d8b85":"calculateDividend()","797d9437":"loadedRefund()","797df209":"configureVesting(uint256,uint256)","797e2aec":"addCharacters(uint8)","797f6bb1":"raiseTraderUnregistered(address)","797f73ff":"alreadyClaimed()","797f87ba":"chests()","79808552":"cancel_lottery()","7980a1ab":"increasePaymentsBalance(address,address,uint256)","7981e7f1":"generateTokensByList(address[],uint256[])","7981fd67":"loikikd()","7982abf0":"testTransferGas()","7983eb31":"distributeEvenly(uint256)","798405fc":"Hold(address,address,uint256,uint256)","79843715":"crowdSaleMax()","79848daa":"setReleaseManager(address)","7984932e":"releaseNow(uint256,uint256,uint8[],uint256,uint256,uint256,string,string)","79853c7e":"payFromCampaign(bytes32,address,address)","79859a78":"setMaxAgonCount(uint256)","7985b860":"AboutBill(uint256)","7985ee8f":"deleteRewards()","7986c724":"BOUNTY_TOKENS_LIMIT()","7986cbfc":"getGroupbyIndex(uint256)","798764ec":"ShowCoinToken()","79878757":"passTokensToTheTeam()","79881b5a":"setPresaleStartsAt(uint256)","79885b91":"LIB()","79891359":"getOnePlayCoin()","798929da":"distributeCoins(address,uint256,uint256,uint256)","798974dd":"getNumProposals()","798a970b":"setUnitCoinProductionIncreases(address,address,uint256,uint256,bool)","798b18fd":"currentRateM()","798b3ecf":"processCooldown(uint16,uint256)","798b7a71":"callOnce()","798bede1":"advisorSupply()","798c1f2a":"do_bet(uint256)","798c6e0f":"clearStages()","798ce54f":"payoutPartial(uint256)","798d05fa":"getCountTeams()","798ec637":"transferEtherToSender(uint256)","798f3e85":"PublicTokenReleased(uint256)","798f9790":"getResoDetails()","798fd178":"getFrom()","79902299":"recalculateTotalFees()","79905753":"reclaimFundMultiple(address[])","7991c63a":"MetaChanged(uint256,bytes32,bytes32)","7992e39f":"TierAmount()","7993e5c2":"Devcon2TokenForTesting()","7994f55b":"setEndpointParams(bytes32,int256,bytes32[],int256)","79953633":"ownersProductAdded(address,uint256,address)","79955b4c":"richardAddr()","7995b15b":"nowInSeconds()","7995ba90":"withdrawExcessToken(address,address)","7995ed8c":"ClaimedWei(uint256)","79968b77":"sellLicense()","79974ce8":"MiningAttemptEvent(address,uint256,uint256,uint256,uint256)","79978630":"settleChannel(address,uint256,uint256,bytes32,address,uint256,uint256,bytes32)","7997b997":"doMelt(uint256,uint256)","79981387":"setWhiteList(address[],address,bool[])","79984882":"getProxyExecID(address)","79987504":"ECN(uint256,string,string)","7998a1c4":"identifier()","79991997":"enter(bytes32,bytes8,uint16)","799957d2":"TTC()","7999c7ca":"myUsername()","799a5359":"transferToken()","799ae223":"flipCoin()","799b3864":"getVersionLength()","799b7bb8":"PRE_ICO_ADDR()","799c0468":"withdrawMarketingAndCommunityOutreach()","799c7b69":"_resetGame()","799c8ef2":"callScheduler()","799cd333":"sign(bytes32)","799d916b":"getObjectValueByKey(string,string)","799dcf7e":"staticArrayTests()","799efef0":"setLockedWalletAmount(address,uint256,bool)","799f0c5d":"locked_funds_for_revealed_spins()","799f4079":"unholdSubscriptionOffer(uint256)","799f7043":"recordBet(bool,uint256)","79a0e5be":"changeMessage(uint16,string)","79a18b3a":"isRoundThreeSalePeriod(uint256)","79a1c1f6":"proposalStatus(bytes32)","79a1ed16":"WithdrawalQuick(address,uint256,uint256)","79a2bbec":"_addResources(address[],bytes4[])","79a2bfa5":"PRE_SALE_MIN_BUY()","79a34619":"startTimeMain()","79a3510d":"thisVoterExists()","79a37bd0":"tellTime()","79a410a7":"bonusesOf(address)","79a411ff":"ScareERC20Token()","79a4b4bd":"sellPrice(uint8)","79a4ee93":"testDeregisterCustomer()","79a6877f":"initializeToken(string,uint256,uint256)","79a7cfee":"setAddress(bytes32,bytes32,address)","79a7de4f":"buildId(address,uint256,bool)","79a8416e":"checkPayment()","79a84750":"createTokensTo(address,uint256)","79a85e6c":"getProductInfo(uint256)","79a87b19":"migrationDestination()","79a88683":"startCrowdsalePhase3Date()","79a8945c":"isDeveloper()","79a89b06":"releaseExpiredEscrow(address,address)","79a8ba40":"createRequest(uint256,address,uint256,string)","79a8f2fa":"processRoulette(address,uint256,bytes32,uint256)","79a958c2":"codeUpdateState()","79a9986c":"addBadge(string,uint256)","79a9e9ea":"IkuraToken()","79a9f14d":"getBcouponBalances(address)","79a9f23f":"transferAllowedAdd(address)","79a9fa1c":"buyback(uint256)","79a9fd36":"SUAPPToken()","79aa024e":"setAirdropAdmin(address,bool)","79aa668d":"setEventsContract(address)","79ab295f":"SALE1_CAP()","79abb2f5":"play_paper()","79aca4e0":"acceptSmartTokenOwnership()","79ae0c0a":"updatePrice(bytes32,uint32,uint64,uint32)","79ae1c36":"setStopDefrost()","79ae77cf":"OEM_Wallet()","79ae9c5e":"clearLC()","79af55e4":"increaseLockTime(uint256)","79af6547":"addLockStep(uint8,uint256)","79af8380":"addCrowdsaleContract(address)","79b0797c":"AmIPlayer1()","79b2614d":"currentMintNonce()","79b37a86":"usdRate()","79b45b18":"removeEmployeesWithExpiredSignaturesAndReturnFadeout()","79b466b0":"TOTAL_TEAMS()","79b4a2c7":"transferMultiAddress(address[],uint256[])","79b5b1d1":"EvaCurrency(string,string)","79b7b30b":"endTrading(bool,bool)","79b80455":"onTimeLock()","79b9a060":"changePayout(uint256)","79ba5097":"acceptOwnership()","79ba50b1":"LAME()","79baa8a9":"BasicIncome_CoFund()","79bae8a1":"test_failed_payment_throwing_token()","79bc2040":"canbuynum()","79bc46b3":"SELL_HARD_LIMIT()","79bcabf4":"Authority()","79bcae2a":"createFuel(uint256,string,uint256,uint256,uint256)","79bd04f2":"_bidLaterShip(uint256,uint256,address,address)","79bd42cf":"END_DURATION_BETTING_BLOCK()","79be02af":"Read(address)","79bed048":"turnOffCanUpdateAmountToTakeAsRake()","79bf8df3":"mModeratorKeys(uint256)","79bfaaeb":"visaLength(address,uint256)","79c0909e":"getRandomFromBlockHash(uint256,uint256)","79c0b9fb":"sanityCheck(uint256,uint256,int8,int8,int8)","79c0d5ae":"tokensInvested()","79c0f30e":"advancedThreshold()","79c12db5":"EventTicket(uint256,uint256)","79c20b41":"changeArtName(string,string)","79c30e49":"openCdp(uint256,uint256,uint256,uint256,address)","79c310a6":"increasePlayersJadeProduction(address,uint256)","79c3199d":"preIcoStartDate()","79c36409":"DifToken(uint256,string,uint8,string)","79c3dd32":"thirdLevelPrice()","79c3ddc1":"isPackageOwner(string,address,address)","79c3f694":"_getPVPFeeByLevel(uint256)","79c4264a":"earlyBirdMinPerPerson()","79c4264b":"matchCount()","79c597ff":"ends()","79c5ba97":"enterBidForGanToken(uint256)","79c5c6b6":"MyWill()","79c5cb1c":"createItem(string,uint256,uint256,uint256)","79c63c40":"dxfOpen()","79c65068":"mintToken(address,uint256)","79c66892":"EmrCrowdfund(uint256,uint256,string,string)","79c69195":"setParamsTotalSupply(uint256)","79c6a1b8":"registerAdmin(address,string)","79c6b667":"registerPoA(string,bytes32,uint64[],uint64[],address,address,string)","79c6c11a":"takeEther(uint256)","79c7180d":"Erc20SummaryLogic(address)","79c73464":"numAdrs()","79c749cd":"generateContentID(string)","79c74a38":"Fomo5d()","79c7c806":"proofExists(string)","79c7f38c":"_freezeAccount(address,bool)","79c84100":"getFreezeHourglass(bytes32,bytes32)","79c88f20":"datacoin()","79c8fe30":"setMaximumGasPrice(uint256)","79c9e396":"test_oneInvalidEqBytes2()","79ca0792":"beneficiaryMultiSigWithdraw(uint256)","79ca9ad4":"tokensToEth(uint256)","79caf670":"ethealController()","79cb5a2f":"setEtheraffle(address)","79cb650f":"testAliceFooKill()","79cb657a":"setRateStalePeriod(uint256)","79cc6790":"burnFrom(address,uint256)","79cc90c4":"repossess()","79ccd1a1":"BetherBank()","79cce1c5":"getReleaseHashes(uint256,uint256)","79cd421d":"ERCTestToken()","79ce0515":"removeCP(address,address)","79ce37e1":"deadline_modify(uint256,uint256)","79ce9fac":"transfer(bytes32,address)","79cef607":"_purchaseTokens(string,address,uint256)","79cf3a7a":"zeroOut()","79d007f7":"forceOffsetExtraFeeRate()","79d00c5d":"EasyCrowdsale()","79d10a76":"SedPosToken()","79d116ed":"setWhiteListingAdmin(address)","79d1d4fa":"verify(bytes,bytes,bytes,bytes32)","79d220ae":"setCrowdsaleOpenTimerFor(uint256)","79d2e48d":"upgradeFinalize()","79d303ae":"doStart()","79d3d547":"grantToken(address)","79d42bfe":"CLNRaised(address,address,uint256)","79d4fe00":"totalTokensICO3()","79d60cdf":"LongChain()","79d6348d":"sign(string)","79d68f79":"COIN_PER_ETHER_BOARD()","79d88d87":"forbid(bytes32,bytes32,bytes32)","79d8cc7b":"setFlights(uint16[],uint16[],uint256[],uint256[])","79d95c5a":"setMaxCap10X(uint256,string)","79d9e979":"minimumDealAmount()","79da06a2":"BlockSwapWrapperGolemNetworkToken()","79da9747":"switchCrowdsale()","79db228a":"RegisterList(address[],bool)","79db5f67":"removeRole(address,uint256)","79db671d":"upadateContributorsCount(uint256)","79db77a3":"removeStaffWhitelist(address[])","79dbdbb9":"CKYAdv(uint256,string,string)","79dc04c0":"BCTVToken(uint256,string,string)","79dc10a6":"takeOwnershipFeePercents()","79dd02cb":"PerfectCoinControl()","79dd822a":"setSignatureRest(bytes,uint256)","79ded380":"setRabbitMother(uint32,uint32)","79df2a4c":"ReferredInvestorAddition(address,address)","79df4fa2":"startDeposit()","79df896d":"ScandinavianEKrona()","79e05a36":"getUintField2()","79e097f0":"addVotePair(address,address)","79e0ef1b":"withdrawBalanceAmount(uint256)","79e0f59a":"setEarlyParicipantsWhitelist(address[],bool[],uint256[],uint256[])","79e1250d":"setTotalToken(uint256)","79e12f7e":"getBoardByHash(bytes32)","79e1c9dc":"changeAmountPerEther(uint256)","79e1fa2e":"convertToEur(uint256)","79e23483":"addLockValue(address,uint256)","79e2bbea":"getLifeVal()","79e35d0b":"poolcoin(uint256,string,string)","79e468ef":"createLand(address)","79e54e6e":"AleKoin()","79e58973":"coinBalanceOf()","79e58cfd":"transferIcoship(address)","79e79023":"KuaiMintableToken(address,uint256)","79e8b8eb":"lastSubTokenCreatorOf(uint256)","79eaaf61":"totalTiers()","79eac7c3":"confirmOccupancy()","79eb16d4":"calculateShareETH(address,uint256)","79eb26cc":"RANGE_SCALE()","79eba0b6":"showPrivateVars()","79ec3864":"getMemberAtAddress(address)","79ec4f19":"setStartAndEndTime(uint256,uint256)","79ed13a7":"availableOptions()","79ed3d69":"setNextCommonTTMTokenId2(uint64)","79edfa7d":"setMetadataUrl(string,string)","79ee54f7":"getRewards(address)","79eee392":"DEVELOPERS()","79ef6858":"addItemToMenu(bytes32,uint256)","79ef704e":"addLogic(address)","79efb507":"oldData()","79f00703":"setEthartArtReward(uint256)","79f015b2":"getCarProductName(uint32)","79f0b427":"log_demurrage_fees(address,address,uint256)","79f0c524":"ParseHeaderData(bytes)","79f0cd62":"revertTokensByKYC(address,address)","79f0f7b3":"safeMulWithPresent(uint256,uint256)","79f119cd":"PXP()","79f1433c":"post_energy_balance(int256)","79f16ba1":"ShanDianLian()","79f1987d":"thirdExtendedBonusSalesEnds()","79f1a6ef":"_noMatchingPairs()","79f3b481":"putTreeOnSale(uint256,uint256)","79f57e68":"getAsAddress(bytes32)","79f59f09":"ParsecTokenERC20()","79f645ea":"RANDOMIZER_RETRY_COUNT()","79f64720":"cancelAndReissue(address,address)","79f68f85":"forwardFunds(bool)","79f74fd5":"ControllerSet(address)","79f7a873":"isAtLeast(uint256,uint256,string)","79f7e600":"setApproveOwner(uint8,bool)","79f90d6c":"ownerPauseContract()","79f9578c":"queryBalanceMinter()","79f96600":"getCurrentFeeWindow()","79f9b10b":"registerAsExportingAuthority(address)","79f9cc72":"setGasLimits(uint256,uint256)","79fb18ac":"transferSmartTokenOwnership(address)","79fc3682":"addressBalances(address)","79fc4687":"receiveDividends()","79fd86cc":"airDrop_(address,address,address[],uint256)","79fd8c24":"PriceUpdate()","79fdf548":"updateTokenInvestorBalance(address,uint256)","79fe3b06":"setPercentTokensToSale(uint256)","79fed7cb":"checkMinContribution()","79ff69d9":"paymentSettle(uint256)","7a00698f":"_doProposal()","7a0092b5":"Aunder()","7a009c22":"increaseBank()","7a00cf46":"isCloseable()","7a00e2e3":"removeReferrer(address)","7a013105":"ico_start()","7a02a973":"resetStaking()","7a02dc06":"getInfo(bytes32)","7a02eb1d":"Maesawa()","7a039beb":"GXX()","7a041e7e":"fundsFromPreSale()","7a044323":"accumulated()","7a04581c":"getBetclose()","7a04855a":"EplusCoinToken()","7a04f9ea":"getPhaseExpiry()","7a060b53":"GOLD_AMOUNT_TPT()","7a07424e":"promotionRatio()","7a08339d":"setFakeTime(uint256)","7a091f95":"batchPunchIn(address[],uint64[])","7a09588b":"cashoutEOSBetStakeTokens_ALL()","7a096f53":"getTransfer(address,address)","7a09defe":"totalMonster()","7a0a2e00":"auctionEndHashing(uint256,uint256)","7a0b0a3f":"MAX_STAGE_1_LIMIT()","7a0b294c":"buyPresaleTokens()","7a0c396d":"giveMeNILs()","7a0ca1e2":"attach(address)","7a0d819e":"casinoDeposit()","7a0e03ec":"getUInt8Value(bytes32)","7a0e09aa":"getConsent(uint256)","7a0e2d1a":"updateUser(bytes32,bytes,bytes32,bytes32)","7a0ecfc2":"LogUpdatedInitialTimestamp(uint256)","7a0fee37":"MinerRandomNumber(uint256)","7a10f17b":"PIN_PRICE()","7a1126f0":"houseWithdraw(uint256)","7a118fdc":"SHNZ()","7a11dfb4":"redeemBounty(uint256,uint256,uint8,bytes32,bytes32)","7a12cabf":"owner_updateRelay(address,bool)","7a12cdb8":"cybToken()","7a1395aa":"setDecimals(uint8)","7a13d14c":"disputeAutomatedReport()","7a1439d7":"payOffClaim(bytes32,uint256)","7a14f465":"crosairSoldCount()","7a152c11":"unpause(uint256,uint256)","7a153043":"disbursements(address,uint256)","7a1593d6":"freeze(address,string,uint256,uint256,uint256)","7a15eb8d":"lottoIndex()","7a16c6dd":"setsetperiod(uint256)","7a16cbe3":"setData_4(uint256)","7a178741":"getMemberAddr(uint256)","7a17feff":"setTransferLimit(uint256)","7a186ebf":"WHITELISTED_PREMIUM_TIME()","7a1903f2":"checkBonus(uint256)","7a1a0604":"AuctusTokenSale(uint256,uint256)","7a1a7e7f":"itemCancelMarkets(uint256)","7a1ab407":"bountyOwnersTokens()","7a1ac566":"registerSale(address,address)","7a1aeb3c":"getTokenCount(bool)","7a1b26a8":"TransactionAccepted(uint256)","7a1b63bc":"buyCMTAgainstEther()","7a1bba3a":"TestFoo()","7a1bbb40":"getNegativeArray()","7a1bcae9":"playerDecision()","7a1bf7f6":"PreIcoClosedManually()","7a1c0063":"emitExecuted()","7a1c39cb":"setIII_R2(uint256)","7a1c44f8":"DappleAirdrops()","7a1cf806":"configureTokenDividend(address,bool,address,bytes)","7a1d66dd":"determinePosition(address,address)","7a1d8570":"getSendVal()","7a1e16bc":"signEscrow(uint256)","7a208990":"Arcus()","7a20ff15":"getWeiAllowedFromAddress(address)","7a223758":"detOwner()","7a22393b":"setTokenSeller(address)","7a233fb3":"redeemPrice()","7a26924f":"timeToFinishTokensSale()","7a2756f2":"getWager(uint256)","7a276bb6":"getDeveloper(uint256)","7a28399b":"approveProvider(address)","7a28e60f":"EXTRADECOIN(string,string,address)","7a28f8bc":"accountData()","7a290fe5":"burnRemainToken()","7a29332d":"buyAllOutcomes(uint256,uint256)","7a294055":"VoteReceived(string,address,uint256)","7a2a0456":"swapEtherToToken(address,uint256)","7a2a3931":"galleassetTransferFrom(address,address,uint256)","7a2a530d":"getAllDevices()","7a2b0587":"isReserve(address)","7a2b2dd7":"Metaexchange(address,address,address,uint256,uint256,uint256)","7a2b78e5":"findIndex(uint256,uint256)","7a2b9116":"checkValidTk(address)","7a2c1b71":"CheckProfit(address)","7a2c8506":"getUserReward(address,bool)","7a2cc6d8":"_createPermission(bytes32,address[],bytes4[])","7a2e1c61":"getSoldCountOfPackage(uint256)","7a2e41d1":"InitiateCryptoGamers()","7a2ecfdb":"setMostSent(uint256)","7a309005":"devSENSDestination()","7a30ebed":"holyFoundersFundDeposit()","7a3130e3":"migrateFrom(address,uint256)","7a314ce2":"FUND_GATHERING_TIME()","7a319590":"changeFees(uint256,uint256,uint256)","7a31ee21":"MinimumFundingGoalChanged(uint256)","7a32c84c":"getDonatee()","7a341bc7":"setFounder(address)","7a34cedb":"purchaseWithBTC(address,uint256,uint256)","7a350141":"BalanceChanged(address,address,uint256)","7a360ec3":"forwardWei()","7a3629dc":"setMinimumStakingRequirement(uint256)","7a362fe1":"ICO_START1()","7a366d14":"softCap(uint256)","7a38012e":"handleEarlySaleBuyers(address[],uint256[])","7a38417b":"delayOpeningTime(uint256)","7a386e88":"setupAmbi2(address)","7a387bc2":"returnNote(uint256)","7a38f9eb":"isZero(uint256)","7a396264":"winAmount2()","7a39bb28":"FirstPeriodCapUpdated(uint256,uint256)","7a3a0e84":"fundingGoal()","7a3aa8ea":"CoXxMoXx()","7a3abce9":"withdrawComB()","7a3b0b5d":"positive_terms_of_Service()","7a3c4c17":"currentPrice(uint256)","7a3cbbe4":"TIMER_STEP()","7a3d2e5c":"changeArtUrl(string)","7a3d4b1a":"createSwap(uint256,address)","7a3dae68":"_createKT(string)","7a3dbc16":"getInitialPrize(uint256)","7a3e0013":"setArbitrator0(address)","7a3e286b":"currentCollectRound()","7a3eeb57":"setdteamVaultAddr2(address)","7a3f5781":"setAllowRefunds(bool,uint256)","7a4058dd":"confirmDealCompletionByPatient(bytes16,bool)","7a40618d":"emitContractRemoved(address,address)","7a408454":"burn(bytes32,uint256)","7a4093b8":"SETUP_DONE()","7a427d98":"forceReturn()","7a42a9cd":"checkOwner(bytes32)","7a43cb62":"positionWeightOf(uint256,uint256)","7a442a9b":"isClaimable(string)","7a444072":"getDeveloper()","7a44d730":"PGM_Coin()","7a457855":"getNumeroMensajes()","7a468170":"ethCap()","7a4690fb":"TOKEN_SALE1_NORMAL()","7a476a42":"queryPublishedContractTemplate(uint256)","7a479160":"getRequestArgs(uint256)","7a4822d7":"addTransaction(address,uint256,string,bytes)","7a4843ca":"product3_luckybuyTracker()","7a48b408":"MCIM()","7a48f5c7":"start_pg_quiz(string,string)","7a4aa92f":"provideTeamHolderToken()","7a4b7075":"getMake(uint256)","7a4b762b":"synechronToken()","7a4bfebb":"FixedGameToken(bytes32,uint256,address)","7a4c2e9a":"access_hidden_layer(int256[],uint256[],uint256)","7a4c96ad":"vote(string,string,uint256)","7a4cac15":"removeUserAsset(address,uint256)","7a4e320c":"MINIMAL_PRE_ICO_INVESTMENT()","7a4e365d":"destroyFreezeFunds(address)","7a4f2fde":"decreaseSalesBalance(address,address,uint256)","7a4f7b92":"getInitializedFeeWindow()","7a4fb678":"Operation(uint8,bytes32[8])","7a504ceb":"endCrowdsale(uint256)","7a50aeb5":"ProofToken(address,address,uint256,string,string)","7a518d9f":"epoch_release_count()","7a51a611":"getOptionIdForPoll(uint256,uint256)","7a52ad76":"ChangeMainSaleDates(uint256,uint256)","7a530f03":"createPromoFlower(uint256,address)","7a5310b9":"confirm2stage()","7a53bcfc":"batchSend(address[],uint256[])","7a5402e9":"getPolicyData(uint256)","7a543a94":"isIcoFinished()","7a545b0c":"preIcoSold()","7a55cece":"PlusPay()","7a55d4bd":"getCurrentBragKing()","7a5615c0":"changeTokensPerUSD(uint256)","7a58b058":"read_max_dgx_available_daily()","7a58ce90":"CryptoLinkNet()","7a5977be":"MAX_TOKENS_ADVISORS()","7a5984c4":"burn(uint32)","7a5a35ad":"setUSDEth(uint256)","7a5a59ec":"angelAllocation()","7a5b4f59":"getMetadata()","7a5bed43":"deleteSharedAccount(bytes32,bytes32,bytes32)","7a5c8432":"paymentqueue()","7a5c9028":"getLengthClassPlayers(uint256,uint256)","7a5ced61":"batchcollecttaxes(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","7a5d5345":"signControllerChange(address)","7a5db3f3":"renounceInvestor()","7a5dbc21":"ipow(int256,int216)","7a5df22b":"getStakedAddress(address)","7a5e842a":"nizk_verifyproof(string,string,string,string,string,string,string)","7a5f5021":"closeBets(bytes32,bytes32,uint256,uint256)","7a5f715c":"SetCityName(bytes32)","7a5f973b":"INITIAL_SUBSIDY()","7a62b77c":"ShowChargeTime(address,uint256)","7a631201":"resetEvents()","7a63626c":"ownerIndexToERC20Balance(address,address)","7a63c290":"mintCapInTokens()","7a6506f6":"dividendsPayedIndex()","7a6543e2":"getRegistered()","7a654915":"BitcoinTRONIX()","7a657c53":"checkVotingForSendWeiFromPayment()","7a6615d4":"NewPAIReceipt(address)","7a66e5cf":"paySolutionReward(uint256,uint256)","7a67011f":"setMoneyline(int256,int256)","7a6838ec":"ownerBank()","7a690951":"_endBetListing(uint256)","7a6994dc":"getSpaceByIndex(uint256)","7a6a00bb":"balanceEthOf(address)","7a6a18cf":"CrowdsaleMintFinished()","7a6ad926":"getUint(bytes32,bytes32)","7a6adab6":"getAdsLength()","7a6b1c7c":"authAccess()","7a6b2a2c":"lookupAmountUserDonatedToCampaign(address,uint256)","7a6b456f":"countShips(uint16,uint16,uint8,bytes32)","7a6b8361":"zeroBytes()","7a6ba98c":"getHashKey(address,uint256)","7a6c7783":"_consume(address,uint256)","7a6cb1aa":"getReceiverVesting(address,address)","7a6ce2e1":"getMsgSender()","7a6d6f3d":"gettormow()","7a6d8030":"BLOCKMALL()","7a6e1384":"priceForBuyingCostume()","7a6e2b49":"payService(bytes32,address,address,uint256)","7a6e5949":"getwithdrawEthertoAmountValue()","7a6e9df7":"getTimestamp(bytes)","7a6e9e41":"withdrawSellDemand(uint256)","7a6ee304":"IAMRefundedForWei(address,uint256)","7a706ac7":"setBuyRatio(uint256)","7a70abda":"updateAvatar(uint256,uint256)","7a71055d":"setAvgMinedPerDay(uint256)","7a713023":"finalizeSettingDeprecation(uint256)","7a71dee0":"onePotWei()","7a72416f":"security_address()","7a72c30d":"checkMilestoneStateInvestorVotedNoVotingEndedNo()","7a72c32f":"Paraboloid()","7a740a68":"communityReservation()","7a74b672":"clearEndpoint(bytes32,int256)","7a766210":"XYZA()","7a766460":"getStake(address)","7a773293":"setMarketingRates(uint8,uint8,uint8)","7a783d91":"Leeroy(address)","7a78cccc":"DAMIToken(address)","7a78ee2c":"lastBlock_a12Hash_uint256()","7a791524":"setNextFeePercentage(uint8)","7a792fa0":"get_reward(uint256)","7a79940d":"getSharedAccountPw(bytes32,bytes32)","7a7cdfa9":"createT(string,string,string,string,string,string,uint256,uint256)","7a7d4937":"secondsPerBlock()","7a7ebd7b":"channels(bytes32)","7a80760e":"ERC20Token()","7a81f972":"releaseCelebrity(uint256)","7a824b1d":"cooperativeSettle(uint256,address,address,uint256,address,address,uint256,bytes,bytes)","7a827634":"_emitContractAdded(address,address)","7a828b28":"terminate(uint256)","7a837213":"setAllowedAccount(address)","7a83e89e":"_endBetBlock()","7a840a52":"PKBCoin()","7a84d13e":"getNumberOfCandidates()","7a852c7e":"transferTokensWei(address,uint256)","7a8566ae":"richToken()","7a85c02a":"tokensOfEdition(uint256)","7a85e031":"finalizeInternal()","7a86d3d6":"addWithdrawTransaction(address,uint256,bytes)","7a872547":"defaultInput()","7a875ade":"fishPromoHelpers(address)","7a87f51a":"emergency_eth_withdraw()","7a888ca9":"startOptionsSelling()","7a88aabb":"getAddressOfTokenUsedAsReward()","7a899cdc":"_setPermission(address,address,bytes32,bytes32)","7a8a5cf3":"totalMigratedIn()","7a8a8720":"firstUnitStartTime()","7a8b0114":"setA_ASM(uint256)","7a8b089b":"developerFundDeposit()","7a8bd25a":"get_bet_nfo(uint256)","7a8bd93e":"flipRewardAmount()","7a8df1b9":"getAffiliateInfo(address)","7a8e3d8d":"withdrawEth2Wallet(uint256)","7a8e832f":"MyBalance()","7a8f7be6":"HAYATO_EXTRACTION_BASE()","7a8fa666":"addPoweruser(address)","7a8fe3b1":"getProductBuyersWithUnconfirmedRequests(uint256)","7a9036cd":"registerFixedToken(bytes32,uint256,address)","7a906be0":"createAuction(uint256,uint128)","7a90a7a3":"feeBurnerWrapperContract()","7a9110d5":"klik()","7a91d5f9":"dilutePower(uint256,uint256)","7a91e53d":"isNotSelf(address,address)","7a926165":"manageAdmins(address,bool)","7a927429":"TokenValue(uint256,string,uint256)","7a935644":"I30Token()","7a93b917":"Lirux(string,string,uint256,string)","7a954d5d":"investedInPreICO()","7a95e305":"escrowedForAsset(bytes32)","7a95f174":"CGT()","7a960154":"numOfPurchasedTokensOnCsBy(address)","7a9839c2":"fun(uint256)","7a99b018":"withdrawClient()","7a99ba4f":"investETH(address)","7a99bb0a":"_getTokenAmount(uint256)","7a9a032d":"addProposal(string,uint256,uint256,string,string)","7a9b486d":"deposit(string,string)","7a9c960b":"DayDayToken(address)","7a9d366a":"debug_bool(bool)","7a9db28a":"_setPriceFactor(uint256)","7a9df8c0":"sellChickenParkCoin(uint256)","7a9e19de":"nextOffsetIndex()","7a9e5e4b":"setAuthority(address)","7a9ee2dc":"SogetiCoin()","7aa064ef":"intersubuser(address,uint256)","7aa0eb97":"LogSendTokens(address,uint256,string)","7aa11238":"Flow(uint256,string,string)","7aa1688e":"setUser(address,string,string,bool,bool,bool)","7aa1a77d":"rawWipeAttributes(bytes32,bytes32[])","7aa2096a":"setPI_edit_15(string)","7aa2bcd6":"bonusCompaignOpen()","7aa306a2":"numOwnerAddress()","7aa3295b":"trusted(address,address)","7aa356af":"phaseTwoRate()","7aa359f8":"changemem(uint256,bytes32)","7aa3803c":"takeRent(address)","7aa3976f":"DragonStone()","7aa3b39b":"_vest(address,uint256)","7aa3f6cb":"setKyberProxyAddress(address)","7aa3ff67":"AlterMediatorSettings(address,uint128)","7aa41ed5":"getNumPieces()","7aa50c56":"performDifferent(address,address[],uint256[])","7aa5a1a8":"set_eth_as_seeded()","7aa63a86":"getTotalElements()","7aa86e2f":"fetchProfit()","7aa98fb3":"timeLock(address,uint256,uint256)","7aa9a7f9":"getNumberThree()","7aaa3470":"getInterest(address)","7aaae78c":"preSaleBonus1Amount()","7aacd17d":"MyToken(string,string)","7aacf03c":"auctionIndex()","7aada63b":"maxEarlyStage()","7aae42c9":"endIcoPreICO()","7aaeb37c":"SimpleTGEContract()","7aaf334d":"offFreeze_Bounty(address)","7aaf58d7":"creatUserPurchase(address,address)","7aaf87d2":"getallresutl()","7ab0089e":"YiLiaoLian(uint256,string,string)","7ab03c25":"reserveTokensProjectAndFounders()","7ab0b998":"signRecoveryChange(address)","7ab13461":"decreasePrice(uint256)","7ab13ba9":"isProgress()","7ab14aae":"createBattle(address,uint256[],bytes32,uint256)","7ab21613":"getStopReceive()","7ab2af2b":"isRegistrationOpen()","7ab38e88":"issueTokensPresale(address,uint256)","7ab42bbd":"grantXPTokens(address,uint256)","7ab4e968":"oneEDG()","7ab528c9":"revokeDelegate(address,string,address)","7ab5e1e1":"reservedTokensFunctionality()","7ab61372":"totalRunePurchased()","7ab7a9fa":"aurasCompatible(uint64,uint8)","7ab7ab2e":"AcceptsHalo3D(address)","7ab7d55b":"calculateHash(uint256,uint256,uint256,bool,bytes32)","7ab7e492":"RANGESTART_2()","7ab7fa9f":"UBEX()","7ab91b3a":"hash(uint64[8])","7ab96fda":"testBalanceCanbeWithdrawn()","7aba2249":"StoppableMock()","7aba4d23":"delToken()","7aba6f37":"setLock()","7aba86d2":"bonusMax()","7abaf552":"nexium()","7abb03bc":"noticeWinner(uint8)","7abbe9c0":"DEFAULT_GAME_COST()","7abc06aa":"tokensPerCents_gte50kUsd()","7abccac9":"getTokenMetaData(address)","7abdf949":"getUpgradePrice(uint256)","7abe24d4":"Firechain(uint256,string,string)","7abeb6a0":"createMarket(address,address,uint24)","7abec356":"Deposit(address,uint256,int256)","7abf75fd":"CFNDCrowdsale()","7ac02331":"ethMultisigWallet()","7ac07dcc":"isCaller(address)","7ac1cb30":"setbili(uint256,uint256)","7ac26aeb":"getTag(string,uint256)","7ac37d58":"ownerTransferEther(address,uint256)","7ac3c02f":"getSigner()","7ac40b10":"thedate()","7ac4b05e":"returnMyMoney(uint256)","7ac4ed64":"getAddress(address,bytes32)","7ac59d43":"getSellerSignature(string)","7ac5bb54":"getFlight(uint16,uint16)","7ac5d8a9":"RoundNumber()","7ac6e6a8":"objectHelmet()","7ac7ef85":"Msg()","7ac81da5":"useProps(uint256[],uint16[],uint16[])","7ac8dc26":"subFundPrecent()","7ac91cc2":"testFailOwnedAuth()","7ac94409":"sixthExtendedBonusSalesEnds()","7ac9f013":"removeVal(address,bytes32,address)","7aca84a1":"createVaultAccess(uint256)","7aca97b5":"changeDeadline(uint256)","7acb3e67":"EthTraderDAO(address,bytes32,address,address,address)","7acb4b0f":"isGroupInPolicy(bytes32,bytes32)","7acb7757":"stake(uint256,address)","7acbfb65":"setOwner(uint256,uint256)","7acc0b20":"products(uint256)","7acc6f74":"addSingleAddressToWhitelist(address)","7acc8678":"transferAdminQuickly(address)","7acd0412":"newInvest(address,uint256,uint256)","7ace341b":"getCurrentOwner(uint256)","7ace41f2":"CoinvestToken(uint256)","7ace58d8":"changeBranch(uint256,uint8)","7acee816":"claimIFactor2(bytes32,bytes32)","7acf16c3":"findLowestBenefactor()","7acf4892":"isNotPaused()","7ad00589":"getAffiliateSenderPosCode(uint256)","7ad06be3":"recycleAppearance(uint128[5],uint256)","7ad0bf86":"exchangeRegulatorWallet()","7ad1428d":"m_record(string)","7ad157b9":"buy(uint256,address,bool)","7ad226dc":"refund(uint256,address)","7ad2856f":"info(string,uint8)","7ad28c51":"changeTimeLock(uint256)","7ad2a0ce":"doAirDrop(address[],address,uint256,uint256)","7ad3c119":"ContractInfo()","7ad3def2":"updateToken(address)","7ad4b0a4":"setAttribute(address,bytes32,bytes,uint256)","7ad53eae":"sani()","7ad59e20":"end_Dec_21_2017()","7ad5a045":"_ReparameterizationProposal(address,string,uint256,bytes32)","7ad77fd9":"firstWeek()","7ad8800f":"ShowPrice(string)","7ad9642f":"changeMiniumBet(uint256)","7ad979a3":"setupFund(string,address,uint256,uint256,address,address,address,address[],address[],uint8,bytes32,bytes32)","7adaa3f8":"right39(uint256)","7adac0e6":"stopTransfers()","7adb7ced":"ekkoBlock(uint256,string,uint8,string)","7adbf973":"setOracle(address)","7adc22d8":"bujankkoin()","7add0106":"initBronze()","7addc766":"ADDR_MAYA_MARKETING()","7ade8d6a":"Totti(string,string,uint256,uint256)","7adec1c9":"DepositAcceptedEvent(address,uint256)","7adee0e3":"setJoinDelta(uint256)","7adfec71":"allTasksCount()","7adff2cb":"auth(uint8,bytes32,bytes32)","7ae046d5":"joinGame(uint256,address,string)","7ae0c915":"SmartBondsSale()","7ae11443":"getCurrentStakingPeriod()","7ae145cb":"Badge(uint256,string,uint8,string)","7ae15a19":"createKingdom(string,uint256,uint256,uint256,uint256)","7ae1cfca":"getBool(bytes32)","7ae26546":"setApprovedContractAddress(address,bool)","7ae26773":"revokeAllowance(address,address)","7ae2a331":"goldenTicketFound(address)","7ae2aa34":"teamVestingStage()","7ae2b5c7":"min(uint256,uint256)","7ae316d0":"getTotalFee()","7ae38a95":"isDestructionStarted()","7ae488c3":"priceOfPlayer(uint256)","7ae4bff8":"changeStage(uint256)","7ae506ac":"minimumPurchaseValue()","7ae5dfe5":"TTC(uint256,string,uint8,string)","7ae68ada":"getReferralCode()","7ae6b763":"updatePartner1_will(string)","7ae7024c":"_realBalanceOnToken(address)","7ae74432":"PhilToken()","7ae77ecf":"onlyBouncerCreateContract(bytes)","7ae79345":"ZeroChain()","7ae79e86":"crowdfundEndsAt()","7ae81801":"userUpgradeElement(uint256,uint256,uint256)","7ae8b321":"withdrawGNT(uint256)","7ae8c854":"getMaturity(bytes32)","7ae9c430":"getMinFunds()","7ae9c856":"getassignTokensperType(uint8)","7aeaa864":"storePhoto(string)","7aeabb39":"lastPaymentDate()","7aeb0763":"habichnet()","7aeb9500":"getAutoInvestStatus(address)","7aec05b6":"TemroyToken()","7aec2277":"ValueCyberToken()","7aece878":"receiveObject(uint256,address)","7aef1cdc":"airDropDestinations(address)","7aef1d4d":"setMinEther(uint256)","7aef2226":"MIKETANGOBRAVO18Crowdsale(uint256,uint256,uint256,address,uint256,uint256,uint256)","7aef951c":"bid(string)","7aefec13":"followTraderPreSignedHashing(address,address,bytes32,uint256,address,uint256)","7af05516":"claimRewardTillRound(uint64)","7af0ed7e":"NewStatic()","7af1337b":"updateCrystal(address)","7af20a0a":"LITECORE()","7af2a28e":"createContractElement(string,uint256)","7af30442":"testToggleBitFailIndexOOB()","7af327a0":"deposito()","7af3670c":"NewToken()","7af52ade":"collectEntryFee()","7af5878e":"safeSend(address,address)","7af5dc37":"safeSub(int256,int256)","7af85411":"DisableReturnFunds()","7af8b87d":"verificationRate()","7af8c4f2":"changeTokenSaleAddress(address)","7af91032":"getPoolDoneCount()","7af915af":"setResourcesBanker(address)","7afa0c66":"lockedMonsterStatsCount()","7afa1eed":"generator()","7afa8388":"transferFromWithReferenceCallGas()","7afbe4f1":"Add(uint256,uint256)","7afc84df":"NKHOIToken()","7afcb524":"foundersBalance()","7afd4762":"auctionPriceLimit()","7afde96b":"isInPreSale()","7afea44f":"kycManager()","7aff5061":"penalizeNode()","7afff425":"reclaimAllocated()","7b01127c":"getValue(bytes32,bytes32)","7b012ff6":"IcoCap()","7b015ff7":"crowd_start_date()","7b02347d":"distributeRef(uint256,uint256)","7b02b2c9":"sendMsg(address,string)","7b02b6de":"initialChargeFee(uint256)","7b0383b2":"initializeDispute(uint256)","7b039576":"setCreditStatus(bool)","7b039bb6":"createVariation(uint256,uint256)","7b03e5f0":"_getUint(address,bytes32)","7b0472f0":"stake(uint256,uint256)","7b04a2d0":"onApprovalReceived(address,uint256,bytes)","7b04b1f8":"prePaidFee()","7b053195":"testItems(bytes)","7b05d785":"redeemTokens(string)","7b069edb":"createNewGame(string,uint8,uint256[],uint256[])","7b06e907":"teamAddressOne()","7b07788e":"removePrecondition(uint256)","7b0862e1":"getLatestSettingId(uint256)","7b0863de":"beginClosingPeriod()","7b088543":"setDollarForOneEtherRate(uint256)","7b0934ab":"KRTR()","7b0a2340":"issueBook(uint8)","7b0a3a8d":"maxRecords()","7b0a47ee":"rewardRate()","7b0a7bf8":"disableContactMint(address)","7b0b5b93":"MannaCoin(address,address)","7b0c15ff":"ApolloSeptemStarted()","7b0de015":"teamTokensAddress()","7b0f6f18":"executeArbitrage(address,uint256,address,bytes)","7b0f94ed":"advisoryEthWallet()","7b103999":"registry()","7b10a1d9":"changeInviteReward(uint256)","7b10b293":"requestMembership()","7b10e717":"received_wei()","7b1278e9":"setStageLength(uint256)","7b129c48":"TrueTHB()","7b12df39":"userProfits()","7b12e074":"getSiringWithId(uint256)","7b144a84":"testFunded(uint256)","7b146f6f":"contributorPoolAddr()","7b15013c":"JPPreICO()","7b151be0":"market_WithdrawWei()","7b16c028":"HumaniqICO(address,address,address)","7b16f7a0":"transferAll(uint256,address,address)","7b1707ee":"sendAliceBlue(address,uint16,uint256,bytes)","7b1760da":"computeCertHash(address,bytes32)","7b17e543":"user(uint32,uint32)","7b1837de":"fund(address,uint256)","7b19bbde":"fundValues(uint256)","7b1a4909":"transferETH(address,uint256)","7b1a547c":"registerAs(address,string,uint256,string,address)","7b1aa45f":"ownerDeposit()","7b1ae67a":"OrganicumOrders()","7b1b0c8a":"isWeekdayInsideTimestamps(uint256,uint256,uint256)","7b1b1de6":"pricePerToken()","7b1bc329":"bountySend(address,uint256)","7b1bd162":"NatureSeedToken()","7b1c5368":"fetchVoteMainInfoForVoter(address)","7b1c6c83":"MangGuoToken(string,string,uint8,uint256)","7b1c88be":"transferIncome(address,uint256)","7b1cbb13":"getChannelValue(bytes)","7b1cdd4f":"withdrawWallet3()","7b1e855a":"setBountyCoin(address)","7b1e8871":"_transferBilrew(address,address,uint256)","7b1f1f83":"SgdToWeiRateSet(uint256)","7b1f337d":"endingBlock()","7b23f37d":"ownerRandomNumber()","7b24343e":"salvageOtherTokensFromContract(address,address,uint256)","7b2454c2":"InvestmentAnalytics()","7b24d867":"TokensImport(address,uint256,uint256)","7b253fe6":"getWithdrawableAmountAS(address)","7b2581c2":"totalPurchase()","7b25aeca":"totalLimitUSD()","7b25de45":"isNewToken()","7b25ec58":"getTierTokens(uint8)","7b2643f2":"receiveNVT(uint256,uint256)","7b266b21":"durationh()","7b26de4b":"newPlayer(address,uint256,address)","7b26ff88":"JuryMemberAdded(string,address)","7b274afc":"stopIco()","7b27739c":"LSCKcoin()","7b283b71":"RATE_TIER1()","7b28aa4c":"orderCancel(address,uint256,address,uint256,uint256)","7b292909":"square(uint256)","7b294495":"lastActiveTs()","7b2abb34":"doProveMemoryRead(uint256,bytes32,bytes32[])","7b2b24e9":"isCurrentOrPastUser(address)","7b2bff9d":"getRobotsForUser(address)","7b2c5148":"catReleaseToPrice(uint32)","7b2c8905":"FailedToClaim(address,uint256)","7b2ca96c":"ProdPresale()","7b2d1b30":"getDragonPriceNo()","7b2d3b27":"getStageDiscount(uint8)","7b2e0046":"createAddress(bytes32,address)","7b2e5086":"withdrawFounderFunds()","7b2feaaa":"blockStart()","7b30074d":"trustedCancelOrderTransfer(address,address,uint256)","7b303965":"getStats(uint256)","7b304179":"createMainNetContract(uint256,uint256)","7b3051db":"get_minimum_trade()","7b30de25":"setConfig(string,string)","7b316db2":"enterBidForCollectible(uint256,uint256)","7b3179bc":"setEconomyParameters(uint128,uint128,uint128,uint128,uint128,uint128,uint128)","7b317ef6":"payoutPendingWithdrawl(uint256)","7b31db17":"intMax()","7b327104":"addBidToStack(bool)","7b32daf8":"contractTimeout()","7b3303b1":"startcrowdsale()","7b33e01a":"increaseApproval(address,uint256,bytes,string)","7b33fa25":"confirmReturn()","7b34203d":"getNumberOfDisputedStepsProPatient()","7b352962":"isFinished()","7b35819f":"setPresaleEndDate(uint32)","7b362143":"inactive_withdrawable()","7b36277e":"tier2Total()","7b367343":"IPv7Token()","7b370a01":"crowdsaleDistributedUnits()","7b37b6a3":"RAXToken()","7b38f391":"p1_white_duration()","7b3941d7":"Redeem(uint32)","7b395487":"voteForUltimateOutcome(bytes32,uint16)","7b3aa441":"contributeWithAddress(address)","7b3ae1f1":"addClaim(string)","7b3bfc35":"setRound(uint256,uint256,uint256,uint256,uint256,bool)","7b3c24ac":"compensate(uint256,address)","7b3ca1c6":"registerNameXname(string,bool)","7b3cf41a":"setExplosivePower(uint256,uint256)","7b3d398f":"getTicketHolderCount()","7b3d9338":"market_is_open()","7b3e2ce0":"BuyTicketUseVaultSeed(uint256)","7b3e5e7b":"amountRaised()","7b3ed808":"withdrawlOwner()","7b3f0fb7":"updateRevertSuspendedPayment(bool)","7b3fdcd8":"removeVerifier(address,address)","7b40b291":"RetractRoutingNS(bytes32,bytes32,uint256,bytes)","7b4126f4":"buyContent(bytes32,uint256,uint256,bytes8,string,address)","7b413985":"tokenValueInEther(uint256)","7b422184":"giveBirth(uint256,uint256)","7b424c0d":"changeRelease12m(address)","7b42f6f7":"intervalAt(uint256,uint256,int256,uint256)","7b436460":"Kubic()","7b436fa4":"garanteSystemDepositInOneFund()","7b43a8e6":"commits(address)","7b43adfb":"checkBalanceContract()","7b449206":"changeClearance(uint256,uint256,uint256,uint256,bool)","7b44eb51":"UPO(uint256,string,uint8,string)","7b464e93":"prescriptions(bytes32)","7b46b80b":"unfreeze(address,uint256)","7b473783":"EcoValueCoin()","7b47457f":"MintTokens(address,uint256)","7b47cb68":"lifeFactor_ii()","7b47ec1a":"burnToken(uint256)","7b48ba20":"testThrowDisownNotOwner()","7b48de6b":"returnTransactionPrices(uint256)","7b4938c3":"LinkNaturePower()","7b49e4c0":"DelphyToken(address[],uint256[])","7b4b5e4e":"changeYUMAddress(address,address)","7b4fcdcf":"GetAccess(address)","7b4fd96e":"token_price()","7b5005e8":"ZRXToken()","7b50a573":"functionOne(uint256,uint256,uint256,uint256)","7b510fe8":"getAccountInfo(address)","7b51c463":"hasDebris(bytes32,uint8)","7b523c35":"request(address,address,bytes,bytes,uint256,uint256)","7b5330a7":"getEntitlement()","7b540dd2":"ChangeHold(address,address,uint256,uint8)","7b54a994":"safeAdd(uint256,uint256,uint256,uint256)","7b550233":"deathData_v18()","7b55c8b5":"scheduleCall(address,bytes4,bytes,uint8,uint256[4])","7b55f66e":"manualCloseBet(uint16,uint16)","7b563e3a":"hourPotLeader()","7b564b7f":"test_insert_updateTail()","7b568081":"trade(address[],uint256,uint256)","7b575b33":"operate(bytes)","7b58120f":"preSaleSecondStartDate()","7b5825d5":"get_amount_buy(uint256)","7b58d46e":"changeWikiID_Name(uint256,string)","7b58d7ee":"Jawn()","7b599b5b":"COOLBTCEXCHANGE()","7b59af16":"registerName(string,address)","7b5a08c5":"TradeList(uint256)","7b5bc2e4":"isVoted()","7b5bd741":"getIdentityWallet(address)","7b5bee1d":"_getItem(uint256)","7b5c7b7b":"privilegedTransfer(address,uint256)","7b5cc75d":"lastDividendTime()","7b5d5d1a":"halvingStartBlock(uint256)","7b5e400d":"recipientsMap(bytes32)","7b5eb564":"approveWithData(address,uint256,bytes)","7b5ecb32":"test_twoValidEqUint2()","7b5f4fc9":"get_all_attender()","7b5f7267":"getTokenPriceUSDWEI()","7b61b201":"getHouseCard(uint8)","7b61c320":"tokenSymbol()","7b627879":"Conference()","7b632c41":"TimestampScheduler(address,address)","7b641fbc":"getMembers(bytes32)","7b647652":"LittleEthereumDoubler()","7b647d72":"BITIC()","7b65d0ec":"initialBuyCard(uint8,string,string,string)","7b663d30":"ChangeClaimAmount(uint256)","7b66c032":"HashBuxICO()","7b66e17f":"getDonator(uint256)","7b680deb":"SpiceUpPrizePool(address,uint256,string,uint256)","7b68533f":"earlybird_percentage()","7b68a8f0":"getPixelColor(uint256)","7b698602":"NEXMESH()","7b69db5c":"increment(int256,int256)","7b6a3e27":"out2Done()","7b6a6f4a":"roundUp(uint256)","7b6a912c":"etherCost()","7b6ae58f":"AMICoin()","7b6b3f46":"preMining()","7b6c0492":"allowanceSubId(address,uint256,uint256)","7b6c4b27":"BidRevealed(bytes32,address,uint256,uint8)","7b6c4dc7":"AgriChainProductionContract()","7b6c7a14":"transferAuthorship(address,bytes32)","7b6ccf85":"LogRefund(bytes32,address,uint256)","7b6d79f1":"cancelBet()","7b6d7a4a":"VoteIntentionSet(uint256,bool,bool)","7b6e7603":"levelClearTime()","7b6e8740":"changeCATDestinationAddress(address)","7b6f5a4c":"getCurrentRoundMinimumTime()","7b6ff689":"setImmediateAllowancePercentage(uint8)","7b70209f":"isBeneficiary()","7b7054c8":"__approve(address,uint256,address)","7b707e9c":"getNumberOfCreatedTokens()","7b70cdcd":"dayFor(uint256,uint256)","7b70ed51":"setAngelDate(uint256)","7b71aec8":"ethPropagate()","7b7330cc":"return_eth()","7b73aef8":"setNote(bytes32,bytes32)","7b73c2ef":"defaultDeadline()","7b74644d":"WKToken()","7b74e5c3":"buyByAddress(uint256,uint256)","7b755373":"amountPercentage(uint256,uint256)","7b75a302":"MatContract()","7b75ea7b":"rewardPayableDays()","7b760537":"updateLatestRevision(bytes20,bytes32)","7b7670f6":"gasForXaurDataUpdateAtBlock()","7b76ac91":"day()","7b775ec3":"wallet89()","7b777517":"teamVestingStages()","7b777ecc":"getMaxReportsPerLimitedReporterMarket()","7b77bbc8":"dyn_call(address,bytes)","7b789b3d":"agreement(bytes,bytes,bytes)","7b7a43eb":"setMINfinney(uint256)","7b7a720a":"chrissycoinToken()","7b7b81c5":"loikikdi()","7b7c343d":"setRequiredConfirmations(uint256)","7b7ccc66":"burnSaleTokens()","7b7d4655":"releaseTokenCornerstone()","7b7d6c68":"setController(address,address)","7b7d7225":"_approve(address,uint256)","7b7d8888":"permanentlyOwnMyCompany(bytes32)","7b7e97f1":"isIncluded(uint256,uint256)","7b807a51":"devTimeLock()","7b80889b":"lockedBalance()","7b80a0ca":"endEarlyStage2()","7b8108c6":"isIn(address,address[])","7b813089":"team4Token()","7b816719":"testToInt(bytes)","7b81c3cd":"claimIcoContribution(address)","7b8208b7":"destroyUselessContract()","7b821410":"createPlotVineyard(address)","7b82d9ee":"canDouble(address)","7b830854":"unlockTokenTransfers()","7b831c30":"isRoundEnded(uint256)","7b834bcc":"marketTime()","7b841eff":"turnOffCanUpdatePercentToTakeAsSeed()","7b84de4e":"StarFishCoin()","7b851f65":"hasIcoEnded()","7b86120a":"foundersReserve()","7b865061":"CAPToken(address)","7b87312a":"timeToOpenPresents()","7b875aab":"addrSale()","7b891cf7":"YBCLiveToken()","7b898c71":"_checkLoanBalance()","7b89a582":"Management()","7b89eef2":"getMyAverageDividendRate()","7b8a1898":"setStore(string)","7b8ac66b":"deliver(uint256,uint256)","7b8b7364":"isAddressVerified(address,address)","7b8b82a8":"createManyProxies(uint256,address,bytes)","7b8bf4fd":"set_fee(uint256,uint256,uint256)","7b8c0e0f":"offlineExchange(address,uint256)","7b8cfbe1":"howManyEtherInWeiToKillContract()","7b8d56e3":"setValue(uint256,uint256)","7b8d771e":"_buyTicket(uint256,address)","7b8d9930":"AxieDependency()","7b8de6d0":"executeTokenFallback(address,uint256,bytes)","7b8e3514":"allowedValidators(address,address)","7b8e7964":"JPGToken()","7b8e8bdd":"modifyCloseTime(uint256)","7b8eeb96":"StarMarket()","7b8f186e":"updateIdx()","7b8f2e07":"addCreature(uint16,uint8,uint8)","7b8fa867":"setAllowedAdd(address)","7b8fac4f":"AC(uint256,string,string)","7b907094":"solidityCompileVersion()","7b926c2a":"IFSBalances(address)","7b929c27":"development()","7b92a2de":"Reservation(address)","7b93253c":"validateClaim(address,bytes32)","7b9358a0":"changeRegistrationStatuses(address[],bool)","7b936934":"artistFees()","7b936ac2":"getCFO()","7b9417c8":"addAddressToWhitelist(address)","7b94ffb5":"grantBounty(address,uint16,string)","7b9504d5":"_isOwner(address,uint40)","7b965785":"EVER()","7b969dcd":"_checkPixelAboveLeft(uint256)","7b97008d":"purchaseTokens(uint256)","7b979b41":"leakEther()","7b97c621":"Transferred(bytes32,address,address)","7b991c1a":"findEmptySlot(uint32)","7b9940b6":"initambassadors_()","7b9a3f4c":"TotalFunds()","7b9a9926":"RESToken()","7b9b9c89":"augmintToken()","7b9c34e0":"requestRN(uint256)","7b9c4756":"SanchitToken()","7b9c5794":"test_YayIsOverSixtyPercent()","7b9c7437":"LUCToken(uint256)","7b9daba8":"wa()","7b9dbf95":"FulfillmentAccepted(uint256,address,uint256)","7b9dc066":"tokenTransfersFrozen()","7b9e5bec":"getAsBytes(uint256,uint256)","7b9e9073":"buyLimitSupplyMin()","7b9f87d3":"Setup(address,address)","7b9fa595":"_getCrowdsaleTokenAmount(uint256)","7ba016d0":"icoDiscountLevel2()","7ba04809":"assertFalse(bool,string)","7ba0e2e7":"mint(bytes)","7ba121ff":"EventBonusPercentChanged(uint256,uint256)","7ba1e407":"tokenBack(address[],uint256[])","7ba201c5":"refundSingleUser(address)","7ba22e1e":"changeWorkerBalance(address,uint256)","7ba36880":"_secondLevelEth()","7ba38916":"changeAdminFromBoard(address)","7ba3c804":"AiEXToken()","7ba3f08d":"grantPermissionTo(address)","7ba46004":"totalRuneWithdrawn()","7ba49b81":"lastMintedTimestamp(address)","7ba4a58a":"addressToken()","7ba5f145":"mod256(uint256,uint256)","7ba64e40":"removeBeneficiary(address,uint256)","7ba70bf2":"gettoken(address)","7ba79848":"processReferral(address,uint256,uint256)","7ba7acc9":"initTokenSale(address,address,uint256,uint256,uint256,uint256,uint256)","7ba7dcea":"setRefundable()","7ba8c064":"VotedEvent(uint256,address,bool,uint256,string)","7ba8c12d":"addWhitelistUser(address,uint256)","7ba992fc":"PeriodicTokenVesting(address,uint256,uint256,uint256,uint256,bool,address)","7baa4524":"emptyRemainingsToOwners()","7baa73c6":"_updateCreditedPoints(address)","7bab59f4":"feedTransfer(address,address,uint256)","7babf021":"RLCOIN(uint256,string,string,bool)","7babfffc":"transferDelegation(address)","7bacd526":"withdraw_admin(uint256)","7bacfb0c":"PresaleEndTimeChanged(uint256)","7badc7af":"gaveVote(address)","7bae0585":"approveMany(address[],uint256[])","7bae3f27":"changeTransferFeeOwner(address)","7bae50e0":"mintGen0Spinners()","7baf5b84":"startUnlock()","7baf71f9":"claimPrizePool(address,uint256)","7bb050cf":"migratePlayerPhrasesData(uint256,uint256,uint256)","7bb0688d":"claimedUsers()","7bb0aefe":"hasAuthoritySignedMainToSide(address,address,uint256,bytes32)","7bb0b3c6":"checkifCapHasReached()","7bb1a312":"transferToTeam(address,uint256)","7bb1efa1":"manualInitializeTreasure(uint256)","7bb20df6":"isExistingBattle(string)","7bb25d60":"withdrawInProgress()","7bb26a1b":"ethFoundDeposit()","7bb305ef":"set_foundtion_addr(address)","7bb31dbb":"calcBetResult(uint256,bytes32)","7bb333d6":"EBankerICO(address)","7bb34a23":"bva(address,uint256,uint256,address)","7bb3546b":"hgs()","7bb3ca86":"addReferralHashrate(address,uint256)","7bb43e6e":"returnUnsoldSafeXLarge()","7bb4493c":"FBI()","7bb476f5":"getAvailableAmount()","7bb4c4da":"nAuditorsAlarm()","7bb55287":"assignRaffleWinner(address)","7bb5e1d1":"Cowboy()","7bb6a4c6":"uno(uint256)","7bb6fc6b":"LoveToken(uint256,string,uint8,string)","7bb7adb6":"hugeContributionBound()","7bb866c1":"GetBoosterCount()","7bb8c4e5":"setCut(uint16)","7bb96acb":"getBlockHeight()","7bb98a68":"balances()","7bb9c776":"ticket(bool)","7bb9dc13":"setPublicSaleWallet(address)","7bba0613":"attackCountry(uint8)","7bbb3a60":"inactivityTimeout()","7bbba97e":"CreateEstate(address)","7bbbd75b":"_getNow0()","7bbbe9fd":"claimGameReward(address,uint256,uint256)","7bbc101b":"distributionStart()","7bbc33f0":"vet(address,bool)","7bbc5c01":"calcRefund(address)","7bbc816e":"UTCToken(uint256,string,string,uint256)","7bbd3f19":"removeLastRace()","7bbf2300":"claimAccountOwnership(string,string,uint256,uint256)","7bbf4a3f":"callers(address)","7bbfb0bd":"startTokenPriceWei()","7bbfbaee":"MAX_SUPPLY_USPN()","7bc046ef":"ClaimRemoved(address,address,bytes32,uint256)","7bc0e005":"setDirectDebit(bool)","7bc0ff20":"setupExportFee(address,uint256)","7bc120c2":"isView()","7bc14a67":"Initial_Supply()","7bc21b6b":"bbAdvisorWallet()","7bc25372":"UserCheckBalance(address)","7bc25da8":"Alaves()","7bc363f9":"serviceTransferOwnership(address)","7bc36e04":"setPrivateSalePrice(uint256)","7bc49a95":"play(uint256,uint256)","7bc4be40":"isGlobalLock()","7bc4d6a6":"testInitial1of3()","7bc58805":"balanceFinney()","7bc5af10":"getAwarding(address,bytes32)","7bc62dc3":"ALD()","7bc69bbc":"getBonusByRaised()","7bc6a02e":"isAutoridadElectoral()","7bc6aa07":"omniTeamAddress()","7bc74225":"getTotalStake()","7bc76388":"test_set_owner()","7bc775db":"GxOwned(address)","7bc835da":"UpdateConfirmed(address,address,uint256)","7bc8649f":"NewTKLNToken(address)","7bc89ae7":"registerNameXNAME(string,address)","7bc9165b":"offchainPayment(address)","7bc94872":"FinishReceivingContributions()","7bc9d4ba":"TielseEendrachtCombinatie()","7bc9eb8c":"p_setSoft_deadline_duration(uint256)","7bca38be":"heartbeatTimeout()","7bcaf585":"checkSignature(string,uint32,string,string,bytes32,bytes32,uint8)","7bcc1ff6":"allowanceInternal(address,address)","7bcc9c6f":"sendBackTokens()","7bcd7fad":"getRecordAtIndex(uint256)","7bcdc2f0":"_forwardApprove(address,uint256,address)","7bcdfd4f":"setEpochData(uint64,uint64,uint256)","7bce366f":"minBlockPurchase()","7bce89cc":"currentMarketRate()","7bd13f08":"recoverAddressFromBalanceProof(uint256,bytes32,uint256,bytes32,bytes)","7bd1a731":"deleteIdentity(string,string)","7bd216c6":"teamAddressThree()","7bd2593d":"XfiniteUtility()","7bd26969":"ChannelNew(address,address,address,uint256)","7bd2bea7":"gem()","7bd352b7":"relay(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32,uint8,uint128)","7bd379b3":"PaymentProcessed(address,uint256,uint256)","7bd3acbb":"pointArrayOf(uint256)","7bd53618":"TaiyuanCoin()","7bd63411":"defaultPercent()","7bd6c0e4":"setMigrationHost(address)","7bd703e8":"getBalanceInEth(address)","7bd7c0ac":"armyDronesCount(uint256)","7bd7c891":"becomeFalconmaster()","7bd85cb3":"LZLTokenDeposit()","7bd95a85":"rewardPoints(address)","7bd97ca7":"editMemeTemplate(uint256,string)","7bd9e8fd":"CTO_SHARE()","7bd9f47a":"Best_Bank_with_Interest()","7bdb7a90":"setCdRate(uint256)","7bdbab0c":"tokenMintInit()","7bdc011e":"Pray4Prey()","7bdc297c":"TimeLockedWallet(address,address,uint256)","7bdc60d9":"getTokenById(uint256)","7bde5628":"addNuja(address)","7bde7fcf":"maxApenSell()","7bde82f2":"redeem(uint256,address)","7bdef3f8":"gameMiningTokenCap()","7bdf9d56":"MANHATTANPROXY5THST()","7be00510":"lastInvest(address)","7be122a3":"isSchoolAllowed(uint256)","7be1e747":"initAddress()","7be266da":"isRegisteredInPreviousEpoch(address)","7be296d8":"filmamount()","7be2d5a2":"setDropNumber(uint8)","7be33b36":"getSoundcoinsAddress()","7be34109":"diffMonths(uint256,uint256)","7be4ce4b":"updateRngAddress(address)","7be4ed55":"fixPayAmt()","7be5b5ae":"setBuyDirectMode(bool,address)","7be68454":"optionsRegistryAddress()","7be6d2de":"transferToContract(address,uint256,bytes,bool)","7be80b39":"forceWithdraw()","7be8352e":"getPixelCount()","7be8630f":"lastHotPotatoHolder()","7be8f86b":"done(address)","7be96b1a":"AAA(address,uint256)","7bea7112":"TheOneToken()","7beb2e1e":"minNumbPerSubscr()","7beccd70":"revokeTransferManager(address)","7becd54a":"destErc20()","7bee30ce":"createSspAndChannels(address,uint256,string,address[],address[],uint256[],address,string,bytes,uint32[])","7bee86d6":"lastImageId()","7beeb945":"isRole(address)","7bef29f7":"BittechToken()","7bf08621":"payTo(address,uint256)","7bf0a8f3":"operationsTokens()","7bf0cd0d":"getTargetBlock(uint256)","7bf0e054":"getLotteryDetailsB(int256)","7bf1648a":"setContract(uint256,address,address)","7bf1a627":"ethToken()","7bf1ca1f":"TransferToken(address[],uint256,uint256)","7bf212f8":"getCondition(uint256)","7bf21aa4":"generatePresaleHouses()","7bf21ab8":"sellPBTTAgainstEther(uint256)","7bf26182":"calculateVestedTokens(bool,uint256,uint256,uint256,uint256,uint256,uint256)","7bf2bb10":"arbiters(address)","7bf3f900":"gameManagerPrimary()","7bf437e6":"transferCoinUserToUser(address,address,uint256)","7bf47cda":"cancelSellOrder(address,uint256,uint256,uint256,uint256)","7bf57ca8":"_taxesDue(address)","7bf5b04b":"processDividends()","7bf5b5d6":"distributeWalletTokens()","7bf6f26e":"setMaintenanceMode(bool)","7bf796dc":"SmartAgreement(bytes,address[])","7bf92690":"changeArrangerFee(uint256)","7bf992ac":"GoodKarma(uint256,string,uint8,string)","7bf9d052":"firstRankForFree()","7bfa6e1a":"gameShouldRestart()","7bfaad96":"addNode(bytes,address)","7bfb0934":"value(bytes32)","7bfbe091":"creatorRejectRequestFundTransfer(uint256)","7bfbfecb":"BurnCoin()","7bfe950c":"withdraw(address,address,uint256,uint256)","7bfe97ce":"IBMISOFT()","7bff0a01":"createRandomZombie(string)","7bff9797":"canTeamKeepingWithdraw(uint256)","7c0012d4":"ZiipToken()","7c0081f5":"petCardSeriesCollection(uint8)","7c0176df":"starUp(uint256,uint256,uint256,uint256)","7c0207cb":"isActiveTranscoder(address,uint256)","7c024fe2":"getNowTimestamp()","7c027ed9":"bonus01Start()","7c02e1ea":"addressChangeBlock()","7c03d6f9":"ApprovalFlower(address,address,uint256)","7c051d47":"seedSaleFinished()","7c052478":"setSports3DContract(address)","7c05ba7a":"accreditInvestor(address,address)","7c05caf3":"testCreateCostAuth()","7c0656ac":"LogEtherBounty(address,uint256,string)","7c06db04":"doManualTrade(address,address,uint256)","7c06eb7c":"IGTRMB()","7c0712ae":"setAdd(bytes32,address)","7c07329f":"returnUserBalance(address,address[2],uint256[8],uint8,bytes32[2])","7c078723":"saleExchangeRate4()","7c08ab5b":"BITToken()","7c098bc3":"getBonusPercent(uint256)","7c0a893d":"blockAccount(address)","7c0ab7be":"setBidding(uint40,uint256)","7c0b2484":"enableInviteOfSU(string)","7c0b582f":"WORLD1Coin()","7c0b8de2":"NFT()","7c0c19b3":"zrcoin(uint256,string,uint8,string)","7c0cc0be":"setActivator(address)","7c0d021e":"CreateIssue(uint256,uint256,uint256,address)","7c0e2a5a":"SetLockDate(uint256)","7c0efb8b":"revokeManagerPermission(address,string)","7c0f6b35":"getAllMembers()","7c0f884b":"SlidebitsTestToken(string,string)","7c0fbc31":"signedTransferCheck(address,address,uint256,uint256,uint256,bytes,address)","7c0ff00c":"WithdrawTokensToBankroll(uint256)","7c1008d5":"getLastTipTime(address,bytes32)","7c108f84":"UBToken()","7c10e00e":"setMinBetForOraclize(uint256)","7c116ec9":"respectRequiredToRecruit()","7c11ef87":"calcUSE(uint256,uint256,uint256)","7c1288b5":"distAgent()","7c129c1c":"voteXId(uint256,bool)","7c12b6f2":"_handleWin(uint256,uint256)","7c12f1a4":"addgamecard(string,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,address)","7c132f2c":"crossForkBlockNumber()","7c134a38":"DetailedERC20()","7c13b331":"OysterShell()","7c13ed68":"setIPGInfo(address,address)","7c153534":"tokenFrom()","7c157d12":"_synthesizeWith(uint256,uint256)","7c1595f2":"setLockupContract(address)","7c161409":"BetexToken(uint256,uint256)","7c163fb8":"myLoveBlocks()","7c170237":"ElectroneumGold()","7c1716af":"payToken(bytes32,uint256,address,bytes)","7c17357d":"totalVesting()","7c17dc02":"AddFish()","7c183b4b":"LogRef(address,address)","7c18a32f":"deductionToken(address,uint256)","7c194295":"BurnableTokenMock(address,uint256)","7c197c09":"fullSupplyUnlocked()","7c19e1f0":"replaceInFrontRequest(address,uint256)","7c1a35d7":"RECYCLE_TIME()","7c1a4ee8":"SITExchanger(address,address,address)","7c1b6afe":"getGrantCount()","7c1b814f":"openCrowdFunding(bool,uint256,uint256)","7c1c05dd":"gapInPrimaryCrowdsaleAndSecondaryCrowdsale()","7c1c7860":"TMEDsalesToken()","7c1e5ced":"transferTemp(address,uint256)","7c1f9d5e":"tokenFeeMin()","7c204c27":"MinerX()","7c21ae12":"activeShareholdersArrayLength()","7c21c7e2":"getToggleOwner(uint256)","7c22232a":"playersPoints(address)","7c236c3b":"confirmStackholderTransaction(uint256)","7c23d1cb":"removeLevel(uint256)","7c2464f3":"startICOTime()","7c24b295":"votedYes()","7c24dfb0":"FundTransfer(address,string,uint256)","7c25d997":"getRarityValue(uint256)","7c25f260":"Government()","7c261929":"query(string)","7c262269":"isWorkFailState()","7c265200":"NameGame(uint256,uint256,uint256)","7c267b07":"Cryptrust()","7c280f44":"generate_random(uint256,string)","7c28ddc1":"fiatPerAssetUnit()","7c2926a8":"getHTLCHash(uint256,uint256,uint256,bytes32,int256)","7c29c514":"AgroeconomyToken()","7c29e89a":"mintUnlockTimeBatch(address[],uint256[],uint256)","7c2b00fc":"SGCL()","7c2b07e3":"EtherX()","7c2b11cd":"arraySum(uint256[])","7c2b606a":"isAddressManager(address)","7c2b8d0a":"votedFreeze(address)","7c2cf543":"ROLCToken()","7c2d2326":"PostIL()","7c2d86f7":"usePluginWhitelist()","7c2da7aa":"setValue(string,uint256)","7c2db5ff":"payoutX(address,uint256)","7c2e08a3":"isMinimumGoalReached()","7c2eb1c8":"distributeEther(uint256,uint256)","7c2efcba":"v()","7c2ffbb3":"returnRate()","7c3064f1":"refundStake()","7c313baa":"buyPriceAtIndex(uint256)","7c31975f":"SolClub()","7c320853":"initialSale()","7c331b52":"FlightDelayAddressResolver()","7c337086":"CryptoDegree()","7c33774d":"CluckCoin()","7c3382ae":"setIcoTokenExchangeRate(uint256)","7c33ebfd":"transferToMany(address[],uint256[])","7c34689b":"ACchainToken()","7c34752f":"stringToSig(string)","7c34e853":"getCombinedTotalHP(uint256,int256)","7c35384f":"addTradeRecord(uint256,uint256,uint256,uint256,address,address)","7c359dc3":"manualTokenTransfer(address,uint256)","7c35b6ed":"setPriceBeforeGoalReached(uint256)","7c35be7a":"isOpen(bytes32)","7c360d1e":"calculate(uint16,uint8)","7c3625e3":"SatoExchange()","7c366cb5":"LADToken()","7c372277":"ReserveTokensHolder(address,address,address)","7c37559e":"CreateGLX(address,uint256)","7c37605c":"startSellingGenes(uint256,uint256,address)","7c377d74":"getForkReputationGoal()","7c38ce18":"tokensIssuedLocked()","7c38ee53":"addContactRecord(string,string,string,address,string,string,int256,string,int256,address,string,int256)","7c396b83":"f6()","7c39759b":"kscBurnWhenMoveToMainnet(address,uint256,string)","7c399142":"ITSToken()","7c3a00fd":"interestRate()","7c3a1d32":"setWithdrawCreator(address)","7c3aef0e":"cardDescription(uint8)","7c3b1e06":"setcompany(string,uint256,string)","7c3ba89e":"early_bird_minimal()","7c3be5fb":"setVernamOriginalToken(address)","7c3bf42d":"applications(address)","7c3c0f89":"eastadsCredits()","7c3c2611":"Retained(address)","7c3c4c83":"ARBITRAGECrowdsale(address,address)","7c3d30fd":"_bid(uint256,uint256)","7c3e50ff":"balanceLocked(address,address)","7c3eef61":"AbyssToken(address,address[],address)","7c3fe278":"endSto()","7c3ffdee":"awardCup(uint8)","7c405325":"unlockTokens(uint256)","7c4057ae":"removeMasterNodes(address,uint256)","7c41de34":"_AwardedMissedBlockBonus(address,address,uint256,bytes32,uint256,uint256)","7c423f54":"getAlerters()","7c4338af":"getEarlyIncomeBalance(address)","7c434fbb":"AT(uint256,string,uint8,string)","7c435e6f":"updateEursPerEth(uint256)","7c436a6d":"ownerEnableRefunds()","7c437918":"addPreSaleBuyer(address,uint256)","7c44066c":"summCashwolf()","7c44546e":"SiliconValleyToken()","7c44f160":"Tier_Starter_Registration()","7c45ef6c":"stringToSig(string,string)","7c46a5e7":"Unhalted()","7c4734f4":"getParticipantsHash(address,address)","7c475ade":"IOV()","7c479343":"investSum()","7c47965e":"isInCurrentGeneration()","7c47ac44":"getProjectVerification(uint256)","7c47df2f":"removeEligibleBurner(address)","7c48bbda":"tokensIssued()","7c48f8e7":"penaltyFraction()","7c4a0552":"freezeBlocks()","7c4a7831":"concludeSeason(int8,uint256,uint256)","7c4aa44c":"saleStartEpoch()","7c4b414d":"depositTokens()","7c4c27c8":"isThisPuritanicalVersion()","7c4cafd9":"startSecondaryCrowdsale(uint256)","7c4d18bd":"setMockBool(bytes4,bool)","7c4d972b":"setRoundEnd(uint256,uint256)","7c4db77d":"saleWallet()","7c4deecb":"checkGameContinues()","7c4e7fbb":"QKL()","7c4ecead":"startPresale(uint256,uint256)","7c4edde7":"withdrawFrom(address,address,address[])","7c4f8958":"SPECIALIST_STAKE_ONE()","7c513a21":"arrIdx2lost(uint256)","7c519ffb":"setTrading()","7c524b2e":"set_sell(bool)","7c52b934":"getTokenOrder(uint256)","7c535f1f":"bonusAmount(uint256,address)","7c54aa1a":"deployCommunityBallot(bytes32,bytes32,uint128)","7c559d5f":"bonusPattern(uint256)","7c567bfe":"isSale(address)","7c56b798":"addProject(address)","7c56d40b":"LogFunderInitialized(address,address,string,uint256)","7c57ad45":"newAsset(string,uint256,string,string)","7c57d947":"tokenMinter(uint256)","7c5817e1":"indexOfProvider(address)","7c582304":"updateInvestmentTotal(address,uint256)","7c58a4ed":"canPlatformFundingWithdraw(uint256)","7c59cb3d":"setCSInterface(address)","7c59f828":"getWizzType(uint256[2])","7c5b4a37":"adminWithdraw(uint256)","7c5b5b06":"lastProcessedVaultId()","7c5bfe81":"INITIAL_EXCHANGEABLE_TOKENS_VOLUME()","7c5c2cef":"nPolls()","7c5ca5a6":"ICOFY()","7c5d4949":"calcInvesting(address)","7c5d7980":"addRC(address)","7c5df29b":"auctionDeklaEnd(address,uint256,uint256,bytes)","7c5e16fd":"MAX_ALLOWED_BY_STAGE_2()","7c5e2795":"INITIAL_PRICE()","7c5e6949":"setlvlUpdate(string)","7c5e83cc":"Bullex()","7c609885":"allowWorkersToContribute(address,address[],address)","7c60fa60":"minReq()","7c612409":"setClient(address,address,string,string,string)","7c61b482":"coinAgeRecordForAddress(address,address,uint256)","7c61d567":"transferRegion(uint256,uint256,address)","7c622a65":"TEBT()","7c623ce2":"boughtWithWhitelist()","7c62965e":"excess_withdraw()","7c62e2a4":"getDog(uint256)","7c63144e":"TokenUsed(uint8,uint8)","7c645c21":"getPlayerLength()","7c64ac43":"vestingEnds()","7c652e26":"CENT_DECIMALS()","7c654303":"isFunded()","7c65452c":"newValue()","7c65f503":"initVault()","7c66ae22":"play(uint256,uint256,address)","7c674695":"MarkedAsScam(address,address,uint256)","7c67fb9f":"MIN_STARTING_PRICE()","7c67fdf5":"bltOwnedAcc()","7c67ffe7":"ownerSetBankroll(address)","7c686c15":"setBonusPrice()","7c68e078":"_createMonster(uint256,uint256,uint256,uint256,uint256,bytes,address)","7c68ec4c":"_compareStrings(string,string)","7c695384":"bet(uint8,uint256)","7c699401":"getAllRevisionIpfsHashes(bytes32)","7c69b5d1":"NewDeposit(uint256)","7c69ef8d":"market2020TokenCreated()","7c6aafd1":"getRegularCarsForVariant(uint256)","7c6ac2af":"withdrawal_Lem(uint256)","7c6b2d6a":"setV_R1(uint256)","7c6b5b10":"amountFirst()","7c6bd3e8":"preGrant(address,uint256)","7c6bd96d":"extendStart(uint256)","7c6db9b5":"changeMinimumWei(uint256)","7c6e19a8":"UpdateTokenDailyExchangeAmount(address,address,uint256)","7c6e481c":"bancorChanger()","7c6e5809":"AEZtoken()","7c6e607d":"SuicideContract()","7c6e94e3":"migrationStarted()","7c6eb7bb":"generateNewRandom()","7c6fa5c2":"attackPrizeRatio(address)","7c6fb02a":"getCrydrViewStandardName()","7c6fb59d":"updateCreditBalance(address,uint256,uint256)","7c6fdec5":"getStrategyTokenPrice(uint256,uint256)","7c6fe7a9":"getAddressIdArray(address,uint256,string,string)","7c709fbe":"mxrjjToken()","7c70b205":"windowLength()","7c70c444":"DOXToken()","7c70e791":"removeInspector(address)","7c70e7fe":"currentRewardReleasePercentageRatePerYear()","7c71c0eb":"getIsProjectBonus()","7c72d868":"sendDividendsEthers()","7c72e273":"auctionFinalize(bytes32)","7c73f846":"getMinimumEndowment(uint256,uint256,uint256)","7c74d4d4":"JCCoin()","7c759d0d":"lock(address,uint256,uint256,uint256,uint256)","7c75c1b4":"distributeWithPolicy(address,uint256,uint8)","7c774111":"OF()","7c77b7c4":"getNumberOfDisputedDealsProDoctor()","7c77fad6":"AddMatch(string,string,uint256)","7c78cb13":"decrementQuantity(uint256)","7c7959e0":"CryptoNumismat()","7c796a83":"setGasUsage(uint256)","7c799e90":"str2bytes(string)","7c79c167":"stageHardcap(uint8)","7c79ebce":"expired(uint64)","7c7a52bf":"newChallenge(uint256,address)","7c7b0ff4":"getRide(uint256)","7c7b13b0":"PlayX50()","7c7c7695":"getAccountID(address)","7c7c7c3c":"SUPER_ADMIN()","7c7ce7df":"mintToPool(uint128,uint256,uint128)","7c7d14cf":"getPawnId(uint256)","7c7d809b":"saleEndUnixTime()","7c7dc098":"early_supporters_distribution(address[],address,address,uint256)","7c7dd391":"TokensWithdraw(address,address,uint256)","7c7ead51":"Wscchain(uint256,string,string)","7c7edd68":"PRHXToken()","7c7eeaa1":"hirerLastResortRefund(bytes16,address,address,uint256,uint256)","7c80bb4f":"getNameByAddress(address)","7c80feff":"getTokenIndicies(address,address[])","7c812015":"HedgeCoinCapitalToken()","7c81ff56":"TGE_SUPPLY()","7c8255db":"sendGifts(address[])","7c82a1d4":"reserveKY()","7c82eff7":"getZero(uint256)","7c831bd9":"rateCoefficient()","7c83b25c":"gettimelineandgoal()","7c83fdf7":"createFiatInvestorRequest(uint256)","7c842e5e":"updatePriceFromRealUnicornPrice()","7c84b40c":"makePrivate()","7c84c69b":"assertEq(bytes32,bytes32)","7c853cc1":"WithdrawFromKickTheCoin()","7c857566":"destructGame(address)","7c858e02":"smallestUnit()","7c85a757":"updateGooConfig(address)","7c85ab3a":"boardMemberCancel()","7c85df24":"setWHaddress(address)","7c871d31":"setIcoDates(uint256,uint256)","7c88e3d9":"mintBatch(address[],uint256[])","7c8af704":"resolveRound()","7c8b1fa2":"ShNShToken()","7c8c2234":"pushMilestone(uint16,string,string,uint64,bool)","7c8c6643":"unhint(bytes32)","7c8d56b8":"numeraiTransfer(address,uint256)","7c8db773":"CSE()","7c8dc575":"rejectConsent()","7c8de59a":"DCM(uint256,string,uint8,string)","7c8e040f":"confirmAtkBossQuest(address)","7c8e17e5":"teamOneTotalPlayers()","7c8e4e25":"credosReserveAccount()","7c8e8e69":"MarkLesterMiranda()","7c8f76a1":"issueTokens(address[],uint256[])","7c8f8278":"setTotalTokenSupply(uint256)","7c8ff8ac":"tokenProof(uint256)","7c905c9f":"preICOprice()","7c9143c9":"_hash(uint256,bytes32)","7c91e4eb":"DISTRIBUTION()","7c92a217":"c_MinFunds()","7c930a10":"ETHERECASHTOKEN(uint256,string,string)","7c935183":"test_deposit()","7c937700":"revokeAllVulnerable()","7c9473f6":"sellNoDecimals(address,uint256)","7c94830b":"kairosOwner()","7c9542bd":"LogWalletUpdated(address)","7c955583":"pendingWhitelistHash(address[])","7c95ef3f":"privatePlacementSupply()","7c9677be":"allocateTeamToken()","7c968f5d":"get_token_data_buyable(uint256)","7c96f680":"MyAdvancedToken(uint256)","7c97479b":"cardSupply()","7c976dbd":"tokenCreationCapOverall()","7c97ffe2":"DeusToken()","7c987ba4":"getMemberPayed(address)","7c989b45":"setBonus(uint256,uint256,uint256,uint256,uint256,uint256)","7c996d9e":"IndiaStocksCoin()","7c99922d":"founderTokensVested()","7c9b0892":"lnUpperBound(uint256,uint256)","7c9b387b":"maximumClaimPriceWei()","7c9c3d89":"mintCoinsForOldCollectibles(address,uint256,address)","7c9cbd38":"changeTeamTokens(address)","7c9cd7df":"changeDeveloper_only_Dev(address)","7c9d564f":"_pRand(uint256)","7c9d8bdb":"getBetsByCategory(bytes32)","7c9f4941":"SplitSend(address,address)","7c9fe2a7":"train2(uint256)","7ca005b3":"generateProof(string,address,address,uint8)","7ca013e6":"getRateToPxlAmount(uint256,uint256)","7ca01b2a":"getTestFour()","7ca1a66c":"resumeLotto()","7ca1cb48":"approveCurrencyTokenAddress(address,bool)","7ca21b37":"setMinPersonalCap(uint256)","7ca24d95":"changeEndTime(uint64)","7ca2795f":"AdvanceQueue()","7ca31724":"tokenId(address)","7ca54248":"lastSaleInHGT()","7ca55e00":"etherandomVerify(bytes32,bytes32,bytes32,uint256,uint256)","7ca5d8fa":"read_u8()","7ca60997":"rewardComment(address)","7ca63061":"LibraCreditNetwork(uint256,string,uint8,string)","7ca64683":"hasFiveStepWithdraw()","7ca823d5":"getAverageChainWork()","7ca828d0":"_canBreedWith(uint256,uint256)","7ca9429a":"getOfferCount(address,address)","7caae38c":"calluseraddress(address,address)","7cab5e8c":"removeApproval(address)","7cac4c7d":"JOY()","7cac9736":"computeResult()","7cad997f":"purchaseByEMONTImpl(uint16,uint256,uint64,address)","7cae6cb5":"determineEdition(uint256)","7cae8509":"delete_blockedAddress(address,address)","7caf3115":"MovieWorld()","7caf59d9":"addPullRequest(bytes32,bytes32,uint128)","7cb04b87":"running_id()","7cb070c7":"OPL()","7cb1442c":"f1(uint256,uint256)","7cb1bb0b":"setOraclizeGasExtraArtwork(uint32)","7cb25bc7":"dividendCount()","7cb2b79c":"setTokenManager(address)","7cb2c15b":"getTXdatabyCode(bytes32)","7cb34d2d":"register(bytes32,bytes32,bytes32,string)","7cb46307":"NewContent(bytes32)","7cb4e22a":"IEIP165()","7cb4ef0e":"getHashRateOf(address,uint256)","7cb51761":"setMaxPayments(uint256)","7cb56698":"rescueLostFighter(uint256,address)","7cb5d0ef":"Airchain(uint256,string,uint8,string)","7cb6a6b2":"generateContract(uint256,uint256)","7cb6b35d":"adjustLimitBetweenIssueAndNormal(uint256,bool)","7cb6cf3e":"ETH_SIGN_PREFIX()","7cb8adc7":"s9(bytes1)","7cb91d84":"slots_left()","7cb97b2b":"set_owner(address)","7cb9cf54":"removeSeller(address)","7cb9da88":"setIncludes(uint256,uint256)","7cba3f04":"PriceWeekThree()","7cbab0cb":"updatewallet(address)","7cbae071":"setPresalePerEth(uint256)","7cbb6934":"generateRandomNum()","7cbba335":"get_order_book_length(string)","7cbbf1da":"proofType_Native()","7cbc2373":"redeem(uint256,uint256)","7cbc4eb6":"lost(uint256)","7cbc6903":"totalBidCount()","7cbcc254":"__reset__()","7cbd3508":"_unpackExpValue(uint256)","7cbd5444":"isPriv()","7cbd9e8d":"existCaller(address)","7cbe0f32":"addOpenAction(string,string,string,string,string)","7cbe9e41":"DANKSIGNALS()","7cbf2bdc":"CapFlexed(uint32)","7cbfb8a5":"TransferTokens(address,uint256)","7cc07974":"HFTCrowdsale(address)","7cc08d53":"partProvider()","7cc0c3a7":"controllers()","7cc0e670":"freezeAccountForContract(address,bool)","7cc1303a":"trade(uint8[2],bytes32[4],uint256[7],address[6])","7cc1c640":"getActualPriceOfCardOnBuyAuction(uint256)","7cc1e28d":"setValidatorRewardPool(bytes32,uint256)","7cc1f867":"getContractInfo()","7cc2fe49":"setResourcesPrimaryManager(address)","7cc35d99":"historyIt()","7cc3ae8c":"endAt()","7cc3b48e":"withdrawKrowns(address,uint256)","7cc3beb2":"acceptArbiter()","7cc48875":"Slots()","7cc49427":"RemoveLock(address,uint256)","7cc4e55f":"lowestAskPrice()","7cc4ef14":"purchaseLand(uint256,uint256,uint256)","7cc589f9":"BlocklancerEmploymentContract(string,address)","7cc666da":"MoratoriumTransfers(uint256,address[],address[])","7cc9e4f0":"registerParticipant(address)","7ccaa9fa":"calcMerkle(bytes32[],uint256,uint256)","7ccc5aea":"DSPParametersChanged(address)","7ccc7e94":"inv_contract()","7ccce851":"isBlacklistedUser(address)","7ccd099d":"test_32_assertGasUsage100Boards()","7ccd3f79":"setAA(uint256)","7ccec110":"TestWorldSnapshot(uint256)","7ccefc52":"minimumMakerProtocolFee()","7ccf0d44":"_setAuctionObj(address,uint256,uint256)","7ccfd45a":"removeSubUser(address)","7cd022d4":"gen0PresaleLimit()","7cd07e47":"migrator()","7cd208b6":"requestRefunding()","7cd30fe3":"MarketingDevelopmentAddress()","7cd3229a":"board()","7cd3969d":"getUnsoldReceived(uint256,address,address)","7cd44272":"getConversionRate(address,address,uint256,uint256)","7cd4559c":"_rewardApprovers(address)","7cd49fde":"_counter()","7cd50577":"setTradable(bool)","7cd64c79":"AdvancedERC20(uint256,string,string)","7cd6a7fd":"setSettings(uint256)","7cd73941":"withdrawBAT(uint256)","7cd7c2bd":"setAnimalMeta(uint256,string)","7cd87ee9":"Libertax()","7cd9b0f8":"userHasHunterLicence(address)","7cda71a6":"preSaleTotalSupply()","7cdbae63":"addRegistryIntoTagsIndex(address)","7cdcc514":"replyThread(uint256,string,string)","7cdcdf23":"RenderTokenCrowdsale(uint256,uint256,uint256,uint256,address,address,address)","7cdd053a":"addRace(uint8,uint8,uint8)","7cdd8419":"getEtherPriceforDapp()","7cddc1de":"checkBonusTokenHoldingPeriodRemained(address)","7cde2a7e":"setCount(uint256,uint256)","7cdee6fb":"buySpaceship(uint16)","7cdef83c":"debtEngine()","7cdf6d0b":"TranslateME()","7cdf8ace":"adminCommand(uint8,address,uint256)","7ce01daf":"rollSystem(uint256,address)","7ce1b194":"ModernTokenPlus()","7ce1db53":"ShowNextCliff(address,uint256)","7ce1e2eb":"releasedBountyTokens()","7ce2432b":"lbrsToken()","7ce26195":"approveGame(address)","7ce2d863":"_calcCheckoutTime(uint256)","7ce335ac":"amountwon()","7ce3489b":"setFeePercent(uint256)","7ce50441":"updateTimer(uint256,uint256,uint256)","7ce52eb6":"distributePrizes()","7ce56303":"deployVestingContract(address,address,uint256,uint256,uint256,bool)","7ce5b85e":"transferBuy(address,uint256)","7ce5f9da":"DIYToken()","7ce645a6":"fundsAreAvailable()","7ce65725":"TEC()","7ce67d60":"initLoan()","7ce6e4ca":"getData_1()","7ce7c990":"transfer2(address,uint256)","7ce7d660":"CAF1(address)","7ce84784":"createtoken(string,string,uint256,address,address)","7ce85957":"setEthCollector(address)","7ce8e196":"test_claim()","7ce901e7":"TestContract(address)","7ceac0b8":"TokenSale(address,uint256,uint256)","7cead212":"dissolvedIndexToApproved(uint256)","7cec3a3a":"getBUS(bytes32,uint256)","7ced3d4c":"validArb2(address)","7ced55c2":"pvpPaused()","7cee8e70":"subTotalSponsored(address,address,uint256)","7cee919c":"getCurrentHash()","7cee9ee8":"placeBet(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)","7cef6047":"getNavHistory(uint256)","7cef6966":"addLaureato(string,string,string,bytes32)","7cefcc52":"burnedCount()","7cefd9f8":"initCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","7cf0ffcb":"forceDivestAll()","7cf12b90":"unFreeze()","7cf12ff8":"registryRequestSerialNumber()","7cf141fd":"removeGlobalAdmin(address,address)","7cf2b9e4":"updateVotingContractAddress(address)","7cf2f670":"Pinakion(address,address,uint256,string,uint8,string,bool)","7cf37493":"finalizeNOK()","7cf4c543":"createTransaction(uint256,address)","7cf52f3c":"getPrevRoundWinner(uint256)","7cf5d66f":"notifyTokensReceived(address,uint256)","7cf5dab0":"increment(uint256)","7cf62838":"EIP20ByteCode()","7cf6babf":"BasicSprout()","7cf6be2c":"createBid(bytes32,address,address,address,uint256,uint256,uint256)","7cf7b9f4":"determineDate()","7cf7e0e2":"VLCCoin()","7cf846c9":"registerManoContract(address,bool)","7cf90fcc":"addItem(address)","7cf99c33":"getIsMigratingFromLegacy()","7cfa1133":"Baxgold()","7cfb1e66":"TeamSum()","7cfb6052":"setPremium(int256)","7cfbc7a5":"setMaxBetAmount(uint256)","7cfe18c0":"internalCalculateEthersWithBonus(uint256)","7cfe19af":"A_Free_Ether_A_Day()","7cfe7a25":"BankhadCoin()","7cff33c7":"setMainSaleParameters(uint256,uint256,uint256)","7d007ac1":"setProposalDuration(uint256)","7d00818c":"allowedAddressesOf(address)","7d00848a":"getSinistre()","7d019f87":"isPreSaleClosed()","7d02bc1c":"getOldest()","7d02db72":"CryptoRUB()","7d036b0d":"finishProofPhase(uint256)","7d0381a7":"notify(address,uint256,uint8,uint8,uint8,uint256,uint256,bool)","7d0385c2":"createPromotionalRenewal(uint256,uint256)","7d03c394":"Logs2(uint256,uint256,uint256,uint256,uint256,uint256)","7d03e603":"GetUserExtraData2(address)","7d03f5f3":"newGame()","7d049675":"fechAllCandidatesByStage(uint256)","7d04d239":"setTokenMintApproveReset(address,address,address,address)","7d051cf3":"getTokensAcquired(address)","7d052a2e":"processReservationContribution(address,uint256)","7d06053b":"perturb(bytes32)","7d065c93":"getPayout()","7d075efb":"withdraw(address,address,address,bytes)","7d087715":"getwithdrawableAmount(address)","7d087f47":"gamblerevent(address,uint256)","7d091a7e":"pct(uint256,uint256,uint256)","7d094533":"announceVictory(string)","7d0981dd":"ModifyMine(address,bool,string,uint256)","7d09f560":"Equio(string,address,address,bytes32,uint256,uint256)","7d0a5e3b":"fightWIthMob(uint256,uint256)","7d0b4c8b":"withdrawEquity(uint256,bool)","7d0b4d60":"migrationEnded()","7d0bc9c6":"tier_action(uint8,uint256,uint256,uint8,uint256,uint256)","7d0bd79a":"publicSaleTokensPurchased()","7d0cf8b5":"Seele()","7d0e6aa9":"BitrootCoin()","7d0e6b6f":"setNextDiscountTTMTokenId1(uint64)","7d0e750d":"getMyTime()","7d0eb9b9":"RemoveVerifiedInfo(bytes32)","7d0f023d":"_deleteBytes(bytes32)","7d0f7528":"getFromList_(uint8,uint256)","7d1108f5":"getAssetData(uint256)","7d112d64":"authenticateVoter(string)","7d1157c8":"rawSendEther(bytes32)","7d1173b0":"DGAMEToken()","7d11f020":"oracleName()","7d124a02":"setRewardAddresses(address,address,address)","7d1286f6":"InterfaceId_ERC721Exists()","7d128d2e":"checkAgentSign(address,address,bytes32)","7d12b689":"checkPoolsDone()","7d136133":"SimpleATM()","7d13a256":"highFundingGoalReached()","7d14500a":"Sukiyaki()","7d14c8df":"setStaleTime(uint256)","7d150529":"countdownTimeLeft()","7d1541ad":"listDapp(string,string,string)","7d1710e4":"saleBalanceOf(address)","7d1842ec":"getPayeeBalance(bytes32,uint8)","7d18a197":"IndoAset()","7d19514d":"addFunds(uint256,uint256,bytes32,uint256)","7d19c777":"Emission(address,uint256,uint256,uint256,uint256,uint256)","7d19e292":"transferTokensToContractOwner(uint256)","7d19e596":"getEscrow(uint256)","7d19ec9d":"getUserAccount(bytes32)","7d1a6e3f":"compareTo(string,string)","7d1b2666":"fibokenCreatedCount()","7d1bd3ea":"setClientSupply(address,uint256,uint256)","7d1ca9fd":"setBeneficiary2(address)","7d1d0553":"convertToMiniUI(uint256)","7d1d7fb8":"settlementFee()","7d1e97a1":"cardTokenAddress()","7d1ea6d4":"m_token()","7d1f067c":"EthBankRoll(uint16)","7d1f561b":"set_pre_kyc_iconiq_bonus_denominator(uint256)","7d2026cd":"distributeWinnings()","7d2044cc":"AuctusStepVesting(address,uint256,uint256,uint256)","7d211c75":"peth()","7d21ce4d":"_Mint(address,uint256)","7d2211d6":"setStatus(string)","7d22e9df":"clearAllocatedAndSalaryTokens(address,address)","7d22f431":"delegatePercent(uint256,uint256,uint256)","7d230dfd":"wedding()","7d236928":"getGenesMarketAddress()","7d2402d6":"inPresale()","7d240b9c":"setLockToken(bool)","7d2429a8":"long_party()","7d242ae5":"setBasePrice(uint256,bytes)","7d24a8a1":"returnToken(address,uint256)","7d24cd18":"onExecuteMessage(address,uint256)","7d25d7cd":"tokensToTransfer(bytes32,address,address,address,uint256,bytes,bytes)","7d263245":"COOLDOWN_TIME()","7d264bad":"adexTeamAddress()","7d268ac1":"ArtworkCore()","7d27ecf9":"phase1TokenSold()","7d287697":"testTryGetUnset()","7d298ee3":"beforeExecute(address,uint256)","7d29beff":"placeVoxel(uint8,uint8,uint8,uint8)","7d29f868":"ChangeUSDto1ETH(uint256)","7d2a0f7a":"isWhiteListedValueValid(address,uint256)","7d2a47b9":"findShareholder(address)","7d2aeb8a":"releaseVestedTokens(uint256)","7d2b9cc0":"setRequiredSignatures(uint256)","7d2c93d7":"validateTypeReference(uint256,bool)","7d2d661f":"genLimit(uint256)","7d2d92ac":"withdrawTheUnsoldTokens()","7d2dfc30":"FourCrowdsale(uint256,uint256,uint256,uint256,address,address)","7d2f42c3":"updateRating(address,bool)","7d309331":"Bitceun()","7d3157bf":"confirmBeneficiary(uint256)","7d320ef8":"proofStorage_IPFS()","7d326635":"getLendingObjId(address,uint256)","7d32e7bd":"transfer(address,bytes32)","7d34c2e3":"setMarketingAndRNR(address)","7d34f5ac":"dailyTotals(uint256)","7d3533da":"ownerSetAllowPublicWithdraw(bool)","7d35f656":"count_customer_deposits()","7d363718":"BitcoinXChainToken()","7d363720":"getCurrentBonusFactor()","7d368f88":"afterEnded()","7d36e478":"ClaimBalance(address,uint256)","7d37fcba":"setManagementContractAddress(bool,address)","7d380265":"addOptionChain(uint256,string,uint256,uint256,bytes32,address,int256[])","7d38a772":"updateDeveloperMiningPower(uint256)","7d394f90":"addMasternode(address)","7d398a86":"SourceChanged(string,string,uint256)","7d3b2d81":"PayXToList(address[],uint256)","7d3bfaee":"withdrawSurprisePotUser(uint256,uint256,uint8,bytes32,bytes32)","7d3c42d2":"EtherBrosMaker()","7d3c5961":"middleTimestamp()","7d3c6da5":"CreateLudumTokens(address,uint256)","7d3d220d":"CitizenOne(uint256,address,uint256)","7d3d6522":"goalReached()","7d3dcbc3":"setTRM1BonusActive(bool)","7d3ee409":"setPatient(string,uint256,address,string,string,uint256,uint256)","7d3fa29e":"addressToGoldDeposit(address)","7d3fcaff":"getMatchReport(uint256)","7d40189a":"timeAdjustPlus()","7d40583d":"setRoleCapability(uint8,address,bytes4,bool)","7d408b44":"getMemberTokenRemain(address)","7d40e9e0":"purchasedAmountOf(address)","7d40eb25":"TITANCORE()","7d4120a9":"insChainToken()","7d41cc60":"modifyAuthorizedCaller(address,address)","7d426826":"INTREPID_VOUCHER_PRICE()","7d42af97":"PrivateSaleEndTime()","7d436d76":"consume(bytes32,bytes32[])","7d443e57":"getInitInfo()","7d445654":"lastLargestHODLERBalance()","7d4504e0":"totalETHraised()","7d451aa7":"zgetOwner()","7d457ac3":"CompensationSentEvent(address,uint256)","7d459c71":"Multiexshares()","7d46702b":"icoCollected()","7d472f1c":"xnotifications(uint256)","7d475c32":"LogAccessPolicyChanged(address,address,address)","7d478407":"gameEncryptedText()","7d47b4e7":"setAIRDROPPrice(uint256)","7d48441f":"_isContract(address)","7d487532":"setMember(bytes32,address,bool)","7d48dcd7":"onPurchase(address,address,uint256,uint256,uint256)","7d49300d":"initGame(address,uint256,uint256,uint256)","7d49e51d":"getSpaceshipUpgradePriceByModel(uint16,uint8)","7d4a899e":"SafeSender()","7d4af159":"marketMakerFee()","7d4c1403":"get(address,address,string)","7d4c258a":"Set(bytes32)","7d4c4a04":"saleStartSecondDayEnd()","7d4cb964":"MAX_ENTRIES()","7d4ce874":"maxInvEth()","7d4cf602":"buildDSBalanceDB()","7d4d3128":"startTransferToken()","7d4d42c5":"_addGraffiti(uint256,string,string)","7d4da754":"CoiinToken(address)","7d4deda1":"setAirLimitCount(uint32)","7d4e1353":"erc20TRFT(uint8)","7d4e1eb0":"stop_game()","7d4f0406":"PPY(uint256,string,string)","7d4f128b":"createLockTokenHistory(address,uint256,uint256)","7d4f1883":"closeMonthlyInvest()","7d50bef3":"account(address,address,uint256)","7d5224d3":"registerNewUser(address)","7d53223a":"setVestingReleasedAmount(address,address,uint256)","7d53409a":"setMaxbonds(uint256)","7d534aa0":"disableCharity()","7d549e99":"totalTokensMinted()","7d54a3ba":"CROWD_WAVE1_PERIOD()","7d55094d":"toggleMinting()","7d55758f":"underMint(address,uint256)","7d55923d":"click()","7d55f64d":"fixedFeeInWei()","7d564056":"getUserProperty()","7d564f11":"setsystemprice(uint256)","7d574678":"setICOIsFinished()","7d57a85c":"preIcoFinish()","7d57edf3":"HOPE(uint256,string,string)","7d580939":"_HOLDersPayRoll()","7d58eb76":"hasResolver(string,address)","7d59a938":"month6companyUnlock()","7d5a9b41":"init(uint256,uint256,address,uint256,uint256,uint256,address,uint256)","7d5bc9fe":"Account_balances(address)","7d5c1914":"getWalletInfo(address)","7d5db5e0":"Dagelas()","7d5dc538":"getToJackpot(uint256,uint256)","7d5dec2a":"multiplex_remove(address)","7d5f66f2":"mintBounties()","7d5fbcab":"setMystr(string)","7d5fec5a":"setOwner(uint8,uint8,address)","7d606100":"BetOverlap()","7d60b6ce":"setCommissionWallet(address)","7d60e291":"FIFTY_THOUSANDS_LIMIT()","7d60e343":"getFileListSize()","7d619d9b":"holdCoin(address,address)","7d61b9fe":"intervalsCount(bytes32)","7d61de37":"foundersRewardTime()","7d620130":"getCardCount()","7d635502":"buyEgg()","7d636d9b":"refferal(address)","7d63a93a":"REKT(uint256,address)","7d64bcb4":"finishMinting()","7d652335":"changeAssetsState(bool)","7d656a72":"NewPost(bytes32,uint256)","7d65b2f7":"hasCompleted()","7d65e3fe":"totalInterestCycles()","7d661e3c":"giveToken(address,uint256,string)","7d6651b9":"claimEthIfFailed()","7d683b95":"unsoldUnlockedAt()","7d684a9d":"RENEEKROM(address,address,address,uint256,uint256,uint256)","7d68582a":"manuallyExchangeContractPreDGZtoDGZ(address,uint256)","7d68bee7":"LogPollDeleted(bytes32)","7d692faf":"readMailByAdmin(uint256,bytes16)","7d6979e7":"canBeChanged(uint256)","7d69880b":"addBalance(uint256,uint256,uint256)","7d69f335":"changeColorRed()","7d6a59ed":"getInvoiceCount()","7d6a5f7b":"requireNotPaused()","7d6ad4cd":"triggerAutorelease()","7d6b4278":"outcomeState(address,uint256,uint256)","7d6bc260":"maxTiers()","7d6c1ff1":"addMake(address,uint256,uint256)","7d6c8388":"INVECH(uint256,string,string)","7d6c864e":"withDrawable()","7d6cf2df":"get_deploy_fee()","7d6d28ef":"setComisionInTokens()","7d6dc737":"getBylawsMinTimeInTheFutureForMeetingCreation()","7d6e061c":"getFinishDates()","7d6e3751":"_addVouchers(address,uint256)","7d6ebe94":"setDoubleClaimSegmentSlashAmount(uint256)","7d6f0d5f":"changeFundsWallet(address)","7d6f174e":"invalidateSignature(uint8,bytes32,bytes32)","7d6f3781":"userChallenge()","7d6fb089":"setBGXTokenInterface(address)","7d7106ad":"_updateStats(uint256,uint256)","7d71a19b":"setAccountInfo(address,address)","7d720296":"airSender()","7d722a30":"Funding_Setting_cashback_before_start_wait_duration()","7d72aa65":"addRole(address,string)","7d736d0d":"weekPotExpiration()","7d7452aa":"DSVCoin()","7d7714fb":"coinAllowance(address,address)","7d7786a3":"GetGuestName()","7d77c8f9":"allowTransferBetweenUsers()","7d780e2a":"blocked_amounts(address)","7d78b94d":"claimNihilum()","7d78ef4a":"BKKToken()","7d790630":"setContractFrozen(bool)","7d79265b":"REDEEM_METHOD()","7d79c192":"awayTeam()","7d7a1a80":"UCToken(uint256,string,string)","7d7a31b6":"max(uint64,uint64)","7d7a3a1a":"bittravelxToken()","7d7a9ca4":"MachineToken()","7d7b0099":"API()","7d7b2051":"finalizeExits(address)","7d7be90f":"Splitter(address[])","7d7c2a1c":"rebalance()","7d7c7258":"adminSendMoneyToUser(address,uint256)","7d7ca00c":"JSONpath_int(int256,string,string,uint256)","7d7d4a68":"start_service(address)","7d7e5e3d":"setFlagPair(uint256,bool,bool)","7d7eee42":"setPreSalePrice(uint256)","7d7f0050":"TradeEnabled(bool)","7d7f1699":"freeBet(address)","7d7fa215":"getSaleData()","7d7fef7e":"receivedEtherFrom(address)","7d802655":"delLimitedWalletAddress(address)","7d80def3":"setENDPhase()","7d81d62f":"doGroupRefundPayoutsSuccess(address[])","7d820414":"GeXCHANGE()","7d82bf73":"getBonusTokens(uint8)","7d836281":"getBetState(address)","7d83e527":"PensionCoin()","7d851a13":"signerIsWhitelisted(bytes32,bytes)","7d851c70":"getTokensBack()","7d85445d":"EducationToken()","7d85facd":"transferred()","7d862a7e":"changeDutchIdxAddr(address)","7d87bb7b":"HATCHING_COST()","7d87e97d":"makeMemberOfGroup(address,uint256)","7d882097":"totalDeposits()","7d882e9b":"resetWinner()","7d886976":"testMintGuyAuth(int256)","7d8966e4":"toggleSale()","7d8978db":"addCasino(uint16,uint256,string,string)","7d897ccd":"KPCSAdministrator()","7d89ae63":"__findRef(string)","7d89f040":"AddAmount(uint256)","7d8be627":"activateLineItem()","7d8c0c7c":"adminSetRegisterCost(uint256)","7d8ccd59":"debug_uint(uint256)","7d8cfd1a":"flag_hash()","7d8d4878":"updateETHEUR(uint256)","7d8f442e":"getPrice(uint40)","7d8f94a0":"slackUsersCap()","7d8fcfb4":"transferSuperAdminOwnership(address)","7d8fe090":"REFERRAL_BONUS_LEVEL5()","7d902311":"gameGiftLineTime()","7d917fcb":"Registered(bytes32,address)","7d919a43":"tohash(bytes32,address,address,uint256,uint8,bytes32,bytes32)","7d91da87":"buyPixelTokenFor(uint24,uint256,uint24,address)","7d9201cc":"rspToken()","7d921af0":"disableTimelock()","7d92561d":"NewBuyer(address,uint256,uint256)","7d92654c":"endRoundAndStartNextRound()","7d92bb6e":"getClaimKeys()","7d92f6be":"goldRegistry()","7d9375b8":"authorizeContract(address,string)","7d9383c3":"valid_creature(address)","7d93ccdf":"Halo3DDoublr(uint256,address)","7d940912":"addArea(uint256,uint8,uint8[],uint256,string,uint256,bool,uint32)","7d94792a":"seed()","7d94d4aa":"SergeToken()","7d95dcd7":"createPromoArtwork(string,string,uint32,address)","7d961218":"REGTMProc()","7d96f693":"getDepositAmount()","7d97597d":"DEFAULT_AUCTION_LENGTH()","7d97b1f6":"VestingScheme()","7d98ebac":"exchange(address,address,address,address,uint256,bytes)","7d9a4e2c":"safeToMultiply(uint256,uint256)","7d9a9046":"resolveDisputeBuyer(string)","7d9a9096":"icoFinishedAt()","7d9c68f7":"getUserBattleValue(address)","7d9d4bed":"secondStageEnd()","7d9d972d":"guardian3Vote()","7d9e5243":"BonusAmountUpdated(uint256)","7d9f298e":"setLockedState(bool)","7d9f6db5":"auction()","7d9f8cf2":"startFirstStage()","7d9fb742":"fourthRoundPercent()","7d9fc342":"PreICODays()","7da028d6":"SaleCompleted(address,uint256,uint256)","7da0389d":"referralProgram(address[],uint256[],uint256)","7da0399a":"CloseAuction(bytes32)","7da0e079":"_closeMotion(uint256)","7da16762":"executeParentDaoSplit()","7da208aa":"deleteArrayAddress(bytes32,uint256)","7da21a1a":"WaltonToken()","7da25928":"announcedTimeStamp()","7da3400b":"_contractExists(bytes32)","7da39157":"poWtfContract()","7da3c3ab":"revert()","7da3e219":"testInitialTokenBalance()","7da3f613":"lockAddress()","7da40b65":"isPlatformOrSupportManager(address)","7da4d24b":"activationOpen()","7da5efc8":"drop(address,address[],uint256[])","7da63c59":"changeValuePerToken(uint256)","7da7a437":"Clinicoin()","7da7d5ab":"nextGameRakePercent()","7da81364":"getProposalAction(uint256)","7daa10ce":"getMyInfo()","7daa9fcd":"buyGems()","7dab61b6":"setBlack(bool)","7dab84d8":"ShowTestU(string,uint256)","7dabb4d6":"addKycVerifiedInvestor(address)","7dac0547":"VIRGOToken()","7dac9048":"addArgumentToRequestUint(uint256,bytes32,uint256)","7dae6e95":"noOfTokenAlocatedPerICOPhase()","7daeef25":"objectTome()","7daf06fd":"withdrawPart(uint256)","7db0799f":"EnduranceToken()","7db12abc":"contractorWithdraw()","7db1c36f":"setFeedBackFee(string,uint256)","7db2cff8":"old_address()","7db33f99":"setLeaseCard(uint8,uint256,uint256)","7db4149d":"RegisterTokenTransaction(address,uint256,address)","7db42b6c":"AutoBusinessFinance()","7db45975":"register(uint256,uint256,bytes32,string,bytes32)","7db48416":"_getMinions(uint256)","7db6a91d":"checkDeck(uint8[],bytes32,bytes32)","7db6cbfc":"_addDefaultOperator(address)","7db724b6":"MAIN_QUESTION()","7db7c239":"tranchesPayedOut()","7db8782a":"uint256At(uint256,bytes,uint256)","7db91595":"setOwnedBonus()","7db9743b":"Registry()","7dbb82a8":"setLicenseTermsRegistry(address)","7dbbc0cd":"EliteShipperToken()","7dbbf2e6":"RecallTokensFromContract()","7dbc1d6f":"modifyPrivateList(address[],bool)","7dbc827b":"vestingWithdraw(address,uint256,uint256)","7dbc9fba":"amendClaim(uint8,uint8,uint8,uint8)","7dbd0139":"softCapOk()","7dbdab18":"CreatedAngel(uint64)","7dbdc2eb":"getQueryPrice()","7dbdf168":"EtherBetIO(address,address)","7dbecc54":"EDColiseum()","7dbece3c":"usdCurrencyFunding()","7dbedad5":"createReward(uint256,uint256)","7dbf1fe6":"Towers(uint256)","7dbf67a7":"setDebt(uint256)","7dbff420":"donationUnlockTs()","7dc0015d":"centToken()","7dc09e4a":"getRequestedProducts()","7dc0d1d0":"oracle()","7dc0d451":"CHINESE_EXCHANGE_2()","7dc10df5":"Jackpot(address,uint256,uint256,uint256)","7dc2268c":"minting()","7dc28eb2":"LOCKAMOUNT4()","7dc379fa":"getTicket(uint256)","7dc45e27":"setCryptoMatchValue(uint256,string)","7dc4feb7":"setConstraint(bytes32,address,address,uint256)","7dc5cc64":"getTotalDivis(uint256)","7dc5cd32":"_patternToNumber(bytes)","7dc673bc":"closeRegistration()","7dc6c3d9":"deactivateAdSlot()","7dc7363b":"LogNewTemplateProposal(address,address,address,uint256)","7dc74473":"tokenPrivateMax()","7dc79375":"delOracle(address)","7dc7c5a5":"debug1()","7dc7f7c4":"Pitcheum()","7dc8c73e":"canTokenUnlocked(uint256)","7dc8e069":"shorten_end_block(uint256)","7dc8f086":"getOutcomeCount()","7dcaf720":"getReadme()","7dcb422e":"setPresaleStartDate(uint32)","7dcb6b92":"testegy()","7dcbd078":"thirdPay()","7dcc3f0c":"LukapToken()","7dccd4d6":"setIndividualCertificate(string,bytes32,bytes32,bytes32)","7dcd17d9":"sumHardCapICO1()","7dcd277b":"SimpleTingToken()","7dcda7df":"initiateProviderCurve(bytes32,int256,int256[],address)","7dcdace2":"Deposit(address,uint256,uint256,bool,string)","7dce4595":"sendToken(address,uint256,string)","7dce6bdb":"freeCrawDeadline()","7dce8461":"GSENetwork()","7dce8dd4":"GenesisSalesCount()","7dcfb801":"veryAngry()","7dcfd3d5":"blockTransfers()","7dd003f1":"test_chain2_4()","7dd02c8e":"transferETHFromContract(address,uint256)","7dd07097":"tgeSettingsPartProject()","7dd0d61c":"check_hash(address,bytes32,bytes32)","7dd10e4f":"newUsers()","7dd15d40":"getData_13()","7dd1f126":"optionTaker(bytes32)","7dd256ff":"PATToken(address)","7dd26660":"getMegaboxIndex()","7dd2899f":"changeDividentContract(address)","7dd2e993":"removeTenant(uint256)","7dd3cf54":"ChangeCostByManager(uint256)","7dd45999":"lockDomainOwnershipTransfers()","7dd563c3":"setMainSaleParams(uint256,uint256,uint256,uint256)","7dd56411":"ownerOf(bytes32)","7dd91734":"compositeReputation(string)","7dd9d27f":"exiteEntidad(address)","7dd9f846":"buyCard(address,uint256)","7dd9fcf7":"latestprice()","7dda48a5":"WhatTimeIsNow()","7ddaa56a":"tokenContributionMin()","7ddb3c00":"total_pay_claimed()","7ddb5e65":"votingReward()","7ddbf0ed":"setLockedTokenAddress(address)","7ddbf1a7":"passFundsToTheTeam()","7ddc02d4":"isOwner(address,address)","7ddcbfd9":"TegTokensSale(uint256,string,string)","7ddd0ce1":"getBetDivisor(uint256)","7ddd130f":"PRBCoin()","7ddd20ba":"getRequiredStateNumbers(uint256)","7dddb66f":"collectOwnRew()","7dde0138":"modifySupplyLimit(uint256)","7ddfffbf":"mint(address,uint256,uint256,uint256,uint256,uint256,uint256)","7de06cfc":"startTge()","7de09476":"getSpecificBuyerTransaction(address,address,uint256)","7de0cc65":"preMcFlyWallet()","7de14129":"approveInvestor(address)","7de1a631":"confirmETH(bytes32)","7de295d2":"withdrawalsCTR()","7de2d523":"setbonus(uint256,uint256)","7de2e95c":"TransferCow(address,uint256)","7de2fe4d":"linkToMasterWalletInternal(address,address)","7de32b17":"CuratedTransfers(address,address[],address[])","7de36138":"setPreICO(address)","7de47b3f":"fundingGoalUSD()","7de4800f":"withdrawEscrow(bytes32)","7de480c6":"aiurExchangeOracle()","7de4ceb2":"DebugValue(string,uint256)","7de50c44":"TIME_LOCK_END()","7de548d8":"releaseStake(uint256,address,address)","7de576cd":"vote(uint16,uint256)","7de5ad89":"setJntController(address)","7de6c905":"LetItPlayToken(address,address,address,address,address,address,address,address)","7de77700":"bytes32ToBytes(bytes32,bytes32[],bytes32)","7de7a18d":"setShare(address)","7de7ea78":"TokenHNC(uint256,string,string)","7de7edef":"changeMasterCopy(address)","7de8bb63":"Commons()","7de976dc":"amountFundHolder()","7de9f212":"colorfilter(uint256)","7dea9118":"setIdentityName(bytes32)","7deb6025":"buy(uint256,address)","7debb959":"calculateAllocation(address)","7dec2299":"getStagesInfo()","7dec3d35":"FOUNDERS_WALLET()","7dec4ce8":"SettleBond(uint256)","7ded2210":"setPreIcoCap(uint256)","7dee2cad":"CancelMyInvestment()","7def2fdf":"changeStakeRate(address,bytes32,uint256)","7def7351":"teamTokensFirstShare()","7df02c0e":"getLinglongCat(uint256)","7df042a2":"totalRegularTokensSold()","7df19a78":"BetPlaced(address,uint256,uint8)","7df1f1b9":"borrower()","7df23b6a":"ReleaseOracle(address[])","7df2e3e3":"getRcdExchange(uint256)","7df38c5b":"wad()","7df3a229":"PissToken()","7df432c9":"minSelfBuyPrice()","7df4732e":"seeZombieStar(uint256)","7df47407":"SigProof()","7df4c235":"kolidat()","7df52ba8":"Arbitrate(uint32,uint32,bool)","7df545c7":"MaximumSellableTokensChanged(uint256)","7df54c73":"setMiniPoolEdit_4(string)","7df5f4ae":"_upper(bytes1)","7df65a1d":"getMinersByAddress(address,address)","7df68a8b":"addPeriod(uint256)","7df73e27":"isSigner(address)","7df7ec18":"test_invalidEmptyEqVal()","7df82cc9":"veztUsers(uint256)","7df83cd0":"getDepositWithdrawList(address,uint256[])","7df841cd":"setPlayerVirusDef(address,uint256)","7df855f2":"getAuditAddress(address,address)","7df8833a":"createEvent(string,uint256,uint32)","7df9bb31":"heredar()","7dfa0b3f":"canSell(address,uint8,uint8)","7dfa7d79":"claimUnsoldTokens()","7dfac5a2":"accMinterOne()","7dfb0ba5":"getRecordOffers(address)","7dfb6626":"withdrawRewards(bytes32)","7dfbc19c":"HaltTime()","7dfbdf6d":"returnFundsFor(address)","7dfc64ca":"getTotalBudget()","7dfce5e9":"withdrawExcessReserves()","7dfce6d7":"MAX_INTEREST_AMOUNT()","7dfda44c":"AssignAddress(uint256)","7dfe1674":"CTB(uint256,string,string)","7dfe4302":"privateSaleTokens(uint256,uint256)","7dfe7741":"InviteAccepted(address,address)","7dfebff3":"addEth(uint256,uint256)","7e007c1e":"minimumWEI()","7e00d6d6":"enablePurchase()","7e00d77a":"mintExtendedTokens()","7e01c088":"removeWhitelistedAddr(address)","7e029bde":"setEthUsd(uint256)","7e02bb0f":"finish(address,address,address)","7e03ad1a":"numImports()","7e057b8e":"IYMAYA()","7e06ec93":"MDOSToken(address,address)","7e070df6":"rootOwnerOf_(uint256)","7e07877a":"hasFailed(address,uint256)","7e080911":"TRUEToken(address)","7e08a846":"tokenCollectedOf(uint256,address)","7e09d09b":"theFloatMultiplier(uint256)","7e09f0aa":"predictMarket()","7e0a16b1":"forwardAllRaisedFunds()","7e0be7e3":"upgradeGooCost(uint256)","7e0c1792":"oracle_address()","7e0c240d":"LianJieToken()","7e0cfc3d":"truncate(uint8[],uint8)","7e0d149e":"getGameAddresses(uint256)","7e0d8b27":"leekStealToday_()","7e0e20ba":"HighGasAmount()","7e0e471d":"Licensium(uint256,string,uint8,string)","7e0f7a87":"getUnixTimeStamp()","7e1028b2":"_doTradeWithEth(address,uint256,address,uint256)","7e1055b6":"icoEndTime()","7e111f59":"sell_toContract(uint256)","7e11f453":"ETH_Rate()","7e12180e":"setSaleDuration(uint256)","7e133564":"donateDna(address,uint256,uint8)","7e13b0be":"changeTokenDecimals(uint256)","7e150d66":"maxTxSize()","7e1629ab":"token_transfer(address,address,uint256,bytes,string)","7e167198":"_preValidatePurchase(address,uint8,uint256)","7e168086":"preallocate(address,address,address,address)","7e16cfde":"getGameBlockNumber(uint256)","7e16eca0":"getContractTimestamps(bytes32)","7e1721ee":"LMAOtoken()","7e179816":"setRefShare(uint256)","7e18dd21":"motodoughToken()","7e1934f9":"swpFund()","7e199b70":"startCrowd(uint256,uint256,uint256)","7e1a6753":"Destruct()","7e1ab812":"utrToken()","7e1b52f6":"doftManager()","7e1c06b6":"newOwner(uint256)","7e1c0c09":"totalTokens()","7e1c4205":"query2(uint256,string,string,string,uint256)","7e1cae40":"changeRefundToken()","7e1cb559":"members(bytes32,address)","7e1cd79c":"Voting(bytes32[])","7e1db495":"addPendingWithdrawl(uint256,address,bool,bool)","7e1db516":"init3_block_height()","7e1e06ea":"EventTransferWasReset()","7e1e1ff6":"Giorgi()","7e1e447e":"total_wins_count()","7e1f2bb8":"createTokens(uint256)","7e1f89c8":"PRE_SALE_START()","7e20e7c0":"getRegistryDataMinter()","7e2224bd":"compress(bytes)","7e23f7cd":"teamKeepingLockEndBlock()","7e241c64":"getServiceNameByAddress(bytes32,address,address)","7e241dbf":"unlockMiner()","7e245fac":"PHXTKN()","7e24cb8f":"reservedFundLeft()","7e25ac5b":"destroyRewards()","7e25b7d6":"implements(address,bytes4)","7e266385":"setPrefix(uint8)","7e26639f":"saleLimit()","7e27133f":"tradingMonDataContract()","7e274f7e":"Reederem(string)","7e288822":"pendingWithdrawal()","7e298249":"setPriceInWei(uint256,uint256)","7e29d2a3":"TokenCoin4()","7e29dad0":"testBuyExceedHardLimit()","7e29f242":"changeDiscount(uint256,uint256,uint256,uint256)","7e2a0141":"removeToken(address[16],address,uint256)","7e2a6db8":"trusted()","7e2ac454":"disagree(bytes32,bytes32,bytes32[])","7e2bc821":"SaturnPresale(address,address,uint256,uint256,uint256)","7e2bef39":"calldata(uint256)","7e2bf3c6":"freezeCreditScore(address,uint256,string)","7e2c0459":"_transfer(bytes32,bytes32,uint256)","7e2c83fc":"seriesByAddress()","7e2ce380":"_calculateOwnerCut(uint256)","7e2e3958":"setBUS(bytes32,uint256,string)","7e2e756e":"testToUint32()","7e2f014f":"addResolversDelegated(string,address[],uint256[],uint8,bytes32,bytes32,uint256)","7e2f6e3b":"getReserveSupply()","7e2fc2b6":"_Crowdsale(address,uint256,uint256,address)","7e2fdb0c":"dataForBuy(address)","7e2ff5f9":"setPreSale()","7e300fc6":"crowsaleShare()","7e31c53a":"HodlWithdrawn(uint256,address,uint256)","7e32456d":"STRC_SUPPLY()","7e327168":"allocatePresaleTokens(address,string,uint256,string)","7e32a592":"repairTheCastle()","7e32baea":"TRIPToken()","7e32fc47":"registerAsset(string,bytes32)","7e331a99":"setUserMessage(string)","7e33e361":"setRowQuiter(bool)","7e340b01":"getLatestPayday(address,address)","7e342507":"gameIndexToBuy()","7e3475a8":"lockQtyToAllowTrading()","7e347b82":"REALCrowdsaleMock()","7e34dbe0":"deposit(uint256,uint256,uint8,bytes32,bytes32)","7e363ffa":"setupCost()","7e36edce":"RATE_DAY_28()","7e373bc0":"bulletAmount()","7e380099":"addOrgCertificate(string)","7e38b424":"reverseFiatPurchase(uint256)","7e38d065":"ADVISORS_AND_CONTRIBUTORS_TOKENS()","7e39082f":"escrowedMYB(address)","7e3bfa1d":"removeRecoveryAddress(address)","7e3d15ae":"nextHolder(address)","7e3d45ef":"gameMiningToken(uint16)","7e3d8813":"setup(address,uint256,uint256,uint8)","7e3da027":"approveAndCustomCall(address,uint256,bytes,bytes4)","7e3dbf96":"addr(bytes,bytes)","7e3df726":"EZEtherMarketplace()","7e3e40ec":"getRequiresKing(bytes)","7e3e7bdf":"checkReward(address,uint256,uint256)","7e3ef7cd":"getMyBalance(address)","7e3ef935":"setReleaseMake(uint256,bool)","7e3f2b2d":"getDocumentSignsCount(uint256)","7e3f5b70":"JFBToken()","7e3faec1":"GoldTxFeePool(address,address,bytes)","7e402eb0":"setSecondAdmin(address)","7e410427":"aDay()","7e4115ba":"toAddress(string)","7e4241b4":"ownerTake(uint256,address)","7e429f02":"burnMultDen()","7e42be1a":"quarantineAddress(address)","7e42f8b4":"setRefund(bool)","7e42f94d":"horsePr(uint256)","7e43185a":"showCollectorsAddresses()","7e4358c3":"used_in_contract_fees()","7e43828e":"bountyTokenWithdrawal()","7e441048":"hasCategory(address,uint256,uint256)","7e445d44":"setEndICO(uint256)","7e456808":"reclaimUnusedEtherBalance()","7e457b85":"startEarlyStage3()","7e458492":"addInspector(address)","7e45d15c":"___coinAddress()","7e466bb4":"forTeamCOT()","7e470882":"setStrF1(string)","7e482379":"totalEthInWeiForSecondIco()","7e4929c4":"priceBox2()","7e4930ae":"modifyCap(uint256)","7e495dae":"changeMinters(address,address,address)","7e4985c5":"LookUpAvailableDivLarge(address)","7e49aa05":"testSelfdestructIsRevertedWithMinReturn()","7e49d530":"fechVoteMainInfoBySnapshotBlock(uint256)","7e4a1731":"returnWallet()","7e4a82b1":"foreignBuyTest(uint256,uint256)","7e4b5eb5":"getPhControlLimits(bytes32)","7e4c3b2e":"requestRate(string,string,bool,uint256,uint256)","7e4d25c5":"Refundably_if_gasprice_more50gwei_Send_Votes_From_Your_Balance(address,uint256)","7e4d4495":"getEthCapPerAddress()","7e4d4653":"echoTest(uint256)","7e4d5ea1":"STARTDATE()","7e4e95d7":"airDropPercent_()","7e4eb35b":"left43(uint256)","7e4f1a9f":"AKMJCHAIN()","7e4f6b95":"MyAdvancedToken(uint256,string,string)","7e4f9397":"gSetAlive(bool)","7e4fdd0b":"SetherStarted()","7e545305":"firstBalance(address)","7e5465ba":"approve(address,address)","7e549814":"setEscrowedProjectPayees(uint256,address)","7e54b8e2":"AddCandidate(string)","7e551b75":"hashOf(uint256)","7e55a212":"JustTheTipCrowdsale(uint256,uint256,uint256,address)","7e55a311":"getPurchaseSeconds()","7e55b83c":"readValidDate(uint8)","7e55ec25":"CryptoPokemon()","7e569e66":"TDEContributorCount()","7e56d25f":"ReplyShare(uint256,string,bool,string)","7e56fde5":"calculateEggBuySimple(uint256)","7e5713d9":"setGenesisAddressArray(address[])","7e574098":"confirmEthTransactionRequest()","7e575524":"poolMintAmount()","7e577274":"onAuctionEnd(bytes32)","7e580d30":"ZCrowdsale(uint256,uint256,uint256,address,uint256,uint256)","7e58f815":"pauseRoundA()","7e59092e":"getVersionById(uint256)","7e5912d7":"reputationHashSubmissions(address)","7e59d513":"deathData_f1()","7e5a4dde":"getMarriage(uint256)","7e5a66df":"uniqueSpinnerOwners(uint256)","7e5a9ed9":"updateHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[])","7e5af26c":"BugisContract()","7e5b1cdd":"GOToken()","7e5c344a":"Upgrade(address,address,uint256)","7e5c86a2":"moveFundToOwner(uint256)","7e5cd5c1":"disableMinting()","7e5e190c":"getBaseTypeStats(uint256)","7e5fc6f4":"calculateIcoBonus(uint256,uint256,uint256)","7e600c87":"doSend(address,address,address,uint256,bytes,bytes,bool)","7e602078":"assertInvalidState(address)","7e60a4bf":"removeLockFunds(address[])","7e61c768":"isClient(address,address)","7e61e6ef":"GasWar()","7e621667":"sendFromOwn(address,uint256)","7e626e58":"getUnPurchasedProducts()","7e62eab8":"withdraw(int256)","7e638974":"CalculateFinalDistance(bytes32,bytes32,bytes32,bytes32)","7e63dd86":"seed_additional_token(uint256)","7e6503bb":"getActiveOrderCounts()","7e655ddd":"tokensSoldInThisRound()","7e6667c9":"Invoked(address,bool,uint256)","7e6688a2":"lastJackpotPayout()","7e668cd2":"fSqr(uint256)","7e66f15f":"nowSupply()","7e67429f":"switchToCrowdsale(string)","7e687a8b":"getTotalInvoicesCount(address,uint256[])","7e69671a":"distributeFees(uint256,uint256)","7e69ba22":"ethForTokens(uint256)","7e69e0fc":"ETH420on420()","7e6a0720":"removeClaim(uint32,int256,string,string)","7e6b867f":"insertProductIntoCart(uint256)","7e6bdb95":"getTransactionHashes(uint256,uint256,bool,bool)","7e6beae1":"team2018TokenCreated()","7e6c945c":"FileHashInt()","7e6d0fa0":"isWithdrawAllowed()","7e6d6928":"SmartBusinessToken()","7e6d86ff":"BOUNTIES_SHARE()","7e6dce9c":"throwIn()","7e6e65f3":"acceptSellOffer(uint32)","7e6eee20":"olympusTest()","7e6f6947":"setTokenBurnFeeAbs(address,address,uint256)","7e71496b":"TRCToken(uint256,string,string)","7e71572b":"_checkCap(uint256,uint256)","7e71ccd8":"HShoe_Limit()","7e71fb09":"transferOwnershipImmediately(address)","7e72fb52":"buyToken(address)","7e7307c5":"Contribute(bool,uint8)","7e737551":"setMaxWhitelistLength(uint256)","7e7388b1":"NewRiskAdr(address)","7e742432":"addNewDegree(string,bytes32)","7e74325f":"turn(address)","7e74a1ed":"depositRate()","7e754146":"getCurrentImpeachmentUrlDetails()","7e761240":"setMyName(bytes32,bytes32)","7e766e1f":"IonixxToken(uint256,string,string)","7e76b836":"minter1()","7e7712f2":"standardReleaseAmount()","7e773d9d":"testTimestamp()","7e77509e":"isRoundingErrorFloor(uint256,uint256,uint256)","7e779985":"isTransactionSuccessful(uint32)","7e77c503":"initialize(string,string,uint256,address,address)","7e780157":"PERCENT_100()","7e7894e4":"PendingETHs()","7e79a562":"TripPay(uint256,string,string)","7e79e8ba":"getEmail()","7e7a2fbf":"contribute_toTheGame()","7e7af34f":"setPostICOSale(bool)","7e7be158":"validatePurchaseAndDistributeFunds(uint24[],uint24[],uint256[])","7e7c16de":"secsPerBlock()","7e7c4243":"getTheBet(address)","7e7c8c6e":"catToken()","7e7d5689":"requireTrade(address)","7e7d76ad":"SPORT(uint256,string,uint8,string)","7e7db227":"lastAccountNum()","7e7dd581":"oldDBAddress()","7e7e4b47":"getOutcome()","7e7e5a75":"changeIdentityNarcoRespect()","7e7f1bfd":"total_refunded()","7e7f8e1e":"AddItem(uint256)","7e809973":"hash(address)","7e815fb4":"ScooterCoin()","7e81701a":"sitExchanger()","7e81b6aa":"KingdomFactory()","7e823bd1":"OMGToken()","7e82d0e6":"dbkWithdraw()","7e83027f":"setRegionForSaleToAddress(uint256,uint256,uint256,address)","7e8306ae":"profitrate()","7e83185b":"updateImageAddress(string)","7e835e86":"minechaincointest(uint256,string,uint8,string)","7e837ccc":"dispute_confirmed()","7e84adda":"setGameState(bytes32,int8[128],address)","7e85477f":"myInner1()","7e86e0f2":"BKFToken()","7e86f8e5":"blockedDeadLine(address)","7e873c2c":"uniq(uint256[])","7e87cf30":"tokenOpen()","7e888767":"getNumUsersToPayout(bytes32)","7e88f603":"returnDeposit()","7e893159":"changeIssuer(address)","7e8a9db9":"BasketEscrow(address,address,uint256)","7e8ab941":"_play(uint256,uint256)","7e8bca6f":"Tenteniy()","7e8bf1cd":"calculateCurrentMarketPixelPrice()","7e8c3ab6":"distributePartnerTokens()","7e8ca5f6":"unlockAdvisorTokens()","7e8d1a39":"finishIssuing()","7e8d2c19":"reserveForJackpot()","7e8e13e4":"Lesson_7(address,uint256)","7e8e353c":"setValidatorForND(uint256,uint256,uint256,uint256)","7e8e6d45":"setScaleContractAddress(address)","7e8ecf4f":"balanceOfInvestor(address)","7e8ff036":"submit(bytes32[])","7e904a48":"getNumContents(uint256)","7e904f7b":"stakePrimordialTokenFrom(address,uint256,uint256)","7e90819a":"unofficialApplicationSignUp(string)","7e9266bb":"ChallengeToken()","7e926b4b":"renounceOwnership(bool)","7e92a7e8":"getPublicBattlePokemon1()","7e93150b":"_transferHelper(uint256)","7e93163b":"tip(bytes32,bytes32)","7e932d32":"setFrozen(bool)","7e93810b":"playe1Bid()","7e93e4db":"KhabibvsMcGregor()","7e944756":"getPlayersCollection(address)","7e945935":"oneTokenInCents()","7e947347":"changeWeiCostOfToken(uint256)","7e94cf0c":"getValidityBondAttoeth()","7e951bc6":"update_coeff()","7e95385c":"setJackpot(address)","7e95cd27":"forbid(address)","7e95d2f6":"doSend(address,address,uint256,bytes,address,bytes,bool)","7e968195":"batchTransferETH(address[])","7e969692":"EthRateChange(uint256)","7e97ca29":"registeredInDay(address)","7e98bc8f":"Accumulate(address,uint256)","7e990ad8":"isRentals()","7e999cd9":"revokeMintDelegate(address,int256)","7e9a8685":"getWager(address)","7e9abb50":"getUnavailableTakerTokenAmount(bytes32)","7e9ad046":"upper(string)","7e9aef53":"elementsAreSet()","7e9b98ae":"transferFromWhiteList(address)","7e9ba301":"getResponseAddress()","7e9cd30c":"rescueLostHero(uint256,address)","7e9d2ac1":"burnAll(address)","7e9d7f68":"namiCrowdSaleAddr()","7e9de0bc":"buyTile(uint8,uint256,address)","7e9e1561":"getStakerFromDelegateKey(address)","7e9e1637":"getStockTotal(address)","7e9e1cb6":"Execution(bytes32)","7e9e3b3b":"RESERVED_TOKENS_BOUNTY()","7e9e3d51":"TokenERC20(string,string,uint8,address,uint256)","7e9e4b5d":"firstStageTokensSold()","7e9e511d":"issueAndActivateBounty(address,uint256,string,uint256,address,bool,address,uint256)","7e9e940a":"ClaimDisbursement(address,uint256)","7ea01c0d":"currentLowest()","7ea074b3":"GetJackpots()","7ea11880":"VestedPayment(uint256,uint256,uint256,uint256,uint256,address)","7ea15da1":"priceUpdateAt()","7ea17a1d":"ORACLIZEQUERYMAXTIME()","7ea1a871":"announce(uint256,uint256,uint256)","7ea1b7ba":"_closeSale()","7ea1e2d9":"ethpause()","7ea23fa6":"unlockEthBalance(address,uint256)","7ea2bbac":"getOwnerGennezise(address)","7ea2be2b":"log32(uint32)","7ea2ddeb":"randomNumber(address,uint256,uint256)","7ea2e31c":"EligmaMintingContract()","7ea2fc89":"cancelBetByPlayer(uint256)","7ea30d5d":"BuyCreditsByEth(uint256)","7ea310d4":"getCurrentPrice(uint40)","7ea31352":"getReadableStats()","7ea31ded":"isBuyBackOne()","7ea46993":"revokeMultiplePermissions(address,bytes32[])","7ea531e7":"_generateNewHorseShoe(uint256,uint256,address)","7ea5d50e":"tokenWinRatio()","7ea5e7d3":"reserveDeployment(address,bytes32,address,uint256,uint8,bytes32,bytes32)","7ea60eb8":"roleEditorAddress()","7ea61ed7":"withdrawInternal(address)","7ea6c6ba":"MemoLandCoin()","7ea80eb2":"_receiveBuyLandForCandy(address,uint256)","7ea83869":"increasePreSaleSupply(uint256)","7ea84748":"addPlayerOrder(address,uint256,uint256,uint256,uint256,uint256,uint256)","7ea868e1":"makeInvest(uint256,bytes5)","7ea8f250":"isRunningPreIco(uint256)","7ea94985":"calcHashes(uint32,uint32)","7ea95733":"emissionReleaseThreshold()","7ea9b2bc":"REQUEST_URL()","7eaa0c29":"LogTransactionFailed(bytes32,address)","7eaa4389":"finish(uint8,uint8,uint8)","7eab4e48":"openGiftFromSanta(address)","7eac7382":"getCAOAddres()","7eae1626":"getBack()","7eae6759":"_setBalance(address,uint256,uint256)","7eae75a8":"EtherMango()","7eaef50c":"over()","7eaf45f8":"SaveAccountBuyingGodz(address,uint256)","7eafcdb1":"updateGroupName(address,address,bytes32)","7eb13d8a":"_SetEducationQualificationOf(uint256)","7eb14990":"isBuyer(address,uint256)","7eb1bfb9":"feeWithdrawEthAll()","7eb30cd0":"checkTreeStructure(address,address)","7eb312b1":"SUCCESS_BONUS()","7eb41ce5":"modifyCfo(address)","7eb4b376":"UpgradeSpaceETH(uint8,uint256)","7eb52145":"_preValidateFinalization()","7eb5df39":"equal(uint256[],uint256[],string)","7eb60591":"NVISIONCASHTOKEN()","7eb6634c":"phasePresale_From()","7eb69ba1":"hint(int256,bytes32,string,bytes20)","7eb82601":"getHighestBlockNumber(uint256)","7eb96aa3":"setCurrentWeekPool(uint256)","7eb9f04a":"updatePriceInWei(uint256,uint256)","7eba7ba6":"getSlot(uint256)","7ebaaa60":"MemberBoughtToken(address,uint256,uint256,uint256,uint256,uint256)","7ebadcd8":"acceptPayments(bool)","7ebd02f8":"typeA()","7ebd89ee":"TokenSale(address)","7ebdab54":"setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],uint256[],uint256[],uint256[])","7ebdc478":"settleTimeout()","7ebdf4ac":"setMaxAllowedBetInEth(uint256)","7ebdf57d":"icoTimeBonusPhase1End()","7ebe7626":"FreezeTokensReleaseTime()","7ebedc34":"hasEndedIco()","7ebf65fd":"changeGasLimitOfSafeSend(uint32)","7ec0c39c":"whitelistPrincipleLockPercentage()","7ec0f30d":"ack(string)","7ec13996":"getBytes32Value(string)","7ec1c1aa":"acceptPAIReceiptOwnership()","7ec20127":"createPoolIfNeeded()","7ec2402f":"freezeSupply()","7ec27000":"AiTokenToken()","7ec2ae46":"setSparkDividends(address)","7ec2e264":"_generateCode(address,uint256)","7ec2fd36":"capReleaseTimestamp()","7ec2fd95":"DrawCom()","7ec36494":"osmCoin()","7ec3e63e":"getsubscribersSinceLastHatch(address)","7ec4a5a6":"requestReturn(address)","7ec4edbe":"offset(address,address)","7ec509c4":"external_call(address,uint256,uint256,bytes)","7ec54bdc":"eosShareDrop()","7ec62cf7":"MthereumToken()","7ec650db":"__mul(bytes,bytes)","7ec69c50":"changeWhitelistingStatus()","7ec72d3c":"setSwap(address,uint256)","7ec80c27":"priceStep6()","7ec8ff4f":"crosairVoucherSoldCount()","7ec9084d":"RRCoin()","7ec9290b":"setCouldTrade(uint256)","7ec9c3b8":"per()","7ecab507":"registerPresale(address,uint256,uint256,bool)","7ecacb95":"Example7()","7ecaf696":"createMultiple(uint256[],uint256[],uint256[],address[])","7ecb6475":"aggiungiFrase(string)","7ecc2b56":"availableSupply()","7eccc40a":"contains(uint256,address)","7ecdb299":"SetEthBalance(address,uint256)","7ecdbf61":"SPPSeriesA(uint256,string,uint8,string)","7ece75dd":"lockPeriodStart()","7ecedac9":"allInitialOwnersAssigned()","7ecef543":"_getAppliedPolicyIndex(address,uint8)","7ecf9142":"depositToken(address[2],uint256[7],uint8,bytes32[2])","7ecfa8a8":"ico(address,address,uint256,uint256,address[],uint256[])","7ecfae65":"invokeFor(address)","7ecfb675":"stdBalance()","7ed02af9":"acceptNegotiationTenant()","7ed02cbe":"fireLottery(uint8)","7ed040f2":"prod(bytes32,uint128)","7ed04cf2":"getTokenNames(address,uint256[])","7ed05315":"newGubberment()","7ed06cf3":"nativeProof_verify(string,bytes,bytes)","7ed0c3b2":"write(bytes)","7ed0f1c1":"redeemed(uint256)","7ed18aa5":"WhitelistUpdated(address,uint8)","7ed19af9":"multiAccessRevoke(bytes32)","7ed1ca6a":"BetExecuted(uint256,address,uint256)","7ed273e9":"_mintToken(uint256,string,address)","7ed32df6":"buyRtc()","7ed37b8d":"setPotato(string)","7ed40602":"IsICOstarted()","7ed4e321":"CakeToken()","7ed51b47":"getResult(uint256,uint256,uint256,uint256,uint256)","7ed57fa0":"pregnantHorses()","7ed5a6d4":"TYPE_EXPLORER_FREIGHTER()","7ed5d621":"Crowdsale(address,address,address,uint256,uint256,uint256)","7ed65c87":"closeProvider()","7ed7101d":"mainIcoStartBlock()","7ed77c9c":"setContract(bytes32,address)","7ed788c8":"push(address,uint256,uint256)","7ed83d50":"INCO()","7ed8a719":"addItem(string,string)","7ed8b225":"createMesaVerify(bytes32[])","7ed9c734":"burnRemainingToken(uint256)","7ed9d3a3":"_error(uint256,bytes32)","7eda09e8":"test_me(int256,int256,int256)","7edaabd8":"sendApprovedTokensToInvestor(address,uint256,string,string)","7edaca89":"DAToken(uint256,string,uint8,string)","7edba6c8":"sam()","7edd9060":"_nominCap()","7eddea21":"STAKEHOLDERS_POOL()","7ede036d":"minimumSupply()","7edea039":"private_addPermittedRoll(uint256)","7edebaf1":"buyXname(string)","7edee605":"receivePayment(uint256,uint256,bytes)","7ee0cda4":"validate(string,uint256)","7ee0d91c":"isKycRequired(address)","7ee212bb":"planetIndexToApproved(uint256)","7ee26b2e":"callKoikeToken(address,address,uint256)","7ee26e63":"_alreadyInList(address)","7ee2ea76":"isSafeHavenToken()","7ee42e6d":"_createToken(string,bytes5,address,uint256)","7ee54b82":"TYU(uint256,string,uint8,string)","7ee54eec":"onTicketPurchase(uint32,address,uint16[])","7ee55c97":"isICO()","7ee5c97a":"returnReferral(address)","7ee5eef2":"changeToPublicSale()","7ee62440":"highEtherBonusLimit()","7ee65635":"LookAtDepositsToPlay()","7ee6b2d0":"fundingMinCapInWei()","7ee7f42a":"MIN_RELEASE_DATE()","7ee80d17":"isScheduled()","7ee81902":"DatoDEX(address,address,address,uint256,uint256,uint256)","7ee8703a":"getProgressOfAddressAndId(address,address,uint32)","7ee96f6d":"getEnd(uint256)","7eeb5906":"createCountry(string,string,uint256)","7eec20a8":"cancelTask(uint256)","7eed2814":"transferAD()","7eee1ab6":"HahaCoin()","7eee288d":"unlock(address,uint256)","7eee56f9":"issueIcoCoins(address,uint256)","7eee6d1f":"getUserQuickPromoBonus(address,address)","7eeec2cf":"GigaWattToken()","7eefe47e":"editCode(uint256,string)","7ef01fb9":"totalLockedBonus()","7ef0356a":"littafiTimeCapsule(bytes32,string,string,string,string,uint256)","7ef039f8":"candySentAmount()","7ef09476":"transfer(uint64,address)","7ef1925b":"getShareRange(uint256,uint8)","7ef1a396":"YOU9COINToken(string,string,uint8,uint256)","7ef1ab2c":"payoutRange()","7ef224ee":"getContractOrNormal(address)","7ef26d42":"HardCapEthereum()","7ef2bd52":"currNumOfUpgrades()","7ef3bb63":"createKitties()","7ef3e741":"totalEtherReceived()","7ef4cabb":"nextSupplyAfterBlock()","7ef50298":"registry(bytes32)","7ef581cc":"whitelistAdmins()","7ef58e73":"totalGooProduction()","7ef59d01":"setTrader(address,bool)","7ef5b6ea":"refillTokens(uint256)","7ef5e6a2":"rescale(int128)","7ef61e28":"dayEthInLimit_()","7ef72eb5":"AlphaMarketCoin(address)","7ef7ce92":"revokeMint(uint256)","7ef81a34":"TestableTwoStageSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,uint256)","7ef9016e":"MultiTransferValue(address[],uint256)","7ef92867":"Faucet(address)","7ef95c6f":"extractAccountAllowanceRecordLength(address)","7efc05ae":"TUBECOIN()","7efc2315":"minPaymentForAnswer()","7efcbb33":"getTradeRecord(uint256)","7efce4ff":"TransactionRefunded(uint256,uint256)","7efce591":"TokenRDN(uint256)","7efd3441":"DynamicSKx2(uint256)","7efd9112":"decodeTokenId(uint256)","7efe0e76":"PhoenixFundDeposit()","7efe294c":"removeFromFreezedList(address)","7efe64ba":"InfinityHourglass()","7eff1465":"setAccountAllowance(address,address,uint256)","7eff275e":"changeProxyAdmin(address,address)","7effb427":"TTTToken()","7efff887":"topUpBalance()","7f002ffe":"setTradeable(bool)","7f004afa":"participantRoundChange(address,address,uint256)","7f006ce1":"reading_card_upright_at(uint8)","7f008a0a":"cancelSell()","7f01bb38":"getVestingRevocable(address,address)","7f053808":"approveAndAuction(uint256,uint256,uint256,uint256)","7f0554ca":"mntToken()","7f056637":"testExecuteSellOrder()","7f05c3a6":"supportAccounts(address)","7f067ff7":"Bitcoinsummit()","7f069942":"transferToBeneficiary()","7f070a9b":"withinRefundPeriod()","7f0899f2":"AddTicket(bytes5[])","7f08a250":"testPoint(uint256[3])","7f08ea8b":"getBetPool(uint256,uint256)","7f08ea8f":"getTotalTokensPerArray(uint256[])","7f09171b":"addAd(address,uint256,uint256,uint256,string,string)","7f095bfb":"multiSendB(uint256,uint256)","7f09ad64":"drainMe(uint256)","7f09bd1d":"setEthPreAmount(uint256)","7f09beca":"moveToWaves(string,uint256)","7f0a1bed":"bidderPlaceBid()","7f0b61f7":"ManagerEnabledEvent(address)","7f0bd881":"wanport()","7f0c949c":"setJurisdication(string)","7f0cd33c":"ApproveAndtransfer(address,uint256)","7f0d35e2":"totalPublicSaleWei()","7f0da94e":"cooloffIncrement()","7f0ed037":"setKickOff(uint8,uint256)","7f0f04a8":"unregister(bytes32,address,uint256,uint256,uint256)","7f0f09af":"EtherdeCoin()","7f102c16":"currentGameStatus()","7f10a3c0":"presaleBonusAddress()","7f1165c1":"getSencBalance()","7f1482b1":"round3Bonus()","7f15a21c":"modify(address,address,uint256)","7f15a6a3":"setCCH_edit_31(string)","7f16ab50":"replaceAuthorised(address,address)","7f1731b6":"unsetRegistrar(uint256,address)","7f17b05d":"OwnerAddress()","7f17b79d":"setGameCost(uint256)","7f17ce9b":"DIGIPLACED()","7f180db7":"kudos(uint256)","7f187d2d":"score(bytes32,string)","7f18b569":"setKncPerEthBaseRate()","7f18f10c":"setGeneContractAddress(address,address)","7f191255":"punchOut(address,uint64)","7f1926c7":"GagarinToken()","7f1a2a73":"getEmployerAvgRating(address,address)","7f1a4c1f":"withdrawContributorsTokens(address,uint256)","7f1a8749":"purchaseMakeAdv(uint256,string,string)","7f1b1e51":"testTooFewTokens()","7f1b8cc3":"getUsersByBalance()","7f1bb473":"daysFrom(uint256)","7f1bffc1":"_removeToken(uint256)","7f1c25d0":"HolaMundo()","7f1ce417":"isITOFinished()","7f1ebc4d":"reentrantGuard()","7f1ecfe0":"getCurrentBid()","7f1f0507":"publicRate()","7f205a74":"SALE_PRICE()","7f205c8c":"getOraclizeCallback(bytes32)","7f205f02":"changeBoolean()","7f21d498":"getMinBid(uint256)","7f23fb92":"setGenres(string)","7f2438cb":"sellFor(address,uint256)","7f25c1e4":"etherRaisedByState(uint256)","7f2609eb":"LogFinalizeMatch(uint256,uint8)","7f26fc7d":"removeCreator()","7f279a73":"Cashing(address,uint256)","7f2857b6":"viewFunc()","7f28c44f":"isIcoSuccessful()","7f290d2d":"ExpiringMarket(uint64)","7f293e02":"ChangeCoinCrowdsale()","7f294b10":"setPI_edit_26(string)","7f298f93":"crowdsaleEndBlock()","7f2a4784":"KYC_VERIFICATION_END_TIME()","7f2aeea4":"getType(bytes32)","7f2b06ed":"bonusLimit3()","7f2b88ea":"getThirdPhaseCap()","7f2c1633":"prenesiKovance(address,uint256)","7f2c4ca8":"getLastBlock()","7f2e01fb":"ListValidated()","7f2e0ec2":"remainRewards()","7f2e98ad":"PoissonData()","7f2f506b":"CLAIM_INTERVAL_DAYS()","7f300576":"startThrowing()","7f301b83":"setMetadataHash(string)","7f31b480":"changeMasterAddress(address,address)","7f31cbfa":"batchShareAmount(address[],uint256[],uint256,uint256,uint256)","7f32f6de":"isSoftCapCompleted()","7f33375b":"getReturnedData()","7f334bd1":"_generateRandomId(string)","7f33c1e1":"Ethurem()","7f3436ef":"addOrganisation(address,string,string,string)","7f349329":"currentRoundSupply()","7f3681f6":"setKNCRate()","7f3745ad":"execute_transfer_all(uint256)","7f3745db":"getTracksByArtist(address,uint256,uint256)","7f37b905":"salesCounter()","7f37fab6":"addActionToRole(string,string,string)","7f3800ba":"setMultihash(bytes32,string,bytes)","7f386b6c":"minimumPrice()","7f38a4a7":"updateUSDETH(uint256)","7f38b980":"setTokenDistributionPool(address)","7f38e526":"pendingPayments(address)","7f390088":"QYCC()","7f3a2472":"reserveIssue(address,uint256)","7f3a98b7":"burnMyBalance()","7f3ad651":"KayoToken(address,address,uint256,string,uint8,string,bool)","7f3bd56e":"disburse(address,uint256)","7f3c26b1":"rejectHours()","7f3c2c28":"registerContract(string,address)","7f3cb47b":"minimumAmountWei()","7f3cd28e":"tokenSalesByOwner(address,uint256)","7f3d5c4c":"ICOPaused()","7f3ded93":"voxFab()","7f3df4bb":"addBonus(uint32[],uint64[])","7f3e1841":"endSecondPeriodTimestamp()","7f3e4d1b":"setAtkNowForPlayer(address)","7f3f3398":"transferAndCallExpanded(address,uint256,bytes,address,address)","7f3f81c0":"confirmProposal(bytes32,address,uint256)","7f404b7f":"updateInt256(bytes32,int256)","7f40d9d8":"delayDonPhase(uint256,uint256)","7f4316ec":"getDefendPlayerList()","7f4384a8":"RichNiggas()","7f440d57":"getProjectReport(uint256)","7f445c24":"subRegistrar(string)","7f44fcfa":"_getPoints(uint256)","7f453951":"CBMDToken()","7f45b835":"getPrimaryRecord(string)","7f45ec91":"emitIssuance(uint256)","7f460693":"ownerPutCapital()","7f46550f":"CrowleyToken()","7f476471":"setRCContractAddress(address)","7f480f9d":"processDividends(address)","7f486ca6":"cancelChibiForFusion(uint256)","7f493ce6":"disableTokenTransferability()","7f497550":"scheduleTransfer(address,uint256,uint256)","7f498ffc":"setEnd(uint256)","7f4a1c52":"setExceed(uint256)","7f4a9691":"depositTokenToVault(address,uint256,uint256)","7f4ab1dd":"messageForTransferRestriction(uint8)","7f4ae68d":"restrictedAddress()","7f4af951":"pixelPrice(uint256,uint256)","7f4bf7d1":"Inerex(bytes32)","7f4c7064":"ESCROW_TOKENS_PERCENT()","7f4d5150":"CheckItemExists(uint256)","7f4d6aa4":"LogResumed()","7f4da132":"goldFee()","7f4db7fb":"testPrivate(uint256)","7f4e4669":"raiseInitialSupply(uint256)","7f4e4849":"getContractState()","7f4ec5a7":"toAddressThrow()","7f4ed2c7":"addToWhitelistMulti(address[])","7f4ed5ac":"sumHardCapICOStage2()","7f4edd72":"getAllAdIdsByUser(address)","7f4ef9d4":"getText(uint256)","7f4fd78e":"BTCCollected()","7f50c74b":"FIXED()","7f51bb1f":"updateTreasury(address)","7f52fcae":"tokenAmountPerUser()","7f5341da":"startTimeSale3()","7f5369f1":"DEFAULT_REVOCABLE()","7f5375c1":"getLastWin()","7f53b15d":"_ICOSale(address,uint256)","7f555b03":"erc20Proxy()","7f55b2d9":"cleanBalance()","7f55b87f":"createCountry(string)","7f564472":"resetAmountBonuses()","7f5651d7":"setNamehash(string,bytes32)","7f56c072":"SIEChain()","7f56c0b4":"setTeamFundWallet(address,address,uint256)","7f56ca73":"Volkstest2()","7f573a4f":"UNSOLD_SOLD_RATIO()","7f582b47":"howMuchWithdrawed()","7f58b9ee":"allQueryIds()","7f592be4":"TRANCHE2_ACCOUNT()","7f592cfe":"setLLV_edit_12(string)","7f5a259f":"FIXED_RATE()","7f5a285a":"notInWhitelistAllow()","7f5a448c":"switchToWhaleMode(bool)","7f5ae339":"isAdminister(address)","7f5b47cd":"eventApproval(address,address,uint256)","7f5b503c":"toB32(bytes,uint256,address)","7f5ba3cc":"REGULAR_TYPE2()","7f5ba79f":"registerNewProduct(uint256,string,string,string)","7f5bfe30":"PaymentExecuted(uint256,address,uint256)","7f5d85f8":"testBurnGuyWithTrust()","7f5dfd16":"approveProxy(address,address,uint256,uint8,bytes32,bytes32)","7f5e495d":"defaultLimits()","7f5f0d6a":"resumeIco()","7f5f17b1":"getCompte_8()","7f5f9128":"alreadyReservedForTeam()","7f601a50":"getHouseCardsNumber()","7f602231":"tip(bytes32,address,uint256)","7f60b20a":"getSlice(uint256,uint256,string)","7f60bb7c":"applyBonusAmount(address,uint256,bytes32)","7f6150cb":"getRoundCurKeyNo(uint256)","7f626f1a":"setStore(uint256)","7f630259":"getSuperReferrerRate(address)","7f63040b":"CompcoinCash()","7f630b4c":"share(string)","7f63af42":"deployConsortium(address)","7f64727b":"getTreesOnSale()","7f649783":"addToWhitelist(address[])","7f64c34e":"deadline365()","7f64d2d3":"NCAAChampionship()","7f654b1c":"setLatestPayday(address,address,uint256)","7f6578d3":"REFUND_PERIOD()","7f6597e0":"AcuteEthereumCloudMiningunion()","7f660b01":"FEE_COLLECTOR()","7f66af09":"card_titanium_first()","7f66ccbe":"EthereumVerge()","7f66d1f8":"mOnApprove(address,address,uint256)","7f671c1b":"insert(int128)","7f686259":"migrateBalancesFromLegacyRep(address[])","7f695f28":"isFlying()","7f6a731c":"donationAmountInWei()","7f6ae0c0":"canUpdateDeveloperMiningPower()","7f6d8955":"RegisterOne(uint32,address,address)","7f6ec891":"withdrawNonTopForTeam(address,uint256)","7f704657":"RESERVED_FOR_TEAM()","7f71f1f9":"controllerApproval(address,address,uint256)","7f725862":"_setNewEstimate(uint256,uint16)","7f7376e8":"launchSale()","7f74ac15":"ownerContract()","7f7575c9":"FixedSupplyCrowdsale(uint256,address,address,uint256)","7f760335":"PurchaseTokens(uint256,address)","7f761472":"canRedeemUTXOHash(bytes32,bytes32[])","7f7624d0":"MjolnirAddress()","7f7634ba":"winnerConfirmed()","7f76bd3a":"lastBlock_v18()","7f76d76d":"minCapIco()","7f784da7":"addNews(string)","7f78636a":"BASE_URL()","7f790b7b":"getCreateUniverseParentPayoutDistributionHashValue()","7f791790":"roll(uint16[],uint16)","7f791833":"toTimestamp(uint16,uint8,uint8,uint8)","7f792910":"setExchangeable(bool)","7f7977d1":"isFundraiser(address)","7f7985cf":"setEthUSD(address)","7f79cbfe":"MANHATTANPROXYLEXINGTONAVE()","7f7b1393":"getLocation(uint256)","7f7b17a0":"SetupPreSale(bool)","7f7c1491":"remove(address,address)","7f7d31dd":"sub32(uint32,uint32)","7f7d711e":"setRequireCustomerId(bool)","7f7dcdbf":"isContractOwner()","7f7de185":"handleProductionDecrease(address,uint256)","7f7fde8e":"sellAssets(address[],uint256[])","7f81f0b9":"setTransferLock(uint256)","7f83a4a6":"canRefund()","7f83bf7d":"setMinimumPayment(uint256)","7f84017f":"SELL_SOFT_LIMIT()","7f848ccb":"_packMakeData(address,uint256,uint256)","7f85066e":"Reflex()","7f853e7e":"MLCToken()","7f85c599":"addOrder(bytes32,address,uint256,uint256)","7f860330":"batchReturnEthIfFailed(uint256)","7f863cab":"Bid(address,uint256,address,uint256)","7f8661a1":"exit(uint256)","7f869d98":"stepFour(int256)","7f86cd3f":"parseLoanOfferRates(uint256[10],uint32[4])","7f86d985":"drunkness()","7f86f7f4":"walletPlatform()","7f877710":"recoverUnawardedMILs()","7f879229":"setSalesUser(address)","7f88616f":"onlyAdminAndNotInit()","7f89ce48":"initTiers(uint256[],uint256[])","7f8b8f48":"Ledger(address)","7f8b9478":"getImpliedRoot(bytes,bytes,uint256,bytes32[])","7f8c263f":"dragonBalance(address)","7f8d429e":"isFinalized(bytes32)","7f8d53c6":"put(address,uint256)","7f8dafef":"unsoldAllocationCount()","7f8fdcfb":"suspendDeposit()","7f9144ce":"token_member_order_pop(address,address,uint32)","7f91fb7d":"isSignedBy(address)","7f9245d0":"_clearTokenApproval(uint256)","7f924c4e":"testDeposit()","7f925c93":"withdrawSeller(address[2],uint256[7],uint8,bytes32[2])","7f93354b":"multiVoteNoLock(address[],uint256[])","7f9343ad":"playNumberSuit(uint256[])","7f93de95":"deposit100Percent()","7f947168":"TimeTransferAllowed()","7f949386":"updateMessage(uint256,string)","7f949ac0":"ethashContract()","7f94a8fa":"getWriteTimestamps(bytes32[])","7f95d6f6":"accountBalances(uint256)","7f95d919":"DistrFinished()","7f967a8c":"IsExchanged(address,string)","7f9785b0":"_resetList()","7f97e836":"didCommit(address,uint256)","7f98444f":"randomEnd()","7f99e11a":"isMiningOpen()","7f99f3c4":"MaybePerformOpen()","7f9ac04f":"balancesStaticoin()","7f9b48bc":"setCompte_9(string)","7f9bf9e4":"startMinting(string)","7f9c23e0":"_determineHitPoints(uint256)","7f9c8974":"getAssetCollectedOreBallancesArray(uint256)","7f9cbfc1":"checkPayments()","7f9d139a":"positionScount(address)","7f9d2044":"UniBowToken()","7f9d314e":"autoBirth(uint256)","7f9df012":"VoteRevealed(address,uint256,uint256,uint256)","7f9f5495":"levelTokens()","7fa0c10f":"DeleteUserByAddr(address)","7fa0c908":"newChow(address)","7fa22001":"assertEq0(bytes,bytes,bytes)","7fa24846":"SetSAToEContract(address)","7fa28d75":"transferRightIfApproved(address,bytes32)","7fa34e92":"preIcoAddr()","7fa39958":"RateAdd(address)","7fa3f3d0":"addLock(uint256)","7fa400e4":"totalTokensAvailableForSale()","7fa40a42":"sumICOStage8()","7fa44926":"setMinMaxInvestValue(uint256,uint256)","7fa4cacb":"setDestinationAddress(address)","7fa5aa9d":"registerPreSignedHashing(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256)","7fa6c365":"phase3MaxTokenForSale()","7fa6c745":"_setNewStartTime()","7fa767bc":"createBox()","7fa7a7c8":"buyInWithAllBalance()","7fa7acf8":"createCertification(uint256,uint256)","7fa87949":"unblockAccountFunds(address,uint256)","7fa8c158":"startICO()","7fa9aa76":"owner_updateBaseFee(uint256)","7fab541c":"exec(bytes32,bytes)","7fab624b":"purchaseGenes(uint256,uint256,bool)","7fabbd7b":"unilateralRefund(bytes32)","7fabe1a5":"allPendingRefs()","7fad54e4":"distributeGame(uint8,uint256)","7fad9b53":"BASE_TEAM()","7faddcfb":"currentDistributionAmount()","7faff876":"updateUser(bytes32)","7fb00168":"CryptekZ()","7fb0a445":"systemSaleAddress()","7fb0fe14":"voteCandidateTwo()","7fb158c5":"ChannelSettled(address,address,uint32,uint192)","7fb181c1":"swapTime()","7fb191a5":"TokenVestingContract(address,address,bool,bool,bool,address)","7fb1a5ed":"AirdropController()","7fb33170":"transferAdmin(address,uint256)","7fb3d459":"GetChipsInfo(address)","7fb419b6":"WalletBoss()","7fb5d847":"delTransferWhiteList(address)","7fb5ff3e":"MNTP()","7fb7b5ed":"enableTeamWithdraw()","7fb9e405":"getTitulaire_Compte_10()","7fbb345e":"getInvestorsTokens(address,address)","7fbc0c48":"_mint(uint256,address,string,string)","7fbc9c55":"calculateMultiplierAfterConversion(uint256,uint256,uint256)","7fbcef65":"BTH(address[],uint256,address,uint256,uint256,uint256)","7fbd778a":"getTotalScientists()","7fbe0680":"MIN_PURCHASE_OTHERSALES()","7fbea955":"getCanvasByState(uint8)","7fbf28f7":"_withdrawDivis(address)","7fc29fc9":"authorisedMinter()","7fc32915":"ThrowbackThursdayToken()","7fc38e04":"SponsorshipReceived(string,string,string,uint256)","7fc3bb26":"endPostICO()","7fc3f49e":"getReinvestableTokenAmount(address)","7fc446f2":"changeCustomDefrostingRate(address,uint8)","7fc4d6c3":"isPhaseExist(address)","7fc53fb5":"returnInvestmentsToInternal(address)","7fc543ec":"_donations(uint256)","7fc55eb4":"ContributionWallet(address,address)","7fc56856":"IOXDistribution(address)","7fc5af95":"getWinnerList()","7fc5f05c":"changeVoters(bytes32,address,string)","7fc611f0":"multiCall()","7fc729c2":"_buy(address,uint256,bytes)","7fc7e643":"SetUp(uint256,uint256,uint256,address)","7fc88fe2":"timelockContractAddress()","7fc8b612":"interadduser(address,uint256)","7fc8fd9e":"Update_MediatedTransaction(uint256)","7fc90182":"Pool(uint256)","7fc90a5c":"batchAssignTokens(address[],uint256[],uint256[])","7fc96619":"getPartner(uint256)","7fca432e":"FHFTokenCrowdsale(address)","7fcac0fb":"USDBCoin()","7fcae430":"PendingApplication(address,uint256,string)","7fcaf666":"setString(string)","7fcb024a":"secondLockTime()","7fcb2386":"MorrowToken()","7fccb4ba":"transferAppOwner(bytes8,address)","7fcd3ce2":"maxBetPrice()","7fcdd1f0":"setConfirm(uint256)","7fcf3a2f":"throwFooBar()","7fcf440a":"getOwnerBalance(address)","7fcf532c":"Withdrawal(address,uint256)","7fcf64b2":"updateEarnedBy(uint256,uint256)","7fcfb422":"increaseApprovalWithData(address,uint256,bytes)","7fcfc4a0":"ApisToken()","7fd004fa":"submitWhitelistAddition(address[])","7fd13532":"whitelistMany(address[],uint256,uint256,uint32)","7fd169d6":"createGroup(string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","7fd19692":"setLockAddress(address,bool)","7fd2304f":"_maximumBuy()","7fd238ba":"doCoinage(address[],uint256[],uint256,uint256,uint256)","7fd26dd1":"tokenUsers(uint256)","7fd2ffa7":"InvestorWhiteListAddition(address)","7fd30df0":"mintBulk(address[],uint256[])","7fd39247":"setOwner(uint256,address)","7fd42617":"safeWithdraw()","7fd5bb31":"propose(address,bytes32,address[],bytes32[])","7fd5dd04":"APPROVE_OWNER()","7fd6f15c":"feePercent()","7fd751a8":"PRICE_ICO2()","7fd84609":"setOwnerThree(address)","7fd8601e":"deathData_v5()","7fd8d339":"changeicoBackend(address)","7fd8d51d":"stakeGLXForContributors()","7fd8ee68":"computeNameHashExt(bytes)","7fda8d52":"internalEnableRefunds()","7fdac6f1":"getCurrentCreditsExchanged()","7fdafafa":"totalTreePower()","7fdb5031":"transferableTokens(address,uint256)","7fdb5efb":"GDCAcc01()","7fdb6720":"teamFundAddress()","7fdbd0f2":"ERC721DutchAuction(address,uint256)","7fdc5bd6":"LANA()","7fdc8290":"isUnderscore(bytes1)","7fdd458d":"createWithParents(bytes32,bytes32,bytes32[])","7fdd5403":"clearApproval(uint256)","7fdd69f6":"setMaxAllowedReservingPercentage(uint256)","7fddc0de":"getBiddingInfo(uint16,address)","7fde1c8a":"addRole(address,uint256)","7fde24c7":"addToPrivateWhitelist(address)","7fdea25b":"newVoting(uint8)","7fdf6911":"checkRoundAndDraw(address)","7fdfbe1b":"getBytes(string,uint256,uint256)","7fe02f94":"fireFightResultsEvents(uint8[4])","7fe0518a":"asyncSend(address,uint256)","7fe09003":"NewBlock(uint256)","7fe0c38b":"JOCKEY_LIMIT()","7fe0ff52":"StorageFee(address,uint256)","7fe11990":"authoriseManyAccounts(address[])","7fe11adc":"resetStage(uint8)","7fe18cf7":"_getInStageIndex()","7fe1a801":"setBountyCampaign(address)","7fe1dc7e":"getToken(bytes)","7fe1feb0":"initEmployee1()","7fe23f62":"winPool()","7fe275d4":"culmulative_demurrage_collected()","7fe320ab":"mvpExists()","7fe38fc3":"etherwow()","7fe3dc2e":"getGasCost()","7fe551fd":"clearingPrice(bytes32)","7fe5850b":"_redeemByDefaultPartitions(address,address,uint256,bytes,bytes)","7fe60640":"updateBtsPoint(int256,uint16,int256,uint16)","7fe650b1":"finalizeICOOwner()","7fe6eee0":"fundingLimit()","7fe846ba":"isSubjectDestruction(uint256)","7fe864b8":"MAX_TOKEN_CAP()","7fe88885":"storeHash(bytes32)","7fe8ca66":"sendInput(int256,int256)","7fe97bc5":"getSqrY(uint256)","7fe98ae0":"updateEthICOThresholds(uint256,uint256,uint256,uint256)","7fe9d39c":"changebeginnerprotection(uint256)","7fea061a":"TimeTransferAllowanceChanged(string,uint256)","7fea0d4b":"beforeAll()","7feb4685":"Chende()","7febd721":"presaleAmountRemaining()","7fec1b7a":"WBT()","7fec5d33":"Eightk()","7fec8d38":"trigger()","7fecd538":"isWaiting()","7feda59a":"revokeAttribute(address,string,bytes)","7fee4ecb":"GAS_PER_DEPTH()","7feec9be":"sams(uint256,string,string)","7feed5b6":"price_exponent1()","7fef036e":"totalEntries()","7fef21d4":"getBoundingBox(uint256)","7fef2d38":"updateMatchInfo(uint256,string,uint64,uint64)","7fefde53":"WillRegistry()","7ff02139":"updateCrytal(address)","7ff0346b":"getContents(bytes32[])","7ff276bd":"totalEthFundCollected()","7ff2acb7":"getData_2()","7ff2c70a":"ipo_price()","7ff2cf93":"getcertifieddatacount()","7ff31d2b":"setData_28(string)","7ff3366f":"TeamAddress()","7ff44544":"GetCurrentSalePrice(uint256)","7ff44a91":"getAllKeyNum()","7ff4b630":"action(bytes32[])","7ff6ea1c":"WolkCreated(address,uint256)","7ff6f83a":"_distributeTax(uint256,address)","7ff701dd":"TrackerToken()","7ff70a89":"getOwnedTokenList(address)","7ff729fc":"fillUpProject(uint256,uint256)","7ff860f6":"batchCreateAssetSale(uint256[],uint256[],uint256[],uint256[])","7ff86a35":"HappyBirthday(address,uint256)","7ff91228":"Stake(address[],address,address,uint256,address)","7ff92d6e":"set_address__Arina(address,address)","7ff931bd":"lastWinningNumber()","7ff988c5":"setKtcAddress(address)","7ff9b596":"tokenPrice()","7ffaae3e":"balanceEth(address,address)","7ffb8577":"totalGains()","7ffc0712":"getLifeRate(uint256)","7ffc80cf":"queryRandomTryTime_()","7ffcb093":"addVoter(address,bytes32[])","7ffce58e":"getTokenForInvester(address,uint256)","7ffdf53e":"conversionRate()","7ffe8be1":"setKycAddress(address)","7fff9f1a":"getProposalVoteCount(uint256,uint256)","7fffb7bd":"HelloWorld()","80007e83":"isVerified()","80008794":"round1Target()","80009630":"setCore(address)","8001553a":"OwnerRemoval(address)","80017cbc":"cancelLine(uint256,string)","80033408":"CANSale()","8003524e":"calcDoHash(string,bytes32)","800362ae":"loveStoriesCount()","80054c5d":"FreedomToken()","80056b5b":"changeAdminPrivilege(address,bool)","80057b9a":"getColor(uint256)","80059593":"numberAccounts()","8005993e":"getProfileHash(address,address)","800626a6":"AIR_1_SUPPLY()","8006692f":"stage3Deadline()","8006745b":"getPayout(address)","8006a5d3":"delegateAddresses()","8006f807":"COBAIN()","8007604b":"Stage1Deadline()","80078a0f":"ForFood()","8007acbf":"getActiveShareholdersArray()","80087745":"closeInvest(bytes5)","8008d5bc":"inSale()","8009484b":"getMaxBetAmount(uint8)","80097484":"transfer(address,uint32)","80097a8e":"adjustedPotBalance()","800a320a":"TokenGameTransfer(address,uint256)","800ab784":"verifyMerkleProof(uint256,uint256)","800bbd1f":"getCountTokens(address,uint256)","800c5086":"giveERC20AllowanceToKyber(address[])","800c7e38":"getCurrentPageCount()","800d0f6a":"LCToken(uint256,string,uint8,string)","800d41a3":"newExitWallet(address)","800deda5":"yoyoTransfer(uint256,string,string)","800ed545":"MWSToken()","800edb9d":"changeCap(uint256)","800f8e52":"placeBetWithInviter(uint256,address)","80105295":"maxUserPower()","801137e7":"setDepositPercents(uint256)","80113832":"ORDER_MODIFY(address,address,uint256,uint256,uint256)","801145bd":"sig_to_add(bytes16)","801161b0":"setMain(address)","80117026":"FRAC_BOT()","801298fa":"changePaymentFlagger(address)","80130383":"LGCY()","801336cb":"STARTING_RickAndMorty()","8013f267":"calcUnMaskedGuEarnings(uint256)","8013f3a7":"dev2()","8014f238":"editCard(uint8,string,string,string)","801512af":"SvinChainToken()","8015a96d":"For_admin()","8015e6f3":"getDungeonPower(uint256)","8016b6ed":"getKeyValue(address,string)","80173a19":"geneManager()","8017732d":"LDT()","801a115d":"transfertCopieExecutoire(bytes32)","801a1467":"swapFor(address)","801aba56":"etherProceeds()","801b4189":"claimRental()","801c334e":"auctionIncreaseBid(bytes32)","801db9cc":"MIN_CAP()","801e2593":"maxAllowedAmount(address)","801f568e":"SpenderAuthorization(address,bool)","80200e12":"subFreelancerTotalInvoiced(address,address,uint256)","802028c9":"createDerivative(bool,uint8,uint256,uint256,bytes16,uint256,uint256)","802049ac":"setUpgradeableTarget(address)","8020f54e":"addAssetToNetwork(address)","8020fb77":"getCurPayTable()","8020fc1f":"isDeregistered(address)","802114a8":"_removeRole(address,string)","80218eeb":"tokensIssuedTillNow()","802293c2":"getResultblockHash(bytes32)","8022fb7a":"setFrozenCoin(bool)","8023769f":"getPCAddress()","8023ffbd":"getOverallSize()","80249468":"getUserHSCeducationDetails(string)","8024c400":"limitPerDay(uint256)","8025e303":"VERSION_NUMBER()","802608a2":"setExpirationDate(address)","802644a4":"fundingEndUnixTimestamp()","8026efaa":"token18KstepCAP()","8026fe24":"FundTransfer(address,uint256,uint256,bool)","80270b33":"CSCResource(string,string,uint256)","8027dece":"updateShare(address[],uint256[])","8028bdc4":"returnedCWC(address,uint256)","8028ce6b":"claimRefundsFor(address[])","80296dec":"admin_check(address)","802a350f":"addCustomerService(address)","802b1d93":"officiant()","802b45e2":"ISBCoin()","802b8453":"setPerventValue(uint256)","802bbab2":"ChainStarBase(uint256,string,string,uint8)","802c8cda":"_cancelEscrow(address,uint256)","802cd15f":"changeDistributor(address)","802d1848":"setLimitations(uint256,uint256,uint256)","802daa62":"latinotoken(uint256,string,uint8,string)","802de8fc":"setPremiumFactors(bytes32,uint256,uint256)","802deb22":"TokenTrader(address,uint256,uint256,bool)","802ea720":"getTotal(bytes)","802eb89c":"_getWeight(uint256)","802f2ffa":"_addPayment(address,uint256,uint256,uint8)","802f5bae":"ADDITIONAL_PORTION()","80311bf9":"buyCore(uint256,uint256,uint256,uint256)","8031233c":"inflationCompBPS()","80318be8":"transferOverride(address,address,uint256)","8031e85c":"calculatePremium(uint256,uint256,uint256,uint256,string,string,string)","80322cbd":"isNowApproved()","80325b2d":"queryN(uint256,string,bytes,uint256)","8032751b":"returnInvestments(uint256)","803287de":"_frozenTokens()","80330982":"sendEther(address,address)","80334b8f":"TomBit(uint256,string,uint8,string)","8033c643":"ROSCAv1(uint16,uint128,uint256,address[],uint16)","8033cc70":"StealthToken()","8033fe49":"releaseEnd()","80341744":"contactsAddresses(uint256)","803435d7":"startDefinedGameManually(uint256)","80355798":"isAlreadyUsed(uint256)","803587ae":"invalidateCertificate(bytes32)","8036b5db":"setPresidenteDeMesa(bytes32,uint256,uint256,bytes32)","8036d757":"getRateUpdateBlock(address)","80373436":"setSecondaryGameManager(address)","80378b78":"setShopRunning(address,bool)","8037bfe0":"unRedeemedMTU()","803965c4":"amountFixed()","803a62ea":"Register(uint256,address,address)","803b4c11":"OwnerUpdate(address)","803c64c3":"GetCardList(address)","803c6fa9":"getWeiTokensOwed(address)","803c8383":"getKey(address,address,uint32)","803cc0d0":"kscTransfer(address,uint256,string)","803d65ff":"_sendtoken(address,address,uint256)","803ea2ee":"MoneyTransfered(address,uint256)","803fbe5b":"paymentRegularTokens(uint256,uint256)","803fcd43":"check(address,address,address,address,uint256)","80402564":"addrList(uint256)","8040cac4":"testOverflow()","80412042":"decrementOwnedTokensLength(address)","8041fcc4":"AVMToken()","8042b215":"developerPctX10K()","8042fba5":"newEscrow(address,address,address,uint256,bytes32,bool)","8043154d":"post(address,bytes32,bytes32)","804327bb":"buyPreIcoTokens(uint256)","8043c9c0":"eventName()","8043cf2d":"mintB()","8044c67e":"updatePrizes(uint256[])","804518a8":"nic()","8047ba70":"getTokensAmountUnderCap(uint256)","8047cb93":"createGame(bytes32,uint256,address)","8047cf41":"init(uint256,string,uint8,string,address)","80496fd6":"CaData()","804afd9e":"vigAddress()","804afffb":"tokenIndexToPrice(uint256)","804b55d5":"finaliseAs(address)","804ba97a":"tryGet(bytes)","804c68aa":"allocateTCLRinTeamTokens()","804c7fa0":"_migrateExoplanet(uint256,string,uint256,uint32,string,uint32,uint8,string,address)","804d564c":"whitelist10Addresses(address[10])","804d77c8":"approveLoanIdentifier(bytes32)","804e11dc":"testThrowsDisownNotTransferable()","804e1c53":"_updateProfit(uint256,bool)","804e8063":"setAffiliateEdge(uint256)","804ee2b5":"addProduct(uint256,uint256,string)","804f82d3":"showLastBidValue()","804fe7ac":"acceptBid(address,bytes32,uint256,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32,uint8)","805013c2":"setPresalePhaseUInt(uint256)","80504271":"fundingExchangeRate()","80519ac7":"getItem(bytes,uint256)","8051d02d":"getBlockNumber(bytes20,uint8)","805210b7":"AmIPlayer2()","8052191e":"dip(address)","8052474d":"Name()","80528865":"changeWithdrawState(uint8)","80529172":"setUsdPerEthRate(uint256)","8054b2f2":"NKN()","805553e8":"randMod(uint256)","80559357":"setTokenAvailable(bool)","805593db":"storeProductReference(address)","8055d33a":"exchangeSgnForSga(address,uint256)","8055dbb5":"GetExchangePoint(uint8)","8055f9d7":"Moderated()","80560a0a":"setIsProjectBonus(bool)","8056696e":"loadController(address,address)","80570d69":"JoshuaCoin()","80571e93":"UranBank()","80576150":"BoughtViaJohan(address,uint256)","8057b96d":"buyTokensForSelf()","8057e0b0":"DutchAuction(address,uint256,uint256,uint256)","8059382a":"setGasInTokens(uint256)","805996f2":"AccountCreated(address)","80599e4b":"remove(string)","8059e804":"ethealMultisigWallet()","805abe6a":"destoy()","805b8455":"bumpRound(uint256)","805b90d6":"unlockTokensAmount(address)","805bc096":"Roll100()","805c2b6c":"broadcastOpinion(string)","805c3abd":"getPreviousHashUint()","805c3d89":"SimpleLSTDistribution(address,address,uint256,uint256,uint256,address)","805c733b":"lottoBalance()","805d2679":"rndIssue(address,uint256)","805e99e0":"isFirstRound()","805f4cfc":"TosTeamLockContract()","80603faa":"isTakePermitted(uint256,uint256,address,address,uint256,uint256)","80615ffa":"receiveApproval(address,bytes)","806186f3":"LogRewardAllocated(address,uint256,uint256)","8061a159":"TokenSoftCapReached(uint256)","8061d365":"FINANCE_CAP_PER_ROUND()","8062d3e6":"insertAndCheckDo(bytes32)","8063ab78":"setWalletsDelegate(address)","8064696b":"getOraclizePrice(string)","80657151":"patronRewardMultiplier()","8065eaa6":"CreatorWithdrawAll()","80661555":"commandMintBonus(address)","80664ba0":"ProofTeamVote()","80667509":"MYGREATTOKEN()","80667aa8":"CBN(address)","8066f3c8":"totalSTACoin()","8067f7ba":"read_i16()","80690e01":"IsAirdrop()","80691858":"GoalReached(address,uint256,bool)","8069dc2d":"ThundervsJazz()","806a2a3c":"investors_needed_until_jackpot()","806ad169":"getWithdrawal()","806ad57e":"addWorker(address)","806b0365":"changeBountyWallet(address)","806b39ab":"crownTotalSupply()","806b6c28":"GetCurrentTypeSalePrice(uint256)","806b984f":"lastBlock()","806ba6d6":"founder2()","806bd2b6":"challengeCooldownTime()","806c6188":"adjustMinimumPledgeAmount(uint256)","806cdc0b":"getBonusBalance(uint256,uint256)","806e085e":"transferBatch(address[],uint256)","806ee278":"collectionFunds()","806f208a":"invalidPayments(address[],uint256[])","806f3319":"multipleTokenDistribute(address,address[],uint256[])","80710f39":"withdrawAllToOwner()","8071a7ba":"PCTToken(address)","8071aa05":"multisend3(address[],uint256[],uint256[],address[],uint256[])","807283df":"Patronage(string,address,address)","80738c4d":"USTM01()","80744a9c":"LoyelaTestCoin()","8074e31d":"Victory(uint256,string,uint8,string)","8074f332":"droneIndexToOwner(uint256)","8074fe33":"minerCurrentChallenge()","80759f1f":"getRootHash()","8075acd0":"couponBonusEnabled()","80766b68":"Bitcoin1()","807693b6":"grantPermissionToChange(address,uint256,bool)","8076bd41":"set_sale_closed()","8076f005":"cancelledOrFinalized(bytes32)","8077ccf7":"etherTokens(address)","80780801":"LimitedSetup(uint256)","80787f2c":"terminateSale()","80788cba":"CancelSubscription(address,address)","807896d5":"voteProposal(uint256)","8078cc57":"_changeLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)","807a599c":"mintFinish()","807a87ed":"YouAreHere(uint256)","807b08c7":"runScript(bytes)","807d2da3":"start_ICO()","807d782e":"crcWithdrawAccount()","807d94a7":"maxIssuableSynths(address,bytes4)","807e5cee":"WhitelistUnset(address)","807eb7cd":"sumICOStage1()","807f08ea":"totalDepositedEthers()","807f0ac5":"slice(bytes,uint256)","807f3bce":"adminGetLastSignedTime(address)","807fb834":"resetRaz(uint256)","80806362":"IssueTokenFactory()","808134c8":"setBoardMember(uint256,uint256)","8081a1e7":"ecmul(uint256,uint256,uint256)","8082a929":"holderAt(int256)","8082ee0d":"Exchange(address,string)","80833d78":"unauthorise(address)","80836cab":"enableUpdates()","8084ee58":"setMaxLimit(string,uint256,uint256,uint256)","8085de8b":"MOBToken()","808615ac":"stake(address,address)","8086b8ba":"accountOf(address)","80870bc1":"trackBuy(address,uint256,uint256)","808757ac":"getFreeBat()","8087da3a":"order_number()","8088e0b6":"turnOffCanUpdateNextGamePotSplit()","80892b8a":"calculateTokensReceived(uint256,uint256)","8089d001":"getHashOfBlock(uint256)","808a69e2":"tokenAddressesSet()","808ab1d6":"getCertificationDbCount()","808ac94d":"getWeaponIds()","808ae9f8":"MoveLearned(uint256,uint256)","808c1499":"setIcoPhase2(uint256,uint256)","808cf58e":"initial_reward()","808e0ae2":"platformLogin()","808f30f3":"BitEyeToken()","808f3652":"calcHash(string)","808f4d21":"incentivisingEffortsAddress()","808f8292":"Menu03()","808fc72c":"wasSaleStarted()","8090114f":"percentRate()","809051db":"ipfs_hash()","80906b13":"controllerClaim(address,uint256)","80908b11":"Advertisement(address,address,address)","8090b131":"fetchNumber()","8090d83c":"jackpotProportion()","8090e4d5":"core(uint256,uint256,uint256,uint256,uint256)","8090f92e":"revealVotes(uint256[],uint256[],uint256[])","8091bfc9":"STEM()","8091d7a5":"addCustomField(uint256,bytes32,bytes32)","8091f3bf":"launched()","8091fbe1":"gen0PresaleCount()","8091fc76":"isValidICOInvestment(address,uint256)","80921070":"AvocadoToken()","8092285e":"setODEMClaim(address,bytes32,bytes,bytes32)","809282b2":"EtherTower()","80929e5b":"setBurnable(bool)","80943252":"numGamesTimedOut()","80947d17":"Verification()","80948ddd":"calculateTokenToEth(uint256,uint256)","8094ebe3":"joinGame(address,uint256,address,address)","80956021":"Concept(address[],uint256[],uint256,bytes,address)","80956e8b":"setMintFeeProp(uint256)","80959721":"poster()","80959cb6":"getCloseAmounts(uint256,uint256,uint256)","8095ab76":"songWriterSign()","8095cc36":"createForecast(uint256,uint256,uint8,uint8,bool,uint8,uint8)","8096bac6":"setNewMaxDeposite(uint256)","80972a7d":"ok(uint256)","809837c1":"ITECToken(uint256,string,string)","809841aa":"getCompte_25()","8098e45e":"getRamdon()","8098f67c":"ApexIssued()","80994e15":"STUDToEth()","80999b71":"removeBaseWhitelist(address[])","80999cc0":"MarketplaceInformation(address)","8099f357":"milliTokensPaid()","809a6173":"testCompare()","809a812c":"immlaToken()","809a9e55":"getExpectedRate(address,address,uint256)","809ae91e":"setBattleStart(bool)","809b296d":"consumeOperation(bytes32,uint256)","809c5b9e":"votingDescription()","809d7902":"rejectBid(address,uint256)","809d8988":"getTribe(string)","809d9a94":"transferMonster(address,address,uint64)","809dab6a":"getAvailableBalance()","809e243d":"LanxangCash()","809e4a2d":"claimUnrented()","809e52b2":"updateExperience(uint256,uint32)","809ef92f":"crowdsaleStarted()","809f8cc9":"VersumToken(uint256,string,string)","809fc4f8":"MKRUSD()","809ffb20":"setShopModerator(address)","80a0155c":"RBACMock(address[])","80a0c461":"updateMinimumPodSize(uint256)","80a15ad9":"setRocketValues(uint256[],uint256,uint256[],uint256[],uint256[])","80a1a86b":"countPayment(address)","80a1ba6a":"getTimeLeftToNextCollect(address,uint256)","80a1ec2e":"initUser(uint256)","80a23ddf":"mintBadge(int256,address,uint256)","80a2ddad":"founder4()","80a37e23":"recordHighScore(uint256,address)","80a3a783":"presaleStartDate()","80a3f8b4":"getWorkflowName(uint256)","80a3f9b3":"bonusCapUSD()","80a429ee":"VitaminToken()","80a507c6":"is_started_bonuses()","80a51c5e":"ownerDeclareRefundStart()","80a54001":"parentToken()","80a5cca3":"approveViaProxy(address,address,uint256)","80a6ee7d":"totalTokenBetValue()","80a738bf":"withdrawHighscorePot(address)","80a92b67":"payReward(uint256,address,uint256)","80a973e6":"sendTeamBalance(address,uint256)","80a979e1":"crowdsaleTransfer(address,address,uint256)","80aa5757":"getEtherForTokensOld(uint256)","80aab099":"nextAllowancePeriod(bool)","80ab611e":"cancelRecurringPayment(bytes32)","80abb85b":"refereds(address)","80ac5448":"operatingAddress()","80ac613f":"BatchCreateSales(uint256[],uint256,uint256,uint64,address)","80ac80b0":"iterStart()","80acaafb":"profitDistribution()","80ad17b2":"removeSiteSet(uint256,uint256)","80ad2cf3":"setCap(address,uint256)","80adede0":"currentLoanAmount()","80ae4ebc":"_initialize()","80aed05f":"LooneyDice()","80af6002":"minimumICOCap()","80af6d79":"addEmissionProvider(address,uint256)","80afd844":"getPrivateFundAddres()","80afdea8":"appId()","80b022e8":"changeBurner(address)","80b20208":"thePot()","80b29f7c":"revokeDelegate(address,bytes32,address)","80b30c13":"tokensToSold()","80b38c2d":"ProcessTxFee()","80b3c3d8":"buyTokensWithIcon(address,uint256)","80b44c1b":"extraStatsForGen(uint256)","80b52136":"MoneyCoinCoin()","80b525ce":"BurnableTokenWrapper(address)","80b57824":"discount(uint32,uint256)","80b63e7e":"wakeUp(uint256)","80b6518a":"createEmptyTrack()","80b69199":"releaseBonusTokens(address,uint256,address,bytes1)","80b7ca90":"OrderList(address)","80b855d6":"ZiggyToken()","80b8e6d1":"changeWhitelistStatus(address,address,bool)","80ba4b75":"getActionsCount()","80bb3360":"exchangeToIco(address)","80bc150d":"Bounty(uint256)","80bc99cb":"teamLocker()","80bd0936":"Multivest()","80bd2723":"SecurityChainToken()","80be3cc4":"BurnTokensNew(uint256)","80bf099e":"orphantoken(address)","80bf549a":"maxICOSecondSupply()","80bf98f8":"makeSwapInternal()","80bfbe68":"setWhitelist(address,address,uint256)","80bfc599":"sellVouchers()","80bfe883":"wins(uint256)","80c05bc6":"random_callback(bytes32)","80c0a250":"fetchVoteResultForCandidate(address)","80c18d45":"addAddressToFounders(address)","80c190cf":"getReservedTokensListValInPercentage(address)","80c2fb7d":"currentTreasure()","80c30f3d":"buyContract(address,uint256)","80c324cf":"isBallotInProgress(uint32)","80c3780f":"schedules(address)","80c399f4":"refundInvestors()","80c3f96d":"addFarmer(address)","80c4237f":"tryToWin()","80c4e5c5":"changeSynthesizeAllowed(bool)","80c5bef8":"UGToken()","80c6ff73":"keepaliveBlock()","80c7507a":"getMigration(uint256)","80c80611":"Withdraw_3()","80c810d5":"MucToken()","80c81c16":"getStateInfo()","80c86c30":"CommonError(bytes)","80c8a270":"tokenReserved4Deposit()","80c8fde7":"perTokenAmount()","80c951bf":"currentClaimPriceInFinney()","80c96527":"getAssociatedTAOSetting(bytes32)","80c99dd2":"getPeriodicalBudget()","80ca7aec":"forceReseed()","80caac1d":"setTitleImage(string)","80cae007":"cleanOcean(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","80cd0015":"migrateUsername(bytes32,uint256,uint256,address)","80cd2464":"offer(uint256,uint256,uint256)","80cd5ac3":"newAppInstance(bytes32,address)","80cda248":"EGGS_TO_HATCH_1TOAD()","80cdc9c9":"RESTRICTED_PERIOD_DURATION()","80ce60d1":"setResult(uint8)","80cecea9":"transferToContract(address,uint256)","80cf264d":"getFirstPhaseCap()","80d07ce8":"Gifto()","80d10934":"freeXLMG()","80d1bd47":"jackpotHit()","80d1cb35":"getDeploymentBlock()","80d24e9d":"SISKTechnologyGroupToken()","80d2c1a6":"CatRescued(address,bytes5)","80d32dbb":"ChaoExToken()","80d32f85":"isSoftCapReached()","80d52ed9":"switchToNextRound()","80d563d7":"LogCancelContractProposal(address,address,uint256)","80d61012":"canReceive(bytes32,address,address,uint256,bytes,bytes)","80d7bcba":"incomingTokensTransactions()","80d7d81a":"giveMeBackMyMoney()","80d7f7ac":"TaxicToken()","80d7f92a":"_address(address,uint256)","80d85911":"initialize(uint256,uint256,uint256)","80d8b380":"setQtyStepFunction(address,int256[],int256[],int256[],int256[])","80d8ce23":"publishBytes(string,bytes)","80d95b42":"supplySeed()","80d9eaa6":"refCount()","80daa1c6":"setDiscountForPlayer(address,uint256,uint256)","80db79d9":"StructAndFor()","80dbb7d2":"RacingClubPresale()","80dbde63":"PI_EDIT_4()","80dcaf27":"getRefNumber()","80dcbff1":"getAdminArray()","80dce0b4":"getAwardTime()","80dceec4":"setHuntingPrice(uint256)","80ddcc62":"SUPPLY_HARD_CAP()","80ded586":"removeFromTokenHolders(address)","80dee9d1":"miningStorage()","80df2cee":"TeddyChain()","80df4123":"NucleusVisionTimeVestingTokensMinted(address,uint256,uint256,uint256,uint256)","80dfa34a":"saveBatch(string)","80dfb104":"setCoOwner1(address)","80dfee5c":"NewSale()","80e039f9":"rocketGetResourceValues(uint256)","80e0c053":"MassERC20Sender()","80e13b10":"CompanyTokenIssued(address,address,uint256,uint256)","80e15b56":"cancelCredit(address)","80e15f76":"setBuildPrice(uint256)","80e183a3":"CLASS_PLANT()","80e1b9c4":"finishBattle(uint256,address,address)","80e2517c":"TokensPerEther()","80e2653e":"setDougAddress(address)","80e2d53b":"rateWaitingEnd()","80e339fc":"balancewof()","80e37b5f":"maxIssuableNomins(address)","80e3f1ad":"toggleWhitelist(bool)","80e47e71":"maximumValueWithoutProofOfAddress()","80e52f31":"EtherCash1()","80e5d7b0":"Voted(uint256,uint256,uint256,bool,address)","80e5e069":"ITO_TOKENS()","80e64e8b":"buyBottle()","80e6bffb":"CalculateBankCredit()","80e74b04":"testControlUpdateLatestRevisionEnforceRevisions()","80e8b12a":"_createDungeon(uint256,uint256,uint256,uint256,uint256,uint256,address)","80e9071b":"reclaim()","80e9a1da":"STATUS_LENT()","80e9e9e1":"getClaimIdsByTopic(uint256)","80e9f98c":"getRacer(uint32,uint256)","80ea8273":"SetBonus(uint256)","80eb1cbc":"monsterIdToIVs(uint256,uint256)","80eb6b7f":"LogRemTokenPairWhitelist(address,address)","80ebb08e":"updateResult()","80ebed20":"createBook(address,address,address,uint256,int8)","80ec35ff":"awardByRndNo(uint256)","80ec4a96":"CrowdsaleFinished(uint256)","80ede329":"getDocumentDetails(uint256)","80edef8e":"owner_address()","80ee9792":"_ethDeposit()","80ef353d":"tryClose(bytes32)","80efa4af":"extBuyTokens(address,uint256,uint256)","80f034b1":"getContractBytecode(string)","80f03fa6":"getTotalPets()","80f183ce":"visitCost()","80f20363":"lockToken(uint256)","80f29894":"getWeiForCent(uint256)","80f2fa03":"getSellPrice(address)","80f34c14":"ContortedCoin()","80f393c8":"ProofOfIdiot()","80f3f094":"setGGCAddress(address)","80f41e76":"calcMintFee(uint256)","80f4432a":"inception()","80f4531f":"closeTimerElapsed()","80f4ab5f":"seeMyNumbers()","80f4bcb8":"tokenTeamAllocated()","80f55605":"market()","80f5a37c":"Crowdsale(address,address,address,uint256,uint256)","80f5e0a1":"shouldBoost(bytes32)","80f6c383":"setshares(uint256,address)","80f6d782":"swapAddress()","80f7d0ab":"storeReading(uint256)","80f7e238":"ANIMETOKEN()","80f86009":"Initialize()","80f89a31":"ballotNames(uint32)","80f89bce":"distributeDRMK(address[],uint256,uint256)","80f8d688":"redTeamAddress()","80f8ea60":"Put_BRTH_GFT(address)","80fa272f":"TokenWithMint(string,string,uint8,uint256)","80fa4517":"completedTasksCount()","80fa7902":"getPlayersBattleStats(address)","80fa7942":"tokensForReserve()","80fa860f":"executeElectionMandate(uint256)","80fc16c8":"setAffiliateFee(uint256)","80fe4958":"createBetWithPayable(bytes32,bytes32,bytes16,bytes32,uint256)","80febdbd":"updateMe(string)","81001f3c":"collectFee(address[])","810164f7":"getTotalBPOfAddress(address,address)","81016509":"getBtcRequestHash(bytes,bytes,uint256)","8102387d":"burnRedRibbonCoin(uint256)","81030e35":"ALAP()","810405d6":"numOfPurchases()","81042183":"ExpeditingToken()","81045ead":"getIndex()","8105aa55":"grantAdvisorTokens(address)","81064e2d":"getCreditorAmounts()","8106d57a":"getCityPendingBuildings(uint256,uint256)","8107b269":"Novatore()","81081184":"bursarPayOutNetContractBalance(address)","8108592c":"calcKncStake(uint256)","81086763":"placeNewBid(uint256)","81086918":"delAcceptedToken(address)","8108e54c":"marketAllocation()","810a192b":"transferCollateral(uint256)","810a217f":"pValidationState()","810a3919":"hard_limit()","810a882f":"setConfigBytes(bytes32,bytes32)","810ac3ce":"IssueOffer(address)","810ba058":"Public_Sale_SUPPLY()","810bbec3":"claimHelper()","810be182":"_updateCountries(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","810c0af8":"depositTokenByAdmin(address,address,uint256)","810cbbd0":"bat_match(uint256[39])","810cf6cb":"MRazaAnisTestCoin()","810d54a0":"lockBalanceChanges()","810e4ff0":"cashOut(address,address,uint256)","810e78ab":"declareIcoFinished()","810e9720":"GlobalCoin()","81104666":"advisoryWithdraw()","8111e0ad":"updateMaxTxGasPrice(uint256)","8111ecef":"FinalizeStage()","8111f24e":"isFreezed(address)","81120dd7":"myLastRef()","8112821f":"EthVentures()","8113e285":"withdrawTokenPayment()","8115a2ac":"getOnMintTargetValue()","8115f52d":"Evacuated(address)","8116c063":"claimOwnersEarnings()","811743e7":"fighterIndexToOwner(uint256)","81183633":"setStandard(bytes32)","8118e0ae":"dtValidateWorldSnapshot(uint256)","81193a30":"returnRequestCancel(uint256)","81195993":"allocateEcoFundToken(address[],uint256[])","8119c065":"swap()","8119f4ae":"getRoc(uint256)","811a0a85":"saleComplete()","811aecf4":"finishPhase()","811b1268":"noteSale(address,uint256,uint256)","811bab32":"GenesisCallerAddress()","811c626d":"changeIcoRoundEnding(uint256)","811c66ac":"nameSuccessor(address)","811de206":"isConfirmedByOwners(uint256)","811e1468":"computeAccount(uint256)","811e4f71":"DisburseEarnings()","811e539c":"campaign()","811ea6de":"transferToken(address,address,uint256,bool)","811f273d":"hasThreeYearWithdraw()","811fe466":"beginTime_()","81207183":"deployGLX()","8121b0d4":"verifyStoredData(bytes32)","8121dbc1":"MyPizzaPieTokenPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256)","8121ddd7":"RATE_DAY_7()","81236e47":"setUserYan(address,uint32)","812403f6":"bonusPhaseThreeDeadline()","81240b9c":"subWithdrawFor(address,address)","8124bb0f":"continueExecution()","81252548":"getContractServerBlackWhiteListType(string)","81252680":"getBaseQuick(bytes32)","8125c102":"BountySent(bytes32)","8125c6fd":"_getDividendsBalance(address)","8125ceb2":"showMessage()","8125fc44":"thirdPreSaleEndDate()","81263fed":"getStrandCount()","812699a9":"Quiricos()","81269a18":"voteBalance(address)","81269a56":"checkMintSolution(uint256,bytes32,bytes32,uint256)","8126c38a":"allPunksAssigned()","8126cb1e":"rejectRewards(uint256,string)","8126e4e3":"philanthropise(string)","81281be8":"placeBid(address,uint256,uint256,uint256)","81290a80":"AviciiCoin()","8129212e":"getCommonInitBlockNum()","8129519d":"setLoading(uint256)","8129aa75":"TransferFeeRateProposalAdded(uint256,address,uint256)","8129fc1c":"initialize()","812a4f47":"BeatTokenIcoPhase2Started()","812af8ec":"getAccountData()","812ba50c":"preEndBlock()","812c3251":"Escrow(address,address,uint256)","812c86e0":"updateTokenContract(address,string)","812cbf38":"sellFci(uint256)","812cddf2":"getSavedString()","812cf740":"ArrayPractice()","812d504d":"transferToOwner(address)","812d6c40":"changePercent(uint256)","812e1d1d":"APT(address)","812e6741":"Mountain(bytes32,uint256,uint256,uint256,address)","812ed5cc":"report(address,address,bytes)","812f55c3":"get10Ads(uint256)","812fd5d7":"payToProvider(uint256,address)","813051bc":"createGOP(address,string,uint256)","8130c9b2":"untrustedTokenNumerator(uint256)","8132581c":"amountRaisedInEth()","8132e223":"internalSafeTransferFrom(address,address,uint256,bytes)","81333d57":"LKB(uint256,string,string)","8134064b":"setMotherCount(uint32)","81350bd4":"releaseTimeTeamAdvisorsPartners()","8136c1b9":"registerUserOnToken(string)","8136f02d":"setAddressOfERC20OldToken(address,address)","8136fd26":"createJob(string,uint256,uint256,address)","81395866":"numberOfAdmins()","8139bc2f":"ecothereum()","813a573a":"CheckPurchaseCount(address,uint32)","813b024f":"addProductInUsd(uint256,uint256,bytes32)","813b65aa":"setNewCajutel(address)","813d13cb":"getBB(bytes32)","813d599f":"getValidatorAddress(int256)","813d6c9a":"bonusPercentage()","813d89e1":"artExplain()","813df488":"preMinedFund()","813e7847":"withdrawalNormal()","813e9aca":"init(address,uint256[],uint256,uint256,uint256,uint8)","813f4db4":"isStakingPeriod()","813f563a":"devsHolder()","813f5717":"LinkRevenue()","813fdec8":"getContestStatusForDate(uint32)","8140ce63":"kvtOwner()","8140d0dc":"setContact(string)","8141fd37":"tickRequiredLog()","8142453f":"_saveRequest(address,address,uint32)","8142a25a":"testAliceFooSend()","8142b8d7":"editGardener(uint256,uint256,uint256)","8143e3da":"allBonus(address,uint256)","8143eb2d":"gameOpened()","8143f8a8":"totalGas(bytes)","8144650a":"transferTokenTo(address,uint256)","814487c4":"addSuperReferrer(address,uint8)","8144ee2f":"adventureSettingContract()","8146f323":"isFinalised()","8147bcf7":"deletePlatform(bytes32)","8148d2fe":"getNodeId(bytes32,bytes32)","8149657b":"closeEthPool(uint256)","814971de":"issueReward(uint256,uint256,uint256[],uint256)","8149ea9b":"randomSkill()","814a78f4":"KM(uint256,string,string)","814ab9f1":"salesSupply()","814ae0ba":"gcf()","814b3fe0":"dividends(uint256)","814b53b0":"killCoin()","814c25fc":"setTokenInformation(bytes32,bytes32)","814c2aa1":"changeTotalExchange(uint256)","814e23c8":"calculatePayout(uint256,uint16)","814e3bd3":"ContribToken(uint256,string,string)","814e5c9b":"totalSaleAmount()","814e6d44":"_unpackIdValue(uint256)","814eba9e":"simPunitiveInterestRate(bytes)","814f737d":"phaseThreeEnd()","814f9201":"payUserIncomingTransactionCommission(address)","814fbd8f":"RefundBTC(string,uint256)","81508615":"getBeneficiaryDevelop()","81516c7b":"initialTIPsupply()","8152c7ed":"adminSetRandomInput(string)","81531c64":"Strike()","81547f25":"CONI()","8154b57c":"secondsAfter()","8154d4de":"setMarket(bytes32,bytes32)","81550287":"PRESALE_CLOSING_TIME()","81553709":"releaseEndTimeOfStage(address,uint256)","815639ea":"read_u64()","8156afdf":"Aletheia(address,address,address)","8157d4b5":"bindContract(address)","81580761":"getUniqueLineCount()","815847df":"_addBonusOfReferrer(address,uint256)","81584ff3":"CutieBitToken()","81587463":"sendTradeEvent(uint256[],address[])","81592aab":"instantUpdate()","81597d0c":"mintIcedToken(address,uint256)","815a4876":"setEthereumWallet(address)","815bc7a0":"vote_reward_pool_amount()","815c326d":"ProducerOperations()","815d1fe5":"RewardChannel(address,address,address)","815dcd36":"dailyAccounting()","815def1a":"changeAllocation(address,int256)","815eb7c1":"satoeContract()","815ec64a":"zReceiveFunds()","815f73f0":"m_walletAddress()","816036ae":"removeSmartContract(address)","8160b246":"BONUS_TIER3()","8160f0b5":"minimumQuorum()","81613a62":"LogPause(bytes32)","816163b1":"checkGameResult(bool)","81617f8f":"reLoadXaddr(uint256,address)","81619954":"DAOFactory(address,address,address)","8161c5e5":"main_balance()","8161dfa6":"EmailSent(address,uint256,string,string)","8161f0e1":"execID()","816273f6":"computeAmountBonus(uint256)","8162de9c":"getCryptoAvatar(uint256)","8162f631":"LogFunderInitialized(address,address,string,uint256,uint256)","8163681e":"isValidSignature(address,bytes32,uint8,bytes32,bytes32)","816413f8":"transferPreSignedHashing(address,address,address,uint256,uint256,uint256,bytes)","81641ff7":"casinoBank(address)","81646be8":"setCloseTime(uint256,uint256)","8165354e":"setOracleRegistry(address)","8165913d":"withdrawEthBalance(address,bytes)","81671042":"setOptionLibrary(address)","81676ecd":"FGorToken()","8167d996":"deAuthorize(address)","8168b41e":"TokenTWL(uint256,string,string)","816a873f":"createMorePaymentChannelsInternal(uint256)","816b6574":"LogCrowdsaleFinalized(bool)","816bf490":"transferTokens(uint256,address[],address,address)","816bff5f":"CIFCoin()","816c4ad1":"baseIntCalc()","816c66c9":"updateRank(bytes32,bytes32,uint256,bytes32,uint256)","816c76e3":"GoozeToken(uint256,string,uint8,string)","816c7da4":"approveAllAndCall(address,bytes)","816ca77c":"CollateralSeized(address,uint256)","816d199c":"SIGMA_FTL_SPEED()","816d3da9":"purchaseAdmin()","816d3dc1":"get_info(address)","816dbae4":"monethaVault()","816e117c":"setMaxSize(uint256)","816e24b0":"setupDeposits()","816ed336":"emitFeeSet(uint256,address)","816f3438":"maxFoundationCapUSD()","816f3f4d":"madKing()","816fceb7":"MultiTransaction(address,address[],uint256[])","816ffbab":"Uint256Oracle(int256,uint256)","81702c34":"refund_me()","8170733d":"MyBitFoundation()","81710c78":"getMyPolicies()","8171362a":"votingByXid(uint256,bool)","81715d8c":"pIdIter_()","817189df":"setEarlyLimits(uint256,uint256,uint256)","817246cf":"setsalesdeadline(uint256)","817287d0":"isOwnner(address)","8173832a":"LogUnsortedOffer(uint256)","8173b813":"setNumCities(uint256,uint256)","8173e363":"hard_cap_wei()","817472c0":"TOKEN_INIT(bytes32,bytes32,bytes32)","8174b6d7":"ownerCutPercentage()","81751312":"getAllCardsModifierPrimaryVal()","81758fb4":"bohwa()","8176419f":"SCCC(uint256,string,string)","81767aed":"getIdentifiers(address)","817725aa":"disableChangesMultitoken(uint256)","81776ba4":"backup_refund(uint256,uint256)","81777b78":"Take(bytes)","8177ffae":"PresaleContract(address)","81788e2b":"addAllowedAddress(address)","8178a943":"add_scribe(address)","8178ab99":"_transferFromSenderPaysFee_byProxy(address,address,address,uint256)","8179c2b3":"Result(uint256,address,uint256)","817ad683":"XHO()","817afff8":"_updateWithdrawCountry(uint256,uint256,uint256,uint256)","817b106e":"setChangeIdentityNarcoRespect(uint256)","817b1cd2":"totalStaked()","817b90fe":"getCategoryId()","817c1e52":"startICO(uint256,uint256,uint256,uint8)","817c7483":"settleLeague()","817c8966":"getLevel(address)","817d62a4":"shouldGetHighFive()","817e8332":"STAKE_BONUS_RATIO()","817e9d31":"setFactor(uint256)","817eca0c":"ConstructByEth(uint256,uint256)","817edbd2":"set(uint32,uint8)","817f0023":"recievePayment(address)","817f688f":"BLAAICOIN()","81807a07":"calculateBonusAmount(uint256)","818097c5":"getVotesForCandidate(address)","8180f2fc":"approve(address,uint256,bytes32)","81813963":"claimEDEX(address)","8181b029":"confirmImplChange(bytes32)","818211f8":"getProposalsNum(address,uint256)","8182173c":"PricesUpdated(address,uint256,uint256)","81824d53":"setData_1(uint256)","8182c6a7":"IssueToken(string,string)","81830593":"adminAddr()","818438ca":"getWizzPandaQuotaOf(uint256)","8185402b":"buyAllAmount(address,uint256,address,uint256)","8185b8e9":"getWeiPerCent()","81862f25":"newThreadComment(bytes32,bytes32,string)","81884756":"citationCount()","8188f71c":"holders()","81895b73":"registry(bytes32,address,address)","818a19b5":"FeeAddr1()","818a4b48":"preSaleMinAmount()","818ad300":"TeamVesting(address,uint256,uint256)","818b4564":"DefineType(address,uint32,string)","818c2858":"HPCToken(uint256,string,string)","818c606f":"NewAuction(address,uint256,uint256,uint256,uint64,uint256)","818d4b5d":"owns(address,uint256)","818e8cfa":"setLogoURL(string)","818f7d01":"checkTransferFunctionPrivateSale(address,address,uint256)","818f92c7":"createPurchaseOrder(address,uint256,uint256,bytes32)","818fd7a1":"beforeBuy()","81904676":"lastDistributedAmount()","8190cf07":"setRate_ETHUSD(uint256)","81915a67":"EventSetContract(address,string,address)","8191745f":"Description()","8191ab45":"setUsdConversionRate(uint256)","8191b9a2":"__tokenAndWalletBalancesMatch__(address,address,address)","8191d30f":"crossForking()","81923240":"mine(address)","8192433f":"receiveTokenDeposit(address,address,uint256)","8193327b":"test1Bob()","8193844b":"linkIssuerName(bytes32)","819384a2":"payoutToReferrer()","8194aff3":"Matchpool()","8195031f":"Bitsta()","819512cd":"buyTokens(address,uint256,address)","81961946":"NETR()","8196410b":"GustavoCoinCrowdsale(uint256,uint256,uint256,address)","8196b8c7":"getValueOrZero(bytes32)","81980c27":"SOLOBOT()","81981f7c":"getMyFranklin()","8198edbf":"getFeeRate(address)","819912a2":"setGame(address)","819927e7":"transferUserTokensTo(address,address,uint256)","819abe80":"giveFreeUnit(address,uint16)","819ad6d6":"EstimatedICOBonusAmount()","819b0293":"validPosition(uint256,uint256,address,uint256)","819b25ba":"reserve(uint256)","819b9773":"PaymentAvailable(address,uint256)","819c5773":"withdrawForMany(address[])","819cfdf1":"YFTToken(uint256,string,string)","819e3903":"LogTrade(uint256,address,uint256,address)","819ee03a":"InterfaceId_ERC721()","819f2494":"createOffer(uint64,uint256)","819f255a":"is_passcode_correct(uint256,bytes32)","819f5e24":"burnAndFinish()","819f8927":"setMilestonesList(uint256[],uint256[],uint256[])","81a00361":"YONDcoin()","81a03133":"authorizePayment(uint256)","81a084fd":"remainingGasRefundPool()","81a09bf0":"mergeMedal(uint256,uint256)","81a1384b":"LockedVotingTokens()","81a1fa02":"itemsCounts()","81a22b41":"PaymentsProcessed(address,uint256,uint256)","81a22bee":"reservePart()","81a238b5":"thirdWavePrice()","81a2568d":"setXToken(address)","81a2824f":"getUserBet()","81a28c28":"isSecured()","81a33a6f":"bytesToUInt(bytes32)","81a3b17f":"removeFace()","81a46662":"rolloverPercent()","81a4af15":"rewardTokens(address,uint256)","81a5ad6d":"YamatoCoinCrowdSale()","81a5e88b":"ICOCompleted(uint256)","81a60c0d":"getResults(uint256)","81a73ad5":"getTokenSymbol(address)","81a752ef":"removeSdaContract()","81a7a503":"ActiveProposalNum()","81a7ac54":"MAX_PERCENT_OF_SALE()","81a8e78a":"getGalaxies()","81a955b0":"editInfo(uint256,bytes)","81aa5067":"addLockedAccount(address,uint256,uint256)","81aa8a4b":"pre_PRICE()","81abb800":"lengthOfKeys(uint256,uint256)","81ac9b93":"AuctionCancelled(address,uint256,address)","81accd0b":"create(bytes1,bytes32,bytes32)","81add559":"partners()","81ade307":"query(string,string)","81ae20b2":"setInvestorsBatchSize(uint256)","81aea668":"atNow()","81aee4f4":"getNoteDesignatedReport()","81af0750":"Simt()","81af8949":"getPackBuy(address,address,uint256)","81af95fc":"startAuction(uint256,uint256,uint256,uint256,address)","81afc50d":"delegateCustodian(address,address)","81aff6ec":"get_presale_arbits_sold(address)","81b074ab":"user_on_freeze()","81b1c6bb":"getWinLoseAmountByBettingIdInGamblingParty(uint256,uint256)","81b23042":"burnMonster(uint64)","81b2d07b":"showBalance()","81b2dad9":"setByeSayer(address,bool)","81b3171c":"extGoalReached()","81b31cec":"setNextCommonTTWTokenId2(uint64)","81b3ea13":"getResponseError(uint256)","81b54498":"seedStartTime()","81b69494":"fee_ratio()","81b72d88":"startRequest_callback()","81b736e9":"createChild(uint256,address)","81b7c6e7":"stop_it()","81b7f157":"_updateSpendAvailable()","81b890fc":"setName(uint256,bytes16)","81b93757":"ADEVA()","81baf3ab":"sendTokens(address[],uint256[],address)","81baf55e":"processBuyRequest(string,address,uint256,uint256)","81baf820":"BlockScheduler(address)","81bb1277":"_calculatePointsAndRewards()","81bb2b20":"payFee(bytes32,uint256)","81bb59bf":"goodsNotOK(uint256)","81bb73af":"signArchive(bytes32,string)","81bb9470":"DNCEQUITY()","81bc3657":"migrateSinglePlanet(uint256,string,uint256,uint32,string,uint32,uint8,string,address)","81bc50ef":"getBUA(bytes32,uint256)","81bc8742":"BCToken(uint256,string,string)","81bd24d1":"revertTest()","81bd66fe":"upgradeMeAdmin(address)","81bdc78d":"getProposalAmount(uint16,uint16)","81bf1cff":"ThailandVsMyanmar()","81c0ddc3":"villageinfo(uint256)","81c1346d":"setFundsCreditDaoAddress(address)","81c2d4b6":"freeToken()","81c2d875":"getConsensusRules()","81c385b5":"safeWithdrawEther()","81c405c6":"registerCustomer(address,address,bytes32,uint256)","81c485e7":"getDiscipleSale(uint256)","81c4e1c8":"User(address,address,address)","81c56dfb":"d27d7bad()","81c59c8d":"getStrategyTokenCount(uint256)","81c5b206":"addMeToGame(uint256)","81c648e2":"betYours()","81c64ea2":"SixPlayerRoulette()","81c70870":"ClientUpdated(address,address)","81c79fd5":"transferMerchantProxy(address,address,uint256,uint256,uint8,bytes32,bytes32)","81c7ae3b":"miningEveryDay()","81c8149d":"timeOfLastProof()","81c8b563":"coinLockRemove(address)","81c92486":"ProcessRooms()","81c9786c":"administratorsLength()","81ca3ea1":"hasEitherAttribute(address,bytes32,bytes32)","81cb79ca":"createEmptyTrack(uint256)","81cbeaf0":"getValidated(address,address,uint256)","81cc49dd":"secondLoos()","81ccb678":"Confiscate(address,uint256)","81cd2ffb":"ConversionFeeUpdate(uint32,uint32)","81cd30a8":"round_c_begin_date()","81cd4570":"Moneytoken()","81cd5eec":"bonusPot()","81cd8194":"transferPrice()","81cd872a":"deals(bytes32)","81cda317":"MINTING_HARDCAP()","81cde1a9":"GOOD_ERC20()","81ce7184":"TestText()","81cebf7e":"vestingPaid()","81cedafc":"Nodalblock()","81cf7fef":"registerSmartID(string,string,string,bool,bool)","81d01ed3":"p2()","81d12c58":"requests(uint256)","81d136cb":"presaleAllocation()","81d16e0d":"_isDiamondVerified(string)","81d2c871":"SetMinFee(uint256)","81d2fd9c":"setFaucetAmount(uint256)","81d36f4e":"KEVINTOKEN()","81d38ada":"Remove_member(address,address)","81d38f2d":"SheetMusic(address)","81d3c435":"setAddresses(address)","81d434e9":"transferToICAP(string,uint256)","81d44053":"reading_length()","81d45a5c":"isPreICOPublicClosed()","81d5e753":"CuratedWithWarnings(address[],address,address[],address[])","81d693be":"claimDay(uint16)","81d6c866":"harvestabledivs()","81d77862":"newMostInviter_()","81d92ed4":"shp()","81d96005":"sigDestinationTransfer()","81d961e4":"eligible(uint256,uint256)","81d97051":"setOwnerOne(address)","81d9c5e4":"handleIncomingPayment(address)","81dafe0e":"calculateDuration(uint256)","81db6c28":"redeemVoucher(uint256,address,address[],uint256)","81dc66f4":"checkTankAuction(uint256)","81dca05c":"setAuthorization(address,address,bool)","81dd70db":"kickoffQuorumPercent()","81de10e2":"getContentAt(uint256)","81ded5b8":"numOfConfirmationNeeded()","81df464f":"totalRaisedIco()","81df893c":"withdrawMon(uint64)","81e1ccba":"stakingPercentage()","81e2ef3a":"ReceivedETH(address,uint256,uint256)","81e529cd":"setOwnerFreeDay(uint256)","81e559ae":"clientKeys(uint256,uint256)","81e69eff":"publishMetaData(bytes32)","81e6c686":"returnMaxGoal(uint256)","81e6e083":"getLifetime()","81e75dd0":"testPublicBuy()","81e7645f":"findFigures(uint256,uint256)","81e77878":"getChooses()","81e7a97e":"killMonster(uint16,uint8)","81e7e20e":"user(address)","81e7e329":"test_6_accessRestriction_removeMember_shouldThrow()","81e83991":"howMuchInEscrow()","81e8927b":"getValidationsCount()","81e8a1f7":"newRandomByte(bytes)","81e9abef":"_updateEarnedBy(uint256,uint256)","81ea4408":"getCodeHash(address)","81ea6834":"getEvilMortyAddress()","81eac2ee":"checkClientFunds(address)","81eaf99b":"lockSupply()","81eb3e01":"setValueStep1(uint256)","81ebd8de":"setDeveloperStatus(address,address,bool)","81ebdeea":"testThrowCreateWithNonceRetracted()","81ed8680":"pingTimestamp()","81edaae4":"serviceFee(address,uint256)","81edc308":"insertAndApprove(uint256,address[],uint256[])","81ef1b18":"startFundraising()","81ef93ae":"lastFueledFundingID()","81efc01d":"withdrawHouseStake(uint256)","81f0c440":"MikeChanCoin()","81f1a41b":"CROWD_SUPPLY()","81f1aad7":"setCancelApproveFee(uint256)","81f1d75c":"updateUserEmail(address,bytes32)","81f1f92a":"withdrawSoftwareProductDevelopment()","81f1fa93":"RKCAcquired(address,uint256,uint256)","81f2a3f1":"GetDownTickPrice(uint256)","81f2d44c":"getStarIdAtPosition(uint8,uint8,uint16)","81f2d4ee":"updatePartner2_will(string)","81f3e897":"getSettingData(uint256)","81f4f9bf":"ticketHolder()","81f59f51":"shareService(bytes32,address)","81f5f75c":"getApprovedProxies()","81f65883":"CompetitionStore()","81f6bf7d":"deleteCertificate(string)","81f6c7e5":"_release(uint256)","81f799e2":"reveal_end_time()","81f86241":"ExGirlfriendCoin()","81f8658a":"DATE_OPEN_ON_FLOOR()","81f8a6f7":"checkTokenSupported(address)","81f8b722":"LogIncomeAllocation(address,uint256)","81f91c4a":"transfer(address,bytes32[8])","81fab567":"maxPayments()","81fb1fb4":"participants(uint256,uint256)","81fb2585":"isOfficial(uint16)","81fb3803":"einzahlen()","81fbc084":"mul27(uint256,uint256)","81fbf0a5":"totSupply()","81fbffe1":"getGiftoAddress()","81fc4d90":"increaseLockAmount(bytes32,uint256)","81fc7f2b":"accountFrozenStatus(address)","81fcef3c":"bitcoinContract()","81fcfbcc":"allocateBountyTokens()","81fd63c2":"kanaabbcwalletcoin()","81fdbeff":"TransferCoinsFrom(address,address,uint256)","81fe5786":"max(int256,int256)","81fedc73":"Casinowo(uint256,string,uint8,string)","81feed27":"awardName(uint8)","81ff01f7":"REPOPCore()","81ff4d0b":"TEAM_TOKENS()","81ffdfab":"getTokenAmountForCampaign(bytes32)","82004053":"ownerSetZlotsAddress(address)","8200a57f":"changeOwner(address,address,bool,bytes)","8201ff14":"setNewTerrain(uint256,uint256,bytes32)","820203a3":"ztx()","82023707":"updateSecondUnionIds(bytes32,bytes32)","82024a14":"PromissoryToken(address,uint256)","820267ff":"diminishPool(uint256)","82027b6d":"isAllowed(bytes32,address)","8203e7f3":"justSendDonations()","8203f5fe":"initContract()","82043443":"transfer_(uint256,address,address,uint256)","820447fc":"TrimpoToken(uint256,string,string,address,address,address)","8204ecdd":"getFee(bytes)","82067cc0":"pauseRoundB()","8206ba89":"MAX_STAGE_2_LIMIT()","82076979":"TeamTokenHolder(address,address,address)","820776de":"DivsToRefundpot()","8207b07d":"lastPurchasePrice()","8208921d":"getWalletFor(address)","8208df23":"stack(address,uint256,uint256)","820935dd":"HDILToken()","82094fa4":"setAddressAdmin(address)","8209b38a":"Freecoins24()","8209d121":"a_viewSellOffersAtExchangeMacroansy(address,bool)","820a5f50":"fundedAmount()","820b9f1e":"kncPerETHRate()","820bec9d":"receivedETH()","820c05db":"FPINCOIN(uint256,string,string)","820c1dd0":"pollBurnQtyMax()","820c59bb":"GetIsPauded()","820c7468":"isVendorOf(address,address)","820c815e":"EGGS_TO_HATCH_1DINO()","820cfa06":"LogUserRemoved(address)","820dc540":"lockBalanceIndividual(address,uint256)","820e0d1f":"getChallenger(bytes32)","820e5e0b":"DividendRecycled(address,uint256,uint256,uint256,uint256)","820e79ed":"cstBalanceLimit()","820e93f5":"email()","820ecdaf":"iou_purchased(address)","820f52bc":"validPeriods()","820f9b85":"changeBetRange(uint256)","82100be6":"getWinningPayoutDistributionHash()","82100e3f":"deploymentBlock()","82104786":"Profit1000()","8210f13b":"BatchCancelSales(uint256[])","82123075":"safeExit()","82123cd2":"prizeReferee()","8213dafc":"setupAirDrop(bool,uint256,uint256)","82142370":"preICO(address)","82147bb4":"getGuardianNum()","8214fe03":"setMetadataChannels(string,string)","82154075":"Rentable()","8215c35d":"bincentiveErrand()","821648f4":"accessHolder(address)","8216ed6c":"getCompte_22()","82173d11":"KentKoinToken()","82189551":"buy(uint256,bytes)","8218e540":"insertHash(uint16,uint8,uint8,string)","821919fd":"getPetCanPresellCount()","821b771f":"targetBondingRate()","821b98f3":"closeTheoreticalClosedAuction(address,address,uint256)","821bee73":"vestings(uint256)","821c9a57":"test_testableStandardCampaignRefund()","821d7356":"setMainnetLocked(bool)","821e2491":"MyBetting()","821e4496":"isVerifiedCode(address,bytes32)","821e9169":"testFailControllerChargeMoreThanApproved()","821f830f":"addPack(address)","82202a15":"fetchCurrentSnapshotBlockIndex()","8220e945":"FactoryChangedEvent(address)","8221ac6f":"_createHolderId(address)","822221a6":"setContractToken(address,address)","82222674":"changeEndBlock(uint256)","822296d4":"isList()","8222a5ce":"insurance_Token()","8222aa1e":"settle(address,uint64,uint64,bytes)","8222b7e9":"getBonusPercentage()","8223188c":"Rose43()","82233b7a":"returnHostCut(uint256)","8224b76b":"StartOK()","8224ca2b":"SaleEDUSupply()","82251b99":"DRONECOIN()","822785e4":"_setTokenDescription(address,uint256,string)","82281104":"incise(uint256)","82286755":"MyRefundableCrowdsale(uint256)","82288e89":"setAccountIsNotFrozen(address,bool)","8229268b":"StageThreeDisable()","822942aa":"placeDeal(bytes16,address,address,uint256)","822a46ae":"setTiimPrivateSaleAddress(address)","822b08d0":"grantManagerPermission(address,string)","822b0be3":"teamTimeLock1()","822b1747":"_getEpicPlusRarity(uint32)","822bd0dd":"BOT_ELEMENT_3()","822c7671":"testControllerShouldBeSet()","822cba69":"setUint64(uint64)","822d487d":"getBrands()","822d9b4e":"onlyOwnerGetBountyWallet()","822daf60":"timeFactor()","822e1506":"_bonusRatio2()","822e57f1":"depositHelper(uint256)","822ee26c":"canMovetoken()","822f31e2":"AlexCoin()","822f7eb4":"setFeeReceAccount(address)","823113c7":"thresholdsByState(uint256)","823126d5":"_createToken(address,uint256)","8231ee98":"lastTimeGen0()","823213ef":"removeExclusiveRate(address)","823287b7":"chargeQuarterlyRate(bytes32,address)","8232e09e":"DeleteUser(address,address)","82330505":"setCommissionPoints(uint256,int256)","823374e3":"changeDedicatedProxy(address)","8233fbcb":"getTotalProfit(address)","82348bab":"setMinSlippageFactor(uint256)","823506af":"getData_29()","82351b43":"getLinearRelease()","82357105":"bl()","8236342c":"hashToPoint(bytes32)","82367b2d":"updatePrice(uint256,uint256)","8237ab8d":"IsSeedMember(address)","8237bbf0":"min_shares_to_sell()","82381c96":"WatchCurrentMultiplier()","8238520f":"getParentBranch()","8238b968":"BeatOrgTokenMainSale(address)","8238cc8f":"getFIRST_STEP_MULTIPLIER()","823914d9":"multisigETH()","82396bc6":"lnLimited(int128,int256)","82396f60":"getTokensInAction()","8239773a":"NePay()","8239b1e7":"getSequenceId(uint256)","8239b29d":"periodITO_hardCapInUSD()","823ab43b":"returnedTo(address)","823ac373":"verify(bytes32,bytes,address)","823b7475":"UpgradeAgentSet(address,address)","823ba0b8":"burnFormula()","823ba381":"InvestClose(uint256,uint256,uint256)","823bce43":"zasxzasx()","823c82ca":"FREEZE_PERIOD()","823e1832":"ChangeClientCategory(address,uint256)","823e569e":"controlWallet()","823e6e79":"validateBalance(address)","823edd48":"getComponentId(uint256,uint256)","823f57ca":"withdrawFromAmt()","82401f06":"transactionSwitch(bool)","82402743":"createPromoNarco(string,string,address)","8240ae4b":"challengeReparameterization(bytes32)","8242216d":"jackpotOfHouseEdge()","82425d7c":"hasNoBids()","82428323":"updatePeriodically(uint256)","82430c07":"_sendOwnership(address,address,uint256)","824338bd":"founderAllocation()","8243a036":"presaleFemaleTokensLimit()","8243fd61":"addMilestone(uint256,uint256,uint256,uint256,string)","8244208c":"FrescoToken()","8244b8c8":"findEndpointByAddress(int256,address,address)","8244ee58":"Amberella()","824563f6":"mintingContractAddress()","82457d53":"periodTable(uint256)","82474b1b":"teamName()","8248159e":"registerApprove(bytes32,uint8,bytes32,bytes32)","82484a36":"vestingToken(address)","82484c0b":"BetstreakICO()","824891f8":"changeMinimumCap(uint256)","82489311":"_buyNationInternal(uint8,uint256)","8248e722":"updateConfig(uint256,uint256)","824916b6":"playersAmounts()","82495626":"getVoteAccount(uint256,uint256,uint256)","824989c3":"changeLifetime(uint256)","824a5166":"ChannelCloseRequested(address,uint256)","824be3c7":"TheRichestWins()","824d1b4b":"preICOStartDate()","824d5603":"getIndex(uint16,uint16)","824d84d5":"createVestingContractWithFloatingPercent(address,uint256,uint256,address,uint256[])","824dbc9a":"changeMembership(address,uint256,bool,string)","824e5ebf":"distributeETHOS(address[],uint256)","824eddd9":"removeSupportedToken(address,address)","824eec3b":"editionOfTokenId(uint256)","824f0f7e":"tittyContractAddress()","824f2f1f":"globalConstraintsCount(address)","82507c5a":"Radix()","8250ea7d":"getReferralPool()","8250f7e5":"isInvestmentPermitted(address,uint256,uint256)","82518c2a":"exercisePut(uint256,uint256,uint256)","82520e07":"receiveFrom(address)","82528791":"setWallets(address,address,address,address,address)","8252ad9c":"totalAuction()","8252b2cf":"acceptCreatureOwnership()","8252e391":"transferInternal(address,address,uint256,bytes,bool,string)","825374ba":"buyATCToken()","8253adf1":"createBet(bytes16,bytes16,bytes16,bytes16,uint256,uint256)","82544c1f":"GoWalletToken()","8256687c":"addClaim(bytes12,bytes12)","82568a24":"p_update_planetCryptoCoinAddress(address)","82576dd6":"Laundromat(uint256,uint256)","8257f610":"canPurchase(uint256)","8258cbbd":"getContractETH()","825918ee":"delgodaddress(address,address)","82594f09":"iMaliToken(address)","825993ab":"totalCouponsUSD()","8259c78c":"depositPpm()","825a229e":"setEditor(address)","825b8b42":"buy(uint16[])","825bdb74":"setSecondaryManager(address)","825c3e36":"closeGame(bytes32,uint8)","825d7034":"RiptoBuxToken()","825e04d3":"dfs()","825edfd3":"getClassMechValue(uint256)","825f5a93":"RoundDSold()","825f6552":"SVET()","82609d51":"failedDonations()","82611dfe":"setOption(string,uint256)","8261b6bf":"receiveTokenLoot(uint256[9],uint256,uint8,bytes32,bytes32)","8261c4c7":"MINERS_HOLDER()","8261cfe4":"travelTo(uint256,uint256)","8261eb1b":"frtToken()","82629384":"shareStoredTokens(address,uint256)","8262963b":"setInfo(string,uint256)","8262fc7d":"addrBalance(address)","8263a938":"getProposalLength()","8263e953":"_claimSocialNetworkIdentity(uint256,uint256,address,uint8,bytes32,bytes32)","826446fa":"parse2wei(uint256)","82645725":"Planetagro(address)","82648222":"retrieveWCT2()","8264fe98":"buyPunk(uint256)","8265d137":"checkRegistrationStatus(bytes32,address)","8265d577":"TestreplayAnser(uint256)","8265dbc1":"bonusAndBountyTokens()","8265fb13":"optionPoolMembersAmount()","82661dc4":"splitDAO(uint256,address)","826679a1":"getFundSPBalance()","82672304":"GeneratePublicKey(string,string)","82672482":"vestingRegistered()","826776fa":"claimTeamTokens(address,uint256)","8267a9ee":"deleteIntValue(bytes32)","82688f14":"bn128_multiply(uint256[3])","8268efcd":"RunningAuctionsEvent(address,uint256,uint256,uint256)","82692679":"doSomething()","82699367":"CicadaToken()","8269cf4d":"seo(uint256)","8269d3c0":"buyTokensT4T(address)","8269df9b":"getLastCategory()","8269ee3d":"Issued(address,uint256,uint256)","826a483f":"_emitHashSet(address,bytes32,bytes32)","826a49c9":"removeGameInfoFromArray(uint256)","826c10d9":"exhaustBattle(uint256)","826c2447":"PGDToken()","826c69b8":"participantBalance(address)","826c6f73":"addServer(string,uint256)","826cc57a":"referral_address()","826d3379":"tierPrice(uint256)","826db6c8":"SLFYCoin()","826e9def":"initPresaleTokenVault(address[],uint256[])","826efb6d":"payBonus(address[])","826f57a1":"endBetting()","826f8a00":"createOrder(string,string,string,string,string,string)","827037d6":"modCEOAddress(address)","827037db":"icoStart()","8270c41e":"setPriceToken(uint256)","82712aeb":"purchaseWolkEstimate(uint256,address)","827147ce":"returnString(string)","8271bedc":"getUserBetsLength(uint256)","8272d083":"isSupported(address,bool)","82731247":"isB(address)","8273a411":"allBalancesOf(address)","82744368":"minimumEtherAmount()","82757f99":"withdrawTeamPot()","82760c88":"GoGlobals()","82766b1b":"setAmount(address[],uint256[])","82768708":"weiMinimumGoal()","8276bd19":"PROPOSED_STATUS()","8276ccf2":"setHeroName(uint256,string)","82771c8e":"isSane()","82771ff4":"endPlaceOrder(uint256)","82776521":"strConcats(string,string)","8278337a":"writeAttributeFor(bytes32)","8278fcea":"AirdropReward()","82790c19":"SideBridge(uint256,address[],uint256)","82797bea":"Preesh()","8279c7db":"setReceiverAddress(address)","8279ea54":"change_bounty_manager(address)","827aeb16":"_changeTittyPrice(uint256,uint256)","827bc64b":"setLeftoverTokensBuffer(uint256)","827bfbdf":"setLocation(string)","827c049e":"emission()","827c1e41":"getTittyByWpId(address,uint256)","827cc452":"withDrawMoney(uint256)","827d084a":"getActiveBusinessesPerCity(uint256)","827d7ba9":"Fosha(address)","827e4cf1":"manuallySetNumRewardsAvailableForChildAddress(address,address,uint256)","827ef325":"_parseMsgData(bytes)","827ef4c7":"m_fundsAddress()","827f143e":"setPresentMoney(uint256)","827f32c0":"generateTokens(address,uint256)","827fc57c":"ChickenFarmer()","827ffcea":"horas()","8280114b":"addressOfERC20Token()","828033da":"getFlag(uint256,string,string)","82803c22":"sell_tokens(uint256)","8280b498":"setFrozen(address,bool,uint256)","82812aed":"BuyPriceSet(uint256)","8281da38":"refundBet(address,bytes32)","8281feaa":"QuestionIs(string,string)","828282e9":"bonusRates(uint256)","8282e1e4":"SEPA()","828363b4":"transferAdviser(address[],uint256[])","828375e8":"computeTokensWithBonus(uint256)","82838c76":"subTotalSupply(uint256)","8284f2a7":"proposeGame(address)","82857a03":"approveAndCallWithSender(address,uint256,bytes4,bytes)","8285d272":"GOAL_REACHED_CRITERION()","82862275":"getDeadline(uint256)","82872491":"setCaps(uint256,uint256,uint256,uint256)","8287ccb4":"onDeposit(uint256)","8287d6ce":"_createDeposit(address,uint256,bool)","828806cd":"submitTransactionWithSignatures(address,uint256,uint8[],bytes32[],bytes32[])","8288196d":"THANKSTEST1()","8288edd0":"nonTransferrableBalances(address,address)","828909bd":"getIntValue()","82892dd9":"blockMember(address)","828a33b9":"FreeDiceCoin()","828ae96d":"cdc()","828c06cd":"expLimited(int256,int256)","828ca03c":"getTaskListSize()","828d671c":"dyn_sig()","828dfbca":"user_acq_address()","828eab0e":"defaultResolver()","828f1b42":"buyObject(address)","828f4057":"numberofGamePlay()","828f5fba":"air2(uint256,uint256,uint256)","828f717c":"fixPlayerID(uint256,uint256)","828f8581":"tokenTransferFunctionIdentifierMap(bytes32)","8290d1e0":"StandardTokenDeployable(string,string,uint256,uint256,address)","8290fe25":"finalizeExits(uint16)","8291286c":"contractId()","82914e5d":"getObjectData(bytes32[],uint8[])","82916381":"execute(address,uint256,uint256,bytes)","82917320":"increaseLockedBalance(address,address,uint256)","8293779c":"isOps(address,address)","82939b27":"getPreSaleData()","8293a114":"unbanAddress(address)","8294a796":"WelfareHandout(address,uint256,uint256,uint256,uint256)","829534d7":"m_pendingIndex()","8295a9ba":"checkDupe(string)","829644a6":"freelanceReinvest(address)","82964696":"ZSYCoin(uint256,string,string)","8297b90c":"PRESALE_LENGTH()","8297d46d":"BTL_ATHENIAN()","8298c3b5":"itemVoteDn(address,uint256)","8298c5dc":"last_winner()","829923bf":"admin_setAdmin(address,bool)","829965cc":"epochCount()","82996d9f":"rent()","829981fb":"FinalToken(uint256,string,string)","829a34c6":"getUserInfo(bytes20)","829a92f4":"hardcapChanged(uint256[])","829bd99c":"balanceOfByLegacy(address)","829c3428":"startTransfer()","829c38e1":"claimSolve(uint256[],uint256,uint256,bool)","829c3dee":"createDebt(bytes32[8],bytes,uint256)","829e9ece":"deathData_v16()","829ebdcd":"upgradeFor(address,uint256)","829ed3a5":"ownerTokenTransfer(address,address,uint256)","829efd71":"TonhaoCoin()","829f0667":"verify_sk_knowledge(uint256[2],uint256[2])","82a0888b":"totalSaleWei()","82a09cc5":"TokenCreated(uint256,address,string)","82a123ea":"WhitelistUpdated(uint256,string,uint256)","82a147cd":"addYouCollectContract(address,bool)","82a18331":"MOONCOINCONTRACT()","82a1ce1b":"setSourceToken(address)","82a352e4":"firstStagePriceOfTokenInWei()","82a35706":"tokenSoldPreICO()","82a3e5df":"STATE_CLAIM_ENABLED()","82a3f98d":"VOTING_PERIOD_DURATION()","82a5285d":"getMinBetAmount()","82a60a59":"CollectibleIndex2()","82a62137":"activateAccount(address)","82a66d93":"earlySponsor()","82a7cf1e":"ownerOf(uint16)","82a86cda":"getRarePLATInfo(uint256)","82a90545":"funComputeRoundTime(uint256)","82ab890a":"update(uint256)","82ab8a82":"startDeal(bytes32,uint256)","82ac1d99":"getNodeValue(bytes32)","82acaa39":"getChildrenAgainstAnimalId(uint256)","82ad5ecf":"yeedToken()","82ad6f35":"refund(address,address,uint256)","82ade405":"forceChooseRandomWinner()","82ade466":"getWithdraw(address,address,uint32,bytes32[],uint256)","82ae2227":"createUser(uint32,uint64)","82af3526":"addGift(address,uint16)","82afd23b":"isActive(uint256)","82b00403":"finalFundGoalReached()","82b022e0":"set_species(uint256)","82b0444e":"CityMayor()","82b0627c":"changeFundingTime(uint256)","82b0862f":"addBps(uint256,int256)","82b1ad50":"totalPrize()","82b1b4f3":"WithdrawToAdmin(uint256)","82b1b617":"ViewSellOrder(address)","82b1fb0d":"setGlobalMultisigWallet(address)","82b2a559":"buy(uint256,uint256,address,address)","82b2e257":"getTokenBalance()","82b2f95f":"DEVELOPER1()","82b49248":"BlockOne()","82b57b96":"MONUMENT_UN_FEE()","82b58599":"WeiHash(address)","82b68f4f":"actionVotedRate()","82b74b89":"lockTransfers()","82b7b500":"find(string)","82ba614f":"setRound(uint256,uint256)","82bb326b":"isGoldMigrated(address)","82bbcc2c":"removeIdArrayItem(address,uint256[],string,uint256)","82bbd1fe":"setlastprize()","82bbdbec":"nameAvailable(string)","82bbe9cc":"getGameFee(uint256)","82bc07e6":"lastRound()","82bcd463":"DAKUToken()","82bcef79":"increaseAllowanceProxy(address,address,uint256)","82be0ccd":"distributeTokensToApprovedUsers()","82be415d":"BonusDealer()","82bf6464":"DAOrewardAccount()","82bf9a75":"setPip(address)","82bfa9f2":"upgradeStorage(address)","82bfc739":"reLoadXaddr(address,uint256,uint256)","82bfefc8":"TOKEN()","82c00a50":"getCourseLength()","82c0287e":"deleteEtherBox(address)","82c058d9":"showTrnsactionLog(uint256)","82c0652a":"calcMultiplier()","82c174d0":"preSigned(bytes32,address)","82c198ef":"fxpDiv(int256,int256,int256)","82c20f84":"preSaleBonus3Percent()","82c26c6a":"GOCToken()","82c30220":"Earthcrypt()","82c4175d":"privateRate()","82c48f9e":"_batchTransfer(address,address[],uint256[])","82c51376":"LENRCoin(uint256,string,uint8,string)","82c59c81":"getGameBlocks(uint256)","82c6b2b6":"OfficalHold()","82c7340e":"GetPlayerRound(address)","82c7bac7":"callOnExchange(uint256,bytes4,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)","82c7bf2f":"Zigger()","82c7f4d6":"setMessagefromdovie(string)","82c8ac27":"DatCrowdPreSale(address)","82c8c76f":"blocktube(uint256,string,uint8,string)","82c9004a":"computeArtistGenesisSaleFee(bytes32,uint256)","82c97b8d":"collectReward(address)","82ca116d":"changeBankAddress(address)","82cac6df":"lastRate()","82cb08aa":"MoveToBase(uint256)","82cb9df9":"addrFinance()","82cbb2e4":"Dagelane()","82cbdc0f":"create(string,string,string,address)","82ccef76":"GameEnded(address,address,uint256,uint256,uint8,uint8)","82cdc0fb":"setRunTimeAfterSoftCapReached(uint256)","82cdc93e":"getPlayerInstWinning(uint256,uint256,uint256)","82ce6523":"IWasFirstShareToken()","82cee91c":"BonusPeriodFor(uint256)","82cf114c":"setProfitAddress(address)","82cf2116":"transferAndAuction(uint256,address,uint256,uint256,uint64)","82cfd1e0":"turn_flag_OFF()","82cfee4d":"BitcoinSapphire()","82d1407c":"calcTicketEarnings(uint256,uint256)","82d18650":"minPay()","82d1bc89":"Darks(address,address)","82d22377":"infraIndexToApproved(uint256)","82d288c2":"setMintingCurator(address)","82d29195":"FundingStageNum()","82d2dcfb":"UETH()","82d33374":"updateLastTransactionTime(uint256)","82d40041":"getAbilitiesForCollectibleId(uint256)","82d419f5":"fullUnlockAngelsAccounts(address[])","82d4685c":"setAllocations(uint256,uint256,uint256,uint256,uint256,uint256)","82d559de":"catchMonster(address,uint256,uint32,string)","82d5eb98":"playerIdToExtendedAttributes(uint256,uint256)","82d708c4":"dividendRecentBuyersPercentage()","82d74005":"YUPTimelock(uint256,uint256,address,uint256)","82d82983":"RuralBank(uint256,address[])","82d8dff6":"getMaxPrice()","82d95df5":"setStartDate(uint256)","82d9ac39":"percentForBounty()","82d9b9bb":"turnOffCanUpdateNextGameMinAndMaxBlockUntilGameEnd()","82db9bd4":"setCaissa()","82dc107d":"SECOND_TIER_SALE_START_TIME()","82dc1ec4":"addPauser(address)","82dc5c9d":"UnionChain()","82dc7836":"openGate()","82dc87b6":"RefundPeriodStart()","82dced63":"testHitPresaleCapPresale()","82dd6012":"_aremoveByIndex(uint256)","82dd87dc":"deleteUser(uint256,uint256)","82de6df7":"getGameBegin()","82deb6cd":"m_publiclyDistributedTokens()","82decb49":"_maint_setCustomSeed(uint256)","82dfc5f7":"WETH_ADDR()","82dfe1fb":"changeTreeAttributes(uint256,string,string)","82e2f767":"finalizedNextUpgrade()","82e3036c":"StandardToken(string,string,uint8,uint256,address)","82e37b2c":"getPlayerName(uint256)","82e380ef":"auctionInformation(uint256)","82e41258":"unregisterPrefix(string)","82e43a3b":"TheFrozenSolidShitCoin()","82e46b75":"setCoin(address)","82e5d073":"getRewardTokenCount()","82e615fc":"bidRegistry()","82e61d79":"PayoutDividends(uint256,uint256)","82e6bbd2":"onlyBouncerExecuteDelegatecall(address,uint256,bytes)","82e6d3d6":"foundationSupply()","82e77165":"_setAllKeys(uint256,uint256)","82e93309":"importGenesisPairs(address[],address[])","82e94ac5":"eject()","82e96916":"setCoinPercent(uint256)","82e97740":"initAffiliate()","82ea3985":"clearNextArenaTime()","82ea97b3":"tokensForIco()","82ebaec4":"distributeTEST(address[])","82ebe9ba":"photoData()","82ec5ddc":"BioToken(address,address,address,address,address)","82ec623c":"_noThrowImplements(address,bytes4)","82edaf94":"tokenContractAddress()","82ee27cc":"setCoinBalance(address,uint32)","82ee282b":"thirdBonusSalesEnds()","82eed60c":"pauseCrowdsale(address)","82ef351a":"getTotalMonster()","82ef6483":"RabbitCore(string,string)","82ef8fa8":"adminClaim()","82f0151c":"MetaHash()","82f0622a":"teamReward()","82f0b31c":"getLife(bytes32)","82f0d875":"makeHash()","82f128f7":"MJOYToken()","82f16872":"raffle_balance()","82f19e3a":"deltaTFunc(uint256,uint256,uint256,uint256,uint256)","82f1ec1f":"getActivityAccountInfo(address)","82f2045c":"getEntitiesCount()","82f2a164":"addCET6(uint32,uint32,uint32)","82f2d8d7":"moveMarketData(uint256[],uint64[],uint64[],uint128[],address[])","82f39e2f":"mktTokenCap()","82f43303":"roundMax()","82f4b3a8":"badgeIfFreeze(address)","82f4ef73":"getStageName()","82f56556":"udgradeAttack(uint256,uint256)","82f5a3e1":"withdrawTotalBalanceDonateWei(address)","82f5e31b":"convertFromWei(bytes32,uint256)","82f66ff0":"RabbitCoin(uint256,string,string)","82f68dc4":"rankOf(uint256)","82f7325e":"CRYPTOVENO()","82f768d4":"tokenbeneficiary()","82f78260":"acupuncturecoin(uint256,string,string)","82f8152c":"account2()","82f858e8":"addresses4(uint256)","82f867a4":"BpsToken()","82f8767d":"SuperPAC()","82f87fdb":"checkFundingStateFailed()","82f8b6e9":"roundInterval()","82fa3421":"push(uint256,bytes32)","82fa7f8b":"weiPerWholeToken()","82fa9c0d":"isPersonalBonuses()","82fac352":"getPricesOfLatestTradeRecords(uint256)","82fb3b7c":"voteNoLockByAdmin()","82fb63c7":"getImageCurrentRegionId(uint256)","82fbbe47":"Ticked(uint256,uint256,uint256)","82fbdc9c":"register(bytes)","82fc49b8":"setCosignerAddress(address)","82fd5bac":"getDeal(uint256)","82fe1e46":"JaneToken()","82fef47d":"addToLists(address,bool,bool)","82ffee45":"approveRemoveOwnerRequest2()","82fffde0":"get_articolo(bytes,bytes10)","830010f3":"setReferrerRewards(uint256[])","8300399d":"aqwsaqws()","8301cfec":"backVenusCoinOwner()","8301fb2e":"cashOutTank(uint32)","8301fb61":"userHasSmartSpeed(address)","830245e3":"sumICOStage7()","830321be":"PGUC()","83037b81":"checkInterest(address)","830402c1":"startGameGas()","83054b6a":"GetConsentDirectiveCount()","8305d1c3":"GGGToken()","830639ac":"isWhitelisted(address,uint256)","83076a73":"updateCfo(address)","83084b3f":"setNotInWhitelistAllow(uint256)","8308c786":"minBlockGap()","8308d7e9":"set(address,uint256,uint256)","830953ab":"claimAmount()","830adf56":"get_previous_user_recast_from_item(bytes32,bytes32)","830b3a1e":"setIsFixed()","830b6868":"getPriceCredentialItemId(bytes32)","830b6b87":"MyOffer(uint256,string,uint8,string)","830cbbbd":"redeemToken(address,uint256)","830ced52":"TIER_1_CAP()","830d0627":"giveCdpToProxy(address,bytes32)","830d77d4":"ETHERONEUM()","830e8e64":"callAmendment(uint256)","830ef41b":"transferERC20(uint256,address,address,uint256)","830f2935":"icoAgent()","830f3d8a":"Diploma()","83100580":"PriceWeekTwo()","8310d61c":"getLastGame()","83111397":"blacklistAddr(address[])","831121dc":"getLockedStateAddress()","83123f30":"setRole(address,bytes32,bytes32,uint256)","83123fa6":"coinsIssuedIco()","8312a886":"tokenValueCount()","8314b490":"earlyContribList(uint256)","8314dcb4":"unAuthorizeContract(address)","83150a93":"opetTokenBalance()","83160d71":"setPrices(uint256,bool)","8316394e":"allow(bytes32,string,address,bool)","83186be0":"startICO_w1()","83187cf4":"cryptaurRecovery()","8318e40b":"transferBcoupons(address,uint256)","83197ef0":"destroy()","8319da07":"setOwnerCut(uint16)","831a1754":"TOKENS_HARD_CAP()","831a1a3c":"ECPoints()","831aab01":"setData_15(string)","831aba43":"referralsOf(address)","831b19c2":"KOToken()","831b3f67":"convertDustToEther(uint256)","831bb4f2":"setAcceptedLegacyAugmintToken(address,int256,bool)","831c2b82":"getChannel(bytes32)","831d3e09":"offFreezing()","831dc22c":"CATCrowdsale(uint256,uint256,uint256,address,address,address)","831e0485":"twitterIdOfClaimerAddress(address)","831e1deb":"changeExchange(uint256)","831e6270":"isSaleFinalized()","831e80f2":"create(string,string,uint8,uint256)","831ed348":"clearJoinedCrowdsales()","831f5ad2":"remainBalanced()","831f750e":"claim(address,string,string)","832018aa":"BitSelectProtegido()","832048d4":"TokenLoot(address,address,address,address,address,address)","83206e78":"marriedAt()","83212e74":"updatePreSaleCloseTime(uint256)","83219a8a":"editMetadata(uint256,string)","8322fff2":"ETH()","83234aa6":"FileInfoManager()","8323550b":"TUSD()","8323bebb":"TokenSold(address,uint256,uint256,uint256)","8324a852":"partner(address,address,uint256)","8325229a":"playerWithdraw(address)","83253cfa":"cancelMarginCallOnBehalfOf(address,bytes32)","83255d6e":"getOwnProducts()","8327a313":"test_initialize()","832880e7":"getUser()","83289567":"meetingDate()","8328b610":"setStakingRequirement(uint256)","8328dbcd":"migrationAgent()","8328e032":"setStandardPackPrice(uint256)","8329ac52":"voteForCandidate(string,string)","8329df0a":"allowReferrals()","832a66a2":"purchaseCardinal()","832b0dc3":"testThrowOnTransferToNullAddress()","832b2c60":"specialManagerAddressNumberMap(address)","832b9eb2":"MANHATTANPROXY6THAVE()","832bc28d":"getPoolHistoryCount()","832bff3a":"setForkEndTime(uint256)","832df980":"lockEmission()","832e02ef":"getUpgradeValue(address,uint256,uint256,uint256)","832f6412":"getCenturion(uint256)","832f6924":"shuliang()","83315b6e":"CONTRACT_FEATURES()","83318574":"maxPreSaleStage()","83324e8c":"numGroups()","833270d8":"preIcoEnd()","833331e8":"totalJadeProduction()","8334278d":"reserves(uint256)","83343d80":"deleteItem(bytes32)","833472ba":"TCOCOIN()","83347622":"newTeam(string,string)","83349122":"crowdsaleIsOpen()","8334d195":"viewToken(uint256)","8334e170":"SellableToken(address,address,address,uint256,uint256)","83366ab0":"addBytes(bytes32,bytes)","8337077b":"returnToken(string,address,uint256)","83370c25":"FFFToken()","833747f8":"getLovers(bytes32)","8337680a":"getMyCommitmentCount()","833888f0":"LAF()","83393882":"contracteeWithdraw(uint256)","8339e153":"SETPointerToken()","833abf3a":"registerAssetProxy(bytes4,address,address)","833b4596":"testApproveSetsAllowance()","833be5d5":"getTotalLoans()","833c202e":"UNITTransferWhiteList()","833cde52":"SaleToken()","833cf6fc":"TransCompleteds(address[])","833d56c7":"doSwarm(address,uint256)","833ea306":"soldForThird()","833eaa8b":"incise(address,uint256)","833eccc5":"batch_transfer(address[],uint256[])","833f43c2":"refill(address)","833ffb63":"removeOverride()","83405ddb":"unstakeCommunityTokens()","83408d73":"burnRemainingTokens()","8340f549":"deposit(address,address,uint256)","8341f26c":"icoTokenLimit()","834292a3":"CanYaCoin(address)","8342a9d9":"crowdfund()","8343816d":"AcceptCastleOffer(uint256)","8343e416":"asideTokensHaveBeenMinted()","83442b1e":"opt(address)","834472a5":"buildICOStageOne()","8344d26d":"TryUnLockCreatorBalance()","834614dd":"freeSub(address,uint8,bytes32)","8346378b":"transferBenship(address)","8346aa47":"spentParsecCredits()","8346d3c6":"MultiVesting(address)","8347a0d1":"issueTokenAndTransfer(uint256,address)","8348bfb9":"setICOAddress(address)","8348cf1e":"authorizeAmount(address,uint32)","8348d71f":"strConcats(string,string,string)","8348fe61":"createCenturion()","83492ff1":"deletePrice(string,string,string)","83499fdf":"BitcoinRed()","834b1aa1":"m_owner20()","834be978":"getRewardedSumByRound(uint256)","834c3351":"getGoldDataWeight()","834c6c84":"setCCH_edit_19(string)","834cc6fc":"createEscrow(address,address)","834d42c6":"serverForceGameEnd(uint8,uint256,uint256,int256,uint256,uint256)","834e0565":"GiveRNG(uint256)","834e476f":"newAuctionID()","834e6261":"CreateICO(address,uint256)","834ee417":"start_time()","834eebe8":"calculatePremium(uint256,uint256,uint256,string,string,string)","834f199d":"_calculateRequiredManaAmount(uint256)","834f54d0":"CarPark()","8350dfaf":"fetchdivstopot()","8350eb5e":"getHashInDataObject(bytes32[])","835164a0":"INBCToken(uint256,string,string)","8351a0d4":"getCumulativeProfit()","83525394":"NONE()","83537b5f":"test_threeValidEqInt()","8353bb51":"ROLE_STATE_PROVIDER()","8353c9c8":"SetFreezingEvent(address,uint256,uint256,uint8)","8353ffca":"Withdraw(uint256,address)","835409f0":"InfimonkCoin()","835436b4":"evictWorker(address)","835592f8":"passed(address)","8355c263":"frozenMinDeposit()","8355e15c":"withdrawTokens2(uint256)","8356027e":"unfrozenTokens()","83563dc6":"_getYear(uint256)","83565503":"setMember(address,bytes32,address,bool)","83565cc7":"additionalAction(bytes32,uint256[])","8356a5b5":"weekOneStart()","8357417d":"WithdrawDevFunds()","8357c2f0":"setAmountToReceive(uint256)","835850f9":"_bytesToAddress(bytes)","83586713":"computeResult(uint32,uint32)","835939d5":"vote(address,bool,string)","8359f045":"range(int256,int256,int256)","835a749d":"partialRedeem(uint256,address[])","835ac5ce":"softcapUSD()","835b3720":"setGeneKind(uint8)","835b42fc":"testThrowUpdateLatestRevisionNotUpdatable()","835b862f":"OneGameToken(address)","835bbd55":"reserveTokens(address)","835c1154":"checkInvestments(address)","835c19f3":"receivePayment()","835c6386":"isPurchasePossible()","835c853b":"notaryFee()","835cb53b":"MAXIMUM_NON_WHITELIST_AMOUNT()","835d2d2e":"executeTransfer()","835e119c":"availableSynths(uint256)","835e33e7":"DianJingToken()","835e98d7":"bonusShare()","835eb9f8":"ShieldNetwork()","835ec6ef":"CreateDDFT(address,uint256)","835f6775":"setBonusesForAmounts(uint32[],uint32[])","835fa3ac":"icoSuccessful()","835fc6ca":"withdrawal(uint256)","835fcab3":"NAME_HAWKING()","836028a2":"disputeOpen()","83607b02":"calculateDevCut_(uint256)","836115fe":"unlockedTokens(address)","83617782":"startLive()","83624c17":"getPartyA(bytes)","83627b8e":"getEmployeeId(address,address)","8362f6eb":"balanceSender(address)","83634ad7":"fnv(uint256)","83636209":"RecoveryKeccak256(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","83638710":"getOwnerOf(uint256)","83638c12":"GCOIN()","83640881":"getTokenOrdersLength()","8365172c":"num_levels()","8366437d":"RegisterUser(bytes32,bytes32[8])","83664dd3":"substituteManagerContract(address)","8366ee2b":"getPayeeLenght()","83672f3e":"setWallets(address,address,address,address)","8367e120":"apiUrl()","836826a6":"highestBet()","83685488":"TECHToken()","836880d3":"softcapAchieved()","8369ff08":"log2ForSmallNumber(uint256,uint256)","836a1040":"mint(uint256,address,uint256)","836a107f":"removeFromKYCList(address)","836a1e23":"collectExcess()","836adfd9":"libbibatchbacktest(uint64,uint32[],uint64[],uint64[],int64[],int64[])","836b680f":"createProductionUnit1()","836c67d7":"BAC()","836cca1d":"privateIcoMax()","836d6d66":"WeeklyLotteryB(address,uint256)","836d8b2a":"SolusPlatform()","836d9665":"removeUsersWhitelistA(address[])","836dea0b":"myEther()","836e4158":"numOrdersOf(address)","836e643f":"endStake(address,address,uint256)","836e8180":"round1()","836e9431":"updateUsersList()","83711c70":"ContributionResolved(bytes32,bool,address,address,uint256,uint256)","83714834":"factorial(uint256)","83714b27":"_safeMul(uint256,uint256)","837150cf":"paused(bool)","837197b2":"sendTokens(address)","8371e1e9":"rescale(int256)","83725a91":"Payment(address,address,uint256,uint256,address,uint8,uint256)","837356b1":"doNotAlwaysRequireCosignature()","837381fa":"withdrawFromContract(address,uint256)","837386ca":"candidateXPAAssets()","83739eda":"allocationsInitialised()","8373ae71":"cancelTradeOffer()","837564dd":"CNotes(string,string,uint8,uint256,uint256)","83771e56":"BSCToken(uint256,string,uint8,string)","83773de8":"_transfer(uint32,address)","83781340":"registerTradeProfile(bytes,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,bytes,uint256)","83786f8c":"getBalanceOfToken(address)","83788fce":"nextBlock()","8378ce42":"readStamped(bytes32)","837929b6":"getEventful()","83794502":"payForTask(uint256,uint256)","8379d75b":"BDC()","837a7ba5":"testThrowTransferDisabled()","837a8eb3":"CATWithdrawn(uint256)","837ada41":"cens()","837b68c8":"requestTokenExchange(uint256)","837cfb34":"LADYCoin(uint256,string,string)","837d52d8":"RAIT()","837e4cd9":"getNameAndAge()","837e60e6":"removePA(uint32)","837e6a94":"setOverride(address)","837e7cc6":"rollDice()","837f1bf7":"_appendTagged(string,string)","838006c0":"OwnableOZ()","83804c69":"verifyTransaction(bytes32,uint256,address,address,uint256,address,address,uint256,bytes32,bytes32,bytes,bytes)","8380edb7":"isUnlocked()","8381ada3":"GOLDEQ()","8381f58a":"number()","83829bf1":"Involve()","8382a574":"Factory(address,bytes32,address)","8382b460":"getSlashRewardPart(bytes32)","83835c01":"accuracy()","8383671b":"mintTokens1(address,uint256,uint256,bytes32)","8383bfc8":"EscrowFoundry()","83841e0c":"change(string,string)","838445e8":"EtherAds(address,address,address)","83852cf6":"setEnablePurchase(bool)","8385fa0f":"ESCROW_WALLET()","838661eb":"unfreeze_periods()","8386927a":"ToSponsor()","83876bc9":"newProposalInWei(address,uint256,string,bytes)","83879c15":"cooRemoveManager(address)","83894548":"getTokenBalanceOf(address)","838985d7":"gymFee()","8389f353":"setNumCities(uint256)","838a05e4":"part20Transfer()","838a48d6":"disableBlackListForever()","838bdce2":"team3Token()","838c29b6":"checkInterval()","838c63b7":"avgRate()","838ca346":"currentFunds()","838d6e05":"getChannelInfo(uint256,address,address)","838eb17e":"takeSnapshot(uint256,uint256)","838f0602":"SOLEToken(address,uint256)","838f5165":"refundFor(address[])","838f7f94":"getTotalAmountOf(uint256)","839006f2":"rescue(address)","8390b02a":"rfindPtr(uint256,uint256,uint256,uint256)","83914275":"getUserBonusBalanceByType(address,bytes1)","83917229":"_createGameItem(string,address,uint256,uint256)","8391a1c4":"get_table_size(uint256)","8391e45c":"dividendsOwing(address)","8391e48d":"WCoin(uint256,string,uint8,string)","83924dea":"MyTestToken(uint256,uint256,string,string)","83944a4b":"CreateWTE(address,uint256)","839484a7":"Iou_Token()","8394f639":"SimpleExchange(address,uint256)","83955bb2":"SpecialPurchased(address,uint256,uint256)","8395aa94":"PLATINUM_AMOUNT_SKL()","83960e3c":"importTokens(address,uint256,address)","8396392d":"add(string,string,string,address)","839655c8":"BetOnHardFork()","83973dc3":"withdrawBAT()","83975e7d":"PapaBearToken()","83979803":"setNewRateLevel(uint256,uint256)","8397a260":"getAction(bytes,uint256)","8397cc94":"tokenFallback(address,uint256,bytes32)","8397f3bc":"isBonusPayable(address,string,uint256,uint256,uint256,uint256)","839849c0":"changeBaseMultiplier(uint256)","83985082":"disarm()","839930ba":"getMinimumBet()","839972f9":"lockToken(address,uint256,uint256)","83999223":"release_all()","8399f93f":"reservedFund()","839a01be":"privateLockedAmount()","839acf14":"buyMonument(uint256,uint256)","839affc3":"batchDepositTokenTo(address[],address[],uint256[],uint256)","839b2386":"ReverseRegistrar()","839b240e":"setHardCapCrowdSale(uint256)","839b913e":"getTargetReportsPerLimitedReporterMarket()","839daf1d":"migrate2(address,uint40,uint40,address,address)","839dbbb1":"iconicsCount()","839df945":"commitments(bytes32)","839ea3c4":"startVotingTeam(uint256)","839ff719":"FML()","83a076be":"gift(uint256,address)","83a07765":"drawTicketCount()","83a18678":"total_racers()","83a1a3aa":"setC4FContractRequesterLock(address,bool)","83a1a4f2":"YesNo(string,string,string,string,string,string,bytes32,address,string,address,uint256)","83a1f52a":"GetManifestoByCategory(string,uint256,uint256)","83a287dd":"closeGame(bytes,address,uint256,uint256[],bytes,bytes)","83a37262":"stopQueueing(uint256)","83a41f93":"descentX()","83a4f2f5":"whitelistOperators(address)","83a51213":"takedaily(address)","83a51ad0":"oraclize_setConfig(bytes32)","83a6595f":"setMinDonation(uint256)","83a68993":"gameOp()","83a6ad6b":"grantAccessDeploy(address,address)","83a6b565":"payCommission(uint256,uint256)","83a7b701":"masternodeRegister()","83a9094f":"PRICE_RATE_THIRD()","83aa4958":"getContributeAmount()","83aa9985":"ownerTwo()","83ab12e7":"Auctions()","83abd7e2":"removeIdentifier(address,bytes32)","83ac44e6":"marketingAccount()","83ac4ae1":"_sendWinnings()","83ac98fe":"transfer_Different_amounts_of_assets_to_many(address[],uint256[])","83ae0839":"ETNToken()","83ae5266":"addCertificate(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,string,bytes32[],bytes32[])","83ae62c4":"_frozeAmount()","83aec57c":"getUsersForDate(uint32)","83af3c40":"getRemainingTokenAmount()","83b01a83":"updateTAOContentState(bytes32,address,bytes32,uint8,bytes32,bytes32)","83b14c0a":"toAddr(uint256)","83b23b40":"cEthereumlotteryNet()","83b2c476":"updateLibrary(address)","83b2d77f":"signFact(bytes16)","83b3999a":"addToAddresses(address,address)","83b3c85f":"pecul()","83b40eb7":"creditEqually(address[],uint256)","83b47a4d":"whitelist_addys(address[],bool)","83b4918b":"reinvest(uint256)","83b49485":"BurnablePayment(bool,address,uint256,uint256,string,string)","83b58323":"setTransferFeePercentage(uint256)","83b5ff8b":"ownerCut()","83b60a33":"transferToken(uint8,address,uint256)","83b665b9":"purchase(uint152,uint256)","83b83c1c":"setOpGas(uint256,uint256)","83b8b9f0":"ForceCloseContract()","83b8c8f6":"bonusLevel100()","83b9e9f7":"train3(uint256)","83ba3a97":"sendTeamSupplyToken(address)","83baa6f4":"presaleopeningTime()","83bd5f42":"distributeDevCut(uint256)","83bd72ba":"stopGame()","83be9d54":"placeBet(bytes32,address)","83bebcc2":"changeSellPriceForAthlete(uint256,uint256)","83bebced":"_rate()","83bf1cbc":"delayDefaultRelease()","83bf4609":"createTemplate(string)","83c08784":"Incrementer3()","83c0dd25":"LogNewAllocation(address,uint256)","83c10844":"percentLeftFromTotalRaised()","83c17c55":"setFactoryAddress(address)","83c1f2e6":"unlb()","83c218c2":"oraclizeId2proposalId(bytes32)","83c28ddc":"getRefundAmountForFunder(address)","83c28ecc":"getTokenWithdrawHold()","83c3bd6b":"isEqualLength(address[],uint256[])","83c4c2e9":"makeSuccessor(address)","83c4cc46":"StartCrowdsale(address,address,uint256)","83c51a38":"thesimplegame()","83c56fc8":"dailyTotals()","83c592cf":"stake(uint256,bytes32)","83c5e3c9":"removeBRA(address)","83c68f48":"AIChain()","83c6aa47":"arrangeUnsoldTokens(address,uint256)","83c75ed5":"setGatewayB(address)","83c7d7c1":"sumMultiplayer()","83c7f14c":"bytesToBytes4(bytes)","83c81bec":"Arbiter(address)","83c99722":"lockforTransfer()","83ca8632":"_getCrabPartData(uint256)","83cb2fee":"INITIAL_SEED_FARMING_AMOUNT()","83ccc2b5":"_0xBitcoinCash()","83ccc8b8":"getEtherContributed()","83ccdcc3":"detailsOfWindow()","83cd5e13":"debug_multiplehash(uint256,uint256)","83cdb517":"transfer_to_0(uint256)","83ce63b5":"doRouletteBet(bytes,uint256,bytes32,bytes32,bytes32)","83ce8a61":"changeMPO(address)","83cfab42":"unFreeze(address)","83cfbd7f":"revokeOwnership(address)","83cfc5f2":"changeNameRestricted(string)","83d158f0":"ShadowToken()","83d2421b":"setWorkerPort(uint256)","83d4f946":"round0EndTime()","83d51a38":"concatString(string)","83d52f36":"OpenAIChainToken()","83d53895":"interfaceSupported(address,bytes4)","83d6236c":"amIin()","83d66353":"LotteryGames()","83d67fc1":"_addAddressToGrantAccess(address,uint256)","83d7529f":"reservationFromBackend(uint256,bytes32,address,uint256,uint256)","83d852d9":"shutdownTransactions()","83d880d0":"setParticipationCap(address[],uint256)","83d8a90f":"theDonkeyKing()","83d8bae3":"listItem(uint256,uint256,uint256,address)","83d8e480":"registerCoin(address,string,string)","83da4d86":"ApolloCoinToken(uint256,uint256,address,address)","83db0680":"TOTALSHARES()","83db1548":"addPost(uint256,uint256)","83db8e31":"HMCToken()","83dbb27b":"invalidOrder(address)","83dbc55b":"verifyXOR(bytes32,bytes32,uint8)","83dbff4b":"get_first_item_in_state(bytes32)","83dc077d":"acceptContribution()","83dcecd3":"CompanyTokensIssued(address,uint256,uint256)","83dd7aa4":"setBankName(bytes32)","83de6ed6":"changeStageTwo()","83dea2a8":"renounceExcluded()","83df762f":"BDayToken()","83df7d21":"updFreezeEnabled(bool)","83dfd040":"isPresaleFull()","83dfe5fd":"C()","83e03c3d":"HumanERC223Token(uint256,string,uint8,string)","83e06ead":"setPercentages(uint256,uint256,uint256,uint256,uint256)","83e07382":"setMovePermissionStat(bool)","83e19248":"afterStart()","83e19a95":"MANAGEMENT_LOCKED_PERIOD()","83e1bb4f":"dequeueIngot()","83e219eb":"removeFromTotalSupply(uint256)","83e256dc":"gameIdGame(uint256)","83e2a0c4":"joinGame(address,uint256,address)","83e3607c":"fourthBonusSalesEnds()","83e48d43":"_sptc(uint256,uint256,uint256,uint256,address)","83e49c53":"burnWithData(address,uint256,bytes)","83e4eed0":"apply(string,string)","83e5cb26":"ownerAddCeo(address)","83e78b31":"bet(uint8,bool,uint8)","83e7f347":"ICOBank()","83e811a6":"founderLockup()","83e83b54":"payBounty()","83e8dbb8":"calculateSaleAmount(uint256,uint256)","83e99a93":"balanceOfUnclaimedTT(address)","83ea0620":"packageExists(string)","83ea5111":"MESH(uint256)","83eb7257":"companySupply()","83eb72ac":"getStrandDescription(uint256)","83ec0648":"BlockStackCoin()","83ec0bd2":"showPeopleInQueue()","83eca581":"setReferrerReward(uint256)","83edf023":"totalWeiRecieved()","83eed3d5":"queryN(uint256,string,bytes)","83eeecc0":"ethInWei()","83f0b184":"calculateMaxContribution()","83f0bb45":"_getPartSkillLevel(bytes,uint256,uint256)","83f11daf":"SetCandidatePrincipal(uint8,uint256)","83f1211b":"transfersLocked()","83f12f91":"grantFounderTokens(address)","83f12fec":"batchTransfer(address[],uint256)","83f13e7f":"setNewDividendContract(address)","83f2a8ca":"dividendsCalculated()","83f3c3df":"PaymentGot(bool)","83f537cc":"LendingBlockToken(address)","83f57fd7":"_addDemoc(bytes32,address)","83f5b46f":"refSystem()","83f5e360":"_unpackClassValue(uint256)","83f66212":"getTop11_20Messages()","83f6cc69":"transferAllowedOf(address)","83f6d9a4":"validateNameInternal(string)","83f7a095":"setCoefficient(bytes2,string,uint256)","83f7b8e1":"getNumberOfPhotos()","83f7e2d7":"reduce(uint256)","83f94db7":"upgradeImplementation(address)","83f95f13":"openClaim(string)","83f9a788":"BlockTubePrepaid(address)","83fa07fd":"fechAllCandidates(uint256)","83fa2039":"Dealer(address,address)","83fa7e02":"isSiringClockAuctionStorage()","83fa87f2":"activateAdSlot()","83fae425":"setPresaleAllocation(address,uint256)","83fb42ba":"proposeBurning(uint256)","83fbbc7a":"OnlineSocialChainToken(uint256,string,uint8,string)","83fbc2b4":"weiRised()","83fc58b4":"tranferOwnership(address)","83fcafbb":"GetPrizeFund()","83fcb85e":"revertFunction()","83fcf308":"getPropertyRating()","83fcf973":"unlockVestedTokens()","83fcfafe":"LooqCrowdsale()","83fd65d8":"setETHExpectedFee(address,uint256,uint256)","83fd8a64":"CBCK(uint256,string,string)","83fe05f1":"PutFreeEther()","83fe10e4":"isMetered()","83fee16d":"finalizeUpdate(uint256,address)","83ff0189":"buy_tickey_free()","83ff1bb6":"approve(string,uint8)","83ff5bf2":"Bittobit()","83ff9bec":"petCardDataContract()","8400c307":"isRecipientAllowed(address)","8401824f":"compactFraction(uint256,uint256,uint256)","84019cae":"WOWToken()","8401e614":"lengthOfPermissions()","8401f8d1":"addMultipleToWhitelist(address[])","8402181f":"pull(address,uint128)","8402ac99":"firstYearEnd()","84035e07":"amendEarlyPurchase(uint256,address,uint256,uint256)","8403be91":"isAppRegistered(address)","84048497":"listMultipleItems(uint256[],uint256[],address,bytes32[])","84054d3d":"cashout()","8406ab82":"deleteGame(address)","8406c079":"relayer()","84073164":"transferFromPie(uint256)","84083c89":"addWhitelistUser(address)","84086357":"crowdfundFinalized()","8408643a":"getBlockTimestamp32()","840880f2":"TeamLockingPeriod18Months()","8408cb9d":"setPreICOPrice(uint256)","840aab14":"_hasName(address)","840b7403":"computePayout(uint256,uint256)","840bc19c":"NON_PAYABLE_AMOUNT()","840c0ca9":"setMaximumClaimPriceWei(uint256)","840c401f":"pruneRestrictStock(address,uint256)","840cfffd":"burnIndexedByAddress(address,uint256)","840d7fb6":"createLottery(address,string,string,uint32,uint32,uint8)","840dea74":"COMBINED_WEI_GOAL()","840e2673":"startTransferTime()","840e78fd":"projects(address)","840eb43e":"removeLicenseTerms(bytes32,bytes32)","84100d5c":"selectRandomTrait()","841016d0":"setAdditionalOwners(address[])","8410956a":"initialise(address,uint256,uint256,uint256,uint256,uint256)","84109e50":"setTiimKyberGoAddress(address)","84120645":"setMasterRewardsPercent(uint256)","841237b7":"Wallet9()","841244a8":"FeedCreated(uint256,string)","84125e0b":"withdrawBalancesToNFC()","84126e01":"cancelPayment(string)","841302ce":"getHash1(uint8[5],uint8,bytes32)","84132cf5":"deposit(address,uint8,bytes32,bytes32)","84140c40":"delFromVestMap(address)","841410cd":"maxETHContribution()","84160ec0":"getAddressesAccounts()","84168c01":"tradesUnlock(address)","8417fa2f":"goPublic()","8418cd99":"contribute(address,uint256)","8418dc36":"teFoodsAddress()","84191f62":"changeController()","8419604e":"SendingBounty(bytes32,uint256,address)","8419c986":"foundTime()","841a12bd":"setKittyTokenAddress(address,address)","841b4cd8":"registerForRaffle3()","841baf2c":"m_tokensClaimed(address)","841d0ac3":"init_daylimit(uint256)","841e6ce9":"betFee()","841eb7f8":"paymentRewardTokens(uint256)","841efac4":"updateFieldss(uint256,uint8,uint256)","841f3729":"howManyTokensAreReservedForMe()","84219204":"minVotedTokensPerc()","8421ec8a":"MyCash()","842249cb":"weiTotalReceived()","8422927d":"cancelPayment(uint256)","8422b3bf":"RailzToken()","8423157b":"getWinAmount(uint256,uint256)","84248a51":"changeDrawFee(uint256)","84249ed0":"manualBuyPrice(uint256)","8424b40d":"setLotteryCore(address)","8424f952":"IMEIM()","84268051":"payoutToOwnerIsLimited()","84269ed9":"transferFrom(address,address,uint32)","8426a452":"getSellingItem(uint256)","84270db0":"selfdestructTokens()","84281dcc":"isBalanceSufficientForContractCreation(address)","8428cf83":"recoverAddress(bytes32,uint8,bytes32,bytes32)","84297029":"getIdxBatchByUsername(bytes20[])","84298882":"setLogo(uint256,string)","842a6415":"DTRC()","842acf9d":"mintDSBIToken(address,uint256)","842b6357":"checked_in()","842b8efa":"FailedMarking(bytes32,bytes32,uint256,int256)","842bc37b":"GetSmallCotractIndex(address)","842bfad2":"updateParticipantCapTier2(uint256)","842c17be":"firstStageMinted()","842c45c5":"ROBIES()","842e062f":"p_setCurrentRoundJackpotPercent(uint256,uint256)","842f10d1":"dropMultiple(address[])","842ff2bd":"numPolls()","84300859":"setTokenUnlock()","84304ee5":"chronus()","84311353":"totalAmountOfPurchasesInCny()","84313086":"divCutMaster()","84317008":"setprice(uint256,uint256)","84317143":"INITIAL_EARLYBIRD_TOKENS()","84321b41":"ligerAdminAddress()","843296d6":"DealCancelationReason(uint256,address,uint32,uint32,uint256,string)","8433acd1":"collectTokens()","8433d6f2":"from_Initialisation_to_cycleDeVie()","84344415":"chargeMoney()","84345b35":"createRandomZombie_ZOB_goldpack()","8434c80d":"cleanArray(uint256[])","843545be":"getPrinciple(uint256)","843584f1":"log_recast_fees(address,address,uint256)","8435be4b":"getLastFarm(uint8,uint8)","8435da61":"getTile(uint16,uint16,uint8)","8435f147":"bytes32Func(bytes32,bytes32)","8436bd4e":"MintyMcCringleToken()","84370813":"subscribe(uint256,uint256)","8437b2a5":"tier(uint256,uint256)","84385c6f":"assignOperator(address)","84386004":"channelsSold()","84394e6f":"addValidation()","8439f80d":"accumulatedBalanceOf(uint256)","843a7f74":"getCKNPriceNow()","843aa0db":"insert(uint256,uint256,uint256,uint256)","843ad7b5":"dailyMintable()","843b1a09":"spendNonce()","843b4386":"addComment(string)","843bd641":"itemExists(uint256)","843cbae4":"EtherBattleCoin()","843cfb9e":"vestingTotalPeriods()","843e240e":"getAuditContractUri(uint256)","843e8d27":"downVote(bytes12,bytes12)","843fcf90":"EOSGold()","843ff6f6":"getTitulaire_Compte_7()","8440b3b0":"BUY_INCREASE()","8440d167":"getCategory(address)","84413b65":"airdropAddress()","8441f89e":"deleteWitness(address)","8442171d":"bonusLimit2()","84429480":"TokensBought(address,uint256,uint256)","84429579":"getRunningTokenPairs(address[])","844323fa":"xtime()","8443f07c":"UVIDIFYTOKEN()","8444b391":"getUpgradeState()","84465fa5":"changeFeeOwner(address)","844669b3":"accountC()","844706a6":"UsdCapUpdated(uint256,uint256)","84477036":"tempTokensBalanceOf()","8447c02f":"takeAGuess(uint256)","8447c4fa":"LibraToken()","84488126":"isForceExecute(address)","844891a0":"ABTCETHER()","8449129e":"EthereumNova()","8449133b":"initQuoteBalance()","84491566":"getPrevRoundWinnerCount()","8449b0af":"PRICE_MULTIPLIER_ICO5()","8449d772":"withdrawM5()","844bdea4":"LhsToken(uint256,string,uint8,string)","844c3edc":"setThresholdSendToSafeWallet(uint256)","844c4264":"cycleEndTime()","844c7d95":"updateBalances(address,bytes32,string,address,uint256)","844d38ee":"view_get_Gains()","844d65c5":"whitelistedMax(address)","844dbf67":"RecurringPayment(address,uint256,uint256,address)","844e774d":"joinraffle()","844e89a9":"Unregistered(bytes32,uint256)","844ea6f9":"E25()","844ef097":"bridgeValidatorsOwner()","845051d3":"testContractsNotNull()","8450b12e":"getSupplyLimit(uint16)","8451738d":"rentHo(uint256)","8451d312":"showAllFunds()","845238fe":"lookup(address[],address,address,bool,bool)","84533794":"setEthRate(uint16)","845381c0":"FailedVote(address,string)","84539789":"useNeonMarbles(address)","8453a8c8":"Factom()","84545ef8":"setRegionPurchasedPixelPrice(uint256,uint256)","8454665d":"startingInsuranceBalance()","84553e16":"AccessAddress(address)","8456cb59":"pause()","84570d0d":"assertEq5(bytes5,bytes5)","84571235":"minimum_bet()","84585099":"TransferTo(address,uint256)","8458644c":"play(bytes32,address,address)","845890c3":"buyATR()","8458bd70":"getHp(uint256)","8459857f":"mentors()","845a51ec":"rewardPoolAddress()","845a7468":"getStakersAndAmounts()","845ab425":"getProjectDescription(uint256)","845b6aca":"buyBasicCards_Migrate(address,uint256,uint256)","845c8801":"checkHasPermissionForPack(address,address,uint256)","845d586f":"publicTransfersEnabled()","845dcc2b":"_isSoldOut()","845e76b3":"getStudentArray(bytes32)","845eaedb":"SmartVows(string,address,address,string,address,address,string,string,string,string,string,bytes,bytes)","845ec8de":"FOUNDER_EXCHANGE_SHARE()","845f5593":"initStages(uint32[],uint32[],uint128[],uint128[],uint128[],bool[])","846030a0":"hasClaimableShares()","84605d0d":"total_iou_withdrawn()","8460a9d9":"suicideSend(address)","84610618":"registerRequest(int256,int256)","846153b5":"registerAddresses(address[])","8462151c":"tokensOfOwner(address)","84622425":"onlyPrimaryMock()","8462df7f":"diff(uint256[],uint256)","8463bcf5":"countClients()","84644ec9":"addPromise(uint256)","8464878d":"emergency_used()","84653605":"DateCoin(uint256)","84658e2a":"sendtoken(address,uint256,address,uint256,address,uint256,address,uint256,address,uint256,address,uint256)","846639dc":"currentAwards()","8466c3e6":"aa()","846786f1":"openIco()","8467d9cf":"refundPayment(uint256,uint32,uint32,uint256,string)","8467f7cb":"resetContract(uint256)","84682fbb":"auxWorstPoints()","84691cd8":"grapesToProduceBottle()","84696810":"winningCountry()","846a09e1":"AddAuthorityAddress(address)","846a284e":"_addTicket(address,uint32,uint8)","846a5dde":"delayPayment(uint256,uint256)","846b055a":"startCrowdfund(uint256,uint256)","846b0ef0":"proxiedContribution(address)","846b23d4":"getEmployerInvoicesByStatus(address,address,uint8)","846b68e3":"MERCULET()","846e5851":"LogStudentUncertified(address,uint256,address)","846e832d":"getStateAt(uint256)","846e980d":"setFreeLobster(uint16)","846f1185":"sendEthProportion(address,bytes,uint256,uint256)","846f652b":"getSpawned(uint32)","8470ffd6":"_transfert(address,address,uint256)","84716854":"investInCharger(uint256)","84734476":"copyBytes(bytes,uint256,uint256,bytes,uint256)","8473e55f":"amountForSale()","8475bfed":"div18(uint256,uint256)","8475f6f9":"getPublicKeyG()","8476f105":"Menu08(uint256)","847760ee":"getArtToken(uint256)","847778ad":"edit(address,address)","84780009":"getFinishStatus()","84788f01":"mvnperethBonus()","847927ed":"icoEtherMaxCap()","847a1ca6":"raiseSellOrderCreated(address,uint32,uint32,uint80,uint256,int160)","847a5e99":"getPlayerStats()","847af92c":"setMintMode(uint256)","847bd61c":"processPurchase(uint256[])","847c096d":"removePresaleContributor(address)","847d97ab":"add(string,address,string,uint256)","847dc0a7":"percentageETHReserve()","847dc59e":"MicoinToken(uint256,string,string)","847dd67c":"buyEth(uint256)","847e09f2":"TOKEN_HARDCAP()","847e12c4":"FixyNetwork()","847e27d9":"wanToken()","847e2ba1":"revokeAccessMint(address)","847ec2de":"totalBunny()","847eefb6":"ICOHardcap()","847f2177":"Electron()","847f4a88":"stopSaleType(uint8)","847f8a10":"Refund(uint32)","8480021c":"crowdfundDeadline()","8480544e":"getCAOAmount()","848125ea":"issueBlockReward()","8481573e":"contractBalanceOf(address)","8482167e":"makeCall(address,uint256,bytes)","84837981":"BTCT()","8483dfcc":"isOverflow(uint256,uint256)","84841523":"Buttcoin()","8484dc24":"removeEmissionProvider(address,uint256)","8484ff59":"setTokenCollectable(bool)","8485b90c":"proposalAuthor()","84861e93":"auctionState(uint256)","84869679":"isDistributionDue(address)","8486d444":"_getUsdAmount(uint256)","848784e5":"transferPreSigned(bytes,address,uint256,uint256,uint256,uint256)","8487b73a":"Milestone_BankLicenseFailed(string)","84883795":"ico_rejected()","84885ed6":"getData_19()","8488e58a":"setReturnableToken(address)","848a0327":"dividendForYearly()","848a2130":"releaseChecksum(uint8)","848b3821":"fundingCapReached()","848b86e3":"updateWallet(address)","848c0a39":"buildLeft(address,uint256)","848dd14e":"CostStuff(address,uint32,uint256)","848e3442":"automaticThreshold()","848efb3d":"rentOut(uint256)","848f002f":"setBoolF1F2(bool,bool)","848f1470":"disableRefundPeriod()","848f6d8d":"OneBroGlobal()","848faed7":"BAI20()","84900b04":"whitelistContract()","8490d598":"wholeTokensReserved()","8491b49c":"rain(address[],uint256[])","84922374":"isDistConfig()","84924b60":"findAndPayTheWinner()","849292bc":"emitStateContractChanged(address)","8492aa9c":"getAddressNickname(address)","8493407b":"CorporateNews(uint256,string,uint8,string)","84934e40":"DappUpgraded(address,address,address)","8493a06e":"returnLongTokenAmount(address[3],bytes32,uint256)","84941984":"_removeTokenFromPartition(address,bytes32,uint256)","8497a8d8":"ESCToken()","84987faa":"getNodeRightChild(bytes32)","8498f706":"EthPalace()","84995370":"TheFoolRareToken()","8499bc63":"GeneBlockChainUserIDs(address)","8499ee3a":"newToken(string,uint8,string)","849a7337":"approveBountyTransfer(address,address)","849a7cb7":"convertBytes4ToArray(bytes4)","849aaf8e":"minimumValue()","849ab974":"HasOwner(address)","849ae5ea":"isBlockpassInvestor(address)","849bb2db":"withdrawServiceFee()","849cf588":"addSynth(address)","849d0d24":"TVCrowdsaleContract()","849d16d2":"BffDoomToken()","849d926b":"parseBlockHeader(bytes)","849e3dcd":"SangusToken()","849e6b17":"MakeBuyOrder(bytes32,address,uint256,uint256,address)","849e961a":"ICO_PRE_SALE()","849f94bf":"getMatchIndex(uint8)","84a014d8":"oneTimeSold(address)","84a0f604":"transferMultipleDifferentValues(uint256[],address[])","84a11df9":"ismaster()","84a1f5a5":"claimTokensFor(address[])","84a2f00b":"order(bytes32,uint256,uint256)","84a2f5a4":"MoonDust()","84a34caa":"BaseMPHToken()","84a37273":"addTransaction(address,uint256)","84a429a0":"createDklSiringAuction(uint256,uint256)","84a438de":"Course(string,string,uint256)","84a4974c":"MintAndTransferEXH(address,uint256,bytes32)","84a6469a":"setNewMintRequest(address,uint256)","84a64c12":"cancel1(uint256)","84a68690":"withdrawRequest(uint256,uint256,uint256,uint256)","84a6a68a":"releaseTeams(uint32,uint32[])","84a7b223":"Canary(address)","84a80c6b":"getB0()","84a83662":"changePassword(string,string)","84a97ab7":"removeAddressFromAccount(address,address)","84a9b91c":"capWEI()","84a9d711":"assertThrows(string)","84ab2cdb":"byte_to_bits(bytes1,uint256)","84ac33ec":"deregister(address)","84acdae7":"getAuctionStartBid()","84ad6ff3":"ReversibleDemo()","84ad8e8f":"discountPrice()","84aeb4f0":"getTokenContribution(address)","84afaa7c":"getReceiptAmount(uint256)","84afb526":"marketor()","84afd121":"bytesToUint2(bytes)","84b06191":"CampaignAccount(address,uint256)","84b08d41":"partner2_signed()","84b0e001":"setEventResult(string,uint32,uint8)","84b1fcb6":"TokenOwnedFund()","84b2e59d":"lower(string)","84b35fbb":"proposeFoundationTransfer(address)","84b366dc":"dest()","84b3b232":"depositofferToken()","84b4340b":"failWithReason(string)","84b46829":"San4Contract()","84b4d3f6":"determineGoalScoringCardIds(uint256[],uint256[],uint256)","84b60937":"getRollUnder(uint256,uint256)","84b735c2":"address1a()","84b76824":"cancelWithdraw()","84b7964f":"isClient(address)","84b79b3d":"eosBASE(uint256,uint256)","84b83a96":"finishChampionGame()","84b8d6a5":"Airdrop(address)","84b98987":"getPrice(address,string,string,string)","84b9a4a5":"SALE_STEP()","84ba2642":"mint(address,uint256,address,string)","84ba745e":"totalClass()","84bc8d2e":"read_purchase_at_index(uint256)","84bcd93e":"setSealableProperty(uint256,bytes32,bytes32)","84bcefd4":"collected()","84bd3a28":"TierRainmakerDividendAddress(address)","84bdaf85":"centsInPhaseOne()","84be4079":"Lendr(string,string,address)","84be414d":"KryptopyCrowdsaleMock(address)","84be59d1":"giftPool()","84beac36":"KRCToken(address)","84bf6fac":"mEtherValid()","84c019e3":"noBonusTokenRecipients()","84c14b25":"sellDentacoinsAgainstEther(uint256)","84c2473f":"mainIcoEndBlock()","84c344fe":"_register(bytes4,string)","84c3edf9":"getHoldAmountAccounts()","84c4ee9e":"getHivePot()","84c5c34d":"transferFromToICAPWithReference(address,string,uint256,string)","84c615e2":"giveKingdom(address,string,string,uint256)","84c64a19":"setApp(address,address)","84c6774c":"safeMathMul(uint256,uint256)","84c6a9fe":"setFABAcompanyTokensPercent(uint256)","84c6f650":"PAYOUT_TIME()","84c7bf4c":"setBlocking(address,address,bool)","84c830d3":"getDepositByIndex(address,uint256)","84c8d5fa":"xenograft(uint256,uint256,uint256)","84c8df88":"testMemoryIntegrityCheck31Bytes()","84c99b6d":"tokenIssuedAirDrop()","84ca65e0":"addOperationType(string,string)","84cb4fec":"_getBlocksPerYear(uint256)","84cba6da":"registerUsers(address[],uint256[])","84cbc92f":"buyPotato(uint256)","84cc315b":"getCurrentPrice(address)","84cdbb4b":"relaseLock()","84ce8f1e":"getTotalF3()","84cfa08c":"startKilling()","84cfc5aa":"WABnetwork(uint256,string,string)","84cfca00":"setMaxPlayers(uint8)","84d062b4":"updateEthToTokenOrder(uint32,uint128,uint128)","84d0aad8":"loadOldData()","84d24226":"claimableTokens(address)","84d2688c":"getDarknodePublicKey(address)","84d2731c":"namesOf(address)","84d43f66":"setAffiliateSetter(address)","84d46860":"getMyStageBet(uint256,uint256,uint256)","84d47dee":"DayDayCrowdsale(uint256,address,address)","84d4c178":"_escrowInflationBonus(bytes32,uint256,uint256,address,address,bool)","84d5d944":"transferAndLock(address,uint256,uint256)","84d60043":"CioCoinERC20180629Token(uint256,string,string,uint256)","84d61a32":"showFPInterest()","84d62f47":"bindSmartIdentityByRegulator(string,string,string)","84d6bd43":"requiredEvidence()","84d7c99d":"deleteUInt8Value(bytes32)","84d7ea12":"setMilestonesContractAddress(address)","84d80057":"hasDeadlinePassed(bytes32)","84d83f07":"GetLoanIdFromPortfolio(uint256,uint256)","84d8529f":"refundInternal(bytes32,address,address,uint256)","84d9390a":"TEAM_PERCENTAGE()","84d9bee2":"bidCC(uint256,bytes32)","84da7e38":"setColorRed()","84da92a7":"updateName(string)","84dac46e":"Fucksign()","84db71a3":"getRefereeRewards()","84db8d1e":"_nextPotTax(uint256)","84dc1028":"getBonustwo(uint256)","84dc2b10":"_saveData(address,bytes32,address,bytes32,uint256)","84dcde97":"removeSynth(bytes4)","84dd4332":"lastCallPUST()","84dd9591":"getTotalHoldAmount(address)","84df87c3":"SPITEST()","84dfb2bd":"setETHAddress(address)","84dfbfe2":"setLpFee(uint256)","84e0b689":"_yearThreeSupply()","84e10a90":"getTotals()","84e11251":"setMinInvestmentLimit(uint256)","84e192a7":"getArbiterCandidates()","84e1bf74":"emissionOn()","84e2341d":"internalSetDestinationMultisigWallet(address)","84e2d578":"OperationAddress()","84e336fc":"ANUNYA()","84e37ad9":"prefixedHash(uint256)","84e3ac94":"oneTokenInWei()","84e45689":"authorize(address[])","84e4c52b":"getTimeLockSecondsRemaining(uint256)","84e4d3a8":"freezeAccount(address,bool,uint256,uint256)","84e4d57f":"ApplyForCertification(string,string,string,uint256)","84e527ad":"IMDESale(uint256,uint128,uint256,uint256,uint128,string)","84e60e8b":"ico_promo_reward(address,uint256)","84e64a1f":"stageStartDate(uint8)","84e67523":"getSumAmountOfOpenSteps()","84e6ee4b":"setMainnetAccount(string)","84e70093":"cloneOrder(address,uint256,uint256,uint256)","84e700ee":"totalAllocatedPurchase()","84e7686b":"setAdmin(address[],bool)","84e77095":"GetEvidence(bytes32)","84e77da2":"updateKryptoroToken(address)","84e79842":"addAgent(address)","84e7e3d3":"MINT_INTERVAL()","84e83ee2":"SparksterToken()","84e85974":"YGO()","84e8a7df":"_soldOutside()","84e8b36e":"GetAskingTokenDecimal()","84e8bff9":"burnaftersale(uint256)","84e9ec37":"bonusTokenRateLevelFour()","84ea2e31":"GetDOTNumRevokableHashes(bytes32)","84eb11ce":"DoggyToken()","84eba00c":"tokenholder()","84ebd065":"NunesTestCoin()","84ebde52":"Under_the_Hood()","84ec480c":"marketToken2020()","84ecdaf6":"advanceState()","84ececf2":"userCreateSaleIfApproved(uint256,uint256,uint256,uint256)","84ed49a7":"isPoweruser(address)","84ef0778":"tokensIssuedTotal()","84efe4d6":"backSkinCoinOwner()","84eff1d0":"walunlock()","84f06570":"createAllTokens()","84f08cd9":"TokenContract(address)","84f10c35":"testTransferCreator()","84f19f37":"createVoting(bytes32)","84f1b0b8":"__flooredLog10__(uint256)","84f1bd4e":"fpart(int128)","84f1cdb7":"intFunc(int256,int256)","84f32395":"setAssetToExpire(uint256)","84f3597b":"availableRefunds()","84f54874":"startWeekThree()","84f85951":"founderWithdraw()","84f88cbf":"TonToken()","84f94221":"getRoot(bytes32)","84f9c928":"get_signature_block(address,address,bytes32)","84fa2c97":"totalCentsCollected()","84fae760":"hello(address)","84fb24a5":"_addCourse(uint256,string,uint16,uint16,string,string)","84fb427c":"_transferHolder(address,bool,uint256)","84fc8050":"nugget(uint256)","84fd176b":"bonusPhaseTwoDeadline()","84fd5477":"isAuthorizedAccount(address)","84fd7ef0":"TOKEN_FOUNDATION_CAP()","84fdab0d":"pickConsolationPrize(uint256[])","84fde1c6":"calculateScorersForTeamIds(uint256,uint256)","84fdec83":"ownerCanWithdraw()","84fe5029":"weiCap()","84feab93":"Emit_OffchainPaymentFlag(address,address,bool,bool)","84feed25":"VoxelX()","84ff2e45":"coreTeamTokenSupply()","84ff435f":"UpdateUserNickName(address,bytes32)","84ffc422":"BountiesTokensHolder(address,address,address)","84ffcb5d":"setContractsMiniGame(address)","85000a86":"TitleUpdated(uint256,uint256,string,string,string,uint256)","85002354":"ZillowBlockchain(uint256,uint256)","85003d30":"CollateralTransferCanceled(uint256)","85007e54":"Zakat()","8500d919":"getBorrower(uint256)","85011eec":"Movie(string,string,uint256)","8502293b":"newCs(address)","85025396":"setProviderClientsCount(uint256,uint256)","8502935a":"maxInflationRate()","850382c8":"prova3(uint256[])","8503a6bf":"ERC721TokenMock()","8503b6a5":"addProposal(address,uint256,address,string,uint256)","850595c1":"contributorID(uint256,address)","8505a074":"ClassyCoin()","85071d9c":"SCARABToken1()","8507bee8":"joinedCrowdsalesLenMax()","850895dc":"CheckValidDate(uint8,uint8,uint16)","8508a693":"doTeamMinting()","8508d88f":"sendICOSupplyToken(address,uint256)","85093668":"jackpotBank()","8509a001":"rewardDenominator()","850a1532":"voteSnapshotBalance(address,uint256)","850a2e78":"setResults(address,uint256,uint256[2])","850a4621":"emitActiveChanged(bool)","850a7eca":"endTimeLockedTokensAdvisor()","850c362a":"initCard1()","850d8a14":"CryptolottoToken()","850d9afb":"ENDTIME()","850db35d":"didPayInterest(bytes32,address,address,address,uint256,bool,uint256)","850e141a":"updateYearsSinceRelease()","850e2bc4":"setLLV_edit_22(string)","850e3760":"getShine(uint16)","850e47db":"KudoCoin()","850f2e2c":"findTileByAddress(uint16,uint16,address,address)","850fb62d":"transferProcess(address,address,uint256)","85107367":"stakeAddress()","8510b43f":"isSaleRunning()","85113156":"etherERC20()","8511b843":"addSpaceshipMoney(uint256,uint256,uint256)","85138313":"PureAirToken(uint256,string,uint8,string)","8513c619":"addManager(address,address)","8513db86":"test_threeValidAndInvalidEqAddress()","851545de":"transformAgent()","8515e413":"payUserOutgoingTransactionCommission()","851645e6":"getRandomUint(uint256)","85174a31":"transferToSelf(uint256,bytes)","85177f28":"EthReceived(address,uint256)","851a33e9":"getBylawsMilestoneMinPostponing()","851a61d7":"Dist(address,uint256,address)","851ad4d6":"getNumDragons()","851aea7a":"setUser(string,string,string,bytes32)","851b6ef2":"getAllVotes()","851bb3c3":"bonusEnds15()","851c0cf6":"bltMaster()","851c27de":"earlyStageSetting()","851c4414":"getEvabotContractAddress()","851c5bf6":"addVestTokenAllocation(address,uint256)","851c9d11":"DGB()","851cad90":"THOUSAND()","851cc7f9":"coinMultiplayer()","851d1c27":"_transferFrom(address,address,address,uint256)","851d46f3":"internalCheck()","851e6b3a":"buy100Price()","851ee3e2":"ApproveERC20()","851f9e20":"chargeOff(address)","85203aa2":"lengthNotEqual(uint256[],uint256,string)","85209ee0":"contractState()","85216449":"checkCustodian()","8521b59c":"addDataPoint(int256,uint256,bytes32)","852263aa":"LogThresholdChange(address,uint256)","8522ac8c":"testTransferOwnership()","85233869":"NumberOfMiners()","8523930a":"calculateNoOfTokensToSend()","85252e82":"setTransferFee(address,uint256)","85255ab0":"Nero()","8526492f":"getTokensAmount(uint256)","85265ee6":"press_address()","8526d092":"isValidContributorAddress(address)","85271fa1":"_validateUSDAmount(uint256)","85276721":"DevReward(address,uint256)","8527831b":"getIndex(bytes32)","8527c3b0":"changePriceRandomFight2Death(uint256)","8528b7b0":"WILDToken()","852980a0":"addCourses(string,string,string,string,string,string)","852987f3":"getRecoverSigner(uint40,uint256,uint8,bytes32,bytes32)","8529d576":"toUint(bytes)","852a6bd4":"getBalanceOfPlayer(address)","852a7d6c":"setExtraDistribution(address,uint256)","852ada4b":"nonFungibleOfOwnerByIndex(uint256,address,uint128)","852b6121":"setInitialBlockTimestamp(uint256)","852c061a":"axiesPrice(uint256,uint256,uint256)","852c5662":"adjustFlame(uint256)","852ccf2b":"YIYSToken(address,uint256)","852da11d":"tokenCreationCapPreICO()","852dbfc6":"pickURL()","852dc589":"setQuitLock(address)","852e9f46":"transferAndFreeze(address,uint256,uint256)","852ede8d":"removeToken(string,int256)","852f31c6":"teamStageSetting()","852f6662":"isProgramFactoryContract()","852f8b74":"getBookSigner(bytes16)","85307bef":"TronToken(address)","85318217":"RegisterMine(string,uint256,uint256)","8531bb56":"SaleHasEnded()","8532137c":"Lexzoom()","853255cc":"sum()","853262a2":"tgrSettingsPartContributorIncreasePerStage()","85349e01":"totalDeveloperCut_()","8534b3a8":"setParticipateFee(uint256)","853504f3":"OpenToken()","8535490f":"redeemEther(uint256)","853552d7":"_slotAddNew(address)","8535d2ec":"sendBatch(address[],uint256[])","8536a50e":"_setBurnFeeProp(uint256)","8536bf8f":"BuyIPG()","85370965":"distributeVault(uint256,uint256,uint256,uint256,uint256)","853717bb":"calcBurnAmount(uint256)","85378346":"getChancePowerWithBonus(address)","853828b6":"withdrawAll()","853a4ec2":"grantReserveToken(address)","853a9d32":"EGGS_TO_HATCH_1HIPSTER()","853b59d7":"phase_1_token_price()","853d814e":"MyFairToken()","853df275":"duel(address)","853e88fe":"hashVM()","853f636b":"sendAllTokensToFounder(uint256)","853f7e98":"BDLToken()","85423912":"setDiscipleItem(uint256,uint256)","854254e8":"buildLoanOrderStruct(bytes32,address[6],uint256[9])","85431ec8":"setRate333()","85439f82":"someFunction4()","8544023a":"nokuMasterToken()","85443a2b":"CampaignContract()","85444de3":"getChildChain(uint256)","85445829":"numMatches()","85448c59":"getBountyAddress()","85461f69":"calcReward(uint256,address)","854642e1":"mintNewDrawings(uint256)","8546d393":"Anatomia(uint256,uint256)","85473be1":"maximumCoinsPerAddress()","85476d6e":"GetCurrentTypeSaleItem(uint256)","854772ea":"getUserTotalReward(address,bool,bool,bool)","8547af30":"lastBidder()","8547bb3a":"publicSaleMode()","85482f89":"setOnePowerAge(uint256,uint256)","8548cc21":"allocateOwnerTokens()","8549b326":"isSettable(uint256,string)","8549d6f4":"MayanProtocolContract(uint256,uint256)","854a3d64":"LogStartSale(uint256,uint256)","854a9cc4":"ImpeachmentProposed(address,string,uint256,address)","854b1cdf":"curPayTableId()","854bb344":"NoblesseOblige()","854bec87":"payback()","854c2e1e":"HitToken(string,string,uint8,uint256,address,address,address)","854c4a0d":"DownSuccess(string,address)","854c584d":"AdsventureToken()","854cb674":"TheIlluminati()","854cd978":"ClaireToken()","854cff2f":"setWhitelist(address)","854e32cc":"revenueShareDistribution(address)","854e85c6":"lifeEvents(uint256)","854ecd23":"Vaynix()","854f1663":"setNonprofitDisbursementAddress(address)","854f1a1c":"VIVARefundVault(address)","854f3988":"eighth_withdrawal(uint256)","854f4817":"buyKissBTCWithCallback(address,uint256)","85502264":"deptcheckrespond(address)","85506473":"GnosisToken(address,address[],uint256[])","855085b8":"interCrypto()","8550aaf0":"BONUS_TIER_9_LIMIT()","8550cf46":"buyGameCoin(uint256)","855114c9":"buyNation(uint8)","85511d5f":"setEmergencyCode(uint256,uint256)","85512e5b":"EthlanceUser2(address)","8551884a":"authorizeListingService(address)","8551b896":"pre_tokensSold()","8551e3fe":"savePost(bytes32,uint256)","85522831":"numIntervals(uint256)","85528394":"currentClaimPriceWei()","85529636":"getSiteTokenId(uint256,uint256)","85530d7c":"setPetLastBreedingTime(uint64)","85535cc5":"setVaultAddress(address)","8553f6fb":"hardCapDividends()","855460d8":"externalBuy(address,uint256,uint256)","8554d60a":"addTenParticipants(address,address,address,address,address,address,address,address,address,address)","8554d92c":"verify(uint256,uint256,uint256,uint256,uint256)","85550c6b":"tradeKey(bytes32,bytes32)","8555cde9":"Permissioned(address,address,bool)","8555de47":"BlackPyramid()","85561120":"TPTToken(uint256)","85564b97":"MasterWithdraw()","85565585":"crowdsaleOwner()","85586e8a":"allocateCommunity(address,uint256)","85587375":"restartAssign()","855876d5":"countCliDreams(address)","8558c0af":"createBag(uint256)","8559fd88":"requestRandom(uint8)","855b7f5b":"getAdvancedTransfer(bytes32,bytes32)","855b842d":"isUserInBlackList(address)","855c145b":"specialManagerCountInt()","855c45e7":"EIP20Factory()","855c95f1":"createETHAuction(uint256,address,uint16,uint256)","855ce579":"setTwoPowerAges(uint256,uint256,uint256,uint256)","855ceb7d":"AirToken()","855d0700":"insertList2(uint256,uint256,uint256,uint256,string,uint256,string)","855d7c21":"updateTokenBaseRate(uint256)","855e0629":"setIconRate(uint256)","855eafa7":"get_maker_fee()","855f2b3a":"createGen0Auction(uint256[2])","855fe4c0":"ifSuccessfulSendFundsTo()","855fe6ed":"getConfigEntryInt(bytes32)","85602ad5":"getPreviousValidators()","85609b1c":"compose(string)","8561d136":"currentRunningAddress()","8561dc0b":"tokenPostIcoUsdCentPrice()","8562e452":"ADVISORS_SHARE()","8564b2cd":"listItem(uint256,uint256,address,uint256)","8564c284":"setCompte_34(string)","85652d1f":"getInvoiceAddress(uint256)","85654c9c":"setMembershipRoster(address)","85663119":"initialPrize()","85666a7c":"TEAM1()","85673296":"DepositBalance()","85673fb8":"follow(address,uint256,address)","8569cc4e":"release_4()","856a89fd":"drawRaffle(uint256)","856b3108":"UpdateInitiateContractAddress(address)","856b7d2c":"SignDividend(uint256)","856bb9cc":"addConsent(address)","856c0181":"countriesStatus()","856c486b":"WoodyToken()","856c6bd1":"checkRose(bytes32)","856c71dd":"isAvailable()","856c8922":"getGameRules(uint256)","856cddb0":"DummyOVOToken()","856dc78e":"getWarriors(uint256[])","856de136":"FAPFundDeposit3()","856deacf":"findTag(string)","856e8488":"erc20TokenContract()","856eb2d1":"submitTransactionWithSignaturesToken(address,address,uint256,uint8[],bytes32[],bytes32[])","856ed703":"currentCap()","856f3080":"WhatWasMyHash(bytes32)","8570153e":"publish(string,string,bytes,address[])","85716e2f":"changeAdminer(address)","8571baff":"SimpleCrowdsale(address,address,address,address)","8572e364":"scale(uint256,uint256,uint256,uint256,uint256)","8573d4aa":"OwnershipTransferPending(address,address)","8574ddf9":"snailmasterReq()","8575052a":"set_fees(uint256,uint256)","857512b4":"airdropCountLimit2()","85760377":"PixelTransfer(uint16,uint16,uint256,address,address)","857637c9":"ShopDexToken2()","85766cc3":"Calculation(string,string,string,string,address)","8577efc5":"DIGI()","8577ffc1":"unofficialUserSignUpFee()","857835f9":"getPostsFromIds(address[],string[],uint256[])","85787c8b":"encode(uint256[],uint256[])","85796a2d":"bonusClosingTime0()","8579c10e":"payDevelopersFund(address)","8579cbde":"getPrice(string,uint256,address)","857ac1c9":"TokensBurned(address,address,uint256)","857b3224":"setOAR(address)","857b575e":"qquizwinnerToken()","857b7dfc":"buyLittleDragonGirlLottery()","857ba7fb":"MAX_CONTRIB_CHECK_END_TIME()","857bcb2c":"adminAddTrustedCurrencyContract(address)","857cc1c4":"ExchangeGift(string)","857cd569":"FundDeposit(address,address)","857cdbb8":"getPublicKey(address)","857cfff9":"homeDailyLimit()","857d39d7":"CCH_LLV_FIFA_1()","857d4c07":"throwScraps(uint256)","857e6a99":"decreaseTokens(address,address,uint256)","857f4864":"getNextSnapshotTime()","857f54e4":"MonethaGateway(address,address)","8580563c":"finalize(bytes,bytes,bool)","8580b71b":"getLoanIDbyClient(uint256)","8580eb2f":"setFeeBalance(uint256)","858110a5":"proposeShutdown(uint256)","8581dc7c":"SociBit()","85820925":"getCompte_17()","8582ac21":"getIcoInfo()","8582b7dd":"OrxERC20()","8582e554":"transferBy(address,uint256)","858310d8":"getPreICOAddress(uint8)","85839731":"setKittyContractAddress(address,address)","8583b1b8":"_setUserInfo(address,uint256,uint256)","85861b15":"setUnboundedLimit(address,bool)","85867cd5":"BDSMtoken()","8586b2f0":"getPermission(address,string)","8586e75b":"ChangedResource(bytes32)","8587be6e":"ceil(uint256,uint256)","8587edbb":"lockEndBlock()","8588b2c5":"adopt(uint256)","85899cee":"CryptoThreeKingdoms()","8589c725":"deleteWork(uint256)","858ac4d8":"TransferOwner(address)","858c7559":"chainIDSeed()","858ced35":"setUser(address)","858e41b4":"lemonContract()","858e58d6":"RemapImportedNotUsed()","858f84e7":"WTFToken()","858fa2f5":"setArrayIndexValue(bytes32,uint256,address)","85903f67":"setUnofficialUserSignUpFee(uint256)","85908ffa":"buyTokensPostHook(address,uint256,uint256)","8592b778":"_rand()","8594bed0":"cancelMintRequest()","85952454":"newOwner(address)","8595c9ff":"diff(uint256[])","8595f8b1":"getGasPricePctOfBetValue()","8596982d":"getNotesCount()","8596d9ed":"transferInternal(address,uint256,address)","8597705f":"DataEquip(address)","8597eb6e":"ericukis(uint256,string,uint8,string)","859832e6":"locationsLength()","85984e69":"WavesCommunityToken()","859971dc":"initialFunding()","8599d0d8":"buildIdentifier(address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,string)","859a711d":"icoBonus2EndDate()","859b97fe":"cancelAuction(address,uint256)","859bbfee":"floatAdd()","859bcc71":"allowDisbursePaymentWhenPaused()","859ccc72":"setPlayerVirusNumber(address,uint256)","859d1bc7":"updateLeftLottery()","859da4e3":"transferParityOwnership(address)","859e25df":"giveProjectMoreVotes(address,uint256)","859e7d32":"getEpochData(uint256)","859f5717":"AuctionSuccessful(address,uint256,uint256)","859f63dc":"checkRewards(uint256[])","85a013e0":"setAnswer(uint256)","85a08f41":"buyLimitSupplyMax()","85a09f6f":"withdraw123()","85a10b30":"burningAdress()","85a143f4":"DailyRoi()","85a156af":"activityFunds()","85a17a1a":"isValidBet(uint8[4])","85a1c242":"PSM_PRICE()","85a227fd":"APC()","85a242d7":"teamTokensAccount()","85a2675b":"isConfirmedWithdraw(uint256)","85a26d7d":"getAllPeople()","85a2dd15":"hasAccess()","85a2f6af":"donateToken(address)","85a30c33":"changeContractAddress(address)","85a345e2":"disTrust(address)","85a34f4a":"getGameSums(uint256)","85a38635":"votingEnd()","85a49f2e":"verifyPass(address)","85a52584":"SettingsChanged()","85a735dd":"partAllocationLength()","85a8f42e":"diff(int256[],int256)","85aa6103":"auctions()","85aa6e09":"granted(address)","85aa92a7":"storageAddress()","85aaff62":"transcoder(uint256,uint256,uint256)","85ab0c19":"tokenProvenance(uint256)","85aba275":"assign(address)","85ac2f7b":"getListedTime()","85add95b":"Spike()","85ae067b":"func_040B()","85ae2f1c":"sunFinished()","85ae6d2d":"OfferingOpens(uint256,uint256)","85af4142":"verifyTeam(uint256)","85b018e9":"isSubjectRaiseTap(uint256)","85b09a01":"DIVC()","85b12c7c":"launch(uint256)","85b1423e":"returnAll()","85b142ed":"getAccountState(bytes32)","85b2ff8f":"getWeightedRandomMember(uint256)","85b31d7b":"myInfo()","85b39fc1":"CONTRACTIUM()","85b3c420":"createWeight(uint256)","85b3ed4e":"GoalReached(uint256,uint256)","85b443b6":"econReserveWallet()","85b4bb53":"getSettings()","85b51737":"addSafe(uint256,uint256)","85b6824f":"setMinterWallet(address)","85b688de":"PRIVATE_STAGE_START()","85b73d3c":"testCreateNewRevision()","85b75b1e":"toogleStatus()","85b86188":"isSaleClockAuction()","85b8c64a":"bonusFreeLOT()","85b8d86f":"CrowdSaleFinished(string)","85b923ca":"getCandidates(bytes32)","85b94536":"debug_judge(bytes32[13],uint256,bytes32[],bytes32[],bytes32,bytes32,uint256[4],bytes32[10],uint256[4])","85b9c729":"OnWithdrawTo(address,address,address,uint256,uint64)","85b9f607":"buyTokensWithGuarantee()","85ba0052":"stringToUintNormalize(string)","85ba9a99":"setMinimumHydroStakes(uint256,uint256)","85bac237":"addPayment(address,uint256)","85bb7d69":"answer()","85bb821b":"WTO()","85bb8e29":"continuousSale()","85bbb53a":"ancestorBuffPercentage()","85bdc4a2":"lastBlock_v16()","85bddb97":"addOnOneStage(address,uint256,uint256)","85bde3f2":"SaddlePr(uint256)","85be2f02":"SampleCrowdsaleToken(string,string,uint8,uint256)","85be8fe6":"confirmReceivedAt(uint256)","85bf96a0":"JOP(uint256)","85bfe55d":"getUserByEmail(bytes32)","85c07546":"TransformCoin()","85c09f26":"topTotalSupply()","85c1057b":"payAndHandle(uint256,address,uint256)","85c15d9a":"exchangeRates(address)","85c3649f":"registerSelf(bytes32)","85c373c3":"releaseAccount(address)","85c3bb6f":"getMsg2()","85c4e3d1":"sendSubscriptionBonus(address)","85c53cf1":"giveAccess(address,bytes32)","85c5e9f8":"mimin(uint64,uint64)","85c64029":"set_prices(uint8,uint8,uint8)","85c653ba":"Divsforall()","85c78fac":"retryOraclizeRequest(uint256)","85c7a953":"WithdrawFullBalanceFromBankAccount()","85c8d362":"CTM()","85c8f447":"totum()","85c95d30":"setResourcesOtherManager(address,uint8)","85c9dd72":"GCOXToken(string,string,uint8,uint256)","85ca165a":"count_donors()","85cb2e6e":"refreshEmissionReleaseTime()","85cb469a":"getIcoFund()","85cb4ea2":"getPunchCardsInternal(address)","85cba6b1":"getFallback()","85cba722":"EGLSold()","85cbc881":"totalUSDRaised()","85cc3114":"doDeposit(address)","85cc51c2":"destTokensTeam()","85cc6fba":"boomrToken()","85cc9a2b":"issueKey(bytes32,address)","85cdafa6":"teamOneVolume()","85cf61ef":"payRake(uint256)","85cfdec7":"buyKWHAgainstEther()","85d02c8a":"changeMaximumInvestmentsAllowed(uint256)","85d178f4":"withdrawWallet()","85d19a25":"getPositionId(uint256)","85d1be13":"preSaleSecondPrice()","85d3b5bd":"policyID(uint256)","85d45d34":"comments2()","85d51d19":"contributorETHBalance(address)","85d544be":"transferAndLockUntil(address,uint256,uint256)","85d559ee":"TbookToken(uint256,string,string)","85d5c971":"logTransfer(address,address,bytes32)","85d5e631":"disableTokenTransfers(bool)","85d61e2a":"supplyNum()","85d63cce":"REMAINING_SUPPLY()","85d71df1":"investxPlatform()","85d77e5f":"priceExpiration()","85d80458":"m_deployer()","85da1192":"setMaxFaucet(uint256)","85daafe6":"capitalRaisedTarget()","85dacd5b":"voteSnapshotBalanceAuto(address,uint256)","85db2dda":"PayoutQueueSize()","85db2e3a":"PoD()","85dc3004":"setFundAddress(address)","85dc6721":"emptyShipCargo(uint32)","85dcbb5a":"returnMember(address)","85dcee93":"descriptionHash()","85dcfbd4":"VernamWhiteListDeposit()","85dd1fbd":"bet_on_team_1()","85dd2148":"getSaleDate(bytes16)","85ddb747":"transferFromPosttgefund(address,uint256)","85ddf726":"dismissOperator(address)","85de4841":"uint2str(uint64)","85de4f72":"luckybuyTracker_()","85dee34c":"query2_withGasLimit(uint256,string,string,string,uint256)","85defaf4":"voteEnds()","85df508f":"tip_rate()","85df51fd":"blockHash(uint256)","85e00e4b":"bezpolToken()","85e040b1":"Invested(uint256,address,uint256)","85e050e4":"get_property_contact(uint256)","85e05445":"MartiniumToken()","85e0832c":"totalMintSupply()","85e1684c":"computeS(uint256,uint256)","85e344f7":"SmartInvestmentFundToken(address)","85e36cc2":"foundationAmount()","85e3f058":"getIdentity(uint256)","85e41e7e":"TokenFree(uint256)","85e436bf":"setBuyRate(uint256)","85e567d4":"verifyProof(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[1])","85e57f3c":"updateLogoUrl(bytes32,bytes32)","85e5908e":"Group_3()","85e5bb3a":"Security_AddPasswordSha3HashToBankAccount(bytes32)","85e5d7ee":"mintAll(uint256[])","85e5f08a":"updateVerifiedSign(address,address,string,uint8,string)","85e612e4":"getBirthYear()","85e61b4a":"processFundingSuccessfulFinished()","85e61e67":"set_arbits_whitelist(address,address,bool)","85e68531":"revokeAccess(address)","85e7d4cb":"CCC()","85e870b3":"default_rate()","85e91347":"initializeSaleWalletAddress()","85e99be4":"updateHighestPrices_(uint256,address)","85e9bd2b":"setAdminAddress(address,address)","85eac05f":"changeOwnerAddress(address)","85eb6109":"getAddressClaims(address,address,uint8)","85ec419a":"setTokenTwdt(address)","85ed5cf9":"resetAlias()","85eddeea":"setReward(address[],uint256[])","85edf68d":"initVestingStages()","85ee292c":"airdropTesterFinal(address[],uint256)","85ef4ae7":"f_internal()","85ef5a8a":"GermanCoin(address,address)","85efa3aa":"setHold(address)","85efb721":"fillTheBank()","85eff0ef":"hardcoreBattleWith(uint256,uint256)","85f01859":"setWord()","85f07a2b":"CALLER_EXCHANGE_SHARE()","85f07b64":"confirmedAmount()","85f07bbe":"MIN_PLAYERS()","85f0e72c":"uintToStr(uint256,uint256)","85f0f098":"allowWithdrawals()","85f16544":"EdgarRichardWunsche()","85f19bc4":"giveDividend()","85f255ea":"getUserFactoryContractAddress()","85f2aef2":"team()","85f2d854":"createManyDrinks()","85f2e4b1":"_strConcat(string,string,string,string)","85f3c568":"LogContribution(address,uint256,uint256)","85f45250":"addFunds(uint256,uint256)","85f517d4":"account3Address()","85f52912":"TGRUPToken()","85f52984":"addPrecondition(address)","85f59db3":"CheckN2Exception(bytes32,uint32)","85f63a4a":"preICOBeneficiaryAddress()","85f671a6":"requestWithdrawal(bytes32,uint64,bytes32[],uint256[],uint256[2],uint256)","85f67ae4":"addEpisode(address)","85f8c16d":"claimHours(int256)","85fa33eb":"declareDividend(uint256)","85fab341":"transferTokensAfterEndTime(address,uint256,uint256,uint256)","85fae602":"getInsurance(uint256)","85fbd17f":"PonzICO()","85fbdd47":"_order(uint256,uint256,uint8)","85fbdefc":"masterBalanceOf(bytes32,address)","85fcb4a8":"findPrevOrderId(uint128,uint128)","85fcd363":"votesArr(address)","85fceea8":"getCountSubscribers()","85fdeba7":"vendorAllocation()","85fe0448":"testThrowRestartNotUpdatable()","85fe551a":"ownerGrace()","85fe6200":"recordEndedGame(uint256)","85fed812":"ERC20Lookup()","85ff5e13":"SkinCoin()","85ff70de":"_payFees()","85ff96a7":"getTotalSellingMonsters()","86001519":"totalProfit()","86005b14":"allocateVestable(address,uint256,uint256,uint256)","8600e40b":"notifyWithdraw(address,uint256)","8600f2ec":"totalChildTokens(address,uint256)","86013322":"withdrawSaleBalances()","860241c2":"TAXToken()","8602c8b6":"countryofN(address)","8602c8d3":"ethSendDifferentValue(address[],uint256[])","8603d31a":"auctionDetails(uint256)","860427fc":"setGPSRatio(uint256)","86047946":"_processHistoryItem(bytes32,bytes32,uint256,address,address,uint256,bytes32,bool)","86048c9a":"totalCashout()","8605c97e":"setMarginThresholds(uint256,uint256)","86060884":"SafeGuard(bytes20,uint256,uint16)","86066750":"HelloWorld(string)","86068367":"DYITToken(uint256,string,string,uint8)","8606f905":"balanceOf(address,bytes)","86070cfe":"recoveryVaultAppId()","86073441":"signToApproveAddTokenData()","860772a9":"establishBorrowerReturnFiatPerEthRate(uint256)","860779e7":"setMinBuy(uint256)","860838a5":"frozenAccounts(address)","86096578":"getRetailer(uint256,address)","860aefcf":"limits()","860bb34a":"SIGMA()","860c5ed6":"testVote()","860c851a":"votePrice()","860caf69":"HashAdded(address,string,uint256)","860d7273":"masterKeyActive(address)","860e6185":"commitTo(bytes32)","860e9960":"BetPriceLimit()","860e9b0f":"updateRegistryPrice(uint256)","860f5048":"baseSupply()","861004ae":"Visus(address)","861080ae":"transferMembership(address)","8610f045":"withdrawOffer(uint256)","86115c1d":"MyPurchaseContract(address)","8611643a":"Withdraw(string,string)","86116c12":"PerkscoinToken(uint256)","86117319":"buy_the_tokens(bytes)","8611e330":"FishbankBoosters()","86127ecf":"oraclize(bytes32,bytes,bytes,bytes,string,bytes,bytes,uint256,bytes)","8612d049":"isLocked(address,address)","8612ee13":"addMatch(string,string,string,bool,uint8,uint8,uint256)","86145875":"contributeInternal(address,uint256,uint256)","861654f7":"updatefundingStartTime(uint256)","8616865d":"ReferredInvestorAdded(string,address)","8616bc8b":"contributedTotal()","8617457a":"start_()","86188c97":"fetchOrdersForMerchant()","86192c36":"privateOfferingPercentage()","861c3385":"blocksquare()","861c3a09":"queryByUser(bytes)","861c9c79":"transferToComposition(address,uint256)","861cab52":"canSendGameGift()","861d4e51":"NOETToken()","861d7daf":"deleteImage(uint256)","861dd0a5":"releaseCats(uint32,uint256,uint256,string)","861e2e43":"orderCore(uint256,uint256,uint256)","861e5d6a":"CryptoKotik()","861ec457":"SILVER_AMOUNT_TPT()","861ed3ea":"controllersByPartition(bytes32)","861f8a52":"testThrow_2_invalidOwner_accessRestrictionThrow()","861fcefb":"Token1Token()","86200842":"getSellDailyLimit(uint256,bytes2)","8620410b":"buyPrice()","86212913":"queryAuction()","86216ace":"NotThrowingToken(uint256)","8622031f":"setModuleAddress(string,address,bool)","862235f5":"EthertoteAdminAddress()","8622a689":"expiresAt()","86231246":"returnsOneNamed(uint256,uint256)","86231b9e":"contentHostPaidByAO(bytes32)","86237e7b":"setAngel(uint8,address,uint256,uint16)","862440e2":"setURI(uint256,string)","86260cfe":"UpdateUserEmail(string)","86269a88":"checkBetNumber(uint8)","86271d8b":"minPurchaseInEth()","8627df46":"buyTickets(uint256,uint256)","862882e5":"startAuction(string,uint256)","8628892e":"Initialize(address,address,bytes32,address,uint256,bytes32,address,uint256,bytes32,uint256)","8628aca9":"setIds(uint256,uint256)","862a4bf2":"tokenHolder(uint256)","862b092b":"getTokenName()","862b525c":"gameMiningTokenStartTime()","862b6683":"setValues(uint256,uint256,uint256,uint256)","862c5e16":"validatePurchase(address,uint256,int256[],int256[])","862cb14e":"DMI()","862cdef3":"auctionTank(uint256,uint256,uint256,uint256)","862d0d4b":"_weiToFinney(uint256)","862eb9c0":"setGoldReward(uint256)","862ed594":"XmonetaToken()","862fd38c":"concat(uint8,bytes32,bytes32)","86312b1b":"TripsCoin()","86314af9":"BetOnHashV84()","8631890e":"PLANET_PRICE()","86318bc4":"ethBioxRate2()","86321f95":"switchClaimerAndRemoveOldOne()","86323e85":"isSellingNow()","8633497f":"angelCurrentAmount()","863451dd":"donateEther()","86346c42":"awards(uint8)","86348afa":"ColorReserved(address,uint256)","863524b1":"partnersKey()","86356ab9":"finalizeRefunding()","8635b527":"resetPainting(uint256)","8635f45d":"getSpaceshipProductAttributesByModel(uint16)","863682f4":"getScore(uint32)","86377b63":"registerLoanReplaceDuplicated(address,uint256,uint256)","863843bc":"bonusSupply()","8638aa65":"DEBUG_MODE()","8639ae69":"getAllCrySolObjects()","8639b0d7":"getBalanceDiscrepancy()","863a0372":"hex2dec(uint256)","863a03e0":"salvage(address)","863ac22b":"EtherGame()","863b3b66":"purchaseThemedSpinner(string,uint256)","863c51a9":"setCustomerSignature(address,uint256,bytes32)","863c607c":"ReactioonToken()","863d62ac":"Goldmint(address,address,address,address,address,address)","863da000":"disburseAuthorizedPayments(uint256[])","863e24d6":"updateBonusTicketsPercentage(uint8)","863e76db":"ONE_DAY()","863e7e4b":"getCurrentPhraseInfo()","863e8320":"initGPS()","863f2a19":"adjustTime(uint256,uint256,uint256,uint256,uint256,uint256)","863f40ac":"syp1(address)","863f52b4":"makerBetsCount()","864059ac":"clearingPriceComponent()","86420710":"setReceivers(address[],uint256)","8642269e":"buyProduct(uint256)","86428900":"SetPeriodITO_startTime(uint256)","86432925":"profitDistributionContract()","8643d01d":"throwsSaleWalletIncorrectSaleAddress()","8644ddd9":"WOB(uint256,string,string)","86452295":"getPointOf(uint256)","86457702":"authorize(string,address)","8645a3da":"ATTR_PRODUCIBLE()","8646b5cb":"marketTotalEarning()","8646fb43":"Electrominer()","864757a8":"minFinneyToKeep()","8647a5dc":"getTimeLock(bytes32,bytes32)","86481d40":"getLevel(uint256)","864824a0":"phase9Price()","86485cdf":"setCurrentExchangeRate(uint256)","86489ba9":"initialize(address,address,uint256,uint256,uint256,uint256)","8648c0ce":"neumarkCap()","8648f24c":"changeVariables(uint256)","86496e2e":"TcToken(uint256,string,uint8,string)","8649c0a4":"SetEndTime(uint256,uint256)","864a1057":"Start4()","864a9a09":"__mod(bytes,bytes)","864aef45":"buyCard(address,uint256,uint256,uint256)","864af3f4":"Menu02(address[],uint256)","864b525c":"GoldDollar()","864c189b":"LBCToken()","864c2e94":"service_founder()","864ca300":"goldBalanceOf(address)","864ce5dc":"getWeekBonus(uint256)","864d1d72":"getUserCountByRole(string)","864d7e14":"approveAsset(uint256)","864da88c":"_clearBlocksProducers(uint256)","864dd17d":"Controller(address,address)","864e8cc1":"setMaxCharacters(uint256)","864f4e54":"PeerWalletsToken()","864fda69":"minNum()","864fff0a":"DealCompleted(uint256,address,uint32,uint32,bool,uint256)","86508380":"_getUncreditedPoints(address)","8650b6ef":"endTimePre()","86517df4":"concludePresale()","8651dc1e":"confirm(uint256,uint256)","865232fb":"setarg_3_input(uint256)","86544e11":"STARTING_SNAIL_COST()","8654b78d":"AttoresDigitalCertificates(address)","865508ef":"minSend()","86556071":"gracePeriodStart()","8655f0da":"copyAllHpbNodesByStageNum(uint256)","8656dcb6":"distributeTeam()","865733da":"MercuryCrowdsale()","86575e40":"changeName(string,string)","86578375":"withdrawFund(uint256,bool)","865891b0":"PlanToken()","8658b8b9":"checkPermission(address,address,bytes32)","86590955":"changeHeight(uint256)","86591bd6":"testFailMintWhenStopped(int256)","86598549":"_withdrawTokensFor(address)","8659d573":"getCountPosition(uint256,uint256)","865a4253":"prcSum()","865ad6c2":"levelUpCar(uint32,uint32,uint32)","865b0d30":"SingularityTest15()","865c79b2":"setImageDataLength(uint256,uint16,uint16)","865cc6a3":"getDErc20OwnerClaimEnabled(bytes32)","865dc0d9":"EndChanged(uint256,uint256,address)","865eb3d3":"getWorkerProfit()","865fd239":"transfer_token_ownership(address)","865fe035":"addressIco()","86602b6b":"testControlRetractLatestRevisionNotOwner()","86602c84":"frozenAmount(address)","86609b37":"_createCard(address,uint16,uint16)","8660b220":"buyerRate(address)","8660b32b":"getSumInByGame(uint32)","8660bb8b":"updateAllPixelDetails(uint256,uint8,uint8,uint8,uint256,string)","8660cbf5":"battleDecider()","8661009b":"checkPayments(uint256)","866192a2":"getLastAuditDocumentation(address)","866278a8":"level_7_amount()","86628eed":"weisDeposited(address)","86630b7b":"getSaleData(uint256)","86633571":"DestructibleMiniMeToken(address,address,uint256,string,uint8,string,bool,address)","8663b4c7":"StudyCoin()","866408eb":"getPlayerKeysCount()","86647821":"NeuroDAO(address,uint256)","86647bac":"getBountyArbiter(uint256)","8666107c":"eth_received()","86667435":"getPercent5(address)","8666fca5":"holdingsOf_BEAR(address)","86673464":"assertEq15(bytes15,bytes15,bytes32)","8668a416":"assignMultipleParcels(int256[],int256[],address)","8669ccf4":"getFreelancers(address,uint256)","8669e08c":"migrationFinishedTime()","866b5674":"totalBountyinWei()","866b9323":"mintForReportingParticipant(int256,uint256)","866c03eb":"_unmintedTokens()","866d840a":"setCompte_44(string)","866df234":"setLink(bytes)","866e5162":"oslikToken()","866f4555":"Basic23TokenMock(address,uint256)","866f6736":"trustedChildWithdraw()","867022d1":"Initialise(address)","86703c9c":"getProviderClientsCount(uint256)","86707026":"midEtherBonusLimit()","8670cc7c":"BlueDragon()","8670e183":"createLegendaryAuction(uint256,string)","8671090e":"setSavedBalanceToken(uint256)","86715acf":"BodyOneToken(address)","8671b894":"cancelOrder(uint256[3],bytes32,bytes32,uint8)","8671ef4d":"grg(address)","86723215":"createMarket(bytes,uint256,uint256,address)","8672e853":"LogOwnerAdded(address,address,address)","8672f1bc":"isProposalActive()","8673094f":"allGuGiven_()","867387d4":"BurnableToken(address[50])","86749d97":"ZOOToken()","8675cf9e":"MaxToken(uint256,string,string)","8676993f":"setTransformAgent(address)","86773cae":"setPromoEndTime(uint256)","8677ebe8":"isSigned(address,bytes32,uint8,bytes32,bytes32)","8678446e":"preSaleMinEth()","8678c2b9":"HodlEth(uint256)","867904b4":"issue(address,uint256)","86795e8d":"set_master(address)","867a66ac":"ownerCredit(address,uint256)","867b36fe":"setFiscalVerify(bytes32)","867b3d4b":"updateEtherPrice()","867b79a1":"withdrawalRange(uint256,uint256,address)","867befba":"SUV_TYPE()","867c0547":"newPonziFriend(uint256)","867c2857":"transferAgents(address)","867c6e23":"CryptoRides()","867c7eda":"getProposalByID(uint256)","867e248c":"feePercantage()","867e958f":"NAEC()","867ea029":"WESSToken()","867eed11":"privilegedTransferLock()","867f990a":"changePriceUSD(uint256)","867fbe6d":"AnotherOwnerAssigned(address)","86804aad":"queryData(address)","8680e52d":"emitJobOfferAccepted(uint256,address)","86813c53":"sellerIdOf(address)","86814819":"_prePurchaseAmount(uint256)","868149da":"TRONCLASSIC()","8681a07f":"ownerSetRandomApiKey(string)","868203ea":"ZeroChainToken()","86820a7d":"createInputData(uint256,uint256)","86834610":"registerEscapeRequest(uint32,int256,bool,uint32)","8683612b":"exists(bytes32,bytes32)","8683e4b4":"WHUToken()","86842bc2":"verifyNonces(bytes,uint64[],uint64[])","86845f9a":"theCyberGatekeeperTwo()","868467e6":"deliverTokens(uint256)","86849a6c":"TeamTailsChoice(address)","86852dca":"getElectionInfo()","86852fd7":"bountySupply()","86863ec6":"init(address,address,uint256)","86867740":"trueSupply()","86869eae":"totalClosedContracts()","8688b5fe":"getMyContractsByType(uint256)","86897cb8":"Addresses()","8689a500":"putToken()","868a8813":"calculateGrapeBuySimple(uint256)","868d2b62":"ZeusCoin()","868d5383":"transferFromWithData(address,address,uint256,bytes,bytes)","868defd0":"getRemovableIdArrayAddressItems(address,uint256,string,string,string)","868df7f6":"alterFeaturedLength(uint256)","868e3c52":"EosPizzaSliceSafe(address)","868eb6bf":"removeOrders(uint256,uint256)","868f2564":"Iconss(address,address)","868f9c57":"Administrator(string,address)","86908b3f":"TransferInternalLedgerAT(address,address,uint256,bytes32)","86908f93":"FFG(uint256,string,string)","8690d6d5":"CentrallyIssuedToken()","8691162a":"TlcCoin()","86913884":"ShroomeryFarmer()","8692ac86":"transferOwnershipNow(address)","86936ed5":"isReceiptClaimable(bytes8,bytes8,address[],bytes,bytes32[],uint256[],uint256[],bytes)","86954ecc":"Finished(uint256)","86964032":"getHash(address,uint256,uint256,uint256,uint256)","8696807d":"addABaddress(address,address,string)","8696eec4":"setTokedoTokenFeeDiscount(uint256)","86973b0f":"RewardDemoChannel(address,address,address)","86985bee":"getTeamSalary()","86994b71":"RND()","869984c8":"addrOwner()","8699a65f":"rewardsCount()","869ac8dc":"getReferenceCurrency(address,uint256)","869af1ff":"finishTransferGet()","869b22fd":"toEthertoteDevelopmentWallet()","869b3f6a":"testThrowsRetractNotOwner()","869c63c1":"batchOrderTrade(uint8[2][],bytes32[4][],uint256[7][],address[6][])","869c8bd4":"buyChannel(string)","869d436d":"approvedAddressLUT(uint256)","869d785f":"removeModerator(address)","869d7d93":"countLeadingZeros(uint256,uint256)","869e0e60":"decreaseSupply(uint256,address)","869f1c00":"presaleParticipationMinimum()","86a046d5":"lastRefrralsVault_()","86a17f29":"modifyLevelCap(uint256,uint256)","86a1ea7a":"HeliosToken()","86a2ef34":"Indemnisation_4()","86a2f98a":"getPersonalStakeForAddresses(address,address)","86a3171f":"removeAllAttachmentsFromCollectible(uint256)","86a33a0b":"RoundBSold()","86a3736e":"increaseTokenBalance(address,uint256)","86a3c902":"If(address,bytes32,bytes32)","86a3e0a7":"allocated1Year()","86a40e63":"_removeExcluded(address)","86a4f6ee":"MOM()","86a50535":"voteFor(uint256)","86a57f6f":"byteArrays(bytes1,bytes)","86a5ebe1":"getPlayerDetails(address,address)","86a5ff97":"changeStatus(string)","86a61c81":"medicos()","86a66dc3":"getVoteResults()","86a7b995":"maxContributionInWei()","86a8da37":"getNumWinners(uint256)","86a91ab4":"Scale(int256,bytes32)","86a9443e":"WellyPai()","86aa354a":"PUBLIC_SALES_2_PERIOD_END()","86aa552a":"lockAbsoluteDifference()","86aa6c09":"P3D_address()","86ab3f7b":"RESERVED_TOKENS_FOR_ICO_BONUSES()","86abfce9":"Voted(uint256,bool,address)","86acb16d":"register_creature(address)","86ace9b1":"setICOWeek1Bonus(uint256)","86ae5fec":"getParticipantCount(uint256)","86aecb9d":"_lotteryToken(uint256,address,address)","86af6ba5":"addDeed(address,uint256)","86afa110":"lockTrading()","86b08228":"getInvestorAddr(uint256)","86b0befc":"congress()","86b0fc9d":"startsWithDigit(string)","86b14583":"EzPoint()","86b27391":"startCrowdsale(uint256,uint256,uint256,uint8)","86b2be73":"ICO_RATE2()","86b35f79":"read_u16()","86b46694":"currentWave()","86b467f2":"tokenSaleContractAddress()","86b5e2b9":"dataSourceCallbackRoundOfSixteen(uint256,uint8)","86b6b721":"Anaco()","86b6ec6c":"showLastChange(address)","86b6f462":"updateMaxContribution(uint256)","86b714e2":"s()","86b715bd":"setAutoNewbond(bool)","86b76d6c":"MunishExchange(address)","86b7b8f6":"setBalanceHolder(address)","86b88af0":"setLLV_edit_10(string)","86b8f0a2":"teamAllocations()","86b945b0":"getRoundStatus()","86ba793e":"setProviderCountry(uint256,uint256)","86bb1b24":"pegEtherValues(uint256,uint256,uint256,uint256,uint256,uint256)","86bb1e03":"toCollect(uint256)","86bb5a48":"buyAsset(address)","86bb7121":"getBlocksPerRound()","86bb8f37":"claimReward(uint256,uint256)","86bc2338":"isConsumable()","86bd4ef7":"lockPayment(bytes32,address,uint256,address)","86bdea3f":"postTrade(bytes32,uint256,address)","86be3981":"dividendsForUser(address)","86be53d3":"isPresaleOn()","86beaece":"doPurchase(uint256,uint256,uint256,address,address,uint256)","86bfbd44":"setDailyPrices(uint256,uint256)","86c02e88":"allocateFundToken()","86c23d54":"EliteShipperToken(uint256,string,string)","86c2b53d":"EximchainToken()","86c2e8e3":"accept(uint256,address[],uint256[],uint256)","86c3ceae":"setVAtomOwner(string,string)","86c455ee":"team2LockEndTime()","86c57fcc":"b32ToBytes(bytes)","86c59418":"USDToken()","86c5bc1c":"totalExchanged(uint8,uint8)","86c6f66b":"buySilver(uint256,uint256,uint8,bytes32,bytes32)","86c8c491":"setTransferAdmin(address,bool)","86c99779":"blocktubeUser()","86ca32b5":"claimExist(string)","86cb034f":"KIBIS_Token()","86cb531b":"mintPartnerWithLock(address,uint256,uint256)","86cb5cdb":"feeForFirstArtWorkChangeRequest()","86cba22b":"getAllBuyers()","86cc5a1d":"testIsOptionPairRegistered(address,uint256,address,uint256,uint256)","86cd71be":"getNumberOfMinters()","86cdbae9":"append(string)","86ce0285":"allocateTokens(address,uint256)","86ce8327":"updateStarScore(address,uint256)","86ce9835":"transferMoney(address)","86cef432":"CONTRIB_PERIOD3_STAKE()","86cf1e39":"GetherCoin()","86d01727":"setPendingTaxParameters(address,uint256)","86d08447":"getTestThree()","86d0b46d":"foundersTokensPercent()","86d0b48c":"round3Sold()","86d12325":"preSaleDistributionContract()","86d1a69f":"release()","86d23143":"getLastAcceptedProposal(bytes32)","86d263fe":"MarketCollateralPool(address)","86d2ee85":"HOLDING_START()","86d2fe57":"privateSaleStartDate()","86d35ed9":"getCrypton(uint256)","86d3a2b8":"setContributorCap(uint256)","86d3cf0d":"crazyearners(uint256)","86d3f4b7":"ethRateURL()","86d4c423":"UBTC()","86d4ebf7":"test_BasicThrow()","86d4fe9c":"viewTokensRemaining()","86d4ff1d":"canSell(address)","86d518bf":"grantAccessMint(address)","86d53469":"sendPreSaleETH()","86d54fe1":"EtherFundMeCrowdfunding(string,string,string,uint256,uint256,uint256,address,address)","86d59996":"deleteValidationData()","86d5c5f9":"getPassportLogicRegistry()","86d6c8a0":"getTankProduct(uint32)","86d6c9d1":"canHolderTransfer()","86d74037":"distributeToken(address)","86d8aab4":"cancelMultipleOrders(address[3][],uint256[3][],uint8[],bytes32[],bytes32[])","86d922a9":"lastCallTime(address)","86d9b0c5":"make(address,uint256,bool)","86da69f0":"gamble()","86dbfa98":"DINTToken()","86dc88ff":"addMadeTX(address,uint256,uint256,uint256,uint256)","86dc8ace":"pendingVestingPool()","86dcbefc":"test_registerWithoutCertification()","86dd03bd":"setRedeemLevel(uint256)","86dd5e03":"setBossRoundNumber(uint256)","86de99dd":"SetStatus(uint256,uint256)","86def3b9":"getDukeDate(string)","86df3d5b":"getCreateOrderMinGasNeeded()","86e1e589":"NamiAddr()","86e261c9":"updateSecondAmount(bytes32,bytes32,uint256)","86e2c40c":"removeAffiliate(uint256)","86e3060d":"nextFlexibleReward()","86e32cb5":"setSpecialFeePercent(address,uint256)","86e32ed0":"setAllowedContract(address)","86e36ce2":"speechOfOwner(address)","86e37ae7":"tokensForFight()","86e399c1":"priceDivisor(uint256)","86e476dd":"communityAddress()","86e49407":"setFeeUnit(uint256)","86e4993c":"issue(uint256,uint256,address[],uint256[])","86e4a33e":"countBtcAddressLeadingOnes(bytes,uint256)","86e4e178":"CheckTickets(address,uint256,uint256)","86e58bef":"del_user(bytes32,bytes32)","86e58c0c":"getGalleassTokens(address,bytes32,uint256)","86e5ceb4":"previousRoundJackpot()","86e6361e":"setSellInfo(uint8,uint256,uint256)","86e6eee1":"INEX_Token()","86e8c57a":"secondroundprice()","86e92957":"lastDecimal(uint256)","86e97442":"mora(uint8)","86e99bdb":"XTOToken()","86eb3899":"lockPeriodForBuyers()","86ec6177":"endEvent()","86ec8f62":"validateTokenProperties(uint256)","86ecce90":"test_5_assertGasUsage1400Boards()","86ed60e9":"getSpawned(uint32,int256)","86ee8f01":"masterAddress1()","86efb94e":"addressHistoryOf(uint256)","86f10e8b":"divForEthertoteLiquidatorWallet()","86f1865d":"_bcto(uint256,uint256,uint256,uint256,address)","86f19dde":"phase6Price()","86f1f2d4":"mintDigitalArt(string)","86f254bf":"minConversionRate()","86f28fe3":"token_member_order(address,address,uint256)","86f2907a":"doesEventExist(bytes32)","86f2e5cf":"_setHairColorValue7(uint256)","86f32586":"checkIfFundingCompleteOrExpired()","86f328a9":"episodes(uint256)","86f35b7c":"FeeCalculation()","86f3c026":"UpdateMoney(address)","86f3d0cd":"limitedDeposit()","86f5114e":"voteName()","86f5bf88":"interestPermil()","86f6e410":"adminIsAdmin()","86f7313d":"ico_enddate()","86f7993e":"acceptCooOwnership()","86f79edb":"getMessage(uint256)","86f822fa":"DunkPayToken()","86f876e2":"hyperEnable(address,bool)","86f8950a":"getUnclaimedBalance(address)","86f8bce9":"tixFundDeposit()","86f8e4ef":"mintFinalize(address,uint256)","86fa0671":"tokenShareShow(address)","86fa18df":"throwsWhenTransferingFundsDuringSale()","86fb8715":"ArbitratedBuyDeposit(address,string)","86fbb494":"DigixbotConfiguration()","86fbeb8c":"investors(uint16)","86ffe00f":"preSaleMaxTokens()","87000d42":"clearBetMap()","8700522a":"setLandProductionMultiplierCCUser(bytes32,address)","8700ceb2":"sellCertainOrder(uint256,uint256,uint256)","87011092":"refundContributor()","8701a2f0":"finishBet()","8702735c":"setCapitol(uint256,uint256)","8703b7d8":"setPOOL_edit_4(string)","8703e506":"stage4Bonus()","87040a86":"AddHOLDer(address)","87045369":"setCanCall(address,address,bytes4,bool)","870488f9":"sendTokensToInvestors(address,uint256)","8704c6ac":"MAXIMUM_CONTRIBUTION_LIMITED_PERIOD_USD()","87055008":"euroLock()","8705ae63":"migrationChain(uint256)","8705f218":"RemoveOwnerAddress(address,address)","8705fcd4":"setFeeAddress(address)","87067595":"MagicToken(uint256,string,string)","8706ab57":"setE4RowPartner(address)","8706b052":"PGD()","8707ee3e":"formatDate(uint256)","8708b5b2":"sourcePrice()","870911ff":"onExchangeTokenToEther(address,uint256,uint256)","87092940":"calculateInterest(address,address)","8709bece":"availablePrivateICO()","870b399a":"LOCKUP_6M_ICO_TIMESTAMP()","870b8b94":"hasFiveYearWithdraw()","870baf84":"sendToGiveth()","870bb8c2":"CROWD_WEEK1_PERIOD()","870bfc75":"lockMultis()","870c426d":"getUniverse()","870dbae0":"TOTAL_MAX_CAP()","870e5405":"insert(bytes32,bytes32,int256)","870f0e27":"developmentLockEndTime()","870f892d":"getGTOAddress()","8710296f":"totalEarlyPurchaseRaised()","871105cc":"setVaultContractAddress(address)","871113c3":"oraclize_query(string,string[1],uint256)","87113b88":"managerListMap(uint256)","87114b8c":"versionInfo(uint256)","8711e4a9":"lockTimeout()","8712523e":"lastTransferBlock(address)","87127f85":"ZeonToken()","8712c1c5":"freeTotal()","87136940":"tokenRateInUsdCents()","871388c9":"SetGene(uint256,bool,uint64)","8713d931":"BONUS_100_250()","8714b028":"offers(uint256,uint256,uint256)","8715d65d":"TierWildcatDividendAddress(address)","87161e59":"commandGetBonus()","871625e2":"retraitStandard_2()","871745aa":"presaleAddTree(address,address)","87174c3e":"refundManager()","87178668":"RATE_DAY_14()","8717ef27":"setVotingParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","87182d47":"totalSecondICOSupply()","87191e41":"isWhalePaying()","87195d23":"getInstallments(bytes32)","87196863":"_lower(bytes1)","8719715e":"walletAvatar()","8719e8ac":"setStatus(uint256,bool)","871b4e3c":"getCardBuyAuction(uint256)","871c7aab":"total_freeze_term()","871caa98":"dataOf(uint256)","871cc9d4":"decrementNumber()","871ced4a":"HeartBoutToken()","871cf692":"pullEtherFromContractAfterPreICOPrivate()","871d3eab":"addExtraDays(uint256)","871da475":"GetSellPrice()","871e0155":"pushNodeGroup(uint256,uint16)","871e5fac":"contributorsCurrentPeriod()","871fe6e1":"_validateHardCap(uint256)","872053e6":"releaseThisBonuses()","8720bb42":"liantoken()","87210f63":"tokenMainSale()","87214728":"contractIsCanceled(string)","8721db89":"requireKyc(address[])","8722860e":"isThereAnOnGoingProposal()","8722d4d9":"enforceAddressMatch()","8723202e":"NewSmartSharingContract(string,uint256,uint256,string,string,string)","8724025e":"AENIGMAZ()","8724e751":"Panax()","87250a35":"getSkull(uint256)","872519cd":"VerifyAccount(address,bool)","872539e7":"numberOfLeafs()","872588ba":"lock(bytes32,bytes32,bytes32)","8725d6be":"createToken(uint256,uint256,uint256,address,uint8)","872628e8":"setPriceStep2(uint256)","8726baf7":"unapproveArtist(address)","87275aba":"preMinting(uint256,uint256,uint256,uint256)","8727b7fc":"calculateAmountBonus(uint256)","87280324":"callMe(bytes32)","87281fab":"VestingReleased(uint256)","87283f0f":"ActivationRequest(address,bytes32)","87287fd7":"setMinFee(uint8)","872887c2":"getPeriodStartTimestamp(uint256)","87297093":"previousWithdrawal()","8729fff4":"buyCommission()","872a7810":"revocable()","872b31b6":"_removeStakeholder(address)","872bac57":"UpdateEmployee(address,uint32,uint32,uint16)","872bc83a":"GCCExchangeCore()","872d637f":"DivvyUp(bytes32,bytes32,uint8,uint8,uint256,uint256,uint256,address)","872dbdab":"advert_machine()","872dd49b":"getMigrateOutAttoTokens()","872dd84b":"priceBeforeGoalReached()","872f2526":"getGuestOrders(address,address)","872f5459":"toUINT120(uint256)","872fe620":"withdrawByResque()","87319e1e":"changeContractRegisterOwner(string,string,string,string,address)","8731a8d9":"deposit(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256,string)","8731cce5":"PledgePaymentCanceled(uint256)","87324ef0":"ecrecover2(bytes32,uint8,bytes32,bytes32)","8732d065":"ignoreKYCLockup()","87330b85":"getString1()","87336473":"unblockTransfer()","87338e98":"jackPotBestHash()","8733d130":"ownerManualMinter()","8733d4e8":"identityOwner(address)","8733f360":"initialize(address,address,uint256,uint256,address,address,address,address,address,address,uint256)","8734ffc9":"authorizedETH(address)","87355084":"transferCrowdsale(address,uint256)","8736381a":"contractCount()","87369c4b":"BOUNTY_EXCHANGE_SHARE()","87369e04":"refundTransactions(uint256)","8736fd16":"getRefStatus(uint256)","87393bc6":"verifyFirstHalf(uint256[4],uint256[4])","8739cacf":"getJobRating(address,uint256)","8739f930":"queryGameHistoryLength()","873a2878":"acceptWork(uint256)","873a5690":"VikkyToken()","873ab2ce":"computeFeeRate(address)","873b3009":"getKeyRevisionNumber(uint32,int256)","873bdee0":"systemWithdraw(address,uint64)","873c56d7":"officialLimit()","873cb0ab":"redeemedKarmaOf(string)","873cdb03":"Litas()","873db84c":"queryN_fnc()","873dc3b3":"bountyOnlineGW()","873dc71d":"getCycleInfo()","873ebe6a":"collect(address[],uint256[])","873f610c":"Contractors(uint256)","873f9a6a":"registerDIN(address)","87407993":"inQuitLock(address)","8740b73d":"EthereumGoldPro()","87412a4b":"TeamAndPartnerTokensAllocated(address,address)","8741ab49":"setupCompleteFlag()","8741f15e":"tileBalance()","874252ef":"giveProgectTokens(address,uint256)","8742792f":"changeNameByEveryone(string)","8742fc3b":"getVoteResult()","8744e974":"CallOption(address,uint256,uint256,uint256,uint256,uint256)","87451d52":"addQuickPromoBonus()","8745ddb3":"jailAmountOf(address)","8746656f":"extendDuration(uint256)","874752b4":"SpiceMembers()","8747a674":"getWrapperBalance()","8747f9b1":"resultReject()","8748ecda":"Dynamic1_5x(uint256)","87491c60":"closeMinting()","874a7036":"placeNotes(uint256[],uint256[],uint256)","874b4fcc":"setSigningPublicKey(string)","874b953a":"changePrimaryApprovedWallet(address)","874d6d81":"getWeek()","874d73a7":"addLottery(string,uint32,uint32,uint32,uint32,uint32,uint32)","874f33a1":"doStuff()","874f874c":"reminderCalc(uint256,uint256)","874f8ef6":"getAdv(uint256,uint256)","874fe370":"finalizeTS()","874ff7ed":"YOYOW(address)","8750367e":"FundRequestPublicSeed(uint256,uint256,address)","8750c2d7":"priceInTokens()","8751775b":"cancelRewardsWithdrawal()","87521056":"createMineForToken(uint256,uint256,uint256,uint256)","87524581":"accounts(address,uint256)","87526b0a":"totalPendingPayments()","87528d5e":"setInitAttr(address[],uint256,uint256)","87529f0f":"getTeam(address)","8752cff2":"isUserExisted(address)","8753b16e":"requestOwnership(address)","87541c9e":"setLLV_edit_3(string)","87543ef6":"upgradeController()","87548fcf":"getTracks()","8754b1d1":"createPainting(address,uint256,uint256,uint8,uint8,uint256,uint256)","8754b29c":"buyCore(address,address,uint256)","87551db0":"getChecksum(string,string,string)","8755b065":"initialTransfers(address[],uint256[])","875606a1":"freezeTransfer()","8756f3e7":"LogErrorMsg(uint256,string)","8757a2cd":"test_depth(uint256,uint256)","8757d620":"firstBuy(string)","87585707":"buyVouchers()","87586b32":"getPI_edit_2()","8758ba8f":"approveForGeneLab(uint256)","875991eb":"dealLog(uint256[2],bytes32,bytes32,uint8)","875999e0":"getLastKeyTime()","8759afc9":"_initStages()","8759c2f1":"getHappinessCitizens(uint256)","8759d1c3":"sendReceivedTokens(address,address,uint256)","875a8dfc":"post(address,string)","875ac8f1":"PAYOUT_DATE()","875ad967":"DopeRaiderCore()","875c330c":"LogPush(address,uint128,string)","875c7143":"setSecondYearAllowancePercentage(uint8)","875cb3e5":"closeSuccess()","875dc0ee":"changePaymentDestination(address)","875de431":"phaseOneBonusPercent()","875e7bb4":"FactoringChain(address)","875ea5e7":"dividend(uint256)","875f0671":"crowdsaleStatus()","875f71a3":"ETHDistributor()","875fde3d":"createErc20Token(string,string,uint256,uint256)","876012fc":"composeJingle(string,uint32[5],uint8[20])","87609d1a":"__price()","8760b171":"getBPhashFromBPTokenId(address,uint256)","87612102":"loadRefund()","87615cb2":"enableRegulator(address,string)","8761fb7c":"escrowAdmin()","87627869":"setCopaMarketAddress(address)","8762d50b":"_xx()","87630a2e":"activateContract(address,address)","876339b8":"_sellPutToOpen(uint256,uint256,uint256,uint256,address)","8764159e":"findContractByModName(string,string)","8764edd0":"VerificationAccountOnJullar()","876588b8":"Apply_Store_Id_Fee()","876590c3":"setTeamPrice(uint256[],uint256[],uint256)","876777d0":"TTCoin()","87679684":"checkProof(bytes,uint256,bytes,bytes)","876848d3":"valid(uint80)","876911ca":"ArrAccountIsFrozen(uint256)","8769817a":"CROWD_WEEK1_BONUS()","87699aa6":"TOKENMOM()","8769bc7e":"currentSpiderOwner()","8769beea":"openESOP(uint32,bytes)","8769c281":"allowRefunds(bool)","8769c28c":"bogotacoin()","876b0946":"NucleusVisionToken()","876b0a95":"getDiceWinAmount(uint256,uint256,bool,bool)","876b1566":"getTokenHolders()","876ba3cd":"transferModeratorship(address)","876cf0ef":"getCrystals(address)","876da006":"TOKECOIN()","876e79f6":"targetDiscountValue7()","876ee240":"EthWuxia()","876f1c27":"replaceAnimal(uint16)","876f20b1":"crownSymbol()","876f5746":"ShitcoinCash()","876f9795":"mineSalary(uint256)","877046a2":"CGCCoin()","87708311":"OBEFAC(address)","87717cb1":"_hackoinToken()","8772a23a":"configured()","8772ae3c":"setMinimumBet(uint256)","87730ed7":"allocateFundsBulk(address[],uint256[])","87734d53":"getBet(address,uint256,uint256)","8773c0d0":"buySoul(address)","8774e5d0":"setPriceInWei(uint256)","87757835":"Ducker()","8775a557":"DadaCollectible()","877653f0":"_storeBalanceRecord(address)","8778205d":"TransferDisable(uint256)","8778c090":"arrayOfNonTrivialAccounts()","87793dc7":"invokeOnceFor(address)","877aaf4f":"tosToken()","877af5b4":"subFundAccount()","877b9a67":"isIssuer(address)","877c2184":"getIntValue(string)","877c3650":"getproductprices()","877c4f6e":"submitPeriod(uint256,bytes32,bytes32)","877cedb8":"Lockup12m(address)","877d481c":"startStage3()","877ddd77":"commission_ratio()","877f5618":"isAllowClaimBeforeFinalization()","87800ce2":"MD5FromMarketingKeywords(string)","87801cc3":"setNextRoundDonation(uint256)","87804708":"_validate()","8781249f":"getCntByRarity(uint8)","8781382e":"WBU()","878170d1":"fetchValue()","878314c9":"crowdsale_eth_fund()","878377e7":"RAM_Token()","8783bf1a":"EGGS_TO_HATCH_1DRAGON()","8783d407":"feeReplyThread()","87848727":"writedb(string,string,string)","87864af8":"UNFREEZE_TEAM_BOUNTY()","87873b6d":"MoneyTreeToken()","87874e02":"getNextAvailableLevel()","87877e4d":"setSponsor(string)","8787c9ff":"approveCertificate(address,address)","8787f75d":"Kodobit()","878808af":"tokensSoldGoal()","87881ede":"getStackholderConfirmations(uint256)","8789dfbf":"instContAllocatedTokens()","878a18ef":"tokensSentDev()","878c1484":"cause()","878d4204":"testInitialCrowdsale()","878d5ff7":"partnerInfo(address,address)","878de0ae":"userEndGameConflict(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address,bytes,bytes32)","878e10e4":"SEHR_WALLET_ADDRESS()","878e8827":"getActionParameterByIndexes(uint256,uint256)","878eb368":"cancelAuctionWhenPaused(uint256)","878eb4ca":"serviceDeposit()","878ef7fe":"RealMadrid()","87902997":"acceptAndAdditionals(bytes32,uint256[])","87903097":"timeoutPlayer(uint256,address,uint256,uint8)","879125a4":"setMaximumRate(uint256)","87914c6f":"prolongateContract()","879206a2":"lastPayerOverflow()","87924815":"ownerAddressSize()","87925132":"PandaCore()","879281c4":"login(bytes32)","87932e0f":"setAddress(bytes32,address,address)","87934ec8":"skinCreatedLimit()","8793ae52":"getCurrentDaoStakeSupply()","87943859":"getRefBonus()","879499f4":"newUriBase(string)","87950f49":"setDistributorAddress(address)","879611bb":"removeGlobalConstraintPost(int256,address,int256,address)","8796a7ba":"totalPrivateSaleStage()","8796d43d":"activeToken()","8796ec86":"getDocumentHash(uint256)","879736b2":"swapValidatorKey(address,address)","87982928":"launchPeerWallet(address[],address[],uint256[])","879844b9":"crowdsaleAddressSet()","87986f52":"getOrderSupportCancel()","879a6f7a":"recoverWarriors(uint256[],address[])","879a83fc":"LogWithdraw(uint256)","879abc11":"applyRuntimeUpdate(address,address,uint256,uint256)","879b18b6":"getMemberCanVote(address)","879bfa27":"Investors()","879cffdf":"TokenBuy(address,uint256,uint256,string)","879d46fd":"DAOTrust(address,address,bytes,uint256,uint256,uint128)","879e4b1a":"empty(bytes32)","879e84ab":"minChequeValue()","879f30ad":"burnSent(uint256)","879f4dfe":"_getCampaign(bytes32)","879f9c96":"purchased()","87a01164":"teamTransferFreeze()","87a04b67":"KUYOOToken()","87a07692":"setWinner(string,uint8)","87a07adb":"getSharedAccounByIndex(uint256)","87a09877":"AdvisorGPX(address[],uint256)","87a16f12":"addScriptExecutor(address)","87a2a9d6":"_MAXIMUM_TARGET()","87a2afb3":"releaseBets()","87a378fb":"holdSubscription(uint256)","87a3903e":"buy(uint16,uint16,uint16,uint16)","87a3be75":"init(address,uint256[],address[])","87a3e445":"icoBonus4()","87a407a1":"setBurner(address,address,bool)","87a675ca":"DataContacts(address,address,address)","87a767e3":"removeCA(address,address)","87a796a1":"_fetchCancelledOrdersForPayer(address)","87a846a5":"getBonus(uint256,uint256,uint256)","87a88c43":"iDistribution()","87a91506":"PlayChainPromo()","87a97752":"setInitialEnemyCombination(uint32[4])","87a9a8ef":"totalSupplyAtCheckpoint()","87a9be0d":"BitSelectArrojado()","87a9c6c5":"buyAndTopup(address)","87aa14d2":"freezeEventOutcome(uint256,uint256)","87aa2bf9":"rmul(uint128,uint128)","87ab42b3":"MysteriumTokenDistribution()","87adab57":"VISTAcoin()","87ae00a3":"ZebiMainCrowdsale(uint256,uint256,uint256,address,uint256,uint256,address,address,address,uint256,uint256,uint256,uint256,int256,uint256)","87ae0dbe":"yearSeconds()","87af74ab":"calculateNumberOfNeighbours(uint256,address,address)","87afe179":"getTotalTicketSetsForRound(address,uint256)","87b01dc9":"setSale(uint256,bool,uint256)","87b0be48":"releaseTokens(address)","87b0d60c":"sumICO1()","87b15c0b":"periodITO_wei()","87b234ec":"createReferralGiveAways(uint256,uint256,address)","87b261ad":"coeff()","87b2fe7f":"luckynum()","87b30845":"exchangeDIDForEther(uint256)","87b3be7d":"Ring()","87b47e4f":"transSupply()","87b4e60a":"newTokens()","87b547e5":"balanceOfDirectoryToken(uint256)","87b551b5":"tokenPayout()","87b55705":"mintingThreshold()","87b57fa7":"GetMinerRigsCount(address,uint256)","87b5914c":"exchangeRateETHToUSD()","87b5c21f":"OCTWasteToEnergyJV()","87b5f114":"xpTokenAddress()","87b73795":"verifyKYC(address,address)","87b751ae":"TokenTrader(address,uint256,uint256,uint256,bool,bool)","87b7a068":"updatesAreAllowed()","87b8963c":"badgeDecimals()","87b9a544":"DataController(address)","87b9e310":"nominPool()","87ba67be":"nextLevelPercent()","87ba67dd":"Arascacoin()","87bb25b5":"UndermineComponent(uint256,address,uint256)","87bb675c":"indexTracker()","87bb6aa6":"_revealBid(bytes32,address,uint256,address,address,bytes32,uint256,uint256)","87bb7ae0":"getTicketPrice()","87bc0fc6":"TokenAirdrop(address,uint256)","87bc6906":"BitGuildTrade()","87bd499b":"lastLevelChangeBlock()","87be727b":"getSum(uint16)","87bea35f":"getCreatePrice(uint16,uint256)","87bf740b":"YYToken(uint256,string,uint8,string)","87bfce9e":"claimedYesterday()","87c00626":"calcTokensToEthers(uint256)","87c05510":"setNewlockAccount(address,uint256,uint256)","87c19bcb":"votelog(bool,address,uint256)","87c1be6e":"globalPause(bool)","87c1ed12":"transferToOwner(uint256)","87c23143":"totalEthBankrollCollected()","87c2ee62":"secondStageEndsAt()","87c38114":"Emojicoin()","87c4aaea":"totalTokenVested()","87c50df5":"erectBarrier(uint16,uint8,uint8)","87c55589":"blockTube(uint256,string,uint8,string)","87c5d1be":"LEDTEAM_TOKENS()","87c70d21":"expressReloadNums(uint256,uint256,uint256[])","87c79d1d":"getColors()","87c84933":"LogParticipation(address,uint256)","87c86277":"setPetName(string,uint64)","87c8ab7a":"changeAllowance(address,address,uint256)","87c95058":"setAdministrator(address,bool)","87cb15f7":"move(uint256)","87cc1e1c":"setExporterBank()","87ccb440":"getReg2()","87ccb57b":"testExecuteSellOrderShouldNotChangeBuyerBalance()","87ccccb3":"PublicMine()","87ccd8b3":"_isComplete(uint256)","87cef144":"updateVIPs(address)","87ceff09":"getBlockTime()","87cf34cf":"getUserContributionReclaimStatus(address)","87cf7768":"walletG()","87cfc1d8":"disableAgency(address)","87d14a36":"MaxPlayers()","87d25299":"tessrX()","87d2544d":"CMOSignature()","87d3525f":"CancelSimpleOffer_internal(uint256,bool)","87d36176":"False()","87d3764b":"ROLE_LEVEL_PROVIDER()","87d3a184":"makeZero(uint256)","87d4ca93":"escrowFrom(address,address,uint256)","87d517c9":"fetchInitialDetails(string)","87d5418f":"aSetEnd(uint256)","87d570c0":"OHGRiverResort()","87d5c6b8":"rentalElapsedTime()","87d67208":"changeIcoStartBlock(uint256)","87d741c9":"getPaidETHBack()","87d76f09":"calculateEstimateToken(uint256)","87d79f8a":"buyIceDrangon()","87d7d24d":"ownerconfirm()","87d803a3":"setResult(uint8,uint8,int8)","87d81789":"payments(uint256)","87d87090":"setMinRefEthPurchase(uint256)","87d9d224":"TokenDistribution(uint256,uint256,uint256,int256)","87da18ee":"getRankPriceEth(uint256)","87da3208":"CollateralToken(string,string,uint256,uint8)","87da9cad":"ApprovalToken(address,address,uint256)","87db03b7":"add(int256)","87dba600":"_set6()","87dc0c55":"getAuctionEnd()","87dcd2b6":"superOwner()","87dcfd2d":"numTokensLeft()","87ddc521":"rewardController(address,bytes5)","87dde4ad":"get_candidate(uint8)","87ddf6cd":"setAddressArrayIndex(bytes32,uint256,address)","87def081":"getFeeRecipient(int256)","87df4838":"CancelSell(uint256)","87dfc909":"queryMap(uint8,int256[],int256[])","87e06546":"PLATINUM_AMOUNT_XPER()","87e0f794":"TwistoToken()","87e1029a":"newStar(uint8,uint8,uint256)","87e12235":"_filiate()","87e19cc5":"EBETCrowdsale()","87e25e0e":"deleteCertificator(address)","87e412f4":"SecurityDeposit(address)","87e42622":"KONSTANTOR()","87e44935":"IDOToken()","87e46baf":"transferVoxel(address,uint8,uint8,uint8)","87e4e64d":"getBalanceMy()","87e6835f":"tokensDrukker(address,uint256)","87e70933":"VoteMusic(uint256,address)","87e7dc5f":"ICOStarted(uint256,uint256,uint256,uint256,uint256)","87e854d3":"addRate(address,uint8)","87e89845":"getBabyMommas(uint256)","87e8a980":"godChangeGod(address)","87e97e82":"AuctionStarted(bytes32,uint256)","87ea8581":"setTemp(uint40)","87ea8893":"PGGameToken()","87ea9d52":"INK()","87eba3c7":"GetBuyingTokenAddress()","87ebd76c":"initContract(string,string,uint256,uint256)","87ecaf0d":"check2(uint256,uint256)","87ed1bd0":"grantAccess(address,uint8)","87ed5112":"setApoderadoVerify(bytes32)","87ed90ba":"securityWallet()","87edb2f5":"decode(bytes,uint256,uint256,uint256,uint256,uint256)","87ede474":"MicinRasaJamur()","87eeddf8":"confirmAndExecuteWithdrawal()","87efeeb6":"singularDTVToken()","87f06ec0":"getForkDurationSeconds()","87f0b8c5":"getStrong(address)","87f0bf31":"addResources(address[],bytes4[])","87f0fae9":"setKingdomFactory()","87f162c8":"initialEBETSupply()","87f1e7f3":"c_softCapUsd()","87f24484":"hashPass()","87f29fdd":"removeDiscountPhase(uint256)","87f3e5d6":"contributorsOfCauldron(uint8)","87f404cd":"getContractRhemBalance()","87f40ba4":"supplyReserveVal()","87f503fd":"DEV_TEAM()","87f51ac2":"athToken()","87f5c846":"ethBalanceOfNoFee(address)","87f6be15":"houseCredits(address)","87f74e7c":"updCouponBonusConsumed(string,bool)","87f7cab9":"removePerson(bytes32)","87f7e2a1":"getTeamCost(uint256)","87f9534b":"getLinkedIn()","87fc00f7":"setTPTContractAddress(address)","87fcd708":"StartICO(uint256)","87fcdbc1":"updateConversionRate(uint256)","87fd0421":"TheEthereumLottery()","87fdc401":"make(address,uint256,bytes)","87feba8f":"getInstallmentDuration(uint256)","87fef15b":"purchase(bytes32,bytes32,bytes32)","87ffe5a7":"dataSourceGetRedCards()","8800052e":"preSaleTokensLeftForSale()","88016da5":"allocateFrom(address,address,uint256)","88017e05":"setContribution(uint256)","8801b4fc":"paused_()","8801c928":"createJob(bytes32,uint256)","88026706":"Template()","88034bc5":"CreateTIX(address,uint256)","88037e1c":"view_get_gameData()","88046818":"getFeeSharingWallets()","8804863f":"payWithToken(uint256,address,address)","8804d119":"sendNextRewardTo(address)","88053eef":"RebuyInformEvent(address,uint256)","88054039":"NordstromOnlineRetailDigitalCoin()","880613ee":"getMadeTXCount()","88064637":"registerAssetDetail(int256,string,string,string,string,string,string,int256)","88064b07":"setNextLotteryTTMTokenId10(uint64)","88065236":"approvedAmount(uint256,address)","88072700":"itemIndexToApproved(uint256)","8807592c":"_calculateCommission(uint256)","8807a110":"isCrowdsaleClosed()","8807a468":"getOrgByIndex(string,uint256)","8807f36e":"lastInitializedRound()","88088a54":"getTransformState()","8808f3d0":"canPledge(uint256,uint256)","8809540d":"globalReinitialization()","8809716c":"setDungeonDifficulty(uint256)","880a0664":"getRoundFinish(uint32)","880ad0af":"transferOwnership()","880ade5b":"foundNewGamblingParty(uint256,uint256,uint256,uint256,uint256,uint256)","880b36e7":"getLastCaller()","880b844f":"getRoundWeight(uint256,uint256)","880c0b9d":"lpAskPrice()","880c5f3d":"EtherBTC()","880c7864":"ResearchGroupAddr()","880cab29":"Founder2()","880cdc31":"updateOwner(address)","880dc4e6":"isWithdrawEnabled()","880e73a3":"OTA()","880e87ed":"setUnlimitedMode(bool,address)","880ead7e":"returnOtherCrypto(address)","880fc14c":"inRate()","88102583":"safeCastSigned(uint256)","881056ba":"GMR_TOKEN_SALE_CAP()","8810ac6c":"BuyCarFailed(address,uint256,uint256)","8810c990":"sha3(string)","88116d13":"checkReferalLink(uint256)","8811a0ae":"addressCount(address)","8811e191":"setDebugMode(bool)","8812e897":"getCurrentBonus(address)","8812ec52":"adviserWallet()","8813304b":"forwardOnBehalfWithRevert(address,uint256,bytes,uint256,uint8,bytes32,bytes32)","881362b4":"changeUserInfo(bytes32)","881461be":"burnAddress(address)","88149fb9":"beginTime()","8814fa3f":"Log0(string)","88157942":"icoStartP3()","8815ee86":"purchaserList(uint256)","8815f3d3":"judgement(bool)","8817a198":"priceToBuyInFinney()","8817ecde":"_getPeriodFor(uint256)","88180ff6":"underwrite(address,uint256)","88185aad":"airDropTokens(address[],uint256)","8819dd8e":"getCurrentPeriodKey()","881abe3e":"addProposalVote(uint256,address)","881adeaa":"abioToken()","881b2666":"xTokenPercent_()","881be8f7":"undo()","881c255e":"updateStageBySaled()","881cfeb6":"addInternal(address,address)","881d3bd0":"LongBought(address[2],uint256[3],uint8,bytes32[3],uint256)","881dac8e":"ECHO()","881ed6db":"lockStart()","881eeaa5":"createEstateWithMetadata(int256[],int256[],address,string)","881eff1e":"setMaxBet(uint256)","881fae6c":"endSTO()","881fcab3":"getShipProductCurrentPriceByModel(uint16)","881fcefc":"updateEnabled(string)","881fd690":"isSecondStageTokensMinted()","881fe0ce":"ZealconToken()","881fe258":"_emitRecord(bytes32,uint256,uint256,uint256)","88203417":"AthleteTestToken()","8820401a":"_tokenPurchase(uint256)","8820e2d6":"newVote(address,string,uint256,uint256,uint256,uint256)","8820f6bd":"economy()","8821bb43":"change_owned(address)","8822048e":"isTransferAllowed(address)","8823a9c0":"changeFeeTake(uint256)","8823da6c":"removeAccess(address)","88254efa":"hideSubcategory(uint256)","88257016":"getNthBallot(bytes32,uint256)","882645fe":"preICObonusMultipiersInPercent(uint256)","8826ce84":"uint8ToString(uint256)","8826fa2e":"setStakedBalances(uint256,address)","88275b68":"mintLockupTokens(address,uint256,uint256)","88279320":"prizeValue()","8827a985":"durationPhaseIndex()","8829a5a7":"transferAndWriteUrl(address,uint256,string)","882a1dee":"KrisTest()","882a1fa0":"getDivCard(uint256)","882b4e68":"User_2()","882bc3e1":"RemoveAllConsentDirectives()","882d851c":"tokenMinus(address,address,uint256)","882dd41e":"updateTokenBalance(uint256)","882e2606":"icoEndLine()","882e9709":"record(string,string,string,bool,string,string,string)","882ee532":"getBylawsMilestoneMaxPostponing()","882f327b":"addLock(address)","882f3e16":"forceWithdraw(address)","882f7e83":"changeRigoblockAddress(address)","88301f57":"subDevOne()","88308ca1":"hardCapInCents()","8830a718":"BTHRTokenSale(uint256,address)","8830e09a":"ATTContribution()","88318834":"abandon()","8831e9cf":"setPlatformWallet(address)","8832243a":"profitSharing()","8832bc29":"ETH_PRICE()","8832ebe8":"lolita()","88331b6f":"amountPower()","883356d9":"isBurnable()","8833ae6f":"aquaman()","8834277e":"emitErrorCode(uint256)","8834526a":"MARKET_CAP()","883462ca":"removeFromKyc(address)","8835097d":"assignedAmountToPrivateEquityFund()","88352a29":"signedApproveAndCallHash(address,address,address,uint256,bytes,uint256,uint256)","8835ba24":"Legolas()","88362d4b":"setDailyLimit(uint256,uint256)","88369d6b":"getTokenBalance(address,address,bytes32)","8836f3ef":"getNumberOfBounties()","8838af8a":"rarityMultiplier()","8838b68e":"etherLeft()","88394fdc":"startRoundA()","8839515c":"OWN_ChangeToken(string,string,uint8)","88398fbc":"PreSaleHardCap()","883a3ea8":"LottoNumberTest()","883a584c":"RichiumToken(uint256,string,string)","883a6476":"IsAirDropEnabled()","883a92e1":"setFreezeEndTime(uint256,uint256)","883ba26b":"getIsSettled()","883ba466":"changeHiddenOwnership(address)","883cd1a5":"cloudsPerEth()","883cdeb9":"newTrack()","883cf630":"resetBucket()","883d0ac6":"totalnSupply()","883dfaba":"getWinBalancesOf(address)","883fdd6f":"IWABOO()","88400fbe":"ICO_TEAM()","884095f6":"getWineryMappingID(string,string)","8841520b":"SpinnerCountsByAddress(address)","88416792":"usersPause()","88417820":"LBSN()","884179d8":"ipfsAttributeLookup(address)","8841937a":"setTileHp(uint16,uint8,uint32)","8841ac11":"buyItem(uint256,uint256,uint256,uint256)","8841dd3c":"thirdRewardPeriodPercent()","88426aec":"getStageDeadline(uint8)","8842bfa0":"Chain4()","8843641e":"removeAmountForAddress(uint256,address)","8843c1ba":"listAcceptedTokens()","8843c222":"MIN_ACCEPTED_AMOUNT_FINNEY()","8843ffba":"signup(uint256)","88445e29":"sha3(uint256)","884543c0":"TokenBought(address,uint256,uint256,uint256)","8846594b":"checkKYC(address)","8847092d":"upgradeMaterial(uint256)","884790de":"agentInvo(address)","8847df97":"ChangeEmissionRate(uint256)","88482233":"Lizambo()","884870c7":"setParameters(uint256,uint256)","884879d6":"startSecondStage()","88488c33":"finalizeTask(uint256)","8848fb0d":"addEmployerJob(address,address,uint256)","884a2308":"setCompte_5(string)","884a26da":"massBurn(uint8[],address[],uint256[])","884a47b4":"setNews(string)","884ade03":"ForceSeller(address)","884ae10b":"saleWalletAddress()","884b5dc2":"fill(uint256[])","884b850b":"BurnAssignedFees(address,address)","884bf67c":"getPrizePool()","884c1480":"LacesToken(uint256,string,string)","884c6440":"BuyItem(uint256)","884ca7b1":"getButtonPrice()","884edad9":"Withdraw(address,uint256)","884f3db0":"check_the_rule(address)","884fafcd":"totalJackpotEven()","88508a18":"getRecentPlayers()","885124c0":"Coin5941()","88516a89":"ownerFraction()","88519ea4":"availablePreICO()","8852024f":"max_TotalSupply_limit()","88524780":"saleAuctionERC20()","885349a2":"payToBank(uint256)","88535e90":"changeMinimumContributionForPublicPhase(uint256)","8853636b":"revealResult(uint256,bytes32)","885363eb":"landOf(address)","88537daf":"checkMiningAttempt(uint256,address)","88538c36":"candidateInformation(uint256)","885463fd":"strategicAllocation()","8854baa8":"AddReturnsMapping(uint256)","88550b6a":"getTokenBuyPrice()","88559aaf":"processAllocation(address,uint256)","8856cd84":"medicaxess()","8856d517":"GetReferralInfo()","8857322d":"DOLLAR_DECIMALS_MULTIPLIER()","885819c2":"getVatIdByAddress(string)","8858287b":"vendorCount()","8858ad6c":"Exploreon()","8858adc6":"setColor(uint16,uint24)","8858fa3b":"totalEthReceivedInWei()","8859c6d6":"operatorCampaignID(address,uint256)","885a3b75":"currentTotalSupply2()","885a5ec2":"lastBlock_f10()","885b63da":"setAuctionStartBid(uint256)","885b6cfb":"addZethrAddress(address)","885c69b5":"clearMetadata(address)","885e2750":"groupsCount()","885e401e":"lifeFactor_i()","885ec18e":"left6(uint256)","885f5011":"calcRatioNext()","8860805a":"extractMax()","8860bf94":"showworker()","8860d49f":"_transferInternal(string,address,string,address,string,uint256,uint256)","8861026f":"complianceWallet()","8862198a":"MasterContract(address)","8862d26a":"offeringType()","88631e18":"distribute(address,uint256,uint256,address[],address,uint256[])","88635b06":"createContractPerson(string,uint256,address)","8863c8d5":"concludeCrowdsale()","8863dd1a":"transferOwnerShip(address)","8863f31d":"Controller(address,address,address)","8864a5fd":"processPendingTickets()","8864d074":"RADCOIN()","8865015d":"g(uint256[20])","886588ac":"confirmVerbose(bytes32,address,uint256,bytes)","8865cbd6":"cancelAllOrdersByTradingPair(address,address,uint256)","88668d21":"getReplyRaw(bytes32,uint256)","88671acc":"FundAllocation()","88672f82":"setEtherRate(uint256)","88684aa5":"nextUnLockTime()","88685cd9":"releasePayment(uint256)","886b148d":"setPropertyPrivateModeEarnUntilLastUpdateBecomePublic(uint16,bool,uint256,uint256,uint256)","886b4954":"secToNextInterestPayout()","886bb359":"chown(address)","886bbe0c":"submitProof(bytes32,bytes32,uint256[],bytes,uint256)","886c0ee6":"Develop()","886d3db9":"uintToBytes32(uint256)","886d969b":"calc_partnerPercent(uint256)","886db803":"_setBigWinner(address,uint256,uint256)","886e549b":"PineappleArcadeTrophy(uint256)","886ed2d1":"enableRealWorldPlayerMinting(uint128[],bool[])","886ef644":"getRate(address,uint256)","8870155c":"getNumTknOfferors()","88702cc4":"debug_hash256Double(bytes)","88705f7d":"NeoCrowdsale(uint256,uint256)","8870985b":"getFreeBalance(address)","887159a2":"treatRemaintoken()","887240d0":"generateFileID(string,string,string,string)","887263cf":"EnigmaToken()","88727ba9":"_depositEthers(address)","8872bb2a":"_createElement(bytes32,uint256)","8872c094":"getUnsoldToken()","8872c68a":"sampleStorage()","8873704c":"addRequest(string,address)","8873d247":"THANKSTEST()","8874fa28":"CurrentRevision()","88753343":"maxResolvedAgonId()","88758581":"unregisterEmployee(address,address)","8875a40b":"endTimeTLP2()","88760a18":"loadStarbaseEarlyPurchases(address)","887651cc":"isAlreadyIn()","887699f3":"periodContributionOf(uint256)","88770cb0":"extendEndTime(uint256)","88776a7e":"testThrowTranferFromEmptyBalance()","88780b8e":"safeBalance()","88782386":"UnicornMilk()","8878356d":"testBetAmount()","88786272":"startingTimestamp()","8878990e":"changeCollateralSeizer(address)","8878adac":"refund_claims(string)","8878d726":"buySpecialBuilding(uint256,uint256,uint256)","8878db7f":"setCRYPTON_CUT(uint16)","887a8e33":"AgencyLock1()","887b00db":"TESTTESTICO(address,address,address,address)","887b1b0b":"recalculateTokensToBuyAfterSale(uint256,uint256[])","887bae74":"addReferenceParentWineryOperation(string,uint256,string,address,int256)","887bbef5":"setMinInvestment(uint256,uint256)","887bdcfc":"accountBalance(address,address)","887c3e5d":"updateAddress(bytes32,address,address)","887c4646":"approveIndexedByAddress(address,address,uint256)","887c4f68":"ludumTokensPerEther()","887c7f92":"remainingReserveSupply()","887ccc82":"getStake(uint256,uint256,address,bytes32)","887cfc3e":"orderToTransfer(address,address,address,uint256,string)","887d23a6":"isBeforeEndTime()","887d813d":"serviceGroupGet(address)","887e0c07":"runPlugin(address,uint40,uint256)","887e22b1":"tier5Time()","887f6178":"genericTransfer(address,uint256,bytes)","887ffc9c":"referalPayByNum(address,uint32)","88806b37":"transferZone(uint256,address)","8880a933":"transferTokensToNonEthBuyerToMany(address[],uint256[])","8881d3a2":"CompensationFailEvent(address,uint256)","8882349b":"vppToken()","88824bd1":"PonziUnlimited()","88827c16":"addPost(bytes32)","8882ddc9":"maxCharacters()","8883478e":"preicoAndAdvisors()","8883c52a":"getNumberOfAssetPacks()","88840671":"Milkcoin()","888419ed":"setData_8(string)","88849e71":"BasketToken(address[],uint256[],uint256)","8884b807":"getVoters(uint256,uint256)","8884cd7c":"changeBuyFlag(bool)","8884fbec":"checkTotalsAndMintTokens(address,uint256,bool)","8885f2a3":"setzBool(bool)","88865347":"grapesToBuildWinery()","88865ee3":"cleanupEven()","8886a667":"registerNameXIDFromDapp(address,bytes32,bool)","8886ca33":"getHeroBP(uint256)","88873eea":"blocktubeClip(string,uint256,uint256,address)","888764c8":"addBouncer(address)","888808ba":"Bittelux()","88888f61":"purchase(uint256,bytes32)","8889025a":"increaseJackpotTimeAfterBet()","88896a0d":"deliverPrize(address,bytes)","88897c37":"request_close()","888a3f79":"_approvedFor(bytes32,uint256)","888aab22":"addWithdrawal(address,uint256,uint256,uint256)","888ade0a":"publicKey(address)","888b6557":"minFundingGoalWei()","888d5917":"limitDateCrowdWave2()","888ea120":"saleDeadline()","888f2b13":"SALE_RATE()","88908546":"refund_eth_value()","889087b1":"meltCrystals(uint256[])","8890e13d":"isArenaContract()","88922e7a":"raiseAppeal()","889231c1":"promoLimit()","889258ea":"startICOStage1()","88929931":"UnlockDateExtended(uint256)","8892bb73":"createChildUniverse(bytes32,uint256[],bool)","8892d571":"withdraw_Leim(uint256)","8893240d":"setPeonyAddress(address)","88933e07":"getSMPTokensLeftForICO()","8893eb13":"getActivated()","88945187":"updatePurchasingState(address,uint256)","8894dd2b":"addEther()","88951352":"distributeTokens(address[])","889569cd":"getKoikeContract()","88968b94":"rateOwner(uint256)","88968bc3":"clearKyc(address[])","8897b1a7":"PRESALE_HARDCAP()","8897c1f4":"randomNumber(uint256,uint256,uint256,uint256,uint256,bytes32)","8897df9d":"addEpisode()","8899568c":"createDefaultZodiac(uint256,uint256,uint256,address,uint256,uint256)","8899fa0d":"onUnVote(address,int256)","8899fffd":"myFinneyValue()","889b59d9":"getDBallotsN(bytes32)","889c10dc":"addDelegate(address,address,bytes32,address,uint256)","889cd532":"upsertOne(address,uint256,bool,bool,uint256)","889d227d":"newPaymentAddress(address,bytes4)","889d9550":"getCryptoCupTokenContractAddress()","889e175e":"__slash__(address)","889e5073":"getStatus(address,address)","889eaa0d":"nextRate(uint256)","889f0c99":"withdrawFor_(address)","889fa1dc":"getFighter(uint256)","889fb53e":"incrementCoin(address,uint256,bool)","88a0e990":"BridgeTheChain()","88a12f7a":"_getUint(bytes4)","88a15f11":"secondMaxAmount()","88a17bde":"allocation()","88a1e895":"test2Fails()","88a2653c":"unwhitelistAddresses(address[])","88a2995d":"MyToken(uint256,uint256,string,string,uint256)","88a49164":"testErrorUnauthorizedTransfer()","88a4e86c":"balanceOfRaw()","88a525c4":"withdrawTokenBalance(uint256)","88a55c8b":"setBustRange(uint256)","88a6c749":"getFirstTranscoderInPool()","88a6cc53":"lockPurchasedTokensClaim(uint256)","88a74525":"fraction(int256,int256,int256)","88a79003":"addWhitelistInternal(address,address,bool)","88a7ca5c":"onTransferReceived(address,address,uint256,bytes)","88a89dd0":"add_to_buy_bounty()","88a8b341":"setVoteInternal(uint256,uint160,bool,bool)","88a8c95c":"changeDev(address)","88a8d602":"management()","88a95495":"removeFromMap(uint256[])","88aa1001":"checkJoinAirdropQuest(address)","88aa8bee":"getTokenDetails(address)","88aaa229":"AcceptsIDK(address)","88abc4a2":"coinIssuedPrivate()","88ac76ca":"cthereum(uint256,string,uint8,string)","88ad52f0":"DouYinToken()","88adbf8f":"addressOfTokenUsedAsReward()","88aebe00":"calculateWineBuy(uint256,uint256)","88aece7f":"setBuyOrdersContract(address)","88aed238":"ixix()","88af30c3":"_mainAddress()","88af6534":"VRF_EGG_COST()","88af883b":"adm_trasfer(address,address,uint256)","88af8ed4":"removeInvestor(bytes32)","88afdeba":"totalCreatedGame()","88afe426":"_removeAgonIdByOwner(address,uint64)","88b11ee2":"DZoneCoin(uint256,string,uint8,string)","88b2ed1a":"addPlotAndData(uint24[],string,string,uint256)","88b322c3":"setAdvisors(address)","88b3a538":"projectManagers(uint256)","88b44c85":"assertEq(uint256,uint256,string)","88b45046":"income()","88b4b861":"proposeTo(address)","88b51ac0":"gernerateVoting(uint256,uint256)","88b55641":"buyTokenIco(address,uint256)","88b59734":"vendueClosed()","88b75493":"getLastAuditAuditor(address)","88b7a17c":"functionName(bytes32)","88b7a89d":"test0_create()","88b7e6f5":"returnInt128(int128)","88b7f5e5":"advisersWallet()","88b8c487":"playerWithdraw()","88b9022f":"semanticVersion()","88b95242":"PricingEnergy(uint256)","88b9a469":"initVault(uint256)","88b9e10e":"seizeTokens(address,uint256)","88bac2b8":"Mediated_Transfer(uint256,address,address,uint256)","88bb0c73":"teamsReward()","88bb18fc":"mintDSBCToken(address,uint256)","88bb6e68":"AkershoekToken()","88bb9fb1":"MultivestSet(address)","88bc65e3":"getFreelancerAvgRating(address,address)","88bec9da":"deleteMember(uint256)","88bf60b7":"transferMinimumFee()","88bff117":"setDrop(bool,uint256,uint256)","88c058a5":"subDefence(uint256,uint256)","88c0b8a7":"setChangeFee(uint32)","88c0bc8e":"buyTokensWithReferrerAddress(address)","88c12be2":"deathData_f0()","88c190a4":"NiMingToken(uint256,string,uint8,string)","88c2a0bf":"giveBirth(uint256)","88c30278":"getMinerOffsetOf(address)","88c3ba85":"ParallelGambling()","88c3ffb0":"getRoundInfo(uint256)","88c463af":"contributorsOfCauldronRound(uint8,uint32)","88c4e888":"get_token_state()","88c55c47":"initializeVesting(address,uint256)","88c600d0":"CryptoCongress(address,uint256,uint256)","88c662aa":"getController(address)","88c6abf8":"currentIteration()","88c7b6e6":"CrowdSaleMacroansyA()","88c7e397":"buyable()","88c8475c":"batchFreezeAccount(address[],bool)","88c8da99":"deactivate_admin_comission()","88c912b8":"sendToAddressWithBonus(address,uint256,uint256)","88c91d24":"computeCooldownTime(uint128,uint256)","88c91fb1":"transferExtender(uint256)","88c9a7d5":"setPixels(uint32,uint32[],uint8[])","88c9cb3c":"timer()","88c9ebbd":"getKeyPrice(uint256)","88cac17d":"setNextLotteryTTWTokenId3(uint64)","88cb214e":"editWhitelist(address,bool)","88cb8a73":"setPixelBlockPrice(uint256,uint256,uint256)","88cbc84a":"buyInvestmentPackage(uint256)","88cbdf13":"toUint32Throw()","88cc58e4":"getFactory()","88cc81de":"PaymentExpectationCancelled(bytes8)","88cc852a":"notZero(address)","88cca295":"addressToPurchasedBlocks(address,uint256)","88ccf2b9":"SetTokenInfo(uint256,address,uint256,uint256)","88cd2d47":"UserCRUD()","88ce3048":"lastweek_winner3()","88cee87e":"adminRemoveRole(address,string)","88cf2bc6":"buyStarCoin()","88cf6648":"liquidationPriceWad()","88d0443d":"bounty_address()","88d0820e":"selfFreeze(bool,uint256)","88d0b42d":"getRecentActivity()","88d115af":"PonyCore()","88d116b8":"_createPlayer(string,uint256,address,uint256)","88d12a4d":"totalWeiReceived()","88d18ea4":"featureSprite(uint256)","88d21ff3":"pollExists(uint256)","88d2faf9":"publishMemberEvent(address,uint256)","88d450e4":"setArtistsAddressAndEnabledEdition(uint256,address,address)","88d52ef7":"poolContract()","88d60e27":"setPercentTokenAllocation(uint256,uint256,uint256)","88d695b2":"batchTransfer(address[],uint256[])","88d723ac":"TetherToken(uint256,string,string,uint256)","88d761f2":"finishMigration()","88d7cd97":"externalStorage()","88d7e087":"withdrawChi()","88d8c702":"Summary(address,uint128[])","88d8da5f":"equals(string,string)","88d937a3":"createnation(uint16[],string,uint256)","88d97c30":"getGroupPageCount(string)","88d9fc4d":"updateReserveVault(address)","88da9bfd":"getUserNumbersOnEther(uint256)","88db84bc":"getRequiredStateChanges()","88dbe7a7":"dividendBonus(address,uint256,uint256)","88dc0d49":"TRcoin()","88df13fa":"multiMint(uint256,uint256[])","88df31f0":"minDiscountEther()","88dfee60":"setOtherFounder(address,uint256)","88e01a98":"closeRound(uint256)","88e072b2":"checkTransfer(address,uint256)","88e114cc":"log_approve(address,address,uint256)","88e16190":"ItemCreatePrice()","88e2af0e":"initialBattle(uint256,uint256)","88e2ca21":"getClue4()","88e2da99":"randDelay()","88e2f29b":"updatedPrice()","88e3c5d6":"addVerifiedUser(address)","88e3cfda":"setResult(string)","88e3ffeb":"updateMinimumWeiRequired(uint256)","88e47f29":"_ChallengeSucceeded(uint256)","88e490eb":"getInfoCellBalance()","88e4b6ad":"calculatePotCut(uint256)","88e5581e":"twitterDropSingleAmount(address[],uint256)","88e62721":"revoke(address,bytes32)","88e67d96":"isAccess(address,string)","88e694aa":"MANNCOIN()","88e765ff":"maxBuyAmount()","88e814e6":"getTopPlayers()","88e85127":"ModeratorAdded(address,address,bool)","88e854e0":"SDR(uint256,string,string)","88e8e26a":"ServiceToken()","88e90253":"NewRateSet(uint256)","88e951dd":"totalContributors(uint256)","88e9d45d":"ButtonClickGameContract()","88e9fb4f":"keyEmployeesAllocatedFund()","88ea41b9":"setMinBet(uint256)","88ea70ee":"bountyTokensAddress()","88ea8ee5":"bonusCRS()","88ea8fd8":"manualUpdatePrice()","88eb615c":"LogWhiteListed(address,uint256)","88eb7af7":"_isHuman()","88eb944b":"addDedication(uint256,string)","88ebf975":"setDebt(uint256,address)","88ec6f42":"Cef()","88ec838f":"configParams()","88eccb09":"addLevel(uint256,uint256)","88ed8b36":"notRandomWithSeed(uint256,uint256)","88ede276":"hasBeenConstructed()","88ee4b2d":"_getIdIfValid(bytes32,uint256)","88eea4f3":"WhiteBitcoin()","88ef59fb":"releaseOldBalanceOf(address)","88efc97b":"activateEscapeHatch()","88efedf4":"AIRDROPS_PERIOD()","88f020bb":"drawWinner(uint8)","88f1ccf2":"cancelInvestment(address[])","88f2b12e":"SerpentHead()","88f34bc2":"depositAndVote(uint256,uint256,uint256)","88f53db1":"getDataRequest(uint256)","88f5eb36":"exchangeRateForBTC()","88f6d5a4":"constructCoinbaseTx(uint256,uint256)","88f7c6d6":"setExchangeStatus(bool,bool)","88f9ff98":"_random256()","88fabb3a":"SetMessage(string)","88fad42a":"EthereumRisen()","88fb4af0":"ShootRobinHood(uint256,string)","88fc0825":"unregisterNode(uint256)","88fc176c":"DucToken(uint256,string,uint8,string)","88fc65fb":"isTransferable(address,uint256)","88fcba88":"fundingDeadline(bytes32)","88fd0b6e":"getMembershipPrice(uint8)","88fd35e8":"setConfiguration(uint256,uint256,int256)","88fdf3d4":"setWinnerPrizes(uint32)","88fedd04":"houseProfit()","88ff2dcc":"createProject(string,address,address)","88ff9416":"initialize(address,address,address,address,address,address,address,address,uint256,uint256,uint256,uint256[])","88ffc33e":"bltMasterAcc()","88ffe867":"pledge()","89009ab0":"purchaseAd(uint256,uint256,string,string)","8901b9ae":"withdrawBalanceFromAdmin(uint256)","89020fe3":"PacifistFarmer()","89029d8c":"get_all(uint256,uint256)","89034082":"issueToken(address)","8905fd4f":"reclaimERC20(address)","89064fd2":"approveWithSender(address,address,uint256)","89065e9a":"getPlayerSpaceshipOwnerById(uint256)","89077ad2":"SharderToken()","8907e787":"isAccountWhitelisted(address)","89080102":"verifyDSHash(uint8,bytes,bytes)","8908017f":"calculatePhoenixPoolCut(uint256)","890814f8":"bountyValue(uint256,uint256)","8908e693":"setTokenCurator(address)","890a018d":"externalSales(uint8[],bytes32[],address[],uint256[],uint256[])","890a7ef7":"publish(bytes,string)","890a9917":"privateSaleMinContrAmount()","890ac366":"mintReserve()","890b2adc":"Reply(bytes32,bytes32,uint256)","890c6848":"WallCoin()","890d6908":"solve()","890e2a6b":"updInvestorPreSaleEnabled(address,bool)","890e839f":"isOnSale()","890e9d2f":"getAllowanceSpenderValue()","890ea91a":"creditsOf(uint256,address)","890eba68":"flag()","890ed1cb":"dealHouseCards()","890ede44":"TokenCoin5()","890f2168":"crowd_end_date()","8910b070":"NUC()","8910cd58":"substractLockedAmount(uint256)","89113858":"IHCToken(uint256,string,string)","8911cd9a":"silverPercentage()","8911cf0d":"unsafeResignOwnership()","8911e26b":"isUnrestricted()","89128b70":"get_submission_queue_length()","8912ab5c":"dropVotes(address[])","89135ae9":"setAdministrator(bytes32,bool)","891363a6":"lastCWCETH()","8913b809":"initPlayers(uint32,uint32)","891407c0":"purchaseTo(address,uint256)","8914f1e1":"getDepositAmountFor(address)","89158ff9":"assignDispute(string,address,string,address)","89165dcb":"changeEtherDeltaDeposit(address)","8916cbc6":"minRedeem(address,uint256,uint256)","8918485b":"setEthlanceSponsorContract(address)","8918ab1b":"Sumte()","89198fed":"fulfilled(bytes32,address)","8919e3b6":"VinzCoin(uint256,string,uint8,string)","891a2f31":"buyItem(string,uint256)","891a3e23":"gettotalEth()","891a8b85":"ethPriceInUSD()","891aab6a":"addStaffWhitelist(address[])","891acff7":"updatedPrice(string)","891c738a":"isTransPaused()","891d4fe8":"printContent()","891de9ed":"fromTLA(string)","891df671":"registeredAt(uint256)","891e6f43":"thisContract()","891e75bf":"preSaleCreated(uint256,uint256,uint256)","891f5ce5":"successfulFunding()","891fa67d":"PsyMultiSig(address[],uint256)","891fe103":"typeBuffPercentage()","89206411":"batchAttachAssets(uint256[])","8920bcf9":"mediaToken()","8921329f":"registerBlog(string)","89222698":"SetWriter(address,bool)","89224227":"haltDirectTrade()","892250a7":"commonBudgetAdress()","89225c5a":"bountyManagerAddress()","89231bcc":"getDataNum()","89233fbd":"getPlayerGuessNumbers()","892412f0":"availableInventoryOf(uint256)","89244e2a":"dateEnd()","8925d7bb":"getTotalBrags()","8925f9e9":"getWorseOrderId(bytes32)","89266fca":"tokensSoldOnPublicRound()","8926f723":"GMBCToken()","89273f15":"addStorage(string)","89281963":"setServicestationAddress(address,address)","89286abd":"freezeAccountTransfers(address)","892886e1":"PresaleTokenPurchase(address,address,uint256,uint256)","89291b05":"updateSubscription(address,bool,uint256)","892a0e42":"releaseToSeller()","892ad596":"changeTimes(uint256,uint256,uint256,uint256)","892c0214":"NumberOfCurrentBlockMiners()","892cd384":"CreditHydraToken()","892d31e8":"setEndCloseSale(uint256)","892db057":"isTokenEscapable(address)","892dfdf6":"transferDisabled()","892e0614":"distributeDivs(uint256)","892e243a":"directorName()","892e3f98":"setContributionInWei(uint256)","892e8dd9":"getViewDataByIndex(uint256)","892ee1a2":"removeUserFromBlacklist(address)","892ef672":"getACLRole8972381298910001230()","892f81df":"initializeTreasure(uint256)","89301afc":"Registrator()","8930c702":"updateWhitelist(address,address,uint8)","89311e6f":"startIco()","8931c998":"calculateTokenPresale(uint256,uint256)","89320239":"WHP()","89320771":"FDC(address,string)","89325127":"test_require()","89327ad5":"transfer_single_token_balances(address)","8932da79":"additional_price_money()","8932dc3d":"publishResult(string,string)","893372ca":"cancelPending(bytes32)","89337e84":"createTokens(bytes32[])","89341f6e":"TCASH()","89349217":"GamersCoin()","8934d115":"verifyUrl(string,string)","8935556d":"setDividends(uint256)","8935860d":"transferAgent(address)","8935b613":"setContentsManager(address)","8935ced5":"weightOf(uint256,address)","8936b8d4":"getCurrentRateInCents()","8937a0e8":"Guestbook()","8937d3dd":"Champion()","8937e223":"distoryAndSend(address)","8938656b":"getGeneratorsIds()","893880b6":"purchaseShareContract(address)","8939f5f6":"recoverCat(uint256)","893ae703":"bonusInPhase4()","893b746a":"cooperateRewardSupply()","893b8b0a":"getCategoricalMarketNumTicks(uint256)","893c1d31":"bountyReserveTokensDistributed()","893cebb3":"createSalesOffer(bytes32,address,uint256,bool)","893cf478":"chargeVerificationFee(address,address)","893d20e8":"getOwner()","893d4948":"JTEToken()","893fb18e":"buyout(uint256,bool,uint256,uint256)","89400fcc":"SkillCoin()","89402a72":"__default__()","8940aebe":"publicKey(uint256)","8940afe7":"testFailBurnGuyNoAuth()","8941db65":"addTime()","894306d5":"CanChange()","89443aac":"bttsVersion()","89452488":"NEBC(uint256,string,string)","8945a8af":"TOKEN_RESERVE1_CAP()","8945b1fc":"takeOwnership(string)","8945d643":"m_softCap()","8945e00d":"getForkCalled()","89462c38":"setContract2(address)","89465d2e":"dataForWithdraw(address)","8946d33f":"SplitterEthToEtc()","89473a0e":"PRCT100_D_TEAM()","89476069":"withdrawToken(address)","894766dd":"setTotalCoins(uint32)","89483926":"checkGainsToReceive()","894875cf":"_decimals18()","8948fe67":"wlDuration()","89495172":"convictFinal(uint256,uint256)","8949e109":"curReward()","894a62b3":"addContributionList(bytes10,string)","894a93e2":"tgeSettingsPartInvestorIncreasePerStage()","894b8d2e":"victorieumStatic1Token()","894ba833":"disableContract()","894ca160":"CanToken()","894cd9b6":"placeBuy(address,uint256,uint256)","894cdcc1":"ADXToken(address,address,uint256,uint256,uint256,address,uint256,address,uint256,address,uint256)","894d05b5":"buy_drink(uint256,uint256)","894d6ef9":"TripCoinTeamAddress()","894d7b08":"claimTokenBonus(address)","894e036d":"callAndReward_2(string,string,uint256)","894e5e1f":"GEE()","894e5f2d":"isUserAuthorized(address)","894ee6d9":"_getTimeValue(address,address)","894f6531":"SingleTokenLocker(address)","894fefeb":"TokenHeld()","89506a44":"MAX_TRANCHES()","89514f6e":"setSummary(string)","89519c50":"refundTokens(address,address,uint256)","895224db":"testControlBlobStoreNotRegistered()","89523d77":"removeProperty(bytes32)","895274bb":"getPlayerSpaceshipBattleLevelById(uint256)","8952877b":"storeProof(bytes32)","8952f965":"isTransferConfirmed(uint256)","8954f5b1":"winChoice()","895594f6":"setEarlyParticipantWhitelist(address,bool,uint256,uint256)","895595d5":"firstRoundICODiscount()","8955ed7e":"claimBalanceOwnership()","895678a2":"expireDelay()","89568a13":"TSTEST1()","895693a9":"getToBalance()","8956fceb":"addAlt(address,uint256,uint256)","89574144":"GXESwapper()","89578145":"checkIfYearHasPassed()","8957d6f2":"numOfLegendary()","8957f8bf":"getLastMoveTime(uint16)","89596409":"getMigrateState()","89597595":"HCLCToken(uint256,string,string)","8959cbfe":"punksOfferedForSale()","895a8cfb":"secondWeekMainICOBonusEstimate()","895ab68c":"canCallDefault(address)","895abac9":"landPriceCandy()","895b4da7":"RunSale()","895bf2e1":"tickets10price()","895c1596":"getExpectedTotalTokens()","895c1bdb":"setStatus(address,address,uint8)","895c4c39":"unlockDevSupply()","895c666a":"createCommonPlayer()","895cf354":"validCertificators(address)","895d4e1b":"getMiningDetail(uint256)","895e8b23":"_tokenExists(uint256)","895ec54c":"getPack(uint256)","895ee30d":"Purchase(address,address)","895f468b":"markAllRead()","89604ed0":"rebalance_delete(uint256,bool)","89611d0a":"checkIfSignedBy(bytes32,address)","89612f95":"setPrivateSaleTokensSold(uint256)","896131ca":"NewEntry(address)","896147e1":"ratePre()","8962aead":"setPOOL_edit_23(string)","896317b8":"getAssetType()","89637214":"presalePiTokensLimit()","896372b4":"addLogBlock(uint256,uint256,uint256,string)","89638de3":"setItemNotForSale(uint256)","8963c04b":"tokenSaleTokenBalance()","8963dab4":"getNodeId(bytes,bytes)","89658163":"setPath(uint256,uint256,bytes,bytes)","8966321e":"canTransfer(address,address,uint256,bool)","89666fd6":"adminSetPercentInvite(uint256,uint256)","8966768f":"confirmOracle(address,uint256)","89668a39":"addOpenRoomCount(address)","89675cac":"set(address,address)","89676b27":"storePrizeMoney()","89685242":"isValidPeriod(uint256)","8968c17c":"BlockchainCutiesCore()","8968db88":"GazeCoin()","89698f02":"recordContract()","8969fb5f":"USDETHRATE()","896a17a4":"releaseRestBalanceAndSend(address)","896ca3f4":"put_purchase_for(uint256,address,address,uint256,uint256,uint256,address,bytes)","896ce019":"getDailyTransactionVolumeSending()","896d505a":"setReport(uint256,bytes)","896d807a":"setAttribute(bytes32,string,uint256)","896e0349":"TokensClaimed(address,uint256)","896ed75a":"refuseAddress(address)","896f40dd":"ownerOnly()","897032e3":"ClipToken()","8970430e":"IcoContributed(address,uint256,uint256)","8970a0f4":"getFinalPayoutDistributionHash()","8970d84c":"_tokens()","89712af3":"longTermHolding()","8971739b":"getVIPCount()","8972feba":"reserveTokensGroup(address[],uint256[])","8973123c":"saleStartDate()","8973d0cf":"CoinwareToken()","8973e316":"resolveSellCityForEther(uint16)","8974372d":"payFund()","897463aa":"startContribution()","89749adb":"BuyTokens(uint256)","8975e45f":"currentNumberOfUnits()","89760e0a":"stateIndexToOwner(uint256)","89765328":"totalInvestmentOf(address)","8976762d":"setA_Signature(uint256)","8977f909":"UTCStart()","89781912":"setAllowedAddresses(address,bool)","8978fc79":"batchDistributeFees(uint256,uint256[])","89790192":"WithFee(address,uint256)","897a7dab":"createTokens(uint256[],address[],bytes32[],uint256[],uint256[],bytes32[])","897b0637":"setMinAmount(uint256)","897c41dd":"showInvestorVaultFull(address)","897c8613":"payContributorByAdress(address)","897cb036":"softCapTokens()","897cceee":"lockContract(bool)","897d2b10":"getPixelArray()","897d55cd":"migrationGetBoard(bytes32)","897e47f5":"setDateMainEnd(uint256)","89800cc2":"mtrContractAddress()","89804ddc":"getSagaExchanger()","89805f30":"s32(bytes1)","89805fc6":"PPCContract()","8980f11f":"recoverERC20(address,uint256)","89813984":"isWhitelistAddressListed(address)","8981a7ca":"actionA(uint256)","8981d077":"lockForWork(address,address,uint256)","8981d513":"owner(bytes12)","89826963":"changeICOStartTime(uint256)","8982b185":"buySEKU(uint256,uint256)","8982d772":"submitInitialEmptyState(bytes32,uint64,uint256[2],bytes32,bytes32,uint8)","898366d7":"ETH888CrowdsaleS2(address,address)","8983d2e9":"goldSymbol()","8984034f":"emitPriceUpdated(uint256,uint256)","898403c3":"getCurrentBlockTime()","8984e5dd":"_subBalance(address,uint256,address)","89850fae":"nextStep(uint256)","89852db2":"PARSEC_CREDITS_MINIMAL_AMOUNT()","89853691":"readUint256(bytes32)","89859b50":"updateLatestTree(bytes32)","8985a309":"setAllowedAddress(address,address)","8985abc8":"publicSaleAmount()","898644cc":"getFreeMiner(address)","89864915":"TyzonSupply()","89869163":"claimFailedConsensus(address)","8986ff32":"setEndTimeIcoStage3(uint256)","898855ed":"changeName(bytes32)","89885a59":"tokenOwnerOf(uint256)","8988b284":"isMod(address)","8988c1ff":"LogWhitelistUpdated(address)","8988d59e":"Transfer(address,address,uint256,address,bytes,bytes)","89895d53":"orderBlockNumber(bytes32)","89897104":"_buyRank(address,uint256)","8989851c":"operationList(uint256)","898a1813":"expectationsLeft()","898aa23b":"setPriceInCents(uint256)","898ad5ec":"set_arbits_presale_open(bool)","898c94b7":"SetDidPayOut(bytes32,bool)","898ce10c":"ChangeItemOwnerID(uint256,uint256)","898dc9b6":"setData_31(string)","898e3950":"addWinner(address,uint256,uint256)","898f767b":"precioether()","898fb033":"updateDescription(bytes)","898fdf94":"claimRate()","8991dede":"Falcon()","89920edf":"mintLockCashout(int256,address,uint256)","899231ef":"PRE_ICO_MINIMUM_CONTRIBUTION()","8992ae0e":"UBETCOIN_LEDGER_TO_LEDGER_ENTRY_DOCUMENT_PATH()","8993021b":"risks(bytes32)","899346c7":"nextPositionId()","89935c39":"getAmbientTempControlLimits(bytes32)","8994fa53":"TopUpMember()","89952097":"releaseRestBalance()","8995305e":"AsterionWorldToken()","89975389":"newVoting(string)","89976229":"setAmout(uint256)","8997f8cf":"getTokenUpdatedCounter(uint256)","8998470d":"tradeIntentOf(address)","8998ef19":"withdrawTokenMaker(address,uint256,address)","899942b8":"Devcon2Token()","899967b7":"redeemExcluded(address[],uint256[])","8999dd63":"ESoulToken()","899a0e7e":"OpenAIBlockChainToken()","899a1e36":"addBounty(address,uint256)","899aa65c":"Judged(uint256,bool,address,bytes32)","899ae006":"createBabies(uint256[],uint256[],uint256[],uint256[])","899b3414":"updateCoupleImageIPFShash(string)","899b53c9":"RICHToken()","899b64d9":"tokensPerEther_denominator()","899b6713":"VIRTToken()","899bf897":"isAllowedToRedeemNow()","899c0360":"getVIPRank(address)","899c4434":"testValidateTrade(address,address,address)","899d1556":"firstRoundICOTokensLimit()","899d840f":"PayPoker(string,string)","899e0fc9":"balanceOfPot()","899e37b9":"mintAndLock(address,uint256,uint256)","899e87f3":"AmountSet(address,uint256)","899ecf2b":"phase3EndBlock()","899f107d":"roomNightsOfOwner(uint256,uint256,bool)","899f9d29":"YCBToken()","89a0b679":"setContributor(address,address,bool,uint16,uint16,address)","89a2662f":"NeonCoin(uint256,string,string)","89a27984":"phepToken()","89a30271":"USDC()","89a3a00d":"addMinutes(uint256,uint256)","89a3e807":"Corban(address)","89a419e1":"set_stage_Days(uint256)","89a451fb":"getPriceChannel(string)","89a45223":"testFailCreateWithParentsParentNotInUse1()","89a4931d":"maxContributionAmountContract()","89a4bd1b":"foundationHashed()","89a4c1a0":"DevAddress()","89a5f2df":"privateSaleBonus()","89a69c0e":"setSubRegistrar(bytes32,address)","89a7adcc":"DelSocialAccount(bytes32,bytes32)","89a81e83":"validPurchase(uint256,uint256,uint256)","89a83701":"level(address,address,uint256)","89a9453a":"removeAllowedContracts(address[])","89a9d38e":"_approve(address,address,bytes32)","89a9d6b4":"tokensRemainingStage3()","89aaad29":"currencyUpdateAgent()","89abeb19":"ProcessGameExt(uint256)","89ad0a34":"setLocked(address,bool)","89ad0efd":"calculateAmountOfUnits(uint256,uint256)","89ad50e3":"CindicatorTalk()","89ada759":"availableBountyCount()","89ae1c90":"nativeReputation()","89aeca76":"registrars(address)","89af049d":"removeNacFromNLF(uint256)","89af175c":"RiservaETH(uint256)","89af2dce":"getBalanceFrom(address)","89afaf9d":"AddMod(address,address,bool)","89afcb44":"burn(address)","89b13814":"Killable()","89b1714b":"simpletransfer(address,uint256,uint256)","89b1802c":"feesRateCongres()","89b1fa0a":"ROLE_TRANSFER()","89b2050b":"addExtraBalance(address,uint256)","89b2b09e":"ABDEL_ADDRESS()","89b2df31":"getTurn(uint16)","89b337a7":"GetCityData()","89b38d2f":"getInvoicingAddressByIndex(string,uint256)","89b3f8c7":"Flames()","89b49d61":"checkCapNotReached(uint256)","89b4a36f":"Depot()","89b4c550":"checkAndSendPromoBonus(uint256)","89b51f94":"setCommunityAddress(address,address)","89b52360":"referralCount()","89b52b9b":"sendCoin(address[],uint256[],bytes32)","89b540aa":"FuckYou()","89b5b514":"maxFinalStage()","89b5ea24":"outputMoney(address,uint256)","89b61a85":"updateVeifyFee(uint256)","89b68f40":"releaseFounderTokens()","89b7e746":"getMyOpenedCount(address)","89b898b8":"batchConvertIntoHtlc(bytes32[],address[],uint256[],uint256[],uint256[],bytes32[])","89b8b492":"read(uint64)","89b8db55":"minBounty()","89b933cd":"serviceFallback(address,uint256,bytes,uint256)","89b9572f":"RBTToken()","89b97d07":"totalSite()","89ba3b23":"confirmDepositQuest(address)","89ba8e61":"getExplicitStrategyState()","89bb55c7":"apply(bytes32,uint256,string)","89bc0e6e":"UnitedToken()","89bc2006":"BagPackToken()","89bc455d":"THO()","89bca2d5":"addAuctionItem(uint256,uint256,address,uint256)","89bcbee2":"DemoToken()","89bcf968":"timeExpires()","89bdb217":"totalTeamFundMinted()","89be87a1":"openChannel()","89bfc6be":"PIVOTCHAIN()","89c0b25c":"openDispute(address,string)","89c1108d":"isTimeVault()","89c186d5":"addNewBusinessWallet(address)","89c18b48":"EtherusToken(address)","89c19ddb":"concat(string,string)","89c2443e":"executeSelfdestruct()","89c29b61":"calculatePaycheck(uint256)","89c44def":"sendMileStone(address,uint256,uint256)","89c5077f":"withdrawDevFee(address,uint256)","89c55845":"setBonus(uint8[5])","89c5ee3b":"executeAfterFinalize(bytes)","89c67976":"getAcceptance(bytes32,address)","89c698d4":"CrypteriumToken()","89c73565":"birthBlockThreshold()","89c766fd":"pause_for_maintenance()","89c77dfe":"mintValue()","89c7abfd":"removeAdministator(address)","89c7e70c":"BitliquorStandardToken(uint256,string,uint8,string)","89c98c06":"getMaxGasPrice()","89c9c44a":"EmontFrenzy(address)","89c9c586":"slopeDuration()","89c9e80f":"PotOwner()","89cb29dd":"nextEscrowId()","89cbc416":"tokensRedeemed()","89cc5c2b":"createdBlockOnRevealsPhase(uint256,address)","89cc5ea8":"bid(string,address,uint256)","89cc81c1":"contribute(bytes32)","89ccd39a":"set_address_A(address,address)","89ccf28c":"checkCapAndRecord(address,uint256)","89cd4b5e":"decidingBlock()","89cda6a8":"pausePVP()","89ce16cc":"maxRange()","89ce33bd":"delegateERC820Management(address)","89ce555c":"devFeesAddr()","89ced196":"setNotUpdatable(bytes32)","89cf5604":"releaseReserveTokens()","89cf9f94":"_reserveRefTokens(address,uint256)","89cfa823":"addPendingWithdrawal(address,address,uint256)","89cfd71b":"setPrivate(uint256)","89d2fca3":"DoctorChainToken()","89d3a15b":"addNewBlock(bytes32[],bytes32,bytes32)","89d3ed8d":"defineDiscountBorderLines()","89d410e9":"setIcoOwner(address,address)","89d4a66c":"internalDeposit(address,uint256)","89d59ee5":"createPersonalDepositAddress()","89d5da3b":"AlphaMarketICO(address[])","89d61942":"nextAuctionSupply(uint256)","89d61d77":"setOrganizer(address)","89d67775":"window1TokenCreationCap()","89d6d69d":"stampIndexToApproved(uint256)","89d700a5":"TheGTokenTest(uint256,string,uint8,string)","89d75221":"revokeSignToCancelAgreement(uint256)","89d77f82":"blocksToWaitLong()","89d86c5d":"getRetailer(uint256)","89d8b472":"_error(string)","89d8ca67":"drawPot(bytes32,bytes32)","89d8f96f":"getDirectOffersComissionRatio()","89d9b059":"refillRatifiedMintPool()","89d9ed38":"reserveFunds(address,address)","89da85d3":"getNumberOfArticles()","89dbeb64":"fundForAirdrop()","89dc8719":"getUserMaxPurchase(address)","89dcbbf9":"getFreeLobster()","89dcd64f":"saiTub()","89dd9e22":"changeBrick(uint256,string,string,string,bytes32[])","89ddeff3":"neurodao()","89de2581":"SetStorageContract(address,address)","89df1b01":"setMultiRequestLastRequestId(uint256,uint256)","89e198b4":"validContract(uint32,uint32,address)","89e2605d":"setReleaseAmountToCreator(uint256)","89e28a47":"getGameResults()","89e2c014":"allocateVestedTokens(address,uint256,uint256,uint256,uint256)","89e2d8bb":"handlePayableSharesDelta(uint256,uint256)","89e40af2":"stageSum(uint256)","89e42346":"enableRefund()","89e478f6":"minGasForDrawing()","89e4e22b":"pingDelta(uint256)","89e52771":"getTeamAddresses()","89e582c4":"FuturXe(uint256,string,string,uint8)","89e6359f":"preIcoEthers(address)","89e63a60":"conversionHashes(bytes32)","89e6579b":"registerExchange(address,address,bool,bytes4[])","89e6b5fb":"transferOwnership(address,bytes32)","89e7b8f6":"frozenFundsOf(address)","89e7f5cb":"OCZAPI()","89e85217":"teamBalance()","89e877a3":"activateWhitelist()","89e8beb3":"_strConcat(string,string)","89e94513":"advance(bytes15,uint32,uint64,uint64,int64,uint64)","89e96773":"BEY()","89ea2cb7":"onRefundPollFinish(bool)","89ea642f":"getString()","89ea770a":"grantTokensAdvisors(address,uint256)","89eaa610":"userAccess(address)","89eb313a":"isReadyToMate(uint256)","89eb4fee":"MYJ256()","89ebe846":"loyaltyWallet()","89ecd0e8":"disableAllowBuy()","89ed0b30":"setOraclizeGas(uint32)","89ed2ebf":"_transferDrone(address,address,uint256)","89ede784":"starbaseCrowdsale()","89edf114":"referralOwnerPercent()","89ee8758":"Daz()","89eea0eb":"tetherCount(address)","89eedf00":"setPdfHash(bytes,bytes)","89ef40e7":"numberOfHealthyGenerations()","89ef75b1":"purchaseWithPromoter(address,address)","89ef8292":"bulkTransfer(address[],uint256[],address)","89efa1b5":"registerEtherBalance(address)","89f0151c":"addAttribute(bytes32)","89f03ebc":"Incrementer2()","89f0ccba":"pre_start()","89f12d00":"minBlockNumber()","89f12ed9":"novaAddress()","89f182aa":"createMilestoneAcceptanceProposal()","89f1c26e":"minterTransferFrom(address,address,address,uint256)","89f1d38d":"Swap(uint256)","89f21090":"singleValueAirDrop(address[],uint256)","89f224a8":"EthlanceJob(address)","89f27d55":"transferItem(uint256,address,uint256)","89f37c45":"test_invalidThrow()","89f395de":"tos()","89f47b64":"doCrowdsaleMinting(address,uint256)","89f4ed7a":"getLastTag(uint256)","89f4fd57":"getUserProxy()","89f63f50":"teamb()","89f650fd":"next(bool)","89f6709c":"longRecord(address,uint256)","89f6e826":"drainRemainingToken()","89f71d53":"lastAction()","89f85a4b":"BalanceLocked(address,uint256,uint256,uint256)","89f8601e":"Engraved(address,bytes32)","89f88d7a":"Chess(bool)","89f8ab94":"lastRateUpdateTimesForCurrencies(bytes4[])","89f91592":"agreeWithdraw(uint256)","89f915f6":"getNumbers()","89f9b01e":"countingMeme()","89fa413d":"tradeRobot()","89facb20":"INTERVAL()","89fb75f9":"amountOfStage(address,uint256)","89fc01f6":"GetBidSeries(address)","89fcd099":"getApproval(address,address)","89fd14a1":"raiseTrivialThreshold(uint256)","89fdd81d":"PRE_ICO_LIMIT()","89fe141a":"maxSupplyPossible()","89fe253a":"BountyCampaingWallet()","89fe5273":"getTokensToSend(uint256)","89fe8507":"setNumbers(uint256)","89fee530":"CBSToken(string,string,uint8,uint256,uint256,uint256,bool,bool)","89ff7fe0":"getCurrentBlockNum()","8a007d86":"preSaleMinPaymentWei()","8a007f30":"endGame(uint256,string)","8a00a82f":"withdrawRewardFor(address)","8a010c22":"changeBankAccount(address)","8a0193ac":"getGameExpired(uint256)","8a024a3f":"releaseINAToken()","8a03ad86":"getUserAddressById(uint256)","8a0490db":"PrakashToken()","8a0520fb":"isApprovable(address,uint256)","8a054ac2":"d()","8a059493":"fetchRoundIndexBySnapshotBlock(uint256)","8a05ad20":"TokensIssued(address,address,uint256)","8a05e478":"instantiate(address,address,bytes32)","8a063d91":"rewardThree()","8a066045":"unescrowFrom(address,uint256)","8a06cb71":"get_config()","8a06ce1b":"setTotalSupply(address)","8a0807b7":"indexOf(string,string)","8a0904da":"mainSale_EndDate()","8a098cd7":"bucketManager()","8a0a53d5":"BicycleSupply()","8a0c47cd":"changeWallet(uint8,address)","8a0cbf50":"VCCoin(address)","8a0cc3c6":"SMILO_COMMUNITY_AMOUNT()","8a0e5a75":"addToPublicSaleWhitelist(address[])","8a0e859f":"isDiamondAuction()","8a0f1e52":"PlayerBet(uint256,uint256)","8a107a31":"generate(string,address,address,bytes32,uint256,uint256)","8a1129f1":"unfreeze_start_date()","8a120dc9":"testBitEqualFailIndexOOB()","8a124744":"SiuToken()","8a127931":"profit5eggs()","8a13796e":"CERB_Coin()","8a13aa4b":"takeEth()","8a13aa4f":"WorldToken()","8a13eea7":"erc20Token()","8a1489e3":"viewInvestorDividendHistory(uint256)","8a14f12c":"totalWagered()","8a155171":"availableForWithdrawal(address,address)","8a157df3":"createAuction(uint256,uint256,uint256,uint256,uint256)","8a157fae":"getEthBase()","8a1678a4":"LUMA()","8a17041a":"_founder_one()","8a17164c":"distributeTokenSaleJackpot(uint256,uint256)","8a172f2e":"getPawnEngine(uint256)","8a175ac2":"enableContribution(bool)","8a186788":"lookupIndex(uint256)","8a18a804":"UnsoldTokensBurnt(uint256)","8a18c55f":"SMT()","8a192c70":"setWLMTfinney(uint256)","8a194223":"Cryptolotto6Hours(address,address,address,address)","8a196437":"VRJToken()","8a19ac6d":"fechAllVoteResultPreRoundByBlock(uint256)","8a19b4d2":"addAdmin(address,address)","8a19c8bc":"currentRound()","8a19e355":"addToBalance(uint256)","8a1abbcf":"_getClientSupply(address,uint256,uint256)","8a1af4c4":"addOperator(address,address)","8a1b991d":"SBCE(uint256,uint256)","8a1bb169":"getJsonToTokens(string,uint256)","8a1bba96":"InvestorSum()","8a1bda63":"LogRedistributeTokens(address,uint8,uint256)","8a1be474":"CCNCrowdsale(address)","8a1d42f4":"setData_4(string)","8a1d8ae6":"x32323(uint32,string,uint8,string,address)","8a1dd162":"getPixel(uint256,uint256)","8a1e1404":"showFPLowerlim()","8a1f7a1b":"getMesa(uint256,uint256)","8a1fde4b":"setMaxwin(uint16)","8a20d00c":"buyTokensFromContract(uint256)","8a20f724":"currentRoundIndexByDate()","8a20f73c":"isInstrument(address)","8a213adb":"testFailMintGuyNoAuth()","8a237f27":"F2D()","8a2418ab":"nextSeedHashA()","8a24fd78":"convertGeneArray(uint256)","8a252194":"betGanjilGenap(bool)","8a252831":"asyncSend(address)","8a25aefa":"TEST_HOUSE()","8a2693e5":"kycVerification(address,address,uint256)","8a26d4c4":"GBTToken()","8a27a31c":"currentBanker()","8a27a51c":"transferGiveaway(address)","8a27a88b":"recoverAddressFromBalanceProofUpdateMessage(uint256,bytes32,uint256,bytes32,bytes,bytes)","8a294c60":"blacklisting(address)","8a29b77d":"receiveApproval(bytes)","8a2a0879":"TAUKEAYAM()","8a2a60ef":"foreignDailyLimit()","8a2ade34":"DonationClaimed(address[2],uint256[7],uint8,bytes32[2],uint256,uint256)","8a2ae2ab":"killTile(uint16,uint8)","8a2bfdf2":"add2Auction(uint256,uint256,uint256,uint256,uint256)","8a2cb24d":"castleExpAdjustment()","8a2e196c":"NTRYAvailableForSale()","8a2e2bf8":"updateLuckpool(uint256)","8a2e467c":"firstRoundTime()","8a2f6f94":"getRoleStatus(address)","8a30442e":"validTransfer(address,address,uint256,bool)","8a306c21":"mainSaleSupply()","8a31ffda":"replaceBoardMembers(address[])","8a323b38":"Contract(uint256,string,uint8,string)","8a329809":"setFeeContractAddress(address)","8a331846":"dividendParentsPercentage()","8a333b50":"max_supply()","8a33f585":"getOrder(address,uint32)","8a340eab":"BKToken()","8a341c83":"testErrorRootAuthorityChangeUnownedPackage()","8a34396a":"personalCapActive()","8a344477":"putDeed(bytes32,uint256,bytes32,bytes32,uint256,string)","8a349cc4":"subscribtionLittafi(uint256,string,string)","8a34bb24":"changeContractFee(uint256)","8a355a57":"removeProvider(address)","8a359d6e":"getEducationCitizens(uint256)","8a35b8c7":"invested(address,uint256)","8a35f788":"_getWinner()","8a36c3dc":"TeamToken(string,string,address)","8a36ebc2":"showSmallProfit()","8a36f5a2":"Debug(uint256)","8a38ab2c":"createCourse(string)","8a3907b9":"buyPerSell(uint16,bytes32)","8a394c4c":"eraseUnsoldPreSaleTokens()","8a39ebdc":"globalPresaleLimit()","8a3a84a8":"Total_Payouts()","8a3aa194":"endCrowdSaleTime()","8a3b0199":"transferOnBehalf(address,address,uint256)","8a3bacd1":"backup_drawdown()","8a3bc2bc":"iPropose(bytes,uint256,bool)","8a3c36cb":"DollHair()","8a3c44a5":"Constructor()","8a3d6290":"addBountyTransferredTokens(uint256)","8a3d7cdc":"tiles(uint256,uint256)","8a3db05f":"_myTokeName()","8a3e37c3":"StarbaseMarketingCampaign(address)","8a3e44d4":"assetMoveInformation(address,address)","8a3e99ff":"HighCastleToken()","8a3f6e2a":"transferFromAndDepositTokenFunction(address,uint256,address)","8a3f8a23":"queryChibi(uint256)","8a4068dd":"transfer()","8a40bd00":"allowedToUpgrade()","8a40c4c4":"Youdeum()","8a426b1b":"handleExternalBuyers(address[],uint256[],uint256[],uint256[])","8a42b68c":"approveOrderHash(bytes32)","8a42ebe9":"set(string,uint256)","8a433274":"executeVoting(uint256,bytes)","8a43fc7e":"return_rejected_payment(uint256)","8a449c2c":"VividoRaidenToken()","8a44ae91":"setAUM(uint256)","8a45242d":"newGame(bytes32,uint256,uint256,uint256)","8a45557e":"flowerTotalSupply()","8a4577ea":"returnTokensFromTeamAddress(uint256)","8a462fbc":"calculateNewPrice(uint256)","8a46467d":"reloadCore(address,uint256,uint256)","8a4660fe":"MINIMUM_INVESTMENT()","8a468e15":"TBowner()","8a469c16":"addGeneralMilestone(string,string,uint64)","8a46bf6d":"testFallback()","8a47cadb":"SunPowerToken(address,uint256)","8a48941f":"getDistributionFacts()","8a48ac03":"getAccounts()","8a49a3cc":"updateTrustScore(address,uint256,uint256)","8a4a8718":"GoinbitToken()","8a4a9aab":"xhstoken()","8a4af069":"TotalTokenSupply()","8a4b08d9":"getPriceRate()","8a4be59e":"incentiveDistributed()","8a4c81c2":"SEADToken(uint256,uint256,uint256)","8a4cae0e":"addVpf(bytes32,uint256,uint256,uint256,uint256,uint256,int256[])","8a4d5a67":"content()","8a4db4fa":"allowedToBuyBack()","8a4e3025":"addStaff(string,uint256)","8a4e4639":"pregnantPoniesies()","8a4e7a7c":"endCrowdsalePublic()","8a4ea479":"addUndergraduate(uint32,string,uint16,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)","8a4fb16a":"getWithdrawal(uint256)","8a4fbead":"setTokenAllowance(address,uint256)","8a4fe8ac":"membersNumber()","8a505b4c":"setAutoBuyFee(uint256,uint256)","8a5144c0":"estProviderFee(address,uint256)","8a519fb9":"BlockChainEnterprise()","8a51d0fc":"totalEarlyInvSupply()","8a51e8ed":"_timeLimit()","8a529159":"KinguinKrowns()","8a53360f":"GrantUpdated(address,uint256,uint256)","8a53862d":"refundPartCollateral()","8a53c3b1":"TeamTokensHolderMock(address,address,address)","8a53f230":"noError()","8a545aec":"getEngineerPrizePool()","8a547932":"sendFounderAndTeamTokens()","8a54d6a4":"recordVotes(uint256[])","8a55b001":"Sleipnirwallet()","8a55d36e":"isStart()","8a5651e3":"EMISSION_FOR_PRESALE()","8a56b230":"setMiningWarInterface(address)","8a56ca45":"lastOwner()","8a56d115":"lagDefrost()","8a56e85e":"_createRandomDna(string)","8a56f3ee":"burnFrom(uint256,address)","8a56fe46":"orderExpired(address,address)","8a570230":"IDK()","8a585214":"BogpillToken()","8a5910a5":"RewardTimePeriod()","8a593cbe":"pre_ico(address,uint256)","8a59eb56":"updateStatus(bytes32)","8a5a68f4":"richtokenIndexToOwner(uint256)","8a5be698":"balanceOfDerivative()","8a5c19c0":"getWeekNo()","8a5c9098":"_mint(address,uint32,uint32,uint32)","8a5cca14":"AccountTransfersFrozen(address,bool)","8a5cf5ee":"quarter3()","8a5d815e":"finishContract()","8a5ddd9b":"emergencyAndHiddenCapToggle()","8a5ddf9d":"emergencyRedeem(uint256,address[])","8a5fb3ca":"currentFeePercentage()","8a604017":"pendingParticipants(uint256)","8a6083d2":"changeCrowdfundState()","8a609155":"totalUniquePlayers()","8a6158f7":"startSettlementProcess()","8a61a2a6":"NewKoth(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256)","8a61b26d":"startICOPhaseTwo()","8a61bb91":"initiateBoardMemberVote(string,bytes32,address[])","8a61dcb7":"MiningReward()","8a626ba1":"offerPriceCandy(uint256)","8a6281f6":"getOwnerInfos()","8a62e9e9":"setIgnoreRequestIds(bytes32[],bool[])","8a62fd12":"NVTFallback(address,uint256,uint256)","8a6508ce":"removeCooldown(uint256)","8a653c93":"extGetLock(uint256)","8a654a64":"lockedAccountThresholdEth()","8a65d874":"userStats(address)","8a662b59":"SOLID()","8a6655d6":"vote(uint256,uint256,uint256)","8a6700e8":"Dex(address,address,address,uint256,uint256,uint256)","8a67456a":"contractPaused()","8a67c544":"setSchemaValidity(bytes32,bool)","8a67f04b":"_payoutMining(uint256,address,address)","8a67f4bf":"getRewardsBalance(address)","8a684f97":"EthMsig()","8a689784":"blocksDelay()","8a68ae3c":"transferPaladinOwnership(address)","8a69218c":"getLastRewardTime(uint256)","8a699023":"phase8Price()","8a69fead":"getTitulaire_Compte_1()","8a6a3584":"clearAccount(address)","8a6a8b6c":"getMonthlyTransactionVolumeSending()","8a6b114b":"getBet(address,uint256)","8a6b6877":"withdrawMineral(uint256)","8a6b9be4":"allowToWithdrawFromReserve()","8a6bc85a":"getInterestor(address)","8a6c02ae":"safeWithdrawal3(address)","8a6c0b26":"registerCreatorsPools(address[],uint256)","8a6d2d7b":"MATOU()","8a6d39b9":"Leak()","8a6db9c3":"minterAllowance(address)","8a6e0a8e":"_increaseApproval(address,address,uint256)","8a6ee066":"_releaseWithReward()","8a7097ce":"checkWithdrawalsgross(address)","8a7180ae":"team_token_percentage_max()","8a72ea6a":"offers(uint256)","8a738683":"sweep(address,bytes32)","8a7398e7":"getAllRoundRefIncome(address,address)","8a74b45c":"editApi(uint256,uint256,address,string)","8a74ee43":"allowTransferFrom(address)","8a74f69d":"transferMod(address)","8a758625":"setStrF1IntF2StrF2UintF2(string,int256,string,uint256)","8a75f56a":"setArbiterLocked(address,bool)","8a769d35":"miningTarget()","8a76a63e":"whitelistedInvestorCounter()","8a76d99b":"buyTicket(uint32,uint32,uint32,uint32,uint32,uint32)","8a775ab6":"RiskPrices(uint128[])","8a77ba1a":"companyVault()","8a78b7fb":"test_invalidProposalExecution()","8a78f5e2":"changeMember(address,bool,bool,uint256)","8a7a7e03":"ETH_PER_LARE()","8a7a8f46":"HJF()","8a7c20d7":"setReferralFund(uint256)","8a7c2ad7":"buyService(address,uint256,bytes)","8a7c2be2":"payEth(address,uint256,uint256)","8a7c2d6d":"hasOpenApplicationFromSource(address,address)","8a7c63c5":"privateStartTime()","8a7cc2ca":"RemapImported()","8a7d124b":"destroyToken(uint256)","8a7e30a1":"token_set()","8a7e5144":"addWhiteList(uint8,address,uint256)","8a7ed05c":"MAX_BID_FRAC_TOP()","8a7ef3df":"testFailCreateWithParentsParentSameItemId1()","8a7f1146":"RetrieveFunds()","8a7f800c":"preCensor(bool)","8a808acf":"Yaraq()","8a8090b8":"_setUint(bytes32,uint256)","8a80d9a3":"isRefundPaused()","8a80dfb1":"isFirstBadgeEle(uint256)","8a8146d0":"end_ICO_PreICO()","8a814cfe":"MyCrowdsale()","8a827eb9":"setSecondary(address)","8a82a09d":"MISTT1()","8a83d4a0":"burnMythexTokens(address,uint256)","8a863fbd":"juryOnlineWallet()","8a8672dc":"DINRegistry(uint256)","8a871c5f":"crosairVouchersMinted()","8a874084":"updateInteface(address,address)","8a87873a":"create(bytes32,address,bytes32[3],bytes32,bytes32)","8a87aeb9":"EthToOwner(address,address,uint256)","8a87b5c5":"dailyAdminAllowance()","8a87d8ea":"hasLicenseTerms(bytes32)","8a881e0e":"isExists(bytes32)","8a88c349":"addVestingMember(address,uint256,uint256,uint256)","8a88c4fe":"replaceOwnerIndexed(address,address,uint256)","8a890695":"logPurchaseViaFiat(address,uint256,bytes32)","8a892271":"initiateLocking(uint256)","8a89b338":"set_commandPercent(uint256)","8a8a0aab":"_b2(string,address)","8a8b4d61":"MediaBroadcast()","8a8b51b8":"setAddGas(address,uint256)","8a8b7deb":"CAT()","8a8b7e02":"whitelist_enabled()","8a8b98dd":"ETHT()","8a8bbd5c":"ThanhnvToken()","8a8bf82a":"batchTransferToken(address,address,bytes32[])","8a8c523c":"enableTrading()","8a8c8c42":"TokenCoin()","8a8cd78d":"setTurnoverTo(address,uint256)","8a8e2028":"getCurrentTranche(uint256)","8a8e3999":"_unsafeEncodeTokenId(int256,int256)","8a8e5239":"get_power(address)","8a8e5afb":"shaCommit(uint256)","8a8ede8a":"hasStatus(address,address,uint8)","8a8f1f25":"setAccountSpendingLimit(address,uint256,string)","8a8f5b79":"newXPAAssets()","8a905482":"createIpo(address,uint256,uint256,string,string)","8a926d0f":"maxTokenAmount()","8a933eac":"setSmartContractPrice(uint256)","8a93d70d":"MakerWithdrewEther(uint256)","8a93dbdf":"getInvestorDividend(address)","8a946339":"ERC20Token(string,string,uint256)","8a955876":"incrementCountSales(uint256,uint256)","8a957929":"setFeeAuthority(address)","8a957f15":"ccReleaseBlock()","8a95a746":"pie()","8a95addc":"NewPotentialOwner(address,address)","8a95f59f":"setHHRAddress(address)","8a96e27e":"CTTCToken()","8a973e17":"borrowEther(uint256)","8a97d915":"TokenMetadataUpdated(uint256,address,string)","8a983fbc":"KulouCoin()","8a98a9cc":"gen0SaleCount()","8a98cbd0":"SalePaused()","8a98deca":"setEtherCostOfEachToken(uint256)","8a9920b7":"emergentWithdraw()","8a99aa69":"_setStore(address)","8a99e917":"activatedPhases(uint256)","8a99fc87":"checkWhenContributorCanTransferOrWithdraw(address)","8a9b2b36":"_fillCardStruct(uint8,address,string,string,string)","8a9b35a7":"totalPresaleWei()","8a9b4067":"ren()","8a9b809b":"ChargCoinContract()","8a9ba931":"setContract(address,address,address,address,address,address,address)","8a9bb02a":"getRoundInfo(uint256,uint256)","8a9c497b":"totalBunniesCreated()","8a9c636c":"setAquiferInstituteCoinAdd(address)","8a9cb361":"hundredPercent()","8a9cba3c":"set_result_of_game(uint8)","8a9cf23a":"isEarlybird()","8a9d1fbf":"uniquePet(uint64)","8a9d3839":"setBountyWallet(address)","8a9d43e2":"getPlayerFee(uint256)","8a9d6bb1":"GEZI()","8a9d7982":"getActiveBetsRefund(address)","8a9e0876":"tokensReleased()","8a9e8671":"totalBid()","8a9f8a43":"set_block(uint256)","8a9fb135":"humaniqToken()","8a9fc475":"wipe(address,bytes32,uint256,address)","8a9ffb90":"transfer(string,string,bool)","8aa001fc":"getSecond(uint256)","8aa08617":"mintInitialTokens(address,uint256)","8aa0fdad":"mint(string,string)","8aa10435":"getContractVersion()","8aa14a07":"transferToAddress(address,uint256,bool)","8aa19ef7":"setOraclizeQueryGasPrice(uint256)","8aa2c280":"newAuction(uint128,uint256,uint256,uint256)","8aa31cbf":"ICO_PRICE8()","8aa33776":"setMsgPrice(uint256)","8aa35083":"PRE_CROWDSALE_DURATION()","8aa43284":"getNbProjects(string)","8aa4e240":"payoutOCDividend(address,address)","8aa4e315":"setExchangePrice(uint256)","8aa5440e":"setXCPlugin(address)","8aa5b2c3":"changeStartTime(uint256)","8aa6e6de":"approveMint(uint256)","8aa6f1b1":"setUltimateOutcome(bytes32)","8aa7d975":"DOCC()","8aa81eac":"ixentest()","8aa91406":"createIdea(address,address[],string)","8aa94f56":"updateUserCreatedPerformance(uint256)","8aa96f38":"collectAllocations()","8aa978be":"Pricing(address)","8aa986f6":"minimumContributionPhase2()","8aa99826":"IsTradeable()","8aaa559a":"ProtectedApi(address)","8aaaa197":"getCurrentRoundEndTime()","8aab811e":"setLOCdata(string,address,int256,address,uint256,string,uint256)","8aabb56f":"setMigrateIn(bool)","8aabe700":"refundTokensForAddress(address)","8aabff06":"getPVECooldown(uint256)","8aac0fa4":"transferGasFee(uint256)","8aac1708":"_deleteOperation(bytes32)","8aac61e9":"assetArray()","8aadf70a":"generateUniquePets(uint8)","8aae13cb":"getTokensByUSD(uint256)","8aae1f50":"withdrawOperationFees(uint32[])","8aae45be":"lastBonusMultiplier()","8aaf09a1":"getInitialInvestAddres()","8aaf699d":"sendCommunitySupplyToken(address,uint256)","8aafef65":"ITC(uint256,string,string)","8ab058b1":"AllocateToken(address[])","8ab11869":"sign(string,string,string,string)","8ab1a5d4":"sell(uint256,uint256,bool)","8ab1d681":"removeFromWhitelist(address)","8ab21fb6":"delegateVote()","8ab30e9f":"test_validShouldBe3_increaseBlocksBy100()","8ab3580c":"bigbomToken()","8ab3e33f":"removeKey(address,address)","8ab422a1":"addEmployee(uint256,string,string,string,string)","8ab476bf":"setDevelopers(address)","8ab49873":"isSubmitterAccepted(uint256,address)","8ab4ca8a":"lockRound(uint256)","8ab4d1ca":"PapyrusAirdrop(address)","8ab5212b":"teamVault()","8ab5fcc5":"setTypePrice(uint256,uint256)","8ab63380":"setContractAddresses(address,address,address)","8ab7f807":"applySettings(uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","8ab8064f":"continueITO()","8ab8342e":"changeInsurerOperation()","8ab905d4":"existedOnWhitelist(address)","8abab8fb":"saleAccepting()","8abadb6b":"setAccountLevel(address,uint256)","8abb0e1f":"MRDSPrivateSale()","8abcb485":"InvestorBonusGet(address[])","8abdb005":"addCard(string,uint256,int256,string,uint256,uint256,address)","8abdf5aa":"serviceFee()","8abe09f2":"now()","8abe5593":"hashLength()","8abe59ea":"outcomeTokens(uint256)","8abe789b":"mulToResult(int256)","8abf344d":"callStages()","8ac01eaa":"SHARE_CRYSTAL()","8ac0ca36":"buyViaJohan()","8ac0e150":"fatigueBlock()","8ac0eef9":"changeUserKey()","8ac1a8d6":"weiRaiseLimit()","8ac1f290":"changelp20(address)","8ac2571f":"publish(address,bytes32,bytes32)","8ac27f5f":"investors()","8ac2c680":"minInvestment()","8ac341c6":"numModules()","8ac3ea2c":"recordEvaluation(uint32,uint32,uint8,uint8,uint8,uint8,uint8)","8ac44de2":"TBT_MINER()","8ac4e1d8":"TemperatureOracle()","8ac6a869":"isObsolete()","8ac78c80":"Docsign()","8ac81296":"ethTokenRatio()","8ac91be7":"unPause(bytes32)","8ac97efb":"whitelistDayCount()","8ac9fa73":"getTrustState()","8acb99ac":"owned(uint256)","8ace1732":"burnerOwner()","8ace4131":"CryptoTestCoin()","8aceaa4a":"GetTotalGamblerNum()","8acf94df":"setTierData(uint256,uint256,uint256)","8ad141ec":"updatePlayerContinusFund(address,uint256,uint256)","8ad14ee6":"setSuccessful()","8ad17f00":"setJackpotFeeRate(uint256)","8ad1896c":"bonusOptionsPromille()","8ad1d846":"getDebtorsDebts(address)","8ad20640":"allowedSinceReadable()","8ad2739b":"UMCCToken()","8ad2eaea":"has_token_sale_started()","8ad2f289":"checkPermission(address,address,bytes4)","8ad30473":"set_crowdsaleClosed(bool)","8ad46ba0":"b32toHexString(bytes32)","8ad476d7":"foundationReservation()","8ad47c47":"Dragon()","8ad5d779":"increaseOffsaleCountByOne()","8ad68253":"HostingDNS(uint256)","8ad682af":"ROLE_OWNER()","8ad9a976":"getServiceStat(uint64)","8ad9c8c3":"GetUserConAddr(string)","8ada066e":"getCounter()","8ada1957":"TOKEN_WALLET()","8ada80a2":"getWinnersLen()","8adb208d":"withdrawDukeOwnersMoney()","8adba5a9":"cap4(address)","8add359d":"WorkerPoolHub()","8adde811":"test2_addingSecond()","8addf3ca":"performUpdateMemsize()","8ade246a":"makeBet(uint256,address)","8ae0368b":"challengeNumber()","8ae06cf7":"SAFeth()","8ae0a7ec":"uniq(uint32[])","8ae18dfd":"setRemainingLockDate(uint256)","8ae1d8d4":"StatsTotalSupply()","8ae3beb2":"setPending(bool)","8ae4200a":"revokePrivilege(string)","8ae470a9":"set_time(uint256)","8ae475a9":"notorize(string)","8ae5e0ec":"allowManyTokens(address[],address,uint256[],bool[])","8ae5e372":"getMouthValue(uint256)","8ae63d6d":"blockNum()","8ae69807":"sendAirdrop(address[],bool)","8ae69caa":"getCountryOwnershipList()","8ae76b77":"createToken(uint256,address,bool,uint256)","8ae79c8c":"LovelockPayment(address,bytes32,uint256)","8ae83bf3":"DISPLAY_CLASSIQUE()","8ae85b80":"storeN(uint8[],uint256,uint256,uint256)","8ae881a6":"initMetadata(bytes32,bytes32,bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,address)","8ae8c1f3":"transferFromCrowdfund(address,uint256)","8ae986cf":"registrantApprove(address)","8aea12b6":"c_paymentChannelBonusPercent()","8aea2f6e":"totalFundingAmount()","8aeb8f98":"isNotEmpty(string,string)","8aebebd9":"restartCycle()","8aece8b0":"MRNToEth()","8aed434a":"oracle_values(uint256)","8aee0443":"getNumberOfPurchases()","8aee3a54":"enableATMExchange()","8aef16d0":"appendSupplyChanges(address,bool,uint256)","8aef91f5":"TimeLeftBeforeCrowdsale()","8af1bac9":"isMoron(address)","8af1c825":"SALE_MIN_BUY()","8af2c328":"buyTokensFor(address,uint256,uint256)","8af2ce26":"districtLimit()","8af2d152":"limit6()","8af49ab7":"maintain(uint256,uint256)","8af51833":"_transfer(address,string,address,string,uint256)","8af57597":"getSingleDeveloper(address)","8af6c259":"totalDuration()","8af784dc":"expectEventsExact(address)","8af82a2e":"getFirstUnsortedOffer()","8af9f493":"reap(address)","8afa08bd":"setDrawDate(uint256)","8afa46b1":"refunds()","8afa7c6a":"createBasket(string,string,address[],uint256[],address,uint256)","8afbcdd0":"setEmissions(uint256[])","8afbf669":"withdrawRemainingTokens()","8afc3605":"Ownable()","8afcf1c9":"_transferSignership(address)","8afdc26e":"currentIcoPhaseBonus()","8aff794d":"milestoneSystem()","8b00299b":"setSellComissionUnits(uint256)","8b008f0f":"setBuyBackPrice(uint256)","8b00c467":"growthTokensWallet()","8b0133d5":"calcBonus(uint256,uint256)","8b018bca":"maxDividendDepth()","8b021df4":"safePayback(address,uint256)","8b0254b6":"bilateralCancelOrder(bytes32)","8b02c8b2":"addFundTX(uint256,uint256)","8b034136":"totalBids()","8b036ee2":"PRE_SALE_BONUS_PERCENTAGE()","8b038f7f":"edrBalance()","8b03fcfd":"backersRedeemed(address)","8b043e08":"getPublisher(address)","8b044a50":"getCofounditTokenAddress()","8b0451d9":"CAT_PER_ETH_SECOND_EARLY_BIRD_RATE()","8b048091":"getTicketsSoldToday()","8b048645":"setCCH_edit_26(string)","8b05afd2":"saveBytes(bytes32)","8b06a662":"submitTotalSellOrder(bytes32,uint256,uint256)","8b072f0e":"migratePlayer(address,address,uint256,uint256,uint256)","8b073bb3":"changeStageBlock(uint256)","8b077355":"saleDistributorAddress()","8b07b006":"_tokensToSell()","8b07edba":"getI1()","8b08292d":"isValidAirDropForAll()","8b087f3f":"signToCancelAgreement(uint256)","8b092580":"preIcoHasEnded()","8b095904":"getBalancePercentageLimit()","8b0980d9":"Phoenixcurrency()","8b0b8820":"transactionStructFromBytesSeriality(bytes)","8b0b9cac":"setLatestTokenAllocation(address,address,uint256)","8b0b9ed4":"getWinningNumber()","8b0c7f67":"CROWD_WAVE2_PERIOD()","8b0d0258":"amount(uint256)","8b0e093c":"INEXTokenNew()","8b0e9f3f":"totalStake()","8b0ee5a3":"GAS_PRICE()","8b0fc015":"submitChoose(address,uint256)","8b0fc19a":"TokenSaleAfterSplit(uint256,uint256,uint256,address,address,bool,uint256)","8b10297c":"test_0_ensureControllerWorks()","8b104534":"tokensPerBatch()","8b1097c1":"setGeneMixerAddress(address,address)","8b110e0a":"MeshPoint(int256,string,address)","8b11fb3e":"secureTokenPay(uint256)","8b121c9d":"airdropMinting(address[],uint256[],int256)","8b121cf0":"TransactionEscalated(uint256)","8b122274":"setPriceIncrease(uint256)","8b128249":"MASSTokenPreSale(address,uint256,uint256)","8b12befe":"accrueBonusTokens(address,address,uint256)","8b12c25f":"updateReferralMasks(uint256,uint256)","8b12dc23":"DewToken()","8b133c56":"WatahaToken()","8b13b64b":"timeFrame()","8b13d4e0":"addTeamMember(address,bytes32,address)","8b13dd7b":"getAcceptance(address,uint256)","8b14251f":"setNarcosCoreAddress(address,address)","8b144851":"getCompanyWallet()","8b14592a":"EtherNex(uint256,string,string,uint8)","8b147245":"update(bytes32)","8b148ef6":"usedHashGuard(bytes32)","8b156d4c":"EthernautsUpgrade()","8b157515":"tokensInfoOfOwner(address)","8b15a605":"proposalDeposit()","8b169c7a":"coinageContract()","8b17ab2f":"calculateOptions(uint256[9],uint32,uint32,bool)","8b1928a5":"getAllergies()","8b19a476":"oraclize_query(string,string,uint256,uint256)","8b1acf9e":"ZcnoxToken()","8b1ad6c6":"AuctionFinished(address,uint256)","8b1b4036":"newTrade(string,string,uint256,uint256)","8b1b925f":"isValid(address)","8b1c80e2":"MAIN_SALE_BONUS_PERCENTAGE_PHASE2()","8b1c8792":"Blocktix(string,uint256,uint256)","8b1cc4f4":"tokenBurner(uint256)","8b1cf21c":"unlocked(uint256)","8b1cffe0":"newBrehonContract(address,address,uint256,bytes32,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)","8b1d37d4":"testUserCanSignUpAndLogin()","8b1d67f9":"initial_disbursement()","8b1db910":"hasSuicided()","8b1f3206":"addlockAccount(address,uint256,uint256)","8b20468b":"updatePalette(uint8,uint8,uint8,uint256)","8b20d082":"_getPlayerThemeEffect(bytes,uint256)","8b20d9fa":"get_probability(bytes32,uint32,uint32)","8b214d5d":"imOwner()","8b21d307":"createProxyAddress()","8b220a31":"addProcessableAllocation(address,uint256)","8b223943":"stage3BeginTime()","8b22c7b3":"keeppetToken()","8b22e1df":"raiseDay1()","8b23397a":"_getFashionParam(uint256,uint16,uint16,uint16)","8b235f04":"lastSignedBlockHash()","8b24793d":"revealCeiling(uint256,uint256,uint256,bool,bytes32)","8b24c3e0":"getRequiredMajor()","8b257d3d":"isValidSignature(bytes32,uint8,bytes32,bytes32)","8b259bdb":"setupIco(uint256,uint256)","8b278707":"addFeeFeedBack(address,string)","8b278a30":"updateBanThreshold(uint256)","8b27c179":"maxPlay()","8b281018":"sendFunds(uint256)","8b2886ca":"setNorthPoleAddress(address)","8b28ab1e":"calculateFee(address,uint256)","8b28df17":"NCCUyen()","8b2909cf":"tokensFromPreviousTokensale()","8b290a72":"employeeShare()","8b294960":"balanceInTranche()","8b299903":"turn()","8b29e88b":"icoTokenCap()","8b2a6f58":"cancelEpochUpTo(uint256)","8b2a81ed":"HashGardToken()","8b2a9606":"addDigitalArtSellingItem(uint256,uint128)","8b2ad32e":"getSketchesOnOfferWithHolder(address)","8b2ae073":"setCouponMulFactor(uint256)","8b2b423a":"privateSaleAmount()","8b2be40e":"firstCurrentAmount()","8b2c434c":"CryptoGiants()","8b2d2dca":"setAllowMarketplace(bool)","8b2d4ed1":"creatorsPoolAddrs(uint256)","8b2de796":"housePercentOfTotal()","8b2e2b07":"CAKSale()","8b2e31dc":"STARTING_LOBSTER()","8b2e41b2":"getPlayerShipBattleWinsById(uint64)","8b2e6dcf":"publish(bytes32)","8b2e92ce":"rewardAngel()","8b2ef965":"securityDepositRegistry()","8b2f1652":"transcoderStatus(address)","8b2f7af3":"CalculateAllocatedUcash()","8b3049e1":"lotteryByETH5(address)","8b31aaca":"ZOB()","8b31bd50":"appreciationRate()","8b322791":"confirmCrowdsaleEnd()","8b325902":"totalTokenMintedOpen()","8b3272dc":"setUseService(bool)","8b3294e5":"addRecipientUpdate(bytes32,bytes32)","8b32f62a":"TEAM_AMOUNT()","8b33b4b2":"operations()","8b343e8f":"getMemberCredit(address)","8b34839f":"claimTokensEnabled()","8b34a4b3":"nestedSecondAllToAll(uint256)","8b35a244":"partner2()","8b360f4d":"teamSupply24Months()","8b36ed08":"CmmToken()","8b37112b":"doReclaim(address,uint256)","8b37691b":"TxOriginContract()","8b37e656":"getCallScheduledBy(bytes32)","8b384f9f":"getMenu()","8b392dff":"mModerators(address)","8b39bdba":"tokensDaily()","8b3aa967":"getDepositDelta()","8b3ac630":"buyShip(uint256,address)","8b3c4f6f":"Register(bytes4)","8b3ca352":"CFL()","8b3caf37":"Operatable()","8b3cda96":"IotPC(bytes32,bytes20,uint256,address,uint256,uint256)","8b3d10bf":"BMCTToken()","8b3dd749":"getInitializationBlock()","8b3e23d9":"preIcoSupply()","8b3edbdf":"changeManufacturerWallet(address)","8b3f863f":"getUserType(address)","8b40594d":"tokenExchangeRatePreSale()","8b409cec":"addRelease(bytes32,string)","8b42ad37":"test_twoFalseAssertNoMessage()","8b43234b":"endPeriodB()","8b449ffd":"woyaoqianqian(uint256)","8b44af0e":"transferETHS(address[])","8b44c99a":"capture(bytes32)","8b44f194":"TBOT()","8b45ab24":"SoccerBet(string,uint256,address)","8b46e1f1":"getVercodesOfCampaign(bytes32)","8b473c3d":"getKeysByDeviceId(uint8,uint8)","8b477adb":"transferFromByLegacy(address,address,address,uint256)","8b47c10b":"ERC721token()","8b490893":"CBO()","8b49644d":"test_invalidProposalBytecode()","8b4a781c":"getVoters(bytes32)","8b4b891b":"Duarte()","8b4b8a26":"updatePriceTier(uint8,uint256)","8b4bf731":"setEtherPriceUSD(uint256)","8b4c40b0":"donateETH()","8b4c4307":"EstLiquidationCap()","8b4ce7ce":"updateRegionPixelPrice(uint256,uint256)","8b4d199e":"recordTransaction(address,uint256,uint64,uint64,uint64)","8b4d3f20":"Xin(uint256,string,string)","8b4d56de":"createAndJoinCDPDai(uint256)","8b4e79c2":"delegateFromPool(uint96)","8b4e8a6a":"MedED()","8b4ef7d4":"ContractAdded(string,address)","8b4fac8e":"testsignature()","8b4fff3e":"register(address,string,string,string,uint256,string)","8b50cd34":"attackTile(address,uint16,uint256,bool,bool)","8b51365b":"set82Mode(bool,bool)","8b519e09":"mainSaleEnd()","8b51ca42":"roleList(bytes32,bytes32,address)","8b51d13f":"getConfirmationCount(uint256)","8b52463a":"commissionerAuctionCancelled(uint32)","8b533562":"giftsOfOwner(address)","8b534dd3":"goldenTicketMoved(address)","8b53808b":"ForwardToEIF()","8b53cbaa":"addNode(string,uint8)","8b5406af":"angelLockingPeriod()","8b542d74":"test_twoValidEqInt()","8b543b80":"maximumCredit(address)","8b5462da":"getMy()","8b55c1b3":"pushPlayer(address)","8b56aff8":"createPromoMonster(uint256,address)","8b57192b":"Woleum()","8b57ebc6":"claimSegments()","8b57f150":"newUserReward()","8b587b82":"createPuppySiringAuctiona(uint256,uint256,uint256,uint256)","8b58c64c":"getUserCap(address)","8b595440":"setBurnAdminApproval(address,address,address)","8b5a17df":"frozedCount()","8b5a64fb":"registerNameXname(string,bytes32,bool,uint8)","8b5b1c9a":"setPools(uint16,uint16,uint16)","8b5b4228":"listTiers()","8b5b9ccc":"getPlayers()","8b5bc550":"WPAYReward()","8b5c37c3":"L19_Token()","8b5caa66":"backendWithdraw(address,uint256)","8b5dc8a5":"IsAllowed(address)","8b5de2d9":"FunFairSale()","8b5e331c":"HatchEgg()","8b5e6679":"setNewIco(uint256,uint256,uint256,uint256,uint256)","8b5f42ca":"addDataStream(address,string,bytes32)","8b603300":"updateLocation(int256,int256)","8b6084e4":"switchState()","8b615813":"fundLockTransfer(address,uint256)","8b629cbc":"m_ETHPriceUpdateInterval()","8b63c0e8":"returnTokenDepositState(address[2],uint256[7],uint8,bytes32[2])","8b63c86f":"setupRace(uint32,uint32)","8b64574b":"nextFreeze()","8b6497b9":"s41(bytes1)","8b649b94":"roundLength()","8b64b3af":"advisors_address()","8b64d70e":"owner_set_time_limit(uint256)","8b66bf68":"takeMyMoney(bytes32)","8b66d153":"STSTEST()","8b66e3b4":"hasPlayersInRound(uint256)","8b6715cd":"getTotalRankTokens()","8b673e7a":"setConfig()","8b67430e":"voteToCandidateIndex(uint256)","8b676ae8":"scheduleCall(address,bytes4,uint256,uint256,uint8,uint256,uint256)","8b67d56e":"getContributorsWallet()","8b67ef19":"distance(uint8,uint8,uint8,uint8)","8b68cd9d":"rndMax_()","8b692479":"addProduct(uint256,uint256)","8b6932f1":"saleTimeOver()","8b69759d":"removeAuthorizer(address)","8b699fbb":"KiemTra(uint256)","8b6aacc8":"stopSendWebGift()","8b6bd650":"ChangeCoinPresale()","8b6bf3dd":"intervalueToken(uint256,string,string)","8b6c1cfb":"totalHeldSupply()","8b6c69e5":"presaleLimitUnits()","8b6d6e48":"GoldPurityToken()","8b6d6f1d":"checksOn()","8b6df6bf":"DEMOHASHTOKEN(uint256,string,uint8,string)","8b6e10ac":"allBalances(address[],address)","8b6f8646":"CHCTokenERC20()","8b6f894f":"releaseEscrow(address)","8b6fb3ac":"GetOrganNumber()","8b6fc452":"tip(address,uint256)","8b7001d0":"ReceivedBCH(address,uint256,string)","8b7116e4":"reviewActiveMembers(uint256,uint256)","8b72a2ec":"transferPunk(address,uint256)","8b72ddf7":"setMinimalTokens(uint256)","8b7314e3":"BEToken()","8b73a46b":"getNumberOfMembers()","8b73c10e":"buyChibiWithFcf(string,string,uint8,uint256)","8b745ff2":"valueBlocked(address)","8b76e976":"setRef(uint256,address)","8b77071c":"profitEth()","8b79bb43":"MTelCoin()","8b7a01e3":"depositOwnership(address)","8b7afe2e":"contractBalance()","8b7b45d9":"hashSchema(string,string)","8b7bcc86":"numWinners()","8b7bf3eb":"getAdminCount()","8b7c34d4":"setCompte_12(string)","8b7d38a1":"sPerDate()","8b7d6b05":"makerUnlockedKnc(address)","8b7e7a2e":"TBEToken()","8b7f0ddd":"register(address,address,string,string,bytes32[],uint256,string)","8b7f4cb7":"_calcDate0(uint256)","8b7fe5be":"DonationEvent(address,uint256)","8b800e6f":"migrationCounter()","8b805e65":"setUsers(address)","8b80bd19":"Migrated(address,uint256)","8b810c36":"epoch(address)","8b81b1af":"getLastOwner()","8b8211a1":"closeSale1()","8b82f4bc":"PAYCOINLY()","8b83209b":"payee(uint256)","8b832705":"getAmountOfGrantAccessInvestor(address)","8b833318":"getArtworkGroup()","8b8373ca":"AMBASSADOR_SIX()","8b8414c4":"getPoaConsensus()","8b845c1d":"withdrawCommisionToAddressAltCoin(address,uint256)","8b8519a2":"frozenTimeOf(address)","8b859409":"setRelease(bytes32,bytes32,string)","8b863095":"setContractorProposal(uint256,bytes)","8b87c544":"getInventory(address)","8b87e3b6":"bountyMinted()","8b886d04":"setCatchable(uint32,bool)","8b88a687":"getCost(address)","8b88c9cf":"setSpaceCraftAddress(address,address)","8b8c1177":"changeTokenOffer(uint256)","8b8c5ed9":"scheduleUnderwriteOraclizeCall(uint256,bytes32)","8b8d7c04":"writeConditions(uint8,string)","8b8e5fe2":"secondRewardPeriodEndBlock()","8b8ecffa":"teamAndFoundersWallet()","8b8f8504":"NodeManager(address[],address[])","8b906ca5":"enterBidForSketch(uint256)","8b90a378":"STATE_DONATION_ROUND_2()","8b91124d":"getSubscriptionClosedAt(bytes32)","8b91d5f6":"PRICE_CROWDSALE()","8b91e9a2":"getSubscriptionNonce(bytes32)","8b91f4a3":"ProofOfBitConnect()","8b9299dc":"authorizeMany(address[50])","8b93509f":"addTeamtoBoard(uint16,address,uint8)","8b935fb1":"keys(uint256,uint256)","8b93d3fc":"stake(uint256,bytes32,uint256,uint256,uint256)","8b959014":"DPC(uint256,string,string)","8b9596ed":"Eladporat()","8b95ec0c":"testAddBalance()","8b96801e":"soldTokensCount()","8b969c33":"editTokenProperties(string,string,int256)","8b96e41c":"_preMcFly()","8b9724d1":"setExclusiveRate(address,uint256,uint16,uint32)","8b9726c1":"multiAccessCallD(address,uint256,bytes,address)","8b975028":"setCooldown(uint256,uint256,uint256)","8b9801b0":"TheHashSpeed()","8b9847a5":"AmazonBestsellerLabs(uint256,string,uint8,string)","8b986566":"TokenTESTToken()","8b9997fd":"getOwnerHoverText(address)","8b99b742":"arbitrateCancelCampaign()","8b9a167a":"aliceClaimsPayment(bytes32,uint256,address,address,bytes20,bytes)","8b9add74":"minCapReached()","8b9af5c1":"wmul(uint256,uint256)","8b9b1cbd":"withdrawRemainder()","8b9b62b1":"toB32(uint256,bytes,address)","8b9bde27":"setNameHashByWriter(address,bytes32,address,bytes32)","8b9c7a36":"initialStartPrice()","8b9ce6a6":"create(uint256,uint256,address,address,address,uint256,uint256,address,uint256,uint256,bool,bool)","8b9d6899":"lockedAmountOf(address)","8b9e2832":"mintRep(address,uint256)","8b9e4768":"_level()","8b9e5385":"MeterSlock(uint256,uint256,address)","8b9efe2d":"lastCountAddress()","8b9fae3f":"getETHback()","8b9ff6b6":"left91(uint256)","8ba19d4f":"EGGS_TO_HATCH_1CRAB()","8ba1c353":"_scaleExp(uint32,int32)","8ba1ebce":"updateGenVault(address)","8ba209b6":"isAccountVerified(address)","8ba28961":"spawn(uint32,int256,address)","8ba39ea8":"getChecksum()","8ba3ee95":"setConverterRamp(address)","8ba45307":"basePunish()","8ba47bdd":"ticker()","8ba4cc3c":"airdrop(address,uint256)","8ba5306b":"getDefaultRecommAddr()","8ba5758b":"HumanStandardToken(uint256,string,uint8,string,uint256)","8ba5807c":"raceCount()","8ba5882a":"manualOverrideEditionHighestBidAndBidder(uint256,address,uint256)","8ba64328":"getParentOperation(bytes32,uint8,uint8)","8ba677fa":"sendPremiumPack(uint256)","8ba7bdc4":"adminClaimTokenForUser(address)","8ba7e570":"executeCall(address,uint256,uint256,bytes)","8ba7e7f2":"createHash(address,bytes32,bytes32)","8ba88c9c":"internalRemoveManager(address)","8ba8da61":"payback(uint64)","8ba8ffc6":"buyGrapes()","8ba92763":"ABsCoin(address,uint256)","8ba93fcb":"magicStore()","8ba9a7bb":"FACTOR_4()","8ba9d9b0":"EmailSent(address,string,string)","8ba9f354":"testClearBitSuccess()","8baa28f7":"allocate(address,uint256,uint256,string,uint256)","8baa8b1f":"staker(bytes32,address)","8bab6718":"investorsInfo(address)","8bab8791":"testPkgUpdate()","8baba52a":"allStates()","8bace235":"kycAddresses(address)","8bace717":"getPresaleAllocation(address,address)","8baced64":"isInPool(address)","8bad5de9":"checkMinBalance(address)","8bad8d8e":"reserveManyTokens(uint256[],uint256)","8badbb8b":"ETPToken()","8bae2a03":"getStoredFib()","8baecc21":"revive(uint256)","8baeefce":"stopTrade()","8baf612f":"Ownable2()","8baf7a0c":"CryptoPrueba()","8bb04875":"executeRuling(uint256)","8bb0faee":"setRef(string,string)","8bb19439":"isPending(uint256,uint256)","8bb1a5ef":"executeDeal(uint256,string)","8bb204d4":"setCaptainIndexToCount(uint32,uint256)","8bb28de2":"minShare()","8bb307a2":"getMyTokenBalances()","8bb36848":"pollDataMultihash()","8bb55cae":"beforeExecuteForFutureBlockCall(address,uint256)","8bb5d9c3":"setCounter(uint256)","8bb64abe":"releasableBonus(address)","8bb75533":"split(string,string)","8bb7819f":"curMaxBet()","8bb87f5b":"isTank(address)","8bb88db6":"EtherSmart()","8bb8b2db":"getTokenPerEth()","8bb93173":"getNextTimeAtkPlayer(address)","8bb9fe58":"addStruct(uint256,string)","8bba143c":"getNumberOfContributors()","8bbade4e":"usdEth()","8bbb594a":"createActiveEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256)","8bbb5af7":"test1Fails()","8bbb668b":"ItemSelling()","8bbb9fca":"buyPresale(address)","8bbbc7a2":"BitnanRewardToken(address)","8bbd309c":"BLTCoin(address)","8bbda7e3":"setContent(string,bytes)","8bbdcf67":"_createProduct(uint256,uint256,uint256,uint256,uint256)","8bbdfaa6":"approveChange(address,uint256,bool)","8bbe005d":"setGateGas(uint256)","8bbe4719":"donateToPool()","8bbec9e4":"WALLET_T8EX_ADMIN()","8bbf037c":"addService(string,string,int256,uint256,uint256,uint256)","8bbf51b7":"DOW_WED()","8bbf7330":"FlyCareToken()","8bc008e6":"xra()","8bc04eb7":"DECIMALSFACTOR()","8bc05609":"setNotaryAddress(address)","8bc05808":"addLockTokenAllocation(address,uint256)","8bc05833":"setTotalSupply()","8bc0b887":"initializeAfterTransfer()","8bc12fd1":"cancelOrder(address[4],uint256[7],bool,uint8,uint8,bytes32,bytes32)","8bc19bda":"setupRaffle(string)","8bc19c04":"getPlacedNotes()","8bc30096":"numDrops()","8bc4a65f":"unPackDecision(uint256)","8bc5816a":"startStage1()","8bc5aab0":"FundsRecovered()","8bc5b3c5":"getExchangeInfo()","8bc5f845":"sendToken(address[],uint256)","8bc6a72b":"adjustCut(uint256,uint256)","8bc70769":"BTToken(uint256,string,uint8,string)","8bc7fa9c":"getCrop(uint256)","8bc85b03":"bonusEnd()","8bc88d7c":"nameMiner(uint256,string)","8bc97754":"popcnt64(uint64)","8bc9b67f":"endOfGame(address)","8bca15d6":"balancesCanSell(address)","8bcad96a":"AdminstratorAdded(address)","8bcb4250":"_bytesToUint(bytes)","8bcb6f01":"getLoserAddressList()","8bcba0b2":"_transferToContract(address,uint256,bytes)","8bcba45a":"secondPartOfTeamTokensClaimed()","8bcbb60b":"betsArePayed(address,uint256)","8bccae3f":"tokensForCrowdsale()","8bccb1b4":"EosPizzaSlice(uint256)","8bccbf62":"setShares(address,uint256)","8bcd0680":"CrowdsaleiPRONTOLiveICO()","8bcddd5d":"getLogsNum(address,uint256)","8bcdecd7":"getIssuerStatus(address,address)","8bce09fa":"resolutionProposal(string,string,address,uint256)","8bcea54f":"viewComponent(address,uint256)","8bcf0eea":"GCAP()","8bcf649d":"GetRank(uint16)","8bcff416":"asyncSend(address,address,uint256)","8bd031fe":"submitIssue(uint256)","8bd0ba67":"addChild(address,address)","8bd0f12b":"_deleteBool(bytes32)","8bd1b610":"deleteTeller()","8bd25857":"joinManual(address,uint48)","8bd30ba1":"KekToken()","8bd317eb":"reclaim(address,uint256)","8bd379b5":"itDevAddr()","8bd50488":"Policy(string,address,address,string)","8bd50c1f":"privateSaleCloseTime()","8bd53bea":"oraclizeFees()","8bd56066":"WXC()","8bd5d30f":"scoreGroups(bytes32,bytes32,bytes32,bytes32)","8bd61f26":"tokensRemainder()","8bd66bb3":"ModifyMine(uint256,bool,string,uint256,string)","8bd6da16":"distributeXAIN(address[],uint256,uint256)","8bd76535":"currentExchangePrice()","8bd7920d":"BitcoinCashPrivate()","8bd7df6e":"sharePot()","8bd82b20":"getInCar()","8bd8669e":"transferAllTokensToOwner()","8bd87a69":"TimeMachineToken()","8bda1540":"getOldBalance(uint256,address)","8bdac196":"KLSToken(uint256,string,uint8,string)","8bdbbca9":"GameChannel(address,uint256,uint256,address,address,uint256)","8bdbee39":"str_length(string)","8bdc558d":"hash_ack()","8bdc5a5f":"withdraw(address,address,uint8,bytes32,bytes32)","8bde7fc3":"ClickButton()","8bdff161":"getBonus()","8be1049d":"getTypeFromIndex(uint256,uint256)","8be13d71":"countOpenPackage()","8be18df9":"getOutcomeOfFirstPeriodByEntity(uint256)","8be3a897":"_v3()","8be3df0a":"vipPlacementNotDistributed()","8be4339b":"packsPerClaim()","8be4886c":"PUBLIC_RESERVED()","8be52783":"decreaseApprovalPreSigned(bytes,address,uint256,uint256,uint256)","8be7a96a":"registerLockedTokens(address,uint256,uint256)","8be7f4f5":"FOUNDER_FUND_1()","8be7fe95":"CreateDigitalAssetToken(uint256,uint256,string,string,string,string)","8be8f944":"lastBlock_f6()","8be909a3":"mainSaleWeiCap()","8be90b52":"averageGasPrice()","8be94a45":"Gallery_MuYi_No1()","8be97285":"MIN_TOKENS_TO_EXCHANGE()","8be9ca21":"GerritCoin()","8bea6a39":"safeSubtr3DL(uint256,uint256)","8beac22d":"STAEtoken()","8beb1af1":"PresalePool(address,address,address,uint256,uint256)","8beb60b6":"setAdminFee(uint256)","8beb9f12":"moveBlockValue(uint8,uint8,uint8,uint8,uint256)","8bec5b31":"reserveOwnership(address)","8bec683f":"getID_control()","8bee241b":"delegateOperation()","8bee78e6":"buySharesFromListing(uint256)","8bef5222":"CONFIG_MAX_TICKETS()","8bef7ba5":"updateBalances(address)","8bf0af3e":"purchaseTokens(uint256,uint256)","8bf13a30":"UTCStop()","8bf34237":"addPartner(address)","8bf35316":"givePermission(address,address,uint256)","8bf4515c":"read(bytes)","8bf57f4e":"getTimestamp(address)","8bf60537":"setDividendManager(address)","8bf62f14":"EtheropolyShrimpFarmer(address)","8bf68690":"mintToken(uint256,address,uint256,bytes32,uint8)","8bf74527":"EMISSION_FOR_SALESTAGE7()","8bf85ef0":"SigmaIOToken()","8bf87123":"_transfer(address,address,uint40)","8bf8a338":"getAttribute(bytes32,string)","8bfa4b4e":"tokenAdvisor()","8bfac3bb":"updateBalances(address,bytes32,string,uint256)","8bfb07c9":"release(address,address,uint256)","8bfbc753":"setEthBonus(uint256)","8bfc2f33":"delegateDAOTokens(uint256)","8bfe0aec":"getNextExit(address)","8bfe4e0b":"GaillardToken()","8bfe88c5":"ArteufToken(address,address)","8bffc74d":"mainstreetToken()","8bfff5a0":"setPurchaseableMode(uint256,bool,uint256)","8c003134":"Raffle_ID()","8c00ce76":"unhalt_30day()","8c0124fb":"transferAndFreezeMulti(address[],uint256[],uint256[],uint256[])","8c02d13f":"MAX_NUMBER_OF_PREMIUM_SALES()","8c02e029":"save2(address,bytes,string)","8c041d7c":"editProfile(string,bool,string,bool,uint256,bool,bool,bool,string,bool)","8c042317":"startQuater()","8c04b985":"readSellTokenAmount()","8c063686":"getRelayAuthority()","8c06fa18":"PRICE_PREICO()","8c088d98":"winMultiplePer()","8c08ae0d":"withdrawEtherRemaining()","8c09138f":"fourth()","8c0989ab":"MultiServiceFactory(address)","8c09bfdc":"shake(uint256)","8c0a41f2":"gibtesnet()","8c0b1588":"createNFT(uint256,address,bytes32,bytes32,bytes4)","8c0b372d":"e6c65e93()","8c0b4ae5":"setGenesMarketAddress(address,address)","8c0bae5b":"releaseRedTeamTokens()","8c0c0368":"_confirmOneSell()","8c0c9c07":"updateCampaignAbi(string)","8c0cf897":"develop()","8c0d0c29":"mark()","8c0d4199":"lock(address,address,uint256,uint256,bool)","8c0d6593":"CustomDealICO(uint256,uint256,uint256,address,uint256,uint256)","8c0dacf2":"deleteRecord(bytes32)","8c0dee9c":"operatorTransferByPartition(bytes32,address,address,uint256,bytes,bytes)","8c0e156d":"scheduleCall(bytes4,uint256,uint256)","8c0e299a":"proposeCompanyAllocation(address,uint256)","8c0e2a31":"regProxy(address)","8c0e45f6":"test_openRegistryRules()","8c0ead61":"_updateMLBPlayerId(uint256,uint256)","8c0ec0d1":"changeClient(address)","8c0f082c":"setFLKDForGas(uint256)","8c0f8e11":"getWorkerScore(address)","8c0ff5b7":"maxWithdrawal()","8c10671c":"addManyToWhitelist(address[])","8c115322":"isP2PKH(bytes,uint256,uint256)","8c118cf1":"verify(uint256,uint256,uint256,string,string,bytes32[2])","8c12324a":"Mire()","8c1256b8":"Recovered(address,uint256)","8c12c35c":"BTWO_CLAIM_PERCENT()","8c12d8f0":"arithmetics(uint256,uint256)","8c133a77":"previligedBalances(address)","8c133c25":"changeBetPrice(uint256)","8c13aabe":"lockStages(uint256)","8c14db73":"testThrowsSaleWalletIncorrectBlock()","8c155b5b":"tradeForTokens(address[2],address,bytes,bytes)","8c156213":"generateHash(address,string)","8c160095":"deleteInt(bytes32)","8c165146":"initSale1()","8c165932":"sendShip(uint32,uint32,address)","8c167076":"setHoldersList(address)","8c172fa2":"getEvent(bytes32)","8c17c5ab":"setNowTime(uint256)","8c17fc91":"getWeaponsArmy2(uint256)","8c19773f":"addBlock(address)","8c19c175":"getStageState(uint256)","8c19d2ca":"setCombatWonTeam(uint256,uint128)","8c1ab426":"WithdrawalofFunds(uint256)","8c1c7acc":"icoThreshold2()","8c1d01c8":"defaultPayment()","8c1d4a0a":"GreenEcoMinerToken()","8c1d92af":"distributePresaleTokens(address[],uint256[])","8c1d9f30":"isValidCandidate(bytes32)","8c1e04a6":"updateGenerationDict(uint256,uint64)","8c1e21da":"tokenPreSale()","8c1f85e5":"FeeSetup(address,address,uint256)","8c206979":"_freeze(uint256)","8c2081b5":"RewardsCoin()","8c217d06":"zsjz(uint256,string,string)","8c21f6bb":"getLockedGroup(uint8)","8c21ffba":"supplyLockedB()","8c22ac8b":"Account_frozen(address)","8c2305fd":"stakeBela(uint256)","8c25466a":"mintPreSale(address,uint256)","8c254c0b":"walletDev()","8c259654":"getRegistryDataRegistry()","8c25f54e":"linkContracts(address)","8c261e2c":"getHashRightPad()","8c267b97":"cmoAddress()","8c26a340":"generateOrderByAdminWithPayee(address,address,address,uint256,string,string,string)","8c26c937":"STQPreICO3TestHelper(address,address)","8c26ebf7":"EgretiaToken()","8c272dba":"_buyin(address,uint256)","8c273a98":"getRefBonus(address)","8c2779f5":"gold_token_storage()","8c28c16e":"STAGE_TWO_ETHRaised()","8c28fd6e":"mintHelper()","8c2962b9":"setBuyAgent(address)","8c299d0c":"AdoptionOfferCancelled(bytes5)","8c29bce5":"setJoule(address)","8c2a5938":"setAllowedToBuyBack(bool)","8c2b8283":"WeiLaiExToken()","8c2d1549":"getTotalMined()","8c2d396f":"TelegramOpenNetworkContract()","8c2e6b3f":"ChangeSellRate(uint256)","8c2f04d9":"distributeUsingVaults(uint256,uint256,uint256,address)","8c2f6458":"calculatePreviousPrice(uint256)","8c30079a":"generateTeamTokens()","8c30779b":"getAvailableVestingAmount(address)","8c3088c6":"HeritableWallet(address,address,uint256)","8c308a71":"Anemoi(uint256,string,string)","8c3135f2":"poolTokenBalance()","8c31d67e":"getNoOfSoldToken()","8c324604":"MAX_TOKENS_EARLY_INVESTORS()","8c32c568":"Airdrop(address,uint256)","8c32e774":"isMaxTokensReached()","8c33417c":"WankCoin()","8c335b4b":"oceanBonus()","8c339a58":"QSHUCOIN()","8c33a5c4":"RESEARCH_AND_DEVELOPMENT_TOKENS_PERCENT()","8c343aee":"TestIssued()","8c346690":"toggleHalt(bool)","8c34dbec":"bitcoing()","8c363fda":"AbstractToken()","8c366dd3":"newinitialSupply(uint256)","8c3692c3":"popToken(address)","8c36ae89":"clearReward(address)","8c374d8d":"releaseApproval(address)","8c3753d7":"WEI_PER_FINNEY()","8c377ca6":"UnsetUsername(string,address)","8c379133":"Water(string,string)","8c37ce04":"MeetTokenBase()","8c37e152":"bountyTokensReserve()","8c37e31e":"setSpawningManager(address)","8c37edc4":"USN(address,address,bytes32,uint256,uint256,uint128)","8c382e22":"checkIsAssetPartOwner(bytes32,address)","8c3846e8":"ConsumerAddition(address)","8c38eddd":"_clearAddressFromCrowdsale(address)","8c39bf96":"DredgrSwapSolo(bytes5,bytes5,bytes32,bytes32,uint256,bytes32,bytes32,uint256)","8c39cb93":"makeClaim(bytes32,string,uint256,bytes32,uint256,uint256,uint8,uint256)","8c3b6f0e":"getCrystalGeneKindWeight(uint256)","8c3c00aa":"overdraftPeriodAmount()","8c3c4b34":"getSaleStatus()","8c3d5897":"MANHATTANPROXY2NDAVE()","8c3e1ff1":"modexp(bytes,uint256,bytes)","8c3e9e1a":"verifyYourself(string,uint256)","8c3f71b2":"_getCurrentTradableToken()","8c3f914a":"spread(bool)","8c3fae8c":"BeeUnity(uint256,string,string)","8c404cf1":"stablesCities(uint256)","8c41399c":"view30()","8c41d101":"LogAgreementAccepted(address)","8c421815":"RefundedTokens(address,uint256)","8c4406c1":"setInputName(uint256,uint256,uint256)","8c4430b4":"setFinalLotteryAddress(address)","8c44cb27":"creationQuantity()","8c44dfb5":"bids_computed_cursor()","8c45cf24":"addJobContractMessage(uint256,string)","8c461e97":"setValueAirDrop(uint256)","8c46c7cd":"betAmount_()","8c47ddcc":"refundOwner()","8c4899ab":"ownerOfPlanet(uint256,uint256,uint256)","8c497285":"ChangeAddressTrust(address,address,bool)","8c4a6f62":"delMinter(address,address)","8c4af723":"changeNewRoundDelay(uint256)","8c4b0c58":"FrozenProfit(address,bool)","8c4b0e7e":"setOrganiser(address)","8c4b7300":"ViewBet()","8c4b87d2":"chris()","8c4c26a3":"BunToken(address)","8c4c564d":"deletePoll(bytes32)","8c4d3193":"getOrderDealTimeInterval()","8c4d59d0":"ticketCounter()","8c4dd5cd":"Democracy()","8c4e3f32":"_setApprovalForAll(address,address,bool)","8c4e8c21":"nextMintTime()","8c4e9c50":"prepareSell(address,uint256)","8c4ef31a":"getremainTokensperType(uint8)","8c4f7dae":"getMatchCount()","8c500418":"getICODate()","8c50d756":"bidSuccess(uint256,address,uint256)","8c518026":"_preSale(address,uint256)","8c529628":"getVoteFromProposal(uint256,uint256)","8c52dc41":"enableRefunds()","8c5344fa":"countThisRecursive(uint256)","8c534d54":"getTokenTxnNum()","8c53f61d":"receiveETH(address)","8c546f81":"GNT()","8c549ef7":"COLOR_BROWN()","8c55041c":"Announcement(address[],uint256,uint256)","8c551742":"createItem(string,uint256)","8c55284a":"confirm(uint256,bool)","8c5597fd":"finalizeContributionEvent()","8c561592":"canUpdateInvoicingAddress(string,address)","8c564ebf":"freezeBypassing(address)","8c5871bf":"getLocksUnlockDate(address,uint256)","8c590917":"contribute(uint256,uint256)","8c590b5d":"getAllMatingAnimals()","8c59f7ca":"cancelOrder(address[5],uint256[6],bool,uint8,uint8,bytes32,bytes32)","8c59fba0":"DATP()","8c5a03bb":"SimpleDistributor()","8c5aae96":"LocalsMembership()","8c5ae183":"RemoveMod(address,address,bool)","8c5b830e":"getInviteeInfo(uint256)","8c5cc61c":"approvedreg(string,string,string,string)","8c5ce82a":"powerTest(uint256,uint256,uint32,uint32)","8c5d5e87":"ownerSetMod(bool)","8c5e06b1":"Channel(address,address)","8c5e2b0e":"MainSaleStart()","8c5f6d5a":"SetDebugExtra(uint32,uint8)","8c5f997e":"NewEntry(address,uint256,uint256,uint256)","8c5fb7fb":"modifyMember(string,string,string,string)","8c60e806":"closeContributions()","8c614502":"addCountry(address,uint256)","8c618066":"addressOfName(string)","8c6310ac":"NextOpen()","8c638152":"setApoderado(bytes32,bytes32,bytes32)","8c64400d":"updateTierDuration(uint256,uint256)","8c648117":"actualPrice()","8c6486c4":"sendRegistration()","8c64eb4f":"switchCrowdState()","8c655550":"advisorsAllocatedAmount()","8c6589b2":"getLastSTCPrice()","8c65f15d":"clearBonuses()","8c662ffa":"LogCollect(address,uint256,uint256)","8c663229":"lastSellPrice()","8c663ffc":"getBounsWithRoundID(uint256)","8c66c9fc":"findBest()","8c66d04f":"setFeeCalculator(address)","8c66f294":"distributeFeeRewards(address[],uint256)","8c676aaa":"CUZ()","8c67f63a":"calculatePayment(uint256)","8c682bde":"setWinnerAndWithdrawAllFunds(address)","8c6838ba":"getPost()","8c68bc3e":"SetContractorManager(address)","8c69554d":"OwnerRefunded(address,address,address,uint256)","8c69930d":"getNewFallbackDepositEffectuation()","8c69c559":"Crypbest()","8c6aefcf":"chip(uint256)","8c6b6085":"supportNewVoter(address,address)","8c6ba233":"isLateBy(address)","8c6c8323":"buyTokens(address,address,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)","8c6f2ec1":"setCompte_17(string)","8c6fc437":"standardICO(string,string,uint8,address,uint256[],uint256[],address[2],address[])","8c701ba8":"releaseRoots()","8c717138":"lastBlock_a1Hash_uint256()","8c71bed2":"unlockTeamTime()","8c71eaf1":"TokenBEN(uint256,string,uint8,string)","8c71ec16":"create(address,uint256,uint256,uint256)","8c7229cb":"pantura()","8c727fa3":"oldCirculatingSupply()","8c72c54e":"publisher()","8c72d4a4":"getStageTokenAmount(uint256,uint8)","8c733fdf":"weiToUsd(uint256)","8c73596c":"init(address,uint8,uint256,uint256,uint256,uint32,uint256)","8c748334":"cancelBuyOrder(uint256,uint256)","8c74c5c0":"bonusOff()","8c74d62c":"LockedInToken()","8c7565dc":"ADChainGrants(bytes32,bytes8,bytes32,bytes)","8c756b1d":"balanceByAd(address)","8c7698df":"lowerCase(bytes32)","8c76b4b7":"addTrustedContracts(address[])","8c771a8e":"newEscrow(address,uint256)","8c787768":"abbcwalletcoin()","8c789fb2":"setTokenBudget(address,uint256)","8c794114":"prizeWithdrawal()","8c79a24d":"refName(uint256)","8c79ca5d":"AddMember(address,uint256)","8c7a63ae":"getTokenInfo(uint256)","8c7a8140":"extractVestedOptionsComponents(uint256,uint256,uint256)","8c7c35b9":"internal_tester()","8c7c4016":"GameLogicContract()","8c7c9e0c":"eth()","8c7d1e8a":"MyKillerContract()","8c7d3241":"total_iou_available()","8c7d58aa":"isTimeExpired()","8c7dd9ec":"_canReveal(address,address)","8c7e1227":"setupStakingPriceFeed()","8c7e5008":"maxDonationInWei()","8c7e763b":"HSCC()","8c7f7806":"AfeliCoinPresale(address)","8c7fcd46":"BLVToken(uint256,string,string)","8c80fd90":"setMinStake(uint256)","8c812c51":"PhoenixExchangeFund()","8c817b6e":"registered(uint256,address)","8c82790b":"getReg3()","8c82dccb":"updateStatuses(bytes32[])","8c832ef4":"GalaxyCoin(uint256,string,string)","8c849f3f":"getMemes()","8c864dfe":"_updateChecksum()","8c86ec20":"NMC(uint256,string,string)","8c877527":"allowTransfert()","8c87b2fc":"Identity(bytes32,bytes32)","8c882958":"LEToken()","8c88512f":"initializeCrowdsale(address)","8c88752a":"ContributorList(uint256)","8c8885c8":"setDecimals(uint256)","8c88b85f":"_finalizeRound()","8c88d716":"transferIfRequirementsMet(address,address,uint256,bool)","8c89b1c7":"setINCENTIVE_POOL_ADDR(address)","8c8a03ac":"setBucketManager(address)","8c8a261a":"devMiningRewardChanges(uint256)","8c8a40bd":"hashNotFound(address)","8c8b31ab":"dhanaToken()","8c8b6fc5":"challengeSubmitted(bytes32,bytes32)","8c8b802e":"getLimitPeriod()","8c8b9d54":"setEmployeeStorage(address)","8c8bc5ce":"ChangeICOStart(uint256)","8c8d067f":"chosenProposal()","8c8d2ede":"team1()","8c8d36c2":"THANKSTEST3()","8c8d98a0":"toTimestamp(uint16,uint8,uint8)","8c8df7cd":"GOTokenCrowdsale()","8c8e2478":"convertTokens()","8c8e5f1f":"BlockTubePrepaid()","8c8e8fee":"token_address()","8c8ee490":"checkReleaseAt(address)","8c8f94f5":"DeletePrice(uint256)","8c8f95fb":"lockFunds(uint256)","8c8f9c0e":"issueTokenToAddress(address,uint256,uint256)","8c8fc30b":"addAd(uint32,uint32,string,string,string,uint256)","8c907c0d":"LanderToken(uint256,string,uint8,string)","8c90b2ea":"pay055(address)","8c9151ae":"voteProposal(uint256,bytes32)","8c91bd3e":"addMoves(uint256,uint256[2])","8c91daac":"startRoundSeed()","8c920a38":"testSanityCheck()","8c924e9c":"incrementRead()","8c93256e":"transferReward(address)","8c934d71":"forceRefundCfd(uint128)","8c937da3":"WALLET_LB_TEAM()","8c9425e4":"privateLockAddress()","8c943b6c":"setDistrictCode(bytes32)","8c944339":"setActiveSkin(uint256)","8c944bb2":"_createPrimordialLot(address,uint256,uint256,uint256)","8c945d38":"takeOffItem(uint256,uint8,address)","8c94db38":"MMCoin(uint256,string,string)","8c9512bc":"companyTokens()","8c9515ea":"doPayouts(uint256[49],address[49],uint256)","8c9540d3":"isCommittee(address)","8c95acee":"getTreshold(uint256)","8c96a2c9":"getAssetPackPrice(uint256)","8c96a538":"COO_SHARE()","8c96e34b":"betIsSettled()","8c98117c":"getBill(uint256,uint256)","8c988a46":"isLinkedWallet(address)","8c9924d5":"AddrMarketing()","8c9a4f13":"FundsTransferred(address,uint256)","8c9ae56f":"QueryPlayerBonus(address,uint256)","8c9b2cd1":"ModultradeProposal(address,address,address)","8c9c2977":"newMember(uint8,bytes32,address)","8c9ce20c":"_addressNotNull(address,address)","8c9cf205":"SignVersion(string,string)","8c9d8300":"withdrawForAdmin(address,uint256)","8c9dd650":"Etherlott()","8c9e81e5":"triggerICOState(bool)","8c9ecd00":"toDec()","8c9f7074":"setInterestFeePercent(uint256)","8c9f7b39":"endSale(address)","8c9f8935":"ClaimSet(address,address,bytes32,bytes32,uint256)","8c9fcfe2":"payForUpgrade(address,uint256)","8ca0dd20":"tgeCap()","8ca10f9b":"sendRemainingTokens(address)","8ca17755":"etheraffle()","8ca17995":"divest(uint256)","8ca3b448":"addUser(address,address)","8ca3c553":"setData(string,string)","8ca47688":"WhiteListUpdated(address,bool,address)","8ca4eef6":"getBuild(bytes32)","8ca517dd":"getActiveBuyDetails(bytes32)","8ca51f82":"setMinimumClaimValue(uint256)","8ca5d525":"removeAllowedHICAddress(address)","8ca5da35":"mintManual(address,uint256)","8ca6c287":"InsurContract()","8ca6f747":"potatoBalanceOf(address)","8ca74163":"BZCToken(address,uint256)","8ca79351":"ethPriceIn()","8ca84d40":"preparationPeriodTrainingFeeMultiplier()","8ca9ac01":"LogBeerClaimed(address,uint256)","8ca9e721":"finalizeCrowdSale()","8caa0083":"teamCount()","8caa5c91":"DataBase()","8caaaae6":"totalWeiPrice()","8caaab4d":"verifyProofOfStakeInternal(uint256,bytes32,bytes32,uint256,bytes32[],uint256[],uint256,uint256)","8caad7b5":"changeMinDepositAmount(uint256)","8caba7b7":"startCharging()","8cac1939":"TOKEN_TEAM()","8cac3b42":"addDividend()","8cac5f55":"feeForTheStakingInterval()","8cad5826":"FundTransfer(uint256,bytes32,address,address)","8cadaa5d":"TokenFreeze()","8cadd6a2":"getVestedBalance(uint256,uint256,uint256,uint256)","8cae013e":"signatureFunc(bytes)","8cae1374":"editBlock(uint8,uint8,uint256,int8[5])","8cae59dd":"heapSort(uint32[])","8cae711f":"mintLiquidToken(address,uint256)","8cb09d4d":"GCTToken()","8cb0a511":"approve(uint256,address,uint256)","8cb18ef6":"needFightToAdult()","8cb1b614":"setWhitelisted(address,address,uint256)","8cb1e9c1":"unlockedAt()","8cb240b0":"saasPayment(address,uint256)","8cb36aef":"requestCoinToUSD(string,bool,uint256,uint256)","8cb3728c":"getAllRevisionTimestamps(bytes32)","8cb39385":"getMinBid()","8cb3c89f":"loadEthBalances()","8cb47a2f":"CrowdForceSampleToken()","8cb5497c":"setOperator(bytes32,bool)","8cb56999":"GetExpireTime(uint256,uint256)","8cb5a0c0":"removeCoordinator(address)","8cb858cb":"PRCVToken(uint256,string,uint8,string)","8cb996df":"LogMigrationEnabled(address)","8cbb02ad":"Marijuana()","8cbb13e7":"TokenRHT()","8cbb6593":"SHNZ2()","8cbba6cf":"isPreWhiteListed(bytes32)","8cbbe25f":"NIMFA_PER_ETH_PRE_SALE()","8cbc8c0b":"lockholderNumber()","8cbcbca2":"_payChicken(address,uint256)","8cbdf1d1":"mintARC(address,uint256)","8cbe775a":"Bitdepositary()","8cbe898d":"CommitteeLimits(uint256,uint256)","8cbeb340":"ControlContract(address)","8cbf4145":"confirmPrintProxy(bytes32)","8cbfa1ec":"quoteAsk()","8cc02403":"cobrarImpuesto(uint256)","8cc04ebb":"_appendUintToString(string,uint256)","8cc17117":"forceRecoverCollateralInternal(address)","8cc2f547":"DiceGameCrowdsale(address)","8cc30c6f":"buyStageDataRecord(uint256,uint256,uint256,uint256)","8cc34ed7":"zilla_remaining()","8cc40d71":"dividend_amount()","8cc4ab11":"getPurchaseTimestampEnds()","8cc50ecd":"addBlock(string,uint256,string)","8cc519bf":"companyTimelock()","8cc51eda":"kitties(uint256)","8cc5510f":"setTeamAddress(address,bool)","8cc55473":"bulkTokenMint(address[],uint256[])","8cc57368":"getUserTokens(address,uint32)","8cc5cde2":"isLunyrToken()","8cc5e56e":"revokeLockByIndex(address,uint256)","8cc60a61":"isStoreActive(uint256)","8cc60eca":"SS()","8cc63bfb":"marketingFunds()","8cc6acce":"updateConfig(bytes)","8cc78a40":"option20symbol()","8cc7ea0e":"Xian()","8cc89e1b":"TCCoin()","8cc8baaf":"getBuyPriceTimes()","8cc8c236":"_transfer(address,uint256,bytes)","8cc9638c":"fundBurn(address,uint256)","8cc98bc3":"approveEliminate(address,uint256)","8cc99aa3":"getAmountForCurrentStage(uint256)","8cca5a3f":"withdrawWallet(address)","8cca8f64":"canClaimRefund(address)","8ccb381b":"tenthTotal()","8ccb4daf":"getPositionMaxDuration(bytes32)","8ccb59e8":"revealWinner(uint256)","8ccb9f2d":"del_admin(address)","8ccbd6da":"freezeToken()","8ccc04ea":"proofOfConceptCap()","8ccc4781":"Math(int256)","8cccc341":"initiateChallenge(address)","8cccf2df":"viewServiceReward()","8ccd227c":"gameRequestTokens(address,uint256)","8ccdcf80":"tokenSalePausedTime()","8cce10c8":"rank(address,address,uint256)","8cce49c9":"mokenData(uint256)","8cce7e92":"removeMarketFromWasCalled()","8cceb1e8":"notifyBurn(address[])","8cd0a573":"transferWithCustomReserving(address,uint256,uint256)","8cd0fc3d":"TRONClassic(uint256,string,string)","8cd221c9":"roundId()","8cd25904":"calculateAndCreateTokens(uint256)","8cd3751b":"newProposal(address,uint256,uint256,bool,bool,address,uint256,uint256,uint256,uint256)","8cd3f064":"acceptToken(address)","8cd41fae":"StartCompetition(uint8,uint8,uint8,uint8,uint80,uint32)","8cd41fd8":"referrerBonus2()","8cd42991":"getTimeRemaining(uint256)","8cd47415":"zkWithdrawTrusted(bytes32,uint256,address,uint256[2],uint256[],uint256[],uint256[],uint256)","8cd4d21a":"x(uint256,address)","8cd4fdf1":"maxGamble()","8cd53767":"withdraw(bytes32,address,address,uint256,uint256,bytes32,bytes,bytes,bytes32)","8cd5dce3":"setNextRoundRequiredBetAmount(uint256)","8cd6c7fa":"seedSingleSaleCount()","8cd70e72":"isInitalized()","8cd85846":"totalTranches()","8cd85dc2":"getWinNumbers(uint256)","8cd8bd05":"IanCoin()","8cd8db8a":"init(uint256,uint256,uint256)","8cd90e31":"EAToken(uint256,string,uint8,string)","8cda2a15":"SafePromo(string,string)","8cda4430":"lookupRoyalty(address)","8cdb1719":"approveCertification(uint256)","8cdbd8fb":"remainToken()","8cdc86a6":"sort()","8cdcbdef":"closeBlock()","8cdcdae1":"testControlUpdateLatestRevisionNotOwner()","8cde43dc":"getCrowdsaleMaxRaise(address,bytes32)","8cde4667":"BANKNET()","8cdf31fa":"Cryptoya()","8cdfb1e6":"transferIfHF(address)","8ce0080f":"updateGuMasks(uint256,uint256)","8ce05b54":"bornFamedStar(address,uint256)","8ce060fb":"FounderSwitchRequestEvent(address)","8ce0bae8":"Canceled(address,uint256,address,address,uint256,address,uint256,uint256)","8ce0bd46":"Deposit(address)","8ce113dc":"right60(uint256)","8ce187fd":"raisedUSD(uint256)","8ce25a93":"numAccounts()","8ce2ae2d":"creator_new()","8ce2e0ea":"addLastTwoAmbassadors(address,address)","8ce2f386":"AcceptsOmniDex(address)","8ce3ee62":"transferEmpire(address)","8ce450de":"assetThaw()","8ce4f1b2":"setGasRewardPercent(uint256)","8ce53e5b":"getMaximumInvestmentPerDay()","8ce5877c":"removeSpender(address)","8ce69b72":"USD_IN_ETH()","8ce74426":"protocol()","8ce795f5":"SerbiavsBrazil()","8ce7be01":"getUniqueSpinnerPrice()","8cea577a":"allowFunction(bytes32,bytes4)","8ceaa23f":"setAvailablePositions(uint256)","8cead4bf":"currentProfit()","8cec9176":"SimpleMultisigWallet(address[],uint256)","8cecd03e":"INVESTOR_TOKENS()","8cece594":"countClaimBackers()","8cecf66e":"_inverse(uint256)","8ceda04d":"getCounting(bytes32)","8cee8778":"crear(uint256)","8ceeaaa8":"getTodayOwnerAddress()","8ceedb47":"cage(uint256,uint256)","8cef1ed9":"xpectoTTF1Token()","8cef2b93":"CECNaypyidaw(address,uint256)","8cefad63":"setAirEndtime(uint256)","8cefaf1a":"setSalesEndTime(uint256)","8cf0c191":"rum()","8cf19975":"createLottery(string,uint256,uint256,uint256,uint256,uint256,uint256)","8cf1c5c4":"LogFeeEvacuation(uint256)","8cf20038":"engDevAddress()","8cf228cd":"DNNTDE()","8cf3313f":"calculateWeightedMultiplier(uint256,uint256,uint256,uint256)","8cf3562b":"DEC15Recursive()","8cf37ece":"InformRebuy(uint256)","8cf39a9c":"TicTacToe(address,address,uint256)","8cf3a181":"addRRA(address)","8cf3e683":"isAddressExcept(address,address)","8cf49cad":"ReleaseDate()","8cf4dbfb":"collectBalance()","8cf57cb9":"rewardAddress()","8cf5dbc6":"recruitHero()","8cf7b7a4":"slashAddressLikeUsername(string,uint256)","8cf7d906":"playAndFinishJackpot(uint256,uint256,uint256,uint256)","8cf80438":"winningBid()","8cf8151f":"appWasMade(bytes32)","8cf907fb":"EndRefund()","8cf92ade":"distributeBountyTokens(address[],uint256[])","8cf9f5e7":"getPreSelledInPool()","8cfa8eea":"getWeiToUsdExchangeRate()","8cfaabcc":"managementTransfer(address,uint256)","8cfae7e4":"TransferUnsoldTokensBackToTokenContract(address)","8cfb3088":"defaultExpiry()","8cfb7c02":"updatePopularity(bytes32,uint256)","8cfd6d4c":"CCH_LLV_FIFA_2()","8cfd8901":"_incBlock()","8cfdacb0":"STARTING_PACIFIST()","8cfe6a09":"tokensToEthereum_2(uint256)","8cff1990":"isSignedByAndrey()","8cffa21c":"getOwnedItems()","8d000903":"createTokenToMarket2018()","8d008989":"Multisig(address,address,address,address)","8d00abb6":"setAElfCommunityMultisig(address)","8d012295":"presaleVesting(address,uint256,uint256,uint256,uint256,uint256)","8d0128cb":"transferMintKey(address,int256)","8d01308c":"PRESALE_START_WEEK3()","8d03b102":"testing()","8d044c06":"unpauseRedemption()","8d049190":"mapWidth()","8d0515dc":"HenryMiniToken(uint256,string,uint8,string)","8d0522c5":"set_contrib_arbits_max(uint256)","8d0528ec":"Withdraw_referral()","8d05ad4e":"NLL()","8d062046":"testTokensAreTransferrableAfterSale()","8d068043":"requiredSignatures()","8d0716c4":"approveScoupons(address,uint256)","8d07ae9f":"getBidDetails(address)","8d086da4":"withdrawShares()","8d089930":"limitEndDate()","8d08eefa":"setCORAddress(address)","8d09b9cc":"TeCToken()","8d09c674":"Donated(address,uint256,uint256,uint256)","8d0a3b6d":"bonusByAmount()","8d0a5fbb":"getOrderCount()","8d0a73e3":"tokenDistributionStartTime()","8d0aadca":"playerDelayOnExit(address)","8d0ae472":"AsheToken()","8d0b3d9b":"_add(uint32,address)","8d0b4be5":"setXPContractAddress(address)","8d0bba03":"MINIMUM_CONTRIBUTION()","8d0caef5":"bonusStage1()","8d0cf786":"MatchAdded(uint256,uint8,uint16)","8d0d018c":"havedDistDevCoin()","8d0d27ba":"queryPlayerType(uint32[11])","8d0d3ccf":"getBonusTier()","8d0d877f":"LZZ()","8d0dd3c0":"setBUU(bytes32,uint256,uint256)","8d0e5136":"isPlayerInQueue(address)","8d0eda03":"isInvestorLocked()","8d0f403a":"adminAddAction(bytes32)","8d0f8cef":"drop(address,uint256)","8d0fc05a":"votesYes()","8d10215e":"grantAccess(uint256,uint256,string)","8d106690":"setPropertyFlag(uint16,uint8)","8d111ac6":"checkTokSold()","8d119d41":"AngelCoinV1()","8d121247":"changeProductionFeeRecipient(address)","8d12aba7":"IMCOToken()","8d134175":"CellTokens()","8d1343e0":"issueDate()","8d13d972":"getUsdFee(bytes32,uint256)","8d13ea34":"changeUserProjectExp(bytes32)","8d14670a":"multiUnlock(address[])","8d149b3c":"compareInts(int256,int256)","8d152d78":"pushBytesArray(bytes32,bytes32)","8d1540c1":"CoinBuy(uint256,address)","8d159787":"buyDragon(uint256)","8d15a218":"LogRedeem(address,uint256)","8d15b307":"privateEventActive()","8d16fd83":"sellDai(uint256,uint256,uint256)","8d17664d":"getSecret(uint256)","8d182f01":"removeSale(bytes32)","8d1a4b28":"getGame(address)","8d1a7765":"getPlayerGeneral(uint64)","8d1bc93d":"buyWuxiaMaster()","8d1c3b8b":"sHasDownvoted(uint256,uint256,address)","8d1c8048":"transport(uint256)","8d1ca4ec":"addGuess(int256)","8d1d1572":"transferFeeAddress()","8d1d22d8":"renameMonster(uint64,string)","8d1d2c21":"categoricalEvents(bytes32)","8d1d8639":"getcanuserun(address)","8d1dff6b":"mintTokens(uint256,address,bool)","8d1e6b56":"issueCompanyTokens()","8d1eaf78":"registrarInfo()","8d1fdf2f":"freeze(address)","8d20194d":"getWhiteUsersFrom(uint256,uint256)","8d215adc":"Bettings(uint256,uint256)","8d216186":"roll(uint256,bytes32)","8d22651e":"MAX_NUM_OF_CHOICES()","8d227fc0":"getPeriodInfo()","8d22b345":"getAppTokenCode(uint32)","8d24abbc":"closeAndTransferTokenOwnership()","8d24d147":"rvDeposit()","8d24f5bc":"tokensByBtcTx(string)","8d256b0a":"ExchangeRate(uint256)","8d258104":"setManager()","8d25827a":"countOpenPackageOfOneAgency(address)","8d259d65":"_sellCallToOpen(uint256,uint256,uint256,uint256,address)","8d25af04":"restartGame()","8d26d88f":"feeWithdrawTokenAmount(uint256)","8d26eb2b":"edgePigmentG()","8d272b0a":"TaeCoin()","8d2810fe":"GenesisBuyPrice(address)","8d288e93":"toRefund()","8d28da21":"ECT(uint256,string,uint8,string)","8d298851":"initialIssue()","8d29a239":"finalizeHoldingAndTeamTokens(uint256)","8d2a0910":"getTotalDividendsPaid()","8d2af65d":"claimTokenReserveFinan()","8d2c8ce8":"RrcToken()","8d2c929a":"bridgeNodes(address)","8d2d2563":"saleFirstEarlyBirdEndBlock()","8d2d3f41":"getKeyRevisionNumber(uint32)","8d2dcb2d":"TokenPool(address,address)","8d2ea8dc":"withdrawAvailableToken(address,address,uint256)","8d2f349f":"TransCompleteds()","8d2f7272":"CariToken()","8d300458":"updateInvested(address,uint256)","8d30241b":"HasGoods(uint32)","8d30d418":"ContractRemoved(address)","8d30e65d":"claimReservedTokens(address,uint256)","8d3121b3":"releasedTokenTotal()","8d317de2":"OctusToken()","8d323fdc":"LogAddressTokenCapChange(uint256,string)","8d331996":"setTimeWindow(uint256)","8d334529":"restrictions(address)","8d348b7c":"mintToClient(address,uint256)","8d357fa3":"getKeys(uint256)","8d35b9ce":"ARXpresale()","8d361e43":"removeSigners(address[])","8d361f6e":"bonusTokensDistributed()","8d375da2":"testMakeItFail()","8d37f52c":"addAgingTime(uint256)","8d38b237":"calculateCountOfInvestmetnsInQueue(uint256,uint256)","8d38f5a0":"Burn(address,uint256,bytes)","8d3945e4":"setCounter()","8d3965be":"buyerApprove(uint256,bytes)","8d3972d5":"FABIToken()","8d399ce3":"submit(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])","8d3a5ded":"initPlatinum()","8d3af7eb":"withdrawLemontokens()","8d3b6d08":"registerSsp(address,uint8,uint16)","8d3bd1f8":"teamTokensGenerated()","8d3c7415":"JuzixTokenManager()","8d3d523b":"bet2Of(uint256)","8d3d6576":"maxContribution()","8d3d70df":"takeBet(uint256,address,uint256,uint256)","8d3d8587":"GanaPreSale(address,address,address)","8d3def46":"oryza()","8d3ef87d":"getuserlistlength(address)","8d3f0ed5":"allocateTokens(address,uint256,uint256)","8d3fd859":"sellFucks()","8d442ae0":"toUint8(bytes,bytes,uint256)","8d447e39":"getLatestWhitepaper(address)","8d44c90b":"BurnMyTokensAndSetAmountForNewBlockchain()","8d44f13b":"claimFromPool()","8d4572be":"rens()","8d45e221":"Partial23Transfer()","8d467f22":"getKeysFromEth(uint256,uint256)","8d472709":"contribute(address,address,uint256)","8d475461":"m_teamId()","8d4777c8":"claimGooDepositDividends(address,uint256,uint256)","8d47c7d7":"getTokenListed()","8d498158":"DaleoneToken()","8d49cd7f":"getTeam(uint32)","8d49da75":"stopCollection()","8d4a2d39":"addSeconds(uint256,uint256)","8d4d801c":"addRecipient(bytes32,string,string,address)","8d4d8e19":"unregisterAsDelegate()","8d4e4083":"isFinalized()","8d4e57e6":"ROLE_TOKEN_CREATOR()","8d4ea1ba":"addEtherForOraclize()","8d505019":"addNote(bytes32,string)","8d50b6d0":"doSelectDisputedStateRoot(uint256,bytes32,uint256)","8d51faec":"setOwnerTestValue(uint256)","8d521149":"bonus_received()","8d52a1fc":"setStrikePrice(uint256,uint256)","8d539b35":"resetPendingContribution(address)","8d53b208":"revokeAccess(bytes32,address)","8d551860":"horseNotForSale(uint256)","8d553538":"addSecondaryRecord(string,bool,string,bool,string,string,string)","8d5555f2":"priceFor(uint256)","8d55719e":"_withdrawEther(address)","8d55b6ac":"thirdRate()","8d56ac74":"REALEX()","8d56bc62":"Bankroi()","8d574383":"setDemurrageFrequency(uint256)","8d578bee":"totalSaleCap()","8d5802e2":"getAssetOwner(uint256)","8d59cc02":"register(address,string,string)","8d59d1f1":"donate(uint256,string)","8d5a225e":"assignReserveSupply(address)","8d5c4456":"pIndex()","8d5c84cd":"isStart(bytes32)","8d5cc102":"traded_token()","8d5ceeca":"checkShares(address)","8d5d1e97":"priceStar3()","8d5d88c9":"LTYG()","8d5dee05":"EGGS_TO_HATCH_1TURTLE()","8d5e4f9c":"BroFistCoin()","8d5f3f96":"nextInvestorsProfitSum()","8d5f8d1c":"forwardFundToCompanyWallet(uint256)","8d5fa05c":"setAreas(address,uint256)","8d6014a8":"FixedCeiling(uint256,uint256)","8d60be98":"ICO_TOKENS_PERCENT()","8d60e30b":"reward(address,uint256,bool,string)","8d60ed85":"setDevCutPercentage(uint256)","8d614474":"AdvancedEthVocToken(uint256,string,string)","8d622749":"award(address,address,string)","8d627e91":"isTryedFinishCrowdsale()","8d62b845":"isMakersSignatureValid(address,bytes,string,address)","8d63c77b":"WizardReplacedEvent(address,address)","8d63cfa7":"getPixelOwner(uint16,uint16)","8d647185":"setBaselineRate(uint256)","8d647d3a":"allowPrivateParticipant(address,uint256)","8d64bcf1":"maxWhitelistPurchaseWei()","8d65095e":"PI_EDIT_3()","8d656b83":"minWeiInvestment()","8d664d6a":"setFeeRates(uint8,uint8,uint8)","8d670a2e":"unlockPlayerFunds(address)","8d6731b0":"LudumToken()","8d688b6e":"EthPyramid()","8d68cf59":"sendFunds()","8d69121d":"addDocument(bytes32,string,string)","8d69ca74":"wdEthereum(uint256,address[])","8d69e95e":"serviceProvider()","8d6a2ed5":"minimumBuyAmount()","8d6a6d4b":"_allocatePromoTokens(address,uint256)","8d6a6fbd":"proxyTransfer(address,address,uint256,bytes,string)","8d6b5d3e":"getScouponAllocationFactor()","8d6c58ab":"isTransferToICAPAllowed(address,bytes32,uint256)","8d6cc56d":"updatePrice(uint256)","8d6cd879":"FOUNDATION_STAKE()","8d6cd8de":"buffPtr()","8d6e56e1":"manyInputsNoReturn(uint256,uint256,uint256,uint256)","8d6f24d4":"hash_msg()","8d702122":"ownerKill()","8d70650f":"getSiteId(uint256,uint256)","8d70baaa":"BattleOfTitansToken()","8d70c0ce":"transferToExchange(address,uint256,uint256)","8d7108e5":"isValidLocation(uint8,uint8,int8[5],int8[24])","8d711776":"sendCrypto(address,uint256)","8d7117d4":"etherRatio()","8d715d9d":"Backdoor()","8d71f131":"TOKEN_RESERVE2_CAP()","8d72920b":"getAllowedAmountToContribute(address)","8d72a473":"deductFunds(address,uint256)","8d72f856":"deleteVip(uint256)","8d734b30":"setupMintableAddress(address)","8d73c027":"mintWithApproval(address,uint256,address)","8d747928":"isDrivezyPrivateTokenAcceptable()","8d748148":"monitor(address,bool)","8d74fd52":"GlobalTourToken()","8d75533f":"mint(address,string,bytes)","8d7570fc":"doBurn(uint256)","8d75fe05":"mintedTokens()","8d7601c0":"addResolvers(address[],uint256[])","8d77090f":"TriggmineToken()","8d776457":"sellBNT(uint256)","8d78c90b":"EventUpgrade(address,address)","8d79283d":"query1_fnc()","8d792964":"TD(uint256,string,string,uint8)","8d7a55bf":"PubKeyHashTypeAdded(uint8)","8d7af473":"numberOfProposals()","8d7b5243":"minerTotalReward()","8d7cdcf4":"setLLV_edit_8(string)","8d7cffb7":"transferWrappedContractAdmin(address)","8d7d2e5b":"minerPreSupply()","8d7daf95":"isTokenPairWhitelisted(address,address)","8d7e5be0":"getClue1()","8d7e7958":"userGrowsPoolSupply()","8d7e8a57":"approveSpenders()","8d7eca6f":"FUNDING_END_TIMESTAMP()","8d7f26e9":"setIPAddress(bytes32,bytes32,address)","8d7fe693":"Helios()","8d8001ad":"updateMintingStatus(uint256)","8d809b0e":"project_wallet()","8d80c34e":"unblockAccount(uint256)","8d80c922":"getAddressById(uint256)","8d81a1ce":"setClamTax(uint256)","8d81a88f":"BP_ATHENIAN()","8d81e2c0":"getTankTotalEarned(uint32)","8d81f51e":"safeTransferChild(uint256,address,address,uint256,bytes)","8d822615":"setFeeForArtWorkChangeRequest(uint256)","8d835674":"euroRaised(uint256)","8d837f38":"getEthBalTeller(address)","8d83cc95":"getNextSnapshotBalanceOfMul(address[])","8d842fad":"stopPreICO()","8d84a7fd":"credit(string,uint256)","8d854fde":"getDisputeId()","8d859f3e":"PRICE()","8d85a70f":"Vote(address,uint256,bool)","8d860880":"CheckOut()","8d86484c":"setPercentUnfrozenAfterAwardedPerPeriod(uint256)","8d8660bc":"setQuantity(string,int256)","8d86faa6":"getAmountToGive(address,address,address,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32,uint256)","8d87b102":"amountOfStakeToBeReturned(address,uint256)","8d8833bf":"periodPreITO_wei()","8d89873c":"updateAndGetRemaining()","8d8a7f07":"VLBRefundVault(address)","8d8acee9":"setupMultisig(address,address)","8d8b1b88":"mixGenes(uint256,uint256)","8d8bd44f":"TokenSaleFinished(string,address,uint256,uint256,uint256)","8d8c36e9":"purchasedBy(address)","8d8d22ba":"changeServiceAddress2(address)","8d8d50d0":"createUnicorn()","8d8d92fa":"theBid()","8d8e2ea9":"Tablow()","8d8e4561":"theGrid(uint256)","8d8e5da7":"emergencyWithdrawal(address,address,uint256)","8d8f2adb":"withdrawTokens()","8d8f7780":"GEE100()","8d8f95d1":"collectDrugs(address)","8d909ad9":"getSeedAndState(string,address)","8d91801a":"RxEALTestSaleContract()","8d91931f":"longLock()","8d91e803":"buyWhiteCore(uint256,uint256,uint256,uint256)","8d920b02":"rejectPayment(uint256)","8d927069":"getTrace(uint256)","8d927b34":"maxPendingBalances()","8d928af8":"getVault()","8d92910c":"isLegalAttack(uint256,uint256)","8d92c187":"testFinalize()","8d92ce46":"submitBlockHeaders(bytes)","8d92fdf3":"withdrawAsset(uint256)","8d93758e":"PRESALE_STAKE()","8d93eac2":"mintFeeNumerator()","8d93ec88":"poolWallet()","8d94053f":"verifyAutoridadElectoral(bytes32)","8d949635":"endRefundableTime()","8d949c8b":"D(uint256)","8d956f1e":"tokenTransfer(address)","8d95f245":"sellkey(uint256)","8d976d76":"investCommission()","8d977672":"tasks(uint256)","8d977d9e":"checkGameClosed(address)","8d98ee43":"_verifyAddress(address)","8d98f4e3":"getAllCardsDefence()","8d9940b9":"createRetainer()","8d995f94":"transferAndFreeze(address,uint256)","8d99b2eb":"endPoll()","8d9a7b49":"pricePerMessageChanged(uint256,uint256)","8d9ad08e":"getAllInvestments()","8d9afc0f":"getStageId()","8d9b449b":"addRevenueShareCurrency(address,string)","8d9d851c":"toggleVaultStateToAcive()","8d9e6e47":"setFinalICOPeriod()","8d9e8a76":"CMGG12StandardToken(uint256,string,uint8,string)","8d9efa3f":"LogPhaseSwitch(uint8)","8d9f39d1":"_clear(uint256)","8d9f95c4":"PresaleEntry(address,uint256)","8da03997":"getNativeReputation(address)","8da15531":"SimpleCoinToken()","8da16e48":"geraHash(string,string)","8da198cd":"simpleAssert(bool)","8da1e722":"minGamePlayAmount()","8da2a2a1":"reserveDistribute()","8da2defb":"WE(uint256,string,uint8,string)","8da2fc26":"Burn(address,uint256,uint256,bytes)","8da3d736":"addToList(uint256,address[])","8da46db4":"DistributeXcel(address)","8da4d3c9":"claimCount()","8da4d776":"newCommune(address)","8da58897":"starttime()","8da5cb5b":"owner()","8da5fd77":"unlockSecondaryTokens()","8da66e67":"LogCollectAmount(uint256)","8da76874":"mintFromTrustedContract(address,uint256)","8da7d0b5":"totalChildContracts(uint256)","8da8023c":"endTimeOfStage(address,uint256)","8da8524f":"LogFrozenStatus(bool,uint256)","8da87ac6":"addressFundPlatform()","8da8a5ae":"nativeBlockhash(uint256)","8da8f235":"_addController(address)","8da91d04":"unset(uint32[])","8da9b772":"getHello()","8daaaa2f":"HOUSE_EDGE()","8daaf0a2":"addTokens(address,address,uint256)","8dab38da":"BONUS1_LIMIT()","8dac0e8c":"GetEtherPrice()","8dac7191":"initialTokenOwner()","8dad52f4":"dive4(address)","8dae3d68":"awardLuckyCoin(uint256,uint256)","8dae5adc":"FundTransfer(address,address,address,uint256)","8dae9364":"_stakeAmountValid(address,uint256,uint256,bytes8,uint256,uint256)","8daed4c4":"allocateShareholder(address,uint32)","8daf08d9":"requestStempas(bytes32,address)","8daf4dcf":"getTournamentRate()","8daf5033":"TokenPurchased(address,address,uint256,uint256)","8db02d79":"Tiguan5Coin()","8db0816a":"claimC2()","8db0e83b":"getBytesArray(bytes32)","8db1296d":"token_creation_cap()","8db1ccac":"PUBLIC_SALES_1_RATE()","8db23385":"balanceOfTotalUnclaimedCookie()","8db261e0":"hardWithdrawAll()","8db49b57":"GrantDeleted(address,uint256)","8db4dad2":"contractSignedTime(string)","8db517fb":"GMQToken(uint256,string,string)","8db518f3":"ContractiumToken()","8db54c90":"getTotalSendingAmount(uint256[])","8db57994":"fundLoan()","8db6c17e":"ISCoin()","8db7183a":"dateMarketing()","8db783ce":"addHourToProject(uint256,uint256)","8db78a37":"setBountyVault(address)","8db7cd54":"getTournamentEntranceFee()","8db8053b":"mintPresaleTokens(uint256)","8db8f8bc":"ELACoin(uint256,string,string)","8db9653f":"getTotalIssued()","8db974e4":"optionTotalSupply()","8db9c13c":"removePolicy(uint8)","8dbb908a":"clearAllrequest()","8dbbbe10":"getFeeTake(uint256)","8dbc2fd1":"setNewEndtime(address,uint256,uint256)","8dbd7d54":"addCashier(address,address)","8dbdfae7":"referalBonusPercent()","8dbe3be5":"isCeilingStrategy()","8dbe6c33":"_setUserInfo(address,uint256,uint256,address)","8dc01209":"CJC()","8dc07e46":"picops_is_enabled()","8dc1c44d":"testFailCreateWithParentSameNonce()","8dc2a2cd":"GMCCERC20(uint256,string,string)","8dc401ae":"withdrawAllDevelopersCut()","8dc43256":"AFRTokenERC20(uint256,string,string)","8dc45377":"getDuel1(uint256)","8dc4c6ab":"recoverable(address)","8dc6af54":"UsdToTokenConvert(address,uint256)","8dc6e2f1":"onMarketFinalized()","8dc71928":"minimumTargetReached()","8dc73521":"clearLock(address)","8dc850dc":"currentCoinsCreatedInteger()","8dc889f6":"requestDisbursement(uint256)","8dc949e8":"SapienToken()","8dc95182":"AssignWhitelistManager(address)","8dc9650f":"claimdram()","8dc98851":"Billboard()","8dca05c9":"airFropPot_()","8dca5511":"usdPerEve()","8dca7a01":"unicornManagement()","8dcb25e0":"balanceOf2Internal(address,address)","8dcb8c21":"coinsFlipped()","8dcd555f":"_buyNextRank(address)","8dcd64cc":"createAndEndowD(uint256,uint256)","8dcd992e":"_setBabzBalanceOf(address,uint256)","8dcdfe12":"distributeCrowdsaleTokens(address,uint256,uint256)","8dcf7892":"setAllocateTokenDone()","8dcfdaad":"removeMany(address[])","8dcff4f9":"setupAssetOwningListener(address)","8dd05b56":"getImageDataLength(uint256,uint16)","8dd14802":"setBridge(address)","8dd1e732":"YYBToken()","8dd1e96c":"getAngelFundAddres()","8dd21b0f":"redTeamLockingPeriod()","8dd3c196":"addInvestment(bytes32)","8dd42808":"removeHolder(address)","8dd47d91":"Wthdraw()","8dd4f292":"getRemainingSellingToken()","8dd5ac24":"SaveToken()","8dd5e298":"canEnterPool(address)","8dd66012":"incChildren(uint256)","8dd6908e":"ambassadorMode()","8dd6ce79":"setRatePrices(uint256)","8dd745bb":"adminSendTokens(address,uint256,uint256)","8dd747ec":"balanceOfKyCToBeApproved(address)","8dd7d6d1":"newPuppet()","8dd7e44b":"withdrawalComplete()","8dd8596c":"sendDonation()","8dd9054b":"MATCoin()","8dda811c":"GameChannelBase(address,uint256,uint256,address,address,uint256)","8ddab3dc":"_preValidateRefill(address,uint256)","8ddab515":"MedicayunLink(uint256,string,string)","8ddb428a":"currentGeneration()","8ddc9aa7":"UpgradeProposed(address)","8ddcf81e":"get_deal_status(uint256)","8dde60fa":"transferCoin(address,uint256)","8dde907e":"FooBurnableToken()","8ddf52bd":"earlyContribShare()","8ddf792b":"setOraclizeGasLimit(uint256)","8de022b7":"dropAnchor(uint16,uint16)","8de04f87":"authorized_updateCardReserved1(uint256,uint8)","8de0ece7":"THEWOLF10XToken(uint256,uint256,uint256,uint256,address,address,address,address,string,uint256)","8de12845":"init(string,string,string,string)","8de1dcea":"rateAngelsDay()","8de21650":"getBooleanValue(string)","8de2947c":"chkLockedTokens(address,uint256)","8de2a051":"setUint(uint256,uint8,uint16,uint32,uint256)","8de3317d":"withdrawDRPU(uint256)","8de4f42f":"addNewAirdrop(uint256,string,uint256,address)","8de5104b":"startPreICOStage2()","8de575e4":"Veen()","8de69284":"subscribe(address,uint256)","8de69c3c":"AcceptsDailyDivs(address)","8de69f66":"allocateAdvisorTokens(address[],uint256[])","8de6b343":"deleteFromBlacklist(address)","8de74aa1":"setEstateRegistry(address)","8de85908":"ProjectCall(address,uint256)","8de8d47c":"sendObjectWithoutApproval(uint256,address)","8de8de61":"CC5Coin()","8de93222":"purchase(address,uint256)","8de9ee05":"TakeBuyOrder(bytes32,address,uint256,uint256,uint256,address,address)","8dea60cc":"CryptopediaCoin()","8dec1720":"invites(address)","8dec3daa":"destroy(uint256,address)","8dec818a":"LogPaused(bool)","8dede3f5":"pendingInvestContractsIndices(address)","8dedeca8":"costAndBuyTokens(uint256)","8dee53b9":"setBoardMember(uint256,uint256,uint256,uint256)","8def14f3":"ether_per_token()","8def1d3b":"distinctInvestors()","8def32b6":"addOrderBatch(bool[],uint128[],uint128[],uint32[],int256,bool[])","8defbc5e":"right31(uint256)","8df068ab":"initialTransferToDevTeam()","8df0fda1":"isApplicationExits(string,string)","8df10469":"refundInvestor(uint256)","8df15e19":"tokenLock(address,uint256)","8df1a8db":"ENJAllocation(address)","8df208b7":"StopQ()","8df272d2":"CosmoCoin(address,address)","8df301aa":"tradeKyber(address,uint256,uint256,address)","8df35abe":"setManagerAndClaimer(address,address)","8df388c1":"totalUnvestedAndUnreleasedTokens()","8df3a24c":"canAcceptBuyNow(uint256,address)","8df41c32":"allocationAddressICO()","8df465ea":"Zendad()","8df48935":"uncooperativeClose(address,uint32,uint192,bytes)","8df4d225":"GLXChain()","8df554b3":"Dividend()","8df583bd":"exchangeBBDBalance()","8df5fc7a":"_RewardClaimed(address,uint256,uint256)","8df61294":"totalAmountOfOrders()","8df6ad66":"isArrAccountIsNotFrozenForReturn(address)","8df6af63":"setCHGUSDPrice(uint256)","8df793d6":"leaseCard(uint8,string,string,string)","8df8228c":"x888()","8df87c66":"_getTokenLockType(uint256)","8df8ac87":"recevedTokenFromEvabot(address,uint256)","8df8c008":"getFreeTurtles()","8df8cc4c":"_removeOperator(address)","8dfa6fcb":"endTimeAddBonus()","8dfa703f":"BitkerToken()","8dfaf7f0":"getTeamsInfo()","8dfb015f":"increaseInvestedWei(uint256)","8dfb04fe":"getExistCell(address)","8dfb9950":"transferTokensManually(address,uint256,uint256)","8dfbcf36":"addCapper(address)","8dfced82":"amountBonusEnabled()","8dfd1242":"updateStarScoreInBulk(address[],uint256[])","8dfda5ae":"getIndexByAddress(address,address)","8dfde39d":"abi(bytes32)","8dfef745":"bonussale_StartDate()","8dff1762":"RpsGame()","8dff4abd":"activateRevenueShareIdentifier(string)","8dffe343":"kvcDiv(uint256,uint256)","8dffe5c0":"buyPlace(uint256,string)","8dfff9f2":"changePrepaymentFee(uint256)","8e005553":"setFee(uint16)","8e006db0":"setProductStock(bytes32,uint256)","8e007cfa":"giveEthxAddress()","8e008b59":"_createTeam(address,uint32[])","8e01d34b":"AddGoods(uint32,uint32,uint256,uint32,uint32,uint32,uint8,uint8,uint8)","8e0273bb":"Existing(address)","8e0294a8":"_removeProposal(address)","8e035ac1":"BetOnHashV82()","8e045031":"isTokenCollected(uint256,address)","8e048315":"investorDeposit(address,uint256)","8e0488a8":"transferirSalaDePara(address,address,uint256)","8e04977d":"currentLotteryValue()","8e056fe6":"setBirthBlock(uint256)","8e05beb3":"token(bool,address,address,address,address,address[],uint256[])","8e05d59d":"signToApproveTokenControlInfo(uint256)","8e05d8a5":"_computeNextGen0Price()","8e068b11":"virtualReserveBalance()","8e07d7da":"confirmKittyActions(uint256,uint256[8])","8e082555":"changeOwnship(address)","8e08b2ec":"MinesOnTrade(uint256)","8e08cf38":"updateBonus(uint256,uint256,uint256,uint256,uint256)","8e09c8cd":"addCallSpenderWhitelist(address)","8e09ead7":"isTokenBankroll(address,address)","8e0a5faa":"invariant(address)","8e0adbf5":"getLLV_edit_11()","8e0af993":"setPrivateFund(address,uint256,uint256)","8e0b017d":"setSellRate(uint256)","8e0bba69":"iown()","8e0c2882":"drain_alltokens(address,uint256)","8e0c36c4":"verifySeed(bytes32,bytes32)","8e0c8999":"zkWithdraw(bytes32,uint256,address,uint256[2],uint256[],uint256[],uint256[])","8e0d5075":"claimDividendsForBlock(uint256)","8e0db0d9":"keyAtIndex(uint256)","8e0e8fb2":"approveProvider(address,uint256)","8e0ea5cf":"ReturnTokensFor(address,address,uint256)","8e0eef8e":"getTicketValue(uint256,uint256)","8e0ef033":"defrostTokens()","8e0f65eb":"isBelow(int256,int256,string)","8e0f9b85":"Smartcarblockchain(address,uint256)","8e0fee1f":"withdrawRefBalance()","8e101867":"maxTotalAmount()","8e1069f3":"getPlayRecord(address,address)","8e10be33":"primaryOwner()","8e111ef6":"addressOfERC20Tocken()","8e120f36":"prepareToPayWinners(uint32)","8e1227b2":"KTCWhiteList()","8e12823b":"getCompanyHash(address)","8e13435b":"MathPractice()","8e14cc91":"CreateTokens()","8e151947":"newBitsoAddress(address)","8e15e94b":"countOfCell()","8e15fc87":"clearDeposits()","8e165058":"sendTokensToBuyers()","8e17de8b":"Controlled(address)","8e180733":"_validCrowdsale()","8e1876ee":"permaStop()","8e19899e":"withdraw(bytes32)","8e19ee4c":"Recovery(uint256,address,address)","8e1a1c30":"WithdrawLeftToOwner(uint256)","8e1a55fc":"build()","8e1aa2c4":"bts_address1()","8e1b9f42":"CROWDSALE_WALLET_ADDR()","8e1bb633":"triggerRecovery(uint256,address,uint8,bytes32,bytes32,uint256)","8e1d9545":"setTokenSaleHalt(bool)","8e1e2add":"tradeABIHash()","8e1e3e6c":"POMACOIN()","8e1e3eb1":"setMinBuyEth(uint256)","8e1eeb09":"BarrelAgedFOMO()","8e1f0614":"EGYPT()","8e1fda84":"WorkcoinCrowdsale(address)","8e1ffb19":"testThrowsRetractLatestRevisionEnforceRevisions()","8e207fa0":"getApproveValueValue()","8e22e8de":"Cryptolotto7Days(address,address,address,address)","8e236cea":"setAnnualPrice(uint256)","8e242d54":"withdrawSharesTo(address,uint256)","8e25071a":"setProxyCurrator(address)","8e263e6f":"firstAttack(address,uint256,uint256[],uint256[])","8e268934":"LogSendPOSTokens(address,uint256,string)","8e26a223":"getPoSReward(address,address)","8e26c09d":"waitPeriod()","8e26c30c":"carTransferState()","8e26e582":"_mintDataStream(address,uint256,bytes32,bytes32,uint256)","8e273ef4":"buyLicenseForERC20(address)","8e27d719":"deposit(string,uint256)","8e280dce":"findNextYear(uint256,bytes)","8e2832b7":"ethereumToTokens(uint256)","8e298549":"migrateListing(bytes32)","8e29d149":"claim_block()","8e2a37b2":"privateAllocated()","8e2a6470":"allocateShares(address,uint256)","8e2a8312":"EmjacToken()","8e2ab359":"_transferToAddress(address,address,uint256,bytes)","8e2ae564":"mintingDone()","8e2c6f4d":"initiateVerification(address,bytes,bytes)","8e2d0699":"getCompte_32()","8e2e0776":"doInitialDistribution(address,address,address)","8e2e2077":"setTokensForSaleCount(uint256,bool)","8e303097":"BestWallet(address)","8e3047d9":"getBonuses(address)","8e3047e0":"getCrossConnectorReturn(address,address,uint256)","8e3058f3":"getPostFromId(address,string,uint256)","8e3073a6":"getEth(uint256)","8e314783":"addTotalPaid(address,uint256,uint256)","8e316327":"calculateEggSell(uint256)","8e3177e1":"purchaseIpfsAfterTitle(bytes32)","8e32217a":"calculateTokensQtyByEther(uint256)","8e327dd3":"setInvestor(address,uint256)","8e32e421":"expiredTime()","8e3390b4":"contributeMethodABI()","8e339b66":"controllerApprove(address,address,uint256)","8e343516":"balanceWinPoolToWinSystem()","8e351097":"MintedTokenCappedCrowdsale(address,address,address,uint256,uint256,uint256,uint256)","8e3571c0":"testNewCounterValueAfterAIncreaseAndADecrease()","8e357b6f":"AirTrafficControllerROS(address,int256,address)","8e36a9f1":"Neurus()","8e370b3d":"UnsoldTokensReturned(address,uint256)","8e372dcd":"refineCoke(uint256)","8e37adec":"setAddressArr(address[])","8e37c1e0":"collectorWeiCollected()","8e391cb2":"ProxyERC223()","8e3957d9":"RandomNumber()","8e3ab913":"transferToMany(address,address[],uint256[],uint256,uint256,address)","8e3af93f":"finalizeMint(uint256)","8e3b4525":"setExchangeLimit(uint256)","8e3bd6fa":"SetTradeable(bool)","8e3d4e5e":"Fibonacci(bytes)","8e3d5303":"addRegistrar(address,string)","8e3d63e3":"multiSendEth(uint256,address[])","8e3d7ae7":"drawFortune()","8e3dbf53":"getSalesPartnerAmount(address)","8e3dcc60":"sell_spice_melange(uint256)","8e3e1d86":"fisherYates(uint256)","8e3ed7d7":"sendEthers(address,uint256)","8e406072":"getKingdomCount()","8e414295":"Elixer()","8e416b9b":"randomFight2DeathContract()","8e417b30":"GTokenContract(uint256,string,string)","8e424f16":"onlyOwnerSetCompanyWallet(address)","8e434b82":"DADCoin()","8e438b70":"ConpayToken()","8e43e70e":"ParentKidsLinkToken(uint256,string,string)","8e44e74e":"DEFROST_MONTHLY_PERCENT()","8e452fc0":"findAvailableGame(address)","8e4553a4":"script(address,bytes)","8e455a1d":"_createVote(uint256,uint256,uint256)","8e468a88":"donationMap(address)","8e46afa9":"getDefaultGracePeriod()","8e46b68b":"keysRec(uint256,uint256)","8e46f716":"CoinX(uint256,string,string)","8e46fbb2":"testBitsXorFailIndexOOB()","8e4748cf":"MintingERC20(uint256,uint256,string,uint8,string,bool,bool)","8e47b87b":"FundsReceived(address,uint256)","8e47dd03":"currentProfitPct()","8e48474a":"chooseWinner(string,string)","8e496832":"DataContract()","8e497470":"displayNick(address)","8e499bcf":"numTokens()","8e49a2c2":"turnmigrate()","8e49a41f":"getVestingFromContract(address,address)","8e49cf5c":"soldSoulBecause(address)","8e49dd3f":"Failed(uint256,address,uint256,address,address,uint256,address,uint256,uint256)","8e49ff47":"AntzToken()","8e4a23d6":"Unauthorized(address)","8e4a943d":"IcoResumed()","8e4ab74b":"BANKROLL()","8e4adf4e":"tokenUpgrader()","8e4afa51":"checkTransferToICAP(bytes32,uint256)","8e4b0190":"deleteWorkerAdress(address)","8e4bf820":"settleBet()","8e4c64c0":"grantsController()","8e4cb2a9":"balances_after_buy(address)","8e4d0a83":"setLockupList(address,address,uint256)","8e4d5053":"getcontractBalance()","8e4e0f03":"teamAndExpertsTokens()","8e4f9606":"updateReputationScore(address,uint256)","8e4fa788":"accountHasCurrentVote(address)","8e5051f0":"weiToOwner(address,address,uint256)","8e50a65d":"prepareDividends()","8e514018":"getRandomPrice()","8e5152d6":"addToAngelExperienceLevel(uint64,uint256)","8e51d624":"failsafe_addition(uint256,uint256)","8e52019d":"ECASH()","8e52cb51":"getRecordKey(bytes,bytes,bytes)","8e535ade":"lrcInitialBalance()","8e53d5e4":"cumulative(uint256)","8e53f4fb":"preicoSale()","8e543a12":"getLoanAmount(address,address)","8e550bd1":"lastNewInterest()","8e57d397":"modifyHorseyFeedingCounter(uint256,uint8)","8e588306":"getAutonomousSoftwareOrgInfo()","8e5919b6":"setEdoRate(uint256)","8e592caf":"KittyKendoCore()","8e599d50":"joinFunction()","8e59a15b":"checkMinGoal()","8e5b2899":"check(bytes20,uint24,uint32,bytes32[],uint16)","8e5c2e8a":"LogContractOwnershipChangeCompleted(address)","8e5d97a2":"releasePendingTransfer(uint256)","8e5e91ac":"executeStakeholderTransaction(uint256)","8e5ee9ec":"currencyToToken(bytes32[8],bytes)","8e5ef4ea":"DataShieldCoin(uint256,string,string)","8e5ef8fe":"ChivesToken()","8e604b1d":"queryItems(bytes32,uint256,bool[6],bool)","8e611cee":"deductFromUnminted(uint256)","8e62bbd9":"DigitalCoin()","8e62c982":"initialARXSupply()","8e634029":"communityContract()","8e637a33":"authorizePayment(string,address,uint256,uint256)","8e63d7e1":"getTopLevel(uint256,uint256)","8e63ef75":"icoEtherReceivedPrivateSale()","8e641963":"_mintCards(uint32)","8e64a720":"PlendsToken()","8e65f7e4":"logAllTransactions(address)","8e66ca5f":"setFirstBonusLimitPercent(uint256)","8e66da2f":"cancelBet(uint8,uint256)","8e66fea2":"TTCTokenERC20(uint256,string,string)","8e68f000":"oneTokenInWei(uint256,uint256)","8e690315":"AttributaOwners()","8e69367e":"RandomizedPriceFeedApi()","8e694807":"PHOENIX_CORSAIR_MAX_CARGO()","8e6954de":"totalFci()","8e69ceec":"dispatchTokens(address,uint256)","8e69e204":"getPeriodsWithdrawal(address,bytes32)","8e6a1b24":"PIXToken(address)","8e6a2afa":"MAX_PERIOD_COUNT()","8e6b5462":"setOrCacheDesignatedReportNoShowBond(uint256)","8e6b551c":"sumHardCapPublicSale()","8e6b77a2":"interestArray()","8e6b851d":"valueGet(string)","8e6bee97":"pay(uint256,bytes32)","8e6ce1b1":"getActiveSellDetails(bytes32)","8e6d2599":"_activeness2level(uint256)","8e6d531d":"setSubPromoter(address)","8e6d7db8":"updateInstitutionAsset(string,string,address,address)","8e6ddab1":"createMonster(uint256,uint256,uint256,uint256,uint256,bytes)","8e6df32f":"exerciseOptions(address,uint256,uint256,uint256,bool)","8e6f2353":"ln(int256)","8e6f843f":"EarlyExchangeRateChanged(uint256)","8e6fdd31":"raisedEth()","8e6ff99a":"addVineyard(bytes32,uint16,uint24,uint32,uint16)","8e70fdbc":"setIsNotAdmin(address,bool)","8e71decb":"findWinner()","8e71f4fd":"_hasAllSigs(address,address)","8e728fec":"configTimeInit()","8e7296b1":"MOACSupply()","8e72a926":"bankRollBeneficiary()","8e72ca91":"proxyIncreaseWithdrawalChunk()","8e735547":"getUserByEmailVerify(bytes32)","8e739461":"getBalance(bytes32)","8e73d42c":"lunyrMultisig()","8e7418cb":"isSecondRound()","8e744f54":"tranferMinterOwnership(address,address)","8e74a528":"avarageBlockTime()","8e752b40":"startTeamTrade()","8e7547cb":"setWithdrawWallet(address,address)","8e755125":"testIntFixedArray(int256[3])","8e7558cd":"closeStage(uint256)","8e75dd47":"companyCount()","8e760afe":"verify(bytes)","8e76581e":"getManifestId(address,bytes32,uint256)","8e767411":"setWhaleIncreaseLimit(uint256)","8e768288":"isSane(address)","8e76e3ba":"BillofLaden()","8e77304c":"YOUToken()","8e77afc5":"BSCore()","8e77d147":"transactionfeeAmount()","8e77fe2f":"blacklistAddresses(address)","8e77ff1f":"setMigrateTokenContract(address)","8e78f0f2":"remOperator(address)","8e7952c6":"davToken()","8e79dc91":"set_participant_arbits(address,uint256)","8e7a1697":"setDepot(uint256,uint256)","8e7a9687":"check_vote(string)","8e7b36be":"payFor(address)","8e7b90e4":"setTgeAddress(address)","8e7c9e50":"logFloor(int256,uint8)","8e7cb6e1":"getIndex(uint256)","8e7cd5a7":"distributeExternal(uint256,uint256,uint256,uint256)","8e7d0f44":"publicKeyConsensus()","8e7e060f":"buyCards(uint8)","8e7e34d7":"fromHex(string)","8e7e879f":"migrateAll(uint256[])","8e7e99b8":"TotalSupply(uint256,uint256,address)","8e7e9a3c":"calculatePrizes()","8e7ea5b2":"getWinner()","8e7fd292":"trySetSubnodeOwner(bytes32,address)","8e7fdc6c":"LogBetProperties(uint256)","8e7fffe8":"individualRoundCap()","8e80ade9":"hodlTokens(address,uint256,uint256)","8e818aa1":"acceptAdminWithdraw()","8e81bc9c":"addWhitelistedBurn(address,address)","8e81c579":"poolEthSold()","8e81c64d":"burnTokens(uint256,uint256)","8e821b24":"persians()","8e84844e":"changeWeight(address,address,uint256,uint256)","8e84d413":"isFree(uint256[],uint256)","8e854ed8":"getResult(uint256,uint8)","8e8556b4":"privateSaleEtherRaised()","8e86077b":"foundingTeamSupply()","8e8622f9":"_getTAOIdByName(string)","8e869843":"sellfloaksAgainstEther(uint256)","8e86d030":"getMessageRequestHash(address,uint256)","8e8758d8":"tokenAllowance(address,address,address)","8e87f57c":"setCompare(bytes2)","8e87fcbf":"transformFrom(address,uint256,uint256)","8e885cbb":"LARGE_PURCHASE_BONUS()","8e894a6f":"getTileIDByOwner(uint16,address)","8e89ad00":"setMaxDailyPerUser(uint256)","8e89f6e2":"Crowdsale(uint256,uint256,uint32,uint32,address,address,address,uint256,uint256,uint256,uint256,uint256)","8e8a3983":"paySomeone(address,address)","8e8a4a20":"userTenantHashExists(bytes32)","8e8afc34":"setSlaveServer(uint32)","8e8b34bc":"createNewSecurityDeposit(string,string,uint256)","8e8bc816":"TokenBonus(address,address,uint256)","8e8cf4a8":"getThisBalance()","8e8df687":"processedTokens()","8e8e4675":"gur(address,address)","8e8e75fb":"addExternalController(address)","8e8f1e84":"setPublicSaleParams(uint256,uint256,uint256,uint256)","8e8f39d3":"getBlockNumberM1()","8e8fe845":"IsDistribRuSTMingFalg_()","8e9030f4":"maximumNonWhitelistAmount()","8e90b71a":"changeStatus(bytes1,bytes32)","8e90ccbe":"Governance(address[],uint256,uint256)","8e90e1e9":"_createCutie(uint40,uint40,uint16,uint256,address,uint40)","8e9185cb":"NON_TRANSFERABLE_TIME()","8e9206a0":"EOM()","8e928076":"setMaxGas(uint256)","8e92aea3":"_fetch(uint256)","8e92ee66":"redeemShardsIntoPending()","8e93907b":"FamilyResourceControl(uint256,uint256,uint256,uint256,uint256[])","8e93c883":"setMarketingTokensWallet(address)","8e940bb7":"test_testableContributionCaseExpectFailure()","8e943c8b":"checkParticipants()","8e94a5f3":"sellerRefund(uint256)","8e955978":"pushProposal(address)","8e95b0cd":"getSponsorshipsTotalRefunded(address,uint256)","8e95b28b":"delegateUrl()","8e964de9":"COPPER_AMOUNT_XPER()","8e9674c8":"WEMACOIN()","8e96eb3e":"coePerEthOffset()","8e979bad":"setwinPercent(uint256)","8e984ccd":"joinGameAndBattle(uint256,uint256)","8e98c6b9":"getLeaderboardPlayers()","8e9a5890":"danGold()","8e9a7159":"LZLPrivate()","8e9aed2e":"HACHIROKU()","8e9b7ab8":"Partners(address)","8e9bf09c":"issueTokenToAddress(address,uint256)","8e9ccd04":"computeIndexId(address,bytes)","8e9e5c37":"requiringAuthorization()","8e9e697d":"reset(uint256,uint256,uint256,uint256,string)","8e9e8b14":"marketingPartnerSupply()","8e9f2738":"_transferAllArgs(address,address,uint256)","8e9f9072":"signedMessageECRECOVER(bytes32,bytes32,bytes32,uint8)","8ea04cb3":"getUpgradability(uint256,address,address,string)","8ea06c68":"BLMToken(uint256,uint256)","8ea0926a":"addBaseStats(uint256,uint8[8])","8ea0b540":"getProjectInformation(uint256)","8ea0d898":"DestroyedBy(address)","8ea1ee86":"DapCarToken()","8ea1ff21":"OwnedExample(address)","8ea25644":"XYY()","8ea390c1":"getOwedDividends(address)","8ea44bab":"setProviderAdmin(uint256,address)","8ea51696":"JRT()","8ea5220f":"devWallet()","8ea55bd7":"_pushContributor(address,bytes32)","8ea56e57":"ADV()","8ea64376":"opsAddress()","8ea67eb0":"ETCharPresale(address)","8ea69e37":"TestToken(uint256)","8ea6dd82":"BotAdded(address)","8ea7296b":"deleteChild(address)","8ea73a7c":"setDonationReward(uint256)","8ea74d95":"transferDaico(address)","8ea77300":"RELEASE_START()","8ea822d8":"createThings(bytes32[],uint16[],bytes32[],uint16[],uint88)","8ea83031":"swapContract()","8ea83681":"mintTreasuryTokens(address,uint256)","8ea8dc9d":"APP_MANAGER_ROLE()","8ea8e149":"removeService(address,address)","8ea8f83c":"activate(uint256,uint256)","8ea91bf3":"createVestedToken(address,uint256,uint256,uint256,uint256)","8ea95cbc":"lastDepositorAmount()","8ea98117":"setCoordinator(address)","8ea98db4":"Mmchain(uint256,string,string)","8eaa1e29":"getContentByData(address,uint256,string,string)","8eaa5d1c":"amount50kUsdInCents()","8eaa6ac0":"get(bytes32)","8eaa8d4f":"RefundedInvestor(address,uint256,uint256)","8eaa9c91":"Client()","8eaaeecf":"getUserCapInTokenWei(address,address)","8eac494c":"tierWhitelisted(uint256)","8eaeb531":"setAccountA(address)","8eaf1dab":"PRCT100_R2()","8eafe0f0":"getCustomerRating(string)","8eb04f02":"setRefundManagerContract(address)","8eb066ce":"init(address[5],uint256[6],uint8,bytes32,bytes32)","8eb0e73e":"bonusPctSteps(uint256)","8eb179ad":"maxHardCaphardcap()","8eb206d1":"deletePage(bytes32,bytes32)","8eb36e3d":"initData()","8eb3e0e3":"socERC20(uint256,string,string)","8eb45cbf":"frozenProfitDate()","8eb4e0ad":"batchRelay(bytes16[],address[],address[],uint256[],uint16[],uint128[],uint8[],bytes32[],bytes32[],uint8[])","8eb547d4":"squareOfSums(uint256,uint256)","8eb5a7ac":"changePermission(address,bool)","8eb5f650":"ETIN(uint256,string,string)","8eb6418e":"LoritaBi()","8eb64b3d":"multi(address[],uint256)","8eb64b61":"MAX_NON_SALE_SUPPLY()","8eb689f7":"giveFor(address)","8eb6d683":"coinAllowanceOf(address,address)","8eb6ffaa":"withdrawBloc(uint256)","8eb717fc":"increaseCap()","8eb76eed":"emitUserRatingGiven(address,address,uint256)","8eb7ffe8":"assignInBatches(address[],uint256[])","8eb831fe":"ChangeOperator(address)","8eb857f8":"getData_25()","8eb88c1b":"EvergreenHealthToken()","8eb89a61":"getPointsBalance()","8eb976ca":"assertEq17(bytes17,bytes17)","8eb98150":"NOT_ENDED_FINE()","8eba2966":"RESERVE_PORTION_MULTIPLIER()","8ebaae08":"createListing(uint256,uint256,uint256,address)","8ebac11b":"getHash(address,uint256,uint256,uint256)","8ebb2ce7":"setProfitContainerAddress(address)","8ebb5aee":"calculateTokenBuy(uint256,uint256)","8ebc266d":"getCurrentUSDCentToWeiRate()","8ebe555b":"allocateShares(uint256,uint256)","8ebed616":"CRF()","8ec3167f":"calculateGoalsFromAttributeTotals(uint256,uint256,uint256[],uint256[],uint256)","8ec3272d":"addPicture(string,bytes32,string,address)","8ec48bcb":"BitCharity()","8ec49939":"switchOFFfreeForAll()","8ec4dc95":"getPerson()","8ec521a8":"setupStakeholders(address[],uint256[],uint256[],bool[],uint256[],uint256[],uint256[])","8ec5a309":"testHash(string)","8ec5ff41":"isUid(string)","8ec63da9":"checkIsOnlyProxy(bytes32)","8ec6677d":"registerUsername(string,address)","8ec84812":"updateProfit()","8ec86497":"clearname()","8ec89e4f":"_isActive()","8ec8fcad":"ADV(uint256,string,string)","8ec9925e":"jackpotToken()","8ec9a5de":"getLeaf(bytes32,uint256)","8ecaa140":"_refundHighestBidder(uint256)","8ecbc4e9":"setNewBRXPay(address)","8ecc0643":"BuyAd(address,uint256,string,string,string,uint256,uint8,address)","8ecc0950":"returnToOwner()","8ecc107f":"buyUninitializedPixelBlock(uint256,uint256,uint256,bytes32)","8eccf58e":"getTokensCountPerEther()","8ecd2fe8":"testMul256By256()","8ece19f6":"setTokenLock()","8ece39cd":"startOraclize(uint256)","8ece85a4":"ETpay(uint256,string,string)","8ecebf34":"MorpheusToken()","8ecf0d0b":"getCreated()","8ecfc412":"workForce()","8ed06b62":"getShipPrice(uint256,uint256)","8ed08711":"saleMinimumWei()","8ed09bc9":"registerVoter(bytes32,address)","8ed0ac8b":"closeTrancheAddition()","8ed1858e":"distributeELTCSmall(address[])","8ed20fa0":"tokenWeiToSale()","8ed2395f":"ZCNYToken(address)","8ed33545":"sub_presale_arbits_sold(address,uint256)","8ed34751":"performHealthCheck(uint8)","8ed399ca":"teamWallet_2()","8ed3fa7c":"codexCoin()","8ed5047c":"updateCokeTotal(uint256,bool,uint16)","8ed5f2ca":"newTestableCampaign(string,uint256,uint256,address)","8ed67a44":"setPrice(uint16)","8ed6910f":"limitSell(uint256,uint256)","8ed7c3d3":"sendTokensManager(address,uint256)","8ed7ca93":"finishExam()","8ed8067e":"FundContract()","8ed882c5":"designatedReporterWasCorrect()","8ed91318":"nextAssetId()","8ed9be36":"temp(uint256,uint256,bytes32,bytes32)","8ed9fd75":"ICO_Supply()","8edb726d":"modifyEndFundingTime(uint256)","8edbf436":"getPriceInfo(address)","8edc4f8f":"isValidCap(uint256,uint256)","8edc707b":"adoptionOffers(bytes5)","8edcf21d":"getCurrentYearGameMiningRemainToken(uint16)","8edd6eb6":"getFund()","8eddc306":"__exchangerCallback(address,address,uint256)","8eddc804":"notifySale(uint256,uint256)","8eddf665":"onInvest()","8ede1817":"getReturnTime(uint256)","8ede3a34":"KeplerToken()","8ede74c1":"changeRage(uint256)","8ede94b4":"setLineUpEnable_miner(address,uint256)","8edeb15d":"donation()","8edec689":"wd()","8edfaef8":"getSetupParameters()","8edff3db":"getTerminal(uint256)","8ee030bd":"FaceterToken(address,address)","8ee070d9":"MYEMPEROR()","8ee0942b":"setSignatureROFR(bytes)","8ee0ffe8":"sendStakingContract()","8ee1409e":"TitanToken()","8ee17e0a":"MarvinCoin()","8ee21b8e":"get_default_keys()","8ee365fa":"removeAddressesFromAdmins(address[])","8ee36f05":"isVoted(address,uint256)","8ee3f472":"BoutsCrowdsale(uint256,uint256,uint256,address,address,address)","8ee3f72f":"PinCode()","8ee4d44b":"addAddressToOperators(address)","8ee4fd8a":"claimWithSignature(bytes)","8ee553cc":"getCroById(uint256)","8ee5a8b3":"UpgradeProposals(uint256)","8ee6540c":"seventeen()","8ee6f301":"readvalidrollsXteam(uint16)","8ee78046":"draw(address,uint8[])","8ee833cc":"isValidTenant(string,address,uint256)","8ee8a5c4":"Charity(string)","8ee93cf3":"post(string)","8ee97ff4":"VirtualRewardToken()","8eeb203e":"exchangeWeight()","8eeb33ff":"crowdSaleAddr()","8eeb3b0e":"KJCPerEthereum()","8eeb5073":"_bundle(address,uint256,uint256[])","8eeb5c97":"cancelDo(bytes32)","8eeb7d11":"unlockAllocationAddress(address)","8eeb8e5a":"MUC()","8eec5d70":"getPoolCount()","8eec6f7b":"lockETH(uint256)","8eec99c8":"setNewAdmin(address)","8eecddcf":"betBlockNumberOf(address)","8eecf64d":"createContractWithMeta(address,uint64,bytes,string)","8eee1cd6":"buyerExceededApprovedAmount(uint256,address)","8eef059e":"_lowerDown(uint256,address)","8ef0f09a":"createPromoPow(address,string,uint256,uint256,uint256)","8ef1a6b6":"makeProfit(uint256)","8ef1e886":"RESERVE_PERCENT_EVE()","8ef22afe":"getCostToCancel()","8ef25a7a":"KeplerTokenExtraSale(uint256,address,address)","8ef26a71":"coinSentToEther()","8ef28249":"totalGuesses()","8ef2826e":"HODLWallet(address[],uint256[])","8ef292fc":"BTM()","8ef326ea":"getCubeCount()","8ef44301":"tokenRecoveryFromTrade(address,address,address,uint256)","8ef47296":"StorageController(address,address,address,address)","8ef483eb":"getMyWager()","8ef490ea":"fullname()","8ef4c807":"lockedBalanceOf(address,uint256)","8ef53edf":"InitAssignOK()","8ef5ae21":"setupInfo(string,string,string)","8ef5ce28":"test1_addingFirst()","8ef5eaf0":"drop(address[])","8ef6e7fe":"build(string)","8ef6ed53":"_getRandom(uint256,uint256)","8ef72d15":"backEthRatio()","8ef79e91":"setTokenBaseURI(string)","8ef7c649":"getTicketPrice(uint8)","8ef8125e":"frontRunnerSetTimestamp()","8ef82010":"orderExecution(bytes32,uint256)","8ef85e04":"secondWeekTokenPrice()","8ef87843":"randomSkinAppearance(uint256,uint128)","8ef8f241":"getEmployerInfo()","8ef9c904":"NewAmbassador(address,address)","8efa00e2":"getPRETDETokenExchangeRate(uint256)","8efa23d1":"RELEASE_WALLET()","8efa3e21":"setIsMinter(address,address,bool)","8efbd512":"getAccountNumber(address)","8efc777f":"isBeta(bytes)","8efd4c75":"QUARTERLY_RELEASE()","8efd5f92":"divIntervalDays()","8efe6dc4":"changeMonthlyWithdrawLimit(uint256)","8efe7801":"showWinnersSort()","8efe8c1c":"EPTToken(address,address)","8eff3c29":"getRecords()","8effda0d":"IndorseSaleContract()","8f003a2d":"StarSportsToken()","8f00c0af":"has_contract_ended()","8f00cbfa":"winnerIndex()","8f00f49b":"totalAssetTokens()","8f0165e1":"min_pay_wei()","8f01932a":"mntpToMigrateTotal()","8f01e1e2":"getactiveleveltime(uint256)","8f02bb5b":"setTransferFee(uint256)","8f03850b":"numContributors()","8f038a5a":"initializeEthReceived()","8f039a10":"changelp8(address)","8f03f5c3":"firstUnlocked()","8f0427b1":"sellPosition(uint256)","8f049de5":"endBetRed()","8f054bf3":"referralList(address)","8f0563b9":"substring(string,int256)","8f061ef5":"Token(string,string,uint256,uint256)","8f06492d":"callOnRemoval()","8f0816bc":"PERKToken()","8f08288a":"clearBets()","8f08a60a":"transfer2(uint256,address[],uint256[],bytes,bytes,bytes,bytes)","8f08d44d":"burnAsset(uint256)","8f08e369":"withdrawApplication(address)","8f094efb":"getMineableSupply()","8f0a4c1b":"startPreSales()","8f0a6ecb":"returnBountyTokens(address,uint256)","8f0bc152":"claim(address,uint256,bytes)","8f0c724c":"setOperationsCallGas(uint256)","8f0d16da":"emitIssuersUpdated(address,bool)","8f0d3b8b":"_buy(uint256,uint256)","8f0d67ef":"activationTime(uint256)","8f0ec6b3":"ZanCoin()","8f10cad0":"StreampayToken()","8f10fd45":"getBuyCount()","8f112370":"addToAffiliate(address,uint256)","8f11e5f9":"checkWithdrawValue(uint256)","8f1224ce":"fixInvestment(address,uint256,uint256)","8f12355d":"assertEq7(bytes7,bytes7,bytes32)","8f1327c0":"getRound(uint256)","8f134025":"rewardSent(uint256)","8f13fd29":"setPriceValue(bytes32,uint256)","8f140568":"isServiceAddress()","8f142842":"getByAlias(string)","8f142907":"stables()","8f14b76b":"sendReferrer()","8f14d8a3":"reclaimContractTokens()","8f15024f":"ticketsSold()","8f152d0e":"vestingConfigured()","8f158e76":"remainingPublicSaleCap()","8f163497":"AgaCoin()","8f16eb1a":"setI_R1(uint256)","8f188b40":"migrateInvestor(address,uint256,uint256,uint256)","8f19ff45":"_handleTokensReceived(uint256)","8f1a422c":"minterWallet()","8f1a927a":"numTicksSinceAuctionStart(uint256)","8f1af992":"claimTwitterId(uint256,address,uint8,bytes32,bytes32)","8f1b0b02":"bulkTokenMint(address[],uint256)","8f1c204c":"test_fiveAssertFalse()","8f1cc85e":"SAGAcrowdSale(address)","8f1cc94e":"HashTypeAdded(uint8)","8f1d5f7e":"getLedgerNameHash()","8f1d8f41":"ethInvestment(address,uint256,uint256,uint256,uint256)","8f1d90b1":"tokenBearer()","8f1df4f7":"setPrices(uint256,uint256,uint256,uint8,uint256,uint256,uint256)","8f1eda37":"wmul(uint128,uint128)","8f1f761a":"Rewards_Supply()","8f1fc530":"startSplit()","8f1fc6bb":"testRemoveProductFromCart()","8f1fdbb9":"offerEth(uint256)","8f212eb7":"BITSDTokenInitialized(address)","8f217d6b":"lastChar(string)","8f22964d":"NegativeWhuffiesSent(address,address,uint256,string)","8f22d128":"testdigiToken()","8f24f2a3":"takeBuyOrder(address,uint256,uint256,uint256,address)","8f25159c":"getDayDepositLimit(uint256)","8f259117":"numcallsinternal()","8f25eec1":"BetWon(address,uint256,uint256)","8f26a5ab":"setSaleAgent2(address)","8f272c0b":"minor_partner_address()","8f2757d8":"Bitshopandearn()","8f282b87":"getSold()","8f283970":"changeAdmin(address)","8f287be5":"PitEur(address)","8f288526":"TokensPurchased(address,uint256)","8f288644":"getHighestBid(uint256)","8f2900d5":"timeLocks(uint256)","8f291158":"listBBO()","8f296759":"UTILITY_ROLE()","8f29f09a":"fetchPaidOrdersForMerchant(address)","8f2a3093":"freeBeerOnMe(string)","8f2a6d3e":"YOOBAToken(address,address,address,address,address)","8f2abe9a":"Voting(uint8,address,uint256)","8f2bab07":"getChainLength()","8f2be8e0":"MauiWowieToken()","8f2c2ab7":"checkAndCloseDeposit(uint256,bool)","8f2c3af8":"lastBlock_v10Hash_uint256()","8f2c44a2":"UnicornMilker()","8f2e695c":"ICO_state()","8f2e8d4a":"createTrack()","8f2e9ee7":"theDay(uint256)","8f2eabe1":"isValidatorFinalized(address)","8f2ec012":"dayToBlockNumber(uint256)","8f2ee2df":"mainPot()","8f2ef6b7":"CMGF()","8f303df9":"priceExpired()","8f30435d":"getCompetitionValues(string,uint8)","8f32106e":"CreateALLY(address,uint256)","8f32cf0c":"team_address()","8f32d59b":"isOwner()","8f33221e":"addContract(address,uint256,uint256)","8f33c285":"getAyantDroitEconomique_Compte_8()","8f33df77":"countAllVotes(uint256)","8f34296b":"Applied()","8f348cfe":"InsertProject(string,string,address,address,string,string,address)","8f34ac6e":"setCoOwner(address)","8f350624":"contributionOpen()","8f356f97":"lottoHighestNumber()","8f35a75e":"getInvestor(address)","8f36039c":"holdContract()","8f367001":"numTokensAbleToPurchase()","8f368359":"getTimeUntilInterestIncrease(bytes32)","8f3684bf":"returnTotalDividend()","8f36d03e":"_finishSpin(address)","8f36f8f1":"redeemStake(address,address,uint256,uint8,bytes32,bytes32)","8f37a0f9":"getTo(uint256)","8f382a00":"ETHEAL_UNIT()","8f38a896":"BRONZE_AMOUNT_XPER()","8f38bf34":"updatePrices(uint256,uint256[],uint16,uint256[],uint256[])","8f38d8cc":"S(string)","8f38f309":"buyXid(uint256,uint256)","8f3956a4":"ChangeUpgradeMaster(address)","8f395eb6":"addIntComparison(bytes32,int32,bytes1)","8f398180":"isUnknown(address)","8f3984b5":"setRole(address,string,bool)","8f3b6b84":"centsPerToken()","8f3b8c3a":"setTokennCrowdsale(address,uint256)","8f3bab85":"readFromCart(uint256)","8f3bed06":"pickUniquePacks(uint256[])","8f3de282":"onSealed(address,address,uint256)","8f3e568a":"findOutInterestByClientCategory(address,uint256,uint256)","8f3e8747":"getGasForMcrData()","8f3f50fc":"startICOTimestamp()","8f40104c":"init(address,uint256[],uint256,uint256,uint256,uint8,uint256,bool)","8f409b85":"Coin(uint256,string,uint8,string)","8f41e442":"breakTie(uint256)","8f420866":"DEFAULT_SEND_GAS()","8f426437":"getTankOwner(uint32)","8f42a864":"TitaToken()","8f43166b":"getGivenCount()","8f44097a":"TokenRDC(address,address,address)","8f449a05":"subscribe()","8f456125":"setCrowdSaleAddress(address)","8f4613d5":"left10(uint256)","8f4646b7":"transferPreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)","8f46b586":"withdraw_team_fund(address,uint256)","8f4708bd":"mintingBountyFinish()","8f477c55":"updateLink(address,bytes)","8f4783f1":"_generateRealmSale(uint256,uint256)","8f47dd19":"bulkInit(address[],address[],uint256[])","8f484394":"manual_withdraw()","8f48c14a":"updateMinCompanyValue(uint256)","8f49a264":"provide_eth()","8f49ccf4":"reportUsage(uint256,uint256,address)","8f49da4b":"distributedToken()","8f4a2a51":"defaultWallet(address)","8f4b4b98":"messagesSigned(bytes32)","8f4ccce8":"startTokenVotes(address[15])","8f4ce746":"buyDeferredPresaleTokens(address)","8f4d8723":"_CallExecuted(address,bytes32)","8f4d874a":"referralTokensAddress()","8f4dc0d1":"updateAvailable(uint256,uint256,bool)","8f4e4321":"accountOf(uint256)","8f4e5158":"increaseFrozenBalances(address,uint256)","8f4ed333":"step2()","8f4f3c70":"DungeonChallenged(uint256,address,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)","8f4fb958":"calculateRandomNumberByBlockhash(uint256,address)","8f4fde42":"crossForkCount()","8f4ffcb1":"receiveApproval(address,uint256,address,bytes)","8f50fb06":"getTrapInfo(uint256)","8f50fdd6":"walletAddressesSet()","8f512c47":"getSponsorships(address,address)","8f518475":"NewKoth(uint256,uint256,address,uint256,uint256,uint256)","8f52d420":"CryptoStrippers()","8f52da60":"technicalWallet()","8f535904":"CROWDSALE_REWARD_WALLET()","8f541730":"advisor1Sum()","8f55a850":"getArtistList()","8f56015f":"setRequirement(uint256)","8f5665ce":"nthWagerPrizeN()","8f571461":"ICOPRICE()","8f580996":"enablePurchasing()","8f58190e":"setLLV_edit_19(string)","8f581a53":"giveRegistration(address)","8f5949f9":"isContractActive()","8f5a5a39":"verifyPayment(bytes8)","8f5ab3ab":"transferdata(address,uint256,bytes)","8f5ab947":"getNextDropTime()","8f5b0b1c":"timeCheck()","8f5bae2e":"anchor(bytes32,uint256)","8f5bc587":"TokensForSale()","8f5c2eff":"getPurchaseInfo(uint256,uint256,uint256,uint256,uint256,bool)","8f5c5d40":"validTranscodingOptions(string)","8f5cbe36":"testCreateSale()","8f5cf7b9":"vestingStageTime()","8f5d23f6":"TOKENS_FOUNDATION()","8f5e0b3f":"UserBondByOffset(uint32)","8f5e514a":"diff(uint256,uint256)","8f5e619b":"publishEtherBox(bytes32,string,uint256)","8f5e9ca7":"acceptTOS(address,bool)","8f5f20c2":"LMA()","8f5f657d":"rateboc()","8f5fa4a4":"changeReceiverAddress(address)","8f608f4f":"exchangeRateMNY()","8f60cf17":"increaseSalesBalance(address,address,uint256)","8f6107ef":"MatthewWon(string,address,uint256,uint256)","8f612102":"createCarrier()","8f617fcd":"icoFinishTimestamp()","8f61da35":"getDebtLength()","8f620487":"expirationDate()","8f62077d":"getPlayerShips(address)","8f6218a3":"rollDices()","8f6245e1":"parseBool(bytes32)","8f627aab":"BlockIntervalCrowdsale(uint256)","8f62905f":"mintTokens(int256,uint256,uint256,address)","8f62b028":"updateUSeqgret()","8f632311":"doMint(address,uint256,bytes)","8f632a34":"MeetupToken(uint256,string,uint8,string)","8f6348b8":"stopFeeding()","8f63534a":"totalAuctionsCount()","8f64337d":"getHashedData(uint256,uint256,bytes32,bytes32,uint256)","8f652ec7":"_getVerifierInfo(address)","8f654175":"auditorAddress()","8f6612c9":"distributedAutonomousExchange()","8f679b2d":"EtheraffleICO()","8f67bd4d":"SBITokenCrowdsale(address,address)","8f67f9d7":"ILLIQUID_TOKENS()","8f6811a3":"mintTokensFor(address,uint256)","8f68b36f":"getMysubscribers()","8f68ca70":"setWhiteListContract(address,bool)","8f6963df":"initShareRule6()","8f699f6c":"calcInvalidKeys(uint256,uint256)","8f69fa25":"startLockingPeriod()","8f6a3deb":"_activateZoneLand(int32,int32,uint8,uint8)","8f6a7286":"refundMultipleUsers(address[])","8f6ac8d7":"FinalizableCrowdsale(uint256,uint256,uint256,address)","8f6b875a":"OWNER_POOL_COMMISSION()","8f6caf63":"sendPoint(uint32,uint32,int256,address)","8f6f3275":"getLease(uint8,uint256)","8f6f6115":"getOraclizePrice()","8f6f988c":"setUltimateOutcome(bytes)","8f6fa4c2":"ICO_details()","8f6fba8c":"FEATURE_TRANSFERS_ON_BEHALF()","8f70009d":"id_for_address(address,address)","8f701eaa":"addguess()","8f702afa":"sellerNumOpenDeals(address)","8f70585f":"bid(address,uint256,uint256,uint256)","8f70bfa0":"processDeposit()","8f70ccf7":"setTrading(bool)","8f7140ea":"receivePlayerNameList(uint256,bytes32)","8f717e80":"totalCreationCap()","8f71b3db":"etherToUSDrate()","8f71f3cb":"getBdpPriceStorage(address[16])","8f728516":"initNewGame()","8f729925":"receivePercent()","8f72e065":"StabitCoin(uint256)","8f72fc77":"getOrders(uint256,uint256)","8f731077":"extractAllowanceRecordLength(address)","8f73c5ae":"distributeReward()","8f7445e6":"setStageThirdBegin()","8f7451ae":"GetStoreInfo()","8f750271":"prose()","8f75362d":"emergencyWithdrawAdmin()","8f75374d":"incrementSupply()","8f754a1e":"affectedCount()","8f755c7c":"getOptionState(address[3],uint256[3],uint256[2],bool)","8f760988":"forceStopCyle()","8f76691a":"margin()","8f76a1f7":"lastClaimedRound(address)","8f76dfc3":"allTokenICO()","8f770ad0":"supplyCap()","8f77339f":"sendToken(uint256,uint256,uint256,string)","8f775839":"settled()","8f776ff1":"allowanceBalance()","8f778bb9":"setEmployer(string)","8f78b34a":"lockAccounts(address[],uint256[])","8f790507":"teamEthContract()","8f7a4738":"censure(uint16,uint32)","8f7a844b":"getAdminData()","8f7b7bce":"isTeamLockInPeriodOverIfTeamAddress(address)","8f7ba0a1":"registerbot()","8f7d33cf":"addCashback(string,uint256,address,uint256[],uint256[])","8f7d4dad":"getFirstPoints()","8f7d79da":"nextRoundMaxDonors()","8f7db6ee":"_setProviderSupply(uint256,uint256)","8f7dcfa3":"head()","8f7fe231":"ValidetherOracle()","8f80269d":"getClientSupply(address,uint256)","8f807f6b":"enqueue(address)","8f80b7bc":"registerTokenInternal(address,string)","8f80d339":"roundClaimICOKeys(uint256)","8f81ecfc":"removeChild(bytes32,bytes32)","8f81fd4a":"changeIcoDiscountPercentages(uint8,uint8,uint8)","8f828c9e":"totalSupplyAtInternal(uint256)","8f82b8c4":"getWhiteListCount()","8f8336b7":"setFeesMaxUptoCoin(uint256)","8f835871":"addRealWorldPlayers(uint128[],bool[])","8f83719c":"getTreasuryBalance(address,address)","8f83743f":"Fricacoin()","8f838478":"getInstantiationCount(address)","8f842851":"dateManager()","8f847076":"removeNFToken(address,uint256)","8f84aa09":"ownerAddress()","8f850163":"flipsWon()","8f855433":"newCreator()","8f85f92c":"isPoDEnded()","8f860c5f":"createWallet(address,address)","8f86f5ea":"finishSale()","8f872bb1":"advisorsAndAmbassadorsAddress()","8f87932c":"fix_amount(uint256)","8f87c84b":"transferOutEth()","8f87e387":"updateSspManagerContract(address,string)","8f88110d":"updateRecordWalletAddress(string,address)","8f88708b":"retrieve(uint256)","8f88a00e":"calculateRewardStructures()","8f88aed0":"populateFromItemRegistry(uint256[])","8f88b792":"createCampaign(string,uint256[3],uint256[],uint256,uint256,uint256,uint256)","8f8949e6":"setTotalCardCount(uint256)","8f8a5832":"reLoadXid(uint256,uint256)","8f8b2c9b":"totalEthJackpotRecieved()","8f8bbb8c":"ObjectedVote(bytes32,address,uint256)","8f8bcae6":"minting(address,address)","8f8bd64c":"calculateNetworkTokenBonusPercentage(uint256,uint256,uint256,uint256,uint256)","8f8bde82":"MicroDAO()","8f8c7c50":"_randomMeme()","8f8d322e":"melt(address,uint256)","8f8d49ac":"setStore(string,uint256)","8f8db737":"buyDirectInMarketplace(uint256)","8f8e7419":"sharedStorage()","8f8e8f9d":"refundETHToCustomer(address,address,uint256)","8f8eabea":"ZNA(uint256)","8f8eb474":"burnBid(uint256)","8f8f6b52":"freezTwo()","8f907195":"rpow(uint256,uint256)","8f9087f5":"hashBytes(bytes)","8f908cbd":"setCaptainTokenContract(address,address)","8f90f2bb":"getNewRabbit(address)","8f9139fb":"Pokecoin(uint256,address,address)","8f924560":"addEntity(string,uint256,uint256)","8f929c4a":"createAccount(bytes16,string)","8f92d308":"viewFeaturePetitionFee()","8f937574":"OwnerHelper()","8f93bffe":"getOrCacheReportingFeeDivisor()","8f940f63":"typeId()","8f94f6a0":"piTokensForSale()","8f9593f4":"winnerFirst(uint256,uint256)","8f96a1ea":"addThing(bytes32,bytes32,bytes32,bytes32)","8f975a64":"sendERC20(address,address,uint256)","8f97ad89":"claimTokensFor(address,address)","8f97cff0":"getPersonsCount()","8f97d03f":"IbizaERC20Token()","8f97e3a0":"requestPayout(uint256)","8f984115":"AUEBToken()","8f98767e":"fundingMaximumTargetInUsd()","8f98ce8f":"transferFeeNumerator()","8f98e0e1":"MBToken()","8f99d31b":"betLow()","8f99ea43":"setDividendDB(address)","8f99fdab":"SafeDeduct(uint256,uint256)","8f9a42b8":"philadelphiaBets()","8f9a57ef":"minSignId()","8f9a6da1":"queryOracle(string,string)","8f9abae1":"accessControlled()","8f9abe52":"isValidSellOrder(address,address)","8f9ade5e":"create(address,bytes32,uint256)","8f9b7eb7":"updateReleaseAmount()","8f9bbf16":"getSecurityTokenData(address)","8f9bf95d":"_payCommission(address)","8f9d1cba":"zss(address)","8f9d390a":"toteLiquidatorTransferComplete()","8f9de24b":"uniqueSpinnersActive()","8f9df278":"newEntry(int256,bool,uint256,int256,string,bytes32,address,uint256[])","8f9e1409":"removeSection(bytes32,bytes32)","8f9f5b2f":"getMemoryWrite(uint256,uint256)","8fa148f2":"currentRoundStartBlock()","8fa17580":"claimEgg(uint256,bytes32,bytes32)","8fa1ae05":"batchTransferSingleValue(address[],uint256)","8fa32111":"addInvestor(address[])","8fa366df":"changePhaseToICOweek3()","8fa3a84c":"validateTransaction(address)","8fa4c0b1":"tokenPlus(address,address,uint256)","8fa54b81":"setUserBattleValue(address,uint256)","8fa5614f":"getBylawsProposalVotingDuration()","8fa56215":"_createToken(string,string,string,uint256,address,uint256,uint256)","8fa566e8":"tokenIdOfUUID(string)","8fa5a6e9":"pmtAccount()","8fa65488":"startRefundInvestorsBallot()","8fa6da99":"Modultrade(address,address,address,address)","8fa81bb0":"PrivateSale(address,uint256)","8fa8b790":"cancelAuction()","8fa906b2":"addFounder(address,uint256)","8fa9cc09":"HeritableWalletFactory()","8fa9e55c":"signIn(address)","8faa6cb7":"partnersLockEnd()","8faa77b2":"deployers(uint256)","8faab3a7":"BatchAttachAssets(uint256[10])","8faad4c4":"createPromoTeam(string,address,uint256)","8fab0549":"setInvestorsPercentage(uint256)","8fabd326":"mPausedTime()","8fac3d3e":"feesGathered()","8fad8334":"_timeRemaining()","8fad8eec":"EnterRentToken()","8fadd08b":"betHigh()","8fae065c":"setStartIcoPreICO(uint256)","8fae4857":"finaliseChannel()","8fae8850":"ICOmint(address,uint256)","8faef6a5":"getTierForLastMiniting()","8faf682d":"payeeWithdrawCapital()","8faf850d":"addUser(bytes32)","8fafb286":"claimResearchDividends(address,uint256,uint256)","8fafebca":"TokensPurchased(address,uint256,uint256)","8fb0de08":"getCurrentRoundInfo2()","8fb197d1":"getUserDataOnToken(address,uint256)","8fb21a4b":"setMinReferrerBonus(uint256)","8fb25f82":"sellCells()","8fb29d6c":"pastAgreement(uint256)","8fb2f8b4":"isCollectTokenStart()","8fb2fbe1":"getTokenToEthUpdateOrderHint(uint32,uint128,uint128)","8fb48844":"noOfreservations(address)","8fb4b573":"start(uint256,uint256)","8fb50078":"joinProvider(address)","8fb51ccd":"QosinusCoin()","8fb5202b":"setFinancialAddress(address)","8fb5a482":"getPrices(address[])","8fb67f60":"aPurgeMessages()","8fb6d997":"updateStorageContract(address)","8fb74077":"HoursFromNow(uint256)","8fb74ae9":"isBannedUser(address)","8fb84bb0":"marketBuy(uint256)","8fb8f109":"addressToPersonId(address,address)","8fb96635":"decreaseBalance(address,uint256,uint256)","8fba273c":"m_investmentsByPaymentChannel(address)","8fba8d5c":"toHexString(uint256)","8fbb3c17":"CROWDSALE_PHASE_2_START()","8fbb9b49":"_isProduct(address)","8fbc3ecd":"BUFFER()","8fbc7eb0":"balanceOfToken(address,address,address)","8fbd4fa5":"claimPrizes(uint256,uint256,uint256,uint256)","8fbe382c":"totalFoundCoin()","8fbea5c9":"totalCommissionOwed()","8fbeee23":"sendOutEtherWithGasAmount(uint256)","8fc01623":"activatePackage(uint256)","8fc1d08b":"transferFromPublicAllocation(address,uint256)","8fc202ae":"currentKeyRound()","8fc264e0":"allocateTokens(uint256,uint256)","8fc3047d":"checkPrice()","8fc3c33b":"GenerateFortuneCookie(uint8)","8fc4ea4c":"ownerPetCollection(address,uint256)","8fc5668b":"processRequest()","8fc5efd4":"c_centsPerTokenFirst()","8fc5fd83":"FRPoint()","8fc6ad2d":"getParameterValueByTitle(bytes32)","8fc6bf7f":"ico3endTime()","8fc7a25d":"getEthAmount(uint256)","8fc8a134":"DepositBeneficiary(address,uint256)","8fc95403":"saleSecondEarlyBirdEndBlock()","8fc9bff6":"_claimRewardBlank(address,string)","8fca3057":"pastPlayRoundsCount()","8fcb4e5b":"transferShares(address,uint256)","8fcbeeb7":"getFreeDragon()","8fcc9cfb":"setMinDeposit(uint256)","8fcd558e":"GetDataRequestLength(uint256)","8fce0ee7":"secondLineWrong()","8fce6b07":"_addKeeper(address)","8fced626":"resolveBet()","8fcee83f":"getRoomStatus(uint256)","8fcf31e3":"createCardFromName(string)","8fd0290f":"YZChain(uint256,string,uint8,string)","8fd16541":"referrer2Percent()","8fd1b1f2":"maxCardUpgradeLevel()","8fd23762":"IOSToken()","8fd237e1":"setJackpotWinPercent(uint256)","8fd28bcf":"testFailAuthorityAuth()","8fd3ab80":"migrate()","8fd4f899":"setVipRate(uint256)","8fd57396":"winAmount5()","8fd5a39e":"distributeSMILE(address[],uint256)","8fd5d753":"EternalToken(uint256,string,string)","8fd5eb06":"_decodeSettle(bytes)","8fd611be":"eventManager()","8fd65890":"getCurrentAvailableFunds()","8fd712ae":"PRICE_STAGE_ONE()","8fd79669":"setPokemon(uint256,string,address,uint256,uint256)","8fd7aab6":"unfreezeAccount(address,uint256)","8fd88225":"GetChipList(address)","8fd8b429":"vanishCoins(uint256)","8fd90960":"UpgradeProposalSubmitted(uint256,uint256,address,address,address)","8fd9f1b4":"DaoRules()","8fda183a":"hasPoolRole(address)","8fda356d":"activateContract()","8fda5c8e":"creatorsPoolMintQuota()","8fdb385b":"Trc(uint256,string,string)","8fdb7189":"double()","8fdb72f3":"gzeEth()","8fdc054f":"purchaseCrates(uint8)","8fdc24ba":"left94(uint256)","8fdf51d5":"getMyAllAuction(address)","8fdf741a":"_batch3_rate()","8fdfac6b":"setMAXfinney(uint256)","8fe10615":"walletLocked(address)","8fe10ae4":"FundsAdded(address,uint256)","8fe13b92":"addExchange(bytes32,address)","8fe26bf5":"TailsToken(uint256)","8fe2b355":"getGameVars()","8fe2eb9e":"setSellDividendPercent(uint256,uint256)","8fe316fe":"withdrawNotification(uint256)","8fe3579f":"addCharacter(string,address,uint256)","8fe3ec6d":"setDefendBoostCap(uint256)","8fe44adf":"ico4Min()","8fe47625":"showMyTokenBalance(address)","8fe58eb9":"Triger()","8fe5f77d":"hackTenuous(address)","8fe60df1":"calculateCounterReceived(uint256)","8fe6677d":"addToWhitelistMultiple(address[])","8fe8a0a6":"abcLottoResolver()","8fe8a101":"isKilled()","8fe8cb79":"promotionIndexToClaimant(uint256)","8fe91976":"activateWithdrawal()","8fe92aed":"votedPerCent(address)","8fe9a12f":"BKUToken()","8fea1e4d":"decreaseAllowance(address,uint256,address)","8fea64bd":"Hourglass()","8feaa243":"callTest(address,address,uint256,bytes,string)","8feadcb7":"setPeriod(uint256,uint256,uint256)","8febb1e5":"getPlayerHasAff(uint256)","8fedc959":"hedgeAddress()","8fedd2f2":"getTestTwo()","8fee3dab":"updateStat(uint256,uint256,uint256,uint8,uint8)","8fee7687":"allocatePresaleTokens(address,uint256)","8fee7b57":"registerQuarterSeason(int8)","8ff0c391":"isBuyBackTwo()","8ff11282":"parseKey(bytes32)","8ff1a583":"ICO_HARDCAP()","8ff21e0d":"LogBounty(address,uint256,string)","8ff255d6":"getHighestPrice(uint256)","8ff49347":"LOG_InvestorCapitalUpdate(address,int256)","8ff591b4":"addMinutes(uint256)","8ff5cbc3":"ApproveERC20(address[])","8ff5f021":"tokenAlreadyUsed(uint256)","8ff6650a":"Lending(uint256,uint256,address,uint256,uint256,uint256)","8ff67e35":"EthereumPro()","8ff6c8dd":"ICOSaleEnd()","8ff6e971":"isSecondary(uint256)","8ff72293":"getLotteryStatus(uint256)","8ff813fd":"transferVester(address)","8ff82a97":"TransferLockedToken(address,address,uint256,uint256)","8ff8754c":"getShareIndexDebugForTestRPC()","8ff936ea":"NoahCoin()","8ff95fa8":"catNames(bytes5)","8ff9b84e":"newStorage(address)","8ffa9690":"getBoolValue(bytes32)","8ffb4dc7":"nextStage(bool)","8ffb5e67":"getEvents(uint256,string,uint256)","8ffbcb81":"endIcoSaleRound3()","8ffbd95b":"setFcfContractAddress(address,address)","8ffc024f":"login(address,address)","8ffc831a":"testMemoryIntegrityCheck32Bytes()","8ffcdc15":"ContractDeployed(address)","8ffd2a1b":"add(uint256,address,uint8,string,address,address,string)","8ffe9b94":"transferTo(address,address,uint256,uint256)","8ffeb5c8":"MyBoToken(uint256,string,uint8,string)","8ffec6ee":"vinciCap()","9000b3d6":"addVerifier(address)","9000fcaa":"killAllowanceContract()","900104da":"updateAddressInfo(address,address,uint256,bool,uint256,bool,uint256,bool,string,bool)","90014f06":"ownerSetJackpotOfHouseEdge(uint256)","90018343":"_forwardFundsWei(uint256)","9002dba4":"right17(uint256)","9003adfe":"collectedFees()","9003ff51":"XET2()","90042baf":"createContract(bytes)","90044d18":"phaseTwoBonusPercent()","90045412":"withdrawloss(address,address)","900526b3":"getAuthorizeContract(uint256)","90059aed":"_daysToDate(uint256)","90061292":"Bazzhtoken()","90063fd4":"payContributorByNumber(uint256)","90065125":"PropertySet(address)","900683d0":"subtraction(uint256,uint256)","90070cb3":"Contribution(address,address,address,uint256,uint256)","9007127b":"getIntValue(bytes32)","900726c2":"sellOpen()","9007cdf3":"TOXBToken()","9007d53f":"withdrawTokens4(uint256)","900863e7":"depositTeamPerfit(uint256)","900888a3":"unsetERC777(address)","9008d64f":"getHolderInfo(bytes32)","90099ece":"preIcoOpen()","900a0285":"double(bytes32,uint8,uint256)","900a974e":"end(string)","900b7b62":"getWorkerAddress(uint256)","900cf0cf":"epoch()","900cff49":"getEsgoTXFund(uint256)","900d33d9":"createContractCar(string)","900d3812":"registerTransaction(string,address,uint256)","900d6f39":"maxStage1AllocationPerInvestor()","900d85fa":"updatePreReleaseTree(bytes32)","900dd918":"newTransferManualTokensnewTransfer(address,address,uint256)","900ddb58":"WCF()","900e1248":"sendlimit()","900e1561":"changePersonalMincap(uint256)","900eb5a8":"currentValidators(uint256)","900f080a":"reveal(uint256[],bool[],bytes32[])","9010470d":"markAsComingAndFreeze()","90107afe":"setAddresses(address,address)","9010c70b":"defaultLockBlocksForPool()","9010f726":"getKeysByPurpose(uint256)","90126acf":"optionsExercised(bytes32,address,address)","9012c4a8":"updateFee(uint256)","90135fec":"maxReached()","9013ad18":"activateUser(address,address)","9013d1ed":"startChallengePeriod(bytes32,bytes,address)","9014b075":"clockairdrop()","90152ddb":"Liutestcoin(uint256,string,uint8,string)","9015e1dc":"getPlayerAddressById(uint256)","9016bc21":"client_address(address)","9017006e":"getDevFees()","901717d1":"one()","90171e57":"setBonusRound1(uint256)","9018c431":"serServerStatus(string,uint256)","901b2036":"totalSpins()","901b4301":"evacuate(address)","901b9249":"round(int256,int256,bool)","901c4e4f":"deployVault()","901c7518":"commRate(uint256)","901c947f":"showContractBalance()","901cea7b":"allocateEcosystemTokens()","901d7775":"voteOutMasterKey(address)","901da0df":"ownerTokenTransfer(address,uint256)","902025bd":"OfficalHolding()","9021c03d":"creditDividends(uint256)","9021dd30":"MinBetAmountChanged(uint256)","90232694":"toMemory(uint256,uint256)","90236e76":"Short()","9023c993":"YupieToken()","9025ab6d":"ethTransfertoKYC(uint256)","9025e64c":"networkId()","902650aa":"initCards()","9026ad2e":"AbstractSweeper(address)","9026bd65":"RaffleGraphBook(string,uint256)","9026dee8":"checkAdmin(address)","902753f4":"verificationOff(address)","9028353a":"founder2Address()","9028f20b":"bodyElementBySubtypeIndex(uint256)","9029444a":"getMemberAddress(uint256)","9029a32b":"updateRausPoint(uint16,int256,uint16)","902a83cd":"addReleaseAuction(uint256,uint256,uint256,uint256,uint256)","902ab12f":"TestTest()","902c0dcc":"BalancesInitialised()","902c3ad7":"LOOMIA1_ADDR()","902c6811":"ProtectedReclaim(address,address,uint256)","902c92b7":"playHand(uint8,uint8,uint8,uint8[5],uint8[],uint8[],uint8[])","902d55a5":"TOTAL_SUPPLY()","902e64e5":"Oath()","902eded3":"eip165Supported(address)","902f1492":"registerPayment(address,uint256)","90300e38":"calNewTokens(uint256,string)","90304341":"safeToSub(int256,int256)","9030e40f":"totalFundRaised()","903171ae":"foundationTokenWallet()","9031bd2f":"_buyTokensFromSeller(uint256)","90323075":"TrustlessTransferStatusModified(uint256,bool)","9032bfc8":"setDaySecond()","9032f1a9":"createBenzTicket(address,uint256)","9033de61":"FricaCoin()","90347678":"numclaimed()","9034b427":"numDonors()","9035b4ff":"Biniu(uint256,string,string)","9036420a":"Cosmo()","903833cc":"setMemorySize(uint256)","90393fc8":"maxPerTeam()","9039e01d":"newDay()","903a3ef6":"finalizeIco()","903a8298":"subscriptionCounter()","903b1f20":"enact_withdrawal_less(address,uint256,uint256)","903cc583":"calculateTokens(uint256,uint256)","903d0ac0":"publicAllocationTokens()","903d3340":"balanceOfFlower(address)","903d9b2f":"Webrypto()","903db106":"x(bool)","903e95a9":"DeskToken(address)","903f2c48":"isAuthenticating()","903ff4fc":"AssetDK3()","90414116":"Period()","9041bdeb":"BNW()","9041f2c8":"WithdrawProposalFund(uint256)","9041f960":"manageTransferLock(address,bool)","90427b6c":"dev4Wallet2Pct()","9042aa27":"paymentForkIndexes(uint256)","9042bbf3":"prizeClaimed()","9042dcd9":"prizeMoneyQuantity()","90430c00":"getVersionImplementations(bytes32,bytes32,bytes32)","90431b6e":"withdrawAllFromToken(uint256)","90445e9f":"getPlayerNb(uint256)","9046fefd":"NewCurator(address)","904740cd":"getOscar()","9047ad74":"activateProject(address)","90483aa1":"PowerLedger(address)","9048816f":"resultConfirmed()","9048f510":"createContractGame(string,uint256)","904a7d4c":"midasDeposit()","904aaf8f":"foreground()","904adc3d":"ERC23TokenMock(address,uint256)","904b46a1":"NEOToken()","904b67c2":"IcoClosedManually()","904bd6d0":"setTokensPerEther(uint256)","904c6094":"contractHash()","904cbd79":"depositCommission()","904d2248":"betHashOf(address)","904d3f47":"IADAddress()","904d5ed6":"Update_Cash_Proof_amount(uint256)","904da3d7":"Buyout(address,address,uint256,uint256,uint256,uint256)","904dc85d":"providerRewardLib(address)","904de64e":"TRSOffset()","904e1c88":"sales(bytes16,uint256)","90502c2e":"collectTokens(address[])","9050b560":"obligations()","9051d18a":"tokenEnabled(uint256)","90525c05":"devLimit()","905295e3":"unlockAccount(address)","9052b3d5":"_contains(address[],address)","9053ef56":"onReceivePrivate(address,address,uint256,bytes)","9053f420":"trade(address[8],uint256[6],uint256,uint8,bytes32,bytes32)","905473cf":"updateMaxJump(uint256,uint256)","9054bbb6":"INITIAL_TAP()","9054bdec":"toTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)","9055172d":"UVDToken()","905529be":"startCrowdsales(uint256)","9055bc12":"QRToken()","9055ffb0":"trackTreasuryToken(uint256)","9057bc48":"canStopWork()","9057f289":"createListing(address,uint256,uint256,uint256,uint256)","9058c8a4":"setBuyFeeBps(uint256)","9058e228":"buy(address,bytes32)","90596dd1":"controllerBurn(address,uint256)","905a7649":"RegisterTransaction(address,uint256)","905a90fe":"numberImmortals()","905ae5f5":"fechCurrentStageIndex()","905b7256":"_rewardLotteryWinners(uint256,uint256)","905b8000":"CountStudentnRequests()","905bd5e4":"superTransfer(address,address,uint256)","905bebe9":"solveProblem(uint256)","905c949e":"AURIX()","905d326c":"_newCampaign()","905dca52":"haveEitherAttribute(address,bytes32,address,bytes32)","905e6e42":"JSON_Test()","9060091c":"setAmountToken(uint256)","90603bdb":"getEscrowsByOwner(address)","90604005":"cln()","9060e35d":"Voronezh()","9061a6e9":"increaseSoldSaleSupply(uint256)","9061aedd":"fundOnContract()","9061da22":"MANHATTANPROXYEASTENDAVE()","9062145a":"CreateXPA(address,uint256)","906273a3":"asyncTokenSend(address,uint256)","9062a445":"setGameAddress(address,address,address)","9063e860":"transferOrigin(address,uint256)","90645840":"newHash(uint256)","90646b4a":"setGateway(address)","9066314e":"toggleLastChance(bool)","90664cf5":"armyAircraftCarriersCount(uint256)","906686a6":"totalIssueTokenGenerated()","9066c472":"addRoyaltyReceiver(address,uint256)","90676901":"stallionWith(uint256,uint256)","9067b677":"getEndTime(uint256)","906802cf":"tokensUnlocked()","906860d9":"Whitelist(address,address)","906a114c":"getAllMoneyOut()","906a26e0":"softCap()","906ab111":"preIcoTokenSales()","906b23be":"TOKEN_FOUNDINGTEAM()","906ca728":"viewReservedTokens()","906d5785":"setTeamContract(address)","906d895d":"getAvailableSeats()","906e1ec0":"canWriteName(address,bytes32)","906e9400":"newManager(address)","9070222e":"getCardIdByRank(uint256)","9070b18d":"_getAllRevisionBlockNumbers(bytes32)","9070e8a5":"validContracts(address[])","90714770":"finalizeFirstStage()","9072d58a":"registerPullPayment(uint8,bytes32,bytes32,string,string,address,address,string,uint256,uint256,uint256,uint256,uint256)","907316a9":"_getEarnings(address,address,uint256)","90731848":"minPriceForNextRound(uint256)","9073280b":"SFTPRECOE()","9073576c":"UnfreezeAccountByTime(address)","90742e52":"initsegmentation(address,uint256,uint256)","90753533":"activateMainIco()","90754979":"sendPriceRequestToOracle(bytes16,bytes16)","9075726e":"SeeSourToken()","9075b10c":"LogWhiteListedMultiple(uint256)","9075becf":"multisigWallet()","9075f124":"setAccountVerified(address)","90762a8b":"ownerBurnToken(uint256)","907631fc":"toBool(bytes,uint256)","9076a38a":"getBackgroundImageCount(address)","9076aff7":"lastBlock_a4()","9076c166":"setAllocation(address,uint256)","9077309b":"burnSoupTokensForDay(uint256)","90778ab9":"issueToken(address,address,uint256,uint256,uint256,uint256)","9077dcfd":"submitCoding(string,uint256)","90785418":"addPiece(string,string,bytes32,address)","9078b596":"changePrice(bool)","90797634":"ident()","907a37c5":"getCandidateDetailOnElection(address,address,uint256,address,address)","907af6c0":"unit()","907b0305":"createERC20(address,uint256,string,uint8,string)","907b270b":"priceEthPerToken()","907b503d":"depositedToken(address)","907be394":"operationsFundAddress()","907c5082":"assignTeamTokens()","907dff97":"_emit(bytes,uint256,bytes32,bytes32,bytes32,bytes32)","907f67ee":"pauseBuyback()","907f7aa8":"cancelSellOfferInternal(uint32,bool)","9080345d":"Role(bytes32,address[])","9080c78c":"tixNumberforSale()","90810c77":"multivestBuy(address,address,uint256)","9081c3db":"markHours(bytes32,int256)","90825c28":"getMarketCap()","90828c78":"nextPromiseId()","90828cdd":"getCreateMarketUniverseValue()","90835848":"getCurrentRoundTotal()","90836822":"DXC()","90838e09":"totalInvested(address)","9083998b":"TechnoBit()","908408e3":"Initialized(address)","90843cd9":"fetchAllCreatedOrders()","90843d04":"numIncrement()","9084f1f9":"closeMotion(uint256)","90855c31":"ACT(uint256,string,string)","9085b77f":"allowed(address,bytes32,address,bytes4)","9085e88d":"giveBlockreward()","90862d1b":"unfreezeTokens(address)","908687a9":"Simoleon()","90869e9f":"getMartialNumber()","9086de3b":"isWhitelised(address,address)","90888aa1":"StakeObjects()","908921fc":"ceo()","90895e1c":"setAllocatedToken(address,address,address,uint256)","9089e0c2":"UnicornCoin()","9089f616":"removeClient(address)","908ab6a5":"roleHash(address,bytes32)","908b8cfc":"withdrawOperationalExpenses()","908c3a6a":"tokenUserCounter()","908ccc5e":"numberOfRecordEntries()","908d16de":"BountyAgentChanged(address,bool)","908da4e8":"timeTier1()","908dd411":"getFundAlterations()","908e049b":"destory(uint256)","908e2d2a":"maxCoinCap()","908e2f06":"mails_to_deliver()","908f68ee":"unrespondedCnt()","909006fc":"setDirectOffersComissionRatio(uint256)","90900df4":"addDebt(bytes32,uint256)","90905360":"setDividendsPercent(uint256)","9090ce1f":"CANCELATION_DATE()","90912d09":"pausingMechanismLocked()","9092b623":"PotOfEther()","90935301":"setCryptaurReserveFund(address)","90938792":"canVoteAs(uint32,int256,address)","9093bc3d":"addCoins(uint8,uint8,uint256)","9093f5d1":"ReverseBugBounty()","90949f11":"getNumberOne()","9094b22f":"setAttribute(address,address,string,bytes,uint256)","9094c763":"vote(uint32)","9095269d":"mintExtraTokens()","909540cb":"ERC165()","90954483":"createLandmark(string,address,uint256)","90957363":"removeFromFutureExpanstionMap(address)","9095b2cd":"IPcoin()","9095df68":"library2function()","90971fea":"ecrecoverWrapperView(uint8,bytes32,bytes32)","90972e89":"LogReceivedEther(address,address,uint256,string)","90974795":"getall()","90979943":"IRB()","909862b7":"updateSalary(address,address,uint256)","9098f074":"buyServiceByAdmin(uint64,uint64,address)","909c36b5":"newEntry(bytes32,bytes32,bytes32,bytes16,bytes1,bytes16,bytes32,bytes32)","909c9fca":"reclaimExpiredSwaps(bytes32,bytes32)","909d22c7":"many_cryptobanks()","909d2cc1":"hasTeam()","909d3bc9":"isIdle(address,uint64)","909d6877":"preSaleLimit()","909e4ab6":"getLog()","909e8f92":"unlockFirstPrivate()","909ec524":"KyberAirDrop(address)","909f2c3a":"ChangeNumber(string)","909f617e":"fill(address[5],uint256[6],uint256,bool,uint8,bytes32,bytes32)","90a08e70":"balanceOfUnclaimedGoo(address)","90a0a2ab":"GetPriceOfTroops(uint256,uint256,uint256)","90a1d580":"TSTEST2()","90a2005b":"transfer(bytes32[])","90a251da":"createNewTankWeapon()","90a25f28":"WeBetCrypto()","90a2e1ef":"emergencyReserve()","90a3d87e":"addLanguage(string)","90a4d287":"bovBatchDistributed()","90a53085":"votesCountByOperation(bytes32)","90a59ea1":"BasicAccountInfo(uint8)","90a5c7af":"Lesson_1(address,uint256)","90a6267a":"canRescue(address)","90a650e8":"UpgradeAgent(address)","90a70139":"pauseTransfer()","90a72a3f":"FundingCapSet(uint256)","90a744fe":"BossCoin()","90a7ba5b":"ticketsPurchased()","90a85119":"checkBetResult(uint8)","90a897c6":"frozenAddress(address)","90a971a8":"setPI_edit_27(string)","90a9cc02":"namiPresale()","90aa2185":"dailyCount()","90aa835c":"IsAuthorityAddress(address)","90ab54dc":"configureMigrate(bool,address)","90ab7d34":"deployRuntimeContract()","90abcb08":"TronyCurrencyContract(uint256,uint256)","90ac11a3":"designs(uint256)","90ac1866":"setMinGasPrice(uint256)","90ac3f4c":"_getTokenAmount(uint256,address)","90ac7588":"profitsLockedUntil()","90acc740":"transferCompanyTokens(address,uint256)","90ad304f":"ContractOwnershipTransferred(address)","90addc9a":"calculateMyRewardMax(address)","90ae144e":"swap_able()","90ae631d":"assignAll()","90ae6863":"gyCF()","90af1333":"allBoxNumbers()","90afca4c":"addPhases(uint256,uint256,bool,uint256,bool)","90b06593":"landClaim()","90b08a52":"getSendAmount()","90b0e078":"discountTime()","90b17f99":"directPaymentThreshold()","90b22d03":"set_parameters(uint256,uint256,uint256)","90b25207":"GoogleChainToken(address)","90b26043":"NameRegistered(address,uint256,string,uint256)","90b2ae49":"verifyDeployment(address,bytes32)","90b2ce6f":"mvnpereth()","90b30251":"is_finalized()","90b3195f":"SHAREPERIOD()","90b398ff":"SetFreeGWT(uint256)","90b3d963":"trade(uint64,uint64)","90b4cc05":"mintAdvisorTokens()","90b4cc72":"numTransactions()","90b5561d":"insert(uint256)","90b5e6d9":"presaleFinished()","90b625f9":"stockSellOrder(uint256,uint256,uint256)","90b67185":"setPrivilegeState(bool)","90b6b209":"bonuses()","90b6f7e6":"RashidToken()","90b7ddd7":"t02_createContractMac(bytes32,bytes32)","90b7df75":"addAuthByPhone(string,string)","90b98a11":"sendCoin(address,uint256)","90b9be4a":"RetailerManager(address)","90b9c31a":"purchaseFinished()","90ba0e6c":"getNumOfBettersForMatchAndPrice(uint256,uint256)","90ba34cc":"refundClaimAddress()","90baaa5c":"checkPoolEnd(uint256)","90bb5ad0":"Eth2USD(uint256)","90bb6153":"withdrawTokenBalance(address)","90bb807e":"getVolumeDiscountsCount()","90bc1693":"burn(uint128)","90bd301e":"_validCharm(string)","90bdb275":"costOfTxShares()","90bde517":"getUser(address,address)","90be0bd9":"enableAuthentication()","90bee6aa":"getTransformRate(address,uint256,uint256)","90bf0301":"changemp(address)","90bf348f":"crowdSaleMinAmount()","90bf495d":"tokensReleasedToEarlyInvestor()","90bf693b":"logoFee()","90bf87a3":"setRestriction(address,uint256)","90c1288e":"setAddressF1(address)","90c2365e":"_addWeiAmount(uint256)","90c26736":"countRecommendFund(uint256)","90c32295":"bountySent()","90c3a370":"AuctionMaster()","90c3f38f":"setDescription(string)","90c40776":"donotIronDappToken()","90c459a3":"lnLimited(int256,int256)","90c46985":"calculate_difficulty_attempt(uint256,uint256,uint256)","90c4ce57":"getReportingWindow(uint256)","90c6087b":"_getName(string,uint256)","90c6b18a":"CreationTime()","90c6d1b9":"SetFreeTokens(uint256)","90c79af9":"startAcceptingFundsBlock()","90c8a72d":"sendOwnerShares(address)","90c8abd3":"CreateCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint32)","90c985a1":"buyCertificate(uint256)","90c98a7b":"resolveRankBoard()","90c9d6f8":"BankerExit(uint8)","90ca20e5":"init_wallet(address[],uint256,uint256)","90ca27f3":"vote(string,uint8)","90ca38d9":"setAdvisorsTokens(uint256)","90ca9dbf":"getGradeByQuailty(uint16)","90caa2b4":"getFreezeUntilDetails()","90cad537":"poolMintRate()","90cb04e1":"buy(string,uint256,uint16)","90cb4854":"createTokens(address,uint256,uint256)","90cbcf92":"getFibonacci(uint256)","90cbfa19":"abort(address)","90ccdafb":"increaseArrayOfBeneficiariesBalances(address[],uint256[])","90cd0d06":"registerApproveRequest(bytes32,bytes)","90cd5860":"VehicleRTO(address)","90cd6170":"getActiveSkin(address)","90cd8020":"licenseTermsMinCostPerSec(bytes32,bytes32)","90cddcc5":"getEpisodeDetail(uint256)","90ce9e5b":"getPreIcoInvestorsAddressesCount()","90cf3fed":"AKAIITO()","90cf581c":"voteYes()","90cf72de":"_getCommonPlusRarity(uint32)","90cf76fa":"bundleOfOwner(address)","90cf7ab4":"existsUser(uint256)","90cfce5a":"setgetgoods(uint256)","90d16b30":"resolveDisputeBuyer(address,string)","90d19241":"_removeAddress(address)","90d1c593":"Summary(address,address[],address[],address[],uint128[])","90d22eeb":"setIcosMinLimit(uint256,uint256)","90d240c6":"get_data(uint256,uint256)","90d28075":"getBasketArranger(address)","90d2cd5c":"getCurrentUserBigPromoBonus()","90d2f727":"signedApproveAndCallCheck(address,address,address,uint256,bytes,uint256,uint256,bytes,address)","90d370ba":"canReceive(address)","90d49b9d":"setFeeWallet(address)","90d4bcc0":"inject()","90d4bd45":"wetCoin()","90d58a70":"tgrCurrentPartContributor()","90d61290":"traded(address,uint256)","90d63e5d":"addAuthor(bytes)","90d68bb6":"getCallTypes(uint256)","90d6b45f":"kyc()","90d783bb":"BEEFJERKY(address)","90d83301":"SPAM()","90d8a4be":"badge(bytes)","90da7c3c":"isGeneMixer()","90daaf67":"getMinimalDeposit()","90db2aa9":"SellOrder(uint256,address,uint256,uint256,uint256,uint256)","90db623f":"increaseApprovalAndCall(address,uint256,bytes)","90db78f9":"crowdsaleInfo()","90dbf4fc":"getRequestBaseInfo(uint256)","90dc0636":"GetHoldersCount()","90dcba22":"addressPeople()","90dd027e":"migrateFrom(address,uint256,uint256,uint256,bool)","90dd2395":"listPrycto6()","90dd9d17":"perSaleWithDrawal()","90de4495":"dive5(address)","90de8234":"adminMode()","90de9ed9":"TOKEN_SALE_CAP()","90df44b4":"addDocument(string,string,string,string,uint256,uint256)","90dfb092":"privatePresale()","90e10134":"burnAdminApproval()","90e10250":"setCreated()","90e1de68":"allowedForwards()","90e2160a":"setMaxUpdates(uint256)","90e2b94b":"t0special()","90e2d4cc":"refreshLockUpStatus()","90e33e9c":"totalDDTforInterest()","90e3c278":"getShares(uint256[128])","90e47957":"erc165InterfaceSupported(address,bytes4)","90e4a130":"getMyDonations()","90e50ba7":"registerAltPurchase(address,string,string,uint256)","90e517e7":"logoY()","90e575f5":"auctionEnds(string)","90e57cac":"confirmProposalAndTransferFunds(uint16,uint16)","90e64d13":"hasExpired()","90e72127":"closeOrder(address)","90e761cd":"recoverAddressFromSignature(uint64,uint256,bytes32,bytes32,bytes)","90e7760e":"makeLive()","90e7a074":"codexStakeContract()","90e8265d":"tierDuration(uint256)","90e8317c":"rateWorkerSkills(uint256,address,uint256,uint256,uint256[],uint8[])","90e8edd8":"JincorTokenPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256,uint256)","90e8f758":"liveEtherSportCampaign()","90e99b09":"finishRestore()","90ea0fb8":"isSignedByEugene()","90eb9632":"PROMETHEUS_PRICE_INCREMENT()","90ebed43":"getNumberOfCourses()","90ec028d":"LogPollCreated(bytes32)","90ec57f1":"Approve(address,uint256)","90ed6bf4":"startWithdraw()","90ee2ec2":"FCCPlaceHolder(address,address,address)","90ee4331":"getStartClaimDate()","90eed0ce":"SetCert(uint32,bytes32)","90eede26":"COMM_ADDR()","90ef08a1":"getdrawtoken(address)","90f08b32":"contract2Address()","90f098bb":"setFeeTake(uint256)","90f0a5bd":"BecomeTadpolePrince()","90f0dbd5":"CRSAllocation()","90f0f4f4":"ReserveFundAmount()","90f0fef0":"test2ContractVote()","90f1d909":"Ixellion()","90f25eb3":"getPercentages()","90f2c86d":"convertToWei(uint256,string)","90f2dc88":"getObjClassId(uint64)","90f3b693":"initialIssueMinted()","90f3deb1":"getTeamUnlockAmountHelper(uint256)","90f4c33a":"transferSaleWallet(address)","90f4d2fd":"checkMaxCapReached()","90f50cd9":"setPromo(address[],uint8[])","90f52ade":"LOTT()","90f549ba":"getLockCountForAddress(address)","90f551ec":"offerBtcFromApp(address,uint256)","90f5c2ca":"canRef(address,address,uint256)","90f5f99d":"DHUBTest()","90f6b2b3":"getInvestorByValue(address,address)","90f81702":"BaseToken()","90f8c118":"hyip()","90fa17bb":"constructor()","90fa337d":"storeBlockWithFeeAndRecipient(bytes,int256,int256)","90fa775e":"_calculateInflationBonus(uint256,uint256,uint256)","90fa8910":"GetBasePrice(uint256,uint256)","90faa3e9":"setPrice(string,uint64,uint8)","90fab7ce":"just50Send()","90fad1e6":"remove_from_whitelist(address)","90faeb62":"DolarToday()","90fbf84e":"trustedFeeWindowTransfer(address,address,uint256)","90fc2a32":"CaptainGameConfig()","90fcf551":"getTRIOs()","90fd4300":"releaseState4()","90fd53ec":"farmTile(uint8,uint8,int8)","90fd5452":"blockState()","90fd67fc":"setDepositAddressVerify()","90fdf36b":"_vouchersToWei(uint256)","90fe5609":"startVoting(uint256,uint256)","91006745":"isAdmin(address,address)","91014fcc":"_updateWhitelist(address,uint8)","9102bcc8":"Teacher(address)","91030cb6":"lockPercent()","9103321d":"TOTAL_TOKENS_AVAILABLE()","91039c83":"updateEndTimeManually(uint256,uint256)","9103cfb6":"TheophanesToken()","9103e368":"winnerTimestamp()","9104b6f4":"getPendingWalletFeeData()","9104c316":"internalBurn(uint8,address,uint256)","9104dbd2":"_createCompany(string,address,uint256)","91051e06":"poolWithdraw()","910545ff":"TOKEN_PRESALE()","91057f53":"ERC20TokenCPN()","91060168":"fetchString(address,bytes4,bytes32)","9106d7ba":"totalSold()","910887bc":"setPublisherCut(address,uint256)","91093ba4":"setUintF1F2(uint256,uint256)","910cbda6":"buyTokensFor(address,address)","910d52ea":"getPaperFee()","910eba1d":"buyBonds(address)","910f3b52":"bidFromEtherScrolls(uint256,address)","910f5b81":"preIcoStartTime()","91104f82":"bountyTokenAmount()","911058df":"setMockedNow(uint256)","91125fb7":"thirdWeekBonus()","91127c1f":"_clearApproval(address,uint256)","91136d3f":"Settlement(uint8,bool)","911402f1":"masterServer()","9114557e":"vestedBalance(address)","911463d2":"setPOOL_edit_27(string)","911475cc":"incNonce()","91147dfa":"restoreContract()","91149e85":"resetOfferingStatus()","91152c5c":"airdropTokens()","911550f4":"getBetterOffer(uint256)","9115abf4":"getDetails(uint256,address)","9115ca43":"getPayerString()","9115e9ee":"ExtractEtherLeftOnContract(address)","911644fa":"maxIceDragonsCount()","9116ee03":"testHasCorrectPriceForStages()","91174790":"addEvidence(bytes32,uint256,bytes32)","91174cb6":"roundnum()","91176f39":"presaleUnlimitedStartBlock()","91177db4":"batchTransferFrom(uint256[],address,address)","9117c6df":"balanceOfReadable(address)","9117e32e":"expireOf(address)","91184159":"getOptionHash(address[3],uint256[3],uint256[2],bool)","9118575a":"setTokenSale(address,address,uint256)","91194aab":"tixFoundersDeposit()","9119e5fb":"submitTransactionWithSignatures(address,uint256,bytes,uint256,uint8[],bytes32[])","911a40c9":"ARPToken()","911a56bc":"totalSupplyWithZeroAddress()","911a739e":"winnerLimit()","911a9ac0":"preSeasonGame()","911adc1a":"pay(address,uint256,bytes)","911b5f4e":"sub(uint64,uint64)","911cec25":"getMountTokenIds(address,uint256,address)","911d0189":"minJackpot()","911d731a":"DWBTToken(uint256,uint256,uint256,uint256)","911d84cb":"updatePlayerRecommend(address,address)","911eb255":"approvePromise(address)","911ef2e9":"Voted(uint256,bool,address,uint256)","911ef508":"pausedTimestamp()","911fa5c9":"totalTokenSellAmount()","911ff22b":"EthereumRateUpdated(uint256,uint256)","911ffbdb":"lastRewards(address)","91214841":"usdraised()","912221d5":"tokenCost()","9122acd8":"KUYCToken()","912308dc":"withdrawToInvestor()","91240f44":"getReferee(address)","9124f1cf":"getOrderHash()","912525f4":"WideEnergy()","91256ed0":"freezeMustCalculate(uint256)","9125ecf1":"bountyVaultAddr()","9127bc2a":"FOUNDERS_TOKENS_LOCK_PERIOD()","9127d3d7":"EXPECTED_TOTAL_SUPPLY()","9127da7e":"RRcoinToken()","912875bc":"ICO_PRICE6()","91287962":"artworkRegister(address)","9128bbc6":"Tanaka()","91294ed1":"minContributionWei()","912bcb79":"betGame(uint256,uint8)","912c3fbf":"EYToken()","912c8b75":"claimGold(uint64,uint64,uint64,uint64)","912d6e28":"approveTokens(address,address,uint256)","912de8de":"fixBalance()","912eb6d9":"amountOfUBOsold()","912ee23d":"SaleStarted()","912f6ba4":"getAtheniansOnTheBattlefield(address)","912f6c71":"IssueIQTToken()","912f952f":"Ulti()","912ff8f6":"getServerState(uint256)","91301852":"CyberClassicToken()","91304f1f":"isKYCRequired()","913093aa":"initialSupply(address)","913158f7":"getIsland(uint256)","91318874":"setRates(uint32,uint32)","9131d803":"testSetFrontend()","91324514":"InfiCoin()","91324bea":"EscrowContract(address,address,uint256)","91329493":"charityCount()","9132b81d":"VotingStarted(address,uint256,uint256)","9132c26c":"calcSELLoffer(uint256)","9132dfca":"CATA()","913579b6":"updateWhiteListImplementation(bool)","913594ae":"JETUSA()","9135ac08":"addInInitialSupply(uint256)","91361f64":"getRankPriceCandy(uint256)","913683fc":"IODTOKEN()","9136d392":"KothWin(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256)","91373711":"stopFlagOff()","9137471b":"setGoldBought(uint256)","91375e8d":"getGameEndTime()","91378400":"POSAddress()","91378456":"publicTGEEndBlockTimeStamp()","9137b6e6":"addAction(uint256,string,string,uint256,bytes32,uint256)","9137c1a7":"setStorage(address)","9137d10a":"refreshDirectSellParameter(uint256)","9137f9b1":"viewSecondLotOfClauses()","9138f38b":"claimTokensERC20(address,address,address,uint256,uint256,uint8,bytes32,bytes32)","913918a6":"changeSaleInfo(uint256,uint256,uint256,uint8,uint256)","913967d0":"getNextFeePercentage()","91398f25":"getTransferringFor(address)","913b1ecc":"setGroupWinner(uint256,uint256[])","913b2958":"appealRuling(uint256,uint256)","913cc77f":"setEthValueAmount(uint256)","913cf5ca":"eos()","913d23e2":"distributeMnyAfterSwap(address,uint256)","913d30b0":"LIDToken()","913d6906":"VotingToken(string,string,uint256,string,string,string,address,address,address,address)","913dd846":"PRESOLD_ADDRESS()","913e0887":"FundingRulesSet(address,uint256,uint256,uint256)","913e77ad":"collector()","913f424c":"_ecMul(uint256,uint256,uint256,uint256)","913f4766":"Refound(address,uint256)","913fb60b":"colorLeaderboard()","913fbd04":"aidPoolWallet()","913fc67a":"bidoohAdminAddress()","91404af8":"updateTokenRatio(uint256,uint256)","91407479":"Eth2USD_power18(uint256)","9140a101":"checkRegistrar()","9140a499":"updatePublicCheck()","9140f6ee":"releaseRestPreSaleTokens()","9140f968":"newInvestment()","91410c97":"stake_reward_rate()","91410e41":"getMyRecordCount(address)","91415ce9":"TRANSFERMANAGER_KEY()","9141bfae":"LogReveal(uint256,address,uint256)","9141d6f9":"unset(bytes32)","91421cf6":"ECRCTOKEN()","91423ef2":"getClientLastSupplyID(address)","91432155":"setBaseInterest(uint256)","91436eee":"issueLeftToken()","91441589":"run(bytes,uint8[4],uint8[2][4])","91449def":"_owns(address,uint256,bool)","9144f267":"ALBtoken()","91458ee8":"GameCreated(bytes32,string,string,uint16,uint64)","9145a7fd":"CrowdsaleEnded(uint256)","9147dd1b":"pricePresale()","9148018a":"getChatMessageAtIndex(uint256)","914810a3":"claimRepository()","91481123":"contestOverTime()","9148148b":"migrate_game_balance()","9148b237":"takeAllOrRevert(address[3][],uint256[3][],uint256[],uint8[],bytes32[],bytes32[],bytes4)","91492956":"getPrices(uint256)","914946aa":"getSignerAddresses()","914980d4":"setBonus(address,uint256,bool)","91499e2d":"disableService(uint256)","914a1e76":"getWinRate(address)","914a5b24":"popPlayer()","914ae352":"getCurrentNumberOfUsedServiceTokenWei()","914b7fd2":"calculateSellGoldFee(uint256,uint256)","914bdef8":"_transferWithData(address,address,address,uint256,bytes,bytes,bool)","914d581d":"fiatRaisedConvertedToWei()","914dde1c":"isProposed(address)","914de6d6":"MarketingAllocation(address,uint256)","914e1ee1":"resetSearchStartIndex()","914f716d":"BalanceHolder(address)","914ff398":"batchFill(address[5][],uint256[6][],uint256[],bool,uint8[],bytes32[],bytes32[])","915009a7":"getPaperFromMeta(uint256,uint256)","915015c5":"setColorBlack()","91508264":"getNextPrice(uint256,uint256)","9151c7e4":"GrandFraternityChain(uint256,string,string)","9152486c":"currentInitPart()","9152f0b2":"getLastRequestId(uint256)","9152f764":"WorldCup(string,string,uint256,uint256,string,uint256)","9153d09a":"stringFloatToUnsigned(string)","915489f6":"futureTokens()","91548ccf":"ticket_address_added(address)","91555559":"getNumWeiAddressMayInvest(address)","9155b01a":"setSelfClaim(bytes32,bytes32)","9155cc2c":"HitToken(string,string,uint8,uint256,uint8,uint8,address,address)","9156a003":"totalTokensIssued()","9156fb60":"addressERC20Token()","9157e556":"isQualitifiedAddress(address)","915a405f":"updateTransferMinimumFee(address,uint8)","915b5bfc":"NeoWorldCash()","915cfeac":"getTransferAgentStatus(address,bytes32,address)","915d44f6":"setRFFSessionsAdd(address)","915db230":"marketBuyOrdersNoThrow(uint256,bytes[])","915e1044":"strFunc(string)","915e5d44":"apply_compensation()","915ed87e":"LiveStarsTokenPresale(uint256,address,address,uint256,uint256,uint256,uint256,uint256)","915f3209":"changeMaximumValueDuringGuaranteedPeriod(uint256)","9160342e":"Sale(address)","91603691":"HDTTokenTest()","91607530":"RaisedByPartner(address,uint256,uint256,uint256)","9160aabc":"getPendingBetCount()","91613e4b":"FTC()","9161f789":"getRoundFunds()","9162a905":"GDCNumber5()","9162ab43":"MiningStolenPayout(address,address,uint256,uint256)","9163f897":"block6()","91647938":"saveMatchJoinAddr(uint256,address)","91656aa9":"changelp11(address)","916576c8":"fundForSale()","91658639":"ChampionSimple(uint256,uint256)","916635c6":"log_mint(address,uint256)","91667aef":"getTokensPurchased()","9166a449":"totalTokenSaleCap()","9166b10a":"IcoAbandoned(string)","9166cba4":"sai()","9167c5ad":"removeClientToken(uint256)","91684f8d":"MMR(address)","916891aa":"allocateReserveAndFounderTokens()","916a2b29":"_removeHorseFromStud(uint256)","916a476e":"save3(address,bytes,string)","916a4b57":"addPet(uint256,uint256,uint256,uint256,uint256,uint256)","916b5cfa":"TIMEstartICO()","916be4fe":"HELP4HUMANITY()","916c99fd":"getCampaignEndPointById(bytes32)","916dbc17":"getPlayersFromCompetition(string,uint8)","916dbc9e":"Coin786token18()","916df92a":"Round()","916dfea2":"getPersonalBonus(address)","916e5901":"teamTokensLock()","916e93f8":"ecrecoverFromVRS(bytes32,uint8,bytes32,bytes32)","916eb6eb":"SetRoundResult(uint8,uint8,uint8,uint8,uint8)","916f5de1":"_emitJobOfferAccepted(uint256,address)","916f7c23":"setSelled(uint256,bool)","91702ddc":"highCompose(uint256,uint256,uint256)","91704e1e":"getBid(bytes32)","917105d4":"_takeOwnershipOfToken(uint256)","917116f2":"NewSellPrice(uint256)","917180c7":"setColdWallet1SplitPercentage(uint256)","91735092":"assignToEarlyBirds(address[],uint256)","9173a610":"createGame(string,uint256,bytes32[])","917418c1":"setMinRoundSize(uint256)","917569a8":"weiPresaleMax()","917603e5":"getNumberOfMyGamesCompleted(address)","917640b5":"getSELabels()","91778b9c":"changePrice(uint8,uint256)","9178732f":"warriorsOnTheBattlefield(address)","917ada14":"testControlCreateShortIdAlreadyExists()","917b4f8b":"TQXToken()","917d009e":"getAuctionPrice(uint256)","917d2be2":"wolkGenesis(uint256,uint256,address)","917ec8e2":"removeApp(uint32,string)","917f635c":"wct()","917fcc5d":"addJobProposal(uint256,string,uint256)","917fd839":"buyGEN0Chibi(string,string,uint8,uint256)","91814577":"renameStoreTo(bytes32)","91816981":"getProfitPercentForData(uint256)","91828a2e":"extra_bonus_duration()","918307fd":"getRemainOfStage(address,uint256)","918359c6":"needsBirth()","91837535":"getgateway()","9183d360":"CreateINDI(address,uint256)","9183fd01":"getSeedPrice()","91854684":"pollBallot(uint256,uint256)","91858734":"takeControl()","918657cb":"token_information()","91872a91":"isEmpty(string,string)","9187300e":"getTokensForSale(bool)","91876e57":"withdrawAuctionBalances()","91878995":"MYCOIN()","9188451b":"transferUserGrowthPoolTokens(address,uint256)","91885e1d":"nextWeaponID()","918898a5":"frozenRules(address,uint256)","9188d312":"getCard(uint256)","9189a59e":"sweeper()","9189edd2":"Zinoder()","9189fec1":"guess(uint256)","918a15cf":"toEthSignedMessageHash(bytes32)","918a2e0c":"AccessoryCollection(uint256)","918b8326":"startSto()","918c00c6":"LogCommit(uint256,address,bytes32)","918c783a":"hasPurchased()","918ca01d":"BurnConfirmed(uint256,address,uint256)","918d407d":"acceptOffer(uint256,address)","918e2c3d":"GetUserExtraData3(address)","918f1bb5":"ProjectKudos()","918f49ec":"NDCOIN()","918f5f74":"setMinBonusTrigger(uint256)","918f644e":"getScriptsCount()","918f8674":"DENOMINATOR()","91914b30":"setTokenUrl(address,string)","91915ef8":"setCapacity(uint256)","91916a5e":"Test(uint256,uint256)","9191b520":"PlatinumToken(uint256,string,uint8,string)","919203a0":"moveTokensFromStockToSale(uint256)","91923d7f":"delSuperInvestor(address)","9192f48e":"setLocked(address)","9193b2e3":"request(address,uint256,uint256,address)","9193ba0b":"createForwarder(address)","91959fe3":"getCalFactor(uint32)","91962739":"setWhiteListOwner(address)","9196bdd5":"ggc(address)","9196e481":"getAllSteps()","91970cba":"saftInvestorAllocation()","919747fb":"depositFunds(address)","91975e22":"ManagerDisabledEvent(address)","91977c56":"setDTR(address)","919823df":"getHashExists(string)","919840ad":"check()","91988783":"IMDEXdepositToken(address,uint256)","9198e08c":"Linfinity()","919987bc":"rewardPool_()","9199a8bb":"dnnHoldingMultisig()","919a41dd":"endFight(uint256,uint256)","919aa4fa":"ZIGICOIN()","919acf1e":"getperiodlasttime(address,address)","919b30cf":"FTXToken()","919baade":"ProposalsEntity()","919be880":"createEscrow(bytes16,address,address,uint256)","919beeb1":"calculateRate()","919bf699":"EggsPurchased(address,uint256,uint32)","919c9d4a":"getAfterIcoPeriod(uint256)","919ca82d":"EtherprisesLLC()","919d3401":"MAXIMUM_ICO_TOKENS()","919d8bb2":"TokenTrader(address,address,address,uint256,uint256,uint256,uint256,bool,bool)","919e144c":"predict(uint16,uint8)","919e1967":"Ubiq()","919e7f42":"supportNewMoon(address)","919edc7c":"getChainySender(string)","919f31c2":"Ankr()","919f8cfc":"makerDepositEther()","919f90ca":"sendCommissionToOwner(uint256)","91a01414":"getPreviousBlock(uint256,uint256)","91a0ac6a":"equity()","91a0ba00":"icoRound1()","91a1896e":"setReserveForFoundersSecond(address)","91a1f16a":"getMaxWin()","91a266ac":"totalEthCharityRecieved()","91a34006":"getInitializeOutcomeValue()","91a3cec0":"receiveEtherFormOwner()","91a49300":"purchaseEnable()","91a553df":"developer_add_cost_of_transfers(string)","91a57544":"affiliatePercentage()","91a5b0c7":"bestSum(uint8[])","91a67e1e":"tokenFrozenUntilBlock()","91a73892":"getOrderStateHelper(uint256,uint256)","91a73a27":"cleanSellShareOutput()","91a7aa37":"Chain2()","91a852f6":"changeTicketFee(uint256)","91a89712":"link(address)","91a90014":"_updateTokenRates(uint256)","91aa94f1":"setPresidenteDeMesaVerify(bytes32,uint256,uint256,bytes32)","91aabeb5":"checkArea(uint32[],address)","91aac477":"addNacToNetf(uint256)","91aadff6":"OPEN_SALE_STAKE()","91aaf2e9":"presaleTokenAmount(address)","91ab0ca0":"authorisedContract()","91ac2c3f":"testCreateElection()","91ac46f5":"centRaised()","91ac7e65":"indexOf(uint256)","91ac96a9":"pendingWinners(uint256)","91acd8fb":"DEJToken()","91ad1ada":"VernamPrivatePreSale()","91ad27b4":"getInterval()","91ad48a1":"DataToSetting(uint8,bool,uint8)","91af8d14":"recalculateTopScores(uint256,uint256,uint256)","91afc432":"setUpdaterAddress(address)","91b1a02a":"SwissCryptoExchange(address,address,address,uint256,uint256,uint256)","91b22ebf":"getTokenAmountPerHeritor(address,address)","91b23419":"developerFund()","91b2413f":"HplusToken()","91b25b35":"revokeAndSetNewMember(uint8,bytes32,address)","91b2b30e":"LogI(uint256)","91b43d13":"fundingEndBlock()","91b4a0e7":"Difficulty()","91b4ded9":"lastPauseTime()","91b56822":"gameTick(uint256)","91b584f3":"_insertValidator(address,uint256)","91b6a086":"WithdrawToInvestor(address,uint256)","91b7ad06":"calculateTokens(address)","91b7d3e0":"redeemSurplusERC20(address)","91b7f5ed":"setPrice(uint256)","91b8a49a":"lastDonor()","91b97997":"endFirstWeekICO()","91b9b640":"getDApp(string)","91ba5d6a":"preICOMany(address[],uint256[])","91baabba":"CCLToken()","91bb2534":"impl_price()","91bb4816":"m_Database()","91bbb21a":"trialDeadline()","91bbb87b":"GetPurchaseInfo()","91bbbe4d":"_payoutTaxes(uint256)","91bbd6f6":"VeiagToken(address)","91bbdcc7":"convert()","91bc85a9":"SetTrustee(address)","91bc8a45":"bonusAdd()","91bdc458":"blockNewSpinnerPurchase(uint256)","91bdf9da":"isTen(uint8)","91be0b31":"setPriceChanger(uint256)","91be2f8d":"changeCCCoinAddress(address)","91be90c8":"_dust(address)","91bf9c50":"test_CampaignRulesFail()","91bfeb98":"CrystiumToken()","91c03391":"TraToken()","91c05b0b":"distribute(uint256)","91c11cae":"disputeTransaction(uint256,uint256)","91c1e2c1":"burnedBalanceOf(address)","91c20375":"setArtEsc(string,string)","91c23928":"divSafe(uint256,uint256)","91c259ea":"transferby(address,uint256)","91c27b2a":"setTransTimes(uint32)","91c3352e":"test_invalidEmptyEqVal1()","91c3e5ee":"rb(address)","91c3e7f8":"showlvzhou(address)","91c4529f":"isBlacklistSpender(address)","91c49026":"rebalanceEnclaves(address,uint256)","91c4c78f":"fund(address,uint160)","91c62a5a":"LogBounty(address,uint128,string)","91c71e2b":"disableLock(bool)","91c72d88":"holdSubscriptionOffer(uint256)","91c79a9a":"CON0217()","91c827a0":"AddOwnerAddress(address,address)","91c873cb":"getAdminContract(address,uint256)","91c8e336":"exchangeSupply()","91cadaf6":"evolvePrice()","91cb4316":"endOf24H()","91cb98af":"getPendingAmount(uint256)","91cca3db":"dev()","91cd242d":"setMeta(bytes32,bytes32,bytes32)","91cd450c":"AlienFarm()","91cd7e9a":"ChannelDeleted(address,address,address)","91cdecab":"TOTAL_DINOTOKEN_SUPPLY()","91ce8ca9":"IQTCrowdsale()","91ce8e04":"setTwo(uint256)","91cee1fd":"baseStats(uint256,uint256)","91cef6a8":"payAffiliate()","91cf2164":"transferFunction(address,address,uint256)","91cf7aca":"upgradeFrom(address,address)","91cfb7b6":"ceilings(uint256)","91d0b3fd":"_mine(address,uint256)","91d0dd17":"accrueCouponsPerXTokenETH()","91d15735":"left11(uint256)","91d15a91":"weiRaisedIco()","91d1addb":"plutocracylvlAchieved(string,string)","91d23a1a":"lastRewards()","91d2939d":"per(uint256,uint256)","91d4357b":"myBonus()","91d43b23":"right76(uint256)","91d462d9":"hashUnderlyingPrices(uint32,int256[])","91d558b7":"startCrowdsaleY0(address)","91d55c41":"RuiXueToken()","91d5d7d6":"out1Done()","91d6212a":"address5a()","91d625e5":"setupCore(string,string,address,uint256)","91d6367b":"reserveForTeam(address,uint256,uint256)","91d739ea":"updateRegistratorStatus(address,bool)","91d76bbb":"getTotalMigrated()","91d781ba":"kkTestICO1()","91d80948":"_checkAndCallTransfer(address,address,uint256,bytes)","91d8b14e":"BuyTickets()","91d91df3":"FesBerto()","91d96541":"refundedSat(address)","91da7aa8":"transferAndCall(address,uint256,uint256[])","91da9178":"WALLET_LB_ADMIN()","91dbd4c3":"payTournamentWinner(uint256)","91dc077b":"submitApplication(string,string,string,string,string,string,string,string)","91dc11fe":"setClaimParameters(uint256,uint256)","91dc1b1d":"mintCUSD(address,uint256)","91dc6d36":"pauseForDividend()","91dc956d":"addLog(string)","91ddadf4":"clock()","91de4f88":"claimCoreTeamsTokens(address)","91de5474":"getPurchaserCount()","91ded8fa":"getTokenByAddress(address)","91df0c08":"addReserve()","91df9562":"BSPToken()","91dfa960":"report(uint16,uint16)","91dfe428":"addFees(uint256,uint256)","91e05922":"contractICO()","91e078bb":"startAuction(uint256,uint256,uint256)","91e0a5a0":"checkHolderStep(address)","91e0b6c0":"ProofPublicVote()","91e0e39c":"resetDragonBalance(address,uint256)","91e1397d":"rcnFund()","91e192b7":"MintedToken(address,address,uint256)","91e1cc5a":"freezeAccount(address,uint256,uint256,uint256,uint256,uint256)","91e22c90":"interfacesSupported(address,bytes4[])","91e23a4d":"updateInterCryptonode(bytes32)","91e2f2c5":"HoQuToken(uint256)","91e30ec3":"buyDataRecord(uint256,uint256,uint256,uint256,uint256,uint256)","91e3387b":"numBrews()","91e50314":"isActivityCore()","91e52b91":"buySecond()","91e569c3":"recordBook(address)","91e59bcf":"testSetName()","91e6d028":"getFIRST_STEP_LIMIT()","91e7137d":"price2ndWeek(uint256)","91e732b6":"setInvestRestriction(uint256,uint8,bool)","91e79c72":"hodlerTotalValue()","91e7f7bc":"claimVotingRight()","91e8609f":"getParentId(bytes32,uint256)","91e863ca":"setBigPromoInterval(uint128)","91e88106":"abiLength(address[])","91e8d3dc":"testBitOrFailIndexOOB()","91e8fc34":"createPipe(uint256,uint256,bytes32)","91e9f106":"historyWinner(uint256)","91ea294e":"LogSetWithdrawer(address)","91ea4d07":"snatchedOn()","91ea59eb":"buyGuaranteed(address)","91ea8a05":"add(bytes32,bytes32,uint256)","91eb97ea":"pharmatrix(uint256)","91ebc861":"noFeeTransfer(address,uint256)","91ec1623":"_shutDown()","91ec845e":"isAtMost(int256,int256,string)","91ec910e":"OwnableImpl()","91ecda3c":"Menu10(address)","91ed6851":"createPromoCompany(address,string,uint256)","91ede45f":"Deposited(address,uint256,uint256,uint256)","91ee7bbf":"dispute(bool)","91ef14b4":"setApprove(address,address,uint256)","91f02379":"hundredKInvestor()","91f02f9c":"DelayChanged(uint256)","91f11a9c":"lastWinNumber()","91f1cf05":"crafting()","91f1f310":"totalOffers(uint256)","91f2700a":"drop(address)","91f2ebb8":"heir()","91f34dbd":"transfer(uint256,address[],uint256[],uint256[3],bytes,bytes,bytes)","91f39f10":"getContactAddressByIndex(uint256)","91f3c4a2":"GSY(uint256,string,string)","91f4b7ff":"soulBookPage(uint256)","91f5637a":"frozenBalanceCount()","91f5c3a8":"donateAndCreateGiver(address,uint64)","91f5f3c9":"MAX_TOKEN_GRANTEES()","91f6c7e6":"getCurrentICOPhase()","91f72ebb":"is128Bit(uint256)","91f7cfb9":"availableAmount()","91f85480":"updateValidOrg(address,address,bool)","91f90157":"highestBidder()","91f9bb85":"setAdvisorVault(address)","91f9f4a2":"getRateIncludingBonus()","91fa0555":"getParentAddress()","91fa196d":"getDesignatedReportReceivedTime()","91fa2df4":"addPaid(bytes32,uint256)","91fb4583":"reachedMajorityForTeam(uint256)","91fb9437":"isStoring()","91fc437e":"nameTaken(string)","91fc7c70":"TreeCoin()","91fd1c7d":"getSenderByHash(string)","91fdbb55":"releaseUrl(uint8)","91fdf6b1":"electActiveTranscoder(uint256,bytes32,uint256)","91fe5a64":"_totalBurnedTokens()","91fe7bab":"mintTokensWithApproval(address,uint256,address)","91fea350":"checkFreezeValue(uint256)","91fed1c0":"RaffleResult(uint256,uint256,address,address,address,uint256,bytes32)","91feea93":"withdrawBoth(address,uint256,uint256)","91ff6baf":"requestsFunded()","92008bfa":"setResourcesSecondaryManager(address)","9201ac94":"getCON()","9201de55":"bytes32ToString(bytes32)","92031600":"setBonuses(uint256[],uint256[],uint256[])","92039b87":"balanceVested(address)","9203cb9e":"forwardWin(address,address,bytes,bytes32,bytes)","9204764f":"setHookOperator(address)","9204b2bd":"maxVeriAmount()","9204c013":"QKCCoin()","9205ab3c":"sendRefund()","9205dce7":"Usdcoins()","9205ec4d":"refundSponsorship(address,uint256,uint256)","9205fbc2":"testAuthorityAuth()","92066346":"setCastleLootDistributionThreshold(uint256)","92069ebd":"_getMarketPrices()","920775d4":"subVirus(address,uint256)","92093dd6":"getLastResult()","92093e7d":"addUserRefBalance(address)","92099fdb":"refundableEthBalanceOf(address)","9209b3c0":"getCrtDetails(bytes)","9209eebe":"SentToContractor(uint256,uint256,address,uint256)","920b0280":"noIcoPeriod()","920b3a7e":"getFundersCount()","920bb680":"ledgerWallet()","920c94df":"BuyTicketForOther(address,uint8,uint8,uint8)","920dce19":"getAngelCardSeries(uint8)","920dd47b":"first_partner_address()","920dfe52":"EFARMCoin()","920e3c96":"setUserStatus(address,uint8)","920e4da9":"created(string,string,address,uint256)","920ffa26":"ownerOf(string)","9211448f":"finalizeClaim(bytes32,string)","921193cf":"changelp3(address)","921200ed":"setBonusTokenRateLevelFour(uint256)","9212051c":"numJobs()","921233b9":"addBuyRequest(bytes32,address)","92123470":"mintTo()","921237a4":"createPlayer(address,address)","92127126":"canTransferByPartition(bytes32,address,uint256,bytes)","9212d0c1":"closeBetsIfEventNotSuccess(bytes16,bytes16,uint256,uint256)","92140775":"prefixedTest(uint8,bytes32,bytes32,address,address)","92140bb9":"getTransactionByTransactionAndEntityId(address,uint256)","921456e7":"modifierEx()","921496a9":"adminWithdrawTokens(uint256)","9214b644":"married()","9214e527":"Crowdsale(uint32,uint32,uint256,address)","9215b58e":"GoldMineChain(uint256,string,uint8,string)","9216728a":"cooWallet()","9216b7ad":"winTokenReward()","9216cf13":"licenseSalesContractAddress()","921710e9":"getShareRewardPercent()","9217500c":"setFightAuctionAddress(address,address)","9217c438":"getOracleAddress(uint256)","921828ac":"commitProposal(string)","921b004b":"depositFunds(address,uint256)","921b15ae":"LaborHourToken(address,int256,string,uint256)","921b2d64":"mintTokens(int256,address,uint256)","921b45f7":"checkAndCloseDeposit(uint256)","921bd6f0":"upgradeTimestamp()","921d72ed":"CreatedAccessory(uint64)","921dec21":"registerNameXID(string,uint256,bool)","921e1537":"dailyHash()","921e7ba6":"withdrawCoins(string,address)","921f5dec":"getBlockVoter(uint256,address)","921f98bb":"resolveFailVote()","92202126":"ETU()","92207bd8":"getMyCarsIdxCount(uint256)","9220d426":"_nowDateTime()","9220d5fa":"DiminishToken(address,address)","92223e7a":"BlueRedTokenERC20(uint256,string,string)","9223de05":"contributionAmounts(address)","922427de":"canSort()","922497fc":"regularTokenMaxSales()","92250c6a":"localBuy(uint256,address,address)","922587ff":"addMintable(address)","9226084e":"tier_cap_1()","922775e3":"createNewTrade(address,uint256,uint256)","92277933":"abc()","9227bed6":"bucketAmount()","922856da":"getPicksForUser(address)","9228e90d":"developer_BSR()","9229c504":"new_mainPlayer(address)","9229e3cd":"submitProof(bytes32,bytes32[],uint256)","9229f3c1":"KVLToken()","922a8425":"paymode()","922b01ca":"walkTokenLots(address,address,uint256,uint256,bool,bool,bool)","922b041d":"_getStatsSumHours(uint256)","922ba128":"calculateCurrDynamicPrice()","922bedf7":"mintNFTsNotForSale(uint256[],bytes32[])","922c64ef":"batchDistributeTokens(address[],uint256[])","922da521":"RocketPoolPresale(address)","922dd59a":"icapTransfer(bytes,address,bytes,uint256)","922dd7d9":"generateKey()","922f17ce":"emptyEther()","922f7124":"changeStrategyAddress(address)","922fc84b":"taskProcessedNoCosting(uint256)","923020d9":"whitelistMainSaleAddress(address,bool)","9231e0f9":"setPresidenteDeMesaVerify(bytes32,uint256,bytes32)","923211f5":"showLiveDividends()","9232494e":"BANCOR_NETWORK()","9232fdb5":"addUserExp(address,uint256)","9233c030":"_reward(uint256)","9233c1d6":"battle(uint256[],uint256)","9233d561":"setUnpaidPercentage(bytes32,uint8)","92346ed7":"test1(bytes)","92348055":"sellSoul(string,uint256)","9234c1fd":"MAX_REVEAL_DURATION_IN_SECONDS()","92363a42":"createProduct(uint256,uint256,uint256,uint256,uint256)","923689e4":"startRecovery()","92369bd5":"calculateAndDecreasePhaseSupply(uint256)","9237a125":"seedDeposit()","9237e074":"manager(uint256,address,string,uint256,bool)","9237e61b":"InvestmentSucceeded(uint256)","9239520b":"setQuorumPercent(uint8)","923a1abb":"SBCE(uint256)","923a2e61":"JinGangCoin()","923a367f":"PBToken(address,address)","923a4227":"CiceroToken()","923a69ae":"getCardRevenue(uint8)","923b3e75":"publishContractTemplate(uint256,string,address,string,uint256,uint256,uint256,uint256,uint256,uint256,address)","923b9480":"getDatasCount()","923b9bae":"EventCreatePet(address,uint256)","923ce65f":"draftNewCard()","923d566d":"buyKey(uint256,uint256)","923db49b":"informOffChainBuy(address[],bytes32[])","923de8e2":"checkTransferAndCallDelegated(address,address,uint256,bytes,uint256,uint256,bytes)","923e1b84":"sendToEtheroll(uint256,uint256)","923e2645":"DonationGuestbook()","923f098e":"CLNRefunded(address,address,uint256)","923f1788":"convertChest(uint256)","923f8455":"BACE_ETH()","923f9bae":"testLedgerPayback()","923fa0fe":"ChildContract(uint8,address,bytes32)","92403b35":"tier2Count()","9240551b":"changeCurrentEtherRateInCents(uint256)","9240f699":"landmarkSize()","92414146":"preIcoWasSuccessful()","92414f92":"OpenDate(uint256)","92418cf6":"withdrawKncFee(uint256)","924320b5":"isMajorityShareholder(address)","9243e088":"setEnforceRevisions(bytes20)","9244c21e":"preicoUSD()","9244f496":"addAddressToWhiteList(address)","92450ac9":"setDataColla_AA_01(string,string)","9245290d":"changeFeeCollector(address)","9246177b":"changeTicketOwner(address)","9246ab77":"addWhitelist(address[],address)","9246e531":"getSignature(string,int256)","924720bd":"pizzaPrice()","9247ff59":"getAccountData(uint256)","9248019e":"addMonsterIdMapping(address,uint64)","924806a0":"returnToken(address)","9248d4ec":"getEthNeeded(uint256)","92491f21":"subTourFreezingTime()","9249993a":"BANCOR_GAS_PRICE_LIMIT()","9249bc75":"set_sale_open()","9249d865":"getAllLawyers()","924b1235":"price1stWeek(uint256)","924b39ae":"refundToWallet(address)","924b573a":"lastWagerTimeoutTimestamp()","924bb1d0":"updateETHPrice(uint256)","924c28c1":"ContractInterface(address,address,address)","924ca55e":"LindaPresale(uint256,uint256,uint256,uint256,uint256,address,address)","924ca61a":"coupon(address,address,uint256)","924dd50a":"startSelling(uint8,uint256,uint256,uint128)","924dedca":"getEpisodeDataCommand(uint256,uint256,uint256)","924e63f6":"setDisputeResolver(address)","924f6be0":"CONTEST_INTERVAL()","924fdaf6":"drawPorsche()","925012f6":"agingTimes(uint256)","9250640d":"INIT_TOKENS()","925074ca":"getAllPlots()","92509c16":"lock_by_manager()","9250b080":"picops_user()","925176d6":"sellRate(uint256,uint256,uint256)","92524725":"mintToMany(address[],uint256[])","9252e819":"IGCoin()","92535862":"custodyCounter()","92536070":"RoomManager()","925382c0":"setMigrated()","92541925":"skynacoin()","92549366":"remainingCapInEth()","9254c2a8":"changeTotalRemaining(uint256)","92550bdd":"applyMigrate(uint256)","9256759c":"addressFundAirdrop()","9256c71d":"getPriceFeedsByOwner(address)","92573a0c":"token_callg()","925753d3":"TokenGenerationDisabled()","92579f34":"Aracle()","92584d80":"finalize(bytes32)","92588071":"saveAddress()","9258c8f8":"Applicationcoin()","9258d5a3":"isIcoRunning()","925aa2ad":"purchaseWithEth()","925ac216":"isICOOpen()","925ad1e7":"collectAllForce(address[],address)","925b83a7":"getCobeFriend(uint256)","925cbdd1":"createCost(uint256)","925cd80d":"contract_start()","925d3ec8":"dDowngradeToBasic(bytes32)","925f2573":"batchTransferDirectoryToken(uint256,address[],uint256[])","925f7239":"veztUserRegistered(address)","9260587e":"_removeTokenFrom(address,uint256)","92609315":"addAuctionManager(address)","9260e726":"giveReward(uint256)","9260faf8":"issueForEuro(uint256)","9262bba9":"titsTokenAuthor()","9262d759":"getAddress(uint256,uint256)","9263b559":"ethReceivedMain()","9263e371":"mint(bytes32,string,string,string,string,string)","9264a169":"tranferFrom(address,address,uint256)","9264ee57":"valuePerMicroKey()","92656b6d":"calculateHash(address[],uint256[])","9265996c":"getEventResult(uint32)","92664190":"PriceUpdate(uint256,uint256)","92670dc8":"currentBonus(uint256)","9267a36d":"founderVestingContract()","9267b291":"getGameStarted()","9267daba":"depositToGateway(uint256)","9268037a":"FortressToken()","92682b5f":"PauseOn(uint256)","9268e2d6":"setCLOUDForGas(uint256)","92698814":"reserved(bytes32)","926994e6":"testFailSoftLimit()","9269c0a7":"setABalances(address[],uint256[])","9269e464":"bountyTokenAllocation()","926a2456":"cancelIndexedSale()","926a4765":"getRoundStart()","926a9af0":"distributeForFoundersAndTeam()","926aa0a8":"sendEthTo(address)","926b33c6":"playSpecificDoubles(uint256,uint256)","926baab2":"proofImpl()","926bd180":"isGameVerified(uint256)","926c196a":"depositAndTransfer(address,uint256,bytes)","926d212e":"createGenerator(uint256)","926dfd5e":"becomeYouTubemaster()","926f0c7b":"partnersFund()","926f949e":"calculateWolkToBurn(uint256)","9270040f":"drawHeroLottery(address,bool)","92708ce1":"aletoken(string)","92710c60":"finalizePublicICO()","92716054":"freezer()","9271b8df":"totalPaidToFunder(bytes32,address)","9271b997":"setHighScore(uint256)","92721b86":"dividendRate(address,uint256)","9272e3f5":"many_currencies()","927319ba":"DCCToken()","92731aaa":"changesLocked()","927332da":"MaxChildLevel(address)","92736527":"freezeGame(uint32,bool)","92749978":"minBets()","9274c16b":"tokensDistributedToContributors()","9275ddd7":"SetFreeQPY(uint256)","92760a3e":"loveName()","92763585":"uniquePetsCount()","927675b8":"run(bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],uint256,uint256,uint256,uint256)","92771e0f":"getCertificateMetaData(bytes32,bytes32,bytes32,uint256)","927726ea":"_openPrize(uint32,uint32,uint256,uint256)","927731c8":"payDepositByCandidate()","9278c418":"targetWalletVerified()","9279011c":"nextroundlength()","927a11b6":"getBranch(uint256)","927a4a7b":"transferWithLockAfter(address,uint256,uint256)","927a90da":"icoOpen()","927aaa7c":"setGeneManager(address)","927ac4f5":"approveContractReceiveGameLockedToken(address)","927bcac3":"emergencySplitToggle()","927c4151":"finalizePresale(address)","927c60de":"BIKQuery(address)","927da105":"allowance(address,address,address)","927db818":"initPresale(address,uint256,uint256,uint256,uint256)","927db81f":"new_entity(address,string)","927e434b":"rocketAddFunds(uint256,uint256,uint256)","927e69e2":"_getBattleBonus(uint256,uint256,uint256,uint256,uint256)","927ed13a":"newClient(uint256,address)","927f1086":"MAX_RANDOM_DELAY()","927f4be0":"exhaustAfterBattle(uint256,uint256)","9280b836":"spreadGold(address,uint256)","9280df59":"Swapcoinz()","928161ca":"recoverFundsAndDestroy()","92817184":"redeemPurchasesForVendor(address)","928187a8":"BonumPreICO(address,uint256)","9281aa0b":"setWhitelisted(address,bool)","9281cd65":"changeApproval(address,uint256,uint256)","9281e270":"matchOrders(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)","92824c24":"changeClaimAddress(address)","92829174":"preCrowdsaleTokensWallet()","9283032c":"storeWeekUnclaimed()","9283da60":"TeamtokenRelease1()","9283e6cb":"acquisitionsStatus()","92842802":"changeTierAdmin(address)","928432c0":"releasedSteps()","92844ddd":"_setUserRole(address,uint8,bool)","92846ab6":"put_transfer(address,address,address,uint256,bool)","92848c9e":"create(uint256,uint256,uint256,uint256)","9284cb0c":"getTotalPreSelled()","9286904c":"set_doctor(uint256,uint256,string)","928693c6":"RusaToken()","928771bb":"janPot_()","92878bd0":"forwardFunds(address,uint256)","9287c877":"getNavLength()","92885e86":"CountryPurchased(uint256,address,uint256)","9288cebc":"totalRollsByUser(address)","92890b09":"SmithToken()","92893fb9":"hasAddressVoted()","92898900":"allowTokenTransfer(address)","928993dd":"setBuyComissionUnits(uint256)","928a00d2":"deleteCoin(uint256)","928b06b5":"EAsset()","928b4cd2":"preICOTokenHardCap()","928b685c":"_buyPutToClose(uint256,uint256,uint256,uint256,address)","928b792e":"withdrawBonuses(bytes32,uint256,address,uint256,address)","928c5fb3":"getArrIntField3()","928c82a2":"createAsset(string,string,string,uint256,address)","928d09dd":"coreTeamAddr()","928d20fc":"_unpackPetValue(uint256)","928d4144":"verify(uint256,uint256,string,uint8,bytes32,bytes32)","928d81c1":"withdrawERC20Token(address,uint256)","928e6592":"sellingPriceInDayOf(address)","928e6b16":"getUint(bytes4)","928f0cc7":"ChangeStartByManager(uint256)","928f16e3":"geCompoundTimestampsFor12Months(uint256)","928fca1d":"withDrawlocked()","928fd553":"Migrated(address,address,uint256)","929066f5":"isParticipant(address)","9291b1f3":"tradeDealConfirmed()","92925c3b":"supplyTokens()","9293cc10":"TOU(uint256,string,uint8,string)","9293eb2f":"totalScammedRepaid(address)","9293f41e":"sendInviteDividends(uint256,uint256,uint256,uint256[])","92940bf9":"transferERC20Token(address,address,uint256)","92946284":"_placeSellTokenOrder(address,uint32,uint256)","9294e012":"sendOracleData()","92956506":"StarxCoin()","9295d038":"loyaltyPart()","92968125":"getUserDetails(address,uint256)","92979037":"teamTwoDivsUnclaimed()","9297afa2":"Eliminate(address,uint256)","9297c24c":"command()","9297d758":"DiceManager()","929911be":"takeSnapshot(address)","9299e552":"cancelListing(bytes32)","9299f294":"_buy()","929a3c18":"EMGwithdraw(uint256)","929a79b1":"getTitle(uint256)","929aa851":"maximumTokensForFifth()","929ac519":"changeOwnersWallet(address)","929ba8bf":"transferFromRwrd()","929c4649":"startUpgrading()","929c52a7":"changeClosingTime(uint256)","929d2033":"takeUpWork()","929de7c9":"setData_21(string)","929e626e":"getShareDistribution(bytes32)","929e902d":"curVotes()","929ec537":"getLockedAmount(address)","929f11ea":"withdrawOwnerAmount()","929f8dd4":"createBet(address,address,uint256,bytes32[])","92a04621":"maxPurchaseNum()","92a08dd1":"getCustomField(uint256,bytes32)","92a0fd64":"reserveTokenWallet()","92a11827":"canRevokeVesting(address,address)","92a20d0c":"ANONIMX()","92a2b44b":"offerTkn(uint256,uint256)","92a38e71":"createOpenValentineRequest(string,string,string)","92a39634":"VoltOwned(address)","92a42704":"verifyOwnership()","92a48bea":"setOfferContract(address)","92a4cc25":"readFrom(uint256,int256)","92a5f340":"BasePrice()","92a69395":"setTotalAirDrop(uint256)","92a70756":"m_thawTS()","92a70c42":"deployerHash()","92a73fb8":"testbool(bool)","92a781d8":"changeBaseValue(uint256)","92a7843c":"lastRefundedIndex()","92a79148":"getCryptoVersusReward()","92a793d0":"release_3()","92a81127":"BasicMilestones(address,address,bool)","92a8424d":"setPercentageCW(uint256)","92a93d33":"payAltCoin(bytes32,address,address,uint256,uint256,bytes)","92aaa019":"Inventor()","92abb859":"overrideBlock()","92acb4d6":"contributorList(address)","92ad728b":"staff_2()","92ae0530":"canUpdateFrontWindowAdjustmentRatio()","92aea05a":"expLimited(int128,int256)","92af0605":"playSystem(uint8,uint8,uint8,address)","92af7ce0":"throwsWhenGettingTokensWithEndedSale()","92afac6d":"reserveY1()","92afc33a":"ROLE_MINTER()","92b03120":"CONTRIBUTION_START()","92b0c5b2":"pow(int256,int256)","92b0d721":"mold(bytes32,uint256)","92b0fed8":"ChannelFactory()","92b1696d":"CNYToken(uint256,string,uint8,string)","92b19872":"changemincap(uint256)","92b1b0ce":"RachelToken()","92b1b418":"tokenFallbackTest(address,uint256,bytes)","92b25a71":"Wallet(bytes32)","92b3228c":"getIreg()","92b39bf4":"assignPatient(uint256,uint256,uint256,uint256)","92b46390":"changeDevAddress(address)","92b4b68a":"get_bettor_nfo()","92b4bb50":"rps()","92b4ddeb":"phase_3_Time()","92b6641a":"hardCapHigh()","92b6ebfa":"getPreIcoBonus(uint256)","92b7bd27":"removeOwner_(address)","92b7bfbb":"TransferRate()","92b7d5b9":"getCurrentGaslimit()","92b863f3":"AbabPreICOToken()","92b87751":"_balanceOfUnclaimedMilk(address)","92b9308c":"getRespectiveValue(address)","92b96432":"setBpTime(uint256)","92b9fe8b":"Xenon()","92ba4ba6":"GridMember(string,uint256,bool,address,address)","92ba77ca":"setVeto(uint256,bool)","92bb3e6a":"setCoverImage(uint256,bytes)","92bbf6e8":"E()","92bc3251":"getCuts()","92bccb80":"pauseRedemption()","92bcf0d5":"ICO_PHASE2_LIMIT()","92bd38bc":"fundCampaign(uint256)","92bd3f16":"mainsaleTotalNumberTokenSold()","92bdf9ba":"lockedCollateral(address)","92be5d13":"setDelegadoDeEscuelaVerify(bytes32,bytes32,uint256)","92be675f":"Y1_lockedTokenAmount()","92bec526":"GameChannelConflict(address,uint256,uint256,address,address,uint256)","92bec5c3":"distribute(uint256,uint256,address)","92bf2bf1":"changeMinimumContribution(uint256)","92c00590":"getAddReserveSignatures()","92c00a3f":"transferState()","92c00f3c":"investorsTokens()","92c19394":"packStore(address)","92c2bcb4":"changeRecipient(address)","92c31e61":"ZOINToken()","92c40344":"getReferralCode(address)","92c4a5ed":"MinBetUpdate(uint256)","92c537e9":"hatchStartTime()","92c54f92":"sit(uint8)","92c5769d":"unlockAddressAfterITO(address,address)","92c6b697":"claimGanaTokens()","92c6bf28":"getWalletsData()","92c70af1":"MAX_UN_LOCK_TIMES()","92c787ae":"register_recurcively(uint256)","92c8412f":"buykey(uint256)","92c87280":"joinProvider(uint256)","92c88a40":"CollectibleToken()","92c8eb96":"DSFalseFallbackTest()","92c9a11a":"getPrices2(uint256,uint256,uint256)","92c9a926":"stateStartDate()","92c9a9e2":"activateDestruction()","92ca3a80":"SingleTransact(address,uint256,address,bytes)","92cb5f19":"TokenTemplate(uint256,string,uint8,string,address)","92cb9030":"getFeeWindowForForkEndTime()","92cbda09":"subbtycmoney(address,uint256)","92cbeb59":"OracleBitstamp()","92cc2c94":"drainRemainingTokens()","92cd1ff2":"ETH_DECIMALS()","92cd2b99":"asciiToUint(bytes1)","92cdb7d5":"deathData_a15()","92cf1d49":"setStop()","92cfd461":"_createMedal(address,uint8)","92cfebd6":"LanaCharleenToken(uint256,string,string)","92d09ceb":"collateralAmount()","92d09f22":"pendingInvestContracts(uint256)","92d0d153":"t()","92d16464":"gameIsOver(uint256)","92d1abb7":"CONVERTER_CONVERSION_WHITELIST()","92d25259":"iBlock()","92d267c1":"setEthUsdRateInCent(uint256)","92d282c1":"Send()","92d2f118":"burn(uint8)","92d33200":"MAX_CRATES_TO_SELL()","92d3be79":"escrowWallet()","92d42475":"bbReserveWallet()","92d44650":"tokenApproves()","92d4d9ac":"verify(bytes32,address,uint8,bytes32,bytes32)","92d519de":"ATSXToken(address,address)","92d588a0":"INITIAL_COINS_FOR_VIPPLACEMENT()","92d59aff":"Take_payout()","92d60433":"CirculatingSupply()","92d66313":"getYear(uint256)","92d68619":"Multiplication(int256)","92d69a39":"addNodesToList(string,address)","92d7b620":"judge(bytes32[13],uint256,bytes32[],bytes32[],bytes32,bytes32,uint256[4],bytes32[10],uint256[4])","92d7f787":"getAccountWhitelist(uint256,uint256)","92d8c8cf":"setupImportFee(address,uint256)","92d98e95":"content(string,uint256,address,uint256,uint256,uint256)","92d996d7":"getPopularityByOffset(uint256)","92d997bd":"QuantityInitial()","92d9e3b8":"isAcceptingPayments()","92da29d2":"validPurchase(uint256,uint256,bytes)","92da856d":"currentStepIndexAll()","92dac258":"getAuctionItems(uint256[])","92daec51":"setLastBuyer(address)","92dbf585":"appendEarlyPurchase(address,uint256,uint256)","92dcf35d":"fourthExchangeRatePeriod()","92dd1246":"updateListReq(uint256,uint256)","92dd38ea":"arrayaccess(uint256)","92df61e8":"withdrawTokensFor(address)","92df6e91":"fortune_limitbreak()","92df94ec":"updateDream(address,string,string)","92dff48a":"backers()","92e0ba2a":"goldBought()","92e11e24":"teamAmountLeft()","92e16740":"scheduleOraclize()","92e18d9f":"setYcmContractAddress(address)","92e1ab17":"includesAddressesSet(address)","92e33d14":"enableWithdraw(bool)","92e405ac":"transferPartner(address)","92e41c69":"identityEthAddress()","92e4226a":"nextTransferFeeAbs(uint256)","92e423b5":"agent(address)","92e4b733":"_transferTokens(address)","92e4b8a4":"collectAuthorizedPayment(uint256)","92e4cd75":"icoTokensUnsold()","92e598f3":"test_fourInvalidEqInt()","92e8438c":"issueTokensMulti(address[],uint256[])","92e8d866":"DailyGrowthUpdate(uint256)","92e9fd5e":"ColdWallet(address,address)","92eaa642":"transferLoveStory(bytes16,bytes32,bytes32,uint256)","92eada50":"lastBlock_a16Hash_uint256()","92eb35bc":"preSaleBonuses(uint256)","92ebf860":"invalidateTaskListingAtIndex(uint256)","92ec6ea8":"updateAsset(uint256,string,uint256)","92ecf577":"getCurrentTerm()","92ecf690":"grantToSetUnburnableWallet(address,bool)","92ed888b":"CcifToken()","92ee0334":"currentUser()","92eeee63":"createAndBuyAllAmount(address,address,address,uint256,address,uint256)","92eefe9b":"setController(address)","92efd277":"countOfDeedsByOwner(address)","92f00233":"minterContract()","92f00d37":"TalkToExpertToken()","92f1fc7d":"bytes32_to_bytes(bytes,bytes)","92f351f9":"openTimer()","92f461ed":"getTeamsOfOwner(address)","92f48846":"updateTokenSellAmount(uint256)","92f4d225":"spankToken()","92f52ddf":"DICE()","92f53757":"GLAM()","92f5cea7":"bytes32ToString(bytes32,bytes32)","92f692ea":"setInvitationValidPeriod(uint256)","92f6a74f":"totalTokenCapToCreate()","92f7ba17":"MELONPORT_COMPANY_STAKE()","92f8de45":"MXToken()","92f926e5":"makeMoveBro()","92f96115":"setPartialTransfers(address,bool)","92fa1453":"BankAccount()","92fb4acd":"terminatePackage(address)","92fb7ef8":"burnPoll(uint256)","92fd1c2d":"bat_match(uint256[])","92fd1f01":"getPayeeAddress(bytes32,uint8)","92fe028b":"PokerWinner()","92fe4098":"b32ToBytes(bytes32)","92fee51a":"setICORatio(uint256)","92ff0d31":"transferable()","92ff3751":"getMatchHomePlayers(uint256)","92ff4be4":"finalLottery()","92ff7859":"newFutureLottery(uint256,uint256)","93003033":"tokenSalesAll(uint256)","93004e62":"initPayoutTable(uint256,uint256)","93012d5f":"Loan(uint8)","9301eb36":"setItemOption(uint256,string)","9303633e":"tier_rate_2()","930429ea":"setFOUNDERS_POOL_ADDR(address)","93046a13":"withdrawEtherPayment()","9304ddc8":"setUnitCreationFee(uint256)","93051424":"KIUSToken()","9305b0f8":"WorldSafetySecurityToken()","9306099f":"GxOrders(address)","930622ed":"assignedAmountToMarketExpand()","9306635a":"PETRO(uint256,string,uint8,string)","93072684":"revokeDelegateSigned(address,uint8,bytes32,bytes32,bytes32,address)","9307ca0f":"houseKeep(int256,uint256)","93080cd4":"replaceChannelContractAddress(address)","9308151b":"crowdSaleTokens()","9308353f":"payin()","9308a865":"total_raised()","930916b2":"setInviteCode(string)","930a0daa":"checkMinimumQuota(address,uint256)","930a80b4":"testAuthorizedSetPackage()","930a9d92":"tradeOrder(address[3],uint256[5],int256,int256,uint8,bytes32,bytes32)","930ae8b0":"setSaleFlag(bool)","930b7a23":"approveOnce(address,uint256)","930bbbed":"changeBeedingCost(uint256)","930c0bba":"getWithdrawalEntryForFunder(address)","930c1198":"crowdsale(address,uint256)","930c2003":"victim()","930c57f3":"PublicSale(address,address,uint256,uint256,uint256)","930cb83e":"registerUsers(address[],uint256[],uint256[],uint256[],uint256[])","930cbf89":"ProposalAdded(uint256,address)","930cd62e":"getIcoInvestorsAddressesCount()","930d54b4":"revealSeckey(uint256,bytes32)","930db1ab":"setHijackPrice(uint256)","930ddb8e":"getIdea(address)","930e1173":"tokensReadyForRelease(uint256)","930e23b9":"_STCnContract()","930ed251":"getSavedVar()","930f5fbe":"setApplicationChecksum(bytes32)","930fed29":"EnkronosToken()","931010eb":"tokPrizes(uint256)","93107071":"PDAToken()","9310ba96":"TIX(uint256,address,uint256[],uint256[])","93119312":"returnMoney()","9312434e":"cryptocompareUsdOracleUrl(bytes32)","931274c8":"createContractScene(string,uint256[])","9312766d":"BSTokenData(address)","9313053e":"createItems(address)","93138faa":"isProviderParamInitialized(address,bytes32)","9313919a":"multipleShotTokenRepartition(uint256,uint256)","9313dc43":"claimTokensFromErc677(address,address)","9314be9d":"lock(bytes32,bytes32)","931634fd":"PGTBToken()","93167204":"teamTokensPercent()","931688cb":"updateBaseURI(string)","9316c3e7":"transferBulk(address[],uint256[])","931742d3":"commissionAddress()","9317cb37":"CUTOFF_PRESALE_ONE()","9317d6d3":"totalReceived(bytes32)","93183dc9":"paymentManager(address,uint256)","93192c65":"ProposalAdded(address,uint256,uint256,string,bytes32)","931983ad":"Connection(address,address)","9319f44d":"rateTierNormal()","931a4c5b":"maxContributionPhase2()","931a5256":"addOrder(uint256,uint256,address,address,uint256,address)","931b3385":"claimToken(address,string)","931c0040":"carrotsMultiplier()","931c6246":"VestingWallet(address)","931c8ba7":"count_products()","931cd0cc":"setBQL(uint256)","931dab50":"allocationAmount(uint256)","931df75f":"validateProposedThroneName(bytes)","931e44e2":"BuyLandsByEth(uint256)","931e7daa":"BettingKing()","931fbdd8":"Trenggalek()","9321cb7d":"SGT()","9321dc5f":"initRequest(uint256[])","9321e603":"changeMtcDailyLimit(uint256)","932354c1":"updateLocation(string)","93237833":"CONTRACT_HOLDER_BONUS()","9323eaad":"awardUnitRafflePrize(address,uint256)","9324dfff":"addWhitelistedTokenAddr(address)","93253a9d":"PublickOffering()","93257d33":"CheckForFloating(address,uint256)","93272baf":"getTokenType(address)","93275889":"ChangeTax(uint16)","9327891e":"testSetRole()","932838a1":"setCell(address,uint256)","9328bfc1":"getNumMessages(address,address)","9328fa02":"capitalAllocatedTo(address)","9329066c":"getJackpot()","93299395":"revokeEditAgentAuthorization(address)","9329f2fe":"postico_startdate()","932a0ee7":"getShowTextBytes96()","932a7b2e":"addApp(address,address)","932adda2":"newNode(bytes32,bytes32,bytes32,bytes32,bytes32)","932ae363":"buyerNumDeals(address)","932bead7":"updatePlanetURL(uint256,uint256,uint256,string)","932c1081":"closedHour(uint8)","932c360d":"SpaceRegistry()","932c90f3":"SUPPLY_FOR_TEAM()","932cd73e":"tokensReleasedToTeam()","932db761":"profitsFromBitnationDebitCard()","932def2e":"tgrCurrentStage()","932e1c76":"distributeEbyteForETH(address[])","932e2e95":"_withdrawEthereum(uint256)","932f4588":"RaffleResult(uint256,uint256,uint256,address,address,address,uint256,bytes32)","932f9f89":"testThrowInvalidProvider()","932fad1f":"totalWageredForOutcome(uint8)","932fd99f":"toHighestDenomination(uint256)","932fec40":"refundToken(address,address,uint256)","9330f97f":"removeDestinationByIndex(uint256)","93311632":"getTokenClaim(uint256)","93316cdf":"selltoken(uint256)","9331a922":"get_layer(uint256)","93320f2e":"expRequiredToReachLevel(uint256)","93325812":"addFreelancerTotalInvoiced(address,address,uint256)","93331892":"batch(address[],uint256)","9333a122":"ITECH()","9333cf5e":"communityPeriodAmount()","9333d6c0":"MILL()","933426f5":"GoolaToken(address,address,address)","93348f45":"ovedclaimBountyairdropMultiple(address[],uint256)","9334ab61":"Infos()","9334ad0d":"getVersions(address,bytes32,address,bytes32)","93358320":"withdrawOwnerToken(uint256)","9335dcb7":"ownerWallet()","93361078":"confirmStartWork(uint256)","9338cbdd":"monToTrainer(uint64)","93395d99":"TalksChain()","93399949":"GTDCStandardToken(uint256,string,uint8,string)","9339c01a":"validICOPurchase()","9339e942":"check_flag(bytes32)","933aa667":"isPermission(bytes4)","933ba413":"totalEthInWei()","933bf760":"extend_life_of_contract(uint256)","933c798c":"next_payout()","933dc51b":"setUint256(int256,uint256,uint256)","93402e17":"setRewardManger(address,address)","934076f1":"BetOnMatch(address)","9341231c":"sendOrThrow(address,uint256)","9341287d":"setMetadataUrlPrefix(string)","9341aa4e":"initializeDistribution(address)","9341bc00":"drones(uint256)","934209ce":"rank()","9342160b":"eligibleCheckAndIncrement(uint256,uint256)","93423e9c":"getAccountBalance(address)","934354e7":"finishSpin()","93437b52":"Fibremoney()","93439950":"test_chain2_2_increaseBlocksBy5()","9344a0b6":"addAddressToRegistry(address)","9344b0d6":"playerCompleteGames(address,uint256)","9344c50f":"getNameOf(address,address)","93465da6":"Error(uint128)","934689a9":"getTokenCreator(uint256)","93469800":"minPower_()","93470fa8":"listMultipleItems(uint256[],uint256,address,uint256)","93478221":"LogSender2(address,address)","934865d0":"TransactionBlocked(address,uint256)","9348b810":"contractorTransferFrom_Bcoupon(address,address,uint256)","9348caf7":"testBuyTenTokens()","9348cef7":"reveal(uint256,uint256)","9348ff61":"setUSDRaised(uint256)","9349ba44":"AirRopToken()","934a029d":"getVoteAtTxForUser(bytes32,address)","934a0b57":"AXXToken()","934aa023":"charity()","934bb037":"MainBank()","934bc29d":"exampleFunction(uint256)","934c563f":"dataOf(uint256,uint256)","934d8a2e":"TokToken()","934db458":"Big()","934e03a4":"toBool(bytes32)","934e860d":"addOnHold(uint256)","934ea572":"w_Reserv()","934f92af":"ZebiCoinTempMgr(address,address,address)","93503337":"isAllowed(bytes32,uint256)","9351327f":"USD_PER_ETHER()","935146d0":"createMatch(string,string,uint256,uint256)","93519d66":"requestClearing(bytes32)","9351a8d7":"managementWithdraw(uint256)","9352fad2":"run(string)","93545a79":"isAmountBonus()","93559bc6":"lifeCoin()","9355d6db":"MadTok()","9355eb25":"privilege()","935600ce":"subRegistrationPeriod(bytes32)","9356b1fe":"BWCHToken(uint256,string,string)","9356e87f":"getLastMulti()","935814a6":"confirmRewardsWithdrawal()","93588a14":"setTop(uint256,address,uint256,bool)","9358928b":"circulatingSupply()","935aae40":"MINIMUM_BET()","935b1624":"get_first_global_audit_document()","935b2b1f":"buyBox2()","935b7dbd":"buyFor(address,uint256,uint256)","935bb767":"setPrices(uint256,uint256,bool)","935c1fb1":"addressIndex(address)","935cac39":"internalTransferFrom(address,address,uint256)","935d29d6":"BPToken()","935d647f":"getPublicForSecretFor(bytes32)","935dfb71":"adjusted()","935e1533":"processFinishLottery(address)","935e97c2":"settleTransactionByMediator(uint256,uint256,uint256)","935eb35f":"addToBlacklist(address[])","935ebb78":"MAX_USD_FUNDING()","935eeddc":"CarUpdated(uint256)","935f43b2":"ipart(int128)","935f4c18":"sendPayment(address,uint256)","935fb955":"Mytoken(uint256)","93602379":"_transferCar(address,uint256)","936061cd":"claimWinner(address)","93608dfb":"earlySuccessTimestamp()","9360b138":"sendTokensTo(address[],uint256)","936224b8":"midEtherBonusValue()","93623fb8":"changeAcceptDice(bool)","936241b7":"hunterLicenceEarning()","93627f42":"globalMax()","9362917c":"FuckKuanLi()","9362e50e":"changeDeveloperSENSDestinationAddress(address)","936315d6":"canReveal(address)","93632ddd":"totalBNBContributed()","93634702":"isValidSignature(bytes32,address,bytes)","9363933c":"GizerItems()","9363a141":"getDepositCount()","9363c812":"floorPrice()","9363fb71":"totalFreeTokensDistributed()","9364003c":"HDC()","93643a5b":"fazzycoin()","936597da":"mLoadAndReturn(bool)","9366804f":"checkForJoin(uint256,address,uint256)","9366fd5c":"getEvaluationByRecorderID(uint32,uint64)","936710bf":"getBalanceOfAccount(address)","9367a863":"t_Andrey()","9367f8de":"SPCToken()","93683f3d":"changeReserveBountyRecipient(address)","9368f482":"_betterThan(address,address)","9368f72c":"burnFromToken(address,uint256)","93694f67":"opponent()","936b360d":"Tachyon(uint256,string,uint8,string)","936b603d":"contributorTokens()","936bbf9a":"totalPostIcoContributorIds()","936bfa40":"the120address()","936bfc63":"OrcERC20()","936c9bc9":"ICOdeadline()","936cfb0e":"transferInternal(address,address,uint256,bytes)","936d2b0f":"addProductAtId(uint256,string,uint8)","936e9904":"AUCoin()","936ec951":"afterEach()","936f67ea":"CryptoStorage()","936f8a40":"setMinBuy(uint256,uint256,uint256)","936fddcb":"VULCAN_PROMETHEUS_EXTRACTION_BASE()","93709788":"forwardManyTransaction(uint256[])","9370a07c":"TSVC()","9371c369":"applicationRejected(address,address)","9371de6e":"unsoldVUPDestination()","93720b2f":"giveAways(address,uint256,uint256)","93736419":"UpdateUserExpire(address,uint32)","9373ad6c":"inviteFinished()","9373b8bd":"claimAddresses(address[],uint256)","9373e2a1":"CircleCrowdsale(uint256,address)","9373f432":"setWithdrawWallet(address)","93741a3e":"iterate(string)","93742d83":"makeBet(uint8,uint8,uint8,uint8,uint8,uint8,address)","9374c487":"overshoot()","9374ec98":"whiteListMge()","9375206a":"setAllowed(address[],uint8,bool)","93762cff":"_resetMine()","93766a57":"trade(address,uint256,address,address,uint256,uint256,bool)","93768820":"isCommunityToken(address)","9377530f":"grandTotalClaimed()","93778e2d":"setCompte_6(string)","9378a9e2":"setUInt(uint256)","9378f08f":"ScamStampToken()","9379077f":"bookDayVisit(uint256)","93790f44":"getKey(address)","93791262":"performInit()","93796317":"InternationalTourismPublicChain(uint256,string,uint8,string)","93798ff5":"BuurmansToken()","9379d936":"calculateBonus(uint8,uint256,uint256)","937a7ac5":"moveStageWithdrawn()","937a9151":"WBIToken(uint256,string,string)","937adbe6":"isInTerm(address)","937b19ef":"EtherRoyalToken()","937b7cf1":"contractFallback(address,address,uint256,bytes)","937c0cdf":"priviledgedAddress()","937c0d0a":"aaa()","937c9e3c":"CandyLandSale(address)","937cde20":"hasPass(address)","937dc72f":"AppCoins()","937e09b1":"minimumContribution()","937e909b":"reservesPerTokenDest(address,uint256)","937ebbd2":"sendTokensToBountyOwner()","937ef8e3":"getUserReferralsProfit(address)","937f2e33":"claimMyTokens()","937f6e77":"setInfo(string)","937fd355":"initializeBasicFundraiser(uint256,uint256,uint256,address)","93806144":"getPunitoryInterest(uint256)","93808351":"setPriceInternal(address,uint256)","9380b8e7":"testFailAddingMembers()","93813782":"Tasoha()","938199a5":"getDateOfLastPayment()","9381da6e":"getEstateData(uint256)","9381e53f":"TokensCollected(address,uint256)","9381ebfa":"EUAHTOKEN()","9382ef65":"prvdWallet()","93830c74":"solUpDownVote(bool,uint32,address)","9383d4e6":"SingularityTest14()","93847d54":"TRLCoinSale(address)","9384f31e":"SingularityTest19()","93854494":"factHash()","93859188":"amount_bonus()","93867fb5":"roleAdmin()","9388b560":"TOKENS_ALLOCATED_TO_SERVUS()","938a465e":"TOKETH_PRESALE_ONE()","938ae4cc":"testThrowDisownNotTransferable()","938b5f32":"origin()","938b643b":"TimeToMeet()","938bcd67":"getChannelIdentifier(address,address)","938c4307":"scheduleCall(bytes4,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)","938d0444":"SmileToken()","938d2f46":"escrowDeletion(address,address,uint256)","938d9632":"activekey()","938da22d":"secondReleaseTime()","938db92e":"ICO_Tier()","938e6fcc":"MiningStart(uint256,uint256,uint256)","938f3cc4":"create(address,address,address,address,address,address,address,string,string)","938f407a":"removeFromWhitelistInternal(address,uint256)","938f6c5f":"getBountyTokens()","938f7064":"createTopic(string,string,uint256)","93904aae":"coinToBurn()","939090f8":"deposit4(address,address)","93920e8f":"invest(address[],uint256)","93924147":"MoveFromBase(uint256)","93928c91":"thirdBonus()","9392e5b5":"erase(uint256,uint256)","93930020":"getLastConsolationPrize()","9393c09c":"addFabric(address,address)","93940e0a":"INTLToken()","939528b1":"transferProposalCooldown()","939624ab":"removeStake(uint256)","9396a7f0":"getQuickBuyPathLength()","939729c1":"installerPercentage()","9397afcb":"PlayingCrypto()","9397f2a2":"weekOneRate()","939802af":"getDataForTokenId(uint256)","93986193":"realizedTokenBalance(address)","9398e0cd":"data(int256)","9398ecb6":"setMaxParcels(uint256)","939935cb":"startTimeInMinutes()","93997075":"AddCommitteeVoteEvent(address,address)","9399869d":"getContractCount()","9399dcfb":"PointGameProcess(address,uint256)","9399dd7e":"serverEndGameConflict(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,bytes32,bytes32)","939a470e":"updateDescriptionHash(string)","939a79ac":"demo(string)","939a8dc1":"CryptoPepeMarketToken()","939b73aa":"getAthlete(uint256)","939b7842":"approveMigration(uint256)","939bfc79":"TTAC()","939c0a66":"AirDrop()","939c23b6":"setProtectionForMyUnprotectedCrypton(uint256,uint256)","939cda3f":"DgxDemurrageReporter(address,address,address,address)","939d3ac4":"sendCommunity()","939d8729":"_postValidatePurchase(address,uint256,uint256)","939de809":"checkSale()","939e014e":"optionTransfer(address,uint256,uint256)","939e436c":"weiPerContributor(address)","939ea4f8":"bombs(uint8)","939fb3bf":"Owanble()","93a00d27":"rektCoinCashSafe()","93a09352":"setValue(string)","93a0c742":"getIdeaParties(uint256)","93a0dc08":"disableAffiliate()","93a2f88d":"gettopid(address)","93a2fa6c":"Emission(uint8,uint256)","93a31509":"LEXToken()","93a32f62":"assignToken(address)","93a378da":"addHodlerStake(address,uint256)","93a408d7":"priceUSD()","93a422bb":"updUserBlackList(address[],address[])","93a45612":"SetPresaleHandler(address)","93a52980":"getTotalEtherPool(uint8)","93a595f5":"repayLoan(address,uint256)","93a5a9da":"resignTrustee()","93a69ae0":"eForecastGambleToken()","93a8333e":"Count()","93a91682":"curPrice()","93a91f25":"setInitialAllocation(address[],bytes32[],uint256[])","93a95fa8":"superPowerFulDragonOwner()","93a962fc":"addUndergraduate(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)","93a991af":"withdrawDai(uint256)","93aa3014":"BarryUtilityCoin()","93aa5ca8":"BITNOT(bytes32)","93aababc":"setlockBalance(address,uint256)","93aacd7d":"ownerLabel()","93abc530":"getSubscriptionOwner(bytes32)","93ac3638":"setAuctionAddress(address)","93ac3905":"lastGateway()","93ac5048":"BitallexToken()","93ac7c83":"EVTCToken(address,uint256)","93adf28b":"PumpAndDump()","93aef871":"checkSolved()","93af0292":"complete(address)","93af339f":"cardDrawPrice()","93af8ed4":"maybeChangePrice()","93afbdae":"repriceAuctions(uint256[],uint256[],uint256[],uint256)","93affe51":"getBoth()","93b14daa":"right14(uint256)","93b155af":"win(bytes32)","93b16ff5":"IkuraBurn(address,uint256)","93b1d4c7":"OfferingRegistry(address)","93b212bc":"subWithdraw(address)","93b21c8c":"destroyThreshold()","93b2467e":"totalSold(uint256)","93b30efc":"doSellerRequestCancel(bytes16,address,address,uint256,uint16,uint128)","93b3a368":"getCorrespondingIntegerValue(bytes32,uint8,uint256)","93b3bb35":"VisualFodderCoin()","93b4a73c":"KITTOKEN()","93b4c69b":"_assignRole(address,bytes32,address,uint256)","93b557db":"dSetArbitraryData(bytes32,bytes,bytes)","93b69f86":"getPlayerCoin(address,address,uint256)","93b71fe5":"Dao1901Votes(address)","93b7e7cb":"addCancellation(address)","93b8386d":"agencyOf(address)","93b8e90d":"isMasterAccount(address)","93ba3f15":"propose(address,uint256,bytes)","93baa6ef":"InterfaceImplementerSet(address,bytes32,address)","93bb3aee":"betAddressArray(uint256)","93bbafd1":"earlyBirdInvestments(address)","93bc771a":"ceoDevfund()","93bc96fa":"withdrawTo(uint256)","93bcabb7":"pullRow(uint256)","93bd0142":"ETHERDELTA_ADDR()","93bd1484":"mintApproveClear(address,address)","93bd27de":"IOweYou()","93bd4fc4":"depositAgent(uint256,uint256,uint256,string,uint256,string)","93bd90c4":"richtokenIndexToApproved(uint256)","93be0f83":"MSPT()","93bebdec":"corporationContract()","93c0771c":"getGamesPlayers(uint256)","93c166ec":"computeEndowment(uint256,uint256,uint256,uint256)","93c19e18":"rate0()","93c2c7f0":"getClosingSettle(bytes32)","93c2f482":"maxRound()","93c32e06":"changeFounder(address)","93c38965":"getData_15()","93c434e5":"getOptionInfo(uint256,uint256)","93c4ade0":"viewMaxShares()","93c5186c":"isNewPrice()","93c573c0":"maxChequeValue()","93c5ace0":"walletTokenTeam()","93c6475c":"processBet(uint8,uint256,uint256,int256,bytes32,bytes32)","93c69927":"sizeOfBool()","93c7ca84":"countBet()","93c7e009":"AddTrustedContractAddress(address,address)","93c8b0d4":"addForeignChild(bytes32,bytes32)","93c92b73":"exchangeRateArray()","93c94acb":"calculateRewards(uint256[3][3])","93c958f3":"ManufactorWallet(string)","93c98cbc":"ApplicationQualityCoin()","93c9b63e":"SGTCoin(uint256)","93ca5de7":"CIzTezt(string)","93cb1a4e":"originalHash()","93cc6d85":"transformDataContract()","93cc9162":"taskRejected(uint256,uint256)","93cca918":"place()","93cd22b8":"addAdministrators(address)","93cddbcf":"goldToEur()","93ce9791":"emergencyFinalize()","93cfd79f":"getVisitorCount()","93d07d07":"hoursCount()","93d087a2":"setData_33(string)","93d0de98":"AirDropContract()","93d1217e":"lastBlock_v3Hash_uint256()","93d18e92":"processOrder(bytes32)","93d22e52":"setEFContract(address,address,uint256)","93d3173a":"delegateDecreaseApproval(address,uint256,address)","93d4673f":"BTCTKN()","93d48b11":"zombieToken()","93d51daf":"amountofp3d()","93d5276b":"investInternal(address)","93d5825e":"calculateTokenSell(uint256)","93d5908a":"harapan(address,uint256)","93d5c520":"DelegateCallToken(uint256)","93d60990":"teamWithdraw(uint256)","93d68cfa":"preferredSaleStartTime()","93d759b8":"allowedAccount()","93d76f0e":"DEVELOP_CAP_PER_ROUND()","93d79105":"hashRelease(bytes32,bytes32)","93d7c6bf":"researchDivPercent()","93d81d58":"cancelSubscription(address)","93d84bf0":"oraclize_newRandomDSQuery(uint256,uint256,bytes,uint256)","93d865e3":"tokensFromPresale()","93d88409":"suspendSale()","93d90a4e":"HostingIcos()","93d91eae":"getFractionalAmount(uint256,uint256)","93d96049":"burn_lost()","93d9df16":"setCounter(int256)","93d9fd74":"getTitulaire_Compte_4()","93da1db1":"Profiterole(address,address,address)","93da4cfd":"getInvertedPriceInfo(address)","93dafba2":"getSubpot(uint256)","93db7716":"get_sale_arbits_sold()","93dc12e6":"closeProject(uint256)","93dd4133":"signedByCLevel(bytes32,bytes)","93dd738e":"notifyLegacyClaimed(address)","93dd9443":"Community()","93dd9866":"summEccles()","93de2527":"RegisterStaff(address,string,string,string)","93de6c51":"CHGUSDPRICE()","93dfbbcb":"setTokenExchangeRate(uint256,uint256,uint256)","93dfea8f":"ong()","93e02d13":"FallenLeaders()","93e1021a":"Participant()","93e1595d":"ATTR_CONSUMABLE()","93e24b7a":"teamVaultAddr()","93e3fca1":"stopGameOnNextRound()","93e426de":"MIN_WITHDRAW_WEI()","93e432d4":"refillGift()","93e43bbe":"getPost(bytes32)","93e4bf4f":"addPrecommitment(address,uint256,uint256)","93e5365f":"maxAddresses()","93e59dc1":"whitelist()","93e67bff":"IPFSHash()","93e7155b":"swapActivityHandler()","93e7d6c6":"createInviteName(bytes32)","93e84cd9":"play()","93e96174":"getNextDiniRequestId()","93e9a084":"lastTime()","93ea0e02":"batchTokenTransfer(address[],uint256[])","93eade00":"tokenAssignExchange(address,uint256,uint256)","93eb049d":"dp()","93eb33b3":"notifyDeathConfirmation()","93eb3c62":"Send(address,address,uint256)","93ed013d":"ecosystemAddr()","93ed4426":"extraBonus()","93eda78d":"getClaimData3(uint256)","93edaf59":"freezers(uint256)","93edbe36":"CHELCOIN()","93eeb3fb":"checkRate(address,address)","93eec1fb":"setName(uint8,uint8,string)","93efbdbb":"DPIcoWhitelist()","93f0bb51":"order(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","93f1b685":"LuckyPackage()","93f27be2":"_assignOverlfowData(uint256)","93f2ad91":"ExtremeToken()","93f2ba24":"testdiv256_128By256()","93f2fa04":"ThingToken()","93f32659":"getInitialWithdraw()","93f33b88":"notifySale(uint256,uint256,uint256)","93f43863":"getEmployerJobs(address,address)","93f5ddf2":"ICOStarted(uint256,uint256)","93f63e70":"setBenefit(address)","93f6fd85":"createCampaign(uint256,bytes32,bytes32,bytes32)","93f7cc99":"getPlayerAccount(address)","93f826c9":"portfolioSummary(address,address)","93f84cfe":"mintTeam(address,uint256)","93f85021":"numLeaders()","93f8e9f7":"mediumMod()","93fa47f1":"lockGoldTransfers(bool)","93faf781":"loggedAsStatement(uint256)","93fb28bd":"getUnitAttackMultiplier(address,address,uint256)","93fc2c8b":"winnerIsDraw()","93fc5ebb":"_secondRoundWinnersFight()","93fe0237":"updateWhitelist(uint256[],bool)","93fe4248":"deleteUIntValue(bytes32)","93fea184":"CONTRIBUTIONS_MAX()","93fea3fc":"supportValidator(address)","93feb13b":"ForceSendHelper(address)","93ff3e4a":"insertNewUser(uint32,bytes32,address,uint256,uint256,uint256,uint32,bool)","93fffddc":"previousContractAddress()","94002b57":"goldToken()","940064e3":"periodPreITO_hardCapInUSD()","94009bbc":"powerUp(address,address,uint256)","940147ac":"tribeProducts(address)","94014dc0":"weiRaisedPreICO()","94018e20":"removeRoles(bytes32[],address,address)","9401c82b":"CAECToken()","9401d547":"lockExternalTransfer()","9401e4e7":"TokensFlushed(address,uint256)","94025211":"refundToOtherProcess(address,uint256)","9403e8dd":"casino()","94044c75":"_invokeTokenRecipient(address,address,uint256,uint256,uint256,uint256)","94056c42":"mintTRCToken(address,uint256)","9405b406":"ProposalManager()","9405c78f":"setQuantity(uint256,uint256)","9405de64":"checkAllowance()","9405dfdd":"listingId()","94062a9d":"minBuyingAmount()","94066fb1":"cancelOfferAlice(uint256)","9406aea9":"startCall(uint256,uint8,bytes32,bytes32)","9406cf59":"setChallengeFeeMultiplier(uint256)","9406e273":"NBELToken()","94074b03":"getNetworkName()","94077c50":"updatePriceAgent(address)","9407a688":"allowedForwards(bytes32)","9407ea98":"setMarketplaceFee(uint256)","94081387":"administrate(uint256)","940834be":"MidnightCoin()","940900b8":"bookOvernightVisit(uint256)","94097168":"burnTokenBurn(uint256)","9409962f":"withdrawExtraTokens(address)","940a4e45":"distributeReward(uint256)","940a6cf5":"getAdministratorCount()","940a82a3":"distributeCTS(address[],uint256,uint256)","940aa73f":"setMinimumVotingWindow(uint256)","940b29b2":"etherReceivers(uint256)","940bb344":"burnUnsoldTokens()","940beaf5":"getTransactionIds(bool)","940c154b":"lockBet(uint256)","940c17c0":"CROWD_WEEK4_PERIOD()","940d0780":"AdmChange_README(string)","940d553f":"FoodTransferEvent(address,address,uint256,address,uint256,uint256)","940d5e08":"Alpon()","940d72ec":"buyPack(uint8)","940dab4c":"prefixedHash()","940dbf3e":"invokeOnce()","940de97e":"privateSaleStartTime()","940df414":"claimAddress(address,uint256)","940ebef7":"secondsRemaining()","940f02e0":"setDevelopersTokensWallet(address)","940f0661":"PrivateLedger()","940f851c":"Ballot(uint8)","940fae9e":"confirmBoosterQuest(address)","9410579d":"_calculatePriceComplement(uint8)","94106200":"testFailCreateSameNonce()","94107690":"checkPurchaseRecord(address)","9411c88b":"TokenContract(uint256)","9414d0bf":"initializeUsdReceived()","9415931d":"getLastDividendsAmount()","941660e5":"getRoundMaxPerUser(uint256)","9416893b":"addDemoData()","94169f25":"preIcoTotalCollected()","9416b423":"toLower(string)","94181d27":"lastReparation()","94182798":"dna4(uint256)","9418b8a6":"closeUsingTrustedRecipient(address,address,uint256)","9418d25a":"proveBuy(bytes,int256)","94194be4":"openingTimeB()","9419768d":"checkBetting(uint256,address)","941993f8":"changeCofounderB(address)","9419a2da":"setPaymentDetails(uint256,string)","9419f17c":"decraseTimeToAction(uint256)","9419fd29":"getWidth(uint256)","941a4bc7":"getPartnerCash(uint8,address)","941a5074":"controllar_account()","941a8486":"ownerChangeSellerfee(uint256)","941b0161":"addMarket(uint256,uint256,uint256,uint256)","941da7b8":"testExpiredBalance()","941e98a8":"EMISSION_FOR_SALESTAGE1()","941f9580":"rewardKey(address,uint256)","94201882":"artistEmail()","94224066":"setCityValues(uint256[],uint256,uint256[],uint256[])","942273bd":"SAMURAI()","942324c3":"getSponsoringCount(uint32)","94235f77":"apLockUp(address)","9423719b":"tokenBonusForFirst()","942385eb":"getPayroll()","9423f443":"submitGameResults(uint256)","9423fc54":"transferClearingFunction(address)","94248eaa":"isStateProjectInProgress()","9425753c":"licenseProductId(uint256)","9426e226":"validatorSet()","94272356":"_setReferrer(address,address)","9427aa96":"getBonus(uint256,uint256)","9427dfea":"ownerRecoverTokens(address)","942802e7":"VULCAN_POD_FTL_SPEED()","94282357":"EFASCOIN()","9428522a":"getNode(string)","9429d441":"reclaimBySender(uint256,address,address,bytes32)","942a8ad3":"getAQL(address)","942ab177":"MintToggle(bool)","942ab286":"buyTicket(uint256[],address,uint256,uint256)","942ac303":"goalInEthers()","942b765a":"getList()","942b90d3":"getRewardTable()","942bc8d4":"unpauseAngelToken()","942d468b":"transferArray(address[],uint256[])","942d73b1":"readAddr()","942dac28":"amounRefferalWon()","942ea466":"getNumber(address)","94306ecb":"AutoreleaseDelayed()","94313c5b":"getPositionOwedAmount(bytes32)","94313f9f":"cleanConsents(bytes32[],address[])","943153cf":"StonePaper()","9431e412":"getCommunityRates(uint256)","9431f5f0":"withdrawFees(bytes)","943215ae":"investmentFundWallet()","943250c4":"SquirtCoin()","9432c92c":"setStartTimeIcoStage1(uint256)","9432f0c7":"receiveClosePositionPayout(bytes32,uint256,address,address,address,uint256,uint256,bool)","9433a498":"totalFountainSupply()","9433a81e":"personIndexToApproved(uint256)","9434c981":"createNewMartial(uint256,uint256,uint256)","9434d765":"allocated12Months()","94353c70":"postMonForClass(uint64,uint32)","9435c887":"cancelBid()","9437563c":"logPriceBefore()","943814f0":"getWhitepaperAt(address,uint256)","9438cca8":"cancelEscrow(uint256,uint256)","9439060f":"getGameNumber(uint256)","943911bc":"getWorseOffer(uint256)","943a32bc":"Relay(address)","943a5e28":"RENEX_ATOMIC_SETTLEMENT_ID()","943b0747":"RewardOffer(address,address,bytes,uint256,uint256,uint128,uint256)","943b82f1":"getLimit(uint16)","943bd25d":"addNewBetAmount(uint256)","943dfef1":"bounty()","943e170d":"neededSignatures()","943e8216":"vote(uint256,uint8)","943eb504":"supplyLocked()","943fa364":"MPhoneSeller()","943fcc9d":"buyRoseETH(string)","943fd51c":"claim2Ply(uint64,uint64,uint64,uint64)","9440f01f":"buyCoins(address,uint256)","9441268b":"updateGlobalTokenAge()","944126f4":"acceptSupport()","94412943":"bountyOf(address)","9441e646":"addWhiteList(address,address)","9442936f":"d(address,address,uint256)","94429fa6":"withDrawAnyERC20Token(address,uint256)","9442fad9":"deployTokens(uint256[],address[])","94431f80":"getAvailableEtherCommissions()","94432deb":"fairsale_protection()","944358e0":"getContributedAmountInWei(address)","9443b9be":"TokenTimeLock(address)","9444991d":"getVotingListCount()","9445eb3a":"Terminate()","94465bf6":"adjustDuration(uint256)","94477104":"vestedOf(address)","9447fd0a":"until()","9448807a":"secondPay()","9448bcea":"getPlayerRoundNums(uint256,address)","94493c43":"getLockCount()","94495468":"totalTokenRice()","9449a361":"setStakeRequirements(uint256,uint256)","944a1a75":"CELION()","944abc22":"_updateCurrentPeriod()","944ac0c6":"MAIN_SALE_START_TIME()","944af2ae":"TegTokens(uint256,string,string)","944b7c3f":"getMaxNumberOfTokens()","944c1d97":"resetPeriod()","944c8929":"checkBeatingPrice(uint256,bool)","944da654":"editModule(uint256,uint256,address,bytes4)","944dc22c":"addRemovableIdArrayItem(address,uint256[],string,string,string,uint256)","944ea02d":"checkTokenBalanceState(address)","944ea477":"OPERATION_AMOUNT()","944f0499":"transferTokensFromTeamAddress2(address,uint256)","944f0e64":"tokenInfoParametersReady()","9450b1c8":"addCharityFundation(string,string,string)","9451bca7":"result_votes()","9451f865":"TestConf()","94525e12":"lowRate()","94532ced":"blockSettle(uint64,uint64,bytes)","9453b95d":"addOrUpdateAccounts(address[],uint256[],uint256[])","9453f381":"getBeneficiaryCash(address)","9453f767":"createOrder(string,address)","94543c15":"isDeprecated(address)","94544e64":"transferFeePercent()","94555d1a":"addSubscriber(address)","9455924f":"getTotalVolumeToken(address)","94566d25":"jobPost()","9456e5b5":"stockSet()","9456f7e9":"getHashByTokenId(uint256)","9456fbcc":"withdrawERC20(address,address)","94579680":"changeUserGrowthAddress(address)","9457c1dc":"enableMigration(address)","9457c68a":"forceEndCall()","9458434f":"mainWeiRaised()","94594625":"distributeAirdrop(address[],uint256)","9459c254":"refund(address,string,uint256,uint256,uint256)","945a2555":"queryPermissions(address)","945aab47":"tokenSaleCap()","945ade92":"initialDate()","945c6cf8":"burn_all_unsold()","945c7438":"sign(address,int256)","945c7c59":"distributeTokenSale(uint256,uint256,uint256,uint256)","945d7b7e":"tranchesSent()","945ddb52":"mainSaleTotalSupply()","945e5f24":"roughSupply()","94602869":"receiverWithdrawal(uint256)","9461446d":"setProcessingFee(uint256)","94615fc1":"setFreezingStatus(uint8)","946267ec":"mintComplete(uint256,int256)","9462eae5":"ChangeContractor(address)","9462f4bc":"bytarr(bytes32[])","94636cee":"createPromoMonster(uint32,bytes,address)","9463d582":"teamOneWin()","94642f96":"investorWhiteList(address)","94644764":"lookUpClaimerAddress(uint256,address)","94650fb8":"Goal()","94655f2b":"printMoney()","94658690":"parseUserInivte(uint256,uint256)","9465c114":"vanishToken(uint256)","946644cd":"fun()","94679ce7":"changeEtherPrice(uint256)","946941ec":"Contribute(bytes24)","946a893d":"shopDoublet()","946ad94d":"tokenContractEnableTransfers(bool)","946ae8df":"FMGHEALTHCARE()","946ba496":"ShishuToken(uint256,string,string)","946bcc30":"getFounder()","946bf4d7":"winningProject()","946c0344":"getChallenges(uint256)","946ca295":"userTransfer(address,uint256)","946d1480":"ethToUsd(uint256)","946d8806":"getMyPacifist()","946d9204":"initialize(address,address[])","946f8876":"updateTierStatus(uint256,uint256)","94704818":"fillOrder(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,uint256,bytes)","94705167":"enableArbiter(address)","94707a95":"_setRate(uint256)","9470b0bd":"withdrawFrom(address,uint256)","94727b41":"deleteProduct(bytes32)","9472b32c":"sale_period()","9472eb76":"setPayerString(string)","94737987":"referralProgram(bool,uint256)","94741017":"failCrowdsale()","94756e22":"VikoChain(string,string,address)","94759c36":"createQuote(uint256,uint256,bytes32)","9476760d":"AthletiCoin(address,address)","947721dd":"refundEndDate()","947846a4":"RefundableCrowdsale(uint256)","9478a7c9":"getReferralOf(address)","9478ab8c":"ethUsdPrice()","9478ba47":"calcUnclaimedFees(uint256)","9478f7cf":"_receiveEth()","9479f2c7":"STAKE_DEADLINE()","947a3168":"token_name()","947a36fb":"interval()","947aca55":"addMasterAccount(address)","947af462":"setBurnRequestAddressMap(uint256,string,address)","947bc72d":"MAX_TRANSFER_TIMSPAN()","947bd798":"rawManuallyMintTokens(address,uint256)","947cbc1e":"dariatest()","947e8a26":"TOKEN_MINTING()","947f7d1d":"newRandom()","947f8ede":"IcoCapChanged(address,uint256)","947f97cc":"getUnsoldTokens(uint256)","947f996d":"testGreatherThan()","947fd341":"getCoefficientMultiplier(string,string,string)","9480cd1a":"getPillarRoundsKitties(uint8,uint256)","94828ee8":"DelightToken()","94836dab":"sendFounders()","9483e91a":"withdraw(address,uint256,bytes,uint256)","9483f25c":"updateProfile(string,string,string,string)","948623dd":"buy(address,bytes,bytes32)","94868f7d":"airDropPayableTag()","948759d5":"transfermulti(address[],uint256[])","94876995":"isHandleAvailable(bytes32)","9489fa84":"calcSharePrice()","948a70d7":"SingularityTest16()","948b557a":"getDispute()","948b6790":"getTokensPrice(uint256,bool)","948bc5d6":"XfinityUtility()","948cd942":"getDronePot()","948cfd0c":"updateBootyBase(address)","948d902d":"getTokensByETH(uint256)","948e1a1c":"AVAILABLE_TOKENS()","948f1daa":"mintLockPeriod(address,uint256,uint256)","948f5076":"setCache(address)","949076b6":"ensureInterval()","94910d60":"createContract(address,address,uint256,string)","9491a8eb":"updatemktValue(uint256)","949201d7":"LOG_FailedSend(address,uint256)","94923fd7":"LogRevokeNotice(bytes32,address,uint256)","9492fbf7":"BGS()","94930138":"getLoanUnavailableAmount(bytes32)","949319b1":"verifyService(address)","9493242c":"returnLender(uint256)","9493ac07":"setBattleFee(uint256)","9493b9b0":"createMiner()","9493f012":"batchSafeTransferFrom(uint256[],address,address)","949430f0":"BTC_SUISSE_TIER_1()","94953294":"downTheDrain()","94954967":"setMaxWhitelistLengthInternal(uint256)","9495ad6c":"listExists(bytes32)","9495f8c6":"upgradableState()","9496df3f":"freezeQuorumPercent()","94974aea":"unlockedAtBlockNumber()","9497b7a1":"yearlyTeamAmount()","9498a265":"updateCertifier(address,address)","9498bef5":"overloadedMethod(address,uint256)","9498fb26":"ELIX()","94992b76":"ICOSTART()","94993e52":"_breedWith(uint256,uint256,address)","94996680":"setStartTimeStamp(uint256)","9499e018":"destructContract()","949a6868":"RefundTicket(address,uint256)","949a9d59":"receiveWithData(bytes)","949b56ef":"whitelistPrincipleLockPeriod()","949b9e10":"createHumanStandardToken(address[],uint256[],string,uint8,string)","949ba7c3":"GNCCrowdsale(address,address,address)","949c5099":"isAwaitingPRETDETokens(address)","949c89a0":"BitBaBeToken()","949cc9ea":"tokenSupplyBackedByGold()","949cfc64":"restTime(address)","949d225d":"size()","949db658":"rateProvider()","949dcdab":"forceWithDrawToInviter(address,uint256)","949dfa63":"calculatePurchaseReturn(uint256,uint256,uint8,uint256)","949e8acd":"myTokens()","949eabff":"fundsRaisedInWei()","949eb1c6":"bankersLimit()","949f80b0":"RandomExample()","949f80c5":"getResult(uint256,uint256)","94a08c69":"TOTALSUPPLY()","94a0b878":"fromTileId(uint16)","94a0c1cc":"cancelVoteForCandidateBySnapshotBlock(address,uint256,uint256)","94a1710d":"testNonOwnerCantBreach()","94a1be9c":"addVotes(uint256)","94a1d75c":"withdrawBidForSketch(uint256)","94a224c0":"withdrawExpenses()","94a2301e":"tokensInEth()","94a535fc":"TokenAdd(uint256,address)","94a53d41":"minimal()","94a5601a":"getMaxCap(address)","94a5c2e4":"maxValue()","94a5cccb":"deposit_period(uint256)","94a66da2":"GamePlayerCoin()","94a66df3":"objectGloves()","94a74249":"panicked()","94a771d7":"getReportTimestamp()","94a7ef15":"addWhitelistAddress(address)","94a80dd9":"getPoolValue(uint256)","94a82671":"unRegister(address,string,address)","94a89233":"isPluginInterface()","94aa6775":"newDeposit(address,address,uint256)","94aa8174":"AddParticipant(address,address,string,uint8,string,string,bytes32)","94ab9608":"XRRtoken()","94abbeaf":"PieToken()","94ad4f89":"icoDays()","94ae2341":"exchangeHelenium(uint256)","94ae4899":"onMintCalled(int256)","94ae7ac3":"allowanceAdd(address,uint256)","94aef022":"getVariables()","94af9da8":"createNewCombination(address)","94b0780f":"burntokens(uint256)","94b2ffc0":"StarterCoin(uint256,address)","94b31fbd":"getTokenAllowance(address,address,address)","94b367a3":"_takeOwnership(uint256,address)","94b44f3e":"addressToBlock(address[],bool)","94b4c93d":"MomentalyOwned()","94b5255b":"distributePreBuyersRewards(address[],uint256[])","94b5c9f3":"getChampReward(uint256)","94b5ed6d":"minorOwnerShares()","94b66386":"attackIsland(uint256,uint256)","94b67b1c":"getWeakenedDefensePower(uint256)","94b8896c":"holdAddress2()","94b8e58e":"resetWith(address,address)","94b8e72a":"Allocate(address,address,uint256,uint256,bool)","94b918de":"swap(uint256)","94b91deb":"construct()","94b91f06":"PARTNERS()","94b941db":"investorInfo(uint256)","94b9b62f":"getPacifistmasterReq()","94b9bdc4":"BlueDiamond()","94b9f152":"cancelConversion(uint256)","94bab061":"getVersionNo(bytes)","94bacfef":"distributeVLD(address[],uint256,uint256)","94bb136f":"minFinnRequired()","94bb7d64":"itemHistoryOfPlayer(uint256,address)","94bbfb56":"changeAffiliatePercentage(uint256)","94bc7df4":"BlocksToGo()","94bcdb4c":"Example2()","94bd5cb6":"newParityOwner()","94bdb93b":"MessageAdded(address,string,uint256)","94be2423":"setAtomGen(uint256,uint8)","94beb9b2":"ConstructBitcoinClue(bytes32,bytes32,bytes32,bytes32)","94bf804d":"mint(uint256,address)","94bf8862":"numBoards()","94c06a58":"descending()","94c0ac22":"ExchangeZWCToToken(address,address,uint256)","94c0f3e2":"PRESALE_PERCENTAGE_5()","94c176e4":"distributeAll(uint256)","94c19fb8":"LogSaleClosed(uint256,uint256)","94c1d810":"partFromProvider(uint256,address)","94c21ff3":"STATEMENT_HASH()","94c275ad":"maxConversionFee()","94c33163":"getTotalTokensSold()","94c33d90":"districtToBuildings(uint256,uint256)","94c3fa2e":"getLastBlockHashUsed()","94c41bdb":"getPreferedQtySold()","94c467d0":"banAuditor(address)","94c475ec":"setAltDeposits(uint256)","94c4e3c6":"_getVolumeBonus(uint256,uint256)","94c6116f":"getNextPeriodTimestamp()","94c62fb5":"SPARCPresale()","94c64a2e":"updateBtcRate(string,string)","94c69715":"bonusInPhase3()","94c70cb1":"bonusEnd20()","94c77969":"setTokenContract(address,uint8[],bytes32[],bytes32[])","94c87a84":"withrawAllEthOnContract()","94c89af5":"FeeProvider()","94c8cd62":"AreebaCoin()","94c90cac":"EliteCoin()","94c9b647":"sendTransaction(address,uint256,int256)","94ca9f90":"highestBalance()","94cace04":"enableMix()","94cb0947":"availableTokens(address)","94cc0898":"___test()","94ccbc1f":"transferPattern(bytes32,address,string,uint8,bytes32,bytes32)","94cdbea1":"SetDappinfo(string,address,address,string,string)","94cddaf1":"unlockTeamAndReserveTokens()","94cec87b":"preSale3Finished()","94cf9b1b":"FGCToken()","94cfb3d8":"getItemTempHolders(uint256)","94d0025e":"getNumberOfOpenSteps()","94d008ef":"mint(address,uint256,bytes)","94d02fff":"Authored(string,string,uint8,uint256)","94d036bf":"validInitialBuyoutPrice(uint256,uint256)","94d10c41":"spendUserBalance(uint32,uint64)","94d127a8":"calculateSeedBuy(uint256,uint256)","94d1330d":"spinnerCounts(uint256)","94d1b7e8":"triggerFailFlags()","94d26cb5":"getBetterOrderId(bytes32)","94d2b21b":"unauthorizedAddress()","94d2bdfe":"addSkill(bytes32)","94d2ca12":"getByAlias(bytes32)","94d2d7a7":"getCreatorAddress()","94d3d38d":"registerHello(bool,uint8,int64,int64,string,string)","94d3de83":"TeamVesting(address)","94d44f12":"createBattle(uint256)","94d453db":"MIN_INVESTMENT_PHASE1()","94d45856":"placeBet(bytes32,bytes32,bytes32)","94d54581":"EICQERC20()","94d5539d":"transferLocked(address,uint256,uint256,uint256[])","94d63afd":"left3(uint256)","94d645a8":"resolveClaim(address)","94d702a4":"tgeNextPartInvestor()","94d762c3":"Vault(address)","94d77363":"getTokenSold()","94d95f8f":"MAX_CONTRIBUTION()","94d96fa1":"BTC7200on420()","94d9c9c7":"setObserver(address)","94d9cf8f":"CreateProxyWithControllerAndRecovery(address,address[],uint256,uint256)","94da0746":"PRESALE_TOKEN_ALLOCATION()","94dafb16":"geteam(address)","94db4d05":"changeStakingContract(address)","94dba872":"o_automata(uint256)","94dbc70e":"lockState(address)","94dbe74e":"removeEscrow(address,address,uint256)","94dc7cec":"minBuyForPrize_()","94dc84ca":"AUTH_INITCONGRESS()","94ddc8c0":"submitBallot(bool)","94de3825":"_transferToAnotherAddr(address,uint256,bytes32)","94df682d":"loginVerify(bytes32)","94dfd38a":"test_invalidValue1EqValue2()","94e08fc2":"addProduct(bytes32,uint8,uint8)","94e09511":"sendTokenToPlatform(uint256)","94e0d371":"stage3()","94e0e328":"torchRunner()","94e0f844":"totalSellOrdersOf(address)","94e10784":"_getRate()","94e16386":"teammatesworld(address)","94e25c37":"unlockCustomer(address)","94e2662f":"setRequireWhitelistingBeforeDeposit(bool)","94e47e61":"create_block()","94e4a822":"split(address[])","94e4c808":"IPFSStore()","94e50e7a":"getSigner(address,uint40,uint40,uint128,uint256,uint8,bytes32,bytes32)","94e5b7e6":"getPlace(uint32)","94e5e890":"peculOldAdress()","94e8075d":"Development()","94e8767d":"uintToBytes(uint256)","94e93017":"_deployBallot(bytes32,bytes32,bytes32,uint256,bool,bool)","94eb463b":"Unset(address,uint32[])","94eba0b5":"StarCoin()","94ebd374":"purchaseAccessory(uint256,uint256,string,uint256)","94ec233f":"boolCallWithArray(bool,bool[4])","94ec3756":"resister(uint8,uint256,uint256)","94ec3a0d":"playersRequired()","94ed9b77":"append(address,address)","94eedaa4":"hirerReleaseFunds(bytes16,address,address,uint256,uint256)","94ef987e":"minimumPayment()","94efadea":"zoPrice()","94efafe9":"publishTemplate()","94effa14":"WithdrawETH(uint256)","94f0080c":"getBalancePremiumsPaid(address)","94f0b43c":"TripusCandyToken()","94f13f4a":"getGameItem(uint256)","94f183cb":"get_votes()","94f188be":"createIssuedToken(address[],uint256[],uint256,uint256,string,uint8,string)","94f29cb3":"medalIfFreeze(address)","94f2e623":"setLLV_edit_11(string)","94f2ed53":"_unlockNinja(uint256,uint16)","94f3217c":"MINIMUMINVESTMENTSALE()","94f38799":"GoChain()","94f3f81d":"removeAuthorization(address)","94f47146":"put(bytes)","94f5a1af":"LATOPreICO()","94f5ffd5":"betMake(uint256,uint8)","94f60a63":"getKudosLeft(address)","94f61134":"executeOrder(uint256)","94f649dd":"getDeposits(address)","94f6ba1c":"getMonsterClassBasic(uint32)","94f6e8ed":"initBallotProxy(uint8,bytes32,bytes32,bytes32[4])","94f75b96":"PerkToken()","94f7624f":"NAP()","94f8e954":"cancelInvestment()","94f92322":"getTotalPrediction(uint256,uint256)","94f976c3":"confirmProduct(uint256)","94fa3131":"claimBonus(uint16)","94fa5bcd":"setNewApproves()","94fabfb3":"getDocData(uint256)","94fb54d5":"euroThreshold(uint256)","94fb86c0":"referral_ledger()","94fd1c1c":"SAIToken(address,address,address)","94fdb8df":"HolyBible(uint16,uint16,uint16,uint16)","94fdbbb2":"createRedeemMessageHash(uint256,bytes4,bytes32,bytes32)","94fe344d":"SimpleToken(uint256,string,uint8,string,bool,bool)","94fe6ed1":"kTikTakCoin()","94ff1426":"_setTransmuterAddress(address)","94ff4b2b":"getServerFee(uint256)","94ffb819":"addApprover(address,string)","94ffe2c7":"PolicyRegistry(address)","95005a00":"LIANGToken()","95005b8b":"GetPlayerID(bytes32)","9500aa12":"MockController(address,address,address,address)","950108d7":"WithdrawForeign(address)","95029f34":"PendingOwner()","9502bb8a":"renounceMaster()","9502d761":"ProposalSubmitted(address,uint256)","950311ab":"setCurrentAction(uint256,uint8)","95032b62":"rand(uint256,uint256)","9503c4b4":"SmartRouletteToken()","95040933":"mrk_contract()","950463fc":"calculateRefundedEthWithDiscount(uint256)","9504f28a":"THBCToken()","95050862":"optimalExp(uint256)","95059465":"textFor(bytes32)","9505b2a7":"createPanda(uint256[2],uint256,uint256)","9506681f":"updateminContribution(uint256)","95066e33":"getTopic()","95068886":"change(address,uint256,address,uint256)","95069136":"requestLiquidation(uint256)","9506a57a":"Marriage(address)","9506a75c":"setChild(address,bytes32,bytes32,bool)","9507b53a":"SchedulableToken(address,uint256,uint256)","9507d39a":"get(uint256)","9508614b":"addStage()","9509a265":"allocateDividends()","9509ba0c":"getJackpotBalance()","950b5273":"currentARXtokenSupply()","950b550a":"fourth_withdrawal(uint256)","950c84e4":"presalePart()","950cb89e":"_editPriceOf(uint256,uint256,uint256)","950da0c8":"calculation()","950da0e6":"hasMinRating(address,address,uint8)","950dad19":"burnToken(address)","950dff20":"cancelCodeUpdate()","950ef8c7":"setAuthorityContractAddress(address)","950f4170":"gubbermentOverthrown()","950f9813":"rejectPartnerAllocation(address)","95101181":"removeAdminAddress(address)","9511309a":"setMinimumCollateralInEthAmount(uint256)","951166c0":"totalMessages()","9512243e":"TokenPurchase(address,address,uint256,uint256,uint256,uint256,uint256)","95127634":"upgradeOracle(address)","951303f5":"withdrawableAmount()","951367ad":"internalExchange(uint256)","951382bf":"mainSaleHasEnded()","95139780":"checkTokTotal()","951481b4":"addEmployee(uint256,uint256,string)","951506d3":"withdrawFeeRateE4()","9515a524":"BUSINESS_DEVELOPMENT_SUPPLY_LIMIT()","9515af55":"AetherClockAuction(address,uint256)","95163f39":"_finalizeStage()","9516a104":"getAllAddresses()","951717e2":"withdrawPrivateCoinByMan(address,uint256)","9518589a":"cost1token()","95199b24":"claimWin(bytes32,uint8,bytes32,bytes32)","9519e398":"aDeposit(uint256)","951b01c5":"setCertifierDb(address)","951b22fb":"swap(uint256,address,address,uint256,uint256,uint8,bytes32,bytes32)","951b26a3":"changeable()","951b73b1":"updateEndTimeManually(uint256)","951cfa47":"getScope()","951d0332":"_price_tokn_ICO1()","951d6c9c":"getDevRewardPercent()","951d86a4":"setBlockPerHour(uint256)","951e17a1":"totalSupplyForDivision()","951ea5f1":"setMarketingTokensPercent(uint256)","951f4a6e":"_triggerNFTEvent(address,address,uint256)","95206396":"numberLoop()","9520a06f":"DEFAULT_CREATION_LIMIT()","9520cc72":"EtherTradex()","9520f878":"NaxomartToken()","9521000c":"setOnlyShowPurchased(bool)","95210e59":"setBattleRemoveContractAddress(address,address)","95217ec9":"newAttack(uint32[])","9522ca89":"Message_To_Investors()","9524bdf8":"_refundTokenCustomer(uint256,uint256)","9525c0cc":"cancelVote(bytes32)","9525f382":"finalizeSettingCreation(uint256)","95260a29":"PEP()","95263183":"setACmarge(uint8)","95270cd1":"setOraclizeFee(uint256)","95275e5e":"minerLockTime()","95286077":"UBETCOIN_LEDGER_TO_LEDGER_ENTRY_DOCUMENT_SHA512()","952868b5":"onMaintenance()","9528724f":"votedFreeze()","952882fd":"addtoEarlyInvestors(address,address,uint256,uint256)","9528a278":"getAllInvestorPositions()","9528d109":"authorSigned(address)","9528fcb5":"numSubscribed()","952a84ed":"Rocketship()","952a9320":"HexanCoin(uint256,string,uint8,string)","952ad7cb":"forwardSomeFunds(uint256)","952b264c":"FundsReleased(uint256)","952c0f9f":"initGold()","952d6c22":"tokenSaleEnd()","952f2f6f":"setAccountIsFrozenByDate(address,uint256)","95306706":"logTraderTradingTx(string[])","953078cd":"withdrawDivsWithContract(address)","95311142":"dOwnerErc20Claim(bytes32)","9531c536":"ReceivedGBP(address,uint256)","9531d072":"refundETH(uint256)","953203b5":"doMigration(address)","9532c476":"setParcelUsd(uint256)","953307d8":"revealScissors(string)","95334db2":"toIndex(address)","953440f9":"nCeilings()","9534e637":"closePoll(uint256)","9535ce12":"getBool(string)","95360a02":"calCurrentCrystals(address)","95364a84":"isPresale()","953669be":"tokenHolders()","9536c05f":"doCheckSendBounds()","9536e0bb":"returnDirectPayments(address,bool,bool)","9537796f":"addSubscriptionBonus(address)","95377ad9":"testInequalityUint(int256)","9537e8d1":"signContract(uint256)","9538833c":"changeOwnerAccept()","9539c4de":"withheldAmount(address,address)","9539ed7e":"changeFlipper(address)","953a03ca":"minMillPurchase()","953a7fab":"testMoveBalance()","953aa435":"GetPrice(uint8)","953b42b3":"buyClusterToken()","953b7ef8":"withdrawTeamTokens()","953b8fb8":"targetAmount()","953bad32":"verificationAddressMap(address)","953e3450":"DaoRulesProposalAdded(uint256,uint256,uint256,uint256,uint256,uint256,bool)","953e474a":"setKoCommissionAccount(address)","954056f7":"setRedemptionWallet(address)","9540cb80":"End1()","9541945a":"registerNode(bytes16,uint16)","9541bc41":"getUSDAmount(uint256)","954290f4":"guessPassword(address,uint256,bool)","95437056":"AUTH_ADDOWNER()","95438548":"DONATION_RATE()","95441f9f":"ZEEWANTtoken()","95449ad5":"changeTimeInvest(uint256)","9545c42c":"minForExistingTopic()","95470497":"OTHERCRUISER_EXTRACTION_BASE()","95475c1f":"makeChild()","9547b44d":"Prepurchased(address,uint256,uint256)","95480879":"setDefaultMetadataURI(string)","9549355e":"oracalizeReading(uint256)","954969f6":"godSetInterfaceContract(address)","9549c330":"freezeFrom(address,uint256)","9549fea9":"MENSA(address)","954a5c19":"addPot()","954a8f8b":"TransferWithRef(address,address,uint256,uint256)","954ab4b2":"say()","954b2be9":"SelflleryYouToken()","954cbe3f":"mintSpecial(string,string,uint8,uint256,uint256)","954d2cfd":"updateUrl(address,bytes32[5])","954db474":"newProject(string,string,uint256)","954e8c2d":"buyShares(uint256,address,uint256,uint256)","954f3b20":"getTransferHash(address,address,uint256,uint256,uint256)","954ff2ad":"founderTokenWallet()","9550c023":"AllocationRevoked(address,address,uint256)","9551dd58":"listener()","955214d1":"LogRecordWin(address,uint256)","95522e54":"WeaponTokenize()","95523f7d":"newMember(string,uint256)","95533f17":"isTokenInList(address)","95534e00":"getAccountBlocks(address)","95535569":"LianBaoCoin()","9553652b":"Goldencloudtoken()","9553a19b":"BrengsTeamToken()","95543693":"ONE_DECIMAL_QUANTUM_ANZ_TOKEN_PRICE()","9554a202":"changeSwapperAdd(address)","9554c8e5":"getCrydrStorageAddress()","9554f920":"fillChannel(uint256)","9554fa12":"multiplies(uint256,uint256)","9555a942":"withdrawFrom(address,address,uint256)","9555c9d9":"capAdjusted()","95564837":"seed(uint256)","9556a31d":"GVOptionToken(address,string,string,uint256)","9556b05d":"OraclePoloniex()","95578ebd":"useDELEGATECALL()","95579063":"_bidderHasAnActiveBid(address,uint256,address)","9558abde":"sycCrowdsale()","9558e916":"teamWithdrawalRecipient()","9559225c":"debug_hash3Byte(bytes)","955b1535":"checkForNewLeader(uint256)","955b5e72":"CTCToken()","955d14cd":"getLastTime()","955d1721":"availableBalanceInLockingPeriodForInvestor(address)","955d4412":"addLocation(uint256)","955d4d16":"Wixlar()","955d50b7":"TestMasterToken(uint256,string,string)","955ef429":"closedown()","955f0460":"sgpc(uint256)","955ff603":"Viviox()","95607ced":"retrieveAll()","95608083":"_abortCurrentRound()","95612ec0":"allowInvestment()","95617dc3":"reportGame(string,uint8,bytes32,bytes32)","9561a038":"nextContributorIndex()","9561f0d8":"setTradingLive()","95621ccd":"theBet(uint256,uint256,uint256)","95623641":"marketAddress()","956248aa":"determinePayout(uint8,uint8,uint8)","95635b37":"addMiner(address,uint256,uint256)","9563dbcf":"setPeriods(uint256)","95645e34":"initialDistribution()","956483c1":"lastBlock_f14Hash_uint256()","95648f1b":"getFunctions()","95652e4f":"revokeAuthority(address,uint256)","95655f04":"getWilds(address)","9565f2fe":"AllCash()","9565feeb":"isBonusPeriod()","9566880b":"s16(bytes1)","95669952":"debtor(address,uint256)","95671958":"getFileListTail()","95671ed7":"logEvent(string,bool)","9567a161":"newBet()","95693aad":"CompositCoinCrowdsale(uint256)","956a2d03":"balance(bytes32,string,address)","956a2ea7":"setBidRegistry(address)","956a538a":"CoinsRemainAfterICO()","956a860d":"getMartialInfo(uint256)","956ab5d9":"getParetoBalance(address,address)","956b76f7":"setVicepresidenteDeMesa(bytes32,uint256,uint256,bytes32)","956cc859":"INIT_SUPPLY()","956d2172":"setAttackFee(uint256)","956e5f00":"LogEtheraffleChange(address,address,uint256)","956e958a":"dungeons(uint256)","956f4361":"getCampaignsByCountry(string)","956fd9df":"balanceOfPlayers(address)","956fffd3":"setFinishICO(uint256)","95701be3":"rolloverFeePeriodIfElapsed()","9570370f":"bondsOf(address)","95709441":"mintReputation(int256,uint256,address,address)","95722371":"storeX(uint8[],uint256,uint256,uint256,int256)","95722e66":"payPool()","95725d8a":"emitRoleAdded(address,uint8)","957287ce":"market2()","9574f4e1":"createMatch(string,string,uint256,string)","957563ec":"setProviderLock(bool)","95761c77":"SBCS()","9576b180":"initGoldData(uint256,bytes32,bytes32,bytes32)","9576bfbd":"setWhiteLister(address)","9576e5b3":"registerContract(address,bytes32,bool)","9577941d":"LogKill(bytes32,bytes32,address,address,address,uint128,uint128,uint64)","9578bce2":"setCreditsTokenPrice(uint256)","957908d1":"dequeue()","95792430":"grant(address,uint256,uint256,uint256,uint256,uint256,bool)","957a2772":"lastBlock_f9()","957a6254":"bonusScheme()","957aa3d1":"goldmintTeamAddress()","957aa58c":"live()","957ac9ad":"HappyBeeToken()","957b2807":"getPlayerPlayInfo(uint256,uint256,uint256)","957b2e56":"reinvestDividends()","957b52fb":"fidaPerEther()","957b781c":"mintBonus(address)","957b8d98":"publicsaleTokens()","957bb1e0":"bid(bytes32)","957c0ff2":"testNoTokensOneCall()","957d8250":"allocateBid(address,bytes32)","957dcb1e":"mintReservationTokens(address,uint256)","957e05d6":"setAllowTransferLocal(bool)","957f050b":"merchantAccount()","957f120e":"inPublicPreSalePeriod()","957f371f":"totalAmountOfEarlyPurchasesWithoutBonus()","957f9a0b":"tryFlush()","95803d6c":"STARTING_BULLS()","95805dad":"start(uint256)","9580811c":"setBalanceAdmin(address,uint256)","9580c4bc":"migrateFunds()","95816a16":"contributionCap()","958174a3":"ParentToken(uint256,string,uint8,string)","95818603":"fromTweiToFp(uint256)","958222aa":"isTokenTransferable()","95829738":"institutions(bytes32)","9583102a":"verify_send(address,uint256)","958343f9":"setOrderDealSpeed(uint256)","9583cf17":"claim_period()","9584894c":"getElementInfo(uint256)","9584fbfc":"TOKEN_SHARE_OF_TEAM()","9585a877":"isGameActivated()","958689d7":"emitMintEvent(address,uint256)","95878da6":"CurrentICOpublicSupply()","958799cb":"recordPurchase(address,uint256)","95880360":"setExchangeRatePreIco(uint256)","9588378e":"reputationOf(address,bytes32)","95883871":"TradeListing(address,address,address,uint256,uint256,bool)","958993a5":"allocatePrivatePresaleTokens()","958a3698":"setITTMultiSig(address)","958a41dd":"upgradeToAndCall(string,address,bytes)","958a9937":"createProduct(bytes32,uint128)","958b12b9":"ICOCap()","958b3f20":"final_fundraise()","958b6f55":"checkTokenVesting(address,uint256)","958c4be7":"makeCollectibleUnavailableToSale(address,uint256,uint256,int256,uint256)","958ce2d5":"Spoke(bytes16,string)","958d1725":"getChild(bytes32,uint256)","958e0028":"SoarCoin()","958f3624":"totalTokenWinValue()","958fde82":"newPinnedAppInstance(bytes32,address)","95907291":"CaptureTheFlag(string)","9590d4b9":"testCount()","9590ef13":"Option(string,string,uint8,uint256,address)","95910d46":"ownerPrimary()","95925814":"undo_deadline()","95929d22":"_updateNextAmount()","9592d424":"totalNodes()","95930b1c":"getAssetPacksUserCreated(address,address)","95932df3":"addCustody(address)","9593aa9a":"JTOKEN()","95949823":"setRemark2(string)","959499b6":"withdrawProfit()","95955d22":"escrowTransfer(address,address,uint256,uint256)","9595898a":"updateCard(uint256)","95966c3b":"get_eth_balance(address)","95969ba4":"enabledAddresses(address)","95977749":"IvoryTest()","95978868":"strConcat(string,string,string,string,string)","95980858":"currentText()","95982228":"Multiowned(address[],uint256)","95982f44":"GetLottery(uint8)","9598790d":"priceTokenSellWei()","95988a26":"proposalsRank()","95997c51":"withdraw(uint128,address,uint256)","9599ab63":"crowdsaleBonus(uint256)","959a1f08":"Hive()","959ac484":"push(uint256)","959b3fa0":"createSkin(uint128,uint256)","959b6916":"setCollectTokenTime(uint256)","959b8c3f":"authorizeOperator(address)","959c265b":"makePlayerID(address)","959ca192":"createCoupons(uint256)","959cb555":"address_register(address)","959d51f6":"W3SchoolToken(uint256,string,string,uint256)","959e4748":"totalIssuanceLastModified()","959e90ff":"totalTransactionCount(address)","959f601e":"getLimitMaxCrowdsale()","95a01505":"presaleStorageVault()","95a039ba":"getContractAddress(string,string,string,string)","95a078e8":"hasAccess(address)","95a08221":"tokensTotalSupply()","95a0f5eb":"totalMigrated()","95a0f9c7":"removeOffer(uint256)","95a1297a":"totalRewardsRedeemed()","95a13ff3":"polyComplianceAddress()","95a1c14d":"addThreeWayLine(uint256,string,uint256)","95a2251f":"redeem(address)","95a235ae":"set_deposit_address(address)","95a23c3a":"adminsPercent()","95a2d14b":"IcoCloseTime()","95a3bf6e":"getPayoutRequestedState()","95a3e2af":"isAddressFrozen(address)","95a47652":"getMintingStatus()","95a4f76d":"maxSaleNum()","95a50a9d":"monarch()","95a51233":"totalSupplyCeiling()","95a51669":"buyWithETH(address,uint256)","95a5418d":"_patternToNumber(bytes4)","95a59ac4":"PacificaToken()","95a5dfc0":"yes(uint256,string,uint256)","95a6f9ab":"makeProposal(string,uint256,uint256,uint256,uint256,address)","95a70863":"setOwner(uint16,address)","95a8c58d":"hasRole(address,uint8)","95aaa5d9":"BatakToken()","95ab32a3":"securityPercent()","95ad3d98":"ConnectCoin()","95addb90":"questions(bytes32)","95adfe72":"getPlayerPrice(uint256)","95ae0bf9":"extCreateNinja(uint256,uint256,uint256,uint256,address)","95ae66a5":"MilestonePricing(address,uint256,uint256[])","95af7006":"setFirstBonusPercent(uint256)","95afc05c":"withdrawRefunds()","95b1157d":"setLockAccount(address,uint256)","95b18bbe":"Created(address,uint256,uint256)","95b1e4f2":"addClaim(uint256,address,uint256,bytes32,bytes32,string)","95b1f93b":"changeStakerOperation()","95b2110a":"queryAirCrash(string)","95b25a1c":"Biograffi()","95b2d128":"TokenFund(address)","95b34f71":"_getTokens(uint256)","95b3559f":"CertifyDelegate(address)","95b3c92f":"TioToken()","95b3dc77":"setTransferableTime(uint256)","95b4b88d":"allowanceSub(address,uint256)","95b505f0":"getMigrateOutReporterValue()","95b537d5":"selfOn()","95b5d5ac":"token_ask(address,uint256)","95b68fe7":"getTokenToEthInputPrice(uint256)","95b6a08d":"canDisburseMultipleTimes()","95b71187":"getByFromCount(uint256)","95b7c348":"ICOCappedRefundableCrowdsale(uint256,uint256,uint256,address,address)","95b7ea26":"GetMaximumBet_ether()","95b7f0aa":"_removeAuction(address,uint256)","95b890d6":"purchaseTokensWithoutDevelopmentFund(uint256,address)","95b8cf55":"signalBackupWithdraw(address)","95b8fdef":"setCompte_22(string)","95b96e11":"PeriodEnd(uint16,uint256,uint64)","95b9bb68":"setCompositionAddress(address)","95ba64c9":"LogForbid(bytes32,bytes32,bytes32)","95bad022":"countTeam()","95bb733b":"CurrentCrowdsale(uint256,uint256,uint256,uint256,address,address,address)","95bb8d46":"publicSaleTransfer(address[],uint256[])","95bb9fcf":"getHolding(uint256)","95bbbe45":"transferFundWalletWallet(address)","95bc2673":"remove(bytes32)","95bc3bd0":"lockAmount(address)","95bc7eec":"payFunction()","95bc8515":"setHolder(address,uint256)","95bc9538":"changeStatus(uint8)","95bda19d":"register(address,uint256,address)","95bda742":"_create_user(address,address)","95bdca94":"isTyped(address,uint256)","95be55a6":"increasePrice_20_February()","95be7542":"CoinLLeague()","95be9ace":"NewDeal(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,string)","95c02700":"ACN()","95c08f92":"investmentOf(address)","95c0954c":"ownerOfUUID(string)","95c0c3f6":"confirmGameEnded(bytes32)","95c0c447":"getLimitTypeOf(address)","95c0d65c":"editRank(uint256,uint256,uint256)","95c0e6c3":"transferOwnershipAtomic(address)","95c21ebf":"blueOs()","95c26d93":"thirdTierDiscountUpperLimitEther()","95c2d845":"driveCar(string)","95c303bc":"pyramid(address,uint256,bytes32)","95c30910":"unFreeze(address,address)","95c3be0b":"participantIndex(uint256)","95c3fc9b":"_setPowerBalanceOf(address,uint256)","95c43d84":"PHASE2_SUPPLY()","95c47416":"VoteOnMyTeslaColor()","95c4e59b":"AXIACOIN(address,address)","95c55798":"WZCoinToken()","95c5a2cc":"halfPercent(uint256)","95c5ed9d":"getVoterStatus(bytes32,address)","95c6fa61":"keyOf(bytes32,bytes32)","95c7a23f":"AutoBuy()","95c7b007":"setFreezeTx()","95c8d4ee":"grantAllocation(address,uint256,bool)","95c92d98":"viewTotalAffiliateCommissions()","95c93f8b":"setTierRates(uint256,uint256,uint256,uint256)","95c96554":"cancelVote()","95c97432":"nSubmittedHashes()","95c9f53f":"scaledDividendPerToken()","95cc2e8b":"DATE_ICO_START()","95cc74fe":"buyFromPartner(address)","95ccea67":"emergencyWithdraw(address,uint256)","95ccf8bf":"forward(address,address)","95cd73a2":"OpCoin()","95cd76fa":"getMaxOwners()","95ceb4b3":"winningProtocal()","95d12000":"ownerPercent()","95d22683":"MyUserName(string)","95d2b4b4":"_createMonster(uint256,address,uint256,bool,bool,bool)","95d38ea8":"mintableToken()","95d395dd":"XDToken()","95d47f2f":"lastBlock_f8Hash_uint256()","95d4f7dd":"primaryGasLimit()","95d5766c":"foundersContract()","95d5a1be":"SignatureReg()","95d5f6fd":"officialSite()","95d643a8":"earnings()","95d6718a":"grantOf(address)","95d697c4":"ProofOfReadToken(uint256,uint256,string,uint8,string)","95d793d9":"deposit(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)","95d84b30":"_replaceContract(address)","95d84d99":"setColorPurple()","95d89b41":"symbol()","95d8f60d":"sumHardCapICOStage6()","95d9a030":"externalControllerCandidate()","95d9cc18":"setStdOwner(address,address)","95db03fe":"krypteum()","95dba6c9":"getHealthForCost(uint32)","95dbee2d":"gift(address,address,uint256)","95dcac25":"IGTSGD()","95dd489b":"winningsPerRound()","95ddb3a6":"setJewelContract(address)","95de00a2":"getReservedDestinationInfo(address,bytes32,address)","95dea05b":"cleanActions(bytes32[])","95e05110":"sumHardCapICOStage3()","95e16e97":"validateraffle()","95e19fab":"setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],uint256[])","95e1d9f7":"getGamesForAdmin(address)","95e2a953":"etherRatioForInvestor()","95e2c773":"privatePreICOdepositors(address)","95e396f9":"crowdsaleTokensWallet()","95e3c50b":"tokenToEthSwapInput(uint256,uint256,uint256)","95e3cd5c":"preAllocation(uint256,uint256)","95e4c1bf":"hasConfirmedRecord(bytes32)","95e4d456":"DUNGEON_CREATION_LIMIT()","95e517be":"Offer(address,string,address)","95e52d98":"documentsCount()","95e66ea1":"isLeftTokenIssued()","95e77a05":"testItemStrict(bytes)","95e7b3c5":"angelRate()","95e87385":"availableRef()","95e8a67e":"toB32(bytes,bytes)","95e8d644":"requestRemoveOwner(address,string)","95e8f3e7":"get_hash()","95e911a8":"feeBase()","95eb8f15":"Attempt(address,uint256)","95eced5f":"ZToken(uint256,string,string)","95ecef72":"gSetRunning(bool)","95ed857c":"mintPredefinedTokens()","95ee1221":"isCancelled()","95ee4cfd":"set_percentFeeTimes5(uint256)","95ee8bae":"getInt(address,bytes32)","95eeb240":"disableApproval()","95ef9178":"setTokenSaleContractAddress(address)","95f0684b":"getPackageNameHash(uint256)","95f0f107":"_setBridgeAmount(uint256,address)","95f1260b":"balanceToWithdraw()","95f17bce":"cancelCost()","95f20e88":"RANDCRYPT(uint256,string,string)","95f22405":"getImageInfo(uint256)","95f28272":"salesTokenHolder()","95f382bc":"depositVault(uint256,uint256)","95f47e4e":"setRegulatorAccessLevel(address,uint8)","95f5784f":"FIBASK()","95f59fe1":"vote(string,string,string)","95f62fb9":"registerDevices(bytes32[],bytes32[],bytes32[])","95f847fd":"transferToContract(address,uint256,uint256)","95f9432d":"ThankYouToken()","95fa7430":"get_iconiq_tokens(address,address)","95fbdcd9":"MeshToken()","95fbfa0d":"testBurningUndistributed()","95fc6354":"PLAYER_START_PERIODS()","95fc799f":"allocateRestrictedTokenToPartner(bytes32,bytes32,uint256)","95fcb00d":"addVesting(address,uint256)","95fdd612":"hasRequested(bytes32,address[])","95fe0e65":"createD(uint256)","95fe27d3":"SmartCripto()","95fe4608":"revokeCert(bytes32,bytes,bytes32,bool,uint256)","95fe5234":"setSubnodeOwner(bytes22,address)","95fe6865":"checkIfCanUseTokens(address,uint256)","95fe6f1d":"isAddressReserved(address)","95ff24e3":"SellTokens(address,uint256,uint256,uint256)","95ff3cc1":"getMyApples()","95ffff09":"getMyBananas()","960024ff":"rebuyStarted()","96002aef":"offerProductOwnership(bytes32,address)","9600ead9":"RESELLING_UNLOCK_COUNT()","9600ec92":"transfer(address[],address,uint256[])","9600f294":"refundTokenPayment(uint256,address,string,uint256,address)","9601065d":"reachedMajority(uint256)","96013c9c":"testLatestPkgGetter()","960173b5":"aliceClaimsDeposit(bytes32,uint256,uint256,address,address,bytes20)","9601deb8":"LogTransferOwnership(address,string)","96023032":"updateContractAddr(string,string,string,string,address)","9602339d":"AlfaTowerShares()","96023cbf":"registraToken(bytes32)","96026d61":"BucketAndValuationAndCommitted(uint256,uint256,uint256)","9602bb20":"AMBTICO()","9602e9d5":"withdrawDev()","960384a0":"getValue(string)","96038f8f":"ICO_Graphene()","9604702a":"matchExistingBids(bytes32)","960491d7":"setNextRndTime(uint32,uint32,uint32)","9604a24b":"getPoolCapSize(uint256)","960524e3":"getInvestorCount()","96063049":"rollDice(uint8)","96066cf9":"MintConfirmed(uint256,address,uint256)","96069ee1":"CIPToken(address,uint256)","96074e70":"addBeneficiary(address,uint256)","9607610a":"withdrawFor(address,uint256,uint8,bytes32,bytes32)","960787a2":"sendFoods(address[500],uint256[500])","9607a1db":"claimShare(uint256,bool)","9608088c":"setAddress(address,address,address,address)","960834f4":"dAddBallot(bytes32,uint256,uint256,bool)","9608740e":"verifyBid(uint256,bytes32)","9608e9df":"DataWasRecorded(address,uint256,bytes32,uint256,string)","960954af":"chargeAdvertisers(address[],uint256[],address[],uint256[])","960983f4":"addArtifact(string,string,bytes32)","9609e488":"TootyrCrowdSale()","960a48ae":"createPreIco(uint256,uint256,uint256,uint256,uint256,uint256,address)","960a57fc":"SHA256HashRegister(bytes32)","960ba088":"createFinancialStrategy()","960bfc9b":"_owns(address,uint64)","960bfe04":"setThreshold(uint256)","960d3f56":"impl_mining(address,uint256,bytes)","960d8cd3":"testFailUpdateLatestRevisionNotOwner()","960d94bb":"get_presale_goal()","960e55a8":"ChannelCloseRequested(address,address,uint32,uint192)","960e80b7":"trans()","960ecf0c":"addNewStage(uint256,uint256,uint256,uint256,uint256)","960fa70f":"synthGenes(uint256,uint256)","96102d7d":"ownerSetWallet(address)","9610e068":"GetAskingUnitPrice()","9610f0e6":"pveBattleFee()","96119f12":"SkribbleToken()","9611bfc5":"_getExistingTileAt(int32,int32)","96131049":"withdrawal(address)","96132521":"released()","9613bc90":"isEvolvementAllowed(uint256,uint256)","96147933":"ContractEnabled()","9614c769":"setDesc(string)","9615ecb2":"wasSuccess()","9616b410":"incFreezeIndex(uint256)","96176797":"LogTransition(bytes32,uint256)","96178c20":"totalSupply2()","9617d90d":"cartaxiToken()","96186b6e":"MAX_PERCENT_OF_PRESALE()","961891d5":"changeEscapeController(address)","9619367d":"minBet()","961a16f2":"secondExchangeRate()","961a9218":"setLLV_edit_17(string)","961a929c":"gasPriceLimit()","961b16a1":"addInTeamBalanceMap(address)","961b2b96":"assignBountyAddresses(address[])","961be391":"cash()","961c2470":"refundRoots()","961c9ae4":"createAuction(address,uint256,uint256,uint256,uint256)","961cc569":"airdropReceiversLimit()","961cd8ce":"ticketsForWithExcess(uint256)","961d1284":"isRefundingEnabled()","961d30cc":"getMasterNodesDates(address)","961d3cd3":"setExclude(address,bool)","961e99d9":"startBuyBackTwo()","961f1d96":"RANGESTART_3()","961ffc68":"GatewayInterfaceAddress()","9620b995":"transfterForProjectManagement(address,uint256)","96214735":"setDeployer(address)","962174b6":"LotteryClaveChain(address)","9621bcf7":"publishTaskListing(string,address,uint256,uint256,uint256,uint256)","9621f497":"SetMaxAirDropXblock(uint256)","96221dc9":"mulX(uint256)","962318b8":"teamKeepingPercentage()","96242f41":"getFrontEndTokenSupply()","96246eb8":"Zmbc()","9624e534":"setBlockDotNumber(uint256)","9625a6c6":"hardLimitICO()","9627bf02":"preIcoEndsAtChanged(uint256)","96283310":"setHouseAddressShare(uint256)","96284fb6":"getNizkStruct()","96286cc9":"isTokenOwner(address)","96289427":"transferRestTokensToOwner()","9629da17":"withdraw(uint64,address,address[],bytes32[],address[],uint256[])","962a64cd":"convert(string)","962aab81":"blockEnded()","962ba36f":"quarantine(address,address[],uint256[])","962ba969":"ExceedIOToken(uint256,string,string)","962c9898":"SOLUSToken()","962c9c8d":"MAX_VOTED_TOKEN_PERC()","962ca53e":"Cosby()","962d0c72":"overRaisedUnsend()","962dae57":"getPriceContract()","962ffeae":"totalCurrentFunders()","9630961d":"createRole(bytes32,address[])","9631c1bd":"FounderFeeInPercent()","9633303f":"setSrc(address)","96344d05":"creatorRequestFundTransfer()","963476e5":"listBackers()","9634ef56":"start_of_report_period()","9635024c":"TANDER()","96354f6d":"BONUS_ICO_STAGE1_PRE_SALE3()","9635eaf7":"fundsToAddress(address,uint256)","9635fc2c":"yahooOracleUrl(bytes32)","963630a3":"ETGOLDToken()","963632d3":"Prosperity()","96365d44":"poolBalance()","96370fa2":"savePic(string)","963749b6":"calculateWinnerPrize(uint256,uint256)","963812c3":"createItemId()","96382f0b":"gameStatus(bool)","96383c04":"setPrice(uint256,uint8)","96386ab3":"myMethod2(string)","96389bd7":"OwnedController(address,address)","9638a89c":"DataRecordIndexStructs(uint256)","963a9a13":"startInvite()","963c0724":"Lucky()","963c1121":"set_pre_kyc_iconiq_bonus_numerator(uint256)","963c11df":"totalScammed(address)","963c3397":"winning_year()","963c6017":"postGoldPeriod()","963d62fb":"tokenLossRatio()","963dd1dd":"Diatom()","963de4d2":"GetBet(uint256,uint256,bool)","963e2680":"setMinSiteTipPercentage(uint256)","963e63c7":"minValue()","96401470":"TutorialToken(uint256,string,uint8,string)","96406391":"setTokenDistribution()","9640da30":"ethRedeemed()","96419497":"PAXToken(bool)","9642a19c":"optInGas()","9642ccdf":"functionName(bytes20,address)","9642ddaf":"testMint()","9643aef4":"testControlCreateWithParentSameNonce()","9644fcbd":"changeMembership(address,bool,string)","96450a6d":"walletWithdraw()","9645337a":"removeOrder(uint256)","9645bae5":"newAuction(uint256,uint256)","964620d2":"TheMostPrivateCoinEver()","96463fc6":"createTrade(uint256,uint256)","96468249":"getFoundation(address)","96469132":"setPonziPriceInWei(uint256)","9646b85d":"getMintableAddress()","9646df4d":"presaleEnds()","9647259c":"dividendDistribution()","9647df97":"TES()","9648c9f4":"sessionId()","9649650c":"removeBank(address)","96497258":"withdrawOverdraftTokens(address,uint256)","964997a4":"MoacSupply()","9649ccaa":"updateSubscriptionOffer(uint256,uint256)","9649d98b":"restrict()","964a4ac7":"ULTRA_HERO_MULTIPLIER()","964ad434":"TIER1_CAP()","964afe08":"addSomething(uint256)","964b97de":"box2Star5()","964c0b40":"ExtensionCalled(bytes32[8])","964c7d84":"addressToBlock(address,bool)","964c836c":"receiveExecutionNotification()","964ecc09":"forceRefunding()","964f61f9":"getCosigner(uint256)","964f6dcd":"Elephant()","964f8fba":"totalDinoSold()","964fad94":"fundingGoalOf(uint256)","964fb96d":"test_init()","965232c0":"getTotalAllowed(address)","9652389c":"setPreSaleOn()","9652713e":"runSigned(uint40,uint256,address)","96532d1c":"mintingAllowed()","9653dee5":"tokenSwap()","9653f8a1":"etherBalances(address)","965447d9":"toPowerOfTwoThirds(uint256)","965582d6":"requestNewID(string,string,string)","9655943e":"validMCAmount()","9655e4b0":"sellIdeas()","965693ee":"TicketsPurchased(address,uint256[],uint256[],uint8[])","96574919":"removeStakerFromArray(address)","96577caa":"getLowWinPercent(uint256)","9657f8ad":"TopiToken()","96581de1":"registerPayments(address[],uint256[],uint256[])","9658522c":"createPlayerOnAuction(uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,bytes,string,uint256)","96594efb":"WorldBit(address,bytes2,bytes2,uint256,uint256,string,string,string,string)","9659867e":"mintCount()","965a324e":"OxShelterEye()","965a3b7e":"targetDemographics()","965acc73":"setCampaignBudgetById(bytes32,uint256)","965b0cc4":"signedApproveAndCallCheck(address,address,uint256,bytes,uint256,uint256,bytes,address)","965b2bae":"setFinancierParticipationAdd(address)","965b5aa8":"paySolutionRewardGoodRep(address,uint256)","965b71bc":"cfoWithdraw()","965bdf33":"SetAuditedAssetSize(uint256)","965be457":"registerApp(bytes32,address,bytes4[],address[])","965beae8":"bulkTokenSend(address[],uint256)","965c643f":"setReference(bytes32,string)","965c90e3":"getNodeByIndex(uint256)","965edec5":"_publishSecret()","96603e88":"hotPotatoHolder()","9660ab3a":"setContractUser(address,bool)","9660aeeb":"isMatching(int256,int256,int256)","96617ba4":"ClientsNotified(string,string)","966203e7":"Product(bytes32,bytes32,address[],int256,int256,address,address)","9662355e":"generateAttestForDelegationSchemaHash(address,address,uint256,bytes32,bytes32,uint256[],bytes32)","96637b10":"getEscuela(uint256)","9663871f":"recursiveRound(uint256,uint256,uint256)","9663a496":"awardBronze(address,address,address)","9663f88f":"getBlockHash()","96642cfc":"_isAuctionExist(uint256)","9664ca94":"date_string(string,int8,int8,int16)","9664d2d9":"resourceIndex(address,bytes4)","9665688e":"setGame(uint256,uint256,uint256,uint256,uint256,uint256)","966588d4":"cloneWithTwoPops(uint256,uint256)","9665b658":"changeExecutor(address)","9665ef09":"bitmask_show(address)","9665f170":"pregnantEtherDogs()","96661b04":"closeDataResponse(address,bool)","9666856d":"stopList(uint256)","9666cbfa":"getDeployedMatches()","9666e1f9":"isCosignerSet(uint256)","966704c2":"autoTransferLocked(uint256,uint256)","96682704":"TransferToReferral(address,uint256)","96686560":"Setup(string,string)","96687919":"_preSaleSupply()","9668b281":"AKContract()","966933ce":"DURATION_PER_VESTING()","96696da8":"getHives()","966a1961":"get_time()","966a360c":"newExchange(address,uint256,address,address,uint256)","966a3b29":"setJMETHExchangeRate(uint256)","966a7dca":"payOrder(string)","966aa252":"addProperty(bytes32,bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,uint256)","966acb38":"testThrowTransferNotTransferable()","966aeece":"changeWhitelister(address)","966b3514":"contract_address()","966b7d91":"AdminChangedFundingWallet(address,address)","966dae0e":"factoryAddress()","966dcd26":"intertransfer(address,address,uint256)","966e6ead":"DefaultReleaseCalled()","966edae7":"lastBlock_a3()","966f697c":"_getSubscription(bytes32,address)","966ff650":"totalBurnt()","9670078c":"burnDNC(address,uint256)","9670591b":"giveAwayHoldership(address)","9670c0bc":"getPrecision()","9671ef91":"WEI_TO_INSIGHTS()","9673d6a3":"events(string)","96744afb":"ADDR_TEAM_TOKENS_ACCOUNT()","967506be":"deleteTokenAddress(address)","9675bb9c":"totlePrimary()","967743a8":"unlock20Done()","96778446":"addVestingUser(address,uint256)","967826df":"maxAllowedManualDistribution()","96784f45":"balanceOf2(address,address)","9678a1e8":"ProxyCreated(address,address)","9678df74":"MerlinCash(uint256,string,string)","9678eb05":"SafeDiv(uint256,uint256)","9678fb88":"TACTICALCRUISER_MAX_CARGO()","96793725":"registerWallet(address,address)","9679dd7d":"tokenLeft()","967a08f7":"raiseTransferEvent(address,address,uint256)","967b2692":"SaleCount()","967b3c21":"unitEpicGrowth()","967c33b3":"Deployer()","967dd0ae":"orderFor(address)","967e6e65":"getAge()","967e8611":"placeCube(uint64,uint64,uint64,uint256,uint256)","967f1cc6":"ownerPause()","967ff23e":"blocks()","96800dfd":"updateCap(string,uint256)","96817396":"bonus20end()","96821fc1":"MAX_MILESTONE()","96834e36":"ownerSetStandardFee(uint256)","9683d11d":"OHWOWW()","9683fe3e":"create(address,bytes32,uint256,address)","9684da1a":"createGenesisUniverse()","9684fe92":"interestCycleLength()","9685e736":"stopAvatarCreation()","96862e2d":"PattyCoin(uint256,string,string)","968790d0":"reclamaPagamento()","96879353":"CreateIco(address,uint256)","968803e3":"CYC()","96881d20":"CoinParkToken()","968858c8":"tokenreward()","9688738b":"TokenContract()","968908a3":"createMarketMaker(uint256,uint16,uint256)","968997fb":"FootballToken(uint256,string,uint8,string)","9689ac95":"TYPE_NOT_AVAILABLE()","9689e535":"CBCC()","968b12aa":"Crowdsale(uint256,uint256,uint256,address,uint256)","968bb12c":"setLegalFileLink(string)","968bd60d":"LogSendReward(address,address,string)","968be45d":"MYPPToken()","968d1cff":"percentForCommunity()","968d73d8":"start_service2(uint256,address,uint32)","968d901b":"getCurrentGame()","968ed600":"totalFunds()","968f0a6a":"getBidBySiteIndex(uint8,uint256)","968f9dc3":"EtherReserved(uint256)","968fc02a":"DogRace()","9690be37":"deleteGame(bytes32)","9690caa6":"Umint21()","9691a8bf":"changeIndividualCapInWei(uint256)","969235a4":"getSaleStart()","969283e2":"availableVolumeEnclaves(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)","969295ae":"changeReferral(address)","96934e88":"isReward()","96937617":"Rpct()","96938d5b":"watchedAddress()","969464f6":"isCauldronExpired(uint8)","9694f039":"founderSupply()","96957869":"verifySignature(bytes32,uint8,bytes32,bytes32)","9695e3c0":"EOMarketToken()","9696e59a":"totumPhases()","9696ef66":"SLOTS()","9696fbf5":"Daschain(uint256,string,string)","96974e47":"setMinAllowedBetInTokens(uint256)","96984631":"RANGESTART_10()","9698d611":"setSaleManageContract(address)","9699ca16":"getPublicKey(bytes32,uint8,bytes32,bytes32)","969ac477":"PRIZE_POT_PERCENTAGE_MAX()","969be87e":"testGetNewItemId()","969bece3":"setRegionOnSale(uint16)","969bf358":"getCurrentTokenSaleId()","969ca0eb":"scavengeEscrow(uint64)","969cb4da":"changeSubmissionPrice(uint256)","969cb7c3":"getPublisher(uint256)","969d5b94":"changeMultiSigWallet(address)","969da324":"updatedEtherPrice(string)","969ddd71":"getMaxCap(address,uint256)","969e3756":"exchange(address,address,uint256)","969ea336":"maximumInWei()","969eb430":"updateVerifiersPerShard(uint256)","969ef40d":"updateFinishFlag()","969f1af4":"addMinerQuest(address)","969f8a83":"getConfirmations(bytes32)","969fa9d2":"EmergencyWithdrawalSucceeded(address,uint256)","969fbf12":"contructor()","96a04925":"retreiveTokens(address)","96a16793":"changeOraclizeAccountingSettings(uint256)","96a1e85c":"get_total_quantity()","96a34fc7":"exchangeToken(uint256,address,address)","96a44d35":"devuelveApproles(bytes32)","96a49d60":"getCircle()","96a51fde":"OilVisionShare()","96a566be":"PartnersNotSet(uint256)","96a625a5":"plantcToken()","96a68b91":"makeUndestroyable()","96a69d04":"totalSquareStakes(uint256,uint256)","96a6a748":"POHStopTime()","96a70169":"tradeETH(uint256)","96a77176":"setPresaleTwo()","96a7cf6a":"callDestruct()","96a80699":"postAllocateAuctionTimeMints(address,uint256,uint256)","96a942c7":"minTokenPurchaseAmount()","96a952a5":"setInstallmentsLoanData(uint128,uint256,uint24,uint40,uint32)","96a9df88":"_withdrawAirdrop(uint256,bytes)","96aa6305":"totalNotCompleted()","96aab4f6":"setBountyAddresses()","96ab97a5":"hasVested(address)","96ac591e":"postICO(address,address,address,address,address,address,uint256)","96ad4131":"getRequiredAdmin()","96ad6c8a":"deposit_address()","96ad704a":"addToken(address[16],address,uint256)","96adad2e":"sellStores()","96adfe42":"mintWithData(address,uint256,bytes)","96ae44f6":"addAcceptedArbiter(address)","96afb365":"reclaim(bytes32)","96afc450":"emissionRate()","96afccb3":"withdrawDonation(uint256)","96b116c6":"statusDoacao()","96b1348a":"claimTokenFunds(address)","96b1e4d4":"isFreeze(bytes32,bytes32)","96b2c923":"changePlatformWithdrawAccount(address)","96b47f0d":"soldOnStage()","96b55f7d":"tierCount()","96b58ac8":"tokensLeftForSale()","96b5a755":"cancelAuction(uint256)","96b5c5f4":"FeeWallet(address,uint256,uint256)","96b5f7b6":"ParallelWorld()","96b6af5a":"submitCustodianDoubleSign(address,uint256,bytes32[],uint256[],bytes32[])","96b76c23":"stand(uint256)","96b828b4":"Lock(uint256,uint16)","96b86436":"foundersAllocatedAmount()","96b86e1d":"PLCRVoting(address)","96b90b05":"Apex()","96b9a9d0":"medalBoostAndBurn(uint16,uint64)","96bb1fef":"claimStakingRewards(address)","96bba9a8":"slashSmallUsername(string,uint256)","96bc0f94":"onlyAdminsFriends()","96bc1a89":"getLockedAmount_investors(address)","96bc2287":"PRE_FUNDING_GOAL()","96bc3f3a":"getForecastScore(uint256)","96bc4a40":"bsWallet()","96bc5ab7":"setOracleURL(string)","96bcf236":"am_i_on_the_whitelist()","96bd09a1":"edit_safe(address,string,string)","96bd8dae":"transferAllowance(address,uint256)","96be8878":"team2Balance()","96bf15bf":"gamePrice()","96bf4ed5":"TOTAL_TOKENS_FOR_CROWDSALE()","96bf5022":"MRIDUL()","96bfc229":"isInWhiteList(address)","96c0fb8b":"setWhiteListInBatch(address[])","96c108c9":"assignToBeneficiary(address,uint256)","96c12acb":"Fuck()","96c14d92":"closeContract(bytes32,bytes32,uint256,uint256,uint64,uint64,bytes32,bytes32,bytes32,uint64)","96c16735":"UselessAirdroppedToken()","96c237b4":"getDeedInfo(address)","96c266ca":"developersKey()","96c28881":"fundraise_max()","96c2d498":"XTL()","96c2d4c9":"totalTipForDeveloper()","96c36170":"icoEtherBalances(address)","96c38294":"getETHUSD()","96c52fc3":"____forward(address,uint256,uint256,bytes)","96c5406d":"tokenFree()","96c5743a":"test03AliceBuyToken()","96c5ea93":"icoBeginDate()","96c62b27":"BalanceBook()","96c72144":"GrimReaperAddress()","96c74715":"NBW()","96c7a2a3":"BlockRxToken(uint256)","96c81be5":"unicornsOf(address)","96c824a8":"createAccountFundContract()","96c82e57":"totalWeight()","96c85b59":"TestBancorFormula()","96c8da45":"oneTokenInEur()","96ca7653":"LottixTest()","96cb4bc5":"RESERVED_ECOSYSTEM_GROUP()","96cc7be7":"updateCeleb(uint256,uint256[6],uint256[6])","96ccacb0":"hour_blocks()","96cdb027":"InstallerEscrow()","96ce0795":"denominator()","96cea3f7":"confirmWithdrawTransaction(uint256)","96ced078":"getPlayerNumbersInGame(uint256,address)","96cf5227":"changeLockTime(uint256)","96cfd124":"signedTransferHash(address,address,uint256,uint256,uint256)","96cfda06":"getCourseCount()","96cff3df":"getMinimumCallCost(uint256,uint256)","96d002a0":"subFundBalance()","96d02099":"rsplit()","96d122ea":"getStoreAddress(string)","96d195bd":"getWitnesses()","96d1c952":"filterBuyers(bool)","96d28e00":"spinDeposit()","96d2ede5":"preBalanceOf(address)","96d3196b":"getSumActiveToken()","96d373e5":"cast()","96d37936":"finishTokenMinting()","96d43cc6":"getMinimumFundingGoal()","96d46500":"ICO_CAP2()","96d4cb9b":"FipsRegistration(bytes20,address)","96d4d091":"advisorAddress()","96d4ebf1":"finneyPerToken()","96d4f640":"createOrder(address,uint256,address,uint256,uint256)","96d6401d":"TRANSFER_PROXY()","96d66cf8":"expertsAccount()","96d6c134":"coreVUPDestination()","96d7a9ed":"_menu(bytes32)","96d7f3f5":"lastTimeMinQuorumMet()","96d811b7":"TokenVesting(address)","96d8b050":"claimTokensToOwner(address)","96d8f4f3":"minimumDonation()","96d8fe3b":"_updateHistory(address,address)","96d99568":"MMMTokenCoin()","96d9a881":"manualDeleteEditionBids(uint256,address)","96da1fba":"sendETHToContributionWallet(uint256)","96da2848":"gasForCLI()","96dbab81":"stub()","96dbad1e":"sellCityForEther(uint16,uint256)","96dbb486":"updateFinishTime(uint256)","96dbbc5f":"Token_Description()","96dbe56e":"ImpCore(address)","96dc461f":"setBountyTokensCount(uint256)","96de0c20":"_makeWithdrawForPeriod(bytes32,uint256)","96de56d2":"getPlayerFlips(address,uint256)","96de6caa":"qtyValidators()","96de9c8c":"cnyBtcRate()","96dea936":"proposalData(uint256)","96df3540":"TLD_NODE()","96dfa78b":"price_per_eth()","96dfcbea":"checkState()","96dfcc21":"weAreClosed()","96e05fdb":"PaymentAccepted(address,bytes8,uint256)","96e0ef33":"send(address,address,address[],uint256[])","96e1a657":"timeBetweenEditions()","96e264ff":"ownerSetPayOutDivisor(uint256)","96e332f3":"mainSaleMaxTokens()","96e438a1":"reclaimDeposit(uint256)","96e4ee3d":"convert(uint256,uint256)","96e4f67d":"icoEtherReceivedMainSaleDay()","96e50a8c":"saveNonce(uint256)","96e583a9":"getLetter(uint256)","96e6e65f":"ETCN(uint256,string,string)","96e76fa7":"Unregistered(string,uint256)","96e83a40":"refund(uint256,address,address)","96e8cace":"dripMe()","96e8d14c":"newRecord(string,string,string)","96e9df8d":"deployNewContract()","96e9f6f2":"lastBlock_v12()","96ea7487":"Opacity()","96ea76b7":"OnWithdrawTo(address,address,uint256,uint64)","96ea8b9c":"referralPercentage()","96ea9f49":"FundTransfer(address,uint256,uint256,uint256,uint256)","96ebabba":"distributeSuccessfulCampaignFunds(uint256)","96ebfb89":"generalManager()","96ec1ca2":"tipUser(bytes32,bytes32,bool)","96ec6fec":"APP()","96ec7114":"COMMUNITY_SALE_START()","96ecf3c4":"subtractFrozenBalances(address,uint256)","96ed10a4":"issuePOIs()","96edb898":"callTokenFallback(address,address,uint256)","96ee03d6":"__concat(string[6])","96eecf95":"saleSuccessfullyFinished()","96ef7aa0":"cash_transfered(string)","96efbb9b":"getActiveItemAt(uint256)","96f099bc":"preSaleTokenRaised()","96f0aa8f":"findNextSecond(uint256,bytes)","96f1370d":"TotiMed()","96f17aa5":"potTarget()","96f2710d":"managerOn(address)","96f27b29":"getContract(bytes32,uint256)","96f36997":"CLIBUXCoin()","96f392f4":"elixir()","96f42876":"buyerAddressTransfer(address,address,address)","96f429ba":"stateIsFinishedReplay(uint256)","96f47800":"investInternal(address,uint128)","96f494d1":"printCourse0(uint256)","96f6706f":"cancelOfferBob(uint256)","96f68782":"right62(uint256)","96f76f11":"contractFinished()","96f7807a":"getDuel2(uint256)","96f93e65":"Expire(address,address)","96f9cffa":"shareBonus()","96fb2e62":"Party(string,address,string)","96fbab31":"getZombiesFullInfoByOwner(address)","96fc00c2":"setPresale(uint256,address,uint256[])","96fcbf65":"numOfSampleTypes()","96fcd214":"slaveServer()","96fd1df7":"isEndedTrack(uint256)","96fd550a":"betWithCredits(uint64)","96fe1338":"storageTime()","96fe5418":"contestEndTime()","96fe6e74":"external_oraclize_randomDS_setCommitment(bytes32,bytes32)","96fedaf7":"extraMinted()","96fef3f1":"submitTransactionToken(address,address,string,string,uint8[],bytes32[],bytes32[])","96ff0306":"retireWildHard(uint64,uint64,uint64,uint64,uint64,uint64)","96ff4483":"setTokenAsideAddresses(address,address,address)","96ff7631":"SetupYOU(string,string,uint256,uint256,uint256,address,address,uint256)","96ff7e97":"requestIdentity()","96ffa690":"countLocalRecursive(uint256)","96ffac0b":"setupRace(uint256,uint256,address)","97004255":"aliceClaimsPayment(bytes32,uint256,uint256,address,address,bytes)","9700d0f0":"stage_2_TokensSold()","970129be":"getCardInfo(uint256)","9702795d":"REFERRAL_SHARE_RATE()","97028899":"play(bytes1,bytes1)","97034ed0":"get_HoldersProfit(address,uint256)","970388b5":"setContractActive(bool)","9703ef35":"cancelBid(uint256)","9703fa2e":"airdropQty()","9704122c":"getFeeAmount(uint256)","97046afc":"burnProvider(address)","970574ac":"lnUpperBound32(uint256,uint256)","9705a592":"getUnprocessedQueryCount()","97062e8a":"ico3Bonus()","9707f708":"Totalsupply()","970875ce":"currentSnapshotId()","9708e250":"maxSellCap()","9709709a":"MomentumToken()","9709cdbc":"getExchangeGroupsKeyAt(uint256)","9709d040":"NewPayroll(address)","970a5fa8":"exchangeRateIdx(uint256)","970afd9b":"MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE()","970db3df":"SPECIALIST_STAKE_TWO()","970e5904":"safeGetPartialAmountCeil(uint256,uint256,uint256)","97100be9":"setLiveTx()","97107d6d":"setProxy(address)","9710f014":"completeStatus(string)","971130b5":"MulaCoin()","9711715a":"snapshot()","9711e944":"Queue(uint256)","9711f20d":"isSanctuary()","971217b7":"values()","9712a57e":"purchasePotato(uint256)","9712a764":"takeBounty()","9712da8b":"getCompte_20()","971362c9":"partnerWithdraw()","9714378c":"extend(uint256)","97145273":"setHidden(address)","9714a27c":"miningOneFree()","9714f05c":"_minimumContribution()","9715a81f":"SurvivalRanchTestCoin()","9715d80e":"getCanShareProfitAccounts()","9715f05d":"OBSERVER(uint256,string,string)","97169426":"Owned1()","9717137a":"TLN_TOKEN_NAME()","97172664":"getIcoAddrCount(uint256)","97173a7a":"referalPayCount(address)","971751af":"lockAndDeliverTokens(address,uint256,bytes1)","9717ae9d":"DTCC_ILOW_5()","9717b2ae":"DividendsTransfered(address,uint256)","9717d76f":"getCandidatePosition(address,uint256)","9717df19":"fillFromQueue()","97187ac8":"coinSaleStarted()","9718b524":"newTreasury(address)","9719f290":"lockTeamTokens(address)","971a3593":"updateClosetime(uint256)","971a9091":"crystal()","971a9a29":"CbxeToken()","971b2b2e":"getFreelancerFeedbackOn(address,uint256)","971bd1b4":"estimateDistribution()","971c803f":"getMinimumStackCheck()","971ccc16":"addERC20Token(address)","971d2bd8":"getProposalByHash(bytes32)","971dbe0e":"getNbrOfPartyFor(address)","971e668f":"updateTokenToEthOrder(uint32,uint128,uint128)","971e80cb":"setWallet()","971ec3ce":"globecoin()","971f34a1":"SellPriceChanged(uint256)","971fe56b":"poolWeight()","971fff63":"setAdsStorageAddress(address)","972030bb":"mixGenesRabbits(uint256,uint256,uint256)","97203543":"getGuestCount()","972041e4":"getTokenTime(uint256)","97204d8e":"delegateProxyImplementation()","972072a2":"resolveChallenge(string)","9720dd5a":"kBit()","972161f7":"getFullState()","97217085":"maxBetDoubleDice()","9721dd4c":"GoldenChain()","972205d4":"Untethered(address,string,string,uint256,uint32,uint32,uint256,uint256,uint256)","97227325":"simulate_ico()","9722cdc6":"EarningsWithdrawal(uint256,address,uint256)","97235a1e":"receiveToken(address,uint256)","97246156":"HoQuBurner(address)","9724fc95":"getTotalProposalsCount()","9725b4a5":"BOXIcoin()","9725bd80":"preIcoEnded(uint256,string)","97267ae9":"startDividendDistribution()","972711cc":"KoreaShow(uint256,uint256,address,address)","97271615":"contract_newOwner()","9727e379":"addMeter(uint32,string,string)","97294e58":"register(address,string,address)","97296421":"joinTheHunt(string,string)","972973e7":"setOfferPrice(uint256)","97297467":"checkAndVerify(bytes)","972993e6":"b2bcToken()","97299d8a":"lendingDays()","9729d040":"_slashPower(address,uint256,bytes32)","9729ec26":"generateWarrior(uint256,uint256,uint256,uint256)","9729f9b9":"getBlockComission(uint256)","972ab95a":"bennylamToken()","972afc80":"ownerSetEmergencyStatus(bool)","972c169e":"datboiSupply()","972ca383":"MONTANATOKEN()","972d1ae2":"_getNextTokenId()","972e6151":"operationalReserveAddress()","972fa53f":"createTeam(string)","97304ced":"mintTokens(uint256)","973069f8":"transferRemaining(address,address,uint256)","97306c27":"getData3(uint256,uint256,uint256,uint256)","9730b305":"burnTokens(uint256,address)","9731a897":"famedStarMassToIds(uint256)","9733348a":"ProdToken()","9733dc79":"ManagerContract()","97346423":"HCOIN()","9734855d":"WhitelistAddressenable(address)","973516f2":"getH1Amount()","973549ea":"_setAddress(bytes32,address)","973628f6":"currentEra()","97365a0b":"safe(uint256,string,string)","97365df2":"sameOdd()","9736a590":"DistributedTokens(address,uint256)","9736aeb4":"OwnershipTransfered(address)","97374d89":"preIcoAllocation(uint256)","97379c32":"CBIX(string,string,uint256,uint8)","9737bc41":"ShineCoinToken(address,address,uint256,string,uint8,string,bool)","9738418c":"getVersions(bytes32)","973880e8":"getMinesInfo(uint256[])","973882e9":"returnPollStake(address,bytes32)","97388497":"getNumberOfRequests()","973885c0":"test_setMaxSize_decreaseSize()","9738968c":"canUpgrade()","9738b602":"getElementInfoView(uint256)","9738f92c":"transferLogicAuthority(address)","97391e2d":"PurchaseMade(address,bytes8,uint256)","9739203b":"view52()","9739951c":"tokenEmission(address,uint256)","9739db9d":"createOwnershipOffer(address)","973ad270":"removeArbitrator(address)","973b56e8":"MIN_FREEZE_DURATION()","973bc8cf":"getParticipantsChannel(address,address)","973cbc75":"testFailAppendTranch()","973d641e":"SplitPayment(address,address)","973dbfb7":"withdrawalValue()","973e315b":"setMigrateFromLegacyReputationToken(bool)","973e9b8b":"getAllowance()","973e9c5c":"Radiance()","973ea9d5":"team2Address()","973f6129":"adminArray(uint256)","973fcaef":"SIMCOIN()","973fe7ef":"secondWeekBonus()","97409192":"addRequest(uint256,string,string)","9740e4a2":"left87(uint256)","9741efe4":"currentBankroll()","974207fb":"logfolio(bytes32)","974238fd":"CreditMC()","97425a54":"ANMFutureVesting()","9742ca46":"setMiner(address)","9742d64a":"destroyBeneficiary(address)","974317dc":"ThreeDL()","9743ad98":"totalReservedAndBonusTokenAllocation()","9743c6c3":"joinMain()","9743dfc1":"jesterAutomaticCollectFee()","9743efe5":"kin()","974463d6":"ronerToken()","9744a1b1":"depositWithToken(bytes,uint256,uint256,uint256,uint256)","9745ac4d":"getResponseUint(int256,uint256,bytes32)","9745ad9c":"stageIT()","974626b4":"LotsaFucksToken()","97463b75":"getPOOL_edit_27()","974654c6":"finishPresale()","974654f4":"requiredGas()","9746f42b":"getBalanceTeam(address)","9747145b":"claimStorageForProxy(address,address,address)","974811fb":"tokensToEthereum_1(uint256,uint256)","9748334b":"PskERC20()","97487af8":"TOTAL_SUPPLY_ACES()","9748bf5b":"bucketValue(bytes32)","9748db00":"DragonKing(address,address,address,address)","9748dcdc":"punish(address,address,uint256)","97495cce":"rate_toTarget()","974a832d":"rejectCertificate(uint256,uint256)","974b2525":"removeBurningMan(address,uint256)","974bd64b":"PromissoryToken(bytes32,address,uint256)","974c86b5":"Buy()","974cf025":"lockDonationReceiver()","974e7dc9":"_getWeekTotalStake(uint256)","974ee3bb":"_updateLockUpAmountOf(address,address)","974ef924":"parseBool(string)","974fa121":"GiveAnAngelCS(uint256,address)","974fd2f3":"setLastBattleResult(uint64,uint16)","975057e7":"store()","97508f36":"pollNonce()","97514d90":"sellOrder(uint256)","97518f74":"_OmnesCoinToken()","975289fd":"getPriceVolume(uint256)","9752bcd3":"guaranteedBuyersLimit(address)","9752f163":"deployAgent()","975347b8":"removeAddressFromAccessControl(address,uint8)","97537bdf":"BotCoin()","9753a84e":"PCHAlN()","9754a4d9":"grantVestedTokens(address,uint256,uint64,uint64,uint64,bool,bool)","9754a7d8":"pauseSell()","97557f6a":"QTB(string,string,address)","9755a710":"hasWinner()","97566aa0":"getMintDigest(uint256,bytes32,bytes32)","97567579":"getTokenWithdrawalAllowance(address,address)","975739a5":"maxKudosToMember()","9757e8a3":"customerCount()","97584b3e":"_hasAvailability()","9758af1e":"doesEntryExist(bytes32)","9759512b":"LogRefund(uint256)","9759c160":"BuyCore(address,uint256,uint256)","975b123e":"get_firstbytes(bytes,address)","975bad75":"_createCountryId(uint256)","975be231":"emitPricesUpdated(uint256,uint256)","975c2308":"getHeir(uint256)","975c5cab":"getSanageLink(uint256)","975c95da":"ICO_PERCENTAGE_5()","975dfff9":"monsterIdToTradeable(uint256)","975e001a":"tokenBonusForForth()","975e463a":"addInvoice(address,uint256,uint256,uint256)","975e76b3":"transferAdvisorsToken(address,uint256)","97603560":"rescueTokens(uint256)","9760b450":"_Stand()","97614302":"playCount()","976160fa":"SetDesignatedRouterSRV(bytes32,uint256,bytes,bytes)","9761cd63":"reduceHatchCooldown(address,uint256)","97623b58":"removeContract(string)","97624631":"assertEq(bytes,bytes)","9762737a":"remove_branch(uint256,uint256,uint256)","9762e9ea":"icoStartedTime()","9762f802":"hardCapReached()","976371c9":"_isTokenOwner(address,uint256)","9764053b":"_price_tokn_ICO2()","9765b4d7":"autoSend()","9766178c":"tradeDealRequested()","97668720":"set_centralAccount(address)","97672729":"releaseLockedTokens(uint8)","97679646":"whitelistMinTok(address)","9767dae8":"userWithdrewWei(address,address)","9767fff7":"setImageOwner(address[16],uint256,address)","976898c7":"bid(string,string,string,string)","976934ac":"dCHF()","9769eacf":"setBuyOpen(bool)","9769f0b0":"sellToken()","976a0b82":"vettingTime()","976a77b6":"freeForCarrots(uint256)","976a8435":"units()","976b01c0":"setNotRetractable(bytes20)","976b59b5":"ElyxrShrimpFarmer(address)","976bd47d":"LOOMIA2()","976bdba4":"makeOrder(address,address,bytes32,uint256,uint256)","976c3d04":"calculateTokenPrice(uint256,uint256)","976d00f4":"auditSecret(bytes32)","976d16d5":"getTotalAccessories()","976d36d0":"totalSupply1()","976e0da9":"getNextPrice(uint256)","976e14d6":"salePriceWei()","976f37fd":"lowCompose(uint256,uint256)","976f6c92":"lastBlock_a19Hash_uint256()","976fcda7":"WithdrawlRemainingPAT()","97709cde":"ARK_VOTER_1_00(uint256,uint256,uint256,uint256,uint256,uint256)","97709ce7":"setRaffleAddress(address)","977174ff":"normalRoomMax()","9771ccc8":"removeERC20(uint256,address,uint256)","97722acf":"getCapOfToken()","9772c982":"scheduleCall(address,bytes4,bytes,uint256,uint256)","9773252a":"isInBonusList(address)","9773489a":"forceOffsetExecuteMaxFee()","97734b85":"BNB(uint256,string,uint8,string)","9773b22e":"_HachirokuToken()","9774c190":"ShieldCureToken()","977564ed":"Zylli()","977567a4":"ico(uint256,address,uint256)","977615a3":"startDatetime()","9776415f":"setConntractEnable(string,uint256)","9776aacf":"addToken(bytes32,address)","9777487d":"sponsorValue()","977785c5":"testInitalBalanceUsingDeployedContract()","97779e1b":"isStop()","9777a30e":"EYHToken()","9777aa49":"owner_endGetting()","97788180":"GetCitySnapshot()","9778a177":"ManualPurchase(address,address,uint256)","977919bf":"adjustFeeAmount(uint256)","97792f2f":"PembiCoinICO()","97799d47":"Tmc4(uint256,string,uint8,string)","9779dcd9":"sendInvestmentsToOwner()","9779e135":"CreateUpgradeCards(uint256,uint256,uint256,uint256,uint256,uint256)","977a5ec5":"hold(address,uint256)","977a8f1b":"logTokenTransfer(address,address,uint256)","977ab3c2":"mintarget()","977af81c":"changeMessage(bytes32,string,uint8,bytes32,bytes32)","977b055b":"maxPurchase()","977cdc7e":"completeDefaultOperators()","977d2c45":"totalWallets()","977d6276":"getOrderPriceInfo(address,address,uint256,uint256)","977d996d":"createEvent(uint256)","977e09e6":"addGameRecord(address,uint256,int256,uint256,uint256,address,uint256,uint256)","977ed151":"fetchCancelledOrdersForPayer()","977eda79":"txLog(uint256)","977f1213":"FucksToken()","977f3b05":"calculateRegionSalePixelPrice(uint256)","977f7c7e":"bet_on_team_2()","977f9e24":"offlineDonate(uint256,uint256)","977ff98f":"currentSaleAddress()","97810850":"setPlaySeed(address)","9781a37e":"setCooldown(address,uint256)","9781c3ca":"buyTokensSigned(address,bytes)","9782c9ef":"unfreezeTrading()","9782e1ec":"ProxyMock()","9783585d":"setState2WithStop(uint256,uint256)","9783bef4":"EighthContinentSocialMarketplaceToken(uint256,string,uint8,string)","978414bd":"transferZTXOwnership(address,address)","9784696c":"PauseOff(uint256)","97848574":"NevadaBlackBook(address)","9784af62":"createTokenContract(string,string,uint8,uint256)","9784f585":"crowdsaleHardEndTime()","97871e56":"EtherPush()","9787a6b3":"setUint8(int8,uint8,uint8)","97883d1f":"tokenPriceMultiplies(uint256)","9788a8e7":"HOU(uint256,string,uint8,string)","9788c342":"HardCapReached()","9788d5ff":"_updatePrices(address[],uint256[])","9789103f":"fallbackProposal(address)","9789f9da":"crowdsaleFinishTime()","978ab53b":"withdrawFundInsurance()","978afdc8":"getBountyAmount(address,address)","978bbdb9":"feeRate()","978bc247":"_checkSetSkill(uint256,address,uint8,uint256,uint256,uint256)","978c5b15":"LOCKED_2Y_DATE()","978ca331":"mintSub(address,uint256)","978cb570":"firstTimer()","978d5c0e":"ASCCoin()","978d602a":"withdrawETH(address,address)","978d6cff":"ICO_TOKENCAP()","978dabbe":"test_fourValidEqBytes32()","978f68b5":"cancelListing(bytes5)","978f8934":"createPromoKydy(uint256,address)","9790268b":"setRewardBlockThreshold(uint256)","97905a88":"recoveryKey()","97907827":"sharesHeld()","97911fd7":"MyGameToken()","97912c2f":"startPreICOTime()","979260bd":"reserve2Address()","97936258":"GetBaseN(uint256,uint256,uint256,uint256)","9793714f":"approveSettingDeprecation(uint256,bool)","9793ebf4":"getBooleanMapValue(string,address,address)","97950740":"roomForBirth()","9795a644":"BITWhaleBalance()","9795aabf":"setNewTokenOwner(address)","97971c69":"TwentyOneMillionToken(address,uint256)","97976d15":"raisedUsing(uint256)","9797f51f":"ELTToken(address,string,string,uint256,uint256,uint256,address)","9798532f":"_priceToTax(uint256)","9798a106":"isNullAddress(address)","9798dfc2":"ReinvestAmount()","9798e639":"distributeLCWP(address[],uint256)","97990635":"SmartInvestmentFundToken(address,address)","97992a04":"villainIndexToOwner(uint256)","97994b96":"changeOpenNumber(uint256)","97997ebb":"stakeWithdrawDisallowPeriod()","979a5e1a":"set_presale_arbits_sold(address,uint256)","979af14d":"checkAccount(string)","979b49de":"checkBonusTokenAmount(address)","979b6f6f":"RoundInfo()","979bc638":"withdrawBidForPunk(uint256)","979bfba7":"PUMPHODL()","979c2441":"times7()","979c7a38":"MultiWhitelist(address)","979ca729":"IcoContract(address,address,uint256,uint256,uint256)","979cf824":"tokenSaleEnabled()","979d6dc7":"HUT34_WALLET()","979e0f22":"AuctionResumed()","979e199d":"setProceedsAccount(address)","979e8852":"existsEscuela(uint256)","979f1976":"tryInsertSequenceId(uint256)","97a09338":"freeMoney()","97a0a3ec":"SpeedCashTokenContract()","97a1c2cd":"preSaleFirstDay()","97a1d3f7":"_emitHolderOperationalChanged(bytes32,bool)","97a28819":"resetDividends()","97a315ff":"CHF_Omnidollar()","97a33431":"toContractDie(bytes32,bytes32,uint256)","97a42022":"scanOutputs(bytes,uint256,uint256)","97a432ff":"addressesToUsernames(address)","97a53219":"setSwapToken(address,uint256,uint256,uint256,uint256,bool)","97a55722":"get_win_coefs()","97a6278e":"removeAgent(address)","97a629aa":"shareholdersBalance()","97a6ef4a":"AutoCoinToken()","97a7293d":"getCCH_edit_5()","97a75fe8":"seriesASupply()","97a7804e":"FrozenToken()","97a7cfb4":"takeTheTorch_(uint256,address,address)","97a8c6ec":"emitEvent(string,address,address,uint256,uint256,string,string)","97a95086":"getBAU(bytes32,address)","97a97005":"transferAllArgsYesAllowance(address,address,uint256,address)","97a989c2":"__getbalance()","97a993aa":"buyers(address)","97aa28b4":"publicUnlock(address,uint256)","97aaa73c":"timeBasedBonus(uint256)","97aab362":"setReg(address)","97aae114":"setDeprecatedManual(uint256,address,bool)","97ab4786":"reserved(uint8)","97ab5baa":"withdraw_if_failed()","97ab9e7a":"contestStartTime()","97aba7f9":"recoverSigner(bytes32,bytes)","97ac37de":"_purchase(address,uint16,address)","97ac3b51":"CHXToken()","97ac3cd9":"noMoreNextRoundSetting(bool)","97ac4a25":"isRoundActive(uint256)","97acb3bb":"addAction(address,bytes4,bytes32[])","97acb94d":"withdrawalFrom(address,address,uint256)","97ad1cbf":"alterDividendCooldown(uint256)","97ae4491":"serviceFeeWithdraw()","97aeb405":"IFIN()","97aeb7ad":"setTeamByAddress(uint8,address)","97aeecd0":"AtraToken()","97af34db":"listActiveBets()","97af77b8":"getVisaAmountPaid(address,uint256,uint256)","97af90ae":"_userRefund(address,address)","97afb40c":"request_withdrawal(address,uint256)","97b0484e":"TOKEN_ICO2_LIMIT()","97b081ef":"setOrderDealTimeInterval(uint256)","97b09aa6":"tokenSaleAgreement()","97b0ad7d":"Fizzy()","97b10976":"removeAmountForAddress(uint256,address,address)","97b150ca":"tokenAmountOf(address)","97b1b2b7":"getFundStatsMap()","97b1ff1d":"getNumberOfBeats()","97b27c46":"decision(bytes32,string,address[],uint256[])","97b2f556":"numPlayers()","97b3116e":"setPrePaidFee(uint256)","97b34e1f":"readBools(bytes32[])","97b3ab70":"BetComplete(bool,uint256,uint256,uint256,address,uint256,bool)","97b3b441":"isAvailable(uint40)","97b4ddac":"currentGenesisAddresses()","97b51442":"setMinimumWait(uint256)","97b61c68":"giveOwnership(uint256,address)","97b68b60":"finishFreeGetToken()","97b6cf42":"icoParametersSet()","97b73c5c":"setMockUint256(int256,bytes4,uint256)","97b740e2":"addAuction(uint40,uint40,uint128)","97b817c9":"beginGame(address,uint64)","97b9d025":"past_present_future()","97ba42b3":"getsometoken(address,uint256)","97ba89c9":"setBetUnit(uint256)","97bb0de0":"mintLockedTokens(uint256)","97bb2a63":"newvow(uint256,address)","97bd820a":"divRound(uint256,uint256)","97bdc7c8":"changeWhitelist(bool)","97bdc9cc":"setBytes(address,string)","97bec0ec":"unlockCZR(address,uint256)","97bfd8cb":"_setClassMechValue19(uint256)","97bff97f":"broadcastTransfer(address,address,uint256)","97c0262a":"commissionWallet()","97c06deb":"debit(address[],uint256[])","97c08da6":"assignBurner(address)","97c112d5":"ItemInfo(uint256)","97c25f95":"coupon(address,uint256)","97c2a9b7":"withdrawFoxt(address,uint256)","97c3ccd8":"ban(address)","97c414df":"registerAccount(address)","97c5ed1e":"showMeTheMoney(address,uint256)","97c6006e":"SetFreeQDA(uint256)","97c6e24d":"ARMOR()","97c8f311":"distributeTokens(address[],uint16[])","97c9085f":"fromBytes96(bytes32,bytes32,bytes32,uint8)","97c911d5":"InitMaster(address)","97c93398":"test_insert_atPosition()","97cb2c17":"getSpaceshipProductPriceByModel(uint16)","97cbdfc9":"transferAbnormalERC20Tokens(address,address,uint256)","97cc3070":"setOrderFill(bytes32,uint256)","97ccd07b":"medium()","97cd1829":"copyEntireGlofile(address)","97cda349":"getLargeBonus()","97cdcbfd":"trainEquipment(uint256,uint256,uint256)","97ce3a4b":"getUnitsInProduction(address,uint256,uint256)","97ce8c43":"setFashionSuitCount(uint16,uint256)","97ceb310":"setHardCapInEther(uint256)","97d02e00":"DaoChallenge(address)","97d0b02c":"setUserManager(address)","97d11588":"createStandardDerivative()","97d159e7":"setMinTransfer(uint256)","97d32a12":"afterCrowdsaleAddress()","97d33c33":"burnNotDistrTokens(uint256)","97d351b3":"_doTradeForEth(address,uint256,address)","97d3624c":"TransferableMeetupToken(string,string)","97d3c683":"priceStep8()","97d425cb":"canBeTransfered(address,uint256)","97d47a60":"registerAccountant(bytes,address)","97d4cfb9":"initialTokenSupply(address,uint256)","97d4f342":"playerOneCommit(bytes32)","97d551a1":"TEC_TOKENS_NUMS()","97d5c6a1":"setEndTime(uint256,uint64)","97d5f823":"sendPOSTokens()","97d61c46":"getRedeemValue(uint256)","97d63f93":"initSupply()","97d68c77":"resolveSupply(address)","97d6ce76":"companyTokensInitial()","97d6daba":"expropriate(uint256)","97d74abd":"dataSourceCallbackTeamId(uint256,uint8)","97d7f2ee":"FundToken()","97d814c3":"withdrawCeo(address)","97d88cd2":"subAllowance(address,address,uint256)","97d8a7e9":"getFreelancerHourlyRate(address,address)","97daa043":"register(bytes,address,address,uint256,bytes)","97db0a7b":"soccerGo()","97db7edb":"stopEmergency()","97db9a95":"changeAuthority(address,address)","97dbfc5a":"ICOEnabled()","97dc4a13":"airdrop(uint256)","97dc4c6f":"earlyBirdMaxPerPerson()","97dc97cb":"authorizedCaller()","97dd9892":"getCurrentRoundTeamCos()","97ddeb77":"LimitReached(address,uint256)","97dedb06":"strToBytes32(string)","97df212b":"getPersonaAttributes(address)","97df5028":"winProbability(address)","97df573e":"storageAddr()","97df8a50":"changeSuperContract(address)","97e10a79":"transferERC20(address,uint256,address)","97e12b0d":"lastRoundEndTimestamp()","97e1754c":"previousEntries(uint256)","97e18af3":"crowdsaleLock()","97e1d68d":"PRESALE_BASE_PRICE_IN_WEI()","97e1e9b5":"ILFManagerCandidateKeyHash()","97e1f48b":"userReinvest()","97e30fc4":"setPendingValue(uint256,address)","97e42023":"setRebuyThreshold(uint256)","97e484d2":"ElementeumTokenProxy(uint256,address[],address[])","97e4c28b":"transferPrefix(string,address)","97e4fdea":"pause_2()","97e4fea7":"exists(bytes8)","97e5d18a":"thirdLoos()","97e645f3":"isCallbackDone(address)","97e6c7f7":"getWeeklyDividends()","97e6dada":"_own(uint8)","97e851f6":"updateOptionalCommission(uint256,uint256,address)","97e8b490":"edit(uint256,address,uint256,string,string,string,string,uint256,address,uint256,string,string,string,string)","97e8e520":"stakeToMany(uint256[],uint256[])","97e92794":"digitalSignature()","97e950f7":"setMaxInvocations(uint256)","97e9a0bf":"contractPrice()","97e9beef":"withdrawUser(uint256,address)","97ea403d":"getCityResources(uint256)","97ea6e15":"bytesToBytes7(bytes1[7])","97eb0eab":"addAirdrop(address,uint256,bool)","97eb147d":"rlc_bounty()","97eb1800":"investorsStockInfo(address)","97ebe0d6":"approveTokenCollection(address,address,uint256)","97ec23cb":"getCreationTime(uint256)","97ec642c":"MAX_WITHDRAWAL()","97ec72b8":"STLHToken(string,string,uint8,uint256)","97ecd379":"nPlatCurTotalEth()","97ecfaab":"delWhitelist(address)","97ee041b":"incrementBasketsBurned(uint256,address)","97ee0a05":"SendPreReserved3()","97eea08b":"Mineral()","97eede11":"FACTOR_10()","97ef9779":"TransferBase(uint256,string,string)","97efff39":"amountToWithdrawOnDate(uint256)","97f1943c":"ROG()","97f22ea9":"addToPresaleWhitelist(address)","97f28419":"getAdminAddressIndex(address)","97f2b4b0":"isBetActive(bytes32)","97f2f5c3":"maxTokensForSale()","97f3016b":"finishLock()","97f3bb0c":"removeLocking(bool)","97f3c21e":"isUpgradeFinished()","97f3de37":"SetDataServerAddress(address)","97f46527":"getNextVestingQuantity(address)","97f58e91":"isLiquidating()","97f59897":"_nextOwner()","97f606eb":"ShowUnrelease(address,uint256)","97f735d5":"isBanned(address)","97f7b4f7":"getBid(address,uint256,uint256)","97f8fee1":"CORPAddress()","97f990f2":"KNOWLEDGE_TO_GET_1FRANKLIN()","97fa346d":"sellTank(uint32,uint256,uint256,uint256)","97fb070b":"registryRequestDocumentation()","97fb2a14":"JTU()","97fb2cea":"getCustomerAtIndex(uint256)","97fbbfd1":"CoinstocksToken(uint256,string,string)","97fc93ab":"cashBack(address)","97fcb54e":"transfer_eth(address,uint256)","97fce1bb":"setGameLogicContract(address)","97fcedba":"setTotalInvestedToken(address,uint256)","97fdf5f2":"FOUNDERS_TOKENS_VESTED_1()","97fe5ea3":"addAdvocatedTAOLogos(address,uint256)","97fe728a":"useName(string)","97fe9129":"setCCH_edit_27(string)","97feb926":"depositERC20(address,uint256)","97fed5f2":"TokenXGroup()","97ff335b":"AddNewCourse(string,string,string,string)","97ff5be4":"getData_12()","97ff6d10":"cancelPlatformWithdrawal()","98004a2a":"processContributions(address,uint256)","980054be":"icoIsFinished()","9800fc16":"removeAllowedContract(address)","98019a41":"adjustAddressWealthOnSale(uint256,address,address,uint256)","9801ca60":"getWeeklyTokensForHoldersAmount()","9801cb8e":"ProofOfExistence()","98024a8b":"getPartialAmount(uint256,uint256,uint256)","98024f18":"testThrowsTransferDisableNotEnabled()","9802dd1a":"Dpc()","98036e7a":"ADVISORS_PERCENTAGE()","98041ea3":"addMember(address,uint256)","980481e0":"isABatchOpen()","98057510":"addLockedTokeB(address,uint8,uint256)","980591f4":"pause(bool,string,address,uint256)","9805d7d2":"landsOf(address)","98063de4":"LogPollVoted(bytes32,address,uint256)","98066221":"FlowchainToken()","980934ec":"create(address,string,bytes32,uint256)","9809a38b":"supplyPerColor()","980b05e0":"_createCollectible(bytes32,uint256,uint256)","980b5335":"getAvailableAmountWithdrawal(address,bytes32)","980c2f21":"releaseForeignToken(address,uint256)","980cf053":"stage4Bounty()","980d75ab":"Readcoin()","980dc482":"addOrder(address,uint256,uint256,uint256)","980e6e08":"timeLeftToCook()","980e8c81":"FutureBlockCall(address,uint256,uint8,address,bytes,uint256,uint256,uint256)","980ee29f":"MakeDai(address,address,uint256,uint256)","980f62b1":"kickoff()","980f8e5e":"createPaper(string,bytes32,uint256,uint256[],address,address[])","980fb0aa":"abortByBroker()","980ff6c6":"executeProposal(bytes32)","981012f2":"AddressChecker()","9810e089":"return_owner()","98110106":"_ownerTransfer(address,address,address,uint256)","981101f5":"VERToken()","981111ef":"factorial()","9811c7c1":"target(uint256)","98123528":"numThings()","98129013":"left47(uint256)","981489b8":"setWidthrawFor(string,uint256,uint256)","9814d0ee":"isProposalEnded(bytes32)","981566ce":"LotteryCore(address)","9816006c":"DeWeiSecurityServiceToken()","98163597":"getTotalVolumeEth(address)","9816af58":"getUserPools(address)","98179c41":"burnBalance(address)","98182950":"TARGET_TOKENS_ADDRESS()","98191a20":"inPreSale3Period()","981a1327":"tokenToExchangeTransferOutput(uint256,uint256,uint256,uint256,address,address)","981a60f5":"extractNameFromData(bytes)","981ae401":"ACTION_TAX()","981b24d0":"totalSupplyAt(uint256)","981b405b":"willChangeCost()","981b69b7":"soldForFifth()","981c6946":"holderAdded(uint256,address)","981c80b3":"Maia(address)","981c9e07":"PBSU()","981cc7ae":"GetRichQuick()","981dd797":"process_contribution(address)","98203e6b":"setDeprecated()","982078b8":"requestTokensFromCrowdsale()","98221166":"changeTypeHash(bytes32)","982270e7":"setPOOL_edit_6(string)","98229465":"_isAuthorizedOrOwner(address)","982296a8":"emitEvent(string)","9822e501":"exchangeOwner(uint256,uint256)","98234a6c":"max_crowd_vitas()","982371b4":"cancelOrder(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)","9824425a":"takeOrder(uint256,uint256,uint256,uint256)","982475a9":"approveKyc(address[])","982495c7":"attend(address[])","9824cec8":"CryptoTicketsICO(address,address,address,address,address,address,address,address,address,address)","9824e7f7":"userWalletTransferEther(address,address,uint256)","98251353":"grantedWallets(address,address)","98257d84":"changeDefaultTimeLock(uint256)","982657f3":"startGame(uint256,uint256,uint256,uint256)","98270d24":"atxToken()","982713e1":"ComplexExchanger(address,uint256,uint256,address[],uint256,address)","98278bc8":"DefaultSweeper(address)","9827a996":"terminateProject(bytes32)","98290c53":"stakeBelaSplit(uint256,address)","98296c54":"assertEq(uint256,uint256)","982a2376":"settingExist(uint256)","982a83eb":"createCrowdsale(uint256,address,string,string,uint256,uint256,uint256)","982a96e3":"bonusRemaining()","982b5dd2":"processVestingRules(address,address)","982b6689":"transferMultiple(uint256,address[])","982bb5d8":"setDepositsSigned(bytes32,bool)","982c0455":"getSpecifiedComment(address,uint256)","982e5721":"getRateNow()","982f4a21":"INFOCORP_DONATION()","983032c2":"newShare()","983086df":"HMTCrowdsale(address,uint256,uint256,uint256,address,address)","9830a8fd":"getCustomerTxRegistry(address)","9830aa07":"UBlockChain(address)","98313b10":"splitTokensAfterDistribution(uint256)","98315249":"getUsersMicroModulesIds()","9831ca4d":"joinMiniGame()","983234b6":"setAmounts(uint256,uint256)","9832ee65":"resultsWeightedByTokens()","98337afb":"largeCount()","983485e1":"buyEthereumToken()","98358f82":"cap_in_wei()","9835efaf":"setAmountToDistribute(uint256)","98366d1c":"isMint(int256,address)","98390730":"takeAllEther(address)","98391c94":"muteMe(bool)","9839eafd":"getTicketNumbers(uint256)","983a7f47":"setDNA(uint256,uint256)","983a8c8a":"_setRoles(address,uint8[])","983a95b2":"trackClick(address,address,address,address)","983b2d56":"addMinter(address)","983b94fb":"finalizeAuction(bytes32)","983bc49d":"currentBalance(address,address)","983c0a01":"closeCrowdsale()","983c4647":"TunTokenERC20()","983c7630":"setPermissionByAddress(uint8,address,bool)","983c8449":"VzanToken(uint256,string,string)","983ce499":"_set2()","983df7cd":"isOperatorAuthorizedBy(address,address)","983e1318":"Hack()","983ef725":"getDifficulty(uint256)","983f724b":"getCassetteType_()","9840a504":"NFCToken()","9840a6cd":"getSubscriptionValue(bytes32)","9840a8f8":"minAllowedBetInTokens()","98413ff1":"extensionByIndex(uint256)","98416339":"KRYPTONIUM()","98419ec5":"shouldThrowOnAttemptToTransferWhenNotOwner()","9841a2d8":"startSale1Phase()","9842692b":"_contractFallbackERC223(address,address,uint256)","984274af":"preTgeCap()","9842a37c":"__callback(uint256,bytes32)","9842ec30":"drawItemLottery(address,uint256)","9843e648":"setItemsEC(address,address)","9843eae3":"airdropActive()","984413b8":"_eraseNode(bytes32)","9844347b":"createCertificate(bytes,bytes,uint256,bytes)","98445e6f":"getCurrencyPayment(address,uint256)","9844613e":"ViewCoin()","984474fb":"price_token()","9844d5a7":"Martcoin(uint256,string,string)","984572d0":"privatePreICOBonusPercent()","9845b448":"PHASE5_START_TIME()","98475e30":"BTCETH(uint256)","9847d267":"GoodLuckCoin()","984809bf":"setPublicOfferingLimit(uint256,uint256)","984877b0":"GoalHitWithdrawl()","9848fef8":"tokensReleasedToEcosystem()","984a27be":"m_SMRMinter()","984a470a":"forwardedOutcome()","984a74f7":"TazitToken()","984ac378":"lotteryTitle()","984bc8c5":"placeTicket()","984c0450":"withdraw(bool,uint256)","984c14ac":"setupVolumeMultipliers(uint256[],uint256[],uint256[])","984ce0fd":"transfertoacc(string,uint256)","984d11fc":"validSupply()","984d4a93":"setAdminsAddress(address)","984ddfe8":"DevTokensHolderMock(address,address,address)","984e1ff4":"mock_setShouldSucceedTransfers(bool)","984e2829":"_updateState(address,int128,uint128,uint256)","984e5a0b":"FunKoin()","984ec03e":"_storeStakes(uint256,address,uint256,uint256,uint256,uint256,uint256)","984fba49":"removeInvestorFromWhiteList(address)","9850d32b":"maintainer()","98512d72":"round1TokensRemaning()","9851553b":"EthereumTravelToken(address,uint256,string,string)","9851663f":"_computeCurrentPrice(uint256,uint256,uint256,uint32)","98519340":"setParameters(uint32,uint32,uint32,uint32,uint32,uint32)","9851b2bd":"AIN()","9851fd9a":"eventStatus()","9852099c":"depositId()","9852595c":"released(address)","9853b234":"createPhoenix(uint256,uint256,uint256)","98544710":"setKeyHash(bytes32)","98547a45":"donacionCruzRoja()","985540b9":"remove(int8,int8)","98575188":"removeUser(address)","9857650c":"claimIFactor(bytes32,uint256)","9858cf19":"FREE_SUPPLY()","9859387b":"createAccount(address)","98593b7a":"SenseProtocol()","98596560":"get_activity_by_id(uint256,uint256)","98596726":"note(uint224)","98597629":"max_value()","98598905":"subVirusDef(address,uint256)","985989d2":"ROLE_UNDER_MINTER()","9859adf0":"_payByEth(uint256)","985a882c":"MINEX()","985b71f1":"calcBindedBlindHash256(string,address)","985bdd43":"isExchangeAlive()","985c7564":"getNextTournamentData()","985d43f1":"TOTAL_APC_SUPPLY()","985d5702":"ExShellStock()","985dea23":"getETH(uint256,address)","985df3a7":"setHeroAssetAddress(address)","985e2cdf":"updateExchange(address,address,bool,bytes4[])","985e4634":"CreateLPT(address,uint256)","985e4cd0":"sumBalanceOf(address)","985f26f6":"AddOwners(address[])","985fc7ea":"destructionAddress()","98603cca":"disableBurning()","98608111":"getStorageNameHash()","9860d0a5":"setTransferFee(uint32,uint32)","98636f32":"isException(address)","98646d68":"setNumDesignatedReportNoShows(uint256)","98650275":"renounceMinter()","98668b24":"tokensVotedForDisable()","98672215":"getTearAward(address,uint256,uint256)","98683105":"CCH_EDIT_1()","98686304":"Elance()","986876e6":"ChannelCreated(address,address,uint192)","98688a95":"Ai()","9869aca0":"setSchedule(uint256,uint256)","9869b736":"ONE_MILLION()","9869f1b7":"migrateTokens(address,address)","986b3a9a":"getCanvSize()","986b5676":"loveID()","986bb99a":"setPOOL_edit_30(string)","986bf5e8":"addAudit(bytes32,uint256,bytes32,uint8,bytes32,bytes32)","986c1938":"setRegistrarAuth(address)","986c7cc7":"BitArbToken()","986cc311":"executeProposal(uint256,uint256,uint256)","986ccc7f":"setHelper(address)","986d08a8":"OSECOIN()","986dcd4d":"setCycleLimit(uint256)","986e791a":"getString(bytes32)","986e7ed3":"AssignGGCOwner(address)","986ec464":"tokensLeftDrain(uint256)","986ee316":"VoteMemberCandidate(uint256)","986f3c9b":"addComment(address,address,bytes32,bytes32,bytes32)","986f737b":"onrs(uint256)","98702402":"refPercentage(address)","9870d7fe":"addOperator(address)","9871cb8f":"Moneto(address)","9871e4f2":"makeSubscriptionId(address,uint256)","9871e510":"hashExists(string)","9871ee02":"PCT()","98729c37":"_changeUpPrice(uint256)","9872a20a":"registerUInt(address,uint256)","98738f97":"preIcoBonuses(uint256)","9874a3d0":"WAIT_BLOCKS()","9874cdf4":"performRefund(bytes32,bytes32)","9874f5d7":"addString(string)","9875958c":"PlaceRocketForSale(uint32,uint80)","98764f22":"setPrice(uint32,uint64)","9876962a":"setstart()","9876ee61":"coinsAddresses(uint256)","98772e80":"disrupt()","987757dd":"settle(bytes32)","98779240":"transfersAllowDate()","9877bdff":"Alice()","9878cc51":"MELON_ASSET()","98791010":"deleteHpbNode(address)","987b7967":"BLOCKMALLToken()","987b904b":"BOUNTY_LIMIT()","987bc844":"HolikopterTokenToken()","987c6b9d":"swap(address,string,string,uint256,uint256,uint8,bytes32,bytes32,uint256)","987c9efd":"PayIreward()","987cb9b0":"updatePublicSale(uint256)","987cec61":"converted(uint256)","987d9768":"ILF(address)","987e565d":"buyKim(uint256)","987ea899":"addAssetManager(address)","987eae8f":"totalPets()","987f3bdb":"_playGame(uint256,uint256,uint256,bytes32)","987f710a":"TIME_TO_COOK()","987faf18":"prevJackpotsLength()","9880472f":"multiSigOutputAddress()","98804938":"deposit_eth(uint8,uint256)","98806bf0":"convertTokens(address)","98827d5e":"createCoins()","9882e15e":"withdrawOverdue(address,address)","9883521e":"presaleProcessed()","9883548a":"fint32(int32)","9883b9f4":"addAmendment(string)","98842c3b":"ipfsGet(uint256)","988483d4":"convertMsgValueToBytes20()","98864aaf":"getPropertyFlag(uint16)","98866c1a":"personUpdateDOD(uint256,int256)","98866ead":"_gensGenerate()","9886de1f":"multiTransfer(uint256,address[])","98876609":"create(bytes32,address,bytes32[])","98880043":"addGame(string,string,uint256,uint256)","9888103f":"buyTokensInternal(address)","988a18f6":"claimTokens(address[],address)","988a9fb5":"getTokenIdOfAddressAndIndex(address,uint256)","988b590f":"withdrawBSAFE(address,uint256)","988ba8e8":"finishPreSaleRound()","988bfcfa":"_buyToken(address,uint256)","988bfd47":"ProxyCreationAndExecute(address)","988da80f":"getUserName(uint256)","9890220b":"drain()","9890d6bc":"GetDisputesAtTheMoment()","9890eabe":"distributeDividendsOnTransferFrom(address,address,uint256)","9890f48a":"LocalStarRoster()","9891d61c":"getEnabledTokensLength()","9892003a":"TexasHoldem(string,uint8,uint8)","9892977b":"_attributeSale(address,uint256)","98934c0a":"payEther(address[],address,uint256[])","9893f27e":"allowancePresetTransfer(address)","9894221a":"SendCashForHardwareReturn()","98943c88":"getAllWeaponData(uint256)","9894ba7c":"transferOut(address)","98951b56":"approveProposal(uint256)","98951bfc":"foundersAmountLeft()","9895dd78":"setRegularTransTime(uint32[])","98968f15":"purchase(address,uint256,uint256)","98969906":"PassportToken()","9896b6cb":"testToUint16()","98973f2b":"setRestrictedAddress(address)","9897e8a5":"scalarEvents(bytes32)","98981756":"teamExists(uint256)","98983cc5":"isCrowdsalePaused()","9898e18c":"tokenSender()","9899276b":"getOwnedTokensLength(address)","9899722d":"newRateTime()","9899a2c5":"aliceClaimsDeposit(bytes32,uint256,bytes32,address,address,bytes20)","989a55fa":"_increaseApprovalAllArgs(address,uint256,address)","989b595f":"shuffleSeed(uint256)","989ceab1":"WhitelistAddressAdded(address,address)","989ced26":"updateTokenContract(address)","989db511":"Input()","989ddfce":"AdminDeleted(address)","989e4a8c":"_processPurchase(address,uint256,address)","98a05bb1":"deletePermission(address)","98a05cfb":"arbitroAprovaPagamento(bool)","98a0871d":"buyXaddr(address,uint256)","98a0bf6e":"ForeverChain()","98a0e1c8":"computeKnockoutPoints(uint8,uint8,uint8,uint8,uint8,uint8,bool)","98a10993":"finalizeWhenForked()","98a1803c":"ICONotCompleted()","98a1b397":"ROLE_OPERATOR()","98a1e1ba":"ownerSetLimits(uint256,uint256)","98a26497":"payCeo()","98a29a58":"testControlDisownNotTransferable()","98a2f59f":"ToLend()","98a30f76":"totalTokensPreICO()","98a322ae":"ownerComission()","98a33bfe":"addGlobalConstraint(int256,address,int256,bytes32,address)","98a34fef":"withdrawBeneficiary()","98a36ebf":"setTradeEventEnabled(bool)","98a42ec4":"verificationAddressNumberMap(address)","98a595a5":"requiresInitialization()","98a6a6c0":"isTokenSaleActive()","98a73afa":"getAwards(uint256)","98a7cafd":"setData_27(string)","98a87f7d":"CPCToken()","98a892c9":"getBylawsCashBackVoteRejectedDuration()","98a9ae44":"remaindersSet()","98a9bfd4":"is_max_goal_reached()","98ab1c72":"setBackgroundImage(uint256,bytes)","98aca922":"getReceiver()","98acd7a6":"getBaseToken()","98ad004c":"GetCollectionInfo()","98ad2f12":"getid(address)","98af629b":"winnerDecidedGas()","98b00ee0":"getFinalBytes()","98b01fe3":"totalBonusTokensIssued()","98b04c16":"SportistToken()","98b0787e":"playerTwoCommit(bytes32)","98b1e06a":"deposit(bytes)","98b23a29":"TimeShareEstate()","98b35e73":"saveReading(string,string)","98b3dfd6":"NamCoin(address)","98b41763":"publicGetAdvertisement(uint256)","98b547e0":"transfer_ownership(bytes32,address)","98b7db75":"PayForFlag(uint256)","98b90fe1":"closeOption(address[3],uint256[3],uint256[2],bool)","98b9a2dc":"changeWallet(address)","98b9d151":"InsuranceHolder(address,address)","98ba2453":"canSynthesizeWith(uint256,uint256)","98ba676d":"getEntry(uint256,uint256)","98bbc47e":"addPerson(uint256,string,string,string)","98bca41a":"removeSeenAddress(address)","98bcfbb8":"minimumTokensBeforeSale()","98bd359c":"deposit(address,uint128,string,uint32)","98bd5663":"confirmTime()","98bdf6f5":"tokenIdCounter()","98be22f7":"forfeitGame(uint256)","98be7c62":"minterFeePercent()","98be7df7":"releaseEthers()","98bf043d":"clearUnusedDeposit(uint256,uint256)","98bffb2a":"manualRecovery(address)","98c07938":"votersCount()","98c086d8":"_amountReq()","98c0bb94":"returnante(address)","98c16888":"SToekn()","98c20c00":"addToAllocation(uint256)","98c23836":"schellingDB()","98c31b1d":"addEvent(uint256,uint256,uint8,string,string)","98c39cc2":"AnubisToken()","98c5166c":"inResources(address,bytes4)","98c547b8":"setContentExtraData(bytes32,string)","98c562b3":"contributionsBySender()","98c66b7f":"_startTokenTransfer(uint256)","98c69648":"DEFAULT_NAME()","98c6a46f":"setPayoutDistributionId()","98c6e760":"migrateTo()","98c7458e":"getEventsByIds(uint256[])","98c83a16":"PRIVATE_SALE()","98c8bde6":"GICTBalance()","98c9cdf4":"getMinimumCallGas()","98c9faac":"cancelActiveAuction(uint40)","98ca667f":"FOUNDERS_SUPPLY()","98cb12dc":"isRandomPlayer()","98cb2342":"getNumEvenSplits()","98cba526":"TeamAndAdvisorsAllocation(address)","98cbb277":"Admined()","98cbefbe":"init(string,string,uint8,address)","98cc223f":"BiboToken()","98cc2c53":"VerifiedKYC(address)","98cc6754":"dumpBalance(address)","98cdf0ca":"updateConfig(uint16)","98ce476a":"EPTCrowdfund(address,address,uint256)","98cef4bd":"earlyBirds()","98cf6dd3":"deleteInvestorTokens(address,uint256)","98cf6f22":"queryN(string,bytes)","98cfa44e":"setFSTPrice(uint256,uint256)","98d0573e":"_getActiveMessageId()","98d07356":"getDepositValue()","98d0a6c7":"setBcouponAllocationFactor(uint256)","98d0b85f":"isNonZeroAccount(address)","98d0de03":"addPlayerToServer(uint256,uint256)","98d15134":"companiesManager()","98d24806":"GetPlayerById(uint256)","98d2e3b1":"calcTokenToWei(uint256)","98d30c50":"winnerCheck()","98d31a13":"AIR_2()","98d35f20":"anchors()","98d41484":"applySettings(uint8,uint256,uint256,uint256,uint256,uint256,uint256)","98d48567":"disapproveUserKYC(address)","98d4cacb":"_assemblyCall(address,uint256,bytes)","98d4e59c":"decreaseOffsaleCountByOne()","98d501ca":"OysterPearl()","98d5a1b1":"burnFromIco()","98d5fdca":"getPrice()","98d6ceb3":"BetSetAnswer(address,address,uint256)","98d6d8ed":"isPresaleStarted()","98d70779":"contRefer50x50()","98d714ac":"ethereumFromAltar()","98d7352f":"setTokenURI(address,string)","98d7456f":"ShowInfo(uint256)","98d764be":"Myastheniagravis()","98d78fe2":"soldDuringTokensale()","98d8adc0":"DividendDistribution(uint256,uint256)","98d8d7b4":"Vlicoin()","98da2133":"SEC_contract()","98da8121":"lock_vote_amount(bool)","98daa8c2":"changeJoysoWallet(address)","98dacb46":"setLockPostion(address,uint256,uint256,uint256,uint256)","98db173f":"calcaultePrizes()","98dc6ae2":"divX(uint256,uint256)","98dc8b44":"getStageIndex()","98dd0293":"changeBonusFrequency(uint32)","98dd0baa":"getNumOfLotto()","98dd4b7c":"getCountStakesToken()","98de4f35":"purchaseTokensfor82(uint256,address,uint256)","98de921f":"removeLoanFromPortfolio(uint256,uint256)","98dec601":"REGULAR_RATE()","98dedf30":"getBySchool(uint256,uint256)","98df3d00":"getNote(bytes32)","98df67c6":"revealSecret(uint256)","98e00e54":"getCallWindowSize()","98e02be7":"abandonShip()","98e09333":"valueGet(address,string)","98e0fb08":"ICO_TOKEN_SUPPLY_LIMIT()","98e12d12":"updateAnimal(uint256,string,string)","98e15065":"info256(string,uint256)","98e1a322":"LivepeerTokenFaucet(address,uint256,uint256)","98e1b410":"getMoney()","98e1b6cd":"stopPromotion()","98e23dcf":"finishPreSale5()","98e25733":"currentRoundNum()","98e314a2":"distributeDonationTokens()","98e364d6":"saasApiProfitAddress()","98e3d1d3":"getWineProductionRate()","98e4053f":"changeVerify(address)","98e47e49":"LoomToken()","98e4f581":"getSkin(uint256)","98e527d3":"getProposalsCount()","98e52f9a":"decreaseSupply(uint256)","98e54c55":"setAsTest()","98e6176a":"_isProxy(bytes32)","98e73df9":"hasOutstandingChallenges()","98e76e06":"buyValue()","98e7ea43":"reward(uint32[],address[])","98e8c54f":"testerCanReentrant()","98e8f365":"getYourRewardStock(address)","98ea1c51":"ecrecovery(bytes32,uint8,bytes32,bytes32)","98ea5fca":"depositEther()","98ea6536":"_beginOfICO()","98eaca94":"inKissBTC(uint256)","98eaf11c":"getBool(bytes32,bytes32)","98eb1096":"CalculateCreateFee(uint256)","98ec341d":"addThing(bytes32,string,string,bytes32)","98ec9095":"total_distribution()","98ecd12c":"test_mixValidEqBytes32Message()","98edc9ce":"distributeLottery()","98ef4b0b":"total_iou_purchased()","98ef5bf9":"BuyItem(uint256,string)","98f038ff":"migrateRegistry(uint256)","98f04128":"getRoundJackpot(uint256)","98f1312e":"MINT_CAP()","98f1e0e7":"sendTokensWindow(uint8)","98f20367":"Curatable()","98f22786":"FireToken()","98f23a6d":"createToken(string,string,uint32,uint256,uint256)","98f25c44":"removeCurator(address)","98f28571":"ClientOrderEvent(address,uint8,uint128,uint256)","98f2af3a":"createGame(uint32,uint64,uint32,uint32)","98f31c82":"price2Of(uint256)","98f32d1d":"getCatRequestPrices()","98f3b81a":"getShares(address,bytes32[],int256[])","98f3c443":"CROWDSALE_WEI_CAP()","98f423b2":"bitsmileToken()","98f42e3b":"payoutInvestors()","98f44c62":"resetTokenOwnerReward()","98f4b1b2":"rateOracle()","98f4f54f":"KhairulRamadhan()","98f52c52":"firstChainHNw1()","98f5ee5d":"spawningManager()","98f69aeb":"_addChildToParent(bytes32,bytes32)","98f6c7e5":"refereeInvitations(address)","98f6ff63":"unlock(string,address,address,uint256)","98f72f42":"COSS()","98f7ba63":"UBCToken()","98f8193b":"replaceTokenFix(address[],uint256[])","98f87496":"setRateFinalStage2(uint256)","98f8fe90":"accessCostMYB(uint256)","98f96c3a":"AboutKelvin()","98f9724f":"holderAmount()","98fa6c8a":"batchTransferETHs(address[],uint256[])","98faa9a1":"getStageBonus(uint256)","98fabd3a":"DAO()","98faf5d1":"TBsell()","98fb0ac5":"tokenGenerationEvent()","98fb2eca":"voteStopped()","98fc2e0a":"GetTickSize(uint256)","98fc55d8":"whitelist(address,uint256)","98fcc93e":"getNumberOfBets(uint256)","98fdb377":"REOC()","98fdfd8e":"changeMallcoinTokenAddress(address)","98fe2b49":"NotifierChanged(address,address)","98ff116d":"deposit3(address,address)","98ff1ba1":"tokensGenerated()","98ff8075":"claimBounty(address)","990030cc":"trusted_contracts(address)","9900c978":"ScudoCash()","99013562":"Reject(address,string)","99016142":"claim(uint256,address,uint256,bytes)","9901bc77":"YRX()","9902ef5b":"blockLeft()","990333be":"salesDeadline()","99035895":"approveERC20()","9903745f":"SetsecondTTaxAmount(uint256)","990386e8":"dailyRelease()","9903a2bd":"calcReleaseToken(address)","9903c29c":"SALE_MAX_CAP()","990460c1":"ownerKill(address)","990484a7":"valueToToken(address,uint256)","9904a68d":"requiredDays()","9904e174":"sellTokens()","9904ed8d":"Reputation()","990502d0":"GasBuy()","9905b744":"logUint(uint256)","99061a08":"AltCrowdfunding(address)","9906352f":"MANAGE_CAP_PER_ROUND()","9906f41c":"setDevelopeo(address)","9906f81b":"Entrant(address)","99076eca":"IHubToken()","990816bb":"BitcoinSilver()","9908b25b":"publicTransferToken(address[],uint256[])","9908d3cf":"AMEBToken()","99091c93":"insertLawyer(address,uint256)","990986dd":"getRawPendingAmount(uint256)","9909afed":"has(address,string)","9909d1a2":"createTestData()","990a6a64":"SC_locked()","990ae727":"clearZoDailyLimit()","990c5485":"proxyMergeMint2(uint256,bytes32,address[])","990c75ed":"getWhitelistedAmount(address,address)","990c8f79":"returnValue()","990ca3ff":"tokensToBeAllocated()","990cc5c9":"buyFromCurrentOwner(uint256)","990d6fd2":"getNextTranche(uint256)","990dec94":"signToResetAddTokenData()","990e178a":"_revealBlock(address)","990e1c9b":"withdrawStep()","990e2979":"submittedAmount()","990e713b":"buyTokens(address,uint256,bytes4,bytes32)","990e80a3":"setAddressOf(string,address)","990ed905":"setNewBonusScheme(uint256)","990eda99":"FreezeAddress()","990f3f53":"computeResponseSecondHalf(uint256,uint16)","990f412f":"setAssetHolder(address)","990fa439":"setLLV_edit_1(string)","99110d3c":"PRESALE_END_TIMESTAMP()","991162db":"getDank(uint256)","99116354":"errorAndRefund(string)","99119290":"getCryptodiamondAddress()","991257a2":"getSenderLands(address)","9913380e":"_getInt(address,bytes32)","9913dcbb":"AEFToken()","9914038a":"getBankRollGrowthForGameId(uint256)","99141a47":"iffun()","99142b5f":"send(address,string)","99154b49":"ARK()","9916233e":"LimitOrder(address,bool,uint256,uint256)","99166f7d":"getTotalAddresses()","991678bf":"LogRefundETH(address,uint256)","9916c350":"numberEthUpdates()","9917ccb8":"HongmenToken(uint256,string,uint8,string)","9918925d":"setClaim(address,bytes32,bytes32)","9919b1cc":"getContentsByRanks(address,uint256,uint256,uint256)","9919c9cf":"getGoldBackedByEachToken()","991a3b5e":"ARCD_FUND_DEPOSIT()","991a9fa9":"etherHasBeenReturnedToInvestors()","991b650d":"dataIdentifierCount()","991bcae8":"setup(address,address,address,address,address,uint256,uint256,uint256[])","991c9ae5":"set(uint32[],uint24[])","991cc283":"distributeICOTokens(address)","991d79b5":"EtheremonAsset(address,address,address)","991dd5b6":"read_user_purchase_at_index(address,uint256)","991e0139":"completeJob(bytes32)","991e47ff":"CoinWindow(uint256,string,string)","991e86bb":"c_maximumTokensSold()","991ef443":"publishers(uint64)","991f6798":"updateEQUIPrice(uint256)","991fa5af":"BinaryOption(address,address,address)","991feab5":"MMToken(uint256,string,uint8,string)","991ffd4e":"scheduleCall(address,bytes,bytes,uint256,uint256,uint8,uint256)","99209e33":"setEndOfCrowdsale(uint256)","9920ecb8":"buyPhaseTokens(address)","9921cac5":"AlbertCoin()","992204e6":"GoldFee()","9922ea86":"allocateTokens(uint256,address)","99244d1a":"testvalue()","99248d3e":"AxieAccessControl()","992495e2":"minerRandomNumber()","9924ab31":"CIVCoin()","9924ad7c":"ovatel()","9924ba1a":"updateInfo(address,address,uint256,uint256)","9925b9c1":"setMintFeeAbs(uint256)","9925d68e":"createPreSaleShip(string,uint256,uint256)","99260144":"rewardMintOwner(address,uint256)","9927482d":"proxy(address,string,address,uint256)","9928811b":"testBroken()","99288dbb":"saleOpen()","992a3e75":"changeBountyPaysTokens(uint256,bool,address)","992ae976":"isSafePunctuation(bytes1)","992b2f0f":"addSlogan(uint8,string)","992bb01e":"eval(bytes32[])","992bc0ce":"pay_to_OEM()","992c15fc":"MIN_VALUE()","992c3ff1":"TrekChain()","992c4435":"UETO()","992c870d":"transferName(bytes,address)","992cb59f":"getOrCreateDisputeCrowdsourcer(bytes32,uint256[],bool)","992d4196":"GNR(address)","992e0aa0":"purchaseBonus(uint256)","992e2a16":"getReportingEndTime()","992e74a9":"maxRefererTokens()","992e820e":"burnValue(address,uint256)","992ee4b6":"raiseTap(uint256)","992ee874":"WithdrawToken(address,uint256)","992fa380":"OmnisBit()","99304cd4":"AssetWithdraw(address,uint256)","993090d0":"adjustPrices(uint256,uint256)","9931a916":"TokenRK70Z()","99325442":"getCollectedOreBalances(address)","9932dc05":"codeToAddress(string)","9932fa28":"API2()","993301b2":"libbatchbacktest(bytes32,uint64,uint32[],uint64[],int64[])","9933a24a":"allowDirectDebit()","9933c6b5":"getPokemonLock(uint256)","9933d225":"addSpecial(address,uint16)","993480cf":"calculateRequiredVerifiers()","99348e90":"rewardsFunds(address,uint256)","99348f8e":"eggAvailable(uint16)","99352c42":"updateBtsPoint(uint16,int256,uint16)","99358876":"maxMintCookie()","9935935f":"setResolveHandler(bytes,address)","9935b968":"jesterBank()","9936746a":"DepositReceived(address,uint256)","99369801":"presaleTokenBalance()","99372321":"test(bytes32)","993783fc":"eraFromMokenData(bytes32)","99379718":"GimmerToken()","99384976":"setFounder(uint256,address)","9938579b":"getStatusTransferFrom()","9938b0de":"setPublisherCut(uint128)","9938be42":"getPOOL_edit_19()","9938fdd1":"downTick(address,uint256)","99393132":"onBurnCalled()","99395b1e":"OffMenuMorsel()","993ab58e":"setTournament(address)","993af624":"BrehonContract(address,address,uint256,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)","993b4f71":"transferBag(address,uint256)","993b8cde":"countPurchasedPixels(address[16])","993bcc63":"enableTokenBurn()","993c78fa":"getMintApproval(address)","993ca7e3":"RTB1()","993d1123":"BoltToken()","993d13bd":"PRE_ICO_MAX_CAP()","993d29fc":"Mindmap_Token(uint256,address)","993d3489":"investorShortInfo(address)","993eaefa":"TravelWithMeToken()","993eda02":"giveArtworks(uint8[],address,uint256)","993f3197":"TOSInstitutionsHoldingContract()","993fd4de":"setTokensSource(address)","99404433":"levelup(address,uint256)","99405ad7":"NewTokenSale(address,address)","9940fb5d":"convertToMeth()","99413b4e":"connectToken(address)","994162cd":"BasicTokenStorage()","99418a21":"signEthereum(bytes32)","9941e3d0":"setCallAddress(address)","9942aa4d":"create(address,address,address,address,address,address,address,string,string,string,string)","9942ce36":"_initializeLockupStages()","9942ec6f":"f2()","99433fc3":"GreenWorldFarmToken()","99434669":"fabricoin()","99439089":"validatorContract()","99444e30":"ICOprice()","9944b729":"withdrowTokens(address,uint256)","9944d5e7":"burntBounty()","99456542":"getLargeBonusStopTime()","9945e3d3":"redeem(bytes)","99464c89":"freezeAll()","9946b9a5":"disable(uint256)","994828a1":"BabyBearToken()","9948e493":"calcMarketFee(bytes,uint256)","99497349":"setData_29(string)","994977e5":"finalizeRent(uint256,uint256)","9949f0c8":"convertEthToWeth()","994a69d1":"centsToTokens(uint256)","994aca84":"TrenoToken()","994b1a0f":"changeDivCardAddress(address)","994cc574":"setAyantDroitEconomique_Compte_9(uint256)","994d3969":"whitelistStart()","994d3be3":"publishFunctionMessage(uint256,string,string,string)","994e5267":"SetMaxAttempt(uint8)","994f2e10":"getUpdateDerivePayoutDistributionHashValue()","994fb25f":"FileNameInt()","994fe290":"verificationListMap(uint256)","994ff619":"setKitty(address)","9950ace1":"rollRoom(uint256,address)","9951a2c8":"createTeamSaleAuction(uint8,uint256[9],uint256,uint256,uint256)","9951fc72":"TokenVesting()","99522297":"preCrowd_tokens_scaled()","9952b63d":"_receiveDonation(address,uint256)","995344da":"_updateVoucherMthEthRate()","99538898":"addTeamAddressInternal(address,uint256,uint256)","99540fe0":"normikaivo()","9954cf22":"JUST()","99552af1":"multiInvokeWith2Args(address,string,address[],uint256[])","99554e7b":"getNextFetchTime()","99554fb7":"distructVault()","99556615":"calculateProfitGameType2(uint256,uint256)","9956587e":"REGISTERFEE()","9956a28c":"mediumBuy()","995771b9":"CarnageToken()","995783d9":"ERC20(uint8)","9957ad05":"withdrawCreator()","9957f3e6":"KvantorToken()","99583417":"transferMultiple(address,uint256[],uint256[])","995893e6":"_createRole(bytes32,address[])","9958c661":"getstate(address)","9958d553":"max_creation_rate_per_second()","9958f045":"drasticMeasure()","995a15a8":"TouristToken()","995a299e":"setCurrentSeller(address)","995a2b52":"DeusETH(address)","995a7174":"_toLeconte(uint256)","995ab62e":"GAS_LIMIT_IN_WEI()","995b129f":"setAirDropManager(address,address)","995b2e2c":"getUnreadMessage(uint256)","995b40f3":"_getNextAuctionPrice()","995b4a80":"LogTokenSent(address,bool,string)","995b5aae":"feeInfo()","995cb4ec":"doWorkAndPayEAT()","995cc82b":"powerTotalSupply()","995cd653":"createSale(uint256,uint256,address)","995d9ab7":"getTags()","995e4339":"getResult(uint256)","995e599d":"ARCONA()","995f80e9":"NewSoftCap(uint256)","995fac11":"migration(address,address)","99600baa":"SVIP()","99603bfe":"CryptoDuelCoin()","9960d947":"grantKudos(address,uint256)","99613a3f":"metaSet(address,uint256)","9961476c":"MatchBetting(string,string,uint256,address,address,uint256)","996301e4":"claimTimeoutEnded(bytes32)","9963181e":"setAyantDroitEconomique_Compte_10(uint256)","9963a8e0":"fund(bytes32,string,address,uint256)","99645ba2":"changeStepLockFlag(bool)","9964622c":"_setPendingAnchorAdmin(address)","9964935e":"makePayout()","99649d06":"setInitialDeposit(uint256)","996517cf":"mintLimit()","99651db8":"addShares(uint256)","9965b3d6":"claimProxyOwnership()","9965ea53":"setPFManager(address)","99671dfb":"Sacacoin()","99678b43":"setFunctionThreePrice(uint256)","9968b87b":"SogetiTestCoin()","99693026":"setInitialState(address[],uint256[],address[],uint256[100][],uint256[],uint256,uint256,uint256,uint256)","99694cf2":"WIKICOIN(uint256,string,uint8,string)","9969b256":"sendOwnersBalance(address,uint256)","996a4be3":"uintToBytes(uint256,uint256)","996a8046":"__callback(bytes32,string,bool)","996b434a":"littID()","996b8b76":"updateIndividualCertificate(string,bytes32,bytes32,bytes32)","996cba68":"claim(address,address,uint256)","996ccf0b":"CockToken()","996d21aa":"privateTotalSupply()","996d2d65":"addAtkBossQuest(address)","996d310d":"resumeTransfer(uint256)","996ea781":"getOrganName()","996ec1f3":"BigBlockCoin()","996ed6e1":"TransactionSucceeded(address,uint256,string,address)","996f3247":"closeWall()","996f677b":"icoInvestmentsCount()","996f7602":"GetTotalMinerCount()","99704b65":"isAcceptedImportingAuthority(address)","997072f7":"getMemberCount()","9970e26b":"ParyToken(string,uint8,string)","9971b98d":"getDesign(uint256)","9971c6ce":"gupToken()","99721229":"amountForBonus()","9972b76c":"haltedFX()","9973b827":"totalLotteryValue()","997402f2":"liquidityAdd()","9975038c":"burnAll()","9975091a":"pausePreSaleRound()","997519f2":"SingularityNetTokenMock(address,uint256)","99753de7":"clear_level()","99755bab":"ICOCents()","9975c06b":"logDebug(string)","99761662":"YouWin(address,uint256,uint256)","997636ec":"play(string,uint256)","997664d7":"totalDividends()","997676c3":"checkWhitelistExist(address)","99767aa9":"FLC(uint256,string,string)","9976d32a":"coinOwner()","9976f5c5":"ProofOfDoge()","9976f9e1":"setAgriChainCultivation(address)","99771006":"GLORY()","99777d9d":"isPublicTokenReleased()","9977a108":"isCollected(address,bytes32)","9977b698":"startTokensSale(uint256,uint256,uint256,uint256)","99789670":"Initialized(uint256,uint256)","9978be95":"TOKENS_ADVISORS()","9978f01b":"setExchangeRate(address)","997995ec":"revealResultUncleMerkleProof(uint256,uint40)","9979b7aa":"CETACEA(address)","9979c009":"buyItem(uint256,uint256)","9979ef45":"placeBid(uint256)","997a0229":"_newPrice(uint256)","997a12fa":"attowethBalance()","997a2c1c":"numberOfMyComponents()","997aa31f":"sellChannel(string,uint256)","997bc6c9":"int2str(int256)","997c44e4":"setLockRate(uint256)","997c88ba":"calculateCurrentDistanceInRange(address)","997ce600":"endauction(uint256)","997cf69c":"dataset_sha256checksum()","997d2df8":"asserti(bool)","997d8473":"reserveBalanceMap(address)","997dd1c6":"dealHitCard()","997e02d9":"wormholeIsOpen()","997f0198":"setImageHeight(uint256,uint16)","997f35ac":"RewardOffer(address,address,bytes32,uint256,uint256,uint128)","997f50d8":"getCurrentTierHardcap()","997f51e6":"GAMToken()","997fdb1f":"setLockTime(address,uint256,uint256)","997ffd13":"quarterFourth()","99801bce":"dagheAcqua(uint256)","99808aff":"winningTicket(address)","9980dee2":"calculateHash(address,address,uint256,uint256,uint256)","9980ec86":"getAmount(uint256)","99817b47":"releaseVestedTokensForBeneficiary(address)","9981bd61":"requestTokenExchangeMax()","99820e96":"finishSunning()","9982257b":"hotQuestion(uint256,uint256,uint256)","998282e9":"winners(uint32,uint32[],uint64[])","9982e7ed":"updateBillionsCoinsRemainingToDrop()","998446a8":"acceptRequest(uint256,bytes)","99847f77":"addUnsoldTokens()","9984f30d":"setMaxValue(uint256)","99851eac":"updateCards(uint8,uint256[])","9986d936":"setRestrictedPercent(uint256)","9987680b":"play(address,bytes32)","99878d5b":"play_scissors()","99879bb9":"startTimeInSec()","9987b2d2":"getProposalIndex(address,uint256,bytes32)","99882cdb":"propose(bytes32)","9988807d":"centsReceived(address)","9989a5ae":"setLimitOfParticipants(uint256)","998a1f96":"preICORaised()","998ac104":"AIRDROP_TRANSIT_ADDRESS()","998b022e":"_mintPrimordialToken(address,uint256)","998b723b":"waterTree(uint256)","998b894a":"isLegalTime()","998bac16":"bulkTransfer(address[],address,uint256[])","998be0d7":"sendTokenToSingleAccount(address,uint256)","998c4f5a":"setEthExchangeWallet(address)","998cab7e":"getTransformTarget_pool(address)","998eb4cf":"getRank03()","998f9203":"INCash()","9990b3a3":"getPreSaleWallet()","9990db92":"CryptoSureToken()","999122f4":"BHK()","999377ec":"acceptBlokTokenOwnership()","9993fa94":"balanceOfSender()","9994e112":"AddContact(address,bytes32,bytes32,bytes32,bytes32,bytes32)","9995bbf7":"ethforp3dbuy()","99967819":"lastaction()","99999342":"GetBonusInv()","9999aae5":"EYTToken()","9999bd2e":"RATE_PRESALE()","999a9965":"setMany(uint256,int256,uint256,bytes,address,bytes)","999b078e":"isSoftCapHit()","999b5c72":"FASET(uint256,string,uint8,string)","999cbaf5":"Deposit(address,uint256,uint8,uint256)","999cef04":"PublishWorldCupResults(bytes32,bytes32,bytes32,bytes12)","999d350d":"totalBonusGiven()","999d3947":"getGenes(uint40)","999d46b9":"transferInterviewer(address)","999dd03e":"poolAddressCapTier2()","999eb6b1":"balanceOfThis()","999f18a6":"unsigned()","999f4b38":"sellDividendPercent()","999f5644":"Stoppable()","99a032ce":"isCurrentAccountReader(address,address)","99a03c70":"realBalanceOf(address)","99a17344":"setHiddenLogic(address)","99a1a412":"getModeratorCount()","99a2e1ec":"roundLatLngFull(uint8,int256)","99a3e03f":"testNegativeIntegerKeyValue()","99a3f0e8":"right70(uint256)","99a44e68":"BEXP()","99a48638":"packSettings(uint256)","99a48e17":"FinalizableToken(string,string,uint8,uint256,address,uint256,address[],uint256[])","99a5d747":"calculateFee(uint256)","99a6993b":"KCCTOKEN()","99a6f7d2":"createReserveTokens()","99a752d7":"setPriceETH(uint256)","99a79790":"startTimeSale2()","99a7b857":"FundsWithdrawal(address,uint256)","99a7b884":"getBuyerFullInfo(address)","99a7e9db":"get_presale_iconiq_arbits_per_ether()","99a856e3":"firstBonusRate()","99a88ec4":"upgrade(address,address)","99a8f2fe":"EncryptedToken()","99a9a04c":"BITStationERC20()","99a9ccb2":"preMinedSupply()","99aa5d97":"Pixel()","99aa93c8":"numSales()","99aba8e3":"distribute(address,uint256,uint256,uint256)","99abaabb":"addMarketToWasCalled()","99abd788":"FIRSTSALE_TOKENCAP()","99ac4569":"withdraw(uint64,address[],uint256)","99ad91c7":"AddAdmin(address,address)","99ae6a16":"Winner(address,uint32,uint32,uint256)","99aeade3":"iterateTable(uint256,uint256)","99aef94a":"getMyEntitySimple(uint256)","99af4114":"createPet(uint256,uint16,address)","99afb9b9":"createValidatedRequest(address[4],address,uint256[12],uint256,bytes)","99b0dc4d":"areAllUppercase(bytes16)","99b1adbf":"isUserMember(address)","99b22701":"delBackend(address)","99b29044":"getPropertyEarnUntil(uint16)","99b2a233":"offlineGuardianSold(uint256,address,uint256)","99b465cb":"currentSegment()","99b47af8":"reveal_test_data_groups_block_size()","99b4a0c6":"BTRL()","99b55343":"termsNumber()","99b58f06":"icoPushAddr(uint256,address)","99b5b2fa":"horseIndexPrice(uint256)","99b632e4":"winnovate()","99b6f5a1":"sendAdvisorsTokens()","99b721a5":"rewardEthAnd(address[])","99b77032":"setMinBuyLimit(uint256)","99b83f3d":"setMaxRedemption(uint256)","99b8a3f0":"charityBalance()","99b8e366":"reloadPlayerInfo(address)","99bac5c9":"setMinCustomerBalanceETH(uint256)","99bad2cd":"testAddExistingVoter()","99bb8134":"approveMany(address,uint256[])","99bb875c":"funeralAndBirth(bytes,int256,bytes)","99bc0aea":"expiryTime()","99bc826e":"intMemoryArray()","99bcb1a1":"thirdWeekMainICOBonusEstimate()","99bdc9c2":"AdminAddition(address)","99bea0bd":"AllForOne()","99c0058c":"getAttackPlayerList()","99c20c34":"percentToFoundersAfterICO()","99c24d85":"SetCurrentRoomAndRound(address,uint8,uint256,bool)","99c27d40":"updateGlobalMin(uint256)","99c2af56":"setRateEarlyStage2(uint256)","99c2b93b":"startCrowdsalePhase1Date()","99c2bb40":"listAssetDocumentsFrom(bytes32,bytes32,uint256,bool)","99c32025":"TwoPhaseTransfers(address[],address[])","99c4644a":"putIdentityProvider(address,string)","99c49852":"cancelOrder(address)","99c59bdc":"MadeBet(uint256,uint8,address)","99c69d40":"getPremiumsAvailable()","99c6d2de":"depositToken(address,uint256,uint256)","99c6da4a":"UTWD()","99c724ef":"skipInLine(uint256,uint256)","99c75517":"GetCompetitionInfo(uint32)","99c8055d":"Enable()","99c8268b":"totalBattle()","99c87629":"getFibonziPlayers()","99c8d556":"tax()","99c8fcba":"agreeBetWinner(uint256,uint8)","99cac223":"getBallotIndex(address,bytes32)","99caf208":"updatePendingManager(address,uint256)","99cb0823":"presaleBonus()","99cbc1b9":"Bet(address,bytes32,bytes32,uint256,uint8,uint16,uint16,uint16,uint8,uint256,uint8,address)","99cc00d1":"getImageHeight(uint256)","99ccbec6":"claimByTeam()","99ccf3da":"_increaseToken(address,uint256)","99ccfd34":"forkUpgrade(address,address)","99cd211d":"bountyTokensWallet()","99cd40aa":"_setBytes(bytes32,bytes)","99cdee0e":"own()","99ce00a9":"VREO_SALE_OPENING_TIME()","99ce12c1":"getAssetClaimString(uint256)","99ce919c":"goods(bytes32)","99ceb6e6":"BTCReceived()","99ceed71":"OwnerTokensBurned(uint256,uint256)","99cf5582":"burnVotes()","99cfe1e1":"issueCofoundersTokensIfPossible()","99cfe743":"TotalGenesisAddresses()","99cffe4d":"LinearBeam()","99d0f06c":"removeNotes(uint256[],uint256[],uint256)","99d136f5":"multiSend(address[])","99d18937":"getAllDSP()","99d1c413":"isEggFactory()","99d1d002":"debug_blockHeaderMerkle(bytes)","99d1e755":"getTeamWallets()","99d22e48":"founderAllocated()","99d3acd3":"EtherDeltaDepositToken(address,uint256)","99d413f4":"createDividendPercent()","99d4aec9":"getPurchaseRequests()","99d50d5d":"getComponents()","99d52baf":"test_startBool()","99d5af62":"unLockBatchAddr()","99d64ab0":"maximumFunding()","99d67084":"numberOfInvestorsToWithdraw()","99d786ca":"lastMonth()","99d792a2":"releasePrivateSupplyVested()","99d7dd25":"isEcoAllocated9()","99d80ed9":"addService(bytes32,uint256)","99d83b77":"BuyRC(address,bytes,uint256,uint256,uint256)","99d897f8":"sellForOtherCoins(address,address,uint256)","99d9b306":"trancheMinTx()","99d9d1e0":"KNB()","99db626c":"LOG_SpinExecuted(bytes32,address,uint256,uint256)","99db7eb7":"TapPoll(uint256,address,address,uint256,uint256,uint256)","99dbff01":"buyCourse(uint256,uint256)","99dc79d1":"getBracketScore(bytes8)","99dd1ed9":"estLiquidationCap()","99ddb29b":"addressType(address)","99de4fc5":"UNK()","99def960":"getcredibilityScore(bytes12,bytes12)","99df3d7a":"setFunctionAuthorized(address,string,bytes32)","99dfa711":"GetCurrentTypeStartTime(uint256)","99dfedb4":"getTeamSumSkills(uint256)","99e0021f":"mergencyCall()","99e0dd7c":"setTokenURIPrefix(string)","99e133f9":"init(address,address,address,address,address,address)","99e1cc47":"calculateAndSendRefund(address,uint256,uint256,uint256)","99e1d127":"filterWarriorAuras(uint256,uint256)","99e2ab0e":"UpdateMinFee(uint256)","99e3a723":"verifyOwner(bytes32,address,uint8,bytes32,bytes32)","99e47b2d":"DinoFarm()","99e487a9":"F2UPhone()","99e71b64":"secondBalance(address)","99e74ce8":"tokenIdToHeroInstance(uint256)","99e7c00a":"yaaay()","99e7cedf":"cobeneficiary()","99e8f303":"getM5Reward(address)","99e91527":"dequeueAuditRequest(uint256)","99e9376c":"buyWithCustomerId(uint128)","99ea0fd5":"disputeAllReporters()","99eb6603":"initalize(uint256)","99eb975c":"TransID()","99ec140d":"Tokensale()","99eca69f":"withdraw(uint256,address[])","99ecba80":"maxMinutesProposalPeriod()","99ed7b87":"getStrengthValue(uint256)","99ee9076":"defendFee()","99ef111c":"stopAddresses(address)","99eff1f7":"nextElectionIndex()","99f02ab5":"getWinnerContractAddress(uint256)","99f02b60":"IHFVesting(address,uint256)","99f07bed":"_clearCommittedValidators(uint256)","99f16c6e":"validateContribution(uint256)","99f1718a":"getSiteItem(uint256,uint256)","99f3379f":"getSolverAddress(bytes32,string)","99f3487b":"testBoolKeyValue()","99f49f0d":"vitPerWei()","99f4b251":"mine()","99f5c357":"modultradeStorage()","99f5c904":"momentValueOf(uint256,uint256)","99f6021d":"durationSec(bytes32)","99f65122":"getParam(uint256)","99f6a693":"setMasterName(uint256,string)","99f6d9af":"getTotalNumberOfRegisteredCompanies()","99f91c5d":"updateAllRewPaid()","99f9be87":"TEX()","99fa6ed7":"EthPledge()","99fb15d2":"distributionActive()","99fbe995":"Wallet(address[],uint256)","99fbf3a2":"setRentPrice(uint256,uint256)","99fca937":"amountOfEthersOwnerCanWithdraw()","99fd12f6":"etc()","99fd9489":"endCrowdsale(bool)","99fdc17e":"redenominatedValue(uint256)","99fe18b9":"fightBoss()","99fe6c88":"CashTCoin()","9a003b61":"checkRequiredChange(uint256,uint256)","9a008d7b":"startPaymentProcess(address)","9a01b4d5":"getChannel(address)","9a02d3ac":"unapproveWithdrawal(bytes32,bytes32,uint256)","9a02edfe":"maxTokensPerAccount()","9a033782":"addContractToTokenFallbackWhiteList(address,address)","9a037aa0":"setReferralBonus(uint256)","9a03d9a3":"setERC721Address(address)","9a03fe1d":"Div(uint256,uint256)","9a0475e9":"ASHLEY_ADDRESS()","9a04a4ed":"setOpenInterestInAttoEth(uint256)","9a04ab73":"safeAddI(int256,int256)","9a04b89e":"setGiftoAddress(address)","9a04e602":"mintBounty(address,string)","9a04f704":"guest()","9a04fc8b":"getNodeParent(bytes32)","9a05cd66":"_setNarcosCoreAddress(address,address)","9a065a60":"discountTokenAmount()","9a06671e":"CoinsRetrieved(address,uint256)","9a06b113":"createPool()","9a06c2d3":"getRnMmasterReq()","9a073742":"setFeesWithdrawalAddress(address)","9a0750d5":"tokenFundDeposit()","9a0846f1":"MyKidsEducationFund()","9a08623a":"withdrawFromToken()","9a0907c2":"contributeAndVest()","9a09a8ef":"getCoinByCount(uint64)","9a0af2ec":"getStLength()","9a0b2db3":"withdrawFeeEntitlement()","9a0ca07d":"changeLocked(bool)","9a0d4f40":"PRESALE_PERIOD()","9a0d6247":"withdraw(uint8,bytes32,bytes32,uint256,uint256)","9a0e4ebb":"multiMint(uint256[])","9a0e7d66":"getTotalVotes()","9a0e7e8e":"secondSaleDelivery(address,uint256)","9a0e9e50":"newPoll(uint256,uint256,uint256)","9a0f1561":"prizeDeposit()","9a10f719":"setFreezeAddress(address,bool)","9a10f819":"buyOracle(bytes,address)","9a114fb0":"_Challenge(bytes32,uint256,uint256,string)","9a116ca1":"implementationCall()","9a1295d9":"getPassportLogic(string)","9a14228e":"getEntryPrice()","9a158883":"BOBOToken()","9a15f4f3":"getBlockHeader(int256,int256)","9a160ad9":"MeissaToken()","9a163c44":"currentVotingAmount()","9a165f6c":"currentCapTokens()","9a166299":"getMyAddress()","9a167613":"forceConsume(uint256)","9a16a7e3":"getAccountInputSdcslength()","9a18a5ba":"NEXPARA(uint256,string,string)","9a19a953":"setInt8(int8)","9a1a661e":"entranceFeePool()","9a1ac4b2":"OpenAddressLottery()","9a1b420b":"OraclizeAddrResolver()","9a1ca8d2":"SALE_ETHER_MIN_CONTRIB()","9a1e7ea0":"randomSatoShiTime()","9a1e9dc3":"Buy(bytes32,address,uint256,uint256,address,address)","9a1f6a0f":"setPacksPerClaim(uint16)","9a1fd3d5":"armyPlanesCount(uint256)","9a1fdc10":"createHorseShoe10(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","9a1ff4f4":"Ruthenium()","9a202d47":"removeAdmin()","9a206ece":"isSpender(address)","9a20821b":"claim_winnings(address)","9a21213e":"_getProviderOwner(uint256)","9a2160a7":"currentBetNumber()","9a221876":"project_contract()","9a22dec5":"buyAllAmountPayEth(address,address,uint256,address)","9a234885":"storeUserDataHash(uint256,bytes32)","9a2392b2":"getFirstBuyNum(bytes32,bytes32)","9a23ab61":"XXXXXXXX06(address,address,uint256)","9a2457c1":"getMiningAttempt(uint256,address)","9a251185":"isValidCertificate(bytes32,bytes32,bytes32)","9a267230":"END_TS()","9a276186":"getLentTime(uint256)","9a27b7ed":"setBounty(address,uint256)","9a2828f3":"setTechnicalWallet(address)","9a285ffb":"myDividendsYes()","9a28910a":"PrivateSaleBuy()","9a29ccf7":"_determinePid(address)","9a2a1f75":"CrowdsaleLeviusDAO(address,address)","9a2a224a":"setWallet(address,address,address,address,address)","9a2b4bdf":"ChangeTotalSupply(uint256,uint256)","9a2d2692":"withdrawToPoolOwnerFee(uint256)","9a2dcadf":"fundoShares(uint256)","9a2e27f8":"presaleEndDate()","9a2e6b40":"vote(uint80,bool)","9a2f9e92":"keeCrytoken()","9a2fb8c1":"startTimePrivatePreICO()","9a307391":"operator(address)","9a314b8e":"Group(string)","9a317cca":"getHWCAddressByIndex(uint256)","9a31a5f0":"transferManual(address,uint256)","9a31ac53":"setLastRegistration(string,int256,uint256)","9a31b14e":"set_totalSupply(uint256)","9a323ac4":"MAXfinney()","9a3241a6":"AddParticipant(address,uint256)","9a325e52":"exchangeRateRoundTwo()","9a336fed":"removeTotalCoinLock()","9a33aff9":"startDocumentPoll(bytes32)","9a33c610":"addPA(string,string,string,address,address,uint32,uint32,address,address,uint32,string)","9a33e300":"projectName()","9a344170":"test_insert_full()","9a347dd9":"tokensToFunder()","9a35f886":"__dig_then_proxy(uint256)","9a36f932":"feeDivisor()","9a37d1b7":"distributeEbyteForETH(address[],uint256,uint256,uint256)","9a38330d":"setIssuer(address,address)","9a388bd2":"CORAddress()","9a38ac79":"requireAuthorisation(bool)","9a38aeb1":"verifySignature(address,uint256,bytes32)","9a38bfae":"voteHash(address)","9a3a8c85":"ExiliumToken()","9a3aed36":"setMainAdmin(address)","9a3c4158":"setEthWallet(address)","9a3ce541":"price(bytes12)","9a3d1f3f":"twentyThirtyVault()","9a3ea7cc":"provas(bytes32)","9a3fc66d":"iouTokens()","9a3fd1fb":"tokenFallBack(address,uint256,bytes)","9a3fdfd0":"bountyTokensPercent()","9a406338":"VESTING_DATE()","9a40a316":"betting(uint256,uint8,uint256)","9a40d8f5":"equal(address[],address[],string)","9a41c1e6":"walletToVault(address,uint256)","9a429d2f":"setDisclaimer(string)","9a42adb3":"change_ico_start(uint256)","9a42af48":"getLastPrice(bytes32,uint8)","9a42c935":"forLottesy()","9a42f3aa":"reveal(uint256,uint8,bytes32)","9a4363cb":"setlockall(bool)","9a436c9b":"burnBasisPoints()","9a4373a6":"_internalTransfer(address,address,uint256)","9a437da2":"lookupPriorLottery(uint256)","9a438c5f":"ChangeInsuranceFeesOperationEvent(uint80,uint80,uint80,uint80,uint256,uint80,uint80,uint256,uint256)","9a43e59a":"VAA()","9a4435c6":"BitcoinGame()","9a443955":"setNumVotesRequired(uint256)","9a44690e":"finalizeSettingUpdate(uint256)","9a454b99":"deployedAtBlock()","9a459f75":"setShortDescription(string)","9a45a263":"decentBetMultisig()","9a45e3fe":"getChannelExist(bytes32)","9a465b85":"lastBlock_a10()","9a46793e":"roundsManager()","9a471416":"bountyFunds(address[],uint256[])","9a47700f":"checkExpires(bytes32)","9a4772cd":"LogClaim(address,uint256,uint256)","9a478b49":"join(uint256,bytes32)","9a47cee3":"convertGene(uint8[48])","9a48007d":"hasHourlyRateWithinRange(address,address,uint256[],uint256[])","9a483a8e":"exerciseExpiredEmployeeOptions(address,bool)","9a48eb3e":"tokenTransferProxyContract()","9a49eab5":"MINER_CREATION_LIMIT()","9a4a0fb2":"centralBank()","9a4ac102":"tinyIPFShash(string)","9a4b19e4":"SiaCashCoin()","9a4b1d5c":"verifyTransfer(address,address,uint256)","9a4b87f1":"setDrop(bool)","9a4b8fc9":"lockInSemiFinalPrize()","9a4bca21":"setMintTap(uint256,int256)","9a4ca3cb":"itemsOfOwner(address)","9a4cbb92":"getDamage(uint256,uint256,uint256)","9a4cd266":"test_fourValidEqBool()","9a4d19f8":"getAmountAccredited(address)","9a4dfa87":"OfferCanceled(uint256,address)","9a4e36d9":"antiques(bytes32)","9a4e9bff":"FXPay()","9a4ed149":"getBlocksquareFee()","9a4f1e2c":"ETCrossPotatoPresale(uint256,uint256)","9a4f78cc":"decreaseShares(uint256,address)","9a4fd88d":"crowdsaleSucceeded()","9a4fdf66":"nextBro()","9a507d9b":"feeHoldingAddress()","9a508c8e":"finalizeUpgrade()","9a5199fc":"goodbye(uint256)","9a51a31a":"ToToken()","9a526b97":"setPreIco(address)","9a52b339":"checkInterest()","9a54596b":"Token(uint256,string,uint256,string,string,address)","9a5483e6":"addRole(uint256,address,uint256)","9a556a59":"getCooldown(uint256,uint16,uint8)","9a56193b":"getNumberOfDerivatives()","9a565169":"ETHERGOLD()","9a5666b8":"SVLightBallotBox(bytes32,uint64[2],bool[2])","9a571d9f":"isAlphaLower(bytes1)","9a573786":"getKeysManager()","9a581271":"cursedContract()","9a586d26":"MAX_SALE_VOLUME()","9a58c33d":"batchAssetTransfer(address,uint256[])","9a592415":"LostPayment(address,uint256)","9a593b9a":"startCrowdfund()","9a599e37":"burnfromAdmin(address,uint256)","9a5a2d4e":"lastTimePriceSet()","9a5a6483":"milliTokensSent()","9a5c0abc":"sellCards(uint256,uint256)","9a5dd735":"getRichest()","9a5e095c":"_buyTokensInCurrentStage(address,uint256,uint256)","9a5eb28f":"BUYER_CAP_LOW_USD()","9a5f17ee":"ccEndTime()","9a5f54b3":"getTetherInts(address,uint256)","9a6203e9":"getClosingObligation(bytes32)","9a628121":"random256()","9a62b752":"becomeTurtlemaster()","9a63157a":"addressBankPartners()","9a64a276":"findById(uint256)","9a650fd8":"isTerminated(address)","9a651f0b":"firstStageRefund()","9a6524f1":"TOKEN_CAP()","9a65ddec":"getAddressByName(string)","9a65ea26":"startMinting()","9a661e66":"getGratitudesSizeOf(address)","9a670bbc":"secondPreSaleEndDate()","9a68323c":"getRoundDetails()","9a684658":"_getBlockIndex(uint256,uint256)","9a6921e4":"getOpGas()","9a6a30a4":"reclaimEther(address)","9a6a68e9":"numberWinner()","9a6b32e1":"claim_reward(uint256,bytes32)","9a6b607f":"distributeTokensToMembers()","9a6bd379":"powerUp(uint256)","9a6ced6d":"bountyAgents(address)","9a6d3aaa":"bet(uint256,bool)","9a6d7cb8":"_canMateViaMarketplace(uint40,uint40)","9a6d9671":"combineMyGirls(uint256,uint256)","9a6dac14":"getLOTBalance(address,address)","9a6dfeff":"totalVotesForParty(uint256)","9a6e9914":"deleteArrayString(bytes32,uint256)","9a6ec511":"_buildId(address,uint256,bool)","9a6edad1":"Jupiter()","9a6f978d":"DIP()","9a6fb6df":"productionUnitTokenContractCount()","9a6fcbdd":"popElement()","9a6fe50c":"getLatestForContractAddress(address)","9a701075":"WITHDRAWAL_END()","9a702ad5":"AVAILABLE_JOINTTOKENS()","9a70855e":"exchangeFlag()","9a70eb1a":"onSaleAmount()","9a713233":"pre_end()","9a71825e":"sellKnowledge()","9a721302":"SUPPLY_FOR_BOOUNTY()","9a722769":"autoFinishTime()","9a727526":"getManagementInfo()","9a729d03":"token_bid(address,uint256)","9a72afb6":"setIsDisputeActive(bool)","9a730617":"init(address,uint256,uint256,uint256,uint256)","9a7394f5":"setData_34(string)","9a74adda":"moveAccountIn(address)","9a74c10c":"getDefaultReportingGasPrice()","9a751072":"applyChangeWalletAddress(address,address)","9a75aa06":"emitPublicCapabilityAdded(address,bytes4)","9a7614ee":"acceptEther(uint8)","9a7615a2":"burnOwner(uint256)","9a772bce":"TokenCappedCrowdsale(uint256,uint256,uint256)","9a7754d6":"StagedCrowdsale(uint256)","9a777d5d":"buyCoins()","9a7853cd":"postTX(address,string,uint256,uint256,uint256)","9a78afc6":"reduceDiv_()","9a78c066":"checkExistsInArray(address)","9a78c562":"setSellingTime(uint256,uint256)","9a797128":"withdrawed()","9a79f4a8":"testFailHeaderInsufficientFee()","9a7a3293":"NoFakeCoin()","9a7a7c11":"makeRoll(uint256)","9a7b5b7b":"tryClose()","9a7baa81":"EcomethToken()","9a7be471":"updateMinDeposit(uint256)","9a7d5211":"TheDigitalStandard()","9a7db5d9":"adminSendWorldBalance()","9a7e00ef":"acceptBet(uint64)","9a7e9e1f":"executeByAction()","9a7ee18c":"AccountIsNotFrozen(address)","9a7efb7f":"giftFor(address,address,uint256)","9a8061e8":"setLicenceShopPrice(bytes2,uint256)","9a80e52f":"updateTknPrice(uint256)","9a819e5e":"forceLiquidation()","9a82031e":"getRoundWinnigNumbers(uint32)","9a824f00":"transferTobucketTwoContract(address)","9a828a71":"oracalizeReading(uint256,string)","9a82a09a":"cancelled()","9a82c93c":"PRESALE_ENDTIMESTAMP()","9a82f890":"isOracle()","9a8318f4":"total_withdraw()","9a8335e0":"sendTo(string)","9a841413":"deleteDeployer(uint256)","9a84792b":"onReturned(address,uint256,uint256)","9a84d0c4":"addToken(address,string,string,string,uint8,bytes32,bytes32)","9a862c2d":"stage2StartTime()","9a863892":"NewProposal(uint256)","9a86acda":"getHeld(uint256)","9a86cd04":"shittyRand(uint256)","9a87ebb5":"changeAllowances(uint256,uint256)","9a880629":"dStartsNow()","9a880848":"attackhill(uint256)","9a881ab4":"payToFines(uint256)","9a882b7a":"createtoken(string,string,string,string,string)","9a891058":"keyIndex(bytes32)","9a89ad65":"within6Confirms(int256,int256)","9a8ae2fa":"changeLastFreeBlock(uint256)","9a8b3d8f":"getClientProjects(address)","9a8ca12c":"icoEnds()","9a8cea55":"testPush()","9a8cea82":"calculateDevFee(uint256)","9a8d10a3":"addData(uint256,bytes32)","9a8d36fa":"_openGameRange(uint256,uint256)","9a8d86c5":"CrowdSale_Finalize()","9a8e7b02":"ProposalClosed(uint256,uint8,uint256,uint256,bool,uint256,uint256)","9a8f09bd":"newKing(address)","9a8f139d":"getPercent1(address)","9a8f4dbf":"CancelSellOrder(uint32)","9a8f71f7":"saveData(bytes32,uint256)","9a8f72d1":"pruebacn123()","9a900e8c":"changeDepositWalletAddress(address)","9a903ca7":"allocateTokens(address,uint256,uint256,uint256)","9a9249a8":"_calculateCurrentPrice(uint256,uint256,uint256,uint256)","9a92b7e7":"EthVenturesFinal()","9a93e940":"testFailCreateNewRevisionNotUpdatable()","9a94ab9c":"addDelegate(address,string,address,uint256)","9a953408":"CHLORINETOKEN()","9a954af9":"getFreeToken()","9a956915":"icoInvestors(address)","9a95ca48":"presaleCapReached()","9a95d0e4":"DEEO()","9a960778":"SBK()","9a961416":"gameNext()","9a967e3b":"nextMember()","9a969768":"distributeProfits(uint256)","9a96f829":"devs()","9a97043b":"depositIdx(address)","9a98aa1e":"Scorpio(uint256,string,string)","9a98ac88":"GCSToken()","9a999359":"priceUpdatedTime()","9a99ebf4":"drainGame(bytes32,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","9a99f7e0":"isModOrCreator()","9a9a5cdb":"checkEthBalance(address)","9a9b1709":"PGGamePlatform()","9a9b5323":"AlforroCoin()","9a9bc131":"aidrop(address[])","9a9c29f6":"settle(uint256,uint256)","9a9c437d":"CryptFillToken()","9a9c9c53":"DepositToBankAccount()","9a9d0935":"totalBountySupply()","9a9d6515":"APPC()","9a9e3fd8":"successful()","9a9ed624":"ProfitLoaded(address,uint256)","9a9f1304":"drawMini()","9aa035dd":"dev_multisig()","9aa03cc6":"calculateExchangeFee(uint256)","9aa07ed7":"DietEthereum()","9aa0a50e":"btcDeposits(bytes32)","9aa0ff7b":"SALE_END()","9aa1001b":"withdrawRewardPool(address,uint256)","9aa10ebf":"Story()","9aa13f04":"contractStart()","9aa1dab7":"removeOversight(address)","9aa26f06":"registerBytes32(address,bytes)","9aa287d9":"setIco1Tokens(uint256)","9aa3a443":"acceptContribution(address)","9aa4a64e":"set_patient(uint256,uint256,string,string)","9aa57922":"Bhtd()","9aa5ee73":"finalizeConfirmationPeriod()","9aa5f467":"phase_3_token_price()","9aa615ee":"initCrowdsale(uint256,uint256,uint256)","9aa72320":"EthereumCare(uint256,string,uint8,string)","9aa727f6":"mult(uint256,uint256)","9aa72b71":"shareAmount(address,uint256,uint256,uint256)","9aa74525":"increaseWithoutCounterparty(bytes32,uint256)","9aa84b0b":"blockNode(address)","9aa92f0c":"previousRounds(uint256)","9aa93224":"sendOre(address,uint256)","9aa99dc8":"ownerPauseJackpot(bool)","9aa9f27b":"privateSell2Address()","9aaa38a6":"ChangeComission(uint256)","9aaa3eec":"updateNickname(address,string)","9aaa4696":"transferRaw(address,uint256)","9aaa5750":"addGoldTransaction(string,int256)","9aaa6b4d":"getAttackAddress()","9aaac864":"isInitialBlockTimestampSet()","9aab0c7a":"BitUPToken()","9aac9e91":"EndPreSale()","9aacb10a":"setNewCreator(address,uint256)","9aacb18c":"getSolution(uint256,uint256)","9aae3d0e":"maxWeiTier1()","9aaf442c":"applyCensorship(uint256)","9aaf5e05":"allocateTokensBeforeOffering(address,uint256)","9aaf9f08":"getVersion(bytes32)","9aafbff0":"addEntryIn24WeekPeriods(address,uint256,bool,uint256)","9ab060de":"milestoneBonus()","9ab06fcb":"setPayment(address)","9ab102ac":"isAffiliated(address)","9ab1416c":"accept_B_coupons(address,uint256)","9ab1b484":"distributeTokens()","9ab1d468":"privateSaleTransfer(address[],uint256[])","9ab253cc":"transferToICAPWithReference(string,uint256,string)","9ab2cf0d":"checkLockedBalance(address,uint256)","9ab3161d":"AnimalFactory(address,address)","9ab361a2":"unlockTimeLine()","9ab3a1fd":"setMvpExists(bool)","9ab3bfd7":"Tier_Basic_Registration()","9ab42287":"getAllAnimalsByAddress(address)","9ab422f3":"register(string,uint256,uint256,uint256,uint256,address[])","9ab448d9":"updateForkValues()","9ab4833e":"viewToken()","9ab4b22f":"releasedBalance()","9ab4d3a8":"checkInvestorReturns(address)","9ab567ba":"batchTransferForSingleValue(address[],uint256)","9ab79905":"withDiscount(uint256,uint256)","9ab7d0b7":"setTheName(string)","9ab7f298":"add_user(bytes32,bytes32,int256)","9ab80f14":"BuyPrice()","9ab86b78":"getVoteHubDetails()","9ab90ba0":"realityID()","9ab95202":"babzBalanceOf(address)","9ab9ee73":"prPool()","9abb08ed":"migrateStateFromHost()","9abb2c16":"getAuctionsCountForUser(address)","9abb9e78":"powerDayEthPerPerson()","9abc03d2":"auctionsStartTime()","9abd3572":"claimDividend(uint256)","9abd7d50":"SelfDestructTime()","9abe275f":"closeChannel(address,bytes32,uint256,bytes32,bytes)","9abe3906":"closePreICO()","9abec159":"DISCOUNT_STAGE_THREE()","9abeddf8":"getLastUnionId(bytes32,uint8)","9abfba20":"DeleteBillModerator(address)","9ac08dfd":"receiveApproval(address,uint256,address,bytes1)","9ac17057":"execute(uint128,uint128)","9ac18b19":"REQUIRED_SIGNATURES()","9ac1f9a1":"add_commitment(uint256)","9ac22e5b":"test_oneTrueAndFalseAssert()","9ac233f3":"Monarchy()","9ac2ba20":"start_all()","9ac3317b":"grantMultiplePermissions(address,bytes32[])","9ac3fce6":"getBankReg(address)","9ac467f9":"getAllSigners(uint256)","9ac4fa49":"isAirdropStopped()","9ac50a62":"tenmatest()","9ac58d58":"get_len()","9ac785ba":"LockDate(uint256,uint256)","9ac8cd1b":"calcJackpotFee(uint256)","9ac97e84":"getNumDIDHolders()","9ac9940f":"assetOwner()","9aca6e2e":"calculate_total_shares(uint256,uint256)","9acab88c":"forwardFunds(uint256,address,address)","9acade7e":"testFailTransferDisableNotEnabled()","9acae9fc":"createChannel(bytes32,uint256,uint256)","9acb1506":"_createMeme(string,uint256,address)","9acb1ad4":"right37(uint256)","9acb3824":"getHorsesInStud()","9acba2af":"durationSeconds()","9acbdcab":"updateNoteButContent(uint64,uint16,bytes12)","9acd07b5":"closeChannel(uint8,uint256,bytes32[4])","9acd5e0e":"getGuestNotes(address,address)","9acdc0e3":"setCommunityTokensHolder(address)","9acf603b":"token_wallet_address()","9acf6ff4":"distributeRemaining()","9acfb1a8":"getCCH_edit_25()","9ad0a5ac":"addWhitelisted(address[],uint8[],uint256[])","9ad0c86c":"IouRootsToken(uint256,address,string,string,uint8)","9ad10d79":"PELOMemberIDMap(uint32)","9ad1b348":"getKNCRateRange()","9ad1c999":"setdevFeeAddress(address)","9ad25a68":"COSMOTokenERC20(uint256,string,string)","9ad26744":"removeAuthorizedAddressAtIndex(address,uint256)","9ad4eccf":"sentTokensToFounder()","9ad4f658":"CATToken(address,address,address,uint256,uint256)","9ad4f98e":"BlocksureInfo()","9ad55220":"getPrivate()","9ad5be7b":"setPlayValue(uint256)","9ad73f20":"runPluginSigned(address,uint40,uint40,uint128,uint256,uint8,bytes32,bytes32)","9ad74f81":"setAllowTransferGlobal(bool)","9ad7ebc3":"specialPoolsRate()","9ad89ac4":"settleCancel(bytes32[8],bytes)","9ad8b5b7":"addAttachmentToCollectible(uint256,uint256)","9ad900d6":"get_first_asset_document(bytes32)","9ada7a4c":"NumberTaken(uint256)","9adba14b":"logStr(string)","9adc15ef":"ShaBi()","9adcb5eb":"acceptBet(uint256,uint8)","9add2ad9":"MIN_ETH_TRANS()","9ade76f4":"VestingCreated(address,uint256,uint256)","9aded5dc":"deathData_a6()","9ae000c6":"WeedToken()","9ae0140c":"removeRoleCapability(uint8,address,bytes4)","9ae06672":"getDailyTimeLeft()","9ae066b0":"foundationDeposit()","9ae082a4":"PooShitToken()","9ae120dd":"closeZoneTeller(bytes2)","9ae13375":"groupDates(uint256)","9ae1a635":"Q500()","9ae1c4f8":"mintToken(uint256,int256)","9ae21121":"lastowner()","9ae2835c":"balanceOfIssuer(address)","9ae38844":"newMembers()","9ae466bf":"recipientETH()","9ae4e388":"ChangeClientTokenAccount(address,bool)","9ae51a1f":"getTeamlistSupportInTournament(uint256)","9ae568b1":"CreateSEEDS(address,uint256)","9ae5dc91":"setNTToken(address)","9ae6303d":"getHatchDurationByTimes()","9ae6309a":"currentMintableTokens()","9ae65eea":"addProposal(string,string,string,address)","9ae6892b":"transferOwnershipToken(address)","9ae6b186":"bZxTo0xV2Contract()","9ae6cac7":"SemainToken()","9ae6ef15":"getCumulativeIncome()","9ae7a909":"multiPartyTransfer(address[],uint256)","9ae8886a":"p()","9ae8ac3c":"TRADING_STARTED()","9ae8b6a1":"WMCToken()","9ae980a8":"setMinWager(uint256)","9ae9d383":"getnotice()","9ae9ff6a":"withdrawBeforeVoting(uint256)","9aea020b":"sellDeadline2()","9aea5485":"revealMove(uint256,uint8,uint8,string)","9aeb14a5":"sumHardCapPreICO()","9aeb5947":"payToCharm(string,uint256)","9aeb69a2":"withrawWin(address,uint256)","9aebdf7e":"updateJackpotLeft(uint256)","9aece83e":"set_manager(address)","9aecea62":"finalizeIPO()","9aeceb1d":"transferBallance()","9aecfb8a":"Etharea()","9aed58c6":"_destroyRobot(uint256)","9aed6ac9":"registerPresaleContributor(address,uint256)","9aedabca":"valueOfShares()","9aedb1f1":"setVotingQuestions(string,string)","9aee046b":"callOracle(uint256,uint256)","9aeea806":"MARKET_CHANGE(address)","9aef0c6c":"privateSaleClosingTime()","9aef319f":"closeBlacklistSwitch()","9aef8999":"removeWhiteList(bytes32)","9aefff29":"totalSupplyPreSale()","9af003bd":"ChangeConversionRate(uint256,uint256)","9af041aa":"currentSaleStage()","9af1d35a":"fees()","9af1ef32":"offerHelp(address,address)","9af22f9c":"Shiner()","9af25d07":"releasedRoundCount()","9af26b78":"finishMinting(bool)","9af28b65":"NEXT_POT_FRAC_TOP()","9af2b100":"Permissions()","9af2cad2":"CryptoCoin()","9af32035":"addIcoPurchaseInfo(uint256,uint256)","9af3352d":"updateGuReferral(uint256,uint256,uint256)","9af3b527":"getOwnerOfCardsCheapestWager(address,address)","9af4afb3":"BlueOs()","9af4b5c8":"isOwedFreeReferralPack(address)","9af55773":"minSumICOStage6USD()","9af605cb":"__proxy(address,bytes,uint256)","9af6489d":"CheckTree(address)","9af64d80":"previousstageplayer1()","9af6549a":"beneficiaryWithdraw()","9af75b29":"tokensMintedForOperations()","9af88ebd":"_createOpinionSet()","9af8c4ba":"respond(uint256,address,bytes)","9af8f5de":"totalEDUSLeft()","9af917f4":"addRentable(bytes32,uint256,uint256,uint256,uint256)","9af95a4b":"dateBonus(uint256)","9af9f012":"wavesAgent()","9afa3dc7":"ADVISOR_STAKE_THREE()","9afb24ab":"setCLIForGas(uint256)","9afb93cb":"buyTicket(uint256,string)","9afbe49a":"tokenAmountOfPeriod(uint256,address)","9afcfba3":"getBurnRequestStatus(uint256)","9afd46a3":"closeTurnByHand(uint32)","9afd8b1d":"LiteBoxToken(address,string,string,uint256,uint256)","9afd9d78":"rollback()","9afe340f":"OasisToken()","9afebd18":"contract_finish()","9afec0ae":"ESOPLegalWrapperIPFSHash()","9aff301f":"FightClockAuction(address,uint256)","9affa42d":"increaseApprovalBatch(address[],uint256[])","9b013aee":"getBidPrice(uint256)","9b01c7ac":"getFishIdByAddress(address)","9b02e258":"changelp12(address)","9b03a211":"transferPresaleTokens(address,uint256)","9b04564a":"proposeTeamWithdrawal(address)","9b046ed3":"getCharacterTraits(uint256)","9b05535f":"checkpointBlock()","9b059309":"GoshenCoinCash()","9b05934c":"calculateSecretHash(uint256,bool,bytes32)","9b0646f6":"wadmin_setContrAddr(address,address)","9b06e9f5":"seTJackpotPersent(uint256)","9b087b2d":"totalTransferred()","9b08a22f":"allowTransfer()","9b08ace1":"bonusSecondWeekPeriod()","9b092f73":"safemul(uint256,uint256)","9b09768a":"maximumPoolPurchase()","9b09dfbd":"addArrayItem(address,string,string,address)","9b0a4764":"AkirasToken()","9b0a541e":"LogAllowedToAddress(address,bool)","9b0a5e67":"buy(string,uint256,uint256)","9b0aac15":"maxTokenSupplyPublicSale()","9b0ac9b0":"refundTime()","9b0b5bb2":"MIN_BANKROLL()","9b0b9c07":"acceptBankDraft()","9b0c1e51":"BONUS_MAX_DURATION()","9b0d1b2c":"getSpawningFor(address)","9b0ec5ae":"newSeed()","9b0ee7b7":"updateAirdropEndTime(uint256)","9b0f2510":"placeLong(address[2],uint256[8],uint8,bytes32[2])","9b0facaa":"existIdBeforeVersion(bytes32)","9b10394c":"IsOnSale(uint32)","9b10e9f7":"rawDetailsOf(bytes32,bytes32)","9b110f4b":"GayPersonalAdsToken(uint256,string,uint8,string)","9b11503e":"PUBLIC_SALE_START()","9b121e7c":"wethWithdraw(uint256)","9b12664f":"referralMinimum()","9b129181":"LTE()","9b12a4a1":"setCanDisburseMultipleTimes(bool)","9b132392":"createTrainer(string,uint16)","9b139504":"addPlayer(string,address,uint256,uint256)","9b13d209":"buyGuardianRune(uint256,uint256,uint256,uint256)","9b15ef2e":"END_PRESALE_TIMESTAMP()","9b16250a":"finishSign(uint256)","9b164ce3":"TestApprove()","9b173d57":"withdrawPolicy(uint256,uint256,uint256,address)","9b17b2dc":"checkWeather()","9b181e39":"_isAccepted(address,address)","9b18d79a":"one_ether_usd_price()","9b19251a":"whitelist(address)","9b19a92b":"year1LockAddress()","9b1a78c0":"ClaimGMT(address,uint256)","9b1a9b23":"destinationAddress80()","9b1ad792":"destroyToken(address,uint256)","9b1b0ab3":"buyingEscrowAddress()","9b1b615e":"pool(uint256,uint256)","9b1b8f62":"_gapOfSquareSum(uint256,uint256)","9b1bb323":"initContract(address,address,address)","9b1cbccc":"finishDistribution()","9b1cdad4":"postBounty(uint128,uint256,string,uint256,uint256,uint256[8])","9b1d767f":"fstTotalSupply()","9b1d8032":"clz32(uint32)","9b1d834c":"genPot_()","9b1dd3e5":"pullRipCord()","9b1e3825":"approveFundTransferToSupplier(address)","9b1f46cd":"allMilk()","9b1f70d1":"BET_RELEASE_DATE()","9b1f9e74":"_burn(uint256)","9b1fe0d4":"isApprovedInvestor(address)","9b21003b":"notPauseable()","9b2112c7":"ShopDexToken()","9b217f90":"getVestingTime(address,uint256)","9b21929a":"TOTAL_SUPPLY_BOTTOM_BOUND()","9b227a97":"ETH_TLD_LABEL()","9b22c05d":"test(int256)","9b234a9e":"tokensByWavesTx(string)","9b248798":"_InsufficientFunds(address,uint256,uint256)","9b24b3b0":"getRoot(uint256)","9b250f76":"clientInit()","9b252b7e":"t3Token()","9b256f46":"changeRoundBlock()","9b25e6f1":"ReservedTokensDistributed(address,uint8,uint256)","9b263eca":"providerContract()","9b267540":"unblockTokens(address,uint256)","9b26bae3":"AliciaToken(string,string,uint8,uint256)","9b276964":"STARTING_BAT()","9b27bf3a":"setWhiteListStatus(bool)","9b2843e2":"randomDNA(uint256)","9b285582":"ChangeIp(bytes32,bytes32)","9b28db50":"getWalletId(address,bytes32)","9b28f644":"setupFunctionalAddresses(address,address)","9b28f75a":"reclaimBalanceTokens()","9b29a295":"Payable(address,uint256)","9b29cb23":"getDailyPayment()","9b29f133":"userCancelActiveGame(uint256)","9b2a9d19":"origDev()","9b2aab1d":"frozenAccountOf(address)","9b2b0031":"updateDescriptiveInformation(address,string,string,string,string)","9b2b89d4":"UCAL(uint256,string,uint8,string)","9b2bdc20":"claimAllowanceOwnership()","9b2cb5d8":"minAmount()","9b2d2cbd":"orePrice()","9b2e5d32":"claimItems(uint256,uint256)","9b2ea4bd":"setAddress(string,address)","9b30a187":"nextWave()","9b30c7db":"changePortalAddress(address)","9b311b17":"averageMinerSalePrice()","9b322b7e":"HuandeToken(uint256,string,uint8,string)","9b3235bf":"getAbel()","9b33093f":"createNew(address,address,uint256)","9b332a91":"payDate()","9b33d7b3":"createAuction(uint256,uint256,uint256,uint256,bool)","9b33f055":"cancelSubscriptionOffer(uint256)","9b343342":"getRandomPrice(uint256)","9b343525":"highestContribution()","9b343e35":"createChildContract(string,uint256,uint256)","9b347f42":"teamVesting2Years()","9b34ae03":"winningOutcome()","9b350e12":"isEscaping(uint32)","9b351087":"cancelTreeSell(uint256)","9b3544f6":"postAssertion(uint128,uint256,uint256,uint256)","9b35928f":"RXBbitToken()","9b35b35a":"lockTs()","9b36057c":"registerGame(address)","9b3662bf":"currentParticipants()","9b367370":"confirmBlackFlag(uint256,bool)","9b36c3bc":"setMaxTotalAmount(uint256)","9b3725e8":"stageGenomes(uint8)","9b39caef":"COIN_PER_ETHER()","9b39f377":"getAnimalByIdVisibility(uint256)","9b39f9bf":"remainingTokensForSale()","9b3a300b":"SNK(uint256,string,string)","9b3a36c0":"calculateTokensWithBonus(uint256)","9b3b24ba":"VESTING_AMOUNT()","9b3ba79f":"maxAllocation()","9b3bc6fb":"checkERC20Balance(address)","9b3cbdf6":"CrowdSale(address)","9b3d17b1":"tokenSPUsdCentPrice()","9b3dfce0":"isPoDStarted()","9b3e28cc":"TokenReceivingEchoDemo(address)","9b3e9a48":"changeFreezeTime(uint256,bool)","9b3ee16e":"initialize(address,address,uint256,uint256,address,address,address,address)","9b3fd75d":"beginGame(uint256,address,address)","9b3fdf4c":"EVMSCRIPT_REGISTRY_APP()","9b409510":"creditAdvertiser(address)","9b41a9c5":"SedoPoWToken()","9b41b00b":"Sorus()","9b426e62":"assignTester(address)","9b44cb3c":"lastTrade()","9b46301e":"playersPerRound()","9b46461e":"getAnimalIdAgainstAddress(address)","9b46a71c":"setContractCap(uint256)","9b4778e4":"get_arbits_sale_open()","9b480435":"setPublicPlacementNum(uint256)","9b487f3f":"_forwardTransferFromToICAPWithReference(address,bytes32,uint256,string,address)","9b49413c":"GetItemInfo(uint256)","9b4a6bdb":"test_spamVoting()","9b4a7fe9":"setCCH_edit_17(string)","9b4b2d77":"processOffchainTokenPurchase(address,uint256)","9b4b973d":"acceptSettlement(uint256,uint256)","9b4bb9f0":"schedulePriceUpdatesFixed(uint256[])","9b4c1290":"_getFishPrice(uint16,uint16,uint8,address)","9b4c1902":"getGovtApplicationByIndex(string,uint256)","9b4c7b70":"redemptionFundTotal()","9b4d54fc":"startCrowdsale2(address)","9b4d9ecc":"setGrowCost(uint256)","9b4e533e":"isLastWithdraw(address)","9b4f19c6":"getMonths()","9b4f1ecb":"initialCost()","9b504387":"controllerTransfer(address,address,uint256)","9b51e35a":"getSchemePermissions(address,address)","9b52cacc":"ListingCreated(bytes5,uint256,uint256,uint256,address)","9b539a17":"setEncryptKey(string)","9b53a396":"calcKicks(uint256)","9b53d87c":"isManagerEnabled(address)","9b550e55":"nextMineId()","9b563fa3":"save(uint256,string,string)","9b566564":"withdrawAirdrop(uint256,bytes)","9b56730d":"compoundInterest(uint256,uint256,uint256,uint256)","9b5696b0":"notCollectedAmountAfter24Hours()","9b56d6c9":"getCollateral(address)","9b5719a6":"setSalesContract(address)","9b58316a":"EBANKTOKEN()","9b58b463":"retire(address,address)","9b58e46b":"createProduct(string,bool,uint256)","9b5906e5":"getLifeCoin()","9b598caf":"pastProposalTimeRules()","9b59ffd7":"verifyGame(bool)","9b5a2e13":"setBadgeGiver(address)","9b5a66e6":"insertInPlace(uint8[],uint8)","9b5adea2":"setMinter()","9b5b094f":"ANMOToken()","9b5b4019":"EtherWild()","9b5b969f":"transferSub(address,uint256)","9b5c0b5e":"burnPerweiYearly()","9b5cc9f4":"transferOwner1(address)","9b5cfcdd":"account1Address()","9b5d2e78":"TPI()","9b5d7d0b":"addBalanceReplenishment(uint256,uint256,uint16,bytes32,uint256)","9b5d8e63":"Multiplexor()","9b5e5d8c":"newCustomFutureLottery(uint256,uint256,uint256,address,uint256)","9b5f8abb":"getAllSponsors()","9b5fde7d":"payOut(uint256,string)","9b601c4d":"getQueryPrice(string)","9b60a443":"payto1()","9b612a1b":"freezeStaking(address)","9b619d3b":"_deleteAllPackedRevisionBlockNumbers(bytes32)","9b61cf09":"MOBILITYCREDIT()","9b624e7b":"setRound(uint256)","9b632829":"refundAll(address)","9b6349a8":"TokenDCCB(uint256,string,string)","9b63d0f4":"core(bool)","9b63eb4b":"getTicketsByGameIndex(uint256)","9b666d7a":"cos(int256)","9b6687ac":"getNumPositionProduct(bytes32,uint8,string)","9b671604":"proposeVoter(bytes32)","9b678bfc":"calcRates()","9b67bfa3":"fiatValue(uint256)","9b6806c9":"getCompanyShareholders(uint256)","9b68c992":"SubmitSecretBet(bytes32)","9b69608f":"read_dgx_inventory_balance_ng()","9b69de79":"transferLockAmount(address,uint256)","9b6a2b2f":"spriteOwningHistory(address,uint256)","9b6a6709":"presaleMint(address,uint256)","9b6aa1fa":"TransferData(address,address,uint256,bytes)","9b6b838c":"reinvestment_share()","9b6c5283":"createPool(string,uint256,uint256)","9b6c56ec":"debt(address)","9b6d86d6":"adminSetRegistrationDisabled(bool)","9b6d96c5":"create(int256,int256,int256)","9b6dbc8a":"closeShop()","9b6e407d":"setPercentUnfrozenAfterBuyPerPeriod(uint256)","9b6ec1cb":"HerbsChainToken()","9b7143eb":"creditsClawbacked()","9b71a7c9":"addAddressToRole(address,string)","9b71dec3":"getVineyardCount(string,address)","9b727e80":"CNiteToken()","9b73a5d9":"hasTwoYearWithdraw()","9b743cbd":"allocated18Months()","9b7502c3":"getLastAuditExtradata(address)","9b769ce3":"JsCoin()","9b76a25c":"transferFee(address,address,address,uint256)","9b76c1de":"team3LockEndTime()","9b76fbd6":"_recordPlatformFee(uint256)","9b771346":"ImportTestB()","9b772524":"partner1_signed()","9b7750f1":"addBranchInEpisode(uint256,uint256)","9b77c21a":"getClaimStatus()","9b77d69f":"addTagByModuleType(uint8,bytes32[])","9b7812ff":"add_quote(bytes32,bytes32,uint256,uint256)","9b782070":"TSSECOND()","9b786d68":"profitSharing(address,string)","9b788752":"trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,bool)","9b78cf9c":"medalFreeze(address,uint256,uint256)","9b7c08b8":"ERCToken(uint256)","9b7c288f":"lastDeploy(address)","9b7c5517":"committ_payment(uint256,uint256)","9b7d83e7":"porcoToken()","9b7defe3":"returnTokensFromHoldAdvisorsAddress(uint256)","9b7e5531":"ownershipDeadline()","9b7edbdb":"buyLimit(uint256)","9b7eeb12":"setScrapMinEndPrice(uint256)","9b7ef38c":"BatchUtils()","9b7f1687":"iUventaCoin()","9b7faaf0":"lockOver()","9b80c9e8":"payMoneytoOwner()","9b815057":"changeMakerDAO(address)","9b818ace":"SLChainToken(uint256,string,uint8,string)","9b819d38":"getNowTime()","9b81c8d3":"updateMeterValue(uint256)","9b82171f":"houseTotal()","9b828609":"reclaimContributionWithInterest(address)","9b82abdb":"LogBought(address,uint256,uint256,uint128)","9b831dcb":"RateUpdate(uint256)","9b8342d4":"getPlayerDividendByRound(address,uint256,uint256)","9b836d1a":"_payout(address,uint256)","9b8430eb":"distributeRevenue(uint256,uint8,uint8)","9b850322":"escrowDecision(uint256,uint256)","9b855a85":"releaseEQUITokens(bytes32,uint8,bytes32,bytes32)","9b85b9c9":"createDrug(bytes32,uint256)","9b85bc85":"CocacolaToken()","9b865999":"InitialOwnerAddress()","9b86975d":"ANemoiSaleContract()","9b880fee":"registerVestingSchedule(address,uint256,uint256,uint256,uint256)","9b8831df":"hasArtist(bytes32)","9b8906ae":"saleEnded()","9b894703":"maxTickets()","9b8a74f0":"cancelOffer(address)","9b8abe0b":"thousandtimes()","9b8b03a2":"strongHands(address)","9b8b365d":"deathData_a5()","9b8b6037":"findModuleVersionByAddress(address)","9b8b7160":"setPreFundingtokens(uint256)","9b8d1dd4":"CARDANOCLASSIC()","9b8d3064":"setFinance(address)","9b8d34d9":"addAgreement(bytes32,uint256,address[])","9b8da66c":"getEthFundDeposit()","9b8eb288":"setPercentWeiDividend(uint256)","9b8eb7b4":"getSocialAccountByIndex(uint256)","9b8f2493":"updateBurnBal(uint256)","9b8f5acf":"CyberChainToken()","9b8f5d4a":"setTilePosition(uint16,uint8,uint8)","9b8f7113":"dateSoftCapWasReached()","9b8fdf1b":"cancelExpectedPayment(bytes8)","9b901d00":"_createTeamSale(uint256[9],uint256,uint256,uint256,address)","9b9073e4":"allocationPool()","9b9111ee":"commonConfigure(address,address)","9b914973":"prebuyPortionTotal()","9b91f9be":"Gol()","9b922d97":"setCoinsaleactive(bool)","9b9279ec":"StartRefound(bool)","9b92adf3":"EnableTokenMinting(bool)","9b93aaf4":"addNewLoggerPermission(address,address)","9b945097":"getRandom(address,uint256,uint64)","9b9692f6":"TokensDistribution(address,uint256)","9b96c4ba":"AdvisorPart()","9b96eece":"getBalanceOf(address)","9b973803":"transfer10(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","9b97cee5":"getWorkCount()","9b985b30":"bountyMaxTokens()","9b986550":"getAllForPubKey(bytes32)","9b98a94b":"getLockTokens(address)","9b991d9b":"votingInfoTeam()","9b9958af":"getAllCardsClaimed()","9b99a8e2":"reserveTokenCount()","9b9a09a6":"HackContract()","9b9a236b":"SuperToken()","9b9a47e3":"getlastDividendPoints(address)","9b9b0b87":"mainICOFourthWeekEndTime()","9b9ba572":"oraclize_query(string,string[3])","9b9be9cb":"mainSale_TokesSold()","9b9bedf8":"getContractCreated()","9b9cc2ca":"getPrivateSaleAgentAddresses()","9b9ce1bc":"sendTokensBulk(address[],uint256[],uint256[])","9b9d0364":"_setFeeStructure(uint256,uint256,uint256)","9b9d2cc8":"RESERVED_TOKENS_ADVISORS()","9b9e07e1":"TeamtokenRelease3()","9ba11c0a":"coinunits()","9ba1a7d8":"preValidation()","9ba30c3b":"Healthcoin()","9ba319bf":"detangleQuanticCloudIOTData()","9ba33ab3":"refundLeftOverWei(uint256,uint256)","9ba3c2e0":"advisersAddr()","9ba3d8cf":"updatePromoFishCommission(uint256)","9ba4d4ee":"investedETH()","9ba4dbc2":"USDBTC(uint256)","9ba4eb5f":"SPINFundDeposit()","9ba58333":"AspirationCoin()","9ba5b4e9":"getEventHashes(bytes32[])","9ba65fff":"addNewcard(uint256)","9ba73d43":"deregisterCustomer(address,address)","9ba89492":"getNumAccounts()","9ba896cc":"refundTokensSale(address[])","9ba8975f":"changeFundsKeeper(address)","9ba8e37d":"withdrawFromToken(address,uint256)","9baa504e":"unrestrictedMint(address,uint256,uint128)","9bab0da3":"EVACASH()","9bab3988":"DongriToken(uint256)","9babdad6":"removeShareholder(address)","9bac6e8d":"currentMinter()","9bac8602":"testFailAddBalanceAboveOverflow()","9bacc97c":"specialAddress(address)","9bacf1ed":"createSynthesizingAuction(uint256,uint256)","9baddd98":"sendBountySupplyToken(address,uint256)","9bae56da":"getEstimatedRound(uint256)","9baeac78":"TOKEN_SUPPLY_PRESALE_LIMIT()","9baf7ffb":"etherToSendBankroll()","9bafd01a":"freeStorage(address)","9bafd22b":"DocumentCertoChainContract()","9bb00ae3":"ledgerCount()","9bb01b5f":"ElcoinDb(address)","9bb04895":"nominalValue()","9bb0e4df":"getUint(int256,bytes32,string)","9bb0f599":"hasToken(address)","9bb186d2":"MatchingMarket(uint64)","9bb192fd":"getVotes(uint32)","9bb1dbea":"commonWithdraw(uint256)","9bb1fd66":"force_stop()","9bb2ea5a":"setMaxValidators(uint256)","9bb32be3":"challengeFinality(uint256)","9bb3bcaa":"setArrIntField1(int256[])","9bb5239a":"CheckPrize(address,uint256)","9bb5c96c":"isContributorsRewarded()","9bb5ce30":"participationFee()","9bb5d450":"getMonsterCount()","9bb5f901":"UCToken()","9bb603bb":"create(string,string,uint8,string,bool)","9bb639a8":"changeTokenCostInEth(uint256)","9bb6831f":"millCap()","9bb74bbd":"tokensSoldToInvestors()","9bb848e7":"isRunningIco(uint256)","9bb84cd0":"addSellTokensRequest(address,string,uint256,uint256)","9bb8b563":"POKCC()","9bb8ec22":"SmartAdvancedCoin(uint256,string,string)","9bb8fde4":"startTimeStage1()","9bb90467":"initTokenAndBrackets()","9bbba3a8":"getTokensOnSale(address)","9bbc156b":"AllLock()","9bbc574a":"closeUser(address)","9bbdb25a":"getPartners(address,uint256)","9bbeafc1":"setMarketFees(bytes32,uint16,uint16,uint16,uint16,bool)","9bbedbbc":"deliver(address,address,uint256)","9bbfa582":"Lambotoken()","9bc0fd25":"setBlocklancerContractHolder(address)","9bc13360":"standardrate()","9bc2bc71":"createEvent(string)","9bc30adb":"upgradeBalance(address,uint256)","9bc3135b":"buyoutDividendPercentage()","9bc33b8a":"MediatedTransactions_TransactionHeight()","9bc52a39":"logClassic(string,uint8)","9bc53cec":"Moontrail()","9bc5689d":"NUM_OF_CHOICES()","9bc61d06":"MeetupContract(string,string,uint256,uint256,uint256)","9bc64cc8":"saiTap()","9bc6b571":"ChangeExtension(uint256,bool)","9bc6d815":"BestCountTokens(uint256)","9bc6f0ec":"createChildDeposits(uint256)","9bc706e8":"publishedCountOf(address)","9bc72d5f":"worstCaseRateFactorInBps()","9bc742fe":"setStepOneLockEndTime(uint256)","9bc85302":"burnUserTokens(address)","9bc896f9":"orderCancel(uint256)","9bc8e9ee":"setMintingDec(uint256)","9bca3596":"Ubecoin()","9bca8a1e":"setTableTypesSize(uint256)","9bcb8dff":"BallzToken()","9bcc2b27":"ctrlZee()","9bcc9123":"rejectNegotiation(address)","9bccfe49":"actionsCount()","9bcdd9e8":"forgetCube(address)","9bce51e3":"sendCrowdsaleTokens(address,address,uint256)","9bcef169":"getLeaderboard(string)","9bcf497b":"setUserPaybackPool(address)","9bcf7352":"setEnableInternalLock(bool)","9bcf8ca2":"addresses(uint256,uint256,uint256)","9bcf9ea2":"PIVOT()","9bcfcee8":"minting(address,address,address,address)","9bd03774":"TokenContractImpl(uint256,uint8,address,address)","9bd0a967":"isEndsWithHpb(string)","9bd1ff8b":"tokenFallback(address,address,uint256,bytes,string,uint256)","9bd26234":"contrubutedAmount(address)","9bd2af03":"trent()","9bd2d912":"ZipflaxToken()","9bd33457":"totalOnDeposit()","9bd3651b":"Authenticate(uint256,address,uint256)","9bd41f7c":"createToken(bytes32,string,string,string,string,string)","9bd4d455":"addMember(string,address,string,uint256,uint256)","9bd4e13e":"bettor_reward(address)","9bd4e925":"CROWDSALE_ETH_IN_WEI_FUND_MIN()","9bd5679e":"getCurrentICOExpirationTime()","9bd6030c":"nbagame()","9bd658d9":"whoOwnsYou()","9bd69528":"addToKyc(address)","9bd695b0":"hasRequiredSignaturesToValidate()","9bd6a4de":"initPublicityAddr()","9bd702e4":"sellCrab(uint256,uint256)","9bd7d688":"checkAncestors(uint32,address,uint64,uint64,uint64)","9bd80dcf":"calculateMasked(uint256,uint256)","9bd8e081":"gunsFundDeposit()","9bd90aae":"maxTokensToCreate()","9bd99195":"multiAccessChangeOwner(address,address)","9bd9bbc6":"send(address,uint256,bytes)","9bda8678":"externalDeposit(address,uint256)","9bdbb4c7":"market_WithdrawBid(uint256)","9bdc6523":"setUserWhiteListContract(address,bool)","9bdce046":"DICE_HIGHER()","9bdd070d":"withdrawTokenToDefault(address,address,uint256,uint256,uint256,address)","9bdd7cdb":"forceRelease(bytes32)","9bde88f0":"getcan(address)","9bdf5a7c":"Zenix()","9bdf6f62":"soldTokenCount()","9bdff8eb":"oracleB()","9be07908":"left79(uint256)","9be08a4e":"NCPPrivate()","9be0f105":"OxChainNetwork()","9be0fc75":"toggleDrop()","9be1eab7":"setContractStakeToken(address,address)","9be1fcee":"BankOwner_DisableConnectBankAccountToNewOwnerAddress()","9be2385a":"depositOldTokens(address,uint256,address)","9be2faed":"isSchemeRegistered(address,address)","9be2ff64":"setAllowPlayer(bool)","9be3b286":"endOffering()","9be4d15e":"split(bytes32,uint8,uint256)","9be50784":"drawBenz()","9be56c67":"support(uint256,uint256)","9be572f6":"getTotalUsers()","9be5ad78":"_saleState()","9be5b3b1":"MetadollarOption()","9be6178e":"acceptBet(bytes16,bytes16,bytes16,bool)","9be6d404":"destructSelf(address)","9be7f1dd":"buyerfee()","9be88a01":"_rotateLeft(bytes32)","9be8a212":"FoundersFund()","9be95517":"_createRandomMonster(uint32)","9bea62ad":"restore(uint256)","9beaa524":"getActivityName(uint256,uint256)","9bead36f":"resolveEntityAddressAndOwner(address)","9beb6c6b":"_saleFinalized()","9bed31e4":"setParameters(uint32,uint256,address)","9bedb2c7":"MyReferrals()","9bee3365":"sayYes()","9bee757b":"requestExecution(bytes,uint256)","9beebe20":"setTrustedTransfer(bool)","9beef73f":"stageDistributed()","9bef0c47":"getUserPictureByWallet(address)","9befa8b4":"DisqusBot()","9befd45a":"payFee(bytes32)","9bf0093c":"LIV()","9bf037e5":"BaseCrowdsale(address,address,address,uint256,uint256,uint256,uint256)","9bf070b5":"ethRaisedWithoutCompany()","9bf08a06":"joinArena()","9bf1c389":"stage_1_add()","9bf1f148":"requestAudit(address,bytes32,uint256)","9bf22189":"Validated(string)","9bf2926d":"Proposal(address,uint256,string)","9bf2ab46":"preSalesEndDate()","9bf30bac":"handleIncomingPayment(address,uint256)","9bf34e30":"ecrecover3(bytes32,uint8,bytes32,bytes32)","9bf39dce":"contributionTime()","9bf4c5c5":"destroyedNinjas()","9bf677e4":"phase_1_rate()","9bf68006":"testControlSetNotTransferableNotOwner()","9bf6b0a8":"withdrawForFiveStep()","9bf6deaf":"ChangeEmissionRateCoefficient(uint8)","9bf6eb60":"mintTokensExternal(address,uint256)","9bf74ae0":"periodICOStage1()","9bf7ef63":"verifyMultiSig(address,bytes32,bytes,uint256,uint256)","9bf865d0":"numberToAddress(uint256,address)","9bf8df7d":"recoverLost(address,address)","9bf97bd9":"get_deployed_forwarders()","9bf97e74":"BNN()","9bf9cd26":"PreSaleSold()","9bfa1f33":"ORDER_FILL(address,address,address,bool,uint256,uint256,uint256)","9bfa835b":"privateMin()","9bfa882e":"updateAddress(address,address)","9bfaa24b":"startTradable(bool)","9bfafdc2":"ERC223Transfer(address,address,uint256,bytes)","9bfb9717":"additional_incentive()","9bfb9752":"setTime1(address,uint256)","9bfba3c6":"ico2cap()","9bfc80fc":"TopSciFiVoter()","9bfd8d61":"totalStaked(address)","9bfdce3e":"deal(address,uint8)","9bfdd1bb":"setSchema(string,bytes32,string,uint256,uint256,uint256,uint256)","9bfdf68d":"requestLoans(uint256[],bytes32[])","9bfe171a":"STASToken()","9bfe7bd5":"getNumOrdersByOwner()","9bfeda53":"_getRewardTokenAmount()","9bff209d":"softSub(uint256,uint256)","9bff662c":"notify_payment_acceptance_request(uint256)","9c001bcc":"TOKEN_SHARE_OF_BOUNTY()","9c0051db":"setProfitTransferTimeSpan(uint256)","9c007973":"resolveDispute(bytes16,address,address,uint256,uint256,uint8)","9c01e1f5":"addNFToken(address,uint256)","9c01fdaa":"PimmelToken()","9c03b04f":"testItStoresAValue()","9c03f17f":"sencToken()","9c03facb":"sold(uint256)","9c041ebd":"create(address,address,address)","9c043783":"eachUnfreezeValue()","9c049dd0":"hydroStakingMinimum()","9c04e4e7":"pre_sale_end()","9c04ece9":"lastBlock_f7()","9c05093b":"setTeamTokensWallet(address)","9c05ba60":"getIndexName(bytes32)","9c066eab":"seeRaised()","9c0770fe":"ZIL()","9c07b2cd":"resetTotalSales()","9c080f5d":"showBalance(address)","9c08606c":"lockedDays()","9c08d549":"startICO(uint256,uint256)","9c0953cf":"setProducer(address,address,bool)","9c09a64c":"claimSMR()","9c09b32c":"ProcessTransaction(uint256)","9c09bb4e":"getBestMatch()","9c09c3bb":"attestForIdentity(address)","9c09c7c6":"addGuessWithRefund(int256)","9c09c835":"enableWhitelist(address[])","9c09f869":"PixelSelling()","9c0a4bbc":"AlwaysFail()","9c0b7c08":"terminateFunding()","9c0baa2d":"_getRate(uint256)","9c0bd57c":"withdrawDragons()","9c0c2238":"withDrawEther()","9c0cc30c":"getAllArtworks()","9c0d010e":"_checkOpenGame()","9c0df4f2":"blessings()","9c0e3f7a":"write(uint256,uint256)","9c0e7d66":"leftoverTokensBuffer()","9c0ee65b":"Hold(address,uint256,address,address,address)","9c0f16ed":"tokensOfTeamAndAdvisors()","9c0fc1e4":"AIC()","9c117f0f":"get1(uint256)","9c118238":"withdrawBalanceFromServer(address,uint256,bytes)","9c1193ea":"GreeterA(bytes)","9c121aff":"LogClaim(bytes32,address,uint256)","9c121b6d":"meltHorseShoe(uint256,address)","9c1230c1":"amount_stages()","9c128493":"Lol1CoinCoin()","9c12ca21":"setGroupBounty(address[],uint256)","9c12deab":"isVendor(address,address)","9c135572":"documentsIds()","9c147688":"bulkMint(uint32[],address[],uint256[])","9c14c77b":"getBuyTime(uint256)","9c14e25b":"DonQuixoteToken(address)","9c1500f0":"registerMany(address,uint256,int256,uint256,bytes,address,bytes)","9c15b047":"getInitialOwners()","9c15b04b":"showDividendsAvailable()","9c15be0b":"left65(uint256)","9c161d1a":"setNextImagePart(address[16],uint256,uint16,uint16,uint16,uint256[])","9c16667c":"getAnswer()","9c166d31":"LukaToken()","9c172f87":"EthVentures4()","9c1747e5":"addRewardPercentage(uint256)","9c1817e4":"Saddle_Limit()","9c19aa9f":"setOrderSupportCancel(uint256)","9c19f170":"TotalRaised(uint256)","9c1a056f":"visitLength()","9c1a32fe":"setTake(uint256)","9c1b9408":"preMultisigEther()","9c1b987c":"setComment(uint256,bytes3,string)","9c1b9c1b":"assignTokens(address,uint256,uint256,uint256,uint256)","9c1cb7cf":"PaymentStatusBlockNum(address)","9c1d8fa2":"GPN(uint256,string,string,address)","9c1d9790":"sendBatchCS(address[],uint256[])","9c1e03a0":"crowdsale()","9c1f020a":"sendCrowdsaleTokens(address,uint256)","9c1f332f":"returnLastBuyerIndex()","9c1f6133":"registerVIP()","9c1fcc4c":"logicAddress()","9c2062ad":"RISK()","9c2108eb":"transferGoldFromHotWallet(address,uint256,string)","9c211755":"RequstOwnership()","9c225b33":"teamAndAdvisorsAllocations(address)","9c2412a2":"monarchyStartReward()","9c24654c":"presalestartTime()","9c24ea40":"setLinkToken(address)","9c24eedb":"upvote(uint256,int256)","9c24fc55":"presaleBalances(address)","9c250dd8":"etherTransfer(address,uint256)","9c253011":"print(int256,address)","9c255312":"addressETHDeposit()","9c25d975":"packLocation(uint64,uint64,uint64)","9c2625fd":"TEAM_TOKENS0()","9c269c34":"TBL4Token()","9c27a6f4":"buyTicket(uint8,uint16[],address)","9c27ea08":"setNextLotteryTTMTokenId5(uint64)","9c27ff9b":"calculateFEE2Distribute()","9c286837":"devCut()","9c293792":"release_all(address)","9c2a7b89":"setTokenInfoHeritor(address,address,uint256)","9c2b1a95":"getManagementFee()","9c2c1b2b":"addDelegateSigned(address,uint8,bytes32,bytes32,bytes32,address,uint256)","9c2cdd5a":"MULTISIG_TKN()","9c2e29c6":"LocalLambosEscrows()","9c2ea2ec":"setEthExRate(uint256)","9c2f0067":"EPIToken(address,uint256)","9c2f4092":"DEVP()","9c2f5f8f":"closeCurrentGame(uint256)","9c2f7a43":"getCrystal(uint256)","9c2f88fa":"CoinBundleToken()","9c2fa55d":"buyFirst()","9c30936f":"removeCertificationDocumentFromSelf(bytes32)","9c31200b":"oraclize_query(uint256,string,bytes[1],uint256)","9c315684":"periodPreICOStage()","9c31c5ec":"setItemsContract(address)","9c323436":"getFixedEndTime(uint256)","9c33b66e":"checkAvailableTokens(address,uint256)","9c34a15f":"c(uint256,uint256)","9c34ae54":"setICODates(uint256,uint256,uint256,uint256,uint256,uint256)","9c351fec":"SNDToken(address,string,string,uint256,uint256)","9c36e141":"defaultTimeLock()","9c3723df":"windowBonusStep2()","9c38019b":"verifyProofOfMembershipInternal(uint256,bytes32[],bytes32,bytes32)","9c3807e6":"STARTING_STRIPPERS()","9c388d30":"LogAccountAmount(address,uint256)","9c392e5c":"VirginMToken()","9c39857b":"setTeamAdd(address)","9c3b936f":"killBalance(uint256)","9c3b9aa3":"MundoGamerToken(uint256,string,uint8,string)","9c3bcd65":"deliverPresaleFuelBalance(address,uint256)","9c3c7b2c":"transferredPresale()","9c3c97a1":"prohibitFreeze()","9c3db309":"getCurrentMiningDifficulty()","9c3e0f3f":"icoStarts()","9c3ed1ae":"unitsUserCanBuyLimit()","9c3f1e90":"orders(bytes32)","9c3f7ca2":"acceptOffer(uint256,uint256,bytes32)","9c3fe721":"finishedIssuerMinting()","9c402944":"sendAVR(address,uint256)","9c4063ce":"WALLET_T8EX_TEAM()","9c409e4d":"VoteOnTransfer(address)","9c40ea5c":"setGRForGas(uint256)","9c41adfd":"withdrawDepositById(uint256)","9c41e591":"XGoldToken()","9c4261b9":"VOLUME_EXTRA_BONUS_CONDITION()","9c43d950":"registration(uint256,uint256,uint256)","9c43eb54":"snapshotTimestamp()","9c44f090":"AlquilarBici()","9c45510d":"FootBallCoin()","9c472c70":"rateSecondWeek()","9c473bb2":"setTokenName(address,bytes32)","9c4780d8":"currentRoundNumber()","9c481c9e":"crowdsaleContractAddress()","9c489edb":"setNewExchangeAddress(address)","9c492b9e":"raisedFromFiat()","9c499b53":"getFeesAvailableForWithdraw()","9c4abe06":"getEthOfferPrice(uint256)","9c4ae2d0":"deploy(bytes,uint256)","9c4b653d":"sendFundsToMsgSender(uint256)","9c4b9c8a":"getFreezeTimestamp(address)","9c4baf27":"Skywalker(address,address)","9c4bcaa5":"setMinBuyPrivate()","9c4c557c":"startSale(bool)","9c4ca8cb":"IChain(address,uint256,uint256)","9c4de81f":"havven()","9c4e0f52":"setMaxTokenSellAmount(uint256)","9c4e3788":"earlyInitProjectSupply()","9c4eda5c":"balanceA()","9c4fc41a":"getWineCount()","9c4fc563":"_findParticipant(uint256)","9c50450f":"amountToCreate()","9c50e7ca":"tgeDateStart()","9c513bdd":"BwinCoin()","9c526380":"getUserTotalCredit(address,address)","9c52a7f1":"deny(address)","9c536640":"confSetupMixer(bytes32,uint256,uint256,uint256,uint256)","9c544e72":"removePending(address,uint256)","9c54b91f":"setApprovalCount(uint256)","9c54df64":"addAdmins(address[])","9c55519b":"optionsConversionDeadline()","9c561a42":"Wallet4()","9c566cad":"cards_start(uint256)","9c5686db":"isERC821()","9c579839":"QUOTE()","9c57d584":"verifyFingerprint(uint256,bytes,int256)","9c58b753":"getWriterId(bytes32)","9c58be11":"claimMyToken()","9c58c509":"buyIcoToken2(uint256)","9c591412":"lifeReserveWallet()","9c5b33ae":"wb()","9c5bbc89":"setApprovedAddress(address)","9c5c53b3":"lockBonusTokensClaim(uint256)","9c5d5e98":"JACKPOT_WINNER()","9c5d7030":"reimburseGas(uint256,address,uint256,uint256)","9c5d7291":"PhoneCoin()","9c5de58b":"startRC()","9c5e078f":"createBBODocument(bytes32)","9c5e108c":"_getFreezeTime(uint8)","9c5e9023":"confirmBeneficiary()","9c5fafa4":"balanceOfComisionHold(address)","9c6034a7":"sendIfNotForked()","9c60839e":"mintBonusTokensForGames(int256,uint256)","9c623683":"setWinner(uint256,address)","9c62622d":"IHate0xBTC(string)","9c632c77":"getServiceTokenAddress()","9c6393f2":"TokensWithdrawn(uint256)","9c639db4":"UltiCoin()","9c63dae5":"depositorCurrency(address)","9c644221":"PRICE_STAGE_ONE_BONUS()","9c66452e":"checkTime(bytes32,bytes32,uint256)","9c665819":"Talent()","9c66fe00":"priceOfLandmark(uint256)","9c6735c7":"ProfitRate()","9c675eaa":"ownerAddr()","9c67f06f":"registryStarted()","9c67f2fb":"returnEth4Sender(uint256)","9c681f86":"totalTokenTransfers()","9c6891c5":"set_bountyPercent(uint256)","9c68bd60":"payPledge(uint256)","9c695a7b":"_isInStage(uint256)","9c69763b":"setICOManager(address)","9c697750":"getRemainingLimit(address)","9c6a5bca":"RiptideCoin()","9c6a97ee":"deleteMyCat()","9c6c3439":"burnReputation(uint256)","9c6e199a":"sendTokensManually(address,address,uint256)","9c6e1d46":"emitJobCanceled(uint256)","9c6f87e9":"getPseudoRandomNumber()","9c700b70":"withdrawOwnerEth(uint256)","9c707dcf":"_mthToVouchers(uint256)","9c7081df":"prestige()","9c709343":"split(bool,address)","9c70b899":"KYC_ETH_LMT()","9c715535":"confirmPendingChange(address)","9c71d169":"OfferCancel(uint8)","9c71efef":"STARTING_CraigGrant()","9c71fda4":"WALLET_LB_RESERVED()","9c7264d7":"fillOrder(address,uint256)","9c73048b":"distributeCastleLoot()","9c732203":"DoDev(uint256)","9c737e8f":"fundPot()","9c7387c7":"finishContribution()","9c73ff7d":"DANK()","9c7409b0":"_getProtectionParams(uint256,uint256,uint256)","9c75089f":"Tresdk()","9c755f2f":"stuff()","9c756200":"ContractOwnerWithdraw(uint256)","9c756ec9":"PREICO_PERIOD()","9c76a6ac":"buybackPrice()","9c775e1f":"delegateApprove(address,uint256)","9c787ab2":"YUNXINToken(uint256,string,uint8,string)","9c7912ff":"setXzlkcjqowhoqhwoihsiaoquweizxoiuo(uint256)","9c792938":"estimate(uint256)","9c79af26":"issueExchangeRate(address,address,address,uint256,uint256,uint256)","9c7a39e6":"doCustomAirdrop2(address,address[],uint256[])","9c7ab767":"numSubscribers()","9c7b3c45":"TextToken()","9c7b3d79":"ARTISTCOIN()","9c7b7a2d":"SingleSourceIdentity()","9c7beb8a":"mintingAgents(address)","9c7c2498":"OnChainOrderBookV013b()","9c7c722b":"rename(string,string)","9c7dcdeb":"hostAccount()","9c7e6e6e":"checkRokBalance(address)","9c7e8a03":"addParticipant(address,address,uint256)","9c7eaac5":"makeTrade(address,address,uint256)","9c7ebb30":"SellTokens(uint256)","9c7ed6cb":"AgiCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256)","9c81806d":"WithdrawSpecialEth(uint256)","9c81a5f6":"getVestingsCount(address)","9c821ac4":"testFailsIfReturnLessThanMin()","9c82f2a4":"setSwapper(address)","9c830beb":"setStateHolding()","9c839bdd":"nextWithdrawDayCommunity()","9c83a1e3":"deleteDeposit(address)","9c83b0a1":"ValeoTestToken()","9c841c16":"checkCorrectRate(bool,uint8)","9c84d1f7":"News()","9c84eebe":"ERC20Token(uint256,address)","9c851ebc":"new_entry()","9c85a28a":"infoMessage()","9c8615ac":"is_entity(address)","9c865645":"calculateFactorFlushDifficulty(uint256)","9c86b241":"createPromoArt()","9c88b7bf":"enableNewPurchasing(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","9c88cbb6":"getCurrentBracket()","9c893d73":"LinkCoinToken()","9c89a0e2":"getReputation(address)","9c89a10a":"presaleOwner()","9c89ddb5":"addCourse(string,address)","9c89e828":"BidSubmission(address,uint256)","9c8a5a56":"bribedCitizen()","9c8aeedd":"breakIdMaintenance2(uint256,address)","9c8bb5d0":"confirmBoardScore(bytes32,bytes32)","9c8bcd6d":"WbtToken()","9c8e1d50":"getChipValue()","9c8f8569":"Scc()","9c8f94bd":"widthrawBondFunds(address)","9c8f9f23":"removeLiquidity(uint256)","9c90224b":"assertEq1(bytes1,bytes1,bytes32)","9c908f61":"acceptTokens(address,uint256,uint256,uint256,uint256)","9c91ae20":"getGeneration(uint40)","9c91dd56":"paymentContract()","9c9205b6":"Token(address,address,uint256)","9c926061":"HashProject(address)","9c92bfda":"testReceiveSubmittal()","9c93a52f":"SALE_TOKENS_SUPPLY()","9c9421c3":"Testtoken()","9c94e6c6":"notice()","9c960cbb":"setAyantDroitEconomique_Compte_6(uint256)","9c97114b":"s(bytes)","9c977e43":"requestOraclizeBalance()","9c978442":"TransferToAllAccounts()","9c981fcb":"getString(string)","9c9a1061":"buy(bytes32)","9c9a2365":"getFungibleTokenAddress()","9c9a4b72":"TokenVesting(address,address)","9c9b1170":"setoraclelimitgas(uint256)","9c9b2e21":"addReward(address)","9c9b8fcc":"ALC_FOUNDATION_ADDRESS()","9c9c344c":"getTotalUpdates()","9c9cc12a":"getCatRelease(uint256)","9c9d07c1":"STARTING_DINO()","9c9de4dc":"INT(address)","9c9e2752":"SBGCrowdsale()","9c9ecedb":"InitialArray()","9c9ef44a":"setDiscountValueOn()","9c9ef978":"addDataToList(bytes32,bytes32,bytes32,bytes32)","9c9fb68b":"GetGamblerChoices(address)","9c9fe2a4":"FundsClaimed(address,uint256,string)","9c9fe83a":"setBA(bytes32,address)","9c9ff934":"ETH_HEROCOIN()","9ca0e5e1":"setGoldBonus(uint256)","9ca15d59":"oldInviteAddr()","9ca2b9e4":"AdvancedDeposit(bytes32,bytes32)","9ca3669d":"cancelCommissionerAuction(uint32)","9ca3c29c":"getCost(string)","9ca423b3":"referrals(address)","9ca44515":"ketqua()","9ca5454e":"distributes(uint256)","9ca5f4a7":"SafeERC20Helper()","9ca67a6e":"notapproved()","9ca6e670":"apply(uint256,uint256,string)","9ca74595":"BobMarleyCoin()","9ca75320":"searchNode(address)","9ca77f3c":"kingdomsByNumber(uint256)","9ca7c912":"ownerTime()","9caaa154":"setLuckPrice(uint256)","9caaa7f4":"get_this_balance()","9caab55a":"ParticipantAgent()","9caabfac":"dateEcoRelease9()","9cad74b0":"randomNumber(uint8,uint8)","9cadb159":"settleChannel(uint256,address,uint256,uint256,bytes32,address,uint256,uint256,bytes32)","9cae6100":"addAward(string)","9cae9e03":"getPropertyInfo(uint8)","9caeab45":"periodICOStage5()","9caf34c4":"getBalanceEth()","9caf9695":"paleyer2show(uint8,uint8,uint8,uint8,uint8)","9cb02e8c":"delayPhaseEndBy(uint256,uint256)","9cb04d18":"newPresale()","9cb157d9":"VNT()","9cb15a94":"FreeCoin(uint256,string,string)","9cb1e9fe":"cubicContract()","9cb21f6d":"ImperialCredits()","9cb230ec":"Lockup(address)","9cb29034":"CCECOIN()","9cb2b69b":"getCreated(uint256)","9cb31079":"setLowLimit(uint256)","9cb33309":"BasicTokenMock(address,uint256)","9cb35327":"ceilDiv(uint256,uint256)","9cb42db4":"PDS()","9cb481ea":"getBountyAmount(uint256)","9cb4b31c":"tokenTimelockAddress()","9cb64a2d":"debtor()","9cb6a504":"addColor(string,string)","9cb6ed7e":"escape(address)","9cb6fc77":"confirmUpgrade()","9cb74ab6":"mgmtInvestProject(address,uint256)","9cb7595a":"getBridgeInterfacesVersion()","9cb75b2f":"sendBonusEgg(address,uint256)","9cb78df8":"minSuccess()","9cb7de4b":"setHandler(address,bool)","9cb8a26a":"selfDestruct()","9cb931f9":"setReferralPromille(uint8)","9cb998dc":"increase(bytes32)","9cb9c14f":"Issuance(address,uint256)","9cba3559":"globalAmounts(uint256)","9cba60a7":"bitmask_check(address,uint256)","9cba713e":"reserveTreasury(uint256)","9cbad951":"withdrawAllTokensFromBalance()","9cbafcb6":"Pharamore()","9cbb165e":"isOnBorrow(uint256)","9cbb9460":"fetchOrdersForMerchantByAdmin(address)","9cbc2d62":"get_member_info(address)","9cbc87a3":"bytes32ArrayToString(bytes32[])","9cbcfcc7":"calculateGotTokens(uint256)","9cbd695f":"show(uint256,uint256)","9cbd7da5":"resumeICO()","9cbdffc6":"unblock()","9cbe5efd":"currentRoundId()","9cbf1b85":"exchangeRateAt()","9cbf73a9":"purchaserAddresses(uint256)","9cbf9e36":"createToken()","9cc04ea0":"newRecord(uint256)","9cc0c5e3":"experty_io()","9cc1c97b":"test_threeValidEqAddress()","9cc24569":"ExKnox(address,address)","9cc28aa0":"BdpOwnershipStorage(bytes8)","9cc2bcc6":"AhieldCureToken()","9cc33024":"setPresidenteDeMesa(bytes32,uint256,uint256,uint256,bytes32)","9cc3b949":"Bookmark()","9cc429dc":"getBattlesCount()","9cc477b2":"createFashion(address,uint16[9],uint16)","9cc4a319":"CarToken()","9cc4d3dd":"convertNumSec(uint256[],uint256[])","9cc4da3b":"WHAuthorizeAddress()","9cc579af":"MarketJob(address[],uint256[],uint256[],address,address,bytes)","9cc5dd95":"_removeOwnersAproves(address)","9cc73a6f":"raiseDay3()","9cc74299":"withdrawFromManager(uint256,address)","9cc7d917":"earlyBirdsAddress()","9cc7f708":"balanceOf(uint256)","9cc8295a":"EnoughClaims(uint256)","9cc84564":"envelopeCounts(address)","9cc9299e":"killSwap()","9cc946ee":"OlivToken()","9cc9b86d":"disableService(address)","9cca1c64":"getNonFungibleIndex(uint256)","9cca7ac3":"QueueDemandesEnCours()","9ccaec98":"getAuctionInfo(uint40)","9ccb6e8d":"SentToContractor(uint256,address,uint256)","9ccbbc6a":"minimumPowerUpSizeBabz()","9cccaea9":"StreamityContract()","9cccb272":"BatchPaint(uint8,uint256[],bytes3[],uint256[])","9cccd2a4":"getSumAmountOfSuccessfulSteps()","9ccd0b51":"getCountCourse()","9ccd7d86":"setWinery(address,address,bool)","9ccdd994":"Pume(uint256,string,string)","9ccf1a68":"prepareURL()","9ccfceed":"MANHATTANPROXY10THAMSTAVE()","9cd0126a":"gemHpConversion()","9cd01605":"exchangeAddress()","9cd04996":"DiscountedPreICO(uint256,uint256)","9cd08464":"transfer_eth_from_contract(address,uint256)","9cd08bae":"CevacToken(uint256,uint256)","9cd0c511":"depositMintAndPay(address,uint256,uint256)","9cd106a8":"cancelRecurringBilling(uint256)","9cd19074":"createKey(bytes32)","9cd1a121":"delegateTransfer(address,uint256,address)","9cd2021c":"mintRefs()","9cd22211":"getPlayerGameInfo(uint256,address)","9cd23707":"setTransferable(bool)","9cd3cb5d":"withdraw_token(address)","9cd417d7":"rejectCurrentValidation()","9cd43690":"GENTATOKEN()","9cd4fb47":"Tier_Classic()","9cd5c9a8":"setAssetWallet()","9cd70235":"setAmountToClaim(address,uint256)","9cd758d0":"setPOOL_edit_2(string)","9cd77457":"createInactivePreMintedEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256,uint256)","9cd84ead":"APPToken612()","9cd994b4":"updateAuctionTime(uint256,uint256,uint256)","9cda1ec5":"setDistributor(address,bool,uint256)","9cda5a12":"calcPoseBits(uint256,uint256,uint256)","9cdacdb3":"Setup(address)","9cdaef4d":"_set4()","9cdaf438":"ARCCToken(address,uint256)","9cdb4fe8":"addEvidence(bytes32,uint256,bytes32,uint8,bytes32,bytes32)","9cdbaa21":"tokenTransferLocker()","9cdbc070":"addVoting(uint256)","9cdd2e76":"getHeroLocation(uint256)","9cdec2bb":"getCompte_18()","9cdee922":"RushCoin()","9cdf1872":"getOut()","9cdf4dd3":"Token(address,string,string)","9cdf8a1f":"WTBNToken()","9cdfa3df":"getAddrForPrivilege(address)","9ce04e35":"enableInvestorTransfer(address)","9ce21f3c":"fundingWalletAddress()","9ce2c7f2":"AumentaQuantitaVoti(uint256,address)","9ce318f6":"withdraw(uint8[],bytes32[],bytes32[],bytes)","9ce31fe1":"StudToken(uint256)","9ce3961f":"nextVersionAddress()","9ce3f461":"UP_winBets()","9ce51c7c":"sendNewTalentsAndPartnerships()","9ce682bd":"BetFromTransaction(address,uint256)","9ce80efc":"test_twoInvalidAssertFalse()","9ce840d4":"withdrawNotATokens(address)","9ce8fc4e":"LogForkSigned(uint256,bytes32)","9ce962ca":"payWallet()","9ce9e380":"_burnAllArgs(address,uint256)","9cea127f":"CMTTT()","9ceb5c6d":"icoBonus1EndDate()","9ceba90b":"startWeekFive()","9cec2789":"gettags(address)","9cecc80a":"setReserve(address)","9ced0e9b":"initialTime()","9ced5c29":"enableNode()","9cede14c":"checkAndGetSendersID()","9cee1773":"Mednus()","9cef2a6a":"addLand(address,uint256)","9cef8873":"reclaimLand(int256,int256)","9cef9cfe":"isNumBlack(uint8)","9cefa50b":"winner(uint256,bytes32)","9cf17d5f":"ScamCoin()","9cf21342":"AnimeCoin()","9cf21d90":"ETCH3dV()","9cf2c727":"sumHardCapICOStage7()","9cf3123b":"sellWolkEstimate(uint256,address)","9cf3566d":"promotionAllocate(address,uint256)","9cf4124f":"enableContinuousDelivery()","9cf48365":"getInvestedToken(address)","9cf488ad":"sendPlayerBack(uint256[])","9cf4910c":"preDistriToAcquiantancesEndTime()","9cf4cb1e":"_getVotes(uint256,uint256,uint256,address)","9cf5453d":"bid(address)","9cf55cfb":"sampleBoolRetTrue()","9cf5c613":"setVerified(address,bool)","9cf60b86":"addRefBalance(address,uint256)","9cf66013":"whitelistRegistrantsFlag(address)","9cf66997":"clearLand(int256[],int256[])","9cf6f1eb":"CBVO()","9cf78527":"UAPToken(address)","9cf8ccfd":"currentPlayers()","9cf9342e":"createContract(bool,string,bool)","9cf94943":"whitelistAdd(address[])","9cf9d4c0":"setPOOL_edit_9(string)","9cf9e3ab":"TokenReleased(address,uint256)","9cfa0f7c":"maxTokensToBuy()","9cfa750f":"isParticipant(uint64,address)","9cfad128":"calculateFee(address,bool,bool,uint256,uint256)","9cfcab47":"NovoToken()","9cfd5dc4":"validPurchase(uint256,address)","9cfda697":"setColorsX4(uint16[4],uint256[20],uint256)","9cfdd04d":"BCN()","9cfdfe42":"AXIS()","9cfe42da":"addBlacklist(address)","9cfe6c86":"count_tokens()","9cff53e0":"nDeposits()","9d000e78":"VUP_PER_ETH_PRE_SALE_RATE()","9d00ffa5":"isMessageValid(bytes)","9d01e730":"EarlyEndTimeChanged(uint256)","9d038cd3":"TEST1()","9d042f87":"dTimeoutCurrentStage()","9d0506ae":"checkData(bytes)","9d05414f":"Referral(address,address)","9d0617f9":"_send(address,uint256)","9d063ed8":"FIFSRegistrar(address,bytes32)","9d069353":"getAngel(uint64)","9d06a1d5":"removeFromWhiteList(string,address)","9d0714b2":"tgeSetLive()","9d079b18":"acceptProposal(bytes32)","9d07b653":"_createUnit(uint256,uint256,uint256,uint256,address)","9d07ff80":"ln_fixed3_lnr_18(uint256,uint256)","9d083222":"becomeMember()","9d0880a3":"transferUnsoldTokens(address)","9d09390b":"isValidAuthority(address,uint256)","9d097471":"getUserBounty(address)","9d09798f":"DemurringFee(address,uint256)","9d09f8e5":"changeRebackRate(uint256)","9d0b2c7a":"pendingStake(address,uint256)","9d0c0c35":"generateCrabGene(bool,bool)","9d0c1e6f":"walletETH()","9d0cfc2c":"closeDepositSubRound()","9d0d0a5a":"getTotalToggleGameDivsProduced()","9d0d9f1c":"azatipsToken()","9d0df9b5":"getPOOL_edit_11()","9d0e0cd3":"getTotalTAOsCount()","9d0e5871":"shipping(address)","9d0effdb":"revokePermission(address,address,bytes32)","9d0f17c8":"unsoldTokenIssued()","9d0f8763":"cancelOrderByAdmin(uint80,bool)","9d0fb699":"tokensToBeClaimed()","9d106954":"_getUserMinersAt(address,uint32,uint32)","9d1080c5":"UnilotToken()","9d10fda8":"escrow_fee_denominator()","9d118770":"destroy(uint256)","9d119a4e":"EmergencyUnPause()","9d119a7b":"getDepositTxMap(string)","9d11aaaa":"transferFeePercentage()","9d11f09f":"getTxAmountKWh(bytes32)","9d129afd":"prevBlock()","9d12e775":"zec()","9d13156c":"claimRefundOwed(uint256)","9d134185":"setauctionsystem(uint256,uint256)","9d139ff2":"LajokiCoin()","9d140fa2":"inPreSale2Period()","9d144f8a":"_preventedByNationalityBlacklist(address,uint256)","9d145866":"loadRate(uint256)","9d14f134":"getRepo(bytes32,string)","9d153495":"withdrawRefund(uint256)","9d1672c4":"getAffiliateRate()","9d16aca6":"changeExchangeContract(address)","9d170c5d":"getRef(string)","9d176556":"setDistConfig(address[],uint256[])","9d189473":"calculateAndMintTokens(address,uint256)","9d18e405":"approveAndBuyAffiliated(uint256,address,uint256,bool,address)","9d1a9ff9":"rebatePeriod_()","9d1acead":"periodPresale()","9d1b0fd1":"createProduct(bytes32,string,bytes32,bytes32)","9d1b464a":"currentPrice()","9d1b8945":"requestedRedeem(address,uint256)","9d1bbd7e":"CancelRoundAndRefundAll(uint256)","9d1be930":"autopayfee()","9d1c3f03":"isMaximumPreFundingGoalReached()","9d1c4d42":"buyAnalysis(uint256,uint256,address)","9d1d14e0":"setEtherExchangeLikeCoin(uint32)","9d1ddca5":"fiveYearGrace()","9d1e0d48":"buy(address,string,uint256,uint256,uint256,uint256)","9d1e351c":"totalBonusToken()","9d1e641b":"CROWD_WEEK3_BONUS()","9d1eb451":"MAT_CROWDSALE_SUPPLY_LIMIT()","9d1ebfd6":"nextReleaseAmount()","9d1eeb97":"redemptionBurn(address,uint256)","9d1f2800":"doPush(address,uint256)","9d1fd89c":"getFirstBorrowAgreementTool(address,address)","9d1ffed9":"_certify(bytes32)","9d2044e1":"setContrAddrAndCrwSale(bool,address,address,address,bool,bool)","9d20467a":"changeTiming(uint256,uint256)","9d209048":"getNode(address)","9d20b314":"TotalpresaleSupply()","9d210369":"resetMaxBonusThreshold()","9d210bdd":"getStoriesLength()","9d21328f":"sharedExpense()","9d21dd78":"getGameTime()","9d2235e7":"_leapYearsBefore(uint256)","9d22c693":"before_test_method_increaseTimeBy30000()","9d23c4c7":"tokenRegistry()","9d240cf2":"Workshop()","9d245238":"getWinNumbers(string)","9d248477":"BeaverCoin()","9d248e08":"burn3(uint256,uint256,uint256)","9d24c49f":"_payloadOffset(uint256)","9d24e482":"theWinner()","9d255663":"EthMonoPoly(address)","9d2620bf":"RealEstateCouponToken()","9d2668d4":"setPurchased(address,address,uint256)","9d273b20":"refundStatus()","9d2754a9":"createTokenToTax()","9d2777f4":"IntermediateWallet()","9d277a49":"unregisterPublisher(address)","9d2870c3":"LPAIToken()","9d29255b":"setCSCERC721(address)","9d29cac4":"getMonsterClass(uint32)","9d2a1eab":"GrantAdded(address,uint256)","9d2a8cf0":"unwhitelistAddress(address)","9d2ab46d":"BUZZToken()","9d2ae623":"depositJackPot()","9d2affd5":"transferFrom(address,address,address,address[],uint256)","9d2be721":"insertTopic(bytes15,address,bytes32,bytes15)","9d2cc436":"RESERVE()","9d2cd67c":"collect_main_fee()","9d2d912e":"futureDevLock()","9d2e4777":"vestingTransfer(address,uint256,uint32)","9d2ec188":"setFeeParams(uint256,uint256)","9d2f1cbb":"changeStakingFees(uint80,uint80,uint80,int256,uint80,int256,uint256,int256,uint80,uint80,uint256)","9d2fc3c8":"adjudicate(uint256,uint256)","9d2fcb8c":"setInvestmentAddress(address)","9d2ff29c":"ICDSupply()","9d30584c":"setHard_Cap(uint256)","9d327229":"fechVoteResultForCandidateByStage(address,uint256)","9d340b71":"buyTokensfor82()","9d3565ce":"transferOr(address)","9d35dcac":"NewUser(uint256,address,address,uint32)","9d36c500":"freeAnimalsLimit()","9d38cdbf":"OwnedUpgradeabilityProxy(address)","9d38cea3":"stopPreIco()","9d390d83":"setIsWeiAccepted(bool)","9d3995c2":"setHeroPost(address,uint256)","9d3ac6d5":"getBuyerContribution(address)","9d3acf23":"isResolvedForDefendant(uint256)","9d3aee8d":"st4ckHeight(uint256)","9d3c015e":"PChannel(address)","9d3c3b5d":"getArrayHashMarketItem(bytes16)","9d3c663f":"isBreakingCap(uint256,uint256,uint256,uint256)","9d3cc187":"changeSetRateAddress(address)","9d3d1d82":"userSponsorshipsPred(address,uint256[],uint256)","9d3d741c":"testAboveLength()","9d3d9b4d":"FETCOIN()","9d3de95a":"getPortfolioInfo(address,uint256)","9d3e069c":"StartDraw()","9d3e1ab8":"walletRemaining()","9d3ec1a7":"getMarriageDetails()","9d3f2e5f":"stakeEthForGas(uint256,address)","9d3fae04":"applyAuditorsCheckUpdate(address,address,uint256)","9d3fe4c2":"AGAVETHER(string,string)","9d4022c8":"OrderStatisticTree()","9d406a13":"getLocksLockedFor(address,uint256)","9d408b93":"gasBefore_()","9d4095cc":"getAmbientTempException(bytes32)","9d41198e":"startnewround()","9d41a9af":"getOccupation(address)","9d41d6fc":"testInitialBalanceWithNewRGXToken()","9d421ea7":"claimTeamToken()","9d42829a":"getGoldInfoDocumentation(address)","9d42d1a9":"sendEvent(uint256,bytes32)","9d4323be":"drainToken(address,uint256)","9d4327a0":"stockBuyCertainOrder(uint256,uint256,uint256,uint256)","9d433c71":"sharesOfSPS()","9d442102":"BuyRocketForSale(uint32)","9d44ac4f":"permissionExists(uint8,address)","9d44d93b":"delegateTransferAndCall(uint256,uint256,address,uint256,bytes,address,uint8,bytes32,bytes32)","9d44fca2":"computeEthConstant(uint256)","9d451c4d":"right77(uint256)","9d45b9d2":"soldTokensPreIco()","9d45d077":"raiseSellOrderMatched(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int160)","9d463520":"lastMintTime()","9d463b99":"addPool(uint256,uint256,uint256)","9d471837":"updateTextForHolder(bytes32,bytes)","9d478656":"sendp(address,uint256)","9d484693":"payouts(address,uint256)","9d4936f9":"MINING_OUTPUT()","9d4971b7":"getOrderLength()","9d499363":"faucetTokenAddress()","9d4ab2a3":"setInvestAgent(address)","9d4aba7c":"getTimestamp_()","9d4b1239":"tokensDistributedCrowdsale()","9d4c162d":"executeProposal(bytes32,int256)","9d4c5451":"minTokens()","9d4c662c":"sell_id()","9d4c7737":"creditStatus()","9d4c8eed":"getChildCount(address)","9d4cc8ad":"Poppins()","9d4cf268":"isERC165Interface(bytes32)","9d4d8db3":"Happy()","9d4e85ce":"getUserDeposits(address,address)","9d4ea0f3":"canMove(uint16,uint8,uint8)","9d4ff8ad":"enter(string)","9d5176fd":"getPremiumFactors(bytes32)","9d51d9b7":"setMaxBalance(uint256)","9d52f74b":"getFreezeGap(bytes32)","9d532041":"createCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256,bool,uint8)","9d535056":"punterWaiting()","9d5367c5":"KIDToken()","9d53827f":"MAX_TRANSFER()","9d53f19e":"getInvestorInforMin(uint16)","9d54c79d":"notary()","9d54f419":"setUpdater(address)","9d55fba7":"updateCommission(uint256)","9d564d9a":"unlockTokens(address,uint256)","9d56998d":"my_message()","9d5708ff":"myTulipsBatched(uint256,uint16)","9d575582":"depositToken(address,uint256,address)","9d5779ce":"Site(string)","9d5839e3":"getFirstMilestone()","9d585f7f":"loanAmount()","9d58a5b6":"unitExists(uint256,uint256)","9d58aa41":"changeRestrictedtStatus(address,address,bool)","9d58b15d":"addMember(address,address)","9d59011e":"setAmount(uint128)","9d599cbf":"hashClaimable(bytes32)","9d59beb1":"listTokenFee()","9d5c6061":"getMsgGas()","9d5c6e20":"setPrivateSaleEndDate(uint256)","9d5c7be8":"collectionCountsOf(address)","9d5de12e":"STQPreSale(address,address)","9d5eab46":"setItemOption(address,uint256,uint256)","9d5eb078":"buyTemplate(uint256)","9d5efb6b":"tokenContractSupply()","9d5f2422":"createDifficultyOracle(uint256)","9d5f5cd3":"mktValue()","9d61193a":"passoverStartTime()","9d617fae":"pendingFills(address)","9d619dad":"currentTournamentBank()","9d61e624":"hardcapInEth()","9d625241":"powermayorCutPercentage()","9d62f07b":"BlockGrainCoin()","9d636359":"initialMarketSales()","9d63848a":"tokens()","9d64a5e5":"newFoundationCandidate()","9d64d474":"cancelExplorationByIndex(uint256)","9d652118":"presaleclosingTime()","9d66a9cd":"getDetail(uint256)","9d66e913":"callStcWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","9d67b404":"addChunk6ToWhiteList()","9d68521a":"revokeOperatorTranche(bytes32,address)","9d69d5c6":"CERTIToken()","9d69fdff":"Ecometh()","9d6a4d77":"allotToken(uint256)","9d6abbcd":"unlockedEscrow(bytes32)","9d6abe4f":"getLink(address)","9d6ad799":"computeTokenWithBonus(uint256,address)","9d6adeaf":"HitToken(string,string,uint8,uint256)","9d6b74f8":"DISPLAY_CLASSIQUE_ET_VIDEO()","9d6bf036":"setIsLimited(bool,string)","9d6d22b5":"ProgrammerdaddysToken()","9d6d2321":"dividendsFull(address)","9d6d78e4":"chunk3IsAdded()","9d6d8598":"depositTokens(bool,uint256,address)","9d6dcf53":"Smilebitbuy(uint256,string,uint8,string)","9d6e0c22":"setBroker(address,address,uint256)","9d6e4eaa":"ReleasableToken(string,uint256,string,uint256)","9d6eaad5":"returnTokensToOwner(string)","9d6f78c1":"LineToken2()","9d6fa618":"requestTransferOwnership(address)","9d6fac6f":"cooldowns(uint256)","9d6fb020":"isRefunding()","9d70085e":"cap3(address)","9d707d03":"resetAuctionStart(address,address)","9d7150fe":"isAffiliateValid(address)","9d7233d4":"MIN_CONTRIBUTION_WEIS()","9d72d8d3":"luckyBuy(uint8)","9d733f0c":"submissionPrice()","9d735286":"forwardFunds()","9d7354c0":"BuyHandler(uint256)","9d735fc5":"RewardPoint()","9d73cecc":"validatePeer(address)","9d7437b8":"WALLET_ADVISOR()","9d74b37d":"getBool(address,bytes32)","9d74b959":"test_basicWithAssertBeforeThrow()","9d74fb7c":"ContributionMock()","9d75c113":"_joinCDP(bytes32,uint256)","9d7616a5":"preEtherCap()","9d76ea58":"tokenAddress()","9d770e49":"abstractResolver()","9d773a1b":"catsForSale(uint256)","9d77bd68":"luCat()","9d77e4f8":"getChainFees(uint256)","9d77f85a":"buyCollectible(uint256,uint256,int256)","9d79468a":"claimRewardTo(address,uint256,string)","9d7a63e9":"changeDripAmounts(uint256,uint256)","9d7acf74":"BluechipToken()","9d7b5621":"numberOfTokenId()","9d7b7636":"Neymar()","9d7b8887":"addAddressMappingProposal(address)","9d7bf73c":"PLUS()","9d7d6667":"multipliers()","9d7da479":"mintTokens1(int256,address,uint256,uint256,bytes32)","9d7e2730":"issueCoins(uint256,address)","9d7e6ca8":"setResponseAddress(address)","9d7eb375":"updateUserDetails(string)","9d80ac4d":"WithdrawedEthToWallet(uint256)","9d80c818":"addressCount()","9d815818":"validReleasedToken(uint256)","9d8168f0":"removeManyWhitelist(address[])","9d821c1a":"setManualSaleFlag(bool)","9d827eb9":"CreationFeeChangedEvent(uint256)","9d8374b4":"removeFromBlacklist(address,address)","9d837ccd":"ETH_CAP()","9d83ee1b":"getAllCardDatas()","9d84934d":"mintStartYear()","9d84ae69":"readAddress(bytes32)","9d856bdc":"queen()","9d858a80":"Pheonix(uint256,uint256)","9d85fca3":"findIndexFromRandomNumber(uint32)","9d866527":"Strange()","9d86ad52":"CloseIfBug()","9d86fd0c":"test_threeTrueAssert()","9d87a373":"transferFromMany(address[],address,uint256[],address)","9d87e7f0":"getWeiAvailableToReturn(address)","9d882b5d":"Sotoin()","9d88584e":"removeFamily(address)","9d888e86":"currentVersion()","9d88f3a1":"setLotteryAddress(address,address)","9d89add1":"createMechETH(uint256,address)","9d89e7d4":"challengeAmount()","9d8a0212":"costOfOneToken()","9d8a18ea":"VT(uint256,string,string)","9d8a8c43":"totalTokenMintedPreSale()","9d8abff3":"miningAttempts(uint256,address)","9d8b0834":"verifyLoanOfferingRecurse(address,address[9],uint256[7],uint32[4],bytes32,bytes)","9d8b157b":"teamCup()","9d8c3994":"giveAllToCharity()","9d8c428e":"addRoundMode(uint256,uint256,uint256)","9d8c7243":"CreateKRM(address,uint256)","9d8c997b":"getInfoByUnionId(bytes32)","9d8ca531":"closeLottery(uint256)","9d8cb45c":"foundationSupplyRemaining()","9d8d22f4":"grantReserveTokens(address)","9d8d911e":"_createCryptsy(uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,address)","9d8dbd20":"remove_kycer(address)","9d8df6dd":"cancelAdoptionRequest(bytes5)","9d8e2177":"UNIT()","9d8ee943":"right71(uint256)","9d8f2b17":"LCAP()","9d8f4c27":"priceUpdateAddress()","9d902fc0":"precisionFactor()","9d913c64":"addTokenLock(uint256,uint256)","9d9231b1":"_unpackLevelValue(uint256)","9d925fc8":"REFUND_RATE()","9d930f02":"newTeamOnEnd(uint64,uint64,uint64)","9d932a93":"validateSignature(bytes,bytes32)","9d94743a":"CND(address)","9d94a8fa":"_thresholdTwo()","9d94c343":"POSV()","9d94dac8":"fightEtherMonster()","9d95f1cc":"addNode(address)","9d963289":"NewLeader(address,uint8[])","9d96be58":"maxMintBlock()","9d96f200":"Factory(string)","9d97bcd7":"allocatePreICOTokens()","9d988d03":"X(address)","9d989b20":"chargeDailyRate(bytes32,address)","9d98cd78":"drawETH(uint256)","9d9a5e1c":"startPrivateICO()","9d9a7fe9":"completed()","9d9ab2d8":"setEtherUsdRate(uint16)","9d9ae444":"StatsReserved()","9d9aeb7f":"setInterestAllocationPercentage(uint256,uint256)","9d9afce9":"claimTokenReserve()","9d9b2e82":"RevenueSharingContract()","9d9b4d20":"DST_R_N_B_PROGRAM()","9d9b5342":"editInfo(string)","9d9bfb02":"throwsWhenNonMultisigDeploysANT()","9d9c9439":"tokenInitialised()","9d9c9a0d":"testControlCreateWithParentParentSameItemId()","9d9ca28d":"isWinner(address)","9d9cc8e9":"TestCrowdsale_Noname()","9d9d432f":"updateGenVault(address,uint256)","9d9db392":"makePayment(address,uint256,string)","9d9dcf81":"getXPL()","9d9fcc72":"checkWithdrawals(address)","9da065cb":"ReddyToken()","9da0c7b1":"nowCanProvideHash()","9da0d7d4":"dutchAuction()","9da0dc0a":"preICOWeiRaised()","9da1814c":"FremenTradeToken()","9da19acc":"isRedemptionReady()","9da1b02a":"createSale(uint256)","9da1bc7b":"updateBearCount(address)","9da26320":"registrations_confirmed()","9da2b791":"assignDNI(uint256)","9da30467":"payForOrderInTokens(uint256,address,uint256,address,uint256)","9da32c14":"Defapacoin()","9da43ef4":"getExtraPoints(uint32)","9da46ee3":"getPool(uint32)","9da59934":"getInbox(address,uint256)","9da5e0eb":"initDaylimit(uint256)","9da67e71":"OpenMoneyPresale()","9da680f3":"adjustRegistrationFee(uint256)","9da69180":"commitVote(uint256,bytes32)","9da78649":"getNewRecordInHistoryRecord(uint256)","9da8be21":"initWallet(address)","9da8e7e2":"createProxy(string)","9da9650e":"Cothereum(uint256,string,string)","9da9df3e":"withdrawContract()","9daa7b46":"STTCToken()","9daa9ecd":"percentAllocationFeeDenominator()","9daaae94":"setClient(bytes32,address)","9dab2054":"priceAt(uint256)","9dab3cd4":"userRight(address,bytes1,uint256)","9dab4607":"ACCEPT_DICE()","9dabff25":"sendReward(address)","9dac83e4":"allowWorker(address)","9dace789":"EOSGold(uint256,uint256)","9dad9382":"closeStream()","9dae2e80":"payoutDonations()","9daf57cf":"getBdpDataStorage(address[16])","9daf77a5":"GetContractStateTerminatedMisrep()","9daf9b6b":"insertNodeAfter(uint256,uint256,address)","9daf9ce3":"computeTotalEthAmount()","9dafb4df":"prizeOwner()","9dafbc13":"initBlock(uint256)","9db02721":"refuseWork()","9db028ab":"getMetadataHistoryLength(string)","9db069d8":"bountyOwner()","9db09a08":"createContractMovie(string)","9db1b8af":"msc()","9db1cafa":"SuccessLife()","9db28672":"isOfferingStarted()","9db340de":"eraseNodeHierarchy(uint256,bytes32[],bytes32)","9db3956e":"setDatabase(string,uint256)","9db40718":"SearchIPR(string,string)","9db4372c":"num_tickets_current_round()","9db4577f":"addListToWhiteList(address[])","9db5dbe4":"transferERC20(address,address,uint256)","9db67cd0":"funcFromC3()","9db70e19":"tokenIdToRank(uint256)","9db7ff9e":"changeGameRuningblock(uint256)","9db834fe":"setColorPink()","9db8d393":"setCostToCancel(uint256)","9db91e78":"insecureMode()","9dbbcca3":"ChangePreICOStart(uint256)","9dbc041c":"requiredBid(uint256)","9dbc4f9b":"participantDetails(uint256)","9dbd1b96":"getRecipient(bytes)","9dbda902":"getHighestMortgageRate()","9dbdfe0d":"LocusOne()","9dbe3501":"LongPlace(address[2],uint256[8],uint256)","9dbf0087":"TokenERC20(uint256,string,string)","9dbf0543":"price_constant()","9dbf5eca":"updateRelayer(address,bool)","9dbf7014":"depositMineral()","9dbfe1b8":"setSaleRate(uint256,uint256)","9dc04184":"allowDraw()","9dc080d3":"angelToken()","9dc10d15":"preAllocatedTokensVestingTime()","9dc11280":"numDataOf(uint256)","9dc1d961":"message(bytes32,bytes32,string,string)","9dc27fe3":"setICOStatus(bool)","9dc29fac":"burn(address,uint256)","9dc2c8f5":"fireEventLog4Anonym()","9dc35799":"updateReading(uint256)","9dc371bd":"ULTRIXCOIN()","9dc42f16":"_removeOwner(address)","9dc43f2d":"newEmployeePoolPromille()","9dc4b9c9":"currentLevel()","9dc4ca42":"getWalletDigest(bytes32,address)","9dc4ef99":"_registerArtist(address)","9dc5b35e":"saveData(uint256,bytes32,uint8,bytes32,bytes32,bytes32,address)","9dc64f8e":"getWidthrawPercFor(string)","9dc6c12b":"TaiwanRepublic(uint256,string,string)","9dc6f173":"LogBidAccepted(address,uint256,uint256)","9dc7a49a":"RegisterUsername(string)","9dc8832c":"JiucaiToken(uint256,uint8,string,string)","9dc905bb":"insertMilestone(uint8,uint256,uint256)","9dc90bd8":"GreeningDesertChainToken()","9dc9281b":"LjwToken3()","9dca362f":"createAccount()","9dca4e0a":"matchWinnerOk(uint8,uint8,uint8,uint8)","9dcb0f55":"fundingStartAt()","9dcb5c65":"resultsWeightedByEther()","9dcbed8b":"totalUnrestrictedTokens()","9dcbf7ea":"Rename(string,string)","9dccc5bf":"getRegistration(bytes32)","9dcd4beb":"optionExerciseSpan()","9dcee160":"voteC()","9dcf56b4":"proofType_TLSNotary()","9dd05af9":"setEarlyExchangeRate(uint256)","9dd0a30f":"iwithdrawal(uint256,uint256)","9dd0ff01":"max_bet_this_spin()","9dd1687e":"withdrawBasicTokens(address)","9dd21928":"whiteListAddress(address,bool)","9dd28e34":"registerVendor(uint256,bool,bytes,bytes)","9dd3045b":"TransferToken(address,uint256)","9dd373b9":"setStakingContract(address)","9dd409d3":"setPlayPrice(uint256,string)","9dd4fdd3":"MarketPrice()","9dd52927":"AuthorityController(address,address[],uint256,uint256,address)","9dd5b9a3":"_lockAllAmount()","9dd63c3a":"setOwnerPrice(uint256)","9dd74964":"dividendsSum()","9dd7b3c3":"getSellBallers()","9dd7e749":"getOffsaleCount()","9dd819cc":"test_fourValidEqInt()","9dd9c24b":"canPerform(address,bytes4)","9dda456a":"_firstLevelEth()","9ddae7f5":"determineOutcome(uint256,uint8[],uint8)","9ddaf5aa":"proofs(uint256)","9ddc4a47":"setTransformTarget_default(uint256)","9ddccc99":"TelonToken()","9ddd503e":"PlayChainToken()","9dde6eb6":"placeBidFromEtherScrolls(uint256)","9ddee5f9":"SlopeIncreased(uint256)","9ddf65e1":"AUTSCoin()","9ddf840d":"withdrawDivs()","9de0111f":"tokenWithdraw(uint256,address,uint256)","9de0eb04":"dappId()","9de12300":"updateICOmask(uint256,uint256)","9de18f9c":"controla(address,bytes32,bytes32)","9de2bd2f":"RYZToken()","9de2f796":"getMintAmount(uint256)","9de315f1":"getTargetContactPubKey(address)","9de39cb3":"testStartsWith()","9de4f41c":"seMurio()","9de518ba":"divertDividendsToBankroll()","9de66604":"erc20old()","9de6ba52":"ArtCore()","9de6c45b":"addBox(uint256,string,string,string,uint256,uint8)","9de6d9aa":"changeGasLimitAndPrice(uint256,uint256)","9de7d032":"createPerson(uint32,string,uint256)","9de8302f":"createGen0Auction(uint256,uint128,uint128,uint40)","9de8535e":"readiscolorregistered(uint256)","9de91ccd":"getCCH_edit_12()","9de9205a":"getNujaNumber()","9de92f7e":"submitInput()","9de9d57e":"multiDistributeAdviserBounty(uint256[],bool)","9de9f1b8":"payJackpot3()","9dea34ad":"currBetID()","9deab49e":"_processERC20TokenPackPurchase(uint8,address,address)","9deb0b41":"createConsentFile(address)","9dec2189":"metaApproveHash(address,uint256,uint256,uint256)","9dec365e":"setCrowdsaleTotal(uint256)","9deca9ee":"disputeRounds(uint256,uint256)","9decaecc":"addEntryInMonths(address,uint256,uint256)","9decde19":"repriceAuctions(uint256[],uint256[],uint256[],uint256,address)","9ded1817":"sendCryptoVersusReward()","9ded35c8":"unpauseChannels()","9df06411":"addDepotEth(address,uint256)","9df08a9f":"getStatusEventCloseSuccess(bytes16)","9df0a5df":"ADDR_MAYA_TEAM()","9df0c176":"createCategoricalEvent(address,address,uint8)","9df184ae":"stageTwoEnd()","9df196ec":"getWhitelistDetailsFor(address)","9df1e2b0":"transferOtherToken(address,address,uint256)","9df21154":"AddToDB(address)","9df21bfd":"updateShareAddress(address,address)","9df39b4a":"removeCitation(address)","9df4867c":"transferSectors(uint16[],address)","9df4d0fe":"isChallenged()","9df51b89":"claimProfits()","9df537c6":"increaseBeneficiaryBalance(address,uint256)","9df5a643":"setAllowClaimUser(address,address)","9df5cbda":"isSucceed(uint8)","9df806d6":"setBurnerAddress(address)","9df8f631":"Ur()","9df93754":"Log2(bool,string)","9df94560":"leekStealTracker_()","9df971c1":"subFees(uint256)","9df9a1db":"disableKYC()","9dfaa207":"OWNERS_AND_PARTNERS_ADDRESS()","9dfad52d":"Expand()","9dfb071c":"WHITELISTING_MAX_CONTRIBUTION()","9dfb64fd":"toggleRefunds()","9dfb9de8":"getPawnLoanId(uint256)","9dfbb584":"refundNonWhitelistedPerson(address)","9dfcc05c":"isExpiredDeadline()","9dfcf372":"Lescovex_CYC(uint256,string,string,address)","9dfd1de3":"Token20(uint256,string,string)","9dfd4e2f":"MAX_ETH()","9dfd8b02":"getBuilding(uint256)","9dfde201":"Price()","9dfe29b5":"nextTokenType()","9dfecdcc":"openLottery()","9dff78de":"buyAnts()","9dfffa36":"countUp(address)","9e0112b8":"RESERVED_RESERVE_GROUP()","9e014cf1":"PrepareRollEvent(address,uint256,uint256)","9e01f9b9":"getUser2()","9e0234a1":"PHILCOIN()","9e036add":"NBCL(uint256,string,uint8,string)","9e03a5d0":"AndxorLogger()","9e03c589":"Delinetod()","9e03c971":"BuyKeys(uint256)","9e05c118":"availableCount()","9e05de62":"setFeeSharingValue(uint256)","9e060fb6":"updAcceptAdminWithdraw(bool)","9e07d205":"attorneySign()","9e098d9f":"LjwToken5(address,address)","9e0a2280":"TOKEN_SALE_ALLOWANCE()","9e0b7a1c":"approveCertificate(uint256,uint256)","9e0c0152":"lola()","9e0cb27b":"fetchOrderByOrderIndex(uint256)","9e0cbb64":"usersSpriteOwningHistory(address)","9e0cea05":"buyerCount()","9e0d8126":"PreICOEndTime()","9e0f35a2":"transfersSuspended()","9e0fdb26":"cancelSwap()","9e1224ce":"lotteryCloseInsurance(uint16)","9e126449":"registerForRaffle()","9e12c9b9":"sellCoin(address,uint256)","9e12d725":"NewTokenGrant(address,address,uint256,uint64,uint64,uint64)","9e12f15b":"units50percentExtra()","9e136878":"Transferred(uint256)","9e13baa4":"BNCConverterFactory()","9e13d3e1":"VietnamGemstoneChain()","9e140cc8":"ENCRYPTION_KEY()","9e1533a9":"getFounderMembersInvest(address)","9e159db0":"Lambo()","9e15bc25":"totalInput()","9e163aca":"getDocumentsCount(bytes16)","9e179b91":"addFreeMineral(address,uint32)","9e1832b5":"ListingCreated(bytes32,address,uint256,uint256,uint256,uint256,address)","9e196881":"sellBlock(uint256,uint256,uint256)","9e1a00aa":"sendTo(address,uint256)","9e1a4d19":"tokenBalance()","9e1ad320":"XERA()","9e1b9078":"addLandRevenue(uint256,uint256,uint256)","9e1be663":"SeedMarket(uint256,uint256)","9e1bf732":"addNewTokenTo(address,uint256)","9e1c6d6b":"transferFromFund(address,uint256)","9e1d14f1":"getThresholdsLength()","9e1e1ca9":"monstersForSale(uint8)","9e1e60c7":"depositOffchain(address,uint256,uint256)","9e1e6528":"uncertify(address)","9e1f5599":"executeTokenTxn(uint256)","9e20437c":"digits()","9e206ed5":"blockSkills(uint256[])","9e208922":"scheduledTopUp()","9e20a9a0":"registerToken(uint32,address,uint8)","9e20afdf":"weekly_disbursement()","9e20b768":"distributedBonusStakes()","9e20f6c9":"walletEmail()","9e211ee8":"dayFinished(uint16)","9e213fb7":"callReplaceCallback(string,address)","9e2262f5":"testCreateCostData()","9e229c55":"StatEventI(string,uint256)","9e22bd72":"lengthArrayApproval()","9e231e2d":"abortGame(uint256)","9e23602e":"hasAllAttrs(uint256,bytes2)","9e238366":"getCraftingAuction(uint256)","9e239ace":"itemOwner(bytes32,uint256)","9e23c209":"removeDeveloper(address)","9e243259":"frozenRate()","9e24edca":"TOKEN_FOR_INVESTER()","9e251c6f":"DonationReceipt(address,string,uint256,uint256,uint256,bytes32)","9e254262":"contractDurationInDays()","9e254d13":"Child()","9e25ec01":"KAL5Token()","9e25fd58":"SotkoCoin()","9e27a305":"sachin()","9e281a98":"withdrawToken(address,uint256)","9e282328":"getEditionReleaseTime(uint256)","9e28739d":"LogAddressTokenCapCalculated(uint256,uint256,uint256,string)","9e288374":"getContributor(address,address)","9e28abaf":"ShareActive()","9e29559c":"teamKeepingQuota()","9e29739e":"setContributionLevel(address,uint8)","9e29eb0f":"getUsersAwaitingForTokens()","9e2abcb5":"getddd(uint256)","9e2d0478":"addNotaryToOrder(address,address,uint256,uint256,string,bytes)","9e2ed686":"cancel(address,bytes32)","9e2f04bf":"chooseWinner(uint256)","9e306d32":"MintableToken(uint256)","9e307955":"etherPrice()","9e30dd5f":"buyRareItem(uint256)","9e315d46":"payoutAmount(uint256)","9e31f9b6":"numGamesCheated()","9e321f42":"changeWhitelistOnly(bool)","9e3249ab":"setMinShards(uint8)","9e325b80":"SocialRemitToken(uint256,string,uint8,string)","9e326858":"private_AddGameBar(uint256,string,string,string)","9e331188":"startIco3(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","9e33f72c":"reclaimStarted()","9e34070f":"isClaimed(uint256)","9e340ffb":"endFreeGet()","9e34ba2f":"VUP_PER_ETH_ICO_TIER3_RATE()","9e34d78e":"getDrawCount(uint256)","9e352721":"PreBuy(uint256)","9e3572b5":"getCurrencyContract(bytes32)","9e35ff3e":"storeCarrotsCredit(address,uint32)","9e36fde7":"regName(string,address)","9e37273b":"getMintDigest(uint256,bytes32)","9e37c923":"subscriptionOf(address,address)","9e3809a9":"setFiscalVerify(bytes32,bytes32,bytes32,uint256,uint256,uint256)","9e385fa4":"raiseEmergency(bool)","9e38ac15":"ownerShip(address)","9e38c76e":"lockRedemption(bool)","9e39db38":"initChestsStore()","9e3a33b2":"_fetchPaidOrdersForMerchant(address)","9e3b34bf":"times()","9e3b77af":"lendingManager()","9e3b94f1":"CONFIRM_LIMIT()","9e3b9dc1":"secondTarget()","9e3c671c":"citizensAddresses()","9e3d0636":"numOfDeliveredCrowdsalePurchases()","9e3d1b99":"Bakt(address,bytes32,address)","9e3d2d06":"totalEtherBetValue()","9e3d49db":"walletBounties()","9e3d7809":"setParamsTransfer(bool)","9e3df458":"twentyThirtyAllocation()","9e3e230b":"setSubmissionClosed(uint256)","9e3e6878":"allCatsAssigned()","9e3edce9":"setImageHash(uint256,string)","9e3f1f71":"isPartOfOrg(string)","9e416812":"creditGameAddress()","9e4195f1":"releaseOrderStakes(address,uint256,uint256)","9e41a9cd":"viewCertificateByCourse(address,string)","9e41b73f":"getWeapon(uint256)","9e4307cf":"_95_ebetSmartContracti()","9e43692c":"FOUNDATION_POOL_TOKENS()","9e439ff8":"thirdPeriod()","9e455939":"getContractAddr()","9e459174":"_addDroneInternal(address)","9e45de73":"PieceTransferred(uint256,address,address)","9e45e0d0":"darknodeRegistry()","9e47214a":"isHarvestEnabled()","9e4734ba":"nextTimeout()","9e484dd4":"getMembersOfTierCount(uint256)","9e48d2fd":"setPayouts(uint256,string)","9e4902c9":"ZZCoin(address)","9e492aa6":"updateBLAddress(address)","9e497967":"CosmicPowerToken()","9e49e976":"importIssuerData(address[],uint256[])","9e4a5ade":"tokenICO()","9e4a613f":"setCertificate(string,string,string,uint256,uint256,string,string)","9e4a993b":"getGameStake(uint256,address)","9e4a9f2f":"SCComplianceService()","9e4ba1be":"testBuyTwoTokens()","9e4be339":"getPartners(address)","9e4bec3f":"senderIsProvider()","9e4c1357":"purposeWeiRate()","9e4d4d0c":"updateIcoEnding(uint256)","9e4ea320":"getterForTest(uint256)","9e4ece80":"getInvestorUnPaidAmount(address)","9e509af3":"NggaToken()","9e51051f":"initialRate()","9e524caa":"subMinutes(uint256,uint256)","9e5288a0":"getStep()","9e536132":"GetUserPools(address)","9e5406bf":"paymentWithCurrency(address,string,uint64,string)","9e551567":"PonziToken()","9e570d6f":"updateFighterStats(uint256,uint8,uint8,uint8,uint8,uint32)","9e584658":"newStandardCampaign(string,uint256,uint256,address)","9e58963f":"_clear(address)","9e58ad97":"getNormalCardList(address)","9e58cfd1":"decreaseBeneficiaryBalance(address,uint256)","9e58e1a7":"_addPartExperience(uint256,int32)","9e5914da":"setReferral(address)","9e59eb14":"getAllocated(address)","9e5ad3ea":"test_insert_findNoHintUpdateHead(int256)","9e5b241a":"getBorrowInfoByIndex(uint256)","9e5b53bb":"Crowdsale(uint256,uint256,string,string)","9e5cdaf0":"initialBankrollGrowthAmount()","9e5d0258":"regularDonations(uint256)","9e5d4c49":"executeCall(address,uint256,bytes)","9e5e86fa":"setEnforceKyc(bool)","9e5ece98":"updateLockDate(uint256)","9e5ee522":"tokensSoftcap()","9e5f1889":"partner2_address()","9e5faafc":"attack()","9e6031c6":"ZigZagToken()","9e60f8d6":"getPlayerSpaceshipBattleWinsById(uint256)","9e6371ba":"retire(address)","9e639858":"winPercent()","9e647aac":"getParameter(string)","9e6480fa":"A(uint256,string,string)","9e654dfa":"redeemForkedTokens()","9e65741e":"exchangePrice()","9e65a03a":"cancelSellCityForEther(uint16)","9e65c7e5":"updateLatestRevision(bytes20,bytes)","9e65fab0":"priceIsFrozen()","9e66cd38":"free(uint64)","9e67fa6a":"createArtwork(string,address,uint256)","9e686c0d":"getStaffLength()","9e687b6c":"retrieve(bytes32,address)","9e68ca82":"preValidatePurchase(address,uint256)","9e69383d":"TokenBatchTransfer()","9e697cd3":"startDateOfRestoreUnsoldTokens()","9e6985e2":"setbuyPrice(uint256)","9e6992b5":"BcengCoffeeToken()","9e69940d":"eachAirDropAmount()","9e69a6d2":"bountyTokensNotDistributed()","9e69c732":"take(string,string)","9e69f2bb":"premine()","9e6a5767":"previousTokenVesting()","9e6af2e3":"exchangeEthStb(uint256,uint256)","9e6afbda":"decreaseSpeed(uint256)","9e6bcba5":"getBoostFromTile(address,address,address,uint256)","9e6bdea0":"RegisterChallengeCreators(address,string)","9e6c0877":"__hasRole(uint256,uint256)","9e6cb42b":"voteEndTime()","9e6d4cd0":"joinRaceAndFinish(uint256,uint256)","9e6d6925":"setper(uint256,uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","9e6d95c7":"checkHGame(uint256)","9e6eda18":"fee(address,uint256)","9e6f2ea2":"Kin()","9e6f505b":"BiigoToken(address,uint256)","9e6fb394":"companionsListCount()","9e7010a8":"Dashidai()","9e72942c":"getBoosters()","9e72a9d8":"sendToMarket(uint16)","9e750316":"pushBlock(uint256,uint256,bytes32,bytes32,string)","9e757e7f":"bookOVISSale(uint256,uint256,int256)","9e75a7c8":"bitplusAddress()","9e75c483":"busted(uint256,uint256,uint256,uint256)","9e761bbb":"beneficiaryList(uint256)","9e76e30d":"tokenRateUsd()","9e776ff5":"getTotalBattleboards()","9e79800d":"getOwner(uint16,uint8,uint8)","9e7a13ad":"people(uint256)","9e7b8d61":"giveRightToVote(address)","9e7cf86b":"changeSettings(uint256,uint256,uint256,uint256)","9e7d101e":"setMaxLeaders(uint256)","9e7d24df":"move(bytes32,uint256,uint256)","9e7e514b":"DiceGame()","9e7fec98":"owner_time_limit()","9e80138c":"LendConnect(address)","9e80b731":"test_threeValidAssertFalse()","9e80cab0":"ownerSetRecommendProportion(uint16)","9e8110e6":"setQuery(string)","9e813938":"expiresAfter(address,uint256)","9e817c03":"ROUND_LENGTH()","9e81c4b3":"sendFunds(address,uint256,uint256,uint256)","9e81e254":"_getMaximum(bytes32)","9e8385d6":"regadr(address)","9e83abe3":"newExit(address,uint256,uint32[])","9e84158e":"setPLATAddress(address,address)","9e845173":"getCCH_edit_34()","9e84d44d":"challengerConvicted(uint256)","9e8558a0":"setSellExchangeRate(uint256)","9e85742e":"approveEscrow(uint256,uint256)","9e86d7a8":"setVnt(address)","9e86f8c5":"RequestFactory(address,address,address)","9e86fb86":"investOffer(uint256,uint8[])","9e87a5cd":"getPriceFeed()","9e87c1c6":"getLastSingle()","9e87fac8":"Paused()","9e8836e2":"THORToken()","9e890cb3":"netAmountBought()","9e893d64":"TheUltimateWorldDigitalCurrency()","9e8a0f57":"getWinRate(uint256)","9e8a41f4":"getOutCar(uint256)","9e8ab40c":"ICOReserveWithdrawn()","9e8af7e9":"migrateInvestorFromHost(address)","9e8bf603":"curReleaseAmount()","9e8c3543":"setAuditAuditor(uint256,address)","9e8c39ed":"updateHolidayState(uint8,string)","9e8cfe20":"insert(int8,int8)","9e8e23b7":"lastBlock_v5()","9e8e3ef4":"nftExits(uint16,uint256)","9e8e4add":"changeTurnLast(uint256)","9e8ee59a":"addNewTicket(address,uint256,uint256,bool)","9e8f152c":"showLock(address)","9e8f2750":"withdrawInviteReward()","9e8fcbe9":"previousRoundId()","9e906157":"FundingRules()","9e90ce6c":"tokensIssuedForBonusRangeOne()","9e90f9aa":"blackHole()","9e916157":"STAGE_2_START()","9e9188ea":"setDividends(address)","9e918c0a":"setMaxArtworks(uint16)","9e9198c2":"layers(uint256)","9e920587":"testOwnedAuth()","9e92448e":"setRepAvailableForExtraBondPayouts(uint256)","9e925746":"_checkAndCallSafeTransfer(address,address,uint256,bytes)","9e92c991":"getTotalRollMade()","9e92dfd8":"getFiatTransactionsCount(string)","9e931e6b":"getRequesters(bytes32,uint256)","9e93d0e4":"reinvestReturns(uint256)","9e945ff2":"amendPurchase(uint256,address,uint256,uint256,uint256,string,uint256)","9e9548cb":"LabelSold(address)","9e95670d":"erc20Received(address,uint256,address,uint256)","9e9593ce":"RewardPoolAddress()","9e95f280":"setRatePreIco(uint256)","9e962b39":"minimumContributionPhase1()","9e964025":"bonusTokenThreshold()","9e965f7e":"revertSuspendedPayment()","9e96a23a":"give()","9e975ca6":"NSPToken()","9e976d38":"toMonth(string)","9e9785ad":"payoutCursor_Id()","9e985ea6":"changeControllerContract(address,address)","9e987b20":"treePot()","9e997121":"getConfigAddress(bytes)","9e9a783a":"canCallWithAssociation(address,address)","9e9a87e5":"agree(address)","9e9aed62":"contractTokenBalance()","9e9b6d06":"createOption(bool,address,uint128,uint128,address,uint64)","9e9ce791":"BrainLegitCoin()","9e9d0718":"Invested(address,uint256,uint256)","9e9d3aa4":"FirstBloodToken(address,address,uint256,uint256)","9e9e5b85":"ARIToken(address,address)","9e9ea24b":"PRE_ICO_TOKENS()","9e9eb444":"winFreeGo(uint256,uint256)","9e9ec9e3":"getHashAddresses()","9ea03ccb":"fundingUnlockPeriod()","9ea064b2":"getLevelConfig(uint32,uint32)","9ea0b8f0":"addTeamGrant(address,uint256,uint256,uint256)","9ea0c08c":"announcementName()","9ea134bf":"getRedeemableReputationStaker(bytes32,address)","9ea1b79d":"getContentChannel(uint256)","9ea2104d":"firstReleaseAmount()","9ea23080":"STQPreICO3TestHelper(address,address[])","9ea27016":"setTokenIdsIndex(uint256,uint256)","9ea28b5c":"VestingMemberAdded(address,uint256,uint256,uint256)","9ea30fae":"getPokemonOwner(uint256)","9ea407be":"updateTokensPerEth(uint256)","9ea480ec":"allowanceFlower(address,address)","9ea55bb0":"updateFeeAmount(uint256)","9ea57930":"stampIn(address,uint256,uint256)","9ea58112":"setLethalBonusAtHits(uint256)","9ea67876":"returnNumber(uint256)","9ea69541":"updateTileBlockValue(uint16,uint256)","9ea71c37":"getDesignatedReportingDurationSeconds()","9ea73895":"hitCharacter(uint16,uint16)","9ea76475":"subFreezingTime()","9ea776cd":"currentFundingRound()","9ea82706":"removeRealWorldPlayer(uint128)","9ea8a418":"updateFunds(uint256,uint256,uint256,bytes,bytes,bool,bytes32,bytes32)","9ea94877":"getLandIdByKey(bytes8)","9ea98d55":"intersect(address[],address[])","9eaa4812":"isLastMilestoneAccepted(bytes32)","9eab0e29":"FinalisedCrowdsale(uint256,uint256)","9eab503a":"dividendAddr()","9eab5253":"getMembers()","9eabebe7":"setTransferTime(uint256)","9eacc166":"transferAnyERC20Token(address,address,address,uint256)","9ead1478":"setMaxAnimals(uint16)","9ead1b00":"loanBalanceOf(address)","9ead7222":"tokenList(uint256)","9eadd77c":"roundMoneyDownNicelyET(uint256)","9eae2453":"setSchedule(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,uint256)","9eae6555":"earlyContribList()","9eaeca9f":"getTokenReturnRate()","9eaeccf1":"TestToken(string,string,uint8,uint256)","9eaf17a1":"getCarveUpTokens()","9eb05f3a":"EarlySuccess()","9eb0ad03":"Exchange(address,address,address,uint256,uint256,uint256,uint256)","9eb180a7":"identifierToPrice(uint256)","9eb20aa7":"setPetLastTrainingTime(uint64)","9eb32fdb":"initializeContract()","9eb360cc":"updateRausPoint(int256,uint16,int256,uint16)","9eb44784":"getTokensForPresale()","9eb45706":"get_previous_asset_document_from_document(bytes32,bytes32)","9eb4da1c":"okamiTotalPurchase_()","9eb51bf1":"Goodluckcoin()","9eb59e00":"updateCursETHtoUSD(uint256)","9eb6c932":"ResetAllAmount()","9eb7294d":"transferRemainingTokens(address,uint256)","9eb7d170":"withdrawPendingBalance(address)","9eb81bd0":"unFreezeTransfers()","9eb866cc":"isBonusTime()","9eb8cbf3":"set_activity_details(uint256,string)","9eb9c68f":"stepBonusList(uint256)","9eb9dd3b":"getBetsProcessed()","9eba0196":"DYCOIN()","9ebafad6":"getLastAttackCount(uint256)","9ebb1250":"withdrawFinal()","9ebb5d3c":"getFreeCraigGrant()","9ebbf231":"setMinOrderSizeEth()","9ebc8c95":"isNeedLoan()","9ebca4ad":"setMasterRecruitmentAddress(address,address)","9ebe13a2":"END_ADDRESS()","9ebe4d98":"percentageQuarter2()","9ebf6d92":"Whitelist()","9ec0505a":"BING(uint256,string,string)","9ec12cfa":"sellsIngrWithoutDepletion(address,uint256,string)","9ec272b4":"getPremiumPack(uint256)","9ec32d45":"challengeWinningOutcome(bytes,uint16)","9ec35352":"returnRandom()","9ec3a90c":"verifyTimelock(bytes32,address,address,uint256,uint256,bytes32,bytes,bytes)","9ec40d1c":"checkCode(string)","9ec5a894":"rewards()","9ec68f0f":"multiSend(address,address[],uint256[])","9ec7486a":"GiveERC20()","9ec760df":"_sendMoney(address,uint256)","9ec7888f":"Available()","9ec79e99":"requestConsent()","9ec7e1c6":"nOS()","9ec8b026":"sort(uint256[])","9ec8eec9":"TokenImpl()","9ec92d42":"getSecondPhaseCap()","9eca085c":"isSupervisor()","9eca672c":"withdrawFor(address)","9ecbf341":"adminRescueFunds()","9eccf691":"setICOEnd(uint256)","9ece1d9c":"WeiToEther(uint256)","9ecf12cb":"HEART(uint256,string,string)","9ecf9037":"getNumberDonators()","9ed153c0":"master(address)","9ed1e4c6":"singleDigitBlock()","9ed26fe8":"setEtherInUSD(string)","9ed3b61b":"getTrustContract()","9ed3edf0":"transactionFee()","9ed44c91":"CharitySplit(uint256)","9ed474b3":"author2()","9ed49005":"completeIcoPart1()","9ed4ad43":"getMax(uint8[])","9ed53f88":"starExists(uint256)","9ed57360":"getPaintingSpeed(uint256)","9ed58c7a":"provideData(address,address,uint256,bytes)","9ed5c84c":"salePeriod()","9ed74a23":"createCloneToken(uint256,string,string)","9ed7772c":"OwnerSetPrizePool(address)","9ed78285":"GENEOS()","9ed78489":"Worldtvcoin()","9ed78df0":"PRESALE_TOKEN_SOFT_CAP()","9ed798be":"CrestToken()","9ed81bc9":"deregisterProducer(address)","9ed93318":"create(address)","9ed99951":"changeBntyController(address)","9eda7d23":"isContributor(uint256,address)","9edc7b44":"revokeStack(bytes32,uint256,uint256,uint256,uint256,uint256)","9edcebbb":"updateTabRap(bytes32)","9edd1bd2":"TestEvmStack()","9eddc441":"lockedAccountThresholdUsd()","9eddfb1b":"delay_pool_change_block(uint256)","9ede7a37":"voteCount(uint8,uint8,uint8)","9eded57a":"paybackLast()","9ededf77":"width()","9edf256d":"getShipPrice(uint256)","9edf42ff":"pendingNumbers(address)","9edfb647":"senderAllowedFor(address)","9edfb9ee":"acceptOwnershipOfVesting(address)","9ee035c9":"lookupCanonicalFormat(bytes)","9ee04661":"withdrawTeamFunds()","9ee06759":"setSquarePrice(uint8,uint256,address)","9ee0933f":"joinBounty(address)","9ee1bd0f":"whoIsOwner()","9ee22f9a":"setCompte_32(string)","9ee29ef2":"updateTargetToken(address,uint16,uint16)","9ee3518e":"setTeamMember(address,uint256)","9ee398ce":"getTierStartAndEndDates(uint256)","9ee484ce":"withdrawCerneuTokens(address)","9ee5451d":"PriceOneDisable()","9ee5555f":"setGovTax(uint8)","9ee60142":"_processBonus(address,uint256)","9ee61c9d":"testExistingVoteWeight()","9ee679e8":"requestWithdrawal(uint256)","9ee6a7c3":"onlineTime()","9ee6c0e1":"test_2_someTest()","9ee6ff70":"testSafeMul(uint256,uint256)","9ee71fae":"LogPolicyDeclined(uint256,bytes32)","9ee7fbd9":"extraRate(uint256,uint256)","9ee837f5":"total_empire_score()","9ee85a9f":"isPreSaleTokenRaised(uint256)","9ee8fa93":"yearLength()","9ee94556":"TestTokensMigration(address)","9ee9c8b5":"chetan(uint256,string,uint8,string)","9ee9dd5c":"vault_state()","9eea480f":"TotalRequestsAmount()","9eea4a3a":"address2()","9eea67e8":"_addPerk(uint8)","9eeaa7f4":"exitDuration()","9eeb30e6":"turnoff()","9eeb4920":"setLockup_simus(address,uint256,uint256)","9eeb5a6a":"Manageable()","9eeb6c11":"setBatchCeateDrawingsAddress(address,address)","9eeb79b2":"buildUrl(address,uint256,uint256)","9eec22e7":"reclaimEtherDeadline()","9eec4bac":"payoutFromContract()","9eec6e89":"TokenLogic(address,address,address)","9eed8369":"neWon()","9eee5787":"Standard_1()","9eee8041":"getPointSize(uint32,int256)","9eee85fe":"bookEarnings(address,uint256)","9eeea0d0":"PAOCoin()","9eeef510":"bidCustomAuction(uint256,uint256,address)","9eef6f65":"addRequest(address,address,bytes32)","9eefdd87":"enableAddress(address)","9eefde81":"BasicKNOW()","9ef0653c":"setICO4Phase()","9ef065bb":"fDiv(uint256,uint256)","9ef1204c":"vote(bytes32,uint256)","9ef13593":"decayedBalanceOf(address)","9ef1fbc4":"MudshotsToken()","9ef279d1":"burn(address[16],uint256)","9ef27b00":"closedAt()","9ef35c01":"setJackpotFeePercent(uint256)","9ef36bd1":"queueCount()","9ef40238":"getcoinsvotes(string)","9ef45a31":"someFunction2()","9ef46973":"guessFlip()","9ef48a31":"setBonusTokenRateLevelThree(uint256)","9ef5233f":"setByteSize(bytes32,uint256)","9ef53400":"getStaticArraySize()","9ef63e97":"paybackToOwner(address)","9ef6bf79":"store_ETH_to_contract()","9ef6ca0f":"left33(uint256)","9ef7a463":"exchangeRateForETH()","9ef7e723":"withdrawContractToken(uint256)","9ef887ec":"makeItRain(address[],uint256[])","9ef916ab":"setOriginalSupply()","9ef95545":"CheersWangToken()","9ef965d1":"RealEstateToken()","9ef974bb":"checkGlobalBalance()","9ef9df94":"transcoderTotalStake(address)","9efa776d":"tokenFallback(address,uint256,uint256[])","9efbae81":"FundTransfer(address,address,uint256)","9efbc411":"PICOPSCertifierUpdated(address,address)","9efc0190":"YORITEX()","9efc81fe":"minimal_token_sell()","9efc94a6":"kycLevel()","9efd1f0c":"startNextEra_(bytes32)","9efe6454":"Rena()","9efedc91":"getMyAccuAmount()","9efeefa5":"betAgainstUser(uint256,uint256)","9effb6a6":"CrowdFunding(string,string,string,uint256,address)","9f00237b":"minContribution(uint256)","9f005920":"accept(address)","9f00c0de":"btycsubmoney(address,uint256)","9f020d3a":"equalsNoCase(string,string)","9f022f05":"IMDEXsetAdmin(address,bool)","9f03711a":"withdrwleftovereth(uint256,address)","9f03c3b8":"hicsTokenPrice()","9f03d82f":"CGTToken()","9f047f3c":"fundProject(string)","9f04873d":"VILLAGE_INCREASE_RATE()","9f04996d":"bid(uint256,address)","9f052fea":"setMintRequestAddressMap(uint256,int256,string,address)","9f054b15":"SushiCoin()","9f05a36d":"getEnd()","9f0650d9":"etherPriceUSD()","9f06a579":"ViewBet(address,uint256)","9f06aa08":"collateralize(uint256)","9f0812cb":"_registerIfNeeded(uint256)","9f084b3a":"CAMS()","9f08a68c":"working()","9f08fc38":"subGlobalBlockValueBalance(uint256)","9f095e88":"asdf()","9f0a11ee":"buyPrice_wie()","9f0b17e3":"forward_transaction(address,uint256,bytes)","9f0b7f16":"Foo(string)","9f0be144":"getGreeksBattlePointsBy(address)","9f0d5f27":"depositAll(address)","9f0de490":"challengeOutcome(int256)","9f0e1986":"createGen0Auction(uint256,uint64)","9f0e3107":"get_timestamp(bytes32)","9f0e591b":"ABCDToken()","9f0e7d44":"companyReserves()","9f0eed0f":"GetCurrentICOCycle()","9f0f78ca":"profitsTotal()","9f10a990":"userEntries(address)","9f117317":"releaseManyStakes(uint256[],address[],address[])","9f118536":"initiated()","9f11e9cd":"setRegistrant(uint256,address)","9f126281":"updateFirstBuyer(bytes32,uint8,bytes32,address)","9f12fde0":"modifyBet(uint256,uint256)","9f1306cb":"P3DReceive()","9f132677":"MAX_CONTRIBUTION_WEIS()","9f13c4c7":"sealableProperties(uint256,bytes32)","9f147c41":"tokenPriceInCent()","9f15e729":"setgamecardname(uint256,string)","9f161d39":"BaseCrowdsale(uint256)","9f165304":"STAGE_PRESALE_ETHRaised()","9f166cf1":"multiBalanceOf(address,address[])","9f16b7d0":"setStarAuction(uint8,address,address)","9f16d65f":"fifthMonthEnd()","9f174c6f":"AIRDROP_SHARE()","9f180cf1":"calculateAccountValues(address)","9f181b5e":"tokenCount()","9f184dd5":"aggregateValues(address,address)","9f186edb":"setSpawner(address,bool)","9f19296b":"getGroupStatistic(uint256)","9f1aa404":"refundAllInvestorTokensPurchases(address)","9f1ae1c1":"FSATToken()","9f1ae6ac":"MAX_CARS_TO_GIFT()","9f1b3bad":"Receive()","9f1cda42":"ValidateEventStorage(bytes,bytes)","9f1eaa4c":"getUnsoldTokensWithDecimals(uint256,uint256)","9f1f07fe":"iWAMToken()","9f1f238e":"isChecksumValid(bytes32)","9f1f2d77":"_updateReferrerFor(address,address)","9f203255":"setAuditor(address)","9f204a47":"sendIncentivisation(address,uint256)","9f21edf6":"setLevelPAO(uint256,uint256,uint256,uint256)","9f223167":"ownerEth()","9f22af8e":"add2Y(address,uint256)","9f233c76":"Seiyuu()","9f237b43":"deathData_v9()","9f242bf5":"NUTScoin()","9f245957":"totalDiscountedItemsForSale()","9f275dec":"investBalanceOf(address)","9f2763d2":"newPurchase(string)","9f28f7c4":"toSCL(uint256)","9f28f8c2":"changeWhitelistedAddressCapAmount(address,uint256)","9f296b62":"getPaymentTotal(address)","9f29e1a1":"thisContractTokenBalance()","9f2a1471":"erc820Registry()","9f2a6374":"platformWalletAddress()","9f2b03b6":"LAB()","9f2b22c7":"CanYaCoin()","9f2bbcfd":"LoggerAuthorized(address)","9f2bc32b":"preITO()","9f2c1fd8":"ERC20(uint256,string,uint8,string)","9f2c9503":"mintAndLock(address,uint256)","9f2ccbcc":"buyAnimalsFromAnimalFactory(string,string)","9f2ce678":"vote(bytes32,bool)","9f2e0f9c":"managePlayer(address,uint256)","9f2e7ce3":"prevXRPCToken()","9f2eaf4e":"verifyCanWithdraw(address,address,uint256)","9f2ee8b8":"getBlocksByOwner(uint256,uint256,address)","9f2f077c":"totalTransformedTokens()","9f2f58ec":"void_race()","9f2ff221":"teama()","9f2ffaff":"_0xGoldToken()","9f30ca9a":"getOpenBidsByBidder(bytes32,address)","9f318ae8":"HKHCToken(address,uint256)","9f31de2e":"updateTokensForCloudexchangeTeam(uint256)","9f327124":"ReflexCoin()","9f329b15":"SpareCurrencyToken()","9f334696":"isNumRed(uint8)","9f337cce":"_createTeam(string,address,uint256)","9f33d9cb":"joinAsBuyer()","9f34ab0c":"PXGToken()","9f34ce14":"activateConflictResolution()","9f351fc0":"totalRedeemedCheque()","9f35910c":"getTeamOwner(uint32)","9f35caee":"getAllChainIDsOfUser(address)","9f35d3b2":"start(string,string,uint256,uint256,uint256,uint256)","9f37092a":"buyItem(address,uint256)","9f373a7a":"updateCandidate(address,string,string,uint256)","9f37b53f":"verificationSlashingPeriod()","9f396cff":"voteAgainst()","9f3c4416":"claimInheritance()","9f3ce55a":"sendMessage(address,uint256,bytes)","9f3d7b0b":"addProposal(address,uint256)","9f3e1846":"EscobarcoinToken()","9f3edbe1":"emissionStatusUpdate(bool)","9f3ef430":"payTokenHolderBasedOnTokenCount(address,uint256)","9f3f736a":"LIMITED_ADMIN()","9f3fab58":"a(bytes32)","9f3ff73a":"setExternalCurrencyProcessor(address)","9f406c8b":"isPreICOFinished()","9f408251":"TaTaTu()","9f4216e8":"userList(uint256)","9f4283fa":"jdaleveridgesyscoin()","9f43daf7":"sendEthTweet(string)","9f43ddd2":"expirationTimestamp()","9f44b34c":"EXT_COMPANY_TWO()","9f44fa19":"FeedbackUpdated(uint256,uint8,bytes32)","9f454f2b":"LEU(address,uint256)","9f45b45c":"getModuleByName(uint8,bytes32)","9f45c8ec":"nodeCheck(bytes32)","9f45f982":"PATH(uint256)","9f489e4e":"getDeposit(uint256,address)","9f494565":"LogMint(address,uint256)","9f49cefb":"addStage(uint256,uint256)","9f4aaaef":"asmName(address)","9f4ba0ee":"setInitialPrice(uint256)","9f4cd0ef":"current_item_index()","9f4e8405":"updatePaymentManager(address)","9f4f4808":"setCrowdfundAddress(address)","9f4f903e":"TicketToken()","9f4f9886":"getRateAt(uint256,uint256)","9f4fae14":"getAmountWeeklybyNum(uint32,uint8[4])","9f509ab1":"FUNDING_PRESALE_MAX()","9f5185b6":"EventCashOut(address,uint256)","9f51cf67":"balance_available_for_custom_voting()","9f5215dd":"availSupply()","9f5227c2":"confirmWithdrawal(address,string,uint256,string,address)","9f52b74e":"apt()","9f52f381":"startAllocation()","9f530cc9":"JACKPOT_CHANCE()","9f535821":"mint(uint256,uint256,string,uint8,bytes32,bytes32)","9f536edd":"setScore(address)","9f53e07b":"channelMaxSize()","9f544434":"sendFood(address,uint256)","9f548613":"MyUserToken(uint256,string,string)","9f549015":"Max_Mintable()","9f54c01c":"addProducer(bytes32,uint256,bytes1)","9f54c24f":"LogGive(address,uint256,string)","9f550293":"getTotalRaised()","9f55857d":"testBazMethod(uint32,bool)","9f55ecab":"currentVotingDate()","9f569ab4":"requestOfTime(address,uint256)","9f569e66":"sendTokensTo(address[],uint256[])","9f572048":"getCanvasByOwner(address)","9f5755ae":"announcement()","9f577c15":"setContractProvider(address)","9f57d16e":"getCurrentJackpot()","9f5892a7":"hash(string,uint256,uint256,address)","9f58d881":"executeOr(bytes32,bool)","9f591fa5":"deathData_v15()","9f59fc5a":"GetConsentDirectives()","9f5a5ff8":"Police_4()","9f5a851f":"configure(uint256,uint256,uint256,uint256,uint8,address)","9f5a9b7c":"getTotalBurnt()","9f5ac8f7":"creator(bytes32)","9f5b1d2c":"GITHUB_LINK()","9f5bd866":"setNodalblockURL(string)","9f5c11c4":"two_card()","9f5c671e":"MultipleErrorsContract()","9f5ce849":"CNT_Token()","9f5cfe03":"roundsCount()","9f5f0520":"myVault()","9f5f0826":"_bonusToPartners(uint256)","9f5f7c7f":"tokenSplit(address,address,address,uint256)","9f5ff50a":"calcTokens(uint256,uint256,uint256)","9f614b61":"addTitleTransfer(string,string,string)","9f6163ee":"lastBlock_v4()","9f621075":"ICO_AllowPayment()","9f624701":"DZONetwork()","9f6264d3":"setArray(bytes32,bytes32[])","9f62e202":"CrowdSale_AssignOwnership(address)","9f637851":"endICODate()","9f63f5c3":"approveLoan(address,uint256)","9f64b6fb":"sendAffiliateValue(uint256,address)","9f654dd2":"sellTokensIco()","9f659296":"createCardForAcquiredPlayers(uint256[],address)","9f65f242":"Itube()","9f665e1a":"offerAccepted(address,uint256)","9f668bba":"getGameIds()","9f674147":"accruedBonus(uint256,uint256)","9f674eb3":"myAccessLevel()","9f678cca":"drip()","9f6822b4":"startEscrow(bytes20,address,uint256)","9f684a0d":"disableATMExchange()","9f69b5a0":"updateEscrow(uint64,uint256,uint256)","9f6a4fbe":"CyteCoinERC20Token()","9f6b4cce":"BetPlaced(address,uint8,uint256)","9f6bd2a9":"isArbitrator(address)","9f6c20f6":"MRC(uint256,string,string)","9f6c3dbd":"join(address,address,uint256)","9f6dcd9d":"ETHtoZCOrate()","9f6e3456":"SOPHIYA()","9f6e4bb5":"weiAllowedToReceive(uint256,address)","9f6f99ee":"updateAPIPublicKey(bytes)","9f6fb2ba":"createRichContract(string)","9f6ff2e1":"EInvoicingRegistry()","9f70c3dc":"doWithdraw(address,address,uint256)","9f70db12":"removeEmployee(address,address)","9f727c27":"reclaimEther()","9f73bef1":"getSubjectsCount()","9f73dbc0":"getCurrTeamSizes()","9f7496ec":"_firstUnlockAmmount()","9f753df6":"MELON_BASE_UNIT()","9f75ccc8":"onSuccess()","9f75e990":"ReceivedCall()","9f7623b8":"sign(address,address)","9f769807":"setTokenState(address)","9f77920c":"Revoke(address)","9f789a0c":"setSchellingRoundDetails(uint256,uint256,uint256)","9f7904af":"available_with_bonus()","9f7a2ef5":"TEAMmint()","9f7a53a1":"sendBountyBalance(address,uint256)","9f7b0fc8":"getParent(address,uint256)","9f7b4579":"create(uint256,uint256)","9f7b967e":"SampleERC677Token(address,uint256)","9f7ba828":"getTokenToEthMakerOrderIds(address)","9f7c8851":"otherSupply()","9f7c94aa":"payoutWinners()","9f7d9f62":"deprecateDefenceSubtype(uint8)","9f7d9f92":"AggiungiMiner(address,bool)","9f7e03cc":"deposit70Percent()","9f7e1fed":"Lock(bytes)","9f7ed5b8":"startTimeTLP1()","9f7f0784":"appVersionListAt(bytes32,uint256)","9f7f2bd1":"createDog(uint256,address)","9f7f760c":"SimpleDice()","9f7ff381":"COMPLETION_STATUS()","9f8049ea":"distributeELTCLarge(address[])","9f807962":"buyMorties()","9f80d1b2":"presaleGoing()","9f810510":"ZONTEX()","9f8106cf":"transferAllUnsoldTokens(address)","9f819b13":"updateFunders(address,bytes32,string)","9f81c4d6":"bitcoingo()","9f83008a":"teamReserveWallet()","9f839d22":"getOptionPair(address,uint256,address,uint256,uint256)","9f853717":"duplicates(uint256)","9f855bd5":"shipLocation(uint16,uint16,address)","9f856de5":"doPurchase()","9f871242":"computeTokenAmount(uint256)","9f8743f7":"getRound()","9f87acd0":"exec(bytes32,bytes32,uint256)","9f87f419":"closeTierAddition()","9f881e0b":"MobSquads()","9f881f46":"checkPassed(address)","9f8970dd":"bountyTokensAccount()","9f8a13d7":"isActive(address)","9f8abede":"fixPermission(address,address,uint8,bool)","9f8adeb8":"givecandyto()","9f8ae5d3":"roundFourTime()","9f8aef2b":"ERC721Token(string,string)","9f8c45cf":"getQuestionDetails(uint256)","9f8c7c4c":"insertSums(uint256)","9f8e8209":"Cillionaire()","9f8f0dc3":"test_twoValidEqBool()","9f8f4c45":"developerPctX10()","9f8f4fb5":"withdrawAcquisitionsToken()","9f8ff91d":"getSponsorFee()","9f90279e":"f_priv()","9f903ff6":"setEmitter(address)","9f90688a":"SmartCityToken(address,uint256)","9f912d25":"abort(uint16)","9f915aca":"Tier_Starter()","9f91d145":"draftNewCardWithReferrer(address)","9f923388":"secondStageTokensSold()","9f9248c7":"DepositInterest(uint256,address,uint256,uint256)","9f927be7":"getNextCall(uint256)","9f941f69":"getDesignatedReportingEndTime()","9f943039":"Ethershares()","9f94d684":"irreducibleOf(address)","9f94fb7a":"endAtkBoss()","9f95de64":"transferToGrant(uint256,uint256)","9f961c5a":"salesPipe()","9f963c4e":"periodPercent()","9f96de0f":"getResourceCount()","9f9727ce":"QuotaManager(address)","9f977b21":"getBob(uint256)","9f97a024":"testEscapedQuoteInString()","9f97d937":"start_declaration()","9f97fdbb":"setDonationReceiver(address)","9f9827fa":"adviserPart()","9f98985d":"endGame(uint256,uint256)","9f98a45a":"fillOptionOrder(address[3],uint256[3],uint256[2],address,bool,uint96,uint8,bytes32[2])","9f98df30":"give(address[],uint256)","9f98e0f3":"addMerchant(address,string,string)","9f9936e7":"BullToken()","9f9938fa":"SILALAHI()","9f9a9b7d":"NDUXBase()","9f9ae633":"LademiA()","9f9b1048":"holderExists(address)","9f9b3d98":"softcap2Reached()","9f9b4c9d":"Unhalted(uint256)","9f9ea29d":"decodeLock(bytes)","9f9eac67":"ChangeName(string)","9f9f1fbe":"getRegionTax(uint16)","9f9f83dd":"remainingIssuableSynths(address,bytes4)","9f9fb968":"getDeposit(uint256)","9f9fe6bb":"acceptProvider(address)","9fa0f763":"buyDrugs()","9fa0fc4c":"pgoVault()","9fa2526f":"offline()","9fa45fa6":"sellMyStake()","9fa46754":"releaseBonus(address,uint256)","9fa4b6cb":"BetDex()","9fa50ab2":"voteDescription()","9fa5df9c":"decreaseAllowed(address,uint256)","9fa5e5d5":"setARKowner(address)","9fa6a6e3":"current()","9fa6f886":"NewParticipant(address,uint256,uint256,uint256)","9fa778d8":"UECToken()","9fa77b20":"reserveOf(address)","9fa80c6e":"rewardDistributionEnd()","9fa8e5a0":"SetEvaluate(uint32,uint8,uint64)","9fa92f9d":"home()","9fa9440c":"BDAYSALE()","9fa9559c":"getLastYearOfInflation()","9fa95bfe":"_emitJobPosted(uint256,address,uint256,uint256,uint256,bytes32,bool)","9fa987d5":"curPosition()","9fa9b04c":"ADVISOR_ONE()","9faa3c91":"beta()","9fab63c7":"ICOBIDToken()","9fabf4da":"remainigTokens()","9fac68cb":"burn(uint256,bool)","9fac6ddc":"withdrawLeftoverWei()","9fac9abf":"icoHasEnded()","9faceee4":"MemeToken()","9fad2dcb":"setTaxInBps(uint256)","9fae8fd8":"GayBananaToken()","9faea9c6":"setUnavailableFlat()","9faec3c9":"adminWithdraw(address,uint256,address,address,bool,uint256,uint8,bytes32,bytes32,uint256)","9faec927":"withdrawChunk()","9faefe0c":"sendNow(uint256)","9faf52ee":"teamTwoVolume()","9faf6fb6":"removeAddress(bytes32)","9faf7000":"manualSend(address,uint256)","9fafcf72":"PersonaRegistry(address)","9fb03244":"softcapMainSale()","9fb03c7f":"countLayersGasLimit(uint256)","9fb14d9b":"getRemainingBytesTrailingZs(uint256,bytes)","9fb1b5fb":"setJackpotGuaranteed(uint256)","9fb25d9e":"LeaderMessage()","9fb31475":"refundable(bytes32)","9fb3b7dc":"_setWeights(uint256[])","9fb3d489":"cancelProposalByCreator(uint256)","9fb42b1f":"numRequests()","9fb4c63d":"assertEq21(bytes21,bytes21)","9fb4d1b0":"_getDepth(uint256)","9fb52b6e":"dividendsGetPaid(uint256)","9fb5bdb9":"registerAsSeller(address,string,string,string,string)","9fb632c1":"private_withdrawBankFunds(address,uint256)","9fb65754":"FishProxy(address,address)","9fb65968":"presaleTokensDistributed()","9fb69839":"getTransactionInformation(uint256)","9fb6c796":"mint(bytes32,uint256,string)","9fb755d7":"setHotWallet(address)","9fb8657b":"getNodes(string)","9fb876c0":"getAllOwnersClaimPriceOfCard(address)","9fb8dd1a":"getBaseLockPercent()","9fb95205":"getWithdrawSum()","9fba2578":"summaryData(address)","9fbc6a1a":"EtherHellHydrant()","9fbdcef0":"setauctionotherfree(uint256)","9fbf538f":"addApprovedBattle(address)","9fc04ce2":"setMaxReferrerTokens(uint256)","9fc18031":"getNodesBatch(bytes32,bytes32)","9fc18d4b":"migrateDisabled()","9fc1d0e7":"forcedTransfer(address,address,uint256)","9fc1ff30":"InooviToken()","9fc20f60":"priceForSaleAdvertisement()","9fc21eeb":"wdrawBfr()","9fc23a74":"totalContractsAvailable()","9fc3587a":"releaseSupply(uint256)","9fc39549":"removeInvestorList(address[])","9fc3b4e7":"checkQuorum(uint256)","9fc3e53a":"controlstampdissolution(bool,uint256)","9fc53f30":"getIdByHash(bytes32)","9fc5852e":"BytePeachCoin()","9fc5ce2a":"initialMint()","9fc6ceac":"SponsorsQty()","9fc6d585":"percentageRecipient2()","9fc71314":"KontolToken()","9fc71b31":"transferToken(uint256)","9fc75354":"isMasternodeOwner(address)","9fc7a200":"startNumber()","9fc880f4":"weiRaisedAfterDiscounts()","9fc89294":"productTypes(uint8)","9fc8ed76":"serviceAtIndex(uint256)","9fc9141d":"calculateHash(bytes8,uint256,uint32)","9fc9278e":"returnAnyERC20Token(address,address,uint256)","9fc9ceb8":"HRWtoken(uint256,string,uint8,string,address)","9fc9d6c0":"FrannickToken()","9fcaa5ef":"extendMembership(uint256)","9fcb114c":"addSomeTokens(uint256)","9fcb29fc":"_assign(address,address,uint256)","9fcb7100":"approveAndCall(address,int256,bytes)","9fcbc6f1":"bitvimToken()","9fcbc738":"setIntermediate(address)","9fcc4767":"set_referral_fee(uint8)","9fcdec61":"buyPresale()","9fce2d80":"didCommit(bytes32,address)","9fce5c8e":"indexOf(address[],address)","9fce89a4":"intercrypto_recoverable()","9fcf11bb":"determineCurrentStage()","9fcf4115":"updateRoundEndTime(uint256)","9fcf89ee":"lastBlock_a13Hash_uint256()","9fd033ed":"isHolder(address,address)","9fd0506d":"pauser()","9fd1bd1f":"changeSelfAddress(address)","9fd1e7f6":"purchaseTokensERC20(uint256)","9fd3ad34":"setFunds(address,uint256)","9fd4da40":"totalInitialSupply()","9fd4f7d1":"replaceWizard(address)","9fd52984":"burnAfterSoldAmount()","9fd547fb":"PayeeWithdrawCapital(address,uint256)","9fd55832":"BrancheProportionalCrowdsale(uint256,uint256)","9fd64fea":"findAuditor(address)","9fd6adb3":"unVote(uint256)","9fd6d285":"AirdropMined(address,uint256)","9fd6db12":"mintingEnabled()","9fd7ca8a":"getCurrentTrancheIdx(uint256)","9fd859ee":"disablePreminer(address,address,address)","9fd8914d":"GameAAAToken()","9fd8b4f1":"redirectToPurchase()","9fd8bfb3":"voteCandidateOne()","9fd8c361":"CHECKgamberOne()","9fda3675":"MYYG()","9fda5ad2":"confirmedTimesByOwners()","9fda6271":"setElectionInfo(uint256,uint256,uint256)","9fdb35e7":"retriggerDrawOnOraclizeError()","9fdc0ea6":"getDirectoryLength()","9fdc3255":"_permittedPartnerTranferValue(address,uint256)","9fdc4d13":"isBuyable(string)","9fdc53b1":"registerLoanReplace(address,uint256)","9fdd32cd":"_drawFailure(uint32,uint8,string)","9fdd983f":"setAmount(uint256,uint256,uint256,uint256)","9fddd5a7":"SeedTestToken()","9fde4ef8":"winningOption()","9fdeeb5e":"teamVestingContractAddress()","9fdf057f":"setMiningToken(address)","9fdf9625":"seizeForWork(address,address,uint256,bool)","9fe005e8":"horseShoeNotForSale(uint256)","9fe03c59":"PayForPrivKey(address)","9fe14580":"BONUS_TIER_1_LIMIT()","9fe17cc2":"icoContractAddress()","9fe304a0":"catch_the_thief(address)","9fe34d9f":"isAllowedUser(address)","9fe39d85":"CHINESE_EXCHANGE_1()","9fe4712d":"schedule(address,bytes,uint256[8],uint256)","9fe4b663":"buyTokensInternal(address,uint256,string)","9fe5e868":"NewWallets(address,address)","9fe634b9":"getReleaseAuctionEndTime(uint256)","9fe6999a":"tokensFor1EthP5()","9fe72acd":"airDropsClaimed()","9fe7ac12":"removeBool(bytes32)","9fe7ba47":"updateFirstUnionIds(bytes32,bytes32)","9fe802f1":"transferEx(address,uint256)","9fe81f52":"changeTimeLimitMinutes(uint256)","9fe93231":"ICOEndedSuccessfuly(uint256,uint256)","9fe9bde0":"tripleRoomMin()","9fe9f623":"setTransferEnabled(bool)","9fe9fc1a":"SoldBlock(uint256,uint256,uint256,uint256,uint256,address)","9feb8d23":"amendClaim(uint8,uint8,uint8)","9fec4ac4":"SputnikPresale(address)","9fec8e3b":"addToWhiteListMultiple(address[])","9fec8e96":"claimedAmounts(address,address,uint256,address)","9fecb69f":"finishGame()","9fecf214":"XChain(uint256,string,string)","9fed35a6":"createBulkContributions(address[],uint256[])","9fed39c5":"numWhitelistedInvestors()","9feda172":"totalRice()","9fedb749":"setTeam(uint256,string)","9fee14ae":"getAllot(bytes32,uint8,uint8)","9fee597b":"extractEther()","9fef0ae1":"BetherFund()","9fef26ce":"buyTokens(address,uint256,string)","9fef93f8":"buyKey(uint256)","9ff00adc":"betOnOddEven(bool)","9ff031ce":"createEscrow(uint256,uint256,uint256,address,address)","9ff12bba":"removeContractMiniGame(address)","9ff1b56f":"lockInTime2()","9ff25fa4":"InitialDateChange(uint256,uint256)","9ff32b18":"grantAllowanceProxyAccess(address)","9ff33fd1":"getByInternalId(uint256)","9ff34878":"IPTVcontract()","9ff3487f":"ConsumerRemoval(address)","9ff36b54":"isClientPayed(uint256,address)","9ff390c1":"currentTotalBuyin()","9ff394a8":"goShort()","9ff4125a":"ICOendTime()","9ff47485":"isBetPossible()","9ff512fa":"getTransactionDetail(uint256)","9ff61487":"myBackerToken()","9ff652cb":"setToContractAddr(address)","9ff71ccb":"modifyCategory(uint256,string,string)","9ff7422d":"SurgeTestToken()","9ff7971b":"setWeiPerToken(uint256)","9ff8c63f":"issueMaxSynths(bytes4)","9ff9007d":"lastweek_winner1()","9ff93088":"settleGame(uint256,uint256)","9ffa0711":"CashOut(uint256)","9ffa43ce":"buyFST(address)","9ffaf32e":"resourceDelete(address,bytes4)","9ffb2ed5":"showRewards(address)","9ffbb57f":"SongTokenAdded(address,bool)","9ffc981f":"getDepositOwner(address)","9ffcc4c3":"getPayoutCumulativeInterval()","9ffd1c10":"TrueFlipICO(address,address,address,address,address,uint256)","9ffdb65a":"validateName(string)","9ffea547":"_purchaseOneUnitInStock(uint256)","9fff19ef":"_setValidatorWrotePart(uint256,address)","9fff37e0":"JACKPOT_SIZE()","a000812c":"Y1_lockedTokenReleaseTime()","a000aeb7":"weiReceived()","a0013419":"ShanxiCoin()","a001ecdd":"feePercentage()","a001ef87":"TestOneToken(string,uint8,string)","a00223ec":"_recordFirstClaimTimestamp(uint256)","a002b179":"getCandidateForApoderado(bytes32)","a003371e":"PreICOEarlyDays()","a003651d":"getNumberOfChoices(bytes32)","a0041286":"changeURL(string)","a00413bd":"resetReportTimestamp()","a004737a":"startPrePreIco(uint256)","a004ee5a":"isCustodianOf(address,address)","a00545b2":"claimPrize(address,uint16)","a00553a5":"WinnerIndex(uint256)","a005b87b":"NullMapTest()","a006b0e2":"_regName(bytes32)","a006e0e5":"phaseTwoLimit()","a0071552":"sellItem(uint256,uint256,uint256,uint256)","a007bc45":"getRateStages(uint256)","a008d288":"Pethreon(uint256)","a008d893":"isReferee(address)","a008f5eb":"_isNativeToErcBridge(address)","a0099b60":"deltaEFunc(uint256,uint256,uint256,uint256,uint256,uint256)","a00a3440":"mainSale1Limit()","a00a7a6d":"determineNewRoundMostInviter(uint256,uint256)","a00aede9":"scheduleCall(uint256,address)","a00afaa0":"ADMIN_GET_FEE()","a00b043e":"bonusTokenVault()","a00b603c":"getDNI()","a00c0a28":"Log2(string,uint256,uint256)","a00c3e72":"ExtendLife()","a00c9374":"afterSaleMinting(uint256)","a00ce377":"getIsContractValid()","a00ce6a5":"mintForReportingParticipant(address,uint256)","a00d7740":"setCUSDAddress(address)","a00d7b27":"myFirstHelloWorld()","a00dc9dd":"changesp1(address)","a00ddad1":"verifyBalance(address)","a00ec993":"setStarRate(uint256)","a00ee946":"existAccount(uint256)","a00f198a":"confirmOrder()","a00f64d6":"_soldOutsidePMZ()","a00f77e1":"getMemInvestor(address)","a00fd3c8":"register(uint256,string)","a00fd7c8":"getPayOut()","a00fe86b":"SaleAborted(uint256)","a00fff6f":"pendingManager()","a0109c9f":"incrementFee()","a0111086":"ParentFee()","a0113f18":"isCrowdsaleFull(address,bytes32)","a0129b00":"redeemSurplusETH()","a01317cb":"BlockHipo()","a0132df2":"validationTime(address)","a0135b2b":"updatefee(uint256)","a0135d04":"seSigner(address)","a013ab77":"isBuilt(uint256)","a013ad54":"BONUS_DURATION()","a013e4d0":"GouShiTokenFunc()","a014b9bd":"addReferralOf(address,address)","a015cb10":"claimOwnerEth(uint256)","a01701dc":"capPerAddress()","a01729a4":"communityCliff()","a0175360":"Approval(address,address,address,uint256)","a0175b96":"changeAllCosigners(uint256,address[],uint256[3],bytes,bytes,bytes)","a0179949":"feeAccount1()","a017ed35":"G12Coin(uint256,string,uint8,string)","a0187f91":"DataExternalValidation(address)","a018f2b2":"delegateProxyAssert(address,bytes)","a0193ff9":"allowed_contract()","a01a3a07":"LogTicket(uint256,address,uint256)","a01a478c":"getEnemyCombinationOfAddress(address,address)","a01a4cfa":"getMyInstancesOfAPackage(uint256)","a01b0c27":"getRegisteredContract(uint256,uint256)","a01bc729":"monster_attack(uint256)","a01bc8f6":"setdaily(uint256,uint256)","a01bfa79":"adminWithdrawBCEOPreSale()","a01c144e":"addPriceChange(uint256,uint256)","a01c489d":"setMaxFeeTrade(uint256)","a01c62f7":"isTransferLocked()","a01cb43d":"WithdrawFee(uint256)","a01de7ae":"BFToken()","a01e1a21":"setPendingReserveData(address,uint256,address)","a01eacc2":"Aerosyn()","a01fdbef":"approvePullRequest(bytes32)","a0214c1c":"mintClose()","a02172d3":"getAssData(uint256)","a0218b66":"getAccountAmount(uint256)","a021d76d":"deleteIssuer(uint256)","a022ac81":"test3Args()","a022c15e":"getTaskReward(bytes32)","a022da29":"increaseLoanOnBehalfOfRecurse(address,address,bytes32,uint256,uint256)","a022e283":"APOLLOCOIN_COMPANY_AMOUNT()","a0234a91":"supplyLockedA()","a023d4a7":"Redicon()","a023e7d3":"updateTrustRankAfterStoryExpiry(bytes12)","a024284d":"participantsForCustomSale(uint256,address)","a024ea16":"MAX_BOUNTY_ALLOCATED_TOKENS()","a025bcc3":"calculateFee(bool,bool,uint256,uint256)","a026348c":"pitboss()","a0263a5a":"addgodaddress(address,address)","a0268aea":"fcomToken()","a026946d":"ieth()","a026d7c4":"SunflowerToken()","a026da8c":"teamClaim(uint256)","a0270dbc":"resolve(uint8)","a02745af":"setarg_2_input(uint256)","a0275c05":"appendStock(uint256)","a02853ef":"BitcoinExchange()","a028554e":"setInitialMintingPowerOf(uint256)","a028aa1b":"distributeVariable(address[],uint256[])","a028d749":"caculateFee(address,uint256,uint8)","a02a338a":"tokensPerOneETH()","a02a34cd":"skinOfAccountById(address,uint256)","a02b114c":"setArray(bytes32,address[])","a02b161e":"unregister(uint256)","a02b1a51":"getPaid(bytes32)","a02b7fbe":"MANAGEMENT_TEAM_SUPPLY_LIMIT()","a02b9aac":"getPaymentDataByAddress(address)","a02c40e1":"qbxSourceToken()","a02c4b97":"holdAddress5()","a02c5279":"testIntegerKeyValue()","a02cf937":"feePct()","a02d2376":"SubContract()","a02e98df":"getAdd(bytes32)","a0305398":"getOtherMapValue(uint256)","a030b8e6":"restartsys()","a03189b3":"devPayed()","a0326040":"weekPot()","a0340625":"unfrozen()","a03435d1":"authorizerAddress()","a0345fca":"finalize(bytes)","a034b6cb":"vote(uint256,uint256,uint256,string)","a0354921":"setSTMPPrice(uint256)","a0355eca":"setTime(uint256,uint256)","a0355f4e":"decline(uint256)","a035b1fe":"price()","a036f0f8":"getUsableXPA(address)","a0376dfe":"getAskByUserID(uint32)","a0378730":"addReceivers(address[],uint256[])","a0385e1c":"superTransferFrom(address,address,uint256)","a038af35":"GetChallengeBetsInformation(uint256)","a0392897":"_decreaseApproval(address,address,uint256)","a039e3c7":"testSetNotTransferable()","a03b1ea9":"_getFee(uint256,uint256)","a03b66e5":"ZilleriumPresale()","a03c5832":"getPermissionParam(address,address,bytes32,uint256)","a03cc0b2":"setExchangeToken(address)","a03d0f06":"lockAccount(address,bool)","a03df051":"rentedLand()","a03eb806":"recoverAddressFromSignature(bytes32,uint256,address,address,uint256,address,address,uint256,bytes)","a03f254f":"getWebsocketUri()","a03f633a":"resetListing(bytes32)","a03fa7e3":"transferTo(address)","a03fb4c0":"makeTradeable()","a0417c9a":"updateAsset(uint256,string,uint256,uint256)","a0422d02":"COLOR_NOT_AVAILABLE()","a0422d31":"getApiById(uint256)","a0426fb2":"preSaleEnded()","a0428bbc":"balancesStaticoin(address)","a042b9c1":"newComment(bytes32,bytes32,string)","a04369f8":"addBoosterQuest(address)","a0437f63":"rewardBounty(address,uint256)","a043bb16":"tokensBoughtInBonusProgram()","a0440426":"purchaseProduct(uint256,uint256)","a044b070":"a(address,uint256)","a0452bfb":"dividendFee_()","a045fdff":"scheduleCall(address,bytes)","a0469b02":"inputToDigit(uint256)","a046c5f6":"NewStaticAdr(address)","a0472d6c":"blocksInADay()","a0489ac2":"draining()","a0493834":"unconfirmedSum()","a04a0908":"execute(address,bytes,uint256)","a04a59cc":"randMod()","a04a6ac8":"auctionEndPrice()","a04a85c0":"checkFrozen(address)","a04b3c2d":"mine_jade_ex(uint256)","a04bd02f":"getIsStartable(uint256)","a04cc350":"_addDefaultOperatorByTranche(bytes32,address)","a04ce2c5":"setArrayIndexValue(bytes32,uint256,uint256)","a04d4c60":"getDataColla_001_001(string)","a04da725":"SEXNToken()","a04e34bc":"weiAllowedToReceive(uint256,uint256,uint256,uint256)","a04f7bd1":"MMONToken()","a04fce5b":"MINDBODYToken()","a050975b":"requestReclaimContract(address)","a050d07d":"getNumWizards()","a05190f4":"BOT_ELEMENT_2()","a051b6b1":"phase_5_rate()","a052c595":"addTrustedPartner(address,string,string)","a052eae4":"writeStuff(uint256,int256,uint256)","a052f024":"addDonator(address)","a053ce1f":"referralRate()","a053eb9d":"OPERATION_STAKE()","a0548d2f":"redistributeLosingReputation()","a054cbea":"isPlatform()","a0557818":"getSireId(uint256)","a055d455":"run(uint40,uint256,address)","a055fe64":"_projectCommitNew(address)","a056469a":"extractFeeLength()","a0566330":"LJCJ()","a05693c6":"clearSmet()","a0572fda":"titleIds(uint256)","a0577762":"changeTechAccountAddress(address,address)","a0579801":"icoStoppedManually()","a057dade":"blackListUser(address,address)","a05809ff":"calculateTotalPayoutAmount()","a058ce51":"DigiCash1()","a059ffa6":"createNewTourament(uint256[])","a05a1218":"triggerStealManually2(string)","a05a70a7":"QTLToken(address)","a05b8ed8":"_execute(bytes32)","a05bba46":"getAllDepositorsCount()","a05c47ca":"ico2Max()","a05c7bda":"AuthorizeToTransfer(address)","a05d03fd":"currentSale()","a05d068d":"foundationTokensVested()","a05e1db7":"getBuyerfee()","a05e3bb0":"setBasicBallotsPer30Days(uint256)","a05e822a":"howManyOwners()","a05fc749":"CoinLotto(address)","a05fccef":"transferMultiple(address[],uint256[])","a0605a79":"ZTTBToken(uint256,string,string,uint8)","a060d498":"KillSwitchEngaged(address)","a060ecce":"checkPosition1(address,address,uint256)","a0617ad0":"totalMaxSupply()","a061eba0":"proposeVersion(address)","a0626939":"setFoundersTokensReserve(uint256)","a06285ed":"CharityInProgressSupply()","a062d5fe":"TOTAL_SATOSHI()","a063dae8":"equal(int256[],int256[],string)","a0641288":"redeemableBalance(address)","a064481e":"BokkyPooBahWuzHere()","a065a2bf":"distributeFAITH(address[],uint256,uint256)","a0660943":"computeSlaves(address,address)","a067412b":"assignInitialAddresses(address[])","a0684251":"remainder()","a068e8d3":"convict(uint256,uint256,uint256,uint256)","a068edb5":"determineOutcome()","a0695f24":"assertBalances()","a0695fc2":"startIcoOne()","a06ac637":"listUserRecasts(address,uint256,bool)","a06aceb2":"ATCController()","a06b7eb0":"decreaseLockedAmount(address,uint256)","a06c5a24":"monthlyPrice()","a06caae8":"TransactionSettled(uint256,uint256,uint256)","a06cab79":"Registrar(address,bytes32)","a06ced75":"RESERVE_LOCK_TIME()","a06d083c":"credit()","a06db7dc":"gracePeriod()","a06dd6dc":"emergencyFlush()","a06de4d9":"rand8(uint256,uint8,uint8)","a06e09f1":"PrivateSale(address)","a06e58ac":"isResolvedForComplainant(uint256)","a06ef4f2":"icoAmountBonus3()","a0712c3d":"feesRateTeam()","a0712d68":"mint(uint256)","a07245fd":"getHtlcPaymentBlock(bytes32,bytes32)","a0726b72":"getPresaleRaisedAmount()","a072f02b":"idvRegistry()","a0742666":"isParticipant(address,address)","a074d5ee":"unClaimedEther()","a0759e14":"setEmontRewards(uint256,uint256)","a075e164":"setup(uint256,uint256,uint256,bool)","a076da7a":"notifyExecuteSellOrder(uint256,uint256)","a076e223":"Declaration()","a077321c":"restrictUntil()","a0775baf":"AUTBToken()","a0776a59":"getTokenSupply(string)","a07778ec":"icoBonus3EndDate()","a077b298":"restrictions()","a077c657":"giveRightVote(address)","a078f737":"hasUserRole(address,uint8)","a0790cb7":"setFreezed(address,bool)","a0796236":"rejectWithdrawal(address)","a07b206f":"totalWhiteListed()","a07b2461":"proveIt(address,string)","a07c132b":"setPrevOwner(address)","a07c4fcf":"getTapRemaining()","a07c765f":"END_TIMESTAMP()","a07c7ce4":"burnable()","a07c8ed9":"changeName(bytes,bytes)","a07c9156":"UpdateWhiteListImplementation(bool)","a07da887":"deploy(address,uint256,uint8,address,uint256[])","a07daa65":"newRequest(uint256)","a07ead73":"setColdWallet1(address)","a07f0a98":"DEFROST_AFTER_MONTHS()","a07f3a56":"isAttended(address)","a07f3bb0":"UpgradeableStandard23TokenMock(address,uint256,bytes32,bytes32,uint256)","a07f5f84":"beneficiary3()","a07f8f19":"isCrowdSaleFinished()","a07fc020":"moveToRST()","a080249b":"BonusPoolSupply()","a08038be":"setPreferredCurrency(bytes4)","a080c8ba":"getLamboModel(uint256)","a081fc19":"deathData_f6()","a082022e":"Sell(address,address,uint256,uint256)","a0821be3":"availableBalance(address)","a0823111":"removeAffiliate(address,bytes32)","a08299f1":"divisionby0(uint256)","a082c86e":"DEADLINE()","a0831fdb":"BNBB(uint256,string,uint8,string)","a0836e28":"getaddressret(address,address)","a083cb48":"TokenBase(uint256,string,string)","a0844bb5":"_computeRarityBonus(uint256,uint256)","a0847a95":"updateRoundBalance(uint256)","a084af95":"Trust(address[],uint256,address,bytes)","a084ee76":"removeReturnAgent(address)","a0851928":"convert_valuation_to_art(uint256,uint256)","a0852bbd":"SynTokenAddress()","a0859845":"emitPreferredCurrencyChanged(address,bytes4)","a0876445":"artworkCount()","a0877304":"minSale()","a08783bf":"Moviecoin()","a087ac0c":"perDeadLine()","a087ae89":"calculatePeriodsCountAndNewTime(uint256,uint256)","a0893ef2":"releaseSupply()","a0895ec1":"LogUnfrozenTokens(string,address,uint256)","a089feea":"kill_switch()","a08aa298":"NewSupplyAdjuster(address)","a08b1447":"presaleAmountETH()","a08b3367":"EC()","a08c0908":"getFiatTransaction(string,uint256)","a08d3f83":"Etheropt(uint256,string,uint256,uint256,bytes32,address,int256[])","a08df770":"changeRecoveryFromRecovery(address)","a08e3f0e":"restTokensMoved()","a08e8b36":"totalFunctions()","a08ed1cb":"initUnstake()","a08f1b09":"getArrUintField2()","a08f8428":"BasicTokenWrapper(address)","a08fcabb":"setUint(bytes4,uint256)","a09037a9":"totalContracts()","a09107e1":"only6()","a0922e15":"calcTransferFee(uint256)","a0927a6a":"authorizedPayments(uint256)","a0929cda":"salvageTokensFromContract(address,address,uint256)","a092ae25":"getMyAllowance()","a094a031":"isReady()","a0954a49":"changeEarnings(uint256)","a09635b0":"_transferToICAP(uint256,bytes32,uint256,string,uint256)","a09686c4":"getRoundsCount()","a096ea1b":"bltRetainedAcc()","a0979332":"Bitcoineum()","a098a04b":"getRandomAnimalId()","a0996799":"getMyBulls()","a0997b66":"ROLE_RBAC_ADMIN()","a0999436":"ESOPAddress()","a099ad85":"workingState()","a099d079":"getEarlyIncomeByAddress(address)","a099e6be":"updateTokenExchangeRatio(uint256)","a09a05e0":"AllocateUnsoldTokens(address,address,uint256)","a09a1e22":"dealSellContract(uint256,string,uint256,uint256,string)","a09ae0aa":"absDiff(uint256,uint256)","a09b39ae":"WorldCup(string,string,uint256,uint256,string)","a09b7e2b":"totalPresaleBase()","a09cca93":"ownerTransferOwnership(address)","a09cec67":"_setData(uint256,uint256,uint256)","a09d4240":"UacCrowdsale(address,address,address,address,address,address,address,address[])","a09d4ae4":"returnTempTokens(address)","a09d9c09":"setTransferRate(address,int16)","a09ddd4f":"setSaleAgent(address,bool)","a09ddf4e":"getCurrentRgb(address)","a09de28d":"approveAndCall(address,uint256,bytes,address[],uint256[])","a09e3d0a":"getChildCount(bytes32)","a09e9c1d":"startBidding(uint256)","a09f6691":"LogGetMoneyBack(address,uint256,string)","a09f8659":"newConflictRes()","a09fb22e":"updateReputation(string,uint256,uint256,string,string,address)","a0a0d331":"COMPANY_WALLET()","a0a1082a":"createCustomVUP(address,uint256)","a0a2b573":"setTimestamp(uint256)","a0a2c11d":"ListValSince(uint256)","a0a2f629":"setReferralId(uint256,address)","a0a337e2":"getSetupFunctions()","a0a3ec6d":"getDividentsFromShare(uint256)","a0a4cb6c":"reveralSupply()","a0a4d9df":"batchTransferORSB(address[],uint256)","a0a5cd92":"OkapiToken()","a0a695fe":"registerTier1Users(address[])","a0a6e940":"finalizePresale()","a0a7131c":"test_twoValidAssertFalse()","a0a7299b":"feeInBps()","a0a76eb0":"charactersOf(address)","a0a7dc2e":"withdraw_1Completed()","a0a7e0f8":"GameCellCoin(uint256,string,uint8,string)","a0a8045e":"getEthUsdPrice()","a0a86de3":"PreSaleTokenSoldout()","a0a8e460":"contractVersion()","a0a95502":"reading_card_count()","a0a986f1":"price0()","a0aaa87f":"secondStageMinted()","a0ab2847":"tfg()","a0ab308c":"BidAskX()","a0ab7091":"_isCooldownReady(uint256,uint256)","a0ab9653":"execute(uint8[],bytes32[],bytes32[],address,uint256,bytes,address,uint256)","a0abdba0":"allocatorAddress()","a0ac47fe":"_ethereumToTokens(uint256)","a0ac5776":"claimBooty(uint256)","a0acb9dd":"getA(string)","a0ad04c0":"changePhaseToICO()","a0ad51a6":"KNOW()","a0aead4d":"getAssetCount()","a0af0127":"world(uint256,uint256,uint256)","a0af3252":"thirdCurrentAmount()","a0afd731":"dividendBalance(address)","a0afebbc":"emitContractAdded(address,address)","a0affbfd":"upgradeHGT(address)","a0b06190":"addOneUserIntoWhiteList(address)","a0b091e4":"sellMFCoins(uint256)","a0b1b385":"playerSetInput(address,uint256)","a0b1f668":"GetRandom_In52(uint256)","a0b28861":"createAndBuyAllAmountBuyEth(address,address,address,uint256,address,uint256)","a0b2995a":"GetParticipantRole(address,address)","a0b2becb":"getLastAcceptedProposals()","a0b31d58":"addPacksToNextPremiumSale(uint32[])","a0b3bef0":"NVBToken(uint256)","a0b4388a":"activateShip(uint32)","a0b43a4e":"getWinnerPot()","a0b45df2":"transferOwnershipAndToken(address)","a0b498a4":"issuedTokens(address)","a0b55095":"allGames(uint256)","a0b5cf5f":"changeResolverAllowancesDelegated(string,address[],uint256[],uint8,bytes32,bytes32,uint256)","a0b65332":"getProposalIdByIndex(uint256)","a0b70e87":"capTokens()","a0b76d49":"JToken()","a0b7967b":"getNextSequenceId()","a0b7dcb4":"_transferInternal(address,address,uint256,bytes,string)","a0b7ebbd":"isExistingPlayerInBattle(string,address)","a0b7f0f8":"updateContributorAddress(address,address)","a0b87d1e":"MuseumsChain()","a0b9e8d5":"getRaisedAmountOnEther()","a0b9f0e1":"checkPause()","a0bb233c":"changeFeeAndCheatWarrant(uint256,uint256)","a0bb7508":"_addSig(bytes32,address)","a0bc572b":"benefactor(uint256)","a0bcfc7f":"setBaseUri(string)","a0bd1ec1":"hodlerTransfer(address,uint256)","a0bd3c0f":"scheduleCall(address,bytes,bytes,uint256)","a0bdb04e":"tier1Start()","a0bdcd3a":"BCNewToken()","a0bde7e8":"getShareDistributionWithTimestamp(bytes32)","a0bde945":"buyCity(uint16)","a0be06f9":"adminFee()","a0be2d9d":"Inco(address)","a0bee465":"BrylliteToken(address,uint256)","a0befa94":"getStake(uint256,uint256)","a0bf0539":"_checkThreshold()","a0bf775f":"canTransferBefore(address)","a0c01e58":"divForPrice()","a0c07002":"ArcBlockToken()","a0c16fb6":"HuobiPoolToken()","a0c1ca34":"migrateIn(address,uint256)","a0c1e119":"unhaltFundraising()","a0c32df7":"TRMToken(address,string,string,uint256,uint256)","a0c354ea":"getSumAmountOfOpenDeals()","a0c3bc68":"setOverflowBounds(uint256,uint256)","a0c42ed1":"getPOOL_edit_12()","a0c567a2":"blackListActive()","a0c57eb4":"checkCrowdsaleState()","a0c642bd":"multisendFrom(address,address,address[],uint256[])","a0c66283":"ZEROCoin()","a0c66b43":"maxActiveCastle()","a0c6e65e":"getResourceBalance(uint16,address)","a0c73e7c":"HDAToken(uint256,string,string)","a0c86718":"assetOwnersIndexes()","a0c8ad10":"removeAuthorizedExternal(address,address)","a0c8c156":"emptyCart()","a0c8e0ff":"testCanSendEthToContractWhenCrowdsaleInProgress()","a0c95e24":"disableBuyingTime()","a0c96e43":"getCommissionTarget()","a0c97bce":"paySeller()","a0c99c51":"paymentInfo(address,string)","a0ca0a57":"backlogLength()","a0cce3d2":"getAssetIdCreator(uint256)","a0cde1f0":"finishCrowdCoin()","a0ce4ff8":"priya()","a0ce8a0e":"SingleSourceAuthority()","a0cecb3b":"findOutInterestByBank(uint256,uint256,uint256)","a0cf01d4":"MoneroGold()","a0cf17da":"amountFunded(bytes32,string,address)","a0cf8857":"setTransferFeeAbs(uint256)","a0cfbc1b":"getDeploytimeBlocktimeBlocknumber()","a0cfc196":"getNumWineryOperation(bytes32)","a0d045bc":"AppleToken()","a0d0b13d":"addBook(string,string,string,string)","a0d0be4f":"calculateValue(uint256,uint8)","a0d0ee3b":"buildTokenContract()","a0d121a9":"addPolicy(uint256,uint256)","a0d1de29":"sendSeedAndHash(bytes32,bytes32)","a0d1f9e9":"serviceIncreaseBalance(address,uint256)","a0d3253f":"spawn(uint32,address)","a0d39949":"_rewardUnnapprovers(address)","a0d46c87":"validateRequestParams(address[3],address,uint256[12],uint256,uint256)","a0d578f4":"isServerEnable(string)","a0d605c6":"addCertificationDocumentInternal(address,bytes32)","a0d63f7e":"setDistributionMinimum(uint16)","a0d7bb1b":"addReserve(address,bool)","a0d80e65":"internalNoter(uint256,uint256)","a0d81b21":"ConsentFile(address)","a0d87fc2":"burnFromOwner(address,uint256)","a0d8848c":"getTicketStartPrice()","a0d8ad85":"_updatePayment(uint256,address,uint256)","a0d8b4bd":"changePresaleDiscountPercentage(uint8)","a0d8b4e9":"ownerMintRate()","a0d8e231":"SmartpoolVersion()","a0d9669c":"test_invalidAddressNotZero()","a0da3236":"ActionMining(address,uint16)","a0da7d2e":"addressLocked(address)","a0db0a22":"right4(uint256)","a0db844f":"F2UPAY()","a0dbd8d6":"startBlockNumber_()","a0dbde9d":"logBase2(uint256,uint256,uint256)","a0dc6b74":"emergencyPay()","a0dce445":"nothingLib()","a0dd678b":"VCFToken()","a0ddb418":"currentKey()","a0dde02a":"AftabCoin()","a0df9538":"walletOwnerAddress()","a0dfc61f":"DICE_LOWER()","a0e06c8a":"weekPotHighscore()","a0e0c317":"getTradeOfferRecipient(uint256)","a0e1001e":"IiinoCoin(string,string,uint8,uint256,int256,uint256)","a0e16fed":"getFinalizationTime()","a0e1f42c":"addPurchaser(address)","a0e23ebd":"openAt()","a0e2abf7":"getFirstActiveGamble()","a0e4d7d4":"getManifestIdsByName(address,bytes32)","a0e5588a":"paymentAction(uint256,address,uint256)","a0e5bb69":"setPI_edit_17(string)","a0e5e821":"recordDealCancelReason(uint256,address,uint32,uint32,uint256,string)","a0e67e2b":"getOwners()","a0e6a44b":"getCustomerTxPaymentMCW(address,bytes32)","a0e724d3":"ReserveKnown(bool,address,uint256,uint256)","a0e7b4dc":"lastAmountSent()","a0e8b6b0":"the_address_for_option_A()","a0e8d21f":"join(address,string,string,uint256)","a0e8ef3d":"SetUSDPerETH_byContract(uint256)","a0ea0ef9":"constructionStart()","a0ea83dd":"SetSummRew(uint256)","a0eaa5dd":"lastTokenIsTransferableNumber(address)","a0eb5dd1":"AIRDROP_TOKENS()","a0ec4e09":"getUltimateOutcomes(bytes32[])","a0ec7f89":"transferPresaleTokens()","a0ed4cff":"MiniMeToken(address,address,uint256,string,uint8,string,bool)","a0ed6707":"EtopayNetwork()","a0eda9f2":"_transferFee(address,uint256,string)","a0edc204":"noOfPhases()","a0edc671":"USDtoHAV(uint256)","a0edcd7a":"burnPercentage100m()","a0ee153e":"isOwnerOrApproved(uint256,address)","a0ef8647":"BlueToken()","a0ef91df":"withdrawEth()","a0efe255":"m_categoriesCount()","a0f029fc":"ContractorInterface(address,address,address)","a0f04c38":"getKittyPower(uint256)","a0f0e95f":"DDJBTC()","a0f15b87":"registryICAP()","a0f1665b":"PriceSet(uint256,uint256)","a0f1ba62":"isOpenDistributionSetup()","a0f24ea7":"getTotalTokens(uint256,uint256)","a0f4a9a9":"Challenge()","a0f4d3df":"getRandomForContract(uint256,uint256)","a0f52da0":"startMigration(address)","a0f561ca":"ExtractDepositTime(address)","a0f61310":"FakeRelay(bytes)","a0f72985":"PassToken()","a0f78572":"Leaderboard()","a0f7bbcd":"sendTokensToAdvisors(address)","a0f82817":"Max()","a0f8be8c":"startOf(uint8)","a0fa0fb4":"ConstructorTest(uint256,uint256)","a0fa930a":"Ethercoin()","a0faf6a1":"getPortion(uint256,uint256,address)","a0fb1497":"deleteDocument(uint256)","a0fb7f57":"GMET()","a0fc4994":"setX(int256)","a0fe6202":"SHA256(string)","a0ff1705":"depositTokenFunction(address,uint256,address)","a0ffe7bb":"registerInNewMarketplace()","a0fffd5f":"rand(uint32,uint256)","a1007e68":"TokenAmountToPay()","a10132ad":"callbackGas()","a1013abb":"TOKENS_DISTRIBUTED()","a1017649":"updateWalletLock()","a101c2d3":"time_out()","a101f7cd":"bountyFee()","a1022294":"Guess(string)","a1029aff":"findTile(uint16,uint16,uint16)","a102e8a5":"addMeterpoint(int256,address,int256)","a103983c":"BitShopperToken()","a1049c06":"Zolox()","a104dcd4":"changeUpgradeAgent(address)","a104e5e1":"recordNewOwner(uint256,address)","a1057852":"addToken(address,uint256,string,string,string,string)","a106320a":"icoFinalized()","a1063d20":"addIntermediateAddress(address)","a106832b":"disableInitialAmbassadorStage()","a106dbc8":"participantsFor1stSale(address)","a106f0bf":"bonusAmtThreshold()","a107994e":"test_validProxyOwnershipTransfer()","a107ceb6":"affiliateUtility()","a10874d9":"SquirrelGims()","a1088571":"CEO()","a10889fa":"setVersion(uint32,uint32,uint32,string,string)","a10954fe":"reserveBalance()","a109a089":"addWalletAddress(address)","a109b8bd":"feesCal(address,uint256)","a10a7782":"defaultReputationReward()","a10b10f5":"setFriendsFingersWalletForCrowdsale(address,address)","a10b3ffd":"ALLOC_PARTNER()","a10bee85":"_transferFromWithReference(address,address,uint256,string)","a10c0fd5":"ROLE_MULTIOWNER()","a10c44fb":"s18(bytes1)","a10cda99":"isWhiteListed(address,address)","a10d4f56":"updateCaps(uint256[])","a10d6a51":"officialTelegram()","a10d80de":"quitBattle(uint256)","a10daf4b":"GroupMultiplier(uint256,uint256)","a10e057c":"preIcoMinimumWei()","a10e6d28":"arbitrationFeePerJuror()","a10ec6e5":"initialize(address[4],address,uint256[12],uint256,bytes)","a10edc55":"GeneralPurposeProfitSplitter()","a10ef122":"WWWToken()","a10f0f5a":"addField(string,uint256)","a10f42c4":"isICOEnded()","a10f43a3":"bountyReward()","a10f5610":"authoriseAddress(address)","a10fc32f":"setInstantTransfer(bool)","a110063a":"createGOP(address,string)","a1103f37":"attrUUID(address,uint256)","a110d350":"finalPot()","a1119bf2":"bountyFeeCount()","a111b0da":"InternationalTourismCoin(uint256,string,uint8,string)","a111bab9":"totalLockAmount()","a11223da":"airdropTokens(address[],uint256)","a1130d04":"createTemplateAndAskQuestion(string,string,address,uint32,uint32,uint256)","a1131e14":"withdrawSale3()","a113bf2c":"ZITOKEN()","a114b5ae":"_createZodiac(uint256,uint256,uint256,uint256,address,uint256)","a1155286":"deleteOrg(string)","a1155f5c":"buyBlockCDN()","a1158c43":"commissionCheck(uint256[],uint256[],uint256[],uint256)","a1159838":"removeFreeze(address)","a115e38f":"VirtueToken()","a11674b0":"divsOf(address)","a1169d72":"_payChain(uint256,address,uint256)","a11748fd":"ReceiveGBP(address,uint256)","a1183d50":"FixedSupplyToken()","a1188e56":"getCurrentDifficulty()","a118babd":"withdrawPayment()","a118ca27":"validateStep(uint256[],uint256[])","a118f249":"addAccess(address)","a1190a36":"withdrawOtherTokens(address)","a11976f6":"confirmTransactionAfterDisputeFee(uint256)","a119a65a":"gettodayget()","a11aab78":"createGame(uint256[],uint256[],uint256,uint256)","a11ab71a":"fundsToCommunity(uint256)","a11bab06":"GChain(uint256,string,uint8,string)","a11df9c7":"PlanetZeroToken()","a11e1645":"registrationRights(address)","a11e22d9":"toDate(uint256)","a11e7f5e":"get_iconiq_presale_open()","a11ed157":"setBirthFee(uint256)","a11f8de4":"FomoToken()","a1206d4e":"setUserContract(address)","a1207708":"confirmDividends()","a120fdbd":"dayTokenAddress()","a1210a69":"endIcoDate()","a1211bc0":"finalizeCampaign()","a121d8df":"testFailCreateWithParentSameItemId()","a122e060":"rateForPhase3()","a12301f5":"promethCount()","a1232723":"playerPrizes()","a123422e":"_setContributor(address,uint256)","a12396aa":"setName(uint256,bytes32)","a123c33e":"owner(uint256)","a12412f0":"CAT_PER_ETH_BASE_RATE()","a12433fa":"getLastAttack(uint256)","a1243ad3":"mintPartners(uint256)","a12498dd":"ownerEnablePayee(address)","a125c824":"setDefaultTokenURI(string)","a1264994":"setfounderAddress(address)","a126c5df":"GAS_TO_AUTHORIZE_EXECUTION()","a126d601":"closePosition(uint256)","a127cfb6":"LogRequestAccepted(address)","a12842cc":"sellMyTokens(uint8)","a1291f7f":"ownerTransfer(address,address,uint256)","a1298368":"stringEqual(string,string)","a129cb94":"summPremineBounty()","a129ecda":"SetdivForSellBack(uint256)","a12a52dc":"allOwners()","a12a6bb0":"KYC()","a12c2564":"preEndTime()","a12c7dd8":"presaleContribute(address,uint256)","a12cad70":"getPayer(bytes32)","a12d2de3":"withDrawToPoolOwnerFee(uint256)","a12d7e2c":"WubCoin()","a12da89f":"Deviser()","a12e429c":"getDiscipleNum()","a12e55d9":"rollIt()","a12e9670":"setMaxETHContribution(uint256)","a12ee7ba":"changeMaintainer(address)","a12f69e0":"divides(uint256,uint256)","a1315b7e":"createPricing()","a132a785":"removeOwner(address,bool,bytes)","a132aad1":"startPresale(uint256)","a132ab82":"startAirdropTime()","a132e336":"changeDeedPrice(uint256,uint256)","a1338118":"increaseAllowance(address,uint64)","a1344589":"vestedTo(address,address)","a1347622":"t_Michail2()","a1350c00":"migratePropertyOwnership(uint16[10])","a13615a5":"desposeBear(address)","a1365fda":"dev_streamsLength()","a136aadc":"getMinerHashRate(uint256)","a136c448":"updateTokenSellingPrice(uint256,uint256)","a1391297":"ETH_CLEAR()","a139dee2":"_deleteHybridization(uint256)","a13a7cee":"createChildren(uint32,uint32)","a13ae1ee":"updateTokens(address,int256)","a13c24c7":"BithubCommunityToken()","a13c58f7":"logCoinAgeRecord(address,address,uint256)","a13d2733":"updatePatientHealthData(string,string,uint256)","a13d3832":"deactivateTokenSwitch()","a13d8ec4":"generateFinished()","a13e3351":"transferRefPercents(uint256,address)","a13f9e58":"RESERVATION_CAP()","a1405522":"MilkCow(address)","a140a687":"localsService()","a140e4ee":"getDropNotices()","a140e79c":"setMinimumDebatePeriod(uint256)","a1410994":"intelligentmasschainToken()","a141ce6a":"packageOfferInfo(address,uint256)","a142040b":"Dil()","a142d608":"escapeHatch(address)","a1446287":"LKYToken(uint256,string,string)","a1448fa7":"secondRewardPeriodPercent()","a144a3e0":"whitelistTransferFrom(address,address,uint256)","a1450c8a":"XDRAC()","a1454830":"getExpirationTime(bytes32)","a145492a":"transferToPartnerAccount(address,uint256)","a145636b":"artworkIndex(uint256)","a14598e6":"changeBonusPercentage(uint256)","a14779c9":"airdropWallet()","a1490581":"Deal(address,uint256)","a1490d50":"getTradeHash(address,uint256,address,uint256,uint256)","a14977d5":"getCustomerTxCount(address)","a1498f50":"check_result()","a14a5648":"bonus02Start()","a14b877b":"refundEverybody()","a14c1c4f":"setSTO(address,uint256,uint256,uint8)","a14c36ce":"dGetPool(uint8,uint8)","a14c9bed":"resetCurrentIdTo(uint256)","a14cf394":"generateInitialCard(uint16)","a14d191c":"PausePublic(bool)","a14d427a":"transferBonusToken(address,uint256)","a14d6517":"tweetIt(string)","a14e0e4e":"runInit()","a14e88fe":"firstTokenCap()","a14ea9c0":"selfRegisterDIN()","a14eaada":"tipCreator()","a14fc1e7":"aDropedThisWeek()","a14ff857":"setBytes32(bytes32,bytes32,bytes32)","a150be7a":"distributionPreIcoCount()","a152479c":"_computeNextCommissionerPrice(uint128)","a152b23e":"UKW()","a15348fa":"TitleRegistry()","a1536211":"AtacToken()","a153b399":"ZeePinToken(address,address,uint256,uint256,uint256,uint256,uint256,uint256)","a15404b7":"createUnicornPrice()","a15454ba":"payTransactionFee(uint256)","a154aa36":"getTotalGoals()","a154ce82":"disableContract(address)","a155beb8":"buyerDatabase(address,uint256)","a156ce7b":"totalReimbursedWei()","a157696b":"setWhitelistedOnly(bool)","a1578d53":"EventBuyTank(address,uint32,uint32)","a157979c":"netOutcomeTokensSold(uint256)","a1580f1a":"damage()","a1581821":"transferWholeTokens(address,uint256)","a158e377":"statusICO()","a158e632":"lastLapId()","a1594d21":"DividendClaimed(uint256,address,uint256)","a159c548":"amountOfTokensPoolC()","a159c937":"getReferencePriceInfo(address,address)","a15a2289":"GameNumber()","a15a8613":"VoteCountPerProcess()","a15a9a15":"Presenca()","a15afb48":"Replicator()","a15b4d2d":"getAllCardByAddress(address,address)","a15b53ad":"pre_minContribution()","a15b9769":"addRandomClass(uint32)","a15bb363":"createBoardHash(bytes32,address)","a15c1788":"checkForLog(string)","a15cdbf7":"moveERC20Tokens(address,address,uint256)","a15d59ce":"totalVestedBalance()","a15db1c5":"_validateTokensAmount(uint256)","a15e3919":"getCrowdsaleUniqueBuyers(address,bytes32)","a16085ce":"the_address_for_option_D()","a16094d1":"burnMarketMakerApproval()","a160bdf5":"expiration(bytes12)","a1616429":"testBitOrSuccess()","a1616c92":"hasFreelancerMinRatingsCount(address,address,uint256)","a16249e2":"__min__(uint256,uint256)","a162a71f":"addToOwnerlist(address)","a162c04c":"buyTicketsFor(address)","a1636db0":"stepThree(int256)","a16383e2":"getTrustedTransferAttotokensValue()","a1639c6b":"customerConsents(address)","a163a624":"Test()","a163c090":"maxArtworks()","a164845a":"TheImmortalsPhoto(string,string,address,address)","a1654379":"isAllowed(address,address)","a1658fad":"canPerform(address,bytes32,uint256[])","a1659822":"UncursedToken()","a16618ae":"updateClientVersion()","a1663c48":"MIN_PRE_FUNDING_GOAL()","a1664ae2":"icoStartTimestampStage1()","a166b4b1":"addParticipant(address[])","a1672717":"getMinContributionInWei()","a1687d31":"isPlayer1sTurn()","a168d873":"gameAddress()","a1696076":"CCH_EDIT_3()","a1698315":"setExtraTokensWallet(address)","a169ce09":"boom()","a16a3179":"multiTransfer(address[],uint256)","a16bed3a":"changeTradeFee(uint256)","a16c6a73":"setClaim(uint256,uint256)","a16c86f7":"withdrawRefund(address)","a16cdbb1":"maxLockDuration()","a16d5960":"setPartner(address)","a16e5326":"CryptoSagaCorrectedHeroStats(address)","a16f3774":"getReservedTokens()","a16fa142":"generate_token_for(address,uint256)","a1702265":"keyEmployeesAllocation()","a17042cc":"getMsgValue()","a17177a1":"marketingTokensDistributed()","a171b694":"RefundIssued(address,uint256)","a172045d":"PUSH1()","a172db06":"portalAddress()","a1731366":"withdraw_to_reward_contract()","a173ba2f":"deathData_v2()","a1741d0f":"checkLiquidationValue(uint256)","a1743410":"_refundExceededValue(uint256,uint256)","a1744812":"setMaxCoordinate(uint16)","a174a8e9":"addNewColor(string)","a174c4c6":"mintAmount5()","a176d7c9":"createAndTransfer(address,uint256)","a176f6bc":"freezeTimeOf(address)","a1775db5":"isContract(address,address)","a1779a3d":"getFieldData(uint256)","a1784139":"updateChildMinLogos(address,uint256)","a1786803":"getCreationCost()","a1786d1b":"changeMessage(uint256,string)","a1787880":"createCustomToken(string,string,uint8)","a17a2685":"canUpdate()","a17a9e66":"A(uint256)","a17b229d":"total_fund()","a17ca853":"round(uint256,uint256)","a17cc7eb":"storedData(address)","a17d4228":"SingleApproval()","a17d5f44":"initializeWhitelist(address)","a17d713a":"stringToUint32(string)","a17dd26c":"buyWithReferral(address)","a17de881":"DigitalIntelligentToken()","a17e463c":"NbtToken()","a17ea25b":"getAppChainCode(uint32)","a17eb09f":"ExtraHolderContract(address,address[],uint256[])","a17ecf9e":"kill(uint256,address[],uint256[],uint8[],bytes32[],bytes32[])","a17eee56":"setGasRefundForClaimLoot(uint256)","a17f0bbd":"ICO_BONUS_TIME_3()","a17fa5f2":"fillRandomCars(uint256[],uint256)","a17feadb":"airdropAmounts(address[],uint256[])","a1804e67":"buyWithBalance(uint256,uint256,uint256)","a181b040":"SlammerTime(address)","a18232e8":"estimateTokenNumber(uint256)","a1826a9a":"CMK()","a182da60":"crowdSupply()","a1837d21":"ChangeBonus(uint256)","a183e9a5":"ErrorMessage(string)","a18473c2":"RequestCurrencyContractInterface(address,address,address)","a1848b61":"someMethod(uint256)","a1857f4a":"OTHERCRUISER_MAX_CARGO()","a1865376":"changePrice(uint256[],uint256)","a186e120":"setTokenTransferState(bool)","a18717a9":"addressToPass(address,bool)","a1883d26":"setTaxAddress(address)","a1885d9b":"whitelistWeiRaised()","a1888c34":"setGamblingFee(uint256,uint256)","a188b8fd":"accountAddressForSponseeAddress()","a188fcb8":"orderDepth(bytes32)","a189a487":"status(uint8)","a18a186b":"getCurrentOwner()","a18a2092":"changeTokenHolder(address)","a18a7bfc":"setReferrer(address)","a18bf6e9":"addFundAccount(address)","a18c1ab0":"burnToAddr()","a18c751e":"set(bytes,bytes)","a18ccc8a":"transferToWallet(uint256)","a18cd06c":"distribute(address,address)","a18dda19":"releasePayment(bytes32,address,uint256,address,uint256,uint256,address)","a18e0ce4":"addBorrowingItem(address,uint256,uint256,address,bool,uint256,uint256)","a18e133e":"registered_racers()","a18e2eb9":"left69(uint256)","a18ef171":"ALLN()","a18f43ef":"hasForfeitedBatch(address,uint8)","a18f7567":"Thecap()","a18f9b11":"drawWinners(uint256,uint256,uint256)","a1900c22":"takeTokenProfits(address)","a1903737":"addressOfTokenUsedAsReward5()","a1903eab":"submit(address)","a190500a":"tokenSecondPeriodPrice()","a1907386":"debugLatestPurchaseCentsValue()","a1920586":"offer(uint256,uint256)","a1920f36":"reservingStep()","a192274d":"initializeBread(uint256,string)","a192a425":"Founder1()","a192fdba":"bonusEnds10()","a1931ff9":"tryAnotherOne()","a1943113":"devWithdrawn()","a1945458":"getIdentityInfo()","a1960d80":"deferredKyc()","a19638e6":"betsCountToUseFreeBet()","a196593c":"findTenAmUtc(uint256)","a1965dca":"move(uint8,bytes,uint8,bytes32,bytes32)","a196981b":"withdrawCrowdsaleDragons()","a196bea0":"isDirectDebitEnable()","a1972fc4":"updateDividends(address)","a1975c38":"Token77G(address,address,address,uint256)","a197c042":"checkCustomer(address)","a197ec5d":"excessTokensBurnt()","a1988458":"readGlobalPurchasedToday()","a198a418":"LKLZ()","a1992419":"createCandidateOnElection(uint256,address,address,string)","a19b5493":"successed()","a19b8766":"transferTEST(address,uint256)","a19beba9":"addCompanion(address)","a19c1f01":"burnRemainder(uint256)","a19c406a":"newIdTankWeapon()","a19c9cd1":"getEthfromUSD()","a19cb5ee":"addHash()","a19db682":"defaultFoundersRewardTime()","a19e1d00":"bonusInPreSalePhase1()","a19e29a9":"claimUnsold(uint256)","a19ed39d":"finalizeFunding()","a19ee7a3":"changeMinMakerBetFund(uint256)","a19fab4c":"setWhitelisted(address,uint256)","a1a04486":"monthLength()","a1a0ee90":"LogPolicyApplied(uint256,address,bytes32,uint256)","a1a17ec3":"rentSign(uint256)","a1a1efe7":"addBallot(bytes32,bytes32,address)","a1a200c5":"getRankList()","a1a3e4c7":"UserIDChanged(address,bytes32)","a1a49a09":"unlockTimes(address,uint256)","a1a59f52":"_renew()","a1a5d118":"deployNetwork(address)","a1a66e56":"deductFunds(uint256)","a1a6d5fc":"transfer_(address,address,uint256)","a1a71a20":"buyCommon(address,uint256,uint256)","a1a71a83":"checkUsernameVerified(bytes32)","a1a7405a":"destTokensSgt()","a1a74aae":"removeMember(uint256)","a1a79f64":"_winAmount(uint128,uint16,uint16,bool)","a1a7e68b":"mintTreasuryTokens()","a1a85253":"ReturnBack()","a1a887b8":"isUserExists(address,address)","a1aab33f":"weight()","a1aad09d":"setBondPrice(uint256,uint256)","a1ab46d0":"DepositReceived(uint256)","a1ac727f":"airdrop(address,address[],uint256)","a1acd4b2":"AWD_SHARE()","a1acf069":"ArtChainToken()","a1ad2b99":"removeExchangeAccounts(address,address)","a1ad54e6":"holdingToken()","a1ad7cef":"tokenBurned()","a1adbb25":"addCandidate(bytes32,bytes32)","a1add510":"hasRelation(bytes32,bytes32,address)","a1aeb1c2":"paybackToOwner(address,uint256)","a1aec173":"COLOR_SILVER()","a1af90ad":"funcalls()","a1afaa19":"previligedUnLock(address,uint256)","a1b0f3a0":"userChallenge(uint256)","a1b140b6":"getDistributionStatus()","a1b162a8":"set_timeframes(uint256,uint256)","a1b16e5c":"returnAgents(address)","a1b1cb43":"hasAccess(address,uint8)","a1b1e507":"addMintingFactory(address)","a1b22154":"preemption()","a1b22c19":"delExcluded(address)","a1b235af":"popLanguage()","a1b258c1":"firstWeekBonus()","a1b289dd":"TulipToken()","a1b2acc1":"cancelApproval()","a1b35c79":"getSection(bytes32)","a1b39c38":"_removeMarkets(uint256)","a1b3ef4b":"flightDone()","a1b40946":"getWordIndex(string)","a1b4dd2d":"DXBCToken(address)","a1b4f57c":"joinBattle(string)","a1b5b581":"ymtest(uint256)","a1b608c9":"setMainPoolCutPercentage(uint256)","a1b64c86":"TokenMock(string,address)","a1b6b1b5":"updateUnlockData(address,address,uint256,bytes32)","a1b6d4ae":"REPLACES()","a1b77835":"getRefPercentsByIndex(uint256)","a1b7ae62":"setdirectorName(string)","a1b7ffb2":"_checkRequireERC20(address,uint256,bool,uint256)","a1b86605":"getHourglassBalance()","a1b8c40f":"lastDepositIndex()","a1b94c0b":"timeOfWin()","a1b9af31":"unlockBets()","a1b9cb8f":"getTitulaire_Compte_6()","a1b9e03f":"Unagold(address)","a1ba0331":"CoinTroops()","a1ba444d":"createOrder(uint256,uint256,uint256)","a1ba7554":"fibokenUsedCount()","a1bb6220":"halting()","a1bb7828":"make_transfer(address,uint256,uint256,bytes32)","a1bba310":"DonationDoubled(address,uint256)","a1bc13ad":"forgeItems(uint256,uint256,address)","a1bc76d1":"extendPRETDE(uint256)","a1bc7a8f":"sha3_512()","a1bd55c2":"TimeDecayingToken(address,uint256,string,uint8,string)","a1bda122":"returnInt16(int16)","a1bdd146":"setEndorsement(address,uint256,uint256)","a1be79a0":"equipUp(uint256[6])","a1bed0be":"GOAL()","a1bf8a9d":"endICO_w1()","a1bffefa":"emitCancelled()","a1c0539d":"scheduleCall(address,bytes4,bytes)","a1c14350":"getUpdateMarketPhaseCalled()","a1c1519a":"calcNewSkinAppearance(uint128,uint128)","a1c15f56":"CipherPlay(address,address)","a1c29db6":"MAX_FUNDING_AMOUNT()","a1c2f644":"address4()","a1c308d0":"ProspectorsGoldToken()","a1c448f1":"kingdomCreationFeeWei()","a1c4774b":"getCostToKick()","a1c4db02":"eth_meth()","a1c51915":"getB()","a1c68880":"final_share_price()","a1c6d088":"airDropTokenDestroy()","a1c80cea":"getUriCount(address)","a1c8ca7e":"removeClaim(address,bytes32)","a1c90a11":"updatePlayersCoinByPurchase(address,uint256)","a1c91040":"requestEvidence()","a1c93169":"DividendClaimed(address,uint256,uint256)","a1c934b6":"TestNetworkToken()","a1c95ac2":"GSIToken(uint256,string,uint8,string,address)","a1c9d235":"minimumElectionQuorum()","a1ca00c0":"ELIXAddressSetter()","a1ca70f4":"totalDiv()","a1ca8f8d":"LTRToken()","a1cb31b7":"_state()","a1cbae6c":"communityTokens2()","a1cd150d":"_calculateFee(uint256)","a1ce5ba7":"getIncentiveNum()","a1ce7e03":"openOrder(uint64,bytes,bytes32)","a1cea675":"cryptaurRewards()","a1ceb253":"mintAdvisorsTokens(uint256)","a1ceb359":"CryptoStrategiesIntelligence()","a1d0846c":"setPrices(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","a1d0a48f":"addCurrency(string)","a1d0ab04":"allocateContributorsToken()","a1d10d11":"StoneLog(uint256,uint256)","a1d20653":"setVersion(bytes32,string)","a1d25205":"lowEth()","a1d27925":"personalContract()","a1d280d3":"releaseValue1()","a1d3612c":"DKS()","a1d36cb0":"checkClaimEntitlementofWallet(address,address)","a1d48aa8":"PaymentChannel(address,address,uint256)","a1d4c7ce":"_emitSkillRatingGiven(address,address,uint8,uint256,uint256,uint256,uint256)","a1d4c820":"Signum()","a1d53160":"Capital()","a1d5b36e":"calculateTxHash()","a1d61b07":"dateTier4()","a1d707a3":"setReleaseCar(uint256,bool)","a1d7d1dd":"setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],uint256[],uint256[])","a1d7ecbb":"updateShareETH(address)","a1d82cfd":"EBANK()","a1d86608":"_claimedSurroundingTiles(uint256)","a1d915b8":"ClaimTokens()","a1d91ee0":"technologyContract()","a1da2fb9":"retrieveDAOReward(bool)","a1da32be":"Shopiblock()","a1dab23e":"sellFloor()","a1dabfb2":"OAIToken(address,address)","a1db9782":"withdrawERC20(address,uint256)","a1dc139d":"setSigner(address,address,bool)","a1ddcd2d":"USDCX()","a1dddf70":"registerEthHandle(bytes32,address)","a1dea137":"checkBlacklist(address,address)","a1df7eb3":"YBKToken(string,string,uint256,uint256,string)","a1e03f57":"ratePerWeiInSelfDrop()","a1e04406":"preSale4Finished()","a1e0c2c9":"winnerCounter()","a1e15c33":"canuseOf(address)","a1e3b16d":"Crypseum()","a1e3c008":"mainSendTTC()","a1e4cb30":"investorsTotalSupply()","a1e4d3c2":"MembershipRoster()","a1e4eaf1":"updateUserBalance(uint256,bool,uint256,uint256,uint256,address,address)","a1e4f73d":"construct(bytes32,string,bytes32,address,uint128,uint256)","a1e51a79":"emitDestruction(uint256)","a1e564b1":"CashOut()","a1e59471":"HashBux()","a1e66038":"getTrusteeTable()","a1e6a255":"nextUserId()","a1e7e21c":"crowdsaleBurnAmount()","a1e89aec":"saleCount()","a1e8a780":"getAdPriceMultiple()","a1e93b63":"withdrawTipBalance(uint256,address,uint256)","a1e95792":"eatUnicornsAlive(uint256)","a1ea00bc":"isUserTakerFeeEnabled(address,uint256)","a1eb0bae":"eliminarjugador(uint256)","a1eb84b0":"transferOwnedOwnership(address,address)","a1ecb43c":"incrementLimitTeam()","a1ee7855":"ATT()","a1ee8c78":"issueToken()","a1ef9b8f":"reallocate(address,address,address,uint256)","a1f1aa66":"cancelVoteInternal(bytes32,address)","a1f1de65":"getPrizeAmount(uint256)","a1f24b3d":"getAssetDetails(uint256)","a1f36a78":"EROSCOIN()","a1f43f40":"UNICToken()","a1f4b9c8":"updatePlayerGen(address,uint256)","a1f54adf":"nextPremiumSale()","a1f56b0a":"getRollOutput(uint256,uint8,uint8,uint256,address)","a1f7f269":"_breedWith(uint256,uint256)","a1f841d7":"unlockFund()","a1f8adac":"investorList()","a1f8ea3b":"numOfDeliveredEarlyPurchases()","a1f902a7":"ComputeVestSpend(address)","a1f91057":"updateLock(bool)","a1fa39c4":"getRaisedPercents(address)","a1fa540d":"changeVotingBlocks(uint256,uint256,uint256,uint256,uint256)","a1fa566e":"getChannelPartners(bytes32)","a1fac24c":"Follow(bytes32,bytes32,bool)","a1fafe0c":"sendResidualAmount(uint256)","a1fb03f2":"GooCrowdsale(uint256,uint256,uint256,uint256,address)","a1fb1de9":"Message()","a1fb34c1":"setCustomExtraData(bytes32,uint256,bytes32,bytes32)","a1fc21f4":"setStaffDisbursementAddress(address)","a1fcc3bc":"stage2()","a1fd49b7":"getMFBalance(address)","a1fd92f5":"destinationMultisigWallet()","a1feba42":"tokensLocked()","a1ffba04":"PPGT()","a2008eb9":"acceptBidForStar(uint256,uint256)","a200dc73":"getNextShareholder(address)","a201222d":"recalculate(address)","a201bf26":"settleETH(bytes32)","a201d102":"VOTING_END_TIME()","a201ed8b":"transferMultiple(address[],uint256[],uint256)","a2023ff8":"setStartEndTimeTLP(uint256)","a202e476":"last_hash()","a20348c4":"ToPeriod()","a2035fef":"changeCustomTimeLock(string,uint256)","a20495d3":"Managed()","a20741dd":"getOperation(uint32)","a207b7fa":"SALE_FUND()","a208b3b7":"findFigures(uint256)","a2093e1b":"migrateCatOwnersFromPreviousContract(uint256,uint256)","a209a29c":"getStringValue(bytes32)","a20aede0":"phaseThreeRate()","a20b8ab3":"ttlInvestAmount()","a20bbb8b":"addBadge(uint24,int16,int16,uint24,uint256,string,string,string,uint256)","a20bc7fe":"allownce(address,address)","a20c15cf":"_generateCampaign(string,uint256[3],uint256[],uint256,uint256,uint256,uint256)","a20c404f":"ModifySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","a20cc495":"bytesFunc(bytes,bytes)","a20cd047":"moveTokenToAccount(address,uint256)","a20cf0e7":"setTokenNAVMicroUSD(uint256)","a20ddfb6":"getPartnerAddresses()","a20def62":"checkExistsOwnedAccessory(uint64)","a20e2525":"UnlockWei(uint256)","a20efba3":"mintGrey(address,uint256)","a20f46c6":"searchAddress(address)","a20f4ee6":"pixelCost()","a210a676":"buyBunny(uint32)","a210c6a9":"creatorPaid()","a210f934":"rateEarlyStage2()","a21174bb":"DefaultReverseResolver(address)","a2119377":"createToken(string,address)","a2119a3a":"allocateForRefund()","a2125232":"addItem(uint256,uint256)","a213051c":"individualMinPurchaseWei()","a21383cb":"permissibleTokenWithdrawal(uint256)","a213972c":"ViewBet2(address,uint256)","a213c280":"DayByDayToken()","a21515e3":"computed_shares_sold()","a2152e32":"testOracle()","a215457a":"transferBurnRole(address)","a215cd92":"setMinConversionRate(uint256)","a2167ac4":"_donations()","a216e0aa":"transferRobot(address,uint256)","a2177ff0":"getKeyLength()","a2187de0":"available_tokens()","a218d8ca":"clearAndDestoryAfterTwoWeeks()","a2190b46":"calculateTakerFee(address,uint256)","a21931ea":"CreateProposal(string,string,string,uint32,string,string,string,uint32,uint32)","a21a32cb":"Securities_1()","a21a65ae":"getIntArrayLength(bytes32)","a21d5b9f":"utilityLockedDate()","a21d942f":"checkResult()","a21df9f0":"THIRTY_DAYS()","a21e14fe":"reportInvalidDeposit(bytes32[])","a21ea6b7":"CrabCoin()","a21eea2a":"assertValidChallenger(address)","a21eef95":"getBarrierNum(uint16)","a21f0368":"History(uint256)","a21f74b8":"fundGooResearch(uint256)","a21f836e":"pubCount()","a21fbc92":"isAllowed()","a2200278":"checkStatus(bytes32)","a2200fbe":"AgreementUrlEn()","a220a90e":"transferLoveStoryWithData(bytes16,bytes32,bytes32,uint256,string)","a220d6c4":"tCampaignStart()","a2210352":"doRebuyTo(address)","a22107b4":"createRandomZombie(int256)","a222a52f":"firstPostIcoContributorId()","a222c98d":"declareWinnerForRaz(uint256,uint256)","a22304cd":"_specialDistribution(address,uint256)","a2233631":"withDrawal(address,address,uint256,bytes)","a2233c4d":"BancorConverterFactory()","a22352e2":"getDisputeFee(bytes32)","a2240eb0":"Scope()","a2248be0":"set_pre_kyc_bonus_numerator(uint256)","a224a5b3":"push_key(uint256,uint256,uint256)","a224c745":"setWhitelistAddress(address)","a224f4ce":"earningsFromScore(address,address)","a2252aaa":"referralProgramOwner()","a225d0be":"setTokensByWaveIndex(uint256,uint256,uint256)","a2261508":"tokenSpender()","a2267a3a":"newProposal(uint256,uint256,string)","a2271b15":"m_presaleFinished()","a22838b9":"ExecuteTrade(uint256,address,address,uint256,uint256)","a229090a":"dropTo(string)","a22913b5":"addTeamAddress(address,uint256,uint256)","a229b901":"transferApprover(address)","a22a31dd":"Forged(uint256)","a22b35ce":"_burnFrom(address,uint256)","a22b5a1c":"getFiles(bytes32)","a22b97f5":"withdrawOnBehalf(address)","a22ba787":"allocateETH(bool)","a22bb384":"GBAChain(uint256,address)","a22c81ec":"MIDGRADE_TYPE2()","a22cb465":"setApprovalForAll(address,bool)","a22cd657":"getImpactValue(string,address)","a22ce93d":"getActiveConsentTemplates()","a22d5a51":"deleteActivity(uint16)","a22dff2c":"getMainBalance()","a22e9009":"epm()","a22ec476":"setSireStop(uint32)","a22ed371":"mentalBalanceOf(address)","a22f2b2e":"set_lock_list(address,address,uint256)","a22fb98b":"updateBounty(string,uint256[])","a2302af9":"queryWinningTeam(uint256)","a2309ff8":"totalMinted()","a230c524":"isMember(address)","a231a84f":"ssp()","a232155d":"getbetresultfirst(address)","a2325259":"buyTokensWithUpdateRate(address,uint256)","a23281e6":"numPositionsExpired()","a2328e2e":"_FIVEHUNDRED()","a23291b6":"QUIOToken()","a232e64b":"createForum(string)","a235ae52":"setWithoutFee(address,bool)","a2362aca":"HyunJaeToken()","a2368e11":"setAirDrop(bool)","a236a3d7":"configRoundKeyAdd()","a236e665":"buyNac(address,uint256)","a236eb85":"subdivide(uint256,bool,bool,uint256,uint256,string,string)","a236f388":"getGameWin(address,uint256)","a23744f0":"tryCreateCheckRecord(bytes)","a2375d1e":"getC()","a237f4d8":"developerFundAddress()","a2393922":"getTokenDealRange()","a23951c8":"WidthdrawEarnings(uint256)","a239756d":"setRandom(uint256,uint256)","a239d260":"KinTokenSaleMock(address,uint256)","a23a373f":"DrawWinning(uint256,uint256)","a23a49c1":"setEscrowTokensWallet(address)","a23a5315":"SkyToken()","a23b5bd1":"getRandomUint256(uint256)","a23b791a":"Bitcoin()","a23bbb11":"GroupClosed(uint32,uint256)","a23bc6fe":"setTokenHolderAddress(address)","a23bec7b":"constrcutor()","a23bfd84":"weiPerCHF()","a23c3397":"getTokensPaidToGame(address)","a23c86c0":"allocateBulkTokens(address[],uint256[])","a23d20f4":"blockedDivisionJurisdictions(bytes32)","a23d3c35":"founderWallet()","a23d64c4":"isReturnRequested(address)","a23da130":"FundsRegistry(address[],uint256,address,address)","a23e21f7":"change(uint8,bytes32,bytes32,bytes20)","a23e3e89":"removeToken(address,uint256,uint256)","a23f41e2":"curs()","a2407c7b":"verifyUpdate(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256,uint256[3])","a240d8ad":"changeWeeklyRate(bytes32,uint256)","a241c089":"updateContract()","a2420f73":"EthermiumTokenList(address,address,uint256,uint256)","a24247f1":"getStartLockTime()","a242519b":"Technology3G(address)","a242f049":"ICOEndTime()","a243b6c1":"setPrice(uint256,uint256[],uint256[])","a243f512":"removeTrack(bytes32)","a244e03d":"definirMessage(string)","a244f365":"SbuyToken()","a245b774":"lockedFundsForthefuture()","a24636c1":"InvalidState(bytes)","a246d83b":"relaySellerCannotCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)","a2471fa5":"RecoverableWallet(address)","a2478c8d":"CT(uint256,string,string)","a247bc32":"payouts()","a24835d1":"destroy(address,uint256)","a248da12":"Exam()","a248de8f":"own(bytes32)","a248df4f":"XFC()","a249225e":"setAuthorizedUser(address,bool)","a2495ace":"transferCongress(address)","a2497b5c":"ETQuality()","a24a21fa":"TheBillionCoin()","a24bcf46":"calculateTokenAmount(uint256)","a24beff7":"closeBet(uint256)","a24c9737":"BUYER_CAP_HIGH_USD()","a24d23eb":"ProcessGame(uint256,uint256)","a24d9658":"revokeConsent(string)","a24dbe76":"StatusContribution()","a24e20de":"withdraw_dao_fund(address,uint256)","a24ea666":"withdrawedFundrasingPart()","a24ea868":"PROOF_MULTISIG()","a24ed4e5":"isLimitedWalletAddress(address)","a24ed8aa":"newLeader()","a24f1e82":"publiclyDistributedParts()","a25047a2":"hasEntry(address)","a25057de":"_transferToICAP(bytes32,uint256)","a250f43b":"verifiedWinnersLastCount()","a25236fe":"requestVotingRights(uint256)","a25277f3":"totalTokensCrowdSale()","a25287c5":"allowChangePrice()","a25367ff":"method2(bool)","a253c06e":"_circulatingSupply()","a25401ea":"PapyrusToken(address[],uint256[])","a254e662":"managementTokensDelivered()","a2550108":"alt_buyCollectible(uint256,uint256)","a2554c36":"walletForPresale()","a2558ee2":"holderReward()","a255d68d":"ticketTransferees(address,uint256)","a2564afc":"activatePermissionsBot(bytes32,bytes32)","a2564f7c":"randomNumberGen(uint256,uint256)","a2578f1c":"armyCountBattlesWon(uint256)","a258dafc":"getTopInfo(uint256)","a2594b83":"greylistMany(address[])","a2596576":"submitMint(int256,address,uint256)","a2596ebe":"returnTokensFromHoldProgectAddress(uint256)","a2597659":"changeMinAccEthers(uint256)","a25983e5":"lockTokens(address,uint256,uint256)","a25a34b1":"findPositionInMaxExpArrayTest(uint256)","a25b859d":"soldIdeaWeiIco()","a25b9384":"isUserAllowedToTransfer(address)","a25bc80c":"setPresaleState(uint8)","a25be434":"notifyTranferToken(uint256,address,address)","a25c1f3a":"presalePurchasesLoaded()","a25d8973":"createSale2()","a25e6898":"withdrawForeignTokens(address,address,uint256)","a25eb5d9":"exchangeToken()","a25f2d7e":"ReinvestmentWithdrawal(address,uint256)","a25f55d4":"getBatchSize()","a25f5e98":"doAdditionalMinting(address,uint256,int256)","a25fc8dc":"adminAddCity(string,uint256,uint16)","a25fdcec":"editPlanet(uint256,uint256,string,string)","a25ff42d":"HumanStandardToken2(uint256,string,uint8,string)","a2605dc1":"EventLuckyNumberRequested(address,uint256,uint256,uint8)","a2609759":"transferPreSignedMany(address,address[],uint256[],uint256,uint256,uint8,bytes32,bytes32)","a260c045":"PROMETHEUS_SHIP_LIMIT()","a260d8da":"makePresaleReady()","a26176b1":"testInequalityUint()","a2624afe":"raiseJackpot()","a262c092":"CollectChipBag()","a26329f0":"finalizeRefunds()","a2635401":"getCurrentGameId()","a263601c":"find_contribution(address)","a26388bb":"testRevert()","a263c7ba":"changeBuyPrice(uint256)","a263e793":"EdittedEntry(address,uint256)","a2644eb0":"withdrawFullTokenBalance(address)","a264f18e":"CROWDSALE_ETH_IN_WEI_ACCEPTED_MIN()","a2651d30":"purchaseAreaWithData(uint24[],uint24[],uint256[],string,string,uint256)","a2657960":"DolyToken3()","a26636f3":"StpacToken()","a266b0f2":"CoinStacks()","a266c820":"changeARIWallet(address)","a266f4da":"liquidateFund()","a26730e1":"minRelease()","a26759cb":"addFunds()","a267b5cf":"TokensTransfered(address,uint256)","a268b332":"testBitXorFailIndexOOB()","a269202f":"setHash(address,bytes32,address,bytes32,uint256)","a269e31f":"setPrices(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","a26a1bc9":"clearLockUser(address,uint256)","a26ac680":"BoBoToKen()","a26b0e34":"dbVal(address,uint256)","a26b2d76":"StepCoin()","a26b8822":"tokensSoldExternal()","a26bddb4":"LockedTokens(address)","a26c7810":"mintToTeamAccounts()","a26d494d":"getEscrow(address)","a26d6de6":"LogWithdrawal(uint256)","a26d7b94":"isCrowdSaleClosed()","a26dbf26":"totalParticipants()","a26e1186":"deposit(string)","a26e7a6c":"_initOpinion(uint256,string)","a26efcf8":"startGame(bytes,address,uint256,uint256[],bytes)","a26f644c":"Transfer_of_authority_data(address)","a270907c":"Btcandres()","a270a737":"venue()","a270cdf3":"getMarketInfo(bytes32)","a2720018":"freelanceFillBonds(address)","a2729a01":"updateDelegatorWithEarnings(address,uint256)","a273079a":"addLog(string,string)","a2730c23":"EthToAFW(uint256)","a273738c":"preICOEndTime()","a27411d8":"Earthpayment()","a2741bdb":"MAX_CITIES()","a2744a22":"addProduct(uint256,uint256,string,uint256)","a275ee1b":"getDeployTime()","a27678c9":"preDGZToken()","a277051f":"userAddr()","a277b787":"CARXTOKEN()","a277d5b1":"totalTokensPurchased()","a277fa88":"setWhitelistOn()","a2788b58":"ConflictResolutionManager(address)","a278ce66":"backWindowAdjustmentRatio()","a278fdfb":"bidOnAuctionToBuy(uint256)","a27966dd":"finishselfdrop()","a2798f0a":"GetQueueNumber()","a279c488":"addPending(address,uint256)","a27a9e7f":"publicAmount()","a27aebbc":"extendTime(uint256)","a27b9bf4":"matchcoin(uint256,string,string)","a27c1756":"ECONOMY_BOOST()","a27c3a2d":"HngCoin(uint256,string,string)","a27c672a":"owner_reveal_and_commit(uint8,bytes32,bytes32)","a27c794b":"insertDetails(string,uint256,uint256)","a27c9af0":"gameDestroy()","a27d8298":"leader_3()","a27e0e67":"QLFY()","a27ee939":"payto3()","a280b3db":"preSaleBonus3Time()","a280ce8f":"distributeWinnerPot()","a280e67a":"leftnum()","a28103f2":"batchTransfer2(address[],uint256[])","a283063c":"ChargeFee()","a2832c97":"CappedDividendToken(uint256)","a283c9c5":"getLastBidAmount()","a283f907":"addOrderContract(address)","a283fd00":"getPendingPaymentAmount(address)","a284b6d3":"maxTicketAmount()","a28504b4":"isSwapDone()","a28555d5":"setTAOFamilyAddress(address)","a28576aa":"LogUserRegistered(address)","a285f19f":"signedTransfer(address,address,address,uint256,uint256,uint256,bytes,address)","a2860050":"estimateReturns(address,uint256)","a28641cc":"_buyTile(address,uint256,bytes)","a2866a78":"HouseICO()","a28812c2":"existingIds()","a288237c":"MeSum()","a288b609":"releaseOf(address)","a288fb1f":"setConfigUint(int256,bytes,uint256)","a2890972":"synthesize(uint16[5])","a289409b":"addAddressesToAdmins(address[])","a289673b":"fipsChangeOwner(bytes20,address,address)","a289d187":"depositDividend()","a28a1564":"GBToken()","a28b1ffd":"isLive(uint32,int256)","a28bc99a":"TipSmartToken()","a28c644d":"setACLRole5999294130779334338(address)","a28c76cc":"initialize(address,address,address,bytes32,uint256,uint256,uint256)","a28d0185":"removeComponent(uint256,uint256)","a28d57d8":"btc()","a28e68d3":"setOnceMintAmount(uint256)","a28ecf0b":"sendCryptedHand(bytes)","a28f19f8":"AddDroneItem(address,uint256,uint256)","a29063c1":"LuckyNumberImp()","a290f4f2":"logoPrice()","a2919502":"getWalletLibrary()","a29256bd":"Ethereum()","a292f7d3":"paymentEscrow()","a29337bd":"tokensToCompany()","a293688b":"triggerFindWinner()","a293cba1":"LETSCOIN_Token()","a293d1e8":"safeSub(uint256,uint256)","a29445a9":"EnclavesDEXProxy(address,address,address,address,uint256,uint256,address,bytes32,bytes32)","a294542f":"setPreSaleTLYperETH(uint256)","a2948cdf":"futureDevelopment()","a294ed7a":"voterAddressOf(uint256,uint256)","a2950fd8":"Birth(address,uint256,uint256,uint256,uint256,uint256)","a2958b76":"_transferOwnershipOfStorage(address)","a29626c2":"createSingleSeedAuction(uint8,uint8,uint256,uint256,uint256,uint256,uint256,uint256)","a296b323":"setTransfer(bool)","a296fed8":"HitToken(uint256,string,string)","a297d43c":"openDistributionContract()","a2987245":"getIntArrayIndex(bytes32,uint256)","a298ba7c":"AntiqueCoin(address,uint256)","a299b155":"setInitialTokensBalance()","a29aaad6":"MatreXaCrowdsale(uint256,uint256[],uint256[],uint256,uint256,uint256,uint256)","a29b7fa0":"TklnAirdropToken()","a29c3574":"OrgonToken()","a29cc6c8":"allocateVestedTokens(address,uint256,uint256)","a29cd847":"changeEndPreSale(uint256)","a29d4859":"drpuToken()","a29d578a":"changeABaddress(string,address)","a29dbf46":"isAllowedToSend(address,address)","a29f9fb9":"onChainAddresses(bytes32)","a29fe9b1":"UBOToken()","a29ff28d":"receivedStaAmount()","a2a02202":"smg(uint256)","a2a0d0fc":"pre_endTime()","a2a140f9":"MinInvestment()","a2a1521a":"SignalPylon(address)","a2a17629":"addrBroker()","a2a206c0":"ImperoITCoin()","a2a23fb2":"getVersionsLength()","a2a256b9":"AirDroppedTokens(uint256)","a2a3d051":"B3(uint256,string,uint8,string)","a2a483ee":"setCS(address)","a2a51ccd":"transferToCrowdsale(address,uint256)","a2a5243c":"_calculateExcessBonus(uint256,uint256)","a2a53c7c":"Exercise(uint256)","a2a6aa11":"TileClaimed(uint256,uint256,uint256,address)","a2a6ca27":"setMinPerTx(uint256)","a2a746e1":"moveToInitiator(address,address,uint256)","a2a8336f":"claimEtherSigner(uint256)","a2a84a5d":"zonesSwarmAddress()","a2a8e279":"getTokensForEther2(uint256,uint256)","a2a957bb":"setFee(uint256,uint256,uint256,uint256)","a2a96799":"totalSuply()","a2a9a6c1":"satellite()","a2a9d1ef":"initReverseENS(address)","a2aa0724":"enterLottey()","a2aaa10e":"DigiCrowdSale()","a2ab2686":"participatePresale()","a2ac0a1a":"getUserAssetBalance(address)","a2ac5360":"calculateFounderCut(uint256)","a2aca613":"buyLicense(address,address,string)","a2ad16ed":"WinEToken()","a2ad360f":"SUV()","a2ae72ec":"open_commitment(uint256)","a2ae86ac":"setUntsqm(uint256)","a2af0e37":"assignPlayer(string,address)","a2af5fe9":"content(string,string,string,uint256)","a2b038b3":"addOffChainRaisedContribution(address,uint256,uint256)","a2b0867d":"Admined(address)","a2b0f9f6":"setMaxWeiForVerificationLevels(uint256,uint256,uint256)","a2b144f0":"getGasForMcr()","a2b1da51":"inflat(uint256)","a2b21d7d":"trainSpecial(uint256,uint256,uint256[2],uint256[2])","a2b40d19":"changePrice(uint256)","a2b424b1":"firstPresaleEnd()","a2b475f3":"levelOneBonus(uint256)","a2b5591c":"oraclize_query(uint256,string,string[],uint256)","a2b60f43":"EmployeeMigrated(address,address,uint256,uint256)","a2b6cbe1":"deleteTxDataBlockNumber(bytes32)","a2b6f0ec":"addRewardToPendingWithdrawals(uint32)","a2b7976d":"bbye()","a2b7a18b":"BCE()","a2b7e23d":"queueMode()","a2b8891e":"getFreeKebaber()","a2b946aa":"getNewGame()","a2bad039":"getCompte_27()","a2bb5d48":"get_username(address)","a2bb635a":"WhitelistedAddress(uint256)","a2bbeac2":"Shares(string,string,uint256,uint256)","a2bc0e31":"testCheckRokTeam()","a2bc183f":"secondPlacePot()","a2bc1cd4":"getNumEthOfferors()","a2bc2eef":"CipherPlayToken(address,address)","a2bcb304":"setfanbei(uint256)","a2bccae9":"plyrRnds_(uint256,uint256)","a2bcee8b":"build_creature()","a2bd018c":"targetDiscountValue3()","a2be1761":"addDiscounts(address[],uint256)","a2be23cd":"BASIC_RATE()","a2be427d":"updatePlayer(uint256)","a2bf1d06":"DURATION_NONUSETEAM()","a2bf68b9":"membership()","a2bf6939":"setTokenValue(uint256)","a2bf6f7e":"ClaimedStatus(address)","a2bfae64":"mmin(uint128,uint128)","a2c030a5":"changeRootAuthority(address)","a2c17459":"getCreateUnicornFullPriceInCandy()","a2c25131":"LogItemUpdate(uint256)","a2c2ed9b":"killContract(uint256)","a2c3a542":"getFallbackDepositPeriod()","a2c3b256":"receiveCheck(address)","a2c3bd83":"TokenInvestment(address,address,uint256)","a2c41366":"getIcoBonus()","a2c44503":"doesUserHaveBalance(address)","a2c4895a":"encodeOperator(uint256,uint256)","a2c4a06f":"startTimeOne()","a2c4c336":"getPurchaseReturn(address,uint256)","a2c4d268":"addToRef(uint256)","a2c52c4d":"CoreMediator()","a2c6fa83":"transferFromStudio(address,address,uint256)","a2c77e68":"isLeftTokens(uint256)","a2c8b76b":"getPriceFor(uint256,uint256,uint256,uint256)","a2c93406":"blinc()","a2c99d47":"rateAfterValidation(uint256,bool)","a2c9d630":"manualPrice()","a2cc1f62":"disagree(address)","a2cdd471":"cc()","a2cdd82f":"setAuctionObj(address,uint256,uint256)","a2ce0f87":"min_contribution()","a2ce4215":"TOKEN_PREICO_CAP()","a2ce588d":"roundExpired()","a2cff990":"getHeroCurrentLevel(uint256)","a2d0b147":"RedTicket(uint256,address)","a2d0f942":"canRedeemUTXOHash(bytes32,bytes)","a2d10ba5":"kyber()","a2d1c624":"checkKingFounder(address)","a2d1cf11":"propheciseExecute(address)","a2d24c5e":"getFirstTranche()","a2d39bdb":"addKey(address,uint256)","a2d3e2be":"ReleaseTimeChanged(address,uint256,uint256)","a2d435d4":"icoTotalCollected()","a2d46832":"speech(uint16)","a2d4db9c":"newUpload(bytes32,string,uint16,bytes32)","a2d57853":"receiveApproval(address,uint256,bytes)","a2d5b8bf":"withdrawBoardMeetingFees()","a2d6a926":"CapCoinInternational()","a2d6d382":"videos(bytes32)","a2d6f8de":"startEarlyStage4()","a2d74227":"spendToken(uint256)","a2d74b29":"setJobHiringDone(uint256)","a2d819b4":"getSenderSig()","a2d83b5e":"update(address,uint256)","a2d89edf":"bountyInit()","a2d97fa7":"TimeLockr()","a2da2b47":"ausGroupReleaseDate()","a2da84f8":"setCAOAmount(uint256[])","a2db644e":"vestingTransfer(address,address,uint256)","a2dc7dcf":"initialize(address,address,address,address,address,address,address,address,address,uint256,uint256,uint256,uint256[])","a2dc9d9c":"ChangeMessage(string,string)","a2dcb5d4":"bindUserWithBoard(uint256,address)","a2dd2e96":"InitCancel(address)","a2dd3283":"setICOContract(address,address)","a2dd9dd3":"canMateWith(uint256,uint256)","a2de29d4":"setReleaseAmount(address,uint256)","a2de45b7":"Listed_Validated(uint256,string)","a2de5b50":"buyWithPromo(address)","a2dea26f":"sendAllocation(address)","a2deadbd":"getTransactionHash(bytes)","a2dee527":"setSaleBonus(address,address,uint256)","a2df26f5":"printMarket(int256)","a2df6c42":"splitFirst(string,string)","a2df7465":"DeepToken(address,address,address,address,address)","a2dfa2f0":"buySampleTokens(address)","a2e0ee3e":"theWinningReferral()","a2e1a8d8":"isOwnerAddress(address)","a2e23a51":"TAIL_EMISSION()","a2e2842e":"ChannelSecretRevealed(bytes32,address)","a2e2998c":"setPricePerMessage(uint256)","a2e3750c":"preSaleCSSC()","a2e38b54":"getTransactionIds()","a2e40e50":"endorse(bytes32)","a2e55e88":"IQB()","a2e5f168":"DaoAccount(address,address)","a2e62045":"update()","a2e65477":"changePeriod(uint256,uint256,uint256)","a2e7223e":"isNewPlayer(address)","a2e7241c":"citizensAddresses(uint256)","a2e800ad":"rounds()","a2e841ba":"getUnprocessedQueryBytes32(uint256)","a2e855a5":"batchFillOrKill(address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])","a2e91477":"publicSaleStarted()","a2ea2aaf":"CreateToken()","a2ea771f":"receivedTokenOf(address)","a2ea7c6e":"getSchema(bytes32)","a2ea80f9":"setPayableEnabled(bool)","a2ea9883":"OwnerChanged(address)","a2eaa896":"winningBidder(string)","a2eb0d01":"gift_CreateTINAmotleyLine(string)","a2eb164d":"lockUpdateTokenAccount(address,bool)","a2ebaa1d":"TEAM_PERCENT_EVE()","a2ebb20b":"icoHolder()","a2ec191a":"addDSource(string,uint256)","a2ec258f":"future()","a2ec5414":"getAllowanceExpiration()","a2ee1a27":"sellPrice_wie()","a2ee4000":"cancelSalesOffer(bytes32)","a2ee8669":"PussyToken(uint256,string,string)","a2eeb5d4":"pyramid(uint256)","a2f09dfa":"addFund()","a2f1607c":"_calcLockRewardPercentage()","a2f16d80":"dexWithdrawCollectedFees()","a2f182d4":"setLimits(uint256,uint256,uint256,uint256,uint256)","a2f23659":"VPCx()","a2f26fb2":"FTTIssued(address,address,uint256,uint256)","a2f3139c":"stagedVestedLockUpAmounts()","a2f35f44":"addNewAddress(address)","a2f37360":"addSponsorshipAmount(address,uint256,uint256)","a2f39dc6":"OLDSPTI()","a2f3ba5b":"setSynthetixState(address)","a2f3ede2":"computeNameHash(bytes)","a2f44e72":"p_update_action(uint256,address,address)","a2f45660":"Purchase(address,address,address)","a2f4f550":"getDataPointForSubject(uint256,uint256,int256)","a2f56b2c":"refundEth(bytes32,address,uint256)","a2f5ee48":"CarbonExchangeCoinToken()","a2f6e5fb":"ViewMyDivs(address)","a2f77bcc":"getGame(uint256)","a2f78d7a":"startICO(address,address)","a2f792d5":"AdministratorAdded(address,address)","a2f7a2e0":"changeIcoPhaseAmounts(uint256[])","a2f7b3a5":"instances(uint256)","a2f7b7fd":"callTokenFallbackIfNeeded(address,address,uint256,bytes)","a2f7f58f":"getBetAmountOf(uint256,uint256)","a2f91af2":"cage(uint256)","a2f95b44":"committeesArray(uint256)","a2f9eac6":"persons(uint256)","a2fa0157":"isAssetActive(address)","a2fb1175":"winners(uint256)","a2fb342d":"lend(address,uint256)","a2fb98fa":"starting_clones()","a2fba23c":"holderGroup(address)","a2fbe98c":"haveIWon()","a2fc0bd5":"BuyEvent(address,uint256,uint256,uint256)","a2fc2254":"LAFINAL3()","a2fcd1af":"amountRaisedInUsd()","a2fd0179":"unlockBatchOfAddressesAfterITO(address[])","a2fdea11":"getBonusCoefficient()","a2fe802b":"isExit()","a3000128":"getContributionHash(address,uint256)","a3006abf":"buyBoosterPack()","a3006f5f":"CETFToken()","a300aa66":"RIKCoin(address,address)","a300c6ae":"confirmCollRecv(uint256)","a300eadf":"_getAllParents(bytes32)","a3011a02":"WatcharaHashCoin1()","a301b493":"Milestone_IcoFailed(string)","a3022667":"modifyAllLevelCaps(uint256[])","a302fdf1":"WHITELIST_BONUS_RATE()","a3030b10":"getTournamentBattleResult(int256,int256,uint256,uint256,uint256)","a3031b77":"getTradeCount()","a3032f25":"claimTreshold()","a3035454":"WeiControllerFactory(address)","a30376b7":"getReferralCount(uint256)","a3045113":"payUp()","a304f625":"updateInheritedEarlyParticipantWhitelist(address,uint256)","a3053236":"SafeInvestments()","a305ac76":"futureHolder()","a306e754":"batchIssueTokens(uint256)","a3078815":"darknodeOwner(address)","a307b727":"refund(bytes32,string,address)","a30872db":"tierContract()","a308c2a7":"validReferralCode(string)","a30955af":"balanceToken()","a309800c":"_withdrawWei(uint256)","a309f2ee":"setBalanace(bytes32,address,uint256)","a309f589":"crowdsaleRatio()","a30a86fe":"setMainSaleParameters(uint256,uint256,uint256,uint256)","a30b5c69":"AttributeModel()","a30bdea4":"isOffchainWhitelisted(address,bytes)","a30c5f17":"get_root()","a30cc5f6":"multiFixed(uint256[2][6])","a30d5627":"ItemToken()","a30d59c9":"getEggsCount()","a30eb0ef":"freeTokenTime()","a30eddcc":"bitSlice(uint256,uint256,uint256)","a30ef9e7":"toBase32(bytes)","a30f786f":"allowedRewardTokens()","a30fb52d":"sendGameGift(address)","a30fbae1":"endBuyBackDate()","a310293e":"weiDonated()","a31052e8":"clearReleaseTime(address)","a3106b95":"setMinterAddress(address)","a310f36a":"test2(bytes,uint256)","a3111d7c":"withdrawListing(uint256,address,bytes32)","a311a08e":"setPartners(bool,uint256,uint256)","a311c7c2":"collateralisationRatio(address)","a311d157":"addContributor(address,uint256,uint256)","a311d970":"TokenTycoonIGO()","a311dd70":"setArray(uint8[10])","a31271f5":"updCrowdSaleEnabled(bool)","a313c371":"memberInfo(address)","a31477b4":"getSncTokenIssuance(uint256,uint256)","a314acfe":"attemptToClaimCard(address,address[3])","a314dc2d":"feePayed()","a3155013":"month60Allocated()","a315acf5":"minter_address()","a315cda0":"priceOfSmartContract()","a316aa93":"setActivityDetails(uint256,string)","a3179fe0":"getAccountsNumber()","a317abc7":"defaultMax()","a318d521":"disableBeforeActivation()","a3194d50":"setFinished(uint8,bool)","a319b232":"VTCoin(uint256,string,uint8,string)","a31a9752":"Payout(uint256,bool)","a31b858d":"_buyDiscountTTM(uint256,uint256,address,address)","a31c5436":"TOKEN_AMOUNT_PRE_ICO()","a31caec8":"AkilosToken()","a31cc317":"evaluateContract()","a31cd710":"_getExpMultiple(int256)","a31d291a":"HOHO(uint256,string,string)","a31d30a5":"WhitelistUpdated(uint256,string,address,uint256)","a31d5580":"Registrar(address,bytes32,address)","a31e3678":"addExceptAddress(address,address)","a31e5e97":"setHouseAddressOne(address)","a31e88c2":"numIntervals()","a31f2c52":"partner2_voted_update_prenup()","a31f61fc":"setGroupCap(address[],uint256)","a31f79fb":"slopeReleasePercentage()","a31ffa30":"setCtuContract(address)","a3201daa":"setPrices(uint256)","a3208c1e":"addUserIntoBlacklist(address)","a3210e87":"sendeth(address,uint256)","a3221c8e":"step8()","a3223d50":"ETHER_MIN_CONTRIB_USA()","a322accf":"tokenFallbackExpanded(address,uint256,bytes,address,address)","a322c40e":"toString(int256)","a322d49e":"FirstTradingEcosystemCoin()","a323a748":"SBT()","a323af85":"hasTwoStepWithdraw()","a323bdb4":"currentPublicSale()","a3240455":"offerStarForSale(uint256,uint256)","a3246549":"stageOneClosed()","a324ad24":"getMonth(uint256)","a324cca0":"optimalLog(uint256)","a324ed9f":"BurnUnsoldToken(uint256)","a324f8bf":"tanksBeforeTheNewTankType()","a32508a1":"Carpati()","a3262e57":"burnCoin(uint256)","a32710eb":"setRole(address,address)","a3273535":"tdeDuration()","a327a958":"numCourse()","a327c45d":"dev1()","a328f90b":"_nextBudgetStartAndEndAndOfficalVotingTime()","a3293c0e":"handToCards(uint32)","a32a6737":"setTotalDeposit(address,uint256,address)","a32ac9e1":"Bitcoin_IDToken(uint256,string,uint8,string)","a32af535":"depositAndFreeze(address,address)","a32affeb":"loadEarlyParticipantsWhitelist(address[],uint256[])","a32bf597":"getCurrentRound()","a32c3bd6":"GetBounty(address,uint256)","a32cb608":"getReverseRate(address)","a32ce11e":"approvals(address,address)","a32e935a":"allocateTokenForTeam()","a32f0f41":"testFailControllerUnapprovedTransferFrom()","a330814c":"unregisterAuditor(address,address)","a3316ccc":"RATE_SALESTAGE7()","a3318359":"sendPrizes()","a331939d":"freezeAdmin()","a331cd38":"toKeyValue(uint256,string)","a3322a12":"getFilesCount()","a332853a":"futureDevelopmentFundAddress()","a3330574":"checkAndMint(uint256)","a333658f":"addTreasuryManager(address)","a333f96d":"LogRefundProcessed(address,uint256)","a33467cf":"getClue2()","a334edf6":"consumeWine(uint256)","a3358ae4":"REAPER_INTREPID_EXTRACTION_BASE()","a335b828":"FUS()","a337840c":"setGuardianRune(uint256,uint256)","a338bd2c":"showTopBonusBalance()","a338eba5":"sendTokens(address[],uint256)","a3393a35":"getDrawEthAmount(uint256,address,uint256)","a3395a52":"searchTicketsXaddr(address)","a339aaf7":"addOracles(bytes4[],address[])","a339abd5":"crowdsaleOpeningTime()","a339c18f":"ACNNIco(uint256,uint256,uint256,address,address)","a339c21a":"addContractTestToBounty(address,address)","a33a5225":"allRefererTokens()","a33b7510":"shareAddEtherValue()","a33bea16":"GENEOSSale(uint256)","a33c0972":"tokenAllocToCompany()","a33cbc55":"TCI_admin()","a33d4968":"Tripler()","a33d5d9d":"EthDev()","a33d652e":"setFunding(uint256)","a33dd801":"setTreasuryBalance(uint256)","a33e1d16":"drapcoin()","a33e6b07":"AccountFrozen(address,bool)","a33e8d62":"RxEALTokenContract()","a33ed39d":"numRef()","a33eff5a":"createResource(bytes32,bytes32,bytes32)","a33f3939":"setNetwork()","a340295a":"setPhoenixOwners(address[19])","a340ceac":"transfekbolOwnership(address)","a340cf79":"paid(address)","a340d587":"offlinePurchase(address,uint256)","a3414653":"COIN_COST_ICO_TIER_1()","a3429689":"TaiCoin()","a3435da5":"BONUS_LEVEL_3()","a3451568":"airdropBatchTransfer(address[],uint256)","a3454712":"AssetCreated(address)","a34560be":"updateEtherCap(uint256)","a34574f0":"gamers()","a346b62d":"CaptainKitties()","a346e536":"week_winner()","a3472270":"mock_getAddress(uint256)","a347ef84":"calcpustprice(uint256,uint256)","a348ea79":"contests(address)","a34945db":"maxAllowedBetInEth()","a3494fdc":"expectRefund(uint256)","a349bfa2":"addOwner(address,uint256,uint256)","a349d683":"FRP()","a34ad6b6":"clockmint()","a34bbf51":"getGeneralInfo()","a34c6716":"testHashing(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32,bytes32)","a34cc845":"win(address)","a34d2ff7":"votingBymy(bool)","a34d42b8":"setContractOwner(address)","a34d5312":"registryRequestVendor()","a34d5f82":"GiveBlockReward()","a34d7c11":"flipCoinWithEther(uint8,uint8)","a34d9270":"setMinInvestedLimit(uint256)","a34d942b":"FUXEToken()","a34dffba":"SILVER_AMOUNT_NDC()","a34e5990":"setTier(uint256,uint256)","a34e9e66":"approveBcoupons(address,uint256)","a34edc03":"assertTrue(bool,string)","a34f42a9":"LogRandom(uint256,uint256)","a34f82f4":"summFounders()","a34fc5ac":"_lockTokens(address,uint256)","a350539e":"makeBid(uint32)","a3508b17":"getOpenedStageIndex()","a35132ac":"SMSReward(address)","a3515b98":"initializeWeekData(uint256)","a352f1a8":"calcSHA3(bytes)","a3536b0c":"calculateHolderPiece(address)","a353c600":"Ponged(uint256,string)","a35523da":"currentLoanDayTime()","a356fdf3":"getPreICOPercentage(uint8)","a3577e93":"depositFunds(bytes,uint8[2],bytes32[2],bytes32[2])","a357880d":"whitelistedAddrs(address)","a3580695":"inSpecialSalePeriod()","a358aa18":"_transferFromInvestor(address,address,uint256)","a35a319b":"delFromBlackList(address)","a35aae9c":"roundID_()","a35ae3ab":"Bam()","a35bc497":"remainTime(uint256)","a35bd437":"toUSD()","a35bd591":"newRound(uint256)","a35bfcac":"ownerRemoveRole(address,string)","a35cad77":"maxLeaders()","a35cfa22":"make_move(uint256,uint8,uint8,uint8,uint8)","a35d631a":"PausableMock()","a35d6dd6":"rDEX()","a35d78a6":"_approvedGen1(address,uint256)","a35da419":"setlock(bool)","a35e617f":"setMaxCount(uint256)","a35e83ea":"getReplay(uint256,uint256)","a35f9514":"calcDstQty(uint256,uint256,uint256,uint256)","a360098f":"Immigration(address,address)","a360b26f":"Migrations()","a361b184":"move(bytes32,bytes32)","a3624b72":"finalizeTransferAddressType()","a362858a":"EthereumCashPro()","a36298c7":"totalLimit()","a362cf0c":"TrueWorld(uint256,string,string)","a363f269":"watchMovie()","a3641c84":"card_metal_first()","a364b5c1":"setProposalNames(bytes32[])","a365bd9f":"BaseToken(string,string,uint256)","a365f3cc":"Util()","a3666d23":"weekTwoPriceRiseBegin()","a367b891":"SplitPhaseDistribution(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","a367d99a":"investStart()","a367e565":"setIBalances(uint256[],uint256[])","a368107b":"SetRecordType(uint32)","a369658c":"TARGET_EVE()","a369b0ac":"depositsClosed()","a369bb28":"SaleWallet(address,uint256,address)","a36a0551":"createCarrierFromVault()","a36a48a5":"ETH500on719()","a36a7526":"setOp(address)","a36b15d0":"enableBundlingMultitoken(uint256)","a36b8af1":"LogItemModified(address,uint256,uint256,bytes32,bytes32,bytes32)","a36badd7":"hasJobRecommendations(address,address,uint256)","a36be43a":"SetFreeYOU(uint256)","a36be9a1":"paybackDeadline()","a36c2cbe":"informarOng(address)","a36c8ec2":"UpdateContractorAddress(address)","a36db282":"SendLCRTokens(address,address,uint256)","a36ddfae":"_0xForkTokenToken()","a36f127e":"removePresetTransfer(address)","a36f259d":"campaignOf(address)","a36ff98b":"team1Points()","a36ffd4d":"ADEToken()","a37173e9":"transfer_left_funds_to_project()","a37218ed":"MAMECOIN()","a3721adc":"contractCreationBlockNumber()","a37330ea":"getDestroyedWhenRoundOver()","a3743afc":"getProjectHour(uint256)","a374480a":"placeValue(address)","a3744828":"GetPriceByN(uint256)","a3747fef":"register(bytes,bytes)","a375de4f":"addTokensToBank(address,uint256)","a37641ff":"MAX_RING_SIZE()","a3766f88":"tokenVendor()","a376c19d":"setEventResult(string)","a377104c":"init(string,uint256,uint256,uint256)","a377b34e":"YoloToken(uint256)","a377ff17":"setHorseDataAddr(address,address)","a3787858":"resumeBlockNumber()","a37889a9":"createPromoGirl(uint256)","a378bba5":"gameEnds()","a3792985":"getBonusDropsOf(address)","a37936f9":"SuspendEmployee(address,uint32)","a379e626":"ownerPerThousandShareForBuying()","a37a3859":"configPerFund()","a37a778f":"SetIPR(string,string,address,string,string,uint256,string)","a37ba32a":"duration(bytes32)","a37be00f":"transferBackTo(uint256,address)","a37be75f":"ethBase()","a37c314d":"set_iconiq_tokens(address,address,uint256)","a37ccabc":"PositionBought(uint256,uint256,uint256,address,uint256,uint256)","a37d1556":"refAmount(address)","a37da615":"showInvestedNum(address)","a37dec33":"calculateWineSell(uint256,uint256)","a37e66f5":"ethPendingManagement()","a37e6f69":"failedByDeveloper()","a37f00f7":"getItemByTokenID(uint256)","a37fd390":"setHomeAdv(uint256,string)","a380dcb9":"wpp()","a381de54":"bonusAddress()","a382aee2":"fourthExchangeRate()","a382edfd":"SeeleGold()","a38320e6":"TITANToken()","a3833a13":"balanceOfColdWallet()","a3848b1a":"getMonsterIVs()","a384af00":"market_BuyForSale(uint256)","a384d6ff":"lowerBound()","a38591fc":"test_percOf1()","a3863d81":"buyTokensLowLevel(address,uint256)","a38717f4":"exFeeTotal()","a3875883":"etherPriceUSDWEI()","a387cf34":"closeTokenSale()","a3885413":"withdrawOwner(address,uint256)","a388a836":"DDAContract(address)","a3893a33":"changeExchanger(address)","a3895fff":"changeSymbol(string)","a389783e":"isApproved(address,address)","a389ef53":"receiveDeposit(uint256,uint256)","a38b68cb":"nonzeroAddressesLengthForApi(uint256)","a38b8469":"TokenADSVENTURE()","a38b9a19":"printQuotation()","a38c48b6":"createProductionUnit2Beta()","a38ce2b4":"revokeAddress()","a38deeab":"Grid(uint16,uint256,uint256,uint256)","a38eb622":"pauseBuy()","a38f18a0":"RedBlueToken3()","a3907d71":"enable()","a3908e1b":"convert(uint256)","a3912ec8":"receiveEther()","a3916164":"withdrawInvestments()","a391c15b":"div(uint256,uint256)","a3922eac":"setCategories(address,uint256,uint256)","a3926f14":"PixelsMain()","a392f54a":"giveMeCoins(uint256)","a3934de4":"Upgrade(uint256,address,address,address)","a39385de":"transferWithReferenceCallGas()","a393dc44":"_totalsupply()","a393fb0f":"reducemoney(address,uint256)","a39417f9":"LOG_NewBet(address,uint256)","a39495f0":"isPreallocated()","a395e2cc":"TPLAYToken(uint256,string,string,uint8)","a3961207":"amountOfRedemptionPayouts()","a3964cb9":"toB32(bytes,address,bytes)","a396541e":"getPongvalTxRetrievalAttempted()","a397d8e0":"getUnusedBalance(address)","a398063a":"setEmergentHalt(bool)","a3980dd7":"Readycoin()","a3988500":"CloudexchangeCrowdsale(uint256,uint256,address)","a398b89b":"receivedEther(address,uint256)","a39953b2":"startCrowdsale()","a399eb76":"ZoharTC()","a39a2b76":"dropUnitPrice()","a39a45b7":"replaceOwner(address)","a39a70a9":"developReserveTimeLock()","a39aaec6":"getCompte_37()","a39ab3a3":"bla(address)","a39ad747":"minVote()","a39b10d2":"lastBlock_a17()","a39db022":"changeBonus(uint256,uint256,uint256)","a39dc9be":"HOUR()","a39e1149":"getSECOND_STEP_MULTIPLIER()","a39eede8":"settleAssets()","a39f7449":"startTimer()","a39f9712":"sendTokensAfterBuy(address,uint256)","a39fa2f6":"VPE_address()","a39fac12":"getAddresses()","a3a06c54":"endICOPhase()","a3a0ee24":"evFreeze(address,uint256)","a3a183c1":"overflow(address)","a3a187cf":"TokenBought(address,uint256)","a3a1cd6d":"getNumberOfKnownPropertyAddresses()","a3a1d015":"failUserRefund(uint256[])","a3a27105":"stakeholderPayment(address)","a3a402a7":"deletefromblacklist(address)","a3a40323":"ArtificialNeuralNetwork()","a3a40ea5":"getCurrentPhase()","a3a4851a":"deliveryReject(address)","a3a48785":"unsetClaim(uint256)","a3a4a18b":"test_claimShares_emptyFeePool_isTranscoder()","a3a4ba31":"createChild()","a3a51983":"updateCurrentStage()","a3a5650a":"currentStageMaxSupply()","a3a6a43e":"approveUserKYC(address)","a3a6c73e":"_isIdExisted(string)","a3a7647c":"tier1Count()","a3a7b804":"changeMaxGasprice(uint256)","a3a7e7f3":"transferAll(address)","a3a81d40":"totalBGX()","a3a82678":"collectRef(address)","a3a9196a":"dexTestNormalTransfer(address,address,uint256)","a3a93721":"SYLVIe()","a3a9d67b":"AdviserCasperToken()","a3aa1913":"balanceDetails(address)","a3ab5045":"isNewTile(uint16)","a3aba50e":"referrerEnable()","a3ad1676":"isPurchasedEpisode(uint256,address)","a3adb958":"transferToggleRequester()","a3ae2f5c":"award(uint256,address)","a3ae88a0":"totalUSD()","a3b01f23":"intoverflow_add(uint256)","a3b0bff4":"getPersonalStakeActualAmounts(address,address)","a3b0c661":"setLineUpEnable_default(uint256)","a3b1dc52":"logEscapeHatchChanged(bool)","a3b2363d":"parentAddress(address)","a3b24dcd":"getSumsHash(address)","a3b2938d":"updateStatusInternal()","a3b2c41e":"readArticle(bytes32)","a3b34190":"unlockSecond()","a3b3fff1":"getVotingToChangeMinThreshold()","a3b42cba":"register(bytes8,bytes8,uint256)","a3b4ab48":"BBPToken(address,uint256)","a3b4b07f":"ACL_APP()","a3b6120c":"dateStart()","a3b62bc3":"AdminRemoved(address)","a3b65d29":"getarg_3()","a3b80993":"WorkValley()","a3b8cd3b":"_equipDownOne(address,uint16)","a3b922ca":"buyPandaERC20(address,address,uint256,uint256)","a3b959da":"change_dev(address)","a3b9b8d1":"receivePaymentForOraclize()","a3bbc294":"galleassTransferFrom(address,address,uint256)","a3bbf81b":"USACOIN()","a3bc3fce":"getFillOrderMinGasNeeded()","a3bc6163":"getMessageGas()","a3bdc655":"getRemainingTimeTillExpiration()","a3be094d":"countTokens(uint256)","a3bef4d7":"numVotes()","a3bf5b9a":"revokePermission(address)","a3bfdf47":"closeSession(uint256)","a3bfe069":"_sumActivePerks(uint8[32])","a3c07c6a":"removeHatchingTime()","a3c0a477":"crowdsaleIsActive()","a3c1954e":"supporter()","a3c1d83d":"forgiveMeOnBehalfOf(address)","a3c28dfc":"eventExists(uint256)","a3c2c462":"totalReceived()","a3c441e7":"setAdvisoryWallet(address)","a3c49da0":"DollarCoin()","a3c50b32":"orderDetails(bytes32)","a3c66c1d":"notEqual(bytes32[],bytes32[],string)","a3c68e3d":"CancelGameAfterResultsPublished()","a3c86bef":"AcademyToken(address)","a3c88b31":"addInternalBalance(uint256)","a3c8ef7a":"signedByWhiteHat()","a3c9df3f":"plutocrat()","a3c9fc7d":"_withdrawTo(uint256,uint256,uint256,uint256)","a3ca17b2":"getUSDETHPrice()","a3cb3e97":"removeHatchingTimeWithToken(address)","a3cb679d":"getTotalBets()","a3cbf67d":"NewBOP(address,address,address,uint256,bool,uint256,string)","a3cc8b9c":"changeRateUSD(uint256)","a3cd2d78":"nextReward(uint256)","a3cd4065":"ReceiveBTC(address,uint256)","a3cf3ec0":"lowestAddressReserving()","a3d07452":"fightAuction()","a3d2078b":"TokenSaleOpened()","a3d23e52":"round2Cap()","a3d3a265":"setCreditBond(address)","a3d4e4b5":"buyItem(uint8,uint8,uint256,uint256)","a3d53934":"MegaToken()","a3d5e8e0":"_update(uint256,string)","a3d5ec39":"PlynToken()","a3d646fe":"ETHEUR()","a3d658dc":"extendLiquidationPeriod(uint256)","a3d6f9a9":"publicKeys(address)","a3d7bd43":"doSend(address,uint256)","a3d823ad":"changeORACLIZE_GAS_LIMIT(uint256)","a3d87805":"TerraToken(uint256)","a3d88453":"isAvailableAccount(address)","a3d8fdd5":"totalAccessorySeries()","a3d94402":"safeMathAdd(uint256,uint256)","a3d9c3d1":"ApprovalHash(bytes32,bytes32,uint256)","a3dab216":"setOpeningClosingTime(uint256,uint256)","a3dc65a7":"wipe(address,bytes32,uint256)","a3dc8a7a":"exrate()","a3dcb4d2":"receiverAddr()","a3dceacb":"MessageSent(uint256,uint256,string,string)","a3dd2619":"getCurrentStatus()","a3dd2b3e":"projectInfo(address)","a3dd3aa7":"setGBT(address)","a3ddc24a":"purchaseDeposit(address,uint256)","a3de9354":"createDividendWithCheckpoint(uint256,uint256,uint256,int256)","a3def923":"create(address,bytes32)","a3df30b4":"GIDe()","a3df870a":"hentaisolo()","a3dfc364":"StartGame()","a3dfcb0d":"_setUniqueValue0(uint256)","a3dfdf30":"read_i64_array()","a3e135fa":"reclaimTokien(address,address,uint256)","a3e14d74":"getLowerBoundBlocksTillGameEnd()","a3e1f666":"getCreatorMetadataOfHistoricalMetadata(string,uint256)","a3e20625":"giveReputation(address,bool,string)","a3e20d71":"transferUnPaidFundAccount(address,uint256)","a3e29360":"ownedTicketIdList(address)","a3e298d1":"VIBETPerEther()","a3e2b1de":"getProjectArbiter(bytes32)","a3e2ce24":"getTokensAndAmounts()","a3e31246":"setLucky()","a3e3a8e0":"withdrawEthPool(uint256,uint256)","a3e486d1":"ptc_balance(address)","a3e4c0c4":"setRandomizer(uint256)","a3e667b3":"releaseMany(uint256,uint256)","a3e67610":"tokenOwner()","a3e7061d":"getPaintingIdAtIndex(uint256)","a3e76c0f":"receive()","a3e787b5":"FITToken()","a3e831b4":"NewTokenFromFactory(address,address,uint256)","a3e860fe":"DEFAULT_RATE()","a3e8b6db":"MetrumcoinShares()","a3ea1376":"removeListingInternal(uint64)","a3ea478f":"setTier1Participants(address[])","a3eb6436":"TOKETH_PRESALE_TWO()","a3ebb0b3":"getConsideration(uint256)","a3ebeab7":"testConcatMemory4Bytes()","a3ec138d":"voters(address)","a3ec5616":"next(bytes,bytes,bytes,bytes,bytes,bytes,bytes,uint256)","a3ecbc33":"DSPUnregistered(address)","a3efc756":"transferPreICOFunds()","a3f144ae":"OFFSET19700101()","a3f1bd35":"getDouble()","a3f1ee91":"RequirementChange(uint256)","a3f22739":"payout(uint256,uint256,bytes32,bytes32)","a3f2a813":"StartsAtChanged(uint256)","a3f2d2b5":"SZA(uint256,string,string,uint8)","a3f31b80":"teamPayment(address)","a3f36da3":"ProRataDistribution()","a3f3dd32":"Verifier(uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])","a3f424c2":"verifyProof(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[10])","a3f4df7e":"NAME()","a3f5a178":"approveTakeover(uint256,address)","a3f5c03d":"launchInvestment()","a3f5c1d2":"nexus()","a3f66b46":"newQuestion(string)","a3f67d6d":"playersCount()","a3f70ed3":"party_a()","a3f7c989":"enableStorage(bool)","a3f7e26d":"finishMintingIssuer()","a3f8eace":"releasable(address)","a3f991a5":"totalPot_()","a3face0b":"setInteractionPrice(uint256)","a3faef60":"MicroBitCoin()","a3fb5917":"getFirstOrder()","a3fb8f15":"getRaisedPOLY()","a3fbbaae":"changeManager(address)","a3fc136a":"signedApproveSig()","a3fc32c8":"getWLInfo()","a3fc81cb":"buyTokensViaBackend(address,uint256)","a3fca677":"LogBuy(address,address,uint256,uint256)","a3fcafb9":"soldCoins()","a3fcf9bc":"operationsPercentOfTotal()","a3fd6d0e":"feePaid(bytes4,uint256)","a3fdfee3":"deny()","a3fe0dc7":"userCrateCount(address)","a3fe70cb":"exchangeEnd()","a3ff0ea2":"issueAsset(bytes32,uint256,string,string,uint8,bool,address)","a3ff31b5":"getTokenStatus(address)","a3ff428e":"angelCardSeriesCollection(uint8)","a3ffac0d":"td()","a400594d":"lockAddress(address,address)","a4009e23":"TEST_MODE()","a400be54":"coinSendSameValue(address,address[],uint256)","a401d24d":"assignToken(address,uint256)","a401e585":"withdraw_privatefund(bool)","a4036b1c":"getAdPriceHour()","a4039098":"StartCompetitionEvent(uint32)","a4039a2a":"createNonRepeatableVpfFactory(string,bytes32,uint256,uint256,int256[])","a404f291":"microRate()","a40544c3":"notifyCancelSellOrder()","a4055f62":"freezeAccounts(address[],bool,bool)","a40668f5":"testDeregisterProduct()","a407db23":"GHK()","a407ee79":"bytes32ToAlphabetString(bytes32)","a4083849":"right44(uint256)","a4086854":"approveTransfer(uint256,address)","a4093718":"issueToken(uint256,uint256)","a4094a0d":"calculateFeeForAccount(uint256,uint256,address)","a409eb7b":"hasRequested(address)","a40a485f":"deathData_v3()","a40a99ac":"getInsertPointForNumTokens(int256,address,uint256)","a40ae4b7":"_uintToBytes(uint256)","a40bc352":"crowdSalePause()","a40c0a54":"USDGamblingToken()","a40c5221":"updateTokenAmount(address,uint256,uint256)","a40c8ad0":"addGenesisCatGroup()","a40cd3f3":"minContributionInWei()","a40cee9c":"updateIdentityImageURL(address,bytes32)","a40d32fe":"minPaymentAmount()","a40e0b91":"testGoalReached()","a40edb07":"processVerification(bytes32,string)","a40f1796":"prefixedHash(address)","a40fbd2b":"makeKebabs(address)","a410424e":"isMoneySent()","a4109017":"VanityTransfered(address,address,string)","a410a7f2":"getParticipantTickets(address)","a410f4b1":"changeFeePercentage(uint8)","a412c6fc":"getRules(string)","a412f87c":"verifyInvestment(address,uint256)","a412fcc7":"defineType(string,uint8,uint8,uint32,uint8,uint32,uint8,uint32[5],uint32[5],uint32[5])","a413245a":"deductFromBond(address,uint256)","a41347e3":"usersCanTransfer()","a4136272":"MAX_TOKEN_SALES()","a4136862":"setGreeting(string)","a4144681":"RK40Z()","a414b00d":"SUNToken()","a414b379":"addContact(address)","a414e089":"Dimacoin()","a415833b":"numPurchasesOf(address)","a415965c":"refillMultiSigMintPool()","a415a93e":"initWithShips()","a415b8eb":"getCCH_edit_31()","a416b263":"charAt(bytes32,uint256)","a416b48c":"getActionCount(uint256)","a417357c":"unpauseTokens()","a419165e":"TokenCappedCrowdsale()","a41942a4":"transferCuratorship(address)","a419f1e7":"NewPlayerAdded(uint256,uint256)","a41a9445":"getStopTransfer(address)","a41b3887":"setPrefixPrice(uint256,uint256)","a41b9c31":"unconfirmAddress(address)","a41d0584":"fixAddress(address,uint256)","a41da348":"fomo3d()","a41dedcc":"testAbs()","a41e61a4":"minSaleBalance()","a41e7d51":"updateERC165Cache(address,bytes4)","a41f0069":"GershToken()","a41fd917":"getUnprocessedQueryList()","a41ff1e5":"maxMintingDays()","a4201125":"sanToLower(string)","a4202504":"getPhaseSold(uint256)","a4202615":"makeAdoptionOfferToAddress(bytes5,uint256,address)","a4204e39":"getQuotes()","a42214b2":"cancelAuctionEmergency(uint256)","a422b761":"tokensIssued(address)","a4230bd5":"addAdmin(address,bool)","a4238d31":"receiveBalanceUpdate(address)","a4245527":"getPaintingOriginal(uint256)","a424fa49":"NPXSToken()","a42533c8":"tubParamUpdate()","a4254fb4":"couponTokenBountyAddr()","a425b752":"destroyStake(address,bytes32,uint256,uint256)","a4262254":"calcFib(uint256)","a4268de6":"oracleItQuery(uint256,string,string,uint256,uint256)","a426cd19":"validPLAContract(uint32,uint32)","a4275535":"XTYF()","a4276533":"getProposalNum()","a427c5d9":"bonus(uint256,address[],address,uint256[])","a427ee36":"FruoCoinBETA()","a428033f":"minechaincoin(uint256,string,uint8,string)","a428517b":"Converted(address,uint256)","a4288d17":"tokensForReservedFund()","a429845e":"newCrowdsale(bytes32,uint256,uint256,uint256,uint256)","a42aa488":"checkRevert(uint256)","a42ac803":"getBonusAffiliate(uint256)","a42ad8b3":"NomuraDynamicsCoin()","a42b0d88":"advisorsPool()","a42b6bf1":"setStorageContract(address,bool)","a42cb160":"updatePlayerFund(uint256,address,uint256,uint256,uint256,uint256)","a42d630c":"SetupMultipliers(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","a42dc008":"newKudosToken(string,string,string,uint8,address)","a42dce80":"setFeeCollector(address)","a42e16fd":"MultiSig(address[],uint256)","a42e36c6":"scheduleTransaction(address,bytes,uint8,uint256[5],uint256)","a42ea491":"MrFibreToken()","a42ec1bc":"reserveWallet(uint256)","a42ecd5c":"setRealRef(address,uint256)","a42ef788":"potSwap(uint256)","a42f126c":"charityClaim()","a42f1edb":"market1()","a42f3f9d":"getTAOCurrencyBalances(address,address,address,address)","a4316c46":"MarketingToken()","a4325485":"getCreatorBalance()","a432cdb0":"Tier_Rainmaker()","a432e6d6":"switchToNextPeriod()","a4331929":"createNew()","a433a0b9":"addRecordByProvider(bytes32,address,string,string)","a433d5c6":"IsActiveUser(address,address)","a433f390":"approveAndTransferFundToCreator()","a4341ab0":"setCount(address,uint256)","a4343ae9":"onContribution(uint256,address,uint256,uint256)","a43569b3":"getValidatorDescription(address)","a43655c4":"rejectRequestPause()","a4366a8a":"processPayment(address,uint256,uint256,uint256,bool)","a4368de7":"addBonus(string,uint256,uint256,uint256,uint256,string,uint256,string,uint256)","a437164b":"assignUserWallet(string,address)","a43772bd":"thirdXRChangeBlock()","a43796ce":"getSecretSigner()","a437ab52":"setDevelopersFee(uint8)","a437e07a":"signAuthorship()","a4381dd4":"StanleyToken()","a438d208":"VOTING_DURATION()","a43914da":"getRootEdge()","a4399263":"finalise()","a439d3fa":"ChangeOfRules(uint256,uint256,int256)","a43b2ed0":"Test6()","a43b5e46":"buyWeapon(uint256)","a43b7cd5":"carTaxiToken()","a43b92a2":"tournamentIncentiveCut()","a43b9423":"triggerPreJackpotLimit()","a43be57b":"endPresale()","a43c49fc":"mul16(int16,int16)","a43c5415":"lastBlock_a3Hash_uint256()","a43c6002":"getTokensByGame(uint32)","a43cbe1c":"setThirdPartyDepositorDisabled(bool)","a43d12a7":"getParticipantesB()","a43d76e9":"isValidPrice(uint256,uint256)","a43d8654":"getSeason(uint256)","a43dc510":"yesBuyer(uint256,uint256)","a43e04d8":"removeContract(bytes32)","a43e0c2b":"calclulateBonus(uint256)","a43ea59b":"PublicSale(address,address,address)","a43fecbc":"setUsername(bytes16)","a4406bcd":"placeSellOrder(uint256,uint256)","a44081d1":"startPhase1()","a440a190":"getKeyPrice()","a440b21a":"setPortfolioManager(address)","a440dd87":"sigExists(bytes32,address)","a441698b":"getStockOrderInfo(bool,uint256,uint256,uint256)","a441c302":"operationAddress()","a442414f":"sumInvested()","a4425c55":"lastInvestorsProfitSum()","a442b824":"respawnGame()","a442d820":"verifyExtraData(bytes32,bytes32,uint256)","a4430321":"eachPUSTprice()","a4438334":"updateSettings(uint256,uint256,bytes32)","a4439890":"sweepUnallocatedDividends()","a4439dc5":"commitPeriodActive(uint256)","a444502b":"whitelistAccount(address,uint256)","a4447515":"getMakerBetBasicInfo(uint256,address)","a444ae41":"sourceContract()","a444f5e9":"run(uint256)","a4453336":"depositGTA(uint256)","a4453a96":"totalBuyersMapping()","a4453ecf":"splitEth()","a445dc5a":"tokensBoughtWithBTC(address,uint256)","a445f30d":"setFeeDistributionAndStatusThreshold(uint8,uint16[5],uint256)","a4464252":"priceUnitFix(uint256)","a447089e":"eniggerToken()","a447405e":"_getTravelPrice(address,uint256)","a447ff4f":"DXContracts()","a4482f41":"setUniquenessIndex(uint32)","a448afda":"BalanceChanged(address,uint256)","a448f8e0":"OuterContract()","a449a62e":"setDSTWalletLMNO(address)","a44a00c3":"areTokensSold()","a44b1756":"getMyDrugs()","a44b47f7":"TotalSupply()","a44b6b74":"setColor(uint256,string)","a44cff28":"CypressOrganization(bytes,uint256)","a44d0eb3":"MAKJLEB()","a44da065":"NigerTokenICO()","a44dd0f1":"ico2Cap()","a44de4e7":"decreaseStepPct()","a44e09db":"wadmin_burn(uint256,bool)","a44ead73":"ApplyforCertification(string,string,string,string,string,string)","a44eda3c":"checkWithdraw(address,uint256,address)","a44f40e3":"optionPoolMembersUnlockTime()","a4502cb8":"setExportFee(address,uint256)","a45066e5":"SingularityTes25()","a4516bb1":"SnapshotTaken()","a4516fad":"currentGameNumber()","a4520aee":"collect(address[])","a45230ec":"get_amount_sell(uint256)","a4530b4b":"testUpdateProgress()","a4534ef7":"remainingSupply_()","a453b639":"wuguAddr()","a4546876":"roots(address)","a454b07b":"checkString(string)","a454c5dc":"unlockStep()","a45563ed":"UpdateSellAgentBounty(address,address)","a4563e03":"totalPendingWithdrawals()","a4575296":"pepFarm()","a457c2ae":"clientSeed()","a457c2d7":"decreaseAllowance(address,uint256)","a457e1c0":"purchaseAsset(uint256)","a457f27f":"card_titanium_minamount()","a45858b6":"setzUint256Array(uint256[2],int256)","a458e34f":"setNewContractManager(address)","a459ae28":"collectSellFee(address)","a45a7371":"executeUpdateTransferFeeRateProposal(uint256)","a45b1795":"getAllCardsModifierSecondaryVal()","a45c793f":"restore(uint8[176],uint8,uint8)","a45cbbf4":"sendAdvisorsTokens(address,uint256)","a45cd953":"canPurchase(address,address,uint256)","a45d82bd":"signArchive(bytes32,string,string)","a45e11ab":"orderMatchBuy(uint256,uint256,uint256,uint256,uint256)","a45e1a6e":"getTokenCounters(uint256)","a45e7cb5":"addEntry(string,string,string,string,string,address)","a45ee32c":"nameOfIdentity()","a45f2057":"caltoken()","a45f4bfc":"kittyIndexToOwner(uint256)","a45f5685":"setOwnerEarnings()","a45f71ff":"increaseApprovalPreSignedHashing(address,address,uint256,uint256,uint256)","a4604a33":"changeBuyFeePercent(uint256)","a460b817":"updateTicketStatus(uint256,uint8)","a460bd6c":"presaleRemaining()","a4618691":"squak()","a4619682":"registerWithDAI(uint256,address)","a461cadf":"WHOLE_ETHER()","a461fc82":"SELFDESTRUCT_DELAY()","a4620d67":"shareholder3()","a4623cc4":"addHero(string,address,uint256)","a462f87f":"AICoinToken()","a462fb7b":"getFinalAnswer(bytes32)","a4633704":"NotifyMe(address,address,uint256)","a463685f":"AllocatedCrowdsale(address,address,uint256,uint256,uint256,address)","a463a500":"setUpgradeHasBegun()","a464d265":"editor()","a4659ba2":"stakeConfirmed_Eth()","a465e6ba":"committeeKickVoters(address,address)","a46841e1":"cnyEthRate()","a4689d48":"getroundendtime()","a4699cad":"resetWithdrawls()","a469b809":"getBetAmount(bytes32)","a469e5aa":"getOwnerItemIds(address)","a46a1219":"AcceptRouting(bytes32,bytes32,uint256,bytes)","a46a891e":"fromBase(uint256,bytes8)","a46a96d9":"calculateRegionSalePixelPrice(address[16],uint256)","a46afef1":"getSponsoring(uint32)","a46b3e9b":"treasuryDemurrageAmount(uint256)","a46b6593":"sendCandy(address)","a46c3637":"getWinnerCount()","a46c792c":"assignAgent(address)","a46c8fee":"ItdFund()","a46d11dc":"gType()","a46dfb45":"ResolveChips(uint32[])","a46efdb5":"getTokensForPreSale(uint256,uint256)","a46f3c7a":"getLiveMaxBet()","a46fe83b":"numAssets()","a47001a8":"receiveEthPrice(uint256)","a470afa7":"Evernal(address)","a47255d7":"TimeWeekThree()","a472969c":"WithdrawFee()","a472c868":"_storeReward(address,int32)","a4754fac":"getValidated(uint256)","a475b5dd":"reveal()","a476f3d3":"demurringFeeNum()","a4776955":"setselfdroptoken(address)","a4785dfd":"ecverify(bytes32,uint8,bytes32,bytes32,address)","a47905cd":"getBondMultiplier(uint256,uint256)","a47abd0f":"testIsSuccessful()","a47ae542":"getCurrTotalInvest()","a47ae71f":"getCurrTypePrice(uint256)","a47b1a6c":"getContractsAddrs(address,address)","a47c4d64":"isAllocated3()","a47c6b84":"cofounderSwitchAddress(address)","a47ce954":"bonussale_TokenCap()","a47e7110":"AnnoMedal()","a47e713c":"ACCToken()","a47f519b":"CPCE()","a47fcc7c":"proposePartnerAllocation(address,uint256)","a4800172":"buyDiscountTTMByETH(uint256,address)","a48028aa":"valueOf(address)","a480ca79":"collectFees(address)","a481247c":"isKeyExist(address,address)","a48205cb":"emaValue()","a4821719":"buyToken()","a48255b7":"nextPVPBatleBlock()","a4828bca":"TrineChain()","a48296d9":"purchasePhoenix(uint256)","a484f413":"payJosh()","a48515fc":"castConstitutionVote(uint8,address,bool)","a48566ba":"serverSeed(address,bytes)","a487bcd8":"winners()","a487fd07":"ethFundsWallet()","a4893536":"_bonusToBettor(uint32,uint8,uint256)","a4898fd5":"deployContract(address)","a489a2c7":"sanityBounds()","a48a663c":"transferFromToICAPWithReference(address,bytes32,uint256,string)","a48bdb7c":"results()","a48be00b":"activateTokensForJury(uint256)","a48c98dd":"deployerAmount()","a48cef4a":"oracleInterfaceCountdown()","a48d9e70":"getIcoSupply()","a48de68b":"createPromoHero(uint256,address)","a48e1ff7":"BonusWithdrawn(address,uint256)","a48fb972":"_sendReward(address,address,uint256)","a49062d4":"MAX_LEVEL()","a490a697":"totalBadges()","a4923b8f":"placeIndexToOwner(uint256)","a492ef60":"Participant(string,address)","a4935f1f":"_tokenMetadata(uint256,string)","a4938313":"getAdvancedTransfer(bytes32,uint256)","a493b39f":"getAdPriceWeek()","a494411c":"allocateTokenForAdvisor(address)","a4945a07":"ftestnetico()","a494817b":"setIdle()","a4951771":"MeshPoint(string,address)","a4952f19":"LogPolicyPaidOut(uint256,uint256)","a4952f80":"getBytesName(string)","a49545ec":"useTokens(address,address,uint256,uint256)","a495c942":"set_topl_address(address,address,uint256)","a4963c0b":"SAPOVAM(address,string,string,uint256,uint256)","a49687d1":"stage4Deadline()","a4975aff":"raiseNumberOfCheckmarks(uint256)","a4978a15":"applyLOT(uint256)","a497d8c6":"privateTokenCap()","a497e674":"setAuctionDuration(uint256)","a4983079":"transferBalanceForPreSale(address,uint256)","a49886ce":"testToBytes32(bytes)","a499bc4a":"DECEX()","a49a1e7d":"setMetadata(string)","a49a42e1":"CrytoWorldCup()","a49bb55c":"currentRoundMultiplier()","a49c2bbb":"getBeneficiaryCash(bool)","a49cc76c":"createCurrency(string,string,uint8,uint256,string)","a49d03bc":"privateSell1Address()","a49d53a1":"SmartRevshare()","a49d6be2":"shekel()","a49e0ab1":"complex()","a49e4540":"mintCapInETH()","a49ea0ab":"rankOf(bytes)","a4a0d801":"valueOfContract()","a4a1485b":"createEthInvestorRequest(uint256)","a4a1a78d":"CertAdminAdded(address)","a4a1a9bc":"fightTeams(uint16,uint8,uint8)","a4a1e263":"getUsersCount()","a4a249d6":"quicksort(uint256[])","a4a2a9f6":"init(address,uint256,uint256)","a4a33638":"NAST()","a4a339ee":"doMint(uint256)","a4a3513c":"Accelerate(uint256)","a4a46f45":"LOG_InvestorEntrance(address,uint256)","a4a47582":"Pyrgressive()","a4a4c224":"setAngelLastBattleTime(uint64)","a4a5a46e":"EUNO()","a4a5e241":"setPrizeEndTime()","a4a5f550":"price_exponent2()","a4a6795a":"ReserveSupply()","a4a68e44":"userlogin(address)","a4a691ce":"parseResultCompatible(bytes)","a4a75c6e":"tokensSoldAmount()","a4a75edc":"registerDeal(address,address)","a4a7cf5c":"redeemWinnings(bytes32)","a4a83317":"emitChange(bytes32)","a4a85b22":"fund(address,address)","a4a8f8ea":"migrationHost()","a4a92dd0":"_createToken(string,address)","a4a94567":"setTokenContract(address,address)","a4aac6ec":"diff(int256[])","a4ab3e45":"buyerAddressTransfer(bytes32,address,address)","a4ab69cd":"cancelBuyOffer(uint32)","a4ac3e7d":"FrozenFu(address,bool)","a4acbcd6":"pregnantpuppies()","a4ad1a5f":"verEntidades()","a4adb24b":"createCourse(string,string,uint256)","a4adc2f7":"freezeTokens(uint256)","a4adc431":"fechVoteResultForCandidate()","a4adcde3":"getSingleGuessInfo(uint32)","a4ae32fd":"sampleBool(bool)","a4af1d1a":"totalPublicSaleStage()","a4afaeb0":"AutoKen()","a4b03f52":"internalLockAccount(address)","a4b06df2":"heapSort(uint8[])","a4b0a36f":"exchangeRateUSDToToken()","a4b159c0":"benefitMicros()","a4b16449":"transferTokensFromRetailersAddress(address,uint256)","a4b195ff":"numVoters(uint256)","a4b1b020":"transferLockedTokensBackToUser(uint256)","a4b1ce55":"scheduleCall(address,address,bytes4,bytes,uint8,uint16,uint256,uint256,uint256,uint256,uint256,uint256)","a4b31eb1":"bitWatt(uint256)","a4b32bd7":"modifyRent(uint256)","a4b3b042":"RDXToken()","a4b48828":"getOffer(address,address)","a4b52ef2":"hgt()","a4b5fa56":"blacklist()","a4b7459a":"transferFromToICAPWithReferenceCallGas()","a4b7f5ce":"resolutions(uint256)","a4b8a543":"sacarETH()","a4b8c2e7":"restart(bytes20,bytes32)","a4b910fb":"WithdrawToken(uint256)","a4b916e2":"mintB2BC(address,uint256)","a4ba2971":"addMemoryImageSlice(uint256,bytes)","a4ba5bdb":"Leonidas()","a4bad0ae":"vestingsBalance(address)","a4bb1324":"initGame(address,uint256,bytes32,bytes32,bytes32)","a4bb252e":"LogGameCreated(uint256)","a4bb43d2":"Beonbox()","a4bbded4":"MAX_ICO_SUPPLY()","a4bbf1a7":"LAUCHCONTRACT()","a4bc51d4":"PrivateSocialPlatform()","a4bce83c":"CSCToken()","a4bd7a20":"currentBoundary()","a4bd7b8d":"countApproval()","a4be2ea2":"HardClear()","a4be64a4":"warriorBlock()","a4beda63":"lockTime(address)","a4bef732":"userCancelOrder(address,address,uint256,uint256,address)","a4beffa7":"increaseInvestment()","a4bf594b":"CORENETCOIN(uint256,string,uint8,string)","a4c089be":"debug_finalizeBundleIPFS(bytes32,string,bytes32)","a4c0ed36":"onTokenTransfer(address,uint256,bytes)","a4c0fd51":"onlinenewsbalita()","a4c1e9c0":"depositToUser(address)","a4c3dfa4":"buff()","a4c3e789":"RUB_Omnidollar()","a4c44074":"setCashbackManager(address)","a4c4dfea":"WGNToken()","a4c4f172":"_arrayContains(uint8[],uint8)","a4c5bf66":"removeSkipPrice(uint256)","a4c64d78":"getContractDividends()","a4c6569b":"isWhiteListed(bytes32)","a4c673c5":"pauseInvest()","a4c6fcde":"allowEscrow(bool)","a4c756c7":"tokenAllocToTeam()","a4c7c7b3":"partner1()","a4c89322":"ethToTokens(uint256)","a4c8b35d":"moneyManager()","a4c93cab":"setDistributionSize(uint256)","a4c97967":"proof_of_public_key()","a4c9b0ca":"deleteTx(bytes32)","a4c9bb28":"VLOGCoin(uint256,string,string)","a4ca80be":"lockFile()","a4cae72b":"_createEtherDog(uint256,uint256,uint256,uint256,address)","a4caeb42":"periods()","a4ccd1ba":"breakevenLevel()","a4ce48c0":"addProposal(bytes32,uint256,bytes32)","a4ce8683":"create(string,string,uint8,address,string,address)","a4d1f29f":"BifrostToken()","a4d22c13":"enableDonation()","a4d28b62":"getMedalsBurned(uint16)","a4d33646":"setELIXAddress(address)","a4d4f070":"get_token()","a4d55686":"totalEthFundRecieved()","a4d575ce":"_forward(address,bytes)","a4d5a3a5":"airdropAmount(uint256)","a4d5a519":"TXwithCode(bytes32,uint256)","a4d5e30e":"removeHatchingTimeFee()","a4d66daf":"limit()","a4d66f1e":"calcReleaseToken(uint256)","a4d67d63":"finishGenerating()","a4d69fd3":"payoutMethodABI()","a4d6bb2b":"latestPayout()","a4d714c7":"addressToBytes2(address)","a4d72886":"PRE_ICO_RISK_PERCENTAGE()","a4d755ff":"setFactoryName(uint256,string)","a4d82f95":"Wallet6()","a4d840a8":"getInvestorInforMax(uint16)","a4d8b40a":"order2Shares(uint256)","a4d904ba":"foundersStake()","a4d91b02":"createtoken(string,string,string,string,string,string)","a4d924b6":"extractableFraction()","a4d95c76":"setRobotCoinContract(address)","a4d97569":"ACLYDCoinContract()","a4d99522":"setCryptaurRecovery(address)","a4da79a7":"_tokensOfOwner(address)","a4db2e9a":"initDao(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","a4db8c73":"BieberToken()","a4dbafbb":"batchReturnTokens(uint256)","a4dbbbf1":"joinWithCandy(address,uint256,uint256)","a4dd73cd":"isMinimumValue()","a4ddf312":"numberOfPunksToReserve()","a4de3c19":"setFeeAccount(address,bool)","a4de64c4":"isFundedMini()","a4df0758":"isClaimed(address,address)","a4df320d":"end_LOCKUP()","a4df6c6a":"freezeTokens(address,uint256)","a4df8ca1":"See_TokenPurchaser_Number()","a4dff0a2":"zzz()","a4e01230":"RamenContract()","a4e02fcc":"transferProfit(address,uint256)","a4e24173":"getUsersArtefactsIds()","a4e2d634":"isLocked()","a4e3374b":"transferDelegated(address,address,uint256)","a4e339c1":"validate(address,uint256,bytes32,bytes,bytes32)","a4e360c8":"getApprovals(uint256)","a4e4a7bb":"avatar(address,bytes)","a4e6dd3a":"coinDrain()","a4e85358":"getTEth(uint256,uint256,uint256)","a4e8e360":"enterFreeRaffle(uint256[],uint256)","a4e9bcb8":"vxtestPrivateSale(address,address)","a4ea471f":"getBoardRowDetails(uint256,uint8)","a4eacb34":"removeFromBountyProgramMap(address)","a4eaec5f":"targer()","a4eb5710":"needReleaseFor(address)","a4eba44d":"setPriceCoolingPeriod()","a4ebf74d":"CorsariumAccessControl()","a4ec0620":"getAllCoins()","a4ec11b1":"getStepFunction(uint256)","a4ece52c":"pop()","a4ed22b6":"testInsertLawyer()","a4edff47":"addNote(string)","a4ee7c18":"_computeCommission(uint256)","a4eed4dd":"setupWhitelist(address,bool)","a4ef2cbb":"setWhiteListAgent(address)","a4efc580":"lastPriceCheck()","a4f0d9b1":"setCut(uint256,uint256)","a4f15498":"projectedPrizeForPlayer(address,uint256)","a4f2613d":"bid(string,string)","a4f28bdd":"fundingMinInEth()","a4f29aad":"setTokenName(string)","a4f35b65":"minTransfer()","a4f3fa10":"getToday()","a4f4662f":"getOwnersTokenIndex(address,uint256)","a4f5b8c1":"bonusCreationRate()","a4f63ec8":"setBytesArrayIndex(bytes32,uint256,bytes32)","a4f6d5ce":"BeeGims()","a4f7c2b7":"getLeftChildI(uint256)","a4f82f27":"allocationOf(address)","a4f89235":"SALE0_CAP()","a4f91a2e":"remainingOwner()","a4f927d5":"certifyAccount(address,bool)","a4f939a1":"_touched(address,address)","a4fa75cf":"StartIcoStage()","a4fa8d57":"reward(uint256,uint256)","a4fac56e":"rateForOnePTM(uint256)","a4faf89e":"incentivesOut(address[],uint256[])","a4fd3cea":"getToken(uint256,uint256)","a4fd6f56":"isEnded()","a4fda741":"usedResidualAmount()","a4fde8bc":"player_declare_taking_too_long()","a4fefad6":"_currentSupply()","a4ff83f5":"warriorsByPlayer(address,address)","a4ffd7fa":"noOfICOPhases()","a5007da7":"openEgg(uint256,uint256)","a50097f2":"getUserEthVolumeSaldo(address)","a501123d":"doRollBet(uint256,uint256,bytes32,bytes32,bytes32)","a501553e":"getAssetLength()","a501ab39":"sendToMe()","a501e88d":"Content()","a5021a17":"getNodePrice()","a5025222":"addressExists(address)","a502aae8":"getNextGenerationId()","a502bfbd":"invest(address,uint256,bytes)","a503473a":"mul2Assert(uint256)","a50395cf":"totalPetCardSeries()","a504bd0d":"nextTradeEvent()","a50643b7":"getPrizePoolSize()","a506e5dc":"transferLand(uint256,uint256,address)","a5075567":"RegistrationAntique(bytes32)","a50776dd":"managementLocked()","a508ae0f":"P2TCToken()","a508dd1d":"OldCanYaCoin()","a509b030":"recentActivityIdx()","a50a1fe6":"remainingAmount()","a50b21c8":"getInputData(uint256,uint256)","a50c386a":"exFeeRate()","a50cd8e7":"votesFor(address)","a50cf84e":"ICO_PHASE2_PERIOD()","a50d81c7":"mintForOwner(address)","a50e20c1":"checkProfit(address)","a50ec326":"deposite()","a50ed19b":"setCooldown(uint256,uint256)","a50edca0":"fiat()","a50f2a25":"AirdropSingle(address,uint256)","a510921e":"SaleStop()","a510f776":"setCompany()","a512fb25":"Purchased(address,uint256)","a5135634":"avalibleSTCTokens()","a51548a1":"CryptoPainting()","a515aaeb":"cdFee()","a5171828":"MillionDollarToken()","a5177400":"minimumContributionPhase3()","a5181756":"AdameToken()","a519419e":"depositoryDelegate()","a51a6054":"roundLeader()","a51a8682":"saleTransfer(address,uint256)","a51ad03f":"isFirstYear()","a51aea2d":"changeMaxMultiplier(uint256)","a51af4c5":"distributorAddress()","a51b79e3":"changeYumAddressTo(address,address)","a51ba542":"deleteMonsterIndexToApproved(uint256)","a51bb77a":"getInvoiceHashAddresses()","a51d5924":"transferMain(address,address,uint256)","a51d5f02":"RemoveOwners(address[])","a51db46b":"changeDX(address)","a51e62a1":"developmentAuditPromotionWallet()","a51e81bb":"TRexCoin()","a51f3782":"investor_getMediumInfo(address)","a51f41a0":"setConfig(uint256,uint256,string,string,uint256)","a51fbb3f":"approveTokensWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","a51fe113":"start(uint256,uint256,address)","a52079ea":"balanceBlocksIn(address,uint256,uint256)","a521036c":"feePaymentEnabled()","a5214f77":"setContext(bytes32,address)","a521ebfa":"refundPresale(address,uint256)","a521f09f":"Greenbow()","a522ad25":"withdrawTokens(address,address)","a523b88a":"like()","a524ce4f":"deliverPresaleTokenToClient(address,uint256)","a525663a":"updateOwnerProprietaryData(uint256,string)","a525f42c":"transferFromToICAP(address,bytes32,uint256)","a526c826":"ICOBuyer(address,address,uint256,uint256)","a526f74f":"PRICE_AFTER_SOFTCAP()","a527096e":"preallocate(address,uint256,uint256,uint256,uint256,uint256,uint256)","a5289158":"end(address,address)","a528cb4f":"currentNumberOfRares()","a528fec4":"setSecureFees(bool)","a5290f74":"phase_2_rate()","a5294f93":"CryptoTradeToken()","a5295ae4":"AaaToken(uint256,string,uint8,string)","a5298955":"setAllHatchConfigs(uint32[],uint256,uint32[])","a52a0f8e":"getIntervalCoefficientMultiplier(uint256,uint256,uint256)","a52b121e":"faucetThresholdSecs()","a52b2b88":"hasWon(address)","a52b904b":"ScoreToken(string,uint8,string,string)","a52bc175":"Essential()","a52c0512":"getNumIncorrectDesignatedReportMarkets()","a52c101e":"send(uint256)","a52c11a6":"setBalance(uint8,address,uint256)","a52c34c3":"shopSettings()","a52c9efd":"updateIncrease(uint256)","a52cf5a4":"HanlinTestToken(string,string)","a52dc2e7":"blockN()","a52e6180":"setDiamondAuctionAddress(address)","a52ef9b0":"look_for_node(address)","a52f365a":"dissmisPurse(uint256)","a52f89fa":"nujaBattleTransfer(address,uint256)","a5304fc3":"ownerSetJpMinBet(uint256)","a5313069":"StairStepDecayingTokenFunction()","a53260c1":"migrateEthers()","a53290ab":"getClassTransformInfo(uint32)","a53324b5":"mint(uint256,string,uint8,string)","a53367dc":"ICOBuy()","a533daf7":"investmentPositions()","a533fb8d":"_mintToPool(uint128,uint256,uint128)","a534150c":"feePpm()","a536ae38":"payBidAllocationFee(bytes32,uint256)","a536cffd":"assertEq6(bytes6,bytes6,bytes32)","a536dbe8":"getCurrentPrice(uint256,uint256,uint8)","a5374005":"paymentsProcessor()","a537b716":"applyWithdraw(address,uint256)","a53818ca":"setNodeAllocation(address)","a53830e3":"numVotes(address)","a538d287":"getMinMax()","a53a1adf":"approve(bytes32)","a53a4747":"setOperatingCost(uint32[5])","a53aeb4e":"accumulate()","a53b1c1e":"setInt256(int256)","a53bfcf5":"varTokenAllocation(uint256)","a53c6dd4":"splitComissions(uint256)","a53c7b45":"setGameStatus(bool,string)","a53cb8ca":"setWhitelistTokens(address,bool,uint256)","a53d5205":"stepTwoLockEndTime()","a53d66e4":"changeAuxPartner(address)","a53ec007":"changeAirLimitCount(uint256)","a53f0e14":"addGrant(address,uint256,bool)","a53f138a":"updateTeamsTableAttributes(uint256,uint256,uint256,uint256)","a54016a0":"set_price_in_micro_ether(uint256)","a5403b3b":"secondaryLedgerCount(string,address)","a540db73":"triggerCooldown(uint256)","a5410a66":"kycVerified(address)","a5417f64":"decreaseICOEndTime(uint256)","a541a2a2":"projectCreator()","a5422d8a":"mineSoul()","a542a02f":"lookupAllSprites(uint256)","a542c3d7":"stageDevelop()","a54315fd":"SetBuyoutPrice(uint256,uint256)","a543a7e5":"addLockUpData(address,uint256[],uint256[])","a543bae7":"createSwap(bytes20,address)","a5440fa0":"GetAll()","a54447aa":"purchaseCard(uint256)","a544594e":"donateDAI(uint256)","a544805c":"CentralityGiftShop()","a544f062":"finanReserveWallet()","a54527d5":"AllSpringChainToken()","a54580f2":"drive()","a545ff0c":"withdrawRemainingEthAfterAll()","a5460352":"_validatePurchase(address,uint256,uint256)","a54677e3":"getOptionTitleForPoll(uint256,uint256)","a5468081":"Pyramid(address)","a546cbf7":"core(uint256)","a546f2e7":"changeNewHDX20Contract(address)","a5473276":"slice(uint32[],uint8,uint8)","a5473f78":"withdrawOrderRefundToOrder(uint256)","a54799bd":"Person(string,address)","a547adce":"lastBlock_f16()","a547ec4c":"setTime(uint256,uint256,uint8)","a548617c":"SampleCrowdsale(uint256,uint256,uint256,address,uint256,string,string,uint8,uint256)","a5488a37":"allowTransactions()","a54940b1":"Devable()","a5496781":"NamiMultiSigWallet(address[],uint256)","a5496e60":"newProposal(uint256,string,string,uint256,uint256)","a549ac10":"mintNFTForSale(uint256,string,uint256)","a54a2b8b":"testBlockHashFetch()","a54b2a73":"burnPool()","a54baeda":"removeAllowedLock(uint256)","a54c2a9a":"removeListing(uint64)","a54cd4f7":"minParticipants()","a54d396e":"internalAction()","a54e1ec4":"SubpreferToken()","a54efb1e":"BKB()","a54ff9ac":"downvotePost(bytes32)","a5500c30":"setAirdropAmount(uint256)","a5502b01":"Total_Players()","a550f86d":"named(bytes32)","a5512db0":"setTSTC(address)","a5513af5":"checkPrevOwner(bytes32)","a55168ea":"SendEtherToAsset(uint256)","a551878e":"fix()","a551de87":"MonethaAddressSet(address,bool)","a55231f4":"declareEmergency(string)","a552c8a0":"LogSendFail(uint256,bytes32)","a553506e":"checkData(bytes32)","a5536fe7":"mutable()","a553748e":"listingActive(uint256)","a5537586":"conversionOfferedAt()","a553a597":"configure(uint256,uint256,uint8,address)","a553c4d2":"tier2LOT()","a553e1da":"getUserTokensCount(address)","a5541ca2":"AICT()","a554a72e":"POINTS_TO_SPEND()","a55526db":"touch()","a55545a9":"EthVocToken(uint256,string,string)","a556a057":"ZAPAX()","a557f834":"month24companyUnlock()","a558410a":"test_twoValidEqUint(int256)","a5584456":"addDiscount(address,uint256,uint256)","a559217c":"raisedEther()","a5595683":"lockBalance(address,uint256,uint256)","a559ec20":"upgradePendingExchange(address,uint256)","a55b13c8":"validOtherSource(string)","a55bbff9":"setDatePayout(address,uint256)","a55c51d8":"havven_escrow()","a55c974f":"tokenXstepCAP()","a55cab95":"getName(uint8,uint8)","a55cc1cc":"newTokenWeiPrice()","a55cd51c":"updateMaxBet(uint256)","a55d260d":"depositNoRef()","a55deccb":"locked(address[],uint256[])","a55e9370":"getDateCount()","a55ec39d":"BulkTransfer(address[],uint256[])","a55ee823":"BYN()","a56024d8":"deleteUserForUser(string,uint8,bytes32,bytes32)","a5603f02":"getCurEarlyIncomeByAddress(address)","a5609ab5":"enableDepositTo(bool)","a560a956":"duelAnotherCovfefe(uint256,uint256)","a5613724":"Start1()","a561b1c2":"executeBatchTransfer(address[],uint256[])","a56226ef":"officialApplicationSignUp(string)","a5622c94":"xEURCoin()","a5627d32":"callDeposit(uint256)","a564871f":"ctWallet()","a56539a4":"_addLock(uint256,uint96,address,uint256)","a565efff":"countWinners()","a566d383":"softCapCHF()","a5670c80":"get_sale_arbits_per_ether()","a56793ae":"addCoin(uint256)","a567d371":"prepareForRefund(address,address)","a568907a":"SUCToken(address)","a568a09d":"BuyShareWithDividends(uint32,uint256,uint32,address,address)","a56a1de0":"Mortal_HelloWorld()","a56b3d11":"setNewCdFee(uint128)","a56b60ee":"_removeFromBlacklist(address)","a56be205":"developer_new_price(string)","a56befd1":"required_number_players()","a56c2ac0":"totalWeiRefunded()","a56c5be1":"WithdrawConfirm(uint256,uint256)","a56d1de3":"valueOfVault(uint256,address)","a56d7601":"getPlayerTickets(address,uint256,uint256)","a56d96bb":"unmint(uint256,string)","a56dfe4a":"y()","a56e7213":"unpausePending()","a56e7bae":"getTitleAddress(uint256)","a56f2d5f":"AutoMOBILEtoken()","a56f5b53":"withdrawDonations(address)","a56f9bea":"KarTokenERC20Advanced(uint256,string,string)","a5705d17":"performUpdateStackPtr()","a572ba41":"CEL(uint256,string,uint8,string)","a5731c1c":"getTXSAddress(uint256)","a573a9f4":"Bilateral()","a57429e2":"getWinConditionInLibra(bytes32)","a5749710":"getCurrentBalance()","a574cea4":"getMetadata(uint256)","a5752034":"changeRound(uint256,uint256,uint256,uint256)","a57544da":"right36(uint256)","a5758552":"redeemTokens(address)","a5766aa6":"setFeePercentage(uint8)","a577efd4":"closePot(string)","a578ae32":"getApprobation(uint256,address)","a578e38a":"RadiumSupply()","a5790bde":"toBytes1(bytes)","a57918dc":"ptc_addr()","a579349a":"currentStageRemainingJM()","a579e461":"SetAdminContract(address,address)","a57a84a6":"sendPending()","a57c0919":"update(uint256,uint8,address,address,string,string)","a57c6e86":"sellTokens(address,uint256,uint256,address,bytes)","a57ce52f":"_removeKeeper(address)","a57d1560":"lottery(uint256)","a57d814b":"MONACOESTAT()","a57e768c":"SetLockAddress(address,bool)","a57f57f8":"TBToken()","a57f59c0":"getMatchInfoList02()","a57f6500":"readCTDdata(uint256)","a5804521":"StateChanged(bool,string)","a58079fc":"FIXED_PRESALE_USD_ETHER_PRICE()","a58091cd":"privateSaleSencPerMEth()","a58092b7":"getSanityRate(address,address)","a580a5b0":"setRepayment()","a58180b4":"_batchBuild(uint256[],int256[],int256[],uint8[])","a581a27a":"owner_balance()","a581c333":"getSHA256(bytes)","a581ff0e":"CopyrightExchangeToken(uint256,string,string)","a5820daa":"issueTokens(uint256)","a5828b7d":"payBonus(address)","a583535d":"addCutie(uint32,uint256,uint256)","a5841194":"sync(address)","a5842415":"Cubes(uint256)","a5843f08":"init(uint256,uint256)","a5847862":"sizeOfString(string)","a584d8cc":"startProduct(string,string,string,int256)","a58561ec":"DISCOUNT_STAGE_TWO()","a5857318":"getIdArrayItemsCount(address,uint256,string)","a586fd0f":"_substring(string,int256,int256)","a587686d":"addCardToEdition(uint8,string,uint8,uint8,uint256,uint256,uint256)","a5878c65":"addPrivatePresaleTokens(address,uint256,uint256)","a587c9f7":"bountyTokenAddress()","a587cd36":"DisableSetTransferable(address,bool)","a587da29":"setPackage(bytes,uint8,uint8,uint8,bytes)","a588a968":"rushitesticoToken()","a5891bb0":"modifyWhitelistMulti(address[],bool[])","a5898832":"getReferrerRewards()","a58ac1a1":"buyTokensInternal(uint256)","a58b2e43":"LendingLiquid()","a58b55a9":"StreamityEscrow(address)","a58b7eed":"setFlags(address,address,uint256)","a58ba458":"multiTransferTightlyPacked(bytes32[],address)","a58c07ee":"fetchOrderByIdWithPayerByAdmin(string,address)","a58c30c5":"block2()","a58d3ad1":"dumpCube(bytes,bytes32)","a58daf76":"setAuthorizedToDraw(address)","a58fd85b":"setReflectSwitch(bool)","a58ff4fc":"deletThisContract()","a590529e":"updateWithPositionHint(uint32,uint128,uint128,uint32)","a590799a":"refundInvestment(address,uint256)","a59162eb":"OWEToken()","a5917019":"SecurityDepositCreated(uint256,address,string,string,uint256)","a5917baf":"vestingVault()","a5917dea":"processInternalRequest(string,bool,uint256,uint256)","a591d4a6":"getMsgValueAfter()","a5925b5b":"clearAuthorization(address)","a59307e8":"Play(address,bytes1,uint256)","a593845f":"_rollCriticalDice()","a594056f":"getPriceInExoTokens(uint256)","a59455dc":"getPacket(uint256)","a594a117":"giveGen(uint256)","a594a236":"_updateClaims(string,string,string)","a594b29b":"PRE_SALE_START_4()","a595a94d":"_sendGameGift(address,uint256)","a595b655":"Gimli()","a595f2eb":"quantidadeDeAutorizacoesNecessariasParaUmaNovaOuvidoriaPoderSeCadastrar()","a5967039":"cancelMigration(address,address)","a5968cc6":"PresaleTokenVesting(address,uint256)","a5976f97":"allocateReservedFunds()","a59799e6":"updateAvatarInfo(uint256,string,uint256)","a5982885":"assertFalse(bool)","a5985e8c":"getLevel()","a5987c9e":"getMyKilo()","a5989dbe":"nines(uint256)","a599ef65":"enroll(uint256,uint256)","a59a3750":"getWeapon(uint8[176],uint8,uint8)","a59ac6dd":"buy(address,uint256,uint256)","a59aef4e":"nickOf(address)","a59af340":"isInvestorApproved(address)","a59b193a":"setRecord(bytes32,string,string)","a59b7de5":"consumeCoinForNova(address,uint256)","a59cacb2":"setMinWeiAllowed(uint256)","a59d6986":"recoverLostFunds()","a59d930b":"ownerSetEtherwowAddress(address)","a59dbfb7":"gift_Transfer(address,uint256)","a59def62":"ABYSS()","a59eca54":"getPlayerIdByAddress(address)","a59f3e0c":"enter(uint256)","a59f8a2b":"GFCB()","a59f9d56":"ChangetokenManagerAddress(address)","a5a01bc7":"addCarInit(address,uint32,uint32,uint32,uint64)","a5a0545f":"FCChainTokenTest(uint256,string,string)","a5a2286b":"ReserveAddress()","a5a2aa33":"purseExchange()","a5a2cb19":"buyUpgrade(uint256)","a5a2fc4a":"claimableFeesOf(address,uint256)","a5a32c3a":"GEMCHAIN()","a5a3ad0b":"ValidatorBond(address,address)","a5a45785":"setRescue(address,bool)","a5a54ea5":"SM()","a5a584a2":"QuestionToken()","a5a5f468":"WorldCupAuction(uint256,uint256,bool,address,address)","a5a65bba":"checkvehrespond(uint256,address)","a5a6a7b2":"after20Seconds()","a5a6d7b3":"sellMyBanana(uint256)","a5a7d086":"ethereumFoundationTickets()","a5a7dadf":"preCrowdsaleEndTime()","a5a83e4d":"right91(uint256)","a5a899ec":"halts()","a5a8c53d":"setmessiCommunityAddress(address)","a5a98d78":"inflate()","a5a9ba8d":"getSellReturn(uint256)","a5a9cf0d":"sixthTeamWithdrawal()","a5aa0545":"createHumanStandardToken(address,uint256,string,uint8,string)","a5aa4348":"setTitulaire_Compte_9(uint256)","a5aa542e":"remainingFunds()","a5ab3436":"Payouts(uint256,bool,address,uint256,uint256)","a5ab5479":"generateNum2Win()","a5ab89ff":"setHost(string)","a5abe7f6":"isConstant()","a5acb022":"LOG_BetWon(address,uint256,uint256)","a5acc46e":"PauseInfrastructure(bool)","a5acd206":"updateStateFromOracleFoo(address)","a5ad0588":"transferFrozenTokens(address,uint256)","a5ad1348":"checkPosition(address,address,uint256)","a5adb226":"setABackend(bytes32,address)","a5ade117":"candyPrice()","a5ae65ba":"getGen()","a5aeb9b7":"totalWeiContributed()","a5af66c5":"HowLongIsDisputeRevealStillRunning(uint256)","a5b067b3":"INKCToken()","a5b0930d":"getAddressArray()","a5b19937":"endVesting(address,address)","a5b1e13d":"settle(address,address,uint256,uint256)","a5b222c9":"setData_20(string)","a5b2235d":"register(address,address[])","a5b36a36":"stalePeriod()","a5b3720b":"BulkTransfer()","a5b3d1a9":"tenmarionCoin()","a5b4069e":"DataCoin(address)","a5b41c0e":"AK48Coin(uint256,string,string)","a5b4aaab":"editMilestone(uint256,uint256,uint256,uint256,uint256,string,string)","a5b4f7d3":"setAgentVerificationByAgent(bytes32,address)","a5b538f9":"nextBonusPayout()","a5b589ce":"mHostFee()","a5b6420e":"_setBool(bytes32,bool)","a5b6ea8f":"spin(uint256)","a5b70519":"multiValueAirdrop(address,address,address[],uint256[])","a5b75814":"bonusPhase3()","a5b781e1":"lockPostion1Add(uint8,address,uint256,uint256,uint8,uint256,uint8,uint256,uint8,uint256,uint8)","a5b78bfa":"NebulaToken()","a5b87ef7":"StgFourbonusEnds()","a5b9e922":"getContentTimetamp(uint256)","a5ba3b1e":"tokenClaims(uint256,address)","a5bb9162":"tokenadd(address,uint256)","a5bbc311":"getNCSTotalSupply()","a5bbc423":"withdrawByEmergency(string)","a5bbd67a":"lockedAddresses(address)","a5bbe7bf":"takeOrder(address,uint256,uint256)","a5bc770c":"tokensPerKEther()","a5bd1566":"getDiscipleVend(uint256)","a5bdbb28":"buyBlock(string,uint256,uint256,uint256,uint256)","a5be0c5e":"ERC20Proxy(string,string,uint8,address)","a5be1a4d":"multipleTransfer(address[],uint256)","a5beb4e5":"claimRefundFor(address)","a5bebf48":"founderTokenUnlockPhase1()","a5bf7aae":"CPSTestToken1()","a5bfa9a9":"claimToken(bytes32)","a5bfd16a":"getAllLoans()","a5c02493":"setChain(string,address,address,address)","a5c04bfe":"allocateTeamBonus(address,uint64,uint64,uint64)","a5c102a2":"setMinterFeePercent(uint256)","a5c12df9":"OpenANXToken(address)","a5c154b3":"setMiniPoolEdit_2(string)","a5c1db32":"CrosspaysToken()","a5c28b1e":"getGovtApplication(string,string)","a5c3eb03":"UbbCoin(uint256,string,string)","a5c464b3":"isOnSaleAny2(uint256,uint256)","a5c5436f":"preCaution()","a5c5463f":"getCurrentlyRunningTier()","a5c5762b":"PVT_INV_TOKENS()","a5c57b18":"BITDINERO()","a5c58944":"dSetEditorArbitraryData(bytes32,bytes,bytes)","a5c5edee":"updateGameMetadata(uint256,string,uint256,bytes32[])","a5c6ac0d":"percentagePerMonth()","a5c7ac13":"test_updateKey_decreaseNoHint()","a5c81622":"signedApprove(address,address,uint256,uint256,uint256,bytes32,address)","a5c860ba":"eth_minimum()","a5c8a201":"geth(uint256)","a5c8b7a1":"transferPublisher(address)","a5c978c0":"TIA()","a5c9cd82":"TOKEN_UNIT()","a5ca2afa":"VESTING_INTERVAL()","a5ca35f5":"Trade(uint256,address,uint256,address)","a5cae60c":"getAppInfo(uint32)","a5cb66c0":"ChronosCore(uint256,uint256,uint256,uint256)","a5cbe71c":"getCooldownEndBlock(uint256)","a5ccd855":"setConstractDeployTime(uint32)","a5ccfb06":"sellCard(uint256,uint256)","a5cd184e":"free(bytes32,uint256)","a5cd3fd0":"steemh()","a5cd761f":"getTokenOwner(uint256)","a5cd806b":"BONUS_PCT_IN_VREO_SALE_PHASE_1()","a5cda792":"distribution(address[],address,uint256[],uint256[])","a5ce0693":"endBlockBonus1()","a5ce3eb0":"totalPaidAmount()","a5ce413b":"unstakeTokens()","a5cf3898":"verifyExtraData(bytes32,uint256)","a5cf38da":"createCrowdsaleTiers(bytes32[],uint256[],uint256[],uint256[],bool[],bool[])","a5cf56f2":"ethReceivedPresale()","a5cf599c":"ENDING_TIME()","a5d048d3":"create(address,uint256,uint256,address)","a5d0bab1":"buyPartial(uint256,uint256)","a5d18cb6":"checkGameAmount(uint256)","a5d1c0c0":"gameTime()","a5d33c2b":"MessageSentToChannel(address,string,string,uint256)","a5d3845b":"tokenEventAddress()","a5d572c4":"fixedTotalSupply()","a5d57bb7":"ApproveAndDo(address,uint256,bytes32,string)","a5d5ca54":"PolyCustomers()","a5d5db0c":"depositCollateral(address,uint256)","a5d638f1":"transferOwnershipRequest(address)","a5d677ab":"getFileByIndex(bytes32)","a5d68bfd":"RATE_WHOLESALE()","a5d6d4c3":"mintAuthorizedBatch(address[],uint256[])","a5d7a14f":"ContractorProposalAdded(uint256,uint256,address,uint256,uint256)","a5d8628a":"AgriChainDescription()","a5d871c0":"AddressChanged(uint256,address)","a5d8746e":"canMakeBet()","a5d8b72b":"midasAdvisorOperateMarketingAddress()","a5d8cdf2":"deploy_time()","a5da0bf5":"addAfterId(address,uint32,uint128,uint128,uint32)","a5db83e4":"marketRegisterToken(address)","a5dcf458":"uintToBetsArray(uint256)","a5ddfef1":"getTotalAmountOfTokens(uint256)","a5de12ab":"ITBITSToken()","a5de3619":"admins()","a5de811f":"checkMyWithdraw(address,address)","a5def8cb":"numbOfFrozenAmCount(address)","a5dfd89a":"getPrize(address,uint256,bytes3,uint16)","a5dfee67":"testThrowsCreateNewRevisionNotUpdatable()","a5e00e53":"QNTU(address[],uint256[])","a5e108af":"addEmployerContract(address,address,uint256)","a5e11729":"maxPower()","a5e1c5b5":"setVal(bytes32,uint256)","a5e20eaa":"getProjectStartDate(bytes32)","a5e220c2":"Owner(address)","a5e2dbfb":"_scto(uint256,uint256,uint256,uint256,address)","a5e33048":"generateTokens()","a5e45bec":"range(uint256)","a5e4e9a0":"maxCWCsPerReturnLessThan()","a5e4fedc":"LogTransferFromOwner(address,address,uint256,uint256,uint256)","a5e52c08":"ImmediateProfit(address,uint256)","a5e53bfe":"checkRandomFromRandao(uint256)","a5e558a3":"MIN_FUND_AMOUNT()","a5e57fcf":"GetUserBitFlag(address)","a5e5e034":"swapTop(uint256)","a5e62f02":"fallbackRP()","a5e7131e":"transferFundsAdminOnly(address,uint256)","a5e767cd":"frozenAccount(address,address)","a5e7a31c":"summReserveFund()","a5e82807":"deletedTeamIds(uint256)","a5e8c5d6":"setVoteRight(address,uint256)","a5e90eee":"setManager(address,bool)","a5e9585f":"xxx(uint256)","a5e9fffa":"calculateAmount(address,uint256,uint256)","a5ea11da":"getParameters()","a5eb1c6d":"Ovation(uint256,string,string)","a5eb7a4e":"operated()","a5ebb9ef":"backERRLCoinOwner()","a5ebc10b":"blocktubeClip(string,uint256,uint256)","a5ebf389":"getMoneyTotals()","a5ec4fae":"changeBaseVerifierFee(uint256)","a5ecacae":"getContributionTime(uint256)","a5ece941":"marketingAddress()","a5eceaf1":"bet1000_1eth()","a5edcd9e":"ethtotalSupply()","a5ee79d3":"extendRequestTimeLock(bytes32)","a5ef0dd6":"setGen0Profit(uint256)","a5ef69ea":"icoEndAt()","a5ef9915":"jotAllowance()","a5f02b00":"markCombatEnded(uint256)","a5f0dea2":"saleFinalized()","a5f11474":"Tronix()","a5f128fb":"stopSelling(uint256)","a5f18c01":"getStartBlock()","a5f1e282":"lockedOf(address)","a5f257e7":"transferDividendToShares()","a5f26760":"updateTimeMintBalance(uint256)","a5f2a152":"transferTo(address,address,uint256)","a5f2e079":"borrowerReturnAmount()","a5f357de":"MAXROUNDS()","a5f3c23b":"add(int256,int256)","a5f4648c":"getNextTurnColor(uint256)","a5f4864d":"ELBT()","a5f4af33":"playerWithdrawPendingTransactions()","a5f4c6ff":"publicStart()","a5f732e5":"distributeLTCW(address[],uint256)","a5f75a5e":"dollars_per_kilo_ether()","a5f7823e":"onlyAdmin()","a5f7c148":"transfer(address,int256)","a5f8b874":"wasProxyStorageSet()","a5f8cdbb":"buyTicket(address)","a5f9b5c2":"gameRound()","a5f9fd99":"splitShare()","a5fa2490":"smxSold()","a5fa5e52":"showTime(address,address)","a5faa125":"getAuthor()","a5fadf93":"modify_Presale3StartDate(uint256)","a5fb929a":"userRewarderCount(address)","a5fba4e1":"isDistributionDue()","a5fbd808":"globalBurnAmount()","a5fbdd41":"updatePremiums(address)","a5fbf287":"isSupported(address,uint256)","a5fc2994":"sendStore(address,uint256)","a5fd0a18":"chargeChannel(uint256)","a5fd1838":"getBonus2(uint256)","a5fdc5de":"collateral(address)","a5fefcfd":"thirdMonthEnd()","a5ff2551":"LOCIcoin(uint256,string)","a60014e3":"buyCore(uint256)","a60110ee":"ProposalTalliedEvent(uint256,bool,bool)","a6021ace":"ERC20Address()","a6024524":"PRE_ICO_FINISH()","a6027d53":"IconomiTokenTest(uint256,string,uint8,string,uint256)","a6044f28":"virtualEntitiesCreated()","a604c1ad":"Blocker_send(address)","a6060fcb":"Bitdore(uint256,string,string)","a6065c96":"brokerVerifierContract(uint64)","a6066523":"payment_amount()","a6069146":"setItemRangeURI(uint256,string)","a6070967":"minSumICOStage8USD()","a60745aa":"getBountyData(uint256)","a608067b":"getDrugPrice(uint256)","a608a65b":"CryptoAdsToken(uint256)","a60956a6":"newItem(uint8,uint8,uint256,uint256,uint256,uint256,uint256,bool,bool,address)","a6099372":"payDiff(address,uint256)","a609e209":"BIRTHDAY()","a609f034":"getByteFromBytes14(bytes14,uint256)","a60b693d":"getTotalCap()","a60b8aa9":"minusTourFreezingTime(uint256,uint64)","a60bbcd3":"ModelCoordinator()","a60c8043":"totalDistributionAmountInWei()","a60c9cdb":"TheBolthDAICO(address,address,address,address,address,address,address,address)","a60dc38a":"convertToWei(uint256)","a60e043e":"CappedRefundableCrowdsale(uint256,uint256)","a60e8bd6":"setVotingProxy(uint8,address)","a60eb299":"setRewardGenerationComplete(bool)","a60f3588":"payoutIdx()","a610fe9b":"chargeHoldingTax()","a6113c0d":"getSynthesizationResult(address)","a6117f39":"validPrePurchase()","a611e0e6":"forceRentalEnd()","a612c638":"emergencyRestart()","a6138ed9":"pricer()","a613c42d":"NWT()","a6145ba2":"isAllowContribution()","a614d54e":"GlobalAdmin()","a6151a84":"isDestroyed()","a615237e":"rebrand(string,string)","a615d7ee":"withdrawTokenToInvestorOwner(address)","a6178731":"usingInterCrypto()","a617aff1":"brideAddr()","a61855a4":"changeCommonRebate(uint256)","a618993c":"setGBA(uint32)","a618f50c":"distributeSSENTE(address[])","a619486e":"masterCopy()","a61bd76d":"purgeInformation(uint256)","a61c48f0":"getPollResultsSize()","a61c5b82":"numStudentRequest()","a61d0aed":"maxBets()","a61d6829":"getPosterInfo(uint256,uint256)","a61e1fc1":"_shuffle(uint8[])","a61e67aa":"testFailMintGuyWhenStopped()","a61e9f4d":"momentBlockOf(uint256,uint256)","a61ef635":"translateToStartingTile(uint16)","a61fe970":"candyBalance()","a621344a":"setTokenWallet(address)","a621d679":"XPZ()","a6223a58":"testAccess(address)","a622510b":"TranslationService()","a623e9bf":"PresaleDistribution(address,address,uint256)","a62438e2":"getPeriodKey(uint256)","a6245974":"getUpgradeProposalCount()","a6248874":"totalFirstICOSupply()","a62533e6":"diffString(string,string)","a6256644":"setDonationsReceiver(address)","a625d78d":"MasterDeposit(address,address,uint256)","a626c089":"changeSettings(uint256,uint256,uint256)","a626c3fe":"assignBountyTokens(address,uint256)","a626f445":"GlobalPersonalInsuranceChain()","a62784e2":"setCCH_edit_3(string)","a6279dbd":"getPartialAmountCeil(uint256,uint256,uint256)","a62819ed":"AddExec(string)","a62875d9":"getMyPastWins(address)","a62a07dd":"release_dates(address)","a62a86a0":"associateWithTaskAddress(address)","a62adfec":"buyTokens(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)","a62ce8ce":"capitalization()","a62d4df3":"_absSubtraction(uint256,uint256)","a62d7801":"resumePhase()","a62d9ba3":"withdrawToPlatformFunding(uint256)","a62e4246":"CampaignBeneficiary()","a62e5a7d":"sellComission()","a62ea098":"buyLCRTokens()","a62f3503":"updateBankAmount()","a630a92e":"ownerTransferWeiFirstWallet(uint256)","a6314342":"deleteManager()","a63234e0":"issuerAddress()","a6327ffc":"convert2PlatinumToken(uint256)","a632a2e5":"setnumber(uint256)","a632d5e1":"MANHATTANPROXLENAV()","a633d8d4":"getDougAge(uint256)","a633f61f":"getPositionOwedAmountAtTime(bytes32,uint256,uint32)","a6345859":"setEscapeRequest(uint32,uint32)","a635d31e":"Vote(address,bool)","a635e7c5":"BuyEBETtokens()","a636f4a1":"VoterAdded(address)","a6372087":"starNoLongerForSale(uint256)","a63744e0":"addPoll(uint256,bytes,uint8)","a63832a0":"dateFunc(int256)","a6391823":"awardsOf(address,uint8)","a6393784":"BiddableEscrow(address)","a63a9fa6":"setNextSnapshotBlock(uint256)","a63aeed9":"tokenSaleResumedTime()","a63b91f4":"autoBurn()","a63c500f":"is_locked()","a63c7ba2":"payoutToBeneficiary()","a63d0be6":"findAndTrade(address,address,uint256,uint256)","a63d6f05":"setRewardLevel(uint256,uint256,uint256,uint256[],uint256[])","a63d914f":"confirmAction(uint256)","a63dcbd7":"updateRtbSettlementAbi(string)","a63e10fa":"getUnreadMessageCount(address)","a63f1350":"getParentUniverse()","a63f5e2a":"candyToken()","a63f8020":"scWithdrawCall(address)","a6403636":"resolve(uint8,bytes32,bytes32,bytes32)","a64085cc":"getAllClients(address)","a641d28e":"revokeDelegateSigned(address,uint8,bytes32,bytes32,string,address)","a641edc7":"BOC(uint256,string,string)","a6424d22":"setVigAddress(address)","a64278ce":"lost_and_found_master()","a642c032":"getEdition(uint256)","a643c1a0":"updateAddresses(address)","a6441979":"StexIssued()","a6459042":"agencyReceiver()","a645a33a":"VotingFinished(bool)","a645e840":"getCurrentGameInfo()","a645ff5f":"send(address[],uint256[])","a646f9ad":"userWithdraw()","a6472906":"getAxie(uint256)","a6474a58":"setnotice(string,string,string)","a647e8ec":"mint(address,uint256,uint256,uint256)","a6482858":"boxPrice()","a648567b":"placeBet(uint8,uint8)","a648fec2":"updateAllTurnover(uint256)","a6491545":"_giveToken(address,uint256)","a64968ac":"joyToken()","a64a1c0b":"totalSoldTokensWithoutBonus()","a64ad595":"getDelegator(address)","a64b0b62":"addDevReward()","a64b63a8":"ParcelXGPX(address[],uint256)","a64b6e5f":"transferTokens(address,address,uint256)","a64bb045":"Test7J()","a64c7e2a":"Crowdsale(address,address,address)","a64d1c09":"hashOrder(uint8,address,uint256,uint256,uint256,uint256)","a64ded31":"tttTokenAddress()","a64e7969":"balancesCannotSell(address)","a64e920d":"vrcCount()","a64ed8ba":"tokensCount()","a64f0ca4":"getEtherInEuroCents()","a64f197e":"allocateBid4b(bytes32)","a64f829a":"addDungeonRewards(uint256,uint256)","a64fa869":"PrezzoCMT(uint256,uint256)","a650ebbc":"transferFromInternalStakingfund(address,uint256)","a6515a98":"admined()","a652477b":"STSTEST3()","a6534b63":"EtherBet(address,uint256,uint256)","a65465ff":"pank15()","a65491d5":"yeezy()","a654cfab":"pots()","a655fb4e":"level_9_amount()","a6567a9a":"calculateNewTime(uint256,uint256)","a656e51f":"lastInvestorsProfitDay()","a657242b":"Hardcap()","a6572c87":"getemployee(address)","a657cb9c":"submitRedeem(uint256)","a6593562":"getamountvotes()","a65a26e8":"returnAddressList()","a65a7753":"Zentum()","a65ac961":"batchTransferValues(address[],uint256[])","a65ae513":"ownerDeclareFailure()","a65b37a1":"buyXname(bytes32,uint256)","a65b62c9":"priceRound(uint8)","a65c3097":"_distributeRest()","a65e91b8":"baseTokensSold()","a65eacdc":"delManager(address)","a65ecbeb":"getMaxTokenAvaliable()","a65f0f79":"Ethereal_Smart_ID(address,address,string,string,bool)","a65f1193":"weiToUsdCents(uint256)","a65f51c8":"gapTime_()","a6605a77":"_updateTradingVolume(uint256,address,address,uint256)","a660698e":"TheInternetDigitalCurrency()","a660a326":"balancesHold(address)","a660f827":"bonusEnds5()","a6624bf4":"ISBToken()","a6632904":"tier_cap_4()","a663b5de":"viewCoinsKarma(uint256)","a664225c":"exchangeFinished()","a6656096":"invalidateGame(uint256)","a6658dea":"BitSelectConservador()","a6661901":"totalNormalContributorIds()","a6662a3c":"initMetadataDisabled()","a6666f0f":"TTGCoin()","a6667e18":"RemoveWhitelist(address)","a666ff3c":"lockedTokenAddress()","a66712ae":"usersOfAccount(uint256,uint256)","a6674aa3":"Resigned(address)","a6678b60":"setJadeCoin(address,uint256,bool)","a668d7c9":"NiceGuyPonzi()","a66939ad":"hostileTakeover(address,uint256)","a669b56b":"pay_day()","a669c9f9":"registeredServices(address)","a669d972":"c_centsPerToken()","a66ac7bc":"payout(bytes32,bytes32)","a66b62e6":"gameOverByUser()","a66b7748":"follow(bytes32)","a66c0b1c":"setGoldmintTeamAddress(address)","a66c53b2":"buyCore(uint256,uint256,uint256,string)","a66cb0ee":"GetBonus()","a66d5ef7":"createNamespace(string)","a66db704":"getPOOL_edit_23()","a66ddf43":"mainSaleRateP3()","a66df701":"chargeFee(address)","a66e6e5c":"etoken2Symbol()","a66ee056":"internalTransfer(int256,address,address)","a66f32e5":"stage3Bounty()","a66f42c0":"boost()","a66f7ad6":"signRelease(uint256)","a66fd42b":"mintToggle(bool)","a670b9e7":"nestedSecondSome(uint256,uint256)","a670c133":"numTeamDeposits()","a6712778":"investBct(address)","a672990c":"whitelistContract(address,bool)","a6735023":"getProfilePicture(address,address)","a673b130":"Reserved(address,uint256[])","a6741cfd":"injectEtherToDividend()","a6747670":"senderToProxy()","a675807e":"totalLevs()","a675887e":"EtherReceivedFromRelay(address,uint256,address)","a676b174":"frozenAccountProfit()","a677fbd9":"example2Func()","a6780857":"fireEventLog0Anonym()","a6784488":"cleanOut()","a67909bd":"LOCKTC()","a6791568":"burnAllTokens(address)","a67a6eab":"bearToken()","a67ad1b2":"sellICloudSecsAgainstEther(uint256)","a67aee1f":"tokenConverter()","a67afd30":"vest2all(address,address)","a67ba5d2":"changeAdminCharges(uint256,uint256,uint256)","a67bb583":"tokenCapForSecondMainStage()","a67c2730":"getBonusPerShare()","a67c2dcb":"accept_ownership()","a67c8bc4":"mintFundsTokens()","a67cace9":"AIT_TokenERC20(uint256,string,string)","a67d2602":"getSafeAddr()","a67de805":"DWalletToken()","a67e91a8":"TOKENS_MAX()","a67eb8d7":"STRIMToken(address,address,uint256,uint256)","a67ebf73":"Voting(uint8,address,uint256,uint256)","a67f122f":"_1_vozrast()","a67f9997":"LIQUIDATION_RESERVE_RATIO()","a67fc3fa":"getRewardAmount(bytes32,bytes32)","a6801cbd":"reset(uint256,uint256,uint256)","a6808c3c":"_setAgilityValue17(uint256)","a6809af0":"setOdds(uint256)","a680baaf":"backendWallet()","a681bf23":"LegalBot()","a681f950":"setMinMax(uint256,uint256)","a6823189":"parseAddr(string)","a682dd4f":"SWAP(address,address,address)","a6832d53":"allowedTransfer(uint256)","a68393a2":"debug_getCoinbaseTxOutputLen(uint256)","a6843f34":"right48(uint256)","a6846026":"TokenMintingDisabled(address,bool)","a684bc9f":"tokenReserved3()","a684ff03":"bet(uint16,bytes32)","a68567ac":"IDToken()","a6856e9d":"JTEBIT(address,uint256)","a685a41e":"parseLoanOffering(address[9],uint256[7],uint32[4])","a685ae66":"minerTimeOfLastProof()","a685ea57":"getROFRStatus()","a68602fb":"SignalingDisabled(address,uint256)","a687be48":"RocketsAndResources()","a6885e88":"getStageData()","a6895b5a":"getDailyLimit()","a6896bdf":"isRightPosition(uint128,uint128,uint32,uint32)","a68a2884":"TournamentCore(address,address,address,address)","a68a76cc":"createForwarder()","a68b51ed":"addProposal(address,uint256,uint256,string,uint256,bytes)","a68b91ab":"getContractData()","a68c5ca1":"SDTToken(uint256,string,string)","a68c9bbb":"getBid(address,address)","a68cfb25":"getSecondAmount(bytes32,bytes32)","a68d9a62":"_setDownRequest(address,uint256,uint256,uint256)","a68dfb2d":"TTToken()","a68e27b7":"getLuckProps(address)","a68e4578":"totalLBSold_CORNERSTONE()","a68e5ad0":"depositTokensForTrading(uint256)","a68f0bc1":"TOTAL_LARE_FOR_SALE()","a68fff3f":"GenRandom(uint256,uint256)","a6903278":"beginBlock()","a69032ee":"proxyTransferFromToICAPWithReference(address,bytes32,uint256,string,address)","a69177b1":"addTotalSupplyAmount(uint256)","a6921956":"tokenStatus()","a692c2f9":"_toTileId(int32,int32)","a692d5ae":"migratePriceLeader(uint8,address,uint256)","a6934950":"_confirmOneBuy()","a69358aa":"voteForTap(bool)","a693600b":"poolAmount()","a69364fc":"ProofOfTheRich()","a6940238":"growth()","a69416f6":"getNodeType(address)","a6948cd9":"calculateArea(address[16],uint256)","a694dabd":"STARTING_SNAIL()","a694fc3a":"stake(uint256)","a69520aa":"alchemy(uint256)","a695cacf":"getGameIdsByCategory(bytes32)","a69709ae":"toHexString64(uint256)","a69722de":"validateDescription(string)","a6973fa1":"computeS(uint256)","a697ca14":"finishSingleLock(address,address)","a6980a17":"addPromo(bytes32,uint256,address,uint256,uint256)","a6983932":"SeckeyRevealed(bytes32)","a6988576":"walletTokenBounty()","a699cd20":"getGrowingControlStartAt()","a699d9b0":"saosao6()","a699fb18":"payoutWorth(address)","a69a2ad1":"totalBalances()","a69a5588":"set(bytes12,bytes32)","a69ade72":"LED_MULTISIG()","a69bd4a8":"regStartTime()","a69beaba":"vote(bytes32)","a69c22be":"getYays(uint256)","a69c5bbf":"bucketClosureTime(bytes32)","a69c6597":"getPlayerName()","a69cbb50":"_getEarlyBonus()","a69dde14":"checkPassiveAndNull(address)","a69df4b5":"unlock()","a69e894e":"createTokens(address,uint256)","a69eae7c":"changeAllowanceToMint(address)","a69f7d1f":"FOUNDATION_PERCENT()","a69f886a":"withdrawRaised(uint256)","a6a1858f":"whale()","a6a20ff6":"DSEasyMultisig(uint256,uint256,uint256,uint256)","a6a34dd3":"_setMinCardPrice(uint128)","a6a3a439":"getNumTransactions(address,uint256)","a6a3ba2b":"pausestatus()","a6a5bfe3":"getStage2Start()","a6a62d58":"lastBlock_f2()","a6a633af":"ROA()","a6a6a0d8":"becomeFrom()","a6a6f1c7":"registerLicense(string,string)","a6a86130":"usdToWei(uint256)","a6a9a099":"privateIcoMin()","a6aa7f7a":"onlyFounders()","a6ab1216":"getWeaponsArmy1(uint256)","a6ab36f2":"initialize(uint256,uint256,address)","a6aba1b5":"BitCoix()","a6abbad6":"assertEq16(bytes16,bytes16,bytes32)","a6ac9225":"getJackpotResults(uint256)","a6ad57e6":"difficultyScaleMultiplierLimit()","a6ae0aac":"coinbase()","a6afd5fd":"getBets()","a6b01e50":"isMultiOwner(address)","a6b05af6":"INITIAL_BONUSLIST_TOKENS()","a6b08498":"isOps()","a6b10dd1":"showToken_For_Circulation()","a6b11fb3":"factorial_ICO()","a6b165ee":"total_investors()","a6b197aa":"Order(address,uint256)","a6b1caa3":"gasScalar(uint256)","a6b206bf":"doSomething(uint256)","a6b26697":"EthRefundReceived(address,uint256)","a6b2c437":"confirmRequest(uint256)","a6b2df9b":"requestDocument(uint256,string)","a6b3abba":"getMyTokenBalance()","a6b402ec":"MGU()","a6b4492f":"servusToken()","a6b4b0f4":"testCreateGames(uint256)","a6b513ee":"finalPrice()","a6b55eec":"unlock(bytes16,uint32)","a6b57b5d":"sharesOwned(address,uint256)","a6b7fa36":"withdraw(uint32,uint192,bytes)","a6b87b52":"erc()","a6b909e1":"trades()","a6ba250c":"fechVoteInfoForVoterBySnapshotBlock(address,uint256)","a6bb012b":"penalizeInactiveArbitrators(address[],uint256[])","a6bb1667":"updateMatch(uint8,uint8,uint8)","a6bc18f9":"setTrader(address)","a6bd5427":"getOptionCount()","a6bd853b":"mtdPreAmount()","a6bdcc17":"isAtLeast(uint256,uint256)","a6bf3df0":"oraclize_query(string,string[2],uint256)","a6bf45a9":"getNumberOfDeedsByAddress(string)","a6c01cfd":"isInGeneration(uint256)","a6c09381":"_setPackedTimestamp(bytes32,uint256)","a6c0d5a8":"YukiChainToken()","a6c1d611":"getAngelLockStatus(uint64)","a6c1f87f":"partial_refund(address)","a6c216c2":"UpgradeEvent(address,address)","a6c226f0":"lock(address,address,uint256[],uint256[])","a6c23bc4":"setTokensPerUsdRate(uint256)","a6c24b38":"getRequiredPrice()","a6c2591e":"get_header(uint256,uint256)","a6c2f3b2":"getAllAgreements(uint256)","a6c30b29":"startGasCalculation()","a6c3e6b9":"author()","a6c4cce9":"registeredApps(address)","a6c4d58c":"MetronomeToken()","a6c4ec0e":"hasUser(address)","a6c5612e":"areTokensFree()","a6c58b63":"getJobStatus(uint256)","a6c62c90":"snake(uint256)","a6c662ea":"Cmc()","a6c66575":"processInviterBenefit(address,uint256)","a6c6aee1":"ODEEPToken()","a6c7bf8a":"setMasterWallet(address)","a6c7f715":"MoimToken(uint256,string,string)","a6c8210e":"getVotingParams()","a6c93349":"createContract(uint256,uint256,int256,int256,int256,int256)","a6c94d2e":"durationVoting()","a6c95de1":"transferBountyTokens(address,uint256)","a6c98142":"SquirrelFarmer()","a6ca0a98":"PARAMOUNT()","a6ca322b":"refundCompleted()","a6ca54bd":"lawEnforcementRole()","a6cb4654":"catchYou(address,uint256,uint256)","a6cb9e64":"scheduleCall(address,bytes,bytes)","a6cbcdd5":"numSignatures(bytes4)","a6cc0428":"withdrawCryptoCurrencyNetworkTokens(address)","a6cd5ba3":"MaxMasternodesAllowedChanged(uint8)","a6cd8c68":"Match_Maker()","a6ce25b2":"In(uint256)","a6ce69a2":"changeSupply()","a6ce8c29":"HandsOnToken(uint256,string,uint8,string)","a6cea881":"KayiToken()","a6ceaeb8":"getSoldTokens()","a6ceb1f3":"sendAirdrop(address[],uint256[])","a6cfaf2e":"MMC(uint256,string,string)","a6cfb7a3":"getBack(uint256)","a6cfbb7f":"revenueBalance()","a6d00693":"getMeshPointByCreator(int256)","a6d150e0":"updateWhitelists(address[],bool[])","a6d15124":"coinsLeftInTier()","a6d15963":"createChannel(address,uint192)","a6d23e10":"payments()","a6d2bff6":"getTeamTokens()","a6d34fa8":"JackpotPayoff(uint256,uint256,address)","a6d40d39":"unlockFounder(uint256)","a6d49dca":"emitTransferEvent(address,address,uint256)","a6d4b5c2":"getGroupResult(uint256)","a6d4e9da":"tokensByTx(uint8,string)","a6d544e9":"sumHardCapPreICO1()","a6d6d046":"LetsfairToken()","a6d72407":"interface()","a6d7d72e":"addTwinAddress(address)","a6d87f7d":"myReferralDividends()","a6d930bb":"FundCrowdsale()","a6d93a9a":"_sell(uint8,bytes6,uint32,uint32)","a6d958c6":"getLastInput()","a6d96af6":"_createCompany(bytes32,bytes32)","a6da1e7d":"depositAndLock(address,uint256,uint256)","a6da3761":"StoneumToken()","a6da467c":"buyCozyAffiliated(uint256,uint256,bool,address,address)","a6da54a3":"validCoordinate(uint256,uint256)","a6dacdd7":"right59(uint256)","a6dc0173":"BRFCrowdsale(uint256[3],uint256[3],uint256[3],uint256[3],address,uint256,uint256,address,uint256,address)","a6dc15bd":"PriceChanged(uint256)","a6dc1ada":"setMaxStage3AllocationPerInvestor(uint256)","a6dc6771":"third()","a6dc84f0":"balanceOfFrozen(address)","a6dcb12d":"candyTotalSupply()","a6dcc834":"getUserInventory(address,address)","a6dd06e1":"getPOOL_edit_34()","a6ddcc96":"FillBuyOrder(address,address,uint256,uint256,uint256,uint256,uint256)","a6ddce13":"setDisable(address,bool)","a6de42c8":"AuthorizedAddresses()","a6dea55e":"sendEthToAddress(address,address,uint256)","a6ded200":"redeem_funds(address,uint256,uint256,bytes32)","a6defd45":"ZeroHooStandardToken(uint256,string,uint8,string)","a6df0344":"REF_CREDITS_PER_AXIE()","a6df33a2":"creationInvestmentSupply()","a6df6c30":"minCWCsPerReturnMoreThan()","a6e0264a":"_checkMyVesting(address)","a6e158f8":"redeemTokens(uint256)","a6e16ba2":"testThrowsRetractLatestRevisionNotOwner()","a6e1bc7c":"IndoCrypt()","a6e26e96":"batlordAddress()","a6e2eab1":"recycleAfterEnd()","a6e315ff":"addExemptionAddress(address)","a6e3289d":"addNextMemberPayment(address,uint256,uint256)","a6e3fcf6":"setBaseTokensSold(uint256)","a6e4002e":"DividendManager(address)","a6e497b6":"getUserContractAddress(address)","a6e4ae01":"gcp(uint256)","a6e5291f":"UniversalGiftToken()","a6e5303a":"SLKToken()","a6e53b99":"PHASE1_ACCOUNT_TOKENS_MAX()","a6e5f2f5":"Show_Address_for_option_C()","a6e7469c":"getSendersHash(address)","a6e77af1":"setEntryPrice(uint256)","a6e7f409":"STATE_OWNED()","a6e81e7c":"refundWei(address,uint256)","a6e826e8":"startsecurities()","a6e8a859":"target2()","a6e9e95f":"setCoinAllowance(address,address,uint256)","a6ea7ad2":"dexTestTransfer(address,address,uint256)","a6eaab99":"DGCASH()","a6ebbe5a":"NewDeposit(uint256,uint256,address)","a6ec01f7":"clearPendingWithdrawal(address)","a6ec0708":"setCompte_28(string)","a6ec3022":"getCurrentYearRemainToken(uint16)","a6ecfff8":"is_btc()","a6ed563e":"getBytes32(bytes32)","a6ee5eed":"changeFinishPreSale(uint256)","a6ee6fd9":"max_schrems_addr()","a6eea7f3":"liquidationPeriod()","a6effaed":"DetailedERC20(string,string,uint8)","a6f07a5c":"bigbomMultiSigWallet()","a6f0cba6":"DarioAdministrator()","a6f0e577":"isLeapYear(uint16)","a6f1c939":"getPick(uint256)","a6f1fd51":"addDeposit(uint256)","a6f20445":"LogCancelReservation(address,uint256)","a6f257cc":"AgroTechFarmToken()","a6f2ae3a":"buy()","a6f2e80d":"lockFunds(address)","a6f2fd5c":"disable(bool)","a6f48c90":"freeCount()","a6f4ab2e":"setStalePeriod(uint256)","a6f55282":"addNacToNLF(uint256)","a6f57199":"CrowdsaleExtended(uint256)","a6f5a22b":"openShop()","a6f6a8a6":"_setPrices(uint256)","a6f6d8bb":"getObligation(bytes32,uint64)","a6f70594":"SpoutCrowdsale(address,uint256,uint256,address)","a6f7257a":"getSigns(uint256)","a6f7541c":"maroonToken()","a6f81668":"gameInfo(uint256)","a6f87bc6":"WumingToken(address,address)","a6f935f6":"exporterAcceptedIBankDraft()","a6f9885c":"MAX_LENGTH()","a6f99922":"EcologicalShield()","a6f9dae1":"changeOwner(address)","a6fb08ae":"contractWithdraw(uint256)","a6fb475f":"transferFrom(address,address,uint16[])","a6fbf3d2":"getInt(bytes32,bytes32)","a6fc2823":"continueIco()","a6fc5c03":"getCode(uint256)","a6fd0085":"sub(uint128,uint128)","a6fd2487":"recordName()","a6fd96b0":"MultiService(address,address[])","a6fda231":"ICO_RATE3()","a6fdedef":"aimeIncreasePerTrip()","a6fe178c":"getRegisteredExchanges()","a6fe7a28":"removeService(address,uint32)","a6fea6f4":"registerVendor(address)","a6ff20a3":"addVehicle(uint256,uint256,bytes32,bytes32,uint256,uint256)","a6ff85e2":"ReceiveDonate(address,uint256)","a6ffefae":"balancesListNumberMap(address)","a701229f":"ChangedOwner(address)","a7016023":"setOwnership(address)","a7021bc5":"executorAlive()","a70284be":"soldBeercoins()","a702be14":"feedSecondaryPot(uint256)","a703078c":"sortAuction(uint256[])","a7030a53":"extractAndStoreBitcoinAddresses(bytes32,uint256,bytes,bytes)","a703c751":"batchWhiteListInvestors(address[])","a705245e":"setReserveVault(address)","a70616de":"platformWithdrawalRecipient()","a7068d66":"addDelegate(address,bytes32,address,uint256)","a706a2e2":"requestUnlock(bytes32,address,bytes4,address)","a706d26e":"DragonTreasureToken(address,address,address)","a7070373":"setAllowance(address,address,address,uint256)","a707300f":"addAcceptedContribution(address,uint256,uint256)","a7074a82":"getCrowdsaleStatus(address,bytes32)","a707ce55":"changePass(bytes32)","a707fc81":"payback(uint64,address[])","a708142b":"addressSCComplianceService()","a7084516":"VictoryX(uint256,string,uint8,string)","a7086536":"withdrawOfferForCollectible(uint256,uint256)","a7096ac8":"addLogicVersion(uint256,address)","a70a92f7":"setLiquid0(bool)","a70a9ad7":"switchDeity(address)","a70b015d":"stageICO()","a70b21a3":"ReceiverPays()","a70beb13":"processSellOrder(uint256,uint256)","a70c41b4":"getTransferFromPreSignedHash(address,address,address,uint256,uint256,uint256)","a70ce015":"safeGetPercent(uint256,uint256)","a70d7006":"StinkyLinky()","a70e82d4":"changeFreeUntilDate(uint256)","a70f101c":"useEmergencyCode(uint256)","a70f84c3":"registerName(address,bytes32,uint256)","a70fc3ba":"setCap(uint256,string)","a70fc680":"fundraising()","a71168e3":"setTrainingScienceContract(address)","a7120433":"setItemContract(address)","a7134993":"lifeD(uint256)","a7134f73":"acquire()","a713a3f7":"loggedTotalSupply(uint256)","a7154d22":"cancel(address,uint32)","a7157c72":"withdrawToTeamStep2(uint256)","a715bf33":"ICO_PRICE()","a715df58":"setUnownedName(uint256,string)","a715ff59":"EtherandomProxy()","a716144a":"getStack(bytes32)","a7177ebf":"getSpellAbilityCost(uint8)","a718309f":"CryptoCurrencyExchange()","a7188b4e":"setEditModeBool(bool)","a718d11b":"addWhiteList(address,bool)","a718e288":"Robet(uint256,string,string)","a718e774":"closeWeeklyInvest()","a718f4b3":"searchJobs(address,uint256,uint256[],uint256[],uint8[][4],uint8,uint256[],uint256[],uint256)","a7194e2a":"returnTokensListOfAddresses()","a71962c2":"GAME_STARTED()","a719804d":"Spank(string,string,uint8,uint256,uint256)","a71a3dde":"DEFAULT_LOCK_COST_PER_HOUR()","a71acabc":"newSection(bytes32,bytes32,bytes32,uint256)","a71aec73":"isTradable(uint16)","a71b4c26":"auctionSumGwei()","a71bd1cd":"getCurrentDay(uint256,uint256)","a71be2c0":"Clip()","a71d6f9f":"setTRCExchangeRate(uint256)","a71d8181":"createCeleb(string,uint256)","a71e12e5":"JoinGameAsPlayer(uint8,uint256,uint8)","a71e46d3":"maxRecordID()","a71ee0c6":"changetradestatus(bool)","a71ef84d":"getVotingWinner(address)","a71f94c8":"scheduleSetUInt(address,uint256,uint256)","a71fa796":"addResearch(address,uint256)","a720cbb8":"create(address,address,address,string,string,address,uint256,uint256)","a720e0a8":"ebyteToken()","a720faa9":"maxPreICOSupply()","a721c06c":"LENTToken()","a721d9d9":"EmiratesCoin()","a721ebe8":"numberSyndicateMembers()","a72299dd":"MetadollarShare()","a7232aae":"setGPSMinEth(uint256)","a723761a":"investEtherForDID()","a723cda8":"AQUAOIN()","a7240d45":"updateTransaction(bytes32,uint256,address,uint256,address,uint256,bytes32,bytes32,bytes,bytes)","a72460d1":"getProviderEndpoints(address)","a724e54c":"newCollectible(uint256,string,uint256,uint256,uint256,string,uint256,string)","a724f68a":"CratesOpened(address,uint8)","a7256621":"addInt(uint256,int256)","a725c4a4":"StrategicPartners(address,uint256)","a725fa1f":"CpublicgoldToken(address)","a7261f79":"isPayableEnabledForAll()","a72670b8":"getReportingWindowByTimestamp(uint256)","a726be9a":"get_token_data(uint256)","a727390d":"GetDomainInfo(string)","a727632f":"Date_Finished()","a7281bbf":"CollectTaxes(uint256)","a728fa93":"getMyCraigGrant()","a7292c74":"amountEthRaised()","a72a05f7":"getReceiversCount()","a72aa163":"setPropertyMode(uint16,bool,uint32)","a72b1444":"minimumSupport()","a72dc52e":"fixedExpUnsafe(uint256)","a72dc950":"StageOneEnable()","a72ec7a0":"TokenLiquidityPlatform()","a72f3dea":"removePVPContender(uint256)","a72f5aaa":"preDistribute(address,uint256)","a72ff7de":"buySmartContract()","a7304287":"godUnpause()","a731c4ec":"addUserTokenLocalBalance(address,uint256)","a731f31a":"getBoxes(address)","a7321096":"mainSaleBonus()","a7322d9d":"DURATION_SALESTAGELAST()","a7324134":"parseLoanOffering(address[11],uint256[10],uint32[4],bytes)","a732d6c4":"calculateAffiliate(uint256,uint256,uint256)","a732f9ac":"increasePlayersGooProduction(address,uint256)","a733800d":"Shipia()","a73381d5":"EYInnovationCoin()","a733e21d":"twice(address,uint256)","a733f702":"isValidSize(uint256)","a73467bd":"TestCitySnapshotInternal(address,uint256)","a73598fd":"tryFinalizeStage()","a73638a7":"selectGod(uint16)","a7365ea9":"Gealena()","a7368afb":"allocateTokens(address[],uint256[])","a7374b21":"sendFundsInternal(uint256,address,bytes)","a737ec3d":"GxAdmins(address)","a737ecc9":"getProfitToAddress(uint256,address)","a7384c1e":"eth2erc20()","a739013f":"buy(address,address,uint256,bool)","a7397d27":"xaurForGasLimit()","a73b60f4":"buttonClicks()","a73b9bcb":"FTFExchangeToken()","a73c0ba2":"play(uint256,uint16,uint8)","a73c52e7":"getLastPerUser(address)","a73c7140":"amountTotal()","a73d633c":"addWhitelist(address,address)","a73d907e":"inboxIsEmpty(address)","a73e01cb":"WPTokensBaskets(address,address,address,address,address)","a73e38ce":"generateICOcrowdsale(uint256)","a73e9837":"newEnterWallet(address)","a73ee331":"MAIN_HOLDER_ADDR()","a73f7f8a":"addRole(address,bytes32)","a73fc4cd":"get_pre_kyc_iconiq_bonus_denominator(address)","a7403160":"vestingsReleasedRemain(address)","a74035b5":"setEvabotContractAddress(address)","a740a194":"getGasToReport()","a740a6fa":"clearRAM()","a740cf90":"TGIF(address)","a740de43":"nameLocked()","a7419b51":"setAirLiftPrice(uint256)","a742a942":"create(address,bytes32,address,address[],address,bytes32)","a7432434":"refferalPreICOBonus(address)","a743a61f":"checkStudentsApply()","a743fa50":"beneficiaryFunded(address)","a744a633":"getWeeklyTransactionVolumeReceiving()","a745863b":"startRebuyTime()","a745953e":"buyStarInitial(uint256,string)","a745ec70":"bountyDistributorAddress()","a7467039":"sharesToManager(uint256)","a747007f":"AffiliateProgram(address)","a7483f74":"CATFreezer(address,address)","a74905db":"reportProfit(int256,address)","a74915cf":"getadd()","a7491b48":"votesByAddress(address)","a7497fa5":"tge()","a749870d":"etherValueAllowStale(uint256)","a749e97b":"_setPaymentSchedual(uint256,uint256,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2)","a74a1831":"post(bytes32)","a74baaa4":"amountOfHolders()","a74e01cf":"unFreezeAllTransactions()","a74e493f":"pregenTokens(address,uint256,uint256)","a74ecb12":"setMasterAddress1(address)","a74f277a":"MaintenanceUpdate(bool)","a7502a3f":"totalTeamWithdrawSupply()","a7507df2":"loveUrl()","a75252ea":"sellToAddress(uint256,address)","a75261f2":"certbot()","a75274e9":"setMarkup(uint256,uint256)","a752c2c5":"UniversalSchemeMock()","a75343bf":"claimOwnership2()","a753d6f2":"CreateProposal(string,string,string,string,string,string,uint32,uint32)","a753fd08":"setWinNetworkFee(uint256)","a7542448":"addRef(bytes32,bytes32)","a75439d1":"minValuePre()","a755a47e":"triggerAllRefunds()","a7560bec":"EBITOKEN()","a7565888":"m_Paused()","a75688b2":"oldMillionEther()","a75761f1":"returnUint16(uint16)","a7577542":"addCrowdSaleTokens(address,uint256)","a757ac4b":"privatesaleAddress()","a757fc42":"buyTwo(uint256,uint256,uint256,uint256)","a758ac6a":"MaecenasCrowdsale()","a759822b":"performCalculations()","a75a1d6c":"claimRefundTokens(address,address)","a75a4e4a":"updateScoreAndBalance(uint256,uint256,address,address)","a75a9049":"setInitialOwner(address,uint256)","a75aef40":"SYCEarlyPurchase()","a75c6f65":"updatedCirculation(string)","a75c8546":"determineDiscountRate()","a75c981d":"totaltokensold()","a75d0042":"signedTransferCheck(address,address,address,uint256,uint256,uint256,bytes,address)","a75dd0d4":"AddPrivateKey(string,string)","a75df814":"knownAddress(address)","a75e2853":"transferForICO(address,uint256)","a75eb727":"updateExistingRaz(uint256,uint256,uint256,uint256,uint256)","a75fe8e1":"removeWallet(address)","a7603a86":"getDefaultValidityBond()","a76044a4":"binary()","a760d1d0":"setRateAgain()","a760e442":"setLosers(uint256)","a76188b9":"setRewardPercentages(uint256,uint256,uint256,uint256,uint256)","a7633064":"getRandomType(uint16)","a7638346":"setFinaliseTime()","a7638c4d":"disableStakingPeriod()","a764eb45":"setCurrentIssuanceData(address,uint256)","a7651147":"loyaltySupply()","a76594bf":"getPlayersCount()","a7668eba":"calcTokenCost()","a766f3d1":"storeStub(address,bytes32,bytes32)","a76769a5":"fillOrderWithEth()","a76774f5":"jackpotCompleted()","a7677ee3":"AslanToken()","a767d8be":"preIcoMaxCap()","a76a155e":"getBetsFromAddress(address)","a76bb04e":"setRewardPoolWallet(address)","a76d368a":"candyPowerToken()","a76d50ad":"multipleTransfer(address[],uint256,uint256)","a76dd676":"TIER3_PERCENT()","a76decce":"_createNFT(uint256[5],address,uint256)","a76ee2d8":"fillBuyOrder(address,address,uint256,uint256,uint256,uint256)","a76eeab2":"updateVitality(uint256,uint8)","a76f3543":"getUpgradePointer()","a76f43a0":"bancorDaiSmartTokenRelay()","a77078e7":"withdrawForOp(address)","a7721e0f":"multiplyTokensSend(address[],uint256[])","a7724b16":"bingo()","a7728589":"setMintAgent(address,address)","a7731150":"StoreFile(bytes32,string,string,string,string,string,uint256,bytes)","a7737b93":"NumberOfPart()","a77384c1":"setTotalShares(uint256)","a773d98a":"getAssetIDHash()","a7741827":"deleteAllUris()","a7743462":"setFounderTokenWallet(address)","a774f163":"adjustDefaultSpritePrice(uint256,uint256)","a775511a":"isMainsalePeriod()","a775b1c4":"NAORIS_TEAM_TOKENS()","a7760d79":"preICOendTime()","a77674a7":"buy_energy(address,uint32,uint32,uint64)","a7771ee3":"isVoter(address)","a7775bd7":"YDToken()","a777aa5d":"changeMaxTokenSell(uint256)","a777d0dc":"hello(string)","a777deca":"thirdRelease()","a777eca9":"MinerRewardChanged(uint256)","a77a8230":"allowence(address,address)","a77aa49e":"setIntValue(bytes32,int256)","a77adc23":"WaxToken()","a77ae839":"approveRewards(uint256)","a77b2e37":"Coin()","a77b4d8b":"setBaseCurrency(address,bool)","a77b6efb":"mintCoins(uint256)","a77beea1":"transfer(address,address,address,address[],uint256)","a77c1b08":"checkTransfer(address)","a77c61f2":"cobinhoodUserIDs(address)","a77ee38c":"promoTypeNum()","a77f7c8c":"whitelistMany(address[])","a78036b7":"clearDeposits(address,uint256)","a7807b84":"transferByRelatedToken(address,address,uint256)","a78082aa":"TokenSafe(address)","a78085ef":"lockMainSaleToken()","a780b2f3":"parseRate(string)","a7811732":"totalERC20Contracts(uint256)","a78118a4":"onlyDevs()","a781384e":"TrivialToken(string,string,uint256,uint256,address,address,uint256,uint256,uint256,bytes32)","a7819ad7":"_challengePart2(uint256,uint256,uint256)","a783a4f1":"get_hash(uint16)","a78488af":"startTokenRaffle(uint256,address,uint256,bool)","a78488e1":"WSTO()","a784d969":"setAssetsCertified(uint256)","a784ef22":"_calculateScore(uint256,uint256,uint256,uint256)","a7859131":"m_initialSettingsSet()","a785b96a":"TDEStartDate()","a786c1d2":"BONUS_DAY1_DURATION()","a7878831":"splitTokens()","a78810f8":"subscribeMe(uint8,bytes32)","a788aa07":"test_threeValidEqUint(int256)","a789e29c":"getContributorData(address)","a78a43c1":"getAllTeamScores()","a78a651a":"processContribution(address)","a78adf57":"UserAddressRegistry()","a78adfec":"setButtonParams(uint256,uint256,uint32,uint32)","a78b3d96":"addSubOwner(address,address)","a78bcf6e":"changeBankroll(address)","a78c5476":"SaleStarted(uint256)","a78c81ea":"changInviteAmountLimit(uint256)","a78cb567":"getCosignerFee(uint256)","a78cdfed":"gana()","a78d4316":"_near(uint256)","a78db39c":"blockedUntil()","a78deefa":"isGameEnd()","a78e635c":"XToken()","a78e887c":"calculatePurchaseReturn(uint256,uint256,uint16,uint256)","a78f0489":"secondTierDiscountUpperLimitEther()","a78f16ba":"setWhitelistedStatusInternal(address,address,uint256)","a79094b7":"changePolyRegisterationFee(uint256)","a7909e47":"DAppReady()","a791c665":"WojakCoin()","a791da46":"buyXwithdrawForContract(address,uint256,uint256)","a7932d20":"marketToken2019()","a7944579":"sit()","a79726b7":"tokenSpin(uint256)","a7972a80":"MoviePass(string,string,uint8,uint256)","a7977ffc":"isWhiteListedAndAffiliate(address)","a7985ae4":"SNAILMASTER_INCREASE()","a7987b58":"LendroidSupportToken()","a799464c":"isMyInfra(uint256)","a7996adc":"_safePaymentActionAtIco(uint256,address,uint256)","a799de7e":"anotherTransferTo(address,uint256)","a79a3c30":"teamAlloacting()","a79a3cee":"isConfirmed()","a79a416d":"SetCommissionRate(uint256)","a79ac3be":"ReleaseTokenForReserveFund()","a79b2752":"validate(address[4],address,uint256[12],uint256,bytes,uint256)","a79c7faf":"test_threeInvalidEqBytes()","a79ca634":"_setSubnodeOwner(bytes32,address)","a79dad23":"GetBetNums(uint256)","a79deb4f":"acceptTradeDeal()","a79ec95a":"oneEtherIsHowMuchFST()","a79f26dc":"force()","a79f4773":"buy_ETH(uint256,bytes8)","a79f7412":"withdrawCoinExt(uint256)","a79fdbb4":"presalePaused()","a7a066b7":"AxtrustICO(uint256)","a7a0d537":"something()","a7a1019d":"tixPresale()","a7a1e0a7":"auditNTVUText(uint8,uint8,string)","a7a1ed72":"pass()","a7a260cf":"TokenDeployed(uint256)","a7a2720e":"processFunding(address,uint256)","a7a38f0b":"history(uint256)","a7a39daa":"getBrickIdsByBuilder(address)","a7a3ba54":"SponsorMusic(uint256,uint256,address)","a7a44eba":"getFirstUnionIds(bytes32)","a7a5e00b":"updateCustomer(address)","a7a604b2":"mintUptoCap()","a7a60580":"MeteorToken()","a7a62aee":"init(address,uint256,address,string,string)","a7a7be1a":"newWriteAddr()","a7a8add2":"setSaleAgentContract(address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","a7a957ff":"getSaleDayNow()","a7aac32d":"withdrawAdvisorTokens()","a7aad3db":"voterReward(address,uint256,uint256)","a7ab6961":"withdrawalDelay()","a7abb8cc":"BM_MasterClass_Reserved()","a7abc124":"activate(bool,bool)","a7ace55d":"incrementDivisor()","a7ae9756":"startNewStakingInterval(uint256,uint256)","a7af0b99":"Nerdearla()","a7b0793b":"setAdvisorFundWallet(address,address,uint256)","a7b07acc":"AssetSplit(address,address,address,address)","a7b2042f":"phasePublicSale3_From()","a7b2bfc7":"multyTransfer(address[],uint256[])","a7b2d313":"LogAnswerReveal(bytes32,address,bytes32,bytes32,uint256,uint256)","a7b2d4cb":"remove(int256,address)","a7b2fc00":"updateTokenNameSymbolAddress(string,string,address)","a7b314ac":"stepProfit()","a7b3a6fc":"Mine(address,uint256,uint40)","a7b4b60f":"erc223Fallback(address,uint256,bytes)","a7b69ed9":"PostLicense()","a7b71dca":"getJobValue(bytes16,address,address,uint256,uint256)","a7b7eefb":"JustmakeToken()","a7b7f1d4":"getLatestUnitRaffleInfo()","a7b83225":"AgriChainSeal()","a7b86824":"lockup(address,uint256)","a7b88506":"canRead(address,bytes32)","a7b8c868":"startCrowdsaleTime()","a7b91780":"getTokensSale()","a7b94972":"newBen(address)","a7ba0cb5":"createChatRoom(bytes32)","a7ba44c3":"isFinalizerSane()","a7ba9fb1":"epsilon()","a7bb1cf4":"_setRarityBonusValue20(uint256)","a7bb5803":"splitSignature(bytes)","a7bb959a":"Apen()","a7bc2efd":"transferGroupIntertrade(uint256,address)","a7bc3cb9":"SafeLocked(uint256)","a7bc8c46":"howManyVoters(bytes32)","a7bd4791":"MakeItWeinSec()","a7bda7e3":"extractNameFromDataET(bytes)","a7bdf16e":"isValidBump(uint16[3],uint16[3])","a7be2648":"unTrackToken(address,uint16)","a7be85c6":"AUTHOR()","a7bf1b6c":"purchase(uint256,uint256,address,address)","a7bf1cbf":"unfreezeTransfersSince(string)","a7bf8921":"freezeContract(bool,uint8[],bytes32[],bytes32[])","a7c19841":"preSaleInit()","a7c1a708":"LogGameStarted(uint256)","a7c1a75b":"maxAuditDuration()","a7c1abf1":"decodeMessage(string)","a7c1e629":"cancelTransfer(address)","a7c25c5a":"setMileagePointPrice(uint256)","a7c368c0":"pushBuyerList(address)","a7c3ce60":"distributeRegisterFee(uint256,uint256,bytes32,uint8)","a7c3d71b":"icoStartTime()","a7c41e28":"zennitToken()","a7c4abdb":"calculateTokenAmount(uint256,uint256,uint256)","a7c5052e":"buildDSTokenRegistry()","a7c591c4":"setBest(uint8)","a7c5c2a2":"BirthFee()","a7c6c83a":"getMystr()","a7c6f483":"exchangeRateAuth()","a7c742c9":"CommissionEarnedEvent(address,uint256)","a7c7d2a0":"airdropValue()","a7c7e2a0":"assignOwner(address,address)","a7c7fdeb":"transferTokensToOwner()","a7c83514":"inflationChange()","a7c8e68a":"sealManualMigration(bool)","a7c961d5":"bonussale_Cap()","a7c98748":"test3_searchNext()","a7c99f2c":"changeCompetitionAddress(address)","a7c9d92f":"HammBones()","a7ca3010":"getWithdrawTransactionCount(bool,bool)","a7cac846":"weights(address)","a7cadc50":"Dagelan()","a7cb6edc":"tokenRestriction(address,bool)","a7cbe06f":"MaxFunds(address,uint256,uint256)","a7cc440e":"getCityResourceRichness(uint256)","a7cc90e9":"calculateCounters(uint256,uint256,uint256,uint256)","a7cd21ea":"transferPrivilege(string,address)","a7cd674e":"whitelist_enable()","a7cdc2ad":"getAddressExist(address)","a7cebd4d":"createActivity(uint16,uint16,uint128,uint64,uint64)","a7cec1d2":"DataStorage()","a7cf7edd":"mimul(uint64,uint64)","a7cfe365":"addAuction(uint40,uint256)","a7d0b6ce":"payoutForResult(uint256)","a7d0c490":"keybuy(uint256)","a7d0f8af":"callStoWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","a7d2b73f":"SharkProxy()","a7d2d2ab":"AngelCoin()","a7d30400":"window1TokenExchangeRate()","a7d4549c":"test(uint8,bytes32,bytes32,address,address)","a7d4bbe6":"modexp(uint256,uint256,uint256)","a7d4e89d":"migrationOperator()","a7d512d6":"getCertificateInfoByNo(address,uint8)","a7d55b76":"tryDismissRoom(uint256)","a7d5d4fa":"approveAddToken()","a7d68896":"updateCap(uint256)","a7d77305":"chargeMonthlyRate(bytes32,address)","a7d8287d":"MyFreezeContract(address)","a7d82b00":"setGoldCertVerifier(string)","a7d89168":"getLockedAmount(address,address)","a7da611f":"commission_mom()","a7da74f8":"addQuoter(address)","a7daf6dd":"eligibleForDividence(address)","a7dbb402":"changeAddress(string,address)","a7dbfcaa":"setCostOfToken(uint256)","a7dc0aee":"test_threeValidEqString()","a7dd7a59":"unchainedMultisigVersionMinor()","a7dd7e37":"distrust()","a7de83e6":"generate(address,address)","a7de9c63":"quantityFactor()","a7dea7e4":"getMyPastLosses(address)","a7dee615":"_NewListingWhitelisted(bytes32)","a7dfc420":"investorAmountTokensToBuy(address)","a7dfc874":"unregister(bytes,address,uint256,bytes)","a7e03dcb":"mintPerBlock()","a7e1a8ee":"setAttributeType(uint256,string)","a7e1b516":"unban_user(address)","a7e1c4ac":"YunbeiToken(uint256,string,string)","a7e21e80":"hold(address)","a7e25683":"testShortOutput()","a7e2cca9":"setFinished(bool)","a7e328d4":"setSomeValues()","a7e33a0c":"sendChatMessage(string)","a7e350f7":"payOutGovernors()","a7e45699":"buyWildcardToken()","a7e47920":"createItems(uint256[],address[])","a7e48375":"MikadoToken()","a7e53987":"EthCapInWei()","a7e5a338":"HIDERA(uint256,string,string,uint256)","a7e5cb3e":"getWhoBet(address,uint256,uint256)","a7e5f1bc":"LogN_fnc(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256,uint256)","a7e5f3c5":"likeBlock(uint256)","a7e74377":"_preValidateTransaction(address,uint256)","a7e74ab7":"setMx(bytes32,address)","a7e7d2f4":"BBXCoin()","a7e81d22":"lastBlock_f5Hash_uint256()","a7e86daa":"executeBidFor(address,uint256,uint256,uint256)","a7e93e87":"retractLatestRevision(bytes20)","a7e94542":"approve(address,uint32)","a7ea48cf":"CoinBroToken()","a7ead565":"FiO()","a7eb3848":"transferRewardWithoutFee(address,uint256)","a7eb685b":"mintFeeTokens(uint256)","a7eb891f":"isClientPaidUp(address)","a7ebc5bd":"privilegedAccountStatus(address)","a7ec619f":"getCurrentStageDiscount()","a7ecce5f":"removeQuitAccount(address)","a7ecd0ad":"getSpecialAddresses()","a7ee323e":"VULCAN_PROMETHEUS_FTL_SPEED()","a7eea700":"sale2Started()","a7eeea37":"NewContributor(uint256)","a7ef4329":"getHelloWorld()","a7f07011":"tradeExecutor()","a7f0b3de":"genesis()","a7f17bd5":"Bodcoin()","a7f18b5a":"setPOOL_edit_14(string)","a7f1b77a":"addReferralDeposit(address,uint256)","a7f2cc54":"feeCalculated()","a7f2f4e2":"getMembershipStatus(address)","a7f31e0a":"getCelda(uint256)","a7f32edd":"OfflineCastleSold(uint256,address,uint256)","a7f365ae":"setLockoutPeriod(uint256)","a7f36c2e":"setProviderPriv(uint256,bool)","a7f39d8a":"tokenSaleWeiGoal()","a7f3e70f":"setSaleTimes(uint256,uint256)","a7f43779":"remove()","a7f43acd":"reserveContract()","a7f49e1d":"maximumBuyBackAmountInCents()","a7f58c24":"computeInitialPrice(uint8)","a7f5eccc":"previousReturnValue()","a7f7417d":"preICOFreeBonusPercent()","a7f81863":"thirty_wallet()","a7f86c63":"_removeRoomNight(address,uint256)","a7f879ea":"teleportToken()","a7f8a53c":"ownerSetControllerAddress(address)","a7f8fbd4":"cancel_contract()","a7f95a92":"HardcodedCrowdsale(address)","a7f9801b":"TakedFunds()","a7f9df38":"investWithBitcoin(address,uint256)","a7f9fe72":"getAllRecords()","a7fab81a":"impl_redeem(address,uint256)","a7fb95f6":"changeTeamName(uint256,string)","a7fbe7ad":"safeLastDate()","a7fbed9e":"getCurrentPhaseIndex()","a7fc7a07":"addController(address)","a7fca953":"getSrcQty(address,address,uint256,uint256)","a7fdb4f5":"finishedSale()","a7ff0a4e":"TransferTokens()","a7ff2373":"multiSendFrom(address,address[],uint256[])","a7ff7a40":"MANACrowdsale()","a7ffb2db":"getMaximumRound(uint256)","a7ffe560":"batchSpawnAsset(address,uint256[],uint256[],uint256)","a8006dfe":"exec_admin()","a801ea25":"launchLotto()","a801fd63":"setNewValue()","a802257d":"addr_Saddlery()","a8026912":"setSource(address)","a802afa1":"minOfArray(uint256[])","a80325bd":"toB32(bytes)","a804903a":"FOUNDER2()","a80498f1":"AdvancedDeposit(bytes32,uint256)","a804cc7d":"setUser(address,address,string,string,bool,bool,bool)","a804da18":"cliffReleasePercentage()","a804fcb4":"COMMUNITY_PERCENT()","a805bfef":"addInvestors(address[],uint256[],uint256[],address[])","a8074b55":"bundlingDenied()","a807598e":"incluirUsuario(address)","a8077951":"updateLastBuyKeysPIDs(uint256,uint256)","a807ea0f":"newMostInviteTimes_()","a8083b74":"setContributionSettings(uint256,uint256,uint256)","a8084938":"CryptoCupToken()","a80955b1":"setFoundersTokenAllocation(uint256)","a80a60fb":"saleFirstPresaleEndBlock()","a80a9e40":"setActive(address,address,uint256)","a80acfd3":"DisableSelling()","a80aee59":"isActiveDelegate()","a80bf3e6":"tokenLocker()","a80bffb6":"tokensOfSell()","a80c609e":"tokenImbalanceData(address,uint256)","a80c89d2":"RollbackedContract(uint256,address,address)","a80d2fb4":"getPeerMessageCount(address,address)","a80d4e9a":"EtherAuction(uint256)","a80da0f1":"SpursvsWarriors419()","a80db9fb":"nextStealTimestamp()","a80dca57":"recharge(string)","a80de5ea":"lottery(uint8)","a80e3659":"testDisputedReadValid()","a80e6c01":"getClassPlayers(uint256,uint256,uint256)","a80f54ca":"transferToExchange(address,uint256)","a80f9e2d":"RankingBallGoldCustomToken(address)","a80fe377":"Goahead()","a8103621":"dividendsPayed()","a810385e":"setBla(string)","a8103c80":"SSHToken(uint256,string,uint8,string)","a81077a7":"usersRegistered()","a810a54c":"withdraw(bool)","a810bc13":"ETCharPresale_v2(address)","a8132a46":"hardCapInToken()","a8140c95":"OceanScapeCoin(uint256,string,string)","a8150e72":"removeOrderOfVendor(address,uint256)","a8154e17":"teamUnfreezeDate()","a815a85d":"getItemCounts()","a815ff15":"set(string,address)","a8164a84":"ThxMsg(address,string)","a816899e":"icoBalances(address)","a817163b":"BusTokenLock(address,address)","a817ccac":"threeParams()","a817d2de":"extract20(bytes32)","a817f668":"findPlayer(address)","a8181851":"dapCarToken()","a8182cd3":"serverCancelActiveGame(address,uint256)","a818a222":"TokenAdded(address,uint256,uint256)","a819515d":"updateParentTotalTheoreticalSupply()","a819819b":"sweepDeityCommission(uint256)","a819c36c":"ClapToken()","a81a3e4d":"hasOpenApplication(address)","a81afa57":"sellSpecialTokens(address,uint256)","a81c3bdf":"ethFundDeposit()","a81c804e":"addToWhitelistBulk(address[])","a81d18d7":"setTokenMeta(uint256[],uint256[],uint256[])","a81d3424":"getFrozenToken(address)","a81daf29":"ETHernitymining(address)","a81dfde0":"CBT()","a8201894":"getCurrAuctionPriceAuctionID(uint256)","a820b44d":"iterateStart()","a820d02e":"MarketingDevelopmentAmount()","a8222adf":"sellerNumOpenDeals()","a82375d1":"ToGoConcert(uint256,string,string)","a8239d0b":"getPrice(string,address)","a8243ff4":"getactlen()","a824bd9a":"autoSell(address,uint256)","a824e636":"walletSend(address,uint256,address)","a82524b2":"presaleStartTime()","a8267482":"msp()","a826b422":"addCbAddress(address,bytes1,address,bytes)","a826ee78":"submitResult(uint256,uint256[])","a8276d97":"SetcashOutTime(uint256)","a827ef0a":"EvLoveItemAdded(bytes32,address,uint256,uint256,string,string)","a828251e":"voteProposal(bytes32,address,address,uint256,bytes32,string,bytes)","a8287f79":"addProduct(address,uint256,string,string,string)","a828eec5":"pureFn(uint256)","a828f441":"redeemFromEscrow(uint64)","a82970d7":"SetWorldData(uint256,uint256,uint256,uint256,uint256)","a829c3d1":"requestArbitration(bytes32,uint256)","a829d8ec":"VUP_TOKEN_SUPPLY_TIER4()","a82aa270":"updatePick(uint256,uint256)","a82b3640":"getDrawP()","a82ba2d5":"renounceKeeper()","a82cb091":"BuyDoubler()","a82d1d1a":"TwinkleToken()","a82d4ac1":"Crowdfunding(address,address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","a82e0dcc":"theCyberMessage(string)","a82e1374":"changePublicallocation(uint256)","a82e3179":"jingleContract()","a82fc94f":"issueTokensPresale(address[])","a8308665":"add5NewTraits(string,string,string,string,string,bool)","a8311aa8":"getParties()","a831751d":"addPartOwner(address)","a8319481":"cancelRole(address,address)","a831f0bb":"compareStringValue(bytes32,bytes32,bytes1)","a8321459":"topUpAvailable()","a8324a3f":"batchRestoreWebGift(address[])","a832d7df":"newSell(uint32,address,uint256)","a83332d5":"TokeniVOX(uint256,string,string)","a833386b":"toBytes32()","a833c7ab":"incentivisationAllocation()","a83467a1":"dividendcommission()","a8347f6a":"maxCrowdsaleCap()","a834c43d":"buyAccess(string)","a83500e0":"check_redeemed(string)","a8351c03":"pauseCrowdsale()","a83627de":"updatePeriod()","a8366fef":"TOKEN_STANDARD_ERC20()","a8370492":"setTrFee(uint256)","a8372511":"STCoin(uint256,string,string)","a837aeb2":"AdminStartDraw(string,bytes32)","a837c35e":"createAmountFromEXORForAddress(uint256,address,address)","a8385231":"sendTokensToAddress(uint256,address)","a839fc56":"setGoalAchieved(bool)","a83b1e21":"reply(string,bytes32)","a83cf7fe":"RefundVault(address)","a83e1d10":"getUserQuoteIds(address)","a83f9429":"extend1Week()","a840617f":"LogKycRefused(address,uint256)","a840d2a8":"GTO()","a8418d01":"BECToken(uint256,string,string)","a841da4b":"lockJackpots()","a841f1eb":"handleFunds(address,address,uint256)","a842375e":"refundToken(address)","a842f0f2":"upgradableContractAddress()","a843c51f":"transferContractOwnership(address)","a843c97f":"attack(uint256,uint256,uint256[])","a844545d":"completeMinting()","a84524a4":"getDetailedPollResults(uint256,uint256)","a84694c8":"permissionIndexOf(uint8,address)","a8469ce9":"MINING_REWARD()","a846c2fd":"payback(uint256)","a846fa37":"waitQuery()","a8474a30":"_computeRunes(uint256)","a847a1b3":"StarbasePresaleWallet(address[],uint256,uint256)","a847a71c":"isOnTrading(uint64)","a8484938":"doApprove(address,uint256)","a848e2ec":"tokenSupportSoftLimit()","a8492f46":"pickTicket(bytes4)","a84950df":"calculateTimeBonuses(uint256)","a8496426":"getOrderId()","a849cef8":"minDeposits(uint256)","a84a70aa":"lockedTime(uint256)","a84b9de0":"dequeueDouble()","a84c5330":"createNewRevision(bytes20,bytes)","a84c6362":"ICO_CAP4()","a84d073a":"interfaceMintTokens(address,uint256)","a84dd3a6":"teamWallet_3()","a84e5f40":"CRYPTONEREUM()","a84eb999":"removeAddresses(address[])","a84ebb58":"setVM(bytes32[10],uint256[4])","a84f3e5a":"overdraftUnvested()","a84f763b":"TokenTransferred(uint256,address,address)","a8514113":"_emitCategoryEvaluated(address,address,uint8,uint256,uint256)","a85165e0":"checkSubPrice(bytes32)","a851e2f6":"LogCreateNET(address,uint256)","a852995d":"bonus1StartETH()","a852d5ba":"emergency_withdraw(address)","a853d2cd":"getUserByUsername(bytes20)","a8542f66":"ANY()","a855d4ce":"uintStorage(bytes32)","a8565523":"AquaPay(string,uint256,uint8,string)","a8567a1c":"bidderUpdateBid()","a85688d2":"_rewardPoS()","a856b9c2":"lastRandom()","a85717d3":"open(bool)","a8575102":"getDnasCount()","a8590135":"issuanceEnabled()","a85923aa":"ZibPay()","a859a092":"minToken()","a859eb81":"BONUS_TIER_4_LIMIT()","a859fffe":"SweDexDividends()","a85a726d":"NewUser()","a85aba19":"setPreURI(string)","a85ade82":"FOUNDERS_VESTING_DURATION()","a85adeab":"endTimestamp()","a85b13b9":"claimBitNauticTokens()","a85c06b7":"_packRaceData(uint256,uint256,uint256,uint256)","a85d11b3":"verifyCode(bytes32,uint256)","a85d3179":"getMiningRate(address)","a85e07e2":"getMesa(uint256,uint256,uint256)","a85e59e4":"transferFrom(bytes,address,address,uint256)","a85ef579":"appendDarknode(address,address,uint256,bytes,uint256,uint256)","a85f3761":"repayments(uint256)","a85f5c2e":"tradingData()","a85ffd1a":"setAutoDistributionViaETHContributions(bool,bool)","a85ffe4f":"manualSell(address,uint256)","a860bfa2":"BRCToken()","a860d119":"communityTokenHolder()","a861baea":"presale_address()","a861e16f":"setEmployeeSalary(address,uint256,uint256)","a861f99a":"getClientPaidUpTo(address)","a8627c15":"LINICOIN()","a863f595":"Btczocker(uint256,string,uint8,string)","a86416e2":"CROWDSALE_PRICE()","a8644cd5":"contract_eth_value_bonus()","a86477ad":"offeringEnabled()","a8648aad":"TokenFunctions()","a8659216":"setInitialLockinDays(uint256)","a8660a78":"vestingStartTime()","a866665a":"ConsoToken()","a8670711":"isCloseSale()","a8681169":"withdrawWhiteList(uint256)","a868378b":"returnOfIncome(address,uint256)","a8683df7":"TokenMyUnicoin(uint256,string,string)","a868cd6f":"LogPolicyManualPayout(uint256,bytes32)","a868ec85":"setName(uint256,uint256)","a86abb3d":"allFilmsInfo(uint256)","a86b73f0":"toByte(uint8)","a86bc181":"EXPECTED_END()","a86c938b":"balanceOf(bytes8,address)","a86e3576":"symbol(address)","a86ed5e4":"thirdMaxAmount()","a86ee746":"restoreCutieToAddress(uint40,address)","a86f7212":"_allocatePlayerTokensTo(address,uint256)","a870a0a5":"getChannelClosingSettler(bytes32)","a870be8a":"setVendingStepValues(uint256,uint256,uint256)","a870ddc2":"moveTokensFromSaleToCirculating(address,uint256)","a871da91":"SHORT()","a871ffdc":"Getsafe(uint256)","a87253c7":"getlastuser()","a873b155":"GetMinimumBet()","a8740a71":"getCreditLedger(uint256)","a8754caa":"purchaserMapping(address)","a8756337":"getCurrentValidatorsLengthWithoutMoC()","a87595ce":"buynowPrice()","a875b2ed":"setIsBatch(bool)","a87607af":"Show_address_for_option_B()","a8762854":"numberInRaffle()","a8766017":"ARXToken()","a876a8a0":"_round()","a877b557":"TransferMinimumFeeExecuted(uint256,address,uint8)","a877db9f":"none()","a878ad27":"createTokenToOperation()","a878aee6":"withdrawAllTokens(address)","a8790533":"distribution(address[],address,uint256,uint256,uint256,uint256,uint256)","a879af45":"oldTokenBalance(address)","a879fcbb":"assetInfo(uint256)","a87af57b":"setTokenForSale(uint256,uint256,address,bool)","a87b1cd2":"whitelistedBeforeActivation(address)","a87b73c7":"StageOpened(uint256)","a87ced35":"startDispute(bytes32,address,int256)","a87d2321":"Gummy()","a87d8b6b":"walkClientOrders(address,uint128,uint128)","a87d942c":"getCount()","a87de9cc":"ADD(uint256,uint256)","a87e0c33":"newAgon(uint64,uint64)","a87e5d3f":"setPriceUpdateFrequency(uint256)","a87e7552":"isValid(bytes,bytes)","a87e8aad":"getMyCat()","a87ebcb5":"setJackpotMinimumAmount(uint256)","a87f32a2":"ownFiles(string,string,string)","a87f84fc":"updatePersonLocation(uint256,string)","a87ffd1d":"GenesisInitialSupply(address,address)","a880319d":"addToken(address,string,string,uint8,bytes,bytes)","a880531f":"getOraclizeCbAddress()","a8817403":"addFamedStar(string,uint256,uint256)","a881f85e":"clearTokenSale(uint256)","a8825650":"slice(bytes32[],uint256,uint256)","a8826602":"getAllCellIds()","a882d49f":"replaceMultisig(address)","a8834aac":"getPointer(uint8)","a8836844":"returnPayees()","a883aab3":"GlobalAmountCapHard()","a883b0c4":"changeRate(uint256,uint256)","a883fb90":"getPendingVersion()","a885508a":"removePermissionManager(address,bytes32)","a885dab6":"getTokensPerDay(uint256)","a8862fcc":"isEscaping(uint32,int256)","a8865bda":"masternodeIsValid(address)","a886d66f":"crowdsaleList(uint256)","a8870d6f":"mintingDataUpdatedAtBlock()","a887d816":"checkTransferRequirements(address,uint256)","a888e4c9":"releaseSingleAm()","a8893a6e":"getNumOfSalesWithSameId(bytes16)","a88b2562":"AZLTEST()","a88b61aa":"isIncreasedEnough(address)","a88be96b":"RESERVE_EXCHANGE_RATE()","a88c0a9f":"LAMP()","a88c5ef7":"NextPayout()","a88c906c":"_buyUninitializedPixelBlock(uint256,uint256,uint256,bytes32)","a88e34cb":"setERC20address(address)","a88ec6fa":"showUnpaidDepositPercent(address)","a88ef2d3":"CarlosToken()","a88fa4b4":"updateStartTimeManually(uint256)","a88fe42d":"setPrices(uint256,uint256,uint256)","a88fe73a":"discountValue10()","a89004c5":"modifyQuanticCloudIOTData(uint256,uint256)","a89026a3":"teamProfitAddress()","a890b7d9":"finalize(address,bool)","a890d257":"IsThisPrivate()","a8915c7e":"periodPreITO_weiPerToken()","a89171e3":"checkHasilBet(address)","a89196a6":"eraExists(bytes32)","a891af67":"megaCandy()","a891fdc3":"earlybirdEnded()","a8928b45":"withdraw_internal(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[4])","a8929183":"LinkyexToken(address,address)","a894878d":"createPromoMeme(address,uint256,string,uint256)","a8967557":"isPresaleClosed()","a896d92d":"isRegularAddress(address)","a8977041":"Plenum(uint8,uint256)","a8978434":"softResolveAnswer(uint256)","a8986327":"minTokenForSP()","a899e615":"raiseRatio()","a899ef57":"parentSnapshotId()","a89a4f09":"creatorBalanceChecker()","a89acca4":"setCrowdsaleDates(uint256,uint256)","a89ae4ba":"oracleAddress()","a89c5be0":"MAX_TOTAL_TOKEN_AMOUNT()","a89c8c5e":"setTokenAddresses(address,address)","a89cdad9":"nextSnapshotTime()","a89d1eb9":"foobarToken()","a89f173c":"setUint(int256,uint256,uint8,uint16,uint32,uint256)","a89f5f85":"cmp(uint256,uint256,bool)","a8a01c3e":"cvcOwner()","a8a1d27b":"firstRoundWMTokensLimit()","a8a403df":"MaptPresaleToken(address,address)","a8a4bf11":"startNewAuction(uint64,uint64,uint64,uint64)","a8a52747":"getRelayedSender(bytes16,uint8,uint128,uint8,bytes32,bytes32)","a8a54008":"registerAddress(address)","a8a5c22c":"refineCost()","a8a618e9":"draw_random_card(uint8)","a8a6e9df":"deliveryToken(uint256,uint256)","a8a77984":"StoreBytes(bytes)","a8a9aaa9":"TokenLayer(address,address)","a8aa1b31":"pair()","a8aa7e19":"buyTeamHandle(string)","a8aaa2a6":"StringMapper()","a8abe1fb":"getCET4ScoreById(uint32)","a8abe69a":"getTransactionIds(uint256,uint256,bool,bool)","a8ac262b":"phaseCrowdsale()","a8ae3745":"evaluateTokens(uint256,address)","a8ae3e4b":"getAllocatedTokenValue(address,address,address)","a8ae5eb8":"howManyTanks()","a8ae9046":"RFToken()","a8aeecd9":"getCostForBattleCards(uint256,uint256,uint256)","a8af232b":"withdrawTopUp()","a8af4ff5":"getRegistrationStatus(address)","a8af6e05":"emitHashSet(address,bytes32,bytes32)","a8af74f1":"calcTrackerCount(uint256)","a8afc538":"priceAtInitialAuction(uint256,uint256)","a8b0312c":"GameStatus(uint8,uint8,uint8,uint8)","a8b05162":"_changeTilePrice(uint8,uint256)","a8b151fd":"santaFundWallet()","a8b1895d":"leftLottery()","a8b25075":"allowTransfers(bool)","a8b26420":"isUInt64ValidIn64(uint64)","a8b31f04":"HHH3(string,string)","a8b322b6":"verifiedWinnersCount()","a8b415d2":"BanliangCoin()","a8b42f1f":"registerAsAnOpponent()","a8b50ee0":"getWinnningsLength()","a8b57f15":"VIPPurchase(address,address,uint256,uint256)","a8b60b93":"ackMsg(uint256,string)","a8b82c5b":"BaseAgriChainContract()","a8b86c4c":"ZchargeToken(uint256,string,string)","a8b8799f":"getRecordId(uint256)","a8b88268":"checkEarlybird(uint256)","a8b973a1":"bonusMultiplier()","a8b981d3":"FOURTH_RATE()","a8baa97d":"getPlayerDetectGroup(address)","a8bb76d4":"checkSettlement()","a8bbe5a4":"ERC20Voting(address)","a8bc362e":"KleynCoin()","a8bc3a6c":"whitelistedPlannedContributions()","a8bcbf3c":"payManagementBodyAmount(uint256)","a8bd9c32":"tokenIndexToApproved(uint256)","a8bda3e9":"getTRed(uint256,uint256,uint256)","a8beb2cf":"Lockup6m_20180801(address)","a8bfd57f":"getMinerOffset()","a8c0f15e":"addProperty(bytes32)","a8c10d78":"BetSubmission(uint256)","a8c12d7c":"PayMain(address)","a8c17ec2":"incremental(uint256)","a8c1a0b7":"BuyTokensExternal(address,string,uint72,uint88,uint88)","a8c23cb9":"isValid(bytes32,string,address,uint256,address)","a8c278a2":"verificationFee()","a8c2c4a7":"mainICOEndTime()","a8c310d5":"distributeAmounts(address[],uint256[])","a8c3d246":"LamaToken()","a8c3ec48":"oraclize_query(uint256,string,string[2])","a8c499a0":"lrcDeposited()","a8c4c8bc":"right64(uint256)","a8c65126":"determineNextRoundLength()","a8c69264":"setreleaseFinalizationDate(uint256)","a8c6e684":"addint16(int16,int16)","a8c89c5b":"payableEnabled()","a8c923e2":"BlockchainDevCoin()","a8c9f8ae":"unSoldTokens()","a8ca698b":"absSub(uint256,uint256)","a8cab3d1":"Frozen()","a8cb7b4f":"ownerRequired()","a8cbabb7":"blockCrowdsale()","a8cbb5de":"addMake(uint256)","a8ccef6c":"setClue2(string)","a8cd0a80":"getTest()","a8cdcebd":"exchangeIdsToOpenMakeOrderIds(uint256,address)","a8ce0e60":"QuestTestToken()","a8ce6b73":"calculateWithdraw(uint256,uint256,uint256,uint256)","a8d00e73":"dayLength()","a8d088bb":"getManagers()","a8d10fb8":"getOrgCount(string)","a8d18472":"estWolkToBurn(address,uint256)","a8d18bc0":"HireGoCrowdsale(uint256,address)","a8d1fcff":"cancelNewBallot()","a8d201ab":"removeNodeFromWhitelist(address)","a8d34ea5":"getCompte_10()","a8d3a63d":"pullEtherFromContractAfterICO()","a8d48709":"EARLYBIRD_PRICE_MULTIPLIER()","a8d49e64":"setWhitelistAdmin(address)","a8d4a03b":"heroes(uint256)","a8d4ee0f":"setOwnerExt()","a8d51f7e":"GiftToken(address)","a8d5308c":"bountymanager()","a8d5652e":"tokensPerTier()","a8d5efa3":"CATPayment(address,address,uint256)","a8d5fd65":"share()","a8d84b7c":"purchaseWithIndex(uint256,uint256)","a8d84fc3":"activeEnd()","a8d88127":"exists(int256,int256)","a8d8e055":"checkAddressBatch(address[])","a8d95496":"getHighestPriceOwnerAt(uint256)","a8d95fb2":"claim(address,string)","a8d99045":"totalSellCardNumber()","a8d9a89a":"initialICOCap()","a8d9e8a3":"sendFeeIfAvailable()","a8da6873":"_fetchCreatedOrdersForPayer(address)","a8dab783":"isPASigned(uint32)","a8db1837":"test_updateAndGetPrice()","a8db2445":"setCompany(address)","a8dc824c":"unlockSupply()","a8dd07dc":"totalBonus()","a8ddefab":"withdrawNacNetfRe(uint256)","a8df3e69":"post(address,address,uint256,string)","a8df7894":"investDirect(address,uint256)","a8df80ad":"Hellob()","a8df99a9":"_emitSkillsSet(address,uint256,uint256,uint256)","a8e02ccb":"activeCall(address)","a8e04f34":"disableInitialStage()","a8e1903c":"RevokeTokens(address)","a8e1b53f":"AICoin(address,uint256)","a8e3371a":"eduCash(uint256,string,string)","a8e3a6b6":"communityTokensCap()","a8e48a7e":"PausableCrowdsaleImplUnpaused(uint256,uint256,uint256,address)","a8e496b9":"toDay(uint256)","a8e4fb90":"proposer()","a8e553f5":"decrypt(uint32[26],uint32[4])","a8e5740c":"setOgToken(address)","a8e5e219":"jobStatus(uint256)","a8e5e4aa":"approveERC20(address,address,uint256)","a8e6e77b":"addManyAdmins(address[])","a8e6ee52":"goldCertVerifier()","a8e6f9dc":"set_property_address(uint256,string,address,string,string,string)","a8e70dd3":"unblockMessagesFrom(address)","a8e81844":"GeneBTC()","a8e8f677":"maxDice()","a8e91396":"setICOPriceatDollar(uint256)","a8e9b249":"versionSelectors(bytes32,bytes32)","a8ea8554":"changeAmount()","a8eaefd7":"TotalFee(address[])","a8ec9ffb":"CrowdsaleStageStarted(uint256,uint256,uint256,uint256,uint256)","a8ecc7f1":"rbac()","a8ed1be5":"bts_address2()","a8eee036":"Locality(string)","a8ef4b66":"PERMISSIONMANAGER_KEY()","a8ef6edd":"testTrusting()","a8f02555":"DXF_Tokens()","a8f03616":"ownerTokenSharePct()","a8f06876":"CETToken(uint256,string,string)","a8f07dcc":"minimum_investment()","a8f0d3a7":"getArrayBytes32(bytes32)","a8f0e6e2":"sellPriceOf(uint256)","a8f0ebeb":"decreaseClaimsBalance(address,uint256)","a8f0fbbd":"helloToken()","a8f11eb9":"autoDistribute()","a8f2ba4c":"bet_win()","a8f2d63b":"isPublicTokenSaleRunning()","a8f436df":"startEvaluating()","a8f56600":"model_accuracy_criteria()","a8f5bbd9":"initiateUser()","a8f5c673":"savePepe(uint256)","a8f653fa":"finalizeStage()","a8f6c913":"erc20Contract()","a8f6d313":"minimumFundingUSD()","a8f6d84d":"returnPercentage()","a8f6f1f0":"randomGenerateMethod()","a8f7e238":"getAdminsForGame(uint256)","a8f7f82d":"ICO_start_future(uint256)","a8f8884d":"botIndexToApproved(uint256)","a8f899a0":"LogBuyForInvestor(address,uint256,string)","a8f8c6de":"getCollaborated(uint256)","a8f8e2ae":"testFailIfReverts()","a8f927e9":"getLanguage()","a8f92b52":"MindCoin(uint256,string,string)","a8f9868e":"getTotalBalanceFor(address)","a8fa14b0":"disableContractUpgradability()","a8fa2fc6":"getCurrentDevReward()","a8fa5682":"dnsRecord(bytes32,bytes32,uint16)","a8fa6e14":"setLastRewardTime(uint256,uint256)","a8fa8e52":"valuePerToken()","a8fac082":"claimMonthlyDemurrage(uint256)","a8faf6f0":"SmartAirdrop()","a8fc1a2a":"realDevReward()","a8fc32de":"sendDividends()","a8fca0fc":"toRtc(uint256)","a8fd1026":"gemPerEther()","a8fdb290":"EtherToken(uint256,string,string)","a8fdf903":"_underMintNextTokenId(uint256)","a8fe43ce":"getVotingProxy(uint32,int256)","a8fe5465":"PRE_SALE_15_BONUS_MIN()","a8feda51":"processRefunds()","a8ffa37f":"gameTokenResolution(uint256,address,uint256,address,uint256)","a8ffa9d9":"addCandidato(string)","a9011990":"getOneDepositRec(uint256)","a90135df":"pgoInternalReserveWallet()","a9014b0f":"isListed(uint64)","a9018896":"refreshScore(uint8,bytes32)","a901aaa0":"AirRewardmaxTotalSupply()","a901ce92":"founderTokenWithdrawnPhase4()","a9030162":"refundFish(address,uint256)","a903073e":"getOwnerTeam(address)","a9036b43":"Minter(address,uint256,uint256,uint256)","a903741a":"TEAM_BONUS()","a904cc53":"withdrawEtherBalance(uint256)","a904e5c8":"TRM1BonusActive()","a9055b81":"makerRequiredKncStake(address)","a9059cbb":"transfer(address,uint256)","a905f4c0":"DUOLINGO(uint256,string,string,uint256)","a9061415":"getsellmoney(uint256)","a906f837":"relocationSwitch(bool,address)","a9076f9e":"setBidding(bool)","a908f2e3":"Faucet(string,address)","a9092c11":"numChoices()","a909d7d3":"removeTokenEmission(uint256)","a909fc56":"mint(int256,address)","a90a4ac2":"addStruct1(string)","a90a6427":"setPaydayFrequencyInDays(uint8)","a90a6952":"EmissiveErc223Token(address,string,uint8,string,string)","a90a8eea":"getDaysInYear(uint16)","a90ae887":"claimPayment(uint256,uint256,bytes)","a90b5e62":"setTokensContractAddress(address)","a90d3cda":"totalContributionsBy(uint256,address)","a90e0608":"icoFinalized(uint256)","a90e09e2":"addWhitelisted()","a90e65a3":"MinorPrizePayout(address,uint256,uint8)","a90eb2b9":"sendFundsToNextCycle(uint256,uint256)","a90f8e9a":"referredBy(address)","a90fcfa0":"_generateName(string,string)","a90fd971":"minerRelaseTime()","a90fdf20":"test_bytes(bytes)","a9112140":"change(address,uint256,uint256)","a91202d3":"createUser(bytes32,bytes32)","a9120f6d":"release_by_manager()","a913c43f":"getLockedAmount_jiedians(address)","a913eb24":"_price_token_ICO2()","a9142808":"logFollowerTradingTx(bytes32)","a9147e22":"setIsCheckStage(bool)","a9157518":"add5NewStreetNames(string,string,string,string,string)","a9171d56":"purchaseCallbackOnAcceptAndDistribute(uint256,address[],uint256[])","a9188878":"setPrimordialPrices(uint256,uint256)","a918c09c":"supplyFuel(uint256)","a91a1080":"getCase(uint256)","a91a39ad":"havedCrowdCoin()","a91aae63":"NihilCoin(uint256,string,uint8,string)","a91abdcb":"referralCut()","a91b2e9f":"getProfit(uint256)","a91bc3cd":"nextMinimumTimeout()","a91be87f":"addEarlylist(address[],address)","a91c39a9":"setEnergyCost(uint256)","a91ce985":"createOrder(address[3],uint256[4])","a91cec21":"ineRexToken()","a91cfecf":"Foosball()","a91d6c65":"initLockedBalanceOf(address)","a91d99db":"whitelistAddressesPresale(address[])","a91ed8c6":"mintReserve(address)","a91ee0dc":"setRegistry(address)","a91f559d":"NeLunaCoin()","a91faadf":"JoshContract()","a91fbb99":"MonetoSale(address,address)","a91fc821":"Registry(address,address,address)","a9203f3c":"getFlower(uint256)","a92100cb":"loop()","a921ba7d":"totalBattleboards()","a9221706":"_transferAndCall(address,address,uint256,bytes)","a9225743":"_commitBallot(bytes32,uint256,uint256,bool)","a92259fc":"AVAILABLE_TOTAL_SUPPLY()","a923ebac":"unbindEthereumAddress(address,bytes32)","a923fc40":"setInfo(string,string)","a9240e32":"setEtherRatioForOwner(uint256)","a924d3ca":"getMangers()","a924ee60":"disableTokenMinting()","a9250212":"publicationCount(address)","a925252a":"acceptAuctionResult(address,uint256,string)","a925d85e":"Exchange(address,address)","a926819f":"disableWallet(address)","a927f46b":"Etherwow()","a9287619":"buyXaddr(uint256,address)","a9293efe":"calculateSeasonScore(address,int8)","a92950f6":"chainWith(uint256,uint256)","a9298848":"askForALoan(address,uint256,uint256)","a92aafb0":"paused_1()","a92ab316":"EIN()","a92c300a":"getBidData(uint256)","a92c3231":"stageNumber()","a92ca27d":"editionInfo(uint256)","a92d5367":"changeTournamentTaxAmt(uint8)","a92d6a48":"disableAuthentication()","a92ec661":"isAfterStartTime()","a92f0c80":"TokenVesting(uint256,uint256,uint256)","a92f0cb9":"withdrawFailedOldOwnerTransferAmount()","a92fcf9c":"addRecord(string,string,string,bytes32,int64)","a9321573":"addExcluded(address)","a9324192":"walletOut1()","a932ed0d":"whitelistRemove(address)","a936444a":"POWH33()","a936c203":"reLoadXid()","a937c28b":"authorisedInvestors()","a937f12b":"TidealToken(address)","a9390454":"DevvotePrefund(address,address)","a9393452":"getAuctions(uint32,uint32)","a9396a1b":"getStageInfo()","a93a77c1":"available_percentage()","a93b1a65":"_referrerTax(uint256,bool)","a93b5331":"totalFundingSupply()","a93c1286":"Y2CASH()","a93d7c72":"quickChange(address[],uint256,uint256)","a93deda4":"Philanthropy(address,string,uint256,uint256,uint256,uint256,uint256)","a93e0386":"preSaleBonus4Amount()","a93e2b49":"YBQ()","a93e4044":"getCountTokensByLottery(uint32)","a93e8701":"BetCanceled(address,uint256)","a93fd5f1":"organizer5()","a940565e":"haveIBeenNaughty(address)","a9405923":"getParent(address)","a9405f4f":"HashToFileName(string)","a940d013":"ether_profit()","a9414cc3":"getPositionsAndTokensCnt(uint256)","a941be3c":"internalBuy(address,uint256,bool)","a941c8d6":"calculateWinningEntries()","a941ff21":"getCampaignEndDateById(bytes32)","a942bf05":"dDeployCommunityBallot(bytes32,bytes32,bytes32,uint128)","a942de01":"createSetup(uint256,uint256,address[])","a9430dcb":"Shabu()","a94385a0":"donateFromWallet(uint256)","a94387a6":"raiseBuyOrderCreated(address,uint32,uint32,uint80,uint256,int160)","a943c21f":"getVotingResult(address)","a9445499":"ZperMainSale(address,uint256,uint256,uint256)","a944f15b":"createAuction(address,uint16,uint16,uint256,uint64,uint16,uint16,uint64,uint256)","a94510ca":"withdraw_badge()","a9457d9c":"whatIsCurrentCap()","a945c5c3":"totalInvestments(uint256)","a945f90f":"partnersWallet()","a9466a88":"getAllScripts(uint256)","a946d7bb":"setMedalsClaimed(uint16)","a9472396":"getClientReward(uint256)","a94834a1":"openGameRange(uint256,uint256)","a948d72d":"ZethrBankroll()","a9496e73":"timeBeforeJackpotReset()","a949c637":"addOwner(address,address,address)","a949f3af":"getMyLastCollectHour(uint32)","a94a06e8":"findRegularTime()","a94ab274":"corePay(uint256,uint256,uint256,string,uint256)","a94c33a6":"Auxilium()","a94c468d":"RemoveRank(uint256,uint256)","a94c7c65":"limitedPrint(address,uint256)","a94e7ed4":"isSpecificallyApprovedFor(address,uint256)","a94feacc":"claimTokenWindowOpen()","a95022a6":"GoodTimeCoin(uint256,string,string)","a95055a8":"getPlayerBoardsIDs(bool)","a9505eb4":"maxOfArray(uint256[])","a950fb0e":"b64decode(bytes)","a9510f89":"totalAmountOfTokens()","a951c534":"_CallScheduled(bytes32)","a951c994":"setSetupComplete()","a951f28e":"dayaToken()","a951fad2":"CryptoX(uint256,uint256)","a9522f4e":"IsDividendAvailabe()","a95236ed":"DeDeTokenContract(address)","a95240c4":"memberShareCount()","a95281f0":"registerPoA(string,bytes32,uint256[],uint256[],address,address)","a952f268":"MAYExchangeRate()","a9535320":"TwoXJackpot()","a9538157":"increaseApprovalByLegacy(address,address,uint256)","a953d08d":"mintBounty(address,uint256)","a954736d":"cancelSellPop(uint256)","a9549f81":"getDAOId(uint256)","a954c209":"great(uint256)","a9550ecb":"getMonsterDefenseFromDna(uint256,uint256)","a9553d74":"phaseThreeBonusPercent()","a9559dd7":"updateBalance()","a95609ca":"editContribution(address,uint256,uint256,uint256,uint256)","a9572ac7":"setMulFactor(uint256)","a9580edd":"distribute(uint256,uint256,address,uint256)","a95824b4":"votingOpen()","a95836d1":"finalizeICO(address)","a958ffc4":"fundingDurationInHours()","a9593b98":"changeVote(uint256,uint256)","a9595472":"SOC()","a95a3887":"rolloutDividends(address)","a95bc9a7":"changeChannel(address,uint256,uint256,uint256)","a95bfd36":"adminAddBallotOption(uint32,string)","a95c372d":"fetch()","a95c4d62":"purchaseToken()","a95c5339":"checkGameRegiester(address)","a95d017d":"getRevisionBlockNumber(bytes32,uint256)","a95d580c":"withdrawEarnings(uint256,bool)","a95d85d8":"withdrawTo(uint256,address,bytes)","a95d9c14":"Uncloak()","a95ff7d5":"isDecentBetCrowdsale()","a9604239":"maxAmountRoundSeed()","a9607011":"HappyEthericHome()","a96088a5":"vernamToken()","a9612f72":"emitOwnershipChange(address,address,bytes32)","a9615f59":"platAuction()","a961e9e8":"startSaleTime()","a9625fa8":"MANHATTANPROXY3RDST()","a962a7d6":"set_burned(uint256)","a9636b9f":"Bytes32Oracle(bytes32)","a964bb9a":"configureLimit(uint16,uint16)","a964bea7":"CheckRevoke(address)","a96594d3":"nextLotteryTTMTokenId10()","a965a941":"getNote(uint256)","a965e5c1":"setBonusAddress(address,bool)","a96654ee":"transferredOwner(address)","a9671d8f":"getProductionOf(address)","a9671dd9":"enableProxy(address)","a967f3e7":"emitProjectCreated(uint256,uint256,address)","a968309d":"plutochain()","a968991b":"confirmed()","a9689d0f":"transactionFeeRate()","a968ad0e":"resetBonuses(address)","a968b97c":"verifyCodeLength(string)","a96948c6":"chefBalanceOf(address)","a969574d":"ratePreICOEnd()","a969f080":"QUIKKO()","a969ff0a":"collectFee(uint256)","a96a4998":"DEFROST_FACTOR()","a96a5a5b":"pwin()","a96af0f4":"saleSupply()","a96b1828":"GLOBALETHER()","a96b2dc0":"getCallCount()","a96b3ab8":"getDthShop(address)","a96c3e6e":"getPlayerAddr(string)","a96c4eb7":"Sold(uint32,address,address,uint256)","a96c6bfe":"setDeveloper(address,bool)","a96ce7aa":"unlock(string)","a96f45c7":"ETHTransfer(address,address,uint256)","a96f8668":"releaseTokens()","a96fb9b4":"testTokenA()","a970a23a":"internalUpdateRates(bytes4[],uint256[],uint256)","a970ef6e":"tokenContractDefined()","a9718d51":"getTransferValuebyArrd(address)","a971c23d":"minimumFeePercentage()","a9725a68":"LIMIT_STAR5()","a9726c1e":"withdraw_bounty()","a972a451":"sqrt(uint32)","a973e27c":"testFind()","a9740fdf":"SwapCreation(address,address,uint256,uint256,address)","a9743c68":"getCallPayout(bytes32)","a9746acf":"UserBought(address,uint256,uint256,uint256,uint256)","a974e21f":"HKIN(uint256,string,string)","a97501a3":"ManUvsTottenham()","a97583de":"_transferByPartition(bytes32,address,address,address,uint256,bytes,bytes)","a9758fcc":"CurationRightsTransferred(address,address)","a9764152":"createFunction(string,string)","a9767e14":"masternodeMineTokens()","a977449e":"unbanReferrer(address)","a977c71e":"changeQuota(uint256)","a9782954":"hunterOf(address)","a979169f":"updatePackage(uint256,string)","a9791aec":"tgeSetFinished()","a9797521":"bn128_is_on_curve(uint256[2],int256)","a97a6d63":"setWhitelisted(address,address,bool)","a97b8b48":"LOG_CurrentPercent(uint256)","a97b8b4d":"closeBallot()","a97c8eb4":"RTEToken()","a97cb561":"isTransferAgent(address,address)","a97cc114":"getTile(uint256)","a97d48fd":"sendContractFundsToAddress(uint256,address)","a97e5c93":"isOracle(address)","a97fc381":"toSlice(bytes)","a97fe7b6":"airDropTotalSupply()","a97ffd5e":"safeToSell(uint256)","a9804acb":"HealthyCoins(string,string,uint256)","a980bb9e":"isDisclosureSigned(uint256)","a9814d14":"Outcome()","a981daca":"testIntParserNegative()","a9820ead":"Ballot(bytes32[],bytes32[])","a9824288":"CTMC()","a9825b7c":"bonusUnsold()","a9831437":"setCreationPrice(uint256)","a9831edf":"unlockFundsAndPassEther()","a98325b6":"collectDividend()","a983637e":"BACHELORCHAIN()","a9839dd7":"exchg(address)","a983c932":"isValidContract(bytes32)","a983d414":"safeassert(bool)","a983dcc0":"setDefault(bytes32)","a983e1bb":"random(uint256,uint16)","a984cec2":"additionalPresaleInvestors()","a9850e26":"SellToyMoney(uint256)","a9854087":"closeAt()","a9856d6d":"initSale(address,address,uint256,string)","a985e6c6":"withdrawAirDrop(address[],uint256)","a986c969":"stand(address,uint8[],bytes32,uint8[],uint8[],bool[],uint256,bytes32,bytes32)","a986ef4a":"nextRoundCoolingTime()","a9872393":"racesInfo(uint256,uint8,address)","a9875d70":"stage4Start()","a987d4c6":"_mint(address,uint256,string)","a987d654":"restoreItem(uint256)","a987f9da":"Creation(uint256,string,address)","a9888148":"testFailRetractNotRetractable()","a988845a":"setNewMessageNumber2(string,uint256)","a988df4b":"bgb_per_eos()","a988e371":"taxPaid(address)","a988ea3a":"NETHtoken(uint256,string,string)","a98902e9":"LUNVault(address)","a98a6d19":"ICOWeiRaised()","a98a89c2":"buy1(address[],address[],uint256[],bytes)","a98ad199":"removePermittedContract(address)","a98af238":"setCCH_edit_16(string)","a98c439f":"buyTokensAltercoins(address,uint256)","a98ca17d":"exercise(uint256,uint256[3],address)","a98cb619":"transferGenesis(address)","a98d5961":"pickRandomAssetPosition(uint256,uint256,uint256)","a98e4e77":"getAccountCount()","a98ee0b7":"_getInitAuctionSeconds()","a98f81fd":"BEXAM()","a98f99d8":"removeDefaultOperatorByTranche(bytes32,address)","a9901c6b":"getIsCoinReg(bytes4)","a990dd52":"unitsOneEthCanBuybefore()","a9918dfc":"getCompte_36()","a991a24d":"getTenancy(uint256,uint256)","a991cb0e":"respond(uint256)","a991faf9":"getTotalDividendsAmount()","a99306e7":"addPVPContender(address,uint256)","a993772f":"isPreIcoFinish()","a993e180":"getFechaTax()","a9948f7e":"GetNbyPrice(uint256)","a996d6ce":"setBurner(address)","a996d72e":"OracleChainToken(uint256,string,uint8,string)","a9974338":"setB0xToken(address)","a997f82f":"setCrowdsaleStage(uint256)","a998146b":"allToken()","a9985260":"test_setMaxSize()","a9989b93":"tokenAddresses()","a998fdbe":"getWithdrawAmount(address,address)","a9995010":"CappedCrowdsale()","a99a353b":"SWAP(address,address)","a99a3f03":"PLAYER_TIMEOUT()","a99a3f98":"initSale(uint256,uint256,uint256,uint256,uint256,uint256)","a99a985b":"betOn(uint32,uint32,uint256,address)","a99aa366":"presaleDiscount()","a99b9e39":"ICO_START_DATE()","a99be610":"PreIcoMessage()","a99bf4fa":"Potential_Investors(address)","a99ce372":"VINE_CAPACITY_PER_LAND()","a99d8d48":"changeTransferable()","a99da6af":"finishDeal(uint256)","a99dca3f":"hi()","a99df9c3":"oneCentInWei()","a99e0a81":"maxICOFirstSupply()","a99e6465":"addTier2Member(address)","a99e7e29":"register(bytes,address)","a99f0d9f":"_addBallot(bytes32,uint256,uint256,bool)","a99fba7d":"calculatePlatformCommission(uint256)","a99fc5aa":"tempCharity()","a99ffb7b":"timestamp(bytes12)","a9a07af9":"incFightToDeathWin(uint256)","a9a0844b":"getSaleVolume()","a9a0b495":"getPreSignedHash(bytes4,address,uint256,bytes,uint256,uint256)","a9a11111":"QuadraticVoting()","a9a18dda":"totalEthReceived()","a9a1fb96":"releaseTokensForce(bytes32)","a9a26902":"changeBubbleWallet(address)","a9a29afa":"getRefundTxFee()","a9a343b3":"Puzzled(address,bytes32)","a9a3a9c5":"vxtest()","a9a3cef4":"LISKClassic()","a9a3da4a":"getRemainUtcoin()","a9a40c71":"getNumberOfOpenDeals()","a9a51f89":"changeTokens()","a9a5e3af":"removeOwners(address[])","a9a615e9":"setWhitelistedStatus(address,uint256)","a9a6e9b4":"distributeLCD(address[],uint256)","a9a8679b":"authorizeAccount(address)","a9a8fc84":"ItemCreated(address,uint256)","a9a9d7af":"sellerList(address)","a9a9e4f7":"_payloadOffset()","a9aac3e4":"registerWineOwner(address,string,string)","a9aad58c":"PAUSED()","a9aae07a":"setMinGas4Accts(uint256)","a9aaf116":"BillahChain()","a9ab9b46":"getAccountItems(address,uint256)","a9abe7be":"setIcoSecondWeekRate(uint256)","a9ac225c":"ProposalTallied(uint256,uint256,bool)","a9ac4c5f":"checkMonthlyLimit()","a9acc475":"getBlockValue()","a9adaecd":"calcStopPriceFactor()","a9add7dc":"setEvolvePrice(uint128)","a9ae8323":"presaleDateFinish()","a9aeb059":"updateCeiling()","a9b07600":"setIdArray(address,uint256,string,string,uint256[])","a9b0c5a4":"preIcoFinished()","a9b0e8d5":"Cscchain(uint256,string,string)","a9b11426":"getImageOwner(uint256)","a9b12c4c":"blocktime()","a9b1d507":"makeWallet()","a9b1ffd9":"totalChequeValue()","a9b2c135":"lockedYears()","a9b2ca9c":"changeDragonGen(uint256,uint256,uint8)","a9b2cc09":"getMaxContributionAmount()","a9b35240":"packageExists(bytes32)","a9b46030":"BurnableOpenPayment(address,uint256)","a9b48ba7":"WIN()","a9b4b780":"getWeight()","a9b542bd":"getDna1(uint256)","a9b551d2":"getAdministratorMoney(address)","a9b5ae83":"messageForPeace(string)","a9b69e7c":"deployersCount()","a9b6c8bc":"getAddress(bytes16)","a9b76504":"getContestTeam(uint32,uint32)","a9b7c3bf":"cooAddress1()","a9b86292":"totalSharePool()","a9b86924":"buyStoreByName(bytes32)","a9b8dad6":"level_3_percent()","a9b8f7b8":"ProtectTheCastle()","a9ba2b09":"releaseFine()","a9bb03a4":"deptrespond(address,address,string,bool)","a9bb3274":"UCCOIN_PER_ETHER()","a9bc5db1":"createHeld(address,uint256)","a9bf1c9f":"ENS_ROOT()","a9bfe5c7":"TokenBalance()","a9c0838d":"getPI_edit_3()","a9c1873c":"setTokenPerEth(uint256)","a9c1f2f1":"decayRate()","a9c2ac3a":"getBetIds(uint256)","a9c2e36c":"getFactoryAddress()","a9c32c35":"NewExchangeRate(uint256)","a9c38476":"latestEditionReleased()","a9c4429a":"getInvestmentPackageInformation(uint256)","a9c45fcb":"upgradeToAndCall(uint256,address,bytes)","a9c4d62e":"S25ICO()","a9c5c9df":"aval(uint256,address)","a9c6a624":"updateNumber(int256)","a9c6c714":"unsoldAllocationOraclizeGasLimit()","a9c70eaa":"getUint(uint256)","a9c73e80":"setText(string,string)","a9c7648f":"distributeToken(address[],uint256)","a9c76999":"totalProfit(address)","a9c8733c":"correct()","a9c8dfcd":"AuctionCreated(uint256,uint256,uint256,uint256)","a9c95328":"renameList(address,string)","a9ca2072":"getAccountValue(uint16,uint8,uint8)","a9ca6057":"baseball()","a9cb2227":"getPlayerRoundTeamBought(uint256,uint256,uint256)","a9cbd0a5":"percentageToEthertoteDevelopmentWallet()","a9cc077a":"TOKEN_PRICE_DENOM()","a9cc4718":"fail()","a9ccc3af":"isEtherSpaceUpgrade()","a9cd2be6":"createSlot(uint256,uint256)","a9cd9e06":"secureWithdraw(uint256,address)","a9cdf643":"TEAM_MEMBER_VAL()","a9cf037a":"EEYcoin(address)","a9d04bd8":"getStakingRequirementTime(address,uint256)","a9d05989":"ETFW()","a9d07519":"TokensCappedCrowdsale(uint256)","a9d0b164":"priceOfEthOnUSD()","a9d0ddc7":"addContractWithInfo(string,string)","a9d0fd87":"_updatePurchasingState(uint256,uint256,uint256,bool,address)","a9d2293d":"lastClaimBlock()","a9d23ace":"getBundleExpiredTimeOfEmail(string,uint8)","a9d2d87c":"Manual_Mint(address,uint256)","a9d3da74":"SimpleAuction()","a9d40b77":"buyOffspring(address,string,uint256,uint256,uint256)","a9d424e2":"buy(address,address,uint256,uint256)","a9d48032":"maxSpendToken()","a9d49f62":"searchInsertionPoint(uint256,uint256)","a9d4d6bc":"lastBlock_f1()","a9d5e255":"GACToken(uint256,uint256)","a9d66127":"cancelPawn(uint256,address,bool)","a9d66352":"minimum_deposit_amount()","a9d72f82":"alterFeaturePetitionFee(uint256)","a9d74013":"claimedToday()","a9d82f18":"realDEXToken()","a9d85266":"setValue(bytes32,bytes32,uint256)","a9d9f572":"Println(address,uint32,uint256,uint256,uint256,bool,uint32)","a9d9f644":"viewLockUpStatus(address)","a9da0fad":"setOutcome(uint8,uint8)","a9da1417":"DEXHIGH(address,address,address,uint256,uint256,uint256)","a9dab167":"extendLock(bytes32,uint256)","a9db06e5":"perAmountRaised()","a9db9ce6":"getOraclizeGasPrice()","a9dbaf25":"length(bytes32)","a9dbe76f":"confirmSeller(uint256,uint256)","a9dc1d54":"singularDTVCrowdfunding()","a9dc491d":"getResolver()","a9dd1225":"random(uint256,uint256)","a9dd6895":"acceptTransaction(uint256)","a9dda4df":"setAuctionAddress(address,address)","a9de5045":"acceptAction(bytes32)","a9de581b":"auctionWinnerMessageHash()","a9df1aa2":"WithdrawalNormal(address,uint256)","a9e044ae":"SetProjectTag(string)","a9e10bf2":"recieve()","a9e2bcfe":"oneRoll()","a9e2e084":"_createPoo(string,address,uint256)","a9e30f96":"TokenPK(uint256,string,uint8,string)","a9e3fd27":"contentHostPrice(bytes32)","a9e406d5":"_setProviderSupply(uint256,uint256,uint256)","a9e4d6ce":"UpdateTokenRate(address,address,uint256)","a9e5714b":"AgriChain()","a9e732bb":"cashout(uint256)","a9e79359":"payoutForTimeline(uint256,uint256)","a9e7c2e5":"claimToken(uint256)","a9e7cb10":"Mediation(address)","a9e7f730":"FreyrCoin()","a9e899ef":"challengeFeeMultiplier()","a9e8a6bb":"prolongBonusPreIco(uint256)","a9e8f2f0":"get_refund_vocean_addr_amount(uint256)","a9e931ab":"addRec4L8R(address,uint256)","a9e94aa2":"Sponsor()","a9e966b7":"setState(uint256)","a9ea1896":"priceT1()","a9ea4aaa":"EntryToken()","a9ea6454":"basicThreshold()","a9ea96f0":"setDevelopersTokensPercent(uint256)","a9ea9d17":"PURCHASES_BONUS()","a9ead91c":"addressToAsciiString(address)","a9ebeb25":"nextReferrerId_()","a9ec77d3":"PublicSale(address,address,address,address,uint256,uint256,uint256)","a9ed003d":"sister()","a9ed9cb8":"disallow(address)","a9eeaeee":"getSanSlots(address)","a9eed530":"reduceOrderQty(uint256,uint256)","a9f00221":"resetTokenOfAddress(address)","a9f036dc":"accCompany()","a9f0a590":"transferAdministratorship(address)","a9f12d8a":"RaliusToken()","a9f16529":"thisVotersChoice()","a9f2db37":"unlockTokens(address,address)","a9f5de42":"crowdsalePhase()","a9f69edb":"checkRole(uint256,address,uint256)","a9f6def0":"HonestDice()","a9f73dd2":"_getRarity(string,uint8,uint8)","a9f79f7d":"FXT(address)","a9f7c131":"updateDateOfPurchase(address,uint256)","a9f7d03b":"admin_typeOf(address)","a9f7e664":"transferTokens(address,uint256,uint256)","a9f7f7e5":"o_algoritmo(uint256)","a9f844a8":"PlayerBalance(address,uint256,uint256)","a9f8792e":"votingProxyContract()","a9f8ec6c":"AlarmClockTipFaucet()","a9f940c3":"addChain(string,string)","a9f951dc":"getNation(uint8)","a9f987b5":"UFOcoin()","a9f992b1":"BTC8000on420()","a9fab274":"burnAuditApproval()","a9fae422":"getParents(address)","a9fb11b3":"potAddup()","a9fb4385":"ContributeWithSender(bool,uint8,address)","a9fb8fe6":"getFeesByAsset(address)","a9fbc614":"lookupTicketHolder(uint256)","a9fc9501":"indexTheWorkcrew()","a9fcf76b":"setIntArray(bytes32,int256[])","a9fd1bd3":"TradeAffected(uint256,uint256)","a9fd3f42":"transferApprovedFunds()","a9fde745":"transferTrade(address,address,uint256)","a9feca22":"_emitOracleAdded(address)","a9ff2a5e":"transferTokensFromWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","aa01ac22":"gmAddress()","aa01ef7d":"finishVotingPublic(address,uint256)","aa02a90f":"majorityMargin()","aa03214c":"calcBonusPercent()","aa0372e7":"getItem(bytes32)","aa03dfaa":"createChannel(bytes32,address,uint256)","aa0465b8":"setPriceData(uint256,uint16,uint256,uint8)","aa049691":"changeAccount(address)","aa04e566":"getWhoPiad(address,address,address,address,address,address,address,uint256)","aa052bd1":"startPreSaleStage()","aa056d2a":"cloneWithPopAndBottle(uint256,uint256)","aa058a73":"right6(uint256)","aa05b852":"s34(bytes1)","aa065074":"StageVestingToken()","aa071061":"LogAccountModified(address,address,bytes32,bytes32,bytes32,bytes32)","aa077992":"getProductEarning(uint32)","aa08523d":"lockedCustomer(address)","aa08c9e6":"getCoverImageCount(address)","aa08dfd3":"setFeeParams(uint256,uint256,uint256,uint256,bytes)","aa09bab8":"usedTotalSupply()","aa0bf9ba":"calculateRawPoolAmount(uint256)","aa0cd6eb":"_distributePoolReward(uint256,address,uint256)","aa0cfcbf":"buynums(uint256)","aa0d30f3":"deduct_fees()","aa0d9fb5":"_aremoveByValue(address)","aa0e38b4":"Mobilink()","aa0f0d4a":"Team(bytes32,bytes32,address,bytes32)","aa10ce22":"addExchange(address)","aa10e8c2":"CreateAPool(string,string)","aa1199ea":"setApprove(bool)","aa121bbe":"ABIChanged(bytes32,uint256)","aa125d08":"timeWaitUnlock(address)","aa127ae3":"test_9_checkDestructionOverflow_shouldThrow()","aa13ca76":"getTokenPrices()","aa13e8c2":"waitingTime()","aa141ee2":"spartans()","aa14c39a":"submissionDeposit()","aa14fa5a":"ICObonus()","aa156645":"isWorker(address)","aa1589a9":"approveLeave(address,uint256,string,uint256,bytes32)","aa1614eb":"ethRetrieve()","aa17973c":"createRandomAtom()","aa17e768":"getParentI(uint256)","aa183877":"getMonkey()","aa188b29":"SandBoxERC20()","aa18c05c":"TRANSFER(address,address)","aa18f76a":"getAllowedAmount(address)","aa1953cc":"canAccess()","aa19ed77":"freezeTransfersUntil(uint256,string)","aa1b510e":"cheat()","aa1ba6a9":"totalWin()","aa1c31a3":"BatCave()","aa1cdce8":"allot(uint256)","aa1cf1cd":"dumpFreeTokens(address)","aa1cf23e":"_isIdle(address,uint256)","aa1d807f":"ESCBDevMultisig()","aa1d98af":"personIndexToOwner(uint256)","aa1e47ae":"MyCoin()","aa1e84de":"hash(bytes)","aa1f609f":"ETHER_MIN_CONTRIB_PRIVATE()","aa202aca":"testBytes32Len()","aa20e1e4":"updateMasterMinter(address)","aa216998":"INITIAL_SAPLLY()","aa2262a8":"prevCourse()","aa226780":"trade(address[11],uint256[11],uint8[2],bytes32[2],bytes32[2])","aa228cda":"reduceMul_()","aa22b56b":"getDAOById(bytes32)","aa235449":"SpencerToken()","aa237e21":"set(bool,uint256)","aa238110":"getCurrentPrice(uint16)","aa23cb19":"transferFromIndexed(address,address,uint256)","aa23e03d":"getIdentifier()","aa24da73":"MultiToken()","aa24e8aa":"numberOfAlternatives()","aa2529a2":"RefundChequeById(string)","aa2580c1":"startPreSaleRound()","aa258b2e":"TitlePurchased(address,uint256)","aa25c744":"getDenominationByName(bytes8)","aa25f57e":"setPartnerETHRewardsPercent(uint256)","aa271e1a":"isMinter(address)","aa272d4b":"getNodeIndexId(bytes)","aa2796fd":"payoutForMining(address,uint256)","aa27cdf2":"deleteSharedAccount(bytes32,bytes32,uint256)","aa283e76":"setMintPrice(uint256,int256)","aa284a4a":"ProofPublicVote(address)","aa289b15":"deleteOutStreamOf(address)","aa28b89f":"preICOStage()","aa29787e":"bonus15end()","aa2a006d":"OrderCancelled(uint256,uint256)","aa2a1c47":"getTotalCollectedFrom(uint64,address,address)","aa2b5d7d":"getMiningWarPlayerData(address)","aa2bebb7":"getFeeWindowByTimestamp(uint256)","aa2d5c05":"FillOrder(uint256,address,uint256)","aa2de6c3":"minimumPurchase()","aa2df88b":"_isTransferAllowed(address,address,uint256)","aa2e7ea0":"createSwap(bytes20,address,uint256,address)","aa2efbad":"nominsReceivedForEther(uint256)","aa2f7494":"createMobster(string,uint256,uint256)","aa2f892d":"requestRedeem(uint256)","aa2fc145":"numStageRecalc(uint256)","aa2fddc7":"transfer(string,address,uint256)","aa3022d0":"settotal(uint256)","aa306d79":"voteForCandidate_(uint256,address)","aa30abf1":"crowdsaleBurnAddress()","aa30b7e3":"hasEnoughValidSignatures(bytes,uint8[],bytes32[],bytes32[],address[],uint256)","aa31aee8":"getLockTime(address)","aa31e4a0":"setSelfHybridizationPrice(uint256)","aa33171f":"newPromotion(string,string,string,uint256,uint256,uint256,uint256)","aa332032":"NewRound(string,bytes32)","aa33ab1b":"getVoted(uint256)","aa3435c0":"setTokenInformation(string,string,uint8)","aa351cf5":"triggerShutdown(uint256)","aa352ca4":"withdrawOffer()","aa3633f3":"CreationFailedEvent(address,uint256,string)","aa366290":"forfeit(uint8)","aa367664":"fundingMaximumTargetInWei()","aa368c19":"createScore(string,string,uint256,uint256,uint256,uint256,string,string,string,string,string)","aa36aae8":"prolongCrowdsale()","aa36b52e":"_updateNeeded(uint256,uint256,uint256)","aa3744bd":"recipient1()","aa3801d8":"getTokenAddress(bytes)","aa391317":"returnUnsoldSafeMedium()","aa3ad4e4":"validate(address,address,uint256)","aa3aef50":"purchaseTicket(uint16,uint16[])","aa3ba179":"widthraw()","aa3dacac":"sideBetPercent_MAX()","aa3eb769":"sendPTokenFrom(address,uint256,address)","aa3ec0a9":"cid()","aa3ef248":"postFact(bytes16,address,string)","aa3f5087":"AuctusPreSaleDistribution()","aa404876":"RedBlueToken2()","aa41d605":"_estimateWeight(uint256,uint256,uint256,uint256,uint256)","aa421944":"setMaxVeriAmount(uint32)","aa430e64":"setTotalPhases(uint256)","aa4537b2":"referredBonusRate()","aa454e9c":"setBuyer(uint256)","aa45b11e":"setReferralAddressShare(uint256)","aa462a5a":"whenGameDies()","aa4859fd":"newBookingfc(uint256,address,uint256,uint256,uint256)","aa487f49":"PRESALE_PERCENTAGE_1()","aa4925d7":"subscribe(uint256,uint256,address)","aa497b9d":"scheduleCall(address,uint256,bytes,uint256,uint256,uint8)","aa4abe7f":"setMaxRate(uint256)","aa4ac835":"exportTankResetEarning(uint32)","aa4b4d0b":"test_v0()","aa4b62f3":"initData(address,uint256)","aa4b980e":"phase_1_bonus()","aa4bdd3b":"realEtherCapHash()","aa4cb547":"setMultihash(bytes32,bytes)","aa4cc01f":"checkIfCancelled(bytes32)","aa4cd810":"addMeterPoint(address,int256)","aa4ce2c6":"blockDotBlockHash(uint256)","aa4d4213":"getOldAllowance(address,address)","aa4d490b":"registerNameXaddrFromDapp(address,bytes32,address,bool)","aa4eaa72":"addToPreSaleWhitelist(address,address)","aa4ee730":"LastRiskPrice()","aa4f6012":"addSupply(address,uint256)","aa4fc0a1":"Talius()","aa510c8c":"getLinkToPostId(string)","aa513c71":"updateInfluencer(string,address,uint256,address)","aa51793c":"isLosingBet(uint256)","aa525c55":"removeMilestone(uint8)","aa52a251":"transferSnowflakeBalanceFrom(string,string,uint256)","aa52fbd4":"period2Denominator()","aa534161":"releasedTeamTokens()","aa53d504":"Bounty()","aa53d7d4":"gettotalReceivedTicket()","aa541c9f":"unfroze_contract()","aa54abb1":"setLSEscrowContractAddress(address)","aa54ad35":"tokenSaleAddr()","aa54e040":"change_rate(uint256)","aa5581ef":"weiMaximumLimit()","aa5583d7":"Connections()","aa55a1a2":"giveAdditionalTokens(address,uint256)","aa55b55f":"getCardTypeInfo(uint256)","aa56c8e7":"isCrowdsaleFinished()","aa585d56":"setPrice(uint256,uint256,uint256)","aa58d4df":"calculateWinnerGameType2(uint256,uint256)","aa590140":"length(int8)","aa59770f":"sendCreatorByOwner(address,uint256)","aa59b024":"CROSAIR_SHIP_LIMIT()","aa59fb7d":"ChemistryCore()","aa5a11c5":"removeTellerModerator(address)","aa5a20e5":"setUpgradeAgent(address,uint32)","aa5b7df8":"marketingTokensWallet()","aa5b95d1":"deathFactor_i()","aa5c02a3":"LETX()","aa5c3ab4":"rewardBalance()","aa5c88ca":"setFreezePercent(uint8)","aa5d4719":"getTransferable(bytes20)","aa5d6d5f":"dropWallet()","aa5dcecc":"allocator()","aa5dd215":"doAirDrop(address[],address,uint256[])","aa5df9e2":"ownersArr(uint256)","aa5e2500":"clearProposalNames()","aa5ebd7f":"removeAddressFromWhitelist(address,address)","aa60145b":"cancelPledge(address)","aa601a71":"setAllowChangePrice(bool)","aa601e86":"SimpleMultiSigWallet(address[],uint256)","aa613b29":"authenticate(string)","aa613faf":"U42Token()","aa616da1":"addSkillNames(address,bytes32[],address)","aa617f25":"getAdUrl(uint256)","aa61924a":"CREATE_VERSION_ROLE()","aa61fc58":"getAirdropList(address)","aa620192":"today(uint256)","aa6217eb":"getMaximumContributionPossible()","aa628c31":"timelock(address,uint256)","aa63dea4":"dateMainStart()","aa646ebb":"_mint(address,uint256,uint128)","aa647673":"getKingPoints()","aa64c43b":"transferPool(address,address,uint256)","aa64f3c6":"addWhiteListed(address[])","aa656a3a":"updateGameMoney(uint256,uint256,uint256,uint256)","aa657658":"setMigrationGate(address)","aa657815":"takeoffer(uint256,uint256)","aa65a6c0":"getTokenWithId(uint256)","aa65c1f1":"WinningOutcomeDeclared(uint8)","aa66797b":"RESERVE_SUPPLY()","aa677354":"register(address,address)","aa67bc04":"eraByName(bytes32)","aa67c919":"depositFor(address)","aa682682":"startBuyTime()","aa68894b":"ownerWithdrawAccount(address)","aa692151":"fbytes32(bytes32)","aa6aca58":"setDelegadoDeEscuelaVerify(bytes32,bytes32,uint8,uint8)","aa6b5d9f":"ElyToken(address,bool)","aa6b631a":"getSetting(string)","aa6be303":"debtors(address)","aa6bf687":"calculateBonus(bytes32,uint256)","aa6ca808":"getTokens()","aa6d5dce":"_withdrawAllFunds()","aa6d7de4":"Hash()","aa6e4858":"VoteAdvertisement(uint256,address)","aa6e6539":"chkUserDetails(address,address)","aa6ebdcb":"numberOfDAppNodePackages()","aa6f5bb6":"setCreateDigitalArtFee(uint128)","aa727e46":"MAX_PUBLIC_FUNDING_SUPPLY()","aa72f217":"bountyMktWallet()","aa72f725":"listAssetDocuments(bytes32,uint256,bool)","aa735dd6":"ZBAStandardToken(uint256,string,uint8,string)","aa736f57":"transferLocker(address)","aa743c85":"sixMatchPayoutInPercent()","aa74c9fc":"addressToURI(address)","aa74fad8":"buyNewInfra(uint256)","aa7517e1":"minimumBond()","aa7618d5":"increaseApprovalPreSigned(address,uint256,uint256,uint256,uint8,bytes)","aa7622c7":"finalizeSecondStage()","aa7629ab":"withdrawDRPS(uint256)","aa76994d":"numOverthrows()","aa772fa0":"WinningEvent(address[],address,uint256)","aa775278":"deallocateBalance(address)","aa77f26c":"vestedAmount(address,address)","aa78a883":"BDP()","aa79376e":"updatePlayersCookie(address)","aa799fdc":"ZeroxDinar()","aa79bc02":"maxTrophies()","aa7a7744":"isRegisteredPair(address,address)","aa7abc8d":"sellWonder(uint256,uint256)","aa7b6c59":"wirteData(string)","aa7bc1c0":"createTokenFunctions()","aa7be9a7":"watchVideoA(address)","aa7ca464":"didReveal(address,uint256)","aa7dcd84":"testUpdateAuthorityEvent()","aa7ebf43":"level_1_percent()","aa7f6a3f":"AirdropList(address[],uint256[])","aa7f6a61":"newPurchase(address,uint8,uint8,uint32)","aa804a80":"jdouble(uint256,uint256,uint256)","aa80eec8":"testCheckRokBounty()","aa8116be":"fundedPrincipal()","aa81f862":"numDepositsSigned(bytes32)","aa833a25":"TheTokenC()","aa848ee2":"setPrivateList(address)","aa84d4b1":"whitelistOff()","aa84edb8":"MYDLToken()","aa85048a":"TotalCrowdsaleSupply()","aa8596ea":"setGalleryFivePrice(uint256)","aa863759":"addtoTechOperation(address,address,uint256,uint256)","aa864e49":"remainingPoolOptions()","aa8675d1":"singleIDXMQty()","aa86fbc5":"HETCCStandardToken(uint256,string,uint8,string)","aa8713dd":"secondWeek()","aa877470":"isInsurance(address)","aa879119":"allowApprovee(address,bool)","aa87af1e":"voirMessage()","aa88bb5b":"resolveDispute(uint16,address,address,uint8)","aa89376a":"Example2(string)","aa8a0002":"raiseLimit()","aa8b20f6":"getAvatar()","aa8b76ea":"reclaimDividend(uint256)","aa8b99d2":"length(uint256)","aa8c217c":"amount()","aa8c5324":"prolongate()","aa8d11e3":"ThirdPartyVoter()","aa8d715d":"itemBalance(address)","aa8dd5a1":"GRForGas()","aa8dde58":"Repost(bytes32,bytes32,uint256)","aa8dea8c":"fipsAddToLedger(bytes20,address,bytes)","aa8e8fb0":"LTKN()","aa8f0269":"ScicoinsICO()","aa8f027b":"isEmoji()","aa8f365c":"test_invalidProposalValue()","aa8f44ec":"isSaleAddr(address)","aa91cc61":"rodToken()","aa91d5c5":"HappyEnding()","aa9224cd":"withdraw(uint32)","aa9246ef":"_parseIntScientific(string,uint256)","aa93038b":"reward_total()","aa931697":"minNac()","aa93334d":"currentPeriodStartBlock()","aa9449f2":"Test(address)","aa9454b5":"transferAndBuy(address,uint256,uint256,uint256)","aa954845":"isConfirmed(bytes)","aa9669c1":"roll(uint256,bytes)","aa974eff":"multitokens(uint256)","aa985a63":"distributeWei(uint256,uint256)","aa98a41a":"setGenesisAddressArray(address[],address)","aa98d57b":"calcCollectedFee(uint256)","aa99474f":"authorized_changeOwnership(address,address,uint256)","aa994ab8":"transferGIM(address,address,uint256)","aa999b4c":"mixDna(uint256,uint256,uint256)","aa99ebb6":"CheckTimestampsDuringOneDay(address)","aa99f4d0":"teamTwoId()","aa9a0912":"mulDiv(uint256,uint256,uint256)","aa9a2cf0":"host_percentage()","aa9a79f2":"SubBankerPrincipal(uint8,uint256)","aa9ad331":"NEON()","aa9b5ba8":"getPaidDIVDSchedule()","aa9cdaf4":"coinAge(address)","aa9e40e0":"confirmDebt(uint256)","aa9f3666":"ClassicToken(string,string,uint8,uint256)","aa9f37f0":"purchaseContract()","aa9f5477":"Nursicoin()","aa9fa274":"addExtraReceiver(uint256,address)","aaa006b2":"countPlayer()","aaa04812":"presaleEthAmountsProcessed()","aaa05e20":"cityTransferResources(uint256,uint256,uint256,uint256)","aaa08e9b":"testBonus()","aaa0f5cc":"userAlreadyBoughtEth(address)","aaa24d31":"deathData_f7()","aaa2b78f":"allowedWithdraw()","aaa2b8c8":"rootAddress()","aaa2fe13":"getMin(uint8[])","aaa3de26":"getUsersInfo()","aaa40bc7":"TUXToken()","aaa44e5c":"getAllIds()","aaa51ec6":"setStoreAddress(address,address)","aaa5a02a":"claimTimeout(bytes32)","aaa5ad61":"getTokensAvailable()","aaa668aa":"getUserTenantId(address)","aaa6bc40":"removeWhitelistedUserAddr(address)","aaa7062b":"posShare()","aaa71e45":"mininglock()","aaa7744b":"_subjectToFees(address,uint256)","aaa77f55":"wuxiaMaster()","aaa99809":"FlatPricingExt(uint256,bool)","aaaa3218":"EmpireCrowdsale(uint256,uint256,address,address,uint256,uint256,uint256)","aaab3025":"replaceAbility(uint256,string,bool,uint8,uint8,uint8,uint256,uint256)","aaab51c9":"close(uint256,bytes,uint256,uint8[],bytes32[],bytes32[])","aaabdf16":"reputationIRNNodeShare()","aaac205b":"ZeenCoin()","aaac50bd":"transferDisable(bytes32)","aaac8040":"referralAmount(uint256,bool)","aaac9718":"package()","aaad0c84":"isExisted(address)","aaadc832":"isRedeeming()","aaae05b2":"approvePreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)","aaae7799":"insertUser(uint256,bytes32)","aaaea138":"testFailBurnWhenStopped()","aaaf8a52":"approvePrimordialToken(address,uint256)","aaaf9595":"_generateTokens(address,uint256)","aab0395b":"LandToken()","aab065e8":"LifChannels(address,uint256)","aab14d04":"orderState(bytes32)","aab27ad1":"depositaCaucao()","aab324ae":"transferAnyERC20Token(address,uint256,address)","aab32cfa":"VerifierRegistry(address,uint256)","aab402e5":"toggleSale(bool)","aab40661":"_fishAquarium(uint256)","aab52c33":"initGameTeam(uint8)","aab60ebc":"totalLockedRewardsOf(address)","aab633dc":"private_setmaxRoll(uint256)","aab6606e":"BalanceEth()","aab725b3":"icoTokensSold()","aab75253":"StaffPicks()","aab78bf5":"compensateLatestMonarch(uint256,uint256)","aab8f6e0":"airdropBy0Eth()","aab99609":"ApaAjaToken()","aab9f165":"processPayment(uint256,uint32,uint32,uint256)","aaba2fb8":"UnicornRanch()","aaba3e3b":"getSymbol(string)","aabb3d61":"MainBridge(uint256,address[],uint256,uint256,uint256)","aabbb8ca":"getInterfaceImplementer(address,bytes32)","aabbd0ce":"approveNewShorter(address)","aabd3904":"isCreating(uint256)","aabd46e3":"getMintRequestStringMap(uint256,int256,string)","aabd5b88":"_sold()","aabd971e":"presaleTransfersPaused()","aabda436":"fund_()","aabdf682":"FINTRUX_RESERVE()","aabe00c4":"verifyPreSupport(uint256)","aabe2fe3":"currentWinner()","aabe7dc4":"unlockRewardToken(address)","aabecb89":"setRate10(uint256)","aabf05cf":"set_presale_iconiq_arbits_per_ether(address,uint256)","aabf382b":"upgradeLevel(uint8)","aabf901a":"Distributor(uint256,address)","aac0d9c2":"CompanyReserve(address,uint256)","aac0e4c5":"getPendingSignatureStatus(address)","aac1335c":"tgeSettingsMaxStages()","aac1b0b7":"safeExchange(address,address,uint256)","aac1c80b":"getCompte_12()","aac24374":"setBoxPrice(uint256,uint256,uint256)","aac2c717":"buyXaddrWithInviteCode(address,uint256)","aac3e314":"setPrevOracle(address)","aac4e3a8":"whiteListingAdmin()","aac57b3a":"newAPM(bytes32,bytes32,address)","aac5ab61":"Crowdsale(address)","aac5ce9a":"Stakeholder()","aac67b05":"changeFactoryUsageFee(uint256)","aac6ba41":"setModel(address[],uint256[])","aac746ee":"getNameFromAddress(address)","aac74c92":"getPI_edit_30()","aac756b8":"setxiudao(address,uint256,bool)","aac80472":"getManagerAddress(uint256)","aac81654":"isNoEmptyTranches()","aac8788a":"setIncrementOpenInterest(bool)","aac878eb":"approveTransaction(uint256,bytes)","aacaa602":"getCurrentAmountBonusRate(uint256)","aacb15e6":"_validate(uint256,uint256,uint256,uint256)","aacb4442":"repaintVoxel(uint8,uint8,uint8,uint8)","aacbe4b3":"set_maxUETsPerReturnLessThan(uint256)","aacc3a16":"printAddress(address[3],address)","aacc5a17":"getRandom()","aacd572f":"private_setMinRollUnder(uint256)","aacd5a85":"orderTrade(uint256,uint256,uint256)","aacd9794":"setUniqueSpinnerPrice(uint256)","aacdb27b":"setPixel(uint32,uint32,uint8)","aacec70b":"createCrySolObject(string,uint256,uint16,uint16,uint8,uint8)","aacf3f2e":"contributionInCauldronRound(uint8,address,uint32)","aacf5328":"setVideoID(string,uint256)","aacfd352":"blockBeforeEncounter(uint256)","aacffccf":"getAccountOwner(bytes32)","aad00089":"tokenIssue(uint256)","aad0bb90":"TEMath(uint256,uint256,bool)","aad12029":"freezeAccounts(address[])","aad13b15":"fight(address,string)","aad2b723":"changeSigner(address)","aad3ec96":"claim(address,uint256)","aad41a41":"multisend(address[],uint256[])","aad429f1":"_buyCommonTTW(uint256,uint256,address,address)","aad52373":"ValidateAndStore(bytes,bytes)","aad55726":"getContract(address,uint256)","aad5632a":"generateNext()","aad62da2":"left89(uint256)","aad71040":"changeUnlockTime(uint256,uint256)","aad7152b":"updateTokenTransferAddress(address)","aad83ab3":"SpinTestToken()","aad85f7c":"setAchievedDate(uint256,uint64,uint64)","aad935af":"updateSellPossible(bool)","aad99ef1":"setPriceIncreaseScale(uint256)","aad9afee":"kingsMessage()","aada1cb3":"activateUniqueSpinners()","aada4b06":"saleIssue(address,uint256)","aadad773":"removeServer(uint256)","aadba3dc":"finishWhen()","aadbc52d":"addContractMember(address,bytes32,address)","aadbc5a0":"getMatches(uint256,address,uint256)","aadc0a9d":"sneakUpOn()","aadc1ac1":"approveLoan(uint256)","aadc3b72":"hasVoted(bytes32,address)","aadc8f23":"RogueProtocol(address)","aadd1b03":"donateEth()","aade1323":"_processUpdateFee(address[16],uint256)","aade53fe":"_removeCardSetAtIndex(uint256,uint256)","aade84ae":"TopIvy()","aade8dcc":"discountTokenPercent()","aade9bb4":"icoReturnBonus(uint256)","aadf017e":"_processReserve(address,uint256,address)","aadf1e73":"selectWinner30()","aadf6838":"getOldSchoolCoins()","aae07890":"setUnit(uint256)","aae07cd0":"getTokenLayers(uint256)","aae0ff1e":"incLuckyCoin(address,uint256)","aae1f5c3":"processDonate(address)","aae233b4":"cleanUpPreviousRound()","aae3d025":"transferClose()","aae3d031":"enableKYC()","aae40ddc":"getCurrentClaimerForTile(uint16)","aae4cbe4":"EcoToken()","aae62507":"getUnavailableValueT(bytes32)","aae755af":"m_currentUsdAccepted()","aae764c1":"assertFalse(bool,bytes32)","aae8312e":"getStakeholderTransactionCount(bool,bool)","aae8e1b3":"withdrawFlag(address,uint256,uint256)","aae99c66":"whitelistAddress(address[],bool)","aae9a4c7":"singleInvestorCap()","aae9d7ed":"__callback(bytes32,uint256)","aaea144d":"setPackage(bytes1[42])","aaea396c":"verifiedlist(address)","aaea4472":"LifeFactor_ii()","aaea44c4":"strConcat(bytes,string,bytes)","aaea53f3":"Channel(address,uint256)","aaeaa36c":"isBatchSupported()","aaead0f0":"initializeIndividualCapsFundraiser(uint256,uint256)","aaeb3255":"getInsuranceIDsByClient(address)","aaec0c03":"FireflyRegistrar(address,bytes32,address)","aaec2fa5":"getGirlsAuctionPrice(uint256)","aaecc9cf":"checkGameOver()","aaed2c3d":"getRewardRate(address,address)","aaed31c7":"createCoins(address)","aaed3c7d":"tokenBuyersAmount()","aaee686e":"confirmTransactionFee(uint256)","aaeea585":"DMToken()","aaef36b5":"CorvinusCoin()","aaf04471":"transferAndCallDelegated(address,address,uint256,bytes,uint256,uint256,uint256,bytes)","aaf05f3d":"f3()","aaf10f42":"getImplementation()","aaf13d10":"Wallet3()","aaf20486":"ProofOfLongHodl()","aaf3e4f4":"left88(uint256)","aaf47835":"acceptBuyOffer(uint32,uint256)","aaf49910":"sanMinLength()","aaf4f1ed":"setMinDailyPerUser(uint256)","aaf517f5":"GetRoundIndex(uint8)","aaf592bf":"receiveApproval(uint256[])","aaf5eb68":"PRECISION()","aaf73ef7":"registeredDeals()","aaf7e700":"setResetvalue(uint256)","aaf809f8":"_isUnique(uint256[],uint256)","aaf885f8":"getRazInstanceInformation(uint256,uint256)","aaf9419d":"latestNewRockForSale()","aaf9d13e":"buyTopDog(uint256,uint256)","aafa4827":"KOIOSTokenSale(address,uint256,uint256,uint256,uint256,address)","aafab1e8":"paymentsCount()","aafafbf3":"multiSendEth(address[])","aafb088e":"stageDuration()","aafba184":"removeShareholderListing(uint256)","aafbb120":"getSaleInfo(address)","aafbd3da":"create(bytes32,address,bytes32,bytes32,address,bytes32)","aafbe1c0":"NectarController(address,address)","aafd775e":"getLockedBalanceForUser(address,address)","aaff096d":"updateDarknodeRegistry(address)","aaff2a83":"totalRemainingTokensForSales()","aaffadf3":"minContribution()","aaffc4b6":"currentRoundCount()","ab004a97":"traded_token_seed_amount()","ab021884":"setMinimumPriceFusion(uint256)","ab022b28":"resetAirdropAmount()","ab02f27c":"Europium()","ab03cf46":"sendFunds(uint256,address,bytes)","ab03d0e8":"changeUnitsUserCanBuyLimitEth(uint256)","ab040107":"decline()","ab044622":"syndicateTokensWithdrawn()","ab045871":"Indemnisation_2()","ab051767":"userlogout(address)","ab05a69a":"InbotProxy(address,address,address,address)","ab05bfff":"setReleaseTime(uint256)","ab062643":"getNumTokensPurchased()","ab065d6c":"getProjectClient(bytes32)","ab067a5b":"periodSales()","ab06bea3":"reportContribution(address,uint256)","ab06da29":"setUTExchangeRate(uint256)","ab074225":"BLOOToken()","ab0783da":"mat()","ab07f054":"getLandPrice(int32,int32)","ab080aab":"SecondBiathlonToken(address,address,string,string,uint256,address)","ab08d048":"SPAYToken()","ab08f75b":"getMoneyline()","ab09ee80":"respond(uint256,uint256,uint256,uint256)","ab0a9865":"createGen0Dog(uint256)","ab0b29a5":"applySetMaxFeeTrade()","ab0bcc41":"saleStart()","ab0cba56":"ICO(uint256,uint256,uint256,uint256,address)","ab0cd5bc":"createMineForToken(uint256)","ab0ced0e":"checkContribution(address)","ab0cf8b7":"Wolf()","ab0d92dd":"totalPrice()","ab0da5a9":"reject(address)","ab0db220":"createBattle(uint256,uint256[],bytes32,uint256)","ab0e6765":"setEmployer(address,address,string)","ab0eda9e":"setAirdropAddress(address)","ab0facc0":"raiseLimit(uint256)","ab0fd373":"matchTimestamp(bytes32,bytes32)","ab0fe874":"purchaseCap()","ab108915":"createUser(address,bytes20,uint64)","ab1193fa":"PREMINE_ALLOCATION_ADDED(address,uint256)","ab11ebdd":"returnIcoTokens(address,uint256)","ab127a0c":"searchBestRate(address,address,uint256)","ab1377c0":"startSeedStage()","ab14a41f":"reentrancyHelper(address,bytes,uint256)","ab150226":"checkAdmin()","ab1547d2":"nextOpenRewardTime_()","ab15d70c":"updateFifthExhangeRate(uint256)","ab15f723":"pauseMints()","ab165623":"TalentEducationToken()","ab165831":"checkContractAddress(address)","ab16cef1":"addBigPromoBonus(uint256)","ab17176c":"VCCToken(uint256,string,string)","ab172cf5":"getCandidateByIndex(uint256)","ab179e9f":"currentReleaseCeiling()","ab17bad0":"setGasConsume(uint256)","ab18af27":"setDepositAddress(address)","ab18f6ac":"parseTimestampToYM(uint256)","ab19d396":"couponTokenCampaignAddr()","ab19fff9":"TokenFrank()","ab1a84da":"isCrowdfundCompleted()","ab1ac9f6":"BITSDToken()","ab1b1cb5":"getSubscriptionLastPaid()","ab1b3830":"EIForceCoin()","ab1b75f2":"burnUnpaidTokens()","ab1bef4e":"getDailyTickets(address)","ab1d3add":"assignDispute(string,address,string)","ab1d581b":"checkPet(uint64)","ab1e96e9":"migrationPeriod()","ab1ebb4d":"OneMillionToken()","ab1f7929":"setMigrationInfo(string)","ab207628":"getAffiliateAmount(uint256)","ab209e23":"Manifesto(uint256,uint256)","ab2191a2":"Satanshi()","ab21b055":"getTickets(string)","ab21d58a":"enableCharity()","ab225edc":"DepositFund()","ab22a640":"getVideoGameOwner(uint256)","ab22c561":"getVestingCliff(address,address)","ab231511":"lastWithdrawTime()","ab23c50d":"AirDropAFTK3SeptSandBox()","ab253ca6":"buyMinions(uint8)","ab2643a1":"commitCollateralToPool(address,uint256)","ab273016":"signProposal(uint256)","ab27be20":"mine(address,uint256)","ab27d755":"confirmOrder(bytes16)","ab2874cb":"buySlot(uint256)","ab28c704":"initialSupportAmount()","ab28e8af":"serviceTokensBurn(address,address)","ab2a4f8a":"transferRevenue(address,address,uint256)","ab2a5772":"setIcoHardCap(uint256)","ab2a6dc1":"dealsGetter(address,uint256)","ab2af349":"CallCancelled(bytes32)","ab2c8b16":"fundingLowcapReached()","ab2e5a1f":"play(uint256,uint256,uint256)","ab2ebcf1":"priceExpirationInterval()","ab2f0e51":"availableBalance()","ab32775c":"alreadyContains(uint256[],uint256,uint256)","ab331a34":"getProperty(string)","ab33cbcf":"inxCrowdsale()","ab34dc48":"monechainToken()","ab351270":"lottery(address,uint256)","ab3545e5":"getMember(uint256)","ab35678c":"trackCount()","ab3640c8":"processPayment(address,uint256,bytes32)","ab36e4a6":"milestonesCount()","ab37594b":"cancelOrderByMerchant(string)","ab383a6b":"getPropertyPrivateModeBecomePublic(uint16)","ab3860d0":"test_twoValidEqUint()","ab3a32c4":"refundAllExternalPurchase(address)","ab3a39c2":"scamSealTokenAddress()","ab3b87fe":"setOwner(address,uint256)","ab3bd81f":"changeTuneOption(uint32,uint32,uint256,bool,bool,uint128,bool,uint64,uint256)","ab3bfac4":"freezeBalance(address,uint256)","ab3c04d3":"BAKEToken()","ab3cdaf0":"PRE_ICO_BONUS_TIME_2()","ab3d2e74":"_clearApproval(uint256)","ab3d4e8b":"MembershipPurchase(address,uint256,uint256)","ab3dd698":"airdropDiff(uint256[],address[])","ab3e9c56":"ChangedInitialPrice(uint256)","ab3ed9f0":"DecisionToken()","ab3efa83":"tokenSafeLock(uint256,uint256,uint256,uint256)","ab3f22d5":"allocate(address,uint256,uint256)","ab3f699c":"getOrCreateNextFeeWindowWasCalled()","ab400d86":"updatePlayerEth(address,uint256,address)","ab40340a":"recordWithdraw(uint256,address,uint256)","ab40b01f":"getAddressAnswerKeccak256(uint256,address,address)","ab40b65a":"receiveapproval(address,uint256,address)","ab413a7e":"getScoreAndCount(address)","ab4215cc":"getDataOfGame()","ab430d49":"transferToken_toInvestBalance(address,uint256)","ab442c59":"getICOToken()","ab4459bc":"releaseBountyTokens()","ab447007":"setClaimDate(uint256)","ab45e2a0":"processPurchase(address)","ab464a4c":"launch_date()","ab464fa6":"transferMultiDiff(address[],uint256[])","ab46cc46":"add_attender(string[])","ab470f05":"getCaller()","ab473f48":"closeFunding(uint256)","ab47f1bf":"getFilledAmount(uint256)","ab4865ec":"boardTokensAddress()","ab486607":"getLeaderboardLength()","ab489f08":"toBytes(address[])","ab48f2f8":"PlayNow()","ab4955c2":"ReserveWalletUpdated(address,address)","ab4a2eb3":"getUnlockableTokens(address)","ab4b4def":"WITHDRAWAL_SCALE()","ab4bc414":"bitbgcToken()","ab4bf05e":"addSignature(string,int256,string)","ab4c4487":"getSystemSalePrices()","ab4d0ca9":"multiAdd(address[])","ab4e21c4":"OneBlocToken()","ab4e8ef1":"getAirdropTokens()","ab4ef895":"MB()","ab4f643c":"PublisherParametersChanged(address)","ab4fa078":"ListAllSince(uint256)","ab503e30":"SetminTokens(uint256)","ab50bc86":"PubRegistered(address)","ab50e7f2":"third_release(uint256)","ab5170b2":"getstr()","ab519020":"calcShare(uint256,uint256)","ab51937b":"startproduction()","ab519b0c":"prepare(uint256,address,address,uint256,bytes)","ab51b06f":"preSaleBonus()","ab531efd":"_encodeTokenId(uint256,uint256)","ab5366dd":"pendingOwner2()","ab54775d":"lookupSigName(address,address)","ab55979d":"changeStaker(address)","ab55d1cc":"getDAIBalance()","ab5690c4":"enableWithdrawals(address,address)","ab56c09e":"Placed(uint256,uint8,address)","ab5706ee":"setBaseSummonPrice(uint256)","ab5783c4":"StopGame(uint8)","ab582eb3":"kickOwner(address)","ab5841f2":"updateReserve(address,uint32,bool,uint256)","ab590032":"cleanAssetHolders()","ab5a7076":"RadiumToken(address)","ab5aa302":"_START_DATE()","ab5aea81":"Menu07(address)","ab5b4456":"use(uint256)","ab5db036":"refundICO(address)","ab5e28c5":"transfers()","ab5e5158":"setNewManager(address,address)","ab5ed150":"getOne()","ab5efded":"OmegaToken(address,address)","ab5f3380":"getVineyard(string,address,uint256)","ab5f6b91":"multiCreate(uint256,uint256,uint256)","ab5fa2c6":"setITO(address)","ab60443b":"changeInviteRate(uint256)","ab605eea":"fighterIndexToApproved(uint256)","ab60e4e5":"setWebGiftOnceMaxAmount(uint256)","ab60ffda":"exp()","ab61787a":"proofFailed(address,uint256,uint256)","ab619e5a":"StandardToken(string,string)","ab6231f1":"RefundedETH(address,uint256)","ab62438f":"submitImpeachmentProposal(string,address)","ab624cf1":"setPartyA(address)","ab630fc4":"kimsOnAuction()","ab635b48":"createTokenVestingContract(address)","ab643c07":"getAllBounties()","ab64611b":"BitmarkPaymentGateway(address)","ab651065":"setESCBCoin(address,address,address,uint256,uint256)","ab65c534":"SqueezeTheJuice()","ab65cda6":"getDial2Type(uint8)","ab65f20a":"mintCards(uint256[],address)","ab6680f3":"initAuction(uint256,uint256,uint256,uint256,uint256,address,bool)","ab67aa58":"transferFrom(address,address,uint256,bytes)","ab686d0a":"setFrontWindow(address)","ab6a5d95":"changeBoardAddress(address)","ab6a9f0e":"knockoutTeam(uint256,uint256)","ab6ad452":"unlockedBalance()","ab6ae424":"affWallet()","ab6b551e":"isSideBridgeContract()","ab6b7e22":"grantBounty(address,uint256)","ab6bfe78":"Hongshanchain(uint256,string,string)","ab6c291b":"getWiningType(uint256)","ab6c5f58":"removePlayer(uint256,uint8)","ab6cab71":"PoWH4DSupply()","ab6cb831":"UNIToken(uint256)","ab6cf42f":"isReservationFull()","ab6d8a9a":"gemFab()","ab6da028":"TOKEN_FOR_COMUNITY()","ab6db199":"dias()","ab6ddfa8":"holderBalance(address)","ab6def1c":"isShareToken()","ab6e1be4":"getTs()","ab6e4959":"depositsOfMember(address)","ab6e79ed":"getBaseToQuoteReturn(uint256)","ab6e9072":"admin_wallet()","ab6e988c":"playerVault(address)","ab6ef0b1":"purchaseLandWithCC(uint8,bytes32,uint256)","ab6f78f0":"SetRecord(address)","ab6f9e4a":"votesPerChoice(uint8)","ab700624":"toWidthString(string,uint256)","ab701ca3":"_upgradeabilityOwner()","ab702d48":"train2(uint256,uint256)","ab70bba7":"OtxToken()","ab70d0c5":"_getEndWeek(uint256,uint256)","ab70ee5c":"PoloneumToken()","ab71b8ac":"maxBountyTokens()","ab727094":"reinvestDivies()","ab731fd6":"ownerSetOverride(address,address,bool)","ab736b5d":"checkUniqueLockedTokenReceivers()","ab73e316":"next(address)","ab73f08e":"findOptionId(address)","ab74731d":"dividendPayment()","ab75a4a2":"angelWheelFinancing()","ab75e6c8":"DTXTestToken()","ab7748da":"Blocker_resume(bool)","ab779505":"NettingChannelContract(address,address,address,address,uint256)","ab77b178":"issueCoin(address,uint256)","ab7891f5":"deleteSiringWithId(uint256)","ab79fd26":"setBeginTimeTS(uint256)","ab7a162f":"getInterCryptoPrice()","ab7a9691":"isReleaseAgent(address)","ab7aa65d":"icoThresholdBonus2()","ab7af62f":"setAttackBoostMultipler(uint256)","ab7b347c":"BitcoinDominatorERC20Token()","ab7b47aa":"_generateInitialPattern()","ab7cb211":"allowBuy()","ab7ccc1c":"credit(uint256,uint256)","ab7df819":"Simscoin()","ab7e50ba":"GAX()","ab7e9dca":"getPrivilegedBalance(address)","ab7ebbce":"startPresale(address)","ab7ec692":"primoContratto()","ab7f8f12":"masicotestToken()","ab802509":"setMintAgent(address)","ab80c807":"RareCoin(address)","ab81e773":"left61(uint256)","ab82d9a0":"challenge(uint256)","ab831144":"parseUint(bytes32)","ab834bab":"atomicMatch_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes,uint8[2],bytes32[5])","ab840808":"migrateBasicData(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","ab8425d8":"set_amount(uint256)","ab84db68":"releaseArr()","ab850a85":"mintGold(uint256)","ab8530f8":"Mint(address,address,uint256)","ab8620dd":"getStageSoldTokens()","ab86ba3a":"bonus3()","ab86e0a6":"_setBalance(address,uint256)","ab87d816":"getPerson(uint32)","ab883d28":"multisendEther(address[],uint256[])","ab888539":"setIdentifier(address,bytes32)","ab889df9":"DoradoToken()","ab89641b":"getTlength50()","ab89d8c6":"WGWToken()","ab89f2c7":"getCurrentStageId()","ab89f870":"setMultiple(uint256)","ab8a0360":"Auth()","ab8a1595":"test_25_assertGasUsage1400Boards()","ab8a288b":"checkStoredFile(string)","ab8be231":"setMockedTime(uint256)","ab8ca6e9":"getBonusTier(uint8)","ab8d01b8":"transferFromToUpdateToken(address,address,uint256)","ab8d1daf":"payTokenOwner(address,uint256)","ab8d3dc1":"TokenPing(uint256)","ab8e0f6e":"Mmcchain(uint256,string,string)","ab8e5b01":"testGetLastTime()","ab8efb87":"UInt256(int256)","ab8f1957":"investedPeriods(uint256)","ab8f3c98":"validateBroadcasterSig(string,uint256,bytes32,bytes,address)","ab8feb02":"TKN()","ab90602c":"registerTicketsToUser(string,address,uint256)","ab90a8ac":"createSaleTokens()","ab90f855":"maxPromoToons()","ab911060":"assertOnlyFrom(uint256)","ab91154e":"ownerAddSanSlot(address,uint256)","ab91c7b0":"queueLength()","ab9213f3":"addAddressReferrals(address[],address[])","ab92670e":"Franc()","ab929fcd":"submitArticle(string,string,bool)","ab92f290":"addNewDividends(uint256)","ab948370":"KingToken()","ab948374":"gen0EndingPrice()","ab95b586":"getEventTimes()","ab9611f4":"setCancelableAt(uint256)","ab96cc4c":"receivedFunds()","ab96d498":"addPublicFundingWhiteList(address[])","ab96dd18":"earlyStageLasts()","ab97af6c":"initialCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address)","ab97d59d":"getTokenManager()","ab97e196":"revokeAmountVote(uint8)","ab98458e":"getUint80val()","ab989586":"WMCToken(uint256,string,string)","ab998660":"LockMechanismByOwner(address,uint256)","ab998939":"RequireDispose(address)","ab99deb8":"Expread()","ab99e48f":"requestMerge(uint256[])","ab9a5caa":"AEStoken()","ab9a78df":"priceOf(string)","ab9a81c3":"numOfBlocksInMinute()","ab9a913a":"generatedEve()","ab9ae1be":"isCrowdSaleStatePreSale()","ab9af166":"reduceCDFee(uint256)","ab9b8637":"medibitICO(address)","ab9c1758":"cancelMarginCallOnBehalfOfRecurse(address,address,bytes32)","ab9c20d0":"finalizationSuccessHook()","ab9cd37e":"withdraw(uint80)","ab9d8b8b":"circulatingTokens()","ab9d8e4b":"Thankfulness()","ab9dbd07":"getID()","ab9def41":"hardCapTokensAmount()","ab9fe3a1":"importBalances(address,address[])","aba00859":"decBalance(address,uint256)","aba01e5c":"impl_amountOfWorkpointQueue()","aba0e189":"checkGameStatus()","aba1017b":"despawnGladiatorAndAwardCoins(address)","aba133ea":"GVPE_Token()","aba13a2f":"_resetTiles()","aba16a02":"offerToChannels(uint256)","aba222ed":"nodeRegistrationEnabled()","aba23628":"mintPlayers(uint128[],uint256,uint256,uint256)","aba3d017":"windowAt(uint256)","aba46a93":"etapAddressesLimit()","aba47d1a":"getGrapesToBuildWinery()","aba61514":"priceT4()","aba683fa":"Etbccoin()","aba70319":"FreyrTokenLocker()","aba7ad0d":"lotteryFeeVal()","aba88037":"DARKNODE_FEES_NUMERATOR()","aba88766":"claimableHalvingsOf(address)","aba89198":"getCurrentCapacity()","aba8dfbd":"SecondBonus()","aba9650e":"createDepositContract(address)","abaa5f3e":"randomDS_getSessionPubKeyHash()","abaa9916":"allocate()","ababa4a7":"authorize()","ababb2dd":"_tryUnlockBalance(address)","ababe93d":"distributeBondFund()","ababf71b":"GetSummReward(uint256)","abacf5d7":"getBoardUpdateTime(uint256)","abad3466":"createtoken(string,string,uint256)","abadaf9a":"bonusAmount()","abadeb06":"teamPeriodsNumber()","abaed924":"executeOrders(address[],bool[],uint256[],uint256[],address[],address[],address[8][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])","abaf1de9":"setPublicPrice(uint256,uint256)","abaf5880":"Crowdsale(uint256,uint256,uint256,address)","abaf9457":"localRevenuePercent()","abafaa16":"emitIssue(bytes32,uint256,address)","abb00601":"addUnpausedWallet(address)","abb151c8":"CCICoin()","abb1a33a":"SetHotLists(string)","abb21618":"changeAirdropValue(uint256)","abb254de":"developer_withdraw_ETH()","abb2874f":"DezToken()","abb29f70":"TinyOracleDispatch()","abb2d04b":"editName(string)","abb4108e":"addRoles(uint8[])","abb41fab":"_reward_masternode()","abb43397":"getCanvasBitmap(uint32)","abb46619":"DSCToken(uint256,address)","abb4fe2d":"MiningRigRentalsToken()","abb524a4":"PapyrusSalePhase1(address,address)","abb58d20":"Registry(address,address,address,string)","abb58fd3":"createLink(bytes32)","abb689e1":"payRedemption(uint256)","abb69a1a":"getInvoicesByStatus(address,uint256,uint8)","abb70034":"getChosenNumbers(address,uint256,uint256)","abb721ce":"_deposit()","abb743c8":"setUint(int256,uint256)","abb8c965":"_setOwner(address,bool)","abb9e0bf":"coinIssuedAdvisor()","abb9eef4":"YUNXIN2Token(uint256,string,uint8,string)","abba87c1":"_prestige()","abbadf55":"oobiqoo(address)","abbb4695":"setNotifier(address)","abbbf451":"getRound0MinDuration()","abbc54b0":"changePriceUpdateWaitingTime(uint256)","abbc5d2a":"levToll()","abbc8afa":"teamPoolForFrozenTokens()","abbcb24b":"LEGAL_EXPENSES_ADDR_2()","abbdc272":"checkGameStart()","abbe3056":"stage2Deadline()","abbef24e":"buyDaiWithEth(uint256)","abbf7228":"changeBlocks(uint256,uint256)","abbf94f8":"PlatoniusToken()","abbff658":"Ownable3()","abc1c9fe":"requestForRefund(uint256)","abc21702":"getPI_edit_25()","abc2a40a":"minInvestBTC()","abc2ab75":"FinalizeDispute(address)","abc33778":"Result(bytes32,address,uint256,bool)","abc38cf2":"submitNewClip()","abc3bc92":"getReferrerBalance(address)","abc40f41":"batchWrite(uint256,uint256,string)","abc4558e":"_requireRenewableProduct(uint256)","abc45ddc":"BANKOIN()","abc48a0d":"minerTotalSupply()","abc4cbd3":"transferForTeam(address,uint256)","abc6124f":"Bought(uint256,string,address,uint256,string,string)","abc63d00":"STARTING_TIME()","abc66e82":"dev_fee(uint256)","abc6affb":"publicGetUserHistory(address,uint256)","abc6fd0b":"disburse()","abc897f4":"removeMinterByValue(address)","abc8bc4c":"addBomb(uint8,uint256,uint8,uint8)","abc8c7af":"marketplace()","abc93aee":"left64(uint256)","abc9e8c0":"fetchOrdersForPayer(address)","abca7290":"feeDeposit()","abcafdf8":"prizeProjection(uint256,uint256)","abcb7fce":"getTokenAddressHashing(address,uint256)","abcb9934":"unlistToken(address)","abcc11d8":"lastResult()","abcc8a46":"LogEuroTokenOwnerMigrated(address,uint256)","abccb043":"modifyMaxContractBalance(uint256)","abcccdb1":"agentAddr_()","abcd0d9d":"getNewEndTime(uint256,uint256,uint256)","abcd7960":"equal(uint256,uint256,string)","abcdabcd":"aiGFJ()","abce03d0":"KoreaRepublicvsGermany()","abcf033c":"safeWithdrawalFromCrowdsale(address)","abcf1328":"InterestBank()","abd05acd":"createDklSaleAuction(uint256,uint256)","abd06c3b":"remove(bytes1,bytes1)","abd10e07":"failSafeAddWhenGreaterThanIntMax()","abd117fe":"GXCSentToETH()","abd188a8":"setKyberNetworkContract(address)","abd1a89c":"allocTokenHolder()","abd225e1":"isStarted(uint256)","abd23d95":"getNameByAddress(address,address)","abd2adbb":"columns()","abd2cc5f":"presaleClosed()","abd2ecb7":"isOnExchangeById(uint256)","abd437da":"balanceOfCall(address)","abd44556":"setBatchDetachCollectibles(uint256[])","abd49646":"makerDAO()","abd5100d":"referralAmountInvest(address)","abd5f3c7":"poolPrice()","abd6b000":"CryptoSagaCardSwapMerculet(address,address,address,address)","abd6cb3c":"firstStageRaised()","abd6ff8e":"setIntValue(string,int256)","abd70aa2":"getPoolBalance()","abd74e52":"getLastPriceFeedValues()","abd796bf":"addAllowedAddress(address,address)","abd7f8de":"doEmit(uint256,uint256)","abd8537f":"makeSmokeymon(string,uint8)","abd89e1e":"preICOmint(uint128)","abd8d939":"buyThroughProxy(address)","abd936ab":"delegateDklSaleAuction(uint256,uint256,bytes,uint256)","abd958eb":"getCurrentBlockValueAndSellPriceForTile(uint16)","abda35de":"inMaintainance()","abda78ed":"getAltOracles()","abdb5ea8":"repayBorrow(address,uint256)","abdbe6ca":"CrowdDreaming()","abdbf4a3":"UpdateAsk(address,uint256,uint256)","abdc5dee":"HumaniqToken(address)","abdd0c44":"marginCallOnBehalfOf(address,bytes32,uint256)","abdd11a8":"setOpeningTime(uint256)","abdd19d9":"setCityContract(address)","abdd2430":"AuctionCreated(address,uint256,uint256,uint256,uint256,uint256)","abdde3d1":"getEthToTokenOrder(uint32)","abde33f7":"right26(uint256)","abded6fd":"setANT(address,address,address)","abdf9566":"setData_16(string)","abdf9bda":"bountyProgam()","abe088a7":"financialOfficerAddress()","abe1d5a2":"ViewRawDeposit(uint256)","abe24a3d":"mulByFraction(uint256,uint256,uint256)","abe2a16e":"FeeRate()","abe2a18d":"stateChangeAgents(address)","abe3219c":"safeMode()","abe3d0e3":"logPurchase(address,uint256,uint256)","abe3dfd1":"setInitialRate(uint256)","abe4136f":"getNickname()","abe4932c":"createPostboyAccountForSomeone(uint256,uint256,bytes16)","abe5b120":"Registered(address,uint256,uint256,uint256)","abe65ec9":"_createDiamond(string,address,string,string,string,string,string)","abe6c54d":"deleteCandidates(address)","abe6e82f":"setAmountBonuses(uint256,uint256,uint256)","abe7008e":"getPlayerValue(uint8[],uint8)","abe756da":"dateRelease9()","abe75844":"preSaleFirstEndDate()","abe7b54e":"readWelfareDetails(address)","abe7c08e":"finishVoting(uint256)","abe7cc7b":"LOCK_END()","abe7f1ab":"remove(address,uint256)","abe7f6fe":"ensureAllowance(address,address,uint256)","abe8014a":"totalWeiRaisedDuringPreICO()","abe9717a":"A2ACrowdsale()","abe9f569":"oraclize_getPrice(string,uint256)","abea0804":"nAddresses()","abea8d79":"setMiningLeader(address)","abeb5f9f":"hasQuickBuyEtherToken()","abebb746":"_fillOrder(address,address,uint256,address,uint256,uint256,uint256)","abebb7f3":"MarketsContract()","abec0a00":"BLVK()","abed982b":"LockedUpTokensWithdrawn()","abedeab4":"init_claim(uint256)","abee967c":"initialReward()","abefe7ac":"canCreateUnit(uint256)","abf03e19":"end_ICO(uint256)","abf0661f":"_burnForDeposit(address,uint256)","abf0c538":"vestTokens()","abf17198":"getShipProductEarningByModel(uint16)","abf19801":"createVesting(address,uint256,uint256,uint256,uint256,bool,address)","abf26786":"item(uint256,bool,bytes)","abf2b5b9":"cancelMtr(uint256)","abf2e01c":"isElectionPeriod()","abf3260f":"highestEditionNumber()","abf45359":"preSaleTokenCap()","abf52f53":"independentSellerJoined(address,uint256,address)","abf567e1":"setStartTime(uint256,uint64)","abf64392":"withdrawInvalidated(uint256)","abf74a93":"pitFee()","abf74cda":"_issueTokens(address,uint256)","abf74d5f":"bury(uint256)","abf7b063":"totalSuperAdminsMapping()","abf7bfd8":"createUser(bytes32)","abf7f83e":"setBonuses(bool)","abf8de6b":"TrocarAdmin(address)","abf8fbb8":"BCB(uint256,string,string)","abfb589b":"revealBet(uint256,uint256)","abfb84a9":"TransferredPrefix(string,address,address)","abfc3db2":"MIN_UPDATE(bytes32)","abfc99a8":"setPeriodStart(uint256)","abfcb627":"subscribe(address,bytes32)","abfcb6f8":"checkInfo(uint256,address)","abfcc7d8":"endRound(uint256,uint256,address[],address[],bool)","abfccf3c":"REKTTokenSale(address,address,uint256)","abfd5c94":"addEntryInDays(address,uint256,uint256)","abfdcced":"setBool(bytes32,bool)","abfdd068":"getUserAuctionIds(address)","abfdfbe6":"setRentalPricePerDay(uint256)","abfe0472":"setMainLocation(uint16,uint16)","abfe35ad":"getStakingReward(uint256)","abfe40a8":"privateMint(uint256)","abfea3c5":"IraPid()","abfebfd9":"fifthWeekTokenPrice()","abff0110":"broker()","abff3fc1":"eventSaleEnd()","abffc9ac":"delistToken(address)","abffeffc":"create(address,address,address,address)","abfffa28":"foundersTokensDisbursed()","ac001725":"Goldic()","ac00c3e6":"teamEndTimestamp()","ac01367f":"CryptovoxelsProperty(string,string)","ac016a31":"label(bytes12)","ac01b83d":"getAllPlayers(uint256)","ac0250f7":"memberAt(uint256)","ac0287e2":"arrr(uint256[])","ac02c601":"TranferETH(address,uint256)","ac03f324":"transfer_status()","ac045aca":"soldSoulFor(address)","ac0496e1":"setItemToken(address)","ac04f5a7":"append(address)","ac05e0f7":"getBurnRequestUintMap(uint256,string)","ac05e15f":"manuallyMintTokens(address,uint256,uint256)","ac066073":"startTimePresale()","ac06e302":"SetupCrowdsale(uint256,uint256)","ac06eb81":"MDIVToken()","ac080f48":"getDebrisStatus(bytes32,uint8)","ac0840db":"resultsPublishedTime()","ac098ce9":"addAnn(string)","ac0a04b2":"signToApproveAddTokenData(uint256)","ac0a7223":"buyCost()","ac0ab476":"transferToContract(address,uint256,bool,bytes)","ac0b1786":"MeibangAccumulationAppreciationAllocation(uint256,string,uint8,string)","ac0ba9b1":"payUSDCToProvider(address,address,uint256)","ac0c103a":"a_palavra(bytes5)","ac0c518d":"preSaleTokenSold()","ac0ca722":"AutoreleaseTriggered()","ac0db69d":"Log(uint8)","ac0f3865":"LogTokensWithdrawn(address,uint256)","ac0f90e3":"checkCrowdsaleState(uint256)","ac0fdae5":"Record(address,string)","ac110d8e":"Take()","ac12319d":"adminPayout(uint256)","ac128f4f":"roundResults(uint256)","ac12bf92":"setAdminStatus(address,uint256)","ac12f3e9":"partner1_voted_update_prenup()","ac132dc3":"ProtectedUnlock(address,address,uint256)","ac133709":"getChannelParticipantInfo(address,address)","ac133d3b":"deploymentCost()","ac134c08":"rewards_amount(uint256)","ac13d9a6":"setPartnerContracts(address)","ac1424fd":"generateNewTicket(address)","ac145d80":"setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","ac14c61e":"PresalePool(address,uint256,uint256,uint256)","ac151959":"setmaxprice(uint256)","ac1559d2":"totalTokensSent()","ac155a6c":"MatryxToken()","ac171101":"GAGARIN()","ac17cba4":"lemonsRemainingToDrop()","ac17d506":"getMemberData(address,address)","ac185644":"ownerTimeLastMinted()","ac1864b8":"treasuryManagers(uint256)","ac187542":"forceEndGame()","ac18de43":"removeManager(address)","ac194b07":"preIcoStartBlock()","ac19c726":"setKeepEth(bool)","ac1a13fb":"cancelOrder(uint256,uint32,uint32,uint256,string)","ac1a182c":"_calcProportion()","ac1a386a":"setWalletAddress(address)","ac1a7175":"lockUserInfo(address)","ac1aaa1a":"calticket(uint256)","ac1ad7d1":"tickerQuery()","ac1b14ff":"proxyCall(uint256)","ac1bc7e8":"updateDetails(string,string)","ac1c1443":"listProducts(address)","ac1c3d04":"generateToken()","ac1cb329":"withdrawBuyAgent()","ac1cd994":"seed_coins_vault2()","ac1d0609":"updateWhiteList(address,bool)","ac1d6fe2":"changeAllocation(int256)","ac1deea0":"RateUpdated(uint256,bytes32,uint256)","ac1e17df":"addHolder(address)","ac1e4734":"ORCA()","ac1e765b":"checkValidity(string,address,string)","ac1f7ca1":"totalFundsAvailable()","ac20902e":"NormalizeMoney()","ac20e2a0":"TOTAL_TOKENCAP()","ac210cc7":"wrapper()","ac216ae9":"setCheckBonus(bool)","ac218c6d":"addressICOManager()","ac21bacd":"TokenPriceChanged(uint256)","ac22b970":"_medalFreeze(uint256)","ac22cec8":"withdrawGasCost()","ac230e52":"getHeroName(uint256)","ac232383":"getAyantDroitEconomique_Compte_6()","ac246c3e":"TIME_TO_STALEMATE()","ac256e1d":"RiekCoin()","ac25f266":"add_to_whitelist(address)","ac26109e":"lockForOrder(address,uint256)","ac267435":"volumeType7()","ac270c37":"contractUp()","ac280cb9":"MAX_STANDARD_SALE_PACKS()","ac281ca6":"recordPayment(uint256,uint256,uint256)","ac28240d":"transferBackMANA(address,uint256)","ac283f5b":"Error(string,string)","ac28838b":"getPerson(bytes32)","ac28ff48":"collectableTokenBalance()","ac297d21":"vendDisciple(uint256)","ac2ac86c":"setSmallCapWhitelistParticipants(address[],uint256[])","ac2aefd2":"addPigment(uint256,uint256,uint256,uint256)","ac2c8bb5":"getTile(uint16)","ac2d456d":"setOracleCallbackGasPrice(uint256)","ac2d7ce5":"setNextLotteryTTWTokenId4(uint64)","ac2e043d":"whitelistMulti(address[],uint256[],uint256[])","ac2e064b":"set_maxCWCsPerSaleLessThan(uint256)","ac2e2c65":"JULIAN_ADDRESS()","ac2f0074":"polls(uint256)","ac307773":"claimFunds()","ac30da84":"BountyHunter()","ac3120a0":"LogContribution(address,uint256,uint256,uint256,uint256)","ac31818d":"Better_Bank_With_Interest()","ac3314a6":"issueLockedTokens(uint256)","ac336f7b":"getCurrentConsensus(string)","ac355ed3":"_salesprice()","ac35bdb4":"sub_session(string,uint256)","ac35caee":"transferWithReference(address,uint256,string)","ac360d3c":"TokenWrapper()","ac375770":"didWithdraw(address,uint256)","ac377553":"fillFromCollateral(uint256)","ac38eb07":"tokenIdForHandle(bytes32)","ac3910a2":"ballot()","ac3c27cf":"resolveDisputeSeller(address,string)","ac3c49e0":"getMarketMakerAddressFromToken(address)","ac3c9952":"batchTransfer(address,uint256[])","ac3cb72c":"addApproval(address,uint256)","ac3cdf78":"RANGEEND_10()","ac3d057d":"releaseBudget(address,uint256)","ac3d5084":"initialFrozenTime()","ac3d8558":"setExitStake(uint256)","ac3dc451":"TorontoRules(address,address[])","ac3dc9aa":"startBlockTimestamp()","ac3e6b2f":"testSetNotRetractable()","ac3e7d24":"addChainyData(string)","ac3fc432":"stampCreatedCount()","ac403817":"addresIndex()","ac41865a":"getPrice(address,address)","ac41b4a5":"SignalingEnabled(address,uint256)","ac42c3ec":"maxTokenBetValue()","ac42ea7d":"rejectBurnRequest(uint256,string)","ac42f301":"getNextForwardUserId()","ac42f446":"botPhase()","ac440d13":"CardsAccess()","ac4501d9":"splitTrade(uint256)","ac451185":"getGames(uint256,uint256)","ac45185d":"adminStewardship(address[2],uint256[7],uint8,bytes32[2])","ac457a9d":"ExposureOpened(bytes32,address,uint256,uint256,uint64,uint64)","ac460d66":"setTokensContract(address,address)","ac46a451":"OpsAddressChanged(address)","ac46fa22":"burnEscrow(uint256,uint256)","ac4746ab":"EPOCH_LENGTH()","ac4758cc":"Takafuly()","ac475e5c":"CheckTimeout()","ac476a05":"MarketMaker(address,address,uint256,uint256)","ac47981c":"issueCertificate(string,string,string,address,address,string)","ac480af9":"updateFirstDeposits(uint256)","ac482bff":"resume_PRIVATESALE()","ac48bd5a":"ethUSD()","ac48fcbc":"testTheMultipliers()","ac490b08":"parsha()","ac49dd5c":"removeTimelock(address)","ac4a743d":"ecoFundSupply()","ac4ab3fb":"hasRole(address,bytes32)","ac4abae1":"lockReleaseDate()","ac4b2bae":"newParameters(int256,uint256,int256,uint256)","ac4ba3ea":"initManager(uint256,uint256)","ac4bd53a":"currentLeader()","ac4bed68":"modifyHorsey(uint256,address,bytes32,uint8,uint8)","ac4c25b2":"void()","ac4c8bf3":"argCurMax()","ac4ce2c6":"setAddress(uint256,address)","ac4cfa4c":"calcAmount(address)","ac4d2e95":"ownerTokensFreeDay()","ac4d8a26":"setRepPriceInAttoEth(uint256)","ac4d965c":"notZeroAndNotSender(address)","ac4ddd9f":"retrieveTokens(address)","ac4df041":"donationClosed()","ac4e677c":"registerTrack(bytes32,uint256,bytes32,bytes32,bytes32,bool)","ac4e73f9":"proposeReverse(string,address)","ac4eefc5":"getGoldDataMinted()","ac4fb219":"enableLockFlag(bool)","ac50713a":"foundingTeamWallets(uint256)","ac509050":"getPlayerRoundsKitties(uint256,uint256)","ac50a466":"betfortoken()","ac50af76":"transferExcessTokensToReserve()","ac50b2e5":"getPlayerRoundNumbers(uint256,address)","ac51009e":"createBountyTokens()","ac51215b":"TokenRegistry(address,int256)","ac51a36a":"_unpackPetData(uint256)","ac51af8e":"transferWithBonus(address,uint256)","ac51d3a5":"smileyToken()","ac5277a4":"teamSupply6Months()","ac552cf2":"getCurrentDukePaid(string)","ac5553ce":"phaseDuration()","ac5555aa":"initialized(bytes32)","ac562666":"freezeCoin()","ac566953":"getInfra(uint256)","ac56c52b":"makeDealForTwo(string,uint256)","ac56f980":"setRealseTime(uint256)","ac588536":"delayPayout()","ac5895f6":"getSoilHumidityControlLimits(bytes32)","ac591e40":"SelectOne(uint256,uint256,uint256,uint256,uint256,string,address)","ac592944":"SendPreReserved2()","ac59eeeb":"recoverAddressFromWithdrawMessage(uint256,address,uint256,bytes)","ac59f0d9":"addToken(address,address,string)","ac5aaa5b":"toToteLiquidatorWallet()","ac5b3998":"assignLockedBalance(address,uint256)","ac5b3dbb":"Michael1011Token()","ac5c8535":"storeData(bytes)","ac5c867c":"sendCrowdsaleBalance(address,address,uint256)","ac5c915f":"burnBonuses()","ac5ce03b":"marriageProofDoc()","ac5cfc3d":"getMsgWaiting(uint256)","ac5d2dbf":"typeToken()","ac5d67e9":"lockAdvisorsTokens()","ac5d8745":"voteWithSpecifiedAmounts(bytes32,uint256,uint256,uint256)","ac5e7977":"receiverThree()","ac5e81a9":"historyPayout(address)","ac5ec9ef":"setAcceptPayment(bool)","ac5f91a0":"previousMinters()","ac6068b5":"isNotExpired()","ac60a6cd":"payInvoice(uint256)","ac60bbca":"userTokenStats(address,address)","ac60c969":"canFirstMint()","ac60da79":"TOKEN_SALE3()","ac61e92b":"createBet(uint256,uint256,uint256,uint256,bool)","ac624f52":"crowdSaleToken()","ac62ddb2":"validateMigrationIsPending(string,string)","ac62e250":"CertificationSet(string,address,uint256)","ac63208d":"SPRToken()","ac637c7a":"delegateTo(address)","ac64198b":"RSPLT_G()","ac6456df":"_betFailure(string,uint256,bool)","ac646756":"pause2()","ac656636":"getDepositReceipts(address,int256,uint8)","ac65b258":"PresalePool(uint256,address,uint256,uint256)","ac66777f":"multiCallTightlyPacked(bytes32[])","ac67857e":"ArtsCoin()","ac697fb5":"SkySwapToken()","ac69c09c":"changeVotingRules(address,uint256)","ac6a2b5d":"_withdraw(uint256)","ac6a4d6a":"fooInt()","ac6a602f":"getCompte_34()","ac6af280":"setRates(uint256,uint256)","ac6b02c4":"IFCC()","ac6b8e00":"transferLock(address,uint256,bool)","ac6bc853":"startSpin()","ac6c5251":"getWeight(address)","ac6d0316":"performUpdateCallPtr()","ac6d0fed":"nestedFirst(uint256)","ac6d8150":"getPayment(uint256,string)","ac6da90d":"qwercoin()","ac6e1237":"CrowdsaleEndedSuccessfuly(uint256,uint256)","ac6e2db6":"tokenCreationCapOne()","ac6ebb28":"CioCoinERC26Token(uint256,string,string,uint256)","ac6ee852":"newGanToken(uint256)","ac6eead3":"team_token_percentage_total()","ac6fe0ed":"Batchdrop(address)","ac700665":"getOrdersForBuyer(address)","ac700e63":"pauseMigration()","ac708f0c":"getProjectedBlockHash(uint256)","ac70a1ef":"getTreasures()","ac70e6c4":"level_9_percent()","ac71045e":"getOffer(address,uint256)","ac711cbb":"withdrawEtherAll()","ac71abde":"addAccounts(address[])","ac72200d":"getMinted()","ac72c120":"hasReverse(bytes32)","ac72cd7e":"BrokerInt(address)","ac73e97e":"lastMiningTime()","ac74bcde":"defaultNumberJuror()","ac74f2a8":"Bothereum(uint256,string,string)","ac767539":"testFailItemStoreNotRegistered()","ac76a499":"clientsAverageRating(address)","ac76fbf1":"GeoGame()","ac7709bc":"setTimedTransfer(uint256,uint256)","ac778b8f":"createCertificate(string,string,string)","ac77eb8e":"ZingToken()","ac781fbe":"TrustTokenERC20(uint256,string,string)","ac789e5f":"BlindAuction(uint256,uint256,address)","ac78dc16":"payTeam()","ac793a60":"createBet(uint256)","ac798bd3":"calculateArtCoinSupply()","ac798def":"set_sale_arbits_sold(uint256)","ac79a4b1":"getCreateMarketCreatorValue()","ac7a1b5b":"maxWithdraw()","ac7a722e":"updateETHPriceInCents()","ac7a95d5":"getNewShroom(uint256)","ac7b986f":"lotusWallet75Pct()","ac7bb2b4":"removeFromWhiteList(uint8,address)","ac7cda53":"changeRegisterBot(address)","ac7dce1d":"BsPresale_SNOV(address,address,uint256)","ac7e1e0a":"setEtherProceedsAccount(address)","ac7f0c48":"calculateWin()","ac7f9329":"AUTH_SETMINTAMOUNT()","ac7fc263":"multipliers(uint256)","ac7ffae3":"updt(uint256,string,uint256,uint256,string,string,address)","ac800b32":"transferCanaryOwnership(address)","ac82239f":"enableInvite(string,bytes32)","ac824fd9":"SHEX(uint256,string,uint8,string)","ac8261c9":"optionProgram()","ac828200":"_dlgtRet(uint64)","ac833fd9":"test_insert_findWithHintNextUpdateHead()","ac838774":"addauction(address,uint256,uint256,uint256,uint256,uint256,string,string)","ac8388a5":"callthis()","ac83ae55":"GAMEToken()","ac83e891":"BokkyPooBahsAutonomousRefundathonFund()","ac84ed4f":"TronClone()","ac856216":"setNumRewardsForTMEUser()","ac860a59":"_signPropertyByAgent(address,address,bytes32)","ac8641ee":"updateRefundWalletAddress(address)","ac8648a2":"mintFeeTokens(int256,uint256)","ac869cd8":"setFrozen(address,bool)","ac8860b9":"ProposalExecutedEvent(uint256)","ac88c8d8":"verifyAndLiquidate(address,address,address,uint256,uint256,uint256,uint256)","ac88ffb2":"feeWithdrawEthAmount(uint256)","ac890c4c":"unsetAllowedMultivest(address,address)","ac8a2af0":"updateShareholders(address)","ac8a584a":"removeOperator(address)","ac8aa236":"batchTransferVIP(address[],uint256[])","ac8aea24":"transferUnsoldToken()","ac8c5e8e":"buyLong(address[2],uint256[3],uint8,bytes32[3])","ac8d6030":"removeRequest(address)","ac8d6632":"addMasterNodes(address,uint256,uint256)","ac8dc6ea":"_decodeData(bytes)","ac8e88c2":"_updateSolvency(uint256)","ac8f539b":"emergencyDrain(address,uint256)","ac8fa644":"transfer_Same_Amounts_of_assets_to_many_addresses(address[],uint256)","ac8fbd09":"UpdatePoolTarget(uint256)","ac900c2d":"unregisterSeller(address)","ac92f4ae":"calldatacpy(uint256,uint256,uint256)","ac92fdb5":"getSaleDate(bytes16,uint256)","ac940823":"betOnLowHigh(bool)","ac957954":"transferDonations(bytes32,address)","ac95a2aa":"_createOriginalPainting(uint256,uint256,uint256)","ac95be9b":"testico()","ac9630fa":"publishGraduatingClass(string)","ac964f21":"numProducts()","ac9650d8":"multicall(bytes[])","ac9663a6":"approveByC(uint256,string)","ac96a0b3":"GYG()","ac96c65e":"doCancel(bytes32)","ac96f981":"authorizeAccess(address,int256,address)","ac978cea":"TeamHOMO()","ac979688":"transferAnyERC20TokenToBeneficiary(address,address,uint256)","ac97ad89":"getTokensFromAddressReturns(address,address)","ac985f0a":"townsSold()","ac9873c7":"CanaryV7()","ac988bdc":"_getStageIndex()","ac991b65":"double_blind_sha256(string,address,address)","ac996e7e":"resolvePledging()","ac99aa69":"recoverEthers()","ac99e0aa":"BitImageToken()","ac99f7b7":"_setStages(uint256,int256)","ac9a252a":"ownershipTransferred(address)","ac9a6515":"testTokenOwnershipAfterFinalize()","ac9b5671":"setVerifier(address,bool)","ac9b5c30":"getCreateMarketfeePerEthInWeiValue()","ac9c3b7a":"TokenTotal()","ac9c80af":"seed_additional_eth()","ac9cd354":"getTransferInfoCount(address)","ac9d7e0a":"raisevote()","ac9ef8a1":"changeMultisigs(address,address)","ac9f0222":"setState(bool)","ac9f2b7b":"callDeposit(address,address,uint256)","ac9f9d12":"FACHAINStandardToken(uint256,string,uint8,string)","aca00932":"calculateBaseTimeout()","aca15663":"transferToExchangeAddress(address,uint256)","aca19256":"_logRoundExtensionVolume(uint256)","aca233fd":"one_two(uint8)","aca31e61":"setEthPerToken(uint256)","aca34c11":"getPoolDetails()","aca62a5f":"convertAllOldTokens(uint256,uint256)","aca66aec":"DVIP()","aca67a8f":"getIsNFTAttached(uint256)","aca6fdf2":"getJobWorkerName(uint256)","aca7207a":"changeCoolDownTime(uint256)","aca7dcfe":"token_swap_supply()","aca7fdd4":"initialFunding(address,address,uint256)","aca867b3":"secure(address,uint256)","aca8dd6b":"test_threeInvalidEqString()","aca8e9dd":"setBillboard(string)","acaa78cd":"addTransferrer(address)","acaab181":"addSomeGas()","acab021c":"getTOS(address)","acab3e5d":"PricingStrategy()","acabbbc0":"getSlogan(uint64)","acabd1b9":"setFee3(uint256)","acac0b9f":"setMaxPerExchange(uint256)","acac9a9f":"undropped()","acad94ae":"humanStandardByteCode()","acada0d8":"SUNQToken()","acaf0278":"contractuallyOf(address,address)","acb02504":"getJobDescription(uint256)","acb02f7c":"VotePumpCoin0x()","acb09dde":"fechVoteNumForCandidate()","acb0bdc3":"isPolicyExist(bytes32)","acb10351":"setupDutchExchange(address,address,address,address,address,uint256,uint256)","acb1516f":"accreditationMember(address,address)","acb1e61f":"transferable(address)","acb2ad6f":"transferFee()","acb2d607":"TokenBet(address)","acb2fe3e":"checkBlackListAddress(address)","acb39d30":"tokenCreated()","acb3c073":"setSwap(address)","acb461df":"tavern(uint256)","acb5e570":"DepositClaimed(uint256,address,uint256)","acb62d7c":"clearConfig()","acb6a6aa":"_generateRandomNumber(bytes32,uint256)","acb6c69b":"setTrustedClient(address)","acb6ca94":"Nomid()","acb6e626":"ImageCoin(uint256,string,string)","acb6e9b1":"testControlItemStoreNotRegistered()","acb6f75c":"PreIco(uint256,address,uint256)","acb748e9":"RuletkaTestIo()","acb74e73":"canSaleInfo()","acb8726a":"distributeTax(uint256,uint256,uint256,uint256)","acb88986":"freeze(address,uint64)","acb894d2":"fint256(int256)","acb902f6":"secondHighestBid()","acb93f36":"ratePerHourInWei()","acb9656c":"setLockedTokens(address)","acb9d6f6":"getStageandPrice()","acbaed04":"TootyrTokenSale()","acbb471f":"EthermiumAffiliates(address)","acbb5759":"SetAction(address,uint256)","acbc272b":"newToken(string,string,uint256)","acbc3ff4":"keyFoundation()","acbc62ae":"TokitDeployer(address,address)","acbcabc0":"pantryT()","acbd9563":"buyPatent(uint16)","acbdb084":"RequirementChanged(uint256)","acbdb72c":"getSecondAdmin()","acbdea6c":"canUpdateBackWindowAdjustmentRatio()","acbe274d":"this_tablet_name()","acbf98a7":"endsWith()","acbfbaac":"getPOOL_edit_30()","acbfbd9e":"Unlock_Tokens(address)","acc02119":"DirectDemocracy()","acc05ccc":"AddressProxy()","acc0a246":"uint256At(bytes,uint256)","acc10f11":"collect(address,uint256,uint256)","acc12168":"on_block()","acc2508b":"payoutNow()","acc32da3":"validateIpfsDoc(address,uint256,bytes)","acc3b363":"ContractBHVC()","acc3c020":"investorsToWithdrawIter(uint256)","acc3e283":"test_insert_empty()","acc3e5d9":"deathFactor_ii()","acc58d24":"_removeStackholder(address)","acc5a0dc":"GetPrize()","acc68b2c":"usersRef(address)","acc69261":"addCompany(address,uint256)","acc79f74":"openMail(uint256)","acc7f8a8":"getCurrentDatetime()","acc823f8":"getSurname()","acc88c0d":"decayedBalanceOf(address,address)","acc8cb18":"pushTerm(string)","acc907a9":"getWinner(address,uint256)","acc9138e":"revealBid(bytes32)","acc9383a":"dist_privateSale(address,uint256)","acc93c9e":"setBonusThresholds(uint256[],uint256[])","acc99bb7":"allUnKycedEth()","acca2c24":"getFirmFromAuthority(address)","acca92e0":"finalize(uint32,bytes32)","accb2677":"createCarsTokens()","accb4219":"RISHABHToken(address,address)","accbdfd0":"IsDistribRunningFalg_()","accc4a61":"setPresaleOpeningClosingTime(uint256,uint256)","accd932b":"icoClosedManually()","accd962b":"tokensaleContributors(uint256)","acce4b10":"crowdsaleTargetReached()","accf80a4":"RelaunchedCrowdsale(address,address,uint256,uint256,uint256,uint256)","accf878a":"ActionPresell(address)","accfa48b":"changeRelease18m(address)","accfaeba":"LEGAL_EXPENSES_1_TOKENS()","acd00a5c":"fillAmount()","acd00dc1":"_emitCountryCodeChanged(uint256,uint256,uint256)","acd02c30":"disburseToken(address,address[],uint256[])","acd04c4c":"_setVersion(uint256)","acd105d1":"doomsday()","acd19170":"getarg_2()","acd1bdb4":"updateMinimumContribution(uint256)","acd256db":"setOraclizeBytes(uint256)","acd2988c":"setValidBwMarketCaller(address)","acd2e875":"refferedBy(address)","acd3057a":"jishituihuan(address,uint256)","acd3c39f":"frozenAccount(address,bool)","acd47b3a":"addAuditOrEvidence(bool,bytes32,uint256,bytes32,uint8,bytes32,bytes32)","acd47bc3":"COMMUNITY_BOUNTY_STAKE()","acd47e97":"TokenPurchase(address,address,uint256,uint256,bool)","acd485fe":"Balicoin()","acd4bca6":"vanbexTeamSupply()","acd4e110":"Amorcoin()","acd4e4aa":"SilverFiftyToken()","acd590d3":"preSale2Finished()","acd5b7b9":"stopAt()","acd5fb23":"isZero(int256,string)","acd6a40a":"testUntil()","acd6f096":"testThrowsIfSaleIsNotTokenController()","acd782b1":"setProtectionPrice(uint256)","acd78e3a":"getPayIdAndHeld(uint256)","acd84e24":"PLN()","acd9277f":"market_DeclareForSale(uint256,uint256)","acd94ccb":"frozenDaysForICO()","acd9930b":"setHoverText(uint256[2])","acd9fd65":"fun1(uint256)","acda01f6":"setPendingWalletFee(address,uint256)","acda28a1":"bacFund()","acda3e10":"UpdateEtherPriceNow()","acda6737":"TADPOLE_BOOST()","acdaa0d2":"payout(uint256[],address[],uint256[])","acdba7c2":"contract_num()","acdba91f":"setTokenExpectedFee(address,uint256,address)","acdc42f3":"failICO()","acdd1454":"mint(uint256,string,string,string)","acdd9c5c":"SetRegistrationContract(address)","acddb63c":"requestMortgage(uint256[6],string,uint256,uint8,bytes32,bytes32)","acddbe1c":"someFunction3()","acde39d9":"c4cfee()","acdec908":"getBetIdAtRound(uint256,uint256)","acdf4f18":"buyBack()","acdf67b3":"blockWithdrawBegin()","acdf7362":"setLock(address,address,uint256,uint256)","acdfa0ac":"acceptNameTranfer()","acdfb350":"hariKari()","ace1fab1":"withdrawReserve()","ace237f5":"pep()","ace30883":"absMinFee()","ace36da2":"setChain(address,address,address)","ace4283b":"getSecondsToExpiration()","ace45552":"endICOStage6()","ace51abc":"helperVerifyHash__(uint256,int256,int256[],int256,uint256,int256,int256[],int256)","ace523c4":"createReferendum(string,string,uint256,uint256)","ace80e0d":"bytesMemoryArray()","aceaa365":"_creditTo(address,uint256)","aceb87e1":"getUserBio(string)","acec0e1d":"setconf(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","acec338a":"setActive(bool)","acec460f":"tokenDataValue(uint256,uint256)","acec488d":"setAnnouncement(string)","aced1661":"keeper()","aced5935":"getConfig(address,string)","acedc33e":"setDecrementOpenInterest(bool)","acee57e1":"airDropPayableMoney()","aceecbc8":"disableSelling()","acef193e":"FundingCompleted(uint256,uint256)","acef6037":"transferToAddress(address,uint256)","acefb7bd":"JudgmentCoin()","acefd330":"createRandomNumber(uint256)","acf0dd57":"getRegionUrl(uint256)","acf197b1":"IcoRunnedManually()","acf1b06a":"systemCreatedCount()","acf1e9fa":"buyNinja(address)","acf2f478":"changeTradableFciInSession(bool)","acf3508e":"_isLatitude(int256)","acf36037":"getCountryData(uint256)","acf36e53":"addParent(address)","acf372ef":"SetMasterWallet(address)","acf400b2":"getSellOrdersBlackMarketComplete()","acf4280c":"buildDSApprovalDB()","acf50f55":"setItemForSale(uint256,uint256)","acf555b8":"regReferrers(address[])","acf5c689":"setRequiredBlockConfirmations(uint256)","acf5cfbf":"Spend(uint64,address,string)","acf67746":"getPlayerTeam(address)","acf6d918":"ChangeReturn(address,uint256)","acf7aea7":"getCountryLimit(uint256)","acf7c1d2":"updateJackpotBalance()","acf8bf2a":"channelCount()","acf94ed5":"fallbackTriggered()","acf975d6":"addCycleAddress(address)","acf97a65":"redistribute(address[])","acfabbe4":"updateCurrentPeriod()","acfb153d":"RoundTime()","acfb208b":"transferFee(uint16,uint64,address)","acfb2d95":"iHaveABiggerDick(string,string)","acfb4b26":"DIVIUMx2()","acfd18c6":"FOUNDATION_ADDRESS()","acfd35a0":"distributeSuccessfulCampaignEth(uint256)","acfd82f2":"grantOwnership(address)","acfdfd1c":"deploy(uint256,string,string,address)","acfe27d7":"Slashing(address,uint256,bytes32)","acfe711a":"Scientific()","acff2fce":"forceNSFW(uint256,bool)","acfff377":"rollDice(uint256)","ad00129e":"bonusOver100ETH()","ad00297a":"payDeposit(address,uint256,bytes)","ad003aeb":"setUserNotifications(address,address,bool[],bool,uint8[],uint8)","ad009062":"newVitaReward(address)","ad0096af":"transferFromWithCustomReserving(address,address,uint256,uint256)","ad01ed4c":"s3(bytes1)","ad0212df":"capitalNeeded()","ad0254a6":"BitGuildWhitelist()","ad03261e":"supportRebalance()","ad03abc5":"enableRealCap(uint256,uint256)","ad044f49":"totalFunded()","ad04592e":"owner_deposit()","ad04d74d":"buyCoreWithBalance(address,address,uint256)","ad0570c7":"setUsernameForAddress(bytes32,address)","ad07008f":"icoDiscountPercentageLevel2()","ad07220f":"forceTransferBalance(address,address,uint256)","ad075684":"TotalPayment()","ad0767bd":"RECORDPart()","ad076994":"verify(address,address,uint256)","ad076bfc":"debug_hash256Double_concat(bytes,bytes,bytes)","ad09019d":"oraclize_getNetworkName()","ad09202a":"confirmDealCompletionByDoctor(bytes16,bool)","ad093409":"getTicketOwner(uint256)","ad0a58c8":"checkAndDeclareWinner(uint32)","ad0a6cc3":"attackTileForExistingUser(uint16,uint256,bool)","ad0b2bec":"redeemWinnings()","ad0b38a2":"getAppId(string)","ad0b6013":"DEFAULTED_STATUS()","ad0bc739":"testConcatMemoryZeroLength()","ad0be174":"zHQNumber()","ad0c3dff":"icoStartedAt()","ad0d3713":"getTittyOwner(uint256)","ad0d4c3d":"HaiWang(uint256,string,string)","ad0dd79f":"usersWithdrew()","ad0e053b":"getPointerOwner(uint8)","ad0e13bb":"toB32(bytes,bytes,address)","ad0e8bc7":"givepoints(address,uint256)","ad0e9053":"set_pauseReturn(bool)","ad0f2916":"coinPrice()","ad108280":"BECTStandardToken(uint256,string,uint8,string)","ad1088e4":"didProve()","ad111feb":"DFSToken()","ad11cc1d":"claimC1()","ad11fe44":"revokeAllowance(address)","ad121e33":"fundFounder()","ad1288c8":"forkTransferFrom(address,address,address,address,uint256)","ad12cc0b":"removeLibrarian(address,address)","ad13eb02":"createScanner(uint256)","ad150aec":"calculateHeldTokenDistribution()","ad156d34":"AllocateBountyAndEcosystemTokens(address)","ad166aae":"MyTest(uint256,string,uint8,string)","ad180328":"_check(address,address,uint256)","ad188be0":"userBetContribution(address)","ad1896db":"resetElectionPeriod()","ad18ad0c":"quote(address,uint256,address)","ad1922b0":"setIcoCloseTime(uint256)","ad19bd26":"getVoteCommit(uint256,address)","ad19e993":"_callSender(bytes32,address,address,address,uint256,bytes,bytes)","ad1a17b4":"getPaymentCount(uint256)","ad1a38be":"_createNarco(string,string,address)","ad1a7d0c":"getBook(bytes32)","ad1aa252":"withdrawUnsentTokensForOwner()","ad1b3909":"coinage()","ad1be7c1":"softCapClose()","ad1c582a":"divUIntValue(bytes32,uint256)","ad1c5d6c":"updateShareCrystal()","ad1d0dcf":"exodus()","ad1def42":"registeredAddress(address)","ad1ef61e":"donkeyInvested(address)","ad203bd4":"subMonths(uint256,uint256)","ad207feb":"ethTeamWallet()","ad217ae5":"stats(uint256)","ad220cf1":"currentPrivateSale()","ad221195":"transferTokenFrom(address,address,uint256)","ad22453c":"BRANDS()","ad226122":"presaleFallBack(uint256)","ad22980a":"TopChainCoinMintFinished()","ad22ccc0":"committeeJoinVoters(address,address)","ad22d4a2":"get_last_item_in_state(bytes32)","ad2334a0":"spinnerModulus()","ad2377c1":"pausePriceRaise()","ad23ad92":"AfriHealthCoin()","ad23de63":"isAddressWhiteListed(address)","ad23e038":"HelloToken(uint256,string,uint8,string)","ad23fdc3":"deCompose(string)","ad23fde0":"breed(uint256[2],uint256[2],uint256)","ad247dd9":"permissonedAccounts(address)","ad24d512":"TECHNOBITToken()","ad25ce57":"bidOnSaleAuction(uint256)","ad266df8":"ARA(uint256,string,uint8,string)","ad26f6e1":"SetParticipantName(address,address,string)","ad27b14d":"cancelBet(bytes16)","ad28ff88":"blacklist(address,address)","ad295b26":"getDepositInstanceCount()","ad29ca6d":"eosCrowdsaleAddress()","ad29ddaa":"removeRound(uint256)","ad2a0a7b":"_changeEternalStorageContractAddress(address)","ad2a39d6":"secondStartTime()","ad2a9c5f":"MIN_CARD_PRICE()","ad2af501":"Games(uint256,string,uint8,string)","ad2b14d1":"changeCrowdsale(address)","ad2b1e03":"privilegedBurn(uint256)","ad2b260a":"decimalNum()","ad2ba325":"splitStr2Int(string,string)","ad2bb1b3":"blockAddress(address)","ad2bbf9c":"_redeemByTranche(bytes32,address,address,uint256,bytes,bytes)","ad2c1632":"ArenaplayToken()","ad2da239":"calculateVote(uint256,uint256,uint256)","ad2daa48":"roundTimeRemaining()","ad2de16d":"acceptTxTask(uint256)","ad2e1d49":"getHeirachy(bytes32)","ad2e6aff":"WithdrawEarnings()","ad2e8c9b":"getDuration()","ad2ec740":"PRICE_9()","ad2fad33":"setSpawnProxy(uint32,int256,address)","ad2fea7c":"removeMinter(int256,address)","ad317c23":"mileagePointPrice()","ad319bab":"TokenERC20AC(uint256,string,string)","ad31e845":"_tag(uint256,string)","ad3286fc":"AddToken(address,uint8)","ad32a40f":"Fund(address,address,address,address,address)","ad32f925":"makeAvailable()","ad3335b5":"setINNBCTokenAddress(address)","ad33513f":"refundAmount()","ad33e21d":"getReferralBonus(uint256)","ad3429be":"developmentTokens()","ad344465":"AccessorySeriesCollection(uint8)","ad344bbe":"sgtExchanger()","ad35bdb0":"extraSupply()","ad35dcd3":"AGAVE(string,string)","ad36c593":"getOwnerOfCampaign(bytes32)","ad3704c5":"getApplicantsLength()","ad374f5b":"enableClaimTokens(bool)","ad376113":"addDevReward(uint256)","ad379089":"canSettle(bytes32)","ad37c41b":"blackListEnabled()","ad381cb7":"getCurrentRoundIsActive()","ad38867e":"checkWinner()","ad388896":"setWinnerAndEndEvent(bytes32,bool,string)","ad389d5d":"isValidAdversary(uint8,uint8)","ad38bf22":"updateBlacklister(address)","ad38d6f1":"whitelistWallet()","ad38fba5":"transferEthTo(address,uint256)","ad395939":"withdrawContributorPot()","ad395ad3":"removeFromContractIDArray(address)","ad3a05ca":"BlackToken()","ad3b1b47":"withdrawFees(address,uint256)","ad3bf1f1":"refundPeriodOver()","ad3c0b9d":"CROWDSALE_DURATION()","ad3c8b22":"addSkipPrice(uint256)","ad3c901c":"getPendingById(uint256)","ad3cd883":"changeContractName(string)","ad3de14c":"getMap()","ad3e0ed2":"getAffiliateSenderPosAmount(uint256)","ad3eb71f":"plcrFactory()","ad3ef46d":"RealstateOceanProject1(address)","ad3f972e":"deleteChild(address,address)","ad3ff3c1":"houseAlwaysWins()","ad401842":"setDateMainStart(uint256)","ad40256f":"reclaimableOwner()","ad418e66":"strategicReserveSupply()","ad41b628":"MHCToken()","ad447a19":"getBalanceDB()","ad449198":"returnBorrower(uint256)","ad4493fe":"checkPoint(uint8,int256,uint16)","ad44c205":"Nudge()","ad44e73b":"unwhitelist(address[])","ad450b72":"SupplyLimitChanged(uint256,uint256)","ad452254":"BsToken_SNOV()","ad459a1c":"CurrentAirdropped()","ad468489":"register(bytes32,address,bytes32,bytes32,bytes32)","ad470886":"token_approve(address,address,uint256)","ad4749f4":"setupPeriodForFirstStep(uint256,uint256)","ad474b9a":"Engraved(address,string,string,bytes32)","ad475113":"PRESALE_BONUS_VOTING()","ad478dda":"investmentUpperBounds()","ad483188":"setCCH_edit_12(string)","ad48636a":"secondBonusSalesEnds()","ad487790":"reveal(bytes32,address)","ad487f3c":"LogFreeze()","ad48d611":"marketToken()","ad4946ee":"removeAddressFromNonzeroBalancesArray(uint256,address)","ad498ce1":"RATE_NO_DISCOUNT()","ad49f595":"checkAddress(address,address)","ad4a7bd9":"lockTokensForAs(address,address,address,address,address,address,address,address,address)","ad4ac3de":"LoveCoin()","ad4b243b":"buyOneMinuteLottery(uint256,uint8[],address,bool)","ad4b2ca4":"batchdrop(address[],uint256[])","ad4b558c":"monsterIndexToOwner(uint256)","ad4c05f1":"setResourceForStar(uint8[5],uint16[5],uint32[5])","ad4cd0d6":"stdlib()","ad4dde0f":"transferOwnershipOfItemsStorage(address)","ad4e2f77":"addDragon(address,uint256,uint256)","ad4e39f3":"getLendingItemInfo(address,uint256)","ad4f0e3a":"DevsmartCoinFive()","ad50039f":"setTechBonus2(uint256,string)","ad5022a5":"Votes()","ad506098":"WowMusicDiamondToken(address)","ad509c1d":"sendToken(address[],address[],uint256[])","ad50dd1f":"endPrivateSaleStage()","ad53322b":"donationAmountInWei(address)","ad534d9c":"logCoinAgeRecord(address,address,uint256,bool)","ad53be1d":"priceLeRT()","ad544dcb":"testSetNotUpdatable()","ad549e53":"set_participant_arbits_kyc_whitelist(address,bool)","ad5511a5":"_setTokenSeed(uint256,string)","ad559fd6":"setHigherPricePercentage(uint256)","ad562965":"getReceiptRoot(bytes32)","ad5632e6":"storeAuthenticity(string)","ad5688d8":"setCountryPicture(uint256,string)","ad5780af":"clearDNSZone(bytes32)","ad57a2df":"unrestrict()","ad57ceb4":"ethForMilestone()","ad58a7d2":"getSettingState(uint256)","ad59ffd1":"maxAmountBonus()","ad5a157d":"promoMoney()","ad5a8f29":"canEnterPool(address,uint256)","ad5b7189":"hasBooster(address)","ad5b896e":"refundMany(address[],uint256[])","ad5bfcb5":"getServiceStatByAddr(uint64,address)","ad5c1687":"offchainUpload(address[],uint256[])","ad5c4648":"WETH()","ad5c613d":"purchase(bytes)","ad5cd9e7":"startSTO()","ad5d2862":"getWinnings(uint256)","ad5d638d":"minFundedValue()","ad5dabb0":"assertYoungerBalance(uint256,uint256)","ad5dabca":"QatarCoin()","ad5e2cd0":"addPresale(address,uint256)","ad5e46cb":"hasError()","ad5f3433":"sumHardCapICOStage4()","ad5fb2b1":"seedVerification(string)","ad60540b":"MoccaCoin()","ad605729":"getParticipantCount()","ad606c72":"devWithdraw()","ad615f40":"getCrosCounter()","ad621b14":"BaoMaToken()","ad622d0e":"addDoctors(uint256,uint256,string)","ad62bda5":"setRoundLength(uint32)","ad62f1ca":"mintFor(uint256,address)","ad631abe":"BLO_PER_WEI()","ad63a469":"totalUsedTokens()","ad64ae4b":"registerModule(address)","ad64fa5c":"MINBET_forORACLIZE()","ad652cdd":"InternetMarket()","ad655998":"addAuthorizedInsertAgent(address)","ad65d76d":"ethToTokenTransferInput(uint256,uint256,address)","ad66de24":"impl_lock4Dividend(address,uint256)","ad66e52a":"etherBalance()","ad677d0b":"join(bytes32)","ad686011":"returnPurchase(address)","ad68ebf7":"migrate(address,uint256)","ad69644b":"setBestAngel(uint32)","ad69caa5":"expMod(uint256,uint256,uint256)","ad6a0546":"creatorsLocked()","ad6ad449":"HodlerMining()","ad6aefbb":"BeatTokenPreIcoStarted()","ad6b2c90":"getListTokens(address,uint256,uint256,uint256)","ad6b5d04":"amountClaimed()","ad6b9499":"getContactRecord(string)","ad6c8762":"paymentChannelsCount()","ad6cd14e":"EthLongExercised(address[2],uint256[8],uint256,uint256)","ad6d9b89":"bytetherOVAddress()","ad6dfe5c":"getPRewardId(address,uint256)","ad6e155e":"setContractPreICO(address)","ad6eba9f":"getSingleSubjectByAddress(address,uint256)","ad6eff22":"getUserType(address,address)","ad6f80ff":"getSignatures()","ad70810a":"getChainDrawings(uint256)","ad70fbc8":"QuickChain()","ad714012":"calculateMatchOutcomesForRoundId(int256)","ad71766e":"getWeiSoldToday(address)","ad717e8c":"_oraclizeQueueRound()","ad71a1fd":"MAX_SUPPLY_OF_TOKEN()","ad71c687":"registerSystem(string,string,string,string)","ad7222c1":"tokensAmountFrom(uint256)","ad723faa":"MChip()","ad72dce9":"buildFactory(uint8,uint256)","ad731de7":"createPromoCollectible(uint256,address,uint256)","ad732eea":"send(bytes20[])","ad7411e1":"CreateNertia(address,uint256)","ad7430cc":"RECEIVER()","ad74f9bc":"calculateCurrentPrice(uint256)","ad7554d9":"setDoubleRewardEndTime(uint64)","ad76325f":"finishProposalVoting(uint256)","ad7639fe":"TokenPurchase(address,address,uint256,uint256,string)","ad76423e":"DelphiToken()","ad764780":"OpenController(address)","ad7738b6":"MAX_TOTAL_ADOPTED_AXIES()","ad78dc8e":"totalWannaBuyAmount()","ad78f31a":"ticketStringFromAddressBytes(bytes32,address)","ad796b5d":"TOKEN_SUPPLY_AIR()","ad79c927":"TokenSwap(address,address,address)","ad7a14e1":"tokenRemainPublicSale()","ad7a5ff9":"autoDistributionViaETHContributions()","ad7a672f":"totalBalance()","ad7b09c5":"InitIcoController(address)","ad7b6884":"editContributors(address[],uint256[],uint256[])","ad7b6cb5":"bountySEEDSinWei(address[],uint256)","ad7bafc7":"mint(int256,address,uint256,uint256)","ad7bfd2d":"Cashchain()","ad7c66d0":"sellAllMilk()","ad7d59fc":"checkPlace()","ad7df080":"consul()","ad7e01c8":"wolkGenesis(uint256,uint256,uint256,address,address)","ad7e262c":"hasEmployerMinRatingsCount(address,address,uint256)","ad7e74f9":"addJobSkill(uint32,bytes32)","ad7e7cfc":"UpdateMaintenance(bool)","ad7ead58":"walletLock()","ad7eb560":"block5()","ad7ed3c2":"executeLottery(address)","ad7ed923":"ElepigToken()","ad7eee9f":"updateInt256s(bytes32[],int256[])","ad7f02b5":"balanceOf(address[16],address)","ad7f401b":"creatorInited()","ad7f9d76":"getInvestorBuyers()","ad7fa43c":"settleFeeSecondPart(address,uint256)","ad7fadc5":"buy(address,address)","ad7fff7c":"hasWorks(bytes32)","ad8088a5":"XdacToken()","ad80a7b4":"totalUndistributedDividends()","ad80ef94":"tokenExchanges(uint256)","ad810fe5":"holderIndex(uint256)","ad818071":"showStats()","ad81cd90":"villagesSold()","ad81d6f3":"createDefaultLinglongCat(uint256,uint256,uint256,address,uint256,uint256)","ad81f3be":"Barneys4HackerSpaceToken()","ad82ae61":"internalDoubleTransfer(address,address,uint256,address,uint256)","ad82dcac":"testBlockhashCorrectFee()","ad838107":"_checkDestination(address,address,uint256,bytes)","ad83bfce":"GetOwner(string)","ad845d2d":"toBytes()","ad84e1be":"createTokenContract(address)","ad84e2a6":"getCrab(uint256)","ad84eaab":"minimumPurchaseAmount()","ad869e1a":"_batch3_icosaleEndTimestamp()","ad86c10d":"GamingCoin(string,string,uint8)","ad86ee0b":"passOnContract()","ad8718c2":"Create(uint256,uint256,uint32)","ad8733ca":"multisend(address,address[],uint256[])","ad879a46":"cancelBetByA(uint256)","ad886326":"_isSignedOwner(bytes32)","ad889f03":"USER_TIMEOUT()","ad88d8a5":"try_pay(address,bytes12)","ad88f53e":"setFirstStageEndsAt(uint256)","ad89e64b":"_updateLandData(int256,int256,string)","ad8a9c8e":"ownerSetOwner(address)","ad8ae3ae":"poke(address,bytes32)","ad8b4698":"COMETUBU()","ad8b6657":"_createDrone(address,uint256,bool,bool)","ad8c3cd2":"setTank(address)","ad8ce06b":"gasPerTx(bytes4)","ad8d36cb":"CCH_EDIT_2()","ad8d5f48":"exec(address,bytes,uint256)","ad8ead69":"createTeam(string,uint256)","ad8ed335":"__proxy(address)","ad8f5008":"strike()","ad8f905d":"PoolPrize(uint8,uint8,uint256,uint256)","ad8fccf3":"freezeMulti(address[],bytes32[],uint256[],uint256[],uint256[])","ad906661":"add_to_ico()","ad913633":"getOriginalOwner()","ad9171df":"getRemainingLimit(address,address)","ad92e46c":"getNumBettings()","ad93640f":"TRANSFER_PROXY_V2()","ad94d901":"ownsAll(address,uint256[])","ad9657f4":"createCoin(uint16,string)","ad966a03":"_bytes32ToString(bytes32)","ad973d74":"addCustomer(address)","ad976c3e":"setData_24(string)","ad979417":"setPoolName(string,uint256)","ad98ebaf":"ProjectManager()","ad994621":"answerDeliveryChallenge(address[2],uint64,bytes32[],uint256[],uint256[2],uint256[2],uint256,bytes32[3],uint8,bytes32[])","ad9a9f17":"SINGLE_BLOCK_LEN()","ad9abf32":"payDividends(uint256,uint256,uint256)","ad9ac1bc":"addToAllocationList(address,uint256)","ad9b4fc5":"Win(address,uint8,uint256,bytes32,bytes32,uint256,uint256)","ad9b8024":"price(address,uint256)","ad9bdebb":"isReleasable()","ad9c280f":"setLoveUrl(string)","ad9d4ba3":"depositEth(address)","ad9df055":"adminClaimAirdrop(address)","ad9e3e85":"My2Token()","ad9ec17e":"setGreyToken()","ad9f20a6":"MIN_PRICE()","ad9f9a68":"withdraw_unclaimed_balance(uint256)","ad9fb75e":"teamDate()","ada0114c":"Firstsale()","ada018e1":"setBurnFeeAbs(uint256)","ada0618a":"CATSPACE()","ada06dac":"tokenSaleCosts()","ada14698":"killSwitch()","ada199dd":"setFoundersTokensPercent(uint256)","ada1a34b":"resetVoteKindnessEvery()","ada1a8f7":"VUP_PER_ETH_ICO_TIER2_RATE()","ada1b74e":"finalTokensIssueTime()","ada1f3ad":"ReferralContract(address,address,address)","ada24dfc":"KeberuntunganAcak()","ada2cced":"getNumberSuppliers()","ada44092":"addClient(bytes32)","ada4c022":"getAvailableWinnings(address,address)","ada5ba01":"getNodeIndexId(bytes32)","ada5cf63":"initializedBlock()","ada636ce":"compareStages(string,string)","ada65728":"Funding_Setting_funding_time_end()","ada69935":"PonicsToken(string,string,uint8,uint256)","ada6b1d9":"collectedCent()","ada6e537":"AuctusBountyDistribution()","ada7061b":"add_hard_limit(uint256)","ada791f9":"Airdrop(address,uint256,uint256,address)","ada8938f":"moedaToken()","ada8a7d5":"presaleTotalNumberTokenSold()","ada8cfcd":"removeUint256s(bytes32[])","ada8e5ef":"IsCanAllotAward()","ada993ad":"Airdrop(address,uint256,uint256)","adaa19cc":"TGMtoken()","adaa3c73":"enableBets()","adaa730e":"RollDice(address,uint256,uint256,uint256)","adaaa1e1":"addThing(bytes32,string,bytes32,string)","adaabaaa":"bonusEndDate()","adabc7f8":"changeTransferStep(uint8)","adacb0fa":"CloseChannel(bytes32,uint8,bytes32,bytes32,uint256)","adaccd74":"getNickname(address)","adad1cb1":"VisperNetwork()","adad4873":"distributePresale(address[],uint256[])","adad6d50":"KujiraFund()","adad9c4e":"increaseMaxCap(uint256)","adadb11f":"setJotter(address)","adadc77f":"unown()","adae08dd":"createItem(uint256,uint256)","adaea0b9":"fund(address,address,bool)","adaf28d1":"whichPeriod(address,uint256)","adaf7c84":"PreICOStartTime()","adaf8c79":"chargeOn(address,uint256)","adb187bb":"validRequest(bytes32[],bytes5,address)","adb1ad42":"HelloGoldToken(address)","adb1cd73":"getUnpaid()","adb1f640":"getScore(uint256,bytes32)","adb27ded":"tokenBonusTimes(uint256)","adb2e02f":"internalRegisterCert(bytes32,bytes,uint256)","adb37277":"setWebsiteUrl(string)","adb3a3a6":"deadlineToFreedTeamPool()","adb42139":"totalCrowdsale()","adb44a32":"updateUint256(bytes32,uint256)","adb4af3e":"getLatestUpdate()","adb4d990":"assigned()","adb506a6":"FACTOR_5()","adb5735c":"withdrawFor(address,address)","adb5777c":"getDrawBlockNumberByWinner(address)","adb5a4f1":"ListReservePairs(address,address,address,bool)","adb5a54d":"eccVerify(bytes32,uint8,bytes32,bytes32)","adb5da34":"_getClientPaidUpTo(address)","adb610a3":"currentNonce()","adb67c41":"XiongDiLianToken(address,address)","adb6859d":"directorTransferShareRequired()","adb6e8f5":"GetDislikeCount()","adb6f63f":"commitments(address,address)","adb746dc":"bltOwned()","adb77576":"etherLeaked(uint256)","adb8249e":"increaseApprovalPreSigned(bytes,address,uint256,uint256,uint256)","adb848df":"NZD_Omnidollar()","adb88cb9":"totalSupplyIco()","adb9066e":"COLDITION()","adba54e0":"commandPercent()","adbc9bed":"getRestWhite(uint256,uint256)","adbd9753":"issuingTokenOwner()","adbda5a8":"voteToKickoffNewFiscalYear()","adbde797":"updateTrustRankAfterStoryExpiry(bytes12,bytes12[])","adbe2f6f":"abortive(uint256)","adbefffe":"getAddressBetsForEvent(bytes32,address)","adbf29fd":"getPlayerDataForGame(uint256,address)","adbf54b7":"initialBalanceForMarketingCampaign()","adc02a64":"addAsset(string,address)","adc042bf":"mint(int256,uint128)","adc06ccd":"batchDoubleBalances(address[])","adc128eb":"Today()","adc1463a":"ZLCC()","adc1b956":"lastClaimed()","adc1db89":"SpaceKIMToken()","adc1f702":"LanaCharleen8()","adc20b1c":"lastMint(address)","adc23f03":"canClientTerminate(bytes32)","adc29028":"calcAndSetPlayerTotalCanAccept(address,uint256)","adc2c98a":"edge()","adc38b2f":"iterateTurn(uint16)","adc4739a":"setWLAddress(address)","adc4f654":"ChargeEnergy(uint256)","adc54d30":"transferFromPresale(address,uint256)","adc6d49d":"_executeTransaction(uint256,address)","adc73d46":"getPlayersOfOwner(address)","adc7d448":"_clearAttackLog(uint256)","adc84a42":"SVEToken()","adc87956":"teamVestTokenAllocation()","adc8b4cf":"empowerAdmin(address)","adc8f941":"addExclusionFromTokenUnlocks(address[])","adc9772e":"stake(address,uint256)","adca32e7":"setFiscal(uint256,uint256,uint256,bytes32)","adca8ac6":"addToTransferWhiteList(address,address)","adcaea0a":"simulated_snt(address)","adcb0993":"LILE()","adcccb6f":"Obirum()","adcd2632":"saleTeamAddress()","adcd4aaf":"sendNegativeWhuffies(address,string)","adcd905b":"setListener(address)","adcde05f":"averageKimSalePrice()","adce1c5f":"ensResolver()","adce80d5":"mStopped()","adcf4831":"registerAuditOutcome(address,bytes32,bool)","adcf59ee":"isOwnerOrOps(address)","adcf780a":"disallowTransferBetweenUsers()","add052b4":"getStateFunding()","add08f87":"coinbaseAmount()","add1cbc5":"TOKEN_TRANSFER_PROXY_CONTRACT()","add2af69":"releaseLockedTokensByIndex(address,uint256)","add37100":"getOrderHash(address,uint256,address,uint256,address,uint256,uint256,address)","add3bf39":"manualTransferTokensToInternal(address,uint256,uint256,uint256)","add3fa39":"sharing_confirmed()","add40ced":"getKeyID(bytes20,uint8)","add43c59":"EtherTopDog()","add466a4":"chfCentsPerTokenWhileBonus()","add4bfb0":"createDragon(uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint16,uint16)","add4c784":"getResult(bytes32)","add54303":"setBlock(uint256,uint256,string)","add5eb02":"setAdminVariables(uint256,uint256,uint256,uint256)","add68daf":"amountOfBidders(uint256)","add7690b":"period0End()","add769a3":"POOToken()","add82871":"strEqual(string,string)","add84df3":"changeGoal(uint256)","add94f25":"IDAP(address,address,address)","add98c70":"dispute(bytes32)","adda1d4d":"receiveListing(bytes32,uint256,bool,address,uint256,uint256)","adda8cf4":"Propvesta()","addace62":"getYesVotes()","addad094":"VLOGS()","addb246b":"MIN_SITE_ID()","addb51ff":"monsterCreator()","addd5099":"oracles(address)","addd7020":"minWei()","adddbacb":"tokenSellCap()","adde36bb":"betEven()","adde61ef":"_isUpdateAuthorized(address,uint256)","added436":"sendFromFund(uint256,address)","addf0813":"withdrawERC20Balance(uint256)","ade05b35":"commissionType()","ade077e3":"Ecoin()","ade0e93e":"withdrawals()","ade2f939":"lookupAllSince(uint256)","ade4637a":"transferFrozen()","ade53c4e":"GenChipsLevel(uint256,bool)","ade5a328":"YYXToken()","ade5e07d":"test_1_validOwner_accessRestriction()","ade60e9a":"modifyOwner()","ade645fa":"bonusPhase2()","ade6e2aa":"expiryTimestamp()","ade716e5":"activatedArbitrationTokens(address)","ade7a3ad":"totalParticipationAmount()","ade7dd7b":"storeInvestment(address,uint256)","adeaa851":"getTotalPrize()","adeb8dec":"setLocks(address[],uint256[])","adeba3a5":"payWithdraw(address)","adebf6f2":"isFungible(uint256)","adec07c7":"setPriceUpdateInterval(uint256)","adec3a92":"totalPonziInGame()","adeca283":"payeeArray()","adee3f4b":"getCodeType(uint256)","adefc37b":"sub(int256,int256)","adefd501":"ledMultiSig()","adf069ea":"startsWith(string,string)","adf07791":"tenant()","adf0c351":"add_participant()","adf13281":"mineFor(address,bytes32)","adf24dec":"setDemurringFee(uint32,uint32)","adf272ab":"vest(address,uint256,uint256,bool)","adf2cead":"mint(bytes32)","adf2d029":"calculateAdminTxHash()","adf2ef99":"ReichaCOIN()","adf2f978":"getCurrentDragonGirlLotteryNumber()","adf403ad":"capitalReserveWallet()","adf46a39":"createContractDank(string)","adf4a144":"startRefund()","adf4fa09":"addPurchased(address,address,uint256,uint256)","adf54e0c":"betOnLowHigh(bool,bool)","adf59f99":"query(uint256,string,string)","adf5d1cb":"YumeriumToken()","adf5e565":"verify(bytes,address,uint256,uint8,bytes,bytes)","adf60404":"THreeDBToken()","adf684ac":"ULChain(address,uint256)","adf6e486":"unPauseToken()","adf70883":"completeUnlockTime()","adf74fc9":"distributeELTCMedium(address[])","adf8a01b":"emitSkillEvaluated(address,address,uint8,uint256,uint256,uint256)","adf8f79d":"LOG_ContractResumed()","adf96752":"trade(address[13],uint256[15],uint8[2],bytes32[2],bytes32[2])","adf9a754":"forwardFundsToOwner()","adf9cd49":"totalWeiCap()","adf9ffea":"lockupOf(address)","adfa1f0c":"Pinged(string)","adfa820a":"deleteBlockState(bytes32)","adfa845a":"test_remove_notInList()","adfaae32":"lastMinedOn()","adfc36a3":"getAssembly(uint256)","adfceb9a":"proxyBuy(bytes32,address)","adfd5380":"preTgeBonus()","adfd7935":"setBridgeNode(address,bool)","adfdb75e":"setRedeemRequestLimitInterval(uint256)","adfdc12f":"createNewGame(string,string,string,uint256)","adfe1190":"components(uint16)","adfe6b80":"InvestAdd()","adfec5f5":"buy(bytes8)","adff2450":"getOuverture_effective()","adff5f36":"PanamavsTunisia()","adffe4db":"setFundingRules(address,bool,uint256,uint256,uint256,uint256,uint256)","adfff41d":"m_Data(address,uint256,uint256)","ae0041aa":"signalCount()","ae005a87":"ERC777DemoToken(string,string,uint256,uint256,uint8)","ae012367":"withdrawTopForTeam(address,uint256)","ae014f1d":"getUserNameByWallet(address)","ae01a8fb":"toCloseVote()","ae01ab47":"setFracoinAuction()","ae01c14f":"SendBid()","ae01dd06":"noteDesignatedReport()","ae01ed8a":"manualWithdrawalFallback(address,uint256)","ae024c40":"isTopic(bytes15)","ae0250c1":"showPoolNumber(address,address)","ae025faa":"newGroup()","ae0269aa":"VirtuePokerSale()","ae02ee5b":"pack(bytes,address,address,uint8,uint256)","ae035846":"END_TIME_SALE()","ae0395ad":"setFriendsFingersWallet(address)","ae03f754":"GongPanToken()","ae040b1d":"get_orderAddress(address,uint256,uint256,uint256)","ae041b90":"WRLCrowdsale()","ae043336":"dolRate()","ae04d45d":"setLockTime(uint256)","ae056477":"addInvestorBalance(address,uint256)","ae06494e":"createHNtokens(address)","ae065737":"tradePreToken(uint256,address,address,uint256,address)","ae06c1b7":"setFeePercentage(uint256)","ae0755d3":"popTransaction()","ae078036":"preICO_tokens()","ae08b8b3":"BUXCOINMONEYCONTRACT()","ae093eb7":"sendICOTokensBack(uint128)","ae0996fc":"getMyEOSKey()","ae0a6b28":"signature(string,bytes32)","ae0aba8c":"acceptPayment()","ae0b4edd":"cancelSellOrder(address[])","ae0b7bdb":"twoWeeks()","ae0bbe4d":"approveRecipient(address,bool)","ae0be41c":"periodPreITO_hardCapInWei()","ae0db13c":"totalBidEth()","ae0e5387":"networkReserveFund()","ae0e8725":"Checkable()","ae0e8f3f":"strategicLockup()","ae0eadbf":"isFirstStageTokensMinted()","ae0f6166":"subtract(int256)","ae101f31":"addStage(uint256,uint256,uint256,uint256)","ae104265":"calculatePrice(uint256)","ae117f3e":"getFSTBalance()","ae11cf73":"isVerfied()","ae11ea9b":"transferChild(address,address)","ae125f00":"mint(uint256,address,bytes32,bytes32,bytes4)","ae1345c4":"CharterCapital()","ae136d62":"firstBonusEnds()","ae13efe0":"batchFreeze(address[],bool)","ae152cf4":"oraclize_query(string,string,uint256)","ae154aab":"passOff()","ae15eb8e":"getCertificate()","ae1616b0":"airdropReserveWallet()","ae169a50":"claimReward(uint256)","ae180337":"withdrawBaseERC20(address)","ae181958":"_setNonlistedUser(address)","ae181f84":"passThroughTap(uint256)","ae188884":"sendOneEtherToMiner()","ae18f5ad":"issueContractAddress()","ae190819":"getBS(bytes32)","ae1a0b0c":"launchLength()","ae1a15e3":"PresaleFundCollector(address,uint256,uint256)","ae1a5611":"ratePerEthPhase2()","ae1a9a3e":"castToUint(int256)","ae1aafb9":"buyPredictForContract(address,uint8)","ae1adba2":"calculateStakeGains(uint256)","ae1b4beb":"buyFactorPromotion()","ae1b6405":"endICOTime()","ae1be1e4":"releaseLockedToken()","ae1c4062":"stopStage()","ae1c9437":"_stringsEqual(string,string)","ae1cad3a":"tip(address,string,uint256,string)","ae1d12a6":"WhyWhyToken(address)","ae1d3043":"teamTimeLock2()","ae1d4b4b":"GambleEther()","ae1dd78c":"sendEtherManually()","ae1e2096":"MAGICCOINERC20(uint256,string,string)","ae1e964e":"newOwnershipFeeProposal(uint256,string)","ae1f14ca":"mainSale_WeiRaised()","ae1f91b7":"updateMinMaxBetCount(uint256,uint256)","ae1fb61a":"TokenTransferProxy()","ae200c73":"joinGameTeam(bytes32,uint8)","ae2022c0":"getUint256Max(int256)","ae203146":"getAccountType(address)","ae2074c8":"addWhiteListAddress(address,address,uint256)","ae20bf15":"claimFreeEggs()","ae224633":"videos()","ae22c1be":"ShowRelease(address,uint256)","ae22e331":"_getCurrentSchellingRound()","ae249f2b":"destroyWhenRoundOver()","ae24e328":"tickerQueryData()","ae25532e":"getProxyId()","ae25753b":"wildcardsHeld(address,uint16)","ae25f630":"DownPlayerResult(string,address,uint256,uint256,uint256)","ae262114":"crowdSaleDragonPrice()","ae263730":"isOperationAllowed()","ae26588c":"removeTrustedContractAddress(address)","ae277584":"amountToSend()","ae27e3c6":"relu_activation(int256)","ae28b68c":"safeTransfer(address,uint256,uint256,bytes)","ae28e912":"teamTokenAmount()","ae2a0ce3":"JustinsToken()","ae2b4e16":"getBalanceInRemix(address)","ae2b5d3b":"_emitCountryCodeAdded(uint256,uint256,uint256)","ae2bd2bd":"clearAuction(address,address,uint256,uint256)","ae2c1506":"getRoundNumberOfBets(uint256,uint256)","ae2c923c":"OlympusLabsCore(address)","ae2cbc91":"Tradable()","ae2da5c5":"getLLV_edit_20()","ae2df7b3":"setImporterBank()","ae2e054c":"closeOrder(uint256,address)","ae2e933b":"feePool()","ae2f1f6f":"calculatePayerDeposit(uint256)","ae307098":"c_MinInvestmentInCents()","ae30d35d":"ARK_TROGLOg_1_00()","ae3125d9":"showTokenSaleClosingTime()","ae319f60":"_updatePurchasingState(uint256)","ae31deb9":"burnCrowdsale()","ae326221":"setSpawnProxy(uint16,address)","ae327322":"cantSetReferrer()","ae32ac7e":"TEAM_LOCK_DURATION_PART2()","ae32c399":"lastBlock_f1Hash_uint256()","ae353131":"BiquToken(uint256,string,string)","ae35707d":"sectionForSale(uint256)","ae35d21a":"CollectibleBidWithdrawn(uint256,uint256,uint256,address)","ae366735":"EQUIPMENT_REWARD_WALLET()","ae36c602":"createPromoItem(address,string,uint256)","ae36f6f9":"_batch4_rate()","ae382baa":"GainCard(address,uint32)","ae39279f":"sendFee()","ae3b2137":"getRoomSetCount(uint256)","ae3b748d":"setMinCap(uint256)","ae3b94b2":"_minimumTokens()","ae3baf4d":"mintableAmount()","ae3c697c":"getMyAvailableWine()","ae3d27ed":"Token_For_Circulation()","ae3d5047":"_changeSymbol(string)","ae3d7160":"compareByte(string,string)","ae3d81b8":"allowedJurisdictions(bytes32)","ae3f4a6c":"test_3_method()","ae3f84f3":"proofMultiSig()","ae3fc899":"CheckExchange(string)","ae404996":"oraclize_query(string,string[3],uint256)","ae40f72f":"testAdd()","ae41480b":"importEthers(address)","ae422c09":"sys()","ae42ce85":"update_oracalize()","ae436b5e":"getLimitedReporterMarketsCount()","ae44dea2":"bytesToUInt(bytes,bytes32)","ae44e840":"priceConfirmedOver500()","ae4538ce":"walletCompanyReserve()","ae457835":"buyTokensFor(address,uint64,uint256,uint8,bytes32,bytes32)","ae457dab":"bonusEnds20()","ae45850b":"schedulerAddress()","ae458ab6":"approve(uint64,address)","ae466db7":"withdrawPenaltyTokens()","ae46e284":"setPortfolio(uint256,bytes32[],uint8[])","ae479a63":"badgeSymbol()","ae47a290":"changeMaxBet(uint256)","ae487dad":"reset(uint256,uint256,uint256,uint256,uint256,uint256)","ae49165a":"getAncestor()","ae49a717":"EVNT()","ae4a7512":"mintICOTokensFromExternal(address,uint256)","ae4a8c88":"claimLoot(uint256,address)","ae4aadbb":"showTransferConfigs()","ae4ab7ce":"Put_DEDI_gift(address)","ae4ac63e":"STANDARD_BUYIN()","ae4b1b5b":"proxyStorage()","ae4b5cb8":"collectDonations(uint256,address)","ae4b76fe":"_createPiranha(string,address,uint256,uint8,uint256,uint8,uint8)","ae4c20af":"increaseICOcap(uint256)","ae4c5e45":"setStarNewOwner(uint256,address)","ae4cc757":"closeEarlyPurchase()","ae4d0ff7":"gen0StartingPrice()","ae4d1af6":"setup(bytes32,address,address)","ae4d42b8":"ptxTail()","ae4d503b":"withdrawOtherERC20Balance(uint256,address,address)","ae4e7fdf":"isMature()","ae4eba1f":"setOldE4(address,address)","ae4f1198":"publicationFeeInWei()","ae4f1476":"searchSeed()","ae4fbdeb":"LastValidated()","ae501c75":"LogLotteryResult(uint32,uint8,bytes32,bytes)","ae50d660":"setFilletPrice(uint16,uint16,uint8,uint256)","ae5103e8":"preSaleFourthPrice()","ae516449":"uintCeil(uint256,uint256,uint256)","ae51c484":"a(bool)","ae51db0d":"VesaStage2PreICO()","ae52026f":"icoSoftCap()","ae529499":"CurrentARXSupplyInWei()","ae530504":"setSetting(string,uint256)","ae53d79e":"ICO_PRICE7()","ae5409fb":"seedInvestorsReserve()","ae55c888":"getData(string)","ae55f1af":"artWorkChangeApprove(uint256,uint256,bool)","ae56e668":"setUnlockAddress(address,bool)","ae5942cd":"deletePermissions(address[])","ae59bd5a":"mintManually(address,uint256)","ae5a1460":"NewDigitalAsset(address,address)","ae5a17a7":"updateCharityAddress(address)","ae5a4a7f":"maxBatchAssignment()","ae5a9bb4":"operatorTransfer(address,uint256,bytes,bytes)","ae5a9d17":"getCompletedTransactions()","ae5adac7":"mintInCurrPeriodCount()","ae5b2540":"setApp(bytes32,bytes32,address)","ae5b6d89":"submitSteak(address,bytes32)","ae5c1816":"CreateKittyToken(address,uint256,uint32)","ae5c24bd":"getFirstElement()","ae5c37fd":"contributionsByIntel(uint256)","ae5c3f14":"getVipBrokerNum()","ae5c75aa":"getBadgeByKtUserId(uint256)","ae5c888d":"month60Unlock()","ae5d2cbe":"_getOwnerTokenByIndex(address,uint256)","ae5da7a0":"_generateGame(bytes32,bytes32,address,uint256[10])","ae5dbd43":"view_get_ResultData()","ae5e6cf4":"cancelReservation(uint256)","ae5ec2e9":"matching()","ae5f502e":"RoundSubmission(uint256)","ae601e4d":"IADForGas()","ae602223":"standFeeAfter500()","ae610b48":"sign(int256)","ae61fcda":"isEthernautsStorage()","ae6215d8":"getBlockHeight(bytes)","ae622c4b":"addToInxWhitelist(address)","ae62fd7c":"setCrowdSale(bool)","ae639329":"sendTo(address,address,uint256)","ae63b517":"ADVISORY_BOARD_TOKENS()","ae640923":"playerEndGame(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes)","ae6439c4":"icoSaleSoftCap()","ae6506f9":"getCurrentTierIndex()","ae665d5d":"MooguToken()","ae66d948":"getWithdrawn(address)","ae6751e2":"EmilTestCoin()","ae67701f":"ZperPreSale(address,uint256,uint256,uint256)","ae67b4c3":"evolveAxie(uint256,uint256)","ae68c80a":"AddRocket(uint32,uint64,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint64,uint32)","ae68fb83":"creditShareProvision(uint256,uint256)","ae69a893":"getHeirCount()","ae69ccdc":"GMSToken(uint256,string,uint8,string)","ae6a19af":"tokensSoldLimit()","ae6a1c30":"setApprovedWallet(address)","ae6a2435":"HOST_CUT()","ae6a70ee":"_tokenMetadata(uint256)","ae6b0792":"paymentManager(string,address,string,uint256,uint256)","ae6c0b03":"canWithdrawBond(uint256)","ae6caafd":"buyByBot(uint256,uint256,address)","ae6d8a52":"viewFourthLotOfClauses()","ae6dca72":"_allocate(address,uint256,uint256)","ae6e11dc":"terminateTokenLock()","ae6e22f1":"totalEther()","ae6f1db6":"payableFinneyReceived()","ae6f5bd2":"_calResultReturnIsWin(uint256,uint256)","ae702ba4":"isSubscriptionActive(bytes32,uint256)","ae70609e":"LogResult(uint256,address,uint256,uint256,uint256,int256,uint256,uint256)","ae708e7c":"totalConsideredFundedEther()","ae71d5da":"initProceeds(address,address)","ae721e45":"fetchOrdersForPayerByAdmin(address)","ae748575":"CGCM()","ae748837":"addTestimony(address)","ae75c4f7":"rewardsTokensVault()","ae75f9e6":"mock_resetLatestTokenAllocation(address,address)","ae76145d":"SEXcoin()","ae7635f2":"icoEndUnfrozeTokens()","ae764df3":"ICOWallet()","ae775b27":"betOnDozen(uint8)","ae77a6f4":"goldBalance()","ae77c237":"purchase(uint256,address)","ae77d51f":"m_chiefOwnerIndexBit()","ae788913":"AIHToken()","ae788b34":"ILFManagerCandidate()","ae799f4a":"TokenERC20(string,string,uint8,uint256)","ae7a45ba":"addZethrAddresses(address,address)","ae7a833d":"hydroContract()","ae7ad3fd":"setUpgradeabilityOwner(address)","ae7b0333":"executeOrder(address,uint256,uint256)","ae7b1620":"rushTimeChallengeRewardsPercent()","ae7b3825":"exchangeForETH(uint256)","ae7b6bd9":"getLatitude()","ae7b6daa":"numberOfCellsOwnedBy(address,address)","ae7c046b":"applyAllPermission(address,address)","ae7d00f3":"validationPrice()","ae7d0cac":"addShare(address,uint256,uint256)","ae7e23cc":"otherCoinsPurchase(bytes32,uint256)","ae7ed04c":"getLastBidForCanvas(uint32)","ae7f5da4":"lockPeriod2()","ae7fa597":"removePrize(uint16,address,uint256)","ae7fc1da":"_randMod(uint256,uint256)","ae7ffadc":"Bitway()","ae813029":"makeBid(uint16,uint256)","ae813ebb":"TokenFactoryAirdropCoin()","ae815843":"query(uint256,string,string,uint256)","ae817dd1":"doSendBounds(bytes32)","ae818340":"getProfiles(address[],string[])","ae81a54b":"factTeamOf(uint256)","ae81f51b":"mintTokens2(address,uint256,uint256)","ae8205e3":"insert(bytes32,int256)","ae82fcf4":"teamLocked()","ae83ed91":"HashBlock()","ae8421e1":"done()","ae850da9":"getNumberSources(uint256,uint256)","ae873405":"AVG_BLOCKS_24H()","ae873fa5":"PRESALE_MAX_RAISE()","ae87fc4b":"claimStatus()","ae87fd06":"gasPriceLimit_()","ae882412":"getTotalDivsProduced()","ae882cf1":"allowSpecies(uint16,uint16,address)","ae896b2e":"TPN()","ae89a29e":"maxHolderCount()","ae89aeb9":"getEscrowData(uint256)","ae8a6833":"InitialSettings()","ae8a7180":"setStartOfCrowdsale(uint256)","ae8a8690":"createActivePreMintedEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256,uint256)","ae8b9d7b":"autoSolveGame(uint256,uint256,uint256)","ae8bce2c":"product1_pot()","ae8cdd59":"IBTC(uint256,string,string)","ae8dab48":"setUp(address,address,address,address,address,address,address)","ae8e2217":"SmartexController()","ae8e3b70":"Fin()","ae8efe46":"CheckEntity(bytes32)","ae8f1d29":"createPermission(bytes32,address[],bytes4[])","ae8f2328":"finishcrowdsale()","ae8f6489":"createAndBuyAllAmountPayEth(address,address,address,uint256,address)","ae9074ff":"internalSuccessOver()","ae90b213":"payee()","ae90e9f8":"returnToBuyersContinue()","ae91b691":"changeRefPercentage(uint256)","ae92b204":"getCurrFeeRate()","ae93e513":"cancelOfferForCity(uint256)","ae94bbf1":"getCarDetails(uint32)","ae94e448":"imax(int256,int256)","ae94ec05":"placeBuyTokenOrder(uint32)","ae954790":"Authorizable()","ae9569d0":"PLATPriceOracle()","ae95a7a4":"TacoToken(address,string,string,uint256,uint256)","ae95c24e":"issueMap(address)","ae96b094":"VergeDark()","ae96bf2c":"TakePot()","ae9759ff":"PRICE_MULTIPLIER_ICO2()","ae978f08":"getLatestTweet()","ae97dde8":"MAX_COMMISSION()","ae989d36":"homeTeam()","ae99847b":"daylimit(uint256)","ae999ece":"reserve(string)","ae99aa3c":"getMemberInfo(uint256)","ae99f03c":"SetAddresses(address[],address[],address[],address[])","ae9a0785":"getChannelPostCount(address)","ae9a9295":"YKC(uint256,string,uint8,string)","ae9aea6d":"maxMintQuantity()","ae9b051c":"withdrawSome(uint256)","ae9c1962":"withdrawCommunityPot()","ae9dc04c":"offerSketchForSaleToAddress(uint256,uint256,address)","ae9f96c7":"weightsApportion(uint256,uint256)","aea01c49":"stringToBytes(string,string)","aea09e6e":"crowdfundStartTime()","aea0e35f":"createMarket()","aea13844":"safeGiveByContract(uint256,address)","aea1935b":"confirmEndWork(uint256)","aea197fe":"CreateRecipt(string,uint256,string,string,string,string,string,uint256)","aea31fc7":"setProof(string,string)","aea398da":"paymentWalletAddress()","aea3ad8c":"supportKickoffQuorum(uint256)","aea40787":"SetOwned()","aea43a29":"addMassAddressToWhitelist(address[])","aea452ba":"isBinding(uint16)","aea48690":"incentivisingEffortsSupply()","aea57be4":"resumeIEO()","aea5b69f":"solutionInfo(uint256)","aea6022c":"change_metadata(uint256,string)","aea64763":"stopsale()","aea68d6b":"Shakedown0x()","aea6e1a4":"buyAnotherDrangon()","aea787a2":"showleveldetail(address)","aea8126f":"transferMSM(address,uint256)","aea8d47c":"getLatestContract(bytes32)","aea8dcca":"setTokenInfoMaxTotalImbalanceList(uint256[])","aea92852":"getDevIndex(address)","aea96513":"returnSecretVoteHash(uint256)","aea9b438":"getBuyerInstanceAddress(address)","aeaa3091":"getDealerValue(uint8[],uint8)","aeaaaa08":"proxyClaimTokens(address)","aeaabffe":"UnlockAll()","aeab24df":"reinvestDivsWithContract(address)","aeac3354":"Deal(address,address,address)","aeac529a":"TradingLife()","aeac538a":"ClimateCron()","aeaca25e":"getTotalJadeProduction()","aeacd658":"signProduct(string)","aead9e47":"claimAndWithdraw()","aeadbe24":"getTotalTokens(address)","aeae264b":"BeteventCrowdsale(uint256,uint256,uint256,address,uint256,uint256)","aeaf5a37":"total_land_sold()","aeaf7fc1":"updateCandidate(address,bytes32,bytes32)","aeb00fda":"_getRacerCar(uint256)","aeb1355f":"getH2Amount()","aeb26733":"previligedApprove(address,address,uint256)","aeb27602":"addHash(string)","aeb2ffc1":"getQuery(uint256)","aeb37075":"DividendPaid(uint256)","aeb3ebd0":"LogContributorsPayout(address,uint256)","aeb447ff":"getLevelUpCost(address,address)","aeb47e2a":"COMMUNITY_POOL()","aeb4f0d3":"RegisterTwo(address,address)","aeb58dc5":"setPOOL_edit_15(string)","aeb669eb":"getHatchingEggId(address)","aeb754e5":"Auction(address,uint256)","aeb7614c":"bid(bytes32,bool,int32)","aeb7dd80":"_computeCurrentPrice(uint128,uint128,uint40,uint40)","aeb817ab":"etcSupply()","aeb89f14":"totle()","aeb8f966":"mintToken(address,uint256,int256)","aeb94f48":"getFreePacifist()","aeb9c40e":"isReadyToStart(uint256)","aebacd53":"PRE_BONUS()","aebad3a4":"getCaptainCount(uint32)","aebb2540":"setNewMultisig(address)","aebc0310":"updateOdds(uint256,uint256)","aebcd2d9":"AddSocialAccount(bytes32,bytes32,bytes32,bytes32)","aebd3f96":"receiveToken(address,uint256,address)","aebd4fcd":"shopStoreRegister()","aebe0224":"CollectibleTransfer(address,address,uint256,uint256)","aebe5523":"addTokenWalletInWhitelist(address)","aebf1e3d":"computeTokens(uint256)","aec02eb5":"ServiceContractResolver(address)","aec1914d":"surrender(bytes32)","aec1dd81":"updateNonClosingBalanceProof(address,address,bytes32,uint256,bytes32,bytes,bytes)","aec1ee7b":"STAT_MAX_VALUE()","aec205a5":"contractLaunched()","aec26c0e":"setLoanParameters(address,bytes32,uint256,uint256,uint256,uint256,uint256,string)","aec2f2d9":"first_bonus_duration()","aec30dc1":"minWeightPunish()","aec318f1":"enableMasterTransfers(bool)","aec3ab53":"_futureSupply()","aec4e0bb":"numberOfPunksReserved()","aec5ab08":"getAllDapps()","aec651fb":"getUserTokensByMatch(address,uint32)","aec72d8d":"STAGE_3()","aec77b63":"returnTokensInPool(address[],uint256[])","aec7f5b2":"JoustNum()","aec7f6f3":"compoundInterest(address)","aec8fae8":"getMemberAtKey(uint256)","aec9a987":"claimShare(address,address)","aec9c480":"includesSet(bytes32)","aecadd53":"grantTeamToken()","aecaf4ba":"addMoneyInternal(address,uint256)","aecbaaa1":"LogPayout(address,uint256,uint256)","aecbb5f1":"winAmount1()","aecbf70c":"Kisaan()","aeccee75":"_register(address,uint256,address)","aecd15e3":"getWithdrawalWallet()","aecd1fed":"setupToken(address,address)","aecd27fa":"linkCoin(address)","aecd46db":"testDepositCanbeWithdrawn()","aecdceef":"intToBytes(uint256,uint256)","aecfd412":"Group_2()","aed214fb":"setBooleanMapValue(string,address,address,bool)","aed29d07":"totalRewarded()","aed2e7d4":"addGen(uint256)","aed339ef":"storeHarvestOperation(bytes32,address,string,string,uint32,uint24,uint16,string)","aed362c1":"hasModerator()","aed396c6":"setStageBonus(uint256,uint256)","aed3ebe4":"TokenBCCO(uint256,string,string)","aed4839a":"transferFrom(uint256,address)","aed4aab6":"receiveERC20(address,uint256)","aed5c011":"payWithMerculet(uint256)","aed6512e":"callerAdd(address)","aed6d8d4":"GetStuffNum(address,uint32)","aed76aa4":"getInvestorDepositAmount(address)","aed82a99":"sin_table_lookup(uint256)","aed83846":"removeFromPrivateSaleWhitelist(address[])","aed89fed":"projectContract()","aed8e967":"getEndpoint()","aed8f3da":"partsPerBillion(uint256,uint256)","aeda10be":"ethselfToken()","aeda352b":"hasName(address)","aeda852f":"houses(uint256)","aedb1c8f":"executeContract()","aedb8621":"TMONEY()","aedb9eef":"LDXCToken(uint256)","aedbbf36":"deleteNote(uint64)","aedd18dc":"timeout(address)","aedd3acc":"currentSTCPrice()","aeddaa02":"DelVer(address,address)","aeddab95":"batchUnmount(address,uint256[],uint256)","aeddf677":"lockLimit()","aede4680":"firstReserveWallet()","aede879d":"whatIsMissing()","aedf5360":"icoCrowdsaleContract()","aee06324":"trickleUp()","aee0abaa":"authorizeMany(address[],uint256)","aee145f7":"addressReserve()","aee1b8a1":"XBStandardToken(uint256,string,uint8,string)","aee1d4d3":"blockCreationRate()","aee25613":"sendErc20(address,address[],uint256[])","aee2988d":"addressOps()","aee2dbbf":"getSaleOrdersBySeller(address)","aee338ef":"referalAddrByNum(address,uint32)","aee36731":"OrderApprovedPartOne(bytes32,address,address,address,uint256,uint256,address,uint8,uint8,address,uint8,bytes)","aee40270":"AddAddressToWhitelist(address)","aee4c502":"test_remove()","aee7052e":"startPhaseLength()","aee776ae":"stnExchange(address,uint256)","aee7e176":"finalBonus()","aee83b61":"TASOHATOKEN(uint256,string,string)","aee84f6b":"setTime(address,uint256)","aee8a3bd":"add2Auction(address,uint256,uint256,uint256,uint256,uint256)","aee92d33":"approveByLegacy(address,address,uint256)","aee98408":"versionIndex(bytes32,bytes32)","aee99e52":"getPresale()","aeeb96af":"Highlander()","aeec9ba0":"UpdateManifesto(uint256,bool,bool)","aeedc9e9":"GroupBuy()","aeeed0db":"buyXaddr(address)","aeefb9d1":"distributeEDNR(address[])","aeefb9eb":"PixelToken()","aef0004a":"outputAddress()","aef08617":"limitTier3()","aef093ce":"Doge2Token()","aef0ef2e":"test_validShouldBe3_2()","aef1b9b5":"test_threeInvalidFalseEqLog()","aef251a7":"tokenCtr()","aef3575e":"HandWinsView(address)","aef35e6a":"stage2Sale()","aef37284":"getReservedTokensListValInPercentageUnit(address)","aef3bc17":"getMemberInformation(uint8)","aef3fa6c":"AFROIN()","aef41e3a":"getItemIdsPagable(uint256,uint256)","aef5cbee":"VICToken()","aef5ddec":"Paper(string,address,uint256,uint256,address[],address)","aef721b8":"createSwap(uint256,uint256,address,address,address)","aef76dda":"createPresale(address,uint256,uint256)","aef7ad9c":"getSchellingRoundDetails(uint256)","aef88aba":"DDJATCoin()","aef8a536":"SCNToken(uint256,string,string)","aef95098":"setUrl(uint256,string)","aef983d0":"getDigitFromByte32(bytes32,uint8)","aef99eef":"Game()","aefa573d":"genCode()","aefa68f0":"ifInAllowedLocks(uint256)","aefa7550":"read_u32()","aefa7d98":"getContractAddress(uint256)","aefaacda":"finalTimeout()","aefb1643":"ownerSetPaused(bool)","aefb2dad":"ticketsFor(uint256,address)","aefb658e":"playerDayEthInLimit_()","aefbbf2a":"BANKROLLER()","aefc4ccb":"associatedContract()","aefc8c72":"unsealBid(bytes32,address,uint256,bytes32)","aefd0299":"makeWager()","aefe5ee0":"cashOutTank(uint256)","aefe696b":"changeColorPink()","aefe9ca0":"s40(bytes1)","aefea053":"timelockVault()","af0062e4":"sellable_tokens()","af00be12":"_sendToken(address,uint256,bytes)","af017526":"whitelistAddress(address,bool,uint256)","af01841e":"getownership(uint16)","af01866d":"insertSchedules(uint256,uint32[],uint256[])","af023335":"burnSynths(bytes4,uint256)","af02d47b":"currentBonusPercent()","af030d2c":"setResult(uint256,uint256,bytes32)","af03105b":"depositMintSince(address,uint256,uint256,uint256)","af0396ae":"PLDT()","af03e856":"MockUpgradeableToken()","af047106":"sumPreICO2()","af049ea9":"testFail_interface_call()","af04d0c0":"Deal(address,uint256,uint256)","af053b71":"CostToken()","af05fa10":"upgradedVersion()","af05fc63":"mulpow2(uint256)","af0638f6":"currentMaxPurchase()","af079dec":"setHardwareWallet(address)","af07c768":"Arte()","af080014":"nameChange(string,string)","af086d6f":"setTestVar(uint256)","af08e1ad":"get_arbits_presale_open(address)","af093f9c":"specificBatchCheck(uint256)","af09420b":"_addStackholder(address)","af0a078e":"tHasUpvoted(uint256,address)","af0aba4e":"setExpirationRequest(uint256)","af0ac4b7":"submitNextStage()","af0b4cc0":"minerTotalTime()","af0b7029":"KYCApprove(address[])","af0bbfb8":"registerEndpoint(int256,string)","af0bdb38":"to(address,bytes)","af0c09db":"getChosenNumber()","af0c9259":"Total_SoldToken()","af0cfe1f":"addArticolo(bytes,bytes10,bytes10,bytes)","af0def14":"startWonderAuction(string,address)","af0dfd3e":"blockPeriod()","af0e7ba3":"LeanFund()","af0eec40":"assignWarriorsToBattle(address,address,uint256,uint256)","af1034ab":"addUpdateGrantee(address,uint256)","af106b10":"oracCost()","af107749":"m_emissions(uint256)","af10b8cf":"totalBooty()","af10c810":"turnOff()","af123fe7":"makeDeposit(address,address,uint256)","af129dc2":"numTokensTotal()","af135ff5":"getMemberInfoLength()","af136dea":"setCheckInPeriod(uint256)","af1380ad":"_getTournamentBattles(uint256)","af13f1ad":"forSaleSupply()","af1484d0":"setForkReputationGoal(uint256)","af157c19":"getContributors()","af164016":"PersonalTime(address,uint256)","af16972c":"mining(uint256,bytes)","af1747aa":"checkDeck(bytes32,uint8[],bytes32)","af17dea6":"symbol_()","af191aa5":"isCertificateRegisteredAndValid(address)","af19f0d1":"CoinPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256)","af1af4df":"feeBurnerWrapperProxyContract()","af1b5feb":"addWeiRaised(uint256)","af1b7d90":"take(uint256,uint256[4])","af1c084d":"adminName(address)","af1c7940":"fiatInvestorShare(address)","af1cd6d3":"test2(uint256,uint32)","af1cd9f6":"getGGCTokenBalance(address)","af1d06e8":"validateSignature(bytes32,uint8,bytes32,bytes32,address)","af1e19d9":"getPlayers(bytes32)","af1ee630":"getBdpOwnershipStorage(address[16])","af1ff972":"rateForCurrency(bytes4)","af2096ef":"MAX_PUBLIC_SOLD()","af20b964":"maximumFundingGoalInETH()","af21037f":"clearStartTime()","af224bdc":"parseAndStore(bytes)","af225fd6":"get_last_user_recast(bytes32)","af22fd8e":"NtsToken()","af23e1f1":"returnForMint(uint256,uint256,uint256)","af24cba2":"setLastAction(uint256,uint256,uint8)","af24d25c":"openTransfer()","af250a5e":"calculateAndTransferTokens(address,uint256)","af259886":"userToNumVillages(bytes32)","af261875":"t_ImmlaBountyTokenDepository()","af263ec9":"HomeToken(string,string,uint8,uint256)","af269745":"upgrader()","af2759f7":"timeUntilClaimAvaliable(address)","af2768ec":"commitMove(bytes32,bytes32)","af2780ee":"PERIOD_BLOCKS()","af27c7b3":"Security_HasPasswordSha3HashBeenAddedToBankAccount()","af28059d":"ChangeItemPrice(uint256)","af2885b2":"minimumEtherCommission()","af28a537":"totalRoundSeedAmount()","af299510":"HasBooster(address)","af29e720":"remainingGasFund(uint256)","af2a7fb2":"Brewers()","af2b114a":"Erc20SupplyToken(uint256,string,uint8,string)","af2b1925":"MarmotToken(uint256,string,uint8,string)","af2b2e5c":"ReVo()","af2b76ab":"airDropHero(uint16)","af2bf027":"minMaintenanceMarginAmount()","af2e285c":"setBidState(bytes32,uint8)","af2e2da9":"getValidatorName(address)","af2f0c46":"SupportComponent(uint256,address,uint256)","af2f9105":"_performWithdraw(address,address)","af2fa91c":"otherCurrenciesChecker()","af2fcc17":"globalMinPurchaseAmt()","af303a11":"salvageTokens(address,uint256)","af304bab":"getPriceByCredentialItemId(address,bytes32)","af30e4d6":"Log2(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256)","af30e9f7":"transferICOTokens(address,uint256)","af30ee3f":"GOD()","af310f02":"NotCoin(string,string,uint8)","af314579":"isDayFirst()","af31f49b":"startNextAccountingPeriod()","af3309d8":"heartbeatCount()","af339ee4":"convertLotById(bytes32)","af33f8a5":"Order_execute(address,address,uint256,uint256)","af35314a":"INITIAL_TOKEN_FROM_COMPAIN()","af356eee":"preicoContractAddress()","af35ae27":"getRemainingTokens()","af35ae3e":"setSaddleShopSaleFee(uint256)","af35b3f1":"why()","af35c6c7":"enableTransfers()","af35dac2":"convertToCents(uint256,uint256,uint256)","af36778b":"aggregate()","af36e7a7":"removeUserWhitelist(address[])","af371115":"findCertificate(bytes)","af375838":"addBurnupGame(address)","af378ce5":"bust(uint256)","af38d757":"claimable()","af3996c3":"fourthStageMinted()","af3a4feb":"LOOMIA_LOOMIA_REMAINDER_ADDR()","af3cc6be":"MoxianCoin()","af3d8e43":"preICOTokenDelivery(address,uint256)","af3dc180":"ecosystemBuildingWallet()","af3e8a40":"orderMatch(bytes32)","af3f0ebe":"c_startTime()","af3f12bc":"profitSharingContract()","af408d89":"setStatus(bytes)","af40ce20":"revokeUnicorn(uint256)","af40dd2f":"AccessToken()","af418e4c":"setReclaimPeriod(uint256)","af422cce":"marketSellOrders(uint256,bytes[])","af42d106":"setKey(string)","af431f03":"setUser(address,string,uint256)","af43f597":"get_amount_minus_commission(uint256)","af448721":"refundMe(address,uint256)","af44e487":"overdraftPeriodsNumber()","af45118e":"createProposal(address,bool)","af45de05":"disableDonation()","af463d2a":"CentaToken()","af468682":"startsAt()","af46aa08":"stakeBalanceOf(address)","af475a9b":"setUSDPerETH(uint256)","af477528":"addMetadataObject(string)","af47c1af":"getActionByIndex(uint256)","af481be8":"mint(string,uint256,uint256,uint8,string)","af488ca3":"setLiquid(bool,uint256,bytes)","af489d5a":"_moveBalance(address)","af49a228":"DeshiCoin()","af49e321":"getHolderLimit(address)","af4a2984":"createPrizePool(uint256[])","af4a822d":"getCurrentTrancheIndex(uint256)","af4b382d":"PaquariumToken(uint256,string,uint8,string)","af4b3cab":"delBounty(address,address,uint256)","af4bed26":"setExchangeRateByOraclize(address,bytes32,string)","af4c14ee":"setAddressWhitelist(address,bool)","af4c2288":"getNumAcceptance(address)","af4c3d1d":"BPofMakerByIndex(address,uint256)","af4c6838":"tokenDeposited(address)","af4c9b3b":"withDrawalether(uint256)","af4cd457":"getOrCacheValidityBond()","af4d723c":"Libidocoin()","af4e3d37":"withdrawReservedTokens()","af4e4494":"TANKER_TYPE()","af4e99de":"getGameData()","af4fd9e7":"setValidLockingAmountToPeriod(uint256[3],uint256[3])","af500fb7":"readBytes32(bytes,uint256)","af50e0d3":"DeDeMasterContract(address)","af5177b1":"calcDrawCode()","af519bf5":"doesProofExist(uint256,bytes32)","af5260bf":"finalTime()","af52fbed":"retrieveWineData(bytes32)","af53dc6e":"contractbacklist()","af54e324":"upgrade_self(address)","af55bba0":"removeRegistryFromTagsIndex(address)","af5610dd":"isThisPreforkVersion()","af567633":"minPresaleWei()","af574319":"UpgradeProposal(address)","af577c4c":"unlockReserve()","af57d236":"STAGE_2_TIME()","af580d2c":"getPurchaseById(string)","af58574a":"getTierPosition(address)","af589421":"callerAdded(address)","af589572":"getAssetIdTripStartTime(uint256)","af58eda8":"findSeedAuthorized(address)","af598bc7":"winnerOf(uint256,uint256)","af599a8d":"_depositTokens(address,uint256,address)","af59c789":"setVendingAmount(uint256,uint256)","af5a3db8":"finaliseVoting(uint256)","af5a7625":"getFundInfo(bytes32,string,address)","af5b065a":"getMinimumPurchase()","af5b0ece":"getAmountContributed(address)","af5ba32a":"_fund(uint256,address)","af5c1020":"InfinityDataChain()","af5c295a":"checkMaxAllowed(address)","af5c4540":"getVoteTokens()","af5c6f38":"synthesize(uint16[5],uint256)","af5cfae8":"remainingInvestment()","af5d4013":"toteLiquidatorTranserComplete()","af5ee700":"buyTokenPerEther()","af604173":"ico_startTime()","af608fad":"isTimelockAllowed(address,address)","af60b50f":"CGCoinsToken()","af60dc4f":"SCMOXToken()","af6128c2":"calcTotal(uint256)","af62a708":"getCrystalKindWeight(uint256)","af62cfd2":"endBetBlue()","af63066e":"userRound(address)","af6337fd":"pausecontract()","af6375cd":"setNewStartTime(uint256)","af63da13":"getMemberRegistry()","af640d0f":"id()","af6499c5":"ActiveDigger()","af653861":"applyAndLockSettings()","af664f3a":"Bitkat()","af6682ab":"query(uint256,uint256)","af66c560":"convertData(bytes)","af66eb1f":"LogWithdraw(address)","af67cdc4":"HBToken()","af685482":"BonusChanged(uint8,uint8)","af68dd3f":"getBaseInfo(uint256)","af692e00":"getPullRequestById(bytes32)","af6972c0":"submitDeliveryCommitment(address[2],uint32,uint64[3],bytes32[],bytes32,uint256[2],uint256,bytes32,bytes32,uint8)","af6a2c5c":"JTCCtoken(uint256,string,string)","af6afce5":"min(int256[])","af6b08a1":"Sale(address,address,uint256,string,uint8,string,uint256,uint256,uint256)","af6b3615":"getInitialReportStakeSize()","af6b3d43":"roundSwitch()","af6bb824":"_cancelSale(uint256,address)","af6bd8ce":"durations(address)","af6c0f60":"bntToken()","af6c3021":"MaxReleasedBac()","af6c7f77":"crowdSaleStartTime()","af6cd244":"acceptAnswerAndFinalize(uint256,uint256)","af6d0437":"AtomicSwapRegistryConstructed()","af6ddad8":"shift_left(uint256,uint256)","af6df563":"withBonus(uint256,uint256)","af6e66e6":"Lockup36m(address)","af6f37a2":"getBasicTokenAmount(uint256)","af6f964d":"minReached()","af6fae22":"roomAvailable(string,uint256[],uint256)","af6fce9a":"RoyaltyInformationContractSet(address,address,bool)","af6fe8e2":"testGetToken()","af713566":"batch()","af713dda":"SUPPLY_FOR_PARTNERSHIPS()","af722ea7":"connectors(address,address)","af7296ec":"remainingBankroll()","af737da7":"_setClientLastPaidRate(address,uint8)","af738bbf":"setDepositoryDelegate(address)","af7520b9":"startingPriceOf(uint256)","af75ad2d":"createDispute(address)","af7665ce":"ethPriceFeed()","af769b54":"transferAcceptable(address)","af769eff":"Paper()","af76c4d2":"mined_blocks()","af76ccd7":"finishedPromotionIDs(uint256)","af77040e":"bonusIncreasePercentage()","af77649d":"paySmartContract(bytes32,uint256)","af77c473":"p_setGamePaused(bool)","af77ebee":"transfersOnOff(uint8)","af77f8bd":"setVIPBonus(uint256)","af7885b5":"listSubName(bytes32,uint256,uint256)","af78facf":"valueBonuses(uint256)","af7912a1":"bonusTake()","af791df2":"recoveryDone()","af794a4f":"tulips(uint256)","af79b437":"MintingDisabled()","af79ffde":"userInitialized()","af7a0899":"firstStageWallet()","af7a1762":"getBetfundingAddress()","af7a6164":"setMaxMessagesGlobal(int32)","af7b2eb7":"listAddresses(address[],uint256[])","af7bcf5e":"LigoToken(uint256,string,string)","af7bfd6c":"setValueAny(uint256)","af7c8f96":"changetokenBurnAddres(address)","af7d0eff":"setSellPrices(uint256)","af7d1890":"adminAddICO(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","af7d4b21":"RXPSale()","af7d5ebe":"change_p4(uint256)","af7d697e":"EnableTransfer()","af7d6ca3":"spend(address,uint256)","af7e8577":"TCCCoin()","af7ed9d7":"maxGasPriceInWei()","af7fdd76":"setModified()","af80562c":"testReceiveHash()","af819c67":"TTCSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)","af81bd03":"_voteAndCheck(uint256)","af81c5b9":"addToken(address,uint256)","af8214ef":"LIMIT()","af82403c":"getNextNode(bytes32)","af8255ab":"updateProgress(uint256,uint256)","af825c78":"Hjjm()","af83782e":"setMinimumWishTribute(uint256)","af837832":"isPromo(address,address)","af83f252":"historyRed(uint256)","af8472b1":"consecutiveDeaths()","af84fb00":"withdrawAmount(uint256,uint16)","af8532e3":"roundDeadline()","af854db1":"allowedTransferDuringICO(uint256)","af857a84":"batchTrade(address[13][],uint256[15][],uint8[2][],bytes32[2][],bytes32[2][])","af862b6a":"ETH_withdraw(uint256)","af874a76":"isValid(address,address)","af87c366":"walletUnlock(address)","af87c833":"initiateProvider(uint256,bytes32)","af8927c1":"GetRealCost(address,uint32)","af8979fd":"confirmDeath()","af8996f1":"setPublicationFee(uint256)","af899735":"playGame()","af8a849c":"AllocationGranted(address,address,uint256,bool)","af8af39f":"setRate555()","af8b0ec7":"rewardRoto(address,uint256)","af8b7525":"CollectAndReduceFees(uint256)","af8b912d":"setVotingMachine(address)","af8c1946":"refundAllEther()","af8d5a48":"icoEndTimestampStage()","af8d7611":"setPointIdentifier(string,int256)","af8d98c9":"gameEndPlayNo()","af8d9f37":"addressContainsContract(address)","af8ec44c":"offerGanTokenForSaleToAddress(uint256,address,uint256)","af8f35c4":"_fallback()","af8f7fdf":"ProductUpdated(address,address,address,string,bool)","af8ff2f8":"runPreMint(address,uint256)","af906cf3":"setToken(uint256,address)","af91b947":"UnsuccessfulAttempt(address)","af91c5fd":"getVotersChoice()","af91e0bf":"freezeOracle()","af92080b":"downTick(address)","af92a693":"addRegistrar(address)","af933b57":"withdrawEther(address)","af93a6d1":"CatNamed(bytes5,bytes32)","af93aebb":"adjustPhaseBasedOnTime()","af93afdd":"Shipment(bytes,bytes,bytes,bytes,string,bytes,uint256,uint256,bytes,bytes,uint256,uint256,string,bytes,bytes,bytes)","af93e308":"HookToken(address,address,uint256)","af941129":"testMintGuyAuth()","af944fc7":"getQueueLenght()","af949df9":"isValidUser()","af9658cd":"custodianVerify(address)","af988341":"sendLink(string,string,string)","af9890aa":"GUS()","af98cfd6":"exchangeByBuyer(uint256,uint256)","af98f757":"cancelRequest(address)","af99a327":"finalizePartnerSale()","af9a3f9b":"hashName(string)","af9a51c6":"getComponents(uint16,uint8,uint256)","af9a91d9":"setDrawerFee(uint256)","af9afe73":"unmintTokens(address,uint256)","af9b192e":"RESERVE_AMOUNT()","af9b1cef":"transfer_funds_to_project()","af9b6bd2":"bidEMONTMin()","af9bbcc4":"unbanAccounts(address[])","af9c5e7a":"getWhitePlayer(bytes32)","af9cb8c0":"StartOfPayments(address,uint256)","af9cb9f6":"setRequiredStake(uint256)","af9dfd1a":"FoodTokenEmissionEvent(address,address,uint256,bool,uint256)","af9ee81d":"_unstake(address)","af9efd4c":"_api_PlaceBet()","af9f3e20":"BTCVERVIER()","af9f788c":"TankWithdrawSome(uint256)","af9fc8a8":"UHC()","afa01c90":"CollectibleIndex4()","afa03ac9":"doFailingTransfer()","afa0f8c9":"getUintCoinProduction(address,address,uint256)","afa12a8a":"roundEnds()","afa17725":"WillyCoin()","afa1d6c9":"mainSaleTokenRaised()","afa202ac":"setRolesContract(address)","afa25098":"returnCoins(uint256)","afa293d4":"getSource()","afa31744":"saleTokensAddress()","afa33fb8":"chkLockedB(address,uint256)","afa3a5d1":"SetdivForTransfer(uint256)","afa3de9b":"revokeUserLicense(address,string)","afa40bbd":"UNIT_PRICE()","afa4179d":"_getInvestorLockedAmount(address,address)","afa437c0":"callBackForRequestRandom(bytes32)","afa560b0":"transferToICAPCallGas()","afa5e0a9":"getCountry(uint256)","afa5e56a":"decExchangeBalanceOf(address,uint256)","afa5f45c":"changeDecimals(uint256)","afa60035":"doesAssetTokenExist(address)","afa60487":"getDocAsBytes64(uint256)","afa6c735":"PRICE_PRESALE()","afa72b9f":"CinderToken()","afa7a25f":"updateArtistsAccount(uint256,address)","afa902a0":"isAutoFowarding()","afa936b8":"deleteCertificate()","afa99860":"getTokenPrice(address,address)","afa9a86e":"tokensInPlay()","afa9f179":"toReal(int64)","afaaa654":"setEndIcoPreICO(uint256)","afaaf9f9":"DepositBroker()","afab2b0f":"inventoriesOfDate(uint256,uint256,uint256[])","afab729d":"EntrepreneurShop()","afabe8b4":"CALLToken(uint256,string,string)","afac8ed3":"rand(uint16,uint16)","aface2f1":"mintTokensFor(address,uint256,uint256)","afaebf3e":"setDispatcherAddress(address)","afaf6b2e":"AuditSafeGuard(bytes20)","afaf97e7":"privateSaleToken()","afb058ce":"teamTwoPrefix()","afb0db5f":"random3()","afb18fe7":"paymentTokenAddress()","afb2032b":"LuckChain()","afb390aa":"getIsSecondPhaseEndedByTime()","afb3a8e9":"accept2(uint256)","afb3ae7a":"SPECIALIST_ONE()","afb47bb3":"approveModeratorship()","afb4d2ee":"getM()","afb58d18":"setPriceOneToken(uint256,uint256)","afb688a2":"mineth()","afb6b9a5":"m_hardCap()","afb7e495":"eruptionThreshold()","afb95eed":"logApproval(address,address,bytes32)","afb97c20":"tokenTransferDelegate()","afbae469":"mediumSize()","afbb9d44":"ico1Bonus()","afbc4ebc":"OWNER_CUT()","afbcd19b":"CROWD_WAVE3_BONUS()","afbcd904":"setDataColla_001_001(string,string)","afbd3b7f":"minLot()","afbd8092":"CATRefundedForWei(address,uint256)","afbdaa05":"isInBlockFilter(address)","afbddfa9":"toggleFreezeTokensFlag()","afbde5c9":"getNumTopics()","afbea641":"SECToken()","afbec8df":"TheGrid()","afbfdd93":"Notonegoro()","afc01cb9":"getFinishTime()","afc0b5d3":"Crypto010()","afc0bf27":"registerName(string,address,bool)","afc0bf43":"setRecoveryInfo(bytes32,uint256)","afc0e324":"stringToBytes12(string)","afc17f80":"addLockedTokens(address,uint8,uint256,uint256)","afc24bfb":"getRules(uint8)","afc24e3d":"getChallengeAnswer(uint256)","afc2cc46":"SGEICO()","afc2f503":"allowEmployeeMigration(address,address)","afc361bc":"tokenFrozen()","afc3a2ad":"current_tier_sold_tokens()","afc3b688":"perc(uint256,uint256)","afc3c31f":"initDepositAccount()","afc48052":"mintBounty()","afc4a982":"PathCost(uint16,uint32)","afc6740e":"PricePerCafe()","afc6fe2e":"MaybePerformWithdraw()","afc75b1d":"SwissTrustToken()","afc797a6":"lastStealValue()","afc7c400":"ProICOPrice()","afc81953":"createGame(bytes32,uint256,uint256,bytes32,bytes)","afc83802":"setTotalWeiToBeDistributed(uint256)","afc88141":"WhitelistAddressdisable(address)","afc8fbc6":"MerkleAirDropToken(string,string,uint8,bytes32,uint256)","afca35e5":"QuadToken()","afcac546":"getByteSize(bytes32)","afcb0d3a":"place(int8)","afcc05c0":"buyRedirectFor(address)","afcc1286":"dtEnd()","afcc8676":"SMPLTSTToken()","afcced41":"CROWDSALE_GASPRICE_IN_WEI_MAX()","afcd565c":"createTile(uint16,uint8,uint8,uint8,uint32,uint16,uint64,uint64,address,uint8)","afcd6561":"getIdentifierFromSectionIndex(uint256)","afce2d62":"PoC()","afcee461":"DungeonRunAlpha()","afcf2fc4":"charityAddress()","afcfad6e":"getJobPayments(bytes32)","afd07e80":"getMiningWarRoundOfPlayer(address)","afd09bab":"quadrupler()","afd0a85a":"ListingCancelled(uint256,uint256)","afd0fd1d":"getDecimals(string)","afd20e33":"LOCKAMOUNT()","afd237bd":"getTxn(uint256)","afd23d4a":"STAGE_1_FINISH()","afd2d5f6":"OpinionToken()","afd3f79a":"_isCorrectQuarterBuyin(uint256)","afd42fd3":"addCloud(uint16,uint16,uint16,uint8,uint8)","afd51a6e":"updateLimit()","afd61d2c":"getBonusEgg(uint64)","afd6b607":"createRequestAsPayee(address[],address[],int256[],address,address,string)","afd7b21e":"companyCapital()","afd7b9ed":"angelStartTime()","afd7bf92":"noContract()","afd7d464":"FaradTokenSwap()","afd82067":"getScore()","afd8515e":"setTotumPhases(address)","afd8c8c4":"GasProxy(address,address)","afd8fd5f":"createToken(string,string,address)","afd925df":"setPermissionManager(address,address,bytes32)","afd9897e":"restTokens()","afda2dac":"jackPotC()","afda5460":"YDTToken()","afdac68d":"query(uint256)","afdb0970":"sendToBuyer()","afdbd499":"reclaimERC20(address,uint256)","afdc3823":"updateTlcTlr(uint256,uint8,uint8)","afdcd8ec":"RAZEN()","afdd4d23":"airDropValues(address,address,address[],uint256[])","afde86c1":"getHash2(address,bytes32)","afdebfe7":"setWeiRaised(uint256)","afdfaee7":"_preValidatePurchase(address,uint256,address)","afdfb804":"getVendors(uint256,uint256,bool)","afe007b6":"_transferAction(uint32,address,uint8)","afe0e33c":"reputationRewardLeft()","afe12e77":"withdrawWrongNode(bytes32,address)","afe14c19":"clean(address,address)","afe17129":"tokensStillInLockup()","afe18413":"placeOrder(address,uint256,address,uint256)","afe1d4cf":"setTechBonus3(uint256,string)","afe2ce0e":"setSaleAddr(address,bool)","afe38ade":"payoutWinners(uint256,address[],uint256[])","afe4720c":"toggleFeatured(uint256,string)","afe69bb0":"Create(bytes32,bytes32,address,address,address,uint64)","afe70413":"getCommissionForType(string)","afe80b8d":"newCmas(uint256,string)","afe8abbf":"transferPresaleCoins(address,uint256)","afe8b652":"countriesCount()","afe948ce":"OKEToken()","afe98be1":"calculateId(uint256,uint256,uint32,uint256)","afe9c776":"XITC()","afec91c4":"icoInstalled()","afed762b":"toSlice(string)","afef07da":"ico2receivedTotal()","afef0e28":"MARKETING_supply()","aff038e6":"sellForOtherCoins(address,uint256)","aff06fbd":"playerCancelActiveGame(uint256)","aff16621":"toSig(bytes)","aff177ca":"updateWhitelist(address[],bool)","aff1e0de":"crowdsaleTotal()","aff1f15f":"rate3()","aff21b00":"imOut()","aff21c65":"getMinimumEndowment(uint256)","aff23300":"UserWallet(address)","aff3a08e":"CreateFAP(address,uint256)","aff46572":"getMarketplaceContract()","aff4b849":"getMemberName(address)","aff4cbea":"SHIP_SLOTS()","aff57736":"getNumbersFromString(string,string,uint32)","aff5dff2":"getCreditsFor(string)","aff5edb1":"deregister()","aff6b3e8":"setupRace(uint256,uint256)","aff74c6d":"getTotalPeriods()","aff7bd49":"trackSell(address,uint256,uint256)","aff7fae4":"GodzSwapGodzEther(address,address,address)","aff8c7ab":"IkuraAuthority()","aff9b3cc":"getCarName(uint256)","aff9e954":"topOptions(uint256,uint256)","aff9f40d":"SaddleForSale(uint256,uint256)","affb62dd":"dAdd(bytes32,address)","affb672b":"realimmocoin(address)","affbe8ab":"ACNCToken()","affbf593":"withdrawExcess(address)","affc0670":"openVoting()","affca932":"changeFeeRate(uint256)","affcba25":"createNewMintableUser(address)","affcce10":"_unpackRaceData(uint256)","affd0dd4":"Funding_Setting_funding_time_start()","affe39c1":"owners()","affed0e0":"nonce()","affee29b":"submitEthToTokenOrderWHint(uint128,uint128,uint32,int256)","afff33f4":"GameEvent(uint256,address,uint8)","afff5064":"setBonusesForAmounts(uint256[],uint32[])","afff9720":"addrBounty()","b0005ff1":"validPresaleTrading()","b000c81b":"InitBetContract(address,address,uint256)","b000dec2":"total_token_sold()","b001134a":"balanceInTier()","b0011509":"calcMarketFee(uint256)","b00124c4":"epocum()","b00140aa":"getHash(bytes)","b0018bfc":"changeTokenName(string)","b0036d32":"mintByGateway(uint32,uint64,address,string)","b003dd86":"encode(uint256[])","b004079e":"lol(bytes32)","b0043308":"setaddAddressListItemSet(bool)","b00606a5":"confirm(bytes32,uint8,bytes32,bytes32)","b0062595":"KcashToken()","b006b86e":"_addEthereumAddress(uint256,address)","b006de0d":"initialBalanceForCrowdsale()","b006e2b0":"txhash(string)","b0070a30":"changeBeneficiary(uint256,address)","b00791fa":"proxy_contribution(address)","b0091773":"orderExecutionBlockTime(bytes32)","b009c50d":"DevxToken()","b00a0dbf":"allowanceTransfer(address,address)","b00a81fb":"buy(uint256,uint256,string,string,string,string,string)","b00b1239":"approveAndDeposit(address,uint256)","b00baa11":"DaicovoStandardToken(string,string,uint8)","b00bad50":"identifierToBuyoutPrice(uint256)","b00cdd9b":"preICOgoal()","b00d4c75":"singleLineWrong()","b00d70ca":"sollReserve()","b00dba63":"setTokenData(uint256,bytes32)","b00e8668":"can_refund()","b00eb9fe":"feeCalculator()","b00f9702":"setTeamPerfitAddr(address)","b010d80e":"ensureTokensAvailable(uint256)","b010d94a":"canExitPool(address)","b0112ef2":"changeReserveCATDestinationAddress(address)","b0119a22":"genOrder()","b011fcf1":"doWithdraw()","b0128c08":"getCeiling()","b013b369":"_errorBuyingTokens(string)","b013f637":"getNicknameByAddress(address)","b013fa91":"JadeCoinMining(address,uint256)","b01454dd":"vrc()","b015b81a":"amountToTakeAsRake(uint256)","b015c2ce":"FLOWToken()","b0166b04":"testTransferringMkr()","b016f9f2":"ThirdAddressBalance()","b0171fa4":"getCurrentGenerationId()","b0175308":"PriceDecimals()","b017c036":"rlc()","b017d808":"assertEq32(bytes32,bytes32,bytes32)","b01800f8":"createNewUser(bytes32,bytes,bytes32,bytes32,address)","b0181b3c":"setMyIdentity(bytes32,string,string)","b018d65a":"maxAffiliate()","b0192f9a":"auctionManager()","b019ffd2":"thirdDiscountCap()","b01a71d8":"setProvider1(address)","b01ab46d":"validPurchase(address)","b01afdab":"changeBaseValue(uint256,uint256,uint256,uint256,uint256,uint256)","b01b0304":"ExchangeRateChanged(uint256,uint256)","b01b299f":"setTokenPriceProposal(uint256,uint256,uint256)","b01b3b6c":"_createSale(uint256,uint256,uint256,uint64,address)","b01b8877":"setFundingFueled()","b01c60b7":"getPrices(uint256,uint256)","b01d3d9e":"ENTToken()","b01d54ed":"PolyAi(uint256,string,uint8,string)","b01d5b63":"purchaseFor(address,uint16,address)","b01d7a11":"sendTokensToFive(address,address,address,address,address,uint256)","b01e8308":"JointToken()","b01ead43":"returnToOwners()","b01eba14":"MIN_TOTAL_AMOUNT_GET_ETH()","b01f1571":"unitsPerEth()","b01f31c9":"hardcapInTokens()","b0203f3f":"totalAmountsBetStage2(uint256)","b020b188":"developmentToken()","b020d7a3":"_reinvest(bytes32,uint256)","b021cace":"RubyCoin()","b0228f8c":"icoEtherReceivedMainSale()","b02447e0":"bonusChangeTime()","b024abad":"GoTokenDutchAuction(address,address,address,address,address,address,uint256,uint256,uint256,uint256,uint256)","b024b2e3":"GridyToken()","b0251e6d":"setUserLocked(address,bool)","b0259633":"SHIPToken()","b025abf1":"step0Rate()","b025cc45":"deadlines(uint256)","b0267126":"advisorySupplyRemaining()","b0271023":"verifyFile(string)","b0273de1":"addVpf(bytes32,uint256,uint256,uint256,uint256,uint256[])","b028c059":"createMatch(uint256,string,string,int32,int256,uint64,uint64)","b028d73a":"isCrowdsaleAllowed()","b028ee13":"s2b(string)","b0293850":"claimBuyerFunds(address,address,address,uint256)","b029c2c8":"approve_unwanted_tokens(address,address,uint256)","b029d940":"setPlatinumAddress(address)","b02a2fd1":"withdrawLemonCoins()","b02a73a1":"sendTo(address,uint256,bytes)","b02af038":"bonusesSold()","b02b69d6":"addBonus(uint256,uint256)","b02bf4b9":"earn(address,uint256)","b02c43d0":"deposits(uint256)","b02c8054":"withdrawICO(uint256)","b02da8d8":"diamondBonus(uint256)","b02dbd07":"teamAllowance()","b02e8496":"processSellRequest(string,address,uint256,uint256,bool)","b02ef382":"SALE1_END()","b02f1edc":"TokenERC20(string,string)","b02f53ae":"testConcatStorage31Bytes()","b03031b7":"_askQuestion(bytes32,bytes32,address,uint32,uint32)","b0304813":"currentMilestone()","b03053b6":"createListing(uint256,uint256,uint256)","b0321d45":"ZJMToken(address,address)","b03260be":"scheduleTransaction(uint256,address,bytes)","b032fff4":"weiMaximumAmount()","b0335ffc":"setStage(uint256,uint256,uint256,uint256,uint256)","b033777f":"endCurrentGame()","b033a02b":"payDivsValue(uint256,string)","b033a6c3":"lookup(address,uint256)","b033cab9":"voterStakes()","b0340123":"votingToken()","b0347c56":"estimatePots()","b0349184":"clearRecords(bytes32[])","b034998b":"ChooseBwea()","b034d5aa":"Total_Deposits()","b034f3cf":"myLatestBid()","b0355b45":"LuHuToken(string,address)","b03645b5":"max_users()","b036ab65":"LemoSale(uint256,uint256,uint256)","b037e4f5":"MCoin()","b0388344":"readTaskCreatedOn(string)","b03903fd":"usernames()","b03941bc":"dropable()","b0397857":"secondaryListing()","b03b3a0a":"setPOOL_edit_13(string)","b03c4b33":"setLock(address,bool)","b03c6729":"inmax()","b03cf9bd":"MerkleAirdrop(address,bytes32)","b03d169c":"mineCount()","b03d5ce8":"PVCToken(address)","b03f75a5":"giveupBid(bytes32)","b04010c6":"fuse()","b0402d36":"LiveAuctionEvent(address,uint256,uint256,uint256,uint256)","b0407315":"purchaseWarehouseSpace(address,uint256,uint256)","b0408721":"buyVouchers(uint256)","b040d545":"tokenToTokenSwapOutput(uint256,uint256,uint256,uint256,address)","b0414a2d":"setMinimumGasLimit(uint256)","b0417e98":"checkVote()","b0419107":"_getNthNibbleOfBytes(uint256,bytes)","b0423141":"StringStorage(string)","b04247e9":"DentacoinAddress()","b04287b3":"sharesOfVault(uint256,address)","b0433fe9":"_supportsERC165(address)","b0445a77":"PRIME_VESTING_DATE()","b04464cd":"ChangeImage(string,uint256)","b0448884":"updatePrice(bytes10,uint32,uint64,uint32)","b04510d5":"xultoken()","b0459d49":"LoanStandard(address,address,uint256,uint256,uint256,uint256,uint256)","b0467deb":"getUser(uint256)","b0471d43":"primary_wallet()","b047dd06":"tokensale(address,uint256,uint256)","b047f245":"listForSale(uint16,uint256)","b047fb50":"cooAddress()","b048357d":"lastBlock_a15()","b0483c3f":"reload(uint256,uint256)","b048546f":"Divide(uint256,uint256)","b0485706":"read_u32_array()","b049474d":"disableSuicide()","b049d176":"cancelSellToBlackMarket(uint256,uint256,bool)","b04a1680":"GetConsentDirective(uint256)","b04a3f1c":"EndLottery()","b04b3f57":"isCustodian(address,address)","b04ca7f0":"dateAdmin()","b04d6638":"mangeFundAmount()","b04e74f2":"Gerritcoin()","b04e7668":"createCastleWithToken(address,uint32,string,uint64,uint64,uint64,uint64,uint64,uint64)","b04eb639":"subCrystal(address,uint256)","b04fc4e1":"superContract()","b05005a2":"lock(uint128,string,address,bytes16,uint32)","b050b49c":"rewardFoundersAndPartners()","b050f83a":"proportion(uint256,uint256,uint256)","b051d722":"loadRandom(uint256)","b052852f":"approveAllocation(address)","b0532349":"_destroyContract()","b054058a":"nSign(uint256)","b0544308":"newLockTimestamp(uint256)","b0545532":"numGamesCompleted()","b0547d8c":"deleteShopMods(address)","b0557bf1":"updateParams(uint256,uint256,uint256,uint256)","b055a62a":"INCRYPTHEDGE(uint256,string,string)","b055d1bc":"amountProportion()","b055fdf2":"isTarget()","b05609ce":"pricegreengrey()","b0560eba":"GuardaProva(address)","b056561a":"DATE_31_DEC_2022()","b056bb81":"RedSoxYankees410()","b0573de6":"getDefaultPartitions(address)","b0575069":"ap(address)","b05784b8":"retreive()","b0578878":"translate(address)","b05940f2":"getOpenAuctions()","b059c177":"_0_name(uint256)","b05a0071":"DET()","b05a47d9":"VocToken()","b05d8096":"setStr(string,uint256)","b05e390a":"TokenEther(string,string)","b05eb08d":"_isLeapYear(uint256)","b05fa837":"patronageContractForUsername(string)","b05fceba":"mDepositWallet()","b05fef55":"Issuer(address,address)","b0603326":"auctionStatus(bytes32)","b0604a26":"schedule()","b0604a9c":"testCantBuyTokensInStoppedSale()","b060b785":"getWithdrawableOperationFeeDatesAndAmount()","b060de3a":"withdrawAllOptions(address[])","b0619e85":"hasPermission(address,bytes32)","b0623074":"frozenTime(address)","b063152a":"generateHash(string)","b064bb56":"_ltoa(bool)","b064ca18":"userForceGameEnd(uint256)","b06576f3":"contrBonus(uint256[])","b0660c3d":"transfersAllowed()","b0667cf8":"queryPrice()","b066d3b7":"removeReputation(address,uint256)","b066dca9":"MERZhToken()","b066ef3c":"cooldown(uint32)","b0670cc9":"get_size()","b0671381":"isValidWalletSignature(bytes32,address,bytes)","b0673d57":"getItemStore(bytes32)","b0686584":"incNT()","b068776b":"SaleFinished(uint256)","b068b5b8":"getRank01()","b06939a2":"notEqual(address[],address[],string)","b0698763":"subdomainOwner(string,string)","b069dbf1":"sendFromContract(address,address[],uint256)","b06bcb40":"getAddressInfo(address,address)","b06c76d0":"totalMinedSupply()","b06df18e":"transfer(bytes20,address)","b06df2ae":"GetMyOrders()","b06e1e02":"changeTeamWallet(address)","b06e64ca":"maxTokensWithBonus()","b06eb03f":"DSEasyMultisig(uint256,uint256,uint256)","b06ee044":"totalBasicIncome(address)","b06eedf5":"getReferralBonusAmount(uint256)","b06f4d00":"AICoin(uint256)","b06f8d34":"redeemWallet()","b06fd1e3":"CRAWDSALE_START_DAY()","b06fe82e":"changeEtherRatioForOwner(uint256)","b07048d9":"remove_user(address)","b0705e44":"getMySword()","b070bbd4":"doCalculateRoom(uint256,uint256,uint256,bytes32,uint256)","b070bdc6":"all_obstacles()","b071cbe6":"hardcap()","b071fa2a":"SENC_HARD_CAP()","b0720613":"fundingMinInWei()","b072bd10":"usedSummReserve()","b0732278":"finishICO(address,address,address)","b073e2b7":"testMath()","b073f52b":"updateBalance(bytes32,uint8,int256)","b0756562":"addLottery(string,uint32,uint32,uint32)","b07576ac":"delMin()","b0759c3e":"lockInBatches(address[])","b0773d12":"payAndRemoveInvestor(uint16,uint256)","b07741fd":"refresherFee()","b077c09b":"readSample(bytes)","b0780bd8":"getDonationStats()","b0786de9":"NeptunSupply()","b078ffe8":"BitcoinUnicorn()","b0792570":"beneficiaryStake()","b0799375":"nameValue()","b079cf62":"getRandomDragon(uint256)","b07a3107":"isOraclizeQueued()","b07a6735":"processPrivateFunding(address)","b07bbefd":"updateValueAndMint(uint256,uint256,int256)","b07be1fe":"createThemedSpinner(string,uint256,address,uint256)","b07be207":"calculateTicketPrice()","b07c76e8":"LoggedDividend(uint256,string,uint8,string,bool,bool)","b07e4e34":"_unpackCycleValue(uint256)","b07ed982":"setMaxTokenSupply(uint256)","b07ee0d2":"erc20TokenTransfer(address,address)","b07f0a41":"exercise(uint256)","b07f1fa2":"init(address,uint256,uint256,uint256,uint256,uint256,uint256,bool,address)","b07f3025":"CROWDSALE_ETH_IN_WEI_FUND_MAX()","b081b9aa":"propose_beneficiary(address)","b081cfc5":"_thresholdOne()","b0827f42":"restrictedTokensDate()","b082b9c7":"getOrganisationCount()","b0837524":"minIcoTokenLimit()","b08428c1":"internalCalc(uint256)","b08480d4":"finishSettlement()","b08496dd":"_newSpaceshipProduct(uint16,bytes2,bytes2,bytes2,bytes2,uint256)","b08510a3":"setdissolvedcontract(address)","b0859b6f":"oraclize_setGasPrice(uint256)","b085a5af":"getMyWine()","b085b9a5":"Example()","b08639e3":"getRepAvailableForExtraBondPayouts()","b0867a5c":"joinGameRandom(uint8)","b086d5aa":"getUriSetCount()","b087b8bc":"getWorkflowCount()","b0882c4b":"newETHUSDPrice(string)","b0883120":"balanceOfBuyer()","b0885dd6":"distributeWithTransferFrom(address,address,address[],uint256[])","b0891f4f":"setTokenAgent()","b0894aa6":"getDateOfAcceptance()","b0898886":"claim_devidend_for(uint256)","b08a3619":"registerDepositAddress()","b08af3dd":"get_participant_num_of_uses(address)","b08b3410":"getStraightReleasableAmount(address)","b08ba6a1":"view22()","b08bbff0":"isUserAllowed(address,string)","b08c2915":"JP_winningHash()","b08c7730":"feeGame()","b08c9bd1":"refuseSale()","b08cfb84":"addWhitelistedAddress(address,address)","b08d2718":"ReleaseableToken(uint256,address)","b08db494":"toAddress(bytes,address)","b08e0d3e":"applyRefund(uint256,bool)","b08e0f4a":"manualWithdrawal(uint256)","b08f8e1d":"setContractHoldBalance(uint256)","b08f965e":"SSA()","b090c768":"LogSelectWinner(uint256,uint256,address,uint256,uint256,uint256)","b09173f6":"viewAffBonus(address)","b091a044":"transferRecord(address,address,uint256)","b092145e":"whitelist(address,address)","b0927de7":"newRepo(string,address)","b0933f25":"fixAdvance(uint256,uint64)","b0934d7d":"removeFromBlackList(address,address)","b0949833":"NineStandardToken(uint256,string,uint8,string)","b0950b8c":"canCloseVoteCommitPhase(address,bytes32,bytes32)","b09609d5":"LogMinting(address,uint256,uint256)","b097bdbd":"PRESALE_STARTTIMESTAMP()","b097c984":"setIEOAddress(uint256,address)","b098b86b":"ownsOrSelling(uint256)","b098bdba":"getAppeals(uint256)","b09938b8":"VormaToken()","b0994d4a":"authorizeOperator(address,bool)","b099cceb":"makeBet(bool)","b09ac6f2":"isUserProduct(bytes32,bytes32)","b09ad8a0":"upperBound()","b09afec1":"getTokenData(uint256)","b09b1a51":"buyUnicorn(uint256)","b09bc3bf":"try_to_get()","b09c0f30":"rewardWeekly(uint32,uint32)","b09c235e":"MargamCoin()","b09db392":"addressDevelopers()","b09df36a":"getFunctionSignatures()","b09f1266":"_symbol()","b09f168e":"tokenOfOwnerByRange(address,uint256,uint256)","b09f4af5":"executeLock(bytes16,address)","b0a0662a":"FIRSTSALE_BASE_PRICE_IN_WEI()","b0a08873":"adjustLoanParams(uint256,uint256,uint256)","b0a1bfa9":"updateFeeBalance(uint256)","b0a1c666":"newComment(bytes32,string)","b0a1e2b4":"disputeID()","b0a2365c":"percentTokensToSale()","b0a254a7":"addStackholder(address)","b0a267da":"userTipped(address,bytes32,uint256)","b0a54a76":"TN()","b0a5a57a":"createEmergencyFundReleaseProposal()","b0a5c979":"CheckAmbientHumdtyException(bytes32,uint32)","b0a66a84":"creator(bytes)","b0a6a5ab":"IoTonToken(uint256,string,string)","b0a6d947":"unfreeze(address[])","b0a77ef7":"WithdrawToSponsor(address,uint256)","b0a8489e":"btycBalanceOf(address)","b0a84974":"payedBalancesOf(address,uint256)","b0a8be37":"RegCost()","b0a91659":"FixProfit()","b0a94ef7":"Divest(uint256)","b0a9b0ff":"createTeam(string,string,uint256,uint256,address,uint256)","b0a9c7f4":"checkGameResult(address)","b0aa09f2":"mainSaleStartTime()","b0aab296":"getNextNode(bytes)","b0aae3fa":"passGateway()","b0abbc7b":"setData_23(string)","b0ac0ef2":"currentActiveGameID()","b0ac4c8c":"getLastData()","b0acc531":"reserveWave()","b0acd745":"EventCreateStatic(address,uint128,uint256,uint256)","b0acde14":"withdrawInternal(address,uint256,address[],uint256[])","b0ad38c4":"buildCity(string,uint256[2],uint256[2])","b0ad3a5f":"not(bool)","b0ae1d64":"getpurchaserAtIndex(uint256)","b0aed621":"addJugada(uint256,string,uint256,uint256)","b0af768b":"setTokenBurner(address)","b0b02c60":"setUpdateOperator(uint256,address)","b0b185c7":"allowedForwards(uint32)","b0b189ca":"sendToInvestor(address,uint256)","b0b24e2c":"ERC()","b0b2b499":"test_token_fall_back()","b0b315e7":"calculateMaxContributionUsd()","b0b3c9a6":"ETHERAFFLE()","b0b503f9":"MonyaToken()","b0b53a1f":"WSKYToken()","b0b60b06":"ZXGToken()","b0b773c4":"ESSgenesis()","b0b8579b":"hop()","b0b92263":"setTotalTokens(uint256)","b0b9603b":"saleTokens()","b0b99c7d":"createPotato(uint256,uint256,uint256,uint256,address)","b0ba621a":"SoapBox()","b0bb3759":"XPAAssets(uint256)","b0bc4d67":"preserveHolders(address,address,uint256)","b0bcc610":"scheduleTransaction(address)","b0bcd8f3":"preCrowdsaleOwner()","b0bd5888":"transferredTokens()","b0bdacc6":"setCoinAddress(address)","b0bebdf5":"endICOp1()","b0bed0ba":"selfBalance()","b0bed1e9":"SMSCoin()","b0bf092a":"getSoftCapInWeis()","b0bfe169":"changeAirdropLimit(uint256)","b0c0552f":"AuctionCreated(address,uint256,uint256,uint256,uint256)","b0c13bfb":"addDestroyer(address)","b0c1adac":"setPrice(uint256,bool,uint256)","b0c20e4a":"setRateProvider(address)","b0c2a163":"currentDifficultyWei()","b0c2ebfd":"NathalieToken(uint256,string,uint8,string)","b0c2ff43":"tokenAccountAddress()","b0c35c05":"autoBirthFee()","b0c39bbd":"setFreezeIn(address[],bool)","b0c42691":"frozenWallet2y()","b0c4b3bb":"dateEco()","b0c5134e":"forwardEther()","b0c577c1":"phase3TokenPriceInEth()","b0c6d7df":"clearMonsterReturnBalance(uint64)","b0c73bc6":"getInvitor(address)","b0c74430":"saysomething()","b0c7f709":"kingAutomaticCollectFee()","b0c80972":"setBalance(uint256,bool)","b0c8d2dc":"updateMeta(uint256,uint256,string)","b0c8f9dc":"add(string)","b0c95b1d":"SetAccess(address,uint256)","b0c9fec7":"ButtonClicked(address)","b0ca2e62":"VEC()","b0cae18a":"WDNA()","b0cb3299":"checkIfOnUncle(uint256,uint256)","b0cbaab2":"exp(int128)","b0cbc8b9":"callContractFunctionByAddress(address,string,address,address,uint256,uint256,bool,bool,string,string,bytes32,bytes32)","b0cbe292":"_extendBadges(uint256,address,uint256)","b0cc0596":"getUserOptOut(address,address)","b0cc3951":"manualEntry(bytes32,bytes32,uint256,uint256,address)","b0cccbc3":"setFreezeOracle(bool)","b0cccc84":"validResult()","b0ce8668":"IJC()","b0cee590":"TwiceAWeekCoin(uint256,string,uint8,string)","b0cf0dcb":"revokeTokenGrant(address,address,uint256)","b0cf35f5":"getNewFallbackDeposit()","b0d08d3d":"setTxCount(address,uint256)","b0d12477":"listMAS()","b0d138e8":"bounty_percent()","b0d13a25":"retrieveEther(uint256)","b0d1a26c":"advisorTimeLock()","b0d26478":"setIdentity(uint256,address,address,string)","b0d2b936":"_isTxExistWithArgs(bytes32,uint256)","b0d3a396":"ADDITIONAL_BONUS_NUM()","b0d3ef3d":"isOpenFor(address)","b0d4ff96":"getMadeTX(uint256)","b0d54bcf":"setTradingFee(uint256)","b0d56da6":"ElephantToken(uint256,string,string)","b0d60c2e":"rawTransferFrom(address,address,bytes32)","b0d65d29":"partialWithdrawal(uint256)","b0d66291":"migratebyowner(address)","b0d79497":"allowOrRestrictMigrations()","b0d7fd9a":"NewListing(uint256,uint256)","b0d81f94":"lockTokensForFs(address,address)","b0d8a83c":"Osmium()","b0d8b51f":"getOwnedTokenIds()","b0d997d9":"bitGuildContract()","b0d9fef9":"udfVUPDestination()","b0dbce71":"setStreamityContractAddress(address)","b0dc1666":"DacToken()","b0dc63eb":"startWineryProductByRegulator(string,string,string,string,int256)","b0dcbce5":"payWithPLAT(uint256)","b0dd15a6":"paint_pixel(uint256,bytes3,uint256)","b0dd2858":"TokenBuyPresale(address,uint256,uint256,string)","b0dd478a":"setCountdown(uint256[5])","b0ddaddd":"shareBalance(address,uint256)","b0de0c40":"getBalancesList(uint8)","b0de1cb7":"publish(uint64,bytes,uint64)","b0ded9ce":"fechAllCandidates()","b0df5f81":"_computeWings(uint256,uint256,uint256)","b0df9e53":"getCards()","b0e0346e":"UNLB()","b0e09ac0":"test_validShouldThrow()","b0e0ef09":"withdrawTokensFrom(address,address,address,uint256)","b0e12715":"makeTrade(address,address,uint256,uint256,uint256)","b0e16cce":"removedotchtooffer(uint256,uint256)","b0e1aaa5":"getNumPresaleTokensBought(address,address)","b0e1f553":"whiteListingContract()","b0e24364":"CaerusToken(address,uint256)","b0e37f79":"isChecker(address)","b0e4925c":"BCIA()","b0e547e8":"referrerLevel2Percent()","b0e572c8":"getStrategy(bytes15)","b0e5aa89":"bonusStage2SecondDay()","b0e657a7":"firstMintRound0(uint256)","b0e667a9":"bidSpaceship(uint256)","b0e757c5":"GameXChange()","b0e849fe":"auctusWhiteListAddress()","b0e8cba8":"toggleContractAccessForEverybody()","b0e9a1ef":"setHodlerTime(uint256)","b0ea1e2e":"START_TS()","b0ea8d8f":"getRedeemableTokensStaker(bytes32,address)","b0eb5162":"closeGeneralSale()","b0ebb261":"withdrawGift()","b0ebefbc":"distributeFoundersRewards(address[],uint256[],uint256[])","b0ec2bed":"test_8_accessRestriction_UnderscoreAddMember_shouldThrow()","b0ecc878":"calculateEthToAfterschool(uint256)","b0ecca8f":"LookAtLastTimePerZone(uint256)","b0ed439e":"getMaxHolder()","b0ed656c":"claim(bytes32,bytes32,bytes32)","b0ed9774":"changeTakeoutWallet(address)","b0ee60a3":"_addLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)","b0eeefea":"YANKEES(address)","b0eefabe":"setArbitrator(address)","b0f07e44":"registerData()","b0f0c96a":"hello(uint256)","b0f11234":"getMessageCommunicationHash(address,uint256)","b0f239e9":"totalCheque()","b0f23d80":"SetCountryCode(uint16,string)","b0f2b72a":"set_value(uint256)","b0f32e55":"ContractFactory(uint8,uint8)","b0f42dc4":"isPure(uint256,uint256)","b0f471dd":"_partFromProvider(uint256,address)","b0f5ae72":"exchangeEtherOnTokens(address)","b0f69523":"rentOut(address,uint256,uint256)","b0f72665":"multiSigDev(bytes32)","b0f7d744":"getBoughtTime(address)","b0f85a10":"airEndtime()","b0f94b16":"batchFishAquarium(uint256[],address)","b0f9ba74":"destroyEternalStorage()","b0f9f315":"accountClaimedReward()","b0fa4926":"buyLicenseForETH()","b0fa5032":"DDToken()","b0fb3095":"transferDividendBalance(address,uint256)","b0fc2d72":"grantPurchasedTokens(address)","b0fc9bdf":"lilitoken()","b0fd035b":"safeWithdraw(uint256)","b0fd935b":"registerCertificationDb(address)","b0ff4210":"BAFC()","b1000f23":"_airdrop()","b100ad20":"incremCounter()","b102bfbe":"getOwner(bytes)","b102f52b":"enterLottery(uint32)","b103bb58":"setMaximalInvestment(uint256)","b103c1dd":"claimCofounditTokens()","b103ef5b":"buyfp(uint256,uint256)","b10477c9":"getAntsSinceLastCollect(address)","b104c509":"earlyInvestorSupply()","b1050da5":"newProposal(address,uint256,string,bytes)","b105126f":"initLottery(uint256,uint256,uint256,int256)","b1057e9c":"sell2(address)","b105be51":"BoonyToken()","b105c904":"intrepidVouchersMinted()","b1063c19":"setMiBoodleVault(address)","b106ef69":"Tutoreum()","b107baa1":"minimunBTCToInvest()","b107e815":"bet(uint32,uint8[4])","b107ea12":"setDefaultAQL(uint256)","b1084ce2":"currentNorsefire()","b108501f":"WINNER()","b10908ff":"ACO_Token()","b1091e1b":"Ez()","b1099347":"buysTokens()","b109bc6d":"getUpVoteCount(bytes12,bytes12)","b109e894":"PRICE_VARIABLE()","b10c7544":"getCmd()","b10c7dc4":"revokeMembership(uint8)","b10cf224":"userUnlockToken(uint256)","b10d539b":"MergeStatus()","b10d5a52":"setTechnicalPercent(uint256)","b10d6060":"StorageToken(address,address,address[],uint256,string,string,uint8)","b10d6b41":"getDocument(bytes32)","b10e4172":"remove(bytes32,bytes32)","b10eabe8":"ADDOCoin()","b10ec8da":"LogPrepareContribution(address,uint256,uint256,uint256)","b10ed487":"minimumInvest()","b10f8583":"update(uint256,uint256,bytes32,bytes32)","b1103200":"poolEthCap()","b1110c29":"createTokenUri(uint8,uint8,uint8,uint8)","b1112507":"bonusDeadlineDefault()","b112349e":"get_my_dni()","b1135686":"votesIter()","b113d9dc":"tokensale(address)","b11408b7":"free1Of(uint256)","b1144c9a":"presaleAllocations(address)","b114b96c":"left99(uint256)","b11560c5":"removeFromWhiteList(address[])","b115d28c":"transferDaxsToken(address,uint256)","b1174177":"LogWhitelistRemove(address,uint256)","b117a3e8":"kingBank()","b118060e":"stringLength(string)","b1186efb":"decode(bytes,uint256,uint256,uint256,uint256)","b11873d1":"BOSX()","b11888d6":"testThrowOnTransferWhenNotCreator()","b11894c9":"addBadToken(address)","b1194648":"setSaleWeiLimitWithoutKYC(uint256)","b1194bc4":"setGlobalDelegation(address)","b1199a87":"resetMeter(address)","b11a19e8":"toString(bytes32)","b11a1b89":"setCoinContract(address,address)","b11a2a97":"setEDUPrice(uint256,uint256,uint256)","b11a41fb":"AfrFballCoinToken()","b11b40a1":"getDna2(uint256)","b11c4fd8":"approveAndCallcode(address,uint256,bytes)","b11cc099":"winPrize()","b11ce2db":"addContractAddress(address)","b11d8bb8":"revealVote(uint256,uint256,uint256)","b11dd097":"initEmployee()","b11e0acb":"supplyAvailable()","b11e3889":"bulkDepositTo(uint256[])","b11e3b82":"createEvent(bytes32,bool,int256,int256,uint8,address,address,bytes32[])","b11ec3b3":"MENSA1(address)","b1202774":"ico4Max()","b120c16a":"setReputation(address,uint256)","b120e1ef":"setTokenSaleDistribution(uint256)","b12155a9":"burnTokens2(uint256)","b121a199":"_transfer(address,address,bytes32)","b122a0ef":"joinCommunity(uint256)","b1233451":"setTerm(uint256,string)","b1237eae":"withdrawAmountTo(uint256,address)","b123f68b":"LogAddress(address)","b12673b2":"token10MstepCAP()","b1267579":"totalTokenRaiseWei()","b126d0e5":"createAndSellAllAmount(address,address,address,uint256,address,uint256)","b126dc4d":"blockIndex(uint64,uint64)","b127221d":"ICO_BONUS()","b127326e":"masterTransfersEnabled()","b1273db1":"batchSetInvite(address[],uint256[],uint256[])","b1275f9a":"addPlayer(address)","b1276a42":"addCurrencyExchangeRate(uint256,uint8)","b1283e77":"markets(uint256)","b1288c11":"bytes32ToString(uint16)","b128ca5c":"adjustCap(uint256,uint256,uint256,uint256)","b129497c":"john()","b12a8229":"tokenSaleEndTime()","b12b714f":"_add(uint256,address)","b12dca5a":"ergebnis(uint256)","b12de559":"invalidateOrdersBefore(address,uint256)","b12dff65":"relaxFundingCap(uint256,uint256)","b12e1449":"reserveEscrow()","b12e3e60":"voltTransfer(address,address,uint256)","b12e4410":"getTokenAddress(bytes32)","b12e5f09":"OpsManaged()","b12e9c41":"SYS_Token()","b12ed9ef":"FCOIN1122Token(uint256,string,string,uint256)","b12f9eab":"finalizeSet()","b12fe826":"addMod(uint256,uint256,uint256)","b13170d6":"Change_approvePay(address,bool)","b1321ed7":"payOutPercentage()","b1330ca9":"startVoting(uint256,string)","b133f39b":"_shuffleParams(uint256,uint256,uint256,uint256)","b13413b0":"allocateTokensToTeamAndProjects(address,uint256)","b1343ee9":"paymentsByUserId(uint256)","b1344271":"slasher()","b1347e9d":"mintsub()","b1356488":"getEndDate()","b135bbb0":"nextGameId()","b1366d5b":"bet(uint256,uint256,address,bytes32)","b13770af":"determinTID(uint256,uint256)","b13795af":"GDCNumber3()","b138d500":"presaleAmount()","b138d838":"getContractEarnings()","b139275f":"transferto(uint256)","b139560b":"getCreateMarketEndTimeValue()","b139af17":"startSpaceship()","b139f780":"NRB_Common()","b13a2e1f":"chargeOwe(bytes32)","b13b4f2d":"wipe()","b13b6a2a":"_decreaseApproval(address,uint256,address)","b13bdfb6":"isAtMost(uint256,uint256,string)","b13c7047":"DragonKingTest(address,address,address,address)","b13c8fe0":"BILLION_TOKENS()","b13d5180":"checkAndCallApprove(address,uint256,bytes)","b13ef343":"Vesting()","b13fd2b8":"DividendAvailable(uint256)","b1401858":"levelOneBonus()","b1404198":"LogForwarded(address,uint256,bytes)","b1406a33":"buyNac(address)","b140bee5":"testFailBuyAfterClose()","b1418cf4":"payHouse()","b14201d0":"requestForArtistRegistration(bytes32,bytes32,bytes32)","b1429863":"test_oneFalseAssertNoMessage()","b1432cc3":"CrowdSale_Change_ReceiveWallet(address)","b1437e27":"tokenTotal()","b143c703":"createBarCodeData(bytes32,bytes32,int256,string)","b143c916":"getTeamPayouts(uint256,uint256)","b143d6fb":"setRunning()","b144a4d8":"DistributionSale()","b144adfb":"balance_of(address)","b14537b0":"maxContributor()","b145a5b8":"isInit()","b145c013":"checkPayout()","b146ba8e":"changeQuecoinAddress(address)","b146bdee":"cancelDigitalContract(string)","b14762bc":"setAirDropDestination(address)","b14781fb":"BITBalanceOf(address)","b148313e":"partnerSaleTokensPurchased()","b1483eee":"_TARGET_EPOCH_PER_PEDIOD()","b14904b4":"BTCET()","b14959dc":"setbonusDate(uint256)","b1498e29":"insert(string)","b149ece0":"joinPool(uint8)","b14a44ac":"_unregisterArtist(address)","b14cf5e0":"changeManager(address,address)","b14d703f":"Bitsonalite()","b14debe4":"getEthPhiRate()","b14e7bc1":"_isOperatorForPartition(bytes32,address,address)","b14ec275":"_createHero(uint256,uint256,uint256,uint256,address)","b14ecf18":"BlackSwan()","b14edac5":"destructo()","b14f2a39":"changeTreasury(address)","b14f6439":"finshCrowdsale()","b14f8432":"hasValidSubscription(bytes32,address)","b15089b1":"unlockBonusTokens(uint256,uint256,uint256)","b151c0c8":"ModuleRegistrar(address)","b15201b2":"MIN_TIME_EXPLORE()","b1523087":"_transfer(address,uint256,address)","b1527bd9":"CYFM()","b152f19e":"getFirstSchedulableBlock()","b152f6cf":"TOKEN_SUPPLY()","b152fbd1":"lockingRatio()","b1536051":"_contractFallback(address,address,uint256,bytes)","b154224e":"TimeLockMultisig(address,address[],uint256)","b1542d39":"_createCrab(uint256,uint256,uint256,uint256,bool)","b1546194":"TimeBoxToken()","b154dea6":"NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID()","b154f47c":"dev3Wallet2Pct()","b1557c2c":"lastContract()","b155c7d6":"devTokensIco2()","b155d434":"FINTIFLUSHKA()","b15651ff":"emissionPrice()","b156f79b":"FeeAddr2()","b1574b38":"toggleActive(string)","b157528b":"getERC20(address,address,address,uint256)","b157add3":"bonus_()","b157c5cd":"setJudge(address)","b15868eb":"GetVersions()","b15897cc":"setfreeze(bool)","b158a23f":"betOpen(uint256,string,string,string,string,bool)","b158b63f":"getBillOwner()","b1598725":"CultureTravelFoundationAddr()","b159bcff":"COMPANY_ACCOUNT()","b159beac":"MINIMUM_QUORUM()","b159d61b":"addSellerSig(string,string)","b15a3647":"trade(uint256,uint256[3],bytes32,bytes32,uint8)","b15a72d8":"wagerPool13()","b15aa5b7":"getSignHash(bytes32)","b15addec":"Test1()","b15b2c29":"GetContractStateEarlyTerminatedByTenantSecDep()","b15d6f35":"requestChangeInsurer(address)","b15dc523":"minFundInEther()","b15dcc25":"query(address,bytes2,uint256)","b15fbfe6":"getFromAmountBooks(address)","b16020a0":"STBIToken()","b160a86b":"setKycHash(bytes32)","b1610080":"TravelNote()","b1610d7e":"VOTING_PERIOD()","b16219c6":"feeWithdrawTokenAll()","b1622818":"softWithdrawRewardFor(address)","b162a382":"updateName(address,bytes32)","b163cc38":"addBalance()","b1643e96":"changeFeeEVOT(uint256)","b1648152":"setBetMinMax(uint256,uint256)","b1649a2d":"cancelOrder(address,address,address,address,bytes32)","b1652b2f":"playerRollDice(uint256,address)","b16562fe":"fipsRegister(address,bytes)","b165a332":"getPercentageBonusForIco(uint256)","b1662d58":"setModule(address,bool)","b16661bf":"joinAgreement(bytes,uint8,bytes32,bytes32)","b166b55a":"LogRemainingHalvingSubsidy(uint256,uint256)","b166c1ba":"sendProfit(address,uint256)","b167c34e":"getTxAtIndex(uint256)","b167d512":"allowedSince()","b167fe1b":"getExploreItem(uint256)","b168da8a":"getCustodianName(address)","b1699e2e":"C(bool)","b16a4a52":"TokensUnfrozen()","b16a867c":"summary()","b16ab3a3":"emergency_token_withdraw(address,address)","b16afaf6":"OChain()","b16b1e28":"getAddressField2()","b16b8485":"setExchangeStart(bool)","b16bd58f":"maxTokenlossValue()","b16c09f0":"clearIssuanceData(address)","b16c9e59":"flexibleReward()","b16d0839":"RootsToken()","b16d0e38":"IBG(string,string,uint8,uint256)","b16d1538":"nonEthWeiRaised()","b16d22a0":"StopPaymens()","b16d2fd1":"winnerTicket()","b16d8622":"maxICOSupply()","b16dd130":"baseKernel()","b16deab2":"CentrallyIssuedToken(address,string,string,uint256,uint256)","b16eaafa":"PetsToken(address)","b16f4a3a":"GPaid()","b1700e61":"trackAddresses(address)","b17076b2":"RemoveProofOfOwnership(bytes32)","b1718455":"NUM_COIN_PER_AXIE()","b171ae40":"ethSold()","b171b18f":"triggerInvestment()","b171dee6":"_setCategories(address,uint256,uint256)","b17216f5":"mintForwarder(uint256,bytes32,address)","b1723215":"TestPersandToken()","b17346fd":"finalizeSeedSale()","b174734c":"pendingOwner1()","b175a0d2":"BONUS_TIER_3_LIMIT()","b17607e9":"costoken()","b1766617":"ganTokenNoLongerForSale(uint256)","b176a0b4":"RabbitArena(address)","b1782d18":"tgrNumber()","b17922f6":"onlyRoles(address,uint16)","b179882d":"RESERVED_PRESALE_CAP()","b179f4d8":"G5()","b17a98b6":"withdrawAllToWithdrawalAddress()","b17a9e11":"confirmCustomer(uint256)","b17aa196":"_generateNewRandom()","b17acdcd":"collectFees(uint256)","b17b94c1":"testSystem()","b17c3f99":"confirmation(uint256)","b17c6ab8":"cancelSaleOrder(uint256)","b17d5938":"submitPool(address,uint256)","b17d8646":"EpisodeManager(address,address)","b17df316":"setMigratedBalance(address,uint256)","b17e8c4f":"tokensForplutonics()","b17eb9dc":"supporthill(uint256)","b17f0c1c":"tokenSaleWeiCap()","b17f5332":"EnterCode(uint256)","b17fc36d":"setSoftCapDeadline(uint256)","b18019bd":"_executeVote(uint256)","b1816f60":"TEMTicket(address,uint256,uint256)","b181954d":"addAttribute(string,bool,bytes32,string,string)","b18196f4":"GenexiToken()","b181a8fc":"resetContract()","b181d3d5":"GMF()","b1826ee7":"getLevelUpFeeByLevel(uint256)","b1829738":"setContractorsProfitAddress(address)","b184be81":"drain(address,uint256)","b18588fb":"updateGravatarName(string)","b185a8a4":"ChangedTokens(address,uint256)","b186eed8":"dealerDay()","b1871886":"growthReserve()","b1874b99":"INVESTMENT_USER1()","b187984f":"disableTransfer()","b187b6b1":"getBlockValueBalance()","b187bd26":"isPaused()","b1881225":"KEYS(uint256,string,uint8,string)","b188c70d":"feeMode()","b1895823":"mintMultiToken(address[],uint256[],uint256)","b189ad2a":"testErrorUnauthorizedAfterTransfer()","b189fd4c":"hash(uint256)","b18a02a4":"getPlayers(uint8)","b18a714e":"getReservedBalance(address)","b18a78e3":"currentBetAmount()","b18af4e3":"addProduct(bytes32,uint256,string,string,string)","b18bca4d":"countAbstentions()","b18c6847":"manualUpdateBalances()","b18d0c80":"getImageWidth(uint256)","b18de618":"EndQuestion()","b18e0ab8":"FooWallet(address[],uint256)","b18e4f5f":"appendKeyValue(string,string)","b18ef18c":"GlobalChain()","b18efff3":"GenesisCatsAdded(bytes5[16])","b18f1943":"ownersLength()","b1905727":"getPermissionManager(address,bytes32)","b19068c7":"minimumWager()","b19129b1":"addCustomertoBL(address,address)","b19183f2":"HodlReleased(bool)","b19208f3":"getPreIcoFunds()","b192da2d":"burnt()","b1933a0b":"getAllSharedAccounts(bytes32)","b1934151":"tokenScaleFactor()","b1936c24":"presaleOngoing()","b194073a":"getUmkaAddress(address)","b196aabb":"maximumBaseContribution()","b196f378":"weiLiquid()","b1972567":"lockAddresses(address)","b1976a02":"Get()","b197997a":"getCurrentYearMinedTokenCap(uint256)","b1987c7d":"NotaryPlatformToken()","b1989a2b":"calculateFadeoutToPool(uint32,uint256[9])","b198ef45":"checkVotingForAllowTransfer()","b1999937":"leapYearsBefore(uint256)","b19a4540":"allocatedEth()","b19a5f62":"placeOpenPurchaseOrder(address)","b19ab052":"withdrawEtherManually()","b19ab945":"maxBurnThreshold()","b19b1550":"FintechnicsPublic()","b19b2162":"refundFailedAuctionAmount()","b19bc02e":"Griddeth()","b19c0f5e":"registerForCompetition(address,address,address,address,address,uint256,uint8,bytes32,bytes32)","b19d134d":"reviseNumAvailable(uint256,uint256)","b19d4916":"setCompte_2(string)","b19d632b":"publish(bytes32,uint256)","b19e288c":"set_pauseCWC(bool)","b19f30e2":"changeKYCAddress(address)","b19faed8":"doSucceedingApprove()","b19fde5a":"getPresaleAllocation(address)","b1a00406":"getactendlen()","b1a0570d":"mintBIX(address,uint256,uint256,uint256)","b1a06ee7":"setPreSaleTokenExchangeRate(uint256)","b1a08010":"orderTrader(bytes32)","b1a11c92":"trashedTokens()","b1a1318a":"HolderAddress(uint256)","b1a1b3bc":"get_chronus()","b1a2bbd1":"TOTAL_TOKEN_CAP_OF_SALE()","b1a329d7":"optionPoolTotal()","b1a34e0d":"addClaim(uint256,uint256,address,bytes,bytes,string)","b1a3c6b4":"Balances_of(address)","b1a56055":"add_OEM()","b1a6676e":"isBurnActive()","b1a681c8":"receiveEtherAndData(bytes)","b1a6afd3":"declaration()","b1a7c005":"hashDelegatedTransfer(address,uint256,uint256,uint256)","b1a82e8f":"Jaak()","b1a8b25a":"returnBalanceToMainAccount()","b1a96135":"DMT_TotalSuply()","b1a997ac":"poke(address)","b1a9bd77":"settlementIsRunning()","b1a9f8a4":"_toString(bytes32[4],uint256,string)","b1aa6dfa":"finishInitOwners()","b1aac629":"addSoundEffect(uint256,uint8[])","b1ab0999":"supportKickoffQuorum()","b1ac478f":"_generateBattleReward(uint256,int32)","b1ad4c48":"getInvestorDividendsAmount(address)","b1adc241":"BalanceDB()","b1ae9017":"refundsall()","b1ae9887":"lastTreeId()","b1afe96b":"setMaxInvestorContributionInWei(uint256)","b1b2aef3":"testInsertProductIntoCart()","b1b30533":"contractTokenWithdrawToFreeTokens(address,uint256)","b1b3d3f6":"allow()","b1b5537c":"activateCycle(uint256)","b1b68fad":"makeTradable()","b1b6a6ed":"addPremineAllocation(address,uint256)","b1b6aecb":"SLMToken()","b1b79120":"setFightFactor(uint8)","b1b7c88f":"getPreSaleBonusRate(uint256)","b1b82922":"_getProviderRateHistory(uint256,uint256,uint8)","b1b96fdf":"giveTokens(address[],uint256)","b1b9e78d":"acceptOffer(address,uint256)","b1ba6ad7":"privateSaleAddress()","b1bb1a60":"serviceGroupChange(address,address,uint8)","b1bb4d35":"proxyMint(uint256,bytes32)","b1bb5855":"maxTicket()","b1bb5fde":"runningDebt()","b1bb7e0f":"verificationPeriod()","b1bbc6f5":"onlyBouncerSetGasRefund(bool)","b1bbd453":"winnerWithdraw(uint256)","b1bcc1b7":"depositOrder()","b1bd7683":"maxAvailableForSale()","b1bd7b80":"transEther()","b1beb3c0":"NonActivationWithdrawal(address[2],uint256[7],uint8,bytes32[2],uint256)","b1bf0510":"getJobsBoard(uint256)","b1c0e063":"cancel(address[3],uint256[4])","b1c0f2df":"maxWithWhitelist()","b1c16a2b":"HARD_CAP_TOKENS()","b1c19c4d":"LetItPlayTokenPromo()","b1c23704":"myMethod3(string)","b1c23ce6":"saleContributions()","b1c25586":"lockTokens(address,uint256)","b1c30210":"setValidationData(uint16,uint16,uint8,uint8,uint8,uint8,uint16)","b1c32b2b":"updateAngelLock(uint64,bool)","b1c3c97e":"increaseTotalWinningStake(uint256)","b1c4b70d":"confirmLawfulness(bool,bytes32)","b1c5f992":"setAffiliateRate(uint256)","b1c62e8a":"createProductionUnit4()","b1c6517a":"LookAtNumberOfPlayers()","b1c73525":"getKeccak256(uint256)","b1c8ac52":"minEthToContribute()","b1c90f6f":"ClaimingTimeLimit()","b1c9cc6c":"getSBounty()","b1c9fe6e":"phase()","b1ca3b3a":"_icoTokens()","b1cb0db3":"expires()","b1cb267b":"getE()","b1cb4217":"betContractUP()","b1cb43bf":"tokenToExchangeSwapInput(uint256,uint256,uint256,uint256,address)","b1cb574b":"setEarlyParticipantWhitelistMultiple(address[],bool[],uint256[],uint256[])","b1cb9425":"private_kill()","b1cc1d4d":"depositAndBundle(uint256)","b1cc38d0":"setShortPositionExpired()","b1cc4348":"placeWager()","b1cc7c60":"mintInterest(uint256)","b1cd221a":"redeem(address,uint256,string)","b1cd79de":"setlockaddress(address,uint256)","b1cdbe2a":"ELTC()","b1ce0a9b":"nextPayoutBlock()","b1ceb746":"acceptContribution(address,uint256)","b1cedd89":"PayPerkToken()","b1cee330":"arrayOfTokensByAddress(address)","b1cf404b":"sendTokensToOneAddress(address,uint256)","b1d006d6":"extendICO(uint256)","b1d0073b":"updateMaxNumMC(uint256)","b1d05422":"SendEmail(string,string)","b1d06c46":"moduleHandler(address[])","b1d0b725":"sellStatus()","b1d0fbc5":"uraniumplusToken()","b1d11f23":"setVesting(address,uint256,uint256,uint256,uint256,uint256,bool)","b1d17c98":"distributeTokens(address)","b1d1a159":"curRefNumber()","b1d1fed9":"multisigDXF()","b1d2372b":"JumboToken(string,string,uint256,uint256)","b1d27e3f":"setSmallPrice(uint256)","b1d3ea61":"salesContract()","b1d45fad":"HoneyBadger(address)","b1d5114c":"Hawk2(uint256,string,string)","b1d51d31":"pay(uint64,address)","b1d66003":"getRareItemInfo()","b1d6a2f0":"saleAgent()","b1d7ee21":"discountMultiplier()","b1d919ed":"LogCertifierDbChanged(address,address)","b1d9647e":"ecoBuilder()","b1db1cac":"gameGetTokenBankrollList()","b1db9c2e":"WordCoin()","b1dbb87a":"DEVELOPER_FEE_PERCENTAGE()","b1dbeb37":"PRTC()","b1dce014":"buildTeamMapping(uint256)","b1ddf52f":"getAuctionByIndex(uint256)","b1de4f0f":"setOwnerMaster(address,address)","b1de74d6":"LOG_SpinsContainerInfo(bytes32,address,uint256)","b1e045f7":"sponsoredJackpotMax()","b1e05e8a":"extractBytes32(bytes,uint256)","b1e19d45":"whitelistBurnFrom(address,uint256)","b1e1c18f":"addToManagementWhitelist(address)","b1e1ff3a":"tokenMetadata(string)","b1e254c7":"mock_clear()","b1e2a116":"playersToTotalBets(address)","b1e2cb03":"newLottery()","b1e2e1dc":"rollRoom(uint256)","b1e2e28c":"YUPIE_PER_ETH_SALE()","b1e3301f":"checkFlags(uint16,uint16)","b1e35242":"getMeOutOfHere()","b1e37921":"setDefaultMintingAddress(address)","b1e3dd57":"availableTokensAmount()","b1e50702":"setConfigSetupContract(address)","b1e5e2b7":"openBox(uint256)","b1e776e3":"updateMarketCap(uint256)","b1e834b0":"totalPreSaleTokenIssued()","b1e8aea8":"turnBackTime(uint256)","b1e8cca8":"openWormhole()","b1e9292f":"min256(uint256,uint256)","b1e9932b":"claimAndConvertFor(address[],uint256,uint256,address)","b1e9b21d":"deletePokemon(uint256)","b1e9ee64":"addressChangeRequests(address)","b1eac37e":"jackpotAmount()","b1eb2c10":"getForecast(bytes32,bytes32)","b1ebcce1":"setTxcode(uint256,uint256,uint256)","b1ecb343":"recentPlayersBack()","b1ed795e":"withdraw_all_eth()","b1ed8c99":"stageFourEnd()","b1eefcc1":"_changeOwnership(address,address,uint256)","b1ef2e97":"setXPROMO_MULTIPLIER(uint16)","b1efbd6f":"setMinimumEthereumToInvest(uint256)","b1efc755":"operationAmount()","b1efeece":"assignedSupply()","b1f0a72f":"getSubmittedStateRoot(uint256,uint256)","b1f0e40b":"finanVestingStage()","b1f253f6":"theDividendsOf(bool,address)","b1f25ffe":"calcFutureDebt(address,uint256)","b1f29590":"totalTulipCount()","b1f2e537":"setIsTokenTransferOpen(bool)","b1f32231":"awe()","b1f35246":"setActualMinerAddress(address)","b1f395ea":"addPauser_(address)","b1f3b35c":"listeners(uint256)","b1f3ec87":"SafeasyToken()","b1f42430":"ZitKOINCrowdsale(uint256,uint256,uint256,address,address)","b1f4ff90":"filters()","b1f525c6":"counter(uint256)","b1f56187":"debugBuy()","b1f5b6da":"setTokensLimit(uint256)","b1f6bd0d":"deleteInvoice(bytes32)","b1f8100d":"proposeNewOwner(address)","b1f864fb":"diamondIndexToOwner(uint256)","b1f9275f":"ENJ_UNIT()","b1f99cd5":"blockDotCoinbase()","b1fa884d":"FixedChain()","b1fc0792":"ICO_LEVEL_5()","b1fc756f":"getRefBonusPercent()","b1fc8466":"MAX_AVAILABLE_JOINTTOKENS()","b1fca956":"endTimeRound1()","b1fe1b4a":"weiRaisedICO()","b1fe3eef":"buyTokensFor(address,bytes32,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","b1fe5f58":"BIDDED()","b1fe933d":"incrementRedemptionAddressCount()","b2016bd4":"collateralToken()","b2019b8a":"EmtCrowdfund(uint256,uint256,string,string)","b202a9f4":"ERC223MintableToken(string,string,uint8,address)","b203bb99":"balance(address,address)","b204bb5d":"AddTicket()","b2057a6f":"inquireDividentAmount()","b205feb7":"stringToUint(string,int256,string)","b2067bd6":"ETHs(uint256,string,uint8,string)","b206eb42":"getImageDescriptor(uint256)","b207e32b":"testChangeRole()","b2085903":"Winner(address,uint32,uint32,uint32,uint256)","b208a600":"Nordic()","b20953f2":"isFiscal(bytes32)","b20a459d":"ZZZToken()","b20a4abb":"LogCustomSale(uint256,uint256,uint256,uint256)","b20a8779":"transferPreICOCollected()","b20b0ef5":"getAvailableCardCount()","b20b8403":"updateClaimFee(uint256)","b20baa00":"RegisteredToken(address,uint256,address,address)","b20bf95b":"setYearlyUSDSalary(address,address,uint256)","b20c0e43":"PHASE1_RATE()","b20c9f8b":"sellMaximumPossibleAmountOfTokens()","b20cc590":"allowedRoles(uint8)","b20cedc3":"getAdmin(address,bytes32)","b20d30a9":"setDailyLimit(uint256)","b20d3b1c":"vestingReleased(uint256,uint256,uint256,uint256,uint256)","b20de8f3":"TECHNOToken()","b20debeb":"Duckcoin()","b20e5a79":"getdecimals()","b20f41ab":"updateBaseComparable(int256)","b21089dc":"removeInvestmentPackage(uint256)","b210dac9":"confirmTransactionSig(bytes32)","b210e434":"functionThree()","b210f639":"PlatformAutonomyAddr()","b2112ce6":"beerContract()","b21287ae":"ToOwner()","b212a23e":"ethConvertRate()","b2138754":"verifyDocument(bytes32,bytes32[])","b213d77d":"editBalanceOf(address,address,uint256)","b2141ba4":"assertCompareBalance(uint256,uint256)","b21457e3":"getInvestorByIndex(uint256)","b214691c":"setAgent(address,address,bool)","b2148d38":"getBasicExtraBallotFeeWei()","b214ecda":"createGift(uint256,string,string)","b214faa5":"deposit(bytes32)","b215814b":"emtpyTo(address,address)","b215a879":"cg()","b215d2c9":"getCertainProducts(address,uint256,uint256,uint256,uint256,uint256,bool)","b215f30c":"changeWhitelist(address,address)","b2163482":"lockedAt()","b216c15d":"copyPopRequest()","b2170394":"getLastPaperFromContract(address,address)","b2173afd":"setzAddressesArray(address[2])","b21800d0":"TokenTransaction()","b2185bb1":"drawWinner()","b2186b05":"CrowdsaleSoftCapReached(uint256)","b2189168":"updateGame(uint256,string,uint256)","b2189d5a":"GetUserPELOBonus(address)","b218cf15":"registerToPool(address)","b2194fd8":"UinfoToken()","b219610a":"getRegionPurchasedAt(uint256)","b219c852":"firstStageTotalSupply()","b21a8be0":"isSuccessfulIco()","b21bce4c":"vote(bytes,bool)","b21c2475":"getWeiForRefund()","b21c2a68":"changeBZRxTokenContract(address)","b21ce425":"amountToTransfer()","b21cee7d":"get1TokenBuyPrice()","b21e4ebd":"itemOfOwnerByIndex(address,uint256)","b21ed44e":"percentForSale()","b2205a38":"xcertKyc()","b2210c91":"cashBalanceOf(address)","b22175db":"GetLikeCount()","b2225351":"verify(uint8)","b222cb0b":"selfRegister(bytes32)","b2237ba3":"setRatio(uint256)","b223d285":"releaseVanityUrl(string)","b2240566":"EOJ()","b2246f43":"Result(bytes32,address,uint256)","b224c40a":"vote(uint8,string)","b22528e4":"getUserEventsByIds(address,uint256[])","b225c23f":"updateCredit(address,uint256,uint256,uint256)","b225e08a":"whiteListTime()","b226ec29":"Gov(uint256,string,uint8,string)","b2280b48":"chairmanOf(uint256)","b2281442":"setMaxAbsKindness(int256)","b2288649":"lotteryBalance()","b22a7bfa":"migrateBalances(address,address[])","b22b2b66":"setKYCFull(address[])","b22c14c7":"multiPartyTransfer(address[],uint256[])","b22d9f50":"GallerionCoin()","b22dd140":"assetStaker(bytes32)","b22dd2ca":"R1()","b22e6fee":"get_pre_kyc_iconiq_bonus_denominator()","b230642d":"createSubscription(uint256,uint256,uint256)","b23096e9":"tokensTeamBlockedTimestamp()","b230eda1":"stageTwoSupply()","b2310cc5":"payRequstedSum(uint256,uint256)","b231e5cd":"STAGE_FOUNDATION()","b2322c40":"RabtestToken()","b2353d69":"updateRightLottery(address)","b2355b42":"setHomeDailyLimit(uint256)","b2356ad4":"tradingFeePercentage()","b2357392":"NewToken(uint256,string,uint8,string)","b23605eb":"PALToken99(uint256,address)","b2369f12":"getLockAccounts()","b236a3c9":"updateminAmount(uint256)","b236b068":"totalAlloctedToken()","b2378428":"LetsbetToken(address,address,address)","b237f7d4":"burnTokens(address)","b238724b":"setPendingValue(uint256,uint256)","b2389da8":"balanceOfFlurbo(address)","b238ad0e":"getDaysInMonth(uint8,uint16)","b2394040":"rateThirdWeek()","b239e2f1":"adventureHandler()","b23a0b90":"Henfruit()","b23a31e4":"getBrickIds()","b23b369b":"getPokemonLevel(uint256)","b23b4dd4":"incrementOwnedArea(address,uint256)","b23bc656":"setOverdraft(uint256,uint256)","b23c1f19":"mintTokenRewards(address,uint256)","b23d36b0":"isCheckStage()","b23d4854":"setTokenContractAddress(address)","b23db1be":"subtoken(address,uint256)","b23e35bf":"readLoveStory(bytes16)","b23f3594":"updateTeam(address)","b2401e1e":"nextDisbursement()","b2406905":"whoHasTheBiggestDick()","b240798e":"withdrawBet()","b241a020":"freeGameLockedToken(address,uint256)","b241b3b5":"getHarvestOperation(string,address)","b241ff03":"passPeriod()","b2427755":"minTrade()","b242c9c3":"getAmountRegistered()","b242e534":"transferOwnership(address,bool)","b24374a2":"omg()","b2444a70":"getParentA(uint256)","b2449d65":"YES()","b244b268":"SeeleCrowdSale(address,address,address)","b244c3f3":"ddftFundDeposit()","b2450b15":"openSoldTokens()","b24539a9":"getIcoTime()","b245923e":"proveIt(bytes32)","b245d6da":"coinIssuedIco()","b245fc92":"findNextMonth(uint256,bytes)","b2461b15":"upgradePermissionedSC(address,address)","b24626e9":"setAODevTeamAddresses(address,address)","b2467742":"CryptoPhoenixesCivilWar(address,address)","b2471e8e":"Fart(string)","b2478cfe":"recoveredIndex(address)","b247c525":"amountNeedToBeLock()","b247ed92":"getAllShipStats(uint32[])","b2481048":"newGlobalChanceNo()","b248e436":"IsBoilerExpire(address,uint256)","b248e4e1":"orderPriority(bytes32)","b2494df3":"getModules()","b2498a1f":"setPercent1(address,uint256)","b249bf01":"sendtoC(uint256)","b24a5425":"_setRoleCapability(uint8,address,bytes4,bool)","b24b09fd":"RefundEvent(address,uint256,uint256)","b24bf695":"getInvestorsAddresses()","b24c0a38":"setPreSaleParameters(uint256,uint256,uint256,uint256)","b24c35e4":"getRoundBetOrigin(uint256,uint256,uint256)","b24cb812":"removeAllowCnsContract(bytes32,address,bytes32)","b24ce5fa":"thirdCheckpoint()","b24d0c84":"addDat(string,string)","b24d8de2":"failedTemperaturesAt(uint16)","b24dced3":"setTransferFeeMin(uint256)","b24ec0b0":"LogStudentCertified(address,uint256,address,bytes32)","b250ce21":"CMC()","b251eb05":"MemberAdded(address)","b2523b67":"getReferenceAddressesOfCode(bytes32)","b252720b":"healthCheck()","b252ff2b":"threeHotHoursTokensCap()","b25302f6":"WineSupplyChain(address)","b25310b0":"DdosToken()","b25461ec":"cancelRequestPause()","b2549717":"setCalFactor(uint32,uint32)","b2550a53":"maxCyclePlayersConsidered()","b2552fc4":"annualInterest()","b2561417":"setMinimumGoal(uint256)","b2563a1b":"getMinimumLimit()","b256b093":"reservedForFounders()","b256dd6e":"WhosTheBossNow()","b2570b1c":"getBattleCardInfo(uint256,uint256,uint256)","b258eacf":"totalSupplyInt()","b2594125":"SurgeToken()","b2596a67":"levels(uint256)","b2596acd":"setForRent(uint256,uint256,uint256)","b25a00fd":"nativeToErcBridgesAllowed()","b25a7a9d":"calculateOwnership()","b25a80f4":"StoppableShareable(address[],uint256)","b25af26f":"applyForVisa(uint256,uint256)","b25ba6a7":"refundContribution(address,uint256)","b25bb3a7":"ownersGeneration()","b25c22b2":"approveMotion(uint256)","b25c372e":"prolongate(uint256)","b25cdccf":"fundingState()","b25e6181":"UnanimousConsent(address[])","b25e8973":"LBN()","b25ebbad":"_issueBitmark(address,bytes32,int256,uint256)","b25f539d":"registerUser(address,address,string,uint256)","b25f692a":"validateAndGetPurchaseTokens(address,address,uint256)","b25f8596":"PUBLIC_SALES_1_PERIOD_END()","b25fa92c":"adminAddRole(address,string)","b26041a1":"DELL()","b260c42a":"activate(uint256)","b261ce9c":"IsThisPublic()","b261f82f":"releaseAll(uint256,uint256)","b26209f6":"remainingFundsToEndAuction()","b2627ec0":"buyPriceAt()","b263c00c":"setV_R2(uint256)","b263f638":"minimalRewardedBalance()","b263f865":"usdPerHundredEth()","b263fb3f":"updateBasePriceAndMarketCap(uint256,uint256)","b2667cd0":"currentInvestment()","b266b828":"_sendTo(address,address,address,uint256,bytes,bytes,bool)","b266c661":"startDates(uint256)","b267f998":"addressFundBonus()","b2683aa6":"numberOfWagersToFinalTimeout()","b2684945":"usdSale(address,uint256)","b2686774":"sendFunds(uint256,address)","b269681d":"destination()","b269d584":"insertValue(uint256)","b269eaff":"imageGenerationCodeMD5()","b26b4f25":"changePrice(string)","b26c9779":"changeApproval(address,bool)","b26d9d6e":"IntermediateVault(address,uint256)","b26e4aed":"test_set_get_PremiumFactors()","b26eafe4":"lockUntil(uint256,string)","b26ee15c":"interfaceFreezeTokens(address,uint256)","b26ee5fe":"getTotalF4()","b26f72a4":"withdrawJOYTokens()","b26f7efc":"startGame(uint256,int256,address[])","b270b209":"BlocklanceContractHolder()","b27201ca":"investedFrom(address)","b272fa2d":"getMyHipster()","b273952a":"_isUserInternalLock()","b2741997":"BAIRON()","b274e48e":"setSaleStatus(bool,bool)","b2758411":"setUserDisplayName(string)","b275a9d8":"PackageContract()","b275ba3a":"registerUser(address,address,string)","b2774b17":"createOrSet(string,uint256,string)","b2775b02":"genBaseStats(uint256)","b2787e0c":"changeTransferAgentCA(address)","b2788540":"manuallyConfirmDonation(address,uint256,uint256,string,string)","b278b8df":"updateVoteInfo(address)","b27913a6":"LedgerUpdated(address,address)","b2792811":"getFreelancersJobContracts(address[],uint256)","b27a1f63":"horseFS(uint256)","b27b0755":"earlyBirdsSupply()","b27b7dd1":"removeStage(uint8)","b27b8415":"dailyHashExpires()","b27bcaea":"startBetBlue()","b27c0ccb":"ETASToken()","b27c4b92":"buyCore(address,uint256)","b27c4cde":"ethereumhorse()","b27d31de":"bulkTransferEther(address[],uint256[])","b27daded":"processorAddress()","b27e7244":"addDestinationChain(bytes8,address)","b27ea08d":"tokensRemainingPreIco()","b27eb3e5":"airDrop(uint16)","b27f829e":"removeNetworkMember(address)","b27f88fb":"endFifthWeek()","b280055b":"roleSetup(address)","b280a7e7":"changeSender(address)","b280a96e":"setUseAddr(address)","b280f180":"setRates(uint8,uint8,uint8)","b2813f19":"withdrawOrderTo(address,uint256)","b28175c4":"stor()","b281c478":"currentCluster()","b28241f9":"getCityPopulation(uint256)","b283f2f1":"accessoryDataContract()","b28448f4":"NewDeposit(uint256,uint256,uint256,address)","b2849055":"resetBalanceOfValues()","b284fc29":"investorsTokensPercent()","b285041d":"Satoshi()","b2852bec":"saveCash(address,uint256)","b2855b4f":"setFeeAddr(address)","b285643e":"leaderboardDataContract()","b2860396":"setstart(uint256)","b286a346":"SimpleAIToken(uint256,string,uint8,string)","b286ba8c":"heapSort(uint64[])","b2879d45":"setDRSCoinAddress(address)","b288d748":"reduceLockingTime(uint256)","b2893ba5":"next_balance()","b28945a5":"setApprovalForAllByContract(address,address,bool)","b28b3a6e":"famedStarNameToIds(bytes32)","b28bb2a0":"setStorageTime(uint256)","b28bf6af":"decreaseClaimsBalance(address,address,uint256)","b28c461c":"TOKEN_RATE_BASE_RATE()","b28c48bb":"NecashToken()","b28c747d":"getSentTransfersCount()","b28e5904":"Xflip()","b28eed93":"Listed_NotValidated(uint256,string)","b28f1433":"BHNNetwork()","b28f1ee3":"reserveSeats(uint256[],uint256)","b28f4c60":"isEmptyString(string,string)","b28f53fe":"setMinimumTokensForPurchase(uint256)","b28f6fa3":"isOnAuction(uint64)","b28fc973":"getEthBalanceOf(address)","b28fd472":"miaomiao()","b290ae06":"shrToken()","b290b9ce":"resetAllDelegations(bytes32)","b290e45b":"BonusIssued(address,uint256)","b2910826":"set_payments_processor(address)","b29120fe":"getHeartPrice()","b291820b":"Etherich()","b29212b5":"delAudit(address,address)","b2923cff":"TAXRATE()","b2931096":"hasClaimed(address,uint256)","b29387e5":"payWinnerManually2()","b295a00e":"getLimit()","b2963db6":"closeDailyInvest()","b29775c1":"isDiscountValue()","b297a35d":"_redeem(bytes32,address,address,uint256,bytes,bytes)","b298247e":"gift(uint256)","b2983281":"largeCapLimitOf(address)","b2984858":"ico1cap()","b2990de1":"getByToCount(uint256)","b299708d":"dspRegistry()","b29a0308":"logAnonymous(bytes,bytes,bytes,uint256)","b29a08f7":"ContractMadePermanent(string)","b29a3cfd":"getPI_edit_13()","b29a61c1":"investorBalances(address)","b29ae23f":"getDateOfSignature()","b29b3511":"getSpaceshipUpgradeTotalSoldByModel(uint16,uint8)","b29b5366":"setRentable(bool)","b29b5be7":"getMintAdminApproval(address,address)","b29b686a":"isWarrantyValid(address,string,string)","b29c2493":"token(uint256,string,uint8,string)","b29c62f4":"myAccount()","b29cbcec":"LogChangeMultiSigAddress(address)","b29d7914":"getRefResults(uint256)","b29e201c":"spread(address,address[],uint256[])","b29e9909":"sCVars()","b29f0835":"doIt()","b29f2e77":"sendWarriors(address,address,uint256)","b29f731d":"__tinyOracleCallback(uint256,bytes)","b29f7f9e":"removeODEMClaim(address,bytes32)","b29f9d3b":"unfreezeAccountWithToken(address,uint256)","b2a072c6":"passUndistributedEther()","b2a082b9":"suicaId()","b2a1449b":"out()","b2a1a022":"getGasPrice(string)","b2a1c540":"setMemberId(address,uint256)","b2a1de22":"whitelistedCount()","b2a29615":"Criptomedicina1()","b2a2a4e2":"complianceContract()","b2a3fd05":"WithdrawEth(uint256)","b2a4c897":"createTable()","b2a4efd4":"MASTERY_THRESHOLD()","b2a5a012":"setTokenReturnRate(uint256)","b2a5bc70":"_tokenLeft()","b2a68466":"OZENToken(uint256)","b2a6d21b":"COMPANY_RESERVE()","b2a7239d":"sklToken()","b2a780e4":"BITCLAVE_AMOUNT()","b2a7d1b7":"AssetsExplorer(address)","b2a840c0":"enable(string,uint256)","b2a87fc3":"targetToAchieve()","b2a8a6f3":"sendFLC(address,address,uint256)","b2a8ff45":"Tokens_Per_Dollar()","b2a91457":"OIA()","b2a9ab9c":"getTotalBraggedVolume()","b2aa8291":"MAINSALE_CAP()","b2aa9f0f":"increaseTotalSupply(address,uint256)","b2aac51f":"lookupUser(string)","b2aae005":"getBalanceOf(uint256)","b2ab526d":"approveUsers(address[])","b2ab530e":"testFailRetractLatestRevisionNotUpdatable()","b2ab70ba":"getMaxIterationsForRequestDividends()","b2ac1bbe":"buyInternal(address)","b2ac5407":"GMRTokenManager(address)","b2acbc13":"isOwner(bytes8,address)","b2ad1993":"BalanceNum()","b2ad35c0":"distributor_address()","b2ad3d44":"updateComplianceProof(bytes32,bytes32)","b2aeb260":"setHiringDone(address,uint256,address)","b2af9362":"isValidSignature(uint256,bytes)","b2b02109":"partnerSaleTokensAvailable()","b2b0aefb":"verifyPendingShares(uint256[],uint256[],uint256,uint256[],uint256[],bytes,bytes,uint256)","b2b106d6":"participate_in_arbits_presale_crypto()","b2b158e8":"setHolderAmount(uint256)","b2b28679":"getDelegationID(address,address)","b2b3abb1":"removeOrderFromList(bytes32)","b2b45df5":"init(address,string,string)","b2b4ae25":"isEntitled(address,address)","b2b5d93c":"Stop(bytes32)","b2b5f0cf":"IOBT()","b2b5f86f":"getLocality()","b2b5fbf5":"subDroneItem(address,uint256,uint256)","b2b6e37e":"_min256(uint256,uint256)","b2b74405":"PizzaParlor(address)","b2b7d0ce":"HakataCoin()","b2b877c1":"MithrilValkyrie()","b2b95adc":"finalizeChangeInsurer()","b2b96792":"proposeSettlement(uint256,uint256)","b2b98ed2":"Winner()","b2b99ec9":"removeNode(address)","b2ba0aa5":"feesPer10000()","b2ba97de":"team_and_angel_beneficiary()","b2bab02a":"startIssue()","b2bae511":"initSiteRewards(uint256)","b2baede4":"getListingContractAddress()","b2bb419f":"ActivateEscrow(uint256)","b2bb72bf":"getIndexInfo()","b2bbac16":"firstWeekPreICOBonusEstimate()","b2bbae69":"payForVote(address,bytes32,uint256)","b2bbe75e":"Sunshine()","b2bc2f68":"Kitcoins()","b2bc6c19":"PRICE_11()","b2bcf495":"_releasableAmount(address)","b2bd96b2":"AcceptsFUNDS(address)","b2bdc6b3":"adminAddMonument(string,uint256,uint16)","b2bdfa7b":"_owner()","b2be8180":"TombCore()","b2be8a0d":"getUserWalletTokenBalance(address,address)","b2bea9c1":"releasePurchasedTo(address,uint256)","b2bec979":"cashOutCar(uint32)","b2bf731d":"SPECTRE_BOUNTY_ADVISORY_DEV_TEAM_ALLOC()","b2bfd948":"checkNumbers(uint8[3])","b2c15f29":"updateLastTime(bytes32,bytes32)","b2c1d7dc":"BGToken()","b2c2196f":"MxRecordChanged(bytes32,address)","b2c26f94":"updateParameterValue(bytes32,uint256)","b2c2921a":"TeamBox()","b2c3429d":"VouchCoin()","b2c3609b":"Play(uint8)","b2c50b92":"retryWinners()","b2c5b208":"_returnReturnData(bool)","b2c60132":"wingsWallet()","b2c60690":"finalizeVoting(address)","b2c62d46":"endClaim()","b2c652f3":"getMarkets(uint256[128])","b2c6b6dd":"preSaleContract()","b2c7c90d":"bitcoin_ratio()","b2ca38fe":"GAP()","b2ca3ec4":"securityGuard()","b2cad9b7":"getLevel(uint32)","b2cb0a3d":"VESTING_TEAM_DURATION()","b2cb1ebd":"Typhoon()","b2cb26c1":"addMaster(uint32,string,uint16,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)","b2cb3a9b":"getCurrentShare(address)","b2cb3e93":"COSSDemo()","b2cb9f05":"Total_Deposited()","b2cc0eb3":"SpaceCoinToken(address,string,string,uint256,uint256)","b2cc36fc":"restoreFromColdWallet()","b2cc4165":"getOrderAmount(address,address,uint256,address)","b2cca39d":"pausedTime()","b2ccc4ab":"getFameBalance(address)","b2ccda0e":"setPrimaryOperator(address)","b2cd67ef":"Klein()","b2cda083":"PassCommitteeRoom(address)","b2cefd2f":"LiteToken()","b2cf9814":"assetManagerIncome(address)","b2cfdfda":"stringToArray(string,string)","b2d111f6":"maxGasPriceValue()","b2d1289b":"DepositManager(address)","b2d138d2":"rspScience()","b2d14545":"fbytes2(bytes2)","b2d1573f":"getUserRank(address)","b2d1f9be":"buyStar(uint256,string,string)","b2d23b7d":"fetchVoteResult()","b2d27832":"vestingPeriodTime()","b2d318f7":"VeteranCoin(uint256,address)","b2d37165":"startMinting(bool)","b2d37e95":"remove_order(uint32)","b2d3e85e":"isPeriodAllTokensSold(uint256)","b2d444df":"TIM6(uint256,string,uint8,string)","b2d48237":"refferalsRateBonus()","b2d4ae5e":"__callback(bytes32,string,string)","b2d5362d":"contractTokenBalance(string)","b2d5ae44":"getRefund()","b2d5e8b1":"VALUE_OF_UTS()","b2d6bc83":"fundCapital()","b2d6fd0b":"id_for_address(address,address,address)","b2d8efe0":"crowdsaleOpen()","b2d96b81":"safeAssetData(uint256)","b2da302b":"Thrill()","b2dad155":"trim(string)","b2dad25d":"getNameOfAddress(address)","b2dae885":"SpecialArrays()","b2db1d23":"regularMaxPerPerson()","b2dd5c07":"registered(address)","b2dda6b5":"totalEthReleased()","b2de1a3f":"CONTRACT_PROVIDER_ADDRESS()","b2df8456":"sponge(uint256[9])","b2df8bad":"getAvailableCoinsForCurrentStage()","b2dfa399":"ZRX_TOKEN_ADDR()","b2e02430":"divRate()","b2e02fc1":"addRefund(uint256,uint8)","b2e0baee":"SunContractIco(uint256,address)","b2e235c2":"BitBall()","b2e2c1c9":"updateCondition(uint256,uint256,uint256,uint256)","b2e2c75f":"totalUsed()","b2e30440":"Ducaat()","b2e33c8f":"getCountPlayerByTrackId(uint256)","b2e357b4":"isLinkClaimed(address)","b2e37e18":"extDestroyNinja(uint256)","b2e3d212":"IndexCoin()","b2e4c183":"preICOBonusPercent()","b2e4d35d":"validate(uint256,uint256,uint256,uint256,string,string,string)","b2e545ac":"TokenGreeneum(uint256,string,uint8,string)","b2e5d3ba":"getBtcRate()","b2e6ceeb":"takeOwnership(uint256)","b2e752cb":"MINCAP_TOKENS()","b2e774ce":"deliver(address,uint256,bytes32)","b2e7c288":"recipientString()","b2e85b67":"getPlayerStatus(address,uint256)","b2e94e78":"stage1_start()","b2ea073f":"setGeneScienceAddress(address,address)","b2ea088d":"returnUnsold()","b2ea0a39":"changeMinDonationLimit(uint256)","b2ead7bb":"fundsOut()","b2eafd57":"getRewarder(uint256)","b2ebe1c5":"_determineCharacterType(uint256)","b2ed26f6":"addresses3(uint256)","b2ee95f9":"dateRelease6()","b2eed299":"getPOOL_edit_28()","b2ef089a":"isStateTokensale()","b2ef48b9":"buyTokensWithWei(address)","b2f05133":"set_trader(address)","b2f0575c":"FooMintToken(int256)","b2f094de":"BittechPresale(address)","b2f106c0":"determineReward(bytes32)","b2f1bb5b":"tellMeASecret(string)","b2f1fe99":"refundManyTransaction(uint256[])","b2f2303a":"BreakbitsERC20Token()","b2f24225":"set_minDETsPerReturnMoreThan(uint256)","b2f2588b":"sortNumbers(uint8[3])","b2f2b06d":"_createCar(string,address,uint256)","b2f3319e":"ToggleTestMode(bool)","b2f3d299":"loadFunds()","b2f3ded4":"allMarketsFinalized()","b2f40531":"shutdownTransactions(address)","b2f4bdb0":"createdTime()","b2f5a54c":"getInvestors()","b2f7e989":"sourceTokens()","b2fa1c9e":"isComplete()","b2fa9206":"cancelIco()","b2fadc78":"_getStorage()","b2fb3b90":"cancelActiveAuctionWhenPaused(uint40)","b2fcb395":"GoldenBullChainToken()","b2fce4ea":"delegateVote(int256,address)","b2fed358":"getsafemode()","b2ff7945":"setARR(address)","b3002be7":"burnNSPs(address,uint256)","b30054b4":"set_address_GIC(address,address)","b3007dc6":"rateFirstWeek()","b302ea1e":"setRaindropAddress(address)","b302ec4b":"LocklistedAddress()","b30300d7":"_increaseAllowance(address,uint256)","b3034371":"unilateralRuling(uint8,uint256,uint256)","b30387a4":"gen0Count()","b30390ce":"registerItem(uint256,uint256,bytes32,bytes32,bytes32)","b303cec0":"addAccountReader(address)","b303dcbd":"Owned()","b303f9f7":"releaseHTOSupply(address)","b304376c":"begins()","b30475b6":"totalWeiClaimed()","b304b2e1":"allocated()","b305836f":"feeWithdrawTokenAll(address)","b3066d49":"setContracts(address,address,address)","b3070c12":"ADVISOR_REWARD()","b3074b8a":"SUTokenContract()","b30779b1":"payCommission()","b3082d25":"CreateCards(uint256,uint256,uint256,uint256,uint256,bool)","b30841d9":"totalEras()","b3097a08":"heldTotal()","b30ab349":"getContent(address)","b30bca06":"sum(uint8[])","b30cf414":"unpauseSALE()","b30d1bb8":"isDisableEther()","b30d95a0":"changeBonus(uint256,uint256,uint256,uint256,uint256,uint256)","b30dbc67":"DeNetToken()","b30e4533":"ABBCToken()","b3113d3f":"hardCapPrivate()","b311db2f":"setAccountType(address,uint256)","b311ee0c":"refundClaimDeposit()","b312dc91":"currentPayout(address,address,bool)","b31394cb":"_checkThenTransfer(address,address,uint256)","b3139d38":"updateSlasher(address)","b3141c69":"localsReptoken(uint256,string,uint8,uint256,string,string)","b314a984":"burnRemain()","b3154db0":"check(address,address)","b31567d3":"LogRemoveWhiteListed(address)","b31597ad":"redeem(bytes32,bytes32)","b315e453":"multiWithdrawReward(uint256[])","b31610db":"getIndex(address)","b317d031":"STATUS_PAID()","b319c6b7":"cooldownTime()","b319e9fa":"distributeMultiple(address[],uint256[])","b31a17f0":"FtC()","b31a4047":"_convertBlueprint(string)","b31a404a":"withdrawOnNoAvailablePlan()","b31a4e0d":"allocatePresaleTokens(address,uint256,uint64,uint64)","b31ab1c3":"disconnectOrderUser(address,address,uint256,uint256,address,address)","b31ba590":"PlayerCreated(address,uint256)","b31c5c64":"kscDecreaseApproval(address,uint256,string)","b31c710a":"oldToken()","b31cbe9a":"getAlice(uint256)","b31cd1be":"secretTaken(bytes32)","b31cf984":"getProgram()","b31d61b0":"whitelistAddress(address[])","b31d7730":"presaleFinalizeAgent()","b31d8a6f":"FreeTokenAdded(address,uint256)","b31dcaad":"timeToUnlockDDHHMM()","b31e1d4d":"delegateVote(address)","b31e822b":"isAllowTransfer(address)","b31e8889":"setParticipantWhitelist(address[],bool)","b31f8f93":"tokensLeft()","b32022e8":"calculateKebabBuySimple(uint256)","b3204b8b":"setParent(address,address)","b3204cc3":"setLineUpEnable_pool(address,uint256)","b3205410":"getCustomerInfo(address)","b3206453":"destination(bytes4,bytes)","b3209136":"WakaWakaCoin()","b320f459":"removeBid(uint256)","b32142a0":"getProgramPercent(uint256)","b3215499":"ICOBonusPercent3week()","b3219d17":"calculatePurchaseBonus(uint256,uint256)","b322269e":"GameStart(uint256,uint256)","b32381ee":"addmoney(address,uint256,uint256,uint256)","b324c62a":"fastTokenSale(uint256)","b324e80d":"depositEscrow(address,uint256)","b324fb6b":"startTimePreICO()","b3253e0f":"lastScheduledTopUp()","b326124b":"tRegSaleStart()","b326c189":"hasOpenCommissionerAuction(uint128)","b3280830":"addLibrarian(address,address)","b3292ff0":"addSuperAdmin(address)","b329bf5c":"cancelTransfer(bytes32)","b32b2805":"getArmyFullData(uint256)","b32b664f":"wantItForFree(uint256)","b32b8e2c":"contains(uint256[],uint256)","b32c41d7":"crowdsaleTargetUBO()","b32c65c8":"contract_version()","b32c6a25":"GenesisToken()","b32cb292":"setStartICO(uint256)","b32cec45":"CROWDSALE_ACCOUNT()","b32dbcd8":"getNumKnights()","b32dc51c":"totalPhase1Donations()","b32e02e8":"_getRarePlusRarity(uint32)","b32e4207":"setzString(string)","b32f19f9":"showFreezedTokensAmount(address)","b32f4b9a":"Barbie()","b32fab4e":"moneyback()","b3311309":"SingularityTest5()","b3335e6b":"setICOStartDate(uint256)","b33381fe":"calcAmountEther(address,uint256,uint256)","b333adfc":"coursesLength()","b333b0ee":"_stake(bytes32,uint256,uint256,address)","b333ce0d":"icoFinish()","b3344593":"trackingNo()","b334e90b":"tadpoleReq()","b334fd07":"createFincontract(bytes32)","b3350f03":"forbiddenAction()","b33527d2":"CreateBAT(address,uint256)","b3369866":"indexOf(uint128[],uint128,bool)","b336ad83":"getByName(string)","b336f8a3":"GetNumberOfRigs()","b33712c5":"unpauseContract()","b337a20d":"verifyLockSignature(bytes32,address,address,uint256,uint256,bytes32,bytes)","b33926cb":"owner_withdraw(uint256)","b33a10de":"cards_titanium(uint256)","b33a2ea0":"lastBlock_v18Hash_uint256()","b33a8a11":"setTokenReference(address)","b33aca37":"Mcoin(uint256,string,uint8,string)","b33adbf1":"darPremio()","b33c4b1f":"end_now()","b33cb8f6":"CrowdsalePaused()","b33ceb2c":"AddGossip(address,string)","b33e8ee5":"exchangeTokensById(uint256,uint8,uint8)","b33fcc7a":"multiTransfer(uint256[])","b340a972":"getaddr(address,uint8)","b340d8cf":"encodePriceFeed(uint256,uint256,uint256,uint256)","b340f2b4":"showAssetDetails(bytes32)","b3413d9f":"_forwardFunds()","b34195a3":"ICOTokensInvested(address,uint256)","b3423eec":"requestWithdraw()","b34244e8":"setCBaddress(address,address)","b34253be":"FundsVault(address)","b342d7c0":"genEOS()","b34362be":"setParter(address,uint256,uint256)","b3446f85":"registerPlayer(string)","b3447ac9":"getBytes32Values(bytes32)","b344e002":"saleDeposit()","b3470e97":"addHashes128()","b3472edb":"getMaxProfit(uint256)","b3477201":"createPadlock(string)","b3480369":"_getWaitingBlocks(uint256)","b3481e61":"updateTeam(address,uint32,uint8[],uint32[])","b3485dca":"UpdatePrice(uint8,uint32)","b3487a71":"getBetWaitEndEther()","b348ddde":"ETH750on54()","b3490bfc":"allowTransfer(address)","b34937c9":"feedMessage(uint256,string,string)","b349b973":"_init()","b349dbdc":"nfsPoolTransfer(address,uint256)","b349f6c7":"attemptSpend(uint256)","b34b2c26":"Simpletokenq()","b34b4f69":"XingchenToken()","b34c28de":"calculateBurnGoldFee(uint256,uint256,bool)","b34c3610":"assert1()","b34c8afb":"getBaseAmount(address)","b34d471d":"bulkCreateLamboSale(uint256,uint256,uint256)","b34debac":"canUseResource(address)","b34e0c47":"getUserScore(address)","b34e7b9d":"getgamecardlength()","b34e97e8":"login()","b34f094f":"INTToken(uint256,string,uint8,string)","b34f0e5e":"CLAIM_STAGE()","b34f407d":"setPerformer(address)","b34f43c7":"SVDelegationV0101_1(address)","b34f594b":"setNodePrice(uint256)","b34f7b50":"_generateDiscipleSale(uint256,uint256,uint256,uint256)","b350723f":"_guarantedBid(uint256)","b3508654":"addController(address,bool)","b3508783":"TOKEN_MAX()","b35176e2":"show_number_of_days_since_bank_opening()","b3521607":"XYCCTEST()","b3527cfe":"Follow(uint256,address,uint256)","b3528158":"DASHABI(uint256)","b352867c":"setFreeExtension(bytes32,bool)","b3535fe2":"_setProviderInfoFields(uint256,string,string,uint256,string,address,uint8)","b35376b5":"getDiamond(string)","b3539c44":"getMintForReportingParticipantTargetValue(int256)","b3549265":"coloredTokenCount()","b3559460":"getGenerationSize(uint256)","b3562e6e":"getCrowdsaleTier(uint256)","b356a3a5":"PLATFORM_GROWTH_VESTING_AMOUNT()","b3570116":"mintIfNecessary(uint256)","b357a028":"SCISSORS()","b357a552":"claimAuctionableTokens(uint256)","b357b72f":"setMaxMarketOffers(int32)","b35861b4":"setERC20Address(address,address,uint256,uint256)","b358755e":"testerCanNotReentrant()","b35893f3":"setExporter()","b358e375":"JobsManager(address)","b359cedd":"getTime(string)","b35ae7e8":"ViotToken()","b35e7d45":"setCriticalBucket(uint256)","b35eeb46":"GenHeliosCoin()","b3610f37":"destroyCar()","b36117b2":"create18FilmsTokens()","b36216d3":"allTokensDecimalsBalancesWeights()","b3621e1a":"addAddress(address[])","b36234c2":"AltruismMode(address,uint256,uint256)","b36292eb":"TestingCoin()","b3629f79":"get_proposal_by_row(uint256)","b3643e3a":"createSale(address,uint256)","b36752ee":"addressFoundersShare()","b36763c9":"_owoAmount()","b367fb11":"platformTokens()","b36877c9":"DragonKing(address,address,uint8,uint8,uint8,uint16[])","b368cb10":"getProviderInvitedUser(uint256,address)","b369940c":"wingsETHRewardsPercent()","b3699d0b":"withdrawedTeamCounter()","b369af71":"intervalOf(uint256)","b36a06b5":"preSaleFirstBonus()","b36a0b15":"getSignDetails(uint256,uint8)","b36ada82":"mintingOracle()","b36af005":"Menu04()","b36b9ffd":"bountyManager()","b36ba252":"getSellOrderPrices()","b36c1284":"MaxSupply()","b36c14fe":"getWhitelistUser(address)","b36c8022":"UnfreezeAccount(address)","b36c973e":"payOutWinner(address)","b36d829b":"getwinningaddress01()","b36df681":"ExecutableBase()","b36eaad8":"createUserMeme(address,uint256,string,uint256)","b36f2c30":"maxWeiUnverified()","b36f8e8f":"allowManager()","b36fef76":"promoFishCommission()","b3710a80":"infraEthWallet()","b37139e6":"reduceCD(uint256,uint256)","b37217a4":"getRandomNumber(uint256)","b372bd31":"getCommissionBalanceWEIInfo()","b373a48b":"getOneself()","b373a61c":"priceRandomFight2Death()","b373a6cd":"sendTokens(address[])","b373f167":"transfer(address,uint256,bytes,string,bool)","b3745afa":"changeAllocator(address)","b3746849":"buyTokens(address,bytes)","b374db9a":"secondsTimeLockedDefault()","b3753107":"gweiBBDPriceInWei()","b375603c":"raffleId()","b375a72c":"getHashPicture(bytes32)","b375b95a":"getMaxRankingSpots()","b3760c80":"orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)","b37610ad":"getKey(uint16,uint16)","b37681fd":"SetPlayerID(bytes32,uint16)","b376feba":"_unsafeTransfer(address,uint256)","b378e89b":"CreateToken(address,uint256)","b37983e2":"gasRequired()","b379d235":"setFlowerAuctionAddress(address)","b37a336d":"VESTING_DIV_RATE()","b37a5de7":"throughputToday()","b37a6a2c":"restartPrivatePlacement()","b37bcd94":"discountPeriod()","b37c191b":"rank(uint256)","b37c7dc0":"sub256(uint256,uint256)","b37cc2f0":"getUserEventsLength(address)","b37d61f8":"checkMyBalance()","b37d97b5":"addMany(address[])","b37dcce2":"trainingFeeMultiplier()","b37edb66":"FundingEntity()","b37edfb6":"checkChangeOwnerArgs(uint256,uint256)","b37f17ee":"migratingAmountBooks(address,address)","b3803956":"showPlayerFullScores(address)","b380b0d4":"setProfitPercentage(bytes32,uint256)","b380beac":"setTotalWizzPandaOf(uint256,uint256)","b380d365":"resolveDisputeSeller(string)","b381cfe5":"iotpowerToken()","b3822da8":"getContents(uint256[])","b38260fe":"totalAngelCardSeries()","b382b0d6":"createContract(uint256,uint8,uint256,uint256,address,address,address,address,address)","b38336de":"getCoinAmount(uint256)","b3834ed4":"getRefunded()","b38400ff":"getEndedGames()","b38415f3":"getConfigBytes(bytes)","b384abef":"vote(uint256,uint256)","b384e9b4":"incentivisationFundAddress()","b3850b2a":"total_reward_amount()","b385e7b6":"playerPrizes(address,uint256)","b387ed6d":"getCompetitionStatusOfHopefuls()","b387ef92":"currentOwner()","b38854be":"ownable()","b38928c5":"Vineyard(address)","b38b2261":"addValidation(bytes32)","b38bf811":"setMessagesSigned(bytes32,bool)","b38c1504":"TOTAL_LBTOKEN_SUPPLY()","b38c7e3a":"getStrong()","b38ce3e7":"deedIds(uint256)","b38d3ab4":"attackeePrizeByToken(bytes32,address,address)","b38de8ce":"DelGoods(uint32)","b38f974a":"buyFood(uint32)","b38fb813":"crowdsaleInit()","b38fced1":"availableThemedSpinners()","b3908dc1":"IPXToken()","b390c0ab":"burn(uint256,uint256)","b391983c":"getLimitAndPrice(uint256)","b3922c42":"TOKEN_INVESTORS()","b3924a58":"GreenMining()","b3927eeb":"Expended()","b3935caa":"trivenewstestToken()","b3936f95":"basis(uint256,uint256)","b3938edc":"changeETHUSD(uint256)","b393a5b5":"setKingdomCreationFeeWeiRP(uint256)","b393a759":"ipfsSet(string)","b393fa46":"fundersClaimed()","b3942cbd":"setTransferAllowed(bool)","b3947c17":"muldiv(uint256,uint256,uint256)","b395cb3c":"vest(address,uint256,uint256,uint256,uint256)","b395f278":"view_get_blockNumbers()","b3965083":"Pothereum(uint256,string,string)","b3965cec":"RefundPeriodStarted()","b3966dc9":"init(address,uint256,uint256,uint256,address,address,uint256)","b396d7ad":"heapSort(uint256[])","b3970f27":"updateHpbNodeBatch(address[],bytes32[],bytes32[])","b397657d":"endInitialization()","b397ffd8":"m_foundersTokensStorage()","b39852f9":"createGame(uint256,uint256,uint256,uint256,uint256,uint8)","b398924d":"RangeGameProcess(address,uint256)","b398e098":"setMaxETHAutoContributions(uint256)","b3997703":"Loser(string,string)","b399a9f8":"setFungibleTokenAddress(address,address)","b399b0bc":"remaining(address)","b39a64cd":"getNumCalled()","b39a69a3":"withdrawPROV(uint256)","b39a7fbe":"setBattleDeciderAddress(address)","b39ad6e0":"DonatorInteract(string)","b39c2944":"requiredAuthorities()","b39c8739":"Strikes()","b39ca258":"createOrder(address,bytes32,bytes32,address,uint256,uint256,uint256)","b39d49fe":"sellNapkins(uint256)","b39d66d0":"LiipCoin()","b39d6b7b":"DukatToken()","b39dcb1d":"showDepositEther()","b39e12cf":"contractManager()","b39e1c6c":"withdrawDirectDebit(address)","b39e7bc1":"RealEstate(uint256)","b39f4171":"payForOther(address)","b39f4483":"setPOOL_edit_28(string)","b3a06e75":"airdropSingleAmount(address,uint256)","b3a0b1ef":"basicInfoGetter()","b3a0e188":"firstReserveTimeLock()","b3a1362a":"setMessage(int256,string)","b3a1584a":"toAddr(bytes)","b3a18632":"stakeAOContent(uint256,uint256,bytes8,uint256,string,string,string,string,uint256,uint256)","b3a196e9":"presaleSupply()","b3a1ca52":"addressFundDigitalMarket()","b3a26071":"LiquetLottery()","b3a27842":"getEntity(uint256)","b3a2a6c0":"setOfficialWebsite(string)","b3a2a999":"nextWithdrawal(bytes16)","b3a3c4f6":"identifierToRentPeriod(uint256)","b3a3d671":"addAllowanceToRecieveToken(address[])","b3a41c65":"power(uint256,uint256,uint256,uint256,uint8)","b3a56077":"vestingPeriodLength()","b3a61c80":"tryNextTimeRange()","b3a6d09d":"tgrSettingsPartContributor()","b3a7cbf6":"XRRsale()","b3a810f7":"tournamentOwnersCut()","b3a844ae":"tokenClose()","b3a9afb7":"getQuickBuyEtherToken()","b3a9b5f6":"multiply(uint256,uint256,uint256)","b3aaa277":"validate(address[4],address,uint256[11],uint256,bytes,uint256)","b3aae830":"deployProject(uint256,string)","b3ab15fb":"setOperator(address)","b3ab715e":"getTileIDbyPosition(uint16,uint8)","b3ac149c":"getCurrBalance()","b3ac7acd":"ownerSetMaxProfitAsPercentOfHouse(uint8)","b3ad4600":"RedCarpetToken()","b3adc716":"is_banned(address)","b3ade772":"shipProducts(string,string)","b3adfa0c":"summLeskiw()","b3ae1d2c":"completeTransaction()","b3ae65d7":"initialBlockNumber()","b3aefb75":"getCap(address)","b3af4426":"jackpotTokenLoseRewardRate()","b3af88f0":"proposalPresent(string)","b3afe437":"SPECIALIST_TWO()","b3b0c83f":"withdrawEndTime()","b3b0cf86":"Birth(uint256,string,address)","b3b0eae5":"getPaidAmount(string)","b3b163c4":"getLatestVersion(address,bytes32,address,bytes32)","b3b294a6":"bonusOn()","b3b32dc0":"hasSeat(uint256)","b3b39809":"Filiate_Changed(address)","b3b4b21e":"ZZZCoinDistribution()","b3b4ec54":"acceptColuLocalNetworkOwnership()","b3b4fd0f":"affiliateProgram()","b3b51aa3":"recycleSkin(uint256[5],uint256)","b3b548eb":"submitPrice(uint256,uint256)","b3b55c0f":"ELTWagerLedger(address)","b3b5c0ee":"fillSellOrder(uint256,uint256,uint256)","b3b5eaa3":"dive2(address)","b3b5ec33":"onPollFinish(bool)","b3b5fc76":"getImagePartsCount(uint256)","b3b71063":"BitPeso()","b3b77a51":"lock(bytes32,uint256)","b3b789fb":"GetLogMessageInfo()","b3b78cc2":"crowdSaleZxcSupply()","b3b81d38":"changeMinContribution(uint256)","b3b85e7f":"buyAtoken()","b3b89158":"reserveUnlockTime()","b3b8c620":"icoRatio()","b3bb594c":"delivery(address,uint256)","b3bb8cd4":"_now()","b3bb8d44":"OwnerDefined()","b3bb9b58":"LiquidDemocracy(address,string,uint256)","b3bc5b10":"editDefinedGame(uint256,string,uint256,uint256,int256,uint256,uint256)","b3bd870a":"participated(address)","b3bf07a1":"balanceofSTCDR(address)","b3c06f50":"transferFrom(address,address,bytes32)","b3c0b7be":"createOracle(address,uint256,bytes32)","b3c10469":"hijackClones()","b3c185a7":"addNVTtoGame(uint256,uint256)","b3c199c1":"dividendFor(uint32)","b3c1a588":"parseMsgData(bytes)","b3c1ee88":"updateDescription(string,bytes32)","b3c1fe4f":"donationMultiplier()","b3c2083f":"sellVolumesNext(address,address)","b3c25835":"addUser(address,string,string,uint256)","b3c298ea":"angelInvestors()","b3c2e8fa":"ethPause()","b3c2eac1":"setStatus(bool,bool)","b3c3699f":"createLockedState()","b3c3bbbd":"betters()","b3c4a36b":"setupToken(address)","b3c4b54a":"updateDestination(bytes32,address)","b3c4ee17":"userOfferCancelElement(uint256,uint256,uint256)","b3c4f83b":"DoftToken()","b3c5209f":"limitation()","b3c5998d":"onTransfer(address)","b3c63629":"PTSDToken(uint256,string,uint8,string)","b3c6487b":"setCatPrice(uint256,uint256)","b3c7476c":"TOSLittleHodingContract()","b3c7618e":"getVoteRuling(uint256,uint256,uint256)","b3c7d097":"theDeal(uint256)","b3c9983a":"getPara(uint256,uint256)","b3ca07d1":"closeRound(bytes32,uint8)","b3caba5a":"setReferralAddress(address)","b3cb8885":"nextUnderdogPayout()","b3cba833":"getData_16()","b3cc167a":"bidIncrement()","b3cc35f0":"taxPerc()","b3cd95d3":"incRandNonce()","b3cdabfd":"funForOwner()","b3cea217":"ID()","b3cea9e2":"createRadar(uint256,string,uint256,uint256,uint256)","b3cffc6e":"contributeBTCs()","b3d14775":"getPOOL_edit_13()","b3d159bf":"SearchMyFiles(string)","b3d176c9":"setPOOL_edit_33(string)","b3d1958d":"flush(uint256)","b3d1b801":"getOwnerCars()","b3d1bd95":"_recordFeePayment(uint256)","b3d2b441":"grantTokens(address)","b3d34e1b":"WithdrawDevFunds(uint256)","b3d39e63":"deleteProposal(bytes32)","b3d3d37e":"takeSnapshot()","b3d4e279":"earlyBackerList()","b3d4e3f2":"makeVendorValid(uint256,bool)","b3d4e41f":"PURA()","b3d62a25":"matchDay()","b3d6e119":"lockedPeriod()","b3d73743":"box1Star4()","b3d76188":"pay(address,address,uint256)","b3d7ac6a":"transferCompensationEthers()","b3d8056d":"findString(bytes32)","b3d84a28":"FreezeProduct(uint256)","b3d91e41":"DECIMALFACTOR()","b3da4b09":"mintEnergyAttributionToken(address,uint256,string)","b3da6eed":"Alluma()","b3daa652":"CLIFF_DURATION()","b3daab8a":"updateInvestBalance(uint256)","b3dac57f":"cancelUpcomingEvent(uint256)","b3db410c":"allowTransferTimestamp()","b3db428b":"depositFor(address,address,uint256)","b3dc0e94":"transferSoldCoins(address,uint256)","b3dcc5eb":"mint_and_transfer(int256,address,uint256)","b3dd23e8":"BTC_SUISSE_TIER_2()","b3dd5b1a":"WavesBitcoinToken()","b3de019c":"changePrice(uint256,uint256)","b3de5cc0":"_getTimeLeft()","b3de648b":"f(uint256)","b3dedf5c":"BACToken()","b3dee386":"collect(uint16,uint16,uint8)","b3df27f4":"checkFundingGoal()","b3df5b45":"oxleytoken()","b3df8737":"left50(uint256)","b3dfcdc3":"Contribution(uint256)","b3e18ed9":"finisGame()","b3e1f523":"setUnpausedWallet(address,bool)","b3e2564a":"amendAmount(uint8,uint8,uint8)","b3e25665":"collaborateInMerge(address,int256,int256)","b3e33a74":"mintingGoal()","b3e366ab":"getLastMilestone()","b3e3cc34":"sellToBlackMarket(uint256,uint256)","b3e3d8b4":"startOrHoldCrowdSale(bool,bool,bool,uint256,bool)","b3e53d8a":"maxPresaleContributionEther()","b3e5519b":"getOpenBids(bytes32,uint8)","b3e6713e":"LogClaimTokens(address,uint256)","b3e6c19f":"OJCToken()","b3e7c201":"ethPromoHelpers(address)","b3e7c2bd":"getVote(bytes32,address)","b3e83761":"KanCoin(address)","b3e98f82":"viewClaimableInvestorDividendPool()","b3e99b77":"systemClaimAirdropMultiple(address[])","b3e9da0c":"businessersTotalBalance()","b3ea3924":"PointlessCoin(int256,uint256,string,uint8,string,address)","b3ea553b":"JoyCoin()","b3ea5984":"getIndexOfTarget(address[],address)","b3eaaa7e":"calculateCHGAmountToEther(uint256)","b3eae9ac":"WashingtonExchange()","b3eb3a86":"getClosedContract(bytes32)","b3ebc3da":"weiRaisedTotal()","b3ed1957":"USDMToken()","b3ed2081":"fixedExpTest(uint256,uint8)","b3ede13f":"addToPrizePool()","b3ee4564":"assertStillValid(uint256)","b3ee5307":"CountersUpdated(uint256,uint256)","b3ee7248":"getDate(uint32)","b3eee638":"icoEnablersTokensMinted()","b3ef0045":"decodedRecipient()","b3ef774b":"getNumOfTokensBonusOnPurchase(uint256)","b3f00674":"feeReceiver()","b3f05b97":"finalized()","b3f08078":"bookCanvasFor(uint32,address)","b3f15866":"CropOracle(address)","b3f17c20":"miningOne()","b3f1c0c9":"setIssuer(address,uint32)","b3f1f31b":"testRecurringClones()","b3f22cb4":"setLUCKContractAddress(address)","b3f2c866":"startDateOfSaleStageLast()","b3f2ecfd":"endDiscountTime()","b3f2fa99":"playersShareAllocation()","b3f3668c":"getprizeamount()","b3f3ab5c":"removeContributor(address)","b3f3dcf6":"reinvestSubdivsAmount(uint256)","b3f3e673":"switchPeriod()","b3f3e737":"SendWalletFees(address,address,address)","b3f4d235":"updateCnyEthRate(uint256)","b3f50029":"finishedGameWithdraw()","b3f523a8":"devuelveTodasApps()","b3f57bae":"tokenIncluded(address)","b3f5849f":"Battle7oken()","b3f5ab78":"noncex()","b3f691c2":"approvePendingCostume(uint256)","b3f841ba":"minimumNumberOfTokens()","b3f865f7":"rebalance(address,address,uint256)","b3f8bef1":"tgeSettingsAmountCollect()","b3f936f2":"getTypeName(uint32)","b3f98adc":"vote(uint8)","b3f9b6e1":"showPlayerScores(address)","b3fa24ef":"getUnlockSdc()","b3faa12d":"blockTokens(address)","b3fad72f":"deposited(address,uint256,string)","b3fb052a":"NTVUToken(uint8,uint256,uint256,uint256,uint256,uint256,bool,string,address)","b3fb14ad":"getGameResult()","b3fb59c1":"_setCardId(uint256,uint256,uint256)","b3fc0c83":"safeLock(uint256,uint256)","b3fc34d4":"specialSanMint(string,string,address,address)","b3fcb85b":"Sold_Token()","b3fdc99d":"signalTradeIntent(address)","b3feda02":"ASSET_MANAGER_WALLET()","b3ff0065":"CGC()","b3ff1112":"redeemFunds(uint256,uint256,uint256,bytes32)","b3ff277d":"totalWon()","b3ff8bfb":"BONUS_5_DAYS()","b4003de4":"removeFromTeamBalanceMap(address)","b4007cda":"emergencyFlag()","b400d149":"betOnNumber(uint8)","b40127f0":"bestmoney()","b4015034":"cancelExplorationByShip(uint256)","b401faf1":"claimWinnings()","b4022950":"collectFeesInEther(uint256)","b4024d9f":"testTransferNoMoreThanTokenBalance()","b4025b92":"deployProject(uint256,bytes32)","b4026ed5":"clearAuth(address)","b402973c":"SeeToken(uint256,string,string)","b4037767":"CryptoUniversityTuition()","b4038efe":"setVestTokenAllocationAddresses(address,address)","b403c290":"getwinningaddress50()","b404e001":"COMMISSION_PERCENT()","b4051397":"TokenEtcb(uint256,string,uint8,string)","b405c549":"waiting()","b40615c6":"soldTokensTotal()","b4068734":"drawWinner(uint32,int8)","b406cf39":"isPeriodTimePassed(uint256)","b406d386":"convertForPrioritized3(address[],uint256,uint256,address,uint256,uint256,uint8,bytes32,bytes32)","b4073060":"getLockListLen(address,address)","b407d1d2":"allocate7ProjectToken()","b408ac01":"totalCandyNo()","b4099ff7":"queryImage(address,bytes)","b409da05":"logDoubleIndex(bytes,bytes,bytes,uint256)","b40a5627":"bidCount()","b40a9304":"allocateDelayedTokens(address,uint256)","b40b234e":"DigitizeCoin()","b40bfd35":"AlexTestCoin()","b40d8d58":"hodlerTime9M()","b40e415e":"mutagen2FaceContract()","b40e4bec":"computeCap(uint256,uint256)","b40e76fa":"minePoP(address,uint256,uint256)","b40ee3b3":"NewSmartSharingContract(string,uint256,uint256,string,string,string,uint256,string)","b40ee8b4":"setCredit(address,uint256)","b40f0352":"refund(address,address[])","b40f6f4c":"buyOptions(address,uint256)","b41044c4":"btc_token(address,uint256)","b410a034":"issuanceRatio()","b4114165":"foundationFundTokenCountInWei()","b411e54f":"removePolicyFrom(address,uint8)","b411ee94":"hash(string)","b4123abb":"getBatch(address,address,uint256)","b412506b":"turnFaucetOff()","b41283bc":"parseTradeCompatible(bytes)","b412a2d7":"StartDateUpdated(uint256,uint256)","b412a4b7":"asideTokensMintDate()","b412b1e9":"getForestCount()","b412b445":"icoBonus3()","b412d4d6":"CafeDelivered()","b412d627":"TokenWin(address,uint256,uint256)","b4134e6e":"totalRedeemedValue()","b413c923":"setReservedTokens(uint256,address[],uint256[])","b4144b79":"getTradesByAddress(address)","b414d4b6":"frozenAccount(address)","b4150f17":"masterAuth()","b415c4ca":"total_burned_by_raffle()","b416bc93":"TokenAllowance()","b4174cb0":"right51(uint256)","b41762f9":"capIncreased()","b41960d4":"redeemGift(string,address)","b419bd17":"getNumCoins()","b419dd2d":"hashesUsed()","b419f447":"ZipcoinToken()","b419f73b":"proveIt(address,bytes32)","b41a6ce2":"changeSettings(uint64,uint64,uint8)","b41a9f22":"totalRedemptionIdValue(address,uint64)","b41b208e":"DLP()","b41b3967":"m_holders(uint256)","b41bfa6a":"ABLGenesisToken()","b41d989d":"angelsDayCooldownEnd()","b41e6640":"taxMan()","b41e79d4":"firstChangeBlock()","b41f511c":"trade(uint256[],uint256,uint8,bytes32,bytes32,bytes)","b41fc258":"balanceOfPaillier(address)","b4200294":"totalApprovedAmount()","b42072e4":"tokenExchanged()","b420feb2":"ethDepositAddress()","b4210257":"addInitiator(address)","b4214c8c":"LogWithdrawal(address,uint256)","b42220ad":"enableChangeChannel(bool)","b4223757":"modifyMilestoneFrom(address,uint8,uint8)","b423c31e":"catchYou(address,uint256)","b423d93f":"icoUsd()","b424bd83":"getLastOrderId(address)","b425282d":"getBonusPool(bool)","b4256888":"openTime()","b425bd43":"distributeTokenToAddressesAndAmountsWithoutHost(address,address[],uint256[])","b42748d3":"PSYT()","b4279df3":"initialization(address,address,address)","b427c148":"calculatePointsBlock(uint32)","b4288aa5":"EventBattle(address,uint64,uint64,uint64)","b42963f8":"executeUpdateTransferMinimumFeeProposal(uint256)","b429844c":"userBanned(address)","b429af5e":"changeBotAddress(address)","b429afeb":"isController(address)","b429f65a":"totalEtherCookieResearchPool()","b42a02b5":"updateDID(string,string)","b42a11f9":"refundAllCollateral()","b42a275e":"bankAmount()","b42a8bf9":"_distributeRevenue(uint256,uint256,uint8,uint8)","b42b14c4":"DCNForGas()","b42b8559":"createPreSale(uint256,uint256)","b42c6b4f":"getPumpRate()","b42d6bd2":"SunToken(uint256,string,uint8,string)","b42dfa0d":"gen()","b42e49ef":"rollFive(address,uint8,uint8,uint8,uint8,uint8)","b42e8923":"pushBAU2(bytes32,address,uint256)","b4307192":"Bible()","b430da3c":"migrateHero(uint256,address)","b431da0c":"JavaOwnerExample()","b43216bf":"cvsquare(uint256[],uint256)","b4328e5b":"TokenSale(uint256,uint256,uint256,uint256,uint256,uint256,address,address)","b4330e24":"transferred_total()","b43386cd":"testBalanceAfterDeposit()","b434486a":"getPriceRiseAndFeePercent(uint256)","b4349daf":"TOTAL_HAWKING()","b4350e69":"ARBITRAGING(address)","b43545bb":"ownerValidate(address)","b436db29":"deployNetwork(address,address)","b43716a0":"getMajorityThreshold()","b43740c0":"casamenteiroToken()","b4375dc9":"adminSetEnabled(bool)","b4380764":"totalTokenHolders()","b438a2d0":"RigIdle()","b438d018":"guessNumber(uint256)","b439548d":"getStudent()","b43959c0":"setMembershipStatus()","b4396d42":"SAKECOIN()","b439be79":"AHCToken()","b43bd069":"getNumPassingTokens(address,uint256,uint256)","b43c19a6":"monsterAuction()","b43c35a5":"p_update_action(uint256,address,address,uint256,string)","b43c39a7":"_setRenewable(uint256,bool)","b43d42ec":"revokeRatioVote(uint8)","b43d4851":"transferSupply(address)","b43d9ede":"setMapMaster(address)","b43dbffc":"BulletinBoard(address)","b43f8a5c":"registNameXname(string,string)","b4402991":"userVoteFor(address,uint256,uint256,uint256)","b440b5c7":"EthPyramid00XX()","b440bf39":"setMonethaGateway(address)","b440f7ff":"setInterestor(address,uint256,uint256)","b4421cbd":"isPreTokenSaleActive()","b4421e7c":"releaseFoundationJM(address)","b442649d":"IlluminaCoin()","b4427263":"createTokens()","b443a085":"boom(uint256)","b443c607":"verifyCestificate(address,uint256)","b444b606":"getNowTokenPrice()","b444ff41":"setFirstRoundPricing(uint256)","b44531d3":"test_payment()","b4454253":"timePassed()","b446b5aa":"addAuthorized(address,address)","b446e7b9":"outterlockStartTime()","b4472022":"AECTToken(uint256,string,string)","b4478d7d":"updateTurnover(bytes32,uint256)","b447968c":"enterWithReferral(uint256,address)","b447acfa":"doubleSomeVar()","b447cfd4":"InitQuantity(int32,string)","b448017b":"periodPREICO()","b449188a":"updateCirculation()","b4495b7d":"MIN_USD_FUND()","b44996c4":"checkProof(bytes32,bytes,uint256[],bytes,bytes)","b449c689":"testdata()","b44a5e64":"GreenMed()","b44b0836":"getEAAttributes(uint32)","b44ba774":"_existPublicKey(bytes32,address)","b44bd51d":"getConfig(string)","b44bd688":"recoverLost(address,uint256)","b44cac23":"addJobSponsorship(address,address,uint256,string,string,uint256)","b44d7325":"signedTransferFromHash(address,address,address,address,uint256,uint256,uint256)","b44df72d":"tokensClaimed()","b44e2ab9":"onlySignerMock()","b44ec921":"whiteListContract(address)","b44eccc9":"periodICO()","b44ed831":"isDailyUplimitReach(address,address,uint256)","b44ef712":"secondRefundRoundFinishTimestamp()","b44f776a":"Test22Coin()","b44f794f":"removeUserRole(address,uint8)","b44f8cda":"icoSaleDeposit()","b45105b2":"post(string,address,string)","b4512913":"voteStatus(bytes32,uint256)","b45156fc":"startDate2()","b451794e":"numberOfOrders()","b4538897":"ICO_PHASE3_AMOUNT()","b4539817":"Donator2()","b453afb8":"getMinDisplayPrice()","b453fb01":"feeReceiverContract()","b4542a70":"getLLV_edit_19()","b454c415":"rNo()","b454e62e":"addPool(bytes32,address,uint256,uint256,uint256,address)","b456d9e2":"activateCrowdSale()","b456ecc5":"GetHash(bytes)","b458189f":"setAccountB(address)","b4590cbe":"ICOStatus()","b4594c36":"numberOfQuestions()","b4596ea6":"setPlayerGeneralAttrAdd(uint64,uint8,uint32)","b459c3fe":"WithdrawUnclaimed()","b45a2712":"mintCapInUSD()","b45aff16":"pullBalance()","b45b290d":"finalizePretge()","b45b7a51":"TokenSold(uint256,uint256,address,address)","b45be89b":"toGiveBase()","b45c48dc":"Security_AddPasswordSha3HashToBankAccount(bytes)","b45cff5f":"houseBankRoll()","b45db978":"Centspooladdress()","b45dd873":"enableBurning(bool)","b45f6df2":"updateDayTokenFees(uint256)","b45fb209":"setNewMessageNumber(string,uint256)","b460481d":"redeemShares()","b46062ad":"setInterestRate()","b460af94":"withdraw(uint256,address,address)","b4612d78":"CD(uint256,string,uint8,string)","b4621d07":"LimitBottom()","b4628c8a":"ENSRegistrar()","b46300ec":"send()","b46310f6":"setBalanceOf(address,uint256)","b463a75c":"addTeam(address)","b463bcde":"testThrowsSetNotTransferableNotOwner()","b46452a1":"convertTokensAmountInWeiAtRate(uint256,uint256)","b464631b":"get(address,uint256)","b464d582":"checkHowManyOwners(uint256)","b464d99e":"startTimeEarlyBird()","b465307c":"validPayAmt()","b4654d98":"transferMinusFees(address,uint256,uint128,uint16)","b465e52f":"secondRefundPollDate()","b46631cd":"SetTestModeHands(uint256,uint256)","b466b76f":"fresh()","b4670002":"updateEntries(address[],bool)","b4679b06":"multiplyWithNumber(uint256)","b46801c2":"balanceUpdatesCount(address)","b4693d23":"changeOpeningClosingTime(uint256,uint256)","b469ba24":"updatePokemon(uint256,uint256,uint256)","b469d6c8":"setFundingLowcapReached(uint256)","b46a8a21":"support_proposal()","b46bcdaa":"entries(bytes4)","b46e42ec":"setClue4(string)","b46eeebb":"TOKEN_FUTURE_CAP()","b4706fa1":"tokenSalesCapReached()","b470aade":"periodDuration()","b471fade":"_withdrawal()","b473d3b6":"EjariRulesC()","b4745939":"convertEtherToDust()","b47481a9":"BajwaToken()","b4750ca0":"getMiniumInputEther()","b4755160":"mkhash(uint256,uint256,bytes32,string)","b4758e82":"tokenAssignExchange(address,uint256)","b475a1c8":"ALLOC_TEAM()","b4765db7":"transferFromToken(address,address,uint256)","b476de2e":"callURL(string,string,string,string)","b47779ce":"FivePercent4Ever()","b47784d9":"testControlDisownNotOwner()","b477e7d5":"getFullTicketDetails(int256,uint256,uint256)","b4781f63":"change_coef(uint256)","b4787dc5":"linkEID(bytes,bytes)","b478886d":"promethCost()","b478f416":"setBaseCurrency(address)","b47a7a67":"proveIt(string)","b47b2cfe":"retraitStandard_4()","b47b6116":"removeCapFreeAddress(address)","b47be3e4":"addToWhitelist(address,uint256,uint256)","b47c11e8":"fidget(address)","b47d7409":"disablePurchase()","b47d89ad":"Details()","b47dbf22":"minPurchaseAmount()","b47deb3c":"winner(uint256,uint256)","b47df046":"setGrantEnable(bool)","b47e4c6c":"getTestOne()","b47f817e":"confirmAllBuys()","b47f833c":"contains(int8,int8)","b47fa7e0":"DepositLimit(uint256)","b4800033":"set(bytes32,string)","b4801272":"Dust()","b480eac0":"setTarget(uint256)","b4816be9":"endOfRewardsConfirmed(bool)","b4819e76":"getTokenDescription(address,uint256)","b481cbc0":"withdrawJajalanTokens(address)","b4821203":"investInQueue(address,uint256)","b483c054":"setOtherFomo(address)","b484d371":"fundReferrel(address,uint256)","b484de0d":"GetHashedMove(string,string)","b484e532":"getMyMsg()","b48585e5":"ATM(uint256,string,uint8,string)","b4861ca5":"assertSaneBalance(uint256,uint256,uint256)","b48666ee":"silverSaleLimit()","b4873ac7":"setCEOAddress(address,address)","b487b699":"addData(address[],uint256[])","b488abd8":"ANACoin()","b488f00e":"runSuperPrivilegeLuckyDraw()","b4894b1d":"gaps(uint256)","b489b365":"authorizeStore(address)","b489c597":"limitPresale()","b48ae96f":"finalizeRoom(uint8)","b48b4204":"register(bytes32,uint256,address,string,uint256)","b48b73aa":"setDivBonus(uint256)","b48bc2ee":"transferDepositsToNewDao(address)","b48c6807":"EtherLinkToken()","b48d323f":"getLiveChallenges(uint256)","b48eea44":"isWhitelisted(string)","b48f4f5c":"PreICOCents()","b48fcdc0":"setConfiguration(uint256,uint256,uint256,uint256,uint256,uint256)","b4909307":"getData(address,address)","b490e79f":"getChosenFreelancer()","b4921774":"getReportsByReporter(address)","b4929d4c":"publicSell()","b492bd32":"setMulBonus(uint256)","b493b0d0":"GESToken()","b4942ad1":"transferByCoinOwner(address,address,uint256)","b4944333":"getPlayerEarning(address)","b494b49d":"variationProbably()","b494f1fb":"totalReservedTokenAllocated()","b49575a7":"CORENET()","b49593fe":"PREMIUM_SALE_PACK_COUNT()","b4961379":"private_setOracleFee(uint256)","b49651ef":"FAPFund()","b4972398":"CTCToken(address)","b497d17d":"TileUpdated(uint256)","b4980148":"numberOfStarsToReserve()","b49845f9":"EventClear()","b498e3e4":"NeverConfused()","b4999e85":"endBlockNumber()","b499a26f":"getHowManyLeftToDistribute(uint256)","b499b2ce":"doNotThrowOnValidDiv()","b49ce17f":"totalCapsules()","b49d3a53":"stopTokenTransfer()","b49e3b62":"getPenetration(uint256,uint256,uint256)","b49f4afd":"getBasePrice()","b49f57ad":"getLastLevel()","b4a09ba9":"canAccessExclusive(address)","b4a0a6b8":"Sgethereum(uint256,string,string)","b4a0e24c":"getQuotaCheck()","b4a176d3":"restoreRegistry()","b4a2251e":"getOp()","b4a3208a":"SUAppToken(uint256,string,string)","b4a357a2":"get_participant(address)","b4a39dfd":"getChildId(bytes32,uint256)","b4a4136d":"BIMI_DAO_31()","b4a516a6":"addRTO(uint256,address)","b4a523e8":"mintedTotallyByBridge(address)","b4a5ef58":"updateDefaultTimeoutPeriod(uint256)","b4a66678":"Numtokens()","b4a77b0e":"isUserBlocked(address)","b4a7a022":"_buyInBatch(uint256,address,uint256,uint256[],uint256)","b4a8dd5b":"updateTimestampLimit()","b4a8f3e6":"timeOfDeath()","b4a93d9b":"transferBasic(address,address,uint256)","b4a97fc1":"removeBottomUpChild(address,uint256,uint256)","b4a99a4e":"Owner()","b4a9d156":"changeWaitTimeUntilWithdrawOrTransfer(uint256)","b4aa24db":"uncheckedUpgrade(address)","b4ab271c":"giftIdToGift(uint256)","b4abda8b":"sendOwnershipAndCall(address,uint256,bytes)","b4abea24":"BONDS()","b4ac5452":"exerciseCUSE(address,uint256)","b4ac8ad9":"getRetailerBalances(address,address)","b4ad016d":"Socialife()","b4ad6b5b":"transferFromTo(address,address,uint256,bytes)","b4ae641c":"arrayLimit()","b4b063df":"addNewClaim(string,uint256,uint256,string,string)","b4b06a74":"GiftClaimed(address,uint256,uint256)","b4b097eb":"addNewState(string,uint256[])","b4b0a6e2":"ADULTEUM()","b4b14467":"submitTokenTransaction(address,address,uint256)","b4b179dc":"getAmountToGive(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes)","b4b1b6d9":"getRecordStateRequiredChanges()","b4b1d9c7":"getDescription(address)","b4b22b5e":"ico_allocation()","b4b2938a":"Finapse()","b4b2d3d8":"phase3Price()","b4b3b028":"AddChain(bytes)","b4b4ff0a":"setDateStartTransfer(uint256)","b4b54328":"getActualPeriod()","b4b598ce":"TEAM_FUND()","b4b5b48f":"tokenData(uint256)","b4b68490":"totalTokenCap()","b4b68dab":"createPermissionsBot(address)","b4b71450":"PlaceRocketForSaleEvent(address,uint32,uint80)","b4b7771d":"setInvadeAddr(address)","b4b857d8":"DepositEther(address)","b4b9cd62":"UpgradeRig(uint8,uint16)","b4b9d1f1":"lookup(uint256,uint256)","b4ba2a1b":"percentFrom(uint256,uint8)","b4ba2eaa":"moveEther()","b4ba349f":"sing()","b4ba9e11":"claimFor(address,address)","b4baf9ff":"HybridX()","b4bb1b0a":"isEscrowActive()","b4bb58fb":"mix(uint256,uint256)","b4bbfb9e":"StateTransition(uint256,uint256,uint256)","b4bc3564":"do_guess(uint256)","b4bcc23b":"setInvest(address,address)","b4bd5c75":"setupPREICOPeriod(uint256,uint256)","b4bd9e27":"isOver()","b4be6190":"getFreelancerHourlyRateCurrency(address,address)","b4bede85":"transferSenderPaysFee(address,uint256,bytes)","b4bee870":"ChangePoolName(string,string)","b4beff8a":"GetMinerICOData(address,uint256)","b4c045e4":"NHMToken()","b4c16970":"BigRedCoin()","b4c16ea5":"CREATED_PROMO()","b4c2aaee":"tokenPriceMin()","b4c2e22c":"_ownerOfLand(int256,int256)","b4c48026":"safeBlock()","b4c4e005":"testTransferToAcceptAuthority()","b4c555a7":"addCollaborateToCampaign(uint256,uint256)","b4c5c983":"setMainYouCollectContractAddresses(address,address,address,address[])","b4c64ab0":"Goo()","b4c65de3":"identify(string)","b4c65f7b":"bonusesByDates(uint256)","b4c7abaf":"waitTime(address,address)","b4c8c5c4":"isApprovedAddress(address)","b4c91611":"weiDistributed()","b4c93fc0":"setOneGroupJoinersCount(uint256)","b4c98496":"CreditAsiaCoin()","b4caf8be":"rewardPoolTokens()","b4cbdd8b":"setClaimSignerAddress(address)","b4cbff23":"disputeStartedFreeze(bytes32)","b4cc2181":"setPropertyBecomePublic(uint16,uint256)","b4cd3701":"PointGameWithITG(address,uint256)","b4cd8865":"getArrBoolField1()","b4cdd3b7":"buyCertainOrder(uint256,uint256)","b4cdeb78":"LarsGeburtstagsgruss()","b4ce8ae0":"updateCrowdsaleEndBlock(uint256)","b4cec530":"totalFailedOldOwnerTransferAmounts()","b4cf5648":"PRESALE()","b4cfd972":"ROUND_4_PRESALE_BONUS()","b4cff9f5":"depositBool(address)","b4d00d94":"setIcoCap(uint256)","b4d01e87":"urandom(bytes32,uint256)","b4d07c7d":"GetWorldSnapshot()","b4d07e81":"setString(bytes)","b4d0ccb6":"getVaultInterestPerDay()","b4d0e552":"rareStartPrice()","b4d11f35":"getReleased(address)","b4d12bfa":"withdrawStudios()","b4d14728":"setRateAddress()","b4d168f7":"getFundedTokenCount(bytes32,string)","b4d1c485":"unlockFunds()","b4d1d795":"PERIOD()","b4d314f2":"isWithinPeriod(address)","b4d3c122":"CXLTotalSupply()","b4d3ef5f":"contributedEth()","b4d40694":"getPreminer(address)","b4d462b3":"unlockDate3()","b4d49b62":"RemovedTokenHolder(address)","b4d510dd":"countOfSaleTokens()","b4d60cfd":"payoutMining(uint256,address,address)","b4d657cc":"modifyCurrentHeroPrice(uint256,uint256)","b4d6befe":"BuyForHKGTransaction(address,uint256,uint256,uint256,uint256)","b4d6d4c7":"getPackageData(bytes32)","b4d8166e":"northadvisor()","b4d85686":"deductFee()","b4d927d0":"moneyFreeze()","b4d9cc3a":"profitDisperser()","b4da40f3":"getBadBets(uint256)","b4da4baf":"OWPayoutArb()","b4da662c":"_acceptDividends(uint256)","b4dad588":"numPendingRequests()","b4daff13":"test(uint256,uint32)","b4db1fc1":"deleteCandidatesBatch(address[])","b4dbf642":"buyATicketFromContract(uint256)","b4dc3dc7":"unbundle(address,uint256)","b4de64bd":"Sarf()","b4def1e7":"completedTransfers()","b4e05b89":"getOwnedShips()","b4e0aa3e":"testCallBack(uint256)","b4e0b764":"minSumICOStage5USD()","b4e19f3e":"getBestGuessSecondPlaceTentativeWinningPayoutDistributionHash()","b4e1a78e":"correctExchangeRateBTCxETH(uint256)","b4e28f79":"test_TorontoRules()","b4e327ec":"MajListNotVal()","b4e3add2":"_createCollection(string)","b4e3c486":"addProposal(uint16,uint256,string)","b4e50c9b":"contributed4(address)","b4e51b7b":"sane()","b4e56e01":"setMerchantRate(address[],int16)","b4e6850b":"add(uint80,uint80,address,uint32,uint32,uint32,uint256)","b4e68dc1":"ERC721BasicToken()","b4e6f92b":"BuyTroop(uint256,uint256)","b4e7fe0c":"pendingOraclize()","b4e81236":"_verifyOptionPoolIncome(address,uint256)","b4e8c036":"ProofOfWeakFOMO()","b4e92f20":"getInitializeUniverseValue()","b4e9ac13":"getAddressRefundValue(address)","b4ecb847":"areTokensDistributedForAddress(address)","b4ed3622":"calculateDecayedBalance(uint256,address)","b4ed7ec3":"getVoteOption(uint256,uint256)","b4ed8bf8":"removePolicyAttribute(uint8,uint256)","b4ee4f81":"Sotko()","b4eecb54":"s_pwd()","b4eff690":"checkFlag(bytes)","b4f14b2b":"DragonsBurned()","b4f15310":"invalidateHash(uint256,uint256)","b4f181c6":"ethToUsdExchangeRate()","b4f20aa9":"executionOpen()","b4f272e3":"TOPToken(uint256,string,uint8,string)","b4f2bb6d":"getPoolIds()","b4f2dc7d":"approveDividends(uint256)","b4f2e8b8":"setFee(uint256,address)","b4f3625e":"fuelContract()","b4f3b453":"reserveTimelock()","b4f40c61":"k()","b4f48e08":"projectFoundersReserved()","b4f4e284":"addAdminWhitelist(address[])","b4f5a21a":"getCurrentPeriodIndex()","b4f5a6a6":"minPurchaseOnce()","b4f5b9b9":"affiliatThreshold3()","b4f5d282":"getImmed(bytes32)","b4f666da":"capToken()","b4f6aa56":"getForSalePrices(uint16)","b4f80eb9":"getPixel(uint256)","b4f82c6a":"readCompany(uint8)","b4f94b4f":"_transferByDefaultPartitions(address,address,address,uint256,bytes,bytes)","b4f9529c":"RemoveMember(address,address)","b4f96d60":"_calculateBonus(uint256,uint256)","b4f9b6c8":"kill(bytes32)","b4fadcad":"relayMetaTx(uint8,bytes32,bytes32,address,bytes)","b4fc0344":"getAdsCountByCat(uint256)","b4fc3e3b":"createSchedule(address,uint256,uint256,uint256,uint256)","b4fcf935":"revealBet(uint256,uint256,bool,bytes32)","b4fe3017":"Whitelist(address[],uint256)","b4ff4f3d":"setCanMint(address,bool,int256)","b4ff87f2":"_approveTransaction(uint256,address)","b4ffaece":"setReservedTokensListMultiple(address[],uint256[],uint256[])","b4fffa52":"min_value()","b5000405":"gifted()","b5004d1c":"currentPotSplit()","b500cc08":"toBase58(bytes)","b501671c":"KillingChainToken(address,address,address)","b501df23":"Mintloot()","b503a2b9":"categoryId()","b503fcf3":"totalToSale()","b5040f0a":"getLastSessionVote(uint256,address)","b5044e85":"BATO()","b5046219":"getDailyPrice()","b504adda":"LOG_BetLost(address,uint256,uint256,bytes32)","b505a3f2":"LOG_Payout(address,uint256)","b505c6ef":"releaseTokens(address,address,uint256)","b507f7c4":"_setBlockHash(uint256)","b508069b":"implChangeReqs(bytes32)","b508adb9":"isStateInit()","b5093f7c":"HasNoEther()","b50954b6":"cancelWaitingForOpponent()","b509bae5":"OpenFundFactory()","b509c090":"getCurrEthValue()","b50a0899":"seeZombieDna(uint256)","b50a89f3":"MyToken(uint256,string,string,uint8)","b50bf8cb":"getStakeholderConfirmations(uint256)","b50c77f2":"initWallet2of3()","b50d2b35":"currentTokensRemaining()","b50e44b8":"EXCHANGE()","b50e4610":"refoundTokens(uint256)","b50eb5d7":"KeyTokenSale(uint256,address)","b50f2832":"set_participant_num_of_uses(address,uint8)","b50fa90b":"verPlayer()","b50ff2b8":"hiddenCapTriggered()","b51051d4":"addDataPoint(uint256,bool,string)","b510dc2a":"setIcoAddress(address,uint256)","b510e42c":"ethOfKey()","b510fe45":"newIdShip()","b5116a93":"getMyOwed(address,address)","b5120c30":"canBeClosed()","b5125493":"organizer4()","b5128f66":"view38()","b512e8a6":"agtAtnReceived()","b512f98c":"TSFINAL()","b5133189":"anotherOwner2()","b51459fe":"canWithdraw()","b5147d64":"getAccountCoords(address)","b515622f":"_getBonus()","b5160d6f":"setFreeMem()","b516444a":"mine_success(bytes32)","b516ce40":"manageKey(uint256,uint256,uint256)","b516cf2e":"MainContract()","b5175571":"changeCheckDate(bool,uint256,uint256)","b517570a":"ICO_TIER_FIRST()","b518a776":"tmp()","b519719e":"assertCheck(bool)","b51996de":"setWalletWithdraw(address)","b519c05b":"updateAdditionalEmission(uint256,uint256)","b519cf31":"rateLimiter_()","b51aae5a":"ResetAirdrop(uint256)","b51abfcd":"BCBCOIN(uint256,string,string)","b51ac349":"_updateArtistLookupData(address,uint256)","b51ad456":"IsPreSaleEnabled()","b51bda59":"_depositForRenter(address,uint256)","b51be1db":"infytoken()","b51c3d2a":"maxImmortals()","b51c4f96":"getCodeSize(address)","b51d42a2":"customPedro(uint256,uint256,bool)","b51d93eb":"confirmNewOwner(address)","b51dfa9d":"buySupply()","b51f86c0":"getCrcWithdrawAccount()","b520b68c":"withdrawForeignTokens(address,bool)","b520c7e7":"getWeeklyVolume()","b5217c39":"TotalCrowdsaleContributions()","b521c106":"bonusDate()","b521d3bb":"gcpn(uint256)","b522739a":"register_node(string)","b52303b2":"TransferToExchange(address,address,uint256,uint256)","b5232ba3":"registerUserWallet(address,uint32)","b523d13c":"VernamCrowdSaleToken()","b5247199":"readPhaseData(uint256)","b524abcf":"totalSupply(bytes32)","b525256f":"BloxrouteToken()","b525ab8d":"min_balance_for_bonus()","b5268fa4":"DisableTransfer()","b527b0a6":"setSaleAuction(address)","b5281b31":"purchaseMysteriousEmblem()","b52923a0":"setCompte_11(string)","b5299ca6":"giveMeat()","b52a3d8d":"initCaps()","b52a467c":"buyGold(bytes32,string,string,bytes32,string,string,bool)","b52a5851":"burnUnsold()","b52a6a38":"atLastUnclaimedFeeAllocation()","b52ae3fc":"transferBlackFunds(address)","b52b925d":"investorProfit()","b52bb6b9":"TokenSale(address,address,address,uint256)","b52c0c35":"setPayOutPercentage(uint8)","b52c1d5b":"calculateSeed(uint256[],uint256)","b52c64c7":"addNewInsurance(bytes32,uint256,uint32,uint32,bytes32)","b52db3b9":"updateRecord(address,address,bool)","b52e0dc8":"getRateAt(uint256)","b52fddbd":"setCrowdsale(uint256,uint256)","b53148ad":"currentAmountOfTokensWithNoBonus()","b5319335":"promoCreationLimit()","b531a872":"icoStop()","b532073b":"OwnerChanged(address,address)","b5320cd6":"test_22_assertGasUsage100Boards()","b532e4cb":"addModerator(address)","b5338408":"_numDigits(uint256)","b533ff5f":"getLockedStructTimeToLock(address,address,uint256)","b534b5b7":"issuedTokens()","b5352fa7":"MuMuToken(uint256,string,string)","b53564ea":"setInvestors(uint256[],address[],uint256[],uint256)","b535b5c3":"hashExists(bytes32)","b535c741":"makeOldFucks(uint32)","b5364560":"clearApprovalForGeneLab(uint256)","b536c686":"burnedTokens(address)","b536fa63":"stopGracePeriod()","b537488c":"GanaToken()","b537752f":"transfer(address,address,uint256,uint256,bool,bool)","b537f5b5":"settleBet(bytes32,bytes32)","b5389c20":"timeToBeBurned()","b538c5ea":"addWorkerPool(address,address)","b538cefc":"subtractDarknodeFee(uint256)","b538d3bc":"addArbiter(address)","b539cd55":"maxProfit()","b53aab4c":"changeServicePercentage(uint256)","b53b0a75":"Startex()","b53b1f12":"findRankByCount(uint256,uint256,uint256,uint256)","b53b3f41":"LuckyTree(uint256,uint256,uint256,uint256)","b53c71b6":"addLifeEvent(string,string,string)","b53c7245":"set_min_contribution(uint256)","b53dfdb9":"getTeamFund()","b53e9dfe":"requiredContribution()","b53ea172":"calcBindedBlindHash3(string,address)","b53ea1b6":"replaceKey(address,address)","b53eb39f":"getSecondsToComplete(bytes16,address,address,uint256,uint256)","b53f4d94":"setPOOL_edit_32(string)","b53ffba0":"owner_testEnd()","b5402ec3":"manager_withdraw()","b54030d5":"recordNr()","b54050c2":"_updateStateIfExpired()","b54144b2":"Receipt(address,uint256,uint256)","b5417a52":"TEAM_VESTING_WALLET()","b541a778":"SampleOffer(address,bytes32,uint256,uint256,uint256)","b5432fcc":"setManagerAgent(address)","b5439012":"closeSale(address,uint256)","b543d4b4":"getMasterWallet(address)","b54430ce":"canSign()","b5444ef2":"becomeCoowner()","b5446457":"deleteRoomByIndex(uint256)","b544bf83":"lockTimestamp()","b545252c":"isNewDay()","b545ddf5":"calculateReleased()","b545f2a6":"cards_blue(uint256)","b547a726":"turnOff(address)","b547aeda":"spawn()","b547b7a1":"committeesMap(address)","b54811f1":"EtheremonTransform(address,address,address,address,address,address,address)","b5481743":"exchangeRateAgent()","b5483f28":"changeAddressJoker(address)","b548c6f6":"Transaction1()","b549793d":"scheduleCall(bytes4,bytes,uint256,uint256,uint8,uint256)","b549bdda":"XavierToken()","b549c6b3":"_transferInvestor(address,uint256)","b54a7987":"LogGetDeposit(address,uint256,string)","b54b1187":"setdteamVaultAddr4(address)","b54b4fb9":"getPriceOf(uint256)","b54beedc":"getCCH_edit_10()","b54c71eb":"weightedVoteCountsOf(uint256)","b54ca7b4":"setIncreaseK(uint256)","b54cd451":"updateFlightStatus(bytes32,uint256)","b54d6238":"releaseToken(uint256)","b54e7a4a":"sanitize(string)","b54eb822":"redistributionTimeout()","b54ef544":"buyStakeWithStarCoin(uint256,address)","b54f24a9":"getMappingID(string,address,address)","b55027a9":"maxMinutesFundingPeriod()","b550e634":"getTotalInvestmentsStored()","b551c373":"getTotalReputationSupply(bytes32)","b5522e89":"addContract(address,uint256)","b5531651":"Startable()","b553b715":"rewardDistributedUnits()","b55459d1":"User_5()","b5545a3c":"claimRefund()","b554f8eb":"withdrawAllWei(address)","b5554e73":"getPlayerJackpot(address,uint256)","b5558562":"tokenWithdraw(address)","b556188e":"finaliseTime()","b5563dcf":"BillOfSale()","b5565aac":"endPromotion(uint256)","b556861a":"add_tokens(address,uint256)","b556a895":"incFreezeHybridizationsCount(uint256)","b556ff26":"NewBid(bytes32,address,uint256)","b557478a":"refundClaimed(address)","b557a11d":"getReplyCount(bytes32)","b557c9a4":"slaveWalletInitialized()","b5581663":"airDropMultipleAmount(address[],uint256[])","b55845e7":"totalExchange()","b55867ea":"_goldUnFreeze(uint256)","b558a50c":"LongevityCrowdsale(address,uint256)","b558d1ea":"updateRate(address,uint256)","b558f334":"isRedemptionPermitted(address,uint256,uint256)","b559490d":"payVisa(uint256,uint256)","b559b0fe":"withdrawFromRemainingTokens(uint256)","b55a7d45":"multiplierPercent()","b55ad27e":"getBlipTokenAddress()","b55b089b":"bigTokensPerEther()","b55cdbf9":"setExtraBalance(address,uint256)","b55cff2d":"test_twoValidEqBytes()","b55da874":"create_private_room()","b55e31f4":"assertOrders(address,bytes32)","b55fc3d6":"UnregisterList(address[],bool)","b560b6da":"enableDistrict0xNetworkTokenTransfers()","b560c4de":"adminPayout()","b560d589":"getUserInvestBalance(address)","b561d5b3":"OrguraExchange()","b5622abc":"EuroGoldTest(uint256)","b563b75d":"getAdminRevenue()","b564561e":"register(bytes32[])","b56494c0":"validateBoard(uint256[81])","b56537ef":"isEASigned(uint32)","b566d0b4":"getContributorRemainingPresaleAmount(address)","b5674c68":"TokenGNO(uint256)","b5675ee4":"bookkeeping(uint8,uint8,uint256)","b56797fd":"getSaleHourNow()","b567a1e7":"ShopClosed(uint32)","b568e689":"getCrowdsaleWhitelist(address,bytes32)","b5692a67":"removeExemptionAddress(address)","b569a35f":"YSSYBToken(uint256,string,string)","b56a9f2c":"heartBeat()","b56aef62":"sampleTypes(uint32)","b56b2627":"add_owner(uint256,address)","b56b366b":"maliceReportedForBlock(address,uint256)","b56b5918":"TicketRefund(uint256,address,uint256)","b56b64d9":"disputing()","b56ccd93":"arr(address,address,address)","b56d3ccc":"select(bytes32,bytes32,bool)","b56d4717":"lockOwner(address)","b56e1bca":"setExchangeToken()","b56e2d76":"testRewardSS(string)","b56ea5cc":"specialApprove(uint256,bytes32,bytes)","b56ebf42":"GetNow()","b571324d":"ShareErc20(string,string,uint256)","b57228fd":"ChangeEmissionGrowthCoefficient(uint256)","b5725445":"setOptionalFeeSplit(address,uint256)","b5738a78":"SatoMotive()","b573a104":"secondStageTokenRate()","b5740cc2":"preSaleVault()","b5744134":"setLaunchDate(uint256)","b5754045":"disown(string,address)","b57566d8":"setvalue(string,string)","b5776339":"transferGDPOracle(address)","b5784f6f":"testMultiplePackages()","b57874ce":"addressToPass(address[],bool)","b578e764":"ACNN()","b579184f":"addContributor(address)","b57934e4":"haltCrowdSale()","b5794222":"destroyAndSendToStorageOwner()","b57980ce":"prepareContribution(uint256,uint256,uint256)","b579b6c5":"distributeToken(uint256,uint256,bool)","b579d7de":"RewardEnd()","b57adee3":"setBanker(address,uint256,uint256)","b57c5814":"getDonatorsNumber()","b57d5d27":"assertBalance()","b57dbdc6":"safeguard()","b57e55ec":"seeAllPlayers()","b57e6ea1":"tokenGenerationMax()","b57ff495":"triggerPauseEvent()","b5802ae6":"getCirculationCap(address)","b5809c9b":"COPPER_AMOUNT_TPT()","b580a7a1":"totalBalanceClaimed()","b580d205":"ChangeRate(uint256,uint256,uint256,uint256)","b58166f2":"lastRoot()","b581b725":"transferToken(bytes8,address,uint256)","b582ec5f":"j()","b58489ac":"isAuction(string)","b5848db4":"validateStartMegabox(address,uint256)","b585245b":"_callSender(address,address,address,uint256,bytes,bytes)","b58617d9":"CCRCrowdsale()","b58637e8":"approveToSell(uint256)","b5863ed7":"addContribution(address,uint256,uint256,uint256,uint256)","b58696ba":"test_ShouldPassButNoBondSoFail()","b587194e":"TokenMigration(address,uint256)","b587dc57":"openICO()","b587e3c7":"getRank04()","b5881422":"unsafeIsEth(uint16)","b588bfad":"writeMessage(string)","b588fdc1":"takeTokenContractOwnership()","b58aa6be":"checkWithdrawalAmount()","b58b9d5c":"getSaveData(address,address)","b58baa0d":"displayString()","b58c2d31":"addAddressManual(address)","b58d0651":"checkAllowedAddressFoTransfer(address,address)","b58d4885":"addNewTrait(string,bool)","b58de1d5":"JSONpath_int(string,string,uint256)","b58dff99":"gntContractAddress()","b58e5216":"allowBlocking(address,address)","b58e60db":"theWord()","b58ee9a3":"companyRemainingAllocation()","b58f4a24":"LOTTERY_FUND_ADDRESS()","b58fa125":"commit_end_time()","b58fc3e7":"distributeIncomeEther()","b5917478":"TYPE_FREIGHTER()","b5919b48":"toBuyBack()","b591fc69":"totalEtherContributed()","b5922a2b":"INITIAL_AIRDROP()","b592500e":"RICEBALLZ()","b59284ac":"unlinkAddress(address)","b592bb99":"SSDToken()","b592de3a":"sell(bytes32,uint256)","b5930872":"test_testablestandardcampaignDeploymentAndUse()","b5931f7c":"safeDiv(uint256,uint256)","b5932ee2":"DistrictsCore()","b5936da2":"seedEnded()","b594f086":"changeDuration(uint256)","b5950529":"CTSCToken()","b595181f":"ShapeshiftBot()","b595357b":"getLLV_edit_29()","b5957288":"getMatchBettingDetails(uint8)","b59589d1":"relay()","b595b8b5":"betOnColor(uint256)","b5962159":"moveMinions(uint8,uint8,uint32)","b5967e16":"updatePlayersGoo(address)","b59712af":"totalSupplyOfType(uint256)","b59724e8":"NewFunding(address,address,uint256,uint256,uint256,address)","b597842a":"TimeNow()","b597e784":"setTokenPriceInWei(uint256)","b5980f7d":"unverifyAddress(address)","b598afcb":"oraclize_query(string,bytes[5])","b598d3e8":"getMessages(address,uint256)","b598f882":"updateTokenRates(uint256)","b5999c12":"getPoohsSinceLastHatch(address)","b599aaec":"TheBitcoinCenterToken()","b599afc8":"totalBetCount()","b59a1598":"distributeGLAU(address[],uint256,uint256)","b59a1d37":"buy1(uint256)","b59a60db":"minContribute()","b59b0fc4":"modifyTokenPrice(uint256,uint256)","b59b44f5":"usePlayerFiboken()","b59b6acb":"GetDynamicCardAmountList(address)","b59bb5e3":"testcall(address)","b59bc382":"setReportingFeeDivisor(uint256)","b59ca0f6":"registerDINsWithResolver(address,address,uint256)","b59d689f":"grantStock(address,uint256,uint256)","b59d7fe6":"EtherbotsBase()","b59dd856":"GetCardInfo(uint8)","b59f16d1":"Set(bytes32,address,address)","b59ffdd3":"getFreeAnthill()","b5a01992":"setDDF(address)","b5a02db1":"totalHouseWinnings()","b5a030d8":"link(bytes32[],bytes32[],address[],uint8[],bytes32[],bytes32[])","b5a04829":"setLargeCapWhitelistParticipants(address[],uint256)","b5a0596e":"declareCheaters(address[])","b5a127e5":"minQuorum()","b5a1a64b":"lockedRewardsOf(address,address)","b5a27a21":"leave_square(uint256)","b5a29d11":"purchaseCRS(uint256)","b5a312c6":"mintlvlToken(address,uint256)","b5a46d5e":"whoOwner()","b5a4a146":"generateRnd(bytes,uint256,uint256)","b5a4e04a":"canFinalizeEarly()","b5a54627":"setPrimaryGameManager(address)","b5a5b8f5":"setPreSaleContract(address)","b5a60045":"setJob(uint256,string,string,uint256[],uint256,uint256,uint8[],uint8,bool,address[])","b5a678d7":"YouRyuCoin(uint256,string,string,uint8)","b5a6c525":"extractFrozenAccountLength()","b5a7900e":"nextroundsoldierreplenishrate()","b5a89065":"getUserData(address,string)","b5a8fa80":"VRChainToken(string,string,uint8,uint256)","b5a90793":"Sender(uint256,address[])","b5a9823f":"tier3Time()","b5a9de6e":"minEtherParticipate()","b5aab008":"WobToken()","b5aae6fc":"_setCurrentSecret(uint256)","b5aae91a":"handle_dividend(address,address)","b5ab05a5":"tokensHardCap()","b5ab58dc":"getAnswer(uint256)","b5ac7894":"partnerInfo_for_Partner(bytes32,uint8,bytes32,bytes32)","b5ac7c27":"payForOrder(uint256,address,uint256)","b5add717":"claim(uint256,uint256,uint256,uint256)","b5ade81b":"_BLOCKS_PER_READJUSTMENT()","b5ae4519":"endorsements()","b5ae64b2":"piStartTime()","b5aebc80":"donate(string)","b5aece02":"silverBoxAmountForSale()","b5af411f":"NXETToken()","b5afb120":"updateSkill(uint256,uint256,uint256,uint256)","b5afd61b":"maxForceOffsetAmount()","b5b12e75":"isApprovedFor(uint256,address)","b5b13462":"getUserTotalSales(address)","b5b1fc05":"getAdminFromMintedCappedProxy(address)","b5b26505":"DURATION_SALESTAGES()","b5b33eda":"scheduleCall(address,uint256)","b5b3fc07":"GlowToken()","b5b4d0d6":"COLLATERAL_HELD()","b5b52096":"fixedFeeInCWC()","b5b5a057":"changeMinimumDonation(uint256)","b5b64d24":"GetExistsChipList()","b5b73c63":"getUserSignedDocuments()","b5b77d7f":"executeSettingsChange(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","b5b7916b":"getMembershipType(address)","b5b7d767":"vpe_per_eos()","b5b86a51":"getReferralBalance(address)","b5b879c2":"mAlek()","b5b90a26":"addHash(bytes32[])","b5ba7074":"isBelow(uint256,uint256,string)","b5ba95a0":"ElectronicMusic()","b5ba9a7e":"getReferralPackageKind(bytes)","b5bab68e":"minLimitPublicSecondSale()","b5bb0ade":"agreementExists(bytes32)","b5bb5ee4":"withdrawMintTokens(address,uint256)","b5bd3eb9":"totalCredits()","b5bf15e5":"freeze(bool)","b5bf4c74":"RandomWinner()","b5bf6eb6":"incrementPrice()","b5bfdd73":"addDSource(string,bytes1,uint256)","b5c05570":"toggleLockIn()","b5c07eab":"metaBaseUrl()","b5c0c884":"refundLosersBids(uint256)","b5c12c09":"cancelRequest(uint32,string)","b5c12f4d":"setWhitelistRequired(bool)","b5c14adb":"setGamePaused(bool)","b5c150d4":"availableAmount(uint256)","b5c1662f":"addWei(address,address,uint256)","b5c18ea8":"rejectClearingPriceSubmission(address,address,bytes32,uint256)","b5c19d59":"betLastTime()","b5c1ac14":"toBE()","b5c2b889":"XTVBurned()","b5c2c600":"Gave(address)","b5c3a111":"depositCell(address,uint256)","b5c4147f":"getZoneShop(bytes2,bytes16)","b5c47f69":"megaRate()","b5c56797":"AIMToken()","b5c5a635":"incrementProgressOfAddressAndId(address,address,uint32)","b5c5f672":"withdraw(address,uint256,uint256)","b5c61e90":"TokenMigration(address)","b5c645bd":"record(bytes32)","b5c6b5a2":"FishFarmer()","b5c6e7d6":"getCountsByName(bytes32)","b5c73816":"ASSC()","b5c7a4e4":"validateReleasedToken(uint256)","b5c7b1fe":"claimTokenTokens(address)","b5c83592":"offerExists(uint256)","b5c8b021":"testMintableToken()","b5c8f317":"SimpleERC20Token()","b5c90917":"GetAllReferralAddresses()","b5c9cbbe":"setBalance(address,address,uint256)","b5c9fa0a":"setBountyRewardPercent(uint256)","b5caadf2":"setParams(address,address,address,uint256,uint256)","b5cab1ce":"tokenMetadataBaseURI()","b5cadc91":"convertForMultiple(address[],uint256[],uint256[],uint256[],address)","b5caf461":"removeAllApprove()","b5cb0611":"setCrowdsaleState()","b5cb15f7":"getUserCount()","b5cb6a17":"capDay3()","b5cc7e29":"unfreezeTokenTransfer(bool)","b5cc84f5":"getVatomOwner(string)","b5cc916c":"CITY_PRICE()","b5cd1821":"lastBlock_a0Hash_uint256()","b5ce3600":"thirdStageDuration()","b5cf852d":"triggerHiddenCap()","b5d011fd":"updateCalculator(address)","b5d02a56":"nextRand(uint256)","b5d03751":"YoutubeViews()","b5d0c747":"setApiCallsContractAddress(address)","b5d0f16e":"getGasScalar(uint256,uint256)","b5d11d39":"validatePurchase(uint256)","b5d11e99":"testInit()","b5d1220a":"hasPreviouslyEnteredCardIds(uint256[])","b5d125f1":"isApprenticeChest(uint256)","b5d1548c":"CCH_RE_1()","b5d1990d":"numRecords()","b5d1aedc":"COLOR_YELLOW()","b5d29f21":"authorizationPayment()","b5d347ed":"CryptoCityToken()","b5d34966":"unlockCapital(address,uint256)","b5d3a379":"CanaryTestnet()","b5d3a9c6":"groomSignedAt()","b5d446ab":"mokenEra(uint256)","b5d561bb":"migrateManual(address,bool)","b5d65f61":"partialRedeem(uint256,bytes32)","b5d6cbfe":"FSHN()","b5d76067":"Alter_TrustlessTransaction(uint256,bool)","b5d7df97":"Sign()","b5d7eca5":"token_was_created()","b5d8514b":"Arthimetic()","b5d86c86":"ownerOfCountryCount(address)","b5d89627":"getValidator(uint256)","b5d9ac79":"toB32(bytes,uint256)","b5d9f80b":"serverEndGameConflict(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,bytes32,bytes32)","b5da0114":"isNull()","b5da2df4":"markAsImported(address,address)","b5dadb17":"whitelistThreshold()","b5db26cd":"manualOverrideEditionBid(uint256,address,uint256)","b5dba35b":"onlyMinterMock()","b5dc40c3":"getConfirmations(uint256)","b5dc9399":"fetchPaidOrdersForPayerByAdmin(address)","b5dcbb69":"takeRegion(uint16)","b5dd20e9":"createIsland(bytes32,uint256,address,uint256,uint256)","b5de8d4c":"getModule(address)","b5dea68c":"_addNewEscrow(address,address,address,uint8)","b5debaf5":"exp(uint256,uint256,uint256)","b5debd95":"totalAmountOfEarlyPurchasesInCny()","b5deeca7":"BaseRegistry()","b5df3ef8":"WillWithdraw(uint256)","b5dfad16":"specialSkinOfTokenId(uint256)","b5dfd153":"withdraw(uint256,uint256,address,uint256)","b5e02e84":"Exorbuxcom()","b5e11819":"disableContract(bool)","b5e12715":"updateRankList(address)","b5e1fe13":"thirdTokenExchangeRate()","b5e221c1":"winnerBidder()","b5e292d3":"processHandEnd(bool)","b5e3504a":"HumanX1()","b5e35248":"stage2NotReached()","b5e36417":"transfer(uint256[])","b5e4d6ce":"addOrder(bool,uint32,uint128,uint128,uint32,int256)","b5e4ece1":"LOG_GasLimitChanged(uint256,uint256)","b5e54406":"amountOfItem()","b5e574e9":"SetGasSell(uint256)","b5e59318":"SLPC_ERC20Token()","b5e71687":"getTeam4name(string)","b5e73249":"mint(address,uint256,bool,uint32)","b5e8077c":"_unpackWarriorId(uint256,uint256)","b5e82975":"setMintDone()","b5e872e0":"TransferFeeRateExecuted(uint256,address,uint256)","b5e8cf02":"burnReward(uint256)","b5e91891":"changeStock(address)","b5e989c7":"ballotOptions(uint32,uint32)","b5ea510a":"YOBTC()","b5eacc01":"investor(address,uint256,uint256)","b5ec85f0":"getOldBalanceOf(address)","b5ed298a":"proposeOwner(address)","b5ee6f3d":"isVotingPhaseOver()","b5eeee6e":"cleanSeedUp(address)","b5ef06d0":"changeDeveloperETHDestinationAddress(address)","b5ef649d":"GetChipUsedNum(uint32)","b5f09a39":"lockupDate()","b5f0f41b":"allowedTransferTo(address)","b5f12736":"CustomToken(uint256,string,string,uint256)","b5f16939":"saleRevenue()","b5f16e48":"setShareholder(address,bool)","b5f187b9":"changeFundWallet1(address)","b5f2054b":"getWinningsBalance(address)","b5f228d7":"LiquidityNetworkToken()","b5f26055":"restrictedStockSendTimeOf(address)","b5f3484d":"PaymentStatusTimeStamp(address)","b5f3e71a":"addAddressToAdminlist(address)","b5f45edf":"marketPoohs()","b5f50ef3":"claim_prize()","b5f529cf":"orderNotAccepted()","b5f5962a":"CALL_GAS_CEILING(uint256)","b5f59a92":"LUV_Crowdsale()","b5f5d582":"TPortToken()","b5f6b1f6":"setBonusThreshold(uint256)","b5f72d88":"beginProjectRound(string,uint256,uint256)","b5f78d11":"purchase(bytes8)","b5f7f636":"totalTokenSold()","b5f918ff":"roundOneAmount()","b5f9371a":"writerAccountSupply()","b5f9b1c2":"Bonds(uint32)","b5f9ca19":"doesPaymentExist(address,address)","b5fa2044":"SetPatentProperties(uint256,uint256)","b5fa77bd":"SetAddress(string,address)","b5fb19ed":"addressEccles()","b5fbc49f":"isAreaEnabled(string)","b5fcfbcc":"_getProviderAdmin(uint256)","b5fd76bb":"AddLocation(string)","b5fdeb23":"getMsg()","b5fe79db":"getInfoLevels()","b5fea522":"putBtcWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","b5fecc30":"stockSupply(uint256)","b5ffa082":"StorageUpdated(address)","b6010fcd":"getItem(string)","b6013cef":"finalize(uint256,uint256)","b6015204":"receiver2()","b601818b":"newOwner(string)","b601e850":"loanMatured(address)","b6027026":"AOK()","b602a917":"changeTransferStats(bool)","b6030d35":"nProposals(uint256)","b6033daf":"getMintingPowerByAddress(address)","b6034964":"_endContestIfNeeded(address,uint256)","b6037759":"setStudentNumber(uint256)","b603cd80":"killMe()","b604a86e":"ratePublicSaleStage()","b604ad72":"create(string,string,uint8,uint256,address)","b604ed1b":"withdrawByGid(uint256)","b6055167":"receiveExternalProfits()","b6062b5b":"ICO_TOKENS()","b607068c":"getMyDividendRate()","b60710c0":"LogWithdrew(address,uint256)","b60761c4":"Internet(string,string)","b607ea45":"claimTilesForNewUser(bytes32,bytes,bytes32,bytes32,uint16[],address)","b60868be":"getFishAtBase(uint256)","b608c938":"releaseNextShares(uint256)","b6096ce9":"EloTest()","b609d0e6":"lastOracleUpdate()","b60a7405":"_addOwner_(address)","b60a82e0":"addSponsorship(address,uint256,uint256)","b60ad98d":"Board(address,bytes32)","b60afaa4":"distributeLCWP(address[],uint256,uint256)","b60b3c59":"otcPurchaseAndEscrow(uint256,address)","b60b7084":"builtOn()","b60b9fcb":"joinGame(uint256,uint256)","b60b9ff7":"Shopdex()","b60cc68b":"MIN_ICO_SLOGN_COLLECTED()","b60cee3c":"countAllSmartSharingContract()","b60d4288":"fund()","b60e00b9":"disableBets()","b60e2333":"joinTeam(uint256,address,uint256,uint256)","b60e6bc0":"tokenIdToApprovedRecipient(uint256)","b60e72cc":"log(string,uint256)","b60eb800":"addressSCEscrow()","b60f54f4":"SortingCoins()","b60f5b91":"isPreICO()","b60ffa9c":"setDistributeAgent(address)","b61012a9":"preICOparticipated(address)","b610c75e":"incrementTimestamp(uint256)","b611d649":"GteChainERC20()","b61241ed":"allocateTokens(address,uint256,address)","b612ac29":"BONUS_15_DAYS()","b61334b1":"setPayoutsWallet(address)","b6136dca":"alt()","b61386fb":"registerHandle(string)","b6139992":"issue(address,address,uint256)","b613df16":"_finishBet(bool,address)","b614213d":"maxPriceInWeiFromUser()","b615243a":"getExtraTokens(address)","b6172704":"isConfirmedStakeholder(uint256)","b61727ed":"_transferTo(address,address,uint256)","b6176a33":"addStakeholderTransaction(address,bool)","b617a4fd":"getClientCategory()","b617cf42":"removeExchange(address,uint256)","b618214a":"enableService(address)","b618387a":"registerBuyer(string,string)","b618cbba":"EvLoginfo(string,string)","b618d9a4":"checkStatus(address,address,uint256)","b6195134":"changeAdminToo(address)","b61992e7":"setPricePerBlockInWei(uint256)","b61a98cb":"updateMarriageLicenceImageIPFShash(string)","b61c0503":"fireEventLog1()","b61cb058":"setAvatarFee(uint256)","b61cbcd3":"nextGenome()","b61d27f6":"execute(address,uint256,bytes)","b61d4511":"maxPreIcoTokens()","b61daaee":"tokenBase()","b61e96a5":"requester()","b61f16e3":"getEarningsPool()","b61f36f7":"calculateWdxFee(uint256,uint256,uint256)","b61fa7c0":"doAirdrop2(address,address[],uint256)","b6206e67":"unitBattlePLATCost(uint256)","b6213490":"initialDrop()","b6215091":"Test2Token()","b621bd15":"SALES_END()","b622ab4a":"buyWithFunction(bytes4)","b6230a74":"icoStatusUpdated(address,string)","b623f5e5":"checkSetCosignerAddress(address)","b62418a1":"decrementOpenInterest(uint256)","b624fc54":"rafEnd()","b6253539":"needsInitialization()","b62596a2":"fundStorageVaultAddr()","b625dd87":"getUpdateTAOContentStateSignatureAddress(address,bytes32,address,bytes32,uint8,bytes32,bytes32)","b6261d0a":"acceptOffer(address)","b6266248":"refunded(uint32)","b626913f":"buy_block()","b627cf3b":"welcome()","b627ff04":"Sheep(string,string)","b6282d0d":"angelOnBattleboards(uint64)","b628672b":"setPreSaleHalt(bool)","b6288553":"decim()","b6294bde":"AdminGetFee()","b629d741":"transferUnownedPlanet(address,uint256)","b62c0b41":"MintByBTC(uint8,address,uint256)","b62c208f":"CryptoQuantumTradingFund()","b62c3a4f":"FinastraToken()","b62d4301":"testingSelfDestruct()","b62d4ce1":"canLayEgg(uint64,uint32,uint32)","b62eac16":"CrowdsaleProxy(address)","b62f0a6b":"YouTubemasterReq()","b62fc7c0":"buy2(address[],address[],uint256[],bytes,bytes)","b63005ec":"withdrawJuror()","b630230a":"MIN_CROWSALE_TIME()","b6304c2a":"KOINCONEKT()","b6307f0e":"nLuckyVoters()","b630aa48":"tokensSentPresale()","b630d706":"thisisfine(uint256)","b631c8e8":"_generateCastleSale(uint256,uint256,uint256,uint256)","b632d2e0":"SingularityTest20()","b633620c":"getTimestamp(uint256)","b6339418":"storeNumber(uint256)","b633b2ab":"getNextRoundTimestamp()","b633d272":"emitWorkResumed(uint256,uint256)","b633e4cd":"claimBalance(address)","b63423a3":"testCheckoutCart()","b63426b3":"Oxygen()","b634fc77":"FathomToken(address,address,uint256,address)","b6356251":"callThisContractBalance()","b63569c3":"developer_address_for_C(address)","b635a52d":"disconnectOrderPrice(address,address,uint256)","b635ba5f":"getEthValueAmount()","b6363cf2":"isOperator(address,address)","b63688d3":"setValidationOpen(uint256)","b637b269":"maximumValueDuringGuaranteedPeriod()","b637b7c4":"BZToken(uint256,string,string)","b638f72a":"_preICOSale(address,uint256)","b6397a42":"lotteryGiveHunt()","b639c9ec":"burnWarrior(uint256,address)","b63a35bf":"CTX_Cap()","b63a61d3":"auther_user()","b63adb3a":"preico(uint256,address,uint256,uint256)","b63bb5c6":"SNToken(uint256,string,string)","b63c2ac4":"setPowerContract(address)","b63c57f1":"buyForBitcoin(address,uint256)","b63ca981":"setHKGPrice(uint256)","b63cf3ca":"BitcoinDiamond()","b63deb24":"setSendProfitsReward(uint256)","b63df2a0":"approveControllerContractMigration()","b63e0cd8":"start(uint32)","b63e93dc":"ownerClawback()","b63ed405":"getWeiBalance()","b63f0d20":"newcheckToken()","b642c768":"_distributeTeamToken(uint256)","b642d58f":"INIT_DATE()","b6435f00":"getUsersAwaitingForTokensTop150(bool)","b6438092":"ManifestoCount()","b643f2c9":"stopDefrost()","b644ee41":"PRESALE_END_DATE()","b6469620":"getPersiansBattlePoints()","b64698cb":"_resolveAquarium(uint256)","b646c194":"addApprover(address)","b647990a":"countVotes()","b6481a92":"GotingToken()","b6496c6a":"addressLUTSize()","b64a097e":"info(bytes32)","b64afbe5":"participate(address,uint256)","b64b09d5":"invokeFallback(address)","b64bbd9e":"Finalizable()","b64c154a":"Klassicoin()","b64c1e7e":"claimForDeposit(address,address)","b64c4905":"sellVolumesCurrent(address,address)","b64c9326":"projectoperation_beneficiary()","b64d44f1":"TeamLockingPeriod12Months()","b64dc853":"onCompensated(address,uint256)","b64e2fc4":"getIncludes(uint256)","b64e8ad8":"addAllocationPartTwo(uint256)","b64eecb1":"transactionRequestCore()","b64f3cac":"getDSPRegistry()","b64ff429":"consent(bytes32[])","b64ff868":"getAdvertisers(bytes32,uint256)","b650048b":"unpausePlayerContracts(uint256,uint256)","b6506f25":"setLLV_edit_20(string)","b6508067":"lastTotalSupply()","b6509c12":"Ethereum_twelve_bagger()","b650bbef":"safetyInvariantCheck(uint256)","b65177ee":"ERC827Receiver()","b651cbaf":"add_level(address,bytes)","b652c822":"transferPosition(bytes32,address)","b652dc2f":"SOFT_CAP()","b65412b5":"refundPayment()","b65418f5":"raisedIcoValue()","b6549f75":"revoke()","b654bdb0":"HIBA()","b655d0c4":"getBaseRate()","b655e138":"sliceAddress(bytes,uint256)","b655f822":"Ballot()","b655fda2":"updateUserFullName(address,bytes32)","b656850a":"_getStakingEpoch()","b656e9f4":"isInTestMode()","b6576bdf":"getValue(bytes)","b657ae63":"eSendTokens(address,uint256)","b657c996":"control(address)","b6581516":"crossForkDistribution()","b6588ffd":"del()","b65a1350":"rateLastWeek()","b65a34f5":"CeffylToken()","b65ae769":"WithdrawSpecialToken(address,uint256)","b65b3f80":"exchangeAndSpend(address,uint256,address)","b65b4c9a":"sponsoredBonusMax()","b65b99a3":"_verifyDate(string,uint256)","b65bce8b":"ContractDisabledEvent(uint256)","b65be60d":"_updateLots(uint256)","b65c2611":"setUnfreezeTimestamp(uint256)","b65c2b40":"incrementLastTokenId()","b65c3a7f":"calcAmountAt(uint256,uint256,uint256)","b65cb801":"SnailToken(uint256,string,uint8,string)","b65d0807":"Carpio()","b65dc843":"crowdsaleMintingCap()","b65ddf2b":"addTipForDeveloper(uint256)","b65e1ab8":"setGoldmintFeeAccount(string)","b65f3bb5":"executeOffset(address,uint256,address,uint256)","b65f90e3":"split(uint8,bytes6,uint8)","b65ff419":"deleteNick()","b6607cc5":"AML_THRESHOLD()","b6608467":"updateShares(uint256)","b660d77c":"switchMPO(address,address)","b6615acc":"_isAllowed(address,uint256)","b661f55d":"saleTokensHaveBeenMinted()","b6622c0f":"updateDonor(address)","b6629d98":"placeBetEth(bytes)","b6629e20":"purchaseWithEth(uint256)","b662a73c":"freezeUpgrade()","b662dc9b":"OWNER_SUPPLY()","b662ef9c":"InsuranceMasterContract()","b6635be6":"setupComplete()","b663dc0a":"ONE_QUINTILLION()","b6644080":"ADMIN_GET_USD(uint256)","b66578dc":"nextSeedHashB()","b6660af4":"schelling(address,address,bool)","b667486d":"BetClosedNoWinningTeam(address,uint256)","b6674935":"minPot()","b66846fc":"offerToSell(uint256,uint256)","b668efe7":"PI_EDIT_2()","b6693f80":"phase_2_remaining_tokens()","b66a0e5d":"startSale()","b66a261c":"setSpread(uint256)","b66a323c":"claimThrone(string)","b66a94ef":"erc20ECHT(uint8)","b66aae65":"removeHoldByAddress(address)","b66afea3":"getOrCreateFeeWindowByTimestamp(uint256)","b66ce7cc":"Ignite()","b66d887a":"setSTGContractAddress(address)","b66dbdc5":"totalSupplyHistoryLength()","b66dd4b2":"lockFromSelf(uint256,string)","b66deb80":"removeEntry(address)","b66e68f2":"testFirst(bytes)","b66e7524":"getReportingStartTime()","b66f7a8b":"isEnded(uint256)","b6700930":"removeSet(bytes32)","b670a4b1":"unsoldTokens()","b670a910":"frontWindow()","b6712a4f":"gatFoundDeposit()","b6721bc4":"setMinPaymentForAnswer(uint256)","b6725bcf":"bitswift()","b672b4d4":"testTransferToken()","b672cf50":"balanceOf(uint128)","b6738bfb":"presalePiStart()","b673a75c":"crowdsaleAddr()","b673ddb7":"hasAirDropHero(uint16,address)","b674e749":"mock_contains(address,address)","b675271e":"contributeForDcorpMember(address)","b6755038":"_setPotValue(uint256,uint256)","b6757b50":"RocketPoolToken()","b67590aa":"batchTrade(address[11][],uint256[11][],uint8[2][],bytes32[2][],bytes32[2][])","b6761717":"pullEtherFromContract()","b67719fc":"WithdrawFunds(address,uint256,address)","b6791322":"createERC20(uint256,string,uint8,string)","b6791ad4":"getChain(uint256)","b67a77dd":"ART1(address)","b67aa257":"purchasePop(uint256)","b67b1a4d":"withdrawEtherOnlyOwner()","b67b60c7":"nextPrime(uint256)","b67b7163":"approve(string)","b67ba1b5":"killWallet()","b67c2893":"VitalLogging()","b67c838f":"Total_Paid_Out()","b67cb359":"feed1(uint256)","b67d4111":"getItemUri(uint256)","b67d50b5":"referrerBalanceOf(bytes32)","b67d77c5":"sub(uint256,uint256)","b67d8c69":"order_counter()","b67ddf20":"BlockICOdatetime()","b67e2064":"injectEtherFromIco()","b67e5b3b":"validPurchaseBonus(uint256)","b67f4eff":"sendTo(address,uint256,uint256)","b67f8b6d":"Master()","b67fabdf":"scheduleTransaction(address,uint256,uint256,bytes)","b68035a7":"COMMISSION_DIVIDER()","b6813b1c":"setcoe(uint256,uint256)","b6816590":"previousFounders(uint256)","b681f9f6":"resumeContribution()","b6823a66":"tournamentRewards()","b682c019":"pieceWanted()","b682da3e":"feesData()","b682ea1b":"_figthEnemy(address)","b6834572":"EOS()","b684101d":"emitExecuted(address,uint256,uint256,uint256)","b684ccad":"getDisputesToSolve()","b6854f96":"freezeToken(uint256)","b6868a69":"theFunction()","b686a635":"PossContract()","b686c983":"cancelLoanRequestAtIndexByBorrower(uint256)","b686d8b4":"holdingTaxInterval()","b686e44c":"SHA256ofArtwork()","b688524f":"_isCeo(address)","b688578c":"STAGE_3_START()","b6889e48":"globalChanceNo()","b688a363":"join()","b6893f7d":"DataContacts(address,address,address,address,address)","b6898845":"RPESALE_TOKEN_SUPPLY_LIMIT()","b689ca61":"sellsIntermediateGoodWithDepletion(address,uint256,string,uint256)","b689d5ac":"has()","b689d850":"FederatedOracleBytes8(uint8,uint8)","b68a06ba":"transfer_with_extra_gas(address,uint256)","b68c6ae3":"mtcLastDay()","b68cc035":"bonusLimit(uint256)","b68cf49f":"roundResolved()","b68d1809":"getDomain()","b68d1d4d":"addressInArray(address)","b68e15d6":"freezedAccounts(address)","b68e21ac":"FinishLottery()","b68e7f6e":"testCastVote()","b68e8552":"setRegionOwner(uint16,address,uint256)","b68e8760":"setBn(bytes32,bytes32,string)","b68ed11f":"preSaleSoldTokens()","b69065d6":"DevelopeoERC20(uint256,string,uint8,string,bool,bool)","b69147f2":"monthlyMinting()","b6926b52":"RaffleDraw()","b692c89d":"getRaised()","b6932ce7":"solicitaPagamento()","b694dbb5":"fromBytesToBytes32(bytes)","b695ecfd":"HonestHeart()","b696a6ad":"issue(uint256,address)","b6972146":"mul(int128,int128)","b6974d87":"cancelVoteForCashBack()","b6975ddb":"becomeSnakemaster()","b697fc93":"POT_DRAIN_TIME()","b6982c7f":"setup_race(uint256,uint256)","b6984002":"EQU(uint256,string,string)","b6992247":"getStakeholders()","b69924c3":"GetNextWithFunds(uint256,uint256)","b6994dc0":"RomanLanskoj()","b69a375d":"callback(uint256,string)","b69a8107":"setSkcAdderss(address)","b69b5611":"setOwnership(uint256,address,address)","b69ba46d":"publishMetaData(bytes32,bytes32,bytes1)","b69c0896":"BaseScheduler(address,address,uint256)","b69c2115":"approveRequest(bytes32,uint256)","b69e7d70":"random(uint256,uint256,address,uint256)","b69e9b1d":"getStaticElementAt(uint256)","b69ea1e9":"WineSpiritCoin()","b69ec629":"setBpToken(address)","b69ee531":"GBNC(string,string,uint256,uint8)","b69ef8a8":"balance()","b69f5ada":"totalUserProfit()","b69f917d":"addCosToGame(uint256,uint256,string)","b69fae22":"hashTransfer(address,address,bytes,uint256)","b6a0a119":"countDestinations()","b6a12f63":"setTokenMarketMaker(address,address,address,address)","b6a2b110":"SOCXSentToETH()","b6a324e0":"fundMe()","b6a46b3b":"create(string)","b6a48c2a":"abcLottoController()","b6a499ab":"_computePVPWarriorAura(uint256,uint256)","b6a4a0e9":"GogaTokens()","b6a5091a":"HuanHuiToken()","b6a59176":"getUsedCoreSupply()","b6a5d7de":"authorize(address)","b6a65665":"getGameData(uint256)","b6a79409":"necropolisContract()","b6a7b42c":"getMyTomatoes()","b6a8933b":"EXCHANGE_COMMISSION()","b6a96e45":"BuyCarCompleted(address,uint256)","b6a9ed31":"sellAnts()","b6abd4e7":"transfer_close()","b6ac24df":"updatePatchTree(bytes32)","b6ac4984":"tokenTransfersEnabled()","b6ac642a":"setWithdrawFee(uint256)","b6acabc1":"crowdFunding()","b6acc48c":"ICO_TOKEN_CAP()","b6acd931":"payDAPP(address,uint256,address)","b6ad4784":"resignTranscoder(address)","b6ad57d6":"paySmartContract(bytes32,address[],uint256[],bytes32)","b6add0f4":"initPrice()","b6ade100":"notifylvlClients(string,string)","b6ae90fb":"FuturOwner()","b6aeb4a2":"erc20VARA(uint8)","b6aeec7b":"CHATTER()","b6af3643":"setWithdrawalTime(uint256)","b6afd2ca":"listMembers()","b6b0eaca":"SMILEHEART()","b6b0f77b":"idToString(bytes32)","b6b18eff":"founderWithdrawablePhase1()","b6b1e359":"verifyIt(bool)","b6b2210c":"lockSell(bool)","b6b32c07":"presalePurchase(address[],address)","b6b35272":"isWhitelisted(address,address)","b6b3d325":"view40()","b6b425c7":"doSingleMigration(uint256)","b6b55f25":"deposit(uint256)","b6b57c9e":"setWhiteListContractAddress(address)","b6b57ebd":"finalizeWorkOrder(address,string,string,string)","b6b7032e":"rentalAccumulatedPrice()","b6b7e7eb":"toRLPItem(bytes)","b6b7e84d":"SGTExchangerMock(address,address,address)","b6b8c3cd":"m_categoriesCreator()","b6b9d57e":"propertyIndexToData(uint256)","b6ba1a98":"NIMFA_PER_ETH_SALE()","b6ba600a":"lockGNO(uint256)","b6baffe3":"getDifficulty()","b6bb38dc":"approveCetification(address)","b6bb3ade":"multiCall(address[],address,uint256[])","b6bba846":"sellTokensForDash(string,address,uint256,uint256)","b6bbafa2":"CrowdsaleStoneToken()","b6bbcf5b":"benchmarkRandom()","b6bcf354":"getCensuring(uint16)","b6bd387a":"lastRegionId()","b6bdedca":"MagnaChain()","b6be128a":"getPhoto(uint256)","b6beb400":"NuggetsToken()","b6bf1b3a":"mintForDisputeCrowdsourcer(uint256)","b6bf3bb3":"setBlackListERC20(address)","b6bf7318":"clz64(uint64)","b6c05255":"burnOwner(address,uint256)","b6c054ce":"restake(int256)","b6c0eca8":"LogRefund(address,uint256)","b6c1cb03":"transferFromWithComment(address,address,uint256,string)","b6c1eaad":"refundStarted()","b6c238b5":"starts(address)","b6c279ee":"setInputSize(uint256,uint256)","b6c32d71":"startStandardSale()","b6c37e58":"balancesRiskcoins(address)","b6c3987d":"validateHarCap(uint256)","b6c3e8cc":"increaseApprovalInternal(address,uint256)","b6c44bd1":"ZCash()","b6c47da1":"setSuperman(address)","b6c4da52":"addVestingRule(address,address,uint256,uint256)","b6c58236":"getOwner(uint32,int256)","b6c6ecd3":"getDial3Type(uint8)","b6c78f26":"HellaBank()","b6c88977":"finalizeCrowdfund()","b6c9f707":"ContractCreation(address,address)","b6ca878c":"addCard(bytes32,address,uint256,uint256,uint256,uint256)","b6ca8996":"CentrallyIssuedToken(address,string,string,uint256,uint256,uint256)","b6cb3777":"collectAnts(address)","b6cb405b":"getContractor()","b6cb5d72":"NFToken()","b6cb7f41":"fundsVault()","b6cba7eb":"recoverERC20Tokens(address,uint256)","b6ccc6ba":"signVer(address,bytes32,uint256,uint8,bytes32,bytes32)","b6cce5e2":"sponsor(uint256)","b6cd05e5":"withdrawAllTokensOnContract(uint256)","b6cd0b88":"setPersonalHash(bytes)","b6cdc815":"maixiaohetoken(uint256,string,uint8,string)","b6ce5581":"oraclize_query(string,string[5],uint256)","b6ceb489":"OWN_burn(uint256)","b6cf146c":"proposeMint(uint256)","b6cf3579":"PROVISIONING_supply()","b6d1d3d1":"setAirSender(address)","b6d1fbf9":"setXPERContractAddress(address)","b6d2a9b9":"SetupToken(string,string,uint256)","b6d31d97":"addToPrivateSaleWhitelist(address[])","b6d33511":"AKTestEther(address,address,address,uint256,uint256,uint256)","b6d34f12":"Emission(uint256,uint256,uint256)","b6d3faa3":"billingAmount()","b6d42ec3":"setApTime(uint256)","b6d5e8cd":"mintUniqueTokenTo(address,uint256)","b6d6164a":"reject(address,uint256,bytes,uint256)","b6d67a0b":"hasPlayerWon(uint8,uint256,bytes32,bytes32)","b6d6806c":"createEscrow(address,uint256,address)","b6d703ae":"confirmTotalTokenThreshold()","b6d7855a":"TokenName()","b6d7dbb2":"SAtomX()","b6d827bb":"WhitelisterChange(address,bool)","b6d8f59d":"WAN_TOTAL_SUPPLY()","b6d9721c":"getMerkleRootAndUnlockedAmount(bytes)","b6d9ef60":"setOracleFee(uint256)","b6dadbdf":"_createPart(uint8[4],address)","b6dadeb4":"getCardInsurance(uint256)","b6daea6c":"addAgency(address)","b6db75a0":"isAdmin()","b6dc1124":"private_setPauseState(bool)","b6dc572f":"addSubscription(address,bytes32,uint256)","b6dc8e25":"exchangedAmountToReceive(uint256)","b6ddcd14":"icoAccount()","b6ded5c1":"windowPeriodEnd()","b6df4906":"safeOwnerOf(uint256)","b6e087d6":"GunChain()","b6e119ab":"balanceOfEnvelopes()","b6e390ae":"First_pay_bountymanager()","b6e3943a":"AK4EtherDelta(address,address,address,uint256,uint256,uint256)","b6e3ca3c":"UpdatedExchangeRate(uint256)","b6e3cc1a":"authorCount()","b6e456bb":"getUInt()","b6e49fd9":"LocalEthereumEscrows()","b6e54bdf":"majority()","b6e76873":"getAction(uint256)","b6e7d90b":"delegatePass(bytes32,address)","b6e86e13":"createProxyImpl(address,bytes)","b6e8bac7":"anailNathrachOrthaBhaisIsBeathaDoChealDeanaimh(address[],uint256[])","b6e99235":"drawNumbers(uint256)","b6e9c2ac":"getUserBalance(bytes32)","b6ea62de":"kycApprove(address)","b6eb15c7":"gvOptionToken10()","b6eb7dae":"freedWosPoolToWosSystem()","b6ecd81c":"Vets()","b6ed0632":"cancelOrder(uint256,uint256)","b6ed3308":"setPriceOfEther(uint256,string)","b6ed9f15":"PFOffer(address,address,bytes,uint256,uint256,uint128)","b6eda884":"ads()","b6edc68f":"changeMicroPay(address)","b6edd743":"transferTokensTo(address)","b6ee48aa":"setContractSK(string,string)","b6ee8120":"realizedETH(address)","b6eeb6bb":"PREPURCHASER()","b6ef4454":"funderWithdraw()","b6ef78c2":"cancelCounterStack(bytes32,bytes32)","b6f020b2":"checkExistsItems(string)","b6f0391b":"setMap(string,string)","b6f085c7":"usernames(bytes20)","b6f0ecb1":"setAMLWhitelisted(address,bool)","b6f1a927":"CPAWallet()","b6f250ea":"determineWeights()","b6f29d50":"awardSellers()","b6f35624":"boughtAmountOf(address)","b6f36dcf":"owner3()","b6f3c071":"CyCo()","b6f3d256":"lowestBid()","b6f46b61":"claimBeercoins()","b6f46d4c":"RFQ(string,uint256,string)","b6f478de":"lifeVestingStage()","b6f4df34":"totalSupplyEdition(uint256)","b6f4f96c":"fundingThreshold()","b6f50c29":"setICO(address)","b6f529d6":"paused_2()","b6f5e0e6":"showProfileDetails()","b6f681ce":"ChangeOwner(address,address,uint256)","b6f687a2":"rewardKoth()","b6f6e8ae":"getMatches(uint256,bytes3)","b6f73bb9":"devuelveRoles(bytes32)","b6f7600d":"GetAllConsentData()","b6f7bfcd":"ADVISORS_ADDR()","b6f84764":"getRemainingUint(uint8,bytes)","b6f921ad":"check(string)","b6f98e53":"needsAllowancePayment()","b6f9fda5":"timeoutResolve(bytes32,uint256)","b6fac235":"callStcWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","b6fae6c7":"approveContract(bytes32)","b6fb4a14":"createNewSystem(string,uint8,uint8)","b6fb7e46":"endingBalance()","b6fb9f25":"redeemWithdrawalCertificate(string,uint256,address,bytes)","b6fc1043":"make(bool,uint8,uint256,uint256,bytes16,uint256,uint256)","b6fc276a":"preparationPeriodEquipmentTrainingFeeMultiplier()","b6fca0df":"sendAirDrops(address)","b6fda7ba":"allocateTokenForAdvisor()","b6fe87fb":"remoteBettingClose()","b6fef44c":"increaseArrivalTime(uint256,uint256)","b6ff5087":"notifyDeathCancellation()","b7009613":"canCall(address,address,bytes4)","b700967b":"modexp(uint256[],uint256,uint256[])","b7009c97":"StatPreICO()","b700f67a":"settleApproveRequest(bytes,bytes,bool,uint256)","b7019063":"EthereumDIDRegistry()","b7019744":"payBack(address,uint256)","b701dc14":"setBackEndAddress(address)","b7020c63":"getSpermlordReq()","b7028b1c":"CryptoRideCoin(uint256,string,uint8,string)","b702a879":"draw(uint256,address)","b703aa3a":"stopForge()","b703c75a":"getPresaleNumber()","b704b608":"weiToTokens(uint256,uint256)","b7056765":"implementsERC165InterfaceNoCache(address,bytes4)","b706b764":"HelpCoin()","b706f78e":"_mintTokens(int256,address,uint256)","b7073d2e":"insertCLNtoMarketMaker(address)","b7086f7b":"stopSale(address,uint256)","b70902bc":"debug4()","b7090bb5":"www_experty_io()","b70949c9":"editContributors(address[],uint256[],bool[],uint256[],uint256[])","b7098a32":"Bee()","b709df11":"getValue(address,address,address)","b70a7545":"GIFT(uint256,string,uint8,string)","b70ae49a":"execute_payment(uint256,bytes32)","b70b9717":"voitingStartTime()","b70c9acf":"stream(bytes32)","b70d0b3b":"ownerEdge()","b70d30bf":"returnTokens2(address,uint256)","b70dfb25":"SeleniumRichChain(uint256,string,uint8,string)","b70f0058":"_isApprovedBattle()","b70f4b13":"crowdfundContract()","b70f6ea8":"getDataPoint(uint256,uint256)","b70fadb7":"getAddressFromSan(string)","b70fbda1":"GoldRegistry()","b71051e2":"percentageOf(uint256,uint256)","b7107d00":"setSeller(address,address)","b710e8fe":"_restartsystem()","b711e18a":"_applyRefCredits(address,uint256)","b7133fa9":"test(uint256[5])","b7134feb":"icoMaxCap()","b713ef49":"developer_increase_price(uint256)","b714075e":"transferDevBalance(address,uint256)","b714e3cc":"GetDynamicRatio(uint256)","b71503fc":"FundsDrained(uint256)","b7159185":"shortShare()","b7160dee":"CVR()","b7161cc1":"VitaminTokenNew(uint256,string,string)","b71653a8":"setGalleryThreePrice(uint256)","b7167359":"contributed1(address)","b71698c7":"solutions(uint256)","b716e3f2":"addBoard(address,address)","b716f404":"raceOut(uint256)","b71738f1":"withdrawDthTeller(address)","b717cfe6":"CallTest()","b717dadf":"getEtherCountFor(address)","b7182b95":"getTokenOwner()","b719397f":"IsPreICO()","b719d032":"predecessor()","b719d1d0":"getRegInfo(address)","b71ab971":"getPlayerEarning(uint256)","b71c47a2":"surrender()","b71ce659":"GCA()","b71d1a0c":"_setPendingAdmin(address)","b71e0120":"limitBranchType()","b71e513b":"createGame(string,string,uint16,uint64)","b71e9c23":"throws()","b71f3cde":"onRefund(uint256,address,uint256)","b71f7f1c":"SuperFruit(uint256,string,string)","b71f8010":"setContract3(address)","b720a274":"_endOfICO()","b7213bd4":"readLog(uint256)","b72179ff":"viewFirstLotOfContractState()","b72218e3":"initialHolder()","b722875f":"giveBonus(address,uint256)","b722a9ef":"getPreviousShareholder(address)","b72314a1":"getGroupDescription(uint256)","b7232cd9":"enterBidForStar(uint256)","b723b34e":"mintTo(uint256,address)","b72413e4":"tokenDiscountPercentage(address)","b72481f8":"totalWinnings()","b725d84f":"PRICE_10()","b725e556":"UserOffers(address)","b7266456":"StandardToken()","b7268ef4":"rdiv(uint128,uint128)","b72703ac":"getPrev(address)","b72753d5":"updateItem(uint256,string,uint256,bool)","b7279ca6":"enableSweep(uint8[],bytes32[],bytes32[],address)","b727b194":"initialIssueMinting()","b7288f02":"freezeAccount(bool)","b72916ef":"getMsgValueBefore()","b7297cf3":"gameSettings()","b729d499":"dustPepe(uint256,address)","b72a0026":"APPToken()","b72a97e6":"updateTeamV(address)","b72b5a33":"NewBoardMember(address)","b72bedd0":"validation(uint256)","b72cacde":"approveByA(uint256,string)","b72ceab8":"alwaysRequireCosignature()","b72d0be5":"revocables(address)","b72e717d":"fromAddress(address)","b72f0e06":"LicenseCoin()","b72f547d":"startTransferGet()","b72f8ebb":"changeFreeBetValue(uint256)","b730aaaa":"Counting_CardPoint(uint256)","b730ee7f":"Anemoi()","b73112e5":"setCountryRank(uint256,string,uint256)","b73114b9":"purchaseCenturion(uint256)","b7312707":"fromHexChar(uint256)","b7317598":"claimI()","b7317806":"setEndOfICO(uint256)","b731e848":"left93(uint256)","b7324f8e":"PresaleClaimed(uint256)","b733e6a6":"LaunchContract(address,bool)","b73405a9":"roundMoneyDownNicely(uint256)","b734cbba":"setIcoDates(uint256,uint256,uint256,uint256,uint256)","b736ca82":"initialize(address,address,address,address,address,address,address,uint256,uint256,uint256,uint256)","b7375af7":"PresaleUnlimitedStarted(uint256)","b737ed1b":"getRandom(bytes32)","b737f5bd":"addOldInvestment(address,uint256,uint256)","b738169c":"betOnOddEven(bool,bool)","b7381a2c":"noteTokens(address,uint256)","b7384f6b":"initialOraclizeSettings()","b7387e66":"OpenBox(uint256)","b7388178":"getIsStoreSet(string)","b73974a1":"HIGH()","b73a9dbc":"variationCycle()","b73afe4f":"relocate()","b73b68e5":"lockTokens(address,uint256,bool)","b73c6ce9":"withdrawEarnings()","b73c71b2":"Test1Coin()","b73cb519":"changeIcoCap(uint256)","b73ded75":"setParams()","b73f02e4":"setActiveHashType(bytes32,bool)","b73f1e52":"fourthRelease()","b73fe29c":"getPeriodicalAR()","b73fe963":"noOfWaves()","b73fefe8":"rejectProposalAsHost(uint256)","b7403878":"updateLeaders_(address,uint256)","b741cb36":"setStageStartTime(bytes32,uint256)","b742398b":"trade(address,uint256,bytes,address,uint256,bytes)","b743f7b6":"giveEthCharityAddress()","b744a850":"getAssetTokenByIndex(uint256)","b744d2e6":"WithdrawEther(address)","b744d893":"DigiBlackCoin()","b7462833":"Blarity(address,uint256,uint256,uint256,address[],uint256[])","b7465a19":"setSlackUsersCap(uint256)","b746ec9f":"checkTotalPayouts()","b74746e7":"CharlieToken()","b747e025":"testFailMintNoAuth()","b7482509":"deposit(address,string)","b7491780":"_calculateNewHeroPower(uint256,uint256,uint256,uint256,uint256,bool,uint256)","b7491d65":"BiathlonNode(address,string,string,string)","b749b225":"bountyDrop(address[],uint256[])","b74a3266":"finalizeTemplate()","b74bc710":"LuckyDoubler()","b74bd09e":"rndGap_()","b74bd72b":"canTransfer(uint32,int256,address)","b74bee6a":"Mido()","b74c13f1":"storeAttachment(string)","b74cf3b6":"setVoterCount(uint256)","b74d13a5":"disableCheckArea()","b74d4103":"getForwardUpdateFeesTo()","b74d8e58":"getKittySkillScore(uint256)","b74db274":"VeryToken()","b74e20bb":"xCrypt(address,address,address,address)","b74e452b":"today()","b74e47ac":"getPartsOfOwner(address)","b74e825e":"DIVIDEND_FUND_FRAC_BOT()","b74f010f":"DreamCoin(uint256,string,string)","b74f312e":"changeTotalDistributed(uint256)","b74f32f2":"airdrop(address[],uint256,uint256,uint256)","b74feb18":"getRoundWinnerPot(uint256)","b74ffca7":"bookCab(uint256)","b75014c0":"startIcoMainSale()","b750948d":"canUserReleaseArtwork(address,address)","b750ac85":"LOG_HouseAddressChanged(address,address)","b751ecfc":"DomainIO(uint256,uint256)","b7526b79":"migrateDungeon(uint256,uint256)","b753485f":"currentGen()","b7538f3e":"ChangeClient(address)","b753a98c":"push(address,uint256)","b7540d9f":"freezed()","b756919d":"_handleEnergyTopup(address,uint256,uint256)","b7581c67":"vestingFounderAllocation()","b7595d3f":"getBoolField1()","b7598cca":"AreaPrice(uint256,uint256,uint256)","b759f954":"approve(uint256)","b75a0ac6":"setICOToken(address)","b75baa18":"w_futureDevelopment()","b75c2068":"lockShares()","b75c7d9e":"updateDealer(string,address,uint256)","b75c7dc6":"revoke(bytes32)","b75c7e62":"MedsupplyToken()","b75d7e50":"getExtrasData()","b75ece9c":"startFundingTime()","b75f4084":"finishInvesting()","b75f9b20":"commissionPCT()","b75fdf3a":"liquidityPoolTokens()","b760744f":"MytilcoinStorage()","b760c979":"TokenGranted(address,uint256)","b760e822":"minimumPurchaseInWei()","b760faf9":"depositTo(address)","b7614de7":"stakedByUser(address)","b7618a31":"rvt()","b761962c":"sampleMulti(bool,bytes32,int8,bytes4)","b761a16b":"JustmakeNewAccountsIssuer()","b7629dcb":"investorsAddress()","b762e6e8":"mintTimeLocked(address,uint256,uint256)","b762fbac":"changeFountainContractAddress(address)","b763150d":"registerCustomer(address,address)","b764132e":"CubaLibre()","b764311d":"RITToken()","b7643c5c":"_computePVPPetAura(uint256)","b7645ed4":"changeMaxCapUSD(uint256)","b76467c1":"Haltable()","b764e273":"failSend()","b764e8f5":"read_config()","b76564bd":"app()","b7656808":"minted(address,uint256)","b7656dc5":"transferFromPreSignedHashing(address,address,address,uint256,uint256,uint256)","b7663b08":"startICO_w2()","b7667603":"Goldplatina()","b76689a4":"createInviteID(address)","b766b562":"setBonusReceived(address,bool)","b76803b2":"cgoAddress()","b7682a81":"buyGanToken(uint256)","b768628f":"publishedWinningScoreThreshold()","b7688c8b":"ico_period()","b768cd5d":"modifyStartTime(uint256)","b768ce60":"getTotalVolumeToken()","b7692032":"Facebook()","b769e4c5":"LogCancelTemplateProposal(address,address,uint256)","b76b37dd":"toLotteryPool(uint256)","b76b3e39":"setICObyAddress(address,uint256)","b76b4ee2":"ManagerPermissionGrantedEvent(address,string)","b76b78fb":"getAllElement()","b76bf76b":"distributeTime()","b76c2e39":"LQX()","b76c3764":"NumberGame()","b76c5c9f":"sendAdvisorsBalance(address[],uint256[])","b76c8a2c":"SpartaTeamCoin()","b76c94e1":"fundsOf(uint256)","b76ce26c":"updatesolbuyrate()","b76d0edd":"Log1(address,bytes32,uint256,string,string,uint256,bytes1,uint256)","b76dfb28":"totalRemainInInventory()","b76e1324":"startCreatingAss(string,string,uint256,uint256,uint256)","b76e4890":"Tester()","b76e5e06":"getBA(bytes32)","b7700f33":"getManagerPubkey()","b77030a0":"setTau(address)","b770391b":"MineAffected(uint256,uint256)","b770485f":"specialContract()","b770486f":"investmentGuidesRewardsWithdrawn()","b770c7ef":"giftPlanet(uint256,uint256,address)","b7719ef5":"devWithdrawal(uint256,uint256)","b7742856":"mainSaleprice()","b774d3d7":"BankOwner_GetDonationsBalance()","b775553d":"setDividendCutPercentage(uint256)","b775c9ef":"etxAddress()","b7760c8f":"transfer(uint256,address)","b7764475":"ETHXBT()","b776fc15":"addItem(uint256,string,uint256)","b777b11e":"setBurnStart(bool)","b777cad7":"managerPrimary()","b7782455":"unicornAddress()","b77825d2":"getIndexOrder2(uint256)","b778809b":"initiateContract()","b778d4b4":"releaseToday()","b778e69e":"getPastWinnerEntries()","b77a284c":"transferAndCallWhitelist(address)","b77bf600":"transactionCount()","b77cd1c7":"refreshBalance(address)","b77d09c9":"gameGifIsOver()","b77d1597":"QAcoin()","b77d4876":"startTokensSale(address,uint256)","b77da4a0":"totalDevCoin()","b77e4185":"promotionsAvailable()","b77e60dd":"tokensaleSecondsToStart()","b77ebcbb":"Country_code(uint16)","b77f00b3":"preIcoPhaseCountdown()","b77f39fe":"recoverTokens()","b77fc549":"withdrawAffiliateCommission()","b77ffaf5":"changeInvestNum(uint256)","b7808600":"ClaimCrowdsale(uint256)","b780a659":"cryptoString()","b780ef58":"_transferRobot(address,address,uint256)","b7813355":"getTotalCollectedWei()","b781ad99":"ALLOC_SALE_CORNERSTONE()","b781afa7":"EverhuskCrowdsale(uint256,uint256,uint256,address)","b7825cfc":"addTask(bytes32,string)","b782fc9b":"getFirstActiveDuel2()","b7833cc3":"getWitness(uint256)","b783508c":"receiveAuction(address,uint256,uint256,uint256)","b78376e9":"addPayer(address)","b783969f":"GenkiProjectToken()","b783d6c7":"challengeRegistration(bytes32)","b7840731":"RedeemOraclize(uint256)","b7844170":"getSellUnitsInformations()","b7844aff":"NeuroToken()","b7845c97":"isPhase(uint256,uint256)","b785473c":"satRaised()","b7870845":"getCalculatedFees()","b787b91d":"registerVestingSchedule(address,address,address,uint256,uint256,uint256,uint256)","b7886b37":"checkReceivedUser(address)","b789321a":"priceRound4()","b7897485":"getCurrentBet()","b78aa7f4":"challengeChannel(bytes,bytes,bytes)","b78ae50a":"getCrystalsByKind(address,uint256)","b78b52df":"allocate(address,uint256)","b78b6087":"finalizeMigration()","b78b7232":"addFeedIn(address,address,int256,uint256,uint256)","b78b842d":"kyberNetwork()","b78bd4a5":"breakCookie(string)","b78be802":"emergency_withdraw(uint256,address)","b78be927":"ZYCoin(uint256,string,string)","b78c1517":"reservationFund()","b78c1853":"deleteOwnPeerReview()","b78d27dc":"bond(uint256,address)","b78d32cd":"BET()","b78da386":"withDrawFunds()","b78e4bfd":"jinglesInfo(uint256)","b78e5e26":"transferTokensFromBountyAddress(address,uint256)","b78f8389":"divideUpReward(uint256)","b78f9de7":"Sale()","b78fd7bc":"transferRemainingTokensToUserAdoptionPool(uint256)","b790301a":"PLN_Omnidollar()","b79047cc":"PricePredictionBettingGame(address)","b790505d":"set_compenstation(uint256)","b790634e":"getDepositRate()","b7909898":"allocateInitialBalances(address[],bytes32[],uint256[])","b790a77b":"_withdraw(address,uint256)","b790c32c":"transferAuditorRecord(address,address)","b7915e39":"getAllowedNotaries()","b791e8ed":"calcEffectiveOptionsForEmployee(address,uint32)","b791f3bc":"migrateAmountBooks(address)","b7928b4f":"getReason(uint256)","b792d022":"batchCreateSingleSeedAuction(uint8[],uint8[],uint256[],uint256[],uint256[],uint256)","b792e6ec":"init(uint256,address)","b792f5f6":"ret_luklen()","b7930507":"UNLOCKED_TIME()","b793233b":"icoEndTimestamp()","b7935f0a":"emergencySetDAdmin(bytes32,address)","b794004d":"YOU_BET_MINE_DOCUMENT_PATH()","b7942d78":"RegReader(address)","b79550be":"recoverFunds()","b795dffe":"purchaseKey(bytes32)","b796a339":"addRegistryIntoOwnerIndex(address,address)","b796c9b8":"Withdrawall(uint256,address[])","b7970d80":"rngCallbackGas()","b7975d1f":"getMyToad()","b797b5ba":"tgeCurrentPartInvestor()","b798b129":"finalizeEarlyBirds()","b7992c0b":"finalize3()","b799ba7e":"CalorieCoin(address,address,uint256)","b79a5539":"preTokenSalesCapReached()","b79a6231":"Tier_Basic()","b79af928":"totalSpentEth(address)","b79c5f7f":"IntentionToFund(address,uint256)","b79eb3a4":"AlterContactPubkey(address,bytes32,bytes32,bytes32,bytes32)","b79ec028":"setLevelup(uint8[4])","b7a025f9":"bZxTo0xContract()","b7a139bf":"firstRoundPercent()","b7a1affa":"DACContract()","b7a1c236":"LogChangeIsPayableEnabled(bool)","b7a1d003":"SessionClose(uint256,uint256,uint256,uint256,uint256)","b7a2cbcc":"lockedTransfers()","b7a2d99d":"withdrawAbleEther()","b7a2e1f2":"buy(string,string,uint256,address,address,address,address,bytes2)","b7a311fd":"TimoNetwork(uint256,string,string)","b7a3446c":"oldBalanceOf(address)","b7a40f21":"purchasePlanet(uint256)","b7a55438":"replaceOperator(address,address)","b7a693d7":"MaxSantaRewardPerToken()","b7a6b6a7":"AIREP()","b7a7612c":"setBtcEthRate(uint256)","b7a78911":"testMultitransfer2()","b7a8807c":"openingTime()","b7a90cf9":"BitAseanToken(uint256,string,uint8,string)","b7a9434b":"registerSpawned(uint32,int256)","b7a973bd":"setCompte_13(string)","b7a97a2b":"isValidChannel(uint256)","b7ab4db5":"getValidators()","b7ab7ade":"setAllowedContract(address[])","b7abf606":"modifyLocality(string)","b7ac5d3b":"marketingFundAddress()","b7acbd41":"checkSellerGuarantee(address)","b7acdca6":"addBet(uint256,address)","b7ad2432":"totalWindows()","b7adb169":"getPendingUserlists()","b7adb974":"lightingTransfer(address,address,address,uint256,uint32,bytes32)","b7ae74fd":"FreeCoin(address,uint256,uint256,uint256,uint256,uint256)","b7aec6a5":"scheduleCall(address,bytes,uint256,uint256,uint8,uint256)","b7aec6b1":"getSpecificEscrowTransaction(address,address,uint256)","b7b0422d":"init(uint256)","b7b172b3":"cashout(address,uint256)","b7b1b93f":"_createPixel(uint32,uint8,uint8,uint8,string)","b7b1d7f7":"isCrowdSaleActive()","b7b1e3cc":"getPropertyData(uint16,uint256,uint256)","b7b2a009":"getCardDetails(uint8)","b7b2bbc0":"WinnerSet(uint256,uint256,address)","b7b2c7d6":"batchFillOrders(address[5][],uint256[6][],uint256[],bool,uint8[],bytes32[],bytes32[])","b7b2e501":"makeInvisible(uint128)","b7b33765":"calculationOfPayment()","b7b3a56e":"overflow_lower()","b7b3b89a":"lockedVault()","b7b3ea98":"endContrib()","b7b4557c":"LogMigrationInitiated(address,address,address)","b7b47e31":"batchActivenessUpgrade(uint256[],uint256[])","b7b48388":"addThing(bytes32,bytes32,string,string)","b7b4ceb3":"CPCEIco()","b7b4fe13":"setWhitelistDemoc(address,bool)","b7b5709a":"freezeFrom(address,bool)","b7b57c3f":"getPartnerMessage(address,address,uint256)","b7b5e811":"getProjectBonus()","b7b6700b":"viewPlayerPayout(address)","b7b6e978":"unlockForOrder(address,uint256)","b7b747c5":"testDepositUsingDeployedContract()","b7b8533a":"expireAfter()","b7b96723":"right7(uint256)","b7b9dead":"MyAdvancedToken()","b7ba0ba0":"showAssetEvent(bytes32,uint256)","b7ba6050":"currentTokenOfferingRaised()","b7bae9b7":"exists(bytes,bytes)","b7bb018d":"unlockingBlock()","b7bb208b":"JobitToken()","b7bc2c84":"isFueled()","b7bc7653":"set_pauseDET(bool)","b7bc7cb8":"fixedExp(uint256)","b7bda68f":"taxAddress()","b7bdc7ef":"setDomainPrice(bytes32,uint256)","b7bedaf1":"setPreAddr(address)","b7bf356a":"taskExists(bytes32)","b7c03170":"CurrentState()","b7c14d7a":"payOutJackpot()","b7c251c3":"getRedeemedPeriods(bytes32,address,uint256)","b7c2ccb6":"getNodalblockTimestamp(string)","b7c38d02":"testControlCreateSameIpfsHashAndNonce()","b7c42cf0":"claimTokensICO(address)","b7c4b775":"setMaxGas(uint256,uint256)","b7c4bf17":"readyUp()","b7c52820":"addSentTrade(address,bytes32)","b7c54c6f":"getHKGOwned()","b7c55259":"endGame(uint256,address,address,address)","b7c5b181":"delegatedTransfer(address,address,uint256,string,uint256,bytes32,bytes,uint256)","b7c70c34":"seratioCoin()","b7c74cf6":"_calculatePayment(uint8)","b7c763b5":"getString(uint256)","b7c7986f":"getMarket_CommunitUnusedTokens()","b7c7ecbe":"setTitulaire_Compte_6(uint256)","b7c8561f":"removeDestroyer(address)","b7c8699d":"modifyGovtAccount(address)","b7c8a90a":"removeExclusionFromTokenUnlocks(address[])","b7c93330":"ResourcePoolTester()","b7c940f6":"SolarDaoTokenCrowdsale(address,address,uint256,uint256,uint256)","b7c97930":"registerPool(string,uint256,uint256)","b7c97fa0":"BEN()","b7c9da33":"buyTulips(uint32,uint16)","b7ca3086":"getSelfCount()","b7ca51e8":"starToken()","b7caf50a":"ticketsNum()","b7cb4830":"NERU()","b7cc2312":"bobClaimsPayment(bytes32,uint256,uint256,address,address,bytes20)","b7ccc466":"categoriesCount()","b7ccccaf":"bridgeValidatorsProxyOwner()","b7cce253":"maximumMainSaleRaise()","b7cdddcb":"claimEth()","b7cefd9f":"FlatEarth()","b7d02044":"deployToken(string,string,uint8,uint256)","b7d0628b":"getGameState()","b7d130ff":"isAuthorizedToSell(address)","b7d29e91":"NameChanged(bytes32,string)","b7d3a9c9":"setWhitelistAgent(address)","b7d3cb87":"countAllProposals()","b7d454a4":"setNotTransferable(bytes32)","b7d4dc0d":"unsetBase(address,uint64)","b7d4e5fd":"getX2(uint256)","b7d534a1":"addrToString(address)","b7d5d4c0":"piggyBank()","b7d5d74c":"balanceAtBlock(address,uint256)","b7d5ddc8":"setAssetClaimString(uint256,string,string)","b7d5e804":"remove(uint8,uint8)","b7d5ef4d":"BATokenFactory()","b7d65d17":"setUnitCoinProductionMultiplier(address,address,uint256,uint256,bool)","b7d6f432":"buyCar(address,uint256,bool,address,uint256)","b7d6f6c6":"WHALE(address)","b7d74fda":"DevelCoin(uint256,string,uint8,string)","b7d7acea":"externalGiftEth(address)","b7d89483":"AddressList(string,bool)","b7d8b1d9":"emitWorkStarted(uint256,uint256)","b7d9549c":"incrementPrice(uint256,address)","b7d9d7b9":"roundTwoAmount()","b7da166b":"_mint(address,address,uint256)","b7da5b0d":"TreatzCoin()","b7dacbf1":"setBackup(address)","b7db7f0f":"allowTransfer(address,address,address,uint256,bytes)","b7db87e8":"testFooArray()","b7dc2a9f":"weiMinimum()","b7dc3b18":"buy(uint256,string)","b7dc5c11":"priceGuaranteed()","b7dc8a32":"firstValidBlockNumber()","b7dc9d85":"ORDER_DONE(address,address,address,bool,uint256,uint256,uint256)","b7dcf6a9":"createPromoCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)","b7dd1d17":"getAllRevisionBlockNumbers(bytes32)","b7ddcb27":"InteractiveCrowdsaleToken(address,string,string,uint8,uint256)","b7de47d3":"getIndex(uint256,uint256)","b7dea35f":"hatchSeeds(address)","b7dec1b7":"GENESIS()","b7ded7cc":"purchaseHero(uint256)","b7df07a6":"receivePlayerInfo(address,string)","b7df7ef8":"AccountUnlocked(address)","b7df9289":"recvShrICO(address,uint256,uint256)","b7dfc8a5":"updateTokenPerEther(uint256)","b7e0308d":"priceStep2()","b7e05277":"private_DelGameBar(uint256)","b7e05d4f":"newProposallog(string)","b7e09773":"devTeamReinvest()","b7e1917c":"tokenAdmin()","b7e1b974":"getStr(uint256)","b7e1bce7":"ReceiverAddressChanged(address)","b7e1ecef":"addAttendantAndTransfer(string,string,bool)","b7e2263b":"getTotalMatches()","b7e24979":"addThing(bytes)","b7e28a3b":"certificationManager()","b7e2f504":"isPreSaleFinalised()","b7e39b4f":"setBalances(address[],uint256[])","b7e43a84":"maximumIssuerReservedUnits()","b7e45353":"forbidChecking(uint256)","b7e4a503":"Determine_Result(uint256,uint256)","b7e5cabb":"contractorsProfitAddress()","b7e621c3":"claimCompanyTokens()","b7e6bd34":"getTopic(bytes15)","b7e6dfe3":"GetApplicantAddress()","b7e82526":"GraybuxToken()","b7e83329":"ExportMaster()","b7e90262":"roleAdminAddress()","b7e92ede":"EtheRoox(address,address,address,uint256,uint256,uint256)","b7e9f193":"nextWithdrawal()","b7eb22b3":"getAccountsSize()","b7eb5e0a":"unlockAddress(address)","b7ec2086":"priceWei()","b7ec44b4":"asyncTransfer(address,uint256)","b7ecbaae":"removeWhitelistAddress(address)","b7ee2552":"ICOpaused()","b7eea206":"openLedgerAddress()","b7ef5fed":"claimRewards(uint16[],address)","b7efc1cd":"authorizeMintToken()","b7eff231":"oraclize_query(string,bytes[3])","b7efff16":"GANAPATI()","b7f01bfc":"tank()","b7f1489e":"setLosePercent(uint256)","b7f1e6af":"preferredSaleEndTime()","b7f2f33c":"transferRightIfApproved(address,bytes)","b7f37983":"getInvestmentRecordListLength()","b7f3ffed":"updateProfiterole(address,uint256)","b7f43a63":"brideVow()","b7f53c91":"CryptoSilver()","b7f545cc":"deployTokenContract(uint256,bool)","b7f603ff":"LimbToken()","b7f63665":"ttToken()","b7f6a75a":"XPAToken(address,address,uint256,uint256,uint256)","b7f6e74d":"unpositionFrom(address,address,uint256)","b7f79374":"DildoToken()","b7f84ae2":"icoPhaseTimeInterval()","b7f90f12":"decrementCount()","b7f927e6":"PROMETHEUS_VOUCHER_LIMIT()","b7f92b71":"reserveFund()","b7f9c4f6":"initCapsule(uint256)","b7fa265a":"_withdraw(bool)","b7fba4d3":"getProxy(address)","b7fc6612":"transferMany(address[],uint256[])","b7fcc321":"CryptoHoleToken()","b7fcfa69":"amountReceivedFromTransfer(uint256)","b7fd45a0":"EscrowICO()","b7fda832":"updateGenVaultAndMask(address,uint256)","b7fde9da":"mintCoins(address,uint256)","b7ff11be":"isAcceptedDcorpMember(address)","b7ff2aed":"withdrawMaker(address,uint256,address)","b8005f38":"execBoard()","b800b2fe":"BEZOS()","b800db55":"__isSenderInRole(uint256)","b8017221":"get_party2_balance()","b804dc56":"setRecallPercent(uint256)","b80509c5":"getCountsById(uint256)","b80540c0":"Adjudicator(address[],uint256,uint256)","b80546c2":"endPeriodA()","b805a5ca":"GetChip(uint32)","b8066bcb":"etherToken()","b8068a5f":"CATServicePaymentCollector(address)","b80756f0":"_calculateLockedBalance(address)","b80777ea":"timestamp()","b8077e28":"getTxOrigin()","b8079d49":"debitWalletLMNO(address,uint256)","b807ed76":"SANKEYSOLUTION()","b80825ff":"TheBittrip()","b808745c":"transferPass(bytes32,address)","b8087ac0":"goalMet()","b80907f2":"getReputationToken()","b809127e":"getQuickPromoBlockInterval()","b8093100":"giveBounty(uint256,address,address)","b80a30b7":"_getInvestorTokenAmount(address)","b80ac7df":"verifyProof(bytes32[],bytes32)","b80aedf2":"setReservedTokensList(address,uint256,uint256,uint256,bool)","b80cdcf6":"finishCrowdsale()","b80ced14":"LPCoinToken()","b80d3181":"annualPrice()","b80e63df":"baseTokenBalance(address)","b80ee369":"createCardForAcquiredPlayer(uint256,address)","b80f3532":"exchnageRate()","b8109e1a":"MeetingsEntity()","b810b81c":"Pixereum()","b810bfa4":"GDC(address,address,address,address,address)","b810d24b":"updMinPurchaseLimit(uint256)","b810fb43":"addressList(uint256)","b811215e":"initialCap()","b81168b4":"CNNTokenBase(uint256,string,string,uint8)","b8121385":"stopOperation()","b8121fe4":"viewPetitionSigner(uint256)","b8126a3e":"addSideService(address,uint256)","b812a6ce":"lastBlock_v11()","b813c627":"releasedSupply()","b813d939":"test_fourValidEqUint(int256)","b8144a72":"getBankRating(address)","b814660e":"AllowTransferLocal()","b8163641":"checkReceive(address)","b8174685":"_claimReward721(address,string)","b817e043":"JobMarket()","b818f9e4":"batchTransferFrom(address[],address[],uint256[])","b8198875":"StreamToken(uint256)","b81af39b":"declineMP(address,int256)","b81b0b6a":"claim(bytes32,string,string,address,bytes32,bytes32,uint8)","b81bb854":"createRequest(address,address[],address[],int256[],address,string)","b81c259e":"PexCash()","b81c6453":"vote(uint8,address)","b81ca723":"InitialCoinOfferingToken()","b81ccdd5":"cashilaTokenSupply()","b81ce8a7":"MicropaymentsNetwork()","b81db9da":"addUserValueName(bytes20)","b81df742":"minBuyLimit()","b81e3b19":"bankMoney()","b81e43fc":"getEventName()","b81ec822":"PRE_SALE_2WEEK_BONUS()","b81f39a8":"addToReserve()","b81ff45b":"getBalanceByAccount(string)","b8205d35":"IncentToken()","b820c41c":"iceToken()","b8216ea8":"redeemMany(address[])","b821da1b":"submitBid(uint256,uint256)","b821f815":"pay_winner(uint256)","b8225dec":"selfDestructInitiated()","b822b28a":"lastBlock_a8Hash_uint256()","b823aac7":"endICOTimestamp()","b823e991":"CourseCertification()","b8240a65":"UpdatedPrice(uint256)","b82465e9":"managerIncome(address)","b8248dff":"isValidOwner(address)","b82545e5":"judgeWin(uint256,uint256)","b8254880":"SurrusContract()","b8261f8f":"myEntityList(uint256)","b826d6d7":"DigiPulseToken()","b82852ec":"changeReserveIAMDestinationAddress(address)","b82864e0":"getHouseEdgeFee(uint8,uint256)","b828cfd2":"PRVTToken(uint256,string,uint8,string)","b8291bda":"Pomzon()","b829528e":"LotteryLog(address,string)","b82a0ce8":"bonusTime()","b82a65b2":"getReportingToken(uint256[])","b82a737c":"communityAmount()","b82b2a07":"makeProposal(uint8,uint8)","b82e6416":"doTimeoutForDefendant(uint256)","b82eb946":"_setStageLimit(uint256)","b82fb745":"saleEndAtBlock()","b82fcdeb":"tokensAllocatedForTeamAndReserve(address)","b82fd275":"removeFrozenTokenConfigurations(address[])","b82fedbb":"register(bytes32,address,bytes32,bytes32)","b8305b43":"HodlCreated(uint256,address,uint256,uint256)","b83069c5":"getStemPrice()","b830b305":"getpersonCount()","b830c538":"unassignRole(address,bytes32,address)","b8314c22":"whaleMax()","b831d137":"saleSharesSold()","b832004d":"setTokenInfoParametersReady()","b832679c":"setKmPards(address)","b832fdde":"NON_VESTED_TEAM_ADVISORS_SHARE()","b833ac27":"PolyToken(address)","b8341628":"mintingPreIcoFinish()","b834f6fb":"isMainChain()","b83506cf":"defaultBuyNowPrice()","b83520b3":"allowIcoExit(bool)","b835a7fe":"RubiksToken()","b8366bd1":"CorruptionCoin()","b837433c":"TEAM_ADVISORS_SHARE()","b837a3b8":"sendProfitsRewardBips()","b837c58e":"payTo()","b837c94f":"ASEBToken()","b8385339":"finalizeStage(uint256)","b8386f3b":"_gambling(uint256,bytes32,uint256)","b8388aca":"findBestRate(address,address,uint256)","b839e0d1":"lockedAllocatable()","b83a1bdc":"lastMineralUpdateTime()","b83a4da9":"totalWeiSale()","b83ace61":"setHouseEdge(uint256,uint256,uint256)","b83b4529":"FundsTransferredToMultisig(address,uint256)","b83c298e":"updateBoolSetting(uint256,bool,address,string,string)","b83d3f2c":"oraclizeSource()","b83dfdc9":"setInvestorData(address,uint256,uint256)","b83e1d14":"CountTokenUser(address,uint256,bool)","b83e4779":"OntologyToken(uint256,string,string)","b83e9662":"ParaTransfer()","b83fc6b6":"CrowdsaleClosed(uint256)","b8406a7e":"balanceOfLotteryNum(address)","b840a1db":"WhitelistChanged(address,bool)","b840b421":"OriginalVirtualOperation()","b8415b0c":"startDistribute()","b8416d2e":"exec(address,bytes32,bytes)","b84172e7":"getH1Bidder()","b842826c":"Built()","b842eef2":"test02BuyToken()","b8435050":"crowdsaleclosed()","b84391de":"setBetEndTime(uint256)","b8441be0":"setTransferAuthPermission(address,bool)","b8444c13":"forceVoidRace()","b845b51e":"IIPToken(uint256)","b845c9a2":"WEI()","b8471085":"PRIVATESALE_START_DATE()","b84738aa":"changeMinPay(uint256)","b848b944":"doSellerCancel(bytes16,address,address,uint256,uint16,uint128)","b8499750":"advisorLock()","b84a6849":"createShareToken(uint256)","b84aac5c":"decreaseApprovalPreSigned(address,uint256,uint256,uint256,uint8,bytes)","b84b05b2":"NetyulCrowdsale(address,uint256,uint256,uint256,address,address)","b84b276d":"second_whitelistSupplier()","b84b8b8c":"buyGoods()","b84c11da":"create(address,string,bytes32,uint256,address)","b84c35b3":"addCode(string,uint256)","b84c743b":"getReferencePrice(address,address)","b84c8246":"setSymbol(string)","b84cc017":"myBonus(uint256)","b84d2106":"shut(bytes32)","b84dda70":"tweakState()","b84dfbd2":"securityToken()","b84e1327":"checkIfContractCreatedHere(address)","b84e44ab":"setProviderLastSupplyID(uint256,uint256)","b84ebd7f":"createMechBTC(uint256,address)","b84ee1a4":"setTransferProxy(uint32,int256,address)","b84f1318":"AddNewCurrency(string,string,string)","b84fe73b":"voteAll(address)","b84fed88":"isMintContract(address)","b8500e5e":"purchaseRecordsNum()","b8506a3f":"tokensPerWei7()","b850ae36":"isRegular(uint256)","b851ed97":"bonusAllowed()","b8522043":"getUserList()","b8534ed1":"contractEndTime()","b8547736":"testBadWithGoodInterface(address,uint256,address,uint256)","b85477c5":"dealStatus()","b857a688":"Eth_Amount()","b858b39f":"PhotoAdded(address,address)","b85926e0":"VESTED_AMOUNT()","b85973c1":"overbidNation(uint8)","b8598f9e":"computeOppositePrice(uint16)","b85a6a20":"numComments()","b85bf538":"ownerSetBankersLimit(uint256)","b85c2f72":"submitEntry(uint256,uint256,uint256,uint256)","b85cf54e":"rewardPoolPercentage()","b85d6275":"RemoveModerator(address)","b85dfb80":"backers(address)","b85e0402":"AppCoinsIAB()","b85e0aca":"legacyRepContract()","b85e5915":"ExitPlincWithLoss(uint256)","b85e7df1":"setPresaleMode()","b85e84c0":"judgeFinality(bytes32[13],bytes32[],bytes32[],bytes32[10],uint256[4])","b85ea983":"countPortfolios(address)","b85eb295":"checkOwnershipAndAvailability(address,uint256[4])","b85ed17d":"getHolderByIndex(uint256,address)","b85f726a":"Cashier()","b861be22":"checkPermissions(address,address)","b8621759":"issueNewCoins(address,uint256)","b862d80d":"minBetVal()","b86397e7":"mFUNDING_CURRENT_DURATION()","b863bd37":"random(uint256)","b8642896":"ETSToken(address)","b864f5a9":"verify(uint256[],uint256[])","b8657988":"MYSUPERTOKEN()","b8661e2d":"getAllTeamsIds()","b86780b3":"restTokensBurned()","b867e8e6":"accrueDividendsPerXTokenETH()","b868723e":"endPrice()","b868a2ff":"update(uint256,uint256,bytes32[])","b8697dbd":"getLockByIndex(uint256)","b869f1e2":"SALE_CAP_IN_USD()","b86a1fb2":"adminPool()","b86a3582":"ETCH3dVs()","b86b14cd":"setRate1(uint256)","b86bc74f":"CERTIFIER()","b86c49e1":"getMarketsItemId(uint256)","b86c6b7b":"calculateCellBuy(uint256,uint256)","b86c9845":"MithrilSword()","b86dab46":"addToApprovedAddress(address)","b86df9db":"RewardRecycled(uint256,address,uint256,uint256,uint256)","b86e0657":"removeServer()","b86e321c":"withdrawReward(address)","b86ec38f":"REIMBURSABLE()","b86eeb69":"bountyTotalSupply()","b86f602c":"submitOrder(bytes,uint64,uint64,uint256,uint256,uint256)","b86f6aa7":"resetCollectedFees()","b8701689":"removeGlobalConstraintPre(int256,address,int256,address)","b870ecbb":"testNormalWhitelistAdd()","b870f613":"back(address,uint256)","b8716f3a":"_teamTransfer(address,uint256)","b8726395":"Mint(int256,uint256)","b873846f":"ArrayPasser(uint8[9])","b873e9a7":"trustedReportingParticipantTransfer(address,address,uint256)","b875a5e0":"rateThirdRound()","b8760ad3":"payStakingFee(address,uint256,uint80,uint80,uint256,address)","b87760ad":"uint256Tostr(uint256)","b8782d49":"PHASE2_RATE()","b8788453":"mainSale_StartDate()","b87aedcc":"recentPlayersFront()","b87b9ac3":"testExchangeRate(uint256)","b87ba329":"getMemoryTraceMeta(uint256)","b87c01e3":"GVPE_address()","b87c03c2":"multiAccessOwners(uint256)","b87c7d43":"setEthAmount(uint256)","b87cbafc":"bn128_check_pairing(uint256[12])","b87d8712":"RulesProposalSubmitted(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","b87dbf81":"handleAffiliate(uint256,uint256,uint256)","b87dddf6":"tokenFallback(address,uint256,bytes,string,uint256)","b87e461c":"scrapPercent()","b87e64ce":"DecentBetVault(address)","b87ee9d6":"setLLV_edit_4(string)","b87f9b98":"_stringToByte(string)","b87fb3db":"start_block()","b87fb721":"LogNewTemplate(uint256,address,string)","b87ff295":"MintTokens(int256,address,uint256)","b8803738":"total_user_eth_cap()","b88064ad":"peMinPerPerson()","b881604d":"removeStrip(uint256)","b8840d3d":"getDrug(uint256)","b88467c2":"getProjectEscrowAddress(bytes32)","b8847e9d":"haltRevealPeriod(bytes32)","b8850556":"ApplyAction(uint32,uint32,uint256,address,address)","b8851fea":"endDateStart()","b8852718":"transferLockedPart(address,uint256)","b8857936":"dtSetEthBalance(address,uint256)","b885acd8":"fourthWeekTokenPrice()","b885d560":"airDeliverStandalone(address[],uint256[])","b8867485":"proxyOf(uint256)","b8871f98":"_createEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256,bool)","b8872fb7":"reinvest(address)","b8873077":"HUNT(uint256,uint256,uint256,uint256,address)","b88746b0":"previousDrawingClosed()","b8878171":"getPersiansBattlePointsBy(address)","b888690a":"deleteMessage(uint256)","b888a492":"isNewPayoutPeriod()","b888a66b":"tktPrice()","b88903f7":"TokenDrop(address,uint256)","b8894fe3":"mintTokenToBuyer(address,uint256,uint256)","b889d440":"markTokenSold(uint256)","b88a374c":"EarnEnoughMoney()","b88a529b":"getCurrentRate(uint256)","b88a802f":"claimReward()","b88ab668":"TBXToken()","b88c9148":"getFee(address)","b88d0169":"INITIAL_EMISSION_FACTOR()","b88d4fde":"safeTransferFrom(address,address,uint256,bytes)","b88d6aa7":"refund(bytes32,uint8,uint256,uint256)","b88e8518":"FluencePreSale(uint256,uint256,uint256)","b88e962f":"showEmployee(uint256,uint256,uint256)","b88eef53":"registryCreated()","b88f9936":"setMinTms(uint256)","b88fd16e":"developmentFundAddress()","b8901a41":"am_I_locked(address)","b8905649":"Crowdsale(address,uint256,uint256,address,address)","b8906755":"payProviderFee(address)","b890de6b":"thirdLineWrong()","b890ed85":"CryptoSagaCardSwapVer2(address,address,address,address)","b891656e":"thismanyblockstillthspudholderwins()","b8918710":"FangTangCoin(uint256,string,string,uint8,bool,uint256,uint256,uint256,uint256)","b893deb1":"getContestEndTime()","b89503f3":"getDiceWinAmount(uint256,uint256)","b895947a":"Janders()","b895c813":"registIcoAddress(address)","b896149c":"BLUEOS()","b8972db5":"sendToken()","b8973927":"setContractStart(bool)","b89761b8":"encoded_data()","b897b4f5":"multAirdrop(address[],uint256)","b8991ffb":"reject_payment(uint256,bytes32)","b899e1b7":"_setApp(bytes32,bytes32,address)","b89a73cb":"isShareholder(address)","b89bf71d":"safeWithdrawal4(address)","b89c5932":"setRequestLimitInterval(uint256)","b89c70c0":"calculateCoinBuy(uint256,uint256)","b89cd5bd":"icoPartner(address,uint256)","b89e066a":"MINCAP_TOKENS_PRE_ICO()","b89e8cbb":"getRemainingSellingTime()","b89f3025":"investExt(address,uint256)","b89fc89e":"setDistributionAddress(address)","b89fde71":"CheckAmbientTempException(bytes32,uint32)","b8a15b1d":"bobMakesErc20Payment(bytes32,uint256,address,bytes20,address,uint64)","b8a1e355":"doBet(uint256)","b8a1fdb6":"transferAndFreezing(address,uint256,uint256,uint256,uint8)","b8a24252":"checkpoints(uint256)","b8a25119":"setPresaleMode(bool)","b8a268c1":"getCloseFlag(bytes)","b8a32c7e":"claimTile(uint256,uint256,uint256)","b8a358e9":"canMintUtility(address,uint256)","b8a393b8":"openCompetition()","b8a3c6ea":"KPCSAdministrator(string)","b8a4a064":"applauseCashCrowdsale()","b8a4b858":"INVESTOR2()","b8a4db81":"addValueBonus(uint256,uint256)","b8a4f9ae":"addInFutureExpanstionMap(address)","b8a5368a":"gameStart(uint256)","b8a548c5":"SCTokens()","b8a582a9":"EtherMoney()","b8a582af":"logicVersion(address)","b8a67b6e":"GiroToken()","b8a67c3c":"expireDate()","b8a684f8":"CryptoSagaSwapPLAT(address,address,address,address)","b8a76f54":"setIPFSHash(string)","b8a7c78a":"CommunityAddress()","b8a80aac":"getItem(address,uint256)","b8a876ed":"Quitcoin()","b8aa0a34":"getSealDate()","b8aa4da8":"addMemberToBS(address)","b8aaae7a":"PXXToken()","b8aac3a5":"createAndSignBBODocument(bytes,bytes,address[],uint256)","b8ab9203":"secondRoundMayTokensLimit()","b8ab9883":"claimTimeoutEndedWithMove(bytes32,uint256,uint256)","b8aba8cf":"NewPayment(address,uint256)","b8abd184":"getInvestorKey(bytes32,uint8)","b8aca90b":"CurrentGame()","b8ad2abe":"addTokenGrant(address,uint256)","b8ad2fca":"claimMeme()","b8adaa11":"reject(uint256)","b8af146f":"subsm(uint256,uint256)","b8af21b9":"isLotteryClosed()","b8af6bc7":"getAgentsAmount()","b8afae78":"IPM2COIN()","b8afd597":"FinishRoundGamble()","b8b040a1":"xapo()","b8b0f533":"get_bitcoineum_contract_address()","b8b13e6b":"MaximumcoinStart()","b8b18915":"withdrawBonus(address)","b8b199e5":"_userSignUp(string,address,bool)","b8b19c27":"MultiOwnable(address[16],uint256[16])","b8b2052c":"setCrowdsale(address,address)","b8b23120":"getFlagPrice()","b8b27765":"payManagementBodyPercent(uint256)","b8b2bdad":"setBool(string,bool)","b8b2d490":"feePerSec()","b8b3d85b":"getFunderBalance(address)","b8b459bc":"OrderUpdated(uint256)","b8b4f1a0":"signContract()","b8b52652":"startFightA(uint256,uint256,bytes4)","b8b570f1":"Distributed()","b8b690e7":"__targetExchangeCallback(uint256)","b8b798be":"getYearlyUSDSalariesTotal()","b8b7b899":"receiveTransfer(address,uint256,address,bytes)","b8b7edb2":"hashToken()","b8b808cc":"getAddressFromNumber(uint256)","b8b85873":"purchaseArray(uint256)","b8b8d387":"myWeiValue()","b8b8fc3a":"getPI_edit_20()","b8ba427d":"RetDime()","b8ba532f":"developer_edit_name(string)","b8ba7c7f":"createGen0Auction(uint256,uint8,uint8,uint8,uint8)","b8baed2c":"calcTradeFeeMulti(uint256[],uint256[])","b8bb372c":"APIHeaven()","b8bcaad5":"_randomPack(uint256)","b8bce6d0":"dateEcoRelease12()","b8bcf6c9":"ico2ndPrice()","b8bd3dbb":"setMakerFee(uint256)","b8bdd8dd":"close(bytes)","b8bdf701":"initiateCreateSale(uint256,uint256,uint256,uint256)","b8be73ed":"offchainUploaderAddress()","b8beafd6":"buyVolumes(address,address)","b8bf029b":"list(address,uint256,uint256,uint256,uint256)","b8bf0f1f":"getRemainingBlocksUntilPayoutk()","b8c0517a":"splitStake(address,address,address,uint256)","b8c26d0b":"ContractWithParams(address)","b8c2a9e1":"getBidReports(uint256)","b8c375b6":"WavesToken()","b8c48f8c":"setInitialParent(int256,int256,int256)","b8c508e5":"MOBOL()","b8c52477":"_exchange(uint256,uint256)","b8c577ff":"setGrowth(uint32)","b8c58128":"setList(uint256,uint256[])","b8c65462":"preICOSaleStart()","b8c6a67e":"maxPendingParticipants()","b8c6d2e9":"BretCoin()","b8c6f579":"setAuction(address)","b8c766b8":"saleClosed()","b8c78391":"releaseableBalanceOf(address)","b8c7dea3":"stageCurrentSum(uint256)","b8c7e354":"tryToCompleteProject()","b8c86aa6":"getArraySettingResult()","b8c87a06":"setStage3()","b8c8fb73":"solve(uint256,uint256,uint256,uint256)","b8c92537":"acceptBidForCollectible(uint256,uint256,uint256,int256)","b8c9371d":"getPassOwner(bytes32)","b8c963a6":"atxContract()","b8c9c4d2":"burnResource(uint16,uint256)","b8c9d365":"h()","b8c9e4ed":"getStr()","b8c9e694":"getRaceMutation(uint32)","b8cb243d":"escrowTransfer(uint256,address)","b8cb40e0":"getDistributedTotal()","b8cb65ee":"removeTokens(uint256)","b8cc3c12":"depositToSubRound(uint256)","b8ccbd17":"removePermission(bytes4)","b8ccc682":"constructUrl(bytes32,uint256)","b8ccf4c7":"sendPositiveWhuffies(address,string)","b8cd0b94":"DoorLock()","b8cd4a8e":"joinCarveUpTen(uint256)","b8cd81ed":"raffleTokenReward()","b8ce670d":"burn(address,uint256,address)","b8cf14e7":"updateStatusPlayer()","b8cf2515":"currentFundrise()","b8d00d4a":"requestErc20Transfer(address,address,uint256)","b8d04f4e":"getReferrerAddress(address)","b8d08db2":"releaseCount()","b8d0cf4a":"setTokenPriceUSD(uint256)","b8d117fc":"bonusEnds4()","b8d1194c":"tokenGoal()","b8d16dbc":"isLeapYear(uint256)","b8d2f523":"no_aff()","b8d364bb":"allDistinct(address[5])","b8d3bfe3":"MeatGrindersAssociation(address,address,uint256,uint256,uint256,address)","b8d3d08a":"assertEq29(bytes29,bytes29)","b8d400d2":"fromEthers(uint256)","b8d415c9":"bntyMicrodollarPrice()","b8d46c9c":"setOrUpdateRecord2(string,string,string,string,address,uint8,bytes32,bytes32)","b8d4b642":"startICODate()","b8d4efb5":"validate_percent(uint8)","b8d55a91":"CPLToken()","b8d5b7f0":"maximumToken()","b8d73101":"expirationString()","b8d73849":"LogTokenDeposit(address,uint256,bytes)","b8d74f4b":"getAcceptedTokenAmount(address)","b8d85d23":"adminSetAddress(address)","b8d87069":"_removeContributor(uint256)","b8d94039":"writePosition(uint256,int256)","b8d94b95":"buildDSNullMap()","b8d9cbbe":"addMember(address,uint256,uint256,uint256)","b8daf1b1":"cancelChainlinkRequest(bytes32)","b8dbf876":"transferFromOwner(address,address,uint256)","b8dd3c55":"confirmSettingsChange(uint256)","b8dd7a5b":"numberOfWagersToMinimumTimeout()","b8ddc4df":"HPA_TokenERC20(uint256,string,string)","b8ddef1a":"IdeaCoin()","b8de3843":"allAmountRaised()","b8de85d8":"p_setBankOfEthAddress(address)","b8df17f0":"verifySigner(bytes32,uint8,bytes32,bytes32,uint256,uint8,uint256,bool)","b8df5ce3":"ownerInitialBalance()","b8e010de":"set()","b8e046d1":"MinexoDigital()","b8e0d08d":"increaseHardCap(uint256)","b8e0ffbe":"getPaymentsLength()","b8e2cfb1":"getMinMaxInvest()","b8e31ee7":"MithrilGauntlet()","b8e381e5":"subscriptions()","b8e3d8e8":"LOL()","b8e3e6da":"participateCrowdsaleAll()","b8e4189c":"updateHighestMiles_(uint256,address)","b8e42041":"invalidateOrdersBefore(address)","b8e44852":"chargeTokensForManagement()","b8e60467":"LRCMidTermHoldingContract(address,address)","b8e6a433":"calcFactorReward(uint256)","b8e920de":"buyTicketTest2(bytes)","b8e945fc":"setOwnerNick(uint256,string)","b8e9a6f0":"addLockedAccount(uint8,address,uint256)","b8e9ac71":"BICToken(uint256,string,string)","b8e9c22e":"getRate(address,uint256,bool,uint256)","b8eaffcc":"getnodeparam(address)","b8eb115e":"increaseDuration(uint256)","b8eb3546":"maxSell()","b8eb993d":"PUBLIC_SALE_TOKEN_CAP()","b8ebed78":"rightForInterest(uint256,bool)","b8ec59e4":"changeColorOrange()","b8eddde1":"paymentsOwed(address)","b8ef04e7":"_getRandomNumber(uint256,uint256)","b8ef5f4d":"nextGameSeedPercent()","b8ef9fcc":"cardAddressExists(address)","b8f20cfd":"myBalances()","b8f249e2":"testThrowsSaleWalletIncorrectSaleAddress()","b8f2690d":"TestDividendFund()","b8f28531":"notEqual(address,address,string)","b8f2954d":"addData(bytes32[],bytes32,bytes32,bytes32,uint256,uint256,uint256,uint256)","b8f2bbac":"modify_perms(bytes32,bytes32,int256)","b8f3b75d":"buyWithAddress(address)","b8f47481":"withdrawErc20ForAddress(address,address,uint256)","b8f48d3d":"setMaxRoundSize(uint256)","b8f53f36":"maxPrivateSaleStage()","b8f5e56c":"DeClub(uint256,string,string)","b8f6c219":"purchaseDatesToken(uint256)","b8f6d3ef":"getNodalblockData(string)","b8f6e7ff":"changeMarketStatus(uint8)","b8f71f26":"scheduleTransaction(uint256,address)","b8f75c0b":"bountyFactory()","b8f76562":"setWithdrawable(address)","b8f77005":"getQueueLength()","b8f78178":"createNameAndPoint(int256,bytes32,address)","b8f7a665":"isLive()","b8f7f41e":"drpCrowdsaleRecordedBalance()","b8f929ad":"saleWhitelist()","b8fa7778":"for_votes()","b8fbb72d":"COMMON_WITHDRAW_SUPPLY()","b8fbb87d":"isAssociatedAddressFor(uint256,address,address)","b8fbe499":"Cygnus()","b8fc7bd0":"setPresidenteDeMesaVerify(bytes32,uint256,uint256,uint256,bytes32)","b8fcf937":"myToken()","b8fd1e10":"updateBalancesContract(address)","b8fd1ffa":"addressToEtherOwed(address)","b8fe6f93":"triggerTransaction(uint256,uint256)","b8ffc962":"isMaxSupplyLocked()","b8ffd53f":"getStageStartTime(bytes32)","b8ffd64b":"PowTokenBase()","b9002e62":"delegatedFwd(address,bytes,uint256)","b900a870":"getApprenticeChestPrice()","b900da19":"calculateBonusPercentage(uint256)","b9019437":"eitherHaveAttribute(address,address,bytes32)","b9022e44":"updatePresaleWhitelist(address[],bool)","b90291c3":"changeWebsite(string)","b902c833":"switchfor()","b90306ad":"Burn(uint256)","b9037bc2":"unlockTokensForAddress(address)","b903a2a5":"MultiTransfer(address[],uint256)","b904088e":"maximumInvestment()","b9043235":"_create(uint256,address)","b90436ba":"MBT()","b9045c00":"InvestCoin()","b904ef4a":"delUIntValue(bytes32)","b9068d9e":"distributeFunds(uint256,address,address,address)","b906b7b7":"burnPercentage10m()","b9078616":"executeTrade(address,address,uint256,uint256)","b907996a":"Forwarder()","b9089280":"admin_del(address)","b908b008":"verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[1])","b9093fc6":"addIdentity(address)","b9098b33":"krs()","b90a4df1":"ApushJoustUser(address,address)","b90ae5a1":"registrarAuth()","b90b0108":"iconcontract()","b90b09c0":"random_bool(uint8)","b90b1248":"extractTokenEth(uint256)","b90b9aea":"EOCToken(uint256,string,string)","b90c1dbb":"getCreationDate()","b90c8566":"Somplak()","b90c86a9":"LogOraclizeCall(uint256,bytes32,string)","b90c92e2":"FysicalToken()","b90cec6d":"AddOfficialApps(address)","b90d3d0c":"data(address)","b90d86b9":"autoMatch()","b90d89a0":"start_seller(address,address,uint32)","b90da496":"getRankTitle(uint256)","b90dcc58":"SAFEToken(uint256,string,string,uint8)","b90e6bd8":"userRound(address,uint256)","b90f1af1":"icoEndUnix()","b90f65a2":"canCancelBet()","b910378d":"getBI(bytes32)","b91038c7":"participate(address)","b9103e1f":"refundAction(bytes32)","b9106dd9":"setAllowAccess(address,bool)","b91070e8":"processEmergencyFundReleaseFinished()","b9119b87":"ChangeSwapperAddress(address)","b911f2fb":"settleCandyGetx(uint256)","b912950e":"buyItemRaffleTicket(uint256)","b91366b0":"upgradeReactor()","b9138584":"Deedcoin()","b9140422":"readMailByAdmin(uint256,bytes16,address)","b9144c96":"TokenMinted(address,uint256)","b9145944":"verifySig(address,bytes32,bytes)","b914cf7c":"leve1(address)","b9156830":"hasPriorDuplicate(string,uint256)","b9166178":"investorWallet(address)","b916c5ff":"redeemCoupons(uint256,string)","b916de59":"reset(address[])","b916e5d0":"goldenTokenId()","b916f8fd":"delistMon(uint64)","b9172dec":"changeStage(uint8)","b9174330":"gco(uint256,address)","b9186d7d":"priceOf(uint256)","b919be66":"useMultipleItem(uint256,uint256,uint256,uint256,uint256)","b91aedab":"transferLocked(address,uint256[],uint256[])","b91bb31c":"initLottery(uint256,uint256,uint256)","b91bf310":"initialChargeFeePool(address)","b91c771f":"replaceProduct(address,address,address,address)","b91d1aed":"createPassport(uint256,bytes32)","b91d3ace":"addDev(address)","b91d4001":"releaseTime()","b91d4a0f":"frontWindowAdjustmentRatio()","b91dee6c":"ResetUpdateState()","b91e3422":"premiumHold()","b91e4087":"validAddresses(address)","b91fe64b":"getLastDepositDate()","b9204d1c":"TeamVestTimeLimit()","b9209e33":"isVerified(address)","b920c799":"Insureum(uint256,uint256)","b9212662":"s13(bytes1)","b921e163":"increaseSupply(uint256)","b9223946":"endVote()","b9224385":"LogResultWinner(uint256,address,uint256,uint256,bytes)","b92289ef":"sendleftmoney(uint256,address)","b9235d08":"FlippedCoin(address,uint256,int256)","b923b205":"setWhitelist()","b9247673":"buyListing(bytes32,uint256)","b9256f7e":"newTickerQueryResult(string,bytes32)","b925af47":"creatorsTotalBalance()","b92620bd":"targetWallet()","b926bd06":"Prepurchased(address,uint256,uint256,uint128,uint256)","b9272a11":"_redeemAdoptedAxies(address,uint8,uint256)","b927ef43":"validatorSetApplyBlock()","b928024d":"tokensPerWeiBonus250()","b9291296":"useMyOldName(string)","b9292158":"getTimestamps(address)","b929709a":"getPOOL_edit_1()","b92984f8":"TokenGame()","b92a3961":"currentRoundBudget()","b92a56bf":"deathData_v10()","b92ae87c":"isSubscribed(address)","b92b9d6c":"replacePublisherRegistry(address)","b92cb5b8":"addBrick(uint256,string,string,uint256,string,bytes32[],uint256)","b92cc8cf":"isExisting(uint256)","b92cd8f1":"officalHolding()","b92ce1a7":"createRandomCharacter()","b92d6c2f":"TWCToken()","b92dd395":"setManagerPowerful(bool)","b92ddee6":"setStartTimeIco(uint256,uint256)","b92e9f9e":"reportWasCalled()","b92edfc6":"NumberOfAuctions()","b92f1986":"IMDEXinvalidateOrdersBefore(address,uint256)","b9308d9e":"updateName(address,string)","b9318b0c":"_born(uint256,uint256)","b931b484":"bountyTokensLeft()","b931bec5":"setContractErc20Token(address,address)","b9324db6":"upgradeCardShield(uint256)","b9330829":"maxUint256()","b935170b":"addShopOwner(string,string)","b93529bc":"tokenTicketPrice()","b9358ba4":"isApper(address)","b9359169":"GayPersonalAds()","b9364835":"getCatOwner(uint256)","b93651bb":"__initFuse()","b9368721":"balancesRiskcoins()","b93806ab":"setWinningNumbers(uint256,string)","b9381f3c":"checkCapsAndUpdate(uint256,uint256)","b93833c3":"changeRewardAmount(uint256)","b9384f12":"changeMinCapUSD(uint256)","b938b469":"SetRewardMultiAD(uint256)","b938bf42":"sendBounty(bytes32)","b93983dd":"StoxSmartTokenSale(address,address,uint256)","b93a4408":"setMintFrequency(uint256)","b93a50b0":"_setApprovalForAll(address,bool)","b93ab165":"getCurrentInfo()","b93c109f":"totalInterests()","b93c3de2":"getHistoryRoundList()","b93c7d42":"sellDividendPercentCandy()","b93dab0b":"getBetCount()","b93dc802":"setEth(uint128[2])","b93e0e39":"ROCK()","b93ea812":"subtract(int256,int256)","b93eb763":"x(int256,int256)","b93f9b0a":"getAddress(uint256)","b93fd2bf":"createCustomAtom(uint64,uint8,uint8,uint8,uint128,uint128,uint32)","b9408373":"USD_PER_ETH()","b940db1a":"sellAllDolAtOnce()","b9413c47":"totalReturnedCredit()","b9420310":"tokenSale()","b942394d":"getPercent2(address)","b94265b8":"addReferrer(address,address)","b9429069":"isFarmer(address)","b94371ec":"getWhitelistOwner()","b9447f7e":"customBuyerForIndex(uint256)","b944ef3c":"initialTraining()","b94512c7":"BioCoin()","b9459b70":"getCurrentLuckyStonePrice()","b9460d04":"updateTicketVault(uint256,uint256)","b94669e5":"interfaceThawTokens(address,uint256)","b9468f7e":"bid(uint256,bool)","b946c19c":"rankDataContract()","b946fab1":"maxAmountPresale()","b9474959":"_isTokenOperator(address,uint256)","b94761b4":"SetupAllowance(address,uint256)","b94776de":"mintUnlockTime(address,uint256,uint256)","b9478ade":"DylanCoin(uint256,string,string)","b948348c":"purchaseTicket(uint256)","b94844dd":"AAAToken()","b9484955":"getInvestorArray()","b9488546":"ownersCount()","b9499cd6":"Midwife()","b94b0a3a":"getFulfillment(uint256,uint256)","b94bae91":"setUser(address[])","b94bc7fe":"proofOfSalt(bytes32,uint8)","b94c3451":"techBuff()","b94cc52f":"mark(address,bytes32)","b94e3516":"TAKCoin()","b94e962a":"allocateTickets(uint256)","b94ee0fc":"Triunvirate(address[])","b94f5a6e":"eventPirze(address,uint8)","b94f969c":"investmentBTC()","b94fa03f":"requiredSharesToBeBoardMember()","b94fb4a3":"WaykiCoin()","b94fdaab":"upload_group_key(uint256[4])","b950556a":"setThingValid(bytes32[],bool)","b950ae2b":"changeTopWithdrawable(uint256)","b950f0a0":"rateTier3()","b95254f6":"setAsLotteryRunner(address,bool)","b952ab7b":"unclaimedTokensForInvestor(address)","b9531df3":"lowTimeBonusLimit()","b953a9ac":"getDocumentProposalCount()","b9541ad5":"resetReferee(address)","b95459e4":"moduleRegistry()","b95460f8":"open(address)","b954ca70":"setcapbounus(uint256,uint256,uint256)","b95594e5":"lineOfPlayers(uint256)","b9559685":"StateHolder()","b955b95c":"getKindOfPackage(address)","b955e60d":"roundData(uint256)","b956a8a6":"easyMineToken()","b9570c01":"transferAndCall(address,uint256,bytes32)","b957aeb6":"getUserReaction(uint256)","b957b886":"stackOffset(uint256)","b9582195":"SFXToken()","b958893e":"XTVAirDropped()","b9588adc":"getStageAttributes(uint8)","b958a5e1":"getPhoneByAddress(address)","b958abd5":"setA(string)","b9592e92":"setGM(address)","b9599f3a":"fetchUndistributedProfit()","b95a4baf":"daysSinceLaunch()","b95a8327":"marketGrapes()","b95af889":"processTransferToICAPResult(address,bytes32,uint256,bool)","b95bb4f8":"price(uint16)","b95c2740":"buy(address,bytes)","b95cbed6":"currentExpiryInterval()","b95d2a53":"deedUri(uint256)","b95f2be8":"_releaseVouchers(address,uint256)","b960a45f":"unpauseTrueUSD()","b960a6d4":"ITTMultisig()","b96144fd":"removeUsername()","b9615878":"getHeader(bytes32)","b961716b":"getActiveTier()","b961b1e0":"teamNamingIncome()","b96297b5":"killya()","b962de9a":"ProsperaToken(uint256,string,uint8,string)","b9632689":"numFunders()","b9635685":"JAJToken()","b963e1d0":"getPurpouse()","b964608d":"get_return_by_level(uint256)","b9649e52":"getPlayerPotWinning(uint256,uint256,uint256)","b96528fd":"pubAddress()","b9653382":"firstPeriodEndDate()","b965817d":"UBSCoin()","b9659d4a":"sibling()","b9668eb2":"settleUnclaimedPerTokenPayouts(address,address)","b966f350":"tokenMintingEnabled()","b96732d9":"TransferToSAToE(uint256)","b9676e72":"SPTToken()","b967a52e":"setContactInformation(string)","b968440a":"Finalized(uint256,uint256)","b968486e":"isLottoStarted()","b96890a1":"airdroptoken()","b96891e5":"getAddressesSize()","b9689cf3":"crowdsaleAirdropAddress()","b968a53c":"getBurnAddresses()","b969d399":"getBattleCooldown(uint64)","b96a39bd":"createPlayer(string,uint256,uint256)","b96b8edf":"changeAirdropQty(uint256)","b96bf2b5":"expressReloadNumSec(uint256,uint256,uint256[],uint256[])","b96c0866":"completeOrder(string)","b96c10ba":"_assign(address,address,address)","b96d64fb":"start_quiz_game(string,string)","b96dc22a":"enableLambo(uint256)","b96dc96d":"delCertificate(string)","b96e988b":"addressBilborough()","b96f54d1":"fixedReverse(uint256[10])","b96f8a39":"Voting()","b970e3d0":"JATICO()","b971667c":"calculateEmissionTokens(uint256,uint256,uint256,uint256)","b9717b23":"setOdd(uint256,uint256,uint256)","b971a1f8":"VivekTestToken()","b971b4e5":"setNotTransferable(bytes20)","b9727dc2":"getProjectClient(uint256)","b9727f50":"saveRevenueShareDistribution(address,uint256)","b97386d1":"reputationProblems(address,bytes32)","b973b286":"Imteaz()","b974b0a3":"allData()","b974ddcb":"getAnimalById(uint256)","b9750acf":"selfDestroy()","b97585d3":"addOldNickname(address,string)","b975ce23":"crownName()","b975d9c7":"setCCH_edit_32(string)","b976b35b":"uponTransfer(address,address,uint256)","b976f464":"authoriseAccount(address)","b9774f7b":"confirmations(uint256)","b9776301":"testTrustedTransferFrom()","b9789d7d":"ChangeDeadLine(uint256,uint256,string)","b97a6c12":"redeemForReportingParticipant()","b97a7d24":"getGoal()","b97af2c8":"setTokenDecimals(uint256)","b97b451e":"increaseApprovalPreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)","b97b9df8":"AUACoin()","b97cab2c":"convert2Peony(uint256)","b97ce4d3":"distributionteamFinished()","b97d3627":"TosToken()","b97df70a":"setTokenReward(address,address)","b97e3b43":"setMintAgent(address,address,bool)","b97fd9e1":"releaseWallet(address)","b9812d9a":"getNextReportingWindow()","b981655f":"DebtManager()","b9818be1":"feeOwner()","b982e5c1":"testAddPending()","b9843c7c":"setUnavailable()","b9844d6f":"updateSelfDropStageState(uint256,uint256,uint256,uint256,uint256,uint256)","b9855c76":"restartPeriod()","b9858a28":"addContract(address,address)","b986b611":"withdrawAddressUpdate(address)","b986bb67":"STATUS_DESTROYED()","b9871548":"set_token_address(address,string)","b9879450":"CREATOR_TOKEN()","b987ae02":"fundWithdrawal(uint256)","b987bdac":"InterCrypto()","b987f688":"gettotalCards()","b9883b3f":"main(uint16,uint8,int256)","b988899f":"setBenificiary(address)","b988c505":"newProposal(address,uint256,string,bytes,uint64)","b9890a74":"initBonuses(string)","b989915c":"lastUsdPerEthChangeDate()","b989c7ee":"returnInt32(int32)","b989ffa7":"getArtist(bytes32)","b98a5418":"assignedAmountToAngelInvestment()","b98aacf0":"retreiveHrt(string)","b98b5f9c":"listPrycto1()","b98bafde":"Redeemed(uint32,address)","b98bcf16":"getPubKeyByHash(bytes28)","b98c90c2":"ECOS(address)","b98cb57e":"rinkeby()","b98d49a5":"getSponsorshipCount(address)","b98dbb50":"updateprojectDuration(address,uint256)","b98de7c7":"setLive()","b98e2769":"sketchNoLongerForSale(uint256)","b98ef00d":"disclosureList(uint256)","b98f0992":"TokenRK50Z()","b98f5932":"getUserExp(address)","b98fa504":"AddTower(uint32,uint16,uint16,uint256,uint256,uint16,uint16)","b98fb437":"getethused(address)","b98fdc36":"IconomiToken(uint256,string,uint8,string,uint256)","b990033e":"setNewRegister(string,bytes32,uint256)","b9902eef":"Rate8()","b9908cbb":"maximalIndividualContribution()","b9910c5f":"JixoCoin(uint256,string,string)","b991357c":"isAdvisorsTokensThirdReleased()","b99152d0":"balanceOfToken(address)","b991bc14":"direct_refunds(address[],uint256[])","b991f607":"Bank(uint256,uint256)","b9926d1d":"limitBuy(uint256)","b992812e":"hasIssued(address)","b9931d30":"getPlayerToken(uint32)","b9934b9e":"ownerResumeContract()","b99371a0":"GetPrestigeInfo(uint256)","b993a53e":"preSaleBalancesOf(address)","b993a91f":"migrationAccountCounter()","b993c871":"NGToken()","b995b014":"_exploreUsingEmont(address,uint256,uint256,uint256)","b995ce4d":"returnTokenAddress(uint256)","b99613cb":"getPlayRecordNoTurnData(address,address)","b99798e8":"accFounder()","b9980306":"processARvRevForecast()","b9981a67":"firstBalanceOf(address)","b9997819":"ownerSetHouseEdge(uint16)","b999abbc":"Spole()","b99a8a00":"exchange_coefficient()","b99ac856":"roundin(address)","b99b2f81":"myReferrals()","b99b951d":"claimTokensE(uint8)","b99c2b51":"_getWinAmount(uint8,uint8,uint8,uint24,uint256,uint256,uint256,uint256,uint256)","b99de11e":"endThirdWeek()","b99dfe18":"getPackage(uint256)","b99ec99a":"AuditorRegistryReplaced(address,address)","b99eccc1":"SplitWeighted(uint256)","b99f1d02":"claimClusters()","b99f247d":"ERGCOIN()","b99f48d5":"promisedPop()","b99f6073":"tokenPurchased()","b9a0157e":"setArrayIndexValue(bytes32,uint256,bytes32)","b9a0a708":"testChargesAmountApproved()","b9a0c1bb":"_approveRobot(uint256,address)","b9a1bd86":"registerPrivateContribution(address,uint256)","b9a2131b":"ContractTST()","b9a29d42":"getKevin()","b9a2de3a":"endAuction(uint256)","b9a30afb":"HelloGoldSale(address,address,address,address)","b9a41409":"gcpa(uint256)","b9a45aac":"whitelistAddress(address,bool)","b9a4a755":"afterApproveAction(uint256)","b9a4defe":"changeTargetAddress(address)","b9a52203":"saveRN(uint256)","b9a527b4":"book(address,address,uint256,uint256)","b9a54062":"getMaximumWritesPerStep()","b9a59b83":"isEngineerContract()","b9a5a2d9":"numberOfApprovedSteaks()","b9a5e073":"contracteesSize()","b9a60038":"totalTransactions()","b9a68300":"bountyOnlineWallet()","b9a6e94c":"buyTile(int32,int32)","b9a6f7b0":"BTHB()","b9a804fb":"ArrowTestCoin()","b9a82f80":"buyPepe(uint256)","b9a904f9":"testUnauthorizedSetBetaPackage()","b9aa8236":"getMaxAgonId()","b9aaaeee":"populateTierTokens()","b9ac0524":"icoEtherReceivedTotal()","b9ac38aa":"test_newProposalAndVoting()","b9aceb63":"BuyTicketUseVault(address,uint256)","b9ad36b9":"prophecise(bytes32)","b9ad771c":"registerHWCWit(string)","b9ae4bda":"associatedPubkeys(uint256)","b9ae7364":"pauseAuction()","b9af809e":"getMinEthersInvestment()","b9afd6e1":"returnChildAddressForParent(address)","b9b162c3":"calculateTop5HeroesPower(address,address,uint256)","b9b1c90c":"moveToSafetyWallet()","b9b237c2":"tokenFunded()","b9b26bd2":"registerBroker()","b9b2a331":"setAccPrice(uint256)","b9b2a890":"rewardDaily(uint32,uint32)","b9b2b5cd":"totalFeeCollected()","b9b3ded2":"createDividend(uint256,uint256)","b9b42602":"ethRefunds(address)","b9b43faa":"createInt256s(bytes32[],int256[])","b9b466ab":"myLoveBlockCount()","b9b6990b":"getUserBetsInARazInstance(uint256,uint256)","b9b6c2d4":"getAmountOwed(bytes32,address)","b9b7238b":"addInvestorBonusInPercent(address,uint8)","b9b7569b":"isGameLogicContract()","b9b7b68c":"limitbreak_contrib()","b9b842e5":"setCandyLand(address)","b9b8af0b":"halted()","b9b8c246":"invest(address,uint256)","b9b8e25d":"getRemainingTokensToSell()","b9b94997":"repossessBooking(address,uint256)","b9ba2926":"receivedCollateral()","b9bac5f8":"lockedUntilTime()","b9bcf81f":"getTlength10()","b9bd4f76":"newSale(uint256,uint256,uint8,uint256)","b9bda244":"sumICO()","b9bdbbbb":"FILMToken(uint256,string,uint8,string)","b9beadae":"testCantBuyTokensInEndedSale()","b9beeb8d":"DatingCoinToken()","b9bf068e":"getUncompensatedContributors(uint256,uint256)","b9c009f0":"checkContributorBalance(address)","b9c0d227":"defaultTokensPerWei()","b9c105cf":"getTaskRewardAndStatus(bytes32)","b9c1a60a":"econReserveAllocation()","b9c2c6fb":"removeMember(bytes32)","b9c2ee82":"upgradeController(address)","b9c3395f":"getTokenAmountBonus(uint256)","b9c3515c":"votingActive(bytes32)","b9c390aa":"SaferEcRecover()","b9c3a818":"TEAM_SUPPLY()","b9c4d0a7":"fundOrder(uint256)","b9c53d04":"SECCoin()","b9c5be85":"allocatePurchase(address,uint256,uint256)","b9c5eb90":"updateVoucherMthRate(uint256)","b9c7ce49":"totalIssuingCollateral()","b9c81f1d":"Membership()","b9c8464d":"extractFees(uint256)","b9c8559d":"RocketPoolReserveFund(address)","b9c89ff7":"getTargetRepMarketCapDivisor()","b9c97a44":"UnlockAccount(address)","b9c99e5e":"DepositUnfrozen(address,uint256)","b9caebf4":"del(address)","b9cb385d":"invitedInit(address,address)","b9cb5b5f":"HatchEggs()","b9cbbb62":"testInequalityAddr()","b9cc8b48":"oraclizeOn()","b9ccaed2":"getMesas()","b9cce72c":"addFlag(bool[2])","b9ce10d5":"Fyle(string,string,uint8,uint256)","b9ce795f":"createVoter(string)","b9ceda19":"updateTokenNameAndSymbol(string,string)","b9cf01a1":"Cardiology()","b9cf9d49":"getNextOrderUser(address,address,uint256,address)","b9d0a638":"Bro()","b9d1d49b":"minimumBalance()","b9d1ed4a":"ethDeposits(address)","b9d1fd60":"fundingMaxAmount(address)","b9d2fa35":"disableFundingWallets(address)","b9d3514d":"addEventToUser(address)","b9d36743":"priceToMint(uint256)","b9d414bd":"setSecurityTokensWallet(address)","b9d47fff":"mySubdividends()","b9d5205c":"SASH()","b9d54f6f":"setMinPurchaseLimit(uint256)","b9d5d7fe":"resetUserPicture(string)","b9d6257d":"DeletePool(string)","b9d677f9":"_buyProp(uint256,uint256,uint256)","b9d69a30":"sendTo(address,address,uint256,bytes)","b9d723eb":"startNewPeriod()","b9d7fdf4":"bonusTierSize()","b9d8350e":"getWeiFromUsdCents(uint256)","b9d92de8":"calculate(uint256)","b9da4033":"_randBySeed(uint256)","b9da706e":"LandSale(address,uint256,uint256,uint256)","b9da8360":"_setBattleContract(address,address)","b9db15b4":"getProduct(uint256)","b9db9a6d":"resetAllApproval()","b9dc25c5":"approvedUser()","b9dda7b8":"_ERC20Contract()","b9de1c41":"buyRaffleTicket(uint256)","b9deb729":"isTransferEnable()","b9dedc6a":"shareTransfer(address,address,uint256)","b9df2d22":"isGameRunning()","b9df819f":"receiveFunds(address,address,uint256)","b9dfaf3a":"setPriceChannelMaxSize(uint256)","b9e01aeb":"buySpaceshipUpgrade(uint256,uint16,uint8)","b9e04eea":"withdrawStuckEtherOfAmount(address,uint256)","b9e15a67":"coinAgeForAddress(address,address)","b9e16b65":"issueDescription()","b9e1aa03":"deposit(address,bytes32)","b9e205ae":"updateExchangeRate(uint256)","b9e290f9":"setValue(bytes32,address)","b9e328de":"GIDIDAX()","b9e3a8dd":"isCompositionOnlyWithBaseLayers()","b9e3e2db":"releaseDate()","b9e3ee01":"addNodeToWhitelist(address)","b9e448df":"OpenFund(bytes32,string)","b9e4d098":"setNewEndDate(uint256)","b9e58ab0":"setPropertyOwnerSalePricePrivateModeFlag(uint16,address,uint256,bool,uint8)","b9e5e2c4":"ratePerWeiInPreICO()","b9e6152b":"process(address)","b9e6ac68":"TabTradersToken(address,address)","b9e6edcf":"s15(bytes1)","b9e6f1d9":"get_amount()","b9e70ed6":"setLoanParameters(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256)","b9e722cd":"caddress()","b9e77649":"OVISBOOKED_TOKENS()","b9e7afd1":"__setSecretaryGeneral(address)","b9e7c061":"tempGetDataToCheck(uint256,uint256)","b9e7e2f9":"Beercoin()","b9e8574f":"getReservedDestinationInfo(address)","b9e95382":"store(uint32)","b9e99231":"EEM()","b9e9d1aa":"futureOwner()","b9e9e441":"exchangeTokensByAddress(uint256,address,address)","b9eb04f3":"hashPosition(uint32,int64,bytes16)","b9eb5511":"setPI_edit_5(string)","b9eca0c8":"gID_()","b9ed6df8":"withdrawEtherFromcontract(uint256)","b9ed93e9":"setWaitTimeBlocks(uint256)","b9edf911":"approveBulk(address[],uint256[])","b9ef7835":"infect(bytes32)","b9f10278":"EtherPredictx()","b9f14557":"unban(address)","b9f1fb62":"transferPrivateReservedUFT(address,uint256)","b9f2086b":"BlockWar()","b9f24e44":"freezeGame(uint256)","b9f256cd":"newProposalInEther(address,uint256,string,bytes)","b9f28076":"historyIdx(address)","b9f2d592":"maxAllowedReservingPercentage()","b9f308f2":"getEtherForTokens(uint256)","b9f37c86":"Registrar()","b9f4657d":"approve_tx(address,bytes)","b9f48cad":"performAction(address,bytes,uint256)","b9f4b5c2":"refundStart()","b9f615d7":"bankRollInvest()","b9f696d5":"setNote(uint256,bytes32,string)","b9f71934":"promotionsOfClaimant(address)","b9f7d242":"restoreAllPersistentTokens(uint256)","b9f89751":"withdrawAsCreator()","b9f96247":"SellMulti(uint256[],address)","b9f9d9a5":"test_insert_findNoHintAtPosition()","b9fa2055":"capETH()","b9fac520":"BIU()","b9fb0579":"Transfer_of_authority(address)","b9fb3ff8":"BOOYAHTEST()","b9fb7b8c":"Deposit_referral()","b9fbe331":"bonusTokenRateLevelOne()","b9fea3bb":"setBaseInfo(address)","b9feeb05":"GetCategoryCount(string)","b9ff5fcf":"getMakerBetDetails(uint256,address)","b9ffc576":"RevalootSwap()","ba001de3":"revokeBountyTokens(address,uint256)","ba00660f":"publicWithdraw()","ba00ab60":"cancelAuthorizations(address,address[])","ba0179b5":"confirm(uint256)","ba02021d":"redeemTicket(uint256,address)","ba029c97":"wei20()","ba02cf47":"MORTU()","ba02e9f2":"Coincirculationchain()","ba02f006":"_concat(string,string)","ba030c8c":"endRefundingingTime()","ba033fe1":"buyAndTransfer(uint256,address,address,bytes)","ba0410fb":"changeExhangeRate(uint8)","ba044799":"setDropable(bool)","ba057826":"MDXToken()","ba065e1f":"expired(uint256)","ba067f59":"setToSendLeft()","ba075da2":"undermineComponent(uint16,uint256)","ba081b8d":"PHOENIX_POOL()","ba086518":"delist(uint16)","ba087b9d":"balanceOfAtType(address,uint256,uint256)","ba08809d":"showTimeLock(address)","ba08f299":"decrementTotalIssuerCount()","ba09591e":"setSellFloor(uint256)","ba0a272b":"icoEtherReceivedPreFirstSale()","ba0a4ca9":"_safeGasStaticCall(address,bytes)","ba0a93a8":"getRankOnePlayer()","ba0b9788":"setTitulaire_Compte_7(uint256)","ba0bafb4":"currentWindow()","ba0bba40":"setup()","ba0bc2f4":"initialCardPrice()","ba0bf0c4":"weiMaxInvestment()","ba0bface":"managementBodyAddress()","ba0c1777":"ecoLock13()","ba0c9b54":"mcs()","ba0cf581":"findDispute(address)","ba0d291b":"CashMateToken()","ba0d46f3":"BoraToken(uint256)","ba0d94a8":"Bcigarcoin()","ba0df427":"sumOf(uint256[])","ba0e0f5e":"removeTrustedAccount(address)","ba0e6cc9":"removeVerified(address,address)","ba0e930a":"transferManager(address)","ba0f5b20":"getDarknodeBond(address)","ba0fbf0d":"_saleTokens()","ba102763":"etherToSendSecurityPool()","ba1066ed":"pendingAmount()","ba10db46":"transferEthHandleOwnership(bytes32,address)","ba112d50":"setDataEquip(address)","ba1162d7":"getFmLength()","ba119e5a":"SEBCToken()","ba11ecde":"preSaleOpen()","ba124401":"FrozenGuard()","ba13a572":"lottery()","ba14d606":"test(address,uint256)","ba151ad9":"USD_PER_TOKEN()","ba157d46":"setWebGiftEtherAmount(uint256)","ba15e52e":"getInfo(bytes20)","ba15fcaa":"Tremendoustoken()","ba16ae2d":"WBET()","ba16d600":"minReward()","ba16e00e":"bonusEnd05()","ba17e592":"performWrite1()","ba1803c1":"setCryptoJinglesContract(address)","ba181ac6":"setWhitelist(address,address)","ba1a2243":"setTokenPaymentCustomer()","ba1ad438":"newFee(uint256)","ba1af80f":"phase4Price()","ba1b44da":"getBoardRating(address,uint256)","ba1b6221":"calcUnMaskedGuEarnings(uint256,uint256)","ba1c0201":"evRefund(address,uint256,address,uint256,bool)","ba1c3b92":"setSalePeriod(uint256,uint256)","ba1ccbee":"getSupportedRolesCount()","ba1cd983":"unitCreationFee()","ba1d8d4f":"createAutoridadElectoral(bytes32,bytes32)","ba1f879f":"privateSale()","ba1fd9f4":"widraw(uint256,address,bytes32)","ba209dab":"rejectCertification(uint256)","ba20dda4":"getBeneficiary(bytes32)","ba21d62a":"Command(address,bytes)","ba2318ca":"totalSaleSupplyCap()","ba236abe":"getMyWinAmount(address)","ba255cd1":"liquidAllocatable()","ba25a585":"EventUpgradeTank(address,uint256,uint8)","ba25d944":"longDescription()","ba278e08":"setStartTime(uint256,uint256)","ba285f5d":"minimalPaymentInWei()","ba286ee3":"testRegisterCustomer()","ba2902fb":"rehancoin()","ba2a730b":"getAddressLastUpdate(address,address)","ba2a98f2":"closeZoneShop(bytes2)","ba2ab079":"changeEndPrivateSale(uint256)","ba2aee26":"addGains(address,uint256)","ba2d5c88":"MINBET_perTX()","ba2e84f9":"publicsalesCap()","ba2eb541":"isExpired(address)","ba2ee51f":"ICO_TOKENS_AMOUNT()","ba2ee65c":"manage()","ba2eebb4":"transferControl(bool)","ba2fa957":"markettingPercentage()","ba3019de":"fwdPaymentAndData(address,bytes)","ba3025d4":"epicenter_works_addr()","ba32348f":"reffUp(address)","ba32694c":"howCoin()","ba33a876":"VBToken()","ba34251b":"usdToEthPrice()","ba344304":"Lydian()","ba344743":"_rawTransfer(address,address,uint256)","ba346d11":"ArenaPool()","ba34c8f1":"setrate(uint256)","ba353925":"paymentDisable()","ba35749c":"deleteOffer(bytes32,address)","ba35b1d3":"TxMessage(uint256,uint8,uint256)","ba35c0be":"changeSelectFight2DeathContract(address)","ba35f38d":"eip20TransferFrom(address,address,address,uint256)","ba3603fd":"usdPerMEth()","ba36f423":"att()","ba3717c0":"setStrF1F2(string,string)","ba376923":"Cez()","ba377731":"getSupplyBalance(address,address)","ba37caa4":"exchangeStaStb(uint256,uint256)","ba386f0b":"propertyIdToAuction(uint256)","ba38743b":"GrabUnallocatedValue()","ba38c599":"announced()","ba391bb2":"perTokenPrice()","ba399ad2":"isInLockStage()","ba3b60ed":"rawVotes()","ba3c0067":"getTopPlayers(uint256)","ba3d0cb5":"retentionMin()","ba3dc67c":"startingPoint()","ba3eb50f":"TokenEther()","ba3eefc5":"makeInvestment(uint256)","ba3f41da":"beginCodeUpdate()","ba3f56f8":"startFinalStage2()","ba3f5a12":"tokenMultiplier()","ba3f8f2c":"getTokenPriceUSDWEI(uint256)","ba3f8f31":"ReleasingScheduleLinearContract(uint256,uint256,uint256)","ba3fc155":"ownerWithdrawal(uint256,address)","ba3fd8f7":"currChampion()","ba3fdb8f":"_createArt(uint256,address)","ba40aaa1":"setGiveAway(uint256)","ba414fa6":"failed()","ba41dc5b":"setwalletOne(address)","ba425379":"Ico_rejected(string)","ba429f33":"getRewardsContractHash(address)","ba42c8e5":"resolveSupervisorVote(uint256)","ba42fdb9":"handleLastProposal()","ba437b5d":"KOKC()","ba441560":"SetRedeemRate(uint256)","ba4442ab":"ReassingTokens(uint256,uint256)","ba44593c":"set(bytes32,address)","ba44bc0b":"UserMinMaxCrowdsale(uint256,uint256)","ba44f6a4":"RETHEN1()","ba452930":"stopPrivatePlacement()","ba454d60":"changeMaxEntries(uint256)","ba457dd1":"BreezeCoin()","ba45b0b8":"transfer(address,address)","ba4611d9":"getClaimCount()","ba463acd":"createPackage(uint256,uint256,uint256,string,uint256)","ba4670da":"onlyOwnerSetAdvWallet(address)","ba46adeb":"exerciseLong(address[2],uint256[7],uint8,bytes32[2])","ba470738":"changeRejectSetting(uint256,bool)","ba47c5f8":"inpreSalePeriod()","ba4823e1":"SoundcoinsToken(address)","ba485844":"func_0C0E()","ba487e62":"newCampaign(uint32,uint96,uint16,uint16)","ba490a03":"SpudToRotator(uint256,address)","ba49e21f":"getAttoTokensAmountPerWei(uint256)","ba4a579d":"canBetOnRound(uint256)","ba4bcd72":"currentAdmin()","ba4c206e":"removeCertificationDocumentInternal(address,bytes32)","ba4c825e":"_transfer(address,address,uint256,bool)","ba4d0c99":"conversion(uint256)","ba4d573f":"addSelctFight2Death(uint256,uint256,uint256)","ba4e1c38":"airdropTotalQty()","ba4feabd":"createEscuela(uint256,address)","ba50f965":"add_creature(uint256,address)","ba5129b9":"ethRateChanger()","ba51a6df":"changeRequirement(uint256)","ba51b1b4":"setTokenSymbol(string)","ba5233b2":"setPartnerQuota(address,uint256)","ba52688d":"approveCycle(bool)","ba53d9f3":"getSpartansOnTheBattlefield(address)","ba554374":"updateTranchRate(uint256,uint256)","ba5595d3":"numTokensAuctioned()","ba5673c3":"getChildrenLength(bytes32)","ba56763e":"getBidInfo(uint64)","ba56f6ee":"god()","ba57225d":"LogCrowdsaleEnd(bool)","ba575a39":"KOREKCHAIN()","ba59a75e":"bn128_map_to_G1(bytes32)","ba59f784":"ChessLotto()","ba5a2d33":"exitPool(address)","ba5abaf8":"startFightB(uint256,uint256,bytes4)","ba5b0e95":"CPCEIcoDeposit()","ba5c3a9d":"distributionList(uint256)","ba5c9bd6":"processReinvest(address,uint256,uint256,uint256)","ba5cb281":"uint32At(bytes,uint256)","ba5cb999":"RealTotalSupply()","ba5e286b":"getShipProductCount()","ba5eceb6":"borrowerBalance(address)","ba5f3e46":"getPlayerBetData(address)","ba61021f":"calcBonus()","ba612493":"getCurrentPassportLogicVersion()","ba61810c":"startNextPhase()","ba61a960":"Launched()","ba622884":"isManufacturerAddress()","ba622ddc":"getPlayerAnimals(address)","ba625fe6":"WineCoin()","ba629113":"contract12function2()","ba6361fb":"payme()","ba639d5a":"supplyRound1()","ba63abd6":"getPInvestedSumByRound(uint256,address)","ba63defb":"etherToSendJackpot()","ba6489e5":"getAccountReferrer(address)","ba65fa25":"getMerchantPublicKeyByAdmin(address)","ba66d7a6":"MDKICO(uint256,uint256,uint256,address,address)","ba6763ce":"withdrawBalanceFromStorageContract()","ba68693f":"PinZhiCoin()","ba693c86":"addsmartContractAdress(address)","ba69fcaa":"deleteStringValue(bytes32)","ba6a7e27":"AOABANK()","ba6afc50":"getIncentivesPool()","ba6b285a":"neuroChainAddresses(address)","ba6b5f96":"getChild(address,uint256,address,uint256)","ba6bbe55":"getPublicSaleTokensAvailable()","ba6c6490":"unlockTeamTokensTime()","ba6ca603":"ALDToken(uint256,string,uint8,string)","ba6cc6c3":"open(bytes32,address,uint32)","ba6dc506":"throwSlammerEvent(bytes32,address,address,uint256[10])","ba6f30e4":"sellCenturion(uint256,uint256)","ba6f4ab0":"burnCarbonDollar(address,uint256)","ba6ff8ad":"RTokenBase(uint256,string,string,uint8)","ba70d049":"DonateAdded(address,address,uint256)","ba70d54a":"ACTIVE_STATUS()","ba71c7f5":"setPricesManually(string)","ba723f99":"stopBid()","ba723fe2":"getRequestHash(bytes,bytes,uint256)","ba72cc36":"teamLock()","ba730e53":"getSellPrice(uint256)","ba7314ae":"AncestorHellNotes()","ba7325be":"indexOf(string,string,uint256)","ba736a99":"fetchOrderByIdWithWithPayer(string,address)","ba73737d":"AndiosCoin(uint256,string,uint8,string)","ba7435d9":"knightEquity()","ba75bbd8":"front()","ba75d0de":"minimumHydroStakeDelegatedUser()","ba76000e":"Add_Patient(uint256,uint256,string,string,string)","ba7607bf":"LogBidAccepted(bytes32,address,bytes32,address,bytes32,uint256)","ba76938b":"freezeDeposit(uint256)","ba76bfb7":"checkWithdrawalAvailable(address)","ba76e19b":"EthereumPrivateToken()","ba770154":"getUserPictureByUsername(string)","ba7705aa":"setIPFS(address,string,string)","ba773a70":"icoPrice_()","ba77ddc9":"PresaleFinalized(uint256)","ba780759":"EtherSportCrowdsale(uint256,uint256,address,address,address)","ba78a98a":"timelockEndTime()","ba78c773":"declineBid(string,uint64)","ba7a8149":"lockEtherPay()","ba7b86b9":"KhuuKoin()","ba7badeb":"nextVersion(address,bytes32)","ba7bd2aa":"withdrawTokens(uint256,uint256)","ba7bde55":"totalSupplyShares()","ba7bf7ff":"addcoinfee()","ba7c4af8":"revokeMyId(bytes32)","ba7cc631":"createKingdom(string,string,uint256,address,bool)","ba7ce849":"drawPool(uint256)","ba7d0b3c":"ETE()","ba7d619c":"returnTokensFromHoldAdditionalAddress(uint256)","ba7da724":"devVUPDestination()","ba7dc45f":"_removeOperation(bytes32)","ba7e424d":"isIcoEnded()","ba7e7cab":"getApprovalCount(uint256)","ba7ed2ff":"setMinInvestment(uint256)","ba7efcdd":"investmentLimit()","ba7fb1df":"getAddressToken()","ba8029bb":"setStartSale(uint256)","ba809390":"AccountReaderAdded(address,address)","ba80d787":"contributor()","ba80e058":"landingDiscount_ppc()","ba8118b1":"goNextRound()","ba81522f":"maxBlockDrift()","ba816496":"last50plusblocknr()","ba818f8d":"affiliateFee()","ba827243":"YangMaoZhuangYuan(uint256,string,uint8,string)","ba82bde2":"bindusertop(address,address)","ba82c897":"updateRewardToken(address,uint256)","ba82f55d":"ethsoccer48()","ba838b01":"EdCoinToken()","ba83c970":"closeSell()","ba83d63d":"getBidFreelancer(uint256)","ba847552":"isAddrCanCallServer(string,address)","ba84cb3f":"MobileApp()","ba85571c":"getPlayerInfoByAddress(address,uint256)","ba8661a2":"TimestampScheduler(address)","ba873f60":"setAssociation(address,bytes32,bytes32)","ba8747b3":"addReport(uint256,string,string)","ba874999":"getGameEngineAddress()","ba87ebfa":"IMDEXsetOwner(address)","ba87fdd4":"getSenderCities(address)","ba885446":"tokensPerAllocation()","ba88d537":"_getSenderStatus(uint256)","ba8a141f":"EnterCoin()","ba8a86c2":"whiteListedAddressPresale(address)","ba8ad39e":"grantToAllowBlocking(address,bool)","ba8af655":"returnAmountPledged(uint256,address)","ba8b7152":"BlockOfLifeToken()","ba8b9712":"adminRefundTokens(address,uint256)","ba8bb22a":"LIRAX(uint256)","ba8c0c9d":"getPropertyLastUpdater(uint16)","ba8c6980":"hasGrantAccess(address)","ba8cded7":"Bet(uint256)","ba8d045a":"tobuy(uint256,address,uint256)","ba8ef244":"getEvaluation(uint64)","ba8fb567":"startPhase2(uint256)","ba904eed":"removeRegistrar(address)","ba9072ea":"crownedTime()","ba907b7e":"testFailCreateWithParentsSameItemId()","ba90d553":"getContractsByType(uint256)","ba90f022":"modifyRecord(uint256,string,string,string,bytes32,int64)","ba9130a6":"execCustom(address,bytes,uint256,uint256)","ba91d87b":"mintForWorker(address,uint256)","ba922e04":"Karma(uint256)","ba92d382":"factory_address()","ba9316b7":"getExp(uint256,uint256)","ba9334a0":"testCombinators()","ba9398e9":"publicSaleEtherRaised()","ba93d980":"swapOpen()","ba941154":"newTapProposalFromCompany(uint256)","ba944118":"TMXGlobalToken(uint256,uint256,string,string,uint8)","ba953bc8":"KanadeCoin()","ba95b235":"sayNo()","ba95d63a":"leftSharePriceRateOfIncrease()","ba95df98":"releaseUserPrivateBonusTokens(address,uint256,address)","ba967a84":"addInit(address,address,address,address,uint256,string)","ba976ae5":"marketToken2018()","ba982c41":"tokensUnsold()","ba996aca":"getPlayerLevel(uint256)","ba99d1a6":"RATE_DAY_0()","ba9a061a":"START()","ba9a4d6e":"hasAddressVotedInBallot(uint32,address)","ba9a8b37":"convertibleTokenCount()","ba9a91a5":"SALT()","ba9a9e03":"StorageEnabled()","ba9ac37f":"mul(uint16,uint16)","ba9bb827":"CONTRIBUTION_MIN()","ba9bf757":"getPlatformBalance()","ba9c4637":"getMyPoints()","ba9d0638":"receivedCount()","ba9d407a":"GetAddressByName(bytes32)","ba9d4c09":"devuelveAppaddr(bytes32)","ba9e0907":"XJF()","ba9e9a86":"binarySearchForChallenge(uint256,uint256,bytes,uint256,bytes32[])","ba9ea413":"purchaseCostFiat(uint256)","baa0181d":"batchCancelOrders(address[5][],uint256[6][],uint256[])","baa0b806":"content(uint256)","baa23ac1":"SpecialDrawingRight()","baa24fce":"rightVotes()","baa28752":"listCenturion(uint256)","baa290d9":"DANSToken(address,address,uint256,uint256,uint256,address,uint256,address,uint256,address,uint256)","baa2e587":"confirmReception()","baa2edaf":"tokensDataProviders()","baa2ff01":"get_blockhash(uint256)","baa30f7b":"jackpotCount()","baa371d0":"DigiPulse()","baa3f7ee":"claimedOf(address)","baa3fc48":"calculate_proportional_reward(uint256,uint256,uint256)","baa40cd4":"mintForPrivateFiat(address,uint256)","baa40e5c":"getVote(string)","baa416b6":"CorsariumCore(address[],uint256[])","baa46bdd":"_createDistrict(uint256,uint256,uint256,uint256)","baa47694":"submitBlock(bytes32)","baa5eb5c":"isDspRegistered(address)","baa61df0":"tokenContractClaimTokens(address)","baa6ab81":"priceByPeriod()","baa70a8b":"LBCoinJ(string,string,uint256)","baa79dd3":"ethOdinRate2()","baa7d1f3":"MULTISIG_ETH()","baa83568":"requestColuLocalNetworkOwnershipTransfer(address)","baa8529c":"give(bytes32,address)","baa90366":"isThereACoinAtCoordinates(uint16,uint16)","baa92a05":"returnsenderbalance()","baa93b56":"crownIfFreeze(address)","baa9a8a9":"EtherbotsCore()","baa9da15":"soldTotal()","baa9e531":"totalTokensBought()","baaa3eef":"setDistValues(string,string,string,string,string)","baaa8b9a":"actualGotTokens(address)","baaac593":"LogWaterTree(uint256,address,uint256)","baab7a3a":"isSuccessDoneState()","baab89d5":"getLockedStructAmount(address,address,uint256)","baac2178":"MNLTToken()","baac274d":"getCustomerBalance(address)","baac4316":"sendTokensToMe(address,uint256)","baac5300":"createTokenProxy(address)","baad0828":"changeControllerInBntyTokenContract(address)","baad1532":"getMatchServer(uint256)","baad6c2e":"setInfoTier(string)","baadbca0":"newTickerQuery(string,bytes32)","baae172c":"setRefreshLockBalance(address)","baaee21f":"getLastN(bytes1,uint8)","baaeecb0":"getAllApproval()","baaefe5b":"priceInc()","baaf2d4f":"transferOtherERC20Token(address,uint256)","baaf4eef":"RESERVES_HOLDER()","bab1d921":"closeCurrentStage()","bab25514":"GRUToken()","bab2f2b5":"containsOnlyAlphaNumerics(string)","bab2f552":"currentCycle()","bab41142":"takerApproves(uint256)","bab41293":"getDataColla_001_002(string)","bab42b54":"test_campaignRules()","bab4e3b1":"getOwnedToken(address,uint256)","bab54f69":"_isExcluded(uint256)","bab5714c":"sendTeamSupplyToken(address,uint256)","bab58ec9":"periodITO_tokenPriceUSD()","bab5b64e":"spenderAddress()","bab5e2af":"LogBTHFoundationWalletChanged(address)","bab6d101":"checkClaimTokenByIndex(uint256)","bab6f9bf":"generateRevokeStakeForDelegationSchemaHash(uint256,uint256)","bab7b237":"totalRelease()","bab86ea8":"test(string,string)","bab8bd04":"clearAllRequests()","bab8fe40":"claimableTokens()","bab92a29":"get_owner_planets(uint256)","bab94366":"AppUpdated(address,string,address,uint256,bool)","bab95dba":"_getFeeAndNetAmount(uint256)","bab99890":"CPollo()","bab9c00c":"SmartSignature()","bab9fc63":"testFailCreateWithParentParentNotInUse()","baba4811":"recieveFunds()","babb019d":"enact_liquidation_less(address,uint256,uint256)","babb3e0b":"updateEthRate(string,string)","babbb78d":"teamTokenWallet()","babcc04c":"getLogsNum()","babcc539":"isAllowed(address)","babd222f":"addressToLarePurchased(address)","babd7012":"activeSupply()","babddb4c":"FundReturn(address,uint256,bool)","babe9394":"EasyMineToken(address,address,address,address)","babf2b2d":"EscrowMyEtherEntityDB()","babf5e37":"changeFree(uint256)","bac02609":"buyEarlyWhitelist(address)","bac03cd7":"totalContractBalance()","bac0b029":"BifreeToken()","bac0b276":"allocate(address,uint256,uint8)","bac127b9":"SecondAddressBalance()","bac15203":"unPauseContract()","bac18f9a":"handToBitmap(uint32)","bac1e2e0":"testBitsAndSuccess()","bac1e9f6":"getChannelSize(address,uint256)","bac21a22":"totalSupplyLimit()","bac37239":"addMarketMakerAddress(address,address)","bac506e0":"rf()","bac55edd":"setDnsDomains(string,string,string)","bac6068c":"inject(address,uint128)","bac6241f":"LookRevToken(address,uint256)","bac756e1":"PresaleToken(uint256,uint256)","bac79651":"setTokens(address,uint256)","bac7bb9f":"checkaddress()","bac7c252":"BTC10kon54()","bac97647":"uncleSafeNr()","bac9dbab":"ROLE_COO()","bacbe2da":"cancelVote(uint256)","bacc2753":"vestTo(address,uint256)","bacc2c42":"participate(uint256,uint256,uint256,uint256,uint256,uint256)","bacc58d7":"backManusOwner()","baccc92b":"RegulatorIfc(address)","bacd2a90":"mallocBudget(address,uint256)","bacd2e97":"executedCount()","bacd70b7":"callSomeFunctionViaInner3()","bacd8d88":"soldPercent()","bace4cf6":"Distribution(uint16,uint256,address)","bacef685":"createTokens(uint32,address)","bacf3f65":"secondPeriodOfICO()","bacf5f84":"_addBaseStats(uint256,uint8[8])","bacfddbc":"isDepositAddress(address)","bad09457":"test3(address[5],uint256[5],uint8,bytes32,bytes32)","bad16031":"isBlackjack()","bad19ead":"copyToAllUnits(uint256,uint256,uint256,uint256,uint256)","bad1f08f":"open(uint256,uint32,uint256)","bad2d6d2":"removeBlacklist(address,address)","bad4d623":"setAltDeposit(uint256)","bad568b1":"allowanceBcoupons(address,address)","bad69502":"getProviderRateHistory(uint256,uint256)","bad6b379":"changeCUSEaddress(address)","bad751bc":"createPeerReviewContract(address,bytes)","bad7726c":"checkDividendPaymentAvailable()","bad7d46a":"CreateOffer(uint8)","bad84416":"eligibleVotes(address)","bad845e6":"deleteProductInternal(bytes32)","bad84c9e":"getNumTicks()","bad9643b":"balance_wirthdraw()","badaba27":"packTable(uint256)","badae9b4":"addArgumentToRequestUint(int256,uint256,bytes32,uint256)","badb2e5a":"UpgradeRigETH(uint8,uint256)","badb97ff":"adminBurn(uint256)","badbaa3c":"setCallData()","badbbf34":"RBACWithAdmin()","badc9a52":"adminChanged(address,address)","badca131":"kill_and_withdraw(address)","badcf391":"sendMail(bytes16,bool)","badcfbcf":"withdrawSnowflakeBalance(address,uint256)","baddee6f":"listMultipleItems(uint256[],uint256,address)","bade1c54":"proposeReparameterization(string,uint256)","bade1ef9":"Birth(address,uint256,uint256,uint256)","bade6033":"propose(bytes,uint256)","bade777c":"Marked(address,address,address,address,uint256,uint256,bytes32)","badec5b4":"HK168coin()","badf3de9":"durationForBetAmount(uint256)","badf8b37":"TwoFactorAuth(string,string)","badfa573":"setAllowTransferTimestamp(uint256)","badfedf2":"genEthsRec(uint256,uint256)","bae07416":"canBeValidated(uint256)","bae0c536":"addSaleAgent(address)","bae118f4":"setHouseInfo(bytes32,uint256,string,bytes32)","bae18880":"getReceipt(address,uint256)","bae18ac3":"setUpgradeFee(uint256)","bae1c1ac":"doSendWithSignature(address,uint256,uint256,bytes,uint256,bytes,bool)","bae1cc74":"multiSubWithdraw(address[])","bae2718f":"WithNoArgumentConstructor()","bae2ddb5":"XBHX()","bae37857":"getEndTimeOfSession(uint256,uint256[],uint256)","bae3791e":"weisHardCap()","bae3c066":"sendInternally(uint256,uint256)","bae3c27f":"weiLimit()","bae4f466":"roundKeys()","bae5e693":"partnersAllocation()","bae5f9dd":"takerAffiliateFee()","bae61714":"setICOWeek3Bonus(uint256)","bae6c2ad":"queueSize()","bae6d62b":"manualOverride()","bae70892":"setMyPubKey(bytes32,bytes32,bytes32,bytes32,bytes32)","bae72565":"readAddress(address,uint256)","bae728b1":"setUnholdDate(uint256)","bae78d7b":"getEntry(uint256)","bae804a7":"transferFromSender(address,uint256)","bae8d888":"createArtefact(uint256)","bae944ba":"globalUnlockTime()","bae971e4":"getWithdrawEtherAmountValue()","bae99efc":"ICO_MAX_CAP()","baea0431":"getMsgDataAfter()","baea3a21":"addToWhitelistInternal(address)","baeb0718":"checkin()","baeb8cad":"deleteGroup(address,address)","baeb91ae":"invest(uint128)","baebcaf0":"getApp(address,uint256)","baec1ced":"depositPresaleWithBonus(address,uint256,uint256)","baec25ee":"ZYHToken()","baecd693":"sendTokensAfterBuy(address,uint256,uint256)","baed8bb1":"getAddressValues(bytes32)","baee193d":"changeCountryLimit(uint256,uint256)","baeeddfc":"Ublasti(uint256,string,string)","baef73e9":"expiryOf(uint256)","baf00f76":"removeAllSubUsers()","baf03586":"calculateBaseGet(uint256,uint256,bool,uint256)","baf05a87":"hodl_interval()","baf11cab":"isCommitted(uint256,address)","baf1256f":"withdrawToPlayer(address)","baf30051":"token_issued()","baf38352":"buy_for(address)","baf3a4d4":"distDivRate()","baf3d262":"Tickets_Sold(string,uint256)","baf3ef13":"disableNode()","baf44453":"FundAccount(address,address,address)","baf4960d":"createPlanet(uint256,address,uint256,uint256,uint256,uint256,uint256)","baf4ec53":"sumICOStage3()","baf4f6d1":"_endContestIfNeededStalemate()","baf539ee":"changeGasLimit(uint256)","baf5fbff":"PreIcobonusEnds()","baf652fe":"bonusThresholdWei()","baf6f9ca":"saleis(bool)","baf6fd32":"setintertoken(address)","baf73c0f":"holdingsOf_BULL(address)","baf79eb4":"removeDealInternal(bytes16)","baf8809b":"releaseTimeLock(address)","baf8c622":"_SUTokenContract()","baf9b369":"post(bytes)","baf9c5a2":"initialSupplyPrivateSale()","baf9d07b":"addAuthorization(address,address)","baf9d0cf":"getRoundAwardTicketNum(uint256)","bafa090d":"breakup(address,uint256)","bafa9c9d":"FighterUpdated(uint256)","bafb8e83":"marketSupply()","bafc1437":"getPurchased(uint256)","bafc7fe9":"zero_fee_transaction(address,address,uint256,uint256)","bafcea6f":"dataSourceGetYellowCards()","bafd244f":"setAmbassadorAddress(address)","bafdaf5e":"_getTargetBlock(uint256)","bafdebf3":"getServerAddress(string)","bafe648d":"BerithCoin(uint256)","bafedcaa":"lastRewardAmount()","baff4609":"lockTokenForNode(uint256,uint256,uint256)","baffa903":"getStartPrice()","bb004abc":"reserveManager()","bb005d4f":"setPlayerResearch(address,uint256)","bb007db9":"getSalaryTokenCount(address,address)","bb00c8f9":"ownerMintAmount()","bb00faca":"bonus02()","bb00fc55":"bookEarnings()","bb013206":"addNewCertificate(uint256,bytes32,bytes32)","bb0165b1":"setContractAddress(uint256,address)","bb01aa39":"unreserve(uint32)","bb01fb1f":"Issue(uint64,address,uint256)","bb043d53":"MinimalPayValue()","bb053484":"getInitializeFeePerEthInAttoethValue()","bb056781":"purchaseGas(address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","bb057c5e":"proposedImplementation()","bb05ca52":"JadeCoin()","bb061fb5":"addWhite(uint256,uint256,uint256,bool)","bb07576d":"voteToUpdatePrenup()","bb083c2b":"substractFee(uint256,uint256)","bb08b247":"showAuction(string)","bb08c6c3":"o_desafiante(bytes14)","bb0936f7":"first_bonus_amount()","bb09adbb":"privGoal()","bb0a420a":"user(address,address)","bb0a64b6":"batchTransfer(address[],uint256[],address)","bb0bcbff":"AddPoolMember(address,string)","bb0bef19":"validateFile(address,uint256,bytes,bool,bool)","bb0c08b6":"getDebitNonce(bytes32)","bb0c8298":"minimumAmount()","bb0c8893":"claimUnrelatedTokens(address,address)","bb0ce7d3":"TotalHoldersAmount()","bb0d6fb6":"noCount(uint256)","bb0d7f9a":"listTCC()","bb0db551":"add_32(uint32,uint32)","bb0e01fd":"isError(uint8)","bb102aea":"totalSupplyCap()","bb10b2f1":"PRE_SALE_BONUS_PER_CENT()","bb119f6e":"productInfo(uint256)","bb11ed7e":"rescueTokensInMultiplePolls(uint256[])","bb128575":"StopSell()","bb13245f":"decimalsMultiplier()","bb133331":"trusteeContract()","bb1488d8":"_newAuction(uint256,uint256,uint256,uint256)","bb1583fc":"isBatched()","bb158dd5":"addToTokenLocked(address[])","bb15ac8e":"readBool(bytes32)","bb1630f2":"getAllSigs()","bb169da5":"Diploma_landing_page()","bb1757cf":"claim(address,bytes)","bb17a938":"toRlp(uint256)","bb17c8cc":"round2StartTime()","bb17e050":"Nullify(address,address,address,address)","bb18705c":"_buildSettleId(bytes,bytes)","bb1953fe":"updateSeed()","bb1a473b":"VOLUME_25()","bb1a5aad":"flipFinalizedSwitchTo(bool)","bb1ad687":"gateKey()","bb1adf9b":"DURATION_BEFORE_RESTORE_UNSOLD()","bb1af82b":"Test3()","bb1b21ed":"RefCommission(uint256,uint256)","bb1b99ce":"isCurrentUserAdministrator()","bb1c9351":"redeemNativeToken(bytes32,address)","bb1cc065":"buy_lovelock_withLOV(bytes32,string,string,string,uint256)","bb1d1cf9":"tier_rate_3()","bb1d45fc":"setOtherManager(address,uint8)","bb1d7ffa":"weddingdate()","bb1dfeca":"buildId3(address,uint256)","bb1e54bc":"TokenCrowdsale(address)","bb1eeb59":"totalWeiAmountSale2()","bb1f602e":"FailingDeployment()","bb205c84":"getDownVoteCount(bytes12,bytes12)","bb210372":"getPresale(uint256)","bb221cc8":"Hadescoin(address)","bb221e4b":"FuelToken()","bb22d75c":"PROMOTION_PROGRAM()","bb23e3a9":"arr(uint256,uint256,uint256)","bb23ef74":"setOwnerTestValue(uint8)","bb2408e6":"PERCENT_DELIMITER()","bb245283":"getHatchDurationMultiByGeneration()","bb24f0dc":"operationsLength()","bb2559ca":"initialTokenBalanceFetched()","bb256f68":"VaultCountPerProcess()","bb25b143":"DrawReadyToPayout(uint32,uint8,uint8,uint8,uint8,bytes32)","bb25bd15":"addWin(address,uint256)","bb25fd7f":"SODIUMTOKEN()","bb262080":"JaroSleep(address,uint256)","bb27e19e":"getlen(bytes32,bytes32)","bb280cba":"addBackers(address,uint256,uint256)","bb287679":"mainFabricAddress()","bb28c3f2":"setNonce(string,uint256)","bb29998e":"test(address)","bb2a51d1":"setSecurityGuard(address)","bb2a7d0c":"addVestingSchedule(address,uint256[],uint256[])","bb2aebe3":"createAssetPack(bytes32,string,uint256[],bytes32[],uint256)","bb2bded0":"trinityDataContract()","bb2c5ad7":"hasRandom()","bb2ce2f5":"DeedClosed()","bb2ced1b":"previousFounders()","bb2ced25":"startPoll(address,address,bytes32,bytes32,uint256,uint256)","bb2d713e":"sells(uint256)","bb2dc863":"getChildBlock(uint256)","bb2de15a":"TicketsBought(uint8,address,uint16[])","bb2e6904":"hopeCoin(uint256,string,string)","bb2eb4d2":"ONE_PERCENT()","bb2eb982":"impl_rewardsFactor()","bb2ebf83":"CostChip(address,uint32)","bb2f159b":"read_i32()","bb2f3228":"EOCSToken(uint256,string,string)","bb305ef2":"getBondOwner(uint256)","bb3084db":"ICOStarted(uint256)","bb30d796":"releaseAllocation(address)","bb316f06":"contributeForAddress(address)","bb32b6f8":"receivedCWC(address,uint256)","bb33072f":"refundToInvestor()","bb33d729":"unpauseSale()","bb33e730":"MoveTokens(address,address,uint256,string)","bb340909":"initPecul()","bb34534c":"addressOf(bytes32)","bb34e57c":"ROLE_BURN()","bb35783b":"move(address,address,uint256)","bb35b29c":"MintIND(address,address,uint256)","bb35f7ee":"rocketTravelTimeByResource(uint256,uint256)","bb3611e7":"BonusWhiteListCrowdsale(uint256)","bb36a233":"customtransfer(address,uint256)","bb36e5d0":"returnExternalPayments(address,bool,bool)","bb36ef7b":"addManyToKyc(address[])","bb370bad":"orderWasValid(uint256,uint256,uint256,uint256)","bb371fdd":"setMaxDeposit(uint256)","bb37a162":"payAdvertisers(bytes32)","bb389952":"unlockFounder()","bb38be10":"notifyCharge()","bb397161":"createNonRepeatableVpfFactory(string,bytes32,uint256,int256[])","bb39a960":"trade(address,uint256,address,uint256)","bb39c85f":"getTotalOwedTokenRepaidToLender(bytes32)","bb39ea60":"MIN_ACCEPT_ETHER()","bb3a304f":"setFundingLock(bool,address)","bb3a77ae":"ROLE_ARBITER()","bb3b2a35":"withdraw_4()","bb3b8dca":"getCertificateHash(bytes)","bb3ce7fe":"DepositHolder()","bb3cf577":"AddressListed(address,uint256)","bb3d13c5":"addValidation(address,bytes32)","bb3d5af2":"GetClaimCount()","bb3d9326":"YTC()","bb3e409a":"buyEggs(uint256,address)","bb3e443b":"FDataToken()","bb3e5b0a":"setPI_edit_34(string)","bb3f0390":"min_inv()","bb3f5330":"revertFunds()","bb3f5b7d":"totalTransfer()","bb3ff0bd":"TITSCOIN()","bb41f421":"payerPercent()","bb424892":"minimumCost()","bb42de92":"getSubscriberContentCount()","bb43a11e":"getHashOf(address)","bb440b82":"funComputeRoundPrice()","bb445084":"getRDividends(address)","bb449782":"setCommunityAccount(address)","bb44e08d":"updateOrderNumber(uint256)","bb452ea7":"objectDoublet()","bb4534f1":"addrecruit(address,address,address,address)","bb453d5a":"CBCToken()","bb45d09d":"getCurrGameInfo()","bb471d73":"getRealAmountBonus(uint256,uint256,uint256)","bb472219":"resetGame()","bb472c93":"bet2deltaOf(uint256)","bb476637":"deliverTokensAdmin(address,uint256)","bb48156a":"preSaleRound()","bb4872de":"stoppable()","bb48d190":"upgradeToPremium(bytes32)","bb4b236a":"CSToken(uint256,string,uint8,string)","bb4b7bd0":"listForSale(uint256,bytes32)","bb4c006c":"checkDeletable(address)","bb4c9f0b":"multiSend(address[],uint256[])","bb4cbd0b":"gracePeriodStopBlock()","bb4d0cb5":"FSC3()","bb4d4b2f":"addVestingAccount(address,uint256,uint256)","bb4d7cd1":"tag(uint256,string)","bb4d9e22":"WithBonusPeriods()","bb4e3f4d":"add(uint8,uint8)","bb502bac":"EthbetOraclize(address,address,uint256)","bb502dd9":"checkExchangeSupported(bytes32)","bb504317":"divest(address,uint256)","bb50c67a":"crowdsaleRunning()","bb510a77":"createChannel(address,uint256)","bb5166e7":"getPaymentType(address,uint256)","bb5196d6":"setParams(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","bb51de39":"IDEAL()","bb51f32d":"withdrawTeam()","bb52ca2c":"getOrgClaimsCount(address)","bb537ced":"matchesDelay()","bb540231":"totalFartsReceived()","bb542ef0":"setOwnerWallet(address)","bb5530c4":"updateCampaign(uint256,string,string,string,address,address,address,string)","bb56a683":"guaranteedBuyersBought()","bb572896":"consolationRewardsRequiredFaith()","bb57349c":"handleSaleClaimCallback(address,uint256)","bb575333":"sessionEndTime()","bb582db6":"mgmtBodyAddress()","bb584a3a":"EventCancelAuction(uint256,address)","bb59b48c":"payableWeiReceived()","bb59d68c":"DariaRotkoToken()","bb5a1149":"myReferee()","bb5a4f4c":"placeBet(uint256,uint256,uint256,uint8,bytes32,bytes32)","bb5a7ca0":"extendEventStartsTime(bytes32,uint256)","bb5adf14":"setProxyManagementContract(address)","bb5b3edc":"emergencyWithdraw(uint256,bool)","bb5b586b":"usdPerKEther()","bb5b6aa4":"myInner2()","bb5c3821":"total_ICO_supply()","bb5d3bcb":"tokensPromotion()","bb5d40eb":"isValid()","bb5d69a0":"setEns(string,address)","bb5ddb0f":"sendMessage(address,bytes)","bb5e0696":"LongTermReserveMinted(address,address,uint256,uint256)","bb5e3d3b":"doThing(string)","bb5e5875":"InseeCoin()","bb5e78a4":"HasSigningPermission(address)","bb5e9dec":"get30Artworks(uint16)","bb5e9eab":"thirdWeek()","bb5f4629":"orders(address,bytes32)","bb5f95fe":"LSECoin()","bb602e80":"Volkscoin()","bb6198dd":"getOrCacheTargetReporterGasCostsWasCalled()","bb632244":"btcs()","bb642f65":"seedCreatedCount()","bb64c09b":"KIMEX(address,address)","bb64c79e":"SearchTimeBlocknumber(string)","bb64e420":"getTransactionByTransactionId(uint256)","bb6534a9":"AMOUNT_TeamSupport()","bb67be65":"AFUN(address,uint256)","bb68b86f":"maxTokensToDistribute()","bb6954ce":"BourseToken()","bb6996a5":"swapWinner(uint256,bool,uint256)","bb6a0853":"GreedPit()","bb6a0f07":"tasksCount()","bb6a1427":"testThrowRestartEnforceRevisions()","bb6a55bd":"_mintToken(address,uint256)","bb6ad6ef":"withdrawTokenId(uint256)","bb6af3da":"limit9()","bb6af543":"setJackpotPayRate(uint256)","bb6b13a1":"tier1()","bb6b38bb":"setAdminAddressForComissions(address)","bb6b4619":"SendETC(address)","bb6c1178":"RentToken()","bb6c4827":"burnThis(uint256)","bb6d0132":"End_Promotion()","bb6d203c":"spend(address,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","bb6d8c77":"contractPoweredUp()","bb6e7de9":"endContract()","bb6f0f0f":"fetchAllCandidatesBySnapshotBlock(uint256)","bb6f175f":"SimpleAquaPriceOracle(uint256,uint256)","bb6f6c15":"protectedDenominationOfOrigin()","bb7029a9":"gameCollapse()","bb702c8e":"discard()","bb707059":"approveMany(address[])","bb70abfa":"_computePVPBeneficiaryFee(uint256)","bb718861":"scheduleCall(address[2],bytes4,bytes,uint8,uint16,uint256[6])","bb71a7c3":"makeInvestment(address,address,uint256,uint256,address)","bb72680c":"getHasPermission(address,string,string)","bb72b12d":"oldOwnerProfit()","bb731f98":"Excalibur()","bb73703f":"delRoleForUser(address,string)","bb7436a7":"getUsersDroidsIds()","bb74a5a0":"testValidationOfDoubles()","bb74b4e6":"TOKEN_SUPPLY_OWNER()","bb74dcda":"isRefunded(address,address)","bb750232":"allowReceiver(address)","bb75a2a9":"throwMe()","bb76d8a5":"TimeLock()","bb777028":"PRE_ICO_BONUS_TIME_3()","bb777498":"calculateId(string,string,string)","bb77b136":"planetAuction()","bb77d7d8":"ConunToken(uint256,string,uint8,string)","bb784140":"AragonTokenSaleMock(uint256,uint256,address,address,uint256,uint256,uint8)","bb7859b5":"periodThree()","bb785f0e":"AirDropPayBitsR1(address[])","bb78d159":"approveTokenControlInfo(uint256)","bb79428c":"RateUpdate(string,uint256,string,string)","bb7963e3":"hasArbiterVoted(uint256,address)","bb7a6dba":"vestingHasStarted()","bb7c15ab":"createDog(uint256,uint256)","bb7c62cb":"getReferrerBonusTokens()","bb7cb80b":"dropOffset()","bb7d064f":"automatedReport(uint256[])","bb7d4f65":"ICOFFSHORE()","bb7d715b":"startEthToCentsRateUpdateCycle()","bb7dd72d":"finishMintingStruct()","bb7fa4ac":"sellCeiling()","bb7fb08b":"getContributor(address,uint256)","bb7fde71":"mint(address,uint256,uint256,string)","bb7fe5c9":"LotteryAdmin(address)","bb7ff992":"requestSellforETH(uint256)","bb806dc9":"initial()","bb813a9b":"KkkTokenSale(uint256,address)","bb814746":"ICO_TWO()","bb814e9e":"versionExists(bytes32)","bb818ea6":"advancedNETH(uint256,string,string)","bb81926d":"_applyCommission(uint256)","bb822605":"calculateTokensTier(uint256,uint256)","bb826e50":"maxBlockActions()","bb828f11":"setChallengeRewardsPercent(uint256)","bb83a01f":"MyTALToken()","bb843219":"closingDateFunding()","bb84d362":"splitProfitVIP_only_Dev()","bb850e01":"_transferOwnershipOnBuy(address,uint256,address)","bb85931b":"eSTATERToken(address,address)","bb862588":"getCET6ScoreById(uint32)","bb86d8fe":"CPGPEREGRINE_FTL_SPEED()","bb878f2a":"ProposalAdded(uint256,uint256,string)","bb87b5f8":"getPersonalStatus(address)","bb87c1f2":"getAllowedUsers(address,uint256)","bb889341":"ZiberToken()","bb88c016":"decreaseApproval(uint256,address,uint256)","bb898233":"getAct()","bb8ab48c":"Bluechip()","bb8b2b47":"getUserContribution(address)","bb8bbc90":"ContractEFT()","bb8bcc46":"crowdSaleCap()","bb8be064":"HardwareToken()","bb8bedc9":"setMasternodeCandidate()","bb8c256a":"ecadd(uint256,uint256,uint256,uint256)","bb8c7ce4":"ContributionReceived(address,bool,uint256,uint256,uint256)","bb8c869d":"contestOver()","bb8c9797":"claimReward(string)","bb8d35ce":"medibitToken()","bb8dc735":"getNonceCompareOp()","bb8e8f46":"isExecutionAllowed()","bb8f0dd2":"PonziSeller()","bb8f712f":"generateGame(bytes32,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","bb90617b":"toUINT112(uint256)","bb90cec2":"setNewRound()","bb911607":"percents(uint256,uint256)","bb912454":"setKNCPerEthRate(uint256)","bb913f41":"_setImplementation(address)","bb91f8ae":"ownerTransferAllEther()","bb925c19":"_selectWinner(uint256)","bb94392e":"getRemainingTokenForArticle(string)","bb945177":"produceTokens(address,uint256,uint256)","bb9453a5":"assetProperties(address)","bb95d992":"blockhashes(uint256)","bb963c8a":"transferLibOwnership(bytes,address)","bb969132":"getLandEstateId(uint256)","bb9694f3":"Eth()","bb971094":"finishAirdrops()","bb979c3d":"getHotelsByManager(address)","bb9932a7":"addressReserveSupply()","bb996043":"returnPtSafeXLarge()","bb99999c":"TokenLinked()","bb99dec1":"MoldCoin(uint256,address)","bb9b02a8":"evLockFund(address,uint256)","bb9b13d8":"getTotalInterestAmount(address)","bb9ba82d":"Florijn(uint256,string,string)","bb9c3f2b":"minWager()","bb9c6c3e":"verify(string)","bb9e1edc":"ethBaseBalance(address)","bb9e3547":"setTokenCost(uint256)","bb9e37ec":"TitleApproved(uint256)","bb9efd5e":"bulk(address[],uint256[])","bb9efdc6":"QUAK()","bb9fc9ed":"transferStmpsToOwnerAccount(address,uint256)","bba02bf8":"LyuTestToken()","bba04dc9":"resetExplicitState(uint32,int64,int256,uint64,int8)","bba231ce":"_isPast(uint256)","bba2e907":"prepaymentFee()","bba33ace":"sellerCut()","bba45738":"setOmegaContract(address)","bba46031":"LOFO()","bba4a876":"setStateDistributing()","bba4b31e":"birthBlock()","bba4c282":"RaiblocksClassic()","bba4e4c0":"AddressForReturn()","bba4e9bd":"getTraitCount()","bba52516":"tokenTimelock()","bba570cb":"getDatURL(string)","bba5ad87":"registNameXid(string,uint256)","bba5b24e":"buyTokens(uint8)","bba65ed1":"isbit(uint256,uint256)","bba7a1ab":"getTokenVolumebasedBonusRateForPhase1(uint256)","bba80923":"msub(uint128,uint128)","bba8a065":"insert(uint8,uint8)","bba8b342":"PresaleMidexToken()","bba90086":"updateAndTransferFrom(address,uint256,string,uint256,uint256)","bba91ea7":"getHomeadvIndex(uint256)","bba9a9f6":"zeroFeesTransfer(address,address,uint256)","bba9cfe1":"soldBeforeUnsoldAllocation()","bba9dc60":"deactivateProvider(address)","bba9ffce":"TransactionFailed(address,address,uint256)","bbaa7345":"changeDivestmentFee(uint16)","bbaa7a57":"getHeroAttributes(uint256)","bbaaa787":"claimable(address,bool)","bbaac1e8":"privateSaleTokensAvailable()","bbab867c":"setSubContractAddresses(address,address)","bbac78a9":"setImmutableOwnership(address)","bbad490f":"phase_3_bonus()","bbad6172":"ICOZ()","bbadb845":"updateProduct(uint256,string,uint256,uint256,uint256)","bbaefe9f":"bytePrice()","bbafb379":"updateBatchStartTime(uint256,uint256)","bbb01c9c":"privateIcoMinimumContribution()","bbb0c054":"foundersVestedPayment()","bbb0d58e":"_createNeighbors(int32,int32)","bbb104cf":"FucksToken9()","bbb1c4c0":"withdrawForFiveYear()","bbb21c4d":"explore(uint256,uint256)","bbb28a65":"contributors_count()","bbb37f60":"purchaseLeader(uint256)","bbb37f76":"registerTier2Users(address[])","bbb44989":"Token2GB(address)","bbb50b78":"vraWallet()","bbb655b6":"_setGasPrice(uint256)","bbb7259c":"CrowdsaleLimit(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","bbb73e3e":"GetBuyPrice()","bbb7d310":"getCompte_19()","bbb7eb64":"addInventories(uint256,uint256,uint256,uint16)","bbb896ad":"isCurrentAdmin(address)","bbb906f7":"TomSkin()","bbb92642":"BotTradesToken()","bbba3333":"safer_ecrecover(bytes32,uint8,bytes32,bytes32)","bbbc0f55":"_price_tokn_ICO_first()","bbbc67d0":"getParticipantDestination()","bbbc77dd":"intersubtoken(address,uint256)","bbbd2953":"startNewBattle(uint256,uint256,uint256,uint256)","bbbdef70":"FreezoneToken()","bbbe1390":"getEmployerJobsForFreelancerInvite(address,address,address)","bbbeac89":"MastermindAlliancePublishingGroupToken()","bbbf8fbd":"increaseWeiRaised(uint256)","bbbf9384":"BATTLE_CASUALTIES()","bbbfc4db":"mulsm(uint256,uint256)","bbbff4fb":"updateMinAmountWei(uint256)","bbbff571":"changeKey(string)","bbc001c3":"alloc()","bbc0c1a2":"addOrg(string,string,string)","bbc0ebbf":"soldForFirst()","bbc10d1a":"distributeeBitcoinCashSmall(address[])","bbc2402d":"startCrowdsale(uint256)","bbc2986c":"setPrice(uint16,uint256)","bbc2fcf5":"TOKEN_PER_ETH()","bbc30ad8":"getGalleryData(uint256)","bbc32820":"autoPay()","bbc39ab6":"readCharityAddress()","bbc42b3f":"orderToContractor(uint256)","bbc43d41":"pay(uint128,address,bytes1)","bbc49130":"Milestone_OpenTheIco(string)","bbc53086":"csvConcat(string,string,string,string)","bbc5aa5b":"maxTransferAmount(uint256)","bbc5d3d9":"setQuickConverter(address)","bbc6049d":"etherSpin()","bbc620a8":"setNewWithdrawCommission(uint256)","bbc6351e":"MMMC()","bbc64582":"getVotesCount(address,uint256,bytes32)","bbc6df30":"getRoundInfoByID(uint256)","bbc6eb1f":"getDefaultDonation()","bbc7d0b9":"marketingPool()","bbc7f045":"ZenCoin()","bbc84d1a":"voteWorth()","bbc878c4":"totalSeraphims()","bbc894a1":"GuoCoin()","bbc8e3cb":"disallowTransfers(address[])","bbc94fda":"priceProgression()","bbc9f09a":"payPartners()","bbca0a89":"c_endTime()","bbcac1c3":"vipBrokerFee()","bbcb4e3a":"TokenERC20(uint32,string,string)","bbcbce8e":"MIN_GOLD_TO_UPGRADE()","bbcbe572":"d(address,address)","bbcbefd0":"unset()","bbcc69ef":"withdrawTokensByInvestors()","bbcc8cea":"SaiSaiToken(uint256,string,string)","bbcd0f02":"endorseClaim(string,string,string,address,address,string)","bbcd5bbe":"setTokenContract(address)","bbcdd139":"initExploit()","bbcded7a":"left73(uint256)","bbce2c17":"lastBurn()","bbce3fc2":"getLastBet()","bbce67ca":"lastPlayTime()","bbced0d0":"newTopic(string)","bbcef175":"end_redeem_period()","bbd0c939":"computePrice(uint256,uint256)","bbd1e186":"addModule(string)","bbd1e1fc":"editionActive(uint256)","bbd2e01e":"betsLength()","bbd2e059":"impl_transferMSI(address,address,uint256)","bbd31db3":"openAll()","bbd32de0":"massTransfer(address[],uint256)","bbd3684c":"reservedteamtoken()","bbd37e37":"RICO()","bbd37ef3":"getReportingParticipant(uint256)","bbd39ac0":"coinBalanceOf(address)","bbd3b27c":"loveEvent()","bbd3b2ab":"inrSessions()","bbd418e6":"testConcatStorage4Bytes()","bbd425df":"bestUser()","bbd4271f":"setRateAndStart(uint256,uint256,uint256)","bbd46303":"changeStage(uint8,uint256,uint256,uint256)","bbd4e8c9":"numDeposits()","bbd4edb1":"updateRatingCustomer(string,bool)","bbd4f854":"buyShares(bytes32,uint8,uint256,uint256)","bbd5301a":"_devteam()","bbd53bf7":"fairsale_protectionOFF()","bbd5d174":"LogGame(string,string,string,string)","bbd6dd48":"getUserTokenInfos(uint256)","bbd74748":"Ethraffle_v4b()","bbd8b602":"getOracleOutcomes(bytes,address[])","bbd95c32":"inArray(uint256[],uint256)","bbd974cc":"maxAllowedTakerBetsPerMakerBet()","bbd9a5fa":"grantPermission(address,string)","bbda1e9a":"BicycleToken()","bbda33d9":"getGameName()","bbdaebe2":"transferFromInternal(address,address,uint256)","bbdb31cb":"challenge(uint256,address,bool)","bbdb57c3":"batchTransferORSS(address[],uint256[])","bbdbd31e":"beneficiaryAndBirth(bytes32,int256,bytes32)","bbdc02db":"gameType()","bbdc04d8":"getDealData(bytes32)","bbdc7709":"startDispute()","bbdd366a":"DECIMALS_MULTIPLIER()","bbddaca3":"setReferrer(address,address)","bbdefbbb":"AWMVoucher()","bbdfbfba":"delivered()","bbe00af5":"beneficiars()","bbe18d43":"betClosed()","bbe2b727":"burnWholeBalance()","bbe42771":"closeDeed(uint256)","bbe430de":"available(address,address)","bbe437eb":"endICO_w2()","bbe4fd50":"getNow()","bbe562b0":"multiplication(uint256,uint256)","bbe5d9d4":"addSpace(uint256,uint256,bytes)","bbe61730":"get_sale_arbits_total()","bbe7180b":"envio_dinero()","bbe7221e":"orderbookContract()","bbe86e6a":"sendTokensToOne(address,uint256)","bbe8a9b6":"registerSecretBatch(bytes32[])","bbe93d91":"mul(int256,int256)","bbe9c7d6":"takePromille(uint256,uint256)","bbe9f99d":"isTeamMember(address)","bbeadcad":"invalidateVotingAtIndex(uint256)","bbeb5923":"joinFee_()","bbeb76bc":"setMultipleParticipantWhitelist(address[],bool[],uint256[])","bbec3768":"createOrder(uint128,uint16,uint256,uint8,uint256)","bbec9e1b":"deletePriceCredentialItemId(bytes32)","bbececa9":"left78(uint256)","bbed7177":"getContentTimestamp(uint256)","bbee1ab7":"forgiveIt(address)","bbef83cf":"getContractNameById(bytes32)","bbef86b8":"PayForServiceCHL(uint256)","bbf02b00":"level_8_percent()","bbf0f065":"keepEth()","bbf14d67":"tier3Timestamp()","bbf1e6d0":"SetMiningEnable()","bbf2a9a3":"changeAcct3(address)","bbf2ee4e":"lockAddress(uint256)","bbf3ae00":"ccExchangeRate()","bbf48d6f":"convertReward()","bbf58f4d":"foundersVault()","bbf59a41":"personal_withdraw()","bbf646c2":"ethAddr()","bbf7585c":"getDistributionAt(uint256)","bbf76802":"purchaseApprove(address)","bbf78026":"SetMemberInfo(address,address,bytes32)","bbf89803":"addBuyer(address)","bbf9cd8b":"EACCoin()","bbfa6153":"getRegulatorLevel(address)","bbfad256":"updated(uint256)","bbfb2f7a":"getEndtime()","bbfbaaf8":"getWorkSecondsInProgress()","bbfbe6b6":"discountedMiningDifficulty(address)","bbfcc86b":"getHistEthRate(uint256)","bbfe6b75":"externalCall(address,uint256,bytes,uint256,uint256)","bc0111a8":"initEnsRigistrar()","bc014bb9":"earlyBackers()","bc019eed":"getAffiliate(address)","bc01b767":"freezeTransfersUntil(uint256)","bc02844c":"totalRemaining(uint256)","bc032967":"getRetailerByAddress(address,address)","bc03a31e":"superManager(address)","bc04056a":"LockedDayAdded(address,uint256,uint256)","bc0409bf":"addTokens(bytes32,uint256)","bc04562d":"Reclaimer(bytes32)","bc04cb0f":"FEED1()","bc04d77b":"datasetHub()","bc055227":"ownerOfPiranha(uint256)","bc05529b":"SaleDeadline()","bc058968":"updateThingData(bytes32[],bytes32[],uint88)","bc05d087":"registerProduct(uint256,string)","bc063e1a":"MAX_FEE()","bc064863":"getRequestorAddresses()","bc070e83":"minimumBuyIn()","bc084de9":"CrowdsaleAuthorizer(address,uint256,uint256,uint256,uint256,uint256)","bc08afd9":"WebOfTrustToken(address,uint256)","bc09b5ec":"fundPreIco()","bc0aaff2":"setzBytes32(bytes32)","bc0aca61":"setFeeAccount1(address)","bc0ae61e":"GazeBountyCoin()","bc0b45fa":"OSPN()","bc0c868c":"stocksOf(uint256)","bc0cd8d3":"BOOCOIN()","bc0e7adb":"testThrowsDisownNotOwner()","bc0eaf0a":"calcAmountAt(uint256,uint256)","bc0f920a":"AuthSuspend(bool)","bc0fb9a0":"predictWinner(uint256,uint256,uint256)","bc1013db":"m_totalWorkerPoolCount()","bc101ffe":"twentyPercentWithBonus()","bc104f24":"compareItemSlots(uint256,uint256)","bc10a667":"euroRaisedICO()","bc10ce84":"Test(int256)","bc1123fe":"isUInt256ValidIn64(uint256)","bc112fa3":"ALC_FUNDATION_ADDRESS()","bc11f72c":"DABcoin()","bc120fe7":"whitelisted(address,address)","bc126ba1":"totalCents()","bc1292a0":"BonusChange(uint256)","bc129a98":"accountedTokenSales()","bc12d19d":"maxCapTokenPresale()","bc12e3d7":"getAuction(uint64)","bc1351ba":"has_contract_started()","bc13e3a6":"controller2()","bc14016b":"removeAllOps()","bc148094":"PostAdded(address)","bc1558be":"MANHATTANPROXY3RDAVE()","bc15a2dd":"BEAXY()","bc15be93":"firstRoundCosmosDiscount()","bc15e5fe":"get_next_global_audit_document(bytes32)","bc16272d":"requestRegistration(bytes32)","bc168c90":"_setIPFSHash(bytes32,string)","bc174df3":"ProofOfCryptoNick()","bc17991d":"restoreBalances(address[60],uint256[60],uint256[60])","bc17a0b4":"PAST()","bc17bd7e":"SelfDestructible(address,address)","bc17e669":"exiteJugador(address)","bc186dc9":"unlockBalanceByIndex(uint256)","bc18f727":"galleryFive()","bc197c81":"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)","bc19bcbf":"submitBallotWithPk(bytes32,bytes32)","bc19bce5":"resolveName(string)","bc1a3810":"thelnwaonCoins()","bc1af71d":"_maxTokenSoldPreICO()","bc1c002c":"call_contract(address,address)","bc1c9888":"CoOwnerSet(address)","bc1e9ca3":"USD_CENT_PER_TOKEN()","bc1ea063":"LogContractOwnershipChangeInitiated(address)","bc1f71e1":"depositKncForFee(address,uint256)","bc2010cc":"feesC()","bc2017f3":"adjustPriceOfCountryPlayersAfterWin(uint256)","bc201a9d":"addSupport(address)","bc208057":"enter(uint256,uint256,uint256)","bc215cb6":"BBTokenBox()","bc21ce9d":"Aggregation()","bc22df1a":"buySpaceshipUpgrade(bytes5,uint16,uint8)","bc22f570":"poolsToCreate()","bc231983":"Temp()","bc244c11":"shut(address,bytes32)","bc244fc9":"systemAddress(address)","bc24612c":"claimableAmount(address,bytes4)","bc246a36":"hashState(address,uint256,uint256,uint256)","bc24d886":"setSail(uint256,uint256,uint256,uint256,uint256,uint256)","bc25415c":"produce(uint64)","bc25a810":"lock(address,bytes32)","bc25e2fd":"postProof(string)","bc2622b4":"addKeyValue(string,string,string,uint256)","bc2674b1":"LogExchange(address,address,uint256)","bc27c7bb":"buyZoAssets(bytes32)","bc28cfe4":"getTicketSet(address,uint256,uint256)","bc28d878":"rejectProposal(uint256)","bc294a7c":"setCEOAddress(address)","bc2a4dd6":"doBalanceOf(address)","bc2b6913":"donateSkin(uint128[],address[],bool[],uint256[])","bc2bbad7":"getMyNotes(uint64,uint64)","bc2c3a12":"ValidContractAdded(address,address,uint256)","bc2d10f1":"finishEthGet()","bc2d87f5":"Set(string,string,address)","bc2eb3f8":"removeNode(bytes32,bytes32)","bc2fe07b":"transferCardOwnership(address,uint8)","bc300ed3":"setBounty(address)","bc304e55":"serverTransfer(address,address,uint256)","bc308233":"autoreleaseTime()","bc30e4ac":"abcLotto()","bc30f3f8":"modifyPlatformAddr(address)","bc33f8ef":"commonRebate()","bc345e11":"Updated(address,address,bytes,bool)","bc346090":"DigipayToken()","bc346c9c":"Attack(address)","bc34f204":"getP3DBalance()","bc356eea":"VEN()","bc3574d4":"adjustSupply(uint256)","bc3589bf":"TOKEN_FIRST_PRICE_RATE()","bc358af9":"listItem(uint256,uint256,uint8,address)","bc35c57f":"setMinAmount2Round(uint256)","bc3619dd":"onBlockClose(address)","bc364d7b":"tokenVestingAddress()","bc367377":"setTokenBurnApproveReset(address,address,address,address)","bc376bbe":"unlockFor(address,uint256)","bc378a73":"getProposalsLength()","bc37d7b8":"setVendingFee(uint256,uint256,uint256)","bc389b6d":"callWithdraw(uint256)","bc38a991":"testInsert()","bc39d42f":"sigDestinationTransferFrom()","bc3a72a5":"ETHHToken(uint256,string,string)","bc3abbdb":"etherPerMiner()","bc3b0d31":"STCB()","bc3bc814":"changeTolerance(bytes32,uint256)","bc3c2846":"requestMediator(uint256,uint256,address)","bc3d9390":"printBlockHash()","bc3dde2f":"xxx(address)","bc3f7bcb":"moleculartechnologySupply()","bc3f931f":"getVote(uint256,address)","bc4006f5":"erc721Metadata()","bc4076e9":"accountsReceiveableHeld()","bc408ec4":"ElixirUSD()","bc40b52a":"startPreICO()","bc40bac6":"getCrydrViewAddress(string)","bc41f298":"changeControllerAccess(address,bool)","bc427bc8":"setFreezeForFounding(uint256,address,uint256)","bc428ee2":"getTimeOutAuthentication()","bc431846":"getBetPriceID(uint256)","bc4447ef":"getBlackListStatus(address,address)","bc447a6d":"numDragonTypes()","bc448782":"setCrowdsaleAddress(address,address)","bc44e79d":"getStageWinners(uint8,uint16,uint8)","bc44ea9a":"setBank(address,uint256)","bc451844":"BONUS_DURATION_1()","bc456c42":"changePaymentAddress(address,address)","bc45d789":"setConfigUint(int256,bytes32,uint256)","bc466ab2":"setNewEnd(uint256)","bc467a3e":"ownedContract()","bc48bc22":"erc20TokenCount()","bc48f4be":"getLand(int256,int256,address)","bc499814":"generatePrefixedPreimage(bytes32)","bc4998b9":"eth2MNT(string)","bc4a2030":"getCurrentRate(uint256,uint256,uint256,uint256)","bc4af295":"spawnAssetWithCreator(address,uint256,uint256,uint256,address)","bc4afa67":"MBTCToken(address,uint256)","bc4b3365":"addFunds(address,uint256)","bc4b346d":"confirmQuest()","bc4bbad1":"updateCostETH(uint256)","bc4c594b":"tokenManagerAddress()","bc4d76e5":"EPay()","bc4d9b50":"minerLockedAmount()","bc4e3105":"unlockAddressDuringITO(address,address)","bc4f65a3":"addCity(bytes32,uint256,uint256)","bc4fcc4a":"redeemedAt(bytes32)","bc4fe17e":"addressToUser(address,address)","bc50c09e":"playAnyTriples(uint256)","bc517131":"walletVersion()","bc5213b7":"_setCurrentRate(uint256)","bc523229":"ShopDex()","bc525652":"templates(uint256)","bc52b43b":"buyinAs(address)","bc537bae":"getMeOutOfHereStocks()","bc53a93d":"E4Token()","bc54a168":"buyTokensOnInvestorBehalfBatch(address[],uint256[])","bc54f56f":"getTemplateDetails()","bc562b9e":"loseSponsor(uint32)","bc56a240":"walletEtherPresale()","bc56e749":"acceptProposal(uint256,address)","bc57275b":"EthCnyPrice()","bc579103":"totalPayed()","bc57d5f5":"transferFrom(address,address,uint256,uint256,uint256,uint256)","bc597d9f":"getProposalVotesCount(uint256)","bc59afe6":"scanMany(address[],bytes1[])","bc59d45a":"raisedWei()","bc5b75f4":"EtherWorldCup()","bc5bf5bf":"releaseVestingTokens(address)","bc5c0c67":"setDowntime(uint256)","bc5cfd4f":"lastBonusNumber()","bc5d066e":"changeCompanyWallet(address,address)","bc5d0f65":"beginExecution()","bc5dc168":"balanceOfLocked2Y(address)","bc5dfd7d":"getCompte_23()","bc5e4bb4":"_hasSkillsCheck(uint256)","bc5ff5e1":"oraclize_query(string,string[4],uint256)","bc602ab7":"removeRandomClass(uint32)","bc607f7b":"funcFromC2()","bc60878e":"total_received_amount()","bc60a365":"removeAdminAccount(uint256,address)","bc60ac60":"StefyToken()","bc61394a":"fillOrder(address[5],uint256[6],uint256,bool,uint8,bytes32,bytes32)","bc6171df":"sendETHToMultiSig(uint256)","bc62c89a":"getTrainerEarn(address)","bc62d8d8":"parse(string)","bc632a21":"creationTime(address)","bc634abb":"getDocumentProposals()","bc636707":"_explorationTime(uint8,uint8,uint8)","bc63cc90":"starCountsForOwner(address)","bc64059b":"exchangeEtherForHavvensAtRate(uint256,uint256)","bc643df1":"getIncludes(uint256,uint256)","bc649f4c":"grantProvider(address)","bc6548fb":"etherVault()","bc655f54":"getEndDate1()","bc65c559":"preIcoInvestment(address,uint256,uint256)","bc65d6f6":"getSubscriberContentHashes()","bc65e9e1":"PenCoin()","bc6633f7":"setSaleState(uint16,bool)","bc677b46":"viewOwner()","bc67f832":"setMessageSender(address)","bc68118b":"setDeveryRegistryAddress(address)","bc68fad9":"burnBalance()","bc697319":"minimumGoal()","bc69dc89":"BenefyCashToken(string,string,uint8,uint256)","bc6a49a3":"LaunchRocketEvent(address,uint32,int64,int64)","bc6ac112":"calculateRegionInitialSalePixelPrice(address[16],uint256)","bc6b12b3":"odem()","bc6c06e7":"GoodfieldRetail(uint256,string,string)","bc6c4d0f":"totalVotesForCandidate(uint256)","bc6d68ee":"updateSubscription(address,address,bool,uint256)","bc6d80fa":"getLenderAmountForIncreasePositionAtTime(bytes32,uint256,uint32)","bc6e6604":"TOKENS_PER_ETH()","bc6f1699":"clockpos()","bc6f712a":"Attestation(string,bool,address)","bc6f9021":"maxCapTokens()","bc6fd6d9":"MINIMAL_WEI()","bc70ad19":"IMEXX()","bc713f1d":"AddPoolCoOwner(string,address)","bc71b0a6":"DeCenterToken(address,address,address,uint256,uint256)","bc71cdcb":"BAInvestor()","bc7202d7":"_updateSalePrice(uint256,uint256,address)","bc734f0f":"nextSeason()","bc735d90":"setOperator(address,address,bool)","bc73a7e4":"_preValidatePurchase(address,uint256,uint256)","bc73c971":"TierBasicDividendAddress(address)","bc7411b2":"chargeBonuses()","bc745a0d":"nextBonusStepLimit()","bc752b61":"buyTicket(uint256[],uint256)","bc76dca0":"GoWalletProject()","bc77b919":"_mySymbol()","bc77f476":"EVCChain()","bc78ac81":"setPet(string)","bc7a6e35":"_startAuction(bytes32)","bc7b3f86":"NewHighestBid(address,uint256,string)","bc7b6d62":"setResolver(uint256,address)","bc7b801e":"adminUpdateWorldSnapshot()","bc7c322c":"ratePerWei()","bc7c55ed":"listing()","bc7c72d7":"getmessagefromdovie()","bc7d8cb4":"EURSToken(address)","bc7dbc0d":"yearlyFee()","bc7dce06":"setETHPrice(uint256)","bc7e8d3c":"isDeholdable()","bc7f25e4":"getReferrerOf(address)","bc7f3b50":"getDelegate()","bc7f58b1":"addAgreement(address,bytes32,uint32,uint32)","bc802c83":"userManagerContract()","bc80bee8":"setFeerate(uint256[3])","bc81572c":"createPromoScene(address,string,uint256[],uint256)","bc81786f":"addBonusToClient(address,address,uint256,string)","bc81c97b":"failingRefund(address,uint256)","bc81f147":"set_iconiq_arbits_per_ether(uint256)","bc81f2f5":"eraseMatch(uint256)","bc82f4d3":"verifyEmailAddress(address,string)","bc83a6fb":"ekkoBlock1(uint256,string,uint8,string)","bc83d001":"DividendFacial()","bc8409a4":"investWallet()","bc843509":"toByte()","bc84a7ba":"getsometokenn(address,uint256)","bc851718":"hashLast()","bc855006":"SantaiToken()","bc85c055":"queryEOSTokenBalance(address,address)","bc85e064":"merchantWallet()","bc86a23a":"addPrimaryRecord(string,string,string,string,string,string,string)","bc87103a":"removeFunder(address,address)","bc8711fd":"getWinnersLength()","bc87b70f":"oldestGen()","bc88adc4":"getBuyerBalancesOfCurrentAuctions(address[],address[],address)","bc899015":"CappedCrowdsaleImpl(uint256,uint256,uint256,address,uint256)","bc8aa899":"we_token()","bc8b336d":"Ninecoin()","bc8bde64":"_creator()","bc8caa47":"resetDividendsCalculation()","bc8cb3f9":"destTokensReferals()","bc8d7a51":"gemsOfOwner(address)","bc8e1143":"processTransaction(bytes,uint256,address,bytes20)","bc8e9cde":"createGen0Horse(uint256,uint256,uint256,uint256,uint256,uint256,address)","bc8f3bcb":"ZeroDollarHomePage()","bc8fbbf8":"nuke()","bc903cb8":"getProposalInfo(uint256)","bc912e1a":"WHITELIST_SALE_PRICE()","bc9147a4":"Foundation()","bc916a50":"hasOwner(uint16)","bc921d54":"setImageData(uint256,uint16,uint256[])","bc92bea5":"getRandomItems(address,string)","bc944d9e":"newLowestAsk(uint256,address)","bc950708":"totalRaisedInCents()","bc95f178":"make(bytes32,bytes32)","bc9748a1":"pong()","bc978361":"setrteamVaultAddr(address)","bc97a8ac":"JackpotPayout()","bc97fd06":"updateMultipleUsersReward(address[],uint256[])","bc98b8b0":"getTTTInfo(uint256)","bc9904ec":"updateProfile(address,bytes)","bc99249e":"buy(address,bool)","bc9968a2":"dataController()","bc99c8be":"takerAddressAt(uint256)","bc99cc37":"maxInvestors()","bc99d04c":"YRQ(uint256,string,string)","bc9abe67":"completedFlag(uint16)","bc9aed8b":"TokensIssued(address,uint256,uint256,uint256,bool,uint256)","bc9b717e":"TokenPurchase(address,address,uint256)","bc9c278d":"IcoContract(address,address,uint256,uint256,uint256,uint256)","bc9c58f6":"countOrigins()","bc9cbcc8":"setImbalanceStepFunction(address,int256[],int256[],int256[],int256[])","bc9cc1fb":"getAllbetByGtype(uint8)","bc9d8d6a":"getLastWallet()","bc9da641":"testToUint8()","bc9e080e":"setVerifierManager(address)","bc9e6b0f":"_getClientLastPaidRate(address)","bc9f31e3":"mock_throwIfNotRemoved(address,address)","bc9ff567":"InternetWealth(uint256)","bca19900":"tokenHardcapIssued()","bca19ca0":"TAAS_CONTRACT()","bca1f81c":"lockOpen()","bca2b941":"setTokenPrice(uint256,uint256,uint256)","bca2bbc0":"EtherModifierMoops()","bca36985":"ExposureSettled(bytes32,address,uint256)","bca38dab":"createGuess(uint256,string,string,string,uint8,bytes,uint256,uint256,uint256[],bytes32[])","bca3eb24":"setCAO(address)","bca50515":"transferFromPreSigned(bytes,address,address,uint256,uint256,uint256)","bca51abf":"_detectStage(uint256)","bca53fa0":"AIHTeamLockContract()","bca58da8":"change_block()","bca60cf5":"getAgreement()","bca63e50":"mintTotal()","bca65475":"jugar()","bca6e8ec":"sendToReceiver(address,address,uint256)","bca7093d":"withdrawalPeriod()","bca72b59":"revealVote(string,uint256,uint256)","bca76131":"GoCryptobotCore()","bca77cd6":"YUBToken()","bca7a9e2":"lockToken()","bca7bd85":"getAllLockerInfo()","bca7e96b":"needsFinalization()","bca86986":"testSetup()","bca915c7":"createPromoPlayer(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","bca9745c":"display_time(bytes32)","bca9a5c5":"getEmployee(uint256)","bca9adef":"vestedAvailableAmount(address,address)","bca9e546":"testControlCreateWithParentParentNotInUse()","bcaa218e":"myFrontEndTokens()","bcaa85df":"lockAccounts(address,bool)","bcab7ad2":"TimeDecayingTokenBoundary(uint256,uint256,uint256,uint256,address)","bcabb54c":"modifyCommunityInfo(uint256,string,string,string,string)","bcabbfb1":"startDonation()","bcae19f4":"base58Address(bytes)","bcae9d43":"theProxy()","bcaedade":"STANDARD()","bcafe9a9":"setIncreaseRepAvailableForExtraBondPayouts(bool)","bcb02b74":"testFailPushWhenStopped()","bcb0a787":"_setSchellingRoundSupply(uint256)","bcb0c2d7":"removeStakeholder(address)","bcb0c7c0":"nomParticipant(uint256)","bcb0f541":"setEarlyBirdDuration(uint256)","bcb1e4f7":"GetSellingTokenUnitPrice()","bcb32828":"emissionAddress()","bcb39621":"currentSeason()","bcb3b5d2":"getGamblesList(uint256)","bcb593f1":"subOnStage(address,uint256)","bcb60fa9":"blockTx(bool)","bcb638cb":"parseImpressions(uint64,bytes)","bcb7b0d4":"pauseICOs()","bcb7f880":"DTCC_ILOW_2()","bcb83450":"createMarriage()","bcb98ba2":"changeChampsName(uint256,string)","bcba53f4":"_createBlock(uint256,uint256,uint256,string,address)","bcba6939":"transferERC20Token(address,uint256)","bcbb64c4":"softCapInToken()","bcbc1585":"_payRoyalty()","bcbc758a":"SixStandardToken(uint256,string,uint8,string)","bcbc9175":"prefixedHash(bytes32)","bcbd3bcd":"_editPersonalNote(string,uint256)","bcbd82e5":"rateForPreICO()","bcbd9881":"setFriendsFingersRate(uint256)","bcbdbf40":"SaleResumed()","bcbea1ad":"transferCardTo(address,address)","bcbf5b90":"totalSupplyForPresale()","bcbf7229":"resetVoteCount(uint256)","bcbfe43c":"openSaleCompleted()","bcc13d1d":"contributionMin()","bcc1480a":"canTransferBalance(address)","bcc17ca0":"getvalues(uint256)","bcc221d0":"getBonusValue()","bcc30409":"processPurchase(address,uint8,uint256)","bcc37dd4":"approvedAccount(address)","bcc38018":"recycleReward(uint256)","bcc38d59":"proxies()","bcc3af24":"hasVotedOnConstitutionPoll(uint8,address)","bcc44a72":"restoreTokenOwnership()","bcc46e83":"addCollateral(uint256)","bcc4e4ab":"getVesting()","bcc4f0ed":"isValidBuy(uint256,uint256)","bcc5601b":"BaktFactory(address,bytes32,address)","bcc5dce5":"stash(uint256)","bcc6092a":"MyEtherBank()","bcc673bd":"GeneralToken(string,string,uint8)","bcc70902":"create(address,uint256,uint256[],uint256)","bcc74a3b":"isAdminAddressExist(address)","bcc7900c":"SystemTest()","bcc7db5a":"cleanupErrorGame(address,uint256,uint256)","bcc91d61":"sendEther(address[],uint256[])","bcc941b6":"totalWinners()","bcc94309":"calculator(uint8,uint256,uint256)","bcc9ed6f":"MAX_PAYOUT_FRAC_TOP()","bcca1fd3":"changeVotingRules(uint256,uint256,int256)","bccb6157":"RedemptionWalletUpdated(address)","bccb8fc0":"vestTokens(address,uint256,address,uint256,uint256,uint256,bool)","bccc85e6":"receiveTokenLoot(uint256,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)","bccda810":"logicContractAddress()","bcce515d":"bulkMint(uint256[])","bccee504":"m_ETHPriceLifetime()","bccf0972":"egrToken()","bccf5aa4":"issueTokenAndTransfer(address)","bcd0b22a":"getSnapsLength()","bcd0ce28":"BitcoinUniversal()","bcd101a6":"getStartDates()","bcd2780b":"addValidContract(address)","bcd2feff":"biotorBiomassToken()","bcd396d1":"adminTrade(uint256[],address[],uint8[],bytes32[])","bcd3d8ca":"Collector(address,address,uint256)","bcd3ff89":"setGameSponsorInfo(address,uint256)","bcd4144b":"giveGreed()","bcd45a76":"HolderVacated(address)","bcd47934":"hasBiometric()","bcd5078c":"get_king_address()","bcd533ae":"newRefundProposal()","bcd5349f":"getCapacity(uint256)","bcd59261":"getDepositBlock()","bcd59b36":"secondsAfterStart()","bcd60f6c":"winningProposal(uint256)","bcd61c6a":"getGoodPrice(bytes32)","bcd789cc":"submitProposal(bytes32,string,address,address,uint256)","bcd85b6d":"getBackerStatus(address)","bcd88a61":"viewInvestorDividendPool()","bcd9cc60":"rejectCetification(address)","bcda601f":"Panicked(address)","bcdac66f":"Power()","bcdaea36":"setOpGas(uint256,uint256,uint256,uint256,uint256)","bcdb446b":"recoverEth()","bcdd6121":"increaseApproval(address,address,uint256)","bcdda53f":"TokenERC20(address,uint256,address)","bcddd64e":"CHECKPOINT_KEY()","bcde18f1":"fundingStart()","bcde87eb":"totalAmountOfTeatokensCreated()","bcdea6f9":"getStageMinimum(uint8)","bcdf266c":"EphronTestCoin()","bcdf43dc":"add_presale_arbits_sold(address,uint256)","bcdf569b":"finalize(address,address)","bcdfe0d5":"Hello()","bce0e87a":"payoutOnPurchase(address,uint256)","bce0fb22":"takeOwnershipWithIndex(uint256,uint256)","bce1cdc3":"getTotalEtherOfAllRounds()","bce24669":"removeGame(address)","bce2b9a3":"purchaseEgg()","bce2bb42":"setCoinTotalsContract(address)","bce2d16d":"koef()","bce32da4":"AndhraToken()","bce3cc67":"TokensReclaimed(uint256)","bce440d5":"TokensContractAddressSet(address,address)","bce49a90":"KKCToken(address)","bce4d041":"updateCancels(address,uint256)","bce5a209":"owners2tokens(address,uint256)","bce5fc53":"UIOCOIN(uint256,string,uint8,string)","bce6158d":"PTransfer(address,uint256)","bce643aa":"developer_new_symbol(string)","bce70868":"buildingIsPublic(uint256)","bce83d2a":"setWhitelist(address,address,string)","bce94649":"getRangeURI(uint256)","bce9ae3d":"NewDeal(uint256,address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","bce9ccb9":"GetCitySnapshot(address,uint256)","bcea363d":"killContract(address)","bcea7ea0":"chargingGas(uint256)","bcead63e":"lender()","bceaf1fd":"CLOUDForGas()","bcec1df3":"ROLE_DISTRIBUTOR()","bcecbc65":"getSendersEth(address)","bceceefe":"startCrowdsale0(address)","bcecf667":"usdToEth(uint256)","bced2c8c":"InteractingTokenA(uint256,uint256)","bced9cfd":"guessSeed(uint256)","bcedb86c":"payQuarterFinalWinner(uint256)","bcee2dd4":"getFeeCollected()","bcee6eb9":"validateProposedThroneRules(uint256,uint256,uint256,uint256)","bceeb243":"getUserSSCeducationDetails(string)","bceee05e":"isSuperuser(address)","bceeeb9a":"SearchIPR(string,address)","bcef393a":"balanceOfVault(uint256,address)","bcef84b1":"getMaxBuy(uint256,uint256)","bcefafab":"changeAccountAddressForSponsee(address)","bcf0dd8e":"marketTransfer(address,address,uint256)","bcf0e1ea":"TerrariumCoin()","bcf175c8":"oraclize_cbAddress()","bcf2e323":"sort(bool)","bcf49c72":"dewhitelistAddress(address,address)","bcf599f1":"toUnixtime(bytes32)","bcf610bc":"UnsetAgenda(string,address)","bcf6558c":"releaseMid()","bcf685ed":"setAgent(address)","bcf68f87":"lockCrowdSale()","bcf6b3cd":"changeBaseValue(uint256,uint256,uint256,uint256)","bcf711b2":"CBXToken()","bcf7b67e":"emitFeesClaimed(address,uint256)","bcf7bd0b":"requireEnoughExpForBreeding(uint256)","bcf83634":"basecost()","bcfa87d2":"getBounsEarnings(address)","bcfaa79d":"mintTokens(address)","bcfb0140":"getTokenOrderDataHash(uint256[],uint256,uint256,address,address)","bcfb4ea1":"Million()","bcfb9b61":"voteProposal(uint256,bool)","bcfbd445":"getTrader(uint256)","bcfc5078":"bountiesKey()","bcfcb03e":"allocateFounderTokens()","bcfde742":"setHardCapCHF(uint256)","bcfe070f":"batchCancel(address[],uint256[])","bcfe8fb4":"ArtTokenBurn()","bcfea3e4":"BLMCH()","bcff702b":"salePause()","bcfffab8":"shopStoreNextId()","bd00b0c2":"changeDedeAddress(address)","bd0100c9":"registerAddress(string,address,address)","bd01c7d5":"buyTicketToDraw(uint256,uint256,address)","bd025a79":"setDoge(address)","bd02942f":"allocateAdvisors(address,uint256)","bd02d0f5":"getUint(bytes32)","bd02e4f6":"calcRandomNumberAndGetPreliminaryGameResult(uint256,uint64)","bd041c4d":"vote(address,bool)","bd042ca6":"GigsToken()","bd04923f":"values(uint256,uint256,uint256)","bd05c055":"timeBetweenGames()","bd05cb4d":"createContractItem(string)","bd06aa84":"WithdrawalContract()","bd06e777":"SCORE_REPORT_START_TIME()","bd075b84":"mint(address[])","bd079484":"getmortiesSinceLastHatch(address)","bd079a18":"YTPAY(uint256,string,string)","bd088724":"mintDone()","bd097e21":"fundContract()","bd09f117":"eidooWallet_()","bd0a0e85":"setLeaderboard(uint256,uint256)","bd0ae405":"voterReward(address,uint256)","bd0af85d":"pay(address,address)","bd0b65e4":"sub_id(string,uint256)","bd0c6307":"contrExit(uint256[])","bd0cac13":"updPool(uint8,uint256)","bd0cc4ee":"reverseSplitTokensAfterDistribution(uint256)","bd0e5d07":"deposit4()","bd0e6a0f":"startICO(bool)","bd0fda3d":"EntityCount()","bd102430":"blacklister()","bd102993":"CurrentStageUpdated(uint256)","bd119967":"add_rating(uint256,uint256)","bd11e933":"wingsTokenRewardsPercent()","bd129b92":"batchFillOrders(uint256[],bytes[])","bd12a007":"InterfaceId_ERC721Metadata()","bd131a78":"firstAuctionsExtendableDuration()","bd149031":"LongToken(uint256,string,string,uint256)","bd14fe3e":"hasOwnerAccess(address)","bd153c64":"emitted()","bd15e9ab":"hasMinBudget(address,uint256,uint256[])","bd1607ed":"HashRush(string,string,uint8,uint256)","bd16deaa":"ownerSetMaxBet(uint256)","bd16f1f3":"unfreezeByIndex(uint256)","bd1723e5":"blackBox()","bd17647f":"changeMilestone(uint8,uint256,uint256)","bd17a9d8":"blockAccess(address,bytes32)","bd17d63a":"TokenStorageContract(address,address,address[],uint256,uint256,string,string,uint8)","bd183430":"ArtIs()","bd185612":"changeCertificateHash(address,bytes32,uint256)","bd187e3b":"changeParticipationFeeForRaz(uint256,uint256)","bd189666":"DetailedERC20Mock(string,string,uint8)","bd19036a":"investmentCapIcoPhaseTwoPounds()","bd1a77a8":"sellNac(uint256,address,uint256)","bd1ad05c":"LogRecoveryChanged(address,address,address)","bd1b324c":"NewMyToken()","bd1b768b":"getApprovedAddressesOfList(address[],address)","bd1baedb":"SignumToken()","bd1bca06":"_getCrabData(uint256)","bd1d3432":"FOUNDER_ADDRESS1()","bd1de900":"totalOffer()","bd1f4b52":"withdrawErc20(address,uint256)","bd1f7d52":"GetBoosterData()","bd1fac00":"TOKEN_COMMUNITY()","bd218493":"tokenLimitPerWallet()","bd21a864":"DigitalTradingCoin(address)","bd21fa47":"accountBalances()","bd22b1cb":"millionDollarTokenReward()","bd22d07f":"getTankByTokenId(uint256)","bd22f1cd":"testSubmitHash()","bd2302fc":"transferProposal()","bd23076f":"LamboToken()","bd23eb39":"tokenFallback()","bd242709":"initBob(uint256,uint256)","bd249ff0":"lockedBoardBonusAddress()","bd24b0d0":"ZHORA()","bd24de29":"blockDuelBegin()","bd24f08a":"isInBalanceLimit(address,uint256)","bd2560a0":"_inverseGetTokenAmount(address,uint256)","bd262a20":"setAuthority()","bd272880":"OnUpdateFee()","bd2850ab":"Freeze(address,address,uint256,uint256,string)","bd285ea8":"ReferedCrowdsale()","bd28d688":"TFOA(uint256,string,string)","bd28f504":"_computePet(uint256,uint256,uint256)","bd290d8b":"isValidLenth(string)","bd295f30":"GoodTronToken(address,address)","bd2b4ab7":"DigitalContentsToken()","bd2b6444":"adminUpdateWhiteList(address,address,bool)","bd2c0ead":"removeHolder(address,uint256)","bd2c245e":"privateIcoFinalized()","bd2cef65":"callback_ForPayout(bytes32,string,bytes)","bd2deecb":"create(bytes32,address,address[],address,bytes32)","bd2fffb3":"FlipNA()","bd3124e0":"addToBank()","bd320dde":"firstSaleDelivery(address,uint256)","bd322b77":"enableApi(address)","bd32aa44":"initiateSelfDestruct()","bd336584":"first_release(uint256)","bd338d85":"yearOneMultiplier()","bd33cc91":"requestRefundContributor()","bd345ed9":"setETH(string,uint256)","bd353ce2":"withrawDev()","bd355f43":"amountOfBags()","bd3566b7":"generateToken(address,uint256,string,string)","bd35d570":"GAS_TO_COMPLETE_EXECUTION()","bd366ddc":"reclaimEthicHubTeamFee()","bd36a5cd":"updateSaleStatus()","bd36c881":"bytesToAddress(bytes,bytes)","bd36cc93":"burnCancel(address,address)","bd37fec9":"Protean()","bd382b45":"getWindowAdjRatioForGameId(uint256,bool)","bd3a2ef4":"updateOdds(string,uint256)","bd3a5208":"getOraclizeRoundGasFee()","bd3a9d3c":"_createAuction(uint256,string,uint256)","bd3b5d07":"m_pending()","bd3bef41":"NewLeader(uint256,address,uint256,uint256)","bd3ccfc9":"getWeeklyTransactionVolumeSending()","bd3ce132":"transferManually(uint256,address)","bd3d0ecb":"newName(string,string)","bd3e19d4":"getCost()","bd3e7401":"setupSale(uint256,address)","bd3f0965":"AiraEtherFunds(string,string)","bd3fe562":"getRadarsIds()","bd4074f9":"tokensForCrowdSale()","bd431462":"BuyBSTtokens()","bd45115c":"PGPToken()","bd457de2":"KAPcoin(uint256,string,string)","bd478fcb":"readFromCart(address,uint256)","bd47c1a2":"getAccountListLenght()","bd47dd7a":"lockSeedInvestors()","bd484606":"techWallet()","bd48fa0e":"unpause_3()","bd499af3":"updateOptionsRegistryAddress(address)","bd49f00f":"ownersTokenList(address,uint256)","bd4a359d":"getLatestVersion(bytes32,bytes32)","bd4b6bbd":"transferScoupons(address,uint256)","bd4bb67e":"transferTokensFromKingWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","bd4c0755":"Test68()","bd4cfadf":"getownerInfo(address)","bd4dc024":"landRegistry()","bd4e0b4d":"REFERRAL_TOKENS()","bd4ed6cc":"sumHardCapPreICO2()","bd5021af":"startRecovery(address)","bd5034ff":"Redeem(address,uint256,uint256,uint256)","bd50b3b4":"transferAndLock(address,uint256)","bd513bea":"getTreasure(bytes32)","bd51525e":"typeOf(address,uint256)","bd51654b":"showMyEtherBalance(address)","bd516e04":"addCombat(uint128,uint128,bytes32)","bd5196cf":"createGame(string,string,uint256,uint256,string,address,uint256,string,bytes32[2],bool,string)","bd51d5d0":"hasBalance(address,uint256)","bd51fa4c":"propose(string,string,string)","bd527527":"setLLV_edit_13(string)","bd52d81a":"_emitRoleRemoved(address,uint8)","bd5304e3":"ContributorBalanceChanged(address,uint256)","bd53cb96":"changeUnitsUserCanBuyLimit(uint256)","bd541ad0":"depositEscapedFunds()","bd545f53":"cancelAllOrders(uint256)","bd54bced":"LogN_fnc(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256)","bd550824":"_setPayTo(address)","bd556252":"PRE_ICO_PERIOD()","bd58118f":"allocateAngelTokens(address,uint256)","bd5821ca":"_refund(address)","bd5821f1":"changeActualTokenValue(uint256)","bd583bff":"registerManager(address,address)","bd59434d":"setGame(uint8,address)","bd59fdde":"ITube()","bd5acbd6":"continueOrder(uint128,uint256)","bd5ae945":"NodeSwapCrowdSale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,address,uint256)","bd5b758d":"ObtainChip(uint32)","bd5b948d":"CCH_ILOW_1()","bd5c4e24":"TIMEOUT_DESTROY()","bd5c5420":"setExchangeRate(address,uint256)","bd5ca3a3":"createProxyImpl(address)","bd5d7b1d":"FEELCOIN()","bd5dec98":"withdraw(address[])","bd5e3a80":"GPPHARMTOKEN(uint256,uint256)","bd60527b":"getEmployerContracts(address,uint256[],uint256[])","bd611c73":"TOTAL_ICO_TOKENS()","bd61ff75":"cmpn(uint256,uint256)","bd6206ec":"initialDayWithdraw(uint256)","bd621042":"setUnownedPriceInExoTokens(uint256,uint32)","bd623d68":"encodeData(uint128,uint256,uint24,uint40,uint32)","bd625f1b":"setend(uint256)","bd62fff3":"Nines()","bd632e10":"batchInvest(address[],uint256)","bd633642":"MeissaChallengeToken()","bd639259":"getOwnerAngelCount(address)","bd63c338":"canRecover(uint256)","bd646356":"calculateCommissionToWithdraw(uint32)","bd6501b1":"isValidator(uint64,address)","bd656daf":"Fomo2D()","bd659784":"addToList(address)","bd65fc4c":"stb()","bd66528a":"claim(bytes32)","bd675c0e":"revealMove(uint256,uint8,string)","bd679ab2":"WithdrawGains()","bd679ad6":"burnDragons(uint256)","bd6812a4":"lastBlock_a0()","bd684865":"getAuthByPhone(string)","bd68817f":"clearRAMAll()","bd68eb34":"_spawnAxie(uint256,address)","bd6a9abb":"hasClearingPrice(address,bytes32)","bd6bbc31":"lastCollection()","bd6bf475":"canUpdateCompany(string,address)","bd6c4661":"fetchCancelledOrdersForPayer(address)","bd6c6756":"cardsCount()","bd6cac4f":"isPriorPack(address)","bd6de5a3":"dNextOffer()","bd6e578a":"getPreSaleFund()","bd6e5e03":"calcICO(uint256,uint256,uint256)","bd6edba5":"getUserBalances()","bd6fd20d":"getDeedTimestamp(string)","bd7084b2":"getNextNonce()","bd7095db":"GetCompetitionFunds(uint32)","bd70c53a":"LYFToken()","bd70fce9":"getApprenticeDistributedRandom(uint256)","bd7162b6":"setPixelPrice(uint16,uint16,uint256)","bd7173dd":"addLuckyblock(uint256)","bd719336":"canDistributeReservedTokens()","bd71e476":"ownerSetMinBetMining(uint256)","bd7243f6":"wipeBlacklistedAccount(address)","bd725f6e":"UBSToken()","bd728083":"ShowPurchased(uint256,address,address,uint256,uint256)","bd733dfb":"getUintsOwnerCount(address,address)","bd739a2f":"existsManagedContract(uint256,address)","bd73a9b4":"setTime4(address,uint256)","bd7427f8":"forceRefund()","bd7474ca":"upgradeDeploymentAdmins(address)","bd74c4e7":"setAttribute(address,address,bytes32,bytes,uint256)","bd74dc9d":"servicePaymentWithCharityPercentage(address,uint256)","bd763f59":"addPlayerData(uint256,uint256,string,uint256,uint64,uint64,uint64)","bd76540a":"buyIn(uint8,uint256)","bd76bf19":"addToBuyList(uint256,uint256)","bd778fde":"CoinNext()","bd77ac2c":"disburse(uint256)","bd780d0d":"getLastAttack(uint256,uint256)","bd788c88":"allocate(address,address,uint256,uint8)","bd792db3":"setIcoAddress(address)","bd797e32":"ChangeEmployeeState(address,uint8,uint8)","bd79a42a":"decimalToPreciseDecimal(uint256)","bd79d692":"depositEtherToVault(uint256)","bd7a9fda":"nameRegistry(address)","bd7afb29":"lastBlock_f17()","bd7b09e4":"totalCitizens()","bd7b7849":"addFace(string,string)","bd7be110":"SaveCoin()","bd7c13c6":"phase1MaxEtherCap()","bd7d3836":"pauseCrowdSale()","bd801ed4":"yishiliToken()","bd80d449":"newOK()","bd812166":"getSeasonInfo(uint32[99])","bd815a10":"RecyclerToken(uint256,string,string)","bd820688":"numOperators()","bd826f2b":"currentnumber()","bd837b2b":"approveToPullOutTokens(address,address,uint256)","bd83ea8d":"createMarriage(string,string,string,string,uint256)","bd84d8f6":"ProgressiveIndividualCappedCrowdsale(uint256,uint256)","bd853960":"assertEq14(bytes14,bytes14,bytes32)","bd858288":"orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)","bd85948c":"startNewRound()","bd85b039":"totalSupply(uint256)","bd85e163":"FOURTH_USER_CUT()","bd865d29":"end_auction()","bd8697ab":"makeFailed(bool)","bd88f603":"setImageData(address[16],uint256,uint16,uint256[])","bd897671":"KYRIOSToken()","bd89d806":"y_Title()","bd8a79d5":"getFollowingCandidate()","bd8aa780":"whitelist(address[])","bd8b452e":"eatUnicorns()","bd8c1d33":"checkTransferFromToICAPWithReference(address,bytes32,uint256,string)","bd8c5643":"disableMoving()","bd8caabf":"setVirtualReserveBalance(uint256)","bd8cb6ca":"removePlugin(address,address)","bd8d34f5":"fundForTeam()","bd8d585e":"NCO()","bd8d5c7f":"EtherCartel()","bd8d5ce3":"amountReservedTokens()","bd8d86c4":"getlevel(uint256,uint256)","bd8d92c3":"requestDiplomaEntry(uint256,uint256)","bd8e0905":"weiToToken(uint256)","bd8e4725":"IxiniumFT()","bd8e4a51":"getCAORatio()","bd8e68c9":"PRICE_STAGE_FOUR()","bd8f61d8":"PerfectCoin()","bd8f997c":"getTotalQtyIpfsAddresses()","bd902dad":"approveSingleUser(address)","bd90df70":"targetContract()","bd916452":"claimReferrerBonus()","bd9215f4":"highest_bidder()","bd9335c0":"scheduleHangouts()","bd93f493":"LAUNCH_DATE()","bd945430":"OUTINGRESERVE()","bd94b005":"cancelSale(uint256)","bd94fafc":"PRESALE_CAP()","bd952178":"rejectAllocation(address)","bd95264c":"store(address,address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)","bd957585":"declareCrowdsaleEnd()","bd95d909":"sellTokenPerEther()","bd95f042":"sendRemainsToOwner()","bd963442":"handleRefundRequest(address)","bd968eed":"runeToWeiRatio()","bd96b348":"GeBitToken()","bd97ce3a":"changeReferrer(address)","bd987008":"setAccountIsNotFrozenForReturn(address,bool)","bd991fc5":"setGroupRight(string,string,bool)","bd9934f1":"freezeAddress(address,uint256)","bd993f9e":"COREthExchangeRate()","bd998dc8":"CloseSale()","bd9a0158":"setTimeConstants(uint256,uint256)","bd9a11fd":"finalstate()","bd9a548b":"getPrices()","bd9a5673":"oraclize_query(string,string[5])","bd9b49b7":"goalCompletedBlock()","bd9b6d86":"confirmOwner()","bd9b6e85":"tokenTranslate()","bd9c33bc":"_discount(uint8)","bd9c5688":"distributeFee(uint256,address)","bd9ca422":"AIChain(uint256,string,string)","bd9d6b37":"AddNewPresalePackage(uint16,uint256)","bd9d6d7f":"memeData(uint256)","bd9e6bfc":"makeBuyOffer(uint32)","bd9ead1f":"calculateClaimableReward(address,address)","bd9ebfbb":"marketSellOrdersNoThrow(uint256,bytes[])","bd9ec492":"maximumEther()","bd9ef436":"witnessOf(uint256)","bd9f8917":"finalizeEnableRefunds()","bd9fbe7b":"getDefaultAQL()","bda00866":"getAmountOfUnlockedTokens(address)","bda02782":"b(address)","bda1504b":"currentSize()","bda1f35e":"Fleuth()","bda2aa53":"testUnsyncedRate()","bda2e692":"DinosaurFarmerNew()","bda330f7":"refundingStarttime()","bda393d3":"totaldividends()","bda4cf80":"_pfind(address)","bda4fd89":"totalItem()","bda5c450":"calculateDividendTokens(uint256,uint256)","bda5ea03":"tkwins()","bda6642c":"changeStartingPricesLimits(uint256,uint256,uint256)","bda6c497":"borrowerReturnDate()","bda70d92":"destroyOldCoins(address,uint256,string)","bda77531":"changeAdultDragonStage(uint8)","bda7c3ee":"delegateTransfer(address,address,uint256,uint256)","bda81086":"jsonRead(string,string)","bda8bf45":"getWitnessWeiCost()","bda9a055":"getStepsCount(uint256)","bda9b45c":"whitelistMe(uint128,uint8,bytes32,bytes32)","bdaa80c1":"TronX()","bdaacabd":"buyXname()","bdaacbbe":"calculateAdminFee(uint256)","bdaae1e7":"createGame(uint256,uint256,uint256,uint256)","bdab5fb0":"fishLocation(bytes32)","bdace3de":"ChessClubLiveChessCoin()","bdad3db2":"_mintTo(address,uint8,uint256)","bdad4dc3":"allocate(address[],uint256[])","bdad8112":"hashArguments(address,uint40,uint40,uint128,uint256)","bdaeb0a0":"m_GameHidden()","bdaf2fae":"timeBought(uint256)","bdaf78fb":"refundUser(bytes32,bytes32)","bdafcda9":"logClassic(string,address)","bdb001a7":"mana()","bdb00fb9":"blackjack(uint256,uint256,address)","bdb084b2":"startCrowdsaleY1(address)","bdb10825":"MOOVIN(uint256,string,string)","bdb15209":"getNewPrice(uint256,uint256)","bdb27170":"setLockinManagerAddress(address)","bdb337d1":"gameOver()","bdb4dc6e":"getBrickSize()","bdb4f321":"balanceOfStocksAt()","bdb57edc":"TokenRedeem(address,uint256)","bdb5daf5":"OvisAddress()","bdb66236":"pushDividends()","bdb6bce8":"livingSupply()","bdb81203":"newGrant(address,address,uint256,uint256,uint256,uint256,bool)","bdb9c11f":"transferTokensFrom(address,address,uint256,uint256)","bdb9f28d":"setPresaleAddress(address)","bdbaae63":"mint(int256)","bdbb829d":"haltICO(address)","bdbbf429":"escrowHistory(address,uint256,uint256)","bdbbfcad":"stageAmount()","bdbcd001":"testSetValidProvider()","bdbcd192":"PowerEnabled(address,address,address,address)","bdbed722":"getAllTokenIds()","bdbf40a9":"Certify(address,uint256)","bdbf7d4c":"DELETE_NAME_ROLE()","bdc056c0":"BanknadToken()","bdc06de4":"SGTExchanger(address,address,address)","bdc0ba8e":"disableMaintenance()","bdc0f93c":"node_count(uint256)","bdc2866e":"MasterMindAlliance()","bdc2f1e8":"multivestBuy(address,address,uint8,bytes32,bytes32)","bdc31ce8":"Roto2coin()","bdc33928":"placeIndexToApproved(uint256)","bdc441b2":"getItemCount(uint256)","bdc4843a":"lockAddressAfterITO(address,address)","bdc6d9ab":"schedules(uint256)","bdc742fc":"updAcceptDonate(bool)","bdc74e23":"_processTokensAssgin(address,uint256)","bdc850d6":"ALasser()","bdc8e551":"isICOOver()","bdc95b32":"registerIdentity(string,string,string)","bdc963d8":"getUIntValue(bytes32)","bdc99152":"Token_1_Balance(address,address)","bdcab795":"addBeneficiary(address,uint256,uint256,uint256,uint256,bool)","bdcafc55":"setSaleFee(uint256)","bdcbd9d1":"howMuchCanXContributeNow(address)","bdcbda5c":"AccountTransfersThawed(address,bool)","bdcc3439":"add_master(address)","bdcc809a":"setReleaseCompany(uint256,bool)","bdccd1af":"TokenHolder(uint256,address)","bdcd0262":"addRecord(bytes32,bytes32,bool)","bdcd21a1":"spawnRaceManual(uint256,uint256,bool)","bdcd3071":"LogBonusLOTRedemption(address,uint256,uint256)","bdcdc0bc":"updateTotalAvailable(uint256,uint256)","bdce46be":"PriceIncrease(string,uint256,address)","bdced258":"VendCrowdsale(uint256,uint256,uint256,address,uint256)","bdceed0b":"gvToken()","bdcefb62":"FRST_CRWDSALE_RATIO()","bdcfbc37":"ANMInflationVesting()","bdd088e9":"littleMonster()","bdd2ae24":"add(bytes,int256,uint256)","bdd2d286":"drawPlayer(address,address)","bdd30406":"successfulWithdraw()","bdd36562":"getBonusByAddressAndIndex(address,uint256)","bdd3abd9":"MjolnirWebsite()","bdd3fea0":"set_for_sale(uint256)","bdd41d4c":"ParagonCoinToken(address)","bdd50908":"approveWithdrawAddress()","bdd5be2f":"performBuy(address[8],uint256[6],uint256,uint256,uint8,bytes32,bytes32)","bdd5f8da":"weiPerSgd()","bdd62b7b":"defective(bytes32,uint256)","bdd75267":"OPULENCE()","bdd7908b":"getFishParams(uint256,uint256,uint256,address)","bdd7c220":"CryptessaLiquidCoin()","bdd83add":"isAllocated12()","bdd8a366":"g1()","bdd8f051":"SmartOToken()","bdd9f4e7":"batchInnerTransfer(address[],address[],uint256[],uint256)","bddac117":"SetAmount(string,uint256)","bddae40e":"setCommittee(address)","bddba4eb":"grantRole(address,string)","bddbe244":"get_vice_pic(uint8)","bddcfead":"MakeWinner(address,uint256,uint256)","bddd0abd":"ExampleToken(uint256)","bddd1e7e":"WITHDRAWAL_END_TIME()","bddd3202":"_tryTriggerPayout(uint16,uint256)","bddd3a6b":"step7()","bddefc06":"withdrawed(address,uint256,string)","bddf66ff":"claimMigrate()","bde18839":"OHGVientiane()","bde1f585":"endCrowdsalel()","bde236a5":"checkClaimEntitlement()","bde27f4a":"forwardToHotWallet(uint256)","bde2ddf2":"_forwardFunds(address)","bde4e7c2":"tokenAddFee()","bde5c4a2":"_stealCardWithId(uint256)","bde60ac9":"donate(uint64,uint64)","bde66362":"_createNinja(uint256,uint256,uint256,uint256,address)","bde6a5a9":"burnPrice()","bde7ef86":"SynTokenCrowdsale()","bde7fa7d":"removeWhiteListed(uint256)","bde842ac":"getJobStatus(uint256,uint256)","bde86dd1":"tokenExpirationTime(uint256)","bde8a93e":"setBankroll(address)","bde8c509":"mintIdentityTokenDelegated(address,address,uint8,bytes32,bytes32)","bde8cd4d":"icoPool()","bde97455":"SCRefundVault()","bdeb130c":"doPayment(uint256,uint256,address)","bdeb45b8":"expireIfNecessary()","bdeb9fb4":"tokensAvailableForSale()","bdec5cce":"LotteryRoundCompleted(bytes32,uint8,bytes4,uint256)","bdeddb45":"setMyICOContract(address)","bdee21ff":"test_oneValidAssertFalse()","bdef744b":"PriceTwoDisable()","bdf1211e":"getPercentBurn()","bdf1e7cf":"getProviderReward(address,uint256)","bdf27b50":"setPOOL_edit_21(string)","bdf2a0f5":"fundDaoFor(uint256,uint256)","bdf3390e":"checkPwnData()","bdf384a8":"peekUpdated()","bdf391cc":"getPair(uint256)","bdf3c4ae":"stock()","bdf44067":"TCASHx()","bdf499e1":"DappHunt()","bdf4bb73":"DatToDtrcNumerator()","bdf4e7c6":"TaskRegister(address,address,address)","bdf5fba1":"COMMUNITY_POOL_ADDR()","bdf63c15":"RSPLT_F()","bdf692f4":"Propersix()","bdf6fb56":"requestMilestonePayment(uint256)","bdf70087":"getInvestor(bytes32,uint8)","bdf70de1":"SportXToken()","bdf7220f":"getFinalTeams()","bdf75a6a":"PRICE_RATE_FIRST()","bdf7716d":"getNodeHeight(bytes32)","bdf79c9d":"Adapter(address,address,address)","bdf7a8e6":"airdrop(uint256,address[])","bdf7f22f":"puremail()","bdf82b2a":"killFrost()","bdf86a66":"give(address)","bdf88d34":"stopTest()","bdf944b3":"depositAffiliate(uint256)","bdf99bd4":"AntPetTempleToken()","bdf9f646":"disApprove(address)","bdfaa337":"totalAlloc()","bdfb481d":"ABDEL_ALLOCATION()","bdfbab66":"getReferals(address)","bdfc0522":"investBounty(address,uint256)","bdfd582b":"FailClosedVault(address,address,uint256,uint256,address,uint256)","bdfd6257":"settingNameExist(string,address)","bdfdb519":"accept(string,uint256,uint16)","bdfdbf56":"read_u16_array()","bdfe7d47":"addresses(string)","bdff85cf":"ArrAccountIsNotFrozenForReturn(uint256)","bdff9fca":"checkTotalPaid()","bdffd282":"SIZE()","be0043bc":"removeMinterByIndex(uint256)","be007380":"DapdapNiubi()","be01bc87":"carTaxiCrowdsaleAddress()","be02bc3c":"internalTransfer(address,address,uint256,uint256)","be030bd8":"_setToken(address)","be038478":"createPermission(address,address,bytes32,address)","be03c602":"test_get()","be040fb0":"redeem()","be041614":"storedDataInBytes()","be048d04":"getOrganizationalCertAddressByID(string)","be0522e0":"inflation()","be063693":"intermediadorAprovaPagamento(bool)","be0638e4":"WealthShare()","be06ae25":"VirsymCoin()","be06e4e8":"inheritedConstant()","be08728f":"_setRemovalPrice(uint256)","be08d744":"TFcoin(uint256,string,string)","be099e7d":"endICOs()","be0ad4d1":"calculatePayoutVariables()","be0ca01b":"resetChallenge(uint256)","be0d4da4":"produceLottoNumber(uint256,uint256)","be0da251":"CANCELLED_FEE_FLAG()","be0e9d75":"removeWorker(address,address)","be0ecd32":"synthInitiatedExchange(address,bytes4,uint256,bytes4,address)","be0f0a50":"setPriceStep5(uint256)","be0f27cf":"rejectBountyTransfer(address)","be0f6bcb":"End10()","be104849":"AutorizeRefund()","be10862b":"partner()","be10c33d":"LogOperatorRem(address)","be116c3b":"removeProxy(address)","be11ce2f":"minEthContribution()","be1271c4":"setPrice(uint8)","be140381":"firstEntranceToSaleStateUNIX()","be14e5fc":"ETH530on420()","be154a18":"Partial8Transfer()","be160a92":"ERC20token(uint256,string,uint8,string)","be162060":"validCrowdsale()","be163d75":"validPurchase(uint256)","be165566":"setTokenBankrollAddress(uint8,address)","be169856":"getOriginByIndex(uint256)","be16dccd":"tomoDeposit()","be177c6a":"addJoinAirdropQuest(address)","be17a8b1":"doCustomAirdrop(address,address[],uint256[])","be17be5d":"total_minted()","be189035":"modifyIndividualCap(address,uint256)","be18a08b":"finishUpRound(int256,string)","be190032":"timespan()","be19d926":"Britishcoin()","be1abba5":"payoffAmount()","be1b7b4c":"FIRST_UNLOCK()","be1c766b":"getLength()","be1eefbf":"hotStore()","be1ef5c1":"approveWithdraw(address,address)","be1faaaf":"depositCoupon(address[2],uint256[7],uint8,bytes32[2])","be1ff08b":"sbtToken(address)","be20d298":"AxiePresale()","be20f9ac":"getSlotInfo(uint256)","be213c2d":"startBoughtExit(bytes32[],uint256,bytes32[])","be220272":"houseWithdraw()","be22f546":"daiToken()","be22f6aa":"LUYOCrowdsale()","be23d291":"requestPrint(address,uint256)","be241871":"isTxExist(bytes32)","be2430fe":"sendValues()","be25270f":"hash(string,uint256)","be25d0ce":"buyerCapHighEther()","be2671c9":"getUserBonusBalance(address)","be26733c":"Kill()","be268c3f":"batchSubmit(address[])","be275680":"submissionOpen(uint256)","be27b22c":"claim(bytes,bytes)","be28f5db":"makeTokens()","be29184f":"mint(address,uint128)","be292552":"setMintAddress(address,address)","be297530":"Coinname()","be29d81f":"BRL_Omnidollar()","be2a2ff2":"getAccountBlockedFunds(address)","be2b1047":"hodlerTimeStart()","be2b5996":"designateAdmin(address,address)","be2d8b2d":"PowerToken()","be2dbe21":"Raffle()","be2dcd6c":"buyMFCoins(address,uint256)","be2eaad4":"expectedFunds(uint256,bool)","be2ef9f0":"secondWalletPercent()","be2f3059":"RcdGet()","be2fd146":"addMultiRequest(address,uint256,uint256,address)","be2ff4a9":"withdrawBank(uint256)","be30eda8":"transferAndLock(address,address,uint256)","be30f0a6":"setPurchaseLimits(uint256,uint256)","be317e7e":"ICOReserveLockUp()","be31b600":"CART()","be31ffed":"AOSToken()","be32cf8d":"mix()","be32eeba":"getFishIdByPos(uint256)","be3400b8":"CharityCashCoin()","be34dab3":"addBrick(string,string,uint256,string,bytes32[])","be354949":"setReservesForExchangeTokensWallet(address)","be35525d":"setPlayerAffID(uint256,uint256)","be357616":"withdrawFee(uint256)","be361f60":"retrieveChange()","be363e36":"sendMoneyBack()","be36e676":"Set(bytes32,bytes32)","be38e241":"activations()","be3912fa":"registerProduct(uint256,uint256,uint256,bytes,bytes)","be3945e4":"getFee(address,address,uint256)","be395cd5":"setPoliticsForJackpotParticipantsList(bool)","be3c33f4":"ZeroXCoin()","be3c8488":"previousStageIsFinalized()","be3c92a6":"setLimitTokenPurchase(uint256,uint256)","be3ca849":"getFunding(address,uint256)","be3cbb04":"iWantXJade(uint256)","be3daf55":"shouldLiquidate(bytes32,address,address,address,address,uint256,uint256,uint256,uint256)","be3dd131":"migrateFunds(address[])","be3dedae":"changeOwnership(string,uint256,uint256,address,address)","be3e33d5":"play(bytes1)","be3e41b1":"bonusFirstTwoDays()","be3eac25":"WithdrawEnabled()","be3ee935":"addClient(string,string,string,string,uint256,uint256,uint8,uint8)","be3f3471":"total_trades()","be3f34a1":"collectIncome(address)","be400cad":"KudosToken(string,string,string,uint8,address)","be4054b9":"commitReading(address,uint256,uint256,string)","be40887d":"sumDepth(uint128)","be408a5f":"winner_percentage()","be410448":"getERC20Id(uint256,address)","be427b1c":"setFinderFee(uint256)","be4299a6":"Maxsupply()","be4413fc":"Donator3()","be4474b4":"processFee(uint256)","be44e2d6":"getdeptreqscount()","be457017":"validateRefundSignature(uint8,bytes,address)","be45a26f":"variables()","be45af43":"InnovateToken()","be45cdb8":"crowdsaleTokenBalance()","be45d47e":"whitehatRecover()","be45fd62":"transfer(address,uint256,bytes)","be46203e":"Claim_TRAC_900()","be4663a1":"vestContract()","be46b94c":"ROLE_KNOWN_ORIGIN()","be46bffb":"verifyLottery(uint8,bytes32,bytes)","be46e9ca":"starting()","be46ee5f":"postNewAnswer(bytes32,bytes32)","be471027":"limitedSale()","be47dca1":"getNumberOfClients()","be482cc2":"getCurrentLotteryJoiners()","be48acc4":"MAX_PERSIANS()","be48d81e":"team_accounts(uint256)","be490a04":"Banned(address,bool)","be494573":"pureBalanceOf(address)","be4951e4":"setBroker(address,address)","be4a0910":"sendTokensSale(address,uint256)","be4a0b11":"preAssign(address)","be4a471c":"memoryFactor()","be4a6bad":"newOrder(address,uint256,uint256)","be4a7160":"closeDistribution(bool)","be4a90eb":"GoramCoin(uint256,string,uint8,string)","be4aba09":"tokenR6()","be4b1772":"withdrawToken(uint256,address)","be4bb31a":"WAmlingCoin()","be4c3a0c":"getContractOwner(string)","be4c45d5":"changeBuyingPrice(uint256)","be4c9e96":"TRONIC()","be4cbafd":"RichGoldToken()","be4cc281":"ManagerUpdate(address,address)","be4ce05c":"JULY()","be4d06cc":"setLLV_edit_16(string)","be4dbb5e":"getInvestorByValue(address)","be4dbe26":"getBlocklancerContractHolder()","be4ea54d":"setDeveloper(string,uint256)","be4eb0e9":"getUserFromId(uint256)","be4ebda3":"BOUNTY_SHARE()","be4f4fdf":"restrictedShare()","be50af2e":"tokenWithdraw(address,uint256)","be519862":"percDown(uint256)","be51bc0a":"FuncToken()","be523c23":"dungeonPreparationTime()","be5308ea":"BitplusToken(uint256,uint256)","be53874f":"emergencyFundReleased()","be53f968":"getPreSaleStart()","be54c568":"starting(uint256)","be54f214":"monthWithdraw()","be5638ff":"investor_contains(address)","be5648c3":"getResoType()","be571e2e":"BigbomToken(uint256,uint256,address,address,address,address,address,address,address)","be571e8f":"getTokens(address,bytes32,uint256)","be572d52":"addItem(uint256,string)","be576364":"synthInitiatedFeePayment(address,bytes4,uint256)","be592488":"validateName(bytes)","be597faa":"_finishTge()","be59b4b1":"mostRecentCaller()","be5affd1":"address3a()","be5b9c74":"MultiSigWalletMock(address[],uint256)","be5babc2":"CryptoGems()","be5c2423":"failedVerificationSlashAmount()","be5df6cb":"findLover(address)","be5e72e0":"updateBasePrice(uint256,uint256,uint256,uint256)","be5ea335":"betERC20(address,bool,uint256)","be5eb443":"getScriptAction(bytes,uint256)","be5eeb2d":"getSociety(uint256)","be5f3d12":"allocateTokensForAdvisor()","be600276":"move(uint16)","be6002c2":"exec(address,bytes)","be6010f9":"calcHash(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256)","be60988e":"getLotteryByID(uint32)","be60989d":"addCard(string,uint8,string,string,string)","be60be76":"TokenMigration()","be60e771":"ZAMZA()","be616e83":"processAP()","be621764":"TradeRegister()","be62e98e":"MIN_PRICE_SALE()","be6307c8":"getDraw(uint256)","be6340b8":"mintedDirectly()","be63c8ca":"Retire()","be63f7b1":"TobkaCoin()","be640921":"regInitAccount(string,string,string)","be65d234":"Owner_Changed(address)","be65d27a":"vaultDeposit()","be66399f":"setOuverture_effective(uint256)","be676ac6":"transfer_balances(address[])","be67f4fd":"ActualShareManager()","be6872af":"totalTokensForSold()","be6896c3":"PropellerheadSupport()","be692cd3":"erase_data()","be6ad6d2":"ForceEther()","be6b6ba6":"getVestingStageAttributes(uint8)","be6c03ff":"stakedForProposal(address,address,bytes32,bytes32)","be6c554f":"firstCheckpointPrice()","be6c61f5":"unsetIdentity(address,address)","be6c87ad":"item(address,address,uint256,bool,bytes)","be6cef0a":"msgExaminer()","be6d055a":"proxy(address,bytes)","be6d91e6":"getBalanceOfSender()","be6fc181":"getFeeParams()","be71021f":"_crownFreeze(uint256)","be7118a7":"Dilution(address,uint256)","be71248a":"payWinner()","be737f72":"toSmallestShareUnit(uint256)","be7385e3":"getPlayerSpaceships(address)","be73983a":"reservePR()","be73d879":"joinBytes(bytes,bytes)","be74264d":"getFeePercent()","be74381f":"calculatePercents(address)","be743ccb":"MCCPP()","be754ba4":"buy20Price()","be760488":"assign(address,uint256)","be782f58":"setBreedTimeout(uint32)","be78632e":"nstDeposit()","be788e70":"getWithdrawableBalance()","be78bb7a":"transferCallGas()","be78e656":"buyXaddr()","be79ca77":"preSaleBonus3Amount()","be7a1540":"setlvlNfee(uint256)","be7a3164":"getNextAuditRequest()","be7aa7be":"SportStarToken()","be7b4858":"isOpenDistributionClosed()","be7c06ba":"iniOwner()","be7c29c1":"getNewDAOAddress(uint256)","be7ccd7e":"setupMiniGame(uint256,uint256)","be7cddf8":"TwoD()","be7e2848":"SkillChainContributions()","be7edebe":"setURIBase(string)","be7f5d23":"addressesReserving(uint256)","be7fdab1":"returnMoney(address)","be80073a":"SentTo(address,address)","be802f05":"getIcoTokensSold()","be80dcfd":"floatEconony()","be81d5bf":"CROWD_WEEK3_PERIOD()","be82f56b":"drainToken(address,address)","be82fffe":"allPolls()","be8360c5":"_maint_EndPromo()","be83a6b4":"ShitCloneslordReq()","be83b3c6":"LogFinishICO(address,address,address,address)","be83ff83":"vipRate()","be854def":"robPantryT(address,uint256)","be85bf3b":"PaymentWithdrawn(uint256,address,uint256)","be85e4ef":"initEngineer()","be86d5a7":"makerTransferEther(address,uint256)","be86d996":"SINGLE_SALE_MULTIPLIER()","be87662b":"inviteProfit(address)","be87bcfc":"getReport(uint256,uint256)","be87c1ab":"returnBalance(address[2],uint256[7],uint8,bytes32[2])","be882d91":"setQuestionFee(address,uint256)","be888bd7":"devteamReserve()","be89900b":"PIOE()","be8a4737":"withdrawalT4T()","be8a550d":"ICO(address,address)","be8acd3f":"ordersLength()","be8b4f45":"HussyToken()","be8bd3df":"IlumXToken()","be8c1bcc":"batchDrop(address[],uint256[])","be8cd7b8":"participatePresaleNow()","be8db3cf":"deadlineBlockNumber()","be8dd49a":"getTokenUserCounter()","be8ecef3":"requestAddOwner(address,string)","be8eef8e":"hasOpened()","be8f316a":"testmsg()","be90be7f":"clearPoolsDone()","be9117cc":"curryChickenToken()","be912a0a":"getAyantDroitEconomique_Compte_7()","be913b6f":"ETH_FUND(address)","be916531":"test_OverSixtyPercent()","be91de53":"frozenBalanceOf(address)","be91ebe5":"tgrSettingsChangeRequest(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","be92ccfd":"setDisableBet(uint256)","be92f334":"astrSold()","be9413a7":"_cancelRole(address,address)","be95e01a":"payout(uint256,address)","be96031e":"playerinfo(address)","be96bb92":"_isFullOrNull(uint256,uint256)","be96faf7":"AWYManKeepChain()","be975f57":"CreateSTR(address,uint256)","be981ff4":"transferOwnershipForVanityURL(address)","be986420":"quarters()","be987c11":"PriceDecrease(string,uint256,address)","be988dbc":"BroCoin()","be999705":"addFunds(uint256)","be99a797":"setNewRegister(int256,string,string,uint256)","be99a980":"setAddress(bytes32,address,bool)","be99c50f":"purchaseInternal(uint256,address)","be99ed6f":"getCompte_41()","be9a6555":"start()","be9a9a28":"getRequestStatus(uint256,uint256)","be9aa8ac":"setSaleContracts(address,address,address)","be9b076d":"Initialized(uint256)","be9b3282":"cookUpFee()","be9b3e8a":"reclaimEth(uint256)","be9ba97f":"maxContributionPerAddress()","be9c1add":"heldBalanceOf(address)","be9d89c5":"createTokenToMarket()","be9ddfed":"getSanTimeLastMove(uint256)","be9e1080":"_escrowPaymentEarning(address,bytes32,uint256,uint256,address,address,bool)","be9e3774":"deathData_f18()","be9e4697":"getDiscountTrancheDiscount(uint8)","be9f2dc0":"hourPotHighscore()","be9f7a20":"setInsertCar(bytes32,uint256,uint256,uint256,uint16,uint8,uint8,uint8,uint8,uint8)","be9fa8dc":"Ethex(address,address,uint256,uint256,address,uint256)","bea046a1":"cashOutShip(uint32)","bea05440":"CurrentStatus(uint8)","bea10370":"hasRecentPrice(address)","bea124a6":"query(bytes,bytes,int256)","bea1dcf8":"taxCollector()","bea24735":"create_a_new_market(address,uint256,uint256,uint256)","bea28a30":"undoTransferOwner()","bea31228":"ObirumIssued()","bea3c8b3":"PardusNetwork()","bea40bad":"composeJingle(address,uint32[5],uint32[5],string,string,uint8[20])","bea412fa":"RedBUX()","bea433a9":"TriumHolding()","bea4ae88":"saleDue()","bea4c4ee":"setIBalance4(uint256,uint256,uint256)","bea50ae3":"setConfirmationPeriod(uint256)","bea51ec2":"SunnyX()","bea51f81":"addToKYCList(address)","bea5f9cd":"newPokemon(uint256,uint256,uint256)","bea677dd":"MCS()","bea69bb9":"Bal()","bea70578":"getPOOL_edit_16()","bea72c0a":"dsAdd(uint256,uint256)","bea76c3c":"disputeBlockNos(uint256)","bea7c13a":"gasPriceForCompensationAtHomeSide()","bea8bd27":"updateVettingTime(uint256)","bea948c8":"GetGift()","beaa4765":"setComplete(bool)","beab0638":"TokenAllocate(address,uint256)","beab3537":"isClaimed(bytes32,string)","beab9848":"SelfllerySaleFoundation(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint8)","beabacc8":"transfer(address,address,uint256)","beabb2c2":"proxyEnableRefunds()","beabdb7b":"isPermitted(bytes32)","beac4bc3":"pauseUET()","beacf74f":"test_insert_findWithHintPrevDecreased()","bead0513":"leaveCommunity(address)","bead21a6":"lockAtTime()","bead45cf":"deposit_amount()","beadd203":"confirmWarranty(string,string,string)","beadf957":"cancelOperation(bytes32)","beae207f":"startAirdrop(uint256)","beaf56a6":"changeInsurer(address)","beafa2dc":"sacToken(uint256,string,string)","beb08ab9":"projectWallet()","beb0a416":"website()","beb1274d":"medianize(uint256[])","beb2b55d":"balanceHaben(address)","beb2bad6":"SHITP()","beb318a0":"updateSelfDropStageState(string,bool)","beb38b43":"set(bytes12,address)","beb3a38f":"capDay1()","beb40d58":"queryShare(address)","beb5f658":"compare(address,address)","beb6422f":"setClue1(string)","beb7de13":"updateCaps(uint256,uint256,uint256,uint256)","beb7fd4e":"_setMany(address,uint256,uint256[],uint256[],bool)","beb92f55":"setCaller(address)","beb9571c":"User_3()","beb96be5":"releaseFor(address,uint256)","beb9716d":"canMint()","beb9c90d":"wavesGW()","beb9d27e":"prepopulate(address)","beb9df86":"fwdToENS(bytes)","beba0b11":"ScallopCrowdsale(uint256,uint256,address,address)","beba285d":"privatePlacementAllocatingToken()","bebaa421":"setTrustAddress(address)","bebb7756":"RecievedDonation(address,uint256,string)","bebb7e60":"kscBurnFrom(address,uint256,string)","bebc3bfb":"requestWithdrawal(address,uint256,string)","bebc9d93":"buyCopyright(uint256,string,string)","bebcc045":"description(bytes32)","bebd284e":"registerCoinData2(address,uint256,address)","bebda5b9":"WhitelistUpdated(uint256,string,address)","bebdd5ca":"GenericCrowdsale(address,uint256,uint256,uint256)","bebe3c88":"advisorsPeriodLength()","bebe4f6d":"Standard_5()","bebeb73f":"createRoom(uint256,uint256,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","bebf10d5":"WorkflowState()","bebf8498":"addCardToRegistry(address,bytes32,uint256)","bebfe207":"publishMessage(string)","bec0d799":"removeBook(uint256)","bec10cde":"increaseStake(uint256,uint256)","bec13af1":"doBuyerCancel(bytes16,address,address,uint256,uint16,uint128)","bec17f69":"isPreIco()","bec24a0d":"payJackpot1()","bec272da":"IotaGoldToken(address)","bec3150e":"EthereumBrilliant()","bec3e6f3":"overStage(uint8)","bec3fa17":"transferTokens(address,uint256)","bec507ce":"switchfun()","bec5e7b2":"playerDataRecord(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","bec60bd2":"change_token_price(uint256)","bec6bc67":"adoptionRequests(bytes5)","bec6eb15":"buyGladiatorChest(uint256)","bec77cb1":"getOwnerCards(address)","bec7abfd":"getBounsEarningsInRound(address,uint256)","bec809ec":"tomoConvertRate()","bec81091":"executeEtherDeltaBuy(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,bytes32,uint256)","bec823c6":"BitcoinGreen()","beca159b":"registerUser(address,string,uint256,uint256,uint256)","beca40df":"PERC_TOKENS_TO_DEV()","beca4a8e":"TeleGrams()","beca7440":"right52(uint256)","becb1f35":"isForking()","becb44da":"token_sale_start_block()","beccdb77":"lastFeesCollected()","beccdd91":"updateSecPerBlock(uint256)","becd0580":"payEtherToWinner(uint256,address)","becd283f":"getPurchaseCount()","becd7027":"withdrawPurchasedTokens()","becda0ea":"tune(uint256)","bece1b22":"GameData(address,bytes32[],bytes32[],int256[])","bece2ea1":"tokenPriceIncremental()","bececd4e":"updateVerificationStatus(address,bool)","becee565":"GodeCoin(address,address)","becf0426":"registerAffiliate()","becf3add":"bonusPercent()","becf917f":"DistribFundsReceiverAddress()","becf9ce1":"removeFromAccountList(address)","becfbf69":"peekLastNonce()","bed03fdb":"winnerSelect(uint256)","bed09038":"updateMember(address,address,uint256)","bed0a8e5":"testRegisterSwarmEth()","bed0d1b9":"validTransfer(address,uint256)","bed18966":"getCompletedFlag(uint16,uint16)","bed1a924":"totalICOSupply()","bed1b8b9":"convertToInt(string)","bed1cfcd":"addToOwnership(address)","bed230d0":"burningMansCount()","bed25542":"onTokenReceived(address,uint256,bytes)","bed289c9":"CPolloToken()","bed315f8":"setRate(uint16)","bed33cae":"getCancelableAt(uint256)","bed34bba":"compareStrings(string,string)","bed36fee":"test_insert_null()","bed411a0":"CheckPrize(address)","bed43ffa":"CoinCrowdToken()","bed47ed8":"sId()","bed50ef8":"emitFeesWithdrawn(address,uint256)","bed531fd":"playersAmounts(uint256)","bed54a24":"ert()","bed6701f":"lastweek_winner2()","bed7437f":"setHydroTokenAddress(address)","bed866f6":"donations(bytes32)","bed9404f":"calculateAccountLiquidity(address)","bed9588b":"getUint256Max()","bed99850":"burnRate()","bed99dec":"replaceSecurityDepositRegistry(address)","bed9d712":"chargeJNT(address,address,uint256)","bed9d861":"withdrawStake()","beda363b":"dynamicReverse(uint256[])","beda86b9":"removeContributors(uint256[])","bedaa624":"setBZRxToken(address)","bedb86fb":"setPause(bool)","bedbb1a5":"saucePoolTotal()","bedc17ea":"testFailSetName()","bedc7796":"ownerCountOfCard(address,address)","bedca054":"Crowdsale(address,address,uint256)","bedcb4fc":"EthlanceContract(address)","bedcf003":"ownerBalance()","bedd12a5":"depository()","bedda13f":"setData_1(string)","bedddbc4":"darkcoin()","beddf557":"NOLLYCOIN(address)","bede2cac":"joinedCrowdsales(uint256)","bede4bd8":"lockupOf(uint256)","bedecc06":"seatsCount()","bedefffe":"getOwnerName(address)","bedf0f4a":"Stop()","bedf8e75":"Netyul(uint256,string,string)","bee03488":"getAllSSP()","bee066a8":"blocksUntilWin()","bee11672":"allowBundlingMultitoken(uint256)","bee1351e":"_getJYPCBonus()","bee14b3d":"getDevBalance()","bee16cae":"getCodeToken(uint256)","bee200cb":"underLimit(address,uint256)","bee2135e":"prefixedHash(string)","bee23c42":"contain(address[],address)","bee28042":"LVX()","bee2e134":"ethCollected()","bee36f37":"disableMiniSwapLock()","bee40aa4":"setCallType(uint256,uint256)","bee47606":"originalPricesBySpinner(uint256)","bee4bbeb":"unsetIsBuyByAtom(uint256)","bee4cc6b":"getBAB(bytes32,address)","bee588e9":"registerCert(bytes32,bytes,uint256)","bee5cdca":"getProjectById(uint256)","bee5ea6d":"PurgeCoin()","bee604ea":"addGame(address,string,uint256)","bee6348a":"presaleOpen()","bee712da":"buyZone(uint256)","bee96d9f":"updateGoldReferrer(address)","bee98dff":"get(string,int256)","beea7bfb":"newSubdomain(string,string,string,address,address)","beea887c":"totalVCCoin()","beeae9a6":"Ather(uint256,string,string)","beeb0578":"processFundingFailedFinished()","beeb0a82":"SeaCoin()","beeb1b5d":"amountRaisedIsc()","beeb6d87":"withdrawCoin(bytes4,bytes32,uint256)","beebeff7":"tokenForAdvisor()","beec1caa":"issueCertificate(string,string,string)","beee5852":"opponentAmount()","beee9a34":"TIER4()","bef17ed0":"totalTeamContributorIds()","bef19a8b":"narcosByDistrict(uint8)","bef23131":"_createBurnLot(address,uint256)","bef28736":"UpgradedController(address)","bef2e0d8":"Variant()","bef35ccb":"requestClose(uint64)","bef39963":"releasedTokens()","bef3a083":"deadLine()","bef44f18":"transferChild(uint256,address,address,uint256)","bef4876b":"finished()","bef4f95d":"alarms(uint256)","bef5223f":"withdrawTokenToFounder()","bef55ef3":"readData()","bef566ef":"requestForMigration(address)","bef5bb45":"checkHash(address,string)","bef72fa2":"controllerLookupName()","bef7a2f0":"Fee()","bef7c258":"tierStartTime(uint256)","bef80387":"KYCCrowdsale(address)","bef8f7a5":"userAddressAdded(address)","bef90b94":"GetShipsByOwner(address)","bef973e4":"getUnclaimedFunds()","bef97c87":"transfersEnabled()","bef9e4ce":"getPreviousProfit(uint256)","befa1e2f":"totalBets()","befa7d5a":"addressFundDevelopers()","befaed75":"Sell_Offer(uint256,uint256,uint256)","befb6e56":"calCandidate(address)","befbae04":"completeIcoPart2()","befc3e2b":"getInvested()","befc5c32":"getOwnersItemList(address)","befcc34d":"updateSignedDealsCount(address,uint256)","befda2ff":"postIcoPhaseCountdown()","befe0e79":"infinity()","befe6299":"buySPIKE()","befed472":"SKToken(uint256,string,string)","beff6dbf":"getInsurancesCount(bytes32)","beff778e":"CoinBazarCap()","beff90dc":"isVersionContractOrLogic()","beffc416":"set_address2(address,address)","befff6af":"setUseDELEGATECALL(bool)","bf02dbcf":"randNums()","bf03e092":"join_address_pay(uint256,address)","bf03ef7d":"setDailyTokenLimit(uint256)","bf04820b":"totalLosses()","bf050334":"resolveDisputeBuyer(string,address)","bf052a8a":"countConfirmations(uint256)","bf059dc2":"_nonce1()","bf05cbe6":"hasFourStepWithdraw()","bf05d653":"endVesting(address)","bf06444b":"BrokenContract()","bf07aae7":"CQT(uint256,string,uint8,string)","bf082e38":"GICT()","bf084408":"submitProof(bytes32)","bf0872ef":"totalDiscount(uint256,uint256,string)","bf08778c":"seeAllNumbers()","bf09466f":"addEntryIn4WeekPeriods(address,uint256,bool,uint256)","bf0a07bd":"getHardCap()","bf0a53f5":"Notarize(bytes32)","bf0aaaf5":"OWN_ChangeState_locked(bool)","bf0b0c52":"PaisaToken()","bf0b47ce":"getWinLoseAmountByBettingOwnerInGamblingParty(uint256,address)","bf0b88aa":"CanYaDao()","bf0bb225":"recoverAddressFromSignature(bytes32,uint256,address,address,uint256,address,address,uint256,bytes32,bytes32,bytes)","bf0c4343":"dividends_by_type(address,bool)","bf0ce059":"isRootAuthority(address)","bf0d44d5":"testControlCreateWithParentsForeignNotInUse()","bf0d4f03":"EventLevelUp(uint32,uint32,uint32)","bf0d51be":"COINLAW()","bf0dc1c0":"IICToken(uint256,string,string)","bf0df0c1":"Start3()","bf0e4900":"randomWithNonce(uint256)","bf0e63d7":"FastGrowthToken()","bf0e9d61":"getProof(string,string)","bf0f5495":"volunteerWrite()","bf0f88ae":"Google()","bf101b32":"isTransferAuthorized(address,address)","bf1031d9":"proposeTemplate(address,address)","bf10bde1":"calculatePrize(address,uint256,uint256)","bf1152db":"preTransfer(address,address,uint256)","bf11f412":"buyCreditsAndSpendAndRecover(string,uint256,uint8,address,uint256,address)","bf120ae5":"freeze(address,bool)","bf12165e":"fillUpSlot(uint256,uint256)","bf125c49":"balanceIsZero(address,string)","bf12bf4f":"transformContract()","bf13633c":"setvalues(string,string,string,string,string,string)","bf137795":"canSpawnAs(uint32,int256,address)","bf1482fa":"getDonators()","bf14c119":"fund(bytes32)","bf14dcbf":"collectStakingBonusTokens()","bf152765":"userBalance()","bf15a645":"add_numbers(uint256)","bf15d827":"issueTDETokens(address,uint256)","bf15e42a":"CoinClaim(string,string,uint8)","bf15ea76":"transferrableTime()","bf16e9e8":"PccToken()","bf16ec99":"_computeCut(uint128)","bf176c34":"profitAddr()","bf1792b3":"toHex(uint256)","bf187478":"shift_left(uint64,uint256)","bf18dfbe":"PhantomToken()","bf190c8e":"GACToken()","bf1a2e52":"NucleusVisionTokensMinted(address,uint256)","bf1b31c2":"ThirdPartyPlatformAddr()","bf1b5f19":"withdrawRequest(int256,int256)","bf1bb055":"getCCH_edit_14()","bf1c30f5":"applicationNameTaken(string)","bf1c8016":"closedSaleWallet()","bf1cd416":"GrowthPool_Released()","bf1d4c66":"lastPurchaseTimestamp()","bf1dfb8a":"totalBattles()","bf1e799b":"getTimelock(address)","bf1e8497":"preCrowdMinContribution()","bf1fe420":"setGasPrice(uint256)","bf205ebc":"luckyNumber()","bf208e00":"setMinAcceptedAmountInPresale(uint256)","bf2095a4":"sellManually(address,uint256)","bf212637":"getMatronId(uint256)","bf21e45d":"changeCrowdSaleDates(uint8,uint256)","bf22c457":"getJob(uint256)","bf22d670":"boolCallWithArray(bool[4])","bf22f63d":"PasswordChallenge(bytes20,bytes32)","bf23b411":"eosPRIVATE(uint256,uint256)","bf24a794":"getMostVotedOptions()","bf24aad0":"set_maxDETsPerReturnLessThan(uint256)","bf24de3d":"transferTo(address[])","bf251bc6":"foundersPercentOfTotal()","bf251e7f":"TOTAL_CROWDSALE_FUND()","bf254915":"set_Gas(uint256)","bf255974":"GoldRegistry(address)","bf25bf2e":"ethToTokenRest(uint256,uint256)","bf25c597":"VernamToken(uint256)","bf260037":"addressFutureInvest()","bf2699e7":"initValidator(address,address,address)","bf26bf58":"MartinKoTokenHolder()","bf277962":"beneficiary(bytes32,int256)","bf27f585":"totalFundsReceived()","bf27fa7c":"OCoin()","bf2805e3":"getVestingAllocation(address,uint256)","bf2860a4":"allocateProofTokens()","bf28d7ee":"_setOutcome(int256)","bf29a854":"aboutFactoryWorkers(uint256)","bf29b90a":"changeAssociation(address)","bf2b7524":"updatePoolAddressCapTier2(uint256)","bf2c1cc8":"setDailyDepositLimit(uint256)","bf2c3dad":"TransferSellAgentSiteReg(address,uint256)","bf2c7cbe":"rateT4T()","bf2d9e0b":"totalRevenue()","bf2e694f":"getPreviousRequest(address,address)","bf2e727b":"BONUS_LEVEL_1()","bf303d14":"convertCountryIndexToBytes(uint256[])","bf30d943":"changefirst24Percent(uint256)","bf31196f":"offerPunkForSaleToAddress(uint256,uint256,address)","bf314640":"newResolution(string,string)","bf31d573":"send_to_darshil()","bf31fc58":"VestingMasterContract(address,bool)","bf326254":"unlockedCustomer(address)","bf32a4b6":"withdrawOwner2(uint256)","bf32bf97":"FailGuyTax()","bf33589b":"createImageTest()","bf33be97":"balanceOfOrder()","bf34040d":"_depositEthereum(uint256)","bf347404":"engravedToken()","bf34ea7d":"makeBatchPayment(address[],uint256[])","bf354389":"Eplay()","bf35588b":"setDepositRate(uint256)","bf35af36":"vestingOwing()","bf35d5de":"FighterCreated(address,uint256,uint256)","bf35d96b":"Lock(uint256,address,address,uint256,uint256)","bf363b18":"transferFee(address,uint256)","bf368399":"leaderboard(uint256)","bf36c5b0":"offerPieceForSale(uint256)","bf36dd16":"icoStartTimestamp()","bf3724af":"f2(uint256)","bf375fb5":"signFork(uint256,bytes32)","bf37689c":"showArrayLength()","bf37b8f1":"devOwed()","bf381f93":"changeVestingAddress(address,address)","bf385c00":"hasSufficientPaymentInternal(address,uint256)","bf390355":"initCasino()","bf391545":"getBAUU(bytes32,address,uint256)","bf395d3d":"getShipProduct(uint32)","bf3986ba":"TrustlessTransactions_TransactionHeight()","bf39ba48":"PRIVATESALE_SUPPLY()","bf3b1101":"transferWalletOwnership(address)","bf3b397b":"tokensToEthereum_(uint256)","bf3b9e38":"a(uint256,uint256,uint256)","bf3bcc41":"isMod()","bf3c1120":"setBytesValue(string,bytes)","bf3c685f":"TOTAL_VALUE()","bf3d6141":"setParams(uint256[],uint8[],uint256[],uint256[])","bf3d9995":"officialWebsite()","bf3da865":"scannedGoldCaps()","bf3e394e":"withdrawInvestment()","bf3e4a79":"CoreTeamAndFoundersWallet()","bf3e67eb":"Sk8coin()","bf3eea48":"privateFundEnabled()","bf3f493c":"AdminAdded(address,address)","bf40b904":"getIssuedBlock(bytes32)","bf40fac1":"getAddress(string)","bf417b9f":"MINING_SUPPLY()","bf419975":"MBLToken()","bf41e16f":"TOTAL_SHARE()","bf428c17":"addTrustedContractAddress(address)","bf4386a0":"maxMembers()","bf439e80":"mintForEarlyInvestors(address[],uint256[])","bf43e91c":"withdrawAffVault(uint256)","bf43ed4d":"dateInit()","bf43fffb":"getFirstEncounterIdFromDay(uint256)","bf44aa70":"setSellCommission(uint256)","bf44eb03":"liquidityReserveWallet()","bf45db19":"ArtGallery()","bf463341":"GetInitData()","bf4637e5":"jackpotPercent()","bf464090":"getManagerCut(uint256,uint256)","bf466c06":"getIntValueByKey(string,string)","bf46ad1d":"approveSponsorableJob(address,uint256,address,address[])","bf46d3df":"canSwap(uint256,address)","bf474766":"joinGame(bytes32)","bf485e95":"getElementLocation(address)","bf487801":"getContractBalanceOf()","bf48d8b5":"setCurrenseeFoundationAddress(address)","bf49649b":"Galatasaray()","bf49d120":"addReview(string,uint256,address)","bf4a185b":"ClientOrderEvent(address,uint8,uint128)","bf4a5485":"extLockBot(uint256,uint16)","bf4a63f8":"withdrawSOC(uint256)","bf4a79e6":"TimeChain()","bf4aaf86":"DefaultActionDelayed()","bf4aeff2":"payoutPeriodEnd()","bf4b72e3":"metaTransferHash(address,uint256,uint256,uint256)","bf4c06a1":"changeLogOwner(address)","bf4d0abe":"NatoExchangeToken()","bf4d5af4":"failures(uint256)","bf4d89b5":"parseInt(string,uint256)","bf4e9615":"calcPriceFromFactor(uint256)","bf4f7cc0":"onlyStores()","bf503a6e":"crowdSalePercentage()","bf506b47":"registerTXS(uint256,address)","bf5103a1":"AUTH_CANMINT()","bf5124d0":"displayCard(uint256)","bf52439b":"BezantERC20Base(string)","bf530969":"setLabel(string)","bf53253b":"NATIVE_ASSET()","bf5371e3":"sendOnRequest()","bf538b68":"BOXToken()","bf538f6f":"mintingCompleted()","bf539711":"buyTokensPresale(address)","bf53dd15":"HBToken(uint256,string,string,uint256)","bf53e3ba":"harvestQuorumPercent()","bf53fa61":"PRIVATESALE_END_DATE()","bf547894":"transferBatch(address)","bf54bb60":"Bitscor()","bf552230":"_changeAttributes(uint256,uint256)","bf5522da":"bounties(bytes32)","bf55486b":"Tanya()","bf559d11":"startTournament()","bf566599":"changeMyName(string)","bf5671fd":"changeSecOwner(address)","bf568a4c":"endIcoByCap()","bf56ac81":"withdrawAffiliateBalance(address)","bf56cc08":"emergencyClawbackEther(uint256)","bf5772b9":"escape(uint32,uint32)","bf583903":"remainingTokens()","bf58aad8":"privatePreSale()","bf59cdff":"getH3Amount()","bf5a451b":"foreverBlockBattleAddressUpdate()","bf5a4dd3":"unlist(uint256)","bf5a79ee":"_getSchellingRoundDetails(uint256)","bf5abfe3":"SimpleConsent(string,address,address)","bf5b2e5d":"MIND_FOUNDATION_AMOUNT()","bf5b4c0c":"getPendingExploreData(address)","bf5b6016":"addContract(string,address)","bf5b6234":"fillSellOrder(address,address,uint256,uint256,uint256)","bf5bb323":"donationMap()","bf5c7f9b":"emissionProvidersCount()","bf5c844b":"oneweek()","bf5cf791":"AIRDROP_TOKENS_NUMS()","bf5e54d2":"updateTokenImprint(uint256,bytes32,int256)","bf5f0169":"deliverTeamTokens(address)","bf5f2b67":"tradingBalanceOf(address,address)","bf5f4edf":"addMonsterClassExtend(uint32,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8)","bf5f93e7":"twoHightestBidsDifference(string)","bf5fc2ee":"setStartsAt(uint256)","bf604019":"coinTradeStart()","bf606d14":"sendOneEtherToHome()","bf611c78":"OmniDex()","bf61b517":"FEE_SILO()","bf61e4b2":"AsuRaimu()","bf620a45":"lockAccount(address,uint256)","bf6211d9":"StripToken(address)","bf624273":"expiryBlock()","bf6311c2":"_progressAdPrice(uint256)","bf632e67":"stateController()","bf6537a0":"crowdsaleBeneficiary()","bf654aac":"maxFeePercentage()","bf656791":"getMinContrib()","bf65d492":"FileName()","bf65dd32":"_checkAndCallApprove(address,uint256,bytes)","bf664892":"PARSECS_PER_ETHER_BASE()","bf66a5f9":"indSaleDeposit()","bf6713f6":"getGift(uint256)","bf671782":"handleReferrals(address,uint256,uint256)","bf686453":"PAN()","bf6888c8":"VESTED_PERCENT()","bf6896eb":"signAgreement(bytes32)","bf69d707":"punkBids()","bf6a10d7":"validateContributor(address,uint256,uint8,bytes32,bytes32)","bf6a1413":"hasSigned(address)","bf6ad320":"winnerPrice()","bf6ad32b":"getgbyte()","bf6afbaf":"FeePaid(address,address,uint256)","bf6b43a1":"upgradeCrystalMine()","bf6b6536":"SampleContractOther()","bf6c277a":"getTotalAccessorySeries()","bf6c4de9":"newPLCRWithToken(uint256,string,uint8,string)","bf6ca138":"issuedExternallyTokens()","bf6d91be":"addClient(address,uint256,uint256,uint256)","bf6d9abd":"unlockTransfer()","bf6deda4":"createLotto(bytes,bytes,bytes10,bytes10,bytes)","bf6eac2f":"stake(address,address,uint256)","bf6eb070":"MAX_ALLOWED_STAGE_2()","bf6ec777":"takeFee(uint256,address)","bf6edbd9":"mintFrozen(address,uint256)","bf6f7755":"transferBaseOwnership()","bf7035c3":"getSaleContractDepositEtherMin(address)","bf70a985":"PRESALE_ETH_IN_WEI_FUND_MAX()","bf70bd75":"stopPreIco_step2()","bf716708":"TOKEN_SUPPLY_SEED_PRESALE_LIMIT()","bf730997":"modifyGuess(uint256,uint256,uint256)","bf733e29":"oraclize_newRandomDSQuery(uint256,bytes,uint256)","bf735b13":"createSale(bytes32,uint256)","bf737c87":"JackpotWon(address,uint256)","bf7408de":"TAJ()","bf742d56":"canExecuteArbitraryCode()","bf748655":"isPaymentRegistered(bytes32)","bf748e47":"get_pre_kyc_iconiq_bonus_numerator(address)","bf7540d2":"getMoneyCount()","bf754558":"conversionsEnabled()","bf75553a":"sacarWEA()","bf75fdb5":"CreateShortAlias(bytes32)","bf77aa1f":"updateListing(uint256,bytes32,uint256)","bf77afdb":"TokensReserved(uint256)","bf7929a6":"refundeadline()","bf7abee6":"SetAuth(address)","bf7b69ee":"payDebt(address)","bf7ba12a":"LupeShares(address,address)","bf7c734e":"setMinSell(address,uint256)","bf7c775e":"RESERVED_RESERVE_UNLOCK_AT()","bf7e214f":"authority()","bf7e4026":"pizza_machine(uint256,uint256,uint256)","bf7e7f62":"MaxCouponsPaymentUSD()","bf7ea21c":"addWhitelistMember(address[],uint256[])","bf7f10fe":"isTransferShipment()","bf7f3cfe":"getVotesPerProposal()","bf7f8b89":"EthernetCash()","bf7ff81e":"bitwordsWithdrawlAddress()","bf815059":"updateUnidentifiedSaleLimit(uint256)","bf81765c":"adminAddressForComissions()","bf83735c":"changelp19(address)","bf843aed":"BuckyCoin()","bf8554ff":"fireOnOfferingChanged(uint256,bytes32,uint256[])","bf85cc27":"settleCfd(uint128)","bf85e628":"startVesting(uint256,uint256)","bf86d690":"isShutdown()","bf86e013":"createPromoBot(uint256,address)","bf872aee":"revokeConfirmation(uint256,bytes)","bf8783e0":"callAndGetReturn(address,bytes,uint256)","bf884cf5":"exitThisIcoForHalfOfTokenPrice()","bf8853c6":"getUserInterest(address)","bf8869b5":"GetBal()","bf88a6ff":"reward_contract()","bf88fc09":"revokeOwners(address)","bf892eaa":"removeTrustedContract(address)","bf89662d":"refundable()","bf8981c0":"left36(uint256)","bf8af541":"setLockRatio(uint256,uint256)","bf8b6466":"anOfferWeCantRefuse()","bf8b7ec2":"OpenGift()","bf8ba305":"getCodeStorage(uint256)","bf8bcee4":"setMaxLimit(uint256)","bf8bdac1":"setService(address)","bf8bf85e":"latestReleaseChecksum()","bf8c50ff":"scheduleTransaction()","bf8c6b63":"is_diagonal(int8)","bf8ce97f":"_take0xTrade(address,uint256,address[5][],uint256[6][],bytes)","bf8d5df8":"setTickerSymbol(string)","bf8dde4d":"calculatedReward()","bf8e0ea4":"logGive(address,string)","bf8eae55":"ChangeGasReuired(uint256)","bf8ecf9c":"authProposals()","bf8edd85":"setPriceInEth(uint256,uint256)","bf8f09cb":"cancelOrder(address,uint32)","bf8faa9c":"AMLToken(string,string,uint256,uint256,bool)","bf8fc670":"sendToAggregation(uint256)","bf9005ec":"Test6J()","bf907def":"buyGold(bytes32,string,string,string,string,string)","bf90c4e7":"PYRToEth()","bf913c5e":"getFamedStarByMass(uint256)","bf91cbb5":"mineIsBigger()","bf91ef18":"mergeBoostData(uint256)","bf9222d0":"DNT()","bf93a8be":"changeOwnership(address,address)","bf947852":"blockInvestor(address)","bf94de12":"createPoll(address,bytes32,uint256)","bf955038":"Judgement(uint256,uint256,uint256)","bf962302":"addIntTag(bytes32,int32)","bf96ae63":"signUp()","bf981995":"getCountryInfo(uint256)","bf983772":"BaseExchangeRateChanged(uint256)","bf98976e":"test_curatorDoesVeto()","bf989b6e":"setContracts(address,address,address,address)","bf98a50d":"GasReceipt(address)","bf99669d":"DevPromotionsMarketingSupply()","bf99cce1":"buyTokens(address,uint256,bytes32[])","bf9a5fde":"setConfiguration(uint256[],uint256[])","bf9a6958":"createVoterOnElection(uint256,address,address,string,string,string)","bf9ab00c":"getTeamPerfit(uint256)","bf9b8b38":"CrypviserToken(address)","bf9bbe71":"TRE()","bf9befb1":"totalStakes()","bf9c0d44":"RandomLedgerService()","bf9c3949":"createFaucet()","bf9c5001":"authors(address)","bf9d3d39":"setLineUpEnable(uint256)","bf9e6b0e":"TokenSwap(address,uint256)","bf9e7b75":"DeliveredBTC(address,uint256)","bf9f01f8":"buyMasterNodes(uint256,uint256)","bf9fc4e2":"balanceOfRobots(address)","bfa0b133":"salt()","bfa0fc93":"getVoteResult(uint256)","bfa190f3":"mTransfer(address,address,uint256)","bfa1bd62":"stakeAirdropWhileLocked(address,address,uint256,bytes)","bfa3c1e6":"MySale(uint256,uint256,uint256,uint256,uint256,uint256,address,bytes32,address,uint256)","bfa51df9":"isAirdropped(address)","bfa535c7":"apply(string,uint256)","bfa54b3f":"BLB()","bfa5f1f7":"getLandmark(uint256)","bfa814b5":"func()","bfa87e80":"tellPreviousContract(address)","bfa8ad36":"createProof(bytes32,bytes32)","bfaa1763":"FATA()","bfaad84b":"getLastStarOfAssetId(uint32)","bfab3db9":"withdrawContractBalance()","bfab41c9":"getTargetBlock()","bfab4f8b":"isMonsterAuction()","bfabd754":"increaseFrozen(address,uint256)","bfabe6c4":"ShakaliosToken()","bfac0046":"getPlayerWallet(uint256)","bfad16f4":"new_offer(uint256,uint256)","bfae2f0e":"addrAdmin()","bfae8867":"getLockTimestamp(string)","bfaec04e":"publish(string,bytes32)","bfafa8e6":"auditText(uint8,string)","bfafb91c":"changeMaxCoefPlayerForEmission(uint256)","bfafe92f":"_buyCallToOpen(uint256,uint256,uint256,uint256,address)","bfb01f72":"buyWithCustomerId(string)","bfb04c60":"proposeAcceptanceAsMember(uint256)","bfb05e0b":"declineFightApproval(uint256)","bfb0d82e":"__callback(bytes32,address[])","bfb1fcf5":"dmlwallet()","bfb2fad7":"totalDepositTokenAll()","bfb42682":"addPresaleOrder(address,uint256)","bfb460e9":"receiverSetAmountRequired(uint256)","bfb47e72":"CryptoSurprise()","bfb4d66f":"SudjuKoin()","bfb4ebcf":"Foo()","bfb51ac9":"startGame(uint256,bytes32)","bfb65777":"allContacts(address)","bfb68141":"disableTokensTransfer()","bfb77030":"BRM()","bfb7896d":"OQToken()","bfb790b4":"weeklyRate(uint256)","bfb7c227":"Developeo(uint256,string,string,address,address,address,address,address,bool)","bfb7d9f6":"stringandbytes()","bfb80547":"unfreezeAddress(address)","bfb8a319":"withdrawal(bytes32,address)","bfb8c63e":"confirmDeal(bytes16)","bfb909ce":"applyFeeToAddress(address,address)","bfb9f088":"addInvestorList(address[])","bfba1e8d":"gamePlayed()","bfba5dd6":"equal(address,address,string)","bfba9029":"hashBetMax()","bfbaa54d":"MithrilMace()","bfbad8b9":"preSaleEtherRaised()","bfbb6a23":"winEth(address,uint256)","bfbbd489":"setMonsterAuctionAddress(address)","bfbbfb1d":"getWinNumberBySlot(uint256,uint256)","bfbc37f7":"KOSHER()","bfbc793c":"computeNameFuzzyHash(string)","bfbc944c":"oldTokenReward()","bfbccfae":"currentCoinsCreated18Decimals()","bfbcf293":"setChampEC(address,address)","bfbd5074":"getVillain(uint256)","bfbf95cf":"participateICO(address,uint256)","bfbfa8e4":"kBalance()","bfc0a342":"owner_loadFunds()","bfc0cc5c":"sendEcosysSupplyToken(address,uint256)","bfc0e849":"startNextEra(bytes32,uint256,int256)","bfc1f48c":"isCapFree(address)","bfc2a675":"CreateCredo(address,uint256)","bfc2aa2a":"claimedSupply()","bfc303fa":"updatePublicData(uint256,string)","bfc38592":"cancelItemSale(uint256)","bfc3aef0":"setActiveStar(uint256)","bfc3cd2f":"testFailChargeMoreThanApproved()","bfc3d84b":"CT()","bfc47aa0":"tokensCrowdsale()","bfc4d11c":"subJobSponsorshipsBalance(address,uint256,uint256)","bfc54822":"bet(uint256,uint256,uint256)","bfc5624a":"newBadAPM(bytes32,bytes32,address,bool)","bfc6cdd1":"DukevsKansas()","bfc708a0":"reportMalicious(address)","bfc7952f":"outstandingPayouts()","bfc83af4":"setBountyTokenWallet(address)","bfc84528":"juicyBonus()","bfc8bfce":"executeTransaction(uint256,address,bytes,bytes)","bfc99f5b":"unsafeWriteAddress(uint256,address)","bfca33f7":"Court(address[],uint256[])","bfcabcbf":"changeFeeAmountThreshold(uint256)","bfcae563":"dateSaleEnded()","bfcc4ab2":"change_time_stamp(uint256,uint256)","bfcc8b6d":"ownerOfPlayer(uint256)","bfcdbae9":"preICOStartTime()","bfcdca48":"CastVote(bool)","bfce0b7f":"mainSaleEtherCap()","bfce477f":"forwardTransaction(uint256,bytes)","bfce8cbf":"redeemAdoptedAxies(address,uint256,uint256,uint256)","bfcf04cf":"updateId()","bfcf0baf":"testSliceToString()","bfcf63b0":"claimEther(address,uint256)","bfcf73e7":"blocksToLive()","bfd07c38":"LowJackpotHolder()","bfd0a553":"specWallet()","bfd1084f":"BitNauticWhitelist(uint256)","bfd13217":"ethReceivedPresaleOne()","bfd17831":"RECEIVER_ADDRESS()","bfd201f5":"setTransferFees(uint256,uint256,uint256)","bfd2385e":"allowanceOf(address)","bfd24821":"BonusCrowdsale(uint256,uint256)","bfd2ed01":"bountyPercent()","bfd3c5fa":"refundTransactionAfterExpiry(uint256)","bfd3fa6a":"becomeFairymaster()","bfd431d1":"RefundToBuyers()","bfd45540":"BlocHipo()","bfd4d720":"investors_number(uint256)","bfd4dce9":"WhatIsTheBestFoodInTheWorld()","bfd525b3":"stopTimeLength()","bfd6ef3e":"explore(uint256,uint256,uint256)","bfd74534":"getRequest(address,address)","bfd7534f":"developer_address_for_D(address)","bfd75da4":"TrueUSD()","bfd812ec":"suspend(bool)","bfd8222a":"checkReward(uint256,uint256)","bfd8300d":"setBonusInterval(uint256)","bfd85808":"frozenTokens(address)","bfd8a06e":"getFinalWinningReportingToken()","bfd8fc93":"getOwnersLength(bytes32)","bfd90435":"addDataset(address,address)","bfd94c8c":"transferIsAllowed(address)","bfd9726d":"getMntTokenBalance(address)","bfda3b1a":"setSharedStorage(address)","bfdad9a4":"SignedContractVault(string)","bfdadc19":"change_price(uint256)","bfdb8796":"getPoolNameByID(uint256)","bfdc35f2":"onBalance()","bfdcc9a2":"numBuckets()","bfdcd480":"test_invalidProposalDuration()","bfdcdbf5":"subkey(address,uint256)","bfdd1a20":"getPOOL_edit_17()","bfde4f62":"withdrawAllEthToOwner()","bfdecf8c":"purchaseTokenInPresale()","bfdeddaa":"AllowedContributionCheck(uint256,uint8)","bfdf5e80":"communityPot_()","bfe0c27e":"getCurrencyAddress()","bfe10928":"distributor()","bfe1292a":"distributeLenderBot(address[],uint256,uint256)","bfe36f58":"HashCoinToken()","bfe370d9":"bytesToBytes32(bytes)","bfe38df5":"getTotalBet()","bfe3a664":"createCrowdsale(address,uint256[8])","bfe3c39d":"JYKToken()","bfe3e03a":"midGradeHold()","bfe44c4b":"getUserValue(bytes20,uint256)","bfe484de":"judge(uint256,bool,bytes32)","bfe4ed8e":"Razoom(address)","bfe53e5c":"holdersWithdrowsOf(address)","bfe597fe":"genesisBlockCount()","bfe689cf":"lockedValuesAndTime(address,uint256,uint256,uint256)","bfe6b1ac":"acceptOffer(uint16,uint256)","bfe6c0c7":"viewa1(address)","bfe70251":"_checkCertificate(bytes,uint256,bytes4)","bfe713e3":"truecoin()","bfe7e2eb":"BCBCYCoin()","bfe86bbe":"publicGetElement(uint256,uint256,uint256)","bfe8936c":"getAssetDetailsURI(uint256)","bfe8c107":"betOnDozen(bool,bool,bool)","bfe9b7df":"pubkeys1()","bfe9e7f4":"pack(address,bytes)","bfe9f204":"dividendCycleTime()","bfea267a":"getBalanceToMint(address)","bfea8790":"enableScheduler()","bfead4b9":"maxWithoutWhitelistPerUser()","bfeb049c":"IndexOfCurrentDraw()","bfebb947":"unblacklist(bytes32)","bfec83d6":"RoleAdded(address,string)","bfec8b01":"insertSection(bytes32)","bfee3569":"setTokenControlInfo(address,uint256,uint256,uint256)","bfef9627":"set(bytes4,uint8,uint8)","bff04d6f":"testPostpone()","bff05aef":"adminRefundTokens(address,uint256,uint256)","bff0fbb8":"calculateMeat(uint256)","bff10815":"deleteOffer(uint16)","bff179c4":"setJadeCoinZero(address)","bff18c78":"deployFactory()","bff1f9e1":"totalUsers()","bff2c413":"ChangeFoundersWalletAddress(uint256,address)","bff35618":"setTransferLock(bool)","bff41e36":"WEI_RAISED_CAP()","bff44f0d":"confirmAddressChange(address,address)","bff49180":"updateVendorValid(uint256,bool)","bff5e021":"PumpToken()","bff5fb64":"appNickname()","bff5fccd":"myWishes()","bff65668":"isPresaleHolder(address)","bff7df7c":"refundDeadLine()","bff7e179":"multiPurchase(uint32[],uint8[],uint8[],uint8[],string)","bff8314f":"SetMaxPosXblock(uint256)","bff8a36d":"decreaseReserve(uint256)","bff974e8":"getContentReplies(uint256)","bff99c6c":"tokenWallet()","bff9e842":"getSamplesForOwner(address)","bffa02d5":"sendP3D(address,uint256)","bffa4e41":"getMintAmountApproval(address,address)","bffa55d5":"claimRefund(address)","bffa9258":"assetCount(address)","bffb10de":"add_creature(address,string)","bffbe61c":"node(address)","bffc235a":"mintedList(uint256)","bffcd758":"nasdaqo(uint256,string,string)","bffd952a":"transferMaintainer(address)","bffdf3f1":"Test4()","bffeadd6":"move(uint8,uint256,bytes,uint8,bytes32,bytes32)","bffee609":"setSkills(address,uint256,uint256,uint256)","bfff23f2":"CaptainKitty()","bfff374d":"DepositReturned(uint256,address)","bfffe670":"window1StartTime()","c00007b0":"getReward(address)","c0001786":"ownerBurn(address,uint256)","c0012077":"TeamContract()","c002c4d6":"getTicket()","c003598a":"XEN()","c0036137":"ownerProfitPercent()","c003b082":"getMyPlayerID()","c003f540":"sco(uint256,address,uint256)","c00465ab":"CrowdsaleToken(uint256,uint8,address,bool,address)","c004a877":"shiftSalePurchase()","c0056b7b":"updateAccount(uint8,bytes32,bool,bytes32)","c005c686":"validateCompoundContract(uint256)","c005dc7b":"hon2backup()","c00710fa":"userContractsPred(address,uint256[],uint256[],uint256)","c0075772":"setPromoTokenController(address)","c0086b19":"BCP(uint256,string,uint8,string)","c00941d9":"Dominator()","c009b451":"setEventActive(bool,string)","c00ade41":"receiveTransferOwnership()","c00b060c":"getArrBoolField3()","c00c176c":"GoGO()","c00c2ceb":"isRedeemAllowed()","c00c4e9e":"batch(address[],uint256[])","c00ca383":"getByOwner(address,uint256)","c00d5305":"oraclize_setNetwork()","c00d8f3d":"processLotteryReward()","c00daefe":"etherFund(bytes32,string)","c00e4306":"getCurrentTokenAmountForOneEth()","c00ea6ef":"Polaris()","c0112678":"arcToken()","c0116c3c":"doAirdrop(address[],uint256[])","c011cd1c":"getClixToken()","c012e179":"mintDepositAccount()","c0130adb":"addadjacencies(uint16[],uint16[],uint16[])","c0140fd1":"bid(bytes32,address,uint256)","c014464e":"checkFeePeriodRollover()","c014875f":"mint(bytes32,address,uint256,bytes)","c01569f9":"buyPiece()","c01685d4":"FTKTToken()","c01706dd":"getContentByRank(address,uint256,uint256)","c0171112":"timestamp(uint64)","c018d0e6":"getFeeAmount(int256,int256)","c018fe0d":"sub_sessione(string,uint256)","c01a1c5f":"totalSellPrice(uint256,uint256)","c01a8c84":"confirmTransaction(uint256)","c01ae5d3":"drop(address[],uint256[])","c01b3aa4":"STARTING_SNAKE()","c01bc982":"isRestricted(address)","c01c1ca3":"claimRemaining()","c01ca43f":"getPlayerState(address)","c01d1c60":"getTokenExchangeRate()","c01d8280":"get_balance(address,string)","c01de45c":"storeBet(uint256,uint256,uint256)","c01e38e6":"addPlayer(address,uint256,uint256)","c01e3985":"StupidityToken()","c01e8b6a":"Zigit()","c01f475f":"_setClearingPrice(bytes32,uint256)","c01f56d0":"OfferToDisciple(uint256,uint256)","c01f9e37":"proposalDeadline(uint256)","c0204bab":"EasyOsmiumCrowdsale()","c020df48":"updateGas(uint256)","c022215c":"getTotalDeposit()","c0227bd3":"_toTaxes(uint256)","c022abbe":"GetAuction(uint32)","c022ef43":"getTimeLeftToNextLocalBountyCollect(uint16)","c023a231":"BitSTDView(address)","c02515a9":"maxTokenForHold()","c0263163":"ATT(address)","c026327a":"removeBankToken(uint256)","c02738da":"generateTargetTokens(address,uint256,uint256)","c02898a0":"potatoOwner()","c028c674":"right82(uint256)","c028df06":"offer()","c028e3c9":"cordX(uint256)","c0297bc8":"DreamX()","c02aaea1":"totalTokensForSaleDuringPreICO()","c02b04d8":"rescueLostProperty(uint256,address)","c02b5395":"NAMO()","c02bf40c":"FundsDeposited(address,uint256,uint256,uint256,uint256)","c02c89fe":"PreicoClose()","c02cc957":"firstDigit(string)","c02d0140":"buyCard(uint8,string,string,string)","c02d1e02":"a_document(uint256)","c02e580e":"roundEnd()","c02f081a":"shiftBits(bytes,int256)","c02fd500":"E4Lava()","c0309697":"challengeContract(address)","c030d8b8":"setCardContract(address)","c030f3e2":"increaseSaleLimit(uint256)","c031a180":"getBytes(bytes32)","c031a78b":"maxMedalsBurned()","c0324c77":"setParams(uint256,uint256)","c032846b":"getContractStatus()","c0329a3e":"startAirdropFrom(address,address[],uint256)","c032dc30":"execute(uint256,address)","c0338a0c":"transferTileFromOwner(uint16[],address)","c0343b09":"setDisputeInterface(address)","c035340c":"withdraw_1()","c035e492":"onholdBalances(address)","c0362523":"setUpgradedOwner(address,address,address)","c036c100":"NextGenHype()","c03785c3":"MyRefundVault(address)","c03795ba":"departmentrequest(address,string,bool)","c037ae58":"VESTED_AMOUNT_TOTAL()","c037d9ce":"getElementsFromIndex(uint32,uint32)","c038a38e":"totals()","c038f541":"setProperty(string,string,uint256,int256,string)","c03951f7":"FaceWalletToken()","c0395bb5":"isCurrentOrPastAdmin(address)","c039b88c":"_makeSpecialId(address,address,bytes32)","c039bd87":"withdrawTokenFromPkt(address,uint256)","c039d6db":"PutEther()","c039daf6":"tokenCreationMin()","c03a4018":"getGuessInfo(string)","c03aac7a":"setSellDividendPercentageFee(uint8)","c03b70d5":"getTurnover(address)","c03ba041":"BNC(address)","c03bdbae":"setRdFee(uint256,uint256)","c03c3003":"increment(int256)","c03c72aa":"isBattleDecider()","c03ce1d8":"BondingManager(address)","c03ce796":"crowdSaleStage()","c03cf137":"getMyLocker()","c03d00f3":"a_viewCoinSupplyAndFunding(bool)","c03d1b1d":"verifyCertWithID(bytes32,bytes32,bytes32,address)","c03d848c":"convertEthToCents(uint256)","c03e2cbf":"Whitelisted(address,bool,uint256,uint256)","c03e382f":"calculateShare()","c040188f":"preSaleLockEndTime()","c0406226":"run()","c040e6b8":"stage()","c040ebec":"getUserSize()","c04123fb":"checkProposalCode(uint256,address,uint256,uint256,bytes)","c041652d":"getVendorApplicationStatusTrackCount(string)","c04198f3":"getEndDate(string)","c042575f":"ETHmultiplier()","c0435e29":"setDefaultFriendsFingersRate(uint256)","c043c0d9":"changeMaximumPlayers(uint32)","c043df8c":"verifyWithdrawSignature(address,bytes)","c04484fd":"resetInternal(uint256)","c045732c":"addPreIcoMembers(address[])","c0459899":"approvePreSigned(address,uint256,uint256,uint256,uint8,bytes)","c04605b8":"softEndDate()","c0462ec3":"withdrawAllTokensToExchange(address,address,uint256)","c0463711":"lastUpdate()","c0463810":"PalmToken()","c0465f3a":"dateSisterWins()","c046c691":"setMoveProductToWhom(address,uint256,address)","c046d9b5":"borrow(address,uint256,address,bytes)","c0472889":"currentIDnumber()","c047c1d8":"transactionsStatusUpdate(bool)","c0489af5":"foundersTimelock1()","c048dfb8":"postpone(uint256)","c0496e57":"setNotarisationFee(uint256)","c049813a":"preIcoStagePeriod(uint256)","c04a5414":"developmentWallet()","c04aa9b8":"rpow(uint128,uint64)","c04bb954":"rejectionRatio()","c04c5947":"getGames()","c04c68eb":"changeAllowTransferState()","c04c8e43":"SNSCOIN()","c04ca3f5":"_removeAgent(address)","c04cc86b":"collecttaxes(uint256)","c04d90d0":"ownerByIndex(uint256)","c04de318":"slashAddressLikeUsername(string)","c04ecdb8":"promoTokenController()","c04f01fc":"power(uint256,uint256)","c04fcad8":"INITIAL_TOTAL_SUPPLY()","c0506782":"_createArtwork(string,string,uint32,address)","c050f6dc":"admitUser(address)","c0517c5a":"XferMoneyMarketing()","c051f75f":"setSchemaRegistry(address)","c05283ff":"logQuery(bytes32,address)","c0533b5d":"appVersionList(bytes32,address)","c05374f7":"AirChn()","c05390f6":"PRIZE()","c053dc6b":"EtherBags()","c053ebf5":"setProviderClosed(uint256,uint256)","c0567656":"subtractFee(uint256)","c0576b73":"monsters(uint256)","c057b40d":"SpainvsRussia()","c0584e68":"ContributorsSupply()","c0597a55":"freedWosPoolForThirdStage()","c05a30b9":"_processFunds(uint256,uint256)","c05a8e81":"getPosition(uint8[176],uint256)","c05b7cf6":"setCreationProfit(uint256)","c05b8066":"setCompte_18(string)","c05ce08f":"calculatePoints(uint256,uint256)","c05d1f0e":"PRESALE_JOINTTOKENS()","c05dd5d2":"MatchAborted(uint256)","c05e5776":"giveRightToVote(address,address)","c05f486e":"DEV_SUPPLY()","c060ac53":"bytes20ToString(bytes20)","c0615f09":"CPGPEREGRINE_EXTRACTION_BASE()","c0619c70":"setPrimaryManager(address)","c06265d3":"createContractState(string)","c062dc5f":"releaseAmount()","c062ef86":"_random_empty_location()","c062f578":"updateStage()","c0631b12":"moneyWallet()","c0645011":"getPastRound(uint256)","c06474e0":"removeShare(address,uint256)","c06508dc":"QBTCoin(address)","c0652cf9":"EdelRostenCoin()","c0659108":"beneficiariesLength()","c065ecc2":"queryChildLength()","c065fcf1":"RESERVED_PARTNERS_SIDE()","c066bd1a":"addItem(uint256,uint256,address)","c06702dd":"changeStage()","c0670d2c":"calculateDistributionPeriods()","c0675b78":"addBuyTokensRequest(string,uint256)","c0677fb6":"SetIdentifiedContract(address,address)","c0689e2d":"newCrowdFundingCampaign(address,uint256)","c068eae0":"player_collect_winnings(uint256)","c06a22f4":"dollarsForEther()","c06b0d21":"BondToken(address,address,address)","c06b5281":"buyXnameQR(address,bytes32,uint256)","c06c4474":"get_burned(bytes32)","c06c66ca":"bountyFund()","c06d1272":"startPreIco()","c06d1490":"oppositeAnnouncement(uint256)","c06d7744":"getAllSignersCount()","c06dabf8":"_escrowHostPaymentEarning(address,bytes32,uint256,uint256,address,bool,uint256)","c06f146b":"setNumInvalidMarkets(uint256)","c06f1bc4":"updateVoterTimes(address,uint256)","c06f4c1d":"newCampaign(bytes32,bytes32,bytes32,address,uint256,uint256,uint256,address)","c06f8340":"cancelAuctionByAdmin(uint256)","c06fad06":"items()","c06fff76":"proposePauseChange(bool)","c0702d9c":"_mint()","c07097a6":"coindropsLockEndingAt()","c0715d1d":"assertSafe(bool)","c071f3bf":"deliverPurchasedTokens()","c072422d":"buyTokens(bytes32,uint256,uint8,bytes32,bytes32)","c072497a":"claimPlotMultipleWithData(uint256[],uint256,string,string,string,string)","c072dcf3":"ExampleContract()","c073af55":"GetJackpotMin()","c07401f0":"addToPool()","c0740c16":"numElementsOdd()","c0741c53":"test_assetRegistration()","c0743044":"partAllocations(uint256)","c074313f":"pricePerStake()","c074a27e":"proposeTransaction(address,uint256,bytes,string)","c07653af":"Gavinhereum(uint256,string,string)","c076c847":"NorthPoleAF()","c0774df3":"canForward(address,bytes)","c0777545":"balanceAD()","c077b0f9":"getARSchedule()","c079418b":"setTranchWei(uint256[])","c0797ae1":"stakerIncomeShare(bytes32)","c079c318":"adjustFee(uint256)","c07a1f0c":"changeHouseFeeAddress(address)","c07a32c4":"dateIsLegal(uint256)","c07a5537":"MintableTokenWithMinters()","c07b18ca":"PullPaymentMock()","c07b2586":"SAFCOIN(uint256,string,uint8,string)","c07bcfdc":"updateLimitPerDay(bytes32,uint256)","c07dc59c":"withdrawPot(string)","c07dc890":"selfRegisterDINs(uint256)","c07dd842":"buyFactor()","c07e3391":"setMonethaAddress(address,bool)","c07f47d4":"latestVersion()","c07f773a":"totalTokensAllocated()","c080f08f":"complexReturnType(int256,string,bool,string)","c0819961":"Invest()","c081efc1":"hasSellerBeenAccepted(address)","c083455f":"ownerPutInterest(uint256)","c0835106":"isVotable(bytes32)","c08415b1":"ORDER_PLACE(address,address,bool,uint256,uint256,uint256)","c0845e8a":"catchMonster(address,uint32,string)","c0846957":"EtherDeltaTokenBalance(address)","c0851e09":"getEarlyPurchase(uint256)","c0864877":"tokensForOwner()","c088003d":"getMinThresholdOfVoters(uint256)","c0887991":"getOperation(address)","c088df47":"SECRET_BONUS_FACTOR()","c08a86b1":"endGame(bool,uint256)","c08cc02d":"getProposalCount()","c08d1fe5":"timeLimit()","c08dd1dc":"IOU(string,string,uint8)","c08e05aa":"icoRuleCancel(uint256)","c08eea14":"cloneAccount(uint256)","c0905fef":"getStackholders()","c090b4df":"createRecord(string,string)","c090b86d":"createKingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)","c090da1e":"Zhennong(address)","c0910475":"PaymentStatusTimeStamp(address,address)","c0916437":"modifyChoice(uint256)","c091c435":"refund(address[],uint256[])","c091e45a":"redenominate()","c0926d40":"HBOToken()","c0929385":"confirmInit(address,address,string,bytes32,uint256)","c092ecf4":"blocksToVest()","c0934c45":"getNextRules()","c0938c1a":"setMintAgent(int256,address,bool)","c0942dfd":"registerNameXIDFromDapp(address,bytes32,uint256,bool)","c0946d54":"AtomCoin()","c094c73e":"VeritaseumToken()","c094df20":"shift(address,uint256)","c0956fd9":"getRealTokenAmount(uint256)","c0963d97":"getTokensAmount(uint256,address)","c0966693":"RoomNonceAdd(uint8)","c096aa81":"fuint8(uint8)","c097d629":"setPI_edit_30(string)","c0981285":"buyComissionUnits()","c098201f":"updateEtherAndtokenAmount(uint256,uint256)","c0997654":"destIndex(address)","c09a4ef4":"latestEthTxRequest()","c09a898d":"SPTS()","c09b2a2c":"weiMinSale(uint256)","c09bdd06":"_escrow(address,address,uint256)","c09d81be":"calculatePoundsTimesEther(uint256)","c09f32e8":"closeQuestion(uint256)","c09fed25":"transferFromBalance(uint256,address)","c0a06ecb":"infoWithdraw4()","c0a0b5fa":"getKilledArray(uint256)","c0a14da4":"isTeamLockInPeriodOverIfTeamAddress(address,address)","c0a150b3":"RovaZoneBToken()","c0a1a949":"x15()","c0a1b72a":"totalSupplyWithOutBonus()","c0a1e525":"createDaoPOLSKAtokens(address)","c0a2203e":"insert(address,address)","c0a239e3":"valuePerShare()","c0a28014":"setTreeStructure(address,address)","c0a2d9b3":"EssentiaToken()","c0a35d62":"burnReturn(address,uint256)","c0a35e8b":"getTokensMintedAt(uint256)","c0a36345":"getTokenOwnerRewardPercent()","c0a39fb0":"blockTransfer(uint256)","c0a41466":"etherSender(address,uint256)","c0a42d91":"SignatureInvalidity()","c0a5bcbd":"DefaultCents()","c0a7639e":"checkIfAddressIsWhiteListed(address)","c0a7f894":"MAVCash(uint256,string,uint8,string)","c0a843a1":"getCurrentUserRefBonus()","c0a8694d":"NamableAddressList(string,bool)","c0a899f2":"transferAsChild(address,uint256,address,uint256,uint256,bytes)","c0a8fb73":"FlightDelayController()","c0a9066b":"LogValentineRequestCreated(string,string,string,address,address)","c0a9581d":"sendFee(uint256)","c0a963c9":"notifyWinner(address,uint256)","c0a99a83":"oneTokenInUsdWei()","c0aa18e7":"History()","c0aa3b21":"ownerTokens()","c0aa7e2e":"cancelInvoice(bytes32)","c0aace0b":"totalKitties()","c0ab5704":"setVesting(address,uint256,uint256,uint256)","c0ab86bd":"SBSolutions()","c0abf829":"tokenCreationMinMile2()","c0ac3d1c":"PRE_ICO_BONUS_RATE()","c0ac9983":"tokenURIPrefix()","c0ad7427":"saleTokenSupply()","c0adb725":"AuthCancel(address,address)","c0adc465":"getCurrentBonusRate()","c0ae6a3a":"ultimateOutcomes(bytes)","c0aee5ba":"THAW_CYCLE_USER()","c0b14de7":"setLandLimit()","c0b204a6":"TeamWalletAmount()","c0b241d7":"icoRate()","c0b332c1":"moveCharge()","c0b3569d":"setAssetProxy(address)","c0b3870a":"withdrawJackpot()","c0b39e68":"unfinalize()","c0b3aff3":"INCREASE_RATE()","c0b3dab3":"Devilsbest()","c0b4d404":"setGrowingControlStartAt(uint256)","c0b4e657":"HongkongerCoin()","c0b4fa6d":"_reward(address[])","c0b6762c":"SILVER_AMOUNT_XPER()","c0b6f0c2":"NextRoundAndEvents()","c0b6f561":"initiateOwnershipTransfer(address)","c0b75b7d":"setMinContributionAmount(uint256)","c0b7eba4":"game_allocation()","c0b82515":"gzeUsd()","c0b84bfe":"setFee(uint256,uint8)","c0b8a80d":"CVAlejandro()","c0b92612":"changePig(address)","c0b9b36a":"bountyTokensBatch(address[],uint256[],string)","c0b9b8ce":"releaseToAdvisor(address,uint256)","c0b9ecc8":"getNames(address,uint256,uint256)","c0ba6adf":"gemDefenseConversion()","c0bac1a8":"isMigrated(string,string)","c0bb20a6":"setBonusSale(uint256,uint256,uint256)","c0bb6c27":"setTotalPersistLimit(uint256)","c0bb8466":"WithdrawFees()","c0bd3f40":"dumpData(uint256,uint256)","c0bd8351":"getGameId()","c0be3e9a":"removeOffChainAddresses(address[])","c0be4b51":"genWeeklySecondPrizeKey(uint8[4])","c0be7ad3":"freezeAccountDirect(address,bool)","c0c116d5":"getStringValue(uint256)","c0c133a8":"DATE_ICO_END()","c0c19d29":"mock_length()","c0c1b107":"changeOraclizeGasPrice(uint256)","c0c1b18e":"getDepositSize(address)","c0c1cf55":"executeAction(uint256)","c0c1eebc":"addToken(address,bytes32)","c0c2c087":"getOrdersInfo()","c0c3da9c":"totalSupplyLocked1Y()","c0c4440a":"totalAmountOfCrowdsalePurchases()","c0c47e12":"getDeal(bytes16)","c0c4d8a8":"Fundraiser(address,address,uint256,uint256,address,uint256,bytes32,uint256,uint256,uint256,uint256,uint256)","c0c53b8b":"initialize(address,address,address)","c0c602d9":"tokenAssigned()","c0c620d2":"DroneToken(uint256,string,string)","c0c6a430":"BadTronToken(address,address)","c0c6a68a":"setMockedBlockNumber(uint256)","c0c76940":"StopperCoin()","c0c77236":"resetHolder(bool)","c0c77b71":"changeRegistrationStatusForGoldWhiteList(address,bool)","c0c81969":"tokenSupplies(uint256)","c0c83c0d":"getDebtById(uint256)","c0c8821a":"icoRuleUpdate(uint256,uint256,uint256,uint256,uint256)","c0c8b567":"registerCertificateHash(address,bytes32)","c0c8ccb3":"PreHELIX()","c0c91e6d":"getMinPriceSale()","c0c95917":"BrinkzSupply()","c0c98d6f":"setProof(uint256,bytes32)","c0cab256":"ZZWHToken()","c0cad302":"setNetworkName(string)","c0cc365d":"setExpirationTime(uint256)","c0cc6eb1":"rejectPayment(bytes8)","c0ccc863":"NacContract(uint256,uint256,uint256,address,uint256,uint256)","c0cd1ec1":"recordLog(uint256,address,uint256,uint256,uint8,uint8)","c0cd2e32":"chargeWeeklyRate(bytes32,address)","c0cd54c6":"GetGameType(address)","c0cf067b":"deathData_v7()","c0cf22e9":"setSendGiftPrice(uint256)","c0cfa7e5":"startDispute(uint256)","c0d061f4":"execute(address,uint256,bytes32)","c0d0aa69":"daoMultisig()","c0d129d4":"BallotPreferential()","c0d13a6d":"MIN_BUY_ETHER()","c0d26946":"randomNumber(address,uint256)","c0d2834b":"DataSource()","c0d3f378":"specialManagerListMap(uint256)","c0d470a6":"setCCH_edit_23(string)","c0d4fa0c":"emitFeePeriodDurationUpdated(uint256)","c0d6568d":"FEATURE_TRANSFERS()","c0d6ce63":"punksRemainingToAssign()","c0d75442":"TOKEN_SALE()","c0d84ce5":"TransferFrom(address,address,uint256)","c0d8b0b8":"setPetAuras(uint64,uint8,uint8,uint8)","c0d910cd":"getTankOwner(uint256)","c0d9f997":"transperrun()","c0dab516":"adminPercent()","c0db4dd7":"TRANSACTION_MIN_IN_ETH()","c0db8dd8":"allowToLock(address,address)","c0dcf63a":"isLastRaceFinsihed()","c0de3d71":"TransactionCancelledICAP(bytes32,uint256,string,address)","c0df77d0":"getRefName(uint256)","c0e06ca3":"whitelistAddressPresale(address,uint256)","c0e093f1":"AirdropMultiple(address[],uint256)","c0e17c61":"TenStepTestCoin()","c0e18579":"ONETIMESOLD(uint256)","c0e19314":"divideFractional(uint256,uint256,uint256)","c0e1e272":"buyToken(uint32,uint32,uint32,address)","c0e22f31":"frozenStatusOf(address)","c0e31001":"avatar(address,uint256,bytes)","c0e3153c":"balanceSub(address,address,uint256)","c0e317fb":"addToBalance()","c0e33275":"perTokenAmountMax()","c0e37b15":"transferData(address,uint256,bytes)","c0e59e4d":"lastRateUpdateTimeForCurrency(bytes4)","c0e5fbb6":"unlockBalanceOf(address)","c0e71f54":"toKeyValue(string,string)","c0e738ef":"summAdvisors()","c0e789cc":"friendsFingersWallet()","c0e793c2":"transferOwnership(string,address)","c0e79a11":"setAllowed(address)","c0e8ad51":"LydianCoin()","c0e9118e":"killAllXAITActivity()","c0e91320":"finishPVEBatch(uint256[])","c0e91569":"GRCToken()","c0ea09d7":"rest()","c0ea537b":"amountOfTokensPoolD()","c0ea6ff5":"test3_search()","c0eaded2":"makeDeal(uint256,uint256,uint256,uint256,uint256,string,address,string,address,uint256,uint256)","c0eb2325":"scheduleTransaction(address,bytes,uint256)","c0ebc67a":"SimpleStateChannel()","c0ebdba1":"InvestedOtherCrypto(address,uint256,uint256)","c0ec55a5":"buyPokemon(address,uint256)","c0ed969a":"updateBackend(address)","c0edec55":"CroatiavsDenmark()","c0ee0b8a":"tokenFallback(address,uint256,bytes)","c0ee57a5":"giveReserveTo(address,uint256)","c0ee6db8":"_lockToken(address,uint256)","c0efa161":"getDeveloperReservedBalanceLimit()","c0f0c21c":"updateMaxTokenLimit(uint256)","c0f0e925":"getPercent3(address)","c0f11a1b":"addressArrayContains(address[],address)","c0f16fab":"checkAllowedContribution(address,address,uint256,uint8)","c0f17d13":"ChessCash()","c0f3622c":"updateRates(uint256,uint256,uint256)","c0f3ab76":"B2BCoinContract()","c0f40163":"issueFTT(address,uint256)","c0f496ac":"ecosystemAllocation()","c0f4bfa4":"nbSellers()","c0f4d29b":"setLocation(uint256,uint256)","c0f4f41e":"changeRefresherFee(uint256)","c0f57529":"eth_seed_amount()","c0f5a9cb":"deleteThing(bytes32[])","c0f5b5f7":"setSecondRoundPricing(uint256)","c0f5dc97":"totalSupplyUnlocked()","c0f64f43":"attachAsset(uint256)","c0f65734":"SignedDigitalAsset(string)","c0f68859":"getMinimumGracePeriod()","c0f6a3f9":"reserveVaultAddr()","c0f6c0da":"getTokensFromEth(uint256)","c0f6c7b8":"getIdArray(address,uint256,string,string)","c0f70d5a":"IOUSupply()","c0f7c498":"create_planet()","c0f8275e":"detailsOf(uint256)","c0f8940c":"decode()","c0f8de32":"shouldThrowOnAttemptToTransferToNullAddress()","c0f96105":"Enabled()","c0fd43b4":"lastNonce(address)","c0fdba2d":"YCBIToken()","c0fe6c92":"isClientAddedBefore(address,address)","c0feb62d":"fundRaisedDuringPublicSale()","c0feee42":"Error(bytes32)","c0ff3ebc":"ILFManager()","c1009f1b":"testInitialLedgerBalance()","c1013658":"createAsset(uint256,bytes32,uint256)","c1021099":"DBDVToken()","c1039215":"PresaleExtended(uint256)","c10435cc":"lastEruptionTimestamp()","c1061561":"shut_down()","c1072279":"unicornBreeding()","c1075329":"withdrawFunds(address,uint256)","c10796df":"_performTransferToICAPWithReference(bytes32,uint256,string,address)","c107aa6f":"addAssociatedAddress(address,address,address,uint8,bytes32,bytes32,uint256)","c107b9b8":"CTCB()","c107e109":"addFactory(string,address)","c1082c00":"YBananaCoin()","c108adab":"setChangeFee(uint256)","c108d542":"distributionFinished()","c1098e2e":"preSaleFirstCap()","c109e024":"blockdif()","c10a0840":"CryptoChallenge()","c10b30c0":"unlockPurchasedTokensClaim()","c10b9358":"saleEnd()","c10be521":"gapFactor()","c10bef22":"ConditionsAdded(address,uint256)","c10c0bd3":"logMatchdayResults(int16,string)","c10c3463":"addProduct(string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","c10c3546":"setEscrow(address)","c10ce2b0":"calculateDiffPercent(uint256,uint256)","c10d0f11":"didChangeCollateral(bytes32,address,uint256)","c10dd4c6":"getEvents(bytes32[],address)","c10e5fe7":"GemCoin()","c10e7dfe":"bonusInited()","c10e9ba0":"isClientIdentRejectedOf(address)","c10eb14d":"_withdraw()","c10efd2f":"compareResults()","c10f1a75":"proxyFactory()","c10f5075":"KudosPoll(string,string,uint8,uint256,uint256,uint256)","c10fa635":"channelParticipantCount(uint64)","c10fa789":"withdrawalsVotes(address,uint256)","c10fbf0e":"reDraw()","c110afe2":"Percent(uint256,uint256)","c110e6a0":"HealthCoin()","c111368b":"vestingsRemainBalance(address)","c112411e":"_clarifyPVPSchedule()","c112601c":"transferLibOwnership(bytes32,address)","c1127f90":"PresalePool(address,uint256,uint256)","c112a083":"finalizeChangeName()","c112dfa3":"changeDecimals(uint8)","c11301d4":"getSaleContractTargetEtherMax(address)","c113d195":"XECToken(string,string,uint8,uint256)","c11403fc":"maxListingSeconds()","c114301c":"icoPlatformWithdraw(uint256)","c115b06c":"CYFToken()","c11645af":"test_threeInvalidAssertFalse()","c116574c":"__update_oraclize(address)","c1165781":"totalSupplyOnIco()","c11737c7":"getFirstBuyer(address)","c11741a9":"submitReview(uint256,bool)","c117cfe2":"TwoDimensions()","c11808da":"getFloor()","c1184537":"changeContracts(address,address,address,address)","c118a9de":"getDiscountOf(uint256)","c119167b":"numberOfExchInEstateNasBob(address,uint256)","c119d019":"collectPayment(address,uint256)","c11a4b47":"Origin()","c11b2252":"equipContract()","c11bd455":"timeOfLastHalving()","c11bf4e3":"execute(uint256,address[],uint256[],uint8[],bytes32[],bytes32[])","c11bf8d6":"CLXToken(uint256,string,string)","c11c0cc1":"getSecondPoints()","c11d9d9f":"minEtherContrib()","c11dde0d":"setManufacturer(address)","c11e1ff3":"getMe()","c11efcdc":"getRaisedForCurrentStage()","c11f49e3":"ETHERNETSUPPLY()","c11fb13e":"trustedProposals(uint256)","c1204caa":"trade(uint256[11],address[4],uint8[2],bytes32[4])","c12076f1":"holderGroupNumber()","c120d1a4":"outingreserveBalance()","c121be4d":"removeAddressManual(address)","c122759f":"issuerDistributedUnits()","c1232366":"gameCloneFee()","c1238940":"bmy(uint256,string,uint8,string)","c123a658":"boostCloneMarket(uint256)","c1243528":"airdropRecord(address)","c1246d39":"simulatePathwayFromBeneficiary()","c124e2ea":"checkBetDozen(uint8)","c1257bad":"testPassingAProposal()","c1258f69":"txCount(address)","c1263215":"calculateObtainedJOY(uint256)","c1266227":"pow2Bounds(int256)","c12692dc":"tokenRaise(address,uint256)","c12719a7":"EthPriceDependent(address[],uint256,bool)","c1273676":"fundingUnlockTime()","c1273ba0":"likeCelebrity(uint256,uint256)","c127ae41":"getSignatureHash()","c127c247":"addMember(address,string)","c127ee20":"SearchUserPurchase(string,string)","c128c9e7":"GetBuildingData(address,uint256)","c1292cc3":"lastId()","c1294224":"payoff(address)","c12954fa":"restartMinting()","c129827b":"_setSpecialityValue21(uint256)","c12a0fd7":"removeReverseRate(address[])","c12ae5e9":"blocksInFirstCapPeriod()","c12af1ce":"fipsRegister(uint256,bytes)","c12b2513":"assignSubBroker(uint256,address)","c12c202c":"getGrapesSinceLastHarvest(address)","c12c2eb3":"abstractENS()","c12c31d6":"listAllAdmins()","c12d7b01":"Error(uint16)","c12d97de":"DevGiveBlockReward()","c12dec39":"_fetchOrdersForMerchant(address)","c12e760e":"agreeFromDrone()","c12eb191":"updateEarlyParticipantWhitelist(address,uint256)","c12edde6":"EURValue()","c12f48e3":"AssetRegistered(address,string,string,string,uint256)","c12fac40":"oneHundredThousand()","c13026b0":"changePresaleCap(uint256)","c13051d7":"getCellsInfo()","c1309aea":"getOfferor(uint256)","c1310951":"createNewDepositContract(uint256)","c131acdf":"GetBestTokenCount(uint8)","c1321111":"setSaleLength(uint256,uint256,uint256,uint256)","c132bc18":"balanceWosPoolForThirdStage()","c132dd4f":"authorizedCreateTokensToPrivate(address,uint256)","c1331bc3":"setBlacklistSpender(address)","c1333a9c":"setPurchaseRequirements(uint8,address[],uint256[])","c134bc92":"hell()","c13517e1":"createDispute(uint256,bytes)","c135a2d8":"getBackgroundValue(uint256)","c135c040":"gzePerEth()","c1374d5a":"EtherUSDPriceFactor()","c138195c":"icoEtherMinCap()","c1381ea3":"DutchExchangeProxy(address)","c13862ea":"setBoardRating(uint256,uint8)","c13982ee":"checkCap()","c13992b4":"Metadium()","c13a135a":"getWinnerOfEvent(bytes32)","c13ab0fe":"WOLF4()","c13afa91":"object_locations(uint256)","c13b22ef":"setTokenTransferFeeAbs(address,address,uint256)","c13b37c7":"updateIsRevertedEndTimeReached()","c13b3895":"getHype(uint256)","c13b72a8":"registerCDP(uint256)","c13c6813":"_addTimelock(address,uint256)","c13ca374":"SimpleSale()","c13e285d":"maxTrialDrops()","c13f4af7":"claim(address,uint128)","c13fb08b":"breedOnAuction(uint256,bool,uint256,bool,string,string)","c140635b":"audit(bytes32)","c1408cda":"getDataFromAddress(address)","c141e6da":"ERC721ReceiverMock(bytes4,bool)","c141ed74":"calculateCrowdAmount(uint256)","c14248a2":"lrcSent()","c1429c11":"ChainStarToken()","c143a372":"TokenTransferFrom(address,address,uint256)","c143ab2c":"crowdSaleStop()","c143f701":"getRequestFundInfo(uint256)","c1440167":"Voterplayer()","c1441172":"setBlackFlagRequest(uint256,uint256)","c144734c":"getUploadTypes(uint256)","c1448284":"approved(address,uint256)","c144a510":"ADDR_WITHDRAWAL2()","c144a5db":"Bytelending(uint256,string,string)","c144d7dc":"buyMine(uint8)","c14634cf":"KudosTokenSale(address,uint256,address)","c1468587":"mainwallet()","c146eb02":"UNOPEN(string,string,uint256,uint256,bool)","c148002c":"latestUnlockStage()","c148e20e":"FCCToken(string,string,uint256,uint256,bool)","c14958cb":"giveUp(address,address)","c1499199":"_uncreditUser(address,uint256)","c14a2455":"balDailyLotto()","c14a3b8c":"mintTimelocked(address,uint256,uint256)","c14a6046":"payerContract()","c14a932f":"signedTransferFromSig()","c14a9f05":"challenge(address,uint256,uint256)","c14ab7a1":"PredictTheFutureCaller(address,uint8)","c14bafb1":"lastPurchaseTime()","c14bfd29":"hasAlreadyVoted(uint256,address)","c14c1ce3":"requestUpdate(uint256)","c14c5574":"Gold(address,address,int256,address)","c14c7bd7":"performRead1()","c14d2358":"init(address,uint256[],uint256,uint8,uint256,bool)","c14d3abe":"enableSuperUser(address,bool)","c14e50ce":"setValidater(address)","c14e61ba":"overdraftTotal()","c14e6cd0":"changeTransferLock(bool)","c14e7a3f":"setCooldown(uint16,uint32)","c14e9f58":"submitBlockHeader(bytes)","c14edad2":"teamDistribute()","c14f42fd":"mLoadAndReturn(bytes32)","c14fbd64":"satoshiMood()","c15185f5":"getAuditPrice(uint256)","c151ac55":"_createMovie(string,address,uint256)","c151c5ad":"getSignerTable()","c15294a1":"creatGameBet(uint256,bytes32)","c152d3eb":"setKYCTeam(address)","c1531ecc":"changeIssuer(address,bool)","c1551fc8":"QuadCoreChain()","c1554658":"changeDepositorLimit(uint256)","c155836d":"LuCyToken(address,string,uint8,string,string)","c155cfde":"_preAllocateTokens(address,uint256)","c1560a14":"hardCapInUSD()","c1562547":"checkUser()","c156ef6b":"_createPainting(address,uint256,uint256,uint8,uint8,uint256,uint256)","c157b869":"totalUsdValueOfAllTokens()","c157d72c":"itemInfo(address,uint256,bytes)","c1596534":"addReserve(address,uint8,bool)","c1598f6a":"newWage(uint16)","c1599011":"conversionRateOfState(uint256)","c1599bd9":"X()","c15a6791":"oneShotTokenRepartition(uint256)","c15ae376":"_shareToDistribution(uint256,address,uint256,uint256)","c15aec44":"totalGasUtilizing()","c15c09b5":"admin_set_exchange_rate(uint256)","c15d0b10":"getLoanValue(bool)","c15d15da":"_isValidSignatureAndData(address,address,bytes)","c15d7bca":"setEthToTokenConversion(uint256)","c15e47c4":"getFirstBatch(address,address)","c15e61c0":"Authorization()","c15f05fb":"changePrimaryArbitrator(address)","c15f618a":"purchasePokemon(uint256)","c15f68f0":"Retired()","c15f817d":"_import_island(bytes32,address[3],uint256[7],uint256[8])","c15f8779":"get_previous_item_in_state_from_item(bytes32,bytes32)","c1614981":"allocateLocked(address,uint256)","c1615945":"setAffiliateContract(address)","c1615c87":"DEFROST_PERIOD()","c161d506":"CollabCoinToken()","c162ba2f":"walletId()","c162bc03":"clearProposal(address)","c163bba7":"publish(string,string)","c163edf7":"OutcomeEvent(string,uint256)","c163fb0e":"ownedHouses(address)","c1640913":"RETAINED_TOKENS()","c166311f":"freeLotterySeconds()","c166c458":"getUserRequestCount(address)","c166ee38":"sweepAccount()","c1670257":"redeemContractSentTokens(address,uint256)","c1674b74":"assertReadyToClose(uint256)","c167d1cd":"getAvailableSupply()","c1684711":"migrateTokens(address)","c16849c0":"tokenSC()","c1687877":"buyTokens(uint256,uint256,address)","c168e037":"getCustomerPremium(uint256)","c1691fc3":"add_bonus(uint256)","c1694bd4":"TransferDetails(string,uint256,string,uint256,uint256,address[])","c16959b2":"_unpackRaceFinishData(uint256)","c1699a99":"stakePeriod()","c1699bf6":"setPrimaryAccount(address)","c169ec0d":"setBuzzCafe(address)","c16ac06f":"CM()","c16ae3ce":"_receiveFrom(address,uint256)","c16b451f":"_checkedTransfer(address,address,uint256)","c16b9374":"regularEndGame(address,uint32,uint8,uint16,uint256,int256,uint256,address)","c16bca13":"MIN_AUDIT_TIME()","c16c0851":"miningOneSelf()","c16d1377":"IS_CND_CONTRACT_MAGIC_NUMBER()","c16d3344":"setMinimumOfferPrice(uint256)","c16d515a":"_createCenturion(address)","c16e50ef":"validate(bytes)","c16f402c":"getEpisodes()","c16fe907":"getTransfer(uint256)","c1707f66":"stateSetOpen(uint32)","c170fd54":"bid(uint40)","c171747b":"convertEthToMet(uint256)","c1717f80":"BC2Token()","c171cfa6":"getBetValueByGamble(uint8,uint8)","c171fb91":"referrerLevel1Percent()","c172085e":"initialization()","c17281d0":"refundPartial(address,uint256,uint256,uint256)","c172aae5":"getIdentifier(uint256)","c172f9c9":"receiveApproval(address,uint256,address,bytes32)","c1733712":"authorizePayment(address,uint256,uint256)","c1733f68":"getToken(string)","c173508b":"removeConnection(address,address,bytes32)","c1736222":"tokenForSPSold()","c1739b69":"InfraOfOwner(address)","c1747585":"testEvent2()","c1751903":"lockBreak()","c1756a2c":"sendEther(address,uint256)","c1758fee":"vest2mlDevelopers(address,address)","c1766657":"addBonusForMultipleHolders(address[],uint256[])","c176b1d8":"deletePriceIdv(bytes32)","c176d42a":"NavGlobalTourCoin()","c176e639":"payout(address[],uint256[])","c176e73b":"pkt()","c177c20f":"CliToken()","c177e804":"WEETtoken()","c177f22e":"findKingdomCalled(string)","c1784a4e":"safekey(uint256)","c1786ab2":"pre(address,bytes32,bytes32)","c178a2d4":"CreationContract()","c178fc87":"setTokenRate(uint256,string)","c1790561":"_getPetBonus2(uint256)","c179186e":"collectWinnings(uint256,uint256,uint256)","c179520c":"ManageAccount()","c17a099b":"presaleBonusTokensDistributed()","c17a893e":"transferAUTOtoken1(address[])","c17b5a93":"ProfitExchange()","c17b9770":"log2Floor(int256)","c17c0456":"ownerCEO()","c17c3521":"setHourlyRate(uint256)","c17ccc6c":"withdrawUnlockedTokens()","c17d8720":"checkBank(string,address)","c17de343":"isStarOwner(uint256,address)","c17e2aa1":"burnAllTokens()","c17e6817":"sendSafe(address,uint256)","c17e92b6":"unregisterFromBlacklist(address)","c17ed7bd":"purchaseSilver()","c17f23e8":"getRoundID()","c17f8891":"setEtherFeeMin(uint256)","c17ffac6":"unsetRegionForSale(uint256,uint256)","c180e1d0":"GCPToken()","c1811783":"FreezableToken()","c1812b15":"reorganizeOwners()","c1826d78":"Collect()","c1829a14":"testFailTooFewConfirms()","c182f531":"GetFreeEther()","c183660c":"cancelJobContract(uint256,string)","c18378a0":"sellTokensFrom(address,uint256)","c18384ec":"setRestricted(address)","c1838e92":"proposeTokenOwner(address)","c1839258":"LogTokenPurchase(uint256,uint256)","c1840b39":"_generateRandom(bytes32)","c1857bf7":"withdrawFoundation(address,uint256)","c185d772":"emissionStages(uint256)","c185e492":"preSaleThirdPrice()","c186dcbf":"getStaticArraySum()","c18715f8":"prolongationPermitted()","c1873e26":"releaseCoreTeamAccount()","c1889ff2":"payAccTax(uint256)","c188f44b":"addproduct(string,string,uint256,string)","c1891ac6":"multiplePing(address[])","c1899ca7":"request_dividend(address)","c18a40c7":"multiowned(uint256,address[])","c18b4136":"AAC()","c18b5279":"KFHToken()","c18b8db4":"listings(bytes32)","c18b9760":"test_insert_findWithHintPrevDecreased(int256)","c18bca5f":"setCollectionAddress(address,address)","c18ca54c":"testEvent(int256,int256,uint256,uint256,string,string)","c18d767a":"weiMinSalePreIco()","c18e8903":"totalWeiRaisedDuringICO4()","c18e94b4":"Keizer()","c18edde1":"saleopeningTime()","c18f4831":"burnFeeDenominator()","c1908360":"createEntry(string,string)","c190b129":"holderState()","c1912433":"acceptAndPay(bytes32,uint256[],uint256[],int256)","c1918e90":"accountAddressForSponsee()","c191cbd7":"TeamTokensAllocated(uint256)","c191d37d":"Escapable(address,address,address)","c1927292":"TIER1_BONUS()","c1929d8c":"ADVISOR_THREE()","c192ca98":"isCS(address)","c1932833":"maxAirdropParticipants()","c19358bb":"setPropertyLastUpdater(uint16,address)","c193fbf8":"pushArray(bytes32,address)","c19455c8":"signedTransferCheck(address,address,uint256,uint256,uint256,bytes32,address)","c1955e62":"spend(uint256,bytes32)","c195dc41":"getStageEndDate()","c19678d5":"canLotteryBeExecuted()","c196b54f":"bound(uint256,uint256)","c1971240":"dailyGrowthUpdated_date()","c197a7b1":"getLastStoragePayDate()","c197cdee":"preSaleTokenLeft()","c1989276":"MaxItems()","c1991040":"getCurrentVotingDescription()","c19a8095":"deleteUser(address,address)","c19bbf50":"getLockStatus(address,address)","c19c9a21":"CCTHCoin()","c19d7808":"MamaBearToken()","c19d93fb":"state()","c19da6b2":"canBuy(address,address)","c19dccd8":"KantrotechCoin1(string,string,uint256,uint256)","c19dd320":"cancel2(uint256)","c19e33ce":"COIN_SUPPLY_ICO_PHASE_0()","c19e7b00":"WeiCapChanged(uint256)","c1a06de3":"Valens()","c1a12d66":"crowdsaleOpen(bool)","c1a21bf3":"sellerBalances(address,address,uint256,address)","c1a2a8f4":"boards()","c1a2babc":"getMemberSince(address)","c1a38768":"STARTUP()","c1a3bb06":"total_bet_withdrawn()","c1a3bda5":"randomQueryID()","c1a6ec6a":"ADVISORY_TEAM_PORTION()","c1a7db7b":"MtcDailyLimitChange(uint256)","c1a82cdb":"reissueCertWithID(bytes32,bytes,bytes32,uint256,bytes32,bytes,bytes32,uint256,bytes32)","c1a85e16":"test_insert_findWithHintNextUpdateTail()","c1a9953f":"checkRokTeam()","c1aa049d":"getIsPurchased(address)","c1aa104e":"OpenRetailContract(uint16,bytes32,string,string)","c1aa5d98":"getGameIdByAddress(address)","c1aa721d":"lockAfterManuallyMint()","c1aaa717":"_bountySupply()","c1ab1b54":"RebateCoin()","c1abbf6a":"addjoinlist_even(address,uint256)","c1ac7902":"playJackpot()","c1ad5bea":"isdeposit()","c1ad7925":"finalizeFunding(address)","c1adb83e":"NecashTokenBase()","c1ae36d0":"carsOf(address)","c1ae4044":"checkBetColor(uint8)","c1af5785":"enterLottery()","c1afdd48":"belowSevenBets()","c1b0510a":"GlobalBusinessSystem()","c1b0561d":"PDTToken()","c1b056b0":"getNodeLeftChild(bytes)","c1b06513":"registerEvent(bytes32[])","c1b07b1a":"receiverOne()","c1b082b6":"issueOfTokens()","c1b0dc2f":"LogPolyClaimed(address,uint8,uint256,uint256,uint256)","c1b15e44":"_setAllowance(uint256)","c1b16cb0":"ownerAddAsset(string)","c1b2dfc1":"gameGiftMaxAmount()","c1b36489":"QuickUnionPayChain()","c1b3e6ab":"blockedSum()","c1b43a17":"secondHighestBidder()","c1b43af8":"IPchainStandardToken(uint256,string,uint8,string)","c1b466d6":"calculate0xbtcReceived(uint256)","c1b4aa51":"burnContractCoins(uint256)","c1b58f6c":"unlockAllAllocationAddresses()","c1b664de":"setStageCount(uint256)","c1b668a9":"getBoardInfo(address,address)","c1b68a7c":"DebitClientOnce(address)","c1b73010":"removePauser_(address)","c1b74ad8":"propose(uint256,bytes32,address)","c1b7a892":"AsiaCoin()","c1b8847b":"setMaxFeeWithdrawal(uint256)","c1b8b704":"updateGlobalMax(uint256)","c1b90c7b":"_sendTokens(uint256,address)","c1b99811":"transferPrimordialToken(address,uint256)","c1b9f177":"bountyReserve()","c1ba93e1":"dbkDeposit()","c1bb95d0":"TransferConfirmed(address,uint256,uint256)","c1bbcbef":"MICKTOKEN(uint256,string,string)","c1bc2664":"ClearView()","c1bd1e85":"killFeed()","c1bd3685":"proposeSolve(uint256,uint256)","c1bd762b":"wantMyEther()","c1bd8186":"crowdsalepricing(address,uint256)","c1bd8ecb":"initializeCrowdsale(address,uint256)","c1bd9b12":"getShareAddressFromId(uint256)","c1bdff26":"onNewLoan(uint256,address)","c1be4031":"XaurumProxyERC20()","c1beb1e1":"MusereumToken()","c1bf1dcf":"setRegistrar(address,bool)","c1bf22a9":"XAUToken()","c1c02a46":"Atlas()","c1c03094":"EventBattleOver()","c1c0e046":"rescueAccount()","c1c0e9c4":"exec()","c1c1066b":"getCommentsCount()","c1c11c96":"getSender(address,uint256,address,uint256,uint256,uint256)","c1c1d218":"BOND()","c1c28d7d":"calNewTokens(uint256)","c1c379ac":"tokenTwitter()","c1c3eccf":"vestingPeriodInMonths()","c1c43648":"addAction(uint256,uint256,uint8[6],uint8[6],uint16[6],uint8[6],uint256,uint256)","c1c4676e":"updateGameCost(uint256)","c1c5897e":"AOMcoinERC20()","c1c5a3b6":"CaptainSell()","c1c5de4a":"tryDeposit()","c1c64ecf":"mintPriceBuffer()","c1c6c749":"changeWhitelistPrivateStatus(address,bool)","c1c6d4e8":"addLoanProduct(uint32,uint32,uint32,uint256,uint32,bool)","c1c723f4":"validateProposedMonarchName(bytes)","c1c74dde":"_setFunds(address,uint256)","c1c7bc68":"addFreeMineralMulti(address[],uint32[])","c1c8277f":"reclaimOwnership()","c1c8b89d":"Recash(uint256,string,string)","c1cbbca7":"contribute(uint256)","c1cbbe6c":"getRoundAvailableToken(uint256)","c1cbdff3":"moreThanSoftLimit()","c1cc0046":"returnOffer(uint64)","c1cc0775":"calculateFeeDynamic(uint256,uint256)","c1cc6958":"leekStealGo()","c1ccaed3":"pageBuyRecordByAccount(address,uint256,uint256)","c1cd1759":"SpicePayroll(address)","c1cda902":"setTradeable()","c1cdaae8":"generate(address,address,address,uint256,uint256)","c1ce53fc":"reflect(string)","c1ce56eb":"addAccount(address,uint256)","c1ce6647":"minAmountToGetBonus()","c1cfb99a":"get_balance()","c1d038b2":"getSkillIdByIndexAndLevel(uint8,uint8)","c1d11037":"updateAddresses(address,address)","c1d1f5c0":"BirdToken()","c1d1faf3":"createAuction(uint40,uint128,uint128,uint40,address)","c1d22403":"_subFromValueHeld(address,uint256,bool)","c1d25c3d":"insert(int256,int256)","c1d298ab":"emitFeesDonated(address,uint256)","c1d32ad5":"Distribute(address,uint256)","c1d34b89":"transferFromAndCall(address,address,uint256,bytes)","c1d357bc":"getMinAllowedBid(uint256)","c1d4691a":"withdrawalTo()","c1d47a21":"submitPayment(bytes8,uint32)","c1d4bc64":"originalsCount()","c1d4f708":"getMwLength()","c1d55af8":"buy(uint256,address,uint256,bool)","c1d5725f":"buyToken(address,address,uint256)","c1d5e84f":"addNewUser(address)","c1d6036b":"contractExchangeRate(address)","c1d63ce6":"deleteArrayBytes32(bytes32,uint256)","c1d66482":"Postman()","c1d6ab37":"setIsContainerForShareToken(bool)","c1d6cbd8":"getPlayerPoint(uint32)","c1d75bea":"IBM()","c1d9e273":"nextFreeCount()","c1da3923":"ICOstartTime()","c1dbbfb3":"withdrawAllFromRoot()","c1dbd9b2":"authorize(address,uint256)","c1dbf5ef":"changePTSBAddress(address)","c1de0842":"quarterThird()","c1de93df":"Forwarded(address,uint256,bytes)","c1de9ef8":"getPositionHeldToken(bytes32)","c1dfacb2":"getQualifiersPoints(uint160)","c1e0e604":"updateUsdPerMEth(uint256)","c1e10f65":"distributeeBitcoinCashMedium(address[])","c1e1955e":"getaddressfocuscardid2(address,address)","c1e1b327":"adminCollectPastShopFund()","c1e31eab":"SERVER_TIMEOUT()","c1e3bd3e":"getParticipants(uint256)","c1e41f38":"COMPANY_TOKENS()","c1e457c8":"experienceDelay()","c1e472be":"returnNotes(uint256)","c1e4884d":"setSecondStageStartsAt(uint256)","c1e4dfda":"setPriceWei(uint256)","c1e50f3c":"internalAddManager(address)","c1e5202a":"isUserMakerFeeEnabled(address,uint256)","c1e52775":"addDenomination(bytes8,address)","c1e5304a":"CreateNewDraw(uint256,bytes)","c1e59a50":"Example4(string)","c1e6102b":"LunyrToken(address,address,uint256,uint256)","c1e65cb9":"BTRS()","c1e68672":"totalWhitelistedFunding()","c1e68e4b":"developer_string_D(string)","c1e6c506":"TokenPriceInWei(uint256,uint256)","c1e70e63":"startManualPeriod(uint256)","c1e71903":"getResults(uint256,string)","c1e7310a":"signEA(uint32)","c1e74d71":"minPresaleContributionEther()","c1e99a0e":"isInitialInvestor(address)","c1e9c53e":"Lottery(uint8,uint256)","c1ea8b93":"preCrowdsaleTokens()","c1eac693":"ArisaCoin()","c1eb1840":"canBurn()","c1eb3534":"batchMintToPool(uint128[],uint256[],uint128[])","c1eb354a":"setlockall(uint256)","c1eb50a7":"LinaAllocation(address,uint256)","c1eb5ddd":"DEV()","c1eb8c89":"wihtdraw()","c1ec10f4":"RigoBlock()","c1ec4a2a":"RegisterContract()","c1ed41fa":"appliedPresale()","c1ed54a1":"isBetValid(uint256,uint256,bytes)","c1ee22dd":"EMISSION_FOR_SALESTAGE5()","c1ee3375":"autoTransferApproved(uint256,uint256)","c1ef098b":"storeHarvestOperationByRegulator(string,string,string,uint32,uint16,uint16,string)","c1f04f3c":"allWeights()","c1f06e89":"changeYUMOAddress(address)","c1f0dac1":"test_largeDeviationNotPermitted()","c1f0e2c3":"createGameRound(uint256)","c1f10663":"withdrawAccumulatedFees(address)","c1f16bdc":"getWeiBalance(address)","c1f18e38":"isExpired(bytes)","c1f19220":"summFounders1()","c1f1d116":"internalVote(bytes32,address,uint256,uint256)","c1f307c9":"_isTime()","c1f45e80":"sendForPreICO(address,uint256)","c1f52604":"winningPrice()","c1f573ca":"bidInAuction(uint256,uint256,uint256)","c1f62946":"getSecretRevealBlockHeight(bytes32)","c1f64cb0":"supportedRoleList(uint256)","c1f77309":"assignedPayoutAddress()","c1f7c539":"initPricer()","c1f8056b":"createAvatar(address,string,uint256)","c1f979ab":"add_recent(uint256)","c1fa1ed0":"assertEq(bytes32,bytes32,string)","c1fae25b":"receiveAirDrop()","c1fb7c34":"hmin(uint128,uint128)","c1fb9b9e":"developer_How_To(string)","c1fcf863":"getSoftwareExecRecord(uint32)","c1fd2580":"spendable_supply()","c1fd4339":"createMarket(bytes32,uint256,uint256,address)","c1fe5281":"minPurchaseNum()","c1ff808d":"changeBonus(uint256)","c1ffc0a5":"MinimumEthereumInvestmentUpdated(uint256,uint256)","c2006a18":"set_fixedFeeInCWC(uint256)","c201293b":"setCollateralPoolContractAddress(address)","c20155df":"ethRate2()","c201df97":"UnLockAddress(address)","c2021d1b":"maxTeamBonusBps()","c203367a":"EnddatePresale()","c2038560":"setOutcome(bytes,bytes)","c203d77f":"setSaleFinishTime(uint256)","c204505a":"testFailRetractLatestRevisionDoesntHaveAdditionalRevisions()","c204642c":"airdrop(address[],uint256)","c204b288":"InvestorChanged(address,address)","c204f9f1":"_transferFromToICAP(address,bytes32,uint256)","c2052403":"payOut()","c20547b3":"getGameAmount(uint256)","c205afd4":"deferredTotalTokens()","c205e64c":"revokeInsertAgentAuthorization(address)","c20615ed":"ownerWithdrawn()","c20652fe":"setApiAddress(address)","c2083f55":"lacksFunds()","c2091d0e":"getPatron(uint256)","c209fbe9":"change_notice(string)","c20a20d6":"setBlipTokenAddress(address)","c20a6ae9":"EDMToken(address,uint256)","c20c0f3a":"betsForLevel(uint256)","c20c1d9b":"newWithdrawCommission(uint256)","c20e346f":"unFrozenToken(address,uint256)","c20ec5dc":"numberOfFriends()","c20f966b":"Utcoin()","c2108a92":"calculateBalance(uint256,uint256)","c210c623":"getKeys(uint32)","c21191ae":"GechainCoin()","c2127e03":"getMyShrimp()","c212bad5":"dropModule(string,bool)","c212cffa":"NUGOLD()","c215290a":"frozenUntil(address)","c215e800":"currentSubRound()","c2161c31":"getStringHash(string)","c2168ecd":"removeMintContract(address)","c216c0d3":"addCredits(address)","c217a724":"spendWithGasAndData(address,uint256,uint256,bytes)","c217c0e1":"ClickGemTokenERC20()","c2190c94":"registerSettlement(uint64,address,address)","c219c28c":"votingTokenAddress()","c219d326":"getData_14()","c21aa2e4":"PoHarj()","c21abf05":"tatalEthFromBuyer()","c21afa55":"MintingManagerRevoked(address)","c21afe12":"schedulePriceUpdatesRolling(uint256,uint256,uint256)","c21bbe56":"SetupDone()","c21c45e3":"iconRate()","c21c5ee1":"fixSpecications(bool)","c21c9c21":"validEvent()","c21d0204":"SetEvaluate(bytes32[],uint8,uint64[])","c21d5ab7":"setNode(address)","c21db033":"removeSupplier(address,address)","c21de274":"transferReverseProxyThirdParty(address[],uint256[],uint8[],bytes32[],bytes32[])","c21e5712":"makeLiquidCor()","c21ea693":"retraitStandard_3()","c21ec92c":"getAssetIpfs(uint256)","c21ed112":"genesisVirus()","c21fb125":"SpecificApproval(address,address,uint256)","c21fcffb":"DIYTubeCoin()","c2205ee1":"_authority()","c2222b80":"claimSubscriptionDeposit(uint256)","c222ef6d":"periods(bytes32)","c2234f67":"CONVERSION_DENOMINATOR()","c2235e74":"getTotalAmountOfChatMessages()","c2236b26":"setICO3Phase()","c2239daa":"setselfdropamount(uint256)","c223f557":"stopRedeeming()","c2248877":"getBarCodeDataCount(bytes32)","c2248c22":"changeOldTokenReward(address)","c2250a99":"transferStoreOwnership(address)","c225752c":"OneChanceCoin(string,string,uint8,address,address)","c22598d2":"BitClemm()","c225bf03":"resetContractDeploymentDate()","c226d279":"setMiniPoolEdit_7(string)","c226d9ee":"doTest()","c2276090":"settleBet(bool)","c227cee0":"shutThatShitDown()","c2289576":"AddTitle(uint256,string,string,string,uint256)","c228bcc6":"getFillVolumes(bool,bytes,uint256,uint256)","c2299e33":"shutdownMarket(bytes32)","c22a146c":"Unlock(address,string,bytes32)","c22a933c":"setBaseDeposit(uint256)","c22ab4e0":"reservedWallet()","c22af7ff":"ComputeBuy(uint256)","c22c4f43":"services(uint256)","c22d6c3c":"setArenaInterface(address)","c22f0ee2":"transferManagers(address)","c22f1c54":"_initializeAccount(address,address,uint256,uint256)","c22f8250":"updateStandard(bytes4,bytes4)","c22fc384":"exitScam()","c2304c4a":"addExplicitPosition(uint32,int64)","c2314be4":"CONFIG_FEES_DIV()","c231bace":"setMigrationTarget(address)","c232209e":"_verify(address,string)","c2328516":"disablePrivateFund()","c2329e5f":"_isNotOnSale(uint256)","c233e870":"isLatestPatchTree(bytes32,bytes32)","c2353918":"getCount(uint256)","c2356d23":"mintChest(address,uint16,uint24,uint24,uint8,uint8)","c235a5c7":"getGameStart(uint256)","c235e858":"VendorInterface(address)","c2362dd5":"lastEpochBlock()","c23693e0":"multiAccessRequired()","c23697a8":"check(address)","c236cc66":"GeneralUpdate(uint256,uint256)","c2370a62":"openGameResult(uint256,string)","c237898d":"getOwnerBalanceInMilliTokens()","c2381296":"beginPwn()","c2385fa6":"right78(uint256)","c238999b":"dislikeTrack(address,bytes32)","c239dfe0":"PermissionAdded(address)","c23a25ba":"getRoundBetOrigin(uint256,uint256)","c23a7427":"createMultipleWikiPages(string[])","c23b4b5b":"bountyShare()","c23c87d5":"play(bool)","c23da3a9":"initialSaleEndDate()","c23de962":"DefaultActionCalled()","c23e1cea":"SaleTokens()","c23ec301":"KSScidTOKEN()","c23f001f":"balances(address,address)","c23fed45":"setEscapeRequest(uint32,int256,uint32)","c2407089":"CursedToken()","c2410a69":"lockCostPerHour()","c2412676":"Token()","c2427f76":"getBidID(address,bytes32,uint256,uint256,uint256,uint256)","c242afaf":"bet(uint256,uint256,uint256[],uint256,address,bytes32)","c243431e":"AnalyticProxy()","c24366f0":"setKYCProvider(address)","c243bdee":"isHolderOwnAddress(bytes32,address,address)","c24504b7":"internalBuyTokens(address,address,uint256)","c245c1bc":"ownerBurnToken()","c2473378":"consortiumPlaceholder()","c247620d":"getArtistInfo(address)","c2490a67":"removeCardOwner(uint64)","c24924d6":"setQueryFee(uint256)","c2494dbf":"transferOnWallet()","c24977cf":"testPrivate()","c2498be6":"conjureAirdrop()","c24a0f8b":"endDate()","c24a8908":"token_airdrop_cnt_max()","c24a9674":"finalizeLastRound()","c24ad463":"Refundpot()","c24becf3":"getLastTier()","c24c153d":"addRound(uint256,uint256,uint256,uint256,uint256,bytes32)","c24d316e":"UNITDummyPaymentGateway(address)","c24de0e4":"halvingSubsidy(uint256)","c24dec82":"TOKEN_BUSINESS()","c24e1fc1":"issuedSupplyRatio()","c24fe21b":"transferLockup()","c2502d34":"claim_price_money()","c2506eee":"setO3(address)","c2507ac1":"getTokenAmount(uint256)","c2507ef7":"_createPanda(uint256,uint256,uint256,uint256[2],address)","c250a312":"active_withdrawable()","c250ef46":"refSystem(uint256,address)","c25193ad":"lcm(int256,int256)","c251a4e9":"G2Ufund()","c252ca75":"getBonusPercent(address)","c252d844":"rest_time()","c253400b":"RPS(address)","c2535bf0":"COOLCOIN()","c254e4db":"SFT()","c2552497":"impl_mining(address,bytes)","c255343e":"targetUser()","c255fa40":"updateTotal()","c255fb17":"getRefBalance(address)","c25615c0":"joinOneLottery()","c256d578":"getLastAuctionWinsDate()","c256ea58":"get_receiverCryptobank(uint256)","c2571a0a":"percUp(uint256)","c2572c51":"advisorsAndPreICO()","c257c851":"calculateEtherReceived(uint256)","c257eabb":"etherPaid()","c257f3ab":"getNumberOfShipsByOwner()","c258ff74":"List()","c2596b1e":"getDragonPrice(uint256,uint256)","c25a796e":"setHardcupFalse()","c25ab8b0":"iOSCoin()","c25acada":"Bithereum()","c25ae09f":"EthealNormalSale(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","c25b345a":"VivekRohitVibhayToken()","c25c22ee":"stageTokenMul(uint256)","c25cf1d0":"changeLockPeriod(uint256)","c25d0ac1":"tgeSettingsPartInvestor()","c25e6908":"ultimateOutcomes(bytes32)","c25f1901":"addThing(bytes32,string,string,string)","c25f1afe":"SponsorAdded(address)","c25f75fc":"pantry()","c25fe1a4":"changeHoldingTax(uint256)","c2606d99":"BITTECHToken()","c2608314":"getJntBeneficiary()","c260f681":"IsBoilerValid(uint256)","c2610cda":"SecretNumber()","c26181e0":"censorUser(address,bool)","c2619a5a":"AdministratorAdded(address,address,bool)","c26298a7":"getBalanceOfResidualBcoupons()","c262a33b":"preSaleCloseTime()","c262b912":"createCampaign(string,uint256[3],uint256[],uint256,uint256,uint256,uint256,string,int256)","c262df45":"isKnownRequest(address,address)","c26317d1":"RoundRevealStarted(uint256,uint256)","c26381f2":"limitETH()","c264786f":"pauseBlockNumber()","c264a063":"withdrawExcess()","c264a77c":"setSettleTimeout(uint256)","c2656473":"CROWDSALE_LIMIT()","c265a6c0":"KRCPreSaleContract(uint256,address,address)","c26613d5":"LogRebalance(address,bytes32,string,uint256,uint256,uint256)","c2664609":"submitStackholderTransaction(address,bool)","c2674780":"freecommunitycoin()","c2676e39":"VAToken()","c267e4b8":"previousWeiBalance()","c26875a4":"calculateCellBuySimple(uint256)","c268e777":"setDailyHourLimit(uint8)","c269014b":"getMemberId(address)","c2695a25":"Rivercoin()","c2699b1d":"getFirstBuyLimit(bytes32)","c269f263":"PRETDESupplyRemaining()","c26a331d":"bonusProvider()","c26aa3c9":"lockUnicorn(uint256)","c26b41e7":"totalUETsSold()","c26b7ce9":"CashTelexToken()","c26bacd1":"removeDriver(address)","c26c12eb":"getQuorum()","c26c7472":"addTimeToExpiry(uint256)","c26c84ec":"setBI(bytes32,int256)","c26d0412":"ethRate1()","c26d0c2c":"emitWorkPaused(uint256,uint256)","c26d69e1":"OnePercentGift()","c26dd189":"jade(uint256)","c26fe7ce":"releaseVestedTokensFor(address)","c270cbeb":"BtcThumb(uint256,string,uint8,string)","c270ce28":"rdCollectorAddress()","c270d7cb":"getPlayerRoundWinningInfo(uint256,address)","c2710949":"calcValuePerShare(uint256,uint256)","c2714a97":"addBRA(address)","c271ca90":"numMomentsOf(uint256)","c2722ecc":"getStore()","c2723d2e":"token_transfer(address,address,uint256,bytes)","c272f73e":"burnSignature(bytes,address,address,address,uint256,uint256,uint256,uint256,bytes)","c27382d9":"buyAndPlayGame(uint256,uint256,address)","c273b05f":"spentParsecs()","c27509cf":"investDirect()","c27549d9":"setRemainders(uint256,uint256)","c276086f":"createProducer(bytes32,uint256,bytes32)","c2761031":"k(uint256,uint256)","c2765b77":"setLegalToken(address)","c276963f":"tabsOneEthCanBuyICO()","c2775347":"haltsTrades()","c2777ce3":"currentEtherRateInCents()","c277f1ac":"fromId(uint256)","c277fe56":"pause(bool,string)","c2783ee5":"viewCrowdSaleLive(bool,bool)","c2784966":"TkoWhitelist(address)","c279d042":"product4_sell()","c27a65c1":"changeEthPriceQueryDelay(uint256)","c27a74d0":"catOwners(uint256)","c27b2c2d":"collectEarnings()","c27bc67c":"configureKeys(uint32,int256,bytes32,bytes32,uint32,bool)","c27bc7b2":"fortifyClaims(address,uint16[],uint256,bool)","c27c327e":"changeNewRubesUntilPayout(uint256)","c27d1580":"getNorsefirePrice()","c27d607b":"lastEvidence()","c27d7721":"create(uint256[101][])","c27e7398":"getLockedTimeUserInfo(address,address)","c27fc305":"f1()","c280541c":"buy(uint256,address,bytes32)","c2808d1a":"MinSum()","c2812f74":"triggerMinCap()","c281309e":"feeTake()","c28196b1":"addImmigration(address)","c281a013":"FinalizableCrowdsale(uint32,uint32,uint256,address)","c281d19e":"cbAddress()","c283226d":"reclaimTokens(string,string)","c2832430":"withdrawForfeited(address,uint8,address)","c2843a14":"addInviterValue(uint256,uint256,address,address)","c2844c60":"emitJobRatingGiven(address,address,uint256,uint8)","c2845184":"SUPPLY_FOR_REFERAL()","c284ab55":"eLYQD()","c284cdc5":"GetDescript(string)","c2852f38":"pauseContract(uint256)","c2856ca9":"presoldMax()","c285a245":"preferredSaleTLYperETH()","c285daf9":"Xoflife()","c286f3d9":"SetLockAddress(address)","c287820a":"kittensSold()","c287fa72":"calcDiviDistribution(uint256,uint256)","c288ab9d":"getUserCurrentMartialId()","c288eeee":"nowPeriod()","c2897b10":"stand()","c289adfa":"getAssetPrice(uint128,uint128)","c289dbe8":"first_withdrawal(uint256)","c28a56f1":"checkReceiptProof(bytes32,bytes,uint256[],bytes,bytes)","c28a9157":"bullsmasterReq()","c28aafb1":"addWallet(address,string)","c28b4369":"giftCard(uint256,address)","c28b4577":"setPermissionById(uint8,bytes32)","c28bfe5a":"testFailCreateSameIpfsHashAndNonce()","c28c770a":"getLockedTokensPerUser(address)","c28cedf3":"DEMO()","c28d38a8":"STARTING_SEEDS()","c28d5644":"LogMinSell(address,uint256)","c28db642":"tocancel(uint256)","c28dbc38":"grantAccessForToken()","c28de2cd":"upgraded()","c28e5022":"collectAndUpdate(address[])","c28e6e39":"ReducingSupplyCoin()","c28eab85":"setMinimumTokenSell(uint16)","c28ec9d7":"respondToChallenge(uint256[9],bytes,bytes32[],bytes,bytes32[],bytes,bytes32[],bytes,bytes,bytes32[])","c28f57ca":"ICOSaleStart()","c28f812c":"getPaycarnita()","c28f8e09":"icoFunded()","c28f9df1":"requestVestingTrusteeOwnershipTransfer(address)","c290367f":"playDiceCombinations(uint256,uint256,uint256)","c290d691":"pay(uint256)","c291ad27":"Notify_Number(string,uint256)","c291bf6d":"AuthDapps(address,bool,int256,bool,bool)","c291df56":"affPercent_()","c29224ea":"roundFailedToStart()","c292aae3":"McrForGasFailed(address,uint256)","c2930f91":"baseUnit()","c29338cf":"cozyTime(uint256,uint256,address)","c293fc0a":"SetBankerPrincipal(uint8,uint256)","c29402f1":"relistGenesisSales(bytes32,uint256)","c2944f69":"_multiSendOwner()","c2944f7a":"registHolderStep(address,uint8,address)","c294c93b":"getSANOwner(uint256)","c2954ff4":"Sent(address,uint256,bytes)","c2955bdf":"setUserBlacklistedStatus(bool)","c296302a":"transferRoot(address)","c296f721":"_buyLandForCandy(address,uint256)","c29721e0":"sendArena(address[],uint256[],uint64)","c297fa0f":"DEFAULT_DURATION()","c2985578":"foo()","c2992300":"setCreatePrice(uint256)","c29988db":"distributeEbyte(address[],uint256)","c299a394":"getNextRank(address)","c29a6fda":"setERC20(address)","c29d350f":"startTimeOf(address)","c29d9d74":"startMultipass(string,string,string,string,string,uint256,address)","c29e8863":"setImplementation(bytes32,bytes32,address,bytes32)","c2a029f0":"setID_control(uint256)","c2a15dbb":"_currentIcoPhaseBonus()","c2a15e7e":"votingEndsInHHMM()","c2a24b33":"Post(address,string,string)","c2a2747b":"p1()","c2a33485":"setReg3(uint256)","c2a394cb":"AuctionSuccessful(uint256,uint256,address,address,uint256)","c2a48c70":"revokeUserRole(bytes32,string,address)","c2a49237":"memberSellToken(uint256)","c2a5e5c2":"setTwitter(string)","c2a63e3b":"getEmployeeCount()","c2a88340":"Deactivate()","c2a8ec80":"betStats()","c2a95cc9":"updateTrustSettings(address,uint256)","c2a960a1":"signSendFlower(bytes32,string,string,address,string,bytes16,uint256)","c2a96ce5":"EscrowVault(address)","c2a98b41":"mymethod(uint256,string)","c2aaf9c4":"receiveEth(uint256)","c2ab66dd":"hasAttribute1ButNotAttribute2(address,bytes32,bytes32)","c2ac0b4a":"intMax(int256)","c2ac3aff":"addEth()","c2ac481c":"disaToken()","c2acc5cf":"mintTokens(address[],uint256[])","c2add678":"getLockerInfo(address)","c2adf34a":"bonusWeiAmount()","c2ae1a53":"sendTransaction(bytes32,uint256,int256)","c2ae7e14":"approvePaillier(address,string)","c2aeb355":"GRAMATON()","c2b06664":"setDS(address)","c2b0c743":"payETHToProvider(address,address,uint256)","c2b12a73":"setBytes32(bytes32)","c2b2fb5e":"editionExists(uint256)","c2b373a7":"seedHash()","c2b4470c":"FINLAB_PRESALE()","c2b477a7":"mintLimitByTemplate(uint256)","c2b4ab4d":"getCountBonus(uint256)","c2b4ddde":"setFundingEnabled(bool)","c2b6b58c":"isClosed()","c2b70850":"QuantiModoToken()","c2b7be16":"addSupportedToken(address,address)","c2b8fd12":"MYRN()","c2b98295":"balanceOfNonKYC(address)","c2ba4744":"canMint(address)","c2ba5b40":"getPackageData(string)","c2ba857e":"setJobAccepted()","c2baa882":"tokensPerCHF()","c2bc2efc":"get(address)","c2bdb862":"verifyProofOfTransitionAgreement(address,uint64,uint256,bytes32,uint256[2],bool,bytes32,bytes32,uint8)","c2bf17b0":"recover(bytes32,uint8,bytes32,bytes32)","c2bf1af7":"freezingStatus()","c2c06f20":"OldRopeToken()","c2c13a70":"LOCKUP_WALLET()","c2c3bd6a":"_v()","c2c4a328":"getInitPrice(bytes32,uint8)","c2c4abe6":"ASSPToken()","c2c4c5c1":"checkpoint()","c2c5143f":"bobMakesEthDeposit(bytes32,address,bytes20)","c2c52055":"ChampionGameStarted(uint256,uint256)","c2c546b8":"sumICOStage6USD()","c2c5b9f1":"setInt(string,int256)","c2c5ec41":"isValidProof(bytes32,string)","c2c5f89f":"BonusAwareCalculator(address,address)","c2c61d01":"agreeToTrade(address)","c2c62562":"setCrowdsaleData(uint256,uint256,uint256)","c2c68ee1":"unlockTrading()","c2c7ca1d":"extraTokensMintedDuringPresale()","c2c7ff0a":"ToperCoin()","c2c8fd40":"increaseWorldLimit(uint256,uint256,uint256)","c2ca058d":"clearBlacklistMapping()","c2cb88bd":"giftMessage()","c2cb9927":"reward(address,uint256,uint256,string)","c2cba306":"TokenAddress()","c2cbb299":"airdrop_auto(address,address)","c2cca62c":"TransferMinersReward()","c2ccb8a8":"isCurrentAccountMinter(address)","c2cd0e01":"issueNewCoins(address,uint256,string)","c2cd7632":"isEmployee(address,address)","c2cdaf24":"start1BonusPeriod1()","c2cdbf01":"SyloToken()","c2cf7326":"hasConfirmed(bytes32,address)","c2cf9bbb":"PotPotato()","c2d0916f":"moveMetadata(address,address)","c2d15d21":"totalIssuanceLastAverageBalance()","c2d23e41":"continuousBacking()","c2d25167":"closeIcoOne()","c2d37428":"withdrawForWinner(uint256)","c2d415e2":"Chicken()","c2d42ef2":"removeAccount(uint256)","c2d4423f":"excludeWhale(address)","c2d4489f":"provider2()","c2d4f851":"calculatePrice(uint256,address)","c2d526aa":"_rank(uint256)","c2d53eb4":"initOwner()","c2d560ab":"stopOraclize()","c2d5baf9":"JJL()","c2d83718":"randomTeam()","c2d83e61":"UserPool(address,address)","c2d86376":"NewDonor(address,uint256,uint256)","c2d8de54":"promisor()","c2d936d9":"MINATOKU()","c2d9c196":"preico_startdate()","c2da621b":"setMeterPoint(address,int256)","c2dab162":"mineit(address,uint256)","c2db0482":"getUnionIdByAddress(address,address)","c2db26fc":"unverifyAccount(address)","c2db2c42":"purchaseToken(uint256)","c2db5890":"breedAxies(uint256,uint256,uint256)","c2db8676":"BloodToken()","c2db9e25":"getMinerHalvingHashRate()","c2dc0470":"KilledTillNow()","c2dc9af4":"hardCapHash()","c2dcdfb4":"preferredSaleTokensLeftForSale()","c2dced85":"numberDecimal18()","c2de2909":"drawRandomWinner()","c2de89b7":"getCleide()","c2def3b9":"getOrganizer()","c2df8815":"Adnity()","c2e0af44":"doMove(address,address,uint256)","c2e12f21":"setDefaultTranches(bytes32[])","c2e171d7":"Save()","c2e28dd1":"setTitulaire_Compte_8(uint256)","c2e2a338":"withdrawRejected()","c2e2a33e":"setPermanentLimitForType(uint32,uint256)","c2e3460d":"Anxxia()","c2e4601a":"getAffiliateRate(uint256)","c2e46379":"transferBountyTokens(address[],uint256[])","c2e4b8fb":"TokensUpgradedFrom(address,uint256)","c2e52206":"getPlayerCount()","c2e55da3":"product3_pot()","c2e5d950":"finalizedRefund()","c2e5ec04":"setTradingEnabled(bool)","c2e5feb5":"KeyReplaced(address,address)","c2e62675":"COTToken()","c2e78f12":"deVerify(address)","c2e800ed":"isContractProxy(address)","c2e88185":"CyberMusicToken()","c2e9fab3":"SubUser()","c2ea2f9c":"halfCentury(address)","c2ea5c9e":"getInvArray()","c2eaaeb3":"computeTxFee(uint256)","c2eac875":"secure(uint256,string)","c2eb10a2":"makeBundle(uint256)","c2ecdf8e":"ownerCMIT()","c2ed2b05":"documents(uint256)","c2eddfd2":"kyberMultiSigWallet()","c2edec0b":"setCharityDonation(uint256)","c2ee0a57":"getBlockList()","c2ee3a08":"ONE()","c2eef08e":"stopLandEthSale()","c2f02b33":"Crowdsale7(address,uint256,uint256,uint256,address,address)","c2f0bb29":"getCardDetails(uint16,uint8,uint256)","c2f0c083":"angelOnLeaderboard(uint64)","c2f0d93f":"icoAbandoned()","c2f0dbe2":"claimPremium(address[2],uint256[7],uint8,bytes32[2])","c2f137f1":"swapAddr()","c2f3ce10":"ADDRESS_LIMIT()","c2f3d788":"read_total_number_of_purchases()","c2f415b5":"CTBoatGame(address,address,uint256)","c2f490e9":"caller_()","c2f4976f":"setRoundFinalScore(uint16,bytes32)","c2f4faf4":"TestOrder(address)","c2f61a9f":"setOraclizeQueryType(string)","c2f666a3":"PriceIncrease()","c2f7c50a":"FindID(address)","c2fa6697":"fundraiserCallData()","c2fa8b2d":"PoetToken()","c2faa691":"Constructor(uint256,string,string)","c2fb538e":"updateFactoryContract(address)","c2fb8f36":"TinyHuman(address,address,address)","c2fbe7bc":"transferFees()","c2fc048a":"transferOwnerToProxy()","c2fcbf37":"isValidateParameter(string,uint256)","c2fce718":"getPartsOfOwnerWithinRange(address,uint256,uint256)","c2fd0263":"isTripleNumber(uint256)","c2fe2022":"getFollowers(address)","c2fe3321":"PRE_ICO_ON()","c2febe49":"QuantorToken()","c2febef5":"removeCountry(uint256)","c2ff0f15":"NewShare(string,bool,string)","c2ff3334":"jump(uint256)","c2ff7a38":"adjustBalanceCheckpoints(address)","c2ffc7bb":"slates(bytes32,uint256)","c2fffd6b":"setCancelFee(uint256)","c30096ef":"calculationTeamsRewards(uint256[])","c3017200":"removeAssociatedAddress(uint256,address,address)","c3027525":"getOwned()","c302a45b":"crowdsaleStopped()","c302f747":"poolPresale()","c30354cb":"VUP_TOKEN_SUPPLY_TIER3()","c30381b9":"setSellCourse(uint256)","c303c3d5":"returnEtherToInvestors()","c303c53a":"withdrawForTwoStep()","c304b368":"updatedRandom(string)","c304ffc4":"CreateICE(address,uint256)","c3059c63":"buyUpgradeCard(uint256)","c306834e":"PRIVATE_SALE_LIMIT()","c306cb90":"sendDevTokens()","c30715d1":"setNumRewardsUsedForAddress(uint256,address,address)","c30718e8":"testIntParser()","c3077c10":"settxpct(uint256)","c307f6ba":"withdrawWbtToken(address,uint256)","c3082e95":"playerOutputAtNow(address)","c308f55b":"fallback(uint256,address,uint256)","c30a990a":"createPaymentChannel(address,uint256,uint256)","c30b06e8":"allMultitokens()","c30b182e":"sendVNET(address,uint256)","c30b8867":"maxPercentPerPlayer()","c30bc5ef":"breedWith(uint40,uint40)","c30bf4d8":"CodeEligible()","c30c0c0c":"checkUsers(address,address)","c30d0ee4":"phiRate()","c30dafd8":"_setTittyForSale(bool,uint256)","c30df14c":"logPurchase(address,uint256)","c30df586":"ZAI()","c30ed0a4":"Getwsic(uint256)","c30f4a5a":"updateURI(string)","c31028dc":"hasFirstUnionIds(bytes32,bytes32)","c31051fe":"teamPeriodLength()","c31053f7":"NNT()","c310b9df":"ProposalAdded(uint256,uint256,string,bytes32)","c311d049":"withdrawEth(uint256)","c312d468":"sendPToken(address,uint256)","c312ffed":"Contributed(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","c31422ac":"calculateTokens(address,uint256)","c3143fe5":"setUserCap(address,uint256)","c31453a7":"_unpackAttackParams(uint256)","c3146814":"pegETHUSD(uint256)","c3153834":"prefixedRecover(uint8,bytes32,bytes32,address)","c315432a":"isGameStarted()","c3155201":"XulCrowdsale(uint256,uint256,uint256,address)","c31592af":"getY(bytes)","c315a082":"KRT()","c3169ef2":"respond(uint256,uint256[4])","c316c98b":"updateCollector(address)","c3173774":"balanceThreshold()","c317464d":"CryptoHearthStone()","c31752c0":"getEmployerJobs(address,uint8)","c3182360":"getTimeBonus(uint256)","c3191f31":"readWelfareAddress(uint256)","c3192c82":"getcurrNumOfUpgrades()","c319618f":"getAllMyPackageIds()","c31989ed":"TronGold()","c319a02c":"right98(uint256)","c319e412":"allowContribution()","c31a0972":"OrpheusRoyalSiamRailways()","c31ad7dc":"voteYes(string)","c31b29ce":"GAME_DURATION()","c31bb2fb":"XEPToken()","c31bb8d6":"percentToTakeAsRake()","c31c0b62":"isSaleComplete()","c31c5221":"approveSetTokenControlInfo()","c31c6855":"presaleBonusTokensClaimed()","c31ce93e":"getExchangeGroups()","c31ceb2a":"numberOfAttendees()","c31d0031":"CrowdFundDAO(string,uint8,string)","c31d309a":"addRequestorAddress(address)","c31d3a6d":"payInvestors()","c31d3e8e":"maxPublicSale()","c31e0547":"quickConverter()","c31e6ee0":"sendTokensToService(address)","c31f3537":"removeBotAddress(address)","c31f586d":"cancelSaleAuction(uint256)","c31fa083":"setIpfs(string)","c32011f0":"unfreezeTeamRecepientBlock()","c3204954":"confirmTransactionByMediatorFee(uint256)","c320c727":"setRegistrationFee(uint256)","c3210eb7":"proposeCount()","c3218f50":"startPreICO(address)","c321dc18":"showParticipantWei(address)","c32221cf":"_newRepo(string,address)","c32377df":"recevoirApprobation(address,uint256,address)","c3237ff4":"emitFeePeriodClosed(uint256)","c32426c9":"ProvideToken()","c324606a":"confirmStakeholderTransaction(uint256)","c324a669":"purchaseSoldiers(uint256,uint256)","c325ae4e":"belongsToUser(address)","c3262dfd":"setUserID(bytes32)","c3283d83":"getStrandContract(uint256)","c32863a7":"every15()","c32935d7":"getBuyPriceTimesByTime(uint256)","c329e4a5":"BoardAddressChanged(address,address,address)","c32a4369":"getAllSamplesForOwner(address)","c32a4c7e":"returnCoke(uint256)","c32a50f9":"setSeed(uint256)","c32a6f6d":"toUint(string)","c32a88ae":"recoveryPaymentDigest(bytes32,uint256)","c32a8edf":"someMethod1(uint256,uint256,uint256,uint256)","c32a9b00":"do_grant_tokens(address,uint256)","c32aaa86":"getNameWriterId(bytes32)","c32b8683":"creatorRequestFundTransfer(uint256,address,uint256)","c32c1e65":"setOperations(address)","c32cc6d5":"investFor12Months(address,uint256,uint256)","c32ceb14":"setQueryIdForAddress(bytes32,address)","c32d88bb":"changeDepositAmount(uint256)","c32d946d":"performTransfer(address,address,uint256,bytes)","c32dee3a":"second_bonus_amount()","c32e16e7":"REQUEST_CANCELED_BY_LENDER_STATUS()","c32e2b42":"SalesAgentRemoved(address)","c32ee591":"isTransferAllowed(address,address,address,address,uint256)","c32f6945":"MiningLevelup(address,uint256,uint256)","c32fb5ea":"getNewAllowancePeriod()","c32ff491":"ServerManager()","c3310517":"reservedTokensDestinationsLen()","c3315b4b":"EasyInvest25()","c3328816":"TeamAdvisorsWallet()","c3332621":"shippingDate()","c3332732":"setNextGame(uint256,uint256,uint256,uint256)","c3336c0f":"transferMultipleSame(address[],uint256)","c3340892":"LogStateChange(uint8)","c334447b":"bytes32ToTokenId(bytes32)","c334e875":"payByErc20(uint256)","c334ea8f":"setMateAdvertisementRate(uint256)","c3354632":"_premoveByIndex(uint256)","c335f0a4":"RKGToken()","c336937d":"Revoked(address,address)","c3369b0d":"issueTokens(uint256,uint256,uint256)","c336e7fb":"NobelToken()","c3380b72":"getDefense(bytes32,bytes32,uint256)","c33818fd":"Controller_Address2()","c338287f":"getUSDPrice()","c33890ff":"StartNewIteration()","c3392f25":"PRCT100_R_TEAM()","c33a4cc8":"PresaleUpdated(uint256,uint256)","c33a5bb6":"RLCPerETH()","c33a66e0":"updatePriceEDEX(uint256)","c33a800b":"createHeldCoins()","c33aa7fe":"submitBid(string)","c33af352":"_getFunc(uint256,uint256,uint256,uint256)","c33b76c6":"rakeAddress()","c33bbe47":"LAM()","c33cfe36":"KolkhaToken(uint256)","c33db789":"_triggerFinishTournament()","c33df4ba":"getNumOfRickHolders()","c33e1844":"BTMC()","c33e40a3":"setBasePoints(uint256)","c33e4942":"definition(bytes32)","c33fb877":"process()","c3403ddf":"endVoting()","c34052e0":"contains(uint256)","c341031a":"Testereum()","c341b9f6":"freezeAccounts(address[],bool)","c3430bce":"validWhiteListedPurchase(address)","c3434883":"buy(uint256,uint256,bool)","c3437e06":"approvedBuyer(address)","c3440022":"WhitelistedAddress()","c34492a7":"buyTokensByOptions(address,uint256,string)","c344bc47":"HonestisNetworkTokenWire3()","c344bc4a":"REALCrowdsale()","c344cdd2":"offerOptionsConversion(address)","c34588ba":"countOfDeeds()","c3458d18":"callRecipient(address,address,address,uint256,bytes,bytes,bool)","c345b571":"_subDai(uint256,address)","c345c54b":"doSafeSend(address,uint256)","c3462818":"PFC(address)","c34764cf":"makerWithdrawERC20Token(address,uint256)","c347fe1f":"addCET4(uint32,uint32,uint32)","c3492908":"BASE_TIME_TO_COOK()","c34a253a":"cardFacevalue(uint8)","c34b6ae0":"setFreeTransferAllowed(bool)","c34ba3e9":"createPromise(address,uint256,uint256)","c34c08e5":"executor()","c34c27ad":"SendOwner()","c34c4417":"registerData(bytes)","c34c6b93":"getDateInfo(uint256)","c34d2732":"MAX_COMMIT_DURATION_IN_SECONDS()","c34da17c":"isBurned()","c34db131":"CSCPreSaleManager()","c34dd141":"percent_reduction()","c34de22d":"genKeysRec(uint256,uint256)","c34debc7":"updatePlayerWin(address,uint256)","c34e6e1b":"OnlyWhiteListedAddresses(address)","c34ef9af":"second_bonus_duration()","c34f1fea":"UnfreezeAmount(address,uint256,uint256)","c34f6b0d":"getPrize()","c34f783d":"allocateToken(address[],uint256[],uint256[])","c34f869b":"Voted(uint256,bool,address,string)","c34fb5ca":"canonizedParameterizer()","c3500745":"refundLockDate()","c3501ff6":"redeemToken(uint256,address)","c3502510":"UsdPerEthChanged(uint256,uint256)","c3508d58":"refundByOwner(address)","c350bbb6":"RoscaERC20(uint256,string,string)","c3513132":"accessTokenFee(uint256)","c351fd77":"setGasPricePctOfBetValue(uint256)","c351fdfd":"setBatchNumber(address[],uint256[])","c3521b1a":"wolkFund()","c352dae2":"getWalletInfo()","c352fbda":"grantMarketingCoins(address,uint256)","c353a89e":"changeMember(address,address)","c353c2de":"unPauseTokenSale()","c353dbb1":"EtherPluscoin()","c3542cad":"SaleStageUp(int256,uint256)","c3548647":"setActivationFee(uint256)","c35506c0":"upgradingEnabled()","c355b107":"cNiceGuy()","c355eaf0":"setEthlanceSponsorWalletContract(address)","c35740f9":"partner2_name()","c3576b41":"setOwnersCommission(uint256)","c35774a1":"setApproval(address,uint256[],bool)","c35789cc":"Close()","c3584d88":"getMaxEtherToInvest()","c358ced0":"isRevealPhase()","c359a2a4":"increaseContribution(address,uint256)","c35a4d46":"DubaiGreenBlockChain()","c35c08bd":"getCrowdsourcer(bytes32)","c35c3265":"novumAddress()","c35cabf4":"littClientId()","c35d1e01":"RESERVE_TOKENS()","c35dcf90":"getWhitelists()","c35e1b33":"MSERToken(uint256,string,string)","c35ef892":"getWriteTimestamp(bytes32)","c35f4bbb":"calculatePrimordialMultiplier(uint256,uint256,uint256,uint256,uint256)","c3602ee5":"delayedRequest(string,uint256)","c36086f0":"initTransaction(address,uint256)","c360c616":"TittyPurchase(address,address)","c3615e39":"set_address(address,address)","c36360f2":"limit8()","c36433e2":"createPromoDrug(bytes32,address,uint256,uint256)","c3645759":"increaseDistrictWeed(uint256,uint256)","c364a25d":"setHash(uint16,bytes32)","c3650a21":"danserviceTeamAddress()","c36572d6":"hasEnded(uint256)","c3657f96":"setBoxCount(uint16,uint16)","c365a646":"_setRiskParameters(uint256,uint256)","c365d4f0":"initWidth()","c36604ed":"secretNumber()","c3662528":"isApproved(bytes32,uint256,bytes)","c3663271":"Icoends()","c366b1d3":"BulkToken()","c3676a02":"mangeWhileList(address,bool)","c367ec17":"rewardAuditor(uint256,address,uint256)","c36800eb":"IdentityCreated(address,address,address,address)","c368109c":"monster_hp(uint256)","c3681e3d":"change_p3(uint256)","c3682ace":"time_end_sale()","c36851bc":"bidOnWonder()","c3685e89":"addMessage(address,string,string)","c3689f01":"testControlSetNotRetractableNotOwner()","c368b160":"disbursement()","c36981f4":"withdrawNacNetfReController(uint256,address)","c369c0c6":"addValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,bytes32)","c36a7b45":"getUserTotalEthVolumeSaldo(address)","c36ad8a6":"deleteStar(uint256)","c36af460":"getLatest()","c36c0155":"get_planet_info(uint256)","c36c09e2":"setTrustedSender(address)","c36ccedc":"approve(address[16],address,uint256)","c36de353":"Ethereumt()","c36de531":"smallestUnitName()","c36e6fe5":"XclusiveCoin()","c36e9546":"SVL()","c36ff164":"claimFoundationToken()","c36fff2d":"availableOptions(uint256)","c37067fa":"donate(bytes32)","c370b0b5":"BbeCoin()","c370c86d":"setTokenName(address,string)","c370d8fe":"ExpandandHarvest(uint256)","c3720290":"giveSignOff()","c37210f4":"getDocumentSign(uint256,uint256)","c3722b1f":"AutoSell()","c3736dfa":"_shiftRight(bytes32,uint256)","c3737054":"changeManagerQuorum()","c373c0ef":"setStartDate(uint32)","c3751729":"mGenerateTokens(address,uint256)","c375ba8a":"getLavaPacketTypehash()","c375c2ef":"removeContract(address)","c3762904":"ethraised()","c37792b5":"generateSecurityToken(string,string,string,bool)","c3787865":"balanceFromToken(uint256)","c378a83b":"EarthToken()","c378ea76":"getFrom(uint256)","c378f1af":"RemoveAll()","c37981b3":"maxFixedSupply()","c37991e3":"ProposalEnd(uint256,string)","c37a676c":"acceptMins(uint256)","c37a6e8d":"signer1_proposal()","c37a832d":"getRoundUserBalance(uint256,address)","c37b0aa7":"modifyPriceCountry(uint256,uint256)","c37bcb1e":"unlockDate1()","c37cb1ae":"airdropsTokens(address[],uint256[])","c37cdcfe":"doDisputeMemoryRead(uint256,bytes32,uint256)","c37d1c8b":"tokensToMint(uint256)","c37d8a7e":"indexReplies()","c37d9044":"create(uint8)","c37db253":"isNotZero(bytes32,string)","c37dfc5b":"fillOrder(uint256,uint256)","c37e7379":"distributePresale(address)","c37e74c7":"getRet()","c37e8cb2":"testExportAuthorized()","c37f7f7f":"doTransferIn(address,address,uint256)","c37ff3d9":"sha(uint256,uint256)","c3800257":"Addmember(string,address,address,uint256,bool,uint256,bool)","c3800fdc":"CurrentToken(address)","c3801938":"getStateRoot(uint256)","c3830618":"reduceStake(uint256)","c3834d89":"setPromo(address,uint256,uint256)","c383b1bb":"summon10SkinAppearance(uint256,uint128)","c383e020":"endContract(address)","c384521f":"tokenCapPhaseTwo()","c384b170":"teamWallet2()","c3858e82":"unregisttIcoAddress(address)","c38672a0":"confirmTokenTransaction(uint256)","c38678c3":"addBuildingToServer(uint256,uint8[10],uint8[10],uint8[10],bytes32[10],uint8)","c386ff7d":"checkFunction(bytes32,uint256)","c38789ba":"example(uint256,address)","c387b2a7":"BatchTransferContract(address)","c3886f61":"checkWithdrawal(address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","c3888bce":"transferTokenToMultiple(address[],uint256)","c388c167":"setNameAndTicker(string,string)","c388cca6":"testBitAndFailIndexOOB()","c38a0306":"devFeeHandle(uint256)","c38a0fcb":"MGLTOKEN()","c38a8afd":"minimumBet()","c38ad273":"priceETH()","c38ad65b":"getHeroPostAddres()","c38bb537":"setPauseStatus(bool)","c38c0fa7":"getParentPayoutDistributionHash()","c38c5813":"registerAdmin(address)","c38c9800":"innerContract(string)","c38caab5":"setPost(string)","c38e52c0":"deletePeerReview(address)","c38e650f":"changeRoundManager(address)","c38f0741":"snapshotDailyGooResearchFunding()","c38f1abf":"waitTokensPeriod()","c391c1b5":"updateOwner(address,address,uint256)","c391d581":"getXPROMO_MULTIPLIER()","c392079f":"removeCoin(string)","c392cf41":"reveal(address)","c392f118":"getSellingStatus(uint256)","c392f5a0":"getAllPackageReleaseHashes(string)","c39387ad":"checkAndUpdateStage()","c3946909":"setTheKingsQuote(string)","c394f6cb":"unclaimedTokens()","c39513af":"setDeprecated(string,address)","c395546c":"authorizedToSpend()","c395a16b":"leaderBid()","c395f336":"processPurchase(uint256,uint256)","c3964372":"startRound(uint256,uint256)","c397ae1b":"holosForWei(uint256)","c39804ac":"generatePreimage(uint256,uint256,uint8)","c39899c1":"isDeadline(uint256)","c398a925":"supportsERC165(address)","c398f030":"expire(uint256,uint8,bytes,bytes,bytes)","c399330d":"getBonusByTime()","c399d7c5":"getAccountTokenStats(address)","c399ec88":"getDeposit()","c39a9d97":"crowdSaleType()","c39afb0b":"BitcoinEther()","c39b79d4":"_contains_(address)","c39cb03f":"ERC827Token(uint256,string,string)","c39cbef1":"changeName(uint256,string)","c39ce8b6":"FranklinFrank()","c39cf53d":"nextrafflenumber()","c39e7394":"addAuctionReward()","c39ffc65":"GVFX()","c3a07df6":"getPermissions()","c3a0ba73":"BlockFilesManagement()","c3a11c51":"etherPriceInUsd()","c3a151de":"getPlayedGamePlayers()","c3a18dec":"PRIVATE_SUPPLY_ADDRESS()","c3a1e7cc":"totalWEIInvested()","c3a25c4c":"computeCntrAmountUsingPacked(uint256,uint16)","c3a267b7":"createEthGlobalDelegation(address,address)","c3a2a665":"retrieve(address,uint256)","c3a2a93a":"getContracts()","c3a2c0c3":"scheduleCall()","c3a35825":"getUint(bytes32,string)","c3a39544":"initialCompanysTokenAllocation()","c3a3ee80":"setPartsToSell(uint256,uint256)","c3a48741":"distributeTKLN(address[],uint256)","c3a4ebf5":"_roundOver()","c3a4f8b5":"hibit(uint256)","c3a5fc4d":"IconFoundation()","c3a62a68":"getDate(bytes10)","c3a69a75":"dividendsDistributor()","c3a6e2a7":"disableToken(bool)","c3a74e6a":"placeSellFciOrder(uint256)","c3a83aab":"getTokensAvailableToMe(address)","c3a869e6":"goldenTicketPrice(uint256)","c3a8da5f":"EthereumMark()","c3a8f536":"rsub(uint128,uint128)","c3a9b1c5":"sayHello(string)","c3a9bd8b":"maximumTokens()","c3a9be6b":"setLimitGame(uint256,string)","c3a9c930":"Gift(uint256,address,address)","c3aa0fe6":"setItemLimitHolding(uint256,uint256)","c3abe888":"sendBatch(address[])","c3ac93df":"QCOToken(address,address,address,address,address,address)","c3ad5ecb":"getTweet(uint256)","c3ae43a0":"buy100tickets()","c3aeacdf":"changeRules(address)","c3aebdd1":"s5(bytes1)","c3aedd92":"updateIsVerifiedInBulk(address[],bool[])","c3af38fa":"changeInfoUrl(uint256,string)","c3af702e":"totalfv()","c3b0f915":"KickToken()","c3b1037b":"ownerSetGasPrice(uint256)","c3b18fb6":"updateSplit(uint256,uint256)","c3b18ff2":"totalSupplyICO()","c3b1d52b":"recipientToGiftIds(address,uint256)","c3b1ff93":"acceptGame(address,uint256,bytes32)","c3b24be0":"Leg()","c3b2556d":"lookup(bytes)","c3b2d337":"_initialSupply()","c3b3271d":"updateStar(uint256,string,string)","c3b35a7e":"withdrawTo(address,address,uint256)","c3b3c656":"kickOutGroup(address,uint256)","c3b4db25":"setSeller(uint256)","c3b55635":"log(string,bool)","c3b57af8":"getStageAmount(uint256,address,address)","c3b66bed":"getProposalVotersCount(uint256)","c3b6f939":"mToken()","c3b7572c":"updateCommission(string,uint8,uint8)","c3b75b8f":"setLockProductActiveState(uint32,bool)","c3b7e378":"startTimeStage2()","c3b8bfe5":"transferIfNoHF(address)","c3b91d15":"AiBank()","c3b9741b":"ModifiedCrowdsale(uint256,uint256,uint256,address)","c3b9e2ed":"powerWithModulus(uint256,uint256,uint256)","c3b9f21e":"p4()","c3ba2368":"transferERC721(address,string)","c3ba65e7":"totalChicken()","c3ba7574":"mintForFund(address)","c3ba938d":"JPY_Omnidollar()","c3bb68cf":"weisPerEther()","c3bb8feb":"releaseSell(uint256)","c3bcb586":"soldKeys()","c3bd0bae":"CapLevelPrice()","c3bdc16f":"setUserRole(address,bytes32,address,uint8)","c3be259f":"ConnectiusToken(uint256)","c3be3c24":"_updateTopUpAvailable()","c3be6e8d":"SetStartTimeTLP1(uint256)","c3be8df3":"addAff(uint256,bytes32)","c3bea9af":"createGen0Auction(uint256)","c3bf32e3":"numberOfHeroClasses()","c3bf504a":"extractEth(uint256)","c3c0198c":"getAssesByOwner(address)","c3c0befb":"dumpPrize()","c3c132b2":"_indexProofId(string)","c3c1d4c7":"withdrawTokensTo(address)","c3c2686c":"preSaleWallets(uint256)","c3c2f066":"block(bytes32)","c3c357f9":"tokenSaleCompleted()","c3c5026c":"depositWEI()","c3c503b7":"becomeBankermaster()","c3c51aca":"cancelSellTokenOrder(uint64)","c3c563f4":"validateAmount(uint256)","c3c59aa9":"walletTimeOf(address)","c3c5a547":"isRegistered(address)","c3c5b40e":"setSaleAddr(address)","c3c63edc":"mintBadge(uint256)","c3c6e202":"indexLastThreads()","c3c6f0c9":"getCustomerTxTimestampPaymentKWh(address,bytes32)","c3c735cb":"BITDRIVE()","c3c74c45":"applyForCertification(string,string,address,string,string,uint256)","c3c75e5c":"setEditionPackSize(uint8,uint8)","c3c88a1d":"disableTransfer(uint256)","c3c8c12b":"setVipInfo(address,uint256)","c3c90e64":"checkReward(address)","c3c95c7b":"getMarket(bytes32)","c3ca3c6a":"SingularityTest3()","c3cad5e7":"senderMIT(address)","c3cb4159":"getICOBonus()","c3cb50ed":"setTileType(uint16,bytes32)","c3cb8c14":"finalizeVault()","c3cbc2c9":"offerSacrifice()","c3cbd341":"create(address,uint256,address,address)","c3cd9996":"CLASS_AQUATIC()","c3ceb939":"view58()","c3cfe00f":"EEB(uint256,string,uint8,string)","c3d014d6":"setContent(bytes32,bytes32)","c3d08f06":"setPermissionByAddress(uint8,address)","c3d0a20a":"NewToken(address,string,string)","c3d0a564":"getAccountBalance(bytes)","c3d23e10":"checkBet()","c3d2c355":"setKey(bytes32)","c3d32e56":"PixelCore()","c3d345c4":"getHangoutAddress()","c3d38586":"newCookie()","c3d4d75a":"getCommitHash(bytes32,address)","c3d54c9a":"paiementConfirmation(bytes32,bytes32)","c3d55adc":"calculateBuyGoldFee(uint256,uint256)","c3d58d95":"runICO()","c3d59369":"setIcoDiscountPercentages(uint8,uint8,uint8,uint8)","c3d5fd39":"getAdminInfo()","c3d68a85":"temporaryKill(address)","c3d69d03":"NatureX()","c3d7ad74":"sendPurchasedTokens(address,uint256)","c3d7e350":"removeAccount(uint256,address)","c3d8c099":"endICOStage5()","c3d97a27":"carsCount()","c3d9820d":"RefillOraclize()","c3d9c4b4":"share(uint256)","c3da42b8":"c()","c3da5153":"getEthartArtReward()","c3daab96":"withdrawBond(uint256)","c3dac9a1":"time_bought()","c3db397f":"unstakePartialContent(bytes32,uint256,uint256,bytes8,uint256)","c3db5ead":"Uruntest()","c3dc0083":"finishDeal(uint256,uint256)","c3dc1040":"orderInternal(uint256,bytes32)","c3dd2395":"maxCapEur()","c3de1ab9":"gamePaused()","c3de7cbf":"checkRedemptionWindow(uint256,uint256)","c3dee67f":"updateAllHoldersShareInfo()","c3defb70":"changePause()","c3df99b6":"upvoteComment(bytes32,bytes32,bytes32)","c3dfb938":"countFortunes()","c3dfbeea":"migratePresaleBalances(address,address,address[])","c3dfdae6":"gameToken()","c3e017c2":"dNextStage(uint32)","c3e053ac":"percentBuyBackTypeTwo()","c3e06be9":"changeReceiveWallet(address)","c3e0ae67":"future_round_percentage()","c3e0bbad":"getContentByName(string)","c3e1d25c":"percentsOfProjectComplete()","c3e2087c":"setManagementCompany(string)","c3e27948":"setTrueUsdFastPause(address)","c3e2f26e":"icoedAmount()","c3e38ae9":"setSEKU(uint256)","c3e3908c":"get_pre_kyc_bonus_numerator(address)","c3e3c7bc":"teamTokens()","c3e50027":"dealConfirm(uint256)","c3e58eec":"blackListSectorExists(uint8[])","c3e6ea31":"BONUS1()","c3e8fb40":"smartToken()","c3e92f9e":"DrawLottery(string,uint256)","c3e93fa3":"depositHelpe(uint256)","c3ea0fca":"promoEthCommission()","c3ea901d":"uint2ToStr(uint256[2])","c3eb0723":"LogNewSecurityToken(string,address,address,address,uint256,uint8)","c3edb4c2":"finalizeChangeInsuranceFees()","c3ee6311":"lockAndCall(string)","c3ef473c":"ShareHolderVoted(address,uint256,bool)","c3ef586a":"Gambit()","c3ef83fc":"executionTimeOf(uint256)","c3f010f7":"numGames()","c3f03fb8":"querySpecialRateForAddress(address,address)","c3f07ba7":"addTokenAddresses(address[])","c3f0dad9":"isGenerator()","c3f17ae8":"getAmountToIssue(uint256)","c3f1a710":"getInvestment()","c3f1b0ea":"changeRequest(bytes32,bytes32,bytes32,string,bytes32,bytes32,uint256)","c3f3310b":"tokensOfFounder(address)","c3f34a50":"Dao(address,uint256,uint256,uint256,uint256,uint256,uint256)","c3f3b854":"maxNumBets()","c3f44c0a":"relayMetaTx(uint8,bytes32,bytes32,address,bytes,address)","c3f51fca":"initMintable(address,address,uint256,uint256)","c3f53e94":"ownerClaimTokensAndRefundForUser(address)","c3f59687":"transferMastership(address)","c3f6263f":"charityCutOf(uint256)","c3f67cde":"withdrawSecond()","c3f6e09c":"sendOnlyHash(string)","c3f7ec97":"addLog(bytes)","c3f7f169":"safeSend(uint256)","c3f843d7":"minVeriAmount()","c3f84c05":"retribution(uint256,address)","c3f90202":"f4()","c3f909d4":"getConfig()","c3f9409f":"signBitcoin(bytes32,uint8,bytes32,bytes32)","c3fa4f27":"sendPowerToken()","c3fa5f93":"BlockScheduler(address,address)","c3fb31a4":"coolDungeon()","c3fb5e5f":"createVestFundFor(address,uint256,uint256,uint256)","c3fbc632":"ICORunning()","c3fc4787":"finalizeFork()","c3fdbef8":"totalInSharedPool()","c3fe3e28":"game()","c3ff05d1":"getBoxCountZIndex(uint8)","c3ff3878":"checkForValidChallenge(address,uint256)","c401a2a3":"destroyforproduction(uint256)","c401d6b0":"totalTokensToSupply()","c4021c13":"topupEnergyByToken(address,uint256,uint256)","c4026d7b":"removeDev(address)","c402e446":"Express_Satisfaction_MediatedTransaction(uint256)","c403adc8":"changeInSale(bytes32,bytes32,uint256)","c403cf6d":"RESERVED_TOTAL_AMOUNT()","c403f90f":"airdropTime()","c4041bc5":"viewauction(uint256)","c4043465":"MYEXCTOKEN()","c404b3f6":"currentTranche()","c4052559":"haraKiri()","c4052a78":"airLiftPrice()","c4057e61":"getData_4()","c40580de":"removeOwners2()","c405b1f0":"addJob(address,uint256,uint256)","c405d30e":"send2marketing(address,address)","c405e11b":"_addAnswerToHistory(bytes32,bytes32,address,uint256,bool)","c4069caf":"getPlayersByTrackId(uint256)","c406d4af":"getPixelToken(uint24)","c407670f":"donorCount()","c4076876":"pay(address,uint256)","c407c6d8":"chop(string)","c4085bf6":"_sell(address,uint256,bytes)","c4086893":"getLockedBalance(address)","c408efba":"isMigrationPhaseOpen()","c40940f4":"pricePerUnicorn()","c409ad08":"exec(bytes,bytes,address[])","c40af29f":"tokenTeamSupporter()","c40b276b":"hasString(string[],string)","c40b4c4d":"minSumPreICOUSD()","c40b716c":"setLLV_edit_14(string)","c40b8868":"changePresale(address,uint256[])","c40b8dcf":"usdToHavPrice()","c40bdc05":"_requestLoans(address,uint256)","c40cf4eb":"memberContract()","c40d19a5":"getAddressSize()","c40d4163":"ArthToken(uint256)","c40d62fe":"OrpheusBlockChainCitySiam()","c40dc8ec":"deadline(uint256)","c40fdc94":"Delisted(uint256)","c40fec3a":"forceOffsetExecuteFeeRate()","c4109843":"OrdersMatched(bytes32,bytes32,address,address,uint256,bytes32)","c4109d48":"baseTokensAllocated()","c411e4d4":"canCancel(uint256)","c4128b6d":"upgradeCount()","c4130ae0":"registerEvent()","c413af2e":"setPreICOPhase()","c413fdf3":"testPayout()","c414dede":"tablets(address,uint256)","c41518f2":"luckyYouToken()","c41559bb":"ETHbalanceOf(address)","c415b95c":"feeCollector()","c4163518":"isMining(address)","c4164365":"investBalanceMax()","c4166ea8":"OBGAllocation(address)","c416a0d7":"emergencySetBBFarm(uint8,address)","c41728a7":"sectorOwnerCut()","c4173548":"preSaleRaised()","c417becd":"RCToken()","c4184def":"BCBToken()","c418c8c9":"TradeToken(address,string,string,uint256,uint256)","c418c93e":"addOnStage(address,uint256,uint256)","c4198161":"setParameters(address,uint256)","c41a360a":"getOwner(uint256)","c41a9892":"bet2()","c41a9dfe":"has_joined()","c41addb5":"newModerator()","c41b0ae7":"getNumberOneArg(address,bytes4,address)","c41c19dc":"trackContributions(address,uint256)","c41c33af":"submitChallengeOrder(bytes,uint64,uint64,uint256,uint256,uint256)","c41c3bde":"setBuyingTime(uint256,uint256)","c41c9a61":"transferERC20Tokens(address,address,uint256)","c41e1d4f":"MAX_NUM_NAVITOKENS()","c41efe08":"getBestSale(bytes32)","c41f48a3":"DinosaurFarmer2()","c41f4cc0":"takerStatus(address)","c41f9482":"getDateTime(uint256)","c41fbbb5":"addFounder(address,uint256,uint256)","c420928d":"EncryptoTelToken()","c420f7fe":"getPlayerShipModelById(uint64)","c421249a":"sui()","c4215398":"publicSaleAddress()","c4218d33":"oraclizeBalance()","c421fa8e":"updateCrowdfundState(uint256,address,uint256)","c421fc6b":"currentStageData(uint8)","c422293b":"finishIssuance()","c422d09b":"ConfirmOwner()","c422ed19":"addFreeBet(address,uint256)","c4236cdc":"catchStarters()","c4254c7b":"CoreWallet()","c4259e2e":"changeOwnerInfo(uint256,uint256,string,string,string,string)","c4264738":"refundSafe()","c426b1e5":"showDepositEther(address)","c426c3e2":"getExtendedAttributesForPlayer(uint256)","c426fbb6":"setCrowdsaleStartBlock(uint256)","c4270574":"userRollDice(uint256,address)","c42791ae":"setBountyOwner(address)","c427a68b":"ExtremeSetupToken()","c427af9b":"outcomeAmounts(address,int256)","c427e699":"getContractsOf()","c42882e3":"getEarlyAccessKitsRemaining()","c42890b6":"setCastleContract(address)","c4290b76":"getAmountWithdrawal(address,bytes32)","c42956d3":"nextExchangeRateIndex()","c4298f89":"ACL(address)","c429e4a3":"TEAM_ALLOWANCE()","c42a0716":"erc20(string,string,uint256,uint256)","c42b5fe1":"registerExternal()","c42bb1e4":"contract_eth_value()","c42bd05a":"newToken()","c42c237a":"CortexCoin()","c42c9905":"register(bytes20,uint32,int24[4],int24[4],uint32[4],bytes32[])","c42cb819":"goldBoxAmountForSale()","c42cce7e":"total_tickets()","c42cd8cf":"etherSplit(address,address)","c42cf535":"setGovernor(address)","c42e04c0":"etherOne()","c42e1ace":"TKP()","c42ed894":"getRoundTargetBlock(uint32)","c42edd61":"payFeesToggle()","c42edf88":"leveRage()","c42f61d3":"RhodoToken(address)","c42fd368":"RateChanged(address,uint256,uint256)","c4305a55":"windowBonusMin()","c430bcda":"whitelistInvestor(address)","c43147c1":"InitializeManifesto(string,string,uint256,bool,bool)","c43148ca":"makeProposal(string,uint256,uint256,uint256,uint256,address,address)","c4319bd8":"AgreementHashEn()","c431f885":"addToContribution()","c4321adb":"investInTheSystem(uint256)","c4329ae5":"totalChangedPixels()","c433793d":"removeWhiteListedAddress(address)","c433e8ca":"remainMintTokenAmount()","c4342252":"latestScheduledUpdate()","c434650c":"_checkOrder(address)","c4359c1b":"marketSeeds()","c435ae0c":"setMaxGoal(uint256)","c435d26f":"GREMToken()","c435d2ac":"publishedTokenOfOwnerByIndex(address,uint256)","c435d68e":"numberOfContracts()","c4366149":"optionBalance(bytes32,address)","c4373c05":"tickRequiredLog(uint256,address,uint256)","c43782e0":"ZipToken()","c437b951":"BytechTechnology()","c43821aa":"issuanceCurrentBalanceSum(address)","c43823e1":"jsonKeyExists(string,string)","c4387936":"edgePigmentB()","c439af4f":"WAVEliteToken()","c43a6a79":"returnsTwoNamed(uint256,uint256)","c43aa319":"startTime_()","c43ae983":"GROWTH_BUMP()","c43b7934":"stagePrice(uint256)","c43bb538":"requestOwnershipTransfer(address,bytes32)","c43c633b":"traderBalances(address,address)","c43c9e12":"addTokenAdmin(address,address)","c43d0575":"scheduleCall(bytes4,uint256)","c43d56bb":"changelp4(address)","c43d9ac9":"TCETest()","c43e0e72":"_withdraw(address,address)","c43e9462":"getRoundNumber(uint256,uint256)","c43eb0e0":"getAvatar(bytes32)","c43ed2c8":"update(bytes)","c43f22c4":"isInvestorAllowed(address)","c440008e":"foundersFund()","c4400ed4":"getProfit(uint8,uint256)","c4405fa7":"_getMaxRarityChance()","c44088fd":"rewardUnitsRatePerYear()","c440e875":"dedeNetworkAddress()","c44193c3":"offerPunkForSale(uint256,uint256)","c44237dc":"EventUpgradeShip(address,uint32,uint8)","c4426a88":"arbitrate(address,address,bytes32,bool)","c44299c7":"preAlphaPrice()","c4432f31":"P3DAddress()","c443a99a":"MicoinNetworkToken(uint256,string,string)","c44412e3":"revokeBonusCreditOf(address,uint256)","c4453bd0":"getPlayerMinions(uint32,uint8)","c4454980":"fundManually(address,uint256)","c4457e47":"load(uint8[],uint256,uint256,uint256,bool)","c445e2ef":"RedPillToken()","c4468f69":"setNewPotWinner()","c4477a11":"Banknote(address,uint256)","c4479812":"batchMultipleAmount(address[],uint256[])","c44828be":"totalAllowance(address,address)","c4489110":"BUYOUT_PRICE()","c448fa85":"isExtraDistribution()","c44a2a10":"ownerCredited()","c44b0290":"setLockPostion1(address,uint256,uint8,uint256,uint8,uint256,uint8,uint256,uint8,uint256,uint8)","c44b10d9":"payoutOdds()","c44c2efd":"burnPLUTUSTOKEN(uint256)","c44cb8fc":"viewTotalPayoutToPlayer(address)","c44cd4df":"sendReaction(address,int8,string)","c44ced7e":"ozr()","c44d36ee":"protectedTransfer(address,uint256,bytes32)","c44d6f87":"PAPER()","c44e6640":"getAuctionCount()","c44e787f":"sideBetPay(bytes32)","c44f7864":"getRemainingTimeInSecond()","c450a08a":"queryLockedTokens(address)","c450a25f":"unfreeze_contract()","c450d98b":"getCommunityReputation(address)","c4522c92":"removeStaff(address)","c45250c8":"icoRound3()","c45330b4":"remainingTotalBonuses()","c453cdd4":"getMyVines()","c4543386":"TUIToken()","c4545e6d":"_replaceModule(address)","c4552791":"proxies(address)","c4561d61":"finishICO()","c456354e":"setEndTimeStamp(uint256)","c4569504":"getKudosOf(address)","c456d394":"getPixelPrice(uint256)","c4576525":"WEC()","c457fb37":"getTokenPrice(uint256)","c45849c2":"doDistribution(uint256,address,uint256)","c458e5f3":"CrowdForceTestToken()","c4590d3f":"setLimits(uint256,uint256)","c4596419":"mintSoldTokens(address,uint256)","c45982b9":"madd(uint128,uint128)","c459b003":"ATTR_PERMANENT()","c459b9e3":"MaxStarIndexAvailable()","c45a0155":"factory()","c45a4047":"batchTrasfer(address[],uint256,uint256)","c45a6f98":"unlockMultiple(address[])","c45aa04c":"queryShareholders(bytes,uint256)","c45ad06a":"etherSince50()","c45b415e":"createRequest(address[4],address,uint256[11],uint256,bytes)","c45c4f58":"balance1()","c45cda5a":"init_fund()","c45d19db":"tokensToBeReturned(address)","c45d32cf":"getRemainingBytesLeadingZs(uint8,bytes)","c45d3d92":"conversionWhitelist()","c45d5fcb":"TwoStageCrowdsale(uint256,uint256,address)","c45d8af4":"getWinIndexFromHash(address,bytes32)","c45d8c8b":"Gryphon()","c45ddd87":"targetDiscountValue4()","c45df8e5":"COSIGN_MAX_TIME()","c45e4a7b":"SwiftDex()","c45ec88c":"Put(bytes32)","c45ef547":"offlineDiscipleSold(uint256,address,uint256)","c46073f7":"LUCYD()","c46093de":"_0xMonacoinToken()","c46180a7":"setBalanceOfActiveToken(address,uint256)","c461889e":"OkLive(uint256,string,string)","c4618978":"MIN_INVEST_ACTIVE()","c4620549":"quaker(address)","c4626ea7":"PumpHodl()","c4628520":"cashoutEOSBetStakeTokens(uint256)","c462a408":"maxParticipantCount()","c462bd11":"setupRules()","c46362fd":"set_merge_mint_threshold(uint256)","c463a1af":"CapitalMatchToken()","c463b008":"triggerTransferEvent(address,address,uint256)","c464fe65":"sellTokens(address,uint256)","c465e742":"UpdatedTokenInformation(bytes32,bytes32)","c466313c":"GetMainSale()","c4664649":"FIXEDREWARD_MM()","c467706d":"startEarlyAdopters()","c467a317":"freezeTeam()","c467b0ff":"_play(uint256,uint256,uint256,uint256,uint256)","c4694ec6":"ecoSupply()","c4697667":"BONUS_WL()","c469eb99":"deleteFromWhiteList(address,address)","c46a23a2":"signedAverage(int256,int256)","c46a2925":"setMinApprovalCount(uint256)","c46a3a0d":"icoPhase1EndTime()","c46a6262":"playEtherOf()","c46aaf38":"PharmaGenome()","c46b2d9d":"denyBundling()","c46b644b":"NewTicketEvent(address,uint8,uint8,uint8)","c46c3c68":"RuffToken()","c46cacae":"initial_time()","c46ce53e":"getOneTotalFeesCollected(uint256)","c46d2235":"serverEndGameConflictImpl(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,bytes32,bytes32,uint256,address)","c46d4cf1":"thawAccountTransfers(address)","c46df008":"walletData(address)","c46e3e85":"unitGooProduction(uint256)","c46e614a":"isCMCT()","c46ed45a":"fee_percentage()","c46f3e25":"lastChanceEnabled()","c4701037":"aaa(bytes)","c47028c1":"TOKEN_RATE_CROWDSALE()","c47031ab":"getKarma()","c4716d0f":"contributedCap(address)","c4725577":"getPrice(uint256,uint256,uint256,uint256)","c472c7e6":"setTotalWithdraw(address,uint256,address,bytes,bytes)","c4735121":"thirdRoundTime()","c4740a95":"removeAccount(address)","c4749079":"_roundDivision(uint256,uint256,uint256)","c4749bbd":"showInvestBalance()","c474e70a":"returnFundsForMultiple(address[])","c4752773":"priceStep3()","c475abff":"renew(uint256,uint256)","c475cdf5":"issueNew(uint256)","c476dd40":"reportMalicious(address,uint256,bytes)","c477d234":"checkIfAlreadyOrderedForDay(uint256,address)","c4784fd4":"setMsg(string)","c4788efe":"resetTotalVotes()","c478b52f":"PLATINUM_AMOUNT_TPT()","c478fc37":"EtherWheel(uint256,uint256,uint8)","c4791421":"changeCooldownEndTime(uint40,uint40)","c47958e2":"ERC20(string)","c479ace6":"updateOwners(uint256,address,address[],uint256,uint8[],bytes32[],bytes32[])","c47af5cf":"ChangeCost(uint256)","c47af732":"setReserved(address,bool)","c47bc007":"add_funds()","c47c4cc7":"getInitialBalanceByAddress(address,address)","c47cf5de":"getAddress(bytes)","c47d5bb8":"unitsUserCanBuyLimitEth()","c47e7bcb":"softcap3Reached()","c47e951f":"adjust_eth(uint256)","c47e9fea":"ContributionRefund(uint256,address)","c47ef875":"activeTokens()","c47f0027":"setName(string)","c47f0f90":"getPurchases()","c47fae76":"autoPlayBot()","c47fc244":"grantInvestorsTokens(address[])","c48029d4":"AddTokensToMember(address,int256)","c4806df4":"createTokenOwner()","c480e583":"revertTransfer(address,uint256)","c4811a0e":"maxICOThirdSupply()","c4813b2c":"StgOnebonusEnds()","c4815c96":"teamAdvTokens()","c4818ae1":"joinPillar(uint256,uint8,uint256)","c4818cdc":"_balanceOf(address,address)","c482299f":"transferAUTOtokens10(address[])","c482ceaf":"reinit()","c4834c30":"teamTotalSupply()","c483b71c":"Map(address)","c483befa":"setParameters(address,string,string,string,address,uint256,uint256)","c4841369":"paymentsByPurchaser(uint128)","c4843365":"getRarity(uint32,uint256)","c48513a4":"getStringConstant()","c485297b":"HelloSystem()","c48590e9":"PARTNER_SUPPLY()","c485ac95":"setWalletForTokens(bytes32,address)","c486301b":"AcceptsExchange(address)","c4864f45":"changeAcceptExchange(bool)","c4868452":"preIcoActive()","c486d133":"round1InitialBonus()","c4871039":"totalWeiRaisedDuringPhase2()","c4882e44":"disableRound0()","c488d6f2":"stopOffering()","c489744b":"getTokenBalance(address,address)","c489a649":"updateAirdrop(address)","c48a0dc0":"OptionToken()","c48a3cbf":"setStackPtr(uint256)","c48a66e0":"transferTimelocked(address,uint256,uint256)","c48a7560":"sellScams(uint256)","c48b1cf0":"test_5_accessRestriction_addMember_shouldThrow()","c48c68ee":"addressFounders4()","c48d5a4a":"_buy(uint256,uint256,uint256,address,uint256)","c48d93d8":"JuraToken(uint256,string,string)","c48d99ca":"DataDumped(address,string,bytes32)","c48db366":"Africacoin()","c48dc5fb":"JackpotAwarded(uint256,address,uint256)","c48e1c4d":"importAddresses(address[],address[])","c48e5ec4":"getPurchaseDetail(uint256,uint256)","c48e819c":"test_openRegistry()","c48eabc0":"getContributionPool()","c48ef17c":"floorId()","c4909a70":"addConfig(bytes32,bytes32)","c490a266":"toUInt(bytes)","c490dfa6":"isVerifiedAddress(address,address)","c491fd18":"FlexibleTokenSale(address,address,uint256,address)","c493afcf":"closeRefund()","c494a080":"totalPlayer()","c494c3f7":"teleportKnight(uint32)","c494f71a":"LedgerFund(uint32,uint32,uint64,uint64)","c49589bb":"rateUSDcETH()","c4969b8f":"setSellerAndAmt(address,uint256)","c4977807":"getFrozenAccount(address)","c4983c65":"updatePoints(address)","c498fcfd":"getUnitDefenseIncreases(address,address,uint256)","c49a1ede":"updateShareValue(address,uint256)","c49a3b04":"OraclizeVerifier(address,string,uint256,uint256)","c49a8fc9":"secureUpdateOrderFunds(address,bool,uint128,uint128,uint128,uint128)","c49b94e9":"getTokenTxn(uint256)","c49c3635":"getEventOutcomeIsSet(uint256,uint256)","c49d3b9f":"memberData()","c49d9ff8":"chatMessages(uint256)","c49ee5b4":"finalUnpause()","c49f91d3":"EIP712DOMAIN_TYPEHASH()","c49fea77":"setVariables(uint8,uint8,uint8,uint8,uint256)","c49fef66":"maxAnimals()","c4a06710":"isKYCPassed(address,address)","c4a0dada":"getOtherName()","c4a13f23":"affiliateBonusPercent()","c4a1ee37":"gasLimitWithdrawConfirm()","c4a1fedf":"increaseWeeklyTransactionVolumeReceiving(uint256)","c4a2c6b4":"Partial23Send()","c4a2d664":"setTransferFeeMax(uint256)","c4a2e641":"confirmTransaction(uint256,bytes)","c4a2fe12":"setversion(uint256)","c4a31557":"packSaleAddress()","c4a381b8":"setTokenRate(uint32)","c4a4cb4e":"countMilk()","c4a4e267":"weaponToApproved(uint256)","c4a4f265":"minimalContribution()","c4a50433":"unprocessedProfits()","c4a5350d":"createNewContract(string,string)","c4a5b138":"approved(address,uint256,address,bytes)","c4a796c1":"setReferee(address)","c4a8158c":"getMyTurtle()","c4a8598e":"BANCOR_X()","c4a85bc1":"allowAccess(address)","c4a89e9e":"lengthOf(uint256,uint256)","c4a8a670":"getEvent(string,uint256)","c4a8b570":"setdteamVaultAddr3(address)","c4a942cb":"chunkSize()","c4a96758":"getByteFromByte32(bytes32,uint8)","c4aa94a6":"withdraw(address,uint256,address[],uint256[])","c4ad32be":"generateTrees(uint256)","c4adb406":"validDestinations(uint256)","c4ae16a8":"getPlayerId(address)","c4ae3168":"togglePause()","c4b05f49":"addThing(string,string,string,string)","c4b06c19":"SeedSale(address)","c4b14e0b":"getSignature(bytes32)","c4b195ab":"r2(address)","c4b24a46":"checkReward()","c4b2841c":"_doTradeWithEth(address,uint256,address)","c4b293db":"getBuyRatio()","c4b296a7":"getInvestorIndex()","c4b2a668":"GlavCryptPoint()","c4b2eccb":"maxAmountAddresses(address)","c4b35f3d":"DIV()","c4b379f7":"earningsOfPlayer()","c4b3a516":"setPercentageAvailableToSell(uint256)","c4b40fb7":"tkcAddress()","c4b4dff1":"PayChain()","c4b54551":"MAX_SPARTANS()","c4b5cde2":"EventBuyShip(address,uint16,uint64)","c4b5f891":"LTBToken()","c4b62bbb":"updateAddressSetting(uint256,address,address,string,string)","c4b67e8a":"generateReport2(int8[],uint32[])","c4b6b5fd":"initChallenge()","c4b6c2f3":"btcPriceProvider()","c4b6fec9":"sendVal()","c4b71cec":"ICO_LEVEL_1()","c4b781a8":"setPercentAllocationFee(uint256,uint256)","c4b7c4cf":"communityVote(bytes32,bool)","c4b80f6e":"incPlayerOwed(address,uint256)","c4b9223f":"setVestingSchedule(address,address,uint256,uint256,uint256,uint256,bool)","c4b9897b":"IagonToken()","c4baa573":"process2(bytes32,uint256[],bytes)","c4baf4a4":"IQT_FUNDATION_ADDRESS()","c4bb0173":"hash_sha3(string,uint256)","c4bc5da5":"resumeContract()","c4bc7b70":"setGlobal(uint64,bool)","c4bd8ebc":"num_monsters()","c4bde5e1":"totalLotteryNumber()","c4bebd69":"pauseLastStart()","c4bff124":"addBlacklistItem(address)","c4c0698d":"withdrawInEmergency()","c4c1b39a":"tokenPriceInitial_()","c4c1c94f":"add(address[])","c4c1d835":"DataAuction(address,address)","c4c22e98":"blockInterval()","c4c24249":"turnLast()","c4c2e702":"execute(uint32)","c4c308be":"getBeneficiaryCash()","c4c3718b":"satoshi_bth_decimals()","c4c39ba7":"SWAP_CAP()","c4c49380":"setCap()","c4c4a89b":"buyNewDrone(uint256)","c4c4d00b":"CRBTTokenLive()","c4c4e3c0":"GOLD_AMOUNT_SKL()","c4c4e438":"oraclize_query(uint256,string,bytes[3])","c4c50acf":"giftTokens(address,uint256)","c4c59c77":"ethIN()","c4c5f3de":"forecastingClosed()","c4c6710d":"buyTicket(uint256,uint256,uint256)","c4c676cf":"TRBToken()","c4c68b44":"getTotalSupplyForType(uint256)","c4c745b6":"getBonusFactor(address,uint256)","c4c842f7":"_emitJobBinded(uint256,uint256,bool)","c4c90d70":"withdrawHouseFee()","c4c90f4c":"tokenUsersSave(address)","c4cae886":"setManualTradingAllowed(bool)","c4cb291e":"unpaid()","c4cbb591":"compot()","c4cbd65b":"isTourUnfreezed(uint256)","c4cbfa44":"isConstructor()","c4cc161b":"SellSnail(uint256)","c4cc5616":"addStory(uint256,string)","c4cc6e53":"TgeOtherReleasingScheduleContract(uint256,uint256)","c4ccf6ea":"getAmountBonus(uint256)","c4cf8a40":"createTradeContract(address,address,uint256,uint256,uint256,bool,bool)","c4cf9385":"MetaMorph()","c4cfc5be":"PGE01NY()","c4d01481":"getPreRemainCoins()","c4d18b18":"calculatePoohBuy(uint256,uint256)","c4d252f5":"cancel(bytes32)","c4d259ad":"setIsAdmin(address,bool)","c4d2783c":"GTTAirdrop(address,address)","c4d2bac9":"HelloToken()","c4d3926a":"currentTokenIdNumber()","c4d42292":"ResidualShare(uint256,string,string)","c4d4fdc0":"getBonusRateForTimeBased()","c4d66de8":"initialize(address)","c4d77090":"nodeAddresses(uint256)","c4d7b98f":"erc20ContractSwitch(address,address,uint256)","c4d8aa44":"VenaCoin()","c4d9102f":"setNextID(uint256,int256)","c4d97470":"PeriodReset(uint256,uint256,uint256,uint256)","c4daa2a6":"roundFees(uint256)","c4dbf622":"buyPrice(uint256)","c4dc1556":"finalizeProposal()","c4dcad1d":"mining(address,uint256)","c4dd3b33":"checkUserSignature(address,string,uint32,string,string,bytes32,bytes32,uint8)","c4dd5acc":"isLastBadgeEle(uint256,uint256)","c4dddedd":"addressVerified(string)","c4ded499":"getActiveBetsAmount(address)","c4df310a":"isWithinTokenAllocLimit(uint256)","c4e11c91":"updateStats(uint256,uint256)","c4e12e1d":"updateMinVotedTokens(uint256)","c4e16b7d":"whitelistToken(address,uint256)","c4e1793f":"_onOverTimeBall(uint8,uint8,uint8,uint8,uint8[3][3][31])","c4e29e66":"getOrderHash(address,uint256,address,uint256,uint256,uint256,address)","c4e34d46":"lockBonusTokens(uint256,address,uint256)","c4e37095":"setSaleState(bool)","c4e3a63b":"firstPeriod()","c4e41b22":"getTotalSupply()","c4e5b7f2":"createAcceptAndPayFromBytes(bytes,address[],uint256[],uint256[])","c4e5fd83":"_safeTransferFromInternal(address,address,uint256,bytes)","c4e627c2":"maxTokenCount()","c4e6aaa6":"setLocationId(uint32)","c4e6c604":"otherAddress()","c4e7099f":"mockTime(uint32)","c4e71adc":"firstReleaseTime()","c4e7d14c":"MultiSender(uint256)","c4e85b63":"flushTokens()","c4e9311b":"bindJobWithBoard(uint256,uint256)","c4e98398":"SimpleRegistrar(bytes32,uint256)","c4e9e80b":"setAutoSell(uint256)","c4eaa978":"_price_token_ICO4()","c4eb2b3c":"putSaveData(address,address,string)","c4eb8ec2":"transfer_ether(address,uint256)","c4ecfbbe":"MonsterChampionship(address)","c4eeeeb9":"isReissuable(bytes32)","c4ef18fc":"setRentAuctionContractAddress(address)","c4ef92d3":"OmiseGOGold()","c4efa665":"decimalPrecision()","c4f06ba9":"makerOf(uint256)","c4f07cff":"getWithdrawTransactionIds(uint256,uint256,bool,bool)","c4f0a043":"BTCPrice()","c4f1215c":"maxGoalReachedAt()","c4f141ff":"setWeiPerCHF(uint256)","c4f14c9c":"restrict(address,address)","c4f1ce79":"clearCurPrize(address,uint256)","c4f2a64f":"blockWait()","c4f2a7af":"GeneScience(address)","c4f35d6c":"WithdrawalToken(uint256)","c4f363bf":"getVersionByte(uint256)","c4f3c097":"setBasicRate(uint256)","c4f54568":"blocktubeTag(string)","c4f5cd82":"firstAllocation()","c4f62031":"setPlayerPrice(uint256,uint256)","c4f7f1e2":"scaledRewardPerToken()","c4f8210e":"_safeTransfer(address,uint256)","c4f8adc7":"consul_nme()","c4f8b9fb":"testAdd(uint256,uint256,uint256)","c4f8f339":"getPercent4(address)","c4f95105":"showUnpayedPercent(address)","c4f987a5":"removeWorker(address)","c4f99aa5":"publicReservedAddress()","c4fa9c6b":"getReservedTokenDestinationList(address,bytes32)","c4faa950":"BrinkToken(uint256,string,uint8,string)","c4fbdaff":"gibLambos(uint256)","c4fc3a3b":"presaleTokenSupply()","c4fc89e1":"bubbled()","c4fce59a":"fourthExtendedBonusSalesEnds()","c4fd262a":"CrowdsaleStarted(uint256,uint256,uint256,uint256)","c4fda23e":"sellTokensIcoWithReferal(address)","c4fdc6b8":"pauseIco()","c4fe2675":"getProtoIdByTokenId(uint256)","c4fed7fb":"addHouseCredits(address,uint256)","c4ff3614":"Wallet(address[],uint256,uint256)","c5007227":"DTToken()","c500ea36":"userPendingCrateNumber(address)","c501024b":"setMinCutValue(uint256)","c5015018":"TEAM_MONTHLY()","c501b87f":"setCreditMcAddress(address)","c503101e":"setCanClaim(bool)","c503772d":"returnUint8(uint8)","c503a868":"getTeamFee(address)","c5043343":"tempSetWinner(uint256,address)","c5044b62":"isDescriptionFinalized()","c50497ae":"SUPPLY()","c50499db":"developer_string_contract_verified(string)","c504bfb8":"ColorsMain()","c50508de":"initialAuctionDuration()","c505c82c":"zxcSold()","c505ebce":"endRate()","c506adae":"migrateInvestorsFromHost(uint256)","c5072172":"justThrow()","c50853f5":"getNumPublications()","c50886ae":"test_ConsensysNotReached()","c508d8f2":"reederemPeriods(uint256)","c5096a69":"feeFor(address,address,uint256)","c509c262":"TokenManager()","c509db3b":"getverifytime(address)","c50aea06":"claimShares(uint256,uint256)","c50bb446":"getNeutralMutation(uint32)","c50bd2e4":"trancheDenominator()","c50be063":"myPlanetList(address,uint256)","c50be16c":"setPublicRelease(uint256)","c50c44cf":"getAuctionSeller(uint256)","c50c97d0":"changeStorage(address)","c50cb9ae":"transferComplex(address,uint256,uint256)","c50d725c":"DACToken()","c50d847e":"POSC()","c50ec10a":"repoAppId()","c50f197b":"charitySplitPercent()","c50f8274":"IWasFirstServiceToken()","c50ff563":"canSubAllocation(address,uint256)","c510187e":"vpfHash(bytes32,uint256,uint256)","c5104c3d":"minPurchaseAmt()","c5105bb5":"TotalEDUSupply()","c510c906":"getEventOutcomeNumeric(uint256,uint256)","c510da62":"getsell(uint256)","c510db20":"userCanStillBuyEth(address)","c510dfeb":"convertAddressFormat(address[8])","c510f746":"createElection(bytes32,bytes32[])","c51131fb":"canBeSet(bytes32)","c511a362":"TransferTargetToken(address,uint256)","c511b016":"SingularDTVToken(address,address,string,string,uint256)","c511ed5e":"closeMarket()","c51215df":"preSaleListTime()","c51226b3":"secondStageMintingDate()","c5129348":"See_price()","c512d1d1":"testCalculateItemId()","c5132a5c":"getCreateMarketDesignatedReporterAddressValue()","c5133802":"mintFraCoins(address,uint256)","c5135ba0":"fuckynum()","c513cde2":"KD1Token()","c513d596":"BountyAdded(bytes32,string)","c513f66e":"EMPTY_PARAM_HASH()","c51450ca":"getTokenIdAtIndex(uint256)","c514ff3f":"EasticoinToken(uint256,string,string)","c515205d":"getValue2()","c515627e":"depositEther(address,uint256,uint256,uint256)","c5160187":"mintStart4()","c5162e1a":"vendre(uint256)","c516358f":"bountyAddress()","c5179027":"team0Points()","c518123a":"financingPeriod()","c519099d":"teamAndFounders()","c519500e":"potSplit_(uint256)","c51a29e0":"getContractType()","c51be90f":"query_withGasLimit(uint256,string,string,uint256)","c51bf934":"CEILING()","c51cc592":"setTransferAllowance(bool)","c51cd5d6":"StarWarsRTscore()","c51cd6ad":"getLockAccount(address,uint256)","c51ce17b":"TelegaOut(address)","c51cf179":"calcBaseFeeForShares(uint256)","c51d16b6":"totalCollectedWei()","c51dc993":"expiryCheck(string)","c52046de":"isDeployed()","c5210e89":"ERC20Standard(uint256,string,uint256,string,bool)","c52141da":"checkSign(address)","c52164c6":"reputation()","c52173de":"xConvert(address[],uint256,uint256,bytes32,bytes32,uint256)","c5231563":"addAddress(uint256,address)","c523d5dd":"setBlockPart(uint64,uint64,uint64,bytes32,bytes)","c523ef11":"VNDCash(uint256,string,uint8,string)","c5241e29":"removeWhitelisted()","c5242acb":"setWithdrawOwner(address)","c524645b":"getTimeBonusAmount(uint256)","c527018b":"jdalevsystemscoin()","c527326e":"PFOffer(address,address,bytes32,uint256,uint256,uint128)","c5277ddd":"isPublisherRegistered(address)","c5282f7a":"generateTokensForPresaleAccounts(address[])","c528fee7":"DRCToken()","c5292c67":"getStart()","c5292ed9":"calculateEggSell(uint256,uint256)","c52987cf":"strikePrice()","c529b80b":"transferWithData(address,uint256,bytes32)","c52ab778":"execute(address,uint256,uint256)","c52adfda":"BobsNVag()","c52bd836":"setDappOwner(bytes32,address)","c52c936c":"removeByIdx(uint256[],uint256)","c52cb003":"OwnerDistribSupply_()","c52cde58":"getRedeemableTokensVoter(bytes32,address)","c52e40d0":"totalWeiExpected()","c52f02ce":"BLS_PRE_ICO()","c52f9fa6":"PartialOwnershipCrowdsale(uint256)","c5312191":"WeiController(address,address,address,uint256,bool)","c531c245":"exists(int256)","c531d52b":"STRUTToken()","c5337992":"setBossHPDefault(uint256)","c5337ed4":"random2()","c5339132":"lastPlayed()","c533fc68":"getLockAccInfo(address)","c5340dcd":"received_wei_with_bonus()","c53467cf":"releasePublicPresaleBonusTokens(address[],uint256)","c5346fb1":"approve_coin(string,bool)","c534ba4b":"destroyBlacklistedTokens(address,uint256)","c5350345":"Magexbit()","c535165f":"revealAndPayout(bytes,bytes)","c5364bc3":"GetChallengeWeightedVolumes(uint256)","c536c952":"getDsitribute(address,uint256)","c536ed5f":"buyDmlCoin(address)","c537a210":"principalOutstanding()","c537f954":"adjustDeployRange(uint256,uint256,uint256)","c53833fe":"getLastContract()","c539607c":"get_internal_block_number()","c53a0292":"increaseNonce()","c53abe29":"tokenOnlyDeploymentCost()","c53ad76f":"Kardashian()","c53adaff":"SingularDTVWorkshop()","c53b12f9":"myEthBalanceOf()","c53b9c04":"maxTimeRemain()","c53bafbb":"setPriceOf(string,string,address)","c53c2556":"getTokenIdFrombBPhash(string)","c53c614d":"canBeWhitelisted(string)","c53ce034":"totalDraw()","c53d6ce1":"getAllBalances(address)","c53d8483":"getActualTotalTokens()","c53dbf82":"disclosureAdded(uint256,bytes32,bytes32,bytes32,bytes16,bytes1,bytes16,bytes32,bytes32)","c53df200":"getArrUintField1()","c53df937":"unshareService(bytes32,address)","c53e4387":"IHODLToken()","c53ee3a5":"_setInitialCardPrice(uint128)","c53f926b":"setByuoutActive(bool)","c53fc65f":"tokensDevelopers()","c53ffe66":"KillerWhale()","c5401559":"setQuantityAdminOnly(uint256,uint256)","c5405f17":"registerUserBonus(address,address,address)","c540f903":"DeployRelay()","c540fb66":"updateBuyNum(bytes32,uint8)","c54110d6":"AcceptsNASDAQ(address)","c54117ac":"REDGILL()","c541783c":"getLockedBalanceOf(address,address)","c541a5bd":"revertAML(address)","c5426124":"getStar(uint256)","c542675e":"fus(uint256)","c54397a4":"changeAffiliate(address,uint256)","c543ae53":"evaluateArea(address,uint8,uint256)","c543b427":"IntegrationOfCredit()","c543c922":"devWithdraw(uint256)","c54421ae":"teamTokensNotDistributed()","c5442f7d":"getRandom(uint16,uint8,address)","c5444ff9":"buyTokens(address,uint128,uint256)","c544682b":"rewardForBurn(uint256)","c544f8d9":"EventRemoveFromBattle(address,uint64)","c5454d11":"Finalize()","c545c09d":"calculatePrice(uint256,uint256,uint256,address)","c5460e71":"getReleasableAmount(uint256,address)","c5465a23":"votingstage()","c546a92e":"testTransferTokensUsingRawCall()","c54704e6":"setLockStartTime(uint256)","c547092b":"setMilestone(uint256)","c547af82":"_totalVouchersSupply()","c547d8f1":"totalWeiAmountSale3()","c547e14d":"setHatchDurationByTimes(uint32[])","c54837a4":"extinguish()","c5487661":"proxyTransferToICAPWithReference(bytes32,uint256,string)","c5494b82":"SCH()","c5498e4e":"setTeamAndAdvisorAndAirdropAddresses(address,address,address)","c54996b7":"refundBond(uint256,address)","c549e4e9":"sellPriceAt(uint256)","c549e6b9":"DAYS()","c549e7a0":"ManualTokenMintRequiresRefund(address,uint256)","c54a068c":"getCurrentRateInternal()","c54a0980":"Total_Entries()","c54b25b0":"claimCancelled(uint16,address)","c54b5658":"toAddress(bytes,bytes,uint256)","c54c80eb":"RxPharma()","c54cd39c":"getSandwichInfoCaloriesPrice(uint256)","c54d59a1":"snt_claimed(address)","c54d8609":"setCoOwner2(address)","c54e73e3":"setPresale(bool)","c54e91c6":"currentPart(address,address)","c54f050c":"_createOrder(address,address,uint256,address,uint256,uint256,uint256)","c54f3409":"getGameEnd(address,uint256)","c54f5344":"OfficialWalletAddr()","c5503e89":"allocateTokensInternally(uint256)","c5505235":"toEther(uint256,uint256,uint256)","c5526d16":"setCrowdsaleWallet(address)","c5530077":"wildcards(uint16)","c55374d0":"oraclizeDelay()","c55425e6":"TotalOwnerSupply()","c5543b22":"powerDayPerPersonCapInWei()","c5546ecd":"transferTokensToParticipants(uint256,uint256,uint256,uint256,address)","c5549cc0":"minDeadline()","c554a600":"initTokenPorter(address,address)","c5566dac":"getNumberOfCourse()","c5575ef0":"checkTransferFrom(address,address,uint256)","c557b985":"icon()","c557d29c":"ByteLocker()","c557e552":"_getWager(address)","c558ae6b":"Airdrop(address[],uint256[])","c5590033":"setStatus(string,string)","c5592be2":"addContract(string,address,address)","c559743a":"included(address)","c559c395":"bitwordsCutOutof100()","c55a02a0":"SNT()","c55b6bb7":"setAdmin(address,address)","c55c1cb6":"queryN_withGasLimit(uint256,string,bytes,uint256)","c55c4115":"FEE_CHARGER_DENOMINATOR()","c55c4f47":"isCrowdsaleSuccessful()","c55d0f56":"getCurrentPrice(uint256)","c55d34d4":"airdropGW()","c55dae63":"baseToken()","c55dd86a":"isLegalPlayer(bytes32,address,address)","c55e0eaa":"bonusPeriodDurationInHours()","c55e4645":"LETOCoins()","c55ed894":"withdraw_to_owner()","c55ee28c":"nextSession()","c55f1f42":"timeLockSend(address,address,uint256,bytes)","c55f3b4c":"GetInventory(address,uint256)","c55f60dc":"checkAndUpdateLimit(uint256)","c55fb39f":"SAFE_PERIOD()","c5620ded":"LogBuy(address,uint256,uint256,uint256)","c56351cd":"createCrowdsale(address,uint32,uint256,address,uint8,address,address)","c5639ed2":"SUB(uint256,uint256)","c56551b6":"pos()","c56597ba":"_v2()","c565eba6":"isRoundTwoSalePeriod(uint256)","c566d43c":"registerPlayer(address,bytes32)","c5671148":"mul64()","c567cd26":"updateStudent(string,bytes32,string)","c567e43a":"show_me_the_money()","c567f304":"approveAddReserveData(uint256)","c5682244":"changeTickPrice(uint256)","c56893fb":"getLockerCount()","c5689e7d":"deWhiteListContract(address)","c56935e2":"showJackpotNextRd()","c5699ac2":"canRestoreUnsoldTokens()","c5699d68":"_compare(int256,bytes,int256)","c569bae0":"right93(uint256)","c569fb36":"setDepositPool(address)","c56a0ffe":"summDevelopers()","c56a3e88":"isManager()","c56af732":"CannabanC()","c56b2dc2":"upgradePony(uint256,uint256,bytes)","c56b4294":"_initialMint()","c56bbda4":"isTransferApprove(uint256)","c56bea64":"setBlacklistedUser(address)","c56c89a2":"ChendeWorld()","c56cf2b2":"getAllSaleAnimals()","c56d0d67":"tokensSoldWhitelist()","c56e3849":"Versioned(string)","c56e610e":"getEscrowBalance()","c56ecdfa":"_isOne(address)","c56ef049":"execBuyBack(uint256)","c56f1578":"UzairToken()","c56fc9c1":"PreSaleDistributed()","c570e952":"CustomPOAToken(string,string,address,address,uint256,uint256,uint256)","c5715483":"bonusMinContribution()","c571627b":"ChangeMainWallet(address)","c572652b":"distributeWithLockup(address,uint256,uint256,uint256,uint256)","c572ca10":"TokenProcurement(address,address,uint256,uint256)","c572dcc3":"getFreeMiner()","c572e9cb":"_decodeBuyData(bytes)","c57380a2":"getControllerAddress()","c573902d":"getInfoPanel()","c573e6bd":"distributeIfNeeded(address,uint256)","c57443fa":"ZRX_EXCHANGE_ADDR()","c574a53c":"addJurisdiction(bytes32[],bool[])","c574d156":"getGameBalance()","c575200d":"setPropertyBecomePublicEarnUntil(uint16,uint256,uint256)","c575c238":"sendToken(address)","c57679fc":"recipientMIT()","c5774a3f":"seedAmount()","c5787fa3":"picops_identity(address,uint256)","c578b2f4":"getTransformTarget_default()","c578f2c8":"SetCityName(address,bytes32)","c5793979":"sendCheck(address,uint256,bytes32)","c57949e2":"AllowanceLedger(address,address)","c57981b5":"FEE()","c57a050e":"fairandeasy()","c57a4a4d":"TOKEN_PUBLIC_SALE_CAP()","c57a8825":"updateRegistryAddress(address)","c57a99e5":"testFailRetractLatestRevisionEnforceRevisions()","c57c3bbd":"addLockProduct(uint32,uint32,uint32,bool)","c57c5f60":"initMultiowned(address[],uint256)","c57c7b62":"mktIssue(address,uint256)","c57d3fb7":"setReFundAddress(address)","c57d5fe9":"addToBalance(address,address,uint256)","c57dead7":"betsLost()","c57fbf90":"tokenRate(address)","c58068d8":"getIdFromStr(string)","c5809312":"setLLV_edit_28(string)","c58156e0":"removeAllocation(address)","c58343ef":"getRequest(uint256)","c5837713":"a_empresa(bytes5)","c583bb53":"RYNO()","c5854113":"MilestonesFactory(address)","c58580aa":"icoAddress1()","c585bb93":"registerAssetProxy(address)","c585de64":"Rate3()","c58684ab":"setPauseEmergence()","c5868754":"is_signed()","c587e3d6":"totalRised()","c587f93e":"softCapCountDownTimer()","c588415e":"phase4EndBlock()","c588953e":"enddate()","c588ba1b":"getLowestGameWithoutQuorum()","c588cabd":"firstBonusPercent()","c5893a8e":"OnPreSaleBuyerCompensated(address,uint256)","c589f1f3":"transferEthersToDao(uint256)","c58a3321":"setAccessControl(address,address,uint8,bool)","c58a34cc":"setTimeout(uint256)","c58a6ce8":"sendPayment(uint256,address)","c58aaae6":"selfDestructBeneficiary()","c58b54ef":"getAssetAttributes(uint256)","c58cc060":"firstBuyers()","c58ce220":"setDeveloper(string)","c58d0be0":"getCompetitionStatusOfRegistrants()","c58d96a5":"whiteListERC223(address)","c58f2f49":"hashTypes(uint8)","c58f520f":"sharingPool()","c5907a34":"Kanicoin()","c590c994":"unfreezeCount()","c5917695":"KevCoin()","c591b3ca":"itemCanVote(address,uint256)","c591c8a3":"getAllJinglesOnSale()","c59255dc":"changeMilestone(uint8,uint256,uint256,uint256)","c592c3ba":"addAmountBoughtAsMember(address,uint256)","c5933658":"registerEmailAddress(address,string)","c59361b9":"getInsurance(address,uint256)","c593dfbf":"queryDataFromId(address,uint256)","c5944f30":"Token(address,uint256)","c5947cd6":"getReportingState()","c594a12d":"areadjacent(uint16,uint16)","c59513a4":"updateMyTimeMintBalance()","c5958bda":"removeFile(bytes)","c595fee6":"adminWithdrawEther()","c5960c29":"buyKeyByAddr(address)","c59671a7":"set_dni(uint256)","c5980b07":"getDRSCoinDividend(uint256)","c5981892":"buyTokensCrowdsale(address)","c59981cd":"edit(uint256,uint256,uint8,uint8,uint8,uint8,string)","c599b77f":"setUserGroup(address,address)","c599d58f":"MAX_NUM_PAYOUT_ATTEMPTS()","c59a9428":"transferTreasurership(address)","c59acae4":"lrcWithdrawn()","c59b2e20":"NEVA()","c59b5562":"buyICO()","c59c1144":"setDefaultKey(address,address,uint8,bytes32,bytes32)","c59d278e":"vehicleDatesByCity(bytes32)","c59d4847":"getStats()","c59d55ad":"releaseTransfer(bytes32,uint8,bytes32,bytes32)","c59d5633":"getPurchasePrice(uint256)","c59d6abe":"getAngelClaims(uint64)","c59e0b87":"setSecondWalletPercent(uint256)","c59e5729":"upAd(uint256)","c59ea269":"snowflakeBalance(string)","c59ee1dc":"raisedAmount()","c59f3a7c":"getConditionsState()","c59f6983":"editMaxItems(uint8)","c59f83cf":"_getNftContract(address)","c5a0a555":"setImageRegionId(uint256,uint256)","c5a0ca8f":"init(address[],uint256[],uint256,address)","c5a0d1c7":"percentageQuarter1()","c5a104d9":"ln_fixed3(uint256,uint256)","c5a1d7f0":"metadataHash()","c5a2d352":"publish(uint256,bytes32)","c5a369b4":"addAddressDescription(string)","c5a46ee6":"value(uint256)","c5a4eb35":"initialPricePaid(uint256)","c5a55152":"distributeRewards(address[])","c5a60ddb":"payout(bytes32,uint256,uint256)","c5a6732b":"_isChallengerAttackFirst(uint256,uint256)","c5a796ac":"set_address_Arina(address,address)","c5a83c2b":"countAssets()","c5a88559":"getWithdrawNum()","c5a8a2ab":"changeStatus(uint256,uint8)","c5a8d421":"RocketFuelToken()","c5a9833e":"trusteeVaultAddr()","c5a988c9":"extendPreSalesPeriodWith(uint256)","c5aa0f17":"setNewJackpot(uint256,uint256,address)","c5aad3be":"getStackPtr()","c5ab4602":"updateBalance(address,address,uint256,bool)","c5ac124d":"cashToEth()","c5ac8a4d":"leftSharePrice()","c5aca3b2":"NYXDecentralizedIdentificationRequest(string,string)","c5ace443":"priceFeedSource()","c5ad94a9":"addressSharesCount(address)","c5ae6e0e":"Kernal()","c5ae7570":"getSaleFinancialData()","c5af3808":"setJntBeneficiary(address)","c5af9000":"Convert()","c5afc0a5":"BonusAllocation(address,string,uint256)","c5afce8b":"ensureInAccountList(address)","c5b045eb":"secondRoundPercent()","c5b05616":"TokenAuction()","c5b15057":"updateSettlementStatus(bool)","c5b15caf":"CIBOS()","c5b1a53c":"deposit(bytes16[],uint64)","c5b1d9aa":"newRound()","c5b1e789":"Unset(string,address)","c5b2333c":"set_status_user(address,address,bool,bool)","c5b2429d":"periodPreITO_tokenPriceUSD()","c5b35556":"bixToken()","c5b3a429":"PresaleStartTimeChanged(uint256)","c5b417ec":"buyPlot(uint256,uint256)","c5b43c39":"CypherX()","c5b53a34":"_setAuthorizedPower(uint256)","c5b748c0":"redemptionPrice()","c5b7589c":"startMiniGame()","c5b7be81":"TruckingCoin()","c5b7c51b":"participateEvent(address)","c5b7f5bf":"presale_eth_fund()","c5b85eb8":"UBSI()","c5b8d7a1":"cyclesStartFrom()","c5b8f772":"isOwnerOf(address,uint256)","c5b930f9":"singletonHash(bytes32)","c5b9cdf8":"SMARTCCCoin()","c5bac421":"pruneInvestors(uint256,uint256)","c5bafbc4":"eosDACToken()","c5bb8af4":"IMDEXsetInactivityReleasePeriod(uint256)","c5bcc4f1":"parentSnapShotBlock()","c5bd8456":"TakeOffWorldWide()","c5bd9089":"redeemCoupons(uint256)","c5bdbd70":"multDenominator()","c5be7a77":"_shareDevCut(uint256)","c5bef690":"_escrowIndex()","c5bef74e":"getHash1(address,uint256,address,uint256,uint256,uint256)","c5bf2249":"wallet(bytes)","c5bf339c":"getLastNonPublished()","c5bfa9d9":"getUserBalanceOnEther(address)","c5bfd5dd":"TokenDrop()","c5bfef39":"initCountry(uint256,uint256)","c5c00ac6":"needVerified()","c5c01169":"checkFrozenAccounts(address)","c5c03af3":"_mode()","c5c09b20":"TestRecover(uint256,uint256,uint8,bytes32,bytes32)","c5c0b859":"pauseMaster()","c5c0db08":"whom()","c5c187f5":"LogApproval(address,address,uint256)","c5c2f6e0":"getTopPlayerScores(uint256)","c5c4412d":"CleanBankerRound(uint8)","c5c4744c":"totalRaised()","c5c5135c":"crystalPrice()","c5c56740":"ROBIET()","c5c593e1":"openGameResultAndNewGame(uint256,uint256,uint256,string,bytes32)","c5c680f3":"testUser()","c5c6b12a":"isInvestorInWhitelist(address)","c5c715e4":"approveBatch(address[],uint256[])","c5c72bf4":"sayAnything(string)","c5c7681f":"Main(address)","c5c78258":"YoloTokenPresaleRound2(uint256,uint256,uint256,uint256,address,address)","c5c80103":"listFaceToFaceAttendants()","c5c8015b":"isNotContract(address)","c5c872ae":"transferFromRobot(address,address,uint256)","c5c87db4":"reinvestReturns(uint256,address)","c5c8a08a":"getExpirationTimeFromAddress(address)","c5c925e2":"StoreRegistry()","c5c93bdc":"Birth(uint256,uint256,uint256)","c5c95c55":"QuantityUnit()","c5c9e3be":"setPreparationPeriodTrainingFeeMultiplier(uint256)","c5c9f617":"walletE()","c5cac386":"Questions()","c5cc52fc":"Indemnisation_5()","c5ccebd3":"smallerPriceComparator(uint256,uint256)","c5cd3bec":"getRevisionTimestamp(bytes20,uint256)","c5cd88db":"missingFundsToEndAuction()","c5ce3911":"productId()","c5cf8c7e":"getCurrentHighscore()","c5d03fc0":"OftenChainToken()","c5d0c68b":"addMaster(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)","c5d14955":"phase_2_token_price()","c5d22e94":"MAX_TOTAL_AMOUNT_TO_RECEIVE_ETH()","c5d2577c":"newTransfer(bool,address,address,uint256,uint256,uint256)","c5d290d0":"RUNtoken(uint256,string,string)","c5d39a33":"isEating(address)","c5d456d6":"moves(address,uint256,uint256)","c5d46dfc":"computeScore(address)","c5d51586":"loser(address)","c5d5997c":"changeSubUser(address,address)","c5d61ad0":"newGame(uint256,bool,uint256)","c5d65d1a":"approveSponsorableJob(uint256)","c5d6a7f1":"GreatcoinERC20Token()","c5d6c75d":"PunchClock()","c5d7802e":"z()","c5d7dd0a":"Blockcash(string,string,uint256,uint256)","c5d81804":"mintSBIToken(address,uint256)","c5d83794":"setDesign(uint256,string)","c5d8adcb":"EventProduct(uint32,string,uint32,uint32,uint32,uint32,uint32,uint256,uint256,uint256)","c5d953a3":"setCurrentMarketRate(uint256)","c5d9ada3":"IANToken()","c5d9c762":"set_pre_kyc_iconiq_bonus_denominator(address,uint256)","c5dacf68":"getOwnerEth()","c5db22da":"lastBlock(uint64)","c5dba811":"doRandom(address[],address,uint256)","c5dc6b55":"getAccountBonus(address,address)","c5dce83d":"changeAPTController(address)","c5ddb614":"BlockFundIncubatorToken()","c5ddba02":"startDate1()","c5decd37":"ico3Raise()","c5df27ef":"ETHcap()","c5e08ba9":"get_oo_of(address)","c5e12813":"burnAllInvestorTokens(address)","c5e290cd":"_editInfoImpl(string)","c5e2a7db":"updateMetadata(address)","c5e2f418":"disableChanges()","c5e35f42":"Gentingchain(uint256,string,string)","c5e36b7e":"lockMana(uint256)","c5e3adf5":"nFund()","c5e3b1a6":"reclaimOwnership(string,string,bytes32)","c5e3e3f3":"s21(bytes1)","c5e412e5":"createSaleContract(address,uint256,uint256,bool)","c5e42338":"getIncreaseTotalStakeCalled()","c5e4594f":"multiline(uint256,uint256,uint256,bytes32)","c5e634e4":"transferAuditTokens(address,uint256)","c5e7b4fe":"setupPreIco(uint256,uint256)","c5e8b864":"hasEnoughBST(address,address,address)","c5e951a4":"agentOrdersOf(uint256,uint256)","c5e974ed":"transferToken(bytes32,address,address,uint256)","c5e98a4c":"updateIncentiveTokenLimit(uint256)","c5e991a8":"ThirdEtherLimit()","c5ea01c9":"testF2(uint256)","c5ea0b4a":"buySquare(uint8,uint256,address)","c5ea3c65":"maxId()","c5ea6256":"enableSecureMode()","c5ea8e1d":"RefUpdate(string,uint256,uint256,uint256)","c5eab684":"calculateDividends(uint256,uint256)","c5eaccfd":"whitelistAddrAndBuyTokens(address,uint256)","c5ebeaec":"borrow(uint256)","c5ec05fd":"scheduleSale(uint256,uint256)","c5ec365f":"guideInvestmentAttractedShareToPay()","c5ecfc61":"getEscrowDeposit(string)","c5ed7162":"firstPresaleStart()","c5ed8c99":"canCollect(uint256)","c5edd450":"payFor(uint256)","c5ee5688":"setCompte_25(string)","c5ef4c3e":"set(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","c5efaa11":"calculateValue(int256,uint64)","c5efaae8":"buyCredits(address,uint256)","c5efea68":"getAdminStatus(address)","c5f0d3d6":"geneKind()","c5f310c0":"register(bytes12)","c5f39cd7":"rateSecondTier()","c5f40edd":"discountedDealAmount()","c5f4b3da":"RewardPoolAmount()","c5f4c98b":"changeDiscountStep(uint256)","c5f5ce21":"advisorTokenWallet()","c5f60620":"expectedTokens(uint256,bool)","c5f70682":"setByuoutCount(uint256)","c5f713cf":"push(uint256,bool)","c5f7ed63":"NeckCoin()","c5f913fe":"callExitFromUnknownContract(address)","c5f956af":"treasuryAddress()","c5f98a3f":"mega()","c5fa1924":"MMS()","c5fbe723":"result_payto()","c5fc43cb":"Newera()","c5fc98c9":"TOKEN_THIRD_DISCOUNT_MULTIPLIER()","c5feaf60":"PRE_SALE_START_1()","c5fee757":"executeOrder2(uint256)","c5ff2069":"MooTokenSale()","c5ff2222":"playNo()","c600e1dc":"getProfit(address)","c6011633":"setRateFees(uint256,uint256)","c6017a25":"playerRoll(uint256,address)","c601b7f8":"icoPhase1Start()","c60211ee":"MineFinished()","c6028cf3":"nextSaleStage()","c6029e7b":"sendBPESOTokenToMultiAddr(address[],uint256[])","c603a4e3":"getTotalHP(uint256,uint256,uint256,int256)","c603ae14":"jockeyFS(uint256)","c603bd7d":"_executeOrder(address,uint256,uint256,bytes,int256)","c603c97b":"NewPiedPiperCoin(string,string,uint8,uint256)","c6041333":"calculateKnowledgeBuySimple(uint256)","c6046f77":"mintAndTransfer(address,uint256,bytes)","c6049946":"saleExchangeRate1()","c604bec9":"hasExtension(address)","c604e967":"delFilter(uint256)","c605f76c":"helloWorld()","c6062bc3":"sellerRefund(uint256,address)","c60778cf":"RefundRequest(uint256,address,uint256)","c6080b3f":"KiDhon()","c60880e0":"Aster()","c609ab26":"setImageCurrentRegionId(uint256,uint256)","c60aa10d":"newForgeCon(address)","c60b099f":"removeRate(uint256,uint256)","c60b7784":"queryEOSCrowdsaleKey(address,address)","c60bdc7f":"setUsersContract(address)","c60c13a3":"blockAccountFunds(address,uint256)","c60c3aca":"callFor(address,uint256,uint256,bytes)","c60cae29":"changePeriodTime(uint256,uint256)","c60ccb0e":"takerBuyAsset()","c60ce271":"findNextMinute(uint256,bytes)","c60ced1b":"LetsGoChain(string,string,uint256,uint256,uint256,uint256,uint256,uint256)","c60f56b2":"totalAcorns()","c60f6462":"resetRick()","c610bb07":"tranfer(address,uint256)","c6113205":"getTokenByIndex(bytes32,string,uint256)","c6114aaf":"updateIPOPrice(uint256)","c6117d37":"xactionFeeShare()","c611ded7":"reserveTokensAddress()","c6129a5a":"GetVersion()","c612cc4e":"compareDatesWithoutTime(uint256,uint256)","c613089f":"getBetsEvenAndODD(uint256)","c6132eb3":"timeBetweenRewards()","c6137977":"eliminateSmartContractByteCode()","c614b522":"getAllInvestmentPackageIds()","c614da67":"free(bytes12)","c615365f":"EthBetter()","c6159a35":"icoTransfer(address,uint256)","c6169e1f":"maxTournamentContenders()","c616f412":"totalQuantity()","c6178a65":"soldTokensSale()","c617fe6e":"_setAllowance(address,address,uint256)","c6180d27":"silverBoxPrice()","c618210a":"crowdsalepricing(address,uint256,uint256)","c618a1e4":"volume()","c618d15f":"ConvertNumbers(bytes5)","c6195d03":"ONE_DECIMAL_QUANTUM_ABC_TOKEN_PRICE()","c6195d36":"setConfig(address,uint256)","c6199b6d":"getCustomerServiceAddress()","c619bbd3":"GetPower()","c61b06ae":"collectibleIndexToOwner(uint256)","c61b8a44":"rewardGenerationComplete()","c61c3c4b":"buyPackWithETH(bool)","c61e42ae":"mint(uint256,int256)","c61e5be6":"cardSetsInCirculation(uint256)","c61ea7a3":"CrowdfundableToken(uint256,string,string,uint8)","c61efde6":"MsgEngine(uint8)","c61f1103":"foundersTimelock2()","c61f13a1":"setWitdrawGas(uint256)","c61f3a2c":"drpToken()","c61fb3f1":"Moon()","c62072d2":"nfo_transaction(uint256,uint256,address,address,bytes32)","c620b5fe":"isDaySecond()","c620ecc7":"KYCTeam()","c62122eb":"AmberToken()","c621f96e":"deleteDIDHolder(address)","c6220fbd":"dividendDistributionStartTime()","c6221878":"projectCompleted()","c6224757":"issueTreasury(address,address,address)","c622afb0":"getInsertPointForNumTokens(address,uint256)","c6235f8d":"delMarketMaker(address,address)","c623674f":"ipfsHash()","c6236a5c":"scheduleCall(bytes,uint256,uint256,uint8,uint256)","c6240303":"SetAuxOwner(address)","c6253f14":"XXXXXXXX08(uint256)","c625bd27":"transferFromBRXPay(address,address,uint256)","c625e9b1":"buyTokens(uint256,address)","c62631a5":"LicensingToken()","c62662f2":"setTotalCapitalization(uint256)","c6266693":"setCoreContract(address)","c626c52e":"isGame(address)","c6279ab1":"voteClose()","c627d0f8":"setCampaign(uint256,uint256)","c628ddc3":"TAIL()","c629061d":"external_oraclize_randomDS_proofVerify(bytes,bytes32,bytes,string)","c6291223":"fundTransferWithin(address,address,uint256)","c629cdf4":"collectPayout()","c629e770":"donorList()","c62aa67d":"getNodeId(bytes32)","c62c5fda":"setIcoFirstWeekRate(uint256)","c62cfa1d":"getMyNote(uint64)","c62d7407":"frozenOf()","c62dcd5b":"getSentTransactions()","c62dee76":"HumanBlockToken()","c62eac5c":"create(address,uint256,bytes32,int256)","c62fae5d":"getValueInfo(address)","c63012a1":"setHashPiture(uint256,bytes32)","c630f92b":"canEnterPool()","c630f96b":"ZToken(uint256,string,uint8,string)","c6314bf9":"companyAllocation()","c6317f37":"Token_Saled()","c631b292":"closeVoting()","c631e758":"clearRole(address)","c6321979":"buyTokenPack(uint256)","c632e654":"_takeRdFee(uint256)","c633084f":"sendGreeting(address,string)","c6335b26":"startInvasion(uint256,uint256[])","c633eb24":"generateReserve()","c63445f3":"setFeePool(uint256)","c634d032":"mintToken(uint256)","c634fd83":"adminSetDefaultFee(uint256,uint256)","c63545e9":"developer_edit_text_fees(string)","c6354bc0":"addCountries()","c6357b54":"impl_forging(address,uint256,uint256)","c635a9f2":"MinimumDeposit()","c635bf38":"keyGt(bytes32,bytes32)","c635d65e":"StandardToken(address,string,string,uint8,uint256,bool)","c6361267":"mintOneWeek()","c6366ce9":"TOTAL_ICO_CAP()","c636813e":"disapproveSingleUser(address)","c63755e1":"transferPresale(address,uint256)","c6381649":"getChats()","c6384071":"voteCount()","c638529f":"SetProvider()","c6388e6f":"_AtlantisToken()","c6393e62":"migrationSetBoard(bytes32,bytes32,string,uint8,address)","c63998ed":"updateUnitsOneEthCanBuy(uint256)","c6399fc7":"_setItemNotForSale(uint256)","c63a4e05":"getCartLength()","c63c1a27":"calcFight(uint64,uint64,uint256,uint256)","c63ccb3b":"Discount()","c63d04df":"BonusReferred(address,address,uint256,uint256)","c63d99db":"auctionName()","c63e2ebc":"setRoundStart(uint256,uint256)","c63e529b":"buy(string,string)","c63ebcbb":"claimedUnits()","c63f49ab":"LuckyDice()","c63fdcc7":"claimPayment(uint256)","c63ff8dd":"claim(bytes)","c64012a6":"CoinSent(uint256,address,string)","c640487d":"_changeLogicContractAddress(address)","c640752d":"update(address,address)","c641aaca":"addPrivateSaleEndDate(uint256)","c6427474":"submitTransaction(address,uint256,bytes)","c642b103":"treasuryTimelockAddress()","c642f094":"MOT()","c6430e29":"get_firstbytes(address)","c6434660":"isTakePermitted(uint256,uint256,uint256,address,address,uint256,uint256,address)","c643872e":"paymentTo(uint256,bytes,address)","c6440b3e":"sub(uint32,uint32)","c64572b8":"minimalPriceUSD()","c645ecc4":"handleReturnBytes32()","c6461625":"setIV_R4(uint256)","c64743d5":"BlockMined()","c6476fe9":"isMinimumInEther()","c647b20e":"setTaxes(uint256,uint256)","c647c3d9":"t_1st_StageEnd()","c648843a":"current_week()","c6490835":"total_tokens()","c64a2358":"_targetBlock()","c64a3239":"updateExec(address)","c64aace0":"airdropConjured()","c64bf22d":"SummerGreen()","c64bf32f":"distribute_token()","c64d73c6":"JCoin()","c64e03a2":"FAPcoin()","c64e08a0":"CampaignPausd(uint256)","c64e8bc0":"executeN(uint256)","c64f28c8":"createImage(address,uint256,uint16,uint16,uint16,uint16)","c64f9490":"updateAccessoryLock(uint64,bool)","c64fa2e4":"totalDividendShares()","c64fbbce":"_calcRemainingRoundTime()","c65025f8":"isSmartSharingEnded(bytes32)","c6502da8":"basePayment()","c6512a33":"CNC(uint256,string,uint8,string)","c6544e5c":"icoSpecConfirmed()","c6548076":"isUserBlacklisted(address,address)","c65538ec":"afterSTEDistributed()","c655d7aa":"recoverAddress(bytes32,bytes)","c655fd2c":"setSlowDump(uint256)","c6560856":"currentJackpotInWei()","c6567835":"changeVaultWallet(address)","c6570e67":"contractorTransfer_Scoupon(address,uint256)","c65799a4":"ReturnRequested(address,address)","c6580352":"HeroTrained(uint256,address,uint256,uint256,uint256,uint256,uint256,bool,uint256)","c65808b9":"getSpell(uint32)","c6585a27":"updateNotaireAddress(address)","c659ce2b":"setBountyAddress(address)","c659d443":"url(bytes32)","c659dceb":"is_verified()","c65a0fdf":"updatePixelIndex(uint16,uint16)","c65a4068":"_multisig(bytes32,uint256)","c65ac542":"saleUnpause()","c65ad85c":"isReadyToStart(bytes32)","c65b125f":"setContestContractAddress(address,address)","c65b490e":"getBabyMakinPrice(uint256)","c65c6eae":"getReadableContribution()","c65c9567":"gameResult(uint256,uint256)","c65ccc07":"setLtdParams(uint256,uint256,uint256)","c65cec32":"refundTokenToCustomer(address,address,uint256,address)","c65d15b9":"reference()","c65daea0":"allocated6Months()","c65fb380":"isSet()","c6601270":"getMyIceDragon()","c660477b":"GetData(uint256)","c6610dec":"owner_share()","c661deb4":"issueHardcapToken(address,address,uint256)","c661ee4d":"proofAddr()","c661fed3":"isAdvisor(address)","c6620580":"presale_tokens()","c6634ef5":"certify(uint256)","c6638df9":"LogTemplateCreated(address,address,string)","c66485b2":"setDefaultResolver(address)","c6653041":"ParticipantRegistry()","c666c798":"setExtendedTokenCap(uint256)","c6677519":"executeSettingsChange(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","c667ab20":"setFundsRegistry(address)","c6685617":"record(address,uint256)","c6688445":"stringToSignExample()","c668dfd7":"doAirdrop(address,address[],uint256)","c668ee3d":"operatingFundAddress()","c668f71b":"exchFee()","c6699ba8":"addPayTable(uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16)","c669c955":"incentivesIn(address[],uint256[])","c66a431d":"addContract(bytes32,bytes32,bytes32,bytes32,address,bytes32)","c66aaf0f":"sucessor()","c66bd6aa":"updateEthICOThresholds(uint256,uint256,uint256,uint256,uint256)","c66c2536":"doTransferOut(address,address,uint256)","c66c67e9":"setReservedTokensPercent(uint256)","c66e4095":"icoContract()","c66e9260":"ESCCrowdsale()","c66ed8f7":"lockGenesisImports()","c6702187":"CLAIM_SIGNER_KEY()","c6705a00":"signupUsersManually(address)","c6711049":"withdrawTokenManually(uint256)","c67117f5":"InvEnterpriseAddr()","c67146a5":"check_bet(uint256,address,uint8)","c6715f81":"left44(uint256)","c6716590":"DovieBarMitzvah()","c67410fb":"getOwnersLoan(address)","c67415f3":"mineCrystals(uint256)","c674e0c9":"setSmartContractStatus(uint8)","c67685a9":"turnOffCanUpdateDeveloperMiningPower()","c67747a5":"bitGuildAddress()","c6776239":"BitPropertyToken()","c677b207":"addElectedMember(address,string)","c6786e5a":"destroy(address[])","c678ca19":"comfirmIsses(uint256)","c678e618":"sendDividend()","c679580e":"isModuleHandler(address)","c6795b45":"bonusPatterns(uint256)","c67979a5":"PakistanRupee()","c6798033":"dedicatedProxyAddress()","c67acceb":"firstStageEndsAt()","c67b099f":"createWildcard(string,uint256,uint16)","c67b599a":"presaleMinPurchase()","c67bbc24":"getVolume()","c67c6eab":"stopCrowdSale()","c67ce6f5":"FlightDelayNewPolicy(address)","c67d376d":"getClosedCandidates()","c67e43c1":"setExpectedEnd(uint256)","c67f3ba3":"GanLiXia()","c67f3e1f":"totalDistributedinWei()","c67f7df5":"getDepositsCount(address)","c6803622":"wasCalled()","c68098d9":"personalCapEndAt()","c6814aa2":"copyPaper(address,uint256)","c681d68d":"badgeBalanceOf(address)","c68218d1":"setStrF1F2F3(string,string,string)","c6822356":"_createAss(string,uint32,string,uint256,uint256,uint256)","c682a10d":"createRoot(string,string)","c682d0bb":"authorized_updateSaleInfo(uint256,uint256)","c68309a7":"buyICloudSecsAgainstEther()","c683630d":"isWhitelist(address)","c6837a87":"getDepositeTime(address,uint256)","c683d8e4":"enableSale()","c6842868":"registerBroker(address)","c6851889":"Sale(address,uint256)","c68581ea":"addFile(uint256,string,uint256,string,string)","c686554e":"getInfo(address,address)","c687857c":"updateAsset(uint256,string,string,string,uint256)","c687ce9d":"setInitialOwner(address,uint256,uint256)","c6888fa1":"multiply(uint256)","c68890c7":"AcceptGuardianOffer(uint256)","c6891018":"take(uint256,bytes32[])","c68a3c1e":"setShares()","c68a536d":"GetLuckyRewards()","c68ad0a8":"Hold(address,address,uint256,uint8)","c68ae617":"authenticate(address,uint256,uint256,uint256)","c68b82c9":"ethLastUpdate()","c68bf3ea":"eDeposit()","c68cd47e":"COIN_SUPPLY_ICO_TIER_1()","c68cee04":"addArtistToRegistry(bytes32,address,uint256,uint256)","c68deb7e":"saleEndTimestamp()","c68e35b0":"verifyHash(bytes32,uint8,bytes32,bytes32)","c68e52d9":"setTimeStamp(string,uint256)","c68ee9cd":"search(uint256,uint256)","c68eebe3":"getCurrentTokenPriceInCents()","c68f2ada":"getDoc(string,string)","c68f7dfc":"test_hasClaimableShares_zeroClaimableStake()","c68fd307":"minimumContributionPresalePhase1()","c68fe0c1":"WeClosedInto()","c69034ab":"test_21_assertGasUsage50Boards()","c690c9a5":"Apollo()","c6912a39":"confirmRedbullQuest(address)","c692c049":"pushData()","c692d9de":"LogNeumarksIssued(address,uint256,uint256)","c692f4cf":"renounceAgent()","c69493a0":"subSale()","c69500fd":"rewardPay(address,uint256)","c695ff11":"randomAPI_url()","c6960d4c":"winnerid()","c6967c17":"DeviseToken(uint256)","c6969604":"emitBoardCreated(uint256,bytes32,bytes32,address,uint256,uint256,uint256,bool)","c69768dd":"createInkeTrade(bool,uint256,uint256)","c6979c0a":"WhitelistContract()","c697cbec":"_startNextRound()","c6998dc2":"updatePartner1_vows(string)","c69a00be":"setPeggedToken(address,address,address,uint256)","c69a8e13":"erc20BalanceForAddress(address)","c69b3936":"getNumSigs(bytes32)","c69b5df2":"prev_hash()","c69b5dfb":"verifyInvestors(address[])","c69b761f":"admin_set_deposit(address)","c69c7069":"mintPaper(string,string)","c69cd09d":"breedingFee()","c69e06db":"transactionsActive()","c69ed5f2":"executeTransaction(bytes32)","c69f4481":"setBlacklist(uint32,bool)","c69f8623":"convertSignalToMinimal(uint256)","c69fa8a9":"setAuthorizerAddress(address)","c69fbf48":"bountyProgram()","c6a00369":"LRCFoundationIceboxContract(address,address)","c6a05c06":"payOut(uint8,uint256)","c6a09d95":"grantAccess(address,address)","c6a0b13f":"cancelOnSaleCrab(uint256)","c6a0eb24":"test_threeInvalidEqBytes32Message()","c6a118d4":"impl_transferMS(address,address,uint256)","c6a17d2b":"pow10(uint256,uint8)","c6a22681":"getParticipantIndex(uint64,address)","c6a2573d":"oneTokenInEurWei()","c6a2afa7":"TokenECCAC(uint256,string,uint8,string)","c6a470e2":"getDisputeState(uint256)","c6a496bf":"Artwork(bytes32,uint256,string,string,string,uint256,address)","c6a4d345":"setMaxEscrow(uint256)","c6a4f4af":"getCurrentPotInfo()","c6a52959":"gba()","c6a5d5da":"updateBlocksPerDay(uint256)","c6a69931":"verifyCommit(address,uint40,uint256,uint8,bytes32,bytes32)","c6a71577":"WEKUToken(address)","c6a725d8":"confirmTransaction(uint256,bool)","c6a7d3af":"setTokenExcange(address,uint256)","c6a81857":"existsCountsById(uint256)","c6a898c5":"u()","c6a97c60":"SolusToken()","c6a98543":"ICONIC_NIC(uint256,string,string)","c6ab4514":"sendRobust(address,uint256,uint256)","c6ab5429":"KotET2()","c6ab5cdc":"closeBuy()","c6ab5d90":"withdraw(uint8)","c6ab848a":"referralInstance()","c6abc298":"getBetAt(address,uint256)","c6ac53fd":"submitTransaction(address,uint256,bool,bytes)","c6ad1191":"MyOwnCoin()","c6ad5d7c":"expireBid(address)","c6ae3b57":"dEthereumlotteryNet(address,address)","c6ae67ad":"fundcruToken()","c6af3166":"checkDouble(address)","c6af43f9":"updateThresholdNewAuction(uint256)","c6af477c":"get(bytes32,string)","c6afd98a":"requestConversion(uint256)","c6b0263e":"setPublicCapability(address,bytes4,bool)","c6b0a1fa":"checkPricePair(uint256,uint256)","c6b0de7e":"removeFromWhiteList(address,address)","c6b0ffd0":"is_success()","c6b20dc2":"Invacio()","c6b2a5dd":"updateCurrentSupply()","c6b3a7cf":"wplus(uint256,uint256)","c6b3ad7b":"setTWhitelist(address[],uint256[])","c6b4ad80":"ctu_owner()","c6b547e6":"getDocumentName(uint256)","c6b59e9e":"changeParameters(uint256,uint8,uint256)","c6b6005b":"TMSYToken(address,address,address,address,address)","c6b6b1e8":"ICOReserveSupply()","c6b6bc3c":"burnPurchase(uint256)","c6b85d2b":"AtomicX()","c6bbb6ef":"sendTokensTo7(address,address,address,address,address,address,address,uint256)","c6bc8dee":"testInitial2of3()","c6bcd5f7":"INTEGROToken()","c6bcefe5":"otherPoolTotal()","c6bd541f":"supportTeam(uint256,uint256,uint256)","c6bd5a13":"dividendsPaidPerShare(address)","c6bd62f5":"get_CountAllHolderForProfit()","c6bd9187":"closeEvent(bytes32)","c6bec93a":"startLottery(uint256)","c6befedf":"createPoll(bytes32)","c6bf03dd":"changeReleaseAccount(address,address)","c6bf7489":"sendLudumToMany(address[],uint256[])","c6c09252":"_generateCode()","c6c18e31":"PCToken()","c6c1e248":"ProductFactory()","c6c20a75":"getTotalCardValue()","c6c25d04":"artUrlList()","c6c27c71":"_slrByrLmtChk(address,uint256,uint256,address)","c6c2966d":"setFundingEnv(uint256,uint256,uint256)","c6c332f2":"getUserEthVolumeSaldo(address,address)","c6c39bda":"unitsOneEthCanBuyafter()","c6c3bbe6":"mint(address,address,uint256)","c6c3f3f9":"setKyberProxy(address)","c6c4676c":"currentResult()","c6c4bf44":"issueFor(bytes32,address)","c6c55773":"Topplay()","c6c599c1":"changeApprover(address)","c6c65136":"spiderReq()","c6c68eb7":"getAyantDroitEconomique_Compte_2()","c6c6b3ed":"Sale(uint256,uint256,address)","c6c7d143":"cancelRedemptionRequest(uint256)","c6c7f5aa":"impl_amountOfOrderQueue()","c6c85ca5":"updateTokenRate(uint256)","c6c8823c":"getActionPrice(string)","c6c8cdc7":"LogFundTransfer(address,uint256,bool)","c6c99744":"t01_setKey(bytes32)","c6caa959":"sellRock(uint256,uint256)","c6cb7a96":"orderMatchTest(uint256,uint256,int256,uint256,uint256,address,address,uint256,int256)","c6cb7ab8":"getBytesValues(bytes32)","c6cbc52a":"revokeCertificate(bytes32)","c6cbd5f0":"abandonedIcoBalances(address)","c6cc68b9":"BuyStockRocket(uint16,address)","c6cce2e7":"len(address)","c6cd15aa":"frozenVaults()","c6cd712d":"delegatedTransferAndNotify(address,address,uint256,uint256,uint256,bytes32,bytes,uint256)","c6cdbe5e":"categories(uint256)","c6cdc6f6":"fastICO(uint256)","c6cdf77e":"upgradeWeth(address)","c6ce2664":"setBancorRegistry(address)","c6ce81f0":"manualSendTokens(address,address,uint256)","c6ceafef":"setFeedAddress(address)","c6ceb50b":"Decimals()","c6cebebd":"get_info(uint256)","c6ced32b":"getWorkersCount()","c6cf1c7f":"generateRandomPerformance()","c6cf452b":"testInitialA()","c6cf4dd9":"upgradeOnePointZeroBalances()","c6d04634":"BasicCrowdsale(address,address)","c6d0be63":"emergencyCease()","c6d0ffda":"failedTemperaturesLength()","c6d1d23d":"totalPledgedFeesAt(uint256)","c6d2cb6a":"getLavaTypedDataHash(address,address,address,uint256,uint256,uint256,uint256)","c6d32838":"deathData_f3()","c6d3ab9d":"changeTokenSymbol(string)","c6d417de":"NewName(address,string)","c6d44ecc":"_getTokenCountToBuyFromSeller(uint256)","c6d456ec":"Winning_Entry()","c6d48e0d":"getVersionsCount()","c6d69a30":"setTaxRate(uint256)","c6d761d4":"cancelEscape(uint32)","c6d779e6":"getAmountOrdersForDay(uint256)","c6d784cc":"Statustelega(address)","c6d81547":"DecisionTokenSale(uint256,address)","c6d8a203":"setConversionRateAddress(address)","c6d8be5a":"setPricingStrategy()","c6d8f0c4":"getLocks(uint256)","c6d90e70":"AcceptsDailyRoi(address)","c6d9112a":"MAX_DAILY_TOKEN_COSIGN_SPEND()","c6d95512":"ExchangeTokenPushed(address,uint256)","c6dad082":"make()","c6daeeaa":"TIME_TO_HATCH_1SNAIL()","c6dbdf61":"primary()","c6dc3640":"AirDropPayBitsR2(address[])","c6dc437b":"bids_ignored_count()","c6dca1d2":"proposeAsset(string,uint256,uint256)","c6dd5098":"DateCoinCrowdsale(uint256,uint256,uint256,address,address,address,address)","c6dd5db5":"validateOrder(address,uint256,address,address,uint256,address,uint256,uint256)","c6dd8018":"Cygnal()","c6ddcfe8":"publicSellToken()","c6ddd889":"ForeignBridge(uint256,address[])","c6de150b":"soldIdeaWei()","c6de5709":"calc_partnerPercent(address)","c6deeb9d":"contributionAccepted()","c6df66a7":"firstPlay(bytes32,uint8,bytes32)","c6e000b5":"mntpToken()","c6e0329f":"LaoHuiHui(uint256,string,string)","c6e04590":"rateHard()","c6e08ba9":"EligmaCrowdsaleContract()","c6e0c908":"checkTransferFromWithReference(address,address,uint256,string)","c6e0dc6e":"ChangeTransferStatus()","c6e1c178":"TheLuckyOne(bytes)","c6e3a9b3":"_total_sold()","c6e3d1b4":"promotionsOfHost(address)","c6e3e8fd":"getManualByAddress(address,address)","c6e3ffc3":"determinePID()","c6e416b5":"addressGains(address)","c6e5546c":"distributeTokens(uint256,uint256)","c6e68059":"DeAuthorized(address)","c6e68ea6":"createTournament(bytes32,uint256,uint256)","c6e6ab03":"allocateCandyToken(address[],uint256[])","c6e6b803":"grantAt()","c6e715e1":"rechargeDeposit()","c6e81b07":"remainingAuctionable()","c6e8b4f3":"createProxyAndCall(address,address,bytes)","c6e946df":"ComputePharaohReq()","c6e994d7":"shareWithdraw()","c6e9ce11":"NZD_CLEAR()","c6e9ff54":"changeBonusDistributionAddress(address)","c6ea3037":"_createSale(uint256,uint256,uint256,uint256,address)","c6ead8af":"tokensBurnt()","c6eae0c5":"limitEth()","c6eb8a65":"stage2BeginTime()","c6ed3418":"TokenMintPoD()","c6ed8990":"addTokens(uint256)","c6ed8e1b":"getApprovedProxys()","c6eda379":"totalZTKCheckAmounts()","c6ee701e":"getInts()","c6ee7a2c":"Linkable(address,address)","c6eeeb04":"increaseTimeBy()","c6f017e1":"addOrgan(address)","c6f03aaa":"getRegister(string,string)","c6f0557f":"insertarMensaje(uint256,string,string)","c6f067d1":"MVPToken()","c6f3a895":"endFirstPeriodTimestamp()","c6f47486":"getHistoricalPrice(uint256)","c6f482aa":"largeCapDelay()","c6f48866":"isGameOver(bytes32)","c6f4ebb3":"o_minerador(uint256)","c6f54e62":"order(address[2],uint256[4])","c6f5b0e0":"getContributor(uint256)","c6f5d91f":"getAddressWhiteList()","c6f6122d":"transferredManually()","c6f664af":"totalInsuranceFlows()","c6f6d9d9":"lotteryCount()","c6f6f216":"setMaxPerTx(uint256)","c6f70370":"generateRoomNightToken(uint256,uint256,uint256,uint256,uint256,bytes32)","c6f88b0a":"_hasCorrectTreasury(address)","c6f981d7":"setTrap(uint256)","c6f9defe":"futureExpanstion()","c6fadeb3":"fechAllSumNumForEncourage(uint256)","c6faf736":"updatePromoBonus(uint256)","c6fc2bae":"ACEEquityToken(uint256,string,string,uint8)","c6fd2103":"recordImbalance(address,int256,uint256,uint256)","c6fdee56":"isAddress(address,address)","c6fe317f":"changeVanityURL(string)","c6fe7296":"resetPhases(uint256,uint256,bool,uint256,bool)","c6ff3ae3":"EthMark()","c6ff4081":"tokenProcess(address)","c7005f04":"distributeInternal(uint256,uint256,uint256,uint256)","c701672f":"_recordPresalePurchase(address,uint256)","c7021c9e":"submitPresetTransfer(address)","c7024b98":"deleteHybridization(uint256)","c7027329":"isBossWannaCryContract()","c7028f96":"burnAllLeftTokens()","c702d3b4":"Unregistered(address,address,uint256,uint256,uint256,uint256)","c7033721":"genesisRoot()","c70383a5":"takeOwnerShip(uint256)","c7046117":"sendAsGift(address,uint256)","c7047fa7":"metadataUrlPrefix()","c704e04a":"recordingResultsOfBet(bytes16,bytes16[],uint8[])","c704f7ed":"lockName()","c705a1a8":"getMerchandise(uint256)","c705e1a3":"allowToken(address,address,uint256,bool,bool,address)","c7071c3e":"MiningRewardChanged(uint256)","c707936a":"Serpent()","c707bae5":"getTopNames()","c708ed9c":"getPI_edit_15()","c7091c5e":"INITIAL_STAGE()","c70978da":"UnicornBreeding(address)","c7097f62":"linkAddress(address)","c7098e91":"decodeOrderTokenAndIsBuy(uint256)","c709c7b8":"priceStep7()","c70a24af":"ROLE_NEED_LOCK_UP()","c70a3f1a":"whiteHat()","c70a9246":"GetConsentData(uint256)","c70ad05b":"identity_storage()","c70bbc13":"emitRevoke(bytes32,uint256,address)","c70cc560":"storePassword(string)","c70cdad8":"hashBacktestPositions(uint32,int64[])","c70cef3a":"WalamaCoin()","c70d169d":"answerRequest(uint256,bytes)","c70dd8b3":"procureTokens(address)","c70e8640":"amountFundTeam()","c70ef908":"setPI_edit_33(string)","c70f5eaa":"buyCard(uint256)","c70faf90":"EndMinting(uint256)","c70fe6bd":"migrateAuction(uint256,address)","c71029e1":"getBankRequests(string,uint256)","c7102df7":"__stopBlock()","c710a2aa":"marketplace_controller()","c7110035":"multiSigWithdrawal(address,uint256)","c7120bad":"linkAccount(uint8,string,string)","c7120d77":"sendFunds(address,uint256,uint256,uint256,uint256,uint256)","c712f3b3":"TradeId()","c7133f53":"setAccountS(address)","c713a67b":"momentNonceOf(uint256,uint256)","c713aa94":"setEndBlock(uint256)","c713b10f":"isSameSign(int256,int256)","c713bd70":"getMarketerRate()","c7143c41":"notSameSeed(string,string)","c7144269":"changeSettings_only_Dev(uint256,uint256,uint256,uint256,uint16,uint256,uint256,uint256,uint8,uint8)","c7153816":"lowerSupply(uint256)","c715533e":"allFrozenTime()","c71692b6":"capPreICO()","c716b616":"adopt(uint32,uint32)","c7172710":"pouseCrowdsale()","c7178230":"isDeprecated()","c717e9eb":"voidOrRevert(uint256)","c718b272":"Floor(uint32,address)","c718b2bb":"YunToken(address)","c718d0e0":"_setFreezedBalance(address,uint256,uint256)","c7192cda":"EventUpdateWasReset()","c7192e44":"setPaid(address)","c719348b":"safeCheck(uint256)","c71a7aea":"distributedReservedTokensDestinationsLen()","c71ad84d":"vehrespond(uint256,uint256,address,bool)","c71b583b":"closeRequest()","c71ba100":"revokeBalance(address,address,address)","c71bee4c":"OMITokenLock(address,address)","c71bf8ba":"multiplierOfPrice()","c71c0b40":"fundRaised()","c71c3f05":"blackListCompanies()","c71c890a":"weekFourStart()","c71cb0b4":"buildTile(uint16,uint16,uint8,uint16)","c71cbcf3":"recoverAccount(address,address)","c71daccb":"checkBalance()","c71ddb9f":"releaseContract()","c71e48d6":"setOutcome(bytes32,bytes32[])","c71e876b":"VESTING_DURATION_2Y()","c71eef58":"applyForTokenOneDay()","c71f2bae":"AddOpenOrder(uint32)","c71f311c":"setFABAcompanyTokensWallet(address)","c71f4253":"getNumberOfVotes(uint256)","c7216a44":"_generate_special_horsey(address,address,address,bytes32)","c721b34b":"setBattleAddress(address)","c721b6bd":"grantVestedTokens(address,uint256,uint256,uint256,uint256,bool,bool,bool)","c721cfe2":"reClaimBalance()","c721f08d":"activateSale()","c722328d":"withdrawToMultisig()","c722e113":"_transferDivs(uint256,uint256,uint256)","c722e462":"CoinX()","c7238af7":"escapeDestination()","c724772c":"turnOnIco()","c72486d2":"Unexpended()","c724acb7":"calcDifficulty()","c7258d7f":"isUserWhitelisted(address,address)","c726c2b9":"getPI_edit_24()","c726dea8":"memberArray(uint256)","c7277115":"ManagedToken(string,string,uint8)","c727980a":"payDeposit(uint256,address,uint256)","c7280315":"UnauthorizeToTransfer(address)","c7286a21":"removeContribution(address)","c7291b7e":"descriptionHashHistory(uint256)","c729a567":"withdrawFundToAddress(address)","c72a2328":"tier_rate_1()","c72a480e":"DGameController(address[])","c72b5176":"getGroups()","c72b5e4f":"persentRate()","c72be838":"gasForDCN()","c72c1133":"Log(string,uint256,uint256)","c72c757e":"delete_allowedAddress(address,address)","c72e1576":"addAddressInWhitelist(address)","c72e57c7":"lockedTill()","c72e6d03":"p_setRefPercent(uint256,uint256)","c72e8baf":"PRICE_3()","c72e9e45":"setEgeregAddress(address)","c72f0dd9":"Player_HitOrStand(uint256,bool)","c7303c61":"createPost(string)","c7304f37":"changePool(uint88)","c730bbd8":"rateWaiting()","c730dfbb":"WemarkToken()","c731c504":"restoreFunds(address,address,uint256)","c731e124":"rewardslength()","c73202ff":"jpPercentageDivisor()","c732d201":"currentCount()","c7330bf6":"getDepositesCount(address)","c7343754":"getLendingItemLength(address)","c7347832":"asyncTransfer(address,address,uint256)","c734f917":"onTokenTransfer(address,uint256)","c73659be":"RexToken(uint256,address)","c736e118":"bgxWallet()","c7377d80":"Bourneereum(uint256,string,string)","c737b7c6":"getTotalTickets(address)","c7381593":"Multimember(address[],uint256)","c7385f2e":"proofIds(uint256)","c738a836":"changeEnabledAddressStatus(address,bool)","c7395151":"updateMaxAcceptedDeposits(uint256)","c7398dd4":"getCustomValue()","c73992e4":"hasApproved(address)","c73997b1":"changeBaseValue(uint256,uint256,uint256)","c739d31c":"setPrivateSaleAgent(address,bool)","c73a2d60":"disperseToken(address,address[],uint256[])","c73aae86":"get_Release()","c73b187d":"oraclizeMinCallbackGas()","c73b302e":"projectsCount()","c73c27bc":"getNodeId(uint256)","c73c2a45":"WriteBible(uint16,uint16,uint16,uint16,string)","c73c933d":"ChangeBurnBoundsOperationEvent(uint256,uint256,uint256)","c73d3b30":"getAbilities()","c73defce":"ETCHaddress()","c73ea367":"setNickName(string)","c73ec2eb":"minCompositionFee()","c73f0c11":"burnGlobFoneCoin(uint256)","c73f20e3":"issueamount()","c73fcee2":"CLNTotalSupply()","c74073a1":"close(address)","c740bc9f":"setLongtermMinter(address,uint256)","c7410070":"publicbattlestart()","c7411eb4":"calculateAntBuy(uint256,uint256)","c741764c":"oldE4()","c741d70d":"retrieveFounds()","c741e85a":"set_parameter(string,uint256)","c741f0f3":"buyBILL()","c7420a9f":"store(bytes,address,address,uint256,uint8,uint8)","c7423803":"finishRecovery()","c7423f26":"strFundDeposit()","c74266b3":"HanYinToken()","c742bab1":"VUP_TOKEN_SUPPLY_TIER1()","c743092e":"Buy(uint256,address,uint256,uint256,uint256,uint256)","c7430e28":"Trillionix(address,address)","c7431f5c":"changeETXAddress(address)","c74352af":"FileServerManager()","c74370db":"Transfer(address,address,uint48,bytes)","c74442e6":"withdrawNexiums(address)","c7445c22":"getPassportId(address,address)","c7446565":"startAt()","c74590e3":"LogInvestment(address,uint256)","c745ca9a":"transferBack(uint256,address,address)","c745dab9":"MakerDepositedEther(uint256)","c7464e8a":"showRandomWinners()","c746a52d":"showme(uint256,uint256,uint256)","c746b299":"PSCToken()","c746c8f4":"addAllowedSender(address)","c747ef76":"AbieFund(address[])","c747f120":"totalIssuerCollateralisation()","c74803de":"_isContained(bytes32,bytes,bytes32)","c7489441":"closeMarketMaker(uint256)","c748b54b":"PeerWalletsERC20Token()","c74a2449":"canUserAnswerQuestion(address,uint256)","c74a690c":"price_in_wei()","c74a827c":"setMonsterCreatorAddress(address,address)","c74a96eb":"setHGT(address)","c74abe43":"getMyTokensValue()","c74b1e01":"startPresaleTime()","c74b5a3e":"open5Chest()","c74c251f":"addSafely(uint256,uint256)","c74c851a":"isValidInvestment(address,uint256)","c74ca049":"unshareKey(bytes32,address)","c74ce765":"TESTTESTToken(address)","c74e907b":"commit(address,uint256,uint256)","c74fc077":"guards(uint256)","c74fda29":"_distributeAdvisorsToken(uint256)","c7506049":"_processSalePurchase(address,uint256)","c7508ec7":"removeClaim(address,address,bytes32)","c750938e":"shiftcashToken()","c750c3b1":"allocateEndTime()","c750cb79":"getHighestBidder(uint256)","c750df73":"submitContract(bytes32)","c7516da7":"CITY_INCREASE_RATE()","c751e027":"PoolTeam()","c752746e":"tokenHoldersClaimed(address)","c752a999":"MoneyTokenPromo(uint256,string,uint8,string)","c752ff62":"totalUpgraded()","c75363b6":"BEGIN_TIME()","c7542f1d":"GCCToken()","c754fc08":"addGroup(uint256,uint256,uint256)","c75514e8":"executeOptions(address,uint256,string)","c7559da4":"uint256ToBytes(uint256)","c7573e82":"registerStudent(address)","c7574839":"communityWallet()","c7576e8f":"TOBToken()","c7576ed4":"finalizeMigration(address,address)","c75782be":"startup(uint256,address)","c7586cde":"THIRD_USER_CUT()","c758b813":"ausGroupAllocation()","c75902cf":"iwtfundtokens()","c7591d35":"checkGuess()","c7593f01":"SKLAuction()","c75abf24":"setup(uint256,uint256,uint256)","c75bc4fb":"setMaintenanceLock(bool)","c75bc6f8":"UniverseShieldToken(address,address)","c75d9d29":"unlockPurchase()","c75e8d55":"setRecipientString(string)","c75fb740":"Error(bytes)","c75fc22f":"freeEther()","c7600cde":"getInitialReporterAddress()","c7602316":"deploy(string)","c7614487":"MAX_CROWD_FUNDING_ETH()","c761a2f5":"revertFeeCalculatedFlag(bool)","c762547d":"contractCreatedCount()","c762c463":"mUsers(address)","c762d3ea":"calculateReferralBonus(uint256,uint256)","c762d5f7":"setBorrower(address)","c763400e":"endpreIco(bool)","c763e5a1":"chain()","c764427c":"addAllowedContract(address,address)","c764d4c4":"withdrawCountriesToken()","c764ee57":"VIWOZ()","c7656f6e":"startProject()","c765defd":"setBeneficiary(address,bytes32)","c76668cf":"transferCheck(address,address,uint256)","c7669337":"fundMinting(address,uint256)","c766ce02":"addFactProviderToWhitelist(address,address)","c768051a":"gla()","c768a4cd":"upgradeSword(address)","c768ac01":"totalWithdrew()","c76a4bfb":"relayReceiveApproval(address,address,uint256,bytes)","c76a74df":"Bitscoin()","c76b838c":"bulkSell(uint8[],bytes6[],uint32[],uint32[])","c76c1ba5":"placeBet(uint256,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","c76c68d0":"CalcToc(uint256,uint256,uint256)","c76c9269":"ethVest()","c76d0754":"fiatSend(address,uint256,uint256)","c76de3e9":"Start(string,string)","c76df481":"getArmyOwner(uint256)","c76e7f32":"addressToPersonId(address)","c76f0d13":"COSTToken()","c76f80c8":"_createCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint32)","c772173a":"ProsperToken()","c7725426":"setAuthorizeMintToken(uint256)","c772af39":"boss()","c7736abf":"windowOpenTime()","c77547f7":"maxTimeIntervalHB()","c7760b11":"getlevel(address)","c77636fc":"PauseOwnerAdmin(bool)","c77684f9":"ClipperCoin(uint256,string,string)","c776cc42":"FREEDOMCoin()","c7775011":"setSlaveWallet(address)","c77810a4":"Pot()","c778427b":"migrationInitiated(address)","c7786275":"Bitansuo()","c778a46b":"doPresaleMinting(address,uint256,int256)","c7798891":"TokensReleased(address,uint256)","c77a0de6":"xfer(uint256)","c77a16ed":"resumeTransfers()","c77ae9bf":"resetRaz(uint256,address,uint256)","c77bd8cc":"acceptAdminToo()","c77bdfce":"bindToken(address,address)","c77c00f8":"openNewBet(address,uint256,uint256)","c77dff62":"shrimpyramid()","c77e7614":"getTotalWithdrawAmount()","c77ef9b8":"setAccessProvider(address)","c77f58c8":"transferMinusComission(address,uint256,uint256)","c77fe4d6":"incentivisingSupply()","c781d7b0":"calculateAntSell(uint256)","c781f97b":"getCurrentCrabPrice()","c7825c3f":"Pruebalillo()","c782fc60":"getExtraBalance(address)","c783dc9e":"pullEther(uint256)","c783fb10":"validBalanceOf(address)","c784648d":"addIdArrayItem(address,uint256,string,string,uint256)","c7847d19":"createAnnoTrade(bool,uint256,uint256)","c7857d27":"setMyName(string)","c786a66f":"_createSchedule(address,uint256,uint256,uint256,uint256)","c786ebd1":"LogPrepareToStart(string,uint256,uint256,address,address)","c7876ea4":"basePrice()","c7878fa0":"setHumanityFund(address)","c7888a07":"claimSuperDragonEggs()","c7891514":"forthWeekMainICOBonusEstimate()","c78974de":"get_test_data_length()","c78982d5":"getIntervalCoefficient(bytes2,uint256)","c789ea87":"acceptFoundation(string)","c78a33e1":"DestroyEvent(address,uint256)","c78a4c98":"icoRaised()","c78a8dfe":"Kardanor()","c78ad77f":"percentage()","c78af2f7":"contributeByProxyContract(address,uint256)","c78b200c":"transferableFromBlock()","c78b616c":"totalListings()","c78bd060":"makeInvestment()","c78c0138":"timestamp_contract_start()","c78c3a83":"getPredictions()","c78cdf66":"mintTimelocked(address,uint256,uint32)","c78d7380":"COINECTToken()","c78d846d":"PTCToken()","c78dc603":"alt_buyCollectible(uint256,uint256,int256)","c78e139a":"setUpgradedContractAddress(address)","c78f3e18":"starteth()","c78fc487":"indexedByOwner(address,uint256)","c791316e":"minFundingAmount()","c791bd21":"AngelToken()","c791cc39":"BOECoin(uint256,string,uint8,string)","c791e16b":"platPriceOracleContract()","c792024a":"tierRates(uint256)","c79343e5":"isSYNVault()","c7939f34":"oddsTotal(uint256,uint256)","c79403f5":"moveFurnaceData(address[],uint16[],uint256[],bool[],uint256[])","c7941a09":"setDelegadoDeEscuela(bytes32,bytes32,uint8,uint8)","c794549e":"setDesignatedReport(bool)","c7946842":"URLOf(uint256)","c794ef10":"purchaseCostEther(uint256)","c794f575":"makeAnnualInvest(uint256)","c7956846":"get_solved(address)","c795dd24":"availableTokenBalance(uint256,uint8)","c7963ae8":"Tabo()","c7968135":"totalNumberOfFunders()","c798b5cf":"CommunityToken()","c7990f70":"SetDevFee(uint16)","c7995a4e":"_registerTrade(uint32,uint256)","c79a68cf":"setPrices(uint256,uint256,string,string)","c79ba27d":"kscTransferFrom(address,address,uint256,string)","c79bb895":"SGACrowdsale()","c79bdb46":"setRewardPercent(uint256,uint256)","c79c9105":"countOfPublicKey(bytes32)","c79eaa22":"sub(uint96,uint96)","c79f5321":"update_data()","c79f7cef":"_postValidatePurchase(address,uint256)","c79f8b62":"error()","c79fc609":"addressC()","c7a02061":"totalEtherCollected()","c7a08487":"_generateRandomDna()","c7a16847":"SetRewardMulti(uint256)","c7a16965":"testUint(uint256)","c7a1865b":"play(bytes32)","c7a1f221":"tokenPriceInCents()","c7a1fb36":"PRE_SALE_CAP()","c7a24403":"Illuminatus()","c7a28247":"stopBuyingTokens()","c7a2a663":"getCodeAtAddress(address)","c7a323fe":"ACTION_INITIAL_BIDDING()","c7a32726":"StartCrowdsale()","c7a37657":"getCfd(uint128)","c7a3778f":"testControlRetractLatestRevisionNotUpdatable()","c7a4af15":"setPrice(uint8,uint128)","c7a4cf8d":"checkOverMaxcap(uint256)","c7a4e4bc":"VIPCHAINToken()","c7a5d285":"extract(address)","c7a6c454":"confirmTransaction()","c7a6c6d4":"_creditTokens(address,uint256)","c7a86dd2":"updateEnergy(uint32,uint32,uint256)","c7a86e33":"signedApproveCheck(address,address,uint256,uint256,uint256,bytes,address)","c7a96920":"stopICO_20_March()","c7a9a64b":"depositNetfRevenue(uint256)","c7a9d6de":"startICO(address)","c7aa278e":"poolInvestors()","c7aaa83f":"Bounty0xToken()","c7abc42a":"getgamecard(uint256)","c7ac0909":"AddedName(address,string,uint256,address,uint256)","c7ac14b1":"dividendCutPercentage()","c7acae2e":"getServerAddress()","c7ad31b0":"LogHodlStartSet(address,uint256)","c7adb61f":"initializeTreeCoinProject(address,uint256,uint256,address,address)","c7adef28":"getCitationRecord(bytes32,uint256)","c7ae3ad5":"fillBuyOrder(uint256,uint256,uint256)","c7ae7451":"addEvent(address)","c7ae9632":"xfer(address,address,uint256)","c7af18f1":"SedPoSToken()","c7af3dd1":"updateCost()","c7afe9f2":"setTokenAddress(address,address)","c7aff0d7":"manuallyProcessTransaction(address,uint256)","c7b0235b":"DPPCrowdsale()","c7b0f0ca":"lockTokensPercent()","c7b0fc5e":"usedItem(uint256)","c7b11fca":"mainMaxContribution()","c7b160db":"getTotalNumberOfAddressesReceivedAirDrop()","c7b1fd00":"usdPerEthLogSize()","c7b23ec6":"initalizeOrgan()","c7b27a25":"IOReceipts()","c7b31ed0":"store(address,address,uint256,uint8,uint8,bytes)","c7b3b0d4":"getCompanyInfo(bytes32)","c7b41aa9":"getSmartCoins()","c7b43f02":"expressBuyNums(uint256,uint256[])","c7b5716d":"createSellOrder(address,uint256,uint256,uint256,uint256)","c7b6084c":"backendOperator()","c7b6ccae":"opetToken()","c7b6fd6a":"subDays(uint256,uint256)","c7b799ae":"addressFunc(address,address)","c7b7d6ca":"sendResearchAndDevelopment()","c7b81f4f":"isEpochDataSet(uint256)","c7b850dd":"whitelistedContributors(address)","c7b87d74":"setOldTokenAddress(address)","c7b97288":"addTokenEmission(uint256,uint256,uint256)","c7b98dec":"right1(uint256)","c7b9bc9e":"Token(uint256,string,uint8,string,string)","c7b9c355":"setSecondBonusPercent(uint256)","c7ba24bc":"claimAndConvert(address[],uint256,uint256)","c7ba9264":"KAL4Token()","c7bb38e7":"setAmount(bytes32,uint256)","c7bb42f7":"TEAM0()","c7bc747d":"retrieveTokenByContract(address,uint256)","c7bce243":"Menu05()","c7bdbb95":"allowTransferOwnership(bool)","c7bdcde9":"IYAKIN()","c7be44fa":"banReferrer(address)","c7be7ae3":"frozenSupply()","c7bec318":"removeAccountAddress(address)","c7c049fc":"saleGoal()","c7c0c5bf":"modifyMarking(bytes32,uint256)","c7c16353":"weiToRaise()","c7c2aa25":"WarriorsBackToHome(address,address,uint256)","c7c2aee3":"personalCap()","c7c3268b":"setBaseUrl(string)","c7c36959":"GubbermentOverthrown(address,address)","c7c3b1c1":"canTerminate()","c7c3b2dd":"setMockedTotalCollected(uint256)","c7c40fbb":"addPassportLogic(string,address)","c7c4ff46":"depositor()","c7c54e4d":"theEBCC(uint256,string,uint8,string)","c7c5f59d":"forBounty()","c7c625ee":"rand(address)","c7c6939c":"LongPlace(address[2],uint256[8],uint8,bytes32[2],uint256)","c7c7322b":"testCantInitiateIncorrectSale()","c7c7e9ea":"getAllowed(address,address)","c7c806cb":"ambassadorAddress()","c7c80f02":"teamLockUp()","c7c83804":"setFinancingsAdd(address)","c7c8b07b":"KillSwitch()","c7c8c424":"ownersEth()","c7c8ff35":"getNeutralMutationCost(uint8)","c7ca07bb":"QuantityAvailable()","c7cb94e3":"GenPlayerRatio(address,uint256)","c7cbb9c8":"_createArea()","c7cc3743":"addContractAddr()","c7cc4ee9":"later()","c7cc63aa":"getBetTitle()","c7ccc559":"upgrade_cap()","c7cd31d5":"setLLV_edit_23(string)","c7ce060b":"publicDeductDeposit(address,uint256)","c7ceac99":"calculateBattleBoost(uint16,address,address)","c7cec7f8":"versions(bytes32)","c7cefbf1":"IDH()","c7cf28fe":"canClaimTimeout()","c7cf6a2a":"LJSToken()","c7cf8075":"getAvailableDevFund()","c7d044be":"AutoChainToken()","c7d128d1":"readTotalNumberOfUserPurchases(address)","c7d20f82":"addMeterpoint(address,int256)","c7d22929":"betOpen(uint256,string,string,string,string)","c7d26e90":"getAccessoryClaims(uint64)","c7d4f68e":"getRobotForUserByIndex(address,uint256)","c7d586c9":"provideProofOfWork(uint256)","c7d5b6f1":"cancelSellOffer()","c7d5c0af":"XVOTOKEN()","c7d5d171":"costRecharge(uint256)","c7d5dd36":"Factory(address,address)","c7d6e988":"fundOwnerWallet()","c7d6faf1":"easyPropose(address,uint256)","c7d77970":"registerNameXaddrFromDapp(address,bytes32,address)","c7d7b5a6":"fillOrder(address[5],uint256[6],uint8,bytes32,bytes32)","c7d96304":"canMateWithViaAuction(uint256,uint256)","c7d9f4d1":"transferableBalanceOf(address)","c7da93b7":"specialTransfer(address,uint256,uint256,uint256)","c7daae0a":"firstFreeAddressIndex()","c7dab436":"vestingTime()","c7daceb1":"acceptBuyNowOffer(uint256)","c7db04d7":"SelfDestructManager()","c7dbbc47":"nextTicket()","c7dbc2be":"minimumPodSize()","c7dd4b4f":"gameID()","c7dddf0f":"itemHistoryOf(uint256)","c7de2d13":"WithdrawToken(address,uint256,address)","c7dea777":"areOldMiningKeysVoted(uint256,address)","c7deda22":"Doug()","c7df0a90":"all_eth()","c7df9054":"getBuyUnitsInformations()","c7dfabcc":"Buy(uint8,string)","c7e04670":"publicSaleTokenPrice()","c7e0635d":"AGENT_STATUS(bytes32,address)","c7e09d9c":"getSides(uint256)","c7e12723":"Erc20Test(string,string,uint8)","c7e210c3":"optionPoolMembersLockTotalOf(address)","c7e22ac4":"setOracleGas(uint256)","c7e284b8":"getTimeLeft()","c7e293d9":"allocateFunds(address,address,uint256)","c7e35a5c":"LOCK_START()","c7e3b6e8":"airdropAndVault()","c7e3ff4b":"pregnantMonsters()","c7e40b3a":"StatXCoin()","c7e416c5":"LOG_SuccessfulSend(address,uint256)","c7e4f453":"TokenFactoryImpl(address)","c7e50dc9":"isLOC(address)","c7e52480":"convertYourTokens()","c7e56740":"_getIndex(address,address)","c7e58644":"getSharesCount()","c7e59334":"toggleAttachedEnforcement(bool)","c7e5fc3b":"GlobalTechToken()","c7e67360":"GAS_BUFFER()","c7e6926e":"_airdropTotal()","c7e6d04f":"ownerConfig(address,uint256,uint256)","c7e73adf":"getParticipantSource()","c7e83451":"matchMultipleOrders(uint64[],uint64[])","c7e92738":"MicroBTC()","c7e975b8":"partner2_voted_update_marriage_status()","c7e9aaaf":"_isSiringPermitted(uint256,uint256)","c7ea07bb":"SealTokenSale(address,address,address,uint256,uint256,uint256,uint256)","c7ea8a68":"EOSToken()","c7ebc8fe":"getWinnings(address,uint256,uint256)","c7ed1e86":"getNoOfMsgs(address)","c7ed4555":"DepositSlot(address)","c7ed4d8c":"distributeVM(address[],uint256,uint256)","c7edaf33":"TheGoDgital()","c7edf88c":"DOW_SAT()","c7ee005e":"prime()","c7ee1c4e":"getPreviousSeed()","c7ee98c2":"trustedBurnTokens(uint256)","c7ef47d7":"isKill()","c7efa689":"getSaleDay(uint256)","c7efb162":"setup(address,address,address,uint256,uint256)","c7efb8ab":"ledger(address,bytes32)","c7f04e65":"purchase(uint32)","c7f132d5":"QuarterCoin()","c7f18d5b":"updateData(uint256,uint256,uint256,uint256,uint256,bytes,bytes)","c7f24b11":"getCCH_edit_8()","c7f2c3d9":"EasyInvest10()","c7f2e6af":"Contribute(bytes20)","c7f300ed":"CrowdSale_ModifyEndDate(uint256)","c7f3166d":"getBetInfo(uint256,uint256)","c7f31f1c":"HandWins(address)","c7f36010":"setupClaim(uint256)","c7f423c7":"setLeaf(uint256,bytes32)","c7f42c64":"battleFee()","c7f43b57":"TIER2_CAP()","c7f46dea":"testRewardBS(bytes32)","c7f5f1e8":"DistributeNextNTokens(uint256)","c7f6f40c":"updateKYCStatus(uint256)","c7f6fa60":"EIDTokenERC20()","c7f71103":"futrMiner()","c7f7475c":"AdminGroup(string)","c7f758a8":"getProposal(uint256)","c7f7be5c":"setGxCoinContract(address)","c7f84605":"___upgradeTo(address)","c7f86c37":"withdrawFundsRP()","c7f8fe65":"getBalanceReleased()","c7fa1d47":"Hedge()","c7fa52de":"setRegistryAddr(address)","c7faa88d":"collectProfit()","c7fb9aab":"displaymultisig()","c7fbad27":"revealStart()","c7fc9ace":"WorldNode()","c7fccd3f":"isAuthorizedForToken(address,address,address)","c7fde81f":"changePOI(address)","c7fe11d4":"_createCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint256)","c7fee63e":"updateRate()","c7ff1584":"isHalted()","c7ff1b60":"maxCapReached()","c7ff2086":"getPropertyColorsOfRow(uint16,uint8)","c8004293":"lastKnownPropertyAddress()","c80094b3":"testEquals()","c8016c85":"MAIN_SALE_BONUS_PERCENTAGE_PHASE1()","c8027210":"Malaysia370()","c8028bee":"auditorRegistry()","c803486b":"getAvailableFunds(address)","c803ae2a":"kycComplete()","c803f981":"care(uint256)","c8045941":"changeDescription(string,string)","c8046827":"registerBurn(uint256)","c804a58e":"toggleRefunding()","c8051885":"isWithinContributionRange()","c805801c":"VoipTken()","c805914a":"setRespectRequiredToRecruit(uint256)","c805b6bc":"PRESALE_TOKEN_HARD_CAP()","c805f68b":"setRelay(address)","c806286d":"setFreeze(uint256,bool)","c80667e3":"appendUintToString(string,uint256)","c80675de":"sendDiamond(address,bytes32,string,bytes16,uint256)","c806a91d":"TOKEN_TOTAL_CAP()","c80743c5":"maximumTokenAmount()","c807be58":"endTimeSale2()","c807cb02":"Uninjected(address)","c807e645":"JECKAirdrop()","c8081bd2":"requestMutualJobCancellation(bytes16,address,address,uint256,uint256)","c8088830":"_canPayOraclize(uint256)","c808cf86":"exchangeHelenium(uint256,address)","c80944e5":"buildRight(address,uint256)","c80a589b":"withdrawTokenBalance(uint256,address)","c80bbb17":"ReserveFund()","c80becb6":"enablePreSale()","c80c14a5":"getBankBalanceWEIInfo()","c80c28a2":"getNumberOfParticipants()","c80d3694":"saleWeiCap()","c80db88c":"getSchellingExpansion(uint256)","c80e0ddd":"saveCode(uint256,string)","c80e3e1e":"SingularityTest23()","c80ec522":"withdrawn()","c80f9a4f":"transferPokemon(address,address,uint256)","c81050e6":"checkBranchInEpisode(uint256,uint256)","c8117b5b":"extractBalanceOfLength()","c81196da":"numberOfMilestones()","c8135ba1":"bids_decrypted_count()","c813c30e":"testThrowSomething()","c813e02e":"_isLeapYear(uint16)","c814324c":"timeBought(address)","c81450a0":"RaffleResult(uint256,uint256,address,uint256,uint256,bytes32)","c814864c":"CreateChips(uint256,uint256,uint256,uint256,bool)","c8149cbc":"setMigrationLock(bool)","c8159d70":"Seriality()","c815c9ef":"TerraEcoToken()","c8162068":"setTeamAddr(address)","c8162497":"BETX()","c8166a8a":"Question()","c817d75d":"Transfer(address,address,uint256,uint256,uint256)","c817e84d":"addWhitelisted(address,bool)","c8187cf1":"determineReward(uint256)","c818acf7":"createCloneToken(address,uint256,string,uint8,string,bool,address)","c818faec":"updatedAt(uint256)","c8193841":"addSoftwareVersionRecord(bytes32,bytes32,uint256)","c8199231":"createContractTot(string,uint256)","c8199826":"buyTickets()","c819f6e9":"levToken()","c81a5455":"Milestone_CloseTheIco(string)","c81a7d10":"CurryCoin()","c81bd106":"approveNewOwner()","c81c590d":"getEtherAmount(uint256)","c81caae7":"acceptMember(address,string,string)","c81cbc5c":"MIST()","c81cf764":"getAmountFromBuyer(address,address)","c81d1d5b":"getPunk(uint256)","c81e05ad":"KODO()","c81ede67":"pollBurnQty()","c81f49cb":"getTotalPaid(address,uint256)","c8216f33":"getLineUpEnable_default()","c8226e61":"withdrawEgereg(uint256)","c822bd3d":"transferCost(bytes16,uint256)","c822d7f0":"isRegistered(string)","c8234ac8":"createTokenUri(uint256)","c82467c9":"ComputeTokenPrice()","c8248f8d":"PreICO(address,address,address,address,address)","c824a222":"auctionsOf(address)","c82531a3":"createAuction(uint256,address,uint256,uint256,uint256,address)","c825a939":"fundingRatePredictionBonusPoolInIBC()","c827a7bb":"testExternal(uint256[20])","c82829e0":"setSoftHardCaps(uint256,uint256)","c828371e":"getStartTime()","c828e6ee":"getCurrentlyClaimableAmount(address)","c8290efd":"zen()","c8291dbd":"increment(address,address)","c829958c":"isImported(address,address)","c8299b10":"gotransfer()","c8299ed8":"afterClaim(uint256,uint256,uint256,uint256,uint256)","c829b0e3":"MAX_LAYERS()","c82aac47":"searchByTag(bytes32)","c82b8ec5":"EtherDaruma(address,address,address,uint256,uint256,uint256)","c82bb37b":"PotSplit(uint256,address,bool)","c82bd265":"ContributionAccepted(address,uint256,uint256)","c82c73c1":"isAddressSet(address)","c82cd8e6":"ControllerRetired(address)","c82d81dd":"GICAToken()","c82db402":"ownerSetOraclizeGas(uint256,uint256)","c82f2418":"decodeTokenOrderTokenAndIsBuy(uint256)","c82f8d9e":"distributeToken(address,address,uint256)","c83068eb":"setPre(uint256,uint256,uint256,uint256,uint256)","c8306c89":"set_arbits(address,address,uint256)","c830b89d":"ReleaseDateChanged(address,uint256)","c830c656":"increasePermillage()","c83126ed":"generateVoteForDelegationSchemaHash(uint16,address,bytes32,address)","c831306e":"icoTimeBonusPhase2End()","c831391d":"getPoolOverlapSize()","c83261bd":"claimTokenFor(address)","c83281e9":"UserAccount(bytes32,bytes32,bytes32,bytes32,bytes32)","c832b00d":"limitDateCrowdWeek3()","c8335143":"AlekseiZaitcevPrivateSale(uint256,uint256,uint256,address)","c8335ba0":"setInitSize(uint256)","c833d7b1":"BigbomContributorWhiteList()","c834d03d":"verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[3])","c83507a8":"removeAdv(address)","c836292b":"teamMembers(address)","c836efcb":"_permitted()","c83780a2":"crowdsaleCounter()","c838ccb6":"getDelegates()","c839008e":"setPixelPropertyContract(address)","c8391142":"j1Timeout()","c83923c5":"getMetadataChannel(string)","c83927a0":"pdo()","c8393ba9":"initiateWithdrawal(address,uint256)","c8398947":"currentStateActive()","c839c0de":"CreateVersion(bytes,string)","c83a7e94":"AEToken()","c83a9472":"deathData_a11()","c83a981c":"openPool(uint8)","c83abb40":"registerNotary(address,string,string,string)","c83ac557":"ChangeCommunityHolder(address,address)","c83be888":"single_move(uint256,uint8,uint8)","c83cb16c":"_not(bool)","c83ea900":"soldDET(address,uint256,bytes32)","c8401567":"betbucketTwo()","c840b187":"goodsNotReceived(uint256)","c841df4f":"getMonsterStats(uint256)","c8420d2f":"CollectibleIndex5()","c8422c2d":"boostrapParty(address,address)","c8435ba2":"levelOneTokenNum()","c843c0c8":"getMyAlien()","c8443fad":"revokeExchanger(address)","c8449b65":"Gold()","c84640f5":"addtotalCardValue(uint256,uint256)","c846690b":"initialiseToken()","c847259c":"changeClub(address)","c84748f9":"returnFrozenFreeFunds()","c848a0bc":"notifySellToken(uint256,address)","c848fab7":"SeeleToken(address,address,uint256)","c84920cb":"Ubisoft()","c84a6140":"BackdoorBurner(uint256,string,uint8,string)","c84a8766":"setRegionImageDataCloud(uint256,uint256,uint256,string)","c84aba9b":"demurrageBalance(address,address)","c84b0555":"token(address,string,string)","c84b1ce7":"PUBLIC_RESOLVER_LABEL()","c84b470f":"SALE_PERCENTAGE()","c84ba84a":"finishedPurchase()","c84c009b":"Operated(address)","c84c5963":"setPauseCutoffTime(uint256)","c84c692a":"isTradableFciInSession()","c84c9ef5":"LastName()","c84ca867":"getCurrentPriceAttoTokensPerWei()","c84cda0f":"setRate(string,uint256)","c84d56e0":"setRealmSale(uint256,uint256)","c84eb9e5":"invest(address,bytes)","c84f5d6f":"RowanCoin()","c850029e":"returnTokenOwnership()","c85147c5":"mediumCount()","c8517b48":"CNDTTokenDeposit()","c851b643":"legendsToken()","c851ed7c":"startNewVote(uint256,string)","c8520131":"Withdrawable()","c85234c7":"startPreICOStage3()","c853c03d":"newDraw(uint256,uint8[3],uint256,uint256,uint256,uint256)","c8544e81":"addGenesisPairs()","c854db91":"vault_refund(address)","c85501bb":"minThreshold()","c855d689":"returnLongAddress(bytes32,uint8,bytes32[2])","c855e7bb":"tokenForTeamGranted()","c8578967":"setNewChecker(address,address)","c857a88c":"createDataRequest(address,address,uint256,uint256)","c8582572":"affiliateCommission(address)","c8583ad6":"UnregisteredPrefix(string,address)","c8583e69":"getEthUsdRate()","c858c017":"testMsgSenderInVoters()","c859c482":"holdBalanceOf(address)","c85aff48":"tokenNAVMicroUSD()","c85b7941":"totalEthBankrollReceived()","c85bb02a":"isParticipating(uint256,address)","c85bb1f7":"_doMapAuto(address,string)","c85bc22d":"getDefrostFactor()","c85c11eb":"TOKEN_SECOND_PRICE_RATE()","c85c75b2":"completeCodeUpdate()","c85dba67":"getPrefix(uint32,int256)","c85e07b9":"stamp()","c85e0be2":"setHost(address)","c85e1f73":"totalRecalled()","c85ee477":"FileCoinCash()","c85f6a80":"emission(address)","c85fd4f8":"deployToken(string,string,uint8,string,address,bool,address)","c86039da":"redeemedSupply()","c8612b2f":"TOKENS_FOR_SALE()","c861f243":"_getBonus(uint256)","c861f3a0":"houseStake()","c86283c8":"withdrawTo(uint256,address)","c862a134":"feePercent_()","c8643bc2":"MintOperationEvent(address,uint256,uint256,uint256)","c864e760":"recordCommissionEarned(uint256)","c865164b":"StakingPriceFeed(address,address,address)","c865c29b":"HopiumCoin()","c865cadb":"setActiveValueBonus(bool)","c86662a3":"addOwner_(address)","c86779a4":"lastBlock_v14()","c867cccb":"Contribution(address,address,address,address)","c867ea63":"GoldConnect()","c867fa29":"BookERC20EthV1p1Factory()","c86813a8":"PassContractorCreator()","c8685f21":"validUsername(string)","c868a569":"canBreed(uint40,uint256,uint40,uint256)","c8690233":"pubkey(bytes32)","c8691b2a":"getHistory(uint256)","c8695e59":"RPS(bytes32,address)","c86a90fe":"sendCoin(uint256,address)","c86a9dea":"isKickoffEnabled(uint256)","c86b7001":"randomOrgAPIKey()","c86c50f7":"changeAllowInvestment(bool)","c86d0251":"_getTeamSupportAmount(uint256,uint256)","c86dca5a":"isExploring(uint256)","c86e25d7":"tokenCreateContract()","c87022d3":"startMonarchyGame(uint256)","c8705544":"payAmount()","c870ef78":"MINING_POOL_HOLDER()","c8713608":"HELIX()","c87158fa":"_addBlockProducer(uint256,address)","c87235fd":"burnRemaining(address)","c872da3c":"KIND()","c8738351":"uintFloor(uint256,uint256)","c8744434":"lastTransferQueueIndex()","c8750d8a":"testHitSoftCapPresale()","c8756f12":"getTotalSponsorship()","c875b1fb":"distributeBonuses()","c875d16f":"ArthurStandardToken(uint256,string,uint8,string)","c8765ff2":"rateICO()","c87744d9":"_approvedForTransfer(address,address,uint256)","c8781368":"freezedMoment()","c8788134":"discountedPrice()","c878851d":"setCreate(bool)","c878dad9":"multiFreeze(address[],bool[])","c8796572":"collectFees()","c87a31cd":"fillOrder(bytes32,address[5],uint256[6],uint8,bytes32,bytes32)","c87b36ed":"disableBetting()","c87b56dd":"tokenURI(uint256)","c87be1af":"recoverHashSigner(bytes32,bytes)","c87c07de":"deprecateMeleeSubtype(uint8)","c87cfe63":"setData(uint256[])","c87e5613":"setMaxTokenBuyin(uint256)","c87e8bd0":"icoRound6()","c87f9386":"setAllItemActive(address,address,bool)","c8804b7b":"DSC()","c88098f2":"setParticipationFee(uint256)","c880fab1":"dragonTreasureToken()","c8813ffd":"addToVIPList(address[])","c881b3c0":"AllowedGasPriceUpdated(uint256)","c88215e7":"calculateExcessBalance()","c882acc8":"deleteMemberOfGroup(address,uint256)","c882ee8c":"testUint(int256,uint256)","c882ef92":"GameOpened(uint256)","c8830ddf":"ECryptoToken()","c883346e":"_getProviderIsForRent(uint256)","c8833f56":"setTiersInfo(uint8,uint256[],uint256[],uint256[],uint256[],uint8[2])","c883d3fa":"addMappingForPlayerIDs(uint256,uint256,uint256)","c88449a1":"_getTransferFeeAmount(address,uint256)","c8852b5b":"getBirthCut(uint256)","c8857dcd":"setOperateMode()","c885bc58":"withdrawReward()","c885e92d":"contlength()","c8860f41":"getWinningChoice(uint256,uint256)","c886594d":"getNodeEnabledStatus(address)","c8865c0e":"allocated24Months()","c886ec0d":"getTreasureProbabilityType(bytes32)","c888fafd":"bankerDepositPer()","c888fcc3":"getPollResult(uint256)","c8894a0c":"WMToken(address,uint256)","c88961da":"createKingdom(string,address,address,address)","c88996d6":"MessageCallTransaction(bytes,uint256,uint256,address,uint256,uint8,uint256,uint256)","c889e0de":"finishAirdropBy0Eth()","c88b675b":"setMaxAvailableSpot(uint256)","c88b77e0":"grantTeamAdvisorToken(address)","c88b7c8e":"setConversionFee(uint256)","c88bf75a":"applyRaises(uint256[])","c88c5101":"investor_bonus()","c88cc6ac":"getCertification(address)","c88e662e":"externalSales(address,uint256)","c88fd3ec":"changeIcoRate(uint256)","c88fe1fa":"maxCapMintTransfer()","c890635a":"ownerSale(address,uint256)","c890f27e":"GenChipByWeight(uint256,uint8,uint256[])","c891a29d":"setEpochData(uint256,uint256,uint256,uint256[],uint256,uint256)","c8922057":"MAXUM_SUPPLY()","c89231b3":"mintForInvestor(address,uint256,uint256)","c892693b":"setMotAddress(address)","c892cfdf":"amountRised()","c8931355":"setONTExchangeRate(uint256)","c893ae0b":"ptToPtwo()","c894e1e5":"setTransferFeeRate(uint256)","c895304b":"newDaoRulesProposal(uint256,uint256,uint256,uint256,uint256,bool,address,uint256,uint256)","c89547f9":"adminSetTxFeeInviteGame(uint256)","c89550a8":"BMICoin(address,address)","c89605a2":"DEALERWIN()","c8961644":"unBan(address)","c89924da":"totalTokensForSaleDuringICO2()","c8997121":"forwardFunds(uint256)","c899fa77":"hodlerTotalValue3M()","c89a32ab":"releaseTargetToken(uint256)","c89acc86":"send(address,bytes)","c89b50c7":"credit(address[],uint256[])","c89b7d8c":"buyCommonTTWByETH(uint256,address)","c89b989e":"lckTokenAddress()","c89baff5":"GoldenGate()","c89cea99":"getMyAnts()","c89d6063":"claim(bytes32,uint256,address,uint8,bytes32,bytes32,bytes32[])","c89dcfce":"mint(address,bytes32,uint256)","c89e4361":"delegate()","c89e528e":"receiveCreateAuctionFromArray(address,address,uint256[],uint256,uint256)","c89ec68a":"startRecovery(address,address)","c89f2ce4":"funds()","c89f51ef":"createPromoRabbit(uint256,address)","c89f8f08":"testGetController()","c89faa72":"confirmTransferItem(address,address,string)","c89fb5f0":"ethunpause()","c89fcf58":"setNoviceDungeonId(uint256)","c8a1becb":"_monthToNumber(string)","c8a1e1c7":"sendInternally(address,uint256)","c8a2c880":"setCallStack(uint256,uint256)","c8a2cc03":"strikersMetadata()","c8a2e0bc":"addCustomerReqACC(address,address,address,address)","c8a45c44":"tokenMaturityPeriod()","c8a48d71":"removeStep(bytes16)","c8a4ac9c":"mul(uint256,uint256)","c8a4c767":"kickCommitteeVote(address)","c8a4ddc3":"resetBatches(address,address)","c8a4e001":"EarlyPurchaseAmended(uint256)","c8a5e6d7":"transferFundAndEndGame()","c8a635b7":"setWeiRate(uint256)","c8a6dab7":"test_tokenFreeze()","c8a71e14":"bonusCalculationFactor()","c8a73eca":"transferOpen()","c8a7432f":"getPreIcoPurchase(address)","c8a76494":"Bet()","c8a808d6":"avatar(address,address,uint256,uint256,bytes)","c8a814b8":"firstSend(bytes32)","c8a830ba":"max(uint256)","c8a83384":"allowBurns()","c8a90f76":"handlePresaleToken(address,uint256)","c8a9e841":"addCustomerFromKYC(address)","c8aafbc3":"NodeHash()","c8ac7014":"updateMerchantByAdmin(address,string,string)","c8ad27e6":"finishPre()","c8ad9645":"InactivityHolderResetBalance(address)","c8aded5d":"setDiscounts(uint256[],uint256[])","c8ae8774":"_startMegabox(uint256)","c8aef513":"preSendTTC()","c8aeff39":"isMarket()","c8af1538":"fallbackPayout()","c8af46b4":"canAnyoneBurn()","c8b08125":"tokensRemaining()","c8b0e68d":"getCEO()","c8b18b5b":"oneMonth()","c8b19fa8":"ioxToken()","c8b1a635":"pricePerCoin()","c8b21f18":"distributionuserFinished()","c8b26773":"startEnrollment()","c8b2ccba":"addStrand(uint256,address,bytes32,string)","c8b32089":"TokenLiquidityMarket(address,uint256,uint256,uint256)","c8b342ab":"getBid(address)","c8b35c7a":"BANANA()","c8b39eb5":"setEdCoreContract(address)","c8b413ad":"initialize(address[5],address,uint256[12],uint256,bytes)","c8b43c10":"isPausedCrowdsale()","c8b4c5b8":"MarketToken(uint256,uint256)","c8b4eb6e":"withdrawPresale(address)","c8b52bfb":"ChangeCost(uint256,uint256)","c8b56bda":"unregister_contract(bytes32)","c8b5da66":"pressButton()","c8b6a463":"ASUT()","c8b70559":"_endContestIfNeeded()","c8b7c3ee":"MITCoin()","c8b7e8c3":"testMakeBet()","c8b82220":"registerNameIP(string,string)","c8b91531":"MINOR_VERSION()","c8bb73ef":"testGetBitsFailIndexOOB()","c8bb7d51":"unitRareGrowth()","c8bc2452":"LuJiaZuiToken()","c8bc429a":"removeDividendPathway(address,uint256)","c8bc6fa0":"maxCapEth()","c8bd14ef":"totalInvSupply()","c8bd1d13":"VERIME(address)","c8bd3782":"OsherCurrentICOPrice()","c8bdbfb6":"withdrawUnsoldTokens()","c8bdc0c7":"RevokeDOT(bytes32,bytes)","c8bf3388":"totalIRCAllocated()","c8bffa93":"tier1End()","c8c01a55":"request(address,uint256)","c8c08a89":"_isOfficialApps(address)","c8c0b288":"bountyFundManager()","c8c0cbbb":"setLockedAccountThresholdUsd(uint256)","c8c1a400":"infoAboveSpot()","c8c21594":"releaseByStage(address)","c8c2ed54":"tokenAssignmentControl()","c8c2fe6c":"acceptManagement()","c8c365fc":"nowday()","c8c388eb":"RegBase(address,bytes32,address)","c8c3b926":"changeDragoDao(address)","c8c5139d":"setUserDisplay(address,string)","c8c67ca1":"transferValuebyAddr(address)","c8c719d2":"MangachainToken(address,address,address,address,address)","c8c72bb4":"TEAM_RESERVE_FTX()","c8c749ec":"preTgeManager()","c8c75647":"setVerified(address)","c8c79643":"addBurningMan(address,uint256)","c8c89fa5":"secretBids(address)","c8c9b1f8":"shouldVerifySegment(uint256,uint256[2],uint256,bytes32,uint64)","c8c9d745":"userLookup(uint256)","c8ca645f":"getName(string,string,address)","c8cada78":"oraclize_query(uint256,string,bytes[2])","c8cb60bb":"cancelBid(bytes32,uint8,int32,bool)","c8cb7d04":"Kristina()","c8cb8677":"WithdrawMyTokens()","c8cb8a75":"setCreator(address,uint256)","c8cb985a":"callDividend()","c8cc5cd8":"distributeYield(uint256)","c8cc9cc2":"getElement(address)","c8ccaebc":"extendedTimeLock()","c8cd09ae":"TransferredPreBuyersReward(address,uint256)","c8cd65e5":"processDeposit(address,uint256)","c8cddd61":"test_validShouldBe3_increaseTimeBy30000()","c8ce122b":"checkJackpot(address)","c8ce2fec":"lifetimeDeposits()","c8ce30b0":"blocksForWei(uint256)","c8ceaa95":"mint(bytes32,int256,address,uint256)","c8ceae12":"tavernContract()","c8cf4722":"getRequestsLength()","c8cf67a1":"buySmartSpeed()","c8cfb032":"getPlayerByAddr(address)","c8cfd490":"UNLOCK_TEAM()","c8d0ec0a":"reduceAllowance(address,address,uint256)","c8d172d6":"getTokenInfoNonce()","c8d1c017":"addUIntValue(bytes32,uint256)","c8d1cf4a":"tokenPriceForMainICO()","c8d3db82":"getPresaleMaxValue()","c8d47f16":"replaceLogic(address)","c8d4b389":"approveAndCallPreSigned(bytes,address,uint256,bytes,uint256,uint256)","c8d508fa":"test_insert_findNoHintUpdateTail(int256)","c8d50d7c":"nextBackWindowAdjustmentRatio()","c8d52ee3":"refundTransfer(address,uint256)","c8d61985":"setCryptoAgent(address)","c8d689b1":"addAllowedLock(uint256)","c8d840fa":"EventEmergencyContinue()","c8d86e35":"bullToken()","c8d88829":"oslikiFoundation()","c8d8cf88":"appIndex()","c8d942b5":"Travelerscoin()","c8d9c042":"AuctionCreated(uint256,uint256,uint256,uint256,bool)","c8d9ebc4":"getTomato(uint8)","c8db6a42":"functionCalling(address)","c8db6af9":"getCompte_14()","c8dc60ca":"vehiclesByCity(bytes32)","c8dc7e19":"setReconciliationDate(uint256)","c8dd64ea":"daVinciAddress()","c8dd6ce7":"getPlayerDetails(address)","c8dda301":"VOTING_START_BLOCKNR()","c8dda71c":"HistoryUpdated(string,uint256[])","c8ddf66f":"MMChainToken()","c8df5da0":"BOSHICoin()","c8e0f101":"userPlay()","c8e11521":"TripBitToken()","c8e13bb4":"fit()","c8e1fe3f":"getCountriesOfCampaign(bytes32)","c8e2190d":"_cancelOperation(bytes32,address)","c8e2fca0":"use(address,address,uint256,uint256,uint256,uint256,uint256,string)","c8e32074":"returnFrom(address,uint256)","c8e49707":"activateExportFee(address)","c8e4acef":"playerByAddress(address)","c8e55708":"oraclize_query(string,string[1])","c8e566c6":"betInputToBytes(uint40,uint40,uint40,uint40,uint40)","c8e569a8":"stopICO()","c8e56acb":"FAPFundDeposit1()","c8e5f54f":"ArcanaToken()","c8e626f8":"checkDivsBalance()","c8e6b2a8":"logTimestampSet(uint256)","c8e6ba4d":"verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])","c8e6c7d9":"imin(int256,int256)","c8e706e2":"contractWallet()","c8e71424":"MotherDNAShare()","c8e788c1":"RELEASE_EPOCH()","c8e7ca2e":"getMsgData()","c8e7e5ef":"TOTAL_NUM_TOKENS()","c8e8ce63":"outsourceConfirmNode(uint256)","c8e8d6d6":"TheTokenE()","c8e8f487":"missedVerificationSlash(uint256,uint256,uint256)","c8e9fc8b":"testgas()","c8ea0cfa":"CoinmakeToken()","c8ea1f7f":"updateEntity(uint256,bytes32,uint256,bytes32,uint256)","c8ea429e":"closeCdp(uint256,uint256,uint256)","c8eab537":"randomJackpot(uint32,bytes32,uint32)","c8eb747a":"B42Token()","c8ec2eb8":"MUBEX()","c8ec57ed":"revokeConfirm(bytes32)","c8ed6253":"ManagedToken()","c8ede712":"makersAverageRating(address)","c8edf65e":"GetAndReduceFeesByFraction(uint256)","c8ee0c6b":"withdrawBySubscription(address,uint256,bytes32,string)","c8ee2da8":"setReputationIRNNodeShare(uint256)","c8ef8b00":"window2TotalSupply()","c8efd7af":"getResolverFee()","c8f07770":"funcThatReverts()","c8f09634":"visaOfferingsLength(uint256)","c8f099cb":"upgradeEvilMorty(address,address)","c8f0d741":"AlienFarmer()","c8f21d22":"TagadaTsoinTsoinCoin()","c8f2835f":"transferBack(address,uint256)","c8f288ad":"getPoo(uint256)","c8f3a9e1":"getLastRollOutput(address)","c8f3e5f0":"getParameterByTitle(bytes32)","c8f41706":"pausePhase()","c8f478e1":"SetChangePlatformFlag(bool)","c8f490c8":"numOfBalloonsTypes()","c8f5c3f9":"LNCHSale(uint256,uint128,uint256,uint256,uint128,string,uint128,string,uint128,string,uint128,string,uint128,string)","c8f5d8b0":"total_coins()","c8f803f8":"setUnitJadeStealingMultiplier(address,address,uint256,uint256,bool)","c8f87d36":"_register(uint256,address)","c8f88076":"emissionMasOneType(address[],uint256[],bytes32[],uint256)","c8f8d75d":"Config(uint8,address)","c8f98db8":"getWinningFaction()","c8fbbdda":"getGPSStartTime()","c8fca35e":"getBidHash(uint256,uint256,address,address,uint256,uint256)","c8fd39f7":"GetEthShop()","c8fd6ed0":"unstake(uint256,bytes)","c8fdc891":"numberOfMonarchs()","c8fddb80":"updateLemonCoinsRemainingToDrop()","c8fdf67d":"holdTransaction(uint256,uint256,uint256)","c8fe2065":"getSingleBetItemCount(uint256)","c8fea2fb":"collect(address,address,uint256)","c8fed3f6":"withdrawCashReserveFund()","c8ff80a1":"setMonsterClass(uint32,uint256,uint256,bool)","c9000726":"nextStep()","c90109fa":"removeSomeCWCsFrom(address,uint256)","c90189e4":"fechAllVoteResultPreStageByBlock(uint256)","c902c3ae":"bets(bytes32)","c902d1b6":"_checkClientSign(address,bytes32,bytes)","c902ee36":"tokensAvailable(address)","c9030ea0":"addMember(address,bool)","c904a2ee":"minAllowedReservingPercentage()","c906a5aa":"testDeleteVoter()","c906baa3":"GACFund()","c906c873":"limitCrowdsale()","c906cd68":"ForceCoinTransfer(address,address,uint256)","c90755e2":"secretaryGeneral()","c90763f0":"subAllocation(address)","c9079673":"last_payment_timestamp()","c90797ea":"suicideContract(address)","c907d53b":"getTakeOwnershipFee(uint256)","c9085820":"set_owner(bytes12,address)","c908f302":"searchPursesByAddress(address)","c9090c7f":"levelFourTokenNum()","c9099385":"addApplication(string,string,string,string)","c909b929":"closingTimePeriodTwo()","c90a6a8e":"MAIN_SALE_BONUS_PERCENTAGE_PHASE4()","c90c205b":"CLAIM_AMOUNT_ETH()","c90c589a":"OAR()","c90c949b":"checkForBonuses(uint256,uint256)","c90cfb0b":"newFact(string,string)","c90d080a":"registerEvent(bytes)","c90d1431":"MYLASTTOKEN()","c90d2cd9":"createBallot(uint256,address,string,string)","c90de215":"ClockAuction(address,address,uint256,uint256)","c90f34f0":"Bitstarti(uint256,string,string)","c90f793e":"currentAgreement()","c90fc8ee":"allTotalSupply()","c90fda80":"countRC(address)","c9100bcb":"getClaim(bytes32)","c9101f6c":"increaseApproval(uint256,address,uint256)","c9102029":"_getTokens()","c9116b69":"myBalance()","c9116e4a":"yearThreeClaimed()","c911b56e":"isController(address,address)","c913b552":"getVersions(bytes)","c913f364":"addMoonPrizePool(uint256,uint256)","c914ef54":"SetAllow(address)","c91540f6":"getCurrentCompetitionValues(string)","c915fc93":"proposeUpgrade(address)","c91610cd":"transferDelegator(address)","c91752b2":"girlIdToAuction(uint256)","c91813ca":"testToBool(bytes)","c919992d":"changeBrokerImp(address)","c91b0149":"setWhitelister(address,bool)","c91b46c6":"claimHero()","c91bc856":"withdrawCAT()","c91c6fa5":"completeSupply()","c91ca6c7":"calculatePeerTokens()","c91cd9d0":"minimumNumber()","c91d7e9c":"getFee(bytes32[])","c91d956c":"setMinBalance(uint256)","c91e4cc8":"getItemsByTypeAndOwner(string,address)","c91fc619":"getTotalOut(address)","c92015f6":"getAccountUnlockTime(address)","c9206ddf":"setSalvageable(address,bool)","c9219a7a":"verifyProof(uint256[2],uint256[2][2],uint256[2],uint256[8])","c921f647":"GiftSend(uint256,address,address,bytes32,string,bytes16,uint8,bytes24,uint16,uint16,uint256)","c92261b5":"set(bytes32,int256)","c922f446":"emergencyWd()","c9230c5d":"assetName()","c9247058":"MasternodeRewardAddedToRewardPool(uint256)","c924c524":"secondSend(bytes32)","c924d441":"EnableTokenWithdrawals()","c92501b7":"setStopTime(uint256)","c926435c":"bonusInfo()","c926aae6":"kscSell(address,address,uint256,string)","c9270652":"returnLoanLength(uint256)","c92728a1":"_ballotIdToNamespace(uint256)","c9295bc6":"getOrgInfo(address)","c9296d14":"scheduleTransaction(address,uint256,uint256,uint256,bytes)","c929bdac":"notaioAccounts(address)","c929ccf3":"setTokenId(uint256)","c929d55e":"overrideTokenHolders(address[],uint256[])","c92a1ad8":"bonusPriceDeltaPerHour()","c92a1e26":"setting(bytes)","c92aecc4":"chi()","c92ba8b2":"add(address,uint32,uint128,uint128)","c92babd1":"SITMock(address)","c92cd4d3":"getNewTokenBalanceOf(address)","c92d2385":"transferPreSignedHashingWithPrefix(address,address,uint256,uint256,uint256,uint256)","c92d3ea9":"Amazon()","c92db04d":"VanMinhCoin(uint256,string,uint8,string)","c92e365f":"placeBid(address,uint256,uint256,uint256,bytes,int256)","c92f3a0c":"GameICO()","c92f8954":"withdraw(address,uint256[3])","c932c71e":"USDsToken()","c932ca62":"setBuildersAddress(address)","c9330bfb":"ethToTokenConversion()","c9334051":"decodeAssets(bytes32[])","c9335f58":"worldwidegiftcode()","c9351571":"WorldCupToken()","c93685b8":"getQuorumPercent()","c937b0a9":"platinum()","c937da12":"addToPublicWhitelist(address)","c937e091":"SearchUserID(string)","c9380d3e":"DeciserToken()","c938acc8":"checkExistsOwnedPet(uint64)","c9393c62":"NewState(uint8)","c939625b":"LuckCashCrowdsale(uint256,uint256,uint256,address,address)","c939fd50":"remainingIssuableNomins(address)","c93a6c84":"setDefaultFee(uint256)","c93aac88":"setReleasingSchedule(address)","c93ab4c3":"checkTreesWatered(uint256[])","c93b9755":"mintAgents(int256,address)","c93c266e":"updateWalletAddress(address)","c93ce90f":"chefOwnerWithdrawal()","c93ceec8":"collectDividends(address)","c93cff84":"test_validContractBalance()","c93dd31a":"Blammascoin()","c93e253d":"balanceOfBasic(address)","c93e718b":"removeAddressesFromOperators(address[])","c93e8862":"_checkCap(address)","c93e8b15":"getActiveBuyOrders(uint256)","c9406e86":"crowdsaleEnds()","c940c1b7":"addCustomerHash(bytes32,bytes32)","c9410b76":"ClockAuction(address,uint256)","c942940c":"Sukaya()","c944a38e":"CharlyLifeLog(string,int256)","c9456530":"isRespectTimeFrame()","c945b53f":"lottoIdentifier()","c946f3af":"Standard_3()","c94727f0":"getWinChoice(uint256,uint256)","c947db81":"earlyWithdrawalFeePct()","c9498266":"hash_passcode(bytes32)","c949ba9b":"TokenBase()","c949c0c9":"_houseOf(address)","c94a18ba":"kpyGoalReached()","c94a5841":"BITVesting()","c94b0ac1":"CryptoTwitch()","c94b56e3":"isMinCapReached()","c94b5c3d":"cabbageToken()","c94bfdb1":"setTokenDescription(address,uint256,string)","c94c6787":"specialSend(uint256,address)","c94c79dd":"EtherTots()","c94d0eee":"oddEven(uint256,address)","c94dc71e":"Satochi()","c94e643c":"grantTokens(address,uint256)","c94e6567":"fetchBlocks(address)","c94e7b5c":"icoTokenSupply()","c94f2d69":"ILOTContract()","c94f7983":"StillToGo(uint256)","c94fbd4b":"Reek()","c9511b59":"setAddressToken(address,address)","c95292c4":"EthlanceDB()","c95320db":"migrationPhase()","c9537838":"getExpectedBalance(address)","c9553010":"testDistributing()","c955457e":"getRandomArbiter()","c955b514":"addCancelled(bytes32,uint256)","c9567bf9":"openTrading()","c956d497":"helpWithdrawal(address)","c956db57":"WOLF3()","c957012e":"caps(bytes32)","c9580804":"setAccessManager(address)","c9584008":"registerTicker(address,string,string,bytes32)","c959467b":"setInterestDB(address,uint256)","c959ec57":"GetRocketStock(uint16)","c95acadd":"ethAuction()","c95ae083":"isMethodAllowed(bytes4)","c95bd3aa":"closePreSignedHashing(address,bytes32)","c95c0efd":"setBonusUnlockAt(uint256)","c95c0f7b":"getTransactionIds(uint256)","c95c16af":"imported(address)","c95c67dc":"ADVISORS_SUPPLY_LIMIT()","c95c9a83":"ThinkCoin(uint256)","c95d8e40":"clientSign()","c95e0909":"resetPlayer(address)","c95e81cb":"MyBet(uint8,address)","c95f79ba":"closeLeaderboard(uint16)","c95f8b91":"TransferFunds(address,uint256)","c95f95bb":"ComputedGainsRate(address,uint256)","c96027b3":"ethpaused()","c9613733":"startNextEra(bytes32,uint256,int256,uint256,int256,uint256,int256)","c961df66":"contract_period()","c9620770":"doVote(address,uint256,uint256)","c96266e8":"getDragonFight(uint256)","c96304e8":"balancesAddressDescriptionUpdate(string)","c9634f32":"randomContestant(uint256,uint256)","c9644b77":"retireAxie(uint256,bool)","c96492c4":"SspManagerContract(address,address)","c964e493":"getSpaceship(uint256)","c9651729":"firstLineWrong()","c9653bea":"MainExchange()","c96593a0":"The10ETHPyramid()","c965e1d3":"constructAPIParam()","c965ed7b":"OwnerReward()","c9660d07":"ownerSetEdgeRangeAndPayout(uint256,uint256,uint256)","c966865e":"notRandom(uint256)","c9679537":"HafizToken()","c968907f":"grantVestedTokens(address,uint256,uint256,uint256,uint256,uint256,bool)","c968aab3":"makeUntradable(uint8)","c968ac68":"getWin(uint64)","c9693411":"deliverPresaleFuelBalances(address[],uint256[])","c96adb01":"getUserBet(address)","c96c54a7":"airdrop(address[],uint256,uint8)","c96c8a1d":"ownerListMap(uint256)","c96cd46f":"suicide()","c96cea70":"updateUsername(string)","c96d2dfa":"getStateAndProof(bytes,uint256)","c96e5627":"numRegistered()","c96e785f":"setWhitelisted(address,address)","c96e83db":"firstContributorId()","c96e8fee":"Bury(address,uint256)","c96f3238":"getWithdrawAmount(uint256,uint256)","c96f5041":"addHash(string,uint256)","c971442c":"getDBs()","c971aade":"FINALSTSTEST()","c971b12b":"_onRandom(uint256,bytes32)","c9734ebd":"WatchLastPayout()","c97358df":"GGPCToken()","c973851d":"kMaxStake()","c97399d0":"_isOwner(address,uint256)","c973c2e3":"collectorAddress()","c9744029":"getPremium()","c974631b":"platformWithdrawalProposed()","c974947d":"unlockAddress(address[])","c975653d":"StartCity()","c9762f8f":"TooBigPriceDiff(uint256,uint256)","c976b4f9":"slowDump()","c976bbbb":"_compare(int256,bytes2,int256)","c976ce9c":"privateSaleLimit()","c977a7a7":"setUsdToEtherExchangeRate(uint256)","c9788631":"beneficiaryWallet()","c978a7bc":"inviteRate()","c978c45d":"setNewMessage2(string)","c978ee59":"fourthStageMintingDate()","c979113c":"nextStageEmission()","c9791e0d":"confirmBobIndirectPay(uint256)","c97a06ce":"isHardcapReached()","c97aae82":"NulsStandardToken(uint256,string,uint8,string)","c97ab7ca":"isICOClosed()","c97b5278":"XYZSecurities()","c97b6d1f":"updateBatch(int128[],uint128[],uint8[],bytes32[],bytes32[],bool)","c97be180":"lock(address,uint256,uint256,uint256)","c97c1505":"readRate(string)","c97c6353":"testHello()","c97ca645":"updateWeiPerWholeToken(uint256)","c97cc71e":"getTransferRawAddress(bytes)","c97cef81":"Shelter(string,string)","c97dc17b":"DatareumToken()","c97e8480":"delegatedTransfer(address,uint256,uint256,uint256,uint8,bytes32,bytes32)","c97ec033":"changeOverERC228(address,address,uint256,address)","c97f8363":"setBonusAddress(address)","c9801b50":"f_public()","c98031be":"hintURL(int256,bytes32,string)","c980c626":"setImage(uint256,string)","c98165b6":"createTarget()","c98166c0":"ethAmount()","c9818728":"candyCap()","c9819d1e":"GuardaRegistro(bytes32)","c982e353":"getCurrentPrice(uint256,uint8)","c9838930":"setReferralTokenContract(address)","c985c221":"get_all_levels()","c986cf7c":"defrostAdvisorsTokens()","c987a78a":"AISI()","c987c5a1":"userAdd(address)","c988d70f":"getDailyWithdrawLimit()","c9891384":"PendinglinesToLines()","c9894b5c":"taxValue()","c98a79fb":"getBallotLogN(address)","c98b7027":"bgb_per_Keos()","c98bd7da":"isWinner(uint256,uint256)","c98bdd2f":"year5LockAddress()","c98c3083":"OutcomeToken()","c98c6e08":"payAmountForLoanAtIndex(uint256,uint256)","c98cf6e3":"COBToken()","c98d3457":"alliance(address,address)","c98d9b83":"getTokensContractAddress()","c98e4149":"setKingdomFactory(address)","c98f0ad9":"getUnlockedBalanceLimit(address)","c98fc4d9":"adminSetConfig(address,address,address)","c98fefed":"convertFor(address[],uint256,uint256,address)","c99051dc":"getWildcardsRemaining(uint16)","c9912255":"gago()","c99252d3":"joinGame(uint256,uint8,uint8)","c99380c9":"getAttoTokensBoughtInICO()","c994fe31":"setCompanyManager(address)","c995623e":"revealMove(bytes32,uint256)","c9956b05":"FMCToken()","c99749a8":"prepareWithdrawProposalGivenSplitProposalId()","c997c1e2":"mul18(uint256,uint256)","c99842f9":"startPreIco(uint256,uint256,uint256)","c998e9dd":"changeUserKeyFromRecovery(address)","c9991176":"addAdministrator(address)","c99a975d":"optInFcnMinGas()","c99ae8a7":"setFechaTax(uint256)","c99b1f28":"icoWeek4Bonus()","c99b27ad":"updateFirstWallet(address)","c99c3c62":"getCarProductCount()","c99d89fc":"PriceOneEnable()","c99d9ef7":"startIcoDate()","c99db1ba":"_calculateLockedPercentage(uint8)","c99dccf9":"getInvestor(uint256)","c99f3357":"DRAIN_DELAY()","c99ff644":"dilute(uint256)","c9a04e55":"getDailyEthProfit(address)","c9a0e252":"ICOParticipants(address)","c9a1d88b":"placeBet(uint16,uint16,bool)","c9a2ab19":"aragonDevMultisig()","c9a30482":"BurnableCrowdsaleToken(string,string,uint256)","c9a365a7":"foundationlock()","c9a3f228":"SCLCrowdsale(address,address,address,uint256)","c9a43b2b":"m_software(uint256)","c9a4faa6":"AdexContract(address,address,address,uint256,uint256,uint256)","c9a5003c":"lastHello()","c9a52d2c":"setBytesValue(bytes32,bytes)","c9a56efd":"getBetterBettingInfo2(address)","c9a6964a":"initializeOwnable(address)","c9a6b2a8":"addAuction(uint256,uint256,uint256,uint256,address)","c9a6e480":"tokenSupplyFromCheck()","c9a75d90":"setPI_edit_20(string)","c9a7623a":"buyingPrice(bool)","c9a77e3d":"totaleMsg()","c9a815bd":"setSpendingLimit(address,uint256)","c9a82aa8":"markCrowdsaleEnding()","c9a8baae":"myFirstLoop()","c9aa013b":"Start5()","c9aa4cf8":"testHasTokens()","c9aa71b8":"getFlyingUnicorns(bytes32,uint64)","c9ab521f":"AddBook(uint256,string,address)","c9ac836d":"transferPet(address,address,uint64)","c9acab84":"left59(uint256)","c9ad51b5":"TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE3()","c9ae5594":"countHand(uint8[])","c9af089f":"getOrCreateChildUniverse(bytes32)","c9af2418":"checkUp(address,bytes32)","c9b06a4b":"AECloudToken()","c9b0d97b":"canCollect()","c9b0eef4":"oracleItQuery(uint256,string,string,string,uint256,uint256)","c9b110cb":"getAmountOfWithdrawals(address,address)","c9b1a517":"Show_Doctor(uint256)","c9b1b2ae":"etherKing(uint256)","c9b25f0f":"transferEther()","c9b2a580":"UTTotalSupply()","c9b2e522":"getSymbol(address)","c9b31d4b":"getCurrentSecret()","c9b3e736":"getTokenSellPrice()","c9b44821":"FIRETRADES()","c9b46bbb":"test0_adding()","c9b4cb94":"BIBToken(uint256,string,uint8,string)","c9b4ddb2":"receiveLockedAmount(address,uint256)","c9b5e555":"founderAddr()","c9b67627":"NonActivationWithdrawal(address[2],uint256[8],uint8,bytes32[2],uint256)","c9b7ab8b":"getPostLink(uint256)","c9b8020d":"starbaseToken()","c9b86d43":"manualState()","c9b94eb9":"liabilityFinalized(uint256)","c9ba0d4d":"r9kAddress()","c9ba32f4":"COPPER_AMOUNT_NDC()","c9ba73a3":"getmypost(uint256)","c9ba93be":"getIndexFromAddress(uint256,address)","c9bba27b":"manualEmissionEnabled()","c9bbc8c0":"donkeyName(address)","c9bc0883":"transferFromForcibly(address,address,uint256)","c9bc2bf5":"updateSnipCoinToEtherExchangeRate(uint256)","c9bc5dbd":"requestCeilingRaise(uint256)","c9bd2893":"fines()","c9bebd90":"ownerAlias()","c9c08bb7":"tickerAddress()","c9c09ac8":"denyBundlingMultitoken(uint256)","c9c0c77a":"deposit(uint16)","c9c0f25e":"getAllWorkers()","c9c1db4a":"launchFund(uint256)","c9c1ed93":"testControlRegisterContractIdAgain()","c9c1eded":"EPYCOIN()","c9c22deb":"getStarDistanceInLyThousandths(uint8)","c9c286c6":"getUnitRafflePlayers(uint256)","c9c347b9":"EthereumOneToken(string,uint8,string)","c9c4405b":"CariNetPrivilege(uint256,string,string)","c9c447e0":"getGamePrize(address,uint256)","c9c4797d":"ParticipantAuthority()","c9c51578":"buyBronze(uint256,uint256,uint8,bytes32,bytes32)","c9c53232":"totalStakedAt(uint256)","c9c538aa":"to_binary(uint256)","c9c5b5b4":"migrate(string)","c9c6176c":"BidSubmission(address,uint256,uint256)","c9c666aa":"changeCardboardUnicornTokenAddress(address)","c9c798b3":"addToFreelancerAvgRating(address,address,uint8)","c9c7cb74":"_burnTokens(address,uint256)","c9c7ef25":"withdrawtime()","c9c80a56":"adminshipLevel(address,uint8)","c9c8580c":"makeOffer(uint256,bytes32,uint256,address,uint256,uint256,address,address,uint256)","c9c85ec6":"currentGameCost()","c9c8ffd2":"test_increaseBlockNumber30211()","c9c92c12":"transferWineFromVineyardCellar()","c9c92dc5":"getProposal(bytes32,string)","c9ca080d":"Indecoin()","c9cb0043":"supportTokenAmount()","c9cb0e9b":"emitNewSmartToken(address)","c9cb6f47":"distributeDifferentAmountOfTokens(address[],uint256[])","c9cb7204":"unsold()","c9cbc222":"PicAdded(address,uint256,address,bytes32)","c9cbf8c9":"saleExchangeRate3()","c9cc0498":"buyComission()","c9cc0ed5":"setGuardianSale(uint256,uint256)","c9cc1a05":"transferTokensToContributor(uint256)","c9cd40a2":"vestingEntries(address)","c9cda91f":"changeTokenAddress(address)","c9ce1c23":"KUEKeNParty(string)","c9ce624f":"buyBackFund()","c9cf03ce":"refundMoneyForUser(bytes32)","c9cf2d4e":"vault_deposited(address)","c9cfa6ba":"setAllocation(address,address,uint256,uint256[],uint256[])","c9cfac55":"refundCurrency(address,uint256,uint256)","c9cfe755":"sendUnsold(address,uint256)","c9d00764":"TokenPurchased(string,uint256,uint256,uint256)","c9d07650":"NetkingToken(uint256,string,uint8,string)","c9d12d11":"RC(address,uint256,uint256,uint256,uint256)","c9d2373b":"marketKnowledge()","c9d256ae":"tokenSaleLeft()","c9d27afe":"vote(uint256,bool)","c9d27bcf":"doDisputeMemoryAccessSequence(uint256,bytes32)","c9d2d217":"TokenState(address,address)","c9d34622":"diffDays(uint256,uint256)","c9d4623f":"engine()","c9d57328":"managePlayer(uint256)","c9d66690":"RedeemEvent(address,uint256)","c9d68389":"airdropper()","c9d7d862":"drawFundsAfterTransfer(uint64)","c9d82560":"RewardBonusTimePeriod()","c9d82c96":"ICO_DURATION()","c9d96393":"updateGenVault(uint256,uint256)","c9d9c2b4":"deathData_a0()","c9dab438":"Subrosa()","c9dac221":"Bussines_Card(string,uint256,string,address)","c9db1bbf":"setPreICOStartDate(uint256)","c9db2bbd":"addPendingContribution(address,uint256,uint256)","c9dbc259":"ExchangeSwitch(bool)","c9dca9ba":"changeTokenMinter(address)","c9dd3a56":"annualInterestUpdateToken()","c9dd915f":"checkPremium(address)","c9ddd118":"checkPersonalRemaining(address)","c9ddd12f":"getTimestampOfDayEnd(uint256)","c9de31c7":"EOToken()","c9deb567":"collectionsAvailable()","c9dfa731":"lost(uint256,uint256)","c9e01787":"registerAffiliate(address[],uint256[],string)","c9e075c6":"showLockState(address,uint256)","c9e077e6":"bride()","c9e20791":"_setName(bytes32,string)","c9e25251":"buy(bool)","c9e3af7e":"currentBetLimit()","c9e3e66c":"secondCheckpointPrice()","c9e40106":"getConsolationPrizeTokenId(uint256,address)","c9e43221":"MIN_WTH()","c9e4d8bb":"isService(address,address)","c9e525df":"N()","c9e55b4e":"adminFixMaxSupply(uint256)","c9e6bef4":"_endsAt()","c9e7fd4b":"SovTokenCrowdsale()","c9e84346":"bonusLevels(uint256)","c9e904be":"totalEthRaised()","c9e9f4dc":"donateToLottery()","c9e9ff2c":"CPBWallet()","c9ea7c7c":"setMinimumFundingGoal(uint256)","c9ebb5e8":"freeMem()","c9ebeba6":"setIPFSParameter(string,string)","c9ec6cf6":"setOpenCloseHour(uint8,bool)","c9ecc566":"PurchasingAllowed(bool)","c9eda121":"setArrayIndexValue(bytes32,uint256,string)","c9ee21fa":"GUNS()","c9eea77c":"_updatePrice()","c9ef5569":"getVolumeBonusPercent(uint256)","c9efa392":"bonusMilestones()","c9efda2c":"canStartAuction()","c9f09090":"populateTrancheTokens()","c9f0a02d":"burnAuction()","c9f166f8":"ctz32(uint32)","c9f1b7f0":"TeamToken()","c9f21fec":"setAuditTimeout(uint256)","c9f316dc":"getReferenceCodesOfAddress(address)","c9f3d62e":"getCarProductEarning(uint32)","c9f68025":"AMToken()","c9f73464":"maxCandidateId(uint256)","c9f84e1a":"unlockSecondPrivate()","c9f88f27":"invokeContracts(bytes)","c9f8cf20":"getCanvasesWithSellOffer(bool)","c9fa11df":"EventChain()","c9fa595b":"paused_3()","c9fa8f2d":"houseFeeHoldover()","c9faa7c5":"isActivated(address)","c9fb975c":"UnicornsSold(address,uint256,uint256,uint256)","c9fbdc36":"referral_fee()","c9fbe626":"TweetRegistry()","c9fca8a5":"rivetzRegister(uint256,uint256,uint256,address,address)","c9fd1955":"getVestingWalletLength()","c9fd83e2":"lastFeePeriodStartTime()","c9ff34ec":"privateTime()","c9ffb6e3":"claimPocketMoney()","ca001903":"AntarctiCoin()","ca00aad3":"closeLottery(uint256,string)","ca0157cd":"getGameIds(address)","ca01b37c":"DASToken()","ca01ba39":"generateTokens(uint256)","ca02dbe3":"Requestprofit()","ca0370f7":"calculateCompoundContract(uint256,uint256)","ca03dab5":"withdrawSubdivsAmount(uint256)","ca03fdcd":"ShowADV()","ca04d26f":"transferReadable(address,uint256)","ca04e076":"getOwnerPixelCount(address)","ca051844":"withdrawBalance(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)","ca056aed":"addTokens(address,uint256,uint256)","ca06226d":"Ecopackcoin()","ca07218c":"setIt(address)","ca077f72":"allocate4ProjectToken()","ca0781a1":"getRateAndCheckCap()","ca079c52":"Upd(uint256,string,address,uint256,uint256)","ca087b96":"FlexFitRewards()","ca093888":"gameIsSundown()","ca0941b4":"findIdByHostPort(string,uint256)","ca0a992e":"IvyKoinContract()","ca0a9c2d":"makeUser(address,string,string)","ca0b1878":"addValue(address,uint256)","ca0b49ae":"getMyCarsIdx()","ca0c0a49":"gameActiveStrRef(string)","ca0c1e62":"computeMerkle(int256,int256,int256[],int256,int256,int256[])","ca0c2024":"minCapPre()","ca0c601c":"maxGoalInICO()","ca0c74be":"buyForInvestor(address,uint256)","ca0c9b5c":"storeTransactionData(address,address,uint256,uint256)","ca0cd7c0":"setUnlockLater(uint256)","ca0d01a6":"_yearTwoSupply()","ca0d0d82":"getMilestoneInfo(uint8)","ca0d6e48":"Mariton()","ca0d9564":"removeAdminList(address[])","ca0dcf16":"mintRate()","ca0e5c27":"ViewProjects()","ca0f1215":"initialSaleDuration()","ca0fe62a":"CryptoMemes()","ca0fe751":"switchRankings(uint8,uint64,uint64,uint64,uint64,uint64,uint64)","ca1149d1":"getUserEntryStatuses()","ca1314af":"getMax(uint256[])","ca13b818":"setWinningTeam()","ca13fb0f":"minInvestCents()","ca154008":"AssetContract()","ca15fb65":"getCardPower(uint256,uint256)","ca1637f5":"getGDemocsN()","ca169e66":"Voodka()","ca17cad1":"getBoxPrice(uint256,uint256)","ca185022":"foundersFundAddress()","ca1861aa":"stockCancelBuyOrder(uint256,uint256,uint256)","ca18da3f":"setGender(uint8,string)","ca18ebbf":"preICOPrice()","ca1929aa":"LogBeerRedeemed(address,bytes32,uint256)","ca1938e5":"houseCutPercentage()","ca1a2eb4":"localPaiementConfirmation(bytes32,bytes32)","ca1a3086":"transferChickenFrom(address,address,uint256)","ca1a4942":"CountExecs()","ca1a9433":"addZiekenhuis(address)","ca1aa5bb":"distributeReservedTokens()","ca1ab2ef":"divideByZero(uint256)","ca1ac5cb":"_createWhale(string,address,uint256)","ca1ad32c":"setPartnerPercent(address,uint16)","ca1b06b2":"ActionAuctionPlat(address,address)","ca1b5aa7":"allowUpgrading(bool)","ca1bf69f":"froze(address,uint256)","ca1c3bb3":"testNonExistingVoteWeight()","ca1c8895":"setPriceOfToken(uint256)","ca1d209d":"fund(uint256)","ca1d6f73":"doTeamMinting(address)","ca1e5bb7":"mintTokensByETHExternal(address,uint256)","ca1e9738":"getPricePerToken()","ca1ea20e":"dataMigration(address,address,address[])","ca1eb8be":"marketaWallet()","ca209c8b":"Bullexi()","ca2145a7":"CoinHot()","ca215005":"getIndividualPrice(address,uint256)","ca2156bd":"redenominate(uint256)","ca2177ef":"NSPFallback(address,uint256,uint256)","ca219b16":"XsearchToken()","ca2317dd":"changeReserveTeamRecepient(address)","ca2322c2":"mashToken()","ca2392f8":"sell(uint8,bytes6,uint32,uint32)","ca24034b":"deathData_v17()","ca2527e5":"batchTransfer2(address[])","ca256771":"weiPerUSDinTGE()","ca2571af":"lockedEarningsOf(address)","ca25bf6f":"IncubatorGlobalGas()","ca25e9c5":"setPurchaseRatios(address[],uint256[])","ca263a49":"registerDomain(bytes8,string)","ca265c0f":"getCurrentSpend(address)","ca267f28":"getRecordCount()","ca2748bd":"transferAndFreeze(address,uint256,uint256,uint256,uint256,uint256)","ca276c07":"updateTierMinimum(uint256,uint256)","ca2785bf":"flushHouseFees()","ca278feb":"VanityURL()","ca27b214":"LucksToken()","ca27eb1c":"createListing(bytes32,uint256,address)","ca281fd9":"renounceControl()","ca28d2ae":"SEKCapitalToken()","ca292622":"getCompany(bytes32)","ca29cae8":"bufferWallet()","ca2a2f99":"_inMoney(uint256)","ca2acfff":"_getTokenAmountWithoutBonus(uint256)","ca2bf047":"predictPacks(uint256)","ca2c139c":"getCurrentQuickPromoBonus()","ca2cd9d3":"marketactive()","ca2cef51":"MiningWarContract()","ca2d553a":"setAccessControl(address,address,uint8)","ca2dfd0a":"removeVerifier(address)","ca2dfff1":"notforked()","ca2e2f49":"firstVestedLockUpAmount()","ca2e8cc5":"markRedeemed(address)","ca2f281b":"FMC(uint256,string,string)","ca2f5a07":"PubRejected(address,string)","ca2f5cb4":"_addPauser(address)","ca2f6487":"Zettabyte()","ca2fd584":"getCommanderPot()","ca30597d":"BoomstarterPreICO(address[],address,address,uint256,bool)","ca30a279":"setTgeAsSaleAgent()","ca313539":"EMISSION_FOR_SALESTAGE2()","ca315ca6":"slashStake(uint256,address)","ca3181e0":"mint(address,uint32,uint256)","ca31879d":"claimToken(address,address)","ca3228d7":"_updatePlayersMilk(address)","ca325469":"destinationAddress()","ca3261c6":"giveAuthorization(address)","ca330563":"isRedeemed(address)","ca33a817":"_guardianVendPrice(uint256,uint256)","ca343d2b":"getICOBonusAmount(uint256,uint256)","ca34a0e3":"iterate_next(uint256)","ca34e1d6":"WineMarket(address)","ca35271c":"numDebtors(address)","ca35bff2":"setCaps(uint256,uint256,uint256,uint256,uint256)","ca36226d":"removeCrowdsaleContract(address,address)","ca3654e7":"requestBonus()","ca36695c":"setUsdPerEth(uint256)","ca368538":"randN()","ca37a9eb":"setWeiPerCent(uint256)","ca37dfad":"crossBalance()","ca37f7d9":"reserverWallet()","ca386496":"setPassword(string,string)","ca392c49":"setPreITO(address)","ca39e5ef":"fight(uint256,uint256)","ca3a3f0d":"_payTicketByEarnings(uint256,address)","ca3aa607":"LendToken()","ca3b5c91":"hasRelation(bytes,bytes,address)","ca3c7519":"getReffName(address)","ca3c8e11":"BRONZE_AMOUNT_NDC()","ca3c9147":"ownerHistoryEntry(uint256,uint256)","ca3dd175":"approveAuthority(address)","ca3e1176":"DaoRulesProposals(uint256)","ca3e1733":"ico1Tokens()","ca3e5333":"isFundManager()","ca3fc092":"CheckPrivilegeAccomplishment(uint256)","ca4028da":"BabyBorn(string,uint256)","ca414006":"setData_11(string)","ca41d16f":"SMTfundAfterPreICO()","ca4223ad":"LATIME()","ca42afda":"getGErc20ToDemocs(address)","ca43801a":"SelfDesctructionContract()","ca4398e3":"StellarToken(uint256,string,uint8,string)","ca43b191":"armySatelitesCount(uint256)","ca4401f1":"investor_addRefBonus(address,uint256)","ca441b85":"randomBlockStart(uint256)","ca446dd9":"setAddress(bytes32,address)","ca448a88":"revokeAsset(bytes32,uint256)","ca44c8e4":"testMemoryIntegrityCheck4Bytes()","ca46e41f":"CROSAIR_VOUCHER_LIMIT()","ca4742f1":"getRN(uint256)","ca482264":"GetApplicant(uint32)","ca482849":"_finalSupply()","ca4858af":"evacuateTokens(address)","ca48b0be":"setupToken(address,address,address)","ca4938fb":"totalFreezed()","ca495022":"weiFromExchange()","ca4a0298":"maxAirDrop()","ca4a2bf7":"NewTokensSold(uint256,address,uint256)","ca4a3df3":"winlose()","ca4b208b":"developer()","ca4b4fd6":"remove(bytes32[],bytes32)","ca4bc6ae":"getBurritoData(uint256)","ca4bd513":"FundsRefunded(uint256)","ca4c8fc6":"OneTestCoin()","ca4cbf67":"getUint(address,string)","ca4d1435":"GWGF(uint256,string,string)","ca4e02d0":"Jump(address,uint256,uint256)","ca4e4863":"VECTORZILLA_RESERVE()","ca4f0911":"preICOPush(address,uint256)","ca4ff630":"priceForStage(uint8)","ca5271a1":"funcWithoutArguments()","ca52cc86":"CollectibleOffered(uint256,uint256,uint256,address,uint256)","ca53135a":"min_bet()","ca5397c7":"cancelSellOffer(uint32)","ca5450ce":"any_customer_payments_yet()","ca5454db":"createTransferAgreement(uint256,uint256,address)","ca54ea4e":"pointOf(uint256)","ca5541c1":"nextRoundReserve()","ca555f2c":"setInitLockedAccount()","ca558b25":"DataContacts(address)","ca55954c":"getTokenHolder(uint256)","ca56106c":"testCopy()","ca561d4d":"KiemTraNamNhuan(uint16)","ca579642":"GroupBuy(address)","ca585774":"RewardForum(uint256)","ca588f14":"delAdmin(address,address)","ca58a06c":"managerKey()","ca58d2b4":"FUNDS()","ca58da1a":"changeReserve(address)","ca59f45b":"transferRecord(bytes32,address,uint256)","ca59fa8d":"_distributedTo(address,uint16)","ca5a3b4a":"isAllowedWhitelist(uint256,uint256)","ca5a3f38":"getDaysPassedSinceLastRefundBallot()","ca5a899c":"totalStashedPayouts()","ca5adadc":"processEthPulicFunding(address)","ca5b4207":"log8(uint8)","ca5b428f":"Police_2()","ca5b8a52":"REGULAR_CATEGORY()","ca5c058d":"founderTokensLockedUntil()","ca5c1547":"preSaleFirstPrice()","ca5c7a34":"getLand(int256,int256)","ca5c7b91":"lockedSupply()","ca5d0880":"airDrop()","ca5eb5e1":"setDelegate(address)","ca5f4282":"amountWanted()","ca607c4e":"transfer_other(address,address,uint256)","ca60f409":"CurrentIcePrice()","ca61295b":"removeFRA(address)","ca615662":"testFailCreateWithForeignParentNotInUse()","ca6158cb":"itemId()","ca61cdac":"testSub()","ca61e9b3":"verifyHashWithPrefix(bytes32,uint8,bytes32,bytes32)","ca621ac3":"DEVELOPER_RESERVED()","ca626232":"exchangeAdapterManager()","ca628c78":"withdrawToken()","ca632cc5":"bountyPaid()","ca639025":"getNujaRegistry()","ca63a55b":"getHotelsLength()","ca63b5b8":"freezingCount(address)","ca63f057":"DISCOUNT_STAGE_ONE()","ca6490cf":"elementFunction()","ca64a02d":"withdrawBalances(address)","ca64a095":"viewNextRelease(address)","ca64ad89":"getNotPayableTime(uint256)","ca64cd34":"marketCapRed()","ca6528cc":"increaseBalanceOrWithdraw(address,address,uint256,uint256)","ca6649c5":"joinGame(uint256,uint8)","ca668eb2":"MyERC20Token(string,string,uint256,uint256)","ca66a9c7":"blocktubeCoin(uint256,string,uint8,uint256,string,string)","ca67065f":"tokensAreFrozen()","ca67628f":"presaleFemaleEnd()","ca68968e":"ConversionRates(address)","ca68a45d":"createLastWill(address,string,string,string,uint256,uint256)","ca698873":"countWhitelists()","ca699de1":"StagedRefundVault(address)","ca69e323":"maxToken()","ca6ad198":"oraclizeMinCallbackGasPrice()","ca6ad1e4":"setCustomGasPrice(uint256)","ca6b72fd":"XtracoinToken()","ca6c7400":"getBuyerSignature(string)","ca6cf796":"startWinery(string,string,string,uint256)","ca6cfd95":"_createToken(string)","ca6d56dc":"addMember(address)","ca6d5d0c":"getLockedTokensInGroup_(address,uint256)","ca6f8295":"RDOToken()","ca7044c3":"RelentlessConscience2Token()","ca708230":"funnel()","ca709a25":"getFeeToken()","ca710013":"hasAllowanceToRecieveTokens(address,address)","ca7140ad":"playerForceGameEnd(uint8,uint256,uint256,int256,uint256,uint256)","ca722cdc":"settleBet(uint256,bytes32)","ca7230e9":"transferFromRegister(address,uint256)","ca7275cc":"SpiceHours(address)","ca733c32":"commandAddress()","ca73419e":"addAddressesToBlacklist(address[])","ca7390ab":"mulDivCeil(uint256,uint256,uint256)","ca740c8b":"IncreaseFunding(uint256,uint256)","ca74124c":"addUser(uint256,uint256,uint256,string,string)","ca7430ea":"transferunlock()","ca758f42":"stcMaxBonus(uint256)","ca75b954":"PRESALE_HOLDER()","ca75cbfe":"submitTransaction(address,uint256,address)","ca75d770":"m_Owner()","ca760021":"withdrawChamp(uint256,address)","ca761365":"getDebris(bytes32,uint8)","ca76e548":"updateRest()","ca76ecce":"gettotalBondDivs(uint256)","ca7729f7":"_parseIntScientificWei(string)","ca77a6e8":"handleALU(uint256,int256,uint256,uint256,uint256,uint256)","ca77ab65":"calculate()","ca77ab8a":"getNextFile(bytes)","ca77ba31":"totalIssuanceCurrentBalanceSum()","ca77ea25":"createTokenByAtes(address,uint256,string)","ca78e65b":"disableManuallyMintTokens()","ca790380":"AstatosToken(address)","ca792754":"_assign(address,uint256)","ca79e2f2":"mintLongTermTokens(address,uint256)","ca79f967":"abortInactiveFight(uint256)","ca7a08ef":"compensate(address)","ca7b15da":"tokenRate5()","ca7bfc5d":"FinanceChain(uint256,string,string)","ca7c4dba":"getEtherPrice()","ca7c4e35":"OmenoToken()","ca7c8d07":"Medcash(address,address)","ca7c9296":"calculateFundedValueTokenToken(address,address,uint256,uint256,address,uint256)","ca7c95f2":"PRE_SALE_20_BONUS_MIN()","ca7ca5b4":"removeMember(address,bytes32)","ca7d18fe":"CORPayCoin()","ca7dc5b1":"getNumberOfTweets()","ca7e321f":"startBuyBackDate()","ca7e88ba":"setOutcome(bytes32,uint8)","ca80b489":"setGenes(uint256,uint256)","ca8127d4":"tradingFeeModifiers(address,address)","ca819d35":"getUserIDByWallet(address)","ca82a7c8":"rentModified(uint256)","ca82b5aa":"playBps(uint8)","ca84c176":"bonusAfterPresale()","ca84d17d":"payLeaderAndDev()","ca855a57":"SecureEgg()","ca85dbfc":"quickSetStarterClasses()","ca862298":"BitcoinWorld()","ca8695a4":"resetNewTokens()","ca8786c9":"bacancyToken()","ca879753":"burnMe()","ca87cb2a":"MRASToken()","ca87e67e":"setSaleTime(uint256,uint256)","ca87eb50":"Seo(address,uint256)","ca8836d2":"isPending(uint256)","ca88552d":"stock(address)","ca887dc4":"getAllGameStatistic()","ca88a7b0":"_shareToReferer(address,uint256,uint256)","ca88b3b2":"destructAll()","ca88bd5b":"isAccountBlocked(address)","ca88c5bd":"_getChallengeSuccess(uint256,uint256,uint256)","ca8a2c08":"createEstate(int256[],int256[],address)","ca8ab933":"countInstructors()","ca8b39c8":"setRegionBlockUpdatedAt(uint256,uint256)","ca8b42e4":"max_index()","ca8ee75a":"read_u8_array()","ca8f8ff3":"isExist(uint256)","ca8f9651":"voterVotingTime(address)","ca922078":"fundingStage(bytes32)","ca929e12":"transform(uint8,uint8)","ca92a136":"result_hash()","ca940bba":"getPastBet(uint256)","ca94452d":"setCrowdsaleTransfer(address,uint256)","ca94692d":"abiSignature()","ca949a1d":"blackjackValue(uint8)","ca94a927":"UnicornManagement(address)","ca95402d":"ExpRegistrar()","ca965c3f":"transferCEO(address)","ca96d7fc":"claim(bytes32,bytes32,uint8)","ca970bac":"donateDivs()","ca972cd4":"registerNewAccount()","ca97a248":"MoveRerolled(uint256,uint256,uint256)","ca97d274":"updateTokens3PerEth(uint256)","ca990859":"getPlayedInfo(address)","ca997200":"getForecastData(bytes32,bytes32,bytes12,uint8)","ca9a06df":"calcReservedTokens(uint256,uint256)","ca9a9386":"getNickname(address,address)","ca9c2862":"getCrydrController()","ca9c4b33":"hatchEgg()","ca9ccd3d":"secondRoundTime()","ca9d07ba":"refill(uint256)","ca9d0f8d":"process2(uint256,address)","ca9defb7":"ownerTransferZTH(address,uint256)","ca9e1993":"_transfer()","ca9ec138":"toEthSignedMessageHashBytes(bytes)","ca9efc73":"left81(uint256)","ca9f0803":"reservedInvestors(address)","ca9fa49e":"halfyearteam_trade_date()","caa02e08":"winnerCount()","caa035d6":"getTokenSaleType()","caa03a3e":"getPlayerId(string)","caa0f0af":"devAllocateTokenInMinutes(address,uint256,uint256)","caa0f92a":"getNextTokenId()","caa14e36":"setGiveBirthType(bool)","caa25756":"registerProductContract(address,address)","caa3b6e4":"TicTacToe()","caa3d559":"TRCExchangeRate()","caa4041e":"getAccountLimit(address)","caa4c5d0":"assumeControl()","caa5aba2":"ConfigurableParameters(uint256,uint256)","caa648b4":"getTotalValue()","caa67873":"CreateKDT(address,uint256)","caa6fea4":"emergency()","caa7590d":"MIN_INVEST_BOARD()","caa774ed":"petOnLeaderboards(uint64)","caa7b4b8":"ABToken(uint256,string,uint8,string)","caa7be13":"ClientPaymentEvent(address,uint8,uint8,int256)","caa7fd06":"cancelBid(uint256,uint256,bool)","caa82ab2":"TokenSendFail(uint256)","caa872ae":"_takeAll(address,address,uint256)","caa877e7":"buyFor(address,address)","caa8e084":"div(uint32,uint32)","caaa2045":"addressToNumTowns(address)","caaacb12":"totalForMining()","caab0acc":"testThrowCreateRetracted()","caab21d2":"Ore()","caabe889":"inAllocationLockPeriod()","caac87d0":"airdropPlays()","caad5b18":"withDrawEther(uint256)","caade55b":"AddrPartnerPocket()","caaed302":"rejectMilestone(uint256)","caaee91c":"setProxyOwner(address)","caaf2dd7":"getInitialAnswerResult(uint256)","caaf6d21":"numLoveItems()","caafa055":"ROUND_7_PRESALE_BONUS()","caafc163":"process2(uint256,address,address)","cab0198f":"emitTokensToOtherWallet(address,uint256,uint256)","cab067c0":"initialiseCrowdsale(uint256,uint256,address,address)","cab09273":"getUsedPaymentSupply()","cab0f632":"changeSponseeAddress(address)","cab17220":"VotesNecessary()","cab36e92":"addHash(uint256,string)","cab37586":"partnerWithdrawed(address)","cab39db9":"_updatePhase(bool)","cab3ad2c":"BONUS_ICO_WEEK_ONE()","cab47da7":"RATE_FOR_WEEK2()","cab54df1":"testHitPresaleCapPreDistribute()","cab5c0f1":"_incrementState()","cab60267":"getGameCalculatedStats(uint256)","cab63661":"setPublisher(address)","cab6eade":"_destroyDeed()","cab7e3d9":"purchaseCars(uint256,uint256,bool)","cab7f0cc":"test_insert_findWithHintNextRemoved(int256)","cab7f521":"invoke()","cab896dc":"gameCost()","cab925a3":"BurnReceipt(address,uint256)","cab9c32a":"sellLimit(uint256,uint256)","caba203d":"Loyalty()","cabb3a3a":"isAlphaNumeric(string)","cabc0f43":"isLotteryOpen()","cabc737c":"_addMaster(address)","cabcaaa0":"associateWithFile(bytes32)","cabd27de":"Motion(address)","cabd734f":"reject(bytes32)","cabe0452":"getCampaign(bytes32)","cabe2c0a":"levelEndDate()","cabf72e5":"WSBCCoin()","cabf8493":"balancesImporter4()","cabfb934":"replace(address)","cabfd1bf":"allocateTokens(address)","cac07bbf":"distributeTeamCut(bool,uint256)","cac12d2d":"tokenGenerationCap()","cac35112":"tokenRelease()","cac37f93":"totalTokensWithdrawn()","cac3e64a":"checkToken()","cac3f6c9":"percOf(uint256,uint256,uint256)","cac625e6":"transferTokenOwnership(address,address,uint16)","cac6d78f":"ToexCoin()","cac6edd8":"rightLottery()","cac77df7":"__transferFromToICAPWithReference(address,bytes32,uint256,string)","cac7db8a":"addUserToList(address)","cac7fc71":"allBalances(address,address,address[])","cac8d538":"setERC20Contract(address)","cac92fe1":"Aeroneum(address,address)","cac952ae":"isValidCustomerTxPaymentForMCW(address,bytes32)","cac98d6d":"getCCH_edit_24()","cac9a94e":"changeWalletOwnerAddress(address)","cac9ffbd":"fillIndexedBid(uint256)","cac9ffee":"unWhitelistAddress(address)","caca66bd":"transferPlatformship(address)","cacb27f4":"_D_sendToTeamEthContract()","cacc24eb":"transferFromViaProxy(address,address,address,uint256)","cacca238":"getBaseAmount(uint256)","cacca4a0":"approveTransfer(uint256)","caccd7f7":"developerAddress()","caccd805":"daoPOLSKAtokens()","cacd7a66":"creatUserID(string)","cace467e":"cancelSell(uint256,uint256,uint256,uint256)","cace7bd3":"claimRewardK(uint256)","cace8f37":"dragonGirlLotteryNumber()","cacf1e0e":"getPaymentsCount()","cacf5a33":"calculateVestedAmount()","cacf66ab":"genesisTimestamp()","cacfa24a":"_isBuilt(uint256)","cacfb535":"unpackAll(uint256)","cacfd8e9":"playTypes(uint256)","cad079ed":"investedUSD()","cad0899b":"sum(uint256,uint256)","cad1c663":"getChildOperation(bytes32,uint8,uint8)","cad1d39b":"getPersonalAirdropUnlockTimestamp(address,address)","cad2042f":"O2OToken(uint256,string,string)","cad27ae1":"random(uint64,uint8)","cad283a0":"EtherBetIO(address)","cad3d24d":"calculateBoatFee(uint256)","cad41357":"darknodeBond(address)","cad461ea":"setWeiPerUSD(uint256)","cad4ae37":"_addToBlacklist(address)","cad60d17":"freezeTokens(uint256,uint256)","cad66781":"NumOfStudentsRequests()","cad6dd1f":"sumPreICOUSD()","cad7214d":"supplyRound4()","cad80024":"left58(uint256)","cad916ec":"DEVELOP_CAP()","cad93688":"Test2(uint256)","cad9639d":"DEXK()","cad9642b":"getReportCount()","cad987f5":"updateAppreciationStep()","cadaacbf":"g(address)","cadb1166":"modifyWhiteList(address[],bool)","cadb3031":"timeoutY()","cadb48d9":"contractCreationBlockTime()","cadb5236":"vestToAddressEx(address,uint128,uint8,uint32)","cadbead4":"Pentacoin()","cadc958f":"VoteOnTransferStarted(address)","cadca796":"setShareHolders(bool,uint256,uint256)","cadcbce4":"PartComplete()","cadd888b":"getRewardToken(uint256,uint256)","cade3a5d":"_createPixel(uint24,uint32,address)","cade4f31":"collected_crowd_vitas()","cade77fa":"readAddress(address)","cadec1b2":"Registrar(address)","caded61f":"saleRatio()","caded711":"subOpenRoomCount(address)","cadf338f":"valueOf(uint256)","cadf74e2":"_unclaimedChickenOf(address)","cae039eb":"getWishTime(uint256)","cae07d2a":"TOKEN_SCALE()","cae15051":"tokenReceived(address,uint256)","cae20b59":"getAnimalIdsWithPendingCostume()","cae21530":"fightZeroMonster()","cae270b6":"sell(address,address,uint256)","cae342f6":"dontShowMeInTrace()","cae3c254":"publicFundingWhiteList(address)","cae3d482":"vehicles()","cae44e83":"EthereumCoin()","cae4d676":"sendRefund(address)","cae523c1":"testOwnedTryAuthUnauthorized()","cae57913":"addTwo(uint256)","cae5c8c3":"APP_STORE()","cae6047f":"INVERSE_BASIS_POINT()","cae61d2e":"offer(string,uint256,uint256,address)","cae6b9c5":"tapPoll()","cae6ff18":"SKPT()","cae774b3":"maxInterval()","cae8e284":"newProposal(address,uint256,string,bytes32)","cae8eb2f":"ctrtToken()","cae96610":"WorldWifi()","cae96926":"is_creator(address)","cae98d4f":"r1(address)","cae9a07d":"changeManager()","cae9ca51":"approveAndCall(address,uint256,bytes)","caeafe6a":"stageStartTime()","caeb2539":"PreSaleBuy(address)","caeb2e2c":"_emitSkillAreasSet(address,uint256)","caeb30e9":"Configurator()","caebb256":"channelManagerByAsset(address,address)","caec390e":"getinfolaff(address)","caec3c79":"getBatchTransfer(address,address)","caecc5aa":"turnrefund()","caed4f9f":"DataService()","caed80df":"registries(address)","caee04b5":"AddGameCategory(string)","caee1daf":"creationRateOnTime()","caee262c":"sharesRec(uint256,uint256)","caee3305":"firstVestStartsAt()","caee4e18":"CommunityVotes(uint256)","caee7c78":"grantsCreated()","caef2181":"GetTimeMultiplier(uint256)","caef5dec":"getSubPayeesCount(bytes32)","caef6a84":"ETHMONEY()","caefb79e":"setCaps(uint256,uint256,uint256)","caefc5d5":"SemfaxToken()","caefdbe9":"FWDaddrETH()","caf05ce3":"isStopPlay()","caf0887d":"split(uint256,uint256,uint256)","caf19e5a":"toText(bool)","caf1bb7c":"repoBase()","caf29765":"PERCENTAGE_DIVISOR()","caf306c2":"ratePerWeiInMainICO()","caf439cb":"angelBurn(address,uint256)","caf44683":"test2(uint256)","caf597f3":"INVEToken(address)","caf66171":"bigRoundMaxRoundNum()","caf6cb3f":"marketDefaultFeeHigh()","caf6e1c9":"setClosedManually(bool)","caf6fe1a":"randomGenes()","caf71743":"createSellOrder(address,uint256,uint256,uint8[],address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])","caf798d7":"transferRegion(uint16,address)","caf7caf1":"_multiplyDecimalRound(uint256,uint256,uint256)","caf807a1":"closeEth()","caf91b30":"airdrop(uint8,bytes32,bytes32,uint256)","caf9bf58":"getContributionsCount(address)","cafa1cde":"PajCoin223()","cafa22d7":"setLeftICOTokens(uint256)","cafab7e1":"viewPetitionShareholderWithAddress(address)","cafaed51":"deadlineParticipation()","cafb2202":"invested()","cafbc49d":"createProduct(bytes32,string,address,uint256,uint8,uint256)","cafbcc8a":"inInnerScope(uint256,uint256)","cafc0fbd":"isRegulated(address)","cafd3d52":"setUpCrowdsale()","cafe0e90":"setFee(string,uint256)","cafe2f19":"setReachCapped()","caff4b03":"Response(bytes32,uint256)","cb009d2c":"KellerWilliams(uint256,uint256)","cb00e7f8":"MCTContractToken(uint256,address)","cb0177a0":"disableAllocationModificationsForEver()","cb0195ee":"changeDeveloperTemplateAmountLimit(uint256)","cb01a9bf":"payRent(bytes32,string)","cb01c70c":"episodesNum()","cb01cd02":"masscreate(uint256,uint256)","cb01f15c":"GetLogMessageWarning()","cb01f431":"maxTokensToSaleInClosedPreSale()","cb0210a0":"updateReputation()","cb029785":"Aphrodite()","cb02ba28":"multiSend(uint256,address[])","cb03e43b":"AnimalFoodToken()","cb040e0b":"createTemplate(string,bytes32,bool,address,bytes32,uint256,uint256,uint8,uint256)","cb05b93e":"getEth()","cb07b94b":"getLastRegionId()","cb09abc2":"resolveProp(uint256)","cb09b0d0":"ownerAPI()","cb0a2d95":"HashtagToken(uint256)","cb0a3889":"setPreIcoStart(uint256)","cb0ab425":"getIPFSHash(address)","cb0b6161":"_calcRelease()","cb0b7b03":"setContributionMinimum(uint256)","cb0cedb8":"getFineLevelOfAddress(address)","cb0d3133":"setEscrowedProjectBalances(uint256,uint256)","cb0d3981":"getMintForReportingParticipantTargetValue()","cb0ef7d0":"hgtRates(uint256)","cb0f86ab":"cards_black(uint256)","cb0fb059":"getNumberTwoArgs(address,bytes4,address,address)","cb10e0c5":"getLastDuel1()","cb10fa76":"safeToMul(uint256,uint256)","cb11526d":"moving()","cb117f0c":"approveAndCallAsContract(address,uint256,bytes)","cb122a09":"setFee(uint8)","cb12b48f":"me()","cb12be81":"prometheusShipMinted()","cb12fc1d":"LAMDEN_DECIMALS()","cb1374a2":"claimTokens(address[],uint256[])","cb146814":"baseETHBalance()","cb149b09":"unlockWorker(address,address)","cb14a5cf":"treeDetails(uint256)","cb14b170":"SubscriptionModuleImpl()","cb14d93b":"getHash(bytes,address,uint256)","cb1579ec":"checkOrderBatch(uint256[48])","cb15d07b":"getOfferAmount(uint256)","cb161f8a":"AddDiv()","cb16415f":"fundsToOwner(uint256)","cb1650b4":"createThread(string,string)","cb16d4a2":"sendEther(uint256,address)","cb16e6d0":"earlyParticipantWhitelist(address)","cb170735":"createBools(bytes32[],bool[])","cb19bf53":"Testtoken5()","cb1a32a4":"aotLength()","cb1a7b1d":"tokenDelta(address,address,address,uint256,uint256,uint256)","cb1aaa31":"distributed_bounty()","cb1ab340":"setFinancialAdmin(address)","cb1b82b7":"getuserbalance(address,address)","cb1ba60f":"voteOnElection(address,address,address,address,uint256)","cb1be21a":"configureWallet(address)","cb1c2b5c":"MIN_STAKE()","cb1c8b6a":"purchaseDefense()","cb1d8418":"getForkingMarket()","cb1d9d63":"setENGCommunityAddress(address)","cb1de087":"transferFromFST(address,address,uint256)","cb1e4389":"isMajorityConfirmed(bytes)","cb1fa715":"setSingleWithdraw(uint256)","cb1faac1":"leftVotes()","cb1fc276":"createPassportByOwner(address)","cb1fc7bc":"totalSzaboInBids()","cb207166":"LifeFactor_iv()","cb227cae":"getPOOL_edit_18()","cb22c0aa":"setBudget(address,string)","cb22d392":"windowFinalBlock(uint256)","cb22d41b":"numBeneficiaries()","cb22fd59":"setFeeCharge(uint64)","cb238ffa":"returnHashLong(address,uint256[3])","cb2410b9":"changeContentData(uint256,uint256,bytes32)","cb244f65":"koreanCitizen()","cb24e8f1":"Foorp()","cb25d9a2":"JFDToken()","cb27bdc1":"revealDeadline(bytes32)","cb27f28a":"endCrowdFund()","cb282253":"totalEthContributed()","cb28ba6a":"AIToken(uint256)","cb28c716":"createKycData(address,string,string,uint256,uint256,string,string,string,string,int256,uint256)","cb293e7a":"rentRentable(bytes32,address)","cb294dc5":"ULTRONEUM()","cb2971b1":"eosTokenAddress()","cb297ef0":"_performRenewal(uint256,uint256)","cb29881c":"createEggScheme(uint256,uint256,uint256,uint256,uint256,uint256,bool,bool)","cb29eee0":"medsupply()","cb2b34d6":"setSalary(uint256)","cb2b5668":"EVBChain()","cb2b9031":"addressToBytes(address,address)","cb2bea55":"setEmergencySecrets(uint256,uint256)","cb2c05dc":"viewInitialPricePerShare()","cb2c8723":"addUtilityHolder(address)","cb2e0814":"iii(address)","cb2e1d10":"icoRound4()","cb2e46f3":"endTimer()","cb2ec895":"deposit(bytes32,address,uint256,bool)","cb2f7b87":"update(uint32,uint128,uint128)","cb2f7c49":"hashDifficulty(bytes32)","cb2fe520":"remainingTokenBurnt()","cb31b6cd":"multiTransferFrom(address,address[],uint256[])","cb3204a8":"getKycHash(uint256)","cb338436":"doSendProfits(address)","cb33e7fa":"doTrade(address,address,uint256)","cb35ef2c":"demotest()","cb3687df":"core(uint256,uint256,uint256,uint256)","cb3694ba":"getManualInvestorsCount()","cb379765":"tsauction(uint256)","cb381b61":"teamETHUnlock1()","cb381c3c":"setGas4Token(uint256)","cb388b9b":"test_callIt()","cb38c7b4":"getWithdrawalList(address)","cb393ecb":"Dice5()","cb3993be":"decreaseApprovalAndCall(address,uint256,bytes)","cb39aafb":"validateRequest(bytes32[8],bytes,bytes,bytes)","cb3a11f9":"withdrawUserSpecifiedFunds(string,uint256,uint8)","cb3ab271":"WYQToken(uint256,string,string)","cb3ae150":"Playforbulktoken()","cb3b0c79":"LotToken()","cb3bc227":"LogBeerBought(uint256,address)","cb3c28c7":"trade(address,uint256,address,address,uint256,uint256,address)","cb3cb085":"validateTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)","cb3ce26e":"m_owners()","cb3cf99a":"decode(bytes,uint256,uint256,uint256,uint256,uint256,uint256)","cb3d6b5f":"devTeamWithdraw()","cb3e394d":"transferFromWithFee(address,address,uint256,uint256)","cb3e64fd":"unhalt()","cb3ebec2":"ownerDividend()","cb3eecc9":"getNewInstance()","cb3eef2c":"allWorkers()","cb3fcb56":"setGrowthTokensPercent(uint256)","cb4153e9":"destroyNinja(uint256)","cb421a21":"denemekontrat()","cb424c24":"HZRToken(address)","cb42a77b":"stringTobytes32(string)","cb43269d":"getRegistryImplementation()","cb4360d9":"allocateToken(address,uint256,uint256)","cb43e079":"drain_block()","cb44211e":"addApproval(address)","cb44b53d":"ResolutionProposals()","cb457d47":"unlimited()","cb45a294":"getSecondTokens()","cb4717b2":"SetProperty(bytes32,uint256,uint256,uint256)","cb4735f2":"estimatedFundingAmount(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","cb4799f2":"getMetadata(uint256,string)","cb47a8ce":"MultiChampion()","cb47abc7":"getTotalNumberOfTransactions()","cb48e1a5":"assignShareTokens(uint256)","cb4a15c5":"checkStringLength(string,uint256,uint256)","cb4b0105":"Unhold(address,uint256)","cb4b3710":"setStopSelling()","cb4b9db1":"EchoChainToken()","cb4bc2e9":"tryauthenticate(bytes)","cb4bd883":"updateRef(bytes32,string)","cb4be0bb":"getTurtlemasterReq()","cb4c86b7":"funding()","cb4c88ae":"MediatedTransferStatusModified(uint256,bool)","cb4c8ee4":"isRSPScience()","cb4d3d67":"AddedTokenHolder(address,uint256)","cb4de968":"ICO_BASE_PRICE_IN_WEI()","cb4e75bb":"smbl()","cb4e7fdc":"icoIsRunning()","cb4f1d85":"getPolicyHolder(bytes)","cb50301a":"unsoldAddr()","cb510e97":"isStaff(address)","cb51c418":"_toString(address)","cb51f777":"TOKEN_PRICE_NUM()","cb526229":"RefundChequeByHash(uint256)","cb52926a":"getBoughtAssetPacks(address,address)","cb52c25e":"updateAmountRemainingForSale(uint256)","cb553ac9":"sweepWizardCommission(uint256)","cb55adfb":"getStrategyTokenAndWeightByIndex(uint256,uint256)","cb560ac4":"winningMultiplier()","cb562fb3":"Uniond()","cb56d626":"testFailBlobStoreNotRegistered()","cb56dd79":"getFinalState(uint256)","cb56e40b":"getTrader(uint8)","cb574b8c":"buyUpgrade()","cb577480":"prepare(uint256)","cb5829ab":"Revision()","cb5853a8":"claimTaxex(uint256,uint256)","cb58594e":"airDropShadowMoney()","cb586251":"MintableMultiownedToken(address[],uint256,address)","cb5b6bef":"setPriceStep8(uint256)","cb5bf9b8":"EthersRaised()","cb5cf43f":"supplyReady()","cb5d0646":"Presale2Sold()","cb5e4805":"NvcFundCoin()","cb5e7d2d":"newMember(address,bytes20,uint64)","cb5e891f":"_setActiveSupply(uint256)","cb5f18db":"get_ads()","cb5fa63f":"getRoundEth(uint256)","cb5fd01f":"TestToken(address,address,address,address)","cb5fe36e":"VESTING_2_DATE()","cb60f8b4":"sellStartTime()","cb6142c9":"freezeAllAccountInEmergency(bool)","cb61522d":"MILLIODS()","cb61b42d":"updateShares(uint256,uint256,uint256)","cb61b49e":"_setRate(address,address,uint256)","cb6291cb":"ownerSendTokens(address,uint8,uint256)","cb6308f1":"approveVersion(address)","cb6367d1":"verifySignatures(bytes32,uint8[],bytes32[],bytes32[])","cb637d85":"changeAccountService(address)","cb639322":"realReserve()","cb63da4e":"ALLOC_RES()","cb63ddb6":"makeProposal(uint8,uint256)","cb642180":"_updateNodeHeight(bytes32)","cb645ae2":"addOneRequest(address)","cb64a37b":"createSeratioStake()","cb64d74d":"etherFeePercent()","cb656a13":"adviserSold()","cb65ad66":"MobileAppSupply()","cb65c0f5":"withdraw_excess_tokens(uint256)","cb662fe1":"claimedList(uint256)","cb67f20f":"SaleClosed(uint256)","cb67f948":"unlockTokens(address)","cb68780f":"GetICOData(uint256)","cb6890d9":"setAccount(address,uint256)","cb6ad855":"log10Ceiling(int256)","cb6af4cb":"createChannel(string)","cb6b1f05":"cf2Wallet2Pct()","cb6b25f3":"votePassed(uint256)","cb6b8699":"getPI_edit_5()","cb6bfa03":"BNIToken()","cb6bfd23":"CyTestCoin(uint256,string,uint8,string)","cb6c1655":"tokensFor1EthP1()","cb6cec4b":"getIpfsAfterTitle(bytes32)","cb6d0c5f":"minimumDurationInBlocks()","cb6da9da":"takerCount()","cb6e3fa9":"shouldUpdateFunder(address)","cb70d9a7":"changeUserCertificate(bytes32)","cb712535":"_transferFrom(address,address,uint256)","cb7129a3":"resolvePriorBets()","cb724422":"testPayTokens()","cb739476":"MAGExCoin()","cb739c0f":"changeRateLoss(uint256)","cb740c61":"grant(address,uint256,uint256,uint256)","cb742358":"virtualBalanceOf(address)","cb752679":"buyTokensWithPoly(uint256)","cb757e92":"REGO()","cb758a89":"addDataPoint(uint256,bytes32)","cb76937c":"getUserBetsTimeStampInARazInstance(uint256,uint256)","cb7729d3":"shiny()","cb774d47":"startingIndex()","cb775d5a":"consumePower(uint256)","cb77ed34":"_getProviderSupply(uint256)","cb78bebc":"USER_BUY_LIMIT()","cb78c9f0":"flips()","cb795a64":"allowedBuy()","cb79d573":"maxCompanyValue()","cb79e31b":"votingRightsOf(address)","cb7a0a6f":"getPlayerSpaceshipBattleModeById(uint256)","cb7aac1e":"transferTokensFromProjectFundAddress(address,uint256)","cb7acdd9":"hola()","cb7b3f0a":"readPaymentChannels()","cb7b3fb9":"KinguinIco()","cb7b4ad4":"canCPCreateInFactory(address,address)","cb7b8673":"setTokenExchangeRate(uint256)","cb7bba39":"lockaddress(address)","cb7bba61":"prove(string,string)","cb7c05e7":"verify_fund()","cb7c225e":"Send_TrustlessTransaction(address,uint256)","cb7c30f2":"m_D_n()","cb7d38ac":"changeStartPreSale(uint256)","cb7d8ef2":"spark()","cb7e70fa":"buyTokensOnInvestorBehalf(address,uint256)","cb7e9057":"dispatcher()","cb7e9bf1":"rewardHistoryMapOf(address,uint256)","cb7ef63d":"Coinage(uint256,uint256,uint256,uint256,uint256,uint256)","cb7fd9db":"checkVeracity(string)","cb802c8b":"getInvoice(bytes32)","cb80bd60":"LogRefundFailed(address,uint256)","cb810ea9":"sendTokensSingleValue(address,address,address[],uint256)","cb81fecf":"lockRequestCount()","cb821f03":"calculateClaimByIndex(address,uint256)","cb82d5df":"canMakeNoFeeTransfer(address,address)","cb84e69e":"setMessageMaxCharacters(uint256)","cb8523c6":"addAllowed(address)","cb856252":"getFreezeList()","cb859c09":"getGameRules()","cb85f175":"WhiteListedInvestorAdded(address,string)","cb86df95":"moveStartDate(uint256)","cb8820ef":"setWriterId(address,bytes32,bytes32)","cb884207":"deathData_f5()","cb885a36":"Crowdsale(address,uint256,uint256,uint256,address,address,uint256)","cb89558d":"AgreementHashRu()","cb899024":"defrostToken()","cb8a67ed":"ownersForChange()","cb8b4b83":"CollectERC20(address)","cb8b99b2":"_addCryptantFragments(address,uint256)","cb8c2982":"getMyKebabers()","cb8c478a":"activeTime()","cb8cb4a3":"getGoals(address)","cb8cd7cb":"transferFee_()","cb8d0f46":"tstop()","cb8ff46f":"koinconekt()","cb908d78":"_updateEthereumPrice()","cb912ffb":"tokenCountSet()","cb918634":"setDrawP(uint256)","cb91a6ba":"setGemPerMiner(uint256)","cb91aec7":"getFreelancerContracts(address,address)","cb91f1c2":"periodPreITO_endTime()","cb92042c":"removeShare(address)","cb923813":"saled()","cb92bfa1":"_computeCurrentPrice(uint256,uint256,uint256,uint256)","cb92c28d":"rewardEvery1000Draw7(uint256)","cb92cb52":"BuyBackStart(uint256,uint256,uint256)","cb930934":"KopihitamToken()","cb93abb2":"BUYER_STEP_1(bytes32)","cb93e347":"CryptoGamesMarket()","cb93f7ef":"withdrawDevFee()","cb944e24":"saleCapUsd()","cb945312":"testEqual()","cb949213":"addressToPurchasedTokens(address)","cb949e51":"getCustomer(address)","cb950c37":"updateValidMCAmount(uint256)","cb9580e0":"TotalPaid()","cb95a6f6":"Bounty(address)","cb96012e":"hashTo256(bytes32)","cb965ae9":"allKeys()","cb96b0d6":"MAX_EXCHANGE_FEE_PERCENTAGE()","cb96f11d":"Oversight()","cb9756ad":"buyClimateCoinsAgainstEther()","cb9854a2":"confirmSwap()","cb985708":"investorWalletAddress()","cb985dd1":"MARKET_SHARE()","cb990457":"holdersByIndices(uint256,uint256,bool)","cb99cbac":"startServer(uint256)","cb9a20d0":"MINI_GAME_ADD_TIME_DEFAULT()","cb9a3251":"finalizeMany(uint64[])","cb9a32a5":"promoMasterpiecesCreatedCount()","cb9a5edd":"availableLand()","cb9aac64":"usesLibrary()","cb9ae707":"latestDifficultyPeriodStarted()","cb9b3a3c":"getCCH_edit_4()","cb9bdf45":"tokenSoftcapIssued()","cb9c8505":"throwIfStartPastBlocktime()","cb9d6176":"LogDelete(address,uint256)","cb9d86e2":"BlockRefunded(address)","cb9dd1a0":"setMoving()","cb9e2755":"deleteEntity(uint256)","cba01a49":"LunarLink()","cba0e996":"isExcluded(address)","cba1fa10":"set_iconiq_presale_open(address,bool)","cba25e79":"presaleHardcap()","cba2c735":"createPurse(string)","cba456df":"casinoProxy(address,address,address)","cba4bc94":"_setHowManyOwnersDecide(uint256)","cba4f643":"changePreIcoRate(uint256)","cba50fd1":"generateUserRelation(address,uint256)","cba58ab6":"disableService()","cba59827":"Reject()","cba5b465":"endContract(address,uint256)","cba6582e":"Ellomiun()","cba66250":"FTV(address,address,address,address)","cba66e14":"sliceBytes20(bytes,uint256)","cba6a3a2":"setTransferAuthorized(address,address,uint256)","cba74da1":"getResource(bytes32,uint256,bytes32)","cba88872":"countdown()","cba8901b":"getPayoutKeys()","cba8be1c":"setServerAdmin(address)","cba91a35":"roundTwoTime()","cba9a794":"handleReturnBool()","cba9c0e0":"presale_start_block()","cbaa0b25":"playerAttack(uint256,uint256)","cbaa0bec":"amendSingleResult(int16,string)","cbaba70f":"EADC()","cbac21b8":"periodPreITO_mainCapInUSD()","cbac8816":"tokenRate20()","cbaca250":"RewardSplit(uint256)","cbacb269":"stopBonusCompaign()","cbacffe4":"addToPayeeBalance(address,uint256)","cbad3779":"getPublisherRegistry()","cbad60b6":"spread(uint8)","cbad7bf6":"cg(address,uint256,uint256,uint256)","cbaddbaa":"BurnMe()","cbae0163":"readPosition(uint256,int256)","cbae0978":"NewResolver(uint256,address)","cbae1467":"deleteAllAvatars()","cbaeadb4":"getRewardHistory(address)","cbaedd3c":"slashUsername(bytes)","cbaf4742":"OPERATE_SUPPLY()","cbaf5104":"_isClosed(bytes)","cbaf566d":"updateRentInfo(uint256,uint256,uint256)","cbafee8a":"tokensToMint()","cbb01884":"setDefault(uint8,address)","cbb04cbd":"debtPaid()","cbb05527":"totalCapInWei()","cbb0c95a":"getPlayerWithdrawEarning(uint256)","cbb105d6":"NewWorld()","cbb1d761":"confirmBySigner(bytes32,address)","cbb2fd5d":"TRTToken()","cbb31da9":"maker(address)","cbb433ea":"DeepToken()","cbb45120":"TOTAL_WINS()","cbb45444":"test_transfer_to_contract_without_fallback()","cbb50d30":"teamAllocationTokenSend(address,uint256)","cbb6e5c9":"transferTopLevelDomainOwnership(bytes32,address)","cbb70c92":"addLOC(address)","cbb8b158":"TESTH()","cbb9818c":"turn_flag_ON()","cbb9dbb9":"depositCoupon(address[2],uint256[8],uint8,bytes32[2])","cbba3f4b":"DCSToken()","cbbacd48":"cliffs(address)","cbbaed1b":"incentiveDistributionMaxRounds()","cbbb2698":"checkBlackAccount(address)","cbbc1bf3":"setCosignerAddressForUser(address)","cbbc8504":"GnosisTalk()","cbbc8a51":"setForeignDailyLimit(uint256)","cbbcdf77":"addCurrency(uint256)","cbbd809c":"approvedAddressInLUT(uint256)","cbbda00e":"Ptest()","cbbdca36":"Upgradable(address)","cbbe2199":"ActualTokenManager()","cbbe2569":"Bogocoin()","cbbe300b":"FooMintToken()","cbbe974b":"unlockUnixTime(address)","cbbea348":"getModeratorAtIndex(uint256)","cbbf879c":"getNumParentOperation(bytes32,uint8)","cbbf9420":"distributeVES(address[],uint256,uint256)","cbbfe168":"getOrder(uint256,address)","cbc066ab":"_transferOrderMoney(uint256,address)","cbc12d13":"maxRingSize()","cbc1cfd2":"emergency_withdraw()","cbc24224":"MuskToken()","cbc264f2":"nestedFirstAllToAll(uint256)","cbc265ac":"revealSeckey(bytes32)","cbc3b73e":"delegateHasValidSignature()","cbc3fb0d":"blind_sha256(string,address)","cbc44835":"PlateMate()","cbc469de":"STRToken()","cbc52ee4":"EtherIslands()","cbc598c5":"isAmountAllowed(address,uint256)","cbc61daf":"mintForMarket(address,uint256)","cbc69c8d":"SocialMediaToken()","cbc6c267":"ejenfwdToken()","cbc7755c":"registerNameXnameFromDapp(address,bytes32,bytes32,bool,uint8)","cbc7854e":"setTokens(address,address)","cbc846d9":"setBoosters(address)","cbc85c97":"getAllCardsClaimContender()","cbc8ae5f":"TOKEN_SUPPLY_ICO()","cbc9023c":"forceRoll()","cbc91e98":"sendTokensAfterBuyExp(address,uint256,uint256)","cbc9c89c":"Claim_TRAC_3800()","cbca02d3":"trasnferFromOwner(address,uint256)","cbcaacab":"checkTransferWithReference(address,uint256,string)","cbcabc13":"changeMdtTeamAddress(address)","cbcb3171":"tokenReserve()","cbcc65eb":"ACL_APP_ID()","cbccf9d6":"Simpletoken()","cbcd5dfe":"MintableMasterToken()","cbcdc2e4":"transferBalanceToOwner(uint256)","cbce2fcf":"setAmountBasedBonus(uint256[],uint256[],uint256[])","cbcf4d25":"icoAccounts(address)","cbcf8ece":"setAccountBonus(address,address,uint256)","cbcf98e6":"changeSecondaryWallet(address)","cbcffd2f":"ShowInfo(uint256,string)","cbd076f8":"depositForUser(address,uint256)","cbd07fd8":"paidDividends(address,uint32)","cbd08c8c":"config(uint256,uint256,uint256,uint256)","cbd1b782":"test_claimShare_notTranscoder()","cbd21f00":"JBartContract()","cbd243b4":"SetWhy(uint32)","cbd2ac68":"confirmWhitelistRemoval(bytes32)","cbd2bdfd":"getAllAuctions()","cbd2c73b":"signUserKeyChange(address)","cbd2ecd2":"transferAllowance(address,address,uint256)","cbd3b403":"getLuck(address)","cbd3faef":"amountOwedForApiForBuyer(uint256,address)","cbd49462":"_sender()","cbd5131b":"sponsoredBonusAmount()","cbd57134":"KTCToken()","cbd5bb2b":"setRound(uint8)","cbd6cc67":"SendDataToken(uint256,string,uint8,string)","cbd85c76":"bytesToBytes4(bytes,uint256)","cbd8877e":"stakeMinAge()","cbd8e690":"setTokenAmountPerHeritor(address,address,uint256)","cbd8ff79":"ContributionToPrizeFund()","cbd9597d":"GenChipLevel_Special(uint256,uint256,uint256)","cbd9d2e0":"InvalidCaller(address)","cbda1d85":"fundingGoalHardCap()","cbdb2469":"_getPetBonus1(uint256)","cbdb4f72":"GetClientBalance()","cbdc5aa4":"tokensTradeable()","cbdd3268":"genesisImportsComplete()","cbdd69b5":"tokensPerEth()","cbde2ff0":"isUnfreezed(uint256)","cbdf02fb":"rejectCertificate(address,address)","cbdf3878":"goldLevelBonusIsUsed()","cbdf8692":"Lockup()","cbe0a1aa":"totalEthCharityCollected()","cbe0e49a":"presaleGranteesMapKeys(uint256)","cbe211ec":"adPriceWeek()","cbe230c3":"isAllowedToken(address)","cbe239ed":"setIcoPaymentStatus(bool)","cbe23b94":"cards_start_total()","cbe29f34":"advisorsSupply()","cbe2e97e":"setGameStatus(bool)","cbe324d8":"_setSuggestedAdPrice(uint256,uint256)","cbe335c1":"verifyDocument(bytes32,bytes,uint16)","cbe37e25":"BYBToken()","cbe3a072":"add(uint32)","cbe3be97":"KeplerCoin()","cbe40622":"setup(address,address,uint256)","cbe432b0":"ico3Tokens()","cbe44fa2":"setWhitelisted(address,uint16)","cbe5404f":"setAccountFrozen(address,bool)","cbe56377":"amendLock(uint256,uint256)","cbe566de":"deleteCascade(uint256)","cbe7a150":"getCryptoMatch(uint256)","cbe7b838":"YunKaiCoin()","cbe8047e":"testValidation()","cbe8623f":"divUp(uint256,uint256)","cbe9ef39":"BasicCoin(uint256,address)","cbea4412":"getItemHolders(uint256)","cbeb5749":"ShoreCoin(uint256,string,uint8,string)","cbebc563":"computeTraitScore(uint256,uint256,uint256)","cbec09a7":"bonus01()","cbec455f":"continueCrowdsale()","cbec72f3":"ownerHasClaimedTokens()","cbec78b9":"requestPrice(string,string,int256)","cbed1568":"addAdminWhitelist(address)","cbedbf5a":"sendMoney()","cbeea68c":"permit(address,address,bytes32)","cbefe55c":"calcTokenRate()","cbf09802":"rateOf(address)","cbf0b0c0":"kill(address)","cbf0fa2d":"totalWageredForAddress(address)","cbf1304d":"balances(address,uint256)","cbf1382f":"founderStorageVault()","cbf1591d":"setDenyContract(bool)","cbf21837":"isSelling()","cbf26c0b":"DeviceOwner()","cbf2ad23":"confirmedBy()","cbf2b203":"Crowdsale(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)","cbf346cc":"_sellCrowd(uint256,address)","cbf4531d":"dividendsAmount(address)","cbf66a02":"withdrawRune()","cbf6fff9":"SALE_SUPPLY()","cbf7c9a7":"isUserKyc(address)","cbf7cc2e":"deployFinished()","cbf7f009":"FAPFounder()","cbf89ed8":"DividendDeposited(address,uint256,uint256,uint256,uint256)","cbf9051c":"setPublisherRewardPool(bytes32,uint256)","cbf93c9b":"_claimExploreItemUsingEMont(uint256,uint256)","cbf97572":"HipsterFarmer()","cbf9a125":"queryChibiAdd(uint256)","cbf9b6dd":"getRecorderAddress(uint32)","cbfa18ea":"contractRefundFinished()","cbfa3c9c":"scaling()","cbfba0e1":"withdrawFee(bytes8)","cbfc12ba":"Soniq()","cbfd14a2":"publicSaleSupply()","cbfd79e2":"AirdropFan()","cbfe6d41":"documentExists(bytes32)","cbfebb34":"setETHRate(uint256,uint256)","cbff17fa":"_setMinted(uint256,address)","cbff2cfc":"_getValueEther(uint256,uint256)","cbff69db":"contributionAt(uint256,uint256)","cbffb1ae":"updateConflictResolution(address)","cc00814d":"setPublicOfferLimit(uint256,uint256)","cc00ce12":"set_arbits_sale_open(bool)","cc01e39f":"availableAmountToCollect(uint256)","cc0238be":"getsumdata2(bytes32)","cc027cc9":"register(address,uint256,address,address)","cc02d73f":"setColorContract(address)","cc03477d":"nMsgsWaiting()","cc03c342":"setPlatformAddress(address)","cc05d836":"executeOrder(bool,address[3],uint256[4],uint256,uint8,bytes32,bytes32)","cc062b58":"enableSelling()","cc06c359":"maxLevel()","cc06f5ea":"getPeriodReceivedBalanceFor(uint256,address)","cc071051":"purchaseWolk()","cc075fa7":"stopTeamTrade()","cc07a94d":"_createMobster(string,address,uint256,uint256)","cc07dc37":"userReferralsWei(address,address)","cc08ebf6":"CryptoSportZ()","cc09c6b3":"OXO(uint256,string,string)","cc0a26d1":"CurrentMined()","cc0b2c9f":"tokenToOwner(uint256)","cc0b5a5f":"cancel(uint256,address,address)","cc0b94b7":"getChannelStatus(bytes32)","cc0b9dff":"addExitToQueue(uint256,address,address,uint256,uint256)","cc0bb8e5":"proof_of_public_key2()","cc0d0c90":"BlueTitaniumClassic()","cc0e13e2":"enableMaintenance()","cc0e1f66":"startOver()","cc0e24e1":"CheckDOT(bytes32)","cc0e97c9":"logicContract()","cc0f1786":"feeDecimals()","cc0f65f7":"GetMinerData(address)","cc10145f":"ownerWithdrawRune()","cc1027ea":"_validateReferrer(address)","cc105441":"MMOcoin()","cc10d53d":"IsPatient(address)","cc10e401":"create(string,bool)","cc11298e":"getRewards(uint256,uint256)","cc121ac1":"unsoldTokensVault()","cc129f4d":"radd(uint128,uint128)","cc130482":"SUNX()","cc131be1":"CreateNewDraw(uint256)","cc135555":"currentGene()","cc1423bf":"releaseBubToken()","cc143ce9":"NewXRateProvider(address,uint16,address)","cc147334":"payAllRewards()","cc148bf4":"awardBalanceOf(address,uint8)","cc14a7a3":"paidAddress()","cc151c82":"tokensToSellOnce()","cc15bee7":"isPurchasingPaused()","cc15c26c":"buyTokensReserve()","cc15d080":"getEmployeeInformation(uint256)","cc1602df":"lotteryCore()","cc16e6e1":"TOTAL_RESERVE_FUND()","cc16f5db":"Burn(address,uint256)","cc17aa28":"numAdoptedAxies(address,uint8,bool)","cc181ca8":"king()","cc189d00":"Vault(address,uint256)","cc198380":"totalSoldSlogns()","cc1b63d5":"setStakeStartTime(uint256)","cc1b8de6":"freedWosPoolToTeam()","cc1bc747":"deallocate(address,address)","cc1c0937":"NeuralToken()","cc1d050d":"startBlockProfit()","cc1d1e18":"_getCurrentTokenPrice()","cc1d4c02":"certified(address)","cc1ef080":"startPreSTOSale()","cc204cc2":"amountsWithdrew(address)","cc20d075":"getChannelId(address,address,uint8)","cc212a48":"disburseFunds(uint256)","cc21a9a2":"_weekFor(uint256)","cc21e972":"US_INSTITUTIONAL()","cc234ee1":"setICORunning(bool)","cc23a690":"releaseValue2()","cc23b75b":"HARD_CAP_IN_TOKEN()","cc242f40":"CardsRead()","cc24f571":"releaseTenPercent()","cc255b38":"testBazMethodId()","cc25decd":"SampleOffer(address,bytes,uint256,uint256,uint256,uint256,uint256)","cc268393":"setDescendant(address)","cc2761a4":"test_me(int256)","cc27f97b":"LSYP()","cc289fa9":"getPartnerAddressStatus(address)","cc293aea":"setRenewalsCreditAffiliatesFor(uint256)","cc2942da":"SetAElfCommunityMultisig(address,address)","cc29a0e6":"transferTTProduction(address,address,uint256)","cc2a9192":"LogWinnerPaid(address)","cc2aa2c7":"NAMINORI()","cc2b20ff":"refferBonusFunction(uint256)","cc2c2058":"addSpinner(string,uint256,address,uint256,uint8,uint8,uint8)","cc2c2bcf":"MotionFactory(string,string,string)","cc2c5453":"add_sword(uint16)","cc2dcd7e":"removeSideService(address,uint256)","cc2e08ea":"getRecTransactionData(uint256)","cc2e15cc":"getSponsorableJobs(address)","cc2eacb1":"setReferralPercent(uint16)","cc2f5029":"updateNoteMetadata(uint64,uint16)","cc2f5186":"Balances(address,address,address)","cc2fd120":"unofficialUserSignUp(string)","cc304924":"DocumentAdded(uint256,string,uint256)","cc305ae6":"userAssignElement(uint256,uint256,address)","cc308a54":"whitelistStartBlock()","cc3154f8":"attendeesList()","cc326e1c":"currentPhaseRate()","cc328f2f":"b531647b()","cc32f8ad":"transferMoneyForTaskSolutions(string,uint256)","cc33ad3d":"DSP(uint256,string,string)","cc33c875":"tokenInfo(uint256)","cc341430":"coordinatorAgreeForEmission(address)","cc342eba":"RoseToken()","cc3451d6":"MultiverseToken()","cc3471af":"maxClaimBlock()","cc348429":"Ethmall(address,address,address,uint256,uint256,uint256)","cc34a247":"icoEndTimestampStage1()","cc34f810":"AllstocksToken()","cc361cc4":"getTotalBonusPerShare()","cc364f48":"getRange(uint256)","cc36809f":"fee_msg()","cc36a328":"team0Query()","cc36f8eb":"ArtCoin()","cc373d79":"withdrawCommissions(uint256)","cc38639f":"newTuneOption(uint32,uint32,uint256,bool,bool,uint128,uint64)","cc38c8a0":"insuranceAccount()","cc3938f9":"chkLockedA(address,uint256)","cc397ed3":"getCurrentFor(address)","cc3a0c8d":"customerExchangeEther(uint256,address,string)","cc3ad9a1":"unPackParams(uint256)","cc3b8806":"getCertificateMetaDataCount(bytes32,bytes32,bytes32)","cc3bb31a":"crowdsaleStart()","cc3bde3d":"TOTAL_SUPPLY_LIMIT()","cc3bf9e9":"redeem(bytes32,address)","cc3c2c01":"getValidityBondFloor()","cc3c59cc":"Paymec()","cc3c7098":"createTokenToMarket2021()","cc3c74a1":"proposalNonce()","cc3ccf57":"previous_owner()","cc3d2721":"minWithdraw()","cc3d574b":"ElectedBoardController(address,address[],uint256,address)","cc3d967b":"getUserDetails(address)","cc3df01f":"issueToken(uint256)","cc3e378e":"hasEnoughFundsToStart()","cc3eacbb":"getOraclizeFee()","cc3efd6b":"PUKCoin()","cc3f44bf":"getGoldStatusMinted(address)","cc3f51d0":"hitPotProcess(string,bool,uint256)","cc3fa0fd":"NobleAssetsCoin(uint256,string,string)","cc3fdd4c":"buyFeePercent()","cc41a396":"rateStage3()","cc41d3b2":"refundPreIco()","cc422cc2":"coeRemainingAtCurrentRate()","cc423c28":"setSchellingExpansion(uint256,uint256)","cc42e83a":"withdrawWinnings()","cc436196":"initialFundsReleaseDenominator()","cc436e42":"memberIsActive(uint8)","cc442c3f":"ICO_PRICE4()","cc445611":"purchase(bytes32)","cc44b15b":"setCode(address,bytes32,uint256)","cc44fd2b":"changeManagement(address)","cc451581":"getCurrentBigPromoBonus()","cc4580c8":"getBetsLength()","cc459696":"contentCount()","cc466256":"_roll(address,uint256,uint256,bytes32,bytes32,bytes,bytes32,uint256)","cc4720c7":"calculateRewardTokens(uint256,uint8)","cc47a40b":"reserve(address,uint256)","cc47de73":"ExpandT()","cc490e64":"getSplitCount()","cc494291":"setJobController(address)","cc4999ea":"getTradingInfo(uint256)","cc49ede7":"getVesting(address)","cc4aa005":"getDestroySharesOwnerValue()","cc4aa204":"ERC20()","cc4b998a":"titleIds()","cc4bf6a3":"miningTen()","cc4c1c05":"SwytchToken()","cc4cc05f":"collectToken()","cc4d233c":"Reclaimed()","cc4d819c":"tokensPurchased()","cc4da8f4":"EventWinReward(address,uint256)","cc4e0008":"Ticket(address)","cc4fa81b":"exchangeCalculator(uint256,uint256,uint256)","cc4fbc43":"acceptTokenPayment(address,uint256,address,uint256)","cc5061da":"voteForUser(uint16,address)","cc50dacb":"buyCar(uint32)","cc50fc28":"mintInternal(int256,address,uint256)","cc537821":"buyNextRank()","cc539eb1":"replaceAccount(address,address)","cc552c8e":"setHardCapUSD(uint256)","cc5530eb":"endPreSaleStage()","cc577f38":"addPresaleAmount(address,uint256)","cc57e4f8":"increasePregnantCounter()","cc58bcf8":"getCurrentLevel(uint256,uint256,uint256)","cc5a7051":"_setMinDailyPerUser(uint256)","cc5a7804":"payoutTokens(address,uint256,uint256)","cc5aba27":"ConstructorTest(uint256,uint256,string,string)","cc5b13a0":"PAYOUT_DELAY_INTERVAL()","cc5b2292":"DepositForDividends(uint256)","cc5b542e":"toBeDistributed()","cc5c095c":"mintableSupply()","cc5c4224":"setFreezingManager(address)","cc5c4a6b":"attachPresale(address,address)","cc5cab33":"userRewarders(address,uint32)","cc5cee0a":"calculateEthereumReceived(uint256,uint256)","cc5f09fb":"getNbCitizensLocation(string)","cc5fc0d7":"updateInvestBalance()","cc603ed5":"collectRate(address)","cc61d0cb":"changeMinWithdraw(uint256)","cc620704":"joinToTrack(bytes32)","cc6266a1":"getHashFromData(bytes32,bytes32)","cc6305ed":"getNumTicketsPurchased(uint256,address,address)","cc634dac":"get_kek()","cc63604a":"canExecute(uint256)","cc638e03":"rublaJEPoken()","cc63996e":"getHairValue(uint256)","cc63a3c9":"set_token(address)","cc642cc2":"numHolders()","cc64cfcb":"getDeployedMarriages()","cc64e2d5":"depositEthers(address)","cc657697":"GetMatchLength()","cc657e62":"sendToken(uint256,uint256)","cc668524":"verifyPosition(uint8,uint64,uint64,uint64)","cc66d3c7":"buyEngineer(uint256[8])","cc66ec47":"TerraformReserve(address)","cc677679":"setEMAPeriods(uint256)","cc679ffc":"TUPC()","cc67b1bf":"getTransferPerc()","cc69084f":"PHASE_CLOSED()","cc691763":"draw(uint32,uint8,bytes32)","cc6c010d":"ATMGold(uint256,string,uint8,string)","cc6c8e31":"NFXCoinToken()","cc6ca7b7":"specialBaseLayer(uint256)","cc6cf340":"BERTCLUBCOIN()","cc6d7850":"burnILF(address,uint256)","cc6d8ba6":"inheritInvestorPosition(uint256)","cc6da375":"recipientVIP(address)","cc6db55f":"setJackpotModulo(uint256)","cc6e15e5":"setDelayedTokenAllocator(address)","cc6e6f25":"Withdraw_5()","cc6e70e8":"MSTCOIN()","cc6e8593":"lawSupportProfitAddress()","cc6ec39a":"switchToGame(string)","cc6eced7":"priceOfTeam(uint256)","cc6f0ed0":"BirthdayCandy()","cc70993d":"earlyTimeLock()","cc70bb1a":"publish(string,string,string,address)","cc70decb":"showBonus(address)","cc7188a5":"unLinkFromMasterWallet(address)","cc724b27":"isTesting()","cc72c918":"queryOwnerAddr()","cc72ecb0":"purchaseStartBlock()","cc741c9c":"getDidClaimBooty(address,uint256)","cc743a86":"ICO_PROMO_REWARDS()","cc74e2ca":"min_refund_block()","cc750395":"setMonthOpen(uint256,uint256,uint8,uint256,uint256)","cc754a28":"ICOStartTimeChanged(uint256)","cc755b70":"releaseFrozenBalance()","cc759458":"unconfirm(address)","cc759f88":"removeBools(bytes32[])","cc75ac19":"_withdrawAffVault(uint256)","cc75c4b1":"abc(uint256)","cc75cc9b":"SendmoneyCall(uint256)","cc764986":"updateEmaDailyYield(uint256)","cc774681":"mapCompletionNumberForWithdraw(address)","cc77b82d":"BEEFYToken()","cc783c5e":"setBankrollerContractOnce(address)","cc78cc98":"multisigPreICO()","cc7949ae":"round_count()","cc797d8e":"setMaxAttackPrizePercent(uint256)","cc798890":"queryAccounts()","cc79aa04":"getProposal(bytes32,bytes32)","cc79eaf0":"getColors(uint32)","cc7a060f":"ethersCollecteds()","cc7a2049":"permissionManager()","cc7b2ee7":"initAirdropAndEarlyAlloc()","cc7b41ec":"changeRollUnder(uint256)","cc7b60fe":"_emitWorkFinished(uint256,uint256)","cc7c4c39":"gotWinner()","cc7cd9f8":"fundingEthGoal()","cc7cddb8":"dive3(address)","cc7d1a0f":"currentHighestBid()","cc7e1b9a":"setRedemptionAddress(address)","cc7e2208":"Order()","cc7e492e":"refillInstantMintPool()","cc7e930c":"commitmentsOf(address,address)","cc7f365c":"VLADALINA()","cc7f593c":"setRequiredMajority(uint256)","cc7f608d":"setSaleType(uint8,uint8,uint32,uint256,uint256)","cc7f8266":"read_i8_array()","cc7fa928":"nbMonthsPay()","cc7fe38c":"addPresaleInvestor(address,uint256,uint256)","cc80f6f3":"show()","cc80f9e8":"ownerOfID(uint256)","cc81dbb5":"DEFROST_FACTOR_TEAMANDADV()","cc822f54":"changeYDistAddress(address)","cc826160":"ownershipDistributed()","cc82e72e":"SetPlatformInformation(string)","cc833e69":"Cryptonationz(string,string,uint8,address,address,address,address,address)","cc851cac":"SecuritiesVaultBank()","cc863948":"withdrawTokenShare()","cc86566c":"tempMngr()","cc8658b3":"chkStaff(address,address)","cc865b71":"withdrawRoundController(uint256,address)","cc872b66":"issue(uint256)","cc876ded":"born(uint256,uint256)","cc87ed82":"checkNumCards(uint256,uint8,uint8,bytes32,bytes32)","cc8818f6":"setReservefund(uint256)","cc88be52":"NuoBaoChainToken(uint256,string,uint8,string)","cc891023":"depositLock(address)","cc896494":"_setGameOver()","cc89698c":"getTopicCount()","cc897e40":"END_SKO1_UNITS()","cc89d596":"getCryptantFragments(address)","cc89e8bc":"ecosystemTokens()","cc8a86a0":"Y2_release()","cc8af0fe":"bytesToUInt(bytes,bytes)","cc8b34ab":"CrowdCoin()","cc8b96e5":"prepare(uint256,address,address)","cc8baf63":"m_tokenDistributor()","cc8bd060":"setUnitsOneEthCanBuy(uint256)","cc8c0f9f":"transferLocked(address,uint256,uint8)","cc8c3c45":"getTokenIdsLength()","cc8c49aa":"sc(uint256,uint256,uint256,uint256,uint256)","cc8cd5c5":"withdrawDragonsFilm()","cc8ce27e":"CryptoChamps()","cc8ce862":"allowedGasPrice()","cc8e4bc2":"LOCKAMOUNT3()","cc8eb425":"newuser(address,address)","cc8f0b48":"withdraw(bytes32,address,uint8,bytes32,bytes32)","cc90050e":"GetCurrentRoomAndRound(address)","cc9062f9":"finalizeTransferChildrenOwnership()","cc90da29":"bonusNum()","cc90e725":"addProject(string,address)","cc91e91c":"Freezable()","cc925957":"logAccess(string,string,uint256)","cc92bad4":"updateParkingRate(uint256)","cc92ebad":"createCrowdsale(uint256,uint256,uint256,uint256,address,address,address)","cc937ccd":"Doves()","cc93ee70":"forwardCoins(uint256)","cc93f66e":"endTournament(uint256,uint256)","cc9415d0":"commitOn(uint256)","cc9425b7":"OCTACryptoToken()","cc949797":"balanceAffiliateOf(address)","cc94d923":"createTransaction(address,uint256,bytes32,address,address,address)","cc94e4a2":"set_sale_address(address,address)","cc954820":"changeFallbackDeposit(uint256)","cc95d8d1":"s36(bytes1)","cc96019f":"referralTokenWallet()","cc96b943":"offerOptionsToEmployee(address,uint32,uint32,uint32,bool)","cc976620":"usdPerEthCoinmarketcapRate()","cc97b38f":"BANCOR_X_UPGRADER()","cc97edbf":"bmi()","cc98c893":"developer_Transfer_ownership(address)","cc98ff20":"purchaseVillage(uint256)","cc991d8a":"BTestToken(uint256,string,uint8,string)","cc996d1b":"bids()","cc9a31a7":"isRepresentor(address)","cc9a88c9":"canSend(uint32,uint32,int256)","cc9ab267":"voteForCandidate(bytes32)","cc9ac376":"addLock(address,uint256,uint256)","cc9ae3f6":"getMyReward()","cc9b31c9":"exchangeFeeIncurred(uint256)","cc9b714c":"ClearAuth(address)","cc9b71c2":"TaskCoin()","cc9b7826":"setGuaranteedAddress(address,uint256)","cc9ba6b2":"buyRef()","cc9c0936":"startedWorkTS()","cc9c437c":"get_orderAddress(address,uint256,uint256,uint256,uint256)","cc9d7519":"getTierInfo(uint256)","cc9d858d":"FundsRegistryTestHelper(address[],uint256,address)","cc9de25d":"bytesToUint256(bytes)","cc9e735f":"decrementDate()","cc9f28ea":"getDeletedTeams()","cc9fd9d9":"onSetCredit(address,uint256)","cca07f44":"setSpecialLimits(address,uint256,uint256)","cca08d55":"updatesolsforhire()","cca0feb6":"updateTax(uint256)","cca10ba5":"getMultiSigBalance()","cca213a1":"setTranchTime(uint256[])","cca2194c":"getInvestorContribution(address)","cca26917":"getRoundBalance(address,address,uint256)","cca3e832":"_balanceOf(address)","cca40111":"_recharge(address,uint256)","cca41651":"addressPrivateSale()","cca470d2":"roundInvestorInfoByAddress(uint32,uint32,address)","cca4f3c5":"winthdraw(address,address,uint256)","cca5020b":"totalLBSold_PRIVATE()","cca5dcb6":"isTransferEnabled()","cca63f4f":"buyXname(uint256,uint256,string)","cca6ae0b":"getGPSMinEth()","cca746df":"getAnnualFee()","cca78d53":"getActiveListLength()","cca794da":"setGzeBonusOnList(uint256)","cca91579":"PlaceHolder(address)","cca97025":"_performTransferFromWithReference(address,address,uint256,string,address)","cca9943c":"wei25()","ccaa5135":"LIFECOIN()","ccaa5c65":"LomeliToken()","ccaab1ca":"companyPercent()","ccaaef45":"purchaseCompanyAdv(uint256,string,string)","ccab1be7":"SubmissionAccepted(address)","ccab841b":"divf(int256,int256,uint256)","ccabcfca":"XMLYBadge()","ccac77f5":"GooLaunchPromotion()","ccad19e4":"sendEtherFromAddContract(address)","ccadd6b1":"bet1Of(uint256)","ccadef15":"_setOCPTokenContract(address)","ccae794a":"showFPCount()","ccaee929":"JihoyContract()","ccaf4b03":"setIreg(uint256)","ccb00344":"changeEtsAddress(address)","ccb07cef":"crowdsaleClosed()","ccb0893d":"isUIntPrivate()","ccb13cbd":"_acceptAnchorAdmin()","ccb1c0a1":"getQuestion(string)","ccb1cbbc":"testFailBurnNoAuth()","ccb20e8e":"StormBrewCoin()","ccb22e37":"description3()","ccb2e9a4":"insertAccount(bytes32,string,uint256,string,string)","ccb3449e":"NewPresaleAllocation(address,uint256)","ccb50a29":"SIGMA_MAX_CARGO()","ccb53365":"startICOPhase()","ccb60e39":"rentOutMultiple(address,uint256,uint256[])","ccb61dad":"MICRO_DOLLARS_PER_BNTY_MAINSALE()","ccb64997":"isBCDCToken()","ccb6cbe8":"icoBottomIntegerPrice()","ccb767ae":"transferTo(address,uint32)","ccb783a9":"setGPSStartTime(uint16,uint8,uint8,uint8,uint8,uint8)","ccb98ffc":"setEndTime(uint256)","ccbac9f5":"randomNumber()","ccbae5f6":"createEscrow(address,address,uint256,uint256)","ccbb41d0":"TOC()","ccbb52f5":"getGroupRates(uint256)","ccbba441":"setMigrateStage()","ccbd5152":"bankrollBeneficiaryAmount()","ccbd8d25":"setDropAmount(uint256)","ccbd8d29":"tokenAvatar()","ccbda1af":"getChannelByName(string)","ccbde432":"delete_candidate(uint8)","ccbe2a68":"kill(uint8[176],uint8)","ccbe4968":"Withdawal(address,uint256)","ccbfc6ed":"revokeSignature(bytes)","ccc08913":"Restricted()","ccc08974":"setGameActive(bool)","ccc108d7":"reopen()","ccc11f11":"hasAssetRights(address,bytes32)","ccc13814":"max(int256[])","ccc39b5d":"DonationClaimed(address[2],uint256[8],uint8,bytes32[2],uint256,uint256)","ccc51afb":"lookupFillingRing(address,uint256)","ccc54d69":"LOCKUP_3M_ICO_TIMESTAMP()","ccc55189":"Nation(address,address)","ccc5d05f":"testNoTokensNoCalls()","ccc61bef":"REWARD_WIN_MULTIPLE_PER()","ccc62bbe":"assertEq2(bytes2,bytes2,bytes32)","ccc643d7":"updateSaleTime(uint256,uint256)","ccc6ddf3":"createPromoPow(address,string,uint256,uint256,uint256,uint256)","ccc72302":"AUDITED_AND_REJECTED()","ccc8b33c":"buyXnameQR(address)","ccc924ef":"TokensUndelegated(address,uint256,address)","ccc9735d":"ERCSpammer(uint256,uint256,string,string)","ccc98790":"w(uint256)","ccca123b":"waitTime()","ccca237c":"foundationAsset()","cccb987f":"withdrawTwice()","cccc020f":"changeInsuranceFeesOperation()","cccc8f91":"getDappId()","ccccc36b":"createAcceptAndAdditionalsFromBytes(bytes,bytes,bytes,uint256[])","cccd2ea8":"getProductData(address)","ccce413b":"symbols(uint256)","ccce6458":"createKingdom(string,string,uint256,bool)","ccceee48":"lastBlock_v1Hash_uint256()","cccf3a94":"gasForCLOUD()","cccf7a8e":"has(uint256)","ccd15921":"addTransferAndCallWhitelist(address)","ccd1a621":"addguess(uint256)","ccd30a62":"getWhitelistedAddresses(uint256)","ccd331bf":"bountyAmount()","ccd385f5":"staff_3()","ccd3948b":"removeRestaurant(address)","ccd39537":"dilute(address,uint256)","ccd4020c":"PassTokenReborn(address)","ccd46ae4":"BuyTicketUseVault(uint256,uint256)","ccd65296":"initialize(uint256,uint256,uint256,uint256,address)","ccd6559b":"newRandom(string)","ccd65c0a":"activateMainSale()","ccd68f3b":"stamps(uint256)","ccd6aca4":"preSaleSecondCap()","ccd71e8c":"armySubmarinesCount(uint256)","ccd75361":"setFooInt(uint256)","ccd89ecd":"calculateManyHash(address,address[],uint256[],uint256,uint256)","ccd8ad0c":"setGenTime(uint256)","ccd8c186":"DebitCoinTokenGenesis(address)","ccd8e2cf":"AnmiToken()","ccd8ead7":"addToCategorie2(address,address)","ccd93998":"getRequiredSignatures()","ccd95a50":"sendTokenToMultiAddr(address[],uint256[])","ccd96ab0":"cite(bytes32,string)","ccd9aa68":"passedKYC(address)","ccd9d08f":"MLIOU()","ccda4b99":"getMethodValue(string)","ccda696b":"ownersTransfer(address,uint256)","ccdaeab0":"getTechBonus3(uint256)","ccdb05d4":"NokuCustomERC20(string,string,uint8,address,address)","ccdb3f45":"newAddress()","ccdbbff5":"securityTokensWallet()","ccdc535e":"placeBetV1(uint256,uint256,uint256)","ccdd1979":"multisend(address,address[],uint256)","ccdd49f2":"StyToken(address,address)","ccdd95d6":"releaseEnjinTeamTokens()","ccdf68f3":"isOutcomeSet()","ccdfcfa4":"returnFundsForAll()","cce0244d":"setSafeContract(address,bool)","cce0a1ca":"isPresaleSetup()","cce0c0fa":"addOneGame(string,uint256)","cce0cd0c":"blockVersion()","cce106f8":"AmountToLittle()","cce1dfd2":"minimum_token_sell()","cce21eda":"DividendsWithdrawal(uint256,address,uint256,uint256,uint256,uint256)","cce2270a":"isSecondStageFinalized()","cce2771e":"redeemUTXO(bytes32,uint8,uint256,bytes,bytes,bool,uint8,bytes32,bytes32)","cce29ea7":"preSaleEndTime()","cce2f8e3":"checkAddressMisused(address)","cce356b5":"getHodlers()","cce3906b":"hasWithdrawnRake()","cce48e65":"GeeTestCoin()","cce4bd52":"reclaimFunds()","cce7db58":"swipe(address)","cce7ec13":"buy(address,uint256)","cce81927":"EtherDice(address,address)","cce91957":"take(bytes)","cce93ae1":"PeriodChanged(uint256,uint256)","cceb6368":"receiveTicket(address)","cceb9214":"setAuctionStatus(bytes32,uint8)","ccebca11":"Foo(address,bytes32,address)","ccec1461":"bulkEtherSender(address[],uint256[])","ccecc71f":"getPlayerPoints(bytes32)","cced2bb6":"LogOwnerRemoved(address)","cced9b63":"setBestMatch(uint256,uint256,address)","cceda56c":"CAPPED_SUPPLY()","ccedf3d2":"getChainCode(string)","ccee31e8":"setNbKingdomsType(uint256,address,bool)","ccee8047":"settleCall(uint256,uint256,address)","ccef6d63":"_isClientPaidUp(address)","ccf053ba":"TOTAL_TOKEN_SUPPLY()","ccf06abf":"canCompose(string,uint256[],address)","ccf0768a":"transferDividends(address)","ccf12304":"set_mint(uint256)","ccf1454a":"addressOf(string)","ccf1ab9b":"usurpation()","ccf1e80b":"JUNE()","ccf20872":"ChainKey(uint256,string,string)","ccf24838":"updateOwner(uint256,address,address)","ccf27a4e":"setPrice2(uint256)","ccf2b87b":"sendWithFreeze(address,address,uint256,uint256)","ccf41499":"TokenFactory(uint256,string,uint8,string)","ccf4a941":"getVendorApplication(string)","ccf4b70a":"RATE1()","ccf4f413":"setSubRegistrar(string,address)","ccf53a84":"getFile(uint8)","ccf5401e":"checkQuest(address)","ccf5c5cf":"registerConsumer(address,uint32)","ccf64316":"playerRollDiceSingle(uint256)","ccf670f8":"setLevelUpFee(uint256)","ccf69e9b":"randomContract()","ccf6b8b3":"CCCoinToken(string,string,uint256,uint256,address,address,address,address,uint256)","ccf7ba0f":"recoverPrice(address,address)","ccf7d0d4":"sendTokensAfterCrowdsale()","ccf7fe56":"JustinCoin()","ccf82afd":"WataexToken()","ccf8bcf3":"transferOVISBookedTokens()","ccf8e5d0":"CLITOKEN()","ccf8ef24":"undelegateVote()","ccf9f35f":"awardsCount()","ccfa8e71":"addBank(string,address,string)","ccfaa72f":"setRentalPricePerHour(uint256)","ccfbdb9e":"CrowdSaleDapCar()","ccfc0053":"withdrawMILs(uint256)","ccfc1e4e":"preSaleWeiCap()","ccfc811b":"registerParticipant()","ccfc8729":"registerWithToken(address,uint256,address)","ccfc9556":"USDChain(uint256,string,uint8,string)","ccfcbdbe":"canMakerTerminate(bytes32)","ccfdca9a":"setMinPaymentAmount(uint256)","ccfe4691":"CtfToken()","ccfed305":"CMDToken()","ccff361f":"AibitbankToken()","ccff42b2":"isValidAdapter(address)","cd008f1a":"getMine()","cd00ee0d":"startToken()","cd027be5":"getAllowAmount(address)","cd034234":"refundRequest()","cd0389fd":"metadataToken()","cd03b093":"getSupportersForTopic(string)","cd041ae9":"removeCooldown()","cd048de6":"setWord(string)","cd04ccfc":"newProposalEthUSDOracle()","cd05c214":"TOKEN_FOURTH_PRICE_RATE()","cd05d1eb":"shopPants()","cd062734":"getCallABISignature(bytes32)","cd0643ee":"takeInvestments()","cd066fd6":"computeInitialPrice(uint256)","cd0699e9":"OysterPrePearl()","cd06a7bf":"rewardsupply()","cd076620":"mint(address,uint256,int16,int16,int16,int16,int16,int16,uint256)","cd0845fd":"bool2str(bool)","cd09039b":"PayForFlag(string)","cd09263f":"rate_toCap()","cd0a314b":"walletBalance()","cd0c5896":"etherBalance(address)","cd0c870d":"XAP()","cd0e761d":"getCurrentContextAddress()","cd0e8900":"DEFACTO()","cd0ee59b":"_payByErc20(uint256)","cd0f26c6":"setRedemptionContract(address,address)","cd0f5abd":"DTCC()","cd0fdc24":"getPaintingArtistId(uint256)","cd0ffdba":"NukTestToken()","cd103b4d":"RateToken(uint256)","cd11731d":"setPlayerBookAddress(address)","cd11c85d":"timeTillNextAttack()","cd12efc8":"getsecond(uint256[])","cd132aad":"addPrivateSale(uint256)","cd133c8f":"buyXid(uint256)","cd13592a":"claimTokensByUser()","cd152c0a":"getPreAuthorizedAmount(address)","cd154c59":"mainSaleExchangeRate()","cd15c6ab":"MANACrowdsale(uint256,uint256,uint256,uint256,uint256,address)","cd15fc71":"ContractFeatures()","cd16ecbf":"setNum(uint256)","cd17c4b6":"numOfTokens()","cd180fdc":"transferTokensFromAdvisorsAddress(address,uint256)","cd1814d7":"selfDestroyTime()","cd187043":"_price_token_ICO1()","cd18c168":"TakeEth(address,uint256)","cd18d5a4":"airDrop(address)","cd197ff6":"fechVoteInfoForVoter(address)","cd1a4e4d":"setHyperDisbursementAddress(address)","cd1a5cad":"PricingStrategy(uint256,uint256,uint256,uint256,uint256,uint256)","cd1a8ad7":"EGGS_TO_HATCH_1SNAKE()","cd1b9311":"challenge(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])","cd1ce6d5":"setAdvisorFee(uint256)","cd1dc527":"isTokenAddressAlreadyInList(address)","cd1e0355":"totalRefundedAmount()","cd1e0717":"getRequester()","cd1e484b":"reserveStarsForOwner(uint256)","cd1f63dc":"getMinBuy(uint256,uint256)","cd1f8393":"logsCount()","cd1f9a57":"totalContractHolders()","cd1fca94":"BETNetworkTeamAddress()","cd1fdc14":"_claimReward20(address,string)","cd2057d0":"fail(bytes)","cd20b24b":"saosao5()","cd22ccea":"GameRoll(address,uint256,uint8,uint8,uint256)","cd22f418":"_getAllRevisionTimestamps(bytes32)","cd22f536":"addProductByRegulator(string,uint256,string,string,string,string)","cd230ebd":"tokensClaimableAfter()","cd233e25":"oraclize_gaslimit()","cd257213":"RemoveTickets(uint256)","cd25f56e":"OptionExercise(address,uint256)","cd26e1a8":"SECURITY_ETHER_CAP()","cd271488":"newSaleProjects(string,string,string,uint256)","cd277e6c":"addSolution(bytes32,address,uint32)","cd27d1a0":"setMaxRaiseAmount(uint256)","cd27f1d9":"cappedTokenSupply()","cd29c71a":"metadataUrl()","cd2a0c29":"purchase_with_eth(uint256,address,uint256,uint256,uint256,address,bytes)","cd2a11be":"EnableTrade(bool)","cd2a68e5":"withdrawBillionsCoins()","cd2a7a61":"broadcastState(bytes)","cd2ab49e":"setupBankrollInterface(address)","cd2b5a82":"weiToDistribute()","cd2cdd5b":"claimOwnershi()","cd2cde48":"authorizeIcoBurn()","cd2d5291":"walletAdvisor()","cd2d8a2d":"historyId()","cd2ec3fe":"runAnnualInflation()","cd2f0710":"getItemById(uint256)","cd2f5f2b":"clearFooArray()","cd2f7357":"tokenTransfer(address,uint256,uint256)","cd2f7c1a":"Census()","cd306137":"initialiseGlobals()","cd31037c":"BlockScheduler(address,address,address)","cd313ad9":"listOfFunds(uint256)","cd31f391":"SixtyPercentRules(address)","cd3265a3":"setUpgradeTarget(address)","cd327398":"addExceptions(address[])","cd3293de":"reserve()","cd336707":"reopenContributions()","cd342917":"Lesson(address,uint256)","cd35c5e9":"Eurotrad()","cd3651a7":"setLevelBonusJPYC(uint256,uint256,uint256,uint256)","cd367936":"fundICO(address)","cd37dcb8":"peCap()","cd3882d5":"stage4()","cd38aa87":"chooseWinner()","cd394a41":"ETH10K()","cd395a96":"_transferAndLock(address,address,uint256,uint256)","cd3a1dde":"MaxAirDropXblock()","cd3a376a":"changeSeller(address)","cd3a7531":"loadVotesForParticipantVerify(bytes32,bytes32,uint8)","cd3b0309":"CTokenCoin()","cd3c3011":"getPublishTime(bytes32)","cd3ce306":"redeemEther(bytes32,address)","cd3de8d5":"payToController()","cd3e0155":"BucketDestroyed(bytes32,uint256)","cd3e45c5":"getTop10Messages()","cd3f7a50":"DepositMTU(uint256)","cd3fe21d":"getTotalNumberPlayed(uint256,uint256)","cd40137f":"resetTimeSeal()","cd402189":"list_files()","cd402c8e":"payoutSize(address)","cd40a48d":"send1Mil(address)","cd41ada1":"addressDividendReserve()","cd4217c1":"freezeOf(address)","cd423c99":"getDistributedOreBalances(address)","cd42693d":"victorieumToken()","cd43def3":"updateServiceTokensPerCredit(address,uint32,uint256)","cd43ebf9":"totalSpankStaked()","cd43ee99":"isAffiliateProgram()","cd45376c":"sellWine(uint256)","cd45e561":"CHSToken()","cd45fcdb":"Fxxk2Token()","cd46abe4":"ecosystemPercentOfTotal()","cd46d7e5":"approveByIndex(uint256)","cd474b04":"chainStartBlockNumber()","cd47c0e1":"cooRemoveReviewer(address)","cd47f390":"rescueLostKydy(uint256,address)","cd482d9f":"getLLV_edit_2()","cd48578f":"MaxEth()","cd495391":"setNonlistedUser(address)","cd496e35":"votePositionOf(uint256,uint256)","cd497999":"isHardCapGoalReached()","cd499523":"userList(address,uint256)","cd4aed30":"errorWithMessage()","cd4b3c57":"newSubdomain(string,string,address,address)","cd4b6914":"getRandom(uint256)","cd4c04c6":"Appoint(uint256,address)","cd4c4c0c":"getCurrentBucket()","cd4d0570":"getbuynode(address)","cd4d1664":"EconomyRebated(string,string,string,string,string)","cd4d4b46":"BONUS_CAP()","cd4d6895":"verifyEIP20(address)","cd4e28b5":"setNextBidExpireBlockLength(uint256)","cd4e396b":"USER_ACQUISITION()","cd4f5e90":"MTToken()","cd4fb3be":"newBurnableOpenPayment(address,string,uint256,uint8,uint256)","cd501bf7":"SignalsCrowdsale(address,address,address,address)","cd503c0b":"claimFees(bytes4)","cd50d44f":"CheckRepresentment()","cd51bcae":"setBuyRequestLimit(uint256)","cd51f084":"owner_freeze_term()","cd5286d0":"getAsset(string)","cd53a3b7":"makerWithdrawAsset(uint256)","cd53ac45":"MANHATTANPROXYFDR()","cd53e455":"receivedEther()","cd5406e4":"getBalanceAtSnapshot(address)","cd54c54e":"setCirculationCap(address,uint256)","cd550cc8":"XferMoneyTeamAddress()","cd55205b":"KotET()","cd559561":"getPeers()","cd55cda2":"determineFinalOutcome(uint256)","cd56028f":"ArjToken()","cd560862":"EZ25COIN()","cd5617b6":"STCDR()","cd5655da":"setPixelBlock(uint256[],uint256[],uint256[],uint256[])","cd565bc5":"determineAffID(uint256,uint256)","cd5681d5":"mintRefs(bytes32)","cd568d0f":"submit(string,int8,int8,int16,string)","cd56f019":"getDefaultClaim(address)","cd572a07":"BOF()","cd575c32":"mintGem(uint256,string,uint256,bool,uint256)","cd576dd0":"IPAC()","cd5777e2":"allocateTokensToInvestors(address,uint256)","cd57a448":"SwapContract(address,uint256)","cd57a650":"BasilNetwork()","cd584045":"enableApproval()","cd586a50":"OnliCoinToken()","cd58a867":"internalAssignTokens(address,uint256,uint256,uint256,uint256)","cd58e75b":"newBurnableOpenPayment(address,uint256,uint8,uint256,string)","cd591822":"CanaryV7Fast()","cd59bf5b":"getNowFromOwner()","cd5a489d":"killContract(bool)","cd5a57cb":"registerOpinion(uint256,string)","cd5a9bf3":"isCurrentOrPastAccountMinter(address)","cd5ab612":"buyEmptyPixelArea(uint256,uint256,uint256,uint256)","cd5acd4d":"setKey(bytes32,bytes32,bytes)","cd5b4ae0":"zHQPreSale()","cd5b8837":"distributeGREEN(address[],uint256,uint256)","cd5ba752":"firstPlacePot()","cd5ba978":"presale_end_block()","cd5bfb63":"tokenIdOf(bytes32)","cd5bfbe4":"initialVestAmount()","cd5c222f":"msgMap(uint256)","cd5c4c70":"deleteOwner(address)","cd5d6c2b":"betInfoIsLocked()","cd5d950f":"TaxiToken()","cd5dba1e":"WhiteElephant()","cd5dd1d0":"showMsgSender()","cd5e2038":"t_ImmlaTokenDepository2()","cd5e3c5d":"roll()","cd5ebd93":"calculateTimeout()","cd5ecd60":"theWinnernumber()","cd5f49d5":"transferRewards(address,uint256,uint256)","cd5f5c4a":"tryGet(bytes12)","cd60aa75":"TokenPurchase(address,uint256,uint256)","cd60fe35":"MAX_TOTAL()","cd619681":"count_nodes()","cd61a95a":"sellOrder(uint256,uint256)","cd61cb3a":"setTokenUpgrader(address)","cd62b382":"Sunset(bool)","cd634920":"buyLeader(uint256,uint256)","cd635b71":"ownerShipTransfer(address)","cd639e6c":"EthFundTransfer(uint256)","cd639e8c":"transferByInternal(address,address,uint256)","cd63acf9":"buyChest()","cd63d930":"distributionCap()","cd64b135":"_depositToken(address,uint256)","cd64d952":"buildConnection(address,address,address,int256,uint256,uint256)","cd6566b0":"battle(bytes8,bytes5,bytes8,bytes5)","cd65908e":"changeIPFS(string)","cd65bb67":"ViewToken()","cd67571c":"accept(address,uint256)","cd679413":"ASHLEY_ALLOCATION()","cd67e55e":"LSTRatePerWEI()","cd67f3bc":"LimingCoin()","cd68100c":"lastAddress()","cd69859e":"vestedAdvisors()","cd69a7f1":"weightsApportionDecimals()","cd6a7ca7":"allowance(address,address,address,address)","cd6c4bb0":"startSettlementPreparation()","cd6c8343":"getAttributeValue(address,uint256)","cd6d7f81":"PRICE_FACTOR()","cd6dc687":"initialize(address,uint256)","cd6dca9e":"SaleFinalised(address,address,uint256)","cd6e05e2":"totalPotAwayTeam()","cd6e4dad":"LBCToken(address,address)","cd6e8855":"setMedications(bool)","cd6ebff6":"betAmountAtNow()","cd6ee0c2":"WISDOM()","cd6f4e0d":"dragoCount()","cd6f7c50":"GeneNuggetsToken()","cd6f7fdb":"applyKarmaDiff(address,uint256[2])","cd6fafa2":"XXXXXXXX04()","cd6fc2d1":"addMiningWarPrizePool(uint256)","cd704cb4":"getGeneralRelation(uint32)","cd71a397":"contract6function1()","cd71a471":"withdrawMkt(address,uint256)","cd72250d":"multiTransfer(address[],address[],uint256[])","cd728815":"setSubContractAddresses(address)","cd7292a0":"ChessLottery()","cd729a91":"unlockedTeamAllocationTokens()","cd72ab69":"etherRaised()","cd73d26c":"blocksPerDeal()","cd73df78":"getAllUsers(bool)","cd74096a":"getDataHoldersRefBonus(address)","cd755b41":"subs(address,address)","cd761b9c":"Grass()","cd762827":"joinGame(address,uint256)","cd76635b":"_setAddr(address)","cd76aa16":"getTotalCollected(uint64,address)","cd76faf5":"listActiveEggs()","cd7724c3":"getEthToTokenInputPrice(uint256)","cd77521a":"setFSTAddress(address)","cd77a0c8":"purchaseToken(address)","cd7805bc":"pinged(address,uint256,uint256,uint256)","cd781bf3":"pullEntry(uint256)","cd784d1b":"isSuperUser(address)","cd78a3b7":"processVote(bool)","cd79f86d":"submitPkgHash(string,string)","cd7a2c3b":"ResumeICO()","cd7b6744":"lockGlobalToken()","cd7ba8fd":"currentBlockHashCst()","cd7c92e3":"requestPrice(uint256)","cd7d5b92":"STARTING_SWORD()","cd7da845":"throwsWhenFinalizingWithIncorrectCap()","cd7da914":"renounceArbiter(address)","cd7dfa31":"setStarDeleted(uint256)","cd7e3184":"getValueBonus(uint256)","cd7e9fa6":"RefondCoin(uint256,string,string)","cd7eac3a":"house_fee_pct()","cd7ec171":"developer_string_C(string)","cd7ecda0":"grantPromoPack(address,uint8)","cd7f85fa":"budgetMultiSigWithdraw(uint256)","cd7fa74b":"setPendingReview()","cd7fb38c":"isValidMatingPair(uint256,uint256)","cd7ff921":"stringIndexOf(string,string)","cd80da82":"tokenShare(address)","cd819bdd":"setaddrFWD(address)","cd82a778":"_allowTimelock(address,address)","cd836e15":"SHARDING_REWARD()","cd838f0f":"getNames()","cd83b57c":"TacoCoin()","cd84cff4":"wwwithdrawww(uint256)","cd852330":"buyFromTrusterDealer(address,uint256,uint256)","cd854072":"affiliatThreshold1()","cd8550b8":"setBonus(bool)","cd85e945":"EtalonToken()","cd863e25":"startOffering(uint256)","cd866ee1":"MaximCoin()","cd868648":"setEndBlockNumber(uint256)","cd86eee2":"tokenCreationMinMile1()","cd871b16":"matchBytes32Prefix(bytes32,bytes,uint256,bytes)","cd875247":"OffGridParadise(string,string)","cd880b1e":"kcck256stradd(string,address)","cd881742":"teamTokensReleased()","cd88333e":"coldStore(uint256)","cd887739":"getExpertiseId(uint256)","cd88bac4":"teamTokensLockAddress()","cd897b75":"withdrawSubRound(uint256)","cd8aa272":"Icarus()","cd8b02c8":"Revoce()","cd8b0a77":"getProjectJudge(uint256)","cd8c063b":"isTransferAllowed()","cd8cc844":"lotteryStart()","cd8cdccd":"XiiPay()","cd8d3918":"calcLuckyCoinBenefit(uint256)","cd8d8da0":"tokenFallbackExchange(address,uint256,uint256)","cd8db998":"isDepositBlock(uint256)","cd8df8ec":"activateLastSale()","cd8e250a":"frozenBalancesOf(address)","cd8ed6f6":"addMarking(bytes32,bytes32,int256)","cd8f8b3c":"updateMintingAgent(address,bool)","cd8fce49":"Consents()","cd905dff":"isOperational()","cd9063f6":"replaceToken(address)","cd906676":"changelp1(address)","cd90b99d":"spawnInstance(address,uint256,uint256,uint256)","cd91672d":"firstStageDatetime()","cd91866a":"_startGameRound()","cd9217f7":"eventListener()","cd928f69":"updateAllowedTransfers(address,bool)","cd92dec0":"WaterMeterAcorn(address)","cd92eba9":"debtLedgerLength()","cd932c9c":"parseTimestampParts(uint256)","cd93307a":"EthereumSmart(uint256,string,string)","cd9354e4":"successesOf(address)","cd9380d5":"testSetBalanceSetsSupplyCumulatively()","cd93f6f3":"SetPoolEntryFee(string,uint256)","cd943e54":"transferToLock(address,uint256,uint256)","cd944e3b":"EXPERTS_POOL_TOKENS()","cd94a2a4":"owlToken()","cd953744":"getZTKCheck(address,address)","cd9548ce":"CompanyURL(string,string)","cd955faa":"hasSantaCoins(address)","cd9679dd":"issuePRETDETokens(address)","cd9745f2":"voteForTransaction(uint256)","cd9847bc":"testAccessControl()","cd98b214":"getMarketCreatorSettlementFeeInAttoethPerEth()","cd997aa3":"getData_31()","cd9a1b63":"devBalance()","cd9a1fa6":"countOfOwners()","cd9a27ba":"defaultRegionTax()","cd9a3c98":"any(bool[7])","cd9a7a56":"revokeOperatorByTranche(bytes32,address)","cd9b2f05":"addContributors(address[],bytes32[])","cd9c8d80":"VerifiedInfoHash(bytes32)","cd9d12f2":"icoStartUnix()","cd9d27ed":"setDelegadoDeDistritoVerify(bytes32,bytes32,uint8)","cd9ea342":"testMode()","cd9f05b8":"balanceEtherAddress(address)","cda0574e":"emitNominUpdated(address)","cda0eeaa":"gameMinBetAmount()","cda113ed":"globalBet()","cda2695a":"sponsor(address,uint256,uint256,uint256)","cda35494":"bonusMintingAgent()","cda368c3":"teamV()","cda3c001":"getUnsoldPeriod()","cda4351b":"ViewBetByID(uint256)","cda43ec5":"returnHrt(address,string)","cda4beef":"createAuction(uint256,uint256,uint256)","cda68e5d":"LogDecreaseCap(uint256)","cda6e92a":"sendTransaction(address,uint256,uint256,string,bytes)","cda78dea":"DTransport()","cda8300e":"Transfer_data_enabled()","cda87e33":"getConfigBoolz(bytes)","cda95d80":"Reserve()","cdab73b5":"blackList()","cdab9b5b":"setProviderName(uint256,string)","cdaba786":"addBet(uint256)","cdad5f94":"sendState(bytes,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","cdad6576":"changeBountyArbiter(uint256,address)","cdadb0fa":"right58(uint256)","cdaeb47d":"removeAddressFromMaster(address)","cdaf4028":"getMigrationCount()","cdb0ec6b":"getLinkedWallets(address)","cdb0fed9":"Livetest()","cdb230be":"DHAMAR()","cdb23c2d":"getMonarchyFactory()","cdb2867b":"canVote(uint256,address)","cdb294a2":"startDeal(bytes32,address)","cdb30482":"setBalancesUSD(address,address,uint256)","cdb3344a":"createGravatar(string,string)","cdb38f4f":"preICOTokenIssuedTotal()","cdb532b9":"deleteCharity(uint256)","cdb58e21":"DUBI()","cdb616b2":"ForkDelta(address,address,uint256,uint256,address)","cdb627b2":"showRecastConfigs()","cdb62c16":"getCashOutAmount(uint256)","cdb6753b":"setNav(uint32)","cdb75f2b":"NemoXXToken()","cdb7699a":"manualTransferTokensToWithBonus(address,uint256,uint256,uint256)","cdb78a2a":"giveNxc(address,uint256)","cdb7ef81":"getMinAuditPriceMax()","cdb80c51":"_service()","cdb88ad1":"setPauseState(bool)","cdb986cc":"getExperience()","cdb99909":"fstPrivateSalePortionNumerator()","cdbaed5a":"_isValidDepositCountry(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","cdbb02af":"getAddressCount()","cdbccf50":"unfreeze_end_date()","cdbce03d":"checkOwner()","cdbcff6d":"getQuotas()","cdbd0f0e":"getRatioOf(address)","cdbd1031":"craftTwoCards(uint256,uint256)","cdbd3fc9":"bax()","cdbd7516":"allowUsers(address,address[])","cdbdc7a4":"DeveciToken()","cdbdd569":"SetLastRoomAndRound(address,uint8,uint256,bool)","cdbdf391":"left34(uint256)","cdbf9c42":"multiply13(uint256)","cdbfd448":"memberLog()","cdc04961":"setStates(address[],uint8[],uint8[])","cdc0563a":"presaleTokenRate()","cdc06bdd":"CrypviserICO(address[],uint256)","cdc07bbc":"_destroy(address,uint256)","cdc18424":"withdrawer()","cdc25845":"setBuyPrices(uint256)","cdc26dcb":"dorcasToken()","cdc2895c":"getOffer()","cdc39f4a":"addCardSet(uint256,uint256,uint256,bytes32,string,address,uint8)","cdc3e046":"balanceMaxSupply()","cdc57fd3":"modifyTokenPrice(uint256)","cdc5c7cd":"updateLinkHash(uint256,bytes32)","cdc62c03":"getFeeToTokenConversion(uint256)","cdc62d39":"ballotDetails(uint32)","cdc68b85":"create_all()","cdc7076d":"getMilk()","cdc81bc2":"totalInVaults()","cdc86ec4":"tokenCreationMinPayment()","cdc89404":"round5StartTime()","cdcb3cdb":"crowdsaleSupply()","cdcb7c8f":"chase()","cdcb8788":"nextRoundFee()","cdcbac0d":"phase3StartingAt()","cdcc599b":"YunnimToken()","cdcc5d3e":"getTokenHolderTribunal()","cdcd77c0":"baz(uint32,bool)","cdcda9a8":"DogeCash(uint256,string,string)","cdcdb463":"getRiskParameters(bytes32)","cdce240c":"WillCoin(string,uint256,string,uint8)","cdce5206":"getUserNum()","cdcf0c4a":"dispute(string,address)","cdcf4b9b":"priceDenominator()","cdcf5794":"checkCooldown(address,address)","cdd11b83":"roundTotalWinnings()","cdd13589":"batchDistributeWithAmount(address[],uint256[])","cdd13673":"rewardReductionRate()","cdd13701":"getEventHashes(uint256[256])","cdd1b539":"getSequenceNumber(uint256,address)","cdd2067e":"getVendingAmountSold(uint256)","cdd247a9":"offerAd(uint256,uint256)","cdd2ef0c":"starBuy()","cdd3574a":"crowdsaleStartBlock()","cdd3ab58":"addDistributionSources(address[])","cdd432d0":"rewardNumerator()","cdd63344":"moveTo(uint256)","cdd6d079":"_tokensForEth(uint256,uint256)","cdd72253":"getVoters()","cdd739f6":"tokenCapForPreICO()","cdd7b1fd":"init(uint256,uint256,uint256,address)","cdd8750e":"getDueTime(bytes32)","cdd8b2b2":"registerBeneficiary(address)","cdd8cc49":"debug_string(string)","cdd8d4e8":"mgmtRewardPercentage()","cdd90fbb":"firstRoundWMDiscount()","cdd93332":"getTradingStart()","cdd977e0":"addrService()","cdda62ad":"FutureBlockCall(address,uint256,uint8,address,bytes4,bytes,uint256,uint256,uint16,uint256,uint256)","cdda96cf":"TokenPriceETH()","cddaf241":"distributeReservedTokens(uint256)","cddb4e44":"getDataAddress()","cddb523b":"changeTeamWallet(address,address)","cddb8e94":"buyProduct(address,uint256)","cddbe729":"game(uint256)","cddbff7c":"CRYPTODUBAI()","cddc028b":"IndexEmpireToken()","cddc37c1":"withdrawForTwoYear()","cddce877":"TOKEN_SHARE_OF_LEGALS()","cdde5413":"updateTileTimeStamp(uint16)","cdde76f7":"hasAnyAttrs(uint256,bytes2)","cdde9294":"avgTokenWinValue()","cddeaba0":"setTokenPrice(uint256,uint256,uint256,uint256)","cddfbaaf":"AirDropAFTKSeven()","cde02b25":"totaldivineTokensIssued()","cde0a4f8":"setRegulator(address)","cde180a9":"listContractByModuleId(string)","cde1d97a":"ChangeTokenVaultAddress(address)","cde25f8a":"getWineOwner(address)","cde2c35a":"rewardBobaBase(uint256)","cde2d72a":"receiveBTC(address,string,address,uint256,string)","cde2e8d7":"A2ACrowdsalePartner()","cde4018e":"AgriChainData()","cde40bc8":"bonusFirstWeek()","cde43f28":"mintTokens(uint256,int256,address,uint256)","cde4efa9":"flip()","cde596b2":"Pay(address)","cde5f58f":"RELEASE_INTERVAL()","cde68041":"hasPermission(address,address)","cde74e51":"licenses(bytes32)","cde7da75":"claimActingPlayerOutOfTime(uint256)","cde7f980":"save(string,address,uint256)","cde93eec":"NewIssue(address,uint256)","cde99727":"calculateROI()","cde9f2ea":"startdate()","cdea76d6":"buyLong(address[2],uint256[2],uint8,bytes32[3])","cdeb1485":"massTransfer(address[],uint256[],bytes32)","cdeb7bac":"MaiToken2()","cdebf885":"Rent(address,uint256,uint256,uint256)","cdecd1d7":"FUN()","cded6986":"_getBridgeTokenFee(uint256)","cded6fa5":"JesusCrowdsale()","cdeda055":"_assert(bool)","cdee2112":"CyberToken()","cdee2b92":"saleclosingTime()","cdee5c4a":"raceRegistration(uint256,address)","cdee8973":"Swapped(address,uint256)","cdef3911":"assignTokenOperator(address)","cdef9423":"create(address,address,address,address,address,address,address,uint8,string)","cdef9fb6":"SimpleStore(uint256)","cdefa007":"FondoNetwork(uint256,string,string)","cdefa4de":"ParaD2Test()","cdefe704":"getLOCbyID(uint256)","cdf016ca":"minimumBounty()","cdf05ab5":"voteTime(uint256)","cdf20e1e":"currentSyndicateValue()","cdf32cab":"totalInvestedWei()","cdf3bc6f":"revise()","cdf3bdab":"GetMyAcorn()","cdf45c03":"FourLeafClover()","cdf46344":"mint(address,string,string,uint256,uint64,uint64,uint64)","cdf4d6b4":"registerKYC(address[])","cdf574f1":"purchase(uint256,bytes7)","cdf6ddb4":"activeCrowdsalePhase1(uint256)","cdf744b2":"setFounderPercent(uint256)","cdf90e02":"Roles2LibraryAndERC20LibraryAdapter(address,address)","cdf93c0f":"EtherBlock()","cdf99413":"CrowdsaleToken(string,string,uint256,uint256,bool)","cdf9b77e":"getCurrency(uint256)","cdfb0a21":"PRVTSToken()","cdfb2b4e":"enableWhitelist()","cdfb5832":"setClaimer(address)","cdfbc437":"setMaxBetAmount(uint256,uint256)","cdfbc8f1":"MINIMAL_PURCHASE()","cdfbe22c":"isAnExchanger(address)","cdfc20aa":"addHashType(uint8,string)","cdfd293b":"BOUTSPRO_AMOUNT()","cdfd72e8":"calcTeamEarnings(uint256,uint256)","cdfd7474":"SONICToken(string,uint8,string)","cdfdb7d6":"increaseAllowance(address,uint256,address)","cdfe2815":"createVip(address,uint256,uint256,uint256)","cdff1be4":"pauseWithdrawal(address,address)","cdff5857":"updateUint256s(bytes32[],uint256[])","ce00d49c":"_transferWithRate(address,address,uint256)","ce017242":"updateICOPrice()","ce01e1ec":"set2(uint256)","ce021384":"numberOfReferralCodes(address)","ce0457fe":"NewOwner(bytes32,bytes32,address)","ce04a8c5":"isDAppReady()","ce04c10e":"highContributionAward(address)","ce05264f":"createInterceptorFromVault()","ce05369b":"releaseTokenHolder()","ce058d0d":"ChangeLEXTokenAddress(address)","ce0617ec":"lockedUntil()","ce072163":"collectPayments()","ce07d2b4":"proxyTransfer(address,address,uint256,bytes)","ce098093":"createtoken(string,string,string,address)","ce0a191a":"setLotteryTokensPercent(uint256)","ce0b5bd5":"cancelWhitelistRemoval(bytes32)","ce0bb9c4":"looksCoin()","ce0bd51f":"bancorConverterFactory()","ce0befcf":"remainTokens()","ce0d5f78":"addAddressToBlacklist(address,address)","ce0df06b":"FreezeAccount(address)","ce0e19ba":"appendString(string)","ce0f802d":"MaazBTC()","ce0f92b7":"hashOrder(bytes,uint64,uint64,uint256,uint256,uint256)","ce0ff8d8":"CSStoken(uint256,string,string)","ce10814c":"wmax(uint128,uint128)","ce109195":"internalDoesEventExist(bytes32)","ce10cf88":"getAddressByIndex(uint256)","ce11f2bb":"vote(uint256[])","ce120afb":"_safeTransferPaymnt(address,uint256)","ce139296":"icoPhaseDiscountPercentage1()","ce13bfb7":"cancelLoanOffering(address[9],uint256[7],uint32[4],uint256)","ce144eb9":"spiceUp(string)","ce146d3d":"getTotalWins()","ce148564":"TIER3END()","ce148c1f":"tempTokensPeriodOf()","ce14a46e":"totalPeriod()","ce14d404":"PieTokenBase()","ce14eeb8":"BASE_HARD_CAP_PER_ROUND()","ce14f10b":"disabled(uint256)","ce15647a":"getTeam(uint8)","ce158ba2":"approveCompanyAllocation(address)","ce160edd":"searchAndBid(uint256,uint256)","ce1619f8":"_lockPaymentTokens(address,uint256,uint256)","ce161b57":"AngelTestToken()","ce165894":"updateExpectedAmount(bytes32,uint8,int256)","ce17f01e":"Hostblock()","ce18eb0b":"stage1Deadline()","ce19419b":"testThrowsSetNotUpdatableNotOwner()","ce1a70a3":"SimplePreTGEContract()","ce1aafc0":"VinaexToken()","ce1afbe1":"_transferToken(address,address,uint256)","ce1b088a":"withdrawDonations()","ce1bd789":"DestroyTransferFeeCoin()","ce1c1538":"getCardByOwner(address)","ce1c93af":"abandon(string)","ce1cf229":"SimpleMultiSigWallet()","ce1d6ea0":"testAppendTranch()","ce1ed182":"getLastMilestoneStartsAt()","ce1ed2bb":"BecomeSquirrelDuke()","ce1f561c":"holdingTaxDecimals()","ce1ffcd9":"setTransferEnable(bool)","ce203b83":"officialUserSignUp(string,address)","ce204b78":"defrozen(address)","ce204bf1":"TOKEN_LOCKING_PERIOD()","ce20fd84":"query(bytes2,int256)","ce21abf3":"sendUnsoldPRETDETokensToTDE()","ce21fbf4":"GolemToken()","ce220ecf":"testAddBalanceFailsAboveOverflow()","ce2293ca":"EIB(string,string,uint8,uint256)","ce230030":"unlockSupervisedFunds(address)","ce233452":"limitPurchasing(uint256,uint256)","ce23e8bc":"LIQUIDATION_TOKENS_PER_ETH()","ce23f2b2":"newLoan(bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256)","ce241d7c":"LogSetOwner(address)","ce248843":"removeOne(address)","ce255bba":"setsafekey(uint256)","ce266af8":"tom()","ce267b55":"ecdsaVerify(address,bytes,uint8,bytes32,bytes32)","ce2777a3":"BigchatToken(uint256,string,uint8,string)","ce27a21a":"setLogoPrice(uint256)","ce289284":"Result(bytes1)","ce2a9f62":"totalEthCollected()","ce2c6ad5":"getChainFeeArray()","ce2ce3fc":"getLocation()","ce2d173f":"setSelfOff()","ce2d3fa1":"returnKVTToOwner()","ce2dfd00":"createFootballerStar(uint256,uint256,uint256,uint256)","ce2fc873":"setArticleHash(uint256,string)","ce2fc8b1":"RequestC(bytes32,bytes32)","ce2fce38":"getTransferInfo(address,uint256)","ce3099fa":"testNBool()","ce3174ca":"revokeSubmission(address,address)","ce329570":"byzantineCloseChannel(bytes32)","ce347a65":"fund(uint16)","ce3498b8":"DelegatedIdentity(address)","ce356e3a":"addTeam2(uint64,uint64,uint64,uint16)","ce371431":"queryFunds(address)","ce373b95":"heroOfThePit()","ce376aa3":"buy_king()","ce3800e1":"moonLevel()","ce383ec7":"view68()","ce389e53":"getTokenAddHold()","ce394696":"calculateCost(uint256,uint256)","ce39952a":"disableSecureMode()","ce39976d":"getUrlAtIndexOf(address,address,uint256)","ce3a7076":"Cancelot(address,address)","ce3b0475":"changePriceDecraseTime2Action(uint256)","ce3be6bb":"withdrawWallet1()","ce3cc3aa":"changeTolerance(address,bytes32,uint256)","ce3ccfd0":"shouldReturnDefault(bytes32)","ce3cd997":"setStage(uint8)","ce3cef0d":"stopTakeToken()","ce3d9237":"mintMarginTokens(bytes32,address[7],uint256[8],uint32[2],bool,bytes,bytes)","ce3e82a4":"KorkToken()","ce3f865f":"collect(uint256)","ce3fff35":"ONTTotalSupply()","ce4150eb":"migrateMarketInFromSibling()","ce419871":"openKYC()","ce41d75d":"NewIntelTechMedia(address)","ce4254ce":"terminationTime()","ce429429":"generateOrderByMerchant(address,uint256,string,string,string)","ce42bb11":"getLockedDevFundAmount()","ce42fa88":"Telcoin(address)","ce435f4b":"SetParticipantAgrHash(address,address,bytes32)","ce43b0c0":"creditorAddresses(uint256)","ce43c032":"getUsername(address)","ce43c097":"CradTimeLock(address)","ce44573a":"GenChipByRandomWeight(uint256,uint8,uint256[])","ce45a260":"CryptoDime()","ce45f981":"MooAdvToken(uint256,string,string)","ce468922":"transferCat(bytes5,address,address,uint256)","ce46e046":"isPayable()","ce471aee":"kompitechToken()","ce47befd":"checkoutCart(string)","ce47e604":"sendAliceBlue(address,uint16,uint256)","ce483c42":"statusI()","ce483e88":"incrementOpenInterest(uint256)","ce48a54d":"getHeroLevel(address,address)","ce49735a":"distributeAlliniTokens()","ce4a6f09":"offerCanvasForSaleToAddress(uint32,uint256,address)","ce4a9206":"minPayInterval()","ce4ae74a":"setRewardMinter(address,uint256)","ce4c4a74":"TrueFlipToken(address)","ce4cf4c8":"advisorTotal()","ce4d01a3":"validate(uint256)","ce4d66b9":"roundBonus(uint256)","ce4d6fdf":"maritalStatus()","ce4dbdff":"securityTokenRegistry()","ce4ddabd":"updateTimeRC(address,uint256,uint256)","ce4e42d2":"BountyManager(address)","ce4e5aa4":"findBestMatch()","ce4e84a3":"STARTING_CHICKEN()","ce4e8c1a":"createNextPremiumSale(uint8,uint256)","ce4eb657":"updateXDRRate(uint256)","ce4ef577":"tokensAllocatedForAs(address,address,address,address,address,address,address,address,address)","ce4efe62":"insert(uint256,bytes32,bytes32)","ce507401":"oraclizeGasPrice()","ce50f72d":"getAvailableBalanceOf(address,address)","ce50f926":"getMinLimit()","ce510d46":"neededAmountTotal()","ce513b6f":"withdrawable(address)","ce52242e":"gotchinfo(address)","ce522f22":"updateWeiCap(uint256)","ce52c4ef":"createDelegation(address,uint256)","ce52cf84":"encoding_format()","ce53ee2d":"voteNoLockByAdmin(address,address,uint256)","ce5478a4":"lockedCapitalOf(address)","ce5494bb":"migrate(address)","ce5566c5":"cash(uint256,uint256)","ce557031":"purchaseTokens(address)","ce5570ec":"isWallet(address)","ce563036":"BaseContract()","ce5659bc":"changePartner2(address)","ce56c454":"withdrawEther(uint256,address)","ce56f3fb":"moneybuy(address,uint256)","ce5774c6":"Proposal(string)","ce578cd6":"managementContractAddress()","ce57d8d5":"getSingleInvestor(address)","ce5910f3":"unfreez()","ce592586":"setThresold(uint256,uint256)","ce5968da":"onMint(int256,address,uint256)","ce597164":"normalDemurrageAmount(uint256)","ce5a5df7":"createUnicorn(address)","ce5a63ff":"purchaseBlock(uint256,uint256)","ce5ac32d":"Firmament()","ce5c073d":"setMintMaster(address)","ce5c2c33":"performTransaction(uint256)","ce5c4fd8":"finalizeSale(uint256,uint256)","ce5c5201":"cryptogsAddress()","ce5d80e6":"stealCardWithId(uint256)","ce5e13aa":"getPlayerProfit(address)","ce5e4190":"set_tokens_per_ether(uint256)","ce5e6393":"tgrSetFinished()","ce5e84a3":"activate(bool)","ce5e9ffb":"CORRECTION()","ce5f9454":"numerator()","ce5fa1e9":"secondExchangeRatePeriod()","ce5fd7f3":"OfferContract()","ce606ee0":"contractOwner()","ce60f78d":"createMarriage(bytes,bytes,uint256,bytes,bytes)","ce622ec5":"announceWinner(string)","ce6236ca":"getRoundLength()","ce627bd9":"mineblocksAddr()","ce629a6b":"_computeTournamentBooty(uint256,uint256,uint256)","ce63066f":"test_6_basicTransfer_increaseBlocksBy1000()","ce6342f3":"getAbiVersion()","ce63cc89":"postTask(string,string,uint256,uint256)","ce649b39":"setEthereumRate(uint256)","ce655952":"_cancelSale(uint256)","ce665dd8":"OFFSET()","ce67bda6":"testNop(int256,int256,uint256)","ce686e40":"IcoToken(string,string,uint256,string)","ce686e62":"BurnableOpenPayment(address,uint256,bool,uint256,string)","ce691294":"kRate()","ce6933d5":"fetchPaidOrdersForPayer()","ce695d7f":"_addArea(address,uint256)","ce699a41":"releaseVestedTokens(address)","ce69cd20":"MIN_BID()","ce6a9bd6":"proofType_Ledger()","ce6b3467":"withdrawExcessToken(address)","ce6c0b64":"_getTokenNumberWithBonus(uint256)","ce6c2589":"_emitOracleRemoved(address)","ce6c9a89":"changeMinimalWei(uint256)","ce6d35d1":"migrateToken(address,address)","ce6d41de":"getMessage()","ce6eaef5":"startSecondSale()","ce6eaff9":"YOU_BET_MINE_DOCUMENT_SHA512()","ce6efb07":"AmountLimitCrowdsale(uint256,uint256)","ce6f149c":"WEEKS_26()","ce6f899d":"EventLogin(address,string)","ce709c9b":"proposalCreateTime(uint256)","ce70faec":"createUltimateOracle(address,address,uint8,uint256,uint256,uint256)","ce71b83c":"TianqibaoTokenERC20(uint256,string,string)","ce71caee":"juryOperator()","ce72a696":"ICO_PERCENTAGE_1()","ce73a61d":"setWhitelistExpiration(uint256)","ce73b41a":"addBuyTokensRequest(address,string,uint256,uint256)","ce742222":"SCARABToken2()","ce744ba5":"SellOffer(address,address,uint256,uint256,uint256,uint256)","ce746024":"recover()","ce7462e9":"setStarSellPrice(uint256,uint256)","ce749c29":"defund()","ce774030":"raiseCoinsAdded(address,uint32,uint256)","ce77cf42":"Rafflecoin()","ce782e08":"floorLog2Test(uint256)","ce784216":"scrapCount()","ce7842f5":"referralBonus()","ce784564":"findPositionInMaxExpArray(uint256)","ce78b752":"ActivatedEvent(bool)","ce7917d7":"GEOCOIN()","ce794294":"multisignature()","ce799b0a":"changeStakeRate(bytes32,uint256)","ce79add1":"givableBalanceOf(address)","ce79d17d":"Storesumdata(bytes32,bytes32,uint64)","ce7a0697":"_internalTgeSetLive()","ce7a2b02":"processPayment(address,address)","ce7a60ab":"unlockBalance(address)","ce7a94eb":"SliceByte32(bytes,uint32)","ce7aa79f":"PXMCToken(uint256,string,uint8,string)","ce7ab6a7":"set_refunded(bool)","ce7ba916":"_initBadges(address,uint256,uint256,uint256)","ce7c2ac2":"shares(address)","ce7c5d7f":"transferEthToOwner(uint256)","ce7ca615":"FoundationAddress()","ce7ca665":"medalBoost()","ce7cdbb7":"getIndexRoot(bytes32)","ce7d3539":"AVMDisputeProcess()","ce7e23a0":"UnityToken(address,uint256,uint256)","ce7e51e3":"uint256ToString(uint256)","ce7f6e82":"CoinPulseToken()","ce7fc203":"accForTeam()","ce803a70":"noOfSeats()","ce806176":"setPurchasing(bool)","ce809e4e":"ETH_DECIMALS_FACTOR()","ce813d8f":"addTurretParts(uint8[])","ce816706":"X4BToken()","ce818ed5":"SiringClockAuction(address,uint256)","ce82eb33":"ico4Bonus()","ce830f5b":"_unlockToken(address)","ce845d1d":"currentBalance()","ce85e801":"MAX_PRICE_SALE()","ce85fbe2":"joojinta()","ce860a62":"getShipIdsByOwner()","ce869a64":"fails()","ce8721b2":"daoAccounts(address)","ce873a67":"processReferer(address)","ce8775a4":"win(uint256,uint256,uint256,bytes,uint256)","ce87f626":"replaceWizardRP(address)","ce8804c9":"setAdvertAddr(address)","ce8883af":"potFee(uint256)","ce88a9ce":"setProduction()","ce88b145":"getAccount(uint256)","ce89a2a2":"changeSettings(uint256,uint8)","ce89b5de":"buy100()","ce89c80c":"calcKeysReceived(uint256,uint256)","ce8ac033":"getAvatar(address)","ce8ae9f3":"giveReward(address,uint256)","ce8b5b60":"setLockAfterManuallyMint(bool,int256)","ce8b7151":"isHF()","ce8b7be4":"consultantsAllocation()","ce8bbe4b":"bobMakesErc20Deposit(bytes32,uint256,address,bytes20,address)","ce8bcae3":"allFundsCanBeUnlocked()","ce8d054e":"_setupNoCallback()","ce8d096d":"redeemVestableToken(address)","ce8d1910":"claimFromSeveral(uint256,address[])","ce8d388d":"disableWithdraw()","ce8d73de":"o_labirinto(uint256)","ce8dc388":"TOTAL_ROUNDS()","ce8e120a":"thawTransfers()","ce8e2fd8":"SaintArnouldToken(address,uint256,uint256)","ce8e5170":"burnedAfterSaleCount()","ce8e95d4":"updateRegion(uint256,uint256,uint256[],bool,bool,uint8[128],bool,address)","ce8ebfc8":"makeSchoolToken()","ce8ff29b":"TicTacToeAdjudicator(address,address,address,address,uint256)","ce90203c":"computeSellPrice()","ce906c6a":"listPrycto5()","ce909980":"checkTimeout(address)","ce90bafa":"topUpERC20(address,uint32,uint192)","ce912692":"createNew(address,address,address,uint256,uint256,uint256)","ce916d85":"icoTokensReceived(address)","ce91e4b3":"freezeaccount(address,bool)","ce923728":"setDealMembers(address,address,address,uint256)","ce92dced":"newBid(bytes32)","ce93b0e4":"returnAdvisorTokens(address,uint256)","ce952345":"icoAssignReservedBounty(address,uint256)","ce95aad2":"isOnCraftingAuction(uint256)","ce95b475":"getBalanceByAdress(address,address)","ce96c8e4":"set_deposit_manager(address)","ce96ec6b":"setRefer(address)","ce972050":"token_orderSheet(address,uint32)","ce972f33":"Menu01(address,uint256)","ce97f61a":"submitTally(uint256,uint256,uint256)","ce9822c7":"Magic10(uint256,address)","ce99151e":"p_wallet()","ce9a3b0f":"special()","ce9a6ac8":"putOn(uint256,uint256,address)","ce9ae667":"PharmaWit()","ce9ae91c":"getARed(uint256,uint256)","ce9af2b9":"isReserved(string,address,string,bytes32)","ce9b4321":"calculateCommission(uint256)","ce9c39c9":"stepTwoStartTime()","ce9e673b":"forceOffsetBasicFeeRate()","ce9e6bb7":"setEndTimeIcoStage2(uint256)","ce9f24dc":"SilentNotaryCrowdsale(address,address,address,uint256)","ce9fb088":"TransferSellAgentBounty(address,uint256)","cea024d9":"tokenPriceNum()","cea08621":"changeDailyLimit(uint256)","cea10af7":"hardFundingGoal()","cea15706":"DarkrenlandCoin()","cea16c83":"endFinalStage2()","cea198c8":"LogBidCanceled(bytes32)","cea22b51":"ico_stage()","cea289db":"debugInt(uint256)","cea2ed48":"CreatedPet(uint64)","cea4b687":"updateListingWithSender(address,uint256,bytes32,uint256)","cea5033c":"_requestTokens(address,uint256)","cea5b151":"getLabelHash(string)","cea5d64b":"shift_right(uint256,uint256)","cea63361":"transactionFeeRateM()","cea65e97":"addressIsOwner(address)","cea67184":"getHydroId(address,address)","cea7555b":"distributedFundariaStakes()","cea81ab1":"generateContestForDelegationSchemaHash(address,uint256,bytes32)","cea876ba":"EthMatch(uint256)","cea943ee":"getSaleConfig()","cea9707a":"getMyTicketList(bool,uint256,uint256)","cea99275":"hasInitMartial()","cea9b7af":"ICO_EOS_AIRDROP()","cea9d26f":"rescueTokens(address,address,uint256)","cea9f621":"setVars(address,address)","ceaa50d4":"getLastPayoutAmountAndReset()","ceaae25d":"massChangeRegistrationStatusForGoldWhiteList(address[],bool)","ceaafb67":"AnonymousDeposit(address,uint256)","ceab09d8":"set_participant(address,uint256,uint256,uint256,bool,uint8)","ceab4ea7":"VOODOO()","ceac2aed":"submit_payment(uint256,uint256,bytes32,bytes32,uint256,address,bytes32)","ceacc749":"calcCurrentMinBid()","cead2c29":"get_ptc_balance(address)","cead4620":"putBtoWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","ceadd9c8":"donateAsWithChecksum(address,bytes4)","ceae3424":"balanceSoll(address)","ceae7f64":"thirdStageMinting()","ceaf0bfb":"admAccount(address,bool)","ceaf1e94":"_transferToAddress(address,uint256)","ceaf9519":"needToGetFree()","ceafb18d":"getCard(address)","ceb0884d":"getSolution(address,uint32)","ceb10f1c":"preIcoCap()","ceb21433":"Activate(address,address,address,address)","ceb22fa0":"meteredEarn(uint256)","ceb24797":"getKycLevel(address)","ceb2731a":"purchaseCrate()","ceb35b0f":"addAddress(string,address)","ceb408b4":"_set5()","ceb41385":"getHashLeftPad()","ceb44d04":"checkSplitEnd(uint256)","ceb51f0a":"setApproved(address,uint256)","ceb60654":"getGroup(uint256)","ceb6dbc3":"time_of_token_swap_end()","ceb791d9":"priceRate()","ceb7bc87":"tokenTransferFrom(address,address,uint256,address[])","ceb7e43c":"getAddOnComplete(uint16)","ceb88ff4":"setContribution(address,uint256)","ceb8ee8b":"durationInMinutes()","ceb98dc7":"unbuy()","ceb9a5fd":"getGameCurrentRoundId(uint256)","ceba1794":"MAX_LOAN_AMOUNT()","ceba30b5":"scheduleTransaction(address,bytes,uint256[4],uint256)","ceba5029":"MOBTokenIssue(address)","cebac2f2":"LRCLongTermHoldingContract(address,address)","cebae575":"GLAU()","cebb8bb0":"testControlRestartEnforceRevisions()","cebbbce5":"ClaimAirdrop(address,uint256)","cebc141a":"devCount()","cebc9a82":"getDelay()","cebce72d":"token(uint64)","cebd31bc":"getStartingPrice()","cebe09c9":"quota()","cebf3bb7":"minRaise()","cebfa61e":"month18companyUnlock()","cec0213e":"HealthDataChain(uint256,string,string)","cec0f734":"setTransferToken(uint256)","cec10c11":"setFees(uint256,uint256,uint256)","cec1365a":"ShortLimit(uint256)","cec17a12":"ChrisBell(uint256,string,uint8,string)","cec33f4e":"getPatentFee(address,uint16[5],uint256)","cec3638d":"VotingChallenge()","cec36cb4":"refundPoweredUp()","cec4a1cc":"pauseRefund(bool)","cec4ab9c":"whitelistEnable()","cec63cea":"NamoToken()","cec68824":"registerFull()","cec7260b":"move_monster(uint16,uint16)","cec77ad5":"ALLOC_ADVISOR()","cec7b4e8":"Deposit(uint256,address,uint256,string)","cec8d277":"decrypt(address,bytes,string)","cec95aa1":"getReleaseHashForPackage(string,uint256)","cec9b4ef":"_executeTransaction(uint256)","cec9df89":"getAddressBetsForEvent(bytes32,address,string,string)","ceca122d":"activate(bool,bool,bool)","ceca7e8e":"fundLock(address,uint256)","cecaf395":"buildBlocks(int32,int32,bytes16)","cecb06d0":"mintOwner()","cecc33e7":"issueTickets(address,uint256,uint256)","ceccc10e":"getHoldersNameAddr()","cecd0264":"executePayment(string)","cecd0ab5":"_processFundsOverflow(address,uint256)","cecd9dd4":"_isNeededNewLottery()","cecdc6aa":"TEAM()","ced095d6":"getContest(string)","ced0a3a5":"setHookOperatorContract(address)","ced0bcc3":"MangaCoin()","ced0c0c2":"subscriptionRate()","ced0d31d":"setFeeRate(uint256,uint256,uint256,uint256,uint256,uint256)","ced11e40":"addMemory(string,bytes)","ced1a60b":"pooja()","ced29978":"LogFrozenAccount(address,bool)","ced32b0c":"setSender(address)","ced39558":"buyLand(uint256)","ced3fb9c":"isAddressAuthorized(address)","ced444bf":"offerStarForSaleToAddress(uint256,uint256,address)","ced4c064":"withdrawTo(string,address)","ced4f4b8":"sellEther()","ced659b6":"burnMktCoins()","ced72f87":"getFee()","ced78ed1":"getImageData(uint256,uint16)","ced7d018":"reFundByOther(address)","ced80aca":"updateMultipleReservedTokens(address[],uint256[],uint256[],uint256[])","ced84a71":"addInvestor(address,uint256,uint256)","ced92670":"changeMultiplier(uint256)","ced9f7c0":"mokenNoName(uint256)","ceda4a03":"NovioCoin_TEST()","cedadaca":"SingularityTest6()","cedbbeee":"createTokens(address)","cedc01ae":"getActivator(address)","cedc2ce1":"setMaxTransfers(uint256)","cedc7277":"getBuyPrice(address)","cedcbd99":"ACTION_BUY_OFFER_ACCEPTED()","cedcd770":"foundationWithdraw(uint256)","cedd90f6":"purchase(bool,bool)","ceddd07d":"balanceOfUnlocked(address)","cedf222e":"congressMemberThreshold()","cee024dc":"getNumberOfVotes()","cee02a86":"SOFTCAP_ETH_LIMIT()","cee0b4fe":"CRTSTAL_MINING_PERIOD()","cee13e28":"Conversion(address,address,address,uint256,uint256,int256,uint256,uint256)","cee24e31":"gambler1()","cee26ed5":"sellers(uint256)","cee2a9cf":"isInvestor(address)","cee401ef":"enableICO()","cee594c8":"addStage(uint256,uint256,uint256,uint64,uint64,uint256)","cee6b0d9":"AcceptsSunny2(address)","cee6b53c":"updateLastActivity()","cee6ee38":"aEthereumlotteryNet()","cee6f794":"SEKEM()","cee6f93c":"getResultOfLastFlip()","cee73630":"buyTPT(uint256,uint256,uint8,bytes32,bytes32)","cee749bc":"withdrawTokenRefund(uint256,address)","cee80356":"min4payout()","cee829ea":"refundMany(address[])","cee8fa1f":"Funding_Setting_cashback_time_end()","cee93e23":"isActive(uint32,int256)","cee96f49":"setissuedSupplyRatio(uint256)","ceea3914":"lookupUserDonationHistoryByCampaignID(address)","ceead4b6":"setCompte_10(string)","ceeafd9d":"withdrawFundsAdvancedRP(address,uint256,uint256)","ceeb7066":"setJoinFee(uint256)","ceebe28d":"repoInterfaceVersion()","ceec8f8f":"removeProduct(string,string)","ceee4119":"getUsersRadarsIds()","ceee9658":"rotate_right(uint256,uint256)","ceeea0ea":"completeAttack(bytes32)","ceef3800":"calculateBonusTierQuotient()","ceef3d93":"changelp7(address)","ceef644c":"LIFEINVIDER()","ceefbbd6":"prePreIcoEndAt()","cef037fd":"setContinueSelling()","cef062fc":"reserveVault()","cef0e9e2":"getFalconmasterReq()","cef24cac":"AmountToFund(uint256)","cef29521":"PRICE_MULTIPLIER_ICO4()","cef2e559":"marketplace_storage()","cef42254":"getContribution(uint256)","cef4be3c":"partialClaim(address,uint256)","cef55ae1":"newComp(uint8)","cef5ed69":"changeServiceAgent(address)","cef6a39a":"createMinerAuction()","cef6cfb2":"addToWhiteList(string,address)","cef75d9f":"myCardDividends()","cef7a4d0":"LogTemplateSet(address,address,address)","cef7e760":"initialCaps()","cef887b0":"storeBlockWithFee(bytes,int256)","cef8d343":"buyShare(uint256,bool)","cef94360":"updatefundingEndTime(uint256)","cef9601f":"timeTillNextSteal()","cef9ca6b":"ThreeDLPrivate()","cef9db6d":"TOKEN_SUPPLY_TOTAL()","cefa624b":"getPlayerAirdropGameData(address)","cefa80fc":"foundersTeam()","cefaba7f":"prc(uint256)","cefad386":"_accountOkayChecks(bytes32,uint64)","cefb09b6":"getBrokerInfo(uint256)","cefb3605":"vaultToWallet()","cefce1f2":"GameOver(string)","cefd2239":"unlocktoken(address,address,address)","cefddda9":"isGenesisValidator(address)","cefdfcf3":"testControlRetractNotRetractable()","cefe23dd":"HarjCoin()","cefeb6f7":"MeshPointManager(int256)","cefed526":"Atlantide(uint256,string,string)","ceff149b":"getRoundLuckyPot(uint256)","ceff6fe6":"cancelApproveForAddress(uint256)","ceffbaf1":"isReleaseApproved()","cf0023ec":"pvt_plmt_max_in_Wei()","cf007460":"nextClaim(address)","cf00c197":"stageOneEnd()","cf00cba0":"BlocksquareSeriesA()","cf00d4b9":"prizePoolPercent()","cf011b26":"excludedAddresses(address)","cf02ba9d":"optionsPerShare()","cf034b1d":"transferFromTrustedContract(address,uint256)","cf03e589":"Registered(address,string,address)","cf03f5f4":"activateMasterKey(address)","cf04dd7e":"DAPSTOKEN()","cf04fb94":"changeVerifier(address)","cf054fb2":"hardCapAmount()","cf0682bc":"warning()","cf06b141":"assertEq17(bytes17,bytes17,bytes32)","cf06b3ba":"KOIOSToken(string,string,uint256,uint256)","cf071005":"showLastPoolAddress(address)","cf07fbb6":"HUToken()","cf082176":"ETHERION()","cf083591":"listAllAttendants()","cf086765":"getPatronsCount()","cf094497":"betCount()","cf09c6dd":"lastBlock_f10Hash_uint256()","cf09e0d0":"createdAt()","cf09e6e1":"SetBigContract(address)","cf09e820":"getPropertyOwnerSalePrice(uint16)","cf0a07b2":"Choon(address,address,address)","cf0a50d3":"DopeToken()","cf0aed0e":"setMinimumBuyValue(uint256)","cf0cb613":"finalUnlockTransfer()","cf0dbc27":"getH2Bidder()","cf0e4076":"findAddress(address,address[])","cf0e4be5":"eggsInTimeSlot(uint8)","cf0e80fe":"getClaimedBalance(address)","cf0f0593":"shl8(uint8,uint8)","cf0f34c4":"setMaxDuration(uint256)","cf0f864e":"battleCardIdRange()","cf0fc7d5":"_fetchOrderByIdWithMerchant(string,address)","cf0fdacb":"getRarityBonusValue(uint256)","cf100287":"payToManager(uint256)","cf112453":"canUpdateNextGameInitalMinBetSize()","cf124ba3":"tokenSaleIsFinished()","cf1259d8":"badge_obj()","cf12789a":"percOf(uint256,uint256)","cf12b725":"releaseTokenPrivate()","cf12d99f":"xorexs()","cf12e870":"giveAccess(address)","cf134a06":"totalLicensePurchases()","cf136426":"IagonTestToken()","cf1405fe":"firstDay()","cf14b191":"recoverAddressOfSigner(address,address,uint256,uint8,bytes32,bytes32)","cf14cecc":"whitelistMaxTok(uint256,address)","cf1578dc":"getOwnerFunds()","cf157942":"endsigning()","cf158fe9":"scheduleTransaction(uint256,uint256,uint256)","cf15b87d":"IcoCompleted()","cf160cf2":"addModerator(address,string)","cf16b4a2":"_packPlayerData(address,uint256)","cf16cc83":"getRoundStart(uint256)","cf16e955":"buyOnBehalf(address)","cf187228":"_createChar(string,address,uint256)","cf187df1":"addFrozenBalances(address,uint256)","cf18811f":"getTrusteeIndex()","cf1893de":"TimeBasedContract()","cf191540":"retraitStandard_5()","cf19463d":"newPokemonMaster(address)","cf195101":"Zchain()","cf195e34":"issuedToDate()","cf1a6243":"MIOTCrowdsales(address,address)","cf1b037c":"registerCallback(address)","cf1b11e8":"tokensPerWeiPlusBonus(uint256)","cf1b3f08":"withdrawTop(uint256)","cf1b45c3":"User(address,address)","cf1c13ce":"setBonusRate()","cf1c316a":"addAuthorized(address)","cf1c9f52":"pauseDET()","cf1cd249":"secureSend(address)","cf1d21c0":"ETHER_ADDRESS()","cf1d567f":"cosmicDice()","cf1d8294":"setPresaleParticipantWhitelist(address[],bool)","cf1e3bcb":"projectReserve()","cf1eba78":"promoMap(bytes32)","cf1ec58d":"usdPerEthLog(uint256)","cf1edfea":"checkIfLockCanBeRemoved(address)","cf1ee6f9":"OVISRESERVED_TOKENS()","cf1eef50":"UpdateRateAgent(address)","cf1f335e":"sendLiquidityFund(address,uint256)","cf1f3dd7":"ledgerName()","cf200e9f":"getBalancesSeller(uint256)","cf202727":"myfirsttoken()","cf20ac40":"citadelBalance()","cf210e16":"restrictedAcct()","cf216207":"tokensToTransfer(address,address,address,uint256,bytes,bytes)","cf21977c":"mint(address,uint256,uint256,uint256,uint256,string)","cf225109":"getSellAgents(uint256)","cf22c803":"Election(bytes32[],uint256,uint256,uint256)","cf2317d5":"nBallots(bytes32)","cf235743":"whitelist(address[],uint256[])","cf23616e":"enableTimelock(uint256)","cf25e4e8":"getActiveBusinessesPerType(uint256)","cf26ac9b":"getLinkOwner(address)","cf27539e":"LBL(uint256,string,string)","cf278430":"split(address,bytes32,uint8,uint256)","cf279ff1":"inserirOuvidoriaNoCadastro(address,bytes32,uint8,bytes32,bytes32,int256)","cf27d016":"isInGracePeriod()","cf282878":"_createNode()","cf2887e5":"transferTo(address,address[],uint256)","cf28b18e":"p_update_tokensRewardsAllocated(uint256)","cf295a5c":"mintbuy(address,uint256)","cf299d04":"joinPre()","cf2a8612":"two(uint256)","cf2affca":"changeRequiredAdmin(uint256,bool,bytes)","cf2b16d9":"Game(address)","cf2b3b47":"createRoomQuick()","cf2b8c05":"getRealisation_effective()","cf2c52cb":"deposit(address,bytes)","cf2d03ae":"minJump()","cf2d31fb":"register(bytes32,string)","cf2d5d66":"TestSelfDropToken()","cf2d5eb4":"ICO_TRIGGER()","cf2d923f":"ADVISORS_AND_CONTRIBUTORS_ADDRESS()","cf2e011e":"link(string)","cf2e161c":"DOWN_winBets()","cf2e3efc":"GetBankAccountBalance()","cf2e80cc":"_setSentReveal(uint256,address,bool)","cf2f856e":"gracePeriodMinTran()","cf2f9a4a":"transferTokenContractOwnership(address,address)","cf2fb7ca":"setDIDTokenAddress(address)","cf3006a1":"setEthPriceInDollar(uint256)","cf309012":"locked()","cf310642":"Police_1()","cf314b6a":"verifyAccount(address,bool)","cf317b7e":"getSellerInfo(address)","cf31e9fe":"getOutputHash()","cf31ff86":"isAddressValid(address)","cf32b062":"deadlines()","cf32b957":"LockInventory()","cf33babc":"VotingStarted(uint256)","cf351c1d":"setFeeTokenAddress(address)","cf35238a":"googleSupply()","cf356f83":"parcelGzeWithBonusOnList()","cf357364":"getOrderType(bytes32)","cf35bdd0":"assets(uint256)","cf35f275":"transferFromStakedisbursementfund(address,uint256)","cf3630b4":"setNextStartTime(uint256)","cf36fe8e":"bobMakesEthPayment(bytes32,address,bytes20)","cf3743c6":"DuxToken()","cf38b609":"priceChibi()","cf397201":"addLockedTokeA(address,uint8,uint256)","cf39bff5":"accoutToSummonNum(address)","cf3b1967":"TOKEN_DECIMALS_UINT8()","cf3b70e6":"CreatedIAM(address,uint256)","cf3c6fd3":"distributeFounderTokens(address,uint256)","cf3ca0fa":"blockDotGasLimit()","cf3cb33f":"exchangeToken(address,uint256)","cf3d1e3c":"sellOffline(address,uint256)","cf3d29ea":"SNTMock(address)","cf3d3849":"getNumInvalidMarkets()","cf3d82e5":"setMaxStage1AllocationPerInvestor(uint256)","cf3e172b":"getTokenInfo(address,bytes32)","cf3e194d":"calculateMultiplierAfterConversion(address,uint256)","cf3e52b8":"ValidateWorldSnapshotInternal(uint256)","cf3e52d9":"topWizard()","cf3e9519":"lrcUnlockPerMonth()","cf40bb58":"currentTimeIndex()","cf40f290":"EventLuckyNumberUpdated(uint256,uint256,uint8)","cf4186cb":"rejectMint(uint256,uint256)","cf41d6f8":"getPaid()","cf4228ea":"isSignedByAll()","cf4246a6":"ethereum2USDprice()","cf424b16":"releaseForSeed(address,uint256)","cf427d1b":"currentPenalty(address)","cf4315bb":"MINBET_perROLL()","cf43f4aa":"TrustedhealthToken()","cf44f5f7":"updateKeyMasks(uint256,uint256,uint256,uint256)","cf456865":"createCompany(bytes32,bytes32,uint256)","cf45f83b":"MADToken()","cf460fa5":"right16(uint256)","cf462616":"isVestingSet(address)","cf464997":"safeAssert(bool)","cf46827e":"getStakingMetrics(address,bytes32)","cf46bd24":"TransferContractOwnership(address,address)","cf46db5b":"isAllowed(uint8,address)","cf46dca7":"setProducer(address,bool)","cf47810c":"deleteAvatar(uint256)","cf478921":"addSpecialFeeTake(address,uint256,uint256)","cf47c326":"generateCryptsyToken()","cf488329":"BITCASH(string,string,uint8,uint256)","cf48d1a6":"setVox(address)","cf4a1612":"scheduleTransaction(uint256,address,bytes,uint256)","cf4baa4b":"kemnagToken()","cf4c3eac":"reservedWeis()","cf4cc8fb":"BitBallCoin()","cf4cea67":"dateBonus(uint256,uint256,uint256)","cf4d3a88":"PeopleSeedCapitalCoin()","cf4d6c0b":"AcceptsHyperDivs(address)","cf4e593a":"getPlayedGameJackpot()","cf4e964a":"cardStructs(uint8)","cf4e9ec3":"endCallRequestDate(address)","cf4fab1f":"PERFORMANCE_FEE_RATE()","cf504d48":"projectActive(uint256)","cf509b9d":"gracePeriodAmount()","cf51ee7a":"removeValueBonus(uint8)","cf51f582":"NucleusVisionAirDrop()","cf52a7b2":"whiteListAddress(address)","cf52ab0b":"New(address,uint256,uint256)","cf5303cf":"checker()","cf530bc3":"LOG_NewBet(address,uint256,uint256,bytes32)","cf53951d":"test_registrationInformationAccurate()","cf53d630":"getBetInfoByID(uint256)","cf54aaa0":"getDecimals(address)","cf561cea":"TestKToken()","cf564ab5":"getVehicleByAddress(address)","cf5713b6":"whatsMyName()","cf58802f":"getOverview(uint256,uint256)","cf58a045":"memberBuyToken()","cf58fbeb":"test_insert_findWithHintNextRemovedUpdateTail()","cf5ae516":"PauseICO()","cf5b5a77":"medalUnFreeze()","cf5b8018":"summSupporters()","cf5b90f0":"sendToken(address[])","cf5ba53f":"create(bytes)","cf5bd8e6":"EthBlockExplorer()","cf5c1b52":"setForSale(uint256,bool,uint256)","cf5c2ac7":"usdCentsBalance()","cf5c8b99":"CuratorRules(address,address[])","cf5cb132":"getRegisteredAssets()","cf5d4e4d":"BarterCoin()","cf5d57db":"changeReward(uint256)","cf5e36df":"getWeiContributed(uint16,address)","cf5f2201":"unMinedPop()","cf5f87d0":"updateConsumable(uint256,uint256,uint8)","cf6036fd":"length(bytes1)","cf62277c":"ThePiContract()","cf62d4e3":"changeMaxBetDoubleDice(uint256)","cf6304d4":"endPreTokensale()","cf6346cb":"presaleMinValue()","cf63bb83":"neymarHasMinted(uint256)","cf63edea":"tokenIdExist(uint256)","cf64c42f":"endCrowdsalePhase1Date()","cf64da7f":"HOVERCRAFT_TYPE()","cf652d1d":"setDefaultBoxNumber(uint256)","cf654886":"getHeroLevel(uint256)","cf65952c":"deactivateDevice(address)","cf662b5e":"JGCoinOld()","cf665443":"nextMint()","cf6661fb":"getNativeAsset()","cf67805c":"MumsTheWord()","cf682b3c":"VMVToken()","cf69318a":"left60(uint256)","cf693418":"_teamJackpot(uint256)","cf69443c":"getCurrentUserTotalReward()","cf69df28":"getDataRequestLength()","cf6a8722":"removeBytes32(bytes32)","cf6ad876":"cancelAgreement()","cf6b1081":"proxyGetRefund()","cf6b3822":"WatchCollectedFeesInSzabo()","cf6b70cf":"many_payments()","cf6b8bbf":"XYT()","cf6bd8b9":"view62()","cf6d06a1":"transferFree(address,uint256)","cf6e4488":"custodianChangeReqs(bytes32)","cf6efb49":"getCdRate()","cf6f3fe4":"distance_driven()","cf6fbb9d":"Mint(address,uint256,uint256,bytes32)","cf6fbeea":"takeAway(address,address)","cf6fcbb0":"calculateAveragePixelPrice(uint256,uint256)","cf7018d4":"setAdURI(uint256,string)","cf70ba36":"tokenZNT()","cf710b34":"showTeam()","cf710b73":"test_setMaxSize_update()","cf72085f":"deliverTokensBatch(address[],uint256[])","cf7209c5":"KyberHandler(address)","cf724096":"transferEthers(address,address,uint256)","cf72b511":"get_refund_deposit_addr_amount(uint256)","cf7315c6":"retract(bytes20)","cf731bd7":"Temgean()","cf73a1bc":"managerAddress()","cf756935":"determineLuckyVoters()","cf763d1c":"periodLimit()","cf76a3b9":"TokenState(uint256,uint8)","cf76cb7d":"simInstallments(bytes)","cf76ebf9":"carsGifted()","cf7730f1":"reserveFundSupply()","cf775255":"configureDomainFor(string,uint256,uint256,address,address)","cf77c8db":"setAffiliateContract(address,address)","cf78044d":"setMaxIndex(uint256)","cf783d8a":"allAccounts()","cf78a450":"unlockBBK(uint256)","cf78cf0d":"ContractCreated(address)","cf7956ab":"SIEToken(address,address)","cf79d8b4":"completeRemainingTokens()","cf7a8965":"steal()","cf7aebea":"transferAntique(address,bytes32)","cf7b38a2":"resumeCollectToken()","cf7b8c5f":"player_count()","cf7bb192":"canStakeExisting(address,bool,uint256,uint256,uint256,uint256,bytes8,uint256)","cf7c2985":"setAuctionPriceLimit(uint256)","cf7c2b31":"paymentOf(address)","cf7d0304":"MintableLazyCoderToken()","cf7d23a3":"Withdrawn(uint256,address,uint256)","cf7dcc15":"distributeEth(uint256,uint256)","cf7e01ba":"ICO1Period()","cf7e06cb":"setCapForParticipants(address[],uint256[])","cf7e69f8":"changeCooldownIndex(uint40,uint16)","cf7e9242":"getAgreements()","cf7efb4c":"SketchMarket()","cf7f12ea":"getBidCountForSketchesWithHolder(address)","cf808000":"iWantXKeys(uint256)","cf81377d":"eosDASH(uint256,uint256)","cf813e3f":"getLockTime(uint8)","cf81978b":"recipientMIT(address)","cf81f24d":"iWannaLiveForever()","cf820461":"txFee()","cf82601b":"removeInstitutionAsset(string,string)","cf82731f":"getPic(uint256)","cf832ce2":"ownerRefundPlayer(bytes32,address,uint256,uint256)","cf837fad":"contractLock()","cf8407c9":"registerFund()","cf854969":"rate1()","cf866d6f":"LastProposalCanDiscard()","cf86a95a":"transferMintership(address)","cf876b72":"setAccountUrl(string)","cf879e83":"isRevoke(address,address)","cf881ad9":"fUseAmount()","cf88eebe":"enableBuyBackMode(address)","cf8951d1":"CollateralTransfered(uint256)","cf89744f":"MaxBetUpdate(uint256)","cf89956e":"Base(uint256,string,uint8,string)","cf8a24de":"emulatePurchase(address,address,uint256,uint256,uint256)","cf8bc918":"getCrowdsalesLength()","cf8c9cc8":"submitTransaction(address,address,uint256,uint256,bytes)","cf8d652c":"tokenCreationRate()","cf8d8ca0":"walletName()","cf8e9996":"MuellerFiredby51()","cf8eb597":"AccountIsFrozen(address)","cf8eeb7e":"subBalance(address,uint256)","cf8f4d4f":"getParticipantRegistry()","cf8f8f12":"finishICOInternal()","cf8fee11":"getBasicRate(address,bool)","cf904e7d":"delCertAdmin(address)","cf9057f7":"findNextYear(uint256,bytes4)","cf905858":"hasIdentity(address,address)","cf90bfc9":"DatPayToken()","cf90e741":"Presale(uint256,uint256,address)","cf910b37":"_getRandom(bytes32[4],uint8)","cf913ae7":"setKoikeToken(uint256,address)","cf914a87":"ownerSetOverride(address,bool)","cf91e331":"TransferGenesis(address)","cf92e19b":"maxPlayableGameId()","cf934d67":"newIndex(bytes32,uint256)","cf934fb8":"sendToBeneficiaryContract()","cf94e395":"set_hosp(uint256,string)","cf951c9f":"initAsset(uint256,string,string,string)","cf9530d0":"totalSupplyOf(address)","cf957ce0":"ROSCA(uint16,uint128,uint256,address[],uint16)","cf9676c1":"setMintRequestUintMap(uint256,int256,string,uint256)","cf96ce03":"setHouseEdgePercent(uint256)","cf9779cd":"accountFor(address,bool)","cf984f16":"testFailRestartEnforceRevisions()","cf98e120":"calculateStagePrice()","cf991259":"BRANDS_ADDR()","cf99a4d9":"buybackTypeTwo()","cf99cd2e":"iterateThroughSwarm(address,uint256)","cf99d935":"finalizeIfNecessary()","cf9a60d4":"ETH_USD_EXCHANGE_RATE_IN_CENTS()","cf9ac727":"logPrice(address,address,uint256)","cf9ac928":"bbd36484()","cf9b62d9":"OwnerOf(uint256)","cf9b9e0a":"FDCToken()","cf9d33d8":"GeniusInvest()","cf9df5eb":"insert(address,address,address,address,uint256,address,bytes32,uint256)","cf9f3db2":"PresaleTimeRangeChanged(address,uint256,uint256)","cf9f5ef6":"MANW()","cf9faf1d":"ownerSetRate(uint256)","cfa0136f":"setPresaleEndTime(uint256)","cfa01baf":"prepareForEarlyFinalization()","cfa059ee":"getIssuanceIds(bool,bool,bool,bool,uint256,uint256)","cfa06700":"_emitAccessBlocked(address,bytes32)","cfa084b0":"setTransferOwnership(address)","cfa12510":"returnHash(address[2],uint256[7])","cfa24ee3":"setFighterCoreAddress(address)","cfa3bfce":"_validateLockupStages()","cfa3c132":"parentOf(uint256)","cfa446ec":"Standard_2()","cfa46990":"getSellUnicornFullPrice(uint256)","cfa4a6a6":"getPools(bytes32)","cfa4f3e8":"setRelease(uint256)","cfa517df":"getOwnerByAnimalId(uint256)","cfa5cfd3":"balanceInSpecificTier(uint256)","cfa5d53b":"blocktubeTransfer(address,uint256)","cfa5df4b":"swapAbleToken()","cfa5f02a":"exchangeETH()","cfa675cc":"_revealBid(bytes32,address,uint256,address,address,address,uint256,uint256)","cfa7074b":"BuyRateChanged(uint256,uint256)","cfa75d43":"developer_add_string_B(string)","cfa83079":"minHpDeducted()","cfa86845":"RedeemingTimeLimit()","cfa9fa85":"percentageHumanityFund()","cfaa234c":"_isNotMixing(uint256,uint256)","cfaa759d":"privateIcoStartTime()","cfaaa266":"TransferOwnership(address)","cfaaff4c":"ADZbuzzCommunityToken()","cfab3056":"guesses(int256)","cfab472f":"isUserEnabledForContract(address,address)","cfab6554":"sumElements(uint16[])","cfab8862":"pfcController()","cfabe67b":"acceptVestingTrusteeOwnership()","cfac2280":"uniqueJingles(bytes32)","cfad5277":"totalAddresses()","cfae2c65":"dispenseTokensToInvestorAddressesByValue(address[],uint256[])","cfae3217":"greet()","cfae52e1":"createFirstDay()","cfaed1e2":"minAllowedBetInEth()","cfaf7315":"BuyEggs()","cfaf8a33":"sellTile(uint256)","cfb009cf":"Obredis()","cfb079d3":"DX()","cfb27084":"switchAirDrop(bool)","cfb3647b":"tokenMinter()","cfb3a493":"getMyBounty(uint256)","cfb3b886":"jack_nonce()","cfb45e3c":"_cancelOperation(bytes32,uint256)","cfb51928":"stringToBytes32(string)","cfb5a5f8":"getShare(uint256)","cfb64dfc":"addCustomerFromProviderAdmin(address)","cfb6e9af":"LogBet(address,uint256,uint256)","cfb75c92":"slavenAdress()","cfb7b9e9":"PROM()","cfb9147d":"exploreFastenETHFee()","cfb9e26f":"getStateOfPlan()","cfba0279":"hasSkill(address,uint256,uint256,uint256)","cfba24ac":"isSenderBiometricLocked()","cfba4fe0":"findBalance(address)","cfba99dc":"getQuoteAsset()","cfbb2047":"currentSmartSpeedNumber()","cfbb4b24":"Invent()","cfbb7d36":"teamWithdraw()","cfbb9f37":"DOW_THU()","cfbbbd9e":"PASS()","cfbbd902":"calcWinNumbers(string)","cfbbda3d":"seekApproval()","cfbd4885":"revokeMinter(address)","cfbe2cb3":"walletDeposit(address,uint256,uint256)","cfbed755":"getCard(uint64)","cfbef67d":"extract(bytes,uint256)","cfbf92a9":"getNodeStake(address)","cfbf9a36":"getBetRecord(uint256)","cfc05b56":"setTokensSoldGoal(uint256)","cfc0cc34":"getStrategy(uint256)","cfc19710":"closeMtr()","cfc220b6":"SpermLabs()","cfc2a93e":"dividendRoundsBeforeFoundersStakeUnlock()","cfc2aad2":"generateBonusForGene(uint256)","cfc41c91":"reb()","cfc450af":"maxInvestmentInWei()","cfc45610":"Makindo()","cfc4af05":"blt()","cfc4af55":"tau()","cfc4d0ec":"getOrderHash(address[5],uint256[6])","cfc54848":"sendEth(uint256)","cfc5a969":"bytesToUint(bytes32)","cfc5e7c8":"getSellCount(address)","cfc72007":"selfdestruct(address)","cfc7e2da":"getMinAmount()","cfc9cb7f":"ForestingToken(address)","cfca375c":"NooCrowdsale()","cfcb2b7e":"createController(address,address,address,uint256,uint256,uint256,uint256,uint256)","cfcb69d1":"TelegramTON()","cfcba2f8":"firstRefundRoundFinishTimestamp()","cfcc09a9":"simpleICO(string,string,uint8,address,uint256[],uint256[],int256)","cfcc57ad":"maxFundsThatCanBeWithdrawnByOwners()","cfcc7720":"rechargeRobot(uint256)","cfcccb32":"escrowList(address)","cfcd84a9":"collectibleIndexToPrice(uint256)","cfcd8c2d":"init(address,uint256,uint256,uint256,uint256,uint256,uint256,bool,address,bool)","cfcdde19":"PRICE_PREBUY_BONUS()","cfd00530":"isContractSignedBySigner(string,address)","cfd0a970":"TierClassicDividendAddress(address)","cfd129f8":"stageSoftcap(uint8)","cfd28966":"getMigrateOutDestinationValue()","cfd2eb49":"StoreComission(address,uint256)","cfd32aa0":"removeFunder()","cfd32ef7":"isMember(address,bytes32)","cfd3c17d":"currentLuckyStoneNumber()","cfd447d7":"startSale(uint256,bool)","cfd4ca6b":"contract_md5()","cfd4edcf":"ProofOf()","cfd550a3":"ICO_ENABLERS_CAP()","cfd56a13":"_sell(address,uint256,uint256)","cfd5cb77":"userAttackMonsterCDSeconds()","cfd65fdb":"assertEq19(bytes19,bytes19)","cfd6eea2":"QDCoin()","cfd7ab91":"STARTTIME()","cfd7be04":"backNewHopeOwner()","cfd7f1fb":"_chkBuyerLmtsAndFinl(address,uint256,uint256)","cfd8a175":"betPrice()","cfd8d6c0":"setProvider(address)","cfd938df":"Channel(string)","cfd94b01":"votersLen()","cfd9e0ea":"getStateForTime(uint256)","cfda7175":"getArbiterFeeAmount(uint256,uint8,uint256,address)","cfdac910":"getSketchesWithAuthor(address)","cfdacb58":"SetCryptoPrice(uint256,uint256)","cfdafde4":"saleIsFinished()","cfdb2eb7":"freeClaimAllowanceOf(address)","cfdb35ed":"setLKCExchangeRate(uint256)","cfdba320":"getRemainLockedOf(address)","cfdbf254":"MAX_BATCH_SIZE()","cfdd4520":"showCurrentBidValue()","cfdd7557":"CountOfAlastayaToken()","cfdd7e8a":"createFirstCommonsForum()","cfdf35b6":"removeLog(string)","cfe01e23":"anyAuditRequestMatchesPrice(uint256)","cfe0a5dc":"tokenKoef()","cfe0d487":"backup_finishIcoVars()","cfe0eeb7":"startSale(uint32,uint64,uint64)","cfe186b2":"finishGame(uint256)","cfe1887b":"delListReq(string,uint256,uint256)","cfe2b37a":"setIntF1ArrBoolF2AddressF1(int256,bool[],address)","cfe2f4e2":"Nicks()","cfe30939":"houseEarnings()","cfe3b8fb":"sTks(address,uint256)","cfe3d16d":"_register(address,address)","cfe3e683":"GWBCoin()","cfe4fb8e":"VECTORZILLA_RESERVE_VZT()","cfe52bdd":"sendFunds(address)","cfe5344a":"updateNovaAddress(address)","cfe60c87":"LookRevToken()","cfe643ac":"getRightAndRoles()","cfe67587":"getWeeklySellVolume()","cfe6f220":"CertificateAddresses(bytes32)","cfe7b770":"getBetInfo()","cfe7e7a0":"createLamboSale(uint256,uint256)","cfe8c535":"giveAnimals(uint8,address)","cfe9a7b8":"getPackageName(uint256)","cfea3bb6":"swapTokenInfo(address)","cfea751f":"getIsAllTransfersLocked()","cfeaa5ea":"setBonusList(address)","cfeaaca1":"newCampaign(string,uint256,uint256,address)","cfeb93a8":"delABaddress(uint256,address,address)","cfeb9a97":"setSubFreezingTime(uint64)","cfeb9ec0":"BSmartValueCirculateAssets()","cfebb88b":"recallVoteToFreezeFund()","cfebc813":"changeExplain(string)","cfebf24d":"optionOf(address)","cfec22f8":"minSum()","cfec6ca3":"calculateProfitGameType1(uint256,uint256)","cfec8d83":"GetUserPELOAmount(address)","cfec934a":"runCrowdsale()","cfecd73d":"EtherIncPrivate()","cfed9199":"timePassed(uint256)","cfedc04a":"neverdieToken()","cfee88db":"closeClaims()","cfefaa8b":"Executed(string,uint256)","cfefb3d5":"payout(bytes32)","cfefcfb0":"VotedForProposal(uint256,address)","cfefe48b":"transferableTokensNow(address)","cfefe5a2":"isContribPeriodRunning()","cfefeb60":"airDropTime()","cff068a3":"random(uint256,uint256,address,uint8)","cff07771":"getEvaluationCount()","cff0ab96":"params()","cff12797":"setIcoPhase3(uint256,uint256)","cff13efb":"newCar(string,bytes17)","cff1b6ef":"updateAdminFee(uint256)","cff29dfd":"bidders(uint256)","cff2fa42":"_returnFee(address,uint256)","cff382ae":"AICrypto()","cff3d4d8":"stage1()","cff410b4":"Exit()","cff4d6cd":"payoutTotal()","cff5b28e":"FLUX()","cff61fb6":"batchExchange(address[])","cff72e67":"changeDevelopersRecipient(address)","cff76d67":"totalEthBankrollRecieved()","cff82e22":"getTicketCount(address)","cff9293a":"vote(uint32,uint32)","cff941fc":"Configured(address,address)","cffa4346":"DIETCoin()","cffc9997":"SetBuildingData(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","cffdc976":"WithdrawOwnerFunds(uint256)","cffe02cf":"setCrowdsaleRate(uint256)","cffe764c":"Insure()","cffee328":"successfulDeals()","cfff25bb":"getNumReserves()","cfff63ca":"assignMediator(address)","cfff8974":"mintToInfluencer(address,uint256,string)","cfffa030":"lanch_atak()","d0005aa4":"salesStart()","d0008a6d":"addNewMember(address,uint256)","d000a404":"PT(uint256,string,string)","d001425a":"bank2()","d0015500":"ownerSecondary()","d002462b":"setDeploymentFee(uint256)","d002a41c":"getUnReportedMatches()","d00408b7":"StandardToken(address)","d0044f9a":"_getLuckyList(uint256,uint8)","d0045341":"totalMintAmount()","d0047acf":"mint(address,uint256,uint32)","d004f0f7":"swap(address,uint256)","d004f38b":"setRates(uint256,uint256,uint256)","d0064c00":"maxDebt()","d0068f80":"getClient(uint256)","d0072e59":"forceReturn(address)","d007c644":"payInterest(address)","d007ff4b":"showJackpotBalance()","d0089141":"ovedclaimBountyairdrop(address,uint256)","d008d7a2":"BosToken()","d00910a3":"yearlyTeamTokensPaid(uint256)","d0095cc6":"genNumber()","d00a9058":"getOwnTokens()","d00cce41":"roleExists(string)","d00d20f4":"getTokensCrowdsaled()","d00eef6a":"TokenGranted(address,uint256,string)","d00ef880":"setShareTokenAddress(address,address)","d01296d9":"addmember(uint256,address)","d0130009":"Subtraction(uint256,uint256)","d013a182":"getServerBuildingWeapon(uint256,uint8,uint8)","d0142c47":"ImperialCreditToken()","d014c01f":"enter(address)","d014d667":"XCDT()","d0158b87":"fetchCancelledOrdersForMerchantByAdmin(address)","d015d86f":"getRoundStats()","d015f6dd":"NorthPoleAddress()","d01678f0":"raiseDay2()","d0169c1e":"lockAsset(bytes32)","d0169f4c":"start_POSTICO()","d016ec40":"vipBrokerNum()","d017c2b4":"returnTokensToWallet()","d017cdcf":"acquireFame(uint256)","d017e20d":"processing(address,uint256,uint256,uint256)","d017f49b":"JustOneToken2()","d01860d0":"isFinishedSuccessfully()","d018a00f":"redeemBeer(bytes32)","d018db3e":"attack(address)","d0198c33":"getFunctionIdentifier(string)","d019d2c4":"MRT()","d01a69c9":"totalBeneficiaries()","d01a9453":"BitAirToken(address,string,string,uint256,uint256)","d01ab2e6":"_cancelOrder(address,address,uint256,address,uint256,uint256,uint256)","d01ab31a":"ICOStart()","d01b555d":"setSalePause(bool)","d01bbdc9":"setOracleCallbackGasLimit(uint256)","d01c0904":"FujintoToken(uint256,string,uint8,string)","d01d0175":"StorageConsumer(address)","d01d6b86":"amountOfRegisters()","d01e2df9":"testContains()","d01ec886":"importPresaleContribution(address)","d01f4c9f":"hoursSinceTimestamp(uint256)","d01f4ffe":"stopSecondSale()","d01f63f5":"getWhitelist()","d02041f3":"advisorsPeriodAmount()","d02042a3":"relief()","d020ae40":"gameTotalGen()","d020dc3b":"rejectMessage(uint256,string)","d02143ed":"getRefToLength(address,address)","d0216dce":"XXXXXXXX07(address)","d021d8da":"Coinbase()","d0220b1c":"setCreateChampFee(uint256)","d0225e9e":"MAX_LRC_DEPOSIT_PER_ADDRESS()","d0237ab8":"EtherLiteSupply()","d023d2bd":"getGladiatorChestPrice()","d023d32c":"setEndAfterSecond(uint256)","d024768f":"computePropertyHash(string,string)","d024cd02":"startAuctionDirect(uint256,uint256,uint256,uint64,address)","d02528e6":"GetGameIndexesToProcess()","d02721cb":"withdrawProvider()","d0280037":"buyin(uint8,bytes32,bytes32)","d0286ab2":"setEmissionTime(uint256)","d028754b":"Withdraw_1()","d028a625":"deathData_v11()","d028c246":"Compaq()","d028f571":"getTokenForTeam(address)","d0297bc6":"changeMaximumContribution(uint256)","d02982cf":"isMember()","d029a530":"buyUnicornWithCandy(uint256)","d02a4f84":"bcn()","d02a6db7":"TokenLongExercised(address[2],uint256[7],uint8,bytes32[2],uint256,uint256)","d02a9889":"getDateOfFirstPayment()","d02b1653":"enablePrivateFund()","d02b97aa":"withdrawPromoter()","d02bf162":"spinTheWheel()","d02bf828":"lotteryTokensWallet()","d02c438a":"enableTokenSupport(bool)","d02c8cdf":"cancelMatch(uint256)","d02cc69f":"playWar(uint256)","d02d08b2":"hasCrowdsaleFinished()","d02d1382":"getPlayerCard(uint8)","d02d3892":"ApolloSeptemBaseCrowdsale(address,address)","d02d4554":"createUser(address,address)","d02d518d":"setArtEvt(string,string)","d02dade4":"getProviderCounter()","d02ddc12":"insert(bytes1,bytes1)","d02e140a":"finalizePrivatesale()","d02e5cfb":"mtcDailySpent()","d02e8f70":"MONUMENT_CITY_FEE()","d02ea39e":"DuckToken()","d02ecbb5":"ObitanChainxToken()","d02f5463":"pillarTokenFactory()","d02f8b98":"getApplications(address,bytes32,address)","d02fcad9":"wdiv(uint128,uint128)","d0302051":"rewardPercent()","d031370b":"reserveTokens(uint256)","d0315658":"getShareDistributionWithTimestamp(bytes)","d031babf":"LikeCrowdsale(address,uint256,uint256,uint256)","d031d8c4":"_transferLand(uint256,uint256,address)","d032ae76":"doAirDrop(address[])","d033c456":"addAddress(address,string)","d033d277":"OwnerNamed()","d033e6ee":"preAllocate(address,uint256,uint256)","d033f913":"getRoundSeedHash(uint32)","d034536e":"logFileClosing(string,uint256,string,string)","d0356fa8":"createVestingGrants()","d035bed4":"validContract(address,uint32)","d035e45f":"token_escape(address)","d0360e59":"drainContract()","d036261f":"amountBonuses(uint256)","d036bce2":"_calculateTokens(uint256)","d0376283":"onlyApprovedOrOwnerOfToken(uint256,address,bool)","d0378d07":"decreaseReserve(uint256,uint256)","d038906a":"FloraFicToken()","d0399bb8":"endGame(uint256)","d03b41a9":"bountyBalance()","d03bf119":"RANGESTART_11()","d03c8e34":"addAngel(address)","d03cff97":"devMiningRewardPerETHBlock()","d03d5231":"raffleDraw()","d03d9604":"maskIt(address,uint256)","d03e1021":"ORACLIZE_GASPRICE_GWEY()","d03e3059":"someMethod3(uint256,uint256,uint256)","d03e6817":"Volkstest()","d03e9bcc":"LogReceiveFunds(address,uint8,uint256)","d03e9fff":"plusTourFreezingTime(uint256)","d03ffefb":"createDeposit()","d04148d6":"m_account()","d04206f3":"CROSS_RESERVE()","d042a795":"multiSendA(uint256,uint256)","d042ce2c":"currentStageTokensBoughtByAddress()","d04301f2":"Annexe_SO_DIVA_SAS_5()","d0431cf5":"_openBox(uint256)","d0435cb0":"MonsterTokenCrowdsale(uint256,address,address,uint256,uint256)","d043d028":"toBytes4(bytes,bytes,uint256)","d045e1ff":"_inverse()","d046065e":"addBet(uint256,uint256,address,uint256)","d0471ee1":"Leverages(address[])","d04737bd":"Yuzhuralzoloto_2()","d0479abc":"burnUnsoldTokens(uint256)","d047a0d0":"getEmergencyTransferSigner(address,uint256)","d04807e9":"Heronium()","d0481f82":"hasLicenseTerms(bytes32,bytes32)","d048bc87":"inAngelPeriod()","d048db37":"getOfferCount()","d04a419b":"getDegree(bytes32)","d04a46b0":"sendFutureExpanstionBalance(address,uint256)","d04b019e":"getWalletResourceBalance(address)","d04bfc9c":"buyer_pay()","d04c9115":"getLoyaltyPoints(address)","d04cb43f":"withdraw_all_token(address,address)","d04d26fe":"updateStrength(uint256,uint8)","d04d2ca3":"BlacklistParticipant(address)","d04d8667":"authorized_recordPlatformFee()","d04dbdea":"Testtoken4()","d04e5586":"MEAManager()","d04f0535":"PisticciCash()","d04fe107":"getActiveAds()","d050498e":"assertEq24(bytes24,bytes24,bytes32)","d050557d":"bulkRegisterPoA(bytes32,bytes32,bytes,uint256)","d05144c8":"getMakeCount()","d0516650":"frozen(address)","d0516b82":"maxPresaleAmount()","d051dfd3":"prizes(uint256,address)","d052fbf6":"getHistory(string,uint256)","d05391d2":"admin_transferFrom(address,address,uint256)","d05407d4":"SetStepFunctionWrapper(address,address)","d054261e":"_generateRandomHash(string)","d05461a6":"mintForReportingParticipant(int256,address,uint256)","d0549602":"scheduleTransaction(address,uint256,uint256,uint256)","d054cd87":"badBoardSent(bytes10,uint256,uint8,bytes32,bytes32,bytes10,uint256,uint8,bytes32,bytes32)","d0569bc8":"getWinResults(uint256)","d056cc69":"stateCode(uint256)","d0578df9":"SMGC()","d0587032":"tablet_length()","d0590bad":"generateMessageToSign(address,uint256)","d05b7ca4":"uintToChar(uint8,uint256)","d05ba4da":"addPokemonToSellingList(address,uint256)","d05c78da":"safeMul(uint256,uint256)","d05c9342":"_getATxToken()","d05c9ad6":"setNumRewardsAvailableForAddress(uint256,address,address)","d05cb545":"registry(address,uint256)","d05d996f":"TXDELAY()","d05ec6c5":"getBonus4(uint256)","d05ee727":"teamAccount()","d05efd40":"directorA()","d0600560":"AD()","d060a2a5":"doSmallDrop(uint256,uint256,uint256,uint256)","d0610ac9":"interpolate(uint256,uint256,uint256,uint256,uint256)","d0617f2f":"OMICrowdsale(uint256,address,address,address)","d062c7ab":"CleanBankerCandidate(uint8)","d06301d3":"__resolve(uint256)","d063f55f":"toLittleEndian(uint64)","d06426d5":"convertUsdToEther(uint256)","d0647f30":"_createDebt(bytes,bytes,uint256)","d06544d0":"getCoinAddress(string)","d0658850":"ListingDB(uint64,uint64,address)","d066c841":"GenesisBuyPriceHistory(address,uint256)","d06760da":"isPartOfOrg()","d0676647":"ProposalClosed(uint256,uint256,uint256,uint256,bool,uint256)","d06798f2":"fourweeks()","d0679d34":"send(address,uint256)","d0683428":"executeRulingA(uint256)","d0692775":"gamesLeft(address)","d06980f1":"LogHodlClaimed(address,address,uint256)","d06982b2":"setDemurrageAmount(uint256)","d0699c98":"calcFees(uint256,uint256,uint256)","d06a0f5b":"setDynamicCeilingAddress(address)","d06a57b0":"pauseAllTokens(bool,string)","d06a89a4":"maxLength()","d06b3ea0":"whackingPool()","d06b44a6":"YKCToken(uint256,string,string,uint256)","d06b6f7e":"setMinTokensToSale(uint256)","d06ba559":"WrestleCoin()","d06c54fb":"acceptNextOwner()","d06c7b5b":"signalToken()","d06c91e4":"multisigEther()","d06ca26c":"managedWallets()","d06cdc73":"LuckyNumberService()","d06d4612":"jak()","d06f887b":"destroyMyToken(uint256)","d06f9734":"setTreasurer(address,bool)","d0707c61":"PerformingDrop(uint256)","d0708e31":"DocumentCertoChainContract(string,string,string,string)","d071f7b1":"recover(bytes32)","d073c531":"IMOSToken()","d073ca3d":"SUCCESS_FLAG()","d074443f":"DeathFactor_i()","d0747a9c":"getGoldmintFeeAccount()","d074a38d":"biddingTime()","d074de8c":"Testico()","d074f215":"PHASE_1_PRICE()","d075c11c":"viewNoncsallocations(address)","d0774f74":"GENSIS_TOTAL_COUNT()","d077814b":"divBase()","d0785dd7":"getNumberOfPlayersInCurrentGame()","d07866d2":"sizeOf(uint256)","d0799bee":"setRole(string,string)","d07a8bd7":"RisingToken()","d07ac4c4":"oraclize_query(uint256,string,bytes[4],uint256)","d07adab3":"getOutAmount()","d07bff0c":"getVoter(uint256)","d07c53b6":"thinkMode()","d07e7d7c":"setTTCTokenAddress(address)","d07e9f90":"getJobsCount()","d07f29e5":"addFounderAccounts(address,uint256)","d07f2ff6":"GreenWorldFarm()","d07f3a8f":"RobBanker(uint8,uint256,uint256,uint8)","d07f8181":"decreasePaymentsBalance(address,uint256)","d07fdfb0":"October12_2017()","d081b681":"vows()","d081b9f5":"networkState()","d081f2b8":"BOUNTY()","d0821b0e":"bet(uint8)","d08275f1":"WolframAlpha()","d08279b0":"unpauseTournament()","d082ea8c":"setExchangeAddress(address)","d083955c":"adjustMintRates()","d084f670":"getLocked(bytes16)","d085835a":"timeLock()","d085b82f":"TIMECOIN(address)","d085c8b8":"StartDistribution()","d085e66e":"GetPart(bytes32,uint256)","d0863580":"blocksRemaining()","d0868223":"returnATXChanges()","d086a201":"main_ico(address,uint256)","d087d288":"getNonce()","d088070a":"checkWhitelist(address,uint256)","d088f50d":"getNumeroCeldas()","d0894297":"EARLY_INVESTOR_WALLET()","d0897347":"engrave(bytes32,string,string,bytes32)","d089e11a":"accountRegistry()","d08a787c":"bytes32ToString(bytes32,bytes)","d08b89f3":"disableStopping()","d08bc007":"logRef(address,uint256)","d08bfe26":"CrowdsaleClose(uint256,bool)","d08c6803":"deletePerson(uint256)","d08d66ec":"setBonusState(uint256)","d08d6753":"mdtRewardAmount()","d08e2354":"goldPercentage()","d08f2c67":"getHistoryAt(uint256)","d0900033":"COLONERToken()","d09119b4":"mortgage(address)","d0914c8d":"RelestToken()","d091b550":"newOwnerCandidate()","d0937598":"getLuckyblockBase(bytes32)","d09398ee":"transferCDP(address,uint256)","d093e04b":"payJackpot(uint256)","d0940a5d":"best()","d0946d00":"subFreeMineral(address)","d0949f99":"UINT256_MAX()","d094dd21":"getLLV_edit_14()","d095761f":"withdrawNetIncome()","d095d499":"profit3eggs()","d095edb2":"initializeModuleAddresses(address[])","d09677df":"TankSellMaster()","d09685b0":"getEntriesCount()","d096b8f0":"setupRaffle()","d0973af8":"transferTokensFromContract(address,uint256)","d09812e1":"settlementRegistry()","d0982feb":"tokenLockDuration()","d0983f4b":"tokenRatios()","d0988149":"MANHATTANPROXYMADISONAVE()","d0995198":"returnMinGoal(uint256)","d0995b33":"refundBalances(address[])","d09a6a62":"transferUnlock()","d09b0ae4":"RealEstate()","d09cb807":"isCurrentAdmin(address,address)","d09de08a":"increment()","d09e21ee":"ignore(bytes4,bool)","d09e3526":"setStatusI(address)","d09eae58":"SCAMToken()","d09edf31":"authorizer()","d09ef241":"getOrder(uint256)","d09f85ca":"Eventine()","d09f872a":"VenusToken(uint256,string,string)","d09f8b8b":"addXY(uint256,uint256,uint256,uint256)","d09fb45e":"setApprovedContracts(address,bool)","d09fbcee":"HumanTokenAllocator(address,address,address,address,address)","d0a05fea":"setI_S(uint256)","d0a06fb9":"cloneCard(address,uint256)","d0a1adf4":"contains(bytes1,bytes1)","d0a27473":"teamUnlock1()","d0a2da8e":"give(address,uint256,string,string)","d0a2f2c4":"getAllInvestors()","d0a45f84":"getVersionImplementation(address,bytes32,address,bytes32,bytes32)","d0a4a81b":"setTellerModerator(address)","d0a56299":"GetAssetTypeAverageSalePrice(uint256)","d0a579fb":"releaseForEarlyInit(address[],uint256)","d0a5eb4e":"setMainWallet(address)","d0a61995":"sell_(address,uint256)","d0a62566":"approveIndexed(address,uint256)","d0a63663":"incrementLimitBranch()","d0a6f018":"LogBalanceChange(address,uint256,uint256)","d0a6fa54":"getPriceById(bytes32)","d0a7b467":"setAragonDevMultisig(address)","d0a826f3":"setWildcardList(address,address,bool)","d0a835e3":"buyShip(uint32)","d0a8c801":"fshare()","d0aa0313":"setCompte_38(string)","d0aa407f":"withdrawEther(bytes32,uint256,uint256,uint256[])","d0aac5cf":"teamProfile(uint256)","d0ab0066":"calcFlexibleReward(uint256)","d0ab48e9":"toB32(bytes,uint256,bytes,address)","d0ab8432":"whitelistRegisteredAmount(address)","d0ac01ac":"setOfferExpiry(uint256)","d0ac2252":"getShipEarning(uint32)","d0ad7fb8":"buyTicket(uint256[],address)","d0ade72d":"assertEquals(uint256,uint256)","d0ae4356":"getRequestStatus(address,address)","d0ae9aec":"setMinInvest(uint256)","d0aff67d":"setNeverdieContractAddress(address)","d0b01e68":"__setBeneficiary(address)","d0b02abc":"createProductionUnit3()","d0b06f5d":"lastUpdated()","d0b0c0d5":"unlockDevTokenSupply()","d0b18fbf":"transferByForce(address,address,uint256)","d0b1b910":"FXSToken()","d0b2b579":"seedFund()","d0b368a0":"addToApproveList(address)","d0b3da99":"join(uint256,bool)","d0b4755c":"RATE_SALESTAGE1()","d0b52156":"getIpfsHash(address,address)","d0b5981f":"closePreICOPublic()","d0b68efb":"yoobaTokenAddress()","d0b6ba2a":"moveFunds()","d0b74806":"claimA()","d0b753f3":"sendPreSaleBonus(address,address)","d0b7ca57":"mintToken(address,uint256,bytes,bytes)","d0b83db9":"insertUser(address,bytes32)","d0b86d15":"FaradEscrow()","d0b91ca7":"showBurnedCoins(address)","d0b94ffe":"web3ViewRoll(bytes32,bytes32,uint256,uint256,uint256)","d0b99ee2":"_distributeLandholderTax(uint256)","d0b9e58b":"SspContract(address,address,address,uint256,string)","d0b9e792":"returnBorrowedEth()","d0bb1d40":"airdropsCount()","d0bc1a88":"addMoney(uint256)","d0bc97d0":"isCrowdsaleFull(uint256,uint256)","d0bcebc8":"collectBack3()","d0bcfc0c":"Bankroll()","d0bec975":"countBid(uint8)","d0bf4d95":"SmokeExchangeCoin(uint256,address,address,uint256,uint256,uint256)","d0bf9502":"btcLastUpdate()","d0bff051":"testSetBalanceDb()","d0c03f35":"multisigVault()","d0c0c39c":"countTokens(uint256,address)","d0c1c844":"getLimitedBalanceOf(address)","d0c1d117":"editAddressDescription(address,string,address)","d0c24e93":"setNotUpdatable(bytes20)","d0c3033c":"generalBounty()","d0c32dd3":"otcPurchase(uint256,address)","d0c32ea9":"SearchALLFileLength()","d0c39f14":"Lottery(address)","d0c412ec":"ENDOairdrop()","d0c426e6":"burnAllRemainingIBC()","d0c475e5":"addRecordStrict(uint256)","d0c5c585":"getBurnAmount()","d0c5c946":"refundBpToken(address)","d0c75ea2":"verifyCommonTransaction(bytes32,uint256,address,address,uint256,address,address,uint256,bytes,bytes)","d0c7b012":"placeGame(uint24,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes32,bytes32)","d0c7c635":"mintToTeamAndAdvisors()","d0c8a7a5":"randgen()","d0c9bb92":"releaseTCLRinTeamTokens()","d0ca12ba":"ICO_START()","d0ca1982":"getCrowdsaleInfo(address,bytes32)","d0ca4dd7":"ownerWithdrawTokens(address,address,uint256)","d0ca5e7a":"createTokenToMarket2020()","d0ca7379":"mintReferralShare(uint256,address,uint256)","d0cac952":"HouseManaged()","d0cb874a":"getTokenByMineID()","d0ccf4bc":"createInstance(bytes32,bytes32,address,bytes,bytes32,bytes32,address,bytes,bytes32,uint256,uint256,bytes)","d0ce659f":"SwitzerlandvsCostaRica()","d0ce7360":"closeContract(uint256)","d0cf49e9":"zoLastRefreshTime()","d0d0ed05":"withdrawVault()","d0d13e87":"smartContractIsForSale(uint256)","d0d1ea70":"setTrustee(address)","d0d2e745":"manualExchange(address,uint256)","d0d38b65":"setFirstRankForFree(bool)","d0d390bf":"HubToken(address)","d0d3b9df":"IfModuleRegist(address)","d0d3f5ba":"removeNode()","d0d44cca":"setPOOL_edit_34(string)","d0d511f9":"getGoalsCount()","d0d529a7":"openWindow()","d0d552dd":"setAsset(address)","d0d68241":"betALenght()","d0d832ad":"fundraiseType()","d0d89ce3":"cummulativeTokensSold()","d0d968c0":"burnFromReserve(uint256)","d0d98276":"revokeOffer(address)","d0d9e21d":"emitCapabilityAdded(address,bytes4,uint8)","d0d9fcf7":"RANGE_STAT_MAX()","d0da3e86":"getNextAntiReplayTag(uint256)","d0dad7e1":"maxCapMain()","d0db5083":"hatch()","d0dc0a04":"all_creatures_for_species(uint256)","d0dc5c65":"updateTotalSupply()","d0dd38ad":"setDepositGasCost(uint8)","d0de7b29":"MetadiumVesting(address,uint256,uint256,uint256,bool)","d0def521":"mint(address,string)","d0e075c7":"BitcoinPurple()","d0e0813a":"promote(address)","d0e0ba95":"setId(uint256)","d0e0e8f6":"isLockedConfig()","d0e2bef0":"initFactorReward(uint256,uint256,uint256,uint256)","d0e2dc64":"playAway()","d0e30db0":"deposit()","d0e33b1b":"testGetResults()","d0e3cbbe":"getCurrentTotalEther()","d0e3f734":"setPubkey(string)","d0e4567e":"activeGroups()","d0e46235":"buyCardsAndSendGift(uint8,address)","d0e4713d":"CEC()","d0e55727":"changeOfferTime(uint256,uint256)","d0e6cfec":"bountyTokenWallet()","d0e709b6":"initialTransfer(address,uint256,uint256)","d0e7a5cb":"editPrice(uint256,uint256)","d0e95ded":"MithrilOre()","d0e9f00f":"BNTBalance()","d0ebdbe7":"setManager(address)","d0ec057e":"getFeeAmount(uint256,bool)","d0ec1607":"cancelPoll(uint256)","d0ed5c2f":"walletContract()","d0edf912":"createTransaction(address,uint256,uint256,uint256,uint256)","d0ee32c4":"getSymbolFromAddress(address)","d0ef1048":"_getRand()","d0ef368d":"setAllocation(address,address,uint256,uint256,uint256)","d0eff891":"weiToEther(uint256)","d0f040c4":"checkOwnerAllowance(address)","d0f0efcb":"buyPredictXname(bytes32,uint8)","d0f13638":"minimumPrepaidClaimedPercent()","d0f15e9e":"WalletWithEmergencyTransfer()","d0f17d41":"contributionMaximum()","d0f2019c":"hasToken(address,address)","d0f3235d":"_transferAirdrop(address[],uint256,bytes)","d0f3aa80":"allowSale()","d0f46c0b":"getUsersContract()","d0f4f99c":"solvePuzzle(uint256)","d0f5f4cd":"getPixelColor(uint16,uint16)","d0f6fc40":"QuantityFactorSet(uint256,uint256,address)","d0f76bb8":"End3()","d0f7a601":"etherRate()","d0f817db":"getOrgCertificatesCount(address)","d0f86c9d":"getUser(int256)","d0f86ea8":"getMemoryRead(uint256,uint256)","d0f86fec":"ENKToken()","d0f87ce7":"periodPreITO_mainCapInWei()","d0f89c6d":"setWhiteBackersByList(address[],bool[])","d0f8c714":"add(bytes32,uint256,bytes,bytes8)","d0f8e6a4":"DelegationTransferred(address,address)","d0f96983":"composite(uint256,uint256,uint8)","d0f96f6b":"DigitalPadlock(string)","d0fa968a":"s14(bytes1)","d0fab480":"meg()","d0fb8909":"activations(address)","d0fbe7fe":"buyTickets(uint256[])","d0fc1e7d":"getFrequency(bytes32)","d0fc2782":"multisigs(uint256)","d0fc35cf":"StandardFormula()","d0fc899a":"presaleInvestorsETH(address)","d0fca0ca":"gogo(bytes,bytes,address[])","d0fe3e85":"releaseTokensTo(address)","d0febda9":"getModerator(address)","d0febe4c":"buyTokens()","d0fef78f":"Visor()","d0ffecaa":"setWhaleMax(uint256)","d10032dc":"getTokeRate()","d1013fec":"endTimeSale1()","d101d3b2":"timelock(address,uint256,uint256,uint256,bool)","d1026aa8":"YESToken()","d10271a1":"OxProtocol()","d103449c":"addURL(string)","d1037a11":"swap(uint256,address,address,address,address,uint256,uint256,bytes,bytes,bytes)","d1042e31":"getUserReward(address,address,bool,bool,bool)","d1047434":"getFactoryCount()","d1048bc9":"reserveVanityURLByOwner(address,string)","d104a136":"getBase()","d104bca2":"getUnitsAttack(address,uint256,uint256)","d1051a68":"DynamicToken()","d10523b7":"GoldenLightChainToken(uint256,string,uint8,string)","d105350b":"getLockedBalance(address,uint8)","d10541ab":"changeIdentityEthAddress(address)","d1058e59":"claimAll()","d1073bdb":"setBitwordsCut(uint256)","d107a5cc":"freezeAllowance(address,uint256)","d108177a":"removeEmployee(address)","d10865a7":"endSecondWeek()","d108b7d4":"KyberContributorWhitelist()","d108ffc0":"tokenToWei(uint256)","d1092be8":"transferAllowedDelete(address)","d1096155":"requireOnce()","d10a5e1d":"lockBalance(uint256,bool)","d10ac7eb":"balanceOfComisionDone(address)","d10adfe3":"setPricing()","d10aee9c":"mainPlayer()","d10bc924":"seeCurrentParticipants()","d10c3d1d":"removeFromInitialSupply(uint256)","d10c504f":"has_voted(address)","d10ceb47":"setConsolationRewardsPercent(uint256)","d10d42eb":"Dividend(address)","d10da303":"_createLinglongCatWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256)","d10db2e1":"addCar(address,uint8,uint16)","d10e10b3":"testCanFinalizeEndedSale()","d10e23c8":"ClothingCoin()","d10e73ab":"createIdentity(address,address)","d10e99fe":"mint(int256,bytes32)","d10f6de9":"_requestSignature(bytes32[8],bytes)","d1100691":"BookCafe()","d1104bd3":"SLRC()","d110f0e6":"LEGAL()","d1110c5f":"buyMicroKeysWithHandle(string,string)","d11127c0":"lastBlock_f18()","d1120db0":"size2()","d112cf30":"PCNCoin()","d114751e":"getWeightRange(uint256,uint256,uint256)","d1153f25":"bugFund()","d1159747":"PREICOstart()","d115cac6":"joinTournament(uint256)","d115f02d":"updateMinReward(uint256)","d116c8c4":"releasePayment()","d11711a2":"participate()","d1180c98":"Lotoblock()","d11831c3":"generateHash()","d1190b7f":"changeTransferStepLock(bool)","d1195c48":"transferNashOut(address,uint256)","d119db4c":"addScore(address,uint256)","d11bd1a6":"sendContingencyFunds()","d11bee0f":"STSTEST6()","d11cd4c6":"changeStartPrice(uint256)","d11db83f":"getPendingTransactions()","d11e77e4":"REIToken()","d11f13df":"numberOfParticipantsWaitingForPayout()","d11f5b9f":"VictorieumNewICOToken()","d11ffc55":"referralSupply()","d1206a29":"unlockRewardTokenMany(address[])","d120a284":"getBytesFromNumbers(uint8[3])","d120a4f2":"setUnderCollaterizedPosition()","d1211a71":"Solarex()","d1226567":"bulletAmount(address)","d1237220":"LogId(address,uint48)","d1239730":"mintEnabled()","d123b6e2":"ensureRegulated(address)","d1241e67":"getProductIdAt(uint256)","d125a7e2":"partialRefund(uint256)","d1260edd":"userDeposit(address)","d126ae0c":"TRLCOIN_DECIMALS()","d126dac4":"cashout(address,address,uint256)","d1279ea8":"AddTrust(address,uint256)","d127bb9d":"currentElement()","d12892e4":"setGiftMode(bool)","d128f2de":"cancelOwner()","d128fc20":"allocateTokensForFounder()","d1295eca":"ENDRoot()","d1295f13":"DTRACK()","d129ee38":"MediatedTransaction_Protection_Seconds()","d12a0a2e":"icoClosed()","d12a6049":"setWeiLockSeconds()","d12a7b42":"whitelistResolver(address)","d12b51c0":"changeUserEduExp(bytes32)","d12b88a6":"SelimToken()","d12c08bf":"EGGS_TO_HATCH_1BULLS()","d12c1e28":"badgesOf(address)","d12c7b52":"WarToken()","d12d5c47":"ReferredBonusTokensEmitted(address,uint256)","d12d9510":"DFTBToken()","d12e0b2a":"MultiOwnable()","d12f6938":"crowdSaleStatus()","d12f7029":"STARTING_PRICE()","d1301074":"grantTokenOwnership(address)","d13091ed":"newGoal(bytes)","d1314ee0":"getBroker()","d1315ea3":"ISRA()","d131a803":"FetchlastHacker()","d131ab1e":"UpdatedTokenInformation(string,string)","d131af30":"precisionMinimum()","d131dfb8":"setFirstStageStartsAt(uint256)","d13209f9":"unhold()","d132391a":"setSaleEndTime(uint256)","d132a8f4":"totalBuyTokens()","d132eb02":"ProposalPassed(address,address,uint256)","d13319c4":"getHash()","d1342958":"refuseKyc(address)","d134474c":"winnings()","d134f4aa":"challengeCanBeResolved(string)","d1351e94":"getRoundPlayerKeys(uint256)","d1354f64":"ReceiveTips(address,uint256)","d135ae6e":"isSignedByToly()","d135cc4b":"withdrawLocked()","d135df42":"CONEGTY()","d1366f17":"sellerRequestCancel(uint16,address,address)","d136a579":"claimEarlyIncomebyAddressRound(address,uint256)","d1375f76":"COIN_SUPPLY_ICO_TOTAL()","d1376daa":"getClosingLine()","d13782a7":"addStage(uint256,uint256,uint256)","d137874b":"getDiscount()","d1382092":"getNumTokens(address,uint256)","d1384eb6":"institution()","d13936fe":"connectOrderPrice(address,address,uint256,uint256)","d1397162":"icoOverview()","d13a3386":"withdrawSale2()","d13a64d3":"getYanCoefficient(uint256,uint32)","d13a73c4":"numberOfStages()","d13b54b7":"getGameAmount(address,uint256)","d13bf769":"foundersFundTimelock2Address()","d13c9c1e":"allocatePresaleTokens(address,uint256,uint256,uint256)","d13cb1fb":"fundings(uint256)","d13d1ace":"scheduleCall(bytes,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)","d13daa79":"TestTokenERC20()","d13e0808":"nextCommonTTMTokenId8()","d13e2a6a":"Wei_Remaining_To_ICO_Cap()","d13e5846":"tokenHolderCount()","d13e79ec":"getUSDRaised()","d13ea9ca":"setMinesPrice()","d13f092e":"setRaffleLimit(uint256)","d13f90b4":"initialize(address,address,uint256,uint256,uint256)","d13f9d55":"newIteration(uint256,string,bytes32,bytes32,bytes32,string,uint256,uint256)","d1407bec":"TraceCrowdsale()","d141138e":"getServerMoneyBag(uint256)","d14192ba":"numParameters()","d141b610":"MembershipPaid(address,uint8,uint256)","d1428e7a":"ratioFor(uint256,uint256,uint256)","d142bc5c":"individualWeiCollected(address)","d143dad0":"getLineSum(uint256)","d1442e93":"getStrField2()","d1472046":"CollectChips(address,uint256)","d14779c4":"signDigitalContract(string)","d1477f7b":"setInitialTokenValue(uint64)","d1479575":"creditcoinLimitInFrac()","d1482791":"updateInterest()","d148288f":"setHoldingPeriod(uint256)","d14ac7c4":"crowdSaleAllowance()","d14b2f9b":"addBonusToken(address,uint256)","d14b691d":"_resetReleaseTime(address)","d14cd233":"tokenSpread()","d14e1784":"paymentForWeek(uint256)","d14e62b8":"setCount(uint256)","d14ebab3":"NXE_Coin()","d14f17f7":"airdrop(address[],address)","d14f56f1":"moveUnsold()","d14f9219":"ham()","d150f835":"currentDonation()","d150fbe6":"convertToInd()","d151ec28":"getMadeTXFund(uint256)","d152865b":"getLastDIVDPeriod()","d15334a5":"firstVestAmount()","d15376a7":"lastBlock_f14()","d15392b2":"forceRelease(uint256)","d153ab40":"addMultipleTier1Members(address[])","d153b60c":"proposedOwner()","d153d118":"MyDice()","d1541264":"getManagerForCount(address)","d1555f1f":"approveCommitmentTransfer(address)","d1558b7c":"referrersCount()","d155908b":"addone()","d155feec":"EdisonCoin()","d156549f":"setExpiredAndWithdraw()","d1571996":"multisigOwner()","d1572e4c":"setResource(string,string,address)","d1577656":"purchaseTo(address)","d157e816":"MiningExtended(uint256,uint256,uint256)","d157f27d":"sendAdvisorsSupplyToken(address)","d157f645":"setPaymentInterval(uint256)","d1594403":"manualTransferTokensTo(address,uint256,uint256,uint256)","d15b506b":"TokenROC()","d15b95b4":"delegateDklBidAuction(uint256,uint256,bytes,uint256,uint16)","d15b9614":"GetLogMessageError()","d15c11e5":"providerRegistry(address)","d15c82e3":"reserveManyTokens(uint256[],uint256,address)","d15cfa25":"ChronoMint(int256,address,address,address)","d15d2745":"CLE_Beta_Pictoris()","d15d62a7":"getLibrary(uint256)","d15db5fb":"_computeBackground(uint256)","d15e06a0":"registerCrowdsales(address,uint256,uint256)","d15e1014":"marketingTokensPercent()","d15e9459":"stopAddressesTotal()","d15ecbc2":"simulatedBlockNumber()","d15ee9ff":"setUsersCanTrade(bool)","d15fc954":"wallet_Address()","d16058df":"getPayOrderKey(uint256)","d1613036":"releaseTokenTransfer(bool)","d1613731":"adminGetBalance()","d1614df3":"individualMinCap()","d1615300":"startWeekTwo()","d161b56a":"tokensMintedDuringICO()","d1631361":"ms0()","d1632f67":"assignFundReceiver(address,uint256)","d16352af":"getProtocol()","d163b764":"row(uint32)","d163fcab":"getCurrentHero()","d1650f7f":"test_oneValidEqStringNoLog()","d1651786":"donateUnicorns(uint256)","d165288e":"setAllowMining(bool)","d165d7cd":"registerNameXnameFromDapp(address,bytes32,bytes32)","d1660f99":"safeTransfer(address,address,uint256)","d166539b":"_migrate(uint256)","d16712ed":"maxGoalReached()","d16782f6":"testMetered()","d1682600":"StandardToken(uint256,string,uint8,string)","d16856ca":"addAdmin(address,string)","d16865a3":"PRIORITY_ADDRESS_LIST()","d168f699":"Glv(uint256,string,uint8,string)","d1698430":"revokeAllTokenGrants(address)","d169a020":"evMgmtIssueBountyToken(address,uint256,address,uint256,bool)","d169c869":"endOfPreSale()","d16a7a4b":"FreezeAccount(address,bool)","d16a8fe7":"kickMember(address)","d16a9624":"winBidEth(address,address,uint256,uint256)","d16b04cf":"myCoinAge()","d16b6473":"getOnTokenTransferToValue()","d16be71b":"teamTokensDelivered()","d16c4cf5":"FOUNDER1()","d16e1ded":"requestTransferItem(address,address,string)","d16e443a":"previousDelegates()","d16e92db":"createCrowdsale(uint256,uint256,address,address,address,address,uint256,uint256,bool)","d16edc15":"chargeFeePool()","d16f8669":"crowdsaleClose()","d16ff4c8":"nextCandidateId()","d1701397":"Flip1Token()","d17222dc":"CATContract()","d1724881":"getBroker(address)","d17291bd":"icoRunning()","d1729a4a":"sendTokensManually(address,uint256)","d172d6fc":"playFast()","d1734eac":"isInNextGeneration(address)","d173707d":"hasPhysicalAddress(address)","d1738b72":"wroomWroom()","d173d531":"Amalgam()","d173e578":"setInitialAllocationLock(address)","d173fc82":"setTokenAdmin(address,address,address,address)","d1746107":"teamTokenRatio()","d174c388":"tokensaleToOtherCoinUser(address,uint256)","d1759141":"massEthFund()","d175958f":"cancelApproveForAll(uint256)","d175d38d":"calculateBonus(uint32)","d176be98":"DonorCrowdsale(uint256,uint256,uint256,address,uint256)","d1776731":"userToRobots(address,uint256)","d1778ed7":"UltrixCoin()","d177e6a6":"fillOrder(address,address,uint256,uint256)","d1786610":"getTokenRemaining()","d1789176":"AMOUNT()","d179eb71":"clonedFrom()","d17a1b5b":"SetAccessType(uint32)","d17a79c1":"totalNormalEtherCollected()","d17aa842":"GetDivPerCoinLarge()","d17ab3c6":"free2Of(uint256)","d17be133":"getAllHousing()","d17cf29f":"retrieveWarriors(address,address,uint8)","d17d0d29":"SITExchangerMock(address,address,address)","d17d25de":"marketingTokenAddress()","d17e45fb":"s23(bytes1)","d17e4889":"decodeProps(uint256)","d17f5d9d":"indice_vincitore()","d17f7142":"isLocked(uint256,uint256,address,address)","d17fd539":"_newInterest(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","d1802d79":"mintEGAS()","d18063cd":"registerParticipantAgent(address)","d1809fe8":"depositLiquidateThePool()","d180be1d":"isMemberOf(address,address,string)","d180d0bc":"_deliverTokens(address)","d180ebca":"FinishIco()","d1812be7":"newCustomFutureLottery(uint256,uint256,address,uint256)","d18165f6":"OEN()","d1818aed":"setPresidenteDeMesa(bytes32,uint256,uint256,uint256)","d181c37e":"NecroToken()","d182b4ff":"CurrencyHedge()","d182d253":"ICO_PHASE1_LIMIT()","d183434d":"accountsBalances(uint256,address)","d1835b8c":"left21(uint256)","d184194b":"Smw()","d184935d":"getDebug()","d184adf6":"distributeToAddressesAndAmounts(address[],uint256[])","d184b88e":"AddedPrepaidTokensEvent(address,uint256,uint256,uint256)","d185c583":"ownerWithdrawFees()","d185f378":"_owns(bytes32,uint256)","d18611d6":"reactivate()","d1866019":"GetReferredCount()","d186659d":"setRateIcoMainSale(uint256)","d186899a":"issueAndLock(address,uint256)","d18746ed":"BonusChanged(string,uint256)","d188f550":"setPlayerGeneralLv(uint64,uint8)","d1893d23":"oldusesr(address,address)","d189b98d":"firstPrivateReleaseTime()","d189c1b0":"createUserByEmail(bytes32,bytes32,uint256)","d18a5563":"depositsStack(uint256)","d18ad4de":"getPlayerAff(address)","d18b07b2":"calculateCommission(uint256,uint256)","d18b93e6":"_owns(address,uint256,uint256)","d18c5da7":"FrogDaruma(address,address,address,uint256,uint256,uint256)","d18d944b":"setHardCap(uint256)","d18df96c":"vault_enableRefunds()","d18dfdc9":"parrot(uint256)","d18e031e":"verifyDeed(string)","d18e142d":"Announcements(uint256)","d18e81b3":"currentTime()","d18ffb8d":"inversorIsKyc(address)","d19003e5":"_endOfPreICO()","d1900a04":"TRCTotalSupply()","d191b336":"AdjustBetAmounts(uint256)","d191d7f4":"OPERATIONS_SHARE()","d191e11d":"rateSystem(address,uint256)","d192367b":"randomA()","d1925b80":"YACHT()","d1933a1b":"goalManagment(bool)","d19370bb":"resetKYC(address)","d193a0ca":"splitsSingle(uint256,uint256)","d1940a16":"announce(uint256)","d195bbd5":"AywakeToken(address,address)","d195ef83":"mintAdminApproval()","d195fd28":"RESERVED_BOUNTY_SIDE()","d1976a6f":"completeGame(uint256,uint256,string,address)","d19853c7":"exchangeBounty(address,uint256)","d1987a28":"setTradeRobot(address)","d1988b6a":"getGameHash(uint256)","d199168d":"claimedTokens(address,uint256)","d199c81d":"TokenSale(uint256,uint256,uint256,uint256,address,uint256,uint256,address)","d19b8d87":"refundManagerContractAddress()","d19b99b5":"turnMigrateOff()","d19c395f":"capPreICOTrasferred()","d19d1912":"getSelfGroupsContributedTo()","d19d8e1a":"Ethereumbonus()","d19e09ce":"setDefaultAccountingPeriodSettings(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2)","d19e1ad4":"_calculateNewPrice(uint256)","d19e2364":"addDonateTokenAddress(address)","d19e6cf0":"ChangeDeadLine(uint256,uint256,uint256,string,uint256)","d1a0cc5c":"processPayment(address,address,uint256)","d1a0e8c8":"setFeeRebatePercent(address,uint8)","d1a132f9":"enableNodeRegistration()","d1a1beb4":"mint(address,uint256,bool)","d1a1f5ba":"addSongData(string,string,string,string)","d1a2749c":"Crowdsale(address,uint256,uint256,address,address,uint256,uint256,uint256,uint256)","d1a2bfaf":"Wallet_Initial_Supply()","d1a2dfd2":"isExistingDataIdentifier(bytes32)","d1a3d3ad":"assertEq9(bytes9,bytes9)","d1a3fb20":"updateUserRatio(uint256,address)","d1a40ce1":"_rewardVote(address,address,uint256)","d1a4a98c":"BeBitcoin(uint256,string,uint8,string)","d1a61025":"tradeBookOf(address)","d1a634e6":"OVC()","d1a69455":"get_enode_by_row(uint256)","d1a75e0d":"VOTE_FOR()","d1a75fea":"createTreatyRequest(uint8,string,uint256)","d1a7d1a8":"MyPinerTokenTest2()","d1a8d447":"get_all_bet_values()","d1a94e58":"TXOtoken()","d1a9eb19":"withdrawToContractOwner(uint256)","d1a9f5be":"createFileWithContents(string,uint256,bytes32[],uint256)","d1aadb6a":"setColour(uint8,uint8,uint8)","d1ab0457":"AddSoftware(string,string,bytes32,bytes32,bytes32)","d1abdab8":"divideDecimal(uint256,uint256)","d1acb464":"CreatedLoan(uint256,address,address)","d1ae0488":"transferBecauseOfAggregate(address,uint256,address,uint32,uint256[],uint256[])","d1ae956f":"isPayed(uint256)","d1ae9607":"LFSTYLToken()","d1aea543":"forwardFunds(address)","d1af8a5a":"LinkerExample()","d1afaf1f":"addusertime(address)","d1afdb86":"buyAllowed()","d1b12b4e":"extCreateBot(uint256,uint256,uint256,uint256,address)","d1b1a22b":"set(string,uint256[],uint256[],uint256[],bool[],uint256[])","d1b1b65a":"rangeETHAmount()","d1b31a63":"cryptobank(bytes32,bytes32)","d1b33094":"addAccessor(address,uint8)","d1b33afa":"_calculateDayPass()","d1b39ae5":"decimalOffset()","d1b4ff7e":"multiAccessRevokeD(bytes32,address)","d1b5e2be":"testFailRegisterContractIdAgain()","d1b648cd":"contractSendGas()","d1b6a51f":"finishEthGetToken()","d1b6dd30":"airdropClaimed(address)","d1b7cb9b":"transferBatch(address[])","d1b878e9":"getresult(uint256)","d1b9c430":"OPEN()","d1ba656b":"minimumTransferInWei()","d1ba8257":"SIX()","d1baaf58":"communityRoundStartDate()","d1bab4cc":"batchApprove(address,uint256[],uint256[],uint256[])","d1baceac":"DepositBank(address,uint256)","d1bb0433":"preSaleTokensPurchased()","d1bb5cf1":"marketplaceContract()","d1bb7b59":"tokensPerWeiBonus111()","d1bb8688":"ICO_SHARE()","d1bba64f":"Investment()","d1bc2cc4":"transferGift(address,address)","d1bc4157":"KanZhang()","d1bc5c8e":"KryptoroToken()","d1bc62de":"EARLY_FOUNDERS_USD()","d1bc76a1":"recipients(uint256)","d1bcbf6c":"_isReady()","d1bd328b":"bonusFirstIco()","d1bd56c1":"TripleT()","d1bdf639":"cards_black_check(address)","d1be7cc4":"serverPortUpdate()","d1bf942a":"rok()","d1bf9aba":"nextRune()","d1c01b26":"Crowdsale(address,address,uint256,uint256)","d1c06b2f":"availablePositions()","d1c1132f":"lockInTreasury()","d1c13abd":"returnRental()","d1c15acf":"OWNERS_AND_PARTNERS_SUPPLY()","d1c19fbc":"Withdrawn(address,address,uint256)","d1c1f19f":"NewPlay(address,uint256,bool)","d1c2babb":"merge(uint256,uint256)","d1c31f10":"tokenLockUp(bool)","d1c332c7":"preDistriToAcquiantancesStartTime()","d1c43558":"TheExtraordinarySpacemen()","d1c46916":"releaseLock(address)","d1c484f6":"proposedRecoveryKeyPendingUntil()","d1c4c206":"setRoute(string,address,bool)","d1c5e119":"getMyAnotherDragon()","d1c673e9":"transferAndCall(address,uint256,uint256,bytes)","d1c693f8":"TOTAL_TOKENS_FOR_PRICE()","d1c699aa":"exerciseFee()","d1c6b0ca":"setBonusAmount(uint256)","d1c6f448":"updateInitialRate(uint256)","d1c72c89":"isInRoundTwoState()","d1c73322":"tokenHardcapReached()","d1c7a6ac":"ActivationWithdrawal(address[2],uint256[8],uint256,uint256)","d1c7be4d":"_pushLuckyInfo(uint256,uint8,address,uint256)","d1c85478":"GGRocketToken(address,string,string,uint256,uint256)","d1c8e7e6":"charityDonation()","d1ca0218":"issueToken(uint256,uint256,uint256)","d1cb0f0f":"getAllTombs()","d1cb923c":"HUNDREDTIMES(uint256)","d1cb993d":"grantAllowance(address,uint256)","d1cbfc66":"getOneTotalFeesDistributed(uint256)","d1cbfe65":"setRefferal(address)","d1cc9976":"isTerminated()","d1cd19cf":"advisorCut()","d1cd7bfa":"setSUTokenContract(address)","d1cdcf71":"PRICE_STAGE_FOUR_BONUS()","d1cdfe84":"Bonus_PoolTransfer(address,uint256)","d1ce017c":"getABIHashForMod(bytes32)","d1ce36aa":"unLockIdx()","d1ce65ab":"isCryptoRomeLandComposableNFT()","d1cec3ac":"CrowdSaleTest()","d1cf113e":"multiAccessSetRecipient(address)","d1cfe644":"EventCashOutTank(address,uint256)","d1d115ac":"test_fourInvalidEqUint(int256)","d1d1c8ae":"ConvertNumbers(bytes)","d1d1f264":"setSubscriptionStatus(bool,bytes32)","d1d2bd55":"calculateRangeLength()","d1d3a898":"_createElement(uint256,string,address,uint256,uint256)","d1d3bb92":"testSetPkg()","d1d3d8a6":"MintLog(address,uint256)","d1d422f6":"roundEvent(address[6],bytes32[6])","d1d46d2b":"setChestPrice(uint16,uint256)","d1d4c4c6":"safeDiv(int256,int256)","d1d5190c":"changeStart(uint256)","d1d53493":"setMaximalInvestmentTimeTreshold(uint256)","d1d566cf":"allocateExtraTokens(address)","d1d5824d":"maxBetThresholdPct()","d1d58b25":"claimable(uint256)","d1d675e4":"setMaximumCoinsPerAddress(uint256)","d1d6d639":"EstimateGas()","d1d6e44a":"paintGraffiti(uint256,string,string)","d1d80fdf":"setAddr(address)","d1d8fd65":"TransferCoins(address,uint8)","d1d93318":"createAvatar(string,uint256)","d1da09ee":"extractImportFeeChargeLength()","d1da8436":"setAdData(uint256,string,string)","d1db1cc4":"LogRefundingOpened(uint256)","d1db99b6":"INR_Omnidollar()","d1dbcd70":"isNodeTLDOfRegistrar()","d1dc3706":"LogReceivedETH(address,uint256)","d1dc72a0":"METAHASHCOIN()","d1dd2794":"buy_end_time()","d1ddb24e":"recordResult(address,address,address)","d1de5011":"getAccount(bytes32)","d1de592a":"add(bytes32,bytes32)","d1defff2":"_educatedToken()","d1df1252":"ringBell()","d1df306c":"burnToken(address,uint256)","d1df81df":"getPlayerInfo()","d1dfdc07":"patentSaleTimeDelay()","d1e0363d":"_createLock(uint32,address,uint256)","d1e040ec":"ConvertColouredBkp(address)","d1e07bcb":"onlyCapperMock()","d1e15045":"sendBack()","d1e191a4":"withdrawEverything()","d1e19ab2":"distributeAllTokensToContributor()","d1e2eb5e":"countInvestor()","d1e34733":"GCOXACMToken(string,string,uint8,uint256)","d1e400f4":"ecoSystemAddress()","d1e4b8da":"importBalance(address)","d1e58e0f":"preIcoRate()","d1e692eb":"lastLottoTime()","d1e6a64f":"leftForSale()","d1e7e81f":"selfLock()","d1e83b8b":"ChangeInterest(uint256,uint256,uint256,uint256,bool)","d1e8acb4":"ABC(uint256,string,uint8,string)","d1e9822c":"RESERVE_WALLET()","d1e99563":"BACKLEAF()","d1e9ab13":"Swift()","d1e9dcbf":"serverForceGameEnd(address,uint256)","d1e9f75b":"testHitSoftCap()","d1ea2786":"offerSketchForSale(uint256,uint256)","d1ea8b89":"QNTUsdRate()","d1eabc94":"CardToken(uint256,string,string,string,string)","d1eb6404":"donationsFrom(address)","d1eba9c9":"getDeployedAuctions()","d1ec32ed":"secondsToHold()","d1eca85e":"startIcoPreICO()","d1ecdec6":"m_OwnerFees()","d1ed3dad":"getIndex(address,address)","d1ed74ad":"retrieve(bytes32)","d1ee2bf9":"icoDiscountTime()","d1ee32c3":"issueTokensForICO(uint256)","d1ef4e91":"vestTokens(address,uint256,uint256)","d1ef752d":"Post(address,address,address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)","d1efb5cd":"_getChamp(uint256)","d1efd30d":"secret()","d1f0bb2d":"populateAllowedFreeExchanges()","d1f1ef34":"setPrivateSale()","d1f1fff8":"minBalanceForTxFee()","d1f276d3":"releaseAgent()","d1f2a7e2":"isUserPolicyAccepted()","d1f2efd5":"isMainSale()","d1f2f971":"calculateDivi()","d1f34b14":"__uintToBytes(uint256)","d1f38097":"CTGToken()","d1f461d5":"getUsernameFromAddress(address)","d1f4df47":"grantBountyTokens(address)","d1f55764":"shareContract()","d1f59db9":"isLatestMinorTree(bytes32,bytes32)","d1f61c44":"Totalizeum()","d1f61ed5":"dropRoute(uint32)","d1f6424f":"configurationCrowdsale(address,uint256,uint256,address,uint256[],uint256,uint256,uint8,uint256)","d1f69902":"getHeroClassId(uint256)","d1f6d676":"ExchangeContract(address,address,uint256,uint256)","d1f70760":"setAdditionalTokensFromCommonPoolWallet(address)","d1f7a4e4":"createCertificate(bytes)","d1f8a208":"removeOrganisation(address)","d1f92cab":"timereumDelta()","d1f95204":"propertyIndexToOwner(uint256)","d1f9c24d":"gameState()","d1f9f3a0":"bitdncToken()","d1fa338d":"TokenStorage(address)","d1fa74d2":"SimpleEscrow()","d1fa94d0":"setLockStatus(bool)","d1fa9cad":"Partners()","d1fae327":"CofounderSwitchedEvent(address)","d1fb386a":"_recordStashedPayout(uint256,uint256)","d1fb5646":"releaseTo(address)","d1fc0ddf":"prevOracle()","d1fc8cf3":"endDispute()","d1fccf9e":"bonusedPurchases()","d1fd260e":"getLotteriesByOwner(address)","d1fd3b12":"_rotateCauldron(uint8)","d1fe43ba":"migrateDueToNoReports()","d1fea3d5":"setReleased(bool)","d1feb5ee":"deleteArrayBytes32()","d1feca67":"addSpendingRequest(address)","d1ff535e":"PURCHASER_MAX_TOKEN_CAP()","d1ff8151":"getNumTanks()","d1ff9605":"setAdminFeePercent(uint256)","d1ffb796":"_ListingRemoved(bytes32)","d2004f8c":"getChance(uint256,uint256)","d20058af":"ESCBAirdropper(uint256,address)","d2008118":"logPromiseConfirmed(uint256)","d202158d":"keyHasPurpose(bytes32,uint256)","d2038d4d":"finalize4()","d2051f8e":"updatePassword(uint256,string,string,string)","d205ad7d":"proposeDissolve(bytes)","d205bcb0":"isPendingOracle(address)","d205f1e6":"testFail_set_price_without_token()","d2064e2f":"getStamp(uint256)","d2077782":"changeRequestCount()","d2079c0f":"playersLength()","d207e757":"ownerSetOraclizeSafeGas(uint32)","d2080ccd":"pauseWhitelist()","d20838f4":"setRegistryContractAddress(address)","d208fd60":"getMessageSender(uint256)","d209a566":"BP_PERSIAN()","d20ae2b5":"getMyWorks(bytes32,bytes32)","d20c34de":"TaylorToken()","d20cd8e5":"Solved(address,string,string)","d20d6119":"createTokenUri(uint8,uint8,uint8,uint8,uint8)","d20db416":"_approvePurchaser(address,uint256)","d20de0bc":"nextParticipantIndex()","d20e54a8":"startBet(uint256)","d20f5029":"advisorsTokensAddress()","d21077f3":"areFundsReleasedToBeneficiary()","d211483f":"RoleRemoved(address,string)","d211fd18":"capital()","d211fe86":"icoEndtime()","d21220a7":"token1()","d212a69a":"_fees()","d2134b26":"expTx(uint256,uint256,uint256)","d2135356":"isValidRelease(uint256)","d213ed96":"manageApprovedMintingModule(address,bool)","d213f109":"calcAmtReclaimable(address)","d21407fa":"crowdSalesCompleted()","d214326f":"GetWinners()","d214becb":"charactersCountOf(address)","d2161687":"reflectSwitch()","d2164302":"forgeWeaponPureDamage(uint256,uint256,uint256,uint256)","d216995b":"determineBonus(uint256,uint256)","d2169d2f":"getMonsterLevel(uint64)","d2169dfd":"RETURN_DATE()","d216a47d":"decreaseApproveAndCall(address,uint256,bytes)","d216a86c":"publicEventActive()","d216d55d":"etherandomExec(bytes32,bytes32,uint256)","d21705ff":"admin_proportion()","d2178b08":"get2()","d217b149":"managerUnset()","d218e144":"calculateRanking()","d218f92d":"checkinter()","d219f103":"collectedEtherFrom(address)","d21ad1ed":"calculateWinnerCut(uint256,uint256)","d21b84ac":"createNewDAO(address)","d21b93df":"Hypes()","d21b96ab":"ringhashRegistryAddress()","d21bdee4":"Bitforce()","d21c39a1":"acceptPayment(address,uint256,address,uint256,uint256)","d21c700f":"stopToken()","d21cacdf":"referrerOf(address)","d21cbffc":"getIfVoted(uint256,address)","d21ceba0":"RemainingTokensReceiverAddress()","d21cf24f":"setSingleWithdrawMax(uint256)","d21d2cd1":"lifePoints()","d21d7950":"changeGasLimitOfSafeSend(uint256)","d21e17a6":"_payEthereum(uint256)","d21efc35":"endPhase()","d21fa4e1":"contract_alive_until_this_block()","d2201c3b":"CreateLUNETS(address,uint256,uint256)","d22057a9":"register(bytes32,address)","d220b727":"ProposalTallied(uint256,int256,uint256,bool)","d2225635":"getBetterNumOfWinnings(address)","d22290a4":"feeBips()","d222dc04":"requiredSignedAddress()","d2231919":"TransactionRefundedByMediator(uint256,uint256)","d22341a9":"withdrawDeveloperPot(address)","d2234b37":"withdrawal2()","d2235998":"_cancelAuction(address,uint256,address)","d223926f":"buyBooster(uint256)","d224118f":"PrepareDraw()","d224c3e0":"gen0Step()","d224f1ed":"proxiesCount(address)","d2254db0":"DDEToken()","d22591c8":"addBook(string,address)","d226d11f":"foundEvidence()","d226ff1b":"User(string)","d2273f37":"_changeTuneOption(uint32,uint32,uint256,bool,bool,uint128,bool,uint64,uint256)","d2282dc5":"setUint256(uint256)","d228cfc5":"claimHodlRewardFor(address)","d229a94a":"lockTokensForTradingMarketContract(address,uint256)","d22a1180":"finanReserveAllocation()","d22ac06f":"_approveEscrow(bytes32,uint256)","d22b1a0f":"secondVestStartsAt()","d22b32e9":"hivePerEther()","d22b3c8b":"ownerArmyCount(address)","d22b3de6":"setTitulaire_Compte_10(uint256)","d22b64a2":"getDonationByAddress(address,address)","d22b9177":"getImageRegionId(uint256)","d22bdce2":"_getNextStage()","d22c391a":"validateProposedThroneRules(uint256,uint256,uint256,uint256,uint256)","d22c78f8":"getPlanetDetails(uint256,uint256)","d22d9c6d":"tokensInUse()","d22dee48":"claimProfit(uint256)","d22e7b69":"validatePublisher(address,bool,string)","d2305f07":"getCloneArray(uint256[])","d230e875":"MaxValue()","d232790d":"setLastWinner(address,uint256,uint256,uint256)","d232a8f5":"firstStageCap()","d23376ec":"getPOOL_edit_14()","d233e5c0":"oxen(address)","d233fc0b":"changeRecovery()","d23628f1":"CyberRailNET()","d2368f64":"Billing(uint256,uint256)","d237a427":"TT()","d237b43f":"reclaimResourceDeposits(address)","d237bc74":"paymentSizeC()","d238cd1b":"redeemVoucherSingle(uint256,address,address,uint256)","d238ec90":"HWGLToken()","d2395dcd":"buyTokens(address,uint256,uint256)","d239ea8b":"getSchemasLenght()","d23ad39d":"setCommons(address)","d23b8f5c":"drawDailyWinner()","d23dcee0":"_generateTokenURI(bytes32[],uint256)","d23df2d1":"RENEX_SETTLEMENT_ID()","d23e09f5":"trioContract()","d23e8489":"transferOwnership(uint256)","d23ea159":"eGoldchainStart()","d23ef360":"setExchangeRegulatorWallet(address)","d23f0abb":"issueTokensForPresale(uint256)","d23f1bba":"noBets()","d23f4450":"scoreDown(address)","d24155c1":"getAmountBonusRate()","d2415852":"TheDivine()","d241ead8":"testMinReturn0WithReturn()","d242448c":"transferredCrowdsale()","d24257c0":"betAmount()","d2427db5":"checkTotalPayout(address)","d242b051":"reserveWaveLockup()","d243ec26":"payDev()","d244059a":"whiteListLimit()","d245a084":"TransactionRefundedAfterDispute(uint256,uint256)","d245aa92":"endBlockBonus3()","d245da28":"updateEarlyParicipantWhitelist(address,address,uint256)","d2467e31":"GetSellingTokenDecimals()","d246a8c9":"lastNegativeVoting()","d246b379":"calculateRevenue(uint256,uint256,uint256)","d246d411":"burnAddr()","d247160a":"ethertoteDevelopmentTransferComplete()","d24876b7":"sellCMTAgainstEther(uint256)","d248cf1f":"DASHABI(uint256,string,string)","d24987fc":"getNewTokenPrice(uint256)","d24999ca":"getkillerPriceConversionFee()","d249a52e":"update(bytes,uint256[],uint256[])","d24ac764":"getRejectionCount(uint256)","d24b06b7":"registryRequestCustodian()","d24b08cc":"callstoredaddress()","d24b62a8":"lotteryReset()","d24b7090":"_payEtherAndDistribute(uint256)","d24b7e7a":"setEthPrice(uint128)","d24bcb15":"usechainWallet()","d24bcf54":"getEarlyIncomeByAddressRound(address,uint256)","d24c8fe4":"_getCurrentStage()","d24d11ad":"BattleProvider(address,uint256,uint256,uint256,uint256,uint256)","d24ddcfe":"buyKissBTC()","d24ecc10":"initializeSale(uint256,uint256,uint256,uint256,address)","d24ef4f3":"PLATFORM_DEVELOPMENT()","d24f8a17":"convertShortedTokensToLiquidationToken(uint256)","d2500033":"RISE()","d25090ff":"withdrawContribution(uint256)","d25119c7":"getMsgHash(address,string,string)","d2521034":"marriageStatus()","d2526418":"getFeePercent(address)","d2531590":"CANCEL_EXTRA_GAS()","d2536893":"setDividendWinners(uint256[],uint256[],uint8[],uint256)","d2548393":"team2019TokenCreated()","d255494a":"removeInventory(bytes32)","d25570f2":"AliceToken(uint256)","d2558fca":"Token3D()","d2559533":"WinancesToken()","d256451c":"setRates(uint256,bytes32[],uint256[])","d256c7a5":"setTokensPerEther(uint256,uint256)","d2571062":"setAllContracts()","d2577fec":"_getRoleSignature(address,bytes32,address)","d258d7b6":"test_4_generateTokensAccrossBlocksAfterDestroy_increaseBlocksBy1000()","d258f2f4":"TeTeToken()","d2591068":"TLCMarketCrowdsale(uint256,uint256,uint256,address,uint256,uint256)","d259224a":"ssstt()","d2598c4c":"removeTrader(uint8)","d2599312":"initShareRule4Publicity()","d259d761":"changeAdminContract(address)","d25a1212":"revokeAttributeSigned(address,uint8,bytes32,bytes32,string,bytes)","d25a13b4":"roundTwoBlock()","d25a5be9":"airdropTotalSupply()","d25b3ee1":"AcademiCon()","d25b4f2a":"CrowdsaleRC()","d25c0767":"isSaleAuction()","d25d19e2":"SetThrdOwner(address)","d25d603c":"cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32,string)","d25dc056":"transferToWinner(address,address,uint256)","d25e3443":"ISLToken(uint256,string,string)","d25f08b1":"adminAddICO(uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],bool)","d25f1c35":"CPGPEREGRINE_MAX_CARGO()","d25f82a0":"getAirdrop()","d25ff342":"MNXToken()","d2602930":"RockPaperScissors()","d26031ab":"phase2EndingAt()","d261de38":"NVCTToken()","d261fbed":"addressCallWithArray(address[3])","d2620e2d":"holdOf(bytes32)","d2625fce":"pendingOracleB()","d2631e42":"changeRewardManager(address)","d263b7eb":"ownerkill()","d263be48":"myWallets()","d263d2a4":"setWildCardToken(uint256)","d264a878":"getOraclizeWinnerTimeOffset()","d264cfdc":"lockAccountOf(address)","d264e05e":"forward()","d2650fe5":"RedeemEvent(address,uint256,uint256,uint256,uint256)","d2651855":"changeERC20(address)","d2654219":"getCurrencyDenominated()","d2656069":"SmartContract_Allowed(address)","d26574ac":"setCardPerkText(uint256,string)","d266e83b":"isActive(address,uint256)","d2670025":"REQ()","d2676711":"getCommentAccountsLength()","d2689abc":"ecdsaverify(uint256,uint256,uint256,uint256,uint256)","d269ae55":"MAX_ALLOWED_TOTAL()","d26c8a8a":"coinBalance()","d26cbe1e":"Contributed(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)","d26cfeae":"setMinAmount4Round(uint256)","d26da39e":"isRequestFromOwnerOrMeterKey(address)","d26dbd2a":"preSaleTokensDisbursed()","d26ee061":"getAvailableFundsForTheTeam()","d26f9cd7":"backofficeRedeem(uint256)","d26ff86e":"submit(bytes32,bytes32)","d270085e":"addNoFeeAddress(address[],address[])","d270b8e8":"tokenDistributionEndTime()","d270cbaf":"buyAAC()","d270e7ab":"mainContract()","d271011d":"transferEthers()","d2715a6b":"getEmblemOwner()","d2718fbe":"setOwnerFlag(uint256,uint8)","d271900d":"linkContract(address)","d2719d22":"btcRate()","d271b067":"ln(int128)","d2727e6c":"_oneTokenInWei()","d2728f90":"Bought(uint256,address,uint256)","d273285b":"createdWallets()","d27399b5":"countAddressesSet()","d27416ec":"verify(bytes32,uint8[5],bytes32)","d27482a4":"claimOwner(address)","d274b230":"registerFor(address,address,uint256,uint256,uint256)","d274fa91":"amendRetention(uint256,uint256)","d2756e11":"finalizeNumber(uint256)","d2758538":"createOneDrink(string)","d2760b64":"_isBuying()","d27626fd":"pushToken(address[],uint256,uint256)","d2769df1":"isValidComposition(uint256[],uint256)","d276a3e1":"auctionedEth()","d2789aa5":"getPrivilegeState(string)","d279830c":"addMilestone(uint256,uint256,uint256)","d279c191":"claimReward(address)","d27a43f6":"_checkWin(uint256,address)","d27a6f28":"ZyPPACrowdsale(uint256,uint256,uint256)","d27aa18e":"Secure()","d27bf2e3":"getCurrentLocation()","d27d1bc4":"proposalsNumber()","d27d3e88":"bulkSend(address[],uint256[])","d27f41cd":"CharityInProgressWallet()","d27fcf96":"gmtFundAddress()","d27ffef1":"OLIFEToken()","d282866a":"whichTick(uint256)","d282db01":"_withdrawal(address)","d2835c58":"P4P()","d283833d":"toekensForTeam()","d283859d":"removeBlack(address)","d2840362":"addAdvisors(address,uint256,uint256)","d28442ef":"ownerProfit()","d2846c7b":"isProxyContract()","d285b7b4":"loan()","d286dbf2":"internalNewRound(uint256,uint256)","d2871105":"tokensIssuedBySTO()","d2874e49":"withdraw(address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","d2879f47":"_getContractTokenBalance()","d2886ebc":"getUserSkills(address)","d288c878":"blackListERC20(address)","d289ade2":"payFee(uint256)","d289eb82":"buyMultipleItems(uint8)","d289f187":"_addBonus(address,uint256)","d28a4f9e":"setKyberContractAddress(address)","d28ae9ef":"calcMiningSharesAmount(uint256,uint256)","d28b5317":"setCampaign(bytes32,uint256,uint256,uint256,uint256,bool,address,string,int256)","d28be797":"getShitClonelordReq()","d28c25d4":"changeGreeting(string)","d28c2aaa":"fix_parents(uint256,bool)","d28cb7b5":"availableWallet(address)","d28cbded":"ERC20Token(uint256,string,uint8,string)","d28d4e0c":"queryAllAccounts()","d28d8852":"_name()","d28dcdea":"haltPurchase()","d28e4355":"updateClaimable(uint256)","d28e88bd":"freezeDateOf(address)","d28f95ba":"withdrawalEth()","d28fa960":"withdraw_all_funds()","d28fdde8":"updatePrice(uint256[])","d2901c47":"RATE_SOFT()","d290ee06":"revokeTokenTimelock(address,uint256)","d291fa81":"GetMinerAt(uint256)","d29208d4":"MasterCoin()","d292515d":"totalMintNums()","d292b920":"CryptaurMigrations()","d292e6cb":"_sendPriceUpdate(address,uint256)","d294cb0f":"accountBalance(address)","d294f093":"claimFees()","d2953f84":"assetByIndex(address,uint256)","d29543af":"FolioNinjaToken(address,address,uint256,uint256)","d296853a":"whitelistPreSaleAddress(address,bool)","d2970120":"getSettlingTimeoutBlock(bytes32)","d29709fb":"returnDeposit(address,uint256)","d2973f93":"setUserType(address,uint256)","d2983dfd":"LoadedRefund(address,uint256)","d299dac0":"blake2b(bytes,bytes,uint64)","d29b5d2f":"mintReputation(uint256,address,bytes32)","d29c8c96":"createdBlockOnCommitsPhase(uint256,address)","d29cafe1":"ZilliqaToken(address,uint256)","d29cbd60":"getMonsterBaseStats(uint64)","d29d44ee":"_transferOwnership(address)","d29d503c":"addHolder(address,uint256,uint8,uint256)","d29d91ca":"getNarcoHomeLocation(uint256)","d29db7e4":"_processPurchase(address,uint256)","d29dd76d":"whitelistAdmins(address)","d29e2746":"place_buy_order(uint16,string,address,string,string)","d29e319c":"TOKEN_ICO3_LIMIT()","d29e6803":"secretHash()","d29ebd2e":"privateOfferingSupply()","d29f541d":"getPosition(uint256,address)","d2a09b96":"_updateReferrals(uint256,uint256)","d2a17959":"transferTokensFromVault(address,uint256)","d2a1e045":"FuBi()","d2a2feaa":"STRI()","d2a32c12":"bonus_amount()","d2a3899c":"payOrder(uint256,uint256,uint256)","d2a3b190":"SAToken()","d2a569c3":"startAirdrop()","d2a6629c":"playerActiveGames(address,uint256)","d2a6cf5e":"internalTrade(uint256,uint256,uint256,uint256,uint256,uint256,bool,address,address,bytes32)","d2a718ec":"isRefundLocked()","d2a753e4":"cancelBid(address,bytes32,int32,bool)","d2a764d1":"contributeInBNB()","d2a79e57":"tixPresaleDeposit()","d2a7d38a":"MIN_FUNDING_AMOUNT()","d2a7ea17":"setSelfAsPureShareholder(string)","d2a86985":"_ORAK()","d2a9b6ed":"getVotingFor(address)","d2aa24b6":"getControlInfoMaxPerBlockImbalanceList()","d2ab6be1":"start(uint8)","d2ab78b7":"getGameName(address)","d2ac0f59":"setHeroContract(address)","d2ac1c8e":"addApprovedAddress(address)","d2ac2d8a":"heldOf(address)","d2acbc0d":"card_metal_minamount()","d2accad3":"_changeText(uint256,string)","d2ace0cc":"_newVoting(bytes,string)","d2ae5f65":"earlyInvestorTokenRaised()","d2ae8eaa":"getGenesForSale()","d2aeb90f":"removePoweruser(address)","d2aee00b":"getCanAttackMonsterIds()","d2afa8c1":"isERC721()","d2afeeeb":"createBoard(bytes32,bytes32,uint256,uint256,uint256)","d2b001fb":"PREMIUM_TYPE_COUNT()","d2b022d5":"pendingWithdrawalsBalance()","d2b0d554":"getDisclaimer()","d2b10b75":"AirDropContract(address,address)","d2b1569e":"redeemRewardedAxies(address,uint256)","d2b3fe93":"updateRoundLimits(uint256)","d2b420ce":"isOfferSorted(uint256)","d2b4a460":"getJackpotFee(uint256)","d2b50743":"DOW_FRI()","d2b5c227":"AsideTokensHaveBeenAllocated(address,uint256)","d2b5d9e1":"refferalFee()","d2b73cea":"getActiveContractAddress(uint256)","d2b74f70":"CryptoFamousStorage()","d2b75b70":"_upsert(address,uint256,bool,bool,uint256)","d2b77264":"pollMap(bytes32)","d2b78529":"getContractNetBalance()","d2b7d957":"executeDelegatecall(address,uint256,bytes)","d2b8035a":"draw(uint256,uint256)","d2b8915c":"offerPosition(uint256,uint32,uint256)","d2b8b867":"doPayment(uint256)","d2b93303":"EternalToken()","d2b962f2":"createLiability(bytes,bytes)","d2b9da84":"Office(string,string,uint256)","d2ba499c":"IS_SIGNATURER(address)","d2ba5537":"numberOfClaimants()","d2ba8073":"minbid()","d2bafbe6":"setMaxCoordinate(uint256)","d2bb6fd5":"timeTier2()","d2bbda29":"registerName(string,address,string)","d2bbf6df":"getIndexId(address,bytes32)","d2bd3dd9":"YAP()","d2bec28c":"startCraftingAuction(uint256,uint256,uint256,uint256)","d2bf779f":"getKingdomInformations(string)","d2bfd24b":"setgamecard(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","d2c03c01":"auto_withdraw(address)","d2c0e032":"set(address,string,string)","d2c18e0b":"api()","d2c18f59":"emergencyManager()","d2c33eb2":"claimRaisedWei(address,address)","d2c37621":"getUserLocalTokenBalance(address)","d2c3a1ec":"updateStageInfo(uint256,uint256)","d2c411d3":"closeBatch(uint256)","d2c49b7f":"getTimeUntilEnd(uint256)","d2c51c72":"withhold()","d2c5c368":"testFailRestartNotUpdatable()","d2c5ce31":"dateTimeAddr()","d2c73093":"createTokens(uint256,address)","d2c731d9":"TermsOfUse()","d2c877f8":"setDollarRate(uint256)","d2c87b02":"MB(address,address,address,address,address)","d2c936ff":"currentBonusLevel()","d2c94ec5":"C4FToken()","d2ca159a":"listUnconferences()","d2ca2115":"periodLength()","d2cad255":"BankDeposit(address,uint256)","d2cad6da":"bonusCalculate(uint256)","d2caeea8":"aomucoin()","d2cafe2d":"allAssetsOf(address)","d2cbcea6":"getSSP(address)","d2cc7015":"placeMove(uint8)","d2cc718f":"accumulatedInput()","d2cced90":"getAnnualInterest(uint256)","d2cd9673":"totalMining()","d2cd96bd":"changeQuorum(uint256)","d2cdf580":"setKYCpassed(address)","d2ce89e5":"logoURL()","d2cf7704":"BanAttempt(address,address,uint256)","d2cfe5a7":"posscoin()","d2d0ded1":"referrerBonusPercent()","d2d0e066":"deposit(address,uint256,uint16)","d2d10162":"initialize(address,address,uint256,uint256,address,address)","d2d10be8":"TGEToken(string,string)","d2d153a4":"Grand_Solar_Minimum()","d2d26edc":"Cloudcoin()","d2d3b8e0":"multiAllowance(address,address[],address[])","d2d42074":"getExchangeContractAddress()","d2d44955":"Cindicator()","d2d4bd72":"getCrossRate(bytes,bytes)","d2d5a55c":"ownerValidator()","d2d7231f":"calculateReward(uint256)","d2d791c0":"payBatch(bytes32[],uint256[],address,address,bytes)","d2d85cf2":"rootsMatch(address,address)","d2d8cb67":"TOKEN_PRICE()","d2d8fd0a":"settleFrom(address,address,uint256)","d2d92f24":"getWhitelistEntry(uint256)","d2d93f90":"ethRate()","d2d976da":"webpage()","d2d97d9f":"coldStorage()","d2d9b8c6":"setCompte_24(string)","d2d9d44e":"awardTitanium(address,address,address)","d2da29c7":"hostAddress()","d2db29af":"claimFutureUse()","d2dc0869":"add(string,uint256,string,string,address)","d2dcd933":"totalSupplyAtTime(uint256)","d2dd8d2a":"authorized_updateCardClaimerAddress(uint256,address)","d2dd9f79":"transferVault(address)","d2ddf1ae":"TradingForest(address)","d2de6cca":"getArrayValueByKey(string,string)","d2de6ec5":"distribute(uint256,uint256,uint256)","d2de9989":"stopPreIoc()","d2df254c":"weiToUSD(uint256)","d2df9222":"recoverStockKey(bytes12)","d2df9cc1":"startTimeSaleNoBonus()","d2e013d9":"Execution(string,string,string,string,string,string)","d2e01b2f":"getLockPosition(address)","d2e0637b":"createContractTot(string)","d2e10879":"getReceiptRoot(uint256)","d2e1d201":"setstring(string,string)","d2e2acf5":"_proxyTransferEvent(uint256,uint256,uint256,bytes32)","d2e3646c":"optionsConverter()","d2e474b3":"PROMOTORS_POOL()","d2e73d78":"withdrawDepositorFunds(address,uint256)","d2e78ace":"DestructionContract()","d2e80494":"setConversionRate(uint256)","d2e81bf9":"initPlayer(address)","d2e8309e":"test_messageSenderEq()","d2e90d0f":"startTimeICO()","d2e91b85":"getset()","d2e9236b":"sendEthValue(address,bytes,uint256)","d2e9953a":"setAdmin(address,address,bool)","d2ea7f7f":"CreditDAOfund(address)","d2eb6483":"EVMDB()","d2ecb4f9":"initialAllocation()","d2ed2d30":"setWorst(uint8)","d2eda057":"checkBool(bool[])","d2eeead7":"PatrickTestCoin()","d2ef0669":"denyAccess(address,address)","d2ef3b0d":"getCreateShareTokenMarketValue()","d2ef7398":"challenge()","d2efeef3":"TradableTokens()","d2f03bf6":"registerWithETH(address)","d2f0be99":"getRefund(uint256)","d2f1f189":"ICOAddress()","d2f1f712":"getVoters(uint128)","d2f27cf4":"setCelebrityPrice(uint256,uint256)","d2f28141":"calculateBonus(uint256,address)","d2f2d549":"CLPTestNetToken()","d2f32d94":"get_card()","d2f343c7":"timeWindow()","d2f3b963":"dateICOEnded()","d2f3ea43":"getPurchaseAmount(uint256)","d2f40cab":"getFunctioName()","d2f4a50a":"wallets()","d2f65fbc":"setMockBytes32(bytes4,bytes32)","d2f6f67d":"mintingContract()","d2f7265a":"exchange()","d2f7c5db":"GetDetail(address)","d2f7f377":"testRegisterNickWalletEth()","d2f80c15":"addDivisionJurisdiction(bytes32[],bool[])","d2f82026":"quickSortBids()","d2f8dd45":"Owned(address)","d2fa1f8b":"proxyPurchases(bytes32)","d2fa635e":"setMaxGasPrice(uint256)","d2fa9a67":"RESERVED_TOKENS_FOR_FURTHER_TECH_DEVELOPMENT()","d2fabaec":"VITToken()","d2faf216":"withdrawBuyer(address[2],uint256[7],uint8,bytes32[2])","d2fafb19":"setAmount(address,uint256)","d2fb32c2":"getGen0ObjInfo(uint64)","d2fb8787":"recordExists(bytes)","d2fbbc51":"ADVISORS_TOKENS_PERCENT()","d2fbd0ed":"payOrder(uint256,uint256)","d2ff5d4f":"allWETHbalances(address,address[])","d2ff8fd8":"ICOtokensSold()","d2ffca2d":"currentTotalExcess()","d2ffd541":"mintAdminCancel(address,address)","d30047bc":"firstPreSaleEndDate()","d3006dea":"ValueFinalized(bytes8)","d300746f":"pullTokensBack()","d300a034":"oraclize_query(string,bytes[])","d300a968":"isSecurityToken(address)","d3017193":"addUser(address,uint256)","d301c85f":"ownerAllocateTokensForList(address[],uint256[],uint256[])","d30272b8":"signAgency(uint256)","d302af4a":"isAirdropContract()","d302b0dc":"unFreeze(uint256)","d303b750":"Coupon(address,uint256,uint256)","d303e3b2":"checkMidiNoteValue(uint8)","d3050195":"_ownsRobot(address,uint256)","d305399d":"addToWhitelist(address,uint16,uint256)","d305577e":"GSSingle(uint256)","d305671a":"Dario(uint256,int256,uint256)","d3057859":"trade(uint8[2],bytes32[4],uint256[8],address[6])","d30592c6":"_trim(uint256[],uint256)","d3059c91":"maxTokensForCommand()","d305a45d":"requestDivident()","d3062b24":"getIndicesWithClaimableTokensForBuyers(address,address,address,uint256)","d3066879":"withdrawVestings(address)","d306967b":"TokenCreated(uint256,string,uint256,address)","d30792d4":"bonusesMapPos(bytes32)","d30796a2":"OwnerTransfer(address,address,uint256)","d307cd53":"_b4(string,uint256)","d3087ff5":"startOpenPpTime()","d3088b52":"transferWithMessageAndRequestAddress(address,uint256,address,bytes)","d3088b5f":"CesaireToken()","d30895e4":"player1()","d308cbe2":"withdrawMoneyByAdmin(uint256,address)","d30920c1":"contractTotalInvested()","d3098883":"memberFee()","d30a119b":"calculateBonusTokens(uint256)","d30a1325":"checkProposalExistence(string)","d30a512e":"betOnColumnOrDozen(bool,bool,bool)","d30a969a":"RemiCoin(uint256,string,string,uint8)","d30b5386":"payFee(bytes32,uint256,address)","d30bbde8":"checkWorkingInfra(uint256,uint256)","d30beffa":"unholdGold(address,uint256)","d30bf323":"setTaskRewardPaid(bytes32)","d30cad77":"nextRoundDuration()","d30e2004":"setRegionUrl(uint256,uint8[128])","d30e268b":"saleTokensPerUnit()","d30e9302":"distributionTokens()","d30f945a":"setNewManager(address)","d30fa946":"fulfillDeliverable(bytes32)","d30fbd0d":"safeSubtract(uint256,uint256)","d30fc8a1":"FundsAdded(uint256)","d3100538":"YOLOCASH()","d3109af3":"drainWei()","d310bc32":"releaseName(string)","d3111d3f":"_getLockedAmount(address,address)","d3115524":"_bptc(uint256,uint256,uint256,uint256,address)","d3118a5a":"addDoc(string,string)","d3119dc0":"minEtherForAccounts()","d311b44d":"everyBidFee()","d312846b":"uniqueContributors()","d313f235":"terminateTokenSale()","d3140a65":"createOpenLockAndDraw(address,address,uint256)","d3146a46":"Claim_TRAC_9600()","d316e912":"deleteGrantee(address)","d3183864":"calculateMultiplierAfterBurn(address,uint256)","d3195184":"_canNowTransfer()","d3195c82":"refundTransactionAfterDisputeFee(uint256)","d319ab75":"getProposalContractor(uint16,uint16)","d31a8be1":"setCentsPerEther(uint256)","d31af484":"updateTokenUri(uint256,string)","d31b3320":"getUserTokenInfo(address)","d31c153c":"AllocateAgentChanged(address,bool)","d31cfed6":"initialMonthWithdraw(uint256)","d31d7b0a":"MoonCatRescue()","d31efc7e":"createHero(string,uint16,uint16,uint16)","d31f0f38":"RamenCoin()","d31fdffd":"setHammer(address)","d31feea1":"OpenLongevity()","d31ff13c":"changeContractOwner(address,string)","d320ac9a":"DonationDeposited4Matching(address,uint256)","d321fe29":"getAmount()","d3220144":"newPriceDecreaseRate(uint256,uint256)","d3226425":"DuMangoCoin()","d324191c":"Codexstandard()","d3251aa2":"setHelpCoinAddress(address)","d3257034":"AgriChainCultivation()","d3258b9e":"DevDorothyCoin()","d325c2e8":"revertPurchase(address)","d3261592":"dripRate()","d32632fd":"migrationGate()","d327523a":"getTotalNumberOfBoards()","d329ce51":"developer_cycle(address,uint256)","d32a7ee0":"updateLand(uint256,uint256,uint256,uint256)","d32a9cd9":"settle(bytes32,bytes32)","d32ab21d":"voteFor(uint8,uint8,uint8)","d32aba42":"getPresaleBonusAmount(uint256)","d32b607c":"sumElements(uint32[])","d32b8575":"_startAuction(uint256)","d32c943a":"resolveChallenge(bytes32)","d32cb0fe":"exercise()","d32cbabb":"Ast()","d32e245b":"getContributorRemainingCap(uint256)","d32e29de":"setApproveFee(uint256)","d32e48c0":"LockOpen(address)","d32ef1e5":"RhodonToken(address)","d3309a7e":"productTribe(string)","d3313802":"EtheraffleDisbursal(address)","d331aeb3":"getAllFiatTransactionsCount()","d331b696":"computeNameFuzzyHashET(string)","d33219b4":"timelock()","d333d7cf":"destroyShares(address,uint256)","d333ec79":"changeServiceAccount(address)","d334d75b":"expireLoan()","d3363dd7":"icoThresholdBonus3()","d3364687":"PRESALE_START()","d33656e0":"primaryOperator()","d336ac80":"getPersonInfo(uint256)","d337616e":"resetLottery()","d337b9c9":"myWeapons()","d337ce86":"addProject(uint256,string,address,uint256,uint256)","d337e72e":"EtherToken2()","d3382a55":"whitelistRate()","d3392545":"spawnItem(uint256,uint256,address)","d33abd33":"t_2nd_StageEnd()","d33b79d9":"addBallotAndVoterNoPk(bytes32)","d33c0a4d":"getMyCells()","d33c449f":"gesamtGuthaben()","d33ca02b":"externalCall(address,uint256,uint256,bytes)","d33cf9fa":"MultiSigMint(address)","d33d1aac":"getWeeklyTokensForWebsitesAmount()","d33d5f3e":"CLOSE_TIME()","d33d6732":"totalSupplyMintTransfer()","d33d6f65":"Delivery(address,uint256,uint256,int256,int256,int256,int256,address)","d33e1a48":"genRNGContractAddress()","d33ecfee":"setResume()","d3400a1d":"etherRatioForOwner()","d34047b6":"mint(address,string,bytes32)","d340ab41":"addInvestorBonusInTokens(address,uint256)","d340dd8a":"getCCH_edit_13()","d340e8f8":"setDistributionPercentage(uint256,uint256,uint256)","d341281a":"ALH()","d3418fb7":"capOfTotalSupply()","d3419bf3":"prices()","d3419d4e":"TokenAiContribution(address,address,address,address,address,address,address)","d341e052":"JoyGameDemo(address,address)","d342275e":"setProgress(uint256)","d342c598":"Bou(address)","d342e4f4":"runInOneDay()","d3437bd3":"ProofOfStableClone()","d3437fe0":"assertFact(uint256,bytes)","d3446856":"tournamentPaused()","d344e01b":"stopTransferToken()","d3451379":"updatePower(uint256)","d3456121":"amountInContract()","d3462259":"howManyTokens(uint256,address)","d346feb8":"changeCertBot(address)","d3471035":"KarmaToken()","d347c205":"transferableTokens(address,uint64)","d347de03":"setPlayerGeneralCd(uint64,uint32)","d3481bd0":"buyBlock(uint256,uint256)","d3484c1c":"TOKEN_SUPPLY_MAINSALE_LIMIT()","d348b409":"calculatePrice()","d348ee9a":"correctResult(int16)","d349f8b4":"MobileGoToken()","d34a280a":"setPreAmounts(uint256,uint256)","d34a412c":"switchRankings(uint16,uint8,uint64,uint64,uint64,uint64,uint64,uint64)","d34acd12":"functionCalls(uint256)","d34b1537":"minFundingReached()","d34b1aef":"returnUnsoldSafeLarge()","d34b2451":"BurritoPurchased(uint256,address,uint256)","d34b6cd3":"BBDToken(uint256,uint256,uint256,uint256)","d34b7e25":"checkWin(uint256[])","d34bb772":"EndsAtChanged(uint256)","d34be5be":"startVotingPrepare(address)","d34cc179":"updateDaoContract(address,string)","d34d8e43":"oracleItQuery(string,string,uint256,uint256)","d34dd1f0":"safeWithdrawal(address,uint256)","d34e4b20":"getWinnerHistory(uint256)","d34ed095":"getSoilTempException(bytes32)","d35066e6":"rsrvToSale(uint256)","d3511f82":"getRoundBetNumber(uint256,uint256,uint256)","d3516b7e":"setVote(uint256,bool)","d3525adf":"setMetadata(bytes32,bytes32)","d35262ef":"getInt256Min()","d3528d9b":"createBetAcrossDeposit(bytes16,bytes16,bytes16,bytes16,uint256,uint256)","d352a862":"ownerOfTwitterId(uint256)","d3535452":"buyPosition(address)","d353a1cb":"finish(uint256)","d3554dd5":"NieShichaoToken()","d35590c2":"sponsors(address)","d355f139":"requestBatchLoans(uint256)","d3565934":"YANG()","d3568560":"calcDates(uint256,uint256)","d356a28b":"addSERAPHIM(address)","d356a879":"removeAddressByIndex(uint256)","d357aa15":"raise2ndAppeal()","d357f0ce":"_checkPixelLeft(uint256)","d357ff87":"sweepRoundsActive(bool)","d359b0c7":"XeniaToken()","d359be70":"distributeExternal(uint256)","d359f82c":"updateExpiry(uint256)","d35ada32":"addParticipant(address,address)","d35b9d83":"codeAt(address)","d35bcf88":"addCET4(uint32,uint64,uint64,uint64,uint16,uint16,uint8,uint8,uint8)","d35c7372":"theCeiling(uint256,uint256)","d35c9a07":"withdrawProfit(address,uint256)","d35cf913":"mint_tokens(address,uint256)","d35d031e":"SellerChanged(address,address)","d35d90ba":"MPKToken()","d35e29d7":"mint(address,uint32)","d35e48e6":"PLBToken()","d35e6537":"IONIATOKEN()","d35e656b":"userNameTaken(string)","d35f4a99":"mint(int256,address,uint256)","d35fbbfb":"range(uint256,uint256,uint256)","d3604bc9":"yesContract()","d3614854":"getAdministratorETH()","d3617e7a":"MyToken(address)","d361ab64":"sendFreeTokens(address,uint256)","d3626d09":"getyestoday()","d3631e00":"refundUnconfirmed()","d3637c27":"icoArray(uint256)","d3650fb8":"approvers(uint256)","d365a08e":"masterAddress()","d366f83b":"allSidesPledgedAmount()","d366fbab":"startLottery(bytes32,uint256,uint256,uint256,uint256,bool)","d3670cb4":"BitcoinBlackToken()","d3671166":"PurchaseSuccessful(address,uint256)","d367a398":"NVTAddr()","d3695161":"deleteUser(string)","d369a744":"CCtestToken(address)","d36a1fa8":"ALKACOIN()","d36a35c9":"strikersBaseContract()","d36a8026":"Phoenix()","d36ae26b":"commBallotPriceWei()","d36afad5":"hasKey(address)","d36b96a9":"controllerFailed()","d36b9e64":"contributorsPeriodsElapsed()","d36bed21":"getGameAddressById(uint256)","d36bf8a1":"increaseWithdrawalChunk()","d36d9b19":"request_callback(uint8)","d36dbc0c":"addWineryOperation(string,string,string,uint256,uint16,string)","d36e0f39":"EIP20Token()","d36e9ac3":"burnUnused()","d36e9b2a":"RentalAgreement()","d36ef2cc":"PolicyPalNetworkCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","d36f0e9c":"etherForCharity()","d36f5c87":"stitch(int256,int256,bool)","d36f69eb":"getEthInCents()","d3701ff2":"TongToken()","d3707129":"_removeShareFromLastOwner(address,uint256,uint256)","d3708487":"setInfoAboveSpot(uint256)","d37194f5":"getTotalDepositsAmountLeft()","d371d551":"addAddressToCappedAddresses(address)","d372e3a0":"isCrydrViewAddress(address)","d3732642":"FastRealisticPyramid()","d373507b":"setAllowSell(bool)","d37360a0":"efw()","d3749a15":"user_contract()","d375b921":"orderUsable(address[8],uint256[6])","d3775371":"has_reading()","d377bc5f":"lockedMoney(bytes16)","d377dedd":"currentNiceGuy()","d378f4e0":"NOOR()","d37990ce":"setGenerationSeasonController(uint256)","d379be23":"claimer()","d37a9bb0":"restrictTransfers()","d37aff82":"changeStatus(uint8,bytes32)","d37b34d7":"blacklistAccount(address)","d37b8a96":"deploy(string,string,uint8,string,address)","d37cd1d9":"TalentCoin(address,uint256,string,uint256,string,uint256)","d37d753f":"spin(address,uint256)","d37fe6cb":"balanceOfWithoutUpdate(address)","d3807fa5":"NameChange(string)","d380e036":"marketDefaultFeeLow()","d3811c0f":"setMetadataBase(string)","d38159b8":"testPass()","d38185d3":"_buyXid(uint256,uint256,bytes32)","d381ba7c":"setRootUser(address,bool)","d381c67e":"isRentAuction()","d383f646":"issue()","d384077d":"_closeProvider(address)","d384af87":"checkpopa()","d384d177":"haveCommonPrefixUntilZero(bytes32,bytes32)","d385293d":"confirmTokenTransferToBooking(bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","d38537cf":"TimerAuction(string,uint256)","d385fac9":"bwin()","d38609f9":"unhaltFX()","d386130c":"Encrypt(uint256)","d38685ee":"unlockGlobalToken()","d3872d57":"getLandRevenue(uint256)","d387978d":"cancelled(address,bytes32)","d387c4c1":"getOwnedTokens(address,address)","d3884c3f":"removeService(bytes32)","d38875ec":"addDeal(uint256,uint256,string,string,uint256,string,bytes32)","d388e416":"getAccountReferalsStats(address)","d3890a43":"DaoCasinoToken(uint256,uint256,uint256,address)","d3895c91":"changeConversionRate(uint256)","d38ac5ac":"WayBackToken()","d38bd9f0":"newTokenOwner()","d38bee56":"PlaceSell(address,address,uint256,uint256,uint256)","d38c3253":"ownerSelfDestruct()","d38c4cca":"removeFromTokenTransferDisallowedAddresses(address)","d38cba4b":"paymentRewardTokensPriority(uint256,uint256)","d38d0f28":"updateSplit(uint256)","d38e5ab7":"TransferDisable()","d38eb9d3":"escrowFrom(address,uint256)","d38f3b68":"getMedications()","d38fe43f":"setMembershipContract(address)","d390021d":"getLastTimeUpdated()","d390e819":"disableDonationContract()","d391014b":"ROLE_ADMIN()","d391a970":"removeFromOwnedTokens(address,uint256)","d391ce7a":"CrowdsaleContract()","d3927c15":"reimburse()","d392c5a2":"getNumOptionChains()","d3933154":"MYL(uint256,string,string)","d393c871":"register(string,address,uint256)","d393cde5":"wholeLineWrong()","d393f628":"changeDemurringFeeOwner(address)","d3943976":"getSGCUsers(address)","d3943ab4":"setIntArr(uint256,uint256)","d3943c83":"numberOfWithdrawls()","d3946ea4":"manuallyEndAuction()","d394a12e":"secondPresaleStart()","d39502bb":"AIBITTECH()","d3953822":"getThisAddress()","d395ee0f":"setQuickBuyPath(address[])","d3964ca1":"operationsEthWallet()","d397e9e4":"getDisputeCrowdsourcer()","d397f861":"TRAC_Tokens_left()","d3980d87":"ReferenceToken(string,string,uint256,address[],address)","d398806d":"updateMinJump(uint256)","d399354b":"KYC_USD_LMT()","d39aa15c":"_getTransferFeeAmount(address,address,uint256)","d39b0cbb":"Start10()","d39b1d48":"setDistributeAmount(uint256)","d39b7e4f":"setBPAddress(address)","d39bbf06":"MAX_INVESTOR()","d39c7880":"setAddressOfERC20Token(address)","d39c9afd":"OwnerKill()","d39cb111":"getShortId(bytes32)","d39cce1c":"calculateSaleReturn(uint256,uint256,uint16,uint256)","d39ce83a":"paymentMixed(uint256,uint256,uint256)","d39cee11":"benchTransfer(address[],uint256[])","d39d8fce":"presaleStart_6_December()","d39de6e9":"getAuthorizedAddresses()","d39e4607":"LogIcoCompleted()","d39eb301":"getStatus(uint8,uint8)","d39ebe2c":"setup(uint8,uint8)","d39ec1fe":"currentTethers(address,uint256)","d39f4149":"fxpMul(uint256,uint256,uint256)","d39f532d":"SafeGift(uint256,string,string)","d3a057c8":"isConfigured()","d3a05872":"AutoFareCalculator()","d3a0d0ab":"RTokenBase(uint256,string,string,uint8,bool)","d3a2d050":"addData(uint256[])","d3a3086e":"ActorCoin()","d3a39686":"getAddress(bytes32,bytes32)","d3a516d3":"viewSuperOwner()","d3a56ec3":"processRequest(uint256,uint256,uint256)","d3a5768b":"RoundWinner(address,uint256)","d3a57b9f":"showRdWonNum(uint256)","d3a5dcb0":"EQUITRADER()","d3a60bd5":"Exchange(address,uint256,uint256,uint256,address,address)","d3a61150":"setDatabaseDownloadUrl(string)","d3a699cd":"PePaDe()","d3a6be66":"donotXXXDappToken()","d3a6c234":"benWallet()","d3a70dba":"getReaderId(bytes32)","d3a73d12":"modifyLevelCaps(uint256[])","d3a85394":"currentPeriodTokenCollected()","d3a86386":"minimumBid()","d3a871e9":"REELToken()","d3a9187e":"mintTemplate(uint256,int256,uint256,uint256,uint256,string)","d3a99388":"JcashUpgradeableToken(address)","d3aa22c7":"transferTLA(string,address)","d3aa831f":"testOwnedTryAuth()","d3aceae2":"_balance(address)","d3ae2814":"LogTokensFrozen(bool)","d3aefeeb":"pauseUnpauseICO()","d3af4dc7":"processRequest(uint256,uint256)","d3b0d9eb":"refundFunds(address)","d3b15dd6":"Millet()","d3b19ee1":"dislike_trackable(address)","d3b234fc":"getAttoTokensToBeFounder()","d3b246d0":"upgradeEvilMorty()","d3b25696":"tradeIntentOf()","d3b302e7":"applyForMembership(string)","d3b3809c":"EscrowGoods(address,uint256,uint256,uint256,uint16,uint256)","d3b3eccb":"isARTDistributed()","d3b4be21":"Obtener_Reputacion(address)","d3b5305c":"setAgriChainDistribution(address)","d3b5695c":"setOraclizeCallbackGasLimit(uint256)","d3b58024":"RepeatCustomerToken()","d3b5c016":"submitSolution(uint256,string)","d3b5dc3b":"precision()","d3b6486a":"setLeastFund(uint256)","d3b6664a":"purchaseTrophy(uint256)","d3b6ac97":"defenceElementBySubtypeIndex(uint256)","d3b6fbc2":"MOVIECREDITS()","d3b7576c":"update(uint256,bytes32)","d3b7bcf1":"preAllocation()","d3b7bfb4":"fundingAddress()","d3b7ef5e":"SCE(uint256,string,string)","d3ba95ce":"throwsWhenFinalizingIfNotMultisig()","d3bac6e3":"coordinatorAccountCount()","d3bbb2c8":"b13ToBytes(bytes13)","d3bc89b7":"GetGuestTokenNo()","d3bc9aca":"addCourse(uint256,string,uint256,uint256,string,string)","d3bca884":"addBalance(address,address,uint256)","d3bced2c":"withdrawBotFee(uint256)","d3bd5a4b":"resetUserPromoBonus(address)","d3bd6e23":"newUpdater(address,address)","d3bd7713":"setCapAtDuration(uint256)","d3bdbd8f":"editMilestone(uint256,uint256,uint256,uint256,uint256,string)","d3bdd242":"isMovingEnable()","d3bf0ce6":"AAP()","d3bfe76a":"revokeApproval(address,address)","d3c0715b":"vote(uint256,bool,string)","d3c13c25":"GCOXAPLToken(string,string,uint8,uint256)","d3c18378":"getPlayersBalance(address)","d3c1c838":"batchTransfer(address[])","d3c33c52":"ipc()","d3c4055d":"VITE()","d3c41dae":"FindCourseBaseOnIdStudent(uint256)","d3c564ad":"tokenZLT()","d3c567c1":"cancelVoteForCandidateByStage(address,uint256,uint256)","d3c5ea45":"ICO_PHASE3_PERIOD()","d3c62676":"MiamiToken()","d3c65384":"ContributedAmount()","d3c65737":"sumICOStage4USD()","d3c683e5":"LOG_FailedDraw(address,uint256)","d3c6a6d6":"getWitnessCount()","d3c764f2":"buyPixelBlock(uint256,uint256,uint256,bytes32)","d3c78097":"startDistribuion()","d3c7adf9":"JimatCoin()","d3c7c2c7":"getSupportedTokens()","d3c7ca2f":"Allinone()","d3c8dd69":"Parent()","d3c8e99e":"_shareDiscountPrice(uint256,address)","d3c9ad17":"REBALANCE()","d3c9cc26":"getTokens(uint256)","d3caee1b":"currencyToToken(address,bytes16,uint256,bytes)","d3cc8d1c":"claimTokensFromSeveralAuctionsAsBuyer(address[],address[],uint256[],address)","d3cce1d2":"setOldContractData(address)","d3cd6052":"getProposalCount(bytes32)","d3cdb97b":"partIndexToOwner(uint256)","d3cde1a5":"updateReferral(address,uint256)","d3cde1c0":"getIndexAndCheckIfAllowedToPublish(uint256,uint256)","d3cdf6c5":"calculateTokenAmount(uint256,uint8)","d3ce71df":"buyCozy(uint256,uint256,bool,address)","d3ce77fe":"destroyTokens(address,uint256)","d3cea787":"setContractServerBlackWhiteListType(string,uint256)","d3cecc4d":"checkVestingCondition(address)","d3cedfee":"sspCount()","d3d10d87":"OwnerChanged(bytes32,address)","d3d18836":"publicLock(address,uint256)","d3d19965":"deleteCroupier(address)","d3d2172e":"total_reward()","d3d37a31":"setSaleCap(uint256)","d3d3b01c":"ToRent(uint256,uint256,uint256,address)","d3d3d412":"getGateAddress(address)","d3d43efa":"returnLoanStatus(uint256)","d3d44e8b":"getBlockCount(uint256,uint256,bytes32)","d3d54129":"setPCAddress(address)","d3d55493":"calculateRefundAmount(uint256,uint256)","d3d6a975":"testThrowsTransferNotEnabled()","d3d70c3c":"setPrivelegedWallet(address)","d3d77f98":"setCoeff(uint8,uint128,uint8,bytes32,bytes32)","d3d864f5":"isFundingOpen()","d3d8aa55":"IG()","d3d8acf8":"checkMyVestingPeriod()","d3d9e741":"SuperCoin()","d3da927f":"isRegistered(address,address)","d3daa8aa":"EtheremonPayment(address,address,address,address,address)","d3db2371":"DHCSToken()","d3dbc861":"Initiate()","d3dc9794":"pendingTxs()","d3dcc175":"devTeam()","d3dccb03":"ERC20Token(string,string,uint8,uint256,address,uint256,address[],uint256[])","d3dcd55a":"calcTokensFromEth(uint256)","d3dd9a18":"addManyAuthorizeToWhitelist(address[])","d3ddebce":"STATE_BET_DISABLED()","d3de5834":"disableFeesForUser(address,uint256)","d3deedfd":"MANHATTANPROXY2NDST()","d3df2d01":"maxUsdFundingReached()","d3e00f4b":"stampBirth(uint256,address)","d3e0996a":"checkProductGenuine(address,address,uint256)","d3e141e0":"left5(uint256)","d3e15747":"setLock(uint256)","d3e212c5":"bidExchange(uint256,uint256)","d3e242c2":"_confirmTransaction(uint256,address)","d3e2846a":"LINKFund()","d3e3623b":"earlyBackersAmountLeft()","d3e65414":"contributedToken(address)","d3e65b6c":"buyTicketByOther(uint256,bytes32,bytes32,bytes32)","d3e66a9e":"startCompetition()","d3e6dda7":"removeFound(address)","d3e6f49f":"isReadyToBreed(uint256)","d3e73312":"allocatedFounders()","d3e7d44d":"tokensBurnedTotal()","d3e82be8":"getMinPrivateSaleBuy()","d3e837cb":"setChecksOn(bool)","d3e848f1":"systemAddress()","d3e89483":"policies(uint256)","d3e8b207":"distributeWithLockup(address,uint256,uint256,uint256)","d3e91a98":"destroyAllTokens(address)","d3ea3322":"testBuildTokenSystemCost()","d3eb11d6":"payoutsWallet()","d3eb667e":"BigBoobsToken()","d3eb6f61":"isGoalReached()","d3ebd2dc":"transferFron(address,address,uint256)","d3ebf454":"LotteryRoundDraw(address,bytes4)","d3ecb95f":"wc()","d3ed0ea2":"setAuthor(uint256,string)","d3edcb0a":"_wholeToken(address)","d3edcb5b":"getCreditorAddresses()","d3ee86e7":"mmax(uint128,uint128)","d3eee5ad":"lockForDays(uint256,uint256)","d3efa856":"CreditBIT()","d3efbd7f":"freezeContract(bool,uint256,uint8[],bytes32[],bytes32[])","d3f01fbd":"calcToken()","d3f045d2":"Player(address,uint32,uint32,uint32,uint32,uint256,uint256)","d3f06def":"uploadFile(uint256,uint256,bytes32,bytes32[],bytes32[],uint256)","d3f16925":"setDevLimit(uint256)","d3f189bd":"COMMUNITY_ADDRESS()","d3f1a78c":"updateDelayTime(uint256)","d3f1fbd7":"updateLastMiningTime(uint256)","d3f233af":"burnOf(address,uint256)","d3f297d6":"claimLiquidityReward()","d3f2b996":"PTH(uint256,string,uint8,string)","d3f2e7cf":"runningRound()","d3f3bea2":"distributionRealized()","d3f40a02":"denyAccess(uint256,uint256)","d3f4fcd9":"claimInitialAllotment(string,string)","d3f60667":"trackBuyBack(uint256,uint256)","d3f60d9c":"startTimeRound2()","d3f6a157":"setWallets(address,address)","d3f6be9f":"LogDeposit(address)","d3f6c328":"AMOCoin(address)","d3f6dc52":"oracleItQuery(string,string,string)","d3f71ecc":"checkIsOnSale(uint256)","d3f73bd4":"getOwnerCEO()","d3f8868b":"getFrequency(uint256)","d3f8cc95":"exhaustAfterFusion(uint256,uint256,uint256)","d3f92288":"WhiteList()","d3f9ba69":"processOneCombat(uint32,uint32)","d3f9fc33":"ownerRecoverTokens(address,uint256)","d3faaeca":"softCapInTokens()","d3fbf39d":"mintNFTNotForSale(uint256,string)","d3fc310a":"_addExtraReceiver(address)","d3fc9864":"mint(address,uint256,string)","d3fd311e":"trading_deactivated()","d3fd9eba":"transferAuction(address,address,uint256)","d3fe1ae1":"updateMember(address,uint256,uint256,uint256)","d3ff09a5":"setTotalTaskEscrow(uint256)","d40027ec":"lockoutPeriod()","d401defe":"getBasicInfo(address)","d40224ec":"triggerSale(bool)","d402be57":"calcMode()","d402f87c":"setTotalProfit(address,uint256)","d4030114":"tableSize()","d40394be":"batchAddWhitelistedTransfer(address[])","d404d6c2":"pushEther()","d404ea23":"hashKey()","d405a069":"grantInitialAllocations()","d405d6f4":"Chally()","d40619b8":"getUsersScannersIds()","d4065763":"returnRemainingMoney()","d406e403":"test_startBlock()","d407d212":"claimJ()","d408746a":"GetContractAddr()","d4088e33":"setPrice(uint256,uint256,uint64)","d4092dd2":"getPOOL_edit_29()","d409a12c":"Kcoin()","d409ddda":"EtherizationUtils()","d40a71fb":"step1()","d40b9d9a":"OwnerHeartbeated(address)","d40c0a58":"saveTeamSpent(address,uint256)","d40c3084":"fundValues()","d40d4d76":"etherToSendBankRoll()","d40dc870":"MAX_AMOUNT()","d40e35da":"Interest_Rate()","d40e985d":"decompose(uint256)","d40e9b9c":"rakeEventPlaceholderAddress()","d40fa8bf":"ZRX()","d40fd402":"salarySent()","d41097e3":"disbandTo(address)","d4112c56":"changeUtilityAccount(address)","d41212c8":"_insertTokenMetadata(uint256,string)","d41376e1":"withdrawl(address,address,bytes32)","d4138673":"IkuraTransferToken(address,address,uint256)","d413bd66":"OfflineMultiSig(address,address,address[],uint256)","d414da2a":"addPatternUserIndex(address,bytes32)","d41584ab":"LogCertifierRemoved(address)","d416c997":"_stringsEqual(string)","d416d1a6":"lastInvestorPaidOut(uint256)","d416d4f3":"Balance(address,address)","d416efdb":"donationTo(address)","d417f18d":"getTopicNameAndVotesAt(uint256)","d4186ba4":"test_oneValidEqInt3()","d41977cd":"contractFee()","d419ef9f":"WinToken(address)","d41b6853":"enter(address,uint256,uint8,uint8,uint8,uint32[11])","d41bcb81":"phaseEndTime(uint256)","d41bdea7":"unlock(bytes32,bytes32,bytes32)","d41be98d":"createDebtToken(string,string,uint256,uint256,uint256,uint256,uint256,uint256,address)","d41c85fa":"__redeem()","d41cc314":"EventUpgradeTank(address,uint32,uint8)","d41e3281":"DocumentManager()","d4200f94":"setCreditBitContract(address)","d4203561":"transferFee(uint256)","d420e4e0":"BCaaS()","d420e527":"BuyLimitsCrowdsale(uint256,uint256)","d4212e93":"storeInitialClaim(address,uint16[],uint256,bool)","d4214d1b":"releaseUnclaimedBounty(address)","d42151b0":"FFCTToken()","d4229b1a":"appBase(bytes32)","d422cf58":"numLocks()","d422e4e0":"takeFee(address,uint256,string)","d422e810":"exchange_commission_wallet()","d423740b":"setter(uint256)","d423754b":"removeFactProviderFromWhitelist(address,address)","d4245e5b":"transferringETH(address)","d424f628":"fundingGoalReached()","d4269986":"getPuzzle(uint8)","d426b04e":"largeContribThreshold()","d426bb47":"allocateForPrivateSale(uint256)","d42706bd":"Batix()","d4270d60":"recall()","d427ccbf":"getEventAddress()","d427ce74":"getBylawsProjectDevelopmentStart()","d428bf3b":"SetdivForPrice(uint256)","d4291e0c":"num_hosts()","d429bfae":"currentTokenOffered()","d42a5011":"setPackLimit(uint16)","d42a9dd5":"ICO_PHASE1_PERIOD()","d42aa2f6":"getHealth(uint8[176],uint8)","d42ad6ea":"getMinAuditPriceMin()","d42b31b9":"_DeclineInsurance()","d42bd8a4":"receivedUETreturn(address,uint256)","d42bf301":"doTriggerTryAuth()","d42c334e":"DepositMasterContract(address)","d42cc0d1":"Planetagro_Exchange(address)","d42cda15":"getOnMintTargetValue(int256)","d42cfc41":"transferFeeDenominator()","d42d24fc":"auditContract()","d42d4c10":"PASSToken()","d42d8eed":"tag(address,uint256)","d42db190":"versionAddresses(bytes32,bytes32,address)","d42dca55":"getAuditors(uint256)","d42e26f5":"initializePresaleFundraiser(uint256,uint256,uint256,uint256)","d42e87ed":"callOnSignUp()","d42ed758":"MixManager()","d42eeb4f":"EtherDrugs()","d4300225":"publicGetBalance(address)","d430381b":"mayorCutPercentage()","d4313945":"setProviderInvitedUser(uint256,address,bool)","d431b1ac":"setPause()","d431ba8e":"lastBlock_v8()","d432a885":"withdrawedFoundationCounter()","d4331c21":"setSubTourFreezingTime(uint64)","d4332f50":"changeBPaddress(address)","d4335bd2":"getSevenCount()","d433ea6a":"CueCrypto()","d4346010":"verifiedTransferFrom(address,address,uint256,uint256,uint256,uint256)","d43503ab":"Sunset()","d4357107":"address_to_tokens_prev_week1(address)","d43582c8":"removeNOSPackage(uint256)","d4365b4b":"Weaver()","d436b6e2":"EtherAdvance()","d4371968":"MAX_IMMORTALS()","d4384156":"UbexToken(uint256)","d438fdbd":"offlineSales(uint256,uint256)","d439390c":"MIN_PURCHASE()","d43948ee":"transferGainedEther()","d439ef55":"distributionMinimum()","d43a0b4c":"hodlerTotalValue9M()","d43a7c16":"finalizePrivateIco()","d43c3bb9":"getData_30()","d43c45b8":"withdrawSurprisePot(address)","d43c5a4a":"setTeamVault(address,address,uint64)","d43ea9e1":"levelTwoTokenNum()","d43ef6b9":"__mulmod(bytes,bytes,bytes)","d43f24b0":"removeApprovedContractAddress(address)","d4403495":"OWN_mintToken(uint256)","d440c6f3":"getWorkerAffectation(address)","d441ea62":"CleanBankerProfit(uint8)","d4430bc7":"tokenSaleOngoing()","d443173d":"requestUnFreezeAccount(address,string)","d4434387":"PolyCompliance()","d443f64a":"Start_Resume_PreICO()","d443fc85":"acceptGuardianVend(uint256)","d4440991":"callTransfer(address,uint256)","d44512e3":"changePrestige(address)","d445afdc":"week1Price()","d445cc78":"unfreezeTransfer()","d44750f5":"bonus_price()","d448273c":"mineForMany(address[],bytes32[])","d4483263":"secondRoundMayStart()","d4492c57":"addInvestorGrant(address,uint256,uint256,uint256)","d449844d":"XbitfwdToken()","d449a832":"decimals(address)","d449ce7c":"Administered()","d44a2863":"changeBooking(string,uint256[],uint256,address,bytes32)","d44aadf7":"initROS()","d44aecb0":"ico1_startdate()","d44b01ec":"safeWithdrawERC721(address,uint256,address,address)","d44bc088":"getTaskId(uint256)","d44cf3dc":"_setPriceFactor(uint256,uint256)","d44d3394":"WIDTH()","d44dbbaf":"addStringComparison(bytes32,bytes32,bytes1)","d44dd681":"beginLiquidation()","d44f2d3d":"getInitialWithdrawalDone()","d45036c7":"viewTeamTokens()","d4508698":"driveCar()","d4524c72":"manualEtherWithdraw()","d45294f5":"charityAmtToCharity()","d45318b9":"scoringDuration()","d4538051":"_emitHolderAddressAdded(bytes32,address,uint256)","d454f92e":"mNumVoters()","d4550efd":"addEngineerQuest(address)","d455b973":"changeStageBlock()","d4565916":"activateproduct(uint256)","d45769b8":"N2Contract()","d4582b56":"Token(string,uint8,string)","d4589835":"sellMorties()","d458c522":"participantCapTier1()","d459197b":"distributeALCTokenBatch(uint256)","d4595aaa":"blockExpiration()","d459654a":"techSupport()","d45973f4":"turretElementBySubtypeIndex(uint256)","d4597aa1":"tokenFrozenUntilTime()","d45a717e":"topGoodsId()","d45b1ae4":"StandardGasPriceLimit(uint256)","d45b5f71":"getIcoStep(uint256)","d45baeab":"Deposit(uint8)","d45bcac1":"listAddresses(address[],uint256[],uint256[])","d45c1b06":"Bank(string)","d45c241c":"minBonus()","d45c4435":"getTimestamp(bytes32)","d45e09c1":"canTransfer(address,uint256)","d45efad5":"getAccessControl(address,address,uint8)","d4607048":"buyForEverybody()","d461518c":"p_setGameDuration(uint256)","d4616967":"deployCode(bytes)","d4620041":"getFirstRoundReleaseTime()","d4625a3a":"equals()","d4629ae7":"ddftFund()","d46300fd":"getA()","d4631019":"_startCounter()","d4638401":"oneImpInWei()","d4638fea":"operatorRedeemByTranche(bytes32,address,uint256,bytes,bytes)","d463ca18":"findSsp(address)","d463eeb3":"numLoans()","d464520c":"PowX()","d4649fde":"expire(uint256,uint8,bytes32,bytes32,bytes32)","d4653a3b":"EXToken()","d465abca":"notInArray(address)","d466a03f":"citizensAmounts(uint256)","d466a046":"LogBidExpired(bytes32)","d466ab6b":"ROLE_BOUNCER()","d467cc00":"calculateRate(uint256,uint256)","d467cc64":"DoubleOrNothingImpl()","d4683f6d":"ArticCoin(uint256,string,string)","d4686534":"LYNIA()","d46a005a":"addWhiteListUser(address,uint256,uint256)","d46a5d7e":"vote(uint256,bool,uint256)","d46aa610":"buyInMarket(uint256)","d46b2987":"Luvtoken()","d46b9b84":"lifeN(uint256)","d46ba0c9":"etherRaisedPerWallet(address)","d46c0f40":"finishPrivatePlacement()","d46cddd4":"capPresale()","d46d0393":"getNextRegionId()","d46d0a22":"setV_S(uint256)","d46d79bb":"withdrawAllEth(address)","d46dbca1":"developerTemplateAmountLimit()","d46dd5bb":"showCurrentWinner()","d46ea4a4":"EXP_18()","d46eb119":"wrap()","d46f8eb1":"getSource(string,string,string,string)","d46ff2f1":"getTweetsDiff(uint256)","d470097c":"lastLargestHODLER()","d4701c35":"activate_kill_switch(string)","d4702576":"calculateTokens(uint256,uint256,uint256)","d4724a57":"TokenTransferForFounder(address,uint256,address,address)","d472d6bf":"get_token_balance(address)","d472fa26":"lockTokenToDate(address,uint256,uint256)","d472fe7e":"totalTokensICO1()","d4735d92":"Transfer(bytes32,address)","d4737d11":"setSampleRegistry(address)","d47380e0":"_mintToken(address,uint256,uint256,string)","d4740b78":"getAmountWeekly(uint32)","d4747f0a":"IQC()","d474a352":"submitBlockHeader(bytes,uint256)","d47510c0":"UNICORN_ID()","d475526f":"numActiveGames()","d475b1ab":"phase5Price()","d475bfa8":"proxyClaimTokens(address,address)","d47637f7":"getLittafiContent(bytes32,uint256)","d476620b":"winnerKey()","d476758f":"extractablePercentage()","d4768994":"soldIdeaWeiPostIco()","d477e3d4":"checkAddERC20(address)","d477f05f":"setDev(address)","d47875d0":"getScore(address)","d4788cc3":"HGT_Reserve()","d478f533":"allowFreezing(address)","d4793a9b":"getNextGuessId()","d4798327":"getPendingBattleRewardsCount(address)","d47a2010":"bnbRaised()","d47b44c3":"Fool()","d47bb75c":"TOKENERC20(uint256,string,string)","d47c0fb0":"onIncome()","d47c9e11":"eastadsCREDITS()","d47cc085":"sameNum()","d47cc9d7":"start_the_race()","d47cf598":"setDayThird()","d47d3202":"releaseINATokenToTeam()","d47d5cfe":"swarmTree()","d47d996e":"addCrowdSale(uint256)","d47dbde2":"buyerFundRelease(uint256,address)","d47e813d":"SteveCoin()","d47e81eb":"blockSettlement(uint64,uint64)","d47eb8ee":"validCall(uint256,bytes)","d47eca0a":"checkDiv()","d47ee6c1":"numberOfLeaderboardPlayers()","d47f269e":"getHand(uint256)","d4807fb2":"initializeRound()","d4810b61":"PRE_ICO_START()","d48210bc":"perValue()","d4821432":"endICOStage8()","d4849a8b":"newEthBackedLoan(uint32)","d484a285":"PRE_ICO_SLGN_LESS()","d48599e3":"setdrawadm(address)","d4859dbc":"UniversalFunctionSecure(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)","d4859dc5":"disableManager(address)","d48675f3":"minGoal()","d4867694":"updateship(uint256,uint256)","d48684d8":"changeLimit(uint256,uint256)","d4868c32":"tokenReserved3Deposit()","d486d129":"releaseVesting(address)","d4871517":"BTCLotto(address,uint256)","d487758a":"forgive(uint16,uint32)","d4878cac":"_transferChild(address,address,uint256)","d487b21a":"assets_controller()","d4884b56":"getEventEnd()","d4897729":"getCET4InfoById(uint32)","d489a018":"adminAddWorldBalance()","d489b701":"starEthRate()","d489b83f":"teamOneShares()","d489c0bf":"getBuyCount(address)","d489e180":"getPendingPartCrateLength()","d489fc8b":"_useOraclize()","d48a1f6e":"returnPurchasedEther()","d48a9340":"SaveCryptoToken()","d48b2e92":"Identify()","d48b55e5":"calculateTokenOnlySellPrice(uint256)","d48b7a9d":"CryptoMyWord()","d48bb321":"next(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes4,uint256)","d48bfca7":"addToken(address)","d48c4193":"addWhitelistedTransfer(address,address)","d48d02f6":"withinLimits(uint256)","d48e638a":"getCreator(uint256)","d48e6a1b":"TEAM_TOKENS_PERCENT()","d48e9cd5":"OMG()","d48ea599":"getBeneficiaryByTime(address,uint256)","d48f08e5":"disableRegulator(address)","d48f7196":"numHodlers()","d48fb85c":"FIVE_YEAR_KEEPING()","d48fe280":"OK()","d4912ab1":"SNTPlaceHolderMock(address,address,address,address)","d491461a":"Gnosis()","d492283f":"switchLock(bool)","d4923d4e":"getUserVote(address)","d493b9ac":"transferAnyERC20Token(address,address,uint256)","d494c388":"setMinBuyAmount(uint256)","d49620ec":"RoundFinalized(uint256)","d49636c2":"san()","d496a4f1":"cashBackVotes()","d496bde4":"mainSaleTime()","d496f9d2":"PlayReferred(uint8,uint8,uint8,uint8,address)","d4971613":"HashBounty()","d49758d6":"use_bounty_token(address,uint256)","d4975d71":"changeVoter(address,address,string)","d4981928":"WorkOrder(uint256,address,address,address,address,uint256,string,address,address)","d499555b":"getFirstActiveDuel()","d49982cc":"sendPreSaleBonusMany(address[])","d499b2c3":"pks(uint256)","d49ab244":"ICOWhitelisted(address)","d49ad161":"addTokenDetails(uint256,address[],uint256[],uint256[],uint256[])","d49c51b7":"claimedMK(address)","d49ce78d":"WiggaToken()","d49d1836":"openegg(uint256,uint256)","d49d1bac":"transferERC223(uint256,address,address,uint256,bytes)","d49d5181":"MAX()","d49dbb5c":"minBalanceToSell()","d49dd9a8":"getStateofContract()","d49dd9e4":"SonnetCoin()","d49edbd8":"lastPrizeGiven()","d4a03f60":"acceptAdoptionRequest(bytes5)","d4a04ff4":"importFromOld(address,address,address,address,address[],uint256[])","d4a226c3":"bountyManagerDistributionContract()","d4a2498d":"addData(string)","d4a24f06":"checkPermissions()","d4a28823":"EOSSale(uint256,uint128,uint256,uint256,uint128,string)","d4a2f3ca":"getShipAuctionEntity(uint32)","d4a34564":"start3BonusPeriod3()","d4a34a9e":"tokenDecimalsLeft()","d4a3e9d7":"capture()","d4a436cc":"_countBits(uint256)","d4a4513e":"fpct_packet_size()","d4a61d61":"OnlineCasinoCoin()","d4a631ab":"ContractLogEvent(int256,int256,uint256,string,string)","d4a67930":"openBuy()","d4a6fd3e":"has_presale_started()","d4a8d9ba":"Inbox(string)","d4a9991f":"requestDividends()","d4a99d61":"finishDelivery()","d4aa6b59":"Button(uint64,uint64,uint64,uint64,uint64,address)","d4aa7394":"GameStatusUpdate(bool)","d4aa7d38":"City(uint256,string,string)","d4aae0c4":"kernel()","d4ab4a89":"_migrateRobot(string)","d4ac6af5":"MAX_REFERRAL_TOKENS()","d4acaf6c":"ecrecoverFromSig(bytes32,bytes)","d4acfa01":"tokenFrozenSinceBlock()","d4ad678e":"addItem(bytes16,uint16,uint16,bool)","d4ae1061":"getPurseDetails(uint256)","d4afc8b6":"retrieveERC(address)","d4b03d34":"changeValueBonus(uint8,uint256,uint256)","d4b088f9":"ICO_PHASE2_AMOUNT()","d4b0a23b":"addWhitelists(address[],uint256[])","d4b0c6e5":"stringToBytes10(string)","d4b0e966":"changeSaleStart(uint256,uint256)","d4b15ee0":"LogRefund(address,uint256,uint256)","d4b175d4":"mineTokens(address,uint256)","d4b182d4":"block(address,bytes32)","d4b1a462":"LogBought(uint256)","d4b1cdcc":"isResolverFor(uint256,address)","d4b1d19f":"testThrowsTransferDisabled()","d4b2931c":"tokenSEEDcap()","d4b2d5f0":"SQR_TOKEN()","d4b3f5b6":"tokenWithdraw(address,uint256,uint256)","d4b572be":"RESERVE_TOKENS_SUPPLY()","d4b64f35":"getBalanceOfModifiedWeth()","d4b71aa9":"maxPresaleWei()","d4b795c0":"getCurrentRoundEntry()","d4b83992":"target()","d4b8a6f1":"setFeeSchedule(uint256,uint256,uint256,uint256)","d4b9e410":"coiner()","d4ba15ad":"earlyPariticipantWeiPrice()","d4ba769c":"getLatestComponent(string)","d4badfad":"totumAllocation()","d4bb02e4":"changeRatePreSale(uint256)","d4bb1f28":"FCOIN1346Token(uint256,string,string,uint256)","d4bc0942":"withdrawOracleFunds()","d4bc87d9":"currentPriceChangeNumber()","d4bcffe4":"AbxyjoyCoin()","d4bd5a0d":"addCollaborator(uint256,address)","d4bdb879":"tokenSaleHasFinished()","d4bdc45f":"downvote(uint256,int256)","d4bde313":"ownBalance()","d4bdfe00":"ETCTransfer(address,address,uint256)","d4be5f68":"ATL_PER_ATP()","d4be6356":"authentication(bytes8)","d4be7714":"bornFamedStar(uint256)","d4bffa5a":"STATE_INITIAL_BIDDING()","d4c0cbce":"NovaCoinTransfer(address,uint256)","d4c1089b":"WorldRecord(string,bytes32,address)","d4c24db7":"StarterTokenSale()","d4c2b6b1":"scheduleTransaction(address,bytes,uint256[5],uint256)","d4c30ceb":"getFeeBalance()","d4c3eea0":"totalValue()","d4c46fa6":"setDeploymentPriceYear(uint256)","d4c49094":"WithrawDevToken()","d4c50f00":"coinPerEth()","d4c55f56":"wkaToken()","d4c6d9ad":"getbetresult(bytes32)","d4c72e7f":"etherollBeneficiary()","d4c76e8b":"MaxToken()","d4c80edf":"amountWagered()","d4c8fdae":"saleEtherRaised()","d4c9b1f2":"setMainAddress(address,address)","d4ca68ea":"replacePolicyTo(address,uint8)","d4cab39b":"AddedPrecommitment(address,uint256)","d4cae6e2":"getMetadataURL(bytes,uint256)","d4caf2a4":"setCodeSize(uint256)","d4cd5509":"CulturalCoinCrowdsale(uint256,uint256,uint32,uint32,address,address,address,uint256,uint256,uint256,uint256,uint256)","d4cdeb3c":"isInPresale()","d4ce1415":"detectTransferRestriction(address,address,uint256)","d4ce545a":"random(bytes32)","d4cf02ef":"getStringToSignWithKey(string,int256)","d4d0aced":"transferPartOfUnsoldTokens(address,uint256)","d4d0d6e6":"addTrusted(address)","d4d0e931":"resetAllVotes()","d4d1b7da":"approveTokensFromAnyWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)","d4d227de":"PBToken()","d4d2af8d":"sellCoin(uint16)","d4d2e23c":"LogRandom(uint64)","d4d30bd9":"GreenX(address,address,address)","d4d33ece":"isRebirthAllowed(uint256,uint256)","d4d37883":"sendSurplusTokens()","d4d42658":"getTokenRateEther()","d4d42c91":"SetupML(uint256,uint256,uint256,uint256)","d4d5d32a":"collectFee()","d4d64f2b":"getRevokeHash(bytes,uint256)","d4d6adc0":"SiliconXCoin()","d4d6cdc4":"getStageTotal()","d4d6d366":"metadataUrlSuffix()","d4d6f5ee":"deleteChannel(address,address,address)","d4d70128":"totalContributions(uint256)","d4d728fe":"IsClaimed(bytes32)","d4d7b19a":"isHolder(address)","d4d81a13":"ClownCore()","d4d82dae":"MCFitCrowdsale(uint256,uint256,uint256,address)","d4d84da5":"addTokenShop(address,uint256)","d4d90bd5":"MINIMUM_PURCHASE_AMOUNT_IN_WEI()","d4d91bdd":"_createOpinion(string,address,uint256)","d4d92b14":"mintInternal(address,uint256)","d4d96ac5":"flag(string)","d4d9748d":"NeoToken()","d4d9bdcd":"approveHash(bytes32)","d4d9f559":"addWhiteListAddSetAuctionObj(address,uint256,uint256)","d4db3791":"processTransferResult(address,address,uint256,bool)","d4dc8e83":"walletCreateSnap(uint256,uint256)","d4dca69b":"thisAddress()","d4dcbc60":"declineApproval(uint256)","d4dd1594":"updateLandData(int256,int256,string)","d4dd26fb":"initKYCUser(uint256)","d4dd5d99":"LiteXTokenVesting(address,uint256,uint256,uint256,uint256,bool)","d4dd707f":"upgrade_node(address,address,string)","d4dd92a9":"TeamAllocation()","d4def0ba":"escrowedTokens()","d4df0c6d":"setSaleAuctionAddress(address,address)","d4df1be8":"getETHNeedPay(uint256,uint256)","d4df6152":"getInvestorByIndex(uint256,uint256)","d4df89e2":"messageBoard1(string)","d4dfadbf":"getMarket(address)","d4dfc4b9":"MinimalManuscript(bytes32,string)","d4e12f2e":"approve(address,int256)","d4e17e6d":"closeBuy(bool)","d4e19bd1":"HART_NETWORK_ID()","d4e30489":"NewYorkCoin()","d4e32938":"subuser(address,uint256)","d4e4716f":"_setWhitelistedUser(address)","d4e4841d":"tokenToEthTransferOutput(uint256,uint256,uint256,address)","d4e678b8":"refundTransaction(uint256)","d4e75363":"NextDistribution(uint256)","d4e77133":"SendCoin(uint32,uint32,uint32,address)","d4e78272":"Draw()","d4e7b9cf":"amountAvailableToCashout()","d4e823a3":"createVendingItem(uint256,uint256,uint256,uint256,uint256)","d4e8b749":"periodITO_weiPerToken()","d4e8e063":"startGrantAuthentication(address)","d4e90e24":"CCTC()","d4e93292":"withdrawal()","d4ea7b08":"_emitPublicCapabilityRemoved(address,bytes4)","d4eaa9fd":"approveAndCall(uint256,bytes)","d4eb139d":"migrateSet()","d4eb21ff":"PonderAirdropToken()","d4eb4186":"setB0xAddresses(address,address,address,address)","d4eb4540":"BLOCKTIMEOUT()","d4eb487e":"getProtectHourglass(bytes32,uint8)","d4eba667":"updateNovaContractAddress(address)","d4ebc5ff":"voteUp(uint256)","d4ed0b46":"setCRaddress(address)","d4ed2cf5":"candidateTillExchange()","d4ed8990":"updatePoolAddressCapTier1(uint256)","d4ee025f":"resetRequest()","d4ee1d90":"newOwner()","d4ee4041":"removeBlock(address)","d4ee9415":"addPurchased(uint256,uint256)","d4ee9fba":"existPublicKey(bytes32,address)","d4eec5a6":"optOut()","d4efcfe4":"getAccountInformation(uint256)","d4f04289":"ownerSellArmy(uint256,uint256)","d4f06298":"UpdatedMainAccount(address)","d4f0ca3f":"onlyTestSetTimestamp(uint256)","d4f0ebe6":"getWeaponNb(uint8[176],uint8)","d4f114a6":"numOfBoundaries()","d4f11ab2":"updateCompanyWallet(address)","d4f2e67c":"ico(address,uint256)","d4f2f1da":"EthereumNano()","d4f397b5":"getLootClaimed(uint256,address)","d4f3d6b8":"updateEditionType(uint256,uint256)","d4f3dd84":"_generation()","d4f50f98":"getVoter(address)","d4f639ea":"run2()","d4f6aa98":"getLargePaymentBonus(uint256)","d4f7329e":"minttoken(uint256)","d4f74bf4":"curatorAccount()","d4f77b1c":"joinGame()","d4f96a09":"giveawayAddr()","d4fa83c3":"setWhitelistTx(address)","d4fa9021":"DeductABS(uint256,uint256)","d4fac45d":"getBalance(address,address)","d4fb0bc1":"payOut(uint256,uint256)","d4fb0d23":"totalGuess()","d4fb9a01":"tradingStatus()","d4fbe1e0":"devAllocation(address,uint256)","d4fbeb19":"registerToken(address,string)","d4fc5822":"userWeiSpent(address)","d4fdbcff":"ViewDividendPoolEnds()","d4fef717":"APC(uint256,string,string)","d4ff60cb":"URB()","d4ff88d5":"TokenSent(address,uint256)","d4ffd1bd":"updateStrategy(uint256,string,string,string,address[],uint256[],bytes32)","d5002f2e":"getTotalShares()","d50030ad":"getMyDividends()","d5005c35":"COINVR()","d5009584":"getManager()","d500ca00":"assignReward(address,uint256)","d500dd6a":"challengeTimeout(uint256,bool,address)","d500f861":"buyFromWallet(uint256,bytes32)","d501953d":"poolTokenAmount()","d5020ce8":"daysMinutesTilExpiryTime()","d5025625":"terms()","d502db97":"getAddr(string)","d5034f2f":"changeRegistrationStatuses(address[],uint256[])","d503d33f":"MyPoolBalance()","d503e948":"developer_edit_text_minimum_period(string)","d503ef95":"getCategoryEvaluation(address,uint256,uint256,address)","d50495f4":"addTransaction(bytes)","d504cb65":"currentBet()","d504ea1d":"getArray()","d5050493":"tokenOf(address,address)","d505c1cf":"currJackpotBetID()","d506355c":"getRentInfo()","d5064037":"BitcoinVision()","d5065090":"setVendingStartPrice(uint256,uint256)","d5072607":"auditTimeout()","d5089396":"Token(string,string,uint8,uint256)","d509b16c":"testWithdraw()","d509b1f9":"like(address,address,uint256,string,address)","d50a04f4":"dataPerUsd()","d50a3d2c":"privateSale(address,uint256)","d50b3065":"addTokenBalance(address,uint256)","d50b65d7":"startBlockjack()","d50b7123":"testLockTokensForTrading()","d50bb794":"getComponent(uint256,uint256,uint256,uint256)","d50cb88b":"priceMultiplier()","d50d4822":"revokeParticipation(address)","d50e38c6":"IbkToken()","d50e829e":"setStopped(bool)","d50f6bf0":"transferETH(address)","d50f6d3a":"getPartner(address)","d50f7c73":"lastBlock_v10()","d5102704":"testRenameStore()","d51033db":"getTuple()","d5119402":"PUBLIC_SALES_3_PERIOD_END()","d511beec":"WithdrawICOEarnings()","d511cc49":"DAILY_PURCHASE_LIMIT()","d511f6c0":"startBuyingTokens(bool,uint256,uint256)","d5144eca":"updateUserBio(string,string)","d515b1ce":"Team(address)","d515be39":"getTokenName(address,uint256)","d5167b26":"partialTrade(uint256)","d5170fcc":"BonusFinalizeAgent(uint256,address)","d5171523":"euroteambet()","d517bc6f":"calcPointShamir(uint256,uint256,uint256,uint256)","d5182b70":"blocked(uint256)","d5185115":"forwardTokens(address,address,uint256)","d51902cf":"fallbackAccount()","d5193235":"mintUserAdoptionTokens()","d519bdcb":"distributeSML(address[],uint256)","d519fdc5":"alterGiveKarmaFee(uint256)","d51abbd9":"updateMaxTxGas(uint256)","d51c2454":"stepOne(int256)","d51c86e7":"setData_12(string)","d51d4fa8":"Securities_3()","d51e1737":"creedex(address,address,address,uint256,uint256,uint256)","d51eda9a":"AMC()","d51f5abd":"BEXMToken(uint256,string,string)","d52230c4":"totalContributionsBySender(address)","d5235a04":"contractEnable()","d5246eba":"queryRandom()","d5250364":"checkWrapperBalance()","d52550a4":"TokenPool(address,address,address)","d525aa32":"conditionalTransitions()","d5260eea":"getChannelAddress(string)","d526b9bd":"_allow()","d526c08e":"uv()","d526c40c":"_denyPublishSecret()","d526d332":"getLogic(uint256)","d526eaeb":"getMaximumReadsPerStep()","d5280c28":"AuthorizedCreate(address,uint256)","d529a072":"buyAddress(address,bytes8,uint256)","d529debb":"subOnHold(uint256)","d52a3524":"addAction(bytes32,bytes32,string,uint256,bool,uint256,uint256)","d52a5fc4":"decomission()","d52a7cbf":"setWallet1(address)","d52a7e86":"totalRewardedAxies(bool)","d52b38cd":"updateVendorApplicationStatus(string,string,string,string,string,string)","d52b5cb4":"_addLegitRace(address)","d52b79bd":"XTT()","d52b8a0e":"addVineyardEndorsement(string,uint256,bool,string,string)","d52b9e40":"activateTokenSwitch()","d52c6c08":"approCertificate(uint256)","d52e4633":"futureRoundTokensRelease()","d52f7122":"myCredit()","d52f916f":"setAddressCrowdsale(address,address)","d530040a":"createAddressHash(address,bytes32)","d5307b0c":"weiContributed(address)","d53087b2":"JANUS()","d531eeaa":"icoBonus1()","d5320300":"getWithdrawableAmountANPES(address)","d532968f":"_chkSellerLmts(address,uint256)","d532df3c":"setCraftAuctionAddress(address)","d532e481":"activateFrozenAccount(address)","d533d0db":"changeUserLangAbility(bytes32)","d534831c":"sumOfWeights()","d5349606":"removeDeadTurns(uint16)","d535268d":"BUZZ()","d5353792":"setWithdrawGasCost(uint8)","d5356b7d":"TOKENS_PER_USD()","d5356fe1":"tokenFallback(address,address,uint256)","d53590a7":"durationPreSale()","d5364231":"forcedRedeem(address,uint256)","d536c3ae":"beginPhaseTwo(uint256)","d5370904":"getAvailableTokenCount()","d5375a5c":"getHigherInstance()","d537c3e3":"blockLockActive()","d537df3c":"claimTwitterIdIfNeededThenStealCardWithTwitterId(uint256,address,uint8,bytes32,bytes32,uint256)","d537e131":"calculateMatchPrice_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes)","d538359e":"Copeland()","d5387acb":"buy4(address[],address[],uint256[],bytes,bytes,bytes,bytes)","d539a014":"SSDTokenSwap()","d539a226":"assertEq10(bytes10,bytes10,bytes32)","d53a9b85":"tokensPerCents()","d53aaec2":"cPT()","d53abe1b":"stopRound(bool)","d53b2679":"activated_()","d53b4ab4":"communityAllocation()","d53b932a":"percentLeft()","d53bb6ac":"EthBita()","d53bc605":"testMultitransfer1()","d53beee4":"isOk(bytes1)","d53c61bf":"slasherAddress()","d53ca3c7":"setDiscountMember(address,address,string,bool)","d53ce956":"setOperationAddress(address)","d53dbe8e":"publishier()","d53e963b":"buyCore(uint256,uint256)","d53f1cbd":"getBidFee(uint256)","d53f8208":"fundaria()","d541ca5d":"BONUS_PCT_IN_ICONIQ_SALE()","d5420df4":"drawToHand(uint256,uint32,uint256)","d5425571":"gasonBuffPercentage()","d543f9d6":"setTeamPerfitAddress(address)","d544361e":"increaseShares(uint256,address)","d544e010":"removeAuthority(address)","d5456bc6":"lastBlock_a14Hash_uint256()","d545782e":"updateTokenRate(address,uint256,uint256)","d545ee2d":"CustomToken(string,string)","d54604ae":"min_fundingGoal()","d54656d5":"startTrade(address,address,uint256,uint256,uint256)","d546c975":"getCharacterServer(uint256)","d5472a5e":"userRewardAccountBalance(address,address)","d5472fcb":"removeWhiteLister(address,address)","d5477d37":"getColdWalletAddress()","d54839bf":"FEE_DEV()","d54a6bfb":"setHmcAddress(address)","d54ac04d":"get_master(bytes32)","d54ad2a1":"totalClaimed()","d54ad593":"getgamecardintro(uint256)","d54b02ec":"weiToCollectByInvestor(address)","d54b066f":"calcAmount(uint256)","d54c03a9":"NOORToken()","d54c2a63":"improveCard(uint256,uint256,uint256)","d54c4726":"usageCost()","d54c7099":"TVContract()","d54c7b4f":"_triggerCooldown(uint256)","d54c8c87":"emitApprove(address,address,bytes32,uint256)","d54ced9c":"canContributeAmount(address,uint256)","d54cefc1":"transferTokens(address,address[],uint256[])","d54dc5eb":"REGISTRATION_COST()","d54dd8f9":"slice4(bytes,uint256)","d54e583a":"transferFrom(address,address,uint256[],uint256[])","d54f4dd6":"TestVeryCoin3()","d550172a":"verifySig(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,address)","d5503d5f":"payBalance()","d550668d":"setContract(bytes32,uint256,address,address)","d550f044":"setAllowLocalBuy(bool)","d55108be":"JOLDEAME()","d5518feb":"RequestCollectInterface(address)","d551f601":"_auth_mode()","d552844b":"signTrueloveByCOO(bytes32,string,string)","d55321db":"newGame(address,string,string,uint256,uint256,uint8,uint8,uint8,uint256)","d5537c0d":"setUsersCap(uint256)","d553adf0":"frozenFunds(address)","d5544f94":"getFundsAndAvailable(address)","d5547587":"ReviewToken(uint256,string,uint8,string,address)","d554ba86":"round_b_begin_date()","d554f8b4":"changeDeDeStorageAddress(address)","d5551518":"CapitalMiningToken(string,uint8,string,string,uint256,uint256,uint256,uint256,uint256,uint256)","d5556544":"offset()","d5562901":"getFeeSchedule()","d5563f31":"createAuction(uint256)","d556c8f5":"getHashID(address,bytes32)","d5572bd6":"closeCrowd()","d5582205":"getCertifiedStudentAtIndex(uint256)","d5582965":"stopMint()","d55a772d":"getCurrentOwner(string)","d55ac94c":"WhiteBullsToken()","d55b7703":"privateIcoCap()","d55b9f4d":"DISCOUNT_PRIVATE_PRESALE()","d55bc06a":"LDEX()","d55bdc5f":"getCampaignPriceById(bytes32)","d55c4af8":"_p3dSellPercentage(uint256)","d55c980f":"submitEntry(bytes,string)","d55c9c84":"confirmWinner()","d55cc3e2":"JSONpath_raw(string,string)","d55d1fed":"EGGS_TO_HATCH_1Dragon()","d55e62a0":"removeTrusted(address)","d55e725b":"initialFunds()","d55ec654":"wash_list(uint128)","d55ec697":"upgrade()","d55edcfd":"freezeChangesToVesting(address)","d55fe582":"isAssociated(address)","d560f696":"releaseRoto(address,bytes32)","d561be54":"createVestingContractWithConstantPercent(address,uint256,uint256,address,uint256)","d561ef2b":"setMinBuyableAmount(uint256)","d562a121":"calcTokens(uint256)","d562de0b":"investor_insert(address,uint256)","d562deef":"getAffiliateFee()","d5630f71":"AlpenCash()","d5635444":"getCoupon(string)","d5656ccf":"getWager()","d5666b5f":"versionBase(bytes32,bytes32,address)","d5667d8a":"updateUSDWEI(uint256)","d5668a92":"_checkTransactions(address)","d5670f59":"VisualChainToken()","d567c0e1":"cashBackWeight(address)","d5687efd":"WhitelistSetDay(address,uint8,uint256)","d5698726":"LogSetPicosPerEther(uint256)","d56a0a88":"bipedaljoe()","d56a4555":"setLink(uint256[2])","d56a62cf":"getPurchases(address,uint256)","d56a9314":"transfer_m(address,uint256,string)","d56b2889":"finish()","d56b7577":"BM_ICO()","d56b7746":"mintTokenCollection(string)","d56bd142":"getPayments()","d56cd796":"addNewCourse(int128,string,string,string,string)","d56d229d":"nftContract()","d56de6ed":"adminAllowance()","d56e3068":"getTotalDonated()","d56ea1b0":"pausePending()","d56efabf":"LockableToken()","d56f279f":"resignOwnMembership()","d5708d5a":"setMinAmount(address,uint256)","d571829e":"mintTokensToEralyInvestors()","d571a9a9":"Hawaii()","d571dbac":"getHeadInfo()","d571e645":"validStoreBuff()","d571edb0":"getExchangeGroupsLength()","d572056e":"testItem(bytes)","d5722518":"setUintsOwnerCount(address,address,uint256,bool)","d5723bf7":"finishGame(uint256,uint256)","d572fd99":"getPlayerCardsNumber()","d574bcdf":"reLoadXname(uint256,bytes32)","d575af74":"getSubscriptionServiceId(bytes32)","d575f332":"updateCampaign(address)","d5762230":"overStakeAgeBurn()","d5767fb6":"_emitCapabilityAdded(address,bytes4,uint8)","d576dc58":"TOKEN_SALE_LIMIT()","d5775f5c":"getCurrentSellPrice()","d5778d37":"preIcoTokens()","d5778efa":"STASHToken()","d5778f07":"transferAdvocatedTAOLogos(address,address,address)","d5779b7f":"imageUploadComplete(address[16],uint256)","d577ab70":"authorizeEscrowService(address)","d577d785":"setJPYC(address)","d57869d4":"findTrustedContract(address,address)","d578ec6c":"uploadData(bytes32[100])","d578f434":"BONUS_PCT_IN_VREO_SALE_PHASE_2()","d579f9e8":"changeBinary(uint256)","d579fd44":"approveNextOwner(address)","d57a0577":"TEAM_BONUS_PER_CENT()","d57a12f5":"testCheckSigs()","d57a9e4f":"LATER_AUCTIONS_INITIAL_PERCENTAGE()","d57ad588":"hashToSign_(bytes32)","d57b8932":"leaseBlock(uint256,uint256,uint256,bytes32,bytes32,bytes32,bytes32)","d57bde79":"highestBid()","d57c00de":"PayForServiceETH()","d57c1ea2":"addIssue(uint256)","d57c25f8":"UnderratedToken()","d57f62ff":"getPeriodLockedBalanceFor(uint256,address)","d5812ae1":"positionPrice()","d5813323":"traded(bytes32)","d583644b":"upgradeStrength(uint256)","d5838ca7":"addPublicKey(address)","d5847d33":"conversionRatesContract()","d585b852":"DAOToken()","d586bd4e":"donateP3D()","d586d2e4":"cancelRequest(uint256,uint256)","d586e30f":"calcNextReward()","d587dbf9":"change_specific_addy(address,uint256)","d588acc4":"claimMiningReward()","d588b892":"testCount(uint256)","d588d4d8":"hasHash(bytes10,uint8)","d5893bb2":"tradeEventEnabled()","d58b8282":"roundFiveTime()","d58b82bb":"getCampaignDailyPrice(address)","d58bf09a":"redeem(bytes32,address,bool[4])","d58c4b85":"siteAccount()","d58d1566":"subsidyHalvingInterval()","d58e1758":"totalConvertLotsByAddress(address)","d59070f8":"mintCopieExecutoire(bytes32)","d5909149":"CerberusNetwork()","d590bf49":"deleteCase(uint256)","d590df4a":"setFirstPeriodCap(uint256)","d591221f":"testTransfer()","d59138ef":"markReleased()","d59167f6":"claimComputation(bytes,bytes32)","d591d777":"finanVestingStages()","d592c243":"Issuance(address,uint256,uint256,uint256)","d592f5fd":"reserveFullMintAllowance()","d593c953":"revenueShareIdentifierList(address)","d5949bf3":"RegistroBlockchain()","d595c331":"burnSupply(uint256)","d5969f2b":"grantEnable()","d596c862":"toggleRedeemActive()","d59768a3":"updateAddress()","d597b634":"ETC()","d597b8c8":"getOffer(bytes32)","d597c6bb":"_generateSpaceship(uint16,address)","d598aef8":"TESTToken()","d598b2c5":"getTopCompanyStartBlock()","d598cae5":"ACTIVE_LOAN_CANCELED_BY_LENDER_STATUS()","d598d2ab":"Reward(address,address,uint256,string,uint256)","d598d4c9":"service()","d5992ef5":"isSuited(uint8,uint8)","d5996502":"TheMLMDemo()","d59aec08":"notesOf(address)","d59b5d4e":"getDocumentIdWithContentHash(string)","d59ba0df":"setDistributor(address,bool)","d59cf17f":"WeAPOWH()","d59e31ed":"totalETHSold()","d59e6461":"addRoot(bytes32)","d59f1844":"content_intro()","d59f1f3f":"proposalsByShareholder(address,uint256)","d59f2827":"isTokenOwner(uint256,address)","d59f37e0":"verifyCanRemoveOrderById(uint32)","d59f4e68":"setPaintingArtist(uint256,string)","d59f5c6e":"OmegaNode()","d59f9cc7":"getFullAddressList()","d59fde06":"CredoIco(address,uint256,uint256)","d5a056d8":"AddOrigin(address)","d5a18e4c":"setMany(address,uint256,uint256[],uint256[])","d5a2040e":"AKM()","d5a31956":"commissionArt(uint256,uint256)","d5a34dfb":"VPC0x()","d5a3b734":"dataSourceAddress()","d5a41695":"fetchVoteNumForCandidateBySnapshotBlock(address,uint256)","d5a4726b":"sumICO2()","d5a4a3c6":"findRecentBet(address)","d5a506d0":"regionExists(uint16)","d5a53dec":"ACTION_SELL_OFFER_ACCEPTED()","d5a5825d":"currentEtherBalance()","d5a632b5":"addPartnerSaleWallet(address)","d5a683c0":"addDividends(uint256)","d5a6c97a":"setWhitelistModerator(address,uint8)","d5a73fdd":"getVestedAmount(address)","d5a7b500":"softCapTriggered()","d5a81428":"sellPriceInWei()","d5a841f9":"setFaucetThresholdSecs(uint256)","d5a8487f":"getSquareWins(uint256,uint256)","d5a849e9":"getRewardBalance(address)","d5a8c0d9":"Ghcwchain(uint256,string,string)","d5a9f356":"testTemp3()","d5aa1a26":"getRouteSize()","d5aa1aca":"setmmVaultAddr(address)","d5aa7803":"isGuessesOpen()","d5aaadd1":"finishMintingRequestSetup()","d5ab7f30":"crowdsaleSuccessful()","d5abaa27":"JoinTheFray(address)","d5abeb01":"maxSupply()","d5acdeb2":"allocateCorporateToken(address,uint256)","d5aceaac":"closeBattleboard(uint16)","d5ad2e00":"m_wcStored()","d5ad3ad0":"setServiceController(address)","d5ae1085":"updateNextOrderPrice(address,address,uint256,uint256)","d5af8f24":"createAndSellAllAmountBuyEth(address,address,address,uint256,address,uint256)","d5afd6bc":"startOperation()","d5b014f8":"MoonTrail()","d5b01c99":"existIdAtCurrentVersion(bytes32)","d5b0c0d5":"numberOf(bytes16)","d5b1402c":"ViralTokenSale()","d5b235d0":"test_claimShares_emptyRewardPool_isTranscoder()","d5b2a01a":"ownerFee()","d5b2c102":"sendCoin(bytes32,bytes32,uint256)","d5b36845":"stage3Bonus()","d5b36eeb":"TEHToken()","d5b3b317":"minutestotal()","d5b40406":"signUpForAirdrops()","d5b42496":"enableShowValue(bool)","d5b4ea20":"USDcRaised()","d5b5dc49":"companyReserve()","d5b61da0":"PRE_SALE_MIN_ETHER()","d5b74699":"library1function()","d5b85b2d":"setBAAU(bytes32,address,address,uint256)","d5b89bc8":"Issuance(address,uint256,uint256)","d5b8a884":"ASStokenICO(address)","d5b9df87":"LEADER_FEE()","d5ba4d21":"changeHold(address,uint256,uint8,uint256,bool)","d5ba5f82":"getBattleCard(address)","d5bab53d":"xtestTransferToken()","d5bb7f67":"updateFeatures(uint256)","d5bc0a07":"LYBTToken(uint256,string,uint8,string)","d5bcecab":"setLeagueRosterAndSaleAndTeamContractAddress(address,address,address)","d5bcf8ef":"setGameRunning(bool)","d5bd3443":"newOption(address,uint256,bool)","d5bd57a1":"getCardsDetails()","d5bde837":"registerPoA(string,bytes32,uint64[],uint64[],address,address,string,bytes2)","d5be4153":"buyAd(uint256)","d5bec84e":"weiPixelPrice()","d5bee9f5":"randomAddress()","d5bf158a":"affiliateName(address)","d5bf2dbe":"setFeeParameters(uint256,uint256,uint256,uint256)","d5bf4da1":"eTicket()","d5bf5fc3":"sendBountySupplyToken(address)","d5c06d30":"icoEnabled()","d5c14391":"getAvailableAmount(uint256)","d5c166d5":"getExchgComisnMulByThousand()","d5c21c4f":"setMinAuditPrice(address,uint256)","d5c2d2b6":"TEAM_INCENTIVES_AMOUNT()","d5c2e3ca":"destroyContract(string)","d5c2ee21":"hasLanguage(address,uint256,uint256)","d5c34755":"LogAuthCreate(address,uint256)","d5c4098d":"enableRenounceOwnership()","d5c44898":"updateLastPrice(uint256)","d5c469f8":"isP2SH(bytes,uint256,uint256)","d5c53c44":"DETEX()","d5c5d8e1":"yetAnotherFunction()","d5c60c97":"ShowInfoBool(bool)","d5c61301":"say(string)","d5c61881":"enableWithdrawl()","d5c655c9":"lastTaskIndex()","d5c7aece":"CertAdminDeleted(address)","d5c7bcc8":"coinIssuedEtc()","d5c80423":"lockDeposit(bytes32,string)","d5c813dc":"sellerfee()","d5c96b36":"gettotalCardValue()","d5c9712f":"getBytesLE(bytes,uint256,uint256)","d5c98db1":"setPropertyOwner(uint16,address)","d5c999f8":"getBanque()","d5c9b239":"getAllShops()","d5c9c144":"SetGasFeeReimbursed(uint256)","d5ca35bc":"withdraw(address,uint256,uint256,address,uint8,bytes32,bytes32)","d5cb4a04":"getParticipantTransactions(address,address)","d5cc1d49":"upload(bytes32,bytes32,bytes32,bytes32)","d5cc8813":"startingPriceOf()","d5cce45a":"showbuyPrice()","d5cd3243":"addUser(bytes32,bytes32,uint256)","d5cdd2c7":"tokenToPoint(uint256,address,uint256)","d5ce3389":"from()","d5ce44c1":"totalEthReceivedinWei()","d5ce6719":"AC(uint256,string,string,address)","d5ce6a34":"LogAddressTokenCapCalculated(uint256,uint256,string)","d5ce91fd":"isRegistered(address,bool)","d5ceecea":"ERC777DemoToken(string,string,uint256,uint256)","d5cef133":"requestRefund()","d5cf5c72":"setSoftCap(uint256)","d5cfa94e":"claimAdmin(string)","d5cfad68":"getUserCertificationDetails(string)","d5cfc01b":"lockAddressByKYC(address,address)","d5cfee3e":"playerIsRegistered(address)","d5d067b0":"createRequestAsPayerAction(address[],int256[],address,uint256[],uint256[],string)","d5d09021":"isCrowdsaleFull()","d5d0da83":"KingsToken(uint256)","d5d1b95a":"convertRegularToRewardTokens(address,uint256)","d5d1e770":"confirmOwnership()","d5d21e18":"createTokenContract()","d5d2f528":"setTokenCounts(uint256,uint256)","d5d434c9":"SocialXBounty()","d5d4dfad":"balanceHistoryLength(address)","d5d55931":"ETXCrowdsale()","d5d55c8a":"PurchaseConfirmed()","d5d5913c":"getCCH_edit_2()","d5d5cefa":"cancelOptionOrder(address[3],uint256[3],uint256[2],bool)","d5d5f469":"getDocumentIdWithIPFSdirectoryHash(string)","d5d66031":"Wp()","d5d75cad":"_changeWallet(address)","d5d8a751":"Gallery_MuYi_No3()","d5da9e82":"teamLockTransferFrom(address,address,uint256)","d5db3fe2":"LogTrade(address,address,uint256,uint256,uint8,uint8,uint256,int256,uint256,int256)","d5db72eb":"isRegistrar(address)","d5db9366":"cancelCollateralTransfer(uint256)","d5db9410":"ChangeProtectionTime(uint256,uint128)","d5dbb1ad":"solveBet(address,uint8,bool,uint8,bytes32,bytes32)","d5dbe634":"incrementTotalSupply(uint256)","d5dc7139":"Scratch()","d5dcc638":"StrongHands()","d5dcf127":"setAge(uint256)","d5dd5127":"managerNotSetInApp()","d5de30e0":"evMgmtInvestProject(address,uint256,address,uint256,bool)","d5de78bc":"getGrantBalanceOf(address)","d5df7559":"removeDocument(uint256)","d5df7bcc":"newFootballMatch(uint256)","d5e05c89":"isSpaceshipUpgradeAllowed(bytes5,uint16,uint8)","d5e0b616":"getAnyElementByIndex(uint256)","d5e0d8fc":"setCompositionPrice(uint256,uint256)","d5e0e131":"totalAdvisorsSupply()","d5e38f60":"lpFeeBp()","d5e3fbb2":"payfee()","d5e45a83":"positionFrom(address,address,uint256)","d5e4a36e":"isPreSaleRunning()","d5e4b342":"trexdevshopWaited1Years()","d5e5e6e6":"preciseUnit()","d5e83d9c":"RisikoCoin()","d5e99dac":"rateLoss()","d5e9abfd":"mustKyc(address)","d5e9eb9c":"IPM()","d5ea36f9":"offMaintenance()","d5eb0cbf":"isContractPermanent(string)","d5ec40af":"buyToken(uint32,uint32,address)","d5ec7e1d":"left22(uint256)","d5ec8d82":"_estIntegerSqrt(uint64,uint64,int256)","d5ecc1bd":"papu()","d5ed289d":"getClaimRate(uint256)","d5ed9cba":"setLandRegistry(address)","d5edca54":"Games(uint256,uint256)","d5ee739d":"tokenRateWei()","d5f0400e":"validClaim(bytes32,string,string,address,bytes32,bytes32,uint8)","d5f07396":"checkIfReferee(address)","d5f12812":"setSpend(address,uint256)","d5f17df2":"selectFight2DeathContract()","d5f1e8d8":"hardCapEther()","d5f24708":"gotake()","d5f37f95":"sign(uint256,uint256,address)","d5f39488":"deployer()","d5f404c7":"update_power()","d5f47a51":"Ethraffle_v3b()","d5f48e76":"cancelSynthesizingAuction(uint256)","d5f4f0b3":"addTokens()","d5f52d51":"withDrawMyBalance()","d5f5b788":"maxCapUSD()","d5f5df2a":"checkFiscal(bytes32)","d5f6b538":"getClaimsCountForStory(bytes12)","d5f72b2e":"addMany(address,uint256,uint256[],uint256[])","d5f7b144":"_burnToken(address,uint256)","d5f827e2":"TBrate()","d5f868b7":"removeReverseRate(address)","d5f87242":"assertInvalidState()","d5f9ac43":"transferFromTangibleAssetfund(address,uint256)","d5f9bdf1":"TokenCreated(address,address)","d5f9e6c7":"ProjectName()","d5fa2b00":"setAddr(bytes32,address)","d5fa2da5":"newEscrow(uint256)","d5fb1a1c":"ByteLockerShares()","d5fbe080":"_getEnd(int256)","d5fcc7b6":"setPresale(address)","d5fd5351":"WithdrawAddressApproved(address,address,bool)","d5fdb334":"getOpenGameIds()","d5fdfdbc":"setResult(string,string,string)","d5fe6062":"claimTusdProxyOwnership()","d5fec406":"abdicate(uint64,address)","d5ff0e7b":"transferToContract(address,address,uint256,bytes)","d5ff38ae":"migrateBasicData(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","d5ff56f8":"allowChange()","d600630c":"registerInstitution(string,address,address)","d6006e88":"send(address[],uint256[],uint256)","d6006e8e":"preSaleSuccess(address,uint256,uint256,uint256)","d600c846":"JingzhiContract()","d60207c7":"getLowestUnitPriceIdxFromBuy()","d6026ac1":"getPRewardedSumByRound(uint256,address)","d6030d57":"BOUNTY_CAMPAIGN_SHARE()","d6039a41":"totalsigs()","d603f872":"buyPreICO()","d603fd28":"sendToAddressWithTime(address,uint256,uint256)","d6046836":"setAllowBuy(bool)","d604d6a8":"getSkillRating(address,uint256,uint256,uint256,uint256)","d604d8d1":"checkHash(bytes32)","d605787b":"rng()","d6063225":"Ktx(uint256,string,uint8,string)","d606f34b":"century(address)","d60743b1":"read_total_number_of_user_purchases(address)","d6077912":"RRRToken()","d608b3b2":"totalCharity()","d609ea93":"stakingEpochDuration()","d609fe59":"OEO(uint256,string,string)","d60bf518":"Test3(address)","d60d7044":"_char(bytes1)","d60dcb5d":"Switch()","d60df5be":"xmr()","d60e1447":"supplyBezNolei()","d60f0e5a":"BonusWhiteList(address,address,uint256,uint256)","d60f2eae":"buyPBTTAgainstEther()","d60f6cd9":"sendNumber(uint16,address,address)","d60fa784":"Voicecoin()","d60fd1be":"Hopecoin()","d6103b26":"_newPepe(uint256[2],uint64,uint64,uint64,address)","d6106696":"withdrawal_last_voter()","d6106b3e":"buys(uint256)","d611225b":"addContract(string)","d61191bd":"distributeValidityBond()","d612be77":"dpToken()","d612cff5":"permissionHash(address,address,bytes32)","d613ac91":"buybackTypeOne()","d613be0a":"forceChangeContractOwnership(address)","d6142c5b":"createProvider(bool,string,string,string,string,uint8,bool,address)","d615950d":"mintUpdateToken(uint256)","d61647f2":"developer_string_golos(string)","d617ad7d":"getPatentFee(address,uint16[5])","d618996b":"orderEnd()","d6192c6c":"hodlerStakes(address)","d619d216":"retrieveEth()","d619f6b3":"sendIndividualAmount(address[],uint256[])","d61a4524":"setdissolveaddress(address)","d61bd8fb":"getAvlShares(bool)","d61ca7eb":"RYH()","d61ccf84":"RABAToken()","d61e7201":"updateStatus(uint256)","d61e9274":"SetRate(uint32)","d61f92a3":"getJoinAddr(uint256)","d61fb0bf":"dateIT()","d620c7c8":"LogNewContractProposal(address,address,address,uint256)","d620caaa":"walletFromTeam()","d621b83f":"_createKydy(uint256,uint256,uint256,uint256,address)","d621c878":"improvementContract()","d621e813":"tradeEnabled()","d6223305":"ReleaseableToken(uint256,uint256,address)","d6224a6b":"getPixelText(uint256)","d6233491":"getPaid(string,address)","d6236ad0":"MetisCoin()","d62457f6":"callValue()","d624fdb6":"approveUser(address)","d625a7a6":"BetAdded(uint256,address,uint256,uint256,uint256)","d625c654":"migrateLosingTokenRepToWinningToken()","d6264b75":"transferBack(uint256,address)","d626db79":"setPublicWhitelistAbility(bool)","d6271727":"processUpgrade(address,uint256)","d628e0a6":"WatchBalance()","d628ecd7":"multiValueAirDrop(address[],uint256[])","d6291f6f":"VitalKey()","d629bc12":"iNf4mation()","d62a13ac":"ExhaustionCoin()","d62a7127":"getlastid()","d62ac58c":"AdvisorsPartners()","d62b255b":"setOwner(address,string)","d62b6f7e":"Main()","d62c6523":"cancelReservedTokens(address,uint256)","d62d3115":"testCreate()","d62f0f22":"getMyRice()","d62f146b":"updateSkill(uint256,uint256,uint16)","d6300201":"getPercent(address)","d630bd53":"pledgeApprove(uint256)","d630d100":"releaseAdmPercent()","d630efbc":"getAllTotalPrize()","d63124d7":"checkMidiNotesValue(uint8[])","d631eed7":"withdrawEthForUser(uint256)","d631f6d4":"DeleteProject(string)","d63241a6":"EtherCheque()","d63249ee":"_placeBet(uint256,address,bytes)","d632f639":"_privateSale()","d632fd1d":"PIP()","d6349dd6":"referralDividendsOf(address)","d634ba22":"baseNumber()","d6351433":"getRichToken(uint256)","d635357e":"TestContract(int256,string)","d63547e6":"GetFreeCnt()","d63581de":"setPricePoints(uint64[])","d63587a2":"randomNum(uint256)","d635b69f":"preValidatePurchase(uint256)","d635fc63":"getReveralSupply()","d6362e97":"getMin()","d6370149":"_errorAndRefund(string,uint256,uint8)","d6380f37":"complete(uint256,uint256)","d6387a3e":"getMinersAt(uint32,uint32)","d638d981":"SingularityTest24()","d63900d5":"getTileLocation(uint16,uint16,address,address)","d6391a01":"Total_TokenSupply()","d639bf80":"Bitstocksmarket()","d63a1389":"mintFeeFlat()","d63a6ccd":"usd()","d63a8e11":"allowed(address)","d63bed4c":"_setPermissionManager(address,address,bytes32)","d63d4af0":"getOwnerTokens(address)","d63e6ce7":"increasePeriod()","d63e7cc1":"priceICO()","d63ebe92":"StepVesting(address,uint256,uint256,uint256,uint256,uint256,uint256,bool)","d63eea42":"MAX_NUMBER_BETTERS()","d63fe1c7":"TARGET_TOTAL_SUPPLY()","d64196f8":"minInvestedLimit()","d641f3e4":"playGame(uint256,uint256,uint256,bytes32)","d64232c0":"option10name()","d6424ea7":"calculateAmount(string,uint64)","d6427c24":"randomPlayer()","d6449e15":"cancelTXwithCode(bytes32)","d644af34":"withdrawAndSend()","d644c46f":"wuxiaMasterPrice()","d644e356":"index(uint256,address,uint256,uint256)","d645ddf6":"mint(string,string,string)","d64637c7":"distributeDivident(uint256)","d6464b7c":"getSellerOfToken(uint256)","d6475c3a":"returnTokensForDay(uint256,uint256)","d647bb22":"Customcoin()","d647e2da":"test_set_get_RiskParameters()","d6481502":"setFreezingPercentage(uint8)","d648a647":"fundingStartBlock()","d648d7fd":"post(address,uint256)","d6495676":"emitPaymentReleased(uint256)","d64b12cf":"MAX_UNICORNS_TO_GIFT()","d64bcc1a":"releaseIcoTokens()","d64c2018":"setNextImagePart(uint256,uint16,uint16,uint16,uint256[])","d64c34fc":"getLockAmount()","d64d136d":"wnFromGas(uint256)","d64d6968":"isReferrer(address)","d64dc79f":"bidDkl(uint256,uint256,uint256,bytes,uint256)","d64e4e1b":"PKTToken()","d64ee8d2":"unBlockContract()","d64f5135":"In(address)","d64f86c0":"nextTransferFeeProp(uint256)","d64fe5ea":"getLockedWalletReleased(address)","d650cb2e":"forgiveMe()","d652818d":"ZYMToken()","d6528231":"FACTOR_3()","d6545ede":"hbtoken()","d6555687":"migrateUserData()","d655c786":"cancelOrderInternal(uint80,bool,bool)","d656a794":"stopForce()","d657ae0c":"actualTotalSupply()","d6582d0d":"isWeekDay(uint256)","d658d2e9":"hashes(bytes32)","d658d3ed":"setLedgerValue(string,address,address,uint256)","d65995ed":"attemptBeginLoanAtIndex(uint256)","d659afb6":"_isCooldownReady(address)","d659d968":"is_open()","d65a16c0":"isOneToken()","d65a4184":"tokenSaleActive()","d65aabc1":"t_Slava2()","d65ab5f2":"startGame()","d65b476c":"Governable()","d65b48fd":"ReceivedTokens(address,uint256,address,bytes)","d65c0035":"removeAddressFromWhitelist(uint256,address)","d65c8c6c":"claimDiamond(uint64,uint64)","d65f86f2":"setLeed(string)","d6604881":"whitelistBonusLockPeriod()","d660521c":"depositStake(uint256,bytes)","d660c897":"theRichest()","d660ea36":"lastBlock_v1()","d661952a":"removePrivilegeAddress(address)","d6619ffb":"funds_address()","d661d206":"INITIAL_FOUNDER_SUPPLY()","d661dd31":"MULTIPLIER_DIVISOR()","d661f244":"getRoomName()","d6636307":"stateSetOver()","d66495cd":"getSpaceshipProductTotalSoldByModel(uint16)","d6649861":"tokenTransfertoACC(address,uint256)","d664cd89":"askMembership()","d6661999":"securityTokenOffering(address,uint256,uint256)","d6664653":"landmarkToOwner(uint256)","d667dcd7":"houseEdge()","d6680a69":"getAllIntel()","d6682007":"getGameNumSides(uint256)","d66847df":"distributeARTToken()","d668a461":"escapeHatch(bool)","d668e654":"LogTokenReceiver(address,uint256)","d669133f":"PotSplit(uint256)","d669899c":"sendLudumToSingle(address[],uint256)","d6699f48":"addPolicy(uint8,uint256,uint8)","d669e1d4":"MAX_CAP()","d66b0b51":"komission()","d66b2207":"escrowTransferInfo(address,uint256)","d66bd524":"reserves(address)","d66c7faa":"ICO_PHASE3_LIMIT()","d66c9cc2":"transferSenderPaysFee(address,uint256)","d66cac2b":"invest(uint32,uint32,uint64,uint16)","d66cb9e1":"renewbeginnerprotection(uint256)","d66d9e19":"leave()","d66e5726":"getWriter()","d66f146d":"refundPoll()","d66f3afa":"addEmployee(address,string,uint256[3],uint256)","d66fd10d":"LogVote(address)","d6714924":"calculateBoardScore(uint256)","d6721000":"addCommissionToPendingWithdrawals(uint32)","d6728d51":"developer_EKN()","d673c93b":"split(address,uint256,uint256,uint256)","d6740de5":"mint_for_testing()","d674d6a1":"RimuoviNegoziante(address)","d6755434":"remainingCapInWei()","d6757f39":"_existPlatform(bytes32)","d675ecbd":"addPrivateInvestor(address,uint256)","d67601ac":"starsRemainingToAssign()","d67772d3":"PennyEther()","d6779b01":"winningsClaimable(address)","d6779d6f":"isWarrantyValid(string)","d678724f":"getGameNumberOfEntries(uint256)","d6787711":"betHash()","d678ba48":"depositLRC()","d679677a":"currentTier()","d6798645":"set_cooldown(uint256)","d679c4f2":"claimDividendPercentage()","d67a073f":"Drain()","d67a10e3":"etherDelta()","d67a1140":"getMultiBalances(address)","d67a12d4":"getStrategyHiddenState(bytes32)","d67a1694":"getBountyChance(uint256)","d67a7e5f":"updateSignedDealsCountInBulk(address[],uint256[])","d67ae54d":"EUR(uint256)","d67b534e":"socialIdentityToCardId(uint256,uint256)","d67b9a89":"ONLY600Coin()","d67bf1ad":"coinBurnMkt()","d67bf379":"getByUser(address)","d67c1a7a":"finishCrowdSale()","d67c4497":"_approveTransfer(uint256,address,address)","d67c7f35":"p_update_mResaleMultipler(uint256)","d67c9961":"pass(uint256)","d67cbec9":"release(uint32,uint32,uint32,bytes20)","d67d0bb9":"tokenCreationMaxCap()","d67d3af8":"cancelRequest(address,address)","d67d73e0":"removeAllowedContract(address,address)","d67d78cd":"addCard(uint32,uint32,uint32,uint32,uint32,uint256)","d67f4d1b":"TittyFarmer()","d67fd89e":"setout(bool)","d6805f49":"novaTransfer(address,uint256)","d680914d":"SLABToken()","d6816cc1":"fixSpecications(uint256,bool)","d68199dc":"gameStats()","d681ffa7":"getDefinition(uint256)","d6820709":"beginTimeTS()","d6823455":"minQuanValues()","d682b601":"auditContract(address,bytes32,bytes,bool)","d6830af3":"setSettingTAOId(address)","d68314ea":"setReserveWeight(uint32)","d68352d2":"BeatTokenIcoPhase1Started()","d683d1a2":"markRedemptionFulfilled(bytes32)","d6847cd8":"getWithdrawalCoolingPeriod()","d68526c8":"withdrawGemmyMusic(address,uint256)","d68561a3":"_isOwnerOf(address,address,uint256)","d6858850":"AlphabetConvert(address)","d6872352":"sendEtherManually(address,address,uint256,uint256)","d6875520":"reclaimUnwantedGift()","d687a9b3":"_deleteAddress(bytes32)","d687b57e":"interSend(address,uint256)","d689cfe1":"_setClientPaidUpTo(address,uint256)","d68a9fb8":"getFreeTokensAmountOfUser(address)","d68c967f":"addAddressToBackEnd(address)","d68d961a":"ROLE_MINT()","d68e0ff7":"DestroyCoin(address,uint256)","d68e462c":"withhold(address,uint256)","d68e9b1e":"createGen0Token(uint8)","d68f30a7":"recordMoment(address,uint256,uint256)","d68f65f8":"SHAToken(uint256,string,string)","d68f6aac":"salers(uint256)","d68f93df":"changeBonuses(uint256[],uint256[])","d68fac6d":"knuckReward()","d68fbe5c":"testCannotGetTokensInNotInitiatedSale()","d6906295":"withdrawCloneTokens(address)","d691092a":"predictExploreReward(uint256)","d6914217":"getServerUserIndex(address,uint256)","d6916c34":"airDrop(address,uint256[],address[])","d6938c18":"StagebleCrowdsale()","d693dca2":"setAllowCnsContract(address,bytes32,address,bytes32,bool)","d693e17f":"internalSend(uint8,address,uint256)","d6940c8c":"_RemovedFromGeneration(address,uint256)","d69450d5":"setUUID4Bytes(bytes)","d6948c47":"winningTeamId()","d69570e2":"durationOfState(uint256)","d6960697":"confirmPurchase()","d6965ff7":"shops()","d696888a":"EpietherCrowdsale()","d697a9f1":"CooCoinToken(uint256,string,string)","d69932a3":"getLpBidPrice()","d699c00e":"transferWeiToWallet(uint256)","d699fe3d":"setPhase(uint256,uint256,uint256,uint256)","d69a0d2f":"getMostExpensiveCryptoGamer()","d69a1a5f":"getNextPayoutEstimation()","d69b6cf4":"IdolToken()","d69c3d30":"nextNonce()","d69c9275":"extraDistributionPart()","d69d895e":"NUM_RESERVED_COIN()","d69dbf63":"getIssuanceBlockTimestamp(bytes32)","d69dc9a5":"balance_(address)","d69dd156":"setInt256(int256,int256)","d6a02bc2":"getSignedSubscribers()","d6a039f0":"Qbase()","d6a0810f":"ContractPurchased()","d6a0dec5":"buyTicketByOther(uint256,bytes32,bytes32,bytes32,bytes32)","d6a15231":"getIcedInfos(address)","d6a1f6a7":"breakIdUniqueness(uint256,uint256,address)","d6a2a596":"CrowdSale(address,uint256,uint256)","d6a30fb4":"start_quiz_quest(string,string)","d6a39db0":"lockUp(bool)","d6a3b623":"HONORABLE_LOSS_BONUS()","d6a3bc16":"finalReserveWallet()","d6a3f374":"dividendRate()","d6a43a3e":"setPermissionById(uint8,bytes32,bool)","d6a45623":"setAuctionsEnabled(bool)","d6a527eb":"share1()","d6a55e10":"sub_arbits(address,address,uint256)","d6a595ac":"payto2()","d6a5e546":"emergencyRefundContract()","d6a619e3":"transferIfPuritanical(address)","d6a62445":"confirmReturnToken(bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256)","d6a6a520":"undoUpgrade()","d6a6da3e":"angelInvestorsTokens()","d6a75d82":"winningsClaimable()","d6a78004":"burnRemaining()","d6a83613":"bytes20ToString(bytes20,bytes20)","d6a90bcf":"tokenMultisigWallet()","d6a9c807":"_createDog(uint256,uint256,uint256,uint256,address,uint8,uint256,bool)","d6a9de51":"getSeller(uint256)","d6a9e9d1":"teamPercentage()","d6aab015":"getBonusPool()","d6abe110":"tokenDetails()","d6ac2394":"payoutInvestor(uint256)","d6ad00a9":"DOJC()","d6ad5e5e":"MIN_ACCEPTED_VALUE()","d6ae5f29":"getUsedReserveSupply()","d6aefb61":"setBatchTransfer(address,address,bool)","d6af9411":"Rouleth()","d6afc9b1":"getProfile()","d6b0f363":"OpusToken(address)","d6b0f484":"disableWhitelist()","d6b1deac":"KTOCrowdsale()","d6b1e4a9":"buyMinersWithEther(uint64)","d6b224f2":"getNextActiveBuyDetails(bytes32,uint64)","d6b2b242":"Realize(uint256)","d6b2e2ba":"PARSEC_CREDITS_PER_ETHER()","d6b33f59":"getNextActiveSellDetails(bytes32,uint64)","d6b44859":"scheduleUndoIt(uint256)","d6b4ec12":"getDailyWithdrawalLimit()","d6b52d9a":"partnerETHRewardsPercent()","d6b53175":"UpdatePoolState(uint8)","d6b5983d":"checkAmount(address,uint256)","d6b5abc9":"weiToPonzi(uint256,uint256)","d6b645bc":"react(address)","d6b6f9f1":"secondXRChangeBlock()","d6b74865":"watcher()","d6b7c81d":"BountyIssued(address,uint256)","d6b867e6":"exchange(uint256,address,uint256)","d6b8ae26":"jexp(uint256,uint256,uint256)","d6b8ec66":"presaleEth()","d6b92187":"_syncLockedDepositsAmount(bytes32)","d6b93d43":"fillBuy(address[8],uint256[6],uint8,bytes32,bytes32)","d6b94aba":"TTT(string,string,uint8,uint256)","d6bacb0e":"getTxRoot(bytes32)","d6bafa0c":"ECommercePaymentSystem()","d6bb0ad5":"CrowdsaleGummy(address,address)","d6bb358e":"LuckyBaby()","d6bb9eff":"getMartialCardTypeIdList(uint256)","d6bc1b39":"setPrices(bool,uint256)","d6bc1e57":"fromWei(address,address,uint256)","d6bd603c":"getBalance(address,address,address)","d6bd64fc":"test_get_expired()","d6bd8727":"getUrl()","d6be178d":"rateStage2()","d6be6bd5":"birth(bytes32)","d6bea5fd":"rangeToProposalID(uint256)","d6bec803":"setExpiredAndWithdraw(address)","d6beebf7":"buyTokens_ETH(address,uint256,uint256,bytes8)","d6bf28e4":"_sendMonsterPrize(uint256,address)","d6bf7530":"getEthDepositAddress()","d6bfc2d4":"oykooshi()","d6c0ceab":"changeBountyDeadline(uint256,uint256)","d6c12f88":"pricingPlan()","d6c1869b":"s33(bytes1)","d6c19fe0":"build(bytes,uint256,uint256,address)","d6c1be92":"gameEarnings()","d6c242d6":"approveViewer(uint256,address)","d6c2479a":"donationsAddress()","d6c3453c":"addTrancheRateAndTokens(uint256,uint256,uint256)","d6c54bf7":"destroyTokens(address,address,uint256)","d6c5a41e":"tier3End()","d6c5d823":"getScientificData(uint256)","d6c6f48e":"mintAgents()","d6c75abf":"RiskPrices(address[],uint128[])","d6c7b4ad":"receiver1()","d6c7b65b":"addInfo(address,address,uint256,string)","d6c8976b":"changeTokenController(address)","d6c8f93c":"getCooldownIndex(uint256)","d6c9d27a":"addCountry(uint256,uint256)","d6ca8ccb":"disown(bytes20)","d6cb56e6":"FishCoin()","d6cb9ec2":"viewContractState()","d6ccb332":"FED(uint256,string,uint8,string)","d6ccf7a7":"addTokenTime(uint256,uint256)","d6cd4a02":"listAgents()","d6cf18e7":"createPiranhaTokens()","d6cf5297":"oracleItSetNetwork()","d6cfece1":"preBonus()","d6d02c51":"whois(string)","d6d13ac0":"Split(bytes32,uint8)","d6d14171":"initialTimestamp()","d6d1b8bb":"TCLRToken()","d6d1f369":"Test4(uint256)","d6d1fc2a":"SoSoCoin()","d6d21dfd":"who()","d6d22fa4":"MetaCoin()","d6d25008":"coldStoreLast()","d6d30a51":"increaseJackpot(uint256)","d6d3286c":"geProposalInfo(uint256)","d6d329b9":"ships(uint64)","d6d34c7c":"coOwner()","d6d3e19c":"DigitalKeyCoinKO()","d6d4136a":"checkPos()","d6d5c8d5":"DEFROST_MONTHS()","d6d65f3d":"getCurrentMilestoneIndex()","d6d6945e":"doPurchase(address,uint256,uint256)","d6d707a6":"BaseStoreToken()","d6d76ed5":"status(address,bytes32)","d6d76fb7":"ArtCertificate(address,bytes32,string,string,string,string,string,address)","d6d7d525":"get(bytes)","d6d80f0b":"withdrawal_party_a_gets()","d6d86646":"UpdatePolicyState(address,string,string,uint8)","d6d902c4":"claimThroneFor(bytes,address)","d6d9266a":"setNewUseIndex()","d6d98ffc":"CosmicExperiencePoints()","d6da0805":"registerName(bytes32)","d6dad4cb":"BCFLeague(address,uint256,uint256,uint256,uint256)","d6db71e9":"allowRefund(address)","d6db85af":"fracExp(uint256,uint256,uint256,uint256)","d6db8ab6":"dividendPayouts(uint256)","d6dbf1c2":"getPOOL_edit_9()","d6dd1f0f":"ConnectLeaf(uint256,uint256)","d6dda33d":"isPremine()","d6ddbd2d":"purchaseAdv(uint256,uint256,string,string)","d6ddd21b":"vestingStartTimestamp()","d6de8dc4":"getPlayBlockNumber()","d6dfb77a":"getIndexToken(uint256,uint256)","d6e0bf29":"OwnerDeposit()","d6e0d73c":"mintA()","d6e20a56":"confirmKYC(address)","d6e2bcb5":"SwordMaster()","d6e325ae":"joinClub()","d6e38114":"addBet(address)","d6e3bb94":"addAudit(address,address)","d6e3dd77":"balancesImporter3()","d6e4ddc5":"ownerOf(address[16],uint256)","d6e5fe98":"setStakeRequirements(uint128,uint128)","d6e67215":"newCajutel()","d6e78eb0":"setGasMin(uint256)","d6e871ff":"loser(address,uint256)","d6e898ad":"vest2team(address,address)","d6e89cf0":"setTransferStatus(uint256)","d6e8a0b0":"incrementBid(uint256)","d6e95f77":"isSellable()","d6e9b019":"getDisputeData()","d6ea53b1":"changePayer(address)","d6ea5a0e":"distributionEntryCount()","d6ea8c90":"decimalOddsForOutcome(uint8)","d6eab9f2":"setHostFee(uint256)","d6eac4cd":"initTokenGrants()","d6eafd08":"scheduleCall(address,bytes,bytes,uint8,uint256[4])","d6eb1bbf":"authorised(address)","d6eb748c":"setRelation(address,address)","d6ec0065":"CHN()","d6ecb38a":"firstAddressFromDeployer(address)","d6ecff50":"Identified()","d6ed8f52":"addAirdropList(address,uint256)","d6edb047":"addAllocationPartOne(uint256,uint256)","d6ef25d5":"addVersion(uint64[3],address,bytes)","d6ef3de2":"Stocks()","d6ef7af0":"withdrawRewards(address,uint256)","d6efb030":"sendEthToContract(address)","d6efc8eb":"marketBuyOrders(uint256,bytes[])","d6effa2b":"ICOwei()","d6f0b484":"serverEndGame(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,address,bytes)","d6f12a6a":"refundT4T()","d6f15469":"setBuyEnabled(bool)","d6f22e69":"getChecksumPairCount()","d6f327cc":"swapCardForReward(address,uint8)","d6f35eb4":"setMinAmountSale(uint256)","d6f3c45f":"tokenCrowdsaleCap()","d6f42038":"PhoneToAddress()","d6f4472d":"BTCS_PORTION_MAX()","d6f4c235":"setInstructor(string,uint256,string)","d6f4e56e":"allTokensSold()","d6f50ed6":"registrarApp(bytes32,address,bytes32[])","d6f5792d":"isCurrentAccountReader(address)","d6f5c939":"tie()","d6f6b6e7":"closeFailedVotingAndWithdraw()","d6f7ddf9":"topUp(address,uint256)","d6f8307f":"requesters(address)","d6f8560d":"withdraw_eth()","d6f8ecae":"time2()","d6fa3efa":"requiredTimeBetweenDraws()","d6fb1678":"mineableSupply()","d6fb69b9":"_sendWinnerJackpot(address)","d6fbf202":"startingPrice()","d6fc2e62":"rateProjectSecondParty(bytes32,uint8)","d6fd1fe9":"saleAction()","d6fd8822":"threeTimes(address,uint256)","d6fe3d6d":"afterForkRescueContractBalance()","d6fea306":"weiICOMaximum()","d6febde8":"buy(uint256,uint256)","d6feecde":"ret_len()","d700071a":"minorPartnerAddress()","d7003222":"unitCost()","d700ed39":"isStarterClaimed(address)","d70108a6":"getCmd_control()","d702087f":"setSecretSigner(address)","d7020b0c":"setarg_3(uint256)","d7020d2a":"approveEscrow(bytes16,address,address,uint256)","d702b63d":"for_longterm()","d702db81":"UserRetireHodl(uint256)","d702e364":"setPreICOSoldAmount(uint256,uint256)","d7052e17":"GotTokens(address,uint256,uint256)","d705d6d7":"MainSale(address,uint256,uint256,uint256)","d70657ac":"getBalanceHolder()","d7067dc5":"crowdSalePaused()","d70695bb":"swarmRedistribution(address,uint256)","d706df8c":"BioStem()","d7074aaf":"GetCard(uint32)","d70754ec":"node()","d7079ee7":"startPublicsale(uint256,uint256)","d707d466":"allocToMember(address,uint256)","d7081e03":"transferAmount(address,uint256)","d7085e05":"SafeSend(address)","d70907b0":"freezeWithTimestamp(address,uint256)","d70925b4":"teamEthTransferComplete()","d70948b5":"_create_drug(bytes32,address,uint256,uint256)","d7098154":"claimPrize(uint256)","d70afa96":"FEE_ADMIN()","d70b6342":"minInvEth()","d70cf105":"moveBalance(address,address,uint256)","d70d2e26":"DetherTx()","d70d37e6":"OptedIn(address,address)","d70d532b":"provideAccess(address,uint8)","d70d9254":"isBetClosed()","d70d9604":"Sales()","d70dbf7d":"Aequitas()","d70e0f90":"disableAuto()","d70e62eb":"lowLimit()","d70ed38a":"withdraw(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes,bytes32)","d70efa86":"_inRateFallEffectLimit(uint256,uint256)","d70fe207":"cancelOrdersOnOption(uint256,uint256)","d710999d":"SiliconValleyCoin()","d7109dda":"getCurrentSaleDay()","d710e2f0":"sendAllToOwner(address)","d710eaac":"NewWallet(address,address,address)","d71186b9":"Fund_Contract()","d7121f4b":"HolikopterToken()","d7123dff":"_createBuilding(uint256,uint256,uint256,uint256,uint256,uint256,address,bool)","d712800f":"setLockValue(address,uint256,string)","d712d06d":"tokenDestroyed(address,uint256,string)","d712eb4a":"voteWeight()","d7130651":"getCity(uint256)","d7131e5f":"createToken(uint256,address,string,string)","d71331c2":"getCountPlayerByTrackId(bytes32)","d715c8b2":"ownerHistoryCount(uint256)","d716222c":"is_owner(uint256,address)","d716e9ca":"getTotalInvoices()","d71710e0":"countAttributeTypes()","d717b05e":"exchangeLimit()","d71801d4":"gallerySix()","d7182850":"ownerTokensAllocated()","d7186f2b":"KNTTToken()","d718e763":"FinalizableCrowdsale(address,address)","d719213e":"preBuyPrice1()","d719843f":"getVendingStepPrice(uint256)","d71a0d7c":"HolahopxToken()","d71c14aa":"_isAOContentUsageType(bytes32)","d71c4028":"DRPCrowdsale(address,address,uint256)","d71cdd78":"BONUS_HI_QTY()","d71cf1e4":"getFee(uint256,address,address,address,address)","d71d3b3c":"CrowdSalePreICO()","d71d6cc5":"blendbacktest(uint32[],bytes32[],bytes32[],uint64[],bytes32)","d71d9e8a":"buyFlower(uint256)","d71db8aa":"getBonusPerShare(address)","d71df760":"oraclize_newRandomDSQuery(uint256,uint256,uint256)","d71e58f8":"admin_set_exchange_rate(uint256[])","d71e8296":"canIWithdraw()","d71e930c":"teamAddressTwo()","d71eb6ab":"recursive_store(uint32,uint256)","d71f1bd6":"LottesyAddress()","d71fcbe6":"BaseBountyContract(address)","d7203294":"ZeroXEth()","d7206124":"setInvestorLock(bool)","d721b0af":"batchExchange(address[],uint256[])","d721c760":"IssueAssigneeLoaded(bytes32,string)","d7228bb5":"doSucceedingTransferFrom()","d7237e45":"invitedByReferalBonus()","d723879c":"icoOver2()","d723bb73":"fetchVoteInfoForVoterBySnapshotBlock(address,uint256)","d72473f3":"Added(uint256,string,address,uint256,bool)","d72503ba":"buyCat(uint256)","d725a9f0":"crowdSaleaddress()","d725f10d":"curse(address,address)","d7260cba":"refundGame(uint256)","d726755b":"moveFloor(uint256)","d726f7c7":"mainCoinSentToEther()","d7276479":"battlesOwner()","d727d64b":"disputeSettledTerminate(bytes32,address,uint8,address,uint8,bool,address)","d7289cb4":"FundsReturned(address,uint256)","d728b6db":"getCatOfferPrices()","d728cc72":"novaCoinAddress()","d7290181":"emptyWrongToken(address)","d7299009":"isCustomerHasACCfromWL(address)","d7299ef7":"pausePresale(bool)","d72ad259":"unlockFunds(address)","d72ad623":"getReferrerReward()","d72b11bd":"reserveWallet()","d72b6d3b":"CREATION_LIMIT()","d72bdc53":"initialize(address,string,string,uint8,uint256)","d72c83c0":"SmokeExchangeCoinCrowdsale(uint256,uint256,address,uint256,uint256,uint256,address)","d72c9391":"confirmTransactionSig()","d72d04db":"addGame(address)","d72d8dd6":"numRegistries()","d72dec33":"changeVaccinHistory(address)","d72e2b78":"soldTokensWithoutBonus()","d72e3de1":"createCustomReservation(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","d72e4167":"getCompte_38()","d72eabb8":"minimalToken()","d72f7958":"fortune_break_current()","d73019e9":"icoStartDate()","d7303eaf":"nicole()","d7304b09":"cleanupOdd()","d730bfe2":"RabbitCoin()","d7311963":"m_controller()","d7315d60":"totaldeposited()","d731a779":"removeTRA(address)","d732a3fa":"newRound(uint256,bytes32)","d732d30e":"getGamblingPartyInfo(uint256)","d732d955":"decrease()","d73478f8":"userToNumTowns(bytes32)","d735140d":"fourthTokenExchangeRate()","d7353371":"PeerLicensing()","d7354b49":"getBirthDay()","d735875d":"Start_quiz_g(string,string)","d735dc92":"multiAirdrop(address[],uint256[])","d735fa25":"wholeSaleValueLeft()","d7365f9b":"_purchaseMake(uint256)","d737035d":"holdersBonus(uint8)","d73792a9":"FEE_DENOMINATOR()","d7379999":"permissionAt(uint8,int256)","d737c2b0":"setContractInfo(bytes32,address,bytes20)","d737d0c7":"msgSender()","d7385abd":"placeBet(int8,int8,uint32,uint256)","d7397a72":"setUrl(address,uint256,string)","d739aaf8":"getGameInfoById(uint256)","d73a24fc":"canBeWithdrawn()","d73a2901":"setManagedVote(uint256,uint152,bool)","d73b0cf2":"buyerFundRelease(uint256)","d73b1dc9":"decreaseAllowance(address,address,uint256)","d73b3a67":"withdrawal_Eth(uint256)","d73c277c":"storageName()","d73cbc6b":"testLen()","d73cbcba":"daCall()","d73cedd4":"SPECTRUMZ()","d73dd623":"increaseApproval(address,uint256)","d73e0c89":"getBookCount()","d73f0b25":"lookupCampaignPart1(uint256)","d73f3408":"SimpleMultiSig(uint256,address[])","d73fe0aa":"getShares()","d73ff0db":"preSaleBfPlatform()","d740547e":"mintBonusTokensForGames(uint256)","d740766e":"testNoTokenTransferIfNotApproved()","d741e2f9":"pip()","d743015a":"createAssetPack(bytes32,uint256[],bytes32[],uint256,string)","d743ca38":"newWinner(uint256,address,uint256,uint256,uint256)","d7441753":"getTypicalItemById(string,uint256)","d744f2a3":"wantMyToken(uint256)","d744f330":"IdClaveChain(address)","d744f47c":"validateMessage(string,bytes32,uint8,bytes32,bytes32)","d744fcb8":"ClaimFeesFromSharesBought(uint256)","d74543f0":"communityusersCap()","d7463573":"getOpeningTime()","d746a38b":"getMicroModuleByIdPart1(uint256)","d7471ad2":"nemocoin()","d7480aa4":"AuctusEtherVesting(address,uint256,uint256,uint256)","d748d1f6":"revokeEditorRights(address)","d74a960e":"BGFTToken(uint256,string,string)","d74a99d4":"create(uint256,string,uint8,string)","d74ae98e":"redeemShip(uint256)","d74afaa1":"newowner()","d74b2722":"setRefunder(address)","d74be848":"maskSender(address)","d74c894e":"setSecurityWallet(address)","d74d763e":"setUCCoinPerEther(uint256)","d74d7e79":"calculateRewardAt(uint256)","d74e0d9e":"SetBanker(uint8,address)","d74ea11e":"addMockPendingWinner(address,uint256)","d74f8e9a":"getLastPayments(uint256)","d74f8edd":"MAX_OWNER_COUNT()","d7504385":"validateToAddress(address)","d7508a55":"prepareAuctionForNonOGChain()","d7517caa":"getPresaleStatus()","d751b8de":"Request(uint16[],string,address,uint32[],uint256)","d7520298":"SetfirstTTaxAmount(uint256)","d7522582":"isCurrentTierCapReached()","d752dd8e":"AFSBToken()","d75318f8":"SecretCoin()","d75320b1":"_subtractFromMintPool(uint256)","d7533595":"keccak_f(uint256[25])","d7533751":"UnvestedSkyeCrypto(uint256,string,string)","d75352e1":"marginCall()","d75446fe":"etherGet()","d7546da7":"Commitment(address,address,address)","d754a6bc":"adminResetEmail(address,address,string)","d754f0ac":"LOCKOUT_PERIOD()","d754f3d5":"currentEraIndex()","d75528a5":"addSpecial(uint256,uint256,uint256)","d7554a68":"addUser(address,string,string)","d7557f18":"closeCampaign()","d755cc4a":"buyGOP(address,string,uint256,uint256,uint256)","d755e021":"getPlayerShipBattleById(uint64)","d7560f2b":"numRewardsUsed(address)","d7575592":"addr_teamPartToken()","d757579e":"XxxTokenSale()","d7578295":"Cashpayz()","d75b2b18":"takeCollateral(address)","d75b363f":"userRewardCount(address,address)","d75b5d9d":"RAFEND()","d75b80cc":"a_incognita(uint256)","d75d93f6":"registerMeOnToken(address,uint256,string)","d75de4ab":"isAddressInWhitelist(address,address)","d75e30cf":"drawFee()","d75e662f":"OverpayRefund(address,uint256)","d75e7afd":"calDivs(address,uint256)","d75e87ef":"PersonalInfoAdded(address,string,string,string,string,string,string,string)","d75ebde2":"joinGameFromBalance(uint256)","d75f0dd6":"SixtusToken()","d75fabb0":"RewardOffer(address,address,bytes32,uint256,uint256,uint128,uint256)","d7625c88":"hasMigrated(address)","d762755d":"minimumContributionWeiByOneInvestor()","d7638b73":"phase2Cap()","d763f92d":"FintechChain()","d7642ae2":"COIN_COST_ICO_TIER_3()","d7643e18":"protoCount()","d7651471":"Notes()","d7655b98":"OmixToken(uint256)","d7669119":"NewPrice(uint256,string)","d767aee0":"bbb()","d767ee4d":"updateLogic(uint256)","d7682701":"_cancelPermissions(address,address[])","d768729d":"getRecentDiary()","d7688d31":"destEthFoundationDev()","d7689460":"CryptoRex()","d768d95b":"finaliseContract()","d768d95e":"fetchVoteMainInfoForVoterBySnapshotBlock(address,uint256)","d768dd4b":"Stage3Allocation()","d769ae1b":"SLCAdvancedToken(uint256,string,string)","d769f32a":"mulXY(uint256,uint256,uint256)","d76a0cb8":"HybridBlock()","d76a130a":"TokenCDCQ(uint256,string,string)","d76a69e2":"Fund(address,address,address,address,address,address,address,address,address[])","d76b6095":"phase1Rate()","d76bce7c":"dropEth(address[],uint256[])","d76d6ee0":"query(bytes32,bytes2,int256)","d76dc2eb":"LOCKAMOUNT1()","d76dc656":"GDCAcc02()","d76dddd3":"unfreezeTime()","d76e5765":"getUserIpfsFromId(uint256)","d76f288f":"metaBurnHash(address,uint256,uint256,uint256)","d76f94aa":"toAlphabet(uint8[])","d7717750":"tokenLogic()","d7723231":"getIcoPurchase(address)","d772ddc0":"setProcessorAddress(address)","d7730236":"maxEthRaised()","d7734855":"getDiff(uint256,uint256)","d77371e0":"GoodDayToken()","d774c038":"multisend(address[],address)","d775db2a":"testThrowsSaleWalletIncorrectMultisig()","d7760500":"partnersRelease()","d7768c47":"prepare(bytes)","d77727de":"seeOwner(uint256)","d7777c29":"startPreICOStage1()","d77844f6":"isLimitationPeriodActive()","d77849c7":"tokenTakeback(address,uint256)","d7787f33":"setUpgradeContract(address,address)","d7789a9f":"unsetEndorsement(address,uint256)","d778c911":"price3()","d7790c11":"waipaytoken()","d7796915":"checkWithdrawValueFX(uint256)","d779ca24":"payoutBonusesToHolders()","d77a39c9":"addPresaleTokens(address[],uint256[],uint256)","d77a80a8":"lastFunder()","d77a86a0":"sendTo(address,uint64)","d77ac32d":"discountSum(uint256)","d77b0ff7":"keyAtIndexHasNext(uint256)","d77bd1ae":"ProposalAdded(uint256,address,string)","d77bf0cf":"CONFIG_PRICE()","d77c96f8":"mainICOThirdWeekEndTime()","d77d0012":"getBankPercent()","d77d3f79":"KoaStandardToken(uint256,string,uint8,string)","d77da4f4":"withdrawToTeam(uint256)","d77e2f55":"pendingEtherForCroupier()","d77e8986":"isExistsEscrow(bytes16,address,address,uint256)","d77ec4a4":"executeWithdrawTransaction(uint256)","d77fc50f":"checkZeroValue(uint256)","d77ff9ea":"eventCardRangeMin()","d7800fa2":"PurchaseRegistered(bytes32,address,uint256)","d7815ba4":"shareholdersHolding1y()","d7816f45":"transferlocked()","d781be46":"endDatetime()","d781d0f4":"YaoToken(uint256,string,string)","d781f3f4":"FootScoutCrowdsale()","d781fbf9":"removeERC223(uint256,address,uint256)","d78235cf":"setconfigurationEtherPrice(uint256)","d78276c6":"withdrawERC20(uint256)","d782cc54":"setNewBonusLevel(uint256,uint256)","d782d647":"createdTokens(uint256)","d7837ec9":"withdrawNonTop(uint256)","d783aacf":"ItalyToken()","d783b53b":"addSupporter(address)","d784601a":"myEthBalanceOfNoFee()","d784d426":"setImplementation(address)","d78506ce":"RoyaltysOwing(address)","d785c19c":"worldCupResultPart1()","d785e5c9":"m_isCirculating()","d78724d6":"getUserContractCount(address)","d7872745":"GumToken()","d788a945":"_isLongitude(int256)","d7892b6a":"changePeaceRelayAddr(address)","d789479d":"celtic_cross()","d78996d8":"getUtilizationAndAnnualBorrowRate(uint256,uint256)","d789b4c1":"uintMax(uint256)","d78b16a1":"emitTokens(uint256)","d78c15d9":"isPromoted()","d78c20ff":"voteApprove(uint256)","d78cb1b2":"buyXgoldTokens(address)","d78d610b":"getRecipients()","d78db648":"multStore(int256)","d78e1bb1":"teamPot_()","d78ed508":"getShipProductStartPriceByModel(uint16)","d78efa67":"addrecruit(uint256,uint256)","d7901260":"closePreICOPrivate()","d7901645":"GetDappinfo(string)","d790dce7":"endOfSaleFullWithdrawal()","d79185d7":"StartGuess_wis(string,string)","d791de63":"unlock(address[])","d791ed7a":"BaoBaoToken(uint256,string,string)","d792b356":"teamTokenAllocation(uint256)","d793f7a9":"preICOamountBonusMultipierInPercent(uint256)","d7942050":"Setuppresale(uint256,uint256)","d79521e8":"getPokemonDetails(uint256)","d7955eaf":"Santal()","d7959cf9":"ipfs()","d7963f94":"changeOwners(address)","d7982a6c":"unlockEscrow()","d7984cff":"CappedAndBurnableToken(uint256)","d79875eb":"sell(uint256,uint256)","d7988c98":"makeGrant(address,uint256,uint256,uint256,uint8)","d7989a93":"advancedTokensPerEth()","d79941d8":"getQueryRandomCallbackGas()","d79964c3":"addDeprecation(uint256,address,address,address,uint256,address)","d79b5bc6":"DonationSentButNotMatched(address,uint256)","d79bd499":"retrieveBalance()","d79c1f7f":"batchReclaimExpiredSwaps(bytes32,bytes32[])","d79cb6fd":"buyScams()","d79d5c7a":"COMPANY_TOKENS_PERCENT()","d79d63be":"getCardPrice()","d79d8e6c":"set(bytes32,address,bytes32)","d79e1e7d":"sumElements(uint64[])","d79e3755":"totalPromo()","d79e5de8":"HeliumToken()","d79e7894":"isAfterICO()","d79f5678":"DazzioCoin()","d7a084e0":"isWhiteListGame(address)","d7a08641":"checkCanRelease(bool,uint256,uint256)","d7a10acb":"balances2(uint256)","d7a1192d":"STAGE3_TIME_END()","d7a14a05":"totalAmountOfEarlyPurchases()","d7a15951":"winnerReward(address,uint256)","d7a17187":"ico2Raise()","d7a1cfe1":"addFriend(address)","d7a23fd4":"getActivityCount(uint256)","d7a42b54":"isEntity(uint256)","d7a4a09d":"detectJanuary(uint8)","d7a58658":"changeHouseedge(uint8)","d7a5afcf":"holderPartnershipsTokens()","d7a5f278":"slashInvalidUsername(bytes,uint256)","d7a5fdee":"DGPTokenOldContract()","d7a66ebe":"readContent()","d7a71868":"setManualPrice(uint256)","d7a78db8":"freeze(uint256)","d7a8560f":"invoicesStackCount()","d7aa6d74":"ShitCloneFarmer()","d7aa8273":"getTransactionInfo(uint256)","d7aae0e6":"executeProposal(uint256,address)","d7ab2770":"fetchGiven(address,bytes32)","d7ac79ba":"deleteHeir(address)","d7ad28ec":"GSMulti(uint256,uint256)","d7ad4931":"buyNow(bytes32)","d7ae339b":"ForecastChainToken()","d7ae76b6":"DING()","d7af26f8":"getPlayersBalances()","d7b03000":"resetCards()","d7b0a358":"shiggidyToken()","d7b0ca65":"last50plusblokhack()","d7b0e692":"set_new_admin(address)","d7b11125":"pwr(uint64,uint64)","d7b12454":"checkContract(address)","d7b12f38":"PRICE_STAGE_TWO_BONUS()","d7b15a88":"getLockedFundsLastSpending()","d7b1b9c4":"foundationTokensAllocated()","d7b1bb22":"cadastrar(bytes32,uint8,bytes32,bytes32,int256)","d7b2aae6":"setContactInfo(string)","d7b2f360":"getEncounterDetails()","d7b32f5f":"GetPrivateSale()","d7b33f66":"updatePercentToTakeAsSeed(uint256)","d7b33f94":"PRE_ICO_AMOUNT()","d7b40107":"auctionByAssetId(uint256)","d7b4750c":"getFunder(uint256)","d7b4a7f6":"MinerOneCrowdsale(address)","d7b4c9b1":"lookupKittyDetails1(uint256)","d7b53081":"closeSaleAnyway()","d7b5507d":"blockchaincertified()","d7b701b6":"SarahCoin()","d7b7024d":"approvedWithdrawAddresses(bytes32)","d7b7913b":"f3(uint256)","d7b7961c":"getPairHash(address,address)","d7b84f68":"moveDataContractBalanceToWorld()","d7b8cdf4":"MinimumContributionChanged(uint256)","d7b8de00":"setMaxCollectable(uint256)","d7b91bcc":"buyTokensICO()","d7b96d4e":"locker()","d7b97db1":"setDistributionTime(uint256)","d7ba30b2":"rateAirDrop()","d7ba42fc":"addActionAccount(address)","d7ba95ca":"share2()","d7baa041":"PublicLayer()","d7bb913f":"accountTokensPurchased(address)","d7bb99ba":"contribute()","d7bbce2a":"setOrCacheDesignatedReportStake(uint256)","d7bc23af":"newParameters(int256,uint256,uint256,uint256)","d7bd6d0d":"addExchangeAccounts(address,address)","d7bd8987":"testTransfering()","d7bdaaa6":"WLMWallet()","d7bdc3fa":"addVolumeDiscount(uint256,uint8)","d7be503f":"_tokePerEth()","d7be708c":"BoulePreSale(address,uint256,uint256,uint256,address)","d7be8ceb":"performFetch()","d7bea56a":"totalExcessEth()","d7bfc8c5":"BabyDragon()","d7c01c3e":"SetTakePot(uint256)","d7c0302e":"numOfCitizensWhoReceivedDrops()","d7c06439":"AriumToken()","d7c06919":"getAuctions()","d7c0d42d":"ControlledToken(uint256,string,uint8,string)","d7c0f72b":"getTitulaire_Compte_5()","d7c23572":"historyTimesPlayed(address)","d7c23578":"addSig(bytes32,bytes32,bytes32,uint8)","d7c26adb":"oraclize_setProof(bytes1)","d7c2a887":"MANAGEMENT_FEE_RATE()","d7c35657":"EthsqrGate()","d7c39cc6":"totalSellingItem()","d7c482ef":"Defroze(address,bool)","d7c48e2b":"preseller()","d7c4e7ac":"HarlleriumCoin()","d7c4f9d3":"SignatureAdded(string,string,uint256)","d7c5b986":"LogContribution(uint8,address,uint256)","d7c61e7b":"CreateSaleAvgPrice(uint256,uint256,uint256,uint256,uint64,address)","d7c7159c":"buyWithKYCData(bytes,uint8,bytes32,bytes32)","d7c74279":"deployChildren(address)","d7c8112d":"WithdrawAllFunds(uint256)","d7c81b55":"gameId()","d7c81fdc":"MSCCStandardToken(uint256,string,uint8,string)","d7c8843b":"getEggsSinceLastHatch(address)","d7c8e90c":"voteAmendment(uint256)","d7c8f959":"CreateEmployee(address,uint32,uint32,uint16)","d7c94efd":"teamFee()","d7c97fb4":"erc721Contract()","d7c9a0e3":"getMyMoney()","d7ca01b5":"confirm(address,uint256)","d7ca3a90":"CelebrityMarket(address)","d7ca7cc5":"changeLockingPeriod(uint256)","d7ca9949":"totalSoldTokens()","d7cb55a2":"AToken()","d7cbac05":"BONUS_ICO_STAGE1_PRE_SALE1()","d7cbbb73":"getAllCardsAddress()","d7cc43bf":"aSetStart(uint256)","d7cc8362":"isLatestMajorTree(bytes32,bytes32)","d7ccc2c3":"getLastPayment()","d7cd6c13":"burnFundAccount(address,uint256)","d7cd7209":"newGroup(address,bytes32,address[])","d7ce330b":"Deco()","d7cea877":"monthStr(uint256)","d7cee31e":"houseAddress()","d7cf1d20":"HDT_Token()","d7cf61d7":"assertSignedByBoth(uint256,bytes32,uint8,bytes32,bytes32)","d7cf7bcb":"purchaseSafe(uint256,uint256)","d7cff986":"submitAnswerCommitment(bytes32,bytes32,uint256,address)","d7d0afa4":"_fetchCreatedOrdersForMerchant(address)","d7d12297":"taskTotalBalance()","d7d15059":"functionName()","d7d1b48c":"_setWingsValue12(uint256)","d7d1bdbd":"getUnsoldOwner()","d7d23155":"owner_linkage()","d7d29315":"drawReuslt(uint256,address[],address[],uint256,uint256,uint256)","d7d319e4":"CWCreturnQuery()","d7d3c4d5":"pvpContenderRemoved(uint256)","d7d40523":"HardwareWallet()","d7d43b41":"MoedaToken()","d7d49532":"lastBlock_a9()","d7d5878d":"revokeSchedule(address,address)","d7d7442f":"updateThreshold(uint256)","d7d7be34":"oraclize_query(string,bytes[1])","d7d88043":"endSaleDate()","d7d8cdd5":"addTRA(address)","d7d90fb1":"ClearCLevelSignature()","d7d96a12":"StarToken()","d7d9fef0":"scheduleTimelock(address,uint256,uint256)","d7dae83c":"active_withdraw(address)","d7dbb88b":"getn2Exception(bytes32)","d7dbdbe3":"setVicepresidenteDeMesa(bytes32,uint256,bytes32)","d7dc6203":"calculateInterest(address,uint256)","d7dcaa19":"BuToken()","d7dccb1e":"EthSplit(address[],address)","d7dd2ae3":"ValidateCitySnapshotInternal(address,uint256)","d7dd8652":"refundCrowdsale()","d7dde189":"StartupToken()","d7de57c6":"challengeWithFutureCustody(address,uint256,bytes32[],uint256[],bytes32[])","d7de9c6e":"setOracleQueryString(string)","d7df7ef9":"_createWonder(address)","d7dfa0dd":"logic()","d7e07d5f":"destTokensReserve()","d7e0b6e3":"registerUser(address,bytes32)","d7e0d83d":"setPrvd(address)","d7e0e776":"getBalanceOfInstance()","d7e11e9d":"AddTicket(bytes)","d7e25c36":"isCapReached()","d7e2f000":"preallocationsWhitelist()","d7e30832":"TankTransfer(address)","d7e31d67":"setRewardChance(uint256)","d7e3aab2":"VestedMultisigWallet(address[],uint256,uint256)","d7e4e1f7":"setSail(uint16,uint16,bool)","d7e5c07d":"allocateTokens(uint256,uint256,address)","d7e64c00":"investorCount()","d7e7088a":"setUpgradeAgent(address)","d7e751ff":"tokenWithdraw(uint256)","d7e8015a":"FuckToken(uint256,string,uint8,string)","d7e84fbf":"builder()","d7e8553a":"_deleteValidator(address)","d7e9ec6e":"RemovedBlackList(address)","d7ea39c6":"referralDone()","d7ea977b":"V1ChainToken()","d7ea97e2":"setBTHFoundationWallet(address)","d7ead1de":"right74(uint256)","d7eae6db":"setUnPauseEmergence()","d7eaef90":"LGTToken()","d7ebf53d":"countActiveCastle()","d7ec1fac":"CrowdSaleTokenSoldout()","d7ecb5e3":"MINI_GAME_BETWEEN_TIME()","d7ecba0c":"numBarriersPerBoard()","d7ecc129":"supplyTo(address,uint256)","d7ed3fb1":"get_participant_topl_address(address)","d7ed7453":"redeemWinnings(uint256)","d7edddb2":"withdrawAdministratorMoney(uint256)","d7edf88c":"replenishEth()","d7ef1356":"best_adjustment(bool)","d7ef4a04":"CreateCredoIco(address,uint256)","d7efbf34":"transition()","d7f08eed":"unlistSubName(bytes32)","d7f0d86b":"attackUnit(uint256,uint256)","d7f0df73":"Betcash(uint256,string,uint8,string)","d7f0f01b":"fund(uint8,uint8,uint8)","d7f31eb9":"forward(address,uint256,bytes)","d7f3c770":"Mesut()","d7f42ee2":"getBBLibVersion()","d7f56ef7":"partnershipsTokenAddress()","d7f59fd0":"tgeSettingsBlocksPerStage()","d7f6f81c":"getProviderBadge(address)","d7f746ce":"tickingBomb()","d7f7582c":"totalCapitalization()","d7f7f3aa":"markTransferTokens(address,uint256)","d7f8a053":"TokenRate(uint256)","d7f9d655":"Divies()","d7fa1007":"setHash(bytes32,bytes32)","d7fa445e":"claimBidReward(uint256)","d7fb4f1d":"endTime_()","d7fb5ef5":"angelSupply()","d7fb7427":"transferNewCoin(address,uint256)","d7fb8dc0":"messageForReason(uint8)","d7fc1b9b":"register(string,string,bool)","d7fc23a2":"createNewAsset(string,string,uint256)","d7fc98c3":"subscribeIndividual(bool)","d7fd00b0":"TEAMS_PER_ENTRY()","d7fd0e77":"requestTime()","d7fe270e":"multipleTokensSend(address[],uint256[])","d7febcb9":"TestUserBitFlag(address,uint256)","d7ff4d7a":"WODECESHIBI(uint256,string,uint8,string)","d7ffbbaa":"setInformation(string)","d8013c4e":"addNote(bytes32,bytes20,string,string)","d80162fc":"setRecommendStatus(bool)","d8018c42":"getReleaseTimes(address)","d801aa84":"isWalletFromUser(string)","d8020a18":"marketingPercent()","d80326a9":"VentanaToken()","d80364ba":"LogRegister(address,string)","d8047a07":"RobotChain()","d80528ae":"stats()","d8055812":"votesDecline()","d8058712":"UnicornAccessControl(address)","d8063ea6":"addDelegate(address,address,string,address,uint256)","d8070c40":"IcoPrice()","d807a688":"wper(uint256,uint256)","d8085306":"mintTokensForSecondStage()","d8085f78":"ownerCanClaimCard(address,address,address[3],uint256)","d8085fee":"multiMerge(address[])","d80866da":"isValidZ(uint16)","d8090cbf":"resetReclaim()","d809d248":"startNextGame()","d80a5c3b":"MyContribution()","d80ad1ed":"getSponsorshipProportionalAmount(address,uint256,uint256)","d80aea31":"_setCreatedBlockOnRevealsPhase(uint256,address,bool)","d80b1a68":"createAndEndowC1(uint256,uint256)","d80b2056":"emptyWrongEther()","d80cc340":"retainBalance()","d80d3025":"changeBonusSystem(uint256[],uint256[])","d80d9c55":"changeSecondsInBlock(uint256)","d80e821c":"reevaluateICO(uint256)","d80e8700":"CurrentTime()","d80ffb20":"drawNumber()","d8104e19":"GetMyEarning()","d810f298":"computeSettlementAmount()","d81111ab":"BuyTokens()","d8112523":"sendIncentive()","d811b100":"getHouseAddressOne()","d811b7ca":"transferToOtherBucketContract(address)","d811f09e":"ownershipTransferAllowed()","d811fcf0":"farmer()","d81230c8":"shareactive()","d812d961":"getSanName(uint256)","d812f2b0":"setDelegadoDeEscuela(bytes32,uint256,uint256)","d8132807":"_getMinAuctionStartPrice()","d8134a23":"removeAcceptedToken(address)","d813b4b9":"setArtIdt(string,string)","d8145062":"squirrelmasterReq()","d8148166":"DistributionMint(address,uint256)","d81494ba":"blacklist_addys(address[])","d8149fe7":"dive1(address)","d814ebed":"TruUpgradeableToken(address)","d8152cbc":"createBalanceSnapshot()","d816187f":"PreIcoWallet()","d8162db7":"lockedUntilBlock()","d8174150":"MAX_PRESALES_EXTENSION()","d8175101":"ownerHasCardSimple(address,address)","d81849b8":"additionalTokenRate()","d818eb63":"Fundraiser(address,address,uint256,uint256,uint256)","d818ecee":"setDisputed(address,string)","d81a91e9":"get_party2()","d81ab0c1":"invoke(uint256,address,address,bytes)","d81ad101":"IMPACT_REGISTRY_ADDRESS()","d81b1020":"setForceContract(address)","d81c2232":"icoPhase2TimeBonusInPercentage()","d81c6741":"removeAddressFromBonuslist(address)","d81d5062":"relayBuyerCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)","d81d8f89":"getSalaryTokensTotalValue(address)","d81dd9f7":"destroyGame(uint256)","d81dfe30":"LOCKED_TIME()","d81e8423":"get(address,address)","d81efdc4":"euroCentsInOneEther()","d81f53fd":"EtherId()","d81f84b7":"getAddr(uint256)","d81f9830":"BONUS_WINDOW_2_END_TIME()","d8207301":"MyWishCrowdsale(uint256,uint256,uint256)","d820ab95":"secondStageReserve()","d8211b0d":"BENZCoin()","d821b9f9":"initialAllocations(address)","d82277cc":"createInvestment(address,uint256)","d823eec9":"TEAM_TOKEN_CAP()","d825b510":"addDisagree(bytes32)","d825ebc3":"calculateMinting(uint256)","d826505d":"isEthNoEnc(uint16)","d8267fef":"letItRain(address[],uint256[])","d826853e":"sellKeys(uint256,uint256,string)","d826f88f":"reset()","d826fdf1":"checkRefundExistanceByOwner()","d8270dce":"creationTime()","d82745c8":"withdrawCooldown(address)","d828435d":"getNonce(address,address)","d8291e97":"CHELSCOIN()","d8294ede":"minimumTimeout()","d82974f8":"moveUnsoldTokensToFoundation()","d829f1e0":"blendWithOthers(address,uint256,uint256,uint256)","d82a6d56":"isOBR()","d82b394f":"createShip(uint256)","d82beb9e":"sender_enode()","d82c6df4":"inactivate()","d82ce857":"getPI_edit_26()","d82e3962":"calculateReward(address)","d82ed7eb":"unwhitelistAddressPresale(address)","d82f6a3f":"maxWeiInvestment()","d82f94a3":"deleteMinter(address)","d82fa3f1":"doInvest(address)","d831a158":"ownerCtuContract()","d831b714":"withdrawDeklaBalance(address,bytes)","d832d0c8":"isFoundation(address)","d833590f":"totalSupplyPretty()","d833c736":"tripleRoomMax()","d833dbe9":"preSaleRate()","d834e619":"min(uint256[])","d834f1e8":"setConfiguration(string,string,uint256)","d8353b75":"vestingDateEnd()","d83616b2":"TokenSaleLockTransfer(uint256,uint256,uint256)","d83623dd":"startDistribution()","d83678ac":"tradeToken()","d8367d41":"startIncomeDistribution()","d836b12d":"getInvestorTokenPercentage(address,uint256)","d836f06a":"VestingKYCSetted(address,uint256)","d836f794":"sellKebabs()","d836fbe8":"changeHatchEscapeCaller(address)","d8381df0":"createCastle(uint256,string,uint64,uint64,uint64,uint64,uint64,uint64)","d8389dc5":"hash(bytes32)","d8392c92":"WithCoin()","d83a223a":"changeFounderWalletAddress(address)","d83a7f67":"getDepositAddress(address)","d83a8d11":"testProposing()","d83aabbe":"getWagerCount()","d83c68b9":"Pilendthereum(uint256,string,string)","d83cb681":"getMixer(bytes32,uint256)","d83d2afc":"leftoverWeiAmount(address)","d83edd70":"refundEth(address)","d83f24a2":"multiMerge(address[],uint256[])","d83fcfa3":"TMN()","d8412808":"HazzaTokenInterface()","d84201bf":"buy5()","d8420e3a":"_isValidWithCompositions(uint256[],uint256)","d8436663":"destroyIBTCToken(address,uint256)","d8439165":"upgradePonyResult(uint8,uint256)","d843dcbb":"ELF()","d843e40a":"getRoundNum()","d843e721":"convertToATK(uint256)","d844a0fa":"TierionNetworkToken()","d845a4b3":"request(uint256)","d8460e8c":"Menu09()","d8464746":"getEyesValue(uint256)","d847e48f":"BlingTokenSale()","d8485ed6":"FCOIN1519Token(uint256,string,string)","d84891da":"EM122()","d8489a81":"MaxDistribPublicSupply_()","d848dee7":"setDeprecated(bool)","d8493983":"GroverBucks()","d849eeba":"gotResult()","d84acf20":"restoreAllTempTokens(uint256)","d84bd737":"xcc()","d84cb6ad":"ETH_Rate_Factor()","d84d2a47":"spreadMultiplier()","d84d95ba":"confirmMultipleTransactions(uint256,uint256)","d84dbdc3":"verifyInvestor(address)","d84f93cb":"priceOfOfficalCardSold()","d84fdbed":"getSponsorships(address,address,bool)","d850288b":"etherlist_top()","d8507a8d":"unfrezee()","d851eb5d":"betPlaced(address,uint256)","d8523fc2":"askForMatch(uint256)","d8526677":"MintMasterTransferred(address,address)","d852748c":"totalPoolOptions()","d8528af0":"allowedSpenders(address)","d85349f7":"cliffDuration()","d8542d51":"oldTokenAddress()","d8550112":"putServerAddress(string,address,uint256)","d855c059":"setExtraConfig(uint256,uint256,uint256,uint256,uint256)","d85633ec":"releaseOwnership()","d8567213":"chargeAll(uint256)","d856cbae":"ICOMinTresholdReached(uint256,string)","d8574e16":"addressD()","d857561d":"enableWithdrawal()","d8578d14":"showPlayerSafeById(uint256,uint256)","d857eba6":"getTagAt(uint256)","d8583895":"getNumberOfDeposits()","d85874b9":"badgerAmount()","d8589be3":"CoinFlipper()","d858b5c8":"order_sell(uint256,uint256)","d858ebf4":"createVisaOffering(uint256,bytes32,bytes32,uint256,uint256,bytes32)","d8590f93":"clearingPrice(address,bytes32)","d8592d79":"closeWormhole()","d85a82f6":"processDIVD()","d85b07e0":"stopIcoAndBurn()","d85b228e":"testCreateGame(string,string,bool)","d85b559f":"startSelection()","d85ba798":"getCutieId(bytes)","d85bd526":"running()","d85c8966":"ownerTransfer(address,uint256)","d85d3d27":"mint(string)","d85d656f":"getSMPTokensAmountPerWei(uint256)","d85d6d41":"finishLocking()","d85e5486":"privateCap()","d85e88db":"item(address,uint256,bool,bytes)","d85edab6":"m_investors(uint256)","d85f4450":"numberOfWins()","d860ced1":"TIER1END()","d86123e1":"setMany(address[])","d8615e5b":"transferAndPay(address,uint256,bytes)","d86202cb":"getUserProductAtIndex(bytes32,uint256)","d8627542":"intialSupply()","d862b611":"extraMint()","d8632388":"allPlayCount()","d8632ae3":"sign(uint8,bytes32,bytes32)","d863f7f4":"DigiPeso()","d86491fc":"testReentracy()","d864c322":"changeAccountStorage(address)","d864e740":"committee()","d8650f49":"tokenGenerationLock()","d865897c":"_getHashKey(address,uint256)","d865a374":"instruct_1()","d865ae9b":"hasRole(address,bytes32,bytes32)","d865dc4f":"tokensSoldCount()","d8674554":"tokenTransfertoKYC(address,uint256)","d867bb25":"getONG(bytes32)","d8682e69":"returnTimeLeft()","d86892a7":"setSellerGuarantee(uint256)","d868c718":"scheduleFight()","d8690c22":"isAvailableLockSlot(address,uint256)","d8692f17":"calcMerkleDefault(bytes32[],uint256,uint256,bytes32)","d869c681":"issuedTokenBalance()","d869d86d":"getAmountsForChangeWeight(address,address,uint256)","d86afbbb":"giveItem(address,uint256)","d86b2982":"numbersCount()","d86b3721":"getblock()","d86b8739":"redeemedTokens()","d86bc1b0":"cancelByAdmin(uint256[])","d86c31e5":"BOXSToken(address,address,int256)","d86c5bf7":"angelWheelFinanceSupply()","d86df333":"deleteAccounts(address,address,address[])","d86e1850":"AuditBalances()","d86e762d":"getTotalAmountRaised()","d86e79c3":"createFixedPeriodVpfFactory(string,bytes32,uint256,uint256,int256[],uint256,uint256,uint256)","d86eb3b7":"reservedTokensAddress()","d86ec25a":"setNotaryParcel(uint256)","d86f26f2":"BigBucksToken()","d86f8ccd":"getAccountLockState(address)","d86fb89d":"updateRoundsInformation(uint256)","d871e94b":"tokenClaimWaitingPeriod()","d8730ef2":"getMaxCommunityTokens()","d8737d8a":"buyEthUnit(uint256,uint256)","d873f0d6":"tokenSaleMin()","d874082a":"fundtransfer()","d8743fad":"weiMinContribution()","d87522ae":"pauseEnd()","d8754716":"createNewTankHull()","d87574e0":"airDropPot_()","d87624ba":"buyGrimReapersAgainstEther()","d87692d9":"transferAllAndCall(address,bytes)","d876c9c0":"SECOND_AUCTIONS_INITIAL_PERCENTAGE()","d8772e79":"get_transaction_count()","d8774d99":"restrict(bool)","d8783b04":"PRICE_MULTIPLIER_ICO6()","d8787fde":"nextContract()","d8788e68":"getTokensForSaleCap()","d879380d":"timeoutRegistration()","d879914a":"getBidsLength()","d879e911":"JORDAN()","d87a253b":"registerNameXnameFromDapp(address,bytes32,bool)","d87adaa0":"registerPubKey(address,bytes)","d87b5c29":"getSpawnCount(uint32,int256)","d87bc4cd":"WEGC()","d87bca3f":"VictorieumToken()","d87be21b":"lastBlock_a4Hash_uint256()","d87c3df5":"applyBonus(uint256)","d87c5df6":"assignTokensWallet(address,address,uint256)","d87c5fb9":"balanceOfBuyer(address)","d87c9478":"getStageAverageBonus(uint8)","d87ce037":"round1Cap()","d87d2a66":"ETH_CRWDTOKEN()","d87d2b8d":"BuyMOYTokens()","d87d9a66":"get_account_balance_eth(address)","d87ddccc":"WithdrawEvent(string)","d87e568a":"setHWCDeposit(address,uint256)","d87f8da5":"cancelAuction(uint256,bytes)","d880285e":"sPeriodEndDate()","d880610c":"appendKeyValue(string,address)","d88080ed":"ERC20Standard(uint256,string,string,uint256)","d880b0b0":"LogChangePCWallet(address)","d8819e0a":"maxTrainerLevel()","d8822727":"CarDeregistered(uint256)","d882ad5e":"Valeriumcoin()","d883e789":"PayWins(address)","d8844241":"getTotalCategories()","d884a322":"betMaxAmount()","d886daa2":"revokeAccessDeposit(address,address)","d8879dd8":"isValidString(string,string,uint256)","d8879fdc":"deleteBio(bytes3)","d887ac35":"mUpgradeCostFactor()","d8887efc":"withdrawForTrexdevshop()","d88905fa":"sanMint(string,string)","d8894bb5":"fraction()","d88a3af9":"register(address,string,string,uint256,string,string,bytes32,address,address)","d88ae250":"setProjectsContractAddress(address)","d88b0815":"numberOfCrySolObjects()","d88b2da2":"_registerReferral(string,address)","d88b8676":"addTrustedAccount(address)","d88b9732":"BUXCOIN()","d88bfbad":"ContractDisabledBlock()","d88c271e":"isWhitelistedUser(address)","d88c5237":"VenusCoin()","d88cdbd6":"setMe(uint256)","d88dc1c6":"winner_announced(address,uint256)","d88e92a7":"OmegaProtocol()","d8909e74":"withdrawMyDeposit(uint256)","d8910b70":"getTransferProxy(uint32,int256)","d89135cd":"totalBurned()","d8915fc5":"DCAssetBackend(bytes32,bytes32)","d8916bb9":"etherToWei(uint256)","d89397b1":"btcsBuyRecipient(address)","d893b9f1":"soldTokensPreSale()","d894e937":"setSomeValue(string)","d894f861":"costFunds()","d895530c":"getCurrentCandidateForPrize()","d8959512":"getConnectorBalance(address)","d8966ad3":"getTombByOwner(address)","d896dd64":"setStatus(uint256,uint8)","d89739b1":"Marketplace(address)","d897833e":"setSaleStatus(bool)","d898e1b9":"_depositEther()","d899299e":"realUnicornAddress()","d899d312":"Testimony()","d899e112":"target3()","d89ab6d3":"YouCollectCoins()","d89b465c":"getUnitAttackIncreases(address,address,uint256)","d89b8057":"setOscar(address)","d89b908d":"checkFundingCap()","d89bcaaa":"BATsPerEth()","d89cca38":"assignLawyer(string)","d89d4404":"_payEther(uint256)","d89dc0ad":"MarketOpen(address)","d89ea0f5":"setClearingPriceComponent(address)","d89edecf":"returnAmountPlusInterest(uint256)","d89ef018":"addUsersWhitelistA(address[])","d89f9719":"getOrderOtherArguments()","d89fb919":"episodePurchase(uint256,address,uint256)","d89fda34":"Fish()","d89fec58":"aboutCurrentPack()","d8a0aa6c":"getPositionById(address)","d8a119b9":"ownerSetVisible(string,string)","d8a140f9":"peony()","d8a1e70a":"widthrawDev()","d8a2848d":"setPaymentEscrow(address)","d8a351de":"_getDefaultPartitions(address)","d8a3daa0":"createEntry(uint256,uint256[])","d8a3f0bf":"getFactoryPrice()","d8a489d9":"pauseTournament()","d8a506f3":"thirdStageDiscountPriceOfTokenInWei()","d8a52178":"ContractManager()","d8a54360":"totalRemaining()","d8a5cca1":"Finalised(address,uint256)","d8a6021c":"transferTreasury(address)","d8a7233e":"addBook(string,string)","d8a74c7c":"getGamblingPartySummarizeInfo(uint256)","d8a74f3b":"ThrowError()","d8a79d87":"wolf3Balance()","d8a865f6":"getElementAt(uint256)","d8a8e03a":"move(uint256,address)","d8a9e45e":"getProductContractUser(address)","d8aa9f85":"totalForOutcome(uint8)","d8ab8274":"getStates()","d8ab9208":"addressByIndex(uint256)","d8aba1c6":"partFees()","d8ac1bb3":"buyTokensReferral(address,string)","d8ac26c0":"ForksTestContract()","d8ac289f":"frozenWallet4y()","d8ac5b4e":"tokensPerCents_gte5kUsd()","d8ad1c5c":"getCapAmount()","d8ae6139":"WavesPay()","d8aeedf5":"freezingBalanceOf(address)","d8afc2fe":"getAdminVariables()","d8afd392":"advisorySupply()","d8b0403a":"Bithemoth(address,address)","d8b0b499":"country()","d8b11d54":"AddItemExtra(uint32,uint16,uint256,uint16,uint16,string,address)","d8b120c1":"getMeshPointByName(int256,string)","d8b163d0":"eventsAdmin()","d8b29324":"unlockAmount(string,uint8)","d8b3315f":"public_withdraw(uint256)","d8b3a2eb":"isOdd(uint256)","d8b3ad77":"setDateTimeLib(address)","d8b3d69a":"getVendorApplicationScoringTrack(string,uint256)","d8b3e417":"USD20TestToken()","d8b4e580":"uploadBalances(address[],uint256[])","d8b50a63":"addAction(string,uint256)","d8b5cf43":"beneficiary_modify(address)","d8b66ae1":"sendTokens(address[],uint256[])","d8b79543":"FxxkToken()","d8b86753":"getOrderCount(address)","d8b964e6":"approved(address)","d8b98118":"CRLperEther()","d8b98fca":"AirDrop(address)","d8b9a2a0":"addContract(address,address,uint256)","d8b9a7e8":"CLC(uint256,string,string)","d8ba6de2":"Endorsements()","d8ba8ce3":"setNextDiscountTTMTokenId6(uint64)","d8baa905":"getAreaEvaluation(address,uint256,address)","d8bad5bd":"userLoans(address,uint256)","d8bbae03":"getTransferValueFor(address)","d8bd4761":"createCurrency(string,string,uint8,uint256)","d8be2838":"unSuspend(address)","d8be30fc":"getUserMessage(address)","d8bea898":"addReferredInvestor(string,address)","d8bf0568":"level1Bonus()","d8bf0ef8":"finishBurning()","d8bf1773":"calculatePoohBuySimple(uint256)","d8bf63b7":"START_BLOCK_NUMBER()","d8c02572":"Gallery_MuYi_No2()","d8c1c3c2":"getNumberOfTx(uint256)","d8c1fad1":"StakeIt()","d8c251b5":"isNotRegistered(address)","d8c2c1c1":"getcoeffcient(address,uint256)","d8c2c878":"PlexCoin(uint256,string,uint8,string)","d8c30700":"getCurrentCap()","d8c34127":"isKnownSignature(string)","d8c35273":"getHumanNumber()","d8c37ecd":"calculateMarketPixelPrice(address[16],uint256)","d8c3c1ed":"finalizeIto(uint256,uint256,uint256)","d8c42e42":"doublePrice(uint256)","d8c4661c":"getNID()","d8c4c34e":"KaraOmToken()","d8c4cd7d":"saveStudent(uint256,string,string,address,address)","d8c57892":"getDecision(bytes32)","d8c5c6f8":"disapproveInternal()","d8c65cbb":"_setEyesValue4(uint256)","d8c6bd6f":"checkMine(uint256)","d8c90762":"addTrustedIssuer(address,string)","d8c929a8":"getCurrentRoundRewards()","d8c9334b":"TextChanged(bytes32,string,string)","d8c94cd5":"_addToken(address,uint256)","d8c97f34":"transferFromVest(uint256)","d8ca713a":"getStringMember()","d8ca8a55":"distributeIQTTokenBatch(uint256)","d8cb2d4a":"STOCoin()","d8cb4aa3":"bonus(address)","d8cb52d3":"getFreeRabbit(uint32,uint256,uint8,bytes32,bytes32)","d8cba0ba":"transferWallet(address)","d8cba7a2":"phase3Cap()","d8cbce53":"calculateDividendsFor(address)","d8ccd0f3":"free(uint256)","d8cdac0d":"window0StartTime()","d8cecc7b":"MdedicalChainCoin()","d8cf9184":"getServerCreationFee()","d8cfd15a":"LogB(bytes32)","d8cff716":"NBAT101(address,address,address,address,address)","d8d07637":"poll(uint32)","d8d0819f":"CoinVilla()","d8d1d507":"whiteListContracts(address)","d8d1efea":"releaseTimeSecond()","d8d34c89":"ManualTransfer(address,uint256)","d8d3b1a4":"TIER1()","d8d40cee":"gameNumber()","d8d45d13":"setShipping(string)","d8d4a75e":"AUD_Omnidollar()","d8d4ec02":"checkVesting(address)","d8d5740c":"XMLYToken()","d8d5a200":"payBountyManager()","d8d736c5":"_makeDepositForPeriod(bytes32,uint256,uint256)","d8d777f2":"_attack(uint32,uint8,uint64)","d8d8e2f2":"test_23_assertGasUsage200Boards()","d8d9159d":"pr0coinAddress()","d8da3bc0":"getCurrentPotSize()","d8da708f":"preico_enddate()","d8db583f":"getFreelancerSkills(address,address)","d8dbb475":"JSONpath_string(string,string)","d8dbb712":"OfferCancel_internal(uint8,bool)","d8dbe4c9":"setContractManager(address)","d8dd2b79":"emitTransferFeeRateUpdated(uint256)","d8de5a41":"splTransferFrom(address,address,uint256,uint256,uint256)","d8df44fd":"maxTimeBonus()","d8df5dc1":"lockAmount()","d8df9aad":"setDayWithdrawCount(uint256)","d8e09dac":"setTrustee(address,bool)","d8e1b9ba":"explore2(uint256,address,bool)","d8e20e2c":"brickPrice()","d8e223b5":"issueMedal(address)","d8e2e392":"admin_set_isRequireData(bool)","d8e30740":"ETH_RECEIVED_CAP()","d8e3c1c8":"buyPlatinum(uint256,uint256,uint8,bytes32,bytes32)","d8e3c33f":"gridToIndex(uint256,uint256)","d8e476ab":"icoPhaseDiscountPercentage2()","d8e4ab0d":"isOmegaContract()","d8e4f9d9":"teamTwo()","d8e5ae6a":"Etheramid()","d8e5c048":"scheduleCall(address,uint256,uint256)","d8e5c797":"concat(string,string,string,string)","d8e5e64e":"getAsAddressOrZero(bytes32)","d8e60616":"OFNOG()","d8e6b249":"findPossibleDelegatorsOf(address)","d8e71b35":"ico3receivedTotal()","d8e74ed7":"monsterStrength()","d8e86854":"setPrices(uint256,uint256,uint256,uint256)","d8e8752a":"resetUsedToday(uint8,uint8)","d8e8b177":"interestOf(address)","d8e9602b":"tierCap(uint256)","d8e963b3":"PRE_ICO_END_TIME()","d8e97a56":"averageTimestamp()","d8eb3a98":"withdrawAuctionBalance()","d8eb6af3":"redeemEthers(address,uint256)","d8ebfe5a":"interaddmoney(address,uint256,uint256)","d8ec55ed":"meh()","d8ec696f":"__address1__()","d8edbd79":"ZTToken()","d8ee2ff4":"_buys(uint256,uint256)","d8ee796f":"founderAllocatedTime()","d8eea572":"getMinInt64()","d8eebd8d":"spentBalance()","d8eef28b":"ordersFor(uint256,uint256)","d8f012c6":"StatelessFactory(string,string,string)","d8f06b52":"closeAfterWhitelisted(address)","d8f0b9c4":"amountToBeneficiary()","d8f0c358":"getSetupParametersCount()","d8f163ab":"totalTokensDistributed()","d8f248b8":"getForge(uint256)","d8f2cd12":"onceSetOwners()","d8f2f09f":"china()","d8f306a1":"setAvailableToken(uint256)","d8f342be":"getBTCETH(uint256)","d8f3790f":"ethBalance(address)","d8f42fca":"SzeToken(address,address)","d8f45fdb":"LICToken()","d8f5d098":"privateUnlock(address)","d8f6d596":"getSale(uint256)","d8f6dcf2":"getTaskById(bytes32)","d8f71809":"MAX_COMMISION()","d8f9659b":"withdrawnTokens(address[],address)","d8f9d144":"changeOwner(string,address)","d8f9e51b":"EkoBeerCoin()","d8fa191b":"setProviderDetailFields(uint256,bool,bool,uint256)","d8faefc9":"fixDistribution(uint8,uint256)","d8fbbf31":"removeContractFromWhiteList(address,uint256)","d8fbe994":"transferFromAndCall(address,address,uint256)","d8fbff9f":"createDroneFromVault()","d8fce0d4":"pinchVillain(uint256,uint256)","d8fcfd6b":"convertRealTo256(int128)","d8fd1ed9":"creatorReward()","d8fd2043":"getSkullyById(uint256)","d8fd7ae3":"subtractAllowed(address,address,uint256)","d8fe1558":"BaseICOTokenWithBonus(uint256)","d8fe511f":"tithes()","d8fed39e":"tokenSoftcap()","d90025d1":"DIVIDEND_FUND_FRAC_TOP()","d900a6ae":"hgtSold()","d901402b":"getCommitHash(address,uint256)","d9019530":"request(address,uint32)","d901b98c":"test_1_generationAcrossBlocks_increaseBlocksBy100()","d902ac2e":"insert_data()","d9037441":"setEthFundDeposit(address)","d9037522":"removeVoter(address,string)","d903c5ae":"minimumTDEContributionInWei()","d904094e":"ownerCancelArmyMarketplace(uint256)","d9057007":"supportsInterface(address,bytes4)","d9067fbd":"initCongress(address)","d9076129":"secondBonusPercent()","d907e02e":"_cancelBet(uint256)","d9082962":"totalRefunded()","d9089b11":"_processDividends(uint256)","d9099f67":"endPreICOStage3()","d90a8224":"getNumberOfSuccessfulDeals()","d90a88cd":"getContentReplies(uint256,uint256)","d90b02aa":"left80(uint256)","d90b4958":"completeProject(bytes32)","d90c1759":"dayFor(uint256)","d90c2861":"Albertheijn()","d90cdfb4":"getCanvasInfo(uint32)","d90d5b58":"copyright(address)","d90d870b":"adminSetPercent(uint256)","d9106264":"clearAuth(string)","d910c805":"MAX_POWERBALL_NUMBER()","d9114476":"addAudit(bytes32,uint256,bytes32)","d912d248":"transfertOwnership(address)","d912ebb2":"tokensIssuedIco()","d9134c46":"isGlobalConstraintRegistered(int256,address,int256,address)","d9135493":"AdPotato()","d913dea2":"UsdRateSet(uint256)","d9144448":"upgradeProposal(address,address,address,uint256)","d9144712":"numberClaimToken()","d914cd4b":"addPool(address)","d915562b":"isControlled()","d9159f60":"sealedBy()","d915cdbd":"investBalances(address)","d916d8fd":"getPlayersCountByGame(uint256)","d916ec32":"getEmissionProviders()","d917863e":"addExchangeTestAccounts(address,address)","d9178993":"maxPeriodDuration()","d917deb5":"Donate()","d91921ed":"addBalance(uint256)","d9194d2c":"toggleTransferable(bool)","d9194fcb":"setCEO(address,bytes)","d91aee02":"getTotalGamesParticipated()","d91c98d3":"startingBlock()","d91ca13e":"EquinoxCoin()","d91d81c6":"preIcoEndAt()","d91dc952":"timeLock(address,uint256)","d91e1c63":"totalGambles()","d91e24c2":"TIMEToken(address,uint256)","d91f3f33":"BookERC20EthV1Dec()","d91f68a2":"currentMessageNumber()","d92126fc":"NewFees(uint256,uint256,uint256)","d9214848":"CONFIGURE(bytes32,bytes32)","d921eb78":"isRefund()","d922aa30":"core(uint256,address,uint256)","d922b6ab":"stage_1_tokens_scaled()","d922cd12":"InsightChainToken()","d922d5c8":"TimeLockedController(address)","d922f603":"Purpose()","d923a0be":"setLoyaltyWallet(address)","d923c99e":"getRecordByRow(uint256)","d9244bf9":"maximumHodlDuration()","d9246bec":"activateICO(uint256)","d9249e7e":"PuppiesCore()","d924c660":"shift_right(uint32,uint32)","d9269cb4":"at_permille(uint256)","d92782ac":"sumICOStage5()","d927b5ad":"addDistributionPeriod()","d928a3d8":"_getSchellingRoundSupply()","d928e32e":"ERC20Basic(string,string,uint8,uint256)","d9296e45":"totalWeiFunded()","d92c4f7c":"AirContactToken(uint256,string,uint8,string)","d92ca5b4":"tokensTeam()","d92d5bb3":"ADSToken()","d92d7056":"option20name()","d92da722":"processBuyRequestFiat(string,uint256,address,uint256,uint256)","d92da8f8":"bountySupplyRemaining()","d92dc325":"MintAndTransferToken(address,uint256,bytes32)","d92ebe46":"createDAO(address,uint256,uint256,uint256,string,string,uint8)","d92ec71b":"addDeal(uint256,string,string,uint256,bytes32,string)","d92ed48d":"rebalanceBuckets()","d92fb5e9":"newClaimer()","d9300e30":"checkIfAllALCDistributed()","d9305ba7":"LOG_OwnerDeposit(uint256)","d930a90b":"testFailMoveBalanceDueToInsufficientFunds()","d93112e3":"totalEarlyStage()","d9326337":"PiaoPiaoToken()","d932b248":"AssetISR()","d932ed92":"MarriageCertificates()","d933b5f2":"SLABSToken()","d933c1fb":"XYOracleBonus()","d933dac7":"view26()","d9359419":"payoutERC20(string)","d935bac3":"test1Vote()","d935c8b4":"totalEthSales()","d935e0a7":"BBCC(uint256,string,uint8,string)","d936547e":"whitelisted(address)","d9368ba2":"getUserOptState(address,address)","d93761fb":"transferSKM()","d937ed44":"grantVestedEDEXContract()","d9386789":"coreTeamMemberTwo()","d9386c9f":"cofounderVUPDestination()","d939727d":"setMaxTokenNumbers()","d939c960":"fundRecipient()","d93a0a8e":"newClassPlayer(uint256,uint256,uint32,uint32,uint32,uint32,uint32,uint32,uint32)","d93a64a2":"updateDebris(bytes32,uint8,bytes32,address)","d93b4451":"Authorise(bytes16,address,address)","d93d6ad0":"isKeyHolder(address)","d93da7f0":"ROUND_5_PRESALE_BONUS()","d93dbeff":"calculateLevel(bytes8,bytes5)","d93debd5":"registerDappAddress(address)","d93e5aeb":"count_next_address(address,uint256)","d93e7573":"disown(bytes32)","d93eeb5c":"safeTransferManyFrom(address,address,uint256[],bytes)","d93ef85f":"Photos()","d93fabfa":"addSeller(address)","d94073d4":"PT()","d94085cc":"FindMyFish_EnterBarcode(bytes32)","d9409bc5":"WFCC()","d940c3ee":"processPayroll(address,uint256)","d94123b8":"channel_api()","d94178c2":"getvalue(string)","d9417b6a":"balanceWosPoolToWosSystem()","d9417d69":"wikiRemoveTokenFrom(address,uint256)","d941c4ad":"prepare(bytes32)","d94288de":"totalFeatures()","d94389bd":"__char(bytes1)","d94395e2":"lastCitizenPaid()","d943c8b6":"oldHolders(address)","d9441f14":"playerMsgs(uint256)","d944534a":"generate(uint256,address,string)","d944c749":"ADVISOR_FOUR()","d945799f":"removeLockFund(address)","d94585bd":"proveAndClaim(bytes,bytes,bytes)","d9468475":"findRecentInterest(address)","d946af8f":"addNodeAddress(uint256,address)","d9474ad7":"unlockedProvider(address)","d9479692":"contract_name()","d947c8d1":"transferSketch(address,uint256)","d947e234":"offerGuardianVend(uint256,uint256)","d948d468":"forward(bytes)","d94929fe":"setTokenSaleRounds(uint256[5],uint256[5],uint256[5],uint256[5],uint256[5],uint256[5])","d94a0a7d":"findNextwaitPairBetIDs(uint256,uint256)","d94a75bc":"MELON_CONTRACT()","d94acc0a":"distributeVSN(address[],uint256)","d94b9843":"toContractAddr()","d94c7c29":"updateTokPerLockRate(uint256)","d94ca0f9":"approvePrimordialTokenAndCall(address,uint256,bytes)","d94d0316":"timeIncrease()","d94d0787":"EthlyteToken()","d94fd026":"applyPixelChange(uint256,uint256,uint256,uint256,uint256[])","d94fe832":"idOf(address)","d95030cb":"ticketTransfers(uint256,uint256)","d9506c5f":"startSettle(bytes,uint8[2],bytes32[2],bytes32[2])","d950aec6":"splitWinnings(uint256)","d950c432":"multiFreezeWithTimestamp(address[],uint256[])","d950cc3c":"getUserCap()","d9510215":"withdraws()","d9515238":"forward_funds(uint256)","d951d39a":"tokensIssuedForBonusRangeThree()","d951e357":"bonusFourthWeek()","d9520c9a":"allTokenOwnerOnStart()","d9527fa7":"buyShares()","d95374ce":"pendingJackpotForHouse()","d95402e7":"Redeem()","d95405f2":"lockTokenDays(address,uint256,uint256)","d95425e6":"TXwithCode(bytes32)","d95431cd":"lookupFeaturedSprites(uint256)","d9548e53":"isExpired(uint256)","d954a949":"setDeal(address,bool,uint256,uint256,uint256)","d954af09":"revealBid(bytes32,uint256,address,address,address,uint256,uint256)","d954bd4a":"ICO_TIER_LAST()","d954cbcb":"amountInvested()","d95514a8":"Regulator()","d955ec17":"setMiniumInputEther(uint256)","d95660be":"timeNow()","d956634f":"claimTokensAndRefund()","d9573c1a":"taxEth(uint256,address)","d9575ec5":"registerNameXID(string,uint256,bool,uint8)","d95808f0":"lastBlock_f3()","d9583497":"acceptFulfillment(uint256,uint256)","d9592676":"packKey(uint8,uint128)","d9597016":"multisetCustomGasPrice(uint256[],address[])","d95983c3":"Destroy(address,address,uint256)","d959868a":"total_no_of_CTD()","d959cbd2":"fMul(uint256,uint256)","d959e244":"left25(uint256)","d95a0aa5":"setDirectMintLimit(uint256)","d95a2d42":"lendGovernmentMoney(address)","d95a820f":"LogStartPreICO()","d95ab72d":"getMemberWallet(address)","d95ace6f":"checkSigned(bytes32,uint8,bytes32,bytes32)","d95b6371":"isOperatorFor(address,address)","d95c6092":"StartreasureToken(uint256,string,uint8,string)","d95efb98":"genesisAddress(address)","d95ffc08":"myEthBalance()","d9606ca1":"WINE(uint256,string,string)","d96073cf":"swap(uint256,uint256)","d960924d":"dtAddEthBalance(address,uint256)","d960ede1":"sectionPrice(uint256)","d96152c3":"executeRuling(uint256,uint256)","d961de44":"domainConnector(bytes32)","d9629e06":"casinoGames(uint256)","d962a68b":"buyTokensByUSD(address,uint256)","d962c51e":"redeemByTranche(bytes32,uint256,bytes)","d962dd99":"setCompte_43(string)","d9637826":"safe_sub(uint256,uint256)","d964f28a":"TokenAiNetworkToken(address,address)","d9652cb1":"startTimestampOfBonusPeriod()","d965ea00":"getMemberLength()","d9663f6a":"START_PREICO_TIMESTAMP()","d966cfc3":"totalAllocatedToAdvisors()","d967f752":"rentMachine(address,uint256,uint256,uint256)","d968595f":"isValidProposal(uint256)","d968dab1":"chipBalanceOf(address,address)","d9696054":"readInfoList(address,uint256,uint256)","d969b919":"Etherplanet()","d969ead4":"countpro(uint256)","d96a094a":"buy(uint256)","d96a22b8":"windowBonusStep1()","d96a8687":"XMPToken()","d96aee49":"MultipleConstructorTest()","d96bcd8f":"randomTargetAssign()","d96bfbb3":"resetUser(uint256,address)","d96c0991":"quitFromAirdrops()","d96c26c9":"submitTransaction(address,uint256,bytes,bytes,bytes)","d96c30a4":"checkTime(address,uint256)","d96c550a":"_preValidatePurchase(address,uint256,uint8)","d96cb018":"icoCap()","d96cc905":"toB32(uint256,uint256,bytes,address)","d96d7ea2":"PRE_EXECUTION_GAS()","d96db2ec":"OfferToRealm(uint256,uint256)","d96de4ce":"AdminDrawError()","d96e1f76":"icoStatus()","d96e5565":"testThrowsRetractNotRetractable()","d96ed505":"minGasPrice()","d97036c2":"ARM1Token()","d9703dac":"getResoMethod()","d97049bb":"regs(uint256)","d97095f3":"AST()","d970c19b":"raiseCoinsSeeded(address,uint32,uint256,uint256)","d9710278":"TwoFucksToken()","d9719e56":"CROWDSALE_SHARE()","d971da94":"priceUSDcETH()","d972bc59":"setICO_Contract(address)","d972e8ad":"getTranche(uint256)","d972ea3e":"dragon()","d9740383":"SAWJewelleryChain()","d9741bd9":"PinMoToken()","d975767b":"eLitecoin()","d975f3b7":"withdr(uint256)","d977076e":"getExtraBets()","d9779fbe":"currentTokenSupply()","d977a59c":"getCurrentRateByStage()","d9784223":"getEscrowAndHash(bytes16,address,address,uint256,uint16)","d9785451":"timerMax()","d978a0d3":"setFinancialOfficer(address)","d9795f66":"usersNTD()","d9797076":"CoinBroSupply()","d979e906":"getXNKPurchased()","d979f5aa":"setHolder(address)","d97a9c39":"resetContent(string,address,string,string,string,uint256,uint256)","d97b0a6e":"Workcoin()","d97b14f0":"sendAdvisory(address,uint256)","d97c5be5":"losePooling()","d97cec3f":"transferMultiSameValue(address[],uint256)","d97cf075":"onlyBouncerExecuteCall(address,uint256,uint256,bytes)","d97d4f52":"FOUNDERS_LOCK_DATES(uint256)","d97dec19":"transferAll(address,address,uint256,address,uint256,uint256,address)","d97e38d6":"getApprovedBuyerForIndex(address,uint256)","d97fc929":"CommitSolutionHash(bytes32)","d9803cb2":"addOfficer(address)","d9823996":"withdraw(uint152,address,uint256)","d982466d":"getPlayerAwardByRndNo(uint256,address)","d98299a0":"RedBlue()","d9829cbc":"getRewardAndPrepareWithdraw()","d982a84e":"citadelAddress()","d9844e25":"hexAddress(bytes32)","d9852ca9":"nbDispute()","d985f122":"RelayToolsTest()","d9875c93":"stageNow()","d988a0f9":"Payoutnextrefund()","d989f5f2":"productOwners(address,uint256)","d98a977d":"TestWorldSnapshotInternal(uint256)","d98ae811":"transferDay(uint16,address)","d98b094c":"communityPeriodsNumber()","d98b2fbf":"getOverviewsCounter(uint256)","d98b43f7":"removeOracleAddress()","d98b9bb5":"placeBid(address,uint256)","d98bce37":"batchBurnAssets(uint256[])","d98bf529":"LimitTop()","d98c08b5":"CryptaurDepositoryTest()","d98c1524":"getPortfolio(bytes32,address)","d98d011d":"getCandidateKey(bytes,bytes,bytes,bytes)","d98de8a5":"isCrydrViewRegistered(string)","d98e14bd":"STAT_COUNT()","d98e2997":"addMiningToken(address,uint256)","d98f47fe":"recieveEscrowTransfer(address,uint256)","d98f4ea2":"sumICOStage7USD()","d98f6088":"blockDelay()","d9901ce4":"DappToken(uint256)","d991c58f":"mintMaster()","d9923a16":"Account_timePayout(address)","d992aa70":"createBounty(string,uint256[])","d992bd5b":"testResultNotZero()","d9934a8c":"holdAddress4()","d993693c":"LOTTYcoin()","d9946793":"shareHolderBalanceOfAtTime(address,uint256)","d9946a79":"PERSONAL_CAP()","d9948af7":"sumICOStage1USD()","d9964d92":"getResourceName(uint16)","d9969061":"prove(bytes32,uint256)","d9971e92":"reject(uint64,string)","d99727cc":"removeBonus(uint8)","d9972b96":"isAuthorized(address,bytes4)","d997598b":"HoChiMinh()","d997933f":"canBreedWith(uint40,uint40)","d997a153":"transferBatchIdempotent(address[],uint256[],bool)","d997ccb3":"payMe()","d9987c07":"ReturnToOwner(address,uint256)","d998d0d5":"chunkNr()","d99929db":"getAssetIdTypeSequenceId(uint256)","d99969df":"DUNE_BUGGY()","d999741e":"grantFoundationToken()","d999b17e":"CROWDSALE_PHASE_3_START()","d999f132":"optionDescription(uint256)","d99a8dc3":"submit(string)","d99a9d20":"_setTransferFeeProp(uint256)","d99bb9f7":"removeOwnership()","d99c6c76":"_invest(address)","d99d83e3":"txsPerHour(uint256)","d99dbdbe":"changeBookState(uint256,uint256)","d99dd314":"companyTimeLock()","d99f8bd8":"VarnixToken()","d99fe20d":"dexTestApprove(address,address,uint256)","d9a0b299":"deactivateClaim()","d9a18f6d":"totalTokensForSaleDuringICO1()","d9a19a7a":"MMOTOKEN()","d9a2a083":"TeamWalletUpdated(address,address)","d9a2fff5":"airDropPercent()","d9a3988d":"LogPollApproved(bytes32)","d9a3c199":"testSaleToken()","d9a457fe":"endRound(address)","d9a4ad8b":"shouldHadBalance(address)","d9a4cc33":"_finalizeSale(bool)","d9a50120":"SaniCoin()","d9a52ab3":"getForkMigrationPercentageBonusDivisor()","d9a569f5":"OfferPlay(address,uint8,uint8)","d9a57382":"propertyIdToEscrow(uint256)","d9a5b0a7":"testHighestTranchNotExact()","d9a6c6db":"FactbarDeed()","d9a6cf81":"transferableUntil()","d9a6e2de":"VST(string,string,uint8,uint256)","d9a7556f":"indexThreads()","d9a8748c":"fundAccount()","d9a8e212":"GOLDQ()","d9a96c92":"LegalToken()","d9a96f9b":"saleManagerAddress()","d9aa1881":"tokenDestroyed()","d9aa5543":"newDoc(bytes32,uint256,string)","d9ab1ec9":"smallCount()","d9aba9ce":"getProduct(address)","d9abedb4":"take_fees_eth_dev()","d9ac03a6":"getCurrentCertificateNonce(address,address)","d9ac9a88":"getAuctionTotal()","d9aea707":"modifyCeo(address)","d9af3691":"verifyCertificate(address,uint256)","d9afa38b":"payDividends(address,uint256)","d9b02ddf":"setGeneral(uint32,uint8,uint8,uint16,uint16,uint16,uint16,uint32[4],uint32[4],uint8)","d9b058bd":"setOraclizeGasprice(uint256)","d9b158b1":"angelInvestorsWallet()","d9b238ea":"test_insert_findWithHintNotTightBound(int256)","d9b25a24":"proxyBuyTokens(address)","d9b36043":"TJFucks()","d9b4abf5":"marketplace_controller_v2()","d9b5134c":"getTotalExchanged(address)","d9b5618c":"TimeBroker()","d9b596c7":"generateRand()","d9b5b5ca":"exponential(uint256,uint256)","d9b5c4a5":"nodeRegistry()","d9b627dd":"CancelledByBuyer(bytes32)","d9b6aec4":"allInvestments()","d9b6b197":"tempAdvisorsTeam()","d9b7d154":"applyForTask(uint256)","d9b7d41b":"createFootballer()","d9ba32fc":"getWhitelistStatus(address)","d9ba8ea4":"finishLastRound()","d9bb57c6":"removeGameManually(address,address)","d9bb6102":"HealthCashMock()","d9bc9873":"getCanvasPaintedPixelsCount(uint32)","d9bcc65b":"setSeedContract(address)","d9bccfd6":"getWarrantyPrice(address,uint256,uint256,uint256)","d9bd0799":"clearPeriods()","d9bd2468":"getToken(uint256,address)","d9bdc10c":"getPlayerHasGetFree(address,address)","d9bdd6fa":"createCDPLeveragedAllDai()","d9be976c":"GainmersTOKEN(uint256,uint256,address)","d9bf3187":"setOutcome(int256,uint8,bytes32,bytes32)","d9bf8238":"setWinery(address,bool)","d9bfa73e":"orderEpoch(address,address)","d9c01911":"mintIdentityToken()","d9c090a0":"updateRoleName(address,bytes32)","d9c1a344":"balanceTotalOf(address)","d9c1ac25":"transferAllERC20Token(address,uint256)","d9c24acb":"_unlockedAmount(uint256)","d9c263f8":"purchaseWithEth(uint256,uint256,uint256,address,bytes)","d9c27cc6":"setPep(address)","d9c3193d":"setSpaceshipPrice(uint16,uint256)","d9c397f6":"gmtFund()","d9c39fca":"setSilverContractAddress(address)","d9c3d3c9":"checkReturn()","d9c4870e":"beneficiaryAddress()","d9c522ec":"daiRate()","d9c52d27":"getDiscountTrancheEnd(uint8)","d9c55ce1":"fill()","d9c57bcc":"importExchangeSale(uint256,address,uint256)","d9c67404":"getMerkleRoot(bytes)","d9c682a7":"borrowerReturnFiatPerEthRate()","d9c6925e":"AccountIsNotFrozenForReturn(address)","d9c693cb":"emergencyLock()","d9c7041b":"ownbalance()","d9c76d61":"coolHero()","d9c779ce":"_buyP3D(uint256)","d9c7ddfa":"_updateBurnRate()","d9c850f4":"getItemKindCount()","d9c88e14":"ownerWithdraw(address,uint256)","d9c97699":"__callback(bytes32,string,uint256)","d9ca0b7f":"transferRoutingCode(bytes32,address)","d9caa3d2":"submit(bytes32)","d9caaada":"minPreContribution()","d9caed12":"withdraw(address,address,uint256)","d9cba1a1":"MulTraToken()","d9ccf695":"strayToken()","d9cd6046":"BuyTicketSeed()","d9cd98b0":"withdrawDevFees(address)","d9ce2451":"setLeaf2(uint256,uint256)","d9cea519":"getDealInfo(uint32,uint64,uint64,uint64)","d9cfc182":"getHighestPriceAt(uint256)","d9cff93a":"last_result(address,address)","d9d0b091":"AddMarking(bytes32,bytes32,int256,uint256)","d9d14d37":"numOfMiningTimes()","d9d1ceaa":"draw(uint256,bytes32[])","d9d1d4bb":"getCompte_28()","d9d1e0e5":"createBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32)","d9d1f5d9":"removePendingExplore(uint256,uint256)","d9d210b8":"changeHelper(address,bool)","d9d2d058":"Splitter()","d9d34ce1":"isForkingMarketFinalized()","d9d3cc78":"seriesByName()","d9d578e5":"airDropSetup(address,uint32,uint256)","d9d60b52":"getGameState(address)","d9d61655":"getOwnedTokens(address)","d9d61a10":"GetUserSafesLength(address)","d9d73887":"Diana()","d9d770bb":"_triggerPVEStart(uint256)","d9d84531":"getRemainingKingdoms()","d9d8b2ee":"creationInvestmenting()","d9d958ec":"setUint8(uint8,uint8)","d9da0142":"cancelEscrow(bytes20)","d9da2738":"changeOfficialAddressIfNecessary(address)","d9da486a":"initialEcologyAccount(uint8)","d9da76de":"DailyMint()","d9daa497":"getStageTargetAmount(uint256)","d9daae78":"CCH_Seaport_1()","d9dac92c":"acceptDiscipleVend(uint256)","d9dad80d":"ownerOf(uint256,uint256)","d9db1f55":"deprecate(string,string,string)","d9db9d89":"globalSupplyAfterPercentageLogic()","d9dbd382":"FUTX()","d9dc7fcd":"EVM()","d9ddafb3":"exchangeTransfer(address,uint256)","d9de1e98":"HuuumanStandardToken(uint256,string,uint8,string)","d9def89a":"buyShitClones()","d9df2878":"CryptoCollectorContract()","d9e0dc59":"getLocation(address)","d9e19a91":"setAccountValue(uint16,uint8,uint8,int64)","d9e34038":"ODCToken()","d9e39e50":"getTransferDetails(address)","d9e4fa6a":"setUsdPerKEther(uint256)","d9e50186":"setWeiMin(uint256)","d9e55f7a":"getAllowedToMine(address)","d9e5a50b":"getSnakemasterReq()","d9e68b44":"left100(uint256)","d9e73095":"MiracleToken()","d9e79c72":"admin_dividend(uint256)","d9e7c8ca":"createRace(uint256,uint256,uint256)","d9e7ee1c":"new_game(uint256,uint256)","d9e8843f":"payRent(uint256)","d9e947f3":"kickOutMember(address)","d9e95a98":"addVoter(address,string)","d9ea1b47":"Raffle_Finished()","d9ea372b":"myfichain()","d9ea9bfa":"createBtcAddressHex(uint256,int256,uint256,int256)","d9eac337":"MegaWattContract()","d9ead22b":"accountForClose(uint256)","d9eb547b":"extractCLNfromMarketMaker(address,uint256)","d9eb5947":"flatFee()","d9ec0508":"testThrowTransferNotEnabled()","d9ec3018":"submitSpendLimit(uint256)","d9ece4c7":"changeMaximumContributionForPrivatePhase(uint256)","d9ee369a":"withdrawDifferentToken(address,bool)","d9ef1ee3":"insert(string,uint256)","d9ef58a5":"thisAddr()","d9f00023":"SBGToken()","d9f01878":"centralMinter()","d9f02210":"StarbaseMarketingCampaign()","d9f0354d":"buildMilestone(uint256,uint256,uint256)","d9f035aa":"cardList(uint256)","d9f0cf04":"createAuctionWhenPaused(address,address,uint256,uint256,uint256,uint256)","d9f165dc":"updateFactory(address)","d9f1a1a9":"PublicBallot(address,string,string)","d9f2ac8a":"decr()","d9f300ce":"referedRateBonus()","d9f38388":"RequirementChanged(uint256,bytes32)","d9f3afff":"addCurrency(string,uint8)","d9f47e41":"totalDevelopmentFundBalance()","d9f4ecbb":"lastProfit()","d9f4f56e":"_ethRefund()","d9f58923":"GlobalConstraintRegistrar()","d9f69e4e":"addUserWhoBuy(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","d9f754a3":"LogSetWithdrawLimit(address,uint256)","d9f7e285":"returnExcedent(uint256,address)","d9f7eacf":"removeGains(address,uint256)","d9f80c65":"setMinInvesment(uint256)","d9f81b83":"timeWithoutUpdate()","d9f861b1":"getFreelancerInvoices(address,uint8)","d9f884bf":"BIONICCOIN()","d9f8a3c3":"lastTransactionReceivedInWei()","d9f8a4e2":"calcCurrentTokenPrice()","d9fa1e78":"PractiParlezCrowdSale()","d9fa8c54":"unClaimedToken(address)","d9fa9335":"houseKeeping()","d9facbe0":"isObserver(address)","d9facc80":"MerchantWallet(address,string,address)","d9fb6963":"stateSetLocked()","d9fb7413":"lockTimeLeft()","d9fc4b61":"safeTransferFrom(address,address,address,uint256)","d9fc8026":"getPubKeyArr(bytes32,uint256,uint256[])","d9fca769":"setWinner(address)","d9fcb31f":"comm_channel()","d9fdd155":"isLegendaryPart(uint256,uint256)","d9fe0137":"_transfer_byProxy(address,address,uint256,bytes)","d9fe1045":"MidasDiscountToken()","d9fe60f3":"DTHPool(address,address,uint256,string,string,string)","d9feb8ce":"loserTwo()","d9feeeb6":"fillMyOrder(uint256)","d9fefb93":"getData_34()","d9fefbf8":"addData(uint256,uint256,bytes32)","d9fefd6c":"bountyTokenTimelock()","d9ff4ad8":"burnFrom(address,uint256,bytes)","d9ff8e9d":"setWalletOut2(address)","d9ff8ffc":"BetAnB()","d9ff94b7":"setRegionPurchasedAt(uint256,uint256)","da00586b":"houseKeep()","da00a1f4":"setGetFree(bool)","da0225db":"belongsTo(address,uint256)","da0239a6":"remainingSupply()","da025051":"freelancePlayer(address)","da02b6cf":"computeWinner(address,uint256,uint256,address,uint256,uint256,uint256)","da02f5f3":"updateIsVerified(address,bool)","da0321cd":"addresses()","da037fd1":"confirmPerfectReception()","da040c0f":"purchasingAllowed()","da04197e":"Duration(uint256)","da04f82b":"addUserManager(address)","da05277e":"ImpactRegistry(address)","da05f535":"RefundCrowdsaleFactory(address)","da062d68":"ExCToken11()","da06d96c":"_tokensToEthereum(uint256)","da074874":"getRemainingEthAvailable()","da0774ad":"getCallFeeScalar(uint256,uint256)","da081204":"littAdmins()","da08c5a3":"setTransferWhitelist(address)","da09118e":"addTokenGrant(address,uint256,uint128,uint16,uint16)","da09c72c":"devAddr()","da0a599e":"EjariRules()","da0a5fe0":"TestToken(string,string,uint256)","da0b0682":"beginGame()","da0b0c36":"getNumDesignatedReportNoShows()","da0bba7b":"changeOraclizeConfig(bytes32)","da0bba90":"sendPrize(address[],uint256[],uint64)","da0d76f8":"betContractDOWN()","da0e1451":"distributionForRefers(uint256,uint256,uint256)","da0ef68b":"ICO_END_DATE()","da0f039d":"MaxTotalSupply()","da0f3877":"postFreezeDevCATDestination()","da0f57d0":"confirmWithdraw(uint256)","da0fab61":"BlockContract()","da1070da":"newEscrow(address,address,bytes32)","da11f709":"bank1()","da122e02":"Fishbank(address,address,address)","da128527":"finalizeUpdateState()","da12e9ef":"TokenHolder(address,uint256)","da13610c":"rewarding(address)","da1441cd":"KudosBank(uint256)","da147d32":"tradeTracker()","da14c723":"setCustomBuyer(address,uint256)","da14e3b2":"transferAndFreezeTokens(address,uint256)","da16241b":"Platopay()","da17835f":"FermionToken()","da178cb0":"plot()","da17c21b":"BlockchainMoneyEngine(uint256,string,string)","da18bcef":"getMin(uint256[])","da1919b3":"mintFor(address,uint256)","da1a13ce":"fitsTokensForSaleCap(uint256)","da1aaa59":"_withdraw(address)","da1b2d9d":"comDrop(uint256,uint256,uint256,uint256)","da1b4359":"uploadFinish()","da1b620b":"getTarget(string)","da1b95a6":"DAO(address,address,bytes32,bytes32,address,address,address)","da1bd8ab":"setupTrustedAccounts()","da1d7711":"createHive()","da1eb542":"ceil1(int256,int256)","da1edb38":"shareLastTen(uint256,uint256)","da1ee417":"MoveChain(uint256,string,uint8,string)","da1f149c":"SECURRO()","da1f6433":"AtomUX()","da1fe7d5":"configureDomain(string,uint256,uint256)","da1ff555":"cliffTeamTokensRelease()","da2216ef":"getContractCreatedTimeById(bytes32)","da2242b8":"createActivity(uint256,string,uint256,uint256)","da228f9c":"bountyTokensCreated()","da22ec07":"storing()","da233128":"getCrowdsaleContract()","da23c057":"editAd(uint256,string,string,string,string,bool,bytes32,bytes2,uint8,bytes4)","da23d18b":"updateOnSaleSupply(uint256)","da2424ae":"setPI_edit_22(string)","da24b08c":"UsdPerKEtherUpdated(uint256,uint256)","da257cb4":"setMinRevenue(uint256)","da25c0cd":"ThisExternalAssembly()","da25de3c":"remainingBalance()","da262f58":"setTokenInfo(string,string)","da26358a":"unregisterVendor()","da26663a":"getPrice(uint32)","da26c241":"approvePauseChange(bool)","da26d0b9":"addAuction(uint256,address,uint128,uint128,uint64,uint64)","da26ebc2":"getPayeeCount()","da26f7f6":"CIFR()","da274488":"getMotd()","da27ab1f":"getFreeShitClone()","da27cb0f":"Lottery(string,uint256,uint256)","da280fe5":"resetHasAutoVote()","da284dcc":"expirationTime()","da28c81a":"updateKYClist(address[])","da293136":"TestCrowdsaleController(uint256,address,uint256)","da2a97d8":"GetCurrentNumbers()","da2aa615":"addRandomFight2Death(address,uint256)","da2b2589":"GenExtWeightList(uint8)","da2b7416":"testBitsAndFailIndexOOB()","da2bbfc7":"setTokenURIBase(string)","da2c0460":"gameGiftOnceAmount()","da2d7b70":"userSubscriptionsLength(address)","da2d8720":"payJackpot2()","da2d8c88":"updateRestrictedStockSendTime(address,uint256)","da2dcea6":"returnTokenMulti(address[])","da302fc3":"lighthouseLib()","da306946":"ShareDATA(string)","da30d418":"cancelDist()","da311588":"getCoin(uint256)","da31cf2a":"getStageEtherRaised()","da323c94":"getSketch(uint256)","da328377":"ownerSetStakeCommence(uint256)","da333ca6":"payOut(uint256)","da337465":"getPenguinsByOwner(address)","da34b7f3":"_transfer(uint256)","da35762a":"getPI_edit_16()","da359dc8":"setBytes(bytes)","da35d581":"DaoHubAccount()","da3678df":"transferTokenByContract(uint256,address)","da36d217":"lockupTok(address,uint256)","da36fd03":"FundingAccepted(address,uint256,uint256)","da374157":"changePopulous(address)","da38abb3":"randomGen(address)","da38daba":"getLeftCoordinate(bytes1)","da38f805":"TaskToken()","da38fe31":"ConsentDirectory()","da392f06":"availableNow()","da397985":"CBOToken()","da3986e4":"getTAOIds(uint256,uint256)","da3b6b35":"totalHashRate()","da3c300d":"currentFee()","da3cbf96":"getShipClass(uint32)","da3cd674":"GetDChainDOTHash(bytes32,uint8)","da3d18e8":"PlusUltra()","da3d23a9":"GetEnd()","da3d7d7f":"reconfigure(uint256,uint256)","da3e0fd1":"getAuctionsById(uint32[])","da3e3397":"approveToken(address,address,uint256)","da3f8c38":"Amethycoin()","da3fb6f7":"mainSaleRateP2()","da4077b9":"finishHim()","da421df5":"pageFiles(uint256,uint256)","da42eea5":"setRedeemWallet(address)","da440a1d":"wallcoinToken()","da446958":"totalTokensCap()","da4493f6":"activationTime()","da44d275":"viewWinners()","da44e034":"maximumTokensForForth()","da46098c":"setAllowance(address,address,uint256)","da465d3f":"saleSharesAvail()","da46a73c":"setGameOperator(address)","da46e48e":"setGLA(uint32)","da46e6c4":"transferFeeIncurred(uint256)","da46eda1":"setBlockDotDifficulty(uint256)","da46fe62":"ethereumToTokens(uint256,uint256)","da4751c0":"setMinPrivateSaleCompanyBuy(uint256)","da4778c2":"delayHours()","da4793ac":"setMaxSecurityGuardDelay(uint256)","da47d856":"getService(bytes32)","da481ce0":"DemeterCrowdsale(uint256,uint256,uint256,address,uint256,uint256,uint256,uint256,uint256,uint256)","da489997":"addAsset(address,address)","da49613c":"ownedfunction()","da498084":"addTokenHolder(address)","da499f6f":"SupportAddOn(uint256,address,uint256)","da49cdb5":"getLostTokens(address)","da4a22dc":"MXN_Omnidollar()","da4a76c0":"becomeGameSponsor()","da4a77aa":"isRatifier(address)","da4a8ef6":"SettingsSet(address,uint256,uint256)","da4b5e29":"contains()","da4d0756":"vehicleExist(address,string)","da4d2615":"Gomblot()","da4f2899":"isUserInGroup(bytes32,address)","da5136b8":"setWhitelistAddress(address,address)","da5140fc":"lockTokensForAddress(address,uint256,uint256)","da5196e0":"getmemreqdetails(uint256,uint256)","da51bbd9":"luckyPendingIndex()","da51f168":"GetDayReward()","da5269a6":"getListOfConsents()","da5341a8":"issueMaxNomins()","da53462c":"initialize(address,address,uint256,uint256,uint256,uint256,address,address,uint256)","da535758":"lockUp(address,uint256,uint256,uint256)","da547dcf":"preIcoHardcap()","da548e29":"priceExpirationBlockNumber()","da5520cd":"HeroNodeToken()","da57736f":"stageThree()","da5950a4":"tokenBought(uint256,uint256)","da5a9366":"getAppBase(bytes32)","da5abf5d":"payment_returned(uint256)","da5b1f5c":"buy50()","da5c0a7c":"testDisown()","da5c7ec2":"WNCT()","da5da3b9":"initializeTokenSaleWithToken(uint256,uint256,uint256,uint256,address,address)","da5db748":"firstRelease()","da5e4489":"resetListing(string)","da5e9c62":"whitelistDayMaxStake(uint8)","da5ea40c":"computeMerkle(bytes32,uint256,bytes32[])","da5f3ac1":"GAME_END()","da5f838d":"weisRaised()","da60278a":"receivable(address)","da60d7e8":"BOARD_2()","da62a246":"rewardsTokenSupply()","da640668":"checkNameOccupied(bytes32)","da6443ad":"addAddressToWhitelist(address,address)","da649c63":"startSalePhase(uint256,uint256)","da652b4a":"summBilborough()","da6585ff":"calcSrcQty(uint256,uint256,uint256,uint256)","da658f22":"birthPerHundred()","da66cb3e":"secondRoundICOTokensLimit()","da67ac42":"MIPCoinToken()","da682aeb":"onApprove(address,address,uint256)","da6838ff":"getIfBonus()","da683c63":"Token(string,bytes32)","da68d47d":"licenseNFT()","da69f1c8":"arrayTest(address[])","da6aabbe":"set_sale_address(address,string)","da6b31b9":"testErrorTransferToNullAuthority()","da6babca":"setNextPrice(uint256,uint256)","da6c5832":"CROSAIR_MAX_PRICE()","da6d8ca4":"LotteryRecharge()","da6dfea7":"setRate(address[],address[],uint256[],uint256[],bool)","da6e11a5":"approveFactoryContract(address,bool)","da6efb01":"winAddressOf()","da6f76b5":"updateEpisode(string,uint256)","da70db17":"HireGoToken()","da710422":"getTokenAmountForWei(uint256)","da7150b9":"Qwidex(address,address,address,uint256,uint256,uint256)","da721672":"checkFloatingSupply(address,uint256,bool,uint256)","da72c1e8":"adminTransfer(address,address,uint256)","da7360df":"paymentInternal(bytes32,uint256[],uint256)","da73630e":"addTeam(address,string)","da73f0f9":"conversion_rate()","da748b10":"pausedUntil()","da74c5a1":"citiesSold()","da74ce27":"tokenCapForFourthMainStage()","da7545d0":"titleCount()","da756ba7":"BEAT()","da75b901":"deployStepTwo()","da76d5cd":"withdrawBalance(uint256)","da7855a3":"reclaimLocalNodeFee()","da78d655":"owner1OK()","da7911e1":"getOrderListLengthFactor()","da79a9fc":"setTxAsSpent(bytes32,bytes32,uint256)","da7bd3e9":"getVestingScheduleEntry(address,uint256)","da7c0ad4":"SaleScheduled(uint256,uint256)","da7c6a42":"registrations(bytes32)","da7ccce9":"test_oneValidEqInt1()","da7d0082":"isCertification(address,bytes32)","da7d249f":"UnsetBlockForSale(uint256,uint256,address)","da7d57f9":"startRareRaffle(uint256,uint256)","da7d7827":"getSubscriptions(address,string)","da7d86fd":"softDelete(bytes32)","da7e019e":"AlterContactName(address,bytes32)","da7e6fdf":"TokenDrop(address[],uint256[])","da7eadd4":"totalAffiliateDDT()","da7fc24f":"setBackend(address)","da7fc7c5":"payoutCompleted()","da7fd1f0":"gemmyMusicSupply()","da7ffbd4":"generateRandomSpell(uint8[14],uint32)","da801f20":"approveAndCall(address,uint256,address,address,bytes32,uint256,uint256,uint256)","da81b09b":"lastPeriodStarDate()","da8267e3":"hasDirectorAccess(address)","da82a035":"sweepCommission()","da8300d2":"initialEnemyCombination()","da832237":"SMALLEST_TOKEN()","da834ac4":"getPayoutNumerator(uint256)","da83a649":"onlyAdmin(bool)","da850601":"MKYCToken()","da8567cb":"AldiyoCoin()","da857f2c":"reduceLastWeekStake(address,uint256)","da85868e":"fifthExchangeRate()","da883e6a":"addItems(uint256[],uint256[],address)","da88a831":"updateBaseTokensPerEther(uint256)","da89970b":"hasntStarted()","da8a01a5":"CROWD_WEEK2_BONUS()","da8a46e0":"listUserRecastsFrom(address,bytes32,uint256,bool)","da8ad6b6":"getTAO(address)","da8c229e":"controllers(address)","da8d2f35":"ChannelDeleted(address,address)","da8e2890":"payNihilum()","da8e44d8":"registerColor(string,uint256)","da8ee786":"transferFromContract(uint256)","da8f410a":"ApprovedToken()","da8f54d8":"testVali(address,uint256)","da8f9fe5":"DetailedERC20(uint256,string,string,uint8)","da8fb7cd":"ASSToken(uint256,string,uint8,string)","da8fbf2a":"pauseMinting()","da909b09":"setExchanger(address)","da91254c":"whoAmI()","da918f76":"placeBlock(uint16,uint16)","da9287d1":"acceptHybridization(uint256,uint256)","da9332bb":"addCompanyURL(string,string)","da93d0d1":"setPrice()","da93dfcf":"give(address,bytes32,address)","da93f938":"maxAppeals()","da942ab3":"issueTokensExternal(address,uint256)","da94e770":"YBVToken()","da9534b4":"Stex()","da9590cb":"addPublicSaleWallet(address)","da95ebf7":"requestWithdrawal(address,uint256)","da96bbcd":"publicEventTokens()","da977038":"volumeBasedBonus(uint256)","da979b8d":"SpecialRate(address,address,uint256,uint256)","da98655e":"getNullAddress()","da9893dd":"Resource(address,string,string,string)","da9ab565":"changeId(string)","da9ad094":"changeParameter(uint32,uint32)","da9b3cb4":"getGameBid(uint256,uint256)","da9b90c4":"TOKEN_FIRST_DISCOUNT_MULTIPLIER()","da9bca21":"numActiveMembers()","da9bdbfc":"CKCoin()","da9bf54c":"icoPhaseDiscountPercentage4()","da9c273d":"cancelInvoice(uint256)","da9c6a46":"getReplyCount(uint256)","da9c87fa":"changePayRate(uint256)","da9d0f6b":"withdrawCustom(uint256,address)","da9d56d7":"getBidIds()","da9d95bc":"commonWithdraw(address,uint256)","da9da572":"tryAirdrop()","da9dd8bf":"isAddressVerified(address)","da9e13aa":"getProviderSales(address)","da9eadac":"remit(address,uint256,bytes)","da9eeaeb":"PetroNetworkToken()","da9f40b8":"setAssetFileLink(string)","da9f4875":"freezeTokens()","da9f6918":"MultiSigWallet(address[],uint256,uint256)","da9f7550":"requestRandom()","da9f84a6":"rerollValue(uint256)","daa0ab0e":"majorityForTeam()","daa0f79f":"LEGAL_EXPENSES_ADDR_1()","daa147f3":"redeemLevAndFeeByStaker()","daa170ca":"difficultyBalance()","daa17f49":"marketplaceAddress()","daa1d7d4":"maximumPercentageOfDaysSupply()","daa21e0e":"testBitSetSuccess()","daa232ac":"_bonusRatio1()","daa283c8":"__callback(bytes,string)","daa3a163":"isUpgradeable()","daa44bf8":"getInStreamOf(address)","daa45281":"_addTo(address,uint256)","daa4cf88":"getCurrentStageIndex()","daa50ee0":"DSTMultisig()","daa5f48b":"findbit(uint256)","daa69c9e":"killDividentContract(uint256)","daa6f417":"howMuchTokensAvailableForExchangeFromStock()","daa7370f":"onFailure()","daa86216":"getAllowedContractsCount()","daa89fef":"issueNewHeldCoins(address,uint256)","daa94ab1":"frozenAccountProfit(address)","daa9604d":"byPonzi(address)","daaa50c9":"transferWithCustomReservingNet(address,uint256,uint256)","daaa6b5d":"setReleasedAddress(address,address)","daaadd8e":"arr(address,address)","daab88a6":"createEngine(uint256)","daac1f64":"reqfee()","daac518a":"playerTokenAddress()","daacb24f":"right42(uint256)","daad98f4":"socibit()","daae717c":"setIndividualMinCap(uint256)","daae7e98":"setCompte_20(string)","daaf3d2e":"attack(uint256,uint256,address)","daafe0a5":"setPrice(uint32)","dab0537b":"change_p2(uint256)","dab09999":"returnMyEthBalance(address)","dab122de":"dInit(address,address,bool)","dab12beb":"SmartSweep()","dab23f7c":"__callback(bytes32)","dab306b1":"votingFee()","dab30ccc":"addBonusPeriod(uint64,uint64,uint256,uint8,uint256,uint8)","dab41935":"TootyrToken()","dab43e6d":"PreSale3DAPP(address)","dab46553":"removeOracle()","dab4c65e":"totalDowSold()","dab4cb87":"gameValue()","dab4d1c1":"PixelPrice(uint16,uint16,address,uint256)","dab5cec2":"setExtraTokensPercent(uint256)","dab5f340":"setRoot(bytes32)","dab5fdc4":"DOWN_totalBets()","dab680dc":"getGlobalInfo()","dab78820":"ERC20Rescue(address,uint256)","dab80075":"Signature(address,string,string)","dab80d6f":"addSponsor(address)","dab8263a":"weiPerToken()","dab83b9a":"selltokens0()","dab88ad7":"VI6()","dab8a18b":"specialTransfer(address,uint256,uint256)","dab8c01a":"Zorro01Token()","dab8ef38":"addRooms(string,uint256)","dab8fa73":"setPackage(string,uint64[3])","dab91e87":"linkToMasterWallet(address)","dab93a93":"PolarisDEX(address,address,address,uint256,uint256,uint256)","dab951ba":"arrayFunc(int256[10])","dab9938e":"setIcoBeginDate(uint256)","dab9afa4":"Test12Address()","dabb0531":"getCharacter(uint256)","dabb37d4":"Lakshmi(uint256,string,string)","dabb624b":"rate_ETHUSD()","dabb6360":"percentage_of_three()","dabb6778":"vestingTeamWallet()","dabbbd0b":"sharesChainToken()","dabbd2bd":"removePlayerFromServer(uint256)","dabbd670":"team2Token()","dabc0c37":"isPassOwner(bytes32,address)","dabc706e":"getProposalCost()","dabd2719":"setDiscount(uint256)","dabd2eb2":"changePrice(bytes32,uint256)","dabd5d65":"addDays(uint256)","dabdc1f2":"ChangeActiveDigger(address)","dabecd8d":"_newBid(bytes32)","dabf7dc8":"PayoutDividendEarly(uint256,bool)","dabf7ec4":"helper(uint256)","dabf8246":"EventAuction(address,uint256,uint256,uint256,uint256,uint256)","dac00420":"maxHalvings()","dac05adc":"test_1_ensureVoteWorks_increaseBlocksBy100()","dac1182e":"signBBODocument(bytes,bytes)","dac17430":"lastVoteTime()","dac194f1":"setAutoInvest()","dac1e5e5":"_computePVPReward(uint256,uint256)","dac32ba9":"modifyPolicyTo(address,uint8,uint8)","dac34674":"setNextGameSettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","dac3ab88":"getCurrencyHash(uint256)","dac3f6d2":"queryFusionData_ext(uint256)","dac47a71":"SetGiftTime(uint256)","dac4fcdb":"getNewCustomPrice(address,address)","dac54daa":"OPLTest()","dac5b8ae":"TokenSale(address,uint256,uint256,uint256)","dac645bd":"getBUI(bytes32,uint256)","dac649c8":"NEWC()","dac6af5e":"SWIFTH(address,address[],address)","dac796bb":"getInvestorBalance(address,address)","dac7c858":"TOKEN_TRANSFER_PROXY_ADDR()","dac84ee4":"moveToReceiver(address,address,uint256)","dac8df25":"DEVELOPER_CUT()","dac90466":"_error(bytes32)","dac9555d":"allocate_slot(address)","dac9882a":"offChainAddresesValidCount()","daca5ce0":"bonusTokensPercent()","dacaeb07":"pledge(bool,uint256)","dacc8e11":"getTPrice(uint256)","dacd06fc":"KongQiCoin()","dacd4472":"PixoArenaFounderToken()","dacdbb93":"removeAccountSearch(address)","dace4557":"setUnlockTime(uint256)","dacef51b":"payincount()","dacf18c7":"getDeathCoin()","dacf9483":"getUIntValueConverted(bytes32,uint8,uint256)","dacfa06f":"manualDraw()","dad0128d":"calculateAdjustedFiguresForBattle(address[3],address[3])","dad03cb0":"returnError()","dad13822":"setMonsterClassSiteSet(uint256,uint256)","dad22781":"AdvancedArtificialIntelligenceSafetyDefense()","dad24541":"PresaleToken()","dad2771d":"signReceipt(uint256,int256)","dad30cfc":"test_transfer_to_contract_with_fallback()","dad38294":"PowTokenHashedBase()","dad39151":"multiApprove(address,address[],uint256[])","dad52c72":"_itemCancelMarkets(uint256)","dad59f35":"raisedEthers()","dad5c2e3":"validAstroCount()","dad5c3ee":"chainyShortLink(uint256,string)","dad5fda3":"vester()","dad6b482":"userHasPositveBalance(address)","dad72332":"claimUnsold()","dad7ad9e":"aix()","dad7c095":"transferWithAllowance(address,address,address,uint256)","dad7e4d2":"Aaa()","dad86b45":"teamETHUnlock3()","dad90035":"withdrawalRequests()","dad901be":"callWithdraw()","dad950f4":"InvestorPart()","dad98b52":"MonsterBitToken()","dad99119":"ddf()","dad99989":"burnCoins(address)","dad9a423":"setDuesIn(uint256)","dada85c3":"setAirdropOn(uint8)","dadad8fe":"addNewStreetName(string)","dadb20be":"ChangeTokenName(address)","dadc89eb":"setPreIcoDates(uint256,uint256)","dadcb460":"bumpPointer()","dadce8b0":"setExpiration(uint64)","dadd9e8e":"withdraw_some_amount(address,uint256)","daddff33":"claimController()","daded88e":"addMessageRequest(address,address[],string)","dae072d9":"GameWon(address,uint256)","dae1bd84":"AddChip(address,uint32)","dae1ddd2":"check_period(address,address)","dae1f17a":"getShopOwner(string)","dae21454":"toEthereumSignedMessage(string)","dae37abc":"cancelParticipation()","dae37fac":"spendAvailable()","dae392ee":"softFundingGoal()","dae3f7e2":"Gralaxious()","dae595e5":"getAuctionStart(address,address)","dae611c4":"lockUnlockMatchGPForBetting(uint256,bool)","dae6f081":"setScrapMinStartPrice(uint256)","dae79483":"getMemsize()","dae7e05d":"_bonusAll(uint256)","dae8865c":"ETHERCToken()","dae89f18":"coordinatorAccountIndex(uint256)","dae8af77":"getFeeWindowId(uint256)","dae9c31b":"ProofPresale()","dae9e379":"getFundBalance()","daea85c5":"approve(address)","daeab905":"issueReceipts(address,uint256)","daeb1c98":"PlusToken()","daeb860d":"versionAddresses(bytes32,bytes32)","daec4582":"AuctionEnded(address,uint256)","daec75f3":"buyXwithdraw(bytes32,uint256)","daec8128":"mintTokensForFounders()","daecc910":"getCKOwner(uint256)","daed6726":"ETHCollected()","daee4dd6":"readCheck(address,uint256)","daee9e35":"level2Bonus()","daeed3a6":"rateFinalStage2()","daef0e92":"stopCurrentGame(uint256)","daef4df8":"addCar(string,address,uint256,uint256,uint256)","daef569f":"insChainTokenLedger()","daf017a9":"GetRocket(uint32)","daf059c6":"createGuess(uint16,uint64,uint64,uint16)","daf13a47":"reserveLockup()","daf161e2":"getThirdAdmin()","daf1af19":"Current_balance()","daf1db09":"readyForFinish()","daf22f4d":"identify(bytes32)","daf32370":"getPurchaseAddress(uint256)","daf47ba3":"incGenLabFace(uint256)","daf488b1":"setReferrerPercent(uint256)","daf49451":"BINGToken()","daf4f66e":"isLimitEnabled()","daf64aa5":"getCompanyDetails(uint256)","daf69093":"BLOCKCHAIN_DEPOSIT_BETA_1M()","daf6ca30":"saleContract()","daf6e5ae":"DeepBrain()","daf760d0":"getData_6()","daf7f103":"_error(uint256)","daf8f438":"startRedeeming()","daf9812f":"updateBincentiveErrand(address)","daf9a535":"getData_20()","dafa1d2d":"burn(string)","dafa55a1":"creatureIndexToOwner(uint256)","dafae408":"checkThreshold(uint256)","dafba12f":"setMAGContractAddress(address)","dafc5608":"TransferFeeRateConfirmed(uint256,address,uint256)","dafc64c4":"ERC223MintableTokenFactory(address)","dafd54a6":"ExaEUR()","dafd70c9":"RESERVED_UTILITY_GROUP()","dafea207":"smax256(int256,int256)","daff0093":"setReference(address,address,bytes32)","db006a75":"redeem(uint256)","db00758a":"getSGNTokenManager()","db00b848":"_performGeneric(bytes,address)","db00d1a9":"_preValidateCancellation()","db0251e9":"contributeMsgValue()","db035918":"deployForeignBridge(address)","db041965":"fightBetaMonster()","db0436c2":"RUNEToken()","db04aef4":"getHoldersLength()","db051653":"setEtherFeePercent(uint256)","db054134":"mintForReportingParticipant(uint256)","db059dfb":"createSsp(address,uint256,string)","db05ccfc":"setValue(address,uint256,uint256,uint256)","db060e1a":"RESERVED_TOKENS_FOR_FINANCIAL_INSTITUTION()","db068e0e":"setExchangeRate(uint256)","db06f0c2":"doPresaleMinting(address,uint256,uint256)","db078f08":"toggleKey(address,bool)","db0827e9":"ashcashToken()","db0834cf":"lockedAllocation()","db08444a":"toUint(int256,string)","db087ad5":"getCurrentPricePerWei()","db08ccec":"enjinTeamAddress()","db0a087c":"getTypeName()","db0aa668":"Bittwatt()","db0ad29c":"SocialMediaMarketToken(uint256)","db0c154a":"hitCharacter(uint16,uint16,uint8)","db0c9a02":"marketSell(uint256)","db0d5175":"getTransfer(address)","db0d7ce5":"LotteryRoundCreated(address,string)","db0db014":"dividendsForAmountAndTime(uint256,uint256)","db0dd71e":"addAbility(string,bool,uint8,uint8,uint8,uint256,uint256)","db0e127a":"openDoor()","db0e16f1":"emergencyERC20Drain(address,uint256)","db0ec968":"transfer(address,uint16[])","db0edd08":"PubKeyHashAdded(bytes20,uint8)","db0fb107":"updateSafeSender(address)","db107371":"DecentrEx(address,address,address,uint256,uint256,uint256)","db11040f":"LogRegError(address,string)","db112977":"Project_Info(uint256)","db11ead1":"markContribution()","db1227da":"initGameReferred(address,uint8)","db122ad4":"committeeJoinVotes(address)","db123b1a":"ZRX_ASSET_DATA()","db12630a":"fundariaCap()","db12999b":"airdropTokens(address,address[],bool)","db1366bf":"buyExchangeRate()","db136b1e":"createAsset(address,uint256)","db15520d":"TPTContributors()","db15b72d":"getDInfo(bytes32)","db165a76":"createLand(address,uint256)","db16d0fe":"optionExist(uint256,uint256)","db171211":"returnToSender()","db171754":"vestedAddress()","db180b2b":"LOCKAMOUNT2()","db18c972":"play4(address,uint256)","db18f962":"updateSplitandSend()","db192761":"Clockpay()","db1a71ae":"trackable_likes(address)","db1b569f":"previousSender()","db1bdd1d":"TheTokenG()","db1c45f9":"getAllGames()","db1c53e2":"isTransferedUser(address)","db1d0fd5":"alpha()","db1d68b5":"countryWinnerID()","db1eeb51":"MizeCoin()","db1f6689":"authorContentByIndex(uint256)","db201648":"AppicsFund()","db21fc9c":"gettimeback()","db22032f":"rentalTimeRemaining()","db2307b6":"changeRecvEthStatus(bool)","db230b52":"viewScore(address)","db239951":"cbAddresses(address)","db23c5d7":"icoRuleAdd(uint256,uint256,uint256,uint256)","db23f7e3":"veztUserArrayIdentifier(address)","db246fda":"withdrawalTimeOf(address)","db248091":"assignBonus(address,uint256)","db25b407":"listActive()","db25c328":"joinToProvider(uint256,address)","db25e637":"Strikes(address[])","db264a36":"s10(bytes1)","db27b8dd":"vestingManager()","db299492":"IGFC(uint256,string,uint8,string)","db29fd6e":"increaseDistrictCoke(uint256,uint256)","db29fe12":"addShareholder(address)","db2a0cb7":"HumanStandardTokenFactory()","db2ac8d8":"WINTOKENADDRESS()","db2becb0":"getWalletFeeSignatures()","db2c4e2d":"complexScaleObsTest(address)","db2d10a5":"PreICOTokenPushed(address,uint256)","db2d5841":"batchRelease(address[])","db2e21bc":"emergencyWithdraw()","db2ea20e":"arrayTestMulti(address[],address[],uint256[])","db2ea5c0":"_callERC165SupportsInterface(address,bytes4)","db2f1d83":"TalkCrypto()","db3119bb":"manageLink(uint256,uint256)","db318833":"_ecAdd(uint256,uint256,uint256,uint256,uint256,uint256)","db31dd17":"removeAddressFromWhitelist(address,string)","db31fb03":"excessEth(address)","db3268d8":"getBU(bytes32)","db32be98":"refundICO()","db330794":"addToVestMap(address,uint256,uint256,uint256,uint256)","db3359f0":"makeNonFungible(uint256,address)","db35132c":"WithdrawEther(address,uint256)","db3543f5":"setFoundation(address)","db35a03d":"allowedSpenders()","db36c2e5":"destroyOldCoins(address,uint256)","db37ceec":"maxEthContribution()","db37e42f":"multisetProofType(uint256[],address[])","db383bf2":"MyNewToken()","db38b877":"testRsplit()","db395d2e":"bonusPercentForWeiAmount(uint256)","db39a8e8":"getTokenTransferInsByAddress(address,address,uint256)","db39ceac":"MyBalance2(address,address)","db3b73db":"getPlatformName()","db3c1b94":"EtmPerBtc()","db3d8421":"getTotalAngelCardSeries()","db3e7f4f":"forgeTokens(address,uint256)","db3fd0b8":"usedReserveSupply()","db403747":"mintForYear(address,uint256)","db40e896":"stopExchange()","db40ed24":"WeGoldToken()","db412f39":"preSaleDelivery(address,uint256)","db420fe3":"serverAddress()","db422e0b":"sendTokensAndRefund(address)","db447c04":"getPurchaseDetail(uint256,uint256,address)","db45479b":"closeChannel(uint256,address,bytes32,uint256,bytes32,bytes)","db456f77":"extraReceiverByIndex(uint256)","db45a30f":"buyPlanet(uint256)","db475044":"SHITcoin()","db478d08":"levelTwoBonus()","db47b9c9":"isTokenSupported(address,address)","db480704":"HCTToken()","db4844f3":"setRequestFailed(uint256)","db491d49":"ContributionReward()","db491de9":"daysToUnfreeze(address,address)","db491e80":"getNote(uint256,uint256)","db4ad99f":"constructUserIdentity(address,string,uint32,string,string,bytes32,bytes32,uint8)","db4bb866":"bitskiToken()","db4bd421":"trackable_record(address,uint256)","db4c528b":"increasePositionOnBehalfOf(address,bytes32,uint256)","db4cacec":"Other()","db4ce763":"DTRExpensiveWallet(uint256)","db4cf8e6":"getAccountAddress(uint256)","db4d1296":"confirmAdminTx(uint256)","db4e1df5":"setBTTSToken(address)","db4ecbc1":"CONTRACT_ADDRESS()","db518db2":"withdrawFor(address,uint256)","db51d62b":"OpenTime()","db52e130":"saveString(string)","db530222":"nextEndTime()","db536d2f":"getDefaultKey(address)","db5370c3":"EEAcoin(address)","db543fdc":"adviserAndBounty()","db5517b0":"snapshots(address,uint256)","db5549d8":"TokenBurn(address,uint256,bool)","db55bd2d":"authoriseNextAction()","db56702b":"firstWeekEndTime()","db56c29d":"Billionstrader()","db56d26c":"ChangeFiliate(address)","db57c429":"createPromoGameItem(address,string,uint256,uint256)","db5861ed":"ULA(uint256,string,string)","db589907":"setCosts(uint256,uint256)","db589bbe":"getInternalDrawings(uint256)","db59190d":"C1(uint256)","db5a2778":"adminAddCountry(string)","db5ad407":"setData(bytes32,uint256,uint256,uint256,uint8[])","db5b4183":"oracleOutcomes(bytes,address)","db5b5799":"setClientSupply(address,uint256)","db5b7635":"TokenMacroansyPower()","db5c9442":"TRIAL()","db5cf9de":"getSpaceshipProductClassByModel(uint16)","db5d855b":"getReceiptId(address,address,uint256)","db5df447":"redemptionPriceCalculate(uint256)","db5eef61":"PredictionMarket()","db5f2f31":"calcExchangeRate()","db5f5d7c":"usedAPI()","db606931":"pointRootNode(address)","db618c08":"TestAuditor()","db623bd5":"ErrorSendingETH(address,uint256)","db624887":"W()","db62df0e":"likeTrack(address,bytes32)","db6380ec":"tokenCapForMainICO()","db638e51":"resetUserRefBalance(address,address)","db63e149":"EmployeeWallet(string)","db641ab4":"Game_balance_in_Ethers()","db642bce":"GoddessToken()","db6648c0":"collateralisation(address)","db66ef59":"getPublicKeyN()","db6727c1":"myBitFoundationPercentage()","db680e3d":"getMeterInfoByMonth(uint8,uint256)","db681e1d":"GameScored(bytes32,int256,int256,uint256)","db681e54":"getGenerationForCall(bytes32)","db681e9f":"sendRefund(uint256)","db6997ae":"getCitiesData(uint256[])","db6a3652":"addOrder(address,uint256)","db6aef35":"amountOfWorkpointQueue()","db6bb289":"Zygoma()","db6bbeb2":"abx_token()","db6be534":"end_ts()","db6be871":"getAmountByCoupon(bytes32)","db6bed22":"addPresaleWallets(address[],uint256[])","db6c1831":"bonusSystem(bytes5,uint256)","db6c709c":"updateExchangeRates(uint256,uint256)","db6c71d6":"rspContract(address,uint256)","db6c7286":"CTokenGB()","db6c9416":"AgoraToken()","db6f1e74":"getUser(uint32)","db6f7537":"getPOOL_edit_22()","db6f9deb":"rewarded(uint256,address)","db6fcf01":"is_destroyed(uint256)","db7057fb":"rngId()","db714efe":"getBlocks(uint256,uint256)","db71c776":"setRateIcoPreICO(uint256)","db71d8b6":"FEE_SELECT_LRC()","db723e73":"personalMincap()","db72496f":"cancelSubscription(uint256,uint256)","db737c78":"getToken(uint256,bool)","db73bfce":"gameInfo()","db7400a5":"createAppInstance(bytes32,bytes)","db747f21":"setOraGasLimit(uint256)","db74847d":"distributeTratok(address[],uint256[])","db74c27a":"backRedPillTokenOwner()","db75dd5f":"AQBToken()","db76790f":"setAdvisorWallet(address)","db76e9c2":"setMemberLevel(address)","db77032d":"RATE_SALESTAGE4()","db775041":"donation(bytes32,uint256)","db775410":"setTypedJackpotWinner(address,uint256)","db7757cf":"valueRaised()","db78d0ce":"getAirdropAtSnapshot(address)","db78f5ef":"withdrawOnBehalf(uint256,string,uint256,uint8,bytes32,bytes32)","db79a65f":"resetUserWhiteListAmount()","db79e673":"getTradeOfferRecipientItems(uint256)","db7a0855":"MZToken()","db7a2f42":"projectAgent()","db7a4605":"getWallets()","db7a80f8":"getContributionUSD(address)","db7b87ff":"init(address,uint256,bytes32,uint256,uint256,uint256,bool,bool,address)","db7bc073":"refundWhenNotClosed(address)","db7ca38a":"XaurmProxyContract()","db7d2665":"FundTransfer(address,uint256,address)","db7d9065":"assignedAmountToCooperativePartner()","db7ed9e7":"addAssessorToPool(address)","db7ef562":"_2_nation()","db7ef7c6":"verifyEscrowVendor(uint256,address)","db7f1e6b":"getInitialEnemyCombination()","db7fea95":"WALLET_T8EX_RESERVED()","db803a86":"post(string,address[])","db80813f":"set(bytes32)","db80a787":"emitCourtUpdated(address)","db80fbc9":"balanceOfLockup()","db82967c":"createUsingProxy(address,bytes)","db8298f3":"_commissionTarget()","db833e3a":"sellShares(bytes32,uint8,uint256,uint256)","db83694c":"getSaleInfo()","db8374ee":"buyOracleFor(bytes,address,address)","db83d02f":"VREO_SALE_CLOSING_TIME()","db84252c":"tokenCreator()","db852ee7":"pieceSold(address,address,uint256)","db856759":"depositOldTokensFor(address,uint256,address)","db856f28":"_updateCard(address,uint256)","db85bd78":"registerTraderAccount(address)","db86d850":"transferGoo(address,uint256)","db87cbcc":"GetPermissionsList(address,address)","db88176f":"getQuestion(uint256)","db8850bc":"_merge(uint256,uint256)","db886f23":"Marketing()","db89c044":"reputationOf(address)","db89edb2":"BitDailyBot()","db8a61d4":"APP_BASES_NAMESPACE()","db8b6ccf":"addSubjectMatter(string)","db8b7fae":"transform(address)","db8bcec4":"MAX_TIME_RANGE_COUNT()","db8cee5e":"_generateRandomDna(uint256)","db8cfa5a":"HAVtoUSD(uint256)","db8d55f1":"getFees()","db8d7c39":"disableRestriction()","db8e9043":"SetOutRate(uint256)","db8ecf34":"registerFreelancer(string,string,bytes32,uint256,uint256,uint256[],string,string,bool,string,uint256,uint8,uint256[],uint256[],string)","db8ed8a7":"withdraw_a_bit(uint256)","db8ee692":"_price_tokn_ICO()","db8f0301":"getAEth(uint256,uint256)","db8f2f75":"EthStorageContract(address,address,address[],uint256,uint256,string,string,uint8)","db8f5a35":"feesAndBountySupplyRemaining()","db8f7fb5":"preDiscountPercentage()","db9078b4":"CheckGenChip(uint32)","db9090a7":"devTokenWithdraw(uint256)","db91095e":"LVXToken()","db91774c":"setMinValue(uint256)","db9254a5":"_buy(address,uint256,uint256)","db9311c2":"getBlocksToNextRound()","db93f375":"startTokenVotes(address[],uint256,uint256,uint256,address[])","db946a11":"PlayStationChain()","db958f18":"FootCoin(uint256,string,string)","db95937d":"orderContractorProposal(uint256)","db967d05":"endOfPhase3()","db97c24d":"uzziToken()","db98abd8":"testThrowCancelSellOrderTwice()","db98d73f":"setRecordAddress(address)","db99800c":"fetchCreatedOrdersForMerchant(address)","db9a21bb":"CreateRZM(address,uint256)","db9abbd4":"arr(bytes32,bytes32)","db9b6775":"testMintThis(int256)","db9cc410":"createAsset(string,uint256)","db9cc99d":"AuctionCancelled(uint256,uint256)","db9cd8d3":"tab()","db9d28d5":"numDigits(uint256)","db9d5d31":"AdminRemoved(address,address)","db9dfb35":"newTeamOnEnd(uint16,uint64,uint64,uint64)","db9f16a8":"takeOffItem(uint256,uint8)","dba01cfe":"distributePENT(address[],uint256,uint256)","dba07858":"_removeFromList(address[],address)","dba0e9bb":"ethertoteDevelopmentWallet()","dba1a5f9":"allocateFunds()","dba1ac3d":"getEnforceRevisions(bytes20)","dba21586":"ProofOfTrevonJames()","dba21657":"askForEther(uint256)","dba22cb0":"transferPlanet(address,uint256,uint256,uint256)","dba232e3":"POPToken()","dba2a570":"_tune(uint256,uint256)","dba2d875":"forcedRefund()","dba31911":"bookSpaVisit(uint256)","dba33c03":"saleTokensCents()","dba3e704":"setMinimumContribution(uint256)","dba4c85c":"GetWithdrawBalance(address)","dba56cb8":"buyTokensFromContract(address,uint256)","dba5e917":"SelfDestruct()","dba6f7be":"verifyCreateSig(address,uint256,uint256,bytes32,bytes)","dba72a4e":"ICONIQ_SALE_OPENING_TIME()","dba7ef7d":"Bookie(address,address)","dba86ab6":"claimCardboard(uint64)","dba8be6e":"chickenTokenDelegator()","dba989ca":"_bonusTime2()","dba9a8a2":"setTrCut(uint256)","dba9daab":"pickBigWinner()","dbaaa2dd":"MIN_CONTRIBUTION_PRESALE()","dbaab3e1":"setMarketingAdmin(address)","dbaad1e5":"ownerDied()","dbab2f97":"merge(address[],bytes32,bytes32,int256,int256)","dbab7f1b":"UserInfoContract()","dbac248b":"MannaCoin()","dbac4cbf":"GetContractStateTerminatedSecDep()","dbac7806":"milestone()","dbacc237":"holderOf(uint256)","dbad21af":"tickets1kprice()","dbaea636":"UVPToken()","dbaec0fd":"createPattern(bytes32,string,address,string)","dbaf023d":"LogoVote()","dbaf2145":"requestWithdrawal()","dbaf5ce7":"changeRatesToken(uint8,uint256)","dbaf7247":"getValueByIndex(uint256)","dbafd0f2":"getTotalSeconds()","dbafdbb6":"setBalanceLimit(address,uint256)","dbb094ef":"Crowdsale(address,uint256,address,address)","dbb173d9":"test_updateKey_decreaseNoHint(int256)","dbb183c2":"setAuthorizedLogicContractAddress(address)","dbb24554":"updatePriceDenominator(uint256)","dbb3cef3":"developer_update_Terms_of_service(string)","dbb47d77":"claimPlayerWinnings()","dbb57a4b":"transferOne(address,uint256)","dbb61238":"maxDelay(uint256)","dbb62f24":"setDataMining(address)","dbb633f1":"ownerWithdrawalDate()","dbb72f67":"nullify(address)","dbb80e42":"allTokensLength()","dbb82429":"_randByRange(uint256,uint256)","dbb833df":"investWithoutId()","dbb8a305":"getBetName(uint256)","dbb98cae":"limit7()","dbb9deda":"goNext()","dbbabdfe":"getnum(uint256)","dbbb119c":"addMaster(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint32,uint32)","dbbb206f":"buy(address,address,address,address,address)","dbbbe8df":"transferByCrowdsale(address,uint256)","dbbc6fcc":"isPayableEnabled()","dbbc853b":"tokenURISuffix()","dbbd3a71":"addClaim(address,bytes32,string,string,address,uint256)","dbbd4865":"isEarlyBirdsStage()","dbbd78da":"getAccountNickname(address)","dbbd7934":"findItem(address[],address)","dbbd9a04":"ALLOC_MAX_PRE()","dbbdad8c":"generateReleaseTokensSchemaHash(address,address,uint256,bytes32)","dbbdae63":"updateSeller(address)","dbbdf083":"register(uint256,address)","dbbe2ff9":"setCirculationShares(string)","dbbf01b2":"setAddUsers(address,address,string,string,uint256)","dbbfcd7c":"getCOR()","dbc02821":"XTVNetworkContractAddress()","dbc0c085":"teamMultisig()","dbc139be":"LogMigration(address,uint256)","dbc1f226":"suicide(address)","dbc27799":"pendingNewRound()","dbc2783d":"DoNotDeployThisGetTheRightOneCosParityPutsThisOnTop()","dbc2d042":"consumerAddress()","dbc2ef49":"getNotUsedToken_()","dbc38940":"executeTxn(uint256)","dbc45228":"newProposal(address,uint256,bytes,bytes)","dbc488e2":"ESlotsCrowdsale(address)","dbc53c07":"read(uint16,uint16)","dbc56297":"claim(address,bytes32,bytes32,uint8,bytes32,bytes32)","dbc57971":"getIcoStatus()","dbc5d002":"sendQuery(string,uint256,uint256)","dbc65f85":"preBuyPrice2()","dbc69521":"totContribution()","dbc837c5":"insurer()","dbc8817d":"GOLDENRATIO()","dbc91396":"cancelOrder(uint128)","dbc91ed1":"subset(string,uint256,uint256)","dbc933bc":"p_withdrawDevHoldings()","dbc9ef42":"_removeAuction(uint40)","dbca1207":"getLastSeed()","dbcbaca4":"investorInfo(address)","dbcbb362":"setTransperRun(uint256)","dbcc4658":"getSmartContractByPosition(uint256)","dbcc6caf":"second_release(uint256)","dbccb926":"CreatedToken(address,uint256)","dbcd258d":"blocksPerHour()","dbce1ff7":"referralRateInviter()","dbceb005":"split(uint256)","dbcf0531":"ContractFullfilled(address,int256)","dbcf194a":"GetInventoryCount(address)","dbd01de1":"cluster()","dbd05767":"RBA()","dbd0e1b6":"getSeller()","dbd16774":"IGMathsContract()","dbd19619":"round_earnings(uint256)","dbd1be77":"getDrone(uint256)","dbd1df92":"setTitulaire_Compte_1(uint256)","dbd229ff":"totalSupplyMarket()","dbd2ac60":"distributeCallback(uint256,uint256)","dbd3100e":"getBuilding()","dbd3313e":"PizzaPoll()","dbd3c372":"safeMulticastTransfer(address[],uint256[],uint256[],bytes)","dbd3cd62":"withdrawPayment(uint256)","dbd3d021":"findNextSecond(uint256,bytes2)","dbd42da5":"ranked()","dbd4a422":"synthetixState()","dbd4a8ea":"setBase(address,uint64,bool)","dbd54b62":"setMasterAuth(address)","dbd55fb3":"ACTION()","dbd594bb":"FoundsTransferd(address,uint256)","dbd5ef6d":"setFeeConfig(uint256,uint256,uint256,uint256)","dbd64ae9":"closeSale3()","dbd6da8c":"isUidSet(string)","dbd6f5c1":"allocationAddress()","dbd760ca":"PriceThreeDisable()","dbd7fd13":"saleMilk()","dbd84659":"receiveTokenByClientAccount(string,uint256,address)","dbd848e3":"ICO_Ended()","dbd8987c":"contractFeePercentage()","dbd8c25f":"BasicTokenImpl()","dbd91792":"multiowned()","dbd9a4d4":"setAllowances()","dbdb8b56":"eosGAS()","dbdb96c2":"updated_policy_payload()","dbdc275d":"createB()","dbdd5ae6":"actOnBehalf(bytes,uint256,uint8,bytes32,bytes32)","dbdd5d74":"swapsFor(address)","dbddcdb7":"getScouponBalances(address)","dbde1988":"transferFromWithoutReward(address,address,uint256)","dbdef054":"setFinalizeAgent()","dbdf7fce":"resetCounter()","dbdf8538":"_emitWorkStarted(uint256,uint256)","dbdff2c1":"getRandomNumber()","dbe01790":"getAllHpbNodes()","dbe1053d":"sendEthBackToUsers()","dbe201c7":"getAllBidsByAdslot(uint256)","dbe2bc84":"_suspendMarket(address)","dbe2c85b":"checkFiscalVerify(bytes32)","dbe2e296":"pushToPot()","dbe3010c":"WINNER_SHARE()","dbe3071a":"Kitchen()","dbe3117a":"tier2Timestamp()","dbe35007":"getAuctionsLength()","dbe3e92f":"provenanceOf(address)","dbe54524":"set_CWC_Address(address)","dbe55e56":"platformAddress()","dbe587b9":"CashPokerProPreICO()","dbe5bab5":"getOpenOrders()","dbe5ca78":"POAP()","dbe5fe9d":"setMaxCoinSides(uint8)","dbe6c02f":"isOwnerOrOperator(address,address)","dbe705ea":"fetchCreatedOrdersForMerchantByAdmin(address)","dbe992af":"updateEntry(uint256,address,uint256)","dbe9eebf":"getPricePointsLength()","dbea52d8":"lotteryPrice()","dbeab275":"createRoutingCode(bytes32)","dbeabd21":"getPplsAddr(uint32)","dbecc372":"Example(uint256)","dbecfb25":"koth_v1b()","dbed1e88":"getUnlockTime(address)","dbed3a30":"GamePoolAddress()","dbedf9e4":"TB01()","dbee0dea":"releaseTimeLock()","dbeea819":"tokenGrantees(uint256)","dbef0790":"returnUnsoldTokens(address)","dbefe789":"NUM_OF_PHASE()","dbf14295":"claimSilver(uint64,uint64,uint64,uint64,uint64,uint64)","dbf14dd9":"buyfloaksAgainstEther()","dbf1b00b":"claimBeer()","dbf1bfee":"ballotFee()","dbf1ede3":"_getLogTokenContract(uint256)","dbf1f780":"_hasEntryForCompetition(address,uint256)","dbf1fe48":"calculateTokensFromWei(uint256,uint256)","dbf27e0c":"updateConstitutionPoll(address)","dbf2c9da":"isValidAuthority(address)","dbf2f3c2":"get_reward(address)","dbf323dd":"DEDToken()","dbf35430":"ownedOwnershipTransferred()","dbf44530":"isWhite(address,address)","dbf45aa3":"EthBank()","dbf4c54c":"batchTransfer(address[],address[],uint256)","dbf502c0":"getCentsPerETH()","dbf517a2":"_connectModule()","dbf53a0e":"StandardTokenMock(address,uint256)","dbf552aa":"LOG_InvestorEntrance(address,uint256,uint256)","dbf5b91b":"setSafeGas(uint256)","dbf5eb1c":"closeTokenSale(address)","dbf63340":"availableSynthCount()","dbf675c9":"bonusAddresses(address)","dbf724c7":"setReceiver2(address)","dbf76c03":"bountyOfflineWallet()","dbf79dcd":"StatusCow(address,uint256)","dbf7dc0c":"getEntityList(bytes32[],uint8[])","dbf81cc6":"foundersTokensAddress()","dbf8d2fa":"sendTips()","dbf98f6a":"totalSupplyBonds()","dbfa5863":"_endDate()","dbfa6226":"interfaceInstances(uint256)","dbfa980b":"Slogan(string)","dbfab65b":"AvalonToken()","dbfb129e":"ChecksumDatabase(string,string,string)","dbfb18e7":"GoblinChainToken()","dbfc74cb":"ORACLIZEGASPRICE()","dbfccd16":"ethersplay(uint8)","dbfdb6e5":"getIcoTokensAmount(uint256,uint256,address)","dbfdef01":"TechnoEng()","dbfe791b":"confirmed(bytes32)","dbfeb17f":"eth_cap()","dbfec8b7":"CHEXToken(address,uint256,uint256)","dbfef710":"getDefaultRequiredGas()","dbff4182":"seedCoins(address,uint32,string,uint256)","dc00adef":"buyLand(bytes32,int256[],int256[],address)","dc00b602":"EllipseMarketMaker(address,address,address)","dc00e43b":"BananaBasket()","dc012626":"ballotOf(address)","dc015851":"minimumContributionPhase4()","dc01bd0c":"calculateAmountForDAI(uint256)","dc021628":"setFund()","dc02511e":"addPermittedContracts(address[])","dc02f456":"decodeTransfer(bytes)","dc042405":"getNames(address[],address)","dc048cf2":"withdraw(uint256,string)","dc0527de":"NDEX()","dc06269f":"showWhaleAddr()","dc06b859":"numMarketMakers()","dc06d8f8":"lnTest(uint256,uint256)","dc06e754":"_setRspTokenAddress(address)","dc070657":"changeBeneficiary(address)","dc08a80b":"safeToAdd(int256,int256)","dc08b611":"EXAC()","dc08e2c5":"getVIPOwner(uint256)","dc08e5ff":"getStockCount()","dc09426c":"GetGameInfo()","dc09996c":"escrowDatabase(address,uint256)","dc09d8fd":"showInvestorsComission()","dc0b3564":"players()","dc0b48c1":"startPubTrade()","dc0ba228":"change(bytes,uint256[])","dc0bd011":"collectDonations()","dc0bd38e":"appendDecryptedBids(uint256[],uint256[],uint256[],address[],address,uint256[],uint256[],uint256[])","dc0bd75f":"arr(address,uint256,uint256)","dc0c1a27":"numberOfMajorEvents()","dc0c7735":"isPreSaleTokenSet()","dc0d3dff":"funders(uint256)","dc0d4cb6":"merculetContract()","dc0eb1a3":"PredictTheFutureChallenge()","dc0f5ffc":"get_candidate_pic(uint8)","dc11a496":"changeAdmin(address,bool)","dc11b386":"getDailyTarget(uint256,uint256)","dc11be24":"smallSize()","dc126e63":"unlockVestedTokens(address)","dc1279d4":"getPureFromGene(uint256[2])","dc129870":"Loom()","dc12a805":"right57(uint256)","dc12abb5":"setPresaleDates(uint256,uint256)","dc132be8":"getAmountofTotalParticipants()","dc13352a":"TeamSupply()","dc13f85f":"getMaxPriceSale()","dc14af38":"setIncrEth(uint256)","dc1542aa":"testSafeAdd()","dc154918":"_computeTournamentContenderCut(uint256)","dc154a19":"buyAndSetDivPercentage(uint256,address,uint8,string)","dc15c635":"getdeptinfo(uint256,address)","dc165652":"bountyTokensVault()","dc1790e3":"getdeptreqdetails(uint256,address)","dc17c9ca":"getTokenOwner(address)","dc17e808":"getPaidOrderByIndex(uint256)","dc183d64":"setBridgeValidatorsImplementation(address)","dc184e70":"reserveAccount()","dc190074":"setsafemode(uint256)","dc19266f":"Total_of_Players()","dc199335":"checkIdentifier(string)","dc1abb6e":"MAX_AUDIT_TIME()","dc1b93cb":"COREXCoin()","dc1bba17":"getTxAmountMCW(bytes32)","dc1bebe6":"creditExecutedFundsLessFees(uint128,uint256,uint256)","dc1c1389":"acceptOfferForCity(uint256,uint16,uint256)","dc1cb47b":"priceTLP2()","dc1d672d":"mQueue(uint256)","dc1d70c3":"presaleBonusLock()","dc1d83b3":"changeTelephone(address)","dc1df3f6":"myTokens(address)","dc1eab83":"standardSale()","dc1fb5a5":"community()","dc1fca7e":"dateSaleStarted()","dc1fdff0":"commissionSum()","dc201838":"QuickPrice()","dc206e5f":"oraclize_query(uint256,string,string[])","dc20d6e7":"updateRandomNumber(uint256)","dc20f957":"assetIncome(bytes32)","dc21b3de":"preIcoBonus(uint256,uint256)","dc22aca5":"GalaxiumCoin()","dc22cb6a":"series(uint256)","dc22eba6":"register(uint256,uint256,uint256,uint256,uint256)","dc2424fc":"setPositionPrice(uint256)","dc242e38":"calTotalSupply(uint256)","dc2811cd":"KDOU()","dc2816b7":"AddNewChip(uint32,uint8,uint8,uint8)","dc28d0c9":"tokenToValue(address,uint256)","dc298682":"createCategory(string)","dc29a89e":"concatBytes(bytes,bytes,bytes,bytes,bytes,bytes,bytes)","dc29da22":"getNodeHash(address)","dc29ec37":"tokenReserve(address,uint256)","dc29f1de":"topUp()","dc2a3056":"setTripleRoomMax(uint256)","dc2a60f6":"isReadOnly()","dc2af3de":"getCEOAddress()","dc2b32e6":"getWeiInvested(address)","dc2ba357":"SetupQDA(string,string,uint256,uint256,uint256,address,address,uint256)","dc2c928a":"pausePlayerContracts(uint256,uint256)","dc2cf3f5":"timeElapsed()","dc2d46f8":"getWeiAmount()","dc2df955":"get_project_information(uint256)","dc2e47c8":"save4(address,bytes,string)","dc2e7b33":"cal(uint256,uint256)","dc2ebcbc":"whitelistMainSaleAddressMany(address[],bool)","dc2f56cf":"transferAgreement(bytes32,address)","dc2f7867":"setMaxLength(uint256)","dc2f8744":"bounties(uint256)","dc2f8a38":"setResult(uint256,uint8,int8)","dc30685e":"gas4Token()","dc3080f2":"spentAllowance(address,address)","dc30e253":"doFinalizeSale(uint256,uint256)","dc30f912":"addTokenization(string,string,uint8)","dc3134ae":"getIslandBattleStats(uint256)","dc31adee":"releaseMarketingTokens()","dc31e06c":"NEKOCOIN()","dc31e473":"opmAddress()","dc322802":"stage2Bonus()","dc32c72f":"secondReserveTimeLock()","dc3496d7":"allHashTypes(uint256)","dc35213f":"change(address,uint256[])","dc35a6bd":"LOWER_PRICE_RESET_PERCENTAGE()","dc35a900":"createOffer(uint256,uint256,uint256)","dc35ea16":"bonusInPhase1()","dc371e54":"deleteName(bytes32)","dc376392":"ETCCoin()","dc3774b3":"availableBalances(address)","dc382cbf":"sumAcceptedContrib()","dc391176":"delayedPayments()","dc39537a":"AVAILABLE_BONUS2_SUPPLY()","dc39d06d":"transferAnyERC20Token(address,uint256)","dc39e5fe":"removeOperationType(uint32)","dc3a1cad":"setIBalances2(uint256[],uint256[])","dc3a8372":"controllerApproval(address,uint256)","dc3a9433":"lockedFundsPercent()","dc3ab866":"checkEarnings(address)","dc3acebe":"getApp(address)","dc3c39aa":"TCDC()","dc3ccfdd":"transfer_tokens_from_contract(address,uint256)","dc3d1a2a":"addNewEmployeeWallet(address,address)","dc3d2b5c":"MiniMeIrrVesDivToken(address,address,uint256,string,uint8,string,bool)","dc3d4203":"createPatient(bytes32,bytes32,uint256,uint256,uint256,bytes32,uint256)","dc3d6305":"_transferFromAllArgs(address,address,uint256,address)","dc3da6e9":"IcoAddressSet(address)","dc3ecbb4":"debug_wei()","dc3ef685":"feePromille()","dc3f65d3":"createdByMe()","dc3f7536":"AdamToken()","dc40af1f":"oneTimeTickets(address)","dc414448":"_addToParticipants(address)","dc415804":"setFiscal(bytes32,uint256,uint256,uint256)","dc419fd8":"cancelOrder(bool,uint256)","dc41e726":"IndoJek()","dc420fd2":"withdrawPayoutFromBet(uint256)","dc4243f1":"setSalaryToken(address,address,address,uint256)","dc441754":"addDocument(bytes32,string,string,uint256,uint256)","dc44bb1c":"createEscrowFrom(address,address,uint256,uint256)","dc454c13":"EDROP()","dc45b93a":"contributorsCompleteCount()","dc45bfb3":"buyPack(uint256)","dc45d08e":"getEtherBalance(address)","dc45e27f":"getBonusBalanceByType(uint256,uint256,bytes1)","dc460933":"assignRole(address,bytes32,address)","dc46a76d":"getIdeasSinceLastDeploy(address)","dc46c813":"TwoExRush()","dc46d984":"numGamesCanceled()","dc47b3c1":"numberOfTokenIds()","dc47e5b7":"approveAndCall(address,address,address,uint256,uint256,uint256,uint256,bytes,bytes)","dc489c9b":"setAirdropper(address)","dc493790":"advisoryWallet()","dc4a307c":"createCommonAuction(uint256,string)","dc4b3115":"thirdPriceTime()","dc4baedd":"checkVerify(address)","dc4bc06e":"getUserCategory(address)","dc4c4005":"RemoveUser(address,address)","dc4d2ccd":"DiscountPercentToken(uint256,string,string)","dc4ece27":"BONUS_3_DAYS()","dc4ee13f":"overallTakenEther()","dc4f63cc":"cap_max()","dc502d64":"ethToBeDistributed()","dc50af26":"against()","dc51fba8":"SetherFinalized()","dc52696f":"tokenSupplyChanged()","dc52c514":"batchCreateDrawings()","dc533342":"reconciliationDateSet()","dc53903b":"fundsReceived(uint256)","dc540979":"POFOMO()","dc5418b1":"view32()","dc541eb7":"SelfllerySale()","dc542a79":"isMaximumGoalReached()","dc542c0f":"ALIToken()","dc547301":"setCurrentSupply(uint256)","dc54d919":"long_tokens(uint256)","dc555090":"updateTime()","dc555766":"createWithdraw(address,uint256)","dc566787":"topdownAndCashout(address,uint256)","dc570aad":"setPermission(address,string,bool)","dc57726f":"TokenGenerationEnabled()","dc57c1ef":"CopyrightToken(uint256,string,string)","dc57c323":"nextInputProfit()","dc57d553":"epochLast()","dc583801":"doubleyour5()","dc585713":"EtherFundMeIssueTokensCrowdfunding(string,string,string,uint256,uint256,uint256,address,address,string,string,uint256,uint256,uint256,uint256)","dc5936f0":"addCountry(bytes2)","dc596304":"NineLTDevToken()","dc597b47":"getAnimals(uint8)","dc5a2199":"ICO_WALLET()","dc5aa474":"lastBlock_f2Hash_uint256()","dc5acb90":"getOrThrow(string)","dc5b041b":"validationPassed(address)","dc5b0662":"getIndexByShip(uint256)","dc5b87cf":"getPartnerAllocation(uint256)","dc5bc461":"RadToken()","dc5bcafb":"UnicornToken(address)","dc5bf961":"totalTokensLocked()","dc5c3e06":"setFundraiseLimits(uint256,uint256)","dc5c9677":"changeSellerProposedValue(uint256)","dc5d184f":"setID(uint256)","dc5d9bfe":"migrationStep(uint256)","dc5df3fd":"ExperimentalPreICO(address,uint256,uint256,uint256,uint256,uint256,address)","dc5dff36":"LottoComplete(address,uint256,uint256)","dc5fced4":"totalRake()","dc5fe025":"forward(address,bytes,uint256)","dc5fe349":"releaseManyStakes(uint256[],address[],address[],uint256[])","dc602df2":"tokenValueMultiplier()","dc6037d1":"setbaseconfig(uint256,uint256,uint256,uint256,uint256)","dc60457c":"publicIssue(address,uint256)","dc6055dd":"BOUNTY_WALLET()","dc61164d":"getMySperm()","dc61456c":"cooAddCro(address)","dc622bcc":"setTokensAllocation(address,uint256,address[],uint256[])","dc62da61":"checkGameListed(address)","dc63a62c":"getFileListHead()","dc63f0be":"getSatOwed(address)","dc646367":"endSale(bool)","dc64752d":"collectsAccountDividends(address)","dc659907":"useModule(address)","dc661aaa":"mainICOFirstWeekEndTime()","dc6668db":"make_anonymous_withdraw(uint256)","dc667d0c":"getCountriesCount()","dc669dd4":"EndorToken()","dc689d3c":"getBaseDenomination()","dc693ca7":"totalWeiAmountSale1()","dc69a2d6":"tearDown(uint256)","dc69aa23":"SudanGoldCoinCrowdsale(uint256,uint256,uint256,address)","dc6b1cbd":"setUser(address,address,uint256,uint256)","dc6b7fb4":"LockedAccountThresholdUsdUpdated(uint256,uint256)","dc6b9b29":"notesLength()","dc6bbdf5":"totalContributionInWei()","dc6bc372":"TokenChangerBNT(address,address)","dc6bfbb5":"nextBallotId()","dc6c0cdd":"Share()","dc6c3ee4":"setMaxTokenCap(uint256)","dc6dd152":"playerRollDice(uint256)","dc6e7262":"refundTransactionByMediatorFee(uint256)","dc6e9cf9":"_MINIMUM_TARGET()","dc6f39a3":"TriggerCooldown()","dc6ff38e":"MAIN_MAX_CAP()","dc7049bf":"annualManagementFee()","dc706a3a":"VictusToken()","dc70ab02":"setTotalExecutedPerDay(uint256,uint256)","dc718791":"changeRules(uint256,uint256,uint256,uint256,uint256)","dc71db43":"worldCupResultPart2()","dc720528":"AgriChainProduction()","dc726205":"rates(bytes32)","dc730c50":"initialSingleWithdraw(uint256)","dc73e49c":"swapToken()","dc7454dd":"amountReleased()","dc74665e":"totalLeaderboards()","dc75f2db":"multiowned(address[],uint256)","dc760edf":"hardCapCrowdSale()","dc76dc8d":"applyForCertification(string,string,string,uint256)","dc76fabc":"getSpotPrice()","dc77e5e1":"serviceTokensBurn(address)","dc787bba":"getCountTempHolders()","dc799f88":"BaseCertoChainContract()","dc79b176":"getUserGroup(address)","dc79c2ef":"addUser(bytes32,bytes32,bytes32,bytes32,bytes32)","dc79d069":"investorSupply()","dc7abeb3":"OPENSOURCE_TOKENS()","dc7ac1ba":"lendVault()","dc7b808e":"callLibSet(uint256)","dc7bbd72":"hasThreeStepWithdraw()","dc7cbfab":"priceCounter()","dc7df9d8":"testToUint(int256,bytes)","dc7e5762":"goNextPeriod()","dc7e88e8":"amountOfBooked(address)","dc7fc898":"bankermasterReq()","dc80035d":"setFoo(uint256)","dc801db6":"MyYLCToken(uint256,string,uint8,string)","dc80aaee":"DeltaToken()","dc81e2b8":"DarenHui()","dc82697c":"getContractValue()","dc835df5":"Sense()","dc8369ce":"myStakesOnCountry(uint256)","dc8452cd":"required()","dc845934":"getPlayerBetResult(uint256)","dc846d95":"Own()","dc84e79e":"raisedPreSaleUSD()","dc851b02":"itcERC20()","dc85561b":"firstRoomAvailable(string,uint256[])","dc85b996":"window1EndTime()","dc86e6f0":"baseUnit(bytes32)","dc87cfbf":"executeTransaction(uint256,bytes)","dc885527":"burnUnmintedTokens(uint256)","dc88e838":"getOAR()","dc8a0f65":"change_game_dice(string)","dc8b0203":"clearApprovalAndTransfer(address,address,uint256)","dc8bc70d":"finalizeSale(address)","dc8c06d8":"addEmployerFeedback(address,uint256,address,string,uint8)","dc8d1095":"simpleSubmit(uint256)","dc8d2696":"inboxSize(address)","dc8d26ad":"changeICODates(uint8,uint256,uint256)","dc8ee41e":"coldWallet1()","dc8f2ae0":"addExplicitPosition(uint32,int64[2])","dc8fbb44":"deathData_f12()","dc903eb7":"addChunk5ToWhiteList()","dc904e69":"waveCap3()","dc90e42f":"restrictedStockOf(address)","dc91868f":"backTo(address)","dc91b634":"Ticketh()","dc91ea68":"PayerStringUpdated(string)","dc92beec":"setManyWhitelist(address[])","dc93f7c9":"feePayedPerReserve(address)","dc94b4a4":"doPay(bytes32,uint256,uint256)","dc94e45d":"setDistrito(uint256)","dc9513c1":"JustifyClaimWithWitness(uint8)","dc951fdc":"totalOverthrows()","dc9564d5":"buy(uint256,string,address,address,address,address)","dc9590f0":"_START_TARGET()","dc965479":"FooContractCall(address)","dc97a4f9":"getTotalUnPayedDividendsAmount()","dc97d962":"getInt(bytes32)","dc97e366":"stageIndex()","dc9861db":"updateMeDao(address)","dc988b40":"allowWorkerToContribute(address,address,address)","dc992aa0":"minUSD()","dc998901":"SaveData()","dc9a1535":"isPublic()","dc9a190e":"isAllowedTrade(address)","dc9a1df3":"SafecontractsTREXToken()","dc9ac994":"iconiqSaleOngoing()","dc9ae17d":"burn(bytes,address,uint256)","dc9b6d68":"getTimeSinceLastEvent(address)","dc9bb7db":"noKing()","dc9c6e15":"_myinitialSupply()","dc9d625b":"setMaintainance(bool)","dc9deea3":"amountPurchasedWithDecimals()","dc9deeff":"setPresellPrice(uint256)","dc9e7a87":"TransferedERC20(address,address,uint256)","dc9e9ba0":"allowStart()","dc9eb903":"Tbond1()","dc9ebff7":"getTotalInvestedEther()","dc9f0622":"transferManual(address,uint256,string)","dca0b866":"TwoPersonContract(address,address,bytes32)","dca27d5e":"setV_R4(uint256)","dca44b39":"setPerOneEther(uint256)","dca5f188":"AddressBook()","dca60034":"isMapped(string)","dca6058c":"canSetTransferable()","dca67e5d":"_createResident(string,string)","dca6f378":"withdrawTokensFromPool(uint96)","dca703d0":"LogSetQuestionFee(address,uint256)","dca73e6b":"getMyStores()","dca7bcbe":"getWords()","dca80bc6":"EtheremonRankBattle(address,address,address)","dca92eb5":"terminateLiquidation()","dca95419":"recoverSigner(bytes32,string)","dca9fd5b":"editStatus(uint256,string,uint256,uint256,int8)","dcaa5620":"findNextWeekday(uint256,bytes)","dcaabed7":"getLastDeedByAddress(string)","dcabf93f":"refundstate()","dcac652e":"setOwnerShare(address,uint256)","dcac69c3":"inheritedPure(uint256,uint256)","dcace702":"getClientLastPaidRate(address)","dcacf19a":"finalizeAndRestart(address)","dcae2cb4":"getWinningPrize(uint256)","dcaee066":"setStakeDisbursementAddress(address)","dcaeea15":"setadmin()","dcaf391e":"totalAirDropToken()","dcafa43e":"SaxoToken()","dcafaec2":"setCostToCreateGame(uint256)","dcafee05":"killBalance()","dcb01759":"salesEth(address)","dcb032ce":"addNodeGroup(string)","dcb04503":"testConcatStorage33Bytes()","dcb12421":"isSoftcapOn()","dcb1c012":"ChowSale()","dcb27883":"CallAborted(address,bytes32)","dcb31b82":"isConfig()","dcb35d06":"getTransactionApproveCount(uint256)","dcb36063":"crowdsaleMinter()","dcb3ff58":"updateDividendBalance(uint256,address,address,uint256)","dcb46e38":"setWorstCaseRateFactor(uint256)","dcb4775e":"tokenPartner()","dcb4876f":"removeAddresses(bytes32[])","dcb5930a":"ratingContractAddress()","dcb6af48":"calcAverageICOPhaseKeyPrice(uint256)","dcb7e083":"teamTokensInitial()","dcb7f86f":"getWinningPayoutDistributionHashFromFork()","dcb814ef":"presaleWhitelistDiscount()","dcb951de":"pushDividends(address)","dcb9528e":"getBiddingInfo(address)","dcb9d457":"updateClientOfContractorManagers(uint256,uint256)","dcba03da":"MINEA()","dcbac60c":"winPrizes(uint256)","dcbad97b":"setEndIcoMainICO(uint256)","dcbc1288":"m_SMR()","dcbc1c05":"Deposit(address,address,uint256,uint256)","dcbc84ab":"coinsIssuedMkt()","dcbda04c":"setCrowdsaleInterface(address)","dcbe7cf1":"addInsuranceProduct(uint256,uint256,uint256,string,string,bytes32)","dcbf16d4":"Normal(uint8)","dcbfa4b7":"addSkills(bytes32[])","dcbfe3d5":"clearRequests(bytes32)","dcc0ccf3":"Dao(address)","dcc0e622":"setTokensForCrowdSale(uint256)","dcc1fd02":"angelSaled()","dcc23730":"setCurrency(uint256)","dcc279c8":"setHalted(bool)","dcc33e0b":"updateOperationalAddress(address)","dcc42e9b":"cards_blue_total()","dcc439cf":"updatePlayersGooFromPurchase(address,uint256)","dcc5237b":"FlatPricing(uint256)","dcc53305":"getMail(uint256)","dcc60128":"getProjects()","dcc6131c":"checkBalance(uint256[],address)","dcc66b4b":"addRelationshipBindingWineryOperation(bytes32,uint256,bytes32,int256)","dcc66cc2":"getDelegate(uint256)","dcc6762c":"withdrawalInitiate()","dcc6e7ad":"refundEth(uint256)","dcc71ed4":"AdvisorsAndFounders(address,uint256)","dcc76a92":"Ranking()","dcc7f6b0":"Ethen(address)","dcc819c8":"computeCntrAmountUsingUnpacked(uint256,uint16,int8)","dcc8592c":"KOCMOCToken()","dcc8a508":"partnerBonus(uint8)","dcc9a58c":"testCreateGame(string,string,bool,string,address,string)","dccb0c89":"test_1_someTest()","dccb37f1":"initialTokenBalance()","dccb5afb":"_emitTimeAdded(uint256,uint256)","dccb70a7":"setEnableAllTransfers(bool)","dccb98da":"SparkToken()","dccbb14b":"payInterests()","dccbfa2a":"minInvestedCap()","dccc6c94":"fireCloseProposalEvent(address,uint256)","dcccb41d":"setTransferAddress(string,address)","dccd4315":"startingAt()","dccdc893":"setNewWhiteList(address)","dcceaaa8":"sendShipmentTo(address,uint256)","dccee5b2":"posibleDividendsOf(address)","dccf77ce":"setCurrentBlock()","dccfbb62":"overthrow(bytes23)","dcd0fa9e":"get_arbits_min_contribution(address)","dcd1e670":"checkAmount(uint256)","dcd320a0":"bouncyCoinToken()","dcd3c2e5":"QLALA()","dcd4090b":"getStage3Start()","dcd4eb14":"addNewTicket(uint256,bytes32,uint256,uint256,uint256,bytes32,string)","dcd58e2f":"FUTURE_ME_ADDRESS()","dcd65479":"numPeriods()","dcd6561d":"currentSaleSold()","dcd7dd2e":"setKYCLevel(address,uint8)","dcd8023c":"TokenBranch(uint256,uint8)","dcd93691":"retrieveOnFail()","dcd9c289":"getBAA(bytes32,address)","dcda0c8f":"requestDiplomaByNr(uint256)","dcda2385":"TransferSellAgentCreators(address,uint256)","dcda4554":"dazoToken()","dcda4bf3":"mOwner()","dcdaa35b":"mintAmount2()","dcdb622b":"MessageSet(string,uint256,uint256,address)","dcdbbe37":"lockTransferFor(address,uint256)","dcdc055a":"doBuy(address,uint256)","dcdc7254":"admin_set_shopStorePrice(uint256)","dcdc7dd0":"mint(address,uint256,bytes,bytes)","dcdd6d38":"getHolderAddresses(bytes32)","dcdd9af2":"DEX(address,address,address,uint256,uint256,uint256)","dcdda6d7":"teamUnfreeze()","dcde0019":"disapprove()","dcde835e":"NewSale(uint256,uint256,uint256,uint256)","dce0b4e4":"creationFee()","dce11375":"emitter()","dce1d3c6":"addTokenPendingToken()","dce23e97":"getPriceValue(bytes32)","dce293a7":"minLength(uint256)","dce2b4c1":"getMarkup(uint256)","dce2f2dd":"Vouched(address,bytes32)","dce388b6":"payeePartsToSell()","dce4a447":"at(address)","dce4ae87":"DigixConfiguration()","dce4b34e":"submitAnswerByArbitrator(address,bytes32,bytes32,address)","dce4fa38":"IcoTokens()","dce57755":"getBlockLength()","dce579d1":"extendIco(uint256)","dce59311":"didOwnerEndCrowdsale()","dce59c00":"addPayee(address)","dce5c5a9":"norsefirePrice()","dce5c757":"cool()","dce5f277":"investorsAddress(uint256)","dce6417d":"DebitCoinToken(string,string,uint8)","dce722dd":"getJobSkills(uint256)","dce77d84":"getCurrentRate(address)","dce85216":"moveUnsoldTokens()","dce98784":"NiewGold()","dce9f6c3":"SuperConductToken()","dcea0a64":"ADX()","dcea7113":"buyOutPrice()","dcea80a5":"exchangeIEO()","dceacb93":"_createNewBadge(address,uint256)","dceaf74c":"youAre(address)","dceb3e7d":"getConfirmations(bytes32,address)","dcebb122":"extendSale(uint56)","dcec5ecc":"calcNewEmployeePoolOptions(uint256)","dcec7204":"EtherNeo()","dced2f1a":"currentCharId()","dceda27b":"getRegularCarSupply(uint256)","dcede2c3":"testIsSameSign()","dcedeeed":"claimIfNeededThenSteal(uint256,uint256,address,uint8,bytes32,bytes32,uint256,uint256)","dceeeae8":"ServiceController(address,address,address,address)","dcef8165":"CoinBirdDEX()","dcefa538":"buyTokens(address,address,uint256)","dcefcb8e":"extractCallData(bytes)","dcf00b6e":"getAccreditationActive(bytes32,bytes32)","dcf1579c":"thirdBonusPercent()","dcf1a9ef":"commissionBalance()","dcf1df05":"showValue(address,address)","dcf219f2":"setLootboxFee(uint256)","dcf34a91":"SpendingUnblockedEvent(address)","dcf3fb2a":"revoke(address,address)","dcf537b1":"multiply7(int256)","dcf63591":"course()","dcf6a592":"isGreaterThan(uint256,uint256)","dcf72c10":"buyTo(address)","dcf73856":"generateGroups()","dcf7bb5c":"changeTarget(address)","dcf7c0d0":"TokenTrader(address,uint256,address,uint256,uint256,uint256,bool,bool)","dcf7c2f9":"asset(uint8,string,bytes)","dcf8045e":"tiersInitialized()","dcf8113e":"campaignEndedSuccessfully()","dcf86587":"_transferWallet(address)","dcf8f13a":"getCurrentItemPrice(uint256)","dcf90793":"IcoWallet()","dcf91ea9":"MoftakToken()","dcf946c2":"getAllParentIds(bytes32)","dcf97439":"revealX(uint256,uint256)","dcf988d6":"GetFeeBalance(uint256)","dcf9bbec":"hasVerifiedAttributeIndex(address,uint256)","dcf9e836":"setProviderLimits(address,uint256,uint256)","dcfa6ac4":"buyChamp(uint256,address)","dcfa9222":"transferAccessTo(address,address)","dcfa9cc0":"testProxyCall()","dcfac095":"CPX(uint256,string,string,address)","dcfc3b46":"getAdIdByUser(address,uint256)","dcfc4430":"groomAddr()","dcfcda2b":"changeEscrow(address)","dcfda779":"allowCrowdsaleAddress(address)","dcfe63a9":"finishPrivateSale()","dcfe64e9":"SHA256()","dcfe8eb4":"SetIPR(string,string,address,string,string,uint256,string,string)","dcff2f76":"createAndJoinCDP()","dcff5581":"NewFeeAddress(address)","dcfff171":"setDelegadoDeDistrito(bytes32)","dd001254":"nameToTokenId(string)","dd00182b":"dogeAddress()","dd004ca8":"_endEdit()","dd009f48":"recursiveCeil(uint256,uint256,uint256)","dd00a9dc":"close(uint256,uint256,bytes)","dd00b605":"normalCheck()","dd012a15":"setIt(uint256)","dd01f781":"goToWork(uint256)","dd01f9e4":"LogNeededBalance(uint256)","dd022727":"getGameByIndex(uint256,bool)","dd029560":"CoreLayer()","dd02e30d":"isValidTxPaymentForKWh(bytes32)","dd03447f":"DiamondCash()","dd052519":"withdrawAllPlayers()","dd05db9a":"amountPerRelease()","dd0669d4":"getZCount(uint8,uint8)","dd0702d6":"changeTeamPoolForFrozenTokens(address)","dd083f20":"teamPart()","dd0860a8":"IsOwner(address)","dd08b5c9":"disableRedemption()","dd090981":"setName(uint256,uint256,bytes32)","dd09de33":"soldTokensOnIco()","dd09e13c":"totalRegistrationBonusAmount()","dd0a1019":"isReserveGenerated()","dd0ac8ac":"HoldCrowdsale(uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,uint256,uint256,address)","dd0b1af5":"setMythexTokenAddress(address)","dd0b281e":"start(address)","dd0b7ffe":"setBuyNowPrice(uint256)","dd0c189c":"updateFirstExhangeRate(uint256)","dd0c42ab":"updateRequiredEntries(uint16)","dd0cf15d":"sendFund()","dd0cf7d4":"stopGuess(uint32,bool)","dd0d74ff":"IssueBank(address)","dd0e2373":"voterAddresses(uint256)","dd0e3902":"setData_6(string)","dd0e7832":"transferWithChange(uint256,address,address,address,uint256,uint256,bytes,bytes,bytes)","dd0f0808":"genEvent()","dd0f5a9a":"presalePiEnd()","dd0fa641":"winning_bets_total()","dd100efa":"getIcoEnded()","dd10d97e":"getPlayerWaiting()","dd11247e":"totalTickets()","dd114c22":"publish(address,uint256,address,uint256)","dd1219fd":"powerSwitch(bool)","dd12b51f":"getPermissionCheck()","dd137b5d":"toBase58(uint256,uint8)","dd13e20a":"forgeWeaponRarity(uint256,uint256,uint256,uint256)","dd13fd5f":"_acceptContribution(address,uint256,uint8)","dd14ab79":"updateTimestamp(bytes32,uint256)","dd151d1e":"pushAddressArray(bytes32,address)","dd155f3f":"removeAddress(uint256,address[])","dd15b66c":"MyWill(address,string,string,string,address,uint256,uint256)","dd15f993":"depositUSD(address,uint256)","dd16d981":"isCampaignValid(bytes32)","dd16fe09":"getCashBackObject(uint256)","dd17e151":"sendabr(uint256)","dd17eaec":"setMultipleRates(bytes32[],uint256[])","dd18b250":"getIdArray(address,address,string,string)","dd192de7":"affiliatesAddress()","dd193e7b":"addPerSell(uint16,uint256,bool)","dd1956b0":"InfiniviToken()","dd1a293a":"burnTokensFrom(address,uint256,uint256)","dd1a56a7":"WellnessToken()","dd1a5f0d":"_grandPVPLoserReward(uint256)","dd1a68c1":"report(uint16,uint16,uint8)","dd1aa549":"PARTNERS_WALLET()","dd1b1928":"getInputSize(uint256)","dd1b6137":"push(uint256,uint256)","dd1b7a0f":"nonFungibleContract()","dd1b89c6":"freezeExists(uint256)","dd1b9c4a":"POOL_FEE()","dd1bb3d1":"confiscateBalance(address)","dd1bb6f5":"TokenICOGAT()","dd1c35bc":"recycle(uint256)","dd1cdf84":"keybasePubURL(string)","dd1d5e64":"incGenLabFight(uint256)","dd1dbc3a":"calcUnMaskedEarnings(uint256)","dd1dc0ad":"RequestSale()","dd1dffb7":"getFundsCollected()","dd1e2651":"getUserKey(uint256)","dd1e4e11":"_getRandom(uint256)","dd1ee3d7":"whaleAddress()","dd1eee44":"couponTokenSaleAddr()","dd1f969b":"PURCHASE_AMOUNT_RATE_REFERENCE()","dd1fc642":"_approvedFor(address,address,uint256)","dd20a53e":"createTournament(uint256)","dd215410":"getWinnersIndex(uint256)","dd217ce1":"getAddusers()","dd218ff2":"addPreIcoPurchaseInfo(uint256,uint256)","dd21f395":"t_3rd_StageEnd()","dd22148f":"investedSumOnPreIco()","dd228801":"setAffiliateRate(uint256,uint256)","dd234dc7":"PixelBought(uint256,bytes32,uint256,address,address)","dd23795f":"bobMakesEthDeposit(bytes32,address,bytes20,uint64)","dd238603":"unsetWhitelist(address)","dd2407d3":"sendOnlyHash(bytes32)","dd242fa4":"staff_4()","dd253cd0":"setTransferMinimumFee(uint8)","dd2594af":"changeTokenApproves(uint256)","dd27efa0":"_packPVPData()","dd27fcad":"EternalCoin(uint256,string,string)","dd280c7a":"requestDetachmentOnPause(uint256)","dd288173":"doStore(uint256,uint256,bytes32)","dd28d12b":"ZILINGGOSupply()","dd28d14d":"getMembersInGroup(uint256)","dd294142":"institutionTimeLock()","dd2a07a0":"LCS()","dd2ac276":"genToLuck(uint256,uint256)","dd2ad311":"scheduleCall(bytes,uint256)","dd2bcae0":"DeviceIsDeactivated(address)","dd2c4d3d":"AdoptionRequestCancelled(bytes5)","dd2c888e":"balanceHistory(address,uint256)","dd2d2a12":"minimum(uint256,uint256)","dd2d4ea0":"tokensMain()","dd2e0ac0":"unlockToken(uint256)","dd2f4ebd":"getNumberOfGames()","dd300c6d":"getSettingChangeConfirmationCount(uint256)","dd301057":"noOfTiers()","dd3032bc":"RoundCHardCap()","dd30651f":"activateUser(address,uint256)","dd3129a9":"calculateAllBuyBackSum()","dd31f462":"clearDebt()","dd321018":"levelItemClass()","dd324fe7":"PieceStandardToken(uint256,string,uint8,string)","dd3260fc":"checkOpenTimer()","dd32858e":"withdrawWinner()","dd34abd3":"transferDirectorA(address)","dd34c9a3":"capFlex()","dd34dab8":"startTimeOfSaleLot4()","dd34e129":"PriceTest()","dd34e7be":"Vault(address,uint256,uint256)","dd365b8b":"pwn()","dd36b59c":"getPlanetOwner(uint256)","dd36e18b":"ContractStatus()","dd37be12":"mod(uint32,uint32)","dd3840ef":"PRIVATEPLACEMENT()","dd386239":"manuallySetNumRewardsAvailableForChildAddress(address,uint256)","dd397e03":"preIcoTarget()","dd3b014c":"getLatestVersion(bytes32)","dd3bd008":"getReadyTime()","dd3c407f":"_set7()","dd3ccd84":"percentForHelpCoin()","dd3d0bee":"changelp18(address)","dd3e5f47":"_sharesValid(uint256,uint256)","dd3ef6a6":"deathData_v12()","dd3f2893":"_processTokensPurchase(address,uint256)","dd3f8608":"FloatGameToken(bytes32,address)","dd3f9526":"_controller()","dd3fa136":"ship(string)","dd3ff4f6":"sendFeeToWallet(address,address)","dd413da0":"Vendi(uint256)","dd4198f4":"getScore(uint8,bytes32)","dd41cc2f":"getQuestionCount()","dd41e1c7":"redeemFrom(address,uint256,string)","dd420fc5":"auditorComment()","dd4253f7":"MeosunToken()","dd42c228":"totalLockedFund()","dd42faf7":"window3TokenExchangeRate()","dd4314b2":"unique_players()","dd443c7b":"cancelMarkets(uint256)","dd449a83":"allower()","dd44a15c":"allocateTokensForContributor(address)","dd450d4e":"transferFromBankToAccount(bytes32,uint256)","dd457c7f":"balancesSet()","dd45e247":"getUserListSize()","dd462e2d":"withdrawAmountHashing(uint256,uint256)","dd467064":"lock(uint256)","dd473d2b":"withdraw_all()","dd47fe15":"sendToTarget(address,address,address,address,uint256)","dd48087f":"balanceOfContract(address)","dd486c35":"ownerWantMyEther()","dd489e44":"setSystemStartingPriceMin(uint256)","dd48d911":"totalSellOrders()","dd49756e":"depositTokens(uint256)","dd49f1c8":"BooMToken()","dd4a055b":"buySale(uint8,address)","dd4a8361":"setWhitelistEntries(address[],bool)","dd4a8f61":"contractorManager()","dd4aac73":"SELLER_STEP_2_GET_PASS()","dd4aeb92":"manageMinting(bool)","dd4bc101":"weightOf(address)","dd4bd4b7":"getProjectMilestoneStartWindow(bytes32)","dd4c97a0":"approveNode(address)","dd4dfb62":"kUnit()","dd4e6993":"leerGat()","dd4e8823":"poiLockup()","dd4f1f2a":"multipleHomocide()","dd4f5f0f":"withdrawBBO()","dd4f8f74":"roundStartTime()","dd506e09":"changeRound()","dd50e9d4":"clearSummonNum()","dd510361":"setTransformTarget_pool(address,uint256)","dd5108d1":"addressToTotalDonationAmount(address)","dd510e98":"newLockUpAddress(address)","dd515cdb":"checkVotingForStartPayment()","dd51faa2":"setGas(uint256)","dd523559":"devuelveAddressUsuario(bytes32)","dd5244b4":"testTryProxyCallWithValue()","dd53c301":"mintContract(address,address,uint256)","dd54291b":"tokenCap()","dd54a62f":"content(string)","dd54cc0c":"advBtyWallet()","dd550958":"getOwnerAddress(uint256)","dd55f11b":"deleteCitizen(uint256)","dd55fba0":"createSecondPromoCollectible(uint256,address,uint256,address)","dd563726":"GoingGems(uint256,address)","dd57d5c5":"setTrust(address)","dd585e7b":"newincomelog(uint256,string)","dd5891b3":"join(address,string,string)","dd58f5d9":"isIcoFinish()","dd592a32":"topUpAmount()","dd595328":"untransform(uint16)","dd59c954":"mintBatch(bytes32,bytes32,bytes32,bytes32,bytes32,address)","dd5a4efd":"GameRefunded(uint256,uint256,uint256)","dd5a7f40":"getContractCreationTxGasprice()","dd5ac448":"payoutReferrer()","dd5b23df":"transferBond(address,uint256)","dd5b29b7":"toB32(uint256,bytes)","dd5c2678":"KappyKoin()","dd5ca673":"setMintRequestStringMap(uint256,int256,string,string)","dd5cba71":"CHXTokenSale()","dd5dcd52":"findActiveRange(address)","dd5dd552":"_cancelOrder(address)","dd5dd8f2":"timeGap()","dd5ddfe8":"setPermission(address,uint8)","dd5df59c":"nonEtherBuy(address,uint256)","dd5e403c":"IcoFund()","dd5e8410":"jackpotMedium()","dd5ea752":"burnAndConvertToQUA(uint256)","dd5f63fd":"niceguy3()","dd5f9a22":"STSTEST5()","dd604fcb":"EgyptianPound()","dd60b394":"giveFreezePermission(address[],bool)","dd60c898":"participantsCount()","dd611e8d":"Setter(uint256)","dd616a45":"ZeroCap()","dd62b1a0":"LalaToken()","dd62ed3e":"allowance(address,address)","dd62f6f3":"getPayoutDistributionHash()","dd63133a":"onPurchase(uint16,uint16,uint8,address,uint256)","dd63f7d0":"functionReturningValue(bytes32)","dd644f72":"basisPointsRate()","dd66111d":"gameRoundEnd()","dd67a360":"OrderLifeCycle()","dd681e51":"ecosystemGrantsReserveWallet()","dd68b386":"TransactionRefundedAfterExpiry(uint256,uint256)","dd6996a3":"LOL3()","dd6ad764":"withdraw(uint8,address)","dd6afdfe":"Chou(uint8)","dd6b2fc6":"isBarCodeData(bytes32)","dd6b996d":"endDividendPool()","dd6c1394":"GazeCoinCrowdsaleWhitelist()","dd6e66d0":"tokenHoldersTotal(address)","dd6e8e6a":"_markRedemptionFulfilled(bytes32)","dd6ed59a":"initSubPayees(bytes32,address[],int256[])","dd6f0f19":"ApplicationIsInDevelopment()","dd719d2c":"airDrop(address,address,address[],uint256[])","dd722127":"adminRemove(address,string)","dd7221e8":"LogPause(bool)","dd727ea6":"runJackpot()","dd729530":"add_shield(uint16)","dd72ae4e":"availableICO_w1()","dd73d17b":"getComment(address,address)","dd751310":"isRegisteredPublicKey(uint256)","dd75e7ff":"getENow()","dd75ecce":"getVestingAmount(address,uint256)","dd76d2fa":"setIdArray(address,uint256,string,string,address[])","dd787875":"setupSale(uint256,uint256,address)","dd791ce5":"tokenDec()","dd796b07":"indexOfCardAddress(address)","dd79cc6a":"secretBidCount()","dd79e33e":"splitIdentifiers(string)","dd7a1722":"accountLocked()","dd7aabc8":"_transferHelper(address,uint256)","dd7b3e97":"buyoutsEnabledFromTimestamp()","dd7b3f26":"bytes32ToBytes(bytes32,bytes32)","dd7bff82":"removeCandidates()","dd7d168a":"getEthBullet(string)","dd7d6bb0":"getLpAskPrice()","dd7db870":"addFreeVineyard(address)","dd7dde04":"maxTeamSize()","dd7e11be":"InternationalPaymentToken()","dd7eba7a":"ValentineRegistry()","dd7f2225":"MiCarsICO()","dd7f88ee":"date_start()","dd80f2a6":"Vibrancier()","dd817963":"lastBlock_f0Hash_uint256()","dd819721":"setNFTbyTokenId(uint256,string,bool)","dd838808":"endMigrationPeriod()","dd83a303":"cancelMortgage(uint256)","dd83c825":"backersAddresses()","dd8432fe":"getRemainingTokensForSale()","dd847dfe":"get_contract_money()","dd84acaa":"addressesAllowed(address)","dd859739":"SetBeneficiary(string,string,string,string,string,string,string,string,string,string,address,string)","dd85b1dd":"setServiceProvider(address)","dd85b82e":"EthealWhitelist(address)","dd8617ca":"payether(address,uint256)","dd86210a":"medalSymbol()","dd864883":"changeApprovalCore(address,uint256,uint256)","dd86f719":"COMMUNITY_BOUNTY_HOLDER()","dd87c9f0":"exeStatus()","dd897767":"isRealWorldPlayerMintingEnabled(uint128)","dd898fa2":"MinterStorePoolCrowdsale()","dd89daa5":"getBBFarmID(bytes4)","dd8a0c56":"vacate(address)","dd8ad12a":"executeAppReturn(bytes32)","dd8b0ff6":"rmax(uint128,uint128)","dd8bd8cb":"Patient(address)","dd8bf1f5":"setDistrict0xNetworkToken(address)","dd8c8855":"addWarehouse(uint256,uint256,bytes32)","dd8d11e2":"isValidSubscription(bytes32)","dd8d149d":"tokenCrowdsaleRate()","dd8d1cef":"totalUserCampaigns(address)","dd8d4c40":"getCallers()","dd8e668c":"FUND_FRAC_BOT()","dd8ee602":"log(bytes,uint256)","dd8ef66b":"cancelTrade(address)","dd8f3195":"HyperChipsToken()","dd8fee14":"regulator()","dd905097":"organisationWallet()","dd90c403":"getAccountFeed(address,uint256,uint256)","dd9180ea":"tokenReservationAllocated()","dd91f1f5":"toggleAuthorization(address,address,bytes32)","dd924594":"distributeAirdrop(address[],uint256[])","dd92a8b0":"confirmSell(uint256)","dd932c5b":"voteEnd(uint256)","dd93890b":"setMeta(uint256,bytes32,bytes32)","dd93c74a":"setInactivityReleasePeriod(uint256)","dd946033":"right81(uint256)","dd952089":"getTaxDataSignatures()","dd9546b1":"minInvestments()","dd9555f1":"withdrawBidForCollectible(uint256,uint256,int256)","dd955c44":"sellEth(address,uint256)","dd955d4c":"rawTransfer(address,bytes32)","dd9568b0":"messageInfo(uint256)","dd96440e":"DDD()","dd967b0b":"refundLoan()","dd9815a2":"claimPlayerProfit()","dd982bdf":"FaceBookCoin()","dd999ade":"cleanUpRounding()","dd9a76ff":"pay(address,address,uint256,uint256)","dd9a9e2c":"CORReserveAccount()","dd9bc47e":"finish(address,address)","dd9bf998":"authorizeTradingAccounts(uint256)","dd9bfb04":"bakanceOfBeer(address)","dd9cfc4b":"tokenSalesByAsset(address,uint256)","dd9d687e":"namehash(bytes32)","dd9dd688":"calcStopPrice()","dd9e3848":"NewHolder(address)","dd9e4094":"makeMemChange1(uint256,uint256,uint256,int256)","dd9e7b1b":"max_raised_amount()","dd9ea299":"getLastDepositId()","dda0268d":"queryBetUnit()","dda0c1d6":"adminAmendBallot(uint32,string,uint256,uint256)","dda0e4ba":"finishAllGames()","dda0f1bb":"sendToTicker()","dda13903":"GoldOwner()","dda2d923":"setIcoAddress(address,address)","dda3342b":"ReplicatorFactory()","dda342bb":"list(address,uint256,uint256)","dda38380":"CFTRAD()","dda3baff":"showlevel(address)","dda44b10":"buyRecipient(address,uint8,bytes32,bytes32)","dda477fd":"walletTransfer(address)","dda4fa8f":"setReserveWallet(address)","dda5062c":"userIds()","dda51424":"right80(uint256)","dda55b18":"GxTraders(address)","dda5d5cb":"saosao2()","dda5d799":"PRT()","dda6020b":"freezeMintUntil()","dda61c00":"getIsSecurityWalletReg(address)","dda63359":"setSellToContract(bool)","dda69410":"add(address,uint16,uint8,uint8)","dda6abb8":"sendToVestingContract()","dda6c3ce":"checkWinning(uint256)","dda72292":"BONUS_TIER_6_LIMIT()","dda81c15":"TIER_4_BUYIN()","dda89912":"setExchangeDetails(bytes32,bytes32)","dda943d6":"maxSet()","dda9939c":"Store(address[])","dda9f1a3":"HODLRegistration()","ddaa26ad":"START_TIME()","ddaa4c48":"granularPreallocate(address,uint256,uint256)","ddaa7e02":"GetTickSize3(uint256)","ddaaff27":"generateSection()","ddac6654":"validUntil()","ddad2ffe":"newNode(address)","ddad3ca1":"tokenMaxCap()","ddae2e26":"__save128(uint256[])","ddafaf4d":"reclaimNtvuEther(uint8)","ddb12a35":"countPayOrder()","ddb141c2":"execute_transfer(uint256)","ddb1bdc8":"credit(address,uint256,uint256)","ddb1ede9":"canceledBookingfc(uint256)","ddb22537":"withdrawDeadBids()","ddb25d71":"GBPproxy()","ddb31cea":"TEAM_TOKENS_LOCK_PERIOD()","ddb4897a":"NitroCoins()","ddb49f98":"SpiceNinja()","ddb5b3ac":"SellTokens()","ddb62333":"readTaskState(string)","ddb6af4c":"setTimeStamp(uint256,uint256)","ddb6e116":"vote(uint16)","ddb72188":"chAirDropLimit(uint256)","ddb792a0":"admin_from_To_transfer(address,address,uint256)","ddb863be":"multiPartySend(address[],uint256[],bytes)","ddb8b099":"itemNameOf(uint256)","ddb8f090":"GlobalTransfersUnlocked(bool)","ddb9341b":"SetBuildingDataArray(uint256[])","ddb9769c":"_settingsApplied()","ddba8c45":"verifyEscrow(uint256,address,address)","ddbb4ab4":"_bytes32ArrayToString(bytes32[])","ddbbc35c":"searchByName(string)","ddbcb5cb":"registerAs(address,bytes32,address)","ddbcb5fa":"MIN_AMOUNT()","ddbcf3a1":"ensNode()","ddbdf242":"traders()","ddbe7c41":"NeverEndingApp()","ddbe8f09":"voteEnd()","ddbe92d3":"setBondFundAddress(address)","ddbf5856":"completeLottery()","ddbf5c8f":"checkFee(uint256,uint256)","ddbfbdbf":"ETHERKUN()","ddbfd63e":"AddGoods(uint32,uint32,uint256,uint32,uint32,uint32,uint32,uint8,uint8,uint8)","ddc002e8":"TokenSold(address,uint256,uint256,bool,bool)","ddc0db14":"AmountBonusPricing(uint256[])","ddc12019":"_triggerCooldown()","ddc23059":"SchemeRegistrar()","ddc23ddd":"erc165InterfaceSupported_NoCache(address,bytes4)","ddc33450":"MNLTGUNE()","ddc35950":"setOwner(uint32,address)","ddc3e344":"_sellPutToClose(uint256,uint256,uint256,uint256,address)","ddc4aacf":"token4Gas()","ddc53c2c":"lastFreeBlock()","ddc541dd":"publisher(address)","ddc63262":"harvest(uint256)","ddc645f8":"CollateralReturned(uint256)","ddc6a171":"allowance(address,uint256)","ddc6f83e":"setIdent(string)","ddc6ffaa":"SecuredLedgerToken()","ddc86af6":"extractById(int128)","ddc8bb54":"PriceOf1000TokensInUSD()","ddc8d7a6":"_removePauser(address)","ddc983f2":"bonusEnds50()","ddca15de":"ServiceContract()","ddca337e":"SetMaxChequeValue(uint256)","ddca3f43":"fee()","ddcb1a94":"serviceBurn(uint256)","ddcbf794":"addScore(uint256,uint256)","ddcd3681":"getRemainingTrialDrops(address,address)","ddcd7ee9":"lastJson()","ddcd8763":"requestBuywithETH()","ddcd887b":"testMiddleTranchNotExact()","ddceafa9":"recovery()","ddcfa217":"newRecurringBillingContract(address)","ddd1002e":"LogStart()","ddd113f4":"numMarriages()","ddd1527b":"transferFromOwner(uint256)","ddd1b67e":"getCurrentMonth()","ddd35de8":"tokensPerBTC()","ddd41ef6":"transferDirector(address)","ddd505f6":"addTransaction(address,uint256,uint256,string,uint256,bytes)","ddd53cc5":"setupICOPrices(uint256,uint256,uint256,uint256)","ddd57872":"setTimeStamp(string)","ddd5e1b2":"claim(uint256,address)","ddd5e68b":"transferEthersToOwner(uint256)","ddd641b0":"tierName(uint256)","ddd6d79a":"remainingWithdraw()","ddd7c879":"claimWei(uint256)","ddd81f82":"registerProxy()","ddd83259":"_normalDistribution(uint256,uint256)","ddd9537d":"getUsdEthExchangeRate()","ddda66db":"setMerchantWallet(address)","dddac167":"VotingFinished(uint256,uint256)","dddaf901":"wcapToken()","dddb983b":"testFailCreateWithParentsForeignNotInUse1()","dddbb753":"getAdsCount()","dddd3594":"ConsentDirective(address,uint256)","dddd3de8":"getvalid()","dddf31f1":"lastClaims(address)","dddf33cc":"offerCatForSale(uint256,uint256)","dddfb2f2":"buyEIT()","dddff84c":"StandardCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","dde0523f":"changeVisitCosts(uint256,uint256,uint256,uint256,uint256,uint256)","dde05a67":"TinaCoin()","dde070e8":"getClaimAmount(address)","dde0d085":"mathTransfer(address[],uint256)","dde107c2":"stampIndextotransactions(uint256)","dde1589c":"icoTokensPrice()","dde26ec9":"createGrant(address,uint256,uint256)","dde27e29":"distributeTokens2(address[],uint256[])","dde2b332":"setTransferFrozen(bool)","dde2fc22":"DLCToken()","dde37357":"MultiOwner(address[],uint256)","dde3ae6d":"changeAssetOwner(address)","dde41aa9":"canonizedRegistry()","dde42067":"paidTokensOf(address)","dde43cba":"REVISION()","dde49979":"unlockFor(address)","dde4a70b":"getSell(uint256)","dde4dc8e":"Show_Patient(uint256,uint256)","dde4f41a":"releaseMultiWithStage(address[],address[])","dde5a65d":"purchase(address,address)","dde68e2e":"refundETHToCustomer(address,uint256)","dde6b340":"calculateLoanerInterest(uint256)","dde6e256":"getCarProduct(uint32)","dde6f449":"GlobfoneCoin()","dde6f484":"setMainAccount(uint256,address)","dde7af32":"warriorGold()","dde82c2d":"coinsRemaining()","dde8535f":"getMemberStatus(address)","dde8c8d6":"getUserVote(uint256,uint160,bool)","dde8dab2":"BEERCOIN()","dde9394c":"returnOwners()","ddea6df3":"isHumanToken(address)","ddeae033":"claimFor(address)","ddeae8ca":"markDone(uint16)","ddeb5094":"pause(bool,bool)","ddeb63b5":"setEscrowAddress(address)","ddec280e":"fetchAssetPrice(address)","ddec60d9":"Parents()","ddecc5d9":"getTradingTime()","dded49cb":"setadmin(address)","dded5dd8":"isAdminForGame(uint256,address)","ddedfc19":"TheLightToken()","ddeed1a4":"projectFailed(uint16)","ddef6421":"adventureContract()","ddef880f":"getDeepInfo(uint256)","ddef8f29":"HOTTO()","ddefdb90":"fillOrKill(address[5],uint256[6],uint256,uint8,bytes32,bytes32)","ddf0432f":"startPresale(address,uint256)","ddf063c8":"collectedEth()","ddf08ebc":"checkCaptain(address,uint32)","ddf09e89":"NelsonChenTestToken()","ddf0c070":"addBalances(address[],uint256[])","ddf187b0":"dogFight()","ddf1be5f":"setIII_R1(uint256)","ddf252ad":"Transfer(address,address,uint256)","ddf25ce9":"renExBalancesContract()","ddf27259":"LogCertificationDbUnRegistered(address)","ddf29872":"teamvalue()","ddf2d8cd":"setDesignatedReportReceivedTime(uint256)","ddf31394":"lockToken(address,uint16)","ddf33cc7":"TEAM_TOKENS1()","ddf34ab0":"getAgreedCompletionDate(bytes16,address,address,uint256,uint256)","ddf41bf4":"migrateHolders(uint256)","ddf4a032":"changeSettings(uint256,uint64,uint8,uint8,uint8,uint8)","ddf4b011":"TIME_UPDATE(bytes32)","ddf5cc29":"ActivationWithdrawal(address[2],uint256[8],uint256)","ddf6e5a0":"GEN_0_LIMIT()","ddf7e1a7":"tokenToTokenSwapInput(uint256,uint256,uint256,uint256,address)","ddf9d613":"getCustomBuyerLimit(address,address)","ddfa3a60":"getCrystalWeights()","ddfa53e4":"hardcapInWei()","ddfafa96":"getRates(address,uint256)","ddfb8b9b":"Start_quiz_qz(string,string)","ddfc50df":"setByte(bytes1,bytes8,bytes32)","ddfd72f8":"setHashByWriter(bytes32,address,bytes32)","de002aa6":"pushWork(uint256)","de0099a3":"heldTokens(address)","de009e7f":"offerToChannel(address,uint256)","de00a094":"controlled()","de0123bf":"AddMultipleAddresseseToWhitelist(address[])","de01ec28":"setStateMigrated()","de024515":"DEMT()","de02ae96":"bytes32ToBytes(bytes32[],bytes32)","de02f1fc":"PER_ACCOUNT_ADDITIONAL_TOKENS()","de0498d3":"Date_Started()","de05905b":"doSetName(bytes32)","de06b7f4":"doTakerPayment()","de06ef49":"whaleStartTime()","de07a886":"DEFROST_MONTH_IN_MINUTES()","de080401":"SethTokenPurchase(address,address,uint256,uint256)","de089aee":"userMaximumPurchaseAmountNg(address)","de08a6d8":"metaTransfer(address,uint256,bytes,uint256,uint256)","de08c364":"removeAdminister(address)","de08f188":"storageStep()","de090b25":"LockInExpiry()","de0a1c5d":"changeVuePayETHDestinationAddress(address)","de0a7cc6":"purchasedTicket(address)","de0b18f2":"getAssetAttachment(uint256)","de0b5af2":"BONUS_COEFF()","de0bffc2":"GlobaLiquids()","de0cf58b":"callerAllocationStartBlock()","de0d0802":"getWeightAndUpdate(address)","de0d50e4":"incGen0PresaleCount()","de0d7083":"Alter_MediatedTransaction(uint256,bool)","de0e9a3e":"unwrap(uint256)","de0f2b49":"setCertifierStatus(address,bool)","de0f725d":"removeContract(address,address)","de0fe922":"addHashType(string)","de0ff7c5":"getEther()","de1079b3":"vestFromTime()","de10f04b":"eraseNode(bytes32[])","de117fb1":"buyDirector(uint256)","de11823a":"GoldAllocation(uint256,uint256)","de11892b":"isAuthorized(address,bytes32)","de11c94a":"factoryContract()","de121554":"addLike(uint256,bool)","de12b52c":"getTopBlock()","de12b839":"GetPie()","de13bec6":"getApiByName(string)","de1446e8":"view54()","de14bbf7":"randomGen(uint256,uint256)","de14c818":"approvePayment(uint256)","de14d323":"confirmAlice(uint256)","de14e54d":"setActivity(address,bool)","de150d5d":"throwSlammer(bytes32,bytes32,bytes32)","de154352":"getBlocksTillMattew()","de154761":"upgradeManager()","de1565fe":"MainnetProtocol()","de1682a5":"PTLC()","de170570":"getTiers()","de176643":"_advisorsSupply()","de179108":"allSaleCompleted()","de17dfa9":"setCryptaurToken(address)","de1881a8":"processingFee()","de18af92":"getEmployerInvoices(address,uint8)","de18bec6":"BeneficiaryChange(address)","de18dd18":"refuseSale(address[])","de192a20":"ARChain(uint256,string,string)","de1955df":"reclaimByReceiver(address,bytes32)","de1ac2fd":"checkOperator(address)","de1b0486":"withdrawFrom(address)","de1b27f5":"SALE_ALLOCATION()","de1bee1b":"dogexSupply()","de1c237f":"getarg_2_input()","de1c78fb":"batch_send(address[],uint256)","de1c7f70":"getEns(address)","de1c977a":"testPreDistribute()","de1e46e6":"placeBet(uint256,uint256,uint8,int256)","de1e8de8":"MINIMAL_INVESTMENT()","de1eb2d0":"withdrawQuantity()","de1f892a":"adjust_ERC223Transfer(bool)","de1ff163":"isCurrentOrPastAccountReader(address,address)","de2037a7":"createSensor(uint256,uint256,uint256)","de20555f":"getGoldStatusCustodianverify(address)","de20bc92":"Stake()","de2111e2":"got()","de217625":"setAssets(address[])","de2184bf":"voting(address,uint256,string)","de21cd78":"allItems(uint256,uint256)","de21dc6f":"fundit(address)","de2237d3":"getVotersLength()","de223f63":"transferPauseOperator(address)","de242ff4":"allowance()","de24d3ba":"WEBCOIN()","de255778":"relocationActive()","de26bbb2":"percentage(uint256,uint8)","de271ee0":"depositAngelInvestmentEth()","de272835":"advisorIssue(address,uint256)","de2831f2":"getRemainingBonus()","de283b21":"current_transferred()","de28431c":"priceLastUpdate()","de287359":"acl()","de28ba54":"MorpheusTokenFAKE()","de28fc1d":"icoSender()","de2904de":"CapUpdated(uint256,bytes32,uint256)","de292789":"getResult()","de2994c4":"unfreezingTimestamp()","de2a4a43":"RLLToken(uint256,string,string,address)","de2a9778":"createProxy(address,address,uint256,uint256,uint256,uint256,uint256,address,uint256,string,uint8,string,bool)","de2b2cd2":"changeDonor(address)","de2b4473":"setSaleDepositsAllowed(bool)","de2c1d09":"SendERC20ToDex(address)","de2c1e85":"_packWarriorCommonData(uint256,uint256)","de2e6136":"sendGift(address)","de2ed893":"totalDonations()","de2f827e":"saveChickenOf(address)","de301e8c":"getRTEBonusTokenVaultBalance()","de306341":"createMineForToken(uint256,uint256,uint256,uint256,uint256)","de31482a":"tokenHasDistributed()","de318242":"Mani()","de326c1e":"movePatentData(uint16[],address[],uint256[],bool[],uint256[],uint256[],uint256[])","de329396":"ownerSetMaxProfit(uint256)","de33d8d8":"Print(string,address)","de341661":"unpause_2()","de346a40":"whiteListERC20(address)","de34bacd":"cardPrice()","de35a696":"Child(string,address)","de35be81":"submitSellOrder(bytes32,uint256,uint256)","de377015":"maxIcoTokensSold()","de37ca12":"MyFirstSmartContract()","de37e977":"thisTokenBalance()","de38460b":"nextSaleAgent()","de3849be":"owner_AirdropUpdateToken(address[],uint256)","de385438":"calculateEmission(uint256,uint256)","de38a5f4":"verifyKYC(bytes32,bytes32,bytes32,bytes32,bytes32)","de38c771":"setFundingAmount(uint256)","de38eb3a":"MAX_TIMEOUT()","de3989f5":"CalledA()","de39acea":"get32(bytes,uint256)","de3a8511":"teamKeepingSupply()","de3ab731":"evaluateAfterQuery(bool,uint256)","de3b5061":"updateBuyType(address,address,int256)","de3b653a":"IsReleaseToken()","de3bcb97":"takeAll()","de3bec59":"baseowner()","de3d0290":"gwtoken(uint256,string,uint8,string)","de3dac84":"freezeAccount(uint256)","de3ea04a":"SAGAToken()","de3f18e2":"winningTeam()","de3f26eb":"oracleRegistryContract()","de3fbdee":"addRate(uint256,uint256)","de400629":"createListingWithSender(address,bytes32,uint256,address)","de4125b0":"addWineryOperationEndorsement(string,uint256,bool,string,string)","de4138de":"getCurrentStateId()","de41e1a1":"assignOwner(address[],uint256,address)","de42dcc9":"LuckCashToken(uint256)","de42f045":"auditTimeoutInBlocks()","de43844b":"fixedExp(int256)","de44a17e":"setNewModifier(address)","de44bf01":"getCreateUniverseParentUniverseValue()","de459c9b":"RATE_SALESTAGE6()","de469071":"hashBetSum()","de47864c":"testSafeAdd(uint256,uint256)","de47e0bf":"withdrawBaseETH()","de48ff52":"updateState(int128,uint128,uint8,bytes32,bytes32,bool)","de494190":"getCommentIdByAd(uint256,uint256)","de49bd54":"BurnTokensAndSetAmountForNewBlockchain(address)","de4b3262":"setBasePrice(uint256)","de4b3a73":"defaultText()","de4b4073":"devSend()","de4b45fa":"finalizeReclaim()","de4c0574":"migrateAllowancesFromLegacyRep(address[],address[])","de4cd094":"convertToDecimal(uint256)","de4d51a5":"setSaleType_Airdrop(uint8,uint8,uint32,uint8,int256,uint256,int256)","de4f4d2b":"totalEthHandled()","de4f9383":"transferEtherFrom(address,address,uint256)","de5007ff":"sweepMsg()","de50f2fe":"KycClaveChain(address)","de5101af":"timestampToDate(uint256)","de51f57e":"setValueStep3(uint256)","de52ccbe":"NGX()","de530bbb":"EMISSION_FOR_SALESTAGE4()","de534744":"tokenDistribution(address,uint256)","de563b89":"removeRatio()","de56a245":"editionOptionalCommission(uint256)","de571e48":"getCollectedAmount()","de575a02":"dismissRoom(uint256)","de576c8a":"CREATED_STAR5()","de5785d5":"feesAvailableForWithdraw()","de578a90":"ApodTokenContract()","de57e8b4":"releaseEscrow(bytes16,address,address,uint256)","de583ed3":"_improveCard(uint256,uint256,uint256)","de5866f9":"s19(bytes1)","de589fa9":"TokenLongExercised(address[2],uint256[8],uint8,bytes32[2],uint256,uint256)","de58d156":"createAsset(string,string,string)","de5990ca":"INTREPID_VOUCHER_LIMIT()","de59a5cb":"SaleClockAuction(address,address,address,uint256,uint256)","de5ac86d":"createWager(bytes32)","de5b71f7":"distributeReward(address,uint256,uint256)","de5b9987":"getUnitDefenseMultiplier(address,address,uint256)","de5b9e4f":"BitMEDSmartToken()","de5bb5a2":"nEdits()","de5c995e":"Y2_lockedTokenReleaseTime()","de5cb7ed":"DutchAuctionPoD()","de5cf247":"giveTokens(address,address,uint256,string)","de5d953a":"logSingleIndex(bytes,bytes,uint256)","de5da0cf":"nextGiftId()","de5dc6c8":"tokenCapped()","de5dead6":"reduceInventories(uint256,uint256,uint256,uint16)","de5e21df":"timerStart()","de5e7ac4":"getOutcome(address)","de5eaa83":"donate(uint8,bytes32,bytes32)","de5eeb6e":"preICOAddress()","de5f3ec6":"buy10Price()","de5f5517":"lad(bytes32)","de5f72fd":"faucet()","de5f9866":"getTokensLeft()","de605ecc":"changeSettings(uint256,uint256,uint32)","de60a67d":"maxCapIco()","de620676":"_sellprice()","de622de4":"tgeStarted()","de62319c":"IQT_CONTRACT_ADDRESS()","de625d1f":"totalReceivedWei()","de628e3b":"tokensCalculator(uint256,uint256,uint256,uint256)","de629235":"getCertificationDocumentAtIndex(address,uint256)","de637901":"poptxs(address,uint256)","de63dc35":"setPartnerFromPreICOAffiliate(address[],bytes32[],uint256[])","de640e19":"Investment(uint256)","de642b5a":"cbdc(uint256,string,string)","de644ebd":"firstMintRound0For(address[],uint256[],uint8[])","de648b87":"setSKLContractAddress(address)","de656b71":"BecomeSnailmaster()","de658979":"_updateCompany(bytes32,bytes32)","de6595b2":"WhitelistedUpdated(uint256,bool)","de65da20":"purchaseGame()","de661217":"left75(uint256)","de667e70":"setBuyer(uint256,address)","de66b5f7":"unidentifiedSaleLimit()","de66ed0d":"getTargetReporterGasCosts()","de6746a5":"founders(address)","de6764ba":"Swanroll()","de67fd05":"deleteLayer(uint256)","de683a7d":"change(address,uint256,address)","de68c43f":"noFee(address,address,uint256)","de6a1b19":"landmarkPoolTotal()","de6a9d83":"CheckResultCalled(bytes32,address)","de6ab39c":"INITIALSUPPLY()","de6b8a2e":"getOrderLength(address)","de6b978d":"POA20(string,string,uint8)","de6baccb":"transferWithLock(address,uint256,uint256)","de6bd0e8":"redistributeEthForAddresses(uint256,address[])","de6c4f4b":"reset(address,address,address,address,address,address,address)","de6ca3f0":"_setCommit(uint256,address,bytes32)","de6cdd2e":"getExchangeInfo(bytes32)","de6eb4be":"NBAONLINE()","de6ed7dc":"GoldIssueBurnFee(string)","de6ef007":"amountTokensPerEth()","de6f24bb":"sendMessage(address,string)","de7086f6":"TemplateToken()","de70b36c":"RevokeViewingPrivelege(address)","de718e3f":"initialWeiRais(uint256)","de71c467":"presentObject(bytes,bytes32)","de71d56b":"getStandartComponent(uint256,uint256)","de72a01d":"Agt()","de72b83d":"totalBountyAmount()","de72cab0":"finishBonusPeriod()","de733397":"allowClaiming()","de7337a1":"changeFloor(uint256)","de7383e0":"handleTokensReceived()","de742c2d":"getFreeAlien()","de74880c":"platformUnfreeze()","de74e57b":"listings(uint256)","de750f6f":"getNine(uint256)","de758458":"IPFSProxy(address[],uint256,uint256)","de75c36e":"addressMasterNodes()","de763a40":"getEtherFeeForPriceInCandy()","de77229f":"MinterOwnershipTransferred(address,address)","de77743d":"needsbeneficiary(uint256)","de7874f3":"plyr_(uint256)","de78be15":"onSoftCapReached(uint256)","de78e78a":"tokenLaunched()","de78ed85":"actual_balance(address)","de795edd":"prova()","de79fb92":"UKTTokenVoting(uint256,bytes32[],address[],uint256[])","de7a5956":"getWinnerTeam()","de7ae335":"WithdrawDividendsAndCouponsTo(address)","de7b1a77":"finalizeTokenSaleManager()","de7b24b8":"ICOFailed(uint256,uint256,string)","de7b89bd":"GetUserExtraData1(address)","de7bea74":"getThreshold(uint8)","de7c2ed2":"TEAM_VESTING_DURATION()","de7c99c3":"releasePrivateBonusTokens(address[],uint256[])","de7cb327":"Proof()","de7d4fc4":"getGameNumber()","de7dd576":"etherPriceInPoundPences()","de7fe3e7":"getItemInfo(uint256)","de803198":"setFunderSmartToken(address)","de80344d":"startStage(uint256,uint256,uint256,uint256)","de80b0a5":"promo()","de812733":"createBaby(uint256,uint256,uint256,uint256)","de81333e":"claimHeldBalance()","de815e61":"FourArt(address,address,address,address,address,address,address,address,address,address,address)","de81aaaa":"hardCapUSD()","de821a35":"_updateGenerationSeasonFlag(uint256,uint8)","de8248fb":"FEE_PERMILLE()","de824f93":"TimeLeft()","de82b54d":"cancelSellToConsumer(address)","de82efb4":"gimme()","de831ee7":"changeMinTransfer(uint256)","de840f11":"NassauToken()","de850c71":"dequeueAlternately()","de852afe":"revokeAccessDeploy(address)","de854065":"Portfolio(address)","de85a4a9":"tokenIssuedMkt()","de866db1":"buyContract()","de86ba28":"_addMintedTotallyByBridge(uint256,address)","de874962":"EOS_Silver()","de8801e5":"presaleStart()","de887bba":"getSecretBet(address)","de889d50":"refundWallet(address)","de88a342":"payDividends()","de894d3a":"_transferDividends(address,address,uint256)","de8a1c2e":"OMIToken()","de8a6fa2":"baseEthCapPerAddress()","de8b1d5c":"createCustomPresale(uint256,uint256,uint256,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","de8b888e":"freezeTokenTransfers()","de8ba6d1":"getAndDel(bytes32)","de8bb64f":"TEFC()","de8bf3b6":"noRoundMiniGame()","de8c85ea":"operationToken()","de8f50a1":"verify(bytes,bytes,bytes)","de8f55af":"dailyDistribution()","de8fa431":"getSize()","de901104":"setLLV_edit_15(string)","de9122f7":"wipeAttributes(string,bytes32[])","de917978":"SafecontractsTREXFund()","de91af7b":"totalPoolCap()","de91bb10":"CardManger()","de92af4b":"LongBought(address[2],uint256[3],uint256)","de931662":"callToken()","de934416":"balancePrivate(address)","de934d86":"BOT_ELEMENT_1()","de9364f4":"testFailBurnGuyWithoutTrust()","de940c29":"renounceOwnershipForever(uint8)","de942e62":"getLLV_edit_6()","de944520":"getBurnAmountApproval(address,address)","de9476dd":"addNewAirdrop(string,uint256,uint256,address,uint256)","de94b800":"backToken(address,uint256)","de957cf4":"setChunkSize(uint256)","de9652b1":"getcoinSortinglength()","de96587e":"removeAmbassador(address)","de96e823":"StarbaseCrowdsale(address)","de981f1b":"getContract(uint8)","de98bc4f":"LogMintingStopped()","de990bda":"etherMaximum()","de995b90":"sendOwnershipFrom(address,address,uint256)","de998dd0":"_affiliateProgramIsActive()","de9a1bdb":"MyToken(string,string,uint8,uint256)","de9b33f9":"getWithdrawNonce(bytes32)","de9b9364":"max_investment_eth()","de9d0e85":"_setPendingAnchor(address,uint256)","de9daf91":"setEmissionLimit(uint256)","de9db5d3":"projectShare()","de9eade3":"totalInitialAddresses()","de9ee13e":"calculateMaximumPayment(address,address)","de9f28e4":"getJobTotalSkills(uint256)","de9f4248":"identities()","de9f57f5":"LogBroker(address)","dea011f5":"updateService(address,address)","dea01b3e":"removeOneSecret(bytes32)","dea06188":"NumberOfBlockAlreadyMined()","dea09ef3":"takeFee(address,address,address,uint256,uint256)","dea0a837":"SetParticipantURL(address,address,string)","dea0cbd7":"viewMaxGasPrice()","dea1bd69":"setValidity(uint256)","dea216af":"nestedSecond(uint256)","dea2356c":"setInvestorGain(uint256)","dea37fb0":"Force()","dea3ce27":"setEligibleForReimburse(bool)","dea4267b":"addCourse(string,string,string,string,string)","dea5408f":"paymentSizeB()","dea5de80":"phase_4_Time()","dea6aec7":"getTargetSupply()","dea7b768":"submitBallotNoPk(bytes32)","dea89056":"holdMax()","dea8d6b6":"testCannotSetPresaleTokensAfterSaleStarts()","dea90acf":"getEmergencyTransferSignersCount(address)","dea95ff8":"setRoundNum(uint256)","dea97078":"getPendingTransactionsSellerAddresses()","dea9b464":"depositCollateral(bytes32,uint256)","dea9c72b":"getLatestPreReleaseTree(bytes32,uint32,uint32,uint32)","dea9ecd6":"DeanCoin(uint256,string,uint8,string)","deaa0d0a":"withdrawal1()","deaa59df":"setWallet(address)","deab5a78":"TEGTY()","deac4659":"inArray(address)","deaca58e":"settlvlement(address,uint256,address,string,string)","dead98f6":"part_to_vehicle(uint256,string,uint256)","dead9f93":"setParams(uint256,uint256,address,address)","deadc3dc":"currentStepIndexByDate()","deae5d4d":"networkPlaceholder()","deaf5a5e":"transferDocument(bytes32,address)","deb06c3a":"gameActive(uint256)","deb077b9":"nextSaleId()","deb081df":"getIslands()","deb0e09b":"getVotingDuration()","deb209f6":"isProviderValid(uint256)","deb2432b":"zecId()","deb2e0b9":"MedNet()","deb36e32":"startVesting()","deb41f8d":"setTuple(uint256,uint256,bytes32)","deb43874":"Heritable(uint256)","deb52738":"finaliseFirstPhase()","deb53ab4":"BeneficiaryStake(uint256)","deb5d6c2":"inviterReg()","deb60627":"MhpCoin()","deb6930c":"PriceTicker()","deb77083":"stage2Bounty()","deb775a7":"tokenEmission(uint256,uint256)","deb80111":"transfer_asset(address,uint256)","deb80d66":"ProvidencePresale()","deb83bcc":"crowdsaleEndLockTime()","deb931a2":"getOwner(bytes32)","deb93b5b":"balanceOfOn()","deb979ac":"mktValueupdated(uint256)","deba5e95":"addCandidate(address,bytes32,string)","debad25e":"TeslaTest()","debad27f":"getProducts(uint256)","debaeb0e":"bonusLevel1PercentModifier()","debbc6eb":"btcRelay()","debc74f6":"buyRateZeroQuantity(uint256)","debc94ff":"Buckcoin()","debcbdcf":"preSaleStartdate()","debd122e":"setUp(uint256)","debe1c69":"setAccountingParams(uint256,uint256,uint256)","debe9768":"mintTokensLockedMultiple(uint256,int256,address[],uint256[],uint256[])","debf5b9f":"phase_4_rate()","dec0257d":"deleteContract(bytes32)","dec04b9b":"testNow()","dec10357":"currentCandyTotalSupply()","dec18b46":"second_withdrawal(uint256)","dec22b07":"forceExecuteRandomQuery()","dec24118":"lastCallBlock()","dec26d55":"LifeSet_003()","dec32ae8":"byTokens()","dec4b436":"subAttack(uint256,uint256)","dec57e94":"QTUM()","dec5cf53":"Exile()","dec6bc91":"EthernautsPreSale()","dec6c2d8":"updatedDistributee(address,uint256)","dec74ae9":"eurId()","dec7542f":"changePermission(address,address,bytes32,bool)","dec7ee57":"convert2Platinum(uint256)","dec7fa11":"minimumTokenAmount()","dec8f52e":"getVested(address)","dec96e7b":"setTitulaire_Compte_3(uint256)","dec9ba44":"createBet()","deca15db":"calcQueryCost(uint256,uint256)","deca6e76":"adminsInitialized()","decadbcc":"mainstreetCrowdfund()","decb3a90":"winAmount()","decb4803":"Tipcoin()","decbd169":"createPet(uint8,string)","decd8785":"addPartnerAddress(address)","decd8a25":"MINI_GAME_PRIZE_CRYSTAL()","decde7c0":"GetCert(uint32)","decdffbb":"_emitJobRatingGiven(address,address,uint256,uint8)","dece296f":"RET_DIV()","dece2e67":"releaseFundsSeller()","dece3355":"MinePoS(address,uint256)","decebbce":"getFunds(address)","decf1e64":"minimumPledgeAmount()","decfe0d4":"destroyEnabled()","ded04fe9":"testFailCreateNewRevisionNotOwner()","ded05da5":"changeIcoAddress(address)","ded1588c":"OwnerWithdrawTokens(address,address,uint256)","ded1c11b":"startFinalStage1()","ded1d0b8":"createMiniTicket(address,uint256)","ded1e438":"checkRatio(uint256,uint256)","ded1e4de":"DisputeResolver(address[],address)","ded1e7e3":"innerGreet()","ded1f580":"Unregister(address,bool)","ded24016":"getDynamicArrayElement(uint256)","ded2d0f4":"awardToken(address,uint256)","ded30375":"setectoken(address)","ded317a8":"minCapUSD()","ded37745":"maybeAnotherTime(uint256)","ded4980f":"withdrawInvestmentsBeneficiary(address,address)","ded54a4c":"stitch(uint256,uint256,bool)","ded5bc6c":"getBdpImageStorage(address[16])","ded5bd14":"setApp(string,uint256,address)","ded78d3d":"trade(address,uint256,address,uint256,uint256,address,uint8,bytes32,bytes32,uint256)","ded8454a":"addressToBytes(address)","ded8f76d":"_sort(uint256,uint256)","ded94688":"showOwner()","ded9b075":"getAllDepositesCount()","deda0b5a":"mockSetResult(string)","deda20de":"doPurchaseFor(address)","deda2f9d":"triggerStealManually(uint32)","dedb7e25":"_ifEvenThenOddTooFlags(uint256)","dedc440f":"getEscuela(uint256,uint256)","deddab12":"withdrawalToken(uint256)","dede12a4":"startWeekOne()","dedeb3ca":"referralRateInvitee()","dedf141e":"setDates(uint256,uint256)","dedfb567":"multiFreezeAccount(address[],uint256)","dee023e2":"transferAllArgsNoAllowance(address,address,uint256)","dee1bfbe":"totalLendingFiatAmount()","dee1cfd8":"icoStartTimestampStage()","dee1f2af":"addToken(address,uint256,uint256)","dee2596b":"changeBonusTokenAddress(address)","dee2b058":"setCapacity(uint256,uint256)","dee3a226":"finalizeSto()","dee3efb2":"getWorkerPoolByIndex(uint256)","dee4b246":"buyTokens(uint64,uint256,uint8,bytes32,bytes32)","dee5216e":"applyRuntimeUpdate(address,address,uint64,uint64)","dee54b68":"WalletAddressUpdated(address,address)","dee555bf":"discountRateIco()","dee5a9e7":"PRICE_STAGE_THREE_BONUS()","dee6e5a4":"toggleKYC(address,bool)","dee73dbb":"AcceptedOwnership(address)","dee751ce":"createHoldToken(address,uint256)","dee7e59b":"LogWithdrawTokens(address,uint256)","dee81a13":"Local()","dee846c5":"updateJoinedCrowdsales(address)","dee8575c":"getNumBits(uint256)","dee86dfb":"marketIdeas()","dee8bd51":"ReleaseICO()","dee9f53f":"idOf(uint256)","deeb7124":"MDAToken()","deebeac9":"transferToken(address)","deec4c20":"getCardsInfo(uint256)","deecb187":"KyberNetworkProxy(address)","deed18e2":"isReadyToFinalize()","deed2be0":"getDailyPlayers()","deed4b80":"isFirstLockTimeEnd()","deee9adb":"setPOOL_edit_10(string)","deef6c99":"ZigguratToken(uint256,string,uint8,string)","def04570":"TheFrozenDeadShitCoin()","def0defa":"getOwnerHistoryCountOf(bytes32)","def18101":"currentBid()","def1a2da":"vc3Wallet4Pct()","def2489b":"convert(address)","def2be48":"getBAAAU(bytes32,address,address,address)","def4ba32":"utrTestToken()","def51dc2":"CIC()","def59575":"manualyAddReferral(address,uint256)","def59ea5":"addMember(address,address,uint256)","def5bbd0":"strConcats(string,string,string,string,string)","def7eb44":"maxChangeFee()","def843ef":"createOfAthleteCard(string,address,uint256,uint256,uint256)","def86cbb":"modifyWhitelist(address[],address[])","def871ef":"AirDrop(uint256)","def9176c":"team1Balance()","def92c69":"MAX_BALANCE()","def98a72":"recipientExtraMIT()","def9c7e2":"_escrowStakeOwnerPaymentEarning(address,bytes32,uint256,uint256,address,bool)","defa92ee":"depositDividends()","defaa5f2":"_transferEthereum(uint256,uint256,uint256)","defafa37":"setRefundTimelock(uint256)","defb9584":"PROMO_CREATION_LIMIT()","defbc073":"weiUnlocked()","defc876e":"removeAddressFromCaller(address)","defc8ae9":"BuyOffer(address,address,uint256,uint256,uint256,uint256)","defce6d8":"FlagAddress(address)","defe2883":"totalSupplyByAsset(bytes32)","defe2c47":"_checkRecommend(bool,uint256)","defefe96":"payCompoundTerm(uint256,uint8,uint8)","deff30c6":"sellTokens(address)","deff3a37":"purchaseReject(address)","deff41c1":"m_owner()","deff5757":"setPartnersRelease(uint256)","deff71b8":"setAllFlagPairs(bool[2][])","deff7f2f":"CrowdFundings()","deffbaee":"addOwnershipChest(address,uint256)","df000ff7":"acceptParityOwnership()","df013fab":"setDelegadoDeEscuela(bytes32,bytes32,uint256,uint256)","df018dbd":"process(address,address,address,string,string)","df022cbc":"hello1()","df034586":"lockCount(address)","df034cd0":"updater()","df034db8":"aCASATest()","df037443":"timeoutX()","df0441cc":"_checkUnlock(address)","df054797":"securityAudit()","df0584af":"ClimateCoinAddress()","df065d78":"TEST_PLAYER()","df06c1d8":"plotsOwned(address,uint256)","df06f906":"numBets()","df0795aa":"setKycProvider(address)","df08ce62":"give(address[],uint256[])","df09176b":"ActualizePrice(uint256,uint256,uint256,uint256)","df0969dc":"clearPlayerPrize(address)","df09921f":"institutionAllocation()","df0a2bda":"refundIgnoredBids(uint256)","df0a8589":"dealAmount()","df0ad3de":"upgradeabilityAdmin()","df0b1344":"SchmeckleTokenSale()","df0b52c8":"keyAddress()","df0bcf4d":"setAvatar(uint256)","df0c428c":"releaseAdvisorsTeamTokens()","df0c7a55":"nextPrice(uint16)","df0cd37b":"Etheremojis()","df0d05d9":"EmporioExchage()","df0d1078":"volumeType1()","df0da20e":"BONUS_WINDOW_1_END_TIME()","df0efbf5":"rateForSale(uint256)","df0f093b":"purchasePeriod()","df0f26f9":"getBalanceAddr(uint256)","df0f3227":"DurationAltered(uint256)","df0f3c19":"getGameCountdown()","df0f3e1c":"isFalse(bool,string)","df109ee1":"AuctionManager()","df10dd6e":"checkSubAvailability(bytes32)","df117c47":"updateSuperPrivilegeParams(uint256,uint256)","df11d258":"witness(bytes32,bytes32,bytes32,bytes32,uint8,bytes32,bytes32)","df12b94e":"investBalance()","df133cf9":"minesPrice(uint256)","df1340a0":"QTR_Token()","df13569d":"FACTOR_6()","df13994e":"callback(bytes32)","df143fb7":"HackerGold(address)","df148cdb":"setPonziAddress(address)","df155488":"startLockTime()","df15c37e":"getWinners()","df15f87e":"FiatRaisedUpdated(address,uint256)","df1614cf":"setLendFee(uint256)","df1673e9":"CHINESE_EXCHANGE_4()","df175e9b":"newCampaign(address,uint256,uint256)","df17c4b1":"delegateTransferAndCall(uint256,uint256,address,uint256,bytes,uint8,bytes32,bytes32)","df181831":"staff_1()","df1836ca":"referrerAndOwnerPercent()","df18e215":"updateTokenStore(address)","df190048":"getAdPrice(uint256)","df19b71c":"digitToNumber(uint8)","df19df5d":"ownerOperationsLength(address)","df1a5aab":"reservedTokensClaimStage()","df1abf83":"revertTokensByKYC(address)","df1b817e":"setupCutie(uint40,uint16)","df1c455c":"unallocated()","df1cd2b5":"volumeBonusesTokens(address)","df1cf293":"addAuction(uint32,uint256,uint256,uint256)","df1d4559":"setFOUNDATION_POOL_ADDR(address)","df1dbbc9":"ShareToken()","df1dd826":"trade(uint256)","df1e36c6":"unlockDeposit(string,address)","df1ead82":"disinvest()","df1ec3ea":"BesideERC20(uint256,string,string)","df1f4a6e":"getTimestring(uint256)","df1fc781":"KickicoCrowdsale(address,address,address,address,address,address,address,address,address)","df201a46":"simple()","df203ff7":"depositGasCost()","df20b119":"balanceEthCrowd(address)","df20c021":"addNewChannelAndRankofuser(address,string,int256)","df20d738":"BokkyPooBahsEtherRefundablePrize()","df221223":"setWeiExchangeRate(uint256)","df22bf83":"canUseTokens(address,uint256)","df23128f":"adjustTranche(uint256)","df234815":"tokensAvailableAtTierInternal(uint8,uint256,uint256)","df2436b3":"isExistByBytes(bytes32)","df247c5d":"CareerXonToken(uint256,uint256,uint256,uint256)","df25322d":"getFundReceiver()","df25ecf8":"DSTContract(string,string)","df25ee23":"getIndexId(address,bytes)","df25f3f0":"minPerTx()","df26ca08":"emitError(uint256)","df28aef7":"withdrawLiquidatePool(uint256)","df28d6fa":"Dex2(address)","df294588":"get_Gains(address,address)","df294cad":"allocateNominalToken(address,uint256)","df295080":"changeAbstractStorage(address)","df29b982":"emergencyWithdrawERC20(address,uint256)","df29dfc4":"get_start_time()","df2a201b":"setSystemOraGasLimit(uint256)","df2a2753":"LDGToken()","df2a29da":"getDenominationToken()","df2a6e4f":"kscBatchSellByOtherCoin(address,address[],uint256[],uint256,uint256[],string)","df2b1cf8":"toBytes(uint256,uint256)","df2bf12b":"totalBatchOf(bytes32)","df2c05a9":"UbermenschPrefundToken(address)","df2c7fc1":"AuctionFinished(address,uint256,uint256,uint256,uint64,uint256,address)","df2cdbed":"_setBidState(bytes32,uint8)","df2d33d5":"isBreakingCap(uint256)","df2d44af":"EthLongExercised(address[2],uint256[7],uint8,bytes32[2],uint256,uint256)","df2df29a":"CEO_Signature()","df2dfb20":"canIBuy()","df2e5c0f":"changePricePerUnicorn(uint256)","df2f0a4a":"getDecisionBlockNumber(uint256,uint256)","df2fbae6":"totalAvaliableSupply()","df300b46":"getThing(bytes32[])","df305680":"clearProposalLocked(address)","df30e592":"isValidContributorId(uint256)","df31566e":"setUInt(string,uint256)","df3164c6":"Release()","df31b589":"bonusForPreICO()","df320b29":"refundBet(bytes32)","df32754b":"owned()","df32dc5c":"withdrawEarning(uint256)","df331545":"reservedOperationalExpenses()","df334093":"acceptingDeposits()","df36318a":"exchangeStart()","df3864d5":"ticketsSold(uint256)","df390d63":"encodeData(uint128,uint256,uint24,uint40)","df3959f5":"setInitializeUniverseValue()","df3a4fa1":"maxSubdivisions()","df3a635a":"removeDeed(address,uint256)","df3a6b10":"testMemberAddedEvent()","df3aa1fc":"FTXToken(address)","df3b75f0":"test_standardCampaignDeploymentAndUse()","df3be668":"productLimits(bytes32)","df3be9e8":"ERCFW()","df3c211b":"calculateVestedTokens(uint256,uint256,uint256,uint256,uint256)","df3c3a30":"mintLocked()","df3c5a42":"supplyICOContract(address)","df3c8620":"num_challenges()","df3cc390":"setUsdRate(uint256)","df3e0a1d":"completeEscrow(uint256)","df3f5974":"readPublicRecord(bytes32,bytes32)","df3fb59e":"DSPRegistryReplaced(address,address)","df40503c":"getRemainCoins()","df40a089":"setDrawAddress(address,address)","df41765e":"circulatingTokensFromSale()","df418fbf":"returnBytes1(bytes)","df41d979":"ico_distribution(address,uint256)","df426401":"founderTokenUnlockPhase2()","df428e3b":"createChildUniverse(uint256[],bool)","df42dfa9":"initialARXSupplyInWei()","df42e80e":"Asset()","df43b699":"setInvoiceCancelled(address,address,uint256)","df43b830":"absolutCBD()","df444df1":"createEscrowBySeller(address,uint256)","df462098":"setNextCommonTTMTokenId7(uint64)","df463ed3":"buyService(uint64,uint64)","df47a924":"DiaToken()","df482ad5":"privateFundSupply()","df483622":"addLotteryParticipant(address,uint256)","df487962":"FibokenCreated(uint8,address,uint256)","df48a2b0":"setReinvestmentAddress(address)","df49804a":"mtv()","df49dfe3":"updateTransferMinimumFee(uint8)","df4a2ecc":"hasNext()","df4aaf04":"COIN_SUPPLY_ICO_TIER_2()","df4adb94":"getOutcomeByIndex(uint256)","df4b2970":"getRabbitMother(uint32)","df4b3351":"collectEtherBack(address)","df4bcf58":"isMigrationAgent()","df4bd18d":"setPriceAndRate(uint256,uint256)","df4bef32":"searchInList(address)","df4c2164":"mintableAddress()","df4c98b5":"createRentAuction(uint256,uint256,uint256,uint256,uint256)","df4cbb96":"commitProposal(bytes32,string)","df4d17dc":"initToken(address)","df4dfa7f":"PRE_ICO_TOKENS_AMOUNT()","df4e79fa":"VESTED_TOKENS()","df4ebd9d":"buyWanCoin(address)","df4ec249":"step3()","df4f0088":"guardVillain(uint256,uint256)","df4f011c":"licenseIds(uint256)","df4f5a72":"refunder()","df4fc373":"SetIPR(string,string,address,string,string,uint256,address)","df4fcf8e":"newFeePercentageIsSet(uint256)","df5055e6":"adminVer()","df506768":"payTeam(address)","df506801":"preSaleThirdCap()","df50a8c1":"updateFundraiser(address,bool)","df50afa4":"setAllowTransfers(bool)","df51d46b":"setUnlockEarlier(uint256)","df520efc":"pricePerTokenInWei()","df52f321":"CinociCoin(uint256,string,string)","df53623f":"_unlockContract()","df5483ad":"setImageWidth(uint256,uint16)","df54c659":"TransferredFoundersTokens(address,uint256)","df55b41a":"owner(string)","df55f529":"UNLOCK_TEN_PERCENT_PERIOD()","df565ca2":"rateRatioCVSThreshold()","df571e33":"postSoftRate()","df57904a":"GoodfieldNewRetail(uint256,string,string)","df57a6ec":"_generateRandomDna(string)","df57b742":"getReverse(bytes32)","df58471d":"increaseFundingGoal(uint256)","df58d236":"WipedAccount(address,uint256)","df590d89":"KnowHowChain()","df591e82":"goForward()","df59cbeb":"OwnedUpgradeabilityProxy()","df5a1417":"PLAYERWIN()","df5b588c":"PublishWinnersScoreThres(uint16)","df5cc291":"get4(bytes,uint256)","df5cf723":"delegation()","df5d3e89":"subBuy(bytes32,bytes32,address)","df5d3ec7":"setSaleEnd(uint32)","df5dd1a5":"addOracle(address)","df5dd98f":"refFeeVal()","df5e3569":"hasBet(uint256)","df5f0603":"retrieveEth(uint256)","df5f53f1":"checkWithdrawal(address,address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)","df603769":"reconcile(uint256,address[],int256[],uint8[],bytes32[],bytes32[])","df61f51b":"TokensIssued(address,uint256,uint256,uint256)","df6378e9":"getAuctionAddress(uint256)","df63d908":"testYBool()","df63e659":"deleteAllMessages()","df642cad":"setCost(uint8,uint256,uint32)","df65d1ef":"getLuckBoyAddrList()","df66fc14":"sendTokenTeamAdvisor(address)","df67184a":"getRequiredBalance(uint256)","df673d35":"SISA_token()","df67ae3d":"GetStuffList(address)","df67d82d":"minETH()","df68a516":"viable_print(int256,uint256,uint256,uint64)","df68c1a2":"canTransfer()","df68fd99":"popElementWithPos(uint256)","df6a000d":"safe_withdraw(uint256)","df6a6002":"fourthMonthEnd()","df6a6b38":"redeemed(address,uint256)","df6ab3d5":"masssend(address[],uint256[])","df6abd34":"icoHardcap()","df6adc2a":"JackpotWinner()","df6af7d1":"getUnclaimedBuyerFunds(address,address,address,uint256)","df6afed9":"replaceArtwork(uint16)","df6b1ebb":"analyzeCondition(uint8)","df6c13c3":"getMinFunding()","df6c7cf4":"changeAssembly(uint256,uint64[],uint64[])","df6cf923":"IXTPayment()","df6d3afa":"setAngelHolder(address)","df6d4843":"getMaxLimit()","df6da6f9":"tokenSellData(address)","df6e1331":"drawGame(uint256,string)","df6e7a5f":"setTokenDelegation(address,address)","df6ee5f2":"lend(bytes32,bytes,address,uint256,bytes)","df6ee6b7":"addStage(uint256,uint256,uint256,uint256,uint256,uint256)","df6f023d":"reLoadCore(uint256,uint256,uint256,uint256)","df700074":"setadmin(address,address)","df706f77":"JTrex()","df708f01":"setMainContract(address,address)","df70ab71":"increasePositionOnBehalfOfRecurse(address,address,bytes32,uint256)","df70f3b5":"Jumanji()","df713abd":"get_time_locked_contract_size(address)","df7447dd":"createTicker(uint256)","df7458cd":"addReply(bytes32,string,uint256,address)","df745d28":"releaseBatch(address[])","df752519":"MANHATTANPROXY1STST()","df75574a":"buyItem3()","df755a98":"prPercent()","df75f3fb":"setPreSaleDurance(uint256)","df761fff":"TokensClaimedEvent(address,uint256,uint256,uint256)","df76d18d":"RegisterIP(bytes32,string)","df775a93":"skipInitBecauseIAmNotOg(address,address,uint256,uint256,uint256,uint256,bytes8,uint256)","df776689":"BasicIterator()","df77a290":"OddsAndEvens()","df77e074":"GetBetInfo(uint8,uint256,address)","df77eb1e":"transferHomeViaRelay(address,uint256)","df78c1dd":"payIn(uint256)","df79d8fa":"initialInvestorAccount(uint8)","df7ae3d8":"debugVal()","df7b70ab":"writesExercised(bytes32,address)","df7be446":"_removeNFToken(address,uint256)","df7bf704":"matchResult()","df7c5fca":"checkPeriodic()","df7cc70d":"ethUnPause()","df7cec28":"cancelBid(bytes32)","df7dbd70":"prTokens()","df7dfef7":"deleteAction(uint256)","df7efed8":"WeiinEth()","df8011b2":"HOWL()","df8089ef":"setAdministrator(address)","df811d7d":"numberOfPlayersInCurrentRound()","df816206":"getGiftIdsByRecipient(address)","df817e54":"checkPreIcoStatus()","df821cf7":"BIDCOIN()","df833a1a":"createGato(uint256)","df8344fe":"allAllowancesForManyAccounts(address[],address,address[])","df84807a":"templateIdOf(uint256)","df851f03":"calcNextPrice(uint256)","df8713ed":"addPot(uint256)","df88126f":"lockedInBets()","df8812c7":"addStageAmount(uint256)","df88401c":"KillahyToken()","df885536":"nxtAddr()","df888f4e":"AO()","df88f5b8":"setNotConstant()","df88fb44":"exchangeByPet(uint256,uint256,address)","df8b7771":"initialiseValues()","df8bb140":"cancelCampaign(bytes32)","df8d66e4":"addPlatform(bytes32)","df8dc370":"Reservation(address,address[])","df8de3e7":"claimTokens(address)","df8e03b1":"BasicWhitelist()","df8e739d":"bitzToken()","df8e9261":"_testItem()","df8f4376":"calcSTQAmount(uint256)","df8f4eb7":"originalTotalSupply()","df8f7971":"ProfileOwner()","df8f8a81":"setETCLockingAddr(address)","df90061b":"onSaleTokens()","df90c98d":"whiteListEndTime()","df90f719":"mln()","df91f2ab":"SggCoin()","df9204b6":"powerStatus()","df922744":"ScamSeal()","df922f3a":"changeCommission(uint256)","df93c9aa":"testrevert()","df957b04":"_couldWithdrawFromHolder(address,uint256)","df958553":"burnForGateway(address,string,uint64,uint64)","df9669e0":"setCrowdsaleEndDate(uint32)","df969bc0":"ADVISOR_TWO()","df96a336":"Bitkeun()","df979b92":"setIncreaseTotalWinningStake(bool)","df98ba00":"m_opNum()","df98ef33":"getResource(bytes,uint256,bytes)","df990c33":"becomeOwlmaster()","df9933e5":"SetPwd(bytes32)","df998f59":"checkSertificate(address,address)","df99f8bf":"TradeToken()","df9a4f56":"registerAuditor(address)","df9abaa0":"smallUintFunc(uint8,uint256)","df9b0774":"SwapResumed(uint256)","df9b2931":"FANBASE()","df9b3bae":"ZperToken(address,uint256,uint256)","df9b5fe9":"ALH3()","df9d3580":"accountBuyLimit()","df9e33e8":"getForeverRose()","df9f3139":"out4Done()","df9f92fb":"Scan(address[],uint256[])","dfa0ca14":"swapProject(uint256)","dfa13498":"LeasedBlock(uint256,uint256,uint256,uint256,bytes32,bytes32,bytes32,bytes32,address)","dfa15809":"databaseAddress()","dfa15b58":"RESERVED_OTHERS_SIDE()","dfa22fed":"buyFromOwner(string)","dfa24e8e":"sendEther(address,uint256,uint256)","dfa38fea":"NANI(address)","dfa4591c":"removeLogicVersion(uint256)","dfa54594":"getStandartRobot(uint256)","dfa5a25d":"purchaseCoffee()","dfa6bc72":"LoggedPhaseICO(uint256,uint256,uint256,string,string,uint8,bool,bool)","dfa72237":"innerPlayerFlight(uint256,uint16,uint256)","dfa78bf5":"savior()","dfa8be5f":"hackEducated(address)","dfa93d64":"relayContractAddress()","dfa9b440":"addAddressToWhiteList(address[])","dfaa3136":"addToMap(uint256[])","dfadb43c":"candyLandSaleAddress()","dfae7dc1":"vestingWhitelister()","dfaeaf67":"ThrowProxy(address)","dfaf3658":"closeCdp(address,uint256,uint256)","dfaf734a":"lastReleaseTime()","dfafaa72":"sendTo(address,uint256,address)","dfafb31d":"QUANTH()","dfafcf7e":"isMinion(address)","dfafe10f":"addParticipant(address)","dfb01c8f":"BCC()","dfb03cf7":"put(address,address)","dfb06d85":"AgentContract(address,address,address,uint256,uint256)","dfb0fb28":"ANGEL_ADDRESS()","dfb1913d":"withdrawFor(address[],uint256[])","dfb1abc0":"distributeReservedTokens(address,uint256)","dfb1c0e5":"buyToKen(uint256)","dfb259de":"SmartPoolToken(uint256,address)","dfb2866d":"priceFactor()","dfb29935":"sendHash(string)","dfb30c14":"getPlayerSpaceshipModelById(uint256)","dfb3557b":"BNB_MIN_CONTRIB()","dfb36b0b":"villagePrice()","dfb41e7c":"getForecast(bytes32,uint8,uint256)","dfb4a12e":"updateCandidateInfo(address)","dfb4ae3a":"WHOM()","dfb4b2f0":"deadline_status()","dfb59249":"EthRental()","dfb5a995":"countStureq()","dfb5f420":"Crowdsale(address,uint256,uint256,uint256)","dfb685cb":"BIT()","dfb69cb2":"colors(uint8)","dfb873fb":"getPrizeByToken(uint256)","dfb87be1":"setEndRate(uint256)","dfb8a38d":"getTokenPackPrice()","dfb8c6c2":"battleContractAddressCanBeUpdated()","dfb9560c":"right24(uint256)","dfb9bdca":"exchange(address,address[],uint256[],uint256)","dfba3be1":"pvpFinished(uint256[],uint256)","dfba9570":"removeStaff(string)","dfba9798":"withdrawMytoken(uint256)","dfbb3036":"currentRoundInformation()","dfbb4021":"checkGrid(uint8)","dfbb70c9":"timeOfLastIncrease()","dfbc3de1":"applyMember()","dfbcb8d9":"transferCard(address,address,address)","dfbd5c69":"EggsRedeemed(address,uint256)","dfbd6150":"subowner()","dfbd9973":"pageByAccount(address,uint256,uint256,uint256)","dfbde5a7":"FedCoup()","dfbe0587":"sellPorftolio(uint256,uint256)","dfbebd07":"licenseExpirationTime(uint256)","dfbec00e":"requestTopic(string)","dfbed623":"updateCaller(address,bool)","dfbef8de":"AllowExchanger(address)","dfbf53ae":"winner()","dfc027ef":"replayAnser(uint256,uint256[])","dfc0bedb":"setCode(uint256)","dfc10ea8":"callerAllocationEndBlock()","dfc119b0":"testRfind()","dfc28653":"NucleusVisionTokenUnlocked()","dfc2a146":"ORACON(uint256,uint256)","dfc366e8":"tenthousandths()","dfc3a987":"cntMembers()","dfc42f7c":"OmegaContract()","dfc4a516":"doApprove(address,address,uint256)","dfc6fbaa":"presaleBalanceOf(address)","dfc6ffc6":"CharlieCoin()","dfc74cb4":"testPlaceBet()","dfc75b9c":"sendJigouByOwner(address,uint256)","dfc765dc":"getMatchers_by_index(uint256)","dfc78bdc":"ProposalTallied(uint256,bool,uint256)","dfc7d488":"getTransactionFee(uint256)","dfc86d56":"UsdToEtherConvert(uint256)","dfc89632":"PresidentElections()","dfc8bff1":"updateLock(uint256)","dfca2f53":"LookAtPrizes()","dfca685a":"unlockPrivate()","dfca8fd2":"contributeForMakers(address)","dfcb4157":"saleAfterRefundPeriod()","dfcb737f":"allocateMarket_CommunitTokens()","dfcbb794":"TrustFund(address,uint256,address)","dfcbc298":"CancelBuyOrder(bytes32,address,uint256,uint256,address)","dfcc4b86":"ConcludeChallenge(uint256)","dfcc525d":"info_SeeTINAmotleyLine(uint256)","dfccdef5":"collectedETH()","dfcdc7f2":"regReferrer(address)","dfcdde5e":"calcAmount()","dfce5a7a":"changeGrantsController(address)","dfce791a":"counterWagerAndDeposit(uint256)","dfce8ac3":"fipsLegacyRegister(bytes20,address,bytes)","dfceb5ba":"refund_and_die()","dfcefd7e":"indexOf(uint64[],uint64,bool)","dfd024c1":"allocateInvestors()","dfd0c510":"ICOReward()","dfd142c1":"IncreaseWithdrawalAmount(uint256)","dfd17111":"ConstructZCashClue(bytes32)","dfd17f2b":"buyInBatch(uint256,uint256,uint256[],uint256)","dfd1be58":"platformFundingPerEpoch()","dfd200c5":"setRunning(bool)","dfd2ddec":"setForeignBridgeProxyOwner(address)","dfd4715e":"setDAdmin(bytes32,address)","dfd4e0f6":"setPrivateSaleHalt(bool)","dfd50f52":"contestants(uint256)","dfd52b74":"_getIcoAddr()","dfd5d3b0":"creditMcAddress()","dfd5dd6b":"ranksCount()","dfd6e6c5":"getIcoPhaseOneThreeDayIndex(uint256)","dfd80665":"whitelistAgent()","dfd84c13":"sendGain()","dfd8d516":"IsThisInternal()","dfd92f8a":"registerProduct()","dfd94849":"addNewSpinner(uint256)","dfd9e184":"droneIndexToApproved(uint256)","dfdadcb9":"isValidPurchase()","dfdadec6":"AlphaCarToken()","dfdb27da":"FoundGameCoin()","dfdb5f17":"doBurn(address,uint256)","dfdc349d":"getLestCommonMul(uint256,uint256)","dfdc99c7":"setKpopCelebContractAddress(address,address)","dfdce77b":"setScrapPercent(uint8)","dfdd3997":"maxETHAutoContributions()","dfde567f":"processAR(uint256)","dfdfb261":"addEsgoTX(address,uint256,uint256,uint256,uint256)","dfe0f0ca":"transferWithSender(address,address,uint256)","dfe1304c":"HumanStandardToken123(uint256,string,uint8,string)","dfe1b17e":"dequeueOrder()","dfe1dcf6":"adminSendEthtoAddContract()","dfe1f357":"checkHash(address,uint256,address,uint256,uint256,uint256)","dfe2de30":"boughtTime(address)","dfe333bd":"copiesSold(uint256)","dfe33748":"TokensAreFrozen()","dfe346d0":"NicksTastyToken()","dfe3a52b":"CUTOFF_PRESALE_TWO()","dfe3e746":"setMasterNode(address)","dfe4858a":"constuctor()","dfe4c261":"approveTransaction(uint256,uint256,string)","dfe525a2":"addHandler(address,address,string,string)","dfe5ef48":"issue(address,uint256,uint256)","dfe699b1":"SetApplicant(string,string,string,int256,string)","dfe6af85":"testThrow_testablePayoutCaseShouldBeFailure()","dfe6d366":"gamblers()","dfe71183":"createCDPLeveraged()","dfe71486":"displayuserdetails(address)","dfe81a26":"GnarlyTimes()","dfe921cb":"lifeReserveTimeLock()","dfea6ec2":"placeBetWithInviter(uint256,uint256,uint256,uint8,bytes32,bytes32,address)","dfea8483":"Countout()","dfeade00":"AceEquityToken(uint256,string,string,uint8)","dfeb1719":"getNotaire()","dfeb1fd3":"getUserVotes(address,string,string)","dfeb34b6":"stakeFailOverRestrictionLifted()","dfeb3c49":"getNonces(address,address)","dfebb4ee":"viewMostRelevantClauses()","dfec375e":"calcCurPointsForAcct(address)","dfedff20":"getTwit(address,uint256)","dfee01d8":"mUpgradeSpeedup()","dfee2bad":"phaseReleaseAmount()","dfee6348":"COMMUNITY_PLUS_PRIORITY_SALE_CAP_ETH()","dfef54a3":"TihoToken(uint256,string,uint8,string)","dfef58a6":"registration(bytes32,uint256,address)","dfef5f69":"mintingStartTime()","dfefaf3f":"secureUnapprove(address)","dff0259f":"donationSum()","dff05de4":"pctDIDOwned(address,address)","dff114dd":"investedCrowdsaleTokenOf(address)","dff18fe0":"provideTeamHolderToken(address)","dff1ab15":"checkProposalCode(uint256,address)","dff2db71":"binaryAddress()","dff3f3b9":"ownerWithdrawal(uint256)","dff3f83e":"resolveRawDelegation(bytes32,uint256)","dff44b2f":"divorce()","dff4a5e8":"getRestaurant(address)","dff53231":"love()","dff538e6":"_currentDay()","dff5f5cb":"updateStartPhase(uint256)","dff649dc":"NameChanged(address,uint256,string,string,uint256)","dff675c2":"getDelivery()","dff79905":"LogTokenRemover(address,uint256)","dff90b5b":"sendFees()","dffa771f":"_setWeaponValue9(uint256)","dffb0bd1":"getPlayerTotalDividend(address)","dffbbef5":"stopDistribution()","dffbd9de":"TokenAdded(address,address)","dffcf9a7":"transferableHavvens(address)","dffd5e57":"buyToken(bytes32)","dffd6054":"changeGameAddress(address)","dffd722f":"totalEarn()","dffd9b8e":"CEO_TEAM_SHARE()","dffdc75d":"forward(address,bytes,uint256,bool)","dffe0a63":"getStatGames()","dffeadd0":"main()","dfff2f79":"autoReinvestFor(address)","dfffcbdb":"triggered(uint256)","e0004f43":"batchTransferTokenS(address,address[],uint256[])","e000eec3":"createPixel(uint24,uint32)","e0018f2f":"showPlayerSeasonScores(address,int8)","e001ddf1":"teamTokensCurrent()","e0020f1a":"tokensPerEthPublicSale()","e0024ae3":"_mine(uint256,address)","e002a486":"changeForwardTo(address)","e002f2ee":"cpCap()","e0031b1d":"GetDOTDelegatedRevoker(bytes32,uint8)","e003604e":"close(address,uint32,uint192,bytes)","e0036d1d":"verifyPosition(uint16,uint8,uint64)","e0041396":"slice(bytes,uint256,uint256)","e004b76f":"PermissionRemoved(address)","e004fe97":"CarRegistry(string)","e004feb0":"testFailMintGuyWhenStopped(int256)","e0056019":"setLand(uint8,uint8,uint8,bool,uint8[])","e0063224":"vouchers(bytes32,uint256)","e0068052":"division(uint256,uint256)","e00686e4":"rewardPerBlockPerAddress()","e006997c":"authenticate(string,bytes)","e007b330":"sterilize(uint256[])","e0081b8c":"approve(bytes32,bytes32,uint256)","e00824bb":"payCreator()","e0089ce7":"UCtestCoin(uint256,string,uint8,string)","e008cdf3":"SBSCoin()","e00a7fc5":"transferFromOwn(address,uint256)","e00ab6dd":"private_setminBet(uint256)","e00ac9a3":"thirdTime()","e00bc0f4":"setIsContainerForMarket(bool)","e00bc7fb":"vota_un_candidato(address)","e00be2a9":"getErc20Rate(string)","e00cb0bc":"etherReceivedPrivate()","e00d0aed":"TalosToken()","e00d7e5c":"ExampleToken()","e00dd161":"currentId()","e00f882c":"numberOfExchInEstateNasAlice(address,uint256)","e00fe2eb":"getText()","e01060f8":"transferOwnership(uint8[],bytes32[],bytes32[],uint256,address[])","e010c686":"newProposal(uint256,uint256,bytes32)","e011171d":"setDOwner(bytes32,address)","e0117441":"setRegistrationPrice(uint256)","e011ac87":"amountLeft()","e01330bb":"testMul(uint256,uint256,uint256)","e014a39f":"weiRaisedIncludingFiatCurrencyRaised()","e014a83f":"takeToken(address,uint256,string)","e01546a8":"fromFraction(int256,int256)","e01567cf":"ethBioxRate1()","e015c62a":"calculatePrice(uint256,uint256,uint256)","e015d863":"variation()","e016603f":"createMultipleShows(uint256[])","e0179e6c":"etherValue(uint256)","e0180115":"culcurateBonusRate()","e0182436":"cancelEscrow(uint256)","e0187d18":"third_partner_address()","e018c36c":"buyFirstPackFromReferral(address,bool)","e0192072":"Rescue(address,address,uint256)","e0195a53":"maxRandom(uint256,address,uint256)","e01964d0":"sterile(uint256)","e019ac29":"setKycCertifier(address)","e01a38c6":"ecrecoverSigner(bytes32,bytes,uint256)","e01ac5a4":"giveReward(bytes32,address,uint8)","e01b1b10":"ICODays()","e01bb918":"_withdrawAll(uint256,address)","e01bc60b":"totalCustomBuyersMapping()","e01c6d4e":"cashin()","e01c979a":"GuneToken()","e01cd37a":"cancelSellingToken(address)","e01cdfaa":"getEmployeeInfoById(uint256)","e01cff84":"getTransferringForCount(address)","e01d1f3d":"MultiSigWallet(address[],uint256,uint256,string)","e01dd67b":"AMBASSADOR_THREE()","e01e0618":"feeDiv(uint256,uint256)","e01e92d2":"abs(int128)","e01ea00c":"getDarknodesFromEpochs(address,uint256,bool)","e01ef1f8":"addInventory(bytes32,string,string,string,string,uint256,uint256)","e01fff13":"familyContract()","e0201e07":"Eclipse()","e0204585":"get_bet(address,address)","e020b8a3":"contract_date()","e02163e7":"etherContributionOf(address)","e021b8cb":"useWeapon(uint8,uint8,uint8,uint8,uint8[176])","e021deff":"meta(address)","e02243ee":"buyInternal(address,uint256)","e023094f":"createDroid(uint256,string,uint256,uint256,uint256)","e023f90e":"getCity(uint16)","e02426c1":"getSignatureHash(bytes4,uint256)","e024ec5a":"getFmmsDetail(bytes32)","e0256835":"balancesCrowd(address)","e02584bf":"listPairForReserve(address,address,bool,bool,bool)","e025a666":"rewardPercentageDivisor()","e027034d":"isWithinIEO()","e028222f":"CreateABet(address,uint256)","e028ff3b":"lotteryGiveHuntMinimalNumber()","e0299621":"GBIToken(uint256,string,string)","e02b8b29":"HardcapToken()","e02ba030":"excess_token()","e02bc1c6":"bidDeposit(bytes32)","e02bcd3e":"getLendTokenBalance()","e02c3b5d":"getAllLeftLeg()","e02c7e1f":"timelockAllocationAddress(address,uint32)","e02c85a4":"_checklottery(uint32,uint32)","e02cec51":"refund(address[])","e02d1c0e":"tradeStarttime(uint256)","e02d306f":"getUNTSQM()","e02df495":"MAX_ETHER_24H()","e02f8d33":"PRICE_STAGE_THREE()","e02f9027":"iTime()","e02fab06":"anubisToken()","e0300fc4":"unregisterFor(address,bytes32,address,uint256,uint256,uint256)","e0303a2e":"getFirstTwoOutputs(bytes)","e0304542":"oddEven(uint8)","e0307e94":"gcsp(uint256)","e030bbd5":"tokenToPointByMetaMask(uint256,uint256)","e030dfb9":"emergency(bytes32,bytes1)","e03179b4":"LogContribution(uint256,uint256)","e031d6f0":"isICOFinished()","e0328c5f":"setRecovery()","e0328c80":"hasRedeemed(address,address,uint256)","e033192c":"gettransferableStartTime()","e03335b4":"_calculatePricePerPixel(uint256)","e0340a05":"Maya_Preferred()","e035e1ac":"thirdBonusEnds()","e03652c2":"isTransactionPending()","e0376e74":"LOG_EmergencyWithdrawalSucceeded(address,uint256)","e037a71c":"withdrawLimit(address,uint8)","e03827d2":"left70(uint256)","e0389a47":"removeAccountMilestone(address)","e038c75a":"circulating_supply()","e0391b6f":"trackable_dislikes(address)","e03992fd":"nextForkUrl()","e039967c":"migrateTransfer(address,address,uint256,uint256)","e039e4a1":"getOwner(uint8,uint8)","e039f224":"isFork()","e03b3044":"setAyantDroitEconomique_Compte_7(uint256)","e03bc7e1":"_registerDevice(address,bytes32,bytes32,bytes32)","e03c151e":"LogSetSTOContract(address,address,address,uint256,uint256)","e03c1c4b":"setLineStartTime(uint256,uint256)","e03c639c":"addPreSaleWallet(address)","e03cca4d":"setChallengeFormulaContract(address)","e03d890b":"_addTokenToAllTokensEnumeration(uint256)","e03e09a8":"_createAuction(address,address,uint256,uint256,uint256)","e03ec01d":"getTargetWallet(address)","e0401918":"SMRToken()","e0402d26":"validDoHash(bytes32)","e04093d6":"updateOracleWithENS()","e040c164":"createT513(uint256,uint256,address)","e040f3e1":"_humanSender(address)","e0412a54":"setBonusRound2(uint256)","e0429b6c":"ShinySquirrels()","e042ad58":"operationWallet()","e0443e92":"LogCreate(address,address,uint256,uint256)","e044c2de":"newLoan(bytes,address,uint256,uint256,uint256,uint256,uint256,uint256)","e044c47f":"playerRollDice()","e0453376":"hasFourYearWithdraw()","e0457049":"trustedInput()","e0457884":"betResolution(uint8,uint8,uint8,bool)","e0462547":"setEndPreSale(uint256)","e0462d0a":"coreTeamMemberOne()","e046c4dc":"Delete()","e046f06f":"deathData_a1()","e0470e02":"matureDragon(uint256)","e0472e36":"swapProposal(uint256)","e0475e27":"holderMarketingTokens()","e048d0fc":"voteCancelCurrent()","e0495a64":"getNormalBuyers()","e04a1942":"test_fourValidEqUint()","e04a2525":"NoahDividend(address)","e04a8c08":"Sold()","e04ac09e":"BountyIssued(uint256)","e04c130b":"token_transferFrom(address,address,address,uint256)","e04c1830":"findNextHour(uint256,bytes2)","e04cd07c":"BOLTH(address,address[],address)","e04d5105":"calculateSeedBuySimple(uint256)","e04f31e9":"forward(address,uint256,bytes,bool)","e04fac0c":"aVideoCost()","e0504910":"buyWithTokens(address)","e050674c":"_deliverWhitelistBonus(address)","e0522012":"getAdjustedPotAsFixedPointForGameId(uint256,bool)","e052a587":"isNotExpired(uint256,uint256)","e052f0c8":"setParams(string,string,string,string,uint256,address,uint256)","e053178a":"XCPlugin()","e0539225":"preicoPrice()","e054057d":"LogBuy(uint256,address,uint256)","e0540d85":"CDreamingICO()","e054c029":"changejp2(address)","e055bba4":"turnId()","e056989a":"OfferUpdated(uint256,bytes,uint256,address)","e056c1eb":"isGlobalPause()","e056f2ff":"takerFeeRateE4()","e0576665":"addLen(string)","e0585ce8":"BetcoinICO()","e058cc59":"setMemeTemplate(string)","e0591ddc":"gizerItemsContract()","e059c868":"private_UpdateGameBarLimit(uint256,uint256)","e05a48cd":"unregisterVendor(address,address)","e05b4c5f":"GetReferredAt(uint256)","e05b5456":"ChenToken(address,address)","e05bac82":"amountReceivedFromExchange(uint256)","e05c5a83":"sellerOf(uint256)","e05cb6f4":"Mitrav()","e05d769e":"expirationSeconds()","e05e3028":"getCommunityManagement(uint256)","e05e91e0":"returnUint64(uint64)","e05ea744":"frost()","e05ee7a4":"RATEotu()","e05f149e":"getTotalRuns()","e05f7d67":"setPCoinContractAddress(address,address)","e05fad90":"decode(bytes,uint256,uint256)","e0607290":"confirmChangeOracle()","e06174e4":"settings()","e0619859":"At(uint256,bytes32)","e061ddca":"getSensorAddress()","e0623632":"UNSOLD_ADDRESS()","e062aff8":"startTimeNumber()","e06309bb":"ValueOwners()","e06375c8":"_fDist()","e063a439":"_computeFee(uint128)","e06452d0":"Completed()","e064bc82":"setFoundersTokensWalletSlave(address)","e064c1ec":"denyChanges()","e065029e":"PokemonPow()","e0655fe5":"changeBuyFee(uint256)","e065914c":"isPersonalLock(address)","e065e388":"NewBOP(address)","e067ea46":"Etherep(address,uint256,address,uint256)","e067f631":"intervalUpdate()","e06868e2":"numberOfBet()","e06902fa":"ito()","e06a09ec":"calculateInterestIndex(uint256,uint256,uint256,uint256)","e06a60ff":"HumanityCard()","e06aa145":"TokenBurned(address,uint256,uint256,uint256)","e06af204":"BetlyCoin()","e06b5837":"getCanSellUnit(address,address,uint256)","e06b7e39":"getInitOrInput()","e06b850c":"testIntParserTwoDecimal()","e06c0fd2":"SatoshiToken()","e06c5808":"burnFromAddress(uint256)","e06d8de9":"acquisitionsLockEndingAt()","e06e0051":"withdrowETH()","e06e0e43":"overLimit()","e06e3873":"encrypt(uint256[])","e06e6b20":"Like(bytes32,bytes32,uint256)","e06e82b2":"teamNIMFAAddress()","e06e9d22":"addCustomerTokenAmount(address,uint256)","e06ec0bb":"isListing()","e06f3d38":"ownerA()","e06fa13d":"ETCL()","e06fa68e":"updateAfter(uint256)","e06fc6d4":"mainsaleRemaining()","e0709589":"blink_block()","e0715a86":"unlocksCount()","e071681d":"setManyAccountsVerified(address[])","e071c0ca":"transferVaultOwnership(address)","e072830c":"FUNDING_ETH_HARD_CAP()","e0728801":"ANV()","e072bd10":"getPlayerInventory(address)","e073ef69":"pubKeyToBitcoinAddress(bytes,bool)","e0741187":"createBreedingAuction(uint256,uint256,uint256,uint256)","e074278d":"setOwnerAddr(address)","e074b027":"hasExecuted(uint256)","e074bb47":"removePermission(address)","e074ee55":"getPeriodsToPay(bytes32,address,uint256)","e0755792":"Permission(bytes32,address[],bytes4[])","e0755b35":"WePOW()","e076c0ae":"queryNow()","e0772f6a":"CROWDSALE_TOKEN_IN_WEI()","e0775be1":"create(address,address,address,address,address,address,address)","e0778211":"_releasableAmount(address,uint256)","e077ca97":"fx()","e078c549":"getNumberOfTokensToIssue(uint256)","e07959bd":"setGainsRate(uint256)","e079e334":"getNewCoinFee()","e079e7e5":"addStock(string,uint256,uint256,uint256,uint8)","e07a2671":"migrationSetPlayer(bytes32,uint256,bytes32,address,uint256,uint256,uint256)","e07a31c7":"getWinningCount(uint256,uint256)","e07a5d29":"CLRCoin()","e07be247":"createSellENS(string,uint256)","e07c80fb":"getKindAddress()","e07ccdeb":"totalPartnerWithdrawSupply()","e07cd936":"ArtcoinPlaceholder(address,address)","e07d4f6b":"saveCarDataTransaction(address,address)","e07f0b66":"SendMessage(uint256,string,address)","e07f0f13":"ZhangPeiPei(uint256,string,uint8,string)","e07f0f5e":"transferToken(address[],uint256[])","e07f3dd6":"go(uint8)","e07fa3c1":"withdrawFund()","e080241c":"setNFTDetached(uint256)","e080b60c":"apiCallsContractAddress()","e0812c75":"migrateInvestorFromHost(address,address)","e0813e25":"getRandomInt(uint256)","e0813e5e":"updateTokensPerEthOnce(uint256)","e08155dd":"ICO_PERCENTAGE_4()","e0815ca9":"findNextMinute(uint256,bytes2)","e0818669":"lps()","e081b569":"DiceOnline()","e081fdfe":"availableBalanceOf(uint256,uint256)","e082707c":"_uintToString(uint256)","e0832cf6":"getWinCount(address)","e0834ea4":"WatchBalanceInEther()","e083a1b5":"_createEstate(int256[],int256[],address,string)","e083d4c8":"dividendBalanceOf(address)","e084a819":"prepareCrowdsale()","e08503ec":"calculateNextPrice(uint256)","e085448f":"FIRST_USER_CUT()","e085942a":"getSubjectMattersSize()","e085c539":"getPlayerScore(address)","e085f82b":"rejectCertificate(address)","e086141d":"Assigned(address,uint256)","e0862fd7":"getNumBadBets(uint256)","e086e5ec":"withdrawETH()","e0873c06":"reissueAsset(bytes32,uint256)","e08761f5":"dtValidateCitySnapshot(address,uint256)","e087cd55":"withdrawIncentives()","e0882af8":"airDrop(address,address[],uint256[])","e0886f90":"at(uint256)","e088747b":"withdraw(address,uint256,string)","e088a96b":"claimerUnset()","e08a5f9e":"startPresaleDate()","e08ac014":"unlockPeriodNum()","e08b63ad":"getAddTokenNonce()","e08bc3fe":"parseInt(bytes)","e08d28d3":"maxInvestmentICO()","e08d8497":"ICO_LEVEL_2()","e08e433a":"transferTime()","e08ed5f9":"withdrawBid(int256,int256,int256)","e090318c":"setFacts()","e090ebab":"VUO()","e0911183":"devTeamAutoBuy(uint256,uint256)","e091de56":"MDA()","e091f453":"setDividend(uint256)","e0929b95":"claimFreeFirstCard(address)","e093a157":"abs(uint256,uint256)","e09413ba":"totalDistributedAirdrop()","e0945a80":"wbcoin()","e0950ddf":"getBet(uint256,address)","e095f814":"etherToToken(uint256)","e0963ced":"LinkEyeStandardToken(uint256,string,uint8,string)","e09678fd":"setIcoContract(address)","e097e7b9":"sendTokensBack()","e098161b":"getRareCoinAddress()","e09874c0":"setPlayConfigs(uint256,uint256,uint256)","e0987873":"BurnedAllRemainedTokens()","e098c76d":"optionPoolTotalMax()","e09adc70":"ethToTokenRate()","e09ca60c":"secureApprove(bytes32,uint256)","e09ceada":"_newAuction(uint256,uint256,uint256)","e09cffcf":"SingularityTest18()","e09d0b75":"compareLeaf(uint256,uint256,uint256,uint256)","e09dbfa4":"checkPatternExistance(bytes32)","e09dd024":"FNCTToken()","e09ded57":"lengthOfCommonPrefix3232(bytes32,bytes32)","e09e9490":"releasePendingTransfer()","e09ea701":"BaseMonoretoCrowdsale(uint256,uint256,uint256)","e09ee57f":"feePercentageMax()","e09ef83e":"promoCutieCreatedCount()","e09f0020":"subCreditScore(uint256,string)","e09f310a":"get_iconiq_presale_open(address)","e09f6f49":"successAtBlock()","e0a09c1f":"Crowdsale(address,address)","e0a0f50d":"setSlaveWalletPercent(uint256)","e0a1a292":"addressAdvisors()","e0a1be53":"updateTargetedMoneyReached()","e0a1ca6e":"winningChance()","e0a1fdad":"unset(bytes12)","e0a21739":"setBlackFundsWallet(address)","e0a27b2c":"withdrawWinnings(uint256,uint256)","e0a29e23":"owner_freeze_start()","e0a3bff7":"RollCount()","e0a3e7ec":"computeDeferBlock()","e0a49f14":"setMatchOutcome(uint256,string)","e0a4aacb":"ExacoreContract(uint256,string,string)","e0a53397":"createSingle(uint256)","e0a550fc":"closeMainSaleICO()","e0a60ea3":"BITTOToken()","e0a62339":"getSha256_UInt(uint256,uint256)","e0a668b4":"setVesting(address,uint256,uint256)","e0a70811":"restart(bytes20,bytes)","e0a73a93":"premium()","e0a7527d":"updateCABoxToken(address)","e0a7b2c3":"startChallenge()","e0a802ba":"scanInputs(bytes,uint256,uint256)","e0a827c6":"RxI()","e0a8299f":"galleryTwo()","e0a82ea8":"setMinBetPerRoll(uint256)","e0a8aa72":"channelOpened(uint64)","e0a8f6f5":"cancelProposal(uint256)","e0aa5654":"getCountReadyPlayerByTrackId(bytes32)","e0abdf66":"setBlockTimestamp(uint256)","e0ac2b72":"HaHaChainToken()","e0ac50cb":"isTreasureBox(address)","e0ac61bb":"changeOwnerSharePerThousandForMating(uint256)","e0acac7f":"withdrawSum()","e0ad411d":"assets(bytes)","e0ae751f":"setAuthorizedContract(string,address,bool)","e0ae96e9":"din()","e0b1cccb":"updateBalance(address,uint256)","e0b1cecd":"DataToken()","e0b30178":"OVCLockAllocation(uint256,address,address,address)","e0b3198c":"serverPort()","e0b3c49c":"acceptTermsAndJoinDXF()","e0b3cc90":"priceOf(uint32)","e0b438ef":"removeNameByOwner(string)","e0b45487":"_setValidator(address)","e0b490f7":"getAccountId(address)","e0b4cf0a":"setMinMaxBet(uint256,uint256)","e0b6cddd":"LLV_311_EDIT_2()","e0b78225":"RemoveTrustedContractAddress(address,address)","e0b86c53":"decreaseLock(uint256,uint256,address)","e0b999a1":"getAmount(address,uint256)","e0b9e83d":"update(address,address,address,uint256,uint256,address)","e0bab523":"for_rewards()","e0bb933b":"getDragon(uint256)","e0bc6c44":"claimInsurance(bytes32)","e0bc6dea":"removeTransferableAddress(address)","e0bd3015":"getClaimableBalance()","e0bd53be":"sellTokensForZec(string,address,uint256,uint256)","e0bd7d15":"addContributor(address,uint256)","e0bede59":"firstPeriodSupply()","e0bfa1f7":"removeUtilityHolder(address)","e0bfe9ad":"MAX_TOKENS_RESERVE()","e0c012ff":"modifyairdrop(uint256,uint256)","e0c104ad":"DONC()","e0c2bc77":"CDEos(uint256,string,uint8,string)","e0c2dcbd":"last_win_wei()","e0c4cea8":"GrowToken()","e0c5f3a0":"add256(uint256,uint256)","e0c6046c":"donateToProject(uint16)","e0c6190d":"checkTime()","e0c63902":"Ok()","e0c67b9c":"ROKToken()","e0c68db0":"shr(uint32,uint8)","e0c6d1ed":"migrateForInvestor()","e0c78337":"XITOToken(address)","e0c7c117":"Randao()","e0c82651":"RWToken()","e0cb3aa0":"buyWithLimit(uint256,uint256)","e0cbbde7":"makeCode(uint256,string)","e0cbf845":"testAddLocked()","e0cc4e1b":"LifCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address,address)","e0cd34f6":"getBlockBuildFee(uint256)","e0cd6eff":"board_size()","e0ce0b79":"processSeason(uint32)","e0ce72cb":"_fConfig()","e0ceb25b":"fairsaleProtection()","e0cec919":"setDailySupply(uint256)","e0cee23f":"SuccessfullyTransferedFromCompanyInventory(address,uint256,bytes32)","e0cf1316":"_transferPlayer(address,address,uint256)","e0cf17a5":"totalStoredDDT()","e0cf1e4c":"removeMembers(bytes32,address[])","e0cf715d":"EtherTrend()","e0cf72e1":"ERC20Token(uint256,string,string)","e0cfc05c":"testThrowsRetractLatestRevisionDoesntHaveAdditionalRevisions()","e0cfde22":"setRestrictedParticipationCap(address[],uint256)","e0d05c51":"MemoireClement()","e0d1ba52":"Rate_Eth()","e0d2771d":"MINIMUMINVESTMENTPRESALE()","e0d29d38":"STARTING_POOH()","e0d3558e":"GetBoosterData(uint256)","e0d370ac":"site()","e0d4ea37":"getSeed(uint256)","e0d4ea7e":"addDestructionProposal(string)","e0d54970":"getInstructions()","e0d5af94":"ownerWithdrawAll()","e0d669d8":"tradesLock(address)","e0d6d530":"setContracts()","e0d751da":"returnBets()","e0d77ff6":"hasBeenBooted(uint32)","e0d79d38":"addcertifieddata(string,string,string)","e0d872b7":"getSideServices()","e0d9bc7b":"sybmol()","e0da260c":"widthdraw(uint256)","e0da4abd":"getDefaultExchangeRate()","e0db6781":"offerDraw(bytes32)","e0db874d":"moneyBack(address)","e0dba60f":"setController(address,bool)","e0dbbea2":"search(uint256,bytes32)","e0dc892c":"GiftHasBeenSent()","e0dcf2d8":"processInitialDistribution()","e0dd31da":"MDCSToken(uint256,string,uint8,string)","e0dda563":"GetContractStagePreMoveIn()","e0ddaa0e":"MAX_TOKEN_BUYIN()","e0dec0c0":"contractValue()","e0df51bb":"test_oneValidAndInvalidEqAddress()","e0df53b9":"LotteryRoundStarted(bytes32,bytes32,uint256,string)","e0df5b6f":"setTokenURI(string)","e0dfd0a6":"GIFTCOIN()","e0e04685":"setOldContract(address)","e0e081d7":"marketStatus()","e0e0e2d3":"random(uint8)","e0e1104d":"tierWhitelist(uint256)","e0e11a14":"newVowIdFlag(address,uint256,uint256)","e0e1593c":"decayedPriceFrom(uint256,uint256)","e0e16f91":"TestContract(address,uint256)","e0e1a7f0":"testSHA3()","e0e267e5":"minimumWei()","e0e29ac1":"SLMICO(address)","e0e32504":"isDaySixtyChecked()","e0e34e06":"getGlobalConstraintParameters(address,int256,address)","e0e3671c":"checkOwner(address)","e0e3b9d7":"ImmutableShares()","e0e3ba5a":"getLosesShare(address)","e0e3feae":"skimALittleOffTheTop(uint256)","e0e40349":"name(address,bytes32)","e0e4704e":"RequestDetachmentOnPause(uint256)","e0e4731a":"TokenGoalReached()","e0e4c438":"sendInternally(address,uint256,uint256)","e0e58009":"BookingPoC(address,address,uint256)","e0e5fffd":"preSale4()","e0e69937":"setDefaultVestingParameters(uint256,uint256,uint256,uint256,bool)","e0e6d6cb":"requireValidIndex(uint256,uint256)","e0e7127a":"getContractOwnerAddress()","e0e722b7":"MAX_ALLOWED_STAGE_3()","e0e81ccb":"getCurrentSchellingRoundID()","e0e848c0":"checkDone()","e0e84e81":"changeCompanyWalletAddress(address)","e0e85fe8":"StatEventA(string,address)","e0e8823c":"withdrawDai(uint256,address)","e0e8a555":"KAL3Token()","e0e9b349":"getReportRegistrationFee()","e0ea129e":"militaryToken()","e0eb3035":"registerAudits(bytes32[],bytes,bool)","e0eb60b2":"initialSpinners(uint256)","e0eb6613":"PresalePool(address,uint256[],uint256)","e0eb9449":"mateAnimal(uint256,uint256,string,string)","e0ebd259":"discountValue()","e0ebdbff":"getAuditRequestor(uint256)","e0ec289a":"creditsExchanged()","e0ed78d1":"setRouletteRules(address)","e0ee74e9":"changeActualQueue(address)","e0ee94e9":"PocketCoin()","e0eef0b9":"BOOKIE_POOL_COMMISSION()","e0efdaf9":"softCapTokensAmount()","e0f0497d":"currentTokenSaleId()","e0f06352":"testIsContractAddress()","e0f20a65":"etherLock()","e0f31fae":"isDoneReporting(address)","e0f32198":"runSweepStake()","e0f3691d":"thisEther()","e0f426fa":"numMCApplied()","e0f47580":"withdrawCommisionToAddress(address,uint256)","e0f4a1a2":"minimumPRETDEContributionInWei()","e0f4ed01":"parcelEth()","e0f50bac":"senderWithdrawal(uint256)","e0f609d4":"unsafeIsEncrypted()","e0f6cc07":"isChain(string)","e0f74cde":"BONUS_TIMES_VALUES(uint256)","e0f771c9":"Bithumb(uint256,string,string)","e0f7b44d":"PreTgeExperty()","e0f898e4":"totalTokenLossValue()","e0f8c670":"getFirstPaymentAmount()","e0f8da97":"sponsoredBonusToken()","e0f9210b":"batchDistributeReward(address[],uint256[],uint256)","e0faf0a8":"getOnSaleIds()","e0fb8459":"recevedEthFromExchange(address,uint256)","e0fce922":"deliver(address,uint256,uint256)","e0fd59bf":"disableAdminForever()","e0fddf81":"setemployee(address,string,uint256)","e0fdf336":"finalReserveTimeLock()","e0fe01f4":"makePrediction(int8,string)","e0fe075e":"payoutReady()","e0fe42be":"existsPriceOnAssetPair(address,address)","e0fe4a84":"updateStrategyCategory(bytes15,uint256)","e0fe6d07":"SideBridge(uint256,address[])","e0fe9ccf":"WaltonTokenLocker()","e0ff5b8b":"getBook(uint256)","e0ff5d2f":"setMaxRacers(uint8)","e0ffa0da":"lastBlock_f13()","e0ffe8e3":"newOrder(string,string,uint256,uint256,string,string,string)","e1005556":"allowTransferWhitelist()","e1017332":"sellPaused()","e1021b53":"getLuckyRecordSize()","e10289b8":"addContributor(uint256,address,uint256)","e102baab":"setTokenController(address)","e102d950":"getNameHash()","e1036f86":"tax_distributed()","e1041d86":"__throw()","e106fae9":"lottoLowestNumber()","e106fb4b":"stringToBytes(string)","e1082335":"to(bytes32,address)","e1089240":"Csts()","e108d2d6":"setMintAdminApproval(address,address,address)","e1094ff6":"DGZTokensSold(address,uint256)","e1097249":"initStage()","e109ef24":"setTokenOperatorApprovals(address,address,bool,bool)","e10a70b7":"LogRedeemVIBE(address,uint256,uint256,uint256)","e10aa985":"Elyxr()","e10b650b":"winnerWithdraw()","e10bcc2a":"startMilestone(bytes32,uint256,address,uint32)","e10be707":"changeGoodBye(string)","e10c7bb5":"EventStore()","e10d29ee":"queue()","e10d416f":"enablePurchasing(bool)","e10d4c0b":"isSaler(address)","e10e274a":"CrazyEarning()","e10e5dce":"_build(bytes)","e10e66e6":"changeWeiPerToken(uint256)","e10e8ffe":"doOraclize()","e10e95c9":"fundingEnabled()","e10eda7a":"IOCFundIndex()","e10f1b06":"isTournament(address)","e10fb98f":"testMul()","e1103422":"retractRewards()","e11074cb":"initFund()","e1108706":"rfind()","e1112648":"record(bytes)","e1115aa5":"addUserRewards(uint256,uint256,address)","e1134799":"claimDaoStakeSupply(address)","e11398e8":"burnLeftovers()","e113c6fd":"ICO_SINCE()","e11443cb":"UWNToken(uint256,string,string,address)","e1152343":"payout(uint256)","e11527d4":"linkedContract()","e11583b7":"TokenOPSSaleAddress()","e116b17e":"getKudosLeftForProject(address,address)","e1175a79":"getMyTickets(string,address)","e117e6f9":"MyToken(uint256,string,uint8,string,uint256,uint8,uint256,string,string,string,string,string,string,string)","e1181c73":"faucetLif()","e1187e2e":"getCollectibleWithMeta(uint256)","e118eda4":"featuredSpritesLength()","e118fba2":"redeemPurchases()","e119f8bb":"migrateMarketInFromNibling()","e11a5a4f":"allocateStartBlock()","e11aa56d":"getDeedTimestampByAddress(string,uint256)","e11b09e0":"softCapCompleted()","e11b53af":"getContributionsCount()","e11dba54":"messagesLength()","e11df80d":"batchVipWithLock(address[],uint256[],bool)","e11e1b0c":"escrowBalance()","e11efa06":"getProgress(uint256)","e11f493e":"reentrancy()","e11f6398":"MAXIMUM_PERCENT()","e11fe9ec":"hasItem(uint256,uint256)","e12073a0":"getAllDetails(address)","e12097b7":"getCurrSale()","e121c102":"incentives(uint256)","e1221400":"getCoinInfo(string)","e1226164":"getFamilyById(address)","e122c028":"totalLBSold_GENERAL_2()","e122f1b2":"GoldenCurrencyToken()","e123182b":"purchase(bytes32,uint256)","e1248d52":"DYLC_ERC20Token()","e124e37b":"add_allowedAddress(address,address)","e124f899":"toPool()","e1252b9b":"make_anonymous_registration(uint256,uint256)","e1254fba":"getDeposit(address)","e125501f":"refundParticipants(uint256)","e125f88b":"aoccoin()","e1266042":"setTakeOwnershipFeePercents(uint256)","e126eb7d":"referralCodeFromAddress(address)","e1270b6e":"approval(address,address)","e1281280":"setAddressUIntMapping(address,uint256)","e12849b2":"getMineGenesis()","e1287520":"getBets(uint256,uint256)","e128f0d6":"getTogetherDate()","e12925a9":"setUnownedNickname(uint256,string)","e129330b":"factorContributed()","e129c99d":"notaryBookSize()","e129f783":"NameRegistered(address,bytes32)","e12a3bbe":"icoAllocation(uint256)","e12a894e":"CbdStandardToken(uint256,string,uint8,string)","e12badcf":"PlatformInformation()","e12bcd68":"relayerName()","e12bceeb":"performEqual(address,address[],uint256)","e12cbb3c":"SIGNAL_DELAY()","e12cbb9e":"updateOrderBatch(bool[],uint32[],uint128[],uint128[],uint32[],int256)","e12ed13c":"currentBlock()","e12ee8d7":"totalAmountRaked()","e12f3a61":"getClaimableAmount(address)","e12f670f":"DiscourzeToken()","e13044fb":"changeEth_to_usd(uint256)","e13062c2":"getInvoices(address,uint256[])","e1313dfb":"additionalInfo(uint256)","e13245b1":"getCommunityBallotsEnabled()","e13251b9":"listAssetsFrom(uint256,bytes32,uint256,bool)","e132db41":"checkRate()","e1332ab9":"setParameter(string,string)","e13380e9":"EmClassic()","e133ad53":"extendCost(uint256)","e1345b02":"SMARTGold()","e134c9ff":"shutdownMarket(address,bytes32)","e134e33d":"reason()","e1351c05":"pay_coin()","e1370365":"makeLogFill(address,address,address,address,address,uint256,uint256,uint256,uint256,uint256)","e137047b":"RESELLING_LOCK_UP_PERIOD()","e1376da2":"updateFirstActiveGamble(uint256)","e137cdd9":"totalTokenCreationCap()","e138efb2":"setAllowStart(bool)","e139e569":"getPriceAndTime()","e13a7716":"testReturn()","e13aba48":"testBurn()","e13bd03c":"delCashier(address,address)","e13da09f":"HARJToken(string,uint8,string)","e13dc28b":"testValidTransfers()","e13e2ecf":"dev_issueTo(address,uint256)","e13ec1fa":"RoundChanged(uint256)","e13efb79":"getReferenceHash(bytes32)","e13fafdb":"marketCoins()","e13fe91c":"REALPlaceHolderMock(address,address,address)","e1404b41":"setNewMembers(address,address,uint256,uint256)","e1419546":"makeLiquid()","e1421a45":"makeIntString(string,uint256,string)","e142967e":"addClaim(uint32,int256,string,string,bytes)","e1437b00":"calculateCurrentMarketPixelPrice(address[16])","e143b3a1":"createNewEscrow(address,address,address)","e1444721":"minGoalReached(uint256,string)","e1472d88":"increaseBalance(address)","e1479d07":"megoAddress()","e1479ebe":"is_registered(bytes32)","e1482188":"showCollectedFee()","e1486ea8":"getContest(uint32)","e1489191":"commission()","e148bae9":"assignClientIfNotAssigned(address)","e148fe28":"transferTokensFromReserveAddress(address,uint256)","e1496d16":"TEAM_NAMES(uint256)","e149fbfa":"ShapeshiftBotSolo(string)","e14a147e":"addPokemon(string,address,uint256)","e14acc04":"getCanLoanAmount()","e14b238a":"EITToken()","e14b7571":"stage_3_price()","e14b983e":"LevelToken()","e14c4675":"rateForMainICO()","e14c5e17":"setcreatorAddr(address)","e14ca10e":"oraclizeCallbackGasLimit()","e14df8b7":"subDepotEth(address,uint256)","e14e1ba7":"_getTokenAmountWithReferal(uint256,uint8)","e14e5ca4":"BETHER()","e14ed045":"getContributionOf(address)","e14f680f":"sendAll()","e151fb62":"_updateMetadata(uint256,string)","e153591c":"FairyFarmer()","e1538b32":"gasPayback()","e1539c53":"claim(bytes32,string,string)","e153b74e":"tokenFallback(address,uint48,bytes)","e154179e":"addToTrusted(string)","e1541b7d":"testDiacritcs()","e1541bc3":"setTdeIssuer(address)","e154d17d":"heldTokens(address,uint256)","e155999e":"getFreeCrocs()","e155b66c":"ConvnertToSecret(uint8,string)","e15618b9":"founderWithdrawablePhase4()","e1567997":"kscBatchTransferToBounty(address,address[],uint256[],uint256,uint256[],string)","e1568024":"totalAmountOfCrowdsalePurchasesWithoutBonus()","e1569f6b":"testThrowsSetNotRetractableNotOwner()","e15746af":"TJCUToken(uint256,string,uint8,string)","e157819a":"distributeCOMIKETCOIN(address[],uint256)","e1587aae":"maxFinneyPerSaleLessThan()","e158a24e":"ethTransfertoACC(uint256)","e1590ed7":"mainEtherReceived()","e15a307c":"killAndRefund()","e15cba26":"_pay(bytes32,address,uint256,uint256,uint256)","e15d051f":"adminUnsigned(address)","e15e9d47":"depositFlag(address,uint256,uint256)","e15f3ec2":"Sent(address,address,int256)","e1606013":"issueCert(uint256,bytes)","e160a1d6":"manaPerEth()","e160e146":"createContractToken(string)","e161c3bf":"getPercentage(uint256)","e1621b04":"getDatePosted(uint256)","e163698a":"setTokenForPublicSale(uint256)","e16385fc":"destroyTokens(uint256,address)","e163b75b":"settleBet(bytes20,bytes20,bytes32)","e164483f":"numberOfBlocksToStartGame()","e164ac50":"teamPercent()","e1654fad":"roundIn(uint256,string)","e1661eff":"getClaim(address,address,bytes32)","e1661ff2":"Later(address)","e1662aa6":"saveMsgByUser(string,string)","e166b756":"ownerMethod()","e166bebd":"BINOToken()","e1674588":"getTokenURIs(uint256,bool)","e1675421":"changeFsTKAuthority(address)","e167dbca":"exchangeTokens()","e168a31a":"getOwnedArea(address)","e168ae8a":"_isPreICO()","e168c3ec":"votes()","e16b924d":"sellBonds(uint256,bool)","e16ba8c6":"privateSale1Hardcap()","e16bd3b7":"getSales(address)","e16c7d5e":"signedApprove(address,address,address,uint256,uint256,uint256,bytes,address)","e16c7d98":"getContract(bytes32)","e16c8053":"setTransfer(uint256,uint256)","e16c8d4b":"viewMyShares(bool)","e16c93e5":"Swarm(address,address,uint256)","e16dbb2f":"Multiplication(uint256,uint256)","e16dd936":"getVestingSchedule(address,address)","e16e2843":"setdividendFee(uint8)","e16e9340":"getAddressArrayIndex(bytes32,uint256)","e16e93aa":"DU30Token(string,uint8,string)","e16f374c":"getHarborLocation(uint16,uint16)","e16f5fe9":"DeathFactor_iv()","e16fb2f9":"recordInvestment(address,uint256,uint256)","e16fe580":"CalcHash(bytes)","e1703521":"setPriceMoreThanOneETH(bool)","e170dd81":"MintingSale(address)","e1725c92":"decimalPlaces()","e1726faa":"pushDividendPayment(uint256,uint256,uint256)","e1727807":"splitPot()","e1727fc6":"contractDeployedTime()","e172a57e":"updateGenerationStopTime(uint256,uint8)","e172dac8":"ethOdinRate1()","e173b0d0":"reserveAll()","e17463c2":"changelp5(address)","e174f106":"ManualMigration(address)","e1757a3c":"TIMEOUTBLOCKS()","e1758bd8":"nativeToken()","e175c86a":"getInviteInfo()","e1765073":"getPath(uint256)","e17682eb":"StablePrice(uint8)","e177246e":"setDelay(uint256)","e17755c4":"zrxTokenContract()","e177573c":"setHatchTime(uint64,uint256)","e177644a":"TimeStamp()","e177b18b":"minCoordinatorCount()","e177b707":"Valdela()","e177bb9b":"registerCode(string)","e17928ba":"BOBOTOKEN()","e17a3ccf":"paused_4()","e17a5894":"yoobaTeamAddress()","e17a7c70":"stage3_start()","e17b25af":"setMetadataAddress(address)","e17b3054":"creatorOwner(address)","e17b35ed":"isMint(address)","e17bf87a":"testRewardBB(bytes32)","e17cb777":"rewardRetweet(address)","e17e1274":"testTransferToRejectAuthority()","e17e1a86":"SetupWWC(string,string,uint256,uint256,uint256,address,address,uint256)","e17e7a20":"setTotalStaked(uint256)","e17fc704":"canMintFoundation(uint256)","e17fe6a0":"getCreatorReward()","e17fec26":"Unregistered(bytes32)","e180819e":"setBuyTime(uint256)","e18099e1":"ethTokenRate()","e180dbbd":"isEarlyBird(address,address)","e180e23b":"Annexe_CPS_6()","e182e27a":"fastHatchingPrice()","e182fd01":"tokensBankPartners()","e184c9be":"expiry()","e1851b83":"getMaximumFundsInEuroCents()","e1859169":"communityContributionQuota()","e185a890":"widthdrawRefunds(address)","e185b24c":"emptyIndex(address[])","e1863b19":"MultisigWalletMock(address[],uint256,uint256)","e186fb27":"checkcitizendetails(uint256,string,string,string,string)","e1878925":"isDeregisterable(address)","e187a550":"logCall(uint256,uint256)","e187eaf7":"addMoreTime(uint256,uint16)","e1883433":"withdrawEther(uint64)","e189dba1":"sellIssuerTokens(uint256)","e18a9134":"getLockProducts(uint256)","e18af2b8":"PHPCoin(uint256,string,string)","e18b170e":"tune(uint256,uint256,uint256,uint256,uint256)","e18b7fcf":"receiveFee()","e18c52ae":"testControlTransferNotTransferable()","e18c8cf9":"etherInWei()","e18d38ce":"getPlayerName(address)","e18dc0f6":"pricingStrategyAddress()","e18e34d5":"setPayoutFee(uint256)","e18ed57b":"_calculateTax(uint256)","e18f1355":"TestERC20Token(uint256,string,uint8,string)","e18fb814":"setFixPrice(uint256)","e18fe709":"AirRewardTotalSupply()","e190264f":"newCampaignAccount(uint256)","e1909035":"GetCompetitionResults(uint32,bool)","e190d1b5":"claimFreeCrab()","e1911d70":"METADATA_URL()","e19136a4":"urbitAdminAddress()","e191548d":"AnimecardCore()","e192c4e0":"investor_Refund()","e1938b14":"oraclizeSetWinner()","e193b735":"tokensDonated()","e1948e44":"ethRateExpiration()","e194e369":"getFamedStarByName(string)","e19593e5":"cashout(uint256,address,address,address,uint256,bytes,bytes)","e195d096":"tokenReserved()","e195f2ec":"howManyFees()","e1980d15":"setBuyAuctionAddress(address)","e199b7e4":"getMasterAdress()","e199c8a8":"SafiraToken()","e19a7bc8":"stopMigration()","e19ab767":"totalDistrictSupply()","e19aca85":"takeDividends(address)","e19bb964":"priceIncreasingRatio()","e19bc813":"bonusesCount()","e19bc8e5":"initPrivateIco(uint256,uint256,uint256,uint256,uint256)","e19d36ff":"removeAsset(bytes32,address)","e19eaf79":"blocknumber(address)","e19f1c55":"EstatePurchased(uint256,address,uint256)","e19fb933":"MentalHealthLifeToken(uint256)","e19fd3c5":"determinePurchase()","e1a05087":"getImpactUnmatchedValue(string)","e1a05344":"createSaddle6(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","e1a1cd8d":"crowdfundEndDate()","e1a27ad3":"needsAdministration()","e1a283d6":"mintingPaused()","e1a29a3f":"setVariationAddress(address,address)","e1a2c446":"lockRewardTokenMany(address[])","e1a382f4":"ZTHToken(uint256,string,string,uint8)","e1a3e55c":"buy(string,address)","e1a44749":"setOptions(uint256)","e1a566f4":"challengeExists(string)","e1a57611":"tokenReceivers(uint32)","e1a58a74":"flowerContract()","e1a63c14":"PixelMap()","e1a67cd3":"overrideTokenHolder(address,uint256)","e1a69d88":"level_1_amount()","e1a6ddcd":"isValidContribution()","e1a6df9e":"FLIGHT_NUMBER()","e1a6e625":"TradingStart(uint256)","e1a6f014":"offer(uint256,address,uint256,address,uint256,bool)","e1a7739c":"getExercisePeriodDeadline()","e1a8af8a":"getWinnerPrize(uint256)","e1a9109d":"setSeedPrice(uint256)","e1a9a2b1":"endRound(uint256,uint256)","e1a9f9b9":"_buyCallToClose(uint256,uint256,uint256,uint256,address)","e1aa1098":"GuardaRegistro(string)","e1aa1bcc":"refundDeadline()","e1aa60dc":"lastBlock_v3()","e1aa7e95":"createNewUser(bytes32,bytes,address)","e1ab5860":"declarePublicOfferingPlan(uint256,uint256)","e1ab690e":"ANRToken()","e1ab7cda":"OnetVN()","e1aba68e":"newProposal(address,string)","e1abf819":"GetWinner(bytes32,address,bytes32,address)","e1ac48ad":"saleableTokens()","e1aca6fb":"quickSort(uint256,uint256)","e1ad1162":"transfer(address,uint256,bool)","e1ad7699":"setPayload(string)","e1ad84a0":"GetFixedPrice(uint256)","e1addfbb":"priceOfreservations(address)","e1ae91b3":"TestToken(address,uint256,uint256)","e1af0121":"associationOf(address)","e1af915d":"changeGenes(uint40,uint256)","e1afb08c":"unlock(bytes16)","e1b0d4b2":"setTransactionsAllowed(bool)","e1b27e6b":"COO()","e1b3f338":"undoPending(address)","e1b40a76":"ipfsAddress()","e1b41513":"LIVEToken()","e1b4d6cb":"HOTCRYPTO()","e1b5265a":"PutForExchange(address,uint256)","e1b53078":"makerAffiliateFee()","e1b54285":"endDateOfVipPlacement()","e1b5989d":"FastLoan()","e1b5ce0f":"buy(uint256,string,string)","e1b7535f":"getDepositor()","e1b7abda":"HOST_SHARE()","e1b8347b":"testFundsAreTransferrableAfterSale()","e1b84ac3":"_storeSettingCreation(address,uint8,string,address,address,string)","e1b8708f":"OwnerChanged(address,address,bytes32)","e1b92b21":"LogOmegaEggSale(address,uint256)","e1b9dc08":"setCallbackGasLimit(uint256,uint256)","e1b9dea4":"Globglogabgalab()","e1b9ed9d":"_buyTokens(address,uint256,uint16)","e1ba84a9":"testFallbackThenAdd()","e1baa2a0":"ownerAngelTransfer(address,uint64)","e1baa9cb":"CNT_Common()","e1baed1a":"hireBountyHunter(uint256)","e1bc048e":"clones_to_create_one_idea()","e1bc3003":"reveal(bytes,string)","e1bccc7f":"FccToken()","e1bd5af9":"contractHolderAddress()","e1bdc3c9":"addAddressMappingProposal(address,address)","e1be7467":"bounties()","e1bedf2a":"AlarmTester(address)","e1bf34e9":"transferToKnownContract(address,uint256,bytes32[])","e1bf4f50":"upgradeM5Logic(address)","e1bf50c8":"_transferChamp(address,address,uint256)","e1bfc31e":"acceptOp()","e1c0669d":"getJobSponsorshipId(address,address,uint256)","e1c093da":"getMinerBlock()","e1c1451a":"tokensIssuedMkt()","e1c18c42":"setEarned_money(uint256)","e1c1b939":"verifyTransaction(bytes32,uint256,address,address,uint256,address,address,uint256,bytes,bytes)","e1c33523":"xpaFundDeposit()","e1c3aedc":"updateRewardVaultContract(address)","e1c3bac6":"stakeMaxAge()","e1c3fb91":"_hasClosed()","e1c49dde":"previousRounds()","e1c4a6a6":"getIsRemoved(bytes32)","e1c4c9fe":"remainingReward()","e1c52dc6":"Confirmation(address,bytes32)","e1c5d838":"createOrgan(string)","e1c621c0":"_rewardTokens(address,uint256)","e1c66292":"Create(uint32,address)","e1c68f31":"findFloorKey(uint256)","e1c6b14b":"addToOtherMap(uint256,uint256)","e1c70b29":"_createPow(string,address,uint256,uint256,uint256)","e1c7392a":"init()","e1c7f06a":"AddSharedAccount(bytes32,bytes32,bytes32,address)","e1c80391":"setArtcoin(address,address,address)","e1c941b0":"batchSendWebGiftToken(address[],uint256)","e1c95bb9":"updateThresholdNewTokenPair(uint256)","e1c9ccaa":"ShopalToken()","e1ca1b7d":"FilmoljupciCoin()","e1ca6f6f":"distribute_100_tokens_to_many(address[])","e1ca8b57":"setNewPriceFuncAddress(address)","e1caa0c7":"createAndCall(string,bytes)","e1cb0e52":"getVal()","e1cb5515":"newArticle(string,string,string,address)","e1cba8d2":"TUBECOINcontract()","e1cd5fc0":"PROJECTOPERATION_SUPPLY()","e1cda468":"createRequestFromBytes(bytes)","e1ce95c8":"summon10SkinAppearance(uint256)","e1cf0b3b":"refundAllPlayers()","e1d001eb":"mintAllowance(int256)","e1d03d11":"setUnlockedAddress(address)","e1d07058":"_modifySpendLimit(uint256)","e1d10d85":"getMyTickets()","e1d10f79":"calluseraddress(address)","e1d1e8ef":"getCurrentUnitPrice()","e1d2d3e4":"SocialMedia()","e1d2f649":"restartAuction(uint256,uint256,uint256)","e1d30979":"wolkInc()","e1d35155":"ProudofYourCoin()","e1d4efc4":"YHT()","e1d5988e":"discount(uint256,uint256,uint256,uint256,uint256)","e1d5e8eb":"rollDices(uint256)","e1d5ec4c":"seedShare()","e1d6aceb":"transferWithComment(address,uint256,string)","e1d6e166":"getContracts(address,uint256)","e1d76c8e":"getBlocksByOwnerDesc(uint256,uint256,address)","e1d7ce2c":"EthCentsUpdated(uint256)","e1d7fadc":"disqualifyHopeful(uint256)","e1d81736":"addUser(uint256)","e1d94d94":"ownerChangeSlogan(string)","e1d9627f":"ReputationChanged(address,int32,int32)","e1da4135":"bountyFundAddress()","e1da4f85":"setStartStage2(uint256)","e1da5637":"setPercentWeiJackpot(uint256)","e1dace1a":"rewiewToken()","e1db206c":"limitTier1()","e1db8e7e":"getCreatedPayoutNumerators()","e1db8ff2":"mineForMany(address[],address[],uint8[],bytes32[],bytes32[])","e1dbc281":"changeBank(uint256)","e1dc7792":"OptedOut(address,address)","e1dcafa3":"setDefaultReputationReward(uint256)","e1dcf3de":"NewBooking(address,uint256,uint8,uint256)","e1de02f3":"_exit(address)","e1de373f":"addPlayerName(string)","e1df4517":"WealthChainToken()","e1df507c":"calculateAmounts(uint256)","e1df7f60":"startstopICO(bool)","e1e073b6":"amountTokenIssued()","e1e09299":"addUserRole(address,uint8)","e1e158a5":"MIN_DEPOSIT()","e1e1f977":"parseTx(address[4],uint256[3],uint32[4])","e1e29558":"completeTask(uint256)","e1e2ccd2":"sellDrugs()","e1e3f915":"parameterizer()","e1e46351":"mvpLaunchedAt()","e1e46f24":"tokenRate2()","e1e471eb":"BankingPayToken()","e1e4d737":"setTokenFront(address)","e1e5c093":"controlSum()","e1e7c320":"getGamesPlayerBids(uint256,address)","e1e85c4b":"splitProfit(uint256)","e1e867e5":"getFees(uint256,uint256,address)","e1e87c28":"refundToBuyers()","e1e87f40":"LogDividend(address,uint256,uint256)","e1e87f60":"_getBid(address,uint256,uint256)","e1e902af":"transferToLock(address,uint256,string)","e1e93604":"atomicMatch_(address[14],uint256[14],uint8[6],bytes,bytes,bytes,bytes,bytes,bytes,uint8[2],bytes32[5])","e1e9e249":"encodeAddress(address,address)","e1ea0a57":"TOKKA()","e1ea5e05":"token_fallback(address,address,uint256,bytes)","e1eb5f87":"NewPrice()","e1ebdb6d":"setWhitelistA(address,address)","e1ec12c7":"TopPlayerToken()","e1ed7fcb":"setBagMultiplier(uint256,uint256)","e1eddc6d":"_rand(uint256)","e1ee9284":"getOwnCard(address)","e1ee9a3d":"isPreIcoDate()","e1ef42b1":"Total_Investors()","e1efda6d":"airaSend(address,address,uint256)","e1f0ae1b":"NexoToken()","e1f0c376":"gameDuration()","e1f11822":"carnumOf(address)","e1f16616":"invcoinSentToEther()","e1f21c67":"approve(address,address,uint256)","e1f4895a":"getCostToken()","e1f4a9b1":"set_pre_kyc_bonus_denominator(uint256)","e1f51aca":"listTokenByRank()","e1f5760b":"horsesRemaining(uint256)","e1f57846":"com_fee_transaction(address,address,address,uint256,uint256)","e1f5eb3f":"convertTokens(uint256,address)","e1f5ebc5":"_projectAddNew(address,uint256)","e1f6452e":"AggiungiNegoziante(address,bool)","e1f69952":"voteSvp02(bool)","e1f7d0e1":"PRE_SALE_END()","e1f7ec5a":"getStored()","e1f82d60":"publicReservedToken()","e1f86887":"getPortfolioTable()","e1f87904":"getNextDouble(address)","e1f8922e":"transferName(address,string)","e1f8926b":"depositEthPool(uint256)","e1fa70ef":"endCloseSale()","e1fa7638":"attack(uint256,uint256)","e1fa78e9":"AgriChainLabelInt()","e1fa82d0":"transferFromFlower(address,address,uint256)","e1fa8b02":"distribute(uint256,address)","e1fa8e84":"register(bytes32)","e1fb070e":"MtTaborToken()","e1fbeaed":"CUCUX()","e1fcad6a":"_equipUpOne(address,uint256)","e1fcb86d":"YouTube()","e1fd3d4e":"emergencySetDOwner(bytes32,address)","e1fd632f":"EDU_KYC_BONUS()","e1fdb4b4":"refundBet(uint256)","e1ff98f2":"getTotalCounter()","e1ffdecb":"tokensPerTranche()","e20056e6":"replaceOwner(address,address)","e200cee8":"setBossWannaCryInterface(address)","e201be98":"airDropToken()","e201d466":"MultiToken(uint256,string,uint256,string,string,uint256)","e2021f66":"getAttack(bytes32,bytes32,uint256)","e2022d3a":"storeNewVesting(address,address,address,string,uint256)","e202e1eb":"contractPartOne(uint256)","e20314ed":"trade(uint256[10],address[4],uint256[6],bytes32[4])","e2034834":"RemoveRocketForSale(uint32)","e203f335":"leafPrice()","e2045452":"setUsername(address,string)","e2045b5e":"getBadgeInfo(uint256)","e2047589":"assertEq(address,address,bytes32)","e204ce12":"transferExtra(address,uint256,uint256)","e2056c46":"ExtraBalToken()","e2059fdf":"showIssueDetail(address,bytes32)","e2069734":"destroyRemainingTokens()","e2087a44":"receiveApprovalTest(address,uint256,address,bytes)","e209bf22":"addMeme(string,string)","e20a4bcd":"recoverAddressFromCooperativeSettleSignature(bytes32,address,uint256,address,uint256,bytes)","e20a5ac2":"bonusFourthWeekPeriod()","e20a9ae9":"Tesoro()","e20acc79":"changeInterval()","e20b7d3c":"checkPoolAddressTierCap(uint8,uint256)","e20bbd8d":"RecoveryWithTenant()","e20bc67b":"autoUnlock(address)","e20bce0a":"lowTimeBonusValue()","e20c6d3d":"getMessageData()","e20ccec3":"pending()","e20cfc4a":"payedDividendsUSD()","e20d35ad":"CellBlocksToken()","e20dc05b":"globalOperator()","e20de6eb":"addrLockedFunds()","e20e1dc3":"createProxy(address[],uint256)","e20e36a0":"ExchangeAdapterBase(address,address)","e20e54a5":"getMHTHoldersNumber()","e20ff6f7":"fetchCurrentSatoshiState()","e2101509":"getSketchesWithHolder(address)","e211003d":"processOffChainPurchase(address,uint256)","e2119c80":"computeRealCap(uint256,uint256)","e2121de1":"withdrawAny()","e2130d1e":"unlockTeamTokens()","e21316ea":"mortal(address)","e213beb7":"transferCoOwnership(address)","e213e10a":"_createMeme(uint256,string,address,uint256)","e2153231":"SahilToken()","e2155c14":"galleassMint(address,uint256)","e21608be":"ReserveToken()","e2164700":"currentRewardNum()","e216bf4d":"SetBlockForSale(uint256,uint256,uint256,address)","e2172000":"left63(uint256)","e2179b8e":"g()","e21827a1":"unmintedTokens()","e218519c":"getref()","e2187e6e":"endTimeLockedTokensTeam()","e2188190":"CROWD_WAVE3_PERIOD()","e219aa11":"GetEscrowETHBalance()","e219b9e1":"rebateOneFenmu_()","e21a430b":"publicRelease()","e21aaa0f":"_getShipPrice(uint256,uint256)","e21ac8a1":"AvatechToken()","e21b0b95":"updateGlobalMinContribution(uint256)","e21b63b2":"setNewMint()","e21b9d08":"m_changeable()","e21be4f4":"CBMTToken()","e21c4783":"isPermitted(address,bytes32)","e21e221b":"ContributionRegistration(address)","e21f37ce":"message()","e21f44f4":"PoolCreated(uint8,uint256,uint256)","e21f8e56":"get_game_fees()","e21fd9fc":"_owns(address,uint256)","e2202a4d":"jester()","e2211592":"TWO_DAYS()","e2217114":"forwardEther(uint256)","e2217d5c":"payeth()","e2219773":"webGiftOnceMaxAmount()","e221d5d5":"getDukeNickName(string)","e222b00c":"blocksPerPayPeriod()","e22325ad":"transferBase(bytes32,address)","e2233ada":"smartDoor(address[])","e223b547":"calcFixedReward(uint256)","e223cb37":"AddBill(uint256,uint256,uint256,bool)","e223ed87":"getPetValue(uint256)","e223facb":"USER_GAME_WITH_TOKEN(uint256)","e224179e":"icoOverride()","e22497e4":"removeFromPublicSaleWhitelist(address[])","e225c56b":"KudosToken()","e225e588":"TNCN()","e226a1b6":"getAddressStatus(address)","e226cdec":"sellOffline(address,address,uint256)","e226ed22":"balanceOfERC20(uint256,address)","e227b5d1":"ETHContributed(address)","e228647f":"olty_6()","e228a6f4":"withdraw(uint256,uint8,uint16)","e228d627":"nextTokenAddress()","e228ecb4":"lockBalance()","e22938bd":"ShareManager()","e22955c6":"MultiplyContract(address,uint256,uint256,uint256,uint256,uint256)","e2298591":"xIPFSPublicKey()","e22a3af8":"canClaimTokens()","e22a6231":"addCandidate(address,string,string)","e22a9877":"getHWCAddress(address)","e22aa47a":"lockTokensForCs(address,address,address)","e22ad518":"startNextPremiumSale()","e22ae31d":"FrameCoin()","e22b0c46":"verify(uint256,uint256,uint8,bytes,bytes)","e22b3fb4":"changeOwner(bytes)","e22b94e8":"ForceCryptoInvestmentCoin()","e22baa56":"nonZero(uint256)","e22bda35":"eventVenue()","e22c6128":"getIncome(address)","e22d1581":"saleEnd2()","e22e8046":"getLunckyIndex()","e22ed995":"createStudent(string,string,string,uint32,bytes1)","e22f8dc9":"buy_lovelock(string,string,string,uint256)","e22fb860":"CJXToken()","e22fcd08":"useItems(uint32,uint256,address,uint256)","e23000a0":"buyBackPrice()","e2301d02":"subApproval(address,uint256)","e2306253":"o1Address()","e230dfbd":"setETHUSD(uint256)","e230e246":"cutFor(address,uint256,uint256,uint256)","e2311a78":"Payperblock()","e2313d1f":"ClaimOrichalcum()","e231bff0":"redeemed()","e2322c73":"firstPeriodWindows()","e2326909":"addCourse(string,string,string,uint256,uint8,uint8,uint16,uint8,uint8)","e2331332":"AortaToken()","e2332120":"secondUnlockTime()","e233ee0d":"publicFillOrder(bytes32,uint256,bytes32)","e2356efd":"holdTokensOnStage()","e235847a":"addSourceForTimeline(uint256,uint256,string,bool)","e235ca59":"revealsCount(uint256)","e236de22":"distributorWallet()","e2376be1":"sendMon(address,address,uint64)","e2387bb6":"AuctionHouse()","e238c7ed":"setAllowanceAdmin(address,address,uint256)","e238def9":"getReleasedBalance()","e23941bc":"testDepositWithdraw()","e239421d":"Lotthereum(uint256,uint256,uint256,uint256,bytes32)","e239ccba":"Disco()","e23a15b5":"logSigned(string,bytes16)","e23a4916":"getMainLockup()","e23a7785":"approveAndBuy(uint256,address,uint256,bool)","e23a845a":"getExpirationTime()","e23c5063":"getAttributeValue(address,bytes32)","e23caa06":"getLotteryDetailsA(int256)","e23cbad1":"getArkData(uint256)","e23d0996":"getDBallotID(bytes32,uint256)","e23d0b23":"week2Price()","e23da75a":"setTokenApproval(uint256,address)","e23e231f":"TOKENS_NOT_FOR_SALE()","e23e3229":"investorIndex()","e23eaae6":"SmogToken()","e23eb0c5":"_calculateFEE2Distribute()","e23f5e49":"checkLucky(address,uint256,uint256)","e23f61f6":"isCurrentOrPastAdmin(address,address)","e23fc908":"_setBurnFeeAbs(uint256)","e2418c15":"throwsWhenNetworkPlaceholderIsBad()","e241c1d9":"deriveKey(uint256,uint256,uint256)","e241e9c5":"_getUt(address)","e2420bd2":"setTwitterBot(address)","e242df57":"MiracleTeleToken(uint256)","e242fbbb":"addHuman(string,uint8)","e244054a":"trade(bool,bytes,uint256,uint256)","e2442441":"VpaxContract()","e24459ce":"rakugoPresaleAddress()","e2449c13":"createSqr(uint256,address,uint256,uint256)","e244fe89":"addToCommunitySaleWhitelist(address[])","e2454522":"verify(uint8,bytes32,bytes32)","e2457f50":"changeZS(address,address,uint256,uint256)","e24613ea":"getNexOrdertUser(address,address,uint256,address)","e2466cb6":"invalidateAnnouncement(uint256)","e24670eb":"EthToCentsUpdated(uint256)","e246ddba":"icoFinishTime()","e246f71a":"EventAddManager(address,address)","e247a2e2":"updateVolume(uint256)","e248b435":"setCCH_edit_15(string)","e2496d5b":"tokensWeiRaised()","e2499b98":"stakedContentById(bytes32)","e249a575":"setTermsNumber(uint256)","e24a1d1e":"deauthoriseMaker(address)","e24a5042":"transmuted(uint256)","e24b4403":"_emitDeposited(address,uint256,address)","e24b7721":"addressLeskiw()","e24c36d0":"flushEra()","e24cddd6":"getCartLength(address)","e24cf226":"closeEscrow(uint256)","e24f8313":"addReputation(address,uint256)","e24fe110":"Decentralized()","e24fed00":"assertEq(bytes,bytes,string)","e2506eab":"setEMAValue(uint256)","e250ecfe":"Cogenero(uint256,uint256,uint256,address)","e251e358":"preIcoSoftCap()","e25209b6":"roundOneLimit()","e253c21d":"ZBCToken()","e253dd6b":"setBonusRound4(uint256)","e2542f03":"updatePurchasePossible(bool)","e2550156":"smallBlind()","e25520a7":"LocklistAddressdisable(address)","e2558086":"calculateLandmarkPrice(uint256)","e255d5ad":"maxBuyRateInPrecision()","e25665da":"earlyBackersPoolAddress()","e256888f":"PERCENTAGE_PRECISION()","e2573266":"withdrawRC()","e2575e48":"_isMultiple(uint256)","e2576998":"changeMaxCoefPartnerForEmission(uint256)","e2583070":"balanceImportsComplete()","e25876d3":"weiToFinney(uint256)","e258a0f0":"createItem(string,uint256,uint256,uint256[6])","e258aa02":"createPromoRegion(address,string,uint256)","e258be32":"removeBookSigner(bytes16,address)","e259501e":"contributorsWallet()","e2595235":"addPack(uint8,uint128,uint256)","e259d074":"endauctionother(uint256)","e25a2a99":"updateTier(uint256,uint256,uint256)","e25a51b6":"setCompositeReputation(string,uint32)","e25ade5f":"issueTokens(address,uint256,uint256,bool)","e25b5cbd":"STAKE_APR()","e25bc771":"_transferCard(address,uint256,uint256)","e25bd409":"receivePositionOwnership(address,bytes32)","e25c80d0":"_currentIcoPhaseMinimum()","e25c9c33":"getBadgeLevel(bytes32,uint256)","e25d4dac":"mintFund(address,uint256)","e25f0a98":"requestedForMigrationAt()","e25fe175":"step()","e2616387":"MPY(uint256,uint256)","e26176d9":"FundRanking(address)","e261fc63":"UserRank(address)","e2621a66":"HPBToken(address)","e26259a4":"updateMyHns(string,address)","e264172c":"drainETH()","e26422fe":"DaysToDestroy()","e2646a9f":"getICOStage()","e2649caf":"voteToFreezeFund()","e264a2f4":"KIN_PER_USD()","e264fc07":"_buyFillet(address,uint256,bytes)","e2651539":"priceCreatingChannel()","e26534bf":"whaleExchangeRate()","e2659324":"require_email(bool)","e265c5e2":"getTotalTokenWithdrawByAddress(address)","e2664254":"priceDivisor(uint256,uint256)","e26659da":"getAllBaller()","e26693ac":"stakeDice()","e266e5ad":"Mystical()","e267761f":"unmintedGBT()","e267dd9b":"addAgent(uint256,uint256,uint256,address)","e26814d8":"withdrawCoins(address,uint256)","e26835ce":"giveToken(address)","e2684f08":"_isPaused()","e268ea6b":"SOFT_CAP_T()","e269053a":"getNumberOfAssets()","e2693180":"DHANACOIN()","e269f929":"recoverRevokeHash(bytes,bytes,uint256)","e26a687f":"BP_IMMORTAL()","e26ba086":"getTargetInvalidMarketsDivisor()","e26bc039":"numRegisteredModules()","e26c2da9":"TerraToken()","e26c551e":"publishConditions(string)","e26c8434":"AdminStartDraw(string,bytes)","e26dee0e":"IcoExt()","e26e7b50":"calculateCritMassRewards(uint256)","e26e8d84":"FillSellOrder(address,address,uint256,uint256,uint256,uint256,uint256)","e26f0342":"ArrayTypesTest(uint256[10])","e26f21bf":"setHoldPercentage(uint256)","e26fdc12":"equipDown(uint256)","e27008c2":"_createRareCard(address,uint256,uint256,uint256,uint256)","e270398a":"emitJobPosted(uint256,address,uint256,uint256,uint256,bytes32,bool)","e270bc81":"resumeICO(address)","e270f88c":"_getFreezeTime(uint256)","e27131f9":"MintCoin()","e2725161":"calculateOdds(uint8)","e2726e94":"minSumICOStage4USD()","e272b892":"pauseContract(bool)","e2734c93":"getPlayerBalance(address)","e273f117":"SetServiceProviderFee(address,uint256)","e2749799":"GBank(uint256)","e274a3e7":"Papergold()","e274fa4e":"BitcoinXL()","e274fd24":"eventContract()","e2757a50":"PepFarmer()","e275a016":"check_data(string)","e275f296":"transferFromMulti(address[],address[],uint256[])","e27671ff":"hillpayout()","e276729d":"getPeriodStarted(uint256)","e276c799":"getx()","e2775da5":"getMartialOwner()","e2776ab8":"CryptoPhoenixes(address)","e2786d65":"refundSplitMembers()","e278c0f2":"setInvestorsFee(uint256)","e278d283":"getLineUpEnable_pool(address)","e278fe6f":"closeRound()","e2790853":"OX()","e27929b6":"addRecord(bytes32,string,string)","e27a8aca":"addWhiteListedInvestor(address,string)","e27a9c74":"setOwnerName(uint256,string)","e27b73f0":"issueWithExternalFoundation(address,uint256,bytes32)","e27c5b17":"testSlice()","e27da9c6":"current_tier()","e27e3fd3":"CancelGame()","e27ecfcc":"LogStartDate(uint256,uint256)","e27f0236":"agingBalanceOf(address,uint256)","e27f1692":"Bitsonatoken()","e27f3853":"timeFreezeTeamTokens()","e27fe50f":"startAuctions(bytes32[])","e280b58f":"tokenIssuedLockUp()","e280d66b":"updateWonNums(uint256,uint256)","e2812256":"Monarch()","e281d7e4":"CryptoSlotsGame()","e282348c":"w_Founders()","e282726b":"reserveAddr()","e282938d":"founderLockEndTime()","e282969e":"getPerson(uint256,bool)","e282cda6":"calculateBucketId(bytes32[])","e283d1ec":"registerEscrow(string,string)","e2842d79":"getAllUsers()","e28435c4":"ownerETHCashout(address)","e284cbfa":"getAllAdIdsByCat(uint256)","e2861c8d":"cashOutProfit()","e2865b4d":"growCost()","e2868c54":"Airdrop2(uint256)","e2869853":"RefID(string,string)","e2869f70":"setCrowdsaleAndVesting(address,address,address)","e2877e04":"transferFactoryResourceAmount(uint16,address,uint256)","e287adf4":"addSig(address,bytes32)","e2889c82":"setTimeLimit(uint256)","e2894a8a":"OwnerAnnounce(string)","e2896598":"leaderTimestamp()","e289fcb6":"contractActive()","e28a5e63":"sellDeadline1()","e28ab336":"MAX_INVEST_SHARE()","e28b0d9a":"updateFundingEndBlock(uint256)","e28b2b76":"ipoPlatform()","e28b7555":"CapiterContract()","e28d717b":"transferETH()","e28d8c4b":"claimBonusTokens()","e28deda5":"sweepTokenAmount(address,uint256)","e28e6b3a":"masterTotalEarning()","e28fa27d":"setHardcap(uint256)","e28fed1e":"userRescues(address)","e29121de":"ADVISOR_TOKENS()","e2912367":"_getValuePartByPercent(uint256,uint256)","e292c740":"setLargeInvestorWei(uint256)","e2935edb":"getUpgradeCardList(address)","e2948c21":"marketingTeamTokens()","e29532c1":"getDataFromCode(string)","e2954a14":"purchaseSeconds()","e29581aa":"getNodes()","e2958974":"read_transfer_config()","e295c9d6":"getActiveBanners()","e297273a":"getBlockHashOrZero(uint256)","e298287f":"senderAddressIsSecretContract(address)","e2982c21":"payments(address)","e2985596":"angelCardDataContract()","e298d85c":"discountBlock()","e2996879":"HuoNiu()","e299beb3":"SimpleIndex()","e29a2e89":"publishMessage(string,string,string)","e29a82d3":"BigFishRoll()","e29bfe13":"submitWithdrawTransaction(address,uint256)","e29c6a7b":"addYearToken()","e29caee2":"currentStageTokensRate()","e29e1345":"amountPerDay()","e29e1864":"PresaleCapChanged(address,uint256)","e29e3a4c":"artistsArtworkCount()","e29e436a":"setWorldCupTeamDesc(uint256,string)","e29eb836":"totalCollected()","e29f5182":"byte32ToString(bytes32)","e29f610d":"end1Timestamp()","e29f99f0":"tokenAdd()","e29f9da6":"_getrand09()","e29fa4b4":"setOriginalOwner(uint256,address,address)","e29fb547":"scheduleCall(bytes4,uint256,uint256,uint8,uint256)","e2a034dd":"participantsFirst(uint256)","e2a0d56d":"FundsBurned(uint256)","e2a27ca8":"_setBorderValue14(uint256)","e2a288c0":"placeCoin(uint16,uint16)","e2a2adc2":"divisionRoundedUp(uint256,uint256)","e2a3382f":"holdedOf(address)","e2a376ec":"addContributor(address,uint256,uint256,uint256,uint256)","e2a38a4b":"removeTokens(address,address,uint256)","e2a4853a":"setUint(bytes32,uint256)","e2a51b8f":"amountOfParticipants()","e2a5c39f":"revealPeriodStartedTimestamp(bytes32)","e2a71f12":"accountDelete()","e2a8215b":"purchaseTokens(address,uint256,address)","e2a9ba05":"getBoosterDuration(uint256)","e2a9bb53":"CreateBattleCards(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)","e2a9ca4c":"disableTokenTransfer()","e2aa2dcf":"CryptoPeopleName()","e2aa6003":"gameResult(uint256,uint256,uint256,bool,uint256,uint256)","e2aa6c66":"createPasswordChallenge(bytes20,bytes32)","e2aa99ab":"startCrowdsaleY2(address)","e2ab691d":"lock(address,uint256,uint256)","e2acf75d":"auctionCancel(bytes32)","e2ad0699":"addCertification(address,bytes32,bytes,bytes32)","e2ae0c79":"setParentID(uint256,uint16)","e2ae9de0":"deleteArrayUint(bytes32,uint256)","e2b05077":"getSaleDate(bytes,uint256)","e2b0caef":"when()","e2b13fa0":"ManagerPermissionRevokedEvent(address,string)","e2b178a0":"getAuthority()","e2b202bf":"deleteUint(bytes32)","e2b20a72":"SecretToken()","e2b2579b":"isClean(address)","e2b26323":"proceedToNewStage(int256)","e2b375a9":"transferOwnership2(address)","e2b43e23":"setDepositInterface(address)","e2b4b30d":"getvaluejoinlist_odd(uint256)","e2b4f4b5":"lockedTeamUFT()","e2b770b4":"updateUSDMonthlySalaries(address,uint256,uint256)","e2b7713f":"Midel()","e2b863cf":"calculatePayout(bytes32,uint256)","e2b8766c":"testFailTransferNotTransferable()","e2b91318":"createOptionAndUnderwrite(bool,address,uint128,uint128,address,uint64,uint256)","e2b9e186":"name_()","e2b9e322":"bondsOutstanding(address)","e2ba53f0":"winnerName()","e2ba600e":"starting_giveaway()","e2ba6ce8":"m_KYCProvider()","e2bbb158":"deposit(uint256,uint256)","e2bc1971":"getGamblerGameIds(address)","e2bca77e":"calculatePrizeAmount(uint256,uint256,uint256)","e2bd505b":"setTitulaire_Compte_2(uint256)","e2bd8e43":"CodysToken()","e2c03ace":"itemsCount()","e2c14bdd":"getMapping(bytes32)","e2c1f02c":"buySuperDragon()","e2c1f7d7":"firstCapEndingBlock()","e2c20836":"updateAndGetHodlTotalValue()","e2c2ae5a":"isBuyPrice(uint16)","e2c2d72c":"setChallengeScienceContract(address)","e2c31be6":"icssale(address)","e2c345e2":"originalContract()","e2c38eaf":"findProductIndexById(uint256)","e2c3941a":"DOG_Token()","e2c3f9a8":"RATE_PUBLIC_SALE()","e2c41dbc":"depositFunds()","e2c516be":"icoReceivedWei()","e2c518fa":"lastMovement(address)","e2c5449e":"chanceNo()","e2c61114":"setImportFee(address,uint256)","e2c6d41c":"council()","e2c718d8":"right20(uint256)","e2c76bb0":"SpeculateCoin()","e2c7f7ae":"majorOwnerShares()","e2c86092":"ifoodCommunity()","e2c8a8ad":"contributorPoolMintQuota()","e2c8dd34":"dividendsWallet()","e2c8e54a":"senderIsPosition(address,address)","e2c8f7c8":"ARIWallet()","e2c92a52":"distribute(address,uint256,uint256)","e2c9b07d":"ChangeBillLeasingInfo(uint256,uint256,uint256,bool)","e2c9bc9e":"GenesisTransfersCount()","e2ca01f0":"addNewOrUpdateHolder(uint256,bytes32,bytes32,bytes32)","e2ca481c":"swaps(address,bytes20)","e2cbb9b7":"evCreatedToken(address,uint256,address,uint256)","e2cc20bd":"dealerHit()","e2cc7a51":"signingPrefix()","e2cdd42a":"vote(uint256,address,bool)","e2ce7e67":"read_i16_array()","e2cf8b0d":"createBundle()","e2d07a33":"QYKToken()","e2d0d519":"sendOwnership(address,uint256)","e2d17ab1":"checkGoals()","e2d1da31":"createBuildingOmni(uint32,uint8,uint8,uint8,uint8,uint8,address,bool)","e2d2a868":"autoRefundCrowdsaleContributor(address)","e2d2dcca":"removeMemberAcct(address)","e2d2e219":"dividendsPerShare()","e2d31df4":"getTeamPerfitAmuont()","e2d45f7b":"transferMultipleDelegated(address,address[],uint256[],uint256,uint256,uint256,bytes)","e2d56060":"balanceInWei()","e2d5d11b":"revealCap(uint256,uint256)","e2d6eddc":"get_row_col(uint256,uint256,uint256)","e2d7a7c0":"setAttrCustom(uint256,uint256,uint256,uint256)","e2d7c64c":"darknodeRegisteredAt(address)","e2d84e23":"getLink()","e2daeb9c":"NICTO()","e2dbbf62":"changeIcoDiscountLevels(uint256,uint256)","e2dc35e0":"transferFund(address,uint256)","e2dc5da5":"finishMintingTokens()","e2dc7763":"freeze(address[],bool)","e2dc9aa1":"addTransaction(string,uint64,string)","e2dea715":"getMinerId(address)","e2deaa81":"set_reference(uint256,uint256,uint256)","e2deb962":"signUp(uint256,bytes32)","e2dede94":"getNode(uint256,uint256)","e2df0463":"changeTrancheAdmin(address)","e2df15d6":"setRewardClosed(uint256)","e2df20d1":"setAvailable(bool)","e2df2472":"Aurum()","e2df6c6f":"getBonus3(uint256)","e2e0c049":"UpdateSellAgent(address)","e2e15f2e":"Reward()","e2e1ff4d":"getBallotsNum(address)","e2e267fc":"SintToken(uint256)","e2e29ffe":"assertThat(bool)","e2e2e5cf":"UpdateMinBalance(uint256)","e2e39498":"_verifySignature(bytes,bytes,bytes)","e2e51348":"LogContractCreated(address,uint256)","e2e54288":"getCertificationList(bytes32,bytes32)","e2e5bd42":"setBetBasic(uint256)","e2e5fade":"presaleSales()","e2e616bb":"whiteListEnabled()","e2e68372":"IAM_PER_ETH_PRE_SALE_RATE()","e2e686d0":"safeAdd32(uint32,uint32)","e2e71098":"_FCTOKEN(uint256,string,uint8,string)","e2e794c3":"setPremiumMultiplier(uint8)","e2e79a02":"level2(address,address)","e2e7ab3a":"setEthlanceInvoiceContract(address)","e2e831cf":"genders(uint8)","e2e8b978":"sizeOfUint(uint16)","e2e9e6e8":"updateMaxMinComparables(uint256,uint256,uint256)","e2eb3336":"_performPurchase(uint256,uint256,address,uint256,address)","e2eb91cc":"removeAddressFromOwners(address)","e2ec6ec3":"addAddressesToWhitelist(address[])","e2ecb311":"createEscrow(address,uint256,uint256)","e2ecef03":"boleno()","e2edfc20":"collectAirDropTokenBack(uint256)","e2ee2e89":"isPlayerInRound(uint256,address)","e2ee9941":"tap(bytes20)","e2ef9241":"FawnCoin()","e2f0a05a":"TokenCLC(uint256,string,uint8,string)","e2f1d298":"_addGroupToMember(address,bytes32)","e2f23224":"isEnableBuySell()","e2f273bd":"updateAdmin(address)","e2f2eb27":"NUMBER_OF_BOOSTERS()","e2f31829":"updateStatus(uint256,uint256)","e2f35f17":"teamAccountAddress()","e2f36034":"calculateRevenueAtBlock(uint256)","e2f45eba":"PrettyGirl(uint256,string,string)","e2f60706":"specialPurchase()","e2f60c26":"getMintAuditApproval(address,address)","e2f779f3":"withdrawTokensFromCustody(address,uint256,address,address)","e2f77ae2":"setPriceInExoTokens(uint256,uint32)","e2f8a017":"payInstallment(uint256)","e2f8b790":"buyBlueStarEgg(uint256,uint16)","e2f8fa16":"getPendingTaxData()","e2f8feb2":"internal_tester(int256)","e2f90632":"notTooLongSinceUpdated()","e2fa5398":"pack(uint16,uint64,uint64)","e2fa5fb1":"secondDiscountCap()","e2fa6f90":"_removeTokenFromOwnersList(address,uint256)","e2fa9ee0":"openShop(uint256)","e2faf044":"createDAO(address,uint256,uint256,uint256)","e2fb3d4a":"setReferralSmartContract(address)","e2fc2691":"upvotePost(bytes32)","e2fc421d":"crowdsaleStartTime()","e2fc5d19":"setConfirmations(bytes32,bool,bool)","e2fc6f68":"beneficiaryBalance()","e2fd38e9":"startEvent()","e2fd3c08":"OmVPNToken()","e2fdcc17":"escrow()","e2fdf807":"purchasableTokens()","e2fecdf3":"copy(bytes,uint256,uint256,uint256)","e2ffe3f3":"storageToUint(string)","e3004b57":"depositToken(address,bytes)","e30081a0":"setAddress(address)","e3038aaf":"calcOrderToMsAmount(uint256)","e303a92b":"drawLottery(uint256)","e303cccd":"sellKun(uint256)","e303e81e":"authorizeForTier(uint256,address[])","e30443bc":"setBalance(address,uint256)","e3049b6f":"getFighters(uint32)","e3049ded":"AllyNetworkToken()","e305044f":"disableServiceMode()","e3059cef":"recover(uint8,bytes32,bytes32,address)","e305c210":"getPositionFromBattleboard(uint16,uint8)","e30637d6":"REFF_TOKENS()","e30651b4":"COMMUNITY_CAPPED_VALUE()","e3069e4d":"HTX()","e306f779":"EIP712_DOMAIN_HASH()","e308262a":"kycPassed(address,address)","e3083fb5":"removeFromContribution(uint256)","e308700f":"thresholdEtherLimitForSeedRound()","e308c213":"getBag(uint256)","e30922fc":"isGameLocked(address)","e309396b":"addSchema(string,string)","e3098986":"totalSold_()","e309aa15":"RefundSent(address,uint256)","e309d1b5":"tierTwoRate()","e309f318":"spermlordAddress()","e30addb4":"set_property_layout(uint256,string,string,string)","e30b407e":"payWinningGladiator(uint256,uint256)","e30bd740":"reverse(address)","e30c36f1":"bubbleSort(uint256[])","e30c3978":"pendingOwner()","e30c7b0a":"TronXtended(uint256,uint256)","e30ca7cb":"getBalanceOfContractInSzabo()","e30cfa40":"isExecuted(uint256,uint256)","e30dd27a":"EpsBonus()","e30dfb94":"callAndFailWithoutReason()","e30e3334":"BonusTokens()","e30f4e2b":"addMultipleAddressesToWhitelist(address[])","e30f4f84":"addWhiteBacker(address)","e30f7c8b":"startAirdrop(address[],uint256)","e30fe37a":"setQueryAddress(address)","e310c2ca":"emissionPay(uint256)","e312e00f":"approve(address,uint256,bytes,string)","e3140c51":"PCHAIN()","e31418be":"rateMap(uint256)","e31430c0":"acceptEscrow(address,address,uint256)","e314d852":"mintWithMemo(string,address,uint256)","e3153827":"reading_card_reversed_at(uint8)","e316bd56":"hashMsg(bytes32,address,bytes32,address,uint256,bytes32,string)","e316e9c0":"Issue(uint256,address,uint256,uint256)","e31743d7":"setTransferBlocked(bool)","e31870dc":"mlDevelopers()","e318a74c":"RACEFORETH()","e318b52b":"swapOwner(address,address,address)","e318de73":"getString(address,bytes32)","e3199044":"setGoalsPlayed(uint256,uint256,uint256,bool)","e319b0e2":"advisorsUnlockedAfterCliff()","e31a0292":"getostToken()","e31a7c01":"triggerTransfer(address,address,uint256)","e31a8116":"getMinPrice()","e31a9d92":"lastID()","e31b1aae":"ChangeInterest(uint256,uint256,uint256,bool)","e31bfa00":"next_id()","e31c60e3":"Request(address,uint256)","e31c71c4":"safeToSub(uint256,uint256)","e31d3460":"addused(uint256)","e31d3938":"MINT_INTERVAL_SEC()","e31e0c46":"set_end_block(uint256)","e31e2d6d":"func_0A93()","e31e450d":"checkBoard(uint256)","e31f28ef":"getTransferInfoTime(address,uint256)","e31f3e0c":"startUpgradePoll(address)","e31f4263":"theCamp()","e31ff6c2":"recordOffChainContribute(uint256,address,uint256)","e3206975":"bet_MAX()","e321045a":"_storeSettingDeprecation(uint256,address,address,address,uint256,address)","e321192b":"addTransaction(address,uint256,uint256,string,bytes)","e3218219":"DungeonTokenAuction(uint256)","e321adb3":"_canTransfer(uint256,address)","e3224ac3":"piecesOwned(address)","e32381b6":"kscMintTo(address,uint256,string)","e32497c4":"getArtefactsIds()","e3252a76":"oraclize_randomDS_proofVerify__sessionKeyValidity(bytes,uint256)","e32540b4":"OptionTransfer(address,address,uint256,uint256)","e3256429":"COMPANY_RESERVE_FOR()","e325fb4b":"bonusCap()","e326acbf":"uintFloor(uint256,uint256,uint256)","e326e6ad":"DEFAULT_PRESALES_DURATION()","e32754a0":"MyFreeCoin112(uint256,string,uint8,string)","e327a46f":"breakdown(uint256)","e3280126":"addOrder(string,bool)","e328cc5c":"getActiveArbiters()","e328ef67":"INDInflationVesting()","e3296684":"transferToPie(uint256)","e329e871":"endTime1()","e32a29bb":"burnClosedTokenMultiple(bytes32[])","e32aa56a":"acceptLastMilestone(bytes32)","e32ae93b":"getQueueOpening()","e32af410":"CSClosed(bool)","e32b349a":"JCB()","e32b6325":"releaseForIco(address,uint256)","e32c5f01":"managePID(uint256,uint256)","e32c65f2":"tokensPerWei15()","e32cb7fc":"decimalPlace()","e32d264e":"addDefaultOperatorByTranche(bytes32,address)","e32d5cf8":"setApprovals(address,address,uint256)","e32d76de":"validBeneficiary(address)","e32e68ec":"isNewSchool(uint256)","e32e9f22":"setDeploymentReward(uint256)","e32ecd18":"LEXT()","e32ef3c5":"refereesCount(address)","e33051dd":"setGasPriceLimit(address)","e3306a6f":"CurrentStatus()","e330a737":"setCrowdsaleCloseTimerFor(uint256)","e332dfe9":"Token0901(uint256,string,string)","e3343501":"_playRealOdds(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","e3349637":"addshop(uint256,string,string,string)","e334cd92":"getAstrosLength()","e334f32e":"encodeString(string)","e3350d7c":"setValidKYC()","e3353f3e":"increaseBlockTarget()","e335b5e9":"allocateSupply()","e335e1f8":"LogFundsLocked(address,uint256,uint256)","e33607da":"saleMarket()","e336e01d":"saleQuantity()","e33734fd":"changeProposalDeposit(uint256)","e337db6e":"NANJCOIN()","e337dd35":"SendingBounty(bytes32,uint256)","e337eca6":"TalkBounty(bytes32)","e3380b7e":"joinPillarCore(uint256,uint256,uint8)","e3386a98":"trustedToken()","e338a490":"DEVELOPER_FEE_FRAC_BOT()","e3393a6d":"voting(string)","e3396d2f":"updatePlayersCoin(address)","e339886c":"ADDR_WITHDRAWAL1()","e3399538":"ArithValue()","e33a9ab7":"createOffer(uint16,uint256)","e33b7de3":"totalReleased()","e33b8707":"append(uint256)","e33ba574":"hashSecret(bool,bytes32)","e33bb62a":"BRDCoin()","e33c7ae2":"scheduleTransaction(uint256,uint256,bytes)","e33c9755":"getActionIds(bool,bool,bool)","e33d27e4":"complete_sell_exchange(uint256)","e33d28d7":"vestBalanceOf(address)","e33dafbf":"emitters(bytes4)","e33e59d8":"getInsuranceContracts()","e33e5c5e":"getAddressUInt8(bytes32,bytes32)","e33f6aaf":"getOnBurnAmountValue()","e3407276":"bigModExp(uint256[6])","e340c2fb":"bidETHIncrement()","e340d0d6":"renewDec(uint256,uint256)","e3419202":"redits()","e342c2e6":"investorWhiteList()","e343fea6":"contractPays()","e344606b":"hashtagCommission()","e34486f8":"isActivePoll()","e344ce6b":"updateWhiteLists(address[],bool[])","e3450e13":"lastPlayer()","e34514ba":"getVirtualBalance(address)","e345514c":"CreateTokenToTax(address,uint256)","e345f098":"showLastBidder()","e34639cb":"AllocatedCappedCrowdsale(uint256,address,address,uint256,uint256,uint256,uint256,address,address,address,address,uint256)","e3464b1b":"Drop()","e346b380":"totalPreSale()","e346f79e":"submitTokens(address)","e3470882":"markFirstSaleComplete()","e347a773":"shares(bytes32,bytes32)","e3489a4f":"setII_R1(uint256)","e3495569":"MAX_DISCOUNT()","e3499381":"checkPlayerPayout(address)","e349c313":"addPlayerToBoard(bytes32,bytes32)","e349c7df":"settleUncle(bytes32,bytes32)","e349cb12":"change_name(string)","e349f108":"jokerAddress()","e34a90a7":"distributeBounty()","e34ac873":"avatarTransferState()","e34ad653":"EmissiveToken(address,string,uint8,string,string)","e34b7983":"doPremine()","e34c3896":"FundUpdated(uint256)","e34c8dbf":"distributionDate()","e34da795":"claimTokens4mBTC(address,uint256)","e34dd755":"CrowdsaleAddress()","e34e1700":"StarlightToken()","e34e32c0":"assignOwnership(address)","e34e5786":"test_testableStandardCampaignPayoutToBeneficiary()","e34e7889":"unlistDomain(string)","e34e7cda":"maxRoundDelta()","e34f2a9e":"fundingStartTimestamp()","e34f7137":"_performApprove(address,uint256,address)","e34f947d":"repairCar(bytes17,string,string,uint256)","e34f9dcc":"GCOXPACToken(string,string,uint8,uint256)","e34ffcb8":"changeMinAmount(uint256)","e3500b48":"setResolver()","e35060d9":"RequestEthereumCollect(address)","e350b490":"gameToWinner(uint256)","e3524d36":"getCurrentDiscountPercent()","e3528455":"burnPrimordialTokenFrom(address,uint256)","e3530e9c":"spendFromMultisig(bytes32,uint256,address)","e3539dcc":"LogReceivedETH(address,uint256,uint256)","e3546ac5":"isRatio()","e354a3f2":"freezeAccount(address,bool,string)","e35501be":"activate_admin_commission()","e3552808":"RoboToken(uint256)","e35568cb":"getAvailableTokens()","e355cd4a":"SharkPool()","e35694c0":"callFunction(address,address,uint256,bytes32)","e3577e71":"setPaymentSettings(string,string)","e3579ea5":"publish(string,string,address,uint256)","e3583870":"replaceDecomissioned(address)","e358b0e1":"withdrawPreICOEth()","e358d75a":"getFairymasterReq()","e3599c21":"updateGame(uint8,uint8[],uint32,uint8,uint8)","e359cbbb":"hasEnoughBalance(address,uint256)","e35b37fe":"TRANSFER_COST()","e35b8717":"GolixTokenDistribution(uint256,uint256,uint256,address,address,address)","e35b9699":"Namek()","e35c606b":"JiggsR()","e35c96d4":"NextToken(address)","e35ca326":"cancelOrder(uint80,bool)","e35d3590":"AddSocialAccount(bytes32,bytes32,bytes32)","e35d75a9":"tokensToEthereum_3(uint256,uint256)","e35e6078":"tokenPerUsdDenominator()","e35e6e0c":"setPrice(uint16,uint16,uint8,bytes32,uint256)","e35f0254":"numberOfProposals(string)","e35f4db3":"developer_edit_text_amount(string)","e3602077":"withdrawInWei(address,uint256)","e360736e":"getHistory(string)","e360a49e":"latestUpdate()","e361112a":"isPaying()","e3611578":"testFooKill()","e36255e2":"_checkGeneralRequirements(uint256,uint8,uint8)","e3625dee":"REFERPAYToken()","e362bc9a":"confiscateDeposit()","e362efdc":"getTotalPayout()","e362f168":"CoinAdvisorPreIco(address,address,uint256,uint256)","e362fcaa":"Creditors(address)","e3637435":"supportAccount()","e3643106":"getLatest(uint256,uint256)","e364bd01":"KEOS()","e3650781":"setGasForGR(uint256)","e3651ef3":"fetchRecentSubmittals()","e3659e69":"CNIFCrowdsale(uint256,uint256,uint256,address,uint256,uint256)","e365fd7f":"setMiniPoolEdit_8(string)","e3661586":"confirmManager()","e3669d7c":"Ballot(string,bytes32[])","e3677664":"transferPiece(uint256,address)","e3685ef7":"PocketMoneyContract()","e3686b49":"PopeCoin(uint256,string,uint8,string,address)","e3688d7a":"maxNumMC()","e3692473":"setMockedDate(uint256)","e3699763":"_addAddress(address)","e36a0e6e":"hasPermissionFrom(address)","e36af50d":"betsKeys()","e36b0b37":"stopSale()","e36ba174":"updateMaxCapEthOnce(uint256)","e36c2072":"countCourses()","e36c3f70":"BENEFITToken(uint256,uint256,uint256,uint256,uint256)","e36d036c":"mintPresale(uint256,address)","e36d3844":"CardCreated(address,uint256,uint256,uint256)","e36d392c":"DeliverInfo(uint64,uint256,uint256,uint256,uint256,bytes32,uint64,bytes32)","e36d3a43":"SENDING_BLOCK()","e36db785":"creditor()","e36dd1f9":"withdrawalMoneyBack()","e36e1051":"setcardsalemoney(uint256,uint256)","e36e5d18":"showTopsPlayer()","e36f3177":"maxIssuingSupply()","e36f3e7c":"getAddressDescription(address)","e3710599":"SendTokens(string)","e371817e":"calculateTokenAmount(uint256,address)","e371c0e6":"transferPermissions(address,uint256)","e371cdd4":"luke(uint256,string,string)","e371dfdb":"allFamily(uint256,address)","e372d0eb":"ownersOfArea(uint256,uint256,uint256,uint256)","e37362ab":"NRB_Main()","e37426d4":"StopCrowdsale()","e374e8d4":"isMyWalletLocked_Receive()","e375dfed":"StarbaseCrowdsale(address,address)","e377ac31":"legal()","e3787c61":"TestContract(string)","e378f045":"window0TokenCreationCap()","e37a7fff":"newPlayer(uint256,uint256)","e37aa618":"distributeValue()","e37aca99":"BOXICOIN()","e37b346d":"redistribution()","e37b71ce":"getFundTX(address,uint256)","e37bddc3":"changeEnd(uint256)","e37c6cf8":"redeemDisavowedTokens(address)","e37c8613":"balanceOfPendingToken(address)","e37ccac7":"getSuperseded(address)","e37cd202":"getBonusRate(uint256)","e37d46bd":"myDivs()","e37d4fed":"withdrawToFounders(uint256)","e37d883a":"NumbersToken()","e37e26cc":"_buyFromMarket(uint256,bool,uint256)","e37e60d1":"testControlRetractNotOwner()","e37e7d1a":"init(address,uint256[],uint256,uint8)","e380575a":"presaleFundsRaisedInWei()","e380ae96":"setNow(uint256)","e380b7bd":"balanceOfToken(address,uint256)","e38138a2":"startPurchaseTokens()","e38180ec":"addToPayeeBalance(address,address,uint256)","e381a8d9":"StegoCoin()","e38296e4":"changeDelegate(address)","e382b854":"_setPackedTimestamp(bytes20,uint256)","e382c3e6":"getPeriodBonus()","e382fe45":"deathData_v4()","e383da38":"totalAffiliateTokensSent()","e3843f6e":"myLoseShare()","e3844a61":"isBetPossible(bool)","e3848e5b":"thing(string,string,string)","e385b43a":"DistributionNextPos()","e385f7d2":"SendResult(uint64,bytes18,bytes32,bytes11)","e3877391":"DDJETHToken()","e3877acd":"frozenDaysForAdvisor()","e38787aa":"internalBurnTokens(address,uint256)","e387d31a":"estateRegistry()","e388cbb9":"swpFundDeposit()","e389b63f":"transfer(address,uint256,bytes,string,uint256)","e38bc1f0":"timeThatFinishGuaranteedPeriod()","e38c35b6":"getLockedUserBalance(bytes32)","e38c4585":"JointICOContractAddress()","e38c9825":"maxgame()","e38cc06b":"testDiv()","e38d0fbd":"FirstTradingEcosystem()","e38d6b5c":"maxPrice()","e38d7e99":"_next_id()","e38da1a1":"storeDoi(bytes32,bytes32)","e38e2cfb":"step(uint16)","e38f4861":"initLock()","e38fbdf6":"addBoundary(address)","e38ff5dc":"updateInvestor()","e39062f5":"MDTKAirdrop(address,address)","e3906b3d":"mintNextCard()","e390e263":"disableWhiteListForever()","e3914699":"dEthereumlotteryNetWinners(address)","e391a7c4":"revokeSignaturePreSigned(bytes,bytes,uint256)","e391b3d1":"ssword(string)","e391bda5":"transferImpl(address,address,uint256)","e39253e6":"SampleToken(uint256,string,uint8,string)","e392a521":"indexPrice(uint8)","e3945eba":"planetLife(uint256,uint256,uint256)","e395983a":"bountyTokensBatch(address[],uint256[])","e39608af":"ETUToken(string,string,uint256,uint256)","e3961174":"tokensCreationCap()","e3964b8c":"ERC20Token(string,string,uint8,uint256,address)","e3967d6a":"currentTimeBonus()","e3967eed":"totalUserNumber()","e396bd60":"LogEscrowWeiReq(uint256)","e396da73":"checkProof(bytes32,bytes32[],uint256)","e3973b5a":"NiteshToken()","e397dfd1":"updatetoken(uint256,string,string,uint256)","e39898d1":"checkSaleValid()","e399331b":"coinAllocation()","e3994993":"addDiary(string)","e399cb0d":"initializeCappedFundraiser(uint256)","e399daab":"zoomraffleFee()","e39a686c":"ChainBackedOption()","e39b2284":"ZEONPrivateSale(address,address,address,uint256,uint256)","e39b40d8":"_createCard(string,uint256,address,address,bool)","e39bbf68":"dividedBy(uint256,uint256)","e39bdfab":"getCutie(uint40)","e39c6d80":"batchTransfer(address,uint256[],uint256[])","e39c742a":"_caluLocktime(uint8)","e39cbe80":"senderAdminAndSaleNotFinal()","e39d2a98":"nextCommonTTMTokenId2()","e39dcc21":"blah()","e39ebde9":"FOLIToken()","e39fa059":"queryRandomCallback(bytes32,string,bytes)","e39fbd88":"tokensDispensed()","e39fff72":"Divs()","e3a0a148":"giveOwnership(address)","e3a0de36":"admin(string,string,string,string)","e3a12480":"getBalance(uint8)","e3a135b9":"_bid(uint256,uint256,uint256,uint256,address)","e3a199d6":"testThrowCreateNewRevisionNotUpdatable()","e3a2a327":"SmartCityCrowdsale(address,address,address,uint256)","e3a37ea2":"newIndex(bytes32)","e3a47b00":"standing()","e3a531a3":"setSaleAuctionContractAddress(address)","e3a70ec1":"max_goal_amount()","e3a71e32":"deliverBonusTokens(address[])","e3a75485":"TORUE()","e3a797f1":"getCandidateMemberInfo(uint256)","e3a79840":"finishPresale(uint256,uint256)","e3a7f45a":"ecrecoverWrapper(bytes32,uint8,bytes32,bytes32)","e3a83290":"SALE_address()","e3a861a4":"setCrydrView(address,string)","e3a87f8b":"secondPrivateReleaseTime()","e3a8b13a":"core(uint256,uint256,address,uint256,string,uint256)","e3a8b345":"emptyContract()","e3a8e29c":"addBorrower(address)","e3a8e50b":"Subscription(bytes,address,bytes)","e3a94e9f":"addPacksToStandardSale(uint32[])","e3a9744b":"mintTokens(int256,uint256,address,bool)","e3a97893":"secondPresaleEnd()","e3a99d2b":"updata(uint256,uint256)","e3a9b508":"EnableDisableTokenProxy()","e3a9db1a":"depositsOf(address)","e3aa018e":"setRank(address,uint256)","e3aa3c6e":"initialBonuslistTokens()","e3aa3fbb":"startEscrow(string,uint256,uint64)","e3aa62b1":"responsavel()","e3aae11b":"isStartGame()","e3ab8492":"requestGWAPrice(string)","e3abeaf3":"setAllowedTransferTo(address,bool)","e3ac3880":"backupfarmItems(address[],uint256[])","e3ac5d26":"prize()","e3ac8e16":"setFinalizationTime(uint256)","e3acc49a":"catIndexToPriceException(uint256)","e3adf4ea":"ChangeICOEnd(uint256)","e3ae1667":"commRate()","e3ae85f0":"winReward()","e3aec30c":"ballotStarted()","e3aeedc4":"lastMintedTokens()","e3aef2bd":"checkUnlockedTokensData()","e3af2ed9":"TWToken()","e3b08f56":"concatYearMonth(uint16,uint8)","e3b09a85":"HungrCoin()","e3b10447":"GITToken()","e3b2594f":"fundingCap()","e3b26a8c":"SocialNetwork()","e3b3847c":"SubmitProofOfOwnership(bytes32)","e3b3932a":"bookKeeper()","e3b45ab7":"MIN_TOKEN_AMOUNT()","e3b460c9":"hookOperator()","e3b49a03":"rollSystem(uint256)","e3b55276":"AdminBuyForSomeone(uint16,address)","e3b5a153":"lastEpochTX()","e3b6040e":"amountSlicesCount()","e3b61135":"reinvestProfit()","e3b62158":"TokenVault(address)","e3b71ded":"setMaxContributionCrowdsaleAddress(address)","e3b7b668":"_setMaxDailyPerUser(uint256)","e3ba3398":"importTokens(address)","e3ba80d0":"purchaseImpl(uint16,uint64,address)","e3bb01ac":"viewCancelledList(address)","e3bb3445":"releaseSupply(uint256,uint256)","e3bbab85":"test_smallDeviationPermitted()","e3bbb4f1":"MAX_GAS_PRICE()","e3bc2bb5":"newPassword(string,uint256)","e3bd9638":"getContract(address,address,uint256)","e3bea282":"callnotchecked()","e3bfdcfe":"pollBurnInc()","e3c04c32":"getNota(uint256)","e3c08adf":"getPlayerLAff(uint256)","e3c10714":"setMinContrib(uint256)","e3c2e4b9":"_setCreatedBlockOnCommitsPhase(uint256,address,bool)","e3c33a9b":"hasRole(string)","e3c3ec92":"BONUS_REWARD()","e3c3f180":"_setPurchasePremiumRate(uint128)","e3c4b1ae":"minSumICOStage2USD()","e3c517a9":"lockFlag()","e3c5862b":"setCAO(uint256,uint256,uint256,uint256,uint256,uint256)","e3c5a852":"buyTickets(uint256[],uint256,uint256)","e3c5d11a":"MIN_BUY_TOKENS()","e3c6e66d":"discountedIcoStartBlock()","e3c73d32":"minimumPriceCount()","e3c79a20":"enterOnBehalfOf(uint256[],uint256,address)","e3c82106":"becomeDuke(string,string)","e3ca12c6":"sendtoB(uint256)","e3cafbb0":"TOKEN_EARLYSUPPORTERS()","e3cb0cf0":"maxTransferPerTimeframe()","e3cb49f9":"setBlockingState(address,uint256,uint256)","e3cb8563":"playToken()","e3cbe744":"updatePlayersCoinByOut(address)","e3cc3570":"mintMigrationTokens(int256,address,uint256)","e3cc65e2":"getInvestorsLength()","e3cc83cf":"withdrawWhenFinished(address)","e3ccb809":"voteOnProposal(bool)","e3cd30f6":"getBuilding(uint8[176],uint8,uint8)","e3cd7c03":"getPass(address)","e3ce9714":"proxyWithdraw(address,uint256,uint8,bytes32,bytes32)","e3ceb06d":"YesNo(bytes32,address,string,address,uint256)","e3cf1ad3":"changeRegistrationStatus(address,uint256)","e3cf6644":"sendKmPards()","e3cfef60":"timeRemaining()","e3cff634":"test(uint32)","e3d021d5":"purchaseTicket(uint16[])","e3d0252b":"defaultTriggerTime()","e3d0799c":"PLATFORM_FEE_PER_10000()","e3d0be5c":"EARLY_INV_BONUS()","e3d1072c":"Giveafuck()","e3d13592":"newTechSupport()","e3d1e6d6":"hasProof(bytes32)","e3d2a98c":"setCurrentFundingGoal(uint256)","e3d2c1bf":"presaleTokensPerDollar()","e3d33fc9":"transferCount()","e3d3f4cd":"bidGift(uint256,address)","e3d4187f":"Buy(address,uint256)","e3d5d88b":"getServerBuildingName(uint256,uint8,uint8)","e3d5e6a3":"year2Unlock()","e3d670d7":"balance(address)","e3d6ce2b":"addFiatTransaction(string,int256)","e3d6e4a3":"setFundsCreditBitContract(address)","e3d74457":"releaseTimeFirst()","e3d7f159":"FIRST_TIER_DISCOUNT()","e3d86998":"declareNewerVersion()","e3d91ebf":"bonusPoolsOf(address)","e3d9e8ea":"drawnArbiter(address,uint256)","e3da41b5":"sortWinningNumbers(uint8[5])","e3da5399":"left90(uint256)","e3da9f8f":"tranchesOf(address)","e3dac959":"makeTapTop()","e3db17b8":"updateContract(address)","e3db6670":"isHardCapTokensReached()","e3dbaff1":"tokensSpent()","e3dbda67":"setArtistsControlAddress(uint256,address,address)","e3dcd2c8":"maxPaymentInEther()","e3dd164e":"setNewTokenImporter(address)","e3de18b2":"withdrawMyClosedDeposits()","e3dea4b7":"setMcrAmountForGas(uint256)","e3debbbe":"getSubscriptionServiceID(bytes32)","e3e06c45":"PayPayCoin()","e3e10762":"calculateIdeaBuySimple(uint256)","e3e1dcb3":"getRouteNameByIndex(uint256)","e3e2342f":"callTokenHolderTribunal(string)","e3e28bab":"setTimes(uint256[],uint256[])","e3e2b1ba":"add_number(uint256)","e3e4001b":"buyWithReward(address)","e3e42b0c":"ZenAD()","e3e4a1b4":"burnUserTokens(uint256)","e3e4b9fb":"claimJob(uint256)","e3e5075c":"depositBattleValue(address)","e3e5439c":"specDWallet()","e3e54ac2":"CarDeregistrationFaled(uint256)","e3e5c9c1":"WhiteListBonusTokensEmitted(address,uint256)","e3e7399e":"addWinner(address,bytes4,uint256)","e3e7519c":"getTokenPriceforDapp()","e3e77055":"MultipleTokenVesting(uint256,uint256,uint256,address,uint256)","e3e7903f":"updateScore(address)","e3e7b439":"cryptoWillToken()","e3e7c665":"makeMoney()","e3e7d4f4":"leaderboardEntries(uint256)","e3e88734":"SigUser(address)","e3e9800d":"_cancelSellOfferInternal(uint32,bool)","e3e98cad":"COSSToken()","e3e9bc3f":"becomeSponsor()","e3e9cb4c":"Birth(address,uint256)","e3ea6496":"newCarProductID()","e3ea67d4":"STARTING_TURTLES()","e3eba060":"allowedToSpend(address,address)","e3ec0251":"subtraction()","e3ec0666":"clearJackpotParticipants()","e3ec5046":"DECIMALCOUNT()","e3ec7584":"showTokensUnfreezeDate(address)","e3ecbd7e":"isEditionEnabled(uint256)","e3ed14db":"getDiamond(uint256)","e3ed48a4":"getTokenScope(uint256)","e3edbfd3":"getAmountDue(address)","e3f037d8":"FlightDelayUnderwrite(address)","e3f0920a":"coinMaster()","e3f0b761":"walletF()","e3f0dd48":"getMult(bytes32,bytes32,uint256)","e3f10188":"updateFlagCount(address,address,uint256)","e3f16a61":"GRPlaceholder(address,address)","e3f25f01":"_delegateforward(address)","e3f2e4a4":"ante()","e3f310c7":"priceToSpend(uint256)","e3f38dd6":"GetSignVersion(string,address,uint256)","e3f4937f":"outOverRoundId()","e3f4ffdc":"GeezerToken()","e3f5009f":"payWithMileagePoint(uint256)","e3f508f5":"setLeaf(uint256,uint256)","e3f52c99":"warrior()","e3f563f6":"generateCompoundTerms(uint256)","e3f596a4":"ownerPrice()","e3f61948":"getStartIndex(uint64)","e3f688d3":"ThingschainToken(address)","e3f6b544":"member()","e3f7faaf":"calculatePrice(uint256,uint16)","e3f954be":"buyICOTokens()","e3f96400":"getTotalOwnerAccounts()","e3f9ba0e":"returnEth()","e3f9cd17":"lockTokenForExchange(address)","e3fa5882":"tryWithdraw(uint256)","e3fc03a8":"Guess(address,uint256,int256,int256,uint256)","e3fc43b2":"ended(bool)","e3fcbac1":"getSharesPercentage(address)","e3fcf122":"_sctc(uint256,uint256,uint256,uint256,address)","e3fe0317":"_setAllocationFee(bytes32,uint256)","e3fe48a1":"loadWhiteList(address[],bytes32[])","e3fe6a9e":"sehrRaised()","e3fe9740":"icoThresholdReached()","e3ff2f05":"weiExchangeRate()","e3ff9ac2":"MACHToken()","e3ffc9a3":"sendEtherToOwner()","e3ffcb84":"loserOf(uint256,uint256)","e3ffefe3":"ZeroReturnProfit()","e4002b30":"commitEuro()","e4007949":"buyRegistration()","e4019e07":"BOB()","e40205d6":"roundEndTime()","e4020804":"isHealthy()","e4024194":"returnedData()","e4027126":"mSumRawSpeed()","e40418a0":"trustedContractAddr()","e4043b37":"updateProduct(uint256,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","e4048049":"createBool(bytes32,bool)","e4062df5":"SkychainToken()","e4063140":"getAllActivity(uint256)","e40652e3":"creatUserPurchase(address,string)","e4065c4c":"Alias()","e406bb4b":"minedTokenCount()","e407ccb9":"Repayment(uint256)","e40819af":"lastTokenCreated()","e4083daf":"create_game_invite(bytes32,address,uint32,uint32,uint8,uint16,uint8,address,uint256)","e408de80":"buyInWithAllBalanced()","e40906ed":"getBorrowBasicInfo(uint256)","e4098655":"getCallCalledAtBlock(bytes32)","e409edf1":"chooseWinnerDeadline()","e40a72d4":"_internalToken()","e40a7545":"collectBuyFee(uint256,address)","e40a955c":"grantTeamTokens(address)","e40b4523":"activateVault(address,uint256,uint256,uint256,uint256)","e40c231e":"StoneToken()","e40d3692":"contributedAmountOf(address)","e40d835e":"getPositionIdFromNonce(uint256)","e40d8fc3":"addICOEndDate(uint256)","e40dd35b":"isGameApproved(address)","e40e56d3":"regular_coins()","e40e8457":"requestBurnerContract()","e4105ed5":"setToken(uint8,address)","e410a0c6":"setup(address,uint16)","e4115a8c":"ApcrdaZebichain()","e4120220":"getTokenTrust(address)","e412828a":"Shark()","e412c526":"set_pre_kyc_bonus_numerator(address,uint256)","e415f4ee":"_addDai(uint256,address)","e4160e48":"admin_active_withdrawable()","e4165e15":"ownerDeactivateToken()","e416d173":"PreICO(uint256,uint256,address,address,uint256)","e416f6b4":"_startRound()","e416faa0":"getBetNum()","e4171746":"major_partner_address()","e417291b":"undelegateDAOTokens(uint256)","e41765de":"addBotAddress(address)","e417c38c":"Reward(address,uint256,uint256,uint256)","e417c62c":"ProofFund(address)","e4187d02":"multiplyDecimal(uint256,uint256)","e418f592":"receiveToken(address,uint256,bytes)","e419f189":"multiAccessIsOwner(address)","e41adb25":"PoolPreICO()","e41b1d28":"noAccountedWithdraw()","e41c02c9":"determineFirstPeriodOutcome(uint256)","e41cc093":"getItemStore(bytes12)","e41d0944":"acceptDonate()","e41d65e0":"payWinnerManually()","e41eaa41":"fakeNow()","e41ee46a":"MAX_QUANTITY()","e41f7dc1":"ethPriceProvider()","e41fb842":"comunityMintedTokens()","e420264a":"g(uint256)","e420a904":"FirstToken()","e420dcc5":"tokenDrian()","e4218416":"redemptionPayouts(uint256)","e422d6b8":"createRareCard(uint256,uint256,uint256)","e422ebe9":"getBot()","e422f311":"secondWeekEndTime()","e422f699":"toBE(uint256)","e4232069":"MAX_INPUT_USERS_COUNT()","e4246ad2":"canContractExchange(address)","e4246ba0":"setPaymentContract(uint8,address)","e4251361":"getTodayInvestment()","e4254585":"MFNToken()","e4274453":"PUBLIC_CROWDSALE_SOFT_CAP()","e4277f78":"backToOldOwner()","e427a197":"previousMinters(address)","e428ad8a":"ReferralReward(uint256)","e428fd5f":"takeBackMoney()","e42996d1":"redeemCoinsToICO(uint256)","e429bd8b":"getUsableAmount(address,address)","e429cef1":"addAuditor(address)","e42a4556":"KKTokenNew()","e42a8bc9":"dAddBallot(bytes32,uint256,uint256)","e42a9156":"AppleproToken()","e42a96e7":"escrowContract()","e42b0193":"test_insert_findWithHintNextIncreased(int256)","e42bb93f":"StarUniteChain(uint256,string,uint8,string)","e42bff66":"mintBadge(address,uint256)","e42c04f4":"Cryptshopper()","e42c08f2":"tokenBalanceOf(address)","e42c1337":"getSalary(string)","e42c1b76":"BountyActivated(uint256,address)","e42cb9f3":"statement()","e42d5be0":"getPaymentOf(address)","e42d674d":"refundIco()","e42d6efa":"unregisterUsers(address[])","e42d70ba":"safeAddCheck(uint256,uint256)","e42def21":"CryptoHill()","e42f4cc0":"addPersonalInfo(address,string,string,string,string,string,string,string)","e4309307":"fortifyClaims(uint16[],uint256,bool)","e430bb5b":"getFreeCoins()","e4310205":"addMastercardUser(address)","e431af36":"_addMember(address,uint256)","e431d241":"validateAndRegisterClaim(address,bytes32,uint8,bytes32,bytes32)","e4322464":"MatchBettingFactory(address)","e43252d7":"addToWhitelist(address)","e432f0e5":"queryOracle(string)","e4330545":"dump()","e433bb3a":"HAVY()","e4340e6a":"Wallet5()","e435f2c9":"takeOwnershipMultiple(uint256[])","e4360fc8":"getFileListElement(bytes)","e43650b6":"changeILFManager(address,bytes32)","e436a3f7":"getRoot2_16(uint256)","e436bdf3":"Draws(uint256)","e4372d0f":"setRestrictedAcct(address,uint256)","e437d1a7":"unRedeem(uint256)","e437d815":"getDsitributeMulti(address[],uint256[])","e438ff55":"changeINAWallet(address)","e43926fb":"refundTokenToCustomer(address,uint256)","e439501e":"AntmineToken()","e4397db1":"getBetsState()","e43a0bb2":"pullFunds()","e43a8897":"DonatedBanner()","e43aa5ff":"Medban()","e43ac447":"DirectConnectionFactory()","e43ae642":"deleteDIDHolderWhenBalanceZero(address)","e43b72b4":"discountedInvestors(address)","e43ba0bd":"isStrategy(bytes15)","e43bb0f6":"link(uint256,address,address)","e43bc1e9":"functionName3(bytes32)","e43c74a4":"BRoyalCoin()","e43cd900":"PoolBounty()","e43d68ce":"GetBanker(uint8)","e43dfebf":"burningTokens()","e43f696e":"setWhiteList(address[],bool)","e43f8424":"burnGoldTokens(address,uint256)","e4403507":"tokenContractBalance()","e44171b1":"Arina_amount_judgment(uint8,uint256)","e4424c9e":"createNew(bytes32,address)","e443253a":"DataFromSetting(uint8)","e443348e":"ONE_TOKEN()","e4440a86":"marketWallet()","e4444feb":"removeAllowedAddress(address,address)","e444504c":"nextClaim()","e44451ba":"removeAddressFromAdminlist(address)","e444a2e1":"_birthPerson(string,string,uint64,bool,bool)","e44501c4":"inactive_dividend(address)","e4454fdc":"GetMaxStageEthAmount()","e44591f0":"isNonFungible(uint256)","e4480dd8":"withdrawl(uint256)","e448ee26":"joinChallenge(uint256)","e4492fcd":"TokensPerETH()","e4495b15":"confirmSetIssuer()","e449c52a":"getStr(string)","e449de9f":"prevContract()","e44a94d3":"minContributionPresale()","e44ac1e4":"addLock(address[])","e44b974f":"placeBet(uint8,uint256,uint256,uint8,bytes32,bytes32)","e44bc43f":"stepOneRate()","e44c333a":"DreamTeam()","e44c96c9":"addInitialOwners(address[])","e44caea6":"balances3(uint256)","e44d3084":"testFailure()","e44d311b":"ticketPrices(uint256)","e44d6f04":"beatTeamWallet()","e44dbb75":"addAddressListItem(uint256,address)","e44de421":"buyTokenFrom(address,address,uint256)","e44f777c":"returnETHforUnqualifiedBuyers(uint256,uint256)","e450056c":"tokenPartition(uint256)","e4503da4":"startPhaseMaximumcontribution()","e4504f62":"dogCore()","e451197a":"OrdoCoin()","e451ecfa":"swapTokenValueForCredits(address,address,uint256,address,string,uint256,uint8,address)","e45285cf":"setAIRDROPBounce(uint256)","e4536316":"removeARA(address)","e4536b84":"BalanceReader()","e453877e":"_approveTransfer(uint256)","e4538c6c":"addUndergraduateTo(address,string,string,string,uint8,uint8,uint8,uint8,uint8,uint8,uint32,uint32)","e454158c":"futureSaleAllocation()","e4543410":"setIncrementPercentage(uint256)","e4547443":"releaseTimeLock(address,uint256)","e4547f98":"documentExists(bytes)","e45499c1":"updatePriceOfToken(uint256)","e4556f2d":"MaturityPrice(uint256,uint32,bool,bool,bool)","e455d26c":"getCurrentNeedsCount()","e455fce7":"extractOversightAddressesIndexLength()","e4560388":"endTimeMain()","e45648ac":"exchangeOldVersion()","e4564a4a":"returnAddressBonuses()","e4569c4e":"eeeeeeeeeeee()","e4578590":"SplitPaymentMock(address[],uint256[])","e457e1e5":"charge(uint256)","e458c754":"whitelists(uint8,address)","e45a4fb4":"isMultipleOf(uint256,uint256)","e45a93cc":"GIT()","e45aa608":"tokensForfortis()","e45ab391":"Technology5G(address)","e45b1d1b":"openClosedToken()","e45b7388":"subscribers_TO_HATCH_1CraigGrant()","e45b8134":"transfersFrozen()","e45bc0ae":"dollcoin()","e45be8eb":"minPrice()","e45bf7a6":"forwardTo()","e45c1879":"getAuctionsCount()","e45c210c":"LogFunderInitialized(address,string,uint256)","e45c47b9":"SetPermissionsList(address,address,uint8)","e45ce7e3":"refillTxFeeMinimum()","e45ceec1":"getUnreadMessages(address)","e45d0550":"getAddressArray(address,string,string)","e45d4717":"withdrawLogic(bytes32,uint256,uint256,uint256[])","e45da0be":"freezeAddress()","e45dbabd":"addAddressesToWhitelist(uint256,address[])","e45ebe93":"checkVoteStatus()","e45ef4ad":"bobClaimsPayment(bytes32,uint256,address,address,bytes20)","e45fc71f":"getPeriodCycle(uint256)","e460382c":"importBalanceBatch(address[])","e4614066":"MelonToken(address,address,uint256,uint256)","e46164c5":"waitingForPayout()","e4626c8f":"like(address,uint256)","e462c888":"createEscrowByBuyer(address,uint256)","e463b659":"EtownCoinTest(uint256,string,uint8,string)","e463fa6b":"AddWhitelist(address)","e464dcc8":"userHasLuckyStone(address)","e4651465":"addEthTeller(address,uint256)","e46523f2":"_isNeighbor(uint8,uint8)","e46537ba":"JJCOIN()","e465c465":"like(address)","e46617b6":"releaseMultiAccounts(address[],address)","e4662939":"CLBToken()","e46638e6":"canTransfer(address,address,uint256)","e46694e8":"lastStakePriceUSCents()","e46751e3":"exp(int256)","e467f7e0":"mint(address[],uint256[])","e4682f00":"cancelSpendLimit(uint256)","e4683a79":"refund(bytes32,bytes32)","e4684d8f":"AXNETToken()","e468688e":"addTotalSupply(uint256)","e46871f1":"governingLaw()","e468cb72":"FUTM()","e468dc16":"Testokenmaking()","e4690a0b":"popRequest()","e469185a":"updateReserveRatio(uint8)","e4693e98":"endFundingTime()","e4698ee7":"start5Phase2020()","e46a5c21":"getArmyBattles(uint256)","e46c2cc4":"bytarr28(bytes28[])","e46d1939":"napoleonXAdministrator()","e46d6cb1":"canChangeRecoveryAddress(uint256)","e46da1b9":"MeiJiuToken(uint256,string,uint8,string)","e46dcfeb":"initWallet(address[],uint256,uint256)","e46dea92":"BlockChainPay()","e46f20dc":"getTransferHash(address,uint256,address,address,uint256,uint256)","e46f9ecf":"enableCodeExport()","e46fbe76":"burnSomeEther()","e46feb2c":"orgy1f(string,string)","e4706e3a":"TokenRateChange(uint256)","e470ddf8":"totalKittiesBurned()","e47112bd":"sendTokens()","e471a5b9":"putIntoPackage(uint256,uint256,address)","e471d770":"StopTheFakesPromo()","e472311b":"handleHTLCUpdateTx(address,bytes32,bytes32)","e4723828":"TestMath()","e4725ba1":"accept(bytes32)","e4745970":"transfer(uint256,address,string)","e474777e":"applyForCertification(string,string,bool,string,address,string,string)","e474f97a":"setPreicoAddress(address,uint256)","e4752159":"DigitusToken()","e475222e":"activeGames()","e476137b":"windUp()","e476af5c":"revokeAttributeSigned(address,uint8,bytes32,bytes32,bytes32,bytes)","e476cb86":"_mintTokens(address,uint256)","e4772ae3":"getDailyCount(address)","e4779d73":"register_user(address)","e4788384":"CancelAuction(address,uint256,uint256,uint256,uint64,uint256,address)","e478b578":"ProofofConcept()","e47a192e":"FactomIssued()","e47a6a9f":"disbursementPeriod()","e47bc32b":"ShanHuCoin()","e47c0c20":"GetCityData(address)","e47c5902":"ecverify(bytes32,bytes)","e47ca4eb":"LogNewAnswer(bytes32,bytes32,bytes32,address,uint256,uint256,bool)","e47cb18f":"PointToken(uint256,string,string,uint256)","e47d8085":"isCurrentUser(address)","e47d914a":"fechVoteInfoForVoter()","e47da59e":"consumeTicket(address,string,uint256)","e47dace5":"totalLenderBalance()","e47dea1d":"setWithdraw(address)","e47e1c0b":"getAssetIds()","e47e7e66":"ask(uint256)","e47ea649":"isICOfinalized()","e47f0d64":"list_products()","e47f18d0":"CryptoTorchToken()","e47ffb64":"setSoft_Cap(uint256)","e480ba6a":"isDailySettlementOnGoing()","e4818a5d":"totalUnreleasedTokens()","e4818e4b":"secondPeriod()","e481c884":"ACFWallet()","e481ebf0":"getOwnedActiveEntry(uint256)","e48225ce":"startStakingAt(uint256)","e4828367":"buyEther(uint256)","e48341db":"getUpdateCount(bytes32)","e4845c2f":"Sperm()","e4849b32":"sell(uint256)","e4852b9b":"transferAccount(address)","e4860339":"tokens(address)","e486387a":"ReferenceToken(string,string,uint256)","e486869b":"setstoredaddress(address,address)","e487624b":"EarnedGNS(address,uint256)","e487c88b":"CROWDSALE_UNVERIFIED_USER_CAP()","e487e87b":"activateICOStatus()","e487eb58":"getOwner(bytes20)","e487fdb6":"participant1SentTokensCount()","e4881813":"cat()","e489c5ff":"haltIco()","e489d510":"MAX_TOKEN_SUPPLY()","e489fc68":"NdexSupply()","e48a1d60":"assertPaymentIndexInRange(uint256)","e48a4a29":"mayjaKill()","e48c09fe":"getFiltersLength()","e48c3c5c":"lockInDays()","e48cf65f":"_setClassViewValue2(uint256)","e48d81a8":"multisigwallet()","e48db5d4":"ProofVote(address)","e48e0d69":"ownerRetrieveTokenDetails()","e48e603f":"right54(uint256)","e49013b3":"jigoutuihuan(address,uint256)","e490c513":"getEntityState(bytes32)","e49168f3":"whichEpoch(uint256)","e4917fd2":"provenAddresseList(address[],bool)","e491936f":"getDisputeTX(uint256)","e49280cb":"close(address,uint256)","e4928550":"daylimit()","e4929aa4":"FCC(address)","e4932abe":"INC()","e493ef8c":"Q()","e4942930":"SetMinLot(uint256)","e4952ddb":"transferDataOwnership(address)","e495f08e":"getHouseInfo(bytes32)","e495faf4":"bonusesPayed()","e496f510":"oraclize_query(uint256,string,bytes[3],uint256)","e4983e27":"HEOContract()","e498922f":"getExp(uint256)","e498b98f":"setRedeemRequestLimit(uint256)","e498f5de":"FrozenFunds(address,bool,uint256)","e4995a1d":"ProdTokensale()","e4997dc5":"removeBlackList(address)","e4998173":"blockHalving(uint256)","e499f542":"distribute_reward(uint256,uint256)","e49b4c64":"ownerModAdmin(address,bool)","e49b606c":"claimWinnings(bytes32)","e49c9529":"underwrite(uint256,uint256[6],bytes)","e49cc6a9":"getUserBalancesLastBet()","e49dcee9":"fixTokens()","e49f6e91":"editContact(address,string)","e49fdaa8":"setClaimLimit(address,address,uint256)","e4a008a0":"cancelEthOffer()","e4a05c1f":"_nibblesToTraverse(bytes,bytes,uint256)","e4a0c124":"QCSTToken()","e4a0d386":"ethToBeClaimed()","e4a13fa4":"getICOAddress(uint8)","e4a1d868":"deposit_token(address,uint256)","e4a27ba0":"_play()","e4a2a8af":"getOwnerClientDetails()","e4a2ac62":"getCompactData(address)","e4a2c6d6":"loadProfit()","e4a30116":"initialize(uint256,uint256)","e4a30200":"BRV(uint256,string,string)","e4a358d7":"getPrefix(uint32)","e4a36a77":"getBondRemainingToBePaidOut()","e4a41c7f":"becomeFriendsWithMe()","e4a46a99":"howManyEthersToBecomeOwner()","e4a682d8":"InvestorToken()","e4a6e85a":"CoinStorage()","e4a72b13":"bZxContractAddress()","e4a77d29":"setInitialVaribles(uint256,uint256,uint256,address,address,address)","e4a7f363":"NewSymbol(string,uint8)","e4a8de44":"quater1()","e4a9b286":"getVestingDuration(address,address)","e4aa0741":"AmericoTokenToken()","e4aa2436":"SouthAfricanRandsToken()","e4aa533e":"guess(bytes32)","e4aa6c5c":"MHCBC()","e4aa8140":"MAX_WEI()","e4aa82d7":"test_addAndGetVersion()","e4aa8da9":"checkReceiptProof(bytes,uint256,bytes,bytes)","e4abae32":"respond(uint256,address,address,bool,bool)","e4abf00e":"UnFrozenAddress(address)","e4ac3206":"withdrawIQT(uint256)","e4acecf3":"SALE0_END()","e4ad9a18":"takeTokens(address,uint256)","e4ada9fa":"setFeeForFirstArtWorkChangeRequest(uint256)","e4adc325":"UBS()","e4adc4f0":"ownerTransferWeiThirdWallet(uint256)","e4ae2e88":"enableEdition(uint256)","e4ae7d77":"getResolver(string)","e4af29fc":"accountCount()","e4af5f30":"getMinMaxBet()","e4af8331":"func_02E5()","e4b0a97b":"test_doubleVotingAgainst()","e4b1443b":"KIK_ADDRESS()","e4b19e98":"amountRefunded()","e4b1e977":"hadd(uint128,uint128)","e4b1f93a":"isValidPurchase(uint256,uint256)","e4b1fe54":"totalGas()","e4b203ef":"sealed()","e4b34274":"round4StartTime()","e4b3c517":"crowdsaleContinue()","e4b42498":"AfrFballCoinXToken()","e4b503ec":"MinAmountByBetChanged(uint256)","e4b50cb8":"getToken(uint256)","e4b50ee8":"setRaiseRatio(uint256)","e4b541f3":"currentDevFees()","e4b5553c":"AddPromoter(address)","e4b5762a":"setPriceFeed(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)","e4b5ddeb":"addInvestorAtID(uint8)","e4b5e557":"CPWAToken()","e4b64da9":"sellOrders(address)","e4b6ac4c":"bonus2StartETH()","e4b6f799":"withdrawDai()","e4b6fbe2":"getApproveSpenderValue()","e4b73ac9":"foundersWallet3()","e4b74590":"distance(uint256,uint256,uint256)","e4b7b1b0":"Payroll(address,address)","e4b7fb73":"getRemainingSupply()","e4b8ebb7":"powercoin()","e4b90ed2":"reclaimInternal(address)","e4ba3969":"supportRecord(uint256)","e4bb7160":"adjustInflationRate()","e4bbb4b0":"POLY()","e4bc01b4":"FooMintableToken()","e4bd6695":"create(string,string,uint8,address,uint256)","e4bd9ebd":"calcId(uint256)","e4bdaa61":"buy(uint16,address)","e4be5159":"queryChild()","e4be782a":"createSecurityToken(string,string,uint256,uint8,address,uint256,address,uint256,uint8,uint256,uint8)","e4bf56b8":"getPastGamesLength()","e4bf6195":"changeGroupInfo(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","e4bff515":"_pointToResolverAndResolve(int256,bytes32,address)","e4c01bbb":"LogSetSymbol(string)","e4c05a7d":"checkEngineerQuest(address)","e4c14a34":"Tx(address,address,uint256,string)","e4c19408":"startPreIco(uint256,uint256)","e4c21cf2":"CheckSoftCap()","e4c28308":"buyPortfolio(address,uint256,uint256)","e4c2db06":"getPreviousFile(bytes)","e4c487c9":"Betsicbo()","e4c53f04":"setCreationCurator(address)","e4c5ff46":"manualMint(address,uint256)","e4c60492":"RANGESTART_8()","e4c82881":"change_tokenReward(uint256)","e4c92731":"FAST()","e4cb30ad":"getCharacter(address,uint256)","e4cc1161":"seedWithGasLimit(uint256)","e4cc18be":"finishMint()","e4cc98a5":"dividendPeriod()","e4cd7d96":"OX_ORG()","e4cdf3cc":"takeBack(uint256,uint256,bytes32,uint8,bytes32,bytes32)","e4ce25ac":"roundEthShares()","e4ce6ccf":"deed(bytes32)","e4cecd32":"cf_request(uint256,uint256)","e4cf77bb":"GoodBoyPoints(uint256,string,string)","e4cfcbf7":"setChainNext(address)","e4cfe9eb":"callerAllocationPeriod()","e4cff610":"process_merge_mint_ious(address)","e4d0f41d":"setAuthorized(address,address,bool)","e4d13625":"pauseActivity(uint16)","e4d1b2cc":"allocatedToken()","e4d2fecf":"isListening(address,address)","e4d433e8":"startDealForUser(bytes32,address,address,uint256,uint256,bool)","e4d534cb":"feewallet()","e4d5a558":"updateAndSafeTransferFrom(address,uint256,string,bytes)","e4d609cc":"addRequester(address)","e4d74f2e":"BCBcyCoin()","e4d75c9d":"setVestingAddress(address)","e4d76d3b":"ATN(uint256)","e4d7a3d4":"getAllClients()","e4d8dead":"setChild(uint256,string)","e4d91372":"setlevel(address)","e4d9d212":"isPVPListener()","e4d9de94":"getInfo(uint8)","e4d9e130":"CrowdsaleToken()","e4da3860":"XfinityAsset()","e4db2230":"addCard(uint256,uint256,address)","e4db2ceb":"auth(string)","e4db4dc1":"CheckEligibility(address,string,string)","e4db6062":"GivethBridge(address,address,uint256,uint256,address,uint256)","e4db915e":"citadelBuy(uint256,address)","e4dbc385":"assertEq12(bytes12,bytes12)","e4dbf719":"FlightDelayLedger(address)","e4dc2aa4":"totalSupply(address)","e4dc3d8b":"raisedSale1USD()","e4dcb06b":"open(string)","e4dd7794":"fundingPaused()","e4deb007":"setNextSaleAgent(address)","e4dec825":"setAllowContributionFlag(bool)","e4dedc7f":"DeleteContract()","e4df2531":"topBalance()","e4e075cc":"_getPlayerInfoByAddress(address)","e4e0bd1f":"PointPowerCoin()","e4e0c030":"makePayment(bytes32,uint8,bytes32,bytes32,uint256,uint8,uint256,bool)","e4e103dc":"rewardUser(address,uint256)","e4e1aae6":"BlockChainShopCoin()","e4e1bd53":"DisableTransfers(address)","e4e1f29b":"discountStep()","e4e1f6c5":"compare(address)","e4e1f7af":"mintTokensMultiple(uint256,int256,address[],uint256[])","e4e299f7":"zero_out(uint256)","e4e2bfe4":"canFinalize(uint256)","e4e2ca59":"supportsEIP20Interface(bytes4)","e4e2d2ae":"changeScore(uint256,uint256)","e4e3466a":"AIToken()","e4e4c8c0":"eMTV()","e4e57b9e":"sellTokens(address,uint256,uint256)","e4e609de":"LogBuyCoins(address,uint256,string)","e4e663a9":"getStatLotteries()","e4e6de18":"setPaoContactAddress(address)","e4e713e0":"DTCC_ILOW_6()","e4e76c16":"setCryptoSoulContract(address)","e4e790b8":"withdraw_GIC(uint256)","e4e80c49":"SpudToRotator(uint256)","e4e85963":"tokenRemainPreSale()","e4e985a8":"getKycProvider()","e4e9bcca":"setEthPriceProvider(address)","e4ea58a5":"withdrawInviteRewardToOrder()","e4eab468":"getWarrantyPrice(address,string,uint256,uint256,uint256)","e4eacd70":"curentBallotId()","e4eaee4c":"setBool(bool,bool)","e4eba2ef":"supplylimit()","e4ec3762":"onChain(address)","e4ec404c":"AG()","e4edf852":"transferManagement(address)","e4ee07b7":"UtlToken(address,address,address,address,address,address)","e4ef2cef":"link(address,string)","e4ef3eaa":"SetEvaluate(address,uint8,uint8)","e4f02750":"listGlobalAuditDocumentsFrom(bytes32,uint256,bool)","e4f06100":"adminSetDiv(uint256)","e4f20fb2":"mintPresale(address,uint256)","e4f2487a":"salePhase()","e4f26633":"betStage(uint256,uint256[])","e4f37374":"pixels(uint32)","e4f3f47f":"BuyCurrentTypeOfAsset(uint256)","e4f4c554":"AddressDefault()","e4f627fe":"keysCount()","e4f6973f":"BIPOOH_DAO_32()","e4f7a076":"set3RoundTime(uint256)","e4f7de93":"isIcoComplete()","e4f84173":"defValue()","e4f843f9":"deprecateTurretSubtype(uint8)","e4f896e8":"proclaimAllInactive()","e4f8b908":"_payout(address)","e4f8c6fb":"YettaCrowdSale()","e4f95226":"getLastInvestors()","e4fa8fc3":"hash_of(address)","e4fab06f":"delegatedFwd(address,bytes)","e4fae421":"ALLOC_ECOSYSTEM()","e4fc6b6d":"distribute()","e4fcf329":"setBonusRate(uint256)","e4fe8eb1":"getUserBigPromoBonus(address)","e4ff0f18":"rocketshipReachedDestination()","e4fffb3a":"updateMaxTokensToDistribute(uint256)","e50007b9":"TerminateEmployee(address,address,uint32,uint8)","e5002347":"setLimitMaxCrowdsale(uint256,string)","e5002a05":"whitelistAddress()","e5027880":"fortyEndTime()","e50278a6":"sellAllAmountPayEth(address,address,address,uint256)","e5033268":"endPreICOTimestamp()","e5033ee4":"maxBridgeHeight()","e503f70d":"newArticle(string,string,string)","e5042271":"setNick(string,string)","e5043632":"ElectronicHealthRecordToken(uint256,string,uint8,string)","e5045002":"setSecurityWalletAddr(address)","e504862b":"assertEq30(bytes30,bytes30)","e5065522":"updatePermissions(address,uint256)","e506b9b7":"joule()","e5071b8e":"incrementCount()","e5075f4f":"ezpzToken()","e507d6dd":"getPlanActiveTime()","e507e7a4":"brandAccountsLength()","e508202d":"triggerLibraryEvent()","e5098e85":"eliminarEntidades(uint256)","e509b9a0":"initiateTransfer(string,string,uint256,uint256)","e509cac5":"_changeTokenAddress(address)","e50a32a9":"PriorityQueue()","e50a3bb1":"oraclize_query(string,string[],uint256)","e50ab759":"contractIndex(bytes32)","e50beffb":"voteStart(uint256)","e50d0473":"SetRank(uint8,address,uint16)","e50d2da1":"setSuperInvestor(address)","e50d8a8a":"deauthorizeMintRequester(address)","e50dce71":"testControllerApproveSetsAllowance()","e50dd26a":"contractTokenWithdraw(uint256,address)","e50dd478":"isFiscal()","e50e2f65":"EARLYADOPTERS()","e50ff8e9":"TestSportsG()","e5104307":"IsPlayer(address)","e5106ae9":"isValidNodalblockJson(string)","e51073f4":"withDrawInWei(uint256)","e510989a":"setNewDepositCommission(uint256)","e5113280":"RecipientStringUpdated(string)","e515a4d1":"gen0Limit()","e515cd38":"deliver(address)","e516f4dd":"LogOwnerChange(address,address)","e5173942":"PRE_SALE_SOFT_CAP()","e517fd54":"getBonusPercents(uint256)","e5189e2a":"minSumICOStage3USD()","e5193c48":"withdrawGalacticTokens(address)","e51949fb":"getMinAuditPriceSum()","e51a3b40":"mul(uint8,uint8)","e51a7826":"buyCore(uint256,uint256,uint256,bytes32)","e51ace16":"record(string)","e51bfd9a":"selfHybridizationPrice()","e51c3257":"isTokenRateCalculated()","e51d2093":"getSaleFee()","e51d5c33":"Bitstraq_Token()","e51dc14a":"setMinBidDifferenceInSzabo(uint256)","e51dfd90":"cancelSellOrder(uint256,uint256)","e51e3c61":"transferReserveFundTokens(address,uint256)","e51e88bd":"MintingManagerApproved(address)","e51f2c68":"change(address,uint256)","e51f95cc":"init_crowdsale(address)","e51fcfa2":"LLV_311_EDIT_4()","e51ff1fc":"iterateOverThings()","e520f09e":"tokensToMintInHold()","e520fc7e":"treasure()","e5212deb":"_buyIcoToken(uint256)","e521357c":"LocalsValidation()","e521889c":"distributePrizes(uint256,uint8)","e5225381":"collect()","e52269c2":"Ooredoo()","e523757e":"Cashback(address,uint256)","e524d618":"UBetCoin()","e5254036":"changeNameOperation()","e5258557":"setMigrateFeesDueToFork(bool)","e525af22":"TOAB()","e525c3d8":"dTRIGGER_NEXTWEEK_TIMESTAMP()","e5260958":"Defraycoin()","e5269bbf":"limitDefaultType()","e526d7a0":"getTeamAddress(bytes32)","e527217b":"Object(string,string)","e52858c6":"token_b()","e5286c80":"token1stContract()","e5291ac5":"getVMParameters(uint256)","e52b6a56":"getAmountBonus(uint256,uint256)","e52c0f24":"changeICOStartBlock(uint256)","e52c17a8":"test_increaseTimeBy800000_timecheck()","e52c66c1":"getTotalLosses()","e52c9da1":"giveaway(address,uint256,uint8)","e52d0404":"addressOfIndex(uint32)","e52d0659":"setPriceForBasePart(uint256)","e52e9f15":"isAddressLocked(address)","e52eb288":"buyFuel(address)","e52eb764":"updateVIPBoard()","e52efbf1":"getCompte_4()","e52f64ce":"releaseMany(address[])","e530db1c":"pool_percentage()","e531a9b8":"numOfUntransferableEcTokens(address)","e53229c7":"zasxzasxqa()","e5333b5e":"close_next_bucket()","e534155d":"holder()","e534a34b":"addThing(uint256,uint256,uint256,uint256,bytes32)","e534c676":"getRefillPercFor(string)","e5357b02":"ReturnCode(uint8)","e535ed35":"closeChannel(bytes,bytes,bytes)","e5362206":"hdiv(uint128,uint128)","e5362667":"getTotalTokenCount()","e5363ab8":"initialise(address,uint256,uint256,uint256,uint256,uint256,string,uint8,string)","e536a41f":"USD20Crowdsale()","e536c723":"lowestContribution()","e536f869":"pai_add(string,string)","e53767bd":"denied(address,address)","e537a195":"getSeatAvatarUrl(uint256)","e53831ed":"setSomeValue(uint256)","e5390e05":"thirdPeriodOfICO()","e53910a2":"TestNetReputationToken()","e5393f25":"GetSoftwareCount()","e53a22ac":"addSubMilestone(uint16,string,string,uint64,bool)","e53a8a5f":"GRAPE()","e53a8cf4":"getTokensLeft(string)","e53ae072":"PUCOINToken(address,uint256)","e53b373e":"TimeBankChain()","e53c4548":"transferOwner(address,uint256)","e53c9a5f":"cf_confirm(uint256,uint256)","e53cacba":"listOutEmployees()","e53cfed9":"setupMiniGame()","e53d4988":"WLLToken()","e53e04a5":"refillGas()","e53eb53d":"amountToSeedNextRound(uint256,uint256)","e53ecb79":"allocatedBalance()","e5408eae":"TEAM_RESERVE()","e5411525":"crowdsaleStartTimestamp()","e54135ac":"updateExchangeRates(uint256)","e542e7a3":"updateEtherCost(uint256)","e542e7c5":"newIdAuctionEntity()","e54384f9":"removeEntryManual(uint256,address)","e5438f5e":"FLiK(uint256,string,string,uint256,uint256)","e5449600":"unFreezeUser(address)","e544b52c":"setNextRules(uint256,uint256,uint256,uint256)","e545f941":"releaseToken(address)","e546299b":"activatePass(bytes32)","e5463032":"getWLAddress()","e546bb0c":"apiAddress()","e546d9c4":"removeTeam(address)","e548799c":"registerCrowdsale(address,address,uint256[8])","e548cf13":"betOnColumn(bool,bool,bool)","e548f086":"ETHOfCrySolObjects()","e549053f":"AnotherStorage(address)","e549114b":"stageOneCap()","e54919e6":"hasInitCard2()","e5494be1":"unlock2Y()","e5499e55":"LWFToken()","e549ec26":"safeDrain()","e54a29bb":"getRegisteredUser(address)","e54a9646":"netAddress()","e54aae13":"getMarketTopLevels()","e54c495a":"majorityReward()","e54c4f98":"getRefundValue(address)","e54d4051":"receiveInteger(bytes,uint256,uint16)","e54d62e9":"simDuration(bytes)","e54d8ccb":"Mappings()","e54ebe61":"updateBalance(uint256,bool)","e5514c9d":"MAX_PRESALE_TOKENS_SOLD()","e55156b5":"setFee(address,uint256)","e5515b55":"updateAssignedAudits(uint256)","e55186a1":"getUnit()","e551bff0":"PokerPayoutValue()","e55219c6":"Chromium()","e5522a5b":"getClassMintCount(uint32)","e5533790":"setBiddingComponent(address)","e554482e":"arrayLength()","e554a5ff":"closeBid(address,uint256)","e554af57":"BAJIDOR(uint256,string,uint8,string)","e5553b33":"GenChip(uint32)","e555c1a3":"sellMyTokens()","e556a08c":"validateToken(address,bool)","e557498b":"reFund(address,uint256)","e5575e61":"getTheLengthOfUserFreeze(address)","e557a18e":"activateHedge(address,uint256)","e557bb4e":"places(uint256)","e55834cb":"write(string,uint256)","e5583c59":"executeTxn(address,uint256,uint256)","e5589756":"Debug(string,address,uint256)","e5593b4d":"allocateTeamAndPartnerTokens(address,address)","e559afd9":"addToWhitelist(address,address[])","e559c724":"TEAM_VESTING_PERIOD()","e55a07b6":"setTiers(bytes32[],uint256[],uint256[],uint256[],uint256[],uint256[],bool[],bool[])","e55a07c2":"tokenSaleClosed()","e55a6ef6":"votingPeriodStartTime()","e55a7afb":"Gemmes()","e55ae4e8":"getPlayer(uint256)","e55b4aa8":"getBalloonCosts()","e55b55ce":"getPreSaleTokensAvailable()","e55b69b3":"startPostIco(uint256)","e55b8b62":"getPeerTokens(address)","e55c6d07":"getStartDateOfCampaign(bytes32)","e55db48e":"roundId_()","e55ed42e":"_phxToken(address)","e55f98f3":"Log1(uint128,string)","e55fae77":"setUpdatePeriod(uint256)","e56044c8":"incMemberBadRep(address,uint256)","e5604559":"UserUpgraded(address,uint256,uint256,uint256,uint256)","e560bf2e":"setOraclizeGasCost(uint256)","e5612b3b":"finishDistribute()","e5612d0e":"transferPaillier(string,address)","e561f28a":"cityIndexToApproved(uint256)","e562dfd9":"openRound()","e562f0ec":"setKYCRequiredToSendTokens(bool)","e5637956":"MIN_INVESTED_ETH()","e563d541":"delFrException(address)","e564bd4d":"accFoundation()","e564f88e":"tokensToIssue()","e564fd25":"setNotary(address,bool)","e56556a9":"getPlayerID(address)","e5656f9c":"updateMsgSenderBonusDrops(uint256)","e565b387":"FOUNDATION_POOL_ADDR_VEST()","e565beeb":"softMtcTransfer(address,uint256)","e565fd1b":"SetStorage(address,address)","e56646ae":"SmartPonzi()","e5664f65":"prePreSalePeriod()","e5665b57":"_softcap()","e566be4e":"EthRelief(address)","e566dfc6":"_handleFunds(uint256,uint256,address,uint256)","e567756f":"setDevelopmentAuditPromotionWallet(address)","e56860c3":"fundingLock()","e5689afa":"updateStorage(uint256,uint256)","e56988dd":"latestBidTime()","e569c1d4":"getMintOwner()","e56a9973":"marketCells()","e56adb5f":"IsWhite(address)","e56b3e68":"mediate(uint256)","e56b9dce":"GetPrize(uint256)","e56bb194":"calculateMyPercents()","e56c10a0":"ONTExchangeRate()","e56c174b":"getRate(address,address,uint256)","e56c8155":"initialiseMultisig(address,uint256)","e56c8552":"spinTheWheel(address)","e56d3fea":"developer_add_address_for_B(address)","e56e4776":"avgSalesToCount()","e56e56b2":"sellCard(address,uint256,uint256,uint256,uint256)","e56e60f6":"SingularityTest12()","e56ee3c1":"cityPrice()","e56f3815":"isKnownOnly()","e5700ddf":"jack_winner()","e5702701":"minSellRateInPrecision()","e57053cd":"airdropWinTime()","e5707fa2":"teamContact()","e570be18":"DVIPBackend(address,address)","e5714ea3":"insertCLNtoMarketMaker(address,uint256)","e571c35e":"ReverseRegistrar(address,bytes32)","e571fd2d":"addPrescription(uint256,string)","e5720f2d":"getCredibilityScoreOfClaim(bytes12,bytes12)","e572dee5":"bountyTokens(address,uint256)","e5731b77":"UnpackRevocation(bytes)","e5734c57":"setPhase1DurationInHours(uint256)","e574015c":"auditSupply()","e57405e2":"EMISSION_FOR_TEAM()","e575c5cb":"assertOnlyTo(uint256)","e575df72":"getUserStatus(uint256,address)","e576038f":"addNewSampleType(string,uint256)","e5760520":"bountyWallet()","e5766e84":"initPayoutTable()","e5769ab9":"getLastPresser()","e5775515":"getUserWallet(string)","e577d2c2":"updateEthToTokenOrderWHint(uint32,uint128,uint128,uint32,int256)","e5781b71":"SatFix(int256,int256,int256)","e5782fd5":"setFeeStructure(uint256,uint256,uint256)","e5789f5f":"getTotalLevelValue()","e5791c3e":"mustHoldFor()","e5796716":"restrictTransfert()","e579ebeb":"chAirDropFshare(uint256)","e57a68da":"StephenHawking()","e57ac748":"resolveDisputeSeller(string,address)","e57b921d":"_createNumber(string,uint256)","e57bc079":"DrawAddr()","e57c09bc":"contentById(bytes32)","e57c78ec":"unregisterPresale(address)","e57c8d1b":"dummyAgent()","e57d4adb":"approvedOrders(bytes32)","e57d880a":"externalPurchase(address,string,uint256,uint256,uint256)","e57e31fa":"approveSubmission(address,address)","e57e5741":"onXon()","e57e6593":"createClaim(string,string,address,uint256,string)","e57ea16d":"checkValueSent(bytes,bytes20,uint256)","e57ebc0f":"FRPToken()","e57f5a1d":"removeFromStud(uint256)","e58018c5":"openSaleEndTime()","e5807e06":"unfreezeBoughtTokens(address)","e580b2b0":"presaleEnded()","e580f47b":"lotteryId()","e580f6ab":"createGame(uint8)","e581002e":"strategybacktest(uint32[],bytes32[],bytes32[],uint64[],bytes32)","e5815b33":"JohanNygren()","e58172b1":"cardCost()","e5820af7":"pushtx(address,uint256)","e582645e":"isTokenSaleRunning()","e582b7e0":"lastBidAmount()","e582dd31":"stored()","e58306f9":"adminMint(address,uint256)","e5834b4d":"setShareactive(bool)","e5839836":"isFrozen(address)","e585f69f":"TokenResolver()","e587fb71":"setTreasureBox(address,bool)","e588a2bb":"ChannelWithdraw(address,address,uint32,uint192)","e5893cbe":"Register(address,bool)","e58a6509":"SMTfund()","e58ae45b":"migratePhraseData(uint256,uint256,uint256,uint256,uint256)","e58b0eb1":"WinkelERC20()","e58b5ab2":"setFinishedTx()","e58b69f2":"getCompte_6()","e58ba9e4":"stealCardWithSocialIdentity(uint256,uint256)","e58c68bc":"MAX_GEN0_GIRLS()","e58c8c5c":"checkParticipantStatus(address)","e58ca07e":"IntegratedMoney()","e58cd3cb":"setTokenCapInUnits(uint256)","e58d116b":"addConfirmation(bytes32)","e58d478e":"btcAddrPubKeyUncompr(bytes32,int256,bytes32,int256)","e58dd55a":"endThirdBonus()","e58dede7":"_tokenAllocator()","e58eda1b":"ARTWORK_AUCTION_DURATION()","e58ef8a8":"executeTransfer(address,address,uint256)","e58f0289":"MANGGAHTOKEN()","e58f2623":"getLotteryData()","e58fc54c":"withdrawForeignTokens(address)","e58fdd04":"isFeed(address)","e5910f04":"setCourceSale(uint256)","e591253c":"refundPreICO()","e59160e3":"nomin()","e591fa26":"getProjectFeedbackWindow(bytes32)","e5920ab5":"getNoVotes()","e592172e":"test_twoInvalidEqString()","e5926ddc":"getSaleLength()","e592f95a":"getRewardWinnings(address,uint256)","e593428f":"PURCHASE(bytes32,uint256)","e5949b5d":"channels(uint256)","e594ad35":"assignCore()","e5962195":"blocked(address)","e596d811":"approveBatchTransfer(address)","e597a27f":"getNumberOfBlocksRemainingToWin()","e597f402":"create(bytes1,bytes32,bytes)","e59843ec":"allowAutoInvest(address)","e5994905":"transferTokenFrom(address,address,address,uint256)","e59997c9":"getFmmsDetail(uint256)","e599a767":"GGG()","e59a29a6":"getStakePerDraw()","e59af25b":"buy_spice_melange()","e59b0e14":"testIsNull(bytes)","e59bcf52":"subLockValue(address,uint256)","e59c4fa3":"smallUintFunc(int256,uint8,uint256)","e59c5e56":"Filled(address,uint256,address,address,uint256,address,uint256,uint256)","e59c9ada":"getBonuses(uint256)","e59cef17":"RaisedFunds()","e59cf926":"FOUNDER_ADDRESS3()","e59d2b7f":"unfreezeTeamWalletBlock()","e59d4912":"setOracleInterval(uint256)","e59d843a":"Replicator(bytes,uint256,uint256,address)","e59de295":"setItemPerPage(uint16)","e59de3a5":"drawToken(address)","e59e1ca6":"getBrickBuilders(uint256)","e59eee2e":"PRE_ICO_MIN_DEPOSIT()","e59f611f":"InputLimit(uint256)","e59ff828":"createOrder(uint32,uint32,uint256,bool)","e5a01e69":"getWeaponNumber()","e5a07419":"sellDividendPercentEth()","e5a078a7":"cancelRegistration()","e5a17818":"cancelSeller(bytes32,uint256)","e5a1eac2":"setSellDividendPercentageFee(uint8,uint256,uint256)","e5a23e7e":"changeBirthSettings(uint256,uint8,uint8)","e5a252b1":"playerTempReward()","e5a27038":"Pluton(uint256,string,uint8,string)","e5a284f8":"roundFourBlock()","e5a31c5d":"canGrantVestedTokens(address,address)","e5a3363c":"luckyVoters(uint256)","e5a34f97":"getFullround()","e5a3c0ad":"addPrivateSaleTokens(address,uint256)","e5a3c771":"expiredLockPeriod()","e5a4bed3":"getInterest()","e5a5fbc8":"crowdsaleInProgress()","e5a62ffc":"Tile()","e5a6b10f":"currency()","e5a6fadd":"ReinsureSeveralDeaths(bool)","e5a70ef7":"feeMultiplier()","e5a71eb6":"Itterator9000Ultra()","e5a749e8":"needSurvive(bytes32)","e5a7b51f":"parentChange(address,uint256)","e5a82fe7":"REXEN(address)","e5a85478":"getUserTXCount()","e5a912c7":"xdest()","e5a93dd8":"inCirculation()","e5a9d6b0":"get_registrant(bytes32)","e5aa3d58":"i()","e5ab8be0":"isCollaboratorOrOwner(address,uint256)","e5ac7291":"lockAccounts(address[],uint256)","e5ac808e":"checkProof(bytes32,bytes32,bytes32[],uint256)","e5aceac5":"getWorlCupByID(uint256)","e5ae7721":"submitPayment(bytes32,bytes32[],uint256,uint256,uint8)","e5af0e89":"setNewTokenURI(string)","e5af18c5":"score(bytes32)","e5af350e":"reloadWhiteByName(uint256)","e5af3a35":"throwsSaleWalletIncorrectMultisig()","e5af48d8":"isApproved(address,address,uint256)","e5af8d92":"iiinoTokenAddress()","e5afe3e6":"tokenPrices(uint256)","e5b02393":"addSaler(address)","e5b02447":"findTopNValues(uint256[],uint256)","e5b0ee4d":"changeVestingPeriod(uint256)","e5b2169f":"Registry(string)","e5b28c07":"weeksFromEndPlusMonth()","e5b2a58d":"SinoeCoin()","e5b4003b":"grantPoolRole(address)","e5b5019a":"MAX_UINT()","e5b598d9":"hasChampSomethingOn(uint256,uint8)","e5b5a527":"giveStellarReward()","e5b5fe72":"Put(address)","e5b6b4fb":"Securities_5()","e5b6eac4":"teamUnlock2()","e5b73e08":"payer(address)","e5b754fb":"Redeem(address,uint256,uint256)","e5b7ec88":"setVoteCut(uint256)","e5b82bba":"dayTokenFees()","e5b8d6e0":"withdrawTokenRefund(uint256)","e5b9a74c":"submit(address,string,string,string)","e5ba08e5":"_baseDebt(uint256,uint256,uint256,uint256)","e5ba0b8a":"sellOffer(uint256,uint256,address,bytes32)","e5bb6575":"blockUser(address,address)","e5bb9fb9":"cancelTx(uint8)","e5bc7be0":"replaceModuleHandler(address)","e5bcb303":"getAccessorPurpose(address)","e5bf1b75":"getElectionId(string)","e5bf93b9":"balanceEther(uint256)","e5c0de3e":"Labereon()","e5c0fa69":"torchDividendsOf(address)","e5c19b2d":"set(int256)","e5c2205e":"_calculateTokens(uint256,uint8,uint256)","e5c31ddc":"rejectTransfer(uint256,uint256)","e5c361b0":"totalTokensICO4()","e5c389cd":"setConfig(uint256,uint256,uint256,uint256)","e5c42fd1":"addStakeholder(address)","e5c46869":"refPercentage()","e5c46944":"MultiSigWallet(address[],uint256)","e5c5dabb":"CSCResourceFactory()","e5c60091":"highest_bid()","e5c60d0b":"INVESTMENT_FUND_TOKENS_SUPPLY()","e5c6258d":"withdrawCrowdsaleTokens(address,uint256)","e5c774de":"houseEdgeDivisor()","e5c7bc6c":"treesOnSale(uint256)","e5c7e509":"testThrowTransferDisableNotEnabled()","e5c8b03d":"renounceSigner()","e5c8eb2f":"mytesttokenToken()","e5c91047":"addMeByRC(address)","e5c92020":"freezeFrom(address,uint256,uint256,uint256)","e5c98b86":"RoundSet(uint64,address)","e5c9c2ed":"_initialize(address,address)","e5ce8200":"withdrawForMkt(address)","e5cf2297":"amountOwed(address)","e5cf45b0":"FruitionToken()","e5cfd1bc":"player3Timestamp()","e5d00bee":"initiateCrabPartData()","e5d00f1f":"checkDepositQuest(address)","e5d02cd0":"PriceReturn(uint256,uint128)","e5d0713b":"maxGamesPerBlock()","e5d0c1bd":"LATToken()","e5d17171":"skl()","e5d2ce2f":"setCategory(uint256)","e5d3d9d7":"getBuyArray(address)","e5d4610f":"generatorTransfer(address,uint256)","e5d5c898":"isSuperior(bytes32[],bytes32[])","e5d607f3":"SocialLendingToken(uint256,string,string,uint256)","e5d71cfe":"rewardLottery(bool)","e5d787f2":"moreTokenPerEtherForPresaleRound()","e5d8011f":"getCurrentTokenAmountForOneBtc()","e5d8103e":"setTotalBonuses(uint256)","e5d824a7":"addData(uint256)","e5d8f1ca":"removeAmount()","e5d90d94":"LuckchemyToken()","e5d9dac4":"assetTransfer(address,uint256)","e5da2717":"BOBToken()","e5dada63":"_pushRoomNight(address,uint256,bool)","e5db1a68":"bytes32Func(bytes32)","e5db2612":"addPrivatePurchaser(address,uint256,uint256,uint256)","e5db7a20":"mainnetAccountDict(address)","e5db9b49":"getJobInvoices(uint256,uint8)","e5dc476f":"getVideoGameCurrentPrice(uint256)","e5dc67d6":"setGameCloneFee(uint256)","e5dcc824":"getInfo1(address,address)","e5dd05ab":"primaryLedgerCount(string)","e5dd90a5":"HumanStandardToken(uint256,string,uint8,string)","e5ddb19d":"_applyLevelBonus(int256,uint256)","e5de0b89":"EGGS_TO_HATCH_1FALCON()","e5de2925":"endPreSales()","e5df3dd0":"unfrozen(address,uint256)","e5df669f":"recoverAddr(bytes32,uint8,bytes32,bytes32)","e5df7b10":"getBoughtTokens()","e5dfbe78":"setCreateDividendPercent(uint256)","e5e04a33":"SendResult(uint64,uint64)","e5e123f1":"funeral(bytes32,int256)","e5e1a202":"endTimeOne()","e5e231dd":"pauseTokens()","e5e288e5":"sendTransaction(address,uint256,bytes)","e5e2fd7b":"balanceTreasury()","e5e38fc7":"test_twoTrueAndFalseAssert()","e5e3ac4f":"removeAssociatedAddressDelegated(address,address,uint8,bytes32,bytes32,uint256)","e5e41a63":"publishOption(uint256,uint256)","e5e45b16":"notifyTempBreach(int256)","e5e4807f":"setPriceToPreSale()","e5e51bd7":"getOrderTokenCompletedAmount(uint256,address)","e5e53493":"requestKinTokenOwnershipTransfer(address)","e5e5cfac":"Altcoin()","e5e5dff1":"cancelBounty(uint256)","e5e5e5d6":"emitGenericProposal(string)","e5e6a0aa":"ticketTransfereesAmount(address)","e5e75fee":"fountainContractAddress()","e5e792de":"_pro(address,uint256)","e5e7a136":"CEO_SHARE()","e5e7b82b":"ethEurRate()","e5e7c276":"isData()","e5e7fa53":"div(uint96,uint96)","e5e88590":"unholdSubscription(uint256)","e5e9a9bb":"registerUsers(address[])","e5ea1201":"changeTicketType(uint256,string,uint256)","e5eabf14":"playInternal(address,uint256,uint256,address,uint256)","e5eb9d7a":"SilverMoon()","e5ec8df3":"calcTimedQuotaByPower(uint256,uint256,uint256,uint256)","e5ed1d59":"startGame(uint256)","e5ed31cb":"updateBytes32(bytes32,bytes32)","e5ed44c2":"Koplak()","e5ed78bb":"setDateStart(uint256)","e5ee8dae":"publicGetElementOffer(uint256,uint256,uint256)","e5eee9be":"longJudge(uint256,address)","e5ef0b95":"BitRRToken()","e5f06556":"fillRequest(bytes32,string,uint256)","e5f171d6":"BLOCKCHAIN_DEPOSIT_BETA()","e5f2806a":"createPlayer(uint32[7],uint256,address)","e5f363f8":"FTTtoken()","e5f3b2dc":"advisorsTokensWallet()","e5f3e7b5":"placeBet(uint256,uint256,uint256,uint256,uint256,bytes32,bytes32)","e5f3fcb1":"alias_price()","e5f4906a":"moveTokenICO(address,uint256)","e5f59e7c":"setIsChargingManagementFee(bool)","e5f5d05b":"tokensRaisedRound()","e5f6186d":"maxContributionWei()","e5f643cf":"InvestorWhiteList()","e5f65c71":"initialBlockCount()","e5f6a908":"AddrCommunityDistribute()","e5f6b137":"getOutCar(string,uint256)","e5f6d376":"updateStatusViaTokens()","e5f6f252":"getUserNumEntries(address,uint256)","e5f6f716":"thirdChainETH()","e5f796fd":"CONTRIBUTION_END()","e5f79bee":"PRE_SALE()","e5f8ce92":"setPercent2(address,uint256)","e5f92973":"conclude()","e5f952d7":"rewardMathGeniuses(uint256,uint256)","e5f9a40f":"TRHToken(address,string,string,uint256,uint256)","e5f9ec29":"left51(uint256)","e5f9f510":"BetMe(address,uint256)","e5fb08c0":"tokenExchangeRateMile2()","e5fb9211":"constructLeaf(uint256,address,uint256)","e5fd6364":"unregisterPublicKey(uint256)","e5fdac45":"presentMissingChunk(bytes)","e5fe3d7a":"aprovaPagamento(bool)","e5fe4f31":"buy(uint8,bytes32,bytes32)","e5fe7870":"vote(string,uint128,uint256)","e5ff2e8a":"mintTeamTokens()","e5ff7674":"restartPresale()","e5ffea8e":"testCalculateNeededCollateral()","e5ffeaf6":"fixAddress(address,bytes32)","e600c817":"verifyUser(string)","e6025572":"ShadowBox()","e602af06":"confirmChangeOwnership()","e604cf9f":"get_all_squares()","e6072d5a":"BONUS_MID_QTY()","e607a638":"DataController(address,address)","e608433b":"weiForRefundPreICO(address)","e608ca67":"calculateSubscore(address,int16,int16)","e608d3e5":"marketingCap()","e609120a":"intercrypto_convert(uint256,string,string)","e609348a":"upgradeOwner(address)","e60a33aa":"userEndGame(uint32,int256,bytes32,bytes32,uint256,address,bytes)","e60a72bc":"ReferalsTokenHolder(address)","e60a955d":"setActive(uint256,bool)","e60aafab":"setIcoStatus(uint256)","e60b0cad":"endPreICOStage1()","e60b1424":"bytes32ToUint(bytes32)","e60b2c9a":"SALE_2WEEK_BONUS()","e60b7ff7":"batchTransferToken(address,address[],uint256)","e60c11a0":"subContractBalance(uint256,uint256)","e60d3caf":"updatePowerDayRate(uint256)","e60dbaae":"Jump()","e60f1ff1":"getExit(uint256)","e60fb021":"publishOwner()","e60fd342":"getCreateSharesFxpValue()","e6107cbb":"isBurnApproved()","e6108fc9":"increaseLockBalance(address,uint256)","e61109fd":"setFiscalVerify(uint256,uint256,uint256,bytes32)","e611ad32":"CourseBaseOnIdStudentFunct(uint256)","e6120842":"warningERASEcontract()","e612a4b6":"get_order(string,uint256)","e612c0ad":"team2()","e6131706":"updateTransaction(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)","e6131a64":"UpdateBeneficiary(address)","e6135ffe":"_removeIndex(uint256)","e6136d84":"icoBegintime()","e61387e0":"knc()","e6138b37":"TESTBRB()","e613d3b2":"getParentUser(address)","e6153d1b":"mint(string,bytes16,uint256,uint32,address)","e615ed91":"AragonTokenSaleTokenMock(address,uint256)","e61604cf":"liquidateBorrow(address,address,address,uint256)","e616c975":"GetAccountIsFrozenCount()","e6175794":"MaPToken()","e617f204":"setWhiteListAdmin(address,address)","e618f558":"TempTokensSend(address,uint256,uint256,uint256)","e6197f41":"setTokenSaleFinished()","e61a3c73":"GuDuFengCoin(uint256,string,uint8,string)","e61ab6c9":"accountPubPreSale()","e61b6557":"reserveOwner()","e61b762b":"cancelAllSellOrders(address,uint256,uint256)","e61b959e":"dev_outStream()","e61c51ca":"topUpGas(uint256)","e61c6320":"_recoverAddressFromSignature(bytes,bytes32)","e61ca819":"indexToAddress(uint256)","e61d5d50":"raisedOBR()","e61fde91":"BiciDevuelta()","e6206711":"SendEthOn()","e6207611":"setChests(address)","e6213127":"deprecate(bool,address)","e621350d":"getDiscountAndSupply()","e621b149":"softCapUSD()","e621b5df":"redeemEther()","e6229c14":"_createBid(address,uint256,address,address,bytes32,uint256,uint256)","e622abf8":"LOCK_END(uint256)","e6232ba1":"updateEndDate(uint256,uint256)","e6234260":"depositCollateralOnBehalfOf(address,bytes32,uint256)","e623a1a6":"kcck256straddadd(string,address,address)","e623a93b":"votesForAnswer()","e623c4ac":"addressInSwap(address,address)","e6240deb":"activityCount()","e62420d9":"getChild(address,uint256)","e62444e1":"submitJRH(uint256,uint256,bytes32,uint256,bytes32[],uint256,bytes32[])","e624b02a":"changeHold(address,uint256,uint256)","e624d199":"partnerSaleWallets(uint256)","e625215c":"withdrawStake(uint256,bytes)","e6256509":"SPNToken()","e62580cb":"MYToken(uint256,string,uint8,string)","e6259f53":"timeArrayOf(uint256)","e6281254":"FundsMoved(uint256)","e628dbf9":"changeTiming(uint256,uint256,uint256,uint256,uint256,uint256)","e6293e23":"burnerAddress()","e629837c":"updateAndSafeTransferFrom(address,uint256,string)","e62a4ac9":"setBUI(bytes32,uint256,int256)","e62af875":"isContractOwnerLocked()","e62b795c":"addCourse(string,string,string,string,uint8,uint8)","e62bd899":"mintStart1()","e62c04bb":"OwnershipTransferred(address[],address[])","e62c2f9c":"get_location()","e62c9df9":"participantToEtherSpent(address)","e62cc611":"ETHER_HARD_CAP()","e62cd55c":"test_oneInvalidFalseEq()","e62d64f6":"withdrawableBalance()","e62d809d":"subdividendsOwing(address)","e62d909f":"TargetCreated(address)","e62e3c07":"getTransactionDetails(bytes)","e62eea47":"startSettling(bytes32)","e631b536":"fields(address,uint256)","e631e9b3":"solveIO(uint256,bytes32,bytes32,bytes32,bytes32)","e63227b0":"freezeGlobalTansfers()","e6324270":"profilParticipant(uint256)","e632c2f3":"totalPurchased()","e633cefe":"itemInfo(address,address,uint256,bytes)","e6346867":"imaxChainToken()","e63697c8":"withdraw(uint256,address,uint256)","e6369e41":"Timestamp()","e636bc3c":"addRoyLuxList(string,string,uint256,uint256)","e6378d3a":"joinGame(bytes32,string)","e637f824":"GetPlayerDataAt(address)","e638d76d":"migrateDomain(bytes32,uint256)","e638f372":"getDIVDPayoutPercent()","e639481a":"getUpperBoundBlocksTillGameEnd()","e63988bd":"getContributorInformation(address)","e63a6788":"miningOnePlat()","e63b029d":"finishSalvage(address)","e63b681e":"redeemExternalToken(bytes32,address)","e63b6b87":"DipTokensale()","e63c83c1":"getTotalWithdrawn(uint64,address)","e63d38ed":"disperseEther(address[],uint256[])","e63d4957":"totalLimitUSDWEI()","e63da5f7":"bootstrap2()","e63da84c":"getBattleRandom(uint256,uint256)","e63df4a7":"createJobEscrow(bytes16,address,address,uint256,uint256,uint32,uint32)","e63edfef":"Learn()","e63fb7d2":"getAdText(uint256)","e6400bbe":"suspend()","e64044c0":"payoutKeys(uint256)","e640663a":"removeFromOwnershipAuctionTokenIDs(address,uint256)","e640d5a8":"PubAccepted(address)","e6416f4e":"sendFoo(address,uint256,bytes)","e641bde1":"addInvestor(address)","e642b7b6":"isWhitelistOnlyStatus()","e642b900":"Bugcoin()","e642b9be":"MTP_PER_ETH_PRE_SALE()","e643197b":"TRY_Omnidollar()","e643d63c":"_setProposal(uint256,string,bytes32,bytes32,bytes32,string,uint256,uint256)","e6441201":"set_foo(string)","e644d886":"ico3total()","e644f60b":"isFresh(string)","e6452f64":"TGEDeployer(uint256,uint256,uint256,uint256,uint256,uint256,address,address)","e6456a30":"HARDCAP_ETH_LIMIT()","e646350d":"getTokensAvailableForSale()","e6468b9f":"mCoinPerBlock()","e6470fbe":"updateDefaultPayment()","e6471555":"remForSalesBeforeStageLast()","e64853c4":"polls()","e648ce75":"setSelfClaim(bytes32,bytes)","e64906a4":"setTokenForPreSale(uint256)","e64a4e27":"updateDealConditions(uint256,uint32,uint32,bool,uint256)","e64acfa4":"getRealValueToReturn(uint256)","e64e3241":"mint(bytes32,bytes,uint256[],bytes,bytes)","e64f15a2":"deleteTask(bytes32)","e650672b":"setGreenToken(address)","e6506873":"bookingMetadataForKey(bytes32)","e650ca40":"firstWeekBonusInWeek()","e6511ce2":"createCodeContract(string)","e6512ea2":"fundBounty()","e6514de2":"PreSaleLimit()","e6519a35":"getCreationTime()","e6527376":"OneWorldCryptoCoin()","e65284f1":"getRealPriceSpeed()","e652ca86":"LowcarbonToken()","e652f4cc":"getVoteCount(address)","e6530b97":"addArbiter(address,uint256)","e653d52d":"approveProxy(address,address,uint256,uint8,bytes32,bytes32,string)","e653d5d3":"GlobalStorageMultiId()","e653ec6a":"unsubscribeFromPool()","e6544b87":"ICORatio()","e65500e9":"startincreaseWithdrawalTeam()","e6560c94":"_saveBonus(address,uint256)","e6562fe1":"approveForwardedAccount(address,address,string)","e6569b1e":"getConID()","e657807b":"endIco()","e658d221":"claimPlotMultipleWithData(uint256[],string,string,string,string)","e6591f4e":"setNSFW(uint8,bool)","e65a0117":"earn(uint256)","e65a2e7f":"forceEmpty(bytes32)","e65af219":"PlusCoin()","e65b00b6":"Confirmation(address,bytes32,bool)","e65b1fd0":"getConsecutiveDeaths()","e65b490d":"_rewardWinners()","e65b743e":"dispatchGains()","e65b782f":"getCurrentTranche()","e65b96a7":"MyDanaToken()","e65b99c6":"uservalue()","e65bbceb":"makeAdoptionRequest(bytes5)","e65c1244":"holderEthers(address)","e65ca2fe":"Crowdsale(uint256,uint256,uint256,uint256,uint256,address)","e65d1522":"fromWei(uint256)","e65d19ca":"createInactiveEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256)","e65d6b49":"getCommission()","e65d9717":"pushVendor(string,address,bool)","e65da9a2":"PROMOTION_ACCOUNT()","e65de3ca":"removeTitleTransfer(string)","e65dea55":"validate(uint256,uint256,uint256,string,string,string)","e65e63ed":"secondsaleclosingTime()","e65e73e2":"oneavl()","e65e95a8":"token_address(address)","e65f0246":"updateCountryHoldersCount(uint256,uint256)","e65f1d98":"bigLoop(uint256)","e65f2a7e":"enroll()","e65f5ea4":"distribute10MT(address[])","e6601fb4":"viewFunds(address)","e660c7aa":"PresaleAddress()","e660dd54":"compWallet()","e661a98f":"ecosystemtoken()","e661b3d5":"returnStatus(uint256)","e662bd25":"doTransfer(address)","e662e9af":"getPersonalStakes(address,address)","e662ff97":"sellMyTokensStocks()","e6634e41":"tokensPerEthAtRegularPrice()","e664214a":"releaseUnlocked(address,address,uint256,uint256)","e6642528":"BitcoinIndigo()","e664725b":"bn128_add(uint256[4])","e664755b":"withdrawAttacker()","e664d8e8":"showhospital(uint256)","e664e1e0":"getAddressTwo(address)","e6657008":"TicketsInGame()","e665dba0":"addAuthorizedExternal(address,address)","e66623ad":"ETbankWord()","e6662e2b":"UrbitToken(address,address)","e666767b":"getPlayerBetForCurrentPlayRound(address)","e6678f33":"updateReferralBonusRate(uint256)","e66825c3":"pricePerUnit()","e668a547":"SingularityTest8()","e668a7af":"buyFrom(address,uint256)","e668e1f3":"noContestTime()","e6690fb1":"nextAuction(uint256)","e6691249":"getCompte_5()","e66a5e6b":"waveCap1()","e66a6b22":"isSigned()","e66aa720":"pureBalance(address)","e66bf416":"DLK()","e66c4175":"LargeCapStartTimeChanged(uint256)","e66c66d9":"setMonsterCreatorAddress(address)","e66caeb4":"payFortune(uint256)","e66d1b84":"countHoldAmount(address)","e66d4694":"gymContract()","e66d9874":"REQUEST_REJECTED_BY_HOST()","e66dda4e":"wallocked()","e66dde38":"startRound(bool)","e66e00f8":"getAdminDashboard()","e66f51fd":"AxieERC721Metadata()","e66f53b7":"curator()","e66f6e75":"getIsAttack()","e66f7bba":"oracleItQuery(uint256,string,string)","e670f7cd":"checkHash(string)","e6714f63":"eth_min()","e6717d3f":"setPresidenteDeMesa(bytes32,uint256,bytes32)","e671ac23":"getMonthClaimed(address)","e671f510":"onEtherandomExec(bytes32,bytes32,uint256)","e6722531":"checkBoosterQuest(address)","e672eb49":"GetBetInformation(uint256)","e673f646":"setContributor(address,address,bool,uint8,uint8,address)","e6744035":"booleanToUInt()","e6748da9":"setBytes(bytes32)","e674a0bd":"unlock(address,address)","e67524a3":"mintTokens(address,uint256,string)","e6758649":"revokeStakeholderConfirmation(uint256)","e676d53f":"GRAD()","e6774e1e":"setCapTab(uint256,uint256)","e677d67d":"decode(bytes,uint256)","e679366f":"setExchangeTime(uint16,uint8,uint8,uint8,uint8,uint8)","e67ad254":"airBegintime()","e67bcfb6":"viewPreSaleCancelledList(address)","e67c4f96":"_createItem(string,address,uint256)","e67cdfb7":"moveOldUser(uint256)","e67d35c6":"UmeTravelNet()","e67d5b16":"SpeedJump()","e67e04f9":"startAcceptingDonation()","e67e3d56":"ethTaxRate()","e67e8aaf":"cliffPercent()","e67eed44":"getTicketOwner(int256,uint256)","e67f3cde":"about(address)","e67fcd10":"createSale(string,uint256,uint256,uint256,uint256)","e6807ca9":"checkBlacklist(address)","e68122e2":"createConsent(address,string,string)","e681e906":"_disableModule(bool)","e681f989":"saveMetaData(address,bytes32,bytes32)","e6821bf5":"videos(uint256)","e6824b0d":"REAPER_INTREPID()","e682c9ea":"rescindVote(bytes32)","e682e290":"getWhitelistStatus(address,address)","e682e2b2":"PingToken()","e6838ffa":"CbDataStandardToken(uint256,string,uint8,string)","e684aa5c":"amountAlreadyPaidBack()","e684d75d":"from_Initialisation_to_Lifecycle()","e685f2fe":"SilcCrowdsale(uint256,uint256,uint256,address,uint256,uint256)","e686b89a":"stage_2_price()","e6885aad":"Notary()","e688aab4":"changeOperative(address)","e688d097":"activekey(address)","e688f89d":"getMax(uint256)","e6890105":"addRefundTransaction(uint256,uint88)","e6891995":"KStarCoin()","e6891a55":"underwritePriceOf(uint256)","e6898a7d":"getSex(uint256[2])","e689928e":"seventyeight()","e689aa66":"isAllocated9()","e68a471d":"getLatestTokenPayday(address,address,address)","e68a555d":"UpdateUserPELOAmount(address,uint256)","e68a655c":"setEtherDeltaFees()","e68a7c3b":"getAccounts(uint256,uint256)","e68a9610":"releaseTokensTo(address,address)","e68c32b3":"cgadmin(address)","e68d3ae3":"escrow(uint256,string,address,uint256)","e68e64cb":"getCurrentUserReward(bool,bool)","e68f05fe":"SetCrowdsaleAddress()","e68f08a0":"MatchGetted(uint256,bool,uint256,uint256,uint256)","e68fb207":"makeOrder(address,address,uint256,uint256)","e690833a":"getPropertyRatingTuple()","e690d9bf":"Rollercoaster()","e6917e67":"tierOnePurchase()","e691bed4":"get_arbits(address,address)","e693e4d1":"neironixProfitAddress()","e69405fd":"_endDutchAuction(uint256,uint256)","e69432c8":"getMyNormalDragons()","e694d107":"getlastDividendPoints()","e694f694":"distributeLRNX(address[],uint256)","e69506aa":"Tokens_Per_Dollar_Denominator()","e6955d7c":"XYCC()","e6957514":"mergedMinerValidatorAddress()","e695c00c":"assertEq29(bytes29,bytes29,bytes32)","e696d10d":"processPurchase(address,address,uint256)","e696fb9a":"_6_friends()","e696fd64":"change_ico_finish(uint256)","e6972dbb":"readEventFromDatabase(uint64)","e6979b90":"multiAdd(address[],uint256[])","e697b5d8":"referrals(address,uint256)","e69852d0":"getUserNameOf(address)","e698816f":"getTokenIdOfCR(string)","e69932e5":"getFreeSeeds()","e6997f6d":"rootUTXOMerkleTreeHash()","e699e8c3":"removeDefaultOperator(address)","e69a2d9a":"Lent(uint256,address)","e69b414b":"issuedTokensAmount()","e69b9b65":"exchangeableTokensFromSale()","e69d09cf":"releasedForTransfer()","e69d27a8":"lifeFactor_v()","e69d849d":"donate(address,uint256)","e69e04b3":"defaultPrice()","e69e4640":"calculateBalance(uint256,uint256,uint256)","e69e9337":"PERSONAToken()","e69fde41":"KentraToken(uint256,uint256)","e69ffce8":"changeRegulator(bool)","e6a0525f":"getStudentID(bytes)","e6a1e811":"newBet(uint8)","e6a27cf2":"getUserEarningsInfo()","e6a33268":"secondRate()","e6a3afe8":"sendTreasuryTokens()","e6a43d63":"crowdsaleSoftCap()","e6a45026":"fetchStageIndexBySnapshotBlock(uint256)","e6a50d84":"getAddressFromIndex(uint256,uint8)","e6a5d78d":"_getMerkleRoot(bytes32,bytes32[])","e6a605df":"PreTgeEnable()","e6a6d4c8":"getExecutedTransactions()","e6a7638c":"eucledianDistance(uint256,uint256,uint256,uint256)","e6a8fe04":"evHarvest(address,uint256)","e6a9026b":"submitTransaction(address,uint256,string,bytes)","e6a9627c":"setAgentAddress(address,address)","e6a9b2d8":"createTAO(string,string,string,string,bytes32,address,uint256)","e6aa216c":"getExchangeRate()","e6aa96a5":"CRS()","e6aaae81":"tokensSoftCap()","e6aac98f":"currentDayTS()","e6ab96ed":"unstakeContent(bytes32)","e6abaaba":"tier_cap_2()","e6ac17a1":"tokens_total()","e6acca00":"_finishBet(address)","e6acf0c1":"determineOutcome(bytes32,uint8[],uint8[])","e6ad204e":"vestingAccounts(address,uint256)","e6ad5bc7":"getFrozenTimestamp(address)","e6adde32":"setIsHiddenMessages(bool)","e6ae0536":"UpdateBackedAmount(uint256)","e6ae1a97":"getTokenAmount(address)","e6ae89b4":"getPlayerInfoInRound(uint256)","e6ae92b0":"getItem(address,address)","e6ae967b":"updateOrder(bool,uint32,uint128,uint128,uint32,int256)","e6af2d5d":"TRICToken()","e6af35f0":"calculateFee()","e6b09e92":"setAd(string,string)","e6b1602f":"buyOneRabbit(uint256)","e6b18f52":"LongTermProjectTokensAddress()","e6b1c48d":"Amal()","e6b1e71c":"jackpot(uint256,uint256)","e6b35875":"getAllbetByGtype(int8)","e6b55ff3":"TokenEmissionEvent(address,uint256,bool)","e6b6f9d5":"baseDiscounts(uint256,uint256,string)","e6b71e45":"changeIncrease(address[],uint256[])","e6b827a6":"becomeSpermlord()","e6b950f3":"_computeCooldownRemainingTime(uint256)","e6b96447":"updateMaxNum(uint32)","e6b96fe3":"setupFund(bytes32,address,uint256,uint256,address,address,address[],address[],uint8,bytes32,bytes32)","e6b972f5":"userName(address)","e6ba54c1":"specialInfo(uint256)","e6bb64b4":"generateChampionTokens(address,uint256,uint256)","e6bb88b3":"setMinEscrow(uint256)","e6bbe9dd":"getMinThreshold()","e6bc2cc9":"Marcela_Birthday(string,string,string,string)","e6bc5269":"CrypexToken()","e6bc7d2a":"FairDistributionToken()","e6bcbc65":"mostSignificantBit(uint256)","e6bcc297":"STARTING_BANKER()","e6bd0eca":"newUser(address,string,uint256)","e6bd11b2":"availableBuyInShares()","e6bf3fdc":"removeFarmer(address)","e6bf6ca2":"check_deadline()","e6bf70e2":"register(bytes20,uint96,uint32,bytes32[],uint16)","e6c01488":"addComment(bytes32,bytes32,string)","e6c0459a":"right79(uint256)","e6c0e6d5":"discountRate()","e6c0e9e1":"randomDS_sessionPubKeysHash(uint256)","e6c160dc":"RateSetter()","e6c1beb4":"prepend(address)","e6c1d7fc":"getHedgeIndices(address)","e6c21c24":"isCertified(uint256,uint256)","e6c22a11":"district0xNetworkToken()","e6c25aa1":"totalPhase2Donations()","e6c28db4":"getPlayerSpaceshipCount(address)","e6c2dee8":"Vish()","e6c2f4fe":"SendmoneySend(uint256)","e6c3329d":"EthaToken()","e6c35a91":"batchAirDrop(address[],uint256[])","e6c3b4ab":"testBalanceAuth()","e6c4498b":"LOCKING_UNLOCK_TIME()","e6c4a46a":"_addRecord(bytes32,address,string,string)","e6c4c2c7":"admin_tokenAdd(uint256)","e6c50020":"callAllFromMew(uint256,address)","e6c52016":"setToken(address,uint256,address)","e6c54139":"BitmassXToken()","e6c57a08":"timeIncreasePerTx()","e6c5e94c":"setinterval(uint256,uint256)","e6c63912":"lastBlock_a17Hash_uint256()","e6c721e4":"senderDelegates(address,address)","e6c75c6b":"triggerEvent(string)","e6c7c456":"balanceOfContract()","e6c88b31":"auditor(uint256,bytes32)","e6c89d4a":"makeOfferForCityForSomeone(uint16,uint256,address)","e6c8fcf1":"getExpirationRequest(uint256)","e6c9f6ee":"shelf(string,address)","e6ca00b5":"_abortAllRounds()","e6ca0f47":"setStages()","e6cb9013":"safeAdd(uint256,uint256)","e6cbcba9":"PlusOnePonzi()","e6cbd74c":"TokenSold(uint256,uint256,uint256,uint256)","e6cbe351":"saleAuction()","e6cda5ff":"countDays()","e6ce1622":"ProcessMarkings(bytes32,uint256,uint256,uint256)","e6d04d5e":"whitelistedParticipants(uint256)","e6d09529":"getTTTCount()","e6d0a37d":"RemovePoolMember(address,string)","e6d0dfda":"setDiscountTime(uint256)","e6d1092d":"vestedTeam(uint256)","e6d17238":"specialWallet()","e6d17cfc":"_updateToken(uint256,uint256)","e6d18a7a":"nihilumBalanceOf(address)","e6d20a23":"king_of_returning_shirts()","e6d26bc6":"setTeamContractAddress(address,address)","e6d2ceab":"set_pool_percentage(uint8)","e6d30bf2":"finishMinting(bool,bool)","e6d343a5":"getTransContractLocked()","e6d3b85b":"getOwnershipForCloning(uint256)","e6d3f673":"distributeGeneratedPower(uint256)","e6d41b39":"isApprovedTransferer(address,uint64)","e6d44122":"limitPreSale()","e6d4d217":"addAddressToWhitelist(address,string)","e6d54815":"delSpecialPrice(address)","e6d55f3a":"buy10ktickets()","e6d61f70":"resetInactivityTimer()","e6d660dc":"UBT(uint256,string,uint8,string)","e6d66ac8":"sendTokens(address,address,uint256)","e6d76a76":"withdrawSynthetix(uint256)","e6d78add":"tokensPerWei5()","e6d7fd33":"TokenERC20(uint256)","e6d8a47a":"MIN_INVEST_BUY()","e6d8d435":"AMBASSADOR_ONE()","e6d944a7":"computeCurrentPrice(uint16)","e6d95eb8":"DSAuthorized()","e6d970aa":"registry(address,address,bytes32)","e6d9bb0f":"secondsUntilEnd()","e6da89cd":"addVestingForBeneficiary(address,uint256)","e6dab965":"startTrack(bytes32,uint256)","e6dad824":"withdrawFrom(uint256)","e6db38c7":"purchaseFromTime(uint256)","e6dba7e8":"EX()","e6dbf486":"setCLC(address)","e6dc3655":"_validateUrl(string)","e6dc85a3":"weiTotal()","e6dc992d":"buySquareAtAuction(uint8,uint256,address)","e6dd672c":"enterMainSale()","e6dd9a8d":"endBookings()","e6deb223":"addPlayerMapping(string,string,uint256,uint256)","e6deefa9":"deposit(address,uint16)","e6dff3b4":"whitelistInvestor(address,bool)","e6e05562":"getIslandPreviousOwners(uint256)","e6e08ba4":"openPreICOPrivate()","e6e13795":"_addEntry(bytes32)","e6e261b2":"getFundAllTx(uint256)","e6e2c041":"_removeDiscount(uint256)","e6e2e1cd":"VestFFTokens(uint256,uint256)","e6e35407":"startCoinFlip(bytes32,bytes32,bytes32)","e6e45ea2":"MyHumanStandardToken(uint256,string,uint8,string)","e6e46238":"idCount()","e6e5b492":"AirwayBill()","e6e623d5":"setTokenSymbol(address,bytes32)","e6e68cb3":"map(uint256,uint8)","e6e7237f":"claim_time_victory(uint256)","e6e84bf8":"Suren3Token()","e6e88593":"_contractStatus()","e6e8c692":"computeResponseFirstHalf(uint256,uint16)","e6e91cfc":"voidFailedPayment(uint256)","e6e93b14":"setbetEnd()","e6eb00ce":"drawingNo()","e6eb6867":"updateKey(bytes)","e6ecc9c1":"getReservedAmount(address)","e6ecf8a0":"CONTENT_FUND()","e6ed4746":"setBonus(uint8)","e6ed51b7":"createToken(uint256,address,address)","e6ed6c74":"getRabbit(uint256)","e6ee78bd":"approveRemoveOwnerRequest()","e6effbe9":"createAuction(address,uint256,uint256,uint256,uint256,address)","e6f02bf9":"computeBonuses(uint256)","e6f041c1":"testLessThan()","e6f0823c":"deleteNota(uint256)","e6f091f9":"isAccepted(address)","e6f0b6cf":"individualCapInWei()","e6f0beeb":"sort(uint8[4])","e6f1a189":"isCustomToken()","e6f3ae3c":"neighbor(uint256,uint8)","e6f46410":"RBC()","e6f47613":"multiSubWithdrawFor(address[],address[])","e6f4c4a7":"setOtherSettingOwner(address)","e6f602ff":"benTook()","e6f6266a":"numMinters()","e6f67ef2":"payOrganizer()","e6f6b789":"setInterfaceImplementation(string,address)","e6f6e19f":"emissionStage()","e6f7bf89":"GetOwnerAddress()","e6f7ec75":"populateTierRates()","e6f8263e":"JackpotPeriods()","e6f8298c":"cancelActiveLoanAtIndex(uint256)","e6f82ca3":"_clearBridgeTokenFee(uint256)","e6f859e7":"descriptions(uint256)","e6f9476a":"getContribPeriod()","e6f9f265":"areNoncesValid(bytes,uint64[],uint64[])","e6fafef0":"ContributionMinimumUpdated(uint256)","e6fb5c4a":"CHLToken()","e6fbf441":"transferFromSenderPaysFee(address,address,uint256)","e6fd2982":"initialReserve()","e6fd42ee":"currentHalving()","e6fd48bc":"startTimestamp()","e6fd604c":"cut()","e6febc9b":"investorWithdraw(uint256)","e6ff0853":"advisorsTokenWallet()","e6ffd50d":"OXGOLD()","e6fff409":"TetherGBP()","e7001b84":"setOwnedCount(address,uint256,uint256,bool)","e700d63a":"FeesConverted(uint256,uint256,uint256)","e700efc4":"MaxSupply(address,uint256,bool)","e701900c":"refundTransaction(bool)","e701a6d3":"handlePresaleTokenMany(address[],uint256[])","e701d051":"setMarketerRate(uint256)","e70265a5":"FRACTION_ETHER()","e7031501":"jackpotWinPercent()","e703e9c3":"CheckActivate()","e704430d":"numberOfTreasuryOfficials()","e70468b1":"cancelOpenBids()","e7046bf0":"setFx(address)","e704f151":"burnContributorTokens(address)","e7058e15":"Rollback()","e705a519":"SALE_1WEEK_BONUS()","e7062263":"checkEndorsementExists(bytes32,bytes32)","e706918c":"testToggleBitSuccess()","e7073a4c":"MarketplaceV2(address)","e7074de2":"FOUNDATION_TOKENS()","e7084b7e":"closeTimeout()","e7092b41":"getAllowance(address,address,address)","e7095e97":"mintTo(address,string,uint256,uint256)","e70990d7":"summon10()","e7099763":"client_wallet()","e70addec":"right87(uint256)","e70b11df":"revokeAllocation(address)","e70b5259":"mapHeight()","e70b793a":"blankbreedingdata(uint256,bool)","e70c052a":"ethFundDepositAddress()","e70c3276":"HyipProfitTokenTeamAddress()","e70cd5ec":"destroyItemsStorage()","e70e690a":"set_gas_price_max(uint256)","e70e6ece":"BOURSETOKEN()","e70eb392":"claimReward(uint256,address)","e70f5d95":"setIV_R3(uint256)","e70fe5e3":"GenesisToken(address,uint256)","e7105795":"_raceOpened(uint256)","e710efc6":"regSpot(uint16,bytes32)","e711da27":"writeToStorage()","e71264fa":"addNewTokens(uint256)","e7127e29":"addressToTrainer(address)","e712bbad":"enterArena(uint256[4],address)","e71346f4":"removeAnimalIdFromCountry(uint256,uint256)","e7137dbf":"withdrawETH(address,address,uint256)","e713cda8":"returnUint32(uint32)","e714a028":"cancelWithdrawalRequest()","e7151828":"deathData_v1()","e7152a5c":"transferStar(address,uint256)","e715920f":"doBuy(address)","e717db5c":"CheetahCoin()","e717dc3d":"tax_fund()","e717ea61":"getCurrentAddress()","e718234d":"tokenLock()","e71897cd":"alfatokenteam()","e718ad01":"ReclaimPeriodChanged(uint256,uint256)","e7199f82":"transferCentralBanking(address)","e71a02e1":"DELAY_PERIOD()","e71a402e":"mul_float_power(uint256,uint8,uint8,uint8)","e71a5577":"getNumPullRequests()","e71a7811":"completeOwnershipTransfer()","e71b49ad":"ADDR_TKG_ORG()","e71b7913":"expireTransfer(address)","e71b8b93":"bye()","e71bbf48":"TokenSyndicateFactory()","e71bdf41":"addDelegate(address)","e71c3b38":"LogSetRBInformationStoreAddress(address)","e71c9697":"placeBet(uint256,uint256,uint256)","e71d3ae2":"CYFR()","e71d77a7":"PRICE_CHANGE_TIME_STEP()","e71d7bf0":"testControlTransferNotEnabled()","e71df6d6":"acceptMembership(address,uint8,uint256)","e71e592b":"replaceDelegates(address[],address[])","e71ecf6e":"revenueShareCurrency(address)","e71efd18":"Mytoken(uint32,string,uint8,string,address)","e7201d7d":"masterOwner()","e720b4a7":"DEEM()","e720e1b3":"marmoOf(address)","e7211134":"createDAO(uint256,string,bytes32)","e7212728":"getFreeChicken()","e7225175":"timeoutSEC()","e722a522":"createContractPeriodicTable(string)","e7233ce7":"getAdIds()","e7239ed2":"getTimebasedBonusRate()","e723a8f9":"setFundraising(address)","e724529c":"freezeAccount(address,bool)","e7255ef9":"desiredOutcome()","e7271c34":"removeArts(address)","e7278231":"DesToken()","e727de55":"setEggPrice(uint128)","e7299675":"DroplexToken()","e729b416":"lockIndexes(uint256)","e729ebe8":"getSignatureParts(bytes)","e72b0e23":"CreateTUBE(address,uint256)","e72b6091":"extendSaleTime()","e72c40dc":"CoreTeamMinted(address,address,uint256,uint256)","e72c81cf":"demo1(address,uint256,bytes,string)","e72cba6e":"ICO_PHASE1_AMOUNT()","e72e46fd":"ImmlaIco(address,address,uint256,uint256,uint256)","e72eb439":"DogTestToken()","e72f4f2a":"s38(bytes1)","e72f5f63":"maxRandom()","e72f7a78":"finishCurrentGame()","e72f99ac":"deathData_a18()","e72fd4e1":"developerCut()","e72fee5d":"massTeamMsgHash()","e7302541":"convertOldToken(address)","e730e87a":"stageOneSupply()","e73140c1":"setPublicOfferingDate(uint256,uint256,uint256)","e7316a95":"_set10()","e731b034":"HawalaKickoffTime()","e731bb09":"cpn(uint256)","e7320f9e":"getGameMaxNumberOfBets(uint256)","e7326806":"transferOracle(address)","e7328000":"userTokenBalances(address)","e7329e71":"scheduleCall(bytes,bytes,uint256,uint256,uint8,uint256)","e732a7e1":"preAllocationsPending()","e7334156":"processNextDeposit(address)","e73471fa":"_mintNativeCoinsByErcToNativeBridge()","e735b48a":"updateDescription(string)","e735f667":"destroyChildren(uint256)","e7368a1f":"isOnSale(uint16,uint64)","e736f03c":"actived()","e7377ccb":"vestingMembers(address)","e7383c91":"ICOStarted(uint256,string)","e73886b0":"addLocked(address,uint256)","e738a7a5":"createDungeon(uint256,uint256,uint256,uint256,address)","e738cb69":"EventLogged(string,uint8,uint256,address)","e738d2b3":"claimingFee()","e7398fa3":"setTokenRate(address,uint256)","e73995cd":"setSale(uint256,uint256,uint256,address)","e739a4fe":"initialSeed()","e73a914c":"setDAO(address)","e73b7d77":"testControlCreateNewRevisionNotUpdatable()","e73b9e2f":"bridgeAmount(address)","e73c032b":"PRESALE_TOKENCAP()","e73c3c53":"pingOracle(uint256)","e73c6353":"Payroll(address,uint256,uint256)","e73c99a0":"METADOLLAR()","e73cba34":"getTicketRound(uint256)","e73cc2eb":"walletPeriodOf(address)","e73cf000":"EMIToken()","e73de430":"releaseAccount(uint8,address)","e73e5063":"setRewardManagerLimit(uint256)","e73fc0c3":"getTokenByName(string)","e740ce26":"DSToken()","e740f4fc":"card_start_first()","e7416f01":"lastBlock_a18Hash_uint256()","e7422d29":"sendBalance()","e742b943":"ispackagesaleSetup()","e742db66":"tokenTaxRate()","e742f18a":"Task(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)","e743892b":"escrowExpiration(bytes32)","e744052b":"FalconFarmer()","e745656b":"removeImmigration(address)","e7463688":"MasharibTestCoin()","e7477f1c":"WithdrawDeposit(uint256)","e74799b4":"TOKEN_MIN()","e747f31c":"debit(uint256,uint256)","e74803db":"putSaleRequest(uint256,uint256)","e74915d0":"distribute(address,uint256,address)","e74997a8":"transferInternal(string,address,string,address,string,uint256,uint256)","e74a19fa":"AirdropTokensHolder(address,address,address)","e74a48be":"reservedTokens(address,uint256)","e74a5847":"getGladiatorCooldown(address)","e74a84ea":"issueToken(address,uint256)","e74ab046":"increasePrice_20_January()","e74ac94a":"RetailLoyaltySystemToken()","e74b981b":"setFeeRecipient(address)","e74b9d11":"safeToSubtract(uint256,uint256)","e74ba7b3":"getMntTokensPerEth(uint256)","e74baeef":"Upgrade(address,bytes)","e74cd692":"testNextRune()","e74ceb77":"EGGS_TO_HATCH_1CHICKEN()","e74d6d1b":"getLeader(address)","e74e66d7":"toB32(uint256)","e74e6e9e":"GBMToken()","e74f3fbb":"claimVestedTokens()","e74f8eff":"firstDayTokenLimit()","e74ffbd5":"getPart(bytes32,uint256)","e750b5c0":"getProjectAddress(string)","e7514287":"IsGenesisAddress(address,address)","e7519ac0":"_setTokenName(address,uint256,string)","e751f271":"execute(bytes32)","e75235b8":"getThreshold()","e75303a5":"recentWinners()","e7530cfc":"_batch3_icosaleStartTimestamp()","e7542782":"Recovery(address)","e754a4e5":"presale2_startdate()","e75528cc":"buyBuilding(uint256,uint256)","e75539e7":"Schrodinger()","e7556704":"GPSToken()","e755aaaf":"takePoint(uint32,int256,bool)","e755e077":"MKToken()","e75623d8":"setDeploymentAdminsContract(address)","e75705c7":"submitFakeHeader()","e7572230":"getPrice(uint256)","e7574128":"abcToken()","e757835e":"Yotra()","e7579c24":"totalBuyerSupply()","e757c17d":"preSalePrice()","e75864e4":"StarsICO(uint256,uint256,uint256,address,address,address,address,uint256)","e758d445":"getCurrentTierInfo(address,bytes32)","e759dfb8":"investorsBatchSize()","e75a0747":"Staker()","e75afb65":"endCrowdfund(address)","e75b4642":"_decreaseAllowance(address,uint256)","e75bd44a":"currentPrize(address)","e75bf79b":"ESEVENTYSEVEN()","e75bf820":"extraTokensHolder()","e75cdd7b":"isAddressInServer(uint256,address)","e75d1721":"vevcoin()","e75dcb19":"partnerSaleTokenPrice()","e75e69d6":"TryCoin()","e75ea9da":"preICOEndDate()","e75ef9b2":"trackSpend(uint256)","e75f02e3":"UraniumPlus()","e75f1634":"pearlSend(address)","e75f6e21":"totalMfr()","e7609c16":"getFarmer(address)","e760a11a":"attachContracts(address,address,address,address,address)","e760d284":"BOOKIES(uint256)","e760da9d":"createCP(address,string,string)","e760fb06":"groveAddress()","e7619fad":"allTokenIds()","e761eec6":"RecordTransfer(address,address,uint256)","e76240a4":"calcZWCAmountByToken(address,address,uint256)","e76261fb":"GetContractStateCancelledByLandlord()","e7637b5b":"deleteInfo(uint256,bytes32)","e7638445":"getRaffleTimeLeft()","e7651d7a":"normalProcess()","e7657e15":"ids()","e765bc5a":"thirdStageEnd()","e765c69a":"betOnDozen(uint256)","e765cb44":"auctionMinPrice()","e7663079":"owner_()","e766d79e":"CrowdsaleEndChanged(uint256,uint256)","e767b578":"createPlayerAndAssign(uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,bytes,string,address)","e76895bf":"OwnerAdded(address,bytes32)","e7694493":"is_white_listed(address,uint256,bytes)","e7696a29":"updateWeedTotal(uint256,bool,uint16)","e769dfbd":"buyTransferFee()","e769f61f":"private_withdrawAll(address)","e76abcb9":"presaleBonusTier2()","e76b8126":"finish(address,address,address,address)","e76cc0d3":"failWithoutReason()","e76dd3ef":"returnBet(uint64)","e76e337d":"Honolulu()","e76e5ecf":"__DEBUG_BAL()","e76e9286":"depositPresale(address,uint256,uint256)","e76eabe5":"finishPreIcoAndStartIco()","e76ece01":"setInvestStart(uint256)","e76ed0e3":"DividendToken()","e76f0836":"getcurrNumOfCards()","e76f3d5a":"REFERRED_BONUS_PERMILLE()","e76f62cd":"Reissue(uint256)","e770390d":"deleteMultitoken(uint256)","e771066f":"marriageProof(bytes)","e7712a94":"MDTCrowdsale(address)","e7718594":"totalAccessories()","e771e193":"GetCountryCode(uint16)","e7722f9b":"isAddressInvited(address)","e773c82f":"bonusEnds2()","e773ffd5":"queryPlayerUnAwakeSkillIds(uint32[11])","e7740cf9":"revealPaper(string)","e7751e48":"ownershipAuctionCount(address)","e775781b":"getPopularity(bytes32)","e775f01f":"CAPToken()","e776a5b5":"wallet_address()","e776fa22":"AlphaconCrowdsale(bytes32[5])","e77772fe":"tokenFactory()","e777b97b":"LogRegisteredInterval(uint64,uint64)","e777d060":"removeProviderAdmin(address)","e7781f3c":"ToppedUp()","e77900e9":"projectMemberAddress()","e779a8cf":"airLimitCount()","e77a6daa":"tokenCalculate(uint256)","e77a912f":"prefilled()","e77aaee2":"enterRecoveryMode()","e77b077f":"canExchange(address)","e77b8d94":"ipow(int128,int64)","e77ba2c9":"checkIfMegaJackpotWinner()","e77c646d":"redeem(uint256,bytes)","e77cfa1c":"weiPending()","e77db232":"isKYCApproved(address)","e77dd5b3":"setSoftCapUSD(uint256)","e77df041":"LykkeTokenBase(address,string,uint8,string,string)","e77e02d3":"giveAdvisorsTokens(address,uint256)","e77ef21f":"drawdown()","e77f9906":"gameListOf(address)","e77ff2f6":"centralAuthority()","e77ff818":"privateSaleEndTime()","e780377e":"liquidityPoolAllocation()","e7804444":"allowMigrate()","e780f6c9":"setDestructionAddress(address)","e7810318":"updateInitialBonus(uint256)","e781d8c5":"getPC()","e7827e85":"unfreezeTokens(uint256)","e7829152":"prometh(address)","e782b172":"transferWithLockBatch(address[],uint256[],uint256[],uint256[])","e783bfb1":"totalAllocatedToTeam()","e7843949":"STATE_PAYOUT()","e784a923":"thisweek()","e7850f2d":"Sunny()","e78562c0":"dividendRecentBuyersPercentageDecreaseFactor()","e785bab2":"withdrawAdminRevenue()","e785daaf":"setUnownedPurchaseableMode(uint256,bool)","e786140e":"setBio(bytes3,bytes)","e78631fb":"changePhaseToICOweek2()","e78686eb":"reclaimContribution(address)","e78721af":"getSmartSharingByID(uint256)","e7873b58":"tokensBurned()","e787418a":"isSubmitted(uint256)","e787654c":"_forumIdToAddr(string)","e787887b":"initialRewardFraction()","e787b523":"CLKToken(address)","e788b5eb":"emitAreaSet(uint256,bytes32)","e78bfee0":"allocate(address,uint256,uint128,uint256)","e78c1136":"CreateLCD(address,uint256)","e78c219b":"takeBuy(address,uint256,uint256,address)","e78c3462":"betsOff(uint256)","e78ce8db":"getCarEarning(uint32)","e78ce986":"KOK()","e78cea92":"bridge()","e78d6306":"getBountyTransfers(uint256)","e78dd6f1":"mainSaleTokenLocked()","e78e3ab1":"ESOPOpened(address)","e78f5412":"_whichCourse(uint256)","e78fd9a8":"submitMint(address,uint256)","e78ff581":"getProposalPayloadHash(bytes32,uint256)","e790aa9e":"joinMountain(bytes32,address)","e791b66c":"Wemark()","e79206e6":"finishElections(uint256)","e7921023":"getHolderLink(address)","e79248ea":"setRelationFrom(uint8,address)","e7930d21":"DeliverToken()","e7933601":"getOverBalanceWEIInfo()","e7933d58":"setIcoPhaseAddress(address)","e7938b82":"minAllowedStakeInPercentage()","e79487da":"checkInvariant()","e7950ede":"logs(bytes)","e795c149":"FinalToken(uint256)","e79609e2":"getOrCacheDesignatedReportStake()","e7964b49":"sendeth(uint256)","e796570b":"isClearingPriceValidator(address)","e796818e":"AEFTOKEN()","e79695da":"WhitelistUpdate(address,bool)","e796a6eb":"refund(uint256,address,uint256)","e796c43c":"_cancelActiveAuction(uint40,address)","e797398f":"IsMultiFreeze(address,address[])","e797496b":"sigDestinationApproveAndCall()","e7977701":"setLotteryOptions(uint8,uint256,uint16,uint256)","e7979efa":"LOG_BetWon(address,uint256,uint256,bytes32)","e797ec1b":"enableMinting()","e7984a3b":"updateRewardForContributor(address,uint256,string)","e7986466":"setSupportedToken(address,bool)","e798f4eb":"webpud()","e7990596":"getAddressAndBalance(address)","e7992845":"pendingInstallments()","e7996f07":"removeAttribute(bytes32)","e799f374":"fundingMaxInWei()","e79a198f":"unregister()","e79ab547":"bulkTokenSender(address[],address[],uint256[])","e79b4388":"LogBidExpired(uint256)","e79d0860":"partnerCount()","e79e0a22":"getEthers(uint256)","e79e2bd3":"updateArea(uint256)","e79e770f":"EmergencySafe()","e79faa58":"unpause(string)","e79fb53c":"setUSDEtherPrice(uint256)","e79ffa11":"_dev()","e79ffa99":"getpurchasersLength()","e7a01215":"right2(uint256)","e7a01352":"adjustHardCap(uint256)","e7a02352":"MintDarioToken(address,int256,uint256)","e7a0459a":"setCatalogPlayersAddress(address)","e7a05f08":"isTokenSaleToken(address)","e7a17d83":"emitTaskCreated(uint256,uint256)","e7a25bfc":"JustEscrowTestCoin()","e7a2e28e":"fishbank()","e7a33822":"seal(address,uint256)","e7a35405":"managerAddressNumberMap(address)","e7a3c218":"testFail_mint_without_add_authority_to_controller()","e7a4581a":"getCirculationSupply()","e7a49c2b":"trustedTransferTokens(address,uint256)","e7a4d9d3":"LIQUID_TOKENS()","e7a60a9c":"getValidatorAtIndex(uint256)","e7a6e75c":"ETH_USD_rate()","e7a7043d":"addPrecommitmentAdjustment(address,uint256)","e7a83c74":"AT()","e7a8a5cb":"setTier(uint256)","e7a95a7f":"WHOLESALE_THRESHOLD()","e7aa3afc":"getProjectStatus()","e7aa8ed5":"CrowdsaleMCS()","e7aab290":"set_s(string)","e7ab4f1c":"getShareholderArray()","e7ac4df8":"launchInvestment(uint256)","e7ac81e5":"productSold(uint64,uint32,string)","e7acaa1e":"createJob(bytes32,address,address,uint256)","e7acb2b4":"ZitronSupply()","e7acdcd0":"deleteInvest(uint32,uint32)","e7aef169":"refreshInvestor(address,address,uint256)","e7aefd01":"allowTransfersEnabled(bool)","e7af4540":"ChiyouCulturalAcchain(uint256,string,uint8,string)","e7afae52":"WayCellToken()","e7b0f666":"totalPaid()","e7b172ed":"GAS_PRICE_LIMIT()","e7b1983e":"giveReward(uint256[4],uint32,uint8,bool,uint32[4])","e7b1a7ae":"collect_fee(string)","e7b1d43c":"withdrawVotingRights(uint256)","e7b1d6dd":"setServerStatus(string,uint256)","e7b2d7e5":"deprecateAndUpgrade(address)","e7b3387c":"getVoteCount()","e7b379c6":"TokensUnlocked(address,uint256)","e7b43c44":"changePuzzle(uint8,uint8,uint8,uint8,uint8)","e7b48d98":"getBurningMans()","e7b48f74":"get(int256,address)","e7b4e5ab":"entrants(uint256)","e7b512ec":"setAddress(bytes32,bytes32,address,bool)","e7b6135d":"getClown(uint256)","e7b6805b":"OriginalMyIdRepository()","e7b686a7":"UnpackEntity(bytes)","e7b69e74":"interest(uint256)","e7b6ff08":"beerAndHookersCap()","e7b70b38":"getPurchaseInfo(uint256,uint256,uint256,bool,uint256,uint256)","e7b7aea5":"changesp2(address)","e7b7c2a6":"setup(uint256,uint256,uint256,address,uint256,uint256,string,address,address)","e7b808ea":"getAccountFeeModifiers(address)","e7b83730":"tokenAmount(uint256,uint256)","e7b89977":"setFeeAccount2(address)","e7b8d977":"editionsOfType(uint256)","e7b94df4":"donationWallet()","e7b9aaef":"FIRST_VOLUME_BONUS()","e7b9db8d":"confirmBurning(uint256)","e7ba1012":"supplyController()","e7ba2cc8":"BelottoCrowdsale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,address,address)","e7ba6c46":"resetReservations(address,bool)","e7bb22cd":"getValidClassId(uint64,address)","e7bb5233":"crowdsaleState()","e7bbda11":"heroCore()","e7bd85ca":"PFGC(uint256,string,string,bool)","e7be5617":"setOracleReference(address,address)","e7bf5352":"_withdraw(uint128,address,uint256,uint128)","e7bf7b08":"GroupCreated(uint32,uint256)","e7bf7dfc":"getProductPrice(uint256)","e7bfcf57":"HighCoin()","e7bfdc93":"clearLevels()","e7c0bd15":"SeedLog(address,bytes32,uint256)","e7c0dad5":"checkApprovalRatio()","e7c0e558":"BoomerangLiquidity(uint256,address)","e7c12837":"getPOOL_edit_24()","e7c158c6":"_setStrengthValue18(uint256)","e7c17972":"btcToTokens_(uint256)","e7c4118a":"certIssued()","e7c5c27f":"saleOpen(address)","e7c5d907":"Broker(bool)","e7c6229a":"publicOfferingHolder()","e7c6978e":"RSCCoinCrowdsale(address,address)","e7c77c80":"getAmountDailybyNum(uint32,uint8[4])","e7c8d171":"getTotalWidth(uint16,uint16)","e7c8dd6d":"GemsToken()","e7c8f61e":"enableAura(uint256,uint256)","e7c957c0":"MultiTransact(address,bytes32,uint256,address,bytes)","e7ca1343":"setReserveForCompany(address)","e7ca438d":"getUserDisplay(address)","e7cc62bd":"total_users()","e7cc862b":"storehouseIndex(uint256)","e7cc8ded":"generateLockupTokensDelegationSchemaHash(address,uint256,bytes32)","e7cd4a04":"addWhiteList(address)","e7ceaeab":"getTrackOwner(bytes32)","e7cf0171":"enableTokenClaiming(bool)","e7cf514d":"setMinOrderEthAmount(uint256)","e7cf548c":"getBurnCount()","e7cf6fcb":"changeEtherTxLimit(uint256)","e7cf7b34":"ICO_PRICE3()","e7cfafce":"getBirthMonth()","e7d00518":"FinishTokensale()","e7d0242b":"totalWeiCollected()","e7d03e93":"setMaxiumInputEther(uint256)","e7d0c552":"getRoyaltyPartners()","e7d0c7e7":"timeStampOfCrowdSaleStart()","e7d11a44":"getFutureTransByIdx(uint256)","e7d137ec":"balancesAddressDescription(address)","e7d1a024":"NewOne(address,uint256,uint256)","e7d2340f":"playervanity(address)","e7d29d8b":"withdrawExtraToken(address)","e7d29e38":"addHolderAddress(bytes32,address)","e7d2c590":"showCompany(uint256)","e7d2f315":"totalSupplys(address[])","e7d3fe6b":"mint(uint256,uint256,address)","e7d4761b":"unhalt_15day()","e7d47c2e":"selflleryManagerWallet()","e7d48741":"allOldUsers(uint256)","e7d4fd91":"getTokenControlInfo(address)","e7d50e5c":"FarmShare()","e7d53fcb":"privateSale(address)","e7d5a62b":"testNot()","e7d80c70":"getOrderCreator(bytes32)","e7d854af":"setWithdrawABIHash(bytes32)","e7d86204":"registerTeamScores(uint256[])","e7d87cda":"arbTokenExists(uint256)","e7d8c7db":"MicroToken()","e7da257f":"highestBidderCC()","e7daaa5a":"OwnerManager()","e7dac983":"submitClaim(uint256,uint256,uint256,uint256,uint256)","e7dafdb6":"transfer_token(address,address,uint256)","e7db6770":"startWork(uint256,bytes32,bytes32,address)","e7dde9a3":"_setDailyLimit(uint256)","e7de559c":"contrDividends(uint256[])","e7de72a4":"createFlag(uint16,uint256)","e7dee968":"KittyCore()","e7df2f3e":"disburseAddr()","e7e00d1d":"assignTestAddresses(bool)","e7e024ce":"janwin(uint256,uint256)","e7e0ca7b":"tariffIndexForAmount(uint256)","e7e10490":"cancelSale()","e7e1e69f":"commitBid(bytes32,string)","e7e2aa0e":"buyer_cancel()","e7e31d52":"setNinjaKindCount(uint8)","e7e31e7a":"addSpender(address)","e7e3411d":"fechBalanceByAddress(address[])","e7e3e167":"rate(address,int256)","e7e481c5":"BP_SPARTAN()","e7e52369":"firstMembershipPurchase()","e7e6aed1":"test_testableStandardCampaignContribution()","e7e766ca":"CSCRarePreSaleManager()","e7e7e3e8":"ETHEREMON_PROCESSOR()","e7e8116e":"forceTransferTokenOwnership()","e7e96a43":"getPOOL_edit_2()","e7e9e106":"rewardVote(address,address,uint256)","e7e9f385":"notarise(bytes32)","e7ea3d2d":"usernames(bytes16)","e7ea4406":"Civiq()","e7ea8065":"setNameRefer(string,address)","e7ea8122":"isStateInitializing()","e7eaaa05":"totalAvailableForSale()","e7eb285f":"stepEtherValue()","e7ebc348":"nonActivationWithdrawal(address[2],uint256[8],uint8,bytes32[2])","e7ec8182":"issueTeamTokens()","e7edab45":"_cancelParticipation()","e7ee6ad6":"rate(uint256)","e7ee85a5":"quickBuyPath(uint256)","e7eed1f7":"getCurrentPot()","e7efcfc2":"totalPayoutAmount()","e7f034c1":"getUri(address,uint256)","e7f0a865":"transfertokenContract(address)","e7f1111e":"initializeHolding(address)","e7f18249":"insertShareholder(address)","e7f1c468":"UserSold(address,uint256,uint256,uint256,uint256)","e7f23cb1":"getCallStack(uint256)","e7f35484":"NewAquarium(address)","e7f4037a":"demintTokens(address,uint8)","e7f40d35":"IntervalBytecodes()","e7f44523":"ReceivedLTC(address,uint256,string)","e7f4767c":"delimiter()","e7f56111":"ClaimPayout(uint8[],bytes32[],bytes32[],bytes)","e7f578e1":"createDoc(string,string,string)","e7f6edbd":"holdingTax()","e7f9e408":"stopTransfer()","e7fa443e":"unlockCashpledge(bytes32)","e7fa6883":"investFor24Months(address,uint256,uint256)","e7fa7969":"assertEq25(bytes25,bytes25)","e7fac728":"friendsFingersRatePerMille()","e7faecec":"testFailInsufficientFundsTransfers()","e7fb5388":"exit(string)","e7fb74c7":"buyItem(uint256)","e7fbee28":"checkIfCustodiesServedBBD(address[])","e7fc4b64":"ricardianVoucher(uint256,string,uint8,string,string,string,uint8,uint8)","e7fcde9b":"setFeeType(uint256,uint256,uint256)","e7fcf520":"signToResetTokenControlInfo()","e7fd9a13":"addEmployee(address,uint256)","e7fdc514":"buyFromVault(uint256,uint256,uint256)","e7fde97a":"_withdrawDividends(address)","e7ff0e38":"bountyDistributed()","e7ff8901":"transferWine(address,bytes32)","e80080d0":"cancelBurnRequest(uint256,string)","e80160ab":"order(bytes32)","e8017bb7":"getHTLCSpendingHash(int256,bytes32)","e801a361":"tileTimeoutTimestamp(uint256,address)","e8022dc9":"PLAgreements(address,address)","e8024468":"getHeroRequiredGoldForLevelUp(uint256)","e8024d75":"eNomCoin()","e8025d77":"changeStatus(uint256)","e8038e25":"TokenSale(uint256,uint256,address)","e803b708":"setDetails(string,uint256)","e803bcc6":"SetPriceIncrease(uint16)","e8046759":"decimals_multiplier()","e8055e9c":"burnExcess(uint256)","e8069e84":"verify(bytes32,bytes,address,address)","e806c603":"robottradingToken()","e8071f30":"exponential_decay(uint256,uint256)","e8078d94":"addLiquidity()","e8083863":"finalizeAuction(uint256)","e8088ca2":"GetEvaluate(bytes32,uint8)","e808aef7":"isIcoSuccess()","e808d671":"crowdsaleTokenMint()","e809046f":"NumeraireBackend(address[],uint256,uint256)","e80919d5":"mintUnderCap(uint256,uint256)","e80a4df7":"NotusNetwork()","e80b128f":"tournamentsAddr()","e80b7ab6":"clearArray()","e80bd3e5":"addCertificationDocumentToSelf(bytes32)","e80c4182":"ShresterToken()","e80d2ef8":"calculatesubscribersell(uint256)","e80d47dd":"USDSTEMPRICE()","e80d60b8":"CryptohomaToken()","e80db5db":"coreContract()","e80f23aa":"tokenApprovalWithSignature(address,address,address,uint256,uint256,uint256,bytes32,bytes)","e80fd970":"etherToSendDev()","e810267a":"dateEcoRelease6()","e8107ed4":"ElectriumToken(uint256,string,uint8,string)","e81140a8":"setPreICOStartTime(uint256)","e811f50a":"collectedFee()","e8125eb9":"updateContractTokenBalance()","e814018d":"getCrowdsaleHardCap()","e8141f93":"logUint(int256,uint256)","e8144c42":"advisorsTokensLock()","e8147a25":"changeMinBet(uint256)","e814c941":"removeParticipant(address[])","e815b60d":"SencToken()","e8168177":"lastBlock_a2()","e816a515":"takeFlight()","e816f76f":"Association(address,uint256,uint256)","e8171f37":"valueOfScheme(uint256)","e81766e8":"AgriChainDataContract()","e8179abf":"getStar(uint256,string,string)","e819172a":"TestCoin2()","e8197a4b":"totalSuppliedAfterLock()","e81a6c58":"issueRefundIfNecessary(uint256)","e81b34af":"_deployContract()","e81b3c88":"CardCount()","e81b53d0":"computeCost(address,bytes32,bool)","e81ba080":"updateMaxCap(uint256)","e81c17a1":"setOwnerAt(uint16,uint16,uint8,address)","e81c2fec":"reDistribution()","e81ca129":"consumeTicket(address,uint256)","e81cf24c":"replace(uint256,uint256)","e81d53cf":"arr()","e81d6c6f":"reserveY2()","e81dd181":"callSoftCap()","e81e0a09":"Win(address,uint8,uint256)","e81e1ccc":"withdrawDonation()","e81e935a":"summPrivateSale()","e81ecb4c":"received(uint64)","e81f0154":"pipeIndex()","e81f02b6":"withdrawFrom(address,address)","e81f35fd":"setLastTokenId(uint256)","e81fdd77":"restCandy()","e8203e38":"emitWithdrawn(address,uint256,address)","e820a32f":"vetoPayout(uint256,uint256)","e820ce4a":"setCTime(uint256)","e8223468":"sha3clone(bytes)","e8227611":"setRealisation_effective(uint256)","e8238688":"setTokenVestingFactory(address)","e823b9bf":"toInt256Safe(uint256)","e823da03":"VKBToken()","e823fa20":"checkDragonStatus(uint256,uint8)","e824b9c7":"moftakToken()","e827653c":"referalCount(address)","e827b3e2":"latestPost(address)","e827f7f3":"request(bytes32,string,uint256)","e827ff89":"HDToken99(uint256,address)","e82898b3":"loser()","e828a293":"TestyToken()","e82906b3":"ISCoin(address)","e82935da":"like(uint256)","e8294aad":"bonus1Ends()","e8297da2":"defaultLockInDuration()","e829945a":"buyProperty(uint16,uint256)","e829a171":"MIN_GET_AMOUNT_FINNEY()","e829d86d":"releaseAgents(address)","e82a7d8d":"submitAnswer(address,uint256)","e82aa31f":"createTeam(uint256[])","e82b7cb2":"proxySetCosignerAddress(address,bytes32)","e82bef29":"fundAddress()","e82c6e7b":"totalTokenSales()","e82c6e8a":"mintFirstTokens(address,uint256,uint256[])","e82cc47f":"getFundInfo(bytes32,string,address,address)","e82d777c":"FHCContract()","e82db7a0":"Batman(uint256,string,string)","e82ed40c":"communityContributionWithdraw(uint256)","e82f7dd4":"testThrowsRetractLatestRevisionNotUpdatable()","e83029bb":"checkbalance(address)","e8303659":"ETHER_CAP()","e8307d00":"setMinPurchase(uint256)","e8315742":"maxTokens()","e831884e":"getPhaseAtTime(uint256)","e832b482":"channelConfiguration(uint64)","e832fda3":"select_at(uint256)","e833bb53":"FLKDForGas()","e833cc12":"getNamespace(uint256)","e83400f6":"getBudgetOfCampaign(bytes32)","e83447d0":"breakLink()","e834a834":"claimed()","e834e89c":"FlexCoin()","e8350fae":"proclaimInactive(uint8)","e8358025":"isCrowdSaleFinalized()","e835852b":"LogQueryFeeSet(uint256,uint256)","e835dd27":"STAKE_MIN_AGE()","e837ab59":"getParticipantByAddress(address)","e8380983":"BChain(uint256,string,uint8,string)","e8387af8":"_mint(int256,address,uint256)","e839554e":"getBasicCentsPricePer30Days()","e839e65e":"query2(string,string,string)","e83b2adf":"PTestYankeeCoin(uint256,string,string)","e83ba1fe":"stageFundGoalReached(uint8)","e83c0bba":"setEmployeeTokenAllocation(address,address,address[],uint256[])","e83c272c":"setTime2(address,uint256)","e83c460d":"TimeWeekOne()","e83c78d4":"toggleContractStopped()","e83ce1f9":"addAddressAlias(address,address)","e83cf468":"sendBattleTokens(address,uint256)","e83d1c5e":"LatestRechargeTime()","e83d589b":"getLLV_edit_24()","e83ded8e":"balanceOfLockTime(address)","e83dfe5a":"ConcludeChallenge(uint256,string)","e83e0359":"dividendsRightsFixUpdate_(address,uint256)","e83e34b1":"maxFees()","e83e92ac":"setSalesFee(uint256)","e83f682a":"beginContinuousSale()","e8400be5":"startBetting(uint32,uint32)","e840c116":"SocialNote()","e8421b94":"PlayToken()","e84221ef":"playBigOrSmall(uint256,uint256)","e8425467":"USDDecimals()","e8429510":"TokenForInvestor(uint256,uint256,uint256)","e8436936":"StatsMinted()","e8436ca5":"setMainCampaignStatus(bool)","e8443708":"PaygineHasDeployed(uint256)","e844ca34":"withdrawTokensToAdvisors()","e844cb18":"batatacoin()","e844d097":"addCandidate(uint256)","e845105c":"countriesLockEndingAt()","e846e7c0":"drawPeriod()","e846f1f4":"collectPercent(uint256)","e846f997":"contributionWallet()","e8474230":"getHybridizationFullPrice(uint256)","e8477bda":"setBuyMaxLimit(uint256)","e847ca9c":"BAXI()","e84818bc":"largeContribPercentage()","e8489626":"setProxy(address,address,bytes32)","e848aba2":"addWhiteListUsers(address[],uint256[],uint256[])","e849ec8c":"ChangeTokenContractOwner(address)","e84a481b":"adddotchtooffer(uint256,uint256)","e84b53bd":"addItemTo(address,uint256,uint256,uint256,uint256)","e84b69e4":"editTimer(uint8,uint256)","e84c9d5c":"removeWhitelister(address,address)","e84d2abf":"inMainSalePeriod()","e84d90c0":"checkDisabledStatus()","e84d92e8":"_getBridgeNativeFee(uint256)","e84f7054":"refundMyIcoInvestment()","e84f82f0":"emitBegin()","e85034a2":"walletTrade(address,uint256,address,address,uint256,uint256,bool,bytes32)","e85061ca":"playerAction(uint256,uint8)","e850899a":"StartPreSale()","e850a8ef":"payTo(address[])","e850e4c4":"GetContractStateEarlyTerminatedByLandlord()","e850efaf":"setRegionTax(uint16,uint8)","e850f3ae":"getGenerationIdForCall(bytes32)","e851808e":"CHARITYSEACOIN()","e8518341":"transferOwnershipWithHowMany(address[],uint256)","e8518be0":"requestReplaceOwner(address,address,string)","e8518dc6":"rateWithBonus()","e85230e9":"minETHin()","e85353e1":"admin_set_withdraw(address,bool)","e85365d5":"firstblock()","e8539244":"SetPayrollLocked(bool)","e85393d7":"WithdrawEmergency()","e853cda3":"checkKncArbitrageRate(uint256)","e853ce64":"joinTeam(uint256,uint256)","e854d135":"executeWill(address)","e854dfb4":"Order(address,uint256,uint256)","e854eeb3":"fciDecimals()","e85501d8":"revokeRequest()","e8554e8b":"getRaceBaseStats(uint256)","e855aee5":"_mint(uint256,address)","e8561d36":"cashBackFromProject(address,address)","e856528a":"mul(uint128,uint128)","e8580dd4":"Survey(address,uint256,string,bytes32[])","e85ac5b0":"ownerSetAuditor(address)","e85b26c0":"createClaim(address,uint256)","e85ca2a4":"bitcoin_multisig_vault()","e85dcfe8":"ScheduleTransaction(string,uint256,uint256)","e85de8e7":"valueInUSD()","e85e0bd7":"addToken(uint256,uint256,uint256)","e85e3d92":"LongClosed(address,uint256)","e85efc50":"assertEq(uint256,uint256,bytes32)","e85f3be6":"TOSPrivateHoldingContract()","e85f3fb0":"setAuthorizedSpender(address)","e86142b5":"orderOnSaleAuction(uint256)","e861c4f1":"dividendEndTime()","e861e34d":"minInvestInWei()","e861f077":"HaltStatus(bool)","e8625060":"testDisputedInvalidSequenceWrongWriteValue()","e863051c":"SmartForestCoin()","e86310eb":"exp(address,address,uint256)","e863a122":"getPercentageCW()","e863d8cc":"repeatedPayment(address,uint256,uint256,uint256)","e863f0d3":"acknowledgeOrder(uint256)","e8641652":"strCompare(string,string)","e86434ef":"startRefundPayment(uint256,uint256)","e864f2b6":"exchange(address,uint128)","e864fd27":"checkCap(uint256)","e8665638":"bonusVestingPeriod()","e866d302":"setJackpotWinCount(uint256)","e86701e0":"playerFlight(uint256,uint16)","e8672de9":"removeRatePlan(uint256)","e8679512":"getTransformInfo(uint32)","e867ecda":"setPricing(uint256)","e8685ba1":"getNumOfCandidates()","e8689bf8":"_emitUserRatingGiven(address,address,uint256)","e868b55e":"createReaderWriter(bytes32,address,address,bytes32)","e868cd17":"ManUnitedSC()","e86994ea":"getPropertyColors(uint16)","e869d45f":"registerScheme(address,bytes32,bytes4,address)","e86a3b8b":"WSIPrivateEquityShare()","e86a9b1e":"Custodian(address[],uint256,uint256,address)","e86afde0":"description(uint64)","e86ba262":"getTimeLimitForReplyOnProposal()","e86bf267":"takeCfd(uint128,address)","e86c6431":"isTransferManager(address)","e86c87d3":"func_0778()","e86cf04b":"TinyProxy(address,uint256)","e86d24ca":"getSmartSharingByHash(bytes32)","e86d86ea":"totalTransferWhitelistMapping()","e86dad29":"assetArray(uint256)","e86dea4a":"feeNumerator()","e86e3f2a":"setArrIntF1StrF2(int256[],string)","e86f2c75":"mainSaleSecondBonus()","e86f6699":"isWhitelistedAddress(bytes32,uint8,bytes32,bytes32)","e870a88e":"setnumMax(uint16)","e870bec1":"logging(uint256)","e871614a":"getResponseUint(uint256,bytes32)","e871f35f":"addCourse(string,uint256,uint256,string,string)","e872a05e":"addrMine()","e873d02d":"cap2(address)","e8742b55":"setComment(string)","e87508be":"investorDeposit()","e8755d00":"setServiceFee(uint256,uint256)","e8756037":"finishExchange()","e8757d19":"donations()","e875bfbc":"getMinimumFunds()","e8763023":"ProofOfAwareness()","e876bdef":"getEtherRaised()","e876c273":"TotalSupplySet(uint256)","e876e3f1":"investorsFee()","e87752f4":"icsToken()","e8777158":"grantVested(address,address)","e877e541":"bankuToken()","e877f910":"sendToContract(address,uint256,bytes)","e8787040":"ElevenElevenToken()","e8789d88":"getEndTimeOfStage(address,uint256)","e878d65f":"QIUToken()","e879790a":"HHRFallback(address,uint256,uint256)","e87a0a59":"EIB()","e87a9d84":"phase1AccountTokensMax()","e87aa769":"_getShinyPurity(uint16,uint16)","e87b0242":"ADVISORS_LOCK_DATES(uint256)","e87bbdbb":"spawn(bytes32,address,address)","e87c05c6":"restSupply()","e87c0ee6":"getGameCount()","e87c1463":"bidTicket(uint256)","e87da468":"addChild(bytes32,bytes32)","e87df70e":"fivetimes()","e87e77fe":"switchAirdrop()","e87ea055":"checkCurrentStage()","e87ed8b5":"RTB2()","e87f41bb":"deleteInvestorTokens(address[],uint256[])","e87ff056":"getTeamByPosition(uint8)","e8801360":"soldTokensCounter()","e8814606":"CryptosisToken(uint256,string,string)","e882f844":"DINAR()","e883429a":"isTransferAllowedteam()","e8836183":"blockLock()","e88390aa":"coinSendDifferentValue(address,address[],uint256[])","e883d157":"outstandingPower()","e88499a9":"claimPayout()","e8850978":"reportMissingChunk(bytes32,uint256,uint8,bytes32,bytes32)","e8853e32":"getData_28()","e8854cfd":"getPointer(uint256)","e885910f":"trackCrowdsale(address)","e885b81f":"Bonuslist(address)","e8862924":"decodedLocksroot()","e886dade":"bulkTransfer(address,address[],uint256[])","e887841e":"to(uint256)","e8878b11":"wakeUpProxy()","e88810ff":"presalePiDiscount()","e8884aee":"_useFromDailyLimit(uint256)","e88885fa":"price1Of(uint256)","e888e445":"CatalogoOuvidorias(bytes32,uint8,bytes32,bytes32,int256)","e88a728f":"getAssetIdOwnerAndOIndex(uint256)","e88ab341":"contributorsVestTokenAllocation()","e88b0067":"mintInvestment(string,string,uint256,address,uint256)","e88b8ac6":"confirmAndCheck(bytes)","e88b9436":"MYR_Omnidollar()","e88bc2ba":"Variation(address,address)","e88c6a8a":"moveToken(address)","e88d27eb":"registerProperty(string,string,string,string,string)","e88d9567":"changeDepositFee(uint256)","e88eff06":"setUserRoles(address[],bytes32[],address[],uint8[])","e88f3a86":"addBonusToBlock(uint256,uint256,uint256)","e88f4510":"LigerToken(address,address,address,address,address)","e88f4c6f":"usedCoreSupply()","e88f97bd":"query2_fnc(uint256,string,string,string,uint256)","e8903656":"executeSubscription(uint256)","e8906a2d":"addSigners(address[])","e89152ac":"ItemReceived()","e8916af9":"addLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)","e891c9db":"validateWithdrawalSignature(address,uint256,address,address,bool,uint256,uint8,bytes32,bytes32)","e8927fbc":"increase()","e8928f7a":"setMaxWei(uint256)","e8930efd":"Investors(address)","e8932ea1":"burnClosedTokenInternal(bytes32)","e8936b29":"liveSince()","e894000b":"authorizedPower()","e89401a1":"multihash(bytes32)","e894326c":"addDepositCreator(address)","e8944564":"test_insert_findWithHintPrevRemoved()","e894f117":"TokenTimelock(address,address,uint64)","e8959b94":"addUser(int256)","e8974832":"levelTwoBonus(uint256)","e89826ac":"addGame(string)","e89876d6":"POSController(address,uint256,uint256,uint256,uint256)","e89927ef":"voteForCandidate(string)","e8992d40":"additionalTotalSupply(uint256)","e8997dbd":"setFeesController(address)","e899e848":"Fastmarketnetwork()","e89a49e2":"setPrivateName(bytes32)","e89a4e92":"getFeeRatioForJS(address)","e89ac5dd":"OrganizeFunds()","e89aeaca":"redeemLand(address)","e89b0e1e":"addAccount(address)","e89b2564":"Rate5()","e89b3ecb":"withdrawPUB()","e89b5d4b":"incrementInventory(uint256,uint256)","e89b727c":"myTotalStakeAmount()","e89b9ff6":"errCounter()","e89bc86b":"getBooleanMapCount(string)","e89c9b5d":"doThrow(string)","e89cdff5":"setTeamName(uint256,string)","e89d0d17":"getTeamLeaders()","e89d7f23":"payDividend(uint256,uint256)","e89df228":"shippingService()","e89f0f40":"DTR()","e89f3477":"grip()","e89f38d4":"BonusToken()","e89f5329":"createDebt(uint256,address,uint256)","e89f7672":"fight(bytes32,bytes32,bytes32)","e89f98a2":"TokenContractChanged(address)","e8a01f11":"BagSold(uint256,uint256,uint256,uint256,address,address)","e8a0aed3":"createToken(string,string,uint8)","e8a0cf44":"getScannersIds()","e8a0d312":"issueIndividualTokens(address,uint256)","e8a0e3c9":"BigbomPrivateSaleList()","e8a12479":"CBCT()","e8a1c08f":"nibbleToChar(uint256)","e8a207ad":"freeTokensAvailable()","e8a21157":"setNonEtherController(address)","e8a21382":"calculateInstantBonusAmount(uint256,address)","e8a2a5ba":"Resolved(address,uint256,uint256,bool)","e8a43960":"elixor()","e8a478ad":"round0Bonus()","e8a481bd":"edit(address,bytes32,bytes32,bytes32,bytes10,bytes32,bytes32,bytes32)","e8a4b797":"isTokenApproved(address,uint256)","e8a5282d":"setConfig(bytes32)","e8a55471":"_transfer(address,uint40)","e8a61357":"testInternal(uint256)","e8a61cc8":"refundBuyer()","e8a62235":"storeAction(address)","e8a6d7dc":"START_RATE()","e8a71012":"switchCrowdSaleStage()","e8a7228b":"hasEnoughValidSignatures(bytes,uint8[],bytes32[],bytes32[])","e8a748e7":"whitelistOneAddress(address)","e8a7be57":"MRVToken(address,address)","e8a7e256":"ownerTopUp()","e8a9594f":"rateOfEmissionPerYear()","e8a96b46":"getHolder(uint256)","e8a97ea8":"StateChanged(uint8,uint8)","e8aa1f5e":"makeOwnerBitmapBit(address)","e8aa377b":"storeHarvestOperation(string,string,uint32,uint16,uint16,string)","e8aa58ce":"vaultToWallet(address,uint256)","e8aa6b6f":"TeamtokenRelease4()","e8aabf9c":"ownerTransferWeiSecondWallet(uint256)","e8aada0c":"ViewBet(address)","e8aadc3f":"locationId()","e8ab245b":"WarriorsAssignedToBattlefield(address,address,uint256)","e8ac0e76":"getPropose(address)","e8ac764b":"twoMillionFourHundredThousand()","e8aca46a":"addReferral(address)","e8aca672":"getNodalblockURL()","e8acee9e":"fundPreSale()","e8ad1015":"__FindProjects(string)","e8ad2369":"getCaseAtIndex(uint256)","e8ad6912":"setGasForCLOUD(uint256)","e8ad7bcc":"secondTTax()","e8adf589":"getRateScale()","e8ae7dd2":"getCCH_edit_22()","e8ae8c6e":"DescriptionInt()","e8af214a":"fundingRemainingAvailableInEth()","e8afedd9":"setCommissionTarget(address)","e8b0a262":"ICO2Period()","e8b13c44":"getChainyTimestamp(string)","e8b1d0f3":"relayCall(address,bytes4,bytes)","e8b23632":"playerRefundAll()","e8b3891e":"userTransferUser(address)","e8b3ed65":"addDoc(string,string,string,string)","e8b49df2":"payWithEth(uint256,address)","e8b4c9d7":"OPEN_PACKAGE_PRICE()","e8b50802":"PRESALE_END()","e8b5e51f":"invest()","e8b611d6":"dailySupply()","e8b69081":"checkActionIsAuthorisedAndReset()","e8b6bbe4":"feeToSeconds(uint256)","e8b6fa80":"claim(int256,int256,int256,int256)","e8b9d536":"SingularityNetToken()","e8ba2fc9":"FundWallet(address,address)","e8ba854f":"updateWallets(address,address)","e8ba8f8b":"fixPlayerSurname(uint256,string)","e8bba4f6":"getDepositedOf(address)","e8bc0d40":"activateNextRound()","e8bccab3":"Neglect(address,uint256,uint256,int256)","e8bd09ff":"GetPlayerNumber(uint8)","e8bd5cc4":"NTRYPerEther()","e8be2e8e":"NewsContractEntity()","e8be3853":"setOffchainPayment(address,bool)","e8be73dc":"BenkiICO(address)","e8beef5b":"fireEventLog3Anonym()","e8befc0d":"getDividends(bool,address)","e8bfe5b8":"landmarkPriceStepNumerator()","e8bfebec":"ISSUE_METHOD()","e8c0485f":"profile(string)","e8c09c0d":"verificationHoldersValueMap(address)","e8c0a0df":"totalDepositBalance()","e8c23649":"referralName(string)","e8c28358":"calculateDispensedTokensForGasPrice(uint256)","e8c2cb16":"equal(string,string,string)","e8c32d13":"DoacaoEvento()","e8c3a65f":"save1(address,bytes,string)","e8c3e34d":"GetProperty(bytes32,uint256,uint256)","e8c494f1":"calcPresaleTokenSupply()","e8c4d328":"airDropNumber()","e8c4fa04":"coinIssuedGemmyMusic()","e8c5ff96":"jackpotLarge()","e8c61c4e":"actionB(uint256)","e8c66cac":"fundingReserve()","e8c67216":"getRateLimit()","e8c6ed14":"niceGuy()","e8c78934":"disableReservePurchases(address,bool)","e8c7df8a":"admin_token_add(uint256)","e8c80880":"VestingAddressChanged(address,address)","e8c8a52a":"reinvestDivs(uint256)","e8c8bb52":"_getRegistry()","e8c93aa9":"createProductionUnit7()","e8c96256":"Lesson_2(address,uint256)","e8c9a3e5":"withdrawnTokens(address)","e8c9f9de":"LocalToken(uint256,uint256,string,string,string,address,address,address)","e8ca1609":"startNewPayoutPeriod()","e8ca3bbb":"auctionsContract()","e8cb635b":"checkRequestSignature(bytes,bytes,uint256,bytes)","e8cc00ad":"withdrawOwner()","e8cf0aca":"depositEthersFor(address)","e8cf56a9":"C2L()","e8cf86ff":"MyTestCoin()","e8cf958e":"setBwMarketValidCaller(address)","e8cfc40d":"EtherPrice(uint256,uint8)","e8d03e91":"deployBoard()","e8d07525":"getLockerAddr(uint256)","e8d0affb":"addOwner(address,bool,bytes)","e8d0ed31":"sendInvestor(address,uint256)","e8d11d9c":"DavidCoin()","e8d1891b":"removeOracle(address,uint256)","e8d199ec":"BetterBitcoin()","e8d1e961":"lockAccount(uint256)","e8d320e6":"coinBalanceOf(address,uint8)","e8d3280f":"decrement(address)","e8d34f5d":"ensureCollateralBalance(uint256)","e8d375fe":"week_in_blocs()","e8d3a5a9":"joinboard(string)","e8d3cad5":"getDepositsLength(address)","e8d47923":"fAdd(uint256,uint256)","e8d50403":"ChangeDates(uint256,uint256,uint256,uint256)","e8d59fae":"PROMO_TOKEN_AMOUNT()","e8d663a4":"requalify(address)","e8d6b5aa":"TORCToken()","e8d6f62d":"p1Of(uint256)","e8d70569":"setGameAddress(uint8,address)","e8d83383":"whitelistMaxContribAmount()","e8d88bd4":"Race()","e8d8c3a7":"decreaseApprovalAllArgs(address,uint256,address)","e8d9d76a":"WCMY()","e8dc800c":"setReadings(bytes32,uint256,bool)","e8dca673":"throwsWhenSaleIsNotTokenController()","e8dcd15f":"NeuralProtocol()","e8ddb731":"myshowindex(address)","e8ddf15a":"withdrawEthBalance()","e8de636c":"add(bytes20,address)","e8df0ca1":"checkRefundPollDate()","e8dfa50d":"addPigment(address,uint256,uint256,uint256,uint256)","e8e03280":"window0EndTime()","e8e09563":"PresaleToken(address,address)","e8e0d5bf":"getConversionInfo(string)","e8e44248":"transferMiner(address,uint256)","e8e5882e":"SmartpoolVersion(address[3])","e8e7426e":"Presale(address)","e8e7c73d":"useMonthlyAccess()","e8e81fe4":"setTelegram(string)","e8e9eeae":"getPremiumCentsPricePer30Days()","e8ea0675":"redeemedEscrow(bytes32)","e8eb2284":"amountOf(uint256)","e8ebf3c5":"iii()","e8ecea05":"getSpecialNum()","e8ed024e":"LoopringToken(address)","e8ed1cdd":"getAccountQuantity()","e8edb2ff":"geneticallyEngineer(string)","e8edc816":"spender()","e8ee8b44":"MIS()","e8ee8c75":"deleteCandidateBySnapshotBlock(address,uint256)","e8eecf4c":"maxTxValue()","e8eed374":"hashTerms(string,string)","e8ef51db":"getCCH_edit_15()","e8efc1a0":"updatedValue(bytes32)","e8efe846":"blocksOwners(uint256)","e8f00990":"calcPlayerDivs(uint256)","e8f04e84":"disableLotteryGiveHunt()","e8f09e24":"getDisableBet(uint256)","e8f1736c":"TakeMoney()","e8f1bd8c":"getNeighbourhoodOf(uint256)","e8f1dc9a":"_unpackMakeData(uint256)","e8f35f2c":"updateUSeqvol()","e8f3cd59":"getFunderContributionClaimed(address)","e8f4bc12":"InitUpgradeCard()","e8f54364":"JJ(uint256,string,string)","e8f5cf36":"changeWCT2Controller(address)","e8f62764":"feesController()","e8f62f46":"someMethod2(uint256,uint256,uint256)","e8f64680":"purchaseFor(address,bytes32,uint256)","e8f6bc2e":"changeAccountLevelsAddr(address)","e8f72850":"interactWithXYZ()","e8f88890":"dev_inStream()","e8f8a1d2":"buyBuyerTokens()","e8f95666":"transferPreSigned(address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","e8fa1d51":"handleCloseChannel(address,bytes32,uint256,address,uint256,address,uint256)","e8fac4cd":"transfer(address,address,address,address[],uint256,uint256)","e8faf89c":"ETHER_MAX_CONTRIB_USA()","e8fb02d2":"sellFeeMilliPercent()","e8fbc67d":"MultisigWallet(address[],uint256,uint256)","e8fc0780":"_malloc(uint256)","e8fc451a":"init(uint256,uint256,address,uint256,uint256,uint256,uint256)","e8fc9273":"verify(address,string)","e8fc9c10":"UnicornContract(address,address,address)","e8fcda45":"_set8()","e8fe6b66":"getCode(bytes32)","e8fe9473":"test_threeInvalidEqUint(int256)","e8ff269e":"setMaxAvatarNumber(uint8)","e900604d":"claimTokenOwnership(address)","e9007d4e":"settleGame(uint256,uint256,string,uint256)","e9013cf7":"getFreelancerInvoicesByStatus(address,address,uint8)","e9024691":"recoverPreSignedHash(address,bytes4,address,uint256,uint256,uint256)","e9024ff5":"modifyMessage(string)","e90352eb":"_transferCheck(address,address,uint256)","e90389bd":"setWaitingTimeBuffer(uint256)","e90459f8":"emitError(bytes32)","e906c804":"_distributeBridgeFee(uint256,bool,bool)","e906e664":"getx2Policy(address,uint256,uint256,uint256)","e90799d2":"unlock4Circulate(uint256)","e9083a41":"drainMe()","e9084739":"economyBoost(uint16,uint16)","e9085957":"RANGESTART_1()","e9087eb7":"canMove(address)","e908a6d6":"Initialize_PlayUnit(uint256,uint256,uint256)","e9092bca":"weeOneEthCanBuy()","e90956cf":"setCurator(address)","e909ebfa":"addDelegate(address,address)","e909f2cc":"updateCancelDistFlag()","e90a3cf2":"addressCashwolf()","e90ab7fe":"lunetReserve()","e90acd53":"bidder(bytes32)","e90bcb32":"senderToProxy(address)","e90cb9b9":"setBurnAddress(address,address)","e90d2120":"etcWallet()","e90dae86":"TokenAUC(uint256,string,uint8,string)","e90dd9e2":"tokenState()","e90e5453":"rand(uint256,uint256,uint256)","e90ecfce":"EvoToken(address)","e90f84bd":"getETHFromTokens(uint256)","e9105cf1":"unblockTokens()","e9108538":"mintSilcToken(address,uint256)","e91208ad":"galleryFour()","e9121758":"token_holders_array(uint256)","e9121b12":"transferAndApply(address,uint256)","e9126154":"returnLoan(uint256)","e912ae4f":"getLastPaidTransaction()","e9130d4a":"test_twoInvalidEqBytes()","e9140274":"stakeTAOContent(uint256,uint256,bytes8,uint256,string,string,string,string,uint256,address)","e914575b":"endPublicIcoForTesing()","e9149e34":"investedWei()","e914d828":"TimeMoneyToken()","e9156cfe":"getMutation(uint32)","e916d0f0":"doBalance(address)","e916d29e":"matchBytes32Prefix(bytes32,bytes)","e91710aa":"DogCoinCrowdsale(uint256,uint256,uint256,uint256,address)","e9171abb":"airdropRecipientCount()","e91723b2":"aggiungi_candidato(string)","e9177f1b":"HTCToken()","e917b027":"setProjectManager(address)","e917f82d":"OxyCoin()","e918268b":"changeDrawer(address)","e9187ef4":"refundAction(bytes32,uint256)","e9198076":"fillBuyOrderPartially(uint256,uint256,uint256)","e919ca10":"getMyDiscount()","e91a08a2":"grantedParsecCredits()","e91a68bf":"getAllRightLeg()","e91b3ac5":"getMutalbeInfo()","e91b6987":"addNewObj(address,uint32)","e91bb26e":"redeemEgg(address)","e91c3a3e":"getStatusInfo()","e91cc17c":"withdrawFunder(address)","e91ccdc0":"allFundingProcessed()","e91cd09d":"thisbalanceETH()","e91d1ea0":"downtime()","e91dcba1":"MDL()","e91df414":"Nurucoin()","e91df8da":"AuctionSoldOut(uint256)","e91e10af":"allocationFinished()","e91e13a9":"CHUNK_SIZE()","e91f9d96":"getNftsByOwner(address)","e91ff7ca":"STORAGE_WALLET()","e921528e":"evTransfer(address,uint256,address,address,uint256)","e921b4f8":"buyByAddress(address)","e922248e":"MinterFunc(address,uint256)","e92254ba":"finaliseFunding()","e922ee6f":"removeParent(address)","e9233a65":"getNameIds(uint256,uint256)","e92340b5":"ICO_BONUS_TIME_2()","e923c3d6":"_setUint(bytes4,uint256)","e923e707":"hardCapWei()","e9253156":"force_deduct_fees()","e9262dae":"changeMinApproval(uint8)","e9263f9d":"ifcoinToken()","e9266fca":"collectRobot(uint256,uint256,uint256,uint256,uint256)","e92704e8":"setGason(uint32,bool)","e927a8c0":"changeContracts(address,address,address)","e927ca04":"addVesting(address,address,address,string,uint256)","e927da3f":"buyPackWithKitty(uint256)","e927ea7a":"ballotVoteCount(uint32,uint32)","e927f1f9":"getLeaderBoardData(address)","e927fc5c":"creatorAddress()","e9288d72":"pushToBank(address)","e928ad47":"createEthBidAuction(uint256,uint256,uint16)","e9298b97":"changePermissions(address,uint8)","e92a5d74":"createTimeDecayingToken(uint256,uint256,uint256,uint256,uint256,string,uint8,string,uint8)","e92b6818":"CONTRIB_PERIOD1_STAKE()","e92b7f4b":"AddVoters(string)","e92ba335":"airdropCountLimit1()","e92bb686":"_CallAborted(address,bytes32,bytes18)","e92bf2a8":"saveData(uint256,bytes32,uint8,bytes32,bytes32,bytes32,address,address)","e92c02cf":"startOpenWindow(uint256,uint256)","e92d5178":"bankerBeginTime()","e92dfb23":"LimitBalance(uint256)","e92e4505":"test_9b_testGoodTransfer_thenInvalid()","e92e4d63":"setReservingStep(uint256)","e92e5c34":"getVoterCount(uint256)","e92e5f03":"PRESALE_TOKEN_SUPPLY_LIMIT()","e92f2904":"Compra()","e92f7447":"isDayThird()","e92f8cfc":"MIN_BUYBACK_VALUE()","e92f9c1d":"getWarriorsFromIndex(uint256,uint256)","e92fdeaa":"ethRec(uint256,uint256,uint256)","e930f06f":"setToSaleWallet(address)","e930f3a6":"ethContractBalance()","e93119d9":"balanceOf(address,address,uint256)","e931f1ba":"secondRoundMayEnd()","e931fa0c":"setMonsterGene(uint64,uint256)","e93239d3":"outputWalletAddress()","e9324444":"preSaleState()","e93314ab":"getS()","e9333fab":"set_admin(address)","e9339de5":"Moneda(address,address,address)","e933cfb0":"mintCard(uint256,address)","e933e6eb":"checkPriceCrowdsale(uint256,uint256)","e9347e31":"_sellKeys(uint256,uint256,bytes32)","e9348532":"kncRateBlocksTrade()","e934ab0c":"ActualCommitteeRoom()","e9353cb7":"createProductionUnit3Beta()","e9358b01":"newENS(address)","e9360096":"cancelCompetition(uint256)","e9361d34":"ethartRevenueReward()","e93680d5":"_my_transfer(address,address,uint8)","e936e878":"disburser()","e9377aca":"mtEndTime()","e937f689":"_getElement(string,uint256)","e9391db9":"getBenificiary()","e9395679":"uintToString(uint256)","e93a1906":"buyFeeMilliPercent()","e93ab977":"bids_ignored_refunded()","e93b9c89":"stepVestingPercent()","e93ba042":"distributePrices(uint256)","e93ba06f":"getWhitelistAt(uint256)","e93c5973":"UpdateRequiredSignatures(uint256)","e93c980d":"tokenUnit()","e93d3e5f":"setNextRoundFee(uint256)","e93e25fe":"zilleriumToken()","e93e40db":"offerCollectibleForSale(uint256,uint256,uint256)","e93e7b26":"Stage3Deadline()","e93f29bd":"_setPartitionControllers(bytes32,address[])","e93f3f8d":"setBuyPrice(uint256,uint256)","e93f57b9":"capAmount()","e94087d6":"joinAsBroker()","e941fa78":"withdrawFee()","e94200f1":"burnAllOwnerTokens()","e94233f6":"oraclizeGasCost()","e942b516":"set(string,string)","e942c564":"getWei(uint256)","e9433ab6":"endDonations()","e943cc01":"powerDayEndTime()","e944267c":"FourArt()","e9445d5a":"createAudit(uint256,uint256,uint256)","e94479a9":"MinterRemoved(address)","e944a6d7":"claimSpecialResource(uint256)","e944f52d":"addressToBytes(address,address,address)","e94559b1":"ETToken()","e945c391":"setEndTime(uint64)","e945e26c":"CCH_OLI_1()","e946115b":"flushVault(uint256,address)","e946ad4a":"getUpgradesOwned(address,uint256)","e947962b":"pushRefIncome(address)","e9482aa6":"UsingANormalStruct()","e9485982":"canBePurchasedByETH(uint16)","e949fba1":"_getPurchaseToken(address,uint256)","e94a4db1":"isSuitableGen(uint256,uint256)","e94acf0e":"TinyRouter(address)","e94aea8a":"lastStealBlockNumber()","e94b6aef":"getLayEggInfo(uint32)","e94c8dc0":"NXX()","e94d7af6":"getCountAllBuildings(uint256,bool)","e94dc568":"freeBalancesOf(address)","e94e4bf1":"maxDailyCap()","e94e80fa":"playerIndexToApproved(uint256)","e94e83d8":"Answer(string)","e94f1dc6":"setWhitelistInternal(address,address,uint256)","e95015b9":"spawnMonster(uint256,address)","e9506c73":"_investAsBonusProgram(address,uint256)","e9519a6b":"FirexToken()","e951c35b":"NewAppleToken()","e9523c97":"getAllAdmins()","e952f74f":"airdropCount()","e9540395":"getRewardDivisor()","e9546d08":"increaseK()","e95502fb":"lockedShares()","e9556430":"SECONDS_PER_MINUTE()","e9559803":"getShipById(uint256)","e955ee03":"revertNoncsallocation(address)","e9560b3b":"getParticipantBalance(address)","e95626c5":"Lizun()","e95715cb":"jackpotSend()","e9577a11":"getHistBtcRate(uint256)","e95823ad":"safe(bytes32)","e958d15f":"partnerMessagesCount(address,address)","e958d1ae":"TreeContract()","e9592a9f":"AuctionStarted(uint64,uint64,address)","e9596db3":"betInfo(bytes32)","e95a644f":"checkIn(uint256)","e95ac9f7":"LBToken(address,uint256)","e95af01b":"identify(address,address)","e95b2bb8":"Ethraffle_v2b()","e95b4aa8":"nameOf(address,address)","e95bcfb1":"UVDICO()","e95bd5f2":"testToData(bytes)","e95bee59":"checkFormat(string)","e95d0a59":"MarbleEarth(address,address)","e95d716c":"FEE_SELECT_MARGIN_SPLIT()","e95d74e0":"set_coin_minimum_trade(string,uint256)","e95db6f9":"buyKey()","e95f206e":"MIN_WEI_AMOUNT()","e95f2c7d":"getMaxLoanAmount(uint256)","e95f6414":"dayPotExpiration()","e95f72e3":"ROD()","e95fa798":"SellerCancelDisabled(bytes32)","e9600f12":"release(bytes16,address,address,uint256,uint16)","e960127e":"set2RoundTime(uint256)","e960b940":"DoubleSixToken()","e960bb48":"balanceOfLocked(address)","e9616fb0":"changeFreezingAgent(address,bool)","e962867d":"BillionsToken()","e9629d7f":"phase1Cap()","e96309e7":"gatherOldBalanceOf(address)","e9639c80":"releaseTheOriginal(uint256)","e963f3e8":"MAX_BUYIN_GAS_PRICE()","e9653482":"hasValidProfile(address)","e966668c":"advisorset()","e9668128":"isTransactionsAllowed()","e9677b6b":"safeExecuteOrder(address,uint256,uint256,bytes,int256)","e967a9b7":"dataSourceCallbackExtras(uint256,uint16)","e967bb18":"refundAllMoney()","e967e60c":"placeBid(string)","e968ab95":"enableTokenTransferability()","e968d087":"shrink128(uint256)","e968e1ec":"setPLATPrice(uint256)","e9698f62":"setBurnAmountApproval(address,address,uint256)","e969c871":"swapTokens(address[],uint256[])","e96a6b38":"getSignerFlagFor(address)","e96b462a":"isOwner(address,bytes32)","e96b5e13":"SERENITY()","e96b8aa6":"bitwordsWithdrawalAddress()","e96bf86d":"lastHour()","e96cd01c":"SoraToken()","e96d01d4":"setPlayerOverrideId(uint256,uint256)","e96d36ac":"communityAllocating()","e96d6e4f":"publicKeys()","e96da99e":"reply(bytes32,uint256)","e96e5950":"getEventHash()","e96fefec":"resetTransferToValues()","e9703701":"byteToUint(bytes1)","e970754b":"getTxs(uint256,uint256)","e970e86d":"testBlockNumber()","e9715de9":"referralBonusPercent()","e97193a6":"removeAuthor(address)","e971c252":"issue(address[],uint256[])","e972261d":"calculateProfit(uint256,uint256)","e9734172":"createWagerAndDeposit(bytes32)","e9739db7":"getTokenRate(uint256)","e973b7ba":"node_height(uint256)","e973f2c4":"reinvest_color(uint256,uint256,uint256)","e9742d23":"createGun(uint256)","e9748e58":"renewalsCreditAffiliatesFor()","e974c000":"checkIsOnlyOwner(bytes32)","e97758a2":"thirdRewardPeriodEndBlock()","e977992d":"Doubler()","e9779b76":"depositOldTokens(address,uint256)","e977a11c":"wavesAssetId()","e977fa76":"_forceTransfer(address,address,uint256)","e9794dc1":"CreateHash(uint8,string)","e9799993":"Wafflecoin()","e979af97":"pushArray(bytes32,string)","e979bac1":"getCustomerBankRating(string)","e979fed6":"ownerstake()","e97a4779":"evaluateProposalPreCondition(uint256)","e97b2190":"add_wall(uint16)","e97b7689":"getTotalBuyers()","e97b97fe":"neumark()","e97cf883":"calculate(uint256,uint256,uint256)","e97cfab4":"withdrawDivs(uint256)","e97d87d5":"releaseStartTime()","e97db66e":"setJackpot()","e97dcb62":"enter()","e97e490c":"canuse(address)","e97e6dca":"applyPresale()","e97ed99c":"TurtleFarmer()","e97f6313":"token_airdrop_amount_each()","e97fe114":"tradeModifiers(address,address)","e98096fc":"numberOfNames()","e980c2e0":"littafiContentCommit(bytes32,string,string,string,string,bool)","e9813f9c":"_distinctOwners(address,address)","e981c803":"rejectPauseChange(bool)","e982d5a9":"transferOwnership1(address)","e9835ee1":"LogAgreementAmended(address,string)","e9841bd8":"certifyTradeAsCounterparty(bytes32,address)","e98444e8":"BIMI_DAO_31_a()","e984d794":"setRarity(uint256,uint256)","e984dd74":"ZenixSupply()","e985e367":"saleToken()","e985e9c5":"isApprovedForAll(address,address)","e9874106":"pricePerTicket()","e98799e0":"Mejasa()","e987cc45":"getfrom(address)","e9884b44":"depositClient()","e9886064":"_sendPrimordialTokenAndRewardDev(uint256,address)","e988998a":"refreeze()","e9892821":"isSpendableFrozenCell(address,uint256)","e9893c67":"awardAmount()","e98a0de7":"setGitHub(string)","e98a1439":"priceOfMultiple(uint256[])","e98ae339":"cancelMarginCall(bytes32)","e98b1679":"set_pre_kyc_bonus_denominator(address,uint256)","e98b7f4d":"getKitty(uint256)","e98bf38e":"test_insert_zeroKey()","e98c365b":"totalMigratedOut()","e98c7608":"mod9710(bytes)","e98cab50":"burnIndexed(uint256)","e98cf987":"turnOnSale()","e98d3112":"OwnableWithDAO()","e98dcba2":"approveExchange(address,address,uint256)","e98e130c":"GetCandidatePrincipal(uint8)","e98e8a64":"getKeccak(bytes32)","e98ebdd5":"numResponses()","e98f402c":"getClassCheckOwner(uint64,address)","e98f5708":"Dgp(address)","e98fe5ce":"AgriChainType()","e9900714":"sendIBTCToken(address,uint256)","e991ae55":"valid_weights(int256[],uint256,uint256,uint256[])","e9922f12":"getCoinInfoFromId(uint16)","e992ae5a":"INCXToken()","e992d8d8":"KNC()","e992f6cd":"pos(address[],uint256)","e99358a5":"TeamtokenRelease2()","e9938919":"EnterBetsForRaz(uint256,uint256[])","e9938e11":"getPricePerCoin(uint80)","e99392c0":"localsAvatar(bytes32,address,bytes32)","e993a9c0":"change_flag_hash(bytes32)","e993c056":"SaloniToken()","e9947583":"addAuditorToMultiRequestAssignment(uint256,address)","e995064e":"changeEmployee2(address)","e995194f":"transfer(address,uint256,uint256,int256)","e99543aa":"Trash(uint256)","e9958314":"getRequest(uint32)","e9959105":"setMintHelper(address,int256)","e99667ad":"OwnershipTransfer(string,address,address)","e99671ad":"movePermission(address)","e9970b6c":"isLessThan(uint256,uint256)","e99718d8":"addressOf(address,bytes32)","e9986f90":"activeStarGenome(address)","e9989220":"viewShareholderListing(uint256)","e998d2fa":"revokeVerification(address)","e998db2a":"directMessage(uint8,string)","e99a7a72":"createCeleb(string,uint256,address,uint256[6],uint256[6])","e99a7dca":"lastCampaignID()","e99b9ab7":"getProposalCreatedOn(address,uint256)","e99d2866":"setSeller(address)","e99d2db4":"universalToken()","e99d7333":"BlitzCrypto()","e99ebee2":"dist_multiple_airdrop(address[],uint256)","e99ed199":"getAddressLiquidatePool()","e9a0dd77":"cancelBid(bytes32,int32,bool)","e9a158a6":"currentETHPrice()","e9a1e689":"PreICO(uint256,uint256,uint256,uint256,address,address)","e9a241cc":"checkRoundsNumberToRun()","e9a24e24":"userlength()","e9a3773c":"setBotContract(address)","e9a3f454":"setAgriChainSeal(string)","e9a51c0d":"call1(uint256)","e9a5605d":"WheelOfFortune(uint256)","e9a58c40":"fun(uint256,uint256)","e9a59b32":"participantRoundAmount(address,address,uint256)","e9a5c776":"THETOKEN()","e9a62ba6":"MEGAMALLCOIN()","e9a6cce4":"getClaimKeysCount()","e9a6fdc3":"addressAt(bytes,uint256)","e9a765eb":"checkICOStatus()","e9a76ff7":"getInputName(uint256,uint256)","e9a78a1e":"decodedNonce()","e9a909a2":"setOraclizeAddrResolverI(address)","e9a9c1b4":"get_party1_balance()","e9a9c50c":"redeemTokens()","e9aa80b1":"contributorsAddress()","e9ab04a8":"hatchEgg(uint256,string)","e9ab1bd7":"True()","e9ab77e5":"getTimes()","e9ac31f2":"msgdata()","e9ac5918":"whatDidJasonSay()","e9ad1b38":"findAddressByEndpoint(string,int256)","e9ad72d7":"_canLotteryFree(address)","e9aeb932":"dUpgradeToPremium(bytes32)","e9afa7a1":"signedApprove(address,address,uint256,uint256,uint256,bytes,address)","e9afad38":"getTotalVesting()","e9b00581":"LogStartWeek(string)","e9b04e69":"addSourceForBudget(uint256,uint256,string,bool)","e9b07bbf":"transfer(address,uint256,bytes,bytes)","e9b0c0e1":"adminContractSecurity(address,bool,bool,bool)","e9b18084":"Diary(address,bytes)","e9b1f1ce":"updateRandomSource(uint256)","e9b23b8b":"updateLeaderboard(address,address)","e9b29a9d":"setAPI(address)","e9b2f0ad":"unfreezeTokens(address,uint256)","e9b32a3f":"HOUSE_EDGE_DIVISOR()","e9b3fd39":"TradeBox()","e9b48288":"insertMessage(string,bool)","e9b4a028":"payAirdrop(address[],uint256)","e9b54840":"viewReferral(address,uint256)","e9b58225":"extDestroyBot(uint256)","e9b5a2f7":"firstWithdraw()","e9b62f13":"lastBlock_f4()","e9b6953b":"team1Token()","e9b85cf4":"SimpleOwnedStorage(string)","e9b93569":"OwnerGetFee()","e9b991cc":"refundPct()","e9ba267e":"distributeETHP(address[])","e9ba2e9b":"Storage(uint256)","e9ba77fb":"receiveToken()","e9ba8698":"TheBillionCoinCash()","e9bacc1a":"freeBalances(address)","e9bb4aac":"WaltonTokenLocker(string,address,address,uint256)","e9bb84c2":"transferEth(address,uint256)","e9bbc19e":"Example3(string)","e9bc13b8":"_createCanvasInternal(address)","e9bc63f7":"getSellInfo(uint256)","e9bc9598":"totaltransactions()","e9bce432":"yetAnotherTransferTo(address,uint256)","e9bd48b8":"VLTToken()","e9bd97dc":"getData_24()","e9bdab6a":"tips(address,bytes32)","e9bec833":"setCrowdsalePause(bool)","e9c003d2":"indexOf(bytes32[],bytes32)","e9c1a9c4":"ProcessGame(address,address,bool,uint256)","e9c24166":"executeRequest(bytes32)","e9c26893":"setValidDurationData(uint256)","e9c2fbd5":"Banned(string)","e9c31315":"checkBetParity(uint8,address,bytes32,bytes32)","e9c33249":"ReceivedBTC(address,string,uint256,string)","e9c33dfe":"getHouseEdgeFee(uint256,uint256)","e9c35ea8":"universalCall(string)","e9c4a3ac":"dispatch()","e9c54384":"doesContractImplementInterface(address,bytes4)","e9c63b9c":"requestPeerBalance()","e9c64ad7":"evRecord(address,uint256,string)","e9c6c176":"addBlock(uint256,uint256,bytes32)","e9c6ed11":"withdrawNomins(uint256)","e9c714f2":"_acceptAdmin()","e9c771f2":"KBItoken()","e9c801e1":"refundInternal(uint256)","e9c9262e":"_productExists(uint256)","e9c93ce7":"cbtFundDeposit()","e9c9db5c":"ICOcontroller()","e9c9f4e0":"_finalizeFailure(uint32,string)","e9ca9b2a":"phase1StartingAt()","e9cac389":"onlyWhitelistedCanDoThis()","e9cafac2":"deleteArray()","e9cb364f":"lastTip(address,bytes32)","e9cbd678":"_resetBalanceDivis(address)","e9cddb1d":"EARLY_BET_INCENTIVE_COMMISSION()","e9ceef50":"createCanvas()","e9cf287a":"sellerGuaranteeEther()","e9cfa745":"calculateNetworkTokenBonusAmount(uint256,uint256,uint256,uint256,uint256)","e9cfb399":"SoupToken(string,string)","e9d16224":"maxFundedValue()","e9d1c598":"isEligibleForAirdrop(address)","e9d1d700":"assertFunction()","e9d1e422":"JZCoin()","e9d36c56":"transferredAmountToReceive(uint256)","e9d41d48":"getAuthorizationDataSource()","e9d56d2e":"releaseDividendsRightsForce(address,uint256)","e9d5d43b":"getWinnerByDrawBlockNumber(uint256)","e9d724e5":"changePreIcoEndDate(uint256)","e9d7d79a":"SRNT_per_ETH()","e9d7f309":"addRemainingTokens()","e9d862b0":"_updateTokensAvailable(uint256)","e9d8d3d7":"MAX_CONTRIBUTION_DURATION()","e9d8dbfd":"isService(address)","e9d979dd":"CioCoinERC21Token(uint256,string,string,uint256)","e9d9c4a9":"devTokenTimelock()","e9d9d5ec":"releaseBBT(address,uint256)","e9da12ab":"ATRToken()","e9db5d79":"Steak()","e9db5f5a":"addSpecialAccount(address)","e9db787b":"cancelStack(bytes32)","e9dc0614":"vote(bytes)","e9dc2e49":"createItem(uint256,uint256,uint256,uint256,uint32)","e9dc438e":"confirmAllSells()","e9dd7b6c":"getUID(uint256)","e9de432f":"testGasPrice()","e9de5c0f":"gen(bytes32,uint256)","e9de78fd":"TestRobotarCrowdsale()","e9deb98c":"presaleConcluded()","e9dff847":"withdrawMatingRequest(uint256)","e9e04195":"GEEKSID()","e9e041f3":"getTotalWeightedContribution()","e9e22362":"setWinPercent(uint256[])","e9e2990e":"bankManager()","e9e2c786":"returnMessage(uint256)","e9e30746":"withdrawBankroll(address,uint256)","e9e32bfb":"firstLevelPrice()","e9e3b1cf":"checkAuthenticity(string)","e9e43eef":"getLLV_edit_10()","e9e44349":"hashLicenseTerms(bytes32,bytes32)","e9e48842":"token_unlock_time()","e9e48880":"BOUNTY_AMOUNT()","e9e55c71":"PRESALE_LEVEL_1()","e9e69a48":"getCurrentPageSize()","e9e7a667":"get_stake(bytes32)","e9e7e908":"BlockOfLifeToken(uint256,string,string)","e9e972d9":"fileLink()","e9e98e76":"WSKYCoin()","e9e99d81":"getChannelFeed(address,uint256,uint256,uint256)","e9e9b5bc":"setIntF1F2(int256,int256)","e9ea666b":"test_remove_singleNode()","e9eaa69b":"sweepToOwner()","e9ebeafe":"greet(bytes32)","e9ec9e8b":"renounceBurner()","e9ecc0cf":"getInvestorsTokens(address)","e9ecd32b":"RajTest()","e9ed8281":"getDiniRequest(uint256)","e9ed8667":"balanceLocks(address)","e9ed9b64":"setProposer(address,bool)","e9edd759":"CCoinToken()","e9edf4cd":"hardwareWallet()","e9ee6eeb":"transferAdmin(address,address)","e9ef5318":"_isValidLandID(uint8)","e9efdd6b":"getByFrom(uint256,uint256)","e9f0509f":"Commit(uint256,address,bytes32)","e9f0ee56":"addPrice(uint256)","e9f12ed3":"itemsByName(string)","e9f1c4c3":"f2(uint256,uint256)","e9f21537":"setUint(bytes32,bytes32,uint256,bool)","e9f29b7b":"setTokenUriPref(string)","e9f2dbfb":"makeCommitment(uint256,bytes32,address,address)","e9f3b9ee":"triggerSteal(uint32,uint256)","e9f4043f":"buyTokens(address,uint8)","e9f50b02":"_transferHelper(address,address,uint256)","e9f58a52":"rotate_left(uint256,uint256)","e9f6af47":"getZethrTokenBankroll(uint256)","e9f6bd0b":"numberOfDays()","e9f702f2":"createDiamond(string,address,string,string,string,string)","e9f84c5b":"ClearToken()","e9f88ca5":"ICHAINToken()","e9f89121":"getWeeklyJackpot(uint32)","e9f8cd70":"addTokenPair(address,address,uint256,uint256,uint256,uint256)","e9f90fe6":"listPokemons(address)","e9f998ce":"checkInventory(uint256)","e9f9d8e2":"unidentifyParticipant(address)","e9fa6277":"updateMasks(uint256,uint256,uint256,uint256)","e9fa65aa":"updateNextStealTime(uint32)","e9fad716":"itemPrice(address,address,uint256,uint256)","e9fad8ee":"exit()","e9fb078e":"setFreeTime(uint256,uint256)","e9fca283":"buy(uint256,bytes32)","e9fcc787":"buyCoinsAtICO()","e9fd3434":"Cedex()","e9fd4e1f":"setAllowCnsContract(bytes32,address,bytes32,bool)","e9fd74dc":"create(string,string,uint8,uint256,address,string,address)","e9fe799e":"registrantRemove(address)","e9fee16f":"refundAll(uint256)","e9ffd6de":"allBlockCoordinates(uint256)","e9ffdf28":"Erc20Dist()","ea00a289":"getStateofContractString()","ea00cdb2":"DrazenToken()","ea00fad4":"callSender(address,bytes4)","ea011db4":"isCustomerHasKYCfromWL(address)","ea014645":"PTYC(uint256,string,string)","ea020f7b":"WindToken()","ea0217cf":"setVotingPeriod(uint256)","ea02db0f":"communityPoolAddress()","ea03918c":"AGC(uint256,string,string)","ea03c115":"getFunctionType()","ea045f34":"CROSS_RESERVE_FTX()","ea048256":"PROCOIN()","ea049958":"stakeScale(address,uint256)","ea05667a":"maximumPurchaseFraction()","ea0570e0":"convertToBytes32(uint256)","ea0599c7":"buyIt()","ea05cd01":"addCarProduct(string,uint32,uint32,uint32,uint32,uint32,uint256,uint256)","ea061e77":"changeNeat(address)","ea06ad02":"postBuyTokens()","ea071ac0":"depositShares()","ea083b86":"contract_enabled()","ea08bb89":"creatureCosts(uint8)","ea08ec2c":"accountModifiers(address)","ea0930f2":"_currentTime()","ea0a5237":"announce(string)","ea0a73d2":"TokenGMCT(uint256,string,string)","ea0a93e2":"miningLeader()","ea0aee14":"BuyStockRocketEvent(address,uint32,uint32,address)","ea0d0015":"_bill_all_participants()","ea0d1027":"calculateSumToWithdraw()","ea0d1702":"verifyEscrowCustomer(uint256,address)","ea0d18b0":"CurrenXToken()","ea0d5dcd":"getUserStatus(address)","ea0d6ad2":"setErrorROFR(bytes)","ea0d8da4":"amountReserved()","ea0d98aa":"changeParticipants(uint256)","ea0f5449":"Transaction(bytes32,address,address,uint256,uint256)","ea107240":"deleteRegionData(uint256)","ea10b18f":"withdrawMainDivi()","ea10d246":"get_orders_sell_amount(address)","ea110eda":"setOraclizeGasLimit(uint256,uint256)","ea112b6c":"updateCrowdsaleAddress(address)","ea116243":"_setCampaign(bytes32,uint256,uint256,uint256,uint256,bool,address)","ea118590":"vote_proposed_address(string)","ea11e00e":"LogMatchingEnabled(bool)","ea1325be":"createTokenUri(uint8,uint8,uint64,uint64)","ea135eeb":"computeSha3(uint256[16],uint256[8])","ea14457e":"emitRecovery(address,address,address)","ea149ab5":"bank2Val()","ea14bc11":"box1Star5()","ea15f262":"ETHEREAL()","ea1642f8":"getManyBalances(address[])","ea16c148":"isIcoAgent(address)","ea16cee5":"migratestate()","ea177073":"nextMaxPlay()","ea18e3d5":"getFreeSword()","ea19efb5":"startVoting(bytes32)","ea1a20d5":"shareholdersWallet()","ea1a9537":"IOBSTestToken()","ea1b28e0":"maxStake()","ea1bbe35":"getIndex(string)","ea1bf386":"getNextSellerBOTdata(uint256)","ea1c0379":"maximumAllocationPerParticipant()","ea1c1690":"timestampToDateTime(uint256)","ea1c41be":"RxEALSaleContract()","ea1cf495":"ImagodeiToken()","ea1d64b8":"startPostIco()","ea1da8b9":"updatePresaleMinWei(uint256)","ea1df439":"timestampFirst()","ea1e4c2d":"Transaction2()","ea1e572b":"addOrderBasicFields(uint256,address,uint256,uint256,bytes32)","ea1e74ef":"withdrawEtherToIfPossible(address,uint256)","ea1eaecb":"buyMinersWithGem(uint64)","ea1ecff4":"sendByTranches(bytes32[],address,uint256[],bytes)","ea1f2954":"transferSnowflakeBalance(string,uint256)","ea1f4082":"RGXToken(string,string,uint256,uint256,uint8)","ea1f9b3e":"NoxonInit()","ea2028b7":"changeSaleHardcap(uint256)","ea212b1e":"withdrawRequest(address,bytes32)","ea217d4d":"logSaleStart(uint256,uint256)","ea21c6be":"find_and_or_register_user(address,address)","ea21d12d":"deleteUncompletableRequest(bytes32)","ea222fde":"getAmbientLightControlLimits(bytes32)","ea22ee15":"LOG_EmergencyWithdrawalVote(address,bool)","ea23c473":"scheduleUpgrade(address,string,string,bytes32,uint256)","ea2470ab":"priceLocked()","ea251c2f":"owner_BurnUpdateTokenFrom(address,uint256)","ea25415a":"getAcceptedGames()","ea25f24a":"TokenCreation(uint256,uint256,address)","ea26b575":"Eth_Collected()","ea273277":"setAyantDroitEconomique_Compte_8(uint256)","ea274a6b":"processBuy(address,uint256)","ea27a881":"getMinimumEndowment(uint256,uint256,uint256,uint256)","ea28baee":"getRealWorldPlayerRosterIndex(uint128)","ea295ec2":"calcRevenue(address)","ea29a210":"TokenVesting(address,uint256,uint256,uint256)","ea2a31fc":"NMK()","ea2a33fc":"getInitialREPSupply()","ea2a9599":"callThisToStart()","ea2bc862":"optionDescription(uint256,uint256)","ea2c23da":"createAccounts(uint256)","ea2c2f36":"doubleBonus(address)","ea2c4357":"newTokenUnlockPercent(uint256)","ea2c69d1":"Marijuaneum()","ea2ce651":"isTokenUpgrader()","ea2d4cf8":"__DeployerFunctions(address,address,uint256)","ea2da598":"NLToken()","ea2e34f2":"isTransformAgent()","ea2ea847":"testChallengeFinalize()","ea2f28d3":"countWeeks()","ea2f43c3":"currentIncreaseWithdrawalTeamBallot()","ea2f9ebe":"retrievePoolFee(uint256)","ea2fe1a2":"nay()","ea3015b8":"burnUnusedTokens()","ea304511":"changeParameters(uint256[],uint256[],uint256[],uint256[])","ea30e2e6":"XiaoMuMuToken()","ea316027":"creditWalletUserLMNO(address,uint256)","ea317f6d":"setdissolveprice(uint256)","ea31b291":"getCreatorByTrackId(uint256)","ea31c53c":"_openGameLoop()","ea31ccb6":"rICO(address,address,address)","ea31d56b":"mintTrusted(address,uint256)","ea326431":"Neulaut()","ea32a8f4":"addshares(uint256,address)","ea32c95e":"EMPTY_PUBLIC_KEY_ID()","ea3367ae":"divMasterAmt()","ea337cdb":"batchChangeHoldPeriod(uint256)","ea33dd24":"developer_increase_prices(uint256,uint256)","ea341309":"catsRemainingToAssign()","ea348da6":"FuckERsToken33()","ea352634":"closeChannel(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)","ea359082":"End4()","ea35df16":"unlockBlock()","ea35e805":"calculateWinner()","ea364a9a":"addSingleApprovedAddress(address,address,uint8)","ea36ad91":"transferERCXTokenInitiation(string,address,address,uint256)","ea383176":"month30Allocated()","ea391420":"endIcoRound()","ea3b3a91":"recoverAddress(bytes32,uint256[3])","ea3b9ba1":"enter(uint256,address)","ea3bd5df":"purchase(uint256,uint256,address)","ea3c281a":"removePartner(address)","ea3d2827":"selectWinner(string)","ea3d4109":"rateIsStale(bytes4)","ea3d508a":"selector()","ea3d7e2c":"getOraclizeGas()","ea3d895f":"vestingBonusMultiplier()","ea3ebae6":"getConfigBool(bytes32)","ea3f190e":"devFee2(uint256)","ea3f6ce0":"joinGroupAndInvest(uint32,address)","ea4061cc":"calculateToFund(address,uint256)","ea4099e4":"QuantumPigBlockchain()","ea40c9e7":"ARCHETYPALXToken()","ea414b28":"setTaxWallet(address)","ea41bca5":"doStake(address,uint256,uint256,address,address)","ea42418b":"settlementContract()","ea428bad":"ACLYDcidTOKEN()","ea4354dc":"totalDividendWinners()","ea43671d":"watchPercent()","ea439e10":"transactionRawToBytes(uint256,address,address,uint256,bool,bool)","ea43b069":"PRIVATE_SALE_TOTAL()","ea43b79f":"unhaltDirectTrade()","ea448370":"setUserEmail(string)","ea454da8":"WonderDogToken(uint256,string,uint8,string)","ea46193e":"getEtherBalance()","ea46336b":"ShiversToken(uint256,string,uint8,string)","ea4634a7":"MarginlessCrowdsale(address)","ea46d7b9":"TACOS()","ea470d33":"voteForAnswer(uint256,address,bool)","ea4796b9":"revertIfReturnLessThanMinAndDie()","ea47cb24":"ownerAccount()","ea486cb1":"moderList()","ea490b84":"ethereumForkArbiter()","ea49ac03":"allScamsForSale()","ea4a294f":"addCard(uint256,uint256)","ea4a6aad":"LogQuantity(uint256,string)","ea4af029":"ConferenceCertification()","ea4afc54":"reserves(address,address)","ea4b466b":"admin_deposit(int256,int256)","ea4b9dce":"getLastBetNumber()","ea4ba8eb":"getOutcome(bytes)","ea4c4388":"createCredit(uint256,address,uint256)","ea4cc26d":"CryptoPayment()","ea4cc7eb":"divvy(uint256,address,uint256)","ea4ce239":"totalSale()","ea4dfce9":"benAddress()","ea4e6ded":"getListOfSupportedTokens()","ea4ef51f":"relockPart(address,uint256,uint256,uint256,int256)","ea4efa5d":"ganeshrajToken()","ea4f0882":"clearVolumeDiscounts()","ea503429":"privateSaleWallet()","ea5136a1":"adminUpdateSettings(address,address)","ea515c98":"pgoUnlockedLiquidityWallet()","ea51c343":"verifyLoanOffering(address[9],uint256[7],uint32[4],bytes32,bytes)","ea520b18":"totalDrop()","ea5366c1":"set_contract2address(address,address)","ea56a44d":"changeUpgradeMaster(address)","ea57712a":"SetFreeMKI(uint256)","ea57d818":"EmilToken()","ea5815f5":"getDatesForUser(address)","ea584ee6":"changeFreeZombiewCount(uint16)","ea58c644":"EUSD()","ea58c955":"powerDayRate()","ea58ca03":"DATE_01_JUN_2018()","ea593025":"giveKarma(uint256,string,string)","ea595672":"_transfer(address,address,uint32)","ea596a34":"EBIT()","ea598cb0":"wrap(uint256)","ea599cb3":"totalAward()","ea59a4e8":"GetPlayer_FromAddr(address,uint8)","ea5a13aa":"coindropsTokens()","ea5a22eb":"mintax()","ea5b2ae2":"checkIsWinner(uint256)","ea5b561f":"guardian1Vote()","ea5c204b":"MecStandardToken(uint256,string,uint8,string)","ea5c3204":"foundersAmount()","ea5ea470":"payFunding(uint256)","ea60e4ab":"Yusuf()","ea60e79b":"preICOLimit()","ea612545":"setBorrowAgreement(uint256,uint256,string)","ea62f24c":"unlockTeamAdvisorsPartnersTokens()","ea636aca":"setNinjaContract(address)","ea63ceb6":"allowAccount(address,bool)","ea64ad37":"totalUserTransfered()","ea64aee5":"GameBidAccepted(address,uint256,uint256,uint256,bytes,bool)","ea64faca":"init(string,string,address,uint256,uint256,address,uint256,address)","ea650378":"getTokenIDRelateWithTx(bytes32)","ea650c7d":"tokenToExchangeSwapOutput(uint256,uint256,uint256,uint256,address)","ea663631":"openTimerElapsed()","ea66543f":"isEmployee(address)","ea669a8a":"setTusdRegistry(address)","ea6723cd":"usdMnr()","ea680080":"firstAuctionsReferrer()","ea681932":"weiWantedOf()","ea6825aa":"VieToken()","ea6955e5":"ownerWithdrawUnspentCredits()","ea6a49ea":"setBetPrices(uint256[])","ea6b1377":"MAXTOKENSOLD()","ea6be96f":"estimateTokens(uint256)","ea6c1258":"setFSTKCentral(address)","ea6c9750":"transferToInvester()","ea6ca182":"addAgingTimesForPool(address,uint256)","ea6cc6e9":"delayedTokenAllocator()","ea6dee80":"addKey(address,address)","ea6ef2fe":"teamShare()","ea6f0725":"initCompoundContract(address,uint256,uint256,uint256)","ea6f1c4a":"sponsorLevel()","ea6f67e1":"SingularityTes26()","ea6f7f3e":"addAllValidShaHashes()","ea7000d6":"buyTokens(bytes32)","ea70b4af":"pendingCount()","ea70bdad":"attackTileForExistingUser(uint16,uint256,bool,bool)","ea726acb":"getReferrerAddr(address)","ea727ba2":"changeInterest(uint256[])","ea72d9de":"SENS_PER_ETH_BASE_RATE()","ea737b54":"getCompte_42()","ea74329c":"tokensRemainingPreCrowd()","ea74838a":"setControllers(address[])","ea7553f0":"vault_wallet()","ea75d311":"isBuyOrder(bytes32)","ea760a6b":"kkICOTest80()","ea760df8":"partner1_vows()","ea769e97":"changeTradeState(bool)","ea76a36f":"Mahjongcoin()","ea770a4c":"getNewCoinsIssued(uint256,uint256,uint256)","ea773d9e":"blink()","ea77d01a":"buyWarriorChest(uint256)","ea780bf2":"overloadedMethod(address,uint256,string)","ea782500":"curr_number()","ea7858f5":"player_cancelGame(uint256)","ea7873db":"addCompany()","ea794ef4":"constructWeaponTokenIdForWinner(uint256,uint256)","ea79dd79":"equal(bytes32,bytes32,string)","ea79f33d":"uniquenessIndex()","ea7a0142":"setRemark1(string)","ea7a7184":"testGetBalanceDb()","ea7b5df3":"pecunioTokenBalance()","ea7c2115":"lookupKittyDetails2(uint256)","ea7cabdd":"checkAllOwner(uint256[],address)","ea7ceaf7":"stopRefunds()","ea7f4d27":"right13(uint256)","ea7f537a":"percentOfGoal()","ea7f7a59":"finalizeLottery(uint256)","ea7f9244":"getRank08()","ea801802":"AviaC01n()","ea8037d6":"batchEscrowToTeamContract(address,uint32[])","ea8118ba":"Trustcoin(address)","ea8269f4":"balanceAddress(address,address)","ea82fa2a":"VestingScheduleConfirmed(address,address,uint256,uint256,uint256,uint256)","ea83add4":"DoTrade(address,address,uint256,address,uint256,address)","ea842e65":"deleteTeam(uint256)","ea8466dc":"LBQ(uint256,string,string)","ea84a6cd":"memberShare(uint256)","ea84bfee":"update(address,bool)","ea851885":"buyStake(bool)","ea85b367":"create(address,int256,address,address)","ea85b581":"Deadpool2RottenorFresh()","ea85c7ac":"getOriginalSpinnerPrice(uint256)","ea863e62":"JorgeToken()","ea87003c":"setRenamingCosts(uint256)","ea871246":"LOW_RANGE_RATE()","ea87152b":"register(string,uint256)","ea879634":"getCode()","ea87a0aa":"updateItemsPrices(uint256[],uint256[])","ea88246d":"Transction()","ea885b55":"UNDERWAY_STATUS()","ea89c6bc":"TrackChain()","ea8a0a23":"PlotTerrainUpdate(uint256,uint256,address,uint256,bytes32)","ea8a1af0":"cancel()","ea8a4305":"Zigicoin()","ea8a66c7":"absoluteMinTimeLock()","ea8ab096":"XEV()","ea8acb67":"_transferToContract(address,address,uint256)","ea8af87d":"sumPreICO1()","ea8b03c2":"innerGuess(uint256,uint256,uint256,address)","ea8b3e9f":"setFlag(string,uint256)","ea8b4627":"playerLastScoredGame(address)","ea8b5ca3":"isContractExpired()","ea8b73df":"createEthCommunityTokenAndMint(string,uint8,string,uint8,uint256)","ea8c1516":"isBlockedAccount(address)","ea8d103f":"transferFundToAccount(address)","ea8dc8d0":"buyTicket(uint256,uint8)","ea8e84a1":"RecoveryEvent(string,address)","ea8eb4be":"blockingDuration()","ea8eee87":"updatePrivateExhangeRate(uint256)","ea8ef515":"airdropSameAmount(address[],uint256)","ea8ef6be":"getBranch()","ea8f6691":"mintSpecificCard(address,uint8,uint256)","ea903c78":"setEndStage3(uint256)","ea905308":"LogSaleCapReached(uint256)","ea90ad7e":"FAUT()","ea91ec69":"TokensReleased(uint256,uint256,uint256)","ea91f8c7":"showMyTokenBalance()","ea920b2b":"betSummary()","ea92dd1d":"withdaw(uint256)","ea932954":"withdraw_token(address,uint256)","ea9362de":"maxMintingTime()","ea93a324":"getCreateShareTokenCounter()","ea941538":"TradeExecute(address,address,uint256,address,uint256,address)","ea94c696":"distributeAmount(address[],uint256)","ea94eaa2":"CreateTokenByAtes(address,uint256,string)","ea95e4d8":"BreezeCoinICO()","ea961d78":"decreaseTokensMulti(address[],address,uint256[])","ea963a21":"ReconCongress(uint256,uint256,int256)","ea9707a3":"getCaptainIndexToCount(uint32)","ea9746a2":"FNTCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,address,address)","ea983f7f":"Alfacoin()","ea985057":"BountiesMinted(address,address,uint256,uint256)","ea98847b":"withdraw2()","ea988ebd":"mine1000(uint256)","ea98de9f":"runDividendPayment()","ea98e540":"proxyTransferFromToICAPWithReference(address,bytes32,uint256,string)","ea98fcf9":"tokenForBounty()","ea9960d8":"participate(bytes32[],bytes32[])","ea996c9c":"approvedRewardSources(address)","ea99e689":"withdrawFeeRate()","ea9a3eb5":"AFWToken()","ea9ac537":"emitExchangeFeeUpdated(uint256)","ea9ae72e":"setPosTokens(uint256)","ea9b4be5":"Rearden()","ea9b6025":"burnTimeChange()","ea9c2859":"CurrentGoldPercentIncrease()","ea9c3bb3":"ico2_startdate()","ea9c8e63":"addSmartContracts(address[])","ea9ce8fd":"redeemToken(bytes)","ea9e107a":"acceptRegistrarTransfer(bytes32,address,uint256)","ea9e372f":"withdrawImpl(address,address)","ea9eb855":"setWLMTPrice(uint256)","ea9f0c4c":"Partial20Send()","ea9f4968":"withinLimit(uint256)","ea9fa768":"newWeiController(address,address,uint256,bool)","eaa0e760":"automaticWithdrawLoop(uint256,uint256)","eaa1f9fe":"reqisterListening(address)","eaa26f0f":"withdrawal_delay()","eaa2b2f6":"kill(string)","eaa2f447":"BelottoCoin(address)","eaa37394":"create(bytes,bytes32,bool,bool,bool,bool,bool)","eaa382c2":"isMintingManager(address)","eaa40283":"getNewsContractAddress()","eaa4077a":"SetICOPhase(address,uint256,uint256,uint256,uint256,uint256)","eaa42a15":"_setSnapshotStakeAmount(uint256,address,address,uint256)","eaa47de2":"RickAndMortyShrimper()","eaa59c74":"rejectShipping(uint256,string)","eaa61dc2":"changeLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)","eaa61e91":"BagpackicoToken()","eaa643d5":"StandingOrder(address,address,uint256,uint256,uint256,string)","eaa8e6d8":"LifeFactor_iii()","eaa968cc":"closeBet()","eaa9b9a7":"timestamp_ack()","eaaad8e9":"masterKeys(address)","eaabd05e":"setTokenSwarmHash(address,bytes32)","eaac77a7":"priceTokenWeiPreICO()","eaac77ea":"supply_cap()","eaacc753":"verifyHolder(address,string)","eaae46e5":"clearClaims(uint32)","eaaf2489":"_registerContributors(uint256,address)","eaaf88c1":"setTeleportContractAddress(address)","eaaff394":"getListing(uint64)","eab07d42":"GetDayCount(uint256)","eab15085":"setData_9(string)","eab184b8":"JLCToken()","eab228b9":"PRE_ICO_TIER_LAST()","eab23779":"validateAndGetTransferFee(address,address,address,uint256)","eab27a7c":"getMigrateInReporterValue()","eab2d378":"setPauseMode(bool)","eab4fb18":"THIRD_PARTY_LOCKUP()","eab5cd84":"createHONtokens(address)","eab65fb2":"EmpAgreements(address)","eab88624":"lockMoney(address,uint256,uint256)","eab8d67b":"GetPlayerAt(uint256)","eab9eb2d":"sellGrapes()","eabbcb4b":"startIco(uint256,uint256,uint256,uint256)","eabc8b8e":"canBeBidden(uint256)","eabd11af":"RandomNumGenerated(uint64)","eabd5dd6":"superman()","eabd94ba":"tryUnlock()","eabd9e60":"BlackNWhite()","eabdd572":"withdrawDAI(address,uint256)","eabe09ad":"addr1()","eabf1ce3":"Approved(address,address,uint256,string)","eabf4240":"mintableTokenAddress()","eabffab6":"VestingScheduleRegistered(address,address,uint256,uint256,uint256,uint256)","eac037b2":"tierBudget()","eac046ce":"AFFBToken()","eac116c4":"createKingdom(string,address,address,address,address)","eac12cae":"stage1Tokens()","eac1e58f":"PRICE_BTCS()","eac24932":"setEarlyParicipantWhitelist(address,bool)","eac257dc":"StandardTokenImpl()","eac2f8d9":"MultiOwnable(address)","eac34569":"redeemLottery(uint256)","eac38f75":"_rotateRight(bytes32)","eac3e799":"target1()","eac449d9":"revoke(address,uint256)","eac471a0":"cycleLength()","eac472bf":"p_setDevPercent(uint256,uint256)","eac48278":"mintToFounders()","eac50c47":"setOnSale(uint256,bool,uint256)","eac533e1":"privateSell2Token()","eac5426f":"setOwnTheDayContract(address)","eac58572":"transferDuringIntialOffer(address,uint256)","eac5a89d":"checkWhitelisted(bytes32,bytes)","eac5ab43":"verifyModule(address,bool)","eac60b27":"AddTag(address,string)","eac66cd8":"getNumberContracts()","eac80b2d":"changeVariables(uint256,uint256)","eac8221e":"previousRoundsCount()","eac8f5b8":"getAsset(uint256)","eac9d94c":"averageGen0SalePrice()","eaca7a0f":"setBaseTokens(address,address)","eacb05d8":"Total_ICOSupply()","eacb6c08":"addressToSubscriberCount(address)","eacba6c7":"setFounderUser(address)","eacbc236":"emitTransferToICAP(address,address,bytes32,uint256,string)","eacbe9ca":"removeDeal(bytes16)","eacc25e7":"Team_Wallet()","eacc501a":"setTransferFeeReceiver(address,address)","eacc5b3b":"safeSend(address,uint256,uint256)","eaccb2e8":"transferOperationsFunction(address)","eacccaf0":"setReward(address,uint256)","eacd2141":"ReasignTokens(int256,int256)","eacd2ff3":"addCar(string,address,uint256,uint256,uint256,bool)","eacde2cb":"tokenIdByIndex(uint256)","eace4827":"player_make_bet(uint8)","eaced5b7":"setSoldTokens(uint256)","eacf7d8a":"MAX_EXPIRE_DELAY()","eacfb78a":"getServerName(uint256)","eacfc0ae":"Authorized()","ead0327d":"getNickName(address)","ead04e44":"addressIsSplitter(address)","ead0f75a":"capFinalized()","ead17f58":"bonusWindow3EndTime()","ead1ed5b":"registerPayment(address,uint256,uint256)","ead2a439":"getUniqueAddressByIndex(uint256,address)","ead2bfdc":"getGamePrize(uint256)","ead2fba4":"setApprove(address,address,address,address,uint256)","ead3a1de":"QYQ(uint256,string,string,address)","ead3c2cf":"multiMint(int256,address[],uint256[])","ead490ad":"recoverLeftoversICO()","ead491ac":"getMarketDataByTokenIdx(uint256)","ead4c32c":"dividendCalculation(uint256)","ead4faaf":"Starmid(uint256,string,string,uint8)","ead50da3":"frequency()","ead5d359":"withdraw(address,uint256,bool)","ead710c4":"greet(string)","ead81e86":"addCourse(uint256,uint256,string,string,string)","ead956c1":"_orderTokens(address,uint256,uint256)","eadb2481":"TransfersEnabled()","eadb6e84":"startRitual()","eadb6fa9":"deleteAccountsInBulk(address[])","eadb80b8":"ownerOfChild(address,uint256)","eadc56d2":"betting(uint256)","eadcbf39":"MFTcreator()","eadd2f91":"distributionTwo(address)","eadd94ec":"usdRaised()","eadd9c8d":"CabChain()","eadddb3c":"getRoomCount()","eaddf568":"WhitelistAddressRemoved(address,address)","eaddf7b9":"getNextImageId()","eadf1f39":"lastBlockRewarded()","eadf4672":"checkScope(address,address)","eadf9760":"setUint(bytes32,string,uint256)","eae00565":"getVotesResult()","eae19df4":"tokenReceived()","eae3d479":"createItem(uint256,uint256,uint256,uint256)","eae445ed":"masternodeInfo(uint256)","eae45561":"setWhitelistedBatch(address[])","eae4c19f":"deployedAt()","eae4e5ce":"getPersonalAirdropAmount(address,address)","eae5a62d":"getProposedOwner()","eae6754a":"totalEthDeposited()","eae70d5e":"setprize(address,uint256)","eae7236f":"transferBack(uint256)","eae81c37":"getDeployedGames()","eae8675d":"getCompanyToken(uint256)","eae8a3d6":"setMigrate(address)","eae8cf88":"Zitron()","eae903e3":"CreatePayroll(address)","eae9dbec":"RESERVED_BUSINESS_GROUP()","eaea25ec":"blockSubsidy(uint256)","eaeb83a2":"User_4()","eaec3fc8":"addCantonEmployee(address)","eaec75aa":"finalizeBuyback()","eaecfca7":"changeBackend(address)","eaed2210":"TransactionCancelled(address,uint256,string,address)","eaefea72":"addStringTag(bytes32,bytes32)","eaf03fc5":"withdrawFromFeeBalance()","eaf0ded9":"presale_price_in_wei()","eaf16303":"DYC(uint256,string,string)","eaf18c45":"setTTMTokenAddress(address)","eaf214ea":"changeTxnTax(uint256)","eaf2402d":"_getStartIndex(uint64)","eaf2a5ef":"itemNum()","eaf39a14":"setCustomBonus(uint256)","eaf4170c":"implementsSaleClockAuctionListener()","eaf4181a":"stopPortalGunAndRick()","eaf4438f":"SuperEdge()","eaf44931":"TokenReturned(address,uint256)","eaf49a82":"numAnimalsXType()","eaf4b6df":"allocate3ProjectToken()","eaf5815a":"recoverAddr(bytes32,bytes)","eaf59375":"returnUnsoldSafe()","eaf626c2":"Set(bytes32,address,address,uint256)","eaf6d212":"getCertificateSince()","eaf7e325":"getNumItems()","eaf82213":"getContributionsForAddress(address)","eaf8294b":"fundTransfer(uint256)","eaf86db3":"isSellingState()","eaf8b774":"getAllbetByNum(int8,int8)","eaf97475":"disableAutoReinvest()","eaf98d23":"FEE_PERCENT()","eaf994b2":"mintReputation(uint256,address,address)","eaf9d194":"updateNameAndSymbol(string,string)","eafac339":"ICOendtime()","eafb2b7a":"setMembershipType(address,uint256)","eafb704f":"majorEventFunc(uint256,bytes32,bytes32)","eafc99a7":"frenzyContract()","eafde28c":"unwrapEth()","eafe5eec":"joinGameWithBalance(uint256)","eaff4b37":"FundsWithdrawn(address,uint256)","eaffb3f9":"rebond(uint256)","eaffd429":"getOrganisations()","eb0030b3":"Paydata(address,uint256,bytes,uint256)","eb009642":"mapInvestors(address)","eb00f20e":"utilityAccount()","eb0166d9":"AccountBalance(string,string,uint256,string,string,uint256,uint256)","eb01d83b":"getBidAmount()","eb01f42d":"KOIOSTokenPreSale(address,uint256,uint256,uint256,uint256,address)","eb0207e3":"hPayMultiSig()","eb02c301":"getPosition(uint256)","eb03085b":"set_bonus_received()","eb0331d5":"destroyAccount()","eb03791b":"BastetToken()","eb03db73":"suicideFunds(address)","eb03e351":"purchased_snt(address)","eb03fb71":"winningValue()","eb045789":"ChannelSeries(address)","eb04c36c":"fundingRaised()","eb04df1d":"setRNGCallbackGasConfig(uint256,uint256)","eb053fad":"calc(bytes4,bytes32,uint256,address,bytes24)","eb05920e":"func_2(string)","eb05bfc0":"disableSaleOwner(address)","eb0616e5":"gimmePizza()","eb068fe5":"F0001Token()","eb06980f":"userAtIndex(uint256)","eb06e65e":"allowanceFromProxy(address,address,address)","eb06ec32":"rewardTaskCompletion(uint256,address)","eb08aa3b":"preSaleAddress()","eb08b304":"changeMeatProvider(address)","eb08dbfc":"emitBurned(address,uint256)","eb09ad46":"EthernautsExplore()","eb09b5bc":"FUNCToken(uint256,string,string)","eb0a70c1":"hasVersion(string)","eb0bfa38":"setRegionPrice(uint16,uint256)","eb0c9e5a":"verifySignature(address,uint256,uint8,bytes32,bytes32)","eb0db6ac":"setChemistryAddress(address)","eb0e9240":"checkNumber(uint256)","eb0eea61":"Securities_4()","eb0f2100":"sweep(uint256,address,uint256,uint8[],bytes32[],bytes32[])","eb0f46cc":"revokeAccessMint(address,address)","eb0f4b33":"numOwnershipStatuses()","eb0f5186":"_determineDefence(uint256)","eb0fb0a3":"setTokenToOwner(uint256,address,bool)","eb1098b8":"packLimit()","eb10b4bd":"getSettingDeprecation(uint256)","eb11dd7b":"squirrelReq()","eb121e2f":"update(uint256,uint256[101][])","eb1257c5":"create(int256,int256)","eb12d61e":"addSigner(address)","eb12fd82":"setRates(address[],address,uint256[])","eb12fef5":"nAddressLog()","eb1301a2":"addAddressToUncappedAddresses(address)","eb142e36":"_setUserInfo(address,uint64,uint256,address)","eb14367d":"layEgg(uint64)","eb14b353":"setGenesis(address)","eb14f53e":"batchTransferEther(address[],uint256[])","eb15d21b":"QiToken()","eb1635ed":"getMintingPrice(uint256)","eb18747a":"getGoldStatusCode(address)","eb18ebdf":"product4()","eb18fbe7":"setPreIcoEnd(uint256)","eb195635":"IQT_DECIMALS()","eb1ab91b":"AtomicSwap(address,uint256,bytes32,uint256)","eb1bb9d9":"hybridizationListSize()","eb1cae39":"EvNewPrice(uint256,uint256)","eb1cfa82":"setMaxDrops(uint256)","eb1d380e":"callContractFunctionByAddress(address,string,address,address,uint256,uint256,bool,string,bytes32)","eb1d74c8":"UpdatedBonusAccount(address)","eb1de3e5":"ICDStopTime()","eb1e2cd9":"getPlayerAccountBalance(address)","eb1ea5be":"clearTracks()","eb1ebd93":"BLS_TOTAL_CAP()","eb1edd61":"FEE_ADDRESS()","eb1f9c78":"HasDelegateAuthority()","eb1fa690":"queryVestingRemain(uint256,uint256)","eb1ff845":"changeId(uint256,uint256,uint256)","eb222098":"ProGenTech()","eb229f1e":"totalSupplyFromInventory()","eb230b2d":"bobClaimsDeposit(bytes32,uint256,bytes32,bytes20,address,address)","eb239d9a":"timeAdjustNeg()","eb245d91":"custodianTransfer(address,address)","eb24ffdd":"getCountriesData(uint256[])","eb26df0a":"updateDiscounts(uint256[],uint256[])","eb28615e":"createCommunityToken(string,uint8,string,uint8)","eb28d249":"setMissions(uint256,uint16)","eb28ddcf":"_isTAOSignatureAddressValid(address,address,address,uint256)","eb290e12":"Mimicoin(uint256,string,string)","eb295b27":"getChannelId(address)","eb29d9ea":"transferWithEther(address,uint256)","eb2a783e":"canBuyExistentToken(uint256)","eb2a7c4a":"freeLottery(uint256)","eb2b381a":"toDecimals(uint256)","eb2b6e95":"PUNDI()","eb2bab77":"increasePot()","eb2bdbab":"getBUU(bytes32,uint256)","eb2bef47":"BetterAuction(address,address,address,uint256,uint256)","eb2c0223":"upgradeContract(address)","eb2c118a":"ExtTokenPurchase(address,address,uint256,uint256,uint256)","eb2c6a19":"setInvestorWhitelist(address,bool)","eb2c87a4":"partner2_vows()","eb2cf098":"get_data_item()","eb2f3038":"buyout(address,uint256)","eb2f4817":"requestAccess()","eb2f8696":"_getCurrentSecret()","eb2ff2d2":"softCapPreSale()","eb3087bf":"buyFci(address,uint256)","eb30db7b":"trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,string)","eb30f57d":"maxEthToRaise()","eb31f3d0":"Zoltan()","eb321173":"claimStake()","eb32cf9b":"saleExchangeRate2()","eb338f4e":"raiseMaxNumInterests(uint256)","eb343301":"registerCertWithID(bytes32,bytes,bytes32,uint256,bytes32)","eb34967a":"gameGeneration()","eb34c173":"firstAuctionsStartDate()","eb34fa12":"CurrentTLSNProof(address,string)","eb357e99":"payment_time()","eb35a849":"getSignerby()","eb36622d":"readBytes32(bytes32)","eb36d549":"WINR()","eb36f8e8":"stringToBytes64(string)","eb3721be":"getMarketOrder(uint256)","eb37df4f":"getGiftsByTemplateId(uint256)","eb381429":"mint(int256,uint256,bytes32)","eb38615b":"setLiveTx(address)","eb39bc90":"setPropertyColors(uint16,uint256[5])","eb39f443":"startMintingDate()","eb3a2345":"setFunding(bool)","eb3a733f":"responseOptions(uint256)","eb3a867b":"LogVote(bytes32,bool,address)","eb3a88dc":"lockupTokens(address,uint256)","eb3b0ab3":"setFeeLocked(bool)","eb3b41be":"OrderFulfilled(uint256,uint256)","eb3b6891":"throwsWhenTransferingDuringSale()","eb3beb29":"silo()","eb3c8d7d":"changeMaximumValueWithoutProofOfAddress(uint256)","eb3cd55c":"setEveryBidFee(uint256)","eb3d032d":"FAPFundDeposit4()","eb3de344":"whitelistInvestor(address,string,string)","eb3f1b61":"allocateAngelWheelFinanceToken(address[],uint256[])","eb3f2427":"plainPay()","eb3fa926":"manager_()","eb3fee82":"setCompte_16(string)","eb40a9c8":"setRecommenderAllow()","eb41fbca":"changeTargets(uint256,uint256)","eb42b0cb":"payBeneficiaries()","eb4435a3":"Github()","eb4439fb":"enableVoting()","eb446ad8":"WHITELIST_SUPPLIER()","eb4475a1":"reducerunmoney(address,uint256)","eb44bb04":"frozenPool()","eb44dd5d":"preSale5Finished()","eb44fdd3":"getMarket(uint256)","eb455dc6":"sendBitcoin(string,uint256)","eb464316":"TOKENSALE_BLACKLIST()","eb46a11a":"setInvestorId(address,bytes32)","eb470ebf":"getTimeStamp(address)","eb473fc7":"alreadyAvailedOffer(address,address)","eb49168f":"getIntervals(bytes32,uint256)","eb496a80":"exploitMe(bytes8)","eb4999f4":"ticket1price()","eb4a2935":"getScribes()","eb4b41b2":"disableAmbassadorMode()","eb4b8091":"payWinners(address[20],uint256[20])","eb4be616":"CanBaoToken()","eb4c5593":"FREEZE_END()","eb4c5ab9":"createShapeShiftConversionPost(string,string)","eb4c9ae7":"claimUpdateToken()","eb4d0e32":"redemptionFund()","eb4dd8f2":"confirm(address)","eb4defcb":"returnCoupon(address[2],uint256[7],uint8,bytes32[2])","eb4df824":"getOwnItemCount(address)","eb4e64d6":"amendAgreement(string)","eb4eecec":"altarFund()","eb4f16b5":"addStake(uint256)","eb4f17e7":"saleProceedsEtherAllowStale(uint256)","eb4f54b2":"TokenRUSD(uint256,string,uint8,string)","eb4fe500":"logoVote()","eb502d45":"transferProxy(address,address,uint256,uint256,uint8,bytes32,bytes32)","eb5068f2":"exitWallet()","eb50849e":"setCanAcceptTokens(address,address,bool)","eb508932":"lastPayouts(uint256)","eb51e2e4":"_popularitySetting(uint256,uint8)","eb51e575":"getNextPrizePool()","eb5230d7":"ETHERFUNDME_FEE()","eb52835b":"nextShareTime()","eb52e404":"adminTrade(uint256[8],address[4],uint8[2],bytes32[4])","eb531996":"getConversation(address,address,uint32)","eb53367a":"delABaddress(string)","eb533750":"extLockNinja(uint256,uint16)","eb5392ff":"Leonardo()","eb53a9a3":"getInitializeNumTicksValue()","eb53d273":"getServerNb()","eb55b2a3":"replaySweep(address[],address)","eb56105d":"marketSize()","eb5625d9":"safeApprove(address,address,uint256)","eb5653d7":"tokenIdToApproved(uint256)","eb570b05":"currentSalePriceInWei()","eb57d309":"TenantTerminateMisrep(string)","eb581c8f":"ScudoCoin()","eb58705b":"_performTransferFromToICAPWithReference(address,bytes32,uint256,string,address)","eb5904c0":"setProfitDistributionContract(address)","eb59ec82":"setLastMint(address,uint256)","eb5a458e":"unregisterByList(address[])","eb5a662e":"getAllowance(address)","eb5a7033":"getPrefixedHash(address)","eb5b135b":"tFinalized()","eb5b62b4":"BOPToken(address,uint256)","eb5ba3b4":"polyTokenAddress()","eb5ba56e":"creator_tablets_count(address)","eb5baebf":"MAX_SUPPLY_DECIMAL()","eb5bbef8":"withdrawInternal(uint256,bool)","eb5bdda0":"allocateAdvisorTokens(address,uint256,uint64,uint64)","eb5ce181":"Sample()","eb5dd1e3":"shouldPass()","eb5dd94f":"updateController(bytes32,address)","eb5ea1c0":"RemovePoolCoOwner(string,address)","eb5edde3":"bonusPreICO()","eb5f2cf8":"InsertCard(uint32,uint32,uint8,uint16,uint16,uint16,uint16,uint32[])","eb60082b":"profitsSendable()","eb601c70":"Vogeldubastardtoken()","eb605e9f":"hasPlayerWagered(address)","eb60764f":"getDayCount()","eb60c5d7":"DadsToken()","eb60e2c7":"setCountPlayersInPosition(uint256)","eb614fc7":"locked_allocation()","eb6157f7":"Abloxx()","eb6192a9":"getMTUBal(address)","eb62a013":"Offer(address,address,bytes32,uint256,uint256,uint128,uint256)","eb62df61":"acceptOffer()","eb639fd0":"luckyPot()","eb63e140":"getBuyPriceAfterTax()","eb63eadd":"setValue(uint256,uint256,uint256)","eb6443a3":"getIntelsByProvider(address)","eb64922b":"sendTeamTokens(address)","eb64d3e0":"TokenDrain(address,address,uint256)","eb64d5ce":"getUnitsStealingCapacity(address,uint256,uint256)","eb65a2c7":"crownDecimals()","eb663cf2":"LOOMIA_REMAINDER()","eb665994":"_0xBitcoinToken()","eb6779d4":"test_oneFalseAssert()","eb67cee8":"contractSize(address)","eb680744":"nextCheckpoint()","eb6855e3":"BossToken()","eb685867":"withdrawForFourYear()","eb685c47":"setTokenPrice(uint256,uint256)","eb68ce95":"processRegisterUser(address,address,address)","eb6a145b":"extractPartsFromGene(uint256)","eb6b192f":"ownerByAddress(address)","eb6bbd78":"getUserImages(address)","eb6c4bc8":"monsterIdToGeneration(uint256)","eb6d509e":"Test(uint8)","eb6d9fb5":"constructOwned()","eb6dc7c4":"processBurn(address,uint256)","eb6ecc03":"triggerTokenFallbackIfNeeded(address,address,uint256)","eb6ed29a":"setCanGetMoneyBack(bool)","eb6f80f1":"setPreferredSaleTLYperETH(uint256)","eb700331":"getLockTokenSupply()","eb70095d":"showVault()","eb7085cb":"teamReserveTokens()","eb70bc86":"BountyFulfilled(uint256,address,uint256)","eb70e13e":"_unpackStrengthValue(uint256)","eb70e498":"observer()","eb712a48":"etherTransfer(uint256,address[])","eb71b7e4":"prepayProposal(address)","eb727714":"trustNet()","eb73900b":"Whitelist(address)","eb7402f5":"multiAccessHasConfirmed(bytes32,address)","eb7492d1":"testTotalSupply()","eb74fa0b":"BCAClubCoin(uint256,string,string)","eb7550d8":"manualFinishGame(uint256)","eb75c410":"getOffer(address)","eb75dc03":"TOKEN_PRESALE_CAP()","eb76607d":"creationCap()","eb7698e2":"RaffleBitcoinBook(string,uint256)","eb770d0c":"setEntryFee(uint256)","eb780d3c":"SMILO_FOUNDATION_AMOUNT()","eb782d8c":"ContentSeries(address)","eb78a26d":"blackFundsWallet()","eb78a2af":"checkrespond(uint256,address)","eb794dd7":"addBlack(address)","eb795549":"safeTransfer(address,uint256,bytes)","eb799177":"gasOraclize()","eb79ec7c":"withdrawStocks()","eb7a10b1":"test_36_assertGasUsage2000Boards()","eb7a6471":"getPersonalAirdrop(address,address)","eb7a7241":"last_mint()","eb7b7006":"getRefundInfo(address)","eb7bb9fb":"CrowdsaleHardCapReached(uint256)","eb7bdc37":"withdrawSfowns(address)","eb7c244d":"amount5kUsdInCents()","eb7c6525":"ZbzStandardToken(uint256,string,uint8,string)","eb7c6f72":"step6()","eb7cdb56":"rankDown(uint256,uint256)","eb7db21b":"flip32(bytes32)","eb7ea41b":"showLastGlobalAuditTime()","eb7f3905":"tradeWithTips(uint256[10],address[4],uint256[10],bytes32[4])","eb7f4c0d":"CrowdsalePorto(address,address)","eb7fabd7":"getMax(uint64[])","eb800846":"setLLV_edit_18(string)","eb807339":"getRiskId(uint256)","eb80b3d1":"raceDistCon()","eb810864":"addTokensMulti(address[],address,uint256[])","eb8136f3":"stockTokens()","eb81e95a":"controllerBurn(address,bytes32,uint256)","eb8222eb":"spendMoney()","eb823572":"ProfitContainerAdapter(address,address,address)","eb8266b5":"addNumberToDynamicBytes(uint256)","eb829aef":"MPTToken(address,address,uint256,string,uint8,string)","eb83e2b5":"receiveApproval(address,uint32,address,bytes)","eb83f015":"castleContract()","eb845c17":"gen0AuctionDuration()","eb854131":"mbtcToUsd(uint256)","eb8571c8":"trans(address,address,uint256)","eb85c61e":"GUIDEToken()","eb85d999":"IVE()","eb869b8b":"Scheduled(uint256,uint256)","eb87073a":"verifyImages(bytes32,uint256,uint8,uint256,bool)","eb87ec01":"newStatus(address)","eb880380":"checkCooSeed(uint32)","eb886568":"signatureCheckerFreezed()","eb88d688":"createCommitment(uint256)","eb88e84d":"LatiumSeller()","eb89022e":"endDate1()","eb8ac921":"test(uint256,uint256)","eb8b12d4":"PLATFORM_WALLET()","eb8ba66c":"insertStage(uint8,uint256,uint256)","eb8bbd28":"getTotalFunds()","eb8cad45":"doMarriage()","eb8cb983":"LogPauseICO()","eb8d2444":"saleIsActive()","eb8d3321":"start_PRIVATESALE()","eb8e1660":"getPlayerOption()","eb8eea15":"totalMainSaleTokenIssued()","eb8fa486":"contributionInCauldron(uint8,address)","eb8fb32c":"setPercentageToKill(uint8)","eb8fb3ec":"getConstraint(bytes32,address,address)","eb90450f":"getFirstBuyerAddress(uint256)","eb907398":"changeSoftCap(uint256,uint256)","eb90fff8":"blockContract()","eb91385a":"UnauthorizedAccess(address,bytes4)","eb91b5ac":"ALUXToken(uint256,string,string)","eb91d37e":"getCurrentPrice()","eb9220ab":"updateRent(uint256)","eb9253c0":"seize(address,uint256)","eb931024":"passKYC(address)","eb935e70":"bigbrother()","eb93c515":"burnUpdateToken(uint256)","eb944e4c":"revokeTokenGrant(address,uint256)","eb947f19":"ExampleResourcePool()","eb94eecb":"isContributionAllowed()","eb95264c":"consolationRewardsPercent()","eb95b7d5":"Bounty(address,address)","eb95d4e6":"purchaseTokens(uint256,address,address)","eb95f0bf":"getCurRoundId()","eb965c5e":"Orientation(bytes32[])","eb967a2a":"refundsClaimed()","eb968ac7":"change(address,int256)","eb96ada7":"gameUnpause()","eb975390":"lockedTokenTransfer(address[],uint256[])","eb9763ed":"transferby(address,address,uint256)","eb981fea":"withdrawFromToken(uint256)","eb987ca7":"placeBet(address,uint256,string)","eb98c8d6":"getGoldsSinceLastCollect(address)","eb990c59":"initialize(address,address,uint256,uint256)","eb9969a8":"getAllBalance()","eb9a5211":"DonationMatched(address,address,uint256)","eb9aec0a":"oraclizeIds(uint32)","eb9af834":"removePolicy(uint8,uint256)","eb9bc6ff":"partyCount(address)","eb9c9708":"SisterToken(uint256,string,string)","eb9df7db":"updateContractOwner(address)","eb9e0398":"mint(int256,uint256,address)","eba0184f":"issuable()","eba052e7":"RefreshChipUnableList(uint8)","eba068ce":"addBountyForHunter(address,uint256)","eba2a91b":"superMintBulk(address[],uint256[])","eba36dbd":"setAddr(uint256,address)","eba37aff":"nrMeasurements()","eba37dbd":"getAllReportersDisputeBondToken()","eba38402":"finishEvent(address,uint256)","eba3cdfe":"bundle(address,uint256)","eba4ae3b":"NewDungeonFloor(uint256,uint256,uint32,uint128,uint256)","eba56302":"tier1Total()","eba60632":"drawNow()","eba66dc9":"JOTUNSupply()","eba6a307":"getQuotePrice()","eba74c0b":"updateCodeWeight(string,uint256)","eba898a0":"_authenticate(string,uint256)","eba9a4a8":"DiamondBond()","ebaa32f3":"submission_stage_block_size()","ebaa4470":"getOwnerAuctions(address)","ebaac771":"write(string)","ebab43e4":"isPreSaleTime()","ebabfb0b":"volumeType6()","ebad6612":"m_ETHPriceInCents()","ebaddea7":"unlockAccounts(address[])","ebadfd3d":"checkGivenAway()","ebae35a6":"DAOTokenCreationProxyTransferer(address,address)","ebae46be":"finishFunding()","ebae743b":"addCET6To(address,uint32,uint32)","ebae7bf1":"addHpbNode(address,bytes32,bytes32,bytes32)","ebaf0e74":"dInit(address,bool)","ebaf7f2f":"returnReward(uint256)","ebafefb1":"makeInitAccount()","ebb045fa":"PublicResolver(address)","ebb05f9c":"setItemApproveForAll(uint256,bool)","ebb0a856":"leastSwap()","ebb0e631":"dtGetCityData(address)","ebb11c93":"_build(address,uint256,bytes)","ebb1b7ed":"apiAuthorized()","ebb1dc21":"ERC20ByteCode()","ebb240ef":"ExampleUpgradeable23Token(address,uint256,bytes32,bytes32,uint256)","ebb31418":"disableTicker()","ebb32c65":"FooAbi(address)","ebb332be":"getFunStr()","ebb3fd8d":"kingdomName()","ebb44389":"bulkMintVested(uint256,address[],uint256[])","ebb4ac3c":"ForwarderFactory(address,bytes32,address)","ebb4f484":"ROLE_SUPERUSER()","ebb5a996":"setUsdLockAccountThreshold(uint256)","ebb5f11c":"explore(uint256,address,bool)","ebb689a1":"clearAll()","ebb6b338":"certifiedPartner()","ebb6c59f":"right72(uint256)","ebb6dc3a":"returnEther()","ebb71194":"withdrawFees(bytes32)","ebb741cb":"getChannelSize(uint256)","ebb75afc":"debugLog(string,uint256)","ebb85502":"GAME_START_TIME()","ebb88b97":"getABaddressByName(string)","ebb8c22c":"Win(address,uint256,uint256,uint256,uint256)","ebb940e6":"BuyBackContract()","ebb9ab25":"moveState(uint256,uint256)","ebb9b466":"phase_5_Time()","ebb9ba80":"calculateRewardForLevel(uint8,uint256)","ebba1400":"setIntegerValue(uint256)","ebba5184":"WuZeFoundation()","ebbaa1fc":"AdvancedToken()","ebbb76c8":"LongTermProjectTokens()","ebbbe00b":"testNopUnroll16(int256,int256,uint256)","ebbc4965":"acceptOwner()","ebbc9543":"_getPersonalAirdropUnlockTimestamp(address,address)","ebbe05d0":"setMinWeiAmount(uint256)","ebbf2f6a":"PixelColor(uint16,uint16,address,uint24)","ebbfb637":"Registered(bytes32,uint256,address)","ebbfb994":"startTokenSale(uint256,uint256)","ebbfcfef":"tomoDepositAddress()","ebc04649":"ChangeDatabase(address)","ebc16c5c":"getDrugsSinceLastCollect(address)","ebc1b4f1":"ForexCoin()","ebc20426":"minCapWei()","ebc26c95":"ToniToken()","ebc33c51":"minContrib()","ebc46fdb":"detachControllerForever()","ebc56c33":"_hardRequire(bool,bytes32)","ebc56eec":"set_allow_refunds(bool)","ebc58f62":"MSXAdvanced()","ebc59f32":"configPerShares()","ebc66bac":"Payreum()","ebc697d1":"testControlRestartNotOwner()","ebc6a661":"endICOStage2()","ebc6e332":"AuctionCreated(address,uint256,uint256,uint256,uint256,address)","ebc73e65":"setWaitingTime(uint256)","ebc824a2":"killItWithFire()","ebc8b934":"add_player(bytes32)","ebc97c36":"advisorsPeriodsNumber()","ebc98117":"getUserId(uint256)","ebcbee16":"totalRaisedInWei()","ebcc0de1":"closingPrices(address,address,uint256)","ebcc8eb6":"ETHCONEarlyBirdDonation(address)","ebcc9a31":"ICOweek2End()","ebccb566":"Halo3DPotPotato(address)","ebcd8d8a":"setStarInitialPrice(uint256)","ebce79ff":"enableBlacklist(address[])","ebcfd89e":"AGCoin()","ebcfd922":"playerEther()","ebd03c55":"changePlatPrice(uint32,uint256)","ebd057fa":"owner_withdrawal(uint256)","ebd062de":"removeOwnerAddress(address)","ebd0f599":"asktoken()","ebd3d58a":"InitPeculiumAdress(address)","ebd46d64":"encodeTokenId(uint256,uint256)","ebd4d009":"TotalFloatingInt()","ebd56581":"bitservice()","ebd58975":"sub2(uint256,uint256)","ebd66a9c":"MAX_ALLOWED_PRE_SALE()","ebd7cda4":"cTime()","ebd83378":"get_blocks_for(uint256)","ebd863ac":"DccbtcToken()","ebd8d7a0":"getRefReservedTokens()","ebd8fde3":"calculatePriceIncrease(uint256)","ebd9954c":"tgrStageBlockLeft()","ebda6686":"referrerLevel3Percent()","ebdac090":"depositFees(uint256)","ebdb6063":"lastIssuance()","ebdb730d":"weiPerFee()","ebdbc7d6":"CurrentTokenOwner()","ebdbd65e":"update_private_room(bytes32)","ebdcc8ac":"testrc(bytes32,uint8,bytes32,bytes32)","ebdd3f77":"triggerRecoveryAddressChange(uint256,address,bool)","ebde0bce":"MultiUser()","ebde609b":"LykkeTokenErc223Base(address,string,uint8,string,string,uint256)","ebdf0d5d":"endianConvert32bit(uint256)","ebdf86ca":"add(string,string)","ebdfa455":"joinedCrowdsalesLen()","ebdfd722":"whitelistEndTime()","ebdfe5ad":"picops_is_verified(bool)","ebe010b8":"_setStakeHolder(address)","ebe02377":"submissionPool()","ebe09a93":"getGoldTransaction(string,uint256)","ebe14170":"EdgelessToken()","ebe1df4f":"LLV_v31_4()","ebe22b12":"unsale()","ebe24dfd":"deployCtorContract()","ebe25056":"isWarlordChest(uint256)","ebe29383":"initializeSomeAddress(address,address,address)","ebe347d1":"lastTimeWithdrawal()","ebe36cb0":"read_price_floor()","ebe41b73":"deposit(uint8)","ebe4c0d1":"dividendsSumForUser(address)","ebe4c597":"VestingRevoked(address,uint256,uint256)","ebe599aa":"updateAppExec(bytes32,address)","ebe5a4b2":"toB32(bytes,address)","ebe64f97":"draw_random_card(uint8,uint8[])","ebe65f60":"withdrawOffer(uint256,uint256,bytes32)","ebe6ba07":"deprecateInterface()","ebe6f3cc":"setDappTokenContractAddr(address)","ebe749d3":"tokenLockTime()","ebe74b21":"PRE_SALE_30_ETH()","ebe771da":"setPercent5(address,uint256)","ebe7e852":"calculateResult(uint256,uint256,uint256)","ebe87ca4":"between(address)","ebe89597":"validate(uint256,bytes32,address,bytes32,bytes32)","ebe955fe":"simFrequency(bytes)","ebea3815":"setDays(uint256)","ebea3d30":"setFixedRate()","ebeac0c8":"marketCapBlue()","ebeac2b5":"reactivate(address)","ebead05f":"getOrderSharesEscrowed(bytes32)","ebeb0838":"delFromWhiteList(address)","ebeb0f48":"lockTotalSupply()","ebeb1b5e":"transferTokenToMultisig(address,address)","ebeb76bb":"assignMeta(string,uint256)","ebec7352":"numVideos()","ebed561b":"engineRunning()","ebed7a95":"mineral2Shares(uint256)","ebedef1a":"approvalFallback(address,uint256,bytes)","ebef28aa":"BID_DELAY_TIME()","ebf04917":"tranches()","ebf056e3":"revoke(bytes32,address,bool)","ebf06bcb":"spawnSite(uint256,uint256,address)","ebf0c717":"root()","ebf0da65":"erc223()","ebf0e5f1":"SimplePriceFeed(address,address,address)","ebf1356e":"minMineSize()","ebf1a495":"sendEthTweet(uint256,bool,string,bool,string,uint256)","ebf31253":"getMoneyness()","ebf469dc":"issue(address,uint256,string)","ebf5128c":"mintUnICOLeftToken(address,address,address)","ebf522b8":"_newJockey(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","ebf53e0e":"countAllCliDrm()","ebf5cdfd":"jackpotGuard(uint256)","ebf652cc":"lockInTime1()","ebf6e91d":"hit(uint256)","ebf70010":"ChangeWhiteList(address,bool)","ebf701e0":"getAccountBalance(bytes32)","ebf76522":"selfDestroy(address,address)","ebf81d30":"_Withdrawal(bytes32,uint256,uint256)","ebf88de4":"removeHeir()","ebf89fa9":"withdrawPonzi(uint256)","ebf95043":"balanceOfMorty(address)","ebfa3c1b":"maxRandomRound()","ebfaacce":"uncappedBuyerList(address)","ebfb3630":"vernamCrowdsaleToken()","ebfd288a":"getVerifiedReceipt(bytes,bytes,bytes)","ebfda085":"LOOT()","ebfdc657":"foundersAddress()","ebfe0f39":"makeCoin(uint256)","ebfed9f2":"motionVoting(uint256)","ebff2602":"Withdraw(address,address,uint256,uint256,uint256)","ebff410d":"bonusAccountBalances(address)","ebffd7e3":"getStage1Cap()","ec000bb5":"getPrizes()","ec003704":"getVestingStart(address,address)","ec005255":"boolToInt(bool,bool)","ec00d2a4":"frozenRecordsCount()","ec017820":"TransferToBTCoE(address,uint256)","ec01f75f":"initOperated(address)","ec0274ed":"CreateBatch(uint256,string)","ec0317ff":"AidCoin()","ec034bed":"donationAddress()","ec035393":"_getAllRevisionBlockNumbers(bytes20)","ec035aac":"bonusOver3ETH()","ec0373c6":"adminGetPlayerCount()","ec041a24":"getOrModifyBlocked(address)","ec0484ef":"roiEscrow(bytes32)","ec049219":"AtmanToken()","ec0493f7":"_populateTokenData(uint256,bytes16,uint256,uint32)","ec062ac0":"getMaxProfit()","ec066a4c":"ALLYToken()","ec0904f7":"releaseFor(address)","ec096f8d":"addTransaction(address,uint256,bytes)","ec0a0b50":"TOKENS_SUPPLY()","ec0a12d3":"JKToken()","ec0b3d21":"testThrowsIfPlaceholderIsBad()","ec0b3de4":"deletePetition(uint256)","ec0b4153":"getMoneyness(int256,uint256,uint256)","ec0b4207":"initCountTokens()","ec0b529f":"lockMinSiteTipPercentage()","ec0ba006":"countEgg(uint64)","ec0be13d":"Location()","ec0c6a72":"issue(bytes32,int256,string,bytes,uint256)","ec0cfd0b":"getProperties()","ec0d69e3":"train(uint256,bool,uint8)","ec0da0cd":"registerOptionPair(address,uint256,address,uint256,uint256)","ec0da330":"testSafeSub(uint256,uint256)","ec0de26e":"foundationTimelock()","ec0ea816":"breed(uint256,bool,uint256,bool,string,string)","ec0f1025":"testBitsOrSuccess()","ec0f60d9":"ICOcontributors()","ec1024d1":"censoredChatMessages(uint256)","ec10286d":"PointlessCoin(uint256,string,uint8,string,address)","ec109249":"RefundableAllocatedCappedCrowdsale(uint256,address,address,uint256,uint256,uint256,uint256,address,address,address,address,uint256)","ec112460":"_updateDistribution()","ec1182c2":"freezePrice()","ec11d0cf":"DeltaBalances()","ec12f1ef":"increaseMaxAvailableTokens(uint256,string,uint256)","ec132ce3":"unconfirm(uint256)","ec13cc7b":"freeze(bytes32)","ec13df6b":"setExecutiveOfficer(address)","ec140a1f":"BTSJToken()","ec149de9":"Ethereumwhocoin()","ec14f974":"MAX_CARS()","ec1553d1":"mintCoin(address,uint256)","ec15afe1":"filmpaid()","ec15c6ba":"substring(string,uint256,uint256,uint256,uint256)","ec164625":"_clearTotalBonusTokensByAddress(address)","ec176dee":"weiToTokenFactor()","ec17a7a3":"addressSCICO()","ec17b20e":"setStartingBlock(uint256)","ec1847b6":"getWorkerIndex(address)","ec1893b4":"getProps()","ec18ca9c":"lastPresser()","ec1938a8":"AddNewSegment(address,address,uint256,uint256,uint256,string)","ec1ad474":"removeFromWallet(address,uint256)","ec1b375a":"spardosenName()","ec1d9bf4":"isGoldRegistry(address)","ec1e4861":"assignWinnings(uint256)","ec1e6a4f":"tearDown()","ec1e74a7":"commitThreshold()","ec204f87":"_getTokenAmount(uint256,uint8)","ec20b457":"addInvestor(address,uint256)","ec20fc35":"populationIncrease()","ec216c34":"checkOwnerIndex(uint256)","ec21a913":"setUint256(int256,uint256)","ec22f94f":"getRedeemableReputationVoter(bytes32,address)","ec23ba66":"Kapitalexote()","ec24aa01":"startPrivateSaleStage()","ec25adf4":"addtokens()","ec271be2":"charityWalletAddress()","ec277ce7":"Resilience()","ec27bdd3":"challengingInput()","ec27f6d8":"LegacyRepContract()","ec280bf6":"moreMinFunds(uint256)","ec28118e":"nextDiscountTTMTokenId1()","ec2929fb":"divbonus()","ec29781e":"deliveryId()","ec29ff7c":"getMaxiumInputEther()","ec2a4062":"setOpenBlock(uint256)","ec2ac54e":"deposit(address,uint256,bytes32,uint256)","ec2af44d":"test_oneValidEqBool()","ec2b189c":"GetURL(address,uint256)","ec2b50bf":"setUserLibrary(address)","ec2bb963":"openPrize()","ec2bcd22":"addressCanContribute(address)","ec2c28b4":"checkBuy(uint256)","ec2c8fec":"getEggsOff(address)","ec2c9016":"getMarkets()","ec2cdb87":"initialSaleComplete()","ec2ec781":"testFailGetUnsetToken()","ec2efe40":"MinPayment()","ec2f39b4":"isICOStarted()","ec2f81ac":"createGroup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","ec300fcc":"MediChainToken(uint256)","ec309038":"canStart()","ec30ad95":"EthsqrCore()","ec30c4e3":"getPointsToSpend()","ec3178f9":"getMemesByOwner(address)","ec322a88":"tokenlenth()","ec32d68f":"xrateProviders(uint256)","ec32e4e8":"admin_inactive_withdrawable()","ec332488":"openForPublicTrade()","ec342ad0":"BASE()","ec343a97":"Rate4()","ec35576e":"GetProfitFunds()","ec3575ec":"soccer()","ec357c64":"getIsCoinReg(string)","ec36196e":"toSpread()","ec3743f1":"setTeamFund()","ec38027e":"MadToken()","ec384a3e":"tokenToExchangeTransferInput(uint256,uint256,uint256,uint256,address,address)","ec38e855":"mintOperations(uint256)","ec3a0489":"PAYToken()","ec3a6d64":"getGoodDecision(bytes32)","ec3a6f73":"numRegistrants()","ec3adf65":"editUser(bytes32,bytes32,bytes32,bytes10,bytes32,bytes32,bytes32)","ec3af4a9":"getProjectKudos(address)","ec3bb11a":"maximumRaised()","ec3c155e":"ERC20TokenMock(uint256,string,uint8,string)","ec3d21e1":"kycPass(address)","ec3d45e8":"setMinParticipants(uint256)","ec3d5ffb":"stillAllowedReadable()","ec3f3636":"firstStage()","ec3f5d62":"withdrawRestOfBalance()","ec3fdf1d":"getExpiredAddressIndexes(address)","ec40c43d":"SmartPool(uint256,uint256,uint256)","ec40db16":"HedgeContract1(uint256,address,address)","ec412e00":"targetDiscountValue2()","ec42f82f":"finishIco()","ec439d67":"countAllUsers()","ec43eeb6":"getAddressOfId(uint256)","ec443813":"BytesToAddress(bytes)","ec449e67":"currentPriceInfoOf(uint256,uint256)","ec44acf2":"trading()","ec46009d":"EstateX()","ec4673d1":"approveWithdraw(uint256)","ec46bf8f":"emergency_withdraw(uint256)","ec47297e":"_CallCancelled(bytes32)","ec4754c6":"endetoken()","ec47a795":"getLockedStages(address)","ec47e7ed":"EtherWithdraw(uint256,address)","ec480557":"readTotalNumberOfPurchases()","ec486c23":"NewBToken()","ec4a79cf":"unlockaddress(address)","ec4aca2a":"bancorTradingContract()","ec4b48ad":"testCanDeposit(address)","ec4baa83":"StaticEthAvailable()","ec4bfdd4":"calculateOptionsComponents(uint256[9],uint32,uint32,bool)","ec4c76bb":"setInitialBuyoutPrice(uint256,uint256)","ec4cd0cf":"isSuccessful()","ec4d88d7":"usernames(bytes32)","ec4e530d":"_decodePriceData(bytes)","ec4eb442":"author(uint256)","ec4fb7a0":"totalTokensPresale()","ec4fd09d":"getEtherDog(uint256)","ec503611":"profitsSent()","ec505f58":"INDOCASH()","ec5134ca":"processStep()","ec51431f":"Unvault(uint256,uint256)","ec530de6":"countAddresses()","ec5325c1":"getDarknodes(address,uint256)","ec53589d":"FhnwCoin()","ec54a36a":"updateTimer(uint256)","ec54fa5e":"listCOFI()","ec556889":"proxy()","ec559176":"setEthBalance(address,uint256)","ec560828":"monarchyEndReward()","ec56a373":"contracts(bytes32)","ec56c6b0":"contracteventcount()","ec56eb93":"getComponentCount(uint256)","ec57e25b":"Magzia()","ec582a00":"IkuraStorage()","ec58b996":"encodeMessage(uint256,uint256,uint16[])","ec58f4b8":"addSolver(address)","ec591b20":"cancelSellCard(uint8)","ec59565f":"BinaryOptionV2(address,address,address)","ec597128":"addition()","ec5975c6":"getTokensReserve()","ec5a25e0":"WalletLibrary()","ec5aceab":"createOrder(address,address[3],uint256[5],int256)","ec5c71b3":"getChildIds(address,uint256,uint256)","ec5c9036":"Crowdsale(address,uint256,uint256)","ec5d9cc8":"balanceAvailableTokens(address)","ec5d9e58":"organisationName()","ec5dfaa2":"initHolders(address[],uint96[])","ec5dfb84":"bbBalance()","ec5ffac2":"minimumStake()","ec607f7d":"nextPeriod()","ec60bcf3":"burnFrom(address,address,uint256)","ec61c430":"YudiToken(uint256,string,string)","ec620eb3":"setClaimBlocks(uint256,uint256)","ec622892":"disableInvestment(address[])","ec62558d":"adminBurnToken(uint256)","ec62b216":"PRE_ICO_BONUS_PERCENTAGE()","ec647d42":"JESToken()","ec64f52f":"brag()","ec6507d7":"debug_transfer(address,address,uint256)","ec651551":"PVP(uint256,uint256,uint256)","ec653833":"totalAuctionItems()","ec654389":"tokenBountyAllocated()","ec654e38":"accident()","ec65b7a0":"FINALIZE(bytes32)","ec664694":"GooToken(uint256)","ec672cf6":"setAddressArray(bytes32,address[])","ec67abe4":"MOMCoin()","ec67e37a":"assignRevenueContract()","ec68197b":"setGameAddrt(address,bool)","ec688e8f":"walletNotLocked(address)","ec68a73d":"totalSpecies()","ec698a28":"__transferFromWithReference(address,address,uint256,string,address)","ec6a4487":"setMoneyWallet(address,address)","ec6acb33":"reputationClear(address,string)","ec6afc22":"oraclize_query(uint256,string,string[3])","ec6b16ca":"pMinInFp()","ec6b1d1e":"findAddress(bytes32)","ec6b393d":"subWeiRaised(uint256)","ec6be06e":"setBeneficiaryAddress(address)","ec6c18fc":"TOKEN_DECIMALS_MULTIPLIER()","ec6c32cd":"amendArticleItem(uint256,uint256,bytes)","ec6e43ae":"PRICE_CHANGE_ENDING_TIME()","ec6e5d09":"SellerHistory(address,address,uint256,uint256)","ec6e7bbf":"getTargetSite(address,uint256,uint256,uint256)","ec6eb411":"adjustBalance(address)","ec6f3a8c":"originalTokenHolder()","ec6f509e":"IcoStartTime()","ec6f772d":"addVirus(address,uint256)","ec704095":"getMyCrocs()","ec714926":"setTargetDiscountValue8(uint256)","ec715a31":"releaseToken()","ec7219a1":"growthReserveTokenSend(address,uint256)","ec727000":"getApprovalDB()","ec736b67":"validPerc(uint256)","ec737576":"finalizeMintUtility(address,uint256)","ec7380d9":"transferManually(uint256,address,address)","ec747b09":"getPaymentById(uint256,uint256)","ec74b818":"rbInformationStore()","ec756ee5":"getOrCacheValidityBondWallCalled()","ec759b80":"getOwners(uint8)","ec76312a":"sendInvestorIndex()","ec76bd65":"volumeType5()","ec77537b":"finalizeDispute()","ec77809f":"removeAssetPartOwner(bytes32,address)","ec77a89f":"GoldTokenLedger()","ec78626f":"setPOOL_edit_11(string)","ec788712":"toAddress(bytes,uint8)","ec789ef3":"sellpr0coinsAgainstEther(uint256)","ec796908":"tokensArray(uint256)","ec79efa8":"candidateETHAssets()","ec79f9bd":"setDisputeThresholdForFork(uint256)","ec7a3ab6":"calcBurnFee(uint256)","ec7b2843":"kvcMul(uint256,uint256)","ec7b8c40":"deleteFrozenAddresses(address)","ec7b9655":"spiritual_guidance()","ec7bb2ac":"setGen0Limit()","ec7bbcd2":"TradeAdsCoin()","ec7bf78d":"SetWorldSnapshot(uint256,bool,uint256,uint256,uint256)","ec7c06be":"doMigrate()","ec7c2ef7":"withdraw_excess_tokens()","ec7c637d":"getBalanceLimit(address)","ec7dd7bb":"getOrderDetails(uint256)","ec7de1e9":"masterOfCeremonyPending()","ec7df86e":"hasSDCC(address,address,uint256)","ec7dfb4d":"weiGoal()","ec7ecec5":"getPlayerState(uint256)","ec7f2ae7":"LogTransactionComplete(bytes32,address,uint256,bytes)","ec7f9906":"changeFreeAnimalsLimit(uint256)","ec7fea7b":"BiXuTo()","ec7fec8b":"defineWinner()","ec7ff617":"getMatchIdx()","ec801286":"BITHELPTOKEN()","ec810684":"registrationVote(address,uint256)","ec8120c9":"totalItemsForSale()","ec814f4e":"doDevelopFunds(uint256)","ec81aadb":"deployedTokens(uint256)","ec81b483":"CAP()","ec81e22e":"returnmoneycreator(uint8,uint256)","ec824ca9":"hashNumber(uint8)","ec82bf91":"_pay_token_commission(uint256)","ec82cf4e":"setDepositPpm(uint32)","ec841fe0":"LogTokensPerEthUpdated(uint256)","ec845dd8":"totalSubscription()","ec847fe8":"divholder()","ec854a04":"DogToken()","ec85d2f2":"regulatorStatus()","ec85d464":"returnAmountRaisedSoFar(uint256)","ec866d28":"isApproveOnly()","ec867b27":"isTokenVerified(address)","ec86e1d7":"getReleaseType(address)","ec86fdbd":"getOrCacheMarketCreationCost()","ec87543b":"lockedCZRMap(address,uint256)","ec875f98":"addCourses(string,address[])","ec881472":"Validator(string)","ec8861e7":"switchDelegate(bool)","ec88abc8":"SOVv11Token()","ec8909c0":"setShort(address)","ec89c8f0":"MicheleToken(uint256,string,string)","ec8a2c88":"investments()","ec8ac4d8":"buyTokens(address)","ec8b283c":"give(address,address,uint256)","ec8b8f4e":"addMinerTokens(uint64,address[],uint64[])","ec8be5b9":"canClaim(bytes32,uint256,address,bytes)","ec8cae23":"changeHolderCount(uint256)","ec8cb281":"openDate()","ec8d82f8":"oraclize_query(string,bytes[],uint256)","ec8e1afa":"interfaceInstanceCount()","ec8edf7a":"changeWalletAddress(address)","ec8f3fa5":"getWithdrawalAddress()","ec8f4d04":"onApprove(address,address,uint256,uint256)","ec8f850b":"withdrew()","ec8fb8ef":"withdrawOldTokens(address,uint256)","ec8fe065":"buyItem(address,uint8,uint256)","ec901017":"mintTokensWithTimeBasedVesting(address,uint256,uint256,uint256,uint256)","ec902779":"scribes(address)","ec9029a3":"minerToken(address,uint256)","ec90a79a":"recv_from_side_chain(uint256,bytes)","ec912d61":"markCredit(address,uint256)","ec91b550":"miningThree()","ec92b98d":"bancorErc20Eth()","ec933789":"ParticipantAgent(string,address)","ec93a081":"HelperSearchToken()","ec93b3f8":"GetCardType(uint8,uint8,uint8)","ec93cfae":"FountainOfWealth()","ec941ef8":"BXZToken()","ec94ce4b":"enabledMintTokens(bool)","ec9723ad":"setSalePeriod(uint256,uint256,uint256)","ec972a07":"lastBlock_f15()","ec972fb0":"timeOfLastDistribution()","ec973642":"enable(address,bool)","ec979082":"marketCount()","ec97cff7":"addCertificationDocument(address,bytes32)","ec985c99":"minfinney()","ec98618e":"getDial1Type(uint8)","ec98eefc":"createTokenContract(address,uint256)","ec993f3d":"changeDiscount(uint8)","ec9974eb":"getTotalWEIEther()","ec99bfe9":"setPreSaleParams(uint256,uint256,uint256,uint256)","ec99c60c":"getMatchFromList(uint256)","ec9a6e87":"setDefaultPartitions(bytes32[])","ec9b5cb2":"publicSaleEnd()","ec9be5fe":"setPotatoOwner(address)","ec9c677d":"checkDeck(uint256,uint8[],bytes32)","ec9d35aa":"transferWithCommission(address,uint256)","ec9d7fd2":"getAccumulatedServiceFee()","ec9da59e":"setMainContractAddress(address)","ec9e7971":"kycAdmin()","ec9edfc2":"addSmallInvestor(address,uint256,uint256)","eca001dd":"checkWhitelisted(address,uint256,uint256,uint8,bytes32,bytes32)","eca0290b":"rawSetAttribute(bytes32,bytes32,bytes)","eca058cc":"tokensForWei(uint256)","eca0be47":"TEAM_GROUP_WALLET()","eca10286":"loseNum()","eca1ada7":"getPlayersCount(uint256)","eca25f42":"TARGET_ADDRESS()","eca28cb7":"AleaPrivateSale(uint256,uint256,uint256,address,uint256,address)","eca2e604":"makeWorkStage(uint256,uint256)","eca38e0c":"ethSent()","eca3ee2c":"currentFundingAmount()","eca4742a":"getApprovedAddress(uint256)","eca49641":"TurnBasedGame(bool)","eca5339d":"mintExtraTokens(uint256)","eca5c793":"testErrorUnauthorizedNameRegister()","eca6e42d":"set_minimum_trade(uint256)","eca73f64":"currentBonus()","eca85419":"_getAllChildIds(bytes32)","eca90ffc":"LogGetEther(address,uint256,string)","eca95377":"generateRandom(string,uint256,uint256)","ecaa0e45":"OXGOLDSupply()","ecaaf6c8":"newIdTankHull()","ecab1a06":"_getExpProportion(int256)","ecabaf24":"NewHighestBid(uint256,address)","ecac7f4b":"symbolsCount()","ecacb3e0":"BitcoinSinhalaToken()","ecad17c1":"HurtleCoin()","ecad78a2":"paydCouponsETH(address)","ecaeacf6":"RESERVED_TOKENS_FOR_CYNOTRUST()","ecaeb904":"getDeltaMonth(uint256,uint256)","ecaf76b8":"minReferAmount()","ecb0116a":"getExitFee()","ecb0256b":"relayTx(bytes,int256,int256[],int256,int256,bytes,int256,int256[],int256,int256)","ecb071cf":"mainSaleStartdate()","ecb0b862":"payContract()","ecb14519":"payToken(address,address)","ecb15644":"GasFiles()","ecb1b31c":"TRONIC1()","ecb20de7":"takeBuyTokenOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)","ecb389e0":"mmVaultAddr()","ecb39cba":"developer_edit_stake_reward_rate(string)","ecb3dc88":"depositCounter()","ecb4136e":"NotAnotherPonzi()","ecb42795":"MANA()","ecb42914":"STAGE_1_MAXCAP()","ecb46858":"buyGolds()","ecb58c74":"ownerAllocate(address,uint256)","ecb5fff6":"DELTA()","ecb62e49":"defaultParameters(uint256)","ecb63011":"receiveApproval(address,uint256,address,uint8)","ecb6af21":"accountB()","ecb6b50c":"RAVI_ADDRESS()","ecb6c47a":"allStop()","ecb70a98":"tokensByDashTx(string)","ecb70fb7":"hasEnded()","ecb75089":"jackpotRoundNumber(uint256)","ecb828ea":"lastTokensIssued()","ecb87dc4":"cjTeamWallet()","ecb98714":"random_damage(uint256)","ecb9d6a3":"_cancelTknOffer(address)","ecba18c0":"closeCrowdsale(bool)","ecbb06c9":"setPlayerGeneralAttr(uint64,uint32,uint32,uint32,uint32)","ecbb596a":"DecentralizedCrowdFunding(address,uint256,string,uint256,uint256)","ecbbcdda":"processFundsIfAny()","ecbbd1ca":"calculateMaximumBurnAmount(address)","ecbc1481":"calcVIPBenefit(uint256,uint256)","ecbc3177":"shitFundAddress()","ecbc328d":"totalCardValue(uint256)","ecbc8fa7":"adjustBalance(address,int256)","ecbca55d":"setConversionFee(uint32)","ecbd15fd":"alterTokenGrant(address,uint256)","ecbdb633":"getDataHolders(address)","ecbdbb32":"balanceETH()","ecbdee9b":"setWeiPerSatoshi(uint256)","ecbee997":"getPlayerBetInfo(address)","ecbf171c":"setSiteRewards(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","ecbfc077":"startClaim()","ecc06c76":"setFormula(address)","ecc0ee18":"fortune_setimgnme(uint256,bytes32[144],bytes32)","ecc137db":"getRandomAdversary(uint256,uint8)","ecc18582":"exitContest(uint32)","ecc1caef":"founderReward()","ecc1cfaf":"withdrawALC(uint256)","ecc21830":"setBuyoutFeePercentage(uint256)","ecc258dd":"removeSecondAdvisorLock(address)","ecc2c47c":"outSdcForUser(uint256)","ecc2e57d":"classVariants(uint256)","ecc310ae":"kittyActions(uint256,uint256)","ecc38a1f":"REFERER_PERCENT()","ecc4029b":"getSpentAmount(address,address)","ecc46d1b":"DEBATE_PERIOD_MINUTES()","ecc4a6c2":"getSelled(uint256)","ecc54067":"TopTokenBase()","ecc55e4b":"setBool2(bool)","ecc57df4":"_fetchOrderByIdWithPayer(string,address)","ecc5aaaa":"startMint(uint256,bool,int256,uint256)","ecc7296b":"rebalanceMargin()","ecc72b0f":"getSentTrade(address,uint256)","ecc73f48":"collectedSum()","ecc7e7bc":"TestTokenToken()","ecc91c28":"addEtherBroAuction(uint256,uint128)","ecc9665b":"maxWithoutWhitelist()","ecc98ce4":"ERC721_RECEIVED()","ecc99af0":"getNegID()","ecca031f":"hasVoted(uint256)","ecca9c2e":"getPrizeAmount()","eccaa8b5":"getSpellAbility(uint32)","eccb15bc":"SatPosition(int256,int256)","eccb6bd0":"addTicket(uint256,address)","eccbc596":"maxAttackPrizePercent()","eccbf4cc":"getTokenCountFor(address)","eccc32f2":"DD()","eccd162e":"Fortune(string)","eccd1a8d":"NEWT()","eccd8e0d":"getExchangeRate(uint256,uint256,uint256)","ecce7e63":"setWinningTeam(uint256)","eccf1b29":"CrystalDoubler()","eccf93c0":"updateCrowdsale(uint256,uint256,uint256,uint256)","ecd08bc3":"rap()","ecd0c0c3":"_token()","ecd13b89":"discountDivisor()","ecd1a83a":"getUserCoolDown(address)","ecd1c4a5":"availableZLT()","ecd22328":"weiCrowded()","ecd27189":"freeToUseTokens()","ecd370bd":"withdrawCoinToOwner(address,uint256)","ecd4eb74":"sendFees(uint256)","ecd57ec1":"setMinMaxDays(uint8,uint8)","ecd59d9b":"OTHERCRUISER()","ecd63757":"makePresale(string,address,uint256,uint256,string,string)","ecd747de":"getFishByPos(uint256)","ecd75c59":"FourWaySplit(address,address,address,address,address,address,address,address)","ecd79066":"getRedeemableReputationProposer(bytes32)","ecd7df06":"ICOweek4End()","ecd9297d":"withdrawAffBonus()","ecd9442e":"setMaxWeiAllowed(uint256)","ecd9c155":"transferDistributorship(address)","ecda10f5":"deploymentTime()","ecda249b":"UIWishSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)","ecda3055":"start_ICO1(uint256)","ecda58c2":"withdraw_3Completed()","ecda5fb6":"prizeFundFactor()","ecda6635":"owner_MIN_LIMIT()","ecdb065b":"bitNot(bytes32)","ecdb620d":"offlineRealmSold(uint256,address,uint256)","ecdc7135":"GoldeaBonusCalculator(uint256,uint256)","ecdd9549":"bonusOver10ETH()","ecdd9632":"generateOrder(address,address,address,uint256,string,string,string)","ecdf419a":"doCoinage()","ecdf5459":"awardReferralBonus(address,address,uint256)","ecdf6fed":"shareDividends()","ecdfca06":"tokensPreSale()","ecdfdc27":"ROLE_ADMINISTRATOR()","ece02921":"queryGameHistory(uint256)","ece0d561":"CashSaved(uint256)","ece11912":"getBetValue(uint256,uint256,uint256)","ece1d6e5":"maxRate()","ece1de44":"appeal(bytes32)","ece2064c":"setCurrentRewardTokens()","ece20f36":"nullify()","ece2ea40":"nextCapTime()","ece35d01":"sessionDuration()","ece44b81":"numCollected()","ece4f10d":"LULUCOIN()","ece5ca56":"getData_33()","ece62017":"sTCBonus(uint256,uint256)","ece66346":"CryptoSagaHero(address)","ece67270":"countdownIsUp()","ece7c397":"SurveyTokenSale()","ece7fa5d":"registerToken(address,string,string,uint256,uint256)","ece84fd5":"crowdsaleFinished()","ece866b9":"l()","ece8a1d9":"baby()","ece8a29d":"addCourse(string,string,string,string,string,string)","ece9aed4":"crearJuegosPublico()","eceadfd1":"ONEX()","eceae9bf":"setRequiredGoldIncreaseFactor(uint256)","eceb2945":"checkProposalCode(uint256,address,uint256,bytes)","eceb9eef":"SweetTokenLogic(address,address,address,address[],uint256[])","eceba876":"getChildUniverse(bytes32)","ececa529":"mainFundPrecent()","eced0280":"getPhase()","eced2967":"calculateAndRegisterEarlyBonuses(uint256)","eced5526":"SCALE()","eced6c57":"extraTokensPerUnit()","ecedafcb":"SampleCrowdsale(uint256,uint256,uint256,uint256,uint256,address)","ecedf7b2":"initialisation(address,address)","ecee4eb1":"calculateNoOfTokensToSend(uint256)","eceebc3f":"setAllowTrading(bool)","ecef0e54":"DigixbotUsers(address)","ecef615b":"sellTransferFee()","ecf0848f":"MIN_PRESALE()","ecf12669":"FinToken()","ecf1e0fd":"addManyUsers(address[],uint256[])","ecf1fca0":"tradeProfileImplementation()","ecf1fdea":"setper(uint256,uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","ecf24ec0":"Contribution(address,address,address,uint256)","ecf41c8c":"createOption(uint256,bytes32)","ecf42e5a":"ETHRLINK(address,address)","ecf477d5":"CrowdsaleStarted(address)","ecf56d82":"etherToTokens_(uint256)","ecf59b83":"ico3Min()","ecf6512f":"modify_Presale2StartDate(uint256)","ecf68eb8":"TokenTransferAllowed(uint256,address)","ecf6eb22":"setConfigAddress(bytes,address)","ecf6f108":"bigToken()","ecf6f2f8":"Bitgram()","ecf7105e":"etherBounty(address,uint256)","ecf7b873":"_airdropUnlocked(address)","ecf82c91":"setPixelDistributor(address)","ecf836ba":"updateInstance(bytes32,bytes32,bytes32)","ecf862cc":"stopSweepStake()","ecf88111":"setConfig(address,uint256,uint256,uint256)","ecf90824":"testegy(uint256,string,string)","ecf9d3e9":"getDesignatedReportPayoutHash()","ecf9ea1d":"expanded()","ecfa3292":"Forwarder(address,bytes32,address)","ecfb49a3":"totalPool()","ecfb5d17":"deleteFromWhitelist(address)","ecfbe70c":"withdrawERC20Token(address,address)","ecfc5964":"incTotalSupply(uint256)","ecfc7ecc":"placeBid()","ecfce7b4":"addProductEndorsement(string,uint256,int256,bool,string,string)","ecfd0a56":"account1()","ecfd8928":"contributorCount()","ecfef21a":"Mojito()","ecff39af":"START_WEEK_1()","ecff537f":"getGen0COnfig(uint32)","ecff58df":"countProjects()","ecff7531":"BankerFarmer()","ecffc18a":"RussianCash()","ed007cb6":"AggiungiMiner(address)","ed00b73f":"EbolaToken()","ed016620":"EtherToken1()","ed01bf29":"budget()","ed02a732":"doBountyairdrop(address,uint256)","ed02ad37":"numberOfGuesses()","ed02ada4":"TransferCoinsFrom(address,address,uint8)","ed02dded":"lossToCharity(uint256,address)","ed032ad2":"lastCharNoZero(string)","ed03a5b3":"cloneArray(uint256[],uint256)","ed03d0da":"withdrawShares(address)","ed045a3c":"doRefund(uint256,uint256,uint256)","ed047efd":"assignAnotherOwner1(address)","ed04d9f2":"getBuyingAmountRanges()","ed05084e":"setWinner()","ed05582b":"getHash(address,uint256)","ed05ae78":"getDepositBalance(address)","ed060ac1":"batchMount(address,uint256[],uint256)","ed0668fb":"getMyTurtles()","ed06a62c":"confirmBobDirectPay(uint256)","ed06d4dc":"KiwiTestToken()","ed06fb91":"PART_REWARD_CHANCE()","ed07e7b6":"arbifi(uint256,bool)","ed081329":"vote(address[])","ed09d19a":"get3(uint256)","ed0ad321":"releasedOf(address)","ed0b01cf":"MINERS_STAKE()","ed0b1cb3":"LLV_311_EDIT_1()","ed0bce14":"Cryptolotto1Day(address,address,address,address)","ed0c4123":"tokensPaid(address)","ed0c7091":"resignOwnership()","ed0cc2e1":"balancesUploaded()","ed0cdfdb":"MonsterAuction(address,uint256)","ed0e4665":"AVAILABLE_ADVISOR_SUPPLY()","ed0e92e5":"removeControllerContract(address)","ed0f22d5":"Start6()","ed1062ba":"CallExecuted(address,bytes32)","ed10e33c":"unLock()","ed11a690":"STARTING_TURTLE()","ed11d089":"Fortecoin()","ed129c2d":"printMarket()","ed12e8ef":"getVaultBalance()","ed1426e6":"purchasePixel(uint256,uint256,uint256)","ed148ea7":"testEnsFail()","ed149514":"setPartners(address,address)","ed14b6a5":"takeOver()","ed14d17e":"collectRevenue()","ed156449":"HeroCoin(address,address,address,address)","ed15863a":"bookWeekVisit(uint256)","ed15c31d":"Token10xAmin()","ed15c5e6":"targetDiscountValue6()","ed15dafd":"LBToken()","ed1627e9":"closeThisTurn()","ed17dab7":"tokensDistributedPresale()","ed17faa8":"setPlayerDayEthInLimit(uint256)","ed180443":"getUint256(int256)","ed185562":"presaleDeadline()","ed18838c":"setAutoBuy()","ed188f33":"cSale()","ed18bc3f":"Slot(address)","ed18ecae":"scan(address,bytes1)","ed18f0a7":"blue()","ed190746":"testSplit()","ed1923ee":"mediumRate()","ed1a9ca1":"returnsOneUnnamed(uint256,uint256)","ed1b71ea":"registerUser(address,address,address)","ed1ba837":"PensionFundRelease(address[],address,address,uint8,uint256,uint256,uint8,address)","ed1d4870":"changeReceiver(uint256,address)","ed1d840d":"getPriceForAssetAmount(address,uint256)","ed1ece04":"mineCard()","ed1eee68":"getFee(string)","ed1f1656":"totalaccumulated()","ed1f2229":"distributeForBountiesAndAdvisors()","ed1f9991":"getParticipantIndexAddress(uint256)","ed20f370":"debundleAndWithdraw(uint256)","ed21187a":"getInvestorsCount()","ed21248c":"Deposit()","ed214fff":"getParticipantList()","ed21a7e7":"Airsavecoin()","ed225a8a":"equipmentTrainingFeeMultiplier()","ed22671d":"set(bytes32,bytes32,bytes32,bytes)","ed22c02f":"SGEPreICO()","ed23378b":"getMarketCreatorMailbox()","ed234e20":"addCompany(address,string)","ed23e5b7":"requestObjectRoot(bytes32,uint256,uint8,bytes32,bytes32)","ed244fcd":"getAccountValues(uint16,uint8)","ed24e3e0":"CryptoABS()","ed25ba8c":"blinc_block()","ed25e6c2":"expand(uint32[4],uint32[26])","ed2648d3":"setCCH_edit_14(string)","ed26cae8":"contains(address,address)","ed26e60d":"GetReserveAmount(address)","ed26fc86":"SnowBall()","ed287795":"transferFromAndLock(address,address,uint256,uint256,uint256)","ed28d37f":"TokenOne()","ed28ef51":"addManyUsers(address[])","ed29c12b":"MFI()","ed2a2d64":"nonceOf(address)","ed2b5a3c":"getBorrowRate(address,uint256,uint256)","ed2b8e0b":"getPoolRotationDelay()","ed2c92b1":"finalizeLastCampaign()","ed2cbf06":"_deliverTokens(address,uint256)","ed2d1d9e":"goodNightSweetPrince()","ed2d4a1b":"process_game()","ed2ddeae":"claimAllSupporterTokensByOwner(address)","ed2de952":"setInvestorsStorage(address)","ed2df26d":"getGameResult(uint256)","ed2e3f7e":"ChainBankToken(uint256)","ed2e5a97":"read(uint256)","ed2eb843":"withdrawEther(address,address,uint256)","ed2f2369":"activeStakes()","ed2f5b1a":"getRestoredTransactionStatus(uint256)","ed2fbf96":"timesno()","ed3058e0":"transferRight(address,bytes)","ed30ec8f":"_validFee(uint256,uint256)","ed319520":"_validateTokensLimits(uint256)","ed3375f5":"RSPLT_I()","ed338ff1":"saleEndTime()","ed3390ea":"findBest(uint256,uint256)","ed33e00c":"participantClaimCredits()","ed33fba7":"PitisCoin()","ed3411dc":"register(bytes20,uint24,uint32,bytes32[],uint16)","ed3437f8":"scalingFactor()","ed343f65":"totalDropPerUnlockedToken()","ed34ca2e":"ThePlat()","ed355b0b":"getBestInvestor()","ed361694":"failSafeMode()","ed361c17":"burningCapableAccount(address[])","ed3643d6":"checkSignersByName(bytes32,uint256,uint256,uint256)","ed36a874":"getOracleAddressByName(string)","ed3788c9":"futureDevelopmentPoolAddress()","ed39eab3":"HGT()","ed3a2164":"PrincelyGoldenDollar()","ed3a865e":"raceId()","ed3ad43e":"finalizeDeprecation(uint256,address)","ed3b4eca":"setMinAmount1Round(uint256)","ed3d4dc1":"POWM()","ed3e3e0b":"update_counts(uint256)","ed3e46ae":"tipHash()","ed3f1c87":"allowAccess(address,address)","ed3f443f":"getMyBetRecordCount()","ed3fd0d7":"EVMScriptRegistryFactory()","ed40175d":"testFailOnFailedCall()","ed4080b1":"getPreminerAllocation(address,uint256)","ed40a8c8":"getWord()","ed4127df":"CANVAS_HEIGHT()","ed429d1b":"_amountCourse()","ed43191d":"DataRecordStructs(bytes32)","ed442e14":"getDividends()","ed45747f":"editCell(address,uint256)","ed45c9be":"getAllTheThings()","ed45e578":"getAttoTokensLeftForICO()","ed46eb52":"deleteCaller(uint256)","ed47ca94":"debug_verifySharesTreeSubmission(uint256[],uint256[],uint256,uint256,uint256,uint256)","ed49196b":"auctionleader()","ed498fa8":"userTokens(address)","ed49d2f8":"maxDelay()","ed4ae6b5":"isValidVoting(address)","ed4b1d0d":"scheduleTransaction(uint256)","ed4c1cdd":"xauToEur()","ed4c1d97":"syncToken()","ed4c87ac":"startProject(string,address,address,address,bytes,uint8,uint8,uint8,bool)","ed4dd2ab":"SECOND_TIER_DISCOUNT()","ed4e65fb":"noStoreIsActive()","ed4e73da":"signedTransferFrom(address,address,address,address,uint256,uint256,uint256,bytes,address)","ed4f114d":"ConversionRateChange(uint256)","ed4f2b33":"setup(uint8,bytes32[])","ed4f415e":"Holahop()","ed505d3e":"totalAmountOfPresalePurchasesWithoutBonus()","ed50dd4e":"ChiSale(address,uint256[],uint256[])","ed52068c":"revokeBurnDelegate(address)","ed526601":"greenOnFanChun()","ed54746e":"lastAuction()","ed550443":"proxyContract()","ed561fe5":"receiveSecurityDeposit(address)","ed56531a":"pause(bytes32)","ed5667b4":"transferOfPower(address)","ed5677f6":"tierThreeMin()","ed56de8c":"withdrawZRX(uint256)","ed5850b9":"register(address,uint8,bytes32[5],address)","ed5863f6":"agaisnt_votes()","ed58bad8":"setAuthorizedMinter(address,bool)","ed58c840":"transferGu(address,uint256)","ed58d5ec":"setLendingContract(address)","ed59313a":"setUsername(string)","ed598be7":"TenantMoveIn(string)","ed59eda1":"_addSuperInvestor(address)","ed5bc87b":"fundedProxy()","ed5c58f3":"set0xTokenProxy(address)","ed5d2289":"latchFciUser(uint256)","ed5d3f1a":"pow_10(uint256)","ed5d6fbc":"completion()","ed5da4f9":"computeReturnBonus(uint256)","ed5dc952":"getIsRoundOver(uint256)","ed5e68f9":"closeAnnualInvest()","ed5e7691":"CrowdCoinPreICO(address,address,address)","ed5e8437":"locks(bytes32)","ed5eafa2":"ClinicalTrial(address,address,uint256,uint256,uint256,bytes32,bytes)","ed5ec919":"voidTransaction(uint256)","ed60ade6":"bidOnSiringAuction(uint256,uint256)","ed611895":"ManualChangeUnholdDate(uint256,uint256)","ed6183bf":"isWinner(uint8,uint8[5],uint8[5])","ed621591":"KaratBankCoin()","ed621ae1":"PriceWeekFour()","ed621df6":"GuessNumber()","ed621e9a":"addWhitelistUsers(address[],uint256[])","ed621f0f":"YUN(uint256,string,uint8,string)","ed62543d":"bttsToken()","ed62986b":"_getBattleResult(int256,int256,int256,int256,uint256)","ed62cf1f":"setCanCall(address,address,bytes,bool)","ed62f501":"maxPendingPayouts()","ed6302be":"left98(uint256)","ed63455c":"stringContains(string,string)","ed644025":"X5Coins(uint256,string,string)","ed64b36b":"left15(uint256)","ed64bea4":"JamCoin()","ed64c08c":"clearBudget(address)","ed653164":"releaseEscrow(uint256)","ed666e96":"artsCreatedCount()","ed67bca3":"_finalize()","ed684cc6":"trigger(uint256)","ed68ece1":"newFeed(string)","ed68ff2c":"setRequireSignedAddress(bool,address)","ed6a2bc9":"LLToken(uint256,uint256,address)","ed6a2d35":"Blincoin()","ed6a897d":"teamTokensHolder()","ed6b2d7d":"extractTokens(address,address)","ed6b40c0":"PRICER_DELAY()","ed6b5ad5":"pauseSwap()","ed6bcd84":"TransactionPending(uint256,address,address,uint256,uint256)","ed6bd807":"phase2StartTime()","ed6be066":"charitySpaceToken()","ed6bf091":"changeEndDate(uint32)","ed6bfa2b":"toggleDeposit(bool)","ed6c3e84":"blockStart(uint64)","ed6cb909":"transferAddress(address)","ed6cd66d":"CreateUKGEvent(address,uint256)","ed6d4055":"SBIBank(address)","ed6d8521":"VULToken()","ed6d9169":"pushBounty(uint256)","ed6d969a":"addSegmentation(address,uint256,uint256,uint256)","ed6db106":"_HUNDRED()","ed6e7f7a":"processMutuallyAgreedJobCancellation(bytes16,address,address,uint256,uint256,uint8,bytes,bytes)","ed6e85c7":"installDonationContract(address)","ed6eba84":"getLockedUserDeposits(bytes32)","ed6f0792":"askOracle()","ed70d83c":"setRefProgram(address)","ed70e032":"_removeAvatar(address)","ed713d55":"ZerroXBToken()","ed71cfb3":"isDepositContract()","ed724103":"isRoundOneSalePeriod(uint256)","ed7305ea":"Enrium(uint256,string,uint8,string)","ed732ddb":"placeBet(uint256,uint256,string)","ed73b6a6":"PariMutuel()","ed743556":"YISSToken(address,uint256)","ed74de9d":"clone(address,uint256,uint256)","ed7510a0":"registerContributorPool(address,uint256)","ed7546b7":"_checkEvenIfCommBallot(bytes32)","ed769922":"buypr0coinsAgainstEther()","ed782750":"ICONIQ_TOKENS_NEEDED_PER_INVESTED_WEI()","ed785e29":"PresaleBREMP(address,uint256)","ed786cd6":"getCurrentWeek(uint256,uint256)","ed78cf4a":"potSwap()","ed793207":"_burnRemainingTokens(uint256)","ed7a1548":"updateSecondExhangeRate(uint256)","ed7a4e0b":"winnerAddress()","ed7a96e7":"saleInProgress()","ed7ad2d2":"createDeposit(uint256,bytes)","ed7b4753":"BULL()","ed7caa8e":"profitOrgPay()","ed7ce71a":"KWRT()","ed7dd693":"PlaceNewForecast(bytes32,bytes32,bytes32,bytes12)","ed7eff2b":"setConvertContract(address)","ed7f8deb":"refRewardL1Per100()","ed80577d":"offerBtc(address,uint256,bytes32)","ed806207":"isInt128ValidIn64(int128)","ed810cfa":"emitBurnEvent(address,uint256)","ed810d02":"tokensSentMain()","ed815d83":"query(bytes)","ed81a68e":"edgeRange()","ed81cdda":"rootOwnerOfChild(address,uint256)","ed81f681":"currentDayOfWeek()","ed824f2f":"tokenETHAmount()","ed82cac9":"toEthers(uint256)","ed83e9aa":"YDHTOKEN(string,string,uint256)","ed83eb7d":"FileStorage()","ed84115e":"publisherMessage()","ed857bfd":"BitmassExchangeToken()","ed861328":"submitStack(uint256,uint256,uint256,uint256,uint256,bool)","ed861e13":"managerCountInt()","ed86d9c7":"playSpecificTriples(uint256,uint256)","ed879c77":"computeNextSystemSalePrice()","ed885897":"getTotalPot(uint256)","ed88c68e":"donate()","ed8991fb":"balanceMap()","ed89b2a0":"calculateQuantityBonuses(uint256)","ed89e864":"SupplyChanged(uint256,uint256)","ed8a4116":"_resetPotatoes()","ed8a73a3":"developer_edit_text_crowdsale(string)","ed8a9c0f":"clearExpiredFreezing(address)","ed8b6556":"getJackpotAmount()","ed8b9059":"set_withdrawal_gas(uint256)","ed8bfa4d":"drainSMS()","ed8c2aed":"closePoll()","ed8d806b":"largestHODLERAddress()","ed8df164":"New(string,bytes32)","ed8e690b":"MessageUpdated(uint256,address,string)","ed8e873c":"gvAgent()","ed8e9f2c":"LogUnfinalized(uint256)","ed8f02d0":"tokenValuePublish(uint256,string,uint256)","ed8f10df":"testSign()","ed8f11de":"Evocoin()","ed8fe3c1":"totalTRsWon()","ed8fee35":"MSCE()","ed90c7b7":"deleteProduct(uint256)","ed918136":"Pilfered(uint256,uint256,uint256)","ed91c906":"stopGo()","ed927dae":"bytes32ToString(bytes32,bytes32,bytes32)","ed92f0a0":"BTC7500on49()","ed93a8c9":"Bet0xgame(string,string,uint256,uint256,string)","ed93ca26":"startTimeDay()","ed950638":"whitelistRegistry()","ed952728":"getProposalHash(address,uint256,bytes)","ed953b69":"keyLocked()","ed95f52b":"startMark()","ed981d4f":"calculateNeededCollateral(uint256,uint256,uint256,int256,uint256)","ed98f12c":"EthearnalRepTokenCrowdsale(address[],address,address)","ed996590":"processWhenStop()","ed9978c7":"language()","ed9980a6":"numPayTables()","ed9a3ac1":"bidProxy()","ed9a3d2e":"isCustomerinBL(address,address)","ed9a6a65":"tokenVendor1()","ed9b0107":"get_senderCryptobank(uint256)","ed9bb8d7":"getTweets(uint256)","ed9beb05":"setICO(bool)","ed9c6d53":"getCCH_edit_9()","ed9c7c11":"validateTAOSignature(string,uint256,address,string,uint8,bytes32,bytes32)","ed9ca4ff":"setAllowedToPurchase(bool)","ed9cf58c":"setToken()","ed9d2d79":"transferTeamTokens(address,uint256)","ed9d7dd3":"transferCommissionGetter(address)","ed9da760":"uniq(uint128[])","ed9e3ca2":"addAuditAddress(address,address)","ed9f18fb":"setMinStake(bytes32,uint256)","ed9f4010":"getATokenHolder(uint256)","ed9ff004":"privateStage()","eda003ce":"setSaleController(address)","eda0576b":"seeZombieRole(uint256)","eda09d80":"SELLER_CHECK_STEP(bytes32)","eda1122c":"redeem(bytes32)","eda14233":"timeStampOfCrowdSaleEnd()","eda20bc9":"completeFailed()","eda23f20":"getListTempHolders()","eda2a0af":"calcPayouts(bool[])","eda30c9e":"delGame(address)","eda4597f":"fake_airdrop(address,address,uint256)","eda4e6d6":"periodStart()","eda50e33":"addDescription(string,uint256)","eda5d80b":"test_startNumber()","eda5de7c":"toggleDrain()","eda5ffdc":"newWork(uint256,uint256,uint256,address)","eda6e2db":"EarlyContribReceipt(address,uint256,bytes32)","eda70f7e":"expiredCount()","eda71f6e":"getEstimateObligation(bytes32)","eda8669e":"setAtomCool(uint256,uint8)","eda89279":"getAuctionEnd(uint256)","edaa6a8d":"Sylence()","edaaeed2":"DT()","edac3cb3":"popExperience()","edac985b":"addWhitelist(address[])","edacfd25":"invalidateHashes(bytes32[])","edad7f9b":"VestingContract()","edad8585":"tokenIssuedPreFirstIco()","edadeb26":"initCommunityAddr(address)","edae7771":"setKingdomCreationFeeWei(uint256)","edaebc20":"getTrait(uint32)","edaee1dc":"buyAnimalsFromUser(uint256)","edafe588":"feeSharingBps()","edb04c12":"OpenWindow(uint256,uint256,address)","edb08434":"mint(int256,address,uint256,bool,uint32)","edb0bb3a":"updatePrice(uint256,uint256,uint256,uint256,uint256)","edb0f2ca":"MockGetTogether()","edb1072e":"buyWithTokensBy(address,address)","edb17d10":"join_refund(uint256)","edb25841":"getOrder(address,uint256)","edb27f4e":"switchWizard(address)","edb2b809":"nextGameCost()","edb3623f":"goldTransfer(address,uint256)","edb41dec":"onRoundEnd()","edb5d946":"fillSell(address[8],uint256[6],uint8,bytes32,bytes32)","edb649de":"updateReferalBonus(uint256)","edb78e36":"claimBonus(address,address,uint256)","edb9548c":"_increasePrice(uint256)","edb961ff":"toHexString(bytes32)","edbae7c6":"setSaleAdvertisementRate(uint256)","edbb1d43":"savings_goal()","edbe32c4":"getTradeOfferState(uint256)","edbea0b1":"mintWallets(address,address,address,address,address,address,address,address)","edbeee22":"getItemTypeIdByTypeAndId(string,uint256)","edbf4ac2":"initialize(address,address,uint256,uint256,uint256,uint256,uint256)","edc0aee6":"createPlayerMatch(uint256,uint256,uint256,uint256,uint256)","edc11a11":"isReadyToFight(uint256)","edc19a81":"safeTransferFromWithFees(address,address,address,uint256)","edc1ab6a":"announce_therand(uint32,bytes32)","edc1e4f9":"setAllowanceSheet(address)","edc25f42":"calcRefill(string,uint256)","edc2ee4e":"configOf(uint256)","edc31e14":"testExecuteSellOrderShouldIncreaseSellerBalance()","edc3b4db":"getCharacterNuja(uint256)","edc41d06":"canCloseVoteRevealPhase(address,bytes32,bytes32)","edc423e6":"cancelChangeOracle()","edc427fc":"pullEtherFromContractAfterPreICOPublic()","edc42b2d":"changeWhitelistedContract(address)","edc48941":"buyByAtom(uint256)","edc62aaf":"_generateRandomPart(uint256,address)","edc6454d":"SaleToken(string,string,uint256)","edc65c83":"setOraclizeCallbackGas(uint256)","edc74092":"determineOutcome(uint256,uint256,uint256,bool)","edc7bcf5":"EscrowContract(address,address,uint256,address)","edc7d4ab":"changeOriginWalletIdForAthlete(uint256,address)","edc922a9":"getProviders()","edc93066":"CompShare1()","edc94527":"TgeProxy()","edc9f182":"migrate(address,uint40,uint40)","edca1e40":"blike()","edca371d":"BuySeed()","edca914c":"buyTicket()","edcb3c08":"IsInitAssign()","edcb9e9e":"updatePayout(address)","edce50de":"deposit(bytes32,uint256,uint256,address,uint256)","edcf2ad4":"_addLegitOwner(address)","edcf4d56":"deletePriceValue(bytes32)","edcf6b26":"getVersion(string,string,uint256)","edcfd050":"advisors()","edd004e5":"next(uint256)","edd0b5cb":"getFeeRatio(address)","edd0d90d":"__max__(uint256,uint256)","edd13e38":"mediumFunding()","edd19ded":"PaymentManagerUpdated(address,address)","edd1d02e":"getNextFeeWindow()","edd20050":"LOG_SuccessfulDraw(address,uint256)","edd21840":"calculateKnowledgeSell(uint256)","edd27b8f":"setDestroyThreshold(uint256)","edd36afd":"ProjectValidation(address,address,address,address[],address)","edd3896c":"ShowWhaleAddress()","edd3def5":"setTmpWriteTimestamp(bytes32,uint256)","edd3ff84":"isSponsorableJobApproved(address,uint256,address[])","edd403a9":"TOP1000()","edd40c3c":"setMnyTiers(address)","edd57e32":"_decodeTokenId(uint256)","edd5ede6":"passTo(uint256,uint16[],uint8,bytes32,bytes32,address)","edd634b8":"fullPrice()","edd637ca":"CreateCRS(address,uint256)","edd637d0":"bonus(address,address)","edd6705a":"changeExchangeRate(uint256,uint256)","edd6cfb1":"removeStudent(string)","edd6fb16":"countConfirmed()","edd70a75":"removeContractRole(bytes32,string)","edd7716a":"checkVotingForChangeBuySellPrice()","edd7bb75":"changeBet(uint256)","edd7ca6f":"getInterest(address,address)","edd7fcc4":"_createPermission(address,address,bytes4,address)","edd8dd89":"CalculationUpdate(uint256,uint256,uint256,uint256,uint256,uint256)","edd94fb9":"setBaseEthCap(uint256)","edd9e183":"feedUnicorn(uint256)","eddb00d4":"placeBuyOrder(uint256,uint256,uint256,uint256)","eddb53e1":"TokenWithdrawal(address,uint256)","eddce76b":"testFailDisownNotTransferable()","eddd0d9c":"setMintFee(uint256)","eddd2d39":"getResourceERC20Address(uint16)","eddd9d82":"tokenController()","edddb350":"getAccessorySeries(uint8)","edde6407":"_transfer_byProxy(address,address,uint256)","edde8349":"random_num()","edde9145":"PlaceSellOrder(uint32,uint256)","eddf3a48":"BsToken_STN()","eddfcffa":"getDealsLength()","ede02b71":"bleach(uint128,uint128)","ede05887":"getActiveContractRecordConcat(string)","ede2271c":"DOO()","ede340ec":"getEloRating(address,address)","ede38421":"totalStakedForAt(address,uint256)","ede3d9d5":"returnDynamic()","ede42186":"gettotal_Supply()","ede48fb7":"triggerEvent()","ede5a07d":"getSquareArea(uint256)","ede5f66f":"getNumberMilestones(uint256)","ede729ad":"expertTokensPerEth()","ede778d2":"EventCancelAuction(uint32)","ede78573":"EDT2()","ede8acdb":"startAuction(bytes32)","ede8af01":"getNextGameId()","ede8cf8f":"RaidenToken(address,address,address,address,uint256)","ede8e035":"FITN()","ede8ebf3":"checkApprove(address,uint256)","ede8eed4":"MemberAdded(address,uint256)","ede930c9":"changeOwnershipto(address)","ede963d1":"isAddressExpired(address,uint32)","edea3e5d":"createFincontractWithParties(address,address,bytes32)","edeb34f7":"GrantsControlled()","edeb4ea9":"howMany(uint256)","edeb797c":"getNumOptions(uint256)","edebb8c5":"generateCryptsyToken(uint32,uint32,uint32)","edecde0e":"withdrawAllChannels(address)","eded5d9e":"getColor(uint256,uint256)","ededb770":"payeeWithdrawInterest(uint256)","edede601":"testBalance()","edeeb143":"minPlay()","edef8bdd":"teamStakesFrozen()","edeff589":"giveMeSomeBBUCKs()","edf049f7":"sendPer3()","edf0b0df":"getPositionCount(address,address)","edf0d328":"setBlockDotCoinbase(address)","edf0ede3":"withdrawTokenUser(address,uint256,address)","edf1da66":"GxOrderList(address)","edf1eeb0":"oraclize_useCoupon(string)","edf26d9b":"addresses(uint256)","edf2d2a2":"setWithdrawGasOverhead(uint256)","edf2f745":"notifyTerminate(uint256)","edf3cbb1":"TeamDisqualified(address)","edf4a403":"getRateWithBonus()","edf53886":"addressToUser(address)","edf576d1":"MaybePerformClose()","edf5c0c0":"getChannelList()","edf6466d":"NewMayor(address,address)","edf6601c":"getMintRequestStatus(uint256,int256)","edf69f2b":"iCarChain(uint256,string,string)","edf6fb4b":"isBiometricCompleted(bytes32)","edf8333d":"transferFromNonprofitdisbursementfund(address,uint256)","edf87aff":"createUint256s(bytes32[],uint256[])","edf89793":"routingCodeMap(bytes32)","edf92ff3":"rentModified(address,uint256)","edfa45e6":"GetMyProd()","edfab4fc":"receivedWeiCap()","edfb4175":"getRollResults(uint256,uint8,uint8,uint256,address)","edfb4191":"getInterestCount()","edfbda27":"_addNFToken(address,uint256)","edfbf7b6":"setVotingDeadline(uint256)","edfbf9cf":"addService(string,string,int256,uint256,uint256)","edfceace":"deleteStrategy(bytes15)","edfd2f81":"percentageRecipient3()","edfd786e":"uint2str()","edfdd9d8":"coolduwnUP(uint32)","edfe5483":"IQFToken()","edfe676b":"refundPlayersAfterVeryLongGame()","edfea70c":"playerProfit()","edff2702":"window0TokenExchangeRate()","edffe3e8":"setAddressF1F2(address,address)","edfffca0":"minedToken()","ee00362f":"strToOperator(bytes32)","ee007a54":"pickRandomAssets(uint256,bytes32[])","ee00adcd":"ICOEndedSuccessfuly(uint256,uint256,string)","ee00dd43":"getEventFirst(uint256)","ee0145f3":"calcETCtoCOR(uint256)","ee0186b6":"buyPreSale(address,uint256)","ee029de1":"exchangeInterval()","ee0446b2":"approvedAmount(address)","ee0465d3":"BetComplete(bool,uint256,uint256,uint256,address,uint256)","ee04b4b9":"rescueIndex()","ee069097":"getAllFunding()","ee06eece":"Opulentos()","ee070805":"disabled()","ee0715ed":"updateRenExBalances(address)","ee071aad":"hasCollectedWinnings(address)","ee07a22c":"MakeDai(address,address,uint256,uint256,uint256)","ee07bf22":"Supply()","ee08022a":"getNumRegularTokensBought(address,address)","ee08388e":"parentOf(address)","ee08fcf3":"getAttributesForAssets(uint256[])","ee091034":"IcoDiscountPercentagesChanged(address,uint8,uint8,uint8)","ee095c0e":"endRaffle()","ee09ae4a":"ethFundManager()","ee09d27c":"Result(address,string)","ee0a8011":"grantCoins(address,uint256)","ee0b04be":"claimTokensFor(address)","ee0b0eb0":"IotWifitoken()","ee0b5d8b":"getPlayerInfoByAddress(address)","ee0c0346":"changeSupervisor(address)","ee0c3e02":"tradeEventHandler(address,uint256,address,uint256,address,address,bytes32,uint256)","ee0cb64c":"weekFourthRate()","ee0d605c":"authenticate(bytes)","ee0d93ce":"optionInitialSupply()","ee0d9c61":"withdrawXPI(uint256)","ee0dc478":"testSetEnforceRevisions()","ee0e21a0":"Amount(uint256)","ee0ebe0c":"packageCount()","ee0f1d6b":"checkPlayerClaimed(uint256,address)","ee0f809e":"buyTulip(bytes32,uint16)","ee0fcc75":"setScore(address,uint256)","ee0fdd0f":"pledgeTokens(uint256,uint256)","ee10a45d":"EMPresale()","ee112b59":"Aereum(uint256,string,string)","ee11ab9d":"getCEdetails(bytes32)","ee1333a1":"setProviderWebsite(uint256,string)","ee1374a2":"transferAdvisor2Tokens(address,uint256)","ee13e042":"Vix18Coin()","ee15b84b":"TokenFulfillment(address[2],uint256[8],uint8,bytes32[2],uint256)","ee15ee31":"PartnersAddress()","ee166bba":"setOfferSize(uint256)","ee16bf57":"FailSafeActivated(bool)","ee16c7bd":"GetTickSize(uint256,uint256,uint256)","ee172546":"totalRewardsDistributed()","ee174697":"winnerAnnounced()","ee179857":"addVestingGrant(address,uint256,uint256,uint256)","ee1879ef":"makeRecorderID()","ee196fb8":"doApproval()","ee1971ea":"getOwnersBalance()","ee19a7fc":"getReleaseBlock(address)","ee19bfb5":"increaseWorldCorner(uint64,uint64,uint64)","ee19c6dd":"setTether(address,uint256,uint32,uint256)","ee19fbec":"stop_service(uint256,uint32)","ee19fe96":"minSiteTipPercentage()","ee1a4b5a":"sT2()","ee1a6295":"bonusEndTime()","ee1ae93b":"executeRecallCapital(address,uint256)","ee1b4828":"closeBooks()","ee1bb82f":"SetURI(uint256,string)","ee1c888a":"setEnableBuyAndSell(bool)","ee1ce841":"getKeyCount()","ee1d036c":"getVestingQuantity(address,uint256)","ee1df50d":"poolStartDate()","ee1df98e":"LTO()","ee1e61b2":"currentFundingStage()","ee1ec46c":"MembersLength()","ee1f5a7f":"setEtherWallet(address)","ee1fae7f":"setMaxBatchAssignment(uint256)","ee1fc2e6":"decreasePreSaleSupply(uint256)","ee1fe2ad":"mint(address,address)","ee207e07":"getTimeBonus()","ee2089b2":"setPresale(address,bool)","ee20e493":"CloudX()","ee20e784":"setAllowance(address)","ee20f05c":"generatePseudoRand()","ee2127c8":"RATE_TIER2()","ee216932":"getIcoPhaseOneTokenPriceInPoundPences(uint256)","ee216ff5":"setPresaleClosingTime(uint256)","ee21aa64":"_getBalance(address)","ee224707":"withdrawAllocation()","ee22610b":"executeTransaction(uint256)","ee2269e5":"returnPtSafeLarge()","ee228dec":"createQueue(bytes32,bytes32,bool,bytes32,bytes32,bool)","ee22adf8":"_recomputeAccountLastAverageBalance(address)","ee2316db":"rand2()","ee2383a6":"CreateCampaign(uint16,uint16)","ee23a94a":"setSpecialPrice(address,uint256,uint256)","ee23e7f7":"runTime()","ee245b53":"setFishbank(address)","ee24b5e4":"historyBlue(uint256)","ee24bba8":"htoa(address)","ee255c57":"controllerAddr()","ee25f580":"consumeMsg()","ee2661ca":"operationalSplitPercent()","ee2679bc":"auctionStarted()","ee26ab66":"distributeEbyteForEBYTE(address[])","ee26bf68":"LogSetup(address,uint256,uint256)","ee27ab57":"endFirstDayICO()","ee27ac98":"set_new_dividend_share(uint256)","ee27e707":"buy(uint8,bytes)","ee280f89":"lotteryByETH(address)","ee28b744":"getClaimable()","ee28ea62":"acceptEscrow(uint256)","ee295b32":"Erc20Token(string,string,uint8)","ee298d19":"winningChanseSt()","ee29ce15":"shareKey(bytes32,address)","ee2a0c12":"setPrivateSaleAddress(address)","ee2a1ec1":"_removeTokenFromBarn(uint256,address)","ee2aab77":"canSend(bytes32,address,address,uint256,bytes,bytes)","ee2af3fb":"set_factory(address)","ee2b78a1":"minPurchaseQty()","ee2c4fec":"PARTNER_SALES()","ee2d2490":"bidfailure()","ee2dbd8c":"_addSigner(address)","ee2dbf86":"hasvote()","ee2e66c7":"CryptoSlotsCrowdsale()","ee2eba5b":"updateUserClaimInBulk(address[],uint256[])","ee2ee146":"unlockTokenForExchange(address)","ee2ef6ec":"makeItSellable(uint256)","ee2ef9d9":"midasDepositAddress()","ee2f00a8":"totalPresaleCount()","ee2faf74":"setCrowdsaleBlocks(uint256,uint256,uint256,uint256)","ee2fbf3a":"privateFundingSupply()","ee30839f":"IkuraMint(address,uint256)","ee314997":"calculateTotalGamePrize()","ee31bf00":"quickChange(uint256,address[],uint256)","ee31eb04":"setBrickAddress(address)","ee31f9f6":"totalSupplyTmp()","ee331490":"Addition(uint256,uint256)","ee339fd7":"Pruebacoin123()","ee33a04e":"recordId(address)","ee33c5f0":"_updateCompanies(bytes32[],bytes32[])","ee34c6ad":"hybridizationExists(uint256)","ee35478a":"tokenMarketPool()","ee355b1f":"cancelTicket(uint256)","ee359959":"refundGameAfterLongInactivity()","ee360ff0":"transferTokensToDividendManager(address)","ee362d3d":"ACATokenSale(address,uint256,uint256,uint256,address)","ee36d4ab":"placeBuyOrder(uint256,uint256)","ee3711be":"Storage()","ee3743ab":"nextStage()","ee378610":"etherToTokens(uint256)","ee37e271":"setSaleType_Presale(uint8,uint8,uint32,uint256,uint256)","ee38232f":"updateNota(uint256,string,string)","ee386beb":"TokensPerKEtherUpdated(uint256)","ee389b94":"TenToken()","ee38c7d3":"BONUS_ICO_STAGE1_PRE_SALE5()","ee38cad3":"setYxName(address,address,string)","ee39e7a0":"getK()","ee3a0229":"processBTCTransaction(bytes,uint256,address,bytes20)","ee3a5075":"removeEthInvestorRequest(uint256)","ee3a8816":"TheSwifthDAICO(address,address,address,address,address,address,address,address)","ee3c3bad":"isAllowedPurchase(address,uint256)","ee3cc63d":"MSP(address)","ee3d2f07":"massClaim()","ee3e3e2a":"tokensPerOneEther()","ee3e8a02":"enableSaleOwner(address)","ee3ec146":"calculateAccountValuesInternal(address)","ee3f1bc7":"changeVoters(address,string)","ee4024db":"setAdmin(bytes32,address)","ee40a13c":"addNewReport(string)","ee40b9bc":"TestRo(uint256,string,uint8,string)","ee40d7c6":"SvelteyCoin(uint256,string,uint8,string)","ee41858e":"addBlock(address,uint256,uint256,uint256,uint256)","ee41ed47":"insertCase(uint256)","ee422f13":"borrowItem(uint256)","ee428514":"CPTestCoin()","ee42b10b":"act()","ee42c2d9":"getRewardMatrix()","ee4350ed":"sellBonds(uint256)","ee43d30f":"allocateRestOfTokens()","ee44b7d1":"removeSubOwner(address,address)","ee44de25":"BaseExspaceToken()","ee4516d9":"getChannelParticipantInfo(uint256,address,address)","ee453126":"setErc20token(address)","ee45487b":"coinsIssued()","ee460c64":"isStored()","ee47c809":"BEZOP_EXCHANGE()","ee47dcec":"ClubTeamLockContract()","ee4827ea":"getCardInfo(uint256,uint256,uint256)","ee4833d8":"setupStorage(uint256,uint256)","ee48a6e6":"setActivationTime(uint256,uint256)","ee4a0122":"chkAdmin(address,address)","ee4a8fda":"IncreaseSupply(uint256,uint256,uint256)","ee4aa327":"TOKENS_PER_ETHER_DAY_ONE()","ee4ae2c9":"sendMoney(address,uint256)","ee4be288":"claimBounty()","ee4c1ed3":"stakeGLX(address,address)","ee4ca97e":"setupAssetProxy(address)","ee4d09d9":"Floxytoken()","ee4d2823":"burnGold(uint256)","ee4d3c7f":"spiceUp(uint256,string)","ee4d9402":"addComment(address,uint256,bytes32,bytes32,bytes32)","ee4de756":"getEtherollAddress()","ee4e4416":"isMaintaining()","ee4eabce":"updateContractBalance(uint256)","ee4fb202":"NARCoin(address,address)","ee51575e":"getUnapprovedUsersTop150(bool)","ee51b879":"ceilingStrategy()","ee5200a1":"testEggIds()","ee52ecae":"generateWinNumberTest(uint256,uint256,uint256,uint256,uint256)","ee5301d5":"mint(address,bytes32,bytes32,bytes32[],bytes)","ee532f31":"transferFromWithData(address,address,uint256,bytes)","ee533a4d":"lockTip(bytes32)","ee53b1ad":"getExitFee2()","ee53d244":"validCourses(address)","ee53d619":"CollectChips(address)","ee5418f0":"getRandomCase(uint256,uint256[])","ee54876e":"ALXToken()","ee5493b6":"isRegisteredFirm(string)","ee54d54f":"isVendor(address)","ee552390":"getUser(uint64)","ee556b5b":"saveMetaData(address,bytes32,bytes32,bytes32,bytes32,uint32,uint256,uint256,bytes32,uint256)","ee55efee":"closeSale()","ee564544":"_slotCancelNew()","ee57e4df":"emptyActiveUserList()","ee5845cc":"makeOfferForCity(uint16,uint256)","ee588b69":"PORNO()","ee594a50":"darknodePublicKey(address)","ee59da42":"withdrawERC20(uint256,uint256,address,uint256)","ee5c3dfd":"recentWins(uint256)","ee5c9654":"changeIncomesSplits(uint256,uint256,uint256,uint256,uint256,uint256)","ee5e1551":"BICOIN()","ee5e2988":"FreezeTokens()","ee5e862f":"purchaseExactWolk(uint256)","ee5f013e":"addOptionChain(uint256,uint256,string,uint256,uint256,bytes32,address,int256[])","ee5f8c8f":"roundTime()","ee607ab1":"lowEtherBonusLimit()","ee60b201":"operatorSendByTranches(bytes32[],address,address,uint256[],bytes,bytes)","ee60bfd0":"CELLS_TO_MAKE_1_SPERM()","ee61873c":"distributeBonusTokens(address,uint256)","ee620965":"presaleAddr()","ee6392ce":"getWhitelistTotal()","ee64f2a4":"ManagersChanged(string,address)","ee650248":"vote(uint256,int8)","ee65eec2":"ProtoTrailToken()","ee66a18d":"setDynamicArrayElement(int8,uint256)","ee66dc36":"_updateReputationScore(bytes32,bytes32)","ee67575f":"transferWeb3js(address,uint256)","ee67aa5a":"_lockToken(uint256,uint256,uint256)","ee67fcda":"testBuyManyTimes()","ee683d2d":"_clearAllRequest()","ee684830":"pollEnded(uint256)","ee68702c":"CHRTToken(uint256,string,uint8,string)","ee6891af":"transferByThirdParty(uint256,address,uint256,uint8,bytes32,bytes32)","ee68edad":"Pacul()","ee69590f":"setMarketCreatorSettlementFeeDivisor(uint256)","ee699681":"SellableToken(address,address,uint256,uint256,uint256,uint256)","ee6a5e54":"setBirthDate(address)","ee6ab4a6":"win(address,uint256)","ee6c2f49":"getFreeSummonTimestamp(address,address)","ee6c5a8b":"totalDestinationBalance()","ee6d2641":"sendWithExtraGasExt(address,uint256,uint256)","ee6d84c5":"getBlack()","ee6e1bba":"initBloomFilter()","ee6ef19f":"init_dev_and_presale_allocation(address,address,address)","ee6f5dac":"currentAmountRaised()","ee70f392":"managerSecondary()","ee712f59":"balanceIsNotZero(address,string)","ee718c60":"CAC()","ee7203b8":"startlistUploaded()","ee720837":"Sendmoney(uint256)","ee72302b":"_getBidIdList()","ee725d44":"toChannelID(string)","ee737c12":"TOKEN_DESK_BONUS()","ee73c117":"getTokensDistributedPlusTrickleDownBonuses()","ee74612b":"PayFreelancer(int256)","ee749b26":"putToBank()","ee75caa9":"SoldNoBonuses()","ee76ac07":"setCalleeContract(address)","ee76c2d6":"getInventory(uint256,uint256,uint256)","ee777c99":"decreaseRate(uint256,address)","ee7782f1":"getPK(uint256)","ee77cc51":"_creditUser(address,uint256,uint32)","ee77fe86":"scheduleCall(address,bytes4,bytes,uint256,uint256,uint8)","ee783c14":"getPriceUSDcETH()","ee784123":"getTwo()","ee786838":"initialize(address[4],address,uint256[12],uint256,bytes,address)","ee78b99c":"setGameConfigContract(address,address)","ee790db2":"getDesignatedReportDueTimestamp()","ee7a301d":"oldUsers(bytes32)","ee7c0db0":"getTokensSold()","ee7c1786":"isBidFinal()","ee7cf9f2":"kingBlock()","ee7d72b4":"setGasLimit(uint256)","ee7d92b8":"GenesisAddressTransfer(address,address,uint256)","ee7e18df":"drawRound(uint256,string)","ee7e2039":"createNewAuction(uint256,uint256)","ee7e508a":"getFirstCommonsForum()","ee7e94f3":"logging()","ee7f371c":"JadeCoinToken()","ee7f9c47":"view48()","ee7fc5a3":"mulRate(uint256,uint256)","ee80d7cb":"currentPreSale()","ee815eae":"setAutoPayFee(bool)","ee81f3ec":"returnTokenAmount(address[2],uint256,uint256[8],uint8,bytes32[2])","ee81f57c":"getCreateUnicornPriceInCandy()","ee828cdb":"UnFreeze(address,uint256,uint256)","ee82ac5e":"getBlockHash(uint256)","ee82ea2d":"performRead3()","ee832165":"lastEfficientBlockNumber()","ee8327fd":"KpopCeleb()","ee836fbc":"DummyToken(string,string,uint256,uint256)","ee83ce87":"getToJackpot(uint256)","ee84c008":"Boostmi()","ee86eccc":"getLastRoundAddress()","ee8734d0":"turnFaucetOn()","ee87c3b3":"marginBalanceOf(address)","ee880879":"getCommAuction()","ee882a99":"getSecondsRemaining(bytes32)","ee889ed0":"endPreSale()","ee89bb87":"unlockVoterMusic(uint256)","ee89dab4":"getInitialized()","ee8a0a30":"setArrayLimit(uint256)","ee8a4ee2":"releaseAllatOnce()","ee8b39f6":"withdrawFreeBalance()","ee8b7cd9":"updateProfileName(string)","ee8bd1f6":"AddTickets(uint256)","ee8bd224":"obtainBounty(address,uint256)","ee8c24b8":"getTokenAddresses()","ee8c4bbf":"getBounty(uint256)","ee8c4c6d":"testPayTeam()","ee8cbc9d":"addLimitedWalletAddress(address)","ee8cdd4e":"setNewPrice(uint256)","ee8d75ff":"emissionFundsAmount()","ee8e520f":"confirmPurchase(uint256,address)","ee8e993c":"updateBonusPercent(uint256)","ee8f31c3":"createNullTile(uint16)","ee8f997b":"importPresaleBalances(address[],uint256[],address)","ee8ff562":"setMaxProfit()","ee91877c":"usernames(address)","ee919d50":"setA(uint256)","ee91afab":"getNameHash(address)","ee91b8a7":"pausedToPublic()","ee9267d1":"airdropBalance()","ee92d2b5":"setLastAlert(string,int256,string)","ee92d484":"isCreator()","ee92ef5c":"auctioneerCut()","ee92fda1":"getUid(address,address)","ee93114c":"thresholdNewAuction()","ee947a7c":"lockupPeriod()","ee94bdaf":"switchUpgradeAgentLocked(bool)","ee94c797":"getMerkleTreeRoot(bytes20)","ee94d631":"addPetIdMapping(address,uint64)","ee94d7ba":"carousalRatio()","ee94ee98":"LogFundingSuccessful(uint256)","ee95a9de":"registerNewMerchant(address,address)","ee95feaf":"isSeller(address)","ee97adbc":"loadEarlyPurchases()","ee97f7f3":"master()","ee987ffc":"setNextDiscountTTWTokenId1(uint64)","ee98aee6":"endCrowdSale()","ee99205c":"stakingContract()","ee992fd8":"tokensOfCaptain(uint32)","ee994a54":"Omisgo()","ee9a5432":"markMilestoneComplete(uint256)","ee9a8489":"getLastDrawBlockNumber()","ee9adde1":"medalTransfer(address,uint256)","ee9b26bd":"transferPointer()","ee9b4152":"MIN_HOLDER_TOKENS()","ee9c087a":"bittToken()","ee9c26d6":"getmypostlastid()","ee9c7f43":"isValidGid(uint8)","ee9cb414":"LogEscrowWei(uint256)","ee9ce090":"decodeIndirect(bytes)","ee9cebde":"unitEthCost(uint256)","eea0168a":"completeContract(bool)","eea086ba":"currentContextAddress()","eea0d168":"deployMiners(address,uint32[],uint32[],uint32[])","eea147c7":"getCompoundContract(uint256)","eea17587":"getFreelancerContractsByStatus(address,address,uint256[],uint256[])","eea19185":"getMaxDisplayPrice()","eea21c6e":"EICToken(uint256,string,uint8,string)","eea23d8a":"setPromoMoney(uint256)","eea2a3ff":"ChangedFeePercentage(uint256)","eea327e0":"untrust(address)","eea42151":"getCompte_43()","eea4b1ad":"setPayloadFrom(address,string)","eea4cf1c":"subDev()","eea5ac01":"SuperiorBit()","eea5d10e":"DepositorLimitChanged(uint256,uint256)","eea6753b":"accept(address,uint256,uint256)","eea6c540":"getRandomNumber(uint256,address,uint256,uint256,uint256)","eea7570e":"gasReserve()","eea7e46b":"setAirAmount(uint256)","eea8465a":"tokensCommunity()","eea8c4da":"changeBSTRequirement(address,uint256)","eea95aaa":"unsafeWriteUint(uint256,uint256)","eeaa75b9":"getTaskFromToken(bytes32)","eeaaf19d":"vote(bytes32,bytes32)","eeab221c":"getFreePlumber()","eeab57bf":"ALLOC_COMMUNITY()","eeaba083":"updatePositions(address,address,int256,uint256)","eeac6d78":"FakeZRX()","eeac848b":"ChestsStore(address)","eeae1f4c":"allPlayerTokenContracts()","eeae5e4d":"sharesOfScheme(uint256)","eeaec245":"testInitial2of2()","eeaee3e4":"LIMIT_PER_USER()","eeafe7b0":"setACL(address,uint8)","eeb046b3":"BidAccepted(uint256,uint256)","eeb0af89":"amountMintPerDuration()","eeb2d26b":"getRateAt()","eeb3c910":"requestRedemption(uint256)","eeb415ee":"batchNewAuctions(uint128[],uint256[],uint256[],uint256[])","eeb441a4":"updateLoveStory(bytes16,bytes32,bytes32)","eeb46634":"getHolding(address)","eeb522aa":"ido()","eeb57139":"CollectMoney(uint256)","eeb58410":"AGCoin(uint256,string,string)","eeb64f0c":"PONADistributionContract()","eeb6588a":"donationsStartTime()","eeb72866":"identify()","eeb7ab0c":"checkImageInput(uint256,uint256,uint256[],bool,bool)","eeb7beb2":"designarHeredero(address)","eeb8a8a9":"upRoundID(uint256)","eeb8b934":"priceMultiplier(uint256)","eeb92294":"WithdrawalAfterGoalReached()","eeb9635c":"mintTokens()","eebb7fe9":"BDragon()","eebba256":"HOURLY_VALUE_DECAY_RATE()","eebbd2b7":"_transferFunc(address,address,uint256)","eebc20d2":"createCopyright(string,address,uint256,uint256,string,string,string,uint256,uint256)","eebc5a26":"_getFinance()","eebc7a39":"getPendingValidators()","eebcd477":"setIsBuying()","eebddedd":"Redemption(address,uint256,uint256)","eebdff04":"_bonusLucy(uint256)","eebe18cf":"startGamGetToken()","eebe41e0":"changePrefererForTask(address,uint256,address)","eebed750":"wDiamond()","eebf9808":"PiggyBank()","eec03444":"enableBundling()","eec0ddd7":"Holders(address)","eec11f64":"ABCTokenContract(address,address,uint256,uint256)","eec13165":"tokenTest()","eec1a391":"addBond()","eec2898a":"getRefundGasAmount(uint256)","eec2b628":"beforeExecute(address)","eec3589d":"_updateSaleInfo(uint256,uint256)","eec38cec":"set_pauseSale(bool)","eec3cb41":"placeBet(bool[],uint256,uint256)","eec3e2e8":"setLLV_edit_29(string)","eec3fcff":"CloseCrowdSale(uint256)","eec48ca5":"setReferralBonuses(uint256,uint256)","eec4bcef":"setMaxPrivateSaleBuy(uint256)","eec5d076":"getTotalUnvestedAndUnreleasedTokens(address)","eec5f1dc":"audit(address)","eec65b98":"transferToMainViaRelay(address)","eec65c58":"getOrderMakerTokenAmount()","eec69548":"BBTCToken()","eec6d500":"multiSend(address,address,address[],uint256[])","eec7006f":"roundThreeBlock()","eec71bea":"LogTokenIssued(address,uint256,uint256,uint256)","eec78546":"buy_Exchg_booking(address,uint256,uint256,address,uint256)","eec7faa1":"tokenAmount()","eec809ff":"setMonthWithdraw(uint256)","eec8d544":"CROWDSALE_TARGET()","eeca6afd":"CPSToken()","eeca6df7":"getFreeVines()","eecb24ec":"priceDecreaseRate()","eecb4a65":"GRETToken()","eecb7005":"useAsBankroll()","eecc3135":"DAICOCap()","eecc3be8":"all_creatures()","eecd2789":"left86(uint256)","eecd8876":"GexAlloc(address)","eece1e1f":"scheduleShuffling()","eece203a":"disableTransferAgreement(uint256)","eeced605":"addPrediction(bytes32,uint256,uint256,uint8,uint256,address,address)","eecf78b3":"makePurchase(uint256,address,string)","eecfb384":"icoBonus5EndDate()","eed02e4b":"joinGroup(uint256)","eed04e69":"preBuyPrice3()","eed0c172":"FoodSafetyChain()","eed0fc03":"generateFinalTokens(uint256)","eed11836":"getTreeSize()","eed331f7":"tokenOwnerNumberMax()","eed3f79e":"gameRefund(uint256)","eed45ca8":"setIsShareToken(bool)","eed47127":"TOTAL_MIND_TOKEN_SUPPLY()","eed50a32":"delegation(address)","eed65c11":"auctionSize()","eed7128c":"_generateRandomGenes()","eed72217":"addressToMinimumTextDonation(address)","eed7eaea":"getAirdropStatus(address)","eed857e1":"surrender(address,bytes32,uint256)","eed92ad5":"AdrenalinCoin(uint256,string,string)","eeda0e21":"earningsFromNumberOfCells(address,address)","eeda149c":"Register(address)","eeda22c6":"ownerPauseRecommend(bool)","eeda6357":"betCount_()","eedb1743":"removeSaler(address)","eedb714c":"CO_FOUNDER_PORTION()","eedb95c9":"changeZS(address,uint256)","eedb9ed5":"minPremium()","eedbd7eb":"ClosePatent(bytes32)","eedbe31d":"getCurrentStage()","eedc966a":"tokenBalance(address)","eedc9a8d":"IndorseToken()","eedcf50a":"mainDAO()","eedd1dd3":"doesProofExist(uint256,string,string,uint256,bytes32)","eede471e":"goToSleep(uint256)","eedf504d":"BG1Token()","eee007e2":"initialSingleWithdrawMax(uint256)","eee09758":"setMyCut(uint256,uint256)","eee0b552":"resetCallsCount()","eee0d9e2":"Elements()","eee14119":"PROSH()","eee144df":"getInitialSeedAsFixedPointForGameId(uint256)","eee187fd":"getMemberIdxOfUser(address)","eee1c59d":"oneHourAfterStartTime()","eee1e7e5":"calculateBurnAmount()","eee1f5f9":"getOwnedWineCountOf(address)","eee24219":"rateContract()","eee24570":"getPet(address)","eee2cc46":"returnEverything()","eee3671b":"wadmin_withdrawFund(uint256)","eee392c8":"initialTransfer(address,uint256)","eee3c4c9":"stageThreeCap()","eee428c0":"MAX_FUND_ASSETS()","eee457f7":"getContributionFromHash(bytes32)","eee56b7a":"takeout(uint256)","eee59ccf":"ownerAccessoryTransfer(address,uint64)","eee6ce93":"PRESALE_ETH_IN_WEI_ACCEPTED_MIN()","eee78595":"transferCustomToken(address,address,uint256)","eee881e8":"_stand(uint256,uint8[],bytes32,uint8,uint8,bytes32,bytes32,bool)","eee908ed":"changePriceCurveSettings(uint256,uint256,uint256,uint256,uint256)","eee92395":"fund(uint256,address)","eee94805":"getTokens(uint256,uint256,bool)","eee95f6d":"setbtyctoken(address)","eee97206":"double(uint256)","eeeb17e7":"deauthorizeMintFulfiller(address)","eeeb4f36":"ASTC()","eeebb30c":"changeRateWin(uint256)","eeec0e24":"relay(address,uint256)","eeed1767":"whiteListInvestor(address)","eeed1b26":"extensionTime()","eeed908a":"PublisherUnregistered(address)","eeee7cc0":"depositFiat(address,uint256,bytes32)","eeef9d55":"getAuctionIdArray(uint64,uint64)","eef017f1":"getCompte_2()","eef05f65":"setTokenIpfsHash(address,bytes)","eef0ef1e":"changeTeamPoolInstant(address)","eef0fdbe":"closeLoanOnBehalfOfRecurse(address,address,address,bytes32,uint256)","eef1812d":"settingsIco(uint256,address,uint256,uint256,uint256)","eef21cd2":"removeCaller(address)","eef22a79":"MultiAirDropToken(uint256,string,uint8,string)","eef27913":"ContractFeeChanged(uint256,uint256)","eef3a0fa":"PPPC(uint256,string,uint8,string)","eef3c914":"DelegatedTo(address)","eef44945":"Sudosucks()","eef49ee3":"deposited()","eef547d7":"deal_details(uint32)","eef55c72":"getBallotOfSender()","eef5a499":"createProductionUnit6()","eef5acb4":"SubscriptionDepositReturned(uint256,uint256,address,address)","eef5bfae":"UpdateSavingsBank()","eef68db5":"gameFinished(uint256,uint256,uint256,uint256)","eef6f89d":"bonusClosingTime1()","eef719b1":"getQuarterResult(uint256)","eef72a3c":"claimTokens(address[])","eef73ebb":"setSaleRate(uint256)","eef73ff9":"Devs_Supply()","eef7dd0a":"GetBetId(uint256,uint256)","eef80bbc":"getData_11()","eef892aa":"tokenMint(address,uint256)","eef8e35f":"setChainyURL(string)","eef90cbe":"tokenPublicSale()","eef93611":"GetDChainRevokableHash(bytes32,uint32)","eef9495c":"CABoxToken()","eef94a21":"createT513many(uint256,uint256,address)","eef9c27c":"requestTokens(uint256)","eefa597b":"isToken()","eefa5dfc":"PingPaid()","eefb9538":"setData_32(string)","eefc3083":"tokenColors(address)","eefe3818":"createOpenAndLock(address,address)","eefe8527":"MysteriumPricing(uint256)","eefea6b7":"feeFromTotalCostForAccount(uint256,uint256,address)","ef006b65":"presaleBonusTier4()","ef0143a3":"sendPixelsToMarket(bytes32,uint256)","ef01db0e":"assignItemRafflePrize(address)","ef02ad08":"getTokenInfoDataTracking()","ef02ce46":"Rafatar()","ef02d5d6":"durationCrowdSale()","ef0377fd":"SomaIco(address,address,address,uint256,uint256,uint256)","ef043c5a":"Netkrone()","ef04fdb7":"buyShares(bytes,uint8,uint256,uint256)","ef051f0c":"BlankCanvas()","ef057245":"SECUREOURSCHOOLS(uint256,string,uint8,string)","ef0582b6":"addEpisodeData(uint256,uint256,uint256,string)","ef058f52":"getGoldInfoVendor(address)","ef05bf0e":"ROUND_2_PRESALE_BONUS()","ef05dc2f":"modX(uint256)","ef0614b9":"getItemIds()","ef069ae3":"changeSaleMinimum(uint256)","ef07a81f":"getDonation(uint256)","ef084006":"unholdDate()","ef0901b8":"_gapOfCubeSum(uint256,uint256)","ef096063":"PollCreated(uint256,uint256,uint256,uint256)","ef0a14f8":"removeAddressFromAdmin(address)","ef0a3046":"sendOutEther()","ef0ad164":"testContractOrNormal(address)","ef0aea3c":"getisPlay(bytes32)","ef0b2368":"bytes32ToStr(bytes32)","ef0b44db":"bonus2Ends()","ef0b4db3":"markAsProject(address)","ef0b5420":"getOwedDividend(address)","ef0dbcbb":"setContractAt(uint16,uint16,uint8,address,address)","ef0dd241":"minCapTokens()","ef0dddba":"earlybonus()","ef0e239b":"getService(uint256)","ef0f52bc":"hodlAdded(uint256,address,uint256,uint256)","ef110f49":"TotalDeposits()","ef115542":"clearStorage(uint256[])","ef11e18b":"log_transfer(address,address,uint256)","ef11e55b":"isEarlyBonus()","ef11ef3d":"HubiiNetworkTokens()","ef125360":"removeWhiteListed(address)","ef12af52":"ReentrancyMock()","ef1367dd":"setLanguages(bytes3[])","ef14124f":"getAmountToUpdate(uint8)","ef14a0f6":"CBITToken()","ef14adc7":"sellingEnable(uint256)","ef15c51c":"deleteRoomByRoomID(uint256)","ef1706ce":"drainTokens()","ef18374a":"getOwnerCount()","ef18e458":"frozenTransferFrom(address,address,uint256,uint256,bool)","ef18e9ed":"acceptOrder(uint256)","ef1961b4":"Dropped(bytes32,address)","ef19792a":"licenseTerms(bytes32)","ef19c332":"_checkSigned(bytes32,uint256,uint8,bytes32,bytes32)","ef1ad460":"DAPPStoreToken()","ef1bfef9":"m_sharedDividendBalance()","ef1e5663":"updateBalances(address,uint256)","ef1e7e3f":"deauthorizeBurnFulfiller(address)","ef1e8dae":"lastBlock_a13()","ef2025c2":"burnTokenStatus()","ef20bff8":"getSpawnLimit(uint32,uint256)","ef21059e":"cancelEth(uint256)","ef220233":"getGrid8()","ef228e1a":"UCASH()","ef229dc7":"setStepMoney(uint256)","ef22b87f":"executeTransaction(address,uint256,uint256)","ef233f5c":"RELEASE_THRESHOLD()","ef23b3a3":"quotaOf(address)","ef24b77c":"RegisterNewKey(address,address)","ef24bd6b":"ESCBTokenSale(uint256,uint256,address,uint256)","ef2573fc":"calculateHouseCutAmount(uint256)","ef265d6d":"burn(uint256,address,address)","ef26e41d":"whiteLister()","ef284d8f":"DiscardToken()","ef289d8d":"NewKing(uint256,address,string,uint256,uint256,uint256)","ef29a7e5":"emitWorkFinished(uint256,uint256)","ef29d2bb":"setNeighbourRewardPercentage(uint256)","ef2a9147":"balancesListAddressMap(uint256)","ef2b04d1":"callBtcWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","ef2b7d65":"publicGetParticipant(uint256,uint256)","ef2bbbdf":"updateEndDate(uint256)","ef2bd19e":"getDisapprovalsFor(address)","ef2c5842":"_getTknAddr()","ef2cc977":"MAX_AIRDROP_TOKENS()","ef2d44c3":"setChampForSale(uint256,uint256)","ef2d5786":"createDelegation(address,uint64,address)","ef2d8700":"getDocuments()","ef2ddb55":"presaleUnfreeze(uint256)","ef2de6f8":"ownsPlayerTokens(uint32)","ef2e2059":"resetGenesisBlock(uint256)","ef2e3fbc":"getTokenInfoHeritor(address)","ef2e7321":"INITIALGASFORORACLIZE()","ef2e7c48":"IMDEXtrade(uint256[8],address[4])","ef2e95d7":"ubdateBTC()","ef2f2750":"request_payout_users()","ef2f92ad":"forfeitShares(uint256)","ef2fa169":"setServiceFee(address,uint256)","ef2fd54d":"viewVotes()","ef303553":"athleteCanClaimPercent()","ef3088d1":"AirDropRedeemAFTK2()","ef31bfd1":"isValidSignatureAndMethod(address,address,bytes)","ef3229db":"addTokenFunds()","ef323d85":"getPlotPrice()","ef326c6d":"isOps(address)","ef3336f5":"paymentsByBenefactor(address)","ef3377ca":"devWalletLocked()","ef338b88":"seekOdd(uint256,uint256)","ef339fc4":"getTokenProxyAddress()","ef33f8f0":"bet1000_001eth()","ef343588":"trade(uint256[8],address[4],uint8[2],bytes32[4])","ef34ded2":"lottoLength()","ef35b59d":"_withdrawTokensToWallet()","ef35cdbb":"getLLV_edit_30()","ef35d902":"preIcoEnds()","ef35fc16":"HIGH_RANGE_RATE()","ef3613c3":"allEth()","ef36a883":"termsAndConditionsAreSigned(address,uint8,bytes32,bytes32)","ef36fa39":"fpart(int256)","ef37052d":"isArrAccountIsNotFrozen(address)","ef37cfe9":"getBetsCountAndValue()","ef37f061":"IPOcoinHotelShares()","ef387a50":"rateIco()","ef38a306":"genWallet()","ef38d089":"UpdateSellAgent(address,address)","ef394e1b":"getFastest(uint16,uint8,uint8)","ef39fe35":"updateSaleStageManually(uint256)","ef3a6031":"testBaseToken()","ef3aaf54":"setHouseAddress(address)","ef3adfb3":"XPAAssets()","ef3b70bc":"setMultiRequestRegistrar(uint256,address)","ef3bec3d":"endow(address,uint256)","ef3c0531":"contentHostById(bytes32)","ef3c64a8":"IcoTokenMock()","ef3cbc39":"minOrderEthAmount_()","ef3cdb2f":"upgradeM5Token(address)","ef3d622b":"EOSBetBankroll(address,address)","ef3e8869":"claimStarter(string,uint256)","ef3f7c55":"TokenSold(uint256,string,uint256,uint256,address,address)","ef406d01":"TokenEBU(uint256,string,string)","ef4080bd":"init_pre_ico(address)","ef40c3e6":"tokenSwapLock()","ef416aec":"firstMonthEnd()","ef41e06f":"testThrowSetEnforceRevisionsNotOwner()","ef41ea7e":"feePerc()","ef41f95a":"newProposal(string,address,uint256,address,uint256,bytes)","ef427776":"internalCalculateBonus(uint256,uint256,uint256)","ef42b5da":"withdrawFunds(address[])","ef430aa6":"category()","ef431437":"lastDayPaid()","ef43a2b8":"ChangeEmissionRateCoefficient(uint256)","ef449888":"allowsNewGames()","ef4592fb":"getResult(bytes)","ef464e19":"internalRelease(uint256)","ef46e0ca":"executeOrder(uint256,uint256)","ef474056":"changeOpenString(string)","ef47492b":"summFoundersShare()","ef4787a1":"getIsLimited()","ef47ff4b":"balance(uint8)","ef4886ef":"retrieveVanityForWallet(address,address)","ef48eee6":"pay(uint256,uint256)","ef49567e":"E_Bid(address,uint256)","ef49b414":"isGladiatorChest(uint256)","ef4a0c61":"ico_starting_supply()","ef4b31d8":"proxySetup()","ef4b6831":"callModifiedDeposit(uint256)","ef4b91c0":"ProxySender(address)","ef4ba598":"offerPriceEth(uint256)","ef4bdfdd":"Set_your_game_number_between_1_15(string)","ef4c8685":"LogNewWallet(address)","ef4d6149":"investedAmoun(address)","ef4e679b":"totalNtsSold()","ef4ec047":"addFounder(address)","ef4ef103":"bankrollExternalUpdateTokens(uint256,uint256)","ef4f0c5f":"changeExtraBets(uint256)","ef4f6e9c":"calcUnMaskedEarnings(uint256,uint256)","ef4fac01":"calcTotalTokens(uint256,uint256)","ef4ffee2":"Honestgamble()","ef5121b3":"appreciationRateWei()","ef520aba":"getall_horsesCount()","ef52ad21":"MintMade(uint256,uint256,uint256)","ef52b0dc":"RuneToken()","ef532a47":"addBagAndGift(uint256,address)","ef538593":"NeptaToken()","ef54801b":"getGrantBeneficiaries()","ef548aaf":"PLAYER_TURN_SINGLE_PERIOD()","ef54af8b":"TieToken(address)","ef551b38":"PaymentAddress(address,bytes4)","ef556029":"testFallbackIsCalledOnTransfer()","ef5793c2":"LOG_OwnerWithdraw(address,uint256)","ef57cbec":"BARToken()","ef5850c7":"stakersForPoll(bytes32)","ef589693":"getSMPTokensBoughtInICO()","ef599ba5":"getCoinBalance(bytes4,bytes32)","ef59f8c8":"setRaffleAddress(address,address)","ef5a3a88":"dividendsIndex()","ef5a625b":"disqualify(address)","ef5a80af":"ProductAdded(address,address,address,string,bool)","ef5a8fb5":"sellLand()","ef5ba9ed":"ALLOC_AIRDROP()","ef5c2010":"SelfPayPreSale(uint256,uint256,uint256,uint256,uint256,address,address)","ef5d5331":"isHashValid(bytes32)","ef5daf01":"_dumpToCompany()","ef5f937c":"OpportyToken()","ef5fad95":"DaWeiToken(uint256,string,string)","ef5fb05b":"sayHello()","ef5fbdb2":"stopPlaying()","ef5fd51b":"getKeys(uint32,int256)","ef61041c":"_approveAllArgs(address,uint256,address)","ef616584":"getPurchaseETHNum()","ef6506db":"credit(address,uint256)","ef660169":"withdrawRest()","ef660ab8":"deliverCandidate(uint256,uint256)","ef674e66":"isWhiteListed()","ef67caa0":"reservedTokensFounders()","ef685294":"addCascade(address,uint256)","ef688df5":"addFundraiser(address)","ef68913c":"dronesDeployed()","ef69f408":"protectedTransfer(address,address,uint256)","ef69f7d9":"ManagerRemoved(address)","ef6a676d":"allowTransferToken()","ef6a6bcc":"LogAddressCapExceeded(address,uint256,string)","ef6a88de":"AbstractQuintessenceToken(uint256,uint256)","ef6ac0f0":"run(bytes32)","ef6b141a":"setStarted(bool)","ef6b329a":"close_down()","ef6c4b93":"addLimitAddress(address)","ef6d1cc8":"QZToken(string,string,uint8,uint256)","ef6d7b3b":"emitCancelled(address,uint256,uint256)","ef6da43c":"setIsWeiAccepted(bool,uint256)","ef6f1f36":"setData_25(string)","ef6f8e92":"Creative()","ef6face6":"privateContribution()","ef706adf":"cancelOffer(uint256)","ef70aebf":"endMinting()","ef71a1f2":"BCREWARDS(uint256,string,string)","ef7293d7":"SELLER_STEP_4_ACCEPT(bytes32)","ef739d0f":"changeCountry(uint256,bytes2)","ef7507c8":"testWinner(uint256)","ef765af8":"erc20ApproveChecking()","ef76c060":"HPQToken(address)","ef778d30":"createProject(address,string,string,bytes32)","ef77b601":"SHAREFIDENCE()","ef77ed99":"isFundingState()","ef78a5b2":"singleUserSignUp(address,address)","ef78d4fd":"period()","ef79a35f":"getNumberOfLocks(address)","ef7a4a32":"logoId()","ef7a5956":"BRONZE_AMOUNT_SKL()","ef7a5a2a":"getIudexScoreAll(address,bytes32)","ef7ac0e5":"enableTransfer(bool)","ef7c7797":"getSaleContractDepositAddressVerified(address)","ef7c9ecd":"preIcoTotalSupply()","ef7d47a5":"setMinBlockPurchaseInOneGo(uint256)","ef7dbc54":"listCompetitors()","ef7dd831":"SUPPLY_FOR_ADVISORSL()","ef7e1e89":"pow()","ef7f23a6":"numberOfBlocksBetweenSupplies()","ef7f2e1c":"addHashrate(address,uint256)","ef7f3834":"grantInitialAuthentication(address)","ef80027e":"Members_info(address)","ef802e62":"tokensRemainingStage2()","ef804ead":"testInequalityBytes()","ef80c53a":"earlyReserveBeginTime()","ef80f1ab":"LitmusCrowdsale()","ef80ff18":"tokenExchangeAddress()","ef816fd9":"isState(uint256,uint8)","ef817f2a":"EtherZaarFactory()","ef81eb57":"removeLastSaleOnlyNotActivated()","ef82c8a8":"geProposalCount()","ef82f95c":"setFront(address)","ef8322fd":"queryRoles(address)","ef84e27f":"getWorkpointSupportCancel()","ef8594be":"setPriceStep6(uint256)","ef85fdad":"IRC_PER_ETH_SALE()","ef869443":"investWithCustomerId(address,uint128)","ef8700e5":"tokensForDevelopment()","ef885772":"GCCERC20(uint256,string,string)","ef890cc8":"isGameFinished()","ef898355":"revealHiddenPosition(uint32,int64[2],bytes16)","ef89d6e3":"getArmorValue(uint256)","ef8a22ac":"mineableTokens()","ef8a9235":"currentStatus()","ef8a9c8f":"allocatedStage()","ef8b0e15":"processContribution(address,uint256,uint256)","ef8c1d86":"ownerWithdrawParsecs(uint256)","ef8c2c58":"openModifyCountdown()","ef8c8944":"setPlayerId(uint256)","ef8d4a49":"getAssetIDForTypeSequenceID(uint256,uint256)","ef8dcc2e":"LogTransactionConfirmed(bytes32,address,uint256)","ef8dd09b":"deleteEntry(bytes32)","ef8e8069":"smallPrice()","ef8ea3d0":"NewRegistration(uint256,address)","ef8f1229":"EMISSION_FOR_SALESTAGE3()","ef8fdfd8":"Bonus()","ef902a0c":"ShowBool(bool)","ef9089d6":"nextPrice()","ef90aa46":"givenBountyTokens()","ef9124e1":"TrinityToken()","ef9130b9":"getBetItemCount()","ef921826":"setMaxDuration(uint32)","ef922305":"DACCToken()","ef92742e":"ICOmint()","ef92b384":"saveGenCode(address,uint256)","ef940837":"payday(uint256,address,uint256)","ef941dca":"issueTokens(uint256,string)","ef943909":"PublisherAddress()","ef94ce1e":"addMenu(string)","ef9521ea":"GruffinzContact()","ef95aa5d":"getManifest(address,bytes32,uint256)","ef961367":"registerForCompetition(address,uint8,bytes32,bytes32)","ef982eba":"settournamentPrizeAddress(address)","ef984923":"transferTenuousTokenOwnership(address)","ef98dea3":"getAuctionManagerAddress()","ef99c9ef":"DACVest()","ef9b0214":"read_i32_array()","ef9b559a":"CLX()","ef9bfe1a":"returnInvestors()","ef9c3512":"falconmasterReq()","ef9c4446":"cancelProposeTo()","ef9c52ea":"maxIco()","ef9c79da":"getFileNum()","ef9cb474":"changeWorkerPoolPolicy(uint256,uint256,uint256,uint256)","ef9da13d":"getPeriodOwnerLockedBalance(uint256)","ef9e7f95":"self_readyTime()","ef9f6023":"PUBLICSALE_SUPPLY()","ef9fc1de":"DelegateChanged(address,address)","ef9fc50b":"addNumbers(uint256,uint256)","ef9fe3ac":"setCompte_8(string)","efa08854":"companyShare()","efa0a1ef":"SettankImposedMax(uint256)","efa0e659":"EthX()","efa1c34c":"destroyChannel(address)","efa227ca":"finish(uint16)","efa25196":"getDevidends()","efa390f6":"createNewEvent(bytes32,string,uint256,uint256,string,string)","efa3d586":"add(address,uint8,uint256)","efa3dccd":"totalDividendsPerCoin()","efa408de":"setReservedTokensListMultiple(address[],uint256[],uint256[],uint256[],bool[])","efa40c2a":"engine(string,string,address)","efa4f94d":"computeDeadline()","efa52fb3":"iterateGet(uint256)","efa56a1e":"use_OEM_Parts(bytes32,uint256,uint256)","efa6fd63":"perTransactionRate()","efa726e8":"setEggLimit(uint16,uint16)","efa74f1f":"getTokenBySymbol(string)","efa7e56b":"GameEnds()","efa85335":"Registrar_Oraculo(address)","efa8d998":"GetEtherSpent(address)","efa94e47":"createToken(bytes32,string,string)","efa99ecf":"SubModuleSuspended(uint256)","efaa55a0":"joinGame(uint256)","efaa86b1":"claimTeamTokens(address)","efab1e50":"getInvestorDetails(address)","efab4b91":"_unpackIntelligenceValue(uint256)","efabaa89":"sortTrusted()","efac0fd0":"PowerEvent(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address[],uint256[])","efac4db4":"add(address[],uint256)","efacd73b":"_createRocHunting(uint256,uint256)","efad6df3":"cycleLimit()","efada80b":"getRunDetails(uint256)","efada94b":"setParentPayoutDistributionHash(bytes32)","efae0f2f":"AIR_1()","efaf8e22":"isSenderRegisteredAgent(address)","efaf90c8":"DAYS_31()","efb0cdd9":"MeTooToken()","efb109d4":"privlocatum(string,string,uint8,uint256)","efb173d4":"addCompany(uint256,string)","efb1900d":"deleteThisContract()","efb20f6a":"Worldcoin1()","efb23d73":"getFirstHexByte(bytes1)","efb2bfd3":"signatureChecker()","efb369c7":"transferFundsByOwner(address,address)","efb588e4":"presaleMaxValue()","efb610bc":"isExternalBuyer(address)","efb7601d":"getExchangeRate(address)","efb7e8b3":"mistakenTokens()","efb7fa77":"unLinkFromMasterWallet(address,address)","efb8b6b1":"after10Seconds()","efb95ced":"masterRewardsPercent()","efb98bcf":"getRemainingTime()","efba9bd2":"recoverLeftovers()","efbb5f17":"retrait_2()","efbb6108":"transferStbToOwner(uint256)","efbbbd65":"getLambo(uint256)","efbbe160":"abiDecodeRegister(bytes)","efbc0075":"transferOwnerShipToPendingOwner()","efbc5469":"addTransaction(address,uint256,uint256)","efbcae98":"deleteMemberOfCommunity(address,uint256)","efbcebe5":"ObsToken()","efbd4bff":"priceForRect(uint256,uint256,uint256,uint256)","efbd863e":"setRealTokenPrice(int128)","efbd8a92":"setPriceFactor(uint256)","efbd9ec2":"changeList(address,bool)","efbe1c1c":"end()","efbe31d5":"removeHoldByAddressIndex(address,uint256)","efbe3894":"MakePatient()","efbe4262":"_removeSuperInvestor(address)","efbe584d":"isDEditor(bytes32,address)","efbe62e8":"validate(uint256,bytes)","efbe8fd1":"createToken(string,string,string,uint256)","efbec487":"payBoss(uint256)","efbee9b3":"_stake(address,bytes32,uint256)","efbf7d83":"GrowGuildToken()","efc018cc":"coupDetat(address)","efc0712c":"activateGladiator(address)","efc139cd":"SmartBooking()","efc1ba92":"FakeMembershipRegistry(address)","efc1c0ab":"SimpleNameRegistry()","efc2fd2a":"getRefillStatFor(string)","efc3323c":"createEvent(bytes16,bytes16[],bytes16[],uint256[])","efc3d252":"GetLuckyLandIds()","efc4cbdd":"Fiocoin()","efc4f1dc":"switchSaleState()","efc58aea":"spawnAsset(address,uint256,uint256,uint256)","efc5c693":"executeSell()","efc63bd3":"_rawGetGlobalDelegation(address)","efc65b3a":"CindicatorIssued()","efc7285c":"mintPresaleWithBlock(address,uint256,uint256,uint256,uint256)","efc7652e":"getBAU2(bytes32,address,uint256)","efc77f3f":"LTHToken()","efc78401":"isSenderAllowed(address)","efc81a8c":"create()","efc82381":"FirstTimeTransfer()","efc8d3c6":"amountReservedRefsTokens()","efc927b9":"ShowEmissionRate(uint256)","efca0214":"HotPotToken()","efca2eed":"totalDistributed()","efca9f09":"minimumPurchaseLimit()","efcb6cde":"changeOwner(bytes32,bytes32,bytes32,address,string,bytes32,bytes32)","efcc3c7f":"getMiniPoolEdit_3()","efcceaae":"getGamePaused()","efcd1cd9":"signatureSplit(bytes)","efcd2ddd":"changeOracleAdd(address)","efcd853f":"DogezerPreICOCrowdsale(address,address,address,address)","efce0688":"createPrometh(address)","efce079e":"doQuest(uint256)","efce1d66":"BitEyeEx(address)","efce6e78":"PinkyToken()","efce828e":"skinCreatedNum()","efcee869":"vote(bool,string)","efcefb40":"withdrawAllFor(address[])","efcf095c":"viewNumberOfMemories()","efcf2479":"trim(string,string)","efcf2730":"_premint(address,uint256)","efcf4f41":"getPixel(uint16)","efcf6d68":"finanReserveTimeLock()","efd0c851":"getPayoutReadyState()","efd0f455":"getChStatus()","efd12624":"startPostICO()","efd2abec":"calculateAntBuySimple(uint256)","efd2fb9b":"DeltaToken1()","efd46e1d":"E4RowEscrow()","efd4d0a6":"finishedloading()","efd6479a":"publicGetUserInfo(address)","efd64af9":"getReportingWindow()","efd71eb0":"updateVaultWallet(address)","efd7313d":"setExists(bytes32,bool)","efd73adc":"MigrationFund()","efd76499":"_cancelOrder(address,uint256)","efd8871a":"revoke(bytes32,address)","efd8c379":"userXRTBalance(address)","efd979cb":"setMinimumEtherToAccept(uint256)","efd9d7e0":"KoosAlbertsToken()","efdc4d01":"extraReceiversLength()","efdc5b77":"change_nodelist(address)","efdcb506":"getMsgGasBefore()","efdcc0f8":"getTeamTokens(uint256)","efdcd974":"setFeeReceiver(address)","efde6dcf":"Rejected()","efde9d6e":"InitChallengeAddress(address[10],address,uint256[10])","efdea046":"test_3_someTest()","efdecd9b":"check_withdrawdao()","efdee94f":"deployerAddress()","efdff7bb":"getContractAddressById(bytes32)","efe08a7d":"changeAddress(address,address)","efe0e495":"calculateVestedTokensNumber(uint256,uint256,uint256,uint256,uint256)","efe1525e":"viewFeaturedLength()","efe213a9":"_getCurrentPeriod()","efe2c8a4":"setConsumerAddress(address)","efe37d6f":"ELTTokenImpl()","efe3f4f4":"determineInterfaceImplementationStatus(address,bytes4)","efe43338":"determineWinner(uint256)","efe4e0a1":"iterateThroughSwarm(address,uint256,uint256)","efe51cca":"state2()","efe6bfa3":"sellOrders(bytes32)","efe6c772":"MAX_PLAYERS_PER_STAGE()","efe79268":"PRICE_STANDARD()","efe7a504":"END()","efe7c791":"RANGESTART_5()","efe86dd5":"batchPunchOut(address[],uint64[])","efe89d5a":"tokens2owners(address)","efe8c94f":"_safeSub(uint256,uint256)","efe93036":"getListTeamByPlayType(uint256)","efe998b9":"ethDividendAmount()","efe9b08d":"dissolve(address)","efe9e86b":"MyPinerTokenTest3()","efea0172":"startIco(bool)","efea835a":"devfeesoutstanding()","efeb4ad7":"onMoneySent()","efeb5e58":"beneficiaries(uint256)","efeb5f1f":"addWallet(address)","efeb941d":"ICOstart()","efebc720":"swapEndTime()","efecab8a":"addSale(address,uint256)","efed160f":"func_0431()","efed7b0a":"fondPlatform()","efedf429":"admin_member_isWithdraw(address,bool)","efeecb51":"getNumberOfTokens()","efef39a1":"purchase(uint256)","efef445b":"transferDataFrom(address,address,uint256,bytes)","eff02ec5":"returnBorroweedEth()","eff134ee":"withdrawTokenOwnerReward()","eff14c78":"submitValue(bytes8)","eff24744":"getTaskAddress(bytes32)","eff26a3b":"checkExist(address)","eff35f75":"setTickTime(uint256)","eff38f92":"getQuestion()","eff3c4e7":"openForPublic()","eff413ad":"setGoldMigrated(address,bool,string)","eff5c266":"addToMemeList(string)","eff60f56":"LRXCOIN()","eff631cf":"setNewPeriod(uint256)","eff6be2f":"changeBaseFee(uint256)","eff6e83d":"getIndexOrder(uint256)","eff7ed65":"setExchangeRateETHToUSD(uint256,uint256)","eff841d1":"setReserveWeight(uint256)","eff867e5":"CruzeiroToken()","eff877e2":"calcTokenPriceInWei()","eff883bd":"takerSellAsset(uint256)","eff8e748":"discountRate(address)","eff91c7e":"getLatestId()","effa00a6":"isIQTDistributed()","effb8415":"set_recivers(address,uint256)","effbbf92":"enableDisableTokenProxy()","effc4c1f":"throwIfLocked()","effcd413":"wallstreet2()","effd88b7":"ethToWei()","effda074":"addFactoryToCP(address,address)","effe031e":"payBankRoll()","efff1fb9":"_collect(address,uint32,uint32,uint32)","efff718d":"BITBIX()","efff78a5":"setRule(uint16,uint256,uint256,uint256,uint256)","effff82f":"valueToken()","f0004ab4":"PRIVATESALE_TOKENCAP()","f0006707":"setWriteTimestamp(bytes32,uint256)","f000999e":"upgrade(address,address,address)","f0024677":"deleteTellerMods(address)","f0032567":"computeFare(uint16)","f00388f7":"give(address,uint256)","f003a487":"unpauseCrowdsale(address)","f004073a":"performAction(uint256)","f00423ac":"XXXcoin()","f0044924":"BitGemPlayToken(address,address)","f004b12b":"CrowdFund(uint256,uint256,address)","f0061866":"deleteCourse(address)","f006228c":"guardian3()","f00648b8":"withdrawCoreTeamTokens()","f0072795":"itemsRange(uint256,uint256)","f007557f":"IPXTokenBase()","f0075829":"isValidPubKey(bytes)","f0083250":"canImplementInterfaceForAddress(address,bytes32)","f0086703":"setNextMilestone(uint256,uint256)","f008be46":"currentTierDiscountPercentage()","f009347d":"KudosProxy(address)","f00989a8":"FOUNDING_TEAM()","f00aac7f":"ArrayRR()","f00ac1da":"Login()","f00acc47":"prepareRoll(uint256,uint256)","f00c67fc":"Bounty0xEscrow()","f00c7669":"lastBlock_v2()","f00c9e67":"testStoresChallengeOwner()","f00d2823":"TokenMinted(uint256)","f00d4b5d":"changeOwner(address,address)","f00d7326":"isSenderInvestor(address,address[])","f00db260":"underwriter()","f00e4129":"EmergencyFundingReleaseApproved()","f00e6a2a":"getTarget()","f00e6f0a":"getResultData(uint8)","f00e8651":"createRequest(address[2],address,uint256[11],uint256,bytes)","f00f087f":"operationsPercent()","f00f7b33":"loseOdd()","f00f9b4d":"transferForMining(address)","f00ff174":"verifyWithdraw(bytes32,bytes32)","f0109f84":"valueAirDrop()","f010b6e5":"wipeBlackListedTrueUSD(address)","f011a7af":"claimProfit()","f011e270":"_payoutWinner(uint256,uint256,uint256,uint256)","f0123bc2":"dtStart()","f0137edf":"tokensFor1EthP3()","f013e0e1":"setWhitelist(address[],uint256[])","f0141d84":"getDecimals()","f0144a91":"dataset_md5checksum()","f0149751":"getTotal(bytes32)","f0149b9d":"ZenswapNetwork()","f01551f6":"difficultyAdjustmentPeriod()","f015bc93":"PRESALE_ADDRESS()","f0163621":"changeDomain(uint256,uint256,address)","f0163a82":"getNobleBalance()","f0173703":"ROLE_ORACLE()","f0174a25":"initMetadataDisable()","f018f741":"isPresidenteDeMesa(bytes32)","f019bd5e":"_generateOrder(address,address,address,uint256,string,string,string)","f019c267":"decreaseApproval(address,address,uint256)","f019c5da":"expReward()","f019c941":"SLAV()","f01b896f":"ambi2()","f01cc531":"setMonarchyRewards(uint256,uint256)","f01dbd03":"rewardAddressesSet()","f01de8c3":"getNextBattleTime(uint64)","f01e0648":"Voted(address,address,bool)","f01e341b":"addPostOnUser(address,address)","f01e66ec":"getAvgPrice()","f01eddda":"claimMyApis()","f01ee2cf":"sendERC20Tweet(uint256,string,string,string,string)","f01f20df":"burnPercentage()","f01fe692":"create(uint256,address)","f020044f":"gameActive()","f02011a8":"StatusContributionMock()","f0204007":"allocateTokens(uint256)","f0206a0d":"DayToken(string,string,uint256,uint8,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","f0207fb1":"_commission()","f020bfe1":"McCringleToken()","f020d093":"applyInsurance(bytes32)","f020f279":"balanceWinPoolForSecondStage()","f02137c8":"updateTicketPrice(uint256)","f02152ab":"sponsorOpinion(uint256,uint8,bool)","f02175c7":"checkNewOwnerArgs(uint256,uint256,uint256)","f0217c32":"changeSaleBlocks(uint256,uint256,uint256)","f0217ce5":"permit(bytes32,bytes32,bytes32)","f02286c1":"topUpLuck(uint256)","f022a694":"ToxbtcToken()","f022a867":"unholdMntp(address,uint256)","f022d9f6":"setContractProtection(bool)","f023d600":"purchase_address()","f0247f78":"maxQtyInFp()","f02694f6":"SetStartVesting(uint256)","f027c7e0":"initOptionProgram()","f027d1f0":"setC4FContractOwner(address,address)","f0285b96":"_ownerSupply()","f02895e4":"ICO_ADDRESS()","f0296bfa":"setRefBonus(uint256,uint256)","f029e102":"SandwichShop()","f02a306e":"timeoutXEnabled()","f02a4463":"SkyExchange()","f02d7ef0":"issued(address)","f02dd53f":"getLand(uint256)","f02e0b3c":"SALE_IN_PROGRESS()","f02f1b6f":"getDailyLotteryParticipants(uint256)","f02f3a89":"oem_share()","f02f85c5":"timeOfLastBlock()","f02fc78f":"batchRegularTransfers(bytes32[],bytes32[])","f02fff9d":"Fcoin()","f0303452":"approveAll(address,uint256[])","f0314df0":"addTrustedContract(address)","f031a4d2":"TasksHandler(address,uint256,uint256,uint256,uint256)","f0330d54":"claimTwitterBonus()","f03342ad":"initiatedBy(address)","f0342179":"setPriceUnits(uint256)","f0349d5f":"setupStages()","f0350c04":"transfer_ownership(address)","f03529c3":"setMasterFeeContract(address)","f0356a36":"balanceOfContractFeeEth()","f036417f":"setTokenSymbol(address,string)","f0366c45":"imageExists(uint256)","f0369550":"getStage0Cap()","f036b592":"getBonusFactor(uint256,uint256)","f036ed56":"addResources(address,address[],bytes4[])","f0375c55":"SudanGoldCoinToken()","f038a969":"createScanner(uint256,string,uint256,uint256,uint256)","f038e106":"CKAOTToken()","f039218a":"Robycoin_test1()","f039d9d5":"totalPicks()","f03a1bc6":"addBet(address,uint256)","f03a5687":"reinvestDividend()","f03a6872":"bitmask_add(address,uint256)","f03aa262":"noContributors()","f03b0c0b":"setMultiSigWallet(address)","f03b7c70":"addComment(string,address,bool,uint256)","f03b8bf5":"UoBAMZNToken()","f03bcc7f":"submitAudit(address,bytes32,bool)","f03c0e8f":"D3JDemo(uint256,string,uint8,string)","f03c58ca":"test_feePoolShare_isTranscoder()","f03c7c6e":"pit()","f03c867a":"ownerDisablePayee(address)","f03d43ed":"updateTokenTicketPrice(uint256)","f03d7d2f":"transferReferralFee(address,uint256)","f03dc3d3":"getUsedReveralSupply()","f03dc4e4":"private_setMinGamePlayAmount(uint256)","f03dc5ef":"publicKeys(bytes32)","f03dd010":"WithdrawalETH(uint256)","f03de5fe":"buyHLPMT()","f03e5de5":"isDisputeActive()","f03e786a":"approveAndCall(bytes,address,address,address,uint256,uint256,uint256,uint256,bytes)","f03fbf2f":"CheckChangePlatformFlagAndAddAccountsInfo(address,address,uint256)","f03fed22":"nwmToken()","f040d973":"ERC20Token(string,string,uint8,uint256,address,address)","f0413191":"badge(uint8,string,bytes)","f04182d8":"insertProposal(address,uint256,address)","f0419588":"reply(uint256,uint8)","f0425fe1":"swappedTokens()","f04303e3":"setSealableProperty(address,uint256,bytes32,bytes32)","f0437a36":"getMyCommitmentHash(uint256)","f0439e0f":"removeExpiredName(string)","f044632f":"loikikdid()","f0446e02":"testFailMintNoAuth(int256)","f0456691":"PrevOwner()","f0459440":"readPermissions(address,uint256)","f046395a":"subscriptions(address)","f04646fe":"roll(bytes)","f04686aa":"LogOrderCreated(address,address,address)","f046cdec":"private_setHouseEdge(uint256)","f0474350":"proposalWeight(uint256)","f0479392":"poolAdd(uint256)","f047a528":"isRoundingErrorCeil(uint256,uint256,uint256)","f047d077":"cancelBuyNowOffer(uint256)","f0485328":"setAccessory(uint8,address)","f04893c2":"modCFOAddress(address)","f048b97f":"userPurchaseNumMap(address)","f04961ba":"getEther(uint256)","f04991f0":"deposit(int256)","f04aa255":"_transferAvailable(address,address,address)","f04be582":"tokentBalance(address,address)","f04bf0c5":"updateTrustScoreInBulk(address[],uint256[],uint256[])","f04cb80c":"setInvestorDataAndIssueNewToken(address,uint256,uint256,uint256)","f04d4d55":"deactivateLineItem()","f04da65b":"getShares(address)","f04e2b45":"_init(address)","f04e42cd":"allocateCoins(address[],uint256[])","f04e7476":"BSBCoin()","f04e8c6f":"payoutPeriodStart()","f04ed952":"typeSize(uint256)","f0502ff7":"tokensRequiredForAllWins()","f05168e6":"getAddTokenResetSignatures()","f052a76b":"setSpecialOffer(uint256,uint256,uint256,uint256,uint256)","f052d65a":"getCreature(uint256)","f0534e0a":"addWalletBonus(address,string)","f05396ac":"currentOperation()","f05492e0":"_getMaker(bytes32,uint8,bytes32,bytes32)","f054d139":"decimalsFactor()","f055d324":"walletBountyProgram()","f0560ea0":"approvedRatio(uint256,uint256,uint256,uint256)","f056a5c7":"declareRF(string)","f0575008":"Locked(bytes32,bytes32,bytes32)","f05764a0":"Currenttask()","f05834d6":"setReservedTokensListMultiple(address[],uint256[],uint256[],uint256[])","f05854ba":"SealToken()","f0586f0d":"doThrow(bool)","f058e6d1":"TXOsale()","f0591308":"getMem()","f0594d38":"PrizeAwarded(uint256,address,uint256)","f059bb6d":"buyTokensPreHook(address,uint256)","f059cf2b":"spentToday()","f05a2818":"changeMinimumBetAmount(uint256)","f05a64bc":"potTime()","f05a781d":"acceptNewOwner()","f05aa334":"cofounderA()","f05ad9f3":"communityTotal()","f05b854f":"LogSquareWinsUpdated(uint256,uint256,uint256)","f05ccd75":"onDecreaseApproval(address,address,uint256)","f05d16f7":"setTxFee(uint256)","f05d5547":"named(string)","f05d68c1":"_newIncomingTransaction(address,address,uint256,string)","f05d85d6":"atmToken()","f05dd6d5":"LogWinner(address,uint256)","f05dda57":"XeinToken()","f05f3e77":"developer_voting_info(string)","f05f45b1":"authoriseEntrants(address[])","f05fae68":"getStoreBalance()","f06067ac":"transferByLock(address,uint256,uint256,uint256)","f060ccb5":"escFundAddress()","f060f617":"setCursedContract(address)","f0611c44":"lockAfterMinting(uint256,uint256)","f06186c7":"testReality()","f0624097":"checkBlockEmpty(uint256,uint256)","f062e26b":"check_darkdao()","f0640355":"AddTeamAccount(address,address)","f0646a3c":"DART()","f064b971":"tryToCloseProject()","f065c36e":"MonopolyBank(uint256,string,uint8,string,address)","f0664a4f":"ownerOne()","f0666fba":"burnedBitcoin(address,uint256)","f066719f":"arbTrade(address[],uint256[],uint8[],bytes32[])","f066844e":"_emitAreaEvaluated(address,address,uint8,uint256)","f066cb83":"treeBuild(address,address)","f0685bf0":"TestFund()","f068a3a6":"setNextSmartContract(address)","f068dc81":"authorizeRequestorAddress(address)","f069629c":"generalSaleStartDate()","f06a1e13":"QUOTE_ASSET()","f06b0901":"interRefreshLock()","f06b53e9":"saveDividends()","f06b9ca6":"avgTokenBetValue()","f06bbf75":"EXTERNAL_QUERY_GAS_LIMIT()","f06c5610":"constructionTime()","f06d335e":"_recoverAccount(address,address)","f06d56ae":"ICO3Period()","f06ea69c":"toUint16(bytes,bytes,uint256)","f06ebc38":"setKv(uint256,uint256)","f06ef632":"fundOrderInternal(address,address,uint256)","f06fc103":"sendTokens(address,uint256,uint256)","f0704f02":"week3Price()","f0705249":"updateSspAbi(string)","f07065b3":"writeToDiary(uint256,bool)","f0715594":"_addAdminAccount(uint256,address)","f071b5fb":"LogEscrowReq(uint256)","f071cacb":"_setClientSupply(address,uint256,uint256)","f071db5a":"feesCollected()","f071ecc5":"AFTER_MAX_GOAL_DURATION()","f07227dc":"release(address[],address,uint256[])","f07255e3":"nextBoundaryAmount()","f073b277":"euroRaisedRc()","f07494a0":"bla()","f0757a91":"TOKEN_PRICE_THOUSANDTH()","f075f253":"QRRial()","f07629f8":"eventsHistory()","f076ba9c":"ethercrowdfund()","f077ae0f":"removeSample(address,uint256)","f07819a3":"setMesa(uint256)","f0782640":"getCompanyCount()","f0793782":"modifyHorseyDna(uint256,bytes32)","f0794ca6":"getRocOwnerItem(uint256)","f07a019d":"ownerRecoverTokens(address,address)","f07b454c":"divMultiplier()","f07b4608":"destruirContrato()","f07b9a04":"certAuthIssuesCerticate(address,address,uint256,string,string,string,string,uint256)","f07b9f20":"MapleCoin()","f07c0b21":"AgriChainLabel()","f07c44c2":"appropriate(uint256)","f07d0c49":"Logs(address,uint256,string)","f07edbf4":"maximumAdminBalance()","f0803358":"TSpaceCoin()","f080f860":"MAYA()","f081d9bd":"HaraKiri()","f081fc2e":"MAX_TOTAL_AMOUNT_GET_ETH()","f082650b":"setStarData(uint256,uint16,uint16,uint32,uint32,uint32,uint64,uint64)","f0829c37":"VeraCoin()","f083156c":"LYBToken(string,uint8,string)","f083e8f2":"addressFundFounder()","f0843ba9":"quickConvert(address[],uint256,uint256)","f085b2a1":"clearTokenLock(address)","f0863c08":"maxPowerUserAddress()","f0869641":"normal_trade_date()","f086965e":"changeOwner(bytes32)","f08697a3":"QuyDau()","f0876747":"KocoCoin()","f087d2ec":"STREAMING()","f088d547":"buy(address)","f0893de2":"maxTradingStartTime()","f089b7dd":"hashtag()","f089d566":"AdmineTeamTokens()","f089e2ed":"getProject(string,uint256)","f089e972":"currentNetfRound()","f08a5faa":"getSmartHash(string)","f08b82e6":"getTotalTokens()","f08c9e2e":"deathData_f2()","f08ccd02":"allocatePresaleTokens(address,uint256,uint64,uint64,bool,bool)","f08d5a25":"initialLockedValues(address,address,address,address,address,address,address,address)","f08e362f":"transferFunds(uint256,address)","f08ea4cc":"_startContract(uint256)","f08fa322":"investors_deliveryDate(address)","f090cee8":"addInvestor()","f091e5a2":"CoinMeet()","f0920a41":"wminus(uint256,uint256)","f0921b80":"habichnet1()","f09304b5":"setIntervalSchedulePresale(uint256,uint256,uint256)","f0932bd7":"setNextRoundLength(uint256)","f0933ab9":"isInActiveStage()","f093fd0a":"_bidEth(uint256,uint256)","f0942d35":"gameStatus(bytes32)","f0947680":"lockstatus()","f095ed3c":"cancelAndEndEvent(bytes32)","f09649ed":"getStateLength()","f0965328":"transferFor(address,uint256)","f0970566":"createDklAuction(uint256,address,uint256)","f097e106":"maxBuyingDate()","f098efb3":"ICOActive()","f098f8e4":"finalWindowTime()","f09915d4":"assign(uint256,uint256)","f0995961":"notarize(bytes32,uint256)","f099ce67":"getGladiatorDistributedRandom(uint256)","f099fbbd":"callBurnTokens(uint256)","f09a1f87":"hashOrderTyped(uint8,address,uint256,uint256,uint256,uint256)","f09a4016":"init(address,address)","f09a58f8":"internalSellTokenFromAdmin(address,uint256,bool)","f09a9b3c":"addGoal()","f09bea14":"totalCities()","f09bfcc2":"distributeFixed(address[],uint256)","f09c25e6":"playerCheckProvablyFair(uint256,bytes)","f09c3152":"NerdShitCoin()","f09c5829":"swaps(uint256)","f09cac98":"receiveApproval(address,uint8)","f09d3103":"royaltyTracking(address)","f09dd7c6":"withdrawAffiliateCommision()","f09dd844":"revealPurchaseOrder(bytes32,uint256,uint256,bytes32,address)","f09e34f0":"addReleaseAgent(address)","f09e65f1":"setAtomFath(uint256,uint64)","f09ea2a6":"offer(uint256,address,uint256,address)","f09ecf10":"Contract_Owner()","f0a03aa3":"ITE()","f0a0a299":"VIPFee()","f0a15f10":"TIER2_RATE()","f0a233d4":"SharesChainToken(address)","f0a279ae":"phase1EndingAt()","f0a2bea2":"testCheckRokBalance()","f0a2c430":"inGameRewardAddress()","f0a32e7b":"maxRefundStageDuration()","f0a3563c":"userClaims(address)","f0a3ce5d":"distributeDivs(uint256,uint256)","f0a3d4fd":"freezeAPI(uint256,string)","f0a3dfa4":"isStartTimeCorrect(uint256,uint256[])","f0a42aa0":"_upgradeLevel(uint256,uint16,uint16,uint16,uint16,uint16,uint16,uint16)","f0a43714":"whitelistSize()","f0a45cff":"report_death(uint256,uint256)","f0a71ef6":"getPrevBlock(bytes)","f0a78538":"scheduleTransaction(uint256,bytes)","f0a7975f":"setDayQualitys(address)","f0aadcda":"AIMcoin()","f0aaf4ec":"getOptionsForModel(uint64)","f0abb382":"isHotWallet(address,address)","f0acc83a":"QCSCToken()","f0acfea2":"piranhasTotalSupply()","f0ad243e":"getCoefficient(bytes2,uint256)","f0adcedb":"executeWinningProposal()","f0adda7d":"setNextVersionAddress(address)","f0ae03be":"robotCoin()","f0af0844":"addTimeUnequalledDefence(address,uint256)","f0af50c9":"stoppedSale()","f0af7e65":"cancelAgon(uint64)","f0afbf84":"newFutureLottery(uint256,uint256,uint256)","f0afd95a":"_2_education()","f0b01d56":"VINEYARD_ADDRESS()","f0b05bfd":"getGamesOfPlayer(address)","f0b070ca":"createAppeal(uint256)","f0b087c5":"getConfigUint(bytes)","f0b0cfa3":"readSoftwareInformation(address,address,uint256)","f0b1adbe":"registerEarnings(uint256)","f0b1b42e":"createContractPow(string,uint256,uint256,uint256)","f0b24181":"totalSupplySale2()","f0b25186":"shopKnife()","f0b30f69":"saveLockedERC20Tokens(address,address,uint256)","f0b32c69":"test_threeValidEqBytes32()","f0b37c04":"unauthorize(address)","f0b3a7ba":"hardCapToken()","f0b3adee":"updateRewardRate(address,uint256)","f0b5165f":"delayOfPreICO()","f0b53256":"SoftCap()","f0b534cb":"getApprovedVotes()","f0b620a2":"isPaymentCompleted(address)","f0b6e707":"ORDER_CANCEL(address,address,uint256)","f0b7e532":"withdrawTaker(address,uint256)","f0b80000":"PRESALE_START_DATE()","f0b85b19":"setDefaultLockInDuration(uint256)","f0b9e5ba":"onERC721Received(address,uint256,bytes)","f0ba23e6":"minterChangeable()","f0ba958c":"Error(uint8)","f0ba96ff":"performPayouts()","f0bae2c5":"doIssueDividend()","f0bae787":"_receiveBuyRank(address,uint256)","f0bbab3b":"HSHToken()","f0bbe08b":"phasePublicSale2_To()","f0bbe877":"Deployed(address,uint256,string)","f0bc6cfb":"isReferred(address)","f0bc9cc5":"receivedDETreturn(address,uint256)","f0bcaf75":"UsingDB(address)","f0bd9ab5":"pushToken(address,bool)","f0bf1aea":"Paint(uint256,bytes3)","f0bf4df4":"setMinEnterFee(uint256)","f0bf611b":"transferDao(address)","f0bfd737":"Testtoken(uint256,string,string)","f0c001df":"proofType_Android()","f0c0546c":"closedRound()","f0c06aa5":"distrust(address)","f0c1d1c7":"setContributionPool(address)","f0c295fd":"seeZombieColor(uint256)","f0c388c7":"convertMainchain(string,string)","f0c413dd":"balanceOfContract(address,address,address)","f0c41bb2":"getChampsByOwner(address)","f0c45472":"modifiyEndFundingTime(uint256)","f0c4c04e":"extractFunds()","f0c4c339":"getFreezeSinceDetails()","f0c4fcc5":"mustToSellCourses()","f0c4fd0c":"isAttributesValid(uint256)","f0c5a46b":"periodPreITO_period()","f0c5a77b":"updateBurnableStatus(bool)","f0c69e8d":"calculateWithdrawable()","f0c71318":"zenOSCrowdsale()","f0c87852":"moveData(uint128[],address[],bool[],uint256[])","f0c95bc1":"setAdminVariables(uint256,uint256,uint256,uint256,uint256)","f0c99750":"endICOStage4()","f0ca618e":"Indemnisation_3()","f0caea2b":"SmartRoulette()","f0cafe0e":"tokenGNO()","f0cb556c":"updateLatestRevision(bytes32,bytes)","f0cb740a":"isJobStart(bytes)","f0cb8e77":"savedAddresses(address)","f0cbe059":"proxyTransferFromWithReference(address,address,uint256,bytes32,string)","f0ccc21a":"chunk5IsAdded()","f0cd58b7":"AuthAddr(address)","f0cd5c17":"cancelTx()","f0cd8057":"OACC()","f0ce6231":"XIAOZHI4()","f0cecafc":"privateSale2Hardcap()","f0cf198a":"RemoveSubscriber(address)","f0cfcaa8":"_getNewEstateId()","f0d02ce9":"AVG_BLOCKS_02W()","f0d07014":"allItemsForSale()","f0d0dd3f":"subDomainOwner(string,string)","f0d1c8ce":"hasTrade()","f0d1d021":"set_stoptransfer(bool)","f0d1eaaf":"getChannelById(bytes32)","f0d22ade":"isRepeated(int256)","f0d30786":"getPositionCallTimeLimit(bytes32)","f0d3a9df":"getBuyersCount()","f0d474f9":"underdogCount()","f0d4753e":"TOKEN_OFFERING_ALLOWANCE()","f0d4c92d":"setTimeBonus(uint256)","f0d4d1a6":"lotteryParticipants()","f0d504eb":"lookupKitty(uint256)","f0d5511c":"isArrAccountIsFrozenByDate(address)","f0d655f8":"_calculateTokenAmountAndRemainderBudget(uint256)","f0d6cc70":"endFullBonusTime()","f0d6ff48":"MeetOneTokenBase()","f0d7c9ff":"setPreviousSurplus(address[],uint256[])","f0d7f3eb":"auctionPause()","f0d85c89":"setRecovery(address)","f0d89e67":"LogRedeemTicket(uint256,address,string)","f0d8d4af":"sendTest()","f0d8e968":"getLastLease(uint8)","f0d90937":"usdAmount()","f0d97469":"setTokenExchange(address)","f0d9bb20":"yesToken()","f0da84f8":"getTransferable(bytes32)","f0daa286":"doubleXY(uint256,uint256)","f0daba01":"merchantIdHash()","f0dc4171":"collectTokens(address[],uint256[])","f0dd7a5d":"borrowBook(uint256,address,address)","f0dda65c":"mintTokens(address,uint256)","f0ddc0c6":"InjurymapCoin()","f0df232f":"buyMessage()","f0df6929":"RequireHuman()","f0e02bd6":"WEI_MAXIMUM_EARLYPURCHASE()","f0e10c0d":"play(address,uint256)","f0e1354c":"removeFromEggPhase(uint256)","f0e1691a":"addEvent(string,uint256)","f0e1ba2c":"priceLimit()","f0e1f84d":"setVotingProxy(uint32,int256,address)","f0e231b5":"Datenow()","f0e26f80":"getBattleDetails(uint256)","f0e3d1ba":"setEnd(bool)","f0e3fff8":"totalWon(address)","f0e40662":"getTotalAmount(uint256)","f0e42a1f":"getDividendTransactionLeft()","f0e4c4fe":"setGatewayI(address)","f0e53489":"integrity()","f0e5eeac":"ico2total()","f0e61771":"tokenFreezing(address,bool)","f0e6c2dc":"CASToken()","f0e769dc":"resumeSwap()","f0e7cf13":"adminClaimAirdropMultiple(address[])","f0e86f93":"ICOBlacklisted(address)","f0e959f9":"TokenSales(address)","f0ea0294":"setStage2Start(uint256)","f0ea433a":"sendQualifiedPartnerCommissionFee(address,uint256)","f0ea4bfc":"raised()","f0eb29fb":"_communitySupply()","f0eb737a":"getCurrentDiscount()","f0ebce5a":"getEnum()","f0ec03ae":"tokenWeiSold()","f0ec747e":"VETRA()","f0ec94cf":"edgePerPosition()","f0ecadaf":"comprueba(address,bytes32)","f0ecadcc":"voteSvp03(bool)","f0ed029e":"DebugUint(uint256)","f0ed14e0":"right95(uint256)","f0edb7cf":"admin_set_Apply_Store_Id_Fee(address)","f0ee7df2":"setMaxWin(uint256)","f0ef7621":"FishOne()","f0f0fe10":"ownerSetRecommendProportion(uint256)","f0f21344":"right27(uint256)","f0f2805f":"isOnSale(uint256)","f0f3f2c8":"getProject(uint256)","f0f44260":"setTreasury(address)","f0f46302":"shopHelmet()","f0f53ee4":"setBool(bytes32,bytes32,bool)","f0f5af8b":"calculateObtainedAMIS(uint256)","f0f7bd31":"LibertyToken()","f0f87e98":"TokenWithoutStart(string,string,uint8)","f0f8aff9":"getPriceForAssetAmountMulCollatRatio(address,uint256)","f0f8b7a5":"betX5()","f0f967e8":"canCall(address,address,bytes)","f0f9a729":"dividendsOf()","f0fa55a9":"setSlippage(uint256)","f0fb4372":"RatingStore(address,address)","f0fb8efd":"allowDefaultToken(address,bool)","f0fbc8ac":"indInflationDeposit()","f0fbe2e4":"addressAirdrop()","f0fbfd3a":"targetDiscountValue5()","f0fc1438":"tradeComplete(address,uint256,address,uint256,address,address,uint256,uint256)","f0fc6bca":"claimDividend()","f0fcc6bb":"pay(address,uint256,address)","f0fdb32f":"canStartWork()","f0fdc689":"setInv2(address)","f0fdf834":"a(uint256)","f0fe3d68":"metaBurnCarbonDollar(address,uint256,bytes,uint256,uint256)","f0fee1f7":"LogMigrate(address,address,uint256)","f0feef96":"closeChannel(bytes,uint256,uint8,bytes32,bytes32)","f0ff4840":"LuckchemyCrowdsale(address)","f0ff6ac4":"withdrawal(uint256,address,uint128)","f1001f8c":"getTotalLockedBalance(address)","f10143e1":"TokenToppedUp(address,uint256,uint256)","f101618a":"getMiniPoolEdit_8()","f1018c6f":"boughtNum()","f101b269":"appstore_share()","f103b433":"updateMaxSupply(uint256)","f104c836":"setAssetTransferGas(address,uint256)","f1052af5":"isRegisteredContract(address)","f105c981":"get_contrib_arbits_min()","f105e23b":"PVE_COMPENSATION()","f1068454":"pid()","f10700c2":"shouldCompleteDay()","f1076703":"getVerificationId(address,bytes,bytes)","f107941b":"buyTest(address,uint256)","f107b5e7":"getMaximumLimit()","f108a7d2":"withdraw(uint256,address,string)","f109517c":"delegatedTxHashesUsed(bytes32)","f10968ea":"assertEq(bool,bool,bytes32)","f10a4f0a":"WALLET_PARTNER()","f10a7798":"setAuth(address,address)","f10a9848":"currentNumberOfUpgrades()","f10ae2ab":"__dig_then_proxy(uint256,address,bytes)","f10ca95a":"close(bytes32,bytes32)","f10cb3da":"ObjectToken(uint256,string,uint8,string)","f10cb5dc":"DomainChanged(address,uint256,uint256)","f10ce7c4":"registration(address,string)","f10d1de1":"setUnbondingPeriod(uint64)","f10e5ceb":"getNumAdd(uint8)","f10ecc65":"chainlinkToken()","f10fae62":"setLLV_edit_21(string)","f10fdf5c":"getContribution()","f11079cf":"createType(address)","f110bbdf":"SetupAccounts()","f1112e70":"payYearlyJackpot(address)","f1115c7e":"transferMSI(address,uint256)","f112ddc0":"GJMI()","f113c854":"icoThresholdBonus1()","f113f700":"advisoryReserveTokens()","f113fccd":"trueGods()","f1144ce0":"HCoinToken()","f1145727":"buyStarterPack()","f1147bae":"withdrawRoyalty()","f1156cdf":"getCurrentVoting()","f115f06a":"WhiteListSet(address,bool)","f1160dc2":"ParticipantAuthority(string,address)","f116260f":"CryptoTreasure()","f1167e0d":"createPlayerIfNeeded(address)","f1168e11":"_createMobster(string,address,uint256,uint256,uint256,string)","f1173928":"RemovedFromGeneration(address,uint256)","f11745df":"totalHolder()","f117c924":"totalInvestedInWei()","f1183e21":"assertEq0(bytes,bytes,bytes32)","f118e465":"LogCreateVIBEX(address,uint256)","f118f7d6":"setDestinationMultisigWallet(address)","f119a48d":"toUnixtime(uint32,uint8,uint8,uint8,uint8,uint8)","f119ada4":"addTeam(string)","f119fcaa":"isMintableNFT()","f11a8911":"accountTxs(uint256)","f11a97ef":"MinerToken()","f11af32a":"EuroToken()","f11b9b46":"FRPTOKEN()","f11b9fc8":"emitTokens(address,uint256)","f11bdfa4":"_isValidHeight(uint8)","f11be7c1":"getTrustedContracts()","f11c2cec":"changeOwner(address,address,address)","f11c4482":"approveFromProxy(address,address,uint256)","f11c46f4":"How_to_interact_with_Smartcontract()","f11c8de8":"ZENT()","f11cfc56":"Vicky()","f11d5039":"place_holder()","f11d5b33":"reward(address,bytes32,uint256)","f11dd6ac":"viewGiveKarmaFee()","f11eb099":"preIcoAllocation()","f11ef5cf":"reserve(uint8)","f11f7d2d":"maximumBidAllowed()","f12001ae":"Testereumx()","f1204db6":"maximumJackpot()","f1208af8":"drawWeeklyWinner()","f120974e":"CHENDE()","f1215d25":"deposit(uint256,string)","f122ed60":"send_message(address,string)","f1233b79":"updateTimeBetweenGames(uint256)","f12479ac":"getPhase(uint8)","f124a300":"setPayable(bool)","f124eab5":"ETD()","f125561d":"notifyReceiver(address,address,uint256,bytes)","f12585f5":"getStageVolumeBoundaries(uint256)","f12611f1":"XID(address)","f1261fce":"permitTransfers()","f1272f35":"ICOBlaster()","f127328a":"totalTokenCollected()","f12782b2":"EPXAirDrop()","f127e53c":"LunchMoney()","f1280c23":"getCCH_edit_32()","f1287aef":"Ethmoji()","f129c5d7":"getGeneScienceAddress()","f12a1580":"withdrawDevReward()","f12a15b1":"heapify(int128[])","f12acca2":"upgradePonyHashing(uint256,uint256)","f12b3d3c":"SentFeeToPlatform(uint256)","f12b60f2":"TEAM_POOL_INIT()","f12c095b":"developer_string_A(string)","f12c87eb":"planetIndexToOwner(uint256)","f12d15c3":"transwerFunds(uint256)","f12d394f":"execute(uint8[],bytes32[],bytes32[],address,uint256,bytes)","f12ddd2b":"sendTokensToOwner(uint256)","f12e5eaa":"withdrawPartial(bytes32,address,uint256)","f12f5409":"accrueInvestorsTokens(address,address,uint256)","f12f6925":"NokuFlatPlan(uint256,uint256,address,address)","f13016d5":"internalPresale(address,uint256)","f1309dc0":"transferTokens(address,uint256,uint256,uint256)","f130da53":"GreenXToken()","f13101e9":"_delegate(address)","f1311a2e":"pgoMonthlyInternalVault()","f1317352":"setVCX(address,address,uint256)","f1317c09":"halt_purchases()","f1319892":"CoinifinexToken()","f131a7ae":"clearGame()","f1320af2":"exempt(address)","f13375bd":"addApprovedWalletAddress(address)","f13397b4":"EmeraldToken(string,string,uint256)","f133a7c6":"_update(uint256,uint256)","f133c38c":"testIntParserOneDecimal()","f1348138":"DoAirDrop(address,uint256)","f13497d6":"notifyCollateralNotTransfered(uint256)","f1349955":"externalTxs(uint256,bytes32)","f136a874":"approvedAddresses(address)","f137005f":"EOCHToken()","f13707b3":"adminGetPlayer(uint256)","f1378efa":"QuanYToken()","f137c236":"DSNCOIN()","f137d1a3":"getVestedAmount(uint256,uint256)","f13837f6":"ALPToken()","f1388f14":"mtrx()","f138fca5":"resetKoth()","f1395f3f":"tokensForDevteam()","f1398db1":"MbbToken()","f13a38a6":"getConstant()","f13ab647":"doMakerPayment(address)","f13ad3bf":"RemoveAllHeaders()","f13b68e8":"getPurchaseableMode(uint256)","f13b8d66":"removePerformer(address)","f13ba6a9":"_calcPhase()","f13c310c":"_createPlayer(string,uint256)","f13c7f57":"returnAllBalance()","f13c8fef":"weiTokensRaised()","f13c9b2b":"gcFundAmount()","f13ca4b8":"setEtherAmount()","f13cc606":"buyNOS(uint256)","f13d111f":"reverse(uint8[])","f13d22c1":"getModuleByName(string)","f13dc2e2":"watermark()","f13fc23b":"FINX()","f14053ad":"minVal()","f140b8ea":"getSentTransfer(uint256)","f141d076":"DURATION_DECREASE_PER_ETHER()","f14210a6":"withdrawETH(uint256)","f1437bd0":"setFrom(address)","f143e6db":"clearRequest(uint256)","f143ffe9":"ProfToken()","f14467fb":"ViewMyPrivateKeys(string)","f1448e10":"requestExecution(bytes)","f1455328":"CappedCrowdsale(uint256,uint256)","f145761c":"StartedGame(uint256,uint256)","f145cae9":"updateStoreFee(uint256)","f145ff23":"getDistributedTokens()","f1469382":"updateRates(uint256,uint256)","f147decc":"buscarAssinatura(string)","f147df3b":"get_king_address(address)","f1496070":"getAuctionArray(uint64,uint64)","f14ae17d":"isPresalePurchase(address)","f14b1c01":"upgradeFactory(uint256)","f14bd85d":"resignFromGroup()","f14be97f":"setTgeAddr(address)","f14ca7d7":"getVestingReleaseInterval(address,uint256)","f14ca885":"preICOcontributors()","f14d147f":"tokenSaleWeiMax()","f14dc176":"setDestructionCurator(address)","f14e96f1":"getBestBid(uint256)","f14eb30d":"SaleClockAuction()","f14f58f1":"removeAsset(uint256)","f14faf6f":"donate(uint256)","f14fcbc8":"commit(bytes32)","f14ff5cf":"getSeatMessageUrl(uint256)","f1508105":"Ohni(uint256,string,uint8,string)","f1518627":"anotherOwner()","f151e4ae":"devuelveToken()","f1522d53":"redeemablevilsinfo(address)","f1533936":"BNTPrice()","f153d3ad":"BurnupHoldingAccessControl()","f15467c4":"WelCoinICO(uint256,uint256,address,address)","f15627a1":"mintArray(address[],uint256[])","f156deb2":"miningTokensOf(address)","f1572e7d":"getQuoteKey()","f15732b8":"REAL()","f157c54b":"operatorRedeemByTranche(bytes32,address,uint256,bytes)","f157ea0b":"forkAddress()","f158458c":"getMinimumEndowment(uint256,uint256)","f15886db":"addressToReceiverToAllowedSprite(address,address,uint256)","f1588d66":"getPurchaseAmount(address,uint256)","f158e478":"destroyCampaign(bytes32)","f159eb84":"KVCToken()","f159f38f":"getTracks2()","f15a1b59":"tokenForTeam()","f15a691d":"validPurchase()","f15a9ae8":"maxPVPContenders()","f15ae568":"addEntry(address)","f15afa50":"fpMulI(int256,int256)","f15b2bda":"approveMintLocked(address,uint256)","f15beecf":"payNode(bytes32,uint32)","f15bf739":"getShareholderArrayLength()","f15caaa9":"insertDate(uint256)","f15cfe33":"KRWT_Token()","f15d775d":"changeMedianier(address)","f15e3af1":"getMatchAtRoundIdAtIndex(uint256,uint256)","f15f14c5":"Dividends()","f15f2bf0":"blockEndICO()","f15f56a7":"calcBingo()","f1608682":"updateUserDetailsInBulk(address[],uint256[],uint256[],uint256[],bool[])","f1610120":"next_giveaway()","f1625534":"deactivateRound(uint256)","f16270c3":"VITTokenSale(address,uint256,uint256,uint256,uint256,address[20])","f162c5a1":"totalScaleStaked()","f1637630":"withdrawBatch(bytes32[],address)","f1644b6c":"getFaucets()","f16638ec":"UselessReserveBank()","f1665a48":"NewVestedToken(address,address,uint256,uint256)","f166dc27":"Bid(address,string,uint256)","f1671b56":"getWeightRange()","f16787bc":"readFromCards(uint256,uint256)","f1679095":"getTransferAddressUser(address)","f167d695":"sacarDoacoes()","f1684237":"Ownable(address)","f1686296":"Hodor(string)","f1687a8d":"tokenSellCost()","f1694b3d":"updateResearch(address,uint256)","f16b6482":"gameCountdown(address)","f16b9422":"_recordFailedOldOwnerTransfer(address,uint256)","f16bdb9c":"validate(bytes20,uint96,uint32,bytes32[],uint16)","f16bdba9":"isCustomerinBLFromWL(address,address)","f16c5e8d":"issuerGuiveToken(address,uint256)","f16d9aca":"khabibToken()","f16dfbe9":"verifyAccount(address)","f16e74ac":"minDividendEtherAmount()","f16f9b53":"signedApproveAndCall(address,address,uint256,bytes,uint256,uint256,bytes,address)","f16fa66a":"updateLotteryData(address)","f16fa954":"debug_resizeRealPrefix(uint256,uint256)","f1700f94":"getInfoF1(address)","f1703d24":"addEntity(address)","f170c83c":"famedStarAddress()","f1714e97":"preserveTokens(address,uint256)","f1714fcc":"AddCommitteeToMapAndArrayEvent(address)","f171a730":"transferEvent_(address,uint256,bool)","f171ba5d":"verdictExecuted(address,bool)","f172f58f":"getPositionOwner(bytes32)","f172f84f":"jockeyLevel(address)","f17313e6":"unFrozenAddress(address)","f1736d86":"m_dailyLimit()","f17382ae":"SUPPLY_FOR_RESERVE()","f1739cae":"transferProxyOwnership(address)","f17401de":"init_multiowned(address[],uint256)","f17454b0":"UserAdded(bytes20)","f174683a":"VTrust()","f174b333":"buscarDocumentoPorId(uint256)","f1751688":"showReportForDevice(uint16)","f17520e5":"changeWhitelistAdmin(address)","f1753550":"supportsInterface(bytes32)","f175e6a9":"getTwitter()","f1762e5d":"bnbRefundEnabled()","f1765b22":"acceptSale(address[])","f1771cf0":"BURNABLE_UP_TO()","f177e837":"to62Encoding(uint256)","f177fc4f":"PornSceneToken()","f1781c72":"removeLockedTime(address,uint256)","f179a86e":"setEtherToTokenAllowed(bool)","f179c6ef":"confirmBatch(address[])","f179f9f1":"parsecCreditContract()","f17a1ff5":"BAG_TRANSFER_FEE()","f17a3c4b":"FTST()","f17b1d63":"BacCara()","f17b5bb0":"assertMatchingBalance(uint256,uint256)","f17b6d9b":"relayCMCT(address,uint256,bytes32)","f17ba16b":"approveByAddress(address,address,uint256)","f17cc54b":"TestLib()","f17ccd73":"DNMC()","f17d186c":"withdrawAllFundsFromContract()","f17e48ec":"adminTransfer(address,uint256)","f17f29d0":"getGoldDataSerial()","f17f3ca3":"AUCTION_WHEN_PERCENTAGE_LOGIC_STARTS()","f17f6f8a":"escapeCaller()","f1806a21":"getUnapprovedUsers()","f180743a":"tokensForFounder()","f1807e35":"removePermission(uint8)","f18166c2":"TRADE_REWARD()","f181b388":"setTotalWithdraw(uint256,address,uint256,bytes,bytes)","f181f396":"unspentAmounts(uint256)","f182dd3b":"releaseTokens4Sender(uint256)","f183452c":"releaseTokenByOwner(address)","f1835db7":"verify(bytes32,uint8,bytes32,bytes32)","f1838a15":"burnFeatureDeactivation()","f1838fe4":"getExpectedRates(address,address[],address[],uint256[])","f1850af8":"getTokenSymbol()","f1860118":"tradeExecuted(address,uint256)","f1861749":"nextDiscountTTMTokenId6()","f18697cf":"IdolCoin()","f186a625":"transferContentOwnership(bytes32,address,address,string)","f186bb79":"getPixelPrice(uint16,uint16)","f186c67f":"permit(address,bool)","f186d77e":"setStarContract(address)","f1870e0c":"contractFinalized()","f187650d":"DeskBellPresale()","f18771de":"NujaRegistry()","f1880128":"getSTMPDecimals()","f1880b24":"checkToken(address)","f189348a":"teleportCharacter(uint32)","f1895e08":"__issueTokens(address,uint256)","f1898fda":"TOKEN_CONTROLLER_INTERFACE()","f18ab544":"pendingList(address)","f18ad6fb":"getRecord()","f18b7bde":"SplitDividendsAmongstOwners(uint256)","f18ba98c":"handleSaleCompletionCallback(uint256)","f18cbe08":"_byteToString(bytes32)","f18d03cc":"transfer(address,address,address,uint256)","f18d20be":"adminWithdraw()","f18d4dbb":"addTokenSupply(uint256)","f18d5a93":"TokensSent(address,uint256)","f18dd512":"PERSONAL_FIRST_HOUR_CAP()","f18df6bb":"increaseAllowanceToken(address,uint256)","f18e120b":"setMaxTokensPerAccount(uint256)","f18ecf80":"OfferToken(uint256,string,string)","f190a793":"companyTokenWallet()","f190ac5f":"mintToAddresses(address[],uint256)","f190b4d3":"newUserRewardPool()","f1914dc5":"StaticEthAvailable(uint128,uint128)","f191c26d":"CPT()","f192866a":"sellTicket(uint256)","f192e91c":"forfeit(bytes32)","f1931b9e":"LAFIN()","f193a3f7":"changeBank(address,address)","f19414d5":"admin_inactive_dividend(address)","f194c23f":"_getCurrentAltarRecordId()","f1952473":"AcoraidaMonicaWantsToKnowTheNewQuestion(string)","f195995c":"isValidGeneration(uint8)","f195f0f9":"slice2(bytes,uint256,uint256)","f19674f6":"PatronThreeWithdrawal()","f19798ab":"numRolls()","f1979de8":"setPixelAreaColor(uint256,uint256,uint256,uint256,uint32[])","f197bbdd":"deadlineOne()","f1991a27":"saleStartTokenCreationRate()","f199265f":"internalExecuteCall(address,uint256,uint256,bytes)","f199f56d":"roundReward()","f19a5810":"changeBaseTokenPrice(uint256)","f19ab230":"Bcoin()","f19ac52d":"newDepositCommission(uint256)","f19be31b":"btcAddrPubKeyCompr(bytes32,bytes32)","f19be5d5":"JackpotCore(uint256,uint256,uint256,uint256)","f19c020d":"returnTokensAll(address)","f19c78b5":"contributorsKeys()","f19cfeff":"RepossessionBounty(address,uint256)","f19d2bcd":"EOS_address()","f19d736e":"Prosper()","f19dd75b":"lspToken()","f19e3c9f":"LogSnapshotCreated(uint256)","f19e75d4":"ownerMint(uint256)","f19e774e":"isValidBet(uint256)","f19eb731":"TKT_TokenERC20(uint256,string,string)","f19ee2a9":"_getAsset()","f19efc43":"getRoundInProgress()","f19f3246":"rejectOwnership()","f19fb157":"withdrawnow()","f19fc6ab":"gonIIToken()","f19fe69b":"withdrawTokenTo(address,address)","f19fefbc":"Hodling(address,address,uint256)","f1a00a53":"unregisterListening(address)","f1a0a85c":"div(uint64,uint64)","f1a138f4":"Airdropsamount()","f1a252b8":"getMoneyBack()","f1a3de09":"register_minting(address)","f1a5158b":"Contest()","f1a570b8":"DividendRecycled(uint256,address,uint256,uint256,uint256)","f1a5fc99":"bytesToInt(bytes)","f1a63733":"createBountyToken(address,uint256)","f1a6ed46":"ORIGIN_ETH_BRT_RATIO()","f1a9af89":"startPrice()","f1a9d749":"LRCCcoin(uint256,string,string)","f1aaea1c":"updateLabAddress(address)","f1ab36b4":"getSaleInformation()","f1ace1a1":"ART_DECIMALS()","f1ad3334":"storeETH()","f1ade50c":"VelesCoin()","f1ae5437":"changeTakeFee(uint256)","f1ae72a5":"minAcceptedEthAmount()","f1ae8c55":"startRaffle(uint256)","f1afc4f6":"ShareHolderController(address,address[],uint256[],address,uint256,uint256,uint256,uint256,uint256,uint256)","f1b0202e":"TalkToExpertPayment(address)","f1b07f96":"deblacklistAddress(address,address)","f1b12493":"IcoContract(address,address,uint256,uint256,uint256,uint256,uint256)","f1b234ad":"setWallet(address,address)","f1b2b03c":"start_ts()","f1b2d6a3":"getListings()","f1b3ea6f":"asyncDebit(address,uint256)","f1b3f968":"getRaceEndBlock()","f1b3fd80":"momentTimeOf(uint256,uint256)","f1b46bc8":"generateRandomCard(uint32)","f1b4d548":"isValidTeam(uint256[])","f1b50c1d":"enableTransfer()","f1b541c2":"startPublicSaleStage()","f1b5bc17":"mintAmount4()","f1b5c777":"contributeWasCalled()","f1b5d7de":"pre_prices(uint256)","f1b6315e":"StartRoulette(uint8)","f1b676a4":"ico3Ended()","f1b6cee5":"winPot(uint256[])","f1b74348":"addExisitingContributors(address[],address,uint256[])","f1b75173":"getLegacy(uint256)","f1b8a5bf":"commitPhaseMinVotes()","f1b9ee24":"setInactive()","f1bab09c":"setExtraBonus(uint256)","f1bab410":"manualSale(address,uint256)","f1bba50a":"GoldBlocksTickets()","f1bba6f9":"account(string)","f1bbc663":"tokenSaleClosedTime()","f1bca30f":"removeManyAdmins(address[])","f1bca7a4":"doCall(uint256)","f1bcb6e5":"createContractor(address,address,bool,address,string,string)","f1bd4c04":"getJackPot()","f1bd5978":"__address3__()","f1be1679":"getMarket()","f1be42f1":"numCharacters()","f1bf18db":"availableZNT()","f1bfb9cd":"listSingleCard()","f1c05831":"authoriseSale(uint256,uint256,address,uint256)","f1c10c24":"infoTokens(address)","f1c16deb":"validPurchase(address,uint256,uint256,uint256,uint256,uint256)","f1c21077":"PROBABILITY_DIVISOR()","f1c22a05":"setNewPixelPrice(uint256)","f1c30ec0":"reclaim(bytes)","f1c36ce0":"burnFromAddress(address)","f1c3dd3e":"fuckTest()","f1c41b68":"setConsensusRules(uint256[6])","f1c461c7":"mesasCreatedVerify()","f1c4d6b0":"DOG_Crowdsale()","f1c4ecb4":"maxCapWei()","f1c53a3a":"UpdateUserExtraData1(address,bytes32)","f1c55931":"reserveFunds(address)","f1c5d07b":"totalLoveBlocks()","f1c61958":"DIGITALCASH()","f1c6aeb7":"SetApplicant(string,uint32,uint256,int256,string)","f1c6c520":"runningauctions(uint256)","f1c760ae":"fixBalanceInternal(address)","f1c7689e":"CandyRate()","f1c94b45":"lastBlock_a7Hash_uint256()","f1c9cc11":"lockMin()","f1ca9410":"gen0CreatedCount()","f1cca8aa":"setTakerFee(uint256)","f1ce37d9":"eachUserWeight()","f1ce9595":"TIME_PERIOD_IN_SEC()","f1cea858":"TCLRToken(address,address,address,address,address,address)","f1cf5b38":"setWethContractAddress(address)","f1cfb100":"remainingEscrow(bytes32)","f1cff4b5":"testBitsNotSetSuccess()","f1d02a8c":"MiningToken(string,string)","f1d08bfa":"setOpenForSale(bool)","f1d15f1f":"setLandPrice(uint256,uint256)","f1d1768c":"updatePresaleListMapping(address[],address,bool)","f1d18a42":"safediv(uint256,uint256)","f1d20d4d":"provider(bool,address,address,address)","f1d2165f":"SaleActive()","f1d22be0":"freezeAll(address)","f1d2b3c2":"Owner1()","f1d2b8ab":"seePurchase(uint256)","f1d308d5":"SingularityTest17()","f1d35260":"setGovernor(uint8,address)","f1d3a853":"PalliumCrowdsale(uint256,address)","f1d588c5":"setRoleManager(address)","f1d59443":"getUSETTotalSupply()","f1d61850":"confirmationPeriodOver()","f1d61f23":"timeLockAdvisor(address)","f1d71b73":"betBlueCoin()","f1d73540":"Quiz(string,string)","f1d841f1":"minAcceptedAmount()","f1d89857":"RequestFactory(address,address)","f1d91942":"setInfoUrlPrefix(string)","f1da588a":"PrivateCoin()","f1da7e63":"getMortgageRate(address)","f1daa1f0":"writeDefinitions(uint256,string)","f1daa5ba":"calculateAmountForETH(uint256)","f1db23dc":"totalProceeds()","f1dbd547":"FINAL_AML_DAYS()","f1dbd647":"receiveDividends(uint256,uint256)","f1dc24ae":"getMeshPointByCreator()","f1dd08b4":"transferCommissionReceiver(address)","f1dd6147":"buyTokensIco(address)","f1de75e3":"getPrefixOwner(string)","f1dfcddb":"testTransferGasIssue()","f1dffed7":"setIntValue(int256)","f1e02620":"setFirstTime(uint256)","f1e03d67":"createEscrow(bytes16,address,address,uint256,uint16,uint32,uint32,uint8,bytes32,bytes32)","f1e253dd":"brickIds()","f1e298c3":"addFee(address,uint256,address,uint256)","f1e2ac12":"evalParam(bytes32,uint32,address,address,bytes32,uint256[])","f1e2e921":"_Owned()","f1e328f9":"left68(uint256)","f1e4a540":"unsetCoordinator()","f1e50ce9":"saveMe()","f1e69009":"registerDsp(address,uint8,bytes32[5])","f1e6bb1c":"getVoteOptions(uint256)","f1e6f4cd":"right40(uint256)","f1e7ae1f":"modifyMemberLimits(address,uint256,uint256)","f1e8ace7":"decodeBillingMetadata(uint256)","f1e954d8":"increaseTokenSaleAllocation()","f1e9951f":"getActionCount(bool,bool,bool)","f1e9a514":"VREO_SALE_PHASE_2_END_TIME()","f1ea43e7":"TCSCCoin()","f1ea6cbd":"creationMinCap()","f1ead3d6":"getAuctionsFor(address)","f1eae25c":"mortal()","f1eae64a":"openSell()","f1eb0ed9":"newInitialPlayerOffering(string,string,uint256,uint256,address,uint256,uint8)","f1ebe451":"ChooseB()","f1ecff08":"BastoneToken()","f1ed9923":"isEcoAllocated6()","f1eeec2e":"insureClient(address,uint64)","f1ef9881":"hashSecret()","f1ef9a08":"preicoAddresses(address)","f1efb76a":"getPayTo()","f1f05a3f":"getAttr(bytes32,uint256)","f1f0b290":"lockToken(bool)","f1f1e30f":"ethForKey(uint256)","f1f201e8":"getArtworkInfo(uint256)","f1f33565":"ENG()","f1f339ef":"doCheck()","f1f3ae31":"novaContractAddress()","f1f49033":"deductDeposit(address,uint256)","f1f4e25d":"OctaBlock()","f1f62f10":"isWalletLocked_Send(address)","f1f6d945":"webAddress()","f1f732cb":"BONUS_TOKENS_RESERVED()","f1f76438":"checkNumber(address)","f1f87fc9":"BitMix()","f1f9539f":"KittyRace(address)","f1fa1744":"sellpause()","f1fa906c":"getProjectName(uint256)","f1fb3ace":"minEth()","f1fb5219":"_calculateContribution(uint32,uint8,uint64)","f1fbf2a3":"calculateObtainedSBT(uint256)","f1fc4db4":"updateCutoff(uint24)","f1fd9614":"getNumData(uint256)","f1fe42b8":"TransactionRequest(address[3],address,uint256[11],uint256,bytes)","f1fea32a":"setPOOL_edit_7(string)","f1fec2b8":"nodePrice()","f1ff3d4b":"totalNumberMinted()","f1ff4a67":"releaseWithheldTokens(address,bool)","f1ff732b":"setBanker(address)","f1ffde45":"BasicBallot(address,string,string)","f20001b0":"Menu08()","f2016a4f":"updateMinEthPerNotification(uint256)","f201da0d":"newChannel(address,address,uint256,uint256,uint256,address)","f2020275":"users()","f2021550":"QBankChain()","f2022905":"toldYouItWouldWork()","f20341a8":"getRemainingTarget()","f203af26":"registerImport(bytes8,bytes8,uint256)","f203c19d":"usersAddress()","f203c857":"getSpeaker(address)","f20431c8":"MyTotalNTD()","f2057179":"changeInstitutionOwner(string,address,address)","f20652a1":"nxcSold()","f2068bfc":"addUniqueSpinner(string,uint256,address,uint256,uint8,uint8,uint8)","f206cf74":"MINIMUM_ETH_SOFT_CAP()","f206e7c9":"fechAllVoteResultBySnapshotBlock(uint256)","f20717e9":"getNbTrade()","f207564e":"register(uint256)","f2080ba6":"Pong(int8)","f2083220":"activeTranscoderTotalStake(address,uint256)","f2091083":"dollaryDanToken()","f2097550":"bucketExists(bytes32)","f2097b9b":"doesAddressOwnSpinner(address,uint256)","f209fc1f":"purchaserWhiteList(address)","f20b4368":"AllocateMainSale(address,uint256)","f20b93ea":"getInvoiceAmountPaid(bytes32)","f20d5385":"endCrowdsalePhase2Date()","f20d5943":"s0(bytes1)","f20d5e57":"distributeToReferreal(uint256,address)","f20dde7b":"updateCostETH()","f20de9d6":"openGameLoop()","f20e5e35":"getAuctionDetails(uint256)","f20e5f51":"PeriodChanged(uint8)","f20eaeb8":"output()","f20f24ec":"pauseTokenSale()","f2102390":"SOFTCAP_RATE()","f2107f83":"getStakingInfoPayload(bytes)","f2108aa8":"FraCoin()","f2114752":"viewSecondLotOfContractState()","f21153d2":"withdrawSettle(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes,bytes32)","f211c9ed":"releaseMultiByStage(address[])","f2125f40":"SEELE()","f212c216":"setSystemAuctionDuration(uint256)","f213159c":"depositTo(address,address,uint256)","f2139abf":"getBigPromoBlockInterval()","f213aad2":"dayWithdrawCount()","f2141ab9":"lossToCharity(uint256)","f21439b5":"envokeTokenAllocation()","f2147f7b":"currentPeriodPrice()","f21502e5":"ZTHTKNADDR()","f2153fae":"BNKCToken()","f215bc3e":"genEstKeyBlockNr(uint256)","f21632e1":"icoEtherReceived()","f2166ab1":"xpanda(uint256,string,string)","f216b203":"TokenSyndicate(address,uint256,uint256,uint256,uint256)","f216bfd6":"updateUportInfo(string)","f216f45d":"nextStageBonus()","f21711f3":"currentRating()","f217d6a3":"standardDailyLimit()","f217f15c":"doCreate(uint256,bytes)","f2180c61":"versionCode()","f2181e23":"initializeGasPriceLimitFundraiser(uint256)","f219fa66":"depositERC20(address,address,uint256,uint256)","f21a1468":"getOutcomeTokens()","f21aaee6":"MinerChain()","f21aefd2":"isDebug()","f21af007":"unWhitelist(address)","f21b422a":"unregisterCustodian(address,address)","f21b64ad":"DepositETH(uint256)","f21b9379":"setRoundAvailableToken(uint256,uint256)","f21baec7":"withdrawPreIcoFounds()","f21c27a7":"CTAMToken()","f21cdf6f":"defrost()","f21d5dea":"withrawAll()","f21ddc7a":"teamBalanceOf(address)","f21f537d":"startedAt()","f21f80d0":"setGenome(uint256,uint256)","f21f8236":"getRefTo(address,address)","f2204d35":"getWalletsFromUser()","f220cbe0":"GetIsPaused()","f2218819":"getAddressAndSharePriceOfFunds()","f221abef":"isReachedThreshold()","f221b25b":"addSponsorshipsTotalRefunded(address,uint256,uint256)","f221b75a":"addCET4(uint32,string,uint32,uint32,uint32,uint32)","f221fda0":"totalRooms(string)","f2225500":"FHCoin()","f222d0b9":"getNumberOfBets()","f223446c":"start_game(bytes32,uint8,uint32,uint16,address,uint256,uint8)","f2234f6e":"confirmAdmin()","f223885a":"deposit(uint256[],uint256[])","f225138b":"littCapsuleGet(bytes32)","f22513a7":"withdrawLatium(uint256)","f225415a":"getFrozenBalanceByAddress(address,address)","f2260031":"lockAddress(address,bool)","f2263e12":"refundedFunding()","f2269c8e":"_createFootballerStar(uint256,uint256,uint256,uint256)","f2269dba":"airdropCooldownEnd()","f2274abb":"getReservedIsVested(address)","f227b198":"CreateWEE(address,uint256)","f229abbd":"enableBurn(bool)","f22a0b31":"getDays(uint256)","f22a598f":"changePriceUpdateTimeline(uint256)","f22aa38b":"getSDCCSupply()","f22aae52":"_memcpy(uint256,uint256,uint256)","f22b0c94":"setBonusOff()","f22b258a":"trustedMarketTransfer(address,address,uint256)","f22b683e":"delKycVerifiedInvestor(address)","f22c0f7d":"isValidTxPaymentForMCW(bytes32)","f22c10d7":"setShareHolders(uint256,address,uint256,bool)","f22c618e":"isItemStopped()","f22c6a7c":"STE(string,string)","f22c71e5":"finalizeLottery(uint16,bytes32,uint256)","f22c8f63":"FINANCE_CAP()","f22d022b":"burnIcoCoins()","f22dbfe6":"forLoyalty()","f22f264d":"setMinBalance()","f22ffd1d":"TLN_TOKEN_DECIMALS()","f23008ca":"CarBonCash()","f2309723":"setUserApproval(address,address,string)","f2316472":"transferMyTokens()","f2325244":"VULCAN_PROMETHEUS_MAX_CARGO()","f232880d":"reserveWaveTokens()","f232a84d":"getAmountAttempted(address)","f232e351":"initializeBalances()","f23342d8":"checkHashExists(bytes32)","f2335e9d":"setAvgGas(uint8,uint16)","f2342bba":"getBagDetails(uint256)","f2342cd5":"Contributor(string,address,address)","f234bac5":"tokenCreationCapUpdate(uint256)","f235bdfd":"getRetailerTotalBalances(address)","f235bfa4":"addAccount(address,string,uint256)","f236e2fb":"UTCT()","f2371fb3":"grantGiveableKudos(address,uint256)","f2371fd1":"newEmployer(bytes32)","f238683f":"lastKing()","f238dbea":"minimum_payment()","f2393d55":"getKebabsSincelastKebab(address)","f239c5dd":"crowdsaleMinted()","f239e528":"sendOneEtherHome()","f23a6e61":"onERC1155Received(address,address,uint256,uint256,bytes)","f23a8155":"internalInvest(address,uint256,uint256)","f23a8aa6":"getOwnerLink(address)","f23b55c3":"BB8Token()","f23b6fa2":"emitApprovalEvent(address,address,uint256)","f23b872e":"tvc()","f23ba8e6":"hire(address,uint256)","f23bc4f8":"acceptOffer(uint64)","f23c51cd":"setReceiverContractAddress(address)","f23ca012":"becomeNorsefire()","f23e22a7":"rescheduleTransaction(uint256,uint256)","f23f16e6":"appealCost(uint256,bytes)","f23f2cbe":"withdrawWithFee(address,uint256,uint256,bool)","f2405395":"STAGE_THREE_ETHRaised()","f2408d6b":"PIN(uint256,string,string,uint256,uint256,uint256)","f2409d65":"getMileagePoint(address,address)","f240d0f5":"feesWithdrawn()","f240f7c3":"dispute()","f24113c6":"updateProfile(bytes32,bytes32)","f241335d":"calculatePrice(string,uint88)","f2414cbd":"YASToken()","f24150ae":"VoxelDestroyed(uint8,uint8,uint8)","f2415183":"Tithe()","f2416f64":"oracleItCallbackAddress()","f242432a":"safeTransferFrom(address,address,uint256,uint256,bytes)","f2429b1c":"buyCryptopinions(address)","f2430fe5":"Plumix()","f243c170":"buyTokens2(address)","f243c2a7":"tokenIssuer()","f244815e":"setBuyUnfreezePeriodSeconds(uint256)","f245036e":"setPools(address)","f2451a43":"addOwnerNotations(string)","f2455807":"setDesignatedReporter(address)","f24570e0":"approvedFactories()","f245b9e4":"DVIP(address)","f245d8c6":"NewHero(address)","f2460172":"_removeAssetFrom(address,uint256)","f246080a":"addvehicles(address,string,string,string,string,string,string)","f246317c":"SafeTimeLock()","f247016c":"isVoteOngoing()","f2477f7c":"BLOCKREWARD()","f24818cb":"unholdTime()","f2491377":"MAX_SINGLE_ISSUED_FROM_OTHER_CURRENCIES()","f249cf19":"get_all_challenges()","f24a0faa":"balance3()","f24a534e":"Oracle()","f24a6997":"maxGasRefund()","f24ae640":"countAccounts()","f24b5779":"removeTrustedIssuer(address,string)","f24b6782":"updateCrowdsaleTimeline(uint256,uint256)","f24d2532":"changeRegistrationStatus(address,bool)","f24e4a15":"Purge()","f24e7fd9":"activateKillSwitch()","f24edfd6":"setWhitelistedAddressPre(address[],bool)","f24f9abe":"grantBonusTokens(address,uint256)","f24ff92c":"withdrawal(uint256,address,uint256)","f2505211":"oracleItQuery(uint256,string,string,string)","f2513ee9":"cancelMarketsWhenPaused(uint256)","f2518983":"reinvestEther()","f251bc8c":"addPack(address[],uint16)","f251fc8c":"totalContributors()","f25214e4":"CRYPTODOL()","f2523e7a":"setUseRegistry(bool)","f2529e55":"Fidget(address,address,uint256,uint256,uint256,uint256)","f2530d1d":"claimableDividend()","f2534e47":"changeCertifier(address)","f253e6ae":"Daric()","f2540e39":"_unfollow(address,address)","f2556289":"endDutchAuction(uint256,uint256)","f255c21f":"Offer(address,string,uint256,uint256)","f2561a43":"voteSuicide(address)","f25633dd":"year1Unlock()","f256b130":"marketingFund()","f256b48e":"getBalanceOfDist(bytes32)","f257bf3b":"getAuthorityIndex(address)","f2582ef5":"UserStatus(string,address,uint256)","f258a4ea":"investorAccounts(uint256)","f2590315":"ClockAuction(address,address,uint256)","f25a7815":"MockSale(address,bool,uint256,uint256,uint256,uint256,uint256,uint256[])","f25acb35":"acceptDeal(bytes16)","f25aed54":"accountWithUpdatePermissions()","f25b278b":"fetchHash(uint256)","f25b3f99":"blocks(uint256)","f25c130a":"createOnRound(uint256)","f25c870a":"MyERC223(string,string,uint8,uint256)","f25dafd1":"drainAUC(uint256)","f25e34a9":"checkJuryVoted(address)","f25e7bb4":"getState(bytes20)","f25e9ed2":"getMaster(address)","f25eb5c1":"removeReverse()","f25ebdad":"isProxyManager(address)","f25ee28d":"MySecondToken()","f25efc49":"frozenRecords(uint256)","f25f4b56":"feeWallet()","f25fbe6f":"MetaGold()","f260ad05":"titanToken()","f260bd94":"validateRequestParams(address[3],address,uint256[12],uint256,bytes,uint256)","f261a8c0":"withdrawbymanager()","f2624067":"LogIncreaseCap(uint256)","f2624b5d":"whitelistCount()","f262521f":"PHASE_5_PRICE()","f262de8c":"add_staircase(uint16)","f2634485":"setGameRules(uint256,uint256,uint256,uint256)","f26377ed":"kittyGym()","f2642d0f":"decayedTransfer(address,uint256,address)","f2653966":"createReleaseAuction(uint256,uint256,uint256,uint256,uint256)","f26557d8":"AdeelaTestCoin()","f2659bd1":"GetCityLandNums()","f265d351":"rateSetter()","f2663a03":"TERSERAH()","f267035f":"BOARD_1()","f267215a":"_getProviderClosed(uint256)","f267ded5":"TokenStarted(address)","f268225c":"setBountyWalletAddress(address)","f26835d4":"tokensRemainingInHolding(address)","f26a058d":"U21Y()","f26b9834":"ENOM()","f26baecc":"_capLevelEth()","f26bb53d":"setCityPlan(address,uint256)","f26bbde8":"WHOMCrowdsale(address)","f26c159f":"freezeAccount(address)","f26c6aed":"newChannel(address,uint256)","f26cbe9a":"raiseDollarsDeducted(address,uint160,int160)","f26df083":"finalIntervalForTokenGen()","f26e5e85":"GetUpgradeCost(uint256,uint256)","f26e787e":"sendDelayedTransactions()","f26f336e":"MINING_RESERVE()","f26f4f61":"threshold(bytes32,address)","f26f6334":"setCraftingAddress(address)","f26fb705":"getPayoutRoundId()","f270bcda":"getClosingBlockNumber(uint256)","f2711812":"milion()","f27197ab":"getIsAvailable()","f272404d":"_approve(address,uint256,address)","f2729497":"numberOfFarmers()","f2729d8a":"getMinutes(address)","f272a60c":"addBagDelayed(uint256,uint256)","f272fe18":"Campaign(uint256,uint256,uint256,address)","f273515c":"Cyberminer(uint256,string,string)","f273fbbc":"perform_withdraw()","f27402e9":"bchRaised()","f274a828":"icoPhase3Start()","f274d00c":"LAWCoin(uint256,string,string,address)","f2759ee2":"transferDomainBackToSeller(string)","f2760d9c":"shareHoldersWallet()","f2761444":"MathUtil()","f2766051":"lastFinish()","f276e1c7":"voteResultPublish(address[],uint256[])","f276f36b":"getGameDataByIndex(uint256)","f276fdde":"onTaxTransfer(address,uint256)","f277010d":"percentFeeTimes100()","f27715b4":"updateMultiSig(address)","f2787d33":"feeAccountToken()","f278bd02":"newBooleanValue()","f279648b":"setConstraint(int256,bytes32,bool,bool)","f279fac5":"internaltransfer(address,address,uint256)","f27a4188":"icoSucceed()","f27a73ca":"frozenCell(address,uint256)","f27a8a99":"updateEmployeeInfo(uint256,string)","f27ac4d9":"decrease(address,uint256)","f27ae77d":"DGDIssued()","f27b6d8f":"Message(string,address,uint256)","f27b8084":"walletWebydo()","f27b9341":"getTeamPlayersNum()","f27c24ed":"startCloseSale()","f27c3bf6":"oneYear()","f27c85bc":"getQuickPromoPercent()","f27d0afe":"deleteArbitrator(address)","f27d3977":"NEOBleu()","f27db8c9":"getWinnerPayout()","f27e2ef6":"nextMineEvent()","f27e4b1e":"SwitchTokenTransactionsOn()","f27ee76c":"lastPot()","f27eede0":"getTotalBid(address,uint256)","f27f974b":"Margaret()","f2801fe7":"getUserInfo(address,address)","f28063ce":"getMemeHolders()","f28075af":"get_player_address(uint256)","f280efaf":"addressToBytes1(address)","f28109d1":"ConsentTemplate(string,string,uint256,string,string,string)","f281c386":"_percent(uint256,uint256,uint256)","f282f551":"setCrowdsaleTokenExtv1(address)","f2836e1c":"contributorStatement(uint256,string)","f28386bf":"Nexium()","f2853292":"ChangeOwner(address)","f2856a2a":"getTeamPlayers(uint256)","f285d98e":"unlockSecret()","f285f25c":"tokenMetadataHash(uint256)","f286c1c5":"addtoOwners(address,address)","f287900d":"LogContribution(address,address,uint256,uint256,uint256,uint256)","f288753d":"centsPerEth()","f2888dbb":"unstake(address)","f2891b3d":"assetRegistrant(bytes32)","f28a2f75":"_allocateUnspentRefTokens()","f28a7912":"quick2()","f28ac86a":"token(string,string,uint256)","f28adc4d":"Attack()","f28afb1e":"pushAngelInvestmentData(address,uint256)","f28b325d":"admin_set_shopStoreRegister(address)","f28b7a9c":"disbursementAmount()","f28b824e":"MAT_TOTAL_SUPPLY_LIMIT()","f28c0716":"approveDeal(bytes32)","f28ce253":"is_min_goal_reached()","f28d253d":"getDividents()","f28e59c9":"get_sale_owner(address)","f28ee00c":"permittedSender()","f28f0f6a":"bulkCreateLambo(uint256,address,uint64,uint256,uint256)","f29143ad":"Project_ChangeOwner(uint256,address)","f2928eea":"CaptainPreSell()","f2934817":"HalalPenny()","f293bab5":"numberofnews()","f294aa26":"EndoSHARD()","f295206f":"_unsafeSend(address,uint256)","f295587e":"giveITup()","f29617da":"registrationDeposit(address)","f2965a2c":"BurnupGameCore(address)","f296c1f2":"buyTokens(address,uint256,uint256,string)","f297109d":"RESERVED_TEAM_LOCKED_SIDE()","f2977c97":"approve(address,bytes32,bool)","f298083b":"setLottery(address)","f2980eb2":"getPRewardLength(address)","f29a72ff":"_addTokenToPartition(address,bytes32,uint256)","f29b2040":"export(address,bytes8,address,address,uint256,uint256,bytes)","f29c1bc2":"setIsChargingTokenTransferFee(bool)","f29c7870":"setRefineCost(uint256)","f29d2f28":"setTokenHolder(address)","f29f1fa2":"RecievedEth(address,uint256,uint256)","f29f4d0b":"lastBuyTime()","f29f7b1b":"remove_coin(uint256)","f29fdb8a":"createSeason(uint32,uint64,uint64,address[8],uint256[8],uint16[8],address[8])","f29fe77e":"testMintGuy(int256)","f2a0928d":"preICOduration()","f2a0a987":"GCNYToken()","f2a16d5a":"GetNonce(uint8)","f2a38dac":"setKYCAdmin(address,address)","f2a4a82e":"item()","f2a5630a":"BallotUp()","f2a5c79c":"getViewDatas()","f2a6517f":"updateTokenContractAddr(address)","f2a69417":"cancelFoundationTransfer()","f2a6e605":"evenDistThresh()","f2a724b1":"SnoqualmieCoin(uint256,string,string)","f2a75fe4":"empty()","f2a7e624":"approvedWallet()","f2a9a8c7":"allowance(bytes32,bytes32)","f2ab3e60":"incomeOf10k()","f2ab59d9":"contributionTarget_()","f2ab9384":"sumElements(uint256[])","f2abd01d":"initialBeating()","f2ac9427":"pricesToCommit(address[])","f2adc939":"removeBoundary(uint256)","f2af0e2f":"getProviderCurrentSupply(address)","f2af59bf":"fourthStage()","f2afe985":"LEBRON()","f2b0318e":"_getNibbleArray(bytes)","f2b05c15":"getTopicCount(address)","f2b0a55d":"getPlotData(uint256)","f2b175c0":"sendTokenTeam(address,uint256)","f2b1be45":"setAquariumCost(uint256)","f2b265ca":"playGame(uint256,string,string,string)","f2b26d8f":"nextEtherForSale()","f2b29993":"getMineral(uint256)","f2b2f40c":"allowPurchase(uint256)","f2b2ff1b":"platformReferral()","f2b3ddfa":"getCET4ByAddr(address)","f2b40209":"RATE3()","f2b445ad":"rowround(uint256,uint256)","f2b45ac1":"startCrowdSale()","f2b45ec5":"DonQuixoteToken()","f2b47d52":"geneScience()","f2b4c1b9":"isValidDataHash(bytes32,bytes)","f2b559ac":"printQuotation(int256)","f2b6e8b6":"emitSynthetixUpdated(address)","f2b7a54b":"destTokensAirdrop()","f2b841c0":"isPlayerIdle(address,uint256)","f2b85515":"addNewGame(address)","f2b904c3":"checkBetColumn(uint8,address,bytes32,bytes32)","f2b9541f":"createEthCommunityToken(string,uint8,string,uint8)","f2b9b40f":"enableRegistration()","f2b9f903":"_getParticipantRoles(address,address)","f2b9fdb8":"supply(address,uint256)","f2ba18ed":"calculateVotes()","f2ba31ea":"Marine()","f2ba478d":"EtherCashPay(address,address,address,uint256,uint256,uint256)","f2ba810e":"PRE_SALE_30_BONUS_MIN()","f2baaa07":"createBet(uint32,uint256)","f2bb5ce1":"maxMintProofOfStake()","f2bbca67":"checkVotingForChangeBuySellLimits()","f2bbdab4":"N2C()","f2bcd022":"withdrawalAddress()","f2bddf66":"redemptionInfo(address,uint64)","f2be600d":"getNumTanksType(uint256)","f2bea1fc":"MANAGER_SUPPLY()","f2bee03d":"set_sale_address(address)","f2bf7e7a":"TokenGAC(uint256,string,string)","f2bff63b":"ico_tokens()","f2c00979":"_emitTransferred(address,address,uint256,address)","f2c0cdbe":"dividendsPercent()","f2c0d168":"newOwner(address,address)","f2c1d74e":"FansToken()","f2c298be":"register(string)","f2c2dff2":"testFailSetNotRetractableNotOwner()","f2c340f2":"chfCentsPerToken()","f2c3e6d9":"requireTokenFuel()","f2c402b6":"todayReserved()","f2c44e77":"UpgradeEnabled(address)","f2c4c45d":"makeInvestment(address,uint256,address,address,uint256,uint256,address)","f2c51f9d":"DNAc()","f2c5925d":"setNext(bytes12)","f2c6bab0":"doCallNumber()","f2c70bda":"addInvestorIfNotExists(address)","f2c7d331":"receiveDividends(uint256)","f2c80435":"addToUnminted(uint256)","f2c816ae":"addAddressToBlacklist(address)","f2c8257e":"getcapname()","f2c8a87b":"SYC2ndEarlyPurchase()","f2c8b676":"FACTOR_8()","f2c8d247":"convertibleToken(uint16)","f2c9e0ed":"SkrumbleToken()","f2c9ecd8":"getNumber()","f2cba6a6":"REPUTATION_DECIMALS()","f2ccaed5":"getSaleContractEndBlock(address)","f2cd84d5":"tokenHoldersToClaim(address)","f2cedaa0":"destroyCoins(address,address,uint256)","f2cee589":"TIER1_PERCENT()","f2cf687a":"MAXPERWEI()","f2cfe267":"setEpochData(uint128[],uint64[],uint64[],uint256[])","f2d05f2b":"playerIndexToOwner(uint256)","f2d06540":"setBitpaintingStorage(address,address)","f2d15c48":"setLicenceTellerPrice(bytes2,uint256)","f2d213c8":"BONUSED_PURCHASES_LIMIT()","f2d2e1a7":"QSHU()","f2d2fa91":"privateSaleMaxContrAmount()","f2d386b9":"getjournalists()","f2d439d8":"PokerPayout()","f2d50151":"verifyRs1Hash(bytes,bytes32)","f2d578dc":"RHToken()","f2d57adf":"setClaimInterval(uint256)","f2d5866d":"ATTR_EXPLORABLE()","f2d5d56b":"pull(address,uint256)","f2d68ee0":"withdrawCollateralFromPool(address,uint256)","f2d6cd26":"CEO_Trader()","f2d6e0ab":"__process(bytes,address)","f2d701a7":"giveaway(uint256,uint256,uint256,bool,address)","f2d73dc6":"VoteZoneToken()","f2d7f637":"closePosition(bytes32,uint256,address,address,bool,bytes)","f2d805d5":"firstStageRaisedInWei()","f2d906cc":"addressFounders2()","f2d93fb0":"setRushTimeFloorCount(uint256)","f2d9f46e":"flipPayingDoublrs(bool)","f2da1f0a":"imageAddress(address)","f2da67db":"setMany(uint256,int256,uint256,bytes20,address,bytes)","f2da877d":"dataOfSell(address,uint256)","f2dabd26":"multipleMint(address[],uint256[])","f2dadd3d":"FundRequestPrivateSeed(uint256,address)","f2db5493":"VGS()","f2dbe0f8":"options(bytes32,address,address)","f2dc8878":"setTokenSaleAmount(address,uint256)","f2dd4be8":"publish(string,bytes32,uint256)","f2dd6585":"garanteSystemDepositInAllFunds()","f2ddc772":"confirm(bytes)","f2dddd95":"BLDAToken(uint256,string,uint8,string)","f2de12fc":"getFxUSDAmount(string,uint256)","f2dfa136":"STATUS_DEAL_WAIT_CONFIRMATION()","f2dfd7f5":"cancelWarranty(string,string,address)","f2e03ad0":"openProvider(address,bool,string,string,uint256,string,uint8,bool,address)","f2e09c7a":"activatePoint(uint32,int256)","f2e0d636":"registerSponsor(uint32,int256,bool,uint32)","f2e1192a":"wolkSale()","f2e12a39":"setRole(uint8,address)","f2e1b1cc":"getWinSlot(uint256)","f2e1be50":"GDPOracle()","f2e22ae0":"messageBoard(string)","f2e253ec":"FUTURE_ME_TOKENS()","f2e27b33":"signedTransferHash(address,address,address,uint256,uint256,uint256)","f2e28e16":"BrianexToken()","f2e2e5ea":"trustedAddressInLUT(uint256)","f2e34909":"PRICE_CUTOFF()","f2e4ff30":"isValidAuction(uint256)","f2e552a5":"verifyUpdateTransaction(bytes32,uint256,address,uint256,address,uint256)","f2e55ac1":"getDestinationByIndex(uint256)","f2e62772":"admin_address()","f2e650ff":"PerpetualTestCoin()","f2e6e170":"addressesImported(address,uint256,uint256)","f2e6fecd":"Ethernational()","f2e7514c":"buyByName(string)","f2e79ab7":"ETHealth()","f2e84f24":"_byrne(uint256)","f2e998df":"ownerRevealOverride(uint256)","f2ea83e6":"executeRecursive(address,address,bytes32,int256)","f2eae773":"getLockedWalletAmount(address)","f2eaee02":"applyWait()","f2eb32fb":"addOffChainContribution(address,uint256,uint256,string)","f2eb3e34":"init1()","f2eb5dd3":"tokenUSDRate()","f2ebde57":"tryExec(address,bytes)","f2ec602c":"feeWithdrawn()","f2ec6264":"ownerAddressLUT(uint256)","f2ecebea":"ratePreIco()","f2ed2148":"newGateway()","f2edb7c7":"purchaseWonder(uint256)","f2ee8be9":"setSubmissionOpen(uint256)","f2eea5c1":"setupAccreditedAddress(address,uint256)","f2eec570":"transferredAmount(address)","f2eec69b":"CTOAddress()","f2f03877":"commit(uint256,bytes32)","f2f0967b":"setLifToken(address)","f2f18af2":"Withdraws(address,uint256)","f2f254c7":"getLatestMinorTree(bytes32,uint32)","f2f2a043":"setUserCommissionRate(uint256)","f2f3384e":"_getGen0Address(uint256)","f2f3a1d2":"Erc20Token(string,string,uint8,uint256)","f2f3c773":"vestInterval()","f2f48e20":"Update_START_PRESALE_TIMESTAMP(uint256)","f2f4eb26":"core()","f2f56ffe":"getCommit(uint256,address)","f2f62ac7":"TOSPrivateIncentiveContract()","f2f65960":"setGracePeriod(uint256)","f2f6861b":"WinbitTest()","f2f6ccda":"getBalanceFromOwner()","f2f6ff15":"COLOR_BLACK()","f2f70594":"disableMintForever()","f2f8569f":"buyAndTransfer(address,address,bytes)","f2f85fce":"GRAND()","f2f921e6":"snapshotDailyGooDepositFunding()","f2f977a7":"getBetsByCategory(string)","f2fa8f69":"TokenPolicy(address)","f2fc6deb":"weiToTokensBono(uint256)","f2fc9100":"init(address,string,string,uint8,uint256,bool)","f2fd2a49":"galleryThree()","f2fdddf4":"setEncryptContract(address)","f2fde38b":"transferOwnership(address)","f2fdfe34":"createSpecies(uint256,string,address)","f2fe1a1d":"geSoftwareVersionRecordsLength()","f2fec913":"collectMKR(uint256)","f2ff0912":"getHolderAtIndex(uint256)","f2ffb4fc":"stopLive()","f30000f9":"NewCloneToken(address)","f300cf1d":"addUserToMeta(address,uint256)","f301ac65":"hashBid(address,uint256,address,address,bytes32,uint256,uint256)","f3022de8":"setNewContractAddress(address)","f3025556":"newDeveloper(address,uint64,bool)","f3025f10":"dataOfBuy(address)","f302be42":"startTokenRaffle(uint256,address,uint256)","f3036c24":"UTORN()","f30398ef":"Wishcoin()","f30416ca":"setSaleAuctionContractAddress(address,address)","f30431b5":"addAdminAccount(uint256,address)","f3052d26":"getCategory(uint256)","f30562b6":"updateRecord(string,string,string)","f3072020":"partner_1_name()","f3074b58":"withdrawSDTfromcontract()","f307946d":"hardCapMainSale()","f3083c44":"GetMyEarnings()","f308846f":"registeredCallbacks(address)","f3095511":"GetTokenPriceCents()","f309782b":"LescovexAddr()","f309caca":"icoEndOfStageB()","f309e3c5":"allocateUnsold()","f30a4a70":"getSoldToken()","f30a7166":"multiTransferFrom(address,address[],address[],uint256[])","f30ba854":"tokensPerEther_numerator()","f30bb8af":"GoalReached()","f30c0ee6":"getRank05()","f30d3ad4":"crowdSaleAmountRaised()","f30d4d3f":"signedTransferFromCheck(address,address,address,uint256,uint256,uint256,bytes,address)","f30df155":"calculateBorrowAmountWithFee(uint256)","f30f8508":"setReservedTokensList(address,uint256,uint256)","f30faff6":"SetExtra(uint256)","f31011ac":"ANTS_TO_COLLECT_1ANTHILL()","f310348e":"_removeFrom(address,uint256)","f3106780":"DoDividend(uint256,uint256,uint256)","f3107c48":"nestedFirstAnyToAny2(uint256)","f310a19d":"getPlayerVaultsHelper(uint256,uint256)","f31174ee":"inactivityReleasePeriod()","f3125a1f":"deposit(address,uint256,bytes,uint256)","f31294a4":"announcementURI()","f3130ba5":"setTokensSoldInPresale(uint256)","f3147b00":"totalICOAmount()","f314bf46":"setReleaseDb(address)","f314e2c0":"CoinExchangeToken(uint256,string,uint8,string)","f314e976":"parcelGzeWithoutBonus()","f315e81d":"getStage1End()","f31604c7":"setData()","f3161022":"convertToEther(uint256)","f3164eb6":"transferAndFrozen(address,uint256)","f31660e9":"getOrganisationsSize()","f3169506":"readPurchaseAtIndex(uint256)","f316ea78":"buyOrderTotal()","f317b85b":"ownerAddressNumberMap(address)","f3181001":"founderAndTeamSent()","f3182d6c":"setFeeRate(address,uint256,uint256)","f31887e6":"tokenTransferByAdmin(address,uint256)","f318c75f":"dvipAddress()","f318cc4a":"invite(uint256,uint256,uint256)","f3191443":"toggleMigrationStatus()","f3199e98":"setMinWeiForDInit(uint256)","f319a899":"NameProvider(address)","f31a044d":"test_bytes(bytes,bytes)","f31a18a5":"endICOStage7()","f31b4e89":"updateEpisode(uint256,string,uint256)","f31bac4d":"SwitchLoanOwner(address,uint256)","f31bebaf":"BugBountyOneBreaker()","f31df3f8":"AddItem(uint32,uint16,uint256,uint16,uint16,string)","f31e3e84":"AML()","f31e731e":"attack(address,bytes32,uint256)","f31ed9e6":"DescartesToken()","f31fe982":"endGround(uint256)","f3200a1c":"change_symbol(string)","f3201424":"register(address,address,address)","f3203dc0":"MultisigsChanged(address,address)","f3205c93":"isUserBanned()","f320d963":"assertEq(string,string)","f32106f0":"TemplateToken(uint256,string,uint8,string)","f32113d5":"setBgxWalletAddress(address)","f3214652":"NHSToken()","f321653a":"setCommunityBallotStatus(bool)","f3217345":"getShowText()","f32188a5":"reinvest(address,bool)","f3221c7f":"hasHash(address,bytes32)","f322770c":"LogWhitelistAdd(address,uint256,address)","f3227dc4":"cancelDeal(string)","f322a1cf":"BlueChainToken()","f322c755":"daoManager()","f32306d2":"registerNameXID(string,uint256)","f3236460":"closeUp()","f323a061":"lottoQueue()","f3269716":"year()","f326be05":"Centaure()","f3278191":"BuyFST(address,uint256,uint256,uint256)","f32784cd":"getGratitudeOf(address,uint256)","f327b7fc":"isNotZero(address,string)","f3283fba":"setMultisig(address)","f32a547c":"getBuy(uint256)","f32a72eb":"airDropMembers(address)","f32a9f77":"ReceiveEther(address,uint256)","f32b85e8":"timeScale()","f32d61eb":"setDevTokensPercent(uint256)","f32e8038":"setPercentIncrease(uint256,uint256,uint256)","f32eca11":"revokeAccessDeposit(address)","f32efd3c":"recoverUser(address,address,uint256,uint8,bytes32,bytes32)","f32f6a23":"olympus()","f32fc856":"Wanchain()","f32fe995":"left96(uint256)","f3302a4d":"ChangeTransferStatus(bool)","f3305ae2":"setName(bytes32,address)","f331020c":"GAMEPAUSED()","f3310628":"allocateTokensInternal(address)","f33146af":"test_twoTrueAsserts()","f3316ef5":"countStudentRequest()","f3318fed":"ThrowsInConstructor(bool)","f3319243":"decimalFraction(uint256,uint256)","f331de4c":"addShare(address,uint256,uint256,uint256)","f332511f":"getTxcode(uint256)","f33261ac":"stageCount()","f33280b2":"etherLimit()","f332a245":"unbanToken(address)","f3332d1c":"burnTokensExp(uint256,uint256)","f3333e7f":"etherProceedsAccount()","f33376c6":"createNext(address,string)","f333fe08":"getCertificate(bytes32)","f3358ac4":"getNum(uint256)","f33670aa":"sharesAddress()","f336bc7e":"maxDecreasePct()","f336e80a":"setMaximumVotingWindow(uint256)","f3372898":"dtrade(address,uint8,uint8,uint256[],address[],bytes32[])","f337616c":"PETER()","f337a0bb":"getLLV_edit_4()","f337c2e1":"calculateNextEtherValue(uint256)","f33801e0":"setCoachPrice(uint256,uint256)","f3382694":"isCamp()","f3388e75":"timelockController()","f338c984":"initialBountyAmount()","f3391998":"hasHash(uint256)","f339292f":"mintingStopped()","f3396905":"lockedNowBalanceOf(address)","f339c504":"lockBalance(uint256)","f33aa95d":"setIsTransferEnabled(bool)","f33ae7fd":"auctionOf(uint256)","f33b1ea5":"rewardUsers(uint256,address[],uint256[])","f33d0f3a":"requiredBet()","f33d9a52":"get_data_benefited(address,string)","f33dc1fa":"founderTokensAllocated()","f33f8f26":"setpubprize(uint256)","f33f9522":"readCoin(uint256)","f33ffc16":"addSpecialBonusConditions(address,uint256,uint256)","f34080b3":"MIN_INVESTMENT_ICO_PHASE_TWO_POUNDS()","f3408110":"transferWithFee(address,address,uint256)","f340fa01":"deposit(address)","f3412942":"accountLevelsAddr()","f34186c8":"endEthGet()","f341cae8":"setEmergencyAccount(bytes32,bytes32)","f341d3ba":"bandwidthFactor()","f3433ff2":"callbackTime()","f3436873":"totalAxiesRewarded()","f3436c85":"TKXToken()","f343ccbd":"CrystalSkull()","f3444701":"newTankType()","f344f4fa":"HARDCAPPED_SUPPLY()","f345d06b":"getTileHp(uint16,uint8)","f3463272":"signupFee()","f3465181":"preSeedAllocation()","f3466b47":"setTotalCollected(uint256)","f346fd74":"TraceChain()","f34839d1":"C50()","f3492915":"confirmSpendLimit(uint256)","f34969d1":"minimumFundingCHF()","f349e3e3":"own(address)","f34a5e85":"MercuryToken()","f34b95b3":"register(string,address,bytes32)","f34c7010":"commitSecurity(address,uint256,uint256)","f34d22d0":"getQuickPromoRemainingBlocks()","f34df94e":"Version(string,address,address,bool)","f34e2699":"isPresaleFinalized()","f34e3723":"release(string)","f34e4c60":"currNumOfBattleCards()","f34ed4e6":"RanDAOPlus(address)","f34f43f6":"getRepTokenAddress()","f34f5f45":"Election(string)","f3512ce0":"multiLock(address[])","f351d166":"_depositEscrow(uint256)","f3522656":"getRejections(uint256)","f353108b":"fechVoteResultForCandidate(address,uint256)","f353ae48":"goodluck()","f354040c":"SpreadToken()","f3541901":"execute(address,bytes,uint256,uint256)","f3548cd3":"getBagCount()","f354e2c3":"_getSeason()","f355b92d":"BuyTokens(address)","f356d6cc":"getPI_edit_18()","f356e8de":"placeNewSurvey(bytes32,uint256,uint32,uint256)","f3574a20":"TokenTransacted(address,address,bytes32,address,uint256,address)","f3576220":"withdrawls()","f3582373":"getTokenAddressesLength()","f3586fb9":"_isAuthorized(address,uint256)","f35898bd":"PreviousPayout()","f358b3de":"REKTMultiSigWallet()","f359671c":"withdrawWithReference(address,uint256,string)","f359b03c":"recalcBonuses()","f359d66d":"driverCount()","f35a8796":"removeHouseHold(uint256)","f35b3b51":"Bullioncoin()","f35b6068":"selectWinningNumber()","f35ba5d3":"acceptCeoOwnership()","f35c172e":"getSecondHexByte(bytes1)","f35d606c":"ETFToken(address[],uint256[],uint256)","f35dad40":"totalRedeemed()","f35e3945":"SRHCoin(uint256,string,string)","f35e4a6e":"setStartBlock(uint256)","f360234c":"compare(uint256,uint256)","f3604e54":"advisorsKey()","f36089ec":"getConversionRate()","f3608b57":"_getEthToUsdPrice(uint256)","f360c183":"setNonce(uint256)","f360e22f":"celebrityCount()","f3611719":"confirmFriendship(string)","f3616a90":"UpdateHOLDer(address,address)","f362b9af":"StartNewMiner()","f362d78f":"testBitNotEqualSuccess()","f3634033":"token_b_amount()","f363441f":"getCreatorDotBalance()","f363449f":"reservationSupply()","f3635a02":"vc2Wallet4Pct()","f3637d51":"setPayLock(bool)","f3647597":"setGrantVestedEDEXContract(address)","f364e7f4":"_investAsEarlybird(address,uint256)","f36631e7":"createHero(uint16,address)","f3667517":"getMinter()","f3669ec9":"hopefuls(uint256)","f36706cb":"SENSToken(address,address,uint256,uint256)","f3678cd3":"updateOffChainTokens(uint256)","f36a1fd9":"_allowBuyDirect()","f36a4bd3":"ReceivingContractTokenFallbackFailed(address,address,uint256)","f36b135d":"PRICE_EXPONENT()","f36c0810":"RANDOM_BYTES_COUNT()","f36c83f0":"getPuppy(uint256)","f36d1b8e":"SignStopDividend()","f36d1e4e":"setRewards(uint256,uint256,uint256)","f36d29e7":"triggerTansferEvent(address,address,uint256)","f36db900":"gameStarterDividendPercentage()","f36e20db":"getStage1Start()","f36e8dea":"MedicalCannabis()","f36f235d":"getLedger()","f36fd108":"editTitle(uint256,string)","f370031e":"BetOnATeam(address,uint256,uint256)","f3701da2":"build(address)","f3702b82":"setBonusPattern(uint256[],uint256[])","f3703a69":"LogGrantCreated(bytes32,uint256)","f3706bb7":"killTransaction(bytes32,bytes32,string,string)","f370ff51":"LogTokenPurchase(address,address,uint256,uint256)","f371475a":"initialiGnSupply()","f371ec49":"pausedB()","f3737ffd":"setDiscount(uint256[],uint256[])","f3746947":"giveBirth(uint256,uint256[2],uint256[2])","f3746ff7":"advisorReserve()","f375bcaa":"failedTimestampSeconds()","f37633f9":"Internet()","f376daa8":"MMX(uint256,string,string)","f3773466":"endIcoRoundManually()","f377f5b7":"setAirdropTotalSupply(uint256)","f3781697":"HubiiCrowdsale(address,uint256,uint256)","f3784dec":"withdrawFailed(address)","f378ff76":"random(uint32,uint32)","f3791477":"OLD_TOKEN()","f3794914":"mintParticularPart(uint8[4],address)","f37a7d4d":"boosters()","f37a9c1c":"ALLOW_BETA()","f37b0427":"CryptrustToken()","f37b437b":"scheduleCall(address,bytes,uint256,uint256,uint8,uint256,uint256)","f37b74ca":"authorizePayment(string,bytes32,address,address,uint256,uint256)","f37b916a":"tokenCreateUtcTimeInSec()","f37bdaac":"transferSig(bytes32,uint256,address)","f37bf1be":"getParticipateName(uint256)","f37cc477":"calcOutput(uint256,uint256)","f37d11cc":"canTransferFrom(address,address,uint256)","f37e592d":"shopStoreId(address)","f37e741e":"projectWeight(uint256)","f37f8345":"getTokenRates(address,address[])","f37fda1b":"setUser(address,address,bool)","f37fdaf5":"calculateProfitPercent(uint256)","f37ff01b":"getLLV_edit_13()","f380729d":"claimB2()","f3813163":"proxyTakeEtherBack(address)","f3817b23":"getWizzPandaCountOf(uint256)","f381a3e2":"FuelingToDate(uint256)","f381f2a5":"minimumCap()","f38323bb":"bountyDurationInBlocks()","f383c7b3":"setCrowdsaleStart(uint256)","f383d6b9":"OwnerValidatorImpl()","f384632c":"updateContestTeam(uint32,uint32,uint8[],uint32[])","f384764c":"oraclize_query(string,bytes[2])","f3850fda":"receiveTokens(uint256,uint256)","f385d890":"cnt_registrations()","f3868555":"orderEthOf(address)","f386b8fd":"TestToken2()","f3873e7b":"PublicBattle()","f38780e2":"winnerPaid()","f388b046":"currentTask()","f388ef80":"updateXPLPerEther(uint256)","f389057f":"_setMouthValue5(uint256)","f3898a97":"convert(address[],uint256,uint256)","f38a6163":"IncMainSupply(uint256)","f38a8262":"grantPermission(address,bytes32)","f38afbf7":"setModuleEnable(string,uint256)","f38b0585":"withdrawAdvisorFunds()","f38b0600":"fireEventLog3()","f38b2ef0":"testTheFirstMultiplier()","f38d5cb9":"_getHash(address,address,address,address)","f38db3d8":"setRunningInternal(bool)","f38e5ca2":"getBlobStoreFromFullBlobId(bytes32)","f38fb65b":"revertCall()","f3905b82":"ibaMultisig()","f390cae4":"ADDR_TKG_TECH_FUND()","f390e4b4":"getResidentNumber()","f3913e69":"tokenTransferFrom(address,address,address,uint256)","f391f074":"accountIdForAddress(address,address)","f3922cde":"addExceptAddress(address)","f39259d0":"_batch2_icosaleStartTimestamp()","f393b3b0":"_DataRegistered(bytes32)","f393f022":"icoStartP5()","f3942753":"addTxToCustomerRegistry(address,bytes32,uint256,uint256)","f3945ca0":"addEndorsement(bytes32,bytes32)","f39460c4":"setCheckMinContribution(bool)","f3956a71":"isMEH()","f396282d":"signupVerify(bytes32,bytes32)","f396cd66":"weiAmountShare()","f396e81b":"SALES_DURATION()","f397884b":"preIcoOpeningTime()","f3983e44":"createAmountFromTmedForAddress(uint256,address,address)","f398dc28":"aprovarUsuario(address,uint256)","f398faaa":"getRank09()","f3993d11":"batchTransferFrom(address,address,uint256[])","f39981e1":"burnStake(address)","f3998918":"getPreSaleTokenAmount(uint256)","f39992e4":"Blackwood()","f399c7e6":"startGame(address,uint256)","f39afaba":"GCV()","f39b1e74":"CQMVValueCirculateAssets()","f39b5b9b":"ethToTokenSwapInput(uint256,uint256)","f39b7fb1":"get_dati_articolo(bytes,bytes,bytes10)","f39bfb52":"giveBountyTokens(address,uint256)","f39c2197":"numberOfPartners()","f39cce01":"convertLotIdsByAddress(address)","f39d359b":"initDemoc(string)","f39d9f19":"CSES1()","f39e6e1e":"OwnerAddition(address)","f39e9fa6":"setERC223Activated(bool)","f39ec1f7":"lookup(bytes32)","f39f421e":"FIBKAD()","f3a04af4":"PUBLIC_TOKENS()","f3a133a9":"setStartAt(uint256)","f3a16c3e":"tokenCreationCapWithOutBonus()","f3a1b4b2":"setCrowdsaleStartandDuration(uint256,uint256)","f3a1d297":"addToken(address,string,string,uint8,string)","f3a1f828":"EventRandomLedgerRequested(address,uint256,uint256,uint8,address)","f3a247cb":"ZooToken(uint256)","f3a27963":"unpauseMints()","f3a3abc6":"setWhitelistTransfer(address,address,bool)","f3a3bef4":"innerScope()","f3a3de38":"EMACCrowdsale(uint256,uint256,uint256,address)","f3a44fe1":"withdrawForWorkshop()","f3a49f90":"sendOwner()","f3a504f2":"funded()","f3a53cd8":"ICOWIZARD(string,string,uint8,uint256)","f3a5626b":"addPurchased(bytes32,uint256)","f3a5644d":"crowdsaleEndedTime()","f3a5950e":"testHighestTranch()","f3a5f262":"setMemberTier(address,uint256)","f3a60cb4":"unLockAddrOwner(address)","f3a670cd":"Redeemed(address,uint256,uint256)","f3a67ad2":"subAccountBalance(address,uint256)","f3a8041f":"Crowdsale(address,uint256,uint256,uint256,uint256,uint256)","f3a87492":"AntiFakeLabelToken(address,uint256)","f3a8bcaa":"_logGameGiftInfo(address)","f3a9bf03":"verifyImage(address,string)","f3aa4420":"_grandTournamentBooty(uint256,uint256,uint256,uint256)","f3aa67ad":"buyTokensOraclePayIn(address,uint256)","f3ab7ea9":"seeker()","f3ac2732":"confirmed(uint256)","f3ac3df5":"prizeFund()","f3ac9ee4":"parseOpenTx(address[11],uint256[10],uint32[4],bool,bytes)","f3acc06b":"retrait_1()","f3acc477":"addTotalEtherValue()","f3ad0dd8":"multiTransferToken(address[],uint256[])","f3adcc46":"getMinerHashRateCurrentHalving()","f3ae2415":"isManager(address)","f3ae5acd":"LastExtractTime()","f3aee9f9":"tokensUnlockPeriod()","f3afe129":"hourPotExpiration()","f3aff181":"collectBagHolderFund(uint256)","f3b07bb1":"maxEthPerTransaction()","f3b15ffd":"test_insert_containsId()","f3b16265":"onDraw()","f3b303cd":"AdvanceToken()","f3b35100":"voteOf(address)","f3b3a9fa":"maxReserve()","f3b423d5":"updateReloadAmount(uint256)","f3b42c40":"isOnSaleAny3(uint256,uint256,uint256)","f3b4735e":"lotteryAddresses(uint256)","f3b4eccb":"ChallengeFund()","f3b50c04":"rescind()","f3b55007":"TDx(uint256,string,uint8,string)","f3b5678f":"ETHER_MAX_CONTRIB()","f3b585cc":"nSteps()","f3b5a5af":"bonusForEveryone()","f3b600ec":"_allocateTokens(address,uint256,uint256)","f3b6a748":"unpauseFrom(uint256)","f3b75ee3":"totalCommunityFundMinted()","f3b77f30":"close(bytes,bytes)","f3b849d6":"_allocateReferralTokens(address,uint256)","f3b8b2a9":"weiBuysHowManySeconds(uint256)","f3b978c1":"checkProof(bytes32[],bytes32[])","f3ba138e":"MineLevel(uint256)","f3baa092":"RemoveRequestEvent(address,address)","f3bb9741":"commitmentCampaign(uint256,bytes32)","f3bbc84c":"tierNum()","f3bd27a4":"secondStageMinting()","f3bda50a":"getSetNewTerrainPrice(uint256,uint256,bytes32)","f3bdc228":"destroyBlackFunds(address)","f3bdea04":"burnICACOIN(uint256)","f3be07eb":"getDefaultTranches(address)","f3be1e35":"VIVAToken(uint256)","f3becb59":"C(address)","f3bf6b73":"proposalChecked(address,uint256,uint256)","f3bf78e7":"setBAAAU(bytes32,address,address,address,uint256)","f3bf93a0":"forceReleaseAdmin(bytes32)","f3bfddb7":"getById(string)","f3bfe75e":"BeatTokenIcoFinalized()","f3c0efe9":"tokenToTokenTransferOutput(uint256,uint256,uint256,uint256,address,address)","f3c156f3":"purchaseDigitalArtSellingItem(uint256)","f3c15f49":"getLiability()","f3c16e54":"Resolve(bytes32)","f3c1c7c0":"LogCoinsEmited(address,uint256)","f3c20de0":"tokens(uint16)","f3c274a6":"isPut()","f3c37bd5":"Verifier(address,uint256,uint8)","f3c505c2":"updateInventories(uint256,uint256,uint256,uint16)","f3c50ce0":"CobeFriendCore()","f3c51c84":"_EnvoisTokens(uint256,uint256)","f3c537c5":"fint8(int8)","f3c64850":"amendedEarlyPurchaseIndexes(uint256)","f3c6a223":"Bifrost1Token()","f3c74496":"logWorkerStatement(string)","f3c78091":"AcceptingDepositsChanged(bool)","f3c7d275":"prenup(string,string,string,string,string,address,address)","f3c7e538":"set_successful_verifier(address)","f3c85eba":"compound(uint256,uint256,uint256)","f3c8f3ef":"startListing()","f3c8ffaa":"endPreICOStage()","f3c957f2":"haltCommitPeriod(address,bytes32,bytes32)","f3c95c60":"isValidUser(address)","f3c9a5cc":"CrowdsaleController(uint256,address,address,bytes32)","f3ca29b1":"ownerDailyWithdrawal()","f3ca2b54":"test_twoValidEqString()","f3ca5679":"Fund(address,string,address,uint256,uint256,address,address,address,address,address[],address[])","f3ca7425":"exercisePriceOf(uint256)","f3ca824c":"setStartCloseSale(uint256)","f3caad03":"isCitizen(address)","f3cb1805":"bidOnBreedingAuction(uint40,uint40)","f3cb8c31":"addEmployee(address)","f3cbc040":"checkVerify(bytes32,uint256,uint256,uint256)","f3cbe7b5":"exchangeableTokensFromStock()","f3cc2436":"maxPoolTotal()","f3cc6860":"setHash(bytes32,uint256,bytes32)","f3cca49a":"restoreUnsoldTokens(address)","f3cca5b4":"crowdSaleSoldAmount()","f3cca85a":"getInputAddress()","f3ccaac0":"image()","f3ccb401":"DistributeAirdropMultiple(address[],uint256)","f3ccc2f2":"buscarDocumentoPorQM(string)","f3cd1c28":"setTransfersAllowed(bool)","f3cd543f":"sendBoughtTokens(address,uint256)","f3ce2bc6":"_updateSaleAvgHistory(uint256,uint256)","f3ce40eb":"setSchellingRoundSupply(uint256)","f3ce782e":"LongBought(address[2],uint256[5],uint256)","f3cee129":"getOwnerServer()","f3cee64d":"setCmd(uint256)","f3d2f17b":"getData_22()","f3d2f824":"setXQU(string)","f3d305b4":"getBoostedProposalsCount(address)","f3d3402a":"changeBountyData(uint256,string)","f3d38a7b":"setBTBAddress(string)","f3d3d448":"setControllerAddress(address)","f3d3fce7":"settleLend(bytes,bytes,address,uint256,bytes,bytes,bytes,bytes)","f3d448d2":"countryInfo(uint256)","f3d47d1b":"transferAllFrom(address,uint256[])","f3d490db":"transferByPartition(bytes32,address,uint256,bytes)","f3d4b942":"emergencyFreeze()","f3d544d2":"FRTToken(uint256,string,string)","f3d6b54e":"setAirdropPrize(uint256,uint256)","f3d6cb29":"setLLV_edit_34(string)","f3d791ea":"submitTrade(address,uint256,address,bytes)","f3d79244":"frozenProfitDate(address)","f3d7bf1d":"privateStageTokensSold()","f3d7c6f7":"claimPrivateTokens(address[],uint256[])","f3d7e464":"EARLY_CONTRIBUTOR_VESTING_PERIOD()","f3d838a0":"Copyright()","f3d89c49":"setAutoCreationFee(uint256)","f3d91708":"isEligibleForUpgrade(address)","f3d97a25":"cancelTrade(address,address,uint256,uint256,uint256)","f3d9bc65":"sendBountyTokens(address,uint256)","f3d9eeec":"CourseChanged(uint256,uint256)","f3db09b8":"invoice(bytes32,address,address,uint256,uint256,uint256,uint64,uint64)","f3db4f2b":"retrievePieceFromEscrow(uint256)","f3dbaf0d":"removeVestingAdmin(address)","f3dd3d8a":"newCurrency(string,string,uint8)","f3ddb946":"bets_total()","f3de56de":"createNewSociety(string)","f3df0bbe":"startNewBallot(bytes32,bool,bytes32[])","f3df29b6":"periodITO_endTime()","f3e1cb63":"rsVerifyPublic(bytes32,uint256[2],uint256[],uint256[],uint256[],uint256[])","f3e1efbf":"validation_inviter(address)","f3e238d2":"StrongKek()","f3e2aa83":"requestReclaimEther()","f3e3c629":"testBalanceOfStartsAtZero()","f3e41a99":"addRound()","f3e4877c":"distribution(address[],uint256)","f3e4cac4":"_getTokenPrice()","f3e5c15e":"screenstate()","f3e62640":"buyToken(uint256,address,uint256)","f3e664c9":"setSaasApiProfitAddress(address)","f3e68264":"getSignerOfBalanceHash(address,uint8,uint256,bytes)","f3e71756":"checkTickets()","f3e84c4c":"FundingClosed()","f3e84cf3":"createNewRevision(bytes32,bytes)","f3e94596":"LogReferral(address,address,uint256)","f3ea1241":"releaseFirst()","f3ea4c68":"set_symbol(string)","f3eac094":"defaultAuctionPrice()","f3eb2445":"SimpleToken(string,string,uint256,address)","f3ec3f4a":"whitelistPreSaleAddressMany(address[],bool)","f3ecda21":"ITSM()","f3ece9f4":"addBlockList(address)","f3ed064a":"bonus01End()","f3edf112":"changeHelper(address)","f3ee6305":"removeCertificationDocument(address,bytes32)","f3eeb84b":"lastBlock_f9Hash_uint256()","f3eef981":"_init(uint40,uint40)","f3f10da7":"Balance(string,uint256,address)","f3f11048":"ethAddressPublicKey(bytes32,int256,bytes32,int256)","f3f16a15":"voted(address,bool)","f3f18615":"verifyTrustedSender(uint256,address,uint256,uint8,bytes32,bytes32)","f3f1b5a7":"CongressOwned()","f3f1d909":"redeemCoin(uint256,address,bool)","f3f1e4ea":"MenglaToken(address)","f3f2e656":"setAttributeSigned(address,uint8,bytes32,bytes32,string,bytes,uint256)","f3f2f0bc":"beneficiary2()","f3f31853":"getPayTable(uint16)","f3f43703":"pendingWithdrawals(address)","f3f458f8":"cycleCount_()","f3f480d9":"challengePeriod()","f3f4aef3":"getUserIDAndInviterEarnings()","f3f52865":"getPersonalStakeAmounts(address,address)","f3f6f0d7":"lastIndex()","f3f70674":"oracle_call(uint256)","f3f7650d":"fetchOrdersForMerchant(address)","f3f79a97":"setDebtIncreasingFactor(uint256)","f3f9240b":"investAs(address)","f3f969a0":"setRegisteredAuthority(string,address,bool)","f3f9c004":"reffalPool()","f3fa1e7b":"bulkApproveTransfers(uint256[])","f3fa2c37":"getUpdateHash(uint256,uint256,uint256,uint256)","f3fac412":"_calcEndTime(uint256)","f3fb9a02":"setInfo(uint256,uint256)","f3fbabb5":"setDedicatedProxy(address)","f3fbfc60":"SFTSEV()","f3fc536d":"revokeConfirmation(bytes32)","f3fc7fb2":"Ordient()","f3fce3b5":"setC4FContractProviderCompleted(address,bool)","f3fd826f":"transferFromTokens(address,address,address[],uint256[])","f3fde261":"onTransition(bytes32)","f3fe12c9":"claim(string)","f3fe5bc2":"totalWitdrowedToken()","f3fef3a3":"withdraw(address,uint256)","f3ff10bf":"UseQuantity(int32)","f4009d99":"changeMainStartTime(uint256)","f400a3d7":"finishDate()","f400d37b":"yesVoteSum()","f400fde4":"amount1()","f4010db0":"deleteTile(uint16)","f4016ac3":"setInitialState(address)","f4016b17":"destroyBPESOToken(address,uint256)","f4025568":"approveCertificate(uint256)","f4029e92":"getMonsterReturn(uint64)","f40314f4":"tokenCurrentStage()","f4044697":"xrateProviders()","f404d1e2":"transferAndCall(address,uint256,bytes,string)","f404df8e":"_getExpectedRate(address,address,uint256)","f405311b":"Made(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)","f405a275":"EventJoinedBattle(address,uint256)","f4064471":"messagePreSignedHashing(bytes8,address,address,uint256,uint256,uint256,uint8)","f4071928":"mintAuditApproval(address,address,uint256)","f407c81d":"tokenNoByAddress(address)","f408ebe9":"dev_reset()","f409a609":"internalMintToken(uint256)","f409ab66":"getDepositedCount()","f409e633":"SetENGDevAddress(address,address)","f40a049d":"triple(uint256)","f40a9112":"whaleIncreaseLimit()","f40c0843":"subscribe(address,uint8,bytes32)","f40d71f1":"releaseTokens(address,uint256)","f40d8d8f":"updateAllowance()","f40e0b6e":"coinsToSell()","f40e28f2":"createGen0Auction(uint256,uint256,uint256,uint256,address)","f40e8d8b":"retryWinner(uint256)","f40ea5cb":"setReservePricing(uint256)","f40ebcf3":"setBalanceOfValueFor(address,uint256)","f40ef739":"preIcoEndsAt()","f41017fc":"finalize(uint24)","f410a26b":"receive(address,uint8,uint32[])","f410aa39":"_issueByPartition(bytes32,address,address,uint256,bytes,bytes)","f4116381":"setFiscal(bytes32)","f411fb21":"freezeWithdraw(address,uint256,bool)","f41293c7":"getIndexForTeamId(uint32,uint32)","f412af91":"getOuvidoriaEndpoint(address)","f41377ca":"setFoundationAddress(address)","f41440d9":"setCreator(address,address)","f414cccb":"removeFreezableAddresses(address[])","f4156757":"TeamPoolAddress()","f415ed14":"slash(bytes32)","f4162530":"nodeFee()","f4163340":"isFailed()","f416d2cb":"emitTokensSince()","f417614a":"validateAndReturnContribution()","f418b153":"replaceMarketingToken(uint256,uint256,uint128)","f418cf4e":"recordSenderIfNecessary()","f4199bb8":"initializeWhitelist(address[])","f419c69d":"_createPony(uint256,uint256,uint256,uint256,address)","f41a12c8":"_takeOwnership(address,uint256)","f41b536e":"getRecipientString()","f41bfa9e":"mint(int256,uint256,string)","f41c1c93":"setAnswerFee(uint256)","f41c639e":"sendMsg()","f41d0b0c":"getInfluencer(string)","f41d1a82":"partner1_name()","f41d97fc":"getPriceOfTokenInLastAuction(address)","f41db329":"addAuction(uint40,uint40,uint128,uint40)","f41dc25f":"totalWeiLose()","f41e3494":"hasFailed(uint256)","f41e60c5":"enableTransfers(bool)","f41e8fc8":"periodAmount()","f41f4b10":"retrieveHouseTake()","f41fa999":"TTest()","f4201c3c":"isVIP(address)","f4206706":"withdrawEthers(uint256)","f420977d":"noOfTokenAlocatedForSeedRound()","f420c5b1":"getCloneWallets(uint8)","f420d9d2":"setNumRewardsAvailableForAddress(address,address)","f4217648":"setWhitelist(address[])","f421e02b":"testCantFinalizeWithIncorrectCap()","f42206d1":"HouseEdgeUpdate(uint256)","f422878a":"addressIsStakeDiceGameContract(address)","f42355a4":"isSaleInitialized()","f4239eec":"affiliatePercent()","f4246be4":"addToBundle(bytes32,bytes32)","f4250f75":"AgriChainPrevData()","f42541be":"promoToonsMinted()","f42598f0":"get_mintable()","f4268e46":"g17token()","f426ceee":"award(bytes32,uint256,address,bool,uint256)","f426d8ac":"withinHomeLimit(uint256)","f426f03a":"setFrequency(uint256)","f427211c":"getTime2(address)","f4279d1f":"updateEthUSDOracle()","f42a2c42":"removeAssetListing(uint256)","f42aa287":"getBlobStore(bytes12)","f42ac1de":"minQuorum(uint256)","f42b1ae0":"unPauseGame()","f42b9999":"icoMinInvest()","f42c051e":"submitTokenToEthOrderWHint(uint128,uint128,uint32,int256)","f42c0f02":"MARKETING_SHARE()","f42c56c2":"cbrt(uint256)","f42ca2ee":"sub_32(uint32,uint32)","f42d1d30":"creditorAmounts(uint256)","f42eb765":"getAgreement(bytes32)","f42ef9ec":"emitWithrawalRequestEvent(address,address)","f42f0c7d":"lengthOfCommonPrefix32(bytes32,bytes)","f430511a":"setMaxAddresses(int32)","f43098af":"resetTokenOwnership()","f4320f00":"getProjectUnusedTokens()","f4325417":"App(address,string,uint256,string)","f4325d67":"reserveToken()","f43313b6":"assertEq31(bytes31,bytes31,bytes32)","f433262f":"updateFromRegistry()","f4338e89":"getAllTeamCosts()","f433e12e":"marketingTokenWallet()","f4347267":"getX(bytes)","f434e028":"PreICOProxyBuyer(address,uint256,uint256,uint256)","f4351908":"InitialRateChange(uint256,uint256)","f4351e15":"addAndMintPlayers(uint128[],bool[],uint256,uint256,uint256)","f43532ac":"changeWaveVoteContract(address,string)","f435d012":"setUnitJadeStealingIncreases(address,address,uint256,uint256,bool)","f435f5a7":"lock(address)","f436de14":"setAllowanceValue(uint256)","f437bc59":"host()","f437d6bc":"objectShield()","f4381136":"DeferredPresaleTokenPurchase(address,address,uint256,uint256)","f4385912":"getPlayerId(uint256)","f4385eaf":"KPISToken()","f4387d86":"arbitrateApproveMilestone(uint256)","f4395dbc":"bitmcoinToken()","f4399f2d":"MDIToken()","f43a72b0":"setactive(bool)","f43abdf3":"getCrowdsaleUserCap()","f43acb52":"checkLottery(uint256)","f43b1620":"addUserAuto()","f43b4808":"viewPassword(uint256)","f43b7a76":"AdmineAdvisorTokens()","f43bac53":"poolFeeIncurred(uint256)","f43e34b2":"unFreezeAll(address)","f43e3918":"MELON()","f43e98c7":"refunding()","f43f523a":"mod(uint256,uint256)","f43fd7e0":"_handleTrainingFailure(uint256,uint256,uint256)","f4412803":"currentTotalAirDrop()","f44191f0":"getAccessoryByIndex(address,uint256)","f441b1c8":"currentAmount()","f4424cac":"getNumberOfLogEntries()","f44349dd":"angelTokenSupply()","f44376a2":"preFixed(address,uint256)","f443ea83":"MindHacker()","f444c136":"createDklAuction(uint256,address,uint16,uint256)","f444ea30":"allowBack()","f4451628":"buyHSShop(uint256)","f44544b3":"fundPos()","f4462d04":"periodicity()","f44637ba":"addBurner(address)","f4463fb7":"emergencySelfDestruct()","f446c1d0":"A()","f449619e":"collectPrize(uint256)","f449958d":"deliverManagementTokens(address)","f449c3cb":"_presaleSupply()","f449ffe4":"setPresaleRate(uint256)","f44a06b9":"endIcoSaleRound1()","f44a6ca9":"addProduct(address)","f44b43f8":"approveAmount(uint256,address,uint256)","f44b54ca":"functionName1(bytes32)","f44b79b3":"withdrawalAll()","f44bd811":"TRCERC20(uint256,string,string)","f44dc562":"_addKey(address,uint256)","f44e1351":"setEpisodeManager(address)","f44f13d8":"assert2()","f44f8be9":"sendNegReq(uint256,uint256,uint256,string)","f44ff712":"blockHeight()","f450096f":"updateOraclizeGas(uint256,uint256)","f4500eb5":"ETHERCFeeModifiers()","f4508082":"_price_token()","f4509fc2":"LOCKED_1Y_DATE()","f450b574":"_mixer()","f450cfee":"disablePrivileged()","f450d53a":"allFinalised()","f450e5f8":"TOKENS_SOLD_LIMIT()","f4510455":"STQPreICO2TestHelper(address,address[])","f4514ca6":"buySome(uint256,uint256,uint256,uint256,uint256)","f4519035":"betOdd()","f452b69c":"getCommandTokens()","f452f32d":"getByTo(uint256,uint256)","f45346dc":"deposit(address,uint256,address)","f45392fb":"getReportingWindowByMarketEndTime(uint256,bool)","f453c827":"getAddressField3()","f4544255":"refer(address,address)","f454c32c":"teamReserveTokensDistributed()","f4559619":"newOwnerTemp()","f4560403":"Zero()","f456106d":"ProdCToken()","f4572664":"changeMinimumPurchaseAmount(uint256)","f457361a":"paidversion()","f457547a":"spreadPercent()","f457688d":"can_i_jump()","f4577298":"EthGet()","f457ee5a":"donation(address)","f45811bd":"Voyager()","f4586cba":"setVestingRevokeDate(address,address,uint256)","f4591074":"finishInvite()","f45934b6":"cards_gold_total()","f45984fd":"TOKEN_UNIT_RATIO()","f459eb61":"generateKeccak256(bytes)","f459f517":"dividendsPoolAddress()","f45a729c":"getEtherValue(uint256)","f45b106a":"increaseMonthlyTransactionVolumeReceiving(uint256)","f45b4fba":"setPersonalBonus(address,uint256,address,uint256)","f45b96a0":"financePeriodsCount()","f45c85e5":"currentOwnerFeePercent()","f45ce8d7":"setAddressKYC(address,bool)","f45dae6e":"parseLoanOfferRates(uint256[7],uint32[4])","f45e29bb":"hashCoin()","f45e8dc4":"buyWarlordChest(uint256)","f45eb5b4":"_generateRandomhashNumber(string)","f45ef033":"nextReduceSupply()","f45efe88":"stage1Bounty()","f45f74f8":"VerityToken()","f460473e":"fillArray()","f460590b":"updateSigner(address,bool)","f460c5e4":"listItem(uint256,uint256,uint8)","f460e5d0":"setRamenContract(address)","f461847c":"DatGirl()","f4619e71":"NokuCustomERC20Service(address)","f461db0e":"teamAllocatedTime()","f4623e0b":"addBalance(address,address,uint256,uint256)","f462671e":"isAuthDisabled(uint256,uint256)","f46332e0":"test_claimShare_emptyFeeAndRewardPools()","f4635674":"countryOwnersOf()","f4637003":"transferChildren(address)","f463be37":"setSecondAddressBalance(address)","f463edd1":"createDocument(uint256)","f464e64e":"premiumPacks(uint256)","f464e7db":"sellToken(address,uint256)","f4656219":"PRICE_RATE_FOURTH()","f4660ff5":"timeVault()","f4662f71":"canUnshelf(string,address)","f466f106":"addHouseHold(uint256,uint256,uint256)","f4674b89":"withdrawByAdmin(address,uint256,address)","f4686b42":"GxAdminOperations(address)","f468e9b3":"inICO()","f469707f":"addToGoldList(address)","f46b5321":"calculatePoolAmount(uint256)","f46b986a":"secondExtendedBonusSalesEnds()","f46bbc09":"thirdStageTokenRate()","f46c0f29":"compensate(uint256)","f46c50dc":"doFail()","f46c858a":"addAdvisor(address)","f46d1982":"setup(address,uint256)","f46d91f4":"TokenBurn(uint256)","f46da084":"createName(string,string,string,string,bytes32)","f46de44a":"Etherumchain()","f46eccc4":"minters(address)","f46f16c2":"MARKET()","f46ff44f":"dollarToEtherRatio()","f4700d3e":"lpMaxVolume()","f4703d26":"numbersCountMax()","f47073f4":"setTotalIncomeFeePercent(uint256)","f470fd5e":"BLU()","f47125f5":"StableICO()","f471e626":"disapproveByC(uint256,string)","f47279d2":"capRemaining()","f47289e1":"_ecDouble(uint256,uint256,uint256)","f472d615":"enableIco()","f472e136":"fraction(int64,int64)","f4734818":"_random(uint256,uint256,uint256,uint256,uint256)","f4736429":"changeUnicornRanchAddress(address)","f473c484":"BatchDetachAssets(uint256[10])","f4749624":"dist_list_set(address[],uint256[])","f474b6b2":"aboutWorker(address)","f4752806":"convert2PeonyToken(uint256)","f4757a49":"HighestBidIncreased(address,uint256)","f47599db":"WLMTBounce()","f4773d26":"AESSignatum(uint256,string,string)","f47760ac":"forceGame(uint256,uint256)","f47795f3":"CommonTokensale(address,address,address)","f477a6b7":"depositEthers()","f477c2b9":"setColdWalletAddress(address)","f4784b37":"placeCube(uint256,uint256,uint256,uint256,uint256)","f478cef1":"leader_2()","f47a6e84":"getReleased()","f47aa124":"AutoSplitCurator(address)","f47b7740":"information()","f47c84c5":"MAX_TOKENS()","f47cd133":"AMBASSADOR_FOUR()","f47ce310":"getRoomCurrentSet(uint256)","f47efbca":"getMemberLinks(address)","f47f5921":"exerciseOption(address[3],uint256[3])","f4807a4d":"downTickTest(address,uint256)","f4812eb9":"tokenIdToPrice(uint256)","f4814444":"_withdrawBalance()","f481d2d0":"BaseFareCalculator()","f4833360":"getTeamInfoByID(uint256)","f48339e4":"MintingEnded()","f4835aea":"postHardRate()","f4838452":"loseWager(address,uint256,uint256,bool,uint256)","f484e827":"slashSmallUsername(bytes)","f48513ed":"setFundOnContract(bool)","f4869726":"buyWithSignedAddress(uint128,uint8,bytes32,bytes32)","f487404f":"oldOwner()","f487c403":"DataStore(string)","f487e4b6":"SendERC20ToAsset(address)","f4880b22":"transferStatus()","f489faf9":"addAddressToBonuslist(address)","f48a3f2b":"PlazaToken(uint256,string,string)","f48aa044":"upgradeEthCost(uint256)","f48b4391":"SBToken(address,address)","f48be22b":"initialiseAllocations()","f48c157d":"createGame(string,bytes32[])","f48c2afa":"PVCCrowdsale(uint256,address,address)","f48c3054":"proxyPayment(address)","f48c4633":"disableRefunds()","f48d11af":"removeFromVIPList(address[])","f48d371c":"create(uint256,uint256,int256,address,address)","f48d60ca":"hasOwner(uint256)","f48e20f2":"getCreateFeeWindowUniverseValue()","f48e5f27":"infoWithdraw1()","f48e9c33":"ETPotatoPresale(address,uint256,uint256)","f48edf0c":"partner(address,address)","f48f3ced":"HFCoin(string,string)","f4903ca0":"newContract(string,address[],string,bytes32,uint256)","f4914919":"incrementContinuityNumber(uint32)","f4915f5f":"BHM()","f4916f05":"VoteSvp002(address,uint256,uint256)","f49259b7":"UpgradeableToken(address)","f49296ae":"WasHere()","f4929cc5":"initPair(address)","f492a72f":"signUp(address[],uint256[],string)","f493c848":"transferMultiply(address[],uint256[])","f49501f3":"soldOnCurrentSale()","f4954387":"setHalt(bool)","f49627be":"Technology4G()","f4970e71":"approveWithdrawal(address,uint256)","f49727bd":"getSkillEvaluation(address,uint256,uint256,uint256,address)","f497463a":"setVariables(uint256,uint256,uint256,uint256)","f49808ea":"addEthForPayment()","f4993bbd":"executeEmergencyWithdrawal()","f499a349":"NewPrefixPrice(uint256,uint256)","f49a5504":"permittedInvestors(address)","f49a616c":"updateFeePayoutAddress(address,address)","f49a66fd":"_pushLandId(uint256,uint256)","f49b728e":"setAllResourceERC20Addresses(address)","f49b8e10":"BelezaNetwork()","f49bb5a8":"numberPlateExist(address,string)","f49bbb23":"getUserClientsCount(address)","f49bff7b":"getBounty()","f49d1d19":"viewSellOffersAtExchangeMacroansy(address,bool)","f49dec70":"buyPepeAffiliated(uint256,address)","f49e8135":"calculateTokenBuySimple(uint256)","f49eee20":"priceFactorB()","f49f0974":"proxyList()","f4a011be":"transferWithReserving(address,uint256)","f4a05f8f":"_transferAsset(uint256,address,bool)","f4a1585b":"setNextCycle()","f4a222e9":"icoRaisedETH()","f4a32ef8":"bonusTokensSold()","f4a43448":"getEstateSize(uint256)","f4a475cb":"t_ImmlaTokenDepository()","f4a4b8c7":"OfferUnHold(uint256,bytes,bool,address)","f4a67395":"showAddresses()","f4a6ef99":"logBytes(bytes32)","f4a81d08":"getKudosGiven(address)","f4a8619a":"prep(address,uint8)","f4a8a699":"_mint_with_uri(address,uint256,string)","f4a8cbc0":"tokensToWei(uint256,uint256)","f4a92020":"rawApprove(address,bytes32)","f4a972de":"softEthTransfer(address,uint256)","f4a9c919":"startThinking()","f4a9df62":"annul(address)","f4aa1291":"withdrawFundsAdvanced(address,uint256,uint256)","f4aa956c":"preIcoIsRunning()","f4aac034":"charityFraction()","f4ab2928":"isContractPaused()","f4ab2b19":"releaseAllOldBalanceOf(address[])","f4ab4d1d":"_getPetAura(uint256)","f4ab9adf":"addVoter(address)","f4ac6560":"batchVipWtihLock(address[],uint256[],bool)","f4acc2ed":"setContractAdmin(address,bool)","f4accda5":"order(uint256,uint256,address)","f4ace1a5":"processContribution(address,uint256)","f4ad2212":"EthereumEmerald()","f4ad8e37":"listings(uint64)","f4ae0d2f":"getTechBonus1(uint256)","f4ae2164":"EDToken()","f4ae67a1":"setTargetDiscountValue9(uint256)","f4af9146":"setDefaultTranche(bytes32[])","f4afbdca":"assets_explorer_controller()","f4b0ce03":"NewIssue(address,uint256,bytes)","f4b103d4":"SimpleStorage(uint256)","f4b186a7":"setProfitOwner(address)","f4b272db":"licenseAttributes(uint256)","f4b28747":"CaptainToken()","f4b2dfea":"Matching_Finneys()","f4b2f5b6":"maxTokenSupplyICO1()","f4b43268":"phrase()","f4b432b8":"validUser(string)","f4b489e7":"upgraded(address)","f4b4d77e":"cutOf(uint256)","f4b5cbc4":"setCrowdSale(address)","f4b74ae9":"updateBestInvestor(address,uint256)","f4b79379":"generalRate()","f4b86c48":"isMarketplace()","f4b95676":"IsReady()","f4b96570":"greet_omar(uint256)","f4b97c4c":"insertNode(bytes32,bytes32,bytes32)","f4b9fa75":"dai()","f4ba89f9":"escrow_fee_numerator()","f4bbd5d4":"getDealByNumber(uint256)","f4bbfd6a":"scheduleCall(bytes,bytes)","f4bd0bcf":"isConditionMet()","f4bd0eb2":"getSplit(uint256,uint256,uint256,uint256)","f4bd65a7":"_updatePhaseTimes()","f4bd9429":"unassignOwner(address,address)","f4bead6e":"percentageToToteLiquidatorWallet()","f4bebac2":"winner_bids()","f4bffad6":"bonusForMainICO()","f4c06c8e":"removeConfirm(bytes)","f4c140b2":"setArtistFees(uint256)","f4c28ea3":"lowerLimitForToday()","f4c2ebdd":"createLandAndAuction(address,uint256,address,uint256,uint256)","f4c38aa1":"initLending(address,uint256,uint256)","f4c3f3f7":"fetchAllDataForCustomer(address)","f4c52644":"requestRefundDonator()","f4c5ab7c":"validateCallGas(uint256,uint256)","f4c679db":"Gidnist(address)","f4c6f423":"requestWarranty(string,address,uint256,uint256)","f4c7f92c":"newRubesUntilPayout()","f4c84d19":"update(string,string)","f4c91807":"calculateCurrentPrice_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes)","f4c97199":"updateNextGamePotSplit(uint256)","f4c99177":"setBlocksPerPayPeriod(uint256)","f4c9b1fd":"campaignState()","f4caee88":"isParticipating(address)","f4cb09cf":"setAmbassadors(address,bool)","f4cb4ae3":"tokenCreationMaxPrivateSale()","f4ccbc4f":"getWithdrawals(address,address)","f4ce66e0":"extractUint(bytes,uint256,uint256)","f4ce7c1c":"purchaseWithEther(uint256)","f4ce7d4a":"ChannelContractAddressChanged(address,address)","f4cebdc2":"HeroCore()","f4cee3b5":"jasontestToken()","f4d0b2a5":"RefundInvestorsBallot(address)","f4d0b67f":"SetTime(uint256)","f4d176e1":"mapMaster()","f4d21515":"submitQuery(uint256)","f4d218f9":"lastBlockClaimed()","f4d22b02":"transferMoreETH(address,uint256)","f4d24fea":"setItem(uint8,uint8,uint256)","f4d26fec":"upgradable()","f4d28ab0":"Update_START_PREICO_TIMESTAMP(uint256)","f4d2cac3":"setBonusSale(uint256)","f4d3e94f":"weiRaisedInPresale()","f4d44b72":"getBoardsCount()","f4d48c0d":"channelParticipant(uint64,uint64)","f4d56a51":"isIdValid(bytes16)","f4d5d6ce":"seriesBSupply()","f4d64745":"HgcToken()","f4d76b60":"postValidatePurchase(address,uint256)","f4d7b725":"GasPrice()","f4d87f8a":"WW3Token()","f4d92886":"test_shutDownVersion()","f4d94699":"EndowmentRetriever()","f4d957a5":"test_validProxyFundTransfer()","f4da6a54":"AUTHORSIGHASH()","f4da834c":"cancelAuctionToBuy(uint256)","f4daa98c":"BitcoinFuture()","f4dadc61":"locks(uint256)","f4dae266":"total_wei_given()","f4dafe71":"update_hash(bytes32)","f4db9ad1":"bountyOnlineTokens()","f4dba182":"take(uint256,uint256[])","f4dbeb9d":"getCredRanksByContents(address,uint256[])","f4dc2d21":"Deed(uint256)","f4dd0fe9":"ico1Max()","f4ddca3c":"shortenBonusPreIco(uint256)","f4ddff1c":"_teamID()","f4de8dfe":"generateUID(uint256,uint256,uint256,uint32)","f4def44b":"getStaff(uint256)","f4df1fb2":"themedSpinners(uint256)","f4df80ee":"subUserTokens(address,uint256)","f4e0f412":"exec(address,uint256)","f4e1358a":"transfer_enabled()","f4e2d68b":"ltcBalance()","f4e340ac":"RedFoo()","f4e36afd":"findThroneByNameHash(uint256)","f4e3be2d":"getSpawnProxy(uint32)","f4e42844":"ResetTransferState()","f4e50a4d":"getSupportedTokenByIndex(uint256)","f4e62c34":"OrigoToken()","f4e68486":"weiICOMinimum()","f4e6a70d":"addAnimalType(uint128,uint8)","f4e6d3f9":"calculateLockedPercentage(uint8)","f4e733c3":"lifeTime()","f4e75b79":"OwnershipTransferProposed(address,address)","f4e76a46":"getBalanace(bytes32,address)","f4e83593":"Volunteertimedollartocken()","f4e96093":"IntimateShoppe(uint256,uint256,uint256,address,address,address,address,uint256,uint8)","f4e9c944":"PRE_ICO_START_TIME()","f4ea7263":"Take_share_team_AES()","f4ea77f3":"coinPool()","f4ea95b9":"validateReleaseVersion(uint32[3])","f4eb20da":"SNC()","f4eb6889":"description1()","f4ebed78":"currentReward(uint64)","f4ec186d":"MoonCoin()","f4ec593d":"ICOCrowdsale(uint256,uint256,address,address)","f4ed0f46":"editionSize()","f4ed216c":"removeExchangePartnerTargetAddress(address)","f4ed660f":"testIfElse()","f4eda76a":"traitIdxToName(uint256)","f4edb15b":"narcosByOwner(address)","f4ee82ee":"TOKEN_SECOND_DISCOUNT_MULTIPLIER()","f4ee9efe":"mintPartOfEmission(address,uint256,uint256)","f4eef932":"deptcheckapproval(string)","f4efa24c":"getConsensusDetails(address)","f4f0b6e5":"investorDate(address)","f4f0dafd":"T0XToken()","f4f0fc21":"raiseCap(uint256,uint256)","f4f22662":"setPersonalBonus(address,uint8)","f4f27042":"open(address,address,uint256)","f4f3122e":"startSale(uint256,uint256)","f4f3b97c":"updateSubjectMatter(uint256,string)","f4f3bdc1":"minus(uint256,uint256)","f4f3c8a4":"comment()","f4f42246":"percentageCut()","f4f4d237":"getById(uint256)","f4f572ae":"CMO_Signature()","f4f59992":"m_analytics()","f4f5b30f":"unitTestGetAvailableReward(uint256,uint256)","f4f5e1c1":"SHARE_BOUNTY()","f4f61563":"setInviteeCount(address,uint256)","f4f6d6fe":"weiMinSale()","f4f724b3":"getEmployerJobsByStatus(address,address,uint8)","f4f7c6c2":"disagreeWithdraw(uint256)","f4f864f0":"STARBITToken(address)","f4f87730":"create_token(uint256)","f4f94a40":"ownerSetRandomGenerateMethod(uint256)","f4f96d29":"smartWallet()","f4f98ad5":"commit(uint256)","f4f996d5":"WandtChain(uint256,string,uint8,string)","f4fa6c1d":"blockheight()","f4fa8603":"fabricTokenSafe()","f4fab748":"end2Timestamp()","f4fb6789":"tknfwdToken()","f4fb7d4e":"m_nonEtherController()","f4fba1bc":"executeProof(bytes32[],uint256)","f4fc3570":"disableController(address)","f4fc5d13":"RevealBet(string)","f4fd326c":"SuperCarbonCoinToken()","f4fde3b6":"sendMoneyOwner()","f4feccbb":"LogUserUnRegistered(address)","f4ff56f4":"ProposalCloned(uint256,uint256,uint256,string,bytes32)","f4ff78bf":"changeMaster(address)","f4ffa7a9":"getMountTokenIds(uint256,address)","f50059b6":"reconcileDividend(address)","f500a0a3":"VeritasToken()","f5012d4b":"sendOtherTokens(address,uint256)","f5015000":"setMaxCharacters(uint16)","f5018d1c":"IronHands2()","f501af70":"OpenLongevityPresale()","f501d8b8":"transferFromICO(address,uint256)","f5023de9":"founder2Wallet()","f50249fc":"totalSupplyMax()","f502cdc0":"distributeNIM(address[],uint256,uint256)","f5037b2a":"addressLength(address,address)","f503a994":"leaveTeam(uint256,uint256)","f5042801":"setAsRefunded(address,uint256,uint256)","f504b089":"memberKeys(uint256)","f504e0da":"load_level(uint16)","f504efa7":"popHatch()","f50522ca":"setNote(uint256,bytes32,string,string)","f5059560":"makeProject(string,uint256,uint256)","f505a299":"getLLV_edit_32()","f505a92d":"reserveFor(address,uint256)","f505eb6e":"WolkDestroyed(address,uint256)","f505f5f7":"quicksort_core(uint256[],uint256,uint256)","f506d7e5":"getCompte_31()","f506fc54":"acceptValentineRequest(address)","f5074f41":"destroyAndSend(address)","f5088730":"copy(uint256,uint256,uint256)","f509078f":"isForAuction(uint256)","f5093ab4":"UpdateState(uint8,uint8)","f509b627":"confirm(address,uint224,uint32,address)","f509c554":"PIPSCHAIN()","f50a2644":"canCompleteContribution(address)","f50aac53":"register(address,string,uint8,string)","f50ab247":"StopGame()","f50ab7b0":"updateCoupleImageIPFShash(bytes)","f50acfa0":"transferToParent(address,address,uint256,uint256,bytes)","f50b486d":"getTokenIdsIndex(uint256)","f50b5308":"PRICE_MULTIPLIER_ICO1()","f50b769e":"lastEditionOf(uint256)","f50bab3f":"distributeCRTM(address[],uint256,uint256)","f50ca46a":"hasICOFinished()","f50d3914":"resetFoundationtList()","f50ebd21":"OHGLuangPrabang()","f50ecf0b":"basicIncomeLimit()","f50f1ba9":"_getRevisionTimestamp(bytes32,uint256)","f50fc02e":"flipsLost()","f510371a":"deleteOperation(bytes32)","f510c329":"EmitTransactionDetails(address,uint256,uint256,uint256,string,string,string)","f510ccd3":"CancelAuction()","f51119db":"checkAuditor()","f5112373":"testFloatArray()","f5112f87":"welcomeBonus()","f512106a":"testStringKeyValue()","f5122232":"LogAccess(address,bytes32,address,bytes4,bool)","f513a671":"soldItems()","f5143b1c":"HNContract()","f514e92c":"TARGET_DURATION_BETTING_BLOCK()","f514f0f9":"STAGE_THREE_TIME_END()","f5156fba":"CECToken(uint256,string,string)","f5166eea":"reservedTokensLockedPeriod()","f516e9ec":"ethDeltaDepositAddress()","f5173120":"TOKEN_FIFTH_PRICE_RATE()","f518e66d":"_addStakeholder(address)","f5194ae2":"MainToken()","f5195b62":"c_dateTo()","f5196002":"getBOPCount()","f519618f":"addMultipleTier2Members(address[])","f51b793a":"get_appuration(uint8)","f51c2907":"affiliatThreshold2()","f51c755b":"testConcatMemory33Bytes()","f51cbc72":"Level()","f51d0c6f":"_awardForRecommender(bool,uint256,uint256)","f51d1399":"reduceBalance(address,address,uint256)","f51d401f":"getStageStartTime(int256)","f51d4cb1":"getCurrentVUPRate()","f51d61ff":"Thanatos()","f51d7d5f":"getTitle(address)","f51dcaa7":"AVGONE()","f51e181a":"scale()","f51f4738":"setCompleted(bool)","f51f5e78":"addPlayer(bytes32,bytes32,bytes6)","f51f96dd":"salePrice()","f51fb6a1":"leftInTier()","f5207c31":"businessPlannedPeriodDuration()","f5218ec2":"increaseRepAvailableForExtraBondPayouts(uint256)","f522ec0e":"_refundTokens(address)","f52343f4":"flipExecutionSwitchTo(bool)","f5235a46":"withdrawFoundersTeamAndAdvisors()","f5238546":"stopInvest()","f5238660":"totalMarketingFundMinted()","f524613f":"freeze(address,uint256,uint8)","f5251269":"ETHDividends()","f5254af8":"startPriceForHLPMT()","f5258aee":"ContractAdded(address,uint256)","f525cb68":"poolCount()","f525dcf1":"setLockFund(address,uint256)","f52706c9":"setMinResalePercentage(uint256)","f527c856":"TOKENS_PER_KETHER()","f527dd6c":"_emitSkillSet(uint256,uint256,uint256,bytes32)","f5292748":"_stakeContent(address,bytes32,uint256,uint256,bytes8,uint256,uint256)","f5298aca":"burn(address,uint256,uint256)","f529d448":"changeBalance(address,uint256)","f52a41f3":"mintOWL(address,uint256)","f52ad690":"badgeUnFreeze()","f52ae24b":"transmute(address,uint256)","f52b8d1f":"tokenReserved1Deposit()","f52bbc2d":"withdraw(address,address,uint256,uint256,address)","f52bd7cb":"addSwap(bytes5,bytes5,bytes32,bytes32,bytes12,bytes32,bytes32,bytes12)","f52c456f":"_createClown(uint256,uint256,uint256,uint256,address)","f52f2526":"exerciseOption(uint256)","f52f77b2":"createEntity(address,address)","f52fa89b":"evolveGeneration(uint16)","f52ff1da":"SDT(address)","f530259e":"isBlacklistDestroyer(address)","f5308c7d":"removeTransferLock()","f5318389":"setEmbassyCtrl(address)","f531aff2":"THINK_TANK_FUND_TOKENS()","f531cc63":"LogCreateEVN(address,uint256)","f531dbbf":"TOKEN_SWAP_DURATION_HOURS()","f5323da4":"phase_5_bonus()","f532e888":"getBookForUser(uint256)","f5336737":"BFTcoin()","f5341b4e":"UserTipped(address,bytes32,uint256,bytes32,bool)","f5343752":"exchangeEnabled()","f534b022":"burnleftToken()","f534d187":"girlBasicToken()","f536c61a":"deleteAllChildren()","f5370884":"WithdrawalVotedEvent(uint256,address,uint256,uint256)","f5376e49":"TestingToken(uint256)","f53773dc":"withdrawBattleValue(uint256)","f5383f3a":"getFoundationStatus(address)","f5385345":"acceptOwnershipOffer()","f53995ff":"setIncludeAuctions(bool)","f53a93f8":"MyFinalizableCrowdsale(address)","f53b0b3a":"_regularDonationsTotal()","f53b396b":"SimpleTokenCoin()","f53b8ded":"mintPreSaleTokens(address[],uint256[],uint256[])","f53bc835":"setMaxBuy(uint256)","f53bde25":"RATE_PRIVATE()","f53c5c87":"setTileContract(uint16,uint16,uint8,address)","f53d0a8e":"administrator()","f53d9d58":"AddLiquidity(uint256)","f53da97e":"currentSalePhase()","f53f43d9":"setcapname(string)","f53fb0cb":"isCollectionAllowedAt(bytes8,bytes8,uint256)","f53fbaf6":"send_ETH_from_contract(address)","f53fd201":"_modifyPixelColor(uint24,uint32,address)","f54011f5":"blockExternalTransfer()","f54095a7":"standart()","f5414023":"claimReward(bytes32)","f5419108":"view46()","f543d3c6":"Stockfinex(uint256,string,uint8,string)","f544cf4f":"decayedPriceOfCard(uint256)","f545118b":"subdividendsOf(address)","f54575d6":"addAdvisor(address,uint256)","f54580cc":"card_blue_minamount()","f5459d6b":"INVESTOR1()","f5462105":"isFundedMax()","f546232d":"ComputeMyEggs(address)","f5465992":"totalTokenBalance(address)","f5470d7b":"itemType()","f5486860":"nextPrizeTime()","f548a578":"removeBurnupGame(address)","f549dd0e":"Vitamin()","f54a2ddc":"setRefundable(address,uint256)","f54b384d":"withdrawBuildingTokens(address)","f54cc2d0":"mintTokensForServices()","f54d28ae":"OPSPoolAddress()","f54d41db":"updateInventories(uint256,uint256[],uint16)","f54da8ee":"addWasteType(string)","f54dbf4c":"Emission(address,uint256)","f54dd191":"Flag()","f54dd974":"setResourceERC20Address(uint16,address)","f54e3977":"BTML()","f54e7a40":"offlineTransaction(address,uint256)","f550cb45":"rank(address,uint256)","f551924c":"testpidgeon()","f5519e8d":"WanChainToken()","f55206a5":"validatePurchase(address)","f5521bf1":"loanDuration()","f5529d3f":"ESIT()","f552b2ba":"threads(uint256)","f552d91b":"tokenToTokenTransferInput(uint256,uint256,uint256,uint256,address,address)","f5537ede":"transferToken(address,address,uint256)","f5539407":"getInvestorInforAddr(uint16)","f554567f":"getTeller(address)","f554e8cc":"officialHold()","f554e934":"TOKEN_COMPANY_OWNED()","f55523e7":"fiat_contract()","f5552b42":"wotDay(uint256)","f5556d78":"Vegas()","f555b815":"rate2()","f5562753":"getClaimAmountForBlock(uint256)","f5582870":"CENTS()","f559417c":"finalizebackup()","f559468c":"initiallyLockedAmount(address)","f5596659":"HoloWhitelist()","f5597e21":"addProperty(string,string,uint64,uint64,uint64)","f55ab987":"penalizeInactiveJuror(address,uint256,uint256[])","f55b23c0":"externalLeave()","f55b39a3":"PetCore()","f55b8fc9":"setraisedAmount(uint256)","f55bddcc":"NFTAuctionBase()","f55befee":"TOURNAMENT_TOKENS_PERCENT()","f55c9f60":"developerReserve()","f55ecf06":"setExchangeRate(uint256,uint256)","f55f41f9":"Version(string,address,address,address,address,address)","f560783d":"getLastProfit()","f560aa57":"setTokenPrices(uint256[],uint256[])","f560d415":"privateSalePrice()","f5610668":"currNumOfCards()","f56142b3":"burnPrivate(uint256,uint256,uint256)","f561e2f9":"refundTransactionFee(uint256)","f5620ed6":"addItemTo(address,uint256,uint256,uint256,string)","f562db76":"wct1()","f56311d7":"getMntpMigration(uint256)","f5632ab4":"receivedEth()","f563424e":"fetchBilateral(address,bytes32)","f564bb8c":"getNodeIdx(string)","f564dca9":"setUrls(string,string)","f564ea7e":"get_bank_data(address)","f5653a79":"_presentValue(uint256)","f56585de":"transferOtherTokens(address)","f56589d5":"PupToken()","f56613e4":"lockBetInfo()","f5663819":"minContributionETH()","f566c1b5":"_normalizeDecimals(uint256,uint256)","f5672f92":"garbageCollect()","f567a72a":"listMultipleItems(uint256[],uint256[],uint256,address)","f568006f":"generateBalanceHash(address,uint8,uint256)","f5681f9d":"Deposited(address,address,uint256,uint256)","f5685061":"startPreICOnow()","f56898fe":"getCompte_40()","f5689a80":"TOKEN_CREATED_MIN()","f5691b07":"_bidDkl(uint256,uint256)","f569626d":"sanTTTCost()","f569a2fc":"withdraw1(address)","f56a5176":"getMostRecentAuctionStart()","f56b8a46":"TEAM_BONUS_PERCENT()","f56c66b1":"parseInt128(string)","f56d7abe":"PaceCoin()","f56e0609":"WorldCup(bytes32,bytes32,bytes32)","f56e4cb1":"blockTokens()","f56e8421":"currentSquirrelOwner()","f56eba15":"SGEToken()","f5710cc5":"setInitialBalance(uint256)","f5716958":"updateSplits(uint256,uint256,uint256,uint256)","f571da7f":"confirmAssessor()","f5720769":"setDrawer(address)","f57213d8":"subsafe(uint256,uint256)","f57271cd":"LogEnded(bool)","f5727f5c":"chainLedger()","f572ae2e":"toggleInPlayJoining()","f573864f":"PrandexBountyToken()","f5738bcd":"setInstructions(string)","f5743c4c":"incrementNonce(address)","f574c691":"KCoinToken()","f5751524":"unfixTokenPriceInWei()","f575c810":"finishPrivateSaleAndStartPreSale(address,uint256,uint256,uint256)","f57688b6":"communityVesting4Years()","f576f722":"getCurrentTierInfo()","f577990d":"passoverEndTime()","f577a5d0":"publicTokens()","f578fd7c":"applyForToken()","f578fd85":"assertEq0(bytes,bytes)","f57a1ccc":"f4(uint256,uint256)","f57ac2df":"World2()","f57ad503":"resetRole(address)","f57ad6ea":"deposit_token(uint256)","f57ae7b9":"buildId2(address,address,address,uint256,bytes)","f57be85d":"ownerActivateToken()","f57d74d8":"blaze()","f57d76d5":"RestrictedShares(string,string,uint256,uint256)","f57db6e1":"signLoan(address)","f57e2368":"bonusAvailable()","f57e63e2":"eventEnded()","f57ee77b":"getRoundId()","f57fc26a":"lccxTeamTokensVesting()","f5804c35":"test_someTest()","f5811447":"createAuction()","f5812687":"distributeTokenFunds(address,address,uint256)","f5813085":"getTotalTokensByAddress(address)","f5818d94":"EtherModifierPandee()","f581ec95":"FIRST_VOLUME_EXTRA_BONUS()","f581f1ef":"setPicopsCertifier(address)","f5823b0b":"parseOrder(bytes,address,address)","f582d293":"buyEnabled()","f582fe70":"PundiXToken()","f58339c1":"_generateGuardianSale(uint256,uint256,uint256,uint256,uint256)","f5836761":"DGBLY()","f58431fd":"Citizen(address)","f584bf09":"Softcap()","f58589ff":"setAirdrop(uint256,uint256,uint256,uint256,uint256)","f58590e9":"ReturnChametz(address,uint256,uint256)","f5866066":"setStringValue(bytes32,string)","f5868e49":"Administrable(address)","f586c6d9":"getPoolAddress()","f586df65":"checkMembership(bytes32,bytes32,uint64,bytes)","f5877bdb":"maintaining()","f5878d40":"maxSCount()","f587c53f":"_generateGene(uint64,uint64,uint256,uint256)","f58951d1":"approve_reject_deleteCertificate(uint256)","f589cbbe":"addPick(uint256)","f58a1adb":"setup(uint256,uint256,uint256,address,uint256,uint256,bytes,address,address)","f58a535f":"phasePublicSale2_From()","f58adfe5":"CharityReservesSupply()","f58b4554":"userPayout()","f58bb0c9":"dealInitialCards()","f58c251c":"sentinel()","f58d3321":"usersCanUnFreeze(bool)","f58e2327":"foundationTokenHolder()","f58edbca":"ISBParentsCoin()","f58fc2f2":"LimorToken()","f58fef8e":"Destroy()","f590aacc":"preBuy()","f5923a6e":"withdrawEth(address,address,uint256)","f5933f66":"changeFlagArraySize(uint256)","f5938baf":"getRemainingBlocks()","f593efec":"briqcoin()","f594ba7b":"assignManagement(address)","f594f13f":"votedFor(address)","f595f1cc":"pendingFees(address,uint256)","f5963aa5":"isJson(string)","f5965d55":"windowOf(uint256)","f5967a2f":"holdPeriod()","f596d10a":"parseSignature(bytes)","f597a499":"UserDatabase(uint256)","f597d097":"streamerContractMaxAmount()","f597f97d":"fractionalBits(int256)","f59823cf":"Congress(uint256,uint256,int256)","f598e201":"finishDividend()","f5991a05":"sellCoins()","f59ae82c":"getTokenPurchase(address)","f59da238":"MBDCToken(uint256,string,string,uint8)","f59db647":"precommitmentAdjusted()","f59dfdfb":"feed(uint256)","f59e0894":"sendSecond(address,uint256)","f59e38b7":"balanceOfToken(address,address)","f59e754c":"setAuctionFee(uint256)","f59ed863":"privateSaleDate()","f59f5e65":"createWheelBetHash(uint256,uint256,uint256)","f59f99ee":"createNextGeneration()","f59faf9e":"GrainToken()","f5a0ea6c":"createMatch(uint256,uint256)","f5a1c96d":"nextFeesPerMillion()","f5a1f5b4":"setNewOwner(address)","f5a23083":"listMOT()","f5a23af0":"myColorIs()","f5a2d3c7":"DomainSale(address)","f5a30cee":"individualMaxCap()","f5a332f6":"endICO(uint256)","f5a486f3":"issueResolved(bytes32,string)","f5a5438e":"dist_airdrop(address,uint256)","f5a647aa":"sendTokensToSevenAddresses(address,address,address,address,address,address,address,uint256)","f5a79767":"getAmount(address)","f5a7ffeb":"dontPanic()","f5a8ea09":"viewClaimedThisPool()","f5a908f0":"getOraclePrice(string)","f5a91ef7":"getEmailAddressOwner(string)","f5a956d8":"swap(uint256[],uint256,uint256)","f5a98558":"restrictionRemoved()","f5a9e21f":"canUpdateCompanyPreferences(string,address)","f5aa0200":"makeClaim()","f5aa19b7":"reclaimUnclaimed()","f5aab219":"currentIcoRate()","f5ab16cc":"rewardTokens(address)","f5ab4c62":"participationEndTimestamp()","f5ab69c8":"thirdPlacePot()","f5ab865a":"tokensAirdrop()","f5ac0b6b":"BasketFactory(address,address,uint256)","f5ac481d":"leaveTeam(uint256,address,uint256,uint256)","f5ac6319":"_raised()","f5ac9db6":"tradeable()","f5ad9034":"TokenTranchePricing(uint256[])","f5adad57":"BdpControllerHelper(bytes8)","f5aec88c":"getUserTokenBalance(address)","f5af374b":"withdrawEth(address,uint256[],uint256[])","f5af4035":"sellTokensForEth(address,uint256)","f5af6289":"EAI_TokenERC20(uint256,string,string)","f5af6621":"getEscapeRequest(uint32)","f5af6de6":"firstStageEnd()","f5affc60":"claimHash(bytes32)","f5b01fd7":"TruCrowdSale(uint256,uint256,address,address,uint256,uint256)","f5b0f72d":"Ethername()","f5b12540":"STATE_NOT_STARTED()","f5b33d0a":"MicroDex()","f5b3beba":"OverAllPerSell()","f5b41aaa":"set_iconiq_token_amount(address,uint256)","f5b45714":"currentKing()","f5b490d5":"roundLockAmount()","f5b4f3c1":"WFC(string,string,uint8,uint256)","f5b53e17":"getInt256()","f5b53fc1":"checkMonsterAttack(uint16,uint8,uint8)","f5b56c56":"highestBindingBid()","f5b57a8d":"transferFeeDenum()","f5b5af16":"closePlayerGame(bytes32)","f5b5bfb9":"provideDividend(uint256)","f5b61230":"escapeHatchDestination()","f5b85ad8":"RoundToken()","f5b944eb":"ROLE_MANAGER()","f5b9644c":"PRE_ICO_RATE()","f5babff2":"convertBytesToBytes32(bytes)","f5bade66":"setDeposit(uint256)","f5bae6b6":"equal(int256,int256,string)","f5bb02b2":"ICODepositContract()","f5bb5aac":"TokenStore(uint256,address)","f5bbc6d5":"isArbiter(address)","f5bd48c4":"totalLotsByAddress(address)","f5bd4931":"transferFlower(address,uint256)","f5bd8f5f":"_isTrue(address)","f5bdeca1":"SetGasLimit(uint256)","f5be3193":"totalIssued()","f5bea782":"userWithdrawPendingTransactions()","f5bee4e6":"priceTokenToCoin()","f5bf6d63":"totalIssuerSupply()","f5bf7413":"close(address,address,uint256)","f5bf7e3d":"registerDINs(address,uint256)","f5c15237":"isPlatformManager(address)","f5c217da":"lastSaleTimestamp()","f5c233f1":"transferAndLock(address,uint256,uint256,uint256)","f5c256ca":"sendPrepaidERC20Tweet(uint256,string,string,uint256)","f5c3f206":"setApprovers(string,string,address[])","f5c454ca":"ProjectDescriptionUpdated(address,string,bytes32)","f5c476f9":"totalLockedTokens()","f5c4ceda":"SimpleConstructorArray(uint256[3],uint256[3])","f5c57382":"nameOf(address)","f5c5ad83":"decrementCounter()","f5c60309":"YuChainToken()","f5c6ca08":"sendTokens(uint256)","f5c6cd0a":"GlobexSciICO()","f5c6cf05":"changeTokenForSale(uint256)","f5c758c4":"getKycApproved(uint256)","f5c86d2a":"ledgerTransfer(address,address,uint256)","f5c87d20":"setAdminPayout(uint8)","f5c89f83":"StartMiningByIdArray(uint256[])","f5c8d71b":"forceMove(address,address,uint256)","f5c901db":"ck()","f5c91f5a":"init(address,uint256,uint256,uint256,uint256,uint256)","f5c972ac":"setUserInfo(address,uint256,uint256)","f5c98aff":"GreeterB(bytes)","f5c9d5f1":"refundPart(address)","f5ca6cd4":"TOKEN_SALE_ALLOCATION()","f5caccad":"gatherCollateral()","f5cb0daa":"queryWaitingTimeBuffer()","f5cb3dff":"getAddressFromData(bytes)","f5cb911d":"divideByNumber(uint256)","f5cbf6cc":"construtor(uint256)","f5cc4056":"BSMinting()","f5cce54d":"preSaleCoinCap()","f5ce0d5b":"onRemoval(string,uint256)","f5cf673b":"setClaimer(address,address)","f5d00ccf":"NewPatent(bytes32)","f5d05f7e":"foundationVestedPayment()","f5d09857":"createDungeon(uint256,uint256,uint256,uint256,uint256,address)","f5d09ff7":"bancorETHToken()","f5d17f10":"get_term_deposit_end_date()","f5d1d299":"setProviderTitle(bytes32)","f5d241d3":"update(uint80,address,uint32,uint32,uint32,uint256)","f5d36a57":"quorumVersion()","f5d3c79a":"setReinvest(bool)","f5d50f86":"balanceAsSupporter()","f5d5edc4":"deployService(bytes32,address)","f5d60a51":"accessPolicy()","f5d60acd":"EtherTakeAfterSoftcap()","f5d67a20":"currentCrowdsale()","f5d6fa14":"whichPrice(uint256)","f5d72a28":"setTakeRewardsPeriod(uint256)","f5d73261":"transferAnyTokens(address,uint256)","f5d78625":"getPersonalInfo(address)","f5d82b6b":"add(address,uint256)","f5d9356e":"newKrakenPriceTicker(string)","f5d97789":"changeBinaryAddress(address)","f5d9d3fd":"formated_data_url()","f5da16e9":"RECHToken()","f5da210c":"getClientData(address)","f5dabc58":"transferDistributePxl(address,uint256,bool,string)","f5db370f":"setSanityRates(address[],uint256[])","f5db8bc7":"depositedETH(address)","f5db9820":"firstTarget()","f5dd7650":"_computeTournamentBeneficiaryFee(uint256)","f5ddff92":"getReputationUpdateLogEntry(uint256)","f5df1d10":"getCollectibleTypeBalance(address,uint256,uint256)","f5df1f1d":"PresalePool(uint256,uint256,uint256,address[])","f5df6618":"newUser(string,string,string)","f5e1713e":"sale_state()","f5e27f5f":"emperor()","f5e3394f":"getUnicornGenByte(uint256,uint256,bytes1)","f5e33a9d":"createPot(string)","f5e3542b":"lookup()","f5e37d57":"_doTradeForEth(address,uint256,address,uint256)","f5e47f96":"getTicketsByAddress(address)","f5e493aa":"getCrowdsaleTierList(address,bytes32)","f5e53f2b":"register(bytes7)","f5e736ed":"tacoPoolTotal()","f5e7b8e3":"setScoringThreshold(uint256)","f5e7ce99":"canPerform(address,address,bytes4)","f5e7ef7a":"getCountCities()","f5e82554":"executeFill(address,address[5],uint256[8],uint256,uint8,bytes32,bytes32)","f5e8e8a9":"NASRToken()","f5e998f7":"FuckCoin()","f5ea15d3":"setContracts(address[16])","f5ea25f0":"setTokenAcceptanceRate(address,uint256)","f5eacece":"create2()","f5eb2313":"UrlHint()","f5eb42d1":"ExecLog(address,bytes32,uint256,bytes32,bytes32,uint256)","f5eb8890":"balanceUser(address)","f5ec2eed":"companyName()","f5ec8685":"claimAfter45days()","f5ece00a":"cryptoChallenge()","f5edc92f":"subwooferUSBToken()","f5ee3348":"setLive(bool)","f5eeaea3":"openChannel(address,uint256,uint8)","f5eed98d":"publisherCount()","f5ef98ea":"setDeathBlock(uint256)","f5efbd2d":"addModule(address,bytes,uint256,uint256)","f5f06acc":"airDropTokens()","f5f0f1e9":"firstBuyPrice()","f5f23b52":"makeTradable(uint8)","f5f2669b":"isAddressNotEmpty(address)","f5f2b62f":"nextSale()","f5f2de34":"ethReceived()","f5f3e58f":"preSale1()","f5f4123f":"_createAvatar(address,string,uint256)","f5f5ba72":"getContractName()","f5f5bb3b":"hashBid(address,uint256,address,bytes32,bytes32,uint256,uint256)","f5f5c622":"setDErc20(bytes32,address)","f5f5f123":"changeMaximumContributionForPublicPhase(uint256)","f5f6ea26":"EthOne()","f5f83a61":"transferManyLandToEstate(int256[],int256[],uint256)","f5fb17f2":"offerPieceForSaleByAddress(address,uint256)","f5fb1b74":"buyname(string)","f5fb22ca":"claimMobsterFunds()","f5fb9137":"donate_step()","f5fc20c6":"canUse(uint256)","f5fc32c8":"getAllot(bytes32,uint8)","f5fc3d47":"giftToken(address,address,uint256)","f5fc58c4":"totalLosts()","f5fd118e":"coordinatorSetAgreeForEmission(uint256)","f5fd1936":"countZTKChecks()","f5fd2108":"ethToBeDistributedSet()","f5fd9343":"Reco()","f5fda5da":"test_35_assertGasUsage1400Boards()","f5fda8cd":"testPublic()","f5ff3dc7":"setOraclizeWinnerTimeOffset(uint8)","f5ff5c76":"agent()","f5ff8977":"renameArtwork(uint256,string)","f60203c6":"createUser(uint256,uint64,uint64)","f602467e":"FundWithdrawal(address,uint256,bool)","f602c312":"erc20Store()","f602e325":"reserveAdress()","f6030aeb":"mint(address,uint256,int256)","f60381a1":"stra2cbor(string[])","f603fa92":"toggleAttachedEnforement(bool)","f60436cd":"reduceTime()","f604498a":"getClientSupply(address,uint256,uint256)","f604620a":"getTicketsAtAdress(address)","f604e6a6":"withdrawXNK(address)","f6054027":"IFLTSidechain()","f605ef93":"LongBought(address[2],uint256[5],uint8,bytes32[3],uint256)","f606b648":"transferTokensFromSpecialAddress(address,address,uint256)","f60744d5":"verifySignature(bytes32,uint256,uint256,uint8,bytes32,bytes32)","f607e88a":"_tokenPurchase()","f60957c0":"HowLongIsDisputeStillRunning(uint256)","f609a1a1":"extraMintArray(address[])","f609bad6":"newDaoRulesProposal(uint256,uint256,uint256,uint256,uint256,bool,address,uint256)","f609bf42":"getSecondsTimeLocked(bytes4)","f60a696d":"migrateUsers(address[10])","f60b0714":"EscrowContract(address,address,uint256,uint256)","f60b9406":"vestingStartUnixTimestamp()","f60ba338":"setOpenTime(uint256)","f60bb720":"receiveFees()","f60ca60d":"project()","f60ca6b6":"distory()","f60cdcf6":"totalPlayers()","f60daa71":"dutchAuctionToCraft()","f60e28f7":"checkUserAndInitIfNecessary(address,address)","f60edb0e":"proposedController()","f60f1ccb":"useregister(address,string)","f60f49bb":"PayToken()","f6105254":"CryptoSagaArenaVer1(address,address,address,address,address,address,uint32,uint256,uint32,uint256,bool)","f610e52a":"acceptInvite(bytes)","f612a62d":"getSaleContractIsFinalised(address)","f613f7a0":"mintUsingSignature(uint256,uint8,bytes32,bytes32)","f6142990":"altDeposited(address)","f614fd72":"assertEq24(bytes24,bytes24)","f6150d17":"payedAmount()","f6151ff6":"transferTokenTo()","f6153ccd":"totalDeposit()","f615e369":"selectDeliverer(uint256)","f615ed54":"subSeconds(uint256,uint256)","f616b7b7":"report(string)","f616ce3c":"candy()","f616f29f":"transferEthFeeAndRefund(uint256,uint256,uint256,address)","f6174b90":"transferCheques(address,address,uint256,uint256)","f617642b":"getlevellen(uint256)","f617a0e9":"BoSenCoin_Test(uint256,string,uint8,string)","f6187006":"crowdSaleIsRunning()","f618c39f":"PartiallyForgived(address,address,uint256)","f619304a":"getSellOrdersBlackMarket()","f61a3e2b":"roundWithdraw(uint256)","f61a7f6f":"fixSaleCompleted()","f61ac3a4":"checkForReceivedTokens()","f61adfdd":"UnitedfansToken(address)","f61b7483":"M5Logic()","f61b9aed":"transferFrom(address,address,uint256,bool,uint256)","f61c266b":"getExpiry()","f61c6c4b":"LobsterFarm()","f61ca773":"transferWithPurpose(address,uint256,bytes)","f61ca87a":"setUserValue(bytes20,uint256,uint256)","f61cd7de":"callerTokenAmountAtBlock(uint256)","f61d9afc":"Errors()","f61ed985":"Kill(uint256)","f61f019d":"GitBitToken()","f61f35dd":"FOG()","f61f54c2":"SendEtherToFund(uint256)","f61ff377":"AccountFilledWithBonus(address,uint256,int256)","f6205042":"storeClaimSeed()","f622a105":"createDApp(bytes32,uint32)","f622cc82":"declareWinningOutcome(uint8)","f6232556":"Security_GetNumberOfAttemptsToConnectBankAccountToANewOwnerAddress()","f6233016":"DomenoToken()","f623d7a7":"TrustlessTransactions_Log(uint256)","f625ee28":"startMasterCopyCountdown(address)","f625f472":"MultiownedControlled(address[],uint256,address)","f6261a0f":"_isValidWithdrawLimits(uint256,uint256,uint256)","f62732b8":"index(address,address[])","f627fe6c":"returnSomething()","f6281a9b":"getTierWhitelist(uint256)","f62847f4":"TerrionFund()","f6288422":"commission_system()","f628e8e8":"startDonations()","f62a92fa":"testRevertTx()","f62bc2dc":"ICTA()","f62cce34":"_clearRecordHierarchy(uint256,bytes32[],bytes32)","f62cec27":"setStartPreICO(uint256)","f62de0c3":"weiPerUSD()","f62e037c":"BETTING_CLOSES()","f62eded9":"buyStar(uint256,uint256)","f62ee1af":"burnFrom(address,uint32)","f62eec09":"rejectLastDeliverable(bytes32)","f62f47ab":"UDF_PORTION()","f62f9dbb":"tokenRatios(uint256)","f63051ff":"FXTOKEN(address,uint256)","f630a468":"setAtomIsRent(uint256,uint128)","f630e0f5":"submitTransaction(address,uint256,bytes,bytes,bytes,uint256)","f6310813":"transferDoc(uint256,address,address)","f631345b":"setlargeBonusStopTime(uint256)","f6326fb3":"depositETH()","f633adc1":"getRegister(int256,string)","f6340be4":"updateProvision(address,uint32,uint256,uint256)","f634bd29":"sec_addr()","f635052f":"colorPrice()","f635d160":"setPOOL_edit_20(string)","f635f50c":"minedTokenStartTime()","f6360d37":"requestDiploma(uint256)","f6366b9f":"OwnerTokensAllocated(uint256)","f6368f8a":"transfer(address,uint256,bytes,string)","f636931e":"PineapplePoints()","f6373296":"applySettings(uint256,uint256,uint256,uint256)","f637b7da":"collectedWei()","f637d950":"getAssetInfo(uint256)","f63841e4":"featurePrice()","f6384cb8":"sendReferallFundBalance(address,uint256)","f63850d0":"GanaTokenPublicSale(address,address,address,uint256,uint256)","f639365d":"testSetGet()","f63a43c0":"TokensPurchased(address,uint16,uint256,uint256,uint256,uint256,uint256)","f63a5d22":"divideDecimalRoundPrecise(uint256,uint256)","f63b1f7c":"GoldenLightCoin(uint256,string,uint8,string)","f63c2659":"PriceCalculator(uint256)","f63c533c":"Cost()","f63c5532":"incrementStat(uint256,uint256)","f63cb8a3":"requireTokenFuel(address[])","f63da25b":"Emailer()","f63df2e9":"createStandardToken(address,uint256)","f63ef744":"sendCharityETH(bytes)","f63f0e62":"turnOffCanUpdateNextGameInitalMinBetSize()","f640b81e":"test_oneInvalidEqBytes32Message()","f640d508":"transferToken(address,uint256,address)","f6413e46":"getFaucetAmountValue()","f6418b0b":"buyLandForEth()","f641d753":"changeElementName(uint256,string)","f6420e15":"tc()","f6432b8c":"publishLawyersInAttendance(string)","f6436a7c":"BONUS_ICO_PERIOD_TWO()","f643cf3d":"NEToken(address,uint256,uint256,uint256)","f64402c4":"setVicepresidenteDeMesa(bytes32)","f6444bcc":"isDeploying()","f6446614":"withDrawToPoolOwner(uint256)","f6448391":"getAllERC20(uint256)","f644c926":"SarmayehaaToken()","f6454620":"add_certifications(string,string)","f645496e":"giveawayFee()","f645835b":"beneficiaryAddresses(address)","f6458c6a":"toZ1(uint256[3],uint256)","f6460964":"teamKeepingPerEpoch()","f64623f1":"getBalanceB(bytes)","f646286b":"getPlayerShipOwnerById(uint64)","f6469342":"_setPackedBlockNumber(bytes32,uint256)","f64820f9":"addAttendant(string)","f6486cad":"burnReserveFees(address)","f6487e4e":"rejectCampaign(address,string)","f648f20b":"agencyWallet()","f64ab21a":"getOnMintAmountValue(int256)","f64b5c16":"distDay()","f64bfaba":"getBuyers()","f64c08b1":"onThrone()","f64ccca6":"payToken(address,address,uint256,uint256)","f64cd26b":"gcmp(uint256,uint256)","f64e167e":"getTextCount()","f64efacb":"icoHardCapInWei()","f64fca2e":"getNodeId(bytes)","f64fe563":"asyncSend(address,uint256,uint256)","f64ffde4":"getAccountPendingValue(address)","f6503662":"safeApprove(address,uint256,uint256)","f65045df":"totalClosedBID()","f6508be6":"tokensPerWei(uint256)","f651bf44":"move_to(uint16)","f652076b":"_getTokensAmount(uint256,uint256)","f652badb":"bitSSAToken()","f653279c":"TOKENS_FOUNDERS()","f653d286":"toggleTokenSaleOnHold()","f6560449":"evaluateProposalMetricEnd(uint256)","f65625ae":"changeWinnerPrizeMoneyForRaz(uint256,uint256)","f6577774":"BonusCrowdsaleImpl(uint256,uint256,uint256,address)","f6585116":"bytesFunc(bytes)","f658b1d5":"calculateContribution(uint256)","f659a45f":"airdropTokens(address,uint256)","f65bed0d":"initNewGame(uint8[16])","f65bffc3":"checkDividend(address)","f65c4d42":"Participate(uint256)","f65d1488":"setMarketingProfitAddress(address)","f65d226f":"getTotalBetAmount(bytes32,bytes32)","f65d6d4f":"MAX_MINT_NUMBER()","f65e2761":"RandomNumberGuessed(uint256,address)","f65e8d4d":"potMembers()","f65f5eeb":"choose(bytes32,bool)","f6618bab":"getBuyRequestsLength()","f661b886":"testCanTransfer()","f661e767":"villainIndexToApproved(uint256)","f6621121":"setSlammerTime(address)","f6623552":"getWalletBonuses(address)","f6626856":"LTT()","f662a12a":"oraclize_randomDS_proofVerify__returnCode(bytes32,string,bytes)","f662b881":"commitmentOf(address)","f662f291":"getInit(address,address)","f66302a2":"releaseMe(uint256)","f6631c64":"PPBC_Ether_Claim()","f6644c5a":"STARTING_FAIRY()","f6648d4c":"publishMixerType(bytes32)","f66597c2":"listTrophy(uint256,uint256,uint256,uint256)","f665a541":"coinsAdded(address)","f6660246":"fundOrderInternal(address,uint256)","f666323e":"UUIDProvider()","f669052a":"maxTokensToMint()","f66a79a0":"secondaryWallet()","f66afcac":"isTheAO(address,address,address)","f66b48da":"getHorseData(uint256)","f66bf229":"minBuyAmount()","f66c3af1":"getAddTokenApproveSignatures()","f66c6691":"shortTimeLock()","f66c75e5":"refund(bytes20,address)","f66cce0e":"adjustKPIs(uint256,uint256)","f66d0076":"getNumberOfCE()","f66d1f65":"releaseToEarlyInvestors(address,uint256)","f66d278e":"AgriChainDescriptionInt()","f66e86bb":"withdrawGasPayback()","f66f0bd9":"MingYuanToken(uint256,string,uint8,string)","f66f2449":"THANKSTEST4()","f66f640e":"pregnantZodiacs()","f66f83f6":"latestSeriesForUser()","f67028be":"trade(uint256,uint256,bool,bool)","f67187ac":"lookup(string)","f671cae4":"setIcoThirdWeekRate(uint256)","f671f5b3":"deleteEntireGlofile()","f6724a55":"totalAmountInvested()","f6729bf2":"canChangeLocked()","f672c1aa":"totalBountyCount()","f672e4d8":"changeAdminUser(address)","f6731d62":"intCallWithArray(int256,uint8[4])","f673745a":"edoPerWei_()","f674cfe5":"VOLUME_60()","f674d799":"removeManyFromWhitelist(address[])","f67501f7":"changePet(uint256,uint256,uint256,uint256)","f6757cff":"getEmployeeInfo(uint256)","f6761151":"Withdraw(address)","f676d539":"get_dati_lotto(bytes)","f6774660":"calculateNumDIDToIssue(uint256,uint256)","f677cf0d":"isDistributed()","f678142a":"ethLandSaleOpen()","f6783518":"KYCToken()","f678462f":"termsAndConditions()","f6785de7":"newPayOutPercentageIsSet(uint256)","f678cf02":"setRelation(uint8,address)","f6791858":"tgeStartTime()","f679791d":"playerRoll(uint256,uint256,address)","f67a1d37":"BlockChainChallenge()","f67a7782":"periodOne()","f67a81ea":"Bigba()","f67abd87":"entryDetails(uint256)","f67b3047":"setItemActive(address,address,string,bool)","f67d5a8d":"sendDividendsWithRefBonus(address,uint256,uint256)","f67e3d0d":"howManyShips()","f67e8db2":"getEthToTokenOrderList()","f67f83a8":"updateFileds(uint256,uint256)","f67ff0af":"_llTransferFrom(address,address,address,uint256)","f68009b9":"getRoundBetAmount(uint256,uint256,uint256)","f68016b7":"gasLimit()","f68036f0":"FaucetManager()","f6806074":"withdrawBonds(uint256)","f680b106":"RateEth()","f6814165":"castToInt(uint256)","f681f6e7":"capitalRaised()","f68297f3":"emergy_withdraw(address)","f6832c4a":"DO()","f683b247":"openSecret(bytes32,bytes32,string)","f68445dd":"myContract2()","f685e618":"_crownUnFreeze(uint256)","f685f942":"ZNCoin()","f685f9ad":"Moac()","f6860955":"emitAborted()","f686640b":"getCrabsOfOwner(address)","f686f019":"getCompte_9()","f686fa10":"verifyBBODocument(bytes,bytes)","f6879623":"addBountyReward(uint256)","f688bb2b":"setAirDrop(uint256,uint256,uint256,uint256)","f68975a9":"Total_Savers()","f68abb25":"approveToFight(uint256,uint256)","f68c021b":"EtherXeum()","f68c5b6a":"equalBytes32ToBytes(bytes32,bytes)","f68ce40b":"turtlemasterReq()","f68da9a0":"AthenaLabsICO(uint256,uint256[7],uint256,address,address[3])","f68dcd2b":"MHTHolders(uint256)","f68e63e3":"PRICE_MUL()","f68f1a0c":"recoverETH_SendbyMistake()","f68f8e42":"dataSourceGetGroupResult(uint256)","f6903c9c":"processEndOfYear(uint256)","f691b30b":"lockReleaseDate6Month()","f691e362":"EtherDOGEICO()","f692715c":"getGameResult(uint64)","f6928070":"numberOfGames()","f6933c7d":"isICOActive()","f694211c":"Composed(uint256,address,uint256[5],uint256[5],string,string)","f6946940":"jack_pot()","f694b761":"createPool(string,address,uint256,uint256,uint256,uint256,uint256,uint256)","f694c4be":"NSEToken()","f6950d5f":"LIFEWORLD()","f6951038":"testCreateWithParentsForeign1()","f696c4ed":"fightAgon(uint64,uint64,uint256,uint256)","f6973532":"setAddOwnerRequest(address)","f6978685":"HashnodeTestCoin_new()","f697a0ed":"ppb(uint256,uint256)","f697ddb2":"firstAddress()","f69871e9":"WithConstructorArguments(uint256,bytes32)","f6988b79":"getDeveloperReservedLockInfo(uint256)","f698bceb":"getMintable()","f698da25":"domainSeparator()","f698e626":"WrapReadTokenData()","f699ad94":"setupFundingInfo(uint256,uint256)","f69a3c7b":"termsAndConditionsAreSigned(uint8,bytes32,bytes32)","f69a6982":"getVirtualTradesSummed(bytes32,uint256)","f69adce6":"dinoToken()","f69b9dd8":"safeWithdrawalTokens(uint256)","f69ba02c":"toB32(address,uint256)","f69bbf16":"setContributions(address,uint256,bool)","f69bf03b":"issuePartnerTokens(uint256)","f69c3b24":"registerEarlyContrib(address,uint256,bytes32)","f69d03c9":"ETCWalletCreated(address)","f69d5f0e":"icoPhases(uint256)","f69da37e":"toRefer()","f69e672e":"modifyContactManual(uint256,address,string)","f69e739e":"voteForCandidate(uint256,address,address)","f69e8384":"ceoRemoveCoo(address)","f69e98d7":"bite(uint256,uint256)","f69f1027":"PRESALE_WEI_GOAL()","f69f18a6":"timesIsOver(address)","f69f190c":"getWorkerStatus(address)","f69f64f7":"setInfo(uint256)","f69f7cab":"createTokenVault(uint32)","f69f8a5c":"approvedBuyerForIndex(uint256)","f6a01234":"TokenStorage(uint256,address)","f6a03ebf":"setStart(uint256)","f6a08ced":"OracleBitfinex()","f6a0be88":"NCRCoin()","f6a0e8a4":"DTCC_ILOW_7()","f6a10249":"TransferedEth(address,uint256)","f6a12b48":"MatchmakerPrevails(address,address,uint256,uint256,uint256)","f6a14bf7":"getNumberOfTokensForTheTeam()","f6a176ae":"fpMul(uint256,uint256)","f6a25127":"test_set_label()","f6a29b81":"EntropyTxDetails(address,string,uint256)","f6a30e3e":"minTicket()","f6a31715":"Revocation(address,uint256)","f6a31b9c":"transferManagerContract()","f6a33253":"changeRatio(uint256)","f6a3b1dd":"totalHardcap()","f6a3d24e":"exists(address)","f6a3e8c8":"lockInfo(address,uint64)","f6a46c2e":"settleBaseDeliveries()","f6a47e9a":"MongoliaNationalToken()","f6a5546a":"testBilibirdaToken()","f6a56bcf":"TianLianCoin(uint256,uint256)","f6a58558":"withdrawRemainingRtc()","f6a5b13e":"m_beneficiary()","f6a5fa30":"subShares(uint256)","f6a60d89":"resumeCrowdsale()","f6a74ed7":"removeController(address)","f6a84013":"totalMEATonsSupply()","f6a8aea7":"financialStrategy()","f6a92de9":"mycontracts(uint32,address)","f6a94ecb":"notifyOfArbitrationRequest(bytes32,address,uint256)","f6ab4243":"buyCastle(uint256,uint256,uint256)","f6ac54dd":"checkRegPeriod(bytes32)","f6ac6684":"getStringZero(uint256,uint256)","f6ad660b":"f3(uint256,uint256)","f6ada1ad":"rewardDaysLeft()","f6adab61":"delayOfICO1()","f6af18f5":"montly_pay()","f6af2718":"Quantastic()","f6afad47":"getDatabase(uint256)","f6afe805":"PRE_SALE_GMRP_TOKEN_CAP()","f6b09195":"preicoTokensPerEth()","f6b098f8":"nextAttackTimestamp()","f6b10854":"safeWithdrawAll()","f6b12f28":"gameOwner()","f6b15fe6":"getProfit(uint256,uint256)","f6b19c74":"drain(uint256)","f6b2b334":"upgradeTo(address,uint256)","f6b2c3b6":"VendTitle(uint256)","f6b39b3c":"ContractTotalMined()","f6b3e080":"roundOneRate()","f6b44d03":"validFactories()","f6b4c691":"getPendingCratesForUser(address)","f6b4dfb4":"contractAddress()","f6b5460f":"withdrawTrackOf(string)","f6b55a93":"hotWalletAddress()","f6b69697":"importPreviousWinners(uint256[],address[],uint256[])","f6b6daf1":"supportedTokens(uint256,uint256)","f6b70702":"LightComplexAirdrop()","f6b781a1":"Bolton()","f6b87500":"internalCalc(int256,int256)","f6b911bc":"burn(address,address,uint256)","f6b91944":"walletLists()","f6b924f8":"EventAuction(address,uint32,uint256,uint256,uint256,uint256)","f6b94cb4":"negotiate(uint32)","f6b9571a":"remove_owner(address)","f6b97131":"redemptionCount(address)","f6b9d05d":"bountyAllocation()","f6b9fd79":"STARTING_VINES()","f6ba13a5":"lastBlockNumberInRound()","f6ba3b6c":"addThing(string,string,bytes32,string)","f6bb3cc4":"deleteString(bytes32)","f6bd5893":"getGas(uint256)","f6be4776":"CannabizToken()","f6be71d1":"setDuration(uint256)","f6bea5dd":"LOCKEDiN()","f6bed059":"mixer()","f6bf0edd":"removecantonEmployee(address)","f6bffff8":"_createTombWithData(address,string)","f6c05625":"isValidNumber(uint8)","f6c0736b":"register_token(address,string)","f6c0d6a3":"_getChainLength(uint256)","f6c1acdf":"proofFor(string)","f6c1db4c":"GetChequeInfoByHash(uint256)","f6c28241":"BuyForFriend(address,address,uint256,uint256,uint256)","f6c3f6cd":"readUserPurchaseAtIndex(address,uint256)","f6c42713":"changeExpiredLimit(uint256)","f6c50d8b":"_ownersTokens()","f6c536a0":"sendBonusMany(address[],uint256[])","f6c5c80d":"cleanUp()","f6c6b731":"activeFirstRound()","f6c7430e":"JAPACHELOR()","f6c8f62e":"TransferBack(address,uint256,uint256)","f6c976d2":"test_1_assertGasUsage50Boards()","f6c98dd7":"WikiToken()","f6c99dad":"SETUP()","f6c9e930":"approveSender(address,address,bool,uint256,uint256)","f6ca75d8":"AkonCoin()","f6cabaa0":"burnedToDate()","f6cb86db":"whitelistTransferPrimordialTokenFrom(address,address,uint256)","f6cbcab0":"mintParts(int256,uint16,address)","f6cbea50":"ErrorReturningEth(address,uint256)","f6cc7d60":"setUnitDefenseIncreases(address,address,uint256,uint256,bool)","f6cdf281":"returnPtSafeMedium()","f6ceecc4":"TokenAdminContract(address,address[],uint256,uint256)","f6cf3a7d":"setDeveloperCut(uint256)","f6cf4570":"BoughtBlock(uint256,uint256,uint256,address,bytes32,bytes32,bytes32,bytes32)","f6cf5411":"startTimePreIco()","f6d0bf2f":"GetContractBalance()","f6d2eb65":"_validateQualityConsensus(bytes32,bytes32)","f6d2ff9d":"setFreelancer(address,address,bool,string,uint256,uint8,uint256[],uint256[],string)","f6d339e4":"setAddress(bytes32,string,address)","f6d361cc":"ENTRY_FEE()","f6d3d52d":"RatesChanged(address,uint32,uint32)","f6d3df65":"ownerStartsCrowdsale(uint256)","f6d4a265":"addLacks(uint16[],int64[],uint16[],int256,int64[],int256,int64[],uint8[])","f6d51638":"getRocIdToTokenId(uint256)","f6d5959b":"getActionStatus(uint256)","f6d68fca":"balanceWinPoolForThirdStage()","f6d6d5aa":"claimableToken()","f6d72acd":"setVoter(uint256,address,uint256)","f6d860d1":"approveUserKYCAndSetReferrer(address,address)","f6d89563":"airdropTotalCurrent()","f6d956df":"buy(uint8,uint256,uint256)","f6da1c0a":"getPriceSMPTokensPerWei()","f6dab356":"getGPSEndTime()","f6db2bac":"LOG_BetLost(address,uint256)","f6db6e50":"ponziToWei(uint256,uint256)","f6dbc252":"MOREToken()","f6dcb32c":"sendRewardTokens()","f6dd0187":"getSubject(uint256)","f6ddac74":"updateLocation(string,string)","f6ddcee5":"_generate_seed(uint256)","f6df0d50":"setFrozenAccountICO(bool)","f6df26d2":"kickOutCommunity(address,uint256)","f6dfafe1":"getShareHolder(uint256)","f6dfcff7":"getCooldownEndTime(uint40)","f6e158b9":"getPickedAssetsAndFinalSeed(bytes32[],uint256[],uint256,uint256)","f6e212ea":"addCrystal(address,uint256)","f6e4641f":"purchaseFor(address)","f6e4a3dd":"tradeBalances(address,uint256,address,uint256,address,address,uint256)","f6e5c6a4":"totalWeiDonated()","f6e5e112":"startingEtherValue()","f6e5e298":"setScientificData(uint256,string)","f6e66c17":"totalAwards()","f6e681a9":"IkuraApproval(address,address,uint256)","f6e72981":"mintManyTo(address,string,uint256[],uint256[])","f6e7b785":"tdeStarted()","f6e7f69d":"test_insert_findWithHintPrevRemoved(int256)","f6e87f81":"SkillChainToken()","f6e898b0":"getIcedAddresses()","f6e9b85c":"doSetCanCreateGrants(address,bool)","f6ea1a3f":"CryptoSpin(address)","f6ea6252":"MINER_END_PRICE()","f6eb1337":"TokenBought(address,uint256,uint256,uint256,uint256)","f6eb13b3":"VietnamToken(uint256,string,uint8,string)","f6eb58de":"TransferManagerRevoked(address)","f6ebe41a":"defaultURIStart()","f6ec91d5":"developerAccount()","f6ecb9ee":"getprizemoney(address)","f6ecd724":"init(address,uint256,bytes32,uint256,uint256,uint256,uint256,bool,bool,address)","f6ecebf2":"LeagueAdministrator()","f6ed4b71":"getBasketDetails(address)","f6ed5342":"updateEscrow(uint64,uint256)","f6ed8fe7":"grantsUnlock()","f6ee2d8d":"developersTokensWallet()","f6ee439f":"registerAssetComment(int256,string,string,uint256)","f6ee87b8":"_0xEtherToken()","f6ee8c59":"FirstBonus()","f6eeb89c":"addBid(string,string,uint256,address)","f6eeff1e":"punkNoLongerForSale(uint256)","f6ef97ff":"transferEthToWallet(uint256)","f6efcb7a":"setKeyData(bytes32,bytes32,bytes32)","f6f0fa8d":"teamReleased()","f6f10a26":"topUpWithEtherAndTokensForHolders(address,uint256)","f6f15ec9":"Larbaoui()","f6f17bba":"distributePreSoldShares()","f6f1995d":"onlyOwnerSetBountyWallet(address)","f6f3144d":"GetEthBalance(address)","f6f32cc4":"CICToken(string,string)","f6f36641":"setV_R5(uint256)","f6f3973f":"fundIco()","f6f494c9":"getTermsContract(bytes32)","f6f505c4":"RaffleResult(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,address,address,bytes32)","f6f54833":"HighEndTreasureChain()","f6f55ada":"TokenDistributed(address,uint256)","f6f5eb59":"transferableStartTime()","f6f5f567":"SMPAcquired(address,uint256,uint256)","f6f65f1a":"ASTRN_TOKEN()","f6f6edd4":"issuerDecimals()","f6f6fc74":"holderTeamTokens()","f6f7301e":"getById(int128)","f6f82ecb":"massChangeRegistrationStatusForSilverWhiteList(address[],bool)","f6f844e4":"setOp(bytes32)","f6f8ca07":"burnPXL(address,uint256)","f6f91737":"MAX_FREE_REFERRAL_PACKS()","f6f94a85":"ScaleFactor()","f6f94b47":"MiningPayout(address,uint256,uint256)","f6f96d91":"rateOfEther()","f6f98e34":"calcReleaseToken(address,uint256,uint256)","f6fb2c72":"buyGuardian(uint256,uint256,uint256)","f6fb4c9a":"_createFilm(string,address,uint256)","f6fb6ecf":"buildHouse()","f6fbc06a":"getWeiInvested(address,address)","f6fc8160":"addSeed(uint256)","f6fc96ad":"mainsale()","f6fcbee1":"getArrayUint(bytes32)","f6fcc14e":"agTechWallet()","f6fe3a01":"getUint256Min(int256)","f6fee732":"getAccountNote(address)","f7008156":"_haveEveryoneDeposited()","f700abf1":"addBudget(uint256,uint256)","f700ead9":"withdrawTokenMulti(address[],uint256[])","f702dd8a":"hkchain(uint256,string,string)","f703601e":"safe_add(uint256,uint256)","f703e773":"changeLifeExpectancy(uint256)","f7044bae":"getShareHolderCount()","f7048161":"checkRefundSignature(uint8,bytes,address)","f704b57a":"Bitconnect()","f704cb98":"addInvitation(address,address,uint256,address,string)","f70532fe":"getContractsOf(address,uint256)","f705fb87":"preICOend()","f7066121":"lastJackpotRound()","f706b476":"set_pauseUET(bool)","f706b814":"PARSEC_CREDIT_DECIMALS()","f7073490":"buyLink()","f7074919":"seenHereA()","f70794ea":"acceptHelp(uint256)","f707a308":"tierTwoMin()","f7086dd1":"SmigesToken()","f70904b4":"sale1Accepting()","f7095d9d":"updateTentativeWinningChildUniverse(bytes32)","f709dd51":"getTrademark()","f70ad595":"team_release_epoch()","f70b0a07":"setTrustedLateCloser(address,bool)","f70b13c5":"vestedTokens(uint64)","f70bbb9a":"getProposalExternalToken(bytes32,address)","f70bbdaf":"create(string,string,uint32,int256,string,address)","f70bdba7":"AdidasCoin()","f70c92de":"GOSHUIN()","f70ccc6e":"MaptPricing()","f70d7629":"_verifyOwnershipOfTokens(uint256,address,uint256)","f70dbb77":"isPresalePeriod()","f70dd1fe":"isAllocated6()","f70eabff":"addTeamAndAdvisorsAllocation(address,uint256)","f70f1821":"weeksFromEnd()","f70fa221":"getInitializeCashValue()","f71143ca":"isSaleLive()","f712d7ff":"testFailControllerTransferFromWithoutApproval()","f712f3e8":"implementsERC165Interface(address,bytes4)","f7138eaf":"createArtworkAuction(string,string,uint32)","f71441a5":"maxGoal()","f7146269":"testGetRandomDragon(uint256)","f7149220":"RNG()","f714a96e":"myCompany()","f714bf3d":"overflowOwner()","f714de9c":"MultiAccess()","f7160766":"getCompte_13()","f716171c":"createTrade(uint16,address,address,uint256,uint16,uint32)","f7164029":"upgradePrefixPreSignedFirst(uint8,bytes)","f716c400":"getCrowdsaleUniqueBuyers()","f716fe43":"s37(bytes1)","f717442a":"previousPriceOf(uint256)","f717c310":"freezeTransfersSince(uint256,string)","f71868da":"Ethereumcapital()","f719254d":"cancelEthToTokenOrder(uint32)","f719e111":"useOraclize()","f719edfb":"firstPublish()","f71ad40e":"icoCapInWei()","f71b041c":"refundUser(bytes32,uint8,uint256,uint256)","f71b382c":"PIEXTREAM()","f71be837":"sign(address)","f71c60bd":"AMBASSADOR_FIVE()","f71cc3a5":"setUserStatus(address,uint256)","f71db383":"setArbitrationContractAddress(address)","f71dcb10":"CreatedMTP(address,uint256)","f71f7a25":"set(bytes32,bytes32)","f71f9c38":"SupplyChanged(uint256)","f72047ff":"_enableRefunds(address)","f72084b2":"foundationShare()","f720a453":"senderStake()","f720d563":"endAttack(address,bool,uint256,uint256,uint256,uint256,uint256,uint256[])","f720ef08":"setTokenAiNetworkToken(address)","f720f3d2":"tokensToEther(uint256,uint256)","f720f80b":"isMaster(address)","f7213db6":"orderFills(bytes32)","f72457af":"CertifierDb()","f7253071":"lastBlock_f0()","f725839f":"multiGenerate(address,address[],bytes)","f7260d3e":"receiver()","f7265042":"getUsersShipsIds()","f726af40":"MilestoneAmountRaised()","f726f715":"distributeFunds(uint256)","f727550e":"determineOutcome(uint256)","f72755fe":"getRequest(int256)","f72758e7":"getBracketDataMiddleTeamIds(uint8)","f72860ca":"modifyCustomer(string,string)","f7286888":"getPhaseNumber()","f72918ef":"addVoterVote(address)","f729688e":"_hasFlags(uint256,uint256)","f729b216":"moreTokenPerEtherForSeedRound()","f729cf0d":"getJob(bytes32)","f72a244d":"handleAllowance(string,uint256)","f72ae72c":"remainingTokenForSale()","f72b7ab9":"SbloccaConto(address)","f72c436f":"isHuman(address)","f72c75a5":"delegateVestingContractOwner(address)","f72d2c22":"BONUS_HI()","f72d3b15":"LamboPresale(uint256,uint256,uint256,address)","f72d50a9":"getPOOL_edit_4()","f72d53ba":"getNumMatches()","f72db5a3":"getLLV_edit_8()","f72e460a":"getBUUU(bytes32,uint256,uint256)","f72e695b":"setPoolCut(uint256)","f72f30e1":"Vesting(address)","f72f34db":"getDCountedBasicBallotsN(bytes32)","f72f6826":"ChangeEnd(uint256)","f72fc599":"_isThereAnOnGoingTapProposal()","f73052e8":"totalSoldCount()","f73079a6":"Auto(address,string)","f73089b9":"sale2Stopped()","f7309f29":"testLedgerUnderPayback()","f731c3bd":"lotteries(uint32)","f731d33c":"ApzCoin()","f7326286":"getARInvIndexTable()","f73294b8":"isValidatorAlreadyVoted(address,address)","f732eb66":"getPayoutDenominator()","f7342cd3":"SGF()","f7362152":"testThrow_testableContributionCaseExpectFailure()","f73770e7":"is_contract_paused()","f737f274":"getBuyDemand(uint256)","f73857cc":"deauthorizeAddress(address)","f738e5ca":"ownerTakeProfit()","f739a501":"snapShot(uint256,address)","f739ba2f":"picops_withdraw_excess()","f739c261":"legendary()","f739ed4c":"id_for_user_version(uint256,uint256)","f73a590c":"distributed_team()","f73b5541":"bulkWhitelist(address[])","f73baf62":"proxy_initialization()","f73c30e3":"getESOP()","f73c8dfd":"pvpQueueSize()","f73cc97c":"AddDOT(bytes)","f73d05db":"getSha()","f73d594c":"ERC20Base()","f73e05dd":"RetrieveCommissions()","f73f4ebc":"processBuyRequest(string,address,uint256,uint256,bool)","f74034df":"purchaseGen0Token(uint256)","f7407178":"get_banlance(address)","f740fbc9":"test_validPerc()","f74100e3":"getBits(bytes)","f741b602":"denyInvestor(address)","f742048b":"NlvToken(uint256,string,string)","f7426b62":"unlock(bytes32,bytes,uint256[],bytes,bytes,bytes,uint256[],bytes,bytes)","f74279b0":"totalEarning()","f7434ea9":"arbitrationCost(bytes)","f743d334":"BancorBuy()","f744538d":"submitClearingPrice(address,bytes32,uint256)","f7448a31":"transferERC20(address,uint256)","f745630f":"update(uint256,string)","f746e28d":"fundSchool(uint256)","f746f365":"icoSoldCap()","f746fcdb":"presaleMade(string,uint256)","f74715cb":"ApproveERC20(address)","f7474d00":"payEther()","f74758ef":"safeSendCard(uint256,address)","f7477435":"TokensWorldCoin()","f747a5eb":"auctionBid(bytes32)","f747b744":"investFromWallet(uint256)","f749013e":"dateStartContract()","f7493c6a":"UpdatePremiumLimit(uint256,uint256)","f749bdc1":"BUYER_CHECK_STEP(bytes32)","f749d980":"LastExecuted()","f74a4e63":"transferToMint(uint256)","f74b766a":"createBet(uint256,uint256,uint256,bool,string)","f74c67b3":"getAddressKYCState(address)","f74c753f":"dontReturn()","f74d73ec":"issueSertificate(address,address)","f74deae3":"MultiSigWallet(address,string,uint256,uint256,string)","f74e8655":"setWhitelistAgent(address,bool)","f74e9bde":"pwr(uint256,uint256)","f74f4702":"changeRequiredMajor(uint256,bool,bytes)","f74fbb47":"StateChanged(bool)","f74fc598":"listSharesForSale(uint256,uint256)","f750aaa6":"withdrawEverything(address)","f75165c6":"right22(uint256)","f751758b":"getCurrentTokenPrice()","f751b26a":"unclaimedRoyalty()","f751c2f5":"MAC()","f751cd8f":"drop()","f752644c":"aelfCommunityMultisig()","f752fdc3":"wdivide(uint256,uint256)","f75316b4":"CobinhoodToken()","f754f766":"setBonus(uint8,uint8,uint8,uint8)","f7553098":"voteForOutcome(int256,uint256)","f755a76e":"createBoard(bytes32)","f755a98b":"setCrowdsaleEndBlock(uint256)","f75640b3":"crowdsaleCanceled()","f7566b49":"getBet(address)","f756b574":"getDropAmount()","f7572cf3":"newCampaign(address,uint256)","f757342c":"setRewardWasSent(address)","f758ff59":"SentDeveloperFee(uint256,uint256)","f759e298":"getNumberOfBlocksPerKick()","f75a275b":"reservedLPT()","f75b8d3c":"getExpiredCratesForUser(address)","f75beacf":"HuaTuo()","f75ccbf0":"checkErrors(bytes32)","f75cf7d5":"IndecoinBounty()","f75d34bb":"ICOChanged(address)","f75e5d85":"selfDestruct(uint8,bytes32,bytes32)","f75eb240":"removeCallSpenderWhitelist(address)","f75ec528":"getSpaceInfo(uint256)","f75fa5e1":"xorReduce(bytes32[],uint256)","f75fb878":"preICOwei()","f75fdcaa":"cancelMilestone(uint256)","f760d2a2":"_incrementBlockStats(bytes16,uint8)","f761720a":"isEquiped(address,uint256)","f7618a40":"LIMIT_PROMO()","f7620435":"inquire_length(uint256)","f7627da2":"startUnlimitedSale(uint256)","f7628949":"B2ANDcoin()","f762e147":"addAsset(uint256,uint256,bytes)","f7637bec":"AccountReaderRemoved(address,address)","f764531d":"saleStartAtBlock()","f7647f36":"acceptPurchase(uint256,uint256)","f764e8a0":"partPos()","f764eb93":"LogDepositForDividend(uint256,uint256)","f765088f":"UpdateClientAddress(address)","f7654176":"split()","f76543e9":"hasOpening()","f7658e0f":"bonusDecreaseDay()","f765b6b1":"getEventInfo(bytes32)","f765e6e4":"return_pause()","f765ec6f":"lastBlock_a11Hash_uint256()","f766658d":"finalizePreIcoDate()","f76692a6":"dtTestCitySnapshot(address,uint256)","f766cd3e":"minInvestorCap()","f766eca7":"EtherDeltaApproveToken(address,uint256)","f7670b0c":"updateAuth(address,address,bool)","f7678fda":"setNewRegister(string,string,uint256)","f767fdcf":"KRYPT()","f767fe97":"MarketingAddr()","f7682aa5":"CURVE_CUTOFF_DURATION()","f7683b37":"ETTCE()","f768402a":"addProduct(address,string,string,uint256,string)","f768923a":"ignite()","f76a24e6":"isTesting(uint16)","f76aae2f":"addVerifiedAddress(address)","f76b8c5e":"destinationOf(uint256)","f76bd7d1":"disableIssuance()","f76bf292":"StormToken(address)","f76bf757":"registerPage(bytes8,string,bytes32,string)","f76c0f4e":"updateFlipTokenRewardAmount(uint256)","f76c1ea5":"setReceiptLiablity(address,address)","f76c84eb":"manualChangeMonth(uint256)","f76c906b":"mCurrentSnapshotId()","f76ce123":"ERC20Template()","f76cf4bf":"BiToro()","f76d270e":"_setTokenBudget(address,uint256)","f76d3569":"auditorDelegate()","f76e8d29":"createSplitAgreement(address,address,address)","f76e9183":"VitalSkin()","f76f8d78":"SYMBOL()","f76f950e":"uint2str(uint256)","f76ffe7a":"startMintingData()","f77014da":"setGVE(uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32)","f7701b47":"downloadPriceInWei()","f7701ce8":"batchDistribute(address[],uint256)","f770a865":"FaradCryptoken()","f770c96f":"TDESupply()","f771bc6b":"minerSaleCount()","f772547b":"addressToSubscriptions(address,uint256)","f77267ea":"sendTokensToWorkers(uint8,uint8)","f77282ab":"finalizeAuction()","f773a3fb":"maxAssignedRequests()","f773ab80":"isPVPProvider()","f773c770":"TMSYToken(address,address)","f77404e5":"totalCommonWithdrawSupply()","f7745f88":"BudCoin()","f7746e36":"cars(uint256)","f7749e32":"rocketTimeUntilMoon(uint256)","f7750bd5":"startEthGetToken()","f7759c84":"maxTokenSupplyPreICO()","f7768580":"EventTransferAction(address,address,uint32,uint8)","f7770906":"buy_energy_core(address,uint32,uint32,uint64,uint32,uint64)","f778f32b":"addAlgo(uint256)","f7791010":"approveWriter(uint256,address)","f779a68d":"_deposit(address,address,uint256,bytes)","f779abf7":"DaoUpgraded(address)","f77a0923":"BitcoinProcessor(address)","f77a490d":"setMinPurchaseInWei(uint256)","f77aa0ad":"changeRedTeamAddress(address)","f77abd74":"getMatchPointsGroups(uint256,uint192)","f77b1856":"getAddTokenData()","f77b6f61":"getCRhashOfCRTokenId(address,uint256)","f77c1dc6":"unknownInvestors(uint256)","f77c4791":"controller()","f77c4ff9":"_firstRoundFight()","f77ca208":"managerIsPaused()","f77d62f0":"roundNumber_()","f77da6d5":"claimImmediateTokens(address)","f77dc854":"setHookableTokenAddress(address)","f77dff06":"joinPillarWithEarnings(uint256,uint8,uint256)","f77e4d8b":"test_YayIsNotOverSixtyPercent()","f77e8b83":"addPlayer(string)","f77f29b1":"getFeeWindow()","f77f2f2e":"setRewardStatus(address,bool)","f7800e69":"fundVault()","f780259e":"totalPrayers()","f780d867":"add_coin(string,string,address,uint8)","f7815fae":"getIntField2()","f782b2ea":"_confirm(address)","f784cae5":"Fetish()","f784dd61":"RealeaseTime()","f78525a1":"getFaucetByName(string)","f785ef72":"decimals_()","f785f03d":"setMigrating(bool)","f7860bb1":"addToBounty()","f7862ec2":"feeWindowBurn(address,uint256)","f7868884":"FOUNDERS_REWARD()","f786bb62":"Hiken(uint256,string,uint8,string)","f786becd":"MAJOR_VERSION()","f786cb82":"updateLemontokensRemainingToDrop()","f7870c5b":"Unlock(address,uint256,uint256)","f7888aec":"balanceOf(address,address)","f7892887":"phase_1_Time()","f7899d9e":"_buyCommonTTM(uint256,uint256,address,address)","f78a706a":"extraEmission(uint256)","f78a7a55":"createBurnRequest(address,uint256,string)","f78c6b54":"donations(bytes32,uint256)","f78cc9cf":"getTokenNextPrice(uint256)","f78d1c6a":"managePID(uint256)","f78d5494":"approveNewMintRequest()","f78dd0c1":"MovieCoin(uint256,uint256)","f78e4210":"test_oneValidEqAddress()","f78ed322":"regNameWOwner(string,address,address)","f78fa141":"_uintToSPDStr(uint256)","f78fadc6":"HXC()","f78fe0e9":"stand(uint8[],bytes32,uint8[])","f7903871":"RevTokens()","f7908f00":"verifyTransaction()","f79098f4":"getEditionLimits(uint256)","f793595a":"ThreeAT()","f7935969":"getRank(address,uint256)","f793fb64":"valInt()","f79480f8":"lastBlock_f19Hash_uint256()","f794e7f2":"addDefenceParts(uint8[])","f794eb58":"getBonusRate()","f7963e8a":"testNewCounterValueIszero()","f7966eef":"changeReputation(address,int32)","f7969147":"currentBurned()","f796e06f":"calculateAndRegisterBonuses(uint256)","f79710fd":"extraTokens(address,address,uint256)","f797ac0e":"addSellingItem(uint256,uint256,uint256)","f797b617":"buyInvestorPack(uint256)","f797f7b6":"ETH_SIGN_TYPED_DATA_ARGHASH()","f7981bdd":"indSeed()","f7982243":"addRecipient(address,uint256)","f7987a03":"applySetMaxFeeWithdrawal()","f798abce":"teamLockAddr()","f79915ce":"kkTestICO91()","f7992d85":"eta()","f7996163":"joinSinceOf(uint256)","f79a2b84":"setFirstMile(address,address)","f79a3c25":"voteForDisable()","f79a97fc":"isSpentTxPaymentForMCW(bytes32)","f79acad3":"approveInvestorsInBulk(address[])","f79b22e0":"betOnATeam(uint256)","f79cfaea":"STLToken(string,string,uint8,uint256)","f79d0a8b":"callSomeFunctionViaInner1()","f79d6687":"removeTokenTime(uint256)","f79dcf8d":"earliest_buy_time()","f79e2b32":"inListAsOf(address,uint256)","f79ea94d":"VoipToken()","f79ebd7f":"tokenPriceDenom()","f79ed94b":"reserveAddress()","f79f528b":"getMinAuctionValue()","f79fc70d":"testBaseStoreTokenUsingDeployedContract()","f7a01b93":"StateMachine()","f7a06a88":"setSellerGuarantee(bool,uint256)","f7a0715f":"DoneToken()","f7a084c0":"AIRDROP_START_AT()","f7a0b2da":"updatePeloExtenstionContract(address)","f7a0ee1c":"maxtokens()","f7a0fa0a":"getShareDistribution(bytes)","f7a268c4":"freezeAccount(address,bool,bool)","f7a33598":"round(uint256[4])","f7a34573":"setAction(string,uint256)","f7a40e99":"moveERC721Tokens(address,address,uint256)","f7a4c45c":"calculateSaleReturn(uint256,uint256,uint8,uint256)","f7a6a046":"backOrenCoinOwner()","f7a7408b":"BuyLevel()","f7a7ec12":"fund_color(address,address,uint256,uint256,uint256)","f7a80784":"addProduct(string,uint8)","f7a8b34d":"planetName(uint256,uint256,uint256)","f7a919be":"createRegion(address[16],address,uint256,uint256,uint256,uint256)","f7a9a152":"count_users()","f7aa4e0e":"MithrilArrows()","f7aad9ed":"amendBalances(address[])","f7ab6ec6":"getOfferingByProposal(address,uint8)","f7abab9e":"tokenTotalSupply()","f7ac5611":"pushStatus(string,uint256,uint256,int8)","f7ac9c2e":"approvePreSignedHashing(address,address,uint256,uint256,uint256)","f7ad7d8f":"getAllowedAmountByTeam()","f7ad906f":"contractTransfer(address,address,uint256)","f7adc48f":"test3(uint256)","f7ae24ae":"FundWithdrawal(address,uint256)","f7ae9421":"checkInvestorBalance(address)","f7aeea14":"removeGlobalConstraint(address,int256,address)","f7af21c9":"cancelCrowdsale()","f7af630b":"GetBindTokensAccountEvent(address,string)","f7b09d33":"giveReserveFund(address,uint256)","f7b14066":"setup(uint256,uint256,uint256,uint256,uint256,uint8,uint256,uint256,uint256,uint256)","f7b188a5":"unPause()","f7b22fa2":"getCurrentBeneficiaryCap()","f7b28073":"moleculartechnology()","f7b2a7be":"rewardAmount()","f7b42d08":"set_price_and_sell(uint256,uint256)","f7b43abf":"PRESALE_ICO_PORTION()","f7b47870":"setPublicOfferingHolder(address)","f7b4b087":"purchaseFirstTokens(uint256)","f7b4feec":"FaucetsToken()","f7b53431":"feesTaken()","f7b54065":"getInvestmentCurrentValue(address)","f7b578ee":"LiveCoin()","f7b6302e":"getInvestorTokensPurchase(address,uint256)","f7b75258":"withdrawlsEnabled()","f7b77a21":"MasternodeRegistered(address,uint256)","f7b822db":"setDEditor(bytes32,address,bool)","f7b89a3e":"getTotalCosts()","f7b8a600":"payAltCoin(bytes32,uint256,bytes)","f7b8eeb7":"getWhale(uint256)","f7b92f34":"CandidToken()","f7b95d35":"setRNGCallbackGas(uint256)","f7ba8896":"random(uint256,uint256,address)","f7bada53":"randomChoiceFromticketPool()","f7bbd1c1":"setMinAcceptEther(uint256)","f7bc2003":"releaseApprove(bytes32,uint8,bytes32,bytes32)","f7bc39bf":"owns(address)","f7bd2361":"LookAtBalance()","f7c0085b":"changeRandomOrgAPIKey(string)","f7c00e2f":"presaleWeiRaised()","f7c07442":"getReferrals(address[])","f7c0f4c6":"calculateRates()","f7c0fa4a":"requireCorrectReceipt(uint256)","f7c2b38c":"seconds_left()","f7c360e0":"fee_claimer()","f7c38052":"createBuyOrder(address,uint256,uint8[],address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])","f7c3b210":"ENCKToken(uint256,string,uint8,string)","f7c3ee7a":"immortality()","f7c42ac8":"onChainIdentities(address)","f7c46a73":"totalhospital()","f7c58b62":"weiPerEther()","f7c5f4b6":"getPreICOBonus()","f7c618c1":"rewardToken()","f7c68ffb":"isReleasedOnce()","f7c824f1":"CombineCard(uint32)","f7c8a091":"forPresale()","f7c8af48":"destroyItem(uint256)","f7c8d634":"tab(bytes32)","f7c9a7be":"drawTertiaryCWinners(uint256)","f7c9afa2":"onlyOwnerGetAdvWallet()","f7c9f1da":"setPonziPriceinWei(uint256)","f7c9f74a":"insert_contribution(address,uint256)","f7cab847":"getRule(bytes32)","f7cb5709":"CoinsLimitUnalterableInteger()","f7cb789a":"roundDuration()","f7cb8e66":"testIt()","f7cbcb8f":"withdrawCrowdsaleOsherCoins()","f7cc8c13":"MobSquads2()","f7cc8f40":"nbBackerWithMoreOrEqualTen()","f7cdf47c":"ETHEREUM()","f7ce25bb":"cardAndChecklistIdsForOwner(address)","f7ce4479":"setCommunityAddress(address)","f7cf0aa1":"updateMinBet(uint256)","f7cf9a1c":"Create(address,uint256,address,string)","f7cfd902":"removalBlackList(address)","f7d08eae":"distributeReserveSupply(uint256,address)","f7d0e04b":"setReputation(address)","f7d4c7e3":"getBracketDataFinals()","f7d518b5":"StartNewGame(string,string,string)","f7d5e485":"airdropToken(address[],uint256)","f7d6dbe5":"UpgradeProposals()","f7d7477b":"sumAmounts(uint256[])","f7d8417d":"MYRED(uint256,string,uint8,string)","f7d871df":"NucleusVisionAirDropTokensMinted(address,uint256)","f7d8c883":"breedWithAuto(uint256,uint256)","f7d9078e":"mintToSpecialFund(address)","f7d91cd4":"allocateReserveCompanyTokens()","f7d97577":"setPrice(uint256,uint256)","f7d978a2":"changeEntryFee(uint256)","f7d9a5ae":"BtcToken()","f7dadf7d":"setBurnFormula(address)","f7daef72":"getIndexBatchByUsername(bytes20[])","f7db7348":"preapprove(address,uint256,uint256,uint16)","f7dba1dc":"nullifyProduct(bytes32)","f7dc0455":"transferInitialAllocation(address,uint256)","f7dc909b":"createNewEvent(bytes32,string,string,uint256,string,string)","f7dd2e28":"BAG_TRANSFER_MINIMUM_AMOUNT_OF_BUYS()","f7ddfb4b":"meltingContract()","f7decfd1":"blacklistSwitch()","f7defe8c":"pickTheWinner()","f7df8f87":"vestingFounderAddress()","f7e0bc92":"COLOR_CUSTOM()","f7e0e743":"removeFirstAdvisorLock(address)","f7e23677":"catAttributes(uint256,uint256)","f7e23778":"PresaleEnd(uint256)","f7e28f8b":"weiRaisedAfterDiscountRounds()","f7e2ed66":"mOnTransfer(address,address,uint256)","f7e2ff00":"userWithdrawalStartTime()","f7e3c068":"PrestigeUp()","f7e3f00e":"PUBLIC_SALES_2_RATE()","f7e42647":"updateTrustRank(uint256)","f7e498f6":"verifyProof(bytes32,bytes,bytes,uint256,bytes32[])","f7e4a4a9":"hardCapPreSale()","f7e502cb":"HALToken()","f7e5951e":"_calcRemainReward()","f7e6af80":"_getOwner()","f7e74e65":"updateEmployee(uint256,uint256,string)","f7e77e44":"releaseMyVestedTokens()","f7e78e78":"verifyDeal(bytes32,bytes)","f7e7d6d8":"Noscam()","f7e80582":"enableAutoReinvest(uint256)","f7e83aee":"verify(bytes,bytes)","f7e95364":"updateGuMasks(uint256,uint256,uint256)","f7e98d15":"YELLOWLAMBO()","f7ea7a3d":"setTotalSupply(uint256)","f7ead092":"totalWinAmount()","f7eaec4f":"removeAgent(address,uint256)","f7eb4017":"findAddressByEndpoint(int256,string)","f7ebc39a":"isTransferAllowed(address,address,uint256)","f7ec221e":"authorizedToDraw()","f7ec2f35":"isContract()","f7ec7b51":"create_new_deal(uint32,uint256,uint32)","f7ecc428":"mintForInvestor(address,uint256)","f7ed6031":"getRoundDividendShare()","f7ed71d0":"left40(uint256)","f7edbbe6":"nextLapId()","f7ee503e":"editTicketPrice(uint256)","f7efd150":"create(address,address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)","f7efd408":"votesIter(uint256)","f7f03516":"EasyHashingCoin()","f7f15304":"ARCD_FUND()","f7f1962e":"firstAuctionsInitialDuration()","f7f2210c":"openBetIndex()","f7f2741c":"AFTCoin()","f7f32916":"computeTokenWithBonus(uint256)","f7f33c54":"CriptaliaRewards()","f7f3815c":"setOperation(address)","f7f3ad16":"FixBet51()","f7f3da3b":"TestContractOne()","f7f4b9d4":"saleEnd1()","f7f50faa":"chunksAlreadyVested()","f7f5886e":"initializeS4FE(address)","f7f59411":"purchaseExistent(uint256)","f7f59b0f":"LogCustomerVerified(address,address,uint8)","f7f6d4da":"GreenEarthEconomyFund()","f7f74b56":"closeVoring()","f7f7915d":"setNextRoundFee(uint32)","f7f8303b":"product1_sell()","f7f87361":"DepositProxy(address,address)","f7f8aae9":"SudoEnabled(bool)","f7f9cb1c":"wrappedContract()","f7fad9fc":"UpdateState(uint256)","f7fb07b0":"getCurrentRate()","f7fb4801":"firstRoundWMEnd()","f7fc1bd6":"PROMETHEUS_SHIP_PRICE()","f7fc7783":"SanityPricing(address)","f7fc8a91":"haveShelf(string)","f7fca4f4":"setFeeFormula(address)","f7fca8d3":"ratePublicSale()","f7fce4da":"raffle_addr()","f7fd2e19":"TCoin()","f7fd3d01":"releaseCarbonDollar(uint256)","f7fe2e32":"newBurnableOpenPayment(address,uint256,uint256,string,string)","f7fe3477":"assertEq(bool,bool)","f7fe6f39":"fibo()","f7feeb31":"amendEntry(uint256,bytes32,bytes32,bytes32,bytes16,bytes1,bytes16,bytes32,bytes32)","f7ff50e2":"transaction_count()","f7ffaa5b":"ExTokeA()","f7ffbd85":"amountRemaining()","f7ffc366":"executeRulingB(uint256)","f80176ab":"GetEthereum(address,uint256)","f8018a79":"prepend(address,address)","f801fae9":"_fCancelDist()","f802075f":"requiredEndowment()","f8024d10":"getMemberAtIndex(uint256)","f80334ae":"selfDestruction()","f803bef0":"forceUpdateWinners(address[])","f803f97e":"transferAUTOtokens5(address[])","f8058bdf":"_CROWDSALE_PAUSED()","f805b300":"SALE_4WEEK_BONUS()","f8065ed6":"setStopMatchBetting()","f8083bab":"simulatedWithdrawal(address,address)","f8085c58":"updateStakerRanking(address)","f80979d6":"isPreSalePeriod(uint256)","f809c826":"managerToFunds(address)","f80af907":"roundThreeAmount()","f80b3564":"returnAddress(bytes32,uint8,bytes32[2])","f80b3cfa":"checkBetLowhigh(uint8)","f80bb2a7":"activateSubRound(uint256)","f80bbedc":"ethToToken(uint256,uint256)","f80d6e90":"GPHToken()","f80d9e58":"PVE_BATTLE()","f80db825":"AffiliateCoinMultiSigWallet()","f80dfdc2":"getTmpWriteTimestamp(bytes32)","f80e77d2":"updateETHNZD(uint256)","f80ea517":"getDealerInfo(string)","f80eba7c":"getTrapid(uint256,uint8)","f80f44f3":"right97(uint256)","f80f4ea8":"mintAdminApproval(address,address,uint256)","f80f5d4a":"EightteenToken()","f80f5dd5":"addWhitelist(address)","f80f96f6":"returnGanaBeforeSale(address)","f80fb7ae":"addCET4To(address,uint32,uint32)","f81126a7":"periodICOStage3()","f8115814":"TOKToken()","f8115891":"getSatTokensOwed(address)","f8125093":"set_devcon_map()","f8129cd2":"send(address,address[],uint256[])","f812f423":"advanceEndTime(uint256)","f8132b66":"lockCycle()","f813f027":"requestedTokens()","f813fcfa":"changeFooIntArrayDynamicSize(uint256)","f8140a7e":"standardFee()","f814530b":"_allocateETH(uint8,bool)","f81501f8":"smartContractPriceIsSet(uint256)","f815e6ab":"kdtFundDeposit()","f816f0aa":"gameCancelled(uint256)","f8185a13":"getBatches(address)","f818d723":"transferPower(address)","f8193547":"transferAndExecute(address,uint256,string,string)","f81a1860":"killOnUnsupportedFork()","f81a95db":"setReferrerFee(uint256)","f81b1998":"StopTransferGuard(address[])","f81bfa3f":"killThisContract()","f81d0292":"setParentAddress(address,address)","f81d087d":"prepareLottery()","f81d29df":"GambangCoin()","f81dc03f":"QuizwinToken()","f81de228":"getInvestorPacksAvailable()","f81dee03":"set_koef(uint256)","f81e8775":"resolveAddress(address)","f81ed6ae":"updateStart(uint256)","f81f8101":"initializedTime()","f81f8bf6":"burnReputation(uint256,address,bytes32)","f81ff8e7":"CurrentCoinPrice()","f8201a32":"requestLoan(uint128,address,address,address,uint256,uint64,bytes)","f821a17c":"getVotingNetworkDetails()","f821c423":"sendAirdrops(address[],uint256[])","f822372e":"Lab51TestToken()","f8225a05":"_setTransferFeeAbs(uint256)","f8226dbf":"TC(uint256,string,string)","f822841e":"PropertySet(address,bytes32,bytes32)","f8228f14":"assignSpartansToBattle(uint256)","f8229eba":"addAuthByCode(string,string,string)","f8241d7e":"updateAddresses(bytes32[],address[])","f8242c32":"addChallenge(address)","f824384a":"addInvestorAtID(uint256)","f8247299":"getIudexScoreAll(address,address)","f8256121":"publicResolver()","f8264772":"getTokenss()","f828500d":"isValidMessageLength(string)","f828c3fa":"scheduleCall(address,bytes4,bytes32,uint256)","f829d1a0":"walletSplitPercentage()","f82a4707":"secondsBetweenMints()","f82a7496":"giveMeCDP(uint256)","f82ab2ec":"PRIVATE_SALE_PRICE()","f82b2c31":"confirmByC(uint256,string)","f82bffa0":"get_merkle_proof(uint256)","f82c09a3":"PresentToCEO()","f82c2301":"resignFromCommunity()","f82c50f1":"log(uint256)","f82de7b0":"mineBlocks(uint256)","f82e4a4f":"Cointum(address,address,address,uint256,uint256,uint256)","f82ec3e6":"Norm()","f82edc1b":"unSign(address,address)","f82f396f":"sha(string,string)","f82f7a4b":"startDepositExit(uint256,address,uint256)","f82fb363":"icoController(address)","f82fe152":"PLAYER_METADATA()","f83064c7":"transferMintship(address)","f830c325":"updateToken(string,string)","f830d489":"depositExit(uint256,bytes32,bytes,bytes)","f83186f5":"HoryouToken()","f831aee6":"kingdomCreationFeeInFinney()","f831e962":"getWebStats()","f831ebab":"freezeTokens(address,uint256,uint256)","f831fe32":"updateApp(string,address,uint256,bool)","f833061b":"RESELLING_LOCKUP_PERIOD()","f8333e0e":"Aramco()","f8339005":"getSaddle(uint256)","f833f984":"OSEToken()","f8341fca":"BezantToken(string)","f8347242":"betsNum()","f834db41":"getBeneficiaryManage()","f834e212":"setGamePrize(uint256,uint256)","f8351daf":"winningCard()","f8354a82":"nextArenaTime()","f835a686":"setSaleEnd()","f835eb1b":"New(string,uint256,uint256,string,string)","f83629e0":"EBLCreation(uint256,string,string)","f83761e5":"setBAU2(bytes32,address,uint256,uint256)","f837e7c1":"battleAdd(uint256)","f838b0e9":"get_allowance_expires(address,address)","f838ea1a":"setDefaultMaxJump()","f838f6dd":"AssignBurnFees(address,uint256)","f8392303":"changeTicketMag(uint256)","f839407b":"setRateRoundSeed(uint256)","f83944ab":"LogEggAcquisition(address,uint256)","f839686d":"STSTEST7()","f839dc62":"pauseWork(uint256)","f839eb1a":"Referral(uint256,address,address,address)","f83a4c8a":"claimBet(uint8,uint8)","f83a768d":"addDiceRoll(uint256,uint256)","f83b5dce":"ec()","f83c4f82":"enableCirculation()","f83c6f64":"MIATOKEN()","f83ce05d":"deauthorizeBurnRequester(address)","f83d08ba":"lock()","f83d14e6":"buySketch(uint256)","f83d69db":"intMin(int256)","f83d96c1":"InsuranceAgent()","f83e3f5a":"SetProjectName(string)","f83e5793":"caged()","f83e9a20":"lock_period()","f83eb5dc":"forcedRefund(address)","f83fcdea":"setPrice(uint256,uint256,address)","f84038b1":"getMinimumContribution()","f8407634":"checkFunderAccount(address,address)","f8408a8d":"Funding_Setting_cashback_time_start()","f843545c":"active_payable()","f843b1b6":"singleWithdraw()","f843d4ec":"setEthereumBalance(uint256,bool)","f843dad6":"phaseTwoEnd()","f843ea4d":"updatePhaseSupplyAndBalance(uint256)","f844a9f4":"requestArbitration(bytes32,uint256,address,address)","f84501e0":"prosperaTokenAddress()","f84564f6":"RGTOKEN()","f845862f":"newUser(bytes32)","f8469646":"slice(address[],uint256,uint256)","f847b16d":"INAToken()","f848091a":"claimERC20(address,address,uint256)","f8482ca5":"Payroll()","f848d541":"withdrawLimit()","f84907d7":"tokens_backed(address)","f849acb8":"overrideLock(bool)","f84a0e74":"BSWCValueCirculateAssets()","f84a6519":"requiredDownPayment()","f84ad0fb":"ProvideWorkOrder(address,address,address,address,address,uint128)","f84af7f3":"isAssetIdOwnerOrApproved(address,uint256)","f84b2f51":"disqualified()","f84b624e":"ProjectCoin()","f84b903e":"distributed()","f84bcb11":"setEtherReceivers(address,address[])","f84ce165":"setEndStage1(uint256)","f84dcb1e":"CFToken()","f84ddf0b":"lastTokenId()","f84f30c4":"_isCorrectBuyin(uint256)","f84f420b":"getRandomNumber(address,uint256)","f84fce56":"isDraw()","f850a136":"get_lose_coefs()","f850a7a4":"_addUser(address,address)","f850b7f8":"ERC20YSLToken()","f851019a":"BONUS_50_100()","f8515cfc":"destroyFactory()","f8515eca":"Operable(address[])","f8516c6c":"groupPolicyInstance()","f851a440":"admin()","f8524236":"DeleteImage(uint256)","f852b976":"_updateState()","f853343d":"addStakeAD(uint256,address)","f8536b94":"participated(uint256,address)","f8538662":"signup(bytes32,bytes32)","f853ee49":"rateUSD()","f8542f5e":"getCopaCoreAddress()","f8548bea":"quarterFirst()","f8548e36":"transfer(uint256,address,uint256)","f854d74c":"withdrawCommunityTokens(address,uint256)","f856d605":"tokensPerEther()","f8570b01":"_newEpoch(uint256)","f85771b2":"removeManager(address,address)","f8579af8":"test_percPoints()","f8588593":"isSuperContract(address,address)","f85905ac":"testEqualityUint(int256)","f85a253f":"setTEx(address)","f85a3dea":"totalAmountOfEarlyPurchasesWithBonus()","f85aefba":"testBitsSetFailIndexOOB()","f85b2160":"recoverFailedLock()","f85c6b3b":"_safeGasCall(address,bytes)","f85cb0b5":"Start2()","f85cd33e":"timelockTokens()","f85d9cc7":"setReviveFee(uint256)","f85daa38":"authorityContractAddress()","f85e4854":"tokenIssuedPreSecondIco()","f85ef43b":"modifyPolicyAttribute(uint8,uint256,uint8)","f85f0972":"FoxicoPool(uint256,uint256,address)","f85f3b7f":"defaultIcoDeadline()","f85f8a3a":"BiTianToken()","f8605230":"getNewTeamPositionAndCheck(uint16,uint8,uint64)","f860a6d8":"withdrawlBalance()","f860e64a":"Lottery(uint256,uint256,uint256)","f8615d24":"getBio(address,bytes3)","f861d2bf":"MIRC()","f86282da":"doStateChanges()","f862d780":"addIn(address)","f862f6f4":"cap_nuru()","f86325ed":"BASE_PRICE()","f8635ece":"openSession()","f86418e5":"_privateSaleTransferFromOwner(address,uint256)","f864bc65":"lastBlock_a5Hash_uint256()","f864ca14":"withdrawToWallet(uint256)","f864e729":"getAvailableTokenForUser(address)","f8651d56":"Prether()","f868061e":"setICOExchangeRate(uint256)","f8688ddd":"setTargetFeePeriodDuration(uint256)","f869b11a":"declareVictor(uint256,uint256)","f869b3ff":"AdvisorsFund()","f86a3529":"totalStages()","f86a3eeb":"MyGaoguans()","f86a6334":"setCampaignStartDateById(bytes32,uint256)","f86abfd9":"mainSaleRateP4()","f86ae8b2":"TokenSaleStop()","f86b0669":"burner_addr()","f86b5ebc":"DANSSold()","f86c4354":"GovcTechnicalGases()","f86c8ed3":"blocksUntilNewPotentialWinner()","f86ccd41":"amountDeposited()","f86cd33d":"noThrowCall(address,bytes4)","f86da6ed":"checkTotalBets()","f86db133":"forwardWithRevert(address,uint256,bytes)","f86e898c":"hasMinCreatedOn(address,uint256,uint256)","f8702fe1":"calcFees(uint256,string,uint256)","f870849d":"GetBankerPrincipal(uint8)","f871cca9":"_check(uint8)","f871e0e1":"DutchAuction(address,address,address)","f8721a4e":"calcReturnValue(uint256,uint256)","f8721f1e":"nAlarms()","f8725493":"GCA1()","f872bec0":"sn()","f872c9dd":"Vote(address,string,uint256)","f8732d3e":"goodLuck(address,uint256)","f8737bc0":"nextUnlockTime()","f87394d6":"DonateEther()","f873d7e6":"initializeTrueUSD(uint256)","f8742a14":"hivePerUSD()","f87482e1":"changeMigrate(address)","f875c421":"delegateReferalTokens(address,uint88)","f876101c":"setConstantsContract(address)","f876250a":"getNumClonesInWild(uint256)","f876fe1a":"availableHavvens(address)","f8779524":"addNewGame(string,int8)","f87876c5":"resignFromMatch(uint256)","f8788382":"payService(uint256,uint32,string,uint64,uint64,uint64,uint64,uint64,uint64)","f8789e1a":"_createUnitHelper(uint256,address)","f878fcc2":"migrationAllowed()","f87aa82f":"_setBuyPrice(uint256)","f87aad3e":"SetAllLock(bool)","f87aba30":"placeBet(uint256,uint256,uint256,bool)","f87c77c0":"getVirtualChannel(bytes32)","f87d7236":"addCapFreeAddress(address)","f87e7446":"Houton()","f87eac7f":"lastBlock_v15()","f87f31c3":"mintMiniICOTokens(address,uint256)","f87f44b9":"setWebsite(string)","f87ffb74":"gameIdCntr()","f88001d4":"reopenSale()","f8801631":"getTotalDonateWEIInfo()","f8806544":"getBioLanguages(address)","f880f920":"calcMax()","f8811c36":"registerNewAccount(address)","f88218e0":"claimPheonix(address)","f8823353":"_isListed(address,address)","f88339a5":"CBOPToken(address)","f8833efd":"probabilities(uint256)","f88351d9":"getDividendsBalance(address)","f88371e8":"balancesLocked1Y()","f883dfb5":"initializeLevel()","f8840c38":"TopforceCoin(uint256,string,uint8,string)","f88489a6":"getBidIdsByToken(address)","f884e54a":"giveCat(bytes5,address)","f88573c8":"Administration()","f885eaf2":"returnAllowedTime()","f88607e4":"ICO_PRICE2()","f88649a1":"getLastWinner()","f8868778":"change(uint256[])","f886cbda":"reado()","f886e9b6":"removeRelation(address)","f8887cd3":"TransferToken(address,address,address,address,uint256)","f8895cc8":"schema()","f8896ea6":"Interim()","f8897945":"min()","f889ac54":"JP_sum()","f88a067f":"registerHotel(string)","f88a742b":"insertStage(uint8,uint256,uint256,uint256)","f88b07a3":"SoldToken()","f88b1f38":"balances6(uint256)","f88bf15a":"removeLiquidity(uint256,uint256,uint256,uint256)","f88bfe3e":"getCountStages()","f88cc87c":"decline(bytes32,bytes32)","f88cf827":"getVendorProducts(address,uint256,uint256,uint256,uint256,uint256,bool)","f88d2047":"cancelOrder(uint256,bool)","f88d6732":"dice(uint256)","f88e0b09":"getTransferValueValue()","f88e9fbf":"divide(uint256,uint256)","f88edaf2":"mMultiSigWallet()","f89005e7":"depositWithReference(string)","f8900ddd":"godAddress()","f89037a9":"TureTreasureChain()","f8907491":"isCollectionAllowed(bytes8,bytes8)","f890e286":"oracleOf(address)","f8910119":"AuctionStarted(uint256,uint256)","f8910241":"_getTokenAmountForBuyer(uint256,bool)","f892ee05":"subDevTwo()","f894d957":"signedApproveCheck(address,address,uint256,uint256,uint256,bytes32,address)","f895436a":"setLotteryParameters(uint256,uint256,uint256,uint256,bool)","f8956a67":"getBonus(address,address,uint256)","f896503a":"getConfigAddress(bytes32)","f896680c":"testInitialEtherBalanceShouldBeZero()","f8975cd9":"ZanteCoin()","f8976385":"RokToken()","f897ae8c":"numEmptyIndexes()","f897c998":"lastSaleTime()","f897ebbc":"setDelegatedFromOperation()","f8981789":"setCompliance(address)","f8984677":"_calculateMinimumprice()","f898e574":"incentiveDistributionDate()","f898f8ab":"Escapable(address,address)","f8995981":"ABAS()","f899b607":"FxdCoin()","f899e9f3":"annihilateShares(address,uint256)","f89a053b":"setAccountFeeModifiers(address,uint256,uint256)","f89a5100":"RGP()","f89a77b1":"removeValidator(address,bool)","f89be593":"softcap()","f89ca001":"revealMove(bytes32,uint256,bytes32)","f89e4df3":"saleMilk(uint256,uint256)","f89e6512":"CMDCrowdsale()","f89ea906":"_refundExcess(address,uint256)","f89eae17":"testStop()","f89f2a65":"addExchanger(address)","f89f3834":"getAccountChartDetailsByEntityId(address)","f89f74bf":"MATCHES_PER_ROUND()","f89f7cb3":"updateDrawPeriod(uint256)","f89fdabc":"TokenTransferContract(address,address)","f8a09cd0":"settlementDetails(uint64)","f8a0cdee":"addUserRewardPayouts(address,uint256)","f8a17d7f":"League(address,uint256)","f8a21631":"PrivateCoinSupply()","f8a321e1":"checkInvestorContribution(address)","f8a34b26":"presale(address,uint256)","f8a35b35":"maximumSubscription()","f8a39a6e":"test_twoTrueAssertNoMessage()","f8a3ce82":"resetSession()","f8a40b7d":"requestSetWithdrawalLimit(address,uint256,string)","f8a46568":"HashnodeProCoin()","f8a47213":"VnixNetwork()","f8a4cc33":"withdrawPoly(uint256)","f8a4e608":"verifiedKYCAddresses(address)","f8a5399a":"settleExtraToken(address)","f8a56efd":"balanceOfRaws(address)","f8a5a8dd":"getTranchesLength()","f8a6172e":"receiveToken(address,uint256,address,bytes)","f8a6c595":"constructor(address)","f8a6fca8":"confirmImperfectReception(uint256)","f8a777f5":"batchCreateInternalDrawings()","f8a8fd6d":"test()","f8a9972a":"selectWinner20()","f8a9c6ae":"golix()","f8aa0a59":"updatebalance()","f8aa836b":"THRESHOLD2()","f8aabbd9":"makeTJs(address)","f8ab02dd":"isRefAvailable(address)","f8ab745e":"validTransfer(uint256)","f8abb93d":"hasVotedOnUpgradePoll(uint8,address)","f8abe7f2":"testSandwichOrder(uint256,address)","f8ac6570":"tokensBoughtInEarlybird()","f8ad69a8":"HetherToken()","f8adb686":"earlyBackerSupplyRemaining()","f8adccdb":"doPartnerShares(uint256)","f8aed03a":"btcsPortionTotal()","f8af2514":"IsItConstantinople()","f8af56b7":"_finish()","f8af9e6f":"setAdv(uint256,string,string)","f8b096bb":"setupRegion(uint256,uint256,uint256[],bool,uint8[128])","f8b0c0b6":"getTransferStat()","f8b10464":"pause_PRIVATESALE()","f8b11853":"getGenerationStartAt(uint256)","f8b14500":"EmissionProvider(address,address,address,uint256,uint256,uint256,uint256)","f8b1db8f":"donationBoxes(bytes32)","f8b28c26":"getSecretByHash(bytes32)","f8b2cb4f":"getBalance(address)","f8b2e259":"lowCapWei()","f8b332ad":"onpayInstallment(uint256,address,uint256)","f8b367c1":"categoryCap(uint256)","f8b3d3b1":"receiveInitialFunds()","f8b45b06":"totalsData()","f8b4ab7a":"updateTotalSupply(uint256,uint256)","f8b4cfc6":"lock(uint8,uint256)","f8b4e080":"changeRateOfToken(uint256)","f8b542c8":"_0xPeriheliaToken()","f8b608a1":"addTournamentContender(address,uint256[])","f8b71c64":"rewardTo(address,uint256)","f8b746dd":"BdpEntryPoint(address[16],bytes8)","f8b89dfb":"setStep(uint8)","f8b991e8":"firstRewardPeriodEndBlock()","f8ba7317":"sealManualMigration()","f8ba8e6a":"getAllowanceAmount(address)","f8bb201c":"setCroupier(address)","f8bb9160":"TIGER()","f8bbca99":"multivestBuy(address,uint256,uint256)","f8bc0505":"left76(uint256)","f8bc8548":"getPOOL_edit_31()","f8bd4498":"AMOUNT_BASETEAM()","f8bd526e":"setCoinageContract(address)","f8bd71c7":"unstop()","f8bdbb60":"assertEq10(bytes10,bytes10)","f8bdc9dd":"get_shares()","f8bf77ae":"managedContracts(uint256,address)","f8bfb34c":"getBorderValue(uint256)","f8c1c186":"isSale()","f8c206b0":"killFaucet(address,address,string,address)","f8c25c48":"changeCreatorBalance(uint256)","f8c28ce0":"releaseOperation()","f8c32ccb":"APG()","f8c34050":"priceIncrease()","f8c3a293":"ADVISORS_AND_PARTNERS_PER_CENT()","f8c439dc":"ETH_EUR()","f8c46eff":"FinalizableToken(string,string,uint8,uint256)","f8c4892f":"transferProxy(address,address,uint256,uint256,uint8,bytes32,bytes32,string)","f8c4ab92":"getNewCumulativeAllowance()","f8c52125":"deriveMarketCreatorFeeAmount(uint256)","f8c587ac":"paper()","f8c5e217":"getSellRatio()","f8c64800":"signTwo()","f8c65bae":"Bgc(uint256,string,string)","f8c75351":"transferViaProxy(address,address,address,uint256)","f8c80d26":"privateCreation()","f8c8282b":"transfer_storage_ownership(address)","f8c8765e":"initialize(address,address,address,address)","f8c8de10":"stringToUint8(string)","f8c95160":"tokenEmission5(address,uint256,address,uint256,address,uint256,address,uint256,address,uint256)","f8ca3e22":"CustomCrowdsale(uint256,uint256,uint256,uint256,address,address)","f8ca9442":"getBalance_in_token()","f8cbd580":"freezeIndex(uint256)","f8cc1055":"transferCallership(address,uint256)","f8ccb027":"AdminTransferred(address,address)","f8ccbd38":"validPurchaseForManual()","f8ce3164":"accumulatedFee()","f8ce5894":"updatePrizePool(address)","f8cf0e1c":"unlockAddr(address)","f8d09593":"Kikicoin(uint256,string,string)","f8d1f5f0":"setProvider(uint8,address)","f8d29219":"fundingStartUnixTimestamp()","f8d29f8a":"hasProfilePicture(address,address)","f8d3277d":"removeFromWhitelist(address,address)","f8d3a26a":"QuasaCoinExchanger()","f8d3afa4":"numberOfTransactions()","f8d3e256":"publicLockEnd()","f8d420a1":"cancelGame(uint32)","f8d50542":"addToWhitelist(address[],uint256[])","f8d506e1":"TCNYCoin()","f8d578f0":"registerContribution(bytes32,address,uint256)","f8d599eb":"appendContribution(address,uint256)","f8d609b2":"assert_ex(bool)","f8d67506":"Shop(uint256,address)","f8d6b70a":"setAyantDroitEconomique_Compte_5(uint256)","f8d7f790":"COMMUNITY()","f8d86bbc":"setNewEndtime(address,uint256,uint256,uint256)","f8d93136":"Savings(uint256,uint256)","f8d95520":"extUnlockNinja(uint256,uint16)","f8d970b6":"checkTemplateRequirements(bytes32,bytes32,bool,uint8)","f8d988d6":"toExchange(address)","f8daa0ee":"transferGroupCommune(uint256,address)","f8dad3db":"MAXIMUMINVESTMENTSALLOWED()","f8db188b":"MeetToken()","f8db5d07":"unlockKyc(address)","f8db71b5":"getStatusContract(address)","f8dc11cc":"soldTokenInPublicsale()","f8dc5dd9":"removeOwner(address,address,uint256)","f8dcbddb":"setStep(uint256)","f8dcc3e0":"getLinkStatus(bytes32,address)","f8dcc9a9":"potato()","f8dd1764":"ClearToken(address,address,address,address,address)","f8ddd288":"s31(bytes1)","f8de2dfd":"destroyCoins(address,uint256)","f8dea17f":"startraffle()","f8df084d":"ZUR()","f8dfaa1e":"ret_img(uint256)","f8e0cc1c":"getPI_edit_32()","f8e1badd":"getCrowdsalePrice()","f8e1ec40":"CTOcoin()","f8e217c4":"getDivBalance(address)","f8e29885":"get_game_balance()","f8e2d041":"maxNumberMembers()","f8e2dc6a":"rangeOfBets(uint256,uint256)","f8e39177":"intrepidShipMinted()","f8e3aa92":"sendNugget(address,uint256)","f8e43382":"icoRunningStatus()","f8e4500a":"getTokenIssued(address)","f8e48488":"returnDevelopersCut(uint256)","f8e4ed5f":"escrowDecision(uint256,uint256,address)","f8e5521a":"getBlockHashOddOrEven(uint256)","f8e58024":"colors()","f8e65295":"storeIt(string)","f8e6a8cf":"payETH(address)","f8e6b331":"jtest()","f8e7577d":"FIBToken()","f8e76cc0":"_exists(uint256)","f8e8b93d":"setTrueUSD(address)","f8e8e035":"COSHACNYToken(address)","f8ea5daf":"withdrawalEnabled()","f8eac151":"Multiply(uint256,uint256)","f8ead7cf":"getUserAverageDividendRate(address)","f8eb5fc5":"getSalePrice(uint256)","f8ebabcd":"_setPixelBlockPrice(uint256,uint256,uint256)","f8ebf282":"changeHSShopPrice(uint256,uint256)","f8ec4bf2":"setAllowTransactions(bool)","f8ec4cd5":"withdrawBidForCollectible(uint256,uint256)","f8ec6911":"buyback()","f8ec7e83":"test_updateKey_zeroNewKey()","f8ecb558":"getFishByAddress(address)","f8eee5d6":"returnPaidBackBlock(uint256)","f8ef13f4":"EthbetToken()","f8ef9a3d":"getPaymentLog(uint256)","f8efaf2b":"partner_2_name()","f8eff67c":"takeInvest()","f8f079bb":"reserveAllocation()","f8f122ba":"numCompletedRequests()","f8f1939d":"PRESALE_TOKEN_CAP()","f8f1d927":"multiERC20TransferTightlyPacked(address,bytes32[])","f8f1f151":"testToAddress(bytes)","f8f2d5e4":"preIcoTokensCount()","f8f32de6":"revealAssertion(uint128,uint256,uint256,uint256,string)","f8f46b5f":"getCurrentMinerAddress()","f8f53ce7":"nestedSecondAnyToAny(uint256)","f8f5cefd":"updateNextMemberPayment(address,uint256,uint256)","f8f63375":"YXLToken()","f8f6773b":"calculatePurchaseBonus(uint256)","f8f6882e":"LavaWallet()","f8f6e080":"UnclaimedDividendTransfer(uint256,uint256)","f8f7312d":"ChangeBurnBoundsEvent(uint256,uint256)","f8f73808":"create(address[],uint256)","f8f8a912":"GetBalance()","f8f9271c":"changeRegistrationStatusForSilverWhiteList(address,bool)","f8f9456c":"CrowdsaleFactory(address)","f8f96a55":"lastBlock_v6Hash_uint256()","f8f9be36":"settlementRegistration(uint64)","f8fb1d0f":"countUsers()","f8fb1f07":"sponsorsOf(uint256)","f8fb3366":"stopPreSale()","f8fb491f":"setSaleAddress(address)","f8fb4ab7":"NBAT001(address,address,address,address,address)","f8fbdbb6":"getChkLockedTokens(address,uint256)","f8fc16ef":"minWeiToAccept()","f8fc6fcd":"QNBAI()","f8fc94aa":"refundTransactionAfterExpiryFee(uint256)","f8fd72ac":"getCompte_44()","f8fdebd3":"weiMaxCap()","f8fe2f9d":"KyberGenesisToken(address)","f8fe63b0":"getERC721Id(uint256,address)","f8ff612e":"WithdrawToHolder(address,uint256)","f8ffe42a":"SetCoefRew(uint256)","f900592a":"ToggleTransferAllowance(bool)","f900b5d6":"getUserTotalPaid(address,address)","f9010d19":"joinEvent()","f901a18f":"setSale(uint256,uint256)","f9020e33":"saleStatus()","f9039f33":"update_current_rate(uint256,string)","f904b9ff":"GXDHRPToken()","f9059832":"isSaleEnded()","f906a440":"getInvoice(string)","f9079685":"SPCoin()","f9081ba2":"safeContract()","f908326b":"payRewardForAddress(address,address)","f9084729":"pvt_plmt_token_generated()","f9094303":"finishVoting()","f909640c":"InitialPriceDisable()","f909d60d":"getMinimumGasLimit()","f90a2f30":"usedNonce(address,uint256)","f90b2bfe":"dissolve(uint256)","f90b2e74":"setInitialTime()","f90c3f27":"FUNDING_PERIOD()","f90ce548":"SmartDeposit()","f90cf0a4":"Land(address)","f90ddee2":"tokenBurners(address)","f90e292c":"stage3Start()","f90f11b7":"withdrawNVTfromGame(uint256,uint256)","f90f3278":"resetUsername(string)","f90f4560":"placeBet()","f90f4a30":"Matthew()","f90fa5dd":"sendTokensToAdvisorsLock(address)","f910feaa":"safeTransfer()","f912e58c":"setPreCrowdsaleAddress(address)","f912ed00":"lockMe()","f913a879":"getBidsNum(address)","f913b919":"setAssetLevel(uint16,uint256)","f9146b2f":"newRefPayStation(address)","f9153fbc":"changeHouse(address)","f9154476":"__redeemAmount(address)","f915cf42":"MINIMUM_BET_VALUE()","f9163e64":"lockUpAmountStrOf(address,address)","f9172266":"setOldSeelToken(address)","f9174551":"cooperativeSettle(address,address,uint256,address,address,uint256,bytes,bytes)","f9177aad":"CreateFBL(address,uint256)","f9190fcc":"smartSponsor(address)","f9191b18":"revealVotes(address,bytes32,bytes32,address[],uint256[],uint256[])","f9195a30":"doFunding(bytes32,string,address,uint256,address)","f91a545b":"getLossTokenAmount()","f91a792e":"decryptHand(string,uint256,uint256,uint256)","f91b853b":"upgradeFrom2To3()","f91bcd76":"getMintForReportingParticipantAmountValue()","f91c022b":"secondTokenCap()","f91c26a5":"dLogN()","f91c339e":"calculateTxHash(address,address[],uint256[])","f91cb3d6":"proposalAvatar(bytes32)","f91d4db7":"TokenTracker(uint256)","f91e89db":"maxMonsterHit()","f91f681f":"targetFromBits(uint32)","f91f87f2":"tokenDistributionDuration()","f9215676":"paymentsByCustomer(uint128)","f921991c":"transferTokensWithOffsetAndLimit(uint256,uint256)","f922501a":"CRYPTOBULL()","f9226daf":"LogWithdrawal(address,uint256,uint256)","f922da7e":"addTokensToCampaign(bytes32,uint256)","f922f216":"disableERC20()","f923058c":"get_total_supply()","f923b8aa":"setBCY(uint256)","f9244a9b":"sendToMinter(uint256)","f9249fbf":"initiateTeamVesting(address)","f924c276":"fechStageIndexBySnapshotBlock(uint256)","f92561f3":"lambosBuildCount()","f9261d3f":"setProviderDetails(address,string,string,string,uint8,address)","f9268170":"setEdgePerPosition(uint256)","f926ac20":"totalInWei()","f9271fd3":"changeFundAddress(address)","f928655b":"transferA2B(address,address)","f92883a2":"mint(address,uint256,uint256,uint256,uint256)","f9297a40":"getPrice(bytes,int256)","f92a373b":"payForOption(address,address,address,uint256)","f92a69ec":"createPolicy(address,uint256,uint8,bytes32,bytes32)","f92a73d7":"ICONIQ_SALE_CLOSING_TIME()","f92a7595":"fxpMul(int256,int256,int256)","f92a79ff":"getExecutor(bytes)","f92a9de5":"developmentFunds()","f92abed9":"GetEvaluate(uint32,uint8)","f92ad219":"initialize(address,uint256,uint256,uint256,uint256)","f92b359a":"instrumentManifest()","f92b9dc7":"TVThreshold()","f92bb8c9":"getConfigUint(bytes32)","f92c33f7":"EventLuckyNumberRevealed(address,uint256,uint256,address)","f92c45b7":"reservedAmount()","f92c6bb6":"getGuessStatus(uint256,uint256)","f92c9b47":"TOKENS_FUTURE()","f92caf3a":"UploadIMG()","f92cd2b2":"airdropTokensBatch(address[],uint256[])","f92ec991":"preEtherReceived()","f92fff12":"requestEtherToUSD(bool,uint256,uint256)","f9307837":"setMaxcap(uint256)","f930a3d2":"presaleMint(address,uint256,uint256)","f9319a88":"SECOND_TIER_RATE()","f931eaef":"untokenizeProperty(string)","f931edb4":"ClaimedTokens(address,address,uint256)","f93231ba":"GetAskingTokenMutiplier()","f932380e":"RoyalPanties(uint256,string,string)","f9323a32":"_selling()","f9324c5f":"EarlyBird(bool)","f9327b9f":"preSaleDeadline()","f933b844":"_addToVesting(address,address,uint256,uint256)","f9355dca":"functionFour()","f93589ce":"didWin(bytes)","f935ae8b":"requestExchangeRate(string,string)","f935fd94":"WeiTransfer(address,uint256)","f937a6eb":"setLockup_investors(address,uint256,uint256)","f938075c":"weiToRecoverPreICO(address)","f9391d24":"AllPayAuction()","f939499d":"backupfarmSingle(address,address,uint256)","f9394c10":"getCarrotCredits()","f93a2109":"ADT()","f93a8d96":"EtheeraCrowdsale(uint256,address)","f93acbe9":"SubBankerProfit(uint8,uint256)","f93af357":"updateSigners(address,bool)","f93b4466":"LudumToken(address,address,address,address)","f93ca568":"ActualQueue()","f93d029a":"sendICOByOwner(address,uint256)","f93de2c3":"updateMinimumQuota(uint256)","f93e2d31":"adminEditCity(uint16,string,uint256,address)","f93e6715":"freeUntilDate()","f93ee24c":"addMinerTokens(uint32,address[],uint32[])","f93f1391":"getPokemonBetTimes(uint256)","f93f1b02":"incByTwo()","f93f7ab5":"saleRateFirstDay()","f93f9a76":"WhitelistUpdated(address,bool)","f93fc97b":"test_updateKey_increaseNoHint(int256)","f940e385":"withdraw(address,address)","f9419088":"mintNonFungible(uint256,address[])","f941c01a":"getOwnerToken()","f942be1c":"endDayOneTime()","f9432517":"transferLimit()","f94497fe":"testCreateWithParentsForeign0()","f944f4c7":"removeUser()","f9454f3f":"register(address,uint256,uint256)","f9455301":"setHoldTime(uint256)","f945b274":"jackpotTokenEthRate()","f945ba2d":"avatarFee()","f945e8b2":"getCurrentRound(uint256,uint256)","f946372c":"TOKENS_SALE_HARD_CAP()","f946d61c":"logReputationTokensTransferredCalled()","f94789bf":"KungfuToken()","f948d276":"changeShare(address,uint256)","f948e51a":"implementation2()","f949116d":"ICDCap()","f94a3223":"submitCro(bytes32,bytes32)","f94a360d":"MAXIMUM_BET_SIZE()","f94aa8bf":"BliBliToken(address,uint256)","f94b97c9":"IntoQueue(address,address)","f94c12cb":"cancelPendingChange()","f94c81c3":"RobotTradingToken(address)","f94c9e13":"getChannelInfo(address,address)","f94d2d44":"formatNumber(uint24,uint256)","f94d71a0":"unregisterObserver(address)","f94d7a10":"setTransferFromWhiteList(address,bool)","f94df54f":"importersBanksLetterOfCredit()","f94df678":"getAuthorizedEditAgents()","f94df97f":"Lotery(uint256,uint256,uint256,uint256,address,uint256)","f94e08d0":"queryWaitingTime()","f94e45de":"Scaltinof()","f94f04e4":"sendPresaleTokens(address,uint256)","f94f1e9a":"LifePasswordAI()","f94f6910":"POINTS_TO_LEVEL()","f9500927":"eth_amount_judgment(uint8)","f950db2b":"unfreezeUpgrade()","f951410d":"setBcouponTransferCost(uint256)","f9514ec9":"ApprovedBy(address)","f9515f1b":"addGroup(address)","f951f856":"getPeriodTotalReceived(uint256)","f952279e":"cancelOffer(bytes32)","f952f938":"CreateCreature(uint256,address)","f953927e":"openRoom(uint256,uint256,address)","f95440ba":"decimalPoints(bytes32)","f954501f":"validRouletteBetData(bytes,uint256)","f95547fa":"getGameFees(uint256)","f9565aec":"NewTokenGrant(address,address,uint256,uint256)","f9566392":"WeightedSubmission()","f956a1b5":"EthereumPinkToken()","f956c139":"getMatchIndex(uint256)","f956ecde":"invalidatePurchase(uint256)","f956fc52":"didWithdrawCollateral(bytes32,address,uint256)","f957417e":"activateToken()","f957ddba":"withdrawAllFrom(address)","f958530f":"bountyTransferToken(address[],uint256[])","f9586eaa":"setScouponAllocationFactor(uint256)","f9587219":"SetPetCardDataContact(address)","f9589eb3":"onceOuttime()","f95918eb":"indexOfUserInfo(uint256)","f959300b":"calculateSetupAllowedUntil(uint256)","f959fe4b":"admin_set_dividend(address,bool)","f95a5504":"buyandearn(uint256)","f95a77e5":"MALCoin(uint256,string,string)","f95a78fd":"milestone(uint64)","f95af64c":"freezeUpdateTokenAccount(address,bool)","f95af865":"selfWithdrawBalance()","f95afe2c":"getPortion(uint256)","f95b4309":"get_selected_player()","f95b5a58":"getInitialAnswer(uint256)","f95b5e0d":"mintTokensWithReferal(address,address,uint256)","f95bbc9c":"activeValueBonus()","f95c1a73":"allocationForESCBbyStage()","f95e0a54":"update(uint256,string,string)","f95e6306":"processInterval()","f95fbf67":"registerBarcode(bytes32,string,string,string,string,string,string)","f95fe2e7":"AddNewChallenge(uint256,uint256,uint256,uint256,bool)","f9609f08":"deposit(address,address)","f9614ac5":"content(string,address,uint256)","f9616bfa":"AidEvaCoin()","f9618364":"DGDb_Auction(address,address,address,address,uint256)","f9619147":"InbestDistribution(uint256,address)","f9639d80":"getCanAcceptAmount(address)","f963aac6":"CONFIG_MAX_PLAYERS()","f96512cc":"createPerDay()","f9654378":"TokenWithValidityPeriod(string,string,uint8,uint256,address,string,address)","f965e32e":"changeValue(uint256)","f9660347":"fetchAllBlocks()","f9662c8f":"returnInterest(uint256)","f9672443":"getMyEntityParents(uint256)","f9672820":"distributeARTTokenBatch(uint256)","f9676db4":"purchaseWithDai(uint256,uint256,uint256,uint256,address,bytes)","f96777d4":"payJackpotToWinner(address,uint256)","f9677e22":"computeSecret(uint256,address,address)","f96803d3":"getJobInvoicesByStatus(address,uint256,uint8)","f9683828":"coinback(uint256)","f968adbe":"maxPerTx()","f968f493":"unlockTokens()","f96a181e":"getContact(address)","f96abf0c":"deleteCrowdsaleContract(address)","f96b636d":"GILLIONTOKEN()","f96c166c":"isInPresalePhase()","f96cecc1":"returnAmount(address,uint256,bytes32)","f96d1c94":"closeStage()","f96ddf7a":"getSigner(bytes32,uint8,bytes32,bytes32)","f96eb003":"migrateManual(address)","f96f143e":"RELEASE_GAS_FEES()","f96f2fa1":"Shareable(address[],uint256)","f9706844":"recommendFundToPlayer(uint256,address,uint256)","f970bbfc":"removeDiscountStruct(uint256)","f97110a3":"getDeployedBlogs()","f9715458":"minActivatedToken()","f9718fc8":"returnTokens()","f971b054":"StoxSmartToken()","f972e2bf":"dateTransferable()","f974a1a2":"PURCHASE_AMOUNT_UNIT()","f974ae3c":"PrivateSaleExchangeRate(uint256)","f975a024":"openNonceId()","f975f3a2":"INITIAL_TOKEN_SUPPLY()","f976104f":"revokeDelegate(address,address,bytes32,address)","f976c371":"ZLHToken()","f9778d0d":"fixPlayerCountryId(uint256,uint256)","f9781eae":"test_curators()","f9782191":"fifth()","f978e842":"_addAdmin(address)","f97944e0":"CREATE_AMOUNT()","f9794660":"finneyToWei(uint256)","f9795a95":"minSlippageFactorInBps()","f979764d":"blockDotNumber()","f97a02fa":"inActive()","f97a9d38":"bonusSubscription()","f97b392a":"unregisterEmployee(address)","f97b65da":"closeShortPosition()","f97b7390":"getCurrentDiscountTrancheIndex()","f97bf9e4":"close(address,uint256,uint256,bytes)","f97c72b1":"_onBall(uint8,uint8,uint8,uint8,uint8[3][3][31])","f97cebed":"BellaStandardToken(uint256,string,uint8,string)","f97d0591":"parseTimestamp(uint256)","f97d8aee":"WriteBond(uint256,address,address)","f97e17d9":"payRate()","f97ea6fc":"getIndicesWithClaimableTokensForSellers(address,address,address,uint256)","f97f8e17":"takeOrder(address,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)","f97fa1bd":"FrozenTokenEvent(address,uint256)","f98038ee":"howManyDicks()","f980a012":"mainSaleRateP1()","f980e52d":"clam()","f98139be":"getCensuredByCount(uint16)","f98157bd":"GetDeadline()","f9819884":"toggleDeathConfirmationByProxy()","f981aaca":"addDeal(uint256,string,string,uint256,string,bytes32)","f981f0c0":"_getAddress(address,bytes32)","f9820cc1":"Nothing()","f983c0fa":"run1()","f98456d2":"unenableTransfers()","f9854bfc":"creditsBalanceOf(address)","f985779c":"sin(uint16)","f985f5fc":"authorized_createCard(uint256,uint256,address,address)","f9869165":"ELIPSToken()","f9870705":"getProject(address)","f98765b2":"BotRemoved(address)","f988279c":"isAce(uint8)","f9888687":"raiseethamount()","f9889f78":"batchTransferFixedAmount(address,address[],uint256)","f988da4a":"TopsToken(uint256,string,uint8,string)","f9892c28":"ProofOfStableCoin()","f98a4eca":"executeVote(uint256)","f98b19f4":"publishBatch(uint16,uint16,string,string,bytes3)","f98b26a9":"submitProposal(address,uint256,uint256)","f98bbc60":"commit(address,bytes32,bytes,bytes32,uint8,bytes32,bytes32)","f98c48c1":"setData_18(string)","f98cbf76":"closeEXORImports()","f98d28bb":"priorityWallet()","f98d7c75":"SALE_STAKE()","f98e09a6":"listResources()","f98e17a7":"PerSellOver(uint16[])","f98e87ba":"hashedParameters()","f98eaa9c":"ClaimTokens(address,address,uint256)","f98f5b92":"setWhitelister(address)","f99031a7":"isWhiteList(address)","f9907274":"allTokenAddress()","f9909915":"bulkStoreHeader(bytes,int256,bytes,int256)","f990b73b":"end_crowdsale()","f991a43f":"currentTadpoleOwner()","f992905d":"deployContracts(uint256,address)","f9937c2b":"getCertificateKeys()","f9938192":"reenduser()","f993bef3":"postDeadline()","f993d955":"BTC_SUISSE_TIER_3()","f9943133":"MeltingContract()","f99450b9":"getEOSIO_USERNAME(uint256)","f994789a":"proposeRewardsWithdrawal(address)","f994bffa":"addCard(string,string,uint8,string,string)","f99514e2":"noInputReturn()","f9952ecf":"changeBoat(address)","f9953de5":"addOrg(string)","f9956289":"PRESALE_OPENING_TIME()","f99638a5":"bTest()","f9965dbf":"giveBounty(address[],uint256)","f996c697":"THRESHOLD1()","f9974d9d":"calculateWineSellSimple(uint256)","f9977329":"CROWDSALE_AMOUNT()","f997e136":"safeAdd(int256,int256)","f997f0c1":"_minHouseEdge()","f997f7eb":"ojiletoken()","f998393c":"Icostart()","f9983a12":"GetMyInvestmentBalance()","f9991f33":"AddProject(uint256,address)","f999ad04":"CreatePCC(address,uint256)","f999eead":"donateToDivs()","f99b7f0b":"getAllMatches(uint256)","f99ca1ee":"productionOf(address)","f99ca808":"totalDonationsWithBonuses()","f99cc96e":"tokenMaxSupply()","f99d18eb":"VIUREFoundersTokenSale(uint256,uint256,address)","f99d948f":"gameExpirationTime()","f99e574b":"BCEK(uint256,string,string)","f99ebb71":"testFailUpdateLatestRevisionEnforceRevisions()","f99ec32c":"lastFreezeSeq(uint8)","f99ee846":"KEACoin(uint256,uint256)","f99f128c":"make_initial_deposit(uint256)","f99f977c":"bountyPercentOfTotal()","f99fc046":"dEthereumlotteryNet()","f99fddae":"isValidUser(address,uint256)","f99ff180":"readMail(uint256,bytes16)","f99ff4df":"paged(uint256,uint256)","f9a01e94":"mintReward(address,uint256,uint256,uint256,uint256,uint256)","f9a075dc":"releaseETH(uint256)","f9a0fcc7":"RequestEthereum(address,address)","f9a191c8":"giveDirectoryTokenAllowance(uint256,address,uint256)","f9a2916f":"getInitiated()","f9a2cbd5":"INTREPID_SHIP_LIMIT()","f9a32246":"_transferFromToICAPWithReference(address,bytes32,uint256,string,address)","f9a329a6":"toVault()","f9a381e2":"CurrentToken()","f9a3e07d":"getObjInfoWithBp(uint64)","f9a42b8b":"_updateSpaceshipPrice(uint256)","f9a56fd8":"GamersCoin1()","f9a57ae4":"notDistributedAmount()","f9a596dd":"validatePrograms(uint256[])","f9a6da0c":"pks()","f9a794ad":"EtherLovers()","f9a7a2ef":"named(bytes)","f9a7c906":"setBonusTokenRateLevelTwo(uint256)","f9a86856":"maxWeiSMSVerified()","f9a87d4f":"buyAllAmountBuyEth(address,address,uint256,address,uint256)","f9a8b0ba":"latchTotalFci(uint256)","f9a8b611":"moveUnsold(address)","f9a8c5b9":"teamSum()","f9a8e898":"slashReservedUsername(bytes,bytes32[])","f9a8f797":"setLatestContract(address)","f9a94d43":"finalisePreSale()","f9a94ecd":"SellTokenToRaj()","f9ab21e2":"indexOf(uint32[],uint32,bool)","f9ac71bf":"allowNorthPoleMinting()","f9add1b9":"ourLastWinner()","f9ae77ff":"supportNewPurge(address,address,uint256)","f9aef74e":"PureGold()","f9b04f72":"reinvestByProxy(address)","f9b07b9b":"TeikhosBounty()","f9b16430":"HonestisNetworkETHpreICO()","f9b18e72":"RentableProvider(string,string)","f9b207f6":"Teepee()","f9b290b6":"PDPCointoken()","f9b2b19a":"getCns()","f9b2d1ee":"buyForFriend(address)","f9b2ec8e":"MinStarIndexAvailable()","f9b35ca3":"seed_traded_token()","f9b3e7f0":"hashAccountId(string)","f9b41139":"getBoxCount(uint16)","f9b4257d":"newXcat(bytes32,address,string,uint256,string,uint256,uint256)","f9b4d63a":"ownerOff(address)","f9b5c633":"ICONClassicToken()","f9b6b0c4":"create(address,uint256,uint256,uint256,uint256)","f9b71e73":"tankImposedMax()","f9b7fb56":"MarketboardListingBuyback(address,uint256)","f9b83323":"getNumberOfChecks()","f9b8659f":"detach(uint32,int256)","f9b87d40":"setKeys(uint32,bytes32,bytes32,uint32)","f9b8d639":"getMemberBonus(address)","f9b9a626":"getTotalWithdraws()","f9ba134d":"subtractAmount(address,uint256,uint256)","f9baa6ec":"freezingAgent(address)","f9bacc1c":"totalBonuses()","f9bb656b":"crowdSaleState()","f9bb84f5":"areWeekdaysOpen(uint256[],uint256[],uint256,uint256)","f9bbcc6d":"setMinVoteWeightK(uint256)","f9bcb4b1":"symbolLocked()","f9bd9338":"onFrozenAccount(address,bool)","f9be029f":"disableWhitelistAddress(address)","f9be437a":"UpdateTokenAddress(address)","f9befdef":"ownerSetGasLimit(uint256)","f9bfc71b":"mulUIntValue(bytes32,uint256)","f9bffc0f":"phID_()","f9c113cb":"ReadContent(string)","f9c12dda":"collectAll(uint8)","f9c1437e":"test5_searchAcrossNodes()","f9c1a197":"TransferEthToAddr(address,uint256)","f9c29e66":"hashOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes)","f9c38ebf":"APTest1()","f9c397f8":"VoteInOrganizationScheme()","f9c3a68e":"setminimumAmount(uint256)","f9c447a9":"PurchasedTokens(address,uint256)","f9c58926":"_emitJobOfferPosted(uint256,address,uint256,uint256,uint256)","f9c5e0aa":"updateAttribute(bytes32,bytes32)","f9c6046a":"setForDutchSale(uint256,uint256,uint256)","f9c638ea":"globalMin()","f9c71f79":"isEquipedAny3(address,uint256,uint256,uint256)","f9c78097":"betToken(address)","f9c809fe":"addTip(address,bytes32,uint256)","f9c811f1":"regWL(address,uint256)","f9c8dec3":"KYC_ROLE()","f9c926c1":"has(address,address)","f9c935cf":"discountValue5()","f9c9b9de":"ExperimentalToken()","f9cb1b48":"getTotalInvestment()","f9cb6d7a":"reservedTokensAreDistributed()","f9cbcef0":"setStages(uint32[],uint8[],uint32[])","f9cbec43":"transferLandToEstate(int256,int256,uint256)","f9cc0605":"getAvailable()","f9cc2e66":"setPlatformFeePer10000(uint256)","f9cc6fce":"TestIOTACoin()","f9cd3ceb":"oracleFee()","f9cdbc4e":"paySmartContract(bytes32,uint256[])","f9ce67dd":"compareToIgnoreCase(string,string)","f9ce733b":"Pets()","f9ce7813":"transfer(address,address,uint256,address)","f9cee7b5":"totalScammedQuantity()","f9d09126":"updateTopicAssetClass(bytes15,bytes15)","f9d0fed4":"allowanceProvider()","f9d13bf0":"validate(address[4],address,uint256[12],uint256,uint256)","f9d176b4":"setManualWithdraw(bool)","f9d20590":"distributeFinancialAward(bytes12,int256,bytes12)","f9d38868":"exy()","f9d3b4e9":"obol()","f9d429ee":"NO_BATTLE_LOG()","f9d49797":"whitelistMaxWei(address)","f9d53ac8":"addPaper(address)","f9d593c8":"setNAVAdmin(address,address)","f9d5b4bb":"LogContribution(address,uint256,uint256,uint8,uint8)","f9d5e08b":"adminUsrCount()","f9d630a1":"TUI_ALLOCATION()","f9d6de48":"WALLET_LB_COMMUNITY()","f9d70200":"buyCrystal(uint256,uint256)","f9d75f25":"editDailyLimit(uint256)","f9d7f0fc":"CSES2()","f9d80dcd":"getInstanceImplementation(bytes32)","f9d8241c":"renterExists(address)","f9dbe5e9":"_updateStage(uint256,uint256)","f9dc0793":"getCustomerBankName(string)","f9dc5d43":"getAllPayment(uint256)","f9dca989":"becomeOwner()","f9dcef27":"cityPoolCutPercentage()","f9df65eb":"nullified()","f9df6c33":"calculateTokensAmount(uint256,bool)","f9df816a":"changeWhitelistPrivateStatuses(address[],bool)","f9dfa4a3":"setMaximumEtherToAccept(uint256)","f9dfb361":"preSaleStartBlock()","f9dfcfcc":"transferContract(address,address,address)","f9dfd0a5":"Token(address,string,string,uint8,uint256)","f9dfea54":"relockGroup(uint256)","f9dfecb9":"preICOTokens(uint256,uint256)","f9e0093d":"multiWithdraw(address[])","f9e05ed9":"sha(uint128)","f9e13de4":"doMigration(uint256,uint256)","f9e19fa5":"resetState()","f9e1ceda":"getBalancePercentRate()","f9e24dc2":"balanceOfMineral()","f9e27106":"investmentEntryCost()","f9e37733":"_createUnicorn(address)","f9e3c1e9":"setNextAddr(address)","f9e40a21":"allWon()","f9e4fb34":"fundTransferIn(address,address,uint256)","f9e51b1d":"withdraw(uint128,string,uint32)","f9e54282":"dropUsername(bytes32)","f9e68952":"createDrone()","f9e73764":"airdropExecute(address,address[],uint256)","f9e84395":"unexempt(address)","f9e856ae":"oldE4RecycleBin()","f9e8ad7c":"isPreIcoStage()","f9e9d34a":"getUserRefBalance(address,address)","f9ea3a18":"getHTLCSpendingData(uint256,int256,bytes32)","f9ea8839":"AlphaMarketCoinExchanger(address[],address)","f9eab09f":"setChickenHunt(address)","f9eb4ee2":"APPROVAL(address,address)","f9eba935":"debit(string,uint256)","f9ebdc8b":"isConfirmed(bytes32,address,address)","f9ec2edb":"startNewBoss()","f9eec610":"next(string,string,string,string,string,string)","f9eee901":"setClaimTreshold(uint256)","f9ef04be":"free(address,bytes32,uint256)","f9ef2c7d":"HTC()","f9ef33ff":"walletOEM()","f9ef66f5":"getRoundWinnings(address,uint256)","f9f03556":"ERC20(uint256,string,string)","f9f0507f":"timeLockedStart()","f9f14f6a":"library14function()","f9f16ef2":"numberOfTokens()","f9f20540":"setInvestTokenLimit(uint256)","f9f22d6c":"createNamespace(string,address)","f9f286f9":"setMultisigMain(address)","f9f2c161":"setGod(address)","f9f2c93c":"santaClaus()","f9f2ecb6":"getExtendAddr(address)","f9f39a9c":"initialize_bannable(address)","f9f411d8":"userTokens(address,uint256)","f9f447eb":"getCallDataHash(bytes32)","f9f53be0":"ChangeAmountPrice(uint256)","f9f5e8c8":"changeToCoin(address,address,uint256)","f9f71423":"increasePlayersGooProduction(uint256)","f9f73135":"get_heap(uint256)","f9f7d9de":"TOTAL_PERCRENTS()","f9f81a73":"setAccountCoords(string)","f9f86baf":"airdrop(address[],uint256[],uint8)","f9f8b586":"JMToken()","f9f8bdb7":"currentRate()","f9f8f895":"switchOn()","f9f90a60":"durationInBlocks()","f9f92be4":"blacklist(address)","f9f94bc6":"bioUnlock(bytes32,uint8,bytes32,bytes32)","f9fae4f7":"TOKEN_CREATION_CAP()","f9fafb59":"LogBidFinal(address,uint256,uint256,uint256)","f9fb12ad":"TestXRPCoin()","f9fb3c95":"transferBonus(address,uint256)","f9fb452f":"productID()","f9fbd554":"test(string)","f9fc0d07":"processRewards()","f9fc4816":"withdrawAmountETH(uint256)","f9fd41d8":"setRevolution(address)","f9fd5250":"DOW_MON()","f9fef3b3":"withMod(uint256)","f9ff1378":"solicitaDevolucao()","f9ffabca":"NewAdmin(address,address)","fa003b2e":"SCCAIToken(address,address)","fa006d87":"newPlaySeed(address)","fa009e36":"xxx7Coin()","fa0196eb":"OsherCoinAward(uint256)","fa01dc06":"revoked(address)","fa01dd3c":"BRTToken()","fa02955f":"registerMeOnEther(string)","fa02c4b7":"approveTransfer(address,uint256)","fa02dcc1":"TankWithdrawAll()","fa030ef1":"baba()","fa03446c":"tokensFromEther()","fa036370":"Athereum()","fa043b0f":"checkSig(bytes32,bytes32,uint8,bytes32,bytes32,address)","fa044862":"requireOk(bytes1)","fa048a18":"addHpbNode(address,bytes32,bytes32)","fa05064e":"setBountyDistributionContract(address)","fa058795":"logAdr(address)","fa061d48":"isReadyToSynthesize(uint256)","fa066fbd":"AccountGasLimitReached()","fa097028":"_burnRemainingTokens()","fa09cb30":"PatCoin()","fa09e630":"withdrawAll(address)","fa0a6cfe":"AFEBToken()","fa0a8f26":"calculateNextPrice(uint256,uint8)","fa0b5e55":"registerUser(address,uint256)","fa0b6211":"hasRoundEnded()","fa0bad28":"onholdBalance()","fa0bc8e1":"ownerOfSocialIdentity(uint256,uint256)","fa0c3034":"GenoPay()","fa0c498e":"refundJobSponsorships(uint256,uint256)","fa0c76c5":"calcUserDivsAvailable(address)","fa0cdc81":"getManifestById(bytes32)","fa0d5b52":"BerryLakeCoin()","fa0d80fc":"icoDenominatorPrice()","fa1026dd":"getCommitment(address)","fa107a41":"Cajutel(uint256,string,string,address,address,address,uint256,uint256)","fa113488":"setCMTForGas(uint256)","fa113773":"BlackSeaCoin()","fa1152f3":"MoregainCoin(uint256,string,string)","fa11c471":"holdsValidLicense(address)","fa12d782":"openGame()","fa130b68":"developer_edit_text_price(string)","fa133fdb":"massTransferTokens(address[],uint256)","fa13af97":"InServiceToken()","fa140e3d":"MitToken()","fa1456a9":"transferKROContractOwnership(address,string)","fa147e5e":"remainingTokensAndCost()","fa14df6b":"getChangeRecipientFee()","fa169ec8":"getHashDigest(string)","fa16ab6c":"Platform()","fa16c53b":"DiscrashCredit()","fa17a19d":"forceStand()","fa188644":"whitelist5Addresses(address[5])","fa188df2":"addMinter(address,address)","fa1896f4":"getOneTokenInWei()","fa18dd2b":"isSetupMode()","fa193a6e":"Voter()","fa198656":"roundingPercent(uint256,uint256,uint256)","fa1a5f59":"soldAmount()","fa1acb5c":"_startTime()","fa1ad09e":"fundTransferOut(address,address,uint256)","fa1b3eb8":"gamesOf(address)","fa1ba1e1":"burn(uint256,bool,uint256,uint256)","fa1bde89":"test_set_get_OraclizeCallback()","fa1c594e":"disableRegistryUpdate(bool)","fa1ca37e":"_transferCeo(address)","fa1cee57":"approveKNCRateRange(uint256)","fa1d9cf8":"getZoneTeller(bytes2,bytes16)","fa1db1e7":"SendResult(uint64,bytes32,bytes32)","fa1e4fcb":"holdoverBalance()","fa1eae3c":"newSchellingRound(bool)","fa1f919f":"pre_enddate()","fa2073ad":"getAnswerCounts()","fa208cc5":"KickTheCoin()","fa20e77d":"burntTokens()","fa2299ee":"soldSupply()","fa23023b":"lockSales()","fa233620":"RENTALTOKEN(uint256,string,string)","fa24e7a0":"xyjtoken(uint256,string,string)","fa255179":"getCheckResultMessage()","fa25fd57":"settleOrder(uint256,uint256)","fa26db7e":"setMinAllowedReservingPercentage(uint256)","fa26fe32":"delivery(string)","fa27e070":"removeProxyForSender(address,address)","fa28a6b6":"checkTrainingPrice(uint256,bool)","fa28ba0d":"validateReleaseLockfileURI(string)","fa29141b":"minSellAmount()","fa292c44":"BitcoinPower()","fa2a68d2":"QToken()","fa2a8997":"isReleased()","fa2a9be6":"createPoll(bytes,uint16,uint256,uint256)","fa2acd87":"G(uint64[16],uint256,uint256,uint256,uint256,uint64,uint64)","fa2af9da":"platformWallet()","fa2b579d":"at_percentile(uint256)","fa2b76e2":"tokenReserved2()","fa2c7f9b":"getLender(uint256)","fa2cac28":"rejectEthTransactionRequest()","fa2cc19e":"calculate_price(uint256,uint256)","fa2d7efa":"AdlasToken()","fa2d84b6":"addBlacklistAddress(address,address)","fa2dedec":"SATS_TO_TOKENS()","fa2e9db8":"sunsetWithdrawDate()","fa2f29b6":"claimEOSclassicFor(address)","fa2f3e9a":"numAccountsInfo()","fa2f7a8f":"renounceContract()","fa307fcb":"sendMultipleMessages(address[],string,string,uint256)","fa309571":"delegateGetTokens(address,uint256)","fa30b251":"buyTicket(string)","fa314c67":"newAtomFee()","fa31b371":"deletePublicKey(bytes32,address)","fa31e684":"releaseTokensSaleCount()","fa3276bc":"isModifiedInRound(address,address,uint64)","fa332152":"giftSendIndex()","fa33bcf3":"isInList(address)","fa34b345":"walletsDelegate()","fa34b37b":"bonusPreviousOwner(uint256,uint256,uint256)","fa34da5e":"getTarget(bytes32,bytes4)","fa352dec":"tokensToEthereum_(uint256,uint256)","fa3559f7":"attestToContract(uint256,bool,string)","fa355d1c":"_distributeFloatWalletToken(uint256)","fa358c24":"refundPaused()","fa35a310":"Contributed(address,uint256,uint256)","fa35aa94":"deathData_f10()","fa36316e":"setFiatPerEthRate(uint256)","fa368e6d":"isWMSale()","fa369e66":"batchTransfer(bytes32[])","fa3754ca":"getCurrentDiscountRate()","fa37668f":"createContract(bytes32,bytes20,bytes20,uint256,uint256,uint256)","fa391c64":"isCompleted()","fa3a0f78":"getCreateMarketController()","fa3a3a7e":"DemoPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256)","fa3b8f2c":"AdvertisementPayout(uint256)","fa3c6320":"intercrypto_recover()","fa3c8251":"TimeDecayingTokenEnvironment(uint256)","fa3c9bbc":"getHostRoomLists(address,address)","fa3e9b45":"setCreditDao(address)","fa3ed04d":"getDArbitraryData(bytes32,bytes)","fa3f1e99":"testBlobStoreRegistered()","fa3f5acf":"sendMsg(string,string)","fa3f998c":"redeem_deposit(uint256)","fa3fa196":"transferCreator(address)","fa404e34":"revokePoolRole(address)","fa407c19":"NRCToken()","fa40ce34":"addAllowedContracts(address[])","fa4125f7":"activateNextRound(uint256)","fa41fd32":"lastCallstopPreICO()","fa42f3e5":"map_address(string)","fa448f7a":"_handleAffiliate(address,uint256,uint256,uint256)","fa45858e":"changeSellPOPPrice(uint256,uint256)","fa45aa00":"executeWithdrawal()","fa461f33":"setValueStep2(uint256)","fa462e95":"mintStepPrice()","fa46b8b4":"SellRateChanged(uint256,uint256)","fa472bad":"SkillCoinTest()","fa47c564":"confirmERC20(bytes32)","fa48b4bf":"mintEtherBro()","fa48dfcd":"setLockup_jiedians(address,uint256,uint256)","fa49841d":"ownerAdmin()","fa49a13a":"Vulgus()","fa4a2e36":"ShyneTokens(uint256,string,string)","fa4a80f1":"Matrioska()","fa4ac15d":"withdrawAffVault(uint256,string)","fa4bb165":"setRoundNumber(uint256)","fa4c4271":"reClaimIFS(address)","fa4c5dc0":"addMessage(string,uint8,uint8,uint8)","fa4d0c3c":"lockDeadline()","fa4d300d":"ICOSplit()","fa4d3698":"setOwners(address[])","fa4de094":"KPOP_ARENA_CONTRACT_ADDRESS()","fa4e5e5a":"notify(uint8,string,string)","fa4f34a0":"GetChallengeTimings(uint256)","fa4f5511":"campaignUrl()","fa4f96c4":"ActivatedEvent(bool,bool)","fa4fb369":"addPreSaleTokens(address,uint256)","fa4feb65":"icoTokens()","fa502cf7":"addBidToStack()","fa5064be":"submitProposal(uint256,uint256,uint256,uint8,uint64,string)","fa5083fe":"getMaximumBetRate()","fa508d3e":"dnnToken()","fa509eda":"nextonetogetpaid()","fa509ff7":"collected_eth()","fa50b335":"IS_TIER_CONTRACT_MAGIC_NUMBER()","fa518054":"_addToWhitelist(address)","fa51a2bf":"setSupplyLock(bool)","fa51ae86":"RATE_CORNERSTONE()","fa5201e1":"LuckToken(uint256,string,string)","fa5252e4":"pbWinner()","fa52bcb3":"ICSTCrowSale()","fa52c7d8":"validators(address)","fa52caf6":"HECoin(address)","fa53bb1b":"setauctionother(uint256)","fa544161":"getOwner(address)","fa550659":"approvalForAll()","fa552d8e":"withdrawSale1()","fa556996":"TimeClock(string,uint256,uint256,uint256,uint256)","fa55afe2":"setABIHashForMod(bytes32,bytes)","fa55f4d4":"modifyEligibility(uint256)","fa566ddd":"doAllowance(address,address)","fa56780d":"getPurseContributions(uint256,uint256)","fa57e2ab":"resolved(bytes32,bytes32,uint256)","fa57ff82":"ownerSetJackpotToken(address,uint256,uint256,uint256)","fa58f510":"getFeeMake(uint256)","fa5919a8":"DAOSecurity(address,address,bytes32,uint256,uint256,uint128)","fa59d199":"removeHash(string)","fa5a1db6":"save(uint256,uint256,uint256)","fa5b344e":"assignSubMember(address,uint256)","fa5ba0f9":"stepPrice()","fa5bbcd2":"crowdsaleCreators(address)","fa5bc660":"offerDiscipleVend(uint256,uint256)","fa5be8f8":"setBonus(uint256,uint256,uint256)","fa5bfc1e":"claimedRewardHook(uint256,address,address,uint256)","fa5c0c70":"getSaleOrder(uint256)","fa5cd179":"join_address(uint256)","fa5cdc2b":"OLTestSynatax()","fa5da441":"incrementedIndexOfName(string)","fa5e288c":"ABBC()","fa5ed321":"_pointToResolverAndResolve(bytes32,address)","fa5ef276":"getVotedData(address,uint256,address)","fa5f090b":"SmartIdeaTokenERC20(uint256,string,string)","fa5f2d80":"AOG(address,address,address,address,address,address,address)","fa607442":"timeOneSession()","fa608890":"withdrawRemainingRewards(uint256)","fa60a16e":"serviceAddressOf(address,uint256)","fa60fb0b":"getTxRoot(uint256)","fa6140dd":"weekPotLeader()","fa6171e4":"superMint(address,uint256)","fa62a1ff":"revokeAdminStatus(address)","fa640427":"setPermissionsProvider(address)","fa64dffa":"getDestQty(address,address,uint256,uint256)","fa65d336":"hasFreePlaces()","fa6669b7":"updateAccountData(uint256,uint16,bytes32,uint256,uint16,bytes32)","fa667907":"changeOwnerSharePerThousandForBuying(uint256)","fa66be4e":"countryLengthOf()","fa66e143":"employeeSignsToESOP()","fa671e5f":"deathData_v19()","fa671f6b":"validPurchaseIco(uint256)","fa6799f2":"revokeVesting(address,uint256)","fa67ae5a":"setBlockDelay(uint256)","fa67ba6f":"getSecondsTimeLockedByTx(uint256)","fa6878a7":"setBAB(bytes32,address,bytes)","fa68829a":"UnKoin()","fa68b4ce":"lookupISO3116_1_alpha_3(bytes)","fa691a26":"totalRoundsPassed()","fa695dd7":"createItem(string,uint256,uint256,bool,bool,string,uint256)","fa696d98":"ART_FOUNDATION_ADDRESS()","fa69ede9":"setNewRatesBase(uint256)","fa6a0712":"setOwnerPrice(uint128)","fa6ab63b":"getTokenSum()","fa6ac98e":"test_0_testBasicTxProposal()","fa6ad04c":"PRCT_BOUNTY()","fa6b129d":"tokenGenerationEvent(address)","fa6b535d":"deleteContact(bytes32,address)","fa6bdbf8":"_transfer(address,address,uint256,bytes)","fa6d373c":"LeaderHash()","fa6d8f1f":"callAndReward_1(string,string,uint256)","fa6e01a2":"ARTCToken()","fa6e5776":"haveExtension(string)","fa6ec547":"registeredAddress(address,bool)","fa6f3522":"EthimalFounderEggs()","fa6f3936":"isModerator(address)","fa6fc037":"prepareToBreed(uint256,bool,uint256,bool,uint256)","fa6fcc50":"_startBetBlock()","fa70466e":"getMonsters(uint16)","fa70f6da":"STRATToken()","fa712f71":"isBattleboardLive(uint16)","fa713023":"IEICrowdsale(uint256,uint256,uint256)","fa725ea3":"requireValidAddress(address)","fa7299f7":"getOwnerVirusLength(address)","fa729b5b":"CNY_Omnidollar()","fa72c53e":"providerFeePerEth()","fa73af0b":"GRANT_BATCH_SIZE()","fa73cb37":"ptxToken()","fa73f074":"useAddr()","fa76b253":"getAddressForAccount(string)","fa779bd6":"checkBalanceTier(address)","fa77c074":"shaThree(string)","fa785263":"checkRemoveOwnerArgs(uint256,uint256,uint256)","fa785928":"_revealBid(bytes32,address,uint256,address,bytes32,bytes32,uint256,uint256)","fa7860da":"etherHardCap()","fa78b172":"drawSecondaryWinners()","fa796124":"BitLumensCrowdsale(address,address)","fa796fa1":"CryptoZoo(address,address,address)","fa7a6cd3":"developer_string_symbol(string)","fa7ae620":"cryptaurReserveFund()","fa7af6fe":"investInternal(address,address)","fa7c31af":"withdrawCommunity(uint256)","fa7ca492":"preICOStats()","fa7d68f1":"getAccountInfo(uint256,uint256)","fa7e4eaa":"BELIBELA()","fa7e8f7c":"EtradeMarketsCoin()","fa7f6b96":"tokensLocked(address,uint256)","fa80918b":"computeNodeId(bytes,bytes)","fa81b200":"masterOfCeremony()","fa825185":"getChargers()","fa82e9fc":"organizer1()","fa83c01b":"setStopSendWebGift(bool)","fa848fb0":"startDayOneTime()","fa849243":"targetDiscountValue1()","fa85d33e":"istransferAllowed()","fa878e8f":"TOKEN_RATE_10_PERCENT_BONUS()","fa885329":"setTableSize(uint256)","fa885868":"addPreminer(address,address,uint256,uint256)","fa888c74":"callIt(uint256)","fa89401a":"refund(address)","fa894c08":"balanceWosPoolForSecondStage()","fa8a3c1c":"rateC()","fa8a975d":"forcedTransferAll(address,address)","fa8ad6b9":"unsetIsRentByAtom(uint256)","fa8b72ff":"setBountyTokensWallet(address)","fa8dc33a":"checkRecordExists(bytes)","fa8ec0b2":"_transfer(address,address,uint256,string,uint256)","fa8edab6":"checkBalance(address,address,uint256,uint256)","fa8fc08d":"GxCoin(address)","fa8fd2b5":"LockRequestable()","fa90693b":"isBlockRedeemed(uint256)","fa912743":"feesStrategy()","fa922e66":"pickaxe()","fa923d10":"FutureCoin()","fa92fb6e":"IssueRejected(uint256)","fa93019c":"getBlocks(uint8,uint8)","fa93185f":"LockedDayRemoved(address,uint256,uint256)","fa93f883":"getMinute(uint256)","fa967415":"nextUpgradeMaster()","fa968eea":"minBetAmount()","fa96a49e":"totalSupplyUpgraded()","fa9768c9":"getOnMintAmountValue()","fa9789cf":"trainKitty(uint256)","fa984da8":"SujiToken()","fa985a2f":"p_update_mNewPlotDevPercent(uint256)","fa9907ad":"pay500Winners(uint256)","fa99d7ae":"enterDungeon(uint256[4],uint32)","fa9a4c35":"getPOOL_edit_21()","fa9acb05":"addressInArray(address,address)","fa9aecfb":"isUnowned(uint256)","fa9af30f":"getGoldXchgRate()","fa9b44b7":"PendingETHs(address[])","fa9ba8b4":"FunFaceToken()","fa9ce7e7":"moveTokensFromStockToExchange(uint256)","fa9d2352":"hasRequiredStateChanges()","fa9df423":"setShp(address)","fa9e6f11":"Exafire()","fa9e82cf":"uploadStartlist(uint256[])","fa9f117f":"setNextRoundMaxDonors(uint256)","fa9f245c":"CappedToken(uint256)","fa9fd8b2":"incremental(uint256,uint256)","faa06c06":"GetCityName(address)","faa0a264":"burnToken()","faa10f43":"require(bool)","faa1a8ff":"getOwnedBot(address,uint256)","faa3981a":"boolMemoryArray(bool)","faa458f4":"submittedHashes(bytes32,uint256,uint256)","faa51485":"isValidTraderAddress(address)","faa5369d":"getBorrowingItem(uint256)","faa5c564":"register(uint256,uint256,uint256)","faa5ca93":"erc20Buy(address,uint256,string,string)","faa5d0ea":"updAmountBonusEnabled(bool)","faa5e124":"ref_percent()","faa5e74a":"TokenPurchaseWithGuarantee(address,address,uint256,uint256)","faa62d3f":"setPercentageToLock(uint256)","faa679bf":"TraceToken()","faa7fc61":"bustRange()","faaa4d22":"distributePCY(address[],uint256,uint256)","faaa58da":"RemovePauser(address)","faaad90f":"getBlocksUntilNextRound()","faaad91d":"convertToPrimordial(uint256)","faab806f":"emergencyStopSale(address)","faab9d39":"setRegistrar(address)","faabc195":"updateContract(uint256,address,uint256)","faac90ec":"StorageFactory()","faacf0fd":"toChar(bytes1)","faad4a49":"setDividends(uint256,uint256)","faad6eb5":"updateAgent(address,bool)","faadb14a":"getCustomerTxPaymentKWh(address,bytes32)","faae4c17":"usernamesToAddresses(bytes32)","faaebd29":"Fight_Results(uint256,address,address,uint128,uint128,uint32,uint256,uint32,uint256,uint8)","faaf027b":"getAddressTokenSaleId(address,address)","faaf1921":"updateEthToCentsRateCycleStarted()","faaf71e6":"checkSoftCapOk()","faafa08f":"CatICO(address)","fab0568c":"GIFTToken(uint256,string,uint8,string)","fab14b36":"saleBalance()","fab18075":"numLots()","fab2c469":"getSlots()","fab2cb36":"totalSharesIssued()","fab2e425":"GAMESPLAYED()","fab2f86b":"stopVoting()","fab37154":"setMintAddress(address)","fab3be9a":"WETCToken()","fab3ebb1":"NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID()","fab4087a":"parse(bytes)","fab425e7":"external_to_internal_block_number(uint256)","fab43cb1":"getPongAddress()","fab4969f":"amountRaisedPhase()","fab4cb39":"getWarrantyPrice(string,uint256,uint256,uint256)","fab55a49":"addr_forge()","fab57a21":"truebitAddress()","fab5ccb1":"submitBlock(bytes32,bytes)","fab67bb6":"hasNotEnded()","fab825c6":"setCanvasName(uint32,string)","fab88d39":"STS(uint256,string,uint8,string)","fab8cbe4":"splitTokensBeforeDistribution(uint256)","fab93805":"ballotLog(bytes32[2])","fab9b243":"isUpgradable(address,address,string)","fab9caaf":"JungleScratch(address)","fab9f0c4":"DigiWillToken()","faba1f16":"_createPow(string,address,uint256,uint256,uint256,uint256)","fabacf0d":"Yetxkd1601()","fabae696":"updatefxFee(uint256)","fabb25fa":"x_constructor(address)","fabb7952":"setPaintingName(uint256,string)","fabbdc5b":"COIN_COST_ICO_TIER_2()","fabc1cbc":"unpause(uint256)","fabcc880":"update(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256,uint256[3])","fabde80c":"coinBalance(address)","fabe1416":"canClaimToken()","fabec44a":"getCurrentVersion()","fabee62d":"taxTo(address)","fabf00c3":"NewGrant(address,address,uint256)","fabf5ea5":"maxInvestedLimit()","fabf657a":"approveAddress(address)","fabfbefb":"lastPayoutIndex()","fac08874":"BPTestCoin()","fac20ab8":"getGameWinner(uint256)","fac2548b":"updateMember(address,uint256,bool,string)","fac28349":"setInvite(address,uint256,uint256)","fac2b5f8":"setEplay(address)","fac333ac":"ids(uint256)","fac34ff6":"throwFoo()","fac3a4db":"changeWithdrawableNetfRe(uint256)","fac3c1f4":"setOracleName(address,string)","fac416ab":"PriceThreeEnable()","fac50e4c":"StgTwobonusEnds()","fac5235b":"teamTokensAllocated()","fac52bfd":"my_name()","fac57fc9":"hasUpgraded(address)","fac5bb92":"getPreRelease(bytes32)","fac5fbc7":"ContractDisabled(uint256)","fac647cc":"testLongerJson()","fac65256":"wavesTokens()","fac66f01":"getConditions(uint256,uint256)","fac67cf6":"updateVIPRank(address)","fac6a8a2":"withdrawExchangesToken()","fac6fe0c":"level_6_percent()","fac78d83":"tierModifiable(uint256)","fac7abe3":"latestAuctionIndices(address,address)","fac7b20a":"maxCapTokenTotal()","fac8a800":"isTeller(address)","fac952c5":"getLastWithdraw()","fac97122":"ownerSetJackpotAddress(address)","fac9d2c7":"Blockkonnect()","faca7cfa":"prevBalance()","facaa838":"IsEscrowActive()","facb2195":"setIntF1(int256)","facbf93b":"totalBlocks()","facc7905":"unLockTime()","facce5bb":"wingsTokenRewards()","facd0934":"BONUS_250_500()","facd743b":"isValidator(address)","face030b":"SpinTheWheel(address)","face873f":"getAllActiveSales()","face9e8e":"hash_sha256(string,uint256)","facef32a":"IGI()","facf55e6":"getMyClones()","fad09ab3":"closeProvider(address)","fad15673":"UmkaToken(string,string,uint8,uint256)","fad18e7b":"registerNameXaddrFromDapp(address,bytes32,address,bool,uint8)","fad239ac":"PermTokenTest()","fad356f8":"testTransferFromSelf()","fad35818":"calcInviterBenefit(uint256)","fad3f8f7":"maxPreSale()","fad4b99a":"updateChannelMinimum(address,uint256)","fad4e1f2":"getIDMapping(uint256,uint256)","fad5a2af":"isClosedAndValid()","fad6049b":"_transferFrom(uint256,address,uint256)","fad60615":"roundProfitByAddr(address,uint256)","fad774ee":"BONUS_LEVEL_2()","fad7ed8c":"_A_tokenSaleCompleted()","fad8200e":"userToNumCelebs(address)","fad88be7":"VOISE()","fad8b32a":"revokeOperator(address)","fad9100c":"FOMOed()","fad992ea":"claimINRDividends()","fad9aba3":"dust()","fad9bf9e":"storeBlockWithFeeAndRecipient(bytes,int256,int256,bytes,int256,int256)","fada2c18":"transferBond(uint256)","fada4b76":"quater3()","fada5da1":"collectEth()","fadc0700":"InitiateMakes()","fadc51cf":"isAlpha(bytes1)","fadc554b":"updateNonClosingBalanceProof(uint256,address,address,bytes32,uint256,bytes32,bytes,bytes)","fadcd861":"createMarriage(string,string,string,string)","fadcf13c":"startBounty()","fadd3235":"gameEndBlock()","fadda208":"getMemberAdresse(uint256)","fadeb59c":"getListingDB(uint8)","fadf4cb2":"batchAssignTokens(address[],uint256[],bool[])","fadf4f3b":"GECToken(address,uint256)","fadf617b":"reveal(int128,string)","fadf87b1":"testGetBitsSuccess()","fae14192":"changeFeePercentage(uint256)","fae17e21":"createBid(uint256,address,address,address,uint256,uint256)","fae21f0a":"initBank()","fae24454":"removeFromManagementWhitelist(address)","fae25444":"getNumberOfOffers()","fae29ee8":"setWebInfo(string,string)","fae2dd4b":"myName()","fae429af":"NinjaCoinNC()","fae4a213":"buyWithAddressAndFunction(address,bytes4)","fae53222":"addPlayerGeneral(address,uint32,uint32,uint8)","fae59753":"transferOwnershipMessage(address)","fae6edcf":"getI2()","fae72303":"totalWeiRaisedDuringPhase3()","fae73549":"Burnt_Token()","fae8529a":"maxprice()","fae860db":"transferToLockedBalance(address,uint256,uint256,uint256,uint256,uint256,uint256)","fae8c29e":"setPromoPause()","fae8f9a2":"setInitialParent(int256,int256,int256,int256,int256,int256)","fae92612":"setMarketAddress(address)","fae95a71":"participationPresaleHistory(address)","fae9c6b3":"preICOTokenRemaining()","fae9d06d":"calculateTxFee(uint256,address)","faea1878":"cooRemoveCro(address)","faea624c":"VestTokens(address,uint256,uint256,uint256,bool,string,uint256)","faea9129":"Syndicate()","faed08a9":"reLoadXname(uint256)","faed1922":"purchaseWhaleCard()","faed77ab":"wipeAndFree(address,bytes32,uint256,uint256)","faed86ab":"strConcats(string,string,string,string)","faede6a1":"Y2_lockedTokenAmount()","faee13b9":"set(int8)","faee4402":"donateToWhale(uint256)","faee4a10":"initialBankroll()","faef2ad2":"getCategoryHash(address)","faeff650":"phase1TokenPriceInEth()","faf0952b":"testThrowRestartNotOwner()","faf21148":"ValoremICO()","faf236c7":"emitTokensFor(address,uint256,uint256,uint256)","faf27bca":"greeter(string)","faf3d174":"upgradeStart(address)","faf42125":"setTokenURIAffixes(string,string)","faf5115f":"setBank(address,address)","faf81ba5":"applyBonus(uint256,uint256)","faf87b8a":"payoutEF()","faf880ad":"SoftcapReached(address,uint256)","faf924cf":"proof()","faf95e3d":"PayForServiceETHEvent(address,uint256)","faf9859c":"NIU(uint256,string,uint8,string)","faf9b5cf":"mintSendTokens()","faf9f330":"accrueTeamTokens(address,address,uint256)","fafa4c82":"defaultTransferGas()","fafa8e1a":"removeDat(string)","fafaacfa":"hasConfirmed(bytes32,address,uint256)","fafb2330":"setPayout(uint256,uint256)","fafb3c7a":"giftCar(address,uint256,bool)","fafb76dd":"getOffsetIndex()","fafb9334":"roll_normal(address,uint256,uint256,bytes32,bytes32,bytes,bytes32,uint256)","fafbb62b":"create(string,string,uint8,uint256,address,string,address,address)","fafbb9a3":"getNextPayoutTime()","fafbcc08":"IBNZDEVELOPERSERC20_Crowdsale()","fafc56d9":"setStepTwoRate(uint256)","fafcdc34":"dist(address)","fafd2efb":"cashoutable(address,address)","fafd4bba":"RESERVED_TOKENS_FOR_CRYPTO_EXCHANGES()","fafd6bcb":"isConfirmedBy(bytes,address)","fafdb3af":"PlayerBalance(uint8,uint256,uint256)","fafe029f":"getWtotalTransCnt(uint8)","fafe0902":"gift_ClaimTINAmotleyLine(uint256)","fafe805e":"BLOCK_PER_PHASE()","fafe8845":"StateChanged(uint256,uint8)","faff50a8":"rootNode()","faff660e":"isPrivate()","fb007107":"CanMint(bool)","fb00cc67":"search_winner_bid_address(uint8)","fb00fec6":"getStatusForRootHash(bytes32)","fb0101c4":"getUserSpaceIds(uint256)","fb01badd":"companyShares()","fb01f4b1":"developerPrizeClaim()","fb02191c":"addRepo(bytes32,string)","fb03735e":"contractTokenReward()","fb03eaea":"getDisputeThresholdForFork()","fb048705":"itemOf(uint256)","fb04f22c":"secondReleaseDone()","fb054439":"canBearWith(uint256,uint256)","fb05594f":"STARTING_SHRIMP()","fb062a84":"offerOptionsToEmployeeOnlyExtra(address,uint32,uint32,uint32)","fb064161":"advisorsAllocation()","fb06603c":"modifyToken(address,uint256,string,string,string,string,bool)","fb070d0d":"CatFarmer()","fb0720dc":"icoStartP1()","fb072d2a":"random(uint256,uint8)","fb07ac86":"realPriceOracle()","fb083fdc":"EtherDelta()","fb088558":"contributeWithoutVesting()","fb08937c":"tokenTransfer(address,address,address,uint256)","fb08f3a1":"whitelistRequired()","fb08fdaa":"replaceContract(address)","fb099c84":"newInvestor()","fb09b1ac":"testBalanceOfReflectsTransfer()","fb09c964":"getXQU()","fb09db11":"setActiveWhitelist()","fb0a0344":"mockBuy()","fb0a2e3c":"buyerDecimals()","fb0a3867":"updateClientAddress()","fb0a8c62":"addGenerator()","fb0b0220":"outFromPool(uint256)","fb0b02cd":"destroyBucket(bytes32)","fb0b6b6d":"confirmTransactionByMediator(uint256)","fb0c0782":"buy2(uint256)","fb0c1faa":"LearnX()","fb0cf7ab":"getStagePrice(uint8)","fb0d7e43":"initialBonus()","fb0f6f42":"s1(bytes1)","fb0f9363":"getAuctions(address)","fb0f97a8":"depositToken(address,address,uint256)","fb0fcd8c":"triggerRselfdestructRefund()","fb101581":"transferToCharity(address)","fb10b0d3":"currentMaximumSalePercentage()","fb114f57":"oraclize_query(uint256,string,string[3],uint256)","fb11613e":"getGamesByDay(uint256)","fb1161f1":"bountyCap()","fb1291c3":"getPixels(bytes32)","fb12ee85":"amountOfOpenRFQs()","fb13a707":"changeVestingWhitelister(address)","fb13bfae":"getFreezeInfo(address)","fb1478e5":"changeSaleEndBlock(uint256)","fb14cbca":"check(bytes32,uint256,address,uint32,uint32,bytes32[])","fb14f058":"addVestingAdmin(address)","fb15e737":"boolToBytes32(bool,bool)","fb1641d6":"rejectGame(address,uint256)","fb1669ca":"setBalance(uint256)","fb1684f9":"lockTextKey(string,uint256)","fb173712":"SetRate(address,address,uint256,uint256)","fb176b69":"paleyer1show(uint8,uint8,uint8,uint8,uint8)","fb17905f":"DemolishByCredits(uint256,uint256)","fb18962d":"setSoftwareTokensPercent(uint256)","fb1ace34":"notarize(bytes)","fb1ae783":"getWinnerTeam(uint256)","fb1c3461":"_calculatePercent(uint256,uint256)","fb1ce13a":"TestEOSCoin()","fb1ce2ea":"NotifyMe(address,uint256)","fb1d8201":"addClaim(uint32,string,string,bytes)","fb1d9eea":"transferFundsTokens(address,address,uint256)","fb1db11f":"updateEarlyParticipantWhitelist(address,address,uint256)","fb1de995":"solveTask(uint256,uint256,uint256,int256,uint256,int256)","fb1e3804":"FULL_TOKEN_AMOUNT()","fb1e61ca":"getRequest(bytes32)","fb1f41f9":"info_OwnerTINAmotleyLine(uint256)","fb1fad50":"halt(uint256)","fb1fdc2e":"lengthNotEqual(address[],uint256,string)","fb2004f2":"BCOExtendedToken(address,string,string,uint256,uint256)","fb20b70d":"setBonusDate2(uint256)","fb20d071":"registerVestingSchedule(address,address,uint256,uint256,uint256,uint256,uint256)","fb20d98f":"deleteEditor(address)","fb20dc80":"setPriceForVerification(uint256)","fb213549":"confirmApplication(address)","fb21364b":"allocate2ProjectToken()","fb214f4c":"presetGymTrainer()","fb218f5f":"storeData(string)","fb21eefd":"fwdData(address,bytes)","fb222d48":"extractVaultTokens(address,address)","fb236bba":"_deleteOffer(uint256)","fb237eb2":"isUserWhitelisted(address)","fb23bbb1":"BONUS_WINDOW_3_END_TIME()","fb241406":"RedPen()","fb25b62c":"LineToken()","fb2643c0":"DragonKing(address,address,uint8,uint8,uint8,uint16[],uint16[])","fb26c00f":"Treasury(address)","fb26c3f8":"minimumPresaleWeiDeposit()","fb26e2d8":"tgrStartBlock()","fb274654":"offerCollectibleForSaleToAddress(uint256,uint256,int256,uint256,address)","fb277a24":"testMintInvalid(int256)","fb27961c":"softCapAmount()","fb279ef3":"tip(uint256,address,uint256)","fb282a17":"distributeCallback(uint256,address[])","fb282f92":"solveGame(uint256,uint256)","fb283111":"setRunSwitch(bool)","fb2861ff":"MINTTIME()","fb2898e4":"startSaleDepo(uint256)","fb28be72":"SetupQPY(string,string,uint256,uint256,uint256,address,address,uint256)","fb293a34":"backGamePlayerCoinOwner()","fb29aa97":"getNumLoveItems()","fb2c95b6":"PlayX3()","fb2cb34e":"transferPaused()","fb2dfa45":"getKitties()","fb2e0078":"withdrawalFunds(bool)","fb2e3240":"setDOwnerFromClaim(bytes32,address)","fb2ee901":"getBattleFee()","fb2eff20":"PhoenixFund()","fb2f3a8a":"MAX_BOUNTY_SUPPLY()","fb2f5064":"getPendingTokens(address)","fb2fbf49":"registerEOSAddress(string)","fb305569":"UbiqIssued()","fb30d070":"setNewAge(int256)","fb31a6cc":"executeOffer(address)","fb31b262":"VuePayTokenSale()","fb31ff37":"getFullRecord(bytes32)","fb3220fe":"addNodalblockData(string)","fb32ade3":"releaseLockedTokensFor(address)","fb32aedb":"voteB()","fb32f4f5":"ARK_FLAGGER_1_00()","fb3458d1":"extractElementsFromGene(uint256)","fb346eab":"totalSpent()","fb34d075":"channelCloseTimeout(uint64)","fb34fc6f":"WatchNextBlockReward()","fb350502":"calculateWalletTokens()","fb35370b":"transferDari(address,address,uint256)","fb3551ff":"getAgent(address)","fb357f74":"EBLLToken(address,uint256)","fb35a4ba":"KKToken(uint256,string,uint8,string)","fb35b4e4":"totalDeployments()","fb35d545":"unlockDate4()","fb3650c2":"grab(address[],uint256[])","fb368e8f":"getServiceName(bytes32)","fb36eba1":"createCard(address,uint16,uint16)","fb36fae4":"setJpycContactAddress(address)","fb37baa1":"whitelistUserForTransfers(address)","fb386216":"getSeatAddress(uint256)","fb38ec94":"founder3()","fb3918d7":"fillReserve()","fb3979f0":"updateAccountChartAgainstExistingEntity(address,uint256,uint256,uint256)","fb3a1fb2":"getReleaseDb()","fb3a3ff3":"HODLERAddress(address)","fb3ab12b":"setEndSale(uint256)","fb3b11af":"CWCCToken()","fb3ba9b3":"LogNewBlacklistedAddress(address,address)","fb3bc400":"myProfitsReceived()","fb3c0d70":"transferFromToken(address,address,address,uint256)","fb3d8b6e":"SiringClockAuction(address,address,uint256,uint256)","fb3dc0b3":"Leader(string,address,bytes32)","fb3ea59b":"acceptBatched(address[],bool)","fb3ed5c7":"airdropSupply()","fb3f1fd6":"nextroundblocksbeforenewpay()","fb3f4d29":"tokenApprove(address,address,uint256)","fb3f71c8":"addContract(address,uint256,string)","fb3fd6a1":"m_bIsLock()","fb402c26":"BuyTokensWithTokens(address,address,uint256,uint256)","fb40340d":"totalNormalTokenGenerated()","fb40c22a":"getAllCases()","fb4101c0":"reward(address,bytes32)","fb43b2a2":"approveBreeding(address,uint40)","fb4460dd":"getVoterStakes(address,uint256)","fb45d080":"pieBalanceOf(address)","fb468340":"getTotalMember()","fb46d4c5":"tweet(string)","fb46f492":"emissionMas(address[],uint256[],bytes32[],uint256[])","fb470a92":"FlukeCoins()","fb471ce5":"ERC223Transfer_enabled()","fb47a067":"_getRevisionBlockNumber(bytes20,uint256)","fb486c7b":"setGivenName(uint256,string)","fb48ca1d":"NewSuggestion(address,string,uint256)","fb48cf0e":"getVoter(uint256,uint32)","fb490695":"griefCost()","fb497ad2":"stage_1_TokensSold()","fb49dc4a":"AEFFTOKEN()","fb4a18a2":"setCrowdfundPayout(address,uint256)","fb4a6cde":"StarbaseEarlyPurchase()","fb4a86bc":"amountToBeRaised(bytes32)","fb4aa0a1":"fundReceiver()","fb4b7693":"sendSeedAndHash(string)","fb4cd8e2":"numBidders()","fb4ce0a9":"addAssetsOwner(address)","fb4da5b7":"pay(address,string)","fb4fbcd8":"getClaimTradingProceedsWaitTime()","fb4fd984":"requestPrize(bytes32,uint8,bytes32,bytes32)","fb50aec5":"getVendorApplicationStatus(string)","fb51a1ea":"read_total_purchased_today(address)","fb5209bf":"trickleUp(address)","fb524c32":"GetMaximumBet()","fb54047c":"getCustomExtraData(bytes32,uint256,bytes32)","fb557c8c":"PrideToken()","fb5589b4":"memCopy(uint256,uint256,uint256)","fb55d09d":"EtherGames()","fb55ed2a":"transferBlocToUser(address)","fb58674d":"Npole()","fb598f87":"createPost(uint256,uint256)","fb5a3282":"restFinish(address)","fb5b82d0":"setCollector(address)","fb5bd32b":"withdrawDevBalance()","fb5d5729":"getPongvalTransactional()","fb5d5999":"getDepositary_function_control()","fb5d7376":"step4()","fb5f39dd":"offlineSell(address,uint256)","fb5f8a13":"changeAddressKnight(address)","fb5fef42":"distributeALCToken()","fb6021ae":"ICO(string,string,uint8,uint256)","fb60938f":"getSumAmountOfSuccessfulDeals()","fb6139b5":"setServerFee(string,uint256)","fb6168ac":"BUY_ME()","fb621f14":"getSecurityTokenAddress(string)","fb6287d2":"setWalletAddresses(address,address,address)","fb62e083":"addWhiteListed(address)","fb632ef9":"transferrableBalanceOf(address)","fb63c4fc":"MESSAGE_PRICE()","fb63e4b1":"CEZA(uint256,string,string)","fb640453":"_getTotalBmcDaysAmount(uint256,uint256)","fb644a14":"Force(address)","fb64e072":"recordTransfer(address,address,uint256,uint256)","fb64e6b1":"icoAddr()","fb656067":"genesisCallerAddress()","fb659c3a":"addArticleItem(uint256,bytes)","fb65a1a3":"teamdistr(address,uint256)","fb65a3cb":"createCampaign(bytes32,uint256,address)","fb65e4b1":"Contribution()","fb674cf4":"emissionEnabled()","fb67983c":"fuckingClaim1(bytes,bytes)","fb687c24":"refundMethodABI()","fb68aa89":"hasInitCard1()","fb690dcc":"donated(address)","fb6a53d2":"multiBurn(uint256[])","fb6aeb42":"PRE_PUBLIC_LOCKUP_PERIOD()","fb6b18c0":"totalAirDrop()","fb6b4afd":"getWeaponModel(uint256)","fb6bbbce":"Crowdsale()","fb6c2b6f":"stopMarket(uint32)","fb6cae8e":"NetkillerToken(uint256,string,string,uint256)","fb6d0e8f":"pullShares(address)","fb6e155f":"availableVolume(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)","fb6e6558":"holderNumber(address)","fb6f6875":"deleteHotel(address)","fb6f71a3":"setCharity(address)","fb6f93a4":"setEthUsdRate(uint256)","fb6f9579":"Increase()","fb702ed1":"multiDistribute(uint256[])","fb7043ea":"isRefundPossible()","fb709d2e":"charities(uint256)","fb70f765":"foundationTokenSupply()","fb70ff96":"increasePieceCount(uint256)","fb71807f":"setUser(string,string,bytes32,uint256,uint256,uint256[],string,string)","fb719113":"deathData_f17()","fb7248cb":"playerGuess(address,int16)","fb72d24e":"shift_right(uint64,uint256)","fb72fdfe":"setTotalAllowed(address,uint256)","fb73a593":"modifyAllLevelCaps(uint256[],uint256)","fb741504":"IndividualCapCrowdsale(uint256,uint256)","fb7450be":"setBtcToken(address)","fb74da7e":"setTentativeWinningPayoutDistributionHash(bytes32)","fb74e6f7":"ADVISOR_STAKE_FOUR()","fb756f97":"Tokenomicx()","fb75b2c7":"rewardWallet()","fb77269e":"periodITO_period()","fb77378a":"SCOOP()","fb775b46":"giver()","fb77eae2":"startTimeSaleWithBonus()","fb78eb53":"Oncology()","fb78f85c":"mgrCount()","fb791b0b":"withdrawOrder(uint256)","fb794281":"gas_amount()","fb79e70f":"superNovaSupply()","fb7a2c1f":"addQuestion(string,uint256,uint256,string)","fb7a5f4f":"getEndBlock()","fb7a809c":"buyStageDataRecord(uint256,uint256,uint256,uint256,uint256,uint256)","fb7ae31e":"getCurrentRoundLeft()","fb7baf70":"initRegistMatch(uint8,uint8,uint8,uint256)","fb7c0a3f":"doBuy(uint256)","fb7cb850":"setMaxMerge(uint8)","fb7cf694":"buyPriceInWei()","fb7e54eb":"vcx()","fb7e7456":"endOfLockProjectToken()","fb7f21eb":"logo()","fb80d66f":"SQR_TOKEN_MULTIPLIER()","fb80fe9e":"test(uint256,address)","fb81299b":"setAllMarketsFinalized(bool)","fb815503":"withdrawWin()","fb81563b":"SpaceImpulseERC20()","fb84da41":"createSketch(string,string)","fb850fab":"newCampaign(uint32,uint256)","fb8621df":"push(bytes32,string,bytes)","fb8632b8":"availableEmission()","fb867165":"getSaveData(address)","fb86a404":"hardCap()","fb87bf7b":"LLX()","fb87d5ea":"TransactionRequest(address[4],address,uint256[11],uint256,bytes)","fb87eb0b":"setRefundsActive(bool)","fb88e7c1":"updateBestPromouter(address,uint256)","fb890a17":"YUPToken(address,address,address,address,address)","fb89fb28":"yield7Day()","fb8a5bf8":"H2OC()","fb8a5f1c":"createTransaction(address,uint256,bytes32,address,address)","fb8b0197":"claimReceivables(address[])","fb8bc297":"getInvestorPackPrice()","fb8c7420":"GetRandomNumber()","fb8dd3bb":"createEvent(bytes32,bytes32[],address,uint256,uint256,uint256,uint256)","fb8e4f1a":"BountyChanged(uint256)","fb8e7870":"buyKebabs()","fb8e82b4":"min(uint32,uint32)","fb9073eb":"reLoadXname(bytes32,uint256)","fb913d14":"sendByTranche(bytes32,address,uint256,bytes)","fb920ad1":"reclaimAndBurn(address,uint256)","fb92488b":"ChangePrice(uint256)","fb92507d":"daytime(uint256)","fb92e4fb":"_isGoodAddress(address)","fb932108":"distribute(address,uint256)","fb950559":"getAffiliation(address)","fb950a7f":"addGrantableAllocation(address,uint256,bool)","fb95adeb":"testFailBlockhashInsuffiecientFee()","fb95d9e7":"addConfigEntryAddr(bytes32,address)","fb961571":"ICOStartBlockChanged(uint256)","fb969b0a":"bootstrap()","fb9734fc":"confirmProposal(address,bytes32,uint256)","fb979ba2":"ROUND_1_PRESALE_BONUS()","fb97b61f":"lpAskVolume()","fb98a409":"skinContract()","fb990288":"_newInterest(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","fb9a2ce2":"getSellPosition(bytes32,uint256)","fb9a4595":"GitHubBounty()","fb9ab10b":"EpsToken()","fb9b4ab8":"createrAddress()","fb9ba033":"checkAllowedAddressForMinting(address,address)","fb9ba7bc":"removeAccreditedInvestor(address)","fb9bbeaf":"RaiSed()","fb9c7303":"completeInvestment()","fb9ca16b":"MarianaKey(uint256,string,uint8,string)","fb9cb15d":"numChipsMinted()","fb9dd851":"getGameInfoByIndex(uint256)","fb9ded46":"totalWeiRaisedDuringICO3()","fb9e1270":"investmentIdLastAttemptedToSettle()","fb9ec0a8":"assignPersiansToBattle(uint256)","fb9efcf0":"setCustodianForeign(address)","fba06849":"fipsPublishDataMulti(bytes20[],bytes)","fba07791":"fiatCost()","fba0aa5b":"txFeeSentInWei()","fba0ce5e":"setLinkedIn(string)","fba12c17":"minerLockAddress()","fba13bd0":"depositBalanceOf(address)","fba17fc9":"Flye()","fba246de":"DepositETH()","fba26207":"setUint64(int64,uint64)","fba2a2d2":"setPeriod(uint16)","fba2b18b":"_getplayersurplus()","fba2fb66":"newPolicy(bytes32,bytes32,uint256,uint256,uint8,bytes32)","fba36b31":"payWithRef(address)","fba4734f":"withdrawEthereum(uint256)","fba4abb2":"payoutBalanceCheck(address,uint256)","fba52ff1":"getInvestorClaimedTokens(address)","fba5de1c":"cancelGetTogether()","fba5ee24":"getSinistre_effectif()","fba5f1f6":"weaponModels(uint256)","fba6651c":"getCommunityTaxes(uint256)","fba6748c":"getMaxPrivateSaleBuy()","fba6e51b":"_getFinalAddress(uint256[],address[],uint256)","fba70381":"adventureByToken(address,uint256,uint256,uint256,uint64,uint64)","fba71fe9":"periodICOStage6()","fba74490":"PoseidonQuark()","fba779f6":"armyHelicoptersCount(uint256)","fba79777":"test1cash()","fba7c1ab":"addMake(string,address,uint256,uint256)","fba7cc79":"getIsActive()","fba84b2a":"LjwStandardToken()","fba90629":"totalSupplyPrivateSale()","fba906c5":"HiroyukiCoin()","fba939f8":"_goal()","fba9ce40":"donateToDev()","fba9cea9":"someAction(address)","fba9dbbb":"chnageSpecialFeeTake(uint256,address,uint256,uint256)","fba9ecac":"getFreeBanker()","fbaa0ece":"weekTwoRate()","fbaa89d3":"LogBidRemoved(address,uint256)","fbabc444":"PeaceChainToken(uint256,string,string)","fbabdb06":"disapprove(address,uint256)","fbac3951":"isBlocked(address)","fbac7d1d":"setCampaign(bytes32,uint256,uint256,uint256,uint256,bool,address)","fbac89f6":"unlock(bool)","fbacc43f":"getBases()","fbad8983":"sendyum(address)","fbae5e7d":"Investors(uint256)","fbaeac89":"newOwnerAPI()","fbaf094a":"provider(address)","fbaf12a7":"_removeBlacklistedUser(address)","fbb0eb8b":"mintingNonce()","fbb11f29":"setTokenGbi(address)","fbb1c5c4":"XBCOMMUNITY()","fbb26d00":"releaseBasicAccount()","fbb39f6e":"offerTrade(uint256,uint256)","fbb4d51b":"OverseasReturneesUnion()","fbb4dc6b":"secondMonthEnd()","fbb4f0e3":"NuToken()","fbb58c5c":"STARTING_FALCON()","fbb5d52d":"sellCoinsToICO(uint256)","fbb5f682":"KUNTEStandardToken(uint256,string,uint8,string)","fbb6272d":"tokens(uint32)","fbb65708":"freedWinPoolForSecondStage()","fbb78719":"private_setmaxBet(uint256)","fbb8932a":"getSeatMessage(uint256)","fbbb75c5":"getClaimedOwners()","fbbc3448":"getWrefundIndex(uint8)","fbbcb4de":"GointoMigration(address)","fbbd6545":"pushHatch(address,uint32,uint16,uint16)","fbbdb68c":"hiddenOwner()","fbbdbf22":"_setTimes()","fbbe20a9":"breeding(uint256,uint256)","fbbe7887":"NewBOP(address,address,uint256,uint8,uint256,string)","fbbedf5c":"ERC20Token(string,string,uint8,uint256)","fbbf119b":"BTCCCoin()","fbbf93a0":"getDetails()","fbbfa45e":"destory(address)","fbbfe830":"refundTokenHolder()","fbc00b4a":"GACC()","fbc032ab":"GCFcoinF(uint256,string,string)","fbc09b26":"m_totalDatasetCount()","fbc34d1c":"artistsArtworkCount(address)","fbc3d0ef":"frozenReserveTeamWallet()","fbc402fc":"updateDarknodeBond(address,uint256)","fbc44458":"setTransferAuthorizations(address)","fbc449a7":"FirstContract()","fbc47e56":"tokenListContract()","fbc4f981":"ReceivedBTC(address,uint256,string)","fbc53c8e":"Arascacoin(uint256,string,string)","fbc5db95":"lowestAskTime()","fbc6c0f0":"firstChipBonus()","fbc6d0ff":"confirmTransactionWithSignatures(bytes32,uint8[],bytes32[])","fbc7ad3e":"finishedLoading()","fbc805ee":"changeMaximumContributionForAllPhases(uint256)","fbc80af6":"FakeNewsToken()","fbc94bd1":"icoFinishInternal(uint256)","fbc94f24":"changeTokenPrice(uint256)","fbc990d0":"_removeMember(address)","fbc9c601":"requestAccess(address,int256,address)","fbca6ba6":"maintenance(uint256)","fbcbc0f1":"getAccount(address)","fbcc3775":"isMyWalletLocked_Send()","fbccc2b1":"setBoolF1UintF1StrF2Intf3(bool,uint256,string,int256)","fbcebd02":"delegatedRefund(address)","fbcece85":"freeTokens(address,uint256)","fbceff0e":"WangWangCoin(uint256,string,uint8,string)","fbcf1594":"UNLOCK_TEAM_2()","fbcfa0d7":"createCard(string,uint256,address,address,bool)","fbd06cb6":"s42(bytes1)","fbd0c5d7":"SaleClockAuction(address,address,uint256)","fbd0e7df":"Reimburse()","fbd15163":"lengthMessages()","fbd1df54":"TotalCount()","fbd1eb7b":"deployAgentWallet()","fbd22407":"EscrowRaj()","fbd275f8":"randomGen(address,uint8)","fbd2dbad":"previousDelegates(uint256)","fbd395f8":"pauseToken(uint256)","fbd3c51a":"left83(uint256)","fbd3d51b":"setMasterAddress(address,address)","fbd4200c":"base_token_is_seeded()","fbd42e0f":"releaseLockedTokens()","fbd4e0f0":"chkdrawadm(address)","fbd54a63":"sendAmount(address[],uint256)","fbd59425":"ETLToken()","fbd668a9":"setMaxProfit(uint256)","fbd6d77e":"addCoordinator(address)","fbd6fdde":"reLoadCore(uint256,uint256)","fbd70768":"___setProxyOwner(address)","fbd7b853":"setTokenSupplyLimit(uint256)","fbd7c5f1":"priceT3()","fbd7d081":"TOKEN_HODL_3M()","fbd81564":"logger(string)","fbd902f2":"_distributeTokenToPurchaser(address,address,uint256)","fbd95a39":"sendToAddress(address,address,uint256)","fbd9c625":"changeAddressPaladin(address)","fbd9c902":"vendi()","fbda68e2":"numberOfMessages()","fbdafaf9":"getInvestorAtIndex(uint256)","fbdb70fb":"KRWT()","fbdbad3c":"lastCompletedMigration()","fbdc03fe":"nettingContractsByAddress(address,address)","fbdc562a":"setCanChange(bool)","fbdd3982":"s17(bytes1)","fbdd7852":"Ownership()","fbdd8508":"PriceAccepted(uint256,uint256)","fbdda15a":"isTrustedContractAddress(address)","fbde47f6":"FEE_RANGE()","fbde5b64":"gameLength()","fbde8ad4":"pStartBlock()","fbde8d75":"manualWithdrawTokens(uint256)","fbdeecab":"endTimePreIco()","fbdf0378":"getAllChildren(bytes32)","fbdf45c8":"ZoosCoinToken()","fbe00e8e":"receiveEtherFromGameAddress()","fbe04e1c":"boolFunc(bool,bool,bool)","fbe0508c":"toggleActive(bool)","fbe093dc":"targetFeePeriodDurationSeconds()","fbe2e125":"addBet(uint256,uint8,uint256,bool)","fbe334f8":"getNumFulfillments(uint256)","fbe3462c":"minBuyRateInPrecision()","fbe3549c":"addWeight()","fbe38ffb":"canEscapeTo(uint32,int256,uint32)","fbe3bb40":"TSTOraclzAPI()","fbe3e1a2":"_setCap(uint256,string)","fbe413e4":"createMember(address,bytes20,uint64)","fbe45b48":"unitPLATCost(uint256)","fbe5ce0a":"removeOwner(address,address)","fbe5d87e":"getTotalCollected()","fbe6529f":"findOldest()","fbe6a9b2":"winners_count()","fbe7913f":"Accept_Payment()","fbe89965":"GoldenCoinToken()","fbe8dab9":"getProfitForDay(uint256,uint256)","fbe9bb6d":"_isValidDepositCountry(uint256,uint256,uint256)","fbeaa807":"RefundSent(uint256,address,uint256)","fbeaaed2":"VersionedAgreementControll()","fbeac9c9":"setRefBonus(address,uint256)","fbeaebc6":"murder()","fbeb89dd":"tournamentContract()","fbebc9af":"getPixelAuthor(uint32,uint32)","fbec4769":"MatchpoolAdministrator()","fbec51bc":"requestRedemption(address)","fbec6f21":"gold()","fbec9121":"maxRandom(uint256)","fbece99f":"abortive(uint256,uint256)","fbee7b58":"giftIsFrom()","fbeecb47":"safeTransferByContract(address,address,uint256)","fbeee7e4":"isPeriodClosed(uint256)","fbef0195":"_calcDelta(uint256,uint256,uint256,uint256)","fbef957b":"ada()","fbf05e69":"GasLog(string,uint256,uint256)","fbf0ade1":"setOwnerFee(uint256)","fbf0f7da":"buildOutAddress()","fbf184c6":"getBankermasterReq()","fbf1a44b":"holyBountyFundDeposit()","fbf1f78a":"unapprove(address)","fbf22dea":"issueSoftcapToken(address,address,uint256)","fbf2360c":"isMessageEnabled()","fbf2dd6a":"depositTokensForAccount(address,address,address,uint256)","fbf350e2":"TokenBBBasic()","fbf3c88d":"getSignedPublicEncKey(address)","fbf405b0":"pinakion()","fbf42072":"CashPoints1()","fbf44a1b":"setOraclizeGas(uint256)","fbf552db":"hint()","fbf561fe":"developer_add_address_for_A(address)","fbf58b3e":"transfer(string,address)","fbf69367":"FuleexToken()","fbf788d6":"cash(address,uint256,uint8,bytes32,bytes32)","fbf7980f":"setChainsAddresses(address,int256)","fbf7ba65":"claimExploreItem(uint256)","fbf7e985":"ExaUSD()","fbf80773":"isUserRoot(address)","fbf82d31":"WorldWideCoin()","fbf9180e":"getLastAuditTime(address)","fbf94ce1":"GlaidexToken()","fbf9dab7":"getBetters()","fbf9dc12":"GoldBank()","fbfa49a8":"icoWithdraw()","fbfa4b7f":"requestsCount()","fbfa77cf":"vault()","fbfb76c4":"GUAEX(uint256,string,string)","fbfb77d7":"setArquivo(bytes)","fbfb7e70":"market_WithdrawForSale(uint256)","fbfb8b02":"createMintRequest()","fbfbb62e":"BASE_CLB_TO_ETH_RATE()","fbfc1653":"XBLToken()","fbfd1da4":"getKeccak256Uint(uint256,uint256)","fbfd45f5":"PRE_SALE_START_2()","fbfd90cb":"finishBurningByCreator()","fbff728f":"HodboCrowdsale()","fbffb355":"testBitsEqualFailIndexOOB()","fc00234e":"icoStage()","fc006216":"MODICOIN()","fc01157c":"firstCrowdSaleEndDate()","fc017495":"EmployeeOptionsExercised(address,address,uint32,bool)","fc018c05":"makePublic()","fc01987b":"setLockAccount(address)","fc01abbe":"stringToBytes32(string,string)","fc01ce83":"increaseClaimsBalance(address,address,uint256)","fc01dfbb":"mintUpto(address,uint256)","fc0262e0":"CpublicGold()","fc02c1df":"assertExpectations()","fc03441c":"allDecimals()","fc034bd8":"getPoolOwners()","fc036d7c":"SECURITY()","fc037776":"assertEq31(bytes31,bytes31)","fc03c7ec":"setLockend1(uint256)","fc03fb11":"MacBookOracle()","fc043830":"getNetworkFee()","fc043cad":"setPullPaymode()","fc04771a":"RT()","fc04a2ec":"_getOriginAddressHash(address,address,string)","fc04c0c4":"partnerTransfer(uint256,bytes32,address,uint256)","fc04c62e":"offerAsSacrificeFromVault(address)","fc05a6fc":"getPeopleBeforeMe(address,address)","fc06013a":"updateTokenEmission(uint256,uint256,uint256,uint256)","fc0656c9":"candyTokenAddress()","fc06a877":"createApp(string,uint256,string)","fc06d2a6":"sunrise()","fc078bd4":"GDCAcc05()","fc0808e5":"bet_MIN()","fc091b71":"MitCoin()","fc09ff9e":"submitTransaction(address,string,string,uint8[],bytes32[],bytes32[])","fc0a39b7":"isJackpot(bytes32,uint256)","fc0c3460":"CryptoSoft()","fc0c38a7":"Dsocial()","fc0c50fe":"getCallPtr()","fc0c546a":"token()","fc0d0117":"masterWallet()","fc0dce74":"ATL(address)","fc0e3d90":"getStake()","fc0e4262":"___AllBalance()","fc0e64de":"setInitialGasForOraclize(uint256)","fc0e74d1":"shutdown()","fc0ea853":"processWithITG(address,uint256)","fc0f392d":"activateSafeMode()","fc100eb2":"inxToken()","fc10655e":"actual_feedin()","fc10881a":"CXCoin()","fc108f70":"GamblerPerAddress(address)","fc10d4d5":"getFeeRecipientById(uint256)","fc11f71c":"setInstructor(address,address,uint256,bytes16,bytes16)","fc122892":"deleteOpenAction(string,address,string)","fc12c7da":"blocknumbersOf(uint256)","fc12dfc7":"weiDelivered()","fc13440c":"HealthCharityToken(uint256,string,uint8,string)","fc136941":"EmergencyWithdrawalProposed()","fc13a76a":"testFailAddForeignChildNotInUse()","fc14230f":"wei2euroCents(uint256)","fc143f2b":"defrostOwner()","fc14a47c":"CTBToken()","fc14ed71":"updateForSale(uint256)","fc157b13":"getOrganFunction(uint256)","fc15dcef":"resAmount()","fc1711f2":"setWeight(uint256)","fc176c4c":"getAdsCountByUser(address)","fc177bd6":"resetArray()","fc178f2a":"MoonTokenERC20(uint256,string,string)","fc17ce26":"Panthercoin()","fc17d2ac":"setFunctionEightPrice(uint256)","fc184fff":"addPhenomenon(string,string,string,uint8)","fc190261":"getIntervalsForWindow(uint256,uint256,uint256,uint256,int256)","fc190d6e":"newUpdate(string,bool)","fc192fb0":"setMinimumWithdrawal(uint256)","fc196cf3":"getNoInvestor()","fc1a1110":"currentLiquidInDeal()","fc1a142d":"adPriceHour()","fc1a3f0a":"decreaseTokenLock(address,uint256)","fc1adfdf":"invest(address,uint256,uint256,uint256)","fc1b8a7e":"richestPlayer()","fc1b9286":"rewardActivityEnd()","fc1c01b2":"setCrowdsaleParams(uint256,uint256,uint256)","fc1c2180":"setHotWalletAddress(address)","fc1c32fa":"fundariaBonusFundAddress()","fc1c5218":"RemoveOpenOrder(uint32)","fc1c9620":"depositOrWithdraw(address)","fc1da46a":"parcipateCrowdsaleAll()","fc1dfdf1":"extraData1FromHash(string)","fc1e1a32":"NetfBalance()","fc1e2ce9":"getGameAmounts(uint256)","fc1eb4d1":"withdrawPoly()","fc1ed437":"initialAmount()","fc1f2a70":"Add(uint256,string,string)","fc1f2d46":"setAllowTransferWhitelist(bool)","fc1f5c9c":"personalSegmentHash(string,uint256,bytes32)","fc1f5e53":"resetTimeLockValue(address)","fc1f7652":"_isBoardMember(address)","fc200a55":"mintWithTimeLock(address,uint256,uint256)","fc201122":"_setOwner(address)","fc204334":"sendAwardToLastOne()","fc207c8f":"periodAt(uint256)","fc21fa40":"getAmountByCurrency(uint256)","fc223410":"doBet(uint256[],uint256[],uint256[],uint256)","fc22545c":"getPreICOFundersCount()","fc22a9f8":"initialIssuance()","fc22d0e5":"migrate(address,uint256,uint256)","fc23466d":"search_data()","fc235fb8":"timeWaitApply4Redeem(address)","fc236188":"setData_7(string)","fc23f5b1":"getAddressByID(uint256)","fc248fd6":"RegisterNode(bytes32)","fc24e589":"badgeTotalSupply()","fc2525ab":"get(address,string)","fc252b94":"_getBuyPrice()","fc257baa":"traderWithdrawalSignals(address,address)","fc2584a2":"fillOrMarket(address)","fc26088e":"K_INITIAL_SUPPLY()","fc2615d5":"getRemainTime()","fc2634b7":"callURL(string,string,string)","fc26d522":"tip_total()","fc26fe01":"setairDropManagerLimit(uint256)","fc27ea83":"defaultAmount()","fc281217":"TokenInformation(address)","fc284d07":"earlyBackers(uint256)","fc28bc8f":"staffContract()","fc2b8b7b":"initTokenSupply(uint256)","fc2b8cc3":"quit()","fc2bd7ae":"sendtoMultiWallets(address[],uint256[])","fc2c1ddb":"setItemAvailable(uint256,bool)","fc2c3e08":"getIteration()","fc2d2b69":"SmartBondsToken()","fc2d64e3":"getProviderData(address)","fc2df281":"withdrawICOEth()","fc2e5bf2":"OfferOnHold(uint256,bool,address)","fc2ea8a5":"airdropAmount()","fc2f5e67":"recoveryAllowed()","fc300522":"getCallFee(bytes32)","fc303ef1":"destroyBottle()","fc3087f8":"withdrawAll2()","fc317cbe":"mainSaleDate()","fc322d73":"challengers(bytes32)","fc324642":"__createNewToken(address,string,uint256,uint256,uint256,uint256)","fc325efd":"getItemByIndex(uint256)","fc3280c2":"getDegreeAtIndex(uint256)","fc32f09c":"MyShareToken()","fc331ebb":"transfererc20(address,address,uint256)","fc334e8c":"reveal(bytes32,bytes32)","fc335bb5":"OrmeCash()","fc337f5a":"getFreeCat()","fc342947":"renewFeatured(uint256)","fc34b908":"TOTAL_BONUS_SUPPLY_ETH()","fc366a2a":"RETZE()","fc36cc9d":"setCoolHero(uint32)","fc36e15b":"vote(string)","fc37987b":"buyRate()","fc380d96":"addBonusTokens(uint256,uint256)","fc384b7c":"executeStackholderTransaction(uint256)","fc385d51":"changeRelease6m(address)","fc3880ae":"priceWithBonus()","fc38ce19":"validPurchaseTokens(uint256)","fc38d4a4":"upgradeAgility(uint256,uint256)","fc395c90":"AddBillModerator(address)","fc3b7379":"lastBlock_a18()","fc3c28af":"devPercent()","fc3c8561":"testDistribute(uint256,address[],uint8[])","fc3d9f9f":"calcUnMaskedKeyEarnings(uint256,uint256)","fc3daf81":"_CalcDiv()","fc3f162b":"unregisterAuditor(address)","fc3fc168":"DIVIDEND()","fc3fc4ed":"getAuctionInfo(uint256)","fc4116bb":"p_update_mResalePlotTaxPercent(uint256)","fc416159":"coreERC()","fc42b58f":"getTransferFee(address,uint256)","fc4333cd":"clean()","fc434891":"unWhitelistAddresses(address[])","fc43bbfb":"setWhitelistAddress(address,uint256)","fc442ec3":"getFlavor()","fc44e41b":"RANDOMFACTToken()","fc44fd28":"payBalanceToReturnWallet()","fc450ae6":"MummyAccountWithdraw()","fc45c822":"getDividends(address,address)","fc470105":"TestcoinToken()","fc47b9d2":"brulerDe(address,uint256)","fc47fcf5":"total_devidend()","fc48b653":"authorizedTransfer(address,address,uint256)","fc49926f":"getCountdowns()","fc4a089c":"newPermission(bytes32,address[],bytes4[])","fc4a4a1e":"StartTime()","fc4b01ff":"addTicketsToDraw(uint256,uint8,uint8)","fc4b2473":"ALC_CONTRACT_ADDRESS()","fc4bd9d7":"throwIfSetPresaleTokensAfterSaleStarts()","fc4c0daa":"_agent()","fc4d20f5":"addMonsterObj(uint32,address,string)","fc4d705b":"COLOR_GOLD()","fc4db64e":"SendAmount(address,address,uint256)","fc504655":"getPriceInWei()","fc512b92":"postCrowdsaleWithdraw(uint256)","fc515d93":"approvedAddressSize()","fc51b9c5":"cancelOrder(address[3],uint256[5],int256,int256)","fc51daef":"getCurrentRoundWinner()","fc523f7a":"settte(uint256,address)","fc525c75":"Ammbr(string,string,uint8)","fc52be0a":"getLatestTokenAllocation(address,address)","fc52cc1d":"incPreSell(address,uint256)","fc52f2eb":"DogRacingToken()","fc5378bb":"getEmployeeInfoById(address)","fc539a4a":"getInstances(bytes32)","fc53c821":"getMembersLength()","fc53f958":"ADMIN_ALLOWANCE()","fc53fe51":"_authorizePayment(address,uint128)","fc548f08":"changeArbitrator(address)","fc55c8d6":"buyPixel(uint256,bytes32)","fc55ea9d":"removeCustomer(string)","fc56200e":"JCFv1(uint256,string,string,uint8)","fc563658":"getNumber(uint256)","fc578323":"getProposalProposedBy(bytes32,bytes32)","fc57fadf":"IsValidAddress(address)","fc58452e":"castVote(bytes32,uint16)","fc58edea":"FoundationAddressFreezeTime()","fc58fc49":"setUser(address,address,string,uint256)","fc59116d":"setTokenTypes(uint16,uint16,uint16)","fc5a0152":"div256(uint256,uint256)","fc5ab1c6":"_unlockOther(address)","fc5b57a6":"removeStackholder(address)","fc5b652a":"LogNeumarksBurned(address,uint256,uint256)","fc5be8ec":"bonuscalico(uint256)","fc5c0cde":"allTimeDiscount(uint256)","fc5d9244":"totalBonusTokens()","fc5e2cce":"calculatWithdrawForPeriod(uint8,uint256,uint256)","fc5eb846":"currentHunterNumber()","fc5faa82":"ProWalletToken()","fc5fc345":"getPlayerIds()","fc5fc8ae":"preICOEnds()","fc601902":"_isAdmin()","fc608e17":"getAllocatedTokenCount(address,address)","fc60bb36":"_removeGroupFromMember(address,bytes32)","fc60e82c":"calculatePrize(uint256,uint256,uint256,uint256)","fc612a8d":"priceUpdater()","fc623ef8":"hashToSign(bytes32)","fc632647":"MNToken(uint256,string,uint8,string)","fc63977a":"getAddressFromUsername(bytes32)","fc63d4fb":"order(bool,uint32,uint128)","fc63dad6":"getLastBuyer(bytes32,uint8)","fc65169a":"phase4Duration()","fc65b3ac":"all_team_accounts()","fc65ee05":"marginCallOnBehalfOfRecurse(address,address,bytes32,uint256)","fc65f812":"_currentPrice(uint256)","fc6634b9":"setSellPrice(uint256)","fc673c4f":"operatorBurn(address,uint256,bytes,bytes)","fc676652":"Embassy(address,address)","fc67af2d":"withdrawCommunityBalance()","fc68521a":"f(address)","fc687311":"betOn(int8)","fc688e87":"logAccount(address,uint256)","fc6a0ca6":"changeTeamSize(uint8)","fc6a3ff7":"ticketsOwnedByUser(address)","fc6b72b6":"bringCat(uint256)","fc6c403b":"getMySalePrice(bytes32)","fc6d0dd0":"getLightingWithdraw(address,address,bytes32,bytes32,uint256,uint32)","fc6d1892":"setArrUintField1(uint256[])","fc6def15":"decider()","fc6e33ee":"MAX_SALE_DURATION()","fc6ef5a5":"getUserTokenLocalBalance(address)","fc6f46a0":"addTether(address,string,uint256,uint32,string)","fc6f9468":"adminAddress()","fc6fadec":"LoggedReward(uint256,string,uint8,string,bool,bool)","fc700dc0":"createBucketLender(bytes32,address,address,address,uint32[7],address[],address[])","fc70b462":"viewReputation(address)","fc722b2b":"trustedDarknodeRegistry()","fc72c1ef":"ERC20Base(uint256)","fc735e99":"verify()","fc7368fa":"reopenBet(uint256)","fc73c86e":"getInvestments(address)","fc73ec00":"changeDividend(uint256)","fc741c7c":"makerFee()","fc749323":"NTC()","fc74dadd":"delegateProxy(address,bytes)","fc74f55c":"IexecHubAccessor(address)","fc753ce3":"NAME_ARK()","fc756c69":"createship(uint256,address)","fc7596a8":"GoldBoxToken()","fc76501a":"preIco1Raise()","fc76687c":"jinglesOnSale(uint256)","fc77060d":"withdrawEtherHomeExternal()","fc772c8b":"reclaim(address)","fc773166":"GCoin()","fc78b430":"delegateVote(address,address,uint256)","fc792719":"hasBeenClaimed()","fc794183":"timesfucky()","fc79c8eb":"TBCoin()","fc7ae9f5":"presaleMaxContribution(address)","fc7b78b1":"changeVestingAgent(address)","fc7b9c18":"totalDebt()","fc7ba686":"affiliatesCutOutof100()","fc7c1c80":"getParentB(uint256)","fc7c41af":"doDisown()","fc7cb268":"PoSToken()","fc7d07ce":"AllocateFounderTokens()","fc7d2b3a":"EtherOcrend()","fc7d6518":"getLockSdc()","fc7e061f":"convertPresaleTokens(address,uint256,uint256,string)","fc7e4768":"saleMinShares()","fc7f1a88":"increaseBurnApproval(address,uint256)","fc7f7957":"callMeMaybe()","fc7fcae1":"extractFund(uint256)","fc800df4":"getBuyerbyaddress(address,address)","fc818684":"burnFromContract(uint256)","fc8234cb":"_unpause()","fc82d0f7":"currentIterationSupplyLimit()","fc836563":"SendTokens()","fc845834":"GoldenCoin()","fc860e96":"emissionTime()","fc862027":"setNameTAOLookupAddress(address)","fc86a7a5":"getTokenSoldPrice(uint256)","fc87790f":"addToWithoutFee(address)","fc8791c0":"change_p1(uint256)","fc87c766":"addressCap(address)","fc880be0":"SetCommissionValue(uint256)","fc882dff":"ownerHashed()","fc88ee77":"optionExerciseOf(address)","fc891b97":"MosesToken()","fc892cfe":"setup_token()","fc89aff6":"submitVerifiedUsers(address[])","fc89f349":"ORZToken()","fc8aaa76":"disableManualEmission(bytes32)","fc8ad37c":"changeParameters(uint256,uint256,uint256)","fc8b4a90":"checkDuplicateMatchId(address,uint256,uint256)","fc8bbb6d":"AddresstoAsciiString(address)","fc8c2f0d":"AlphaMarketTeamBountyWallet(address[],address)","fc8cddf2":"ARCADIA()","fc8d4f4f":"getShareHoldersInfo(uint256)","fc8dae84":"AllAmericanCoin()","fc8f3a94":"_getPayTo()","fc8f616e":"XXX()","fc8fc6f7":"KittyCoins()","fc906720":"setSiringWithId(uint256,uint32)","fc906897":"StageDistributed(uint8,uint256)","fc909fc7":"EtherGrand()","fc912461":"_setControllers(address[])","fc914949":"ValidContractRemoved(address,address,uint256)","fc91a274":"getAmountByToken(bytes32,string,address)","fc91e03d":"EtherDeltaWithdraw(uint256)","fc94dd18":"verifyHumanStandardToken(address)","fc959d9a":"getMin(uint32[])","fc961664":"setPI_edit_7(string)","fc966d45":"uintToStr(uint256)","fc970859":"PacBall()","fc976827":"TOTAL_TOKEN_AMOUNT()","fc9774c1":"dividendShares(address)","fc98f71e":"developerLock()","fc99342e":"create_table()","fc9937e5":"orders_sell_total()","fc996557":"goldContract()","fc998981":"sendBountyBalance(address[],uint256[])","fc9bfaa6":"externalCallFlag()","fc9c473d":"limitPerHolder()","fc9c8d39":"caller()","fc9dab52":"soldSale()","fc9dc608":"setRoundTime(uint256,uint256)","fc9e53df":"setNextRegistrar(address)","fc9ede65":"getPropertyBecomePublic(uint16)","fc9f8cae":"_isApprovedPack()","fc9ffe02":"getWalletList()","fca062d3":"blockBeforeChange()","fca10682":"randomGen(uint256,uint256,uint256)","fca129a3":"finalizeDescription()","fca16c3b":"getBuyPrice(uint256,uint256,uint256)","fca2452b":"change_b(address)","fca2d9f5":"senttest()","fca2efd5":"DocnotaPresale(address,address)","fca346af":"SetupCrowdSale()","fca3644a":"verifyMessage(uint8,uint256,bytes32[4])","fca3b5aa":"setMinter(address)","fca495f0":"receivePurchase(uint256)","fca5d057":"migrateTokensV1(address,uint256)","fca5d21f":"playSlot()","fca5e61e":"drugs(uint256)","fca64947":"setMetaBet(uint256)","fca69afa":"CYCLE_CAP()","fca6d4e2":"LogAccess(address)","fca76c26":"lockMaxSupply()","fca7c355":"MUSTToken(address,string,string,uint256,uint256)","fca7cdba":"pgoMonthlyPresaleVault()","fca865dd":"aSetProportion(uint16)","fca981f6":"setStepFunctions()","fca9bb5f":"FACTOR_1()","fcaa7664":"getStage()","fcaa96fa":"withdrawForThreeStep()","fcac1c77":"DragonKing(address,address,address,address,uint8,uint8,uint8,uint16[],uint16[])","fcad399f":"TheFlashToken(uint256,string,string)","fcad8cf3":"RentOffice()","fcae08e1":"fundTokens()","fcae4484":"unsubscribe()","fcae8c06":"takeMoney()","fcb0339e":"icoMinCap()","fcb0368c":"BuyToken(uint256)","fcb0a7ad":"getMinAuditPrice(address)","fcb0e55c":"_validGenes(uint256)","fcb163c7":"ExecuteOptions(address,uint256,string,uint8)","fcb1804d":"getRateAndTimeRemaining(uint256,uint256,uint256,uint256)","fcb1b62d":"arbiterAcceptCount()","fcb1cba0":"GetQuota()","fcb2931b":"LockupContract(address,address,address)","fcb2acd5":"_preValidatePurchase(address,uint256)","fcb2cafc":"verifyAddress(address)","fcb300e6":"_activate()","fcb36ce2":"buyCalcAndPayout(address,uint256,uint256,uint256,uint256,bool)","fcb3a3a3":"setCrowdsaleMinter(address)","fcb5bc29":"startPhase2()","fcb5ced3":"saveToCW()","fcb5d44d":"doExchange(uint256)","fcb6323a":"unclaim(address[])","fcb71ea9":"balanceOfHolder(address)","fcb750cf":"REFUND_DIVISION_RATE()","fcb806ac":"ReserveManager()","fcb80d16":"getCurrentFgcCap()","fcb899d7":"LEGAL_EXPENSES_ADDR()","fcb8b1e1":"NewHardCap(uint256)","fcb927aa":"addPublisher(string,bytes,address,address[],uint256[],address,uint32[])","fcb941c9":"setGenomeContractAddress(address,address)","fcb94dbb":"toBytes(address,address)","fcbc1bc4":"Standard23TokenMock(address,uint256)","fcbcf436":"clearSums()","fcbd06aa":"supportersMap(address)","fcbd2731":"transferToProxy(uint256)","fcbe0f5f":"BRD()","fcbeaaa7":"buyTile(uint16,uint16,uint8)","fcbf3131":"private_setBankAddress(address)","fcbf323a":"ScienceToken()","fcc01cce":"getExpectedAmount(bytes32)","fcc101ba":"getCommunityDescription(uint256)","fcc11241":"addOrder(uint256,uint256,uint256,uint256,uint256,uint8)","fcc15c8e":"Strike(uint16,uint32,uint16,uint8)","fcc1cc9b":"removeLockMultiple(address[])","fcc21e56":"withdrawToTeam()","fcc29ae8":"setMaxContributor(uint256)","fcc2a69b":"BankuNetwork()","fcc34e89":"migrateCrowdsale(address)","fcc36c49":"refuseInvestment()","fcc47803":"removeSpecialOffer(address)","fcc4a54c":"getDeedIds()","fcc4dec9":"refound(uint256)","fcc550c6":"CreateCCM(address,uint256)","fcc5b5ad":"investContracts(uint256)","fcc60b6a":"isInited()","fcc648f6":"withdrawEtherToReserveEscrow()","fcc6b5d5":"fillTheirOrder(address)","fcc73637":"updateExchangeRate(uint256,uint256)","fcc8221f":"getfromsun(address,uint256,uint256)","fcc830be":"getMyRickAndMorty()","fcc89710":"LogTokenSaleInitialized(address,address,uint256,uint256,uint256)","fcc9b48c":"isIcoFailed()","fcca4040":"tokenCapReached()","fcca8949":"p_setDevPercent_out(uint256,uint256)","fccc2813":"BURN_ADDRESS()","fcccc68f":"LoveBite()","fcce0492":"AdminTransferredOwnership(address,address)","fcce2622":"challengeAnswer(uint256,bytes)","fcceea26":"communitySupply()","fccf5a68":"SmartBinding()","fccf6e67":"newOrdersContract(address)","fccf82a4":"endDateOfPreSale()","fcd0a747":"RICTToken()","fcd10753":"_getProviderSupply(uint256,uint256,uint256)","fcd13382":"OsherCoinPresaleAward(uint256)","fcd13d65":"setContractRegistry(address)","fcd14456":"teamVestingPeriod()","fcd24400":"lookupCampaignPart2(uint256)","fcd307c4":"processReferral(address,address,uint256)","fcd3533c":"burn(uint256,address)","fcd41502":"requiredMajorityPercent()","fcd41c1f":"officialAddress()","fcd45807":"isTokenRegisteredBySymbol(string)","fcd47e79":"getnowcardcount()","fcd51a4e":"_setIntelligenceValue16(uint256)","fcd58363":"refundCancelledGame(uint32,uint32[])","fcd6e339":"giveBlockReward()","fcd6ec11":"HELLO()","fcd735dd":"transferVesting(address,uint256,uint256,uint256)","fcd778da":"setCardsAddress(address,address)","fcd792f4":"nextAvailableId(uint256)","fcd830c4":"setCCH_edit_28(string)","fcd8c9d4":"_goldTotalSupply()","fcd92992":"resync()","fcd936b1":"Simple()","fcd9da44":"setParameters(uint256,uint256,uint256,uint256)","fcd9f4ce":"withdraw(bytes32,string,string)","fcda4ded":"showBankAmount()","fcdb2c04":"getMyGameInfo()","fcddd056":"payIn()","fcde22fa":"_eachPrize(uint32,uint256,uint8,uint32,uint256)","fcde2ff6":"getPI_edit_23()","fcde6831":"addTokens(address[],bytes32[],uint256[],uint256)","fcde6ebe":"createSalesTierConfigMap()","fcde7b69":"TokenFRT(address)","fcde9925":"proposalOwner(uint256)","fcdf350b":"EGGS_TO_HATCH_1FAIRY()","fcdf9750":"createDispute()","fce14069":"partnerBonusPercent()","fce1cc35":"setInt(int256,int8,int16,int32,int256)","fce1ccca":"voting()","fce1e3e9":"setPatentFees(uint256[9])","fce20190":"_refund(uint256,uint256,uint256,uint256)","fce22c4c":"generatePseudoRand(bytes32)","fce266cb":"artworksFactory(address)","fce33f01":"withdrawLimit(address)","fce3b91e":"IdolToken1()","fce3bbb5":"setSelling(bool)","fce44634":"isValidHashType(uint8)","fce48558":"countryOf(uint256)","fce4c128":"checkInvestmentRequired(uint16,bool)","fce4f84f":"sellToConsumer(address,uint256,uint256)","fce59d0c":"MangoRepo()","fce6d586":"LogClaim(address,uint256)","fce78e5e":"TurtleToken(uint256,string,string)","fce846e8":"getExtraBonus()","fce87fb0":"tokenUriPrefix()","fce897e5":"payBid(address,uint256,bytes)","fce908ad":"whitelistTx(address,address)","fce927f3":"issueReservedTokens(uint256)","fce9fbff":"minWeiPerContributor()","fce9fdd9":"MPYCreation(address,uint256)","fceb9852":"isToOffChainAddresses(address[])","fcec617a":"conflictEndFine()","fcec962e":"adminWithdraw(address,uint256,uint256)","fceca4a0":"VICOXToken(uint256,address)","fcecbb61":"getReceipt(bytes32)","fced4a86":"CryptoHuntIco(uint256,uint256,address,address)","fced5694":"FOUNDER1_STAKE()","fced6ad2":"KARMAtoken()","fcee45f4":"getFee(uint256)","fcef09d6":"BlipCompetition(address)","fcef56a4":"createBar()","fcf07c6b":"foundationAddress()","fcf0f55b":"eventOracles(bytes32,uint256)","fcf23a92":"LogOwnerChanged(address,address)","fcf23d63":"getMatchInfoList03()","fcf2f85f":"requiredDevSignatures()","fcf32769":"adminWithdraw(address[4],uint256[5],uint8,bytes32,bytes32)","fcf3438c":"setSmsCertifier(address)","fcf36918":"doCall(bytes32)","fcf40170":"cleanWallets()","fcf4333a":"updateHashrate(address)","fcf43ce2":"setValidTransferAddress(address)","fcf4b576":"getVaultAccess(address)","fcf516aa":"VuePayToken()","fcf5462e":"SuperUltraUltraCoin()","fcf56577":"setRequesterLock(bool)","fcf7e73d":"addBeneficiary(address,uint256,uint256,uint256,uint256,bool,string)","fcf84962":"InvestAddEvent(address,uint256)","fcf8566e":"unsoldCleanUp()","fcf911e7":"delAddressValue(bytes32)","fcf9c44d":"soldUET(address,uint256,bytes32)","fcfa2bfe":"SALES_START()","fcfa63e3":"getResourceAddress(string)","fcfbc962":"Unset(string,string,address)","fcfc1577":"masterFns(bytes32)","fcfc208e":"unclockAddressDuringITO(address,address)","fcfd3a4c":"PreICO(address)","fcfdaa52":"successfulTime()","fcfdbc23":"perform_withdraw(address)","fcfdcf8a":"removeOpenMakeOrder(address,address)","fcfdeba8":"changeGameEnable(uint256)","fcfdf7c5":"decApprove(address,address,uint256)","fcfe2247":"setContributionDates(uint256,uint256)","fcfe6af1":"transfer(address,uint256,address,address,uint256,uint8,bytes32,bytes32)","fcff1eaf":"increaseGasSpent(bytes32,uint128)","fcff5ed6":"createChannelDelegate(address,address,uint192)","fcffb14e":"getNormalPayout(uint256)","fcfff16f":"open()","fd004f2d":"IRONtoken()","fd01249c":"createGen0Auction(uint256,uint256)","fd01d4a1":"ownerDivRate()","fd0326b4":"m_nextSale()","fd036052":"modPass(uint256,uint256,string,string,string)","fd037bc5":"changeIsPayableEnabled()","fd03846e":"setCreditBondContract(address)","fd03c006":"agreeCount()","fd03d762":"resumeWork(uint256)","fd03e721":"referraltokencontract()","fd049319":"distribute1BTCO(address[])","fd04a902":"totaletherstransacted()","fd05ddfc":"CCCRCoin()","fd062d3b":"handleFees(uint256,address,address)","fd06c6a9":"issuePass(address,bytes32,uint8)","fd070667":"tournamentResult(uint32[3][11][32])","fd074c28":"removeWeapon(uint8[176],uint8,uint8)","fd074e8e":"checkIfMissionCompleted()","fd0801c1":"appendNumToString(string,uint256)","fd080993":"submit(bytes32,bytes32,bytes32)","fd083748":"isGason(uint64)","fd084b16":"etherPartition(uint256)","fd085b41":"minSaleAmount()","fd08921b":"getYear()","fd090e47":"DEPOSIT_PERIOD()","fd0998de":"Totalbalance()","fd09b6f0":"JNDToken()","fd09d013":"CROWDSALE_ALLOCATION()","fd0a7f3e":"grantGrantableAllocations()","fd0aeb34":"EderCoin()","fd0b9dc2":"verifyWithdrawUpdate(bytes32,bytes32,uint256,uint256)","fd0bb752":"getBonusReceived()","fd0c1edb":"_setVault(address)","fd0c2a76":"Crowdsale(uint256,uint256,uint256,address,address)","fd0c78c2":"secondaryOperator()","fd0cdcdb":"withdrawRemaining(address)","fd0cfa91":"baseFeeDivisor()","fd0d1322":"WETCC()","fd0dd4d0":"btnSupply()","fd0e4695":"_canceloffer(address)","fd0edbd6":"refundSeller(address,address,uint256)","fd0f267b":"deathData_v0()","fd0f5a81":"updateWEIAmount(uint256)","fd1075d0":"setTokenRewardRate(uint256)","fd1094a9":"JaiHoToken()","fd12c1cb":"ethFnkRate2()","fd1343f1":"ESOPAndCompanySet(address,address)","fd138223":"remainingBountySupply()","fd13a7ce":"isPurchaseWithinCap(uint256,uint256)","fd14492a":"DinoTokenSale()","fd14ecfe":"balanceOfSPS()","fd15e091":"changeSymbolName(string)","fd17f289":"teamTokenSupply()","fd186de6":"StoToken(address,address)","fd18b484":"VitaToken()","fd19368a":"isEditionAvailable(uint8)","fd1a0a55":"JINGJING()","fd1aaa72":"sendToOwnerBalance(address,uint256)","fd1bd9b0":"getAmountLeft()","fd1c50e0":"sellAtIndex(uint256,uint256)","fd1c66da":"getCertificateIssued()","fd1ccaf3":"HideraNetwork(uint256,string,string)","fd1dc137":"settoken(address,bool)","fd1e582d":"ownertransfer(address,uint256)","fd1e5e7a":"getOrCacheDesignatedReportNoShowBond()","fd1f4ba5":"setAgenda(string)","fd1fb2fa":"rateB()","fd1fc4a0":"airDrop(address[],uint256)","fd203906":"getCarState(string)","fd208ca7":"endprivateIco(bool)","fd214edd":"collect(uint64,address[],address[],address)","fd221031":"tap()","fd221889":"priceFactorA()","fd222745":"melonport()","fd225cfd":"CoCoCoin()","fd228c0b":"isMintAgent(address)","fd22a6cf":"openGames(uint256)","fd23022a":"Orocoin()","fd232b59":"getEscrowPayments(uint256)","fd241e2b":"mintWithLocked(address,uint256,uint256)","fd2457d7":"clearStorage(bytes32[])","fd253492":"leadingHitCount()","fd255683":"getAddressValue(string)","fd260dfc":"getCertificationDbStatus(address)","fd263390":"setBank(address,bool)","fd26c460":"set_game(string,string)","fd275dd5":"TokenFreezerRules(address)","fd277399":"isService(bytes32)","fd27b51e":"getMarketSize()","fd27ce93":"checkRelease(address,uint256)","fd27d1d3":"getBlockPrice(uint256)","fd282afe":"batchSingleAmount(address[],uint256)","fd28392a":"changeSweepAccount(address)","fd289797":"_canSynthesizeWithViaAuction(uint256,uint256)","fd28feb3":"createInitialItems()","fd2994f7":"totalPointsPerToken()","fd2b4f23":"TheTestCompany()","fd2b6b19":"crowdSaleEnded()","fd2b863d":"produceUnitSeconds()","fd2c3abb":"targetDiscountValue8()","fd2c80ae":"updateInterval()","fd2ce18e":"getPayloadFrom(address)","fd2cee78":"pollEnded(bytes32)","fd2cf77a":"COLOR_BLUE()","fd2d39c5":"positionOf(address)","fd2db3f4":"countTotalInvestorsInCrowdsale()","fd2dba2f":"largeRate()","fd2e9caf":"PendingETH()","fd2ecc3f":"_setLastDate(uint256)","fd2edd76":"TOTAL_LOCKS()","fd306ca7":"transferProfitToHouse()","fd30929a":"disable(address[])","fd32649f":"cleanLog()","fd330b26":"Total_Gamblers()","fd338726":"updatePlayerRewards(address,address)","fd339d18":"testAuthorityTryAuthUnauthorized()","fd345fc2":"totalNominees()","fd34e22e":"addrToForumId(address)","fd35c16d":"createLibra(bytes32[],bytes16[],uint256[])","fd35e71b":"entryPayoutDue(uint256)","fd367f7d":"toggleFeatured()","fd36c3f9":"burnFromAdmin(uint256)","fd37f1d0":"setInv1(address)","fd38af55":"testDebugClock()","fd39b40b":"GameScored(bytes32,int256,int256)","fd39ba59":"totalPreICOSupply()","fd3a77db":"acceptManagership()","fd3ab282":"q()","fd3acb5c":"getRoundOfSixteenResult(uint256)","fd3b34e6":"AddEntity(bytes)","fd3bbba5":"openOrCloseSale(bool)","fd3c1391":"flushShareNext()","fd3c1c43":"wolkAddress()","fd3c4277":"BattleDromeICO()","fd3c4cbf":"bidERC20(uint256,uint256)","fd3c88bd":"MultiVault(address,uint256)","fd3c9144":"intervalTime()","fd3cabc0":"_triggerPVEFinish(uint256)","fd3cb5d1":"doCommunityMinting(address,uint256,int256)","fd3d0dbf":"ioxis()","fd3d8cdc":"registerNameXID(string,bool)","fd3e2d86":"EpayToken(uint256,string,string,uint8)","fd3e50a7":"deliver()","fd3e6a0a":"transfers(address,address,uint256)","fd3ecae6":"changeExtendedTime(uint256)","fd3eefe9":"getAvailableAmount(string)","fd3f1a04":"unapprove(uint256)","fd3f2f66":"changePrivateContribution(uint256)","fd408767":"fireEventLog4()","fd40a1e9":"addMarketItem(bytes16,bytes16,bytes16[])","fd413596":"addBulk(address[])","fd41477f":"previligedLock(address,uint256)","fd414a29":"TOKEN_RATE_20_PERCENT_BONUS()","fd425dd5":"initCopper()","fd42657a":"_currentOwner()","fd426e40":"remainingTokensVIPs()","fd4446f3":"ICOSALE_JOINTTOKENS()","fd460302":"internalPresaleVesting(address,uint256,uint256,uint256,uint256,uint256)","fd4649ae":"UpdateUserPELOBonus(address,uint256)","fd46544a":"deleteAllBioTranslations()","fd467473":"setupFundingRate(uint256,uint256)","fd468aaa":"setPeriods(uint8)","fd473852":"TaiChiCoin()","fd475875":"newInversor(address,address)","fd475fa2":"requestAddAdmin(address,string)","fd478ca9":"getNumParticipants()","fd48cc45":"challenge(bytes32,uint256,string)","fd4931a3":"getUintUsername(address,address)","fd4a343d":"extraMint(uint256)","fd4ad523":"recentlyEndedGames(uint256)","fd4b9d4d":"smalobox()","fd4bd17b":"calculateWineBuySimple(uint256)","fd4c5c9f":"MIN_LEADER_FRAC_BOT()","fd4c8c30":"PlayX20()","fd4d603c":"PS_PRICE()","fd4dabef":"solved(uint256,bytes32[])","fd4dbdf2":"T20coin(uint256,string,uint8,string)","fd4e165e":"RiceFarmer()","fd4e4d75":"addressA()","fd4eeb8f":"isOMICrowdsaleContract()","fd4f4125":"totalEtherHasBeenReceived()","fd4faee0":"Chain1()","fd4ff437":"addWhitelistBulk(address[],uint256[])","fd50299a":"addFeedback(address,uint256,address,string,uint8)","fd507f75":"airdropMultiple(address[])","fd50b005":"buyForWhitelisted()","fd52b3cd":"olumla()","fd52bdd5":"TweetherToken()","fd530c17":"Deposit(bytes20,uint256)","fd531e93":"getCertificate(address)","fd535203":"refundEther(uint256)","fd53e7b4":"admin_active_withdraw(address)","fd54fab8":"calculateBonusTokensAmount(uint256,uint256)","fd554229":"getGidOfRarity(uint8,uint8)","fd55714d":"getTotalCampaignsByCountry(string)","fd557d39":"queryCost()","fd56317d":"ANMvesting()","fd56d4c8":"getControlInfoPerToken(uint256)","fd57e9f9":"deleteElement()","fd57ee6d":"timelock(address,uint256,uint256)","fd58e63a":"setBonusMultiplier(uint256)","fd5a6019":"testUser(address)","fd5a60e1":"killDragon(uint256)","fd5c0663":"distributeBalanceToInvestors()","fd5c40ea":"ELIX_ADDRESS()","fd5c6694":"createGennezise(uint32)","fd5cb32c":"ItemBought(address,uint256,uint256,uint256,uint256)","fd5d173b":"MAX_NUM_OZT_TOKENS()","fd5d3e01":"getContractOrigin()","fd5eddf3":"supplyTokens(uint256)","fd5f1e03":"getParticipantLockedAmount(address,address,bytes32)","fd5f7256":"adminRetrieveContractConfig2()","fd5fde65":"mintTimeLockedTokens(address,uint256,uint256)","fd600107":"BONUS_TIER2()","fd600408":"tpe()","fd607594":"min_payment()","fd609b91":"DelVoteMemberCandidate(uint256)","fd60e1a8":"getReferralCounts()","fd6133a6":"updateTokensAvailable()","fd6180cb":"tokenDividendsOf(address)","fd619dce":"sigBountyProgramAddress()","fd61a725":"getMinimumReportingFeeDivisor()","fd626a86":"sellKWHAgainstEther(uint256)","fd6273a3":"ERC20KKToken()","fd6358ce":"setPricingStrategy(uint256,uint256,uint256,uint256,uint256,uint256)","fd636975":"addWeight(address,uint256)","fd637f02":"TEAM2()","fd63f640":"getLLV_edit_5()","fd645193":"RegistrationBonus(address)","fd64eccb":"isForwarder()","fd651d2c":"TransferBy(address,address,uint256)","fd655073":"balancesForWithdraw(address)","fd6673f5":"getNumberOfPlayers()","fd669810":"close(address,address,uint8,uint256)","fd67db81":"getCharity(uint256)","fd68610f":"getEtherBack()","fd6887af":"queenPrestige()","fd68a422":"returnmoneycreator(uint8,uint128)","fd68e463":"FeitebiToken(uint256,uint8,string,string)","fd68f377":"ethyclos()","fd69f3c2":"getMarketCount()","fd6aad25":"indexOf(address)","fd6b7ef8":"safeWithdrawal()","fd6ba459":"mintCard(address,uint8[14])","fd6bb46c":"addWeb(string)","fd6dd889":"marketTokenCreated()","fd6e1b50":"reportBenign(address)","fd6e3bfe":"setNFTAddress(address,address)","fd6ecb7b":"getReceiptDetails(bytes)","fd6efe80":"DiscCoin()","fd6f4137":"getAdvocate(address)","fd6f5270":"CouponDeposit(address[2],uint256[7],uint8,bytes32[2],uint256)","fd6f5430":"setContent(string,bytes32)","fd70813b":"setTermsAndConditions(string)","fd70b40d":"HashToken(address)","fd70f406":"citiesCount()","fd71b579":"LockMechanism(address,uint256)","fd720090":"right86(uint256)","fd7230d6":"create(uint256,bytes)","fd72a11a":"TorusCoin(uint256,address)","fd72e22a":"operationsWallet()","fd735602":"executeN()","fd7394ae":"IndividualityToken()","fd743f2b":"Coke()","fd747c0b":"rsaVerify(bytes,bytes,uint256,bytes)","fd74a151":"ETH_FUND_DEPOSIT()","fd7560ca":"distributeEarningsBasedOnScore(address,address)","fd75b8d4":"calculateGrantClaim(address)","fd7611c7":"withdrawContractTokens(address)","fd764e68":"transfer(uint256,address,address[],uint256[],uint8[],bytes32[],bytes32[])","fd77905c":"setColorMetadata(uint256,string)","fd7801df":"getCitationLength()","fd782de5":"Proxy()","fd7903a0":"getTeamFromLeaderboard(uint16,uint8)","fd790923":"keyImageUsedUpdate(uint256[2])","fd791031":"gamesFund()","fd793c76":"btg()","fd79c2a9":"ContractName()","fd7a1b00":"forbidDeploy(address)","fd7ab1ad":"chiudi_votazioni()","fd7ac203":"TestToken()","fd7af387":"canTransferBetweenUsers()","fd7c074f":"changeReceivingAddress(address)","fd7c460d":"ciberLottery()","fd7caf4d":"loyaltyCap()","fd7d7948":"getTranformedId(uint64)","fd7e1bee":"freezeTime()","fd7f611e":"createCompany(string)","fd7fc0e0":"invest(uint32)","fd7fe115":"grantAccess(address,bool)","fd7feb35":"cancelWonderSale(uint256)","fd7ffdb8":"recordSystemOnSaleToken(uint256)","fd8055d2":"updateBOTBillingInfo(uint256,string,address,string,string,uint256)","fd809759":"getYearIdx()","fd810eb3":"logAccess(bytes32,string)","fd8113e9":"checkprevowner(address)","fd812e7c":"revealHash(uint256,uint256,bytes4)","fd814dbd":"GameXToken()","fd8258bd":"canIssue(address,address,address,uint256)","fd82902d":"MeowCoin()","fd82a59f":"advisorsTokensVault()","fd83915e":"changeOwnership(bytes32,address)","fd83da09":"lastSaleDate(uint256)","fd83f3e3":"QueueUserMayBeDeliveryDroneCotnrol()","fd842125":"ricardianVoucher()","fd854148":"periodDuration(uint256)","fd85b1a7":"openChannel(uint256)","fd8663d2":"setBuyBackFund(address)","fd86e49d":"token_is_active(address)","fd872458":"PK(address,uint8,bytes32)","fd874a7b":"blockedTimeForBountyTokens()","fd87f2cb":"ADXProxy()","fd8828eb":"rawSetPrice(bytes32,uint256)","fd89a9b5":"enableImpairedTokenContract(address,bool)","fd89d17f":"THIRD_SUPPLY()","fd8ac8d0":"capDay2()","fd8acc42":"buyAuction(uint256)","fd8ae24b":"getTimeLeftInQ1()","fd8b09c2":"ENBToken()","fd8bb681":"earlyBackerList(uint256)","fd8bcf6d":"requestCancelationTime()","fd8be237":"CrowdsaleToken(string,string,uint256)","fd8c6fe4":"RexToken(uint256,address,address)","fd8d4bff":"MoyOpenDistribution()","fd902d1e":"setCutoffs(uint256)","fd904207":"OPTCToken()","fd906c0f":"createClone(address,string,string,string,address,uint256)","fd906ec9":"participate(bytes1[64])","fd909594":"icoGoal()","fd90a668":"allowManuallyMintTokens()","fd911997":"make(uint256,address,address,bytes32,bytes32,uint256,uint256)","fd9133f3":"LOCKTokenCOIN()","fd9168a9":"setRef(uint256)","fd9177b5":"LogMoveMade(uint256,uint8,uint8,uint8,uint8)","fd922a42":"server()","fd923a9e":"setCentsExchangeRate(uint256)","fd925795":"pvt_plmt_remaining_in_Wei()","fd9304cd":"minInvestmentValue()","fd93236b":"bankerEndTime()","fd9393c3":"init(uint256,string,string)","fd93bdb1":"changeRestricted(address)","fd94c80b":"priEtherReceived()","fd958695":"isAlphaNumeric(bytes1)","fd97a008":"autoDividendsFor(address)","fd97c61a":"getgamecardcount()","fd97d3c1":"giveCrypto()","fd9923ce":"asmTransfer(address,address,uint256)","fd994513":"executeVote(uint256[])","fd99a746":"transactionsCount()","fd99c012":"USDTUBESupply()","fd99c6a4":"upgradeCar(uint32,uint8)","fd9a4e61":"transferTokens(uint256)","fd9b41ff":"getCurrentFieldBalanceAndTarget()","fd9b8763":"Multiplier()","fd9be522":"withdrawFee(address,uint256)","fd9bf0a4":"_setPermissions(address,address[])","fd9bf3aa":"mint(address,int256)","fd9e2120":"initPara(uint256,uint256,uint256,uint256,address,uint256,uint256)","fd9e5fbf":"setTimeStaked(uint256,address)","fd9e8ff7":"Shard()","fd9f12b0":"isYellow()","fd9f6856":"lastDepositor()","fd9f9b87":"isOption(address)","fda0078f":"AKTestEther1(address,address,address,uint256,uint256,uint256)","fda03476":"luckySevenBets()","fda08958":"isServer(address)","fda0c61d":"setupWhitelist(address)","fda237f8":"genesisToken()","fda263e8":"timeEnd()","fda27af2":"claimSiteToken(uint8,uint256)","fda49eb4":"treasurer()","fda69fae":"getInt(string)","fda76eef":"RewardsGiftToken()","fda78599":"ecoSystemWallet()","fda79925":"complianceAddress()","fda80435":"c_MinInvestment()","fda86c95":"internalRevokeCert(bytes32,bytes,bytes32,bool,uint256)","fda92d3e":"ErrorMsg(string)","fda962d3":"totalGenesisRecipients()","fda9aafe":"WyzonCredit()","fdaa2632":"UploadURL(uint256,string)","fdaa94de":"deleteAddr(address,bytes)","fdaacf1b":"transferOwnerMoney(address)","fdab1b7b":"getCurrentAuctionPrice(address,address,uint256)","fdab5627":"_approveCertificate(uint256,bool)","fdac0025":"cups(bytes32)","fdac3a20":"set_eth(uint256)","fdac9ff7":"setAttributeValue(address,bytes32,uint256)","fdacbecd":"geteths(address)","fdacd576":"setCompleted(uint256)","fdad711d":"setFinalPayoutDistributionHash(bytes32)","fdade29f":"BuyBooster()","fdae3b70":"proofOfSms()","fdae8a4c":"isAddressInBlackList(string,address)","fdaed331":"getTransferedUser(uint256)","fdaed778":"testConcatStorage32Bytes()","fdaf150c":"abc_initNetwork()","fdaf22e8":"minutos()","fdb04023":"closeVirtualChannel(bytes32,bytes32)","fdb31d10":"_createToken(string,bytes5,string,string,string,string,string,address,uint256)","fdb357be":"getVotingForCount(address)","fdb39c40":"userNameHashTaken(bytes32)","fdb406cb":"outstandingTokens(address)","fdb473b1":"unsetMyName()","fdb4dbe0":"totalEgg()","fdb5a03e":"reinvest()","fdb7b065":"marketDataOracle()","fdb7d435":"TEC(uint256,string,string)","fdb837e8":"GetTotalClicks()","fdb89360":"ParkCoin(uint256,string,string)","fdb914e2":"capPreSale()","fdb986cc":"NiobiumToken()","fdbab5f5":"PUBLICSALE_ENDTIMESTAMP()","fdbaf779":"internalBuyTokens(address,address)","fdbb16fd":"setEthPercent(uint256)","fdbb5aee":"ChannelNewBalance(address,address,uint256,uint256)","fdbb9fdb":"UNJUST(string,string,uint256,uint256,bool)","fdbc368a":"_ensureNewUser()","fdbc4006":"getCandidateList()","fdbc6530":"updaterAddress()","fdbc938d":"BlessingChainAlliance()","fdbd2534":"acceptCoinSale()","fdbd8dd8":"investInternal(address,uint256)","fdbd956d":"oraclize_query(uint256,string,bytes[],uint256)","fdbda9a7":"parentChange(address)","fdbdc112":"backersIndex(uint256)","fdbf0765":"hash(bytes20,uint96,uint32,bytes32[],uint16)","fdbf17d0":"computeFinalStake(uint256)","fdc0713b":"getMinAuditPriceCount()","fdc193a4":"test3Fails()","fdc202f1":"Ticket(string,uint256)","fdc24095":"returnMasterNodes(address,uint256)","fdc272fe":"getTokenVolumebasedBonusRateForPhase3(uint256)","fdc292ea":"token(address,address)","fdc35112":"LogBuy(address,uint256,uint256)","fdc37c85":"securityCheckURI()","fdc3d8d7":"nextTaskId()","fdc40466":"maxInterestTime_()","fdc4741b":"addRecToQueue(address,uint256)","fdc487a7":"FundWithdrawl(address,address,uint256)","fdc4b338":"authorizeExtension(uint256,bool,string)","fdc4c3eb":"reservedWithdraw()","fdc5bf2c":"releaseToBuyer()","fdc61dd1":"coinAddress()","fdc63c5c":"aprobarMensaje(uint256,uint8,string)","fdc65c8c":"stakingBonusTokens()","fdc69291":"_adjustSupply(address,uint256)","fdc89f73":"toPowerOfThreeHalves(uint256)","fdc967e5":"jDallyCoin()","fdc98399":"getCurrentBuyerRateInPermilles(bool)","fdc99064":"unregisterNotary(address)","fdc9d0f4":"Telegram()","fdc9e72d":"_ownMint(uint256)","fdcb6068":"accessManager()","fdcb7539":"contruibuteData(bytes)","fdcbd0ec":"_deleteMinion(uint32,uint8,uint64)","fdcbd9b0":"GatewayStatusUpdated(bool)","fdcc6be3":"claimedPreICO(address)","fdccf45e":"computeCurrentPriceImpl(uint16,uint64)","fdcd0a18":"isRefundsEnabled()","fdcd649e":"EthAnte()","fdcd86ab":"addBets(bytes32)","fdce7f5e":"JinglesOpened(address,address,uint256)","fdce8e02":"checkHash1(address,uint256,address,uint256,uint256,uint256)","fdce9565":"determineWinner(uint256[7][],uint256[7][])","fdcea342":"fixPlayerMiddlename(uint256,string)","fdced779":"KozzProjectToken()","fdcf154c":"SODCOIN()","fdcf6f16":"getTopCompanyAtIndex(uint256)","fdd0298e":"PresaleAdded(address,uint256,uint256)","fdd080a4":"activateSaleContract(address)","fdd12c5e":"r(address,address)","fdd1a4e9":"externalCheckSign(bytes32,bytes,address)","fdd245ee":"referralLinkMinimum()","fdd2f2b0":"TIME_MULTIPLIER()","fdd3a879":"quick()","fdd3af8f":"fillTrade(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)","fdd3c1a1":"distributeTimelockedTokens(address,uint256,uint256)","fdd3e3ff":"_removeAuction(uint256)","fdd3ea94":"submitPeerReview()","fdd42e29":"TokenOTBC(uint256,string,uint8,string)","fdd4fd69":"penaltyDisbursalAddress()","fdd5828f":"massPay(address[],uint256)","fdd6a803":"readowners()","fdd6df8c":"mul2Require(uint256)","fdd7d87b":"decline(address,address)","fdd868df":"getTracks(uint256,uint256)","fdd8a733":"TokenCoinExchanger()","fdd8ed02":"BetPlaced(uint256,uint256,address,uint256)","fdd96ae0":"compensateContributors(uint256,uint256)","fdda3d8a":"setVicepresidenteDeMesa(bytes32,uint256,uint256,uint256)","fddaf68a":"getTipperPercentage(uint256,uint256)","fddb4683":"ERC20(string,string,uint256)","fddb7ef0":"mainSaleBonuses(uint256)","fddbcca5":"pause_4()","fddc4686":"getOwnedAssetsLength()","fddc5545":"BitHaus()","fddcbd09":"burnByCreator(address,uint256)","fddcc148":"iterator()","fdddb3ae":"Athena()","fddf0fc0":"ethRaised()","fddf16b7":"INTERFACE_SIGNATURE_ERC721()","fddf4e3b":"_packCombinedParams(int256,int256,int256,int256,int256)","fddfec78":"allowTransfer(address,address)","fde045b9":"HODLaddress()","fde07212":"Betting()","fde074c8":"betAddrsCount_()","fde0a64d":"admin_inactive_payable()","fde1276a":"removeDiscount(address)","fde17733":"demiseCEO(address)","fde1ee44":"addAttestation(string,bool,address)","fde20b6c":"tipPercentageLocked()","fde34dc4":"finalize(uint256,uint256,bytes32)","fde3cbd6":"NucleusVisionCoreToken()","fde440bb":"setPayoutNumeratorsValue(uint256[])","fde45344":"untrustContract(address)","fde46b03":"_set1()","fde4b39d":"updateStages()","fde4d9bf":"setAutoPrice()","fde5ca7d":"calcDevReward(uint256)","fde5e124":"t_Andrey2()","fde63e96":"CreateSpecialPlayer(bytes32,uint8,uint8,uint256,uint256,address)","fde6adb1":"placeBet(uint256,uint256,uint256,uint256)","fde7c834":"increase_bounty(address)","fde83a34":"tokensForTeam()","fde90733":"isRequestingEscapeTo(uint32,uint32)","fde9683d":"ICO_DAYS()","fde99668":"removeOrder(bytes32)","fde9ba41":"transfer(bytes,address,uint256)","fde9cded":"whichAuction(uint256)","fde9e506":"calcDividendsSum(address)","fdea8e0b":"presale()","fdeb49b0":"allocationsLength()","fded813c":"getInvoiceBalance(bytes32)","fdee38a9":"ETH_TLD_NODE()","fdee4ff9":"setExpectedReturn(uint256)","fdee579c":"MINfinney()","fdee5c22":"THAWING_DURATION()","fdee60e9":"peloExtenstion()","fdee69f4":"calResult()","fdef9106":"hasPermission(address,address,bytes32,bytes)","fdf061f0":"adminWithdrawBalance()","fdf0d8e0":"get_account_balance_token(address)","fdf1a434":"updateMinInvestmentForIco(uint256)","fdf1aba0":"check1(uint256,uint256)","fdf31b39":"incrementTasksCompleted(address)","fdf372ad":"niceguy2()","fdf3b97f":"calculateVestedTokens(uint256,uint256,uint256,uint256)","fdf3fa53":"RemoveCategory(uint256)","fdf54c98":"SocialNode()","fdf55523":"numRefCredits(address,bool)","fdf56d57":"voteElection(uint256)","fdf58814":"getLLV_edit_3()","fdf62f05":"createEngine(uint256,string,uint256,uint256,uint256,uint256)","fdf6393c":"removeExistingDiscount(address)","fdf762bb":"TEAM_AND_ANGEL_SUPPLY()","fdf78f70":"unlockStatus(address)","fdf7983a":"safeTransferChild(address,address,uint256,bytes)","fdf8e11c":"getTotalAngels()","fdf97cb2":"trustee()","fdfa571e":"getDrawStatus(uint32)","fdfac8e5":"BMC()","fdfcb425":"activate(address,uint256,uint256,uint256,bool,bool)","fdfd5b43":"determineWinnerScript()","fdfecb0c":"isEcoAllocated12()","fdff31ed":"getPairSellLoyaltyPerc(address,address)","fdff6b30":"testInitialBalanceUsingNewContract()","fdff85b4":"CONFIG_RETURN()","fdff9b4d":"managers(address)","fe0030d9":"IRPToken()","fe00344a":"AuctionCompleted(uint256,uint256,address)","fe006839":"INITIAL_SUPPLLY()","fe00779e":"removeBountyAddresses(address[])","fe007eeb":"SmartRouletteTokenDividend()","fe00b3a3":"kosacafToken()","fe0149a0":"ZQCToken()","fe01ee96":"Clearing(address,uint256)","fe01f1ff":"TokenTester()","fe01ff62":"verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2])","fe02739c":"releaseJackpot()","fe029156":"swap(address,address,uint256,uint256)","fe038093":"createTeams()","fe04a5bc":"senderMIT()","fe04cb1d":"setStatusPrice(uint256)","fe052bc6":"minimumInvestmentInWei()","fe05e8b1":"assertFact(uint256,string)","fe05f7c2":"destroyforeth(uint256)","fe06a915":"totalMTPAllocated()","fe082a21":"SFEscrow()","fe085775":"PresaleAllocation(address,uint256,uint256)","fe08e5fe":"setGalleryTwoPrice(uint256)","fe0904e6":"minerDifficulty()","fe094708":"Map(address,address,uint256,uint256)","fe098371":"findFrozenCell(address,uint128,uint128)","fe0a2c30":"returnArrayBytes1(uint8)","fe0a5ab0":"BLOCKS_BUCKET_SIZE()","fe0ba34e":"placeSellRequest(uint256,uint256,uint256)","fe0c4085":"vestingEnded(address)","fe0d94c1":"execute(uint256)","fe0dadd7":"teamTwoTotalPlayers()","fe0f2fab":"ChangeClaimAddress(address,address)","fe10d836":"setTokensToBeClaimed()","fe110116":"transferToPool()","fe12aeec":"SalesAgentAppointed(address,address)","fe1391ad":"generateFixtures()","fe13a823":"computeResponseFirstHalf(uint16)","fe13b118":"beginDutchAuction(uint256,uint256)","fe13baf7":"_encodeTokenId(int256,int256)","fe1439b4":"setCTO(address)","fe14b085":"walletUserCount()","fe164a5b":"setWhitelistThresholdBalance(uint256)","fe168eef":"_isNoNeedInCountryLimitChange(uint256,uint256,uint256,uint256,uint256,uint256,uint256)","fe16e862":"transactionsOnForHolderUpdate(address,uint256)","fe173b97":"gasPrice()","fe1798a7":"randomAttack()","fe1829b6":"extendPublicSaleDiscountEndTime(uint256)","fe1865cd":"setCompte_26(string)","fe188184":"lastWinner()","fe18d6e6":"convertToEth(uint256)","fe18f82a":"getReceivedFunds(address)","fe192f1e":"parseIntRound(string,uint256)","fe195767":"distributeEPAL(address[])","fe19f495":"VESTING_CLIFF_DURATION()","fe1b0a5c":"setHardCap(address)","fe1b588f":"CoinExchange()","fe1b602a":"getPVPCycles(uint32[])","fe1b6f8f":"getVendorName(address)","fe1bae83":"callforhelp(uint256)","fe1c5aac":"SetParticipantURI(address,address,string)","fe1c91fa":"performWithdrawAccounting(uint256,address)","fe1cdbb8":"Module(address)","fe1ce5d7":"checkOwner(address,address)","fe1d2295":"BankWithdrawal(address,uint256)","fe1d470d":"calculateDiceProfit(uint256,uint256)","fe1da528":"tokensByEurTx(string)","fe1dcbb1":"AuthorizeOperator(address,address,bool)","fe1e079e":"getNumAnimalsXPlayer(address)","fe1ebb04":"augmintReserves()","fe1f06ea":"IQIAN(uint256,string,uint8,string)","fe1f11f1":"getNbits(bytes)","fe1f6a0b":"createGame(bytes32,address)","fe1fd352":"validEmitBuff()","fe211279":"testPrintableToken()","fe213712":"USER_GET_PRIZE()","fe229b61":"_softRequire(bool,bytes32)","fe229f7c":"RecToken()","fe22fcd8":"issuanceLastModified(address)","fe230675":"hasRecord(address)","fe23583d":"fechVoteResultForCandidate(address)","fe23b262":"currentPreICObalance()","fe23baea":"setHashByWriter(address,bytes32,address,bytes32)","fe23c6d1":"BetWon(address,uint256)","fe2450c1":"challengeRewardsPercent()","fe2506a4":"buyFromBal(uint256,uint256,bytes32)","fe2545dc":"purchaseFromVault(uint256)","fe25e00a":"arbiter()","fe26063f":"getTradeAndHash(uint16,address,address)","fe261ab0":"boolToUInt(bool,bool)","fe2622a5":"AgriChainDocuments()","fe2644c6":"creator_fee()","fe26cdeb":"And(bytes32,bytes32)","fe26da0c":"publicGetState()","fe26f16f":"withdrawABIHash()","fe275280":"Silver()","fe277aba":"chAllowAirdrop(bool)","fe280f2b":"roundInfo(uint32,uint32)","fe2830d3":"PausableCrowdsaleImplPaused(uint256,uint256,uint256,address)","fe28d1d8":"CROWD_WAVE2_BONUS()","fe29fc12":"CategoryCapSet(uint256,uint256)","fe2a4e62":"lockAndDistributeTokens(address,uint256,uint256,uint256)","fe2b6246":"updateMaxMinComparables(uint256,uint256,uint256,uint256)","fe2c6198":"price(string)","fe2ca553":"setBalances(uint256,uint256)","fe2cce6f":"PaylessMinisplit()","fe2cec21":"NeobitToken()","fe2d8933":"preIcoInvestors(address)","fe2da970":"getUserByUsername(bytes32)","fe2dac15":"LogNewQuestion(bytes32,address,uint256,string,bytes32,address,uint32,uint32,uint256,uint256)","fe2dc64b":"finalizeProposalVoteResults(bytes32,bytes32)","fe2e306b":"playe2Bid()","fe2e5db4":"SwapyExchange(address,address)","fe2edc1e":"retrieveFinished()","fe2fdf0b":"determineAllocation(address[],uint256[])","fe2ff4cf":"TokenSold(address,uint256)","fe31da3b":"disapproveByB(uint256,string)","fe32a6a7":"pushICO(uint256)","fe32c448":"TokenHolder(address)","fe332a0c":"backDARFtokenOwner()","fe33ada9":"isExistFounder(address)","fe353a5e":"checkWithdrawValueForAddressFX(address,uint256)","fe353d28":"_computeNextGen0Price(uint256)","fe35530c":"setUserWithdrawalAccount(address)","fe35804e":"createLottery(uint256,uint256)","fe37f21a":"changelp17(address)","fe389e09":"removeContract()","fe38ed66":"MarketManager()","fe396c71":"mintEarlySupportersTokens(address,uint256)","fe399121":"referrerEarnings_()","fe3b24b1":"createBBODocument(bytes32,uint256)","fe3c333b":"getActiveJudgmentByParty(address)","fe3c458e":"addContract(bytes32,address,bytes32)","fe3c51df":"getTeamId(string)","fe3c5d80":"becomeSnailmaster()","fe3c6ad4":"addclip(address,string,string,string)","fe3c9b6b":"setIcoEndTime(uint256)","fe3ce632":"lookup(bytes4,bytes)","fe3d002b":"AllocateAngelTokens(address,address,uint256)","fe3d07e4":"decrementInventory(uint256,uint256)","fe3d2236":"Oracle_ChangePeriod()","fe3e0efd":"TestERC20Token(string,string,uint256)","fe3ead72":"interreducemoney(address,uint256)","fe415139":"ProdPublicSale()","fe4170bc":"setDepositLock(bool)","fe417fa5":"claimTokens(address,uint256)","fe41b2da":"setInitialValidators(address[])","fe4215f7":"read_recast_config()","fe4259e3":"isMntpMigrated(address)","fe42cb2d":"setTokenExpectedFee(address,uint256,uint256,address)","fe42da15":"deleted(string,string,address,uint256)","fe435f6b":"getLLV_edit_33()","fe43be3f":"startDestruction()","fe442478":"sendFromContract(address,address,uint256)","fe44a664":"generateWithdrawalHash(string,uint256,address,uint256)","fe44d401":"MoncionToken()","fe4520ad":"_getOwnerTokens(address)","fe45c996":"reVerifiPost(uint256,bool,bool)","fe460201":"getTermsAndConditions()","fe4667e9":"getMaxLossAfterTrade(address,uint256,uint256,int256,int256)","fe47a2ad":"multiRequestAudit(string,uint256,uint256)","fe47a8a7":"totalFunding()","fe47c806":"processFunding(address,uint256,uint256)","fe47d34f":"USC(uint256,string,string)","fe49a9be":"ethGiven(address)","fe49ba1c":"getUnlockIdentifier(uint256,address,address)","fe49dd5f":"halveEntryPrice()","fe49e949":"requestChangeInsuranceFees(uint80,uint80,uint80,uint80,uint256,uint80,uint80,uint256)","fe4a3ac9":"setExecPrice(uint256)","fe4a3e5c":"TokenrateUpd(uint256,uint256)","fe4b84df":"initialize(uint256)","fe4c39fe":"setMaxArenaOneDay(uint256)","fe4c6b08":"_deliverTokens(address,uint256,uint256,uint256)","fe4caa64":"isAborted()","fe4cee66":"numberOfPartitions()","fe4d2a02":"_setupStages()","fe4d62f9":"getMiningKing()","fe4dd8d9":"getTokenApproval(uint256)","fe4e4a84":"exchangeIsRegistered(address)","fe4e6bf9":"queueMint(address,uint256,uint256)","fe4ee216":"transferTips(address,uint256,address,uint256,uint8,bytes32,bytes32)","fe4f7e11":"KangenToken()","fe501c6f":"ChannelSettled(uint256)","fe50cc72":"getGreeting()","fe50ce60":"getBloodlineFromParents(bytes32,bytes32)","fe51717a":"releasePause()","fe51c588":"changeFactoryAdmin(address)","fe52ee70":"setStartingTokensAmount(uint256)","fe530027":"trusteeWithdraw(uint256)","fe536ebe":"setPreferredSaleStartAndEndTime(uint256,uint256)","fe537a82":"upgradeTarget()","fe549815":"pendingTokenBalance()","fe54b5fc":"kyberHash()","fe553250":"adminTransferWorldBalance(uint256)","fe556cf0":"CirculationSupply()","fe55932a":"setName(uint256,string)","fe562ee6":"moveBlockValue(address,uint8,uint8,uint8,uint8,uint256)","fe5675cc":"toNext()","fe56e232":"setManagementFee(uint256)","fe56f5a0":"setEntranceFee(uint256)","fe5709c2":"getSlotWeight(uint256,uint256)","fe5709cd":"createPainting(uint256)","fe575a87":"isBlacklisted(address)","fe5815a6":"hasFinished()","fe58d3a3":"timeLimitEnable()","fe599559":"updateEthToUsdExchangeRate(uint256)","fe5a4e2d":"contractorReleaseFunds(bytes16,address,address,uint256,uint256)","fe5aa8e0":"getUserIndexOnToken(address,address)","fe5ba303":"reservesPerUnitToken()","fe5d5868":"XZBX()","fe5daae6":"_queAmount(uint256)","fe5e1853":"totalBet()","fe5e7e3e":"endICO14()","fe5f1dc4":"PRESALEPLUSCROWDSALE_EVE()","fe5f2e88":"refund(string)","fe5ff154":"recruitHeroFee()","fe602c65":"is_proposal_supported()","fe60d12c":"reserved()","fe60ed81":"changeUserGroup(address,uint256)","fe6129d5":"setPromoBonus(address,uint256)","fe61303b":"createGuardianSale(uint256,uint256,uint256,uint256,uint256,uint256)","fe6214c4":"LDTCrowdsale()","fe62a0a6":"transferFromPretgefund(address,uint256)","fe63300a":"registerExternalBill(uint256,address,address,uint256,uint256,uint256)","fe637e5e":"getScoreChange(int256,int256)","fe63d701":"removeQueueElement(uint256)","fe647394":"setTeamProfitAddress(address)","fe64d6ff":"changeAddress(address)","fe65066e":"setUsdMnr(uint256)","fe65bb65":"cashHistory()","fe669c26":"addPhase(uint256,uint256,uint256,uint256)","fe675deb":"Exchange(address,address,address,address,bytes32,uint256,address)","fe675f13":"toggleFieldActivation(string)","fe67a189":"finalizedTime()","fe67a54b":"endAuction()","fe687b2b":"teamc()","fe68b528":"getExchangeInformation(address)","fe68e285":"toNextStage()","fe68f73b":"getTargetBudget(uint256,uint256)","fe69c926":"onFrozenToken(address,uint256,uint256)","fe69dacd":"validDraws(address,uint256,uint256[])","fe6a0cd6":"hasNextSeedHashB()","fe6ad6c6":"isNotarized(bytes32)","fe6bca8f":"AllTest7()","fe6c19a4":"HelixexToken()","fe6cf9ee":"Krypticion()","fe6d4305":"ALC_DECIMALS()","fe6dcdba":"top()","fe6e0441":"minimalWeiTLP1()","fe6f0d82":"testConstructorEvent()","fe6f1b05":"percentDivider()","fe6f2a60":"matches(bytes32,bytes32)","fe6fef44":"setTokenQuota(uint256)","fe7009f2":"getSupplier(address)","fe704c1f":"RWQToken(uint256)","fe70a123":"KilledTokens(address)","fe70f417":"getNewForkReputationGoal()","fe71aec5":"LittleCactus()","fe71be6e":"monarchToken()","fe72277d":"addHashType(bytes32)","fe7279b1":"setTokenTransferFeeReceiver(address,address,address,address)","fe72ac7f":"newPrice(uint256)","fe72e717":"toDie(bytes)","fe72f3be":"addMember(string,string,string,uint256,string,string,uint256,string)","fe73bf21":"developer_edit_text_Exchanges_links(string)","fe73e3ec":"preliminaryGameResult(uint64)","fe73f74c":"withdrawTokenFromTAR(address,uint256)","fe742c6a":"millionInCents()","fe74f05b":"assertEq(int256,int256)","fe757fb5":"lastClaimPrice()","fe758a1e":"_timelimitCal(address)","fe75dff6":"GcoinProto()","fe75ff54":"runLottery(uint256)","fe76fbe3":"setStageOpeningTime(uint8,uint32)","fe777bcd":"etherForSale()","fe77adda":"reloadTickets(uint256,uint256,uint256)","fe77f5e5":"getCostToNextLevel(uint256)","fe7805f2":"MultiSigWallet()","fe786c5f":"prependUnderscore(string)","fe79bfd0":"giftCode(string,address)","fe7baf8e":"RemoveAuthorityAddress(address)","fe7bf05e":"deathData_v6()","fe7ccb79":"CCN()","fe7cd999":"registerForICO(address[],uint8)","fe7d1587":"canCall(address,address,address,address,bytes4)","fe7d8740":"getFreelancerContracts(address,uint256[],uint256[])","fe7e187f":"add_kycer(address)","fe7eba06":"getCurrencyLength(uint256)","fe7f0d14":"DST_BOUNTY()","fe800489":"totalUnitsLeft()","fe802d7f":"isMHTHolder(address)","fe8190ce":"test_v1()","fe8252f3":"withdrawlEnabled()","fe830334":"initToken(string,string,uint8,address,uint256,bool)","fe8311db":"sendLimitTokensToPartner(uint256)","fe8312c1":"validateWallet(address,bool,string)","fe836931":"freezeAmount()","fe8370bb":"NinjaCoin()","fe84bff5":"getTransferValue(uint256)","fe84c5ec":"fixedExpUnsafe(uint256,uint8)","fe853650":"getRandomHashesLength()","fe856722":"gasPrc()","fe859472":"PractiParlezToken()","fe86338c":"cancelOrderList(bytes32[],uint64[])","fe86de13":"testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address,bool)","fe8705d5":"throwOnIncompatibleContract()","fe87ee28":"endRC()","fe8806f5":"removeRequest(address,address)","fe882fe2":"getValueAndBox(address)","fe88fc00":"balancsHolder(address)","fe892327":"DML_TOTAL_SUPPLY()","fe8925f4":"interestFeePercent()","fe89a6c1":"MAX_ALLOWED_STAGE_1()","fe8a7458":"_isLowercaseLetter(bytes1)","fe8b2707":"depositedEtherGeneric(address,bytes4,address)","fe8b6642":"setEnforceRevisions(bytes32)","fe8beb71":"getVersionFor(address)","fe8cbe18":"LogBidWithdrawn(address,uint256,uint256)","fe8d640c":"setifoodCommunityAddress(address)","fe8d8c77":"setShouldGateGuard(bool)","fe8e6a63":"quarryCities(uint256)","fe8e992f":"unpackAllocation(bytes32)","fe8f4763":"ROYBOITokenIToken()","fe8f4bbe":"freedWinPoolToWinSystem()","fe8fb49f":"setLastMaxInvestments(uint256)","fe908b7a":"pay(bytes32,address,address,uint256,uint256,bytes)","fe90f3df":"WPAYCoin()","fe91d37f":"semanticVersionHash(uint16[3])","fe92049d":"submitAnswerByArbitrator(bytes32,bytes32,address)","fe925e80":"createLoan(address,address,address,uint256,string,uint256,uint256,uint256,uint256,uint256,uint256)","fe937fa4":"setEndMintDate(uint256)","fe949159":"sendMessageToChannel(string,string)","fe94e504":"setColor(uint8,string)","fe95112c":"faythe()","fe95a5ce":"hat()","fe95cbdd":"getAgentsWithService(uint256)","fe95ec9c":"popcnt32(uint32)","fe968ade":"putStcWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)","fe972054":"create(string,string,uint8,uint256,address,uint256,uint256,uint256)","fe972f11":"_toMill(uint256)","fe97bcf4":"RandomNumberGenerated(uint256,uint8)","fe97e481":"maxCap_MInt()","fe97ee88":"hasPhone(address)","fe98184d":"trustedUniverseTransfer(address,address,uint256)","fe985cb9":"buyin(address)","fe98f1d1":"testCantFinalizeIfNotMultisig()","fe99049a":"transferFrom(address,address,uint256,uint256)","fe992c98":"balanceOfAll(address)","fe996956":"PMET(uint256,string,string)","fe9a3664":"supportList(address)","fe9b7f2f":"maxAmountETH()","fe9bb2da":"setCSCFactoryERC721(address)","fe9bf404":"createManager(address,address)","fe9c3c28":"purchaseHalted()","fe9cc7f4":"VebEX()","fe9ccc1e":"maxBetWei()","fe9d2828":"getPI_edit_11()","fe9d7121":"StorageEther(address,address,address[],uint256,string,string,uint8)","fe9d744d":"buyBulkRegularCar(address,uint256[],address)","fe9d9303":"burn(uint256,bytes)","fe9e1c0f":"buyTokens_Vault(address,uint256,bytes8)","fe9fa16f":"testThrowExecuteSellOrderTwice()","fe9fab4d":"setPrices(string)","fe9fbb80":"isAuthorized(address)","fea1377d":"USD_HARD_CAP()","fea22ae4":"newMinimumTokens(uint256)","fea277dc":"withdrawERC721(address,uint256,address,address)","fea2920e":"createNewDraw()","fea45621":"changeTotsupp(uint256)","fea5d7b1":"mgmtIssueBountyToken(address,uint256)","fea5d9e0":"lengthEqual(uint256[],uint256,string)","fea708f6":"totalPeriods()","fea78df4":"buyGold(uint256,uint256,uint8,bytes32,bytes32)","fea7bcfb":"additional(uint256)","fea8ae97":"MakerWithdrewERC20Token(address,uint256)","fea9b572":"MAX_NUMBER()","feaa29d8":"insertProfitHere()","feaa4cf3":"updateIntention(uint256,string,string,string)","feaaa476":"BurnToken(address[])","feac36d7":"insert(bytes32,bytes32)","feaceab4":"addPayment(string,address,string,uint256,uint256)","fead0097":"setTotalUnvestedAndUnreleasedTokens(address,uint256)","feadce9c":"servicePause()","feadfdbd":"getTimeFromPrize()","feaea586":"recoverToken(address,address)","feaed589":"releasedMarketingTokens()","feaf0872":"getTokenTransferCount()","feaf1fe1":"registerToBlacklist(address)","feaf653d":"sendEth(address[],uint256)","feafb79b":"foundationAddr()","feb03fe1":"_handleProductionIncrease(address,uint256)","feb088ab":"openingTimePeriodTwo()","feb2432a":"addMediator(address)","feb272e4":"noDuplicates(bytes)","feb27ac9":"Proof_of_Tacos()","feb2a20c":"apiAccessDisabled()","feb31939":"attack(address,uint256,uint256[])","feb371cd":"VUP_TOKEN_SUPPLY_TIER2()","feb4ad89":"addEarlyPurchases()","feb4c708":"nextIdentityAccount()","feb50430":"getLevitatingKittens(bytes32,uint64)","feb5d106":"getBPCount()","feb7267b":"deleteMintable(address)","feb7d2fb":"KoniosToken(uint256,string,string)","feb80ee4":"stakeFromTokenContract(address,uint256)","feb99390":"add(uint128,uint128)","feba95fb":"purchaseFor(uint128,address)","febb0f7e":"bar()","febb1315":"gasLimitInWei()","febb5407":"currentLiquidity(address)","febc14b1":"roundCounter()","febc2980":"calculateWinnersCount(uint256)","febc8c39":"feeAffiliate()","febc9dec":"stringEquals(string,string)","febdb9b8":"rewardWinner()","febe4909":"approve(uint256,address)","febe8129":"destrcut()","febec059":"GetCurrentTypeSaleCount(uint256)","febefd61":"startAuctionsAndBid(bytes32[],bytes32)","fec07cb2":"calculateTally(address,uint256)","fec0cc19":"setIcoPhase4(uint256,uint256)","fec1aa12":"codetokenIndexToApproved(uint256)","fec1c41f":"AddNewBooster(uint256,int256,uint256,uint256,uint256,uint256,uint256)","fec2e27b":"acceptManagement(string)","fec320f4":"ListPairsForReserve(address,address,address,bool)","fec35182":"Crowdsale(address,uint256,uint256,uint256,uint256,address,address)","fec3e941":"MintAndTransferIAC(address,uint256,bytes32)","fec3fbe2":"functionTwo(uint256,uint256,uint256,uint256)","fec5438c":"costToCallOraclizeInWei()","fec568d4":"TransactionCompleted(uint128,uint256,uint256,string)","fec5c5f7":"FINX2Token()","fec5d3b0":"BTCRate()","fec69a87":"OneStandardToken(uint256,string,uint8,string)","fec6c66e":"applyFromCertificate(string,string,string,uint256)","fec74d31":"eolBlockNumber()","fec7c0a2":"FRPRUPEES()","fec7fc8e":"isSigned(bytes16,address)","fec84aac":"LogUserAddedToWhiteList(address)","fec8db83":"C3_TokenCreate(uint256,string,string)","fec966df":"countSmartSharingContract()","fec97c03":"finishFundraiser(uint256)","fec9cd77":"allowanceToBurn(address,address)","fec9dc1f":"updateNewToken(address,address)","fecab4bf":"vreoSaleOngoing()","fecadafd":"pushAtom(uint64,uint8,uint8,uint8,uint32,uint64,uint64,uint128,uint128,uint32)","fecc36c0":"fun(int256)","fecca5a5":"checkMyDonation()","fecd3486":"getTulip(uint256)","fecd817c":"cancelBuy()","fece5543":"mock_remove(address,address)","fecf9959":"withdrawTokens(uint256,address,uint256)","fed03118":"getTDETokenExchangeRate(uint256)","fed0827e":"RoseCoin()","fed09b2f":"isFemaleSale()","fed0b877":"distributeAirdropMulti(address[],uint256[])","fed0d2a1":"sellMultiplier()","fed1c977":"blockTransfering()","fed1cec2":"addWinners(uint256)","fed2063c":"mintDataStream(address,uint256,bytes32,bytes32,uint256)","fed23223":"sellFirst(uint256)","fed26772":"zeroFeeTransferByowner(address,address,uint256)","fed39929":"productOwner(string)","fed3a300":"right89(uint256)","fed3b141":"Coinbase(uint256)","fed3f18d":"admin_inactive_withdraw(address)","fed4614b":"funeral(bytes,int256)","fed4de76":"addAuthorizeRole(string,string,string)","fed503cd":"transferCoinInStages(address,address,uint256,uint256)","fed73b54":"getPlayerIdOfIndex(uint256,uint256)","fed7bb07":"getSeedAmountForGameId(uint256)","fed82ef3":"setSanityBounds(uint256)","fed8a53b":"callbackInsertApproveAndDistribute(uint256,address[],uint256[])","fed8b30a":"canSettleOrder(uint256,uint256)","fed8f40f":"invalidateMail(uint256)","fed9981e":"setDemocAdminEmergency(bytes32,address)","fed9d44f":"ARBITRARY_VALUATION_IN_ETH()","feda1045":"slaveWallet()","feda38bc":"setCrowdsaleOpen(bool)","fedabacf":"claimPrepaid(uint256,uint256,uint256,string,uint256)","fedb6dfd":"TACTICALCRUISER_FTL_SPEED()","fedbceba":"getRankLandLimit(uint256)","fedc2a28":"_rewardWinners(string,uint8,address[])","fedce093":"TheNextBlock()","fedda73b":"HC8ICO()","fedda89c":"claimVesting()","feddb41c":"peculOld()","fede04c3":"reject(uint32,int256)","fede5cc6":"issueInternal(address,uint256,bool)","fedeac70":"handleQuickCloseChannel(address,bytes32,address,uint256,address,uint256,uint256)","fedf1ed8":"getCompte_21()","fedfd535":"Config()","fedfe46c":"vote(address,uint256,uint256,uint256)","fedffec0":"currentReferralPercent()","fee01177":"getTopics()","fee0596f":"createContractCompany(string)","fee13823":"ChargeTreasure()","fee1396b":"registerNewRecord(bytes32)","fee160be":"CarFare(uint16,uint16)","fee16841":"showDeposit(address)","fee21471":"getDayIndex_(uint256)","fee24454":"sendNowLastCount()","fee2cb05":"R2()","fee3154c":"setTransferWhitelist(address,address,bool)","fee35ff8":"newInvest(uint256,address,uint256)","fee4f84d":"CryptopusToken()","fee692a3":"getAutomatedReportDisputeDueTimestamp()","fee6d28c":"addSnapshot(string)","fee7e35d":"tokenURISafe(uint256)","fee8775b":"Ping(address)","fee87e3b":"addresstoBytes(address)","fee99898":"getFee(address,address)","fee99e93":"HPAToken(uint256,string,uint8,string)","fee9aa44":"calculateRewardForAddress(address,address)","fee9ca13":"continueSale()","feea01b9":"create(bytes16,uint64,bytes)","feea799b":"rejectTransaction(uint256,bytes)","feec6fc1":"Tegchain(uint256,string,string)","feec756c":"updateRecipient(address)","feec7680":"changeFeesAddress(address)","feed5561":"getContributorsCount()","feed58ff":"setBackgroundColors(bytes3[])","feeda367":"addMarketTo()","feee8139":"setColors(uint32[],uint8[])","feefee1b":"firstExchangeRatePeriod()","fef038e8":"piggyBank(address)","fef10b95":"poolReward()","fef1dc7d":"seekerValue()","fef28cac":"Yudhacoin()","fef2cc97":"getPreAuthorizedAmount(address,address)","fef47e38":"CREATE_NAME_ROLE()","fef4b969":"refundFromSeveral(uint256,address[])","fef5ae43":"enterCurrentRound()","fef5b185":"updateUserEducation(string,uint256,string,uint16)","fef5f1e7":"validateRequestParams(address[4],address,uint256[12],uint256,bytes,uint256)","fef636a8":"stage2Start()","fef64e37":"packedToStartTime(uint256)","fef7d5a8":"findEmptyBenefactorIndex()","fef8383e":"gameOpponent()","fef88502":"hommie()","fef9b5ae":"changeminpublicsale(uint256)","fef9cfe1":"setAvailableAfterStart(uint256)","fefa69a0":"batchCancelOrders()","fefa7d1c":"isLockup(address)","fefa7e41":"countDrugs()","fefa9bb1":"addReferrer(address)","fefaa293":"reservedTokensTeam()","fefaa626":"gameFinishedTime()","fefacee1":"MediatorFees()","fefb130e":"srb(uint256)","fefb8dc3":"publishPost(string,string)","fefb94a5":"PFAToken()","fefba6dd":"transferAnyERC223Token(address,uint256)","fefc38fd":"startActivated()","fefc7089":"AVAILABLE_RESERVE_SUPPLY()","fefc8b41":"test_insert_findWithHintNotTightBound()","fefd336c":"getSettingValues()","fefd41b9":"balanceOfRick(address)","fefd51b2":"getBrick(uint256)","fefd6e9a":"allocateEqual(address[],uint256)","feff0506":"addListing(string,string,uint256,address)","feffd402":"fetchVoteMainInfo()","ff00c592":"setNumRewardsAvailableForAddress(uint256,address)","ff01f11a":"finalUnpaused()","ff01ff08":"setGameVars(uint256,uint256,uint256,uint256,uint256)","ff01ffa8":"refundCrowdsaleContributor()","ff02326f":"MoonDustDividends()","ff025819":"numberOfActiveProposals(bytes32)","ff026158":"setSale(uint256,address)","ff044add":"oldCratesSold()","ff056949":"decreaseBalance(address,uint256)","ff05a9f0":"giftPlot(uint256,uint256,address)","ff05edd8":"inflateSupply(uint256)","ff069b4c":"getPetbyTileId(uint16,uint8)","ff06bb57":"setEthInCents(uint256)","ff07061b":"LUC()","ff08d2b0":"PayMiners()","ff09068f":"SMRTCoin()","ff0935b1":"checkFeeSchedule(address)","ff0938a7":"isPause()","ff097659":"getServerInfo(uint256)","ff09ff99":"purchaseCity(uint256)","ff0a22db":"_shareProfit(uint256,uint256,address)","ff0b3fc5":"intervalLength()","ff0b9c90":"createCheckpoint()","ff0bfc91":"mayGenerateAddr()","ff0c5a4b":"ContributionReceived(bytes32,address,address,uint256,uint256)","ff0cd868":"ShareEstateToken()","ff0ec23e":"setEditionName(uint8,string)","ff0efd6c":"submitDistance(uint256[])","ff0f27de":"setIDChain(address,address)","ff0f2e80":"getNumOrdersByPayee()","ff0f2f71":"setTTCAddress(address)","ff102896":"tokenRedemption(address,string)","ff10dc66":"quickTrade(address,address,uint256)","ff11e1db":"collectEther()","ff12128a":"step(int256,bool)","ff125c8a":"transferAllowed(address,address,uint256)","ff13c6c6":"RefundLoaded(uint256)","ff1401cc":"OdinCoin(address)","ff163aca":"AcquinomToken(address)","ff176844":"ThanosXToken()","ff1780ec":"rescueToken(address[],uint256[])","ff178834":"testApproveWillModifyAllowance()","ff17bc98":"burnOwnerTokens()","ff184b5d":"EthPerToken()","ff18539b":"setDepositCreator(address)","ff186b2e":"ethPrice()","ff190061":"balanceOfActiveToken(address)","ff192bc8":"isFreeze(address)","ff197bc3":"presaleTokenSold()","ff1ad781":"deadbids(address)","ff1ad7fa":"claimRewardBy(address,uint256,string)","ff1b01a6":"bet1000(uint256)","ff1b4341":"easyPropose(address,uint256,uint256)","ff1b636d":"Admin()","ff1c52d8":"Queue(bytes32,bytes32,bool,bytes32,address)","ff1c559e":"ChampionGameFinished(uint256,address,uint256,uint256)","ff1ca005":"supportComponent(uint16,uint256)","ff1d20b5":"getSecondStageWallet()","ff1d2712":"versionIndex()","ff1d83ae":"getTokenGranteesLength()","ff1d91b4":"ccStartTime()","ff1d9dd4":"updatePoolContract(address)","ff1e28a4":"createStamp(address,uint256)","ff1f7046":"requiresAuction(string)","ff1fd974":"getPayAmount(address,address,uint256)","ff2073d7":"fundRaiser()","ff208fa5":"test_insert_findWithHintNextAtPosition(int256)","ff213498":"FlowingHair()","ff21984a":"testMintAuth(int256)","ff21f27f":"issueToken(uint256,uint256,uint256,uint256)","ff22028b":"requireOwnerUnlockedAmount(uint256)","ff2258cb":"diffYears(uint256,uint256)","ff2263b7":"firstRoundStartTimestamp()","ff2311a4":"GetPatient()","ff238839":"showDelegateMsgSender(address)","ff23c7f2":"createArtefact(uint256,string,uint256,uint256,uint256)","ff23e1eb":"ShalloToken()","ff249bb0":"getTokenPacksAvailable()","ff25af24":"migrateAccount(bytes32,bytes32,uint256,uint256,address)","ff25e16d":"getLogErrorArguments()","ff25f859":"KIN_FOUNDATION_ADDRESS()","ff262ea5":"construct(uint256)","ff266d26":"reopen(address)","ff272ad4":"__toDecimals(uint256)","ff27848a":"GoldToken(address)","ff27c476":"shiftBitsRight(bytes,uint256)","ff27cbda":"getPI_edit_4()","ff28bcc2":"increaseReward()","ff28cdaf":"WCT(address)","ff28d625":"releaseEarning(bytes32,bytes32,bytes32,bool,address,address)","ff29507d":"fundingStopBlock()","ff299a63":"BTCUToken(uint256,string,uint8,string)","ff29bc95":"assignBalance(address,uint256,uint256)","ff29c104":"getTotalLeaderboards()","ff2a3776":"claimAllUnsold()","ff2b0571":"doFreeExtension(bytes32)","ff2b247f":"addNewTicket(uint256,bytes32,uint256,uint256,uint256)","ff2b350d":"acceptGiftTokens(address)","ff2d4b71":"addDoctor(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint32,uint32)","ff2eff94":"Cow()","ff2f7a35":"getDeed(bytes32)","ff30feef":"walletTranslate()","ff31e930":"prizePoolAddress()","ff31f9e6":"getSecurityDepositRegistry()","ff332ab7":"getTokenDetails()","ff34ef7d":"PrimaToken()","ff359cb8":"RATE_SALESTAGE2()","ff36cf59":"contributeETH(address)","ff377705":"getNumEntries(address,address,uint256)","ff37839b":"getTxt(uint256)","ff37d31d":"escrowDeed(uint64)","ff394153":"transferEthersToDividendManager(uint256)","ff39ae55":"EthereumExtreme()","ff3a5eea":"isIco()","ff3a91d9":"getOwnerPicture(bytes32)","ff3adc83":"GazeCoinCrowdsale()","ff3af97f":"setBonusToken(address,uint256,uint256,uint256,address,uint256,uint256,uint256)","ff3bf1f4":"sitePercent_()","ff3c1a8f":"getTitle()","ff3c9472":"adduser(string,string,address)","ff3d1be0":"stopPreIco_step1()","ff3d398c":"buyTokensByAtes(address,uint256,string)","ff3e51c8":"ZULICC()","ff3e8ba1":"_transferDirect(uint256,uint256,uint256,bytes32)","ff3ef460":"_userOwnsToken(address,uint256)","ff3f427c":"createMobsterWithOwner(string,address,uint256,uint256,uint256,string)","ff3fb765":"testUpdateCase()","ff40807b":"getAccumulator()","ff40fcf6":"buyBBC(address)","ff41f5cc":"HUT34_RETAIN()","ff423357":"withdrawAmount(uint256,address)","ff429fc8":"getCooldown(uint16)","ff42fd41":"getTotalLockedAmounts(address)","ff4329ee":"receiveCashback(address)","ff4408ee":"stopCrowding()","ff46f210":"isUnfrozenAccount(address)","ff470507":"VaultbankVotingToken()","ff48fd9c":"mintGreen(address,uint256)","ff49b26e":"createEvent(uint256,uint256,uint8,uint32,address,uint256,uint8)","ff49b8ef":"KyberWhiteList(address)","ff4a6638":"followTrader(bytes,address,bytes32,uint256,address,uint256)","ff4a7a7c":"Blin()","ff4ab29c":"setMarketFees(uint256)","ff4b6fea":"_shiftLeft(bytes32,uint256)","ff4bd173":"dealBuyContract(uint256,uint256,string,uint256,uint256,string)","ff4bf170":"TechieCoin()","ff4c9fa5":"getCurrentPriceForToken(uint256)","ff4cfa5e":"onSignUp(string,uint256)","ff4d7404":"sell(uint8,string,uint256,uint256,uint32)","ff4dddc4":"tokensInWeiSold()","ff4ea29e":"migrateTokens(address[])","ff4f03a9":"developeo()","ff507efa":"Consulteth(uint256,uint256)","ff508d76":"renderWeb()","ff50abdc":"totalDeposited()","ff50fcb6":"usedIcoSupply()","ff510ad8":"isOnTrade(uint256)","ff51d18c":"getFlightConnections(uint16)","ff523cb2":"oraclizeQueryGas(uint256)","ff53c5a3":"refundInvestor(address)","ff552482":"GennovaToken()","ff556ecb":"releaseUnicorn(uint256)","ff55da1c":"assertOnlySpecifiedCaller(address,bytes32)","ff55e2ee":"setCasinoAddress(address)","ff5639c4":"optInFromClassic()","ff56b59a":"start6Phase2025()","ff56b65a":"getTxPaymentKWh(bytes32)","ff5732a5":"calculateTokenGet(uint256,uint256,uint256,bool,bytes32)","ff574213":"YeekFormula()","ff584597":"setGameResult(bytes32,int256,int256)","ff585caf":"callback(uint256)","ff592125":"issuedNum()","ff596069":"computeAddressBonus(uint16)","ff597790":"getSold(uint256)","ff598a06":"betTotalGasprice_()","ff59f3cc":"theCyberGatekeeper()","ff5a478b":"finalizeTge()","ff5b98b8":"setAvgReportingGasPrice(uint256)","ff5bc8a7":"getSaleContractTokensLimit(address)","ff5ce378":"_addTokenTo(address,uint256)","ff5d2c39":"to62Encoding(uint256,uint256)","ff5de44b":"getStockBalance(address,address,uint256)","ff5e51b3":"VTOSToken(uint256,string,string)","ff5e7d4d":"lockedFundsSeconds()","ff5f1346":"forSell()","ff5f8b4b":"takeOwnership(uint256,address)","ff5fcf01":"initializeNewSale(uint256,uint256,address,address)","ff5feb3e":"getVoterVotesCount(address)","ff5ff81f":"LastWillContractOraclize(address,address[],uint8[],uint256)","ff600081":"getValuePerMicroKey()","ff60af84":"setNewMinDeposite(uint256)","ff60cdf6":"get1TokenSellPrice()","ff615b87":"SECOND_PHASE_PRICE_FACTOR()","ff61ad09":"getRoomBalance(uint256)","ff62d2cf":"rewardAdjustmentPeriod()","ff630748":"setStepLimits(uint256,uint256)","ff6307f8":"angelFoundationShareDenominator()","ff6387ad":"setconfigurationTokenPrice(uint256)","ff6395a4":"assigned_bids()","ff63ac3b":"_getTime()","ff6417c1":"paidAddress(uint256)","ff6477be":"getScam(uint256)","ff64d469":"weR()","ff65226c":"canBuy()","ff655320":"withdrawFirst()","ff65e44a":"purchaseBronze()","ff668cbe":"donacionTeleton()","ff66a305":"setBountyManager(address)","ff67577a":"Appoint_Mediator(uint256)","ff67c9f5":"getRequirementTime(address)","ff6867c0":"startAndSetStopTime(uint256)","ff69ac36":"currentTokenAmount()","ff69e2bc":"CurrentPrice()","ff69f35e":"CryptoEmojis()","ff6a6df7":"MultiValidator()","ff6c33e6":"TOKEN_OWNER()","ff6c8b87":"MPGame(uint8)","ff6d24b1":"SedPOWToken()","ff6d6f63":"BCTToken(uint256,string,string)","ff6f0d54":"TipSmart()","ff6f2914":"foundersRewardsAccount()","ff7070eb":"_processIncomingEther(address,uint256)","ff70bd9c":"PirateNinjaCoin(string,uint8,string,uint256,uint256)","ff70c4d1":"getBuyerAddress(uint16,uint16)","ff70e8d9":"STAKE_MULTIPLIER()","ff70fa49":"setDeveloper(address)","ff71c6b0":"WALLET_T8EX_COMMUNITY()","ff722b08":"getSkillTypeCnt()","ff72c845":"bat()","ff739e40":"minEnterFee()","ff73d2d8":"getIsRevenuePaid(address,uint256)","ff74927b":"strConcat(string,string)","ff74c0b8":"subTotalInvoiced(address,uint256,uint256)","ff74e915":"NewContent(string)","ff75567b":"participant2SentEtherCount()","ff757d59":"kittenContract()","ff776f55":"regist(address)","ff77898a":"numberOfContractors()","ff7835bf":"SmartCoinCash()","ff78461c":"initSilver()","ff786f2d":"LogTradeError(address,address,uint256,uint256,uint16)","ff7885e8":"withdraw(address,address,address)","ff78d5ed":"mdtComparable()","ff78e48b":"setIsParentOf(bool)","ff79d600":"BATAGOR()","ff7b5730":"getSCF()","ff7c9329":"setMintingCompleted()","ff7c977f":"admin_dividend(int256,int256)","ff7e17b6":"endTimeTLP1()","ff7e5abd":"vestingIsCompleted(address,uint256)","ff7f5f2a":"EtherizationUtils2()","ff8028b3":"megaCandyToken()","ff80b69a":"minPresaleAmount()","ff81c554":"coinMinted()","ff81fb91":"unhint(int256,bytes32)","ff82b174":"getUserBigPromoBonus(address,address)","ff83ce17":"ManagerSet(address,bool)","ff83f562":"acceptOwnership(string)","ff840553":"roundid()","ff8489df":"tokensForFinalize()","ff848eaf":"newDeal(uint256,uint256,uint256,uint256)","ff84990c":"MRDSCoinToken()","ff84d49f":"setMiniPoolEdit_3(string)","ff84ed36":"Identity(address,address)","ff855ac3":"withdrawTokens1(uint256)","ff85bd39":"Free()","ff85fba2":"forceStart()","ff862839":"modifyairdrop(uint256)","ff8872c2":"accountEthAmount(address)","ff895a62":"deActivate()","ff897dbd":"updateMinAmount(uint256)","ff89a720":"ECCToken(uint256,string,string)","ff8bfffc":"sendEthTweet(uint256,bool,string,bool,string,string,string)","ff8cffc1":"returnBorrowerPaidLate(uint256)","ff8ed0f7":"Map(address,uint256)","ff8ee507":"EthernalLoveParent()","ff8f7551":"FINCO()","ff8f9b9f":"LOL10()","ff8f9de7":"BuyRTCtokens()","ff8fa0dd":"transferFromWithData(address,address,uint256,bytes32)","ff8fec7f":"setHashByProvider(bytes32,bytes32)","ff9151dd":"retrait_4()","ff91b949":"nonPublicSupply()","ff91bb45":"castVote(address,uint256)","ff92eb2c":"selleth(uint256)","ff938f4a":"addClientAuthority(address)","ff93a512":"createEvent(uint256,uint256,uint256,uint256,uint256,uint256,address[])","ff947525":"isShutDown()","ff94e502":"getIdByIndex(uint256)","ff950e90":"batchSpawnAsset(address[],uint256[],uint256[],uint256)","ff95a8d2":"grantFounderTeamToken()","ff96b467":"setLockup_contributors(address,uint256,uint256)","ff97278f":"_timeLimit(uint256)","ff981099":"getVotes(uint256)","ff9852bf":"balanceOwed(address)","ff989a0d":"safeDecrement(uint256,uint256)","ff9913e8":"allow(address)","ff992ef5":"addInvestorList(address,uint256)","ff993272":"bonus10end()","ff993a18":"ChangeBuyRate(uint256)","ff9a6773":"DexToken(address,address,address,uint256,uint256,uint256)","ff9b3acf":"house()","ff9c1c5c":"preICODataInitialized()","ff9c8437":"releaseStake(uint256,address,address,uint256)","ff9e1b38":"addUndergraduate(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint32,uint32)","ff9e3948":"phase_3_remaining_tokens()","ff9e7fe1":"MaxPowerCoin()","ff9f0e5c":"updateToken()","ff9f3055":"generateDna(uint256[])","ff9f633f":"lockedAddresses(address,uint256)","ffa05698":"get_back()","ffa08cb7":"checkPendingWithdrawal()","ffa094fb":"highestBidIsCC()","ffa1ad74":"VERSION()","ffa230b0":"totalCharitySent()","ffa2548a":"LifeSet_008()","ffa2f5c2":"coindropsStatus()","ffa309e4":"currentFiscalYear()","ffa32d1c":"DST_ADVISERS()","ffa34f7c":"isFreezing(address)","ffa39d27":"ElectricCoin()","ffa39d3f":"_isAuthorized(address,bytes4)","ffa40a4c":"pregnantPandas()","ffa49c6a":"expiryEpoch()","ffa61f69":"AllowSuccess(address,address)","ffa640d8":"tradeContract()","ffa651b6":"setEngineerInterface(address)","ffa67f6c":"crowdsaleUnpause()","ffa68839":"initDate()","ffa696d3":"exits(bytes32)","ffa6ae80":"isIdRegistered(bytes16)","ffa72707":"startBuying(uint256)","ffa82f78":"advisorsTokenAmount()","ffa89a00":"permissionToChange(address,address,uint256)","ffa8acde":"StrongHold()","ffa8c44a":"MINSALESCAP()","ffa90f7f":"redeemFrom(address,uint256,bytes,bytes)","ffa97aca":"getInvoice(address,bytes32)","ffaa3608":"voteFor()","ffaa67d4":"deployVesting(address,string,uint256,bool,bool,bool,address)","ffaa9c22":"setAllSupply(uint256)","ffaad6a5":"depositTo(address,uint256)","ffab0959":"backersRedeemed()","ffab3269":"EthRefunded(address,uint256)","ffab7dcd":"setPlayerGeneralDt(uint64,uint32)","ffab984d":"preIcoBuyPrice()","ffacade4":"setFilter(uint256,address)","fface4a3":"rowQuiter()","ffacf300":"doCrowdsaleMinting(address,uint256,int256)","ffad4fc1":"batchLock(address[],uint256)","ffad75eb":"finishICO(bool)","ffae15ba":"e()","ffae2c5b":"getAuthority(uint256)","ffae399e":"shouldRevert(bool)","ffaef25e":"addDataResponse(address,address,string)","ffaf78c2":"_createPiranha(string,address,uint256,uint8,uint256,uint8)","ffaf862f":"getProductWeiRaised(address)","ffb00df1":"TOKENS_LOCKED_2Y_TOTAL()","ffb05c6f":"minRequiredBlockQueueTime()","ffb0885d":"forceTransfer(address,uint256)","ffb171fb":"verifyBalanceProof(address,uint256,bytes)","ffb1a06d":"priceIsStale()","ffb1a6cb":"getWins(address)","ffb24446":"setMaxTicket(uint256)","ffb2c479":"process(uint256)","ffb2d35d":"allowRefund()","ffb308ef":"writeDocument(uint128,uint16,uint256,bytes32[],string,string,string)","ffb31c62":"BetterAuction()","ffb3401d":"SimpleAuction(uint256,address)","ffb38e84":"_setMinter(address,bool)","ffb391fe":"HM(uint256)","ffb40152":"contract_verified()","ffb4c857":"_confirmAndCheck(bytes32)","ffb4e44d":"get_participant(address,address)","ffb54a99":"tradingOpen()","ffb58247":"Ektcoin(uint256,uint256)","ffb5fc2a":"changeDeDeNetwork(address)","ffb747f0":"updateBatches(address,address,uint256)","ffb7bfba":"watchProposal(uint256)","ffb87173":"pixelPrice()","ffb92678":"commFoundAddr()","ffba376c":"unfreezeTokens()","ffbac044":"KickCommitteeFromMapAndArrayEvent(address)","ffbafdfe":"updateState(uint256,uint8)","ffbb62a3":"withdrawCoins()","ffbd26ce":"addReinforcedWhitelist(address[])","ffbd400b":"boolToUInt(bool)","ffbd4dd5":"checkCertificate(string)","ffbd6f72":"splice(uint8[],uint256,uint256)","ffbd73d0":"OSUniEDUSupply()","ffbd8c37":"buyBNNTokens()","ffbfd19e":"accUserReward()","ffbfd38b":"FooStdToken()","ffc0060e":"QingFengCabve(uint256,string,uint8,string)","ffc0483d":"CoreAddress()","ffc0d035":"hgtDecimals()","ffc1b038":"blacklistInvestor(address)","ffc31215":"getStore(string)","ffc3a769":"transfer(address[],uint256[])","ffc3f1f2":"HyperToken()","ffc42904":"MarketContract()","ffc48c61":"buyerAddressTransfer(string,address,address)","ffc4bbb3":"FirstLevelCost()","ffc52a1f":"registerByList(address[],uint256[])","ffc54ea4":"setTokenActive(uint256,bool)","ffc6ff1e":"closeSubmission()","ffc797e4":"setLowerBondPrice(uint256,uint256)","ffc85dc5":"finalizeDeposits()","ffc8bcd7":"getRefToById(address,address,uint256)","ffc8c4cb":"totalConsume()","ffc9152e":"isRefunded(address)","ffc92376":"subEmployerTotalInvoiced(address,address,uint256)","ffc9896b":"getUserData(address)","ffca2968":"ExternalSaleSha3(uint8,bytes32,address,uint256,uint256)","ffcab3e9":"getValidDurationSignatures()","ffcad44e":"getGroupFileCount(string)","ffcb1edb":"getDividendTokenSupply()","ffcb39c2":"tier0(address)","ffcbb5df":"printStats()","ffcc7bbf":"getUserAtIndex(uint256)","ffcc8484":"nextroundERCtradeactive()","ffcce369":"changeIPFSHash(string)","ffcd64e5":"_issueByTranche(bytes32,address,address,uint256,bytes,bytes)","ffcdcb51":"AhooleeTokenPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256,uint256)","ffcecf09":"PRE_SALE_START_3()","ffcf1ade":"logPromiseCanceled(uint256)","ffcf21a9":"eventOracles(bytes,uint256)","ffd10e07":"enterPool(address)","ffd19e8c":"isAlreadyProcessed(uint256)","ffd40b56":"allocatorBalance(address)","ffd4185c":"QuantumXICO()","ffd45f16":"calculateTokenCount(uint256,uint256)","ffd479bb":"setBaseInfo(uint256,bool,bool)","ffd48b73":"buyInternal(address,uint256,uint256)","ffd48f40":"setDelegadoDeDistritoVerify(bytes32)","ffd4e0e2":"getTotalIcoTokens()","ffd4e799":"HTJToken()","ffd4f4b2":"withdrawTokensFromContract(uint256)","ffd571ca":"ethersContributed()","ffd68462":"readCheckList(address,uint256,uint256)","ffd6a052":"ChangeAdminWalletAddress(uint256,address)","ffd71e13":"loadCoreAddress(address)","ffd740df":"removeNode(uint256)","ffd7b5e6":"investWithCustomerId(address,string)","ffd85b68":"setControllerDelegate(address)","ffd864d3":"chief()","ffd9ca40":"register(bytes20,uint64,bytes)","ffdaa1b8":"TokenWithdraw(address,uint256,address,uint256)","ffdab909":"removeEntry(uint256)","ffdb0eb3":"getXRateProviderLength()","ffdcf095":"transferWithNarrative(address,uint256,string)","ffdd108b":"addEvent(uint256,string)","ffdd5cf1":"getInfo(address)","ffde0c74":"getGameState(uint256)","ffde8eae":"dismissBunner(address)","ffe0a9f2":"contractSymbolUpdate(string,bool)","ffe0fa66":"CarRegistry()","ffe189ef":"prev(uint80)","ffe280ee":"setWeight(uint256,uint256,bytes)","ffe2d77e":"directorLock()","ffe302d1":"setPlz(string)","ffe34512":"getNumChannels(address)","ffe3acc7":"changeGeneralSaleStartDate(uint256)","ffe3c6fd":"zKill()","ffe45b14":"getHTLCInvalidationTimeoutExtension(uint256,int256,bytes32,bytes32)","ffe48c76":"getBCDTRateForCurrentRound()","ffe4914a":"hdivide(uint256,uint256)","ffe496f2":"setMarginSpend(uint256)","ffe4fe4c":"roundFor(uint256)","ffe55303":"unfreezeCreditScore(uint256,string)","ffe575b1":"Daxther()","ffe57c16":"byuoutActive()","ffe619df":"buyPixelToken(uint24,uint256,uint24)","ffe648d4":"releaseAllOnceLock(address)","ffe6bbd8":"myEarnings()","ffe8ee35":"SetDivTime(uint256)","ffe90ba6":"offsetIndex()","ffe94af0":"burnPass(bytes32,address)","ffe99ca7":"getCitiesStrings(uint256[])","ffea632b":"initialize(address,address,uint8,address)","ffeb7d75":"setUpgradeMaster(address)","ffec34e3":"TokenMintPoD(int256)","ffecf516":"addBot(address)","ffed6ed7":"buyAd(uint8,uint8)","ffeddd49":"addPolicy(bytes32,uint32,uint32,uint256,string)","ffee7c97":"getBookLength()","ffeea273":"withdrawWallet2()","ffeeac82":"info_Name()","ffeecfaa":"Log1(address,bytes32,uint256,string,string,uint256,bytes1)","ffef2b00":"SortCompetitionScores(uint32)","ffef8f88":"Share(uint256)","ffef9b3c":"_checkMaxRoundSupply(uint256)","fff04a87":"test_invalidBalanceNotZero()","fff07241":"playerExist(address)","fff10aba":"getEventsHistory()","fff28137":"reclaimToken()","fff311b1":"ownerSetjackpotContract(address)","fff35670":"icoLaunchTimestamp()","fff3a01b":"transfer(address,string,uint256)","fff3ad33":"getAddTokenDataTracking()","fff3c457":"readMessages(uint256)","fff43b4e":"_setBurnPool(uint256)","fff57ba3":"withdrawSettle(bytes32,bytes32,bytes32)","fff57fe1":"claimableOCDividend(address,address)","fff6a540":"LongBCoin(uint256,string,uint8,string)","fff6fb54":"TTOH()","fff78f9c":"doThrow()","fff7a97e":"addWallet(address,address)","fff83edf":"founderAmounts(uint256)","fff85d49":"addChunk1ToWhiteList()","fff8d42b":"phase2StartingAt()","fff93ec3":"setLandingPage(string)","fff95ce3":"getIsPoop()","fff9627d":"PRESALE_VAULT_START()","fff9d5b9":"confirmProofOfWork(uint256)","fffa932b":"withdrowTo(address)","fffa9d0c":"setGood(bytes32,uint256,uint256)","fffb5183":"initialize(uint256,address,uint256)","fffcde7c":"EOSINT()","fffce84f":"bountyFreeze(address,bool)","fffd52c6":"reading()","fffda870":"lastHorseSex()","fffdbe2c":"frozenTokensSupply()","fffe088d":"saleAddress()","fffeb1ca":"externalCheckSignBool(bytes32,bytes,address)","ffff6b04":"vestingSchedule(address)","ffffce47":"exchangeRateOracle()"} \ No newline at end of file diff --git a/signer/fourbyte/abi.go b/signer/fourbyte/abi.go new file mode 100644 index 000000000000..ba3af622500a --- /dev/null +++ b/signer/fourbyte/abi.go @@ -0,0 +1,164 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package fourbyte + +import ( + "bytes" + "encoding/json" + "fmt" + "regexp" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" +) + +// decodedCallData is an internal type to represent a method call parsed according +// to an ABI method signature. +type decodedCallData struct { + signature string + name string + inputs []decodedArgument +} + +// decodedArgument is an internal type to represent an argument parsed according +// to an ABI method signature. +type decodedArgument struct { + soltype abi.Argument + value interface{} +} + +// String implements stringer interface, tries to use the underlying value-type +func (arg decodedArgument) String() string { + var value string + switch val := arg.value.(type) { + case fmt.Stringer: + value = val.String() + default: + value = fmt.Sprintf("%v", val) + } + return fmt.Sprintf("%v: %v", arg.soltype.Type.String(), value) +} + +// String implements stringer interface for decodedCallData +func (cd decodedCallData) String() string { + args := make([]string, len(cd.inputs)) + for i, arg := range cd.inputs { + args[i] = arg.String() + } + return fmt.Sprintf("%s(%s)", cd.name, strings.Join(args, ",")) +} + +// verifySelector checks whether the ABI encoded data blob matches the requested +// function signature. +func verifySelector(selector string, calldata []byte) (*decodedCallData, error) { + // Parse the selector into an ABI JSON spec + abidata, err := parseSelector(selector) + if err != nil { + return nil, err + } + // Parse the call data according to the requested selector + return parseCallData(calldata, string(abidata)) +} + +// selectorRegexp is used to validate that a 4byte database selector corresponds +// to a valid ABI function declaration. +// +// Note, although uppercase letters are not part of the ABI spec, this regexp +// still accepts it as the general format is valid. It will be rejected later +// by the type checker. +var selectorRegexp = regexp.MustCompile(`^([^\)]+)\(([A-Za-z0-9,\[\]]*)\)`) + +// parseSelector converts a method selector into an ABI JSON spec. The returned +// data is a valid JSON string which can be consumed by the standard abi package. +func parseSelector(selector string) ([]byte, error) { + // Define a tiny fake ABI struct for JSON marshalling + type fakeArg struct { + Type string `json:"type"` + } + type fakeABI struct { + Name string `json:"name"` + Type string `json:"type"` + Inputs []fakeArg `json:"inputs"` + } + // Validate the selector and extract it's components + groups := selectorRegexp.FindStringSubmatch(selector) + if len(groups) != 3 { + return nil, fmt.Errorf("invalid selector %s (%v matches)", selector, len(groups)) + } + name := groups[1] + args := groups[2] + + // Reassemble the fake ABI and constuct the JSON + arguments := make([]fakeArg, 0) + if len(args) > 0 { + for _, arg := range strings.Split(args, ",") { + arguments = append(arguments, fakeArg{arg}) + } + } + return json.Marshal([]fakeABI{{name, "function", arguments}}) +} + +// parseCallData matches the provided call data against the ABI definition and +// returns a struct containing the actual go-typed values. +func parseCallData(calldata []byte, abidata string) (*decodedCallData, error) { + // Validate the call data that it has the 4byte prefix and the rest divisible by 32 bytes + if len(calldata) < 4 { + return nil, fmt.Errorf("invalid call data, incomplete method signature (%d bytes < 4)", len(calldata)) + } + sigdata := calldata[:4] + + argdata := calldata[4:] + if len(argdata)%32 != 0 { + return nil, fmt.Errorf("invalid call data; length should be a multiple of 32 bytes (was %d)", len(argdata)) + } + // Validate the called method and upack the call data accordingly + abispec, err := abi.JSON(strings.NewReader(abidata)) + if err != nil { + return nil, fmt.Errorf("invalid method signature (%s): %v", abidata, err) + } + method, err := abispec.MethodById(sigdata) + if err != nil { + return nil, err + } + values, err := method.Inputs.UnpackValues(argdata) + if err != nil { + return nil, err + } + // Everything valid, assemble the call infos for the signer + decoded := decodedCallData{signature: method.Sig(), name: method.Name} + for i := 0; i < len(method.Inputs); i++ { + decoded.inputs = append(decoded.inputs, decodedArgument{ + soltype: method.Inputs[i], + value: values[i], + }) + } + // We're finished decoding the data. At this point, we encode the decoded data + // to see if it matches with the original data. If we didn't do that, it would + // be possible to stuff extra data into the arguments, which is not detected + // by merely decoding the data. + encoded, err := method.Inputs.PackValues(values) + if err != nil { + return nil, err + } + if !bytes.Equal(encoded, argdata) { + was := common.Bytes2Hex(encoded) + exp := common.Bytes2Hex(argdata) + return nil, fmt.Errorf("WARNING: Supplied data is stuffed with extra data. \nWant %s\nHave %s\nfor method %v", exp, was, method.Sig()) + } + return &decoded, nil +} diff --git a/signer/fourbyte/abi_test.go b/signer/fourbyte/abi_test.go new file mode 100644 index 000000000000..314c12735b8c --- /dev/null +++ b/signer/fourbyte/abi_test.go @@ -0,0 +1,174 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package fourbyte + +import ( + "math/big" + "reflect" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" +) + +func verify(t *testing.T, jsondata, calldata string, exp []interface{}) { + abispec, err := abi.JSON(strings.NewReader(jsondata)) + if err != nil { + t.Fatal(err) + } + cd := common.Hex2Bytes(calldata) + sigdata, argdata := cd[:4], cd[4:] + method, err := abispec.MethodById(sigdata) + if err != nil { + t.Fatal(err) + } + data, err := method.Inputs.UnpackValues(argdata) + if err != nil { + t.Fatal(err) + } + if len(data) != len(exp) { + t.Fatalf("Mismatched length, expected %d, got %d", len(exp), len(data)) + } + for i, elem := range data { + if !reflect.DeepEqual(elem, exp[i]) { + t.Fatalf("Unpack error, arg %d, got %v, want %v", i, elem, exp[i]) + } + } +} + +func TestNewUnpacker(t *testing.T) { + type unpackTest struct { + jsondata string + calldata string + exp []interface{} + } + testcases := []unpackTest{ + { // https://solidity.readthedocs.io/en/develop/abi-spec.html#use-of-dynamic-types + `[{"type":"function","name":"f", "inputs":[{"type":"uint256"},{"type":"uint32[]"},{"type":"bytes10"},{"type":"bytes"}]}]`, + // 0x123, [0x456, 0x789], "1234567890", "Hello, world!" + "8be65246" + "00000000000000000000000000000000000000000000000000000000000001230000000000000000000000000000000000000000000000000000000000000080313233343536373839300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004560000000000000000000000000000000000000000000000000000000000000789000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20776f726c642100000000000000000000000000000000000000", + []interface{}{ + big.NewInt(0x123), + []uint32{0x456, 0x789}, + [10]byte{49, 50, 51, 52, 53, 54, 55, 56, 57, 48}, + common.Hex2Bytes("48656c6c6f2c20776f726c6421"), + }, + }, { // https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#examples + `[{"type":"function","name":"sam","inputs":[{"type":"bytes"},{"type":"bool"},{"type":"uint256[]"}]}]`, + // "dave", true and [1,2,3] + "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", + []interface{}{ + []byte{0x64, 0x61, 0x76, 0x65}, + true, + []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, + }, + }, { + `[{"type":"function","name":"send","inputs":[{"type":"uint256"}]}]`, + "a52c101e0000000000000000000000000000000000000000000000000000000000000012", + []interface{}{big.NewInt(0x12)}, + }, { + `[{"type":"function","name":"compareAndApprove","inputs":[{"type":"address"},{"type":"uint256"},{"type":"uint256"}]}]`, + "751e107900000000000000000000000000000133700000deadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + []interface{}{ + common.HexToAddress("0x00000133700000deadbeef000000000000000000"), + new(big.Int).SetBytes([]byte{0x00}), + big.NewInt(0x1), + }, + }, + } + for _, c := range testcases { + verify(t, c.jsondata, c.calldata, c.exp) + } +} + +func TestCalldataDecoding(t *testing.T) { + // send(uint256) : a52c101e + // compareAndApprove(address,uint256,uint256) : 751e1079 + // issue(address[],uint256) : 42958b54 + jsondata := ` +[ + {"type":"function","name":"send","inputs":[{"name":"a","type":"uint256"}]}, + {"type":"function","name":"compareAndApprove","inputs":[{"name":"a","type":"address"},{"name":"a","type":"uint256"},{"name":"a","type":"uint256"}]}, + {"type":"function","name":"issue","inputs":[{"name":"a","type":"address[]"},{"name":"a","type":"uint256"}]}, + {"type":"function","name":"sam","inputs":[{"name":"a","type":"bytes"},{"name":"a","type":"bool"},{"name":"a","type":"uint256[]"}]} +]` + // Expected failures + for i, hexdata := range []string{ + "a52c101e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", + "a52c101e000000000000000000000000000000000000000000000000000000000000001200", + "a52c101e00000000000000000000000000000000000000000000000000000000000000", + "a52c101e", + "a52c10", + "", + // Too short + "751e10790000000000000000000000000000000000000000000000000000000000000012", + "751e1079FFffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + // Not valid multiple of 32 + "deadbeef00000000000000000000000000000000000000000000000000000000000000", + // Too short 'issue' + "42958b5400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", + // Too short compareAndApprove + "a52c101e00ff0000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", + // From https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI + // contains a bool with illegal values + "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", + } { + _, err := parseCallData(common.Hex2Bytes(hexdata), jsondata) + if err == nil { + t.Errorf("test %d: expected decoding to fail: %s", i, hexdata) + } + } + // Expected success + for i, hexdata := range []string{ + // From https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI + "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", + "a52c101e0000000000000000000000000000000000000000000000000000000000000012", + "a52c101eFFffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "751e1079000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "42958b54" + + // start of dynamic type + "0000000000000000000000000000000000000000000000000000000000000040" + + // uint256 + "0000000000000000000000000000000000000000000000000000000000000001" + + // length of array + "0000000000000000000000000000000000000000000000000000000000000002" + + // array values + "000000000000000000000000000000000000000000000000000000000000dead" + + "000000000000000000000000000000000000000000000000000000000000beef", + } { + _, err := parseCallData(common.Hex2Bytes(hexdata), jsondata) + if err != nil { + t.Errorf("test %d: unexpected failure on input %s:\n %v (%d bytes) ", i, hexdata, err, len(common.Hex2Bytes(hexdata))) + } + } +} + +func TestMaliciousABIStrings(t *testing.T) { + tests := []string{ + "func(uint256,uint256,[]uint256)", + "func(uint256,uint256,uint256,)", + "func(,uint256,uint256,uint256)", + } + data := common.Hex2Bytes("4401a6e40000000000000000000000000000000000000000000000000000000000000012") + for i, tt := range tests { + _, err := verifySelector(tt, data) + if err == nil { + t.Errorf("test %d: expected error for selector '%v'", i, tt) + } + } +} diff --git a/signer/fourbyte/fourbyte.go b/signer/fourbyte/fourbyte.go new file mode 100644 index 000000000000..d164221227a3 --- /dev/null +++ b/signer/fourbyte/fourbyte.go @@ -0,0 +1,143 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +//go:generate go-bindata -nometadata -o 4byte.go -pkg fourbyte 4byte.json +//go:generate gofmt -s -w 4byte.go + +// Package fourbyte contains the 4byte database. +package fourbyte + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "io/ioutil" + "os" +) + +// Database is a 4byte database with the possibility of maintaining an immutable +// set (embedded) into the process and a mutable set (loaded and written to file). +type Database struct { + embedded map[string]string + custom map[string]string + customPath string +} + +// newEmpty exists for testing purposes. +func newEmpty() *Database { + return &Database{ + embedded: make(map[string]string), + custom: make(map[string]string), + } +} + +// New loads the standard signature database embedded in the package. +func New() (*Database, error) { + return NewWithFile("") +} + +// NewFromFile loads signature database from file, and errors if the file is not +// valid JSON. The constructor does no other validation of contents. This method +// does not load the embedded 4byte database. +// +// The provided path will be used to write new values into if they are submitted +// via the API. +func NewFromFile(path string) (*Database, error) { + raw, err := os.Open(path) + if err != nil { + return nil, err + } + defer raw.Close() + + db := newEmpty() + if err := json.NewDecoder(raw).Decode(&db.embedded); err != nil { + return nil, err + } + return db, nil +} + +// NewWithFile loads both the standard signature database (embedded resource +// file) as well as a custom database. The latter will be used to write new +// values into if they are submitted via the API. +func NewWithFile(path string) (*Database, error) { + db := &Database{make(map[string]string), make(map[string]string), path} + db.customPath = path + + blob, err := Asset("4byte.json") + if err != nil { + return nil, err + } + if err := json.Unmarshal(blob, &db.embedded); err != nil { + return nil, err + } + // Custom file may not exist. Will be created during save, if needed. + if _, err := os.Stat(path); err == nil { + if blob, err = ioutil.ReadFile(path); err != nil { + return nil, err + } + if err := json.Unmarshal(blob, &db.custom); err != nil { + return nil, err + } + } + return db, nil +} + +// Size returns the number of 4byte entries in the embedded and custom datasets. +func (db *Database) Size() (int, int) { + return len(db.embedded), len(db.custom) +} + +// Selector checks the given 4byte ID against the known ABI methods. +// +// This method does not validate the match, it's assumed the caller will do. +func (db *Database) Selector(id []byte) (string, error) { + if len(id) < 4 { + return "", fmt.Errorf("expected 4-byte id, got %d", len(id)) + } + sig := hex.EncodeToString(id[:4]) + if selector, exists := db.embedded[sig]; exists { + return selector, nil + } + if selector, exists := db.custom[sig]; exists { + return selector, nil + } + return "", fmt.Errorf("signature %v not found", sig) +} + +// AddSelector inserts a new 4byte entry into the database. If custom database +// saving is enabled, the new dataset is also persisted to disk. +// +// Node, this method does _not_ validate the correctness of the data. It assumes +// the caller has already done so. +func (db *Database) AddSelector(selector string, data []byte) error { + // If the selector is already known, skip duplicating it + if len(data) < 4 { + return nil + } + if _, err := db.Selector(data[:4]); err == nil { + return nil + } + // Inject the custom selector into the database and persist if needed + db.custom[hex.EncodeToString(data[:4])] = selector + if db.customPath == "" { + return nil + } + blob, err := json.Marshal(db.custom) + if err != nil { + return err + } + return ioutil.WriteFile(db.customPath, blob, 0600) +} diff --git a/signer/fourbyte/fourbyte_test.go b/signer/fourbyte/fourbyte_test.go new file mode 100644 index 000000000000..cdbd7ef73d5e --- /dev/null +++ b/signer/fourbyte/fourbyte_test.go @@ -0,0 +1,91 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package fourbyte + +import ( + "fmt" + "io/ioutil" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" +) + +// Tests that all the selectors contained in the 4byte database are valid. +func TestEmbeddedDatabase(t *testing.T) { + db, err := New() + if err != nil { + t.Fatal(err) + } + for id, selector := range db.embedded { + abistring, err := parseSelector(selector) + if err != nil { + t.Errorf("Failed to convert selector to ABI: %v", err) + continue + } + abistruct, err := abi.JSON(strings.NewReader(string(abistring))) + if err != nil { + t.Errorf("Failed to parse ABI: %v", err) + continue + } + m, err := abistruct.MethodById(common.Hex2Bytes(id)) + if err != nil { + t.Errorf("Failed to get method by id (%s): %v", id, err) + continue + } + if m.Sig() != selector { + t.Errorf("Selector mismatch: have %v, want %v", m.Sig(), selector) + } + } +} + +// Tests that custom 4byte datasets can be handled too. +func TestCustomDatabase(t *testing.T) { + // Create a new custom 4byte database with no embedded component + tmpdir, err := ioutil.TempDir("", "signer-4byte-test") + if err != nil { + t.Fatal(err) + } + filename := fmt.Sprintf("%s/4byte_custom.json", tmpdir) + + db, err := NewWithFile(filename) + if err != nil { + t.Fatal(err) + } + db.embedded = make(map[string]string) + + // Ensure the database is empty, insert and verify + calldata := common.Hex2Bytes("a52c101edeadbeef") + if _, err = db.Selector(calldata); err == nil { + t.Fatalf("Should not find a match on empty database") + } + if err = db.AddSelector("send(uint256)", calldata); err != nil { + t.Fatalf("Failed to save file: %v", err) + } + if _, err = db.Selector(calldata); err != nil { + t.Fatalf("Failed to find a match for abi signature: %v", err) + } + // Check that the file as persisted to disk by creating a new instance + db2, err := NewFromFile(filename) + if err != nil { + t.Fatalf("Failed to create new abidb: %v", err) + } + if _, err = db2.Selector(calldata); err != nil { + t.Fatalf("Failed to find a match for persisted abi signature: %v", err) + } +} diff --git a/signer/fourbyte/validation.go b/signer/fourbyte/validation.go new file mode 100644 index 000000000000..4d042d240f67 --- /dev/null +++ b/signer/fourbyte/validation.go @@ -0,0 +1,117 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package fourbyte + +import ( + "bytes" + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/signer/core" +) + +// ValidateTransaction does a number of checks on the supplied transaction, and +// returns either a list of warnings, or an error (indicating that the transaction +// should be immediately rejected). +func (db *Database) ValidateTransaction(selector *string, tx *core.SendTxArgs) (*core.ValidationMessages, error) { + messages := new(core.ValidationMessages) + + // Prevent accidental erroneous usage of both 'input' and 'data' (show stopper) + if tx.Data != nil && tx.Input != nil && !bytes.Equal(*tx.Data, *tx.Input) { + return nil, errors.New(`ambiguous request: both "data" and "input" are set and are not identical`) + } + // Place data on 'data', and nil 'input' + var data []byte + if tx.Input != nil { + tx.Data = tx.Input + tx.Input = nil + } + if tx.Data != nil { + data = *tx.Data + } + // Contract creation doesn't validate call data, handle first + if tx.To == nil { + // Contract creation should contain sufficient data to deploy a contract. A + // typical error is omitting sender due to some quirk in the javascript call + // e.g. https://github.com/ethereum/go-ethereum/issues/16106. + if len(data) == 0 { + // Prevent sending ether into black hole (show stopper) + if tx.Value.ToInt().Cmp(big.NewInt(0)) > 0 { + return nil, errors.New("transaction will create a contract with value but empty code") + } + // No value submitted at least, critically Warn, but don't blow up + messages.Crit("Transaction will create a contract with empty code") + } else if len(data) < 40 { // arbitrary heuristic limit + messages.Warn(fmt.Sprintf("Transaction will create a contract, but the payload is suspiciously small (%d bytes)", len(data))) + } + // Method selector should be nil for contract creation + if selector != nil { + messages.Warn("Transaction will create a contract, but method selector supplied, indicating an intent to call a method") + } + return messages, nil + } + // Not a contract creation, validate as a plain transaction + if !tx.To.ValidChecksum() { + messages.Warn("Invalid checksum on recipient address") + } + if bytes.Equal(tx.To.Address().Bytes(), common.Address{}.Bytes()) { + messages.Crit("Transaction recipient is the zero address") + } + // Semantic fields validated, try to make heads or tails of the call data + db.validateCallData(selector, data, messages) + return messages, nil +} + +// validateCallData checks if the ABI call-data + method selector (if given) can +// be parsed and seems to match. +func (db *Database) validateCallData(selector *string, data []byte, messages *core.ValidationMessages) { + // If the data is empty, we have a plain value transfer, nothing more to do + if len(data) == 0 { + return + } + // Validate the call data that it has the 4byte prefix and the rest divisible by 32 bytes + if len(data) < 4 { + messages.Warn("Transaction data is not valid ABI (missing the 4 byte call prefix)") + return + } + if n := len(data) - 4; n%32 != 0 { + messages.Warn(fmt.Sprintf("Transaction data is not valid ABI (length should be a multiple of 32 (was %d))", n)) + } + // If a custom method selector was provided, validate with that + if selector != nil { + if info, err := verifySelector(*selector, data); err != nil { + messages.Warn(fmt.Sprintf("Transaction contains data, but provided ABI signature could not be matched: %v", err)) + } else { + messages.Info(info.String()) + db.AddSelector(*selector, data[:4]) + } + return + } + // No method selector was provided, check the database for embedded ones + embedded, err := db.Selector(data[:4]) + if err != nil { + messages.Warn(fmt.Sprintf("Transaction contains data, but the ABI signature could not be found: %v", err)) + return + } + if info, err := verifySelector(embedded, data); err != nil { + messages.Warn(fmt.Sprintf("Transaction contains data, but provided ABI signature could not be varified: %v", err)) + } else { + messages.Info(info.String()) + } +} diff --git a/signer/fourbyte/validation_test.go b/signer/fourbyte/validation_test.go new file mode 100644 index 000000000000..0e98cd88e4b4 --- /dev/null +++ b/signer/fourbyte/validation_test.go @@ -0,0 +1,137 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package fourbyte + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/signer/core" +) + +func mixAddr(a string) (*common.MixedcaseAddress, error) { + return common.NewMixedcaseAddressFromString(a) +} +func toHexBig(h string) hexutil.Big { + b := big.NewInt(0).SetBytes(common.FromHex(h)) + return hexutil.Big(*b) +} +func toHexUint(h string) hexutil.Uint64 { + b := big.NewInt(0).SetBytes(common.FromHex(h)) + return hexutil.Uint64(b.Uint64()) +} +func dummyTxArgs(t txtestcase) *core.SendTxArgs { + to, _ := mixAddr(t.to) + from, _ := mixAddr(t.from) + n := toHexUint(t.n) + gas := toHexUint(t.g) + gasPrice := toHexBig(t.gp) + value := toHexBig(t.value) + var ( + data, input *hexutil.Bytes + ) + if t.d != "" { + a := hexutil.Bytes(common.FromHex(t.d)) + data = &a + } + if t.i != "" { + a := hexutil.Bytes(common.FromHex(t.i)) + input = &a + + } + return &core.SendTxArgs{ + From: *from, + To: to, + Value: value, + Nonce: n, + GasPrice: gasPrice, + Gas: gas, + Data: data, + Input: input, + } +} + +type txtestcase struct { + from, to, n, g, gp, value, d, i string + expectErr bool + numMessages int +} + +func TestTransactionValidation(t *testing.T) { + var ( + // use empty db, there are other tests for the abi-specific stuff + db = newEmpty() + ) + testcases := []txtestcase{ + // Invalid to checksum + {from: "000000000000000000000000000000000000dead", to: "000000000000000000000000000000000000dead", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, + // valid 0x000000000000000000000000000000000000dEaD + {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 0}, + // conflicting input and data + {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", i: "0x02", expectErr: true}, + // Data can't be parsed + {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x0102", numMessages: 1}, + // Data (on Input) can't be parsed + {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", i: "0x0102", numMessages: 1}, + // Send to 0 + {from: "000000000000000000000000000000000000dead", to: "0x0000000000000000000000000000000000000000", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, + // Create empty contract (no value) + {from: "000000000000000000000000000000000000dead", to: "", + n: "0x01", g: "0x20", gp: "0x40", value: "0x00", numMessages: 1}, + // Create empty contract (with value) + {from: "000000000000000000000000000000000000dead", to: "", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", expectErr: true}, + // Small payload for create + {from: "000000000000000000000000000000000000dead", to: "", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", numMessages: 1}, + } + for i, test := range testcases { + msgs, err := db.ValidateTransaction(nil, dummyTxArgs(test)) + if err == nil && test.expectErr { + t.Errorf("Test %d, expected error", i) + for _, msg := range msgs.Messages { + t.Logf("* %s: %s", msg.Typ, msg.Message) + } + } + if err != nil && !test.expectErr { + t.Errorf("Test %d, unexpected error: %v", i, err) + } + if err == nil { + got := len(msgs.Messages) + if got != test.numMessages { + for _, msg := range msgs.Messages { + t.Logf("* %s: %s", msg.Typ, msg.Message) + } + t.Errorf("Test %d, expected %d messages, got %d", i, test.numMessages, got) + } else { + //Debug printout, remove later + for _, msg := range msgs.Messages { + t.Logf("* [%d] %s: %s", i, msg.Typ, msg.Message) + } + t.Log() + } + } + } +} diff --git a/signer/rules/rules.go b/signer/rules/rules.go index 07c34db2202a..39538d18b903 100644 --- a/signer/rules/rules.go +++ b/signer/rules/rules.go @@ -1,18 +1,18 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// GNU Lesser General Public License for more details. // -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package rules @@ -22,7 +22,6 @@ import ( "os" "strings" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/signer/core" @@ -42,29 +41,30 @@ func consoleOutput(call otto.FunctionCall) otto.Value { for _, argument := range call.ArgumentList { output = append(output, fmt.Sprintf("%v", argument)) } - fmt.Fprintln(os.Stdout, strings.Join(output, " ")) + fmt.Fprintln(os.Stderr, strings.Join(output, " ")) return otto.Value{} } -// rulesetUI provides an implementation of SignerUI that evaluates a javascript +// rulesetUI provides an implementation of UIClientAPI that evaluates a javascript // file for each defined UI-method type rulesetUI struct { - next core.SignerUI // The next handler, for manual processing - storage storage.Storage - credentials storage.Storage - jsRules string // The rules to use + next core.UIClientAPI // The next handler, for manual processing + storage storage.Storage + jsRules string // The rules to use } -func NewRuleEvaluator(next core.SignerUI, jsbackend, credentialsBackend storage.Storage) (*rulesetUI, error) { +func NewRuleEvaluator(next core.UIClientAPI, jsbackend storage.Storage) (*rulesetUI, error) { c := &rulesetUI{ - next: next, - storage: jsbackend, - credentials: credentialsBackend, - jsRules: "", + next: next, + storage: jsbackend, + jsRules: "", } return c, nil } +func (r *rulesetUI) RegisterUIServer(api *core.UIServerAPI) { + // TODO, make it possible to query from js +} func (r *rulesetUI) Init(javascriptRules string) error { r.jsRules = javascriptRules @@ -74,12 +74,28 @@ func (r *rulesetUI) execute(jsfunc string, jsarg interface{}) (otto.Value, error // Instantiate a fresh vm engine every time vm := otto.New() + // Set the native callbacks consoleObj, _ := vm.Get("console") consoleObj.Object().Set("log", consoleOutput) consoleObj.Object().Set("error", consoleOutput) - vm.Set("storage", r.storage) + vm.Set("storage", struct{}{}) + storageObj, _ := vm.Get("storage") + storageObj.Object().Set("put", func(call otto.FunctionCall) otto.Value { + key, val := call.Argument(0).String(), call.Argument(1).String() + if val == "" { + r.storage.Del(key) + } else { + r.storage.Put(key, val) + } + return otto.NullValue() + }) + storageObj.Object().Set("get", func(call otto.FunctionCall) otto.Value { + goval, _ := r.storage.Get(call.Argument(0).String()) + jsval, _ := otto.ToValue(goval) + return jsval + }) // Load bootstrap libraries script, err := vm.Compile("bignumber.js", BigNumber_JS) if err != nil { @@ -150,18 +166,12 @@ func (r *rulesetUI) ApproveTx(request *core.SignTxRequest) (core.SignTxResponse, if approved { return core.SignTxResponse{ Transaction: request.Transaction, - Approved: true, - Password: r.lookupPassword(request.Transaction.From.Address()), - }, + Approved: true}, nil } return core.SignTxResponse{Approved: false}, err } -func (r *rulesetUI) lookupPassword(address common.Address) string { - return r.credentials.Get(strings.ToLower(address.String())) -} - func (r *rulesetUI) ApproveSignData(request *core.SignDataRequest) (core.SignDataResponse, error) { jsonreq, err := json.Marshal(request) approved, err := r.checkApproval("ApproveSignData", jsonreq, err) @@ -170,28 +180,9 @@ func (r *rulesetUI) ApproveSignData(request *core.SignDataRequest) (core.SignDat return r.next.ApproveSignData(request) } if approved { - return core.SignDataResponse{Approved: true, Password: r.lookupPassword(request.Address.Address())}, nil - } - return core.SignDataResponse{Approved: false, Password: ""}, err -} - -func (r *rulesetUI) ApproveExport(request *core.ExportRequest) (core.ExportResponse, error) { - jsonreq, err := json.Marshal(request) - approved, err := r.checkApproval("ApproveExport", jsonreq, err) - if err != nil { - log.Info("Rule-based approval error, going to manual", "error", err) - return r.next.ApproveExport(request) - } - if approved { - return core.ExportResponse{Approved: true}, nil + return core.SignDataResponse{Approved: true}, nil } - return core.ExportResponse{Approved: false}, err -} - -func (r *rulesetUI) ApproveImport(request *core.ImportRequest) (core.ImportResponse, error) { - // This cannot be handled by rules, requires setting a password - // dispatch to next - return r.next.ApproveImport(request) + return core.SignDataResponse{Approved: false}, err } // OnInputRequired not handled by rules diff --git a/signer/rules/rules_test.go b/signer/rules/rules_test.go index c2f92d51f2a3..c030ed47ceb1 100644 --- a/signer/rules/rules_test.go +++ b/signer/rules/rules_test.go @@ -1,19 +1,19 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// GNU Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + package rules import ( @@ -77,24 +77,18 @@ type alwaysDenyUI struct{} func (alwaysDenyUI) OnInputRequired(info core.UserInputRequest) (core.UserInputResponse, error) { return core.UserInputResponse{}, nil } +func (alwaysDenyUI) RegisterUIServer(api *core.UIServerAPI) { +} func (alwaysDenyUI) OnSignerStartup(info core.StartupInfo) { } func (alwaysDenyUI) ApproveTx(request *core.SignTxRequest) (core.SignTxResponse, error) { - return core.SignTxResponse{Transaction: request.Transaction, Approved: false, Password: ""}, nil + return core.SignTxResponse{Transaction: request.Transaction, Approved: false}, nil } func (alwaysDenyUI) ApproveSignData(request *core.SignDataRequest) (core.SignDataResponse, error) { - return core.SignDataResponse{Approved: false, Password: ""}, nil -} - -func (alwaysDenyUI) ApproveExport(request *core.ExportRequest) (core.ExportResponse, error) { - return core.ExportResponse{Approved: false}, nil -} - -func (alwaysDenyUI) ApproveImport(request *core.ImportRequest) (core.ImportResponse, error) { - return core.ImportResponse{Approved: false, OldPassword: "", NewPassword: ""}, nil + return core.SignDataResponse{Approved: false}, nil } func (alwaysDenyUI) ApproveListing(request *core.ListRequest) (core.ListResponse, error) { @@ -102,7 +96,7 @@ func (alwaysDenyUI) ApproveListing(request *core.ListRequest) (core.ListResponse } func (alwaysDenyUI) ApproveNewAccount(request *core.NewAccountRequest) (core.NewAccountResponse, error) { - return core.NewAccountResponse{Approved: false, Password: ""}, nil + return core.NewAccountResponse{Approved: false}, nil } func (alwaysDenyUI) ShowError(message string) { @@ -118,7 +112,7 @@ func (alwaysDenyUI) OnApprovedTx(tx ethapi.SignTransactionResult) { } func initRuleEngine(js string) (*rulesetUI, error) { - r, err := NewRuleEvaluator(&alwaysDenyUI{}, storage.NewEphemeralStorage(), storage.NewEphemeralStorage()) + r, err := NewRuleEvaluator(&alwaysDenyUI{}, storage.NewEphemeralStorage()) if err != nil { return nil, fmt.Errorf("failed to create js engine: %v", err) } @@ -129,11 +123,11 @@ func initRuleEngine(js string) (*rulesetUI, error) { } func TestListRequest(t *testing.T) { - accs := make([]core.Account, 5) + accs := make([]accounts.Account, 5) for i := range accs { addr := fmt.Sprintf("000000000000000000000000000000000000000%x", i) - acc := core.Account{ + acc := accounts.Account{ Address: common.BytesToAddress(common.Hex2Bytes(addr)), URL: accounts.URL{Scheme: "test", Path: fmt.Sprintf("acc-%d", i)}, } @@ -147,7 +141,7 @@ func TestListRequest(t *testing.T) { t.Errorf("Couldn't create evaluator %v", err) return } - resp, err := r.ApproveListing(&core.ListRequest{ + resp, _ := r.ApproveListing(&core.ListRequest{ Accounts: accs, Meta: core.Metadata{Remote: "remoteip", Local: "localip", Scheme: "inproc"}, }) @@ -184,7 +178,7 @@ func TestSignTxRequest(t *testing.T) { t.Error(err) return } - fmt.Printf("to %v", to.Address().String()) + t.Logf("to %v", to.Address().String()) resp, err := r.ApproveTx(&core.SignTxRequest{ Transaction: core.SendTxArgs{ From: *from, @@ -204,6 +198,10 @@ type dummyUI struct { calls []string } +func (d *dummyUI) RegisterUIServer(api *core.UIServerAPI) { + panic("implement me") +} + func (d *dummyUI) OnInputRequired(info core.UserInputRequest) (core.UserInputResponse, error) { d.calls = append(d.calls, "OnInputRequired") return core.UserInputResponse{}, nil @@ -219,16 +217,6 @@ func (d *dummyUI) ApproveSignData(request *core.SignDataRequest) (core.SignDataR return core.SignDataResponse{}, core.ErrRequestDenied } -func (d *dummyUI) ApproveExport(request *core.ExportRequest) (core.ExportResponse, error) { - d.calls = append(d.calls, "ApproveExport") - return core.ExportResponse{}, core.ErrRequestDenied -} - -func (d *dummyUI) ApproveImport(request *core.ImportRequest) (core.ImportResponse, error) { - d.calls = append(d.calls, "ApproveImport") - return core.ImportResponse{}, core.ErrRequestDenied -} - func (d *dummyUI) ApproveListing(request *core.ListRequest) (core.ListResponse, error) { d.calls = append(d.calls, "ApproveListing") return core.ListResponse{}, core.ErrRequestDenied @@ -250,6 +238,7 @@ func (d *dummyUI) ShowInfo(message string) { func (d *dummyUI) OnApprovedTx(tx ethapi.SignTransactionResult) { d.calls = append(d.calls, "OnApprovedTx") } + func (d *dummyUI) OnSignerStartup(info core.StartupInfo) { } @@ -259,8 +248,7 @@ func TestForwarding(t *testing.T) { js := "" ui := &dummyUI{make([]string, 0)} jsBackend := storage.NewEphemeralStorage() - credBackend := storage.NewEphemeralStorage() - r, err := NewRuleEvaluator(ui, jsBackend, credBackend) + r, err := NewRuleEvaluator(ui, jsBackend) if err != nil { t.Fatalf("Failed to create js engine: %v", err) } @@ -269,17 +257,15 @@ func TestForwarding(t *testing.T) { } r.ApproveSignData(nil) r.ApproveTx(nil) - r.ApproveImport(nil) r.ApproveNewAccount(nil) r.ApproveListing(nil) - r.ApproveExport(nil) r.ShowError("test") r.ShowInfo("test") //This one is not forwarded r.OnApprovedTx(ethapi.SignTransactionResult{}) - expCalls := 8 + expCalls := 6 if len(ui.calls) != expCalls { t.Errorf("Expected %d forwarded calls, got %d: %s", expCalls, len(ui.calls), strings.Join(ui.calls, ",")) @@ -308,30 +294,30 @@ func TestMissingFunc(t *testing.T) { if approved { t.Errorf("Expected missing method to cause non-approval") } - fmt.Printf("Err %v", err) + t.Logf("Err %v", err) } func TestStorage(t *testing.T) { js := ` function testStorage(){ - storage.Put("mykey", "myvalue") - a = storage.Get("mykey") + storage.put("mykey", "myvalue") + a = storage.get("mykey") - storage.Put("mykey", ["a", "list"]) // Should result in "a,list" - a += storage.Get("mykey") + storage.put("mykey", ["a", "list"]) // Should result in "a,list" + a += storage.get("mykey") - storage.Put("mykey", {"an": "object"}) // Should result in "[object Object]" - a += storage.Get("mykey") + storage.put("mykey", {"an": "object"}) // Should result in "[object Object]" + a += storage.get("mykey") - storage.Put("mykey", JSON.stringify({"an": "object"})) // Should result in '{"an":"object"}' - a += storage.Get("mykey") + storage.put("mykey", JSON.stringify({"an": "object"})) // Should result in '{"an":"object"}' + a += storage.get("mykey") - a += storage.Get("missingkey") //Missing keys should result in empty string - storage.Put("","missing key==noop") // Can't store with 0-length key - a += storage.Get("") // Should result in '' + a += storage.get("missingkey") //Missing keys should result in empty string + storage.put("","missing key==noop") // Can't store with 0-length key + a += storage.get("") // Should result in '' var b = new BigNumber(2) var c = new BigNumber(16)//"0xf0",16) @@ -351,7 +337,6 @@ func TestStorage(t *testing.T) { if err != nil { t.Errorf("Unexpected error %v", err) } - retval, err := v.ToString() if err != nil { @@ -361,7 +346,7 @@ func TestStorage(t *testing.T) { if retval != exp { t.Errorf("Unexpected data, expected '%v', got '%v'", exp, retval) } - fmt.Printf("Err %v", err) + t.Logf("Err %v", err) } @@ -383,7 +368,7 @@ const ExampleTxWindow = ` var windowstart = new Date().getTime() - window; var txs = []; - var stored = storage.Get('txs'); + var stored = storage.get('txs'); if(stored != ""){ txs = JSON.parse(stored) @@ -428,19 +413,18 @@ const ExampleTxWindow = ` var value = big(resp.tx.value) var txs = [] // Load stored transactions - var stored = storage.Get('txs'); + var stored = storage.get('txs'); if(stored != ""){ txs = JSON.parse(stored) } // Add this to the storage txs.push({tstamp: new Date().getTime(), value: value}); - storage.Put("txs", JSON.stringify(txs)); + storage.put("txs", JSON.stringify(txs)); } ` func dummyTx(value hexutil.Big) *core.SignTxRequest { - to, _ := mixAddr("000000000000000000000000000000000000dead") from, _ := mixAddr("000000000000000000000000000000000000dead") n := hexutil.Uint64(3) @@ -462,28 +446,27 @@ func dummyTx(value hexutil.Big) *core.SignTxRequest { Meta: core.Metadata{Remote: "remoteip", Local: "localip", Scheme: "inproc"}, } } -func dummyTxWithV(value uint64) *core.SignTxRequest { +func dummyTxWithV(value uint64) *core.SignTxRequest { v := big.NewInt(0).SetUint64(value) h := hexutil.Big(*v) return dummyTx(h) } + func dummySigned(value *big.Int) *types.Transaction { to := common.HexToAddress("000000000000000000000000000000000000dead") gas := uint64(21000) gasPrice := big.NewInt(2000000) data := make([]byte, 0) return types.NewTransaction(3, to, value, gas, gasPrice, data) - } -func TestLimitWindow(t *testing.T) { +func TestLimitWindow(t *testing.T) { r, err := initRuleEngine(ExampleTxWindow) if err != nil { t.Errorf("Couldn't create evaluator %v", err) return } - // 0.3 ether: 429D069189E0000 wei v := big.NewInt(0).SetBytes(common.Hex2Bytes("0429D069189E0000")) h := hexutil.Big(*v) @@ -506,11 +489,10 @@ func TestLimitWindow(t *testing.T) { r.OnApprovedTx(response) } // Fourth should fail - resp, err := r.ApproveTx(dummyTx(h)) + resp, _ := r.ApproveTx(dummyTx(h)) if resp.Approved { t.Errorf("Expected check to resolve to 'Reject'") } - } // dontCallMe is used as a next-handler that does not want to be called - it invokes test failure @@ -523,6 +505,9 @@ func (d *dontCallMe) OnInputRequired(info core.UserInputRequest) (core.UserInput return core.UserInputResponse{}, nil } +func (d *dontCallMe) RegisterUIServer(api *core.UIServerAPI) { +} + func (d *dontCallMe) OnSignerStartup(info core.StartupInfo) { } @@ -536,16 +521,6 @@ func (d *dontCallMe) ApproveSignData(request *core.SignDataRequest) (core.SignDa return core.SignDataResponse{}, core.ErrRequestDenied } -func (d *dontCallMe) ApproveExport(request *core.ExportRequest) (core.ExportResponse, error) { - d.t.Fatalf("Did not expect next-handler to be called") - return core.ExportResponse{}, core.ErrRequestDenied -} - -func (d *dontCallMe) ApproveImport(request *core.ImportRequest) (core.ImportResponse, error) { - d.t.Fatalf("Did not expect next-handler to be called") - return core.ImportResponse{}, core.ErrRequestDenied -} - func (d *dontCallMe) ApproveListing(request *core.ListRequest) (core.ListResponse, error) { d.t.Fatalf("Did not expect next-handler to be called") return core.ListResponse{}, core.ErrRequestDenied @@ -588,7 +563,7 @@ func TestContextIsCleared(t *testing.T) { } ` ui := &dontCallMe{t} - r, err := NewRuleEvaluator(ui, storage.NewEphemeralStorage(), storage.NewEphemeralStorage()) + r, err := NewRuleEvaluator(ui, storage.NewEphemeralStorage()) if err != nil { t.Fatalf("Failed to create js engine: %v", err) } @@ -596,8 +571,8 @@ func TestContextIsCleared(t *testing.T) { t.Fatalf("Failed to load bootstrap js: %v", err) } tx := dummyTxWithV(0) - r1, err := r.ApproveTx(tx) - r2, err := r.ApproveTx(tx) + r1, _ := r.ApproveTx(tx) + r2, _ := r.ApproveTx(tx) if r1.Approved != r2.Approved { t.Errorf("Expected execution context to be cleared between executions") } @@ -611,7 +586,7 @@ func TestSignData(t *testing.T) { function ApproveSignData(r){ if( r.address.toLowerCase() == "0x694267f14675d7e1b9494fd8d72fefe1755710fa") { - if(r.message.indexOf("bazonk") >= 0){ + if(r.messages[0].value.indexOf("bazonk") >= 0){ return "Approve" } return "Reject" @@ -623,18 +598,25 @@ function ApproveSignData(r){ t.Errorf("Couldn't create evaluator %v", err) return } - message := []byte("baz bazonk foo") - hash, msg := core.SignHash(message) - raw := hexutil.Bytes(message) + message := "baz bazonk foo" + hash, rawdata := accounts.TextAndHash([]byte(message)) addr, _ := mixAddr("0x694267f14675d7e1b9494fd8d72fefe1755710fa") - fmt.Printf("address %v %v\n", addr.String(), addr.Original()) + t.Logf("address %v %v\n", addr.String(), addr.Original()) + + nvt := []*core.NameValueType{ + { + Name: "message", + Typ: "text/plain", + Value: message, + }, + } resp, err := r.ApproveSignData(&core.SignDataRequest{ - Address: *addr, - Message: msg, - Hash: hash, - Meta: core.Metadata{Remote: "remoteip", Local: "localip", Scheme: "inproc"}, - Rawdata: raw, + Address: *addr, + Messages: nvt, + Hash: hash, + Meta: core.Metadata{Remote: "remoteip", Local: "localip", Scheme: "inproc"}, + Rawdata: []byte(rawdata), }) if err != nil { t.Fatalf("Unexpected error %v", err) diff --git a/signer/storage/aes_gcm_storage.go b/signer/storage/aes_gcm_storage.go index 900831867914..8c5e147ac6d2 100644 --- a/signer/storage/aes_gcm_storage.go +++ b/signer/storage/aes_gcm_storage.go @@ -1,19 +1,18 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// GNU Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package storage @@ -53,7 +52,7 @@ func NewAESEncryptedStorage(filename string, key []byte) *AESEncryptedStorage { } } -// Put stores a value by key. 0-length keys results in no-op +// Put stores a value by key. 0-length keys results in noop. func (s *AESEncryptedStorage) Put(key, value string) { if len(key) == 0 { return @@ -75,27 +74,41 @@ func (s *AESEncryptedStorage) Put(key, value string) { } } -// Get returns the previously stored value, or the empty string if it does not exist or key is of 0-length -func (s *AESEncryptedStorage) Get(key string) string { +// Get returns the previously stored value, or an error if it does not exist or +// key is of 0-length. +func (s *AESEncryptedStorage) Get(key string) (string, error) { if len(key) == 0 { - return "" + return "", ErrZeroKey } data, err := s.readEncryptedStorage() if err != nil { log.Warn("Failed to read encrypted storage", "err", err, "file", s.filename) - return "" + return "", err } encrypted, exist := data[key] if !exist { log.Warn("Key does not exist", "key", key) - return "" + return "", ErrNotFound } entry, err := decrypt(s.key, encrypted.Iv, encrypted.CipherText, []byte(key)) if err != nil { log.Warn("Failed to decrypt key", "key", key) - return "" + return "", err + } + return string(entry), nil +} + +// Del removes a key-value pair. If the key doesn't exist, the method is a noop. +func (s *AESEncryptedStorage) Del(key string) { + data, err := s.readEncryptedStorage() + if err != nil { + log.Warn("Failed to read encrypted storage", "err", err, "file", s.filename) + return + } + delete(data, key) + if err = s.writeEncryptedStorage(data); err != nil { + log.Warn("Failed to write entry", "err", err) } - return string(entry) } // readEncryptedStorage reads the file with encrypted creds diff --git a/signer/storage/aes_gcm_storage_test.go b/signer/storage/aes_gcm_storage_test.go index a421a8449d7d..664ef1299405 100644 --- a/signer/storage/aes_gcm_storage_test.go +++ b/signer/storage/aes_gcm_storage_test.go @@ -1,19 +1,19 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// GNU Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + package storage import ( @@ -38,13 +38,13 @@ func TestEncryption(t *testing.T) { if err != nil { t.Fatal(err) } - fmt.Printf("Ciphertext %x, nonce %x\n", c, iv) + t.Logf("Ciphertext %x, nonce %x\n", c, iv) p, err := decrypt(key, iv, c, nil) if err != nil { t.Fatal(err) } - fmt.Printf("Plaintext %v\n", string(p)) + t.Logf("Plaintext %v\n", string(p)) if !bytes.Equal(plaintext, p) { t.Errorf("Failed: expected plaintext recovery, got %v expected %v", string(plaintext), string(p)) } @@ -110,8 +110,8 @@ func TestEnd2End(t *testing.T) { } s1.Put("bazonk", "foobar") - if v := s2.Get("bazonk"); v != "foobar" { - t.Errorf("Expected bazonk->foobar, got '%v'", v) + if v, err := s2.Get("bazonk"); v != "foobar" || err != nil { + t.Errorf("Expected bazonk->foobar (nil error), got '%v' (%v error)", v, err) } } @@ -154,11 +154,11 @@ func TestSwappedKeys(t *testing.T) { } } swap() - if v := s1.Get("k1"); v != "" { + if v, _ := s1.Get("k1"); v != "" { t.Errorf("swapped value should return empty") } swap() - if v := s1.Get("k1"); v != "v1" { + if v, _ := s1.Get("k1"); v != "v1" { t.Errorf("double-swapped value should work fine") } } diff --git a/signer/storage/storage.go b/signer/storage/storage.go index 60f4e3892a31..06b0fd98f753 100644 --- a/signer/storage/storage.go +++ b/signer/storage/storage.go @@ -1,31 +1,41 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// go-ethereum is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// go-ethereum is distributed in the hope that it will be useful, +// The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with go-ethereum. If not, see . +// GNU Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package storage -import ( - "fmt" +import "errors" + +var ( + // ErrZeroKey is returned if an attempt was made to inset a 0-length key. + ErrZeroKey = errors.New("0-length key") + + // ErrNotFound is returned if an unknown key is attempted to be retrieved. + ErrNotFound = errors.New("not found") ) type Storage interface { - // Put stores a value by key. 0-length keys results in no-op + // Put stores a value by key. 0-length keys results in noop. Put(key, value string) - // Get returns the previously stored value, or the empty string if it does not exist or key is of 0-length - Get(key string) string + + // Get returns the previously stored value, or an error if the key is 0-length + // or unknown. + Get(key string) (string, error) + + // Del removes a key-value pair. If the key doesn't exist, the method is a noop. + Del(key string) } // EphemeralStorage is an in-memory storage that does @@ -35,23 +45,29 @@ type EphemeralStorage struct { namespace string } +// Put stores a value by key. 0-length keys results in noop. func (s *EphemeralStorage) Put(key, value string) { if len(key) == 0 { return } - fmt.Printf("storage: put %v -> %v\n", key, value) s.data[key] = value } -func (s *EphemeralStorage) Get(key string) string { +// Get returns the previously stored value, or an error if the key is 0-length +// or unknown. +func (s *EphemeralStorage) Get(key string) (string, error) { if len(key) == 0 { - return "" + return "", ErrZeroKey } - fmt.Printf("storage: get %v\n", key) - if v, exist := s.data[key]; exist { - return v + if v, ok := s.data[key]; ok { + return v, nil } - return "" + return "", ErrNotFound +} + +// Del removes a key-value pair. If the key doesn't exist, the method is a noop. +func (s *EphemeralStorage) Del(key string) { + delete(s.data, key) } func NewEphemeralStorage() Storage { @@ -60,3 +76,12 @@ func NewEphemeralStorage() Storage { } return s } + +// NoStorage is a dummy construct which doesn't remember anything you tell it +type NoStorage struct{} + +func (s *NoStorage) Put(key, value string) {} +func (s *NoStorage) Del(key string) {} +func (s *NoStorage) Get(key string) (string, error) { + return "", errors.New("I forgot") +} diff --git a/swarm/AUTHORS b/swarm/AUTHORS deleted file mode 100644 index f7232f07ce74..000000000000 --- a/swarm/AUTHORS +++ /dev/null @@ -1,35 +0,0 @@ -# Core team members - -Viktor Trón - @zelig -Louis Holbrook - @nolash -Lewis Marshall - @lmars -Anton Evangelatov - @nonsense -Janoš Guljaš - @janos -Balint Gabor - @gbalint -Elad Nachmias - @justelad -Daniel A. Nagy - @nagydani -Aron Fischer - @homotopycolimit -Fabio Barone - @holisticode -Zahoor Mohamed - @jmozah -Zsolt Felföldi - @zsfelfoldi - -# External contributors - -Kiel Barry -Gary Rong -Jared Wasinger -Leon Stanko -Javier Peletier [epiclabs.io] -Bartek Borkowski [tungsten-labs.com] -Shane Howley [mainframe.com] -Doug Leonard [mainframe.com] -Ivan Daniluk [status.im] -Felix Lange [EF] -Martin Holst Swende [EF] -Guillaume Ballet [EF] -ligi [EF] -Christopher Dro [blick-labs.com] -Sergii Bomko [ledgerleopard.com] -Domino Valdano -Rafael Matias -Coogan Brennan \ No newline at end of file diff --git a/swarm/OWNERS b/swarm/OWNERS deleted file mode 100644 index 774cd7db9de5..000000000000 --- a/swarm/OWNERS +++ /dev/null @@ -1,26 +0,0 @@ -# Ownership by go packages - -swarm -├── api ─────────────────── ethersphere -├── bmt ─────────────────── @zelig -├── dev ─────────────────── @lmars -├── fuse ────────────────── @jmozah, @holisticode -├── grafana_dashboards ──── @nonsense -├── metrics ─────────────── @nonsense, @holisticode -├── multihash ───────────── @nolash -├── network ─────────────── ethersphere -│ ├── bitvector ───────── @zelig, @janos, @gbalint -│ ├── priorityqueue ───── @zelig, @janos, @gbalint -│ ├── simulations ─────── @zelig -│ └── stream ──────────── @janos, @zelig, @gbalint, @holisticode, @justelad -│ ├── intervals ───── @janos -│ └── testing ─────── @zelig -├── pot ─────────────────── @zelig -├── pss ─────────────────── @nolash, @zelig, @nonsense -├── services ────────────── @zelig -├── state ───────────────── @justelad -├── storage ─────────────── ethersphere -│ ├── encryption ──────── @gbalint, @zelig, @nagydani -│ ├── mock ────────────── @janos -│ └── mru ─────────────── @nolash -└── testutil ────────────── @lmars \ No newline at end of file diff --git a/swarm/README.md b/swarm/README.md index e81963217f97..265883181306 100644 --- a/swarm/README.md +++ b/swarm/README.md @@ -1,244 +1,7 @@ -## Swarm +# Swarm -[https://swarm.ethereum.org](https://swarm.ethereum.org) +https://swarm.ethereum.org Swarm is a distributed storage platform and content distribution service, a native base layer service of the ethereum web3 stack. The primary objective of Swarm is to provide a decentralized and redundant store for dapp code and data as well as block chain and state data. Swarm is also set out to provide various base layer services for web3, including node-to-node messaging, media streaming, decentralised database services and scalable state-channel infrastructure for decentralised service economies. -[![Travis](https://travis-ci.org/ethereum/go-ethereum.svg?branch=master)](https://travis-ci.org/ethereum/go-ethereum) -[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ethersphere/orange-lounge?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -## Table of Contents - -* [Building the source](#building-the-source) -* [Running Swarm](#running-swarm) -* [Documentation](#documentation) -* [Developers Guide](#developers-guide) - * [Go Environment](#development-environment) - * [Vendored Dependencies](#vendored-dependencies) - * [Testing](#testing) - * [Profiling Swarm](#profiling-swarm) - * [Metrics and Instrumentation in Swarm](#metrics-and-instrumentation-in-swarm) -* [Public Gateways](#public-gateways) -* [Swarm Dapps](#swarm-dapps) -* [Contributing](#contributing) -* [License](#license) - -## Building the source - -Building Swarm requires Go (version 1.10 or later). - - go get -d github.com/ethereum/go-ethereum - - go install github.com/ethereum/go-ethereum/cmd/swarm - -## Running Swarm - -Going through all the possible command line flags is out of scope here, but we've enumerated a few common parameter combos to get you up to speed quickly on how you can run your own Swarm node. - -To run Swarm you need an Ethereum account. You can create a new account by running the following command: - - geth account new - -You will be prompted for a password: - - Your new account is locked with a password. Please give a password. Do not forget this password. - Passphrase: - Repeat passphrase: - -Once you have specified the password, the output will be the Ethereum address representing that account. For example: - - Address: {2f1cd699b0bf461dcfbf0098ad8f5587b038f0f1} - -Using this account, connect to Swarm with - - swarm --bzzaccount - - # in our example - - swarm --bzzaccount 2f1cd699b0bf461dcfbf0098ad8f5587b038f0f1 - - -### Verifying that your local Swarm node is running - -When running, Swarm is accessible through an HTTP API on port 8500. - -Confirm that it is up and running by pointing your browser to http://localhost:8500 - -### Ethereum Name Service resolution - -The Ethereum Name Service is the Ethereum equivalent of DNS in the classic web. In order to use ENS to resolve names to Swarm content hashes (e.g. `bzz://theswarm.eth`), `swarm` has to connect to a `geth` instance, which is synced with the Ethereum mainnet. This is done using the `--ens-api` flag. - - swarm --bzzaccount \ - --ens-api '$HOME/.ethereum/geth.ipc' - - # in our example - - swarm --bzzaccount 2f1cd699b0bf461dcfbf0098ad8f5587b038f0f1 \ - --ens-api '$HOME/.ethereum/geth.ipc' - -For more information on usage, features or command line flags, please consult the Documentation. - - -## Documentation - -Swarm documentation can be found at [https://swarm-guide.readthedocs.io](https://swarm-guide.readthedocs.io). - - -## Developers Guide - -### Go Environment - -We assume that you have Go v1.10 installed, and `GOPATH` is set. - -You must have your working copy under `$GOPATH/src/github.com/ethereum/go-ethereum`. - -Most likely you will be working from your fork of `go-ethereum`, let's say from `github.com/nirname/go-ethereum`. Clone or move your fork into the right place: - -``` -git clone git@github.com:nirname/go-ethereum.git $GOPATH/src/github.com/ethereum/go-ethereum -``` - - -### Vendored Dependencies - -All dependencies are tracked in the `vendor` directory. We use `govendor` to manage them. - -If you want to add a new dependency, run `govendor fetch `, then commit the result. - -If you want to update all dependencies to their latest upstream version, run `govendor fetch +v`. - - -### Testing - -This section explains how to run unit, integration, and end-to-end tests in your development sandbox. - -Testing one library: - -``` -go test -v -cpu 4 ./swarm/api -``` - -Note: Using options -cpu (number of cores allowed) and -v (logging even if no error) is recommended. - -Testing only some methods: - -``` -go test -v -cpu 4 ./eth -run TestMethod -``` - -Note: here all tests with prefix TestMethod will be run, so if you got TestMethod, TestMethod1, then both! - -Running benchmarks: - -``` -go test -v -cpu 4 -bench . -run BenchmarkJoin -``` - - -### Profiling Swarm - -This section explains how to add Go `pprof` profiler to Swarm - -If `swarm` is started with the `--pprof` option, a debugging HTTP server is made available on port 6060. - -You can bring up http://localhost:6060/debug/pprof to see the heap, running routines etc. - -By clicking full goroutine stack dump (clicking http://localhost:6060/debug/pprof/goroutine?debug=2) you can generate trace that is useful for debugging. - - -### Metrics and Instrumentation in Swarm - -This section explains how to visualize and use existing Swarm metrics and how to instrument Swarm with a new metric. - -Swarm metrics system is based on the `go-metrics` library. - -The most common types of measurements we use in Swarm are `counters` and `resetting timers`. Consult the `go-metrics` documentation for full reference of available types. - -``` -# incrementing a counter -metrics.GetOrRegisterCounter("network.stream.received_chunks", nil).Inc(1) - -# measuring latency with a resetting timer -start := time.Now() -t := metrics.GetOrRegisterResettingTimer("http.request.GET.time"), nil) -... -t := UpdateSince(start) -``` - -#### Visualizing metrics - -Swarm supports an InfluxDB exporter. Consult the help section to learn about the command line arguments used to configure it: - -``` -swarm --help | grep metrics -``` - -We use Grafana and InfluxDB to visualise metrics reported by Swarm. We keep our Grafana dashboards under version control at `./swarm/grafana_dashboards`. You could use them or design your own. - -We have built a tool to help with automatic start of Grafana and InfluxDB and provisioning of dashboards at https://github.com/nonsense/stateth , which requires that you have Docker installed. - -Once you have `stateth` installed, and you have Docker running locally, you have to: - -1. Run `stateth` and keep it running in the background -``` -stateth --rm --grafana-dashboards-folder $GOPATH/src/github.com/ethereum/go-ethereum/swarm/grafana_dashboards --influxdb-database metrics -``` - -2. Run `swarm` with at least the following params: -``` ---metrics \ ---metrics.influxdb.export \ ---metrics.influxdb.endpoint "http://localhost:8086" \ ---metrics.influxdb.username "admin" \ ---metrics.influxdb.password "admin" \ ---metrics.influxdb.database "metrics" -``` - -3. Open Grafana at http://localhost:3000 and view the dashboards to gain insight into Swarm. - - -## Public Gateways - -Swarm offers a local HTTP proxy API that Dapps can use to interact with Swarm. The Ethereum Foundation is hosting a public gateway, which allows free access so that people can try Swarm without running their own node. - -The Swarm public gateways are temporary and users should not rely on their existence for production services. - -The Swarm public gateway can be found at https://swarm-gateways.net and is always running the latest `stable` Swarm release. - -## Swarm Dapps - -You can find a few reference Swarm decentralised applications at: https://swarm-gateways.net/bzz:/swarmapps.eth - -Their source code can be found at: https://github.com/ethersphere/swarm-dapps - -## Contributing - -Thank you for considering to help out with the source code! We welcome contributions from -anyone on the internet, and are grateful for even the smallest of fixes! - -If you'd like to contribute to Swarm, please fork, fix, commit and send a pull request -for the maintainers to review and merge into the main code base. If you wish to submit more -complex changes though, please check up with the core devs first on [our Swarm gitter channel](https://gitter.im/ethersphere/orange-lounge) -to ensure those changes are in line with the general philosophy of the project and/or get some -early feedback which can make both your efforts much lighter as well as our review and merge -procedures quick and simple. - -Please make sure your contributions adhere to our coding guidelines: - - * Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). - * Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines. - * Pull requests need to be based on and opened against the `master` branch. - * [Code review guidelines](https://github.com/ethereum/go-ethereum/wiki/Code-Review-Guidelines). - * Commit messages should be prefixed with the package(s) they modify. - * E.g. "swarm/fuse: ignore default manifest entry" - - -## License - -The go-ethereum library (i.e. all code outside of the `cmd` directory) is licensed under the -[GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html), also -included in our repository in the `COPYING.LESSER` file. - -The go-ethereum binaries (i.e. all code inside of the `cmd` directory) is licensed under the -[GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html), also included -in our repository in the `COPYING` file. +**Note**: The codebase has been moved to [ethersphere/swarm](https://github.com/ethersphere/swarm) diff --git a/swarm/api/act.go b/swarm/api/act.go deleted file mode 100644 index 52d909827190..000000000000 --- a/swarm/api/act.go +++ /dev/null @@ -1,535 +0,0 @@ -package api - -import ( - "context" - "crypto/ecdsa" - "crypto/rand" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/ecies" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/sctx" - "github.com/ethereum/go-ethereum/swarm/storage" - "golang.org/x/crypto/scrypt" - cli "gopkg.in/urfave/cli.v1" -) - -var ( - ErrDecrypt = errors.New("cant decrypt - forbidden") - ErrUnknownAccessType = errors.New("unknown access type (or not implemented)") - ErrDecryptDomainForbidden = errors.New("decryption request domain forbidden - can only decrypt on localhost") - AllowedDecryptDomains = []string{ - "localhost", - "127.0.0.1", - } -) - -const EMPTY_CREDENTIALS = "" - -type AccessEntry struct { - Type AccessType - Publisher string - Salt []byte - Act string - KdfParams *KdfParams -} - -type DecryptFunc func(*ManifestEntry) error - -func (a *AccessEntry) MarshalJSON() (out []byte, err error) { - - return json.Marshal(struct { - Type AccessType `json:"type,omitempty"` - Publisher string `json:"publisher,omitempty"` - Salt string `json:"salt,omitempty"` - Act string `json:"act,omitempty"` - KdfParams *KdfParams `json:"kdf_params,omitempty"` - }{ - Type: a.Type, - Publisher: a.Publisher, - Salt: hex.EncodeToString(a.Salt), - Act: a.Act, - KdfParams: a.KdfParams, - }) - -} - -func (a *AccessEntry) UnmarshalJSON(value []byte) error { - v := struct { - Type AccessType `json:"type,omitempty"` - Publisher string `json:"publisher,omitempty"` - Salt string `json:"salt,omitempty"` - Act string `json:"act,omitempty"` - KdfParams *KdfParams `json:"kdf_params,omitempty"` - }{} - - err := json.Unmarshal(value, &v) - if err != nil { - return err - } - a.Act = v.Act - a.KdfParams = v.KdfParams - a.Publisher = v.Publisher - a.Salt, err = hex.DecodeString(v.Salt) - if err != nil { - return err - } - if len(a.Salt) != 32 { - return errors.New("salt should be 32 bytes long") - } - a.Type = v.Type - return nil -} - -type KdfParams struct { - N int `json:"n"` - P int `json:"p"` - R int `json:"r"` -} - -type AccessType string - -const AccessTypePass = AccessType("pass") -const AccessTypePK = AccessType("pk") -const AccessTypeACT = AccessType("act") - -// NewAccessEntryPassword creates a manifest AccessEntry in order to create an ACT protected by a password -func NewAccessEntryPassword(salt []byte, kdfParams *KdfParams) (*AccessEntry, error) { - if len(salt) != 32 { - return nil, fmt.Errorf("salt should be 32 bytes long") - } - return &AccessEntry{ - Type: AccessTypePass, - Salt: salt, - KdfParams: kdfParams, - }, nil -} - -// NewAccessEntryPK creates a manifest AccessEntry in order to create an ACT protected by a pair of Elliptic Curve keys -func NewAccessEntryPK(publisher string, salt []byte) (*AccessEntry, error) { - if len(publisher) != 66 { - return nil, fmt.Errorf("publisher should be 66 characters long, got %d", len(publisher)) - } - if len(salt) != 32 { - return nil, fmt.Errorf("salt should be 32 bytes long") - } - return &AccessEntry{ - Type: AccessTypePK, - Publisher: publisher, - Salt: salt, - }, nil -} - -// NewAccessEntryACT creates a manifest AccessEntry in order to create an ACT protected by a combination of EC keys and passwords -func NewAccessEntryACT(publisher string, salt []byte, act string) (*AccessEntry, error) { - if len(salt) != 32 { - return nil, fmt.Errorf("salt should be 32 bytes long") - } - if len(publisher) != 66 { - return nil, fmt.Errorf("publisher should be 66 characters long") - } - - return &AccessEntry{ - Type: AccessTypeACT, - Publisher: publisher, - Salt: salt, - Act: act, - KdfParams: DefaultKdfParams, - }, nil -} - -// NOOPDecrypt is a generic decrypt function that is passed into the API in places where real ACT decryption capabilities are -// either unwanted, or alternatively, cannot be implemented in the immediate scope -func NOOPDecrypt(*ManifestEntry) error { - return nil -} - -var DefaultKdfParams = NewKdfParams(262144, 1, 8) - -// NewKdfParams returns a KdfParams struct with the given scrypt params -func NewKdfParams(n, p, r int) *KdfParams { - - return &KdfParams{ - N: n, - P: p, - R: r, - } -} - -// NewSessionKeyPassword creates a session key based on a shared secret (password) and the given salt -// and kdf parameters in the access entry -func NewSessionKeyPassword(password string, accessEntry *AccessEntry) ([]byte, error) { - if accessEntry.Type != AccessTypePass && accessEntry.Type != AccessTypeACT { - return nil, errors.New("incorrect access entry type") - - } - return sessionKeyPassword(password, accessEntry.Salt, accessEntry.KdfParams) -} - -func sessionKeyPassword(password string, salt []byte, kdfParams *KdfParams) ([]byte, error) { - return scrypt.Key( - []byte(password), - salt, - kdfParams.N, - kdfParams.R, - kdfParams.P, - 32, - ) -} - -// NewSessionKeyPK creates a new ACT Session Key using an ECDH shared secret for the given key pair and the given salt value -func NewSessionKeyPK(private *ecdsa.PrivateKey, public *ecdsa.PublicKey, salt []byte) ([]byte, error) { - granteePubEcies := ecies.ImportECDSAPublic(public) - privateKey := ecies.ImportECDSA(private) - - bytes, err := privateKey.GenerateShared(granteePubEcies, 16, 16) - if err != nil { - return nil, err - } - bytes = append(salt, bytes...) - sessionKey := crypto.Keccak256(bytes) - return sessionKey, nil -} - -func (a *API) doDecrypt(ctx context.Context, credentials string, pk *ecdsa.PrivateKey) DecryptFunc { - return func(m *ManifestEntry) error { - if m.Access == nil { - return nil - } - - allowed := false - requestDomain := sctx.GetHost(ctx) - for _, v := range AllowedDecryptDomains { - if strings.Contains(requestDomain, v) { - allowed = true - } - } - - if !allowed { - return ErrDecryptDomainForbidden - } - - switch m.Access.Type { - case "pass": - if credentials != "" { - key, err := NewSessionKeyPassword(credentials, m.Access) - if err != nil { - return err - } - - ref, err := hex.DecodeString(m.Hash) - if err != nil { - return err - } - - enc := NewRefEncryption(len(ref) - 8) - decodedRef, err := enc.Decrypt(ref, key) - if err != nil { - return ErrDecrypt - } - - m.Hash = hex.EncodeToString(decodedRef) - m.Access = nil - return nil - } - return ErrDecrypt - case "pk": - publisherBytes, err := hex.DecodeString(m.Access.Publisher) - if err != nil { - return ErrDecrypt - } - publisher, err := crypto.DecompressPubkey(publisherBytes) - if err != nil { - return ErrDecrypt - } - key, err := NewSessionKeyPK(pk, publisher, m.Access.Salt) - if err != nil { - return ErrDecrypt - } - ref, err := hex.DecodeString(m.Hash) - if err != nil { - return err - } - - enc := NewRefEncryption(len(ref) - 8) - decodedRef, err := enc.Decrypt(ref, key) - if err != nil { - return ErrDecrypt - } - - m.Hash = hex.EncodeToString(decodedRef) - m.Access = nil - return nil - case "act": - var ( - sessionKey []byte - err error - ) - - publisherBytes, err := hex.DecodeString(m.Access.Publisher) - if err != nil { - return ErrDecrypt - } - publisher, err := crypto.DecompressPubkey(publisherBytes) - if err != nil { - return ErrDecrypt - } - - sessionKey, err = NewSessionKeyPK(pk, publisher, m.Access.Salt) - if err != nil { - return ErrDecrypt - } - - found, ciphertext, decryptionKey, err := a.getACTDecryptionKey(ctx, storage.Address(common.Hex2Bytes(m.Access.Act)), sessionKey) - if err != nil { - return err - } - if !found { - // try to fall back to password - if credentials != "" { - sessionKey, err = NewSessionKeyPassword(credentials, m.Access) - if err != nil { - return err - } - found, ciphertext, decryptionKey, err = a.getACTDecryptionKey(ctx, storage.Address(common.Hex2Bytes(m.Access.Act)), sessionKey) - if err != nil { - return err - } - if !found { - return ErrDecrypt - } - } else { - return ErrDecrypt - } - } - enc := NewRefEncryption(len(ciphertext) - 8) - decodedRef, err := enc.Decrypt(ciphertext, decryptionKey) - if err != nil { - return ErrDecrypt - } - - ref, err := hex.DecodeString(m.Hash) - if err != nil { - return err - } - - enc = NewRefEncryption(len(ref) - 8) - decodedMainRef, err := enc.Decrypt(ref, decodedRef) - if err != nil { - return ErrDecrypt - } - m.Hash = hex.EncodeToString(decodedMainRef) - m.Access = nil - return nil - } - return ErrUnknownAccessType - } -} - -func (a *API) getACTDecryptionKey(ctx context.Context, actManifestAddress storage.Address, sessionKey []byte) (found bool, ciphertext, decryptionKey []byte, err error) { - hasher := sha3.NewKeccak256() - hasher.Write(append(sessionKey, 0)) - lookupKey := hasher.Sum(nil) - hasher.Reset() - - hasher.Write(append(sessionKey, 1)) - accessKeyDecryptionKey := hasher.Sum(nil) - hasher.Reset() - - lk := hex.EncodeToString(lookupKey) - list, err := a.GetManifestList(ctx, NOOPDecrypt, actManifestAddress, lk) - if err != nil { - return false, nil, nil, err - } - for _, v := range list.Entries { - if v.Path == lk { - cipherTextBytes, err := hex.DecodeString(v.Hash) - if err != nil { - return false, nil, nil, err - } - return true, cipherTextBytes, accessKeyDecryptionKey, nil - } - } - return false, nil, nil, nil -} - -func GenerateAccessControlManifest(ctx *cli.Context, ref string, accessKey []byte, ae *AccessEntry) (*Manifest, error) { - refBytes, err := hex.DecodeString(ref) - if err != nil { - return nil, err - } - // encrypt ref with accessKey - enc := NewRefEncryption(len(refBytes)) - encrypted, err := enc.Encrypt(refBytes, accessKey) - if err != nil { - return nil, err - } - - m := &Manifest{ - Entries: []ManifestEntry{ - { - Hash: hex.EncodeToString(encrypted), - ContentType: ManifestType, - ModTime: time.Now(), - Access: ae, - }, - }, - } - - return m, nil -} - -// DoPK is a helper function to the CLI API that handles the entire business logic for -// creating a session key and access entry given the cli context, ec keys and salt -func DoPK(ctx *cli.Context, privateKey *ecdsa.PrivateKey, granteePublicKey string, salt []byte) (sessionKey []byte, ae *AccessEntry, err error) { - if granteePublicKey == "" { - return nil, nil, errors.New("need a grantee Public Key") - } - b, err := hex.DecodeString(granteePublicKey) - if err != nil { - log.Error("error decoding grantee public key", "err", err) - return nil, nil, err - } - - granteePub, err := crypto.DecompressPubkey(b) - if err != nil { - log.Error("error decompressing grantee public key", "err", err) - return nil, nil, err - } - - sessionKey, err = NewSessionKeyPK(privateKey, granteePub, salt) - if err != nil { - log.Error("error getting session key", "err", err) - return nil, nil, err - } - - ae, err = NewAccessEntryPK(hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)), salt) - if err != nil { - log.Error("error generating access entry", "err", err) - return nil, nil, err - } - - return sessionKey, ae, nil -} - -// DoACT is a helper function to the CLI API that handles the entire business logic for -// creating a access key, access entry and ACT manifest (including uploading it) given the cli context, ec keys, password grantees and salt -func DoACT(ctx *cli.Context, privateKey *ecdsa.PrivateKey, salt []byte, grantees []string, encryptPasswords []string) (accessKey []byte, ae *AccessEntry, actManifest *Manifest, err error) { - if len(grantees) == 0 && len(encryptPasswords) == 0 { - return nil, nil, nil, errors.New("did not get any grantee public keys or any encryption passwords") - } - - publisherPub := hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)) - grantees = append(grantees, publisherPub) - - accessKey = make([]byte, 32) - if _, err := io.ReadFull(rand.Reader, salt); err != nil { - panic("reading from crypto/rand failed: " + err.Error()) - } - if _, err := io.ReadFull(rand.Reader, accessKey); err != nil { - panic("reading from crypto/rand failed: " + err.Error()) - } - - lookupPathEncryptedAccessKeyMap := make(map[string]string) - i := 0 - for _, v := range grantees { - i++ - if v == "" { - return nil, nil, nil, errors.New("need a grantee Public Key") - } - b, err := hex.DecodeString(v) - if err != nil { - log.Error("error decoding grantee public key", "err", err) - return nil, nil, nil, err - } - - granteePub, err := crypto.DecompressPubkey(b) - if err != nil { - log.Error("error decompressing grantee public key", "err", err) - return nil, nil, nil, err - } - sessionKey, err := NewSessionKeyPK(privateKey, granteePub, salt) - - hasher := sha3.NewKeccak256() - hasher.Write(append(sessionKey, 0)) - lookupKey := hasher.Sum(nil) - - hasher.Reset() - hasher.Write(append(sessionKey, 1)) - - accessKeyEncryptionKey := hasher.Sum(nil) - - enc := NewRefEncryption(len(accessKey)) - encryptedAccessKey, err := enc.Encrypt(accessKey, accessKeyEncryptionKey) - if err != nil { - return nil, nil, nil, err - } - lookupPathEncryptedAccessKeyMap[hex.EncodeToString(lookupKey)] = hex.EncodeToString(encryptedAccessKey) - } - - for _, pass := range encryptPasswords { - sessionKey, err := sessionKeyPassword(pass, salt, DefaultKdfParams) - if err != nil { - return nil, nil, nil, err - } - hasher := sha3.NewKeccak256() - hasher.Write(append(sessionKey, 0)) - lookupKey := hasher.Sum(nil) - - hasher.Reset() - hasher.Write(append(sessionKey, 1)) - - accessKeyEncryptionKey := hasher.Sum(nil) - - enc := NewRefEncryption(len(accessKey)) - encryptedAccessKey, err := enc.Encrypt(accessKey, accessKeyEncryptionKey) - if err != nil { - return nil, nil, nil, err - } - lookupPathEncryptedAccessKeyMap[hex.EncodeToString(lookupKey)] = hex.EncodeToString(encryptedAccessKey) - } - - m := &Manifest{ - Entries: []ManifestEntry{}, - } - - for k, v := range lookupPathEncryptedAccessKeyMap { - m.Entries = append(m.Entries, ManifestEntry{ - Path: k, - Hash: v, - ContentType: "text/plain", - }) - } - - ae, err = NewAccessEntryACT(hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)), salt, "") - if err != nil { - return nil, nil, nil, err - } - - return accessKey, ae, m, nil -} - -// DoPassword is a helper function to the CLI API that handles the entire business logic for -// creating a session key and an access entry given the cli context, password and salt. -// By default - DefaultKdfParams are used as the scrypt params -func DoPassword(ctx *cli.Context, password string, salt []byte) (sessionKey []byte, ae *AccessEntry, err error) { - ae, err = NewAccessEntryPassword(salt, DefaultKdfParams) - if err != nil { - return nil, nil, err - } - - sessionKey, err = NewSessionKeyPassword(password, ae) - if err != nil { - return nil, nil, err - } - return sessionKey, ae, nil -} diff --git a/swarm/api/api.go b/swarm/api/api.go deleted file mode 100644 index 7b8f04c138f0..000000000000 --- a/swarm/api/api.go +++ /dev/null @@ -1,1076 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -//go:generate mimegen --types=./../../cmd/swarm/mimegen/mime.types --package=api --out=gen_mime.go -//go:generate gofmt -s -w gen_mime.go - -import ( - "archive/tar" - "context" - "crypto/ecdsa" - "encoding/hex" - "errors" - "fmt" - "io" - "math/big" - "net/http" - "path" - "strings" - - "bytes" - "mime" - "path/filepath" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/ens" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/multihash" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" - "github.com/opentracing/opentracing-go" -) - -var ( - ErrNotFound = errors.New("not found") -) - -var ( - apiResolveCount = metrics.NewRegisteredCounter("api.resolve.count", nil) - apiResolveFail = metrics.NewRegisteredCounter("api.resolve.fail", nil) - apiPutCount = metrics.NewRegisteredCounter("api.put.count", nil) - apiPutFail = metrics.NewRegisteredCounter("api.put.fail", nil) - apiGetCount = metrics.NewRegisteredCounter("api.get.count", nil) - apiGetNotFound = metrics.NewRegisteredCounter("api.get.notfound", nil) - apiGetHTTP300 = metrics.NewRegisteredCounter("api.get.http.300", nil) - apiManifestUpdateCount = metrics.NewRegisteredCounter("api.manifestupdate.count", nil) - apiManifestUpdateFail = metrics.NewRegisteredCounter("api.manifestupdate.fail", nil) - apiManifestListCount = metrics.NewRegisteredCounter("api.manifestlist.count", nil) - apiManifestListFail = metrics.NewRegisteredCounter("api.manifestlist.fail", nil) - apiDeleteCount = metrics.NewRegisteredCounter("api.delete.count", nil) - apiDeleteFail = metrics.NewRegisteredCounter("api.delete.fail", nil) - apiGetTarCount = metrics.NewRegisteredCounter("api.gettar.count", nil) - apiGetTarFail = metrics.NewRegisteredCounter("api.gettar.fail", nil) - apiUploadTarCount = metrics.NewRegisteredCounter("api.uploadtar.count", nil) - apiUploadTarFail = metrics.NewRegisteredCounter("api.uploadtar.fail", nil) - apiModifyCount = metrics.NewRegisteredCounter("api.modify.count", nil) - apiModifyFail = metrics.NewRegisteredCounter("api.modify.fail", nil) - apiAddFileCount = metrics.NewRegisteredCounter("api.addfile.count", nil) - apiAddFileFail = metrics.NewRegisteredCounter("api.addfile.fail", nil) - apiRmFileCount = metrics.NewRegisteredCounter("api.removefile.count", nil) - apiRmFileFail = metrics.NewRegisteredCounter("api.removefile.fail", nil) - apiAppendFileCount = metrics.NewRegisteredCounter("api.appendfile.count", nil) - apiAppendFileFail = metrics.NewRegisteredCounter("api.appendfile.fail", nil) - apiGetInvalid = metrics.NewRegisteredCounter("api.get.invalid", nil) -) - -// Resolver interface resolve a domain name to a hash using ENS -type Resolver interface { - Resolve(string) (common.Hash, error) -} - -// ResolveValidator is used to validate the contained Resolver -type ResolveValidator interface { - Resolver - Owner(node [32]byte) (common.Address, error) - HeaderByNumber(context.Context, *big.Int) (*types.Header, error) -} - -// NoResolverError is returned by MultiResolver.Resolve if no resolver -// can be found for the address. -type NoResolverError struct { - TLD string -} - -// NewNoResolverError creates a NoResolverError for the given top level domain -func NewNoResolverError(tld string) *NoResolverError { - return &NoResolverError{TLD: tld} -} - -// Error NoResolverError implements error -func (e *NoResolverError) Error() string { - if e.TLD == "" { - return "no ENS resolver" - } - return fmt.Sprintf("no ENS endpoint configured to resolve .%s TLD names", e.TLD) -} - -// MultiResolver is used to resolve URL addresses based on their TLDs. -// Each TLD can have multiple resolvers, and the resolution from the -// first one in the sequence will be returned. -type MultiResolver struct { - resolvers map[string][]ResolveValidator - nameHash func(string) common.Hash -} - -// MultiResolverOption sets options for MultiResolver and is used as -// arguments for its constructor. -type MultiResolverOption func(*MultiResolver) - -// MultiResolverOptionWithResolver adds a Resolver to a list of resolvers -// for a specific TLD. If TLD is an empty string, the resolver will be added -// to the list of default resolver, the ones that will be used for resolution -// of addresses which do not have their TLD resolver specified. -func MultiResolverOptionWithResolver(r ResolveValidator, tld string) MultiResolverOption { - return func(m *MultiResolver) { - m.resolvers[tld] = append(m.resolvers[tld], r) - } -} - -// MultiResolverOptionWithNameHash is unused at the time of this writing -func MultiResolverOptionWithNameHash(nameHash func(string) common.Hash) MultiResolverOption { - return func(m *MultiResolver) { - m.nameHash = nameHash - } -} - -// NewMultiResolver creates a new instance of MultiResolver. -func NewMultiResolver(opts ...MultiResolverOption) (m *MultiResolver) { - m = &MultiResolver{ - resolvers: make(map[string][]ResolveValidator), - nameHash: ens.EnsNode, - } - for _, o := range opts { - o(m) - } - return m -} - -// Resolve resolves address by choosing a Resolver by TLD. -// If there are more default Resolvers, or for a specific TLD, -// the Hash from the first one which does not return error -// will be returned. -func (m *MultiResolver) Resolve(addr string) (h common.Hash, err error) { - rs, err := m.getResolveValidator(addr) - if err != nil { - return h, err - } - for _, r := range rs { - h, err = r.Resolve(addr) - if err == nil { - return - } - } - return -} - -// ValidateOwner checks the ENS to validate that the owner of the given domain is the given eth address -func (m *MultiResolver) ValidateOwner(name string, address common.Address) (bool, error) { - rs, err := m.getResolveValidator(name) - if err != nil { - return false, err - } - var addr common.Address - for _, r := range rs { - addr, err = r.Owner(m.nameHash(name)) - // we hide the error if it is not for the last resolver we check - if err == nil { - return addr == address, nil - } - } - return false, err -} - -// HeaderByNumber uses the validator of the given domainname and retrieves the header for the given block number -func (m *MultiResolver) HeaderByNumber(ctx context.Context, name string, blockNr *big.Int) (*types.Header, error) { - rs, err := m.getResolveValidator(name) - if err != nil { - return nil, err - } - for _, r := range rs { - var header *types.Header - header, err = r.HeaderByNumber(ctx, blockNr) - // we hide the error if it is not for the last resolver we check - if err == nil { - return header, nil - } - } - return nil, err -} - -// getResolveValidator uses the hostname to retrieve the resolver associated with the top level domain -func (m *MultiResolver) getResolveValidator(name string) ([]ResolveValidator, error) { - rs := m.resolvers[""] - tld := path.Ext(name) - if tld != "" { - tld = tld[1:] - rstld, ok := m.resolvers[tld] - if ok { - return rstld, nil - } - } - if len(rs) == 0 { - return rs, NewNoResolverError(tld) - } - return rs, nil -} - -// SetNameHash sets the hasher function that hashes the domain into a name hash that ENS uses -func (m *MultiResolver) SetNameHash(nameHash func(string) common.Hash) { - m.nameHash = nameHash -} - -/* -API implements webserver/file system related content storage and retrieval -on top of the FileStore -it is the public interface of the FileStore which is included in the ethereum stack -*/ -type API struct { - resource *mru.Handler - fileStore *storage.FileStore - dns Resolver - Decryptor func(context.Context, string) DecryptFunc -} - -// NewAPI the api constructor initialises a new API instance. -func NewAPI(fileStore *storage.FileStore, dns Resolver, resourceHandler *mru.Handler, pk *ecdsa.PrivateKey) (self *API) { - self = &API{ - fileStore: fileStore, - dns: dns, - resource: resourceHandler, - Decryptor: func(ctx context.Context, credentials string) DecryptFunc { - return self.doDecrypt(ctx, credentials, pk) - }, - } - return -} - -// Retrieve FileStore reader API -func (a *API) Retrieve(ctx context.Context, addr storage.Address) (reader storage.LazySectionReader, isEncrypted bool) { - return a.fileStore.Retrieve(ctx, addr) -} - -// Store wraps the Store API call of the embedded FileStore -func (a *API) Store(ctx context.Context, data io.Reader, size int64, toEncrypt bool) (addr storage.Address, wait func(ctx context.Context) error, err error) { - log.Debug("api.store", "size", size) - return a.fileStore.Store(ctx, data, size, toEncrypt) -} - -// ErrResolve is returned when an URI cannot be resolved from ENS. -type ErrResolve error - -// Resolve a name into a content-addressed hash -// where address could be an ENS name, or a content addressed hash -func (a *API) Resolve(ctx context.Context, address string) (storage.Address, error) { - // if DNS is not configured, return an error - if a.dns == nil { - if hashMatcher.MatchString(address) { - return common.Hex2Bytes(address), nil - } - apiResolveFail.Inc(1) - return nil, fmt.Errorf("no DNS to resolve name: %q", address) - } - // try and resolve the address - resolved, err := a.dns.Resolve(address) - if err != nil { - if hashMatcher.MatchString(address) { - return common.Hex2Bytes(address), nil - } - return nil, err - } - return resolved[:], nil -} - -// Resolve resolves a URI to an Address using the MultiResolver. -func (a *API) ResolveURI(ctx context.Context, uri *URI, credentials string) (storage.Address, error) { - apiResolveCount.Inc(1) - log.Trace("resolving", "uri", uri.Addr) - - var sp opentracing.Span - ctx, sp = spancontext.StartSpan( - ctx, - "api.resolve") - defer sp.Finish() - - // if the URI is immutable, check if the address looks like a hash - if uri.Immutable() { - key := uri.Address() - if key == nil { - return nil, fmt.Errorf("immutable address not a content hash: %q", uri.Addr) - } - return key, nil - } - - addr, err := a.Resolve(ctx, uri.Addr) - if err != nil { - return nil, err - } - - if uri.Path == "" { - return addr, nil - } - walker, err := a.NewManifestWalker(ctx, addr, a.Decryptor(ctx, credentials), nil) - if err != nil { - return nil, err - } - var entry *ManifestEntry - walker.Walk(func(e *ManifestEntry) error { - // if the entry matches the path, set entry and stop - // the walk - if e.Path == uri.Path { - entry = e - // return an error to cancel the walk - return errors.New("found") - } - // ignore non-manifest files - if e.ContentType != ManifestType { - return nil - } - // if the manifest's path is a prefix of the - // requested path, recurse into it by returning - // nil and continuing the walk - if strings.HasPrefix(uri.Path, e.Path) { - return nil - } - return ErrSkipManifest - }) - if entry == nil { - return nil, errors.New("not found") - } - addr = storage.Address(common.Hex2Bytes(entry.Hash)) - return addr, nil -} - -// Put provides singleton manifest creation on top of FileStore store -func (a *API) Put(ctx context.Context, content string, contentType string, toEncrypt bool) (k storage.Address, wait func(context.Context) error, err error) { - apiPutCount.Inc(1) - r := strings.NewReader(content) - key, waitContent, err := a.fileStore.Store(ctx, r, int64(len(content)), toEncrypt) - if err != nil { - apiPutFail.Inc(1) - return nil, nil, err - } - manifest := fmt.Sprintf(`{"entries":[{"hash":"%v","contentType":"%s"}]}`, key, contentType) - r = strings.NewReader(manifest) - key, waitManifest, err := a.fileStore.Store(ctx, r, int64(len(manifest)), toEncrypt) - if err != nil { - apiPutFail.Inc(1) - return nil, nil, err - } - return key, func(ctx context.Context) error { - err := waitContent(ctx) - if err != nil { - return err - } - return waitManifest(ctx) - }, nil -} - -// Get uses iterative manifest retrieval and prefix matching -// to resolve basePath to content using FileStore retrieve -// it returns a section reader, mimeType, status, the key of the actual content and an error -func (a *API) Get(ctx context.Context, decrypt DecryptFunc, manifestAddr storage.Address, path string) (reader storage.LazySectionReader, mimeType string, status int, contentAddr storage.Address, err error) { - log.Debug("api.get", "key", manifestAddr, "path", path) - apiGetCount.Inc(1) - trie, err := loadManifest(ctx, a.fileStore, manifestAddr, nil, decrypt) - if err != nil { - apiGetNotFound.Inc(1) - status = http.StatusNotFound - return nil, "", http.StatusNotFound, nil, err - } - - log.Debug("trie getting entry", "key", manifestAddr, "path", path) - entry, _ := trie.getEntry(path) - - if entry != nil { - log.Debug("trie got entry", "key", manifestAddr, "path", path, "entry.Hash", entry.Hash) - - if entry.ContentType == ManifestType { - log.Debug("entry is manifest", "key", manifestAddr, "new key", entry.Hash) - adr, err := hex.DecodeString(entry.Hash) - if err != nil { - return nil, "", 0, nil, err - } - return a.Get(ctx, decrypt, adr, entry.Path) - } - - // we need to do some extra work if this is a mutable resource manifest - if entry.ContentType == ResourceContentType { - if entry.ResourceView == nil { - return reader, mimeType, status, nil, fmt.Errorf("Cannot decode ResourceView in manifest") - } - _, err := a.resource.Lookup(ctx, mru.NewQueryLatest(entry.ResourceView, lookup.NoClue)) - if err != nil { - apiGetNotFound.Inc(1) - status = http.StatusNotFound - log.Debug(fmt.Sprintf("get resource content error: %v", err)) - return reader, mimeType, status, nil, err - } - // get the data of the update - _, rsrcData, err := a.resource.GetContent(entry.ResourceView) - if err != nil { - apiGetNotFound.Inc(1) - status = http.StatusNotFound - log.Warn(fmt.Sprintf("get resource content error: %v", err)) - return reader, mimeType, status, nil, err - } - - // extract multihash - decodedMultihash, err := multihash.FromMultihash(rsrcData) - if err != nil { - apiGetInvalid.Inc(1) - status = http.StatusUnprocessableEntity - log.Warn("invalid resource multihash", "err", err) - return reader, mimeType, status, nil, err - } - manifestAddr = storage.Address(decodedMultihash) - log.Trace("resource is multihash", "key", manifestAddr) - - // get the manifest the multihash digest points to - trie, err := loadManifest(ctx, a.fileStore, manifestAddr, nil, NOOPDecrypt) - if err != nil { - apiGetNotFound.Inc(1) - status = http.StatusNotFound - log.Warn(fmt.Sprintf("loadManifestTrie (resource multihash) error: %v", err)) - return reader, mimeType, status, nil, err - } - - // finally, get the manifest entry - // it will always be the entry on path "" - entry, _ = trie.getEntry(path) - if entry == nil { - status = http.StatusNotFound - apiGetNotFound.Inc(1) - err = fmt.Errorf("manifest (resource multihash) entry for '%s' not found", path) - log.Trace("manifest (resource multihash) entry not found", "key", manifestAddr, "path", path) - return reader, mimeType, status, nil, err - } - } - - // regardless of resource update manifests or normal manifests we will converge at this point - // get the key the manifest entry points to and serve it if it's unambiguous - contentAddr = common.Hex2Bytes(entry.Hash) - status = entry.Status - if status == http.StatusMultipleChoices { - apiGetHTTP300.Inc(1) - return nil, entry.ContentType, status, contentAddr, err - } - mimeType = entry.ContentType - log.Debug("content lookup key", "key", contentAddr, "mimetype", mimeType) - reader, _ = a.fileStore.Retrieve(ctx, contentAddr) - } else { - // no entry found - status = http.StatusNotFound - apiGetNotFound.Inc(1) - err = fmt.Errorf("manifest entry for '%s' not found", path) - log.Trace("manifest entry not found", "key", contentAddr, "path", path) - } - return -} - -func (a *API) Delete(ctx context.Context, addr string, path string) (storage.Address, error) { - apiDeleteCount.Inc(1) - uri, err := Parse("bzz:/" + addr) - if err != nil { - apiDeleteFail.Inc(1) - return nil, err - } - key, err := a.ResolveURI(ctx, uri, EMPTY_CREDENTIALS) - - if err != nil { - return nil, err - } - newKey, err := a.UpdateManifest(ctx, key, func(mw *ManifestWriter) error { - log.Debug(fmt.Sprintf("removing %s from manifest %s", path, key.Log())) - return mw.RemoveEntry(path) - }) - if err != nil { - apiDeleteFail.Inc(1) - return nil, err - } - - return newKey, nil -} - -// GetDirectoryTar fetches a requested directory as a tarstream -// it returns an io.Reader and an error. Do not forget to Close() the returned ReadCloser -func (a *API) GetDirectoryTar(ctx context.Context, decrypt DecryptFunc, uri *URI) (io.ReadCloser, error) { - apiGetTarCount.Inc(1) - addr, err := a.Resolve(ctx, uri.Addr) - if err != nil { - return nil, err - } - walker, err := a.NewManifestWalker(ctx, addr, decrypt, nil) - if err != nil { - apiGetTarFail.Inc(1) - return nil, err - } - - piper, pipew := io.Pipe() - - tw := tar.NewWriter(pipew) - - go func() { - err := walker.Walk(func(entry *ManifestEntry) error { - // ignore manifests (walk will recurse into them) - if entry.ContentType == ManifestType { - return nil - } - - // retrieve the entry's key and size - reader, _ := a.Retrieve(ctx, storage.Address(common.Hex2Bytes(entry.Hash))) - size, err := reader.Size(ctx, nil) - if err != nil { - return err - } - - // write a tar header for the entry - hdr := &tar.Header{ - Name: entry.Path, - Mode: entry.Mode, - Size: size, - ModTime: entry.ModTime, - Xattrs: map[string]string{ - "user.swarm.content-type": entry.ContentType, - }, - } - - if err := tw.WriteHeader(hdr); err != nil { - return err - } - - // copy the file into the tar stream - n, err := io.Copy(tw, io.LimitReader(reader, hdr.Size)) - if err != nil { - return err - } else if n != size { - return fmt.Errorf("error writing %s: expected %d bytes but sent %d", entry.Path, size, n) - } - - return nil - }) - // close tar writer before closing pipew - // to flush remaining data to pipew - // regardless of error value - tw.Close() - if err != nil { - apiGetTarFail.Inc(1) - pipew.CloseWithError(err) - } else { - pipew.Close() - } - }() - - return piper, nil -} - -// GetManifestList lists the manifest entries for the specified address and prefix -// and returns it as a ManifestList -func (a *API) GetManifestList(ctx context.Context, decryptor DecryptFunc, addr storage.Address, prefix string) (list ManifestList, err error) { - apiManifestListCount.Inc(1) - walker, err := a.NewManifestWalker(ctx, addr, decryptor, nil) - if err != nil { - apiManifestListFail.Inc(1) - return ManifestList{}, err - } - - err = walker.Walk(func(entry *ManifestEntry) error { - // handle non-manifest files - if entry.ContentType != ManifestType { - // ignore the file if it doesn't have the specified prefix - if !strings.HasPrefix(entry.Path, prefix) { - return nil - } - - // if the path after the prefix contains a slash, add a - // common prefix to the list, otherwise add the entry - suffix := strings.TrimPrefix(entry.Path, prefix) - if index := strings.Index(suffix, "/"); index > -1 { - list.CommonPrefixes = append(list.CommonPrefixes, prefix+suffix[:index+1]) - return nil - } - if entry.Path == "" { - entry.Path = "/" - } - list.Entries = append(list.Entries, entry) - return nil - } - - // if the manifest's path is a prefix of the specified prefix - // then just recurse into the manifest by returning nil and - // continuing the walk - if strings.HasPrefix(prefix, entry.Path) { - return nil - } - - // if the manifest's path has the specified prefix, then if the - // path after the prefix contains a slash, add a common prefix - // to the list and skip the manifest, otherwise recurse into - // the manifest by returning nil and continuing the walk - if strings.HasPrefix(entry.Path, prefix) { - suffix := strings.TrimPrefix(entry.Path, prefix) - if index := strings.Index(suffix, "/"); index > -1 { - list.CommonPrefixes = append(list.CommonPrefixes, prefix+suffix[:index+1]) - return ErrSkipManifest - } - return nil - } - - // the manifest neither has the prefix or needs recursing in to - // so just skip it - return ErrSkipManifest - }) - - if err != nil { - apiManifestListFail.Inc(1) - return ManifestList{}, err - } - - return list, nil -} - -func (a *API) UpdateManifest(ctx context.Context, addr storage.Address, update func(mw *ManifestWriter) error) (storage.Address, error) { - apiManifestUpdateCount.Inc(1) - mw, err := a.NewManifestWriter(ctx, addr, nil) - if err != nil { - apiManifestUpdateFail.Inc(1) - return nil, err - } - - if err := update(mw); err != nil { - apiManifestUpdateFail.Inc(1) - return nil, err - } - - addr, err = mw.Store() - if err != nil { - apiManifestUpdateFail.Inc(1) - return nil, err - } - log.Debug(fmt.Sprintf("generated manifest %s", addr)) - return addr, nil -} - -// Modify loads manifest and checks the content hash before recalculating and storing the manifest. -func (a *API) Modify(ctx context.Context, addr storage.Address, path, contentHash, contentType string) (storage.Address, error) { - apiModifyCount.Inc(1) - quitC := make(chan bool) - trie, err := loadManifest(ctx, a.fileStore, addr, quitC, NOOPDecrypt) - if err != nil { - apiModifyFail.Inc(1) - return nil, err - } - if contentHash != "" { - entry := newManifestTrieEntry(&ManifestEntry{ - Path: path, - ContentType: contentType, - }, nil) - entry.Hash = contentHash - trie.addEntry(entry, quitC) - } else { - trie.deleteEntry(path, quitC) - } - - if err := trie.recalcAndStore(); err != nil { - apiModifyFail.Inc(1) - return nil, err - } - return trie.ref, nil -} - -// AddFile creates a new manifest entry, adds it to swarm, then adds a file to swarm. -func (a *API) AddFile(ctx context.Context, mhash, path, fname string, content []byte, nameresolver bool) (storage.Address, string, error) { - apiAddFileCount.Inc(1) - - uri, err := Parse("bzz:/" + mhash) - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - } - mkey, err := a.ResolveURI(ctx, uri, EMPTY_CREDENTIALS) - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - } - - // trim the root dir we added - if path[:1] == "/" { - path = path[1:] - } - - entry := &ManifestEntry{ - Path: filepath.Join(path, fname), - ContentType: mime.TypeByExtension(filepath.Ext(fname)), - Mode: 0700, - Size: int64(len(content)), - ModTime: time.Now(), - } - - mw, err := a.NewManifestWriter(ctx, mkey, nil) - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - } - - fkey, err := mw.AddEntry(ctx, bytes.NewReader(content), entry) - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - } - - newMkey, err := mw.Store() - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - - } - - return fkey, newMkey.String(), nil -} - -func (a *API) UploadTar(ctx context.Context, bodyReader io.ReadCloser, manifestPath, defaultPath string, mw *ManifestWriter) (storage.Address, error) { - apiUploadTarCount.Inc(1) - var contentKey storage.Address - tr := tar.NewReader(bodyReader) - defer bodyReader.Close() - var defaultPathFound bool - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } else if err != nil { - apiUploadTarFail.Inc(1) - return nil, fmt.Errorf("error reading tar stream: %s", err) - } - - // only store regular files - if !hdr.FileInfo().Mode().IsRegular() { - continue - } - - // add the entry under the path from the request - manifestPath := path.Join(manifestPath, hdr.Name) - contentType := hdr.Xattrs["user.swarm.content-type"] - if contentType == "" { - contentType = mime.TypeByExtension(filepath.Ext(hdr.Name)) - } - //DetectContentType("") - entry := &ManifestEntry{ - Path: manifestPath, - ContentType: contentType, - Mode: hdr.Mode, - Size: hdr.Size, - ModTime: hdr.ModTime, - } - contentKey, err = mw.AddEntry(ctx, tr, entry) - if err != nil { - apiUploadTarFail.Inc(1) - return nil, fmt.Errorf("error adding manifest entry from tar stream: %s", err) - } - if hdr.Name == defaultPath { - contentType := hdr.Xattrs["user.swarm.content-type"] - if contentType == "" { - contentType = mime.TypeByExtension(filepath.Ext(hdr.Name)) - } - - entry := &ManifestEntry{ - Hash: contentKey.Hex(), - Path: "", // default entry - ContentType: contentType, - Mode: hdr.Mode, - Size: hdr.Size, - ModTime: hdr.ModTime, - } - contentKey, err = mw.AddEntry(ctx, nil, entry) - if err != nil { - apiUploadTarFail.Inc(1) - return nil, fmt.Errorf("error adding default manifest entry from tar stream: %s", err) - } - defaultPathFound = true - } - } - if defaultPath != "" && !defaultPathFound { - return contentKey, fmt.Errorf("default path %q not found", defaultPath) - } - return contentKey, nil -} - -// RemoveFile removes a file entry in a manifest. -func (a *API) RemoveFile(ctx context.Context, mhash string, path string, fname string, nameresolver bool) (string, error) { - apiRmFileCount.Inc(1) - - uri, err := Parse("bzz:/" + mhash) - if err != nil { - apiRmFileFail.Inc(1) - return "", err - } - mkey, err := a.ResolveURI(ctx, uri, EMPTY_CREDENTIALS) - if err != nil { - apiRmFileFail.Inc(1) - return "", err - } - - // trim the root dir we added - if path[:1] == "/" { - path = path[1:] - } - - mw, err := a.NewManifestWriter(ctx, mkey, nil) - if err != nil { - apiRmFileFail.Inc(1) - return "", err - } - - err = mw.RemoveEntry(filepath.Join(path, fname)) - if err != nil { - apiRmFileFail.Inc(1) - return "", err - } - - newMkey, err := mw.Store() - if err != nil { - apiRmFileFail.Inc(1) - return "", err - - } - - return newMkey.String(), nil -} - -// AppendFile removes old manifest, appends file entry to new manifest and adds it to Swarm. -func (a *API) AppendFile(ctx context.Context, mhash, path, fname string, existingSize int64, content []byte, oldAddr storage.Address, offset int64, addSize int64, nameresolver bool) (storage.Address, string, error) { - apiAppendFileCount.Inc(1) - - buffSize := offset + addSize - if buffSize < existingSize { - buffSize = existingSize - } - - buf := make([]byte, buffSize) - - oldReader, _ := a.Retrieve(ctx, oldAddr) - io.ReadAtLeast(oldReader, buf, int(offset)) - - newReader := bytes.NewReader(content) - io.ReadAtLeast(newReader, buf[offset:], int(addSize)) - - if buffSize < existingSize { - io.ReadAtLeast(oldReader, buf[addSize:], int(buffSize)) - } - - combinedReader := bytes.NewReader(buf) - totalSize := int64(len(buf)) - - // TODO(jmozah): to append using pyramid chunker when it is ready - //oldReader := a.Retrieve(oldKey) - //newReader := bytes.NewReader(content) - //combinedReader := io.MultiReader(oldReader, newReader) - - uri, err := Parse("bzz:/" + mhash) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - mkey, err := a.ResolveURI(ctx, uri, EMPTY_CREDENTIALS) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - - // trim the root dir we added - if path[:1] == "/" { - path = path[1:] - } - - mw, err := a.NewManifestWriter(ctx, mkey, nil) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - - err = mw.RemoveEntry(filepath.Join(path, fname)) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - - entry := &ManifestEntry{ - Path: filepath.Join(path, fname), - ContentType: mime.TypeByExtension(filepath.Ext(fname)), - Mode: 0700, - Size: totalSize, - ModTime: time.Now(), - } - - fkey, err := mw.AddEntry(ctx, io.Reader(combinedReader), entry) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - - newMkey, err := mw.Store() - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - - } - - return fkey, newMkey.String(), nil -} - -// BuildDirectoryTree used by swarmfs_unix -func (a *API) BuildDirectoryTree(ctx context.Context, mhash string, nameresolver bool) (addr storage.Address, manifestEntryMap map[string]*manifestTrieEntry, err error) { - - uri, err := Parse("bzz:/" + mhash) - if err != nil { - return nil, nil, err - } - addr, err = a.Resolve(ctx, uri.Addr) - if err != nil { - return nil, nil, err - } - - quitC := make(chan bool) - rootTrie, err := loadManifest(ctx, a.fileStore, addr, quitC, NOOPDecrypt) - if err != nil { - return nil, nil, fmt.Errorf("can't load manifest %v: %v", addr.String(), err) - } - - manifestEntryMap = map[string]*manifestTrieEntry{} - err = rootTrie.listWithPrefix(uri.Path, quitC, func(entry *manifestTrieEntry, suffix string) { - manifestEntryMap[suffix] = entry - }) - - if err != nil { - return nil, nil, fmt.Errorf("list with prefix failed %v: %v", addr.String(), err) - } - return addr, manifestEntryMap, nil -} - -// ResourceLookup finds mutable resource updates at specific periods and versions -func (a *API) ResourceLookup(ctx context.Context, query *mru.Query) ([]byte, error) { - _, err := a.resource.Lookup(ctx, query) - if err != nil { - return nil, err - } - var data []byte - _, data, err = a.resource.GetContent(&query.View) - if err != nil { - return nil, err - } - return data, nil -} - -// ResourceNewRequest creates a Request object to update a specific mutable resource -func (a *API) ResourceNewRequest(ctx context.Context, view *mru.View) (*mru.Request, error) { - return a.resource.NewRequest(ctx, view) -} - -// ResourceUpdate updates a Mutable Resource with arbitrary data. -// Upon retrieval the update will be retrieved verbatim as bytes. -func (a *API) ResourceUpdate(ctx context.Context, request *mru.Request) (storage.Address, error) { - return a.resource.Update(ctx, request) -} - -// ResourceHashSize returned the size of the digest produced by the Mutable Resource hashing function -func (a *API) ResourceHashSize() int { - return a.resource.HashSize -} - -// ErrCannotLoadResourceManifest is returned when looking up a resource manifest fails -var ErrCannotLoadResourceManifest = errors.New("Cannot load resource manifest") - -// ErrNotAResourceManifest is returned when the address provided returned something other than a valid manifest -var ErrNotAResourceManifest = errors.New("Not a resource manifest") - -// ResolveResourceManifest retrieves the Mutable Resource manifest for the given address, and returns the Resource's view ID. -func (a *API) ResolveResourceManifest(ctx context.Context, addr storage.Address) (*mru.View, error) { - trie, err := loadManifest(ctx, a.fileStore, addr, nil, NOOPDecrypt) - if err != nil { - return nil, ErrCannotLoadResourceManifest - } - - entry, _ := trie.getEntry("") - if entry.ContentType != ResourceContentType { - return nil, ErrNotAResourceManifest - } - - return entry.ResourceView, nil -} - -// ErrCannotResolveResourceURI is returned when the ENS resolver is not able to translate a name to a resource -var ErrCannotResolveResourceURI = errors.New("Cannot resolve Resource URI") - -// ErrCannotResolveResourceView is returned when values provided are not enough or invalid to recreate a -// resource view out of them. -var ErrCannotResolveResourceView = errors.New("Cannot resolve resource view") - -// ResolveResourceView attempts to extract View information out of the manifest, if provided -// If not, it attempts to extract the View out of a set of key-value pairs -func (a *API) ResolveResourceView(ctx context.Context, uri *URI, values mru.Values) (*mru.View, error) { - var view *mru.View - var err error - if uri.Addr != "" { - // resolve the content key. - manifestAddr := uri.Address() - if manifestAddr == nil { - manifestAddr, err = a.Resolve(ctx, uri.Addr) - if err != nil { - return nil, ErrCannotResolveResourceURI - } - } - - // get the resource view from the manifest - view, err = a.ResolveResourceManifest(ctx, manifestAddr) - if err != nil { - return nil, err - } - log.Debug("handle.get.resource: resolved", "manifestkey", manifestAddr, "view", view.Hex()) - } else { - var v mru.View - if err := v.FromValues(values); err != nil { - return nil, ErrCannotResolveResourceView - - } - view = &v - } - return view, nil -} - -// MimeOctetStream default value of http Content-Type header -const MimeOctetStream = "application/octet-stream" - -// DetectContentType by file file extension, or fallback to content sniff -func DetectContentType(fileName string, f io.ReadSeeker) (string, error) { - ctype := mime.TypeByExtension(filepath.Ext(fileName)) - if ctype != "" { - return ctype, nil - } - - // save/rollback to get content probe from begin of file - currentPosition, err := f.Seek(0, io.SeekCurrent) - if err != nil { - return MimeOctetStream, fmt.Errorf("seeker can't seek, %s", err) - } - - // read a chunk to decide between utf-8 text and binary - var buf [512]byte - n, _ := f.Read(buf[:]) - ctype = http.DetectContentType(buf[:n]) - - _, err = f.Seek(currentPosition, io.SeekStart) // rewind to output whole file - if err != nil { - return MimeOctetStream, fmt.Errorf("seeker can't seek, %s", err) - } - - return ctype, nil -} diff --git a/swarm/api/api_test.go b/swarm/api/api_test.go deleted file mode 100644 index eb896f32aab7..000000000000 --- a/swarm/api/api_test.go +++ /dev/null @@ -1,502 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "context" - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "math/big" - "os" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/sctx" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -func init() { - loglevel := flag.Int("loglevel", 2, "loglevel") - flag.Parse() - log.Root().SetHandler(log.CallerFileHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true))))) -} - -func testAPI(t *testing.T, f func(*API, bool)) { - datadir, err := ioutil.TempDir("", "bzz-test") - if err != nil { - t.Fatalf("unable to create temp dir: %v", err) - } - defer os.RemoveAll(datadir) - fileStore, err := storage.NewLocalFileStore(datadir, make([]byte, 32)) - if err != nil { - return - } - api := NewAPI(fileStore, nil, nil, nil) - f(api, false) - f(api, true) -} - -type testResponse struct { - reader storage.LazySectionReader - *Response -} - -func checkResponse(t *testing.T, resp *testResponse, exp *Response) { - - if resp.MimeType != exp.MimeType { - t.Errorf("incorrect mimeType. expected '%s', got '%s'", exp.MimeType, resp.MimeType) - } - if resp.Status != exp.Status { - t.Errorf("incorrect status. expected '%d', got '%d'", exp.Status, resp.Status) - } - if resp.Size != exp.Size { - t.Errorf("incorrect size. expected '%d', got '%d'", exp.Size, resp.Size) - } - if resp.reader != nil { - content := make([]byte, resp.Size) - read, _ := resp.reader.Read(content) - if int64(read) != exp.Size { - t.Errorf("incorrect content length. expected '%d...', got '%d...'", read, exp.Size) - } - resp.Content = string(content) - } - if resp.Content != exp.Content { - // if !bytes.Equal(resp.Content, exp.Content) - t.Errorf("incorrect content. expected '%s...', got '%s...'", string(exp.Content), string(resp.Content)) - } -} - -// func expResponse(content []byte, mimeType string, status int) *Response { -func expResponse(content string, mimeType string, status int) *Response { - log.Trace(fmt.Sprintf("expected content (%v): %v ", len(content), content)) - return &Response{mimeType, status, int64(len(content)), content} -} - -func testGet(t *testing.T, api *API, bzzhash, path string) *testResponse { - addr := storage.Address(common.Hex2Bytes(bzzhash)) - reader, mimeType, status, _, err := api.Get(context.TODO(), NOOPDecrypt, addr, path) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - quitC := make(chan bool) - size, err := reader.Size(context.TODO(), quitC) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - log.Trace(fmt.Sprintf("reader size: %v ", size)) - s := make([]byte, size) - _, err = reader.Read(s) - if err != io.EOF { - t.Fatalf("unexpected error: %v", err) - } - reader.Seek(0, 0) - return &testResponse{reader, &Response{mimeType, status, size, string(s)}} - // return &testResponse{reader, &Response{mimeType, status, reader.Size(), nil}} -} - -func TestApiPut(t *testing.T) { - testAPI(t, func(api *API, toEncrypt bool) { - content := "hello" - exp := expResponse(content, "text/plain", 0) - ctx := context.TODO() - addr, wait, err := api.Put(ctx, content, exp.MimeType, toEncrypt) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - err = wait(ctx) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - resp := testGet(t, api, addr.Hex(), "") - checkResponse(t, resp, exp) - }) -} - -// testResolver implements the Resolver interface and either returns the given -// hash if it is set, or returns a "name not found" error -type testResolveValidator struct { - hash *common.Hash -} - -func newTestResolveValidator(addr string) *testResolveValidator { - r := &testResolveValidator{} - if addr != "" { - hash := common.HexToHash(addr) - r.hash = &hash - } - return r -} - -func (t *testResolveValidator) Resolve(addr string) (common.Hash, error) { - if t.hash == nil { - return common.Hash{}, fmt.Errorf("DNS name not found: %q", addr) - } - return *t.hash, nil -} - -func (t *testResolveValidator) Owner(node [32]byte) (addr common.Address, err error) { - return -} -func (t *testResolveValidator) HeaderByNumber(context.Context, *big.Int) (header *types.Header, err error) { - return -} - -// TestAPIResolve tests resolving URIs which can either contain content hashes -// or ENS names -func TestAPIResolve(t *testing.T) { - ensAddr := "swarm.eth" - hashAddr := "1111111111111111111111111111111111111111111111111111111111111111" - resolvedAddr := "2222222222222222222222222222222222222222222222222222222222222222" - doesResolve := newTestResolveValidator(resolvedAddr) - doesntResolve := newTestResolveValidator("") - - type test struct { - desc string - dns Resolver - addr string - immutable bool - result string - expectErr error - } - - tests := []*test{ - { - desc: "DNS not configured, hash address, returns hash address", - dns: nil, - addr: hashAddr, - result: hashAddr, - }, - { - desc: "DNS not configured, ENS address, returns error", - dns: nil, - addr: ensAddr, - expectErr: errors.New(`no DNS to resolve name: "swarm.eth"`), - }, - { - desc: "DNS configured, hash address, hash resolves, returns resolved address", - dns: doesResolve, - addr: hashAddr, - result: resolvedAddr, - }, - { - desc: "DNS configured, immutable hash address, hash resolves, returns hash address", - dns: doesResolve, - addr: hashAddr, - immutable: true, - result: hashAddr, - }, - { - desc: "DNS configured, hash address, hash doesn't resolve, returns hash address", - dns: doesntResolve, - addr: hashAddr, - result: hashAddr, - }, - { - desc: "DNS configured, ENS address, name resolves, returns resolved address", - dns: doesResolve, - addr: ensAddr, - result: resolvedAddr, - }, - { - desc: "DNS configured, immutable ENS address, name resolves, returns error", - dns: doesResolve, - addr: ensAddr, - immutable: true, - expectErr: errors.New(`immutable address not a content hash: "swarm.eth"`), - }, - { - desc: "DNS configured, ENS address, name doesn't resolve, returns error", - dns: doesntResolve, - addr: ensAddr, - expectErr: errors.New(`DNS name not found: "swarm.eth"`), - }, - } - for _, x := range tests { - t.Run(x.desc, func(t *testing.T) { - api := &API{dns: x.dns} - uri := &URI{Addr: x.addr, Scheme: "bzz"} - if x.immutable { - uri.Scheme = "bzz-immutable" - } - res, err := api.ResolveURI(context.TODO(), uri, "") - if err == nil { - if x.expectErr != nil { - t.Fatalf("expected error %q, got result %q", x.expectErr, res) - } - if res.String() != x.result { - t.Fatalf("expected result %q, got %q", x.result, res) - } - } else { - if x.expectErr == nil { - t.Fatalf("expected no error, got %q", err) - } - if err.Error() != x.expectErr.Error() { - t.Fatalf("expected error %q, got %q", x.expectErr, err) - } - } - }) - } -} - -func TestMultiResolver(t *testing.T) { - doesntResolve := newTestResolveValidator("") - - ethAddr := "swarm.eth" - ethHash := "0x2222222222222222222222222222222222222222222222222222222222222222" - ethResolve := newTestResolveValidator(ethHash) - - testAddr := "swarm.test" - testHash := "0x1111111111111111111111111111111111111111111111111111111111111111" - testResolve := newTestResolveValidator(testHash) - - tests := []struct { - desc string - r Resolver - addr string - result string - err error - }{ - { - desc: "No resolvers, returns error", - r: NewMultiResolver(), - err: NewNoResolverError(""), - }, - { - desc: "One default resolver, returns resolved address", - r: NewMultiResolver(MultiResolverOptionWithResolver(ethResolve, "")), - addr: ethAddr, - result: ethHash, - }, - { - desc: "Two default resolvers, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(ethResolve, ""), - MultiResolverOptionWithResolver(ethResolve, ""), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "Two default resolvers, first doesn't resolve, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, ""), - MultiResolverOptionWithResolver(ethResolve, ""), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "Default resolver doesn't resolve, tld resolver resolve, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, ""), - MultiResolverOptionWithResolver(ethResolve, "eth"), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "Three TLD resolvers, third resolves, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, "eth"), - MultiResolverOptionWithResolver(doesntResolve, "eth"), - MultiResolverOptionWithResolver(ethResolve, "eth"), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "One TLD resolver doesn't resolve, returns error", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, ""), - MultiResolverOptionWithResolver(ethResolve, "eth"), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "One defautl and one TLD resolver, all doesn't resolve, returns error", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, ""), - MultiResolverOptionWithResolver(doesntResolve, "eth"), - ), - addr: ethAddr, - result: ethHash, - err: errors.New(`DNS name not found: "swarm.eth"`), - }, - { - desc: "Two TLD resolvers, both resolve, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(ethResolve, "eth"), - MultiResolverOptionWithResolver(testResolve, "test"), - ), - addr: testAddr, - result: testHash, - }, - { - desc: "One TLD resolver, no default resolver, returns error for different TLD", - r: NewMultiResolver( - MultiResolverOptionWithResolver(ethResolve, "eth"), - ), - addr: testAddr, - err: NewNoResolverError("test"), - }, - } - for _, x := range tests { - t.Run(x.desc, func(t *testing.T) { - res, err := x.r.Resolve(x.addr) - if err == nil { - if x.err != nil { - t.Fatalf("expected error %q, got result %q", x.err, res.Hex()) - } - if res.Hex() != x.result { - t.Fatalf("expected result %q, got %q", x.result, res.Hex()) - } - } else { - if x.err == nil { - t.Fatalf("expected no error, got %q", err) - } - if err.Error() != x.err.Error() { - t.Fatalf("expected error %q, got %q", x.err, err) - } - } - }) - } -} - -func TestDecryptOriginForbidden(t *testing.T) { - ctx := context.TODO() - ctx = sctx.SetHost(ctx, "swarm-gateways.net") - - me := &ManifestEntry{ - Access: &AccessEntry{Type: AccessTypePass}, - } - - api := NewAPI(nil, nil, nil, nil) - - f := api.Decryptor(ctx, "") - err := f(me) - if err != ErrDecryptDomainForbidden { - t.Fatalf("should fail with ErrDecryptDomainForbidden, got %v", err) - } -} - -func TestDecryptOrigin(t *testing.T) { - for _, v := range []struct { - host string - expectError error - }{ - { - host: "localhost", - expectError: ErrDecrypt, - }, - { - host: "127.0.0.1", - expectError: ErrDecrypt, - }, - { - host: "swarm-gateways.net", - expectError: ErrDecryptDomainForbidden, - }, - } { - ctx := context.TODO() - ctx = sctx.SetHost(ctx, v.host) - - me := &ManifestEntry{ - Access: &AccessEntry{Type: AccessTypePass}, - } - - api := NewAPI(nil, nil, nil, nil) - - f := api.Decryptor(ctx, "") - err := f(me) - if err != v.expectError { - t.Fatalf("should fail with %v, got %v", v.expectError, err) - } - } -} - -func TestDetectContentType(t *testing.T) { - for _, tc := range []struct { - file string - content string - expectedContentType string - }{ - { - file: "file-with-correct-css.css", - content: "body {background-color: orange}", - expectedContentType: "text/css; charset=utf-8", - }, - { - file: "empty-file.css", - content: "", - expectedContentType: "text/css; charset=utf-8", - }, - { - file: "empty-file.pdf", - content: "", - expectedContentType: "application/pdf", - }, - { - file: "empty-file.md", - content: "", - expectedContentType: "text/markdown; charset=utf-8", - }, - { - file: "empty-file-with-unknown-content.strangeext", - content: "", - expectedContentType: "text/plain; charset=utf-8", - }, - { - file: "file-with-unknown-extension-and-content.strangeext", - content: "Lorem Ipsum", - expectedContentType: "text/plain; charset=utf-8", - }, - { - file: "file-no-extension", - content: "Lorem Ipsum", - expectedContentType: "text/plain; charset=utf-8", - }, - { - file: "file-no-extension-no-content", - content: "", - expectedContentType: "text/plain; charset=utf-8", - }, - { - file: "css-file-with-html-inside.css", - content: "", - expectedContentType: "text/css; charset=utf-8", - }, - } { - t.Run(tc.file, func(t *testing.T) { - detected, err := DetectContentType(tc.file, bytes.NewReader([]byte(tc.content))) - if err != nil { - t.Fatal(err) - } - - if detected != tc.expectedContentType { - t.Fatalf("File: %s, Expected mime type %s, got %s", tc.file, tc.expectedContentType, detected) - } - - }) - } -} diff --git a/swarm/api/client/client.go b/swarm/api/client/client.go deleted file mode 100644 index 47a6980dec72..000000000000 --- a/swarm/api/client/client.go +++ /dev/null @@ -1,731 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package client - -import ( - "archive/tar" - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "mime/multipart" - "net/http" - "net/textproto" - "net/url" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/storage/mru" -) - -var ( - DefaultGateway = "http://localhost:8500" - DefaultClient = NewClient(DefaultGateway) -) - -var ( - ErrUnauthorized = errors.New("unauthorized") -) - -func NewClient(gateway string) *Client { - return &Client{ - Gateway: gateway, - } -} - -// Client wraps interaction with a swarm HTTP gateway. -type Client struct { - Gateway string -} - -// UploadRaw uploads raw data to swarm and returns the resulting hash. If toEncrypt is true it -// uploads encrypted data -func (c *Client) UploadRaw(r io.Reader, size int64, toEncrypt bool) (string, error) { - if size <= 0 { - return "", errors.New("data size must be greater than zero") - } - addr := "" - if toEncrypt { - addr = "encrypt" - } - req, err := http.NewRequest("POST", c.Gateway+"/bzz-raw:/"+addr, r) - if err != nil { - return "", err - } - req.ContentLength = size - res, err := http.DefaultClient.Do(req) - if err != nil { - return "", err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return "", fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - data, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", err - } - return string(data), nil -} - -// DownloadRaw downloads raw data from swarm and it returns a ReadCloser and a bool whether the -// content was encrypted -func (c *Client) DownloadRaw(hash string) (io.ReadCloser, bool, error) { - uri := c.Gateway + "/bzz-raw:/" + hash - res, err := http.DefaultClient.Get(uri) - if err != nil { - return nil, false, err - } - if res.StatusCode != http.StatusOK { - res.Body.Close() - return nil, false, fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - isEncrypted := (res.Header.Get("X-Decrypted") == "true") - return res.Body, isEncrypted, nil -} - -// File represents a file in a swarm manifest and is used for uploading and -// downloading content to and from swarm -type File struct { - io.ReadCloser - api.ManifestEntry -} - -// Open opens a local file which can then be passed to client.Upload to upload -// it to swarm -func Open(path string) (*File, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - stat, err := f.Stat() - if err != nil { - f.Close() - return nil, err - } - - contentType, err := api.DetectContentType(f.Name(), f) - if err != nil { - return nil, err - } - - return &File{ - ReadCloser: f, - ManifestEntry: api.ManifestEntry{ - ContentType: contentType, - Mode: int64(stat.Mode()), - Size: stat.Size(), - ModTime: stat.ModTime(), - }, - }, nil -} - -// Upload uploads a file to swarm and either adds it to an existing manifest -// (if the manifest argument is non-empty) or creates a new manifest containing -// the file, returning the resulting manifest hash (the file will then be -// available at bzz://) -func (c *Client) Upload(file *File, manifest string, toEncrypt bool) (string, error) { - if file.Size <= 0 { - return "", errors.New("file size must be greater than zero") - } - return c.TarUpload(manifest, &FileUploader{file}, "", toEncrypt) -} - -// Download downloads a file with the given path from the swarm manifest with -// the given hash (i.e. it gets bzz://) -func (c *Client) Download(hash, path string) (*File, error) { - uri := c.Gateway + "/bzz:/" + hash + "/" + path - res, err := http.DefaultClient.Get(uri) - if err != nil { - return nil, err - } - if res.StatusCode != http.StatusOK { - res.Body.Close() - return nil, fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - return &File{ - ReadCloser: res.Body, - ManifestEntry: api.ManifestEntry{ - ContentType: res.Header.Get("Content-Type"), - Size: res.ContentLength, - }, - }, nil -} - -// UploadDirectory uploads a directory tree to swarm and either adds the files -// to an existing manifest (if the manifest argument is non-empty) or creates a -// new manifest, returning the resulting manifest hash (files from the -// directory will then be available at bzz://path/to/file), with -// the file specified in defaultPath being uploaded to the root of the manifest -// (i.e. bzz://) -func (c *Client) UploadDirectory(dir, defaultPath, manifest string, toEncrypt bool) (string, error) { - stat, err := os.Stat(dir) - if err != nil { - return "", err - } else if !stat.IsDir() { - return "", fmt.Errorf("not a directory: %s", dir) - } - if defaultPath != "" { - if _, err := os.Stat(filepath.Join(dir, defaultPath)); err != nil { - if os.IsNotExist(err) { - return "", fmt.Errorf("the default path %q was not found in the upload directory %q", defaultPath, dir) - } - return "", fmt.Errorf("default path: %v", err) - } - } - return c.TarUpload(manifest, &DirectoryUploader{dir}, defaultPath, toEncrypt) -} - -// DownloadDirectory downloads the files contained in a swarm manifest under -// the given path into a local directory (existing files will be overwritten) -func (c *Client) DownloadDirectory(hash, path, destDir, credentials string) error { - stat, err := os.Stat(destDir) - if err != nil { - return err - } else if !stat.IsDir() { - return fmt.Errorf("not a directory: %s", destDir) - } - - uri := c.Gateway + "/bzz:/" + hash + "/" + path - req, err := http.NewRequest("GET", uri, nil) - if err != nil { - return err - } - if credentials != "" { - req.SetBasicAuth("", credentials) - } - req.Header.Set("Accept", "application/x-tar") - res, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer res.Body.Close() - switch res.StatusCode { - case http.StatusOK: - case http.StatusUnauthorized: - return ErrUnauthorized - default: - return fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - tr := tar.NewReader(res.Body) - for { - hdr, err := tr.Next() - if err == io.EOF { - return nil - } else if err != nil { - return err - } - // ignore the default path file - if hdr.Name == "" { - continue - } - - dstPath := filepath.Join(destDir, filepath.Clean(strings.TrimPrefix(hdr.Name, path))) - if err := os.MkdirAll(filepath.Dir(dstPath), 0755); err != nil { - return err - } - var mode os.FileMode = 0644 - if hdr.Mode > 0 { - mode = os.FileMode(hdr.Mode) - } - dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, mode) - if err != nil { - return err - } - n, err := io.Copy(dst, tr) - dst.Close() - if err != nil { - return err - } else if n != hdr.Size { - return fmt.Errorf("expected %s to be %d bytes but got %d", hdr.Name, hdr.Size, n) - } - } -} - -// DownloadFile downloads a single file into the destination directory -// if the manifest entry does not specify a file name - it will fallback -// to the hash of the file as a filename -func (c *Client) DownloadFile(hash, path, dest, credentials string) error { - hasDestinationFilename := false - if stat, err := os.Stat(dest); err == nil { - hasDestinationFilename = !stat.IsDir() - } else { - if os.IsNotExist(err) { - // does not exist - should be created - hasDestinationFilename = true - } else { - return fmt.Errorf("could not stat path: %v", err) - } - } - - manifestList, err := c.List(hash, path, credentials) - if err != nil { - return err - } - - switch len(manifestList.Entries) { - case 0: - return fmt.Errorf("could not find path requested at manifest address. make sure the path you've specified is correct") - case 1: - //continue - default: - return fmt.Errorf("got too many matches for this path") - } - - uri := c.Gateway + "/bzz:/" + hash + "/" + path - req, err := http.NewRequest("GET", uri, nil) - if err != nil { - return err - } - if credentials != "" { - req.SetBasicAuth("", credentials) - } - res, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer res.Body.Close() - switch res.StatusCode { - case http.StatusOK: - case http.StatusUnauthorized: - return ErrUnauthorized - default: - return fmt.Errorf("unexpected HTTP status: expected 200 OK, got %d", res.StatusCode) - } - filename := "" - if hasDestinationFilename { - filename = dest - } else { - // try to assert - re := regexp.MustCompile("[^/]+$") //everything after last slash - - if results := re.FindAllString(path, -1); len(results) > 0 { - filename = results[len(results)-1] - } else { - if entry := manifestList.Entries[0]; entry.Path != "" && entry.Path != "/" { - filename = entry.Path - } else { - // assume hash as name if there's nothing from the command line - filename = hash - } - } - filename = filepath.Join(dest, filename) - } - filePath, err := filepath.Abs(filename) - if err != nil { - return err - } - - if err := os.MkdirAll(filepath.Dir(filePath), 0777); err != nil { - return err - } - - dst, err := os.Create(filename) - if err != nil { - return err - } - defer dst.Close() - - _, err = io.Copy(dst, res.Body) - return err -} - -// UploadManifest uploads the given manifest to swarm -func (c *Client) UploadManifest(m *api.Manifest, toEncrypt bool) (string, error) { - data, err := json.Marshal(m) - if err != nil { - return "", err - } - return c.UploadRaw(bytes.NewReader(data), int64(len(data)), toEncrypt) -} - -// DownloadManifest downloads a swarm manifest -func (c *Client) DownloadManifest(hash string) (*api.Manifest, bool, error) { - res, isEncrypted, err := c.DownloadRaw(hash) - if err != nil { - return nil, isEncrypted, err - } - defer res.Close() - var manifest api.Manifest - if err := json.NewDecoder(res).Decode(&manifest); err != nil { - return nil, isEncrypted, err - } - return &manifest, isEncrypted, nil -} - -// List list files in a swarm manifest which have the given prefix, grouping -// common prefixes using "/" as a delimiter. -// -// For example, if the manifest represents the following directory structure: -// -// file1.txt -// file2.txt -// dir1/file3.txt -// dir1/dir2/file4.txt -// -// Then: -// -// - a prefix of "" would return [dir1/, file1.txt, file2.txt] -// - a prefix of "file" would return [file1.txt, file2.txt] -// - a prefix of "dir1/" would return [dir1/dir2/, dir1/file3.txt] -// -// where entries ending with "/" are common prefixes. -func (c *Client) List(hash, prefix, credentials string) (*api.ManifestList, error) { - req, err := http.NewRequest(http.MethodGet, c.Gateway+"/bzz-list:/"+hash+"/"+prefix, nil) - if err != nil { - return nil, err - } - if credentials != "" { - req.SetBasicAuth("", credentials) - } - res, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer res.Body.Close() - switch res.StatusCode { - case http.StatusOK: - case http.StatusUnauthorized: - return nil, ErrUnauthorized - default: - return nil, fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - var list api.ManifestList - if err := json.NewDecoder(res.Body).Decode(&list); err != nil { - return nil, err - } - return &list, nil -} - -// Uploader uploads files to swarm using a provided UploadFn -type Uploader interface { - Upload(UploadFn) error -} - -type UploaderFunc func(UploadFn) error - -func (u UploaderFunc) Upload(upload UploadFn) error { - return u(upload) -} - -// DirectoryUploader uploads all files in a directory, optionally uploading -// a file to the default path -type DirectoryUploader struct { - Dir string -} - -// Upload performs the upload of the directory and default path -func (d *DirectoryUploader) Upload(upload UploadFn) error { - return filepath.Walk(d.Dir, func(path string, f os.FileInfo, err error) error { - if err != nil { - return err - } - if f.IsDir() { - return nil - } - file, err := Open(path) - if err != nil { - return err - } - relPath, err := filepath.Rel(d.Dir, path) - if err != nil { - return err - } - file.Path = filepath.ToSlash(relPath) - return upload(file) - }) -} - -// FileUploader uploads a single file -type FileUploader struct { - File *File -} - -// Upload performs the upload of the file -func (f *FileUploader) Upload(upload UploadFn) error { - return upload(f.File) -} - -// UploadFn is the type of function passed to an Uploader to perform the upload -// of a single file (for example, a directory uploader would call a provided -// UploadFn for each file in the directory tree) -type UploadFn func(file *File) error - -// TarUpload uses the given Uploader to upload files to swarm as a tar stream, -// returning the resulting manifest hash -func (c *Client) TarUpload(hash string, uploader Uploader, defaultPath string, toEncrypt bool) (string, error) { - reqR, reqW := io.Pipe() - defer reqR.Close() - addr := hash - - // If there is a hash already (a manifest), then that manifest will determine if the upload has - // to be encrypted or not. If there is no manifest then the toEncrypt parameter decides if - // there is encryption or not. - if hash == "" && toEncrypt { - // This is the built-in address for the encrypted upload endpoint - addr = "encrypt" - } - req, err := http.NewRequest("POST", c.Gateway+"/bzz:/"+addr, reqR) - if err != nil { - return "", err - } - req.Header.Set("Content-Type", "application/x-tar") - if defaultPath != "" { - q := req.URL.Query() - q.Set("defaultpath", defaultPath) - req.URL.RawQuery = q.Encode() - } - - // use 'Expect: 100-continue' so we don't send the request body if - // the server refuses the request - req.Header.Set("Expect", "100-continue") - - tw := tar.NewWriter(reqW) - - // define an UploadFn which adds files to the tar stream - uploadFn := func(file *File) error { - hdr := &tar.Header{ - Name: file.Path, - Mode: file.Mode, - Size: file.Size, - ModTime: file.ModTime, - Xattrs: map[string]string{ - "user.swarm.content-type": file.ContentType, - }, - } - if err := tw.WriteHeader(hdr); err != nil { - return err - } - _, err = io.Copy(tw, file) - return err - } - - // run the upload in a goroutine so we can send the request headers and - // wait for a '100 Continue' response before sending the tar stream - go func() { - err := uploader.Upload(uploadFn) - if err == nil { - err = tw.Close() - } - reqW.CloseWithError(err) - }() - - res, err := http.DefaultClient.Do(req) - if err != nil { - return "", err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return "", fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - data, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", err - } - return string(data), nil -} - -// MultipartUpload uses the given Uploader to upload files to swarm as a -// multipart form, returning the resulting manifest hash -func (c *Client) MultipartUpload(hash string, uploader Uploader) (string, error) { - reqR, reqW := io.Pipe() - defer reqR.Close() - req, err := http.NewRequest("POST", c.Gateway+"/bzz:/"+hash, reqR) - if err != nil { - return "", err - } - - // use 'Expect: 100-continue' so we don't send the request body if - // the server refuses the request - req.Header.Set("Expect", "100-continue") - - mw := multipart.NewWriter(reqW) - req.Header.Set("Content-Type", fmt.Sprintf("multipart/form-data; boundary=%q", mw.Boundary())) - - // define an UploadFn which adds files to the multipart form - uploadFn := func(file *File) error { - hdr := make(textproto.MIMEHeader) - hdr.Set("Content-Disposition", fmt.Sprintf("form-data; name=%q", file.Path)) - hdr.Set("Content-Type", file.ContentType) - hdr.Set("Content-Length", strconv.FormatInt(file.Size, 10)) - w, err := mw.CreatePart(hdr) - if err != nil { - return err - } - _, err = io.Copy(w, file) - return err - } - - // run the upload in a goroutine so we can send the request headers and - // wait for a '100 Continue' response before sending the multipart form - go func() { - err := uploader.Upload(uploadFn) - if err == nil { - err = mw.Close() - } - reqW.CloseWithError(err) - }() - - res, err := http.DefaultClient.Do(req) - if err != nil { - return "", err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return "", fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - data, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", err - } - return string(data), nil -} - -// ErrNoResourceUpdatesFound is returned when Swarm cannot find updates of the given resource -var ErrNoResourceUpdatesFound = errors.New("No updates found for this resource") - -// CreateResource creates a Mutable Resource with the given name and frequency, initializing it with the provided -// data. Data is interpreted as multihash or not depending on the multihash parameter. -// startTime=0 means "now" -// Returns the resulting Mutable Resource manifest address that you can use to include in an ENS Resolver (setContent) -// or reference future updates (Client.UpdateResource) -func (c *Client) CreateResource(request *mru.Request) (string, error) { - responseStream, err := c.updateResource(request, true) - if err != nil { - return "", err - } - defer responseStream.Close() - - body, err := ioutil.ReadAll(responseStream) - if err != nil { - return "", err - } - - var manifestAddress string - if err = json.Unmarshal(body, &manifestAddress); err != nil { - return "", err - } - return manifestAddress, nil -} - -// UpdateResource allows you to set a new version of your content -func (c *Client) UpdateResource(request *mru.Request) error { - _, err := c.updateResource(request, false) - return err -} - -func (c *Client) updateResource(request *mru.Request, createManifest bool) (io.ReadCloser, error) { - URL, err := url.Parse(c.Gateway) - if err != nil { - return nil, err - } - URL.Path = "/bzz-resource:/" - values := URL.Query() - body := request.AppendValues(values) - if createManifest { - values.Set("manifest", "1") - } - URL.RawQuery = values.Encode() - - req, err := http.NewRequest("POST", URL.String(), bytes.NewBuffer(body)) - if err != nil { - return nil, err - } - - res, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - - return res.Body, nil -} - -// GetResource returns a byte stream with the raw content of the resource -// manifestAddressOrDomain is the address you obtained in CreateResource or an ENS domain whose Resolver -// points to that address -func (c *Client) GetResource(query *mru.Query, manifestAddressOrDomain string) (io.ReadCloser, error) { - return c.getResource(query, manifestAddressOrDomain, false) -} - -// getResource returns a byte stream with the raw content of the resource -// manifestAddressOrDomain is the address you obtained in CreateResource or an ENS domain whose Resolver -// points to that address -// meta set to true will instruct the node return resource metainformation instead -func (c *Client) getResource(query *mru.Query, manifestAddressOrDomain string, meta bool) (io.ReadCloser, error) { - URL, err := url.Parse(c.Gateway) - if err != nil { - return nil, err - } - URL.Path = "/bzz-resource:/" + manifestAddressOrDomain - values := URL.Query() - if query != nil { - query.AppendValues(values) //adds query parameters - } - if meta { - values.Set("meta", "1") - } - URL.RawQuery = values.Encode() - res, err := http.Get(URL.String()) - if err != nil { - return nil, err - } - - if res.StatusCode != http.StatusOK { - if res.StatusCode == http.StatusNotFound { - return nil, ErrNoResourceUpdatesFound - } - errorMessageBytes, err := ioutil.ReadAll(res.Body) - var errorMessage string - if err != nil { - errorMessage = "cannot retrieve error message: " + err.Error() - } else { - errorMessage = string(errorMessageBytes) - } - return nil, fmt.Errorf("Error retrieving resource: %s", errorMessage) - } - - return res.Body, nil -} - -// GetResourceMetadata returns a structure that describes the Mutable Resource -// manifestAddressOrDomain is the address you obtained in CreateResource or an ENS domain whose Resolver -// points to that address -func (c *Client) GetResourceMetadata(query *mru.Query, manifestAddressOrDomain string) (*mru.Request, error) { - - responseStream, err := c.getResource(query, manifestAddressOrDomain, true) - if err != nil { - return nil, err - } - defer responseStream.Close() - - body, err := ioutil.ReadAll(responseStream) - if err != nil { - return nil, err - } - - var metadata mru.Request - if err := metadata.UnmarshalJSON(body); err != nil { - return nil, err - } - return &metadata, nil -} diff --git a/swarm/api/client/client_test.go b/swarm/api/client/client_test.go deleted file mode 100644 index 02980de1db8f..000000000000 --- a/swarm/api/client/client_test.go +++ /dev/null @@ -1,529 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package client - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "sort" - "testing" - - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/swarm/api" - swarmhttp "github.com/ethereum/go-ethereum/swarm/api/http" - "github.com/ethereum/go-ethereum/swarm/multihash" - "github.com/ethereum/go-ethereum/swarm/storage/mru" - "github.com/ethereum/go-ethereum/swarm/testutil" -) - -func serverFunc(api *api.API) testutil.TestServer { - return swarmhttp.NewServer(api, "") -} - -// TestClientUploadDownloadRaw test uploading and downloading raw data to swarm -func TestClientUploadDownloadRaw(t *testing.T) { - testClientUploadDownloadRaw(false, t) -} -func TestClientUploadDownloadRawEncrypted(t *testing.T) { - testClientUploadDownloadRaw(true, t) -} - -func testClientUploadDownloadRaw(toEncrypt bool, t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - client := NewClient(srv.URL) - - // upload some raw data - data := []byte("foo123") - hash, err := client.UploadRaw(bytes.NewReader(data), int64(len(data)), toEncrypt) - if err != nil { - t.Fatal(err) - } - - // check we can download the same data - res, isEncrypted, err := client.DownloadRaw(hash) - if err != nil { - t.Fatal(err) - } - if isEncrypted != toEncrypt { - t.Fatalf("Expected encyption status %v got %v", toEncrypt, isEncrypted) - } - defer res.Close() - gotData, err := ioutil.ReadAll(res) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(gotData, data) { - t.Fatalf("expected downloaded data to be %q, got %q", data, gotData) - } -} - -// TestClientUploadDownloadFiles test uploading and downloading files to swarm -// manifests -func TestClientUploadDownloadFiles(t *testing.T) { - testClientUploadDownloadFiles(false, t) -} - -func TestClientUploadDownloadFilesEncrypted(t *testing.T) { - testClientUploadDownloadFiles(true, t) -} - -func testClientUploadDownloadFiles(toEncrypt bool, t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - client := NewClient(srv.URL) - upload := func(manifest, path string, data []byte) string { - file := &File{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(data)), - ManifestEntry: api.ManifestEntry{ - Path: path, - ContentType: "text/plain", - Size: int64(len(data)), - }, - } - hash, err := client.Upload(file, manifest, toEncrypt) - if err != nil { - t.Fatal(err) - } - return hash - } - checkDownload := func(manifest, path string, expected []byte) { - file, err := client.Download(manifest, path) - if err != nil { - t.Fatal(err) - } - defer file.Close() - if file.Size != int64(len(expected)) { - t.Fatalf("expected downloaded file to be %d bytes, got %d", len(expected), file.Size) - } - if file.ContentType != "text/plain" { - t.Fatalf("expected downloaded file to have type %q, got %q", "text/plain", file.ContentType) - } - data, err := ioutil.ReadAll(file) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(data, expected) { - t.Fatalf("expected downloaded data to be %q, got %q", expected, data) - } - } - - // upload a file to the root of a manifest - rootData := []byte("some-data") - rootHash := upload("", "", rootData) - - // check we can download the root file - checkDownload(rootHash, "", rootData) - - // upload another file to the same manifest - otherData := []byte("some-other-data") - newHash := upload(rootHash, "some/other/path", otherData) - - // check we can download both files from the new manifest - checkDownload(newHash, "", rootData) - checkDownload(newHash, "some/other/path", otherData) - - // replace the root file with different data - newHash = upload(newHash, "", otherData) - - // check both files have the other data - checkDownload(newHash, "", otherData) - checkDownload(newHash, "some/other/path", otherData) -} - -var testDirFiles = []string{ - "file1.txt", - "file2.txt", - "dir1/file3.txt", - "dir1/file4.txt", - "dir2/file5.txt", - "dir2/dir3/file6.txt", - "dir2/dir4/file7.txt", - "dir2/dir4/file8.txt", -} - -func newTestDirectory(t *testing.T) string { - dir, err := ioutil.TempDir("", "swarm-client-test") - if err != nil { - t.Fatal(err) - } - - for _, file := range testDirFiles { - path := filepath.Join(dir, file) - if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { - os.RemoveAll(dir) - t.Fatalf("error creating dir for %s: %s", path, err) - } - if err := ioutil.WriteFile(path, []byte(file), 0644); err != nil { - os.RemoveAll(dir) - t.Fatalf("error writing file %s: %s", path, err) - } - } - - return dir -} - -// TestClientUploadDownloadDirectory tests uploading and downloading a -// directory of files to a swarm manifest -func TestClientUploadDownloadDirectory(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - dir := newTestDirectory(t) - defer os.RemoveAll(dir) - - // upload the directory - client := NewClient(srv.URL) - defaultPath := testDirFiles[0] - hash, err := client.UploadDirectory(dir, defaultPath, "", false) - if err != nil { - t.Fatalf("error uploading directory: %s", err) - } - - // check we can download the individual files - checkDownloadFile := func(path string, expected []byte) { - file, err := client.Download(hash, path) - if err != nil { - t.Fatal(err) - } - defer file.Close() - data, err := ioutil.ReadAll(file) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(data, expected) { - t.Fatalf("expected data to be %q, got %q", expected, data) - } - } - for _, file := range testDirFiles { - checkDownloadFile(file, []byte(file)) - } - - // check we can download the default path - checkDownloadFile("", []byte(testDirFiles[0])) - - // check we can download the directory - tmp, err := ioutil.TempDir("", "swarm-client-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - if err := client.DownloadDirectory(hash, "", tmp, ""); err != nil { - t.Fatal(err) - } - for _, file := range testDirFiles { - data, err := ioutil.ReadFile(filepath.Join(tmp, file)) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(data, []byte(file)) { - t.Fatalf("expected data to be %q, got %q", file, data) - } - } -} - -// TestClientFileList tests listing files in a swarm manifest -func TestClientFileList(t *testing.T) { - testClientFileList(false, t) -} - -func TestClientFileListEncrypted(t *testing.T) { - testClientFileList(true, t) -} - -func testClientFileList(toEncrypt bool, t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - dir := newTestDirectory(t) - defer os.RemoveAll(dir) - - client := NewClient(srv.URL) - hash, err := client.UploadDirectory(dir, "", "", toEncrypt) - if err != nil { - t.Fatalf("error uploading directory: %s", err) - } - - ls := func(prefix string) []string { - list, err := client.List(hash, prefix, "") - if err != nil { - t.Fatal(err) - } - paths := make([]string, 0, len(list.CommonPrefixes)+len(list.Entries)) - paths = append(paths, list.CommonPrefixes...) - for _, entry := range list.Entries { - paths = append(paths, entry.Path) - } - sort.Strings(paths) - return paths - } - - tests := map[string][]string{ - "": {"dir1/", "dir2/", "file1.txt", "file2.txt"}, - "file": {"file1.txt", "file2.txt"}, - "file1": {"file1.txt"}, - "file2.txt": {"file2.txt"}, - "file12": {}, - "dir": {"dir1/", "dir2/"}, - "dir1": {"dir1/"}, - "dir1/": {"dir1/file3.txt", "dir1/file4.txt"}, - "dir1/file": {"dir1/file3.txt", "dir1/file4.txt"}, - "dir1/file3.txt": {"dir1/file3.txt"}, - "dir1/file34": {}, - "dir2/": {"dir2/dir3/", "dir2/dir4/", "dir2/file5.txt"}, - "dir2/file": {"dir2/file5.txt"}, - "dir2/dir": {"dir2/dir3/", "dir2/dir4/"}, - "dir2/dir3/": {"dir2/dir3/file6.txt"}, - "dir2/dir4/": {"dir2/dir4/file7.txt", "dir2/dir4/file8.txt"}, - "dir2/dir4/file": {"dir2/dir4/file7.txt", "dir2/dir4/file8.txt"}, - "dir2/dir4/file7.txt": {"dir2/dir4/file7.txt"}, - "dir2/dir4/file78": {}, - } - for prefix, expected := range tests { - actual := ls(prefix) - if !reflect.DeepEqual(actual, expected) { - t.Fatalf("expected prefix %q to return %v, got %v", prefix, expected, actual) - } - } -} - -// TestClientMultipartUpload tests uploading files to swarm using a multipart -// upload -func TestClientMultipartUpload(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - // define an uploader which uploads testDirFiles with some data - data := []byte("some-data") - uploader := UploaderFunc(func(upload UploadFn) error { - for _, name := range testDirFiles { - file := &File{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(data)), - ManifestEntry: api.ManifestEntry{ - Path: name, - ContentType: "text/plain", - Size: int64(len(data)), - }, - } - if err := upload(file); err != nil { - return err - } - } - return nil - }) - - // upload the files as a multipart upload - client := NewClient(srv.URL) - hash, err := client.MultipartUpload("", uploader) - if err != nil { - t.Fatal(err) - } - - // check we can download the individual files - checkDownloadFile := func(path string) { - file, err := client.Download(hash, path) - if err != nil { - t.Fatal(err) - } - defer file.Close() - gotData, err := ioutil.ReadAll(file) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(gotData, data) { - t.Fatalf("expected data to be %q, got %q", data, gotData) - } - } - for _, file := range testDirFiles { - checkDownloadFile(file) - } -} - -func newTestSigner() (*mru.GenericSigner, error) { - privKey, err := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") - if err != nil { - return nil, err - } - return mru.NewGenericSigner(privKey), nil -} - -// test the transparent resolving of multihash resource types with bzz:// scheme -// -// first upload data, and store the multihash to the resulting manifest in a resource update -// retrieving the update with the multihash should return the manifest pointing directly to the data -// and raw retrieve of that hash should return the data -func TestClientCreateResourceMultihash(t *testing.T) { - - signer, _ := newTestSigner() - - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - client := NewClient(srv.URL) - defer srv.Close() - - // add the data our multihash aliased manifest will point to - databytes := []byte("bar") - - swarmHash, err := client.UploadRaw(bytes.NewReader(databytes), int64(len(databytes)), false) - if err != nil { - t.Fatalf("Error uploading raw test data: %s", err) - } - - s := common.FromHex(swarmHash) - mh := multihash.ToMultihash(s) - - // our mutable resource topic - topic, _ := mru.NewTopic("foo.eth", nil) - - createRequest := mru.NewFirstRequest(topic) - - createRequest.SetData(mh) - if err := createRequest.Sign(signer); err != nil { - t.Fatalf("Error signing update: %s", err) - } - - resourceManifestHash, err := client.CreateResource(createRequest) - - if err != nil { - t.Fatalf("Error creating resource: %s", err) - } - - correctManifestAddrHex := "6ef40ba1492cf2a029dc9a8b5896c822cf689d3cd010842f4f1744e6db8824bd" - if resourceManifestHash != correctManifestAddrHex { - t.Fatalf("Response resource manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, resourceManifestHash) - } - - // Check we get a not found error when trying to get the resource with a made-up manifest - _, err = client.GetResource(nil, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") - if err != ErrNoResourceUpdatesFound { - t.Fatalf("Expected to receive ErrNoResourceUpdatesFound error. Got: %s", err) - } - - reader, err := client.GetResource(nil, correctManifestAddrHex) - if err != nil { - t.Fatalf("Error retrieving resource: %s", err) - } - defer reader.Close() - gotData, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(mh, gotData) { - t.Fatalf("Expected: %v, got %v", mh, gotData) - } - -} - -// TestClientCreateUpdateResource will check that mutable resources can be created and updated via the HTTP client. -func TestClientCreateUpdateResource(t *testing.T) { - - signer, _ := newTestSigner() - - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - client := NewClient(srv.URL) - defer srv.Close() - - // set raw data for the resource - databytes := []byte("En un lugar de La Mancha, de cuyo nombre no quiero acordarme...") - - // our mutable resource name - topic, _ := mru.NewTopic("El Quijote", nil) - createRequest := mru.NewFirstRequest(topic) - - createRequest.SetData(databytes) - if err := createRequest.Sign(signer); err != nil { - t.Fatalf("Error signing update: %s", err) - } - - resourceManifestHash, err := client.CreateResource(createRequest) - - correctManifestAddrHex := "fcb8e75f53e480e197c083ad1976d265674d0ce776f2bf359c09c413fb5230b8" - if resourceManifestHash != correctManifestAddrHex { - t.Fatalf("Response resource manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, resourceManifestHash) - } - - reader, err := client.GetResource(nil, correctManifestAddrHex) - if err != nil { - t.Fatalf("Error retrieving resource: %s", err) - } - defer reader.Close() - gotData, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(databytes, gotData) { - t.Fatalf("Expected: %v, got %v", databytes, gotData) - } - - // define different data - databytes = []byte("... no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero ...") - - updateRequest, err := client.GetResourceMetadata(nil, correctManifestAddrHex) - if err != nil { - t.Fatalf("Error retrieving update request template: %s", err) - } - - updateRequest.SetData(databytes) - if err := updateRequest.Sign(signer); err != nil { - t.Fatalf("Error signing update: %s", err) - } - - if err = client.UpdateResource(updateRequest); err != nil { - t.Fatalf("Error updating resource: %s", err) - } - - reader, err = client.GetResource(nil, correctManifestAddrHex) - if err != nil { - t.Fatalf("Error retrieving resource: %s", err) - } - defer reader.Close() - gotData, err = ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(databytes, gotData) { - t.Fatalf("Expected: %v, got %v", databytes, gotData) - } - - // now try retrieving resource without a manifest - - view := &mru.View{ - Topic: topic, - User: signer.Address(), - } - - lookupParams := mru.NewQueryLatest(view, lookup.NoClue) - reader, err = client.GetResource(lookupParams, "") - if err != nil { - t.Fatalf("Error retrieving resource: %s", err) - } - defer reader.Close() - gotData, err = ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(databytes, gotData) { - t.Fatalf("Expected: %v, got %v", databytes, gotData) - } -} diff --git a/swarm/api/config.go b/swarm/api/config.go deleted file mode 100644 index be73854087e9..000000000000 --- a/swarm/api/config.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "crypto/ecdsa" - "fmt" - "os" - "path/filepath" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/ens" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/pss" - "github.com/ethereum/go-ethereum/swarm/services/swap" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -const ( - DefaultHTTPListenAddr = "127.0.0.1" - DefaultHTTPPort = "8500" -) - -// separate bzz directories -// allow several bzz nodes running in parallel -type Config struct { - // serialised/persisted fields - *storage.FileStoreParams - *storage.LocalStoreParams - *network.HiveParams - Swap *swap.LocalProfile - Pss *pss.PssParams - //*network.SyncParams - Contract common.Address - EnsRoot common.Address - EnsAPIs []string - Path string - ListenAddr string - Port string - PublicKey string - BzzKey string - NodeID string - NetworkID uint64 - SwapEnabled bool - SyncEnabled bool - SyncingSkipCheck bool - DeliverySkipCheck bool - MaxStreamPeerServers int - LightNodeEnabled bool - SyncUpdateDelay time.Duration - SwapAPI string - Cors string - BzzAccount string - privateKey *ecdsa.PrivateKey -} - -//create a default config with all parameters to set to defaults -func NewConfig() (c *Config) { - - c = &Config{ - LocalStoreParams: storage.NewDefaultLocalStoreParams(), - FileStoreParams: storage.NewFileStoreParams(), - HiveParams: network.NewHiveParams(), - //SyncParams: network.NewDefaultSyncParams(), - Swap: swap.NewDefaultSwapParams(), - Pss: pss.NewPssParams(), - ListenAddr: DefaultHTTPListenAddr, - Port: DefaultHTTPPort, - Path: node.DefaultDataDir(), - EnsAPIs: nil, - EnsRoot: ens.TestNetAddress, - NetworkID: network.DefaultNetworkID, - SwapEnabled: false, - SyncEnabled: true, - SyncingSkipCheck: false, - MaxStreamPeerServers: 10000, - DeliverySkipCheck: true, - SyncUpdateDelay: 15 * time.Second, - SwapAPI: "", - } - - return -} - -//some config params need to be initialized after the complete -//config building phase is completed (e.g. due to overriding flags) -func (c *Config) Init(prvKey *ecdsa.PrivateKey) { - - address := crypto.PubkeyToAddress(prvKey.PublicKey) - c.Path = filepath.Join(c.Path, "bzz-"+common.Bytes2Hex(address.Bytes())) - err := os.MkdirAll(c.Path, os.ModePerm) - if err != nil { - log.Error(fmt.Sprintf("Error creating root swarm data directory: %v", err)) - return - } - - pubkey := crypto.FromECDSAPub(&prvKey.PublicKey) - pubkeyhex := common.ToHex(pubkey) - keyhex := crypto.Keccak256Hash(pubkey).Hex() - - c.PublicKey = pubkeyhex - c.BzzKey = keyhex - c.NodeID = enode.PubkeyToIDV4(&prvKey.PublicKey).String() - - if c.SwapEnabled { - c.Swap.Init(c.Contract, prvKey) - } - - c.privateKey = prvKey - c.LocalStoreParams.Init(c.Path) - c.LocalStoreParams.BaseKey = common.FromHex(keyhex) - - c.Pss = c.Pss.WithPrivateKey(c.privateKey) -} - -func (c *Config) ShiftPrivateKey() (privKey *ecdsa.PrivateKey) { - if c.privateKey != nil { - privKey = c.privateKey - c.privateKey = nil - } - return privKey -} diff --git a/swarm/api/config_test.go b/swarm/api/config_test.go deleted file mode 100644 index bd7e1d870500..000000000000 --- a/swarm/api/config_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "reflect" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" -) - -func TestConfig(t *testing.T) { - - var hexprvkey = "65138b2aa745041b372153550584587da326ab440576b2a1191dd95cee30039c" - - prvkey, err := crypto.HexToECDSA(hexprvkey) - if err != nil { - t.Fatalf("failed to load private key: %v", err) - } - - one := NewConfig() - two := NewConfig() - - one.LocalStoreParams = two.LocalStoreParams - if equal := reflect.DeepEqual(one, two); !equal { - t.Fatal("Two default configs are not equal") - } - - one.Init(prvkey) - - //the init function should set the following fields - if one.BzzKey == "" { - t.Fatal("Expected BzzKey to be set") - } - if one.PublicKey == "" { - t.Fatal("Expected PublicKey to be set") - } - if one.Swap.PayProfile.Beneficiary == (common.Address{}) && one.SwapEnabled { - t.Fatal("Failed to correctly initialize SwapParams") - } - if one.ChunkDbPath == one.Path { - t.Fatal("Failed to correctly initialize StoreParams") - } -} diff --git a/swarm/api/encrypt.go b/swarm/api/encrypt.go deleted file mode 100644 index ffe6c16d2dd4..000000000000 --- a/swarm/api/encrypt.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "encoding/binary" - "errors" - - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/swarm/storage/encryption" -) - -type RefEncryption struct { - refSize int - span []byte -} - -func NewRefEncryption(refSize int) *RefEncryption { - span := make([]byte, 8) - binary.LittleEndian.PutUint64(span, uint64(refSize)) - return &RefEncryption{ - refSize: refSize, - span: span, - } -} - -func (re *RefEncryption) Encrypt(ref []byte, key []byte) ([]byte, error) { - spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewKeccak256) - encryptedSpan, err := spanEncryption.Encrypt(re.span) - if err != nil { - return nil, err - } - dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewKeccak256) - encryptedData, err := dataEncryption.Encrypt(ref) - if err != nil { - return nil, err - } - encryptedRef := make([]byte, len(ref)+8) - copy(encryptedRef[:8], encryptedSpan) - copy(encryptedRef[8:], encryptedData) - - return encryptedRef, nil -} - -func (re *RefEncryption) Decrypt(ref []byte, key []byte) ([]byte, error) { - spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewKeccak256) - decryptedSpan, err := spanEncryption.Decrypt(ref[:8]) - if err != nil { - return nil, err - } - - size := binary.LittleEndian.Uint64(decryptedSpan) - if size != uint64(len(ref)-8) { - return nil, errors.New("invalid span in encrypted reference") - } - - dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewKeccak256) - decryptedRef, err := dataEncryption.Decrypt(ref[8:]) - if err != nil { - return nil, err - } - - return decryptedRef, nil -} diff --git a/swarm/api/filesystem.go b/swarm/api/filesystem.go deleted file mode 100644 index 43695efc1efa..000000000000 --- a/swarm/api/filesystem.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bufio" - "context" - "fmt" - "io" - "os" - "path" - "path/filepath" - "sync" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -const maxParallelFiles = 5 - -type FileSystem struct { - api *API -} - -func NewFileSystem(api *API) *FileSystem { - return &FileSystem{api} -} - -// Upload replicates a local directory as a manifest file and uploads it -// using FileStore store -// This function waits the chunks to be stored. -// TODO: localpath should point to a manifest -// -// DEPRECATED: Use the HTTP API instead -func (fs *FileSystem) Upload(lpath, index string, toEncrypt bool) (string, error) { - var list []*manifestTrieEntry - localpath, err := filepath.Abs(filepath.Clean(lpath)) - if err != nil { - return "", err - } - - f, err := os.Open(localpath) - if err != nil { - return "", err - } - stat, err := f.Stat() - if err != nil { - return "", err - } - - var start int - if stat.IsDir() { - start = len(localpath) - log.Debug(fmt.Sprintf("uploading '%s'", localpath)) - err = filepath.Walk(localpath, func(path string, info os.FileInfo, err error) error { - if (err == nil) && !info.IsDir() { - if len(path) <= start { - return fmt.Errorf("Path is too short") - } - if path[:start] != localpath { - return fmt.Errorf("Path prefix of '%s' does not match localpath '%s'", path, localpath) - } - entry := newManifestTrieEntry(&ManifestEntry{Path: filepath.ToSlash(path)}, nil) - list = append(list, entry) - } - return err - }) - if err != nil { - return "", err - } - } else { - dir := filepath.Dir(localpath) - start = len(dir) - if len(localpath) <= start { - return "", fmt.Errorf("Path is too short") - } - if localpath[:start] != dir { - return "", fmt.Errorf("Path prefix of '%s' does not match dir '%s'", localpath, dir) - } - entry := newManifestTrieEntry(&ManifestEntry{Path: filepath.ToSlash(localpath)}, nil) - list = append(list, entry) - } - - errors := make([]error, len(list)) - sem := make(chan bool, maxParallelFiles) - defer close(sem) - - for i, entry := range list { - sem <- true - go func(i int, entry *manifestTrieEntry) { - defer func() { <-sem }() - - f, err := os.Open(entry.Path) - if err != nil { - errors[i] = err - return - } - defer f.Close() - - stat, err := f.Stat() - if err != nil { - errors[i] = err - return - } - - var hash storage.Address - var wait func(context.Context) error - ctx := context.TODO() - hash, wait, err = fs.api.fileStore.Store(ctx, f, stat.Size(), toEncrypt) - if hash != nil { - list[i].Hash = hash.Hex() - } - if err := wait(ctx); err != nil { - errors[i] = err - return - } - - list[i].ContentType, err = DetectContentType(f.Name(), f) - if err != nil { - errors[i] = err - return - } - - }(i, entry) - } - for i := 0; i < cap(sem); i++ { - sem <- true - } - - trie := &manifestTrie{ - fileStore: fs.api.fileStore, - } - quitC := make(chan bool) - for i, entry := range list { - if errors[i] != nil { - return "", errors[i] - } - entry.Path = RegularSlashes(entry.Path[start:]) - if entry.Path == index { - ientry := newManifestTrieEntry(&ManifestEntry{ - ContentType: entry.ContentType, - }, nil) - ientry.Hash = entry.Hash - trie.addEntry(ientry, quitC) - } - trie.addEntry(entry, quitC) - } - - err2 := trie.recalcAndStore() - var hs string - if err2 == nil { - hs = trie.ref.Hex() - } - return hs, err2 -} - -// Download replicates the manifest basePath structure on the local filesystem -// under localpath -// -// DEPRECATED: Use the HTTP API instead -func (fs *FileSystem) Download(bzzpath, localpath string) error { - lpath, err := filepath.Abs(filepath.Clean(localpath)) - if err != nil { - return err - } - err = os.MkdirAll(lpath, os.ModePerm) - if err != nil { - return err - } - - //resolving host and port - uri, err := Parse(path.Join("bzz:/", bzzpath)) - if err != nil { - return err - } - addr, err := fs.api.Resolve(context.TODO(), uri.Addr) - if err != nil { - return err - } - path := uri.Path - - if len(path) > 0 { - path += "/" - } - - quitC := make(chan bool) - trie, err := loadManifest(context.TODO(), fs.api.fileStore, addr, quitC, NOOPDecrypt) - if err != nil { - log.Warn(fmt.Sprintf("fs.Download: loadManifestTrie error: %v", err)) - return err - } - - type downloadListEntry struct { - addr storage.Address - path string - } - - var list []*downloadListEntry - var mde error - - prevPath := lpath - err = trie.listWithPrefix(path, quitC, func(entry *manifestTrieEntry, suffix string) { - log.Trace(fmt.Sprintf("fs.Download: %#v", entry)) - - addr = common.Hex2Bytes(entry.Hash) - path := lpath + "/" + suffix - dir := filepath.Dir(path) - if dir != prevPath { - mde = os.MkdirAll(dir, os.ModePerm) - prevPath = dir - } - if (mde == nil) && (path != dir+"/") { - list = append(list, &downloadListEntry{addr: addr, path: path}) - } - }) - if err != nil { - return err - } - - wg := sync.WaitGroup{} - errC := make(chan error) - done := make(chan bool, maxParallelFiles) - for i, entry := range list { - select { - case done <- true: - wg.Add(1) - case <-quitC: - return fmt.Errorf("aborted") - } - go func(i int, entry *downloadListEntry) { - defer wg.Done() - err := retrieveToFile(quitC, fs.api.fileStore, entry.addr, entry.path) - if err != nil { - select { - case errC <- err: - case <-quitC: - } - return - } - <-done - }(i, entry) - } - go func() { - wg.Wait() - close(errC) - }() - select { - case err = <-errC: - return err - case <-quitC: - return fmt.Errorf("aborted") - } -} - -func retrieveToFile(quitC chan bool, fileStore *storage.FileStore, addr storage.Address, path string) error { - f, err := os.Create(path) // TODO: basePath separators - if err != nil { - return err - } - reader, _ := fileStore.Retrieve(context.TODO(), addr) - writer := bufio.NewWriter(f) - size, err := reader.Size(context.TODO(), quitC) - if err != nil { - return err - } - if _, err = io.CopyN(writer, reader, size); err != nil { - return err - } - if err := writer.Flush(); err != nil { - return err - } - return f.Close() -} diff --git a/swarm/api/filesystem_test.go b/swarm/api/filesystem_test.go deleted file mode 100644 index 02f5bff6583d..000000000000 --- a/swarm/api/filesystem_test.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "context" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -var testDownloadDir, _ = ioutil.TempDir(os.TempDir(), "bzz-test") - -func testFileSystem(t *testing.T, f func(*FileSystem, bool)) { - testAPI(t, func(api *API, toEncrypt bool) { - f(NewFileSystem(api), toEncrypt) - }) -} - -func readPath(t *testing.T, parts ...string) string { - file := filepath.Join(parts...) - content, err := ioutil.ReadFile(file) - - if err != nil { - t.Fatalf("unexpected error reading '%v': %v", file, err) - } - return string(content) -} - -func TestApiDirUpload0(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0"), "", toEncrypt) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "index.html") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - - content = readPath(t, "testdata", "test0", "index.css") - resp = testGet(t, api, bzzhash, "index.css") - exp = expResponse(content, "text/css; charset=utf-8", 0) - checkResponse(t, resp, exp) - - addr := storage.Address(common.Hex2Bytes(bzzhash)) - _, _, _, _, err = api.Get(context.TODO(), NOOPDecrypt, addr, "") - if err == nil { - t.Fatalf("expected error: %v", err) - } - - downloadDir := filepath.Join(testDownloadDir, "test0") - defer os.RemoveAll(downloadDir) - err = fs.Download(bzzhash, downloadDir) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - newbzzhash, err := fs.Upload(downloadDir, "", toEncrypt) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - // TODO: currently the hash is not deterministic in the encrypted case - if !toEncrypt && bzzhash != newbzzhash { - t.Fatalf("download %v reuploaded has incorrect hash, expected %v, got %v", downloadDir, bzzhash, newbzzhash) - } - }) -} - -func TestApiDirUploadModify(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0"), "", toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - - addr := storage.Address(common.Hex2Bytes(bzzhash)) - addr, err = api.Modify(context.TODO(), addr, "index.html", "", "") - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - index, err := ioutil.ReadFile(filepath.Join("testdata", "test0", "index.html")) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - ctx := context.TODO() - hash, wait, err := api.Store(ctx, bytes.NewReader(index), int64(len(index)), toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - err = wait(ctx) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - addr, err = api.Modify(context.TODO(), addr, "index2.html", hash.Hex(), "text/html; charset=utf-8") - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - addr, err = api.Modify(context.TODO(), addr, "img/logo.png", hash.Hex(), "text/html; charset=utf-8") - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - bzzhash = addr.Hex() - - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "index2.html") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - - resp = testGet(t, api, bzzhash, "img/logo.png") - exp = expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - - content = readPath(t, "testdata", "test0", "index.css") - resp = testGet(t, api, bzzhash, "index.css") - exp = expResponse(content, "text/css; charset=utf-8", 0) - checkResponse(t, resp, exp) - - _, _, _, _, err = api.Get(context.TODO(), nil, addr, "") - if err == nil { - t.Errorf("expected error: %v", err) - } - }) -} - -func TestApiDirUploadWithRootFile(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0"), "index.html", toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - }) -} - -func TestApiFileUpload(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0", "index.html"), "", toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "index.html") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - }) -} - -func TestApiFileUploadWithRootFile(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0", "index.html"), "index.html", toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - }) -} diff --git a/swarm/api/gen_mime.go b/swarm/api/gen_mime.go deleted file mode 100644 index 109edeb506c5..000000000000 --- a/swarm/api/gen_mime.go +++ /dev/null @@ -1,1201 +0,0 @@ -// Code generated by github.com/ethereum/go-ethereum/cmd/swarm/mimegen. DO NOT EDIT. - -package api - -import "mime" - -func init() { - var mimeTypes = map[string]string{ - ".a2l": "application/A2L", - ".aml": "application/AML", - ".ez": "application/andrew-inset", - ".atf": "application/ATF", - ".atfx": "application/ATFX", - ".atxml": "application/ATXML", - ".atom": "application/atom+xml", - ".atomcat": "application/atomcat+xml", - ".atomdeleted": "application/atomdeleted+xml", - ".atomsvc": "application/atomsvc+xml", - ".apxml": "application/auth-policy+xml", - ".xdd": "application/bacnet-xdd+zip", - ".xcs": "application/calendar+xml", - ".cbor": "application/cbor", - ".ccmp": "application/ccmp+xml", - ".ccxml": "application/ccxml+xml", - ".cdfx": "application/CDFX+XML", - ".cdmia": "application/cdmi-capability", - ".cdmic": "application/cdmi-container", - ".cdmid": "application/cdmi-domain", - ".cdmio": "application/cdmi-object", - ".cdmiq": "application/cdmi-queue", - ".cea": "application/CEA", - ".cellml": "application/cellml+xml", - ".cml": "application/cellml+xml", - ".clue": "application/clue_info+xml", - ".cmsc": "application/cms", - ".cpl": "application/cpl+xml", - ".csrattrs": "application/csrattrs", - ".mpd": "application/dash+xml", - ".mpdd": "application/dashdelta", - ".davmount": "application/davmount+xml", - ".dcd": "application/DCD", - ".dcm": "application/dicom", - ".dii": "application/DII", - ".dit": "application/DIT", - ".xmls": "application/dskpp+xml", - ".dssc": "application/dssc+der", - ".xdssc": "application/dssc+xml", - ".dvc": "application/dvcs", - ".es": "application/ecmascript", - ".efi": "application/efi", - ".emma": "application/emma+xml", - ".emotionml": "application/emotionml+xml", - ".epub": "application/epub+zip", - ".exi": "application/exi", - ".finf": "application/fastinfoset", - ".fdt": "application/fdt+xml", - ".pfr": "application/font-tdpfr", - ".geojson": "application/geo+json", - ".gml": "application/gml+xml", - ".gz": "application/gzip", - ".tgz": "application/gzip", - ".stk": "application/hyperstudio", - ".ink": "application/inkml+xml", - ".inkml": "application/inkml+xml", - ".ipfix": "application/ipfix", - ".its": "application/its+xml", - ".js": "application/javascript", - ".jrd": "application/jrd+json", - ".json": "application/json", - ".json-patch": "application/json-patch+json", - ".jsonld": "application/ld+json", - ".lgr": "application/lgr+xml", - ".wlnk": "application/link-format", - ".lostxml": "application/lost+xml", - ".lostsyncxml": "application/lostsync+xml", - ".lxf": "application/LXF", - ".hqx": "application/mac-binhex40", - ".mads": "application/mads+xml", - ".mrc": "application/marc", - ".mrcx": "application/marcxml+xml", - ".nb": "application/mathematica", - ".ma": "application/mathematica", - ".mb": "application/mathematica", - ".mml": "application/mathml+xml", - ".mbox": "application/mbox", - ".meta4": "application/metalink4+xml", - ".mets": "application/mets+xml", - ".mf4": "application/MF4", - ".mods": "application/mods+xml", - ".m21": "application/mp21", - ".mp21": "application/mp21", - ".doc": "application/msword", - ".mxf": "application/mxf", - ".nq": "application/n-quads", - ".nt": "application/n-triples", - ".orq": "application/ocsp-request", - ".ors": "application/ocsp-response", - ".bin": "application/octet-stream", - ".lha": "application/octet-stream", - ".lzh": "application/octet-stream", - ".exe": "application/octet-stream", - ".class": "application/octet-stream", - ".so": "application/octet-stream", - ".dll": "application/octet-stream", - ".img": "application/octet-stream", - ".iso": "application/octet-stream", - ".oda": "application/oda", - ".odx": "application/ODX", - ".opf": "application/oebps-package+xml", - ".ogx": "application/ogg", - ".oxps": "application/oxps", - ".relo": "application/p2p-overlay+xml", - ".pdf": "application/pdf", - ".pdx": "application/PDX", - ".pgp": "application/pgp-encrypted", - ".sig": "application/pgp-signature", - ".p10": "application/pkcs10", - ".p12": "application/pkcs12", - ".pfx": "application/pkcs12", - ".p7m": "application/pkcs7-mime", - ".p7c": "application/pkcs7-mime", - ".p7s": "application/pkcs7-signature", - ".p8": "application/pkcs8", - ".cer": "application/pkix-cert", - ".crl": "application/pkix-crl", - ".pkipath": "application/pkix-pkipath", - ".pki": "application/pkixcmp", - ".pls": "application/pls+xml", - ".ps": "application/postscript", - ".eps": "application/postscript", - ".ai": "application/postscript", - ".provx": "application/provenance+xml", - ".cw": "application/prs.cww", - ".cww": "application/prs.cww", - ".hpub": "application/prs.hpub+zip", - ".rnd": "application/prs.nprend", - ".rct": "application/prs.nprend", - ".rdf-crypt": "application/prs.rdf-xml-crypt", - ".xsf": "application/prs.xsf+xml", - ".pskcxml": "application/pskc+xml", - ".rdf": "application/rdf+xml", - ".rif": "application/reginfo+xml", - ".rnc": "application/relax-ng-compact-syntax", - ".rld": "application/resource-lists-diff+xml", - ".rl": "application/resource-lists+xml", - ".rfcxml": "application/rfc+xml", - ".rs": "application/rls-services+xml", - ".gbr": "application/rpki-ghostbusters", - ".mft": "application/rpki-manifest", - ".roa": "application/rpki-roa", - ".rtf": "application/rtf", - ".scim": "application/scim+json", - ".scq": "application/scvp-cv-request", - ".scs": "application/scvp-cv-response", - ".spq": "application/scvp-vp-request", - ".spp": "application/scvp-vp-response", - ".sdp": "application/sdp", - ".soc": "application/sgml-open-catalog", - ".shf": "application/shf+xml", - ".siv": "application/sieve", - ".sieve": "application/sieve", - ".cl": "application/simple-filter+xml", - ".smil": "application/smil+xml", - ".smi": "application/smil+xml", - ".sml": "application/smil+xml", - ".rq": "application/sparql-query", - ".srx": "application/sparql-results+xml", - ".sql": "application/sql", - ".gram": "application/srgs", - ".grxml": "application/srgs+xml", - ".sru": "application/sru+xml", - ".ssml": "application/ssml+xml", - ".tau": "application/tamp-apex-update", - ".auc": "application/tamp-apex-update-confirm", - ".tcu": "application/tamp-community-update", - ".cuc": "application/tamp-community-update-confirm", - ".ter": "application/tamp-error", - ".tsa": "application/tamp-sequence-adjust", - ".sac": "application/tamp-sequence-adjust-confirm", - ".tur": "application/tamp-update", - ".tuc": "application/tamp-update-confirm", - ".tei": "application/tei+xml", - ".teiCorpus": "application/tei+xml", - ".odd": "application/tei+xml", - ".tfi": "application/thraud+xml", - ".tsq": "application/timestamp-query", - ".tsr": "application/timestamp-reply", - ".tsd": "application/timestamped-data", - ".trig": "application/trig", - ".ttml": "application/ttml+xml", - ".gsheet": "application/urc-grpsheet+xml", - ".rsheet": "application/urc-ressheet+xml", - ".td": "application/urc-targetdesc+xml", - ".uis": "application/urc-uisocketdesc+xml", - ".plb": "application/vnd.3gpp.pic-bw-large", - ".psb": "application/vnd.3gpp.pic-bw-small", - ".pvb": "application/vnd.3gpp.pic-bw-var", - ".sms": "application/vnd.3gpp2.sms", - ".tcap": "application/vnd.3gpp2.tcap", - ".imgcal": "application/vnd.3lightssoftware.imagescal", - ".pwn": "application/vnd.3M.Post-it-Notes", - ".aso": "application/vnd.accpac.simply.aso", - ".imp": "application/vnd.accpac.simply.imp", - ".acu": "application/vnd.acucobol", - ".atc": "application/vnd.acucorp", - ".acutc": "application/vnd.acucorp", - ".swf": "application/vnd.adobe.flash.movie", - ".fcdt": "application/vnd.adobe.formscentral.fcdt", - ".fxp": "application/vnd.adobe.fxp", - ".fxpl": "application/vnd.adobe.fxp", - ".xdp": "application/vnd.adobe.xdp+xml", - ".xfdf": "application/vnd.adobe.xfdf", - ".ahead": "application/vnd.ahead.space", - ".azf": "application/vnd.airzip.filesecure.azf", - ".azs": "application/vnd.airzip.filesecure.azs", - ".azw3": "application/vnd.amazon.mobi8-ebook", - ".acc": "application/vnd.americandynamics.acc", - ".ami": "application/vnd.amiga.ami", - ".apkg": "application/vnd.anki", - ".cii": "application/vnd.anser-web-certificate-issue-initiation", - ".fti": "application/vnd.anser-web-funds-transfer-initiation", - ".dist": "application/vnd.apple.installer+xml", - ".distz": "application/vnd.apple.installer+xml", - ".pkg": "application/vnd.apple.installer+xml", - ".mpkg": "application/vnd.apple.installer+xml", - ".m3u8": "application/vnd.apple.mpegurl", - ".swi": "application/vnd.aristanetworks.swi", - ".iota": "application/vnd.astraea-software.iota", - ".aep": "application/vnd.audiograph", - ".package": "application/vnd.autopackage", - ".bmml": "application/vnd.balsamiq.bmml+xml", - ".bmpr": "application/vnd.balsamiq.bmpr", - ".mpm": "application/vnd.blueice.multipass", - ".ep": "application/vnd.bluetooth.ep.oob", - ".le": "application/vnd.bluetooth.le.oob", - ".bmi": "application/vnd.bmi", - ".rep": "application/vnd.businessobjects", - ".tlclient": "application/vnd.cendio.thinlinc.clientconf", - ".cdxml": "application/vnd.chemdraw+xml", - ".pgn": "application/vnd.chess-pgn", - ".mmd": "application/vnd.chipnuts.karaoke-mmd", - ".cdy": "application/vnd.cinderella", - ".csl": "application/vnd.citationstyles.style+xml", - ".cla": "application/vnd.claymore", - ".rp9": "application/vnd.cloanto.rp9", - ".c4g": "application/vnd.clonk.c4group", - ".c4d": "application/vnd.clonk.c4group", - ".c4f": "application/vnd.clonk.c4group", - ".c4p": "application/vnd.clonk.c4group", - ".c4u": "application/vnd.clonk.c4group", - ".c11amc": "application/vnd.cluetrust.cartomobile-config", - ".c11amz": "application/vnd.cluetrust.cartomobile-config-pkg", - ".coffee": "application/vnd.coffeescript", - ".cbz": "application/vnd.comicbook+zip", - ".ica": "application/vnd.commerce-battelle", - ".icf": "application/vnd.commerce-battelle", - ".icd": "application/vnd.commerce-battelle", - ".ic0": "application/vnd.commerce-battelle", - ".ic1": "application/vnd.commerce-battelle", - ".ic2": "application/vnd.commerce-battelle", - ".ic3": "application/vnd.commerce-battelle", - ".ic4": "application/vnd.commerce-battelle", - ".ic5": "application/vnd.commerce-battelle", - ".ic6": "application/vnd.commerce-battelle", - ".ic7": "application/vnd.commerce-battelle", - ".ic8": "application/vnd.commerce-battelle", - ".csp": "application/vnd.commonspace", - ".cst": "application/vnd.commonspace", - ".cdbcmsg": "application/vnd.contact.cmsg", - ".ign": "application/vnd.coreos.ignition+json", - ".ignition": "application/vnd.coreos.ignition+json", - ".cmc": "application/vnd.cosmocaller", - ".clkx": "application/vnd.crick.clicker", - ".clkk": "application/vnd.crick.clicker.keyboard", - ".clkp": "application/vnd.crick.clicker.palette", - ".clkt": "application/vnd.crick.clicker.template", - ".clkw": "application/vnd.crick.clicker.wordbank", - ".wbs": "application/vnd.criticaltools.wbs+xml", - ".pml": "application/vnd.ctc-posml", - ".ppd": "application/vnd.cups-ppd", - ".curl": "application/vnd.curl", - ".dart": "application/vnd.dart", - ".rdz": "application/vnd.data-vision.rdz", - ".deb": "application/vnd.debian.binary-package", - ".udeb": "application/vnd.debian.binary-package", - ".uvf": "application/vnd.dece.data", - ".uvvf": "application/vnd.dece.data", - ".uvd": "application/vnd.dece.data", - ".uvvd": "application/vnd.dece.data", - ".uvt": "application/vnd.dece.ttml+xml", - ".uvvt": "application/vnd.dece.ttml+xml", - ".uvx": "application/vnd.dece.unspecified", - ".uvvx": "application/vnd.dece.unspecified", - ".uvz": "application/vnd.dece.zip", - ".uvvz": "application/vnd.dece.zip", - ".fe_launch": "application/vnd.denovo.fcselayout-link", - ".dsm": "application/vnd.desmume.movie", - ".dna": "application/vnd.dna", - ".docjson": "application/vnd.document+json", - ".scld": "application/vnd.doremir.scorecloud-binary-document", - ".dpg": "application/vnd.dpgraph", - ".mwc": "application/vnd.dpgraph", - ".dpgraph": "application/vnd.dpgraph", - ".dfac": "application/vnd.dreamfactory", - ".fla": "application/vnd.dtg.local.flash", - ".ait": "application/vnd.dvb.ait", - ".svc": "application/vnd.dvb.service", - ".geo": "application/vnd.dynageo", - ".dzr": "application/vnd.dzr", - ".mag": "application/vnd.ecowin.chart", - ".nml": "application/vnd.enliven", - ".esf": "application/vnd.epson.esf", - ".msf": "application/vnd.epson.msf", - ".qam": "application/vnd.epson.quickanime", - ".slt": "application/vnd.epson.salt", - ".ssf": "application/vnd.epson.ssf", - ".qcall": "application/vnd.ericsson.quickcall", - ".qca": "application/vnd.ericsson.quickcall", - ".espass": "application/vnd.espass-espass+zip", - ".es3": "application/vnd.eszigno3+xml", - ".et3": "application/vnd.eszigno3+xml", - ".asice": "application/vnd.etsi.asic-e+zip", - ".sce": "application/vnd.etsi.asic-e+zip", - ".asics": "application/vnd.etsi.asic-s+zip", - ".tst": "application/vnd.etsi.timestamp-token", - ".ez2": "application/vnd.ezpix-album", - ".ez3": "application/vnd.ezpix-package", - ".dim": "application/vnd.fastcopy-disk-image", - ".fdf": "application/vnd.fdf", - ".msd": "application/vnd.fdsn.mseed", - ".mseed": "application/vnd.fdsn.mseed", - ".seed": "application/vnd.fdsn.seed", - ".dataless": "application/vnd.fdsn.seed", - ".zfc": "application/vnd.filmit.zfc", - ".gph": "application/vnd.FloGraphIt", - ".ftc": "application/vnd.fluxtime.clip", - ".sfd": "application/vnd.font-fontforge-sfd", - ".fm": "application/vnd.framemaker", - ".fnc": "application/vnd.frogans.fnc", - ".ltf": "application/vnd.frogans.ltf", - ".fsc": "application/vnd.fsc.weblaunch", - ".oas": "application/vnd.fujitsu.oasys", - ".oa2": "application/vnd.fujitsu.oasys2", - ".oa3": "application/vnd.fujitsu.oasys3", - ".fg5": "application/vnd.fujitsu.oasysgp", - ".bh2": "application/vnd.fujitsu.oasysprs", - ".ddd": "application/vnd.fujixerox.ddd", - ".xdw": "application/vnd.fujixerox.docuworks", - ".xbd": "application/vnd.fujixerox.docuworks.binder", - ".xct": "application/vnd.fujixerox.docuworks.container", - ".fzs": "application/vnd.fuzzysheet", - ".txd": "application/vnd.genomatix.tuxedo", - ".g3": "application/vnd.geocube+xml", - ".g³": "application/vnd.geocube+xml", - ".ggb": "application/vnd.geogebra.file", - ".ggt": "application/vnd.geogebra.tool", - ".gex": "application/vnd.geometry-explorer", - ".gre": "application/vnd.geometry-explorer", - ".gxt": "application/vnd.geonext", - ".g2w": "application/vnd.geoplan", - ".g3w": "application/vnd.geospace", - ".gmx": "application/vnd.gmx", - ".kml": "application/vnd.google-earth.kml+xml", - ".kmz": "application/vnd.google-earth.kmz", - ".gqf": "application/vnd.grafeq", - ".gqs": "application/vnd.grafeq", - ".gac": "application/vnd.groove-account", - ".ghf": "application/vnd.groove-help", - ".gim": "application/vnd.groove-identity-message", - ".grv": "application/vnd.groove-injector", - ".gtm": "application/vnd.groove-tool-message", - ".tpl": "application/vnd.groove-tool-template", - ".vcg": "application/vnd.groove-vcard", - ".hal": "application/vnd.hal+xml", - ".zmm": "application/vnd.HandHeld-Entertainment+xml", - ".hbci": "application/vnd.hbci", - ".hbc": "application/vnd.hbci", - ".kom": "application/vnd.hbci", - ".upa": "application/vnd.hbci", - ".pkd": "application/vnd.hbci", - ".bpd": "application/vnd.hbci", - ".hdt": "application/vnd.hdt", - ".les": "application/vnd.hhe.lesson-player", - ".hpgl": "application/vnd.hp-HPGL", - ".hpi": "application/vnd.hp-hpid", - ".hpid": "application/vnd.hp-hpid", - ".hps": "application/vnd.hp-hps", - ".jlt": "application/vnd.hp-jlyt", - ".pcl": "application/vnd.hp-PCL", - ".sfd-hdstx": "application/vnd.hydrostatix.sof-data", - ".x3d": "application/vnd.hzn-3d-crossword", - ".emm": "application/vnd.ibm.electronic-media", - ".mpy": "application/vnd.ibm.MiniPay", - ".list3820": "application/vnd.ibm.modcap", - ".listafp": "application/vnd.ibm.modcap", - ".afp": "application/vnd.ibm.modcap", - ".pseg3820": "application/vnd.ibm.modcap", - ".irm": "application/vnd.ibm.rights-management", - ".sc": "application/vnd.ibm.secure-container", - ".icc": "application/vnd.iccprofile", - ".icm": "application/vnd.iccprofile", - ".1905.1": "application/vnd.ieee.1905", - ".igl": "application/vnd.igloader", - ".imf": "application/vnd.imagemeter.folder+zip", - ".imi": "application/vnd.imagemeter.image+zip", - ".ivp": "application/vnd.immervision-ivp", - ".ivu": "application/vnd.immervision-ivu", - ".imscc": "application/vnd.ims.imsccv1p1", - ".igm": "application/vnd.insors.igm", - ".xpw": "application/vnd.intercon.formnet", - ".xpx": "application/vnd.intercon.formnet", - ".i2g": "application/vnd.intergeo", - ".qbo": "application/vnd.intu.qbo", - ".qfx": "application/vnd.intu.qfx", - ".rcprofile": "application/vnd.ipunplugged.rcprofile", - ".irp": "application/vnd.irepository.package+xml", - ".xpr": "application/vnd.is-xpr", - ".fcs": "application/vnd.isac.fcs", - ".jam": "application/vnd.jam", - ".rms": "application/vnd.jcp.javame.midlet-rms", - ".jisp": "application/vnd.jisp", - ".joda": "application/vnd.joost.joda-archive", - ".ktz": "application/vnd.kahootz", - ".ktr": "application/vnd.kahootz", - ".karbon": "application/vnd.kde.karbon", - ".chrt": "application/vnd.kde.kchart", - ".kfo": "application/vnd.kde.kformula", - ".flw": "application/vnd.kde.kivio", - ".kon": "application/vnd.kde.kontour", - ".kpr": "application/vnd.kde.kpresenter", - ".kpt": "application/vnd.kde.kpresenter", - ".ksp": "application/vnd.kde.kspread", - ".kwd": "application/vnd.kde.kword", - ".kwt": "application/vnd.kde.kword", - ".htke": "application/vnd.kenameaapp", - ".kia": "application/vnd.kidspiration", - ".kne": "application/vnd.Kinar", - ".knp": "application/vnd.Kinar", - ".sdf": "application/vnd.Kinar", - ".skp": "application/vnd.koan", - ".skd": "application/vnd.koan", - ".skm": "application/vnd.koan", - ".skt": "application/vnd.koan", - ".sse": "application/vnd.kodak-descriptor", - ".lasjson": "application/vnd.las.las+json", - ".lasxml": "application/vnd.las.las+xml", - ".lbd": "application/vnd.llamagraphics.life-balance.desktop", - ".lbe": "application/vnd.llamagraphics.life-balance.exchange+xml", - ".123": "application/vnd.lotus-1-2-3", - ".wk4": "application/vnd.lotus-1-2-3", - ".wk3": "application/vnd.lotus-1-2-3", - ".wk1": "application/vnd.lotus-1-2-3", - ".apr": "application/vnd.lotus-approach", - ".vew": "application/vnd.lotus-approach", - ".prz": "application/vnd.lotus-freelance", - ".pre": "application/vnd.lotus-freelance", - ".nsf": "application/vnd.lotus-notes", - ".ntf": "application/vnd.lotus-notes", - ".ndl": "application/vnd.lotus-notes", - ".ns4": "application/vnd.lotus-notes", - ".ns3": "application/vnd.lotus-notes", - ".ns2": "application/vnd.lotus-notes", - ".nsh": "application/vnd.lotus-notes", - ".nsg": "application/vnd.lotus-notes", - ".or3": "application/vnd.lotus-organizer", - ".or2": "application/vnd.lotus-organizer", - ".org": "application/vnd.lotus-organizer", - ".scm": "application/vnd.lotus-screencam", - ".lwp": "application/vnd.lotus-wordpro", - ".sam": "application/vnd.lotus-wordpro", - ".portpkg": "application/vnd.macports.portpkg", - ".mvt": "application/vnd.mapbox-vector-tile", - ".mdc": "application/vnd.marlin.drm.mdcf", - ".mmdb": "application/vnd.maxmind.maxmind-db", - ".mcd": "application/vnd.mcd", - ".mc1": "application/vnd.medcalcdata", - ".cdkey": "application/vnd.mediastation.cdkey", - ".mwf": "application/vnd.MFER", - ".mfm": "application/vnd.mfmp", - ".flo": "application/vnd.micrografx.flo", - ".igx": "application/vnd.micrografx.igx", - ".mif": "application/vnd.mif", - ".daf": "application/vnd.Mobius.DAF", - ".dis": "application/vnd.Mobius.DIS", - ".mbk": "application/vnd.Mobius.MBK", - ".mqy": "application/vnd.Mobius.MQY", - ".msl": "application/vnd.Mobius.MSL", - ".plc": "application/vnd.Mobius.PLC", - ".txf": "application/vnd.Mobius.TXF", - ".mpn": "application/vnd.mophun.application", - ".mpc": "application/vnd.mophun.certificate", - ".xul": "application/vnd.mozilla.xul+xml", - ".3mf": "application/vnd.ms-3mfdocument", - ".cil": "application/vnd.ms-artgalry", - ".asf": "application/vnd.ms-asf", - ".cab": "application/vnd.ms-cab-compressed", - ".xls": "application/vnd.ms-excel", - ".xlm": "application/vnd.ms-excel", - ".xla": "application/vnd.ms-excel", - ".xlc": "application/vnd.ms-excel", - ".xlt": "application/vnd.ms-excel", - ".xlw": "application/vnd.ms-excel", - ".xltm": "application/vnd.ms-excel.template.macroEnabled.12", - ".xlam": "application/vnd.ms-excel.addin.macroEnabled.12", - ".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12", - ".xlsm": "application/vnd.ms-excel.sheet.macroEnabled.12", - ".eot": "application/vnd.ms-fontobject", - ".chm": "application/vnd.ms-htmlhelp", - ".ims": "application/vnd.ms-ims", - ".lrm": "application/vnd.ms-lrm", - ".thmx": "application/vnd.ms-officetheme", - ".ppt": "application/vnd.ms-powerpoint", - ".pps": "application/vnd.ms-powerpoint", - ".pot": "application/vnd.ms-powerpoint", - ".ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12", - ".pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12", - ".sldm": "application/vnd.ms-powerpoint.slide.macroEnabled.12", - ".ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", - ".potm": "application/vnd.ms-powerpoint.template.macroEnabled.12", - ".mpp": "application/vnd.ms-project", - ".mpt": "application/vnd.ms-project", - ".tnef": "application/vnd.ms-tnef", - ".tnf": "application/vnd.ms-tnef", - ".docm": "application/vnd.ms-word.document.macroEnabled.12", - ".dotm": "application/vnd.ms-word.template.macroEnabled.12", - ".wcm": "application/vnd.ms-works", - ".wdb": "application/vnd.ms-works", - ".wks": "application/vnd.ms-works", - ".wps": "application/vnd.ms-works", - ".wpl": "application/vnd.ms-wpl", - ".xps": "application/vnd.ms-xpsdocument", - ".msa": "application/vnd.msa-disk-image", - ".mseq": "application/vnd.mseq", - ".crtr": "application/vnd.multiad.creator", - ".cif": "application/vnd.multiad.creator.cif", - ".mus": "application/vnd.musician", - ".msty": "application/vnd.muvee.style", - ".taglet": "application/vnd.mynfc", - ".entity": "application/vnd.nervana", - ".request": "application/vnd.nervana", - ".bkm": "application/vnd.nervana", - ".kcm": "application/vnd.nervana", - ".nitf": "application/vnd.nitf", - ".nlu": "application/vnd.neurolanguage.nlu", - ".nds": "application/vnd.nintendo.nitro.rom", - ".sfc": "application/vnd.nintendo.snes.rom", - ".smc": "application/vnd.nintendo.snes.rom", - ".nnd": "application/vnd.noblenet-directory", - ".nns": "application/vnd.noblenet-sealer", - ".nnw": "application/vnd.noblenet-web", - ".ac": "application/vnd.nokia.n-gage.ac+xml", - ".ngdat": "application/vnd.nokia.n-gage.data", - ".n-gage": "application/vnd.nokia.n-gage.symbian.install", - ".rpst": "application/vnd.nokia.radio-preset", - ".rpss": "application/vnd.nokia.radio-presets", - ".edm": "application/vnd.novadigm.EDM", - ".edx": "application/vnd.novadigm.EDX", - ".ext": "application/vnd.novadigm.EXT", - ".odc": "application/vnd.oasis.opendocument.chart", - ".otc": "application/vnd.oasis.opendocument.chart-template", - ".odb": "application/vnd.oasis.opendocument.database", - ".odf": "application/vnd.oasis.opendocument.formula", - ".odg": "application/vnd.oasis.opendocument.graphics", - ".otg": "application/vnd.oasis.opendocument.graphics-template", - ".odi": "application/vnd.oasis.opendocument.image", - ".oti": "application/vnd.oasis.opendocument.image-template", - ".odp": "application/vnd.oasis.opendocument.presentation", - ".otp": "application/vnd.oasis.opendocument.presentation-template", - ".ods": "application/vnd.oasis.opendocument.spreadsheet", - ".ots": "application/vnd.oasis.opendocument.spreadsheet-template", - ".odt": "application/vnd.oasis.opendocument.text", - ".odm": "application/vnd.oasis.opendocument.text-master", - ".ott": "application/vnd.oasis.opendocument.text-template", - ".oth": "application/vnd.oasis.opendocument.text-web", - ".xo": "application/vnd.olpc-sugar", - ".dd2": "application/vnd.oma.dd2+xml", - ".tam": "application/vnd.onepager", - ".tamp": "application/vnd.onepagertamp", - ".tamx": "application/vnd.onepagertamx", - ".tat": "application/vnd.onepagertat", - ".tatp": "application/vnd.onepagertatp", - ".tatx": "application/vnd.onepagertatx", - ".obgx": "application/vnd.openblox.game+xml", - ".obg": "application/vnd.openblox.game-binary", - ".oeb": "application/vnd.openeye.oeb", - ".oxt": "application/vnd.openofficeorg.extension", - ".osm": "application/vnd.openstreetmap.data+xml", - ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", - ".sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide", - ".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow", - ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template", - ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template", - ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template", - ".ndc": "application/vnd.osa.netdeploy", - ".mgp": "application/vnd.osgeo.mapguide.package", - ".dp": "application/vnd.osgi.dp", - ".esa": "application/vnd.osgi.subsystem", - ".oxlicg": "application/vnd.oxli.countgraph", - ".prc": "application/vnd.palm", - ".pdb": "application/vnd.palm", - ".pqa": "application/vnd.palm", - ".oprc": "application/vnd.palm", - ".plp": "application/vnd.panoply", - ".paw": "application/vnd.pawaafile", - ".str": "application/vnd.pg.format", - ".ei6": "application/vnd.pg.osasli", - ".pil": "application/vnd.piaccess.application-license", - ".efif": "application/vnd.picsel", - ".wg": "application/vnd.pmi.widget", - ".plf": "application/vnd.pocketlearn", - ".pbd": "application/vnd.powerbuilder6", - ".preminet": "application/vnd.preminet", - ".box": "application/vnd.previewsystems.box", - ".vbox": "application/vnd.previewsystems.box", - ".mgz": "application/vnd.proteus.magazine", - ".qps": "application/vnd.publishare-delta-tree", - ".ptid": "application/vnd.pvi.ptid1", - ".bar": "application/vnd.qualcomm.brew-app-res", - ".qxd": "application/vnd.Quark.QuarkXPress", - ".qxt": "application/vnd.Quark.QuarkXPress", - ".qwd": "application/vnd.Quark.QuarkXPress", - ".qwt": "application/vnd.Quark.QuarkXPress", - ".qxl": "application/vnd.Quark.QuarkXPress", - ".qxb": "application/vnd.Quark.QuarkXPress", - ".quox": "application/vnd.quobject-quoxdocument", - ".quiz": "application/vnd.quobject-quoxdocument", - ".tree": "application/vnd.rainstor.data", - ".rar": "application/vnd.rar", - ".bed": "application/vnd.realvnc.bed", - ".mxl": "application/vnd.recordare.musicxml", - ".cryptonote": "application/vnd.rig.cryptonote", - ".link66": "application/vnd.route66.link66+xml", - ".st": "application/vnd.sailingtracker.track", - ".scd": "application/vnd.scribus", - ".sla": "application/vnd.scribus", - ".slaz": "application/vnd.scribus", - ".s3df": "application/vnd.sealed.3df", - ".scsf": "application/vnd.sealed.csf", - ".sdoc": "application/vnd.sealed.doc", - ".sdo": "application/vnd.sealed.doc", - ".s1w": "application/vnd.sealed.doc", - ".seml": "application/vnd.sealed.eml", - ".sem": "application/vnd.sealed.eml", - ".smht": "application/vnd.sealed.mht", - ".smh": "application/vnd.sealed.mht", - ".sppt": "application/vnd.sealed.ppt", - ".s1p": "application/vnd.sealed.ppt", - ".stif": "application/vnd.sealed.tiff", - ".sxls": "application/vnd.sealed.xls", - ".sxl": "application/vnd.sealed.xls", - ".s1e": "application/vnd.sealed.xls", - ".stml": "application/vnd.sealedmedia.softseal.html", - ".s1h": "application/vnd.sealedmedia.softseal.html", - ".spdf": "application/vnd.sealedmedia.softseal.pdf", - ".spd": "application/vnd.sealedmedia.softseal.pdf", - ".s1a": "application/vnd.sealedmedia.softseal.pdf", - ".see": "application/vnd.seemail", - ".sema": "application/vnd.sema", - ".semd": "application/vnd.semd", - ".semf": "application/vnd.semf", - ".ifm": "application/vnd.shana.informed.formdata", - ".itp": "application/vnd.shana.informed.formtemplate", - ".iif": "application/vnd.shana.informed.interchange", - ".ipk": "application/vnd.shana.informed.package", - ".twd": "application/vnd.SimTech-MindMapper", - ".twds": "application/vnd.SimTech-MindMapper", - ".mmf": "application/vnd.smaf", - ".notebook": "application/vnd.smart.notebook", - ".teacher": "application/vnd.smart.teacher", - ".fo": "application/vnd.software602.filler.form+xml", - ".zfo": "application/vnd.software602.filler.form-xml-zip", - ".sdkm": "application/vnd.solent.sdkm+xml", - ".sdkd": "application/vnd.solent.sdkm+xml", - ".dxp": "application/vnd.spotfire.dxp", - ".sfs": "application/vnd.spotfire.sfs", - ".smzip": "application/vnd.stepmania.package", - ".sm": "application/vnd.stepmania.stepchart", - ".wadl": "application/vnd.sun.wadl+xml", - ".sus": "application/vnd.sus-calendar", - ".susp": "application/vnd.sus-calendar", - ".xsm": "application/vnd.syncml+xml", - ".bdm": "application/vnd.syncml.dm+wbxml", - ".xdm": "application/vnd.syncml.dm+xml", - ".ddf": "application/vnd.syncml.dmddf+xml", - ".tao": "application/vnd.tao.intent-module-archive", - ".pcap": "application/vnd.tcpdump.pcap", - ".cap": "application/vnd.tcpdump.pcap", - ".dmp": "application/vnd.tcpdump.pcap", - ".qvd": "application/vnd.theqvd", - ".vfr": "application/vnd.tml", - ".viaframe": "application/vnd.tml", - ".tmo": "application/vnd.tmobile-livetv", - ".tpt": "application/vnd.trid.tpt", - ".mxs": "application/vnd.triscape.mxs", - ".tra": "application/vnd.trueapp", - ".ufdl": "application/vnd.ufdl", - ".ufd": "application/vnd.ufdl", - ".frm": "application/vnd.ufdl", - ".utz": "application/vnd.uiq.theme", - ".umj": "application/vnd.umajin", - ".unityweb": "application/vnd.unity", - ".uoml": "application/vnd.uoml+xml", - ".uo": "application/vnd.uoml+xml", - ".urim": "application/vnd.uri-map", - ".urimap": "application/vnd.uri-map", - ".vmt": "application/vnd.valve.source.material", - ".vcx": "application/vnd.vcx", - ".mxi": "application/vnd.vd-study", - ".study-inter": "application/vnd.vd-study", - ".model-inter": "application/vnd.vd-study", - ".vwx": "application/vnd.vectorworks", - ".vsc": "application/vnd.vidsoft.vidconference", - ".vsd": "application/vnd.visio", - ".vst": "application/vnd.visio", - ".vsw": "application/vnd.visio", - ".vss": "application/vnd.visio", - ".vis": "application/vnd.visionary", - ".vsf": "application/vnd.vsf", - ".sic": "application/vnd.wap.sic", - ".slc": "application/vnd.wap.slc", - ".wbxml": "application/vnd.wap.wbxml", - ".wmlc": "application/vnd.wap.wmlc", - ".wmlsc": "application/vnd.wap.wmlscriptc", - ".wtb": "application/vnd.webturbo", - ".p2p": "application/vnd.wfa.p2p", - ".wsc": "application/vnd.wfa.wsc", - ".wmc": "application/vnd.wmc", - ".m": "application/vnd.wolfram.mathematica.package", - ".nbp": "application/vnd.wolfram.player", - ".wpd": "application/vnd.wordperfect", - ".wqd": "application/vnd.wqd", - ".stf": "application/vnd.wt.stf", - ".wv": "application/vnd.wv.csp+wbxml", - ".xar": "application/vnd.xara", - ".xfdl": "application/vnd.xfdl", - ".xfd": "application/vnd.xfdl", - ".cpkg": "application/vnd.xmpie.cpkg", - ".dpkg": "application/vnd.xmpie.dpkg", - ".ppkg": "application/vnd.xmpie.ppkg", - ".xlim": "application/vnd.xmpie.xlim", - ".hvd": "application/vnd.yamaha.hv-dic", - ".hvs": "application/vnd.yamaha.hv-script", - ".hvp": "application/vnd.yamaha.hv-voice", - ".osf": "application/vnd.yamaha.openscoreformat", - ".saf": "application/vnd.yamaha.smaf-audio", - ".spf": "application/vnd.yamaha.smaf-phrase", - ".yme": "application/vnd.yaoweme", - ".cmp": "application/vnd.yellowriver-custom-menu", - ".zir": "application/vnd.zul", - ".zirz": "application/vnd.zul", - ".zaz": "application/vnd.zzazz.deck+xml", - ".vxml": "application/voicexml+xml", - ".wif": "application/watcherinfo+xml", - ".wgt": "application/widget", - ".wsdl": "application/wsdl+xml", - ".wspolicy": "application/wspolicy+xml", - ".xav": "application/xcap-att+xml", - ".xca": "application/xcap-caps+xml", - ".xdf": "application/xcap-diff+xml", - ".xel": "application/xcap-el+xml", - ".xer": "application/xcap-error+xml", - ".xns": "application/xcap-ns+xml", - ".xhtml": "application/xhtml+xml", - ".xhtm": "application/xhtml+xml", - ".xht": "application/xhtml+xml", - ".dtd": "application/xml-dtd", - ".xop": "application/xop+xml", - ".xsl": "application/xslt+xml", - ".xslt": "application/xslt+xml", - ".mxml": "application/xv+xml", - ".xhvml": "application/xv+xml", - ".xvml": "application/xv+xml", - ".xvm": "application/xv+xml", - ".yang": "application/yang", - ".yin": "application/yin+xml", - ".zip": "application/zip", - ".726": "audio/32kadpcm", - ".ac3": "audio/ac3", - ".amr": "audio/AMR", - ".awb": "audio/AMR-WB", - ".acn": "audio/asc", - ".aal": "audio/ATRAC-ADVANCED-LOSSLESS", - ".atx": "audio/ATRAC-X", - ".at3": "audio/ATRAC3", - ".aa3": "audio/ATRAC3", - ".omg": "audio/ATRAC3", - ".au": "audio/basic", - ".snd": "audio/basic", - ".dls": "audio/dls", - ".evc": "audio/EVRC", - ".evb": "audio/EVRCB", - ".enw": "audio/EVRCNW", - ".evw": "audio/EVRCWB", - ".lbc": "audio/iLBC", - ".l16": "audio/L16", - ".mxmf": "audio/mobile-xmf", - ".m4a": "audio/mp4", - ".mp3": "audio/mpeg", - ".mpga": "audio/mpeg", - ".mp1": "audio/mpeg", - ".mp2": "audio/mpeg", - ".oga": "audio/ogg", - ".ogg": "audio/ogg", - ".opus": "audio/ogg", - ".spx": "audio/ogg", - ".sid": "audio/prs.sid", - ".psid": "audio/prs.sid", - ".qcp": "audio/qcelp", - ".smv": "audio/SMV", - ".koz": "audio/vnd.audikoz", - ".uva": "audio/vnd.dece.audio", - ".uvva": "audio/vnd.dece.audio", - ".eol": "audio/vnd.digital-winds", - ".mlp": "audio/vnd.dolby.mlp", - ".dts": "audio/vnd.dts", - ".dtshd": "audio/vnd.dts.hd", - ".plj": "audio/vnd.everad.plj", - ".lvp": "audio/vnd.lucent.voice", - ".pya": "audio/vnd.ms-playready.media.pya", - ".vbk": "audio/vnd.nortel.vbk", - ".ecelp4800": "audio/vnd.nuera.ecelp4800", - ".ecelp7470": "audio/vnd.nuera.ecelp7470", - ".ecelp9600": "audio/vnd.nuera.ecelp9600", - ".rip": "audio/vnd.rip", - ".smp3": "audio/vnd.sealedmedia.softseal.mpeg", - ".smp": "audio/vnd.sealedmedia.softseal.mpeg", - ".s1m": "audio/vnd.sealedmedia.softseal.mpeg", - ".ttc": "font/collection", - ".otf": "font/otf", - ".ttf": "font/ttf", - ".woff": "font/woff", - ".woff2": "font/woff2", - ".bmp": "image/bmp", - ".dib": "image/bmp", - ".cgm": "image/cgm", - ".drle": "image/dicom-rle", - ".emf": "image/emf", - ".fits": "image/fits", - ".fit": "image/fits", - ".fts": "image/fits", - ".gif": "image/gif", - ".ief": "image/ief", - ".jls": "image/jls", - ".jp2": "image/jp2", - ".jpg2": "image/jp2", - ".jpg": "image/jpeg", - ".jpeg": "image/jpeg", - ".jpe": "image/jpeg", - ".jfif": "image/jpeg", - ".jpm": "image/jpm", - ".jpgm": "image/jpm", - ".jpx": "image/jpx", - ".jpf": "image/jpx", - ".ktx": "image/ktx", - ".png": "image/png", - ".btif": "image/prs.btif", - ".btf": "image/prs.btif", - ".pti": "image/prs.pti", - ".svg": "image/svg+xml", - ".svgz": "image/svg+xml", - ".t38": "image/t38", - ".tiff": "image/tiff", - ".tif": "image/tiff", - ".tfx": "image/tiff-fx", - ".psd": "image/vnd.adobe.photoshop", - ".azv": "image/vnd.airzip.accelerator.azv", - ".uvi": "image/vnd.dece.graphic", - ".uvvi": "image/vnd.dece.graphic", - ".uvg": "image/vnd.dece.graphic", - ".uvvg": "image/vnd.dece.graphic", - ".djvu": "image/vnd.djvu", - ".djv": "image/vnd.djvu", - ".dwg": "image/vnd.dwg", - ".dxf": "image/vnd.dxf", - ".fbs": "image/vnd.fastbidsheet", - ".fpx": "image/vnd.fpx", - ".fst": "image/vnd.fst", - ".mmr": "image/vnd.fujixerox.edmics-mmr", - ".rlc": "image/vnd.fujixerox.edmics-rlc", - ".pgb": "image/vnd.globalgraphics.pgb", - ".ico": "image/vnd.microsoft.icon", - ".apng": "image/vnd.mozilla.apng", - ".mdi": "image/vnd.ms-modi", - ".hdr": "image/vnd.radiance", - ".rgbe": "image/vnd.radiance", - ".xyze": "image/vnd.radiance", - ".spng": "image/vnd.sealed.png", - ".spn": "image/vnd.sealed.png", - ".s1n": "image/vnd.sealed.png", - ".sgif": "image/vnd.sealedmedia.softseal.gif", - ".sgi": "image/vnd.sealedmedia.softseal.gif", - ".s1g": "image/vnd.sealedmedia.softseal.gif", - ".sjpg": "image/vnd.sealedmedia.softseal.jpg", - ".sjp": "image/vnd.sealedmedia.softseal.jpg", - ".s1j": "image/vnd.sealedmedia.softseal.jpg", - ".tap": "image/vnd.tencent.tap", - ".vtf": "image/vnd.valve.source.texture", - ".wbmp": "image/vnd.wap.wbmp", - ".xif": "image/vnd.xiff", - ".pcx": "image/vnd.zbrush.pcx", - ".wmf": "image/wmf", - ".u8msg": "message/global", - ".u8dsn": "message/global-delivery-status", - ".u8mdn": "message/global-disposition-notification", - ".u8hdr": "message/global-headers", - ".eml": "message/rfc822", - ".mail": "message/rfc822", - ".art": "message/rfc822", - ".gltf": "model/gltf+json", - ".igs": "model/iges", - ".iges": "model/iges", - ".msh": "model/mesh", - ".mesh": "model/mesh", - ".silo": "model/mesh", - ".dae": "model/vnd.collada+xml", - ".dwf": "model/vnd.dwf", - ".gdl": "model/vnd.gdl", - ".gsm": "model/vnd.gdl", - ".win": "model/vnd.gdl", - ".dor": "model/vnd.gdl", - ".lmp": "model/vnd.gdl", - ".rsm": "model/vnd.gdl", - ".msm": "model/vnd.gdl", - ".ism": "model/vnd.gdl", - ".gtw": "model/vnd.gtw", - ".moml": "model/vnd.moml+xml", - ".mts": "model/vnd.mts", - ".ogex": "model/vnd.opengex", - ".x_b": "model/vnd.parasolid.transmit.binary", - ".xmt_bin": "model/vnd.parasolid.transmit.binary", - ".x_t": "model/vnd.parasolid.transmit.text", - ".xmt_txt": "model/vnd.parasolid.transmit.text", - ".bsp": "model/vnd.valve.source.compiled-map", - ".vtu": "model/vnd.vtu", - ".wrl": "model/vrml", - ".vrml": "model/vrml", - ".x3db": "model/x3d+xml", - ".x3dv": "model/x3d-vrml", - ".x3dvz": "model/x3d-vrml", - ".bmed": "multipart/vnd.bint.med-plus", - ".vpm": "multipart/voice-message", - ".appcache": "text/cache-manifest", - ".manifest": "text/cache-manifest", - ".ics": "text/calendar", - ".ifb": "text/calendar", - ".css": "text/css", - ".csv": "text/csv", - ".csvs": "text/csv-schema", - ".soa": "text/dns", - ".zone": "text/dns", - ".html": "text/html", - ".htm": "text/html", - ".cnd": "text/jcr-cnd", - ".markdown": "text/markdown", - ".md": "text/markdown", - ".miz": "text/mizar", - ".n3": "text/n3", - ".txt": "text/plain", - ".asc": "text/plain", - ".text": "text/plain", - ".pm": "text/plain", - ".el": "text/plain", - ".c": "text/plain", - ".h": "text/plain", - ".cc": "text/plain", - ".hh": "text/plain", - ".cxx": "text/plain", - ".hxx": "text/plain", - ".f90": "text/plain", - ".conf": "text/plain", - ".log": "text/plain", - ".provn": "text/provenance-notation", - ".rst": "text/prs.fallenstein.rst", - ".tag": "text/prs.lines.tag", - ".dsc": "text/prs.lines.tag", - ".rtx": "text/richtext", - ".sgml": "text/sgml", - ".sgm": "text/sgml", - ".tsv": "text/tab-separated-values", - ".t": "text/troff", - ".tr": "text/troff", - ".roff": "text/troff", - ".ttl": "text/turtle", - ".uris": "text/uri-list", - ".uri": "text/uri-list", - ".vcf": "text/vcard", - ".vcard": "text/vcard", - ".a": "text/vnd.a", - ".abc": "text/vnd.abc", - ".ascii": "text/vnd.ascii-art", - ".copyright": "text/vnd.debian.copyright", - ".dms": "text/vnd.DMClientScript", - ".sub": "text/vnd.dvb.subtitle", - ".jtd": "text/vnd.esmertec.theme-descriptor", - ".fly": "text/vnd.fly", - ".flx": "text/vnd.fmi.flexstor", - ".gv": "text/vnd.graphviz", - ".dot": "text/vnd.graphviz", - ".3dml": "text/vnd.in3d.3dml", - ".3dm": "text/vnd.in3d.3dml", - ".spot": "text/vnd.in3d.spot", - ".spo": "text/vnd.in3d.spot", - ".mpf": "text/vnd.ms-mediapackage", - ".ccc": "text/vnd.net2phone.commcenter.command", - ".uric": "text/vnd.si.uricatalogue", - ".jad": "text/vnd.sun.j2me.app-descriptor", - ".ts": "text/vnd.trolltech.linguist", - ".si": "text/vnd.wap.si", - ".sl": "text/vnd.wap.sl", - ".wml": "text/vnd.wap.wml", - ".wmls": "text/vnd.wap.wmlscript", - ".xml": "text/xml", - ".xsd": "text/xml", - ".rng": "text/xml", - ".ent": "text/xml-external-parsed-entity", - ".3gp": "video/3gpp", - ".3gpp": "video/3gpp", - ".3g2": "video/3gpp2", - ".3gpp2": "video/3gpp2", - ".m4s": "video/iso.segment", - ".mj2": "video/mj2", - ".mjp2": "video/mj2", - ".mp4": "video/mp4", - ".mpg4": "video/mp4", - ".m4v": "video/mp4", - ".mpeg": "video/mpeg", - ".mpg": "video/mpeg", - ".mpe": "video/mpeg", - ".m1v": "video/mpeg", - ".m2v": "video/mpeg", - ".ogv": "video/ogg", - ".mov": "video/quicktime", - ".qt": "video/quicktime", - ".uvh": "video/vnd.dece.hd", - ".uvvh": "video/vnd.dece.hd", - ".uvm": "video/vnd.dece.mobile", - ".uvvm": "video/vnd.dece.mobile", - ".uvu": "video/vnd.dece.mp4", - ".uvvu": "video/vnd.dece.mp4", - ".uvp": "video/vnd.dece.pd", - ".uvvp": "video/vnd.dece.pd", - ".uvs": "video/vnd.dece.sd", - ".uvvs": "video/vnd.dece.sd", - ".uvv": "video/vnd.dece.video", - ".uvvv": "video/vnd.dece.video", - ".dvb": "video/vnd.dvb.file", - ".fvt": "video/vnd.fvt", - ".mxu": "video/vnd.mpegurl", - ".m4u": "video/vnd.mpegurl", - ".pyv": "video/vnd.ms-playready.media.pyv", - ".nim": "video/vnd.nokia.interleaved-multimedia", - ".bik": "video/vnd.radgamettools.bink", - ".bk2": "video/vnd.radgamettools.bink", - ".smk": "video/vnd.radgamettools.smacker", - ".smpg": "video/vnd.sealed.mpeg1", - ".s11": "video/vnd.sealed.mpeg1", - ".s14": "video/vnd.sealed.mpeg4", - ".sswf": "video/vnd.sealed.swf", - ".ssw": "video/vnd.sealed.swf", - ".smov": "video/vnd.sealedmedia.softseal.mov", - ".smo": "video/vnd.sealedmedia.softseal.mov", - ".s1q": "video/vnd.sealedmedia.softseal.mov", - ".viv": "video/vnd.vivo", - ".cpt": "application/mac-compactpro", - ".metalink": "application/metalink+xml", - ".owx": "application/owl+xml", - ".rss": "application/rss+xml", - ".apk": "application/vnd.android.package-archive", - ".dd": "application/vnd.oma.dd+xml", - ".dcf": "application/vnd.oma.drm.content", - ".o4a": "application/vnd.oma.drm.dcf", - ".o4v": "application/vnd.oma.drm.dcf", - ".dm": "application/vnd.oma.drm.message", - ".drc": "application/vnd.oma.drm.rights+wbxml", - ".dr": "application/vnd.oma.drm.rights+xml", - ".sxc": "application/vnd.sun.xml.calc", - ".stc": "application/vnd.sun.xml.calc.template", - ".sxd": "application/vnd.sun.xml.draw", - ".std": "application/vnd.sun.xml.draw.template", - ".sxi": "application/vnd.sun.xml.impress", - ".sti": "application/vnd.sun.xml.impress.template", - ".sxm": "application/vnd.sun.xml.math", - ".sxw": "application/vnd.sun.xml.writer", - ".sxg": "application/vnd.sun.xml.writer.global", - ".stw": "application/vnd.sun.xml.writer.template", - ".sis": "application/vnd.symbian.install", - ".mms": "application/vnd.wap.mms-message", - ".anx": "application/x-annodex", - ".bcpio": "application/x-bcpio", - ".torrent": "application/x-bittorrent", - ".bz2": "application/x-bzip2", - ".vcd": "application/x-cdlink", - ".crx": "application/x-chrome-extension", - ".cpio": "application/x-cpio", - ".csh": "application/x-csh", - ".dcr": "application/x-director", - ".dir": "application/x-director", - ".dxr": "application/x-director", - ".dvi": "application/x-dvi", - ".spl": "application/x-futuresplash", - ".gtar": "application/x-gtar", - ".hdf": "application/x-hdf", - ".jar": "application/x-java-archive", - ".jnlp": "application/x-java-jnlp-file", - ".pack": "application/x-java-pack200", - ".kil": "application/x-killustrator", - ".latex": "application/x-latex", - ".nc": "application/x-netcdf", - ".cdf": "application/x-netcdf", - ".pl": "application/x-perl", - ".rpm": "application/x-rpm", - ".sh": "application/x-sh", - ".shar": "application/x-shar", - ".sit": "application/x-stuffit", - ".sv4cpio": "application/x-sv4cpio", - ".sv4crc": "application/x-sv4crc", - ".tar": "application/x-tar", - ".tcl": "application/x-tcl", - ".tex": "application/x-tex", - ".texinfo": "application/x-texinfo", - ".texi": "application/x-texinfo", - ".man": "application/x-troff-man", - ".1": "application/x-troff-man", - ".2": "application/x-troff-man", - ".3": "application/x-troff-man", - ".4": "application/x-troff-man", - ".5": "application/x-troff-man", - ".6": "application/x-troff-man", - ".7": "application/x-troff-man", - ".8": "application/x-troff-man", - ".me": "application/x-troff-me", - ".ms": "application/x-troff-ms", - ".ustar": "application/x-ustar", - ".src": "application/x-wais-source", - ".xpi": "application/x-xpinstall", - ".xspf": "application/x-xspf+xml", - ".xz": "application/x-xz", - ".mid": "audio/midi", - ".midi": "audio/midi", - ".kar": "audio/midi", - ".aif": "audio/x-aiff", - ".aiff": "audio/x-aiff", - ".aifc": "audio/x-aiff", - ".axa": "audio/x-annodex", - ".flac": "audio/x-flac", - ".mka": "audio/x-matroska", - ".mod": "audio/x-mod", - ".ult": "audio/x-mod", - ".uni": "audio/x-mod", - ".m15": "audio/x-mod", - ".mtm": "audio/x-mod", - ".669": "audio/x-mod", - ".med": "audio/x-mod", - ".m3u": "audio/x-mpegurl", - ".wax": "audio/x-ms-wax", - ".wma": "audio/x-ms-wma", - ".ram": "audio/x-pn-realaudio", - ".rm": "audio/x-pn-realaudio", - ".ra": "audio/x-realaudio", - ".s3m": "audio/x-s3m", - ".stm": "audio/x-stm", - ".wav": "audio/x-wav", - ".xyz": "chemical/x-xyz", - ".webp": "image/webp", - ".ras": "image/x-cmu-raster", - ".pnm": "image/x-portable-anymap", - ".pbm": "image/x-portable-bitmap", - ".pgm": "image/x-portable-graymap", - ".ppm": "image/x-portable-pixmap", - ".rgb": "image/x-rgb", - ".tga": "image/x-targa", - ".xbm": "image/x-xbitmap", - ".xpm": "image/x-xpixmap", - ".xwd": "image/x-xwindowdump", - ".sandboxed": "text/html-sandboxed", - ".pod": "text/x-pod", - ".etx": "text/x-setext", - ".webm": "video/webm", - ".axv": "video/x-annodex", - ".flv": "video/x-flv", - ".fxm": "video/x-javafx", - ".mkv": "video/x-matroska", - ".mk3d": "video/x-matroska-3d", - ".asx": "video/x-ms-asf", - ".wm": "video/x-ms-wm", - ".wmv": "video/x-ms-wmv", - ".wmx": "video/x-ms-wmx", - ".wvx": "video/x-ms-wvx", - ".avi": "video/x-msvideo", - ".movie": "video/x-sgi-movie", - ".ice": "x-conference/x-cooltalk", - ".sisx": "x-epoc/x-sisx-app", - } - for ext, name := range mimeTypes { - if err := mime.AddExtensionType(ext, name); err != nil { - panic(err) - } - } -} diff --git a/swarm/api/http/middleware.go b/swarm/api/http/middleware.go deleted file mode 100644 index 3b2dcc7d5986..000000000000 --- a/swarm/api/http/middleware.go +++ /dev/null @@ -1,105 +0,0 @@ -package http - -import ( - "fmt" - "net/http" - "runtime/debug" - "strings" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/sctx" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/pborman/uuid" -) - -// Adapt chains h (main request handler) main handler to adapters (middleware handlers) -// Please note that the order of execution for `adapters` is FIFO (adapters[0] will be executed first) -func Adapt(h http.Handler, adapters ...Adapter) http.Handler { - for i := range adapters { - adapter := adapters[len(adapters)-1-i] - h = adapter(h) - } - return h -} - -type Adapter func(http.Handler) http.Handler - -func SetRequestID(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - r = r.WithContext(SetRUID(r.Context(), uuid.New()[:8])) - metrics.GetOrRegisterCounter(fmt.Sprintf("http.request.%s", r.Method), nil).Inc(1) - log.Info("created ruid for request", "ruid", GetRUID(r.Context()), "method", r.Method, "url", r.RequestURI) - - h.ServeHTTP(w, r) - }) -} - -func SetRequestHost(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - r = r.WithContext(sctx.SetHost(r.Context(), r.Host)) - log.Info("setting request host", "ruid", GetRUID(r.Context()), "host", sctx.GetHost(r.Context())) - - h.ServeHTTP(w, r) - }) -} - -func ParseURI(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - uri, err := api.Parse(strings.TrimLeft(r.URL.Path, "/")) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - RespondError(w, r, fmt.Sprintf("invalid URI %q", r.URL.Path), http.StatusBadRequest) - return - } - if uri.Addr != "" && strings.HasPrefix(uri.Addr, "0x") { - uri.Addr = strings.TrimPrefix(uri.Addr, "0x") - - msg := fmt.Sprintf(`The requested hash seems to be prefixed with '0x'. You will be redirected to the correct URL within 5 seconds.
- Please click here if your browser does not redirect you within 5 seconds.`, "/"+uri.String()) - w.WriteHeader(http.StatusNotFound) - w.Write([]byte(msg)) - return - } - - ctx := r.Context() - r = r.WithContext(SetURI(ctx, uri)) - log.Debug("parsed request path", "ruid", GetRUID(r.Context()), "method", r.Method, "uri.Addr", uri.Addr, "uri.Path", uri.Path, "uri.Scheme", uri.Scheme) - - h.ServeHTTP(w, r) - }) -} - -func InitLoggingResponseWriter(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - writer := newLoggingResponseWriter(w) - h.ServeHTTP(writer, r) - log.Debug("request served", "ruid", GetRUID(r.Context()), "code", writer.statusCode) - }) -} - -func InstrumentOpenTracing(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - uri := GetURI(r.Context()) - if uri == nil || r.Method == "" || (uri != nil && uri.Scheme == "") { - h.ServeHTTP(w, r) // soft fail - return - } - spanName := fmt.Sprintf("http.%s.%s", r.Method, uri.Scheme) - ctx, sp := spancontext.StartSpan(r.Context(), spanName) - defer sp.Finish() - h.ServeHTTP(w, r.WithContext(ctx)) - }) -} - -func RecoverPanic(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer func() { - if err := recover(); err != nil { - log.Error("panic recovery!", "stack trace", string(debug.Stack()), "url", r.URL.String(), "headers", r.Header) - } - }() - h.ServeHTTP(w, r) - }) -} diff --git a/swarm/api/http/response.go b/swarm/api/http/response.go deleted file mode 100644 index c9fb9d2855b8..000000000000 --- a/swarm/api/http/response.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "encoding/json" - "fmt" - "html/template" - "net/http" - "strings" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/api" -) - -var ( - htmlCounter = metrics.NewRegisteredCounter("api.http.errorpage.html.count", nil) - jsonCounter = metrics.NewRegisteredCounter("api.http.errorpage.json.count", nil) - plaintextCounter = metrics.NewRegisteredCounter("api.http.errorpage.plaintext.count", nil) -) - -type ResponseParams struct { - Msg template.HTML - Code int - Timestamp string - template *template.Template - Details template.HTML -} - -// ShowMultipleChoices is used when a user requests a resource in a manifest which results -// in ambiguous results. It returns a HTML page with clickable links of each of the entry -// in the manifest which fits the request URI ambiguity. -// For example, if the user requests bzz://read and that manifest contains entries -// "readme.md" and "readinglist.txt", a HTML page is returned with this two links. -// This only applies if the manifest has no default entry -func ShowMultipleChoices(w http.ResponseWriter, r *http.Request, list api.ManifestList) { - log.Debug("ShowMultipleChoices", "ruid", GetRUID(r.Context()), "uri", GetURI(r.Context())) - msg := "" - if list.Entries == nil { - RespondError(w, r, "Could not resolve", http.StatusInternalServerError) - return - } - requestUri := strings.TrimPrefix(r.RequestURI, "/") - - uri, err := api.Parse(requestUri) - if err != nil { - RespondError(w, r, "Bad Request", http.StatusBadRequest) - } - - uri.Scheme = "bzz-list" - msg += fmt.Sprintf("Disambiguation:
Your request may refer to multiple choices.
Click here if your browser does not redirect you within 5 seconds.
", "/"+uri.String()) - RespondTemplate(w, r, "error", msg, http.StatusMultipleChoices) -} - -func RespondTemplate(w http.ResponseWriter, r *http.Request, templateName, msg string, code int) { - log.Debug("RespondTemplate", "ruid", GetRUID(r.Context()), "uri", GetURI(r.Context())) - respond(w, r, &ResponseParams{ - Code: code, - Msg: template.HTML(msg), - Timestamp: time.Now().Format(time.RFC1123), - template: TemplatesMap[templateName], - }) -} - -func RespondError(w http.ResponseWriter, r *http.Request, msg string, code int) { - log.Debug("RespondError", "ruid", GetRUID(r.Context()), "uri", GetURI(r.Context()), "code", code) - RespondTemplate(w, r, "error", msg, code) -} - -func respond(w http.ResponseWriter, r *http.Request, params *ResponseParams) { - - w.WriteHeader(params.Code) - - if params.Code >= 400 { - w.Header().Del("Cache-Control") - w.Header().Del("ETag") - } - - acceptHeader := r.Header.Get("Accept") - // this cannot be in a switch since an Accept header can have multiple values: "Accept: */*, text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8" - if strings.Contains(acceptHeader, "application/json") { - if err := respondJSON(w, r, params); err != nil { - RespondError(w, r, "Internal server error", http.StatusInternalServerError) - } - } else if strings.Contains(acceptHeader, "text/html") { - respondHTML(w, r, params) - } else { - respondPlaintext(w, r, params) //returns nice errors for curl - } -} - -func respondHTML(w http.ResponseWriter, r *http.Request, params *ResponseParams) { - htmlCounter.Inc(1) - log.Debug("respondHTML", "ruid", GetRUID(r.Context())) - err := params.template.Execute(w, params) - if err != nil { - log.Error(err.Error()) - } -} - -func respondJSON(w http.ResponseWriter, r *http.Request, params *ResponseParams) error { - jsonCounter.Inc(1) - log.Debug("respondJSON", "ruid", GetRUID(r.Context())) - w.Header().Set("Content-Type", "application/json") - return json.NewEncoder(w).Encode(params) -} - -func respondPlaintext(w http.ResponseWriter, r *http.Request, params *ResponseParams) error { - plaintextCounter.Inc(1) - log.Debug("respondPlaintext", "ruid", GetRUID(r.Context())) - w.Header().Set("Content-Type", "text/plain") - strToWrite := "Code: " + fmt.Sprintf("%d", params.Code) + "\n" - strToWrite += "Message: " + string(params.Msg) + "\n" - strToWrite += "Timestamp: " + params.Timestamp + "\n" - _, err := w.Write([]byte(strToWrite)) - return err -} diff --git a/swarm/api/http/response_test.go b/swarm/api/http/response_test.go deleted file mode 100644 index 50a704be6d0f..000000000000 --- a/swarm/api/http/response_test.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "encoding/json" - "io/ioutil" - "net/http" - "strings" - "testing" - - "golang.org/x/net/html" - - "github.com/ethereum/go-ethereum/swarm/testutil" -) - -func TestError(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - var resp *http.Response - var respbody []byte - - url := srv.URL + "/this_should_fail_as_no_bzz_protocol_present" - resp, err := http.Get(url) - - if err != nil { - t.Fatalf("Request failed: %v", err) - } - defer resp.Body.Close() - respbody, err = ioutil.ReadAll(resp.Body) - - if resp.StatusCode != 404 && !strings.Contains(string(respbody), "Invalid URI "/this_should_fail_as_no_bzz_protocol_present": unknown scheme") { - t.Fatalf("Response body does not match, expected: %v, to contain: %v; received code %d, expected code: %d", string(respbody), "Invalid bzz URI: unknown scheme", 400, resp.StatusCode) - } - - _, err = html.Parse(strings.NewReader(string(respbody))) - if err != nil { - t.Fatalf("HTML validation failed for error page returned!") - } -} - -func Test404Page(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - var resp *http.Response - var respbody []byte - - url := srv.URL + "/bzz:/1234567890123456789012345678901234567890123456789012345678901234" - resp, err := http.Get(url) - - if err != nil { - t.Fatalf("Request failed: %v", err) - } - defer resp.Body.Close() - respbody, err = ioutil.ReadAll(resp.Body) - - if resp.StatusCode != 404 || !strings.Contains(string(respbody), "404") { - t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode) - } - - _, err = html.Parse(strings.NewReader(string(respbody))) - if err != nil { - t.Fatalf("HTML validation failed for error page returned!") - } -} - -func Test500Page(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - var resp *http.Response - var respbody []byte - - url := srv.URL + "/bzz:/thisShouldFailWith500Code" - resp, err := http.Get(url) - - if err != nil { - t.Fatalf("Request failed: %v", err) - } - defer resp.Body.Close() - respbody, err = ioutil.ReadAll(resp.Body) - - if resp.StatusCode != 404 { - t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode) - } - - _, err = html.Parse(strings.NewReader(string(respbody))) - if err != nil { - t.Fatalf("HTML validation failed for error page returned!") - } -} -func Test500PageWith0xHashPrefix(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - var resp *http.Response - var respbody []byte - - url := srv.URL + "/bzz:/0xthisShouldFailWith500CodeAndAHelpfulMessage" - resp, err := http.Get(url) - - if err != nil { - t.Fatalf("Request failed: %v", err) - } - defer resp.Body.Close() - respbody, err = ioutil.ReadAll(resp.Body) - - if resp.StatusCode != 404 { - t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode) - } - - if !strings.Contains(string(respbody), "The requested hash seems to be prefixed with") { - t.Fatalf("Did not receive the expected error message") - } - - _, err = html.Parse(strings.NewReader(string(respbody))) - if err != nil { - t.Fatalf("HTML validation failed for error page returned!") - } -} - -func TestJsonResponse(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - var resp *http.Response - var respbody []byte - - url := srv.URL + "/bzz:/thisShouldFailWith500Code/" - req, err := http.NewRequest("GET", url, nil) - if err != nil { - t.Fatalf("Request failed: %v", err) - } - req.Header.Set("Accept", "application/json") - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("Request failed: %v", err) - } - - defer resp.Body.Close() - respbody, err = ioutil.ReadAll(resp.Body) - - if resp.StatusCode != 404 { - t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode) - } - - if !isJSON(string(respbody)) { - t.Fatalf("Expected response to be JSON, received invalid JSON: %s", string(respbody)) - } - -} - -func isJSON(s string) bool { - var js map[string]interface{} - return json.Unmarshal([]byte(s), &js) == nil -} diff --git a/swarm/api/http/roundtripper.go b/swarm/api/http/roundtripper.go deleted file mode 100644 index be8ea39856eb..000000000000 --- a/swarm/api/http/roundtripper.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "fmt" - "net/http" - - "github.com/ethereum/go-ethereum/swarm/log" -) - -/* -http roundtripper to register for bzz url scheme -see https://github.com/ethereum/go-ethereum/issues/2040 -Usage: - -import ( - "github.com/ethereum/go-ethereum/common/httpclient" - "github.com/ethereum/go-ethereum/swarm/api/http" -) -client := httpclient.New() -// for (private) swarm proxy running locally -client.RegisterScheme("bzz", &http.RoundTripper{Port: port}) -client.RegisterScheme("bzz-immutable", &http.RoundTripper{Port: port}) -client.RegisterScheme("bzz-raw", &http.RoundTripper{Port: port}) - -The port you give the Roundtripper is the port the swarm proxy is listening on. -If Host is left empty, localhost is assumed. - -Using a public gateway, the above few lines gives you the leanest -bzz-scheme aware read-only http client. You really only ever need this -if you need go-native swarm access to bzz addresses. -*/ - -type RoundTripper struct { - Host string - Port string -} - -func (self *RoundTripper) RoundTrip(req *http.Request) (resp *http.Response, err error) { - host := self.Host - if len(host) == 0 { - host = "localhost" - } - url := fmt.Sprintf("http://%s:%s/%s:/%s/%s", host, self.Port, req.Proto, req.URL.Host, req.URL.Path) - log.Info(fmt.Sprintf("roundtripper: proxying request '%s' to '%s'", req.RequestURI, url)) - reqProxy, err := http.NewRequest(req.Method, url, req.Body) - if err != nil { - return nil, err - } - return http.DefaultClient.Do(reqProxy) -} diff --git a/swarm/api/http/roundtripper_test.go b/swarm/api/http/roundtripper_test.go deleted file mode 100644 index f99c4f35e058..000000000000 --- a/swarm/api/http/roundtripper_test.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "strings" - "testing" - "time" -) - -func TestRoundTripper(t *testing.T) { - serveMux := http.NewServeMux() - serveMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - if r.Method == "GET" { - w.Header().Set("Content-Type", "text/plain") - http.ServeContent(w, r, "", time.Unix(0, 0), strings.NewReader(r.RequestURI)) - } else { - http.Error(w, "Method "+r.Method+" is not supported.", http.StatusMethodNotAllowed) - } - }) - - srv := httptest.NewServer(serveMux) - defer srv.Close() - - host, port, _ := net.SplitHostPort(srv.Listener.Addr().String()) - rt := &RoundTripper{Host: host, Port: port} - trans := &http.Transport{} - trans.RegisterProtocol("bzz", rt) - client := &http.Client{Transport: trans} - resp, err := client.Get("bzz://test.com/path") - if err != nil { - t.Errorf("expected no error, got %v", err) - return - } - - defer func() { - if resp != nil { - resp.Body.Close() - } - }() - - content, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Errorf("expected no error, got %v", err) - return - } - if string(content) != "/HTTP/1.1:/test.com/path" { - t.Errorf("incorrect response from http server: expected '%v', got '%v'", "/HTTP/1.1:/test.com/path", string(content)) - } - -} diff --git a/swarm/api/http/sctx.go b/swarm/api/http/sctx.go deleted file mode 100644 index 431e11735409..000000000000 --- a/swarm/api/http/sctx.go +++ /dev/null @@ -1,38 +0,0 @@ -package http - -import ( - "context" - - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/sctx" -) - -type contextKey int - -const ( - uriKey contextKey = iota -) - -func GetRUID(ctx context.Context) string { - v, ok := ctx.Value(sctx.HTTPRequestIDKey).(string) - if ok { - return v - } - return "xxxxxxxx" -} - -func SetRUID(ctx context.Context, ruid string) context.Context { - return context.WithValue(ctx, sctx.HTTPRequestIDKey, ruid) -} - -func GetURI(ctx context.Context) *api.URI { - v, ok := ctx.Value(uriKey).(*api.URI) - if ok { - return v - } - return nil -} - -func SetURI(ctx context.Context, uri *api.URI) context.Context { - return context.WithValue(ctx, uriKey, uri) -} diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go deleted file mode 100644 index 5ec69373d368..000000000000 --- a/swarm/api/http/server.go +++ /dev/null @@ -1,918 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -/* -A simple http server interface to Swarm -*/ -package http - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "mime" - "mime/multipart" - "net/http" - "os" - "path" - "regexp" - "strconv" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru" - - "github.com/rs/cors" -) - -type resourceResponse struct { - Manifest storage.Address `json:"manifest"` - Resource string `json:"resource"` - Update storage.Address `json:"update"` -} - -var ( - postRawCount = metrics.NewRegisteredCounter("api.http.post.raw.count", nil) - postRawFail = metrics.NewRegisteredCounter("api.http.post.raw.fail", nil) - postFilesCount = metrics.NewRegisteredCounter("api.http.post.files.count", nil) - postFilesFail = metrics.NewRegisteredCounter("api.http.post.files.fail", nil) - deleteCount = metrics.NewRegisteredCounter("api.http.delete.count", nil) - deleteFail = metrics.NewRegisteredCounter("api.http.delete.fail", nil) - getCount = metrics.NewRegisteredCounter("api.http.get.count", nil) - getFail = metrics.NewRegisteredCounter("api.http.get.fail", nil) - getFileCount = metrics.NewRegisteredCounter("api.http.get.file.count", nil) - getFileNotFound = metrics.NewRegisteredCounter("api.http.get.file.notfound", nil) - getFileFail = metrics.NewRegisteredCounter("api.http.get.file.fail", nil) - getListCount = metrics.NewRegisteredCounter("api.http.get.list.count", nil) - getListFail = metrics.NewRegisteredCounter("api.http.get.list.fail", nil) -) - -type methodHandler map[string]http.Handler - -func (m methodHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - v, ok := m[r.Method] - if ok { - v.ServeHTTP(rw, r) - return - } - rw.WriteHeader(http.StatusMethodNotAllowed) -} - -func NewServer(api *api.API, corsString string) *Server { - var allowedOrigins []string - for _, domain := range strings.Split(corsString, ",") { - allowedOrigins = append(allowedOrigins, strings.TrimSpace(domain)) - } - c := cors.New(cors.Options{ - AllowedOrigins: allowedOrigins, - AllowedMethods: []string{http.MethodPost, http.MethodGet, http.MethodDelete, http.MethodPatch, http.MethodPut}, - MaxAge: 600, - AllowedHeaders: []string{"*"}, - }) - - server := &Server{api: api} - - defaultMiddlewares := []Adapter{ - RecoverPanic, - SetRequestID, - SetRequestHost, - InitLoggingResponseWriter, - ParseURI, - InstrumentOpenTracing, - } - - mux := http.NewServeMux() - mux.Handle("/bzz:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleBzzGet), - defaultMiddlewares..., - ), - "POST": Adapt( - http.HandlerFunc(server.HandlePostFiles), - defaultMiddlewares..., - ), - "DELETE": Adapt( - http.HandlerFunc(server.HandleDelete), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-raw:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleGet), - defaultMiddlewares..., - ), - "POST": Adapt( - http.HandlerFunc(server.HandlePostRaw), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-immutable:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleBzzGet), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-hash:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleGet), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-list:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleGetList), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-resource:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleGetResource), - defaultMiddlewares..., - ), - "POST": Adapt( - http.HandlerFunc(server.HandlePostResource), - defaultMiddlewares..., - ), - }) - - mux.Handle("/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleRootPaths), - SetRequestID, - InitLoggingResponseWriter, - ), - }) - server.Handler = c.Handler(mux) - - return server -} - -func (s *Server) ListenAndServe(addr string) error { - s.listenAddr = addr - return http.ListenAndServe(addr, s) -} - -// browser API for registering bzz url scheme handlers: -// https://developer.mozilla.org/en/docs/Web-based_protocol_handlers -// electron (chromium) api for registering bzz url scheme handlers: -// https://github.com/atom/electron/blob/master/docs/api/protocol.md -type Server struct { - http.Handler - api *api.API - listenAddr string -} - -func (s *Server) HandleBzzGet(w http.ResponseWriter, r *http.Request) { - log.Debug("handleBzzGet", "ruid", GetRUID(r.Context()), "uri", r.RequestURI) - if r.Header.Get("Accept") == "application/x-tar" { - uri := GetURI(r.Context()) - _, credentials, _ := r.BasicAuth() - reader, err := s.api.GetDirectoryTar(r.Context(), s.api.Decryptor(r.Context(), credentials), uri) - if err != nil { - if isDecryptError(err) { - w.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", uri.Address().String())) - RespondError(w, r, err.Error(), http.StatusUnauthorized) - return - } - RespondError(w, r, fmt.Sprintf("Had an error building the tarball: %v", err), http.StatusInternalServerError) - return - } - defer reader.Close() - - w.Header().Set("Content-Type", "application/x-tar") - - fileName := uri.Addr - if found := path.Base(uri.Path); found != "" && found != "." && found != "/" { - fileName = found - } - w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename=\"%s.tar\"", fileName)) - - w.WriteHeader(http.StatusOK) - io.Copy(w, reader) - return - } - - s.HandleGetFile(w, r) -} - -func (s *Server) HandleRootPaths(w http.ResponseWriter, r *http.Request) { - switch r.RequestURI { - case "/": - RespondTemplate(w, r, "landing-page", "Swarm: Please request a valid ENS or swarm hash with the appropriate bzz scheme", 200) - return - case "/robots.txt": - w.Header().Set("Last-Modified", time.Now().Format(http.TimeFormat)) - fmt.Fprintf(w, "User-agent: *\nDisallow: /") - case "/favicon.ico": - w.WriteHeader(http.StatusOK) - w.Write(faviconBytes) - default: - RespondError(w, r, "Not Found", http.StatusNotFound) - } -} - -// HandlePostRaw handles a POST request to a raw bzz-raw:/ URI, stores the request -// body in swarm and returns the resulting storage address as a text/plain response -func (s *Server) HandlePostRaw(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - log.Debug("handle.post.raw", "ruid", ruid) - - postRawCount.Inc(1) - - toEncrypt := false - uri := GetURI(r.Context()) - if uri.Addr == "encrypt" { - toEncrypt = true - } - - if uri.Path != "" { - postRawFail.Inc(1) - RespondError(w, r, "raw POST request cannot contain a path", http.StatusBadRequest) - return - } - - if uri.Addr != "" && uri.Addr != "encrypt" { - postRawFail.Inc(1) - RespondError(w, r, "raw POST request addr can only be empty or \"encrypt\"", http.StatusBadRequest) - return - } - - if r.Header.Get("Content-Length") == "" { - postRawFail.Inc(1) - RespondError(w, r, "missing Content-Length header in request", http.StatusBadRequest) - return - } - - addr, _, err := s.api.Store(r.Context(), r.Body, r.ContentLength, toEncrypt) - if err != nil { - postRawFail.Inc(1) - RespondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - - log.Debug("stored content", "ruid", ruid, "key", addr) - - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, addr) -} - -// HandlePostFiles handles a POST request to -// bzz:// which contains either a single file or multiple files -// (either a tar archive or multipart form), adds those files either to an -// existing manifest or to a new manifest under and returns the -// resulting manifest hash as a text/plain response -func (s *Server) HandlePostFiles(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - log.Debug("handle.post.files", "ruid", ruid) - postFilesCount.Inc(1) - - contentType, params, err := mime.ParseMediaType(r.Header.Get("Content-Type")) - if err != nil { - postFilesFail.Inc(1) - RespondError(w, r, err.Error(), http.StatusBadRequest) - return - } - - toEncrypt := false - uri := GetURI(r.Context()) - if uri.Addr == "encrypt" { - toEncrypt = true - } - - var addr storage.Address - if uri.Addr != "" && uri.Addr != "encrypt" { - addr, err = s.api.Resolve(r.Context(), uri.Addr) - if err != nil { - postFilesFail.Inc(1) - RespondError(w, r, fmt.Sprintf("cannot resolve %s: %s", uri.Addr, err), http.StatusInternalServerError) - return - } - log.Debug("resolved key", "ruid", ruid, "key", addr) - } else { - addr, err = s.api.NewManifest(r.Context(), toEncrypt) - if err != nil { - postFilesFail.Inc(1) - RespondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - log.Debug("new manifest", "ruid", ruid, "key", addr) - } - - newAddr, err := s.api.UpdateManifest(r.Context(), addr, func(mw *api.ManifestWriter) error { - switch contentType { - case "application/x-tar": - _, err := s.handleTarUpload(r, mw) - if err != nil { - RespondError(w, r, fmt.Sprintf("error uploading tarball: %v", err), http.StatusInternalServerError) - return err - } - return nil - case "multipart/form-data": - return s.handleMultipartUpload(r, params["boundary"], mw) - - default: - return s.handleDirectUpload(r, mw) - } - }) - if err != nil { - postFilesFail.Inc(1) - RespondError(w, r, fmt.Sprintf("cannot create manifest: %s", err), http.StatusInternalServerError) - return - } - - log.Debug("stored content", "ruid", ruid, "key", newAddr) - - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, newAddr) -} - -func (s *Server) handleTarUpload(r *http.Request, mw *api.ManifestWriter) (storage.Address, error) { - log.Debug("handle.tar.upload", "ruid", GetRUID(r.Context())) - - defaultPath := r.URL.Query().Get("defaultpath") - - key, err := s.api.UploadTar(r.Context(), r.Body, GetURI(r.Context()).Path, defaultPath, mw) - if err != nil { - return nil, err - } - return key, nil -} - -func (s *Server) handleMultipartUpload(r *http.Request, boundary string, mw *api.ManifestWriter) error { - ruid := GetRUID(r.Context()) - log.Debug("handle.multipart.upload", "ruid", ruid) - mr := multipart.NewReader(r.Body, boundary) - for { - part, err := mr.NextPart() - if err == io.EOF { - return nil - } else if err != nil { - return fmt.Errorf("error reading multipart form: %s", err) - } - - var size int64 - var reader io.Reader = part - if contentLength := part.Header.Get("Content-Length"); contentLength != "" { - size, err = strconv.ParseInt(contentLength, 10, 64) - if err != nil { - return fmt.Errorf("error parsing multipart content length: %s", err) - } - reader = part - } else { - // copy the part to a tmp file to get its size - tmp, err := ioutil.TempFile("", "swarm-multipart") - if err != nil { - return err - } - defer os.Remove(tmp.Name()) - defer tmp.Close() - size, err = io.Copy(tmp, part) - if err != nil { - return fmt.Errorf("error copying multipart content: %s", err) - } - if _, err := tmp.Seek(0, io.SeekStart); err != nil { - return fmt.Errorf("error copying multipart content: %s", err) - } - reader = tmp - } - - // add the entry under the path from the request - name := part.FileName() - if name == "" { - name = part.FormName() - } - uri := GetURI(r.Context()) - path := path.Join(uri.Path, name) - entry := &api.ManifestEntry{ - Path: path, - ContentType: part.Header.Get("Content-Type"), - Size: size, - ModTime: time.Now(), - } - log.Debug("adding path to new manifest", "ruid", ruid, "bytes", entry.Size, "path", entry.Path) - contentKey, err := mw.AddEntry(r.Context(), reader, entry) - if err != nil { - return fmt.Errorf("error adding manifest entry from multipart form: %s", err) - } - log.Debug("stored content", "ruid", ruid, "key", contentKey) - } -} - -func (s *Server) handleDirectUpload(r *http.Request, mw *api.ManifestWriter) error { - ruid := GetRUID(r.Context()) - log.Debug("handle.direct.upload", "ruid", ruid) - key, err := mw.AddEntry(r.Context(), r.Body, &api.ManifestEntry{ - Path: GetURI(r.Context()).Path, - ContentType: r.Header.Get("Content-Type"), - Mode: 0644, - Size: r.ContentLength, - ModTime: time.Now(), - }) - if err != nil { - return err - } - log.Debug("stored content", "ruid", ruid, "key", key) - return nil -} - -// HandleDelete handles a DELETE request to bzz://, removes -// from and returns the resulting manifest hash as a -// text/plain response -func (s *Server) HandleDelete(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - log.Debug("handle.delete", "ruid", ruid) - deleteCount.Inc(1) - newKey, err := s.api.Delete(r.Context(), uri.Addr, uri.Path) - if err != nil { - deleteFail.Inc(1) - RespondError(w, r, fmt.Sprintf("could not delete from manifest: %v", err), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, newKey) -} - -// Parses a resource update post url to corresponding action -// possible combinations: -// / add multihash update to existing hash -// /raw add raw update to existing hash -// /# create new resource with first update as mulitihash -// /raw/# create new resource with first update raw -func resourcePostMode(path string) (isRaw bool, frequency uint64, err error) { - re, err := regexp.Compile("^(raw)?/?([0-9]+)?$") - if err != nil { - return isRaw, frequency, err - } - m := re.FindAllStringSubmatch(path, 2) - var freqstr = "0" - if len(m) > 0 { - if m[0][1] != "" { - isRaw = true - } - if m[0][2] != "" { - freqstr = m[0][2] - } - } else if len(path) > 0 { - return isRaw, frequency, fmt.Errorf("invalid path") - } - frequency, err = strconv.ParseUint(freqstr, 10, 64) - return isRaw, frequency, err -} - -// Handles creation of new mutable resources and adding updates to existing mutable resources -// There are two types of updates available, "raw" and "multihash." -// If the latter is used, a subsequent bzz:// GET call to the manifest of the resource will return -// the page that the multihash is pointing to, as if it held a normal swarm content manifest -// -// The POST request admits a JSON structure as defined in the mru package: `mru.updateRequestJSON` -// The requests can be to a) create a resource, b) update a resource or c) both a+b: create a resource and set the initial content -func (s *Server) HandlePostResource(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - log.Debug("handle.post.resource", "ruid", ruid) - var err error - - // Creation and update must send mru.updateRequestJSON JSON structure - body, err := ioutil.ReadAll(r.Body) - if err != nil { - RespondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - - view, err := s.api.ResolveResourceView(r.Context(), uri, r.URL.Query()) - if err != nil { // couldn't parse query string or retrieve manifest - getFail.Inc(1) - httpStatus := http.StatusBadRequest - if err == api.ErrCannotLoadResourceManifest || err == api.ErrCannotResolveResourceURI { - httpStatus = http.StatusNotFound - } - RespondError(w, r, fmt.Sprintf("cannot retrieve resource view: %s", err), httpStatus) - return - } - - var updateRequest mru.Request - updateRequest.View = *view - query := r.URL.Query() - - if err := updateRequest.FromValues(query, body); err != nil { // decodes request from query parameters - RespondError(w, r, err.Error(), http.StatusBadRequest) - return - } - - if updateRequest.IsUpdate() { - // Verify that the signature is intact and that the signer is authorized - // to update this resource - // Check this early, to avoid creating a resource and then not being able to set its first update. - if err = updateRequest.Verify(); err != nil { - RespondError(w, r, err.Error(), http.StatusForbidden) - return - } - _, err = s.api.ResourceUpdate(r.Context(), &updateRequest) - if err != nil { - RespondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - } - - if query.Get("manifest") == "1" { - // we create a manifest so we can retrieve the resource with bzz:// later - // this manifest has a special "resource type" manifest, and saves the - // resource view ID used to retrieve the resource later - m, err := s.api.NewResourceManifest(r.Context(), &updateRequest.View) - if err != nil { - RespondError(w, r, fmt.Sprintf("failed to create resource manifest: %v", err), http.StatusInternalServerError) - return - } - // the key to the manifest will be passed back to the client - // the client can access the view directly through its resourceView member - // the manifest key can be set as content in the resolver of the ENS name - outdata, err := json.Marshal(m) - if err != nil { - RespondError(w, r, fmt.Sprintf("failed to create json response: %s", err), http.StatusInternalServerError) - return - } - fmt.Fprint(w, string(outdata)) - - w.Header().Add("Content-type", "application/json") - } -} - -// Retrieve mutable resource updates: -// bzz-resource:// - get latest update -// bzz-resource:///?period=n - get latest update on period n -// bzz-resource:///?period=n&version=m - get update version m of period n -// bzz-resource:///meta - get metadata and next version information -// = ens name or hash -// TODO: Enable pass maxPeriod parameter -func (s *Server) HandleGetResource(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - log.Debug("handle.get.resource", "ruid", ruid) - var err error - - view, err := s.api.ResolveResourceView(r.Context(), uri, r.URL.Query()) - if err != nil { // couldn't parse query string or retrieve manifest - getFail.Inc(1) - httpStatus := http.StatusBadRequest - if err == api.ErrCannotLoadResourceManifest || err == api.ErrCannotResolveResourceURI { - httpStatus = http.StatusNotFound - } - RespondError(w, r, fmt.Sprintf("cannot retrieve resource view: %s", err), httpStatus) - return - } - - // determine if the query specifies period and version or it is a metadata query - if r.URL.Query().Get("meta") == "1" { - unsignedUpdateRequest, err := s.api.ResourceNewRequest(r.Context(), view) - if err != nil { - getFail.Inc(1) - RespondError(w, r, fmt.Sprintf("cannot retrieve resource metadata for view=%s: %s", view.Hex(), err), http.StatusNotFound) - return - } - rawResponse, err := unsignedUpdateRequest.MarshalJSON() - if err != nil { - RespondError(w, r, fmt.Sprintf("cannot encode unsigned UpdateRequest: %v", err), http.StatusInternalServerError) - return - } - w.Header().Add("Content-type", "application/json") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, string(rawResponse)) - return - } - - lookupParams := &mru.Query{View: *view} - if err = lookupParams.FromValues(r.URL.Query()); err != nil { // parse period, version - RespondError(w, r, fmt.Sprintf("invalid mutable resource request:%s", err), http.StatusBadRequest) - return - } - - data, err := s.api.ResourceLookup(r.Context(), lookupParams) - - // any error from the switch statement will end up here - if err != nil { - code, err2 := s.translateResourceError(w, r, "mutable resource lookup fail", err) - RespondError(w, r, err2.Error(), code) - return - } - - // All ok, serve the retrieved update - log.Debug("Found update", "view", view.Hex(), "ruid", ruid) - w.Header().Set("Content-Type", api.MimeOctetStream) - http.ServeContent(w, r, "", time.Now(), bytes.NewReader(data)) -} - -func (s *Server) translateResourceError(w http.ResponseWriter, r *http.Request, supErr string, err error) (int, error) { - code := 0 - defaultErr := fmt.Errorf("%s: %v", supErr, err) - rsrcErr, ok := err.(*mru.Error) - if !ok && rsrcErr != nil { - code = rsrcErr.Code() - } - switch code { - case storage.ErrInvalidValue: - return http.StatusBadRequest, defaultErr - case storage.ErrNotFound, storage.ErrNotSynced, storage.ErrNothingToReturn, storage.ErrInit: - return http.StatusNotFound, defaultErr - case storage.ErrUnauthorized, storage.ErrInvalidSignature: - return http.StatusUnauthorized, defaultErr - case storage.ErrDataOverflow: - return http.StatusRequestEntityTooLarge, defaultErr - } - - return http.StatusInternalServerError, defaultErr -} - -// HandleGet handles a GET request to -// - bzz-raw:// and responds with the raw content stored at the -// given storage key -// - bzz-hash:// and responds with the hash of the content stored -// at the given storage key as a text/plain response -func (s *Server) HandleGet(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - log.Debug("handle.get", "ruid", ruid, "uri", uri) - getCount.Inc(1) - _, pass, _ := r.BasicAuth() - - addr, err := s.api.ResolveURI(r.Context(), uri, pass) - if err != nil { - getFail.Inc(1) - RespondError(w, r, fmt.Sprintf("cannot resolve %s: %s", uri.Addr, err), http.StatusNotFound) - return - } - w.Header().Set("Cache-Control", "max-age=2147483648, immutable") // url was of type bzz:///path, so we are sure it is immutable. - - log.Debug("handle.get: resolved", "ruid", ruid, "key", addr) - - // if path is set, interpret as a manifest and return the - // raw entry at the given path - - etag := common.Bytes2Hex(addr) - noneMatchEtag := r.Header.Get("If-None-Match") - w.Header().Set("ETag", fmt.Sprintf("%q", etag)) // set etag to manifest key or raw entry key. - if noneMatchEtag != "" { - if bytes.Equal(storage.Address(common.Hex2Bytes(noneMatchEtag)), addr) { - w.WriteHeader(http.StatusNotModified) - return - } - } - - // check the root chunk exists by retrieving the file's size - reader, isEncrypted := s.api.Retrieve(r.Context(), addr) - if _, err := reader.Size(r.Context(), nil); err != nil { - getFail.Inc(1) - RespondError(w, r, fmt.Sprintf("root chunk not found %s: %s", addr, err), http.StatusNotFound) - return - } - - w.Header().Set("X-Decrypted", fmt.Sprintf("%v", isEncrypted)) - - switch { - case uri.Raw(): - // allow the request to overwrite the content type using a query - // parameter - if typ := r.URL.Query().Get("content_type"); typ != "" { - w.Header().Set("Content-Type", typ) - } - http.ServeContent(w, r, "", time.Now(), reader) - case uri.Hash(): - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, addr) - } -} - -// HandleGetList handles a GET request to bzz-list:// and returns -// a list of all files contained in under grouped into -// common prefixes using "/" as a delimiter -func (s *Server) HandleGetList(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - _, credentials, _ := r.BasicAuth() - log.Debug("handle.get.list", "ruid", ruid, "uri", uri) - getListCount.Inc(1) - - // ensure the root path has a trailing slash so that relative URLs work - if uri.Path == "" && !strings.HasSuffix(r.URL.Path, "/") { - http.Redirect(w, r, r.URL.Path+"/", http.StatusMovedPermanently) - return - } - - addr, err := s.api.Resolve(r.Context(), uri.Addr) - if err != nil { - getListFail.Inc(1) - RespondError(w, r, fmt.Sprintf("cannot resolve %s: %s", uri.Addr, err), http.StatusNotFound) - return - } - log.Debug("handle.get.list: resolved", "ruid", ruid, "key", addr) - - list, err := s.api.GetManifestList(r.Context(), s.api.Decryptor(r.Context(), credentials), addr, uri.Path) - if err != nil { - getListFail.Inc(1) - if isDecryptError(err) { - w.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", addr.String())) - RespondError(w, r, err.Error(), http.StatusUnauthorized) - return - } - RespondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - - // if the client wants HTML (e.g. a browser) then render the list as a - // HTML index with relative URLs - if strings.Contains(r.Header.Get("Accept"), "text/html") { - w.Header().Set("Content-Type", "text/html") - err := TemplatesMap["bzz-list"].Execute(w, &htmlListData{ - URI: &api.URI{ - Scheme: "bzz", - Addr: uri.Addr, - Path: uri.Path, - }, - List: &list, - }) - if err != nil { - getListFail.Inc(1) - log.Error(fmt.Sprintf("error rendering list HTML: %s", err)) - } - return - } - - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(&list) -} - -// HandleGetFile handles a GET request to bzz:/// and responds -// with the content of the file at from the given -func (s *Server) HandleGetFile(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - _, credentials, _ := r.BasicAuth() - log.Debug("handle.get.file", "ruid", ruid, "uri", r.RequestURI) - getFileCount.Inc(1) - - // ensure the root path has a trailing slash so that relative URLs work - if uri.Path == "" && !strings.HasSuffix(r.URL.Path, "/") { - http.Redirect(w, r, r.URL.Path+"/", http.StatusMovedPermanently) - return - } - var err error - manifestAddr := uri.Address() - - if manifestAddr == nil { - manifestAddr, err = s.api.Resolve(r.Context(), uri.Addr) - if err != nil { - getFileFail.Inc(1) - RespondError(w, r, fmt.Sprintf("cannot resolve %s: %s", uri.Addr, err), http.StatusNotFound) - return - } - } else { - w.Header().Set("Cache-Control", "max-age=2147483648, immutable") // url was of type bzz:///path, so we are sure it is immutable. - } - - log.Debug("handle.get.file: resolved", "ruid", ruid, "key", manifestAddr) - - reader, contentType, status, contentKey, err := s.api.Get(r.Context(), s.api.Decryptor(r.Context(), credentials), manifestAddr, uri.Path) - - etag := common.Bytes2Hex(contentKey) - noneMatchEtag := r.Header.Get("If-None-Match") - w.Header().Set("ETag", fmt.Sprintf("%q", etag)) // set etag to actual content key. - if noneMatchEtag != "" { - if bytes.Equal(storage.Address(common.Hex2Bytes(noneMatchEtag)), contentKey) { - w.WriteHeader(http.StatusNotModified) - return - } - } - - if err != nil { - if isDecryptError(err) { - w.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", manifestAddr)) - RespondError(w, r, err.Error(), http.StatusUnauthorized) - return - } - - switch status { - case http.StatusNotFound: - getFileNotFound.Inc(1) - RespondError(w, r, err.Error(), http.StatusNotFound) - default: - getFileFail.Inc(1) - RespondError(w, r, err.Error(), http.StatusInternalServerError) - } - return - } - - //the request results in ambiguous files - //e.g. /read with readme.md and readinglist.txt available in manifest - if status == http.StatusMultipleChoices { - list, err := s.api.GetManifestList(r.Context(), s.api.Decryptor(r.Context(), credentials), manifestAddr, uri.Path) - if err != nil { - getFileFail.Inc(1) - if isDecryptError(err) { - w.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", manifestAddr)) - RespondError(w, r, err.Error(), http.StatusUnauthorized) - return - } - RespondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - - log.Debug(fmt.Sprintf("Multiple choices! --> %v", list), "ruid", ruid) - //show a nice page links to available entries - ShowMultipleChoices(w, r, list) - return - } - - // check the root chunk exists by retrieving the file's size - if _, err := reader.Size(r.Context(), nil); err != nil { - getFileNotFound.Inc(1) - RespondError(w, r, fmt.Sprintf("file not found %s: %s", uri, err), http.StatusNotFound) - return - } - - if contentType != "" { - w.Header().Set("Content-Type", contentType) - } - - fileName := uri.Addr - if found := path.Base(uri.Path); found != "" && found != "." && found != "/" { - fileName = found - } - w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename=\"%s\"", fileName)) - - http.ServeContent(w, r, fileName, time.Now(), newBufferedReadSeeker(reader, getFileBufferSize)) -} - -// The size of buffer used for bufio.Reader on LazyChunkReader passed to -// http.ServeContent in HandleGetFile. -// Warning: This value influences the number of chunk requests and chunker join goroutines -// per file request. -// Recommended value is 4 times the io.Copy default buffer value which is 32kB. -const getFileBufferSize = 4 * 32 * 1024 - -// bufferedReadSeeker wraps bufio.Reader to expose Seek method -// from the provied io.ReadSeeker in newBufferedReadSeeker. -type bufferedReadSeeker struct { - r io.Reader - s io.Seeker -} - -// newBufferedReadSeeker creates a new instance of bufferedReadSeeker, -// out of io.ReadSeeker. Argument `size` is the size of the read buffer. -func newBufferedReadSeeker(readSeeker io.ReadSeeker, size int) bufferedReadSeeker { - return bufferedReadSeeker{ - r: bufio.NewReaderSize(readSeeker, size), - s: readSeeker, - } -} - -func (b bufferedReadSeeker) Read(p []byte) (n int, err error) { - return b.r.Read(p) -} - -func (b bufferedReadSeeker) Seek(offset int64, whence int) (int64, error) { - return b.s.Seek(offset, whence) -} - -type loggingResponseWriter struct { - http.ResponseWriter - statusCode int -} - -func newLoggingResponseWriter(w http.ResponseWriter) *loggingResponseWriter { - return &loggingResponseWriter{w, http.StatusOK} -} - -func (lrw *loggingResponseWriter) WriteHeader(code int) { - lrw.statusCode = code - lrw.ResponseWriter.WriteHeader(code) -} - -func isDecryptError(err error) bool { - return strings.Contains(err.Error(), api.ErrDecrypt.Error()) -} diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go deleted file mode 100644 index 817519a30766..000000000000 --- a/swarm/api/http/server_test.go +++ /dev/null @@ -1,1297 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "archive/tar" - "bytes" - "context" - "crypto/rand" - "encoding/json" - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "math/big" - "mime/multipart" - "net/http" - "net/url" - "os" - "path" - "strconv" - "strings" - "testing" - "time" - - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/api" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "github.com/ethereum/go-ethereum/swarm/multihash" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru" - "github.com/ethereum/go-ethereum/swarm/testutil" -) - -func init() { - loglevel := flag.Int("loglevel", 2, "loglevel") - flag.Parse() - log.Root().SetHandler(log.CallerFileHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true))))) -} - -func TestResourcePostMode(t *testing.T) { - path := "" - errstr := "resourcePostMode for '%s' should be raw %v frequency %d, was raw %v, frequency %d" - r, f, err := resourcePostMode(path) - if err != nil { - t.Fatal(err) - } else if r || f != 0 { - t.Fatalf(errstr, path, false, 0, r, f) - } - - path = "raw" - r, f, err = resourcePostMode(path) - if err != nil { - t.Fatal(err) - } else if !r || f != 0 { - t.Fatalf(errstr, path, true, 0, r, f) - } - - path = "13" - r, f, err = resourcePostMode(path) - if err != nil { - t.Fatal(err) - } else if r || f == 0 { - t.Fatalf(errstr, path, false, 13, r, f) - } - - path = "raw/13" - r, f, err = resourcePostMode(path) - if err != nil { - t.Fatal(err) - } else if !r || f == 0 { - t.Fatalf(errstr, path, true, 13, r, f) - } - - path = "foo/13" - r, f, err = resourcePostMode(path) - if err == nil { - t.Fatal("resourcePostMode for 'foo/13' should fail, returned error nil") - } -} - -func serverFunc(api *api.API) testutil.TestServer { - return NewServer(api, "") -} - -func newTestSigner() (*mru.GenericSigner, error) { - privKey, err := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") - if err != nil { - return nil, err - } - return mru.NewGenericSigner(privKey), nil -} - -// test the transparent resolving of multihash resource types with bzz:// scheme -// -// first upload data, and store the multihash to the resulting manifest in a resource update -// retrieving the update with the multihash should return the manifest pointing directly to the data -// and raw retrieve of that hash should return the data -func TestBzzResourceMultihash(t *testing.T) { - - signer, _ := newTestSigner() - - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - // add the data our multihash aliased manifest will point to - databytes := "bar" - testBzzUrl := fmt.Sprintf("%s/bzz:/", srv.URL) - resp, err := http.Post(testBzzUrl, "text/plain", bytes.NewReader([]byte(databytes))) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err := ioutil.ReadAll(resp.Body) - - if err != nil { - t.Fatal(err) - } - s := common.FromHex(string(b)) - mh := multihash.ToMultihash(s) - - log.Info("added data", "manifest", string(b), "data", common.ToHex(mh)) - - topic, _ := mru.NewTopic("foo.eth", nil) - updateRequest := mru.NewFirstRequest(topic) - - updateRequest.SetData(mh) - - if err := updateRequest.Sign(signer); err != nil { - t.Fatal(err) - } - log.Info("added data", "manifest", string(b), "data", common.ToHex(mh)) - - testUrl, err := url.Parse(fmt.Sprintf("%s/bzz-resource:/", srv.URL)) - if err != nil { - t.Fatal(err) - } - query := testUrl.Query() - body := updateRequest.AppendValues(query) // this adds all query parameters and returns the data to be posted - query.Set("manifest", "1") // indicate we want a manifest back - testUrl.RawQuery = query.Encode() - - // create the multihash update - resp, err = http.Post(testUrl.String(), "application/octet-stream", bytes.NewReader(body)) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - rsrcResp := &storage.Address{} - err = json.Unmarshal(b, rsrcResp) - if err != nil { - t.Fatalf("data %s could not be unmarshaled: %v", b, err) - } - - correctManifestAddrHex := "6ef40ba1492cf2a029dc9a8b5896c822cf689d3cd010842f4f1744e6db8824bd" - if rsrcResp.Hex() != correctManifestAddrHex { - t.Fatalf("Response resource key mismatch, expected '%s', got '%s'", correctManifestAddrHex, rsrcResp.Hex()) - } - - // get bzz manifest transparent resource resolve - testBzzUrl = fmt.Sprintf("%s/bzz:/%s", srv.URL, rsrcResp) - resp, err = http.Get(testBzzUrl) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(b, []byte(databytes)) { - t.Fatalf("retrieved data mismatch, expected %x, got %x", databytes, b) - } -} - -// Test resource updates using the raw update methods -func TestBzzResource(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - signer, _ := newTestSigner() - - defer srv.Close() - - // data of update 1 - update1Data := make([]byte, 666) - update1Timestamp := srv.CurrentTime - _, err := rand.Read(update1Data) - if err != nil { - t.Fatal(err) - } - //data for update 2 - update2Data := []byte("foo") - - topic, _ := mru.NewTopic("foo.eth", nil) - updateRequest := mru.NewFirstRequest(topic) - if err != nil { - t.Fatal(err) - } - updateRequest.SetData(update1Data) - - if err := updateRequest.Sign(signer); err != nil { - t.Fatal(err) - } - - // creates resource and sets update 1 - testUrl, err := url.Parse(fmt.Sprintf("%s/bzz-resource:/", srv.URL)) - if err != nil { - t.Fatal(err) - } - urlQuery := testUrl.Query() - body := updateRequest.AppendValues(urlQuery) // this adds all query parameters - urlQuery.Set("manifest", "1") // indicate we want a manifest back - testUrl.RawQuery = urlQuery.Encode() - - resp, err := http.Post(testUrl.String(), "application/octet-stream", bytes.NewReader(body)) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - rsrcResp := &storage.Address{} - err = json.Unmarshal(b, rsrcResp) - if err != nil { - t.Fatalf("data %s could not be unmarshaled: %v", b, err) - } - - correctManifestAddrHex := "6ef40ba1492cf2a029dc9a8b5896c822cf689d3cd010842f4f1744e6db8824bd" - if rsrcResp.Hex() != correctManifestAddrHex { - t.Fatalf("Response resource manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, rsrcResp.Hex()) - } - - // get the manifest - testRawUrl := fmt.Sprintf("%s/bzz-raw:/%s", srv.URL, rsrcResp) - resp, err = http.Get(testRawUrl) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - manifest := &api.Manifest{} - err = json.Unmarshal(b, manifest) - if err != nil { - t.Fatal(err) - } - if len(manifest.Entries) != 1 { - t.Fatalf("Manifest has %d entries", len(manifest.Entries)) - } - correctViewHex := "0x666f6f2e65746800000000000000000000000000000000000000000000000000c96aaa54e2d44c299564da76e1cd3184a2386b8d" - if manifest.Entries[0].ResourceView.Hex() != correctViewHex { - t.Fatalf("Expected manifest Resource View '%s', got '%s'", correctViewHex, manifest.Entries[0].ResourceView.Hex()) - } - - // get bzz manifest transparent resource resolve - testBzzUrl := fmt.Sprintf("%s/bzz:/%s", srv.URL, rsrcResp) - resp, err = http.Get(testBzzUrl) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode == http.StatusOK { - t.Fatal("Expected error status since resource is not multihash. Received 200 OK") - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // get non-existent name, should fail - testBzzResUrl := fmt.Sprintf("%s/bzz-resource:/bar", srv.URL) - resp, err = http.Get(testBzzResUrl) - if err != nil { - t.Fatal(err) - } - - if resp.StatusCode != http.StatusNotFound { - t.Fatalf("Expected get non-existent resource to fail with StatusNotFound (404), got %d", resp.StatusCode) - } - - resp.Body.Close() - - // get latest update (1.1) through resource directly - log.Info("get update latest = 1.1", "addr", correctManifestAddrHex) - testBzzResUrl = fmt.Sprintf("%s/bzz-resource:/%s", srv.URL, correctManifestAddrHex) - resp, err = http.Get(testBzzResUrl) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(update1Data, b) { - t.Fatalf("Expected body '%x', got '%x'", update1Data, b) - } - - // update 2 - // Move the clock ahead 1 second - srv.CurrentTime++ - log.Info("update 2") - - // 1.- get metadata about this resource - testBzzResUrl = fmt.Sprintf("%s/bzz-resource:/%s/", srv.URL, correctManifestAddrHex) - resp, err = http.Get(testBzzResUrl + "?meta=1") - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("Get resource metadata returned %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - updateRequest = &mru.Request{} - if err = updateRequest.UnmarshalJSON(b); err != nil { - t.Fatalf("Error decoding resource metadata: %s", err) - } - updateRequest.SetData(update2Data) - if err = updateRequest.Sign(signer); err != nil { - t.Fatal(err) - } - testUrl, err = url.Parse(fmt.Sprintf("%s/bzz-resource:/", srv.URL)) - if err != nil { - t.Fatal(err) - } - urlQuery = testUrl.Query() - body = updateRequest.AppendValues(urlQuery) // this adds all query parameters - testUrl.RawQuery = urlQuery.Encode() - - resp, err = http.Post(testUrl.String(), "application/octet-stream", bytes.NewReader(body)) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("Update returned %s", resp.Status) - } - - // get latest update (1.2) through resource directly - log.Info("get update 1.2") - testBzzResUrl = fmt.Sprintf("%s/bzz-resource:/%s", srv.URL, correctManifestAddrHex) - resp, err = http.Get(testBzzResUrl) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(update2Data, b) { - t.Fatalf("Expected body '%x', got '%x'", update2Data, b) - } - - // test manifest-less queries - log.Info("get first update in update1Timestamp via direct query") - query := mru.NewQuery(&updateRequest.View, update1Timestamp, lookup.NoClue) - - urlq, err := url.Parse(fmt.Sprintf("%s/bzz-resource:/", srv.URL)) - if err != nil { - t.Fatal(err) - } - - values := urlq.Query() - query.AppendValues(values) // this adds view query parameters - urlq.RawQuery = values.Encode() - resp, err = http.Get(urlq.String()) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(update1Data, b) { - t.Fatalf("Expected body '%x', got '%x'", update1Data, b) - } - -} - -func TestBzzGetPath(t *testing.T) { - testBzzGetPath(false, t) - testBzzGetPath(true, t) -} - -func testBzzGetPath(encrypted bool, t *testing.T) { - var err error - - testmanifest := []string{ - `{"entries":[{"path":"b","hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","contentType":"","status":0},{"path":"c","hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","contentType":"","status":0}]}`, - `{"entries":[{"path":"a","hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","contentType":"","status":0},{"path":"b/","hash":"","contentType":"application/bzz-manifest+json","status":0}]}`, - `{"entries":[{"path":"a/","hash":"","contentType":"application/bzz-manifest+json","status":0}]}`, - } - - testrequests := make(map[string]int) - testrequests["/"] = 2 - testrequests["/a/"] = 1 - testrequests["/a/b/"] = 0 - testrequests["/x"] = 0 - testrequests[""] = 0 - - expectedfailrequests := []string{"", "/x"} - - reader := [3]*bytes.Reader{} - - addr := [3]storage.Address{} - - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - for i, mf := range testmanifest { - reader[i] = bytes.NewReader([]byte(mf)) - var wait func(context.Context) error - ctx := context.TODO() - addr[i], wait, err = srv.FileStore.Store(ctx, reader[i], int64(len(mf)), encrypted) - if err != nil { - t.Fatal(err) - } - for j := i + 1; j < len(testmanifest); j++ { - testmanifest[j] = strings.Replace(testmanifest[j], fmt.Sprintf("", i), addr[i].Hex(), -1) - } - err = wait(ctx) - if err != nil { - t.Fatal(err) - } - } - - rootRef := addr[2].Hex() - - _, err = http.Get(srv.URL + "/bzz-raw:/" + rootRef + "/a") - if err != nil { - t.Fatalf("Failed to connect to proxy: %v", err) - } - - for k, v := range testrequests { - var resp *http.Response - var respbody []byte - - url := srv.URL + "/bzz-raw:/" - if k != "" { - url += rootRef + "/" + k[1:] + "?content_type=text/plain" - } - resp, err = http.Get(url) - if err != nil { - t.Fatalf("Request failed: %v", err) - } - defer resp.Body.Close() - respbody, err = ioutil.ReadAll(resp.Body) - - if string(respbody) != testmanifest[v] { - isexpectedfailrequest := false - - for _, r := range expectedfailrequests { - if k == r { - isexpectedfailrequest = true - } - } - if !isexpectedfailrequest { - t.Fatalf("Response body does not match, expected: %v, got %v", testmanifest[v], string(respbody)) - } - } - } - - for k, v := range testrequests { - var resp *http.Response - var respbody []byte - - url := srv.URL + "/bzz-hash:/" - if k != "" { - url += rootRef + "/" + k[1:] - } - resp, err = http.Get(url) - if err != nil { - t.Fatalf("Request failed: %v", err) - } - defer resp.Body.Close() - respbody, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("Read request body: %v", err) - } - - if string(respbody) != addr[v].Hex() { - isexpectedfailrequest := false - - for _, r := range expectedfailrequests { - if k == r { - isexpectedfailrequest = true - } - } - if !isexpectedfailrequest { - t.Fatalf("Response body does not match, expected: %v, got %v", addr[v], string(respbody)) - } - } - } - - ref := addr[2].Hex() - - for _, c := range []struct { - path string - json string - pageFragments []string - }{ - { - path: "/", - json: `{"common_prefixes":["a/"]}`, - pageFragments: []string{ - fmt.Sprintf("Swarm index of bzz:/%s/", ref), - `a/`, - }, - }, - { - path: "/a/", - json: `{"common_prefixes":["a/b/"],"entries":[{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/a","mod_time":"0001-01-01T00:00:00Z"}]}`, - pageFragments: []string{ - fmt.Sprintf("Swarm index of bzz:/%s/a/", ref), - `b/`, - fmt.Sprintf(`a`, ref), - }, - }, - { - path: "/a/b/", - json: `{"entries":[{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/b/b","mod_time":"0001-01-01T00:00:00Z"},{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/b/c","mod_time":"0001-01-01T00:00:00Z"}]}`, - pageFragments: []string{ - fmt.Sprintf("Swarm index of bzz:/%s/a/b/", ref), - fmt.Sprintf(`b`, ref), - fmt.Sprintf(`c`, ref), - }, - }, - { - path: "/x", - }, - { - path: "", - }, - } { - k := c.path - url := srv.URL + "/bzz-list:/" - if k != "" { - url += rootRef + "/" + k[1:] - } - t.Run("json list "+c.path, func(t *testing.T) { - resp, err := http.Get(url) - if err != nil { - t.Fatalf("HTTP request: %v", err) - } - defer resp.Body.Close() - respbody, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("Read response body: %v", err) - } - - body := strings.TrimSpace(string(respbody)) - if body != c.json { - isexpectedfailrequest := false - - for _, r := range expectedfailrequests { - if k == r { - isexpectedfailrequest = true - } - } - if !isexpectedfailrequest { - t.Errorf("Response list body %q does not match, expected: %v, got %v", k, c.json, body) - } - } - }) - t.Run("html list "+c.path, func(t *testing.T) { - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - t.Fatalf("New request: %v", err) - } - req.Header.Set("Accept", "text/html") - resp, err := http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("HTTP request: %v", err) - } - defer resp.Body.Close() - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("Read response body: %v", err) - } - - body := string(b) - - for _, f := range c.pageFragments { - if !strings.Contains(body, f) { - isexpectedfailrequest := false - - for _, r := range expectedfailrequests { - if k == r { - isexpectedfailrequest = true - } - } - if !isexpectedfailrequest { - t.Errorf("Response list body %q does not contain %q: body %q", k, f, body) - } - } - } - }) - } - - nonhashtests := []string{ - srv.URL + "/bzz:/name", - srv.URL + "/bzz-immutable:/nonhash", - srv.URL + "/bzz-raw:/nonhash", - srv.URL + "/bzz-list:/nonhash", - srv.URL + "/bzz-hash:/nonhash", - } - - nonhashresponses := []string{ - `cannot resolve name: no DNS to resolve name: "name"`, - `cannot resolve nonhash: no DNS to resolve name: "nonhash"`, - `cannot resolve nonhash: no DNS to resolve name: "nonhash"`, - `cannot resolve nonhash: no DNS to resolve name: "nonhash"`, - `cannot resolve nonhash: no DNS to resolve name: "nonhash"`, - } - - for i, url := range nonhashtests { - var resp *http.Response - var respbody []byte - - resp, err = http.Get(url) - - if err != nil { - t.Fatalf("Request failed: %v", err) - } - defer resp.Body.Close() - respbody, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("ReadAll failed: %v", err) - } - if !strings.Contains(string(respbody), nonhashresponses[i]) { - t.Fatalf("Non-Hash response body does not match, expected: %v, got: %v", nonhashresponses[i], string(respbody)) - } - } -} - -func TestBzzTar(t *testing.T) { - testBzzTar(false, t) - testBzzTar(true, t) -} - -func testBzzTar(encrypted bool, t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - fileNames := []string{"tmp1.txt", "tmp2.lock", "tmp3.rtf"} - fileContents := []string{"tmp1textfilevalue", "tmp2lockfilelocked", "tmp3isjustaplaintextfile"} - - buf := &bytes.Buffer{} - tw := tar.NewWriter(buf) - defer tw.Close() - - for i, v := range fileNames { - size := int64(len(fileContents[i])) - hdr := &tar.Header{ - Name: v, - Mode: 0644, - Size: size, - ModTime: time.Now(), - Xattrs: map[string]string{ - "user.swarm.content-type": "text/plain", - }, - } - if err := tw.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - - // copy the file into the tar stream - n, err := io.Copy(tw, bytes.NewBufferString(fileContents[i])) - if err != nil { - t.Fatal(err) - } else if n != size { - t.Fatal("size mismatch") - } - } - - //post tar stream - url := srv.URL + "/bzz:/" - if encrypted { - url = url + "encrypt" - } - req, err := http.NewRequest("POST", url, buf) - if err != nil { - t.Fatal(err) - } - req.Header.Add("Content-Type", "application/x-tar") - client := &http.Client{} - resp2, err := client.Do(req) - if err != nil { - t.Fatal(err) - } - if resp2.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp2.Status) - } - swarmHash, err := ioutil.ReadAll(resp2.Body) - resp2.Body.Close() - if err != nil { - t.Fatal(err) - } - - // now do a GET to get a tarball back - req, err = http.NewRequest("GET", fmt.Sprintf(srv.URL+"/bzz:/%s", string(swarmHash)), nil) - if err != nil { - t.Fatal(err) - } - req.Header.Add("Accept", "application/x-tar") - resp2, err = client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp2.Body.Close() - - if h := resp2.Header.Get("Content-Type"); h != "application/x-tar" { - t.Fatalf("Content-Type header expected: application/x-tar, got: %s", h) - } - - expectedFileName := string(swarmHash) + ".tar" - expectedContentDisposition := fmt.Sprintf("inline; filename=\"%s\"", expectedFileName) - if h := resp2.Header.Get("Content-Disposition"); h != expectedContentDisposition { - t.Fatalf("Content-Disposition header expected: %s, got: %s", expectedContentDisposition, h) - } - - file, err := ioutil.TempFile("", "swarm-downloaded-tarball") - if err != nil { - t.Fatal(err) - } - defer os.Remove(file.Name()) - _, err = io.Copy(file, resp2.Body) - if err != nil { - t.Fatalf("error getting tarball: %v", err) - } - file.Sync() - file.Close() - - tarFileHandle, err := os.Open(file.Name()) - if err != nil { - t.Fatal(err) - } - tr := tar.NewReader(tarFileHandle) - - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } else if err != nil { - t.Fatalf("error reading tar stream: %s", err) - } - bb := make([]byte, hdr.Size) - _, err = tr.Read(bb) - if err != nil && err != io.EOF { - t.Fatal(err) - } - passed := false - for i, v := range fileNames { - if v == hdr.Name { - if string(bb) == fileContents[i] { - passed = true - break - } - } - } - if !passed { - t.Fatalf("file %s did not pass content assertion", hdr.Name) - } - } -} - -// TestBzzRootRedirect tests that getting the root path of a manifest without -// a trailing slash gets redirected to include the trailing slash so that -// relative URLs work as expected. -func TestBzzRootRedirect(t *testing.T) { - testBzzRootRedirect(false, t) -} -func TestBzzRootRedirectEncrypted(t *testing.T) { - testBzzRootRedirect(true, t) -} - -func testBzzRootRedirect(toEncrypt bool, t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - // create a manifest with some data at the root path - client := swarm.NewClient(srv.URL) - data := []byte("data") - file := &swarm.File{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(data)), - ManifestEntry: api.ManifestEntry{ - Path: "", - ContentType: "text/plain", - Size: int64(len(data)), - }, - } - hash, err := client.Upload(file, "", toEncrypt) - if err != nil { - t.Fatal(err) - } - - // define a CheckRedirect hook which ensures there is only a single - // redirect to the correct URL - redirected := false - httpClient := http.Client{ - CheckRedirect: func(req *http.Request, via []*http.Request) error { - if redirected { - return errors.New("too many redirects") - } - redirected = true - expectedPath := "/bzz:/" + hash + "/" - if req.URL.Path != expectedPath { - return fmt.Errorf("expected redirect to %q, got %q", expectedPath, req.URL.Path) - } - return nil - }, - } - - // perform the GET request and assert the response - res, err := httpClient.Get(srv.URL + "/bzz:/" + hash) - if err != nil { - t.Fatal(err) - } - defer res.Body.Close() - if !redirected { - t.Fatal("expected GET /bzz:/ to redirect to /bzz:// but it didn't") - } - gotData, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(gotData, data) { - t.Fatalf("expected response to equal %q, got %q", data, gotData) - } -} - -func TestMethodsNotAllowed(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - databytes := "bar" - for _, c := range []struct { - url string - code int - }{ - { - url: fmt.Sprintf("%s/bzz-list:/", srv.URL), - code: http.StatusMethodNotAllowed, - }, { - url: fmt.Sprintf("%s/bzz-hash:/", srv.URL), - code: http.StatusMethodNotAllowed, - }, - { - url: fmt.Sprintf("%s/bzz-immutable:/", srv.URL), - code: http.StatusMethodNotAllowed, - }, - } { - res, _ := http.Post(c.url, "text/plain", bytes.NewReader([]byte(databytes))) - if res.StatusCode != c.code { - t.Fatalf("should have failed. requested url: %s, expected code %d, got %d", c.url, c.code, res.StatusCode) - } - } - -} - -func httpDo(httpMethod string, url string, reqBody io.Reader, headers map[string]string, verbose bool, t *testing.T) (*http.Response, string) { - // Build the Request - req, err := http.NewRequest(httpMethod, url, reqBody) - if err != nil { - t.Fatal(err) - } - for key, value := range headers { - req.Header.Set(key, value) - } - if verbose { - t.Log(req.Method, req.URL, req.Header, req.Body) - } - - // Send Request out - httpClient := &http.Client{} - res, err := httpClient.Do(req) - if err != nil { - t.Fatal(err) - } - - // Read the HTTP Body - buffer, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Fatal(err) - } - defer res.Body.Close() - body := string(buffer) - - return res, body -} - -func TestGet(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - for _, testCase := range []struct { - uri string - method string - headers map[string]string - expectedStatusCode int - assertResponseBody string - verbose bool - }{ - { - uri: fmt.Sprintf("%s/", srv.URL), - method: "GET", - headers: map[string]string{"Accept": "text/html"}, - expectedStatusCode: http.StatusOK, - assertResponseBody: "Swarm: Serverless Hosting Incentivised Peer-To-Peer Storage And Content Distribution", - verbose: false, - }, - { - uri: fmt.Sprintf("%s/", srv.URL), - method: "GET", - headers: map[string]string{"Accept": "application/json"}, - expectedStatusCode: http.StatusOK, - assertResponseBody: "Swarm: Please request a valid ENS or swarm hash with the appropriate bzz scheme", - verbose: false, - }, - { - uri: fmt.Sprintf("%s/robots.txt", srv.URL), - method: "GET", - headers: map[string]string{"Accept": "text/html"}, - expectedStatusCode: http.StatusOK, - assertResponseBody: "User-agent: *\nDisallow: /", - verbose: false, - }, - { - uri: fmt.Sprintf("%s/nonexistent_path", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz:asdf/", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/tbz2/", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-rack:/", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-ls", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }} { - t.Run("GET "+testCase.uri, func(t *testing.T) { - res, body := httpDo(testCase.method, testCase.uri, nil, testCase.headers, testCase.verbose, t) - if res.StatusCode != testCase.expectedStatusCode { - t.Fatalf("expected status code %d but got %d", testCase.expectedStatusCode, res.StatusCode) - } - if testCase.assertResponseBody != "" && !strings.Contains(body, testCase.assertResponseBody) { - t.Fatalf("expected response to be: %s but got: %s", testCase.assertResponseBody, body) - } - }) - } -} - -func TestModify(t *testing.T) { - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - swarmClient := swarm.NewClient(srv.URL) - data := []byte("data") - file := &swarm.File{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(data)), - ManifestEntry: api.ManifestEntry{ - Path: "", - ContentType: "text/plain", - Size: int64(len(data)), - }, - } - - hash, err := swarmClient.Upload(file, "", false) - if err != nil { - t.Fatal(err) - } - - for _, testCase := range []struct { - uri string - method string - headers map[string]string - requestBody []byte - expectedStatusCode int - assertResponseBody string - assertResponseHeaders map[string]string - verbose bool - }{ - { - uri: fmt.Sprintf("%s/bzz:/%s", srv.URL, hash), - method: "DELETE", - headers: map[string]string{}, - expectedStatusCode: http.StatusOK, - assertResponseBody: "8b634aea26eec353ac0ecbec20c94f44d6f8d11f38d4578a4c207a84c74ef731", - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz:/%s", srv.URL, hash), - method: "PUT", - headers: map[string]string{}, - expectedStatusCode: http.StatusMethodNotAllowed, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-raw:/%s", srv.URL, hash), - method: "PUT", - headers: map[string]string{}, - expectedStatusCode: http.StatusMethodNotAllowed, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz:/%s", srv.URL, hash), - method: "PATCH", - headers: map[string]string{}, - expectedStatusCode: http.StatusMethodNotAllowed, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-raw:/", srv.URL), - method: "POST", - headers: map[string]string{}, - requestBody: []byte("POSTdata"), - expectedStatusCode: http.StatusOK, - assertResponseHeaders: map[string]string{"Content-Length": "64"}, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-raw:/encrypt", srv.URL), - method: "POST", - headers: map[string]string{}, - requestBody: []byte("POSTdata"), - expectedStatusCode: http.StatusOK, - assertResponseHeaders: map[string]string{"Content-Length": "128"}, - verbose: false, - }, - } { - t.Run(testCase.method+" "+testCase.uri, func(t *testing.T) { - reqBody := bytes.NewReader(testCase.requestBody) - res, body := httpDo(testCase.method, testCase.uri, reqBody, testCase.headers, testCase.verbose, t) - - if res.StatusCode != testCase.expectedStatusCode { - t.Fatalf("expected status code %d but got %d, %s", testCase.expectedStatusCode, res.StatusCode, body) - } - if testCase.assertResponseBody != "" && !strings.Contains(body, testCase.assertResponseBody) { - t.Log(body) - t.Fatalf("expected response %s but got %s", testCase.assertResponseBody, body) - } - for key, value := range testCase.assertResponseHeaders { - if res.Header.Get(key) != value { - t.Logf("expected %s=%s in HTTP response header but got %s", key, value, res.Header.Get(key)) - } - } - }) - } -} - -func TestMultiPartUpload(t *testing.T) { - // POST /bzz:/ Content-Type: multipart/form-data - verbose := false - // Setup Swarm - srv := testutil.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - url := fmt.Sprintf("%s/bzz:/", srv.URL) - - buf := new(bytes.Buffer) - form := multipart.NewWriter(buf) - form.WriteField("name", "John Doe") - file1, _ := form.CreateFormFile("cv", "cv.txt") - file1.Write([]byte("John Doe's Credentials")) - file2, _ := form.CreateFormFile("profile_picture", "profile.jpg") - file2.Write([]byte("imaginethisisjpegdata")) - form.Close() - - headers := map[string]string{ - "Content-Type": form.FormDataContentType(), - "Content-Length": strconv.Itoa(buf.Len()), - } - res, body := httpDo("POST", url, buf, headers, verbose, t) - - if res.StatusCode != http.StatusOK { - t.Fatalf("expected POST multipart/form-data to return 200, but it returned %d", res.StatusCode) - } - if len(body) != 64 { - t.Fatalf("expected POST multipart/form-data to return a 64 char manifest but the answer was %d chars long", len(body)) - } -} - -// TestBzzGetFileWithResolver tests fetching a file using a mocked ENS resolver -func TestBzzGetFileWithResolver(t *testing.T) { - resolver := newTestResolveValidator("") - srv := testutil.NewTestSwarmServer(t, serverFunc, resolver) - defer srv.Close() - fileNames := []string{"dir1/tmp1.txt", "dir2/tmp2.lock", "dir3/tmp3.rtf"} - fileContents := []string{"tmp1textfilevalue", "tmp2lockfilelocked", "tmp3isjustaplaintextfile"} - - buf := &bytes.Buffer{} - tw := tar.NewWriter(buf) - - for i, v := range fileNames { - size := len(fileContents[i]) - hdr := &tar.Header{ - Name: v, - Mode: 0644, - Size: int64(size), - ModTime: time.Now(), - Xattrs: map[string]string{ - "user.swarm.content-type": "text/plain", - }, - } - if err := tw.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - - // copy the file into the tar stream - n, err := io.WriteString(tw, fileContents[i]) - if err != nil { - t.Fatal(err) - } else if n != size { - t.Fatal("size mismatch") - } - } - - if err := tw.Close(); err != nil { - t.Fatal(err) - } - - //post tar stream - url := srv.URL + "/bzz:/" - - req, err := http.NewRequest("POST", url, buf) - if err != nil { - t.Fatal(err) - } - req.Header.Add("Content-Type", "application/x-tar") - client := &http.Client{} - serverResponse, err := client.Do(req) - if err != nil { - t.Fatal(err) - } - if serverResponse.StatusCode != http.StatusOK { - t.Fatalf("err %s", serverResponse.Status) - } - swarmHash, err := ioutil.ReadAll(serverResponse.Body) - serverResponse.Body.Close() - if err != nil { - t.Fatal(err) - } - // set the resolved hash to be the swarm hash of what we've just uploaded - hash := common.HexToHash(string(swarmHash)) - resolver.hash = &hash - for _, v := range []struct { - addr string - path string - expectedStatusCode int - expectedContentType string - expectedFileName string - }{ - { - addr: string(swarmHash), - path: fileNames[0], - expectedStatusCode: http.StatusOK, - expectedContentType: "text/plain", - expectedFileName: path.Base(fileNames[0]), - }, - { - addr: "somebogusensname", - path: fileNames[0], - expectedStatusCode: http.StatusOK, - expectedContentType: "text/plain", - expectedFileName: path.Base(fileNames[0]), - }, - } { - req, err := http.NewRequest("GET", fmt.Sprintf(srv.URL+"/bzz:/%s/%s", v.addr, v.path), nil) - if err != nil { - t.Fatal(err) - } - serverResponse, err := client.Do(req) - if err != nil { - t.Fatal(err) - } - defer serverResponse.Body.Close() - if serverResponse.StatusCode != v.expectedStatusCode { - t.Fatalf("expected %d, got %d", v.expectedStatusCode, serverResponse.StatusCode) - } - - if h := serverResponse.Header.Get("Content-Type"); h != v.expectedContentType { - t.Fatalf("Content-Type header expected: %s, got %s", v.expectedContentType, h) - } - - expectedContentDisposition := fmt.Sprintf("inline; filename=\"%s\"", v.expectedFileName) - if h := serverResponse.Header.Get("Content-Disposition"); h != expectedContentDisposition { - t.Fatalf("Content-Disposition header expected: %s, got: %s", expectedContentDisposition, h) - } - - } -} - -// testResolver implements the Resolver interface and either returns the given -// hash if it is set, or returns a "name not found" error -type testResolveValidator struct { - hash *common.Hash -} - -func newTestResolveValidator(addr string) *testResolveValidator { - r := &testResolveValidator{} - if addr != "" { - hash := common.HexToHash(addr) - r.hash = &hash - } - return r -} - -func (t *testResolveValidator) Resolve(addr string) (common.Hash, error) { - if t.hash == nil { - return common.Hash{}, fmt.Errorf("DNS name not found: %q", addr) - } - return *t.hash, nil -} - -func (t *testResolveValidator) Owner(node [32]byte) (addr common.Address, err error) { - return -} -func (t *testResolveValidator) HeaderByNumber(context.Context, *big.Int) (header *types.Header, err error) { - return -} diff --git a/swarm/api/http/templates.go b/swarm/api/http/templates.go deleted file mode 100644 index 986f5f8873d3..000000000000 --- a/swarm/api/http/templates.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "encoding/hex" - "fmt" - "html/template" - "path" - - "github.com/ethereum/go-ethereum/swarm/api" -) - -type htmlListData struct { - URI *api.URI - List *api.ManifestList -} - -var TemplatesMap = make(map[string]*template.Template) -var faviconBytes []byte - -func init() { - for _, v := range []struct { - templateName string - partial string - funcs template.FuncMap - }{ - { - templateName: "error", - partial: errorResponse, - }, - { - templateName: "bzz-list", - partial: bzzList, - funcs: template.FuncMap{ - "basename": path.Base, - "leaflink": leafLink, - }, - }, - { - templateName: "landing-page", - partial: landing, - }, - } { - TemplatesMap[v.templateName] = template.Must(template.New(v.templateName).Funcs(v.funcs).Parse(baseTemplate + css + v.partial + logo)) - } - - bytes, err := hex.DecodeString(favicon) - if err != nil { - panic(err) - } - faviconBytes = bytes -} - -func leafLink(URI api.URI, manifestEntry api.ManifestEntry) string { - return fmt.Sprintf("/bzz:/%s/%s", URI.Addr, manifestEntry.Path) -} - -const bzzList = `{{ define "content" }} -

Swarm index of {{ .URI }}

-
- - - - - - - - - - - {{ range .List.CommonPrefixes }} - - - - - - {{ end }} - {{ range .List.Entries }} - - - - - - {{ end }} -
PathTypeSize
- {{ basename . }}/ - DIR-
- {{ basename .Path }} - {{ .ContentType }}{{ .Size }}
-
- - {{ end }}` - -const errorResponse = `{{ define "content" }} -
- - -
-

{{.Msg}}

-
- -
-
Error code: {{.Code}}
-
- - -
-{{ end }}` - -const landing = `{{ define "content" }} - - - -
- - - - - -
- -{{ end }}` - -const baseTemplate = ` - - - - - - - - - {{ template "content" . }} - - -` - -const css = `{{ define "css" }} -html { - font-size: 18px; - font-size: 1.13rem; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - font-family: Helvetica, Arial, sans-serif; -} - -body { - background: #f6f6f6; - color: #333; -} - -a, a:visited, a:active { - color: darkorange; -} - -a.normal-link, a.normal-link:active { color: #0000EE; } -a.normal-link:visited { color: #551A8B; } - -table { - border-collapse: separate; -} - -td { - padding: 3px 10px; -} - - -.container { - max-width: 600px; - margin: 40px auto 40px; - text-align: center; -} - -.separate-block { - margin: 40px 0; - word-wrap: break-word; -} - -.footer { - font-size: 12px; - font-size: 0.75rem; - text-align: center; -} - -.orange { - color: #ffa500; -} - -.top-space { - margin-top: 20px; - margin-bottom: 20px; -} - -/* SVG Logos, editable */ - -.searchbar { - padding: 20px 20px 0; -} - -.logo { - margin: 100px 80px 0; -} - -.logo a img { - max-width: 140px; -} - -/* Tablet < 600p*/ - -@media only screen and (max-width: 600px) {} - -/* Mobile phone < 360p*/ - -@media only screen and (max-width: 360px) { - h1 { - font-size: 20px; - font-size: 1.5rem; - } - h2 { - font-size: 0.88rem; - margin: 0; - } - .logo { - margin: 50px 40px 0; - } - .footer { - font-size: 0.63rem; - text-align: center; - } -} - -input[type=text] { - width: 100%; - box-sizing: border-box; - border: 2px solid #777; - border-radius: 2px; - font-size: 16px; - padding: 12px 20px 12px 20px; - transition: border 250ms ease-in-out; -} - -input[type=text]:focus { - border: 2px solid #ffce73; -} - -.button { - background-color: #ffa500; - margin: 20px 0; - border: none; - border-radius: 2px; - color: #222; - padding: 15px 32px; - text-align: center; - text-decoration: none; - display: inline-block; - font-size: 16px; -} -{{ end }}` - -const logo = `{{ define "logo" }} - -{{ end }}` - -const favicon = `000001000400101000000000200068040000460000002020000000002000a8100000ae0400003030000000002000a825000056150000404000000000200028420000fe3a000028000000100000002000000001002000000000004004000000000000000000000000000000000000ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017e7e7e0362626263545454c548484849ffffff01ffffff01ffffff01ffffff01646464375b5b5bbf4545457758585809ffffff01ffffff01ffffff0164646443626262cf626262ff535353ff454545ff454545b74949492b6868681d626262a5626262fd5c5c5cff464646ff454545dd47474755ffffff01ffffff013f3f3feb565656ff636363ff535353ff464646ff3f3f3fff373737ab393939894d4d4dff626262ff5c5c5cff464646ff424242ff3a3a3af7ffffff01ffffff01383838e9353535ff424242ff474747ff383838ff353535ff363636ab35353587363636ff3a3a3aff4a4a4aff3b3b3bff353535ff363636f5ffffff01ffffff01383838e9303030ff181818ff131313ff232323ff343434ff363636ab35353587343434ff202020ff101010ff1d1d1dff303030ff373737f5ffffff01ffffff01232323c50c0c0cff0d0d0dff131313ff171717ff171717ff2929298b2727276b0f0f0ffd0d0d0dff101010ff171717ff161616ff232323d9ffffff01ffffff014d4d4d030f0f0f650c0c0ce7131313ff161616d51d1d1d4b63636363464646691717173b0d0d0dc50f0f0fff161616ef171717752e2e2e07ffffff01ffffff01ffffff01ffffff011d1d1d0f1515155360606045626262cf636363ff464646ff454545d3484848491414144d24242417ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013c3c3c374f4f4fff636363ff636363ff464646ff464646ff3f3f3fff3c3c3c41ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636363d353535ff3c3c3cff575757ff363636ff181818ff282828ff37373747ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636363d363636ff303030ff181818ff292929ff131313ef17171771696969136565653bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01323232371e1e1eff0d0d0dff0c0c0cff363636ff363636a3ffffff0185858515606060ff4747476bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01111111450d0d0dd10c0c0cff1b1b1bff2a2a2a993e3e3e0b30303085292929ff37373787ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636030e0e0e671616166b45454505323232432e2e2ed9151515c31d1d1d2dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014e4e4e05ffffff01ffffff01ffffff01ffffff010000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff28000000200000004000000001002000000000008010000000000000000000000000000000000000ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017272721b646464a54646466f72727205ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0168686845575757b74f4f4f39ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017e7e7e0b6262627d616161f3636363ff424242ff444444d74f4f4f49ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff016c6c6c27636363b5616161ff555555ff434343ff464646a35858581dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff016666665d616161e3626262ff636363ff636363ff444444ff464646ff434343ff454545b95252522bffffff01ffffff01ffffff01ffffff016c6c6c1363636393616161fb636363ff636363ff555555ff464646ff464646ff444444f5464646836666660bffffff01ffffff01ffffff01ffffff01ffffff016a6a6a3f626262c9616161ff636363ff636363ff636363ff636363ff444444ff464646ff464646ff464646ff434343fb48484897545454135b5b5b036868686f616161ef626262ff636363ff636363ff636363ff555555ff464646ff464646ff464646ff454545ff444444e54a4a4a5fffffff01ffffff01ffffff01ffffff013b3b3bd7505050ff646464ff636363ff636363ff636363ff636363ff444444ff464646ff464646ff464646ff454545ff3a3a3aff33333357313131113c3c3cff5a5a5aff646464ff636363ff636363ff636363ff555555ff464646ff464646ff464646ff464646ff424242ff383838f1ffffff01ffffff01ffffff01ffffff013a3a3ad5353535ff3a3a3aff575757ff646464ff626262ff636363ff444444ff464646ff464646ff3d3d3dff353535ff363636ff3636365535353511363636ff343434ff434343ff606060ff636363ff636363ff555555ff464646ff464646ff444444ff393939ff353535ff373737edffffff01ffffff01ffffff01ffffff013a3a3ad5363636ff363636ff343434ff3f3f3fff5d5d5dff646464ff444444ff404040ff363636ff353535ff363636ff363636ff3636365535353511363636ff363636ff363636ff343434ff4a4a4aff636363ff555555ff454545ff3c3c3cff353535ff363636ff363636ff373737edffffff01ffffff01ffffff01ffffff013a3a3ad5363636ff363636ff363636ff363636ff353535ff3f3f3fff363636ff353535ff363636ff363636ff363636ff363636ff3636365535353511363636ff363636ff363636ff363636ff353535ff383838ff3a3a3aff373737ff353535ff363636ff363636ff363636ff373737edffffff01ffffff01ffffff01ffffff013a3a3ad5363636ff363636ff363636ff323232ff181818ff0e0e0eff171717ff282828ff373737ff363636ff363636ff363636ff3636365535353511363636ff363636ff353535ff373737ff292929ff0f0f0fff111111ff1b1b1bff2f2f2fff373737ff363636ff363636ff373737edffffff01ffffff01ffffff01ffffff013a3a3ad5363636ff363636ff1e1e1eff0b0b0bff0d0d0dff0f0f0fff171717ff161616ff191919ff2c2c2cff373737ff363636ff3636365535353511363636ff373737ff2f2f2fff141414ff0b0b0bff0d0d0dff131313ff171717ff151515ff1f1f1fff333333ff363636ff373737edffffff01ffffff01ffffff01ffffff013b3b3bd5252525ff0d0d0dff0c0c0cff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff151515ff1c1c1cff313131ff3535355734343411333333ff1a1a1aff0b0b0bff0d0d0dff0d0d0dff0d0d0dff131313ff171717ff171717ff171717ff161616ff242424ff373737efffffff01ffffff01ffffff01ffffff012020205d0b0b0be50b0b0bff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff131313ff161616b73333331f3b3b3b05111111970a0a0afb0d0d0dff0d0d0dff0d0d0dff0d0d0dff131313ff171717ff171717ff171717ff161616ff141414f51c1c1c7fffffff01ffffff01ffffff01ffffff01ffffff014d4d4d0b1212127f0a0a0af50d0d0dff0d0d0dff0f0f0fff171717ff171717ff151515ff151515d522222249ffffff017373731b51515121ffffff011d1d1d2b101010b50a0a0aff0d0d0dff0d0d0dff131313ff171717ff171717ff131313ff181818a12e2e2e1dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012c2c2c1b0f0f0fa10a0a0afd0f0f0fff161616ff141414e91b1b1b69656565057878780b6363637b626262f3464646f7454545896969690fffffff011c1c1c470c0c0cd30b0b0bff131313ff141414ff151515c32a2a2a37ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff011d1d1d35111111bd1a1a1a8d2f2f2f11ffffff0166666659616161e1626262ff646464ff474747ff454545ff444444e9494949677b7b7b054040400517171769131313cd24242455ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0169696939626262c7616161ff636363ff636363ff646464ff474747ff464646ff464646ff444444ff454545d14e4e4e45ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01424242615e5e5eff636363ff636363ff636363ff636363ff646464ff474747ff464646ff464646ff464646ff464646ff434343ff3f3f3f77ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679343434ff494949ff636363ff636363ff636363ff646464ff474747ff464646ff464646ff474747ff3d3d3dff353535ff3a3a3a8dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679363636ff353535ff363636ff505050ff646464ff636363ff474747ff484848ff2f2f2fff1c1c1cff323232ff363636ff3a3a3a8dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679363636ff363636ff363636ff353535ff3a3a3aff5a5a5aff393939ff0f0f0fff040404ff111111ff151515ff232323ff3535358fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679363636ff363636ff363636ff363636ff323232ff171717ff2a2a2aff0c0c0cff030303ff111111ff141414fb171717992e2e2e17a3a3a305ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679363636ff363636ff363636ff1f1f1fff0b0b0bff0d0d0dff363636ff383838ff242424ff121212bf2a2a2a2dffffff01ffffff018484842b636363bf6d6d6d2fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679373737ff252525ff0d0d0dff0c0c0cff0d0d0dff0d0d0dff373737ff363636ff353535ff39393949ffffff01ffffff01ffffff0186868629646464ff656565fb6464649b55555505ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012e2e2e650e0e0eff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0c0c0cff353535ff363636ff353535ff37373749ffffff01ffffff01ffffff0185858529656565ff525252ff353535ff4b4b4b0fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff011c1c1c430d0d0dcf0b0b0bff0d0d0dff0d0d0dff0d0d0dff171717ff282828ff363636ff37373749ffffff01ffffff01ffffff0144444459363636ff353535ff353535ff4e4e4e0fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0162626203161616630b0b0be70c0c0cff0d0d0dff171717ff161616ff171717ed3737372fffffff013e3e3e2b303030b72a2a2aff151515ff262626ff363636ff4b4b4b0fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636360d101010850a0a0af7141414f91717178f45454511ffffff014c4c4c252c2c2cdb303030ff2d2d2dff151515ff131313ff1b1b1bad5a5a5a07ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012b2b2b2121212127ffffff01ffffff01ffffff01ffffff0161616109313131752b2b2bf1131313cd26262641ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014e4e4e1359595903ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000300000006000000001002000000000008025000000000000000000000000000000000000ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0173737357545454997c7c7c11ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0176767663515151916c6c6c0dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017676762d636363bb636363ff4d4d4dff434343eb4f4f4f6d7f7f7f05ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0176767635616161c3626262ff494949ff424242e94f4f4f6392929203ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017e7e7e19626262955f5f5ffd626262ff666666ff4f4f4fff464646ff424242ff434343d75a5a5a49ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017777771d6464649f5f5f5fff636363ff656565ff4b4b4bff464646ff424242ff444444d158585841ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018585850966666677606060ef626262ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff414141ff464646b75d5d5d2dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018989890d6868687f5f5f5ff5626262ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff404040ff484848b160606027ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff016a6a6a55626262df606060ff636363ff636363ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff464646ff454545ff424242fd484848956a6a6a17ffffff01ffffff01ffffff01ffffff01ffffff016969695f606060e3606060ff636363ff636363ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff464646ff454545ff414141f94a4a4a8d65656513ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff016e6e6e3b656565c15f5f5fff636363ff636363ff636363ff636363ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff464646ff464646ff464646ff444444ff424242ed52525277ffffff01ffffff016c6c6c37676767c95f5f5fff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff464646ff464646ff464646ff434343ff444444e94d4d4d6dffffff01ffffff01ffffff01ffffff01ffffff01ffffff013c3c3cc5454545ff646464ff646464ff636363ff636363ff636363ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff464646ff464646ff464646ff474747ff424242ff333333fb34343409ffffff0131313199494949ff656565ff646464ff636363ff636363ff636363ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff464646ff464646ff464646ff474747ff414141ff373737ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf333333ff343434ff4f4f4fff666666ff636363ff636363ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff464646ff474747ff444444ff383838ff343434ff363636f737373707ffffff0135353597343434ff343434ff525252ff666666ff636363ff636363ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff464646ff474747ff444444ff383838ff343434ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff333333ff383838ff585858ff676767ff636363ff636363ff666666ff4f4f4fff464646ff464646ff474747ff464646ff3b3b3bff343434ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff333333ff383838ff5a5a5aff666666ff636363ff636363ff656565ff4b4b4bff464646ff464646ff474747ff454545ff3a3a3aff343434ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff363636ff323232ff3d3d3dff5d5d5dff666666ff666666ff4f4f4fff464646ff474747ff3e3e3eff353535ff353535ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff363636ff313131ff3f3f3fff5f5f5fff666666ff656565ff4b4b4bff464646ff474747ff3d3d3dff353535ff353535ff363636ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff363636ff363636ff353535ff323232ff444444ff676767ff525252ff404040ff363636ff353535ff363636ff363636ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff363636ff363636ff353535ff323232ff464646ff676767ff4e4e4eff404040ff363636ff353535ff363636ff363636ff363636ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff363636ff363636ff363636ff353535ff383838ff2d2d2dff2b2b2bff373737ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff363636ff363636ff363636ff363636ff383838ff2c2c2cff2a2a2aff373737ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff363636ff353535ff383838ff343434ff171717ff090909ff151515ff171717ff2d2d2dff383838ff363636ff363636ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff363636ff353535ff383838ff333333ff151515ff090909ff151515ff181818ff2f2f2fff383838ff363636ff363636ff363636ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff373737ff373737ff1f1f1fff090909ff0c0c0cff0c0c0cff171717ff171717ff141414ff1b1b1bff323232ff383838ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff373737ff373737ff1d1d1dff0a0a0aff0c0c0cff0c0c0cff171717ff171717ff141414ff1c1c1cff333333ff383838ff353535ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff393939ff272727ff0c0c0cff0b0b0bff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff161616ff141414ff202020ff353535ff373737ff363636ff363636f737373707ffffff0135353597363636ff363636ff383838ff252525ff0b0b0bff0b0b0bff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff161616ff141414ff222222ff363636ff373737ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf383838ff2d2d2dff101010ff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff161616ff141414ff262626ff373737ff373737f737373707ffffff0136363697393939ff2b2b2bff0f0f0fff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff161616ff151515ff272727ff383838ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013a3a3abd131313ff090909ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff171717ff262626fb38383807ffffff012a2a2a97121212ff090909ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff161616ff2a2a2ae7ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015f5f5f0b1616167b090909ef0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff171717ff171717ff0f0f0fff181818b74040402dffffff01ffffff014646461118181883080808f30b0b0bff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff171717ff161616ff101010ff181818b141414127ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014d4d4d171212129b090909fd0c0c0cff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff111111ff141414d335353547ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013838381d131313a5060606ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff111111ff181818cd2e2e2e3dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01333333310f0f0fbb070707ff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff141414ff121212e72424246d86868603ffffff01ffffff017373732b656565b9464646c95e5e5e3bffffff01ffffff01ffffff01323232370e0e0ec3080808ff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff121212ff161616e525252563ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012525254d0e0e0ed9090909ff0c0c0cff171717ff151515ff121212f91d1d1d894d4d4d13ffffff01ffffff0178787815656565935f5f5ffb646464ff484848ff404040ff454545a96a6a6a1fffffff01ffffff01ffffff011b1b1b570e0e0edf080808ff0d0d0dff171717ff151515ff0f0f0ff3212121815656560dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01636363071a1a1a710a0a0aed0f0f0fff1b1b1bad2f2f2f23ffffff01ffffff018d8d8d0566666675616161eb616161ff636363ff646464ff484848ff464646ff454545ff424242f54c4c4c856262620fffffff01ffffff014040400b21212179080808f10f0f0fff1b1b1ba15757571dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014141411740404037ffffff01ffffff01ffffff016a6a6a4d616161db606060ff636363ff636363ff636363ff646464ff484848ff464646ff464646ff464646ff434343ff434343e751515167ffffff01ffffff01ffffff014646461d30303033ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0176767631616161c35f5f5fff636363ff636363ff636363ff636363ff636363ff646464ff484848ff464646ff464646ff464646ff464646ff464646ff424242ff454545d158585841ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015252527f636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff646464ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff434343ff454545a1ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01313131b53b3b3bff5b5b5bff676767ff636363ff636363ff636363ff636363ff636363ff646464ff484848ff464646ff464646ff464646ff464646ff464646ff474747ff444444ff393939ff383838d3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff323232ff404040ff616161ff656565ff626262ff636363ff636363ff646464ff484848ff464646ff464646ff454545ff494949ff474747ff3b3b3bff343434ff353535ff3a3a3ad3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff353535ff323232ff484848ff656565ff646464ff636363ff646464ff484848ff464646ff474747ff494949ff242424ff282828ff383838ff363636ff363636ff3a3a3ad3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff363636ff343434ff343434ff515151ff666666ff656565ff484848ff4b4b4bff323232ff070707ff040404ff151515ff181818ff2f2f2fff383838ff3a3a3ad3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff363636ff363636ff363636ff333333ff383838ff5f5f5fff3c3c3cff0f0f0fff020202ff050505ff050505ff171717ff171717ff141414ff1c1c1cff323232d7ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff363636ff363636ff353535ff383838ff343434ff161616ff2a2a2aff0c0c0cff020202ff050505ff050505ff171717ff171717ff101010ff161616bf2e2e2e35ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff363636ff373737ff383838ff1f1f1fff0a0a0aff0c0c0cff373737ff3a3a3aff262626ff060606ff040404ff121212ff151515dd30303051ffffff01ffffff01ffffff018787872d6b6b6b47ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff393939ff272727ff0d0d0dff0b0b0bff0d0d0dff0d0d0dff373737ff363636ff373737ff383838ff1c1c1cf92020207568686807ffffff01ffffff01ffffff01ffffff018686863d5f5f5fff676767af77777721ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff393939ff2e2e2eff101010ff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff373737ff363636ff363636ff353535ff373737ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff018686863d626262ff666666ff646464f76969698d9494940fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01383838b5333333ff161616ff090909ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff373737ff363636ff363636ff363636ff353535ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff018686863d626262ff676767ff6b6b6bff555555ff3a3a3a93ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0125252589030303ff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff333333ff383838ff353535ff363636ff353535ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff018585853d666666ff5f5f5fff3c3c3cff313131ff3a3a3a93ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012d2d2d3f0e0e0ecb080808ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff141414ff222222ff363636ff373737ff353535ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff0177777741414141ff313131ff363636ff353535ff3a3a3a93ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff011e1e1e5f0a0a0ae50a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff171717ff161616ff151515ff282828ff353535f3ffffff01ffffff01ffffff01ffffff016e6e6e0b37373781242424f1191919ff333333ff383838ff343434ff3a3a3a93ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015a5a5a0d1919197f0a0a0af30b0b0bff0d0d0dff0d0d0dff171717ff171717ff161616ff0f0f0ffb24242489ffffff01ffffff01ffffff013e3e3e5d2d2d2de52e2e2eff2b2b2bff151515ff141414ff212121ff363636ff3b3b3b95ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636361b111111a3080808ff0c0c0cff181818ff0f0f0fff171717b545454525ffffff01ffffff017f7f7f05363636c7282828ff313131ff313131ff2b2b2bff151515ff171717ff161616ff0c0c0cfb3434346bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01303030350f0f0fc7121212d337373741ffffff01ffffff01ffffff01ffffff01ffffff016b6b6b0b3a3a3a7d2c2c2cf12f2f2fff2b2b2bff151515ff101010ff171717bb4646462dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01515151193535359b242424ff131313d72828284bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014e4e4e2b59595905ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff28000000400000008000000001002000000000000042000000000000000000000000000000000000ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0176767635666666914e4e4e457c7c7c09ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018080801569696989545454696c6c6c0bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018484840d70707061616161d5606060fb3d3d3ddf4e4e4e9172727213ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017070704d626262b35f5f5ffb464646f1454545a16a6a6a33ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017676760f67676753646464cf5e5e5eff656565ff626262ff414141ff404040ff444444e54b4b4b7b69696919ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01979797036c6c6c45676767a95d5d5dff616161ff626262ff484848ff424242ff3e3e3efd4e4e4e8958585831ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017e7e7e2b616161a75f5f5fef616161ff636363ff656565ff626262ff424242ff464646ff444444ff414141fd434343b961616153ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017777771969696981606060e7606060ff636363ff636363ff626262ff484848ff464646ff454545ff424242fd414141d95656566569696911ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01858585056e6e6e29656565995f5f5ff1616161ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff444444ff3f3f3fff484848af5353534b86868607ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01797979216a6a6a6f616161ed5e5e5eff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff3e3e3eff474747d75151515762626213ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01838383036f6f6f755f5f5fd3606060ff626262ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff454545ff434343ff404040e94e4e4e8d5f5f5f1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018f8f8f056b6b6b45616161c95f5f5ff7616161ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff444444ff424242f1434343b16666662dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017070700f6969695f626262d35e5e5eff626262ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff404040ff444444f14d4d4d776a6a6a23ffffff01ffffff01ffffff01ffffff017b7b7b096c6c6c39636363c15f5f5ffb626262ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff434343ff414141f54a4a4aa35b5b5b2d70707007ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0171717143676767a7616161f3616161ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff444444ff414141f7474747cd54545447ffffff01ffffff015b5b5b096b6b6b99646464e1606060ff626262ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff444444ff424242ff414141d552525277ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040b33b3b3bff5c5c5cff656565ff646464ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff474747ff454545ff3a3a3aff313131ad34343407ffffff012e2e2e25383838ff535353ff656565ff656565ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff474747ff464646ff3b3b3bff3a3a3ae9ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9313131ff363636ff484848ff636363ff676767ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff404040ff363636ff343434ff353535a537373705ffffff0135353521333333ff333333ff434343ff5c5c5cff686868ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff484848ff414141ff393939ff313131ff3c3c3cdbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff323232ff353535ff4b4b4bff636363ff656565ff636363ff626262ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff474747ff464646ff414141ff363636ff343434ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff333333ff313131ff484848ff5e5e5eff666666ff646464ff626262ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff474747ff424242ff3a3a3aff343434ff353535ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff343434ff333333ff3d3d3dff555555ff686868ff656565ff626262ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff484848ff444444ff393939ff353535ff353535ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff353535ff323232ff363636ff515151ff646464ff656565ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff484848ff454545ff3d3d3dff353535ff343434ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff343434ff303030ff3f3f3fff575757ff666666ff656565ff646464ff626262ff424242ff464646ff474747ff454545ff3a3a3aff343434ff353535ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff303030ff373737ff535353ff636363ff656565ff636363ff626262ff484848ff464646ff474747ff454545ff3e3e3eff353535ff343434ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff363636ff363636ff333333ff333333ff484848ff606060ff696969ff626262ff434343ff474747ff3e3e3eff363636ff353535ff353535ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff353535ff343434ff333333ff3e3e3eff5d5d5dff686868ff626262ff484848ff474747ff424242ff373737ff353535ff353535ff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff323232ff323232ff505050ff616161ff3d3d3dff373737ff343434ff353535ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff343434ff313131ff434343ff606060ff464646ff383838ff343434ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff3a3a3aff2b2b2bff1e1e1eff2d2d2dff383838ff373737ff353535ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff393939ff323232ff1c1c1cff262626ff373737ff383838ff353535ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff363636ff353535ff373737ff383838ff303030ff191919ff080808ff101010ff141414ff1a1a1aff303030ff383838ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff353535ff363636ff383838ff363636ff1d1d1dff0b0b0bff0c0c0cff141414ff181818ff292929ff373737ff373737ff363636ff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff353535ff393939ff363636ff222222ff0c0c0cff0a0a0aff0c0c0cff121212ff171717ff151515ff161616ff212121ff353535ff393939ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff353535ff383838ff3a3a3aff262626ff121212ff0a0a0aff0c0c0cff0f0f0fff171717ff151515ff151515ff1e1e1eff2f2f2fff3a3a3aff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff383838ff363636ff262626ff0d0d0dff090909ff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff141414ff151515ff232323ff353535ff383838ff363636ff353535ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff353535ff383838ff383838ff292929ff131313ff080808ff0c0c0cff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff151515ff131313ff202020ff313131ff383838ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff353535ff363636ff3a3a3aff2e2e2eff131313ff0a0a0aff0b0b0bff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff161616ff141414ff1a1a1aff2a2a2aff393939ff373737ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff3a3a3aff313131ff1c1c1cff0a0a0aff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff161616ff151515ff161616ff282828ff363636ff383838ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9353535ff383838ff313131ff151515ff080808ff0b0b0bff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff161616ff131313ff1b1b1bff2d2d2dff373737ff373737ff363636a537373705ffffff0134343421363636ff383838ff333333ff1e1e1eff090909ff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff171717ff131313ff171717ff2a2a2aff363636ff353535ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444af353535ff1e1e1eff0d0d0dff0a0a0aff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff151515ff222222ff333333ff353535ad30303007ffffff0134343423373737ff282828ff0d0d0dff0a0a0aff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff141414ff1b1b1bff2e2e2eff3e3e3ee1ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013e3e3e6f0f0f0fd5040404ff0b0b0bff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff101010ff0e0e0ee72f2f2f7347474703ffffff013b3b3b13141414cd050505f70a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff121212ff0c0c0cf12a2a2aa5ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015f5f5f052020202b1a1a1aa1080808f1070707ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff141414ff0c0c0cff212121af2a2a2a496d6d6d07ffffff01ffffff01ffffff01333333231d1d1d730b0b0beb060606ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff0e0e0eff181818d72626265546464615ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014d4d4d29121212af080808ef0a0a0aff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff141414ff121212f9141414b93b3b3b4fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0138383819151515890a0a0ae5080808ff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff161616ff101010fb151515d72c2c2c614444440dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0133333311262626510f0f0fd7050505ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff101010ff141414e7242424733a3a3a19ffffff01ffffff01ffffff01878787097272725f4d4d4d736a6a6a11ffffff01ffffff01ffffff016060600524242445191919ad040404ff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff111111ff0e0e0efd242424873232322dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015c5c5c0d2525255f090909d7080808fb0b0b0bff0d0d0dff0c0c0cff121212ff171717ff171717ff161616ff121212ff121212df2121218965656511ffffff01ffffff01ffffff018080800d6767674b646464d1606060ff454545ff464646df4f4f4f6165656517ffffff01ffffff01ffffff01ffffff012d2d2d4b101010b5060606fb0a0a0aff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff161616ff131313ff101010ef2020209d4242422dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012c2c2c2d1f1f1f83080808fb080808ff0d0d0dff121212ff171717ff141414ff0f0f0ff91e1e1eb12c2c2c354d4d4d09ffffff01ffffff01ffffff0178787825646464a75f5f5feb616161ff656565ff4a4a4aff414141ff424242f3414141bd69696937ffffff01ffffff01ffffff01ffffff0142424219171717710d0d0de3060606ff0c0c0cff0f0f0fff171717ff151515ff0d0d0dff171717c3292929575656560dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013737372d1212129d080808ef0d0d0dff121212f5191919bf2e2e2e3d70707003ffffff01ffffff018c8c8c037676762564646497606060ed606060ff636363ff636363ff656565ff4a4a4aff444444ff464646ff444444ff404040f74a4a4aad5555553162626207ffffff01ffffff01ffffff014040401125252589090909dd0a0a0aff121212ff141414c738383869ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015b5b5b0b1f1f1f591d1d1daf292929673f3f3f19ffffff01ffffff01ffffff01ffffff016d6d6d715f5f5fcd606060ff626262ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff454545ff434343ff414141db4f4f4f857b7b7b11ffffff01ffffff01ffffff0153535307222222331d1d1da91b1b1b8d4141412365656503ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017c7c7c0f6868685d636363cb5e5e5eff626262ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff404040ff454545e14c4c4c6b69696917ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0177777733626262a3606060f3616161ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff464646ff444444ff424242f9454545b55d5d5d49ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014b4b4b0f5e5e5e85626262ff626262ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff444444ff414141ff454545a16464641dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0132323225333333cf4e4e4eff646464ff666666ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff474747ff404040ff303030e35757573bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd313131ff363636ff515151ff636363ff656565ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff414141ff373737ff343434ff323232e159595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff343434ff333333ff3c3c3cff5b5b5bff686868ff636363ff626262ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff454545ff464646ff4c4c4cff454545ff393939ff353535ff353535ff353535ff323232e159595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff353535ff313131ff3f3f3fff5d5d5dff666666ff646464ff626262ff636363ff656565ff4a4a4aff444444ff454545ff474747ff4a4a4aff404040ff212121ff2f2f2fff373737ff373737ff353535ff363636ff323232e159595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff353535ff333333ff363636ff484848ff646464ff676767ff626262ff656565ff4a4a4aff444444ff4b4b4bff4a4a4aff262626ff0b0b0bff090909ff171717ff252525ff353535ff393939ff363636ff323232e159595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff363636ff363636ff323232ff363636ff4c4c4cff646464ff676767ff4d4d4dff484848ff2c2c2cff0b0b0bff020202ff040404ff0b0b0bff171717ff141414ff161616ff282828ff353535ff343434e359595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff343434ff323232ff3f3f3fff5f5f5fff3a3a3aff161616ff030303ff030303ff050505ff040404ff0b0b0bff171717ff171717ff161616ff151515ff1a1a1aff242424e55555553bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff363636ff363636ff353535ff363636ff383838ff2e2e2eff191919ff262626ff111111ff030303ff030303ff050505ff040404ff0b0b0bff171717ff171717ff151515ff111111f9121212cd272727557d7d7d09ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff363636ff363636ff383838ff373737ff242424ff0b0b0bff0a0a0aff393939ff393939ff222222ff080808ff020202ff030303ff0b0b0bff181818ff0f0f0fff151515f32424247935353525ffffff01ffffff01ffffff01a3a3a30fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff383838ff373737ff272727ff0c0c0cff090909ff0c0c0cff0e0e0eff373737ff363636ff3a3a3aff393939ff1e1e1eff080808ff080808ff0f0f0feb232323914040401dffffff01ffffff01ffffff01ffffff01ffffff018282825d626262c36d6d6d4d8d8d8d09ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff353535ff363636ff3a3a3aff2f2f2fff131313ff0b0b0bff0b0b0bff0d0d0dff0c0c0cff0e0e0eff373737ff363636ff353535ff363636ff393939ff303030ff1c1c1cc92626264d68686807ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01868686515e5e5eff646464e9696969957878781fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff373737ff383838ff313131ff161616ff090909ff0b0b0bff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0e0e0eff373737ff363636ff363636ff363636ff353535ff353535ff3c3c3c8fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0186868651616161ff676767ff646464ff656565f16a6a6a7d7f7f7f25ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723353535cd393939ff373737ff1f1f1fff0d0d0dff0a0a0aff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0e0e0eff373737ff363636ff363636ff363636ff363636ff353535ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0186868651616161ff676767ff666666ff676767ff686868f9555555cd55555511ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0134343425323232cf212121ff0e0e0eff090909ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0e0e0eff383838ff363636ff363636ff363636ff363636ff353535ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0186868651616161ff686868ff696969ff5f5f5fff3d3d3dff303030ff4848481dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01474747132323238f020202ff080808ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0c0c0cff2e2e2eff393939ff363636ff353535ff363636ff353535ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0185858551666666ff676767ff494949ff353535ff323232ff353535ff4e4e4e1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0130303045101010af080808f70a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0d0d0dff131313ff1c1c1cff303030ff373737ff363636ff353535ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0181818151494949ff363636ff313131ff363636ff353535ff363636ff4e4e4e1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0141414113191919690f0f0fdb060606ff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0d0d0dff171717ff151515ff161616ff222222ff363636ff383838ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014d4d4d53272727c1242424ff373737ff373737ff353535ff353535ff363636ff4e4e4e1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01626262091c1c1c830b0b0bd7090909ff0c0c0cff0d0d0dff0d0d0dff0c0c0cff0d0d0dff171717ff171717ff171717ff141414ff151515ff202020ff35353595ffffff01ffffff01ffffff01ffffff017474740540404049343434af2a2a2aff262626ff101010ff191919ff2e2e2eff373737ff363636ff363636ff4e4e4e1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015a5a5a073636362d141414a7080808f5080808ff0d0d0dff0c0c0cff0d0d0dff171717ff171717ff171717ff151515ff0e0e0efb1b1b1bbb3d3d3d29ffffff01ffffff01ffffff0151515119393939892a2a2ae92d2d2dff323232ff282828ff141414ff151515ff151515ff1f1f1fff343434ff393939ff4949491dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636362f111111b5070707f30a0a0aff0d0d0dff171717ff141414ff111111f5111111c74343433d70707005ffffff01ffffff017c7c7c034e4e4e632a2a2af7292929ff323232ff313131ff323232ff282828ff141414ff171717ff171717ff151515ff0e0e0efd222222e153535315ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012d2d2d151f1f1f590e0e0edb040404ff0f0f0fff171717e7262626673f3f3f1dffffff01ffffff01ffffff01ffffff01ffffff01444444293535358b2d2d2deb2b2b2bff313131ff323232ff282828ff141414ff171717ff121212ff0d0d0dff2222229d2626263dbebebe03ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01505050112626266f1d1d1d7f36363617ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01616161213333339d2c2c2ce92f2f2fff282828ff111111ff111111f7191919ab3c3c3c41ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015151510b3b3b3b43383838c51f1f1fff141414d71e1e1e654f4f4f13ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015858580b4d4d4d4159595909ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000` diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go deleted file mode 100644 index 06be7323e634..000000000000 --- a/swarm/api/manifest.go +++ /dev/null @@ -1,586 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "strings" - "time" - - "github.com/ethereum/go-ethereum/swarm/storage/mru" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -const ( - ManifestType = "application/bzz-manifest+json" - ResourceContentType = "application/bzz-resource" - - manifestSizeLimit = 5 * 1024 * 1024 -) - -// Manifest represents a swarm manifest -type Manifest struct { - Entries []ManifestEntry `json:"entries,omitempty"` -} - -// ManifestEntry represents an entry in a swarm manifest -type ManifestEntry struct { - Hash string `json:"hash,omitempty"` - Path string `json:"path,omitempty"` - ContentType string `json:"contentType,omitempty"` - Mode int64 `json:"mode,omitempty"` - Size int64 `json:"size,omitempty"` - ModTime time.Time `json:"mod_time,omitempty"` - Status int `json:"status,omitempty"` - Access *AccessEntry `json:"access,omitempty"` - ResourceView *mru.View `json:"resourceView,omitempty"` -} - -// ManifestList represents the result of listing files in a manifest -type ManifestList struct { - CommonPrefixes []string `json:"common_prefixes,omitempty"` - Entries []*ManifestEntry `json:"entries,omitempty"` -} - -// NewManifest creates and stores a new, empty manifest -func (a *API) NewManifest(ctx context.Context, toEncrypt bool) (storage.Address, error) { - var manifest Manifest - data, err := json.Marshal(&manifest) - if err != nil { - return nil, err - } - addr, wait, err := a.Store(ctx, bytes.NewReader(data), int64(len(data)), toEncrypt) - if err != nil { - return nil, err - } - err = wait(ctx) - return addr, err -} - -// Manifest hack for supporting Mutable Resource Updates from the bzz: scheme -// see swarm/api/api.go:API.Get() for more information -func (a *API) NewResourceManifest(ctx context.Context, view *mru.View) (storage.Address, error) { - var manifest Manifest - entry := ManifestEntry{ - ResourceView: view, - ContentType: ResourceContentType, - } - manifest.Entries = append(manifest.Entries, entry) - data, err := json.Marshal(&manifest) - if err != nil { - return nil, err - } - addr, wait, err := a.Store(ctx, bytes.NewReader(data), int64(len(data)), false) - if err != nil { - return nil, err - } - err = wait(ctx) - return addr, err -} - -// ManifestWriter is used to add and remove entries from an underlying manifest -type ManifestWriter struct { - api *API - trie *manifestTrie - quitC chan bool -} - -func (a *API) NewManifestWriter(ctx context.Context, addr storage.Address, quitC chan bool) (*ManifestWriter, error) { - trie, err := loadManifest(ctx, a.fileStore, addr, quitC, NOOPDecrypt) - if err != nil { - return nil, fmt.Errorf("error loading manifest %s: %s", addr, err) - } - return &ManifestWriter{a, trie, quitC}, nil -} - -// AddEntry stores the given data and adds the resulting address to the manifest -func (m *ManifestWriter) AddEntry(ctx context.Context, data io.Reader, e *ManifestEntry) (addr storage.Address, err error) { - entry := newManifestTrieEntry(e, nil) - if data != nil { - var wait func(context.Context) error - addr, wait, err = m.api.Store(ctx, data, e.Size, m.trie.encrypted) - if err != nil { - return nil, err - } - err = wait(ctx) - if err != nil { - return nil, err - } - entry.Hash = addr.Hex() - } - if entry.Hash == "" { - return addr, errors.New("missing entry hash") - } - m.trie.addEntry(entry, m.quitC) - return addr, nil -} - -// RemoveEntry removes the given path from the manifest -func (m *ManifestWriter) RemoveEntry(path string) error { - m.trie.deleteEntry(path, m.quitC) - return nil -} - -// Store stores the manifest, returning the resulting storage address -func (m *ManifestWriter) Store() (storage.Address, error) { - return m.trie.ref, m.trie.recalcAndStore() -} - -// ManifestWalker is used to recursively walk the entries in the manifest and -// all of its submanifests -type ManifestWalker struct { - api *API - trie *manifestTrie - quitC chan bool -} - -func (a *API) NewManifestWalker(ctx context.Context, addr storage.Address, decrypt DecryptFunc, quitC chan bool) (*ManifestWalker, error) { - trie, err := loadManifest(ctx, a.fileStore, addr, quitC, decrypt) - if err != nil { - return nil, fmt.Errorf("error loading manifest %s: %s", addr, err) - } - return &ManifestWalker{a, trie, quitC}, nil -} - -// ErrSkipManifest is used as a return value from WalkFn to indicate that the -// manifest should be skipped -var ErrSkipManifest = errors.New("skip this manifest") - -// WalkFn is the type of function called for each entry visited by a recursive -// manifest walk -type WalkFn func(entry *ManifestEntry) error - -// Walk recursively walks the manifest calling walkFn for each entry in the -// manifest, including submanifests -func (m *ManifestWalker) Walk(walkFn WalkFn) error { - return m.walk(m.trie, "", walkFn) -} - -func (m *ManifestWalker) walk(trie *manifestTrie, prefix string, walkFn WalkFn) error { - for _, entry := range &trie.entries { - if entry == nil { - continue - } - entry.Path = prefix + entry.Path - err := walkFn(&entry.ManifestEntry) - if err != nil { - if entry.ContentType == ManifestType && err == ErrSkipManifest { - continue - } - return err - } - if entry.ContentType != ManifestType { - continue - } - if err := trie.loadSubTrie(entry, nil); err != nil { - return err - } - if err := m.walk(entry.subtrie, entry.Path, walkFn); err != nil { - return err - } - } - return nil -} - -type manifestTrie struct { - fileStore *storage.FileStore - entries [257]*manifestTrieEntry // indexed by first character of basePath, entries[256] is the empty basePath entry - ref storage.Address // if ref != nil, it is stored - encrypted bool - decrypt DecryptFunc -} - -func newManifestTrieEntry(entry *ManifestEntry, subtrie *manifestTrie) *manifestTrieEntry { - return &manifestTrieEntry{ - ManifestEntry: *entry, - subtrie: subtrie, - } -} - -type manifestTrieEntry struct { - ManifestEntry - - subtrie *manifestTrie -} - -func loadManifest(ctx context.Context, fileStore *storage.FileStore, addr storage.Address, quitC chan bool, decrypt DecryptFunc) (trie *manifestTrie, err error) { // non-recursive, subtrees are downloaded on-demand - log.Trace("manifest lookup", "addr", addr) - // retrieve manifest via FileStore - manifestReader, isEncrypted := fileStore.Retrieve(ctx, addr) - log.Trace("reader retrieved", "addr", addr) - return readManifest(manifestReader, addr, fileStore, isEncrypted, quitC, decrypt) -} - -func readManifest(mr storage.LazySectionReader, addr storage.Address, fileStore *storage.FileStore, isEncrypted bool, quitC chan bool, decrypt DecryptFunc) (trie *manifestTrie, err error) { // non-recursive, subtrees are downloaded on-demand - - // TODO check size for oversized manifests - size, err := mr.Size(mr.Context(), quitC) - if err != nil { // size == 0 - // can't determine size means we don't have the root chunk - log.Trace("manifest not found", "addr", addr) - err = fmt.Errorf("Manifest not Found") - return - } - if size > manifestSizeLimit { - log.Warn("manifest exceeds size limit", "addr", addr, "size", size, "limit", manifestSizeLimit) - err = fmt.Errorf("Manifest size of %v bytes exceeds the %v byte limit", size, manifestSizeLimit) - return - } - manifestData := make([]byte, size) - read, err := mr.Read(manifestData) - if int64(read) < size { - log.Trace("manifest not found", "addr", addr) - if err == nil { - err = fmt.Errorf("Manifest retrieval cut short: read %v, expect %v", read, size) - } - return - } - - log.Debug("manifest retrieved", "addr", addr) - var man struct { - Entries []*manifestTrieEntry `json:"entries"` - } - err = json.Unmarshal(manifestData, &man) - if err != nil { - err = fmt.Errorf("Manifest %v is malformed: %v", addr.Log(), err) - log.Trace("malformed manifest", "addr", addr) - return - } - - log.Trace("manifest entries", "addr", addr, "len", len(man.Entries)) - - trie = &manifestTrie{ - fileStore: fileStore, - encrypted: isEncrypted, - decrypt: decrypt, - } - for _, entry := range man.Entries { - err = trie.addEntry(entry, quitC) - if err != nil { - return - } - } - return -} - -func (mt *manifestTrie) addEntry(entry *manifestTrieEntry, quitC chan bool) error { - mt.ref = nil // trie modified, hash needs to be re-calculated on demand - - if entry.ManifestEntry.Access != nil { - if mt.decrypt == nil { - return errors.New("dont have decryptor") - } - - err := mt.decrypt(&entry.ManifestEntry) - if err != nil { - return err - } - } - - if len(entry.Path) == 0 { - mt.entries[256] = entry - return nil - } - - b := entry.Path[0] - oldentry := mt.entries[b] - if (oldentry == nil) || (oldentry.Path == entry.Path && oldentry.ContentType != ManifestType) { - mt.entries[b] = entry - return nil - } - - cpl := 0 - for (len(entry.Path) > cpl) && (len(oldentry.Path) > cpl) && (entry.Path[cpl] == oldentry.Path[cpl]) { - cpl++ - } - - if (oldentry.ContentType == ManifestType) && (cpl == len(oldentry.Path)) { - if mt.loadSubTrie(oldentry, quitC) != nil { - return nil - } - entry.Path = entry.Path[cpl:] - oldentry.subtrie.addEntry(entry, quitC) - oldentry.Hash = "" - return nil - } - - commonPrefix := entry.Path[:cpl] - - subtrie := &manifestTrie{ - fileStore: mt.fileStore, - encrypted: mt.encrypted, - } - entry.Path = entry.Path[cpl:] - oldentry.Path = oldentry.Path[cpl:] - subtrie.addEntry(entry, quitC) - subtrie.addEntry(oldentry, quitC) - - mt.entries[b] = newManifestTrieEntry(&ManifestEntry{ - Path: commonPrefix, - ContentType: ManifestType, - }, subtrie) - return nil -} - -func (mt *manifestTrie) getCountLast() (cnt int, entry *manifestTrieEntry) { - for _, e := range &mt.entries { - if e != nil { - cnt++ - entry = e - } - } - return -} - -func (mt *manifestTrie) deleteEntry(path string, quitC chan bool) { - mt.ref = nil // trie modified, hash needs to be re-calculated on demand - - if len(path) == 0 { - mt.entries[256] = nil - return - } - - b := path[0] - entry := mt.entries[b] - if entry == nil { - return - } - if entry.Path == path { - mt.entries[b] = nil - return - } - - epl := len(entry.Path) - if (entry.ContentType == ManifestType) && (len(path) >= epl) && (path[:epl] == entry.Path) { - if mt.loadSubTrie(entry, quitC) != nil { - return - } - entry.subtrie.deleteEntry(path[epl:], quitC) - entry.Hash = "" - // remove subtree if it has less than 2 elements - cnt, lastentry := entry.subtrie.getCountLast() - if cnt < 2 { - if lastentry != nil { - lastentry.Path = entry.Path + lastentry.Path - } - mt.entries[b] = lastentry - } - } -} - -func (mt *manifestTrie) recalcAndStore() error { - if mt.ref != nil { - return nil - } - - var buffer bytes.Buffer - buffer.WriteString(`{"entries":[`) - - list := &Manifest{} - for _, entry := range &mt.entries { - if entry != nil { - if entry.Hash == "" { // TODO: paralellize - err := entry.subtrie.recalcAndStore() - if err != nil { - return err - } - entry.Hash = entry.subtrie.ref.Hex() - } - list.Entries = append(list.Entries, entry.ManifestEntry) - } - - } - - manifest, err := json.Marshal(list) - if err != nil { - return err - } - - sr := bytes.NewReader(manifest) - ctx := context.TODO() - addr, wait, err2 := mt.fileStore.Store(ctx, sr, int64(len(manifest)), mt.encrypted) - if err2 != nil { - return err2 - } - err2 = wait(ctx) - mt.ref = addr - return err2 -} - -func (mt *manifestTrie) loadSubTrie(entry *manifestTrieEntry, quitC chan bool) (err error) { - if entry.ManifestEntry.Access != nil { - if mt.decrypt == nil { - return errors.New("dont have decryptor") - } - - err := mt.decrypt(&entry.ManifestEntry) - if err != nil { - return err - } - } - - if entry.subtrie == nil { - hash := common.Hex2Bytes(entry.Hash) - entry.subtrie, err = loadManifest(context.TODO(), mt.fileStore, hash, quitC, mt.decrypt) - entry.Hash = "" // might not match, should be recalculated - } - return -} - -func (mt *manifestTrie) listWithPrefixInt(prefix, rp string, quitC chan bool, cb func(entry *manifestTrieEntry, suffix string)) error { - plen := len(prefix) - var start, stop int - if plen == 0 { - start = 0 - stop = 256 - } else { - start = int(prefix[0]) - stop = start - } - - for i := start; i <= stop; i++ { - select { - case <-quitC: - return fmt.Errorf("aborted") - default: - } - entry := mt.entries[i] - if entry != nil { - epl := len(entry.Path) - if entry.ContentType == ManifestType { - l := plen - if epl < l { - l = epl - } - if prefix[:l] == entry.Path[:l] { - err := mt.loadSubTrie(entry, quitC) - if err != nil { - return err - } - err = entry.subtrie.listWithPrefixInt(prefix[l:], rp+entry.Path[l:], quitC, cb) - if err != nil { - return err - } - } - } else { - if (epl >= plen) && (prefix == entry.Path[:plen]) { - cb(entry, rp+entry.Path[plen:]) - } - } - } - } - return nil -} - -func (mt *manifestTrie) listWithPrefix(prefix string, quitC chan bool, cb func(entry *manifestTrieEntry, suffix string)) (err error) { - return mt.listWithPrefixInt(prefix, "", quitC, cb) -} - -func (mt *manifestTrie) findPrefixOf(path string, quitC chan bool) (entry *manifestTrieEntry, pos int) { - log.Trace(fmt.Sprintf("findPrefixOf(%s)", path)) - - if len(path) == 0 { - return mt.entries[256], 0 - } - - //see if first char is in manifest entries - b := path[0] - entry = mt.entries[b] - if entry == nil { - return mt.entries[256], 0 - } - - epl := len(entry.Path) - log.Trace(fmt.Sprintf("path = %v entry.Path = %v epl = %v", path, entry.Path, epl)) - if len(path) <= epl { - if entry.Path[:len(path)] == path { - if entry.ContentType == ManifestType { - err := mt.loadSubTrie(entry, quitC) - if err == nil && entry.subtrie != nil { - subentries := entry.subtrie.entries - for i := 0; i < len(subentries); i++ { - sub := subentries[i] - if sub != nil && sub.Path == "" { - return sub, len(path) - } - } - } - entry.Status = http.StatusMultipleChoices - } - pos = len(path) - return - } - return nil, 0 - } - if path[:epl] == entry.Path { - log.Trace(fmt.Sprintf("entry.ContentType = %v", entry.ContentType)) - //the subentry is a manifest, load subtrie - if entry.ContentType == ManifestType && (strings.Contains(entry.Path, path) || strings.Contains(path, entry.Path)) { - err := mt.loadSubTrie(entry, quitC) - if err != nil { - return nil, 0 - } - sub, pos := entry.subtrie.findPrefixOf(path[epl:], quitC) - if sub != nil { - entry = sub - pos += epl - return sub, pos - } else if path == entry.Path { - entry.Status = http.StatusMultipleChoices - } - - } else { - //entry is not a manifest, return it - if path != entry.Path { - return nil, 0 - } - pos = epl - } - } - return nil, 0 -} - -// file system manifest always contains regularized paths -// no leading or trailing slashes, only single slashes inside -func RegularSlashes(path string) (res string) { - for i := 0; i < len(path); i++ { - if (path[i] != '/') || ((i > 0) && (path[i-1] != '/')) { - res = res + path[i:i+1] - } - } - if (len(res) > 0) && (res[len(res)-1] == '/') { - res = res[:len(res)-1] - } - return -} - -func (mt *manifestTrie) getEntry(spath string) (entry *manifestTrieEntry, fullpath string) { - path := RegularSlashes(spath) - var pos int - quitC := make(chan bool) - entry, pos = mt.findPrefixOf(path, quitC) - return entry, path[:pos] -} diff --git a/swarm/api/manifest_test.go b/swarm/api/manifest_test.go deleted file mode 100644 index 1c8e53c43308..000000000000 --- a/swarm/api/manifest_test.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - "testing" - - "github.com/ethereum/go-ethereum/swarm/storage" -) - -func manifest(paths ...string) (manifestReader storage.LazySectionReader) { - var entries []string - for _, path := range paths { - entry := fmt.Sprintf(`{"path":"%s"}`, path) - entries = append(entries, entry) - } - manifest := fmt.Sprintf(`{"entries":[%s]}`, strings.Join(entries, ",")) - return &storage.LazyTestSectionReader{ - SectionReader: io.NewSectionReader(strings.NewReader(manifest), 0, int64(len(manifest))), - } -} - -func testGetEntry(t *testing.T, path, match string, multiple bool, paths ...string) *manifestTrie { - quitC := make(chan bool) - fileStore := storage.NewFileStore(nil, storage.NewFileStoreParams()) - ref := make([]byte, fileStore.HashSize()) - trie, err := readManifest(manifest(paths...), ref, fileStore, false, quitC, NOOPDecrypt) - if err != nil { - t.Errorf("unexpected error making manifest: %v", err) - } - checkEntry(t, path, match, multiple, trie) - return trie -} - -func checkEntry(t *testing.T, path, match string, multiple bool, trie *manifestTrie) { - entry, fullpath := trie.getEntry(path) - if match == "-" && entry != nil { - t.Errorf("expected no match for '%s', got '%s'", path, fullpath) - } else if entry == nil { - if match != "-" { - t.Errorf("expected entry '%s' to match '%s', got no match", match, path) - } - } else if fullpath != match { - t.Errorf("incorrect entry retrieved for '%s'. expected path '%v', got '%s'", path, match, fullpath) - } - - if multiple && entry.Status != http.StatusMultipleChoices { - t.Errorf("Expected %d Multiple Choices Status for path %s, match %s, got %d", http.StatusMultipleChoices, path, match, entry.Status) - } else if !multiple && entry != nil && entry.Status == http.StatusMultipleChoices { - t.Errorf("Were not expecting %d Multiple Choices Status for path %s, match %s, but got it", http.StatusMultipleChoices, path, match) - } -} - -func TestGetEntry(t *testing.T) { - // file system manifest always contains regularized paths - testGetEntry(t, "a", "a", false, "a") - testGetEntry(t, "b", "-", false, "a") - testGetEntry(t, "/a//", "a", false, "a") - // fallback - testGetEntry(t, "/a", "", false, "") - testGetEntry(t, "/a/b", "a/b", false, "a/b") - // longest/deepest math - testGetEntry(t, "read", "read", true, "readme.md", "readit.md") - testGetEntry(t, "rf", "-", false, "readme.md", "readit.md") - testGetEntry(t, "readme", "readme", false, "readme.md") - testGetEntry(t, "readme", "-", false, "readit.md") - testGetEntry(t, "readme.md", "readme.md", false, "readme.md") - testGetEntry(t, "readme.md", "-", false, "readit.md") - testGetEntry(t, "readmeAmd", "-", false, "readit.md") - testGetEntry(t, "readme.mdffff", "-", false, "readme.md") - testGetEntry(t, "ab", "ab", true, "ab/cefg", "ab/cedh", "ab/kkkkkk") - testGetEntry(t, "ab/ce", "ab/ce", true, "ab/cefg", "ab/cedh", "ab/ceuuuuuuuuuu") - testGetEntry(t, "abc", "abc", true, "abcd", "abczzzzef", "abc/def", "abc/e/g") - testGetEntry(t, "a/b", "a/b", true, "a", "a/bc", "a/ba", "a/b/c") - testGetEntry(t, "a/b", "a/b", false, "a", "a/b", "a/bb", "a/b/c") - testGetEntry(t, "//a//b//", "a/b", false, "a", "a/b", "a/bb", "a/b/c") -} - -func TestExactMatch(t *testing.T) { - quitC := make(chan bool) - mf := manifest("shouldBeExactMatch.css", "shouldBeExactMatch.css.map") - fileStore := storage.NewFileStore(nil, storage.NewFileStoreParams()) - ref := make([]byte, fileStore.HashSize()) - trie, err := readManifest(mf, ref, fileStore, false, quitC, nil) - if err != nil { - t.Errorf("unexpected error making manifest: %v", err) - } - entry, _ := trie.getEntry("shouldBeExactMatch.css") - if entry.Path != "" { - t.Errorf("Expected entry to match %s, got: %s", "shouldBeExactMatch.css", entry.Path) - } - if entry.Status == http.StatusMultipleChoices { - t.Errorf("Got status %d, which is unexepcted", http.StatusMultipleChoices) - } -} - -func TestDeleteEntry(t *testing.T) { - -} - -// TestAddFileWithManifestPath tests that adding an entry at a path which -// already exists as a manifest just adds the entry to the manifest rather -// than replacing the manifest with the entry -func TestAddFileWithManifestPath(t *testing.T) { - // create a manifest containing "ab" and "ac" - manifest, _ := json.Marshal(&Manifest{ - Entries: []ManifestEntry{ - {Path: "ab", Hash: "ab"}, - {Path: "ac", Hash: "ac"}, - }, - }) - reader := &storage.LazyTestSectionReader{ - SectionReader: io.NewSectionReader(bytes.NewReader(manifest), 0, int64(len(manifest))), - } - fileStore := storage.NewFileStore(nil, storage.NewFileStoreParams()) - ref := make([]byte, fileStore.HashSize()) - trie, err := readManifest(reader, ref, fileStore, false, nil, NOOPDecrypt) - if err != nil { - t.Fatal(err) - } - checkEntry(t, "ab", "ab", false, trie) - checkEntry(t, "ac", "ac", false, trie) - - // now add path "a" and check we can still get "ab" and "ac" - entry := &manifestTrieEntry{} - entry.Path = "a" - entry.Hash = "a" - trie.addEntry(entry, nil) - checkEntry(t, "ab", "ab", false, trie) - checkEntry(t, "ac", "ac", false, trie) - checkEntry(t, "a", "a", false, trie) -} - -// TestReadManifestOverSizeLimit creates a manifest reader with data longer then -// manifestSizeLimit and checks if readManifest function will return the exact error -// message. -// The manifest data is not in json-encoded format, preventing possbile -// successful parsing attempts if limit check fails. -func TestReadManifestOverSizeLimit(t *testing.T) { - manifest := make([]byte, manifestSizeLimit+1) - reader := &storage.LazyTestSectionReader{ - SectionReader: io.NewSectionReader(bytes.NewReader(manifest), 0, int64(len(manifest))), - } - _, err := readManifest(reader, storage.Address{}, nil, false, nil, NOOPDecrypt) - if err == nil { - t.Fatal("got no error from readManifest") - } - // Error message is part of the http response body - // which justifies exact string validation. - got := err.Error() - want := fmt.Sprintf("Manifest size of %v bytes exceeds the %v byte limit", len(manifest), manifestSizeLimit) - if got != want { - t.Fatalf("got error mesage %q, expected %q", got, want) - } -} diff --git a/swarm/api/storage.go b/swarm/api/storage.go deleted file mode 100644 index 8a48fe5bc004..000000000000 --- a/swarm/api/storage.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "context" - "path" - - "github.com/ethereum/go-ethereum/swarm/storage" -) - -type Response struct { - MimeType string - Status int - Size int64 - // Content []byte - Content string -} - -// implements a service -// -// DEPRECATED: Use the HTTP API instead -type Storage struct { - api *API -} - -func NewStorage(api *API) *Storage { - return &Storage{api} -} - -// Put uploads the content to the swarm with a simple manifest speficying -// its content type -// -// DEPRECATED: Use the HTTP API instead -func (s *Storage) Put(ctx context.Context, content string, contentType string, toEncrypt bool) (storage.Address, func(context.Context) error, error) { - return s.api.Put(ctx, content, contentType, toEncrypt) -} - -// Get retrieves the content from bzzpath and reads the response in full -// It returns the Response object, which serialises containing the -// response body as the value of the Content field -// NOTE: if error is non-nil, sResponse may still have partial content -// the actual size of which is given in len(resp.Content), while the expected -// size is resp.Size -// -// DEPRECATED: Use the HTTP API instead -func (s *Storage) Get(ctx context.Context, bzzpath string) (*Response, error) { - uri, err := Parse(path.Join("bzz:/", bzzpath)) - if err != nil { - return nil, err - } - addr, err := s.api.Resolve(ctx, uri.Addr) - if err != nil { - return nil, err - } - reader, mimeType, status, _, err := s.api.Get(ctx, nil, addr, uri.Path) - if err != nil { - return nil, err - } - quitC := make(chan bool) - expsize, err := reader.Size(ctx, quitC) - if err != nil { - return nil, err - } - body := make([]byte, expsize) - size, err := reader.Read(body) - if int64(size) == expsize { - err = nil - } - return &Response{mimeType, status, expsize, string(body[:size])}, err -} - -// Modify(rootHash, basePath, contentHash, contentType) takes th e manifest trie rooted in rootHash, -// and merge on to it. creating an entry w conentType (mime) -// -// DEPRECATED: Use the HTTP API instead -func (s *Storage) Modify(ctx context.Context, rootHash, path, contentHash, contentType string) (newRootHash string, err error) { - uri, err := Parse("bzz:/" + rootHash) - if err != nil { - return "", err - } - addr, err := s.api.Resolve(ctx, uri.Addr) - if err != nil { - return "", err - } - addr, err = s.api.Modify(ctx, addr, path, contentHash, contentType) - if err != nil { - return "", err - } - return addr.Hex(), nil -} diff --git a/swarm/api/storage_test.go b/swarm/api/storage_test.go deleted file mode 100644 index ef96972b68a6..000000000000 --- a/swarm/api/storage_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "context" - "testing" -) - -func testStorage(t *testing.T, f func(*Storage, bool)) { - testAPI(t, func(api *API, toEncrypt bool) { - f(NewStorage(api), toEncrypt) - }) -} - -func TestStoragePutGet(t *testing.T) { - testStorage(t, func(api *Storage, toEncrypt bool) { - content := "hello" - exp := expResponse(content, "text/plain", 0) - // exp := expResponse([]byte(content), "text/plain", 0) - ctx := context.TODO() - bzzkey, wait, err := api.Put(ctx, content, exp.MimeType, toEncrypt) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - err = wait(ctx) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - bzzhash := bzzkey.Hex() - // to check put against the API#Get - resp0 := testGet(t, api.api, bzzhash, "") - checkResponse(t, resp0, exp) - - // check storage#Get - resp, err := api.Get(context.TODO(), bzzhash) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - checkResponse(t, &testResponse{nil, resp}, exp) - }) -} diff --git a/swarm/api/testapi.go b/swarm/api/testapi.go deleted file mode 100644 index 4c7d0982ba2a..000000000000 --- a/swarm/api/testapi.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "github.com/ethereum/go-ethereum/swarm/network" -) - -type Control struct { - api *API - hive *network.Hive -} - -func NewControl(api *API, hive *network.Hive) *Control { - return &Control{api, hive} -} - -//func (self *Control) BlockNetworkRead(on bool) { -// self.hive.BlockNetworkRead(on) -//} -// -//func (self *Control) SyncEnabled(on bool) { -// self.hive.SyncEnabled(on) -//} -// -//func (self *Control) SwapEnabled(on bool) { -// self.hive.SwapEnabled(on) -//} -// -func (c *Control) Hive() string { - return c.hive.String() -} diff --git a/swarm/api/testdata/test0/img/logo.png b/swarm/api/testdata/test0/img/logo.png deleted file mode 100644 index 9557f960535d..000000000000 Binary files a/swarm/api/testdata/test0/img/logo.png and /dev/null differ diff --git a/swarm/api/testdata/test0/index.css b/swarm/api/testdata/test0/index.css deleted file mode 100644 index 693b13a37c7e..000000000000 --- a/swarm/api/testdata/test0/index.css +++ /dev/null @@ -1,9 +0,0 @@ -h1 { - color: black; - font-size: 12px; - background-color: orange; - border: 4px solid black; -} -body { - background-color: orange -} diff --git a/swarm/api/testdata/test0/index.html b/swarm/api/testdata/test0/index.html deleted file mode 100644 index 321e910d7a28..000000000000 --- a/swarm/api/testdata/test0/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - -

Swarm Test

- Ethereum logo - - \ No newline at end of file diff --git a/swarm/api/uri.go b/swarm/api/uri.go deleted file mode 100644 index 808517088a54..000000000000 --- a/swarm/api/uri.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "fmt" - "net/url" - "regexp" - "strings" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -//matches hex swarm hashes -// TODO: this is bad, it should not be hardcoded how long is a hash -var hashMatcher = regexp.MustCompile("^([0-9A-Fa-f]{64})([0-9A-Fa-f]{64})?$") - -// URI is a reference to content stored in swarm. -type URI struct { - // Scheme has one of the following values: - // - // * bzz - an entry in a swarm manifest - // * bzz-raw - raw swarm content - // * bzz-immutable - immutable URI of an entry in a swarm manifest - // (address is not resolved) - // * bzz-list - list of all files contained in a swarm manifest - // - Scheme string - - // Addr is either a hexadecimal storage address or it an address which - // resolves to a storage address - Addr string - - // addr stores the parsed storage address - addr storage.Address - - // Path is the path to the content within a swarm manifest - Path string -} - -func (u *URI) MarshalJSON() (out []byte, err error) { - return []byte(`"` + u.String() + `"`), nil -} - -func (u *URI) UnmarshalJSON(value []byte) error { - uri, err := Parse(string(value)) - if err != nil { - return err - } - *u = *uri - return nil -} - -// Parse parses rawuri into a URI struct, where rawuri is expected to have one -// of the following formats: -// -// * :/ -// * :/ -// * :// -// * :// -// * :// -// * :/// -// -// with scheme one of bzz, bzz-raw, bzz-immutable, bzz-list or bzz-hash -func Parse(rawuri string) (*URI, error) { - u, err := url.Parse(rawuri) - if err != nil { - return nil, err - } - uri := &URI{Scheme: u.Scheme} - - // check the scheme is valid - switch uri.Scheme { - case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzz-resource": - default: - return nil, fmt.Errorf("unknown scheme %q", u.Scheme) - } - - // handle URIs like bzz:/// where the addr and path - // have already been split by url.Parse - if u.Host != "" { - uri.Addr = u.Host - uri.Path = strings.TrimLeft(u.Path, "/") - return uri, nil - } - - // URI is like bzz:// so split the addr and path from - // the raw path (which will be //) - parts := strings.SplitN(strings.TrimLeft(u.Path, "/"), "/", 2) - uri.Addr = parts[0] - if len(parts) == 2 { - uri.Path = parts[1] - } - return uri, nil -} -func (u *URI) Resource() bool { - return u.Scheme == "bzz-resource" -} - -func (u *URI) Raw() bool { - return u.Scheme == "bzz-raw" -} - -func (u *URI) Immutable() bool { - return u.Scheme == "bzz-immutable" -} - -func (u *URI) List() bool { - return u.Scheme == "bzz-list" -} - -func (u *URI) Hash() bool { - return u.Scheme == "bzz-hash" -} - -func (u *URI) String() string { - return u.Scheme + ":/" + u.Addr + "/" + u.Path -} - -func (u *URI) Address() storage.Address { - if u.addr != nil { - return u.addr - } - if hashMatcher.MatchString(u.Addr) { - u.addr = common.Hex2Bytes(u.Addr) - return u.addr - } - return nil -} diff --git a/swarm/api/uri_test.go b/swarm/api/uri_test.go deleted file mode 100644 index ea649e273c51..000000000000 --- a/swarm/api/uri_test.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "reflect" - "testing" - - "github.com/ethereum/go-ethereum/swarm/storage" -) - -func TestParseURI(t *testing.T) { - type test struct { - uri string - expectURI *URI - expectErr bool - expectRaw bool - expectImmutable bool - expectList bool - expectHash bool - expectDeprecatedRaw bool - expectDeprecatedImmutable bool - expectValidKey bool - expectAddr storage.Address - } - tests := []test{ - { - uri: "", - expectErr: true, - }, - { - uri: "foo", - expectErr: true, - }, - { - uri: "bzz", - expectErr: true, - }, - { - uri: "bzz:", - expectURI: &URI{Scheme: "bzz"}, - }, - { - uri: "bzz-immutable:", - expectURI: &URI{Scheme: "bzz-immutable"}, - expectImmutable: true, - }, - { - uri: "bzz-raw:", - expectURI: &URI{Scheme: "bzz-raw"}, - expectRaw: true, - }, - { - uri: "bzz:/", - expectURI: &URI{Scheme: "bzz"}, - }, - { - uri: "bzz:/abc123", - expectURI: &URI{Scheme: "bzz", Addr: "abc123"}, - }, - { - uri: "bzz:/abc123/path/to/entry", - expectURI: &URI{Scheme: "bzz", Addr: "abc123", Path: "path/to/entry"}, - }, - { - uri: "bzz-raw:/", - expectURI: &URI{Scheme: "bzz-raw"}, - expectRaw: true, - }, - { - uri: "bzz-raw:/abc123", - expectURI: &URI{Scheme: "bzz-raw", Addr: "abc123"}, - expectRaw: true, - }, - { - uri: "bzz-raw:/abc123/path/to/entry", - expectURI: &URI{Scheme: "bzz-raw", Addr: "abc123", Path: "path/to/entry"}, - expectRaw: true, - }, - { - uri: "bzz://", - expectURI: &URI{Scheme: "bzz"}, - }, - { - uri: "bzz://abc123", - expectURI: &URI{Scheme: "bzz", Addr: "abc123"}, - }, - { - uri: "bzz://abc123/path/to/entry", - expectURI: &URI{Scheme: "bzz", Addr: "abc123", Path: "path/to/entry"}, - }, - { - uri: "bzz-hash:", - expectURI: &URI{Scheme: "bzz-hash"}, - expectHash: true, - }, - { - uri: "bzz-hash:/", - expectURI: &URI{Scheme: "bzz-hash"}, - expectHash: true, - }, - { - uri: "bzz-list:", - expectURI: &URI{Scheme: "bzz-list"}, - expectList: true, - }, - { - uri: "bzz-list:/", - expectURI: &URI{Scheme: "bzz-list"}, - expectList: true, - }, - { - uri: "bzz-raw://4378d19c26590f1a818ed7d6a62c3809e149b0999cab5ce5f26233b3b423bf8c", - expectURI: &URI{Scheme: "bzz-raw", - Addr: "4378d19c26590f1a818ed7d6a62c3809e149b0999cab5ce5f26233b3b423bf8c", - }, - expectValidKey: true, - expectRaw: true, - expectAddr: storage.Address{67, 120, 209, 156, 38, 89, 15, 26, - 129, 142, 215, 214, 166, 44, 56, 9, - 225, 73, 176, 153, 156, 171, 92, 229, - 242, 98, 51, 179, 180, 35, 191, 140, - }, - }, - } - for _, x := range tests { - actual, err := Parse(x.uri) - if x.expectErr { - if err == nil { - t.Fatalf("expected %s to error", x.uri) - } - continue - } - if err != nil { - t.Fatalf("error parsing %s: %s", x.uri, err) - } - if !reflect.DeepEqual(actual, x.expectURI) { - t.Fatalf("expected %s to return %#v, got %#v", x.uri, x.expectURI, actual) - } - if actual.Raw() != x.expectRaw { - t.Fatalf("expected %s raw to be %t, got %t", x.uri, x.expectRaw, actual.Raw()) - } - if actual.Immutable() != x.expectImmutable { - t.Fatalf("expected %s immutable to be %t, got %t", x.uri, x.expectImmutable, actual.Immutable()) - } - if actual.List() != x.expectList { - t.Fatalf("expected %s list to be %t, got %t", x.uri, x.expectList, actual.List()) - } - if actual.Hash() != x.expectHash { - t.Fatalf("expected %s hash to be %t, got %t", x.uri, x.expectHash, actual.Hash()) - } - if x.expectValidKey { - if actual.Address() == nil { - t.Fatalf("expected %s to return a valid key, got nil", x.uri) - } else { - if !bytes.Equal(x.expectAddr, actual.Address()) { - t.Fatalf("expected %s to be decoded to %v", x.expectURI.Addr, x.expectAddr) - } - } - } - } -} diff --git a/swarm/bmt/bmt.go b/swarm/bmt/bmt.go deleted file mode 100644 index a85d4369e5b5..000000000000 --- a/swarm/bmt/bmt.go +++ /dev/null @@ -1,690 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package bmt provides a binary merkle tree implementation used for swarm chunk hash -package bmt - -import ( - "fmt" - "hash" - "strings" - "sync" - "sync/atomic" -) - -/* -Binary Merkle Tree Hash is a hash function over arbitrary datachunks of limited size. -It is defined as the root hash of the binary merkle tree built over fixed size segments -of the underlying chunk using any base hash function (e.g., keccak 256 SHA3). -Chunks with data shorter than the fixed size are hashed as if they had zero padding. - -BMT hash is used as the chunk hash function in swarm which in turn is the basis for the -128 branching swarm hash http://swarm-guide.readthedocs.io/en/latest/architecture.html#swarm-hash - -The BMT is optimal for providing compact inclusion proofs, i.e. prove that a -segment is a substring of a chunk starting at a particular offset. -The size of the underlying segments is fixed to the size of the base hash (called the resolution -of the BMT hash), Using Keccak256 SHA3 hash is 32 bytes, the EVM word size to optimize for on-chain BMT verification -as well as the hash size optimal for inclusion proofs in the merkle tree of the swarm hash. - -Two implementations are provided: - -* RefHasher is optimized for code simplicity and meant as a reference implementation - that is simple to understand -* Hasher is optimized for speed taking advantage of concurrency with minimalistic - control structure to coordinate the concurrent routines - - BMT Hasher implements the following interfaces - * standard golang hash.Hash - synchronous, reusable - * SwarmHash - SumWithSpan provided - * io.Writer - synchronous left-to-right datawriter - * AsyncWriter - concurrent section writes and asynchronous Sum call -*/ - -const ( - // PoolSize is the maximum number of bmt trees used by the hashers, i.e, - // the maximum number of concurrent BMT hashing operations performed by the same hasher - PoolSize = 8 -) - -// BaseHasherFunc is a hash.Hash constructor function used for the base hash of the BMT. -// implemented by Keccak256 SHA3 sha3.NewKeccak256 -type BaseHasherFunc func() hash.Hash - -// Hasher a reusable hasher for fixed maximum size chunks representing a BMT -// - implements the hash.Hash interface -// - reuses a pool of trees for amortised memory allocation and resource control -// - supports order-agnostic concurrent segment writes and section (double segment) writes -// as well as sequential read and write -// - the same hasher instance must not be called concurrently on more than one chunk -// - the same hasher instance is synchronously reuseable -// - Sum gives back the tree to the pool and guaranteed to leave -// the tree and itself in a state reusable for hashing a new chunk -// - generates and verifies segment inclusion proofs (TODO:) -type Hasher struct { - pool *TreePool // BMT resource pool - bmt *tree // prebuilt BMT resource for flowcontrol and proofs -} - -// New creates a reusable BMT Hasher that -// pulls a new tree from a resource pool for hashing each chunk -func New(p *TreePool) *Hasher { - return &Hasher{ - pool: p, - } -} - -// TreePool provides a pool of trees used as resources by the BMT Hasher. -// A tree popped from the pool is guaranteed to have a clean state ready -// for hashing a new chunk. -type TreePool struct { - lock sync.Mutex - c chan *tree // the channel to obtain a resource from the pool - hasher BaseHasherFunc // base hasher to use for the BMT levels - SegmentSize int // size of leaf segments, stipulated to be = hash size - SegmentCount int // the number of segments on the base level of the BMT - Capacity int // pool capacity, controls concurrency - Depth int // depth of the bmt trees = int(log2(segmentCount))+1 - Size int // the total length of the data (count * size) - count int // current count of (ever) allocated resources - zerohashes [][]byte // lookup table for predictable padding subtrees for all levels -} - -// NewTreePool creates a tree pool with hasher, segment size, segment count and capacity -// on Hasher.getTree it reuses free trees or creates a new one if capacity is not reached -func NewTreePool(hasher BaseHasherFunc, segmentCount, capacity int) *TreePool { - // initialises the zerohashes lookup table - depth := calculateDepthFor(segmentCount) - segmentSize := hasher().Size() - zerohashes := make([][]byte, depth+1) - zeros := make([]byte, segmentSize) - zerohashes[0] = zeros - h := hasher() - for i := 1; i < depth+1; i++ { - zeros = doSum(h, nil, zeros, zeros) - zerohashes[i] = zeros - } - return &TreePool{ - c: make(chan *tree, capacity), - hasher: hasher, - SegmentSize: segmentSize, - SegmentCount: segmentCount, - Capacity: capacity, - Size: segmentCount * segmentSize, - Depth: depth, - zerohashes: zerohashes, - } -} - -// Drain drains the pool until it has no more than n resources -func (p *TreePool) Drain(n int) { - p.lock.Lock() - defer p.lock.Unlock() - for len(p.c) > n { - <-p.c - p.count-- - } -} - -// Reserve is blocking until it returns an available tree -// it reuses free trees or creates a new one if size is not reached -// TODO: should use a context here -func (p *TreePool) reserve() *tree { - p.lock.Lock() - defer p.lock.Unlock() - var t *tree - if p.count == p.Capacity { - return <-p.c - } - select { - case t = <-p.c: - default: - t = newTree(p.SegmentSize, p.Depth, p.hasher) - p.count++ - } - return t -} - -// release gives back a tree to the pool. -// this tree is guaranteed to be in reusable state -func (p *TreePool) release(t *tree) { - p.c <- t // can never fail ... -} - -// tree is a reusable control structure representing a BMT -// organised in a binary tree -// Hasher uses a TreePool to obtain a tree for each chunk hash -// the tree is 'locked' while not in the pool -type tree struct { - leaves []*node // leaf nodes of the tree, other nodes accessible via parent links - cursor int // index of rightmost currently open segment - offset int // offset (cursor position) within currently open segment - section []byte // the rightmost open section (double segment) - result chan []byte // result channel - span []byte // The span of the data subsumed under the chunk -} - -// node is a reuseable segment hasher representing a node in a BMT -type node struct { - isLeft bool // whether it is left side of the parent double segment - parent *node // pointer to parent node in the BMT - state int32 // atomic increment impl concurrent boolean toggle - left, right []byte // this is where the two children sections are written - hasher hash.Hash // preconstructed hasher on nodes -} - -// newNode constructs a segment hasher node in the BMT (used by newTree) -func newNode(index int, parent *node, hasher hash.Hash) *node { - return &node{ - parent: parent, - isLeft: index%2 == 0, - hasher: hasher, - } -} - -// Draw draws the BMT (badly) -func (t *tree) draw(hash []byte) string { - var left, right []string - var anc []*node - for i, n := range t.leaves { - left = append(left, fmt.Sprintf("%v", hashstr(n.left))) - if i%2 == 0 { - anc = append(anc, n.parent) - } - right = append(right, fmt.Sprintf("%v", hashstr(n.right))) - } - anc = t.leaves - var hashes [][]string - for l := 0; len(anc) > 0; l++ { - var nodes []*node - hash := []string{""} - for i, n := range anc { - hash = append(hash, fmt.Sprintf("%v|%v", hashstr(n.left), hashstr(n.right))) - if i%2 == 0 && n.parent != nil { - nodes = append(nodes, n.parent) - } - } - hash = append(hash, "") - hashes = append(hashes, hash) - anc = nodes - } - hashes = append(hashes, []string{"", fmt.Sprintf("%v", hashstr(hash)), ""}) - total := 60 - del := " " - var rows []string - for i := len(hashes) - 1; i >= 0; i-- { - var textlen int - hash := hashes[i] - for _, s := range hash { - textlen += len(s) - } - if total < textlen { - total = textlen + len(hash) - } - delsize := (total - textlen) / (len(hash) - 1) - if delsize > len(del) { - delsize = len(del) - } - row := fmt.Sprintf("%v: %v", len(hashes)-i-1, strings.Join(hash, del[:delsize])) - rows = append(rows, row) - - } - rows = append(rows, strings.Join(left, " ")) - rows = append(rows, strings.Join(right, " ")) - return strings.Join(rows, "\n") + "\n" -} - -// newTree initialises a tree by building up the nodes of a BMT -// - segment size is stipulated to be the size of the hash -func newTree(segmentSize, depth int, hashfunc func() hash.Hash) *tree { - n := newNode(0, nil, hashfunc()) - prevlevel := []*node{n} - // iterate over levels and creates 2^(depth-level) nodes - // the 0 level is on double segment sections so we start at depth - 2 since - count := 2 - for level := depth - 2; level >= 0; level-- { - nodes := make([]*node, count) - for i := 0; i < count; i++ { - parent := prevlevel[i/2] - var hasher hash.Hash - if level == 0 { - hasher = hashfunc() - } - nodes[i] = newNode(i, parent, hasher) - } - prevlevel = nodes - count *= 2 - } - // the datanode level is the nodes on the last level - return &tree{ - leaves: prevlevel, - result: make(chan []byte), - section: make([]byte, 2*segmentSize), - } -} - -// methods needed to implement hash.Hash - -// Size returns the size -func (h *Hasher) Size() int { - return h.pool.SegmentSize -} - -// BlockSize returns the block size -func (h *Hasher) BlockSize() int { - return 2 * h.pool.SegmentSize -} - -// Sum returns the BMT root hash of the buffer -// using Sum presupposes sequential synchronous writes (io.Writer interface) -// hash.Hash interface Sum method appends the byte slice to the underlying -// data before it calculates and returns the hash of the chunk -// caller must make sure Sum is not called concurrently with Write, writeSection -func (h *Hasher) Sum(b []byte) (s []byte) { - t := h.getTree() - // write the last section with final flag set to true - go h.writeSection(t.cursor, t.section, true, true) - // wait for the result - s = <-t.result - span := t.span - // release the tree resource back to the pool - h.releaseTree() - // b + sha3(span + BMT(pure_chunk)) - if len(span) == 0 { - return append(b, s...) - } - return doSum(h.pool.hasher(), b, span, s) -} - -// methods needed to implement the SwarmHash and the io.Writer interfaces - -// Write calls sequentially add to the buffer to be hashed, -// with every full segment calls writeSection in a go routine -func (h *Hasher) Write(b []byte) (int, error) { - l := len(b) - if l == 0 || l > h.pool.Size { - return 0, nil - } - t := h.getTree() - secsize := 2 * h.pool.SegmentSize - // calculate length of missing bit to complete current open section - smax := secsize - t.offset - // if at the beginning of chunk or middle of the section - if t.offset < secsize { - // fill up current segment from buffer - copy(t.section[t.offset:], b) - // if input buffer consumed and open section not complete, then - // advance offset and return - if smax == 0 { - smax = secsize - } - if l <= smax { - t.offset += l - return l, nil - } - } else { - // if end of a section - if t.cursor == h.pool.SegmentCount*2 { - return 0, nil - } - } - // read full sections and the last possibly partial section from the input buffer - for smax < l { - // section complete; push to tree asynchronously - go h.writeSection(t.cursor, t.section, true, false) - // reset section - t.section = make([]byte, secsize) - // copy from input buffer at smax to right half of section - copy(t.section, b[smax:]) - // advance cursor - t.cursor++ - // smax here represents successive offsets in the input buffer - smax += secsize - } - t.offset = l - smax + secsize - return l, nil -} - -// Reset needs to be called before writing to the hasher -func (h *Hasher) Reset() { - h.releaseTree() -} - -// methods needed to implement the SwarmHash interface - -// ResetWithLength needs to be called before writing to the hasher -// the argument is supposed to be the byte slice binary representation of -// the length of the data subsumed under the hash, i.e., span -func (h *Hasher) ResetWithLength(span []byte) { - h.Reset() - h.getTree().span = span -} - -// releaseTree gives back the Tree to the pool whereby it unlocks -// it resets tree, segment and index -func (h *Hasher) releaseTree() { - t := h.bmt - if t == nil { - return - } - h.bmt = nil - go func() { - t.cursor = 0 - t.offset = 0 - t.span = nil - t.section = make([]byte, h.pool.SegmentSize*2) - select { - case <-t.result: - default: - } - h.pool.release(t) - }() -} - -// NewAsyncWriter extends Hasher with an interface for concurrent segment/section writes -func (h *Hasher) NewAsyncWriter(double bool) *AsyncHasher { - secsize := h.pool.SegmentSize - if double { - secsize *= 2 - } - write := func(i int, section []byte, final bool) { - h.writeSection(i, section, double, final) - } - return &AsyncHasher{ - Hasher: h, - double: double, - secsize: secsize, - write: write, - } -} - -// SectionWriter is an asynchronous segment/section writer interface -type SectionWriter interface { - Reset() // standard init to be called before reuse - Write(index int, data []byte) // write into section of index - Sum(b []byte, length int, span []byte) []byte // returns the hash of the buffer - SectionSize() int // size of the async section unit to use -} - -// AsyncHasher extends BMT Hasher with an asynchronous segment/section writer interface -// AsyncHasher is unsafe and does not check indexes and section data lengths -// it must be used with the right indexes and length and the right number of sections -// -// behaviour is undefined if -// * non-final sections are shorter or longer than secsize -// * if final section does not match length -// * write a section with index that is higher than length/secsize -// * set length in Sum call when length/secsize < maxsec -// -// * if Sum() is not called on a Hasher that is fully written -// a process will block, can be terminated with Reset -// * it will not leak processes if not all sections are written but it blocks -// and keeps the resource which can be released calling Reset() -type AsyncHasher struct { - *Hasher // extends the Hasher - mtx sync.Mutex // to lock the cursor access - double bool // whether to use double segments (call Hasher.writeSection) - secsize int // size of base section (size of hash or double) - write func(i int, section []byte, final bool) -} - -// methods needed to implement AsyncWriter - -// SectionSize returns the size of async section unit to use -func (sw *AsyncHasher) SectionSize() int { - return sw.secsize -} - -// Write writes the i-th section of the BMT base -// this function can and is meant to be called concurrently -// it sets max segment threadsafely -func (sw *AsyncHasher) Write(i int, section []byte) { - sw.mtx.Lock() - defer sw.mtx.Unlock() - t := sw.getTree() - // cursor keeps track of the rightmost section written so far - // if index is lower than cursor then just write non-final section as is - if i < t.cursor { - // if index is not the rightmost, safe to write section - go sw.write(i, section, false) - return - } - // if there is a previous rightmost section safe to write section - if t.offset > 0 { - if i == t.cursor { - // i==cursor implies cursor was set by Hash call so we can write section as final one - // since it can be shorter, first we copy it to the padded buffer - t.section = make([]byte, sw.secsize) - copy(t.section, section) - go sw.write(i, t.section, true) - return - } - // the rightmost section just changed, so we write the previous one as non-final - go sw.write(t.cursor, t.section, false) - } - // set i as the index of the righmost section written so far - // set t.offset to cursor*secsize+1 - t.cursor = i - t.offset = i*sw.secsize + 1 - t.section = make([]byte, sw.secsize) - copy(t.section, section) -} - -// Sum can be called any time once the length and the span is known -// potentially even before all segments have been written -// in such cases Sum will block until all segments are present and -// the hash for the length can be calculated. -// -// b: digest is appended to b -// length: known length of the input (unsafe; undefined if out of range) -// meta: metadata to hash together with BMT root for the final digest -// e.g., span for protection against existential forgery -func (sw *AsyncHasher) Sum(b []byte, length int, meta []byte) (s []byte) { - sw.mtx.Lock() - t := sw.getTree() - if length == 0 { - sw.mtx.Unlock() - s = sw.pool.zerohashes[sw.pool.Depth] - } else { - // for non-zero input the rightmost section is written to the tree asynchronously - // if the actual last section has been written (t.cursor == length/t.secsize) - maxsec := (length - 1) / sw.secsize - if t.offset > 0 { - go sw.write(t.cursor, t.section, maxsec == t.cursor) - } - // set cursor to maxsec so final section is written when it arrives - t.cursor = maxsec - t.offset = length - result := t.result - sw.mtx.Unlock() - // wait for the result or reset - s = <-result - } - // relesase the tree back to the pool - sw.releaseTree() - // if no meta is given just append digest to b - if len(meta) == 0 { - return append(b, s...) - } - // hash together meta and BMT root hash using the pools - return doSum(sw.pool.hasher(), b, meta, s) -} - -// writeSection writes the hash of i-th section into level 1 node of the BMT tree -func (h *Hasher) writeSection(i int, section []byte, double bool, final bool) { - // select the leaf node for the section - var n *node - var isLeft bool - var hasher hash.Hash - var level int - t := h.getTree() - if double { - level++ - n = t.leaves[i] - hasher = n.hasher - isLeft = n.isLeft - n = n.parent - // hash the section - section = doSum(hasher, nil, section) - } else { - n = t.leaves[i/2] - hasher = n.hasher - isLeft = i%2 == 0 - } - // write hash into parent node - if final { - // for the last segment use writeFinalNode - h.writeFinalNode(level, n, hasher, isLeft, section) - } else { - h.writeNode(n, hasher, isLeft, section) - } -} - -// writeNode pushes the data to the node -// if it is the first of 2 sisters written, the routine terminates -// if it is the second, it calculates the hash and writes it -// to the parent node recursively -// since hashing the parent is synchronous the same hasher can be used -func (h *Hasher) writeNode(n *node, bh hash.Hash, isLeft bool, s []byte) { - level := 1 - for { - // at the root of the bmt just write the result to the result channel - if n == nil { - h.getTree().result <- s - return - } - // otherwise assign child hash to left or right segment - if isLeft { - n.left = s - } else { - n.right = s - } - // the child-thread first arriving will terminate - if n.toggle() { - return - } - // the thread coming second now can be sure both left and right children are written - // so it calculates the hash of left|right and pushes it to the parent - s = doSum(bh, nil, n.left, n.right) - isLeft = n.isLeft - n = n.parent - level++ - } -} - -// writeFinalNode is following the path starting from the final datasegment to the -// BMT root via parents -// for unbalanced trees it fills in the missing right sister nodes using -// the pool's lookup table for BMT subtree root hashes for all-zero sections -// otherwise behaves like `writeNode` -func (h *Hasher) writeFinalNode(level int, n *node, bh hash.Hash, isLeft bool, s []byte) { - - for { - // at the root of the bmt just write the result to the result channel - if n == nil { - if s != nil { - h.getTree().result <- s - } - return - } - var noHash bool - if isLeft { - // coming from left sister branch - // when the final section's path is going via left child node - // we include an all-zero subtree hash for the right level and toggle the node. - n.right = h.pool.zerohashes[level] - if s != nil { - n.left = s - // if a left final node carries a hash, it must be the first (and only thread) - // so the toggle is already in passive state no need no call - // yet thread needs to carry on pushing hash to parent - noHash = false - } else { - // if again first thread then propagate nil and calculate no hash - noHash = n.toggle() - } - } else { - // right sister branch - if s != nil { - // if hash was pushed from right child node, write right segment change state - n.right = s - // if toggle is true, we arrived first so no hashing just push nil to parent - noHash = n.toggle() - - } else { - // if s is nil, then thread arrived first at previous node and here there will be two, - // so no need to do anything and keep s = nil for parent - noHash = true - } - } - // the child-thread first arriving will just continue resetting s to nil - // the second thread now can be sure both left and right children are written - // it calculates the hash of left|right and pushes it to the parent - if noHash { - s = nil - } else { - s = doSum(bh, nil, n.left, n.right) - } - // iterate to parent - isLeft = n.isLeft - n = n.parent - level++ - } -} - -// getTree obtains a BMT resource by reserving one from the pool and assigns it to the bmt field -func (h *Hasher) getTree() *tree { - if h.bmt != nil { - return h.bmt - } - t := h.pool.reserve() - h.bmt = t - return t -} - -// atomic bool toggle implementing a concurrent reusable 2-state object -// atomic addint with %2 implements atomic bool toggle -// it returns true if the toggler just put it in the active/waiting state -func (n *node) toggle() bool { - return atomic.AddInt32(&n.state, 1)%2 == 1 -} - -// calculates the hash of the data using hash.Hash -func doSum(h hash.Hash, b []byte, data ...[]byte) []byte { - h.Reset() - for _, v := range data { - h.Write(v) - } - return h.Sum(b) -} - -// hashstr is a pretty printer for bytes used in tree.draw -func hashstr(b []byte) string { - end := len(b) - if end > 4 { - end = 4 - } - return fmt.Sprintf("%x", b[:end]) -} - -// calculateDepthFor calculates the depth (number of levels) in the BMT tree -func calculateDepthFor(n int) (d int) { - c := 2 - for ; c < n; c *= 2 { - d++ - } - return d + 1 -} diff --git a/swarm/bmt/bmt_r.go b/swarm/bmt/bmt_r.go deleted file mode 100644 index 0cb6c146f5d7..000000000000 --- a/swarm/bmt/bmt_r.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package bmt is a simple nonconcurrent reference implementation for hashsize segment based -// Binary Merkle tree hash on arbitrary but fixed maximum chunksize -// -// This implementation does not take advantage of any paralellisms and uses -// far more memory than necessary, but it is easy to see that it is correct. -// It can be used for generating test cases for optimized implementations. -// There is extra check on reference hasher correctness in bmt_test.go -// * TestRefHasher -// * testBMTHasherCorrectness function -package bmt - -import ( - "hash" -) - -// RefHasher is the non-optimized easy-to-read reference implementation of BMT -type RefHasher struct { - maxDataLength int // c * hashSize, where c = 2 ^ ceil(log2(count)), where count = ceil(length / hashSize) - sectionLength int // 2 * hashSize - hasher hash.Hash // base hash func (Keccak256 SHA3) -} - -// NewRefHasher returns a new RefHasher -func NewRefHasher(hasher BaseHasherFunc, count int) *RefHasher { - h := hasher() - hashsize := h.Size() - c := 2 - for ; c < count; c *= 2 { - } - return &RefHasher{ - sectionLength: 2 * hashsize, - maxDataLength: c * hashsize, - hasher: h, - } -} - -// Hash returns the BMT hash of the byte slice -// implements the SwarmHash interface -func (rh *RefHasher) Hash(data []byte) []byte { - // if data is shorter than the base length (maxDataLength), we provide padding with zeros - d := make([]byte, rh.maxDataLength) - length := len(data) - if length > rh.maxDataLength { - length = rh.maxDataLength - } - copy(d, data[:length]) - return rh.hash(d, rh.maxDataLength) -} - -// data has length maxDataLength = segmentSize * 2^k -// hash calls itself recursively on both halves of the given slice -// concatenates the results, and returns the hash of that -// if the length of d is 2 * segmentSize then just returns the hash of that section -func (rh *RefHasher) hash(data []byte, length int) []byte { - var section []byte - if length == rh.sectionLength { - // section contains two data segments (d) - section = data - } else { - // section contains hashes of left and right BMT subtreea - // to be calculated by calling hash recursively on left and right half of d - length /= 2 - section = append(rh.hash(data[:length], length), rh.hash(data[length:], length)...) - } - rh.hasher.Reset() - rh.hasher.Write(section) - return rh.hasher.Sum(nil) -} diff --git a/swarm/bmt/bmt_test.go b/swarm/bmt/bmt_test.go deleted file mode 100644 index 760aa11d8b0f..000000000000 --- a/swarm/bmt/bmt_test.go +++ /dev/null @@ -1,622 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package bmt - -import ( - "bytes" - crand "crypto/rand" - "encoding/binary" - "fmt" - "io" - "math/rand" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto/sha3" -) - -// the actual data length generated (could be longer than max datalength of the BMT) -const BufferSize = 4128 - -const ( - // segmentCount is the maximum number of segments of the underlying chunk - // Should be equal to max-chunk-data-size / hash-size - // Currently set to 128 == 4096 (default chunk size) / 32 (sha3.keccak256 size) - segmentCount = 128 -) - -var counts = []int{1, 2, 3, 4, 5, 8, 9, 15, 16, 17, 32, 37, 42, 53, 63, 64, 65, 111, 127, 128} - -// calculates the Keccak256 SHA3 hash of the data -func sha3hash(data ...[]byte) []byte { - h := sha3.NewKeccak256() - return doSum(h, nil, data...) -} - -// TestRefHasher tests that the RefHasher computes the expected BMT hash for -// some small data lengths -func TestRefHasher(t *testing.T) { - // the test struct is used to specify the expected BMT hash for - // segment counts between from and to and lengths from 1 to datalength - type test struct { - from int - to int - expected func([]byte) []byte - } - - var tests []*test - // all lengths in [0,64] should be: - // - // sha3hash(data) - // - tests = append(tests, &test{ - from: 1, - to: 2, - expected: func(d []byte) []byte { - data := make([]byte, 64) - copy(data, d) - return sha3hash(data) - }, - }) - - // all lengths in [3,4] should be: - // - // sha3hash( - // sha3hash(data[:64]) - // sha3hash(data[64:]) - // ) - // - tests = append(tests, &test{ - from: 3, - to: 4, - expected: func(d []byte) []byte { - data := make([]byte, 128) - copy(data, d) - return sha3hash(sha3hash(data[:64]), sha3hash(data[64:])) - }, - }) - - // all segmentCounts in [5,8] should be: - // - // sha3hash( - // sha3hash( - // sha3hash(data[:64]) - // sha3hash(data[64:128]) - // ) - // sha3hash( - // sha3hash(data[128:192]) - // sha3hash(data[192:]) - // ) - // ) - // - tests = append(tests, &test{ - from: 5, - to: 8, - expected: func(d []byte) []byte { - data := make([]byte, 256) - copy(data, d) - return sha3hash(sha3hash(sha3hash(data[:64]), sha3hash(data[64:128])), sha3hash(sha3hash(data[128:192]), sha3hash(data[192:]))) - }, - }) - - // run the tests - for _, x := range tests { - for segmentCount := x.from; segmentCount <= x.to; segmentCount++ { - for length := 1; length <= segmentCount*32; length++ { - t.Run(fmt.Sprintf("%d_segments_%d_bytes", segmentCount, length), func(t *testing.T) { - data := make([]byte, length) - if _, err := io.ReadFull(crand.Reader, data); err != nil && err != io.EOF { - t.Fatal(err) - } - expected := x.expected(data) - actual := NewRefHasher(sha3.NewKeccak256, segmentCount).Hash(data) - if !bytes.Equal(actual, expected) { - t.Fatalf("expected %x, got %x", expected, actual) - } - }) - } - } - } -} - -// tests if hasher responds with correct hash comparing the reference implementation return value -func TestHasherEmptyData(t *testing.T) { - hasher := sha3.NewKeccak256 - var data []byte - for _, count := range counts { - t.Run(fmt.Sprintf("%d_segments", count), func(t *testing.T) { - pool := NewTreePool(hasher, count, PoolSize) - defer pool.Drain(0) - bmt := New(pool) - rbmt := NewRefHasher(hasher, count) - refHash := rbmt.Hash(data) - expHash := syncHash(bmt, nil, data) - if !bytes.Equal(expHash, refHash) { - t.Fatalf("hash mismatch with reference. expected %x, got %x", refHash, expHash) - } - }) - } -} - -// tests sequential write with entire max size written in one go -func TestSyncHasherCorrectness(t *testing.T) { - data := newData(BufferSize) - hasher := sha3.NewKeccak256 - size := hasher().Size() - - var err error - for _, count := range counts { - t.Run(fmt.Sprintf("segments_%v", count), func(t *testing.T) { - max := count * size - var incr int - capacity := 1 - pool := NewTreePool(hasher, count, capacity) - defer pool.Drain(0) - for n := 0; n <= max; n += incr { - incr = 1 + rand.Intn(5) - bmt := New(pool) - err = testHasherCorrectness(bmt, hasher, data, n, count) - if err != nil { - t.Fatal(err) - } - } - }) - } -} - -// tests order-neutral concurrent writes with entire max size written in one go -func TestAsyncCorrectness(t *testing.T) { - data := newData(BufferSize) - hasher := sha3.NewKeccak256 - size := hasher().Size() - whs := []whenHash{first, last, random} - - for _, double := range []bool{false, true} { - for _, wh := range whs { - for _, count := range counts { - t.Run(fmt.Sprintf("double_%v_hash_when_%v_segments_%v", double, wh, count), func(t *testing.T) { - max := count * size - var incr int - capacity := 1 - pool := NewTreePool(hasher, count, capacity) - defer pool.Drain(0) - for n := 1; n <= max; n += incr { - incr = 1 + rand.Intn(5) - bmt := New(pool) - d := data[:n] - rbmt := NewRefHasher(hasher, count) - exp := rbmt.Hash(d) - got := syncHash(bmt, nil, d) - if !bytes.Equal(got, exp) { - t.Fatalf("wrong sync hash for datalength %v: expected %x (ref), got %x", n, exp, got) - } - sw := bmt.NewAsyncWriter(double) - got = asyncHashRandom(sw, nil, d, wh) - if !bytes.Equal(got, exp) { - t.Fatalf("wrong async hash for datalength %v: expected %x, got %x", n, exp, got) - } - } - }) - } - } - } -} - -// Tests that the BMT hasher can be synchronously reused with poolsizes 1 and PoolSize -func TestHasherReuse(t *testing.T) { - t.Run(fmt.Sprintf("poolsize_%d", 1), func(t *testing.T) { - testHasherReuse(1, t) - }) - t.Run(fmt.Sprintf("poolsize_%d", PoolSize), func(t *testing.T) { - testHasherReuse(PoolSize, t) - }) -} - -// tests if bmt reuse is not corrupting result -func testHasherReuse(poolsize int, t *testing.T) { - hasher := sha3.NewKeccak256 - pool := NewTreePool(hasher, segmentCount, poolsize) - defer pool.Drain(0) - bmt := New(pool) - - for i := 0; i < 100; i++ { - data := newData(BufferSize) - n := rand.Intn(bmt.Size()) - err := testHasherCorrectness(bmt, hasher, data, n, segmentCount) - if err != nil { - t.Fatal(err) - } - } -} - -// Tests if pool can be cleanly reused even in concurrent use by several hasher -func TestBMTConcurrentUse(t *testing.T) { - hasher := sha3.NewKeccak256 - pool := NewTreePool(hasher, segmentCount, PoolSize) - defer pool.Drain(0) - cycles := 100 - errc := make(chan error) - - for i := 0; i < cycles; i++ { - go func() { - bmt := New(pool) - data := newData(BufferSize) - n := rand.Intn(bmt.Size()) - errc <- testHasherCorrectness(bmt, hasher, data, n, 128) - }() - } -LOOP: - for { - select { - case <-time.NewTimer(5 * time.Second).C: - t.Fatal("timed out") - case err := <-errc: - if err != nil { - t.Fatal(err) - } - cycles-- - if cycles == 0 { - break LOOP - } - } - } -} - -// Tests BMT Hasher io.Writer interface is working correctly -// even multiple short random write buffers -func TestBMTWriterBuffers(t *testing.T) { - hasher := sha3.NewKeccak256 - - for _, count := range counts { - t.Run(fmt.Sprintf("%d_segments", count), func(t *testing.T) { - errc := make(chan error) - pool := NewTreePool(hasher, count, PoolSize) - defer pool.Drain(0) - n := count * 32 - bmt := New(pool) - data := newData(n) - rbmt := NewRefHasher(hasher, count) - refHash := rbmt.Hash(data) - expHash := syncHash(bmt, nil, data) - if !bytes.Equal(expHash, refHash) { - t.Fatalf("hash mismatch with reference. expected %x, got %x", refHash, expHash) - } - attempts := 10 - f := func() error { - bmt := New(pool) - bmt.Reset() - var buflen int - for offset := 0; offset < n; offset += buflen { - buflen = rand.Intn(n-offset) + 1 - read, err := bmt.Write(data[offset : offset+buflen]) - if err != nil { - return err - } - if read != buflen { - return fmt.Errorf("incorrect read. expected %v bytes, got %v", buflen, read) - } - } - hash := bmt.Sum(nil) - if !bytes.Equal(hash, expHash) { - return fmt.Errorf("hash mismatch. expected %x, got %x", hash, expHash) - } - return nil - } - - for j := 0; j < attempts; j++ { - go func() { - errc <- f() - }() - } - timeout := time.NewTimer(2 * time.Second) - for { - select { - case err := <-errc: - if err != nil { - t.Fatal(err) - } - attempts-- - if attempts == 0 { - return - } - case <-timeout.C: - t.Fatalf("timeout") - } - } - }) - } -} - -// helper function that compares reference and optimised implementations on -// correctness -func testHasherCorrectness(bmt *Hasher, hasher BaseHasherFunc, d []byte, n, count int) (err error) { - span := make([]byte, 8) - if len(d) < n { - n = len(d) - } - binary.BigEndian.PutUint64(span, uint64(n)) - data := d[:n] - rbmt := NewRefHasher(hasher, count) - exp := sha3hash(span, rbmt.Hash(data)) - got := syncHash(bmt, span, data) - if !bytes.Equal(got, exp) { - return fmt.Errorf("wrong hash: expected %x, got %x", exp, got) - } - return err -} - -// -func BenchmarkBMT(t *testing.B) { - for size := 4096; size >= 128; size /= 2 { - t.Run(fmt.Sprintf("%v_size_%v", "SHA3", size), func(t *testing.B) { - benchmarkSHA3(t, size) - }) - t.Run(fmt.Sprintf("%v_size_%v", "Baseline", size), func(t *testing.B) { - benchmarkBMTBaseline(t, size) - }) - t.Run(fmt.Sprintf("%v_size_%v", "REF", size), func(t *testing.B) { - benchmarkRefHasher(t, size) - }) - t.Run(fmt.Sprintf("%v_size_%v", "BMT", size), func(t *testing.B) { - benchmarkBMT(t, size) - }) - } -} - -type whenHash = int - -const ( - first whenHash = iota - last - random -) - -func BenchmarkBMTAsync(t *testing.B) { - whs := []whenHash{first, last, random} - for size := 4096; size >= 128; size /= 2 { - for _, wh := range whs { - for _, double := range []bool{false, true} { - t.Run(fmt.Sprintf("double_%v_hash_when_%v_size_%v", double, wh, size), func(t *testing.B) { - benchmarkBMTAsync(t, size, wh, double) - }) - } - } - } -} - -func BenchmarkPool(t *testing.B) { - caps := []int{1, PoolSize} - for size := 4096; size >= 128; size /= 2 { - for _, c := range caps { - t.Run(fmt.Sprintf("poolsize_%v_size_%v", c, size), func(t *testing.B) { - benchmarkPool(t, c, size) - }) - } - } -} - -// benchmarks simple sha3 hash on chunks -func benchmarkSHA3(t *testing.B, n int) { - data := newData(n) - hasher := sha3.NewKeccak256 - h := hasher() - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - doSum(h, nil, data) - } -} - -// benchmarks the minimum hashing time for a balanced (for simplicity) BMT -// by doing count/segmentsize parallel hashings of 2*segmentsize bytes -// doing it on n PoolSize each reusing the base hasher -// the premise is that this is the minimum computation needed for a BMT -// therefore this serves as a theoretical optimum for concurrent implementations -func benchmarkBMTBaseline(t *testing.B, n int) { - hasher := sha3.NewKeccak256 - hashSize := hasher().Size() - data := newData(hashSize) - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - count := int32((n-1)/hashSize + 1) - wg := sync.WaitGroup{} - wg.Add(PoolSize) - var i int32 - for j := 0; j < PoolSize; j++ { - go func() { - defer wg.Done() - h := hasher() - for atomic.AddInt32(&i, 1) < count { - doSum(h, nil, data) - } - }() - } - wg.Wait() - } -} - -// benchmarks BMT Hasher -func benchmarkBMT(t *testing.B, n int) { - data := newData(n) - hasher := sha3.NewKeccak256 - pool := NewTreePool(hasher, segmentCount, PoolSize) - bmt := New(pool) - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - syncHash(bmt, nil, data) - } -} - -// benchmarks BMT hasher with asynchronous concurrent segment/section writes -func benchmarkBMTAsync(t *testing.B, n int, wh whenHash, double bool) { - data := newData(n) - hasher := sha3.NewKeccak256 - pool := NewTreePool(hasher, segmentCount, PoolSize) - bmt := New(pool).NewAsyncWriter(double) - idxs, segments := splitAndShuffle(bmt.SectionSize(), data) - shuffle(len(idxs), func(i int, j int) { - idxs[i], idxs[j] = idxs[j], idxs[i] - }) - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - asyncHash(bmt, nil, n, wh, idxs, segments) - } -} - -// benchmarks 100 concurrent bmt hashes with pool capacity -func benchmarkPool(t *testing.B, poolsize, n int) { - data := newData(n) - hasher := sha3.NewKeccak256 - pool := NewTreePool(hasher, segmentCount, poolsize) - cycles := 100 - - t.ReportAllocs() - t.ResetTimer() - wg := sync.WaitGroup{} - for i := 0; i < t.N; i++ { - wg.Add(cycles) - for j := 0; j < cycles; j++ { - go func() { - defer wg.Done() - bmt := New(pool) - syncHash(bmt, nil, data) - }() - } - wg.Wait() - } -} - -// benchmarks the reference hasher -func benchmarkRefHasher(t *testing.B, n int) { - data := newData(n) - hasher := sha3.NewKeccak256 - rbmt := NewRefHasher(hasher, 128) - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - rbmt.Hash(data) - } -} - -func newData(bufferSize int) []byte { - data := make([]byte, bufferSize) - _, err := io.ReadFull(crand.Reader, data) - if err != nil { - panic(err.Error()) - } - return data -} - -// Hash hashes the data and the span using the bmt hasher -func syncHash(h *Hasher, span, data []byte) []byte { - h.ResetWithLength(span) - h.Write(data) - return h.Sum(nil) -} - -func splitAndShuffle(secsize int, data []byte) (idxs []int, segments [][]byte) { - l := len(data) - n := l / secsize - if l%secsize > 0 { - n++ - } - for i := 0; i < n; i++ { - idxs = append(idxs, i) - end := (i + 1) * secsize - if end > l { - end = l - } - section := data[i*secsize : end] - segments = append(segments, section) - } - shuffle(n, func(i int, j int) { - idxs[i], idxs[j] = idxs[j], idxs[i] - }) - return idxs, segments -} - -// splits the input data performs a random shuffle to mock async section writes -func asyncHashRandom(bmt SectionWriter, span []byte, data []byte, wh whenHash) (s []byte) { - idxs, segments := splitAndShuffle(bmt.SectionSize(), data) - return asyncHash(bmt, span, len(data), wh, idxs, segments) -} - -// mock for async section writes for BMT SectionWriter -// requires a permutation (a random shuffle) of list of all indexes of segments -// and writes them in order to the appropriate section -// the Sum function is called according to the wh parameter (first, last, random [relative to segment writes]) -func asyncHash(bmt SectionWriter, span []byte, l int, wh whenHash, idxs []int, segments [][]byte) (s []byte) { - bmt.Reset() - if l == 0 { - return bmt.Sum(nil, l, span) - } - c := make(chan []byte, 1) - hashf := func() { - c <- bmt.Sum(nil, l, span) - } - maxsize := len(idxs) - var r int - if wh == random { - r = rand.Intn(maxsize) - } - for i, idx := range idxs { - bmt.Write(idx, segments[idx]) - if (wh == first || wh == random) && i == r { - go hashf() - } - } - if wh == last { - return bmt.Sum(nil, l, span) - } - return <-c -} - -// this is also in swarm/network_test.go -// shuffle pseudo-randomizes the order of elements. -// n is the number of elements. Shuffle panics if n < 0. -// swap swaps the elements with indexes i and j. -func shuffle(n int, swap func(i, j int)) { - if n < 0 { - panic("invalid argument to Shuffle") - } - - // Fisher-Yates shuffle: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle - // Shuffle really ought not be called with n that doesn't fit in 32 bits. - // Not only will it take a very long time, but with 2³¹! possible permutations, - // there's no way that any PRNG can have a big enough internal state to - // generate even a minuscule percentage of the possible permutations. - // Nevertheless, the right API signature accepts an int n, so handle it as best we can. - i := n - 1 - for ; i > 1<<31-1-1; i-- { - j := int(rand.Int63n(int64(i + 1))) - swap(i, j) - } - for ; i > 0; i-- { - j := int(rand.Int31n(int32(i + 1))) - swap(i, j) - } -} diff --git a/swarm/chunk/chunk.go b/swarm/chunk/chunk.go deleted file mode 100644 index 1449efccd0ef..000000000000 --- a/swarm/chunk/chunk.go +++ /dev/null @@ -1,5 +0,0 @@ -package chunk - -const ( - DefaultSize = 4096 -) diff --git a/swarm/dev/.dockerignore b/swarm/dev/.dockerignore deleted file mode 100644 index f9e69b37f369..000000000000 --- a/swarm/dev/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -bin/* -cluster/* diff --git a/swarm/dev/.gitignore b/swarm/dev/.gitignore deleted file mode 100644 index f9e69b37f369..000000000000 --- a/swarm/dev/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -bin/* -cluster/* diff --git a/swarm/dev/Dockerfile b/swarm/dev/Dockerfile deleted file mode 100644 index 728bdab1fb30..000000000000 --- a/swarm/dev/Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -FROM ubuntu:xenial - -# install build + test dependencies -RUN apt-get update && \ - apt-get install --yes --no-install-recommends \ - ca-certificates \ - curl \ - fuse \ - g++ \ - gcc \ - git \ - iproute2 \ - iputils-ping \ - less \ - libc6-dev \ - make \ - pkg-config \ - && \ - apt-get clean - -# install Go -ENV GO_VERSION 1.8.1 -RUN curl -fSLo golang.tar.gz "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" && \ - tar -xzf golang.tar.gz -C /usr/local && \ - rm golang.tar.gz -ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH - -# install docker CLI -RUN curl -fSLo docker.tar.gz https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz && \ - tar -xzf docker.tar.gz -C /usr/local/bin --strip-components=1 docker/docker && \ - rm docker.tar.gz - -# install jq -RUN curl -fSLo /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && \ - chmod +x /usr/local/bin/jq - -# install govendor -RUN go get -u github.com/kardianos/govendor - -# add custom bashrc -ADD bashrc /root/.bashrc diff --git a/swarm/dev/Makefile b/swarm/dev/Makefile deleted file mode 100644 index 365964b7f56c..000000000000 --- a/swarm/dev/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -.PHONY: build cluster test - -default: build - -build: - go build -o bin/swarm github.com/ethereum/go-ethereum/cmd/swarm - go build -o bin/geth github.com/ethereum/go-ethereum/cmd/geth - go build -o bin/bootnode github.com/ethereum/go-ethereum/cmd/bootnode - -cluster: build - scripts/boot-cluster.sh - -test: - go test -v github.com/ethereum/go-ethereum/swarm/... diff --git a/swarm/dev/README.md b/swarm/dev/README.md deleted file mode 100644 index 81e3b53585e9..000000000000 --- a/swarm/dev/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Swarm development environment -============================= - -The Swarm development environment is a Linux bash shell which can be run in a -Docker container and provides a predictable build and test environment. - -### Start the Docker container - -Run the `run.sh` script to build the Docker image and run it, you will then be -at a bash prompt inside the `swarm/dev` directory. - -### Build binaries - -Run `make` to build the `swarm`, `geth` and `bootnode` binaries into the -`swarm/dev/bin` directory. - -### Boot a cluster - -Run `make cluster` to start a 3 node Swarm cluster, or run -`scripts/boot-cluster.sh --size N` to boot a cluster of size N. diff --git a/swarm/dev/bashrc b/swarm/dev/bashrc deleted file mode 100644 index efb504fa36eb..000000000000 --- a/swarm/dev/bashrc +++ /dev/null @@ -1,21 +0,0 @@ -export ROOT="${GOPATH}/src/github.com/ethereum/go-ethereum" -export PATH="${ROOT}/swarm/dev/bin:${PATH}" - -cd "${ROOT}/swarm/dev" - -cat <&2 <&2 - exit 1 - fi - name="$2" - shift 2 - ;; - -d | --docker-args) - if [[ -z "$2" ]]; then - echo "ERROR: --docker-args flag requires an argument" >&2 - exit 1 - fi - docker_args="$2" - shift 2 - ;; - *) - break - ;; - esac - done - - if [[ $# -ne 0 ]]; then - usage - echo "ERROR: invalid arguments" >&2 - exit 1 - fi -} - -build_image() { - docker build --tag "${name}" "${ROOT}/swarm/dev" -} - -run_image() { - exec docker run \ - --privileged \ - --interactive \ - --tty \ - --rm \ - --hostname "${name}" \ - --name "${name}" \ - --volume "${ROOT}:/go/src/github.com/ethereum/go-ethereum" \ - --volume "/var/run/docker.sock:/var/run/docker.sock" \ - ${docker_args} \ - "${name}" \ - /bin/bash -} - -main "$@" diff --git a/swarm/dev/scripts/boot-cluster.sh b/swarm/dev/scripts/boot-cluster.sh deleted file mode 100755 index 98ae3c8023f0..000000000000 --- a/swarm/dev/scripts/boot-cluster.sh +++ /dev/null @@ -1,288 +0,0 @@ -#!/bin/bash -# -# A script to boot a dev swarm cluster on a Linux host (typically in a Docker -# container started with swarm/dev/run.sh). -# -# The cluster contains a bootnode, a geth node and multiple swarm nodes, with -# each node having its own data directory in a base directory passed with the -# --dir flag (default is swarm/dev/cluster). -# -# To avoid using different ports for each node and to make networking more -# realistic, each node gets its own network namespace with IPs assigned from -# the 192.168.33.0/24 subnet: -# -# bootnode: 192.168.33.2 -# geth: 192.168.33.3 -# swarm: 192.168.33.10{1,2,...,n} - -set -e - -ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" -source "${ROOT}/swarm/dev/scripts/util.sh" - -# DEFAULT_BASE_DIR is the default base directory to store node data -DEFAULT_BASE_DIR="${ROOT}/swarm/dev/cluster" - -# DEFAULT_CLUSTER_SIZE is the default swarm cluster size -DEFAULT_CLUSTER_SIZE=3 - -# Linux bridge configuration for connecting the node network namespaces -BRIDGE_NAME="swarmbr0" -BRIDGE_IP="192.168.33.1" - -# static bootnode configuration -BOOTNODE_IP="192.168.33.2" -BOOTNODE_PORT="30301" -BOOTNODE_KEY="32078f313bea771848db70745225c52c00981589ad6b5b49163f0f5ee852617d" -BOOTNODE_PUBKEY="760c4460e5336ac9bbd87952a3c7ec4363fc0a97bd31c86430806e287b437fd1b01abc6e1db640cf3106b520344af1d58b00b57823db3e1407cbc433e1b6d04d" -BOOTNODE_URL="enode://${BOOTNODE_PUBKEY}@${BOOTNODE_IP}:${BOOTNODE_PORT}" - -# static geth configuration -GETH_IP="192.168.33.3" -GETH_RPC_PORT="8545" -GETH_RPC_URL="http://${GETH_IP}:${GETH_RPC_PORT}" - -usage() { - cat >&2 < "${key_file}" - - local args=( - --addr "${BOOTNODE_IP}:${BOOTNODE_PORT}" - --nodekey "${key_file}" - --verbosity "6" - ) - - start_node "bootnode" "${BOOTNODE_IP}" "$(which bootnode)" ${args[@]} -} - -# start_geth_node starts a geth node with --datadir pointing at /geth -# and a single, unlocked account with password "geth" -start_geth_node() { - local dir="${base_dir}/geth" - mkdir -p "${dir}" - - local password="geth" - echo "${password}" > "${dir}/password" - - # create an account if necessary - if [[ ! -e "${dir}/keystore" ]]; then - info "creating geth account" - create_account "${dir}" "${password}" - fi - - # get the account address - local address="$(jq --raw-output '.address' ${dir}/keystore/*)" - if [[ -z "${address}" ]]; then - fail "failed to get geth account address" - fi - - local args=( - --datadir "${dir}" - --networkid "321" - --bootnodes "${BOOTNODE_URL}" - --unlock "${address}" - --password "${dir}/password" - --rpc - --rpcaddr "${GETH_IP}" - --rpcport "${GETH_RPC_PORT}" - --verbosity "6" - ) - - start_node "geth" "${GETH_IP}" "$(which geth)" ${args[@]} -} - -start_swarm_nodes() { - for i in $(seq 1 ${cluster_size}); do - start_swarm_node "${i}" - done -} - -# start_swarm_node starts a swarm node with a name like "swarmNN" (where NN is -# a zero-padded integer like "07"), --datadir pointing at / -# (e.g. /swarm07) and a single account with as the password -start_swarm_node() { - local num=$1 - local name="swarm$(printf '%02d' ${num})" - local ip="192.168.33.1$(printf '%02d' ${num})" - - local dir="${base_dir}/${name}" - mkdir -p "${dir}" - - local password="${name}" - echo "${password}" > "${dir}/password" - - # create an account if necessary - if [[ ! -e "${dir}/keystore" ]]; then - info "creating account for ${name}" - create_account "${dir}" "${password}" - fi - - # get the account address - local address="$(jq --raw-output '.address' ${dir}/keystore/*)" - if [[ -z "${address}" ]]; then - fail "failed to get swarm account address" - fi - - local args=( - --bootnodes "${BOOTNODE_URL}" - --datadir "${dir}" - --identity "${name}" - --ens-api "${GETH_RPC_URL}" - --bzznetworkid "321" - --bzzaccount "${address}" - --password "${dir}/password" - --verbosity "6" - ) - - start_node "${name}" "${ip}" "$(which swarm)" ${args[@]} -} - -# start_node runs the node command as a daemon in a network namespace -start_node() { - local name="$1" - local ip="$2" - local path="$3" - local cmd_args=${@:4} - - info "starting ${name} with IP ${ip}" - - create_node_network "${name}" "${ip}" - - # add a marker to the log file - cat >> "${log_dir}/${name}.log" <>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -Starting ${name} node - $(date) ->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -EOF - - # run the command in the network namespace using start-stop-daemon to - # daemonise the process, sending all output to the log file - local daemon_args=( - --start - --background - --no-close - --make-pidfile - --pidfile "${pid_dir}/${name}.pid" - --exec "${path}" - ) - if ! ip netns exec "${name}" start-stop-daemon ${daemon_args[@]} -- $cmd_args &>> "${log_dir}/${name}.log"; then - fail "could not start ${name}, check ${log_dir}/${name}.log" - fi -} - -# create_node_network creates a network namespace and connects it to the Linux -# bridge using a veth pair -create_node_network() { - local name="$1" - local ip="$2" - - # create the namespace - ip netns add "${name}" - - # create the veth pair - local veth0="veth${name}0" - local veth1="veth${name}1" - ip link add name "${veth0}" type veth peer name "${veth1}" - - # add one end to the bridge - ip link set dev "${veth0}" master "${BRIDGE_NAME}" - ip link set dev "${veth0}" up - - # add the other end to the namespace, rename it eth0 and give it the ip - ip link set dev "${veth1}" netns "${name}" - ip netns exec "${name}" ip link set dev "${veth1}" name "eth0" - ip netns exec "${name}" ip link set dev "eth0" up - ip netns exec "${name}" ip address add "${ip}/24" dev "eth0" -} - -create_account() { - local dir=$1 - local password=$2 - - geth --datadir "${dir}" --password /dev/stdin account new <<< "${password}" -} - -main "$@" diff --git a/swarm/dev/scripts/random-uploads.sh b/swarm/dev/scripts/random-uploads.sh deleted file mode 100755 index 563a51befcf9..000000000000 --- a/swarm/dev/scripts/random-uploads.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -# -# A script to upload random data to a swarm cluster. -# -# Example: -# -# random-uploads.sh --addr 192.168.33.101:8500 --size 40k --count 1000 - -set -e - -ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" -source "${ROOT}/swarm/dev/scripts/util.sh" - -DEFAULT_ADDR="localhost:8500" -DEFAULT_UPLOAD_SIZE="40k" -DEFAULT_UPLOAD_COUNT="1000" - -usage() { - cat >&2 </dev/null -} - -parse_args() { - while true; do - case "$1" in - -h | --help) - usage - exit 0 - ;; - -a | --addr) - if [[ -z "$2" ]]; then - fail "--addr flag requires an argument" - fi - addr="$2" - shift 2 - ;; - -s | --size) - if [[ -z "$2" ]]; then - fail "--size flag requires an argument" - fi - upload_size="$2" - shift 2 - ;; - -c | --count) - if [[ -z "$2" ]]; then - fail "--count flag requires an argument" - fi - upload_count="$2" - shift 2 - ;; - *) - break - ;; - esac - done - - if [[ $# -ne 0 ]]; then - usage - fail "ERROR: invalid arguments: $@" - fi -} - -main "$@" diff --git a/swarm/dev/scripts/stop-cluster.sh b/swarm/dev/scripts/stop-cluster.sh deleted file mode 100755 index 89cb7b0c9ab7..000000000000 --- a/swarm/dev/scripts/stop-cluster.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash -# -# A script to shutdown a dev swarm cluster. - -set -e - -ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" -source "${ROOT}/swarm/dev/scripts/util.sh" - -DEFAULT_BASE_DIR="${ROOT}/swarm/dev/cluster" - -usage() { - cat >&2 </dev/null; then - ip link delete dev "veth${name}0" - fi -} - -delete_network() { - if ip link show "swarmbr0" &>/dev/null; then - ip link delete dev "swarmbr0" - fi -} - -main "$@" diff --git a/swarm/dev/scripts/util.sh b/swarm/dev/scripts/util.sh deleted file mode 100644 index f17a12e420d0..000000000000 --- a/swarm/dev/scripts/util.sh +++ /dev/null @@ -1,53 +0,0 @@ -# shared shell functions - -info() { - local msg="$@" - local timestamp="$(date +%H:%M:%S)" - say "===> ${timestamp} ${msg}" "green" -} - -warn() { - local msg="$@" - local timestamp=$(date +%H:%M:%S) - say "===> ${timestamp} WARN: ${msg}" "yellow" >&2 -} - -fail() { - local msg="$@" - say "ERROR: ${msg}" "red" >&2 - exit 1 -} - -# say prints the given message to STDOUT, using the optional color if -# STDOUT is a terminal. -# -# usage: -# -# say "foo" - prints "foo" -# say "bar" "red" - prints "bar" in red -# say "baz" "green" - prints "baz" in green -# say "qux" "red" | tee - prints "qux" with no colour -# -say() { - local msg=$1 - local color=$2 - - if [[ -n "${color}" ]] && [[ -t 1 ]]; then - case "${color}" in - red) - echo -e "\033[1;31m${msg}\033[0m" - ;; - green) - echo -e "\033[1;32m${msg}\033[0m" - ;; - yellow) - echo -e "\033[1;33m${msg}\033[0m" - ;; - *) - echo "${msg}" - ;; - esac - else - echo "${msg}" - fi -} diff --git a/swarm/fuse/fuse_dir.go b/swarm/fuse/fuse_dir.go deleted file mode 100644 index 7f66451f1035..000000000000 --- a/swarm/fuse/fuse_dir.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build linux darwin freebsd - -package fuse - -import ( - "os" - "path/filepath" - "sync" - - "bazil.org/fuse" - "bazil.org/fuse/fs" - "github.com/ethereum/go-ethereum/swarm/log" - "golang.org/x/net/context" -) - -var ( - _ fs.Node = (*SwarmDir)(nil) - _ fs.NodeRequestLookuper = (*SwarmDir)(nil) - _ fs.HandleReadDirAller = (*SwarmDir)(nil) - _ fs.NodeCreater = (*SwarmDir)(nil) - _ fs.NodeRemover = (*SwarmDir)(nil) - _ fs.NodeMkdirer = (*SwarmDir)(nil) -) - -type SwarmDir struct { - inode uint64 - name string - path string - directories []*SwarmDir - files []*SwarmFile - - mountInfo *MountInfo - lock *sync.RWMutex -} - -func NewSwarmDir(fullpath string, minfo *MountInfo) *SwarmDir { - log.Debug("swarmfs", "NewSwarmDir", fullpath) - newdir := &SwarmDir{ - inode: NewInode(), - name: filepath.Base(fullpath), - path: fullpath, - directories: []*SwarmDir{}, - files: []*SwarmFile{}, - mountInfo: minfo, - lock: &sync.RWMutex{}, - } - return newdir -} - -func (sd *SwarmDir) Attr(ctx context.Context, a *fuse.Attr) error { - sd.lock.RLock() - defer sd.lock.RUnlock() - a.Inode = sd.inode - a.Mode = os.ModeDir | 0700 - a.Uid = uint32(os.Getuid()) - a.Gid = uint32(os.Getegid()) - return nil -} - -func (sd *SwarmDir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (fs.Node, error) { - log.Debug("swarmfs", "Lookup", req.Name) - for _, n := range sd.files { - if n.name == req.Name { - return n, nil - } - } - for _, n := range sd.directories { - if n.name == req.Name { - return n, nil - } - } - return nil, fuse.ENOENT -} - -func (sd *SwarmDir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { - log.Debug("swarmfs ReadDirAll") - var children []fuse.Dirent - for _, file := range sd.files { - children = append(children, fuse.Dirent{Inode: file.inode, Type: fuse.DT_File, Name: file.name}) - } - for _, dir := range sd.directories { - children = append(children, fuse.Dirent{Inode: dir.inode, Type: fuse.DT_Dir, Name: dir.name}) - } - return children, nil -} - -func (sd *SwarmDir) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) { - log.Debug("swarmfs Create", "path", sd.path, "req.Name", req.Name) - - newFile := NewSwarmFile(sd.path, req.Name, sd.mountInfo) - newFile.fileSize = 0 // 0 means, file is not in swarm yet and it is just created - - sd.lock.Lock() - defer sd.lock.Unlock() - sd.files = append(sd.files, newFile) - - return newFile, newFile, nil -} - -func (sd *SwarmDir) Remove(ctx context.Context, req *fuse.RemoveRequest) error { - log.Debug("swarmfs Remove", "path", sd.path, "req.Name", req.Name) - - if req.Dir && sd.directories != nil { - newDirs := []*SwarmDir{} - for _, dir := range sd.directories { - if dir.name == req.Name { - removeDirectoryFromSwarm(dir) - } else { - newDirs = append(newDirs, dir) - } - } - if len(sd.directories) > len(newDirs) { - sd.lock.Lock() - defer sd.lock.Unlock() - sd.directories = newDirs - } - return nil - } else if !req.Dir && sd.files != nil { - newFiles := []*SwarmFile{} - for _, f := range sd.files { - if f.name == req.Name { - removeFileFromSwarm(f) - } else { - newFiles = append(newFiles, f) - } - } - if len(sd.files) > len(newFiles) { - sd.lock.Lock() - defer sd.lock.Unlock() - sd.files = newFiles - } - return nil - } - return fuse.ENOENT -} - -func (sd *SwarmDir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) { - log.Debug("swarmfs Mkdir", "path", sd.path, "req.Name", req.Name) - newDir := NewSwarmDir(filepath.Join(sd.path, req.Name), sd.mountInfo) - sd.lock.Lock() - defer sd.lock.Unlock() - sd.directories = append(sd.directories, newDir) - - return newDir, nil -} diff --git a/swarm/fuse/fuse_file.go b/swarm/fuse/fuse_file.go deleted file mode 100644 index ca04f737e2a7..000000000000 --- a/swarm/fuse/fuse_file.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build linux darwin freebsd - -package fuse - -import ( - "errors" - "io" - "os" - "sync" - - "bazil.org/fuse" - "bazil.org/fuse/fs" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage" - "golang.org/x/net/context" -) - -const ( - MaxAppendFileSize = 10485760 // 10Mb -) - -var ( - errInvalidOffset = errors.New("Invalid offset during write") - errFileSizeMaxLimixReached = errors.New("File size exceeded max limit") -) - -var ( - _ fs.Node = (*SwarmFile)(nil) - _ fs.HandleReader = (*SwarmFile)(nil) - _ fs.HandleWriter = (*SwarmFile)(nil) -) - -type SwarmFile struct { - inode uint64 - name string - path string - addr storage.Address - fileSize int64 - reader storage.LazySectionReader - - mountInfo *MountInfo - lock *sync.RWMutex -} - -func NewSwarmFile(path, fname string, minfo *MountInfo) *SwarmFile { - newFile := &SwarmFile{ - inode: NewInode(), - name: fname, - path: path, - addr: nil, - fileSize: -1, // -1 means , file already exists in swarm and you need to just get the size from swarm - reader: nil, - - mountInfo: minfo, - lock: &sync.RWMutex{}, - } - return newFile -} - -func (sf *SwarmFile) Attr(ctx context.Context, a *fuse.Attr) error { - log.Debug("swarmfs Attr", "path", sf.path) - sf.lock.Lock() - defer sf.lock.Unlock() - a.Inode = sf.inode - //TODO: need to get permission as argument - a.Mode = 0700 - a.Uid = uint32(os.Getuid()) - a.Gid = uint32(os.Getegid()) - - if sf.fileSize == -1 { - reader, _ := sf.mountInfo.swarmApi.Retrieve(ctx, sf.addr) - quitC := make(chan bool) - size, err := reader.Size(ctx, quitC) - if err != nil { - log.Error("Couldnt get size of file %s : %v", sf.path, err) - return err - } - sf.fileSize = size - log.Trace("swarmfs Attr", "size", size) - close(quitC) - } - a.Size = uint64(sf.fileSize) - return nil -} - -func (sf *SwarmFile) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error { - log.Debug("swarmfs Read", "path", sf.path, "req.String", req.String()) - sf.lock.RLock() - defer sf.lock.RUnlock() - if sf.reader == nil { - sf.reader, _ = sf.mountInfo.swarmApi.Retrieve(ctx, sf.addr) - } - buf := make([]byte, req.Size) - n, err := sf.reader.ReadAt(buf, req.Offset) - if err == io.ErrUnexpectedEOF || err == io.EOF { - err = nil - } - resp.Data = buf[:n] - sf.reader = nil - - return err -} - -func (sf *SwarmFile) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error { - log.Debug("swarmfs Write", "path", sf.path, "req.String", req.String()) - if sf.fileSize == 0 && req.Offset == 0 { - // A new file is created - err := addFileToSwarm(sf, req.Data, len(req.Data)) - if err != nil { - return err - } - resp.Size = len(req.Data) - } else if req.Offset <= sf.fileSize { - totalSize := sf.fileSize + int64(len(req.Data)) - if totalSize > MaxAppendFileSize { - log.Warn("swarmfs Append file size reached (%v) : (%v)", sf.fileSize, len(req.Data)) - return errFileSizeMaxLimixReached - } - - err := appendToExistingFileInSwarm(sf, req.Data, req.Offset, int64(len(req.Data))) - if err != nil { - return err - } - resp.Size = len(req.Data) - } else { - log.Warn("swarmfs Invalid write request size(%v) : off(%v)", sf.fileSize, req.Offset) - return errInvalidOffset - } - return nil -} diff --git a/swarm/fuse/fuse_root.go b/swarm/fuse/fuse_root.go deleted file mode 100644 index b2262d1c5a0d..000000000000 --- a/swarm/fuse/fuse_root.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build linux darwin freebsd - -package fuse - -import ( - "bazil.org/fuse/fs" -) - -var ( - _ fs.Node = (*SwarmDir)(nil) -) - -type SwarmRoot struct { - root *SwarmDir -} - -func (filesystem *SwarmRoot) Root() (fs.Node, error) { - return filesystem.root, nil -} diff --git a/swarm/fuse/swarmfs.go b/swarm/fuse/swarmfs.go deleted file mode 100644 index c7aa983b7dce..000000000000 --- a/swarm/fuse/swarmfs.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package fuse - -import ( - "sync" - "time" - - "github.com/ethereum/go-ethereum/swarm/api" -) - -const ( - Swarmfs_Version = "0.1" - mountTimeout = time.Second * 5 - unmountTimeout = time.Second * 10 - maxFuseMounts = 5 -) - -var ( - swarmfs *SwarmFS // Swarm file system singleton - swarmfsLock sync.Once - - inode uint64 = 1 // global inode - inodeLock sync.RWMutex -) - -type SwarmFS struct { - swarmApi *api.API - activeMounts map[string]*MountInfo - swarmFsLock *sync.RWMutex -} - -func NewSwarmFS(api *api.API) *SwarmFS { - swarmfsLock.Do(func() { - swarmfs = &SwarmFS{ - swarmApi: api, - swarmFsLock: &sync.RWMutex{}, - activeMounts: map[string]*MountInfo{}, - } - }) - return swarmfs - -} - -// Inode numbers need to be unique, they are used for caching inside fuse -func NewInode() uint64 { - inodeLock.Lock() - defer inodeLock.Unlock() - inode += 1 - return inode -} diff --git a/swarm/fuse/swarmfs_fallback.go b/swarm/fuse/swarmfs_fallback.go deleted file mode 100644 index 4864c8689c27..000000000000 --- a/swarm/fuse/swarmfs_fallback.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build !linux,!darwin,!freebsd - -package fuse - -import ( - "errors" -) - -var errNoFUSE = errors.New("FUSE is not supported on this platform") - -func isFUSEUnsupportedError(err error) bool { - return err == errNoFUSE -} - -type MountInfo struct { - MountPoint string - StartManifest string - LatestManifest string -} - -func (self *SwarmFS) Mount(mhash, mountpoint string) (*MountInfo, error) { - return nil, errNoFUSE -} - -func (self *SwarmFS) Unmount(mountpoint string) (bool, error) { - return false, errNoFUSE -} - -func (self *SwarmFS) Listmounts() ([]*MountInfo, error) { - return nil, errNoFUSE -} - -func (self *SwarmFS) Stop() error { - return nil -} diff --git a/swarm/fuse/swarmfs_test.go b/swarm/fuse/swarmfs_test.go deleted file mode 100644 index 87d918550506..000000000000 --- a/swarm/fuse/swarmfs_test.go +++ /dev/null @@ -1,1702 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build linux darwin freebsd - -package fuse - -import ( - "bytes" - "crypto/rand" - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/storage" - - "github.com/ethereum/go-ethereum/log" - - colorable "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 4, "verbosity of logs") - rawlog = flag.Bool("rawlog", false, "turn off terminal formatting in logs") - longrunning = flag.Bool("longrunning", false, "do run long-running tests") -) - -func init() { - flag.Parse() - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(!*rawlog)))) -} - -type fileInfo struct { - perm uint64 - uid int - gid int - contents []byte -} - -//create files from the map of name and content provided and upload them to swarm via api -func createTestFilesAndUploadToSwarm(t *testing.T, api *api.API, files map[string]fileInfo, uploadDir string, toEncrypt bool) string { - - //iterate the map - for fname, finfo := range files { - actualPath := filepath.Join(uploadDir, fname) - filePath := filepath.Dir(actualPath) - - //create directory - err := os.MkdirAll(filePath, 0777) - if err != nil { - t.Fatalf("Error creating directory '%v' : %v", filePath, err) - } - - //create file - fd, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(finfo.perm)) - if err1 != nil { - t.Fatalf("Error creating file %v: %v", actualPath, err1) - } - - //write content to file - _, err = fd.Write(finfo.contents) - if err != nil { - t.Fatalf("Error writing to file '%v' : %v", filePath, err) - } - /* - Note @holisticode: It's not clear why the Chown command was added to the test suite. - Some files are initialized with different permissions in the individual test, - resulting in errors on Chown which were not checked. - After adding the checks tests would fail. - - What's then the reason to have this check in the first place? - Disabling for now - - err = fd.Chown(finfo.uid, finfo.gid) - if err != nil { - t.Fatalf("Error chown file '%v' : %v", filePath, err) - } - */ - err = fd.Chmod(os.FileMode(finfo.perm)) - if err != nil { - t.Fatalf("Error chmod file '%v' : %v", filePath, err) - } - err = fd.Sync() - if err != nil { - t.Fatalf("Error sync file '%v' : %v", filePath, err) - } - err = fd.Close() - if err != nil { - t.Fatalf("Error closing file '%v' : %v", filePath, err) - } - } - - //upload directory to swarm and return hash - bzzhash, err := Upload(uploadDir, "", api, toEncrypt) - if err != nil { - t.Fatalf("Error uploading directory %v: %vm encryption: %v", uploadDir, err, toEncrypt) - } - - return bzzhash -} - -//mount a swarm hash as a directory on files system via FUSE -func mountDir(t *testing.T, api *api.API, files map[string]fileInfo, bzzHash string, mountDir string) *SwarmFS { - swarmfs := NewSwarmFS(api) - _, err := swarmfs.Mount(bzzHash, mountDir) - if isFUSEUnsupportedError(err) { - t.Skip("FUSE not supported:", err) - } else if err != nil { - t.Fatalf("Error mounting hash %v: %v", bzzHash, err) - } - - //check directory is mounted - found := false - mi := swarmfs.Listmounts() - for _, minfo := range mi { - minfo.lock.RLock() - if minfo.MountPoint == mountDir { - if minfo.StartManifest != bzzHash || - minfo.LatestManifest != bzzHash || - minfo.fuseConnection == nil { - minfo.lock.RUnlock() - t.Fatalf("Error mounting: exp(%s): act(%s)", bzzHash, minfo.StartManifest) - } - found = true - } - minfo.lock.RUnlock() - } - - // Test listMounts - if !found { - t.Fatalf("Error getting mounts information for %v: %v", mountDir, err) - } - - // Check if file and their attributes are as expected - compareGeneratedFileWithFileInMount(t, files, mountDir) - - return swarmfs -} - -// Check if file and their attributes are as expected -func compareGeneratedFileWithFileInMount(t *testing.T, files map[string]fileInfo, mountDir string) { - err := filepath.Walk(mountDir, func(path string, f os.FileInfo, err error) error { - if f.IsDir() { - return nil - } - fname := path[len(mountDir)+1:] - if _, ok := files[fname]; !ok { - t.Fatalf(" file %v present in mount dir and is not expected", fname) - } - return nil - }) - if err != nil { - t.Fatalf("Error walking dir %v", mountDir) - } - - for fname, finfo := range files { - destinationFile := filepath.Join(mountDir, fname) - - dfinfo, err := os.Stat(destinationFile) - if err != nil { - t.Fatalf("Destination file %v missing in mount: %v", fname, err) - } - - if int64(len(finfo.contents)) != dfinfo.Size() { - t.Fatalf("file %v Size mismatch source (%v) vs destination(%v)", fname, int64(len(finfo.contents)), dfinfo.Size()) - } - - if dfinfo.Mode().Perm().String() != "-rwx------" { - t.Fatalf("file %v Permission mismatch source (-rwx------) vs destination(%v)", fname, dfinfo.Mode().Perm()) - } - - fileContents, err := ioutil.ReadFile(filepath.Join(mountDir, fname)) - if err != nil { - t.Fatalf("Could not readfile %v : %v", fname, err) - } - if !bytes.Equal(fileContents, finfo.contents) { - t.Fatalf("File %v contents mismatch: %v , %v", fname, fileContents, finfo.contents) - } - // TODO: check uid and gid - } -} - -//check mounted file with provided content -func checkFile(t *testing.T, testMountDir, fname string, contents []byte) { - destinationFile := filepath.Join(testMountDir, fname) - dfinfo, err1 := os.Stat(destinationFile) - if err1 != nil { - t.Fatalf("Could not stat file %v", destinationFile) - } - if dfinfo.Size() != int64(len(contents)) { - t.Fatalf("Mismatch in size actual(%v) vs expected(%v)", dfinfo.Size(), int64(len(contents))) - } - - fd, err2 := os.OpenFile(destinationFile, os.O_RDONLY, os.FileMode(0665)) - if err2 != nil { - t.Fatalf("Could not open file %v", destinationFile) - } - newcontent := make([]byte, len(contents)) - _, err := fd.Read(newcontent) - if err != nil { - t.Fatalf("Could not read from file %v", err) - } - err = fd.Close() - if err != nil { - t.Fatalf("Could not close file %v", err) - } - - if !bytes.Equal(contents, newcontent) { - t.Fatalf("File content mismatch expected (%v): received (%v) ", contents, newcontent) - } -} - -func getRandomBytes(size int) []byte { - contents := make([]byte, size) - rand.Read(contents) - return contents -} - -func isDirEmpty(name string) bool { - f, err := os.Open(name) - if err != nil { - return false - } - defer f.Close() - - _, err = f.Readdirnames(1) - - return err == io.EOF -} - -type testAPI struct { - api *api.API -} - -type testData struct { - testDir string - testUploadDir string - testMountDir string - bzzHash string - files map[string]fileInfo - toEncrypt bool - swarmfs *SwarmFS -} - -//create the root dir of a test -func (ta *testAPI) initSubtest(name string) (*testData, error) { - var err error - d := &testData{} - d.testDir, err = ioutil.TempDir(os.TempDir(), name) - if err != nil { - return nil, fmt.Errorf("Couldn't create test dir: %v", err) - } - return d, nil -} - -//upload data and mount directory -func (ta *testAPI) uploadAndMount(dat *testData, t *testing.T) (*testData, error) { - //create upload dir - err := os.MkdirAll(dat.testUploadDir, 0777) - if err != nil { - return nil, fmt.Errorf("Couldn't create upload dir: %v", err) - } - //create mount dir - err = os.MkdirAll(dat.testMountDir, 0777) - if err != nil { - return nil, fmt.Errorf("Couldn't create mount dir: %v", err) - } - //upload the file - dat.bzzHash = createTestFilesAndUploadToSwarm(t, ta.api, dat.files, dat.testUploadDir, dat.toEncrypt) - log.Debug("Created test files and uploaded to Swarm") - //mount the directory - dat.swarmfs = mountDir(t, ta.api, dat.files, dat.bzzHash, dat.testMountDir) - log.Debug("Mounted swarm fs") - return dat, nil -} - -//add a directory to the test directory tree -func addDir(root string, name string) (string, error) { - d := filepath.Join(root, name) - err := os.MkdirAll(d, 0777) - if err != nil { - return "", fmt.Errorf("Couldn't create dir inside test dir: %v", err) - } - return d, nil -} - -func (ta *testAPI) mountListAndUnmountEncrypted(t *testing.T) { - log.Debug("Starting mountListAndUnmountEncrypted test") - ta.mountListAndUnmount(t, true) - log.Debug("Test mountListAndUnmountEncrypted terminated") -} - -func (ta *testAPI) mountListAndUnmountNonEncrypted(t *testing.T) { - log.Debug("Starting mountListAndUnmountNonEncrypted test") - ta.mountListAndUnmount(t, false) - log.Debug("Test mountListAndUnmountNonEncrypted terminated") -} - -//mount a directory unmount and check the directory is empty afterwards -func (ta *testAPI) mountListAndUnmount(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("mountListAndUnmount") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "testUploadDir") - dat.testMountDir = filepath.Join(dat.testDir, "testMountDir") - dat.files = make(map[string]fileInfo) - - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["2.txt"] = fileInfo{0711, 333, 444, getRandomBytes(10)} - dat.files["3.txt"] = fileInfo{0622, 333, 444, getRandomBytes(100)} - dat.files["4.txt"] = fileInfo{0533, 333, 444, getRandomBytes(1024)} - dat.files["5.txt"] = fileInfo{0544, 333, 444, getRandomBytes(10)} - dat.files["6.txt"] = fileInfo{0555, 333, 444, getRandomBytes(10)} - dat.files["7.txt"] = fileInfo{0666, 333, 444, getRandomBytes(10)} - dat.files["8.txt"] = fileInfo{0777, 333, 333, getRandomBytes(10)} - dat.files["11.txt"] = fileInfo{0777, 333, 444, getRandomBytes(10)} - dat.files["111.txt"] = fileInfo{0777, 333, 444, getRandomBytes(10)} - dat.files["two/2.txt"] = fileInfo{0777, 333, 444, getRandomBytes(10)} - dat.files["two/2/2.txt"] = fileInfo{0777, 333, 444, getRandomBytes(10)} - dat.files["two/2./2.txt"] = fileInfo{0777, 444, 444, getRandomBytes(10)} - dat.files["twice/2.txt"] = fileInfo{0777, 444, 333, getRandomBytes(200)} - dat.files["one/two/three/four/five/six/seven/eight/nine/10.txt"] = fileInfo{0777, 333, 444, getRandomBytes(10240)} - dat.files["one/two/three/four/five/six/six"] = fileInfo{0777, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - // Check unmount - _, err = dat.swarmfs.Unmount(dat.testMountDir) - if err != nil { - t.Fatalf("could not unmount %v", dat.bzzHash) - } - log.Debug("Unmount successful") - if !isDirEmpty(dat.testMountDir) { - t.Fatalf("unmount didnt work for %v", dat.testMountDir) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) maxMountsEncrypted(t *testing.T) { - log.Debug("Starting maxMountsEncrypted test") - ta.runMaxMounts(t, true) - log.Debug("Test maxMountsEncrypted terminated") -} - -func (ta *testAPI) maxMountsNonEncrypted(t *testing.T) { - log.Debug("Starting maxMountsNonEncrypted test") - ta.runMaxMounts(t, false) - log.Debug("Test maxMountsNonEncrypted terminated") -} - -//mount several different directories until the maximum has been reached -func (ta *testAPI) runMaxMounts(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("runMaxMounts") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount1") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload2") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount2") - dat.files["2.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload3") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount3") - dat.files["3.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload4") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount4") - dat.files["4.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload5") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount5") - dat.files["5.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - - //now try an additional mount, should fail due to max mounts reached - testUploadDir6 := filepath.Join(dat.testDir, "max-upload6") - err = os.MkdirAll(testUploadDir6, 0777) - if err != nil { - t.Fatalf("Couldn't create upload dir 6: %v", err) - } - dat.files["6.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - testMountDir6 := filepath.Join(dat.testDir, "max-mount6") - err = os.MkdirAll(testMountDir6, 0777) - if err != nil { - t.Fatalf("Couldn't create mount dir 5: %v", err) - } - bzzHash6 := createTestFilesAndUploadToSwarm(t, ta.api, dat.files, testUploadDir6, toEncrypt) - log.Debug("Created test files and uploaded to swarm with uploadDir6") - _, err = dat.swarmfs.Mount(bzzHash6, testMountDir6) - if err == nil { - t.Fatalf("Expected this mount to fail due to exceeding max number of allowed mounts, but succeeded. %v", bzzHash6) - } - log.Debug("Maximum mount reached, additional mount failed. Correct.") -} - -func (ta *testAPI) remountEncrypted(t *testing.T) { - log.Debug("Starting remountEncrypted test") - ta.remount(t, true) - log.Debug("Test remountEncrypted terminated") -} -func (ta *testAPI) remountNonEncrypted(t *testing.T) { - log.Debug("Starting remountNonEncrypted test") - ta.remount(t, false) - log.Debug("Test remountNonEncrypted terminated") -} - -//test remounting same hash second time and different hash in already mounted point -func (ta *testAPI) remount(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("remount") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "remount-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "remount-mount1") - dat.files = make(map[string]fileInfo) - - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // try mounting the same hash second time - testMountDir2, err2 := addDir(dat.testDir, "remount-mount2") - if err2 != nil { - t.Fatalf("Error creating second mount dir: %v", err2) - } - _, err2 = dat.swarmfs.Mount(dat.bzzHash, testMountDir2) - if err2 != nil { - t.Fatalf("Error mounting hash second time on different dir %v", dat.bzzHash) - } - - // mount a different hash in already mounted point - dat.files["2.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - testUploadDir2, err3 := addDir(dat.testDir, "remount-upload2") - if err3 != nil { - t.Fatalf("Error creating second upload dir: %v", err3) - } - bzzHash2 := createTestFilesAndUploadToSwarm(t, ta.api, dat.files, testUploadDir2, toEncrypt) - _, err = swarmfs.Mount(bzzHash2, dat.testMountDir) - if err == nil { - t.Fatalf("Error mounting hash %v", bzzHash2) - } - log.Debug("Mount on existing mount point failed. Correct.") - - // mount nonexistent hash - failDir, err3 := addDir(dat.testDir, "remount-fail") - if err3 != nil { - t.Fatalf("Error creating remount dir: %v", bzzHash2) - } - failHash := "0xfea11223344" - _, err = swarmfs.Mount(failHash, failDir) - if err == nil { - t.Fatalf("Expected this mount to fail due to non existing hash. But succeeded %v", failHash) - } - log.Debug("Nonexistent hash hasn't been mounted. Correct.") -} - -func (ta *testAPI) unmountEncrypted(t *testing.T) { - log.Debug("Starting unmountEncrypted test") - ta.unmount(t, true) - log.Debug("Test unmountEncrypted terminated") -} - -func (ta *testAPI) unmountNonEncrypted(t *testing.T) { - log.Debug("Starting unmountNonEncrypted test") - ta.unmount(t, false) - log.Debug("Test unmountNonEncrypted terminated") -} - -//mount then unmount and check that it has been unmounted -func (ta *testAPI) unmount(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("unmount") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "ex-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "ex-mount1") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - _, err = dat.swarmfs.Unmount(dat.testMountDir) - if err != nil { - t.Fatalf("could not unmount %v", dat.bzzHash) - } - log.Debug("Unmounted Dir") - - mi := swarmfs.Listmounts() - log.Debug("Going to list mounts") - for _, minfo := range mi { - log.Debug("Mount point in list: ", "point", minfo.MountPoint) - if minfo.MountPoint == dat.testMountDir { - t.Fatalf("mount state not cleaned up in unmount case %v", dat.testMountDir) - } - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) unmountWhenResourceBusyEncrypted(t *testing.T) { - log.Debug("Starting unmountWhenResourceBusyEncrypted test") - ta.unmountWhenResourceBusy(t, true) - log.Debug("Test unmountWhenResourceBusyEncrypted terminated") -} -func (ta *testAPI) unmountWhenResourceBusyNonEncrypted(t *testing.T) { - log.Debug("Starting unmountWhenResourceBusyNonEncrypted test") - ta.unmountWhenResourceBusy(t, false) - log.Debug("Test unmountWhenResourceBusyNonEncrypted terminated") -} - -//unmount while a resource is busy; should fail -func (ta *testAPI) unmountWhenResourceBusy(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("unmountWhenResourceBusy") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "ex-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "ex-mount1") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - //create a file in the mounted directory, then try to unmount - should fail - actualPath := filepath.Join(dat.testMountDir, "2.txt") - //d, err := os.OpenFile(actualPath, os.O_RDWR, os.FileMode(0700)) - d, err := os.Create(actualPath) - if err != nil { - t.Fatalf("Couldn't create new file: %v", err) - } - //we need to manually close the file before mount for this test - //but let's defer too in case of errors - defer d.Close() - _, err = d.Write(getRandomBytes(10)) - if err != nil { - t.Fatalf("Couldn't write to file: %v", err) - } - log.Debug("Bytes written") - - _, err = dat.swarmfs.Unmount(dat.testMountDir) - if err == nil { - t.Fatalf("Expected mount to fail due to resource busy, but it succeeded...") - } - //free resources - err = d.Close() - if err != nil { - t.Fatalf("Couldn't close file! %v", dat.bzzHash) - } - log.Debug("File closed") - - //now unmount after explicitly closed file - _, err = dat.swarmfs.Unmount(dat.testMountDir) - if err != nil { - t.Fatalf("Expected mount to succeed after freeing resource, but it failed: %v", err) - } - //check if the dir is still mounted - mi := dat.swarmfs.Listmounts() - log.Debug("Going to list mounts") - for _, minfo := range mi { - log.Debug("Mount point in list: ", "point", minfo.MountPoint) - if minfo.MountPoint == dat.testMountDir { - t.Fatalf("mount state not cleaned up in unmount case %v", dat.testMountDir) - } - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) seekInMultiChunkFileEncrypted(t *testing.T) { - log.Debug("Starting seekInMultiChunkFileEncrypted test") - ta.seekInMultiChunkFile(t, true) - log.Debug("Test seekInMultiChunkFileEncrypted terminated") -} - -func (ta *testAPI) seekInMultiChunkFileNonEncrypted(t *testing.T) { - log.Debug("Starting seekInMultiChunkFileNonEncrypted test") - ta.seekInMultiChunkFile(t, false) - log.Debug("Test seekInMultiChunkFileNonEncrypted terminated") -} - -//open a file in a mounted dir and go to a certain position -func (ta *testAPI) seekInMultiChunkFile(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("seekInMultiChunkFile") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "seek-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "seek-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10240)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Open the file in the mounted dir and seek the second chunk - actualPath := filepath.Join(dat.testMountDir, "1.txt") - d, err := os.OpenFile(actualPath, os.O_RDONLY, os.FileMode(0700)) - if err != nil { - t.Fatalf("Couldn't open file: %v", err) - } - log.Debug("Opened file") - defer func() { - err := d.Close() - if err != nil { - t.Fatalf("Error closing file! %v", err) - } - }() - - _, err = d.Seek(5000, 0) - if err != nil { - t.Fatalf("Error seeking in file: %v", err) - } - - contents := make([]byte, 1024) - _, err = d.Read(contents) - if err != nil { - t.Fatalf("Error reading file: %v", err) - } - log.Debug("Read contents") - finfo := dat.files["1.txt"] - - if !bytes.Equal(finfo.contents[:6024][5000:], contents) { - t.Fatalf("File seek contents mismatch") - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) createNewFileEncrypted(t *testing.T) { - log.Debug("Starting createNewFileEncrypted test") - ta.createNewFile(t, true) - log.Debug("Test createNewFileEncrypted terminated") -} - -func (ta *testAPI) createNewFileNonEncrypted(t *testing.T) { - log.Debug("Starting createNewFileNonEncrypted test") - ta.createNewFile(t, false) - log.Debug("Test createNewFileNonEncrypted terminated") -} - -//create a new file in a mounted swarm directory, -//unmount the fuse dir and then remount to see if new file is still there -func (ta *testAPI) createNewFile(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("createNewFile") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "create-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "create-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Create a new file in the root dir and check - actualPath := filepath.Join(dat.testMountDir, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not open file %s : %v", actualPath, err1) - } - defer d.Close() - log.Debug("Opened file") - contents := make([]byte, 11) - _, err = rand.Read(contents) - if err != nil { - t.Fatalf("Could not rand read contents %v", err) - } - log.Debug("content read") - _, err = d.Write(contents) - if err != nil { - t.Fatalf("Couldn't write contents: %v", err) - } - log.Debug("content written") - err = d.Close() - if err != nil { - t.Fatalf("Couldn't close file: %v", err) - } - log.Debug("file closed") - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - testMountDir2, err3 := addDir(dat.testDir, "create-mount2") - if err3 != nil { - t.Fatalf("Error creating mount dir2: %v", err3) - } - // mount again and see if things are okay - dat.files["2.txt"] = fileInfo{0700, 333, 444, contents} - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - - checkFile(t, testMountDir2, "2.txt", contents) - _, err2 = dat.swarmfs.Unmount(testMountDir2) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) createNewFileInsideDirectoryEncrypted(t *testing.T) { - log.Debug("Starting createNewFileInsideDirectoryEncrypted test") - ta.createNewFileInsideDirectory(t, true) - log.Debug("Test createNewFileInsideDirectoryEncrypted terminated") -} - -func (ta *testAPI) createNewFileInsideDirectoryNonEncrypted(t *testing.T) { - log.Debug("Starting createNewFileInsideDirectoryNonEncrypted test") - ta.createNewFileInsideDirectory(t, false) - log.Debug("Test createNewFileInsideDirectoryNonEncrypted terminated") -} - -//create a new file inside a directory inside the mount -func (ta *testAPI) createNewFileInsideDirectory(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("createNewFileInsideDirectory") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "createinsidedir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "createinsidedir-mount") - dat.files = make(map[string]fileInfo) - dat.files["one/1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Create a new file inside a existing dir and check - dirToCreate := filepath.Join(dat.testMountDir, "one") - actualPath := filepath.Join(dirToCreate, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err1) - } - defer d.Close() - log.Debug("File opened") - contents := make([]byte, 11) - _, err = rand.Read(contents) - if err != nil { - t.Fatalf("Error filling random bytes into byte array %v", err) - } - log.Debug("Content read") - _, err = d.Write(contents) - if err != nil { - t.Fatalf("Error writing random bytes into file %v", err) - } - log.Debug("Content written") - err = d.Close() - if err != nil { - t.Fatalf("Error closing file %v", err) - } - log.Debug("File closed") - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - testMountDir2, err3 := addDir(dat.testDir, "createinsidedir-mount2") - if err3 != nil { - t.Fatalf("Error creating mount dir2: %v", err3) - } - // mount again and see if things are okay - dat.files["one/2.txt"] = fileInfo{0700, 333, 444, contents} - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - - checkFile(t, testMountDir2, "one/2.txt", contents) - _, err = dat.swarmfs.Unmount(testMountDir2) - if err != nil { - t.Fatalf("could not unmount %v", dat.bzzHash) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) createNewFileInsideNewDirectoryEncrypted(t *testing.T) { - log.Debug("Starting createNewFileInsideNewDirectoryEncrypted test") - ta.createNewFileInsideNewDirectory(t, true) - log.Debug("Test createNewFileInsideNewDirectoryEncrypted terminated") -} - -func (ta *testAPI) createNewFileInsideNewDirectoryNonEncrypted(t *testing.T) { - log.Debug("Starting createNewFileInsideNewDirectoryNonEncrypted test") - ta.createNewFileInsideNewDirectory(t, false) - log.Debug("Test createNewFileInsideNewDirectoryNonEncrypted terminated") -} - -//create a new directory in mount and a new file -func (ta *testAPI) createNewFileInsideNewDirectory(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("createNewFileInsideNewDirectory") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "createinsidenewdir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "createinsidenewdir-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Create a new file inside a existing dir and check - dirToCreate, err2 := addDir(dat.testMountDir, "one") - if err2 != nil { - t.Fatalf("Error creating mount dir2: %v", err2) - } - actualPath := filepath.Join(dirToCreate, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err1) - } - defer d.Close() - log.Debug("File opened") - contents := make([]byte, 11) - _, err = rand.Read(contents) - if err != nil { - t.Fatalf("Error writing random bytes to byte array: %v", err) - } - log.Debug("content read") - _, err = d.Write(contents) - if err != nil { - t.Fatalf("Error writing to file: %v", err) - } - log.Debug("content written") - err = d.Close() - if err != nil { - t.Fatalf("Error closing file: %v", err) - } - log.Debug("File closed") - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - // mount again and see if things are okay - dat.files["one/2.txt"] = fileInfo{0700, 333, 444, contents} - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, dat.testMountDir) - log.Debug("Directory mounted again") - - checkFile(t, dat.testMountDir, "one/2.txt", contents) - _, err2 = dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeExistingFileEncrypted(t *testing.T) { - log.Debug("Starting removeExistingFileEncrypted test") - ta.removeExistingFile(t, true) - log.Debug("Test removeExistingFileEncrypted terminated") -} - -func (ta *testAPI) removeExistingFileNonEncrypted(t *testing.T) { - log.Debug("Starting removeExistingFileNonEncrypted test") - ta.removeExistingFile(t, false) - log.Debug("Test removeExistingFileNonEncrypted terminated") -} - -//remove existing file in mount -func (ta *testAPI) removeExistingFile(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeExistingFile") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "remove-upload") - dat.testMountDir = filepath.Join(dat.testDir, "remove-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Remove a file in the root dir and check - actualPath := filepath.Join(dat.testMountDir, "five.txt") - err = os.Remove(actualPath) - if err != nil { - t.Fatalf("Error removing file! %v", err) - } - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - // mount again and see if things are okay - delete(dat.files, "five.txt") - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, dat.testMountDir) - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err2 = dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeExistingFileInsideDirEncrypted(t *testing.T) { - log.Debug("Starting removeExistingFileInsideDirEncrypted test") - ta.removeExistingFileInsideDir(t, true) - log.Debug("Test removeExistingFileInsideDirEncrypted terminated") -} - -func (ta *testAPI) removeExistingFileInsideDirNonEncrypted(t *testing.T) { - log.Debug("Starting removeExistingFileInsideDirNonEncrypted test") - ta.removeExistingFileInsideDir(t, false) - log.Debug("Test removeExistingFileInsideDirNonEncrypted terminated") -} - -//remove a file inside a directory inside a mount -func (ta *testAPI) removeExistingFileInsideDir(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeExistingFileInsideDir") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "remove-upload") - dat.testMountDir = filepath.Join(dat.testDir, "remove-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["one/five.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["one/six.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Remove a file in the root dir and check - actualPath := filepath.Join(dat.testMountDir, "one") - actualPath = filepath.Join(actualPath, "five.txt") - err = os.Remove(actualPath) - if err != nil { - t.Fatalf("Error removing file! %v", err) - } - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - // mount again and see if things are okay - delete(dat.files, "one/five.txt") - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, dat.testMountDir) - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - - okPath := filepath.Join(dat.testMountDir, "one") - okPath = filepath.Join(okPath, "six.txt") - _, err = os.Stat(okPath) - if err != nil { - t.Fatal("Expected file to be present in re-mount after removal, but it is not there") - } - _, err2 = dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeNewlyAddedFileEncrypted(t *testing.T) { - log.Debug("Starting removeNewlyAddedFileEncrypted test") - ta.removeNewlyAddedFile(t, true) - log.Debug("Test removeNewlyAddedFileEncrypted terminated") -} - -func (ta *testAPI) removeNewlyAddedFileNonEncrypted(t *testing.T) { - log.Debug("Starting removeNewlyAddedFileNonEncrypted test") - ta.removeNewlyAddedFile(t, false) - log.Debug("Test removeNewlyAddedFileNonEncrypted terminated") -} - -//add a file in mount and then remove it; on remount file should not be there -func (ta *testAPI) removeNewlyAddedFile(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeNewlyAddedFile") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "removenew-upload") - dat.testMountDir = filepath.Join(dat.testDir, "removenew-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Add a a new file and remove it - dirToCreate := filepath.Join(dat.testMountDir, "one") - err = os.MkdirAll(dirToCreate, os.FileMode(0665)) - if err != nil { - t.Fatalf("Error creating dir in mounted dir: %v", err) - } - actualPath := filepath.Join(dirToCreate, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err1) - } - defer d.Close() - log.Debug("file opened") - contents := make([]byte, 11) - _, err = rand.Read(contents) - if err != nil { - t.Fatalf("Error writing random bytes to byte array: %v", err) - } - log.Debug("content read") - _, err = d.Write(contents) - if err != nil { - t.Fatalf("Error writing random bytes to file: %v", err) - } - log.Debug("content written") - err = d.Close() - if err != nil { - t.Fatalf("Error closing file: %v", err) - } - log.Debug("file closed") - - checkFile(t, dat.testMountDir, "one/2.txt", contents) - log.Debug("file checked") - - err = os.Remove(actualPath) - if err != nil { - t.Fatalf("Error removing file: %v", err) - } - log.Debug("file removed") - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - testMountDir2, err3 := addDir(dat.testDir, "removenew-mount2") - if err3 != nil { - t.Fatalf("Error creating mount dir2: %v", err3) - } - // mount again and see if things are okay - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - - if dat.bzzHash != mi.LatestManifest { - t.Fatalf("same contents different hash orig(%v): new(%v)", dat.bzzHash, mi.LatestManifest) - } - _, err2 = dat.swarmfs.Unmount(testMountDir2) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) addNewFileAndModifyContentsEncrypted(t *testing.T) { - log.Debug("Starting addNewFileAndModifyContentsEncrypted test") - ta.addNewFileAndModifyContents(t, true) - log.Debug("Test addNewFileAndModifyContentsEncrypted terminated") -} - -func (ta *testAPI) addNewFileAndModifyContentsNonEncrypted(t *testing.T) { - log.Debug("Starting addNewFileAndModifyContentsNonEncrypted test") - ta.addNewFileAndModifyContents(t, false) - log.Debug("Test addNewFileAndModifyContentsNonEncrypted terminated") -} - -//add a new file and modify content; remount and check the modified file is intact -func (ta *testAPI) addNewFileAndModifyContents(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("addNewFileAndModifyContents") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "modifyfile-upload") - dat.testMountDir = filepath.Join(dat.testDir, "modifyfile-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Create a new file in the root dir - actualPath := filepath.Join(dat.testMountDir, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err1) - } - defer d.Close() - //write some random data into the file - log.Debug("file opened") - line1 := []byte("Line 1") - _, err = rand.Read(line1) - if err != nil { - t.Fatalf("Error writing random bytes to byte array: %v", err) - } - log.Debug("line read") - _, err = d.Write(line1) - if err != nil { - t.Fatalf("Error writing random bytes to file: %v", err) - } - log.Debug("line written") - err = d.Close() - if err != nil { - t.Fatalf("Error closing file: %v", err) - } - log.Debug("file closed") - - //unmount the hash on the mounted dir - mi1, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - //mount on a different dir to see if modified file is correct - testMountDir2, err3 := addDir(dat.testDir, "modifyfile-mount2") - if err3 != nil { - t.Fatalf("Error creating mount dir2: %v", err3) - } - dat.files["2.txt"] = fileInfo{0700, 333, 444, line1} - _ = mountDir(t, ta.api, dat.files, mi1.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - - checkFile(t, testMountDir2, "2.txt", line1) - log.Debug("file checked") - - //unmount second dir - mi2, err4 := dat.swarmfs.Unmount(testMountDir2) - if err4 != nil { - t.Fatalf("Could not unmount %v", err4) - } - log.Debug("Directory unmounted again") - - //mount again on original dir and modify the file - //let's clean up the mounted dir first: remove... - err = os.RemoveAll(dat.testMountDir) - if err != nil { - t.Fatalf("Error cleaning up mount dir: %v", err) - } - //...and re-create - err = os.MkdirAll(dat.testMountDir, 0777) - if err != nil { - t.Fatalf("Error re-creating mount dir: %v", err) - } - //now remount - _ = mountDir(t, ta.api, dat.files, mi2.LatestManifest, dat.testMountDir) - log.Debug("Directory mounted yet again") - - //open the file.... - fd, err5 := os.OpenFile(actualPath, os.O_RDWR|os.O_APPEND, os.FileMode(0665)) - if err5 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err5) - } - defer fd.Close() - log.Debug("file opened") - //...and modify something - line2 := []byte("Line 2") - _, err = rand.Read(line2) - if err != nil { - t.Fatalf("Error modifying random bytes to byte array: %v", err) - } - log.Debug("line read") - _, err = fd.Seek(int64(len(line1)), 0) - if err != nil { - t.Fatalf("Error seeking position for modification: %v", err) - } - _, err = fd.Write(line2) - if err != nil { - t.Fatalf("Error modifying file: %v", err) - } - log.Debug("line written") - err = fd.Close() - if err != nil { - t.Fatalf("Error closing modified file; %v", err) - } - log.Debug("file closed") - - //unmount the modified directory - mi3, err6 := dat.swarmfs.Unmount(dat.testMountDir) - if err6 != nil { - t.Fatalf("Could not unmount %v", err6) - } - log.Debug("Directory unmounted yet again") - - //now remount on a different dir and check that the modified file is ok - testMountDir4, err7 := addDir(dat.testDir, "modifyfile-mount4") - if err7 != nil { - t.Fatalf("Could not unmount %v", err7) - } - b := [][]byte{line1, line2} - line1and2 := bytes.Join(b, []byte("")) - dat.files["2.txt"] = fileInfo{0700, 333, 444, line1and2} - _ = mountDir(t, ta.api, dat.files, mi3.LatestManifest, testMountDir4) - log.Debug("Directory mounted final time") - - checkFile(t, testMountDir4, "2.txt", line1and2) - _, err = dat.swarmfs.Unmount(testMountDir4) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeEmptyDirEncrypted(t *testing.T) { - log.Debug("Starting removeEmptyDirEncrypted test") - ta.removeEmptyDir(t, true) - log.Debug("Test removeEmptyDirEncrypted terminated") -} - -func (ta *testAPI) removeEmptyDirNonEncrypted(t *testing.T) { - log.Debug("Starting removeEmptyDirNonEncrypted test") - ta.removeEmptyDir(t, false) - log.Debug("Test removeEmptyDirNonEncrypted terminated") -} - -//remove an empty dir inside mount -func (ta *testAPI) removeEmptyDir(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeEmptyDir") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "rmdir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "rmdir-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - _, err2 := addDir(dat.testMountDir, "newdir") - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - mi, err := dat.swarmfs.Unmount(dat.testMountDir) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("Directory unmounted") - //by just adding an empty dir, the hash doesn't change; test this - if dat.bzzHash != mi.LatestManifest { - t.Fatalf("same contents different hash orig(%v): new(%v)", dat.bzzHash, mi.LatestManifest) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeDirWhichHasFilesEncrypted(t *testing.T) { - log.Debug("Starting removeDirWhichHasFilesEncrypted test") - ta.removeDirWhichHasFiles(t, true) - log.Debug("Test removeDirWhichHasFilesEncrypted terminated") -} -func (ta *testAPI) removeDirWhichHasFilesNonEncrypted(t *testing.T) { - log.Debug("Starting removeDirWhichHasFilesNonEncrypted test") - ta.removeDirWhichHasFiles(t, false) - log.Debug("Test removeDirWhichHasFilesNonEncrypted terminated") -} - -//remove a directory with a file; check on remount file isn't there -func (ta *testAPI) removeDirWhichHasFiles(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeDirWhichHasFiles") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "rmdir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "rmdir-mount") - dat.files = make(map[string]fileInfo) - dat.files["one/1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["two/five.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["two/six.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - //delete a directory inside the mounted dir with all its files - dirPath := filepath.Join(dat.testMountDir, "two") - err = os.RemoveAll(dirPath) - if err != nil { - t.Fatalf("Error removing directory in mounted dir: %v", err) - } - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v ", err2) - } - log.Debug("Directory unmounted") - - //we deleted files in the OS, so let's delete them also in the files map - delete(dat.files, "two/five.txt") - delete(dat.files, "two/six.txt") - - // mount again and see if deleted files have been deleted indeed - testMountDir2, err3 := addDir(dat.testDir, "remount-mount2") - if err3 != nil { - t.Fatalf("Could not unmount %v", err3) - } - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted") - actualPath := filepath.Join(dirPath, "five.txt") - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err = os.Stat(dirPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err = dat.swarmfs.Unmount(testMountDir2) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeDirWhichHasSubDirsEncrypted(t *testing.T) { - log.Debug("Starting removeDirWhichHasSubDirsEncrypted test") - ta.removeDirWhichHasSubDirs(t, true) - log.Debug("Test removeDirWhichHasSubDirsEncrypted terminated") -} - -func (ta *testAPI) removeDirWhichHasSubDirsNonEncrypted(t *testing.T) { - log.Debug("Starting removeDirWhichHasSubDirsNonEncrypted test") - ta.removeDirWhichHasSubDirs(t, false) - log.Debug("Test removeDirWhichHasSubDirsNonEncrypted terminated") -} - -//remove a directory with subdirectories inside mount; on remount check they are not there -func (ta *testAPI) removeDirWhichHasSubDirs(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeDirWhichHasSubDirs") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "rmsubdir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "rmsubdir-mount") - dat.files = make(map[string]fileInfo) - dat.files["one/1.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["two/three/2.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["two/three/3.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["two/four/5.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["two/four/6.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - dat.files["two/four/six/7.txt"] = fileInfo{0700, 333, 444, getRandomBytes(10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - dirPath := filepath.Join(dat.testMountDir, "two") - err = os.RemoveAll(dirPath) - if err != nil { - t.Fatalf("Error removing directory in mounted dir: %v", err) - } - - //delete a directory inside the mounted dir with all its files - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v ", err2) - } - log.Debug("Directory unmounted") - - //we deleted files in the OS, so let's delete them also in the files map - delete(dat.files, "two/three/2.txt") - delete(dat.files, "two/three/3.txt") - delete(dat.files, "two/four/5.txt") - delete(dat.files, "two/four/6.txt") - delete(dat.files, "two/four/six/7.txt") - - // mount again and see if things are okay - testMountDir2, err3 := addDir(dat.testDir, "remount-mount2") - if err3 != nil { - t.Fatalf("Could not unmount %v", err3) - } - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - actualPath := filepath.Join(dirPath, "three") - actualPath = filepath.Join(actualPath, "2.txt") - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - actualPath = filepath.Join(dirPath, "four") - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err = os.Stat(dirPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err = dat.swarmfs.Unmount(testMountDir2) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) appendFileContentsToEndEncrypted(t *testing.T) { - log.Debug("Starting appendFileContentsToEndEncrypted test") - ta.appendFileContentsToEnd(t, true) - log.Debug("Test appendFileContentsToEndEncrypted terminated") -} - -func (ta *testAPI) appendFileContentsToEndNonEncrypted(t *testing.T) { - log.Debug("Starting appendFileContentsToEndNonEncrypted test") - ta.appendFileContentsToEnd(t, false) - log.Debug("Test appendFileContentsToEndNonEncrypted terminated") -} - -//append contents to the end of a file; remount and check it's intact -func (ta *testAPI) appendFileContentsToEnd(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("appendFileContentsToEnd") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "appendlargefile-upload") - dat.testMountDir = filepath.Join(dat.testDir, "appendlargefile-mount") - dat.files = make(map[string]fileInfo) - - line1 := make([]byte, 10) - _, err = rand.Read(line1) - if err != nil { - t.Fatalf("Error writing random bytes to byte array: %v", err) - } - - dat.files["1.txt"] = fileInfo{0700, 333, 444, line1} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - actualPath := filepath.Join(dat.testMountDir, "1.txt") - fd, err4 := os.OpenFile(actualPath, os.O_RDWR|os.O_APPEND, os.FileMode(0665)) - if err4 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err4) - } - defer fd.Close() - log.Debug("file opened") - line2 := make([]byte, 5) - _, err = rand.Read(line2) - if err != nil { - t.Fatalf("Error writing random bytes to byte array: %v", err) - } - log.Debug("line read") - _, err = fd.Seek(int64(len(line1)), 0) - if err != nil { - t.Fatalf("Error searching for position to append: %v", err) - } - _, err = fd.Write(line2) - if err != nil { - t.Fatalf("Error appending: %v", err) - } - log.Debug("line written") - err = fd.Close() - if err != nil { - t.Fatalf("Error closing file: %v", err) - } - log.Debug("file closed") - - mi1, err5 := dat.swarmfs.Unmount(dat.testMountDir) - if err5 != nil { - t.Fatalf("Could not unmount %v ", err5) - } - log.Debug("Directory unmounted") - - // mount again and see if appended file is correct - b := [][]byte{line1, line2} - line1and2 := bytes.Join(b, []byte("")) - dat.files["1.txt"] = fileInfo{0700, 333, 444, line1and2} - testMountDir2, err6 := addDir(dat.testDir, "remount-mount2") - if err6 != nil { - t.Fatalf("Could not unmount %v", err6) - } - _ = mountDir(t, ta.api, dat.files, mi1.LatestManifest, testMountDir2) - log.Debug("Directory mounted") - - checkFile(t, testMountDir2, "1.txt", line1and2) - - _, err = dat.swarmfs.Unmount(testMountDir2) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("subtest terminated") -} - -//run all the tests -func TestFUSE(t *testing.T) { - t.Skip("disable fuse tests until they are stable") - //create a data directory for swarm - datadir, err := ioutil.TempDir("", "fuse") - if err != nil { - t.Fatalf("unable to create temp dir: %v", err) - } - defer os.RemoveAll(datadir) - - fileStore, err := storage.NewLocalFileStore(datadir, make([]byte, 32)) - if err != nil { - t.Fatal(err) - } - ta := &testAPI{api: api.NewAPI(fileStore, nil, nil, nil)} - - //run a short suite of tests - //approx time: 28s - t.Run("mountListAndUnmountEncrypted", ta.mountListAndUnmountEncrypted) - t.Run("remountEncrypted", ta.remountEncrypted) - t.Run("unmountWhenResourceBusyNonEncrypted", ta.unmountWhenResourceBusyNonEncrypted) - t.Run("removeExistingFileEncrypted", ta.removeExistingFileEncrypted) - t.Run("addNewFileAndModifyContentsNonEncrypted", ta.addNewFileAndModifyContentsNonEncrypted) - t.Run("removeDirWhichHasFilesNonEncrypted", ta.removeDirWhichHasFilesNonEncrypted) - t.Run("appendFileContentsToEndEncrypted", ta.appendFileContentsToEndEncrypted) - - //provide longrunning flag to execute all tests - //approx time with longrunning: 140s - if *longrunning { - t.Run("mountListAndUnmountNonEncrypted", ta.mountListAndUnmountNonEncrypted) - t.Run("maxMountsEncrypted", ta.maxMountsEncrypted) - t.Run("maxMountsNonEncrypted", ta.maxMountsNonEncrypted) - t.Run("remountNonEncrypted", ta.remountNonEncrypted) - t.Run("unmountEncrypted", ta.unmountEncrypted) - t.Run("unmountNonEncrypted", ta.unmountNonEncrypted) - t.Run("unmountWhenResourceBusyEncrypted", ta.unmountWhenResourceBusyEncrypted) - t.Run("unmountWhenResourceBusyNonEncrypted", ta.unmountWhenResourceBusyNonEncrypted) - t.Run("seekInMultiChunkFileEncrypted", ta.seekInMultiChunkFileEncrypted) - t.Run("seekInMultiChunkFileNonEncrypted", ta.seekInMultiChunkFileNonEncrypted) - t.Run("createNewFileEncrypted", ta.createNewFileEncrypted) - t.Run("createNewFileNonEncrypted", ta.createNewFileNonEncrypted) - t.Run("createNewFileInsideDirectoryEncrypted", ta.createNewFileInsideDirectoryEncrypted) - t.Run("createNewFileInsideDirectoryNonEncrypted", ta.createNewFileInsideDirectoryNonEncrypted) - t.Run("createNewFileInsideNewDirectoryEncrypted", ta.createNewFileInsideNewDirectoryEncrypted) - t.Run("createNewFileInsideNewDirectoryNonEncrypted", ta.createNewFileInsideNewDirectoryNonEncrypted) - t.Run("removeExistingFileNonEncrypted", ta.removeExistingFileNonEncrypted) - t.Run("removeExistingFileInsideDirEncrypted", ta.removeExistingFileInsideDirEncrypted) - t.Run("removeExistingFileInsideDirNonEncrypted", ta.removeExistingFileInsideDirNonEncrypted) - t.Run("removeNewlyAddedFileEncrypted", ta.removeNewlyAddedFileEncrypted) - t.Run("removeNewlyAddedFileNonEncrypted", ta.removeNewlyAddedFileNonEncrypted) - t.Run("addNewFileAndModifyContentsEncrypted", ta.addNewFileAndModifyContentsEncrypted) - t.Run("removeEmptyDirEncrypted", ta.removeEmptyDirEncrypted) - t.Run("removeEmptyDirNonEncrypted", ta.removeEmptyDirNonEncrypted) - t.Run("removeDirWhichHasFilesEncrypted", ta.removeDirWhichHasFilesEncrypted) - t.Run("removeDirWhichHasSubDirsEncrypted", ta.removeDirWhichHasSubDirsEncrypted) - t.Run("removeDirWhichHasSubDirsNonEncrypted", ta.removeDirWhichHasSubDirsNonEncrypted) - t.Run("appendFileContentsToEndNonEncrypted", ta.appendFileContentsToEndNonEncrypted) - } -} - -func Upload(uploadDir, index string, a *api.API, toEncrypt bool) (hash string, err error) { - fs := api.NewFileSystem(a) - hash, err = fs.Upload(uploadDir, index, toEncrypt) - return hash, err -} diff --git a/swarm/fuse/swarmfs_unix.go b/swarm/fuse/swarmfs_unix.go deleted file mode 100644 index 9ff55cc324f7..000000000000 --- a/swarm/fuse/swarmfs_unix.go +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build linux darwin freebsd - -package fuse - -import ( - "context" - "errors" - "fmt" - "os" - "path/filepath" - "strings" - "sync" - "time" - - "bazil.org/fuse" - "bazil.org/fuse/fs" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/log" -) - -var ( - errEmptyMountPoint = errors.New("need non-empty mount point") - errNoRelativeMountPoint = errors.New("invalid path for mount point (need absolute path)") - errMaxMountCount = errors.New("max FUSE mount count reached") - errMountTimeout = errors.New("mount timeout") - errAlreadyMounted = errors.New("mount point is already serving") -) - -func isFUSEUnsupportedError(err error) bool { - if perr, ok := err.(*os.PathError); ok { - return perr.Op == "open" && perr.Path == "/dev/fuse" - } - return err == fuse.ErrOSXFUSENotFound -} - -// MountInfo contains information about every active mount -type MountInfo struct { - MountPoint string - StartManifest string - LatestManifest string - rootDir *SwarmDir - fuseConnection *fuse.Conn - swarmApi *api.API - lock *sync.RWMutex - serveClose chan struct{} -} - -func NewMountInfo(mhash, mpoint string, sapi *api.API) *MountInfo { - log.Debug("swarmfs NewMountInfo", "hash", mhash, "mount point", mpoint) - newMountInfo := &MountInfo{ - MountPoint: mpoint, - StartManifest: mhash, - LatestManifest: mhash, - rootDir: nil, - fuseConnection: nil, - swarmApi: sapi, - lock: &sync.RWMutex{}, - serveClose: make(chan struct{}), - } - return newMountInfo -} - -func (swarmfs *SwarmFS) Mount(mhash, mountpoint string) (*MountInfo, error) { - log.Info("swarmfs", "mounting hash", mhash, "mount point", mountpoint) - if mountpoint == "" { - return nil, errEmptyMountPoint - } - if !strings.HasPrefix(mountpoint, "/") { - return nil, errNoRelativeMountPoint - } - cleanedMountPoint, err := filepath.Abs(filepath.Clean(mountpoint)) - if err != nil { - return nil, err - } - log.Trace("swarmfs mount", "cleanedMountPoint", cleanedMountPoint) - - swarmfs.swarmFsLock.Lock() - defer swarmfs.swarmFsLock.Unlock() - - noOfActiveMounts := len(swarmfs.activeMounts) - log.Debug("swarmfs mount", "# active mounts", noOfActiveMounts) - if noOfActiveMounts >= maxFuseMounts { - return nil, errMaxMountCount - } - - if _, ok := swarmfs.activeMounts[cleanedMountPoint]; ok { - return nil, errAlreadyMounted - } - - log.Trace("swarmfs mount: getting manifest tree") - _, manifestEntryMap, err := swarmfs.swarmApi.BuildDirectoryTree(context.TODO(), mhash, true) - if err != nil { - return nil, err - } - - log.Trace("swarmfs mount: building mount info") - mi := NewMountInfo(mhash, cleanedMountPoint, swarmfs.swarmApi) - - dirTree := map[string]*SwarmDir{} - rootDir := NewSwarmDir("/", mi) - log.Trace("swarmfs mount", "rootDir", rootDir) - mi.rootDir = rootDir - - log.Trace("swarmfs mount: traversing manifest map") - for suffix, entry := range manifestEntryMap { - if suffix == "" { //empty suffix means that the file has no name - i.e. this is the default entry in a manifest. Since we cannot have files without a name, let us ignore this entry - log.Warn("Manifest has an empty-path (default) entry which will be ignored in FUSE mount.") - continue - } - addr := common.Hex2Bytes(entry.Hash) - fullpath := "/" + suffix - basepath := filepath.Dir(fullpath) - parentDir := rootDir - dirUntilNow := "" - paths := strings.Split(basepath, "/") - for i := range paths { - if paths[i] != "" { - thisDir := paths[i] - dirUntilNow = dirUntilNow + "/" + thisDir - - if _, ok := dirTree[dirUntilNow]; !ok { - dirTree[dirUntilNow] = NewSwarmDir(dirUntilNow, mi) - parentDir.directories = append(parentDir.directories, dirTree[dirUntilNow]) - parentDir = dirTree[dirUntilNow] - - } else { - parentDir = dirTree[dirUntilNow] - } - } - } - thisFile := NewSwarmFile(basepath, filepath.Base(fullpath), mi) - thisFile.addr = addr - - parentDir.files = append(parentDir.files, thisFile) - } - - fconn, err := fuse.Mount(cleanedMountPoint, fuse.FSName("swarmfs"), fuse.VolumeName(mhash)) - if isFUSEUnsupportedError(err) { - log.Error("swarmfs error - FUSE not installed", "mountpoint", cleanedMountPoint, "err", err) - return nil, err - } else if err != nil { - fuse.Unmount(cleanedMountPoint) - log.Error("swarmfs error mounting swarm manifest", "mountpoint", cleanedMountPoint, "err", err) - return nil, err - } - mi.fuseConnection = fconn - - serverr := make(chan error, 1) - go func() { - log.Info("swarmfs", "serving hash", mhash, "at", cleanedMountPoint) - filesys := &SwarmRoot{root: rootDir} - //start serving the actual file system; see note below - if err := fs.Serve(fconn, filesys); err != nil { - log.Warn("swarmfs could not serve the requested hash", "error", err) - serverr <- err - } - mi.serveClose <- struct{}{} - }() - - /* - IMPORTANT NOTE: the fs.Serve function is blocking; - Serve builds up the actual fuse file system by calling the - Attr functions on each SwarmFile, creating the file inodes; - specifically calling the swarm's LazySectionReader.Size() to set the file size. - - This can take some time, and it appears that if we access the fuse file system - too early, we can bring the tests to deadlock. The assumption so far is that - at this point, the fuse driver didn't finish to initialize the file system. - - Accessing files too early not only deadlocks the tests, but locks the access - of the fuse file completely, resulting in blocked resources at OS system level. - Even a simple `ls /tmp/testDir/testMountDir` could deadlock in a shell. - - Workaround so far is to wait some time to give the OS enough time to initialize - the fuse file system. During tests, this seemed to address the issue. - - HOWEVER IT SHOULD BE NOTED THAT THIS MAY ONLY BE AN EFFECT, - AND THE DEADLOCK CAUSED BY SOMETHING ELSE BLOCKING ACCESS DUE TO SOME RACE CONDITION - (caused in the bazil.org library and/or the SwarmRoot, SwarmDir and SwarmFile implementations) - */ - time.Sleep(2 * time.Second) - - timer := time.NewTimer(mountTimeout) - defer timer.Stop() - // Check if the mount process has an error to report. - select { - case <-timer.C: - log.Warn("swarmfs timed out mounting over FUSE", "mountpoint", cleanedMountPoint, "err", err) - err := fuse.Unmount(cleanedMountPoint) - if err != nil { - return nil, err - } - return nil, errMountTimeout - case err := <-serverr: - log.Warn("swarmfs error serving over FUSE", "mountpoint", cleanedMountPoint, "err", err) - err = fuse.Unmount(cleanedMountPoint) - return nil, err - - case <-fconn.Ready: - //this signals that the actual mount point from the fuse.Mount call is ready; - //it does not signal though that the file system from fs.Serve is actually fully built up - if err := fconn.MountError; err != nil { - log.Error("Mounting error from fuse driver: ", "err", err) - return nil, err - } - log.Info("swarmfs now served over FUSE", "manifest", mhash, "mountpoint", cleanedMountPoint) - } - - timer.Stop() - swarmfs.activeMounts[cleanedMountPoint] = mi - return mi, nil -} - -func (swarmfs *SwarmFS) Unmount(mountpoint string) (*MountInfo, error) { - swarmfs.swarmFsLock.Lock() - defer swarmfs.swarmFsLock.Unlock() - - cleanedMountPoint, err := filepath.Abs(filepath.Clean(mountpoint)) - if err != nil { - return nil, err - } - - mountInfo := swarmfs.activeMounts[cleanedMountPoint] - - if mountInfo == nil || mountInfo.MountPoint != cleanedMountPoint { - return nil, fmt.Errorf("swarmfs %s is not mounted", cleanedMountPoint) - } - err = fuse.Unmount(cleanedMountPoint) - if err != nil { - err1 := externalUnmount(cleanedMountPoint) - if err1 != nil { - errStr := fmt.Sprintf("swarmfs unmount error: %v", err) - log.Warn(errStr) - return nil, err1 - } - } - - err = mountInfo.fuseConnection.Close() - if err != nil { - return nil, err - } - delete(swarmfs.activeMounts, cleanedMountPoint) - - <-mountInfo.serveClose - - succString := fmt.Sprintf("swarmfs unmounting %v succeeded", cleanedMountPoint) - log.Info(succString) - - return mountInfo, nil -} - -func (swarmfs *SwarmFS) Listmounts() []*MountInfo { - swarmfs.swarmFsLock.RLock() - defer swarmfs.swarmFsLock.RUnlock() - rows := make([]*MountInfo, 0, len(swarmfs.activeMounts)) - for _, mi := range swarmfs.activeMounts { - rows = append(rows, mi) - } - return rows -} - -func (swarmfs *SwarmFS) Stop() bool { - for mp := range swarmfs.activeMounts { - mountInfo := swarmfs.activeMounts[mp] - swarmfs.Unmount(mountInfo.MountPoint) - } - return true -} diff --git a/swarm/fuse/swarmfs_util.go b/swarm/fuse/swarmfs_util.go deleted file mode 100644 index 4f2e1416b615..000000000000 --- a/swarm/fuse/swarmfs_util.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build linux darwin freebsd - -package fuse - -import ( - "context" - "fmt" - "os/exec" - "runtime" - - "github.com/ethereum/go-ethereum/swarm/log" -) - -func externalUnmount(mountPoint string) error { - ctx, cancel := context.WithTimeout(context.Background(), unmountTimeout) - defer cancel() - - // Try generic umount. - if err := exec.CommandContext(ctx, "umount", mountPoint).Run(); err == nil { - return nil - } - // Try FUSE-specific commands if umount didn't work. - switch runtime.GOOS { - case "darwin": - return exec.CommandContext(ctx, "diskutil", "umount", mountPoint).Run() - case "linux": - return exec.CommandContext(ctx, "fusermount", "-u", mountPoint).Run() - default: - return fmt.Errorf("swarmfs unmount: unimplemented") - } -} - -func addFileToSwarm(sf *SwarmFile, content []byte, size int) error { - fkey, mhash, err := sf.mountInfo.swarmApi.AddFile(context.TODO(), sf.mountInfo.LatestManifest, sf.path, sf.name, content, true) - if err != nil { - return err - } - - sf.lock.Lock() - defer sf.lock.Unlock() - sf.addr = fkey - sf.fileSize = int64(size) - - sf.mountInfo.lock.Lock() - defer sf.mountInfo.lock.Unlock() - sf.mountInfo.LatestManifest = mhash - - log.Info("swarmfs added new file:", "fname", sf.name, "new Manifest hash", mhash) - return nil -} - -func removeFileFromSwarm(sf *SwarmFile) error { - mkey, err := sf.mountInfo.swarmApi.RemoveFile(context.TODO(), sf.mountInfo.LatestManifest, sf.path, sf.name, true) - if err != nil { - return err - } - - sf.mountInfo.lock.Lock() - defer sf.mountInfo.lock.Unlock() - sf.mountInfo.LatestManifest = mkey - - log.Info("swarmfs removed file:", "fname", sf.name, "new Manifest hash", mkey) - return nil -} - -func removeDirectoryFromSwarm(sd *SwarmDir) error { - if len(sd.directories) == 0 && len(sd.files) == 0 { - return nil - } - - for _, d := range sd.directories { - err := removeDirectoryFromSwarm(d) - if err != nil { - return err - } - } - - for _, f := range sd.files { - err := removeFileFromSwarm(f) - if err != nil { - return err - } - } - - return nil -} - -func appendToExistingFileInSwarm(sf *SwarmFile, content []byte, offset int64, length int64) error { - fkey, mhash, err := sf.mountInfo.swarmApi.AppendFile(context.TODO(), sf.mountInfo.LatestManifest, sf.path, sf.name, sf.fileSize, content, sf.addr, offset, length, true) - if err != nil { - return err - } - - sf.lock.Lock() - defer sf.lock.Unlock() - sf.addr = fkey - sf.fileSize = sf.fileSize + int64(len(content)) - - sf.mountInfo.lock.Lock() - defer sf.mountInfo.lock.Unlock() - sf.mountInfo.LatestManifest = mhash - - log.Info("swarmfs appended file:", "fname", sf.name, "new Manifest hash", mhash) - return nil -} diff --git a/swarm/grafana_dashboards/ldbstore.json b/swarm/grafana_dashboards/ldbstore.json deleted file mode 100644 index 2d64380ba8d6..000000000000 --- a/swarm/grafana_dashboards/ldbstore.json +++ /dev/null @@ -1,2278 +0,0 @@ -{ - "annotations": { - "list": [ - { - "$$hashKey": "object:325", - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 1, - "id": 5, - "iteration": 1527598894689, - "links": [], - "panels": [ - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 40, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 42, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.localstore.get.cachehit.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LocalStore get cachehit", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 43, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.localstore.get.cachemiss.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LocalStore get cachemiss", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 7 - }, - "id": 44, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.localstore.getorcreaterequest.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Total LocalStore.GetOrCreateRequest", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 7 - }, - "id": 47, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.localstore.getorcreaterequest.errfetching.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LocalStore GetOrCreateRequest ErrFetching", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 13 - }, - "id": 45, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.localstore.getorcreaterequest.hit.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LocalStore.GetOrCreateRequest hit", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 13 - }, - "id": 49, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.localstore.getorcreaterequest.miss.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LocalStore GetOrCreateRequest miss", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 19 - }, - "id": 48, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.localstore.get.error.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LocalStore get error", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 19 - }, - "id": 46, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.localstore.get.errfetching.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LocalStore get ErrFetching", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "title": "LocalStore", - "type": "row" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 1 - }, - "id": 27, - "panels": [], - "title": "LDBStore", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 2 - }, - "id": 29, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.ldbstore.get.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LDBStore get", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 2 - }, - "id": 30, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.ldbstore.put.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LDBStore put", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 31, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.ldbstore.synciterator.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LDBStore SyncIterator", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 32, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.ldbstore.synciterator.seek.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LDBStore SyncIterator Seek/Next", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 14 - }, - "id": 50, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.ldbstore.collectgarbage.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LDBStore Collect Garbage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 14 - }, - "id": 51, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.ldbstore.collectgarbage.delete.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LDBStore Collect Garbage - Actual Deletes", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 20 - }, - "id": 34, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 39 - }, - "id": 36, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.ldbdatabase.get.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LDBDatabase get", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 39 - }, - "id": 37, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.ldbdatabase.write.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LDBDatabase write", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 45 - }, - "id": 38, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.ldbdatabase.newiterator.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LDBDatabase NewIterator", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "title": "LDBDatabase", - "type": "row" - } - ], - "refresh": "10s", - "schemaVersion": 16, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "10s", - "value": "10s" - }, - "hide": 0, - "label": "resolution", - "name": "myinterval", - "options": [ - { - "selected": false, - "text": "5s", - "value": "5s" - }, - { - "selected": true, - "text": "10s", - "value": "10s" - }, - { - "selected": false, - "text": "30s", - "value": "30s" - }, - { - "selected": false, - "text": "100s", - "value": "100s" - } - ], - "query": "5s,10s,30s,100s", - "refresh": 2, - "type": "interval" - }, - { - "allValue": null, - "current": { - "text": "swarm_30399 + swarm_30400 + swarm_30401", - "value": [ - "swarm_30399", - "swarm_30400", - "swarm_30401" - ] - }, - "datasource": "metrics", - "hide": 0, - "includeAll": true, - "label": null, - "multi": true, - "name": "host", - "options": [], - "query": "SHOW TAG VALUES WITH KEY = \"host\"", - "refresh": 1, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "swarm.http.request.GET.time.span", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "", - "title": "LDBStore and LDBDatabase", - "uid": "zS6beG7iz", - "version": 28 -} diff --git a/swarm/grafana_dashboards/swarm.json b/swarm/grafana_dashboards/swarm.json deleted file mode 100644 index 3ee244d154aa..000000000000 --- a/swarm/grafana_dashboards/swarm.json +++ /dev/null @@ -1,3198 +0,0 @@ -{ - "annotations": { - "list": [ - { - "$$hashKey": "object:147", - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 1, - "id": 2, - "iteration": 1527598859072, - "links": [], - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 34, - "panels": [], - "title": "P2P", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 36, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "none" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.send.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "P2P Send() - messages sent", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 37, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "p95($tag_host)", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "none" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.send_t.span", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "p95" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "P2P Send() timer - 95%ile", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ns", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 10 - }, - "id": 38, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "1 $tag_host", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "none" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.sendpriority.1.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [] - }, - { - "alias": "2 $tag_host", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "none" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.sendpriority.2.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [] - }, - { - "alias": "3 $tag_host", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "none" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.sendpriority.3.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "C", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "P2P SendPriority() - messages sent", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 10 - }, - "id": 39, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "1 $tag_host", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "none" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.sendpriority_t.1.span", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "p95" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [] - }, - { - "alias": "2 $tag_host", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "none" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.sendpriority_t.2.span", - "orderByTime": "ASC", - "policy": "default", - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "p95" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "P2P SendPriority() timer - 95%ile", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ns", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 19 - }, - "id": 40, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "none" - ], - "type": "fill" - } - ], - "measurement": "swarm.registry.peers.gauge", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - } - ] - ], - "tags": [] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Registry Peers", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 28 - }, - "id": 32, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 2 - }, - "id": 14, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.stack.uptime.gauge", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Uptime", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ns", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "title": "Uptime", - "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 29 - }, - "id": 28, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 7 - }, - "id": 2, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "GET", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "swarm.http.request.GET.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "POST", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "swarm.http.request.POST.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Total HTTP Requests", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 7 - }, - "id": 26, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.http.request.GET.time.span", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "p95" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "HTTP GET requests 95% timer", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ns", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 13 - }, - "id": 15, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.http.request.GET.time.span", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "p50" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "HTTP GET requests 50% timer", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ns", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 13 - }, - "id": 8, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "POST", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.http.request.POST.time.span", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "p95" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "HTTP POST requests 95% timer", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ns", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "title": "HTTP", - "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 30 - }, - "id": 30, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 16, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.lazychunkreader.read.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LazyChunkReader read() calls", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 18, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.lazychunkreader.read.err.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LazyChunkReader read errors", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 13 - }, - "id": 17, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.lazychunkreader.read.bytes.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "LazyChunkReader bytes read", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "title": "LazyChunkReader", - "type": "row" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 31 - }, - "id": 25, - "panels": [], - "title": "All measurements", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 3, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.api.get.count.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "API Get (BZZ)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 32 - }, - "id": 13, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.network.stream.request_from_peers.count.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Request from peers", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 38 - }, - "id": 11, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.network.stream.received_chunks.count.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Received chunks", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 38 - }, - "id": 12, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.storage.cache.requests.size.gauge", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "max" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Requests cache entries", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 44 - }, - "id": 9, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.network.stream.handle_retrieve_request_msg.count.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Handle retrieve request msg", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 44 - }, - "id": 20, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.syncer.setnextbatch.iterator.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "syncer setnextbatch iterator calls", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 50 - }, - "id": 21, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.handlewantedhashesmsg.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "peer HandleWantedHashesMsg", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 50 - }, - "id": 22, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.handlesubscribemsg.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "peer HandleSubscribeMsg", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 56 - }, - "id": 23, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.handlewantedhashesmsg.actualget.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "peer HandleWantedHashesMsg actual get", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "metrics", - "fill": 1, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 56 - }, - "id": 19, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "total": true, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_host", - "dsType": "influxdb", - "groupBy": [ - { - "params": [ - "$myinterval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "0" - ], - "type": "fill" - } - ], - "measurement": "swarm.peer.handleofferedhashes.count", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "sum" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "peer OfferedHashesMsg", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "refresh": "30s", - "schemaVersion": 16, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "10s", - "value": "10s" - }, - "hide": 0, - "label": "resolution", - "name": "myinterval", - "options": [ - { - "selected": false, - "text": "5s", - "value": "5s" - }, - { - "selected": true, - "text": "10s", - "value": "10s" - }, - { - "selected": false, - "text": "30s", - "value": "30s" - }, - { - "selected": false, - "text": "100s", - "value": "100s" - } - ], - "query": "5s,10s,30s,100s", - "refresh": 2, - "type": "interval" - }, - { - "allValue": null, - "current": { - "text": "swarm_30399 + swarm_30400 + swarm_30401 + swarm_30402", - "value": [ - "swarm_30399", - "swarm_30400", - "swarm_30401", - "swarm_30402" - ] - }, - "datasource": "metrics", - "hide": 0, - "includeAll": true, - "label": null, - "multi": true, - "name": "host", - "options": [], - "query": "SHOW TAG VALUES WITH KEY = \"host\"", - "refresh": 1, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "swarm.http.request.GET.time.span", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "", - "title": "Swarm", - "uid": "vmEtxxgmz", - "version": 138 -} diff --git a/swarm/log/log.go b/swarm/log/log.go deleted file mode 100644 index ce372632e81d..000000000000 --- a/swarm/log/log.go +++ /dev/null @@ -1,48 +0,0 @@ -package log - -import ( - l "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" -) - -const ( - // CallDepth is set to 1 in order to influence to reported line number of - // the log message with 1 skipped stack frame of calling l.Output() - CallDepth = 1 -) - -// Warn is a convenient alias for log.Warn with stats -func Warn(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("warn", nil).Inc(1) - l.Output(msg, l.LvlWarn, CallDepth, ctx...) -} - -// Error is a convenient alias for log.Error with stats -func Error(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("error", nil).Inc(1) - l.Output(msg, l.LvlError, CallDepth, ctx...) -} - -// Crit is a convenient alias for log.Crit with stats -func Crit(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("crit", nil).Inc(1) - l.Output(msg, l.LvlCrit, CallDepth, ctx...) -} - -// Info is a convenient alias for log.Info with stats -func Info(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("info", nil).Inc(1) - l.Output(msg, l.LvlInfo, CallDepth, ctx...) -} - -// Debug is a convenient alias for log.Debug with stats -func Debug(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("debug", nil).Inc(1) - l.Output(msg, l.LvlDebug, CallDepth, ctx...) -} - -// Trace is a convenient alias for log.Trace with stats -func Trace(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("trace", nil).Inc(1) - l.Output(msg, l.LvlTrace, CallDepth, ctx...) -} diff --git a/swarm/metrics/flags.go b/swarm/metrics/flags.go deleted file mode 100644 index 79490fd36012..000000000000 --- a/swarm/metrics/flags.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package metrics - -import ( - "time" - - "github.com/ethereum/go-ethereum/cmd/utils" - gethmetrics "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/metrics/influxdb" - "github.com/ethereum/go-ethereum/swarm/log" - "gopkg.in/urfave/cli.v1" -) - -var ( - metricsEnableInfluxDBExportFlag = cli.BoolFlag{ - Name: "metrics.influxdb.export", - Usage: "Enable metrics export/push to an external InfluxDB database", - } - metricsInfluxDBEndpointFlag = cli.StringFlag{ - Name: "metrics.influxdb.endpoint", - Usage: "Metrics InfluxDB endpoint", - Value: "http://127.0.0.1:8086", - } - metricsInfluxDBDatabaseFlag = cli.StringFlag{ - Name: "metrics.influxdb.database", - Usage: "Metrics InfluxDB database", - Value: "metrics", - } - metricsInfluxDBUsernameFlag = cli.StringFlag{ - Name: "metrics.influxdb.username", - Usage: "Metrics InfluxDB username", - Value: "", - } - metricsInfluxDBPasswordFlag = cli.StringFlag{ - Name: "metrics.influxdb.password", - Usage: "Metrics InfluxDB password", - Value: "", - } - // The `host` tag is part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB. - // It is used so that we can group all nodes and average a measurement across all of them, but also so - // that we can select a specific node and inspect its measurements. - // https://docs.influxdata.com/influxdb/v1.4/concepts/key_concepts/#tag-key - metricsInfluxDBHostTagFlag = cli.StringFlag{ - Name: "metrics.influxdb.host.tag", - Usage: "Metrics InfluxDB `host` tag attached to all measurements", - Value: "localhost", - } -) - -// Flags holds all command-line flags required for metrics collection. -var Flags = []cli.Flag{ - utils.MetricsEnabledFlag, - metricsEnableInfluxDBExportFlag, - metricsInfluxDBEndpointFlag, metricsInfluxDBDatabaseFlag, metricsInfluxDBUsernameFlag, metricsInfluxDBPasswordFlag, metricsInfluxDBHostTagFlag, -} - -func Setup(ctx *cli.Context) { - if gethmetrics.Enabled { - log.Info("Enabling swarm metrics collection") - var ( - enableExport = ctx.GlobalBool(metricsEnableInfluxDBExportFlag.Name) - endpoint = ctx.GlobalString(metricsInfluxDBEndpointFlag.Name) - database = ctx.GlobalString(metricsInfluxDBDatabaseFlag.Name) - username = ctx.GlobalString(metricsInfluxDBUsernameFlag.Name) - password = ctx.GlobalString(metricsInfluxDBPasswordFlag.Name) - hosttag = ctx.GlobalString(metricsInfluxDBHostTagFlag.Name) - ) - - // Start system runtime metrics collection - go gethmetrics.CollectProcessMetrics(2 * time.Second) - - if enableExport { - log.Info("Enabling swarm metrics export to InfluxDB") - go influxdb.InfluxDBWithTags(gethmetrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "swarm.", map[string]string{ - "host": hosttag, - }) - } - } -} diff --git a/swarm/multihash/multihash.go b/swarm/multihash/multihash.go deleted file mode 100644 index 3306e3a6dcf1..000000000000 --- a/swarm/multihash/multihash.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package multihash - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" -) - -const ( - defaultMultihashLength = 32 - defaultMultihashTypeCode = 0x1b -) - -var ( - multihashTypeCode uint8 - MultihashLength = defaultMultihashLength -) - -func init() { - multihashTypeCode = defaultMultihashTypeCode - MultihashLength = defaultMultihashLength -} - -// check if valid swarm multihash -func isSwarmMultihashType(code uint8) bool { - return code == multihashTypeCode -} - -// GetMultihashLength returns the digest length of the provided multihash -// It will fail if the multihash is not a valid swarm mulithash -func GetMultihashLength(data []byte) (int, int, error) { - cursor := 0 - typ, c := binary.Uvarint(data) - if c <= 0 { - return 0, 0, errors.New("unreadable hashtype field") - } - if !isSwarmMultihashType(uint8(typ)) { - return 0, 0, fmt.Errorf("hash code %x is not a swarm hashtype", typ) - } - cursor += c - hashlength, c := binary.Uvarint(data[cursor:]) - if c <= 0 { - return 0, 0, errors.New("unreadable length field") - } - cursor += c - - // we cheekily assume hashlength < maxint - inthashlength := int(hashlength) - if len(data[c:]) < inthashlength { - return 0, 0, errors.New("length mismatch") - } - return inthashlength, cursor, nil -} - -// FromMulithash returns the digest portion of the multihash -// It will fail if the multihash is not a valid swarm multihash -func FromMultihash(data []byte) ([]byte, error) { - hashLength, _, err := GetMultihashLength(data) - if err != nil { - return nil, err - } - return data[len(data)-hashLength:], nil -} - -// ToMulithash wraps the provided digest data with a swarm mulithash header -func ToMultihash(hashData []byte) []byte { - buf := bytes.NewBuffer(nil) - b := make([]byte, 8) - c := binary.PutUvarint(b, uint64(multihashTypeCode)) - buf.Write(b[:c]) - c = binary.PutUvarint(b, uint64(len(hashData))) - buf.Write(b[:c]) - buf.Write(hashData) - return buf.Bytes() -} diff --git a/swarm/multihash/multihash_test.go b/swarm/multihash/multihash_test.go deleted file mode 100644 index 85df741ddac7..000000000000 --- a/swarm/multihash/multihash_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package multihash - -import ( - "bytes" - "math/rand" - "testing" -) - -// parse multihash, and check that invalid multihashes fail -func TestCheckMultihash(t *testing.T) { - hashbytes := make([]byte, 32) - c, err := rand.Read(hashbytes) - if err != nil { - t.Fatal(err) - } else if c < 32 { - t.Fatal("short read") - } - - expected := ToMultihash(hashbytes) - - l, hl, _ := GetMultihashLength(expected) - if l != 32 { - t.Fatalf("expected length %d, got %d", 32, l) - } else if hl != 2 { - t.Fatalf("expected header length %d, got %d", 2, hl) - } - if _, _, err := GetMultihashLength(expected[1:]); err == nil { - t.Fatal("expected failure on corrupt header") - } - if _, _, err := GetMultihashLength(expected[:len(expected)-2]); err == nil { - t.Fatal("expected failure on short content") - } - dh, _ := FromMultihash(expected) - if !bytes.Equal(dh, hashbytes) { - t.Fatalf("expected content hash %x, got %x", hashbytes, dh) - } -} diff --git a/swarm/network/README.md b/swarm/network/README.md deleted file mode 100644 index e9c9d30d0bcc..000000000000 --- a/swarm/network/README.md +++ /dev/null @@ -1,152 +0,0 @@ -## Streaming - -Streaming is a new protocol of the swarm bzz bundle of protocols. -This protocol provides the basic logic for chunk-based data flow. -It implements simple retrieve requests and delivery using priority queue. -A data exchange stream is a directional flow of chunks between peers. -The source of datachunks is the upstream, the receiver is called the -downstream peer. Each streaming protocol defines an outgoing streamer -and an incoming streamer, the former installing on the upstream, -the latter on the downstream peer. - -Subscribe on StreamerPeer launches an incoming streamer that sends -a subscribe msg upstream. The streamer on the upstream peer -handles the subscribe msg by installing the relevant outgoing streamer -. The modules now engage in a process of upstream sending a sequence of hashes of -chunks downstream (OfferedHashesMsg). The downstream peer evaluates which hashes are needed -and get it delivered by sending back a msg (WantedHashesMsg). - -Historical syncing is supported - currently not the right abstraction -- -state kept across sessions by saving a series of intervals after their last -batch actually arrived. - -Live streaming is also supported, by starting session from the first item -after the subscription. - -Provable data exchange. In case a stream represents a swarm document's data layer -or higher level chunks, streaming up to a certain index is always provable. It saves on -sending intermediate chunks. - -Using the streamer logic, various stream types are easy to implement: - -* light node requests: - * url lookup with offset - * document download - * document upload -* syncing - * live session syncing - * historical syncing -* simple retrieve requests and deliveries -* mutable resource updates streams -* receipting for finger pointing - -## Syncing - -Syncing is the process that makes sure storer nodes end up storing all and only the chunks that are requested from them. - -### Requirements - -- eventual consistency: so each chunk historical should be syncable -- since the same chunk can and will arrive from many peers, (network traffic should be -optimised, only one transfer of data per chunk) -- explicit request deliveries should be prioritised higher than recent chunks received -during the ongoing session which in turn should be higher than historical chunks. -- insured chunks should get receipted for finger pointing litigation, the receipts storage -should be organised efficiently, upstream peer should also be able to find these -receipts for a deleted chunk easily to refute their challenge. -- syncing should be resilient to cut connections, metadata should be persisted that -keep track of syncing state across sessions, historical syncing state should survive restart -- extra data structures to support syncing should be kept at minimum -- syncing is organized separately for chunk types (resource update v content chunk) -- various types of streams should have common logic abstracted - -Syncing is now entirely mediated by the localstore, ie., no processes or memory leaks due to network contention. -When a new chunk is stored, its chunk hash is index by proximity bin - -peers syncronise by getting the chunks closer to the downstream peer than to the upstream one. -Consequently peers just sync all stored items for the kad bin the receiving peer falls into. -The special case of nearest neighbour sets is handled by the downstream peer -indicating they want to sync all kademlia bins with proximity equal to or higher -than their depth. - -This sync state represents the initial state of a sync connection session. -Retrieval is dictated by downstream peers simply using a special streamer protocol. - -Syncing chunks created during the session by the upstream peer is called live session syncing -while syncing of earlier chunks is historical syncing. - -Once the relevant chunk is retrieved, downstream peer looks up all hash segments in its localstore -and sends to the upstream peer a message with a a bitvector to indicate -missing chunks (e.g., for chunk `k`, hash with chunk internal index which case ) -new items. In turn upstream peer sends the relevant chunk data alongside their index. - -On sending chunks there is a priority queue system. If during looking up hashes in its localstore, -downstream peer hits on an open request then a retrieve request is sent immediately to the upstream peer indicating -that no extra round of checks is needed. If another peers syncer hits the same open request, it is slightly unsafe to not ask -that peer too: if the first one disconnects before delivering or fails to deliver and therefore gets -disconnected, we should still be able to continue with the other. The minimum redundant traffic coming from such simultaneous -eventualities should be sufficiently rare not to warrant more complex treatment. - -Session syncing involves downstream peer to request a new state on a bin from upstream. -using the new state, the range (of chunks) between the previous state and the new one are retrieved -and chunks are requested identical to the historical case. After receiving all the missing chunks -from the new hashes, downstream peer will request a new range. If this happens before upstream peer updates a new state, -we say that session syncing is live or the two peers are in sync. In general the time interval passed since downstream peer request up to the current session cursor is a good indication of a permanent (probably increasing) lag. - -If there is no historical backlog, and downstream peer has an acceptable 'last synced' tag, then it is said to be fully synced with the upstream peer. -If a peer is fully synced with all its storer peers, it can advertise itself as globally fully synced. - -The downstream peer persists the record of the last synced offset. When the two peers disconnect and -reconnect syncing can start from there. -This situation however can also happen while historical syncing is not yet complete. -Effectively this means that the peer needs to persist a record of an arbitrary array of offset ranges covered. - -### Delivery requests - -once the appropriate ranges of the hashstream are retrieved and buffered, downstream peer just scans the hashes, looks them up in localstore, if not found, create a request entry. -The range is referenced by the chunk index. Alongside the name (indicating the stream, e.g., content chunks for bin 6) and the range -downstream peer sends a 128 long bitvector indicating which chunks are needed. -Newly created requests are satisfied bound together in a waitgroup which when done, will promptt sending the next one. -to be able to do check and storage concurrently, we keep a buffer of one, we start with two batches of hashes. -If there is nothing to give, upstream peers SetNextBatch is blocking. Subscription ends with an unsubscribe. which removes the syncer from the map. - -Canceling requests (for instance the late chunks of an erasure batch) should be a chan closed -on the request - -Simple request is also a subscribe -different streaming protocols are different p2p protocols with same message types. -the constructor is the Run function itself. which takes a streamerpeer as argument - - -### provable streams - -The swarm hash over the hash stream has many advantages. It implements a provable data transfer -and provide efficient storage for receipts in the form of inclusion proofs useable for finger pointing litigation. -When challenged on a missing chunk, upstream peer will provide an inclusion proof of a chunk hash against the state of the -sync stream. In order to be able to generate such an inclusion proof, upstream peer needs to store the hash index (counting consecutive hash-size segments) alongside the chunk data and preserve it even when the chunk data is deleted until the chunk is no longer insured. -if there is no valid insurance on the files the entry may be deleted. -As long as the chunk is preserved, no takeover proof will be needed since the node can respond to any challenge. -However, once the node needs to delete an insured chunk for capacity reasons, a receipt should be available to -refute the challenge by finger pointing to a downstream peer. -As part of the deletion protocol then, hashes of insured chunks to be removed are pushed to an infinite stream for every bin. - -Downstream peer on the other hand needs to make sure that they can only be finger pointed about a chunk they did receive and store. -For this the check of a state should be exhaustive. If historical syncing finishes on one state, all hashes before are covered, no -surprises. In other words historical syncing this process is self verifying. With session syncing however, it is not enough to check going back covering the range from old offset to new. Continuity (i.e., that the new state is extension of the old) needs to be verified: after downstream peer reads the range into a buffer, it appends the buffer the last known state at the last known offset and verifies the resulting hash matches -the latest state. Past intervals of historical syncing are checked via the session root. -Upstream peer signs the states, downstream peers can use as handover proofs. -Downstream peers sign off on a state together with an initial offset. - -Once historical syncing is complete and the session does not lag, downstream peer only preserves the latest upstream state and store the signed version. - -Upstream peer needs to keep the latest takeover states: each deleted chunk's hash should be covered by takeover proof of at least one peer. If historical syncing is complete, upstream peer typically will store only the latest takeover proof from downstream peer. -Crucially, the structure is totally independent of the number of peers in the bin, so it scales extremely well. - -## implementation - -The simplest protocol just involves upstream peer to prefix the key with the kademlia proximity order (say 0-15 or 0-31) -and simply iterate on index per bin when syncing with a peer. - -priority queues are used for sending chunks so that user triggered requests should be responded to first, session syncing second, and historical with lower priority. -The request on chunks remains implemented as a dataless entry in the memory store. -The lifecycle of this object should be more carefully thought through, ie., when it fails to retrieve it should be removed. diff --git a/swarm/network/bitvector/bitvector.go b/swarm/network/bitvector/bitvector.go deleted file mode 100644 index edc7c50cb7a8..000000000000 --- a/swarm/network/bitvector/bitvector.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package bitvector - -import ( - "errors" -) - -var errInvalidLength = errors.New("invalid length") - -type BitVector struct { - len int - b []byte -} - -func New(l int) (bv *BitVector, err error) { - return NewFromBytes(make([]byte, l/8+1), l) -} - -func NewFromBytes(b []byte, l int) (bv *BitVector, err error) { - if l <= 0 { - return nil, errInvalidLength - } - if len(b)*8 < l { - return nil, errInvalidLength - } - return &BitVector{ - len: l, - b: b, - }, nil -} - -func (bv *BitVector) Get(i int) bool { - bi := i / 8 - return bv.b[bi]&(0x1<. - -package bitvector - -import "testing" - -func TestBitvectorNew(t *testing.T) { - _, err := New(0) - if err != errInvalidLength { - t.Errorf("expected err %v, got %v", errInvalidLength, err) - } - - _, err = NewFromBytes(nil, 0) - if err != errInvalidLength { - t.Errorf("expected err %v, got %v", errInvalidLength, err) - } - - _, err = NewFromBytes([]byte{0}, 9) - if err != errInvalidLength { - t.Errorf("expected err %v, got %v", errInvalidLength, err) - } - - _, err = NewFromBytes(make([]byte, 8), 8) - if err != nil { - t.Error(err) - } -} - -func TestBitvectorGetSet(t *testing.T) { - for _, length := range []int{ - 1, - 2, - 4, - 8, - 9, - 15, - 16, - } { - bv, err := New(length) - if err != nil { - t.Errorf("error for length %v: %v", length, err) - } - - for i := 0; i < length; i++ { - if bv.Get(i) { - t.Errorf("expected false for element on index %v", i) - } - } - - func() { - defer func() { - if err := recover(); err == nil { - t.Errorf("expecting panic") - } - }() - bv.Get(length + 8) - }() - - for i := 0; i < length; i++ { - bv.Set(i, true) - for j := 0; j < length; j++ { - if j == i { - if !bv.Get(j) { - t.Errorf("element on index %v is not set to true", i) - } - } else { - if bv.Get(j) { - t.Errorf("element on index %v is not false", i) - } - } - } - - bv.Set(i, false) - - if bv.Get(i) { - t.Errorf("element on index %v is not set to false", i) - } - } - } -} - -func TestBitvectorNewFromBytesGet(t *testing.T) { - bv, err := NewFromBytes([]byte{8}, 8) - if err != nil { - t.Error(err) - } - if !bv.Get(3) { - t.Fatalf("element 3 is not set to true: state %08b", bv.b[0]) - } -} diff --git a/swarm/network/common.go b/swarm/network/common.go deleted file mode 100644 index 15b2e2060437..000000000000 --- a/swarm/network/common.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "fmt" - "strings" -) - -func LogAddrs(nns [][]byte) string { - var nnsa []string - for _, nn := range nns { - nnsa = append(nnsa, fmt.Sprintf("%08x", nn[:4])) - } - return strings.Join(nnsa, ", ") -} diff --git a/swarm/network/discovery.go b/swarm/network/discovery.go deleted file mode 100644 index 21703e70f112..000000000000 --- a/swarm/network/discovery.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "context" - "fmt" - "sync" - - "github.com/ethereum/go-ethereum/swarm/pot" -) - -// discovery bzz extension for requesting and relaying node address records - -// Peer wraps BzzPeer and embeds Kademlia overlay connectivity driver -type Peer struct { - *BzzPeer - kad *Kademlia - sentPeers bool // whether we already sent peer closer to this address - mtx sync.RWMutex // - peers map[string]bool // tracks node records sent to the peer - depth uint8 // the proximity order advertised by remote as depth of saturation -} - -// NewPeer constructs a discovery peer -func NewPeer(p *BzzPeer, kad *Kademlia) *Peer { - d := &Peer{ - kad: kad, - BzzPeer: p, - peers: make(map[string]bool), - } - // record remote as seen so we never send a peer its own record - d.seen(p.BzzAddr) - return d -} - -// HandleMsg is the message handler that delegates incoming messages -func (d *Peer) HandleMsg(ctx context.Context, msg interface{}) error { - switch msg := msg.(type) { - - case *peersMsg: - return d.handlePeersMsg(msg) - - case *subPeersMsg: - return d.handleSubPeersMsg(msg) - - default: - return fmt.Errorf("unknown message type: %T", msg) - } -} - -// NotifyDepth sends a message to all connections if depth of saturation is changed -func NotifyDepth(depth uint8, kad *Kademlia) { - f := func(val *Peer, po int, _ bool) bool { - val.NotifyDepth(depth) - return true - } - kad.EachConn(nil, 255, f) -} - -// NotifyPeer informs all peers about a newly added node -func NotifyPeer(p *BzzAddr, k *Kademlia) { - f := func(val *Peer, po int, _ bool) bool { - val.NotifyPeer(p, uint8(po)) - return true - } - k.EachConn(p.Address(), 255, f) -} - -// NotifyPeer notifies the remote node (recipient) about a peer if -// the peer's PO is within the recipients advertised depth -// OR the peer is closer to the recipient than self -// unless already notified during the connection session -func (d *Peer) NotifyPeer(a *BzzAddr, po uint8) { - // immediately return - if (po < d.getDepth() && pot.ProxCmp(d.kad.BaseAddr(), d, a) != 1) || d.seen(a) { - return - } - resp := &peersMsg{ - Peers: []*BzzAddr{a}, - } - go d.Send(context.TODO(), resp) -} - -// NotifyDepth sends a subPeers Msg to the receiver notifying them about -// a change in the depth of saturation -func (d *Peer) NotifyDepth(po uint8) { - go d.Send(context.TODO(), &subPeersMsg{Depth: po}) -} - -/* -peersMsg is the message to pass peer information -It is always a response to a peersRequestMsg - -The encoding of a peer address is identical the devp2p base protocol peers -messages: [IP, Port, NodeID], -Note that a node's FileStore address is not the NodeID but the hash of the NodeID. - -TODO: -To mitigate against spurious peers messages, requests should be remembered -and correctness of responses should be checked - -If the proxBin of peers in the response is incorrect the sender should be -disconnected -*/ - -// peersMsg encapsulates an array of peer addresses -// used for communicating about known peers -// relevant for bootstrapping connectivity and updating peersets -type peersMsg struct { - Peers []*BzzAddr -} - -// String pretty prints a peersMsg -func (msg peersMsg) String() string { - return fmt.Sprintf("%T: %v", msg, msg.Peers) -} - -// handlePeersMsg called by the protocol when receiving peerset (for target address) -// list of nodes ([]PeerAddr in peersMsg) is added to the overlay db using the -// Register interface method -func (d *Peer) handlePeersMsg(msg *peersMsg) error { - // register all addresses - if len(msg.Peers) == 0 { - return nil - } - - for _, a := range msg.Peers { - d.seen(a) - NotifyPeer(a, d.kad) - } - return d.kad.Register(msg.Peers...) -} - -// subPeers msg is communicating the depth of the overlay table of a peer -type subPeersMsg struct { - Depth uint8 -} - -// String returns the pretty printer -func (msg subPeersMsg) String() string { - return fmt.Sprintf("%T: request peers > PO%02d. ", msg, msg.Depth) -} - -func (d *Peer) handleSubPeersMsg(msg *subPeersMsg) error { - if !d.sentPeers { - d.setDepth(msg.Depth) - var peers []*BzzAddr - d.kad.EachConn(d.Over(), 255, func(p *Peer, po int, isproxbin bool) bool { - if pob, _ := pof(d, d.kad.BaseAddr(), 0); pob > po { - return false - } - if !d.seen(p.BzzAddr) { - peers = append(peers, p.BzzAddr) - } - return true - }) - if len(peers) > 0 { - go d.Send(context.TODO(), &peersMsg{Peers: peers}) - } - } - d.sentPeers = true - return nil -} - -// seen takes an peer address and checks if it was sent to a peer already -// if not, marks the peer as sent -func (d *Peer) seen(p *BzzAddr) bool { - d.mtx.Lock() - defer d.mtx.Unlock() - k := string(p.Address()) - if d.peers[k] { - return true - } - d.peers[k] = true - return false -} - -func (d *Peer) getDepth() uint8 { - d.mtx.RLock() - defer d.mtx.RUnlock() - return d.depth -} - -func (d *Peer) setDepth(depth uint8) { - d.mtx.Lock() - defer d.mtx.Unlock() - d.depth = depth -} diff --git a/swarm/network/discovery_test.go b/swarm/network/discovery_test.go deleted file mode 100644 index dd3299c0f1d6..000000000000 --- a/swarm/network/discovery_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "testing" - - p2ptest "github.com/ethereum/go-ethereum/p2p/testing" -) - -/*** - * - * - after connect, that outgoing subpeersmsg is sent - * - */ -func TestDiscovery(t *testing.T) { - params := NewHiveParams() - s, pp := newHiveTester(t, params, 1, nil) - - node := s.Nodes[0] - raddr := NewAddr(node) - pp.Register(raddr) - - // start the hive and wait for the connection - pp.Start(s.Server) - defer pp.Stop() - - // send subPeersMsg to the peer - err := s.TestExchanges(p2ptest.Exchange{ - Label: "outgoing subPeersMsg", - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &subPeersMsg{Depth: 0}, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} diff --git a/swarm/network/fetcher.go b/swarm/network/fetcher.go deleted file mode 100644 index 6aed57e225ec..000000000000 --- a/swarm/network/fetcher.go +++ /dev/null @@ -1,315 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "context" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -var searchTimeout = 1 * time.Second - -// Time to consider peer to be skipped. -// Also used in stream delivery. -var RequestTimeout = 10 * time.Second - -var maxHopCount uint8 = 20 // maximum number of forwarded requests (hops), to make sure requests are not forwarded forever in peer loops - -type RequestFunc func(context.Context, *Request) (*enode.ID, chan struct{}, error) - -// Fetcher is created when a chunk is not found locally. It starts a request handler loop once and -// keeps it alive until all active requests are completed. This can happen: -// 1. either because the chunk is delivered -// 2. or becuse the requestor cancelled/timed out -// Fetcher self destroys itself after it is completed. -// TODO: cancel all forward requests after termination -type Fetcher struct { - protoRequestFunc RequestFunc // request function fetcher calls to issue retrieve request for a chunk - addr storage.Address // the address of the chunk to be fetched - offerC chan *enode.ID // channel of sources (peer node id strings) - requestC chan uint8 // channel for incoming requests (with the hopCount value in it) - skipCheck bool -} - -type Request struct { - Addr storage.Address // chunk address - Source *enode.ID // nodeID of peer to request from (can be nil) - SkipCheck bool // whether to offer the chunk first or deliver directly - peersToSkip *sync.Map // peers not to request chunk from (only makes sense if source is nil) - HopCount uint8 // number of forwarded requests (hops) -} - -// NewRequest returns a new instance of Request based on chunk address skip check and -// a map of peers to skip. -func NewRequest(addr storage.Address, skipCheck bool, peersToSkip *sync.Map) *Request { - return &Request{ - Addr: addr, - SkipCheck: skipCheck, - peersToSkip: peersToSkip, - } -} - -// SkipPeer returns if the peer with nodeID should not be requested to deliver a chunk. -// Peers to skip are kept per Request and for a time period of RequestTimeout. -// This function is used in stream package in Delivery.RequestFromPeers to optimize -// requests for chunks. -func (r *Request) SkipPeer(nodeID string) bool { - val, ok := r.peersToSkip.Load(nodeID) - if !ok { - return false - } - t, ok := val.(time.Time) - if ok && time.Now().After(t.Add(RequestTimeout)) { - // deadine expired - r.peersToSkip.Delete(nodeID) - return false - } - return true -} - -// FetcherFactory is initialised with a request function and can create fetchers -type FetcherFactory struct { - request RequestFunc - skipCheck bool -} - -// NewFetcherFactory takes a request function and skip check parameter and creates a FetcherFactory -func NewFetcherFactory(request RequestFunc, skipCheck bool) *FetcherFactory { - return &FetcherFactory{ - request: request, - skipCheck: skipCheck, - } -} - -// New contructs a new Fetcher, for the given chunk. All peers in peersToSkip are not requested to -// deliver the given chunk. peersToSkip should always contain the peers which are actively requesting -// this chunk, to make sure we don't request back the chunks from them. -// The created Fetcher is started and returned. -func (f *FetcherFactory) New(ctx context.Context, source storage.Address, peersToSkip *sync.Map) storage.NetFetcher { - fetcher := NewFetcher(source, f.request, f.skipCheck) - go fetcher.run(ctx, peersToSkip) - return fetcher -} - -// NewFetcher creates a new Fetcher for the given chunk address using the given request function. -func NewFetcher(addr storage.Address, rf RequestFunc, skipCheck bool) *Fetcher { - return &Fetcher{ - addr: addr, - protoRequestFunc: rf, - offerC: make(chan *enode.ID), - requestC: make(chan uint8), - skipCheck: skipCheck, - } -} - -// Offer is called when an upstream peer offers the chunk via syncing as part of `OfferedHashesMsg` and the node does not have the chunk locally. -func (f *Fetcher) Offer(ctx context.Context, source *enode.ID) { - // First we need to have this select to make sure that we return if context is done - select { - case <-ctx.Done(): - return - default: - } - - // This select alone would not guarantee that we return of context is done, it could potentially - // push to offerC instead if offerC is available (see number 2 in https://golang.org/ref/spec#Select_statements) - select { - case f.offerC <- source: - case <-ctx.Done(): - } -} - -// Request is called when an upstream peer request the chunk as part of `RetrieveRequestMsg`, or from a local request through FileStore, and the node does not have the chunk locally. -func (f *Fetcher) Request(ctx context.Context, hopCount uint8) { - // First we need to have this select to make sure that we return if context is done - select { - case <-ctx.Done(): - return - default: - } - - if hopCount >= maxHopCount { - log.Debug("fetcher request hop count limit reached", "hops", hopCount) - return - } - - // This select alone would not guarantee that we return of context is done, it could potentially - // push to offerC instead if offerC is available (see number 2 in https://golang.org/ref/spec#Select_statements) - select { - case f.requestC <- hopCount + 1: - case <-ctx.Done(): - } -} - -// start prepares the Fetcher -// it keeps the Fetcher alive within the lifecycle of the passed context -func (f *Fetcher) run(ctx context.Context, peers *sync.Map) { - var ( - doRequest bool // determines if retrieval is initiated in the current iteration - wait *time.Timer // timer for search timeout - waitC <-chan time.Time // timer channel - sources []*enode.ID // known sources, ie. peers that offered the chunk - requested bool // true if the chunk was actually requested - hopCount uint8 - ) - gone := make(chan *enode.ID) // channel to signal that a peer we requested from disconnected - - // loop that keeps the fetching process alive - // after every request a timer is set. If this goes off we request again from another peer - // note that the previous request is still alive and has the chance to deliver, so - // rerequesting extends the search. ie., - // if a peer we requested from is gone we issue a new request, so the number of active - // requests never decreases - for { - select { - - // incoming offer - case source := <-f.offerC: - log.Trace("new source", "peer addr", source, "request addr", f.addr) - // 1) the chunk is offered by a syncing peer - // add to known sources - sources = append(sources, source) - // launch a request to the source iff the chunk was requested (not just expected because its offered by a syncing peer) - doRequest = requested - - // incoming request - case hopCount = <-f.requestC: - log.Trace("new request", "request addr", f.addr) - // 2) chunk is requested, set requested flag - // launch a request iff none been launched yet - doRequest = !requested - requested = true - - // peer we requested from is gone. fall back to another - // and remove the peer from the peers map - case id := <-gone: - log.Trace("peer gone", "peer id", id.String(), "request addr", f.addr) - peers.Delete(id.String()) - doRequest = requested - - // search timeout: too much time passed since the last request, - // extend the search to a new peer if we can find one - case <-waitC: - log.Trace("search timed out: rerequesting", "request addr", f.addr) - doRequest = requested - - // all Fetcher context closed, can quit - case <-ctx.Done(): - log.Trace("terminate fetcher", "request addr", f.addr) - // TODO: send cancelations to all peers left over in peers map (i.e., those we requested from) - return - } - - // need to issue a new request - if doRequest { - var err error - sources, err = f.doRequest(ctx, gone, peers, sources, hopCount) - if err != nil { - log.Info("unable to request", "request addr", f.addr, "err", err) - } - } - - // if wait channel is not set, set it to a timer - if requested { - if wait == nil { - wait = time.NewTimer(searchTimeout) - defer wait.Stop() - waitC = wait.C - } else { - // stop the timer and drain the channel if it was not drained earlier - if !wait.Stop() { - select { - case <-wait.C: - default: - } - } - // reset the timer to go off after searchTimeout - wait.Reset(searchTimeout) - } - } - doRequest = false - } -} - -// doRequest attempts at finding a peer to request the chunk from -// * first it tries to request explicitly from peers that are known to have offered the chunk -// * if there are no such peers (available) it tries to request it from a peer closest to the chunk address -// excluding those in the peersToSkip map -// * if no such peer is found an error is returned -// -// if a request is successful, -// * the peer's address is added to the set of peers to skip -// * the peer's address is removed from prospective sources, and -// * a go routine is started that reports on the gone channel if the peer is disconnected (or terminated their streamer) -func (f *Fetcher) doRequest(ctx context.Context, gone chan *enode.ID, peersToSkip *sync.Map, sources []*enode.ID, hopCount uint8) ([]*enode.ID, error) { - var i int - var sourceID *enode.ID - var quit chan struct{} - - req := &Request{ - Addr: f.addr, - SkipCheck: f.skipCheck, - peersToSkip: peersToSkip, - HopCount: hopCount, - } - - foundSource := false - // iterate over known sources - for i = 0; i < len(sources); i++ { - req.Source = sources[i] - var err error - sourceID, quit, err = f.protoRequestFunc(ctx, req) - if err == nil { - // remove the peer from known sources - // Note: we can modify the source although we are looping on it, because we break from the loop immediately - sources = append(sources[:i], sources[i+1:]...) - foundSource = true - break - } - } - - // if there are no known sources, or none available, we try request from a closest node - if !foundSource { - req.Source = nil - var err error - sourceID, quit, err = f.protoRequestFunc(ctx, req) - if err != nil { - // if no peers found to request from - return sources, err - } - } - // add peer to the set of peers to skip from now - peersToSkip.Store(sourceID.String(), time.Now()) - - // if the quit channel is closed, it indicates that the source peer we requested from - // disconnected or terminated its streamer - // here start a go routine that watches this channel and reports the source peer on the gone channel - // this go routine quits if the fetcher global context is done to prevent process leak - go func() { - select { - case <-quit: - gone <- sourceID - case <-ctx.Done(): - } - }() - return sources, nil -} diff --git a/swarm/network/fetcher_test.go b/swarm/network/fetcher_test.go deleted file mode 100644 index 3a926f475873..000000000000 --- a/swarm/network/fetcher_test.go +++ /dev/null @@ -1,487 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "context" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/p2p/enode" -) - -var requestedPeerID = enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8") -var sourcePeerID = enode.HexID("99d8594b52298567d2ca3f4c441a5ba0140ee9245e26460d01102a52773c73b9") - -// mockRequester pushes every request to the requestC channel when its doRequest function is called -type mockRequester struct { - // requests []Request - requestC chan *Request // when a request is coming it is pushed to requestC - waitTimes []time.Duration // with waitTimes[i] you can define how much to wait on the ith request (optional) - count int //counts the number of requests - quitC chan struct{} -} - -func newMockRequester(waitTimes ...time.Duration) *mockRequester { - return &mockRequester{ - requestC: make(chan *Request), - waitTimes: waitTimes, - quitC: make(chan struct{}), - } -} - -func (m *mockRequester) doRequest(ctx context.Context, request *Request) (*enode.ID, chan struct{}, error) { - waitTime := time.Duration(0) - if m.count < len(m.waitTimes) { - waitTime = m.waitTimes[m.count] - m.count++ - } - time.Sleep(waitTime) - m.requestC <- request - - // if there is a Source in the request use that, if not use the global requestedPeerId - source := request.Source - if source == nil { - source = &requestedPeerID - } - return source, m.quitC, nil -} - -// TestFetcherSingleRequest creates a Fetcher using mockRequester, and run it with a sample set of peers to skip. -// mockRequester pushes a Request on a channel every time the request function is called. Using -// this channel we test if calling Fetcher.Request calls the request function, and whether it uses -// the correct peers to skip which we provided for the fetcher.run function. -func TestFetcherSingleRequest(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peers := []string{"a", "b", "c", "d"} - peersToSkip := &sync.Map{} - for _, p := range peers { - peersToSkip.Store(p, time.Now()) - } - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - go fetcher.run(ctx, peersToSkip) - - rctx := context.Background() - fetcher.Request(rctx, 0) - - select { - case request := <-requester.requestC: - // request should contain all peers from peersToSkip provided to the fetcher - for _, p := range peers { - if _, ok := request.peersToSkip.Load(p); !ok { - t.Fatalf("request.peersToSkip misses peer") - } - } - - // source peer should be also added to peersToSkip eventually - time.Sleep(100 * time.Millisecond) - if _, ok := request.peersToSkip.Load(requestedPeerID.String()); !ok { - t.Fatalf("request.peersToSkip does not contain peer returned by the request function") - } - - // hopCount in the forwarded request should be incremented - if request.HopCount != 1 { - t.Fatalf("Expected request.HopCount 1 got %v", request.HopCount) - } - - // fetch should trigger a request, if it doesn't happen in time, test should fail - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetch timeout") - } -} - -// TestCancelStopsFetcher tests that a cancelled fetcher does not initiate further requests even if its fetch function is called -func TestFetcherCancelStopsFetcher(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - - // we start the fetcher, and then we immediately cancel the context - go fetcher.run(ctx, peersToSkip) - cancel() - - rctx, rcancel := context.WithTimeout(ctx, 100*time.Millisecond) - defer rcancel() - // we call Request with an active context - fetcher.Request(rctx, 0) - - // fetcher should not initiate request, we can only check by waiting a bit and making sure no request is happening - select { - case <-requester.requestC: - t.Fatalf("cancelled fetcher initiated request") - case <-time.After(200 * time.Millisecond): - } -} - -// TestFetchCancelStopsRequest tests that calling a Request function with a cancelled context does not initiate a request -func TestFetcherCancelStopsRequest(t *testing.T) { - requester := newMockRequester(100 * time.Millisecond) - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // we start the fetcher with an active context - go fetcher.run(ctx, peersToSkip) - - rctx, rcancel := context.WithCancel(context.Background()) - rcancel() - - // we call Request with a cancelled context - fetcher.Request(rctx, 0) - - // fetcher should not initiate request, we can only check by waiting a bit and making sure no request is happening - select { - case <-requester.requestC: - t.Fatalf("cancelled fetch function initiated request") - case <-time.After(200 * time.Millisecond): - } - - // if there is another Request with active context, there should be a request, because the fetcher itself is not cancelled - rctx = context.Background() - fetcher.Request(rctx, 0) - - select { - case <-requester.requestC: - case <-time.After(200 * time.Millisecond): - t.Fatalf("expected request") - } -} - -// TestOfferUsesSource tests Fetcher Offer behavior. -// In this case there should be 1 (and only one) request initiated from the source peer, and the -// source nodeid should appear in the peersToSkip map. -func TestFetcherOfferUsesSource(t *testing.T) { - requester := newMockRequester(100 * time.Millisecond) - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // start the fetcher - go fetcher.run(ctx, peersToSkip) - - rctx := context.Background() - // call the Offer function with the source peer - fetcher.Offer(rctx, &sourcePeerID) - - // fetcher should not initiate request - select { - case <-requester.requestC: - t.Fatalf("fetcher initiated request") - case <-time.After(200 * time.Millisecond): - } - - // call Request after the Offer - rctx = context.Background() - fetcher.Request(rctx, 0) - - // there should be exactly 1 request coming from fetcher - var request *Request - select { - case request = <-requester.requestC: - if *request.Source != sourcePeerID { - t.Fatalf("Expected source id %v got %v", sourcePeerID, request.Source) - } - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetcher did not initiate request") - } - - select { - case <-requester.requestC: - t.Fatalf("Fetcher number of requests expected 1 got 2") - case <-time.After(200 * time.Millisecond): - } - - // source peer should be added to peersToSkip eventually - time.Sleep(100 * time.Millisecond) - if _, ok := request.peersToSkip.Load(sourcePeerID.String()); !ok { - t.Fatalf("SourcePeerId not added to peersToSkip") - } -} - -func TestFetcherOfferAfterRequestUsesSourceFromContext(t *testing.T) { - requester := newMockRequester(100 * time.Millisecond) - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // start the fetcher - go fetcher.run(ctx, peersToSkip) - - // call Request first - rctx := context.Background() - fetcher.Request(rctx, 0) - - // there should be a request coming from fetcher - var request *Request - select { - case request = <-requester.requestC: - if request.Source != nil { - t.Fatalf("Incorrect source peer id, expected nil got %v", request.Source) - } - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetcher did not initiate request") - } - - // after the Request call Offer - fetcher.Offer(context.Background(), &sourcePeerID) - - // there should be a request coming from fetcher - select { - case request = <-requester.requestC: - if *request.Source != sourcePeerID { - t.Fatalf("Incorrect source peer id, expected %v got %v", sourcePeerID, request.Source) - } - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetcher did not initiate request") - } - - // source peer should be added to peersToSkip eventually - time.Sleep(100 * time.Millisecond) - if _, ok := request.peersToSkip.Load(sourcePeerID.String()); !ok { - t.Fatalf("SourcePeerId not added to peersToSkip") - } -} - -// TestFetcherRetryOnTimeout tests that fetch retries after searchTimeOut has passed -func TestFetcherRetryOnTimeout(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - // set searchTimeOut to low value so the test is quicker - defer func(t time.Duration) { - searchTimeout = t - }(searchTimeout) - searchTimeout = 250 * time.Millisecond - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // start the fetcher - go fetcher.run(ctx, peersToSkip) - - // call the fetch function with an active context - rctx := context.Background() - fetcher.Request(rctx, 0) - - // after 100ms the first request should be initiated - time.Sleep(100 * time.Millisecond) - - select { - case <-requester.requestC: - default: - t.Fatalf("fetch did not initiate request") - } - - // after another 100ms no new request should be initiated, because search timeout is 250ms - time.Sleep(100 * time.Millisecond) - - select { - case <-requester.requestC: - t.Fatalf("unexpected request from fetcher") - default: - } - - // after another 300ms search timeout is over, there should be a new request - time.Sleep(300 * time.Millisecond) - - select { - case <-requester.requestC: - default: - t.Fatalf("fetch did not retry request") - } -} - -// TestFetcherFactory creates a FetcherFactory and checks if the factory really creates and starts -// a Fetcher when it return a fetch function. We test the fetching functionality just by checking if -// a request is initiated when the fetch function is called -func TestFetcherFactory(t *testing.T) { - requester := newMockRequester(100 * time.Millisecond) - addr := make([]byte, 32) - fetcherFactory := NewFetcherFactory(requester.doRequest, false) - - peersToSkip := &sync.Map{} - - fetcher := fetcherFactory.New(context.Background(), addr, peersToSkip) - - fetcher.Request(context.Background(), 0) - - // check if the created fetchFunction really starts a fetcher and initiates a request - select { - case <-requester.requestC: - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetch timeout") - } - -} - -func TestFetcherRequestQuitRetriesRequest(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - // make sure searchTimeout is long so it is sure the request is not retried because of timeout - defer func(t time.Duration) { - searchTimeout = t - }(searchTimeout) - searchTimeout = 10 * time.Second - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - go fetcher.run(ctx, peersToSkip) - - rctx := context.Background() - fetcher.Request(rctx, 0) - - select { - case <-requester.requestC: - case <-time.After(200 * time.Millisecond): - t.Fatalf("request is not initiated") - } - - close(requester.quitC) - - select { - case <-requester.requestC: - case <-time.After(200 * time.Millisecond): - t.Fatalf("request is not initiated after failed request") - } -} - -// TestRequestSkipPeer checks if PeerSkip function will skip provided peer -// and not skip unknown one. -func TestRequestSkipPeer(t *testing.T) { - addr := make([]byte, 32) - peers := []enode.ID{ - enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8"), - enode.HexID("99d8594b52298567d2ca3f4c441a5ba0140ee9245e26460d01102a52773c73b9"), - } - - peersToSkip := new(sync.Map) - peersToSkip.Store(peers[0].String(), time.Now()) - r := NewRequest(addr, false, peersToSkip) - - if !r.SkipPeer(peers[0].String()) { - t.Errorf("peer not skipped") - } - - if r.SkipPeer(peers[1].String()) { - t.Errorf("peer skipped") - } -} - -// TestRequestSkipPeerExpired checks if a peer to skip is not skipped -// after RequestTimeout has passed. -func TestRequestSkipPeerExpired(t *testing.T) { - addr := make([]byte, 32) - peer := enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8") - - // set RequestTimeout to a low value and reset it after the test - defer func(t time.Duration) { RequestTimeout = t }(RequestTimeout) - RequestTimeout = 250 * time.Millisecond - - peersToSkip := new(sync.Map) - peersToSkip.Store(peer.String(), time.Now()) - r := NewRequest(addr, false, peersToSkip) - - if !r.SkipPeer(peer.String()) { - t.Errorf("peer not skipped") - } - - time.Sleep(500 * time.Millisecond) - - if r.SkipPeer(peer.String()) { - t.Errorf("peer skipped") - } -} - -// TestRequestSkipPeerPermanent checks if a peer to skip is not skipped -// after RequestTimeout is not skipped if it is set for a permanent skipping -// by value to peersToSkip map is not time.Duration. -func TestRequestSkipPeerPermanent(t *testing.T) { - addr := make([]byte, 32) - peer := enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8") - - // set RequestTimeout to a low value and reset it after the test - defer func(t time.Duration) { RequestTimeout = t }(RequestTimeout) - RequestTimeout = 250 * time.Millisecond - - peersToSkip := new(sync.Map) - peersToSkip.Store(peer.String(), true) - r := NewRequest(addr, false, peersToSkip) - - if !r.SkipPeer(peer.String()) { - t.Errorf("peer not skipped") - } - - time.Sleep(500 * time.Millisecond) - - if !r.SkipPeer(peer.String()) { - t.Errorf("peer not skipped") - } -} - -func TestFetcherMaxHopCount(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - peersToSkip := &sync.Map{} - - go fetcher.run(ctx, peersToSkip) - - rctx := context.Background() - fetcher.Request(rctx, maxHopCount) - - // if hopCount is already at max no request should be initiated - select { - case <-requester.requestC: - t.Fatalf("cancelled fetcher initiated request") - case <-time.After(200 * time.Millisecond): - } -} diff --git a/swarm/network/hive.go b/swarm/network/hive.go deleted file mode 100644 index 1aa1ae42a2af..000000000000 --- a/swarm/network/hive.go +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/state" -) - -/* -Hive is the logistic manager of the swarm - -When the hive is started, a forever loop is launched that -asks the kademlia nodetable -to suggest peers to bootstrap connectivity -*/ - -// HiveParams holds the config options to hive -type HiveParams struct { - Discovery bool // if want discovery of not - PeersBroadcastSetSize uint8 // how many peers to use when relaying - MaxPeersPerRequest uint8 // max size for peer address batches - KeepAliveInterval time.Duration -} - -// NewHiveParams returns hive config with only the -func NewHiveParams() *HiveParams { - return &HiveParams{ - Discovery: true, - PeersBroadcastSetSize: 3, - MaxPeersPerRequest: 5, - KeepAliveInterval: 500 * time.Millisecond, - } -} - -// Hive manages network connections of the swarm node -type Hive struct { - *HiveParams // settings - *Kademlia // the overlay connectiviy driver - Store state.Store // storage interface to save peers across sessions - addPeer func(*enode.Node) // server callback to connect to a peer - // bookkeeping - lock sync.Mutex - peers map[enode.ID]*BzzPeer - ticker *time.Ticker -} - -// NewHive constructs a new hive -// HiveParams: config parameters -// Kademlia: connectivity driver using a network topology -// StateStore: to save peers across sessions -func NewHive(params *HiveParams, kad *Kademlia, store state.Store) *Hive { - return &Hive{ - HiveParams: params, - Kademlia: kad, - Store: store, - peers: make(map[enode.ID]*BzzPeer), - } -} - -// Start stars the hive, receives p2p.Server only at startup -// server is used to connect to a peer based on its NodeID or enode URL -// these are called on the p2p.Server which runs on the node -func (h *Hive) Start(server *p2p.Server) error { - log.Info("Starting hive", "baseaddr", fmt.Sprintf("%x", h.BaseAddr()[:4])) - // if state store is specified, load peers to prepopulate the overlay address book - if h.Store != nil { - log.Info("Detected an existing store. trying to load peers") - if err := h.loadPeers(); err != nil { - log.Error(fmt.Sprintf("%08x hive encoutered an error trying to load peers", h.BaseAddr()[:4])) - return err - } - } - // assigns the p2p.Server#AddPeer function to connect to peers - h.addPeer = server.AddPeer - // ticker to keep the hive alive - h.ticker = time.NewTicker(h.KeepAliveInterval) - // this loop is doing bootstrapping and maintains a healthy table - go h.connect() - return nil -} - -// Stop terminates the updateloop and saves the peers -func (h *Hive) Stop() error { - log.Info(fmt.Sprintf("%08x hive stopping, saving peers", h.BaseAddr()[:4])) - h.ticker.Stop() - if h.Store != nil { - if err := h.savePeers(); err != nil { - return fmt.Errorf("could not save peers to persistence store: %v", err) - } - if err := h.Store.Close(); err != nil { - return fmt.Errorf("could not close file handle to persistence store: %v", err) - } - } - log.Info(fmt.Sprintf("%08x hive stopped, dropping peers", h.BaseAddr()[:4])) - h.EachConn(nil, 255, func(p *Peer, _ int, _ bool) bool { - log.Info(fmt.Sprintf("%08x dropping peer %08x", h.BaseAddr()[:4], p.Address()[:4])) - p.Drop(nil) - return true - }) - - log.Info(fmt.Sprintf("%08x all peers dropped", h.BaseAddr()[:4])) - return nil -} - -// connect is a forever loop -// at each iteration, ask the overlay driver to suggest the most preferred peer to connect to -// as well as advertises saturation depth if needed -func (h *Hive) connect() { - for range h.ticker.C { - - addr, depth, changed := h.SuggestPeer() - if h.Discovery && changed { - NotifyDepth(uint8(depth), h.Kademlia) - } - if addr == nil { - continue - } - - log.Trace(fmt.Sprintf("%08x hive connect() suggested %08x", h.BaseAddr()[:4], addr.Address()[:4])) - under, err := enode.ParseV4(string(addr.Under())) - if err != nil { - log.Warn(fmt.Sprintf("%08x unable to connect to bee %08x: invalid node URL: %v", h.BaseAddr()[:4], addr.Address()[:4], err)) - continue - } - log.Trace(fmt.Sprintf("%08x attempt to connect to bee %08x", h.BaseAddr()[:4], addr.Address()[:4])) - h.addPeer(under) - } -} - -// Run protocol run function -func (h *Hive) Run(p *BzzPeer) error { - h.trackPeer(p) - defer h.untrackPeer(p) - - dp := NewPeer(p, h.Kademlia) - depth, changed := h.On(dp) - // if we want discovery, advertise change of depth - if h.Discovery { - if changed { - // if depth changed, send to all peers - NotifyDepth(depth, h.Kademlia) - } else { - // otherwise just send depth to new peer - dp.NotifyDepth(depth) - } - } - NotifyPeer(p.BzzAddr, h.Kademlia) - defer h.Off(dp) - return dp.Run(dp.HandleMsg) -} - -func (h *Hive) trackPeer(p *BzzPeer) { - h.lock.Lock() - h.peers[p.ID()] = p - h.lock.Unlock() -} - -func (h *Hive) untrackPeer(p *BzzPeer) { - h.lock.Lock() - delete(h.peers, p.ID()) - h.lock.Unlock() -} - -// NodeInfo function is used by the p2p.server RPC interface to display -// protocol specific node information -func (h *Hive) NodeInfo() interface{} { - return h.String() -} - -// PeerInfo function is used by the p2p.server RPC interface to display -// protocol specific information any connected peer referred to by their NodeID -func (h *Hive) PeerInfo(id enode.ID) interface{} { - h.lock.Lock() - p := h.peers[id] - h.lock.Unlock() - - if p == nil { - return nil - } - addr := NewAddr(p.Node()) - return struct { - OAddr hexutil.Bytes - UAddr hexutil.Bytes - }{ - OAddr: addr.OAddr, - UAddr: addr.UAddr, - } -} - -// loadPeers, savePeer implement persistence callback/ -func (h *Hive) loadPeers() error { - var as []*BzzAddr - err := h.Store.Get("peers", &as) - if err != nil { - if err == state.ErrNotFound { - log.Info(fmt.Sprintf("hive %08x: no persisted peers found", h.BaseAddr()[:4])) - return nil - } - return err - } - log.Info(fmt.Sprintf("hive %08x: peers loaded", h.BaseAddr()[:4])) - - return h.Register(as...) -} - -// savePeers, savePeer implement persistence callback/ -func (h *Hive) savePeers() error { - var peers []*BzzAddr - h.Kademlia.EachAddr(nil, 256, func(pa *BzzAddr, i int, _ bool) bool { - if pa == nil { - log.Warn(fmt.Sprintf("empty addr: %v", i)) - return true - } - log.Trace("saving peer", "peer", pa) - peers = append(peers, pa) - return true - }) - if err := h.Store.Put("peers", peers); err != nil { - return fmt.Errorf("could not save peers: %v", err) - } - return nil -} diff --git a/swarm/network/hive_test.go b/swarm/network/hive_test.go deleted file mode 100644 index 059c3dc96dfd..000000000000 --- a/swarm/network/hive_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "io/ioutil" - "log" - "os" - "testing" - - p2ptest "github.com/ethereum/go-ethereum/p2p/testing" - "github.com/ethereum/go-ethereum/swarm/state" -) - -func newHiveTester(t *testing.T, params *HiveParams, n int, store state.Store) (*bzzTester, *Hive) { - // setup - addr := RandomAddr() // tested peers peer address - to := NewKademlia(addr.OAddr, NewKadParams()) - pp := NewHive(params, to, store) // hive - - return newBzzBaseTester(t, n, addr, DiscoverySpec, pp.Run), pp -} - -func TestRegisterAndConnect(t *testing.T) { - params := NewHiveParams() - s, pp := newHiveTester(t, params, 1, nil) - - node := s.Nodes[0] - raddr := NewAddr(node) - pp.Register(raddr) - - // start the hive and wait for the connection - err := pp.Start(s.Server) - if err != nil { - t.Fatal(err) - } - defer pp.Stop() - // retrieve and broadcast - err = s.TestDisconnected(&p2ptest.Disconnect{ - Peer: s.Nodes[0].ID(), - Error: nil, - }) - - if err == nil || err.Error() != "timed out waiting for peers to disconnect" { - t.Fatalf("expected peer to connect") - } -} - -func TestHiveStatePersistance(t *testing.T) { - log.SetOutput(os.Stdout) - - dir, err := ioutil.TempDir("", "hive_test_store") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir) - - store, err := state.NewDBStore(dir) //start the hive with an empty dbstore - - params := NewHiveParams() - s, pp := newHiveTester(t, params, 5, store) - - peers := make(map[string]bool) - for _, node := range s.Nodes { - raddr := NewAddr(node) - pp.Register(raddr) - peers[raddr.String()] = true - } - - // start the hive and wait for the connection - err = pp.Start(s.Server) - if err != nil { - t.Fatal(err) - } - pp.Stop() - store.Close() - - persistedStore, err := state.NewDBStore(dir) //start the hive with an empty dbstore - - s1, pp := newHiveTester(t, params, 1, persistedStore) - - //start the hive and wait for the connection - - pp.Start(s1.Server) - i := 0 - pp.Kademlia.EachAddr(nil, 256, func(addr *BzzAddr, po int, nn bool) bool { - delete(peers, addr.String()) - i++ - return true - }) - if i != 5 { - t.Errorf("invalid number of entries: got %v, want %v", i, 5) - } - if len(peers) != 0 { - t.Fatalf("%d peers left over: %v", len(peers), peers) - } -} diff --git a/swarm/network/kademlia.go b/swarm/network/kademlia.go deleted file mode 100644 index 55a0c6f13d61..000000000000 --- a/swarm/network/kademlia.go +++ /dev/null @@ -1,743 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "bytes" - "fmt" - "math/rand" - "strings" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/pot" -) - -/* - -Taking the proximity order relative to a fix point x classifies the points in -the space (n byte long byte sequences) into bins. Items in each are at -most half as distant from x as items in the previous bin. Given a sample of -uniformly distributed items (a hash function over arbitrary sequence) the -proximity scale maps onto series of subsets with cardinalities on a negative -exponential scale. - -It also has the property that any two item belonging to the same bin are at -most half as distant from each other as they are from x. - -If we think of random sample of items in the bins as connections in a network of -interconnected nodes then relative proximity can serve as the basis for local -decisions for graph traversal where the task is to find a route between two -points. Since in every hop, the finite distance halves, there is -a guaranteed constant maximum limit on the number of hops needed to reach one -node from the other. -*/ - -var pof = pot.DefaultPof(256) - -// KadParams holds the config params for Kademlia -type KadParams struct { - // adjustable parameters - MaxProxDisplay int // number of rows the table shows - MinProxBinSize int // nearest neighbour core minimum cardinality - MinBinSize int // minimum number of peers in a row - MaxBinSize int // maximum number of peers in a row before pruning - RetryInterval int64 // initial interval before a peer is first redialed - RetryExponent int // exponent to multiply retry intervals with - MaxRetries int // maximum number of redial attempts - // function to sanction or prevent suggesting a peer - Reachable func(*BzzAddr) bool -} - -// NewKadParams returns a params struct with default values -func NewKadParams() *KadParams { - return &KadParams{ - MaxProxDisplay: 16, - MinProxBinSize: 2, - MinBinSize: 2, - MaxBinSize: 4, - RetryInterval: 4200000000, // 4.2 sec - MaxRetries: 42, - RetryExponent: 2, - } -} - -// Kademlia is a table of live peers and a db of known peers (node records) -type Kademlia struct { - lock sync.RWMutex - *KadParams // Kademlia configuration parameters - base []byte // immutable baseaddress of the table - addrs *pot.Pot // pots container for known peer addresses - conns *pot.Pot // pots container for live peer connections - depth uint8 // stores the last current depth of saturation - nDepth int // stores the last neighbourhood depth - nDepthC chan int // returned by DepthC function to signal neighbourhood depth change - addrCountC chan int // returned by AddrCountC function to signal peer count change -} - -// NewKademlia creates a Kademlia table for base address addr -// with parameters as in params -// if params is nil, it uses default values -func NewKademlia(addr []byte, params *KadParams) *Kademlia { - if params == nil { - params = NewKadParams() - } - return &Kademlia{ - base: addr, - KadParams: params, - addrs: pot.NewPot(nil, 0), - conns: pot.NewPot(nil, 0), - } -} - -// entry represents a Kademlia table entry (an extension of BzzAddr) -type entry struct { - *BzzAddr - conn *Peer - seenAt time.Time - retries int -} - -// newEntry creates a kademlia peer from a *Peer -func newEntry(p *BzzAddr) *entry { - return &entry{ - BzzAddr: p, - seenAt: time.Now(), - } -} - -// Label is a short tag for the entry for debug -func Label(e *entry) string { - return fmt.Sprintf("%s (%d)", e.Hex()[:4], e.retries) -} - -// Hex is the hexadecimal serialisation of the entry address -func (e *entry) Hex() string { - return fmt.Sprintf("%x", e.Address()) -} - -// Register enters each address as kademlia peer record into the -// database of known peer addresses -func (k *Kademlia) Register(peers ...*BzzAddr) error { - k.lock.Lock() - defer k.lock.Unlock() - var known, size int - for _, p := range peers { - // error if self received, peer should know better - // and should be punished for this - if bytes.Equal(p.Address(), k.base) { - return fmt.Errorf("add peers: %x is self", k.base) - } - var found bool - k.addrs, _, found, _ = pot.Swap(k.addrs, p, pof, func(v pot.Val) pot.Val { - // if not found - if v == nil { - // insert new offline peer into conns - return newEntry(p) - } - // found among known peers, do nothing - return v - }) - if found { - known++ - } - size++ - } - // send new address count value only if there are new addresses - if k.addrCountC != nil && size-known > 0 { - k.addrCountC <- k.addrs.Size() - } - - k.sendNeighbourhoodDepthChange() - return nil -} - -// SuggestPeer returns a known peer for the lowest proximity bin for the -// lowest bincount below depth -// naturally if there is an empty row it returns a peer for that -func (k *Kademlia) SuggestPeer() (a *BzzAddr, o int, want bool) { - k.lock.Lock() - defer k.lock.Unlock() - minsize := k.MinBinSize - depth := k.neighbourhoodDepth() - // if there is a callable neighbour within the current proxBin, connect - // this makes sure nearest neighbour set is fully connected - var ppo int - k.addrs.EachNeighbour(k.base, pof, func(val pot.Val, po int) bool { - if po < depth { - return false - } - e := val.(*entry) - c := k.callable(e) - if c { - a = e.BzzAddr - } - ppo = po - return !c - }) - if a != nil { - log.Trace(fmt.Sprintf("%08x candidate nearest neighbour found: %v (%v)", k.BaseAddr()[:4], a, ppo)) - return a, 0, false - } - - var bpo []int - prev := -1 - k.conns.EachBin(k.base, pof, 0, func(po, size int, f func(func(val pot.Val, i int) bool) bool) bool { - prev++ - for ; prev < po; prev++ { - bpo = append(bpo, prev) - minsize = 0 - } - if size < minsize { - bpo = append(bpo, po) - minsize = size - } - return size > 0 && po < depth - }) - // all buckets are full, ie., minsize == k.MinBinSize - if len(bpo) == 0 { - return nil, 0, false - } - // as long as we got candidate peers to connect to - // dont ask for new peers (want = false) - // try to select a candidate peer - // find the first callable peer - nxt := bpo[0] - k.addrs.EachBin(k.base, pof, nxt, func(po, _ int, f func(func(pot.Val, int) bool) bool) bool { - // for each bin (up until depth) we find callable candidate peers - if po >= depth { - return false - } - return f(func(val pot.Val, _ int) bool { - e := val.(*entry) - c := k.callable(e) - if c { - a = e.BzzAddr - } - return !c - }) - }) - // found a candidate - if a != nil { - return a, 0, false - } - // no candidate peer found, request for the short bin - var changed bool - if uint8(nxt) < k.depth { - k.depth = uint8(nxt) - changed = true - } - return a, nxt, changed -} - -// On inserts the peer as a kademlia peer into the live peers -func (k *Kademlia) On(p *Peer) (uint8, bool) { - k.lock.Lock() - defer k.lock.Unlock() - var ins bool - k.conns, _, _, _ = pot.Swap(k.conns, p, pof, func(v pot.Val) pot.Val { - // if not found live - if v == nil { - ins = true - // insert new online peer into conns - return p - } - // found among live peers, do nothing - return v - }) - if ins { - a := newEntry(p.BzzAddr) - a.conn = p - // insert new online peer into addrs - k.addrs, _, _, _ = pot.Swap(k.addrs, p, pof, func(v pot.Val) pot.Val { - return a - }) - // send new address count value only if the peer is inserted - if k.addrCountC != nil { - k.addrCountC <- k.addrs.Size() - } - } - log.Trace(k.string()) - // calculate if depth of saturation changed - depth := uint8(k.saturation(k.MinBinSize)) - var changed bool - if depth != k.depth { - changed = true - k.depth = depth - } - k.sendNeighbourhoodDepthChange() - return k.depth, changed -} - -// NeighbourhoodDepthC returns the channel that sends a new kademlia -// neighbourhood depth on each change. -// Not receiving from the returned channel will block On function -// when the neighbourhood depth is changed. -func (k *Kademlia) NeighbourhoodDepthC() <-chan int { - k.lock.Lock() - defer k.lock.Unlock() - if k.nDepthC == nil { - k.nDepthC = make(chan int) - } - return k.nDepthC -} - -// sendNeighbourhoodDepthChange sends new neighbourhood depth to k.nDepth channel -// if it is initialized. -func (k *Kademlia) sendNeighbourhoodDepthChange() { - // nDepthC is initialized when NeighbourhoodDepthC is called and returned by it. - // It provides signaling of neighbourhood depth change. - // This part of the code is sending new neighbourhood depth to nDepthC if that condition is met. - if k.nDepthC != nil { - nDepth := k.neighbourhoodDepth() - if nDepth != k.nDepth { - k.nDepth = nDepth - k.nDepthC <- nDepth - } - } -} - -// AddrCountC returns the channel that sends a new -// address count value on each change. -// Not receiving from the returned channel will block Register function -// when address count value changes. -func (k *Kademlia) AddrCountC() <-chan int { - if k.addrCountC == nil { - k.addrCountC = make(chan int) - } - return k.addrCountC -} - -// Off removes a peer from among live peers -func (k *Kademlia) Off(p *Peer) { - k.lock.Lock() - defer k.lock.Unlock() - var del bool - k.addrs, _, _, _ = pot.Swap(k.addrs, p, pof, func(v pot.Val) pot.Val { - // v cannot be nil, must check otherwise we overwrite entry - if v == nil { - panic(fmt.Sprintf("connected peer not found %v", p)) - } - del = true - return newEntry(p.BzzAddr) - }) - - if del { - k.conns, _, _, _ = pot.Swap(k.conns, p, pof, func(_ pot.Val) pot.Val { - // v cannot be nil, but no need to check - return nil - }) - // send new address count value only if the peer is deleted - if k.addrCountC != nil { - k.addrCountC <- k.addrs.Size() - } - k.sendNeighbourhoodDepthChange() - } -} - -func (k *Kademlia) EachBin(base []byte, pof pot.Pof, o int, eachBinFunc func(conn *Peer, po int) bool) { - k.lock.RLock() - defer k.lock.RUnlock() - - var startPo int - var endPo int - kadDepth := k.neighbourhoodDepth() - - k.conns.EachBin(base, pof, o, func(po, size int, f func(func(val pot.Val, i int) bool) bool) bool { - if startPo > 0 && endPo != k.MaxProxDisplay { - startPo = endPo + 1 - } - if po < kadDepth { - endPo = po - } else { - endPo = k.MaxProxDisplay - } - - for bin := startPo; bin <= endPo; bin++ { - f(func(val pot.Val, _ int) bool { - return eachBinFunc(val.(*Peer), bin) - }) - } - return true - }) -} - -// EachConn is an iterator with args (base, po, f) applies f to each live peer -// that has proximity order po or less as measured from the base -// if base is nil, kademlia base address is used -func (k *Kademlia) EachConn(base []byte, o int, f func(*Peer, int, bool) bool) { - k.lock.RLock() - defer k.lock.RUnlock() - k.eachConn(base, o, f) -} - -func (k *Kademlia) eachConn(base []byte, o int, f func(*Peer, int, bool) bool) { - if len(base) == 0 { - base = k.base - } - depth := k.neighbourhoodDepth() - k.conns.EachNeighbour(base, pof, func(val pot.Val, po int) bool { - if po > o { - return true - } - return f(val.(*Peer), po, po >= depth) - }) -} - -// EachAddr called with (base, po, f) is an iterator applying f to each known peer -// that has proximity order po or less as measured from the base -// if base is nil, kademlia base address is used -func (k *Kademlia) EachAddr(base []byte, o int, f func(*BzzAddr, int, bool) bool) { - k.lock.RLock() - defer k.lock.RUnlock() - k.eachAddr(base, o, f) -} - -func (k *Kademlia) eachAddr(base []byte, o int, f func(*BzzAddr, int, bool) bool) { - if len(base) == 0 { - base = k.base - } - depth := k.neighbourhoodDepth() - k.addrs.EachNeighbour(base, pof, func(val pot.Val, po int) bool { - if po > o { - return true - } - return f(val.(*entry).BzzAddr, po, po >= depth) - }) -} - -// neighbourhoodDepth returns the proximity order that defines the distance of -// the nearest neighbour set with cardinality >= MinProxBinSize -// if there is altogether less than MinProxBinSize peers it returns 0 -// caller must hold the lock -func (k *Kademlia) neighbourhoodDepth() (depth int) { - if k.conns.Size() < k.MinProxBinSize { - return 0 - } - var size int - f := func(v pot.Val, i int) bool { - size++ - depth = i - return size < k.MinProxBinSize - } - k.conns.EachNeighbour(k.base, pof, f) - return depth -} - -// callable decides if an address entry represents a callable peer -func (k *Kademlia) callable(e *entry) bool { - // not callable if peer is live or exceeded maxRetries - if e.conn != nil || e.retries > k.MaxRetries { - return false - } - // calculate the allowed number of retries based on time lapsed since last seen - timeAgo := int64(time.Since(e.seenAt)) - div := int64(k.RetryExponent) - div += (150000 - rand.Int63n(300000)) * div / 1000000 - var retries int - for delta := timeAgo; delta > k.RetryInterval; delta /= div { - retries++ - } - // this is never called concurrently, so safe to increment - // peer can be retried again - if retries < e.retries { - log.Trace(fmt.Sprintf("%08x: %v long time since last try (at %v) needed before retry %v, wait only warrants %v", k.BaseAddr()[:4], e, timeAgo, e.retries, retries)) - return false - } - // function to sanction or prevent suggesting a peer - if k.Reachable != nil && !k.Reachable(e.BzzAddr) { - log.Trace(fmt.Sprintf("%08x: peer %v is temporarily not callable", k.BaseAddr()[:4], e)) - return false - } - e.retries++ - log.Trace(fmt.Sprintf("%08x: peer %v is callable", k.BaseAddr()[:4], e)) - - return true -} - -// BaseAddr return the kademlia base address -func (k *Kademlia) BaseAddr() []byte { - return k.base -} - -// String returns kademlia table + kaddb table displayed with ascii -func (k *Kademlia) String() string { - k.lock.RLock() - defer k.lock.RUnlock() - return k.string() -} - -// string returns kademlia table + kaddb table displayed with ascii -// caller must hold the lock -func (k *Kademlia) string() string { - wsrow := " " - var rows []string - - rows = append(rows, "=========================================================================") - rows = append(rows, fmt.Sprintf("%v KΛÐΞMLIΛ hive: queen's address: %x", time.Now().UTC().Format(time.UnixDate), k.BaseAddr()[:3])) - rows = append(rows, fmt.Sprintf("population: %d (%d), MinProxBinSize: %d, MinBinSize: %d, MaxBinSize: %d", k.conns.Size(), k.addrs.Size(), k.MinProxBinSize, k.MinBinSize, k.MaxBinSize)) - - liverows := make([]string, k.MaxProxDisplay) - peersrows := make([]string, k.MaxProxDisplay) - - depth := k.neighbourhoodDepth() - rest := k.conns.Size() - k.conns.EachBin(k.base, pof, 0, func(po, size int, f func(func(val pot.Val, i int) bool) bool) bool { - var rowlen int - if po >= k.MaxProxDisplay { - po = k.MaxProxDisplay - 1 - } - row := []string{fmt.Sprintf("%2d", size)} - rest -= size - f(func(val pot.Val, vpo int) bool { - e := val.(*Peer) - row = append(row, fmt.Sprintf("%x", e.Address()[:2])) - rowlen++ - return rowlen < 4 - }) - r := strings.Join(row, " ") - r = r + wsrow - liverows[po] = r[:31] - return true - }) - - k.addrs.EachBin(k.base, pof, 0, func(po, size int, f func(func(val pot.Val, i int) bool) bool) bool { - var rowlen int - if po >= k.MaxProxDisplay { - po = k.MaxProxDisplay - 1 - } - if size < 0 { - panic("wtf") - } - row := []string{fmt.Sprintf("%2d", size)} - // we are displaying live peers too - f(func(val pot.Val, vpo int) bool { - e := val.(*entry) - row = append(row, Label(e)) - rowlen++ - return rowlen < 4 - }) - peersrows[po] = strings.Join(row, " ") - return true - }) - - for i := 0; i < k.MaxProxDisplay; i++ { - if i == depth { - rows = append(rows, fmt.Sprintf("============ DEPTH: %d ==========================================", i)) - } - left := liverows[i] - right := peersrows[i] - if len(left) == 0 { - left = " 0 " - } - if len(right) == 0 { - right = " 0" - } - rows = append(rows, fmt.Sprintf("%03d %v | %v", i, left, right)) - } - rows = append(rows, "=========================================================================") - return "\n" + strings.Join(rows, "\n") -} - -// PeerPot keeps info about expected nearest neighbours and empty bins -// used for testing only -type PeerPot struct { - NNSet [][]byte - EmptyBins []int -} - -// NewPeerPotMap creates a map of pot record of *BzzAddr with keys -// as hexadecimal representations of the address. -// used for testing only -func NewPeerPotMap(kadMinProxSize int, addrs [][]byte) map[string]*PeerPot { - // create a table of all nodes for health check - np := pot.NewPot(nil, 0) - for _, addr := range addrs { - np, _, _ = pot.Add(np, addr, pof) - } - ppmap := make(map[string]*PeerPot) - - for i, a := range addrs { - pl := 256 - prev := 256 - var emptyBins []int - var nns [][]byte - np.EachNeighbour(addrs[i], pof, func(val pot.Val, po int) bool { - a := val.([]byte) - if po == 256 { - return true - } - if pl == 256 || pl == po { - nns = append(nns, a) - } - if pl == 256 && len(nns) >= kadMinProxSize { - pl = po - prev = po - } - if prev < pl { - for j := prev; j > po; j-- { - emptyBins = append(emptyBins, j) - } - } - prev = po - 1 - return true - }) - for j := prev; j >= 0; j-- { - emptyBins = append(emptyBins, j) - } - log.Trace(fmt.Sprintf("%x NNS: %s", addrs[i][:4], LogAddrs(nns))) - ppmap[common.Bytes2Hex(a)] = &PeerPot{nns, emptyBins} - } - return ppmap -} - -// saturation returns the lowest proximity order that the bin for that order -// has less than n peers -// It is used in Healthy function for testing only -func (k *Kademlia) saturation(n int) int { - prev := -1 - k.addrs.EachBin(k.base, pof, 0, func(po, size int, f func(func(val pot.Val, i int) bool) bool) bool { - prev++ - return prev == po && size >= n - }) - depth := k.neighbourhoodDepth() - if depth < prev { - return depth - } - return prev -} - -// full returns true if all required bins have connected peers. -// It is used in Healthy function for testing only -func (k *Kademlia) full(emptyBins []int) (full bool) { - prev := 0 - e := len(emptyBins) - ok := true - depth := k.neighbourhoodDepth() - k.conns.EachBin(k.base, pof, 0, func(po, _ int, _ func(func(val pot.Val, i int) bool) bool) bool { - if prev == depth+1 { - return true - } - for i := prev; i < po; i++ { - e-- - if e < 0 { - ok = false - return false - } - if emptyBins[e] != i { - log.Trace(fmt.Sprintf("%08x po: %d, i: %d, e: %d, emptybins: %v", k.BaseAddr()[:4], po, i, e, logEmptyBins(emptyBins))) - if emptyBins[e] < i { - panic("incorrect peerpot") - } - ok = false - return false - } - } - prev = po + 1 - return true - }) - if !ok { - return false - } - return e == 0 -} - -// knowNearestNeighbours tests if all known nearest neighbours given as arguments -// are found in the addressbook -// It is used in Healthy function for testing only -func (k *Kademlia) knowNearestNeighbours(peers [][]byte) bool { - pm := make(map[string]bool) - - k.eachAddr(nil, 255, func(p *BzzAddr, po int, nn bool) bool { - if !nn { - return false - } - pk := fmt.Sprintf("%x", p.Address()) - pm[pk] = true - return true - }) - for _, p := range peers { - pk := fmt.Sprintf("%x", p) - if !pm[pk] { - log.Trace(fmt.Sprintf("%08x: known nearest neighbour %s not found", k.BaseAddr()[:4], pk[:8])) - return false - } - } - return true -} - -// gotNearestNeighbours tests if all known nearest neighbours given as arguments -// are connected peers -// It is used in Healthy function for testing only -func (k *Kademlia) gotNearestNeighbours(peers [][]byte) (got bool, n int, missing [][]byte) { - pm := make(map[string]bool) - - k.eachConn(nil, 255, func(p *Peer, po int, nn bool) bool { - if !nn { - return false - } - pk := fmt.Sprintf("%x", p.Address()) - pm[pk] = true - return true - }) - var gots int - var culprits [][]byte - for _, p := range peers { - pk := fmt.Sprintf("%x", p) - if pm[pk] { - gots++ - } else { - log.Trace(fmt.Sprintf("%08x: ExpNN: %s not found", k.BaseAddr()[:4], pk[:8])) - culprits = append(culprits, p) - } - } - return gots == len(peers), gots, culprits -} - -// Health state of the Kademlia -// used for testing only -type Health struct { - KnowNN bool // whether node knows all its nearest neighbours - GotNN bool // whether node is connected to all its nearest neighbours - CountNN int // amount of nearest neighbors connected to - CulpritsNN [][]byte // which known NNs are missing - Full bool // whether node has a peer in each kademlia bin (where there is such a peer) - Hive string -} - -// Healthy reports the health state of the kademlia connectivity -// returns a Health struct -// used for testing only -func (k *Kademlia) Healthy(pp *PeerPot) *Health { - k.lock.RLock() - defer k.lock.RUnlock() - gotnn, countnn, culpritsnn := k.gotNearestNeighbours(pp.NNSet) - knownn := k.knowNearestNeighbours(pp.NNSet) - full := k.full(pp.EmptyBins) - log.Trace(fmt.Sprintf("%08x: healthy: knowNNs: %v, gotNNs: %v, full: %v\n", k.BaseAddr()[:4], knownn, gotnn, full)) - return &Health{knownn, gotnn, countnn, culpritsnn, full, k.string()} -} - -func logEmptyBins(ebs []int) string { - var ebss []string - for _, eb := range ebs { - ebss = append(ebss, fmt.Sprintf("%d", eb)) - } - return strings.Join(ebss, ", ") -} diff --git a/swarm/network/kademlia_test.go b/swarm/network/kademlia_test.go deleted file mode 100644 index 903c8dbdac1e..000000000000 --- a/swarm/network/kademlia_test.go +++ /dev/null @@ -1,596 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "bytes" - "fmt" - "os" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/pot" -) - -func init() { - h := log.LvlFilterHandler(log.LvlWarn, log.StreamHandler(os.Stderr, log.TerminalFormat(true))) - log.Root().SetHandler(h) -} - -func testKadPeerAddr(s string) *BzzAddr { - a := pot.NewAddressFromString(s) - return &BzzAddr{OAddr: a, UAddr: a} -} - -func newTestKademlia(b string) *Kademlia { - params := NewKadParams() - params.MinBinSize = 1 - params.MinProxBinSize = 2 - base := pot.NewAddressFromString(b) - return NewKademlia(base, params) -} - -func newTestKadPeer(k *Kademlia, s string) *Peer { - return NewPeer(&BzzPeer{BzzAddr: testKadPeerAddr(s)}, k) -} - -func On(k *Kademlia, ons ...string) { - for _, s := range ons { - k.On(newTestKadPeer(k, s)) - } -} - -func Off(k *Kademlia, offs ...string) { - for _, s := range offs { - k.Off(newTestKadPeer(k, s)) - } -} - -func Register(k *Kademlia, regs ...string) { - var as []*BzzAddr - for _, s := range regs { - as = append(as, testKadPeerAddr(s)) - } - err := k.Register(as...) - if err != nil { - panic(err.Error()) - } -} - -func testSuggestPeer(k *Kademlia, expAddr string, expPo int, expWant bool) error { - addr, o, want := k.SuggestPeer() - if binStr(addr) != expAddr { - return fmt.Errorf("incorrect peer address suggested. expected %v, got %v", expAddr, binStr(addr)) - } - if o != expPo { - return fmt.Errorf("incorrect prox order suggested. expected %v, got %v", expPo, o) - } - if want != expWant { - return fmt.Errorf("expected SuggestPeer to want peers: %v", expWant) - } - return nil -} - -func binStr(a *BzzAddr) string { - if a == nil { - return "" - } - return pot.ToBin(a.Address())[:8] -} - -func TestSuggestPeerBug(t *testing.T) { - // 2 row gap, unsaturated proxbin, no callables -> want PO 0 - k := newTestKademlia("00000000") - On(k, - "10000000", "11000000", - "01000000", - - "00010000", "00011000", - ) - Off(k, - "01000000", - ) - err := testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } -} - -func TestSuggestPeerFindPeers(t *testing.T) { - // 2 row gap, unsaturated proxbin, no callables -> want PO 0 - k := newTestKademlia("00000000") - On(k, "00100000") - err := testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - // 2 row gap, saturated proxbin, no callables -> want PO 0 - On(k, "00010000") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - // 1 row gap (1 less), saturated proxbin, no callables -> want PO 1 - On(k, "10000000") - err = testSuggestPeer(k, "", 1, false) - if err != nil { - t.Fatal(err.Error()) - } - - // no gap (1 less), saturated proxbin, no callables -> do not want more - On(k, "01000000", "00100001") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - // oversaturated proxbin, > do not want more - On(k, "00100001") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - // reintroduce gap, disconnected peer callable - Off(k, "01000000") - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - // second time disconnected peer not callable - // with reasonably set Interval - err = testSuggestPeer(k, "", 1, true) - if err != nil { - t.Fatal(err.Error()) - } - - // on and off again, peer callable again - On(k, "01000000") - Off(k, "01000000") - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - On(k, "01000000") - // new closer peer appears, it is immediately wanted - Register(k, "00010001") - err = testSuggestPeer(k, "00010001", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - // PO1 disconnects - On(k, "00010001") - log.Info(k.String()) - Off(k, "01000000") - log.Info(k.String()) - // second time, gap filling - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - On(k, "01000000") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - k.MinBinSize = 2 - err = testSuggestPeer(k, "", 0, true) - if err != nil { - t.Fatal(err.Error()) - } - - Register(k, "01000001") - err = testSuggestPeer(k, "01000001", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - On(k, "10000001") - log.Trace(fmt.Sprintf("Kad:\n%v", k.String())) - err = testSuggestPeer(k, "", 1, true) - if err != nil { - t.Fatal(err.Error()) - } - - On(k, "01000001") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - k.MinBinSize = 3 - Register(k, "10000010") - err = testSuggestPeer(k, "10000010", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - On(k, "10000010") - err = testSuggestPeer(k, "", 1, false) - if err != nil { - t.Fatal(err.Error()) - } - - On(k, "01000010") - err = testSuggestPeer(k, "", 2, false) - if err != nil { - t.Fatal(err.Error()) - } - - On(k, "00100010") - err = testSuggestPeer(k, "", 3, false) - if err != nil { - t.Fatal(err.Error()) - } - - On(k, "00010010") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - -} - -func TestSuggestPeerRetries(t *testing.T) { - k := newTestKademlia("00000000") - k.RetryInterval = int64(300 * time.Millisecond) // cycle - k.MaxRetries = 50 - k.RetryExponent = 2 - sleep := func(n int) { - ts := k.RetryInterval - for i := 1; i < n; i++ { - ts *= int64(k.RetryExponent) - } - time.Sleep(time.Duration(ts)) - } - - Register(k, "01000000") - On(k, "00000001", "00000010") - err := testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - sleep(1) - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - sleep(1) - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - sleep(2) - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - sleep(2) - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - -} - -func TestKademliaHiveString(t *testing.T) { - k := newTestKademlia("00000000") - On(k, "01000000", "00100000") - Register(k, "10000000", "10000001") - k.MaxProxDisplay = 8 - h := k.String() - expH := "\n=========================================================================\nMon Feb 27 12:10:28 UTC 2017 KΛÐΞMLIΛ hive: queen's address: 000000\npopulation: 2 (4), MinProxBinSize: 2, MinBinSize: 1, MaxBinSize: 4\n000 0 | 2 8100 (0) 8000 (0)\n============ DEPTH: 1 ==========================================\n001 1 4000 | 1 4000 (0)\n002 1 2000 | 1 2000 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n=========================================================================" - if expH[104:] != h[104:] { - t.Fatalf("incorrect hive output. expected %v, got %v", expH, h) - } -} - -// testKademliaCase constructs the kademlia and PeerPot map to validate -// the SuggestPeer and Healthy methods for provided hex-encoded addresses. -// Argument pivotAddr is the address of the kademlia. -func testKademliaCase(t *testing.T, pivotAddr string, addrs ...string) { - addr := common.FromHex(pivotAddr) - addrs = append(addrs, pivotAddr) - - k := NewKademlia(addr, NewKadParams()) - - as := make([][]byte, len(addrs)) - for i, a := range addrs { - as[i] = common.FromHex(a) - } - - for _, a := range as { - if bytes.Equal(a, addr) { - continue - } - p := &BzzAddr{OAddr: a, UAddr: a} - if err := k.Register(p); err != nil { - t.Fatal(err) - } - } - - ppmap := NewPeerPotMap(2, as) - - pp := ppmap[pivotAddr] - - for { - a, _, _ := k.SuggestPeer() - if a == nil { - break - } - k.On(NewPeer(&BzzPeer{BzzAddr: a}, k)) - } - - h := k.Healthy(pp) - if !(h.GotNN && h.KnowNN && h.Full) { - t.Fatalf("not healthy: %#v\n%v", h, k.String()) - } -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 12:18:24 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 7efef1 -population: 9 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 d7e5 ec56 | 18 ec56 (0) d7e5 (0) d9e0 (0) c735 (0) -001 2 18f1 3176 | 14 18f1 (0) 10bb (0) 10d1 (0) 0421 (0) -002 2 52aa 47cd | 11 52aa (0) 51d9 (0) 5161 (0) 5130 (0) -003 1 646e | 1 646e (0) -004 0 | 3 769c (0) 76d1 (0) 7656 (0) -============ DEPTH: 5 ========================================== -005 1 7a48 | 1 7a48 (0) -006 1 7cbd | 1 7cbd (0) -007 0 | 0 -008 0 | 0 -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase1(t *testing.T) { - testKademliaCase(t, - "7efef1c41d77f843ad167be95f6660567eb8a4a59f39240000cce2e0d65baf8e", - "ec560e6a4806aa37f147ee83687f3cf044d9953e61eedb8c34b6d50d9e2c5623", - "646e9540c84f6a2f9cf6585d45a4c219573b4fd1b64a3c9a1386fc5cf98c0d4d", - "18f13c5fba653781019025ab10e8d2fdc916d6448729268afe9e928ffcdbb8e8", - "317617acf99b4ffddda8a736f8fc6c6ede0bf690bc23d834123823e6d03e2f69", - "d7e52d9647a5d1c27a68c3ee65d543be3947ae4b68537b236d71ef9cb15fb9ab", - "7a48f75f8ca60487ae42d6f92b785581b40b91f2da551ae73d5eae46640e02e8", - "7cbd42350bde8e18ae5b955b5450f8e2cef3419f92fbf5598160c60fd78619f0", - "52aa3ddec61f4d48dd505a2385403c634f6ad06ee1d99c5c90a5ba6006f9af9c", - "47cdb6fa93eeb8bc91a417ff4e3b14a9c2ea85137462e2f575fae97f0c4be60d", - "5161943eb42e2a03e715fe8afa1009ff5200060c870ead6ab103f63f26cb107f", - "a38eaa1255f76bf883ca0830c86e8c4bb7eed259a8348aae9b03f21f90105bee", - "b2522bdf1ab26f324e75424fdf6e493b47e8a27687fe76347607b344fc010075", - "5bd7213964efb2580b91d02ac31ef126838abeba342f5dbdbe8d4d03562671a2", - "0b531adb82744768b694d7f94f73d4f0c9de591266108daeb8c74066bfc9c9ca", - "28501f59f70e888d399570145ed884353e017443c675aa12731ada7c87ea14f7", - "4a45f1fc63e1a9cb9dfa44c98da2f3d20c2923e5d75ff60b2db9d1bdb0c54d51", - "b193431ee35cd32de95805e7c1c749450c47486595aae7195ea6b6019a64fd61", - "baebf36a1e35a7ed834e1c72faf44ba16c159fa47d3289ceb3ca35fefa8739b5", - "a3659bd32e05fa36c8d20dbaaed8362bf1a8a7bd116aed62d8a43a2efbdf513f", - "10d1b50881a4770ebebdd0a75589dabb931e6716747b0f65fd6b080b88c4fdb6", - "3c76b8ca5c7ce6a03320646826213f59229626bf5b9d25da0c3ec0662dcb8ff3", - "4d72a04ddeb851a68cd197ef9a92a3e2ff01fbbff638e64929dd1a9c2e150112", - "c7353d320987956075b5bc1668571c7a36c800d5598fdc4832ec6569561e15d1", - "d9e0c7c90878c20ab7639d5954756f54775404b3483407fe1b483635182734f6", - "8fca67216b7939c0824fb06c5279901a94da41da9482b000f56df9906736ee75", - "460719d7f7aa7d7438f0eaf30333484fa3bd0f233632c10ba89e6e46dd3604be", - "0421d92c8a1c79ed5d01305a3d25aaf22a8f5f9e3d4bc80da47ee16ce20465fe", - "3441d9d9c0f05820a1bb6459fc7d8ef266a1bd929e7db939a10f544efe8261ea", - "ab198a66c293586746758468c610e5d3914d4ce629147eff6dd55a31f863ff8f", - "3a1c8c16b0763f3d2c35269f454ff779d1255e954d2deaf6c040fb3f0bcdc945", - "5561c0ea3b203e173b11e6aa9d0e621a4e10b1d8b178b8fe375220806557b823", - "7656caccdc79cd8d7ce66d415cc96a718e8271c62fb35746bfc2b49faf3eebf3", - "5130594fd54c1652cf2debde2c4204573ed76555d1e26757fe345b409af1544a", - "76d1e83c71ca246d042e37ff1db181f2776265fbcfdc890ce230bfa617c9c2f0", - "89580231962624c53968c1b0095b4a2732b2a2640a19fdd7d21fd064fcc0a5ef", - "3d10d001fff44680c7417dd66ecf2e984f0baa20a9bbcea348583ba5ff210c4f", - "43754e323f0f3a1155b1852bd6edd55da86b8c4cfe3df8b33733fca50fc202b8", - "a9e7b1bb763ae6452ddcacd174993f82977d81a85206bb2ae3c842e2d8e19b4c", - "10bb07da7bc7c7757f74149eff167d528a94a253cdc694a863f4d50054c00b6d", - "28f0bc1b44658548d6e05dd16d4c2fe77f1da5d48b6774bc4263b045725d0c19", - "835fbbf1d16ba7347b6e2fc552d6e982148d29c624ea20383850df3c810fa8fc", - "8e236c56a77d7f46e41e80f7092b1a68cd8e92f6156365f41813ad1ca2c6b6f3", - "51d9c857e9238c49186e37b4eccf17a82de3d5739f026f6043798ab531456e73", - "bbddf7db6a682225301f36a9fd5b0d0121d2951753e1681295f3465352ad511f", - "2690a910c33ee37b91eb6c4e0731d1d345e2dc3b46d308503a6e85bbc242c69e", - "769ce86aa90b518b7ed382f9fdacfbed93574e18dc98fe6c342e4f9f409c2d5a", - "ba3bebec689ce51d3e12776c45f80d25164fdfb694a8122d908081aaa2e7122c", - "3a51f4146ea90a815d0d283d1ceb20b928d8b4d45875e892696986a3c0d8fb9b", - "81968a2d8fb39114342ee1da85254ec51e0608d7f0f6997c2a8354c260a71009", - ) -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 18:43:48 UTC 2018 KΛÐΞMLIΛ hive: queen's address: bc7f3b -population: 9 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 0f49 67ff | 28 0f49 (0) 0211 (0) 07b2 (0) 0703 (0) -001 2 e84b f3a4 | 13 f3a4 (0) e84b (0) e58b (0) e60b (0) -002 1 8dba | 1 8dba (0) -003 2 a008 ad72 | 2 ad72 (0) a008 (0) -004 0 | 3 b61f (0) b27f (0) b027 (0) -============ DEPTH: 5 ========================================== -005 1 ba19 | 1 ba19 (0) -006 0 | 0 -007 1 bdd6 | 1 bdd6 (0) -008 0 | 0 -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase2(t *testing.T) { - testKademliaCase(t, - "bc7f3b6a4a7e3c91b100ca6680b6c06ff407972b88956324ca853295893e0237", "67ffb61d3aa27449d277016188f35f19e2321fbda5008c68cf6303faa080534f", "600cd54c842eadac1729c04abfc369bc244572ca76117105b9dd910283b82730", "d955a05409650de151218557425105a8aa2867bb6a0e0462fa1cf90abcf87ad6", "7a6b726de45abdf7bb3e5fd9fb0dc8932270ca4dedef92238c80c05bcdb570e3", "263e99424ebfdb652adb4e3dcd27d59e11bb7ae1c057b3ef6f390d0228006254", "ba195d1a53aafde68e661c64d39db8c2a73505bf336125c15c3560de3b48b7ed", "3458c762169937115f67cabc35a6c384ed70293a8aec37b077a6c1b8e02d510e", "4ef4dc2e28ac6efdba57e134ac24dd4e0be68b9d54f7006515eb9509105f700c", "2a8782b79b0c24b9714dfd2c8ff1932bebc08aa6520b4eaeaa59ff781238890c", "625d02e960506f4524e9cdeac85b33faf3ea437fceadbd478b62b78720cf24fc", "e051a36a8c8637f520ba259c9ed3fadaf740dadc6a04c3f0e21778ebd4cd6ac4", "e34bc014fa2504f707bb3d904872b56c2fa250bee3cb19a147a0418541f1bd90", "28036dc79add95799916893890add5d8972f3b95325a509d6ded3d448f4dc652", "1b013c407794fa2e4c955d8f51cbc6bd78588a174b6548246b291281304b5409", "34f71b68698e1534095ff23ee9c35bf64c7f12b8463e7c6f6b19c25cf03928b4", "c712c6e9bbb7076832972a95890e340b94ed735935c3c0bb788e61f011b59479", "a008d5becdcda4b9dbfdaafc3cec586cf61dcf2d4b713b6168fff02e3b9f0b08", "29de15555cdbebaab214009e416ee92f947dcec5dab9894129f50f1b17138f34", "5df9449f700bd4b5a23688b68b293f2e92fa6ca524c93bc6bb9936efba9d9ada", "3ab0168a5f87fedc6a39b53c628256ac87a98670d8691bbdaaecec22418d13a2", "1ee299b2d2a74a568494130e6869e66d57982d345c482a0e0eeb285ac219ae3b", "e0e0e3b860cea9b7a74cf1b0675cc632dc64e80a02f20bbc5e96e2e8bb670606", "dc1ba6f169b0fcdcca021dcebaf39fe5d4875e7e69b854fad65687c1d7719ec0", "d321f73e42fcfb1d3a303eddf018ca5dffdcfd5567cd5ec1212f045f6a07e47d", "070320c3da7b542e5ca8aaf6a0a53d2bb5113ed264ab1db2dceee17c729edcb1", "17d314d65fdd136b50d182d2c8f5edf16e7838c2be8cf2c00abe4b406dbcd1d8", "e60b99e0a06f7d2d99d84085f67cdf8cc22a9ae22c339365d80f90289834a2b4", "02115771e18932e1f67a45f11f5bf743c5dae97fbc477d34d35c996012420eac", "3102a40eb2e5060353dd19bf61eeec8782dd1bebfcb57f4c796912252b591827", "8dbaf231062f2dc7ddaba5f9c7761b0c21292be51bf8c2ef503f31d4a2f63f79", "b02787b713c83a9f9183216310f04251994e04c2763a9024731562e8978e7cc4", "b27fe6cd33989e10909ce794c4b0b88feae286b614a59d49a3444c1a7b51ea82", "07b2d2c94fdc6fd148fe23be2ed9eff54f5e12548f29ed8416e6860fc894466f", "e58bf9f451ef62ac44ff0a9bb0610ec0fd14d423235954f0d3695e83017cbfc4", "bdd600b91bb79d1ee0053b854de308cfaa7e2abce575ea6815a0a7b3449609c2", "0f49c93c1edc7999920b21977cedd51a763940dac32e319feb9c1df2da0f3071", "7cbf0297cd41acf655cd6f960d7aaf61479edb4189d5c001cbc730861f0deb41", "79265193778d87ad626a5f59397bc075872d7302a12634ce2451a767d0a82da2", "2fe7d705f7c370b9243dbaafe007d555ff58d218822fca49d347b12a0282457c", "e84bc0c83d05e55a0080eed41dda5a795da4b9313a4da697142e69a65834cbb3", "cc4d278bd9aa0e9fb3cd8d2e0d68fb791aab5de4b120b845c409effbed47a180", "1a2317a8646cd4b6d3c4aa4cc25f676533abb689cf180787db216880a1239ad8", "cbafd6568cf8e99076208e6b6843f5808a7087897c67aad0c54694669398f889", "7b7c8357255fc37b4dae0e1af61589035fd39ff627e0938c6b3da8b4e4ec5d23", "2b8d782c1f5bac46c922cf439f6aa79f91e9ba5ffc0020d58455188a2075b334", "b61f45af2306705740742e76197a119235584ced01ef3f7cf3d4370f6c557cd1", "2775612e7cdae2780bf494c370bdcbe69c55e4a1363b1dc79ea0135e61221cce", "f3a49bb22f40885e961299abfa697a7df690a79f067bf3a4847a3ad48d826c9f", "ad724ac218dc133c0aadf4618eae21fdd0c2f3787af279846b49e2b4f97ff167", - ) -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 19:04:35 UTC 2018 KΛÐΞMLIΛ hive: queen's address: b4822e -population: 8 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 786c 774b | 29 774b (0) 786c (0) 7a79 (0) 7d2f (0) -001 2 d9de cf19 | 10 cf19 (0) d9de (0) d2ff (0) d2a2 (0) -002 2 8ca1 8d74 | 5 8d74 (0) 8ca1 (0) 9793 (0) 9f51 (0) -003 0 | 0 -004 0 | 3 bfac (0) bcbb (0) bde9 (0) -005 0 | 0 -============ DEPTH: 6 ========================================== -006 1 b660 | 1 b660 (0) -007 0 | 0 -008 1 b450 | 1 b450 (0) -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase3(t *testing.T) { - testKademliaCase(t, - "b4822e874a01b94ac3a35c821e6db131e785c2fcbb3556e84b36102caf09b091", "2ecf54ea38d58f9cfc3862e54e5854a7c506fbc640e0b38e46d7d45a19794999", "442374092be50fc7392e8dd3f6fab3158ff7f14f26ff98060aed9b2eecf0b97d", "b450a4a67fcfa3b976cf023d8f1f15052b727f712198ce901630efe2f95db191", "9a7291638eb1c989a6dd6661a42c735b23ac6605b5d3e428aa5ffe650e892c85", "67f62eeab9804cfcac02b25ebeab9113d1b9d03dd5200b1c5a324cc0163e722f", "2e4a0e4b53bca4a9d7e2734150e9f579f29a255ade18a268461b20d026c9ee90", "30dd79c5fcdaa1b106f6960c45c9fde7c046aa3d931088d98c52ab759d0b2ac4", "97936fb5a581e59753c54fa5feec493714f2218245f61f97a62eafd4699433e4", "3a2899b6e129e3e193f6e2aefb82589c948c246d2ec1d4272af32ef3b2660f44", "f0e2a8aa88e67269e9952431ef12e5b29b7f41a1871fbfc38567fad95655d607", "7fa12b3f3c5f8383bfc644b958f72a486969733fa097d8952b3eb4f7b4f73192", "360c167aad5fc992656d6010ec45fdce5bcd492ad9608bc515e2be70d4e430c1", "fe21bc969b3d8e5a64a6484a829c1e04208f26f3cd4de6afcbc172a5bd17f1f1", "b660a1f40141d7ccd282fe5bd9838744119bd1cb3780498b5173578cc5ad308f", "44dcb3370e76680e2fba8cd986ad45ff0b77ca45680ee8d950e47922c4af6226", "8ca126923d17fccb689647307b89f38aa14e2a7b9ebcf3c1e31ccf3d2291a3bc", "f0ae19ae9ce6329327cbf42baf090e084c196b0877d8c7b69997e0123be23ef8", "d2a2a217385158e3e1e348883a14bc423e57daa12077e8c49797d16121ea0810", "f5467ccd85bb4ebe768527db520a210459969a5f1fae6e07b43f519799f0b224", "68be5fd9f9d142a5099e3609011fe3bab7bb992c595999e31e0b3d1668dfb3cf", "4d49a8a476e4934afc6b5c36db9bece3ed1804f20b952da5a21b2b0de766aa73", "ea7155745ef3fb2d099513887a2ba279333ced65c65facbd890ce58bd3fce772", "cf19f51f4e848053d289ac95a9138cdd23fc3077ae913cd58cda8cc7a521b2e1", "590b1cd41c7e6144e76b5cd515a3a4d0a4317624620a3f1685f43ae68bdcd890", "d2ffe0626b5f94a7e00fa0b506e7455a3d9399c15800db108d5e715ef5f6e346", "69630878c50a91f6c2edd23a706bfa0b50bd5661672a37d67bab38e6bca3b698", "445e9067079899bb5faafaca915ae6c0f6b1b730a5a628835dd827636f7feb1e", "6461c77491f1c4825958949f23c153e6e1759a5be53abbcee17c9da3867f3141", "23a235f4083771ccc207771daceda700b525a59ab586788d4f6892e69e34a6e2", "bde99f79ef41a81607ddcf92b9f95dcbc6c3537e91e8bf740e193dc73b19485e", "177957c0e5f0fbd12b88022a91768095d193830986caec8d888097d3ff4310b8", "bcbbdbaa4cdf8352422072f332e05111b732354a35c4d7c617ce1fc3b8b42a5a", "774b6717fdfb0d1629fb9d4c04a9ca40079ae2955d7f82e897477055ed017abb", "16443bf625be6d39ecaa6f114e5d2c1d47a64bfd3c13808d94b55b6b6acef2ee", "8d7495d9008066505ed00ce8198af82bfa5a6b4c08768b4c9fb3aa4eb0b0cca2", "15800849a53349508cb382959527f6c3cf1a46158ff1e6e2316b7dea7967e35f", "7a792f0f4a2b731781d1b244b2a57947f1a2e32900a1c0793449f9f7ae18a7b7", "5e517c2832c9deaa7df77c7bad4d20fd6eda2b7815e155e68bc48238fac1416f", "9f51a14f0019c72bd1d472706d8c80a18c1873c6a0663e754b60eae8094483d7", "7d2fabb565122521d22ba99fed9e5be6a458fbc93156d54db27d97a00b8c3a97", "786c9e412a7db4ec278891fa534caa9a1d1a028c631c6f3aeb9c4d96ad895c36", "3bd6341d40641c2632a5a0cd7a63553a04e251efd7195897a1d27e02a7a8bfde", "31efd1f5fb57b8cff0318d77a1a9e8d67e1d1c8d18ce90f99c3a240dff48cdc8", "d9de3e1156ce1380150948acbcfecd99c96e7f4b0bc97745f4681593d017f74f", "427a2201e09f9583cd990c03b81b58148c297d474a3b50f498d83b1c7a9414cd", "bfaca11596d3dec406a9fcf5d97536516dfe7f0e3b12078428a7e1700e25218a", "351c4770a097248a650008152d0cab5825d048bef770da7f3364f59d1e721bc0", "ee00f205d1486b2be7381d962bd2867263758e880529e4e2bfedfa613bbc0e71", "6aa3b6418d89e3348e4859c823ef4d6d7cd46aa7f7e77aba586c4214d760d8f8", - ) -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 19:16:25 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 9a90fe -population: 8 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 72ef 4e6c | 24 0b1e (0) 0d66 (0) 17f5 (0) 17e8 (0) -001 2 fc2b fa47 | 13 fa47 (0) fc2b (0) fffd (0) ecef (0) -002 2 b847 afa8 | 6 afa8 (0) ad77 (0) bb7c (0) b847 (0) -003 0 | 0 -004 0 | 4 91fc (0) 957d (0) 9482 (0) 949a (0) -============ DEPTH: 5 ========================================== -005 1 9ccf | 1 9ccf (0) -006 0 | 0 -007 1 9bb2 | 1 9bb2 (0) -008 0 | 0 -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase4(t *testing.T) { - testKademliaCase(t, - "9a90fe3506277244549064b8c3276abb06284a199d9063a97331947f2b7da7f4", - "c19359eddef24b7be1a833b4475f212cd944263627a53f9ef4837d106c247730", "fc2b6fef99ef947f7e57c3df376891769e2a2fd83d2b8e634e0fc1e91eaa080c", "ecefc0e1a8ea7bb4b48c469e077401fce175dd75294255b96c4e54f6a2950a55", "bb7ce598efc056bba343cc2614aa3f67a575557561290b44c73a63f8f433f9f7", "55fbee6ca52dfd7f0be0db969ee8e524b654ab4f0cce7c05d83887d7d2a15460", "afa852b6b319998c6a283cc0c82d2f5b8e9410075d7700f3012761f1cfbd0f76", "36c370cfb63f2087971ba6e58d7585b04e16b8f0da335efb91554c2dd8fe191c", "6be41e029985edebc901fb77fc4fb65516b6d85086e2a98bfa3159c99391e585", "dd3cfc72ea553e7d2b28f0037a65646b30955b929d29ba4c40f4a2a811248e77", "da3a8f18e09c7b0ca235c4e33e1441a5188f1df023138bf207753ee63e768f7d", "de9e3ab4dc572d54a2d4b878329fd832bb51a149f4ce167316eeb177b61e7e01", "4e6c1ecde6ed917706257fe020a1d02d2e9d87fca4c85f0f7b132491008c5032", "72ef04b77a070e13463b3529dd312bcacfb7a12d20dc597f5ec3de0501e9b834", "3fef57186675d524ab8bb1f54ba8cb68610babca1247c0c46dbb60aed003c69d", "1d8e6b71f7a052865d6558d4ba44ad5fab7b908cc1badf5766822e1c20d0d823", "6be2f2b4ffa173014d4ec7df157d289744a2bda54bb876b264ccfa898a0da315", "b0ba3fff8643f9985c744327b0c4c869763509fd5da2de9a80a4a0a082021255", "9ccf40b9406ba2e6567101fb9b4e5334a9ec74263eff47267da266ba45e6c158", "d7347f02c180a448e60f73931845062ce00048750b584790278e9c93ef31ad81", "b68c6359a22b3bee6fecb8804311cfd816648ea31d530c9fb48e477e029d707a", "0d668a18ad7c2820214df6df95a6c855ce19fb1cb765f8ca620e45db76686d37", "3fbd2663bff65533246f1fabb9f38086854c6218aeb3dc9ac6ac73d4f0988f91", "949aa5719ca846052bfaa1b38c97b6eca3df3e24c0e0630042c6bccafbb4cdb5", "77b8a2b917bef5d54f3792183b014cca7798f713ff14fe0b2ac79b4c9f6f996d", "17e853cbd8dc00cba3cd9ffeb36f26a9f41a0eb92f80b62c2cda16771c935388", "5f682ed7a8cf2f98387c3def7c97f9f05ae39e39d393eeca3cf621268d6347f8", "ad77487eaf11fd8084ba4517a51766eb0e5b77dd3492dfa79aa3a2802fb29d20", "d247cfcacf9a8200ebaddf639f8c926ab0a001abe682f40df3785e80ed124e91", "195589442e11907eede1ee6524157f1125f68399f3170c835ff81c603b069f6c", "5b5ca0a67f3c54e7d3a6a862ef56168ec9ed1f4945e6c24de6d336b2be2e6f8c", "56430e4caa253015f1f998dce4a48a88af1953f68e94eca14f53074ae9c3e467", "0b1eed6a5bf612d1d8e08f5c546f3d12e838568fd3aa43ed4c537f10c65545d6", "7058db19a56dfff01988ac4a62e1310597f9c8d7ebde6890dadabf047d722d39", "b847380d6888ff7cd11402d086b19eccc40950b52c9d67e73cb4f8462f5df078", "df6c048419a2290ab546d527e9eeba349e7f7e1759bafe4adac507ce60ef9670", "91fc5b4b24fc3fbfea7f9a3d0f0437cb5733c0c2345d8bdffd7048d6e3b8a37b", "957d8ea51b37523952b6f5ae95462fcd4aed1483ef32cc80b69580aaeee03606", "efa82e4e91ad9ab781977400e9ac0bb9de7389aaedebdae979b73d1d3b8d72b0", "7400c9f3f3fc0cc6fe8cc37ab24b9771f44e9f78be913f73cd35fc4be030d6bd", "9bb28f4122d61f7bb56fe27ef706159fb802fef0f5de9dfa32c9c5b3183235f1", "40a8de6e98953498b806614532ea4abf8b99ad7f9719fb68203a6eae2efa5b2a", "412de0b218b8f7dcacc9205cd16ffb4eca5b838f46a2f4f9f534026061a47308", "17f56ecad51075080680ad9faa0fd8946b824d3296ddb20be07f9809fe8d1c5a", "fffd4e7ae885a41948a342b6647955a7ec8a8039039f510cff467ef597675457", "35e78e11b5ac46a29dd04ab0043136c3291f4ca56cb949ace33111ed56395463", "94824fc80230af82077c83bfc01dc9675b1f9d3d538b1e5f41c21ac753598691", "fa470ae314ca3fce493f21b423eef2a49522e09126f6f2326fa3c9cac0b344f7", "7078860b5b621b21ac7b95f9fc4739c8235ce5066a8b9bd7d938146a34fa88ec", "eea53560f0428bfd2eca4f86a5ce9dec5ff1309129a975d73465c1c9e9da71d1", - ) -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 19:25:18 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 5dd5c7 -population: 13 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 e528 fad0 | 22 fad0 (0) e528 (0) e3bb (0) ed13 (0) -001 3 3f30 18e0 1dd3 | 7 3f30 (0) 23db (0) 10b6 (0) 18e0 (0) -002 4 7c54 7804 61e4 60f9 | 10 61e4 (0) 60f9 (0) 636c (0) 7186 (0) -003 2 40ae 4bae | 5 4bae (0) 4d5c (0) 403a (0) 40ae (0) -004 0 | 0 -005 0 | 3 5808 (0) 5a0e (0) 5bdb (0) -============ DEPTH: 6 ========================================== -006 2 5f14 5f61 | 2 5f14 (0) 5f61 (0) -007 0 | 0 -008 0 | 0 -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase5(t *testing.T) { - testKademliaCase(t, - "5dd5c77dd9006a800478fcebb02d48d4036389e7d3c8f6a83b97dbad13f4c0a9", - "78fafa0809929a1279ece089a51d12457c2d8416dff859aeb2ccc24bb50df5ec", "1dd39b1257e745f147cbbc3cadd609ccd6207c41056dbc4254bba5d2527d3ee5", "5f61dd66d4d94aec8fcc3ce0e7885c7edf30c43143fa730e2841c5d28e3cd081", "8aa8b0472cb351d967e575ad05c4b9f393e76c4b01ef4b3a54aac5283b78abc9", "4502f385152a915b438a6726ce3ea9342e7a6db91a23c2f6bee83a885ed7eb82", "718677a504249db47525e959ef1784bed167e1c46f1e0275b9c7b588e28a3758", "7c54c6ed1f8376323896ed3a4e048866410de189e9599dd89bf312ca4adb96b5", "18e03bd3378126c09e799a497150da5c24c895aedc84b6f0dbae41fc4bac081a", "23db76ac9e6e58d9f5395ca78252513a7b4118b4155f8462d3d5eec62486cadc", "40ae0e8f065e96c7adb7fa39505136401f01780481e678d718b7f6dbb2c906ec", "c1539998b8bae19d339d6bbb691f4e9daeb0e86847545229e80fe0dffe716e92", "ed139d73a2699e205574c08722ca9f030ad2d866c662f1112a276b91421c3cb9", "5bdb19584b7a36d09ca689422ef7e6bb681b8f2558a6b2177a8f7c812f631022", "636c9de7fe234ffc15d67a504c69702c719f626c17461d3f2918e924cd9d69e2", "de4455413ff9335c440d52458c6544191bd58a16d85f700c1de53b62773064ea", "de1963310849527acabc7885b6e345a56406a8f23e35e436b6d9725e69a79a83", "a80a50a467f561210a114cba6c7fb1489ed43a14d61a9edd70e2eb15c31f074d", "7804f12b8d8e6e4b375b242058242068a3809385e05df0e64973cde805cf729c", "60f9aa320c02c6f2e6370aa740cf7cea38083fa95fca8c99552cda52935c1520", "d8da963602390f6c002c00ce62a84b514edfce9ebde035b277a957264bb54d21", "8463d93256e026fe436abad44697152b9a56ac8e06a0583d318e9571b83d073c", "9a3f78fcefb9a05e40a23de55f6153d7a8b9d973ede43a380bf46bb3b3847de1", "e3bb576f4b3760b9ca6bff59326f4ebfc4a669d263fb7d67ab9797adea54ed13", "4d5cdbd6dcca5bdf819a0fe8d175dc55cc96f088d37462acd5ea14bc6296bdbe", "5a0ed28de7b5258c727cb85447071c74c00a5fbba9e6bc0393bc51944d04ab2a", "61e4ddb479c283c638f4edec24353b6cc7a3a13b930824aad016b0996ca93c47", "7e3610868acf714836cafaaa7b8c009a9ac6e3a6d443e5586cf661530a204ee2", "d74b244d4345d2c86e30a097105e4fb133d53c578320285132a952cdaa64416e", "cfeed57d0f935bfab89e3f630a7c97e0b1605f0724d85a008bbfb92cb47863a8", "580837af95055670e20d494978f60c7f1458dc4b9e389fc7aa4982b2aca3bce3", "df55c0c49e6c8a83d82dfa1c307d3bf6a20e18721c80d8ec4f1f68dc0a137ced", "5f149c51ce581ba32a285439a806c063ced01ccd4211cd024e6a615b8f216f95", "1eb76b00aeb127b10dd1b7cd4c3edeb4d812b5a658f0feb13e85c4d2b7c6fe06", "7a56ba7c3fb7cbfb5561a46a75d95d7722096b45771ec16e6fa7bbfab0b35dfe", "4bae85ad88c28470f0015246d530adc0cd1778bdd5145c3c6b538ee50c4e04bd", "afd1892e2a7145c99ec0ebe9ded0d3fec21089b277a68d47f45961ec5e39e7e0", "953138885d7b36b0ef79e46030f8e61fd7037fbe5ce9e0a94d728e8c8d7eab86", "de761613ef305e4f628cb6bf97d7b7dc69a9d513dc233630792de97bcda777a6", "3f3087280063d09504c084bbf7fdf984347a72b50d097fd5b086ffabb5b3fb4c", "7d18a94bb1ebfdef4d3e454d2db8cb772f30ca57920dd1e402184a9e598581a0", "a7d6fbdc9126d9f10d10617f49fb9f5474ffe1b229f76b7dd27cebba30eccb5d", "fad0246303618353d1387ec10c09ee991eb6180697ed3470ed9a6b377695203d", "1cf66e09ea51ee5c23df26615a9e7420be2ac8063f28f60a3bc86020e94fe6f3", "8269cdaa153da7c358b0b940791af74d7c651cd4d3f5ed13acfe6d0f2c539e7f", "90d52eaaa60e74bf1c79106113f2599471a902d7b1c39ac1f55b20604f453c09", "9788fd0c09190a3f3d0541f68073a2f44c2fcc45bb97558a7c319f36c25a75b3", "10b68fc44157ecfdae238ee6c1ce0333f906ad04d1a4cb1505c8e35c3c87fbb0", "e5284117fdf3757920475c786e0004cb00ba0932163659a89b36651a01e57394", "403ad51d911e113dcd5f9ff58c94f6d278886a2a4da64c3ceca2083282c92de3", - ) -} diff --git a/swarm/network/networkid_test.go b/swarm/network/networkid_test.go deleted file mode 100644 index d1d359de68d9..000000000000 --- a/swarm/network/networkid_test.go +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "bytes" - "context" - "flag" - "fmt" - "math/rand" - "strings" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/rpc" -) - -var ( - currentNetworkID int - cnt int - nodeMap map[int][]enode.ID - kademlias map[enode.ID]*Kademlia -) - -const ( - NumberOfNets = 4 - MaxTimeout = 6 -) - -func init() { - flag.Parse() - rand.Seed(time.Now().Unix()) -} - -/* -Run the network ID test. -The test creates one simulations.Network instance, -a number of nodes, then connects nodes with each other in this network. - -Each node gets a network ID assigned according to the number of networks. -Having more network IDs is just arbitrary in order to exclude -false positives. - -Nodes should only connect with other nodes with the same network ID. -After the setup phase, the test checks on each node if it has the -expected node connections (excluding those not sharing the network ID). -*/ -func TestNetworkID(t *testing.T) { - log.Debug("Start test") - //arbitrarily set the number of nodes. It could be any number - numNodes := 24 - //the nodeMap maps all nodes (slice value) with the same network ID (key) - nodeMap = make(map[int][]enode.ID) - //set up the network and connect nodes - net, err := setupNetwork(numNodes) - if err != nil { - t.Fatalf("Error setting up network: %v", err) - } - defer func() { - //shutdown the snapshot network - log.Trace("Shutting down network") - net.Shutdown() - }() - //let's sleep to ensure all nodes are connected - time.Sleep(1 * time.Second) - //for each group sharing the same network ID... - for _, netIDGroup := range nodeMap { - log.Trace("netIDGroup size", "size", len(netIDGroup)) - //...check that their size of the kademlia is of the expected size - //the assumption is that it should be the size of the group minus 1 (the node itself) - for _, node := range netIDGroup { - if kademlias[node].addrs.Size() != len(netIDGroup)-1 { - t.Fatalf("Kademlia size has not expected peer size. Kademlia size: %d, expected size: %d", kademlias[node].addrs.Size(), len(netIDGroup)-1) - } - kademlias[node].EachAddr(nil, 0, func(addr *BzzAddr, _ int, _ bool) bool { - found := false - for _, nd := range netIDGroup { - p := nd.Bytes() - if bytes.Equal(p, addr.Address()) { - found = true - } - } - if !found { - t.Fatalf("Expected node not found for node %s", node.String()) - } - return true - }) - } - } - log.Info("Test terminated successfully") -} - -// setup simulated network with bzz/discovery and pss services. -// connects nodes in a circle -// if allowRaw is set, omission of builtin pss encryption is enabled (see PssParams) -func setupNetwork(numnodes int) (net *simulations.Network, err error) { - log.Debug("Setting up network") - quitC := make(chan struct{}) - errc := make(chan error) - nodes := make([]*simulations.Node, numnodes) - if numnodes < 16 { - return nil, fmt.Errorf("Minimum sixteen nodes in network") - } - adapter := adapters.NewSimAdapter(newServices()) - //create the network - net = simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "NetworkIdTestNet", - DefaultService: "bzz", - }) - log.Debug("Creating networks and nodes") - - var connCount int - - //create nodes and connect them to each other - for i := 0; i < numnodes; i++ { - log.Trace("iteration: ", "i", i) - nodeconf := adapters.RandomNodeConfig() - nodes[i], err = net.NewNodeWithConfig(nodeconf) - if err != nil { - return nil, fmt.Errorf("error creating node %d: %v", i, err) - } - err = net.Start(nodes[i].ID()) - if err != nil { - return nil, fmt.Errorf("error starting node %d: %v", i, err) - } - client, err := nodes[i].Client() - if err != nil { - return nil, fmt.Errorf("create node %d rpc client fail: %v", i, err) - } - //now setup and start event watching in order to know when we can upload - ctx, watchCancel := context.WithTimeout(context.Background(), MaxTimeout*time.Second) - defer watchCancel() - watchSubscriptionEvents(ctx, nodes[i].ID(), client, errc, quitC) - //on every iteration we connect to all previous ones - for k := i - 1; k >= 0; k-- { - connCount++ - log.Debug(fmt.Sprintf("Connecting node %d with node %d; connection count is %d", i, k, connCount)) - err = net.Connect(nodes[i].ID(), nodes[k].ID()) - if err != nil { - if !strings.Contains(err.Error(), "already connected") { - return nil, fmt.Errorf("error connecting nodes: %v", err) - } - } - } - } - //now wait until the number of expected subscriptions has been finished - //`watchSubscriptionEvents` will write with a `nil` value to errc - for err := range errc { - if err != nil { - return nil, err - } - //`nil` received, decrement count - connCount-- - log.Trace("count down", "cnt", connCount) - //all subscriptions received - if connCount == 0 { - close(quitC) - break - } - } - log.Debug("Network setup phase terminated") - return net, nil -} - -func newServices() adapters.Services { - kademlias = make(map[enode.ID]*Kademlia) - kademlia := func(id enode.ID) *Kademlia { - if k, ok := kademlias[id]; ok { - return k - } - params := NewKadParams() - params.MinProxBinSize = 2 - params.MaxBinSize = 3 - params.MinBinSize = 1 - params.MaxRetries = 1000 - params.RetryExponent = 2 - params.RetryInterval = 1000000 - kademlias[id] = NewKademlia(id[:], params) - return kademlias[id] - } - return adapters.Services{ - "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { - addr := NewAddr(ctx.Config.Node()) - hp := NewHiveParams() - hp.Discovery = false - cnt++ - //assign the network ID - currentNetworkID = cnt % NumberOfNets - if ok := nodeMap[currentNetworkID]; ok == nil { - nodeMap[currentNetworkID] = make([]enode.ID, 0) - } - //add this node to the group sharing the same network ID - nodeMap[currentNetworkID] = append(nodeMap[currentNetworkID], ctx.Config.ID) - log.Debug("current network ID:", "id", currentNetworkID) - config := &BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - NetworkID: uint64(currentNetworkID), - } - return NewBzz(config, kademlia(ctx.Config.ID), nil, nil, nil), nil - }, - } -} - -func watchSubscriptionEvents(ctx context.Context, id enode.ID, client *rpc.Client, errc chan error, quitC chan struct{}) { - events := make(chan *p2p.PeerEvent) - sub, err := client.Subscribe(context.Background(), "admin", events, "peerEvents") - if err != nil { - log.Error(err.Error()) - errc <- fmt.Errorf("error getting peer events for node %v: %s", id, err) - return - } - go func() { - defer func() { - sub.Unsubscribe() - log.Trace("watch subscription events: unsubscribe", "id", id) - }() - - for { - select { - case <-quitC: - return - case <-ctx.Done(): - select { - case errc <- ctx.Err(): - case <-quitC: - } - return - case e := <-events: - if e.Type == p2p.PeerEventTypeAdd { - errc <- nil - } - case err := <-sub.Err(): - if err != nil { - select { - case errc <- fmt.Errorf("error getting peer events for node %v: %v", id, err): - case <-quitC: - } - return - } - } - } - }() -} diff --git a/swarm/network/priorityqueue/priorityqueue.go b/swarm/network/priorityqueue/priorityqueue.go deleted file mode 100644 index 5385026054ac..000000000000 --- a/swarm/network/priorityqueue/priorityqueue.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// package priority_queue implement a channel based priority queue -// over arbitrary types. It provides an -// an autopop loop applying a function to the items always respecting -// their priority. The structure is only quasi consistent ie., if a lower -// priority item is autopopped, it is guaranteed that there was a point -// when no higher priority item was present, ie. it is not guaranteed -// that there was any point where the lower priority item was present -// but the higher was not - -package priorityqueue - -import ( - "context" - "errors" - - "github.com/ethereum/go-ethereum/log" -) - -var ( - ErrContention = errors.New("contention") - - errBadPriority = errors.New("bad priority") - - wakey = struct{}{} -) - -// PriorityQueue is the basic structure -type PriorityQueue struct { - Queues []chan interface{} - wakeup chan struct{} -} - -// New is the constructor for PriorityQueue -func New(n int, l int) *PriorityQueue { - var queues = make([]chan interface{}, n) - for i := range queues { - queues[i] = make(chan interface{}, l) - } - return &PriorityQueue{ - Queues: queues, - wakeup: make(chan struct{}, 1), - } -} - -// Run is a forever loop popping items from the queues -func (pq *PriorityQueue) Run(ctx context.Context, f func(interface{})) { - top := len(pq.Queues) - 1 - p := top -READ: - for { - q := pq.Queues[p] - select { - case <-ctx.Done(): - return - case x := <-q: - log.Trace("priority.queue f(x)", "p", p, "len(Queues[p])", len(pq.Queues[p])) - f(x) - p = top - default: - if p > 0 { - p-- - log.Trace("priority.queue p > 0", "p", p) - continue READ - } - p = top - select { - case <-ctx.Done(): - return - case <-pq.wakeup: - log.Trace("priority.queue wakeup", "p", p) - } - } - } -} - -// Push pushes an item to the appropriate queue specified in the priority argument -// if context is given it waits until either the item is pushed or the Context aborts -func (pq *PriorityQueue) Push(x interface{}, p int) error { - if p < 0 || p >= len(pq.Queues) { - return errBadPriority - } - log.Trace("priority.queue push", "p", p, "len(Queues[p])", len(pq.Queues[p])) - select { - case pq.Queues[p] <- x: - default: - return ErrContention - } - select { - case pq.wakeup <- wakey: - default: - } - return nil -} diff --git a/swarm/network/priorityqueue/priorityqueue_test.go b/swarm/network/priorityqueue/priorityqueue_test.go deleted file mode 100644 index ed8b575c2013..000000000000 --- a/swarm/network/priorityqueue/priorityqueue_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package priorityqueue - -import ( - "context" - "sync" - "testing" -) - -func TestPriorityQueue(t *testing.T) { - var results []string - wg := sync.WaitGroup{} - pq := New(3, 2) - wg.Add(1) - go pq.Run(context.Background(), func(v interface{}) { - results = append(results, v.(string)) - wg.Done() - }) - pq.Push("2.0", 2) - wg.Wait() - if results[0] != "2.0" { - t.Errorf("expected first result %q, got %q", "2.0", results[0]) - } - -Loop: - for i, tc := range []struct { - priorities []int - values []string - results []string - errors []error - }{ - { - priorities: []int{0}, - values: []string{""}, - results: []string{""}, - }, - { - priorities: []int{0, 1}, - values: []string{"0.0", "1.0"}, - results: []string{"1.0", "0.0"}, - }, - { - priorities: []int{1, 0}, - values: []string{"1.0", "0.0"}, - results: []string{"1.0", "0.0"}, - }, - { - priorities: []int{0, 1, 1}, - values: []string{"0.0", "1.0", "1.1"}, - results: []string{"1.0", "1.1", "0.0"}, - }, - { - priorities: []int{0, 0, 0}, - values: []string{"0.0", "0.0", "0.1"}, - errors: []error{nil, nil, ErrContention}, - }, - } { - var results []string - wg := sync.WaitGroup{} - pq := New(3, 2) - wg.Add(len(tc.values)) - for j, value := range tc.values { - err := pq.Push(value, tc.priorities[j]) - if tc.errors != nil && err != tc.errors[j] { - t.Errorf("expected push error %v, got %v", tc.errors[j], err) - continue Loop - } - if err != nil { - continue Loop - } - } - go pq.Run(context.Background(), func(v interface{}) { - results = append(results, v.(string)) - wg.Done() - }) - wg.Wait() - for k, result := range tc.results { - if results[k] != result { - t.Errorf("test case %v: expected %v element %q, got %q", i, k, result, results[k]) - } - } - } -} diff --git a/swarm/network/protocol.go b/swarm/network/protocol.go deleted file mode 100644 index 66ae94a88b09..000000000000 --- a/swarm/network/protocol.go +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "context" - "errors" - "fmt" - "net" - "sync" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/state" -) - -const ( - DefaultNetworkID = 3 - // ProtocolMaxMsgSize maximum allowed message size - ProtocolMaxMsgSize = 10 * 1024 * 1024 - // timeout for waiting - bzzHandshakeTimeout = 3000 * time.Millisecond -) - -// BzzSpec is the spec of the generic swarm handshake -var BzzSpec = &protocols.Spec{ - Name: "bzz", - Version: 7, - MaxMsgSize: 10 * 1024 * 1024, - Messages: []interface{}{ - HandshakeMsg{}, - }, -} - -// DiscoverySpec is the spec for the bzz discovery subprotocols -var DiscoverySpec = &protocols.Spec{ - Name: "hive", - Version: 6, - MaxMsgSize: 10 * 1024 * 1024, - Messages: []interface{}{ - peersMsg{}, - subPeersMsg{}, - }, -} - -// BzzConfig captures the config params used by the hive -type BzzConfig struct { - OverlayAddr []byte // base address of the overlay network - UnderlayAddr []byte // node's underlay address - HiveParams *HiveParams - NetworkID uint64 - LightNode bool -} - -// Bzz is the swarm protocol bundle -type Bzz struct { - *Hive - NetworkID uint64 - LightNode bool - localAddr *BzzAddr - mtx sync.Mutex - handshakes map[enode.ID]*HandshakeMsg - streamerSpec *protocols.Spec - streamerRun func(*BzzPeer) error -} - -// NewBzz is the swarm protocol constructor -// arguments -// * bzz config -// * overlay driver -// * peer store -func NewBzz(config *BzzConfig, kad *Kademlia, store state.Store, streamerSpec *protocols.Spec, streamerRun func(*BzzPeer) error) *Bzz { - return &Bzz{ - Hive: NewHive(config.HiveParams, kad, store), - NetworkID: config.NetworkID, - LightNode: config.LightNode, - localAddr: &BzzAddr{config.OverlayAddr, config.UnderlayAddr}, - handshakes: make(map[enode.ID]*HandshakeMsg), - streamerRun: streamerRun, - streamerSpec: streamerSpec, - } -} - -// UpdateLocalAddr updates underlayaddress of the running node -func (b *Bzz) UpdateLocalAddr(byteaddr []byte) *BzzAddr { - b.localAddr = b.localAddr.Update(&BzzAddr{ - UAddr: byteaddr, - OAddr: b.localAddr.OAddr, - }) - return b.localAddr -} - -// NodeInfo returns the node's overlay address -func (b *Bzz) NodeInfo() interface{} { - return b.localAddr.Address() -} - -// Protocols return the protocols swarm offers -// Bzz implements the node.Service interface -// * handshake/hive -// * discovery -func (b *Bzz) Protocols() []p2p.Protocol { - protocol := []p2p.Protocol{ - { - Name: BzzSpec.Name, - Version: BzzSpec.Version, - Length: BzzSpec.Length(), - Run: b.runBzz, - NodeInfo: b.NodeInfo, - }, - { - Name: DiscoverySpec.Name, - Version: DiscoverySpec.Version, - Length: DiscoverySpec.Length(), - Run: b.RunProtocol(DiscoverySpec, b.Hive.Run), - NodeInfo: b.Hive.NodeInfo, - PeerInfo: b.Hive.PeerInfo, - }, - } - if b.streamerSpec != nil && b.streamerRun != nil { - protocol = append(protocol, p2p.Protocol{ - Name: b.streamerSpec.Name, - Version: b.streamerSpec.Version, - Length: b.streamerSpec.Length(), - Run: b.RunProtocol(b.streamerSpec, b.streamerRun), - }) - } - return protocol -} - -// APIs returns the APIs offered by bzz -// * hive -// Bzz implements the node.Service interface -func (b *Bzz) APIs() []rpc.API { - return []rpc.API{{ - Namespace: "hive", - Version: "3.0", - Service: b.Hive, - }} -} - -// RunProtocol is a wrapper for swarm subprotocols -// returns a p2p protocol run function that can be assigned to p2p.Protocol#Run field -// arguments: -// * p2p protocol spec -// * run function taking BzzPeer as argument -// this run function is meant to block for the duration of the protocol session -// on return the session is terminated and the peer is disconnected -// the protocol waits for the bzz handshake is negotiated -// the overlay address on the BzzPeer is set from the remote handshake -func (b *Bzz) RunProtocol(spec *protocols.Spec, run func(*BzzPeer) error) func(*p2p.Peer, p2p.MsgReadWriter) error { - return func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - // wait for the bzz protocol to perform the handshake - handshake, _ := b.GetHandshake(p.ID()) - defer b.removeHandshake(p.ID()) - select { - case <-handshake.done: - case <-time.After(bzzHandshakeTimeout): - return fmt.Errorf("%08x: %s protocol timeout waiting for handshake on %08x", b.BaseAddr()[:4], spec.Name, p.ID().Bytes()[:4]) - } - if handshake.err != nil { - return fmt.Errorf("%08x: %s protocol closed: %v", b.BaseAddr()[:4], spec.Name, handshake.err) - } - // the handshake has succeeded so construct the BzzPeer and run the protocol - peer := &BzzPeer{ - Peer: protocols.NewPeer(p, rw, spec), - BzzAddr: handshake.peerAddr, - lastActive: time.Now(), - LightNode: handshake.LightNode, - } - - log.Debug("peer created", "addr", handshake.peerAddr.String()) - - return run(peer) - } -} - -// performHandshake implements the negotiation of the bzz handshake -// shared among swarm subprotocols -func (b *Bzz) performHandshake(p *protocols.Peer, handshake *HandshakeMsg) error { - ctx, cancel := context.WithTimeout(context.Background(), bzzHandshakeTimeout) - defer func() { - close(handshake.done) - cancel() - }() - rsh, err := p.Handshake(ctx, handshake, b.checkHandshake) - if err != nil { - handshake.err = err - return err - } - handshake.peerAddr = rsh.(*HandshakeMsg).Addr - handshake.LightNode = rsh.(*HandshakeMsg).LightNode - return nil -} - -// runBzz is the p2p protocol run function for the bzz base protocol -// that negotiates the bzz handshake -func (b *Bzz) runBzz(p *p2p.Peer, rw p2p.MsgReadWriter) error { - handshake, _ := b.GetHandshake(p.ID()) - if !<-handshake.init { - return fmt.Errorf("%08x: bzz already started on peer %08x", b.localAddr.Over()[:4], p.ID().Bytes()[:4]) - } - close(handshake.init) - defer b.removeHandshake(p.ID()) - peer := protocols.NewPeer(p, rw, BzzSpec) - err := b.performHandshake(peer, handshake) - if err != nil { - log.Warn(fmt.Sprintf("%08x: handshake failed with remote peer %08x: %v", b.localAddr.Over()[:4], p.ID().Bytes()[:4], err)) - - return err - } - // fail if we get another handshake - msg, err := rw.ReadMsg() - if err != nil { - return err - } - msg.Discard() - return errors.New("received multiple handshakes") -} - -// BzzPeer is the bzz protocol view of a protocols.Peer (itself an extension of p2p.Peer) -// implements the Peer interface and all interfaces Peer implements: Addr, OverlayPeer -type BzzPeer struct { - *protocols.Peer // represents the connection for online peers - *BzzAddr // remote address -> implements Addr interface = protocols.Peer - lastActive time.Time // time is updated whenever mutexes are releasing - LightNode bool -} - -func NewBzzPeer(p *protocols.Peer) *BzzPeer { - return &BzzPeer{Peer: p, BzzAddr: NewAddr(p.Node())} -} - -// LastActive returns the time the peer was last active -func (p *BzzPeer) LastActive() time.Time { - return p.lastActive -} - -// ID returns the peer's underlay node identifier. -func (p *BzzPeer) ID() enode.ID { - // This is here to resolve a method tie: both protocols.Peer and BzzAddr are embedded - // into the struct and provide ID(). The protocols.Peer version is faster, ensure it - // gets used. - return p.Peer.ID() -} - -/* - Handshake - -* Version: 8 byte integer version of the protocol -* NetworkID: 8 byte integer network identifier -* Addr: the address advertised by the node including underlay and overlay connecctions -*/ -type HandshakeMsg struct { - Version uint64 - NetworkID uint64 - Addr *BzzAddr - LightNode bool - - // peerAddr is the address received in the peer handshake - peerAddr *BzzAddr - - init chan bool - done chan struct{} - err error -} - -// String pretty prints the handshake -func (bh *HandshakeMsg) String() string { - return fmt.Sprintf("Handshake: Version: %v, NetworkID: %v, Addr: %v, LightNode: %v, peerAddr: %v", bh.Version, bh.NetworkID, bh.Addr, bh.LightNode, bh.peerAddr) -} - -// Perform initiates the handshake and validates the remote handshake message -func (b *Bzz) checkHandshake(hs interface{}) error { - rhs := hs.(*HandshakeMsg) - if rhs.NetworkID != b.NetworkID { - return fmt.Errorf("network id mismatch %d (!= %d)", rhs.NetworkID, b.NetworkID) - } - if rhs.Version != uint64(BzzSpec.Version) { - return fmt.Errorf("version mismatch %d (!= %d)", rhs.Version, BzzSpec.Version) - } - return nil -} - -// removeHandshake removes handshake for peer with peerID -// from the bzz handshake store -func (b *Bzz) removeHandshake(peerID enode.ID) { - b.mtx.Lock() - defer b.mtx.Unlock() - delete(b.handshakes, peerID) -} - -// GetHandshake returns the bzz handhake that the remote peer with peerID sent -func (b *Bzz) GetHandshake(peerID enode.ID) (*HandshakeMsg, bool) { - b.mtx.Lock() - defer b.mtx.Unlock() - handshake, found := b.handshakes[peerID] - if !found { - handshake = &HandshakeMsg{ - Version: uint64(BzzSpec.Version), - NetworkID: b.NetworkID, - Addr: b.localAddr, - LightNode: b.LightNode, - init: make(chan bool, 1), - done: make(chan struct{}), - } - // when handhsake is first created for a remote peer - // it is initialised with the init - handshake.init <- true - b.handshakes[peerID] = handshake - } - - return handshake, found -} - -// BzzAddr implements the PeerAddr interface -type BzzAddr struct { - OAddr []byte - UAddr []byte -} - -// Address implements OverlayPeer interface to be used in Overlay. -func (a *BzzAddr) Address() []byte { - return a.OAddr -} - -// Over returns the overlay address. -func (a *BzzAddr) Over() []byte { - return a.OAddr -} - -// Under returns the underlay address. -func (a *BzzAddr) Under() []byte { - return a.UAddr -} - -// ID returns the node identifier in the underlay. -func (a *BzzAddr) ID() enode.ID { - n, err := enode.ParseV4(string(a.UAddr)) - if err != nil { - return enode.ID{} - } - return n.ID() -} - -// Update updates the underlay address of a peer record -func (a *BzzAddr) Update(na *BzzAddr) *BzzAddr { - return &BzzAddr{a.OAddr, na.UAddr} -} - -// String pretty prints the address -func (a *BzzAddr) String() string { - return fmt.Sprintf("%x <%s>", a.OAddr, a.UAddr) -} - -// RandomAddr is a utility method generating an address from a public key -func RandomAddr() *BzzAddr { - key, err := crypto.GenerateKey() - if err != nil { - panic("unable to generate key") - } - node := enode.NewV4(&key.PublicKey, net.IP{127, 0, 0, 1}, 30303, 30303) - return NewAddr(node) -} - -// NewAddr constucts a BzzAddr from a node record. -func NewAddr(node *enode.Node) *BzzAddr { - return &BzzAddr{OAddr: node.ID().Bytes(), UAddr: []byte(node.String())} -} diff --git a/swarm/network/protocol_test.go b/swarm/network/protocol_test.go deleted file mode 100644 index 4b83c7a278ea..000000000000 --- a/swarm/network/protocol_test.go +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "flag" - "fmt" - "os" - "sync" - "testing" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/protocols" - p2ptest "github.com/ethereum/go-ethereum/p2p/testing" -) - -const ( - TestProtocolVersion = 7 - TestProtocolNetworkID = 3 -) - -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") -) - -func init() { - flag.Parse() - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) -} - -type testStore struct { - sync.Mutex - - values map[string][]byte -} - -func newTestStore() *testStore { - return &testStore{values: make(map[string][]byte)} -} - -func (t *testStore) Load(key string) ([]byte, error) { - t.Lock() - defer t.Unlock() - v, ok := t.values[key] - if !ok { - return nil, fmt.Errorf("key not found: %s", key) - } - return v, nil -} - -func (t *testStore) Save(key string, v []byte) error { - t.Lock() - defer t.Unlock() - t.values[key] = v - return nil -} - -func HandshakeMsgExchange(lhs, rhs *HandshakeMsg, id enode.ID) []p2ptest.Exchange { - - return []p2ptest.Exchange{ - { - Expects: []p2ptest.Expect{ - { - Code: 0, - Msg: lhs, - Peer: id, - }, - }, - }, - { - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: rhs, - Peer: id, - }, - }, - }, - } -} - -func newBzzBaseTester(t *testing.T, n int, addr *BzzAddr, spec *protocols.Spec, run func(*BzzPeer) error) *bzzTester { - cs := make(map[string]chan bool) - - srv := func(p *BzzPeer) error { - defer func() { - if cs[p.ID().String()] != nil { - close(cs[p.ID().String()]) - } - }() - return run(p) - } - - protocol := func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - return srv(&BzzPeer{Peer: protocols.NewPeer(p, rw, spec), BzzAddr: NewAddr(p.Node())}) - } - - s := p2ptest.NewProtocolTester(t, addr.ID(), n, protocol) - - for _, node := range s.Nodes { - cs[node.ID().String()] = make(chan bool) - } - - return &bzzTester{ - addr: addr, - ProtocolTester: s, - cs: cs, - } -} - -type bzzTester struct { - *p2ptest.ProtocolTester - addr *BzzAddr - cs map[string]chan bool - bzz *Bzz -} - -func newBzz(addr *BzzAddr, lightNode bool) *Bzz { - config := &BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: NewHiveParams(), - NetworkID: DefaultNetworkID, - LightNode: lightNode, - } - kad := NewKademlia(addr.OAddr, NewKadParams()) - bzz := NewBzz(config, kad, nil, nil, nil) - return bzz -} - -func newBzzHandshakeTester(t *testing.T, n int, addr *BzzAddr, lightNode bool) *bzzTester { - bzz := newBzz(addr, lightNode) - pt := p2ptest.NewProtocolTester(t, addr.ID(), n, bzz.runBzz) - - return &bzzTester{ - addr: addr, - ProtocolTester: pt, - bzz: bzz, - } -} - -// should test handshakes in one exchange? parallelisation -func (s *bzzTester) testHandshake(lhs, rhs *HandshakeMsg, disconnects ...*p2ptest.Disconnect) error { - var peers []enode.ID - id := rhs.Addr.ID() - if len(disconnects) > 0 { - for _, d := range disconnects { - peers = append(peers, d.Peer) - } - } else { - peers = []enode.ID{id} - } - - if err := s.TestExchanges(HandshakeMsgExchange(lhs, rhs, id)...); err != nil { - return err - } - - if len(disconnects) > 0 { - return s.TestDisconnected(disconnects...) - } - - // If we don't expect disconnect, ensure peers remain connected - err := s.TestDisconnected(&p2ptest.Disconnect{ - Peer: s.Nodes[0].ID(), - Error: nil, - }) - - if err == nil { - return fmt.Errorf("Unexpected peer disconnect") - } - - if err.Error() != "timed out waiting for peers to disconnect" { - return err - } - - return nil -} - -func correctBzzHandshake(addr *BzzAddr, lightNode bool) *HandshakeMsg { - return &HandshakeMsg{ - Version: TestProtocolVersion, - NetworkID: TestProtocolNetworkID, - Addr: addr, - LightNode: lightNode, - } -} - -func TestBzzHandshakeNetworkIDMismatch(t *testing.T) { - lightNode := false - addr := RandomAddr() - s := newBzzHandshakeTester(t, 1, addr, lightNode) - node := s.Nodes[0] - - err := s.testHandshake( - correctBzzHandshake(addr, lightNode), - &HandshakeMsg{Version: TestProtocolVersion, NetworkID: 321, Addr: NewAddr(node)}, - &p2ptest.Disconnect{Peer: node.ID(), Error: fmt.Errorf("Handshake error: Message handler error: (msg code 0): network id mismatch 321 (!= 3)")}, - ) - - if err != nil { - t.Fatal(err) - } -} - -func TestBzzHandshakeVersionMismatch(t *testing.T) { - lightNode := false - addr := RandomAddr() - s := newBzzHandshakeTester(t, 1, addr, lightNode) - node := s.Nodes[0] - - err := s.testHandshake( - correctBzzHandshake(addr, lightNode), - &HandshakeMsg{Version: 0, NetworkID: TestProtocolNetworkID, Addr: NewAddr(node)}, - &p2ptest.Disconnect{Peer: node.ID(), Error: fmt.Errorf("Handshake error: Message handler error: (msg code 0): version mismatch 0 (!= %d)", TestProtocolVersion)}, - ) - - if err != nil { - t.Fatal(err) - } -} - -func TestBzzHandshakeSuccess(t *testing.T) { - lightNode := false - addr := RandomAddr() - s := newBzzHandshakeTester(t, 1, addr, lightNode) - node := s.Nodes[0] - - err := s.testHandshake( - correctBzzHandshake(addr, lightNode), - &HandshakeMsg{Version: TestProtocolVersion, NetworkID: TestProtocolNetworkID, Addr: NewAddr(node)}, - ) - - if err != nil { - t.Fatal(err) - } -} - -func TestBzzHandshakeLightNode(t *testing.T) { - var lightNodeTests = []struct { - name string - lightNode bool - }{ - {"on", true}, - {"off", false}, - } - - for _, test := range lightNodeTests { - t.Run(test.name, func(t *testing.T) { - randomAddr := RandomAddr() - pt := newBzzHandshakeTester(t, 1, randomAddr, false) - node := pt.Nodes[0] - addr := NewAddr(node) - - err := pt.testHandshake( - correctBzzHandshake(randomAddr, false), - &HandshakeMsg{Version: TestProtocolVersion, NetworkID: TestProtocolNetworkID, Addr: addr, LightNode: test.lightNode}, - ) - - if err != nil { - t.Fatal(err) - } - - if pt.bzz.handshakes[node.ID()].LightNode != test.lightNode { - t.Fatalf("peer LightNode flag is %v, should be %v", pt.bzz.handshakes[node.ID()].LightNode, test.lightNode) - } - }) - } -} diff --git a/swarm/network/simulation/bucket.go b/swarm/network/simulation/bucket.go deleted file mode 100644 index bd15ea2ab115..000000000000 --- a/swarm/network/simulation/bucket.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import "github.com/ethereum/go-ethereum/p2p/enode" - -// BucketKey is the type that should be used for keys in simulation buckets. -type BucketKey string - -// NodeItem returns an item set in ServiceFunc function for a particualar node. -func (s *Simulation) NodeItem(id enode.ID, key interface{}) (value interface{}, ok bool) { - s.mu.Lock() - defer s.mu.Unlock() - - if _, ok := s.buckets[id]; !ok { - return nil, false - } - return s.buckets[id].Load(key) -} - -// SetNodeItem sets a new item associated with the node with provided NodeID. -// Buckets should be used to avoid managing separate simulation global state. -func (s *Simulation) SetNodeItem(id enode.ID, key interface{}, value interface{}) { - s.mu.Lock() - defer s.mu.Unlock() - - s.buckets[id].Store(key, value) -} - -// NodesItems returns a map of items from all nodes that are all set under the -// same BucketKey. -func (s *Simulation) NodesItems(key interface{}) (values map[enode.ID]interface{}) { - s.mu.RLock() - defer s.mu.RUnlock() - - ids := s.NodeIDs() - values = make(map[enode.ID]interface{}, len(ids)) - for _, id := range ids { - if _, ok := s.buckets[id]; !ok { - continue - } - if v, ok := s.buckets[id].Load(key); ok { - values[id] = v - } - } - return values -} - -// UpNodesItems returns a map of items with the same BucketKey from all nodes that are up. -func (s *Simulation) UpNodesItems(key interface{}) (values map[enode.ID]interface{}) { - s.mu.RLock() - defer s.mu.RUnlock() - - ids := s.UpNodeIDs() - values = make(map[enode.ID]interface{}) - for _, id := range ids { - if _, ok := s.buckets[id]; !ok { - continue - } - if v, ok := s.buckets[id].Load(key); ok { - values[id] = v - } - } - return values -} diff --git a/swarm/network/simulation/bucket_test.go b/swarm/network/simulation/bucket_test.go deleted file mode 100644 index 461d99825cb2..000000000000 --- a/swarm/network/simulation/bucket_test.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "sync" - "testing" - - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" -) - -// TestServiceBucket tests all bucket functionalities using subtests. -// It constructs a simulation of two nodes by adding items to their buckets -// in ServiceFunc constructor, then by SetNodeItem. Testing UpNodesItems -// is done by stopping one node and validating availability of its items. -func TestServiceBucket(t *testing.T) { - testKey := "Key" - testValue := "Value" - - sim := New(map[string]ServiceFunc{ - "noop": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - b.Store(testKey, testValue+ctx.Config.ID.String()) - return newNoopService(), nil, nil - }, - }) - defer sim.Close() - - id1, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - id2, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - t.Run("ServiceFunc bucket Store", func(t *testing.T) { - v, ok := sim.NodeItem(id1, testKey) - if !ok { - t.Fatal("bucket item not found") - } - s, ok := v.(string) - if !ok { - t.Fatal("bucket item value is not string") - } - if s != testValue+id1.String() { - t.Fatalf("expected %q, got %q", testValue+id1.String(), s) - } - - v, ok = sim.NodeItem(id2, testKey) - if !ok { - t.Fatal("bucket item not found") - } - s, ok = v.(string) - if !ok { - t.Fatal("bucket item value is not string") - } - if s != testValue+id2.String() { - t.Fatalf("expected %q, got %q", testValue+id2.String(), s) - } - }) - - customKey := "anotherKey" - customValue := "anotherValue" - - t.Run("SetNodeItem", func(t *testing.T) { - sim.SetNodeItem(id1, customKey, customValue) - - v, ok := sim.NodeItem(id1, customKey) - if !ok { - t.Fatal("bucket item not found") - } - s, ok := v.(string) - if !ok { - t.Fatal("bucket item value is not string") - } - if s != customValue { - t.Fatalf("expected %q, got %q", customValue, s) - } - - v, ok = sim.NodeItem(id2, customKey) - if ok { - t.Fatal("bucket item should not be found") - } - }) - - if err := sim.StopNode(id2); err != nil { - t.Fatal(err) - } - - t.Run("UpNodesItems", func(t *testing.T) { - items := sim.UpNodesItems(testKey) - - v, ok := items[id1] - if !ok { - t.Errorf("node 1 item not found") - } - s, ok := v.(string) - if !ok { - t.Fatal("node 1 item value is not string") - } - if s != testValue+id1.String() { - t.Fatalf("expected %q, got %q", testValue+id1.String(), s) - } - - v, ok = items[id2] - if ok { - t.Errorf("node 2 item should not be found") - } - }) - - t.Run("NodeItems", func(t *testing.T) { - items := sim.NodesItems(testKey) - - v, ok := items[id1] - if !ok { - t.Errorf("node 1 item not found") - } - s, ok := v.(string) - if !ok { - t.Fatal("node 1 item value is not string") - } - if s != testValue+id1.String() { - t.Fatalf("expected %q, got %q", testValue+id1.String(), s) - } - - v, ok = items[id2] - if !ok { - t.Errorf("node 2 item not found") - } - s, ok = v.(string) - if !ok { - t.Fatal("node 1 item value is not string") - } - if s != testValue+id2.String() { - t.Fatalf("expected %q, got %q", testValue+id2.String(), s) - } - }) -} diff --git a/swarm/network/simulation/connect.go b/swarm/network/simulation/connect.go deleted file mode 100644 index 8b2aa1bfa73b..000000000000 --- a/swarm/network/simulation/connect.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "strings" - - "github.com/ethereum/go-ethereum/p2p/enode" -) - -// ConnectToPivotNode connects the node with provided NodeID -// to the pivot node, already set by Simulation.SetPivotNode method. -// It is useful when constructing a star network topology -// when simulation adds and removes nodes dynamically. -func (s *Simulation) ConnectToPivotNode(id enode.ID) (err error) { - pid := s.PivotNodeID() - if pid == nil { - return ErrNoPivotNode - } - return s.connect(*pid, id) -} - -// ConnectToLastNode connects the node with provided NodeID -// to the last node that is up, and avoiding connection to self. -// It is useful when constructing a chain network topology -// when simulation adds and removes nodes dynamically. -func (s *Simulation) ConnectToLastNode(id enode.ID) (err error) { - ids := s.UpNodeIDs() - l := len(ids) - if l < 2 { - return nil - } - lid := ids[l-1] - if lid == id { - lid = ids[l-2] - } - return s.connect(lid, id) -} - -// ConnectToRandomNode connects the node with provieded NodeID -// to a random node that is up. -func (s *Simulation) ConnectToRandomNode(id enode.ID) (err error) { - n := s.RandomUpNode(id) - if n == nil { - return ErrNodeNotFound - } - return s.connect(n.ID, id) -} - -// ConnectNodesFull connects all nodes one to another. -// It provides a complete connectivity in the network -// which should be rarely needed. -func (s *Simulation) ConnectNodesFull(ids []enode.ID) (err error) { - if ids == nil { - ids = s.UpNodeIDs() - } - l := len(ids) - for i := 0; i < l; i++ { - for j := i + 1; j < l; j++ { - err = s.connect(ids[i], ids[j]) - if err != nil { - return err - } - } - } - return nil -} - -// ConnectNodesChain connects all nodes in a chain topology. -// If ids argument is nil, all nodes that are up will be connected. -func (s *Simulation) ConnectNodesChain(ids []enode.ID) (err error) { - if ids == nil { - ids = s.UpNodeIDs() - } - l := len(ids) - for i := 0; i < l-1; i++ { - err = s.connect(ids[i], ids[i+1]) - if err != nil { - return err - } - } - return nil -} - -// ConnectNodesRing connects all nodes in a ring topology. -// If ids argument is nil, all nodes that are up will be connected. -func (s *Simulation) ConnectNodesRing(ids []enode.ID) (err error) { - if ids == nil { - ids = s.UpNodeIDs() - } - l := len(ids) - if l < 2 { - return nil - } - for i := 0; i < l-1; i++ { - err = s.connect(ids[i], ids[i+1]) - if err != nil { - return err - } - } - return s.connect(ids[l-1], ids[0]) -} - -// ConnectNodesStar connects all nodes in a star topology -// with the center at provided NodeID. -// If ids argument is nil, all nodes that are up will be connected. -func (s *Simulation) ConnectNodesStar(id enode.ID, ids []enode.ID) (err error) { - if ids == nil { - ids = s.UpNodeIDs() - } - l := len(ids) - for i := 0; i < l; i++ { - if id == ids[i] { - continue - } - err = s.connect(id, ids[i]) - if err != nil { - return err - } - } - return nil -} - -// ConnectNodesStarPivot connects all nodes in a star topology -// with the center at already set pivot node. -// If ids argument is nil, all nodes that are up will be connected. -func (s *Simulation) ConnectNodesStarPivot(ids []enode.ID) (err error) { - id := s.PivotNodeID() - if id == nil { - return ErrNoPivotNode - } - return s.ConnectNodesStar(*id, ids) -} - -// connect connects two nodes but ignores already connected error. -func (s *Simulation) connect(oneID, otherID enode.ID) error { - return ignoreAlreadyConnectedErr(s.Net.Connect(oneID, otherID)) -} - -func ignoreAlreadyConnectedErr(err error) error { - if err == nil || strings.Contains(err.Error(), "already connected") { - return nil - } - return err -} diff --git a/swarm/network/simulation/connect_test.go b/swarm/network/simulation/connect_test.go deleted file mode 100644 index 6c94b3a01ca4..000000000000 --- a/swarm/network/simulation/connect_test.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "testing" - - "github.com/ethereum/go-ethereum/p2p/enode" -) - -func TestConnectToPivotNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - pid, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - sim.SetPivotNode(pid) - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - if len(sim.Net.Conns) > 0 { - t.Fatal("no connections should exist after just adding nodes") - } - - err = sim.ConnectToPivotNode(id) - if err != nil { - t.Fatal(err) - } - - if sim.Net.GetConn(id, pid) == nil { - t.Error("node did not connect to pivot node") - } -} - -func TestConnectToLastNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - n := 10 - - ids, err := sim.AddNodes(n) - if err != nil { - t.Fatal(err) - } - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - if len(sim.Net.Conns) > 0 { - t.Fatal("no connections should exist after just adding nodes") - } - - err = sim.ConnectToLastNode(id) - if err != nil { - t.Fatal(err) - } - - for _, i := range ids[:n-2] { - if sim.Net.GetConn(id, i) != nil { - t.Error("node connected to the node that is not the last") - } - } - - if sim.Net.GetConn(id, ids[n-1]) == nil { - t.Error("node did not connect to the last node") - } -} - -func TestConnectToRandomNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - n := 10 - - ids, err := sim.AddNodes(n) - if err != nil { - t.Fatal(err) - } - - if len(sim.Net.Conns) > 0 { - t.Fatal("no connections should exist after just adding nodes") - } - - err = sim.ConnectToRandomNode(ids[0]) - if err != nil { - t.Fatal(err) - } - - var cc int - for i := 0; i < n; i++ { - for j := i + 1; j < n; j++ { - if sim.Net.GetConn(ids[i], ids[j]) != nil { - cc++ - } - } - } - - if cc != 1 { - t.Errorf("expected one connection, got %v", cc) - } -} - -func TestConnectNodesFull(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodes(12) - if err != nil { - t.Fatal(err) - } - - if len(sim.Net.Conns) > 0 { - t.Fatal("no connections should exist after just adding nodes") - } - - err = sim.ConnectNodesFull(ids) - if err != nil { - t.Fatal(err) - } - - testFull(t, sim, ids) -} - -func testFull(t *testing.T, sim *Simulation, ids []enode.ID) { - n := len(ids) - var cc int - for i := 0; i < n; i++ { - for j := i + 1; j < n; j++ { - if sim.Net.GetConn(ids[i], ids[j]) != nil { - cc++ - } - } - } - - want := n * (n - 1) / 2 - - if cc != want { - t.Errorf("expected %v connection, got %v", want, cc) - } -} - -func TestConnectNodesChain(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodes(10) - if err != nil { - t.Fatal(err) - } - - if len(sim.Net.Conns) > 0 { - t.Fatal("no connections should exist after just adding nodes") - } - - err = sim.ConnectNodesChain(ids) - if err != nil { - t.Fatal(err) - } - - testChain(t, sim, ids) -} - -func testChain(t *testing.T, sim *Simulation, ids []enode.ID) { - n := len(ids) - for i := 0; i < n; i++ { - for j := i + 1; j < n; j++ { - c := sim.Net.GetConn(ids[i], ids[j]) - if i == j-1 { - if c == nil { - t.Errorf("nodes %v and %v are not connected, but they should be", i, j) - } - } else { - if c != nil { - t.Errorf("nodes %v and %v are connected, but they should not be", i, j) - } - } - } - } -} - -func TestConnectNodesRing(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodes(10) - if err != nil { - t.Fatal(err) - } - - if len(sim.Net.Conns) > 0 { - t.Fatal("no connections should exist after just adding nodes") - } - - err = sim.ConnectNodesRing(ids) - if err != nil { - t.Fatal(err) - } - - testRing(t, sim, ids) -} - -func testRing(t *testing.T, sim *Simulation, ids []enode.ID) { - n := len(ids) - for i := 0; i < n; i++ { - for j := i + 1; j < n; j++ { - c := sim.Net.GetConn(ids[i], ids[j]) - if i == j-1 || (i == 0 && j == n-1) { - if c == nil { - t.Errorf("nodes %v and %v are not connected, but they should be", i, j) - } - } else { - if c != nil { - t.Errorf("nodes %v and %v are connected, but they should not be", i, j) - } - } - } - } -} - -func TestConnectToNodesStar(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodes(10) - if err != nil { - t.Fatal(err) - } - - if len(sim.Net.Conns) > 0 { - t.Fatal("no connections should exist after just adding nodes") - } - - centerIndex := 2 - - err = sim.ConnectNodesStar(ids[centerIndex], ids) - if err != nil { - t.Fatal(err) - } - - testStar(t, sim, ids, centerIndex) -} - -func testStar(t *testing.T, sim *Simulation, ids []enode.ID, centerIndex int) { - n := len(ids) - for i := 0; i < n; i++ { - for j := i + 1; j < n; j++ { - c := sim.Net.GetConn(ids[i], ids[j]) - if i == centerIndex || j == centerIndex { - if c == nil { - t.Errorf("nodes %v and %v are not connected, but they should be", i, j) - } - } else { - if c != nil { - t.Errorf("nodes %v and %v are connected, but they should not be", i, j) - } - } - } - } -} - -func TestConnectToNodesStarPivot(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodes(10) - if err != nil { - t.Fatal(err) - } - - if len(sim.Net.Conns) > 0 { - t.Fatal("no connections should exist after just adding nodes") - } - - pivotIndex := 4 - - sim.SetPivotNode(ids[pivotIndex]) - - err = sim.ConnectNodesStarPivot(ids) - if err != nil { - t.Fatal(err) - } - - testStar(t, sim, ids, pivotIndex) -} diff --git a/swarm/network/simulation/events.go b/swarm/network/simulation/events.go deleted file mode 100644 index 594d36225cec..000000000000 --- a/swarm/network/simulation/events.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "context" - "sync" - - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" -) - -// PeerEvent is the type of the channel returned by Simulation.PeerEvents. -type PeerEvent struct { - // NodeID is the ID of node that the event is caught on. - NodeID enode.ID - // Event is the event that is caught. - Event *p2p.PeerEvent - // Error is the error that may have happened during event watching. - Error error -} - -// PeerEventsFilter defines a filter on PeerEvents to exclude messages with -// defined properties. Use PeerEventsFilter methods to set required options. -type PeerEventsFilter struct { - t *p2p.PeerEventType - protocol *string - msgCode *uint64 -} - -// NewPeerEventsFilter returns a new PeerEventsFilter instance. -func NewPeerEventsFilter() *PeerEventsFilter { - return &PeerEventsFilter{} -} - -// Type sets the filter to only one peer event type. -func (f *PeerEventsFilter) Type(t p2p.PeerEventType) *PeerEventsFilter { - f.t = &t - return f -} - -// Protocol sets the filter to only one message protocol. -func (f *PeerEventsFilter) Protocol(p string) *PeerEventsFilter { - f.protocol = &p - return f -} - -// MsgCode sets the filter to only one msg code. -func (f *PeerEventsFilter) MsgCode(c uint64) *PeerEventsFilter { - f.msgCode = &c - return f -} - -// PeerEvents returns a channel of events that are captured by admin peerEvents -// subscription nodes with provided NodeIDs. Additional filters can be set to ignore -// events that are not relevant. -func (s *Simulation) PeerEvents(ctx context.Context, ids []enode.ID, filters ...*PeerEventsFilter) <-chan PeerEvent { - eventC := make(chan PeerEvent) - - // wait group to make sure all subscriptions to admin peerEvents are established - // before this function returns. - var subsWG sync.WaitGroup - for _, id := range ids { - s.shutdownWG.Add(1) - subsWG.Add(1) - go func(id enode.ID) { - defer s.shutdownWG.Done() - - client, err := s.Net.GetNode(id).Client() - if err != nil { - subsWG.Done() - eventC <- PeerEvent{NodeID: id, Error: err} - return - } - events := make(chan *p2p.PeerEvent) - sub, err := client.Subscribe(ctx, "admin", events, "peerEvents") - if err != nil { - subsWG.Done() - eventC <- PeerEvent{NodeID: id, Error: err} - return - } - defer sub.Unsubscribe() - - subsWG.Done() - - for { - select { - case <-ctx.Done(): - if err := ctx.Err(); err != nil { - select { - case eventC <- PeerEvent{NodeID: id, Error: err}: - case <-s.Done(): - } - } - return - case <-s.Done(): - return - case e := <-events: - match := len(filters) == 0 // if there are no filters match all events - for _, f := range filters { - if f.t != nil && *f.t != e.Type { - continue - } - if f.protocol != nil && *f.protocol != e.Protocol { - continue - } - if f.msgCode != nil && e.MsgCode != nil && *f.msgCode != *e.MsgCode { - continue - } - // all filter parameters matched, break the loop - match = true - break - } - if match { - select { - case eventC <- PeerEvent{NodeID: id, Event: e}: - case <-ctx.Done(): - if err := ctx.Err(); err != nil { - select { - case eventC <- PeerEvent{NodeID: id, Error: err}: - case <-s.Done(): - } - } - return - case <-s.Done(): - return - } - } - case err := <-sub.Err(): - if err != nil { - select { - case eventC <- PeerEvent{NodeID: id, Error: err}: - case <-ctx.Done(): - if err := ctx.Err(); err != nil { - select { - case eventC <- PeerEvent{NodeID: id, Error: err}: - case <-s.Done(): - } - } - return - case <-s.Done(): - return - } - } - } - } - }(id) - } - - // wait all subscriptions - subsWG.Wait() - return eventC -} diff --git a/swarm/network/simulation/events_test.go b/swarm/network/simulation/events_test.go deleted file mode 100644 index 0c185d977453..000000000000 --- a/swarm/network/simulation/events_test.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "context" - "sync" - "testing" - "time" -) - -// TestPeerEvents creates simulation, adds two nodes, -// register for peer events, connects nodes in a chain -// and waits for the number of connection events to -// be received. -func TestPeerEvents(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodes(2) - if err != nil { - t.Fatal(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - events := sim.PeerEvents(ctx, sim.NodeIDs()) - - // two nodes -> two connection events - expectedEventCount := 2 - - var wg sync.WaitGroup - wg.Add(expectedEventCount) - - go func() { - for e := range events { - if e.Error != nil { - if e.Error == context.Canceled { - return - } - t.Error(e.Error) - continue - } - wg.Done() - } - }() - - err = sim.ConnectNodesChain(sim.NodeIDs()) - if err != nil { - t.Fatal(err) - } - - wg.Wait() -} - -func TestPeerEventsTimeout(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodes(2) - if err != nil { - t.Fatal(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) - defer cancel() - events := sim.PeerEvents(ctx, sim.NodeIDs()) - - done := make(chan struct{}) - go func() { - for e := range events { - if e.Error == context.Canceled { - return - } - if e.Error == context.DeadlineExceeded { - close(done) - return - } else { - t.Fatal(e.Error) - } - } - }() - - select { - case <-time.After(time.Second): - t.Error("no context deadline received") - case <-done: - // all good, context deadline detected - } -} diff --git a/swarm/network/simulation/example_test.go b/swarm/network/simulation/example_test.go deleted file mode 100644 index 84b0634b4561..000000000000 --- a/swarm/network/simulation/example_test.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation_test - -import ( - "context" - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/simulation" -) - -// Every node can have a Kademlia associated using the node bucket under -// BucketKeyKademlia key. This allows to use WaitTillHealthy to block until -// all nodes have the their Kadmlias healthy. -func ExampleSimulation_WaitTillHealthy() { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "bzz": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - // store kademlia in node's bucket under BucketKeyKademlia - // so that it can be found by WaitTillHealthy method. - b.Store(simulation.BucketKeyKademlia, kad) - return network.NewBzz(config, kad, nil, nil, nil), nil, nil - }, - }) - defer sim.Close() - - _, err := sim.AddNodesAndConnectRing(10) - if err != nil { - // handle error properly... - panic(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) - defer cancel() - ill, err := sim.WaitTillHealthy(ctx, 2) - if err != nil { - // inspect the latest detected not healthy kademlias - for id, kad := range ill { - fmt.Println("Node", id) - fmt.Println(kad.String()) - } - // handle error... - } - - // continue with the test -} - -// Watch all peer events in the simulation network, buy receiving from a channel. -func ExampleSimulation_PeerEvents() { - sim := simulation.New(nil) - defer sim.Close() - - events := sim.PeerEvents(context.Background(), sim.NodeIDs()) - - go func() { - for e := range events { - if e.Error != nil { - log.Error("peer event", "err", e.Error) - continue - } - log.Info("peer event", "node", e.NodeID, "peer", e.Event.Peer, "msgcode", e.Event.MsgCode) - } - }() -} - -// Detect when a nodes drop a peer. -func ExampleSimulation_PeerEvents_disconnections() { - sim := simulation.New(nil) - defer sim.Close() - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeDrop), - ) - - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "err", d.Error) - continue - } - log.Warn("peer drop", "node", d.NodeID, "peer", d.Event.Peer) - } - }() -} - -// Watch multiple types of events or messages. In this case, they differ only -// by MsgCode, but filters can be set for different types or protocols, too. -func ExampleSimulation_PeerEvents_multipleFilters() { - sim := simulation.New(nil) - defer sim.Close() - - msgs := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - // Watch when bzz messages 1 and 4 are received. - simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeMsgRecv).Protocol("bzz").MsgCode(1), - simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeMsgRecv).Protocol("bzz").MsgCode(4), - ) - - go func() { - for m := range msgs { - if m.Error != nil { - log.Error("bzz message", "err", m.Error) - continue - } - log.Info("bzz message", "node", m.NodeID, "peer", m.Event.Peer) - } - }() -} diff --git a/swarm/network/simulation/http.go b/swarm/network/simulation/http.go deleted file mode 100644 index 69ae3baec289..000000000000 --- a/swarm/network/simulation/http.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "fmt" - "net/http" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/p2p/simulations" -) - -// Package defaults. -var ( - DefaultHTTPSimAddr = ":8888" -) - -//WithServer implements the builder pattern constructor for Simulation to -//start with a HTTP server -func (s *Simulation) WithServer(addr string) *Simulation { - //assign default addr if nothing provided - if addr == "" { - addr = DefaultHTTPSimAddr - } - log.Info(fmt.Sprintf("Initializing simulation server on %s...", addr)) - //initialize the HTTP server - s.handler = simulations.NewServer(s.Net) - s.runC = make(chan struct{}) - //add swarm specific routes to the HTTP server - s.addSimulationRoutes() - s.httpSrv = &http.Server{ - Addr: addr, - Handler: s.handler, - } - go func() { - err := s.httpSrv.ListenAndServe() - if err != nil { - log.Error("Error starting the HTTP server", "error", err) - } - }() - return s -} - -//register additional HTTP routes -func (s *Simulation) addSimulationRoutes() { - s.handler.POST("/runsim", s.RunSimulation) -} - -// RunSimulation is the actual POST endpoint runner -func (s *Simulation) RunSimulation(w http.ResponseWriter, req *http.Request) { - log.Debug("RunSimulation endpoint running") - s.runC <- struct{}{} - w.WriteHeader(http.StatusOK) -} diff --git a/swarm/network/simulation/http_test.go b/swarm/network/simulation/http_test.go deleted file mode 100644 index 775cf9219046..000000000000 --- a/swarm/network/simulation/http_test.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "context" - "fmt" - "net/http" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" -) - -func TestSimulationWithHTTPServer(t *testing.T) { - log.Debug("Init simulation") - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - defer cancel() - - sim := New( - map[string]ServiceFunc{ - "noop": func(_ *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - return newNoopService(), nil, nil - }, - }).WithServer(DefaultHTTPSimAddr) - defer sim.Close() - log.Debug("Done.") - - _, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - log.Debug("Starting sim round and let it time out...") - //first test that running without sending to the channel will actually - //block the simulation, so let it time out - result := sim.Run(ctx, func(ctx context.Context, sim *Simulation) error { - log.Debug("Just start the sim without any action and wait for the timeout") - //ensure with a Sleep that simulation doesn't terminate before the timeout - time.Sleep(2 * time.Second) - return nil - }) - - if result.Error != nil { - if result.Error.Error() == "context deadline exceeded" { - log.Debug("Expected timeout error received") - } else { - t.Fatal(result.Error) - } - } - - //now run it again and send the expected signal on the waiting channel, - //then close the simulation - log.Debug("Starting sim round and wait for frontend signal...") - //this time the timeout should be long enough so that it doesn't kick in too early - ctx, cancel2 := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel2() - go sendRunSignal(t) - result = sim.Run(ctx, func(ctx context.Context, sim *Simulation) error { - log.Debug("This run waits for the run signal from `frontend`...") - //ensure with a Sleep that simulation doesn't terminate before the signal is received - time.Sleep(2 * time.Second) - return nil - }) - if result.Error != nil { - t.Fatal(result.Error) - } - log.Debug("Test terminated successfully") -} - -func sendRunSignal(t *testing.T) { - //We need to first wait for the sim HTTP server to start running... - time.Sleep(2 * time.Second) - //then we can send the signal - - log.Debug("Sending run signal to simulation: POST /runsim...") - resp, err := http.Post(fmt.Sprintf("http://localhost%s/runsim", DefaultHTTPSimAddr), "application/json", nil) - if err != nil { - t.Fatalf("Request failed: %v", err) - } - defer func() { - err := resp.Body.Close() - if err != nil { - log.Error("Error closing response body", "err", err) - } - }() - log.Debug("Signal sent") - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } -} diff --git a/swarm/network/simulation/kademlia.go b/swarm/network/simulation/kademlia.go deleted file mode 100644 index f895181d9e4a..000000000000 --- a/swarm/network/simulation/kademlia.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "context" - "encoding/hex" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/network" -) - -// BucketKeyKademlia is the key to be used for storing the kademlia -// instance for particuar node, usually inside the ServiceFunc function. -var BucketKeyKademlia BucketKey = "kademlia" - -// WaitTillHealthy is blocking until the health of all kademlias is true. -// If error is not nil, a map of kademlia that was found not healthy is returned. -func (s *Simulation) WaitTillHealthy(ctx context.Context, kadMinProxSize int) (ill map[enode.ID]*network.Kademlia, err error) { - // Prepare PeerPot map for checking Kademlia health - var ppmap map[string]*network.PeerPot - kademlias := s.kademlias() - addrs := make([][]byte, 0, len(kademlias)) - for _, k := range kademlias { - addrs = append(addrs, k.BaseAddr()) - } - ppmap = network.NewPeerPotMap(kadMinProxSize, addrs) - - // Wait for healthy Kademlia on every node before checking files - ticker := time.NewTicker(200 * time.Millisecond) - defer ticker.Stop() - - ill = make(map[enode.ID]*network.Kademlia) - for { - select { - case <-ctx.Done(): - return ill, ctx.Err() - case <-ticker.C: - for k := range ill { - delete(ill, k) - } - log.Debug("kademlia health check", "addr count", len(addrs)) - for id, k := range kademlias { - //PeerPot for this node - addr := common.Bytes2Hex(k.BaseAddr()) - pp := ppmap[addr] - //call Healthy RPC - h := k.Healthy(pp) - //print info - log.Debug(k.String()) - log.Debug("kademlia", "empty bins", pp.EmptyBins, "gotNN", h.GotNN, "knowNN", h.KnowNN, "full", h.Full) - log.Debug("kademlia", "health", h.GotNN && h.KnowNN && h.Full, "addr", hex.EncodeToString(k.BaseAddr()), "node", id) - log.Debug("kademlia", "ill condition", !h.GotNN || !h.Full, "addr", hex.EncodeToString(k.BaseAddr()), "node", id) - if !h.GotNN || !h.Full { - ill[id] = k - } - } - if len(ill) == 0 { - return nil, nil - } - } - } -} - -// kademlias returns all Kademlia instances that are set -// in simulation bucket. -func (s *Simulation) kademlias() (ks map[enode.ID]*network.Kademlia) { - items := s.UpNodesItems(BucketKeyKademlia) - ks = make(map[enode.ID]*network.Kademlia, len(items)) - for id, v := range items { - k, ok := v.(*network.Kademlia) - if !ok { - continue - } - ks[id] = k - } - return ks -} diff --git a/swarm/network/simulation/kademlia_test.go b/swarm/network/simulation/kademlia_test.go deleted file mode 100644 index 285644a0f4f4..000000000000 --- a/swarm/network/simulation/kademlia_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "context" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/network" -) - -func TestWaitTillHealthy(t *testing.T) { - sim := New(map[string]ServiceFunc{ - "bzz": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - // store kademlia in node's bucket under BucketKeyKademlia - // so that it can be found by WaitTillHealthy method. - b.Store(BucketKeyKademlia, kad) - return network.NewBzz(config, kad, nil, nil, nil), nil, nil - }, - }) - defer sim.Close() - - _, err := sim.AddNodesAndConnectRing(10) - if err != nil { - t.Fatal(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) - defer cancel() - ill, err := sim.WaitTillHealthy(ctx, 2) - if err != nil { - for id, kad := range ill { - t.Log("Node", id) - t.Log(kad.String()) - } - if err != nil { - t.Fatal(err) - } - } -} diff --git a/swarm/network/simulation/node.go b/swarm/network/simulation/node.go deleted file mode 100644 index a916d3fc21fd..000000000000 --- a/swarm/network/simulation/node.go +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "encoding/json" - "errors" - "io/ioutil" - "math/rand" - "os" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" -) - -// NodeIDs returns NodeIDs for all nodes in the network. -func (s *Simulation) NodeIDs() (ids []enode.ID) { - nodes := s.Net.GetNodes() - ids = make([]enode.ID, len(nodes)) - for i, node := range nodes { - ids[i] = node.ID() - } - return ids -} - -// UpNodeIDs returns NodeIDs for nodes that are up in the network. -func (s *Simulation) UpNodeIDs() (ids []enode.ID) { - nodes := s.Net.GetNodes() - for _, node := range nodes { - if node.Up { - ids = append(ids, node.ID()) - } - } - return ids -} - -// DownNodeIDs returns NodeIDs for nodes that are stopped in the network. -func (s *Simulation) DownNodeIDs() (ids []enode.ID) { - nodes := s.Net.GetNodes() - for _, node := range nodes { - if !node.Up { - ids = append(ids, node.ID()) - } - } - return ids -} - -// AddNodeOption defines the option that can be passed -// to Simulation.AddNode method. -type AddNodeOption func(*adapters.NodeConfig) - -// AddNodeWithMsgEvents sets the EnableMsgEvents option -// to NodeConfig. -func AddNodeWithMsgEvents(enable bool) AddNodeOption { - return func(o *adapters.NodeConfig) { - o.EnableMsgEvents = enable - } -} - -// AddNodeWithService specifies a service that should be -// started on a node. This option can be repeated as variadic -// argument toe AddNode and other add node related methods. -// If AddNodeWithService is not specified, all services will be started. -func AddNodeWithService(serviceName string) AddNodeOption { - return func(o *adapters.NodeConfig) { - o.Services = append(o.Services, serviceName) - } -} - -// AddNode creates a new node with random configuration, -// applies provided options to the config and adds the node to network. -// By default all services will be started on a node. If one or more -// AddNodeWithService option are provided, only specified services will be started. -func (s *Simulation) AddNode(opts ...AddNodeOption) (id enode.ID, err error) { - conf := adapters.RandomNodeConfig() - for _, o := range opts { - o(conf) - } - if len(conf.Services) == 0 { - conf.Services = s.serviceNames - } - node, err := s.Net.NewNodeWithConfig(conf) - if err != nil { - return id, err - } - return node.ID(), s.Net.Start(node.ID()) -} - -// AddNodes creates new nodes with random configurations, -// applies provided options to the config and adds nodes to network. -func (s *Simulation) AddNodes(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - ids = make([]enode.ID, 0, count) - for i := 0; i < count; i++ { - id, err := s.AddNode(opts...) - if err != nil { - return nil, err - } - ids = append(ids, id) - } - return ids, nil -} - -// AddNodesAndConnectFull is a helpper method that combines -// AddNodes and ConnectNodesFull. Only new nodes will be connected. -func (s *Simulation) AddNodesAndConnectFull(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - if count < 2 { - return nil, errors.New("count of nodes must be at least 2") - } - ids, err = s.AddNodes(count, opts...) - if err != nil { - return nil, err - } - err = s.ConnectNodesFull(ids) - if err != nil { - return nil, err - } - return ids, nil -} - -// AddNodesAndConnectChain is a helpper method that combines -// AddNodes and ConnectNodesChain. The chain will be continued from the last -// added node, if there is one in simulation using ConnectToLastNode method. -func (s *Simulation) AddNodesAndConnectChain(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - if count < 2 { - return nil, errors.New("count of nodes must be at least 2") - } - id, err := s.AddNode(opts...) - if err != nil { - return nil, err - } - err = s.ConnectToLastNode(id) - if err != nil { - return nil, err - } - ids, err = s.AddNodes(count-1, opts...) - if err != nil { - return nil, err - } - ids = append([]enode.ID{id}, ids...) - err = s.ConnectNodesChain(ids) - if err != nil { - return nil, err - } - return ids, nil -} - -// AddNodesAndConnectRing is a helpper method that combines -// AddNodes and ConnectNodesRing. -func (s *Simulation) AddNodesAndConnectRing(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - if count < 2 { - return nil, errors.New("count of nodes must be at least 2") - } - ids, err = s.AddNodes(count, opts...) - if err != nil { - return nil, err - } - err = s.ConnectNodesRing(ids) - if err != nil { - return nil, err - } - return ids, nil -} - -// AddNodesAndConnectStar is a helpper method that combines -// AddNodes and ConnectNodesStar. -func (s *Simulation) AddNodesAndConnectStar(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - if count < 2 { - return nil, errors.New("count of nodes must be at least 2") - } - ids, err = s.AddNodes(count, opts...) - if err != nil { - return nil, err - } - err = s.ConnectNodesStar(ids[0], ids[1:]) - if err != nil { - return nil, err - } - return ids, nil -} - -//UploadSnapshot uploads a snapshot to the simulation -//This method tries to open the json file provided, applies the config to all nodes -//and then loads the snapshot into the Simulation network -func (s *Simulation) UploadSnapshot(snapshotFile string, opts ...AddNodeOption) error { - f, err := os.Open(snapshotFile) - if err != nil { - return err - } - defer func() { - err := f.Close() - if err != nil { - log.Error("Error closing snapshot file", "err", err) - } - }() - jsonbyte, err := ioutil.ReadAll(f) - if err != nil { - return err - } - var snap simulations.Snapshot - err = json.Unmarshal(jsonbyte, &snap) - if err != nil { - return err - } - - //the snapshot probably has the property EnableMsgEvents not set - //just in case, set it to true! - //(we need this to wait for messages before uploading) - for _, n := range snap.Nodes { - n.Node.Config.EnableMsgEvents = true - n.Node.Config.Services = s.serviceNames - for _, o := range opts { - o(n.Node.Config) - } - } - - log.Info("Waiting for p2p connections to be established...") - - //now we can load the snapshot - err = s.Net.Load(&snap) - if err != nil { - return err - } - log.Info("Snapshot loaded") - return nil -} - -// SetPivotNode sets the NodeID of the network's pivot node. -// Pivot node is just a specific node that should be treated -// differently then other nodes in test. SetPivotNode and -// PivotNodeID are just a convenient functions to set and -// retrieve it. -func (s *Simulation) SetPivotNode(id enode.ID) { - s.mu.Lock() - defer s.mu.Unlock() - s.pivotNodeID = &id -} - -// PivotNodeID returns NodeID of the pivot node set by -// Simulation.SetPivotNode method. -func (s *Simulation) PivotNodeID() (id *enode.ID) { - s.mu.Lock() - defer s.mu.Unlock() - return s.pivotNodeID -} - -// StartNode starts a node by NodeID. -func (s *Simulation) StartNode(id enode.ID) (err error) { - return s.Net.Start(id) -} - -// StartRandomNode starts a random node. -func (s *Simulation) StartRandomNode() (id enode.ID, err error) { - n := s.randomDownNode() - if n == nil { - return id, ErrNodeNotFound - } - return n.ID, s.Net.Start(n.ID) -} - -// StartRandomNodes starts random nodes. -func (s *Simulation) StartRandomNodes(count int) (ids []enode.ID, err error) { - ids = make([]enode.ID, 0, count) - downIDs := s.DownNodeIDs() - for i := 0; i < count; i++ { - n := s.randomNode(downIDs, ids...) - if n == nil { - return nil, ErrNodeNotFound - } - err = s.Net.Start(n.ID) - if err != nil { - return nil, err - } - ids = append(ids, n.ID) - } - return ids, nil -} - -// StopNode stops a node by NodeID. -func (s *Simulation) StopNode(id enode.ID) (err error) { - return s.Net.Stop(id) -} - -// StopRandomNode stops a random node. -func (s *Simulation) StopRandomNode() (id enode.ID, err error) { - n := s.RandomUpNode() - if n == nil { - return id, ErrNodeNotFound - } - return n.ID, s.Net.Stop(n.ID) -} - -// StopRandomNodes stops random nodes. -func (s *Simulation) StopRandomNodes(count int) (ids []enode.ID, err error) { - ids = make([]enode.ID, 0, count) - upIDs := s.UpNodeIDs() - for i := 0; i < count; i++ { - n := s.randomNode(upIDs, ids...) - if n == nil { - return nil, ErrNodeNotFound - } - err = s.Net.Stop(n.ID) - if err != nil { - return nil, err - } - ids = append(ids, n.ID) - } - return ids, nil -} - -// seed the random generator for Simulation.randomNode. -func init() { - rand.Seed(time.Now().UnixNano()) -} - -// RandomUpNode returns a random SimNode that is up. -// Arguments are NodeIDs for nodes that should not be returned. -func (s *Simulation) RandomUpNode(exclude ...enode.ID) *adapters.SimNode { - return s.randomNode(s.UpNodeIDs(), exclude...) -} - -// randomDownNode returns a random SimNode that is not up. -func (s *Simulation) randomDownNode(exclude ...enode.ID) *adapters.SimNode { - return s.randomNode(s.DownNodeIDs(), exclude...) -} - -// randomNode returns a random SimNode from the slice of NodeIDs. -func (s *Simulation) randomNode(ids []enode.ID, exclude ...enode.ID) *adapters.SimNode { - for _, e := range exclude { - var i int - for _, id := range ids { - if id == e { - ids = append(ids[:i], ids[i+1:]...) - } else { - i++ - } - } - } - l := len(ids) - if l == 0 { - return nil - } - n := s.Net.GetNode(ids[rand.Intn(l)]) - node, _ := n.Node.(*adapters.SimNode) - return node -} diff --git a/swarm/network/simulation/node_test.go b/swarm/network/simulation/node_test.go deleted file mode 100644 index 086ab606f6c6..000000000000 --- a/swarm/network/simulation/node_test.go +++ /dev/null @@ -1,462 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "context" - "fmt" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/network" -) - -func TestUpDownNodeIDs(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodes(10) - if err != nil { - t.Fatal(err) - } - - gotIDs := sim.NodeIDs() - - if !equalNodeIDs(ids, gotIDs) { - t.Error("returned nodes are not equal to added ones") - } - - stoppedIDs, err := sim.StopRandomNodes(3) - if err != nil { - t.Fatal(err) - } - - gotIDs = sim.UpNodeIDs() - - for _, id := range gotIDs { - if !sim.Net.GetNode(id).Up { - t.Errorf("node %s should not be down", id) - } - } - - if !equalNodeIDs(ids, append(gotIDs, stoppedIDs...)) { - t.Error("returned nodes are not equal to added ones") - } - - gotIDs = sim.DownNodeIDs() - - for _, id := range gotIDs { - if sim.Net.GetNode(id).Up { - t.Errorf("node %s should not be up", id) - } - } - - if !equalNodeIDs(stoppedIDs, gotIDs) { - t.Error("returned nodes are not equal to the stopped ones") - } -} - -func equalNodeIDs(one, other []enode.ID) bool { - if len(one) != len(other) { - return false - } - var count int - for _, a := range one { - var found bool - for _, b := range other { - if a == b { - found = true - break - } - } - if found { - count++ - } else { - return false - } - } - return count == len(one) -} - -func TestAddNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - - if !n.Up { - t.Error("node not started") - } -} - -func TestAddNodeWithMsgEvents(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - id, err := sim.AddNode(AddNodeWithMsgEvents(true)) - if err != nil { - t.Fatal(err) - } - - if !sim.Net.GetNode(id).Config.EnableMsgEvents { - t.Error("EnableMsgEvents is false") - } - - id, err = sim.AddNode(AddNodeWithMsgEvents(false)) - if err != nil { - t.Fatal(err) - } - - if sim.Net.GetNode(id).Config.EnableMsgEvents { - t.Error("EnableMsgEvents is true") - } -} - -func TestAddNodeWithService(t *testing.T) { - sim := New(map[string]ServiceFunc{ - "noop1": noopServiceFunc, - "noop2": noopServiceFunc, - }) - defer sim.Close() - - id, err := sim.AddNode(AddNodeWithService("noop1")) - if err != nil { - t.Fatal(err) - } - - n := sim.Net.GetNode(id).Node.(*adapters.SimNode) - if n.Service("noop1") == nil { - t.Error("service noop1 not found on node") - } - if n.Service("noop2") != nil { - t.Error("service noop2 should not be found on node") - } -} - -func TestAddNodes(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - nodesCount := 12 - - ids, err := sim.AddNodes(nodesCount) - if err != nil { - t.Fatal(err) - } - - count := len(ids) - if count != nodesCount { - t.Errorf("expected %v nodes, got %v", nodesCount, count) - } - - count = len(sim.Net.GetNodes()) - if count != nodesCount { - t.Errorf("expected %v nodes, got %v", nodesCount, count) - } -} - -func TestAddNodesAndConnectFull(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - n := 12 - - ids, err := sim.AddNodesAndConnectFull(n) - if err != nil { - t.Fatal(err) - } - - testFull(t, sim, ids) -} - -func TestAddNodesAndConnectChain(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodesAndConnectChain(12) - if err != nil { - t.Fatal(err) - } - - // add another set of nodes to test - // if two chains are connected - _, err = sim.AddNodesAndConnectChain(7) - if err != nil { - t.Fatal(err) - } - - testChain(t, sim, sim.UpNodeIDs()) -} - -func TestAddNodesAndConnectRing(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodesAndConnectRing(12) - if err != nil { - t.Fatal(err) - } - - testRing(t, sim, ids) -} - -func TestAddNodesAndConnectStar(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodesAndConnectStar(12) - if err != nil { - t.Fatal(err) - } - - testStar(t, sim, ids, 0) -} - -//To test that uploading a snapshot works -func TestUploadSnapshot(t *testing.T) { - log.Debug("Creating simulation") - s := New(map[string]ServiceFunc{ - "bzz": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - return network.NewBzz(config, kad, nil, nil, nil), nil, nil - }, - }) - defer s.Close() - - nodeCount := 16 - log.Debug("Uploading snapshot") - err := s.UploadSnapshot(fmt.Sprintf("../stream/testing/snapshot_%d.json", nodeCount)) - if err != nil { - t.Fatalf("Error uploading snapshot to simulation network: %v", err) - } - - ctx := context.Background() - log.Debug("Starting simulation...") - s.Run(ctx, func(ctx context.Context, sim *Simulation) error { - log.Debug("Checking") - nodes := sim.UpNodeIDs() - if len(nodes) != nodeCount { - t.Fatal("Simulation network node number doesn't match snapshot node number") - } - return nil - }) - log.Debug("Done.") -} - -func TestPivotNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - id2, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - if sim.PivotNodeID() != nil { - t.Error("expected no pivot node") - } - - sim.SetPivotNode(id) - - pid := sim.PivotNodeID() - - if pid == nil { - t.Error("pivot node not set") - } else if *pid != id { - t.Errorf("expected pivot node %s, got %s", id, *pid) - } - - sim.SetPivotNode(id2) - - pid = sim.PivotNodeID() - - if pid == nil { - t.Error("pivot node not set") - } else if *pid != id2 { - t.Errorf("expected pivot node %s, got %s", id2, *pid) - } -} - -func TestStartStopNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - if !n.Up { - t.Error("node not started") - } - - err = sim.StopNode(id) - if err != nil { - t.Fatal(err) - } - if n.Up { - t.Error("node not stopped") - } - - // Sleep here to ensure that Network.watchPeerEvents defer function - // has set the `node.Up = false` before we start the node again. - // p2p/simulations/network.go:215 - // - // The same node is stopped and started again, and upon start - // watchPeerEvents is started in a goroutine. If the node is stopped - // and then very quickly started, that goroutine may be scheduled later - // then start and force `node.Up = false` in its defer function. - // This will make this test unreliable. - time.Sleep(time.Second) - - err = sim.StartNode(id) - if err != nil { - t.Fatal(err) - } - if !n.Up { - t.Error("node not started") - } -} - -func TestStartStopRandomNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodes(3) - if err != nil { - t.Fatal(err) - } - - id, err := sim.StopRandomNode() - if err != nil { - t.Fatal(err) - } - - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - if n.Up { - t.Error("node not stopped") - } - - id2, err := sim.StopRandomNode() - if err != nil { - t.Fatal(err) - } - - // Sleep here to ensure that Network.watchPeerEvents defer function - // has set the `node.Up = false` before we start the node again. - // p2p/simulations/network.go:215 - // - // The same node is stopped and started again, and upon start - // watchPeerEvents is started in a goroutine. If the node is stopped - // and then very quickly started, that goroutine may be scheduled later - // then start and force `node.Up = false` in its defer function. - // This will make this test unreliable. - time.Sleep(time.Second) - - idStarted, err := sim.StartRandomNode() - if err != nil { - t.Fatal(err) - } - - if idStarted != id && idStarted != id2 { - t.Error("unexpected started node ID") - } -} - -func TestStartStopRandomNodes(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodes(10) - if err != nil { - t.Fatal(err) - } - - ids, err := sim.StopRandomNodes(3) - if err != nil { - t.Fatal(err) - } - - for _, id := range ids { - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - if n.Up { - t.Error("node not stopped") - } - } - - // Sleep here to ensure that Network.watchPeerEvents defer function - // has set the `node.Up = false` before we start the node again. - // p2p/simulations/network.go:215 - // - // The same node is stopped and started again, and upon start - // watchPeerEvents is started in a goroutine. If the node is stopped - // and then very quickly started, that goroutine may be scheduled later - // then start and force `node.Up = false` in its defer function. - // This will make this test unreliable. - time.Sleep(time.Second) - - ids, err = sim.StartRandomNodes(2) - if err != nil { - t.Fatal(err) - } - - for _, id := range ids { - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - if !n.Up { - t.Error("node not started") - } - } -} diff --git a/swarm/network/simulation/service.go b/swarm/network/simulation/service.go deleted file mode 100644 index 819602e9e8e0..000000000000 --- a/swarm/network/simulation/service.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" -) - -// Service returns a single Service by name on a particular node -// with provided id. -func (s *Simulation) Service(name string, id enode.ID) node.Service { - simNode, ok := s.Net.GetNode(id).Node.(*adapters.SimNode) - if !ok { - return nil - } - services := simNode.ServiceMap() - if len(services) == 0 { - return nil - } - return services[name] -} - -// RandomService returns a single Service by name on a -// randomly chosen node that is up. -func (s *Simulation) RandomService(name string) node.Service { - n := s.RandomUpNode() - if n == nil { - return nil - } - return n.Service(name) -} - -// Services returns all services with a provided name -// from nodes that are up. -func (s *Simulation) Services(name string) (services map[enode.ID]node.Service) { - nodes := s.Net.GetNodes() - services = make(map[enode.ID]node.Service) - for _, node := range nodes { - if !node.Up { - continue - } - simNode, ok := node.Node.(*adapters.SimNode) - if !ok { - continue - } - services[node.ID()] = simNode.Service(name) - } - return services -} diff --git a/swarm/network/simulation/service_test.go b/swarm/network/simulation/service_test.go deleted file mode 100644 index 23b0d86f243f..000000000000 --- a/swarm/network/simulation/service_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "testing" -) - -func TestService(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - _, ok := sim.Service("noop", id).(*noopService) - if !ok { - t.Fatalf("service is not of %T type", &noopService{}) - } - - _, ok = sim.RandomService("noop").(*noopService) - if !ok { - t.Fatalf("service is not of %T type", &noopService{}) - } - - _, ok = sim.Services("noop")[id].(*noopService) - if !ok { - t.Fatalf("service is not of %T type", &noopService{}) - } -} diff --git a/swarm/network/simulation/simulation.go b/swarm/network/simulation/simulation.go deleted file mode 100644 index f6d3ce229087..000000000000 --- a/swarm/network/simulation/simulation.go +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "context" - "errors" - "net/http" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" -) - -// Common errors that are returned by functions in this package. -var ( - ErrNodeNotFound = errors.New("node not found") - ErrNoPivotNode = errors.New("no pivot node set") -) - -// Simulation provides methods on network, nodes and services -// to manage them. -type Simulation struct { - // Net is exposed as a way to access lower level functionalities - // of p2p/simulations.Network. - Net *simulations.Network - - serviceNames []string - cleanupFuncs []func() - buckets map[enode.ID]*sync.Map - pivotNodeID *enode.ID - shutdownWG sync.WaitGroup - done chan struct{} - mu sync.RWMutex - - httpSrv *http.Server //attach a HTTP server via SimulationOptions - handler *simulations.Server //HTTP handler for the server - runC chan struct{} //channel where frontend signals it is ready -} - -// ServiceFunc is used in New to declare new service constructor. -// The first argument provides ServiceContext from the adapters package -// giving for example the access to NodeID. Second argument is the sync.Map -// where all "global" state related to the service should be kept. -// All cleanups needed for constructed service and any other constructed -// objects should ne provided in a single returned cleanup function. -// Returned cleanup function will be called by Close function -// after network shutdown. -type ServiceFunc func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) - -// New creates a new Simulation instance with new -// simulations.Network initialized with provided services. -func New(services map[string]ServiceFunc) (s *Simulation) { - s = &Simulation{ - buckets: make(map[enode.ID]*sync.Map), - done: make(chan struct{}), - } - - adapterServices := make(map[string]adapters.ServiceFunc, len(services)) - for name, serviceFunc := range services { - s.serviceNames = append(s.serviceNames, name) - adapterServices[name] = func(ctx *adapters.ServiceContext) (node.Service, error) { - b := new(sync.Map) - service, cleanup, err := serviceFunc(ctx, b) - if err != nil { - return nil, err - } - s.mu.Lock() - defer s.mu.Unlock() - if cleanup != nil { - s.cleanupFuncs = append(s.cleanupFuncs, cleanup) - } - s.buckets[ctx.Config.ID] = b - return service, nil - } - } - - s.Net = simulations.NewNetwork( - adapters.NewTCPAdapter(adapterServices), - &simulations.NetworkConfig{ID: "0"}, - ) - - return s -} - -// RunFunc is the function that will be called -// on Simulation.Run method call. -type RunFunc func(context.Context, *Simulation) error - -// Result is the returned value of Simulation.Run method. -type Result struct { - Duration time.Duration - Error error -} - -// Run calls the RunFunc function while taking care of -// cancellation provided through the Context. -func (s *Simulation) Run(ctx context.Context, f RunFunc) (r Result) { - //if the option is set to run a HTTP server with the simulation, - //init the server and start it - start := time.Now() - if s.httpSrv != nil { - log.Info("Waiting for frontend to be ready...(send POST /runsim to HTTP server)") - //wait for the frontend to connect - select { - case <-s.runC: - case <-ctx.Done(): - return Result{ - Duration: time.Since(start), - Error: ctx.Err(), - } - } - log.Info("Received signal from frontend - starting simulation run.") - } - errc := make(chan error) - quit := make(chan struct{}) - defer close(quit) - go func() { - select { - case errc <- f(ctx, s): - case <-quit: - } - }() - var err error - select { - case <-ctx.Done(): - err = ctx.Err() - case err = <-errc: - } - return Result{ - Duration: time.Since(start), - Error: err, - } -} - -// Maximal number of parallel calls to cleanup functions on -// Simulation.Close. -var maxParallelCleanups = 10 - -// Close calls all cleanup functions that are returned by -// ServiceFunc, waits for all of them to finish and other -// functions that explicitly block shutdownWG -// (like Simulation.PeerEvents) and shuts down the network -// at the end. It is used to clean all resources from the -// simulation. -func (s *Simulation) Close() { - close(s.done) - - sem := make(chan struct{}, maxParallelCleanups) - s.mu.RLock() - cleanupFuncs := make([]func(), len(s.cleanupFuncs)) - for i, f := range s.cleanupFuncs { - if f != nil { - cleanupFuncs[i] = f - } - } - s.mu.RUnlock() - var cleanupWG sync.WaitGroup - for _, cleanup := range cleanupFuncs { - cleanupWG.Add(1) - sem <- struct{}{} - go func(cleanup func()) { - defer cleanupWG.Done() - defer func() { <-sem }() - - cleanup() - }(cleanup) - } - cleanupWG.Wait() - - if s.httpSrv != nil { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) - defer cancel() - err := s.httpSrv.Shutdown(ctx) - if err != nil { - log.Error("Error shutting down HTTP server!", "err", err) - } - close(s.runC) - } - - s.shutdownWG.Wait() - s.Net.Shutdown() -} - -// Done returns a channel that is closed when the simulation -// is closed by Close method. It is useful for signaling termination -// of all possible goroutines that are created within the test. -func (s *Simulation) Done() <-chan struct{} { - return s.done -} diff --git a/swarm/network/simulation/simulation_test.go b/swarm/network/simulation/simulation_test.go deleted file mode 100644 index eed09bf508d5..000000000000 --- a/swarm/network/simulation/simulation_test.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package simulation - -import ( - "context" - "errors" - "flag" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/rpc" - colorable "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") -) - -func init() { - flag.Parse() - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -// TestRun tests if Run method calls RunFunc and if it handles context properly. -func TestRun(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - t.Run("call", func(t *testing.T) { - expect := "something" - var got string - r := sim.Run(context.Background(), func(ctx context.Context, sim *Simulation) error { - got = expect - return nil - }) - - if r.Error != nil { - t.Errorf("unexpected error: %v", r.Error) - } - if got != expect { - t.Errorf("expected %q, got %q", expect, got) - } - }) - - t.Run("cancellation", func(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) - defer cancel() - - r := sim.Run(ctx, func(ctx context.Context, sim *Simulation) error { - time.Sleep(time.Second) - return nil - }) - - if r.Error != context.DeadlineExceeded { - t.Errorf("unexpected error: %v", r.Error) - } - }) - - t.Run("context value and duration", func(t *testing.T) { - ctx := context.WithValue(context.Background(), "hey", "there") - sleep := 50 * time.Millisecond - - r := sim.Run(ctx, func(ctx context.Context, sim *Simulation) error { - if ctx.Value("hey") != "there" { - return errors.New("expected context value not passed") - } - time.Sleep(sleep) - return nil - }) - - if r.Error != nil { - t.Errorf("unexpected error: %v", r.Error) - } - if r.Duration < sleep { - t.Errorf("reported run duration less then expected: %s", r.Duration) - } - }) -} - -// TestClose tests are Close method triggers all close functions and are all nodes not up anymore. -func TestClose(t *testing.T) { - var mu sync.Mutex - var cleanupCount int - - sleep := 50 * time.Millisecond - - sim := New(map[string]ServiceFunc{ - "noop": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - return newNoopService(), func() { - time.Sleep(sleep) - mu.Lock() - defer mu.Unlock() - cleanupCount++ - }, nil - }, - }) - - nodeCount := 30 - - _, err := sim.AddNodes(nodeCount) - if err != nil { - t.Fatal(err) - } - - var upNodeCount int - for _, n := range sim.Net.GetNodes() { - if n.Up { - upNodeCount++ - } - } - if upNodeCount != nodeCount { - t.Errorf("all nodes should be up, insted only %v are up", upNodeCount) - } - - sim.Close() - - if cleanupCount != nodeCount { - t.Errorf("number of cleanups expected %v, got %v", nodeCount, cleanupCount) - } - - upNodeCount = 0 - for _, n := range sim.Net.GetNodes() { - if n.Up { - upNodeCount++ - } - } - if upNodeCount != 0 { - t.Errorf("all nodes should be down, insted %v are up", upNodeCount) - } -} - -// TestDone checks if Close method triggers the closing of done channel. -func TestDone(t *testing.T) { - sim := New(noopServiceFuncMap) - sleep := 50 * time.Millisecond - timeout := 2 * time.Second - - start := time.Now() - go func() { - time.Sleep(sleep) - sim.Close() - }() - - select { - case <-time.After(timeout): - t.Error("done channel closing timed out") - case <-sim.Done(): - if d := time.Since(start); d < sleep { - t.Errorf("done channel closed sooner then expected: %s", d) - } - } -} - -// a helper map for usual services that do not do anything -var noopServiceFuncMap = map[string]ServiceFunc{ - "noop": noopServiceFunc, -} - -// a helper function for most basic noop service -func noopServiceFunc(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - return newNoopService(), nil, nil -} - -// noopService is the service that does not do anything -// but implements node.Service interface. -type noopService struct{} - -func newNoopService() node.Service { - return &noopService{} -} - -func (t *noopService) Protocols() []p2p.Protocol { - return []p2p.Protocol{} -} - -func (t *noopService) APIs() []rpc.API { - return []rpc.API{} -} - -func (t *noopService) Start(server *p2p.Server) error { - return nil -} - -func (t *noopService) Stop() error { - return nil -} diff --git a/swarm/network/simulations/discovery/discovery.go b/swarm/network/simulations/discovery/discovery.go deleted file mode 100644 index a6ff5fd45e67..000000000000 --- a/swarm/network/simulations/discovery/discovery.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package discovery diff --git a/swarm/network/simulations/discovery/discovery_test.go b/swarm/network/simulations/discovery/discovery_test.go deleted file mode 100644 index d11eabf95feb..000000000000 --- a/swarm/network/simulations/discovery/discovery_test.go +++ /dev/null @@ -1,582 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package discovery - -import ( - "context" - "encoding/json" - "errors" - "flag" - "fmt" - "io/ioutil" - "math/rand" - "os" - "path" - "strings" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/state" - colorable "github.com/mattn/go-colorable" -) - -// serviceName is used with the exec adapter so the exec'd binary knows which -// service to execute -const serviceName = "discovery" -const testMinProxBinSize = 2 -const discoveryPersistenceDatadir = "discovery_persistence_test_store" - -var discoveryPersistencePath = path.Join(os.TempDir(), discoveryPersistenceDatadir) -var discoveryEnabled = true -var persistenceEnabled = false - -var services = adapters.Services{ - serviceName: newService, -} - -func cleanDbStores() error { - entries, err := ioutil.ReadDir(os.TempDir()) - if err != nil { - return err - } - - for _, f := range entries { - if strings.HasPrefix(f.Name(), discoveryPersistenceDatadir) { - os.RemoveAll(path.Join(os.TempDir(), f.Name())) - } - } - return nil - -} - -func getDbStore(nodeID string) (*state.DBStore, error) { - if _, err := os.Stat(discoveryPersistencePath + "_" + nodeID); os.IsNotExist(err) { - log.Info(fmt.Sprintf("directory for nodeID %s does not exist. creating...", nodeID)) - ioutil.TempDir("", discoveryPersistencePath+"_"+nodeID) - } - log.Info(fmt.Sprintf("opening storage directory for nodeID %s", nodeID)) - store, err := state.NewDBStore(discoveryPersistencePath + "_" + nodeID) - if err != nil { - return nil, err - } - return store, nil -} - -var ( - nodeCount = flag.Int("nodes", 10, "number of nodes to create (default 10)") - initCount = flag.Int("conns", 1, "number of originally connected peers (default 1)") - snapshotFile = flag.String("snapshot", "", "create snapshot") - loglevel = flag.Int("loglevel", 3, "verbosity of logs") - rawlog = flag.Bool("rawlog", false, "remove terminal formatting from logs") -) - -func init() { - flag.Parse() - // register the discovery service which will run as a devp2p - // protocol when using the exec adapter - adapters.RegisterServices(services) - - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(!*rawlog)))) -} - -// Benchmarks to test the average time it takes for an N-node ring -// to full a healthy kademlia topology -func BenchmarkDiscovery_8_1(b *testing.B) { benchmarkDiscovery(b, 8, 1) } -func BenchmarkDiscovery_16_1(b *testing.B) { benchmarkDiscovery(b, 16, 1) } -func BenchmarkDiscovery_32_1(b *testing.B) { benchmarkDiscovery(b, 32, 1) } -func BenchmarkDiscovery_64_1(b *testing.B) { benchmarkDiscovery(b, 64, 1) } -func BenchmarkDiscovery_128_1(b *testing.B) { benchmarkDiscovery(b, 128, 1) } -func BenchmarkDiscovery_256_1(b *testing.B) { benchmarkDiscovery(b, 256, 1) } - -func BenchmarkDiscovery_8_2(b *testing.B) { benchmarkDiscovery(b, 8, 2) } -func BenchmarkDiscovery_16_2(b *testing.B) { benchmarkDiscovery(b, 16, 2) } -func BenchmarkDiscovery_32_2(b *testing.B) { benchmarkDiscovery(b, 32, 2) } -func BenchmarkDiscovery_64_2(b *testing.B) { benchmarkDiscovery(b, 64, 2) } -func BenchmarkDiscovery_128_2(b *testing.B) { benchmarkDiscovery(b, 128, 2) } -func BenchmarkDiscovery_256_2(b *testing.B) { benchmarkDiscovery(b, 256, 2) } - -func BenchmarkDiscovery_8_4(b *testing.B) { benchmarkDiscovery(b, 8, 4) } -func BenchmarkDiscovery_16_4(b *testing.B) { benchmarkDiscovery(b, 16, 4) } -func BenchmarkDiscovery_32_4(b *testing.B) { benchmarkDiscovery(b, 32, 4) } -func BenchmarkDiscovery_64_4(b *testing.B) { benchmarkDiscovery(b, 64, 4) } -func BenchmarkDiscovery_128_4(b *testing.B) { benchmarkDiscovery(b, 128, 4) } -func BenchmarkDiscovery_256_4(b *testing.B) { benchmarkDiscovery(b, 256, 4) } - -func TestDiscoverySimulationDockerAdapter(t *testing.T) { - testDiscoverySimulationDockerAdapter(t, *nodeCount, *initCount) -} - -func testDiscoverySimulationDockerAdapter(t *testing.T, nodes, conns int) { - adapter, err := adapters.NewDockerAdapter() - if err != nil { - if err == adapters.ErrLinuxOnly { - t.Skip(err) - } else { - t.Fatal(err) - } - } - testDiscoverySimulation(t, nodes, conns, adapter) -} - -func TestDiscoverySimulationExecAdapter(t *testing.T) { - testDiscoverySimulationExecAdapter(t, *nodeCount, *initCount) -} - -func testDiscoverySimulationExecAdapter(t *testing.T, nodes, conns int) { - baseDir, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(baseDir) - testDiscoverySimulation(t, nodes, conns, adapters.NewExecAdapter(baseDir)) -} - -func TestDiscoverySimulationSimAdapter(t *testing.T) { - testDiscoverySimulationSimAdapter(t, *nodeCount, *initCount) -} - -func TestDiscoveryPersistenceSimulationSimAdapter(t *testing.T) { - testDiscoveryPersistenceSimulationSimAdapter(t, *nodeCount, *initCount) -} - -func testDiscoveryPersistenceSimulationSimAdapter(t *testing.T, nodes, conns int) { - testDiscoveryPersistenceSimulation(t, nodes, conns, adapters.NewSimAdapter(services)) -} - -func testDiscoverySimulationSimAdapter(t *testing.T, nodes, conns int) { - testDiscoverySimulation(t, nodes, conns, adapters.NewSimAdapter(services)) -} - -func testDiscoverySimulation(t *testing.T, nodes, conns int, adapter adapters.NodeAdapter) { - startedAt := time.Now() - result, err := discoverySimulation(nodes, conns, adapter) - if err != nil { - t.Fatalf("Setting up simulation failed: %v", err) - } - if result.Error != nil { - t.Fatalf("Simulation failed: %s", result.Error) - } - t.Logf("Simulation with %d nodes passed in %s", nodes, result.FinishedAt.Sub(result.StartedAt)) - var min, max time.Duration - var sum int - for _, pass := range result.Passes { - duration := pass.Sub(result.StartedAt) - if sum == 0 || duration < min { - min = duration - } - if duration > max { - max = duration - } - sum += int(duration.Nanoseconds()) - } - t.Logf("Min: %s, Max: %s, Average: %s", min, max, time.Duration(sum/len(result.Passes))*time.Nanosecond) - finishedAt := time.Now() - t.Logf("Setup: %s, shutdown: %s", result.StartedAt.Sub(startedAt), finishedAt.Sub(result.FinishedAt)) -} - -func testDiscoveryPersistenceSimulation(t *testing.T, nodes, conns int, adapter adapters.NodeAdapter) map[int][]byte { - persistenceEnabled = true - discoveryEnabled = true - - result, err := discoveryPersistenceSimulation(nodes, conns, adapter) - - if err != nil { - t.Fatalf("Setting up simulation failed: %v", err) - } - if result.Error != nil { - t.Fatalf("Simulation failed: %s", result.Error) - } - t.Logf("Simulation with %d nodes passed in %s", nodes, result.FinishedAt.Sub(result.StartedAt)) - // set the discovery and persistence flags again to default so other - // tests will not be affected - discoveryEnabled = true - persistenceEnabled = false - return nil -} - -func benchmarkDiscovery(b *testing.B, nodes, conns int) { - for i := 0; i < b.N; i++ { - result, err := discoverySimulation(nodes, conns, adapters.NewSimAdapter(services)) - if err != nil { - b.Fatalf("setting up simulation failed: %v", err) - } - if result.Error != nil { - b.Logf("simulation failed: %s", result.Error) - } - } -} - -func discoverySimulation(nodes, conns int, adapter adapters.NodeAdapter) (*simulations.StepResult, error) { - // create network - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: serviceName, - }) - defer net.Shutdown() - trigger := make(chan enode.ID) - ids := make([]enode.ID, nodes) - for i := 0; i < nodes; i++ { - conf := adapters.RandomNodeConfig() - node, err := net.NewNodeWithConfig(conf) - if err != nil { - return nil, fmt.Errorf("error starting node: %s", err) - } - if err := net.Start(node.ID()); err != nil { - return nil, fmt.Errorf("error starting node %s: %s", node.ID().TerminalString(), err) - } - if err := triggerChecks(trigger, net, node.ID()); err != nil { - return nil, fmt.Errorf("error triggering checks for node %s: %s", node.ID().TerminalString(), err) - } - ids[i] = node.ID() - } - - // run a simulation which connects the 10 nodes in a ring and waits - // for full peer discovery - var addrs [][]byte - action := func(ctx context.Context) error { - return nil - } - wg := sync.WaitGroup{} - for i := range ids { - // collect the overlay addresses, to - addrs = append(addrs, ids[i].Bytes()) - for j := 0; j < conns; j++ { - var k int - if j == 0 { - k = (i + 1) % len(ids) - } else { - k = rand.Intn(len(ids)) - } - wg.Add(1) - go func(i, k int) { - defer wg.Done() - net.Connect(ids[i], ids[k]) - }(i, k) - } - } - wg.Wait() - log.Debug(fmt.Sprintf("nodes: %v", len(addrs))) - // construct the peer pot, so that kademlia health can be checked - ppmap := network.NewPeerPotMap(testMinProxBinSize, addrs) - check := func(ctx context.Context, id enode.ID) (bool, error) { - select { - case <-ctx.Done(): - return false, ctx.Err() - default: - } - - node := net.GetNode(id) - if node == nil { - return false, fmt.Errorf("unknown node: %s", id) - } - client, err := node.Client() - if err != nil { - return false, fmt.Errorf("error getting node client: %s", err) - } - healthy := &network.Health{} - if err := client.Call(&healthy, "hive_healthy", ppmap[id.String()]); err != nil { - return false, fmt.Errorf("error getting node health: %s", err) - } - log.Debug(fmt.Sprintf("node %4s healthy: got nearest neighbours: %v, know nearest neighbours: %v, saturated: %v\n%v", id, healthy.GotNN, healthy.KnowNN, healthy.Full, healthy.Hive)) - return healthy.KnowNN && healthy.GotNN && healthy.Full, nil - } - - // 64 nodes ~ 1min - // 128 nodes ~ - timeout := 300 * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - result := simulations.NewSimulation(net).Run(ctx, &simulations.Step{ - Action: action, - Trigger: trigger, - Expect: &simulations.Expectation{ - Nodes: ids, - Check: check, - }, - }) - if result.Error != nil { - return result, nil - } - - if *snapshotFile != "" { - snap, err := net.Snapshot() - if err != nil { - return nil, errors.New("no shapshot dude") - } - jsonsnapshot, err := json.Marshal(snap) - if err != nil { - return nil, fmt.Errorf("corrupt json snapshot: %v", err) - } - log.Info("writing snapshot", "file", *snapshotFile) - err = ioutil.WriteFile(*snapshotFile, jsonsnapshot, 0755) - if err != nil { - return nil, err - } - } - return result, nil -} - -func discoveryPersistenceSimulation(nodes, conns int, adapter adapters.NodeAdapter) (*simulations.StepResult, error) { - cleanDbStores() - defer cleanDbStores() - - // create network - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: serviceName, - }) - defer net.Shutdown() - trigger := make(chan enode.ID) - ids := make([]enode.ID, nodes) - var addrs [][]byte - - for i := 0; i < nodes; i++ { - conf := adapters.RandomNodeConfig() - node, err := net.NewNodeWithConfig(conf) - if err != nil { - panic(err) - } - if err != nil { - return nil, fmt.Errorf("error starting node: %s", err) - } - if err := net.Start(node.ID()); err != nil { - return nil, fmt.Errorf("error starting node %s: %s", node.ID().TerminalString(), err) - } - if err := triggerChecks(trigger, net, node.ID()); err != nil { - return nil, fmt.Errorf("error triggering checks for node %s: %s", node.ID().TerminalString(), err) - } - ids[i] = node.ID() - a := ids[i].Bytes() - - addrs = append(addrs, a) - } - - // run a simulation which connects the 10 nodes in a ring and waits - // for full peer discovery - ppmap := network.NewPeerPotMap(testMinProxBinSize, addrs) - - var restartTime time.Time - - action := func(ctx context.Context) error { - ticker := time.NewTicker(500 * time.Millisecond) - - for range ticker.C { - isHealthy := true - for _, id := range ids { - //call Healthy RPC - node := net.GetNode(id) - if node == nil { - return fmt.Errorf("unknown node: %s", id) - } - client, err := node.Client() - if err != nil { - return fmt.Errorf("error getting node client: %s", err) - } - healthy := &network.Health{} - addr := id.String() - if err := client.Call(&healthy, "hive_healthy", ppmap[addr]); err != nil { - return fmt.Errorf("error getting node health: %s", err) - } - - log.Info(fmt.Sprintf("NODE: %s, IS HEALTHY: %t", addr, healthy.GotNN && healthy.KnowNN && healthy.Full)) - if !healthy.GotNN || !healthy.Full { - isHealthy = false - break - } - } - if isHealthy { - break - } - } - ticker.Stop() - - log.Info("reached healthy kademlia. starting to shutdown nodes.") - shutdownStarted := time.Now() - // stop all ids, then start them again - for _, id := range ids { - node := net.GetNode(id) - - if err := net.Stop(node.ID()); err != nil { - return fmt.Errorf("error stopping node %s: %s", node.ID().TerminalString(), err) - } - } - log.Info(fmt.Sprintf("shutting down nodes took: %s", time.Since(shutdownStarted))) - persistenceEnabled = true - discoveryEnabled = false - restartTime = time.Now() - for _, id := range ids { - node := net.GetNode(id) - if err := net.Start(node.ID()); err != nil { - return fmt.Errorf("error starting node %s: %s", node.ID().TerminalString(), err) - } - if err := triggerChecks(trigger, net, node.ID()); err != nil { - return fmt.Errorf("error triggering checks for node %s: %s", node.ID().TerminalString(), err) - } - } - - log.Info(fmt.Sprintf("restarting nodes took: %s", time.Since(restartTime))) - - return nil - } - //connects in a chain - wg := sync.WaitGroup{} - //connects in a ring - for i := range ids { - for j := 1; j <= conns; j++ { - k := (i + j) % len(ids) - if k == i { - k = (k + 1) % len(ids) - } - wg.Add(1) - go func(i, k int) { - defer wg.Done() - net.Connect(ids[i], ids[k]) - }(i, k) - } - } - wg.Wait() - log.Debug(fmt.Sprintf("nodes: %v", len(addrs))) - // construct the peer pot, so that kademlia health can be checked - check := func(ctx context.Context, id enode.ID) (bool, error) { - select { - case <-ctx.Done(): - return false, ctx.Err() - default: - } - - node := net.GetNode(id) - if node == nil { - return false, fmt.Errorf("unknown node: %s", id) - } - client, err := node.Client() - if err != nil { - return false, fmt.Errorf("error getting node client: %s", err) - } - healthy := &network.Health{} - if err := client.Call(&healthy, "hive_healthy", ppmap[id.String()]); err != nil { - return false, fmt.Errorf("error getting node health: %s", err) - } - log.Info(fmt.Sprintf("node %4s healthy: got nearest neighbours: %v, know nearest neighbours: %v, saturated: %v", id, healthy.GotNN, healthy.KnowNN, healthy.Full)) - - return healthy.KnowNN && healthy.GotNN && healthy.Full, nil - } - - // 64 nodes ~ 1min - // 128 nodes ~ - timeout := 300 * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - result := simulations.NewSimulation(net).Run(ctx, &simulations.Step{ - Action: action, - Trigger: trigger, - Expect: &simulations.Expectation{ - Nodes: ids, - Check: check, - }, - }) - if result.Error != nil { - return result, nil - } - - return result, nil -} - -// triggerChecks triggers a simulation step check whenever a peer is added or -// removed from the given node, and also every second to avoid a race between -// peer events and kademlia becoming healthy -func triggerChecks(trigger chan enode.ID, net *simulations.Network, id enode.ID) error { - node := net.GetNode(id) - if node == nil { - return fmt.Errorf("unknown node: %s", id) - } - client, err := node.Client() - if err != nil { - return err - } - events := make(chan *p2p.PeerEvent) - sub, err := client.Subscribe(context.Background(), "admin", events, "peerEvents") - if err != nil { - return fmt.Errorf("error getting peer events for node %v: %s", id, err) - } - go func() { - defer sub.Unsubscribe() - - tick := time.NewTicker(time.Second) - defer tick.Stop() - - for { - select { - case <-events: - trigger <- id - case <-tick.C: - trigger <- id - case err := <-sub.Err(): - if err != nil { - log.Error(fmt.Sprintf("error getting peer events for node %v", id), "err", err) - } - return - } - } - }() - return nil -} - -func newService(ctx *adapters.ServiceContext) (node.Service, error) { - node := enode.NewV4(&ctx.Config.PrivateKey.PublicKey, adapters.ExternalIP(), int(ctx.Config.Port), int(ctx.Config.Port)) - addr := network.NewAddr(node) - - kp := network.NewKadParams() - kp.MinProxBinSize = testMinProxBinSize - - if ctx.Config.Reachable != nil { - kp.Reachable = func(o *network.BzzAddr) bool { - return ctx.Config.Reachable(o.ID()) - } - } - kad := network.NewKademlia(addr.Over(), kp) - hp := network.NewHiveParams() - hp.KeepAliveInterval = time.Duration(200) * time.Millisecond - hp.Discovery = discoveryEnabled - - log.Info(fmt.Sprintf("discovery for nodeID %s is %t", ctx.Config.ID.String(), hp.Discovery)) - - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - - if persistenceEnabled { - log.Info(fmt.Sprintf("persistence enabled for nodeID %s", ctx.Config.ID.String())) - store, err := getDbStore(ctx.Config.ID.String()) - if err != nil { - return nil, err - } - return network.NewBzz(config, kad, store, nil, nil), nil - } - - return network.NewBzz(config, kad, nil, nil, nil), nil -} diff --git a/swarm/network/simulations/discovery/snapshot.json b/swarm/network/simulations/discovery/snapshot.json deleted file mode 100755 index f7f400eb67a2..000000000000 --- a/swarm/network/simulations/discovery/snapshot.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}}],"conns":[{"one":"c04a0c47cb0c522ecf28d8841e93721e73f58790b30e92382816a4b453be2988","other":"d9283e5247a18d6564b3581217e9f4d9c93a4359944894c00bb2b22c690faadc","up":true},{"one":"dd99c11abe2abae112d64d902b96fe0c75243ea67eca759a2769058a30cc0e77","other":"c04a0c47cb0c522ecf28d8841e93721e73f58790b30e92382816a4b453be2988","up":true},{"one":"4f5dad2aa4f26ac5a23d4fbcc807296b474eab77761db6594debd60ef4287aed","other":"dd99c11abe2abae112d64d902b96fe0c75243ea67eca759a2769058a30cc0e77","up":true},{"one":"4f47f4e176d1c9f78d9a7e19723689ffe2a0603004a3d4506a2349e55a56fc17","other":"4f5dad2aa4f26ac5a23d4fbcc807296b474eab77761db6594debd60ef4287aed","up":true},{"one":"20b6a1be2cb8f966151682350e029d4f8da8ee92de10a2a1cb1727d110acebfa","other":"4f47f4e176d1c9f78d9a7e19723689ffe2a0603004a3d4506a2349e55a56fc17","up":true},{"one":"50cb92e77710582fa9cbee7a54cf25c95fd27d8d54b13ba5520a50139c309a22","other":"20b6a1be2cb8f966151682350e029d4f8da8ee92de10a2a1cb1727d110acebfa","up":true},{"one":"319dc901f99940f1339c540bc36fbabb10a96d326b13b9d7f53e7496980e2996","other":"50cb92e77710582fa9cbee7a54cf25c95fd27d8d54b13ba5520a50139c309a22","up":true},{"one":"dc285b6436a8bfd4d2e586d478b18d3fe7b705ce0b4fb27a651adcf6d27984f1","other":"319dc901f99940f1339c540bc36fbabb10a96d326b13b9d7f53e7496980e2996","up":true},{"one":"974dbe511377280f945a53a194b4bb397875b10b1ecb119a92425bbb16db68f1","other":"dc285b6436a8bfd4d2e586d478b18d3fe7b705ce0b4fb27a651adcf6d27984f1","up":true},{"one":"d9283e5247a18d6564b3581217e9f4d9c93a4359944894c00bb2b22c690faadc","other":"974dbe511377280f945a53a194b4bb397875b10b1ecb119a92425bbb16db68f1","up":true}]} \ No newline at end of file diff --git a/swarm/network/simulations/overlay.go b/swarm/network/simulations/overlay.go deleted file mode 100644 index caf7ff1f2d1f..000000000000 --- a/swarm/network/simulations/overlay.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// You can run this simulation using -// -// go run ./swarm/network/simulations/overlay.go -package main - -import ( - "flag" - "fmt" - "net/http" - "runtime" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/state" - colorable "github.com/mattn/go-colorable" -) - -var ( - noDiscovery = flag.Bool("no-discovery", false, "disable discovery (useful if you want to load a snapshot)") - vmodule = flag.String("vmodule", "", "log filters for logger via Vmodule") - verbosity = flag.Int("verbosity", 0, "log filters for logger via Vmodule") - httpSimPort = 8888 -) - -func init() { - flag.Parse() - //initialize the logger - //this is a demonstration on how to use Vmodule for filtering logs - //provide -vmodule as param, and comma-separated values, e.g.: - //-vmodule overlay_test.go=4,simulations=3 - //above examples sets overlay_test.go logs to level 4, while packages ending with "simulations" to 3 - if *vmodule != "" { - //only enable the pattern matching handler if the flag has been provided - glogger := log.NewGlogHandler(log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true))) - if *verbosity > 0 { - glogger.Verbosity(log.Lvl(*verbosity)) - } - glogger.Vmodule(*vmodule) - log.Root().SetHandler(glogger) - } -} - -type Simulation struct { - mtx sync.Mutex - stores map[enode.ID]*state.InmemoryStore -} - -func NewSimulation() *Simulation { - return &Simulation{ - stores: make(map[enode.ID]*state.InmemoryStore), - } -} - -func (s *Simulation) NewService(ctx *adapters.ServiceContext) (node.Service, error) { - node := ctx.Config.Node() - s.mtx.Lock() - store, ok := s.stores[node.ID()] - if !ok { - store = state.NewInmemoryStore() - s.stores[node.ID()] = store - } - s.mtx.Unlock() - - addr := network.NewAddr(node) - - kp := network.NewKadParams() - kp.MinProxBinSize = 2 - kp.MaxBinSize = 4 - kp.MinBinSize = 1 - kp.MaxRetries = 1000 - kp.RetryExponent = 2 - kp.RetryInterval = 1000000 - kad := network.NewKademlia(addr.Over(), kp) - hp := network.NewHiveParams() - hp.Discovery = !*noDiscovery - hp.KeepAliveInterval = 300 * time.Millisecond - - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - - return network.NewBzz(config, kad, store, nil, nil), nil -} - -//create the simulation network -func newSimulationNetwork() *simulations.Network { - - s := NewSimulation() - services := adapters.Services{ - "overlay": s.NewService, - } - adapter := adapters.NewSimAdapter(services) - simNetwork := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - DefaultService: "overlay", - }) - return simNetwork -} - -//return a new http server -func newOverlaySim(sim *simulations.Network) *simulations.Server { - return simulations.NewServer(sim) -} - -// var server -func main() { - //cpu optimization - runtime.GOMAXPROCS(runtime.NumCPU()) - //run the sim - runOverlaySim() -} - -func runOverlaySim() { - //create the simulation network - net := newSimulationNetwork() - //create a http server with it - sim := newOverlaySim(net) - log.Info(fmt.Sprintf("starting simulation server on 0.0.0.0:%d...", httpSimPort)) - //start the HTTP server - http.ListenAndServe(fmt.Sprintf(":%d", httpSimPort), sim) -} diff --git a/swarm/network/simulations/overlay_test.go b/swarm/network/simulations/overlay_test.go deleted file mode 100644 index 6ccdb5ce2589..000000000000 --- a/swarm/network/simulations/overlay_test.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package main - -import ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "testing" - "time" - - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/swarm/log" -) - -var ( - nodeCount = 16 -) - -//This test is used to test the overlay simulation. -//As the simulation is executed via a main, it is easily missed on changes -//An automated test will prevent that -//The test just connects to the simulations, starts the network, -//starts the mocker, gets the number of nodes, and stops it again. -//It also provides a documentation on the steps needed by frontends -//to use the simulations -func TestOverlaySim(t *testing.T) { - t.Skip("Test is flaky, see: https://github.com/ethersphere/go-ethereum/issues/592") - //start the simulation - log.Info("Start simulation backend") - //get the simulation networ; needed to subscribe for up events - net := newSimulationNetwork() - //create the overlay simulation - sim := newOverlaySim(net) - //create a http test server with it - srv := httptest.NewServer(sim) - defer srv.Close() - - log.Debug("Http simulation server started. Start simulation network") - //start the simulation network (initialization of simulation) - resp, err := http.Post(srv.URL+"/start", "application/json", nil) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("Expected Status Code %d, got %d", http.StatusOK, resp.StatusCode) - } - - log.Debug("Start mocker") - //start the mocker, needs a node count and an ID - resp, err = http.PostForm(srv.URL+"/mocker/start", - url.Values{ - "node-count": {fmt.Sprintf("%d", nodeCount)}, - "mocker-type": {simulations.GetMockerList()[0]}, - }) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - reason, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - t.Fatalf("Expected Status Code %d, got %d, response body %s", http.StatusOK, resp.StatusCode, string(reason)) - } - - //variables needed to wait for nodes being up - var upCount int - trigger := make(chan enode.ID) - - //wait for all nodes to be up - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - //start watching node up events... - go watchSimEvents(net, ctx, trigger) - - //...and wait until all expected up events (nodeCount) have been received -LOOP: - for { - select { - case <-trigger: - //new node up event received, increase counter - upCount++ - //all expected node up events received - if upCount == nodeCount { - break LOOP - } - case <-ctx.Done(): - t.Fatalf("Timed out waiting for up events") - } - - } - - //at this point we can query the server - log.Info("Get number of nodes") - //get the number of nodes - resp, err = http.Get(srv.URL + "/nodes") - if err != nil { - t.Fatal(err) - } - - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - //unmarshal number of nodes from JSON response - var nodesArr []simulations.Node - err = json.Unmarshal(b, &nodesArr) - if err != nil { - t.Fatal(err) - } - - //check if number of nodes received is same as sent - if len(nodesArr) != nodeCount { - t.Fatal(fmt.Errorf("Expected %d number of nodes, got %d", nodeCount, len(nodesArr))) - } - - //need to let it run for a little while, otherwise stopping it immediately can crash due running nodes - //wanting to connect to already stopped nodes - time.Sleep(1 * time.Second) - - log.Info("Stop the network") - //stop the network - resp, err = http.Post(srv.URL+"/stop", "application/json", nil) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - - log.Info("Reset the network") - //reset the network (removes all nodes and connections) - resp, err = http.Post(srv.URL+"/reset", "application/json", nil) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } -} - -//watch for events so we know when all nodes are up -func watchSimEvents(net *simulations.Network, ctx context.Context, trigger chan enode.ID) { - events := make(chan *simulations.Event) - sub := net.Events().Subscribe(events) - defer sub.Unsubscribe() - - for { - select { - case ev := <-events: - //only catch node up events - if ev.Type == simulations.EventTypeNode { - if ev.Node.Up { - log.Debug("got node up event", "event", ev, "node", ev.Node.Config.ID) - select { - case trigger <- ev.Node.Config.ID: - case <-ctx.Done(): - return - } - } - } - case <-ctx.Done(): - return - } - } -} diff --git a/swarm/network/stream/common_test.go b/swarm/network/stream/common_test.go deleted file mode 100644 index 72fdb2bd96a3..000000000000 --- a/swarm/network/stream/common_test.go +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "context" - crand "crypto/rand" - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "math/rand" - "os" - "strings" - "sync/atomic" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/p2p/enode" - p2ptest "github.com/ethereum/go-ethereum/p2p/testing" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/simulation" - "github.com/ethereum/go-ethereum/swarm/pot" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" - mockdb "github.com/ethereum/go-ethereum/swarm/storage/mock/db" - colorable "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") - nodes = flag.Int("nodes", 0, "number of nodes") - chunks = flag.Int("chunks", 0, "number of chunks") - useMockStore = flag.Bool("mockstore", false, "disabled mock store (default: enabled)") - longrunning = flag.Bool("longrunning", false, "do run long-running tests") - - bucketKeyDB = simulation.BucketKey("db") - bucketKeyStore = simulation.BucketKey("store") - bucketKeyFileStore = simulation.BucketKey("filestore") - bucketKeyNetStore = simulation.BucketKey("netstore") - bucketKeyDelivery = simulation.BucketKey("delivery") - bucketKeyRegistry = simulation.BucketKey("registry") - - chunkSize = 4096 - pof = pot.DefaultPof(256) -) - -func init() { - flag.Parse() - rand.Seed(time.Now().UnixNano()) - - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -func createGlobalStore() (string, *mockdb.GlobalStore, error) { - var globalStore *mockdb.GlobalStore - globalStoreDir, err := ioutil.TempDir("", "global.store") - if err != nil { - log.Error("Error initiating global store temp directory!", "err", err) - return "", nil, err - } - globalStore, err = mockdb.NewGlobalStore(globalStoreDir) - if err != nil { - log.Error("Error initiating global store!", "err", err) - return "", nil, err - } - return globalStoreDir, globalStore, nil -} - -func newStreamerTester(t *testing.T, registryOptions *RegistryOptions) (*p2ptest.ProtocolTester, *Registry, *storage.LocalStore, func(), error) { - // setup - addr := network.RandomAddr() // tested peers peer address - to := network.NewKademlia(addr.OAddr, network.NewKadParams()) - - // temp datadir - datadir, err := ioutil.TempDir("", "streamer") - if err != nil { - return nil, nil, nil, func() {}, err - } - removeDataDir := func() { - os.RemoveAll(datadir) - } - - params := storage.NewDefaultLocalStoreParams() - params.Init(datadir) - params.BaseKey = addr.Over() - - localStore, err := storage.NewTestLocalStoreForAddr(params) - if err != nil { - return nil, nil, nil, removeDataDir, err - } - - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, nil, removeDataDir, err - } - - delivery := NewDelivery(to, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - streamer := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), registryOptions) - teardown := func() { - streamer.Close() - removeDataDir() - } - protocolTester := p2ptest.NewProtocolTester(t, addr.ID(), 1, streamer.runProtocol) - - err = waitForPeers(streamer, 1*time.Second, 1) - if err != nil { - return nil, nil, nil, nil, errors.New("timeout: peer is not created") - } - - return protocolTester, streamer, localStore, teardown, nil -} - -func waitForPeers(streamer *Registry, timeout time.Duration, expectedPeers int) error { - ticker := time.NewTicker(10 * time.Millisecond) - timeoutTimer := time.NewTimer(timeout) - for { - select { - case <-ticker.C: - if streamer.peersCount() >= expectedPeers { - return nil - } - case <-timeoutTimer.C: - return errors.New("timeout") - } - } -} - -type roundRobinStore struct { - index uint32 - stores []storage.ChunkStore -} - -func newRoundRobinStore(stores ...storage.ChunkStore) *roundRobinStore { - return &roundRobinStore{ - stores: stores, - } -} - -func (rrs *roundRobinStore) Get(ctx context.Context, addr storage.Address) (storage.Chunk, error) { - return nil, errors.New("get not well defined on round robin store") -} - -func (rrs *roundRobinStore) Put(ctx context.Context, chunk storage.Chunk) error { - i := atomic.AddUint32(&rrs.index, 1) - idx := int(i) % len(rrs.stores) - return rrs.stores[idx].Put(ctx, chunk) -} - -func (rrs *roundRobinStore) Close() { - for _, store := range rrs.stores { - store.Close() - } -} - -func readAll(fileStore *storage.FileStore, hash []byte) (int64, error) { - r, _ := fileStore.Retrieve(context.TODO(), hash) - buf := make([]byte, 1024) - var n int - var total int64 - var err error - for (total == 0 || n > 0) && err == nil { - n, err = r.ReadAt(buf, total) - total += int64(n) - } - if err != nil && err != io.EOF { - return total, err - } - return total, nil -} - -func uploadFilesToNodes(sim *simulation.Simulation) ([]storage.Address, []string, error) { - nodes := sim.UpNodeIDs() - nodeCnt := len(nodes) - log.Debug(fmt.Sprintf("Uploading %d files to nodes", nodeCnt)) - //array holding generated files - rfiles := make([]string, nodeCnt) - //array holding the root hashes of the files - rootAddrs := make([]storage.Address, nodeCnt) - - var err error - //for every node, generate a file and upload - for i, id := range nodes { - item, ok := sim.NodeItem(id, bucketKeyFileStore) - if !ok { - return nil, nil, fmt.Errorf("Error accessing localstore") - } - fileStore := item.(*storage.FileStore) - //generate a file - rfiles[i], err = generateRandomFile() - if err != nil { - return nil, nil, err - } - //store it (upload it) on the FileStore - ctx := context.TODO() - rk, wait, err := fileStore.Store(ctx, strings.NewReader(rfiles[i]), int64(len(rfiles[i])), false) - log.Debug("Uploaded random string file to node") - if err != nil { - return nil, nil, err - } - err = wait(ctx) - if err != nil { - return nil, nil, err - } - rootAddrs[i] = rk - } - return rootAddrs, rfiles, nil -} - -//generate a random file (string) -func generateRandomFile() (string, error) { - //generate a random file size between minFileSize and maxFileSize - fileSize := rand.Intn(maxFileSize-minFileSize) + minFileSize - log.Debug(fmt.Sprintf("Generated file with filesize %d kB", fileSize)) - b := make([]byte, fileSize*1024) - _, err := crand.Read(b) - if err != nil { - log.Error("Error generating random file.", "err", err) - return "", err - } - return string(b), nil -} - -//create a local store for the given node -func createTestLocalStorageForID(id enode.ID, addr *network.BzzAddr) (storage.ChunkStore, string, error) { - var datadir string - var err error - datadir, err = ioutil.TempDir("", fmt.Sprintf("syncer-test-%s", id.TerminalString())) - if err != nil { - return nil, "", err - } - var store storage.ChunkStore - params := storage.NewDefaultLocalStoreParams() - params.ChunkDbPath = datadir - params.BaseKey = addr.Over() - store, err = storage.NewTestLocalStoreForAddr(params) - if err != nil { - os.RemoveAll(datadir) - return nil, "", err - } - return store, datadir, nil -} diff --git a/swarm/network/stream/delivery.go b/swarm/network/stream/delivery.go deleted file mode 100644 index c2adb1009e58..000000000000 --- a/swarm/network/stream/delivery.go +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "context" - "errors" - - "fmt" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/ethereum/go-ethereum/swarm/storage" - opentracing "github.com/opentracing/opentracing-go" -) - -const ( - swarmChunkServerStreamName = "RETRIEVE_REQUEST" - deliveryCap = 32 -) - -var ( - processReceivedChunksCount = metrics.NewRegisteredCounter("network.stream.received_chunks.count", nil) - handleRetrieveRequestMsgCount = metrics.NewRegisteredCounter("network.stream.handle_retrieve_request_msg.count", nil) - - requestFromPeersCount = metrics.NewRegisteredCounter("network.stream.request_from_peers.count", nil) - requestFromPeersEachCount = metrics.NewRegisteredCounter("network.stream.request_from_peers_each.count", nil) -) - -type Delivery struct { - chunkStore storage.SyncChunkStore - kad *network.Kademlia - getPeer func(enode.ID) *Peer -} - -func NewDelivery(kad *network.Kademlia, chunkStore storage.SyncChunkStore) *Delivery { - return &Delivery{ - chunkStore: chunkStore, - kad: kad, - } -} - -// SwarmChunkServer implements Server -type SwarmChunkServer struct { - deliveryC chan []byte - batchC chan []byte - chunkStore storage.ChunkStore - currentLen uint64 - quit chan struct{} -} - -// NewSwarmChunkServer is SwarmChunkServer constructor -func NewSwarmChunkServer(chunkStore storage.ChunkStore) *SwarmChunkServer { - s := &SwarmChunkServer{ - deliveryC: make(chan []byte, deliveryCap), - batchC: make(chan []byte), - chunkStore: chunkStore, - quit: make(chan struct{}), - } - go s.processDeliveries() - return s -} - -// processDeliveries handles delivered chunk hashes -func (s *SwarmChunkServer) processDeliveries() { - var hashes []byte - var batchC chan []byte - for { - select { - case <-s.quit: - return - case hash := <-s.deliveryC: - hashes = append(hashes, hash...) - batchC = s.batchC - case batchC <- hashes: - hashes = nil - batchC = nil - } - } -} - -// SetNextBatch -func (s *SwarmChunkServer) SetNextBatch(_, _ uint64) (hashes []byte, from uint64, to uint64, proof *HandoverProof, err error) { - select { - case hashes = <-s.batchC: - case <-s.quit: - return - } - - from = s.currentLen - s.currentLen += uint64(len(hashes)) - to = s.currentLen - return -} - -// Close needs to be called on a stream server -func (s *SwarmChunkServer) Close() { - close(s.quit) -} - -// GetData retrives chunk data from db store -func (s *SwarmChunkServer) GetData(ctx context.Context, key []byte) ([]byte, error) { - chunk, err := s.chunkStore.Get(ctx, storage.Address(key)) - if err != nil { - return nil, err - } - return chunk.Data(), nil -} - -// RetrieveRequestMsg is the protocol msg for chunk retrieve requests -type RetrieveRequestMsg struct { - Addr storage.Address - SkipCheck bool - HopCount uint8 -} - -func (d *Delivery) handleRetrieveRequestMsg(ctx context.Context, sp *Peer, req *RetrieveRequestMsg) error { - log.Trace("received request", "peer", sp.ID(), "hash", req.Addr) - handleRetrieveRequestMsgCount.Inc(1) - - var osp opentracing.Span - ctx, osp = spancontext.StartSpan( - ctx, - "retrieve.request") - defer osp.Finish() - - s, err := sp.getServer(NewStream(swarmChunkServerStreamName, "", false)) - if err != nil { - return err - } - streamer := s.Server.(*SwarmChunkServer) - - var cancel func() - // TODO: do something with this hardcoded timeout, maybe use TTL in the future - ctx = context.WithValue(ctx, "peer", sp.ID().String()) - ctx = context.WithValue(ctx, "hopcount", req.HopCount) - ctx, cancel = context.WithTimeout(ctx, network.RequestTimeout) - - go func() { - select { - case <-ctx.Done(): - case <-streamer.quit: - } - cancel() - }() - - go func() { - chunk, err := d.chunkStore.Get(ctx, req.Addr) - if err != nil { - log.Warn("ChunkStore.Get can not retrieve chunk", "err", err) - return - } - if req.SkipCheck { - err = sp.Deliver(ctx, chunk, s.priority) - if err != nil { - log.Warn("ERROR in handleRetrieveRequestMsg", "err", err) - } - return - } - select { - case streamer.deliveryC <- chunk.Address()[:]: - case <-streamer.quit: - } - - }() - - return nil -} - -type ChunkDeliveryMsg struct { - Addr storage.Address - SData []byte // the stored chunk Data (incl size) - peer *Peer // set in handleChunkDeliveryMsg -} - -// TODO: Fix context SNAFU -func (d *Delivery) handleChunkDeliveryMsg(ctx context.Context, sp *Peer, req *ChunkDeliveryMsg) error { - var osp opentracing.Span - ctx, osp = spancontext.StartSpan( - ctx, - "chunk.delivery") - defer osp.Finish() - - processReceivedChunksCount.Inc(1) - - go func() { - req.peer = sp - err := d.chunkStore.Put(ctx, storage.NewChunk(req.Addr, req.SData)) - if err != nil { - if err == storage.ErrChunkInvalid { - // we removed this log because it spams the logs - // TODO: Enable this log line - // log.Warn("invalid chunk delivered", "peer", sp.ID(), "chunk", req.Addr, ) - req.peer.Drop(err) - } - } - }() - return nil -} - -// RequestFromPeers sends a chunk retrieve request to -func (d *Delivery) RequestFromPeers(ctx context.Context, req *network.Request) (*enode.ID, chan struct{}, error) { - requestFromPeersCount.Inc(1) - var sp *Peer - spID := req.Source - - if spID != nil { - sp = d.getPeer(*spID) - if sp == nil { - return nil, nil, fmt.Errorf("source peer %v not found", spID.String()) - } - } else { - d.kad.EachConn(req.Addr[:], 255, func(p *network.Peer, po int, nn bool) bool { - id := p.ID() - // TODO: skip light nodes that do not accept retrieve requests - if req.SkipPeer(id.String()) { - log.Trace("Delivery.RequestFromPeers: skip peer", "peer id", id) - return true - } - sp = d.getPeer(id) - if sp == nil { - log.Warn("Delivery.RequestFromPeers: peer not found", "id", id) - return true - } - spID = &id - return false - }) - if sp == nil { - return nil, nil, errors.New("no peer found") - } - } - - err := sp.SendPriority(ctx, &RetrieveRequestMsg{ - Addr: req.Addr, - SkipCheck: req.SkipCheck, - HopCount: req.HopCount, - }, Top) - if err != nil { - return nil, nil, err - } - requestFromPeersEachCount.Inc(1) - - return spID, sp.quit, nil -} diff --git a/swarm/network/stream/delivery_test.go b/swarm/network/stream/delivery_test.go deleted file mode 100644 index b021b877140c..000000000000 --- a/swarm/network/stream/delivery_test.go +++ /dev/null @@ -1,643 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "bytes" - "context" - crand "crypto/rand" - "fmt" - "io" - "os" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - p2ptest "github.com/ethereum/go-ethereum/p2p/testing" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/simulation" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -func TestStreamerRetrieveRequest(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - - ctx := context.Background() - req := network.NewRequest( - storage.Address(hash0[:]), - true, - &sync.Map{}, - ) - streamer.delivery.RequestFromPeers(ctx, req) - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "RetrieveRequestMsg", - Expects: []p2ptest.Expect{ - { - Code: 5, - Msg: &RetrieveRequestMsg{ - Addr: hash0[:], - SkipCheck: true, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } -} - -func TestStreamerUpstreamRetrieveRequestMsgExchangeWithoutStore(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - - chunk := storage.NewChunk(storage.Address(hash0[:]), nil) - - peer := streamer.getPeer(node.ID()) - - peer.handleSubscribeMsg(context.TODO(), &SubscribeMsg{ - Stream: NewStream(swarmChunkServerStreamName, "", false), - History: nil, - Priority: Top, - }) - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "RetrieveRequestMsg", - Triggers: []p2ptest.Trigger{ - { - Code: 5, - Msg: &RetrieveRequestMsg{ - Addr: chunk.Address()[:], - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: nil, - Hashes: nil, - From: 0, - To: 0, - }, - Peer: node.ID(), - }, - }, - }) - - expectedError := `exchange #0 "RetrieveRequestMsg": timed out` - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected error %v, got %v", expectedError, err) - } -} - -// upstream request server receives a retrieve Request and responds with -// offered hashes or delivery if skipHash is set to true -func TestStreamerUpstreamRetrieveRequestMsgExchange(t *testing.T) { - tester, streamer, localStore, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - peer := streamer.getPeer(node.ID()) - - stream := NewStream(swarmChunkServerStreamName, "", false) - - peer.handleSubscribeMsg(context.TODO(), &SubscribeMsg{ - Stream: stream, - History: nil, - Priority: Top, - }) - - hash := storage.Address(hash0[:]) - chunk := storage.NewChunk(hash, hash) - err = localStore.Put(context.TODO(), chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "RetrieveRequestMsg", - Triggers: []p2ptest.Trigger{ - { - Code: 5, - Msg: &RetrieveRequestMsg{ - Addr: hash, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: hash, - From: 0, - // TODO: why is this 32??? - To: 32, - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - hash = storage.Address(hash1[:]) - chunk = storage.NewChunk(hash, hash1[:]) - err = localStore.Put(context.TODO(), chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "RetrieveRequestMsg", - Triggers: []p2ptest.Trigger{ - { - Code: 5, - Msg: &RetrieveRequestMsg{ - Addr: hash, - SkipCheck: true, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 6, - Msg: &ChunkDeliveryMsg{ - Addr: hash, - SData: hash, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerDownstreamChunkDeliveryMsgExchange(t *testing.T) { - tester, streamer, localStore, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { - return &testClient{ - t: t, - }, nil - }) - - node := tester.Nodes[0] - - stream := NewStream("foo", "", true) - err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - chunkKey := hash0[:] - chunkData := hash1[:] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Expects: []p2ptest.Expect{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - p2ptest.Exchange{ - Label: "ChunkDelivery message", - Triggers: []p2ptest.Trigger{ - { - Code: 6, - Msg: &ChunkDeliveryMsg{ - Addr: chunkKey, - SData: chunkData, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) - defer cancel() - - // wait for the chunk to get stored - storedChunk, err := localStore.Get(ctx, chunkKey) - for err != nil { - select { - case <-ctx.Done(): - t.Fatalf("Chunk is not in localstore after timeout, err: %v", err) - default: - } - storedChunk, err = localStore.Get(ctx, chunkKey) - time.Sleep(50 * time.Millisecond) - } - - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - if !bytes.Equal(storedChunk.Data(), chunkData) { - t.Fatal("Retrieved chunk has different data than original") - } - -} - -func TestDeliveryFromNodes(t *testing.T) { - testDeliveryFromNodes(t, 2, 1, dataChunkCount, true) - testDeliveryFromNodes(t, 2, 1, dataChunkCount, false) - testDeliveryFromNodes(t, 4, 1, dataChunkCount, true) - testDeliveryFromNodes(t, 4, 1, dataChunkCount, false) - testDeliveryFromNodes(t, 8, 1, dataChunkCount, true) - testDeliveryFromNodes(t, 8, 1, dataChunkCount, false) - testDeliveryFromNodes(t, 16, 1, dataChunkCount, true) - testDeliveryFromNodes(t, 16, 1, dataChunkCount, false) -} - -func testDeliveryFromNodes(t *testing.T, nodes, conns, chunkCount int, skipCheck bool) { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - node := ctx.Config.Node() - addr := network.NewAddr(node) - store, datadir, err := createTestLocalStorageForID(node.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - os.RemoveAll(datadir) - store.Close() - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - SkipCheck: skipCheck, - }) - bucket.Store(bucketKeyRegistry, r) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - log.Info("Adding nodes to simulation") - _, err := sim.AddNodesAndConnectChain(nodes) - if err != nil { - t.Fatal(err) - } - - log.Info("Starting simulation") - ctx := context.Background() - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - //determine the pivot node to be the first node of the simulation - sim.SetPivotNode(nodeIDs[0]) - //distribute chunks of a random file into Stores of nodes 1 to nodes - //we will do this by creating a file store with an underlying round-robin store: - //the file store will create a hash for the uploaded file, but every chunk will be - //distributed to different nodes via round-robin scheduling - log.Debug("Writing file to round-robin file store") - //to do this, we create an array for chunkstores (length minus one, the pivot node) - stores := make([]storage.ChunkStore, len(nodeIDs)-1) - //we then need to get all stores from the sim.... - lStores := sim.NodesItems(bucketKeyStore) - i := 0 - //...iterate the buckets... - for id, bucketVal := range lStores { - //...and remove the one which is the pivot node - if id == *sim.PivotNodeID() { - continue - } - //the other ones are added to the array... - stores[i] = bucketVal.(storage.ChunkStore) - i++ - } - //...which then gets passed to the round-robin file store - roundRobinFileStore := storage.NewFileStore(newRoundRobinStore(stores...), storage.NewFileStoreParams()) - //now we can actually upload a (random) file to the round-robin store - size := chunkCount * chunkSize - log.Debug("Storing data to file store") - fileHash, wait, err := roundRobinFileStore.Store(ctx, io.LimitReader(crand.Reader, int64(size)), int64(size), false) - // wait until all chunks stored - if err != nil { - return err - } - err = wait(ctx) - if err != nil { - return err - } - - log.Debug("Waiting for kademlia") - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - return err - } - - //each of the nodes (except pivot node) subscribes to the stream of the next node - for j, node := range nodeIDs[0 : nodes-1] { - sid := nodeIDs[j+1] - item, ok := sim.NodeItem(node, bucketKeyRegistry) - if !ok { - return fmt.Errorf("No registry") - } - registry := item.(*Registry) - err = registry.Subscribe(sid, NewStream(swarmChunkServerStreamName, "", false), NewRange(0, 0), Top) - if err != nil { - return err - } - } - - //get the pivot node's filestore - item, ok := sim.NodeItem(*sim.PivotNodeID(), bucketKeyFileStore) - if !ok { - return fmt.Errorf("No filestore") - } - pivotFileStore := item.(*storage.FileStore) - log.Debug("Starting retrieval routine") - go func() { - // start the retrieval on the pivot node - this will spawn retrieve requests for missing chunks - // we must wait for the peer connections to have started before requesting - n, err := readAll(pivotFileStore, fileHash) - log.Info(fmt.Sprintf("retrieved %v", fileHash), "read", n, "err", err) - if err != nil { - t.Fatalf("requesting chunks action error: %v", err) - } - }() - - log.Debug("Watching for disconnections") - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeDrop), - ) - - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "node", d.NodeID, "peer", d.Event.Peer) - t.Fatal(d.Error) - } - } - }() - - //finally check that the pivot node gets all chunks via the root hash - log.Debug("Check retrieval") - success := true - var total int64 - total, err = readAll(pivotFileStore, fileHash) - if err != nil { - return err - } - log.Info(fmt.Sprintf("check if %08x is available locally: number of bytes read %v/%v (error: %v)", fileHash, total, size, err)) - if err != nil || total != int64(size) { - success = false - } - - if !success { - return fmt.Errorf("Test failed, chunks not available on all nodes") - } - log.Debug("Test terminated successfully") - return nil - }) - if result.Error != nil { - t.Fatal(result.Error) - } -} - -func BenchmarkDeliveryFromNodesWithoutCheck(b *testing.B) { - for chunks := 32; chunks <= 128; chunks *= 2 { - for i := 2; i < 32; i *= 2 { - b.Run( - fmt.Sprintf("nodes=%v,chunks=%v", i, chunks), - func(b *testing.B) { - benchmarkDeliveryFromNodes(b, i, 1, chunks, true) - }, - ) - } - } -} - -func BenchmarkDeliveryFromNodesWithCheck(b *testing.B) { - for chunks := 32; chunks <= 128; chunks *= 2 { - for i := 2; i < 32; i *= 2 { - b.Run( - fmt.Sprintf("nodes=%v,chunks=%v", i, chunks), - func(b *testing.B) { - benchmarkDeliveryFromNodes(b, i, 1, chunks, false) - }, - ) - } - } -} - -func benchmarkDeliveryFromNodes(b *testing.B, nodes, conns, chunkCount int, skipCheck bool) { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - node := ctx.Config.Node() - addr := network.NewAddr(node) - store, datadir, err := createTestLocalStorageForID(node.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - os.RemoveAll(datadir) - store.Close() - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - SkipCheck: skipCheck, - DoSync: true, - SyncUpdateDelay: 0, - }) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - log.Info("Initializing test config") - _, err := sim.AddNodesAndConnectChain(nodes) - if err != nil { - b.Fatal(err) - } - - ctx := context.Background() - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - node := nodeIDs[len(nodeIDs)-1] - - item, ok := sim.NodeItem(node, bucketKeyFileStore) - if !ok { - b.Fatal("No filestore") - } - remoteFileStore := item.(*storage.FileStore) - - pivotNode := nodeIDs[0] - item, ok = sim.NodeItem(pivotNode, bucketKeyNetStore) - if !ok { - b.Fatal("No filestore") - } - netStore := item.(*storage.NetStore) - - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - return err - } - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeDrop), - ) - - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "node", d.NodeID, "peer", d.Event.Peer) - b.Fatal(d.Error) - } - } - }() - // benchmark loop - b.ResetTimer() - b.StopTimer() - Loop: - for i := 0; i < b.N; i++ { - // uploading chunkCount random chunks to the last node - hashes := make([]storage.Address, chunkCount) - for i := 0; i < chunkCount; i++ { - // create actual size real chunks - ctx := context.TODO() - hash, wait, err := remoteFileStore.Store(ctx, io.LimitReader(crand.Reader, int64(chunkSize)), int64(chunkSize), false) - if err != nil { - b.Fatalf("expected no error. got %v", err) - } - // wait until all chunks stored - err = wait(ctx) - if err != nil { - b.Fatalf("expected no error. got %v", err) - } - // collect the hashes - hashes[i] = hash - } - // now benchmark the actual retrieval - // netstore.Get is called for each hash in a go routine and errors are collected - b.StartTimer() - errs := make(chan error) - for _, hash := range hashes { - go func(h storage.Address) { - _, err := netStore.Get(ctx, h) - log.Warn("test check netstore get", "hash", h, "err", err) - errs <- err - }(hash) - } - // count and report retrieval errors - // if there are misses then chunk timeout is too low for the distance and volume (?) - var total, misses int - for err := range errs { - if err != nil { - log.Warn(err.Error()) - misses++ - } - total++ - if total == chunkCount { - break - } - } - b.StopTimer() - - if misses > 0 { - err = fmt.Errorf("%v chunk not found out of %v", misses, total) - break Loop - } - } - if err != nil { - b.Fatal(err) - } - return nil - }) - if result.Error != nil { - b.Fatal(result.Error) - } - -} diff --git a/swarm/network/stream/intervals/dbstore_test.go b/swarm/network/stream/intervals/dbstore_test.go deleted file mode 100644 index 6716e593ab00..000000000000 --- a/swarm/network/stream/intervals/dbstore_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package intervals - -import ( - "io/ioutil" - "os" - "testing" - - "github.com/ethereum/go-ethereum/swarm/state" -) - -// TestDBStore tests basic functionality of DBStore. -func TestDBStore(t *testing.T) { - dir, err := ioutil.TempDir("", "intervals_test_db_store") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir) - - store, err := state.NewDBStore(dir) - if err != nil { - t.Fatal(err) - } - defer store.Close() - - testStore(t, store) -} diff --git a/swarm/network/stream/intervals/intervals.go b/swarm/network/stream/intervals/intervals.go deleted file mode 100644 index 562c3df9ae49..000000000000 --- a/swarm/network/stream/intervals/intervals.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package intervals - -import ( - "bytes" - "fmt" - "strconv" - "sync" -) - -// Intervals store a list of intervals. Its purpose is to provide -// methods to add new intervals and retrieve missing intervals that -// need to be added. -// It may be used in synchronization of streaming data to persist -// retrieved data ranges between sessions. -type Intervals struct { - start uint64 - ranges [][2]uint64 - mu sync.RWMutex -} - -// New creates a new instance of Intervals. -// Start argument limits the lower bound of intervals. -// No range bellow start bound will be added by Add method or -// returned by Next method. This limit may be used for -// tracking "live" synchronization, where the sync session -// starts from a specific value, and if "live" sync intervals -// need to be merged with historical ones, it can be safely done. -func NewIntervals(start uint64) *Intervals { - return &Intervals{ - start: start, - } -} - -// Add adds a new range to intervals. Range start and end are values -// are both inclusive. -func (i *Intervals) Add(start, end uint64) { - i.mu.Lock() - defer i.mu.Unlock() - - i.add(start, end) -} - -func (i *Intervals) add(start, end uint64) { - if start < i.start { - start = i.start - } - if end < i.start { - return - } - minStartJ := -1 - maxEndJ := -1 - j := 0 - for ; j < len(i.ranges); j++ { - if minStartJ < 0 { - if (start <= i.ranges[j][0] && end+1 >= i.ranges[j][0]) || (start <= i.ranges[j][1]+1 && end+1 >= i.ranges[j][1]) { - if i.ranges[j][0] < start { - start = i.ranges[j][0] - } - minStartJ = j - } - } - if (start <= i.ranges[j][1] && end+1 >= i.ranges[j][1]) || (start <= i.ranges[j][0] && end+1 >= i.ranges[j][0]) { - if i.ranges[j][1] > end { - end = i.ranges[j][1] - } - maxEndJ = j - } - if end+1 <= i.ranges[j][0] { - break - } - } - if minStartJ < 0 && maxEndJ < 0 { - i.ranges = append(i.ranges[:j], append([][2]uint64{{start, end}}, i.ranges[j:]...)...) - return - } - if minStartJ >= 0 { - i.ranges[minStartJ][0] = start - } - if maxEndJ >= 0 { - i.ranges[maxEndJ][1] = end - } - if minStartJ >= 0 && maxEndJ >= 0 && minStartJ != maxEndJ { - i.ranges[maxEndJ][0] = start - i.ranges = append(i.ranges[:minStartJ], i.ranges[maxEndJ:]...) - } -} - -// Merge adds all the intervals from the m Interval to current one. -func (i *Intervals) Merge(m *Intervals) { - m.mu.RLock() - defer m.mu.RUnlock() - i.mu.Lock() - defer i.mu.Unlock() - - for _, r := range m.ranges { - i.add(r[0], r[1]) - } -} - -// Next returns the first range interval that is not fulfilled. Returned -// start and end values are both inclusive, meaning that the whole range -// including start and end need to be added in order to full the gap -// in intervals. -// Returned value for end is 0 if the next interval is after the whole -// range that is stored in Intervals. Zero end value represents no limit -// on the next interval length. -func (i *Intervals) Next() (start, end uint64) { - i.mu.RLock() - defer i.mu.RUnlock() - - l := len(i.ranges) - if l == 0 { - return i.start, 0 - } - if i.ranges[0][0] != i.start { - return i.start, i.ranges[0][0] - 1 - } - if l == 1 { - return i.ranges[0][1] + 1, 0 - } - return i.ranges[0][1] + 1, i.ranges[1][0] - 1 -} - -// Last returns the value that is at the end of the last interval. -func (i *Intervals) Last() (end uint64) { - i.mu.RLock() - defer i.mu.RUnlock() - - l := len(i.ranges) - if l == 0 { - return 0 - } - return i.ranges[l-1][1] -} - -// String returns a descriptive representation of range intervals -// in [] notation, as a list of two element vectors. -func (i *Intervals) String() string { - return fmt.Sprint(i.ranges) -} - -// MarshalBinary encodes Intervals parameters into a semicolon separated list. -// The first element in the list is base36-encoded start value. The following -// elements are two base36-encoded value ranges separated by comma. -func (i *Intervals) MarshalBinary() (data []byte, err error) { - d := make([][]byte, len(i.ranges)+1) - d[0] = []byte(strconv.FormatUint(i.start, 36)) - for j := range i.ranges { - r := i.ranges[j] - d[j+1] = []byte(strconv.FormatUint(r[0], 36) + "," + strconv.FormatUint(r[1], 36)) - } - return bytes.Join(d, []byte(";")), nil -} - -// UnmarshalBinary decodes data according to the Intervals.MarshalBinary format. -func (i *Intervals) UnmarshalBinary(data []byte) (err error) { - d := bytes.Split(data, []byte(";")) - l := len(d) - if l == 0 { - return nil - } - if l >= 1 { - i.start, err = strconv.ParseUint(string(d[0]), 36, 64) - if err != nil { - return err - } - } - if l == 1 { - return nil - } - - i.ranges = make([][2]uint64, 0, l-1) - for j := 1; j < l; j++ { - r := bytes.SplitN(d[j], []byte(","), 2) - if len(r) < 2 { - return fmt.Errorf("range %d has less then 2 elements", j) - } - start, err := strconv.ParseUint(string(r[0]), 36, 64) - if err != nil { - return fmt.Errorf("parsing the first element in range %d: %v", j, err) - } - end, err := strconv.ParseUint(string(r[1]), 36, 64) - if err != nil { - return fmt.Errorf("parsing the second element in range %d: %v", j, err) - } - i.ranges = append(i.ranges, [2]uint64{start, end}) - } - - return nil -} diff --git a/swarm/network/stream/intervals/intervals_test.go b/swarm/network/stream/intervals/intervals_test.go deleted file mode 100644 index b5212f0d917f..000000000000 --- a/swarm/network/stream/intervals/intervals_test.go +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package intervals - -import "testing" - -// Test tests Interval methods Add, Next and Last for various -// initial state. -func Test(t *testing.T) { - for i, tc := range []struct { - startLimit uint64 - initial [][2]uint64 - start uint64 - end uint64 - expected string - nextStart uint64 - nextEnd uint64 - last uint64 - }{ - { - initial: nil, - start: 0, - end: 0, - expected: "[[0 0]]", - nextStart: 1, - nextEnd: 0, - last: 0, - }, - { - initial: nil, - start: 0, - end: 10, - expected: "[[0 10]]", - nextStart: 11, - nextEnd: 0, - last: 10, - }, - { - initial: nil, - start: 5, - end: 15, - expected: "[[5 15]]", - nextStart: 0, - nextEnd: 4, - last: 15, - }, - { - initial: [][2]uint64{{0, 0}}, - start: 0, - end: 0, - expected: "[[0 0]]", - nextStart: 1, - nextEnd: 0, - last: 0, - }, - { - initial: [][2]uint64{{0, 0}}, - start: 5, - end: 15, - expected: "[[0 0] [5 15]]", - nextStart: 1, - nextEnd: 4, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 5, - end: 15, - expected: "[[5 15]]", - nextStart: 0, - nextEnd: 4, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 5, - end: 20, - expected: "[[5 20]]", - nextStart: 0, - nextEnd: 4, - last: 20, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 10, - end: 20, - expected: "[[5 20]]", - nextStart: 0, - nextEnd: 4, - last: 20, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 0, - end: 20, - expected: "[[0 20]]", - nextStart: 21, - nextEnd: 0, - last: 20, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 10, - expected: "[[2 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 4, - expected: "[[2 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 5, - expected: "[[2 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 3, - expected: "[[2 3] [5 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 4, - expected: "[[2 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{0, 1}, {5, 15}}, - start: 2, - end: 4, - expected: "[[0 15]]", - nextStart: 16, - nextEnd: 0, - last: 15, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 2, - end: 10, - expected: "[[0 10] [15 20]]", - nextStart: 11, - nextEnd: 14, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 8, - end: 18, - expected: "[[0 5] [8 20]]", - nextStart: 6, - nextEnd: 7, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 2, - end: 17, - expected: "[[0 20]]", - nextStart: 21, - nextEnd: 0, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 2, - end: 25, - expected: "[[0 25]]", - nextStart: 26, - nextEnd: 0, - last: 25, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 5, - end: 14, - expected: "[[0 20]]", - nextStart: 21, - nextEnd: 0, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 6, - end: 14, - expected: "[[0 20]]", - nextStart: 21, - nextEnd: 0, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}}, - start: 6, - end: 29, - expected: "[[0 40]]", - nextStart: 41, - nextEnd: 0, - last: 40, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, - start: 3, - end: 55, - expected: "[[0 60]]", - nextStart: 61, - nextEnd: 0, - last: 60, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, - start: 21, - end: 49, - expected: "[[0 5] [15 60]]", - nextStart: 6, - nextEnd: 14, - last: 60, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, - start: 0, - end: 100, - expected: "[[0 100]]", - nextStart: 101, - nextEnd: 0, - last: 100, - }, - { - startLimit: 100, - initial: nil, - start: 0, - end: 0, - expected: "[]", - nextStart: 100, - nextEnd: 0, - last: 0, - }, - { - startLimit: 100, - initial: nil, - start: 20, - end: 30, - expected: "[]", - nextStart: 100, - nextEnd: 0, - last: 0, - }, - { - startLimit: 100, - initial: nil, - start: 50, - end: 100, - expected: "[[100 100]]", - nextStart: 101, - nextEnd: 0, - last: 100, - }, - { - startLimit: 100, - initial: nil, - start: 50, - end: 110, - expected: "[[100 110]]", - nextStart: 111, - nextEnd: 0, - last: 110, - }, - { - startLimit: 100, - initial: nil, - start: 120, - end: 130, - expected: "[[120 130]]", - nextStart: 100, - nextEnd: 119, - last: 130, - }, - { - startLimit: 100, - initial: nil, - start: 120, - end: 130, - expected: "[[120 130]]", - nextStart: 100, - nextEnd: 119, - last: 130, - }, - } { - intervals := NewIntervals(tc.startLimit) - intervals.ranges = tc.initial - intervals.Add(tc.start, tc.end) - got := intervals.String() - if got != tc.expected { - t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got) - } - nextStart, nextEnd := intervals.Next() - if nextStart != tc.nextStart { - t.Errorf("interval #%d, expected next start %d, got %d", i, tc.nextStart, nextStart) - } - if nextEnd != tc.nextEnd { - t.Errorf("interval #%d, expected next end %d, got %d", i, tc.nextEnd, nextEnd) - } - last := intervals.Last() - if last != tc.last { - t.Errorf("interval #%d, expected last %d, got %d", i, tc.last, last) - } - } -} - -func TestMerge(t *testing.T) { - for i, tc := range []struct { - initial [][2]uint64 - merge [][2]uint64 - expected string - }{ - { - initial: nil, - merge: nil, - expected: "[]", - }, - { - initial: [][2]uint64{{10, 20}}, - merge: nil, - expected: "[[10 20]]", - }, - { - initial: nil, - merge: [][2]uint64{{15, 25}}, - expected: "[[15 25]]", - }, - { - initial: [][2]uint64{{0, 100}}, - merge: [][2]uint64{{150, 250}}, - expected: "[[0 100] [150 250]]", - }, - { - initial: [][2]uint64{{0, 100}}, - merge: [][2]uint64{{101, 250}}, - expected: "[[0 250]]", - }, - { - initial: [][2]uint64{{0, 10}, {30, 40}}, - merge: [][2]uint64{{20, 25}, {41, 50}}, - expected: "[[0 10] [20 25] [30 50]]", - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, - merge: [][2]uint64{{6, 25}}, - expected: "[[0 25] [30 40] [50 60]]", - }, - } { - intervals := NewIntervals(0) - intervals.ranges = tc.initial - m := NewIntervals(0) - m.ranges = tc.merge - - intervals.Merge(m) - - got := intervals.String() - if got != tc.expected { - t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got) - } - } -} diff --git a/swarm/network/stream/intervals/store_test.go b/swarm/network/stream/intervals/store_test.go deleted file mode 100644 index 0ab14c065c13..000000000000 --- a/swarm/network/stream/intervals/store_test.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package intervals - -import ( - "errors" - "testing" - - "github.com/ethereum/go-ethereum/swarm/state" -) - -var ErrNotFound = errors.New("not found") - -// TestInmemoryStore tests basic functionality of InmemoryStore. -func TestInmemoryStore(t *testing.T) { - testStore(t, state.NewInmemoryStore()) -} - -// testStore is a helper function to test various Store implementations. -func testStore(t *testing.T, s state.Store) { - key1 := "key1" - i1 := NewIntervals(0) - i1.Add(10, 20) - if err := s.Put(key1, i1); err != nil { - t.Fatal(err) - } - i := &Intervals{} - err := s.Get(key1, i) - if err != nil { - t.Fatal(err) - } - if i.String() != i1.String() { - t.Errorf("expected interval %s, got %s", i1, i) - } - - key2 := "key2" - i2 := NewIntervals(0) - i2.Add(10, 20) - if err := s.Put(key2, i2); err != nil { - t.Fatal(err) - } - err = s.Get(key2, i) - if err != nil { - t.Fatal(err) - } - if i.String() != i2.String() { - t.Errorf("expected interval %s, got %s", i2, i) - } - - if err := s.Delete(key1); err != nil { - t.Fatal(err) - } - if err := s.Get(key1, i); err != state.ErrNotFound { - t.Errorf("expected error %v, got %s", state.ErrNotFound, err) - } - if err := s.Get(key2, i); err != nil { - t.Errorf("expected error %v, got %s", nil, err) - } - - if err := s.Delete(key2); err != nil { - t.Fatal(err) - } - if err := s.Get(key2, i); err != state.ErrNotFound { - t.Errorf("expected error %v, got %s", state.ErrNotFound, err) - } -} diff --git a/swarm/network/stream/intervals_test.go b/swarm/network/stream/intervals_test.go deleted file mode 100644 index 2692594238ad..000000000000 --- a/swarm/network/stream/intervals_test.go +++ /dev/null @@ -1,394 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "context" - crand "crypto/rand" - "encoding/binary" - "fmt" - "io" - "os" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/simulation" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -func TestIntervalsLive(t *testing.T) { - testIntervals(t, true, nil, false) - testIntervals(t, true, nil, true) -} - -func TestIntervalsHistory(t *testing.T) { - testIntervals(t, false, NewRange(9, 26), false) - testIntervals(t, false, NewRange(9, 26), true) -} - -func TestIntervalsLiveAndHistory(t *testing.T) { - testIntervals(t, true, NewRange(9, 26), false) - testIntervals(t, true, NewRange(9, 26), true) -} - -func testIntervals(t *testing.T, live bool, history *Range, skipCheck bool) { - nodes := 2 - chunkCount := dataChunkCount - externalStreamName := "externalStream" - externalStreamSessionAt := uint64(50) - externalStreamMaxKeys := uint64(100) - - sim := simulation.New(map[string]simulation.ServiceFunc{ - "intervalsStreamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - n := ctx.Config.Node() - addr := network.NewAddr(n) - store, datadir, err := createTestLocalStorageForID(n.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - store.Close() - os.RemoveAll(datadir) - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - SkipCheck: skipCheck, - }) - bucket.Store(bucketKeyRegistry, r) - - r.RegisterClientFunc(externalStreamName, func(p *Peer, t string, live bool) (Client, error) { - return newTestExternalClient(netStore), nil - }) - r.RegisterServerFunc(externalStreamName, func(p *Peer, t string, live bool) (Server, error) { - return newTestExternalServer(t, externalStreamSessionAt, externalStreamMaxKeys, nil), nil - }) - - fileStore := storage.NewFileStore(localStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - log.Info("Adding nodes to simulation") - _, err := sim.AddNodesAndConnectChain(nodes) - if err != nil { - t.Fatal(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) - defer cancel() - - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - t.Fatal(err) - } - - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - storer := nodeIDs[0] - checker := nodeIDs[1] - - item, ok := sim.NodeItem(storer, bucketKeyFileStore) - if !ok { - return fmt.Errorf("No filestore") - } - fileStore := item.(*storage.FileStore) - - size := chunkCount * chunkSize - _, wait, err := fileStore.Store(ctx, io.LimitReader(crand.Reader, int64(size)), int64(size), false) - if err != nil { - log.Error("Store error: %v", "err", err) - t.Fatal(err) - } - err = wait(ctx) - if err != nil { - log.Error("Wait error: %v", "err", err) - t.Fatal(err) - } - - item, ok = sim.NodeItem(checker, bucketKeyRegistry) - if !ok { - return fmt.Errorf("No registry") - } - registry := item.(*Registry) - - liveErrC := make(chan error) - historyErrC := make(chan error) - - log.Debug("Watching for disconnections") - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeDrop), - ) - - err = registry.Subscribe(storer, NewStream(externalStreamName, "", live), history, Top) - if err != nil { - return err - } - - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "node", d.NodeID, "peer", d.Event.Peer) - t.Fatal(d.Error) - } - } - }() - - go func() { - if !live { - close(liveErrC) - return - } - - var err error - defer func() { - liveErrC <- err - }() - - // live stream - var liveHashesChan chan []byte - liveHashesChan, err = getHashes(ctx, registry, storer, NewStream(externalStreamName, "", true)) - if err != nil { - log.Error("get hashes", "err", err) - return - } - i := externalStreamSessionAt - - // we have subscribed, enable notifications - err = enableNotifications(registry, storer, NewStream(externalStreamName, "", true)) - if err != nil { - return - } - - for { - select { - case hash := <-liveHashesChan: - h := binary.BigEndian.Uint64(hash) - if h != i { - err = fmt.Errorf("expected live hash %d, got %d", i, h) - return - } - i++ - if i > externalStreamMaxKeys { - return - } - case <-ctx.Done(): - return - } - } - }() - - go func() { - if live && history == nil { - close(historyErrC) - return - } - - var err error - defer func() { - historyErrC <- err - }() - - // history stream - var historyHashesChan chan []byte - historyHashesChan, err = getHashes(ctx, registry, storer, NewStream(externalStreamName, "", false)) - if err != nil { - log.Error("get hashes", "err", err) - return - } - - var i uint64 - historyTo := externalStreamMaxKeys - if history != nil { - i = history.From - if history.To != 0 { - historyTo = history.To - } - } - - // we have subscribed, enable notifications - err = enableNotifications(registry, storer, NewStream(externalStreamName, "", false)) - if err != nil { - return - } - - for { - select { - case hash := <-historyHashesChan: - h := binary.BigEndian.Uint64(hash) - if h != i { - err = fmt.Errorf("expected history hash %d, got %d", i, h) - return - } - i++ - if i > historyTo { - return - } - case <-ctx.Done(): - return - } - } - }() - - if err := <-liveErrC; err != nil { - return err - } - if err := <-historyErrC; err != nil { - return err - } - - return nil - }) - - if result.Error != nil { - t.Fatal(result.Error) - } -} - -func getHashes(ctx context.Context, r *Registry, peerID enode.ID, s Stream) (chan []byte, error) { - peer := r.getPeer(peerID) - - client, err := peer.getClient(ctx, s) - if err != nil { - return nil, err - } - - c := client.Client.(*testExternalClient) - - return c.hashes, nil -} - -func enableNotifications(r *Registry, peerID enode.ID, s Stream) error { - peer := r.getPeer(peerID) - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - client, err := peer.getClient(ctx, s) - if err != nil { - return err - } - - close(client.Client.(*testExternalClient).enableNotificationsC) - - return nil -} - -type testExternalClient struct { - hashes chan []byte - store storage.SyncChunkStore - enableNotificationsC chan struct{} -} - -func newTestExternalClient(store storage.SyncChunkStore) *testExternalClient { - return &testExternalClient{ - hashes: make(chan []byte), - store: store, - enableNotificationsC: make(chan struct{}), - } -} - -func (c *testExternalClient) NeedData(ctx context.Context, hash []byte) func(context.Context) error { - wait := c.store.FetchFunc(ctx, storage.Address(hash)) - if wait == nil { - return nil - } - select { - case c.hashes <- hash: - case <-ctx.Done(): - log.Warn("testExternalClient NeedData context", "err", ctx.Err()) - return func(_ context.Context) error { - return ctx.Err() - } - } - return wait -} - -func (c *testExternalClient) BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) { - return nil -} - -func (c *testExternalClient) Close() {} - -const testExternalServerBatchSize = 10 - -type testExternalServer struct { - t string - keyFunc func(key []byte, index uint64) - sessionAt uint64 - maxKeys uint64 -} - -func newTestExternalServer(t string, sessionAt, maxKeys uint64, keyFunc func(key []byte, index uint64)) *testExternalServer { - if keyFunc == nil { - keyFunc = binary.BigEndian.PutUint64 - } - return &testExternalServer{ - t: t, - keyFunc: keyFunc, - sessionAt: sessionAt, - maxKeys: maxKeys, - } -} - -func (s *testExternalServer) SetNextBatch(from uint64, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) { - if from == 0 && to == 0 { - from = s.sessionAt - to = s.sessionAt + testExternalServerBatchSize - } - if to-from > testExternalServerBatchSize { - to = from + testExternalServerBatchSize - 1 - } - if from >= s.maxKeys && to > s.maxKeys { - return nil, 0, 0, nil, io.EOF - } - if to > s.maxKeys { - to = s.maxKeys - } - b := make([]byte, HashSize*(to-from+1)) - for i := from; i <= to; i++ { - s.keyFunc(b[(i-from)*HashSize:(i-from+1)*HashSize], i) - } - return b, from, to, nil, nil -} - -func (s *testExternalServer) GetData(context.Context, []byte) ([]byte, error) { - return make([]byte, 4096), nil -} - -func (s *testExternalServer) Close() {} diff --git a/swarm/network/stream/messages.go b/swarm/network/stream/messages.go deleted file mode 100644 index 74c785d587bf..000000000000 --- a/swarm/network/stream/messages.go +++ /dev/null @@ -1,394 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "context" - "fmt" - "time" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/log" - bv "github.com/ethereum/go-ethereum/swarm/network/bitvector" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/opentracing/opentracing-go" -) - -var syncBatchTimeout = 30 * time.Second - -// Stream defines a unique stream identifier. -type Stream struct { - // Name is used for Client and Server functions identification. - Name string - // Key is the name of specific stream data. - Key string - // Live defines whether the stream delivers only new data - // for the specific stream. - Live bool -} - -func NewStream(name string, key string, live bool) Stream { - return Stream{ - Name: name, - Key: key, - Live: live, - } -} - -// String return a stream id based on all Stream fields. -func (s Stream) String() string { - t := "h" - if s.Live { - t = "l" - } - return fmt.Sprintf("%s|%s|%s", s.Name, s.Key, t) -} - -// SubcribeMsg is the protocol msg for requesting a stream(section) -type SubscribeMsg struct { - Stream Stream - History *Range `rlp:"nil"` - Priority uint8 // delivered on priority channel -} - -// RequestSubscriptionMsg is the protocol msg for a node to request subscription to a -// specific stream -type RequestSubscriptionMsg struct { - Stream Stream - History *Range `rlp:"nil"` - Priority uint8 // delivered on priority channel -} - -func (p *Peer) handleRequestSubscription(ctx context.Context, req *RequestSubscriptionMsg) (err error) { - log.Debug(fmt.Sprintf("handleRequestSubscription: streamer %s to subscribe to %s with stream %s", p.streamer.addr, p.ID(), req.Stream)) - return p.streamer.Subscribe(p.ID(), req.Stream, req.History, req.Priority) -} - -func (p *Peer) handleSubscribeMsg(ctx context.Context, req *SubscribeMsg) (err error) { - metrics.GetOrRegisterCounter("peer.handlesubscribemsg", nil).Inc(1) - - defer func() { - if err != nil { - // The error will be sent as a subscribe error message - // and will not be returned as it will prevent any new message - // exchange between peers over p2p. Instead, error will be returned - // only if there is one from sending subscribe error message. - err = p.Send(context.TODO(), SubscribeErrorMsg{ - Error: err.Error(), - }) - } - }() - - log.Debug("received subscription", "from", p.streamer.addr, "peer", p.ID(), "stream", req.Stream, "history", req.History) - - f, err := p.streamer.GetServerFunc(req.Stream.Name) - if err != nil { - return err - } - - s, err := f(p, req.Stream.Key, req.Stream.Live) - if err != nil { - return err - } - os, err := p.setServer(req.Stream, s, req.Priority) - if err != nil { - return err - } - - var from uint64 - var to uint64 - if !req.Stream.Live && req.History != nil { - from = req.History.From - to = req.History.To - } - - go func() { - if err := p.SendOfferedHashes(os, from, to); err != nil { - log.Warn("SendOfferedHashes error", "peer", p.ID().TerminalString(), "err", err) - } - }() - - if req.Stream.Live && req.History != nil { - // subscribe to the history stream - s, err := f(p, req.Stream.Key, false) - if err != nil { - return err - } - - os, err := p.setServer(getHistoryStream(req.Stream), s, getHistoryPriority(req.Priority)) - if err != nil { - return err - } - go func() { - if err := p.SendOfferedHashes(os, req.History.From, req.History.To); err != nil { - log.Warn("SendOfferedHashes error", "peer", p.ID().TerminalString(), "err", err) - } - }() - } - - return nil -} - -type SubscribeErrorMsg struct { - Error string -} - -func (p *Peer) handleSubscribeErrorMsg(req *SubscribeErrorMsg) (err error) { - return fmt.Errorf("subscribe to peer %s: %v", p.ID(), req.Error) -} - -type UnsubscribeMsg struct { - Stream Stream -} - -func (p *Peer) handleUnsubscribeMsg(req *UnsubscribeMsg) error { - return p.removeServer(req.Stream) -} - -type QuitMsg struct { - Stream Stream -} - -func (p *Peer) handleQuitMsg(req *QuitMsg) error { - return p.removeClient(req.Stream) -} - -// OfferedHashesMsg is the protocol msg for offering to hand over a -// stream section -type OfferedHashesMsg struct { - Stream Stream // name of Stream - From, To uint64 // peer and db-specific entry count - Hashes []byte // stream of hashes (128) - *HandoverProof // HandoverProof -} - -// String pretty prints OfferedHashesMsg -func (m OfferedHashesMsg) String() string { - return fmt.Sprintf("Stream '%v' [%v-%v] (%v)", m.Stream, m.From, m.To, len(m.Hashes)/HashSize) -} - -// handleOfferedHashesMsg protocol msg handler calls the incoming streamer interface -// Filter method -func (p *Peer) handleOfferedHashesMsg(ctx context.Context, req *OfferedHashesMsg) error { - metrics.GetOrRegisterCounter("peer.handleofferedhashes", nil).Inc(1) - - var sp opentracing.Span - ctx, sp = spancontext.StartSpan( - ctx, - "handle.offered.hashes") - defer sp.Finish() - - c, _, err := p.getOrSetClient(req.Stream, req.From, req.To) - if err != nil { - return err - } - - hashes := req.Hashes - lenHashes := len(hashes) - if lenHashes%HashSize != 0 { - return fmt.Errorf("error invalid hashes length (len: %v)", lenHashes) - } - - want, err := bv.New(lenHashes / HashSize) - if err != nil { - return fmt.Errorf("error initiaising bitvector of length %v: %v", lenHashes/HashSize, err) - } - - ctr := 0 - errC := make(chan error) - ctx, cancel := context.WithTimeout(ctx, syncBatchTimeout) - - ctx = context.WithValue(ctx, "source", p.ID().String()) - for i := 0; i < lenHashes; i += HashSize { - hash := hashes[i : i+HashSize] - - if wait := c.NeedData(ctx, hash); wait != nil { - ctr++ - want.Set(i/HashSize, true) - // create request and wait until the chunk data arrives and is stored - go func(w func(context.Context) error) { - select { - case errC <- w(ctx): - case <-ctx.Done(): - } - }(wait) - } - } - - go func() { - defer cancel() - for i := 0; i < ctr; i++ { - select { - case err := <-errC: - if err != nil { - log.Debug("client.handleOfferedHashesMsg() error waiting for chunk, dropping peer", "peer", p.ID(), "err", err) - p.Drop(err) - return - } - case <-ctx.Done(): - log.Debug("client.handleOfferedHashesMsg() context done", "ctx.Err()", ctx.Err()) - return - case <-c.quit: - log.Debug("client.handleOfferedHashesMsg() quit") - return - } - } - select { - case c.next <- c.batchDone(p, req, hashes): - case <-c.quit: - log.Debug("client.handleOfferedHashesMsg() quit") - case <-ctx.Done(): - log.Debug("client.handleOfferedHashesMsg() context done", "ctx.Err()", ctx.Err()) - } - }() - // only send wantedKeysMsg if all missing chunks of the previous batch arrived - // except - if c.stream.Live { - c.sessionAt = req.From - } - from, to := c.nextBatch(req.To + 1) - log.Trace("set next batch", "peer", p.ID(), "stream", req.Stream, "from", req.From, "to", req.To, "addr", p.streamer.addr) - if from == to { - return nil - } - - msg := &WantedHashesMsg{ - Stream: req.Stream, - Want: want.Bytes(), - From: from, - To: to, - } - go func() { - log.Trace("sending want batch", "peer", p.ID(), "stream", msg.Stream, "from", msg.From, "to", msg.To) - select { - case err := <-c.next: - if err != nil { - log.Warn("c.next error dropping peer", "err", err) - p.Drop(err) - return - } - case <-c.quit: - log.Debug("client.handleOfferedHashesMsg() quit") - return - case <-ctx.Done(): - log.Debug("client.handleOfferedHashesMsg() context done", "ctx.Err()", ctx.Err()) - return - } - log.Trace("sending want batch", "peer", p.ID(), "stream", msg.Stream, "from", msg.From, "to", msg.To) - err := p.SendPriority(ctx, msg, c.priority) - if err != nil { - log.Warn("SendPriority error", "err", err) - } - }() - return nil -} - -// WantedHashesMsg is the protocol msg data for signaling which hashes -// offered in OfferedHashesMsg downstream peer actually wants sent over -type WantedHashesMsg struct { - Stream Stream - Want []byte // bitvector indicating which keys of the batch needed - From, To uint64 // next interval offset - empty if not to be continued -} - -// String pretty prints WantedHashesMsg -func (m WantedHashesMsg) String() string { - return fmt.Sprintf("Stream '%v', Want: %x, Next: [%v-%v]", m.Stream, m.Want, m.From, m.To) -} - -// handleWantedHashesMsg protocol msg handler -// * sends the next batch of unsynced keys -// * sends the actual data chunks as per WantedHashesMsg -func (p *Peer) handleWantedHashesMsg(ctx context.Context, req *WantedHashesMsg) error { - metrics.GetOrRegisterCounter("peer.handlewantedhashesmsg", nil).Inc(1) - - log.Trace("received wanted batch", "peer", p.ID(), "stream", req.Stream, "from", req.From, "to", req.To) - s, err := p.getServer(req.Stream) - if err != nil { - return err - } - hashes := s.currentBatch - // launch in go routine since GetBatch blocks until new hashes arrive - go func() { - if err := p.SendOfferedHashes(s, req.From, req.To); err != nil { - log.Warn("SendOfferedHashes error", "err", err) - } - }() - // go p.SendOfferedHashes(s, req.From, req.To) - l := len(hashes) / HashSize - - log.Trace("wanted batch length", "peer", p.ID(), "stream", req.Stream, "from", req.From, "to", req.To, "lenhashes", len(hashes), "l", l) - want, err := bv.NewFromBytes(req.Want, l) - if err != nil { - return fmt.Errorf("error initiaising bitvector of length %v: %v", l, err) - } - for i := 0; i < l; i++ { - if want.Get(i) { - metrics.GetOrRegisterCounter("peer.handlewantedhashesmsg.actualget", nil).Inc(1) - - hash := hashes[i*HashSize : (i+1)*HashSize] - data, err := s.GetData(ctx, hash) - if err != nil { - return fmt.Errorf("handleWantedHashesMsg get data %x: %v", hash, err) - } - chunk := storage.NewChunk(hash, data) - if err := p.Deliver(ctx, chunk, s.priority); err != nil { - return err - } - } - } - return nil -} - -// Handover represents a statement that the upstream peer hands over the stream section -type Handover struct { - Stream Stream // name of stream - Start, End uint64 // index of hashes - Root []byte // Root hash for indexed segment inclusion proofs -} - -// HandoverProof represents a signed statement that the upstream peer handed over the stream section -type HandoverProof struct { - Sig []byte // Sign(Hash(Serialisation(Handover))) - *Handover -} - -// Takeover represents a statement that downstream peer took over (stored all data) -// handed over -type Takeover Handover - -// TakeoverProof represents a signed statement that the downstream peer took over -// the stream section -type TakeoverProof struct { - Sig []byte // Sign(Hash(Serialisation(Takeover))) - *Takeover -} - -// TakeoverProofMsg is the protocol msg sent by downstream peer -type TakeoverProofMsg TakeoverProof - -// String pretty prints TakeoverProofMsg -func (m TakeoverProofMsg) String() string { - return fmt.Sprintf("Stream: '%v' [%v-%v], Root: %x, Sig: %x", m.Stream, m.Start, m.End, m.Root, m.Sig) -} - -func (p *Peer) handleTakeoverProofMsg(ctx context.Context, req *TakeoverProofMsg) error { - _, err := p.getServer(req.Stream) - // store the strongest takeoverproof for the stream in streamer - return err -} diff --git a/swarm/network/stream/peer.go b/swarm/network/stream/peer.go deleted file mode 100644 index ef6bbdf70da2..000000000000 --- a/swarm/network/stream/peer.go +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "context" - "errors" - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/swarm/log" - pq "github.com/ethereum/go-ethereum/swarm/network/priorityqueue" - "github.com/ethereum/go-ethereum/swarm/network/stream/intervals" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" - opentracing "github.com/opentracing/opentracing-go" -) - -type notFoundError struct { - t string - s Stream -} - -func newNotFoundError(t string, s Stream) *notFoundError { - return ¬FoundError{t: t, s: s} -} - -func (e *notFoundError) Error() string { - return fmt.Sprintf("%s not found for stream %q", e.t, e.s) -} - -// ErrMaxPeerServers will be returned if peer server limit is reached. -// It will be sent in the SubscribeErrorMsg. -var ErrMaxPeerServers = errors.New("max peer servers") - -// Peer is the Peer extension for the streaming protocol -type Peer struct { - *protocols.Peer - streamer *Registry - pq *pq.PriorityQueue - serverMu sync.RWMutex - clientMu sync.RWMutex // protects both clients and clientParams - servers map[Stream]*server - clients map[Stream]*client - // clientParams map keeps required client arguments - // that are set on Registry.Subscribe and used - // on creating a new client in offered hashes handler. - clientParams map[Stream]*clientParams - quit chan struct{} -} - -type WrappedPriorityMsg struct { - Context context.Context - Msg interface{} -} - -// NewPeer is the constructor for Peer -func NewPeer(peer *protocols.Peer, streamer *Registry) *Peer { - p := &Peer{ - Peer: peer, - pq: pq.New(int(PriorityQueue), PriorityQueueCap), - streamer: streamer, - servers: make(map[Stream]*server), - clients: make(map[Stream]*client), - clientParams: make(map[Stream]*clientParams), - quit: make(chan struct{}), - } - ctx, cancel := context.WithCancel(context.Background()) - go p.pq.Run(ctx, func(i interface{}) { - wmsg := i.(WrappedPriorityMsg) - err := p.Send(wmsg.Context, wmsg.Msg) - if err != nil { - log.Error("Message send error, dropping peer", "peer", p.ID(), "err", err) - p.Drop(err) - } - }) - - // basic monitoring for pq contention - go func(pq *pq.PriorityQueue) { - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() - for { - select { - case <-ticker.C: - var len_maxi int - var cap_maxi int - for k := range pq.Queues { - if len_maxi < len(pq.Queues[k]) { - len_maxi = len(pq.Queues[k]) - } - - if cap_maxi < cap(pq.Queues[k]) { - cap_maxi = cap(pq.Queues[k]) - } - } - - metrics.GetOrRegisterGauge(fmt.Sprintf("pq_len_%s", p.ID().TerminalString()), nil).Update(int64(len_maxi)) - metrics.GetOrRegisterGauge(fmt.Sprintf("pq_cap_%s", p.ID().TerminalString()), nil).Update(int64(cap_maxi)) - case <-p.quit: - return - } - } - }(p.pq) - - go func() { - <-p.quit - cancel() - }() - return p -} - -// Deliver sends a storeRequestMsg protocol message to the peer -func (p *Peer) Deliver(ctx context.Context, chunk storage.Chunk, priority uint8) error { - var sp opentracing.Span - ctx, sp = spancontext.StartSpan( - ctx, - "send.chunk.delivery") - defer sp.Finish() - - msg := &ChunkDeliveryMsg{ - Addr: chunk.Address(), - SData: chunk.Data(), - } - return p.SendPriority(ctx, msg, priority) -} - -// SendPriority sends message to the peer using the outgoing priority queue -func (p *Peer) SendPriority(ctx context.Context, msg interface{}, priority uint8) error { - defer metrics.GetOrRegisterResettingTimer(fmt.Sprintf("peer.sendpriority_t.%d", priority), nil).UpdateSince(time.Now()) - metrics.GetOrRegisterCounter(fmt.Sprintf("peer.sendpriority.%d", priority), nil).Inc(1) - wmsg := WrappedPriorityMsg{ - Context: ctx, - Msg: msg, - } - err := p.pq.Push(wmsg, int(priority)) - if err == pq.ErrContention { - log.Warn("dropping peer on priority queue contention", "peer", p.ID()) - p.Drop(err) - } - return err -} - -// SendOfferedHashes sends OfferedHashesMsg protocol msg -func (p *Peer) SendOfferedHashes(s *server, f, t uint64) error { - var sp opentracing.Span - ctx, sp := spancontext.StartSpan( - context.TODO(), - "send.offered.hashes") - defer sp.Finish() - - hashes, from, to, proof, err := s.SetNextBatch(f, t) - if err != nil { - return err - } - // true only when quitting - if len(hashes) == 0 { - return nil - } - if proof == nil { - proof = &HandoverProof{ - Handover: &Handover{}, - } - } - s.currentBatch = hashes - msg := &OfferedHashesMsg{ - HandoverProof: proof, - Hashes: hashes, - From: from, - To: to, - Stream: s.stream, - } - log.Trace("Swarm syncer offer batch", "peer", p.ID(), "stream", s.stream, "len", len(hashes), "from", from, "to", to) - return p.SendPriority(ctx, msg, s.priority) -} - -func (p *Peer) getServer(s Stream) (*server, error) { - p.serverMu.RLock() - defer p.serverMu.RUnlock() - - server := p.servers[s] - if server == nil { - return nil, newNotFoundError("server", s) - } - return server, nil -} - -func (p *Peer) setServer(s Stream, o Server, priority uint8) (*server, error) { - p.serverMu.Lock() - defer p.serverMu.Unlock() - - if p.servers[s] != nil { - return nil, fmt.Errorf("server %s already registered", s) - } - - if p.streamer.maxPeerServers > 0 && len(p.servers) >= p.streamer.maxPeerServers { - return nil, ErrMaxPeerServers - } - - os := &server{ - Server: o, - stream: s, - priority: priority, - } - p.servers[s] = os - return os, nil -} - -func (p *Peer) removeServer(s Stream) error { - p.serverMu.Lock() - defer p.serverMu.Unlock() - - server, ok := p.servers[s] - if !ok { - return newNotFoundError("server", s) - } - server.Close() - delete(p.servers, s) - return nil -} - -func (p *Peer) getClient(ctx context.Context, s Stream) (c *client, err error) { - var params *clientParams - func() { - p.clientMu.RLock() - defer p.clientMu.RUnlock() - - c = p.clients[s] - if c != nil { - return - } - params = p.clientParams[s] - }() - if c != nil { - return c, nil - } - - if params != nil { - //debug.PrintStack() - if err := params.waitClient(ctx); err != nil { - return nil, err - } - } - - p.clientMu.RLock() - defer p.clientMu.RUnlock() - - c = p.clients[s] - if c != nil { - return c, nil - } - return nil, newNotFoundError("client", s) -} - -func (p *Peer) getOrSetClient(s Stream, from, to uint64) (c *client, created bool, err error) { - p.clientMu.Lock() - defer p.clientMu.Unlock() - - c = p.clients[s] - if c != nil { - return c, false, nil - } - - f, err := p.streamer.GetClientFunc(s.Name) - if err != nil { - return nil, false, err - } - - is, err := f(p, s.Key, s.Live) - if err != nil { - return nil, false, err - } - - cp, err := p.getClientParams(s) - if err != nil { - return nil, false, err - } - defer func() { - if err == nil { - if err := p.removeClientParams(s); err != nil { - log.Error("stream set client: remove client params", "stream", s, "peer", p, "err", err) - } - } - }() - - intervalsKey := peerStreamIntervalsKey(p, s) - if s.Live { - // try to find previous history and live intervals and merge live into history - historyKey := peerStreamIntervalsKey(p, NewStream(s.Name, s.Key, false)) - historyIntervals := &intervals.Intervals{} - err := p.streamer.intervalsStore.Get(historyKey, historyIntervals) - switch err { - case nil: - liveIntervals := &intervals.Intervals{} - err := p.streamer.intervalsStore.Get(intervalsKey, liveIntervals) - switch err { - case nil: - historyIntervals.Merge(liveIntervals) - if err := p.streamer.intervalsStore.Put(historyKey, historyIntervals); err != nil { - log.Error("stream set client: put history intervals", "stream", s, "peer", p, "err", err) - } - case state.ErrNotFound: - default: - log.Error("stream set client: get live intervals", "stream", s, "peer", p, "err", err) - } - case state.ErrNotFound: - default: - log.Error("stream set client: get history intervals", "stream", s, "peer", p, "err", err) - } - } - - if err := p.streamer.intervalsStore.Put(intervalsKey, intervals.NewIntervals(from)); err != nil { - return nil, false, err - } - - next := make(chan error, 1) - c = &client{ - Client: is, - stream: s, - priority: cp.priority, - to: cp.to, - next: next, - quit: make(chan struct{}), - intervalsStore: p.streamer.intervalsStore, - intervalsKey: intervalsKey, - } - p.clients[s] = c - cp.clientCreated() // unblock all possible getClient calls that are waiting - next <- nil // this is to allow wantedKeysMsg before first batch arrives - return c, true, nil -} - -func (p *Peer) removeClient(s Stream) error { - p.clientMu.Lock() - defer p.clientMu.Unlock() - - client, ok := p.clients[s] - if !ok { - return newNotFoundError("client", s) - } - client.close() - delete(p.clients, s) - return nil -} - -func (p *Peer) setClientParams(s Stream, params *clientParams) error { - p.clientMu.Lock() - defer p.clientMu.Unlock() - - if p.clients[s] != nil { - return fmt.Errorf("client %s already exists", s) - } - if p.clientParams[s] != nil { - return fmt.Errorf("client params %s already set", s) - } - p.clientParams[s] = params - return nil -} - -func (p *Peer) getClientParams(s Stream) (*clientParams, error) { - params := p.clientParams[s] - if params == nil { - return nil, fmt.Errorf("client params '%v' not provided to peer %v", s, p.ID()) - } - return params, nil -} - -func (p *Peer) removeClientParams(s Stream) error { - _, ok := p.clientParams[s] - if !ok { - return newNotFoundError("client params", s) - } - delete(p.clientParams, s) - return nil -} - -func (p *Peer) close() { - for _, s := range p.servers { - s.Close() - } -} diff --git a/swarm/network/stream/snapshot_retrieval_test.go b/swarm/network/stream/snapshot_retrieval_test.go deleted file mode 100644 index 6498f599dcc8..000000000000 --- a/swarm/network/stream/snapshot_retrieval_test.go +++ /dev/null @@ -1,402 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package stream - -import ( - "context" - "fmt" - "os" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/simulation" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -//constants for random file generation -const ( - minFileSize = 2 - maxFileSize = 40 -) - -//This test is a retrieval test for nodes. -//A configurable number of nodes can be -//provided to the test. -//Files are uploaded to nodes, other nodes try to retrieve the file -//Number of nodes can be provided via commandline too. -func TestFileRetrieval(t *testing.T) { - if *nodes != 0 { - err := runFileRetrievalTest(*nodes) - if err != nil { - t.Fatal(err) - } - } else { - nodeCnt := []int{16} - //if the `longrunning` flag has been provided - //run more test combinations - if *longrunning { - nodeCnt = append(nodeCnt, 32, 64, 128) - } - for _, n := range nodeCnt { - err := runFileRetrievalTest(n) - if err != nil { - t.Fatal(err) - } - } - } -} - -//This test is a retrieval test for nodes. -//One node is randomly selected to be the pivot node. -//A configurable number of chunks and nodes can be -//provided to the test, the number of chunks is uploaded -//to the pivot node and other nodes try to retrieve the chunk(s). -//Number of chunks and nodes can be provided via commandline too. -func TestRetrieval(t *testing.T) { - //if nodes/chunks have been provided via commandline, - //run the tests with these values - if *nodes != 0 && *chunks != 0 { - err := runRetrievalTest(*chunks, *nodes) - if err != nil { - t.Fatal(err) - } - } else { - var nodeCnt []int - var chnkCnt []int - //if the `longrunning` flag has been provided - //run more test combinations - if *longrunning { - nodeCnt = []int{16, 32, 128} - chnkCnt = []int{4, 32, 256} - } else { - //default test - nodeCnt = []int{16} - chnkCnt = []int{32} - } - for _, n := range nodeCnt { - for _, c := range chnkCnt { - err := runRetrievalTest(c, n) - if err != nil { - t.Fatal(err) - } - } - } - } -} - -/* - -The test loads a snapshot file to construct the swarm network, -assuming that the snapshot file identifies a healthy -kademlia network. Nevertheless a health check runs in the -simulation's `action` function. - -The snapshot should have 'streamer' in its service list. -*/ -func runFileRetrievalTest(nodeCount int) error { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - node := ctx.Config.Node() - addr := network.NewAddr(node) - store, datadir, err := createTestLocalStorageForID(node.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - DoSync: true, - SyncUpdateDelay: 3 * time.Second, - }) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - cleanup = func() { - os.RemoveAll(datadir) - netStore.Close() - r.Close() - } - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - log.Info("Initializing test config") - - conf := &synctestConfig{} - //map of discover ID to indexes of chunks expected at that ID - conf.idToChunksMap = make(map[enode.ID][]int) - //map of overlay address to discover ID - conf.addrToIDMap = make(map[string]enode.ID) - //array where the generated chunk hashes will be stored - conf.hashes = make([]storage.Address, 0) - - err := sim.UploadSnapshot(fmt.Sprintf("testing/snapshot_%d.json", nodeCount)) - if err != nil { - return err - } - - ctx, cancelSimRun := context.WithTimeout(context.Background(), 1*time.Minute) - defer cancelSimRun() - - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - for _, n := range nodeIDs { - //get the kademlia overlay address from this ID - a := n.Bytes() - //append it to the array of all overlay addresses - conf.addrs = append(conf.addrs, a) - //the proximity calculation is on overlay addr, - //the p2p/simulations check func triggers on enode.ID, - //so we need to know which overlay addr maps to which nodeID - conf.addrToIDMap[string(a)] = n - } - - //an array for the random files - var randomFiles []string - //channel to signal when the upload has finished - //uploadFinished := make(chan struct{}) - //channel to trigger new node checks - - conf.hashes, randomFiles, err = uploadFilesToNodes(sim) - if err != nil { - return err - } - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - return err - } - - // File retrieval check is repeated until all uploaded files are retrieved from all nodes - // or until the timeout is reached. - allSuccess := false - for !allSuccess { - for _, id := range nodeIDs { - //for each expected chunk, check if it is in the local store - localChunks := conf.idToChunksMap[id] - localSuccess := true - for _, ch := range localChunks { - //get the real chunk by the index in the index array - chunk := conf.hashes[ch] - log.Trace(fmt.Sprintf("node has chunk: %s:", chunk)) - //check if the expected chunk is indeed in the localstore - var err error - //check on the node's FileStore (netstore) - item, ok := sim.NodeItem(id, bucketKeyFileStore) - if !ok { - return fmt.Errorf("No registry") - } - fileStore := item.(*storage.FileStore) - //check all chunks - for i, hash := range conf.hashes { - reader, _ := fileStore.Retrieve(context.TODO(), hash) - //check that we can read the file size and that it corresponds to the generated file size - if s, err := reader.Size(ctx, nil); err != nil || s != int64(len(randomFiles[i])) { - allSuccess = false - log.Warn("Retrieve error", "err", err, "hash", hash, "nodeId", id) - } else { - log.Debug(fmt.Sprintf("File with root hash %x successfully retrieved", hash)) - } - } - if err != nil { - log.Warn(fmt.Sprintf("Chunk %s NOT found for id %s", chunk, id)) - localSuccess = false - } else { - log.Debug(fmt.Sprintf("Chunk %s IS FOUND for id %s", chunk, id)) - } - } - allSuccess = localSuccess - } - } - if !allSuccess { - return fmt.Errorf("Not all chunks succeeded!") - } - return nil - }) - - if result.Error != nil { - return result.Error - } - - return nil -} - -/* -The test generates the given number of chunks. - -The test loads a snapshot file to construct the swarm network, -assuming that the snapshot file identifies a healthy -kademlia network. Nevertheless a health check runs in the -simulation's `action` function. - -The snapshot should have 'streamer' in its service list. -*/ -func runRetrievalTest(chunkCount int, nodeCount int) error { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - node := ctx.Config.Node() - addr := network.NewAddr(node) - store, datadir, err := createTestLocalStorageForID(node.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - DoSync: true, - SyncUpdateDelay: 0, - }) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucketKeyFileStore = simulation.BucketKey("filestore") - bucket.Store(bucketKeyFileStore, fileStore) - - cleanup = func() { - os.RemoveAll(datadir) - netStore.Close() - r.Close() - } - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - conf := &synctestConfig{} - //map of discover ID to indexes of chunks expected at that ID - conf.idToChunksMap = make(map[enode.ID][]int) - //map of overlay address to discover ID - conf.addrToIDMap = make(map[string]enode.ID) - //array where the generated chunk hashes will be stored - conf.hashes = make([]storage.Address, 0) - - err := sim.UploadSnapshot(fmt.Sprintf("testing/snapshot_%d.json", nodeCount)) - if err != nil { - return err - } - - ctx := context.Background() - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - for _, n := range nodeIDs { - //get the kademlia overlay address from this ID - a := n.Bytes() - //append it to the array of all overlay addresses - conf.addrs = append(conf.addrs, a) - //the proximity calculation is on overlay addr, - //the p2p/simulations check func triggers on enode.ID, - //so we need to know which overlay addr maps to which nodeID - conf.addrToIDMap[string(a)] = n - } - - //an array for the random files - var randomFiles []string - //this is the node selected for upload - node := sim.RandomUpNode() - item, ok := sim.NodeItem(node.ID, bucketKeyStore) - if !ok { - return fmt.Errorf("No localstore") - } - lstore := item.(*storage.LocalStore) - conf.hashes, err = uploadFileToSingleNodeStore(node.ID, chunkCount, lstore) - if err != nil { - return err - } - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - return err - } - - // File retrieval check is repeated until all uploaded files are retrieved from all nodes - // or until the timeout is reached. - allSuccess := false - for !allSuccess { - for _, id := range nodeIDs { - //for each expected chunk, check if it is in the local store - localChunks := conf.idToChunksMap[id] - localSuccess := true - for _, ch := range localChunks { - //get the real chunk by the index in the index array - chunk := conf.hashes[ch] - log.Trace(fmt.Sprintf("node has chunk: %s:", chunk)) - //check if the expected chunk is indeed in the localstore - var err error - //check on the node's FileStore (netstore) - item, ok := sim.NodeItem(id, bucketKeyFileStore) - if !ok { - return fmt.Errorf("No registry") - } - fileStore := item.(*storage.FileStore) - //check all chunks - for i, hash := range conf.hashes { - reader, _ := fileStore.Retrieve(context.TODO(), hash) - //check that we can read the file size and that it corresponds to the generated file size - if s, err := reader.Size(ctx, nil); err != nil || s != int64(len(randomFiles[i])) { - allSuccess = false - log.Warn("Retrieve error", "err", err, "hash", hash, "nodeId", id) - } else { - log.Debug(fmt.Sprintf("File with root hash %x successfully retrieved", hash)) - } - } - if err != nil { - log.Warn(fmt.Sprintf("Chunk %s NOT found for id %s", chunk, id)) - localSuccess = false - } else { - log.Debug(fmt.Sprintf("Chunk %s IS FOUND for id %s", chunk, id)) - } - } - allSuccess = localSuccess - } - } - if !allSuccess { - return fmt.Errorf("Not all chunks succeeded!") - } - return nil - }) - - if result.Error != nil { - return result.Error - } - - return nil -} diff --git a/swarm/network/stream/snapshot_sync_test.go b/swarm/network/stream/snapshot_sync_test.go deleted file mode 100644 index d93afce1b153..000000000000 --- a/swarm/network/stream/snapshot_sync_test.go +++ /dev/null @@ -1,598 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package stream - -import ( - "context" - crand "crypto/rand" - "fmt" - "io" - "os" - "runtime" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/simulation" - "github.com/ethereum/go-ethereum/swarm/pot" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" - mockdb "github.com/ethereum/go-ethereum/swarm/storage/mock/db" -) - -const MaxTimeout = 600 - -type synctestConfig struct { - addrs [][]byte - hashes []storage.Address - idToChunksMap map[enode.ID][]int - //chunksToNodesMap map[string][]int - addrToIDMap map[string]enode.ID -} - -// Tests in this file should not request chunks from peers. -// This function will panic indicating that there is a problem if request has been made. -func dummyRequestFromPeers(_ context.Context, req *network.Request) (*enode.ID, chan struct{}, error) { - panic(fmt.Sprintf("unexpected request: address %s, source %s", req.Addr.String(), req.Source.String())) -} - -//This test is a syncing test for nodes. -//One node is randomly selected to be the pivot node. -//A configurable number of chunks and nodes can be -//provided to the test, the number of chunks is uploaded -//to the pivot node, and we check that nodes get the chunks -//they are expected to store based on the syncing protocol. -//Number of chunks and nodes can be provided via commandline too. -func TestSyncingViaGlobalSync(t *testing.T) { - if runtime.GOOS == "darwin" && os.Getenv("TRAVIS") == "true" { - t.Skip("Flaky on mac on travis") - } - //if nodes/chunks have been provided via commandline, - //run the tests with these values - if *nodes != 0 && *chunks != 0 { - log.Info(fmt.Sprintf("Running test with %d chunks and %d nodes...", *chunks, *nodes)) - testSyncingViaGlobalSync(t, *chunks, *nodes) - } else { - var nodeCnt []int - var chnkCnt []int - //if the `longrunning` flag has been provided - //run more test combinations - if *longrunning { - chnkCnt = []int{1, 8, 32, 256, 1024} - nodeCnt = []int{16, 32, 64, 128, 256} - } else { - //default test - chnkCnt = []int{4, 32} - nodeCnt = []int{32, 16} - } - for _, chnk := range chnkCnt { - for _, n := range nodeCnt { - log.Info(fmt.Sprintf("Long running test with %d chunks and %d nodes...", chnk, n)) - testSyncingViaGlobalSync(t, chnk, n) - } - } - } -} - -func TestSyncingViaDirectSubscribe(t *testing.T) { - if runtime.GOOS == "darwin" && os.Getenv("TRAVIS") == "true" { - t.Skip("Flaky on mac on travis") - } - //if nodes/chunks have been provided via commandline, - //run the tests with these values - if *nodes != 0 && *chunks != 0 { - log.Info(fmt.Sprintf("Running test with %d chunks and %d nodes...", *chunks, *nodes)) - err := testSyncingViaDirectSubscribe(t, *chunks, *nodes) - if err != nil { - t.Fatal(err) - } - } else { - var nodeCnt []int - var chnkCnt []int - //if the `longrunning` flag has been provided - //run more test combinations - if *longrunning { - chnkCnt = []int{1, 8, 32, 256, 1024} - nodeCnt = []int{32, 16} - } else { - //default test - chnkCnt = []int{4, 32} - nodeCnt = []int{32, 16} - } - for _, chnk := range chnkCnt { - for _, n := range nodeCnt { - log.Info(fmt.Sprintf("Long running test with %d chunks and %d nodes...", chnk, n)) - err := testSyncingViaDirectSubscribe(t, chnk, n) - if err != nil { - t.Fatal(err) - } - } - } - } -} - -func testSyncingViaGlobalSync(t *testing.T, chunkCount int, nodeCount int) { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - n := ctx.Config.Node() - addr := network.NewAddr(n) - store, datadir, err := createTestLocalStorageForID(n.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(dummyRequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - DoSync: true, - SyncUpdateDelay: 3 * time.Second, - }) - bucket.Store(bucketKeyRegistry, r) - - cleanup = func() { - os.RemoveAll(datadir) - netStore.Close() - r.Close() - } - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - log.Info("Initializing test config") - - conf := &synctestConfig{} - //map of discover ID to indexes of chunks expected at that ID - conf.idToChunksMap = make(map[enode.ID][]int) - //map of overlay address to discover ID - conf.addrToIDMap = make(map[string]enode.ID) - //array where the generated chunk hashes will be stored - conf.hashes = make([]storage.Address, 0) - - err := sim.UploadSnapshot(fmt.Sprintf("testing/snapshot_%d.json", nodeCount)) - if err != nil { - t.Fatal(err) - } - - ctx, cancelSimRun := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancelSimRun() - - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - t.Fatal(err) - } - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeDrop), - ) - - go func() { - for d := range disconnections { - log.Error("peer drop", "node", d.NodeID, "peer", d.Event.Peer) - t.Fatal("unexpected disconnect") - cancelSimRun() - } - }() - - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - for _, n := range nodeIDs { - //get the kademlia overlay address from this ID - a := n.Bytes() - //append it to the array of all overlay addresses - conf.addrs = append(conf.addrs, a) - //the proximity calculation is on overlay addr, - //the p2p/simulations check func triggers on enode.ID, - //so we need to know which overlay addr maps to which nodeID - conf.addrToIDMap[string(a)] = n - } - - //get the node at that index - //this is the node selected for upload - node := sim.RandomUpNode() - item, ok := sim.NodeItem(node.ID, bucketKeyStore) - if !ok { - return fmt.Errorf("No localstore") - } - lstore := item.(*storage.LocalStore) - hashes, err := uploadFileToSingleNodeStore(node.ID, chunkCount, lstore) - if err != nil { - return err - } - conf.hashes = append(conf.hashes, hashes...) - mapKeysToNodes(conf) - - // File retrieval check is repeated until all uploaded files are retrieved from all nodes - // or until the timeout is reached. - allSuccess := false - var gDir string - var globalStore *mockdb.GlobalStore - if *useMockStore { - gDir, globalStore, err = createGlobalStore() - if err != nil { - return fmt.Errorf("Something went wrong; using mockStore enabled but globalStore is nil") - } - defer func() { - os.RemoveAll(gDir) - err := globalStore.Close() - if err != nil { - log.Error("Error closing global store! %v", "err", err) - } - }() - } - for !allSuccess { - allSuccess = true - for _, id := range nodeIDs { - //for each expected chunk, check if it is in the local store - localChunks := conf.idToChunksMap[id] - localSuccess := true - for _, ch := range localChunks { - //get the real chunk by the index in the index array - chunk := conf.hashes[ch] - log.Trace(fmt.Sprintf("node has chunk: %s:", chunk)) - //check if the expected chunk is indeed in the localstore - var err error - if *useMockStore { - //use the globalStore if the mockStore should be used; in that case, - //the complete localStore stack is bypassed for getting the chunk - _, err = globalStore.Get(common.BytesToAddress(id.Bytes()), chunk) - } else { - //use the actual localstore - item, ok := sim.NodeItem(id, bucketKeyStore) - if !ok { - return fmt.Errorf("Error accessing localstore") - } - lstore := item.(*storage.LocalStore) - _, err = lstore.Get(ctx, chunk) - } - if err != nil { - log.Warn(fmt.Sprintf("Chunk %s NOT found for id %s", chunk, id)) - localSuccess = false - // Do not get crazy with logging the warn message - time.Sleep(500 * time.Millisecond) - } else { - log.Debug(fmt.Sprintf("Chunk %s IS FOUND for id %s", chunk, id)) - } - } - if !localSuccess { - allSuccess = false - break - } - } - } - if !allSuccess { - return fmt.Errorf("Not all chunks succeeded!") - } - return nil - }) - - if result.Error != nil { - t.Fatal(result.Error) - } - log.Info("Simulation ended") -} - -/* -The test generates the given number of chunks - -For every chunk generated, the nearest node addresses -are identified, we verify that the nodes closer to the -chunk addresses actually do have the chunks in their local stores. - -The test loads a snapshot file to construct the swarm network, -assuming that the snapshot file identifies a healthy -kademlia network. The snapshot should have 'streamer' in its service list. -*/ -func testSyncingViaDirectSubscribe(t *testing.T, chunkCount int, nodeCount int) error { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - n := ctx.Config.Node() - addr := network.NewAddr(n) - store, datadir, err := createTestLocalStorageForID(n.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(dummyRequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), nil) - bucket.Store(bucketKeyRegistry, r) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - cleanup = func() { - os.RemoveAll(datadir) - netStore.Close() - r.Close() - } - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - ctx, cancelSimRun := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancelSimRun() - - conf := &synctestConfig{} - //map of discover ID to indexes of chunks expected at that ID - conf.idToChunksMap = make(map[enode.ID][]int) - //map of overlay address to discover ID - conf.addrToIDMap = make(map[string]enode.ID) - //array where the generated chunk hashes will be stored - conf.hashes = make([]storage.Address, 0) - - err := sim.UploadSnapshot(fmt.Sprintf("testing/snapshot_%d.json", nodeCount)) - if err != nil { - return err - } - - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - return err - } - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeDrop), - ) - - go func() { - for d := range disconnections { - log.Error("peer drop", "node", d.NodeID, "peer", d.Event.Peer) - t.Fatal("unexpected disconnect") - cancelSimRun() - } - }() - - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - for _, n := range nodeIDs { - //get the kademlia overlay address from this ID - a := n.Bytes() - //append it to the array of all overlay addresses - conf.addrs = append(conf.addrs, a) - //the proximity calculation is on overlay addr, - //the p2p/simulations check func triggers on enode.ID, - //so we need to know which overlay addr maps to which nodeID - conf.addrToIDMap[string(a)] = n - } - - var subscriptionCount int - - filter := simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeMsgRecv).Protocol("stream").MsgCode(4) - eventC := sim.PeerEvents(ctx, nodeIDs, filter) - - for j, node := range nodeIDs { - log.Trace(fmt.Sprintf("Start syncing subscriptions: %d", j)) - //start syncing! - item, ok := sim.NodeItem(node, bucketKeyRegistry) - if !ok { - return fmt.Errorf("No registry") - } - registry := item.(*Registry) - - var cnt int - cnt, err = startSyncing(registry, conf) - if err != nil { - return err - } - //increment the number of subscriptions we need to wait for - //by the count returned from startSyncing (SYNC subscriptions) - subscriptionCount += cnt - } - - for e := range eventC { - if e.Error != nil { - return e.Error - } - subscriptionCount-- - if subscriptionCount == 0 { - break - } - } - //select a random node for upload - node := sim.RandomUpNode() - item, ok := sim.NodeItem(node.ID, bucketKeyStore) - if !ok { - return fmt.Errorf("No localstore") - } - lstore := item.(*storage.LocalStore) - hashes, err := uploadFileToSingleNodeStore(node.ID, chunkCount, lstore) - if err != nil { - return err - } - conf.hashes = append(conf.hashes, hashes...) - mapKeysToNodes(conf) - - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - return err - } - - var gDir string - var globalStore *mockdb.GlobalStore - if *useMockStore { - gDir, globalStore, err = createGlobalStore() - if err != nil { - return fmt.Errorf("Something went wrong; using mockStore enabled but globalStore is nil") - } - defer os.RemoveAll(gDir) - } - // File retrieval check is repeated until all uploaded files are retrieved from all nodes - // or until the timeout is reached. - allSuccess := false - for !allSuccess { - allSuccess = true - for _, id := range nodeIDs { - //for each expected chunk, check if it is in the local store - localChunks := conf.idToChunksMap[id] - localSuccess := true - for _, ch := range localChunks { - //get the real chunk by the index in the index array - chunk := conf.hashes[ch] - log.Trace(fmt.Sprintf("node has chunk: %s:", chunk)) - //check if the expected chunk is indeed in the localstore - var err error - if *useMockStore { - //use the globalStore if the mockStore should be used; in that case, - //the complete localStore stack is bypassed for getting the chunk - _, err = globalStore.Get(common.BytesToAddress(id.Bytes()), chunk) - } else { - //use the actual localstore - item, ok := sim.NodeItem(id, bucketKeyStore) - if !ok { - return fmt.Errorf("Error accessing localstore") - } - lstore := item.(*storage.LocalStore) - _, err = lstore.Get(ctx, chunk) - } - if err != nil { - log.Warn(fmt.Sprintf("Chunk %s NOT found for id %s", chunk, id)) - localSuccess = false - // Do not get crazy with logging the warn message - time.Sleep(500 * time.Millisecond) - } else { - log.Debug(fmt.Sprintf("Chunk %s IS FOUND for id %s", chunk, id)) - } - } - if !localSuccess { - allSuccess = false - break - } - } - } - if !allSuccess { - return fmt.Errorf("Not all chunks succeeded!") - } - return nil - }) - - if result.Error != nil { - return result.Error - } - - log.Info("Simulation ended") - return nil -} - -//the server func to start syncing -//issues `RequestSubscriptionMsg` to peers, based on po, by iterating over -//the kademlia's `EachBin` function. -//returns the number of subscriptions requested -func startSyncing(r *Registry, conf *synctestConfig) (int, error) { - var err error - kad := r.delivery.kad - subCnt := 0 - //iterate over each bin and solicit needed subscription to bins - kad.EachBin(r.addr[:], pof, 0, func(conn *network.Peer, po int) bool { - //identify begin and start index of the bin(s) we want to subscribe to - subCnt++ - err = r.RequestSubscription(conf.addrToIDMap[string(conn.Address())], NewStream("SYNC", FormatSyncBinKey(uint8(po)), true), NewRange(0, 0), High) - if err != nil { - log.Error(fmt.Sprintf("Error in RequestSubsciption! %v", err)) - return false - } - return true - - }) - return subCnt, nil -} - -//map chunk keys to addresses which are responsible -func mapKeysToNodes(conf *synctestConfig) { - nodemap := make(map[string][]int) - //build a pot for chunk hashes - np := pot.NewPot(nil, 0) - indexmap := make(map[string]int) - for i, a := range conf.addrs { - indexmap[string(a)] = i - np, _, _ = pot.Add(np, a, pof) - } - - var kadMinProxSize = 2 - - ppmap := network.NewPeerPotMap(kadMinProxSize, conf.addrs) - - //for each address, run EachNeighbour on the chunk hashes pot to identify closest nodes - log.Trace(fmt.Sprintf("Generated hash chunk(s): %v", conf.hashes)) - for i := 0; i < len(conf.hashes); i++ { - var a []byte - np.EachNeighbour([]byte(conf.hashes[i]), pof, func(val pot.Val, po int) bool { - // take the first address - a = val.([]byte) - return false - }) - - nns := ppmap[common.Bytes2Hex(a)].NNSet - nns = append(nns, a) - - for _, p := range nns { - nodemap[string(p)] = append(nodemap[string(p)], i) - } - } - for addr, chunks := range nodemap { - //this selects which chunks are expected to be found with the given node - conf.idToChunksMap[conf.addrToIDMap[addr]] = chunks - } - log.Debug(fmt.Sprintf("Map of expected chunks by ID: %v", conf.idToChunksMap)) -} - -//upload a file(chunks) to a single local node store -func uploadFileToSingleNodeStore(id enode.ID, chunkCount int, lstore *storage.LocalStore) ([]storage.Address, error) { - log.Debug(fmt.Sprintf("Uploading to node id: %s", id)) - fileStore := storage.NewFileStore(lstore, storage.NewFileStoreParams()) - size := chunkSize - var rootAddrs []storage.Address - for i := 0; i < chunkCount; i++ { - rk, wait, err := fileStore.Store(context.TODO(), io.LimitReader(crand.Reader, int64(size)), int64(size), false) - if err != nil { - return nil, err - } - err = wait(context.TODO()) - if err != nil { - return nil, err - } - rootAddrs = append(rootAddrs, (rk)) - } - - return rootAddrs, nil -} diff --git a/swarm/network/stream/stream.go b/swarm/network/stream/stream.go deleted file mode 100644 index 1eda06c6a771..000000000000 --- a/swarm/network/stream/stream.go +++ /dev/null @@ -1,736 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "context" - "fmt" - "math" - "sync" - "time" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/stream/intervals" - "github.com/ethereum/go-ethereum/swarm/pot" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -const ( - Low uint8 = iota - Mid - High - Top - PriorityQueue = 4 // number of priority queues - Low, Mid, High, Top - PriorityQueueCap = 4096 // queue capacity - HashSize = 32 -) - -// Registry registry for outgoing and incoming streamer constructors -type Registry struct { - addr enode.ID - api *API - skipCheck bool - clientMu sync.RWMutex - serverMu sync.RWMutex - peersMu sync.RWMutex - serverFuncs map[string]func(*Peer, string, bool) (Server, error) - clientFuncs map[string]func(*Peer, string, bool) (Client, error) - peers map[enode.ID]*Peer - delivery *Delivery - intervalsStore state.Store - doRetrieve bool - maxPeerServers int -} - -// RegistryOptions holds optional values for NewRegistry constructor. -type RegistryOptions struct { - SkipCheck bool - DoSync bool - DoRetrieve bool - SyncUpdateDelay time.Duration - MaxPeerServers int // The limit of servers for each peer in registry -} - -// NewRegistry is Streamer constructor -func NewRegistry(localID enode.ID, delivery *Delivery, syncChunkStore storage.SyncChunkStore, intervalsStore state.Store, options *RegistryOptions) *Registry { - if options == nil { - options = &RegistryOptions{} - } - if options.SyncUpdateDelay <= 0 { - options.SyncUpdateDelay = 15 * time.Second - } - streamer := &Registry{ - addr: localID, - skipCheck: options.SkipCheck, - serverFuncs: make(map[string]func(*Peer, string, bool) (Server, error)), - clientFuncs: make(map[string]func(*Peer, string, bool) (Client, error)), - peers: make(map[enode.ID]*Peer), - delivery: delivery, - intervalsStore: intervalsStore, - doRetrieve: options.DoRetrieve, - maxPeerServers: options.MaxPeerServers, - } - streamer.api = NewAPI(streamer) - delivery.getPeer = streamer.getPeer - streamer.RegisterServerFunc(swarmChunkServerStreamName, func(_ *Peer, _ string, _ bool) (Server, error) { - return NewSwarmChunkServer(delivery.chunkStore), nil - }) - streamer.RegisterClientFunc(swarmChunkServerStreamName, func(p *Peer, t string, live bool) (Client, error) { - return NewSwarmSyncerClient(p, syncChunkStore, NewStream(swarmChunkServerStreamName, t, live)) - }) - RegisterSwarmSyncerServer(streamer, syncChunkStore) - RegisterSwarmSyncerClient(streamer, syncChunkStore) - - if options.DoSync { - // latestIntC function ensures that - // - receiving from the in chan is not blocked by processing inside the for loop - // - the latest int value is delivered to the loop after the processing is done - // In context of NeighbourhoodDepthC: - // after the syncing is done updating inside the loop, we do not need to update on the intermediate - // depth changes, only to the latest one - latestIntC := func(in <-chan int) <-chan int { - out := make(chan int, 1) - - go func() { - defer close(out) - - for i := range in { - select { - case <-out: - default: - } - out <- i - } - }() - - return out - } - - go func() { - // wait for kademlia table to be healthy - time.Sleep(options.SyncUpdateDelay) - - kad := streamer.delivery.kad - depthC := latestIntC(kad.NeighbourhoodDepthC()) - addressBookSizeC := latestIntC(kad.AddrCountC()) - - // initial requests for syncing subscription to peers - streamer.updateSyncing() - - for depth := range depthC { - log.Debug("Kademlia neighbourhood depth change", "depth", depth) - - // Prevent too early sync subscriptions by waiting until there are no - // new peers connecting. Sync streams updating will be done after no - // peers are connected for at least SyncUpdateDelay period. - timer := time.NewTimer(options.SyncUpdateDelay) - // Hard limit to sync update delay, preventing long delays - // on a very dynamic network - maxTimer := time.NewTimer(3 * time.Minute) - loop: - for { - select { - case <-maxTimer.C: - // force syncing update when a hard timeout is reached - log.Trace("Sync subscriptions update on hard timeout") - // request for syncing subscription to new peers - streamer.updateSyncing() - break loop - case <-timer.C: - // start syncing as no new peers has been added to kademlia - // for some time - log.Trace("Sync subscriptions update") - // request for syncing subscription to new peers - streamer.updateSyncing() - break loop - case size := <-addressBookSizeC: - log.Trace("Kademlia address book size changed on depth change", "size", size) - // new peers has been added to kademlia, - // reset the timer to prevent early sync subscriptions - if !timer.Stop() { - <-timer.C - } - timer.Reset(options.SyncUpdateDelay) - } - } - timer.Stop() - maxTimer.Stop() - } - }() - } - - return streamer -} - -// RegisterClient registers an incoming streamer constructor -func (r *Registry) RegisterClientFunc(stream string, f func(*Peer, string, bool) (Client, error)) { - r.clientMu.Lock() - defer r.clientMu.Unlock() - - r.clientFuncs[stream] = f -} - -// RegisterServer registers an outgoing streamer constructor -func (r *Registry) RegisterServerFunc(stream string, f func(*Peer, string, bool) (Server, error)) { - r.serverMu.Lock() - defer r.serverMu.Unlock() - - r.serverFuncs[stream] = f -} - -// GetClient accessor for incoming streamer constructors -func (r *Registry) GetClientFunc(stream string) (func(*Peer, string, bool) (Client, error), error) { - r.clientMu.RLock() - defer r.clientMu.RUnlock() - - f := r.clientFuncs[stream] - if f == nil { - return nil, fmt.Errorf("stream %v not registered", stream) - } - return f, nil -} - -// GetServer accessor for incoming streamer constructors -func (r *Registry) GetServerFunc(stream string) (func(*Peer, string, bool) (Server, error), error) { - r.serverMu.RLock() - defer r.serverMu.RUnlock() - - f := r.serverFuncs[stream] - if f == nil { - return nil, fmt.Errorf("stream %v not registered", stream) - } - return f, nil -} - -func (r *Registry) RequestSubscription(peerId enode.ID, s Stream, h *Range, prio uint8) error { - // check if the stream is registered - if _, err := r.GetServerFunc(s.Name); err != nil { - return err - } - - peer := r.getPeer(peerId) - if peer == nil { - return fmt.Errorf("peer not found %v", peerId) - } - - if _, err := peer.getServer(s); err != nil { - if e, ok := err.(*notFoundError); ok && e.t == "server" { - // request subscription only if the server for this stream is not created - log.Debug("RequestSubscription ", "peer", peerId, "stream", s, "history", h) - return peer.Send(context.TODO(), &RequestSubscriptionMsg{ - Stream: s, - History: h, - Priority: prio, - }) - } - return err - } - log.Trace("RequestSubscription: already subscribed", "peer", peerId, "stream", s, "history", h) - return nil -} - -// Subscribe initiates the streamer -func (r *Registry) Subscribe(peerId enode.ID, s Stream, h *Range, priority uint8) error { - // check if the stream is registered - if _, err := r.GetClientFunc(s.Name); err != nil { - return err - } - - peer := r.getPeer(peerId) - if peer == nil { - return fmt.Errorf("peer not found %v", peerId) - } - - var to uint64 - if !s.Live && h != nil { - to = h.To - } - - err := peer.setClientParams(s, newClientParams(priority, to)) - if err != nil { - return err - } - - if s.Live && h != nil { - if err := peer.setClientParams( - getHistoryStream(s), - newClientParams(getHistoryPriority(priority), h.To), - ); err != nil { - return err - } - } - - msg := &SubscribeMsg{ - Stream: s, - History: h, - Priority: priority, - } - log.Debug("Subscribe ", "peer", peerId, "stream", s, "history", h) - - return peer.SendPriority(context.TODO(), msg, priority) -} - -func (r *Registry) Unsubscribe(peerId enode.ID, s Stream) error { - peer := r.getPeer(peerId) - if peer == nil { - return fmt.Errorf("peer not found %v", peerId) - } - - msg := &UnsubscribeMsg{ - Stream: s, - } - log.Debug("Unsubscribe ", "peer", peerId, "stream", s) - - if err := peer.Send(context.TODO(), msg); err != nil { - return err - } - return peer.removeClient(s) -} - -// Quit sends the QuitMsg to the peer to remove the -// stream peer client and terminate the streaming. -func (r *Registry) Quit(peerId enode.ID, s Stream) error { - peer := r.getPeer(peerId) - if peer == nil { - log.Debug("stream quit: peer not found", "peer", peerId, "stream", s) - // if the peer is not found, abort the request - return nil - } - - msg := &QuitMsg{ - Stream: s, - } - log.Debug("Quit ", "peer", peerId, "stream", s) - - return peer.Send(context.TODO(), msg) -} - -func (r *Registry) NodeInfo() interface{} { - return nil -} - -func (r *Registry) PeerInfo(id enode.ID) interface{} { - return nil -} - -func (r *Registry) Close() error { - return r.intervalsStore.Close() -} - -func (r *Registry) getPeer(peerId enode.ID) *Peer { - r.peersMu.RLock() - defer r.peersMu.RUnlock() - - return r.peers[peerId] -} - -func (r *Registry) setPeer(peer *Peer) { - r.peersMu.Lock() - r.peers[peer.ID()] = peer - metrics.GetOrRegisterGauge("registry.peers", nil).Update(int64(len(r.peers))) - r.peersMu.Unlock() -} - -func (r *Registry) deletePeer(peer *Peer) { - r.peersMu.Lock() - delete(r.peers, peer.ID()) - metrics.GetOrRegisterGauge("registry.peers", nil).Update(int64(len(r.peers))) - r.peersMu.Unlock() -} - -func (r *Registry) peersCount() (c int) { - r.peersMu.Lock() - c = len(r.peers) - r.peersMu.Unlock() - return -} - -// Run protocol run function -func (r *Registry) Run(p *network.BzzPeer) error { - sp := NewPeer(p.Peer, r) - r.setPeer(sp) - defer r.deletePeer(sp) - defer close(sp.quit) - defer sp.close() - - if r.doRetrieve { - err := r.Subscribe(p.ID(), NewStream(swarmChunkServerStreamName, "", false), nil, Top) - if err != nil { - return err - } - } - - return sp.Run(sp.HandleMsg) -} - -// updateSyncing subscribes to SYNC streams by iterating over the -// kademlia connections and bins. If there are existing SYNC streams -// and they are no longer required after iteration, request to Quit -// them will be send to appropriate peers. -func (r *Registry) updateSyncing() { - kad := r.delivery.kad - // map of all SYNC streams for all peers - // used at the and of the function to remove servers - // that are not needed anymore - subs := make(map[enode.ID]map[Stream]struct{}) - r.peersMu.RLock() - for id, peer := range r.peers { - peer.serverMu.RLock() - for stream := range peer.servers { - if stream.Name == "SYNC" { - if _, ok := subs[id]; !ok { - subs[id] = make(map[Stream]struct{}) - } - subs[id][stream] = struct{}{} - } - } - peer.serverMu.RUnlock() - } - r.peersMu.RUnlock() - - // request subscriptions for all nodes and bins - kad.EachBin(r.addr[:], pot.DefaultPof(256), 0, func(p *network.Peer, bin int) bool { - log.Debug(fmt.Sprintf("Requesting subscription by: registry %s from peer %s for bin: %d", r.addr, p.ID(), bin)) - - // bin is always less then 256 and it is safe to convert it to type uint8 - stream := NewStream("SYNC", FormatSyncBinKey(uint8(bin)), true) - if streams, ok := subs[p.ID()]; ok { - // delete live and history streams from the map, so that it won't be removed with a Quit request - delete(streams, stream) - delete(streams, getHistoryStream(stream)) - } - err := r.RequestSubscription(p.ID(), stream, NewRange(0, 0), High) - if err != nil { - log.Debug("Request subscription", "err", err, "peer", p.ID(), "stream", stream) - return false - } - return true - }) - - // remove SYNC servers that do not need to be subscribed - for id, streams := range subs { - if len(streams) == 0 { - continue - } - peer := r.getPeer(id) - if peer == nil { - continue - } - for stream := range streams { - log.Debug("Remove sync server", "peer", id, "stream", stream) - err := r.Quit(peer.ID(), stream) - if err != nil && err != p2p.ErrShuttingDown { - log.Error("quit", "err", err, "peer", peer.ID(), "stream", stream) - } - } - } -} - -func (r *Registry) runProtocol(p *p2p.Peer, rw p2p.MsgReadWriter) error { - peer := protocols.NewPeer(p, rw, Spec) - bp := network.NewBzzPeer(peer) - np := network.NewPeer(bp, r.delivery.kad) - r.delivery.kad.On(np) - defer r.delivery.kad.Off(np) - return r.Run(bp) -} - -// HandleMsg is the message handler that delegates incoming messages -func (p *Peer) HandleMsg(ctx context.Context, msg interface{}) error { - switch msg := msg.(type) { - - case *SubscribeMsg: - return p.handleSubscribeMsg(ctx, msg) - - case *SubscribeErrorMsg: - return p.handleSubscribeErrorMsg(msg) - - case *UnsubscribeMsg: - return p.handleUnsubscribeMsg(msg) - - case *OfferedHashesMsg: - return p.handleOfferedHashesMsg(ctx, msg) - - case *TakeoverProofMsg: - return p.handleTakeoverProofMsg(ctx, msg) - - case *WantedHashesMsg: - return p.handleWantedHashesMsg(ctx, msg) - - case *ChunkDeliveryMsg: - return p.streamer.delivery.handleChunkDeliveryMsg(ctx, p, msg) - - case *RetrieveRequestMsg: - return p.streamer.delivery.handleRetrieveRequestMsg(ctx, p, msg) - - case *RequestSubscriptionMsg: - return p.handleRequestSubscription(ctx, msg) - - case *QuitMsg: - return p.handleQuitMsg(msg) - - default: - return fmt.Errorf("unknown message type: %T", msg) - } -} - -type server struct { - Server - stream Stream - priority uint8 - currentBatch []byte -} - -// Server interface for outgoing peer Streamer -type Server interface { - SetNextBatch(uint64, uint64) (hashes []byte, from uint64, to uint64, proof *HandoverProof, err error) - GetData(context.Context, []byte) ([]byte, error) - Close() -} - -type client struct { - Client - stream Stream - priority uint8 - sessionAt uint64 - to uint64 - next chan error - quit chan struct{} - - intervalsKey string - intervalsStore state.Store -} - -func peerStreamIntervalsKey(p *Peer, s Stream) string { - return p.ID().String() + s.String() -} - -func (c client) AddInterval(start, end uint64) (err error) { - i := &intervals.Intervals{} - err = c.intervalsStore.Get(c.intervalsKey, i) - if err != nil { - return err - } - i.Add(start, end) - return c.intervalsStore.Put(c.intervalsKey, i) -} - -func (c client) NextInterval() (start, end uint64, err error) { - i := &intervals.Intervals{} - err = c.intervalsStore.Get(c.intervalsKey, i) - if err != nil { - return 0, 0, err - } - start, end = i.Next() - return start, end, nil -} - -// Client interface for incoming peer Streamer -type Client interface { - NeedData(context.Context, []byte) func(context.Context) error - BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) - Close() -} - -func (c *client) nextBatch(from uint64) (nextFrom uint64, nextTo uint64) { - if c.to > 0 && from >= c.to { - return 0, 0 - } - if c.stream.Live { - return from, 0 - } else if from >= c.sessionAt { - if c.to > 0 { - return from, c.to - } - return from, math.MaxUint64 - } - nextFrom, nextTo, err := c.NextInterval() - if err != nil { - log.Error("next intervals", "stream", c.stream) - return - } - if nextTo > c.to { - nextTo = c.to - } - if nextTo == 0 { - nextTo = c.sessionAt - } - return -} - -func (c *client) batchDone(p *Peer, req *OfferedHashesMsg, hashes []byte) error { - if tf := c.BatchDone(req.Stream, req.From, hashes, req.Root); tf != nil { - tp, err := tf() - if err != nil { - return err - } - if err := p.SendPriority(context.TODO(), tp, c.priority); err != nil { - return err - } - if c.to > 0 && tp.Takeover.End >= c.to { - return p.streamer.Unsubscribe(p.Peer.ID(), req.Stream) - } - return nil - } - // TODO: make a test case for testing if the interval is added when the batch is done - if err := c.AddInterval(req.From, req.To); err != nil { - return err - } - return nil -} - -func (c *client) close() { - select { - case <-c.quit: - default: - close(c.quit) - } - c.Close() -} - -// clientParams store parameters for the new client -// between a subscription and initial offered hashes request handling. -type clientParams struct { - priority uint8 - to uint64 - // signal when the client is created - clientCreatedC chan struct{} -} - -func newClientParams(priority uint8, to uint64) *clientParams { - return &clientParams{ - priority: priority, - to: to, - clientCreatedC: make(chan struct{}), - } -} - -func (c *clientParams) waitClient(ctx context.Context) error { - select { - case <-ctx.Done(): - return ctx.Err() - case <-c.clientCreatedC: - return nil - } -} - -func (c *clientParams) clientCreated() { - close(c.clientCreatedC) -} - -// Spec is the spec of the streamer protocol -var Spec = &protocols.Spec{ - Name: "stream", - Version: 7, - MaxMsgSize: 10 * 1024 * 1024, - Messages: []interface{}{ - UnsubscribeMsg{}, - OfferedHashesMsg{}, - WantedHashesMsg{}, - TakeoverProofMsg{}, - SubscribeMsg{}, - RetrieveRequestMsg{}, - ChunkDeliveryMsg{}, - SubscribeErrorMsg{}, - RequestSubscriptionMsg{}, - QuitMsg{}, - }, -} - -func (r *Registry) Protocols() []p2p.Protocol { - return []p2p.Protocol{ - { - Name: Spec.Name, - Version: Spec.Version, - Length: Spec.Length(), - Run: r.runProtocol, - // NodeInfo: , - // PeerInfo: , - }, - } -} - -func (r *Registry) APIs() []rpc.API { - return []rpc.API{ - { - Namespace: "stream", - Version: "3.0", - Service: r.api, - Public: true, - }, - } -} - -func (r *Registry) Start(server *p2p.Server) error { - log.Info("Streamer started") - return nil -} - -func (r *Registry) Stop() error { - return nil -} - -type Range struct { - From, To uint64 -} - -func NewRange(from, to uint64) *Range { - return &Range{ - From: from, - To: to, - } -} - -func (r *Range) String() string { - return fmt.Sprintf("%v-%v", r.From, r.To) -} - -func getHistoryPriority(priority uint8) uint8 { - if priority == 0 { - return 0 - } - return priority - 1 -} - -func getHistoryStream(s Stream) Stream { - return NewStream(s.Name, s.Key, false) -} - -type API struct { - streamer *Registry -} - -func NewAPI(r *Registry) *API { - return &API{ - streamer: r, - } -} - -func (api *API) SubscribeStream(peerId enode.ID, s Stream, history *Range, priority uint8) error { - return api.streamer.Subscribe(peerId, s, history, priority) -} - -func (api *API) UnsubscribeStream(peerId enode.ID, s Stream) error { - return api.streamer.Unsubscribe(peerId, s) -} diff --git a/swarm/network/stream/streamer_test.go b/swarm/network/stream/streamer_test.go deleted file mode 100644 index 0bdebefa7d3c..000000000000 --- a/swarm/network/stream/streamer_test.go +++ /dev/null @@ -1,917 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "bytes" - "context" - "errors" - "strconv" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto/sha3" - p2ptest "github.com/ethereum/go-ethereum/p2p/testing" -) - -func TestStreamerSubscribe(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - err = streamer.Subscribe(tester.Nodes[0].ID(), stream, NewRange(0, 0), Top) - if err == nil || err.Error() != "stream foo not registered" { - t.Fatalf("Expected error %v, got %v", "stream foo not registered", err) - } -} - -func TestStreamerRequestSubscription(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", false) - err = streamer.RequestSubscription(tester.Nodes[0].ID(), stream, &Range{}, Top) - if err == nil || err.Error() != "stream foo not registered" { - t.Fatalf("Expected error %v, got %v", "stream foo not registered", err) - } -} - -var ( - hash0 = sha3.Sum256([]byte{0}) - hash1 = sha3.Sum256([]byte{1}) - hash2 = sha3.Sum256([]byte{2}) - hashesTmp = append(hash0[:], hash1[:]...) - hashes = append(hashesTmp, hash2[:]...) - corruptHashes = append(hashes[:40]) -) - -type testClient struct { - t string - wait0 chan bool - wait2 chan bool - batchDone chan bool - receivedHashes map[string][]byte -} - -func newTestClient(t string) *testClient { - return &testClient{ - t: t, - wait0: make(chan bool), - wait2: make(chan bool), - batchDone: make(chan bool), - receivedHashes: make(map[string][]byte), - } -} - -func (self *testClient) NeedData(ctx context.Context, hash []byte) func(context.Context) error { - self.receivedHashes[string(hash)] = hash - if bytes.Equal(hash, hash0[:]) { - return func(context.Context) error { - <-self.wait0 - return nil - } - } else if bytes.Equal(hash, hash2[:]) { - return func(context.Context) error { - <-self.wait2 - return nil - } - } - return nil -} - -func (self *testClient) BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) { - close(self.batchDone) - return nil -} - -func (self *testClient) Close() {} - -type testServer struct { - t string -} - -func newTestServer(t string) *testServer { - return &testServer{ - t: t, - } -} - -func (self *testServer) SetNextBatch(from uint64, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) { - return make([]byte, HashSize), from + 1, to + 1, nil, nil -} - -func (self *testServer) GetData(context.Context, []byte) ([]byte, error) { - return nil, nil -} - -func (self *testServer) Close() { -} - -func TestStreamerDownstreamSubscribeUnsubscribeMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { - return newTestClient(t), nil - }) - - node := tester.Nodes[0] - - stream := NewStream("foo", "", true) - err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges( - p2ptest.Exchange{ - Label: "Subscribe message", - Expects: []p2ptest.Expect{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - // trigger OfferedHashesMsg to actually create the client - p2ptest.Exchange{ - Label: "OfferedHashes message", - Triggers: []p2ptest.Trigger{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: hashes, - From: 5, - To: 8, - Stream: stream, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 2, - Msg: &WantedHashesMsg{ - Stream: stream, - Want: []byte{5}, - From: 9, - To: 0, - }, - Peer: node.ID(), - }, - }, - }, - ) - if err != nil { - t.Fatal(err) - } - - err = streamer.Unsubscribe(node.ID(), stream) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Unsubscribe message", - Expects: []p2ptest.Expect{ - { - Code: 0, - Msg: &UnsubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerUpstreamSubscribeUnsubscribeMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", false) - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t), nil - }) - - node := tester.Nodes[0] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 6, - To: 9, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "unsubscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &UnsubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t), nil - }) - - node := tester.Nodes[0] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 1, - To: 1, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "unsubscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &UnsubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerUpstreamSubscribeErrorMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t), nil - }) - - stream := NewStream("bar", "", true) - - node := tester.Nodes[0] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 7, - Msg: &SubscribeErrorMsg{ - Error: "stream bar not registered", - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerUpstreamSubscribeLiveAndHistory(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return &testServer{ - t: t, - }, nil - }) - - node := tester.Nodes[0] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: NewStream("foo", "", false), - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 6, - To: 9, - }, - Peer: node.ID(), - }, - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - From: 1, - To: 1, - Hashes: make([]byte, HashSize), - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerDownstreamCorruptHashesMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - - var tc *testClient - - streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { - tc = newTestClient(t) - return tc, nil - }) - - node := tester.Nodes[0] - - err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Expects: []p2ptest.Expect{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - p2ptest.Exchange{ - Label: "Corrupt offered hash message", - Triggers: []p2ptest.Trigger{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: corruptHashes, - From: 5, - To: 8, - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - if err != nil { - t.Fatal(err) - } - - expectedError := errors.New("Message handler error: (msg code 1): error invalid hashes length (len: 40)") - if err := tester.TestDisconnected(&p2ptest.Disconnect{Peer: tester.Nodes[0].ID(), Error: expectedError}); err != nil { - t.Fatal(err) - } -} - -func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - - var tc *testClient - - streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { - tc = newTestClient(t) - return tc, nil - }) - - node := tester.Nodes[0] - - err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Expects: []p2ptest.Expect{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - p2ptest.Exchange{ - Label: "WantedHashes message", - Triggers: []p2ptest.Trigger{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: hashes, - From: 5, - To: 8, - Stream: stream, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 2, - Msg: &WantedHashesMsg{ - Stream: stream, - Want: []byte{5}, - From: 9, - To: 0, - }, - Peer: node.ID(), - }, - }, - }) - if err != nil { - t.Fatal(err) - } - - if len(tc.receivedHashes) != 3 { - t.Fatalf("Expected number of received hashes %v, got %v", 3, len(tc.receivedHashes)) - } - - close(tc.wait0) - - timeout := time.NewTimer(100 * time.Millisecond) - defer timeout.Stop() - - select { - case <-tc.batchDone: - t.Fatal("batch done early") - case <-timeout.C: - } - - close(tc.wait2) - - timeout2 := time.NewTimer(10000 * time.Millisecond) - defer timeout2.Stop() - - select { - case <-tc.batchDone: - case <-timeout2.C: - t.Fatal("timeout waiting batchdone call") - } - -} - -func TestStreamerRequestSubscriptionQuitMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t), nil - }) - - node := tester.Nodes[0] - - stream := NewStream("foo", "", true) - err = streamer.RequestSubscription(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges( - p2ptest.Exchange{ - Label: "RequestSubscription message", - Expects: []p2ptest.Expect{ - { - Code: 8, - Msg: &RequestSubscriptionMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: NewStream("foo", "", false), - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 6, - To: 9, - }, - Peer: node.ID(), - }, - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - From: 1, - To: 1, - Hashes: make([]byte, HashSize), - }, - Peer: node.ID(), - }, - }, - }, - ) - if err != nil { - t.Fatal(err) - } - - err = streamer.Quit(node.ID(), stream) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Quit message", - Expects: []p2ptest.Expect{ - { - Code: 9, - Msg: &QuitMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - historyStream := getHistoryStream(stream) - - err = streamer.Quit(node.ID(), historyStream) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Quit message", - Expects: []p2ptest.Expect{ - { - Code: 9, - Msg: &QuitMsg{ - Stream: historyStream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -// TestMaxPeerServersWithUnsubscribe creates a registry with a limited -// number of stream servers, and performs a test with subscriptions and -// unsubscriptions, checking if unsubscriptions will remove streams, -// leaving place for new streams. -func TestMaxPeerServersWithUnsubscribe(t *testing.T) { - var maxPeerServers = 6 - tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{ - MaxPeerServers: maxPeerServers, - }) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t), nil - }) - - node := tester.Nodes[0] - - for i := 0; i < maxPeerServers+10; i++ { - stream := NewStream("foo", strconv.Itoa(i), true) - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 1, - To: 1, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "unsubscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &UnsubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - } -} - -// TestMaxPeerServersWithoutUnsubscribe creates a registry with a limited -// number of stream servers, and performs subscriptions to detect subscriptions -// error message exchange. -func TestMaxPeerServersWithoutUnsubscribe(t *testing.T) { - var maxPeerServers = 6 - tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{ - MaxPeerServers: maxPeerServers, - }) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t), nil - }) - - node := tester.Nodes[0] - - for i := 0; i < maxPeerServers+10; i++ { - stream := NewStream("foo", strconv.Itoa(i), true) - - if i >= maxPeerServers { - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 7, - Msg: &SubscribeErrorMsg{ - Error: ErrMaxPeerServers.Error(), - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - continue - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 1, - To: 1, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - } -} diff --git a/swarm/network/stream/syncer.go b/swarm/network/stream/syncer.go deleted file mode 100644 index 38b3078d2fd6..000000000000 --- a/swarm/network/stream/syncer.go +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "context" - "math" - "strconv" - "time" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -const ( - BatchSize = 128 -) - -// SwarmSyncerServer implements an Server for history syncing on bins -// offered streams: -// * live request delivery with or without checkback -// * (live/non-live historical) chunk syncing per proximity bin -type SwarmSyncerServer struct { - po uint8 - store storage.SyncChunkStore - sessionAt uint64 - start uint64 - live bool - quit chan struct{} -} - -// NewSwarmSyncerServer is contructor for SwarmSyncerServer -func NewSwarmSyncerServer(live bool, po uint8, syncChunkStore storage.SyncChunkStore) (*SwarmSyncerServer, error) { - sessionAt := syncChunkStore.BinIndex(po) - var start uint64 - if live { - start = sessionAt - } - return &SwarmSyncerServer{ - po: po, - store: syncChunkStore, - sessionAt: sessionAt, - start: start, - live: live, - quit: make(chan struct{}), - }, nil -} - -func RegisterSwarmSyncerServer(streamer *Registry, syncChunkStore storage.SyncChunkStore) { - streamer.RegisterServerFunc("SYNC", func(p *Peer, t string, live bool) (Server, error) { - po, err := ParseSyncBinKey(t) - if err != nil { - return nil, err - } - return NewSwarmSyncerServer(live, po, syncChunkStore) - }) - // streamer.RegisterServerFunc(stream, func(p *Peer) (Server, error) { - // return NewOutgoingProvableSwarmSyncer(po, db) - // }) -} - -// Close needs to be called on a stream server -func (s *SwarmSyncerServer) Close() { - close(s.quit) -} - -// GetData retrieves the actual chunk from netstore -func (s *SwarmSyncerServer) GetData(ctx context.Context, key []byte) ([]byte, error) { - chunk, err := s.store.Get(ctx, storage.Address(key)) - if err != nil { - return nil, err - } - return chunk.Data(), nil -} - -// GetBatch retrieves the next batch of hashes from the dbstore -func (s *SwarmSyncerServer) SetNextBatch(from, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) { - var batch []byte - i := 0 - if s.live { - if from == 0 { - from = s.start - } - if to <= from || from >= s.sessionAt { - to = math.MaxUint64 - } - } else { - if (to < from && to != 0) || from > s.sessionAt { - return nil, 0, 0, nil, nil - } - if to == 0 || to > s.sessionAt { - to = s.sessionAt - } - } - - var ticker *time.Ticker - defer func() { - if ticker != nil { - ticker.Stop() - } - }() - var wait bool - for { - if wait { - if ticker == nil { - ticker = time.NewTicker(1000 * time.Millisecond) - } - select { - case <-ticker.C: - case <-s.quit: - return nil, 0, 0, nil, nil - } - } - - metrics.GetOrRegisterCounter("syncer.setnextbatch.iterator", nil).Inc(1) - err := s.store.Iterator(from, to, s.po, func(key storage.Address, idx uint64) bool { - batch = append(batch, key[:]...) - i++ - to = idx - return i < BatchSize - }) - if err != nil { - return nil, 0, 0, nil, err - } - if len(batch) > 0 { - break - } - wait = true - } - - log.Trace("Swarm syncer offer batch", "po", s.po, "len", i, "from", from, "to", to, "current store count", s.store.BinIndex(s.po)) - return batch, from, to, nil, nil -} - -// SwarmSyncerClient -type SwarmSyncerClient struct { - sessionAt uint64 - nextC chan struct{} - sessionRoot storage.Address - sessionReader storage.LazySectionReader - retrieveC chan *storage.Chunk - storeC chan *storage.Chunk - store storage.SyncChunkStore - // chunker storage.Chunker - currentRoot storage.Address - requestFunc func(chunk *storage.Chunk) - end, start uint64 - peer *Peer - stream Stream -} - -// NewSwarmSyncerClient is a contructor for provable data exchange syncer -func NewSwarmSyncerClient(p *Peer, store storage.SyncChunkStore, stream Stream) (*SwarmSyncerClient, error) { - return &SwarmSyncerClient{ - store: store, - peer: p, - stream: stream, - }, nil -} - -// // NewIncomingProvableSwarmSyncer is a contructor for provable data exchange syncer -// func NewIncomingProvableSwarmSyncer(po int, priority int, index uint64, sessionAt uint64, intervals []uint64, sessionRoot storage.Address, chunker *storage.PyramidChunker, store storage.ChunkStore, p Peer) *SwarmSyncerClient { -// retrieveC := make(storage.Chunk, chunksCap) -// RunChunkRequestor(p, retrieveC) -// storeC := make(storage.Chunk, chunksCap) -// RunChunkStorer(store, storeC) -// s := &SwarmSyncerClient{ -// po: po, -// priority: priority, -// sessionAt: sessionAt, -// start: index, -// end: index, -// nextC: make(chan struct{}, 1), -// intervals: intervals, -// sessionRoot: sessionRoot, -// sessionReader: chunker.Join(sessionRoot, retrieveC), -// retrieveC: retrieveC, -// storeC: storeC, -// } -// return s -// } - -// // StartSyncing is called on the Peer to start the syncing process -// // the idea is that it is called only after kademlia is close to healthy -// func StartSyncing(s *Streamer, peerId enode.ID, po uint8, nn bool) { -// lastPO := po -// if nn { -// lastPO = maxPO -// } -// -// for i := po; i <= lastPO; i++ { -// s.Subscribe(peerId, "SYNC", newSyncLabel("LIVE", po), 0, 0, High, true) -// s.Subscribe(peerId, "SYNC", newSyncLabel("HISTORY", po), 0, 0, Mid, false) -// } -// } - -// RegisterSwarmSyncerClient registers the client constructor function for -// to handle incoming sync streams -func RegisterSwarmSyncerClient(streamer *Registry, store storage.SyncChunkStore) { - streamer.RegisterClientFunc("SYNC", func(p *Peer, t string, live bool) (Client, error) { - return NewSwarmSyncerClient(p, store, NewStream("SYNC", t, live)) - }) -} - -// NeedData -func (s *SwarmSyncerClient) NeedData(ctx context.Context, key []byte) (wait func(context.Context) error) { - return s.store.FetchFunc(ctx, key) -} - -// BatchDone -func (s *SwarmSyncerClient) BatchDone(stream Stream, from uint64, hashes []byte, root []byte) func() (*TakeoverProof, error) { - // TODO: reenable this with putter/getter refactored code - // if s.chunker != nil { - // return func() (*TakeoverProof, error) { return s.TakeoverProof(stream, from, hashes, root) } - // } - return nil -} - -func (s *SwarmSyncerClient) TakeoverProof(stream Stream, from uint64, hashes []byte, root storage.Address) (*TakeoverProof, error) { - // for provable syncer currentRoot is non-zero length - // TODO: reenable this with putter/getter - // if s.chunker != nil { - // if from > s.sessionAt { // for live syncing currentRoot is always updated - // //expRoot, err := s.chunker.Append(s.currentRoot, bytes.NewReader(hashes), s.retrieveC, s.storeC) - // expRoot, _, err := s.chunker.Append(s.currentRoot, bytes.NewReader(hashes), s.retrieveC) - // if err != nil { - // return nil, err - // } - // if !bytes.Equal(root, expRoot) { - // return nil, fmt.Errorf("HandoverProof mismatch") - // } - // s.currentRoot = root - // } else { - // expHashes := make([]byte, len(hashes)) - // _, err := s.sessionReader.ReadAt(expHashes, int64(s.end*HashSize)) - // if err != nil && err != io.EOF { - // return nil, err - // } - // if !bytes.Equal(expHashes, hashes) { - // return nil, errors.New("invalid proof") - // } - // } - // return nil, nil - // } - s.end += uint64(len(hashes)) / HashSize - takeover := &Takeover{ - Stream: stream, - Start: s.start, - End: s.end, - Root: root, - } - // serialise and sign - return &TakeoverProof{ - Takeover: takeover, - Sig: nil, - }, nil -} - -func (s *SwarmSyncerClient) Close() {} - -// base for parsing and formating sync bin key -// it must be 2 <= base <= 36 -const syncBinKeyBase = 36 - -// FormatSyncBinKey returns a string representation of -// Kademlia bin number to be used as key for SYNC stream. -func FormatSyncBinKey(bin uint8) string { - return strconv.FormatUint(uint64(bin), syncBinKeyBase) -} - -// ParseSyncBinKey parses the string representation -// and returns the Kademlia bin number. -func ParseSyncBinKey(s string) (uint8, error) { - bin, err := strconv.ParseUint(s, syncBinKeyBase, 8) - if err != nil { - return 0, err - } - return uint8(bin), nil -} diff --git a/swarm/network/stream/syncer_test.go b/swarm/network/stream/syncer_test.go deleted file mode 100644 index f2be3bef99ea..000000000000 --- a/swarm/network/stream/syncer_test.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package stream - -import ( - "context" - crand "crypto/rand" - "fmt" - "io" - "io/ioutil" - "math" - "os" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/simulation" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" - mockdb "github.com/ethereum/go-ethereum/swarm/storage/mock/db" -) - -const dataChunkCount = 200 - -func TestSyncerSimulation(t *testing.T) { - testSyncBetweenNodes(t, 2, 1, dataChunkCount, true, 1) - testSyncBetweenNodes(t, 4, 1, dataChunkCount, true, 1) - testSyncBetweenNodes(t, 8, 1, dataChunkCount, true, 1) - testSyncBetweenNodes(t, 16, 1, dataChunkCount, true, 1) -} - -func createMockStore(globalStore *mockdb.GlobalStore, id enode.ID, addr *network.BzzAddr) (lstore storage.ChunkStore, datadir string, err error) { - address := common.BytesToAddress(id.Bytes()) - mockStore := globalStore.NewNodeStore(address) - params := storage.NewDefaultLocalStoreParams() - - datadir, err = ioutil.TempDir("", "localMockStore-"+id.TerminalString()) - if err != nil { - return nil, "", err - } - params.Init(datadir) - params.BaseKey = addr.Over() - lstore, err = storage.NewLocalStore(params, mockStore) - return lstore, datadir, nil -} - -func testSyncBetweenNodes(t *testing.T, nodes, conns, chunkCount int, skipCheck bool, po uint8) { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - var store storage.ChunkStore - var globalStore *mockdb.GlobalStore - var gDir, datadir string - - node := ctx.Config.Node() - addr := network.NewAddr(node) - //hack to put addresses in same space - addr.OAddr[0] = byte(0) - - if *useMockStore { - gDir, globalStore, err = createGlobalStore() - if err != nil { - return nil, nil, fmt.Errorf("Something went wrong; using mockStore enabled but globalStore is nil") - } - store, datadir, err = createMockStore(globalStore, node.ID(), addr) - } else { - store, datadir, err = createTestLocalStorageForID(node.ID(), addr) - } - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - store.Close() - os.RemoveAll(datadir) - if *useMockStore { - err := globalStore.Close() - if err != nil { - log.Error("Error closing global store! %v", "err", err) - } - os.RemoveAll(gDir) - } - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyDB, netStore) - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - bucket.Store(bucketKeyDelivery, delivery) - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - SkipCheck: skipCheck, - }) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - // create context for simulation run - timeout := 30 * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) - // defer cancel should come before defer simulation teardown - defer cancel() - - _, err := sim.AddNodesAndConnectChain(nodes) - if err != nil { - t.Fatal(err) - } - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - - nodeIndex := make(map[enode.ID]int) - for i, id := range nodeIDs { - nodeIndex[id] = i - } - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Type(p2p.PeerEventTypeDrop), - ) - - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "node", d.NodeID, "peer", d.Event.Peer) - t.Fatal(d.Error) - } - } - }() - - // each node Subscribes to each other's swarmChunkServerStreamName - for j := 0; j < nodes-1; j++ { - id := nodeIDs[j] - client, err := sim.Net.GetNode(id).Client() - if err != nil { - t.Fatal(err) - } - sid := nodeIDs[j+1] - client.CallContext(ctx, nil, "stream_subscribeStream", sid, NewStream("SYNC", FormatSyncBinKey(1), false), NewRange(0, 0), Top) - if err != nil { - return err - } - if j > 0 || nodes == 2 { - item, ok := sim.NodeItem(nodeIDs[j], bucketKeyFileStore) - if !ok { - return fmt.Errorf("No filestore") - } - fileStore := item.(*storage.FileStore) - size := chunkCount * chunkSize - _, wait, err := fileStore.Store(ctx, io.LimitReader(crand.Reader, int64(size)), int64(size), false) - if err != nil { - t.Fatal(err.Error()) - } - wait(ctx) - } - } - // here we distribute chunks of a random file into stores 1...nodes - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - return err - } - - // collect hashes in po 1 bin for each node - hashes := make([][]storage.Address, nodes) - totalHashes := 0 - hashCounts := make([]int, nodes) - for i := nodes - 1; i >= 0; i-- { - if i < nodes-1 { - hashCounts[i] = hashCounts[i+1] - } - item, ok := sim.NodeItem(nodeIDs[i], bucketKeyDB) - if !ok { - return fmt.Errorf("No DB") - } - netStore := item.(*storage.NetStore) - netStore.Iterator(0, math.MaxUint64, po, func(addr storage.Address, index uint64) bool { - hashes[i] = append(hashes[i], addr) - totalHashes++ - hashCounts[i]++ - return true - }) - } - var total, found int - for _, node := range nodeIDs { - i := nodeIndex[node] - - for j := i; j < nodes; j++ { - total += len(hashes[j]) - for _, key := range hashes[j] { - item, ok := sim.NodeItem(nodeIDs[j], bucketKeyDB) - if !ok { - return fmt.Errorf("No DB") - } - db := item.(*storage.NetStore) - _, err := db.Get(ctx, key) - if err == nil { - found++ - } - } - } - log.Debug("sync check", "node", node, "index", i, "bin", po, "found", found, "total", total) - } - if total == found && total > 0 { - return nil - } - return fmt.Errorf("Total not equallying found: total is %d", total) - }) - - if result.Error != nil { - t.Fatal(result.Error) - } -} diff --git a/swarm/network/stream/testing/snapshot_128.json b/swarm/network/stream/testing/snapshot_128.json deleted file mode 100644 index 9b5eb501d3ac..000000000000 --- a/swarm/network/stream/testing/snapshot_128.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","private_key":"73015943fd2c673001da6bf6658a12a22e057fc545ac0ebc78421f90f1370093","name":"node_a9e0b763852706722dc904b494293f9399c0fa32255890aa720285b8160335bb618f36b68a81b875a805384179f600defef474d486b4ea04b003ef6477ab7907","services":["streamer"],"enable_msg_events":true,"port":63042},"up":true}},{"node":{"config":{"id":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","private_key":"89cbfe6d806f2aeaee6a59667df3c3059ff7531bb33d64661586b004fcb6b831","name":"node_87e696a354d249493217dc4e0190082f30e09616873803efa376871d4b34f86f0eeb4643d4822d8a0fbcdedb27cd6ba5438e98943d358d960c4835e82261c93e","services":["streamer"],"enable_msg_events":true,"port":63043},"up":true}},{"node":{"config":{"id":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","private_key":"ff2ac479a33dc7fff5f87e4bb3078dfbcbb1567b76e35792faf104a383ebf896","name":"node_18bb6572965f4263c5a4d59a73027abc57a46122125ee58d871e95c993e6a1e8230438ce696a5f8880a08749837268b54319f7b0aa254c1a5bd453a8e9bcf84f","services":["streamer"],"enable_msg_events":true,"port":63044},"up":true}},{"node":{"config":{"id":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","private_key":"4800e21ac6431c61873444c525e207b48bb7a09ba2793b482ba6cf8cce81e353","name":"node_3103510e00a3f49a5e715719049fc8c9c67a2373a548f326458aeb6d9c75ed92b94373638fd075def0209113b4e85d972c23f064539f7b041596184e40d7f9a2","services":["streamer"],"enable_msg_events":true,"port":63045},"up":true}},{"node":{"config":{"id":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","private_key":"7e26b011ae2eabac951145e7840169b1f279577c06c40b4ba3a62da3ddb58de5","name":"node_077d2d032874e5ce70e9b928b7fe72c0326ba92394e16245e31d48b5731d3d32bfd86acf40825decff54bcd735e9ebfd94eba677c418ea7007baec9db4af676d","services":["streamer"],"enable_msg_events":true,"port":63046},"up":true}},{"node":{"config":{"id":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","private_key":"1fbf6b44eeb20ef012046cf8b7d3400ef3e586586aaf1cf6a2e5115ff5e3d868","name":"node_d90a81a583c82d626b92f27244f027da4a0ae76e6d3bdc1de0af7be01798f1fb04b34ce60c6d8651a39d7a70915438a4aa63e5adf844a9f7e38dbf0b1dba754d","services":["streamer"],"enable_msg_events":true,"port":63047},"up":true}},{"node":{"config":{"id":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","private_key":"f32eafbb366e4b7655d302a06aac2e62ff8f4b9c07bb18175e58e534193b8554","name":"node_31ac37862416c0e229c4a088ec179f23bdd1bf12dd464eb11c630ad531d7c3438671862e5458e2f6fbb32b857f857e6b8c17e5d93eb29a0e78bb5a65d7eb648c","services":["streamer"],"enable_msg_events":true,"port":63048},"up":true}},{"node":{"config":{"id":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","private_key":"6a809d9de0380db0b8bae8769cf41f9b05576137d0e2eefa69b7ddd921c6ac77","name":"node_1e3c83cabbe6852c987ae521b7fcb33185cf855c59b6235ebb8e57a6f860ccc159ddc01b4a21d251c8faca4559ceb271e046a51493ba148c0d3aed97ad208969","services":["streamer"],"enable_msg_events":true,"port":63049},"up":true}},{"node":{"config":{"id":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","private_key":"f23b80b698ec97210ddaa65807a07cee7b411018ddd96c9d700e92a83120cf9e","name":"node_2fdb4382c4bc2950948a8cff13a7df65627bc0b20661cae20fd29acab166c97701594ee3151d75c006ba86d1d68b624b1d1f78e3d1e2fc297844956ef82208a8","services":["streamer"],"enable_msg_events":true,"port":63050},"up":true}},{"node":{"config":{"id":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","private_key":"d2d74e454118a6e150810c74080ee7707b92b4575e7fe13c8887caf521cc734d","name":"node_87fce129511a1be2777052d24b606acdfe7067f4e874ab04674a68664b378ea208975f7269a72af889d3d23cd930b6a181afa2cdef3f9f9491f715bd96ad8dc0","services":["streamer"],"enable_msg_events":true,"port":63051},"up":true}},{"node":{"config":{"id":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","private_key":"cdc72a1d2e475117e77abccdee1816e4d84fb059d712b717e8bd063239b6fd58","name":"node_c773af3af01ee8ab9fa8d06987baf4f10c394fdd386d69b7a7362f4b68fd6fc082337d3b33a19d584c5801a3e9198225d7b61f6629e34ce823be70908339f4c7","services":["streamer"],"enable_msg_events":true,"port":63052},"up":true}},{"node":{"config":{"id":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","private_key":"b1b2452fe8ea070ff3b181fdc538144e1231f0c6f467713712662375dc6c4bb1","name":"node_56b25623ac935f3a8aac1e2603a6bd15ace1e5714671954b47f2cab960cf47922828f415105602408d0a732a893ebeea6f9afab7f889bb235c81589548d09391","services":["streamer"],"enable_msg_events":true,"port":63053},"up":true}},{"node":{"config":{"id":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","private_key":"e87535b0ec914ff93ea21f722eff61dd6cfea4f5542f68aab0af93c58e2afc25","name":"node_09b60de1e85bb6f7d2caf5b1ab58204d7d04531ece300dcd7bcc9157b8b3ef2a182758808a0eec6056034f29f52caadb7c690f498c1c8832ff7a6a9ecff308bd","services":["streamer"],"enable_msg_events":true,"port":63054},"up":true}},{"node":{"config":{"id":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","private_key":"3ae9a961f597c04b695a6d25fd0e6e47b131854f55f89d8ac25cce7411aa4107","name":"node_f2ea93f43be9d0c3fa21f1496dc13c778977a6afdcba24c8b146de7dca2cdde62a5b792aab969e5b4b6c56f63066b336580d911f206049cc24cac32a25fc4306","services":["streamer"],"enable_msg_events":true,"port":63055},"up":true}},{"node":{"config":{"id":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","private_key":"1676fda16b41e3ec275f0d30ad691055248be71252ad15422b9c0260671aaf4c","name":"node_872cdbb6d74fb55fd2d51877ef7804bdd2eeb6de0297eb2ce18b67e52379b147d54a46d2385ec9293eb21736bed4191d92c5c75e8e81fc5a6c691970e019f570","services":["streamer"],"enable_msg_events":true,"port":63056},"up":true}},{"node":{"config":{"id":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","private_key":"6c989b24f2387e5a639effc8cd15b6d60c587fd14615496c9463d1f1a7ff6ad5","name":"node_da3e0fd71eb96ba2cab7f920d32f5425d1aad41d00765fdffb0b215d9dd5b60e2bc5929eafebee5b2b5a11aec164e141beff19d828aac7d1fabd3ffb0bfb8450","services":["streamer"],"enable_msg_events":true,"port":63057},"up":true}},{"node":{"config":{"id":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","private_key":"a1befe78e67ca8b4972ba564c3bd03ad2ca6b996ded22166468d7a268a4c77d3","name":"node_489660042a8867d90a16ebb013968db26ca3edfc70f53320f511e35b3703eed09fbd787be5c06726a570a54aa15d129cd10db741523adf297929f909be4a0c71","services":["streamer"],"enable_msg_events":true,"port":63058},"up":true}},{"node":{"config":{"id":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","private_key":"6b9ad7d1da45cff60c3bdcac68f0af30e0a6e0e30e4ad73731c00368e9b0254a","name":"node_4448a59bde9edb93edcdb4a77f3e2277b9c01ffea45496ee0533eb5192955a08a0f982e25cf772e0dae68735a55b7acd221f6ba7b134f1e999087bee182330e8","services":["streamer"],"enable_msg_events":true,"port":63059},"up":true}},{"node":{"config":{"id":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","private_key":"157e46312708757a331443dd95e1a0c012502430f4a8f8756f0aeaf35bde1f6d","name":"node_73319a301ad3cf0ec09549d817c9523d61b74abb0cad87b737d41d900321e52722a84355f6f87bc7a5f848818c89a021bb0f3e5994f67c9a7b5bbfc98188a376","services":["streamer"],"enable_msg_events":true,"port":63060},"up":true}},{"node":{"config":{"id":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","private_key":"11148e1d9812b7bb8870b7960332ba4b32ea6aa43a57f9a27c30c2fafb609570","name":"node_caad8529d498a4a1e1ba7573689a913500bd409345ef8e3656abca748269eb73b919282f7f2eb0087f81f7bc52c367657ac8be0cdac65d2490c7c50c874444b7","services":["streamer"],"enable_msg_events":true,"port":63061},"up":true}},{"node":{"config":{"id":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","private_key":"896c3ee65d71ddcbf6030b920c0bf7748971170583e45fa2e33c19b3222e3945","name":"node_44462055ba68fdef337dd19d8123aace9a12284c13bc97687416b6b4ca0c94234ba7db6823651fc021d6ac1539e0c5321e763a7a12c9e7c8a583aac5369817d8","services":["streamer"],"enable_msg_events":true,"port":63062},"up":true}},{"node":{"config":{"id":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","private_key":"043c2adc5bdb3449b2f770e1207eac21128e77e89c9e1fe8876cecf1792f8b24","name":"node_ecbdca037cd7892752345b48b4219478b1b334f83ce7140fcc72eb71784436b690ce7a41b03e013cefc19d64a34a20cfef1b9e2b535d938bcdcb39fe63645a42","services":["streamer"],"enable_msg_events":true,"port":63063},"up":true}},{"node":{"config":{"id":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","private_key":"88f2cc06ba260e7c09cdd93e48c55c000d7a988ef65ccfc5331d1eac3c66d7b1","name":"node_51ba4faf0988717a37dcddc0a60a70ead33bde310184fc450f9ca73c67f931e6767ad5930bcf409e5aeb613a9ff7a03e47de6fc13b33d8af0b87b38822ae6888","services":["streamer"],"enable_msg_events":true,"port":63064},"up":true}},{"node":{"config":{"id":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","private_key":"8c64fc376a830b9237a1d1609a24e18396eb82cd6cd64b8ff572c9f946aaab2c","name":"node_750ca601f07d65f426f6ea5f34e06238f9d7a931f022f9b0ebc811943d3725500cb3c6f00c8d05eb8d5b353c6534136dff38b9a8d3d4dc5bf49cd96875704d07","services":["streamer"],"enable_msg_events":true,"port":63065},"up":true}},{"node":{"config":{"id":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","private_key":"545e42fc4dfd38b62f1481fe46895a3cb9c6632930c8df8358d66a3988e6fe72","name":"node_41994605708232b4ca7448c3bc0760a7b86bf26d442091e5ce6e92eac94925721d7e0eca04bdd03bb1bba1ef92deeccd4bf1b7c6c3318b7e8d031965c6646761","services":["streamer"],"enable_msg_events":true,"port":63066},"up":true}},{"node":{"config":{"id":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","private_key":"3e5b24d432307724a3e619c479ad5c87a93c6ee96d2b6ab0dad17da7e84eea55","name":"node_28afc20d8f4779b285bb14870062dbb54796ec77623302e51bc1bafed9e2c35751c8469ffc482718e059875dfa2226195ed10999e251498cba3a444896cb67db","services":["streamer"],"enable_msg_events":true,"port":63067},"up":true}},{"node":{"config":{"id":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","private_key":"cab0eaf666548a84a7ceb4a34a29b7079c66b0df29e7fd315e851e02a8c9a5ed","name":"node_805d784527be4e32e84ddf045baee1ccf348cdf8288de3aae1a5379f762576b957525ef358d9b42c68a93394017880adc09bb2b1b5e01102dc7e4240baf2af95","services":["streamer"],"enable_msg_events":true,"port":63068},"up":true}},{"node":{"config":{"id":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","private_key":"8c48ba58bc5ac8c0f3f0295c73df1572e80465f15a97f1c5537735474b11da89","name":"node_9c6dcfef0e128dbfeca58b8ac625b08fb447b0d579bd3f18bc0e2be60d1ec2274595d0554ddba0ca7eb660099d3ea146d8076792b46c93841d2ecf8cf608f5ba","services":["streamer"],"enable_msg_events":true,"port":63069},"up":true}},{"node":{"config":{"id":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","private_key":"0939af4a1ac3398bd818e5ac35e1003530a80a0abba5bf4c586664ab0b15a391","name":"node_6ce3a68cb1e2924ad97f22006094c709a3dd8b4ca1546fbb037f841a9e5ac62def242015dbf6221bda610153db064edcbb58a78a35a06077b8c02bf5b2a33c04","services":["streamer"],"enable_msg_events":true,"port":63070},"up":true}},{"node":{"config":{"id":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","private_key":"bfdc13ed4844405928ae3f67e209353779af203143a9f43fd8d1fc899ddd56a7","name":"node_178d5ce398a7114a63a0c953a59932e769891420f6b1544f08c082cd37b531b66757652d279b3036b03b04f8d46eceb0b46fb95646c6668e2921af75c06c3d97","services":["streamer"],"enable_msg_events":true,"port":63071},"up":true}},{"node":{"config":{"id":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","private_key":"d52f5bca67f434e20d72348971b791cb18def6182b002a3342c721ed06e9ad84","name":"node_59730132a01ba848a3c050bb6234bca9a72deba33716960fc3ec89b186bfcd313b9bbf049939d5805ff98db2c53a9421ce6ec97d8b4cdbaea53ba264d80d0734","services":["streamer"],"enable_msg_events":true,"port":63072},"up":true}},{"node":{"config":{"id":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","private_key":"7d5751c36a856dbc2403a058a432e1f2bd142ae438444db9febdaa22480dd404","name":"node_93987e431a0058f2e942ccf8d3486d249cd2734d6494131b343e2c3a8fdd86cfcb12d0aaaf8fcb911ad3cdd682cc82118198195a7fdc915ab7853223f012eab6","services":["streamer"],"enable_msg_events":true,"port":63073},"up":true}},{"node":{"config":{"id":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","private_key":"5cb8cc7f27d0f0e28e9ca55b592a38839058155cfce8528b5a464f98025eb54d","name":"node_665c3288c14dc1c17d85d17d634910f42183482c7e77c47e68f9b4f475b93e8c152246b9e34781606315ff6ef0f8360342500d15e4a2d67d9df6b72f30af64a7","services":["streamer"],"enable_msg_events":true,"port":63074},"up":true}},{"node":{"config":{"id":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","private_key":"3901f39cd02354a635723259be3a5e7c28de3f7406c889fc9353d3adb22b9d82","name":"node_562119edffe8270f6f7a5ad9b13d4c65d643e52a2331d1fee16f7e9b5567f44cfea62df3e8965a22cf08db8fa918f0a0bcae8da2936677e6d25bc88ed85ed2f1","services":["streamer"],"enable_msg_events":true,"port":63075},"up":true}},{"node":{"config":{"id":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","private_key":"4e740dfca715720a19f56d32d6b9783810e1d6da09425e01dfbe3b55714416c0","name":"node_2502fc8ee0ccda79ad1dbd9c7cec625da85980b9116bdd56dc367d508039e25e5f65183293006e5b0df72fa9037a48bd2b133a757940d3587ff77ae2392e3eaf","services":["streamer"],"enable_msg_events":true,"port":63076},"up":true}},{"node":{"config":{"id":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","private_key":"765219c4fea7ac80a0c5d26a096829226933310ad22d889ee19eb23915363fda","name":"node_e9f7e58fda4b504275441d51929fbc98214abdc9ed552c7aa94c600a85d4e791d60c032304b29ae028adccec94984fc9a3d705a81462632f50ef45024eb0f64e","services":["streamer"],"enable_msg_events":true,"port":63077},"up":true}},{"node":{"config":{"id":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","private_key":"edf1f1608ee4b7c320472a071f2d60d53c7b74e58fba190b5353e92056f30751","name":"node_9e6c1c6e871638182c4b54ac89352ef5c2bca0a99424a1369013e7c182883da0e8d7ab96b3c8254c31fa315b941d8ddee153157626821fc78c2cae951c1c9053","services":["streamer"],"enable_msg_events":true,"port":63078},"up":true}},{"node":{"config":{"id":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","private_key":"16e405179555f907062a85c408713f0fa46a5f1f6714c99272bb705ae226b2a5","name":"node_bfef26733f5196a11484bcc28d88776e747189ae7cec883ff39a27cfeee6d9d1efb34560c9f8e75eec43fc069a2ce5f0c78107a36cc8a569d37bd5306aecf23a","services":["streamer"],"enable_msg_events":true,"port":63079},"up":true}},{"node":{"config":{"id":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","private_key":"8337241aad3fa93ccc78bab1ff15a2aa218fbd7d026bffe74b7dadd8e6aa787f","name":"node_f6a07a1d361a4671e997d5eaadae61736291aff3896cb69f06bbc19bf7536dd152e0b15422b2fd9f8a9d2f9a251c9a07d0140319900e2cc9f25a59025c7dc91f","services":["streamer"],"enable_msg_events":true,"port":63080},"up":true}},{"node":{"config":{"id":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","private_key":"af0eb33b99b22cff74cc8137b4bb9477f8f47c895a61807279436daefaf9cac8","name":"node_08900197e74e285a5a8a9cc53fbd420bb35043ab27eb2d9eab22615e736a093abfa235c17f667dcc791cb50b9022082eafd9fba030194cc84f0358b769adc85b","services":["streamer"],"enable_msg_events":true,"port":63081},"up":true}},{"node":{"config":{"id":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","private_key":"3c9a377e5ae9212adee118e04b3cd9cead5b4830ee51492dffbec8f015b5b757","name":"node_afb5754b4748b7ac5628e32b242c90aab0e2fc7da58d8d5c8c775d13d8a6fd32240f1b89021587858168cbe7b3ea7ad07807728655eae0a9907060494a7c99ca","services":["streamer"],"enable_msg_events":true,"port":63082},"up":true}},{"node":{"config":{"id":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","private_key":"5ccc64d0c951c9f50f0f7053504f54f965e22a22fb06b0bd14f206d72d822fa6","name":"node_8f625a4e4f4fd980c796d3aa535e58a39722492480cf6982d43fab02de63a5b4c1b5c7cd8402171dd792bb5d9c3e2bdd38176c061dbe3e5b0592af1339e3fd82","services":["streamer"],"enable_msg_events":true,"port":63083},"up":true}},{"node":{"config":{"id":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","private_key":"f44a9e23990fd65de4da61711cb5a720a4474421ea0a653c7ce5ed76149b335d","name":"node_ab3814579882e9fd8d464f4f3c8a421be37822ba7f42c5f5e787e81125ec032f9ccf90a138c0b57f0a813b55b583f80d66284f795e2c82d80d2869e1fc770be5","services":["streamer"],"enable_msg_events":true,"port":63084},"up":true}},{"node":{"config":{"id":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","private_key":"4fd7ee5ba8003bb9b914612e6283cf5738550412c71e4475e07eb8bef32e96a4","name":"node_670949178a5fad22da03af1e206c814a797c0e9eb4e3371f83612f121e5b56e767706a3ae36628cd0c86dd7bd1586ca4df57e2de27b28a31284ecf9176d330e5","services":["streamer"],"enable_msg_events":true,"port":63085},"up":true}},{"node":{"config":{"id":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","private_key":"d0df7b482eb60b2f1ed4c2562768f60fe5ee8997e542bc9c7310db55391553d4","name":"node_fd12c5c96df6ee76dd7beb9e4e4768dda4d2c498851b6435f13ca0175980d0e4a4ff1c002e4daf41a995f118500604764f88496fb9b2c22e28308d8649b525ce","services":["streamer"],"enable_msg_events":true,"port":63086},"up":true}},{"node":{"config":{"id":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","private_key":"7771ce12670dba4c28198f6df284ad58c9ca877a25ceb912ec3af5ac83f6e143","name":"node_ed1ab28230ed533abf25633508d54f32bbff78a10c7a15fad5c2320cda9d9669c6d0e15689d8885400e64cbcd81730456f8f4bd5c98681d2cd8a8d4e1daec553","services":["streamer"],"enable_msg_events":true,"port":63087},"up":true}},{"node":{"config":{"id":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","private_key":"97cc28baaa8c94c905d348295eb19ef607599d22742989105d03eff39a5d6d51","name":"node_a05a18161c2d01a0f122548c66509dd1fcf3ee52975035bc79fb059e9613b743a16cd6f5ac54090e68f51bcf76ff21fb3805ba3197a96b4236afb80f791df802","services":["streamer"],"enable_msg_events":true,"port":63088},"up":true}},{"node":{"config":{"id":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","private_key":"9f191333ec4b20a2380317b819e71ffc234e63e85ec57548c407e1740c07f41f","name":"node_c89dbada7195464e732671ac6fff014cacfb4c879b63b6b84e7c1bce367522f759bd06e504b15f43a1735c6322356747fa5c4951882d4fd6cdf6f7cf13726719","services":["streamer"],"enable_msg_events":true,"port":63089},"up":true}},{"node":{"config":{"id":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","private_key":"9b597a8aa9ae03a20ec963fd3eeaca13823d7efd28a70c4c44ebfa6e147bb24a","name":"node_51302ef7b50922398ad802e917390bb4a3c24c877f2c2bcb7fcb34de9feca22673a2c594639914fe46a28837ffadfd03bb673afbc856aff5e59caf8e76082482","services":["streamer"],"enable_msg_events":true,"port":63090},"up":true}},{"node":{"config":{"id":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","private_key":"342dbb181da6045ae41eacef680b93f58765c7c5d65713f25f8b0627863c7983","name":"node_a40391285d1a97f1fb368b20c8e4d02be1bdebc0db41f00f99aac2f01893dc12256cd5a711117a981fbb3f9dfea18c19cf3603e925dbd67c4032b22b41eab8d5","services":["streamer"],"enable_msg_events":true,"port":63091},"up":true}},{"node":{"config":{"id":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","private_key":"af173c26c979843230716c1a7f4aade4f9a19a23e2ee665d0a0ecae0f793188e","name":"node_e0420ba2a293315d810928a0e09a507c6aaf93977ba2c7598e9b83723b4a66682398ea17542c26767c7ff0f4ca09c537d3cc10dad283f079f1de73e25e87cb5c","services":["streamer"],"enable_msg_events":true,"port":63092},"up":true}},{"node":{"config":{"id":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","private_key":"4598804bbccfa26a362afa9773f283bfbc0ab7660240791e38f7ba858e45280d","name":"node_33e3ab7108ced43102003c3b3192b194100f32b6bcb67bb772ea9696e35721196699cf01e443f7cdf8076ad83aaf7468b75c71d03efb95f4c07cf0742ea9af81","services":["streamer"],"enable_msg_events":true,"port":63093},"up":true}},{"node":{"config":{"id":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","private_key":"253935f834190e90b6bf0646618d2992233bf386ea31a58770e1926cb063050c","name":"node_cbed12dcab0aa04a96ec7e25bc2ee03b337c7b2006391baa7d2aff042c17ec70b82c5fb2dc916d085a7948541719d329f9b528b67ec6adb1ac2cc594d4ef1e42","services":["streamer"],"enable_msg_events":true,"port":63094},"up":true}},{"node":{"config":{"id":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","private_key":"f6d280904f13397798c441bffafc78ab98461c9d84f01f4b9b73de50d5595fd0","name":"node_03d2d77c008b5fa1063b1abc3152b879a529fe4fdb2dc174d6d85312264a38ee4cc49b342507a10fff1a4b0730f1ef8e008b0897d97bfd6f70050adb124d3596","services":["streamer"],"enable_msg_events":true,"port":63095},"up":true}},{"node":{"config":{"id":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","private_key":"5237d9097b72efee4e45c4d3d14e320e49ded470809478f3ccf6a9a7cf732d74","name":"node_f0299035cbddfdf7a78e5e3a400aaedf2d719d04e907ac0f9f067525e2f9bb913d985308a3a0d05467a64adf58c68a615c6327acf716c23631d0e829903f8b34","services":["streamer"],"enable_msg_events":true,"port":63096},"up":true}},{"node":{"config":{"id":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","private_key":"a8d169922df4dcd07e1f102e3eae5692eb87b1f368124cb5c65fcca22f9743aa","name":"node_276256790c9317d09ff7802f4ad0a85840fe62527390ce1790e1e3186e8b3f04acfaa41dcd02303d333423678a4037e4f4854676e79ced3232a3dbd772cc2680","services":["streamer"],"enable_msg_events":true,"port":63097},"up":true}},{"node":{"config":{"id":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","private_key":"8b927156a8aa7b6cc711c9c2ce3016cab2e9d1ce220e9792207cc5b40fca3047","name":"node_155805f787600f9f9518cf8836f491885b64868bfe0023975bcd12776925a424fb5aa3199dc178e83294e97f347a373d05d2422578a08eeeb2d15a178d28964f","services":["streamer"],"enable_msg_events":true,"port":63098},"up":true}},{"node":{"config":{"id":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","private_key":"d2b8d940f626faf3204dd38721f5528e1c9db4b5d0cc28d0d627c7d191c1f21f","name":"node_4de606aa7e722197b918c5f7f0db86a3081d48e89d21428b04f19c3ff3755eac0bddbff5fad8bda94b9e57f58fba2fecdbabbf710f7afb381bf4f1a4fe55cd93","services":["streamer"],"enable_msg_events":true,"port":63099},"up":true}},{"node":{"config":{"id":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","private_key":"1cd1a1e084096aa4f8f9933b0871657638dad24b3f47d18c9eb0007595ce46f1","name":"node_82a774be7146766585d2bec6b69b7803aa956f492a53d8ed5f071becdbbc617562885d8430f0afd505210aab7b032428fbea32c82dffbd12d9ccba776ef4729b","services":["streamer"],"enable_msg_events":true,"port":63100},"up":true}},{"node":{"config":{"id":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","private_key":"8ec23f2c16d923996d6bd74aa374cb6e5a69fab748ea8efa538d01a12ac62e16","name":"node_340420ee18d55913f790d0fcc2305b40b1e7bef2eddb79dda57801690aeeead693ebd1a9ff8557671f5ae136b3e65733306924bd00444cbc6e7c6235e5a2c77f","services":["streamer"],"enable_msg_events":true,"port":63101},"up":true}},{"node":{"config":{"id":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","private_key":"b7a9a55daea83c1d769fe68e820de46f4a8df4c425ea7ab98a44cb7ad3c7963e","name":"node_7a509686ebce91778fe22e834a94ab03f92457d41385099ba657fe62c7469a9669bddb9a3d7b0150efa1d2f40c69bc786c7f4ede1cf8b19411eea1d23cb7d56c","services":["streamer"],"enable_msg_events":true,"port":63102},"up":true}},{"node":{"config":{"id":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","private_key":"c1478fa3ebc5b2bd2a32567455e71e73a1787b1c8c6571fd94ee0d487d5fea4d","name":"node_816e91fa8ff68ba067a89390ef61e7f23211e5e05049daa103ad1ff84b94fbcf535a6f6b515fb571939f5656869767c608513808800baba7e5d2b5f3a17a9691","services":["streamer"],"enable_msg_events":true,"port":63103},"up":true}},{"node":{"config":{"id":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","private_key":"bb118c1ce93cddc4fb540863d575d6ae584ebc2f2e2f221c9622cc105e7fd7b9","name":"node_77327983685f39f006806170fe351063a58ff1bd8dedc222d538e86cfd18abdfefd548328f25fc5afde8170aa5c35311353019468f2b439c331837ddfbb25a52","services":["streamer"],"enable_msg_events":true,"port":63104},"up":true}},{"node":{"config":{"id":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","private_key":"7cbe501dc7bdd1bafc62c5c56af215559b06aef4ed398d4a3acdb78f3c84a735","name":"node_7a18392b8338108a996196ee190a93a1b9954c8e05a062c421da513a1828dfa739e7b224878c0670cf74bbc743c7ca7ee8cfee6b6a602fe1f4a82ecfbd38c2f4","services":["streamer"],"enable_msg_events":true,"port":63105},"up":true}},{"node":{"config":{"id":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","private_key":"e853260ddb20771587ed33007ef55b07368a08f79ea0a64cf9830ab69498238f","name":"node_e7bb63c5187ee85d965fed5cb33d1678c0e090b4e4c3f3d859755565db18046cb60025453bdebf136373c416a2e6e56be063bca6c9257b7b175dcf966e274205","services":["streamer"],"enable_msg_events":true,"port":63106},"up":true}},{"node":{"config":{"id":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","private_key":"23c3dd23f790b16480c58305ab528346a7046dddd1d9f5c699a4963bfb926fb3","name":"node_545850cb90787d49c579b1ed54a753ebd00eaafe3f1bd04d57266e4912fb1cdd654446ef054a973a583ce8dfc6cc130b6f90e63bcf75372fc21c445f8e1e6005","services":["streamer"],"enable_msg_events":true,"port":63107},"up":true}},{"node":{"config":{"id":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","private_key":"e0f2a273dc23035aaf88bb97d7f5ccf57ee6304b184e7d61183556b28040076b","name":"node_86b84ddf64d301f6a9c4504c59eb4031d3167fb74101abea3b694845a009dc522be7b2e2720097ceea9f36058e160f42a2a438a33034929a5c1a7793c7ccef7b","services":["streamer"],"enable_msg_events":true,"port":63108},"up":true}},{"node":{"config":{"id":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","private_key":"dacac1dfd252a4ad8878c023bd34aa1bc81b63d66d70c8ba9aafcfa8425bb253","name":"node_bf1e6eeb8b229f63b49213db499b71dcfe0ae45ee3f14685c7cbfa3f0a2150e52a89c853f4cd8c7a92e6e5f6083044efddfa17391662e3cff6290da679520404","services":["streamer"],"enable_msg_events":true,"port":63109},"up":true}},{"node":{"config":{"id":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","private_key":"57a2dcb70aa306ae204744fce4dd4b4ad9b02516e080dca195604406e240627c","name":"node_a58a2dd3f5ee2471f0ddd555ffcc45d86e2d8c325585e3fe55eee878b8a626faccce73679d32811fc5d068c153e671673f4cd020f3c7fb37bc6fd9646931646a","services":["streamer"],"enable_msg_events":true,"port":63110},"up":true}},{"node":{"config":{"id":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","private_key":"4314dbd43bea3cdbe75a24ef256ee0dca9008f5133f8b1d6c9adf9a84210c2e1","name":"node_896c74ca4cc4cbb9d2b6606d0ebfd6427952c2e16aedbf36933fa3d01f1c505fcd663f3d01c0cf096bef9cfd0bae4595ec7c221cfc362e19a5b7c60614a9658b","services":["streamer"],"enable_msg_events":true,"port":63111},"up":true}},{"node":{"config":{"id":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","private_key":"2b4bd5ee9da5de0932418460699900ba0e40139dc910b087c586210e52816b77","name":"node_1e0a46ff50fb6d9a2c218a851763ff86c42e4d61dddffb7188481febc0f3180bc8f31973d336b2a6e25802acd4fed6d905d89c6d4d7d8080fb12741f9c5ab7e6","services":["streamer"],"enable_msg_events":true,"port":63112},"up":true}},{"node":{"config":{"id":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","private_key":"dd2b5c2e466c7276ff4c6c1a641ac204a34ddcb145523ab175701ba31faf44de","name":"node_b2bea653b6ec9629c6f934be72fccf30acf836698e21e81dd8085f070ba8259ba43eee43c342738a4b782f5fbddd44caa28f56dffc08237ca7567c965ac3beca","services":["streamer"],"enable_msg_events":true,"port":63113},"up":true}},{"node":{"config":{"id":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","private_key":"17f5b5341d575c1cfe673efd9957ca29a50fa23c028c5f5f7561b23e7dc92e04","name":"node_5771bef7f50439f9b81d2a7bf7060b1ad4b38675d8f6abbac3cc4c215fb0cb5dd07f6873545b42218337556925566025476e2915b7b98e662a3dcd28bebf0eb4","services":["streamer"],"enable_msg_events":true,"port":63114},"up":true}},{"node":{"config":{"id":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","private_key":"eeb9367b7cabbd3e4076edb5fb97cc2fba7445cf37f523685f2b24e617d718c3","name":"node_0e8c1a6b70524c4fdc492c74348bac4ccd5d140bd41352607e8cfba45561afb1e6e12f3e2fcf03c1778c9ae5ae19cb9218ee2d613983768f54e3f54e69bb6600","services":["streamer"],"enable_msg_events":true,"port":63115},"up":true}},{"node":{"config":{"id":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","private_key":"a9a6414dc37916ed5794a644a51d6cc1c23c27d707b2dfb9957f9ee28af64e60","name":"node_d71c50805f284ed3a759e2e81f220fbc73d6d0a7a261b4c9e7878c3da143cfc07afa83e1635b6a45530f71a60b9f17c485a2fd6617c6c2bff82bacc71c208087","services":["streamer"],"enable_msg_events":true,"port":63116},"up":true}},{"node":{"config":{"id":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","private_key":"29c714e8c1983b179cad17ffaa617cfbdd50272b496803b4a602afdb05d78117","name":"node_06472c89def07fa73188d253cf1acddc2be984842f3a234edb3db95449ba74928ab1395eca1b8978987769863afffb488fc27c9ac723aa24837b66c12f38d735","services":["streamer"],"enable_msg_events":true,"port":63117},"up":true}},{"node":{"config":{"id":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","private_key":"f00cf99cd4b64e4242b7c878a4ce70044f1fe91966dd723b940e3a312f1b9f63","name":"node_eb097186ff58d96a7ead7a7f9c05a44075d84537bd4fd3f82857bf2c45bee1c6dece434a7707cde69e96f02366859cab4c991fdb7615e113a868d4b9c7524a45","services":["streamer"],"enable_msg_events":true,"port":63118},"up":true}},{"node":{"config":{"id":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","private_key":"d089b29e9ea18a2cf17256e0e06c907164f712564fbebce476b40f67e39bcc73","name":"node_57bfbde13c71e035c96513870aa8215198f78806e7cdb01c54fbdb392de2c40386d768d6fdc4c68534a67e531867ca74d8ca4dcf34ff7f7f64ec35edee3e5f68","services":["streamer"],"enable_msg_events":true,"port":63119},"up":true}},{"node":{"config":{"id":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","private_key":"219f34180d582584fdc64b9b7712bb15e490bcb2eaa2f4d2847f838196c6afe0","name":"node_5b4de68680c5d1a75cccd5e7a82319c031f5d61d79cbb6532e1254ab81c833c3fafb54390cca7a770e84690c490fcba90482b35321870f8506335a2f57cc052e","services":["streamer"],"enable_msg_events":true,"port":63120},"up":true}},{"node":{"config":{"id":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","private_key":"223faa782246247751eeb3191f8823874455005721e6738d5f5b5b631cda858b","name":"node_cd0e9a45b45f9a67417fcde29d9f92c45ca4db46eebbfe47dcf6999e23e549e4205f42ada8e3fcd00e2fb5f832bb92a27a59b43c4a5909148d81399c2e8ce492","services":["streamer"],"enable_msg_events":true,"port":63121},"up":true}},{"node":{"config":{"id":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","private_key":"2e3b422e1762ce5c22bc9cd6fa78cfb62f3ada7732d7e0b16d91ecc5f5ab9047","name":"node_5d917ffc9d70a38670941ce206aa7ea1b9ea65c1d783f14ebdf7c7afa6ca8b237112aaa9b1a3f757132093a604ef378280c5bdef02c2688049a91a412c399bfe","services":["streamer"],"enable_msg_events":true,"port":63122},"up":true}},{"node":{"config":{"id":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","private_key":"a3f487830e9fd87b5b404bc91d0f49d866cddfa869d32c08853273b9a2eaea7b","name":"node_26cf4ea45b9a76daab82a57126f9c6f8726d2eb973e205ab4ab69c8b8be11a32a7eb5c3807e952cd428ce5ddd88f143d4fc9ff8c3de3d159855675afce715615","services":["streamer"],"enable_msg_events":true,"port":63123},"up":true}},{"node":{"config":{"id":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","private_key":"9a3fe8b50af54e2b6ea84f05b832426f911dd557e1e874bb291075981a46baa7","name":"node_20f171ab01a814a2856a6cbe7929269f18f6329914289515e2cb9d078ac14ebdae457789dd638c6415b062799114570f556147d4bf9ac850f00b6d0762765ac1","services":["streamer"],"enable_msg_events":true,"port":63124},"up":true}},{"node":{"config":{"id":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","private_key":"8e83e239128a2ef402e58ceaffa0fe2d59d913588d12536ba4e7a88bac14ab5a","name":"node_f0b2f1e8d46be656109adb18c60677ac9eb8fce7f42e15d9dbb25f94b4e426064780eaf32b79954b9bb72ea89953175da8de35380aaba18931cca374a7de2b11","services":["streamer"],"enable_msg_events":true,"port":63125},"up":true}},{"node":{"config":{"id":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","private_key":"81b194e85dff3ff43272bbf73e58a6dac8a9e3ad125f7ba3e71cb5de5341a975","name":"node_a6ca1d5340f2d7021f541c81cf9aea519675462c8443bb6ddd93919962561b8f5a8431c3ec7e7e7d46c600b653e9a0638d2bb07cf4e29516bf9c4d3653f451b0","services":["streamer"],"enable_msg_events":true,"port":63126},"up":true}},{"node":{"config":{"id":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","private_key":"b4ec9b24f6a962422bb63d20e415a5dc2f85168297e8abed3cb20e3fc0d70e25","name":"node_d8cfadac10473b31a4560c711636a05615f13054388065344642ff1d04246fb62eafeec06805264eafead111ed8134e11a8e21f42a0eb950c23b142e627bd8cb","services":["streamer"],"enable_msg_events":true,"port":63127},"up":true}},{"node":{"config":{"id":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","private_key":"cd0667c4d17b56321858cceaca611f1c46758fa276d3d991f3a9fbb0c686af3a","name":"node_49eb706cd7e95ad78502a508487d88b818861d94334aee36b2acef5c25cfff5c0efc2df9dc5dbb18acd4003d5cc0c843d3b40363adf2f62a14c04d814268fdee","services":["streamer"],"enable_msg_events":true,"port":63128},"up":true}},{"node":{"config":{"id":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","private_key":"4556340931a4e95daa2043706f516eba3744d2ba4340bcb95358b58c95534090","name":"node_c93cb2df7ba6de8009872f5f7565891040d42e3b193ef1cdb321a0c167cc8fb8138900982bb8f6918fbaefac6e02dda01ee40f7a6beba1990dd44abe03cc3d01","services":["streamer"],"enable_msg_events":true,"port":63129},"up":true}},{"node":{"config":{"id":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","private_key":"f1b36e9da20cfc2416f02f9194a0522b426be8679b6478118962624b4963af27","name":"node_3e9c0bbd146d8b1040b4f379eecf802c27c4d0a70e64a9fb2e941a7edab9b00396b0b67fc5c891652743cdba3b342973ed49615b32da54b925954a799240431c","services":["streamer"],"enable_msg_events":true,"port":63130},"up":true}},{"node":{"config":{"id":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","private_key":"7f720ab5ccb4e3dbca347ff7104c677d8215261910d8e8e2ade703020d566842","name":"node_b38213eaa5b419de787b70073ad8c7c819e48c5f76dec1507b54f1d7cb027211facbe7a170ac50212abe130935e8947d5a19d6b13790114e71cc18357902a889","services":["streamer"],"enable_msg_events":true,"port":63131},"up":true}},{"node":{"config":{"id":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","private_key":"1a4d1e1d6e198ac61f91d9ccba4212fdd32e9075df2fda41caa11a0a25e694f0","name":"node_20bdc859d58d8bf419df64fd6ee1d4363c1d5f403af3abef2720d7d3933924672e12e23e5d76b28e0f6726acf58bdc5eb258cba635e327cbd0b564523305da75","services":["streamer"],"enable_msg_events":true,"port":63132},"up":true}},{"node":{"config":{"id":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","private_key":"9fc5b25f84b416e8224c296213b062e1dec7eb7074402a494a23cc1c70ef394b","name":"node_c6d1404873174254c0f15f25804da9a9d90db9c11c5cc895fab613b4deb7820f1733680b4ba9e4b61a664642ed6ee9ff012e13a0619c64ae067be6bab26962c6","services":["streamer"],"enable_msg_events":true,"port":63133},"up":true}},{"node":{"config":{"id":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","private_key":"43a6ff2fe67bdd16cdd0a4e7ba3eb8188632a796b90d34b477fcb5e0f5ba0b43","name":"node_f04c3ae9fe957a14c249acf3ea2e8407d04d108fc01e75f6d52aaf5073b3450025012d138a75b857473eea4d20e57c99b92bff9041f269d995543d7c67a92ec6","services":["streamer"],"enable_msg_events":true,"port":63134},"up":true}},{"node":{"config":{"id":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","private_key":"9202da3ce5dfea8df87f9f6145867414b45131634f70cd32dffffeb8975e0e86","name":"node_8e8de10fb3f53bd3a48455ebfa0a38ea5bd28c607e65506b263ece53a24d2361c2af7d7cd207e45b11bf71a3c33fa325fc8fd40a18b9c73019cce219c757c7ef","services":["streamer"],"enable_msg_events":true,"port":63135},"up":true}},{"node":{"config":{"id":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","private_key":"6f53e22eece8ebd80ce64720dacf85c36c8aa737fe54d05c884ae9ad693144fb","name":"node_cdd86dea7dde96ff7cc1e3248fd17d107c83f2cc7ce2111c41530448962763309e91a05b5dad4663d0e02db59ed4129ab0c3e1eedc42c654e39d29f99038063b","services":["streamer"],"enable_msg_events":true,"port":63136},"up":true}},{"node":{"config":{"id":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","private_key":"ba12a0d7056bd5d7f8b80a1e30c126d8641ec4a20b2e8c9b890764785350cb7f","name":"node_da15d60a4b9a8816ce24c20f6c941c51229c1fb5e070b8b29be2977c2f7b41f8f17e4b6efe75f465e7935ded1ba17472f046eac73393db7197018fa86d11c31f","services":["streamer"],"enable_msg_events":true,"port":63137},"up":true}},{"node":{"config":{"id":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","private_key":"f68a07d7241789486ffebae385ee73f2b9050d22612e9770a1aad1870e347556","name":"node_03e478a3aae82e06e215e40272a420037a61442d11c49c367a5ee6a21868d29a17ea8b9284f013d020c4740f296a6a22bc64d33d1c2807f9ab8dc48c0cfec18a","services":["streamer"],"enable_msg_events":true,"port":63138},"up":true}},{"node":{"config":{"id":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","private_key":"f9fa950ad709b5c36e36f5f49a4260ab81e08145d8c10611a2d46e1395ac87f6","name":"node_3df030a522a157e36f6b369aab048b9287792743a411a47073c4f9ef7686528f39bf7bf91c48e4d46afe180c8d08430b012bd216d50876baa3b1e7bc17cb55ef","services":["streamer"],"enable_msg_events":true,"port":63139},"up":true}},{"node":{"config":{"id":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","private_key":"27eb2337ccaec369a786c3e86e92bfc20b6bd03e70244b7d1266e783f087a16f","name":"node_4bd17847bdf60ea93a670a84a0ff8fe028d35228e814d6ebc0ae4fa586ddef03cd79390d541d28ca3c05a7241ffe92ac182e63c251176b40db8fe05fefaa82be","services":["streamer"],"enable_msg_events":true,"port":63140},"up":true}},{"node":{"config":{"id":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","private_key":"dc23bae09e0ef5811f615cd80fa3c264a5011f501f3fa6f91cf6772a408ba5b3","name":"node_f8052e328014f39157036f3dcecdb23419c0959473a88282605f10add681ef5cbfb1e926b522f98b8401272113b677a67225874d1afb0bff4b11140cc071de44","services":["streamer"],"enable_msg_events":true,"port":63141},"up":true}},{"node":{"config":{"id":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","private_key":"f37b323598ac406038a1fba2fb8acf1ac7899c6606f263470141e3d8f364c70a","name":"node_3274b5f48e6929e2305e980b558a4ca3c7cf800b75a6445ea2875cb379e127f3e793e9450a11e927682aa91b8af52e9560dece633833e0f207a8a8a38b7b9c54","services":["streamer"],"enable_msg_events":true,"port":63142},"up":true}},{"node":{"config":{"id":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","private_key":"fa14be3b746acd18c44299337f26807c3f0034349cc7eb6ad398a32061e68e12","name":"node_e59940a6dfe35a6214e2e3daba9ad94e630004cd8f029e13a6649a56dc528ff94bc09d8d21a2f14a56b4ff759b60ebf3d27c1029862c183b8416fa3e950bdb55","services":["streamer"],"enable_msg_events":true,"port":63143},"up":true}},{"node":{"config":{"id":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","private_key":"67c3621e70643b370db5377452ca3a8bfe78a01172983da0ba5fb979ce341bd1","name":"node_f7637cdd5ef26de40b9055c1df91a45725670c8df11ae934c0d99d2547c3eb4c42a16dbb2e75bcaf4b1b9347c48db65f549a0623179a08dd8cbad92f5bca08cf","services":["streamer"],"enable_msg_events":true,"port":63144},"up":true}},{"node":{"config":{"id":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","private_key":"e4e774ffb3fee42b1fb038f560cbb7ef3f4ec4f12d077fd90c38de877841eddd","name":"node_fa897ba112f34839064c6871a4c9504c5d709eff5095a137c6a42726d58eb623af976cb96cc30db67e6ac9347c769f032aa4ebda884285a057059040c008ad3e","services":["streamer"],"enable_msg_events":true,"port":63145},"up":true}},{"node":{"config":{"id":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","private_key":"9fdcb97101ee0351d72b1cb7b832fc95f339a434e9d1e146af4062d0d43a88c6","name":"node_5d96577324edf1b5a1626999925982af1e0ba7bed8edcc3f740ba434f4b003cbbe2d632cad327c76e5b490d08c091c4a7b473353ab59139493657eb9525b8be2","services":["streamer"],"enable_msg_events":true,"port":63146},"up":true}},{"node":{"config":{"id":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","private_key":"05ba41be88727fe8ceb3dd01ae6314f6eb66de9c223da829a6cb0fcb9633dbc7","name":"node_b09af9e5552e72f918174963dad58a4492d3afa120f78e43820df7bff7fae9f6b52bc6c8c73d3a9af91d20134f4ff1b037db2ef0bc3d8c495a771d63de678bc0","services":["streamer"],"enable_msg_events":true,"port":63147},"up":true}},{"node":{"config":{"id":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","private_key":"4f458de05e760aece8dffaa29333d3a51382cceb7bb8265be7a25ea65cfaf2d2","name":"node_1955bedf0bc9044b13a2c16158087123197c74147c86aa3b9389d308a364e80edbc573bcc836d8a262a77f3c9233ebddb1b82eca83cd0a0e4bda6564c443bb70","services":["streamer"],"enable_msg_events":true,"port":63148},"up":true}},{"node":{"config":{"id":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","private_key":"c2adb7237525d3d280b964361432cfe1d2863e3011b4b83167648da04a8b22fb","name":"node_5984a296b49bfba30315501ce2ae88ed0392ab2959ac4e7e6b9a29090f344b9dd13873ca137e8317c402cd2e14a61965d5707065b8ded46c41a054731933719f","services":["streamer"],"enable_msg_events":true,"port":63149},"up":true}},{"node":{"config":{"id":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","private_key":"43223de0a2e5b61580a85a150f19528acd484002efde9df5041f8b93b5d9f0e9","name":"node_9c3be147f9fe0fa34e553d9e4332969086ea7fa65294b61ca35c9f731f6b81d0b70cdcfe2ba52b6cea3c0de14b7ea40031b5cc40661c4bb821147894130d7bf5","services":["streamer"],"enable_msg_events":true,"port":63150},"up":true}},{"node":{"config":{"id":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","private_key":"863d1cfaeee0df7e89ff906a00c0165a9e579fda9f82bc3fd9b694a593e37139","name":"node_ce1309c8505b446363ae37cd3b1ee3e03ced537bed20aca5d8c4be2133917c408845ef5d0f65876974be2803dfb824827cf5c5a2d050d6ef26cdabcbf3a2dc31","services":["streamer"],"enable_msg_events":true,"port":63151},"up":true}},{"node":{"config":{"id":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","private_key":"f8f2976509e8c27362fc450e79db0e7b99ee036277d5a1c860f265be28b6525c","name":"node_3e7820bb15c07f515bd63791b66136723dcc9878b3145fe0f238f6b41e3f2f7565ae55ef24f08ae461950ce1ae0c8a80fe5e4fd4f2f88c4acf4a2c94640df239","services":["streamer"],"enable_msg_events":true,"port":63152},"up":true}},{"node":{"config":{"id":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","private_key":"eac78f03be8f9529f9c85dceadffbc6ff39de01456bab5c864f9ea5a4198ee23","name":"node_dafb58b2fc8a14f2b23b7df33d28aa7847a08f80e9c21a654d4c97d928e1afe6585644d27f22442cf70d229c32783be6a03c0920be153fc4d9f3b273dfa90ec3","services":["streamer"],"enable_msg_events":true,"port":63153},"up":true}},{"node":{"config":{"id":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","private_key":"6488421507de8fcdef9f2e89a73b5e9182ec8c0cb7d564e630dfe38ebcd732a1","name":"node_622646c74fdbae39ba191dbafff4906fb683fe0b0f2c303d080f5577a070876c41c8d3786ae7b953e5f682b8ec647727550d47302229ebb9f82bed24cea61132","services":["streamer"],"enable_msg_events":true,"port":63154},"up":true}},{"node":{"config":{"id":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","private_key":"7f547289aa8ba8dade535a2e50bfc2111536e7149162e360ea5e4db15c12d42a","name":"node_2d6d55edd34c0d9a0130b4806e409bbe18cdda5c2b221cf46136718ec20ffc9d8e92838d78aff92fbcc85f5d081da361dd1e3d7f3d4e1ea57877d6bb7aa0b6f7","services":["streamer"],"enable_msg_events":true,"port":63155},"up":true}},{"node":{"config":{"id":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","private_key":"f3d8d6aa0db8c604198cf9a317b45fb96b8407cb029951d7ef06042abedf5e1f","name":"node_f62bd19b0fd052207743ce53c3d48a3a71e9219b75e41a9497a43e6368e559d5487ff1ab644f2df4106b500583e4344515f73187eec773115deb977b4ebc3514","services":["streamer"],"enable_msg_events":true,"port":63156},"up":true}},{"node":{"config":{"id":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","private_key":"cc5627eea1858ac168bbf1e34a3bb3410ade5b379cde7f67601bbe359506e76d","name":"node_a1b2d0c6f24f5924c61e057fc65b994d9a6755560d740018b4c9ad0bb69212ec69974e22cb037dfeb7ea90a4493997f4c94029870bcc5fd47013b51ca0a26b5d","services":["streamer"],"enable_msg_events":true,"port":63157},"up":true}},{"node":{"config":{"id":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","private_key":"77d99b72e19bbe2da2d6d931653dc7b541dfe27092b944936562bafddd6114fa","name":"node_188bf77c9c1e45f009efe7aefdb040bdb47763980fe7eb0851295d657fa2a8978efbd2997c1dc30f4f0874eecf9ca9550487cf41da237b84d071963d35b6baff","services":["streamer"],"enable_msg_events":true,"port":63158},"up":true}},{"node":{"config":{"id":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","private_key":"e6874592c3f2d2fa94b126d565cec571767e64ef9067970a9f8d1f8ce7e88d0f","name":"node_f06ec3a90d34300f9fa2d48aea0c6b5f2f01f7833ffb0fad30e7f57e3916e344f3a4f9efe38e222443b8b00d3c7f5221c672491a129e4958e574afc283bd45b1","services":["streamer"],"enable_msg_events":true,"port":63159},"up":true}},{"node":{"config":{"id":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","private_key":"d733b22563798aae07facf0a489367c7cf0d6d3ebf786992b6ae98696d295cd2","name":"node_3c6faa2e75a1699ddadd0e21fd35d3d6215715cfdc2dc89961cfd66773d2541776e785f3ebc833a70e3d1017a4edc571a5d5d9f9fbfc3fa0a8588f6c5023c164","services":["streamer"],"enable_msg_events":true,"port":63160},"up":true}},{"node":{"config":{"id":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","private_key":"145ffd39a00647c0142f3bce7ba2f21f4e168663488e0683b4c8cc72afa7b02b","name":"node_56e8f792ec9a75ec9e91d472b8a4b023655dd68c2a448a33397b125fe3584a5efa1b492e47077b24acfe0396b73e1cb564a6a6b2aee1b457781dfaf6d43fcaed","services":["streamer"],"enable_msg_events":true,"port":63161},"up":true}},{"node":{"config":{"id":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","private_key":"83fa451e08386b0966a5b8ec4b56c861bc367f0cbaa7e6e3a8c20564dbc0f1af","name":"node_3572a22097a313b3adef95a7b6cc679f8d1201a156d764e61a9fbc63d123fb4826f7125402fb6569beed359e1c1e5e6cb6993a75975da6cd4ce15669a2eea758","services":["streamer"],"enable_msg_events":true,"port":63162},"up":true}},{"node":{"config":{"id":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","private_key":"2057ae928cb89d7759bda21739956c8527bf11bb02571ee2e9bda07702779aae","name":"node_e3f2e777a96b2137b3104b84d5d827d484eac9ee1b585430e09f790d7e26978da12802325927c3c483bc19973e09cd3f70c513c34798e5da650f8d2f0c8c5c47","services":["streamer"],"enable_msg_events":true,"port":63163},"up":true}},{"node":{"config":{"id":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","private_key":"4fb682db9263cc8ae4d32757a0837296654120fc17593b9d0c3219a307193655","name":"node_1480f62d85ea32226d9f77ccd31780b3e704fb60618a588ae85dcd1c0e84e878c5fc092adfb306e8ebc7abba9ec429cb2447754502ef847cf931467f31fa50b2","services":["streamer"],"enable_msg_events":true,"port":63164},"up":true}},{"node":{"config":{"id":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","private_key":"7f212e2fa6d29b93f32d27a27b02eab5b9aa946ba044f1a20bada9f7db133907","name":"node_3540d888c3207d6df233afd1164ff9dde2551730862772547e04f7311de364968e113f38a7dea1ab0916a7f8307017de5b49578fa4ebcc39651e541fde51be48","services":["streamer"],"enable_msg_events":true,"port":63165},"up":true}},{"node":{"config":{"id":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","private_key":"d209b8a302d27579c28dd86104e2eab3c74101ff06bb17200388b614ec3f05ff","name":"node_077bcadade93e0d361e94f76dff464d61912bc067ce2ce17ebcabd757cca201cd64624ea809d99dd8ecb749d40528db9b3eb503ef5ec05e8845044cfaef720dc","services":["streamer"],"enable_msg_events":true,"port":63166},"up":true}},{"node":{"config":{"id":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","private_key":"f0317274abc992d76728cf9a59b6dfd16b1422fea0c0089a47f0cbffbce53c34","name":"node_73be4d2291c68ca4554a86fa170f7595210e1b6bbbeef3c1d5623a2b5d03a8fd6e26caa26afc639c20c8a351a89dad1086f91734f09afab62d28ec17b700fa01","services":["streamer"],"enable_msg_events":true,"port":63167},"up":true}},{"node":{"config":{"id":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","private_key":"8d5bfe9aaf70d634b185efff991adfde6d80ee5d1c60e68eb1a105c17a4e03af","name":"node_a5cdff211813e17fadd43ec55a6cf4e97e6ca0c3b2cef0db58923b27d36207fd1a77146efb6093bd94d7eb89cc77d8c735fc64ab098839efc74a00b5e8687555","services":["streamer"],"enable_msg_events":true,"port":63168},"up":true}},{"node":{"config":{"id":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","private_key":"bd99f18955320e921a98f8103d8b4c1713d800d49c0a7bc946cb52fdf79e03d4","name":"node_27fb8fcda1986644f985d68430c399f0299644b00b234c355362721081d12f9eb7686eea8f92eabda1d342bf56255e51c07b200c6233f95ac009f15b874eee97","services":["streamer"],"enable_msg_events":true,"port":63169},"up":true}}],"conns":[{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":false},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":false},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":false},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":false},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":false},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":false},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":false},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":false},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":false},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","up":false},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":false},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":false},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":false},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":false},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":false},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","up":false},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":false},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":false},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","up":false},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":false},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":false},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":false},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":false},{"one":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":false},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":false},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":false},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":false},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":false},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":false},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":false},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":false},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":false},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":false},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":false},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":false},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":false},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","up":false},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":false},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":false},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":false},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":false},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":false},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":false},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":false},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":false},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":false},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":false},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","up":false},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":false},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":false},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":false},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":false},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":false},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","up":false},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":false},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":false},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":false},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":false},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":false},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":false},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":false},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":false},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":false},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":false},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":false},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":false},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":false},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":false},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":false},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":false},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":false},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":false},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":false}]} \ No newline at end of file diff --git a/swarm/network/stream/testing/snapshot_16.json b/swarm/network/stream/testing/snapshot_16.json deleted file mode 100644 index e818da05257c..000000000000 --- a/swarm/network/stream/testing/snapshot_16.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","private_key":"3ff3a0c7dc8b63cac9255233d84cccad53d61f8c9e47539329c07e4f248fc6dd","name":"node_279f0a191892115b8db4e2689cc5e1bc19019e8f5228f4f093f35c48fa2f606fd00a2ec5cf0fa4657ad3606e14643c3be8d49350ad2673f2ad12e17c0174b0d8","services":["streamer"],"enable_msg_events":true,"port":62851},"up":true}},{"node":{"config":{"id":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","private_key":"1ab5fd3f1885661af1829b42683ca1379ca90b1b2c5a0132027346c74001a154","name":"node_2c3d17a3b019d9d32922f06aef03ac03f67777e382f0b86c6e4dac07e590f2dbf4cbd1cc7ed136b52bba897e7163dee926caa627111db6d948581ad1b2edbc3f","services":["streamer"],"enable_msg_events":true,"port":62852},"up":true}},{"node":{"config":{"id":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","private_key":"a90fea5197ac84a162db7a06ec739e075ee334026e792d83a3269526888c8b5d","name":"node_6e327c2d9d3ffdae707ed067d15b83ad0ea81b96bb2a07331436f01c1e194ed90f630ef0eb6511f4849ede30c403e3c4ff3c2cb8021317de97f3ed5b1d990f49","services":["streamer"],"enable_msg_events":true,"port":62853},"up":true}},{"node":{"config":{"id":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","private_key":"76b6f09c28f5568e7724e9850116bdbd6356152fefedc4b0a9747361d712964b","name":"node_9aa1df8ddddd035e81ffc950f063714c3b6be24013108f8b99c32c25fc3a8582904f68c73fe63ebfb96143a12ab398f36c4070a3055c039491ca2f20be6774c2","services":["streamer"],"enable_msg_events":true,"port":62854},"up":true}},{"node":{"config":{"id":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","private_key":"f7e7d60abb7d43d973131804e684ec99e77e81bf38165dda29f3ae026eb169f1","name":"node_a1226991909b92dd4f22150b798e2b6312ffc62bad7a47d250e811c7e60cf5ceb6a87998f295e0bd392c0f5c15213115000781e498dd7eae79b67c7e7e19cf81","services":["streamer"],"enable_msg_events":true,"port":62855},"up":true}},{"node":{"config":{"id":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","private_key":"f88cd88c2c219d13b699ba7c7cf9adf16fc10be5d8e1f35b2ea260e7987ab76e","name":"node_1dcbfc79418f9a665e3154e07663b296ce086e54c23458b7113a011dca62e635245cab144d392716e5e90b60336b60927270b72bb4a1c5c85fbf959060fb3ee4","services":["streamer"],"enable_msg_events":true,"port":62856},"up":true}},{"node":{"config":{"id":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","private_key":"8fa1673a72b2ab000a4a7c8ad4540484d5286b69c93a5c608ef0977f783b7c4c","name":"node_571afb6ce94d28cb7d5cd49b3af35d2b1e44c917a9d3d207ab6c7ae960eb625377334e62317f6c69b3004e2eef92682649df828f4a645a75309ee7014ee4a940","services":["streamer"],"enable_msg_events":true,"port":62857},"up":true}},{"node":{"config":{"id":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","private_key":"daa9c74fbb0b897acdf20f1b955a608b086ce5b45dc8e2b76a44f277d25e3377","name":"node_f1e669bb6e5b89c04e07e3dcdc445d498ac54c8ab2e9a62e622a492b6f9781bfa27f75ef7448d06caa28d9afa40c1c089066358cbcca40018bc0f903eab9508e","services":["streamer"],"enable_msg_events":true,"port":62858},"up":true}},{"node":{"config":{"id":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","private_key":"eb94b600be5949e3ca545e81b4d0a5fff3ae9f51f63c722d10f5098f9e1a883a","name":"node_526d25e0aa47e64d8f681255348a3d3c94fc68bedcb7111532f4ed50d47ef064b1e97e3a6bcd13ac8eaf44ce676b22d2b343a94dfa38b48cf964bfc3f338d4bd","services":["streamer"],"enable_msg_events":true,"port":62859},"up":true}},{"node":{"config":{"id":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","private_key":"4e5d074bc46efbd0d18310e6a74e72e98b92080329d9c4e2b5ae99eb2fcfaf89","name":"node_fa81c440829adcbb3eba9196dc8255e319a976e53db0aceedcda25c2605f21b8778bf8c89e08744f7455c909568855f2a5be7bc88646796d21598ddda810390a","services":["streamer"],"enable_msg_events":true,"port":62860},"up":true}},{"node":{"config":{"id":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","private_key":"73c752d26f3438acdc54e9eaae6b1194d3706c65932939a593f1c8c5d451daf6","name":"node_5702eeccd7cb8c18dd25e5700919a544fb5e15fd53c5d4b56226021a9031a2206a694eb3b7334e4bd24fc510f7c1ea4f7a98e17e3394b4bd8d356a4d048b47dc","services":["streamer"],"enable_msg_events":true,"port":62861},"up":true}},{"node":{"config":{"id":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","private_key":"2e6321d9dda81fc0f863f09868b280dea3300105cf9d224294aa138caf10b4a6","name":"node_6311f5a830849b47094d84129fd987fcd3d511d000bf0a8b888c9a457545950fdae6ae10a2a85b47721a1d1ece8c1c62d866a26577380048d30f205c4e7cd7e8","services":["streamer"],"enable_msg_events":true,"port":62862},"up":true}},{"node":{"config":{"id":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","private_key":"200b7caaf8a33b8ea47947eb842fb8d8aac90951c70bb2f555f902380eb7f1ee","name":"node_dbef367277df652c8d3380efcf5f9d445d77fa6e7957b50b2467f90b7190e70d4eb4febbbffa6b3fc2b04bbf74dc7191e2b98923c3a62ecb80ba5336195994c7","services":["streamer"],"enable_msg_events":true,"port":62863},"up":true}},{"node":{"config":{"id":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","private_key":"b58a24805bb0c417e5666f2bf3f3342b8359d3c0d30a631c0104fcdfb6d0809b","name":"node_a4cdf723b3d7ead36bcb1bba582c8758271d5f08651694e1def0ae2ceca079d4fca81730a84a14749a81bc3ea41a66f1320788310823de5d1ceecd608ed5b88e","services":["streamer"],"enable_msg_events":true,"port":62864},"up":true}},{"node":{"config":{"id":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","private_key":"422d3b2c1b37b851ad524c8f26700fb5eec0d9a2fff1cb157ae931baa52d9521","name":"node_67cc8be0fd092c82e53efc53c418db257eff1135ad0058fd10e3eb77b205cb3e6fa87dfed4ec008c371f77546d4c117d8c34734bfe594da4c96fc08e0d2ede32","services":["streamer"],"enable_msg_events":true,"port":62865},"up":true}},{"node":{"config":{"id":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","private_key":"7871010c8b88b9594c71b9f43aecfefdca39da348e31f47ef2645c20c100d072","name":"node_4da7d1c9577afb52a5fe1de9f99824ceff314828c581caed8a3a33168df699d7b3befb4e888419264a9eeb3c9e5e9dac468e01edd71eb6f0ef41d15f7651042d","services":["streamer"],"enable_msg_events":true,"port":62866},"up":true}}],"conns":[{"one":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","other":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","up":true},{"one":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","other":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","up":true},{"one":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","other":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","up":true},{"one":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","other":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","up":true},{"one":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","other":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","up":true},{"one":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","other":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","up":true},{"one":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","other":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","up":true},{"one":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","other":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","up":true},{"one":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","other":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","up":true},{"one":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","other":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","up":true},{"one":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","other":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","up":true},{"one":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","other":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","up":true},{"one":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","other":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","up":true},{"one":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","other":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","up":true},{"one":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","other":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","up":true},{"one":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","other":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","up":true},{"one":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","other":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","up":true},{"one":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","up":true},{"one":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","other":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","up":true},{"one":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","other":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","up":true},{"one":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","up":true},{"one":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","other":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","up":true},{"one":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","other":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","up":true},{"one":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","other":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","up":true},{"one":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","other":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","up":true},{"one":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","other":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","up":true},{"one":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","other":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","up":true},{"one":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","other":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","up":true},{"one":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","other":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","up":true},{"one":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","up":true},{"one":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","other":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","up":true},{"one":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","other":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","up":true}]} \ No newline at end of file diff --git a/swarm/network/stream/testing/snapshot_256.json b/swarm/network/stream/testing/snapshot_256.json deleted file mode 100644 index df5f7f4e6e8e..000000000000 --- a/swarm/network/stream/testing/snapshot_256.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","private_key":"859f1f6b352bfdd6f8b7a7a80ef60a7fa41a514a091d5c19d0ea7ab44c24c614","name":"node_57fb1bb32bb2b1a87e44c6a7557e9c47c2032d107bcb0e34acd9ffd54d5d3df5701232db16f62f7549ba2721021898b03160b1dc5201e79606648c1dbc4a373b","services":["streamer"],"enable_msg_events":true,"port":63226},"up":true}},{"node":{"config":{"id":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","private_key":"681d7bb10f2022ae6f74a5afa7e0d42dfa6efd2e55abe22a395db640b6f5c70b","name":"node_7f357b8d81bc2e5c6fcb081f23a42b3e2439f050d45c45851994a268d1c71fcb1f39f8c3f75ce921d3fbf80fc0e73f0b9609d72001dc4a6b65b526d312a4f43a","services":["streamer"],"enable_msg_events":true,"port":63227},"up":true}},{"node":{"config":{"id":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","private_key":"fe0d4b827c015eddc1928a6f9691bb26ba2100a6232168890d11ebc7f7222891","name":"node_cb94a8270d0050378116b5815ff17dafbe20f5303839c4fd57b981d4687a4b145e4bccec7e9af9b9475005930148ffbfa97781a0762c8e9f352dc95565fc8732","services":["streamer"],"enable_msg_events":true,"port":63228},"up":true}},{"node":{"config":{"id":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","private_key":"0172e330c8b3ba8151689716c455034d43e9600eafceaffa6c9b162c36920109","name":"node_76cbf9fc0f3517fb615fa96104780218e85d064ee5a1d518f3b78f4dbebf144df38c427445fdd6c9b436489c00ff9497d747a8fd70f380f95601d59e52e021e8","services":["streamer"],"enable_msg_events":true,"port":63229},"up":true}},{"node":{"config":{"id":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","private_key":"2e9b4ad5021be5fdbcdd374c9569d467f370261662cb56e23b98ff5588c8d99d","name":"node_e023a51c5bd26e1754d6461345143e94baeac799947579ec7adeccd105de39f85afbceeb5037cfc0b820b9f4446433f034d9e7de7326d45df5a967a8099dbb10","services":["streamer"],"enable_msg_events":true,"port":63230},"up":true}},{"node":{"config":{"id":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","private_key":"059dc1a60c68b91d75f771391bae103fb3d7dc30c5dfdc9498980591bc09e0df","name":"node_68cc8b9a995eef6170abf88bd5fedca06ffcc8d75f247f6041c13e7dfd292727ebda1ff86b776e33b6634355c55e0f8c22fcdb5f9a6e2f22fe1af7854c3b4273","services":["streamer"],"enable_msg_events":true,"port":63231},"up":true}},{"node":{"config":{"id":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","private_key":"bf0aa2cb855d1702f8353aaf7cf03b846cbe1bdc6a0b66b18dfa8f03ab7dee43","name":"node_54b3c57a4adf4dbaf31b85ed1b8dccd6249faa16dd96dd230189f47f57970caeed36627cc8e1b0794707418d580f5bd6001c07be6a79216695f1253db24926bb","services":["streamer"],"enable_msg_events":true,"port":63232},"up":true}},{"node":{"config":{"id":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","private_key":"8b9685b4c43d0de26290fc8646737787fe8ff7e6c32c082060380b41fe2c5f3c","name":"node_df4c3505e09e1baa88470117b964e758c94f77a4546489ab5ab7f4aebfdce424729ace8867475715fb68f05c66c9674a5767549e266c4fadd1c703ddd735908f","services":["streamer"],"enable_msg_events":true,"port":63233},"up":true}},{"node":{"config":{"id":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","private_key":"a5bf3b5b166cc21128321759e5be62f691455e382d8ed35e48805cbb2d884a97","name":"node_24662a43944228e4ff74736bcf0a0a4f79c87ecfdb739225b2fc45110c11bfc38aaf2d09d98e5817477848e553f187ac5408bdb864518dfa7f5df542768828db","services":["streamer"],"enable_msg_events":true,"port":63234},"up":true}},{"node":{"config":{"id":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","private_key":"b64868a78b7e20e3914999f841765a445e99246e67a0d8706639a2e940c1dfef","name":"node_27d9048707a89f1a61e44fdae523c0128f2a7050308bd3cfefa6c3e03040a0e22f11ab41275f22b8706e6695ab93320e2af35179d772581db5f49f960750f2f7","services":["streamer"],"enable_msg_events":true,"port":63235},"up":true}},{"node":{"config":{"id":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","private_key":"f72fdd8aca59748c35831f451f405cbd0aa950ce62699f1f7c9c10d76cf1e588","name":"node_ea57884dd42aec5a76eab43483bf7c4ae2c19eebf365013731de64494d10a3b4cfe34c86c79437f9012bc8cf6bd761435eefadec17600f4b9e4bc234532d6282","services":["streamer"],"enable_msg_events":true,"port":63236},"up":true}},{"node":{"config":{"id":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","private_key":"9a8b5a154d6b376a8d8a1c5357272f164206a01554ae4fcdf479ffa3e80ec4a6","name":"node_3b570117addeec03c2694baf28e246f91907268fe665c6c90356120332794258ee57a60853c19e9fe25d042ca42a5be7fe0797d84199174de8132f1ef4a9349b","services":["streamer"],"enable_msg_events":true,"port":63237},"up":true}},{"node":{"config":{"id":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","private_key":"5007a8f6bdeaf7620240976e1d41aca23e841378ec3a157b199d5fea27b1e0c7","name":"node_0cacda5560faff9d20e29a0625d3cd340ec075f198a50ab8b79338cee0e0db84c7c7e71042fd8c8f73e507b570de5d26c39473136b575f0167625a1168309ec5","services":["streamer"],"enable_msg_events":true,"port":63238},"up":true}},{"node":{"config":{"id":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","private_key":"a7d2d7f12b632dd6c409c8e7cd5da6f2009d1ed9d27eff101c0e850934695ee6","name":"node_88d5c5fe61ee1e6fa5878e0eaa13bdabaa0ec3d38a5d25b95a467da7627424f25fb5d30535aa0a5ad01c16fe2598dbf570b78cc152a7f4ef66d46fc9ae43592f","services":["streamer"],"enable_msg_events":true,"port":63239},"up":true}},{"node":{"config":{"id":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","private_key":"9e7d9771bc8ee20b1bf0743ba1e8cf1501c54606fcf9e174930cf61de03ba696","name":"node_80d997b87856099d844187d3d1fa40846ded652a62c1611b35919c2543915b64ff62476636488556f678e436ea26fcc40db7c6b6bbcb78f590d61c1ff0e424b5","services":["streamer"],"enable_msg_events":true,"port":63240},"up":true}},{"node":{"config":{"id":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","private_key":"f28a26c4cb4589d2ffe6731d30ce96e197684de24e886f252b6cda9eb4bca962","name":"node_6bf9fb6a25521c16c2ebeb6203d046d7dd40f29cc2ddb067c0222ef56d7012d2ee5d037f71f6668ea56767610b2a54c144aed74b7f68d06993cbd52fa1dc7630","services":["streamer"],"enable_msg_events":true,"port":63241},"up":true}},{"node":{"config":{"id":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","private_key":"03c65c150995cc6ea4d0a925bbeb304f8b289d695855b69197bd9284c537e8e5","name":"node_23f9bdc82efbf57d3d40a1f2617d0311678fb4a3d6a50cb7e608c649bb618124a76c7ffd17387de963e1cd28d2bd5a61c98613f6e009a8a2a90d989827b35de0","services":["streamer"],"enable_msg_events":true,"port":63242},"up":true}},{"node":{"config":{"id":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","private_key":"0af9f76e6251f7612eb7fde7f20ebf9dc8334ae1139a6e2dd068a97a896860ba","name":"node_f6ca39b3ad803e99f4e4e9cf759fff6abdf06e6972bdbe524f6eb930c669d6f0e9b91f3de9df394b0d661b068273861391bdbac948ad911351c48cf02f874db6","services":["streamer"],"enable_msg_events":true,"port":63243},"up":true}},{"node":{"config":{"id":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","private_key":"1058a6e2e08d811ed1ab6b6eb927323ad28292591a70269330779d52491c6d64","name":"node_385168340139236a0e0f537fa693122db9fa02a377c96f31aae54718e92624fc0288164877e63616651565e055c53f7074ab2fdd18a837da6faf644941305bf0","services":["streamer"],"enable_msg_events":true,"port":63244},"up":true}},{"node":{"config":{"id":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","private_key":"85e1a2673b4ec4f876778b6fb175fae0e36e9e6456c8d8fa2a11bca2dcc8b376","name":"node_9194a3a4c8f3235203e48bdb10902d958d26c342805ea6365af9711213536509719d917c694f9a4fbdde6889a4c92299a5301f0275bda4dbcd2541b5bff5b271","services":["streamer"],"enable_msg_events":true,"port":63245},"up":true}},{"node":{"config":{"id":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","private_key":"54906c0600d9da9afc0e64bb94c7902ff60042840c9143900f2ae8fe9ba69c63","name":"node_c2705ee7238ef9305e4da196653cde707649435a1e8b5b797d164e5ca06184a77af5bd7fa938c995fdfcbce724fa7eca3d908ee34891ab62cc6dfd411c3fa1da","services":["streamer"],"enable_msg_events":true,"port":63246},"up":true}},{"node":{"config":{"id":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","private_key":"b798233dd61ca3bf4bcf5729b06de9bee5447b3c0c4f604eb12e856ff1363492","name":"node_bf4ff51cc3d9a9d8cefd7e346ce1384d06450228a6086fe12fb0c60fec54bb6478f090bb638fbdbf8f41f7bc6420cd8a5c8b1b8566229b6851167375ef412f46","services":["streamer"],"enable_msg_events":true,"port":63247},"up":true}},{"node":{"config":{"id":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","private_key":"529b3a0af71a5e49aeaa2a7ec622d5a1fb3a920fa64f8d200af8f96f0c2d5d21","name":"node_f33d1f3e460574706ac1c7fc9ebb4683b173496ce3e80017d1c3521bca03d5a41a9c7a6cde8347d2238917b7cc58cab000ce7ccf6bb408561015a2ecbe613408","services":["streamer"],"enable_msg_events":true,"port":63248},"up":true}},{"node":{"config":{"id":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","private_key":"d6dd6c5f414a03e6e909bb7447653cbdc2b5adf6bcb2a4643c2cc7572e574a11","name":"node_083e67bb19e30d14e4df6d2483367d6659d9b56744d53d9cf7fd15954c327e1bc88a5d0db8833634e1dad7209164451f8934b59f76b5990059261abfd650519a","services":["streamer"],"enable_msg_events":true,"port":63249},"up":true}},{"node":{"config":{"id":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","private_key":"ad02d38ce01c0291ad949b92338b10b0427a30de149df0a3c7457c2b2340a963","name":"node_0c14dd51a56130c51009e3ce47c96b2afef26b7e86cfca65d8a9bae1abef13b3a7a192b422d894c39e24ab00be412d166a3571cc259ff4462d4ad8925a153766","services":["streamer"],"enable_msg_events":true,"port":63250},"up":true}},{"node":{"config":{"id":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","private_key":"5f33ccc756728e5919332381312dc8eb9f6009e9a407654eb70b995c12338ee7","name":"node_855bdf057f4a6b095e2000ada199447b5b4f2f8d78d2ecbaa0ff1fbf761788870ee999266ad3b26efa02be1a46a4d92ac0debb85a2ceab3442394ee7d99e5355","services":["streamer"],"enable_msg_events":true,"port":63251},"up":true}},{"node":{"config":{"id":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","private_key":"7645086a0c4af854131d0ff4a95ef3a1d8ed9bb6620c934708a2b4f317c6f964","name":"node_b53078000796f1cdb04dfeac424d5e3e37e30f00bd5bebf9a9ea0525c62917612b3a8f508df6bea59e3c7e4cd1aa530841f9a8af54e44f5617a13dee2c6ff007","services":["streamer"],"enable_msg_events":true,"port":63252},"up":true}},{"node":{"config":{"id":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","private_key":"96bc72358e15d649f871e17f6fbb7ddec911aaeb3b5bbd55929512756cee6a67","name":"node_5526d86ba9df651091d88460a9bedb9cedb957d452a635e1db46b9fed78082022adec0047cd7485956a4ecbb0e18107595de0de3c35242527cd302bf74a19260","services":["streamer"],"enable_msg_events":true,"port":63253},"up":true}},{"node":{"config":{"id":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","private_key":"3348eec47933810a23d583715b1a18b2a8332e8cd45bdc57bcc5232c6b5c0164","name":"node_a7378ee34876af17c6cd94a69b6b741ec7891ff5375bc4241d48608d047455ed48e6baae80ee88d4710c69ae615cf195cee26c94b54de1bb935628ce1e3a723a","services":["streamer"],"enable_msg_events":true,"port":63254},"up":true}},{"node":{"config":{"id":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","private_key":"553bb09d30fcd504ead604d830aeb0e3d0a5edfa58c94ec3da1508184f7c059c","name":"node_3e488a7208ce0e097ce47fc6651a13e95cae137d1a054a09b04d2f59d45faa2594a8c3b395e77ad1a3c2edcd827dda73c0c97dbaa6d9519a79184a0aca01ac4b","services":["streamer"],"enable_msg_events":true,"port":63255},"up":true}},{"node":{"config":{"id":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","private_key":"60b600c6cca2712771a98d797a46fbeb7be68a054d94d8eaabb8ecac6d3520a2","name":"node_07f25fdeab2b44b2e92fc80fca7de9e4a8547d27a98a54593b3395c270a9ff3f2a5da62a2e8531ce86359f0cdc5b6513b773dfd64cce1b83e47065d9760a2c7e","services":["streamer"],"enable_msg_events":true,"port":63256},"up":true}},{"node":{"config":{"id":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","private_key":"4bb86dfcc439dc83032e6189165d986a8f315558aa7fe1b6bb2f91e521a837b8","name":"node_0f9f7e2dce4ca266c3ac0ec3a8854200b54487f5308e3db418461aeb5f67c81d332619b6441b468e480941e63100ed1b263e7adc20689dc3dcda578bfca538fa","services":["streamer"],"enable_msg_events":true,"port":63257},"up":true}},{"node":{"config":{"id":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","private_key":"ff9eae2bb1fe93a164f54d3ac907b4c4ec79fa41eece5a44aeb70c083ad80ce6","name":"node_a1560ce7c1f1d5972f027a8e9cff820611d84764aa067434a75b63887bc4268a259101486d34b7fe83dd735e799789986cd3e9b156c86ede598bd86af4454924","services":["streamer"],"enable_msg_events":true,"port":63258},"up":true}},{"node":{"config":{"id":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","private_key":"f23f43541bab9bd56083d663c140d382c5a9461060c285f1c1b1c6621d8e2e1b","name":"node_e06a789a7f6988e1ba5e8358b6cd4292555c7f9f7f0dda6fc01cc26d24e49a8c1ad694423ad74aec6d80f4b99e2bedc49b6a5f2670744cedee3a3e1848e6dd07","services":["streamer"],"enable_msg_events":true,"port":63259},"up":true}},{"node":{"config":{"id":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","private_key":"e3853d7bcb9111bc645eaaec38093b38a0b16e80774deb42bbf5431e78e9ae9a","name":"node_57b47f692f4d69a5d2c9c193680eb4ccb5a6c574662df0138504a549f3ea74f20c5b866ac4d9e76c4b49c83f5fd692ead928ea20dfcf643a11a1c1e841c0ec42","services":["streamer"],"enable_msg_events":true,"port":63260},"up":true}},{"node":{"config":{"id":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","private_key":"cf8c79a1a70472ac10e1dcd59e8a498cce13cc78f13a28a1b31ef8070e8201af","name":"node_2ddd49fae11d8bd2e7e75a481be267fa846f51cc1160bc326aeea51c542323ff444909de11e2731e835140bc0b1b32020e1e73fa652511a381222bf0aebc4081","services":["streamer"],"enable_msg_events":true,"port":63261},"up":true}},{"node":{"config":{"id":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","private_key":"872f89492c87094f84d4db636ac19e5c87ac57cce008931d2db6d7aca72dc552","name":"node_420b9c90584651c5a3fe3c16aa377444a321dca934f8a097d01a616554067feabebf2fdc8d2a25797f29a8fef30d5e2c82f8e85b20f509a880367b9b0ccdea47","services":["streamer"],"enable_msg_events":true,"port":63262},"up":true}},{"node":{"config":{"id":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","private_key":"9c7cd9b75a3b821c0ec74e08d8727fa6ce5aa184479038762b1ae4f3c07b3782","name":"node_5bf29c02f07faf7ae8e46389e1b98df4f5e88c9316b5151685e6ae7b4e622cf171ff09f996aaa8ad846643b3bfcbd1ad96cdc249afccce439bb5c55246b95801","services":["streamer"],"enable_msg_events":true,"port":63263},"up":true}},{"node":{"config":{"id":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","private_key":"ea03297fa8e550df89d0595b3026c5367bd7b0076c7a9fd5c6071f0944373202","name":"node_e3c8a97a2d95dd543f9e2b41d9dce6256e284296f866f4f92e9925f8c7519dea23fd6d1a11153b93c10d6a32295e7b9bcc16024e690e4a0dc84fd25ee0f31b2c","services":["streamer"],"enable_msg_events":true,"port":63264},"up":true}},{"node":{"config":{"id":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","private_key":"dc424f98922ec5d19a5a8d5ee2acaf077778ed0fd92db276f88bda3cc4fdb5a6","name":"node_7aaf7817b93aa6d2f50513791f9ad7629a901ed0dcb151189f44763f83423446b20ec79a48fa260cd9bc2907d5f0ad06b2c4c5e6d812f3d8876c8020ebe41019","services":["streamer"],"enable_msg_events":true,"port":63265},"up":true}},{"node":{"config":{"id":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","private_key":"baad13cad07e0edde7209f5e70451c82d07d1c4d4bd5ad6f85acefd48d14a253","name":"node_062e0ca43a1885c4a7ab2a5169790f9081e3e9a2dfa286b8cc592d5ccbf13d7a82b72d23361a19026d04fcf41b752ea320d98359d770aedfcee626e21c3494b3","services":["streamer"],"enable_msg_events":true,"port":63266},"up":true}},{"node":{"config":{"id":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","private_key":"613f528e83e5bfe55db16791b917891c139ea8ab7599058a204c7836f71feb95","name":"node_f9ffe87c52ff4c22bd9696af32e0a9d34bb81fb84d9d8bf5aafe2ef9696e7b3d6460bf2a93aecb066133f53416bde841a02d6967bd06e3d4a714f3b2c123a947","services":["streamer"],"enable_msg_events":true,"port":63267},"up":true}},{"node":{"config":{"id":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","private_key":"873d0f70715479bbed36c4b74c9391b723fce386d150bbbd613d33eaf08cf257","name":"node_bcf8e831821a5bca359fb824c7dc4d66906de82f3663a0a853d96880a8ca0bdddcceb1b66dd1f13f75ee20fde50fc9de545bc25767f228baee910e0dbfa8cc27","services":["streamer"],"enable_msg_events":true,"port":63268},"up":true}},{"node":{"config":{"id":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","private_key":"48e7cd643d45488597f25de324e8b7553c26e1cf8e8d44261d610ee9041c898d","name":"node_3d2df188704eeac09c8b291bf275a73888199a231c832c51dbc3d746968d4b51a7d5eae0c7c9b8c8e19f5e28d38c375e01abefa343f31dbe221deb837ab8a0df","services":["streamer"],"enable_msg_events":true,"port":63269},"up":true}},{"node":{"config":{"id":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","private_key":"f88a54bfc74bebed6bc8bf6d7b98aad4ea4f8b8aea6cb1514aecf398bee41960","name":"node_8f88c7ec044f758f29bd8d12a5170bd973aec8f6cddbf512b910c4b75a0fec09c5e198bcd65622037f897759db68da2328b4a7ca93585dc9cb62e46d2a6c0864","services":["streamer"],"enable_msg_events":true,"port":63270},"up":true}},{"node":{"config":{"id":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","private_key":"a5b02d5d5ff64f5330758019a5ba0583f2b74b423be4695b4ffd94231ffd58c8","name":"node_4314b0b04331973ed29a58843951f144ac3d09bd5d57b6cd9aaff9b73a7b2ec81e344a3e4ece462bd2081b837a06310e787ef3bb889dabad46fe7efd394c8342","services":["streamer"],"enable_msg_events":true,"port":63271},"up":true}},{"node":{"config":{"id":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","private_key":"9e96b56ea6abe86960b688d477b9c689309a7f304c5e4bd108459144e68448c4","name":"node_3612863ce0456c91785a829bf5c9d2b2fb97dda083a1847e5a4ebaa6fce1260faf4d1eb374c2225431a82774163835fb59c8cb0fa9fc0969eab5410c71109cc2","services":["streamer"],"enable_msg_events":true,"port":63272},"up":true}},{"node":{"config":{"id":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","private_key":"5bec215e5024e8ce65d46fbf9b69e1718c1173478f8654d2ef451b6217ac6db3","name":"node_2ac522ebfa49d37f86c6270ad4cdad0e766493f0e463b18c9906c70fbd2e5c6ff6b0d5879de6e3894418370636963a78b0c0cf087a8684c2ca30c9c736e49228","services":["streamer"],"enable_msg_events":true,"port":63273},"up":true}},{"node":{"config":{"id":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","private_key":"00dd6637412fc5209eeee1423b4eae49fbba97d8d5c37c9ae6819f7afc53569e","name":"node_62666b24d1026345349edb6a878cdc27d6fee8254e83f79a298ce2805260d97aa46423deae440f86ced5cd99b30e970c8e1ea1046752b17d8c80dc68d9a49b60","services":["streamer"],"enable_msg_events":true,"port":63274},"up":true}},{"node":{"config":{"id":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","private_key":"88ceb50dc965b4e3279c8e7729db14ea34238126f1ab694c621d5ab9183acb52","name":"node_9ce6b9decb69d66075993e903a0727ec109a04335634616097c0e60b08f94f764634fa00891b1070f6ea1ce896bc7d11d3aea92a00f281f902d960894cef296f","services":["streamer"],"enable_msg_events":true,"port":63275},"up":true}},{"node":{"config":{"id":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","private_key":"638176a3cb343c140131c887892f37f9ad69e9c87c0a256dbbf2fbf8dd2a6b08","name":"node_b870935867183bbfb84add16b9f56c02c834b7042fc24ce6bcb2a7f174e6d2239357a00be4272c1ef05c7f9baf5a9f16b53bc18328a9b7aca8540c2916805b57","services":["streamer"],"enable_msg_events":true,"port":63276},"up":true}},{"node":{"config":{"id":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","private_key":"4da9834c8665dcfed17ee5eb89c5bfa3c0d1cc4340088a4038f746dae4cc23e6","name":"node_c83985973a9564ade7d90aa54911ac57077600676a1d27292d98e058bf1315887bad84ccd708cb7f52a695a1405fb7d491d7ca2ae9caa3ff58a5ad78ce4dc9d9","services":["streamer"],"enable_msg_events":true,"port":63277},"up":true}},{"node":{"config":{"id":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","private_key":"05eb5751d81653e8ce409be43c9da42ff90f90c6e68981e69cd03a867d93b800","name":"node_acb4088c27ee2ee130ece3506596432afdb9e9757ec11ebdd35c5a6e87239545c48466913a646980104c8fd7a9a335e177f04efffe9dc952dfd7cd5c1bb9aac6","services":["streamer"],"enable_msg_events":true,"port":63278},"up":true}},{"node":{"config":{"id":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","private_key":"846035be661387d6163b5472ea225ecc9d3851349f480fb901d2e31bb8ffe858","name":"node_b4fd11306b1416a9bcf4719578976188e104b8c5028b9abd3214d257446b97b70a22e6c00934d80caddde15e8e4d16af03bb399583047983fba373d8313226b7","services":["streamer"],"enable_msg_events":true,"port":63279},"up":true}},{"node":{"config":{"id":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","private_key":"b34c69cee56a834b8a36ae964f1847d1825821a21d104396039175a8dce5ac73","name":"node_7b35c856916eb3fc1b1f451667e240b95aff8f4731cc0f6743740923081ff1ddf2eec81bdccf4691a7bcc053d23eacfc15809c384a73448f618317bf605bd1cd","services":["streamer"],"enable_msg_events":true,"port":63280},"up":true}},{"node":{"config":{"id":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","private_key":"3d1ea95ac16f7d903cb8630a8c06052560a974b0abd3410d9f8b2968e7cf653d","name":"node_2ab9513899c3c829b6284e56bf2b9862dd0156ec052b58615dba77d450dac642e534ec36ae5d3234262aff54e19f99856e908b9d8c1da660a7834a445610715b","services":["streamer"],"enable_msg_events":true,"port":63281},"up":true}},{"node":{"config":{"id":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","private_key":"70a577ae497edece947ef065da29014e45dcc1d942969597600a64b55e8bf718","name":"node_e087230634f556b818a416b66ba3f1d1dbe3e0dd0698bbb26fa86a2499acd169466f564dc18adf2f9be4d1ada0e86c11549754097601e10aff4f3a57ddffa24a","services":["streamer"],"enable_msg_events":true,"port":63282},"up":true}},{"node":{"config":{"id":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","private_key":"28ee397105a113c5c4e7d7cb1b3dd17b6db66c3cd8f3b621df0271e544fb446c","name":"node_66beee3968dbcf3addc6feaf070a4e3e82b5bb164fb72f40add89f732c12e8d0a31a7ee1f1e24a4674e4dfc9a4912b02c17ce3c224d257d78b7156544d6507dc","services":["streamer"],"enable_msg_events":true,"port":63283},"up":true}},{"node":{"config":{"id":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","private_key":"b6feae1f667895ada3116380a2cabb0c702b44b24d45415edd143d27dfe5643d","name":"node_a08e47137bf611dfbd20308a22bdd3ca00121386f121d6d712ade86e9a1601a4237766887cd91c8516e20b6e323d2ef49c1c7e177a0afb4c813f0f344daf779b","services":["streamer"],"enable_msg_events":true,"port":63284},"up":true}},{"node":{"config":{"id":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","private_key":"a643e845285aa039d6f84cb124b618bac45c970fe0b15fdbbbdef834300b4857","name":"node_990b1db3ab1390219e8866d39fa4441bb5bb89ad786b3e255771869fcd08906dcf63f34007481769c7462edbcc665acc0a552e3733360b8d8c310c9321a5550f","services":["streamer"],"enable_msg_events":true,"port":63285},"up":true}},{"node":{"config":{"id":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","private_key":"1b31bc34d4ea49b0c1df457ad06513d0f47c56ab106b0f0ac97c43ccdc64db31","name":"node_7865b82e44add2cea6ebcbaba9c152184331a2940fe73f6f9bb940bda8a59ab4cf4760894b9cadcaa54e36fbb712ad619346a49a85e32cdf2b53cda1ac1e0658","services":["streamer"],"enable_msg_events":true,"port":63286},"up":true}},{"node":{"config":{"id":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","private_key":"b380737ac46f320eb5884ca8a60e1693caba904545b68396e33fb92cd19aa18e","name":"node_292c78c8e41606e98428096bc6f4609a7aa48e5c4d17eecc64d65faae4a7270b0c15f0cd74274015688ea0a9aff34f215c29118222e362a29c8d637963973a55","services":["streamer"],"enable_msg_events":true,"port":63287},"up":true}},{"node":{"config":{"id":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","private_key":"d18c1536cd7d9771bc9b64595184285ed499519ef810b3f013fca2fc01018048","name":"node_ee36d1d5dd69fd30242d7da2e941b34ade5581c7164fcc43288ecfc52937a98f1b31ade5d1e4dbf611cbe1c7875b2840c89435081cde471c271d7bc60e9ef211","services":["streamer"],"enable_msg_events":true,"port":63288},"up":true}},{"node":{"config":{"id":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","private_key":"186743aa8dc07042c40bb95b2efe30149139f3c2ea4a4bd193d3be68e8f4485a","name":"node_bd1a7c63fca9e1fcc67d7fd62670beefe2bce483cf1dc1233ee85eb90db607917cd9a5d7170b10e80b925a20e2af2c54d286b01805ac34967410859f4f03da09","services":["streamer"],"enable_msg_events":true,"port":63289},"up":true}},{"node":{"config":{"id":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","private_key":"2e960819700f3330b00d2d58461403843026ffc7629b2514568c6b571fc99488","name":"node_9db1f94d74a00d1e5e2a391f1bcddf16b6d0670a2c6d91d946d38112c58634444b6fea8e8c05ab4b73bacdd62a0b575f6fb8729978edc216c7842b177b9f9cd9","services":["streamer"],"enable_msg_events":true,"port":63290},"up":true}},{"node":{"config":{"id":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","private_key":"50c27493a6d9ddee175040dafa1f40c6ad503b55590479001ec085212c5cc08b","name":"node_934a5fe1b91c1891ef4df7f67c027e0eb115d4c2ca4a1b76a135ebd4315c4fb835d6625223194e6a134407b38b0d3928fbc7bc924a3c6a538989a6cf200bf4bd","services":["streamer"],"enable_msg_events":true,"port":63291},"up":true}},{"node":{"config":{"id":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","private_key":"4c67752b215e2cfc06120964f06976fce2a1dba599c0f32c0f4393b9d77ef872","name":"node_485825745d97654cbb92a14e0cd1078691d3c28f4d82b1046284b676a42b44ca58eb43474e45e415d3bd3f3c383f9a1a3365821ed7ba6a9f2603b29d58031dc7","services":["streamer"],"enable_msg_events":true,"port":63292},"up":true}},{"node":{"config":{"id":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","private_key":"21acc46816414d3a1d76bca30d2c2e1e55d420e9ce704d0720696f7f7fa0bf33","name":"node_5bae82d4832092c17bd11474f7748015b8b69b896ab8f683a7c0024fc98740cecbb9e31c6275269f9000e5bfe51d7f45cd5dcd4433e0c87b5741685b40fe3983","services":["streamer"],"enable_msg_events":true,"port":63293},"up":true}},{"node":{"config":{"id":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","private_key":"4542e37f43858e396004d8d8801bae1905d2496a3ab44f75cc29bd2c2a472f94","name":"node_732393b99c490c76fa45e3e404ee095f2fa445fcc123af7ac8ab1d2fdd7cf2483f5b82bb818bd8a82b1a3b73e63bcc2c83d8f24d9aad9afe36503735e7967be7","services":["streamer"],"enable_msg_events":true,"port":63294},"up":true}},{"node":{"config":{"id":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","private_key":"a8e588af7acfd6024b3d71be7be630345ca80708a69214fd31e3b4485f039c90","name":"node_4de378164d77a28c90cf162dd1b465e0282ee17aa7d3bb3179252466f72da33a36c9f298f7c9498e38dba4018e7ce3e5fe631c83842cd9059e23a7fece366d87","services":["streamer"],"enable_msg_events":true,"port":63295},"up":true}},{"node":{"config":{"id":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","private_key":"e3d1a9d4621d7f77d9c2fa224f0d8c8211c2bf461554a1d50afa8f34a82a4754","name":"node_155e4879643a472420012e040a87dbff776fc1976814c0c6cd0d5e157f0d0baac04aa7f2535786c09acc2700547383d2119b64a6f62115f1aff1708738844d8c","services":["streamer"],"enable_msg_events":true,"port":63296},"up":true}},{"node":{"config":{"id":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","private_key":"6522d077629e8c313d832a7a87e5dce9e989618cd1eff1b1eb3c8b63756159e5","name":"node_81288bb0584b7ffc1546043e052e1df10fd5371b35dedd0bb42ec5b30ce69b741b2f7857af5984d4754b39d7253575fde9298504999b78380ef602d391c4bb1d","services":["streamer"],"enable_msg_events":true,"port":63297},"up":true}},{"node":{"config":{"id":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","private_key":"f90016392c8768d222055de5cd1c3a512d3c46b7c7be34a93cbd016aea9ce753","name":"node_109556abac422a912ecffec0d8796f8f16e92e8f95cecf72dc89e97a8bf1fd37aad3c66aa3cf134acade6d065c31821f977171d5c5463305b57ce3eee99a7ab4","services":["streamer"],"enable_msg_events":true,"port":63298},"up":true}},{"node":{"config":{"id":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","private_key":"49f3b1f88009b94bc7beef8d891816672e9075f3015f5954a9ae9d13c8c07290","name":"node_759f46661056bcbb30c7706c9fb87e22a30feb523bd53ae5d18db043efa45b49a2b8982abebdd598fe0912a05896390ec2eabe5e160cbafc0771990708ad8c28","services":["streamer"],"enable_msg_events":true,"port":63299},"up":true}},{"node":{"config":{"id":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","private_key":"65f5fa03f2989a02e37bb664102504038f14adb483b2116b07355296346912f7","name":"node_baa5924e1547c177011285d292aa161a15e5ff282da2cd0afb83c9caffb07bdbb3662c227fa7b26e6dc8be9b8863e647eb5f8ce81640532f8f5c9a7f36557e63","services":["streamer"],"enable_msg_events":true,"port":63300},"up":true}},{"node":{"config":{"id":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","private_key":"87514536801d0d46fcca5c10334c9a6a34ad982fbbcf65b2f881e99a0c8ab27e","name":"node_deb7af800cd20a647335f0feff5bfb3e182f99f4c2d1ade10da36ecfdbac3b5fba4e8f0a4595443fe395b44af3a95617669850944655def85d57cc81c5682a3b","services":["streamer"],"enable_msg_events":true,"port":63301},"up":true}},{"node":{"config":{"id":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","private_key":"c69b71039aa3f28c158e5e639d35069ee66cc88565ae886e75651d88fae8aacf","name":"node_17917fa4da06068b587c17899569dcc768b9cd2c27117a4ed67aab26a7e70cf8d32b881db258061ffd89a332a3b29bfd963d8e171a06c3e208ba0de1c42a2b39","services":["streamer"],"enable_msg_events":true,"port":63302},"up":true}},{"node":{"config":{"id":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","private_key":"76998bb1133735934b6d8cbebf029318feaf9b103165cd460a4a9ae04ad26c5d","name":"node_032b9bf2f59f15571821611d3ee541aa748c86d47fbe5f049fd0069be53e5d7c41991d82957e9c727654c3aa73ec94997c03d8a6c1d2007c9bb1a703f6215158","services":["streamer"],"enable_msg_events":true,"port":63303},"up":true}},{"node":{"config":{"id":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","private_key":"424a19356346001136b4df8a6119a510d526b508d0378eb5b67ffbc471757c08","name":"node_be026dfb24847cac2d00f483104edad06ca8ecb9e1229c479ef5650c7b427cd5dc34a1cf06172c17c9d0406ce17009712e82446394743d4cd9bbc41c537ebc14","services":["streamer"],"enable_msg_events":true,"port":63304},"up":true}},{"node":{"config":{"id":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","private_key":"06aade0419624ec355a3e8e47144b1efd1853293246628e0d3ce856bf3bb64be","name":"node_389b5c1a805f87427e6d647ec5488342a3f7d700615943d5ad98ca5c111f33c7ee007970b4d3e475892095c0d5a79b7ed52d12598398818159000d4b9b719126","services":["streamer"],"enable_msg_events":true,"port":63305},"up":true}},{"node":{"config":{"id":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","private_key":"903c726d393f3a34e861aee6a1b42ea078da78c23d1dcdbd0fd8c30e80b65bf1","name":"node_c57ea182bdb42ba9b0870b5c870e467f52693e5c0df752fb6eb0dfbacce7763f73caee10db40f4fd90f19f504ee586eaf9da41f5ee93ee515d885fec99374116","services":["streamer"],"enable_msg_events":true,"port":63306},"up":true}},{"node":{"config":{"id":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","private_key":"29f2f00196b61b834638899c2e440c57b99668fbd93d7eed220c4556a76cf89e","name":"node_2ac93c31937ca205d61cc5c2a1b9037871cac55e9b306b999b28e19566b3316f6539455e014840ea50c2db8a7c97d78804d3a2dcd7cd9c1f32ace0d36e5dd339","services":["streamer"],"enable_msg_events":true,"port":63307},"up":true}},{"node":{"config":{"id":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","private_key":"682a2f9130cdf75915282000edc627563ea4e9de499ddc8d55efad472a94091b","name":"node_ca1aff0d847c6fdacb623ad9078a0885b3208614fea20d5ff11779779b486bf5e9c794aacf848d3c2d58cfcc1eda8356df82f5fbdd0a5236beffe8e6042848c4","services":["streamer"],"enable_msg_events":true,"port":63308},"up":true}},{"node":{"config":{"id":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","private_key":"d1b4b3adc1b17a79626152a1c7362bddd7c47886990759955595a1de27f7b70b","name":"node_2e409baefbd821485a151993356730e5989810d581e68190fbaa142799c9335bcf98310ad188fed10ae6eb6e2e789730393e509962ec5c0fef0342d72ed088d9","services":["streamer"],"enable_msg_events":true,"port":63309},"up":true}},{"node":{"config":{"id":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","private_key":"34a5057b2a2c507010da7a091827d28ddba4f59c9b5f15f7cb7bf0578e4141c3","name":"node_7b5c0e81c7f4e3ae29d745f6028cfa10b29a16a9c261b65fb8dd05d6eccc634612ad5d3029c8e9f39863a2cdb2682c25f090139bf5c4950e25647e39dcb40e63","services":["streamer"],"enable_msg_events":true,"port":63310},"up":true}},{"node":{"config":{"id":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","private_key":"7b608c298477c4687c50adba466567e19c08492da2684417c129d730caef7594","name":"node_663535b22018a4ef0b151572ef286fa66c22c6e9b2913a69c4a735d4b0149bdf6c84bd83d710f8aa2627e8993b7f020750fbc6f56a3365ce4c840e2b3de1a6c1","services":["streamer"],"enable_msg_events":true,"port":63311},"up":true}},{"node":{"config":{"id":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","private_key":"d9d17f1baee1ccba3fea764f5f5797475ebb9f206d735105ba8fa2c32fe02f0d","name":"node_7b1e20217f594f87350542df31ff5ae8a635679bac7962d49c97e02190c644b673d03e7eba2626b45ca7ebf98d8a972dadbba02c18a8d2cbfc3e7a4cced5b4b7","services":["streamer"],"enable_msg_events":true,"port":63312},"up":true}},{"node":{"config":{"id":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","private_key":"cea9931b34475ad432aecae3d385d895f0ab3e93cdf1d9fdbb356753ec9c7a59","name":"node_84abcbc7b5598ecfd91ceace0927921a5a3404fdb274fc2a2549abbede5f8e4f62c15688a4dc9a2d80262c45970c88898da245c6eb779f327a81d53a17bbc74c","services":["streamer"],"enable_msg_events":true,"port":63313},"up":true}},{"node":{"config":{"id":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","private_key":"362c6622af8998cc3c5cf88ad71f308b632f8f7d0e8ea7ae341f8c8ad44cda5e","name":"node_eab86c521f8f1ac67c015ab713f1236a08b0200757a96bf87ab8301e7967ae62361f0e14da14ca294fc8cb3b4726b52f4773101e21b032977c6a647241b59c73","services":["streamer"],"enable_msg_events":true,"port":63314},"up":true}},{"node":{"config":{"id":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","private_key":"9b28fbe1dfa137bce975e179d3acfe046e5d148e1f9b1aeb16bdbc2cf7abd071","name":"node_e6779e3bbecf81dde8b27d652ed2726c45c205db0d0405c4580014a4c91d739830276f77079108c98ac516ffa00194e77a0795f7140bdf36069b6475e58213f9","services":["streamer"],"enable_msg_events":true,"port":63315},"up":true}},{"node":{"config":{"id":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","private_key":"85e559f97ba5553b0773479fed666bd92a928924af8164f41e92e8acfd51e896","name":"node_9133b0b3c8f680286eae90c3beebc3099a13de38775a3ff2abdeced62d05eb2ced5ac85eac0870156be03101024da5e1d9fbf3e1066ddb3f088221e64149acec","services":["streamer"],"enable_msg_events":true,"port":63316},"up":true}},{"node":{"config":{"id":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","private_key":"652705ca7c47c641c033e01212d96759539f317508df53dcf7397dcee0e20422","name":"node_e1ecad3beeb6c19dce551e4a603c7b440b4498c44e298dc67bfaf4ed2c75bbea95df48b1cd1318e2ccb962cbae7c30ff258e73f8c3fc6b7e9ae7a47f7cf8e53c","services":["streamer"],"enable_msg_events":true,"port":63317},"up":true}},{"node":{"config":{"id":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","private_key":"2578458d6da6ee18aceaf48f57a0f211f9b0a0a49149cc71356d1ccb989b55d8","name":"node_1d0244a13affe60996fe3cf51ba624adc746de0c7ea68ec5a31311a36077c5b5495e3d95c9642875db44c7ecae6ffed22e45f2e2d024d486760be2af9f4cf2cd","services":["streamer"],"enable_msg_events":true,"port":63318},"up":true}},{"node":{"config":{"id":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","private_key":"35b91179894d9195f220f768d849bcef7b2752c1d63a4d373be189c4e35b68a4","name":"node_d9bbcdfd949010e6b2cbf6d0f34b27593ae410bdc1838876aeca35679571fe431d040a5ab085c0a77f111688bebed891da3587277cd794702437cb20d6aa4256","services":["streamer"],"enable_msg_events":true,"port":63319},"up":true}},{"node":{"config":{"id":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","private_key":"62fbe89ba6bc5d8f608f65baf5a0a87c9cffd1f428ecacaadcc777a117a88fa2","name":"node_0a4eec7b0e05da799aca5b36d9e2530f2a89d1426b1fcb7d8f9a662df8a8b5b763767a20db3c9c63e0bd13c2a6e16d3ba8f03baf84f5e5d24917b3f211d9bcfc","services":["streamer"],"enable_msg_events":true,"port":63320},"up":true}},{"node":{"config":{"id":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","private_key":"85b477146d09b052deacbb0f7cc22f61fe3093095e7677ce89c086db68c8c939","name":"node_9bbbfac8be4a000f51a4ce8d024d2595b5d491afec0138922dddfde5ef62c664040c2e9304cc6b7bc688233b5d0c4644b8c8793227c078285a3ab894ef0497a3","services":["streamer"],"enable_msg_events":true,"port":63321},"up":true}},{"node":{"config":{"id":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","private_key":"b3caf8e1271504098be33349fd983395e57f6cc7f4c0d74df8dec7643c0cd09b","name":"node_016f8f4619a16a07fbde5a18e362158d696e4d9f104a77787f26e32a25cd7d278256f8e0db865c488a99511ec27a5eddd5ebbd1c1397fa7f8db111062e5fe959","services":["streamer"],"enable_msg_events":true,"port":63322},"up":true}},{"node":{"config":{"id":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","private_key":"a61a6a7469d5c9abf20daf3df75109b9139cf36c1194d9bc00046d1359c44823","name":"node_7acddc7fb6ac587b7e343804c768e4291cd28dd2b2b9207dea6ee82360d848a52d84f94e4c49e9c421f4f90e2d24f6291e2358783ab0230e6ecde82e69b4ac52","services":["streamer"],"enable_msg_events":true,"port":63323},"up":true}},{"node":{"config":{"id":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","private_key":"629bf1b9c1de816ee9d1abd91d2cef359ce96216dc1d798c7f246ecc5bba8ed4","name":"node_9b59b76dc61223c7b37083b0ebdda22d3599563b3e3986f5db9d5b12f8c806cbdeb2345454efe957cbfa11eea9c7896aefd9a461210524805452ca100a9ea431","services":["streamer"],"enable_msg_events":true,"port":63324},"up":true}},{"node":{"config":{"id":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","private_key":"880c61b8c84f87c55e85aa9b07944500eed52b76b64b6d15c93d8e7c23000042","name":"node_e2e0419a41bdfc5bd76deae2ddce6ac865f886d764c9bd18799b79fa3b2b6ba66d765d26da2037e98317e1d7e8232a61e63c1d0cfa98c9137424151b46e07171","services":["streamer"],"enable_msg_events":true,"port":63325},"up":true}},{"node":{"config":{"id":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","private_key":"dc74709b0972c1ec957a2c056059ce117c9291997ea47107228e80d28af70acd","name":"node_5df58ba12334a1b4f983d642fe435901261767cd81f8f37c43e359f5584664e4d287e8c2275995604a3b3a4823418e35cd899a3db2a7db31570e19512f375481","services":["streamer"],"enable_msg_events":true,"port":63326},"up":true}},{"node":{"config":{"id":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","private_key":"52e14edd67adc3154d0d5a91f91e042773a79af41c5cce9120e2dc03318a7fdd","name":"node_5e86f39cf8338ba098a85d41e601a303fde311662b216ad32a2b7bfaf2b2b6dd1af3775784b39f2d85ac5fac96f05f3abdd8a2bd28ba16d939725fd6a33ae1b6","services":["streamer"],"enable_msg_events":true,"port":63327},"up":true}},{"node":{"config":{"id":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","private_key":"ba201a301c109cac7dc4f762066312478f6a3b92b80495c19d238b8e728e3f63","name":"node_df54af3bae257d437c5657905484e0d72e9560c46f8ba6b3437730234e05259b404cca40b0831e911605ff8a68a19e8fd7e958069ec8b40595928892f4fa220c","services":["streamer"],"enable_msg_events":true,"port":63328},"up":true}},{"node":{"config":{"id":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","private_key":"4f8dbb09790674afc8ae90210897ff3196d82a7d8cacd67ab970ab02fd61136e","name":"node_4ee37acec2178ef120166265aaa2b64b09b315fb53861405ef46f2503c273eb9692e9cb4c2e67a8652254d430fd6e02dd3fe4cded20bb231a9fb834d292b0b24","services":["streamer"],"enable_msg_events":true,"port":63329},"up":true}},{"node":{"config":{"id":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","private_key":"fd9060fd74b7db28d5b02541febcaab4e1706cb1ae50b22d20a7f619fbc774cb","name":"node_abd8f5a4d700c06ec00684b23d2d25c4df1a9554fcfc57b0ddc3fa476e6a699ba75e1213449f900803f83ab8194c6746664b547202047f35b8b3e216c7147bf8","services":["streamer"],"enable_msg_events":true,"port":63330},"up":true}},{"node":{"config":{"id":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","private_key":"3034bb94560e7e8d146cf275664f91426fbeadbea78cc96662a0e762f5491d3c","name":"node_cb321c9b0fe2eb3617b8e2461aab170a9dad2c9b04a10eead4e37e551197ea0a7500eb1cb7b155efe1886486ef3d252d8ff0d309f2906a1126ca011d037da70a","services":["streamer"],"enable_msg_events":true,"port":63331},"up":true}},{"node":{"config":{"id":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","private_key":"1e3e9ddcbac955dd113066c5a41e5b3b16da5cd7bfa036ee1066ff3ceb69d7c9","name":"node_c665a6b1b7ad39b86bd4b1fe38b7ee95a0fbb1db15e91381ec9e5a235e33b69ffdc92c60dafd74b7b4dafca1b000e9274bf045abe5b93b1a9c2b31ae071a9898","services":["streamer"],"enable_msg_events":true,"port":63332},"up":true}},{"node":{"config":{"id":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","private_key":"9dcf01557c9cd252eba6d06bab3e12ad039e64f5d33b732bae4afdee4f4c63af","name":"node_53df9cce9b0169e58ced53a123d1d8f6e8fdcfb4c2d781ecbb91bb7c8eba36946dd9d21c749259769825d8a6b3faa6bb87c8c6085a522f8a3e376061f59144d9","services":["streamer"],"enable_msg_events":true,"port":63333},"up":true}},{"node":{"config":{"id":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","private_key":"290d07cdf29c35f369b7053b54ad174e4db589026d3d4b0553bcccc0a0e4145d","name":"node_d7a319f69013b8375e64d19f015547462c84565b882337998f9e669c5fadd3d2ecf6374109903003e09f5d453424b5c7fdf52163d2cc8084cf81f94844946b63","services":["streamer"],"enable_msg_events":true,"port":63334},"up":true}},{"node":{"config":{"id":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","private_key":"2a549958a13f2e346b477edf55e1056a1c7c1051b3cb277aba17bd7db522aba6","name":"node_f38a9d792173a29c61389f5d84c005d78eac6e750659aad42e2d6df883f04eb3126b2c38fac95076eeed455b2031aaf694143922aa93a2d50412a2454dc56e28","services":["streamer"],"enable_msg_events":true,"port":63335},"up":true}},{"node":{"config":{"id":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","private_key":"72cba007b6bddfa0e57451e0f28d74cd7936955babeefb16b4c3de62400c8ef2","name":"node_4f5ab12b9c5127c16739ad0d4f51adce90ba6736cd096eb185ea632789f4b26f1ebabdea4fd3b39dda5409ece6c2d92fd469cf4aecf9d29453e3e042c19b893b","services":["streamer"],"enable_msg_events":true,"port":63336},"up":true}},{"node":{"config":{"id":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","private_key":"5a603b46da0d4b5d7b48ca9ee9f08ca4cde411e8e279454ac25624f0a81580d5","name":"node_11d560045536e9d1b0b1b9e8944e00f0ca7f1e6788c9fdb51061820bbb3008ead92bb7836621bf58da7035c87a28328faecb4cb2e3cdb9d7fa4f45790e6bf352","services":["streamer"],"enable_msg_events":true,"port":63337},"up":true}},{"node":{"config":{"id":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","private_key":"955c0d00b5c9a641e3e9958a032163ac01fd30e25660ec50db255cf9349573cf","name":"node_94088fe273f76e62ca4e43c095ad12215b4ae4c59942328b3985416fb19bbda0cacc143a49eff3fb644ad53a19d3f043260e43dbb70a0aa9c15829c21cecd3c7","services":["streamer"],"enable_msg_events":true,"port":63338},"up":true}},{"node":{"config":{"id":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","private_key":"3a0fa647e1aa93088fd931cceb89e4426c10861ebbddde0f14a58e2a3969c252","name":"node_535f93057d46c4aae0902546550880be0b5ba67dca12350117d471d67f4f2b3f7bdff29bdc918767974c465df8fa1afa6bd6c29c0a36d51f71c4183673d906f3","services":["streamer"],"enable_msg_events":true,"port":63339},"up":true}},{"node":{"config":{"id":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","private_key":"22c2b405d07e440cdef6e1e9d93738f3bf3add71f54493b68b2fa368c3187755","name":"node_7ac5b07eb555af3bb4ca3f0f4b45204d43cc3798c244435909b97d9a32fc3abf0b50666e260e046bce826a7a102a92d389f8f39c5311e83bb34beddac29d50e3","services":["streamer"],"enable_msg_events":true,"port":63340},"up":true}},{"node":{"config":{"id":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","private_key":"98f9b63dc3d1c346c60957731df1731c8b5f7cbfa63ec1e4de06d1b9f70f7597","name":"node_1944f98d4db32c56a5efda5a79aa5f276bfab1e084d6611fec0e735b8bc0f45b457cdb74a23fc83b2377821fa8316123c9877acd6db7c41058ca5d3cfedaecf9","services":["streamer"],"enable_msg_events":true,"port":63341},"up":true}},{"node":{"config":{"id":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","private_key":"fef764b306a01b333cb965c1faf6970b6bf206dd19c10f666d0188e532d27a7c","name":"node_1c2f7ce55a6e38487f3b3fe6083a79f914cd6d7e4aee8f5d56b4a61b3eb584e128c56998db0e13e775edee3adacf54f09960a041dab3daa80a4f8a3b42760c1c","services":["streamer"],"enable_msg_events":true,"port":63342},"up":true}},{"node":{"config":{"id":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","private_key":"aa54e42fb6be9a738ce973816a814b29759c40f5ae5c57ef972c8957be9d1cdf","name":"node_6ab6ec15635b2fda22542c99df0a3313ad4583ba0fb3f31b8f314e3ecad446d3fb0fdfcd2be9b08374b1a7e049fb68e69e8dacdd13f1df5007a656f6b11adc5b","services":["streamer"],"enable_msg_events":true,"port":63343},"up":true}},{"node":{"config":{"id":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","private_key":"c0a44ebed32208583420c7444e83ac3526001946e4f7f6b561c24d98f96cc0a6","name":"node_74d84cfdaf32cd4cc67771f29878f1365120bd65cc14848008d5386a81f495bf88eb4132fa38a2cc109ae1e7f02c9b97597ab9d1a9c19c945e710ab9df07cdcd","services":["streamer"],"enable_msg_events":true,"port":63344},"up":true}},{"node":{"config":{"id":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","private_key":"d38eae2be9d262c3b37bbd8afb82bc0cd431e4c484ae92747ad064e4138e9f33","name":"node_6b4e376e9c94242b6d42688c22aa9ab418cb6dfb1cbca1c69de0feceec8d3af29fb005017aaa6e503cc0c03cf0dc5bcab55e01cd6f64b9efa02ed87c03020003","services":["streamer"],"enable_msg_events":true,"port":63345},"up":true}},{"node":{"config":{"id":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","private_key":"e345c696901db291ce988a19c0ad31ca0a38628ebc03c0bc87307d2c8f031346","name":"node_92d6ef729992f0de886076e5f8cdc42cbbd70b29e79c25e0b3d22b6575d3d2508d47b42f581e335455483d43625bce4e55f88cab9ff2073ee8dab746357864fd","services":["streamer"],"enable_msg_events":true,"port":63346},"up":true}},{"node":{"config":{"id":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","private_key":"7149ecac9f7173c182b233a94bfcf854714955592618e1d9500c622a08fc3faf","name":"node_57cd4c0048b459192ee46e19ec7df777e600f256e0dc8c3019431eb7bec3c020b9504ec7aea3dba8188658ca5b830ec40af6a8540ce10e04badc6c695d009271","services":["streamer"],"enable_msg_events":true,"port":63347},"up":true}},{"node":{"config":{"id":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","private_key":"cf6da8ba09884f084c279f1f25340712041f3c36c9b6be1c0fec270bdf17a875","name":"node_831cde5b651ba327b059da4c7f84b184bdd6bb99c6690ae816affe25d42c6c3dbe5b59e2b6bf23e9d0f6c485bd341ea57ba1a8220d18b0a40e156b77d84f79ef","services":["streamer"],"enable_msg_events":true,"port":63348},"up":true}},{"node":{"config":{"id":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","private_key":"2acdb11a79e469d5e7e20a391253ad6909ecab541c9931d5f7422de792574b6b","name":"node_71f89efcf939294bb94ac669c8afd00def58c8dfad519c226adfa068692d588ef797116d42aa146b9d34f3be35ec7c014022640ab3c0f1f9034e44ab1a26e246","services":["streamer"],"enable_msg_events":true,"port":63349},"up":true}},{"node":{"config":{"id":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","private_key":"63cfea5298455b0cf7952a47db686e5c91ca2f2e16610167e5c15337e67feeab","name":"node_4ff66e9b5d3fd345990bd7605bdc222b78946f0c13b72bf80352812b2426d8f1d36c93e6c8713566004615e8a78ecab12ab0cfba254c0967eeecf8875b25bdae","services":["streamer"],"enable_msg_events":true,"port":63350},"up":true}},{"node":{"config":{"id":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","private_key":"28315ffa74cadce008f22997503621aee7c6df8dd478536421715a17ebb97a74","name":"node_9bd4f0adb9a966cc5ba632f1b540fe9cd6c8e39fe1a041b315697679cfb04b735952062ce057d456677cc34a84301f26bb727a4ab2646fee734f80a22c620746","services":["streamer"],"enable_msg_events":true,"port":63351},"up":true}},{"node":{"config":{"id":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","private_key":"1177b8e7b7ed31f6a54030f8b4341593d3a1d72aae40f9156861650da1746f2e","name":"node_58cfb20d3da3641e0ad529b9edbd4b590a8d1dc9d1ed7b44ed3187dba9260bd7c732fc10981f5b9bffd31d362cb05150173618aa36138984431d94a323a9b313","services":["streamer"],"enable_msg_events":true,"port":63352},"up":true}},{"node":{"config":{"id":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","private_key":"d007b46d1a1f6a2d085b54b2073f46bebdad50a651920b7083908d388be5e5ef","name":"node_094f9d0fd3bacb17ac67a2edb8ed394fbbd1c8d478233d3269cf217e7b788e21042374936b885bf23ee4f9e03babbe4e08db283dfc2a6e052a8a5ba133717dd5","services":["streamer"],"enable_msg_events":true,"port":63353},"up":true}},{"node":{"config":{"id":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","private_key":"260581578bd37f4523054c95aee9f6b4beea4ed6b39edfb8b9506264d93337d7","name":"node_7646d08b3e24183e3814de130235c41eb88a5a2abff23eaff3c91954ad3ef55fe27da422dac5b894312276bf1a2f1aebb8b636a8d4a0c93d9b016d441df3fa19","services":["streamer"],"enable_msg_events":true,"port":63354},"up":true}},{"node":{"config":{"id":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","private_key":"49be559b16c8e23e2031acd1d93ffd182c0f09e54f7893335d04febec1b48e99","name":"node_9b618ad34d0dfe0fccbd5b8af365cbcdbb43e802df5f23e91c20d21f3ead6169d52bf0db7e5e111abef630c9853419fb33a88cf111d8507b8708208b5d65e35e","services":["streamer"],"enable_msg_events":true,"port":63355},"up":true}},{"node":{"config":{"id":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","private_key":"7b742610b213ed9b0492c97d62574eafc92dd73cb24ba74c4f1023fb4d8843ae","name":"node_4a030ebcb1a59230759d25a3c87daed22906b520d55a78eab2083bb52358ddc3a5d2d7c3265e6c54a990bf32d0dacb85905a4173d72ac18fcd74c43ecb8635c5","services":["streamer"],"enable_msg_events":true,"port":63356},"up":true}},{"node":{"config":{"id":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","private_key":"c90aa4ff988d9d5aa9ed033d3c8076c073ebcdcb0131604299ca721f38d363ad","name":"node_e0f78c59a61f2a953553cd5742c58f4a82e38e35ac7eaa237a6ffc9fb0a3a26a2d1d1afae249e611d1320f2cb25804bdbdfb6d77336449716b0f4beb3298b8aa","services":["streamer"],"enable_msg_events":true,"port":63357},"up":true}},{"node":{"config":{"id":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","private_key":"77bd908de80bb222465d000554b9467681aef696c9e1a81e51dba688310dc7af","name":"node_84dfd4e4d9f1204893f190eacc4c3999e175c433f70de86e335d27477c097a0552f211a21764f01a708da4c9e9e6552191a61d3e48f41d0e84f01e7ae3beb34e","services":["streamer"],"enable_msg_events":true,"port":63358},"up":true}},{"node":{"config":{"id":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","private_key":"529ac85f80c2ef25f0cca3417a1745d3573eef2b8cd611eab45c6bf857c87158","name":"node_ba21a373781966135d6225adae024a3f3e421b852f72f8b0569cb92fcff87c33f7e5b799a509b8eff6ec6dc46a9b17d5bae1e91ec7c54c0c712d893d54b140fa","services":["streamer"],"enable_msg_events":true,"port":63359},"up":true}},{"node":{"config":{"id":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","private_key":"46d69d2cb90a6ff16facb7994569557da8b0c76f74d238381a2a53cadbd1d8de","name":"node_fd4968df03d767a223bf7e4dbe26b5c27048298df40e81cad50b344fb3e6837965f2646dab7ffb2891a5c507343ed84bb8bbe403287b51dae538d58fcb6e7623","services":["streamer"],"enable_msg_events":true,"port":63360},"up":true}},{"node":{"config":{"id":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","private_key":"668577a2160c0a19ddd60a032636f42ef4b0f8d7f8b15129b39bc693b04951b3","name":"node_07c63ca5d0309e30d1ab12e7fc142e6d37904b552639cfa97850161491f28f20d87e0304be29357bcfc2ff52fc52fd0d4f6e6011ebb239cced8b5c8dad7abf45","services":["streamer"],"enable_msg_events":true,"port":63361},"up":true}},{"node":{"config":{"id":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","private_key":"ccd33f1981701e030d7880879453393ccb90b02d71fc85a89d82f903d1a81066","name":"node_920a301186bdf665a721676ece7c180413369ea6eff7537f42049d9eb409f28cc864099590116e885f57368959fb2cff7003697d9b1515e68bf3fa7aee0278ef","services":["streamer"],"enable_msg_events":true,"port":63362},"up":true}},{"node":{"config":{"id":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","private_key":"1859e8cc62440d9e1d1c35f842b8bab336798e87932bc4f2456c327fdc777a7d","name":"node_89a5b92a9ca045f12c35a70084e6f41f9775a25d6f105f8c9349c7b5e107179d8a96bdbb113b2680edf5183e9a42fd64bd7b29d0dc7797c583b833f869313699","services":["streamer"],"enable_msg_events":true,"port":63363},"up":true}},{"node":{"config":{"id":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","private_key":"45dad25ea664452913d4fb09debe8987c94b88ef752b058a7bf352f144a9c6ea","name":"node_beec648d79437a5d7b4140ced45d82d035c6f64f9c67c58386703811d97c3846787eaf274d2298df809475f0b7519df696563cb8e9a5fb0a9cc419ab13fa8d41","services":["streamer"],"enable_msg_events":true,"port":63364},"up":true}},{"node":{"config":{"id":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","private_key":"042b5ccd68b8dd6c125ecd889c304299fa18c22841c95b5fae01a22fa98ce96d","name":"node_c73d088ade8756c74832c73542bcdb3e52f670f7a74ad3a7eac2a9e3ece6bd081f782a8e1d3f9a40b9aa9201509110f37fc57fcb10ee1ef3ef07b7eab019782e","services":["streamer"],"enable_msg_events":true,"port":63365},"up":true}},{"node":{"config":{"id":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","private_key":"1a8c7f2f97bcaa5711578ec1de04829d7735f81ba5761087e79a977405ec1801","name":"node_62dab8b21640e1b44dea452dd7e7de93f27a44840da72d56b11aa96e8463f3a4bb15e75a954d19fc897ae0030b16181d271b79d8198b7cffcddaa9ffcfdcce73","services":["streamer"],"enable_msg_events":true,"port":63366},"up":true}},{"node":{"config":{"id":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","private_key":"d7a4980a0fc96842e8e570863a3b8e078baefe4ca8ab2ddf85c7c5d8f541fabb","name":"node_9e621c3eb534855ca292efa27a3fbc89b4f05c80a4bc65bcff2f14ff28ef43cbe14137d2fddc6fe2658bb06947d918476b479dde71469b8680e5d8a7a01619b5","services":["streamer"],"enable_msg_events":true,"port":63367},"up":true}},{"node":{"config":{"id":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","private_key":"d2e98b0004a9b7bdb030d5e729716e7065aa1a8c48efacf471718bc5da8ec990","name":"node_afe5b217dc512eee45575c189826ee5640d11a0ac9e8e4b03e9e62e6cf6df9de500bc8a36cb7d82a2280ce184409164f1772cc5c9e59ad04361522d2b8c364e0","services":["streamer"],"enable_msg_events":true,"port":63368},"up":true}},{"node":{"config":{"id":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","private_key":"bd3302dac250b294208d6ed14b0a14a6d60d75be1f68ce5cd1e250a47032fb3d","name":"node_db8ba71afeaea1f2964e8978a6eceeb9efa3958424424022213c8193443f8d5afd18490afa954c76360c681404809c7cfaf7e4ebd8bd1a42d403f7f1915b0d29","services":["streamer"],"enable_msg_events":true,"port":63369},"up":true}},{"node":{"config":{"id":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","private_key":"f5832a55177daebfda3bcaf8b5ebc11eb44f4d5207b8384fd35999944d2fcab0","name":"node_2f1967b4410ea2ea8fbaf46771ba82c2846d00aecdb6f873aceae33ab38f72d0a2c2dc6046d3034f514efd090d42011d48e9ab0cb4e3caa2b49a96ef732215a1","services":["streamer"],"enable_msg_events":true,"port":63370},"up":true}},{"node":{"config":{"id":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","private_key":"8285330088dc95f441c68f12765ee99f065fc41f665b54a257172d9b4ff6e017","name":"node_a99852c5bf08ea4713af9cade5343d1259bfb90401aca7fcff18c58cd56a98804dd16c61fea71039c0ac31b9bbbb9dc5aeaf0c2f074d3365e88d17031802d636","services":["streamer"],"enable_msg_events":true,"port":63371},"up":true}},{"node":{"config":{"id":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","private_key":"96a76a56912e05cbd480fde154743a65f4bdaba5395cf685c22681fa403807b3","name":"node_4e68553db7be307b8379e8bec383b5c92e4b23debcefca575d24504e2062618f74c26e60e0d9e47f096997a7f841e2c32c994124f495ef3352ef964b33fd3a51","services":["streamer"],"enable_msg_events":true,"port":63372},"up":true}},{"node":{"config":{"id":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","private_key":"bf0a6c406d390baa5a33fc469dd8b3ec25e406364bafa8ad3d9b422dd58b4a87","name":"node_a608a746f46d4b2e9267c65283380d6d6cb8885a64428fb77df9934bcf4dd1723587ee7c8f4a642dce266a12a6a4cf4e5c6db7fa1024158425a6753e7ab7264c","services":["streamer"],"enable_msg_events":true,"port":63373},"up":true}},{"node":{"config":{"id":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","private_key":"4010f083fe123b4e1e1091a054b7af104d76038c1313c71470b38aa16a05688b","name":"node_fde7705f5013c3b6b76a35505c1e3d57c033a337f2a71e912ec3a3d2da8e113bd7c36d94908357e9f7654660621f647ad8c66b0126dfe91dbfa3b8c7bd2183d3","services":["streamer"],"enable_msg_events":true,"port":63374},"up":true}},{"node":{"config":{"id":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","private_key":"e2894e5fef7fae6c4a6969fdf39bb99e8fb16849881a5a7d45cfde92ab16232f","name":"node_3dfd733dde9414af916625ab981777ff1ad7ca0f6d1e4e7d9e2739969e21182fd13d85e281868653e7325b20069356b11524b54143c47fd3955a911cf7325ad4","services":["streamer"],"enable_msg_events":true,"port":63375},"up":true}},{"node":{"config":{"id":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","private_key":"1273dc5cdf253e8042d52ca10f80d25481d40b5cc80b37b3e128edafde8fabec","name":"node_5142eea687de4248b2184e9896b245563117648e7a156255d9a7ae730313d5d383db3be1125b5accd7e743c2a5d8c3289ec559ef7cbb803b9e82cd49bb213d9f","services":["streamer"],"enable_msg_events":true,"port":63376},"up":true}},{"node":{"config":{"id":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","private_key":"082369e49a61588917d594d0a90c2d53968db7910a1fa9a978da33f53d8f5166","name":"node_b597c9ba4da20c49fc4ba019571321d2579588636cdaceb9f225706574970adbf4771dcf186b1decd4e14cd5d257e30a36ca829829598c1775902201ad9793e2","services":["streamer"],"enable_msg_events":true,"port":63377},"up":true}},{"node":{"config":{"id":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","private_key":"5ac4501287d61d0083f3143a6184fca450c07d149279fdb3a19ae3dbcf456732","name":"node_72e30d4562673c5c8fb03709d93f73322747858d723b7eb5ef2fbb88e0331252946b7e93ffe434fcb599c4fff57800afb29e6c60a719f18f49dba541c3591c6e","services":["streamer"],"enable_msg_events":true,"port":63378},"up":true}},{"node":{"config":{"id":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","private_key":"cbc289ddf69a20e78f479b1587fe2955c2ee7a0bc7a743ce61c13c07139b33c1","name":"node_eaca77d20c4ad6b87649eba21b750a4b1a2c575e06bc42679d18fce16fea15212e9a7408c16f3b24d8dfd1e397314637e72e292845d09534a39035bd9203ee9e","services":["streamer"],"enable_msg_events":true,"port":63379},"up":true}},{"node":{"config":{"id":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","private_key":"dce8d0367de94896d0c24049979fda6a48f77b8e98974d66472666a5a4365865","name":"node_d3105ede6c21bc643d523afcd1309a5dcf03f70797a92f167c3a19f86ae98882fe1a9d4094d7a3dee4a0833b8075b6c3e9aaa7f4879dc47bb388c3ae85522288","services":["streamer"],"enable_msg_events":true,"port":63380},"up":true}},{"node":{"config":{"id":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","private_key":"138e8952e22f78dbf4ea1aad84cc393a1553192402f5cb23a8d15459d9254240","name":"node_6f60ef501b41f9049419b033ae8d793a18067bdcd60347537b0dc3873bdd9a2d10d24909cca7c39781765746128c2165596f6537a94f58279523faee71f9c51d","services":["streamer"],"enable_msg_events":true,"port":63381},"up":true}},{"node":{"config":{"id":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","private_key":"b50b26bf10abf56d51a891c4449915de09ce392d6c5a8170ae5ea5eb3a082d8f","name":"node_453779010ed7c59761da47ccd8869d3fa8349795e57edb9eea416c0712301ea622c7683858e309d19ab137ddb0edef161d0d00a361abeecf0628c3ffabc629ea","services":["streamer"],"enable_msg_events":true,"port":63382},"up":true}},{"node":{"config":{"id":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","private_key":"269797dfe5cc0dab8d44b114878dd8ec081d6551214db901b361817184a58bcc","name":"node_e2a27dcdee1f89fa362a85c4397840cd8be4ad8d1b9ccb23188c303bcab7619f38772f71385922d090390973b62fb8249efc103f71bc761041bcb3880ec0b935","services":["streamer"],"enable_msg_events":true,"port":63383},"up":true}},{"node":{"config":{"id":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","private_key":"09082c0128f28346808a35b0b607d4e7d6c9ab7e894b5166958bb2eba5f4c0b3","name":"node_97981f4b825620985b746c85824d7a4d307ee25d60a72c2b7de4b1d4f3b1c002652adc3045842d350f849789e410a0357a0b42fa637a1b4fc9d39e44f8a674d7","services":["streamer"],"enable_msg_events":true,"port":63384},"up":true}},{"node":{"config":{"id":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","private_key":"ca130a8083cac47d964d46dbbded845892b326aa4fa12489d21578f9f018d45b","name":"node_fe62314839c93d2f6e3aee984d5f0b321897c6f39e66800d3de8b773baf6f19e0a03cae025df512aea8d5f1b667b6dbb15c192a90a76d3031c14e33e5c16c4f7","services":["streamer"],"enable_msg_events":true,"port":63385},"up":true}},{"node":{"config":{"id":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","private_key":"5d649fb189f6b462f678a083e7ad8d874c6bdeaafe0817cf4b361448024d9428","name":"node_c903c5ee3d9cd65bea3ea777e39282c33e1349d945411fb2f16321bf582c2f400956a98fbafe5873fc5f6f6a9a051df5da7e94cbd340f935abe80f91e79ef875","services":["streamer"],"enable_msg_events":true,"port":63386},"up":true}},{"node":{"config":{"id":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","private_key":"74fcb757f856401d62426a3e62cff6870099b0b261afb281d8d9e7dcf355a87b","name":"node_5420da16f7ed5de6b498dbc9a83b7e92e1f9900a6d04ef7351a0bfdfd442b98a5634f28fcea32ba3f3166d21c8ff5a39be70895b32acbdf7592d1d616a345a21","services":["streamer"],"enable_msg_events":true,"port":63387},"up":true}},{"node":{"config":{"id":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","private_key":"3e1263efdc899dcd32f1fd206de2370195ae82fccb81eb354dd9cb52fc5994e6","name":"node_f54335964d9b4eb9813eb05f40ef1c523bbf0faac5a04c4737467d590fb6b55c7fa1fc5d4d32c5491d8766b9be6fdfd3ebdb25c5ffe1719f36c86ddf87ae3a85","services":["streamer"],"enable_msg_events":true,"port":63388},"up":true}},{"node":{"config":{"id":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","private_key":"a7cb8f80391de65478acf12a59fd0a0e9c5f04f0e4bc1da34b9acd35c586fe98","name":"node_40bdac599b00e9c41ad6476ee415c33d9c17c5aa672692c2404e523b29dc315da929a86874bed87fd9009871805d1dbf3098e7a817193e3b08a6eee66346da79","services":["streamer"],"enable_msg_events":true,"port":63389},"up":true}},{"node":{"config":{"id":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","private_key":"dbbe33233150cc109e4ec1b6d6bf5f14bb573d87551440db2407ec75821b4ee6","name":"node_b26f7c0113a5ae885f7c0e608aea7022a9c8bfc40c5643e60b2ba7343ff09c5be0bc08be34dde3c6b85fea192a46d4764770c12cbaa233df4231a1b99627ef9d","services":["streamer"],"enable_msg_events":true,"port":63390},"up":true}},{"node":{"config":{"id":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","private_key":"1058ecb8bc4354469a7fbef819dd8efc60c72db3101ff2f4d3d8089876ae94d1","name":"node_829b074b70d757da6aa00f7bace3cf1b5d2d4eeadb7f370c1a85374a01a70b54ac53d747267e386f3b41e6d790fecdd6e74b8f89745501ee82439a66ea54443a","services":["streamer"],"enable_msg_events":true,"port":63391},"up":true}},{"node":{"config":{"id":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","private_key":"7a22f9270103c5214bec5fccac665913b7e9ba442667ca7ca7f1bead2d44e594","name":"node_302c37f28c69fdcf00b39ce0c0223de0d94cebc2c0b068315b95b76b5432573ead0656569441029ba9054d8d3d959fd8735e73913af5ce3f1132f8271fd437ef","services":["streamer"],"enable_msg_events":true,"port":63392},"up":true}},{"node":{"config":{"id":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","private_key":"32e05e400e6938d31aa93e7666905a5a12e2b4b706354eae5f34259cf6880e60","name":"node_4e95fb8943ef6502fa470870a7ace4ca11e18589bd2073167543a922317b35e40b5068934d07e56c8fdd23354dfad51fd2899db854f189841f02b5914cd97749","services":["streamer"],"enable_msg_events":true,"port":63393},"up":true}},{"node":{"config":{"id":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","private_key":"f6b0641261c3c0741d61572a591e72180deb8ba2c9922ea5db694c5b372aef6f","name":"node_807340e5fdf6c21a56ef2fd158c32e92201206ca85fcc147165a408f7a735964afd47c397e663610ac53870ae722c0317291732b0422f8aeedae783d9c730218","services":["streamer"],"enable_msg_events":true,"port":63394},"up":true}},{"node":{"config":{"id":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","private_key":"5809952239bc91701c49a3ca4362fe2f96294405e789a467c4899d1dc94f88ff","name":"node_c9cd9dfb9f90a7948ac5a42c7bd63263f2eef6e1d85547559f7d2ecbf5f9cd1eab051b8e9e661b573c275d84091a44e73f6fc6bcc91dcdb674bd5d939190fc01","services":["streamer"],"enable_msg_events":true,"port":63395},"up":true}},{"node":{"config":{"id":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","private_key":"284f36dbabbb181f068bce762670de591bac534570ddba3da4c91381188cc3a8","name":"node_1bc1d6155ba35d29ea16938994e08df76ebd8f16bd180bd6a9b9d8798d0745889fe72d641dd78bd8ec13526929f7eb5aaa6a388430fa69033d6db581e53c6422","services":["streamer"],"enable_msg_events":true,"port":63396},"up":true}},{"node":{"config":{"id":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","private_key":"c1b4e417ecbce61a39ecf4a30b86e303e82534bd890eea7c30b6ab4d0bdca861","name":"node_e267e71c2dcdbe5a500b23444d2d4037ea15afba8f4f2b1c0e54a274450404fbee6fa5439f7cddf4ba1aa28fa93e434b01c239add58e30a5423ca3a481584d6b","services":["streamer"],"enable_msg_events":true,"port":63397},"up":true}},{"node":{"config":{"id":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","private_key":"eda1f1637d46610c0a885d4e08d8d4e776868f98be4dca745ebfadda65f2a81b","name":"node_e98a08e8e3544727f5ee27f4465375a67ffba490fcdbfe7bfdc909f6b68bd279f776c65d38c2ccfc33079f852f76349c94d68fc6989c0d981f22333f036a4bb5","services":["streamer"],"enable_msg_events":true,"port":63398},"up":true}},{"node":{"config":{"id":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","private_key":"51d301cb37e7206eeee2847d753aa67cbf0513b6e7cd41022003c2e7b3ef5581","name":"node_cb310c0e86aa455d7c9af6394ae38561c901da30a51d7ccb7e66a09d9a8f192ae8caeff106043426d56397088f141c4e01e3b98f1ee583ffc7318b5f730f3ac7","services":["streamer"],"enable_msg_events":true,"port":63399},"up":true}},{"node":{"config":{"id":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","private_key":"30d23072d68ccfe357cba2b3294b9584b591e8c7898031f7c4dbaaadfdd05e1b","name":"node_1090e9d89cb278a30063a5396d9ba795d3bbc237c76915a6fb7d23aa1822c8535d2fccc44cc8cd2acec68444c0bf1bdf5195ebb9f3cad8dac3d94a4d9c0e5309","services":["streamer"],"enable_msg_events":true,"port":63400},"up":true}},{"node":{"config":{"id":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","private_key":"90d8283793c2eb15b76d7d9e492b3c3e7136115c74bf027ad9985179380a82b8","name":"node_4b784f072b7c96c30612767425f552e30e45157e70139dfbe0ae4ff86dc31601adec60f8a3ad9747b02b5219073d8813af9b09d59eaf7ddb7ee24856aff6fa8f","services":["streamer"],"enable_msg_events":true,"port":63401},"up":true}},{"node":{"config":{"id":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","private_key":"b9111f0cf5ecf0a5dd7683f07c58f581a175bfbdf307224db008d7792e30c6a3","name":"node_22010c9829626a6892258b09cb3f3edc3f21382fb487b5dbf0dd20e198e37e26134aab850e30337f398d1491b5126839aeb1953ec144bc19aeb889c832f67c6a","services":["streamer"],"enable_msg_events":true,"port":63402},"up":true}},{"node":{"config":{"id":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","private_key":"7652297b6b2c9a5339f9d375aac2c9b81f0274e3949b4033e513c02802f040bd","name":"node_043fe7085e8c90c18270f84dba5fab138e50216a1cf8d81a3794d156fad7fc81d1422aff169b244b13f91d73eebb5de464f97b1b93b3ad2a58959cff19238842","services":["streamer"],"enable_msg_events":true,"port":63403},"up":true}},{"node":{"config":{"id":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","private_key":"7971b1a36d0caacd64acbd61a149d41c05102d757fc313f2c49c6b2185bc22d9","name":"node_329145e75496cecb5f5c8f00313a52ddd8c0e8cd27ef1b2bc1b2b56e4d4089aaf5a7a3c4d9a40bdb92483fa05bd24d1cd0fd51883e30439dffa0fc855e1a7cd0","services":["streamer"],"enable_msg_events":true,"port":63404},"up":true}},{"node":{"config":{"id":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","private_key":"62692081cdf8e04e73d8942c5fb423f153ea6d32d16fc0e3b05c10927bcc42c3","name":"node_2a63d875e715c2a43302d32d86d30c7d7faed46c08a67bf488762637216b99dd87333a66df6d9f3a57df863b1f1a219ddbeebb9f3e92e523bd08540a195448ca","services":["streamer"],"enable_msg_events":true,"port":63405},"up":true}},{"node":{"config":{"id":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","private_key":"bff5d02d0e187260b2ac19e027a5a8c72d358aa420a1dd22dcc8d34a921a81f7","name":"node_0deda014fa3c0bc8f37d853e1448f95f56f97048c28797d72258fd3ba2f1f776ae11566197466596356cd172847ab02a89f4cf047e58383249fb2a4cd69b6206","services":["streamer"],"enable_msg_events":true,"port":63406},"up":true}},{"node":{"config":{"id":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","private_key":"e2478cb11c2e4c83e5be5962e0a2e9dd367bc4bed98c7bcd08c211f35010b4f8","name":"node_c332fe1f9b6e25f72c7150631ffa6e0929ff6eeab5d17aa45eaf669bdde869cf404505ae990a529aa3ca797cd0a96f31cc41431a5d4a163132be566f91623c08","services":["streamer"],"enable_msg_events":true,"port":63407},"up":true}},{"node":{"config":{"id":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","private_key":"c4dc5aeb69312070307af3c8a24d468a0284733f29b07b5407e0819cb054fbdf","name":"node_5566111b7f14d8ec83ba6456488f3fc5c7e2c86bf406dead33b814e1ee9b569d34015a4d88226b7e28fff7784395c086d106287cbbc80acfe75b05cd6e12903d","services":["streamer"],"enable_msg_events":true,"port":63408},"up":true}},{"node":{"config":{"id":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","private_key":"6832f6f7e27fc6e2c9745c44ea7004ffd4f6bd869b779e15ac0a4a2ffade7999","name":"node_b4a5efa9028b2d196855393892f79993c2812d02b758f98813ddf82c5d943faf6d66eff811cc5a51936c118f4c768c0d13b54902095e040c602761e63c08655e","services":["streamer"],"enable_msg_events":true,"port":63409},"up":true}},{"node":{"config":{"id":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","private_key":"3362a08daff495b41e00fcb4786a68fff7a58eda86b6f6cb61bef90aaa604daa","name":"node_adfba6d883cacbb141cd8c59ee04d7e5d520f1ce31a81e5db2d8b2380bf801c1fe4b265a66b71f9643d13a41cb1f6fb4b83399be786da4b6e171b6784bc56e49","services":["streamer"],"enable_msg_events":true,"port":63410},"up":true}},{"node":{"config":{"id":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","private_key":"1d18aaec8f9b90606b18283e8527016a8122999804aa11d280ab2bb37f14a948","name":"node_2bfba66ec9d63e928d77d455f2e10a14d6213e515099d5db14fa44a8bfc147eb0fa7afa9aaccdc86453c6903b55556059a2e13dd61fc494127d4a3ec173bf9ea","services":["streamer"],"enable_msg_events":true,"port":63411},"up":true}},{"node":{"config":{"id":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","private_key":"757285cfa33b746d1bf24044430d43f5ff7401cef2452217ac9fe5fbce629acb","name":"node_0b7e1e5acabcde503ad827e45724402406114a513f81040a379b0f82df2eab4456b348b27936369c49e3c264d971c6a9e2c2217fdbc5e5b93ac6fc219957834d","services":["streamer"],"enable_msg_events":true,"port":63412},"up":true}},{"node":{"config":{"id":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","private_key":"cc0bf84e41ddcab9146ec892653a911dce5007786d77ec7a32e490fea0a29687","name":"node_7554993f6efd8d9016ff525ae73c41ee2e0dbd4970c563ba9b61a99c1c8943b433c4b7d48450f6e0fbc9ac198d907698093de20e6c1f7755520fb1e1cbee4eb4","services":["streamer"],"enable_msg_events":true,"port":63413},"up":true}},{"node":{"config":{"id":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","private_key":"d1add26924dcfc37eefccd6271759a9b0a2052607f3698be305e1c9bcb47ea66","name":"node_4fe37f2dfb03707c90a6fe91dbcfd7497db70ffc20043091d50e1cee573210c144e8749340f2c3cb70fe8fc51b317d49e8734dc51ce64b3cdccdd639ae35d1ae","services":["streamer"],"enable_msg_events":true,"port":63414},"up":true}},{"node":{"config":{"id":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","private_key":"fb8563b48e2c07948cc2347d50c953b2b4bcd79a535c2ac597d8f8c7f1ffa8e6","name":"node_a7507aa5665e165ab2e2a07def272f0677f9d6d35bb82268a34214384e7d8ef7635a299368752e63cfd02d4e60231076baf23cfa10d17492e55181b391ecf335","services":["streamer"],"enable_msg_events":true,"port":63415},"up":true}},{"node":{"config":{"id":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","private_key":"f7b5d2c9faba98230f0e0bbd82106d1fb949413a7940eec52e71e9c5c7266d3e","name":"node_7e2b0b4f3b55e97bd7241b984ad117af33bf3baacd22b3ed503a8a59f75828df745fb3ce3be4276d83eb484e64d9aa251103fa994ef119eaddb97a3503b9f292","services":["streamer"],"enable_msg_events":true,"port":63416},"up":true}},{"node":{"config":{"id":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","private_key":"61a9bec441ae9ada2f3ed71874596db20f2807e921453ec39145770056e3cee5","name":"node_460531928a4b084686343c8464b37c3452bb3566045698d08a4692864de5581a9eb1dc632329e7d3ccb73ec31ee7693787d69df8458efaba9a7105d87ee2e053","services":["streamer"],"enable_msg_events":true,"port":63417},"up":true}},{"node":{"config":{"id":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","private_key":"56e11a31d85d33461e13dd635ea6c0d0be892feb3ccc9dadc327bbd855401d2c","name":"node_70ee3c7e02a123f78345d41c386e413f06b51f1ab346c2c472891eed7dd26a1f14e213a0f4f2d872859b9b535936a6d9b072d2604456f76221a422710411822f","services":["streamer"],"enable_msg_events":true,"port":63418},"up":true}},{"node":{"config":{"id":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","private_key":"6df50913c97d23ce9e4ed894465ae4eb0f562d595e46d694b47e72d31c8bc8fd","name":"node_049a2b0ab4d49789dbbe1837e2d2ee5220a9401729ea87ab29385b24d79cdce255c3d2b5de6484d49ca6ce07bd41832598260c0a8c290e01d133d77f066f2f99","services":["streamer"],"enable_msg_events":true,"port":63419},"up":true}},{"node":{"config":{"id":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","private_key":"164a5b537bdf9173b59b281a68d7da48819c2367e5b5faa1c94c74453a413015","name":"node_1f6d803a4ca186463772850ca0901fb920af7e74fdd2480c3c368fa707838ee91bbcfb57d5e3510c802b9b85f2d954f04c9b675414274bdaebae6488dcf94c10","services":["streamer"],"enable_msg_events":true,"port":63420},"up":true}},{"node":{"config":{"id":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","private_key":"0b14673d7790bcbb1b3f0d042dd9b22953002e6dd901486b6f203063bb8b5a79","name":"node_979838eaefcff456cf1cd9c47ea46854704f5757d8d7ab907019bc422b01af4d62252579bf045d143fab491b0bab823190e2782a457fbf51aa99ae17ec9e145f","services":["streamer"],"enable_msg_events":true,"port":63421},"up":true}},{"node":{"config":{"id":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","private_key":"5d6c015866ee2afba25f1435274fb61e0b11b93829309bccad6cb662e5a4c8fb","name":"node_ed6c793eb4565aa9d883a76fad6c97ad0b878b9ef0235e11e89db1af25a9653205f725c6ea258b84bde134f1a6437c6d109b859d17509e5016c4ab98be59032a","services":["streamer"],"enable_msg_events":true,"port":63422},"up":true}},{"node":{"config":{"id":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","private_key":"acbf964dfcd41c86715a5ecb9c03818b577cbb0755692cde879ff1e4b09e5df6","name":"node_6c143960dbe3ba4c95e8debc1fda5f420a2a673eb46f7ff7d9a30f4cd2067e67ef8926bf17f0c99b16c79b6dc066b52409a11d47117d4fda4211636b1b74f96c","services":["streamer"],"enable_msg_events":true,"port":63423},"up":true}},{"node":{"config":{"id":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","private_key":"0b325cafe8524b8c126e860a6295fdeff6cf26da5e8eb426b86b25ba049c942b","name":"node_7bbb3f3ed51cf84c077806fbd6d3578e105bc32aa6043da188793f066ad6df383a9f7cc0bd3124f4c887704bd188d480ce264fcdf178905bbda3b270927ea138","services":["streamer"],"enable_msg_events":true,"port":63424},"up":true}},{"node":{"config":{"id":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","private_key":"e03e1d397bdd121257b1cd781c14847cf220f23fa837a4ba7b48f7b0b51cdc3c","name":"node_2b70e5ffcc0bb1c4f8acc09dd1016e67c9c96c92d091ad481efbb71bd8b2a5a5869c6d668617a9b2cbfe91baf5edfe150c3824c84d90899a974099071d171441","services":["streamer"],"enable_msg_events":true,"port":63425},"up":true}},{"node":{"config":{"id":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","private_key":"8e1b0bcbebda90c6f0ba8edadd9133b28b77e49b584580e1219654aeeb9e3a2c","name":"node_f5c1215a84a56d52f92ca0dc3a32df98c98a9c2ea2e9a34560210c16de1b440d20d043c8c25955dda8c22e55e92ddb49fd82e8b9b84072aabaa755a229bb19f4","services":["streamer"],"enable_msg_events":true,"port":63426},"up":true}},{"node":{"config":{"id":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","private_key":"ec0e383740a40976e4b9195b6a89e9497e9562729d196b3febbfea319be5dbcb","name":"node_8c6d77833bf1a98beabe7a92d985d13d52fb2e50768719ffbc6fce21ea676802a074b6e620b3ef80e12fad04f94a3c288d91df9716a6cfae09ef073b9dc1f2cb","services":["streamer"],"enable_msg_events":true,"port":63427},"up":true}},{"node":{"config":{"id":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","private_key":"a8c69a5c41f2362bc5de8589f3686f3c59b02b58cb7139ba2325f1a7ff62c39e","name":"node_b3316f4fd7dec218a52331f25d17a2faf0f2a417808d7dbb80038154abfbcd2d78da074837b648cff28675f4aa0d65ddb7d15abf3d7e0391d401e313a3ef24a2","services":["streamer"],"enable_msg_events":true,"port":63428},"up":true}},{"node":{"config":{"id":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","private_key":"65ded6c2ad477ee077e81c1aa90fba5d4e0d794ea8dd5241a1545869c895185e","name":"node_60725e8d0e9333636e598dd666f459b4be898d9abc095ee2c1db289673e7e969b50e2093956fef5a2f1d23e2040159bbabaaeab17fc6dbbac3f6acab766e9e60","services":["streamer"],"enable_msg_events":true,"port":63429},"up":true}},{"node":{"config":{"id":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","private_key":"9e522b8e7f94aa50d51d7ac396a12701677f86d0f9ad7111b329ba8229880db1","name":"node_48a5e01e06e297dc1c640ac9601171495bd70fea461c60e7e6e2532695e45fcf68183c2e58b5e6931a6c1c094f5331efbd7f2d93d5f84efdec5a35afa2124438","services":["streamer"],"enable_msg_events":true,"port":63430},"up":true}},{"node":{"config":{"id":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","private_key":"2325b0e86e0abaef149e6063ff789995d1f6d863de595a5abcebffdad494ebb9","name":"node_5dc69635f6d573c824ea83b18593a47f9f21a6f91ce18d2bf977c97d21f8d2a8ce88829244d12a07d949bbd52fe8a2035bc89685fe1bdd4ee20d766d75d3deee","services":["streamer"],"enable_msg_events":true,"port":63431},"up":true}},{"node":{"config":{"id":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","private_key":"dbdf629720f7cd6d4a8e26a5bb6da882212d6cbf43ddcda4712539c3db89bbf5","name":"node_ae4e21e1587a8475afd299e00ca7085c7bf2a44c2c64a3068f12223d9202b0125094385319034691ec26b497ec9cf18fe8c0839224bac1b84279410241cef979","services":["streamer"],"enable_msg_events":true,"port":63432},"up":true}},{"node":{"config":{"id":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","private_key":"315e74a348a3f8e172319c29da33577435f6415466e8cc289af2dc7e142987d7","name":"node_0b30b36e155db04c448b662c4df695068b2331cdbe2772aae5fda84159e977515a5ff2e156bc225a9281fef2383926ba8cb11e9c1846fb40db241e524ac14e29","services":["streamer"],"enable_msg_events":true,"port":63433},"up":true}},{"node":{"config":{"id":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","private_key":"510061145b0b868f1fb7e83b850d0901227724f4559e912c0561ac310308ea80","name":"node_17a79cb279306b6bbd35219278f6bba03111079d6c4fadcd3c5e57b09678e111bda5f8e36ca3d223e51e255d6e857363b7741e438b32ec6e6c0dc1b224071081","services":["streamer"],"enable_msg_events":true,"port":63434},"up":true}},{"node":{"config":{"id":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","private_key":"b4c3b4d3b3fb735ed7f1b4dbfa53fb08ca505f7570d376ca8ff9ba10c108fea8","name":"node_617595a230e0a74a3db3b47cd27b941e02bdee9a84cdfa8eaa63a55941eb5caa79e20fb69726a4d46a0e5aeed24039f8c5a20679a692df0bc140f42558ca9a2b","services":["streamer"],"enable_msg_events":true,"port":63435},"up":true}},{"node":{"config":{"id":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","private_key":"0ceaf25d118fd30dfa73bfe157c4bfdbdd7bcdc44e699e71e2e397eff0988045","name":"node_7808fb798d22e78fb1d39b87ddf99a503f820993bc64149eca9e81d9d58fc1adea60d8de14a4f06cb89f3190c0ef0c5e182621a14c9361ccb7e0cee667599cc3","services":["streamer"],"enable_msg_events":true,"port":63436},"up":true}},{"node":{"config":{"id":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","private_key":"b8dcd04f9dd7c7d9522112f1d10c32738ce2283cb755c14b83b3e7d8d645c4f1","name":"node_f039df8a3206e6e17eee8e95010038c450cb4cc0b5580ed5795d4c21802e1e9d360f4528bdca794f457932b1d6a818862ec847357a861c488332ef6d9480daa6","services":["streamer"],"enable_msg_events":true,"port":63437},"up":true}},{"node":{"config":{"id":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","private_key":"e0f1d278d1346984b7b19789e39ae0ee607d17f0fc7538e8dc8537b44c09e142","name":"node_ce0a09bb6fe4c9c93c3dbd800ca9c9ac0714f26a8f8dac2149b6ce7a9011912a5621ea2e45de35c4d31dfe5add00558fdba5dd21acf2d81ba391e82b5b3a5804","services":["streamer"],"enable_msg_events":true,"port":63438},"up":true}},{"node":{"config":{"id":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","private_key":"6c9376463118cd8a2c68423af478150a6e0a1b811b922aa7d35974ec65943ad1","name":"node_b2538d4edfa736bfe2cc21326a44ce62f716b3480eac93584a2233b69c98883a2bb255f246218a58cecab1d0d176e6d1fbba9782fd70d4603e01742299b9ea9c","services":["streamer"],"enable_msg_events":true,"port":63439},"up":true}},{"node":{"config":{"id":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","private_key":"d391fbaa56954f68499674edef05d07d58c5512ae18166b141c961a4dea175fa","name":"node_aa9a94d6e4eaaed20113c21752c224e3a052abd3769bd6e832759dbaf5154a943cf094eacdcb0727c2fe51a11bd7fc0793d7d5e3312b0aba89d428a00e1fde0c","services":["streamer"],"enable_msg_events":true,"port":63440},"up":true}},{"node":{"config":{"id":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","private_key":"199542f222419c9f399da0655278169815321c4420c8e39a377faf1446b6da1f","name":"node_65e954e60837bda10654480b227fa3bcc6e63356c52079002a27e836cd82ae2934ba77da60080e4b9f2d9324b982b24959bfd9624302e6c330408381054b43e9","services":["streamer"],"enable_msg_events":true,"port":63441},"up":true}},{"node":{"config":{"id":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","private_key":"ff50f9bc8f6ce42cff12b697c1d4880461773518aaf5f25e5c8a03a8af128fa5","name":"node_8ca3b63cb84f1e9883d82809a9b6777ec1029ecda96fe93b4d494ee9cbefcad13f381b3e480136e542e01054fe1ede66c65db84a0009871ce49383db461c8438","services":["streamer"],"enable_msg_events":true,"port":63442},"up":true}},{"node":{"config":{"id":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","private_key":"2c15cd49d4a7fc8bf1acbb4f86987efe85c77ba2712f82531bf893084ef4654a","name":"node_caaf695c76cf7c047d3f3bfe019d01618e4871cee8ff3f347913da815bbcde145771486f916a44d03f59ea9bc217f169fd0c0765fda3f9b9b28d02a522e180b4","services":["streamer"],"enable_msg_events":true,"port":63443},"up":true}},{"node":{"config":{"id":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","private_key":"4c9c04de05a7a437923df855213efcc8c9489ba08352e267097b6bca9e840fba","name":"node_b080891d4ba6d3ab224984360597f9c555bd1367630f5420bfaf230419a05b2be58bebf1554e53eb4c0da81cfb66d4f7697dd65143f11841ff62d8a0d82b6b67","services":["streamer"],"enable_msg_events":true,"port":63444},"up":true}},{"node":{"config":{"id":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","private_key":"5b756c056cbcd8e0a9a926f6ebf3360d7587152f836459cd22eafd76c3984af8","name":"node_2ca05ffc0ad771e1e045a47f1c0a79ce374a25e3c0e53c2a80d67e7479677003f62880251a83a5074f1c9651d828f1ff7e352935a9df141c1eb75a0c59b00a8b","services":["streamer"],"enable_msg_events":true,"port":63445},"up":true}},{"node":{"config":{"id":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","private_key":"fd26d9072de53e5f0a3d88d7c32e80650d289f661906c9837a7a0a003f3520ac","name":"node_8d4920d6e3a6717699b5a3af068cbdfc16858d7e393d158d41b1b5f345b47129eef89e1d055386c518f400b134678c21590f0317dea3436d4cef60f45455cf12","services":["streamer"],"enable_msg_events":true,"port":63446},"up":true}},{"node":{"config":{"id":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","private_key":"3e2d345fa05f2ec2c8c4ae80fa808f0acaa098d08a2a0e7be1a2749f7d01f0e7","name":"node_b6a998dea59194cc60ce97c7c9702368411889cb6905516b23f41cc5116fba8d0f237d418318eb0c333cad18003c0e9a6bd8c99080520771f2bad640e2e5ec1c","services":["streamer"],"enable_msg_events":true,"port":63447},"up":true}},{"node":{"config":{"id":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","private_key":"69afb2f43d398d53995f3880ed20e91b1d92307e4f7b40cc63a785ebe01f5e9c","name":"node_ff6f94005d1df7677600069764855c1c2aa0543cbe9f480f8feefec76c49d9e2c7bb2d8e38c89e9430f53f8b593d93f143c45985a56a5a32c736128214c95eda","services":["streamer"],"enable_msg_events":true,"port":63448},"up":true}},{"node":{"config":{"id":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","private_key":"30cd694a144038e53930a6b5e32f95f2c9caa886829d241c282f385107d7b824","name":"node_315b8a1711f680c2eaa607e35ef7a9e19c2b61721af8a7e08f1325dde1fe33cf1f47b3cc4acf12d541631041cf1b42754875fd1c9b66ee32797b72b9f7711256","services":["streamer"],"enable_msg_events":true,"port":63449},"up":true}},{"node":{"config":{"id":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","private_key":"c1480926443179b2e410d0303830b51d36dcce107b45da1494d87d2bcfb4f2dc","name":"node_396c703d27bfdddf91761f134cbf665fe61e0b3a5d24036a4105a625f72e8c28b821e9200f20d6e8f8b3ed6b95bda6b8accdd840c2f786720b7431e3af2af981","services":["streamer"],"enable_msg_events":true,"port":63450},"up":true}},{"node":{"config":{"id":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","private_key":"e91e000d37d0a336fb7eaab8ca7baa4db177108f2140ee86f7bef5959b617e13","name":"node_cd8815d66aee8bd488d4e5e25f0cc9c71cc65349f701ea26b1d6cd9c039d16fcb473dbf270a3b33187720ccf4b0ce4f78a6d6edd05f4fe804772d5b6ec45bbd3","services":["streamer"],"enable_msg_events":true,"port":63451},"up":true}},{"node":{"config":{"id":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","private_key":"991b1ea8ca82edeaa0c2d410b9cc297064d8d6668b9c8fb3277a6e7a934bbdcc","name":"node_7174eca109a1f717653918224c8cfe1b7fbd666405196760913593401eb79f2c7e41003b01f5a458940695b27a4673443c7621a169db7fd968994e552995dbbb","services":["streamer"],"enable_msg_events":true,"port":63452},"up":true}},{"node":{"config":{"id":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","private_key":"0c19513041b301f0745e678aa627a44b7cc58099c6616d5fed0f4e4774c5378e","name":"node_59b53f8a562bee519276e0eeccfcf8c975d3102f5d0cccf5abcce291a8a5bb817c04604f123686177a50a03b9d7559ac469962d0159d1d93e4ce58a304d04b55","services":["streamer"],"enable_msg_events":true,"port":63453},"up":true}},{"node":{"config":{"id":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","private_key":"c4406e8f5a2cc5a62bb4c36a3c52cd7831b3a82f06cc18e2286589a6e76a68eb","name":"node_f915e2398aa5d4370de87504dd76c21a7d0be2581c2ab55b7a47743f1bbaef36384eaacec22760f1e914ceac9d96a10c3d66eb27475ef444e77fee979e6e88cb","services":["streamer"],"enable_msg_events":true,"port":63454},"up":true}},{"node":{"config":{"id":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","private_key":"770f973cf2fda14f46f1e91ae608e0b87e0f06b2f8935bba64a43c6998737b9d","name":"node_1b6cad4f9851cc584c5d1405f976bb51a52e27ef4525847df543dcca65ca5eb1ef229dcc68ccbaaf00ab1e044cb5990dd213c805bdb4adcceb6fa70b5c61fdb4","services":["streamer"],"enable_msg_events":true,"port":63455},"up":true}},{"node":{"config":{"id":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","private_key":"2e741e89b7e631818e4edeaee9d795f912805724f2eaaa83e73a3a9e660da435","name":"node_ae2a996d3b562cb47a564934037949da83b1bfe194c23754f3dbe2372ec27654f4f3b6cb7f394570f308025589c065870477667e5560dbe5a8ea1625740699cf","services":["streamer"],"enable_msg_events":true,"port":63456},"up":true}},{"node":{"config":{"id":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","private_key":"c8d2153c48467773449a0c055a3527062b7ed043e491b6a81c6285b5bea823fe","name":"node_ddaf3f8478501cda872c056c72063eb64d5b871fc5fff70704872802289dd2d348f73bc342b7f148a90cfaae2448ebf16fea196be9df891dc71a57fb410d59dd","services":["streamer"],"enable_msg_events":true,"port":63457},"up":true}},{"node":{"config":{"id":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","private_key":"784f624bd696dc1d6afb5bb977c5e6e76ab280e55c95949a68349a62fcc32c70","name":"node_5eccdbcb15ef42dc96abcbcd8b8db75d9230de10e3c650620737f6cc04ba4fdbf59ded5daa801901c191be186c329ebcd37ba83bcf794064ad4e11bf10d3f775","services":["streamer"],"enable_msg_events":true,"port":63458},"up":true}},{"node":{"config":{"id":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","private_key":"f4e049b715346f2e7ac1e31341d0df32e7ba9ae1ab6d9165b7407873add289cd","name":"node_8dd8ad560af84bec579cadb33d51711aa61b6ed22705010336df5a71a94591173b25e869457429c4a199b205fce8e73530e28203e18b971c2001715e610f152a","services":["streamer"],"enable_msg_events":true,"port":63459},"up":true}},{"node":{"config":{"id":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","private_key":"98e1264b7003ea79b1e799c87cb3c8e1aab2ea2e68531cf41f093c4b9f6a98a2","name":"node_28d3232c43de54ffdaf08f97b334c012738648b04e2876c7e751a2e352aaf4d550d6efa976c5a8edbfa8e88b9d04a0fca492b81c3756ef673ab74d34182ca711","services":["streamer"],"enable_msg_events":true,"port":63460},"up":true}},{"node":{"config":{"id":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","private_key":"357e1ab3ea555b0928cf10ec54d8842dc9c0b24a90fbe32ad1a819c018b0c26a","name":"node_be514f5f17f3177235acb24112b578edf0e373c469073226e547d18080905fd062d572be18e943f13bf9fcf5871e89ceb630a1b848a0e370ef8ef8c6d997a363","services":["streamer"],"enable_msg_events":true,"port":63461},"up":true}},{"node":{"config":{"id":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","private_key":"ad08dbea349545a36c8160aa460902c7d2744218b8ff5b8af229a17675560755","name":"node_66d0c5da973d9dd65350ae1ec63776872cdb7ded6afb6f51ae82259f6fd35e884375d15de290625f02ed2e5cdc3f591decb45e5fc64d5b0f835a216fd196f5a3","services":["streamer"],"enable_msg_events":true,"port":63462},"up":true}},{"node":{"config":{"id":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","private_key":"8e27f11572dc1832939cc80ada2ce9604fb91d0633410f87cd7bf68e4629b32d","name":"node_2f360209383d6de4ebd3b4abaf77796520b8654270b03f2151eac4a01b4417d7e0668c1f9ad30c20ff49aa8a0ab33dba5e6095619d1cf04b7af841722ab773da","services":["streamer"],"enable_msg_events":true,"port":63463},"up":true}},{"node":{"config":{"id":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","private_key":"4a7cb437d9c60831cf5e8c6d02e0f62205c1a2de83d9879d1d82ecb6e9b99031","name":"node_b35f418c7935cc54278e90978c3ef1521ab91daeaf9f1ebc1cd25211611ade091cac4e1f009d71059279d507322a4536501980ac0dd44caddc52fd4c593879f7","services":["streamer"],"enable_msg_events":true,"port":63464},"up":true}},{"node":{"config":{"id":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","private_key":"18216d0babc8a162ed03e1c866e0e90d0ea5fd5c2c2ea3f411886de38bf58640","name":"node_fe8ac5d33cd8ab6a1dad9567cdfb89b431a5c4f4a584fc608b92e7dfd06f70988e71e2f11f9fda9ee797c9ffba83bc085939fdf2522dde39f28202be92650566","services":["streamer"],"enable_msg_events":true,"port":63465},"up":true}},{"node":{"config":{"id":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","private_key":"bb317b572ed4481d33b6a67a267264366929dc0e2c12ade71a203b8b3159be03","name":"node_352407b42726dcd1aacc46a912ed8124b8b6a3da4e33dab742e40aa2452953d35dc8f42eddc76695ae2317e9f15dde2cd21be4ce826934695ad1847455661d1b","services":["streamer"],"enable_msg_events":true,"port":63466},"up":true}},{"node":{"config":{"id":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","private_key":"bd9c51ff7ece28d9a9808386358197110aa9a2a7d4715cd033a94c4d1d54ee76","name":"node_b137cf2291b530a39516d882200848e7f27a2710e0839b4d25b4f367bea6a0c3aaef8c7c7851c00a2945adcd819ea0508610afc1f453b8bc512b7b4d4faacdf3","services":["streamer"],"enable_msg_events":true,"port":63467},"up":true}},{"node":{"config":{"id":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","private_key":"6113b0494786bde04defd28e36030dad5b4368563b7b6b63c08475c18980a380","name":"node_1b063741c76fe65e62b4eae42751319d0cce66f22dde9f1cf83d6cca249a0e65bc7f6f22597697362fadd226222fb3847f8e146961969d1b4c9f7e475389cd8e","services":["streamer"],"enable_msg_events":true,"port":63468},"up":true}},{"node":{"config":{"id":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","private_key":"9875ab2bbcb806524e7fca84b6aba663cbbbec2d533a47e2df6f3fc85e1d8e55","name":"node_657d5370319128d24d925b41065eb619409d63ec6280975d78877a4028287463f6442f5206dd703569a05b2b542ad8bbb99803da265408208d6356a26d283d08","services":["streamer"],"enable_msg_events":true,"port":63469},"up":true}},{"node":{"config":{"id":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","private_key":"43de756eb52b963762bf62085de3293461cb2c53dd70baced6e3c86981545add","name":"node_a127faa19dcb7da585983d36a8e9d3e9a44a6db68507b60c70da71011f44ce377944802f39cd65f5a705cd8249ac1ef7ed8fd699349098f3f8e23b37592c80ae","services":["streamer"],"enable_msg_events":true,"port":63470},"up":true}},{"node":{"config":{"id":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","private_key":"af731618471023aff01cd45c69001d7fa95752c4d42c68df95eab820bb70bff5","name":"node_2e42f845d0393d1682add54ee30b60a953ed283e75d347bc6719ae0e91f6676282e7960f1fd52e5803d6b341fb3582c724b4f9cfd7bce9ce85f13ca480c7e72e","services":["streamer"],"enable_msg_events":true,"port":63471},"up":true}},{"node":{"config":{"id":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","private_key":"3444df2021104f7c577b25a23c3fc0231efb2cae1375cbae67db5602cbbe13d9","name":"node_6b01079463ec2f649db8634cb7a596261c79a8f714d954c772528e0547b017f8ce405e4a0ea9d32270848180e0f77b8c0b022cf95c85e777626edd4d24ea21d2","services":["streamer"],"enable_msg_events":true,"port":63472},"up":true}},{"node":{"config":{"id":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","private_key":"638383a2262ab3e1cb5a1cdf134fb5a0077f21e3bf90118cc03311db43b1cf0a","name":"node_2245f3bf1a3b4e92f912affc75f757cf648b20474c11ffe947884f216b8f24f9dcb6e6a0358a4061b8517478ec15027e185b2f05a777573b4940375bf4aaf2be","services":["streamer"],"enable_msg_events":true,"port":63473},"up":true}},{"node":{"config":{"id":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","private_key":"269f2cacd5854ad6634cd178738e910a093dbfb55bcf42ecd1f1d621f5829499","name":"node_d4b7c787981abec24353c7d496661692233797e3758189bf909a69fe87935bf6da0940daa4f12e81f20c5e88f70b472113688b71a0ae2f91a73ee0e6ff4c8591","services":["streamer"],"enable_msg_events":true,"port":63474},"up":true}},{"node":{"config":{"id":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","private_key":"1f5c7e0be8cb7bacb5c28bf9283884761fcbe8c6b353b5c821d204938da6aab3","name":"node_9c30ad8c85adc7bb52ddcfab2e661cc3a854a689eaa59128d35129d02cd5b0f8da4a44cdd33934a8e2c8fab1760c16d6f2e1c5eb227dc819e85624e63343c069","services":["streamer"],"enable_msg_events":true,"port":63475},"up":true}},{"node":{"config":{"id":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","private_key":"975ccce3cea6896e2dc7fb2fb8399b56deea3eac98f96dfe331602f06386ebe2","name":"node_c8b0dba45104fc7c7dff3ce078a0d3f5ade6198bb4656e2bee8076387929133e5ef2bd293b130a9d4f6a6974ca17e8b4a8f406d1219880f1e0f99c65c63af5a4","services":["streamer"],"enable_msg_events":true,"port":63476},"up":true}},{"node":{"config":{"id":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","private_key":"381480a705e57052adb222beb50053c41122d1c2c10b111a16abfc01e2314d28","name":"node_ff1e34fd51953ed641b431aa657da21cb4c81d23e4eaa13c9cce526f1f1b34593d41f9b87a0e10387fe400c623638677c0efab15dbd1014a0ccc11f9ec92c417","services":["streamer"],"enable_msg_events":true,"port":63477},"up":true}},{"node":{"config":{"id":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","private_key":"22c94340e76bf6f9d70e933f2b3cc96d24f64282bc3d4a61621712e78500fead","name":"node_a78f18691e0dbf3c08fe9d7dec188e6a05a93833432fb99eb2b3924ab0bde7a44db2a102a65544bbdc4fb61bc3a3d569230d9843a335bf619167fb045d78ab3c","services":["streamer"],"enable_msg_events":true,"port":63478},"up":true}},{"node":{"config":{"id":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","private_key":"9b0568309c2ef3f512d43d9016f801f55741346b5f56da355dfe5dc54d652821","name":"node_e67e495385e7cacfe659b40d1ba94d4b1ff55eada70a4d9740a9e452fbf221672bd0a897b940e2a6bed71e2a16867fe45bf0ea0015435ac6d815690e263b1899","services":["streamer"],"enable_msg_events":true,"port":63479},"up":true}},{"node":{"config":{"id":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","private_key":"8ee8a33f33bc96603d61297c73e11d545ac229d887345e12f9fe834c7532e648","name":"node_aacff366e601e072a2113add9020e19b6612f3e85b6e607fdc8cc1b6991f43be0b1f835ed3dc41d1f2b3e0caf7fac252c8eb4c150667d48207fa92ea5f0a7455","services":["streamer"],"enable_msg_events":true,"port":63480},"up":true}},{"node":{"config":{"id":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","private_key":"105fa3b2d400eefda08235ac7c0db7af48667dd5a51b8d001d39e06753e93872","name":"node_2f903b2fd4f9432b7d91b5c3e4c7ee3cb9c56fe7efc4baff0edd06fc75e4b7492f2c3c929755746df59c9f95d437a12ba40ac138d08f5bc7aa091f49f3b852c2","services":["streamer"],"enable_msg_events":true,"port":63481},"up":true}}],"conns":[{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":false},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":false},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":false},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":false},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":false},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":false},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":false},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","up":false},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":false},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":false},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":false},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":false},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":false},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":false},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":false},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":false},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":false},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":false},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":false},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":false},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":false},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":false},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":false},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":false},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":false},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":false},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":false},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":false},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":false},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":false},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":false},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":false},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":false},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":false},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":false},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":false},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":false},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":false},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":false},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":false},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":false},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":false},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":false},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":false},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":false},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":false},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":false},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":false},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":false},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":false},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":false},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":false},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":false},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":false},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":false},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":false},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":false},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":false},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":false},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":false},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":false},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":false},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":false},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":false},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":false},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":false},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":false},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":false},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":false},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":false},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":false},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":false},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":false},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":false},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":false},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":false},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":false},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":false},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":false},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":false},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":false},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":false},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":false},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":false},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","up":false},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":false},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":false},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":false},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":false},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":false},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":false},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":false},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":false},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":false},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":false},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":false},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":false},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":false},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":false},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":false},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":false},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":false},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","up":false},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":false},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":false},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":false},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":false},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":false},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":false},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":false},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":false},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":false},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":false},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":false},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":false},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":false},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":false},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":false},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":false},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":false},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":false},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":false},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":false},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":false},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":false},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":false},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":false},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":false},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":false},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":false},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":false},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":false},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":false},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":false},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":false},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":false},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":false},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":false},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":false},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":false},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":false},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":false},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":false},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":false},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":false},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":false},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":false},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":false},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":false},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":false},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":false},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":false},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":false},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":false},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":false},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":false},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":false},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":false},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":false},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":false},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":false},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":false},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":false},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":false},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":false},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":false},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":false},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":false},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":false},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":false},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":false},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":false},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":false},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":false},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":false},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":false},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":false},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":false},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":false},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":false},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":false},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":false},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":false},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":false},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":false},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":false},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":false},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":false},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":false},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":false},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":false},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":false},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":false},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":false},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":false},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":false},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":false},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":false},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":false},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":false},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":false},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":false},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":false},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":false},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":false},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":false},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":false},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":false},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":false},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":false},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":false},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":false}]} \ No newline at end of file diff --git a/swarm/network/stream/testing/snapshot_32.json b/swarm/network/stream/testing/snapshot_32.json deleted file mode 100644 index 55bd2f22d6e8..000000000000 --- a/swarm/network/stream/testing/snapshot_32.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","private_key":"b571efd8e722db149f98412648275074a828e5137b46722413039489eb617b36","name":"node_d2a392e9e7383b895587a7d6eea4a157de20caa9e2c62b4da5a8ff3186d129fee1330ddf3d180b1f59e1aa83686cd163222e38c84a84a0f60139968d6a56cbca","services":["streamer"],"enable_msg_events":true,"port":61468},"up":true}},{"node":{"config":{"id":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","private_key":"fbd2e7bb8b511ed0878fc14a5923105866ab2c3bdf5ee2c52c1a2bc7c00a185e","name":"node_6c0b3b7c1c08bb558d92f0172fb8bfabe52a4bf8348b2f82e50c6d492a595dd0677b4559d7d2cd5a6e51ecdaf9a0f898f154730b87a8d9b265c6a54f9f6802a7","services":["streamer"],"enable_msg_events":true,"port":61469},"up":true}},{"node":{"config":{"id":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","private_key":"60a362da222a74d3d81ed679549417d55a92c79b8e0aab1bf05eb2d01f82c0b2","name":"node_dc63b83b488b7b505d5b2a60680b7dc87b1c5b61509e8030ebc67512ba72c0f616c1594946878dfb29e79f351d7134306778a74d5f5b7d5e08dbdb6dd6ade359","services":["streamer"],"enable_msg_events":true,"port":61470},"up":true}},{"node":{"config":{"id":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","private_key":"00625fb0f90ed61656987faecdd0690f0a97c88e33f6e339fa3a8f4bfc1e640f","name":"node_eaa3ad48682b08d9c91907a79e82938c1b30108745b276788c830dfcb0c0e752134369d751230e95fb7ab9777c38dcd105ad123ec5cc86ef6dbdd11fe31aea93","services":["streamer"],"enable_msg_events":true,"port":61471},"up":true}},{"node":{"config":{"id":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","private_key":"fbb38d0ed3ef4726052fdec97ddd7eb3a3feb3d2fd5ea6cffe8ff97b621958ce","name":"node_331084cce2884ad912d5a20467c68fc261a02d6df0b60ff5b1427edc0885eab66a4f0f7e7fc9c676e994842f8126a3b34dbde91243f26bed6a0ba14babed56cc","services":["streamer"],"enable_msg_events":true,"port":61472},"up":true}},{"node":{"config":{"id":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","private_key":"b5c12698375aa5215df48003ed13c94e00e6bee1a0b05277237d40f0fcfc625e","name":"node_e00f9a5611008d54bbbfe6a1cf402e011c92f540b47a82b7795508d1b857eee4a522e26c8351ddf6e303d353ee35afecbf9f54d7aae36e6736174473ac4caf73","services":["streamer"],"enable_msg_events":true,"port":61473},"up":true}},{"node":{"config":{"id":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","private_key":"90e044c682c33ed90f5f5cac9b8181ee978d2cc9d3d3f545140858d324f1d7e1","name":"node_e4b7b3bbeda388842ecb3688c041fe58bbd7e4566818a58b679e96215553dbf8569032a3ae941b3f8bb3e75886852d245bda5abf0c3cf70f532c38235e1a2175","services":["streamer"],"enable_msg_events":true,"port":61474},"up":true}},{"node":{"config":{"id":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","private_key":"2371e6ff2ecc4144ee61efa958488eed6c1f739e81f27bf775db1e9b66e89054","name":"node_0679dbbb51fa0283bcba387daa2180955d402a0ed42155095fcaffb96dbfd6b4b1bb0ed2ccf11cd990dfed4a3b320ee3f64286116a7b617a35989a448c367119","services":["streamer"],"enable_msg_events":true,"port":61475},"up":true}},{"node":{"config":{"id":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","private_key":"87a3816c95159c72a7ad1b466ae9a095f12c7db210fcddd8dbaaa697220f88bb","name":"node_a197cd9e7e2d19287745f486582b7242c991f36183e8b2bf4983d7a9b9026e9884e3295183f376cd796b814fdf352b1c8c5c609a0e5f5d5155ab925d4b6fdeb9","services":["streamer"],"enable_msg_events":true,"port":61476},"up":true}},{"node":{"config":{"id":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","private_key":"6729988ebc04b9398883c068277630ff0de16f16e3f67114380acfdb0d1b530b","name":"node_eb11498b8cebc767d535481938c664359c6c84674da4d8fac729df64e288248bb020477ad4422cf1b7cea844db5ee12bb5cea82ac6e89a338d8ca1073e061f4c","services":["streamer"],"enable_msg_events":true,"port":61477},"up":true}},{"node":{"config":{"id":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","private_key":"208068d7a920e42db04340bf473f822d4d663f5139d664c4375294dd61b1dff3","name":"node_d3b5df108f35a82e569016a06fefadb52797dafb505de1981f6678e2156574893a169b0adcc595377267dec0b7d620b5b50c7e7696c39eecee2c3e5f7bf71d18","services":["streamer"],"enable_msg_events":true,"port":61478},"up":true}},{"node":{"config":{"id":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","private_key":"b3a7fa29c4cbf15e8fbbf289ab9876b438bc80092284efedde8e8d41ac76ad78","name":"node_1be1903b1104bfae07438fb888993cb3e812fc38c8f26af2e68bff9f1758e9a69b29be3636ee24060c09ce900bad2004681e1083792b2a6e532bbfc07a3a0459","services":["streamer"],"enable_msg_events":true,"port":61479},"up":true}},{"node":{"config":{"id":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","private_key":"91b7188a3178bda6cd2991a615801d744f4963a3de963adb8afb3f12d02cbc0d","name":"node_26a6b8d30e0a8954bd9a0424b817ff79fec2e0521c1313c8262be9a3b9a0d1ee7f109be78d65ca9eb811a1634a813f4ba609887fd3c0085628b2a8ebd3426031","services":["streamer"],"enable_msg_events":true,"port":61480},"up":true}},{"node":{"config":{"id":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","private_key":"235b967cd72cdb90b423f2b5604e9157f660b253cd2df62369f204f45c3c4d7e","name":"node_255c353a7585ab1bab41bcca409383dcdff5837bdcd7cebece1b6896fc06d0f65346ba618dc057c77734439612cb8cc3fd8aa068eb7569f0ad9e9e172daea678","services":["streamer"],"enable_msg_events":true,"port":61481},"up":true}},{"node":{"config":{"id":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","private_key":"f97bf73ba53833e4f4c44023e87cef8ef7aeae380553e4a5a4f3215748646a27","name":"node_c88ceea7f4d5148de8e2d71ffefc5c336cc62d322eb4371e457cbb97573b6323d200ff7678f94ef481c7b9daca3a9a7bab1e658d51fa279d433e19305df57814","services":["streamer"],"enable_msg_events":true,"port":61482},"up":true}},{"node":{"config":{"id":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","private_key":"c4c2ee3b5792dc5d86b51c4e13c813df452094ff2f6296403d801adb1f75a500","name":"node_4299205173b81c2822767a53cb4728fd5c0e1602d5976ee5db63b8118e489e4645ccdad399d9367e9b87b0a1f39e7988db86af687fe8cfff35d618b19d64b1a9","services":["streamer"],"enable_msg_events":true,"port":61483},"up":true}},{"node":{"config":{"id":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","private_key":"b39dd34865d2f02c1d4c5ef2ca635ef5be43c4b2318b133d281b02dacd8f5420","name":"node_5ed2923d11037da9799d933ea62cd23ce1aacec66a83a6d3a7e420ea0c66ec00af37977a78374df12dc0facb426d0c39cf306bea15abaf40f9072eacc4cf40fe","services":["streamer"],"enable_msg_events":true,"port":61484},"up":true}},{"node":{"config":{"id":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","private_key":"a93bc07ea3d259a03c75a6777e9401f062a8064f6837fda8a1abd518774a75ac","name":"node_66ce6e2c75f429c4bc7de6f1c785258686cfd66867336a1030830bbcc78bf642f4d1920ab5fc68953b70b7aca02ec518515d48d20397ed207ccbeb88c36e7057","services":["streamer"],"enable_msg_events":true,"port":61485},"up":true}},{"node":{"config":{"id":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","private_key":"787adc2aab8500ce6ca1768040b4c81511e7982f525c0280830f8c32486a6fa0","name":"node_cf7d1a8ec1c3e68e862ef18947098ccbf6238fa7f85ee0018b7ac63b5387d6a9dbf194e3aad7edd1fda63ea63f2f5b8692ff885084adfd1f7b6613593960afc4","services":["streamer"],"enable_msg_events":true,"port":61486},"up":true}},{"node":{"config":{"id":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","private_key":"6a830e44eac33e88e29c9119fef789abd89503a44ae8b8dd64c0a26046df4bf7","name":"node_a54b9c0cbc07e65b216f78bc0f56cd7003896641f1aa361fdc11e0bc208ee6bc876a455e89dee8abf67c259c7b6a82e7ac0d6d06cc304ee05fbc26783c09863a","services":["streamer"],"enable_msg_events":true,"port":61487},"up":true}},{"node":{"config":{"id":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","private_key":"71341041894a268f86cf62e8e80605911c19f38266bc49358c54f9955b4bd984","name":"node_82bd5207dec292f911ff7dbcd242bf8962ab256057b1173dba2d71cd8cc77d41f38bf8d9a4eed83edeeb0e6f5bfabe8c7cae9490cc17dca1f454b9ad1b76224b","services":["streamer"],"enable_msg_events":true,"port":61488},"up":true}},{"node":{"config":{"id":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","private_key":"1a7bf17688ee55a634ddbf081213180f5a6e171a4b04679f50a949e88287591f","name":"node_61cbdddf6163152f5f8bbe3c710eeb9afb22dbec78d8f7eb3fd45ba44493b9387765527f059a10e694842786959c501303b1e62d3454c84870c14e0f36a58b0a","services":["streamer"],"enable_msg_events":true,"port":61489},"up":true}},{"node":{"config":{"id":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","private_key":"87d1292398bace7bdd961dc2e1f028d405eeafebf90ef8d8f4b411fdfd74d767","name":"node_74d5d4ec7fdc749d9148b1a338b643e0a06abe03720b1d20b505da1ff1585b09d2cf7053293544fae1409cf26a27144870125787a473a73a1c4ca98509dc67ca","services":["streamer"],"enable_msg_events":true,"port":61490},"up":true}},{"node":{"config":{"id":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","private_key":"1d65bea3808741aeabc5293fcb863c594c7ec07c955b3f23e28d2ef4b0b6e578","name":"node_12934e06d8821c5e149d944ee7a831428dc6c9eee8705f3b21046fdadc2864a9ffe2bdad60a4ba5a34d7a79c22631d52b62d511e81971b6b98896acae9427e94","services":["streamer"],"enable_msg_events":true,"port":61491},"up":true}},{"node":{"config":{"id":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","private_key":"f067299a421cd124f8652427793dc41c8a5e6bf1dc2c4de59ef396ca08e80256","name":"node_e0e0e90fa669023a1a9c564727cc657ce564c23e05b1c2b61f6bfbd5eb03feb75d34b029886e3426e1bbe4a49398794dfefa0557b7db57c15700c69c0e038029","services":["streamer"],"enable_msg_events":true,"port":61492},"up":true}},{"node":{"config":{"id":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","private_key":"5f76a5630d4f1979d6d03dfb0c8836de7852e4ad14536f4b999e565b599027b8","name":"node_1149e4bcd71c75b14ba7492587fa77e4a4de14e5c580a165ad8835258d1afcb15e65d02257ad8884b0e47be061d3129d8e3af90cbe4a1a96f828a1f84e0d72c6","services":["streamer"],"enable_msg_events":true,"port":61493},"up":true}},{"node":{"config":{"id":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","private_key":"0e4febbd0bb937f5992d0e640d5b599a0dfc3b40740d7a0a5fd16423dfcc87fb","name":"node_695e5706cece9d923c19a147283b772dd1ffa79e8d08506d2ed897d89545ffbdac1a130bd7ceeb82a2a57f2b4a613aa6e7264911b909fb9bff27cd435b802687","services":["streamer"],"enable_msg_events":true,"port":61494},"up":true}},{"node":{"config":{"id":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","private_key":"54d714717b902eb733a693d473a4b4b243318a9fd68d1b8abe98eabcbaa8c015","name":"node_e28c769630f19e79966bc354bb38313522778e4f06cd0872db8bd3afd7651882eba7b0403d82701cd063cbaee4ba0ba4a97c0c488fb44e8c8b72368d6881fdcf","services":["streamer"],"enable_msg_events":true,"port":61495},"up":true}},{"node":{"config":{"id":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","private_key":"43e07e3593646f9ec6c3b630daa34ba80dc37bc0f5c57e3f3097f3503de413dc","name":"node_2b1d1ec3ee35fa63571f46a2781d5fb14379319da2d67e482c24b27bacc2b792cd61a2c1138b8ba27673b1c08588064fdf9c73c80f0278e4f0ba133d78127337","services":["streamer"],"enable_msg_events":true,"port":61496},"up":true}},{"node":{"config":{"id":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","private_key":"ef8ebfc1df0b19885db4b08df697c11a86c2442bce48d5f6f807b7e8dec70e04","name":"node_b5e3b3cc7ac15224ff10cf8974ceaf7ad2ebb18ab9505bbb342c42e6ca65fe3541c14e1ee10ac3a0e7a0d87c29e25114e0c0d957d5dbbadf6136805be3046b4c","services":["streamer"],"enable_msg_events":true,"port":61497},"up":true}},{"node":{"config":{"id":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","private_key":"1cb586254c20e9a6f4cc428f878dcfbcc8257f00c21efa88519de7a425cb5e4f","name":"node_fb6e36b9de5eef05780efcf16113fc9098a699ac525bd970dc5b6a92f596da6ffca044e434b97cd712a4035c38dd3ab08488042519f6269bc5057853b643bbcc","services":["streamer"],"enable_msg_events":true,"port":61498},"up":true}},{"node":{"config":{"id":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","private_key":"2621e61b3b896a37c2b4ee05a264bb685f4a70c3caf8a162eee28dd6e64fa2fd","name":"node_aca2af376ef1c983514f75cd717c0852e9d4321e705517196fab4fafe109c1f3581866e1865d41977f8c23a31ec7fa218c11db0c87eb4bb96390025a96386f9a","services":["streamer"],"enable_msg_events":true,"port":61499},"up":true}}],"conns":[{"one":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","other":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","up":true},{"one":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","other":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","up":true},{"one":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","other":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","up":true},{"one":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","other":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","up":true},{"one":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","other":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","up":true},{"one":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","other":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","up":true},{"one":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","other":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","other":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","up":true},{"one":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","other":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","up":true},{"one":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","other":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","up":true},{"one":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","other":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","up":true},{"one":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","other":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","up":true},{"one":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","up":true},{"one":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","other":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","up":true},{"one":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","other":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","up":true},{"one":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","other":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","up":true},{"one":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","other":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","up":true},{"one":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","other":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","other":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","up":true},{"one":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","up":true},{"one":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","other":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","other":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","other":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","up":true},{"one":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","other":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","up":true},{"one":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","other":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","up":true},{"one":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","up":true},{"one":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","up":true},{"one":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","other":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","other":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","up":true},{"one":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","other":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","other":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","up":true},{"one":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","up":true}]} \ No newline at end of file diff --git a/swarm/network/stream/testing/snapshot_64.json b/swarm/network/stream/testing/snapshot_64.json deleted file mode 100644 index 8785c9e087db..000000000000 --- a/swarm/network/stream/testing/snapshot_64.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","private_key":"0736b1ccd6a1d7c513e312d29a8afa6e1231954e17a66886d0bbcf0dc191b170","name":"node_a48a667469a1344cb70f269b21fb3ca9e83823226749fd9c232be1b86ab9427888f2ecb20ddfa56da361463a061e192570f2f8da3fa967c473320ca85e382c53","services":["streamer"],"enable_msg_events":true,"port":62976},"up":true}},{"node":{"config":{"id":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","private_key":"edcc0061564101058d0caf2a7dd7cd178a2fd7f5de93263f1b2abac25ce28360","name":"node_8f6fb4a5baf715e001b060ce72378829279ce06a3247bd4a6faa3c725ee1b949570373e4231de82981020563e704297e77172506101b1444fcacfcc5f211827e","services":["streamer"],"enable_msg_events":true,"port":62977},"up":true}},{"node":{"config":{"id":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","private_key":"911635b150029a2a56d4a5b647162774df1ff5e6946c727ba21e3e8cad2c41ce","name":"node_e7b1563d6e089e030983b075b590abb8a3205e9bce953f562b755ba150a3edc2dc3377259d96c05cc7363a23aed613711ca049e26253fd9273ac4c0483087015","services":["streamer"],"enable_msg_events":true,"port":62978},"up":true}},{"node":{"config":{"id":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","private_key":"4bd5083735663222c8e8948125c8f606952ef887a4a07888d39d8aa6af0568e8","name":"node_d0718ce0dafea66ee16c79626e020355273cdd062c0fceb122e391c4ca6e4e408a1b0e8230c4ade5bc95803916bdd6d98c99d2b6ea70c32e17fa1f2c98741a90","services":["streamer"],"enable_msg_events":true,"port":62979},"up":true}},{"node":{"config":{"id":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","private_key":"8cb2a950934e687c8aea0a72114b26989bccfcdf508f584a549d05091aef2c3f","name":"node_af3f9dc00ce3cc156000f16a06c55c123ccdfabed89c9aee4478ff439b6f52a89d0501cff626d36b7f1852737955f7a036b25cf259580e8f46a3e0e44340b539","services":["streamer"],"enable_msg_events":true,"port":62980},"up":true}},{"node":{"config":{"id":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","private_key":"3c147cdf4e85087a9c0e37ff5d96de7d977ce3d3711090f64d2c3bea39790167","name":"node_95c3ca2362de2eb0ac8efdd243918ed216f5d124bc6f5b9d83a6ee1aaf8a0fbdbd70ca1710d1ed825d6871f13a15954725f1aa1b27b48307844c0bc27baec0db","services":["streamer"],"enable_msg_events":true,"port":62981},"up":true}},{"node":{"config":{"id":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","private_key":"fb505af88aa3fc8134b3ad647d78f182e0aee007261c066024d9fdda0bd9d297","name":"node_c73f8fe9f54b89634cb0e8e332407a3a90cbbd347c0abc93823db13a7a39c46e7bd30d3f557316d92dd731cfc686afc308448682ff06c77246e3fb02b9a025ba","services":["streamer"],"enable_msg_events":true,"port":62982},"up":true}},{"node":{"config":{"id":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","private_key":"833d044f5a00d0018f8b2a7d4d825831f351dbe3f3e7074d96103c3597bb0a37","name":"node_9529ff2b0692ad2608b55ec8ec0d1c9ccb8ee300412d99d389009162a76f7eec28d1090cbfb571aa8396b365074770b17106bfa3354857878dff164f42686142","services":["streamer"],"enable_msg_events":true,"port":62983},"up":true}},{"node":{"config":{"id":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","private_key":"f08b159c68739d221adc0060225f8feb89dc3aa1f016cef59508d2787a4232a9","name":"node_5b456e429f7adae30366206e681ba46439a3372fec3806f666425cb3f12983c0b427e089fb163b70e6a56220b1529ee392ff701bc2f4621d51e23aa6305150e8","services":["streamer"],"enable_msg_events":true,"port":62984},"up":true}},{"node":{"config":{"id":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","private_key":"bbadcfc9e554aabf08f9cdea8f1174f4f47b85c5a615efa6f0d5a4db7e6e9f67","name":"node_5e92b025cc087c8823423c287f274a32a3dc0065afdf189475ba96b0da7b785cd493b7f2a7f3bb8195c73025bfbb402cbb4e0f6ae0d5e0caab223193cf6f2e5c","services":["streamer"],"enable_msg_events":true,"port":62985},"up":true}},{"node":{"config":{"id":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","private_key":"91980cc1a6aa75dabe27a4bed1a4a2299ed286387f066d12c1a05ab514245966","name":"node_f6e4b1dc1fa95ceae2b932b178afdc2dd515832a191e0f49c916d5a04548d58ef9f8c1dda3fbc93a45e6d82517e6a573310b7bfb14bc38c57000aec9ff010391","services":["streamer"],"enable_msg_events":true,"port":62986},"up":true}},{"node":{"config":{"id":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","private_key":"9f2513f57cafcbb35e549fae622387037b8da11772eef7bbb45d44f81712155b","name":"node_707a9ae4bc8b37fff43dc3ba83ecb735bd428b720a751a11112452eec1ca49c09139bc437666add2823dd205e45cc793f8657c66ccbc6911cc60771d4512e038","services":["streamer"],"enable_msg_events":true,"port":62987},"up":true}},{"node":{"config":{"id":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","private_key":"a198f5ac31e6bef23d8f266075f8363ce66698d0f8b1193072f813b2a1717236","name":"node_78216c6660fff0b96e38084941a2f237996732118033bf842e5f9e533b22b36c2da996df28e866424311b7b6414d4627db1f22a235ae777f7de34d9696043ecb","services":["streamer"],"enable_msg_events":true,"port":62988},"up":true}},{"node":{"config":{"id":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","private_key":"9f8eddf3160bc4b13285e9587f6736c82305632b55fe833a12f1f821c0f311e4","name":"node_d472383c453e6b0f1a632010bdd6c42a9668d328a8f8071e0407069f6fe413e2a0fd0551a09cc56ee5245d472e39a7b6295491dd256ae42e200a257f297743e3","services":["streamer"],"enable_msg_events":true,"port":62989},"up":true}},{"node":{"config":{"id":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","private_key":"601ed94a775c7129de2ddd82e23249e13176478817e5376a1c18389de0016283","name":"node_351ceaf2e95e098a8e15e81c82073b523f641848326d1bbd379f40f886b50ce2c377c4e3a2dfc2662d6f25ac04dede41063a075cf00be1cf36f95b0267717ab8","services":["streamer"],"enable_msg_events":true,"port":62990},"up":true}},{"node":{"config":{"id":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","private_key":"dd64b8659254425a4553501bcc275b1dc0a6c7bc79a538f780716cd64d46a8c2","name":"node_8da9cdb3c78776ed230497b21d4ac172f0ce73e921dfddd483da7bc6bbcd1951dd78fd5f70a0acbad855b2984e4c4bdb408c4bc25cab40684fe5a4408ec7ab9c","services":["streamer"],"enable_msg_events":true,"port":62991},"up":true}},{"node":{"config":{"id":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","private_key":"7216dc13943bfd0a8c2e93d621a44a2dd4baab7b68fa87be06f2e649f533f72c","name":"node_0a45a0aa4b4eee71b2828c794281d698019667288cf51311ffae7d8ea895f8ae29f7958dbfcda8763d9d8e9c097dccc5f92ac9d09fb4ccbde178d7f5ebda4d35","services":["streamer"],"enable_msg_events":true,"port":62992},"up":true}},{"node":{"config":{"id":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","private_key":"01a2779483d6e089da8b3943f81cff48c8bfd1bd7d0281bceb152e41a7f5acb7","name":"node_f70c92be150cb3f65f6bd904c8c161bfb0cea717bab0b24da63714de83e0872c8c369960ada1629607a1e166a19b6cfa887603e4868e7912ae5512744e8cc1c0","services":["streamer"],"enable_msg_events":true,"port":62993},"up":true}},{"node":{"config":{"id":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","private_key":"2954d35fce94938f074043b9f9dd87157a6730bdd8e3a1b6f19b8a55ad1505df","name":"node_d563716fbe2068cc940f7b12dc2bacb345c95f01e78e3b1f0105a441f300fdb00cc72e677aec102360fb904b63055d8581555f5b74b8f2392706569d8357c53f","services":["streamer"],"enable_msg_events":true,"port":62994},"up":true}},{"node":{"config":{"id":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","private_key":"6f87c529d5b17354bd3ba6b59d6ff3a0f71550a41d949d702e27f50957cfc3ba","name":"node_46bb2acc087482d40ab2ccbb387723158411ff4931423414e4d09891be8a31d11929e939e4be94b0cc355c49883e1835785ba1955d865f78748c2a0a2f6eee0a","services":["streamer"],"enable_msg_events":true,"port":62995},"up":true}},{"node":{"config":{"id":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","private_key":"ea386dc625e681a5d5d7c4e8ede4b3ffb8f2f13061c65acdde2750e2a19ef417","name":"node_8da75cb4e63d968a7999ca4b49572b5ae592a91fa442d44bb7c42fb4b174a365e1affa1dbc45b2a0406444505f178100768e7783831f2886d53e7d1b8a3a7291","services":["streamer"],"enable_msg_events":true,"port":62996},"up":true}},{"node":{"config":{"id":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","private_key":"e9b9261c569da5418d3aeabf28dff1faada23ae1a3a1552035aefe56bdf3136d","name":"node_6d1af44ab259cc080a14c07bf5efabfd70cb847fe338f016c00138c84bddf6a6ce94047d1bffcfc7e9bc772dd7a080468a84655d5351d0056f97f13358b91547","services":["streamer"],"enable_msg_events":true,"port":62997},"up":true}},{"node":{"config":{"id":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","private_key":"19334395c71250dd3eeeef4eb4032e2769839d57cd6080f2f51e1de3630789fe","name":"node_0dcef49b94fdcff024d706030fd4f513d0c6ad5f00b06a8b67abc454bbe5c2c74e939d491c0700e47ecee5cd7c7084603f62e626c34b454868b8f22d8c2dfb10","services":["streamer"],"enable_msg_events":true,"port":62998},"up":true}},{"node":{"config":{"id":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","private_key":"d587a8503da404e7a74e24d731daf63b9585ae41b555035979da013ab723b4b8","name":"node_e7d4478b412ef497741943736946a3b0679d21ae0c4cbdde6809c7236dcf1a40291088d872e469f06da19ed4ef77b9844aee7066c40fcd45b0931aff847de1d7","services":["streamer"],"enable_msg_events":true,"port":62999},"up":true}},{"node":{"config":{"id":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","private_key":"724511e7e57416a6b4627079b0b9079fb4fd5649dd018d7f3a64dbf6a1dd9adc","name":"node_7722d7d06c66afb0642d5f9ae0b22ed812c632f2d62ce64315da40eb003feb3fae1b337c10df21d297beabe51b3879f2c0a725f08ee78a8e09c75f86bd0e2092","services":["streamer"],"enable_msg_events":true,"port":63000},"up":true}},{"node":{"config":{"id":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","private_key":"922f3ca85ccc577429654b566f1561a301bbad054e4f3a8f312db841329899c9","name":"node_e479930845e1dac2d5908894548cc06c132fc5820810c6f46d9adc2bc252dd40b64642a3b2005ad3688d2637c43967f570bd153db9ee6742e1b23dbfb72537fa","services":["streamer"],"enable_msg_events":true,"port":63001},"up":true}},{"node":{"config":{"id":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","private_key":"c94a8e8e535d7431b0610ebfaa70d76c37bf6fbcaaa83ec4be0bed5527780670","name":"node_61b32cded1b5ea3e2ca545a55c84251daaaacf51e6fed98fbdf4c5b6b91a554081e1e577aaaaaa4f911780f92703c1d715695d86c1be641b0bd1794f4107c2be","services":["streamer"],"enable_msg_events":true,"port":63002},"up":true}},{"node":{"config":{"id":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","private_key":"7a1378d2cad0ac18e37694b3ec5c08580aa1887916e98030c66accf6197f615b","name":"node_9e51eb48f59886e70eb8d02e1c0c4423de3f0ce79c7a62bfd91bc2048cf643f40a91e2d2a1a8a19a9e4ba4a96aed0965aefcd941c068208abe8bf5029eb27d55","services":["streamer"],"enable_msg_events":true,"port":63003},"up":true}},{"node":{"config":{"id":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","private_key":"6e834fb9046bc38179a4c8be1cd4c2c540df1f73aa208e9794701234202211ca","name":"node_7a1f97c41c9efd7a2903af78f72d02cfff3631dc6260d3ceb2364c2a8e06965710e8feae6aa9f99b48b2475da10b2f9581c76d47b4cd2bfee09c43dcb5e3e5d9","services":["streamer"],"enable_msg_events":true,"port":63004},"up":true}},{"node":{"config":{"id":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","private_key":"819e80fcd487bf15502fff3d31651efcd9b5e7d5e18ca4d836ce53736bf23d11","name":"node_7a45fa46f161fae3ef9013e9ab81145f4a76fa6ae22160424d6dc111acbd477ce43d4c10db89cb7451c97ea1fbd78428997d01fd17e1851f8b559b404ede6da7","services":["streamer"],"enable_msg_events":true,"port":63005},"up":true}},{"node":{"config":{"id":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","private_key":"c2fff99bd9d70ab2149a1ace8ad0dc26b4b78cbfd60fe9215e0f69885e0cede6","name":"node_07138ce506125910af81bd1bae11c22bfab9a81e1e057cc3d84769475c5da9873eb3f11edc6aca83ef486bfb63eba15a6233676d29d93ac9e774f10cd42c8cbd","services":["streamer"],"enable_msg_events":true,"port":63006},"up":true}},{"node":{"config":{"id":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","private_key":"5d8862df181e186646d6fa8accaceed89b18a384ce5e63de34ecd1bd80d7f0c9","name":"node_f360c6599a0911337c7b96365fda1b2f64890bdb4483bb7e86bca15484f24c4efc0d1f6f56aa0c4fa5c205e6c1dbbf20d2ca3c2f8734f703fe6d672fa76a0d45","services":["streamer"],"enable_msg_events":true,"port":63007},"up":true}},{"node":{"config":{"id":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","private_key":"411b4485e7f793c1db7387d9e8f179d02d939de2702166248953f8f0813cb5f0","name":"node_f5272b71c228eb14b9e0e221deefc0a91353a5f17d01475f57fad54bb8e50e375f58019c7200a9ca45b0f1da6538708c61242e478d917499871df7a9d5857f1a","services":["streamer"],"enable_msg_events":true,"port":63008},"up":true}},{"node":{"config":{"id":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","private_key":"9b1297e565c13eeb81e2b19c31f635253081d34a65eb1ebf889f30635e4eccea","name":"node_e53cfad611bc38a1090d28e4cc58e4738ccaa83a00bf5447cd30ec70e492dea5811b67e79b9ca8856e79801741a675c6f54eb7a1c39e95ab735164855eae0fb7","services":["streamer"],"enable_msg_events":true,"port":63009},"up":true}},{"node":{"config":{"id":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","private_key":"eb698ae5696bf1cef4f4e6cb8ef2eb5e79cd298fcb55e0449bbaab6d048e09b6","name":"node_4f1a219f31e135208bf4caa314a14d8d48a5682941793431539efb5666b06bb5e3e9cb29b019ca414fb32961460556f2d99a04b12dc8ecbf05f43efe108803f5","services":["streamer"],"enable_msg_events":true,"port":63010},"up":true}},{"node":{"config":{"id":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","private_key":"cc474d341e32e674a1c1d607789df8bb6097ab392eace2d366da2496c5413cef","name":"node_25c64a52c298035be2184243082b5eba8a3a5d55c5334cea76e177d722945c8bf014a4ce9ef2ed76dc17a44234c97697337c6e001261533e72cc8266ee0e2fe4","services":["streamer"],"enable_msg_events":true,"port":63011},"up":true}},{"node":{"config":{"id":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","private_key":"4ec4a7d75323558dd822f09ab9f992afd016604bc77aec05f89cfdae6f50611b","name":"node_1691538e4cc41441c18fc92969c0c59f51da063814e8c45311605405284293503ee1570722cc7ae12f9cd63b899afaf5b3e66ca012115996074e8aaa71fda48c","services":["streamer"],"enable_msg_events":true,"port":63012},"up":true}},{"node":{"config":{"id":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","private_key":"b049d01349524a669db50fd817ef70811ea5cb5517adaa016f4ae426184188e8","name":"node_8e1a66c9029330c25b9abe95a11878f41cef1a32b567a931ffa781c2f70a1336efa03ba1a66dac0080304803c1239be443991a251f24d0e9c2e26aebeb5437f8","services":["streamer"],"enable_msg_events":true,"port":63013},"up":true}},{"node":{"config":{"id":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","private_key":"9eb7b1e41bd77e46a9746723ab4367fcdb9950d5f99c32bb1efddc9b5c60daf7","name":"node_c8e9cc707ce2a278371d1b4f64714cdae425b7c3606d18af6588dacaca35c7a171a07629247af351e667d2ddd9e71598f862125c827cc869c463cf87e4daeed0","services":["streamer"],"enable_msg_events":true,"port":63014},"up":true}},{"node":{"config":{"id":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","private_key":"229b6c150e858a0e81d1c720a9697bda4c9f26e531d85db8837ca5d1a24ff8dd","name":"node_43b91c24dd7fd217a76f00ab97920e4223bd2ee085abe7ac34e915e8676400e1643d3bbb4a864c8a6df1298bf229cabd1bdc9879eafdcbcab064708e8266e88d","services":["streamer"],"enable_msg_events":true,"port":63015},"up":true}},{"node":{"config":{"id":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","private_key":"ab42d800bd5b0bcaedd3009d4805e827ca6c41f54fb7fd38cc021f9c72bf3aed","name":"node_14136fa967f2d4825845ba4a43a5921d8fcf03f9c71c5595037e000b2ef6ff0a5eaad0980aea0a170cafda3529f982aea1107f58aa42485550c9480e86f5e9f3","services":["streamer"],"enable_msg_events":true,"port":63016},"up":true}},{"node":{"config":{"id":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","private_key":"15e0330ce9f82833faa08bbacae92d3eff516eeb4bfd1be0b7d8ecc8a311d8a8","name":"node_39d0aa13a6d7e709c9b914cb16f007c3f16af40532afa47c8cf9abf6d604d4380883103c995ec696ca593c4dc9bf0290979b965c9c6ade7c616d3973c5f0b1f0","services":["streamer"],"enable_msg_events":true,"port":63017},"up":true}},{"node":{"config":{"id":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","private_key":"a2ffbdb8b486d91c6d2b579b5ae3f1a8f09feaf0451b375d8985f0ddea952926","name":"node_e73af1e2a834ee132564dd2e983c877b3ae230808d2b42da2ec91472eee6ee6595c439800ce980186b4b0d9a56b96babf747006c07b07513543eead8e102fff7","services":["streamer"],"enable_msg_events":true,"port":63018},"up":true}},{"node":{"config":{"id":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","private_key":"48bdb744f1c9b25e7b2170b88fb956619976670186b82382029c84f3ef780930","name":"node_c0f2f1409cf83d7a777f6af95931181eb5a36b14a156f444075071c896fc5b435638ead23c65a242105db527c809e2c46f7805c862c0eb5d444749ddf22a5060","services":["streamer"],"enable_msg_events":true,"port":63019},"up":true}},{"node":{"config":{"id":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","private_key":"49376794edff5cc56583fc3ce9e6987e0210c537f798bfc00cd523927052bbf2","name":"node_e021950ce89ce2bd79649aad2ed504789636b09870d0652fefa5e16631cb32a5d41c6cc4a540b7a0fca6bc3d5adf9b372a22cf714adc7b3e9b968d4c840017d4","services":["streamer"],"enable_msg_events":true,"port":63020},"up":true}},{"node":{"config":{"id":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","private_key":"b59aef84a0b7166aab7dc4edd8bfc66f56b77097cbbb4e937277ecd23c051473","name":"node_16bd57b6590df0c69c440d178da8359b0a3e00b9c5362155eae42709bdc4d0488e437fa7e8396d5b429cebe356ebd1407039b21eefa8d9164b357845132edb28","services":["streamer"],"enable_msg_events":true,"port":63021},"up":true}},{"node":{"config":{"id":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","private_key":"961cb451a05a1f043539e0417e0c612286d8a86116a4bd3ac4f301444bc0abc7","name":"node_393eb8d2acf9244f1cdc220711c00d8fa7619394893643bc32e1ee0f821e5a2afed07badbdf97d710843c4ea6de3f74c113ad4c548afd23534d6dea5c37c6d9d","services":["streamer"],"enable_msg_events":true,"port":63022},"up":true}},{"node":{"config":{"id":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","private_key":"a56a9d4ff921fba9e03ecffbd71d75f97cc9b7c5f389cf54b9bf66e689bb60b5","name":"node_62b8e67a4ca956c1cf2ba7a538d39bfe8bccf747fe65be48c88270ad44ee7711c0e9a43bb3821feffc492dba9b58397768c755810121add9c980c9a2c696feb0","services":["streamer"],"enable_msg_events":true,"port":63023},"up":true}},{"node":{"config":{"id":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","private_key":"f80db180b4c58031447688bd4b5f9d32cfee3dc85506153782a0368873110317","name":"node_17c7eb5833687a98087daadda564e54b1c770f946efb7efd69370a9caf6e6939e408f04a3fa1aa042d9463992a711786e504072fae56d007d696851696fc5643","services":["streamer"],"enable_msg_events":true,"port":63024},"up":true}},{"node":{"config":{"id":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","private_key":"5750e8b20da0147e055f965d6ba4ee434812f658663383ebfe7e88f13fdf59ab","name":"node_f5efffc8e894cecc065f6892ad2a846c8fc4982d1c8c7fc729421d5108d519c501cc9f2f7a0046ec08d47cf2369753aaf287dfc3ef7ecd34d24d294efb933658","services":["streamer"],"enable_msg_events":true,"port":63025},"up":true}},{"node":{"config":{"id":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","private_key":"f841751579683b856a59eb75f3493a4b3e39183d8818a2638559100bb6f5e66a","name":"node_7c273dd4218e9e5b92e19d250832a424ff2ac5482ad70953746de780100669eb143247e15ccfca14cce9a49a003c82be71ca034a2900bed4c89fb10bdbfcc7c3","services":["streamer"],"enable_msg_events":true,"port":63026},"up":true}},{"node":{"config":{"id":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","private_key":"be9f2207e4e7a93758129c0d6fa34877b685210cf0e8f8d233e5425d8fa461f9","name":"node_8959c5cf825ebab14efeacf2807ad9498256a9e89a2ef00690c9ee23a3e934e111c52a5ddcc791b93f49424ac008095d8cb0da6905dfdeb62309fc4f6672e59e","services":["streamer"],"enable_msg_events":true,"port":63027},"up":true}},{"node":{"config":{"id":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","private_key":"4a245ec64e442d4cad2468d96914df5728633c568ed3d063990ac8932be63222","name":"node_dcf2401cbc26f3db27bb85c24984b1d755b3503fe400c139a0bedbe5de24db3f27c8f4f40adc1880b6142d20e67a40f3d45d36ba7fce122ffa44703e65622198","services":["streamer"],"enable_msg_events":true,"port":63028},"up":true}},{"node":{"config":{"id":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","private_key":"1771927f1f06912915f5498e857816fd8f73b2bde10f88ba4a856684bcc2a6fa","name":"node_38b3adde25c6407f29c2a721f1f5c082cc94ddad09fc5afda2bbb2309212a9b54b1553731a65ec8b58769fc11d488169c8000ee15fe8966bd44a3879e0c9e534","services":["streamer"],"enable_msg_events":true,"port":63029},"up":true}},{"node":{"config":{"id":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","private_key":"986bc0252067c4c3ace80099cbc843d6f16f7483719e9ecf7a3a0f876a461ee8","name":"node_6593097e880701f3d0573df7bff9ba7af40f4f83b828bfc11bdabea62fb94ed39c8233d8d40275c2af9ceddae44514e029a546fe9df73abbd3821d37933aba49","services":["streamer"],"enable_msg_events":true,"port":63030},"up":true}},{"node":{"config":{"id":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","private_key":"39848c3aa21a67751f95ffc8938b36264eeee342816d41b37816f2164e59858e","name":"node_578666c4113e196a7c738fdbae0bd68ade450283eb835efd06591798f1893f7f7d9cde0691faff670b5ae24e58cbc2f549d2196f244dddc00e82852c38e8539e","services":["streamer"],"enable_msg_events":true,"port":63031},"up":true}},{"node":{"config":{"id":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","private_key":"d5dee04f1435fa7ab6d65e89de8c4c6bf156111bfb9ee5de0ab617cc3be19681","name":"node_e1082b4577aa370a5171b7602282208697dcead854f0c82acb5628d179fa5990a0fc85c5343a47177aab81c7fa6c1be8a27a3484acddc353582ddeb61892ef94","services":["streamer"],"enable_msg_events":true,"port":63032},"up":true}},{"node":{"config":{"id":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","private_key":"044a1acc0d565f7080db7b625baefe8a5f7aef9009a7bcd338fc31a02d704d8c","name":"node_a4fbd2ffc25d2c3bd37beecd637dda5983cb5817ecb6da62aec16ea59aaf7e71966649211461564ba808174361898a1d2265f1a42e94434bc00d5d3e04b67a8a","services":["streamer"],"enable_msg_events":true,"port":63033},"up":true}},{"node":{"config":{"id":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","private_key":"8be74288552caed392476d39780f806f2c21b50a9990c5a3a5ed37397b218a6d","name":"node_eb08a7774ca5252237d059a8bbad68044c83b2c332024be98bdc0c58508867a80cd34cb4162bd55a47fecc93301c8b2a7a1edbfd807ebb5623499cac80ea42de","services":["streamer"],"enable_msg_events":true,"port":63034},"up":true}},{"node":{"config":{"id":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","private_key":"e644c54ce52ddb2788fc683264f175a24485082eb88ebe0a83c94ecce77d7175","name":"node_6eeb951b8f6d5ac519132910222777d5a409325e6c64d89708a00e55cb0fe85889aac1baa724e29fa7f064323b164a9c40c5114a65736e3dd16f0336283d9c7b","services":["streamer"],"enable_msg_events":true,"port":63035},"up":true}},{"node":{"config":{"id":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","private_key":"77445377572b915c2e3802f70fc9eae8d29e767f54f80a29701ae5d1fe0c8677","name":"node_6419279b600da3e2ee8d0b2a5b0319bc6cd496086955b49a8d2168fd4c35d5688291bc9313076b1b8e070f25dc593788d72b8f8c1d2ad828741a45deea35e58d","services":["streamer"],"enable_msg_events":true,"port":63036},"up":true}},{"node":{"config":{"id":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","private_key":"f6b20f29a1cdcad8f8bd88acc4f6ffba7b3027e46ab60784e2c2b77edb3d3630","name":"node_032b1ce6881413b7ade1918e56691c7acd9f24111f47792ca50c33e570afba433caa132ad2326d03f9c0544fdc09fa0ca65f61de9fe61d6dd92c5d25a8df69af","services":["streamer"],"enable_msg_events":true,"port":63037},"up":true}},{"node":{"config":{"id":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","private_key":"25bb03224302b9c89585681c4bb30dc9d95fe417e5c0f13627154083cda7492b","name":"node_86d55ece15e6bb4da7601f6587654505f760ee2b87abdb115091eefa93f61cf29fd695601bb8c6ae2c76400de24b8bca9ca32b50e4b849ae76f5320b03276bfc","services":["streamer"],"enable_msg_events":true,"port":63038},"up":true}},{"node":{"config":{"id":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","private_key":"a4eb160b838f392946a844b9fbc36006c459ff6f9ef46a832d000f17f2aa834c","name":"node_31cbd7c029d69715e59f31bccf362cd76e0a87839f1f63c6623be437d2af227a38f12c5fb9c659cc543976833caf22a52f5191c7c465a9ba36ac4235c12add72","services":["streamer"],"enable_msg_events":true,"port":63039},"up":true}}],"conns":[{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","other":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","up":true},{"one":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","up":true},{"one":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","other":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","other":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","up":true},{"one":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","up":true},{"one":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","up":true},{"one":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","other":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","up":true},{"one":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","up":true},{"one":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","other":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","up":true},{"one":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","other":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","other":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","other":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","up":true},{"one":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","up":true},{"one":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","up":true},{"one":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","other":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":false},{"one":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","other":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","up":true}]} \ No newline at end of file diff --git a/swarm/network_test.go b/swarm/network_test.go deleted file mode 100644 index 0b57fab333e8..000000000000 --- a/swarm/network_test.go +++ /dev/null @@ -1,530 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swarm - -import ( - "context" - "flag" - "fmt" - "io/ioutil" - "math/rand" - "os" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/network/simulation" - "github.com/ethereum/go-ethereum/swarm/storage" - colorable "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") - longrunning = flag.Bool("longrunning", false, "do run long-running tests") - waitKademlia = flag.Bool("waitkademlia", false, "wait for healthy kademlia before checking files availability") -) - -func init() { - rand.Seed(time.Now().UnixNano()) - - flag.Parse() - - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -// TestSwarmNetwork runs a series of test simulations with -// static and dynamic Swarm nodes in network simulation, by -// uploading files to every node and retrieving them. -func TestSwarmNetwork(t *testing.T) { - for _, tc := range []struct { - name string - steps []testSwarmNetworkStep - options *testSwarmNetworkOptions - disabled bool - }{ - { - name: "10_nodes", - steps: []testSwarmNetworkStep{ - { - nodeCount: 10, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 45 * time.Second, - }, - }, - { - name: "10_nodes_skip_check", - steps: []testSwarmNetworkStep{ - { - nodeCount: 10, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 45 * time.Second, - SkipCheck: true, - }, - }, - { - name: "50_nodes", - steps: []testSwarmNetworkStep{ - { - nodeCount: 50, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 3 * time.Minute, - }, - disabled: !*longrunning, - }, - { - name: "50_nodes_skip_check", - steps: []testSwarmNetworkStep{ - { - nodeCount: 50, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 3 * time.Minute, - SkipCheck: true, - }, - disabled: !*longrunning, - }, - { - name: "inc_node_count", - steps: []testSwarmNetworkStep{ - { - nodeCount: 2, - }, - { - nodeCount: 5, - }, - { - nodeCount: 10, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 90 * time.Second, - }, - disabled: !*longrunning, - }, - { - name: "dec_node_count", - steps: []testSwarmNetworkStep{ - { - nodeCount: 10, - }, - { - nodeCount: 6, - }, - { - nodeCount: 3, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 90 * time.Second, - }, - disabled: !*longrunning, - }, - { - name: "dec_inc_node_count", - steps: []testSwarmNetworkStep{ - { - nodeCount: 5, - }, - { - nodeCount: 3, - }, - { - nodeCount: 10, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 90 * time.Second, - }, - }, - { - name: "inc_dec_node_count", - steps: []testSwarmNetworkStep{ - { - nodeCount: 3, - }, - { - nodeCount: 5, - }, - { - nodeCount: 25, - }, - { - nodeCount: 10, - }, - { - nodeCount: 4, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 5 * time.Minute, - }, - disabled: !*longrunning, - }, - { - name: "inc_dec_node_count_skip_check", - steps: []testSwarmNetworkStep{ - { - nodeCount: 3, - }, - { - nodeCount: 5, - }, - { - nodeCount: 25, - }, - { - nodeCount: 10, - }, - { - nodeCount: 4, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 5 * time.Minute, - SkipCheck: true, - }, - disabled: !*longrunning, - }, - } { - if tc.disabled { - continue - } - t.Run(tc.name, func(t *testing.T) { - testSwarmNetwork(t, tc.options, tc.steps...) - }) - } -} - -// testSwarmNetworkStep is the configuration -// for the state of the simulation network. -type testSwarmNetworkStep struct { - // number of swarm nodes that must be in the Up state - nodeCount int -} - -// file represents the file uploaded on a particular node. -type file struct { - addr storage.Address - data string - nodeID enode.ID -} - -// check represents a reference to a file that is retrieved -// from a particular node. -type check struct { - key string - nodeID enode.ID -} - -// testSwarmNetworkOptions contains optional parameters for running -// testSwarmNetwork. -type testSwarmNetworkOptions struct { - Timeout time.Duration - SkipCheck bool -} - -// testSwarmNetwork is a helper function used for testing different -// static and dynamic Swarm network simulations. -// It is responsible for: -// - Setting up a Swarm network simulation, and updates the number of nodes within the network on every step according to steps. -// - Uploading a unique file to every node on every step. -// - May wait for Kademlia on every node to be healthy. -// - Checking if a file is retrievable from all nodes. -func testSwarmNetwork(t *testing.T, o *testSwarmNetworkOptions, steps ...testSwarmNetworkStep) { - if o == nil { - o = new(testSwarmNetworkOptions) - } - - sim := simulation.New(map[string]simulation.ServiceFunc{ - "swarm": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - config := api.NewConfig() - - dir, err := ioutil.TempDir("", "swarm-network-test-node") - if err != nil { - return nil, nil, err - } - cleanup = func() { - err := os.RemoveAll(dir) - if err != nil { - log.Error("cleaning up swarm temp dir", "err", err) - } - } - - config.Path = dir - - privkey, err := crypto.GenerateKey() - if err != nil { - return nil, cleanup, err - } - - config.Init(privkey) - config.DeliverySkipCheck = o.SkipCheck - config.Port = "" - - swarm, err := NewSwarm(config, nil) - if err != nil { - return nil, cleanup, err - } - bucket.Store(simulation.BucketKeyKademlia, swarm.bzz.Hive.Kademlia) - log.Info("new swarm", "bzzKey", config.BzzKey, "baseAddr", fmt.Sprintf("%x", swarm.bzz.BaseAddr())) - return swarm, cleanup, nil - }, - }) - defer sim.Close() - - ctx := context.Background() - if o.Timeout > 0 { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, o.Timeout) - defer cancel() - } - - files := make([]file, 0) - - for i, step := range steps { - log.Debug("test sync step", "n", i+1, "nodes", step.nodeCount) - - change := step.nodeCount - len(sim.UpNodeIDs()) - - if change > 0 { - _, err := sim.AddNodesAndConnectChain(change) - if err != nil { - t.Fatal(err) - } - } else if change < 0 { - _, err := sim.StopRandomNodes(-change) - if err != nil { - t.Fatal(err) - } - } else { - t.Logf("step %v: no change in nodes", i) - continue - } - - var checkStatusM sync.Map - var nodeStatusM sync.Map - var totalFoundCount uint64 - - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - shuffle(len(nodeIDs), func(i, j int) { - nodeIDs[i], nodeIDs[j] = nodeIDs[j], nodeIDs[i] - }) - for _, id := range nodeIDs { - key, data, err := uploadFile(sim.Service("swarm", id).(*Swarm)) - if err != nil { - return err - } - log.Trace("file uploaded", "node", id, "key", key.String()) - files = append(files, file{ - addr: key, - data: data, - nodeID: id, - }) - } - - if *waitKademlia { - if _, err := sim.WaitTillHealthy(ctx, 2); err != nil { - return err - } - } - - // File retrieval check is repeated until all uploaded files are retrieved from all nodes - // or until the timeout is reached. - for { - if retrieve(sim, files, &checkStatusM, &nodeStatusM, &totalFoundCount) == 0 { - return nil - } - } - }) - - if result.Error != nil { - t.Fatal(result.Error) - } - log.Debug("done: test sync step", "n", i+1, "nodes", step.nodeCount) - } -} - -// uploadFile, uploads a short file to the swarm instance -// using the api.Put method. -func uploadFile(swarm *Swarm) (storage.Address, string, error) { - b := make([]byte, 8) - _, err := rand.Read(b) - if err != nil { - return nil, "", err - } - // File data is very short, but it is ensured that its - // uniqueness is very certain. - data := fmt.Sprintf("test content %s %x", time.Now().Round(0), b) - ctx := context.TODO() - k, wait, err := swarm.api.Put(ctx, data, "text/plain", false) - if err != nil { - return nil, "", err - } - if wait != nil { - err = wait(ctx) - } - return k, data, err -} - -// retrieve is the function that is used for checking the availability of -// uploaded files in testSwarmNetwork test helper function. -func retrieve( - sim *simulation.Simulation, - files []file, - checkStatusM *sync.Map, - nodeStatusM *sync.Map, - totalFoundCount *uint64, -) (missing uint64) { - shuffle(len(files), func(i, j int) { - files[i], files[j] = files[j], files[i] - }) - - var totalWg sync.WaitGroup - errc := make(chan error) - - nodeIDs := sim.UpNodeIDs() - - totalCheckCount := len(nodeIDs) * len(files) - - for _, id := range nodeIDs { - if _, ok := nodeStatusM.Load(id); ok { - continue - } - start := time.Now() - var checkCount uint64 - var foundCount uint64 - - totalWg.Add(1) - - var wg sync.WaitGroup - - swarm := sim.Service("swarm", id).(*Swarm) - for _, f := range files { - - checkKey := check{ - key: f.addr.String(), - nodeID: id, - } - if n, ok := checkStatusM.Load(checkKey); ok && n.(int) == 0 { - continue - } - - checkCount++ - wg.Add(1) - go func(f file, id enode.ID) { - defer wg.Done() - - log.Debug("api get: check file", "node", id.String(), "key", f.addr.String(), "total files found", atomic.LoadUint64(totalFoundCount)) - - r, _, _, _, err := swarm.api.Get(context.TODO(), api.NOOPDecrypt, f.addr, "/") - if err != nil { - errc <- fmt.Errorf("api get: node %s, key %s, kademlia %s: %v", id, f.addr, swarm.bzz.Hive, err) - return - } - d, err := ioutil.ReadAll(r) - if err != nil { - errc <- fmt.Errorf("api get: read response: node %s, key %s: kademlia %s: %v", id, f.addr, swarm.bzz.Hive, err) - return - } - data := string(d) - if data != f.data { - errc <- fmt.Errorf("file contend missmatch: node %s, key %s, expected %q, got %q", id, f.addr, f.data, data) - return - } - checkStatusM.Store(checkKey, 0) - atomic.AddUint64(&foundCount, 1) - log.Info("api get: file found", "node", id.String(), "key", f.addr.String(), "content", data, "files found", atomic.LoadUint64(&foundCount)) - }(f, id) - } - - go func(id enode.ID) { - defer totalWg.Done() - wg.Wait() - - atomic.AddUint64(totalFoundCount, foundCount) - - if foundCount == checkCount { - log.Info("all files are found for node", "id", id.String(), "duration", time.Since(start)) - nodeStatusM.Store(id, 0) - return - } - log.Debug("files missing for node", "id", id.String(), "check", checkCount, "found", foundCount) - }(id) - - } - - go func() { - totalWg.Wait() - close(errc) - }() - - var errCount int - for err := range errc { - if err != nil { - errCount++ - } - log.Warn(err.Error()) - } - - log.Info("check stats", "total check count", totalCheckCount, "total files found", atomic.LoadUint64(totalFoundCount), "total errors", errCount) - - return uint64(totalCheckCount) - atomic.LoadUint64(totalFoundCount) -} - -// Backported from stdlib https://golang.org/src/math/rand/rand.go?s=11175:11215#L333 -// -// Replace with rand.Shuffle from go 1.10 when go 1.9 support is dropped. -// -// shuffle pseudo-randomizes the order of elements. -// n is the number of elements. Shuffle panics if n < 0. -// swap swaps the elements with indexes i and j. -func shuffle(n int, swap func(i, j int)) { - if n < 0 { - panic("invalid argument to Shuffle") - } - - // Fisher-Yates shuffle: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle - // Shuffle really ought not be called with n that doesn't fit in 32 bits. - // Not only will it take a very long time, but with 2³¹! possible permutations, - // there's no way that any PRNG can have a big enough internal state to - // generate even a minuscule percentage of the possible permutations. - // Nevertheless, the right API signature accepts an int n, so handle it as best we can. - i := n - 1 - for ; i > 1<<31-1-1; i-- { - j := int(rand.Int63n(int64(i + 1))) - swap(i, j) - } - for ; i > 0; i-- { - j := int(rand.Int31n(int32(i + 1))) - swap(i, j) - } -} diff --git a/swarm/pot/address.go b/swarm/pot/address.go deleted file mode 100644 index 3974ebcaac7b..000000000000 --- a/swarm/pot/address.go +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package pot see doc.go -package pot - -import ( - "encoding/binary" - "fmt" - "math/rand" - "strconv" - "strings" - - "github.com/ethereum/go-ethereum/common" -) - -var ( - zerosBin = Address{}.Bin() -) - -// Address is an alias for common.Hash -type Address common.Hash - -// NewAddressFromBytes constructs an Address from a byte slice -func NewAddressFromBytes(b []byte) Address { - h := common.Hash{} - copy(h[:], b) - return Address(h) -} - -func (a Address) IsZero() bool { - return a.Bin() == zerosBin -} - -func (a Address) String() string { - return fmt.Sprintf("%x", a[:]) -} - -// MarshalJSON Address serialisation -func (a *Address) MarshalJSON() (out []byte, err error) { - return []byte(`"` + a.String() + `"`), nil -} - -// UnmarshalJSON Address deserialisation -func (a *Address) UnmarshalJSON(value []byte) error { - *a = Address(common.HexToHash(string(value[1 : len(value)-1]))) - return nil -} - -// Bin returns the string form of the binary representation of an address (only first 8 bits) -func (a Address) Bin() string { - return ToBin(a[:]) -} - -// ToBin converts a byteslice to the string binary representation -func ToBin(a []byte) string { - var bs []string - for _, b := range a { - bs = append(bs, fmt.Sprintf("%08b", b)) - } - return strings.Join(bs, "") -} - -// Bytes returns the Address as a byte slice -func (a Address) Bytes() []byte { - return a[:] -} - -/* -Proximity(x, y) returns the proximity order of the MSB distance between x and y - -The distance metric MSB(x, y) of two equal length byte sequences x an y is the -value of the binary integer cast of the x^y, ie., x and y bitwise xor-ed. -the binary cast is big endian: most significant bit first (=MSB). - -Proximity(x, y) is a discrete logarithmic scaling of the MSB distance. -It is defined as the reverse rank of the integer part of the base 2 -logarithm of the distance. -It is calculated by counting the number of common leading zeros in the (MSB) -binary representation of the x^y. - -(0 farthest, 255 closest, 256 self) -*/ -func proximity(one, other Address) (ret int, eq bool) { - return posProximity(one, other, 0) -} - -// posProximity(a, b, pos) returns proximity order of b wrt a (symmetric) pretending -// the first pos bits match, checking only bits index >= pos -func posProximity(one, other Address, pos int) (ret int, eq bool) { - for i := pos / 8; i < len(one); i++ { - if one[i] == other[i] { - continue - } - oxo := one[i] ^ other[i] - start := 0 - if i == pos/8 { - start = pos % 8 - } - for j := start; j < 8; j++ { - if (oxo>>uint8(7-j))&0x01 != 0 { - return i*8 + j, false - } - } - } - return len(one) * 8, true -} - -// ProxCmp compares the distances a->target and b->target. -// Returns -1 if a is closer to target, 1 if b is closer to target -// and 0 if they are equal. -func ProxCmp(a, x, y interface{}) int { - return proxCmp(ToBytes(a), ToBytes(x), ToBytes(y)) -} - -func proxCmp(a, x, y []byte) int { - for i := range a { - dx := x[i] ^ a[i] - dy := y[i] ^ a[i] - if dx > dy { - return 1 - } else if dx < dy { - return -1 - } - } - return 0 -} - -// RandomAddressAt (address, prox) generates a random address -// at proximity order prox relative to address -// if prox is negative a random address is generated -func RandomAddressAt(self Address, prox int) (addr Address) { - addr = self - pos := -1 - if prox >= 0 { - pos = prox / 8 - trans := prox % 8 - transbytea := byte(0) - for j := 0; j <= trans; j++ { - transbytea |= 1 << uint8(7-j) - } - flipbyte := byte(1 << uint8(7-trans)) - transbyteb := transbytea ^ byte(255) - randbyte := byte(rand.Intn(255)) - addr[pos] = ((addr[pos] & transbytea) ^ flipbyte) | randbyte&transbyteb - } - for i := pos + 1; i < len(addr); i++ { - addr[i] = byte(rand.Intn(255)) - } - - return -} - -// RandomAddress generates a random address -func RandomAddress() Address { - return RandomAddressAt(Address{}, -1) -} - -// NewAddressFromString creates a byte slice from a string in binary representation -func NewAddressFromString(s string) []byte { - ha := [32]byte{} - - t := s + zerosBin[:len(zerosBin)-len(s)] - for i := 0; i < 4; i++ { - n, err := strconv.ParseUint(t[i*64:(i+1)*64], 2, 64) - if err != nil { - panic("wrong format: " + err.Error()) - } - binary.BigEndian.PutUint64(ha[i*8:(i+1)*8], n) - } - return ha[:] -} - -// BytesAddress is an interface for elements addressable by a byte slice -type BytesAddress interface { - Address() []byte -} - -// ToBytes turns the Val into bytes -func ToBytes(v Val) []byte { - if v == nil { - return nil - } - b, ok := v.([]byte) - if !ok { - ba, ok := v.(BytesAddress) - if !ok { - panic(fmt.Sprintf("unsupported value type %T", v)) - } - b = ba.Address() - } - return b -} - -// DefaultPof returns a proximity order comparison operator function -// where all -func DefaultPof(max int) func(one, other Val, pos int) (int, bool) { - return func(one, other Val, pos int) (int, bool) { - po, eq := proximityOrder(ToBytes(one), ToBytes(other), pos) - if po >= max { - eq = true - po = max - } - return po, eq - } -} - -func proximityOrder(one, other []byte, pos int) (int, bool) { - for i := pos / 8; i < len(one); i++ { - if one[i] == other[i] { - continue - } - oxo := one[i] ^ other[i] - start := 0 - if i == pos/8 { - start = pos % 8 - } - for j := start; j < 8; j++ { - if (oxo>>uint8(7-j))&0x01 != 0 { - return i*8 + j, false - } - } - } - return len(one) * 8, true -} - -// Label displays the node's key in binary format -func Label(v Val) string { - if v == nil { - return "" - } - if s, ok := v.(fmt.Stringer); ok { - return s.String() - } - if b, ok := v.([]byte); ok { - return ToBin(b) - } - panic(fmt.Sprintf("unsupported value type %T", v)) -} diff --git a/swarm/pot/doc.go b/swarm/pot/doc.go deleted file mode 100644 index cb6faea57b3f..000000000000 --- a/swarm/pot/doc.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -/* -Package pot (proximity order tree) implements a container similar to a binary tree. -The elements are generic Val interface types. - -Each fork in the trie is itself a value. Values of the subtree contained under -a node all share the same order when compared to other elements in the tree. - -Example of proximity order is the length of the common prefix over bitvectors. -(which is equivalent to the reverse rank of order of magnitude of the MSB first X -OR distance over finite set of integers). - -Methods take a comparison operator (pof, proximity order function) to compare two -value types. The default pof assumes Val to be or project to a byte slice using -the reverse rank on the MSB first XOR logarithmic distance. - -If the address space if limited, equality is defined as the maximum proximity order. - -The container offers applicative (functional) style methods on PO trees: -* adding/removing en element -* swap (value based add/remove) -* merging two PO trees (union) - -as well as iterator accessors that respect proximity order - -When synchronicity of membership if not 100% requirement (e.g. used as a database -of network connections), applicative structures have the advantage that nodes -are immutable therefore manipulation does not need locking allowing for -concurrent retrievals. -For the use case where the entire container is supposed to allow changes by -concurrent routines, - -Pot -* retrieval, insertion and deletion by key involves log(n) pointer lookups -* for any item retrieval (defined as common prefix on the binary key) -* provide synchronous iterators respecting proximity ordering wrt any item -* provide asynchronous iterator (for parallel execution of operations) over n items -* allows cheap iteration over ranges -* asymmetric concurrent merge (union) - -Note: -* as is, union only makes sense for set representations since which of two values -with equal keys survives is random -* intersection is not implemented -* simple get accessor is not implemented (but derivable from EachNeighbour) - -Pinned value on the node implies no need to copy keys of the item type. - -Note that -* the same set of values allows for a large number of alternative -POT representations. -* values on the top are accessed faster than lower ones and the steps needed to -retrieve items has a logarithmic distribution. - -As a consequence one can organise the tree so that items that need faster access -are torwards the top. In particular for any subset where popularity has a power -distriution that is independent of proximity order (content addressed storage of -chunks), it is in principle possible to create a pot where the steps needed to -access an item is inversely proportional to its popularity. -Such organisation is not implemented as yet. - -TODO: -* overwrite-style merge -* intersection -* access frequency based optimisations - -*/ -package pot diff --git a/swarm/pot/pot.go b/swarm/pot/pot.go deleted file mode 100644 index dfda84804d24..000000000000 --- a/swarm/pot/pot.go +++ /dev/null @@ -1,807 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package pot see doc.go -package pot - -import ( - "fmt" - "sync" -) - -const ( - maxkeylen = 256 -) - -// Pot is the node type (same for root, branching node and leaf) -type Pot struct { - pin Val - bins []*Pot - size int - po int -} - -// Val is the element type for Pots -type Val interface{} - -// Pof is the proximity order comparison operator function -type Pof func(Val, Val, int) (int, bool) - -// NewPot constructor. Requires a value of type Val to pin -// and po to point to a span in the Val key -// The pinned item counts towards the size -func NewPot(v Val, po int) *Pot { - var size int - if v != nil { - size++ - } - return &Pot{ - pin: v, - po: po, - size: size, - } -} - -// Pin returns the pinned element (key) of the Pot -func (t *Pot) Pin() Val { - return t.pin -} - -// Size returns the number of values in the Pot -func (t *Pot) Size() int { - if t == nil { - return 0 - } - return t.size -} - -// Add inserts a new value into the Pot and -// returns the proximity order of v and a boolean -// indicating if the item was found -// Add called on (t, v) returns a new Pot that contains all the elements of t -// plus the value v, using the applicative add -// the second return value is the proximity order of the inserted element -// the third is boolean indicating if the item was found -func Add(t *Pot, val Val, pof Pof) (*Pot, int, bool) { - return add(t, val, pof) -} - -func (t *Pot) clone() *Pot { - return &Pot{ - pin: t.pin, - size: t.size, - po: t.po, - bins: t.bins, - } -} - -func add(t *Pot, val Val, pof Pof) (*Pot, int, bool) { - var r *Pot - if t == nil || t.pin == nil { - r = t.clone() - r.pin = val - r.size++ - return r, 0, false - } - po, found := pof(t.pin, val, t.po) - if found { - r = t.clone() - r.pin = val - return r, po, true - } - - var p *Pot - var i, j int - size := t.size - for i < len(t.bins) { - n := t.bins[i] - if n.po == po { - p, _, found = add(n, val, pof) - if !found { - size++ - } - j++ - break - } - if n.po > po { - break - } - i++ - j++ - } - if p == nil { - size++ - p = &Pot{ - pin: val, - size: 1, - po: po, - } - } - - bins := append([]*Pot{}, t.bins[:i]...) - bins = append(bins, p) - bins = append(bins, t.bins[j:]...) - r = &Pot{ - pin: t.pin, - size: size, - po: t.po, - bins: bins, - } - - return r, po, found -} - -// Remove called on (v) deletes v from the Pot and returns -// the proximity order of v and a boolean value indicating -// if the value was found -// Remove called on (t, v) returns a new Pot that contains all the elements of t -// minus the value v, using the applicative remove -// the second return value is the proximity order of the inserted element -// the third is boolean indicating if the item was found -func Remove(t *Pot, v Val, pof Pof) (*Pot, int, bool) { - return remove(t, v, pof) -} - -func remove(t *Pot, val Val, pof Pof) (r *Pot, po int, found bool) { - size := t.size - po, found = pof(t.pin, val, t.po) - if found { - size-- - if size == 0 { - r = &Pot{ - po: t.po, - } - return r, po, true - } - i := len(t.bins) - 1 - last := t.bins[i] - r = &Pot{ - pin: last.pin, - bins: append(t.bins[:i], last.bins...), - size: size, - po: t.po, - } - return r, t.po, true - } - - var p *Pot - var i, j int - for i < len(t.bins) { - n := t.bins[i] - if n.po == po { - p, po, found = remove(n, val, pof) - if found { - size-- - } - j++ - break - } - if n.po > po { - return t, po, false - } - i++ - j++ - } - bins := t.bins[:i] - if p != nil && p.pin != nil { - bins = append(bins, p) - } - bins = append(bins, t.bins[j:]...) - r = &Pot{ - pin: val, - size: size, - po: t.po, - bins: bins, - } - return r, po, found -} - -// Swap called on (k, f) looks up the item at k -// and applies the function f to the value v at k or to nil if the item is not found -// if f(v) returns nil, the element is removed -// if f(v) returns v' <> v then v' is inserted into the Pot -// if (v) == v the Pot is not changed -// it panics if Pof(f(v), k) show that v' and v are not key-equal -func Swap(t *Pot, k Val, pof Pof, f func(v Val) Val) (r *Pot, po int, found bool, change bool) { - var val Val - if t.pin == nil { - val = f(nil) - if val == nil { - return nil, 0, false, false - } - return NewPot(val, t.po), 0, false, true - } - size := t.size - po, found = pof(k, t.pin, t.po) - if found { - val = f(t.pin) - // remove element - if val == nil { - size-- - if size == 0 { - r = &Pot{ - po: t.po, - } - // return empty pot - return r, po, true, true - } - // actually remove pin, by merging last bin - i := len(t.bins) - 1 - last := t.bins[i] - r = &Pot{ - pin: last.pin, - bins: append(t.bins[:i], last.bins...), - size: size, - po: t.po, - } - return r, po, true, true - } - // element found but no change - if val == t.pin { - return t, po, true, false - } - // actually modify the pinned element, but no change in structure - r = t.clone() - r.pin = val - return r, po, true, true - } - - // recursive step - var p *Pot - n, i := t.getPos(po) - if n != nil { - p, po, found, change = Swap(n, k, pof, f) - // recursive no change - if !change { - return t, po, found, false - } - // recursive change - bins := append([]*Pot{}, t.bins[:i]...) - if p.size == 0 { - size-- - } else { - size += p.size - n.size - bins = append(bins, p) - } - i++ - if i < len(t.bins) { - bins = append(bins, t.bins[i:]...) - } - r = t.clone() - r.bins = bins - r.size = size - return r, po, found, true - } - // key does not exist - val = f(nil) - if val == nil { - // and it should not be created - return t, po, false, false - } - // otherwise check val if equal to k - if _, eq := pof(val, k, po); !eq { - panic("invalid value") - } - /// - size++ - p = &Pot{ - pin: val, - size: 1, - po: po, - } - - bins := append([]*Pot{}, t.bins[:i]...) - bins = append(bins, p) - if i < len(t.bins) { - bins = append(bins, t.bins[i:]...) - } - r = t.clone() - r.bins = bins - r.size = size - return r, po, found, true -} - -// Union called on (t0, t1, pof) returns the union of t0 and t1 -// calculates the union using the applicative union -// the second return value is the number of common elements -func Union(t0, t1 *Pot, pof Pof) (*Pot, int) { - return union(t0, t1, pof) -} - -func union(t0, t1 *Pot, pof Pof) (*Pot, int) { - if t0 == nil || t0.size == 0 { - return t1, 0 - } - if t1 == nil || t1.size == 0 { - return t0, 0 - } - var pin Val - var bins []*Pot - var mis []int - wg := &sync.WaitGroup{} - wg.Add(1) - pin0 := t0.pin - pin1 := t1.pin - bins0 := t0.bins - bins1 := t1.bins - var i0, i1 int - var common int - - po, eq := pof(pin0, pin1, 0) - - for { - l0 := len(bins0) - l1 := len(bins1) - var n0, n1 *Pot - var p0, p1 int - var a0, a1 bool - - for { - - if !a0 && i0 < l0 && bins0[i0] != nil && bins0[i0].po <= po { - n0 = bins0[i0] - p0 = n0.po - a0 = p0 == po - } else { - a0 = true - } - - if !a1 && i1 < l1 && bins1[i1] != nil && bins1[i1].po <= po { - n1 = bins1[i1] - p1 = n1.po - a1 = p1 == po - } else { - a1 = true - } - if a0 && a1 { - break - } - - switch { - case (p0 < p1 || a1) && !a0: - bins = append(bins, n0) - i0++ - n0 = nil - case (p1 < p0 || a0) && !a1: - bins = append(bins, n1) - i1++ - n1 = nil - case p1 < po: - bl := len(bins) - bins = append(bins, nil) - ml := len(mis) - mis = append(mis, 0) - // wg.Add(1) - // go func(b, m int, m0, m1 *Pot) { - // defer wg.Done() - // bins[b], mis[m] = union(m0, m1, pof) - // }(bl, ml, n0, n1) - bins[bl], mis[ml] = union(n0, n1, pof) - i0++ - i1++ - n0 = nil - n1 = nil - } - } - - if eq { - common++ - pin = pin1 - break - } - - i := i0 - if len(bins0) > i && bins0[i].po == po { - i++ - } - var size0 int - for _, n := range bins0[i:] { - size0 += n.size - } - np := &Pot{ - pin: pin0, - bins: bins0[i:], - size: size0 + 1, - po: po, - } - - bins2 := []*Pot{np} - if n0 == nil { - pin0 = pin1 - po = maxkeylen + 1 - eq = true - common-- - - } else { - bins2 = append(bins2, n0.bins...) - pin0 = pin1 - pin1 = n0.pin - po, eq = pof(pin0, pin1, n0.po) - - } - bins0 = bins1 - bins1 = bins2 - i0 = i1 - i1 = 0 - - } - - wg.Done() - wg.Wait() - for _, c := range mis { - common += c - } - n := &Pot{ - pin: pin, - bins: bins, - size: t0.size + t1.size - common, - po: t0.po, - } - return n, common -} - -// Each called with (f) is a synchronous iterator over the bins of a node -// respecting an ordering -// proximity > pinnedness -func (t *Pot) Each(f func(Val, int) bool) bool { - return t.each(f) -} - -func (t *Pot) each(f func(Val, int) bool) bool { - var next bool - for _, n := range t.bins { - if n == nil { - return true - } - next = n.each(f) - if !next { - return false - } - } - if t.size == 0 { - return false - } - return f(t.pin, t.po) -} - -// EachFrom called with (f, start) is a synchronous iterator over the elements of a Pot -// within the inclusive range starting from proximity order start -// the function argument is passed the value and the proximity order wrt the root pin -// it does NOT include the pinned item of the root -// respecting an ordering -// proximity > pinnedness -// the iteration ends if the function return false or there are no more elements -// end of a po range can be implemented since po is passed to the function -func (t *Pot) EachFrom(f func(Val, int) bool, po int) bool { - return t.eachFrom(f, po) -} - -func (t *Pot) eachFrom(f func(Val, int) bool, po int) bool { - var next bool - _, lim := t.getPos(po) - for i := lim; i < len(t.bins); i++ { - n := t.bins[i] - next = n.each(f) - if !next { - return false - } - } - return f(t.pin, t.po) -} - -// EachBin iterates over bins of the pivot node and offers iterators to the caller on each -// subtree passing the proximity order and the size -// the iteration continues until the function's return value is false -// or there are no more subtries -func (t *Pot) EachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val, i int) bool) bool) bool) { - t.eachBin(val, pof, po, f) -} - -func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val, i int) bool) bool) bool) { - if t == nil || t.size == 0 { - return - } - spr, _ := pof(t.pin, val, t.po) - _, lim := t.getPos(spr) - var size int - var n *Pot - for i := 0; i < lim; i++ { - n = t.bins[i] - size += n.size - if n.po < po { - continue - } - if !f(n.po, n.size, n.each) { - return - } - } - if lim == len(t.bins) { - if spr >= po { - f(spr, 1, func(g func(Val, int) bool) bool { - return g(t.pin, spr) - }) - } - return - } - - n = t.bins[lim] - - spo := spr - if n.po == spr { - spo++ - size += n.size - } - if spr >= po { - if !f(spr, t.size-size, func(g func(Val, int) bool) bool { - return t.eachFrom(func(v Val, j int) bool { - return g(v, spr) - }, spo) - }) { - return - } - } - if n.po == spr { - n.eachBin(val, pof, po, f) - } - -} - -// EachNeighbour is a synchronous iterator over neighbours of any target val -// the order of elements retrieved reflect proximity order to the target -// TODO: add maximum proxbin to start range of iteration -func (t *Pot) EachNeighbour(val Val, pof Pof, f func(Val, int) bool) bool { - return t.eachNeighbour(val, pof, f) -} - -func (t *Pot) eachNeighbour(val Val, pof Pof, f func(Val, int) bool) bool { - if t == nil || t.size == 0 { - return false - } - var next bool - l := len(t.bins) - var n *Pot - ir := l - il := l - po, eq := pof(t.pin, val, t.po) - if !eq { - n, il = t.getPos(po) - if n != nil { - next = n.eachNeighbour(val, pof, f) - if !next { - return false - } - ir = il - } else { - ir = il - 1 - } - } - - next = f(t.pin, po) - if !next { - return false - } - - for i := l - 1; i > ir; i-- { - next = t.bins[i].each(func(v Val, _ int) bool { - return f(v, po) - }) - if !next { - return false - } - } - - for i := il - 1; i >= 0; i-- { - n := t.bins[i] - next = n.each(func(v Val, _ int) bool { - return f(v, n.po) - }) - if !next { - return false - } - } - return true -} - -// EachNeighbourAsync called on (val, max, maxPos, f, wait) is an asynchronous iterator -// over elements not closer than maxPos wrt val. -// val does not need to be match an element of the Pot, but if it does, and -// maxPos is keylength than it is included in the iteration -// Calls to f are parallelised, the order of calls is undefined. -// proximity order is respected in that there is no element in the Pot that -// is not visited if a closer node is visited. -// The iteration is finished when max number of nearest nodes is visited -// or if the entire there are no nodes not closer than maxPos that is not visited -// if wait is true, the iterator returns only if all calls to f are finished -// TODO: implement minPos for proper prox range iteration -func (t *Pot) EachNeighbourAsync(val Val, pof Pof, max int, maxPos int, f func(Val, int), wait bool) { - if max > t.size { - max = t.size - } - var wg *sync.WaitGroup - if wait { - wg = &sync.WaitGroup{} - } - t.eachNeighbourAsync(val, pof, max, maxPos, f, wg) - if wait { - wg.Wait() - } -} - -func (t *Pot) eachNeighbourAsync(val Val, pof Pof, max int, maxPos int, f func(Val, int), wg *sync.WaitGroup) (extra int) { - l := len(t.bins) - - po, eq := pof(t.pin, val, t.po) - - // if po is too close, set the pivot branch (pom) to maxPos - pom := po - if pom > maxPos { - pom = maxPos - } - n, il := t.getPos(pom) - ir := il - // if pivot branch exists and po is not too close, iterate on the pivot branch - if pom == po { - if n != nil { - - m := n.size - if max < m { - m = max - } - max -= m - - extra = n.eachNeighbourAsync(val, pof, m, maxPos, f, wg) - - } else { - if !eq { - ir-- - } - } - } else { - extra++ - max-- - if n != nil { - il++ - } - // before checking max, add up the extra elements - // on the close branches that are skipped (if po is too close) - for i := l - 1; i >= il; i-- { - s := t.bins[i] - m := s.size - if max < m { - m = max - } - max -= m - extra += m - } - } - - var m int - if pom == po { - - m, max, extra = need(1, max, extra) - if m <= 0 { - return - } - - if wg != nil { - wg.Add(1) - } - go func() { - if wg != nil { - defer wg.Done() - } - f(t.pin, po) - }() - - // otherwise iterats - for i := l - 1; i > ir; i-- { - n := t.bins[i] - - m, max, extra = need(n.size, max, extra) - if m <= 0 { - return - } - - if wg != nil { - wg.Add(m) - } - go func(pn *Pot, pm int) { - pn.each(func(v Val, _ int) bool { - if wg != nil { - defer wg.Done() - } - f(v, po) - pm-- - return pm > 0 - }) - }(n, m) - - } - } - - // iterate branches that are farther tham pom with their own po - for i := il - 1; i >= 0; i-- { - n := t.bins[i] - // the first time max is less than the size of the entire branch - // wait for the pivot thread to release extra elements - m, max, extra = need(n.size, max, extra) - if m <= 0 { - return - } - - if wg != nil { - wg.Add(m) - } - go func(pn *Pot, pm int) { - pn.each(func(v Val, _ int) bool { - if wg != nil { - defer wg.Done() - } - f(v, pn.po) - pm-- - return pm > 0 - }) - }(n, m) - - } - return max + extra -} - -// getPos called on (n) returns the forking node at PO n and its index if it exists -// otherwise nil -// caller is supposed to hold the lock -func (t *Pot) getPos(po int) (n *Pot, i int) { - for i, n = range t.bins { - if po > n.po { - continue - } - if po < n.po { - return nil, i - } - return n, i - } - return nil, len(t.bins) -} - -// need called on (m, max, extra) uses max m out of extra, and then max -// if needed, returns the adjusted counts -func need(m, max, extra int) (int, int, int) { - if m <= extra { - return m, max, extra - m - } - max += extra - m - if max <= 0 { - return m + max, 0, 0 - } - return m, max, 0 -} - -func (t *Pot) String() string { - return t.sstring("") -} - -func (t *Pot) sstring(indent string) string { - if t == nil { - return "" - } - var s string - indent += " " - s += fmt.Sprintf("%v%v (%v) %v \n", indent, t.pin, t.po, t.size) - for _, n := range t.bins { - s += fmt.Sprintf("%v%v\n", indent, n.sstring(indent)) - } - return s -} diff --git a/swarm/pot/pot_test.go b/swarm/pot/pot_test.go deleted file mode 100644 index aeb23dfc6b4e..000000000000 --- a/swarm/pot/pot_test.go +++ /dev/null @@ -1,685 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package pot - -import ( - "errors" - "fmt" - "math/rand" - "runtime" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/swarm/log" -) - -const ( - maxEachNeighbourTests = 420 - maxEachNeighbour = 420 - maxSwap = 420 - maxSwapTests = 420 -) - -// func init() { -// log.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(false)))) -// } - -type testAddr struct { - a []byte - i int -} - -func newTestAddr(s string, i int) *testAddr { - return &testAddr{NewAddressFromString(s), i} -} - -func (a *testAddr) Address() []byte { - return a.a -} - -func (a *testAddr) String() string { - return Label(a.a) -} - -func randomTestAddr(n int, i int) *testAddr { - v := RandomAddress().Bin()[:n] - return newTestAddr(v, i) -} - -func randomtestAddr(n int, i int) *testAddr { - v := RandomAddress().Bin()[:n] - return newTestAddr(v, i) -} - -func indexes(t *Pot) (i []int, po []int) { - t.Each(func(v Val, p int) bool { - a := v.(*testAddr) - i = append(i, a.i) - po = append(po, p) - return true - }) - return i, po -} - -func testAdd(t *Pot, pof Pof, j int, values ...string) (_ *Pot, n int, f bool) { - for i, val := range values { - t, n, f = Add(t, newTestAddr(val, i+j), pof) - } - return t, n, f -} - -func TestPotAdd(t *testing.T) { - pof := DefaultPof(8) - n := NewPot(newTestAddr("00111100", 0), 0) - // Pin set correctly - exp := "00111100" - got := Label(n.Pin())[:8] - if got != exp { - t.Fatalf("incorrect pinned value. Expected %v, got %v", exp, got) - } - // check size - goti := n.Size() - expi := 1 - if goti != expi { - t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) - } - - n, _, _ = testAdd(n, pof, 1, "01111100", "00111100", "01111100", "00011100") - // check size - goti = n.Size() - expi = 3 - if goti != expi { - t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) - } - inds, po := indexes(n) - got = fmt.Sprintf("%v", inds) - exp = "[3 4 2]" - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } - got = fmt.Sprintf("%v", po) - exp = "[1 2 0]" - if got != exp { - t.Fatalf("incorrect po-s in iteration over Pot. Expected %v, got %v", exp, got) - } -} - -func TestPotRemove(t *testing.T) { - pof := DefaultPof(8) - n := NewPot(newTestAddr("00111100", 0), 0) - n, _, _ = Remove(n, newTestAddr("00111100", 0), pof) - exp := "" - got := Label(n.Pin()) - if got != exp { - t.Fatalf("incorrect pinned value. Expected %v, got %v", exp, got) - } - n, _, _ = testAdd(n, pof, 1, "00000000", "01111100", "00111100", "00011100") - n, _, _ = Remove(n, newTestAddr("00111100", 0), pof) - goti := n.Size() - expi := 3 - if goti != expi { - t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) - } - inds, po := indexes(n) - got = fmt.Sprintf("%v", inds) - exp = "[2 4 0]" - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } - got = fmt.Sprintf("%v", po) - exp = "[1 3 0]" - if got != exp { - t.Fatalf("incorrect po-s in iteration over Pot. Expected %v, got %v", exp, got) - } - // remove again - n, _, _ = Remove(n, newTestAddr("00111100", 0), pof) - inds, _ = indexes(n) - got = fmt.Sprintf("%v", inds) - exp = "[2 4]" - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } - -} - -func TestPotSwap(t *testing.T) { - for i := 0; i < maxSwapTests; i++ { - alen := maxkeylen - pof := DefaultPof(alen) - max := rand.Intn(maxSwap) - - n := NewPot(nil, 0) - var m []*testAddr - var found bool - for j := 0; j < 2*max; { - v := randomtestAddr(alen, j) - n, _, found = Add(n, v, pof) - if !found { - m = append(m, v) - j++ - } - } - k := make(map[string]*testAddr) - for j := 0; j < max; { - v := randomtestAddr(alen, 1) - _, found := k[Label(v)] - if !found { - k[Label(v)] = v - j++ - } - } - for _, v := range k { - m = append(m, v) - } - f := func(v Val) Val { - tv := v.(*testAddr) - if tv.i < max { - return nil - } - tv.i = 0 - return v - } - for _, val := range m { - n, _, _, _ = Swap(n, val, pof, func(v Val) Val { - if v == nil { - return val - } - return f(v) - }) - } - sum := 0 - n.Each(func(v Val, i int) bool { - if v == nil { - return true - } - sum++ - tv := v.(*testAddr) - if tv.i > 1 { - t.Fatalf("item value incorrect, expected 0, got %v", tv.i) - } - return true - }) - if sum != 2*max { - t.Fatalf("incorrect number of elements. expected %v, got %v", 2*max, sum) - } - if sum != n.Size() { - t.Fatalf("incorrect size. expected %v, got %v", sum, n.Size()) - } - } -} - -func checkPo(val Val, pof Pof) func(Val, int) error { - return func(v Val, po int) error { - // check the po - exp, _ := pof(val, v, 0) - if po != exp { - return fmt.Errorf("incorrect prox order for item %v in neighbour iteration for %v. Expected %v, got %v", v, val, exp, po) - } - return nil - } -} - -func checkOrder(val Val) func(Val, int) error { - po := maxkeylen - return func(v Val, p int) error { - if po < p { - return fmt.Errorf("incorrect order for item %v in neighbour iteration for %v. PO %v > %v (previous max)", v, val, p, po) - } - po = p - return nil - } -} - -func checkValues(m map[string]bool, val Val) func(Val, int) error { - return func(v Val, po int) error { - duplicate, ok := m[Label(v)] - if !ok { - return fmt.Errorf("alien value %v", v) - } - if duplicate { - return fmt.Errorf("duplicate value returned: %v", v) - } - m[Label(v)] = true - return nil - } -} - -var errNoCount = errors.New("not count") - -func testPotEachNeighbour(n *Pot, pof Pof, val Val, expCount int, fs ...func(Val, int) error) error { - var err error - var count int - n.EachNeighbour(val, pof, func(v Val, po int) bool { - for _, f := range fs { - err = f(v, po) - if err != nil { - return err.Error() == errNoCount.Error() - } - } - count++ - return count != expCount - }) - if err == nil && count < expCount { - return fmt.Errorf("not enough neighbours returned, expected %v, got %v", expCount, count) - } - return err -} - -const ( - mergeTestCount = 5 - mergeTestChoose = 5 -) - -func TestPotMergeCommon(t *testing.T) { - vs := make([]*testAddr, mergeTestCount) - for i := 0; i < maxEachNeighbourTests; i++ { - alen := maxkeylen - pof := DefaultPof(alen) - - for j := 0; j < len(vs); j++ { - vs[j] = randomtestAddr(alen, j) - } - max0 := rand.Intn(mergeTestChoose) + 1 - max1 := rand.Intn(mergeTestChoose) + 1 - n0 := NewPot(nil, 0) - n1 := NewPot(nil, 0) - log.Trace(fmt.Sprintf("round %v: %v - %v", i, max0, max1)) - m := make(map[string]bool) - var found bool - for j := 0; j < max0; { - r := rand.Intn(max0) - v := vs[r] - n0, _, found = Add(n0, v, pof) - if !found { - m[Label(v)] = false - j++ - } - } - expAdded := 0 - - for j := 0; j < max1; { - r := rand.Intn(max1) - v := vs[r] - n1, _, found = Add(n1, v, pof) - if !found { - j++ - } - _, found = m[Label(v)] - if !found { - expAdded++ - m[Label(v)] = false - } - } - if i < 6 { - continue - } - expSize := len(m) - log.Trace(fmt.Sprintf("%v-0: pin: %v, size: %v", i, n0.Pin(), max0)) - log.Trace(fmt.Sprintf("%v-1: pin: %v, size: %v", i, n1.Pin(), max1)) - log.Trace(fmt.Sprintf("%v: merged tree size: %v, newly added: %v", i, expSize, expAdded)) - n, common := Union(n0, n1, pof) - added := n1.Size() - common - size := n.Size() - - if expSize != size { - t.Fatalf("%v: incorrect number of elements in merged pot, expected %v, got %v\n%v", i, expSize, size, n) - } - if expAdded != added { - t.Fatalf("%v: incorrect number of added elements in merged pot, expected %v, got %v", i, expAdded, added) - } - if !checkDuplicates(n) { - t.Fatalf("%v: merged pot contains duplicates: \n%v", i, n) - } - for k := range m { - _, _, found = Add(n, newTestAddr(k, 0), pof) - if !found { - t.Fatalf("%v: merged pot (size:%v, added: %v) missing element %v", i, size, added, k) - } - } - } -} - -func TestPotMergeScale(t *testing.T) { - for i := 0; i < maxEachNeighbourTests; i++ { - alen := maxkeylen - pof := DefaultPof(alen) - max0 := rand.Intn(maxEachNeighbour) + 1 - max1 := rand.Intn(maxEachNeighbour) + 1 - n0 := NewPot(nil, 0) - n1 := NewPot(nil, 0) - log.Trace(fmt.Sprintf("round %v: %v - %v", i, max0, max1)) - m := make(map[string]bool) - var found bool - for j := 0; j < max0; { - v := randomtestAddr(alen, j) - n0, _, found = Add(n0, v, pof) - if !found { - m[Label(v)] = false - j++ - } - } - expAdded := 0 - - for j := 0; j < max1; { - v := randomtestAddr(alen, j) - n1, _, found = Add(n1, v, pof) - if !found { - j++ - } - _, found = m[Label(v)] - if !found { - expAdded++ - m[Label(v)] = false - } - } - if i < 6 { - continue - } - expSize := len(m) - log.Trace(fmt.Sprintf("%v-0: pin: %v, size: %v", i, n0.Pin(), max0)) - log.Trace(fmt.Sprintf("%v-1: pin: %v, size: %v", i, n1.Pin(), max1)) - log.Trace(fmt.Sprintf("%v: merged tree size: %v, newly added: %v", i, expSize, expAdded)) - n, common := Union(n0, n1, pof) - added := n1.Size() - common - size := n.Size() - - if expSize != size { - t.Fatalf("%v: incorrect number of elements in merged pot, expected %v, got %v", i, expSize, size) - } - if expAdded != added { - t.Fatalf("%v: incorrect number of added elements in merged pot, expected %v, got %v", i, expAdded, added) - } - if !checkDuplicates(n) { - t.Fatalf("%v: merged pot contains duplicates", i) - } - for k := range m { - _, _, found = Add(n, newTestAddr(k, 0), pof) - if !found { - t.Fatalf("%v: merged pot (size:%v, added: %v) missing element %v", i, size, added, k) - } - } - } -} - -func checkDuplicates(t *Pot) bool { - po := -1 - for _, c := range t.bins { - if c == nil { - return false - } - if c.po <= po || !checkDuplicates(c) { - return false - } - po = c.po - } - return true -} - -func TestPotEachNeighbourSync(t *testing.T) { - for i := 0; i < maxEachNeighbourTests; i++ { - alen := maxkeylen - pof := DefaultPof(maxkeylen) - max := rand.Intn(maxEachNeighbour/2) + maxEachNeighbour/2 - pin := randomTestAddr(alen, 0) - n := NewPot(pin, 0) - m := make(map[string]bool) - m[Label(pin)] = false - for j := 1; j <= max; j++ { - v := randomTestAddr(alen, j) - n, _, _ = Add(n, v, pof) - m[Label(v)] = false - } - - size := n.Size() - if size < 2 { - continue - } - count := rand.Intn(size/2) + size/2 - val := randomTestAddr(alen, max+1) - log.Trace(fmt.Sprintf("%v: pin: %v, size: %v, val: %v, count: %v", i, n.Pin(), size, val, count)) - err := testPotEachNeighbour(n, pof, val, count, checkPo(val, pof), checkOrder(val), checkValues(m, val)) - if err != nil { - t.Fatal(err) - } - minPoFound := alen - maxPoNotFound := 0 - for k, found := range m { - po, _ := pof(val, newTestAddr(k, 0), 0) - if found { - if po < minPoFound { - minPoFound = po - } - } else { - if po > maxPoNotFound { - maxPoNotFound = po - } - } - } - if minPoFound < maxPoNotFound { - t.Fatalf("incorrect neighbours returned: found one with PO %v < there was one not found with PO %v", minPoFound, maxPoNotFound) - } - } -} - -func TestPotEachNeighbourAsync(t *testing.T) { - for i := 0; i < maxEachNeighbourTests; i++ { - max := rand.Intn(maxEachNeighbour/2) + maxEachNeighbour/2 - alen := maxkeylen - pof := DefaultPof(alen) - n := NewPot(randomTestAddr(alen, 0), 0) - size := 1 - var found bool - for j := 1; j <= max; j++ { - v := randomTestAddr(alen, j) - n, _, found = Add(n, v, pof) - if !found { - size++ - } - } - if size != n.Size() { - t.Fatal(n) - } - if size < 2 { - continue - } - count := rand.Intn(size/2) + size/2 - val := randomTestAddr(alen, max+1) - - mu := sync.Mutex{} - m := make(map[string]bool) - maxPos := rand.Intn(alen) - log.Trace(fmt.Sprintf("%v: pin: %v, size: %v, val: %v, count: %v, maxPos: %v", i, n.Pin(), size, val, count, maxPos)) - msize := 0 - remember := func(v Val, po int) error { - if po > maxPos { - return errNoCount - } - m[Label(v)] = true - msize++ - return nil - } - if i == 0 { - continue - } - testPotEachNeighbour(n, pof, val, count, remember) - d := 0 - forget := func(v Val, po int) { - mu.Lock() - defer mu.Unlock() - d++ - delete(m, Label(v)) - } - - n.EachNeighbourAsync(val, pof, count, maxPos, forget, true) - if d != msize { - t.Fatalf("incorrect number of neighbour calls in async iterator. expected %v, got %v", msize, d) - } - if len(m) != 0 { - t.Fatalf("incorrect neighbour calls in async iterator. %v items missed:\n%v", len(m), n) - } - } -} - -func benchmarkEachNeighbourSync(t *testing.B, max, count int, d time.Duration) { - t.ReportAllocs() - alen := maxkeylen - pof := DefaultPof(alen) - pin := randomTestAddr(alen, 0) - n := NewPot(pin, 0) - var found bool - for j := 1; j <= max; { - v := randomTestAddr(alen, j) - n, _, found = Add(n, v, pof) - if !found { - j++ - } - } - t.ResetTimer() - for i := 0; i < t.N; i++ { - val := randomTestAddr(alen, max+1) - m := 0 - n.EachNeighbour(val, pof, func(v Val, po int) bool { - time.Sleep(d) - m++ - return m != count - }) - } - t.StopTimer() - stats := new(runtime.MemStats) - runtime.ReadMemStats(stats) -} - -func benchmarkEachNeighbourAsync(t *testing.B, max, count int, d time.Duration) { - t.ReportAllocs() - alen := maxkeylen - pof := DefaultPof(alen) - pin := randomTestAddr(alen, 0) - n := NewPot(pin, 0) - var found bool - for j := 1; j <= max; { - v := randomTestAddr(alen, j) - n, _, found = Add(n, v, pof) - if !found { - j++ - } - } - t.ResetTimer() - for i := 0; i < t.N; i++ { - val := randomTestAddr(alen, max+1) - n.EachNeighbourAsync(val, pof, count, alen, func(v Val, po int) { - time.Sleep(d) - }, true) - } - t.StopTimer() - stats := new(runtime.MemStats) - runtime.ReadMemStats(stats) -} - -func BenchmarkEachNeighbourSync_3_1_0(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 1*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_0(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 1*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_0(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 1*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_0(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 1*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_0(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 1*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_0(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 1*time.Microsecond) -} - -func BenchmarkEachNeighbourSync_3_1_1(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 2*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_1(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 2*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_1(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 2*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_1(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 2*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_1(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 2*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_1(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 2*time.Microsecond) -} - -func BenchmarkEachNeighbourSync_3_1_2(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 4*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_2(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 4*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_2(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 4*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_2(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 4*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_2(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 4*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_2(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 4*time.Microsecond) -} - -func BenchmarkEachNeighbourSync_3_1_3(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 8*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_3(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 8*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_3(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 8*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_3(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 8*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_3(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 8*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_3(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 8*time.Microsecond) -} - -func BenchmarkEachNeighbourSync_3_1_4(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 16*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_4(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 16*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_4(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 16*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_4(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 16*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_4(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 16*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_4(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 16*time.Microsecond) -} diff --git a/swarm/pss/ARCHITECTURE.md b/swarm/pss/ARCHITECTURE.md deleted file mode 100644 index 279e895ab798..000000000000 --- a/swarm/pss/ARCHITECTURE.md +++ /dev/null @@ -1,144 +0,0 @@ -# Postal Service over Swarm - -Pss provides devp2p functionality for swarm nodes without the need for a direct tcp connection between them. - -Messages are encapsulated in a devp2p message structure `PssMsg`. These capsules are forwarded from node to node using ordinary tcp devp2p until they reach their destination: The node or nodes who can successfully decrypt the message. - -| Layer | Contents | -|-----------|-----------------| -| PssMsg: | Address, Expiry | -| Envelope: | Topic | -| Payload: | e(data) | - -Routing of messages is done using swarm's own kademlia routing. Optionally routing can be turned off, forcing the message to be sent to all peers, similar to the behavior of the whisper protocol. - -Pss is intended for messages of limited size, typically a couple of Kbytes at most. The messages themselves can be anything at all; complex data structures or non-descript byte sequences. - -For the current state and roadmap of pss development please see https://github.com/ethersphere/swarm/wiki/swarm-dev-progress. - -Please report issues on https://github.com/ethersphere/go-ethereum - -Feel free to ask questions in https://gitter.im/ethersphere/pss - -## STATUS OF THIS DOCUMENT - -`pss` is under active development, and the first implementation is yet to be merged to the Ethereum main branch. Expect things to change. - -## CORE INTERFACES - -The pss core provides low level control of key handling and message exchange. - -### TOPICS - -An encrypted envelope of a pss message always contains a Topic. This is pss' way of determining which message handlers to dispatch messages to. The topic of a message is only visible for the node(s) who can decrypt the message. - -This "topic" is not like the subject of an email message, but a hash-like arbitrary 4 byte value. A valid topic can be generated using the `pss_*ToTopic` API methods. - -### IDENTITY AND ENCRYPTION - -Pss aims to achieve perfect darkness. That means that the minimum requirement for two nodes to communicate using pss is a shared secret. This secret can be an arbitrary byte slice, or a ECDSA keypair. The end recipient of a message is defined as the node that can successfully decrypt that message using stored keys. - -A node's public key is derived from the private key passed to the `pss` constructor. Pss (currently) has no PKI. - -Peer keys can manually be added to the pss node through its API calls `pss_setPeerPublicKey` and `pss_setSymmetricKey`. Keys are always coupled with a topic, and the keys will only be valid for these topics. - -### CONNECTIONS - -A "connection" in pss is a purely virtual construct. There is no mechanisms in place to ensure that the remote peer actually is there. In fact, "adding" a peer involves merely the node's opinion that the peer is there. It may issue messages to that remote peer to a directly connected peer, which in turn passes it on. But if it is not present on the network - or if there is no route to it - the message will never reach its destination through mere forwarding. - -Since pss itself never requires a confirmation from a peer of whether a message is received or not, one could argue that pss shows `UDP`-like behavior. - -It is also important to note that if the wrong (partial) address is set for a particular key/topic combination, the message may never reach that peer. The further left in the address byte slice the error lies, the less likely it is that delivery will occur. - - -### EXCHANGE - -Message exchange in `pss` *requires* end-to-end encryption. - -The API methods `pss_sendSym` and `pss_sendAsym` sends an arbitrary byte slice with a specific topic to a pss peer using the respective encryption scheme. The key passed to the send method must be associated with a topic in the pss key store prior to sending, or the send method will fail. - -Return values from the send methods do *not* indicate whether the message was successfully delivered to the pss peer. It *only* indicates whether or not the message could be passed on to the network. If the message could not be forwarded to any peers, the method will fail. - -Keep in mind that symmetric encryption is less resource-intensive than asymmetric encryption. The former should be used for nodes with high message volumes. - -## EXTENSIONS - -### HANDSHAKE - -Pss offers an optional Diffie-Hellman handshake mechanism. Handshake functionality is activated per topic, and can be deactivated per topic even while the node is running. - -Handshakes are activated in the code implementation of the node by running `SetHandshakeController()` on the pss node instance BEFORE starting the node service. The methods exposed by the HandshakeController's API gives the possibility to initiate, remove and check the state of handshakes and associated keys. - -See the `HandshakeAPI` section in `godoc` for details. - -### DEVP2P PROTOCOLS - -The `Protocol` convenience structure is provided to mimic devp2p-type protocols over pss. In theory this makes it possible to reuse protocol code written for devp2p with a minimum of effort. - -#### OUTGOING CONNECTIONS - -In order to message a peer using this layer, a `Protocol` object must first be instantiated. When this is done, peers can be added using the protocol's `AddPeer()` method. The peer's key/topic combination must be in the pss key store before the peer can be aded. - -Adding a peer in effect "runs" the protocol on that peer, and adds an internal mapping between a topic and that peer, and enables sending and receiving messages using the usual io-construct of devp2p. It does not actually *transmit* anything to the peer, it merely represents the node's opinion that a connection with the peer exists. (See CONNECTION above). - -#### INCOMING CONNECTIONS - -An incoming connection is nothing more than an actual PssMsg appearing with a certain Topic. If a Handler has been registered to that Topic, the message will be passed to it. This constitutes a "new" connection if: - -- The pss node never called AddPeer with this combination of remote peer address and topic, and - -- The pss node never received a PssMsg from this remote peer with this specific Topic before. - -If it is a "new" connection, the protocol will be "run" on the remote peer, as if the peer was added via the API. - -As with the `AddPeer()` method, the key/topic of the originating peer must exist in the pss key store. - -#### TOPICS IN DEVP2P - -The `ProtocolTopic()` method should be used to determine the correct topic to use for a pss `Protocol` instance. - -## EXAMPLES - -Coming. Please refer to the tests for now. - -## PSS INTERNALS - -Pss implements the node.Service interface. It depends on a working kademlia overlay for routing. - -### DECRYPTION - -When processing an incoming message, `pss` detects whether it is encrypted symmetrically or asymmetrically. - -When decrypting symmetrically, `pss` iterates through all stored keys, and attempts to decrypt with each key in order. - -pss keeps a *cache* of these keys. The cache will only store a certain amount of keys, and the iterator will return keys in the order of most recently used key first. Abandoned keys will be garbage collected. - -### ROUTING - -(please refer to swarm kademlia routing for an explanation of the routing algorithm used for pss) - -`pss` uses *address hinting* for routing. The address hint is an arbitrary-length MSB byte slice of the peer's swarm overlay address. It can be the whole address, part of the address, or even an empty byte slice. The slice will be matched to the MSB slice of the same length of all devp2p peers in the routing stage. - -If an empty byte slice is passed, all devp2p peers will match the address hint, and the message will be forwarded to everyone. This is equivalent to `whisper` routing, and makes it difficult to perform traffic analysis based on who messages are forwarded to. - -A node will also forward to everyone if the address hint provided is in its proximity bin, both to provide saturation to increase chances of delivery, and also for recipient obfuscation to thwart traffic analysis attacks. The recipient node(s) will always forward to all its peers. - -### CACHING - -pss implements a simple caching mechanism for messages, using the swarm FileStore for storage of the messages and generation of the digest keys used in the cache table. The caching is intended to alleviate the following: - -- save messages so that they can be delivered later if the recipient was not online at the time of sending. - -- drop an identical message to the same recipient if received within a given time interval - -- prevent backwards routing of messages - -the latter may occur if only one entry is in the receiving node's kademlia, or if the proximity of the current node recipient hinted by the address is so close that the message will be forwarded to everyone. In these cases the forwarder will be provided as the "nearest node" to the final recipient. The cache keeps the address of who the message was forwarded from, and if the cache lookup matches, the message will be dropped. - -### DEVP2P PROTOCOLS - -When implementing devp2p protocols, topics are derived from protocols' name and version. The Protocol provides a generic Handler that be passed to Pss.Register. This makes it possible to use the same message handler code for pss that is used for directly connected peers in devp2p. - -Under the hood, pss implements its own MsgReadWriter, which bridges MsgReadWriter.WriteMsg with Pss.SendRaw, and deftly adds an InjectMsg method which pipes incoming messages to appear on the MsgReadWriter.ReadMsg channel. - - diff --git a/swarm/pss/README.md b/swarm/pss/README.md deleted file mode 100644 index aea871251fe0..000000000000 --- a/swarm/pss/README.md +++ /dev/null @@ -1,318 +0,0 @@ -# Postal Services over Swarm - -`pss` enables message relay over swarm. This means nodes can send messages to each other without being directly connected with each other, while taking advantage of the efficient routing algorithms that swarm uses for transporting and storing data. - -### CONTENTS - -* Status of this document -* Core concepts -* Caveat -* Examples -* API - * Retrieve node information - * Receive messages - * Send messages using public key encryption - * Send messages using symmetric encryption - * Querying peer keys - * Handshakes - -### STATUS OF THIS DOCUMENT - -`pss` is under active development, and the first implementation is yet to be merged to the Ethereum main branch. Expect things to change. - -Details on swarm routing and encryption schemes out of scope of this document. - -Please refer to [ARCHITECTURE.md](ARCHITECTURE.md) for in-depth topics concerning `pss`. - -## CORE CONCEPTS - -Three things are required to send a `pss` message: - -1. Encryption key -2. Topic -3. Message payload - -Encryption key can be a public key or a 32 byte symmetric key. It must be coupled with a peer address in the node prior to sending. - -Topic is the initial 4 bytes of a hash value. - -Message payload is an arbitrary byte slice of data. - -Upon sending the message it is encrypted and passed on from peer to peer. Any node along the route that can successfully decrypt the message is regarded as a recipient. Recipients continue to pass on the message to their peers, to make traffic analysis attacks more difficult. - -The Address that is coupled with the encryption keys are used for routing the message. This does *not* need to be a full addresses; the network will route the message to the best of its ability with the information that is available. If *no* address is given (zero-length byte slice), routing is effectively deactivated, and the message is passed to all peers by all peers. - -## CAVEAT - -`pss` connectivity resembles UDP. This means there is no delivery guarantee for a message. Furthermore there is no strict definition of what a connection between two nodes communicating via `pss` is. Reception acknowledgements and keepalive-schemes is the responsibility of the application. - -Due to the inherent properties of the `swarm` routing algorithm, a node may receive the same message more than once. Message deduplication *cannot be guaranteed* by `pss`, and must be handled in the application layer to ensure predictable results. - -## EXAMPLES - -The code tutorial [p2p programming in go-ethereum](https://github.com/nolash/go-ethereum-p2p-demo) by [@nolash](https://github.com/nolash) provides step-by-step code examples for usage of `pss` API with `go-ethereum` nodes. - -A quite unpolished example using `javascript` is available here: [https://github.com/nolash/pss-js/tree/withcrypt](https://github.com/nolash/pss-js/tree/withcrypt) - -## API - -The `pss` API is available through IPC and Websockets. There is currently no `web3.js` implementation, as this does not support message subscription. - -For `golang` clients, please use the `rpc.Client` provided by the `go-ethereum` repository. The return values may have special types in `golang`. Please refer to `godoc` for details. - -### RETRIEVE NODE INFORMATION - -#### pss_getPublicKey - -Retrieves the public key of the node, in hex format - -``` -parameters: -none - -returns: -1. publickey (hex) -``` - -#### pss_baseAddr - -Retrieves the swarm overlay address of the node, in hex format - -``` -parameters: -none - -returns: -1. swarm overlay address (hex) -``` - -#### pss_stringToTopic - -Creates a deterministic 4 byte topic value from input, returned in hex format - -``` -parameters: -1. topic string (string) - -returns: -1. pss topic (hex) -``` - -### RECEIVE MESSAGES - -#### pss_subscribe - -Creates a subscription. Received messages with matching topic will be passed to subscription client. - -``` -parameters: -1. string("receive") -2. topic (4 bytes in hex) - -returns: -1. subscription handle `base64(byte)` `rpc.ClientSubscription` -``` - -In `golang` as special method is used: - -`rpc.Client.Subscribe(context.Context, "pss", chan pss.APIMsg, "receive", pss.Topic)` - -Incoming messages are encapsulated in an object (`pss.APIMsg` in `golang`) with the following members: - -``` -1. Msg (hex) - the message payload -2. Asymmetric (bool) - true if message used public key encryption -3. Key (string) - the encryption key used -``` - -### SEND MESSAGE USING PUBLIC KEY ENCRYPTION - -#### pss_setPeerPublicKey - -Register a peer's public key. This is done once for every topic that will be used with the peer. Address can be anything from 0 to 32 bytes inclusive of the peer's swarm overlay address. - -``` -parameters: -1. public key of peer (hex) -2. topic (4 bytes in hex) -3. address of peer (hex) - -returns: -none -``` - -#### pss_sendAsym - -Encrypts the message using the provided public key, and signs it using the node's private key. It then wraps it in an envelope containing the topic, and sends it to the network. - -``` -parameters: -1. public key of peer (hex) -2. topic (4 bytes in hex) -3. message (hex) - -returns: -none -``` - -### SEND MESSAGE USING SYMMETRIC ENCRYPTION - -#### pss_setSymmetricKey - -Register a symmetric key shared with a peer. This is done once for every topic that will be used with the peer. Address can be anything from 0 to 32 bytes inclusive of the peer's swarm overlay address. - -If the fourth parameter is false, the key will *not* be added to the list of symmetric keys used for decryption attempts. - -``` -parameters: -1. symmetric key (hex) -2. topic (4 bytes in hex) -3. address of peer (hex) -4. use for decryption (bool) - -returns: -1. symmetric key id (string) -``` - -#### pss_sendSym - -Encrypts the message using the provided symmetric key, wraps it in an envelope containing the topic, and sends it to the network. - -``` -parameters: -1. symmetric key id (string) -2. topic (4 bytes in hex) -3. message (hex) - -returns: -none -``` - -### QUERY PEER KEYS - -#### pss_GetSymmetricAddressHint - -Return the swarm overlay address associated with the peer registered with the given symmetric key and topic combination. - -``` -parameters: -1. topic (4 bytes in hex) -2. symmetric key id (string) - -returns: -1. peer address (hex) -``` - -#### pss_GetAsymmetricAddressHint - -Return the swarm overlay address associated with the peer registered with the given symmetric key and topic combination. - -``` -parameters: -1. topic (4 bytes in hex) -2. public key in hex form (string) - -returns: -1. peer address (hex) -``` - -### HANDSHAKES - -Convenience implementation of Diffie-Hellman handshakes using ephemeral symmetric keys. Peers keep separate sets of keys for incoming and outgoing communications. - -*This functionality is an optional feature in `pss`. It is compiled in by default, but can be omitted by providing the `nopsshandshake` build tag.* - -#### pss_addHandshake - -Activate handshake functionality on the specified topic. - -``` -parameters: -1. topic (4 bytes in hex) - -returns: -none -``` - -#### pss_removeHandshake - -Remove handshake functionality on the specified topic. - -``` -parameters: -1. topic (4 bytes in hex) - -returns: -none -``` - -#### pss_handshake - -Instantiate handshake with peer, refreshing symmetric encryption keys. - -If parameter 3 is false, the returned array will be empty. - -``` -parameters: -1. public key of peer in hex format (string) -2. topic (4 bytes in hex) -3. block calls until keys are received (bool) -4. flush existing incoming keys (bool) - -returns: -1. list of symmetric keys (string[]) -``` - -#### pss_getHandshakeKeys - -Get valid symmetric encryption keys for a specified peer and topic. - -parameters: -1. public key of peer in hex format (string) -2. topic (4 bytes in hex) -3. include keys for incoming messages (bool) -4. include keys for outgoing messages (bool) - -returns: -1. list of symmetric keys (string[]) - -#### pss_getHandshakeKeyCapacity - -Get amount of remaining messages the specified key is valid for. - -``` -parameters: -1. symmetric key id (string) - -returns: -1. number of messages (uint16) -``` - -#### pss_getHandshakePublicKey - -Get the peer's public key associated with the specified symmetric key. - -``` -parameters: -1. symmetric key id (string) - -returns: -1. Associated public key in hex format (string) -``` - -#### pss_releaseHandshakeKey - -Invalidate the specified key. - -Normally, the key will be kept for a grace period to allow for decryption of delayed messages. If instant removal is set, this grace period is omitted, and the key removed instantaneously. - -``` -parameters: -1. public key of peer in hex format (string) -2. topic (4 bytes in hex) -3. symmetric key id to release (string) -4. remove keys instantly (bool) - -returns: -1. whether key was successfully removed (bool) -``` diff --git a/swarm/pss/api.go b/swarm/pss/api.go deleted file mode 100644 index eba7bb722c0c..000000000000 --- a/swarm/pss/api.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package pss - -import ( - "context" - "errors" - "fmt" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/log" -) - -// Wrapper for receiving pss messages when using the pss API -// providing access to sender of message -type APIMsg struct { - Msg hexutil.Bytes - Asymmetric bool - Key string -} - -// Additional public methods accessible through API for pss -type API struct { - *Pss -} - -func NewAPI(ps *Pss) *API { - return &API{Pss: ps} -} - -// Creates a new subscription for the caller. Enables external handling of incoming messages. -// -// A new handler is registered in pss for the supplied topic -// -// All incoming messages to the node matching this topic will be encapsulated in the APIMsg -// struct and sent to the subscriber -func (pssapi *API) Receive(ctx context.Context, topic Topic) (*rpc.Subscription, error) { - notifier, supported := rpc.NotifierFromContext(ctx) - if !supported { - return nil, fmt.Errorf("Subscribe not supported") - } - - psssub := notifier.CreateSubscription() - - handler := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - apimsg := &APIMsg{ - Msg: hexutil.Bytes(msg), - Asymmetric: asymmetric, - Key: keyid, - } - if err := notifier.Notify(psssub.ID, apimsg); err != nil { - log.Warn(fmt.Sprintf("notification on pss sub topic rpc (sub %v) msg %v failed!", psssub.ID, msg)) - } - return nil - } - - deregf := pssapi.Register(&topic, handler) - go func() { - defer deregf() - select { - case err := <-psssub.Err(): - log.Warn(fmt.Sprintf("caught subscription error in pss sub topic %x: %v", topic, err)) - case <-notifier.Closed(): - log.Warn(fmt.Sprintf("rpc sub notifier closed")) - } - }() - - return psssub, nil -} - -func (pssapi *API) GetAddress(topic Topic, asymmetric bool, key string) (PssAddress, error) { - var addr *PssAddress - if asymmetric { - peer, ok := pssapi.Pss.pubKeyPool[key][topic] - if !ok { - return nil, fmt.Errorf("pubkey/topic pair %x/%x doesn't exist", key, topic) - } - addr = peer.address - } else { - peer, ok := pssapi.Pss.symKeyPool[key][topic] - if !ok { - return nil, fmt.Errorf("symkey/topic pair %x/%x doesn't exist", key, topic) - } - addr = peer.address - - } - return *addr, nil -} - -// Retrieves the node's base address in hex form -func (pssapi *API) BaseAddr() (PssAddress, error) { - return PssAddress(pssapi.Pss.BaseAddr()), nil -} - -// Retrieves the node's public key in hex form -func (pssapi *API) GetPublicKey() (keybytes hexutil.Bytes) { - key := pssapi.Pss.PublicKey() - keybytes = crypto.FromECDSAPub(key) - return keybytes -} - -// Set Public key to associate with a particular Pss peer -func (pssapi *API) SetPeerPublicKey(pubkey hexutil.Bytes, topic Topic, addr PssAddress) error { - pk, err := crypto.UnmarshalPubkey(pubkey) - if err != nil { - return fmt.Errorf("Cannot unmarshal pubkey: %x", pubkey) - } - err = pssapi.Pss.SetPeerPublicKey(pk, topic, &addr) - if err != nil { - return fmt.Errorf("Invalid key: %x", pk) - } - return nil -} - -func (pssapi *API) GetSymmetricKey(symkeyid string) (hexutil.Bytes, error) { - symkey, err := pssapi.Pss.GetSymmetricKey(symkeyid) - return hexutil.Bytes(symkey), err -} - -func (pssapi *API) GetSymmetricAddressHint(topic Topic, symkeyid string) (PssAddress, error) { - return *pssapi.Pss.symKeyPool[symkeyid][topic].address, nil -} - -func (pssapi *API) GetAsymmetricAddressHint(topic Topic, pubkeyid string) (PssAddress, error) { - return *pssapi.Pss.pubKeyPool[pubkeyid][topic].address, nil -} - -func (pssapi *API) StringToTopic(topicstring string) (Topic, error) { - topicbytes := BytesToTopic([]byte(topicstring)) - if topicbytes == rawTopic { - return rawTopic, errors.New("Topic string hashes to 0x00000000 and cannot be used") - } - return topicbytes, nil -} - -func (pssapi *API) SendAsym(pubkeyhex string, topic Topic, msg hexutil.Bytes) error { - return pssapi.Pss.SendAsym(pubkeyhex, topic, msg[:]) -} - -func (pssapi *API) SendSym(symkeyhex string, topic Topic, msg hexutil.Bytes) error { - return pssapi.Pss.SendSym(symkeyhex, topic, msg[:]) -} - -func (pssapi *API) GetPeerTopics(pubkeyhex string) ([]Topic, error) { - topics, _, err := pssapi.Pss.GetPublickeyPeers(pubkeyhex) - return topics, err - -} - -func (pssapi *API) GetPeerAddress(pubkeyhex string, topic Topic) (PssAddress, error) { - return pssapi.Pss.getPeerAddress(pubkeyhex, topic) -} diff --git a/swarm/pss/client/client.go b/swarm/pss/client/client.go deleted file mode 100644 index d541081d3ed2..000000000000 --- a/swarm/pss/client/client.go +++ /dev/null @@ -1,352 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build !noclient,!noprotocol - -package client - -import ( - "context" - "errors" - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/pss" -) - -const ( - handshakeRetryTimeout = 1000 - handshakeRetryCount = 3 -) - -// The pss client provides devp2p emulation over pss RPC API, -// giving access to pss methods from a different process -type Client struct { - BaseAddrHex string - - // peers - peerPool map[pss.Topic]map[string]*pssRPCRW - protos map[pss.Topic]*p2p.Protocol - - // rpc connections - rpc *rpc.Client - subs []*rpc.ClientSubscription - - // channels - topicsC chan []byte - quitC chan struct{} - - poolMu sync.Mutex -} - -// implements p2p.MsgReadWriter -type pssRPCRW struct { - *Client - topic string - msgC chan []byte - addr pss.PssAddress - pubKeyId string - lastSeen time.Time - closed bool -} - -func (c *Client) newpssRPCRW(pubkeyid string, addr pss.PssAddress, topicobj pss.Topic) (*pssRPCRW, error) { - topic := topicobj.String() - err := c.rpc.Call(nil, "pss_setPeerPublicKey", pubkeyid, topic, hexutil.Encode(addr[:])) - if err != nil { - return nil, fmt.Errorf("setpeer %s %s: %v", topic, pubkeyid, err) - } - return &pssRPCRW{ - Client: c, - topic: topic, - msgC: make(chan []byte), - addr: addr, - pubKeyId: pubkeyid, - }, nil -} - -func (rw *pssRPCRW) ReadMsg() (p2p.Msg, error) { - msg := <-rw.msgC - log.Trace("pssrpcrw read", "msg", msg) - pmsg, err := pss.ToP2pMsg(msg) - if err != nil { - return p2p.Msg{}, err - } - - return pmsg, nil -} - -// If only one message slot left -// then new is requested through handshake -// if buffer is empty, handshake request blocks until return -// after which pointer is changed to first new key in buffer -// will fail if: -// - any api calls fail -// - handshake retries are exhausted without reply, -// - send fails -func (rw *pssRPCRW) WriteMsg(msg p2p.Msg) error { - log.Trace("got writemsg pssclient", "msg", msg) - if rw.closed { - return fmt.Errorf("connection closed") - } - rlpdata := make([]byte, msg.Size) - msg.Payload.Read(rlpdata) - pmsg, err := rlp.EncodeToBytes(pss.ProtocolMsg{ - Code: msg.Code, - Size: msg.Size, - Payload: rlpdata, - }) - if err != nil { - return err - } - - // Get the keys we have - var symkeyids []string - err = rw.Client.rpc.Call(&symkeyids, "pss_getHandshakeKeys", rw.pubKeyId, rw.topic, false, true) - if err != nil { - return err - } - - // Check the capacity of the first key - var symkeycap uint16 - if len(symkeyids) > 0 { - err = rw.Client.rpc.Call(&symkeycap, "pss_getHandshakeKeyCapacity", symkeyids[0]) - if err != nil { - return err - } - } - - err = rw.Client.rpc.Call(nil, "pss_sendSym", symkeyids[0], rw.topic, hexutil.Encode(pmsg)) - if err != nil { - return err - } - - // If this is the last message it is valid for, initiate new handshake - if symkeycap == 1 { - var retries int - var sync bool - // if it's the only remaining key, make sure we don't continue until we have new ones for further writes - if len(symkeyids) == 1 { - sync = true - } - // initiate handshake - _, err := rw.handshake(retries, sync, false) - if err != nil { - log.Warn("failing", "err", err) - return err - } - } - return nil -} - -// retry and synchronicity wrapper for handshake api call -// returns first new symkeyid upon successful execution -func (rw *pssRPCRW) handshake(retries int, sync bool, flush bool) (string, error) { - - var symkeyids []string - var i int - // request new keys - // if the key buffer was depleted, make this as a blocking call and try several times before giving up - for i = 0; i < 1+retries; i++ { - log.Debug("handshake attempt pssrpcrw", "pubkeyid", rw.pubKeyId, "topic", rw.topic, "sync", sync) - err := rw.Client.rpc.Call(&symkeyids, "pss_handshake", rw.pubKeyId, rw.topic, sync, flush) - if err == nil { - var keyid string - if sync { - keyid = symkeyids[0] - } - return keyid, nil - } - if i-1+retries > 1 { - time.Sleep(time.Millisecond * handshakeRetryTimeout) - } - } - - return "", fmt.Errorf("handshake failed after %d attempts", i) -} - -// Custom constructor -// -// Provides direct access to the rpc object -func NewClient(rpcurl string) (*Client, error) { - rpcclient, err := rpc.Dial(rpcurl) - if err != nil { - return nil, err - } - - client, err := NewClientWithRPC(rpcclient) - if err != nil { - return nil, err - } - return client, nil -} - -// Main constructor -// -// The 'rpcclient' parameter allows passing a in-memory rpc client to act as the remote websocket RPC. -func NewClientWithRPC(rpcclient *rpc.Client) (*Client, error) { - client := newClient() - client.rpc = rpcclient - err := client.rpc.Call(&client.BaseAddrHex, "pss_baseAddr") - if err != nil { - return nil, fmt.Errorf("cannot get pss node baseaddress: %v", err) - } - return client, nil -} - -func newClient() (client *Client) { - client = &Client{ - quitC: make(chan struct{}), - peerPool: make(map[pss.Topic]map[string]*pssRPCRW), - protos: make(map[pss.Topic]*p2p.Protocol), - } - return -} - -// Mounts a new devp2p protcool on the pss connection -// -// the protocol is aliased as a "pss topic" -// uses normal devp2p send and incoming message handler routines from the p2p/protocols package -// -// when an incoming message is received from a peer that is not yet known to the client, -// this peer object is instantiated, and the protocol is run on it. -func (c *Client) RunProtocol(ctx context.Context, proto *p2p.Protocol) error { - topicobj := pss.BytesToTopic([]byte(fmt.Sprintf("%s:%d", proto.Name, proto.Version))) - topichex := topicobj.String() - msgC := make(chan pss.APIMsg) - c.peerPool[topicobj] = make(map[string]*pssRPCRW) - sub, err := c.rpc.Subscribe(ctx, "pss", msgC, "receive", topichex) - if err != nil { - return fmt.Errorf("pss event subscription failed: %v", err) - } - c.subs = append(c.subs, sub) - err = c.rpc.Call(nil, "pss_addHandshake", topichex) - if err != nil { - return fmt.Errorf("pss handshake activation failed: %v", err) - } - - // dispatch incoming messages - go func() { - for { - select { - case msg := <-msgC: - // we only allow sym msgs here - if msg.Asymmetric { - continue - } - // we get passed the symkeyid - // need the symkey itself to resolve to peer's pubkey - var pubkeyid string - err = c.rpc.Call(&pubkeyid, "pss_getHandshakePublicKey", msg.Key) - if err != nil || pubkeyid == "" { - log.Trace("proto err or no pubkey", "err", err, "symkeyid", msg.Key) - continue - } - // if we don't have the peer on this protocol already, create it - // this is more or less the same as AddPssPeer, less the handshake initiation - if c.peerPool[topicobj][pubkeyid] == nil { - var addrhex string - err := c.rpc.Call(&addrhex, "pss_getAddress", topichex, false, msg.Key) - if err != nil { - log.Trace(err.Error()) - continue - } - addrbytes, err := hexutil.Decode(addrhex) - if err != nil { - log.Trace(err.Error()) - break - } - addr := pss.PssAddress(addrbytes) - rw, err := c.newpssRPCRW(pubkeyid, addr, topicobj) - if err != nil { - break - } - c.peerPool[topicobj][pubkeyid] = rw - p := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%v", addr), []p2p.Cap{}) - go proto.Run(p, c.peerPool[topicobj][pubkeyid]) - } - go func() { - c.peerPool[topicobj][pubkeyid].msgC <- msg.Msg - }() - case <-c.quitC: - return - } - } - }() - - c.protos[topicobj] = proto - return nil -} - -// Always call this to ensure that we exit cleanly -func (c *Client) Close() error { - for _, s := range c.subs { - s.Unsubscribe() - } - return nil -} - -// Add a pss peer (public key) and run the protocol on it -// -// client.RunProtocol with matching topic must have been -// run prior to adding the peer, or this method will -// return an error. -// -// The key must exist in the key store of the pss node -// before the peer is added. The method will return an error -// if it is not. -func (c *Client) AddPssPeer(pubkeyid string, addr []byte, spec *protocols.Spec) error { - topic := pss.ProtocolTopic(spec) - if c.peerPool[topic] == nil { - return errors.New("addpeer on unset topic") - } - if c.peerPool[topic][pubkeyid] == nil { - rw, err := c.newpssRPCRW(pubkeyid, addr, topic) - if err != nil { - return err - } - _, err = rw.handshake(handshakeRetryCount, true, true) - if err != nil { - return err - } - c.poolMu.Lock() - c.peerPool[topic][pubkeyid] = rw - c.poolMu.Unlock() - p := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%v", addr), []p2p.Cap{}) - go c.protos[topic].Run(p, c.peerPool[topic][pubkeyid]) - } - return nil -} - -// Remove a pss peer -// -// TODO: underlying cleanup -func (c *Client) RemovePssPeer(pubkeyid string, spec *protocols.Spec) { - log.Debug("closing pss client peer", "pubkey", pubkeyid, "protoname", spec.Name, "protoversion", spec.Version) - c.poolMu.Lock() - defer c.poolMu.Unlock() - topic := pss.ProtocolTopic(spec) - c.peerPool[topic][pubkeyid].closed = true - delete(c.peerPool[topic], pubkeyid) -} diff --git a/swarm/pss/client/client_test.go b/swarm/pss/client/client_test.go deleted file mode 100644 index 48edc6ccef5c..000000000000 --- a/swarm/pss/client/client_test.go +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package client - -import ( - "bytes" - "context" - "flag" - "fmt" - "math/rand" - "os" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/pss" - "github.com/ethereum/go-ethereum/swarm/state" - whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" -) - -type protoCtrl struct { - C chan bool - protocol *pss.Protocol - run func(*p2p.Peer, p2p.MsgReadWriter) error -} - -var ( - debugdebugflag = flag.Bool("vv", false, "veryverbose") - debugflag = flag.Bool("v", false, "verbose") - w *whisper.Whisper - wapi *whisper.PublicWhisperAPI - // custom logging - psslogmain log.Logger - pssprotocols map[string]*protoCtrl - sendLimit = uint16(256) -) - -var services = newServices() - -func init() { - flag.Parse() - rand.Seed(time.Now().Unix()) - - adapters.RegisterServices(services) - - loglevel := log.LvlInfo - if *debugflag { - loglevel = log.LvlDebug - } else if *debugdebugflag { - loglevel = log.LvlTrace - } - - psslogmain = log.New("psslog", "*") - hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) - hf := log.LvlFilterHandler(loglevel, hs) - h := log.CallerFileHandler(hf) - log.Root().SetHandler(h) - - w = whisper.New(&whisper.DefaultConfig) - wapi = whisper.NewPublicWhisperAPI(w) - - pssprotocols = make(map[string]*protoCtrl) -} - -// ping pong exchange across one expired symkey -func TestClientHandshake(t *testing.T) { - sendLimit = 3 - - clients, err := setupNetwork(2) - if err != nil { - t.Fatal(err) - } - - lpsc, err := NewClientWithRPC(clients[0]) - if err != nil { - t.Fatal(err) - } - rpsc, err := NewClientWithRPC(clients[1]) - if err != nil { - t.Fatal(err) - } - lpssping := &pss.Ping{ - OutC: make(chan bool), - InC: make(chan bool), - Pong: false, - } - rpssping := &pss.Ping{ - OutC: make(chan bool), - InC: make(chan bool), - Pong: false, - } - lproto := pss.NewPingProtocol(lpssping) - rproto := pss.NewPingProtocol(rpssping) - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - err = lpsc.RunProtocol(ctx, lproto) - if err != nil { - t.Fatal(err) - } - err = rpsc.RunProtocol(ctx, rproto) - if err != nil { - t.Fatal(err) - } - topic := pss.PingTopic.String() - - var loaddr string - err = clients[0].Call(&loaddr, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - var roaddr string - err = clients[1].Call(&roaddr, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - - var lpubkey string - err = clients[0].Call(&lpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Second) - - roaddrbytes, err := hexutil.Decode(roaddr) - if err != nil { - t.Fatal(err) - } - err = lpsc.AddPssPeer(rpubkey, roaddrbytes, pss.PingProtocol) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Second) - - for i := uint16(0); i <= sendLimit; i++ { - lpssping.OutC <- false - got := <-rpssping.InC - log.Warn("ok", "idx", i, "got", got) - time.Sleep(time.Second) - } - - rw := lpsc.peerPool[pss.PingTopic][rpubkey] - lpsc.RemovePssPeer(rpubkey, pss.PingProtocol) - if err := rw.WriteMsg(p2p.Msg{ - Size: 3, - Payload: bytes.NewReader([]byte("foo")), - }); err == nil { - t.Fatalf("expected error on write") - } -} - -func setupNetwork(numnodes int) (clients []*rpc.Client, err error) { - nodes := make([]*simulations.Node, numnodes) - clients = make([]*rpc.Client, numnodes) - if numnodes < 2 { - return nil, fmt.Errorf("Minimum two nodes in network") - } - adapter := adapters.NewSimAdapter(services) - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: "bzz", - }) - for i := 0; i < numnodes; i++ { - nodeconf := adapters.RandomNodeConfig() - nodeconf.Services = []string{"bzz", "pss"} - nodes[i], err = net.NewNodeWithConfig(nodeconf) - if err != nil { - return nil, fmt.Errorf("error creating node 1: %v", err) - } - err = net.Start(nodes[i].ID()) - if err != nil { - return nil, fmt.Errorf("error starting node 1: %v", err) - } - if i > 0 { - err = net.Connect(nodes[i].ID(), nodes[i-1].ID()) - if err != nil { - return nil, fmt.Errorf("error connecting nodes: %v", err) - } - } - clients[i], err = nodes[i].Client() - if err != nil { - return nil, fmt.Errorf("create node 1 rpc client fail: %v", err) - } - } - if numnodes > 2 { - err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID()) - if err != nil { - return nil, fmt.Errorf("error connecting first and last nodes") - } - } - return clients, nil -} - -func newServices() adapters.Services { - stateStore := state.NewInmemoryStore() - kademlias := make(map[enode.ID]*network.Kademlia) - kademlia := func(id enode.ID) *network.Kademlia { - if k, ok := kademlias[id]; ok { - return k - } - params := network.NewKadParams() - params.MinProxBinSize = 2 - params.MaxBinSize = 3 - params.MinBinSize = 1 - params.MaxRetries = 1000 - params.RetryExponent = 2 - params.RetryInterval = 1000000 - kademlias[id] = network.NewKademlia(id[:], params) - return kademlias[id] - } - return adapters.Services{ - "pss": func(ctx *adapters.ServiceContext) (node.Service, error) { - ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctxlocal) - privkey, err := w.GetPrivateKey(keys) - psparams := pss.NewPssParams().WithPrivateKey(privkey) - pskad := kademlia(ctx.Config.ID) - ps, err := pss.NewPss(pskad, psparams) - if err != nil { - return nil, err - } - pshparams := pss.NewHandshakeParams() - pshparams.SymKeySendLimit = sendLimit - err = pss.SetHandshakeController(ps, pshparams) - if err != nil { - return nil, fmt.Errorf("handshake controller fail: %v", err) - } - return ps, nil - }, - "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil - }, - } -} - -// copied from swarm/network/protocol_test_go -type testStore struct { - sync.Mutex - - values map[string][]byte -} - -func newTestStore() *testStore { - return &testStore{values: make(map[string][]byte)} -} - -func (t *testStore) Load(key string) ([]byte, error) { - return nil, nil -} - -func (t *testStore) Save(key string, v []byte) error { - return nil -} diff --git a/swarm/pss/client/doc.go b/swarm/pss/client/doc.go deleted file mode 100644 index 080af45a9a22..000000000000 --- a/swarm/pss/client/doc.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// simple abstraction for implementing pss functionality -// -// the pss client library aims to simplify usage of the p2p.protocols package over pss -// -// IO is performed using the ordinary p2p.MsgReadWriter interface, which transparently communicates with a pss node via RPC using websockets as transport layer, using methods in the PssAPI class in the swarm/pss package -// -// -// Minimal-ish usage example (requires a running pss node with websocket RPC): -// -// -// import ( -// "context" -// "fmt" -// "os" -// pss "github.com/ethereum/go-ethereum/swarm/pss/client" -// "github.com/ethereum/go-ethereum/p2p/protocols" -// "github.com/ethereum/go-ethereum/p2p" -// "github.com/ethereum/go-ethereum/swarm/pot" -// "github.com/ethereum/go-ethereum/swarm/log" -// ) -// -// type FooMsg struct { -// Bar int -// } -// -// -// func fooHandler (msg interface{}) error { -// foomsg, ok := msg.(*FooMsg) -// if ok { -// log.Debug("Yay, just got a message", "msg", foomsg) -// } -// return errors.New(fmt.Sprintf("Unknown message")) -// } -// -// spec := &protocols.Spec{ -// Name: "foo", -// Version: 1, -// MaxMsgSize: 1024, -// Messages: []interface{}{ -// FooMsg{}, -// }, -// } -// -// proto := &p2p.Protocol{ -// Name: spec.Name, -// Version: spec.Version, -// Length: uint64(len(spec.Messages)), -// Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { -// pp := protocols.NewPeer(p, rw, spec) -// return pp.Run(fooHandler) -// }, -// } -// -// func implementation() { -// cfg := pss.NewClientConfig() -// psc := pss.NewClient(context.Background(), nil, cfg) -// err := psc.Start() -// if err != nil { -// log.Crit("can't start pss client") -// os.Exit(1) -// } -// -// log.Debug("connected to pss node", "bzz addr", psc.BaseAddr) -// -// err = psc.RunProtocol(proto) -// if err != nil { -// log.Crit("can't start protocol on pss websocket") -// os.Exit(1) -// } -// -// addr := pot.RandomAddress() // should be a real address, of course -// psc.AddPssPeer(addr, spec) -// -// // use the protocol for something -// -// psc.Stop() -// } -// -// BUG(test): TestIncoming test times out due to deadlock issues in the swarm hive -package client diff --git a/swarm/pss/doc.go b/swarm/pss/doc.go deleted file mode 100644 index 462c82aaad3d..000000000000 --- a/swarm/pss/doc.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Pss provides devp2p functionality for swarm nodes without the need for a direct tcp connection between them. -// -// Messages are encapsulated in a devp2p message structure `PssMsg`. These capsules are forwarded from node to node using ordinary tcp devp2p until it reaches its destination: The node or nodes who can successfully decrypt the message. -// -// Routing of messages is done using swarm's own kademlia routing. Optionally routing can be turned off, forcing the message to be sent to all peers, similar to the behavior of the whisper protocol. -// -// Pss is intended for messages of limited size, typically a couple of Kbytes at most. The messages themselves can be anything at all; complex data structures or non-descript byte sequences. -// -// Documentation can be found in the README file. -// -// For the current state and roadmap of pss development please see https://github.com/ethersphere/swarm/wiki/swarm-dev-progress. -// -// Please report issues on https://github.com/ethersphere/go-ethereum -// -// Feel free to ask questions in https://gitter.im/ethersphere/pss -// -// TOPICS -// -// An encrypted envelope of a pss messages always contains a Topic. This is pss' way of determining what action to take on the message. The topic is only visible for the node(s) who can decrypt the message. -// -// This "topic" is not like the subject of an email message, but a hash-like arbitrary 4 byte value. A valid topic can be generated using the `pss_*ToTopic` API methods. -// -// IDENTITY IN PSS -// -// Pss aims to achieve perfect darkness. That means that the minimum requirement for two nodes to communicate using pss is a shared secret. This secret can be an arbitrary byte slice, or a ECDSA keypair. -// -// Peer keys can manually be added to the pss node through its API calls `pss_setPeerPublicKey` and `pss_setSymmetricKey`. Keys are always coupled with a topic, and the keys will only be valid for these topics. -// -// CONNECTIONS -// -// A "connection" in pss is a purely virtual construct. There is no mechanisms in place to ensure that the remote peer actually is there. In fact, "adding" a peer involves merely the node's opinion that the peer is there. It may issue messages to that remote peer to a directly connected peer, which in turn passes it on. But if it is not present on the network - or if there is no route to it - the message will never reach its destination through mere forwarding. -// -// When implementing the devp2p protocol stack, the "adding" of a remote peer is a prerequisite for the side actually initiating the protocol communication. Adding a peer in effect "runs" the protocol on that peer, and adds an internal mapping between a topic and that peer. It also enables sending and receiving messages using the main io-construct in devp2p - the p2p.MsgReadWriter. -// -// Under the hood, pss implements its own MsgReadWriter, which bridges MsgReadWriter.WriteMsg with Pss.SendRaw, and deftly adds an InjectMsg method which pipes incoming messages to appear on the MsgReadWriter.ReadMsg channel. -// -// An incoming connection is nothing more than an actual PssMsg appearing with a certain Topic. If a Handler har been registered to that Topic, the message will be passed to it. This constitutes a "new" connection if: -// -// - The pss node never called AddPeer with this combination of remote peer address and topic, and -// -// - The pss node never received a PssMsg from this remote peer with this specific Topic before. -// -// If it is a "new" connection, the protocol will be "run" on the remote peer, in the same manner as if it was pre-emptively added. -// -package pss diff --git a/swarm/pss/handshake.go b/swarm/pss/handshake.go deleted file mode 100644 index e3ead77d0492..000000000000 --- a/swarm/pss/handshake.go +++ /dev/null @@ -1,568 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build !nopsshandshake - -package pss - -import ( - "context" - "errors" - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/log" -) - -const ( - IsActiveHandshake = true -) - -var ( - ctrlSingleton *HandshakeController -) - -const ( - defaultSymKeyRequestTimeout = 1000 * 8 // max wait ms to receive a response to a handshake symkey request - defaultSymKeyExpiryTimeout = 1000 * 10 // ms to wait before allowing garbage collection of an expired symkey - defaultSymKeySendLimit = 256 // amount of messages a symkey is valid for - defaultSymKeyCapacity = 4 // max number of symkeys to store/send simultaneously -) - -// symmetric key exchange message payload -type handshakeMsg struct { - From []byte - Limit uint16 - Keys [][]byte - Request uint8 - Topic Topic -} - -// internal representation of an individual symmetric key -type handshakeKey struct { - symKeyID *string - pubKeyID *string - limit uint16 - count uint16 - expiredAt time.Time -} - -// container for all in- and outgoing keys -// for one particular peer (public key) and topic -type handshake struct { - outKeys []handshakeKey - inKeys []handshakeKey -} - -// Initialization parameters for the HandshakeController -// -// SymKeyRequestExpiry: Timeout for waiting for a handshake reply -// (default 8000 ms) -// -// SymKeySendLimit: Amount of messages symmetric keys issues by -// this node is valid for (default 256) -// -// SymKeyCapacity: Ideal (and maximum) amount of symmetric keys -// held per direction per peer (default 4) -type HandshakeParams struct { - SymKeyRequestTimeout time.Duration - SymKeyExpiryTimeout time.Duration - SymKeySendLimit uint16 - SymKeyCapacity uint8 -} - -// Sane defaults for HandshakeController initialization -func NewHandshakeParams() *HandshakeParams { - return &HandshakeParams{ - SymKeyRequestTimeout: defaultSymKeyRequestTimeout * time.Millisecond, - SymKeyExpiryTimeout: defaultSymKeyExpiryTimeout * time.Millisecond, - SymKeySendLimit: defaultSymKeySendLimit, - SymKeyCapacity: defaultSymKeyCapacity, - } -} - -// Singleton object enabling semi-automatic Diffie-Hellman -// exchange of ephemeral symmetric keys -type HandshakeController struct { - pss *Pss - keyC map[string]chan []string // adds a channel to report when a handshake succeeds - lock sync.Mutex - symKeyRequestTimeout time.Duration - symKeyExpiryTimeout time.Duration - symKeySendLimit uint16 - symKeyCapacity uint8 - symKeyIndex map[string]*handshakeKey - handshakes map[string]map[Topic]*handshake - deregisterFuncs map[Topic]func() -} - -// Attach HandshakeController to pss node -// -// Must be called before starting the pss node service -func SetHandshakeController(pss *Pss, params *HandshakeParams) error { - ctrl := &HandshakeController{ - pss: pss, - keyC: make(map[string]chan []string), - symKeyRequestTimeout: params.SymKeyRequestTimeout, - symKeyExpiryTimeout: params.SymKeyExpiryTimeout, - symKeySendLimit: params.SymKeySendLimit, - symKeyCapacity: params.SymKeyCapacity, - symKeyIndex: make(map[string]*handshakeKey), - handshakes: make(map[string]map[Topic]*handshake), - deregisterFuncs: make(map[Topic]func()), - } - api := &HandshakeAPI{ - namespace: "pss", - ctrl: ctrl, - } - pss.addAPI(rpc.API{ - Namespace: api.namespace, - Version: "0.2", - Service: api, - Public: true, - }) - ctrlSingleton = ctrl - return nil -} - -// Return all unexpired symmetric keys from store by -// peer (public key), topic and specified direction -func (ctl *HandshakeController) validKeys(pubkeyid string, topic *Topic, in bool) (validkeys []*string) { - ctl.lock.Lock() - defer ctl.lock.Unlock() - now := time.Now() - if _, ok := ctl.handshakes[pubkeyid]; !ok { - return []*string{} - } else if _, ok := ctl.handshakes[pubkeyid][*topic]; !ok { - return []*string{} - } - var keystore *[]handshakeKey - if in { - keystore = &(ctl.handshakes[pubkeyid][*topic].inKeys) - } else { - keystore = &(ctl.handshakes[pubkeyid][*topic].outKeys) - } - - for _, key := range *keystore { - if key.limit <= key.count { - ctl.releaseKey(*key.symKeyID, topic) - } else if !key.expiredAt.IsZero() && key.expiredAt.Before(now) { - ctl.releaseKey(*key.symKeyID, topic) - } else { - validkeys = append(validkeys, key.symKeyID) - } - } - return -} - -// Add all given symmetric keys with validity limits to store by -// peer (public key), topic and specified direction -func (ctl *HandshakeController) updateKeys(pubkeyid string, topic *Topic, in bool, symkeyids []string, limit uint16) { - ctl.lock.Lock() - defer ctl.lock.Unlock() - if _, ok := ctl.handshakes[pubkeyid]; !ok { - ctl.handshakes[pubkeyid] = make(map[Topic]*handshake) - - } - if ctl.handshakes[pubkeyid][*topic] == nil { - ctl.handshakes[pubkeyid][*topic] = &handshake{} - } - var keystore *[]handshakeKey - expire := time.Now() - if in { - keystore = &(ctl.handshakes[pubkeyid][*topic].inKeys) - } else { - keystore = &(ctl.handshakes[pubkeyid][*topic].outKeys) - expire = expire.Add(time.Millisecond * ctl.symKeyExpiryTimeout) - } - for _, storekey := range *keystore { - storekey.expiredAt = expire - } - for i := 0; i < len(symkeyids); i++ { - storekey := handshakeKey{ - symKeyID: &symkeyids[i], - pubKeyID: &pubkeyid, - limit: limit, - } - *keystore = append(*keystore, storekey) - ctl.pss.symKeyPool[*storekey.symKeyID][*topic].protected = true - } - for i := 0; i < len(*keystore); i++ { - ctl.symKeyIndex[*(*keystore)[i].symKeyID] = &((*keystore)[i]) - } -} - -// Expire a symmetric key, making it elegible for garbage collection -func (ctl *HandshakeController) releaseKey(symkeyid string, topic *Topic) bool { - if ctl.symKeyIndex[symkeyid] == nil { - log.Debug("no symkey", "symkeyid", symkeyid) - return false - } - ctl.symKeyIndex[symkeyid].expiredAt = time.Now() - log.Debug("handshake release", "symkeyid", symkeyid) - return true -} - -// Checks all symmetric keys in given direction(s) by -// specified peer (public key) and topic for expiry. -// Expired means: -// - expiry timestamp is set, and grace period is exceeded -// - message validity limit is reached -func (ctl *HandshakeController) cleanHandshake(pubkeyid string, topic *Topic, in bool, out bool) int { - ctl.lock.Lock() - defer ctl.lock.Unlock() - var deletecount int - var deletes []string - now := time.Now() - handshake := ctl.handshakes[pubkeyid][*topic] - log.Debug("handshake clean", "pubkey", pubkeyid, "topic", topic) - if in { - for i, key := range handshake.inKeys { - if key.expiredAt.Before(now) || (key.expiredAt.IsZero() && key.limit <= key.count) { - log.Trace("handshake in clean remove", "symkeyid", *key.symKeyID) - deletes = append(deletes, *key.symKeyID) - handshake.inKeys[deletecount] = handshake.inKeys[i] - deletecount++ - } - } - handshake.inKeys = handshake.inKeys[:len(handshake.inKeys)-deletecount] - } - if out { - deletecount = 0 - for i, key := range handshake.outKeys { - if key.expiredAt.Before(now) && (key.expiredAt.IsZero() && key.limit <= key.count) { - log.Trace("handshake out clean remove", "symkeyid", *key.symKeyID) - deletes = append(deletes, *key.symKeyID) - handshake.outKeys[deletecount] = handshake.outKeys[i] - deletecount++ - } - } - handshake.outKeys = handshake.outKeys[:len(handshake.outKeys)-deletecount] - } - for _, keyid := range deletes { - delete(ctl.symKeyIndex, keyid) - ctl.pss.symKeyPool[keyid][*topic].protected = false - } - return len(deletes) -} - -// Runs cleanHandshake() on all peers and topics -func (ctl *HandshakeController) clean() { - peerpubkeys := ctl.handshakes - for pubkeyid, peertopics := range peerpubkeys { - for topic := range peertopics { - ctl.cleanHandshake(pubkeyid, &topic, true, true) - } - } -} - -// Passed as a PssMsg handler for the topic handshake is activated on -// Handles incoming key exchange messages and -// ccunts message usage by symmetric key (expiry limit control) -// Only returns error if key handler fails -func (ctl *HandshakeController) handler(msg []byte, p *p2p.Peer, asymmetric bool, symkeyid string) error { - if !asymmetric { - if ctl.symKeyIndex[symkeyid] != nil { - if ctl.symKeyIndex[symkeyid].count >= ctl.symKeyIndex[symkeyid].limit { - return fmt.Errorf("discarding message using expired key: %s", symkeyid) - } - ctl.symKeyIndex[symkeyid].count++ - log.Trace("increment symkey recv use", "symsymkeyid", symkeyid, "count", ctl.symKeyIndex[symkeyid].count, "limit", ctl.symKeyIndex[symkeyid].limit, "receiver", common.ToHex(crypto.FromECDSAPub(ctl.pss.PublicKey()))) - } - return nil - } - keymsg := &handshakeMsg{} - err := rlp.DecodeBytes(msg, keymsg) - if err == nil { - err := ctl.handleKeys(symkeyid, keymsg) - if err != nil { - log.Error("handlekeys fail", "error", err) - } - return err - } - return nil -} - -// Handle incoming key exchange message -// Add keys received from peer to store -// and enerate and send the amount of keys requested by peer -// -// TODO: -// - flood guard -// - keylength check -// - update address hint if: -// 1) leftmost bytes in new address do not match stored -// 2) else, if new address is longer -func (ctl *HandshakeController) handleKeys(pubkeyid string, keymsg *handshakeMsg) error { - // new keys from peer - if len(keymsg.Keys) > 0 { - log.Debug("received handshake keys", "pubkeyid", pubkeyid, "from", keymsg.From, "count", len(keymsg.Keys)) - var sendsymkeyids []string - for _, key := range keymsg.Keys { - sendsymkey := make([]byte, len(key)) - copy(sendsymkey, key) - var address PssAddress - copy(address[:], keymsg.From) - sendsymkeyid, err := ctl.pss.setSymmetricKey(sendsymkey, keymsg.Topic, &address, false, false) - if err != nil { - return err - } - sendsymkeyids = append(sendsymkeyids, sendsymkeyid) - } - if len(sendsymkeyids) > 0 { - ctl.updateKeys(pubkeyid, &keymsg.Topic, false, sendsymkeyids, keymsg.Limit) - - ctl.alertHandshake(pubkeyid, sendsymkeyids) - } - } - - // peer request for keys - if keymsg.Request > 0 { - _, err := ctl.sendKey(pubkeyid, &keymsg.Topic, keymsg.Request) - if err != nil { - return err - } - } - - return nil -} - -// Send key exchange to peer (public key) valid for `topic` -// Will send number of keys specified by `keycount` with -// validity limits specified in `msglimit` -// If number of valid outgoing keys is less than the ideal/max -// amount, a request is sent for the amount of keys to make up -// the difference -func (ctl *HandshakeController) sendKey(pubkeyid string, topic *Topic, keycount uint8) ([]string, error) { - - var requestcount uint8 - to := &PssAddress{} - if _, ok := ctl.pss.pubKeyPool[pubkeyid]; !ok { - return []string{}, errors.New("Invalid public key") - } else if psp, ok := ctl.pss.pubKeyPool[pubkeyid][*topic]; ok { - to = psp.address - } - - recvkeys := make([][]byte, keycount) - recvkeyids := make([]string, keycount) - ctl.lock.Lock() - if _, ok := ctl.handshakes[pubkeyid]; !ok { - ctl.handshakes[pubkeyid] = make(map[Topic]*handshake) - } - ctl.lock.Unlock() - - // check if buffer is not full - outkeys := ctl.validKeys(pubkeyid, topic, false) - if len(outkeys) < int(ctl.symKeyCapacity) { - //requestcount = uint8(self.symKeyCapacity - uint8(len(outkeys))) - requestcount = ctl.symKeyCapacity - } - // return if there's nothing to be accomplished - if requestcount == 0 && keycount == 0 { - return []string{}, nil - } - - // generate new keys to send - for i := 0; i < len(recvkeyids); i++ { - var err error - recvkeyids[i], err = ctl.pss.GenerateSymmetricKey(*topic, to, true) - if err != nil { - return []string{}, fmt.Errorf("set receive symkey fail (pubkey %x topic %x): %v", pubkeyid, topic, err) - } - recvkeys[i], err = ctl.pss.GetSymmetricKey(recvkeyids[i]) - if err != nil { - return []string{}, fmt.Errorf("GET Generated outgoing symkey fail (pubkey %x topic %x): %v", pubkeyid, topic, err) - } - } - ctl.updateKeys(pubkeyid, topic, true, recvkeyids, ctl.symKeySendLimit) - - // encode and send the message - recvkeymsg := &handshakeMsg{ - From: ctl.pss.BaseAddr(), - Keys: recvkeys, - Request: requestcount, - Limit: ctl.symKeySendLimit, - Topic: *topic, - } - log.Debug("sending our symkeys", "pubkey", pubkeyid, "symkeys", recvkeyids, "limit", ctl.symKeySendLimit, "requestcount", requestcount, "keycount", len(recvkeys)) - recvkeybytes, err := rlp.EncodeToBytes(recvkeymsg) - if err != nil { - return []string{}, fmt.Errorf("rlp keymsg encode fail: %v", err) - } - // if the send fails it means this public key is not registered for this particular address AND topic - err = ctl.pss.SendAsym(pubkeyid, *topic, recvkeybytes) - if err != nil { - return []string{}, fmt.Errorf("Send symkey failed: %v", err) - } - return recvkeyids, nil -} - -// Enables callback for keys received from a key exchange request -func (ctl *HandshakeController) alertHandshake(pubkeyid string, symkeys []string) chan []string { - if len(symkeys) > 0 { - if _, ok := ctl.keyC[pubkeyid]; ok { - ctl.keyC[pubkeyid] <- symkeys - close(ctl.keyC[pubkeyid]) - delete(ctl.keyC, pubkeyid) - } - return nil - } - if _, ok := ctl.keyC[pubkeyid]; !ok { - ctl.keyC[pubkeyid] = make(chan []string) - } - return ctl.keyC[pubkeyid] -} - -type HandshakeAPI struct { - namespace string - ctrl *HandshakeController -} - -// Initiate a handshake session for a peer (public key) and topic -// combination. -// -// If `sync` is set, the call will block until keys are received from peer, -// or if the handshake request times out -// -// If `flush` is set, the max amount of keys will be sent to the peer -// regardless of how many valid keys that currently exist in the store. -// -// Returns list of symmetric key ids that can be passed to pss.GetSymmetricKey() -// for retrieval of the symmetric key bytes themselves. -// -// Fails if the incoming symmetric key store is already full (and `flush` is false), -// or if the underlying key dispatcher fails -func (api *HandshakeAPI) Handshake(pubkeyid string, topic Topic, sync bool, flush bool) (keys []string, err error) { - var hsc chan []string - var keycount uint8 - if flush { - keycount = api.ctrl.symKeyCapacity - } else { - validkeys := api.ctrl.validKeys(pubkeyid, &topic, false) - keycount = api.ctrl.symKeyCapacity - uint8(len(validkeys)) - } - if keycount == 0 { - return keys, errors.New("Incoming symmetric key store is already full") - } - if sync { - hsc = api.ctrl.alertHandshake(pubkeyid, []string{}) - } - _, err = api.ctrl.sendKey(pubkeyid, &topic, keycount) - if err != nil { - return keys, err - } - if sync { - ctx, cancel := context.WithTimeout(context.Background(), api.ctrl.symKeyRequestTimeout) - defer cancel() - select { - case keys = <-hsc: - log.Trace("sync handshake response receive", "key", keys) - case <-ctx.Done(): - return []string{}, errors.New("timeout") - } - } - return keys, nil -} - -// Activate handshake functionality on a topic -func (api *HandshakeAPI) AddHandshake(topic Topic) error { - api.ctrl.deregisterFuncs[topic] = api.ctrl.pss.Register(&topic, api.ctrl.handler) - return nil -} - -// Deactivate handshake functionality on a topic -func (api *HandshakeAPI) RemoveHandshake(topic *Topic) error { - if _, ok := api.ctrl.deregisterFuncs[*topic]; ok { - api.ctrl.deregisterFuncs[*topic]() - } - return nil -} - -// Returns all valid symmetric keys in store per peer (public key) -// and topic. -// -// The `in` and `out` parameters indicate for which direction(s) -// symmetric keys will be returned. -// If both are false, no keys (and no error) will be returned. -func (api *HandshakeAPI) GetHandshakeKeys(pubkeyid string, topic Topic, in bool, out bool) (keys []string, err error) { - if in { - for _, inkey := range api.ctrl.validKeys(pubkeyid, &topic, true) { - keys = append(keys, *inkey) - } - } - if out { - for _, outkey := range api.ctrl.validKeys(pubkeyid, &topic, false) { - keys = append(keys, *outkey) - } - } - return keys, nil -} - -// Returns the amount of messages the specified symmetric key -// is still valid for under the handshake scheme -func (api *HandshakeAPI) GetHandshakeKeyCapacity(symkeyid string) (uint16, error) { - storekey := api.ctrl.symKeyIndex[symkeyid] - if storekey == nil { - return 0, fmt.Errorf("invalid symkey id %s", symkeyid) - } - return storekey.limit - storekey.count, nil -} - -// Returns the byte representation of the public key in ascii hex -// associated with the given symmetric key -func (api *HandshakeAPI) GetHandshakePublicKey(symkeyid string) (string, error) { - storekey := api.ctrl.symKeyIndex[symkeyid] - if storekey == nil { - return "", fmt.Errorf("invalid symkey id %s", symkeyid) - } - return *storekey.pubKeyID, nil -} - -// Manually expire the given symkey -// -// If `flush` is set, garbage collection will be performed before returning. -// -// Returns true on successful removal, false otherwise -func (api *HandshakeAPI) ReleaseHandshakeKey(pubkeyid string, topic Topic, symkeyid string, flush bool) (removed bool, err error) { - removed = api.ctrl.releaseKey(symkeyid, &topic) - if removed && flush { - api.ctrl.cleanHandshake(pubkeyid, &topic, true, true) - } - return -} - -// Send symmetric message under the handshake scheme -// -// Overloads the pss.SendSym() API call, adding symmetric key usage count -// for message expiry control -func (api *HandshakeAPI) SendSym(symkeyid string, topic Topic, msg hexutil.Bytes) (err error) { - err = api.ctrl.pss.SendSym(symkeyid, topic, msg[:]) - if api.ctrl.symKeyIndex[symkeyid] != nil { - if api.ctrl.symKeyIndex[symkeyid].count >= api.ctrl.symKeyIndex[symkeyid].limit { - return errors.New("attempted send with expired key") - } - api.ctrl.symKeyIndex[symkeyid].count++ - log.Trace("increment symkey send use", "symkeyid", symkeyid, "count", api.ctrl.symKeyIndex[symkeyid].count, "limit", api.ctrl.symKeyIndex[symkeyid].limit, "receiver", common.ToHex(crypto.FromECDSAPub(api.ctrl.pss.PublicKey()))) - } - return -} diff --git a/swarm/pss/handshake_none.go b/swarm/pss/handshake_none.go deleted file mode 100644 index a09674be3971..000000000000 --- a/swarm/pss/handshake_none.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build nopsshandshake - -package pss - -const ( - IsActiveHandshake = false -) - -func NewHandshakeParams() interface{} { - return nil -} diff --git a/swarm/pss/handshake_test.go b/swarm/pss/handshake_test.go deleted file mode 100644 index 0fc7e798ffc8..000000000000 --- a/swarm/pss/handshake_test.go +++ /dev/null @@ -1,266 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build foo - -package pss - -import ( - "strconv" - "strings" - "testing" - "time" - - "github.com/ethereum/go-ethereum/swarm/log" -) - -// asymmetrical key exchange between two directly connected peers -// full address, partial address (8 bytes) and empty address -func TestHandshake(t *testing.T) { - t.Run("32", testHandshake) - t.Run("8", testHandshake) - t.Run("0", testHandshake) -} - -func testHandshake(t *testing.T) { - - // how much of the address we will use - useHandshake = true - var addrsize int64 - var err error - addrsizestring := strings.Split(t.Name(), "/") - addrsize, _ = strconv.ParseInt(addrsizestring[1], 10, 0) - - // set up two nodes directly connected - // (we are not testing pss routing here) - clients, err := setupNetwork(2) - if err != nil { - t.Fatal(err) - } - - var topic string - err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - - var loaddr string - err = clients[0].Call(&loaddr, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - // "0x" = 2 bytes + addrsize address bytes which in hex is 2x length - loaddr = loaddr[:2+(addrsize*2)] - var roaddr string - err = clients[1].Call(&roaddr, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddr = roaddr[:2+(addrsize*2)] - log.Debug("addresses", "left", loaddr, "right", roaddr) - - // retrieve public key from pss instance - // set this public key reciprocally - var lpubkey string - err = clients[0].Call(&lpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 1000) // replace with hive healthy code - - // give each node its peer's public key - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr) - if err != nil { - t.Fatal(err) - } - - // perform the handshake - // after this each side will have defaultSymKeyBufferCapacity symkeys each for in- and outgoing messages: - // L -> request 4 keys -> R - // L <- send 4 keys, request 4 keys <- R - // L -> send 4 keys -> R - // the call will fill the array with symkeys L needs for sending to R - err = clients[0].Call(nil, "pss_addHandshake", topic) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_addHandshake", topic) - if err != nil { - t.Fatal(err) - } - - var lhsendsymkeyids []string - err = clients[0].Call(&lhsendsymkeyids, "pss_handshake", rpubkey, topic, true, true) - if err != nil { - t.Fatal(err) - } - - // make sure the r-node gets its keys - time.Sleep(time.Second) - - // check if we have 6 outgoing keys stored, and they match what was received from R - var lsendsymkeyids []string - err = clients[0].Call(&lsendsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, false, true) - if err != nil { - t.Fatal(err) - } - m := 0 - for _, hid := range lhsendsymkeyids { - for _, lid := range lsendsymkeyids { - if lid == hid { - m++ - } - } - } - if m != defaultSymKeyCapacity { - t.Fatalf("buffer size mismatch, expected %d, have %d: %v", defaultSymKeyCapacity, m, lsendsymkeyids) - } - - // check if in- and outgoing keys on l-node and r-node match up and are in opposite categories (l recv = r send, l send = r recv) - var rsendsymkeyids []string - err = clients[1].Call(&rsendsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, false, true) - if err != nil { - t.Fatal(err) - } - var lrecvsymkeyids []string - err = clients[0].Call(&lrecvsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, true, false) - if err != nil { - t.Fatal(err) - } - var rrecvsymkeyids []string - err = clients[1].Call(&rrecvsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, true, false) - if err != nil { - t.Fatal(err) - } - - // get outgoing symkeys in byte form from both sides - var lsendsymkeys []string - for _, id := range lsendsymkeyids { - var key string - err = clients[0].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - lsendsymkeys = append(lsendsymkeys, key) - } - var rsendsymkeys []string - for _, id := range rsendsymkeyids { - var key string - err = clients[1].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - rsendsymkeys = append(rsendsymkeys, key) - } - - // get incoming symkeys in byte form from both sides and compare - var lrecvsymkeys []string - for _, id := range lrecvsymkeyids { - var key string - err = clients[0].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - match := false - for _, otherkey := range rsendsymkeys { - if otherkey == key { - match = true - } - } - if !match { - t.Fatalf("no match right send for left recv key %s", id) - } - lrecvsymkeys = append(lrecvsymkeys, key) - } - var rrecvsymkeys []string - for _, id := range rrecvsymkeyids { - var key string - err = clients[1].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - match := false - for _, otherkey := range lsendsymkeys { - if otherkey == key { - match = true - } - } - if !match { - t.Fatalf("no match left send for right recv key %s", id) - } - rrecvsymkeys = append(rrecvsymkeys, key) - } - - // send new handshake request, should send no keys - err = clients[0].Call(nil, "pss_handshake", rpubkey, topic, false) - if err == nil { - t.Fatal("expected full symkey buffer error") - } - - // expire one key, send new handshake request - err = clients[0].Call(nil, "pss_releaseHandshakeKey", rpubkey, topic, lsendsymkeyids[0], true) - if err != nil { - t.Fatalf("release left send key %s fail: %v", lsendsymkeyids[0], err) - } - - var newlhsendkeyids []string - - // send new handshake request, should now receive one key - // check that it is not in previous right recv key array - err = clients[0].Call(&newlhsendkeyids, "pss_handshake", rpubkey, topic, true, false) - if err != nil { - t.Fatalf("handshake send fail: %v", err) - } else if len(newlhsendkeyids) != defaultSymKeyCapacity { - t.Fatalf("wrong receive count, expected 1, got %d", len(newlhsendkeyids)) - } - - var newlrecvsymkey string - err = clients[0].Call(&newlrecvsymkey, "pss_getSymmetricKey", newlhsendkeyids[0]) - if err != nil { - t.Fatal(err) - } - var rmatchsymkeyid *string - for i, id := range rrecvsymkeyids { - var key string - err = clients[1].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - if newlrecvsymkey == key { - rmatchsymkeyid = &rrecvsymkeyids[i] - } - } - if rmatchsymkeyid != nil { - t.Fatalf("right sent old key id %s in second handshake", *rmatchsymkeyid) - } - - // clean the pss core keystore. Should clean the key released earlier - var cleancount int - clients[0].Call(&cleancount, "psstest_clean") - if cleancount > 1 { - t.Fatalf("pss clean count mismatch; expected 1, got %d", cleancount) - } -} diff --git a/swarm/pss/notify/notify.go b/swarm/pss/notify/notify.go deleted file mode 100644 index 723092c32d2b..000000000000 --- a/swarm/pss/notify/notify.go +++ /dev/null @@ -1,394 +0,0 @@ -package notify - -import ( - "crypto/ecdsa" - "fmt" - "sync" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/pss" -) - -const ( - // sent from requester to updater to request start of notifications - MsgCodeStart = iota - - // sent from updater to requester, contains a notification plus a new symkey to replace the old - MsgCodeNotifyWithKey - - // sent from updater to requester, contains a notification - MsgCodeNotify - - // sent from requester to updater to request stop of notifications (currently unused) - MsgCodeStop - MsgCodeMax -) - -const ( - DefaultAddressLength = 1 - symKeyLength = 32 // this should be gotten from source -) - -var ( - // control topic is used before symmetric key issuance completes - controlTopic = pss.Topic{0x00, 0x00, 0x00, 0x01} -) - -// when code is MsgCodeStart, Payload is address -// when code is MsgCodeNotifyWithKey, Payload is notification | symkey -// when code is MsgCodeNotify, Payload is notification -// when code is MsgCodeStop, Payload is address -type Msg struct { - Code byte - Name []byte - Payload []byte - namestring string -} - -// NewMsg creates a new notification message object -func NewMsg(code byte, name string, payload []byte) *Msg { - return &Msg{ - Code: code, - Name: []byte(name), - Payload: payload, - namestring: name, - } -} - -// NewMsgFromPayload decodes a serialized message payload into a new notification message object -func NewMsgFromPayload(payload []byte) (*Msg, error) { - msg := &Msg{} - err := rlp.DecodeBytes(payload, msg) - if err != nil { - return nil, err - } - msg.namestring = string(msg.Name) - return msg, nil -} - -// a notifier has one sendBin entry for each address space it sends messages to -type sendBin struct { - address pss.PssAddress - symKeyId string - count int -} - -// represents a single notification service -// only subscription address bins that match the address of a notification client have entries. -type notifier struct { - bins map[string]*sendBin - topic pss.Topic // identifies the resource for pss receiver - threshold int // amount of address bytes used in bins - updateC <-chan []byte - quitC chan struct{} -} - -func (n *notifier) removeSubscription() { - n.quitC <- struct{}{} -} - -// represents an individual subscription made by a public key at a specific address/neighborhood -type subscription struct { - pubkeyId string - address pss.PssAddress - handler func(string, []byte) error -} - -// Controller is the interface to control, add and remove notification services and subscriptions -type Controller struct { - pss *pss.Pss - notifiers map[string]*notifier - subscriptions map[string]*subscription - mu sync.Mutex -} - -// NewController creates a new Controller object -func NewController(ps *pss.Pss) *Controller { - ctrl := &Controller{ - pss: ps, - notifiers: make(map[string]*notifier), - subscriptions: make(map[string]*subscription), - } - ctrl.pss.Register(&controlTopic, ctrl.Handler) - return ctrl -} - -// IsActive is used to check if a notification service exists for a specified id string -// Returns true if exists, false if not -func (c *Controller) IsActive(name string) bool { - c.mu.Lock() - defer c.mu.Unlock() - return c.isActive(name) -} - -func (c *Controller) isActive(name string) bool { - _, ok := c.notifiers[name] - return ok -} - -// Subscribe is used by a client to request notifications from a notification service provider -// It will create a MsgCodeStart message and send asymmetrically to the provider using its public key and routing address -// The handler function is a callback that will be called when notifications are received -// Fails if the request pss cannot be sent or if the update message could not be serialized -func (c *Controller) Subscribe(name string, pubkey *ecdsa.PublicKey, address pss.PssAddress, handler func(string, []byte) error) error { - c.mu.Lock() - defer c.mu.Unlock() - msg := NewMsg(MsgCodeStart, name, c.pss.BaseAddr()) - c.pss.SetPeerPublicKey(pubkey, controlTopic, &address) - pubkeyId := hexutil.Encode(crypto.FromECDSAPub(pubkey)) - smsg, err := rlp.EncodeToBytes(msg) - if err != nil { - return err - } - err = c.pss.SendAsym(pubkeyId, controlTopic, smsg) - if err != nil { - return err - } - c.subscriptions[name] = &subscription{ - pubkeyId: pubkeyId, - address: address, - handler: handler, - } - return nil -} - -// Unsubscribe, perhaps unsurprisingly, undoes the effects of Subscribe -// Fails if the subscription does not exist, if the request pss cannot be sent or if the update message could not be serialized -func (c *Controller) Unsubscribe(name string) error { - c.mu.Lock() - defer c.mu.Unlock() - sub, ok := c.subscriptions[name] - if !ok { - return fmt.Errorf("Unknown subscription '%s'", name) - } - msg := NewMsg(MsgCodeStop, name, sub.address) - smsg, err := rlp.EncodeToBytes(msg) - if err != nil { - return err - } - err = c.pss.SendAsym(sub.pubkeyId, controlTopic, smsg) - if err != nil { - return err - } - delete(c.subscriptions, name) - return nil -} - -// NewNotifier is used by a notification service provider to create a new notification service -// It takes a name as identifier for the resource, a threshold indicating the granularity of the subscription address bin -// It then starts an event loop which listens to the supplied update channel and executes notifications on channel receives -// Fails if a notifier already is registered on the name -//func (c *Controller) NewNotifier(name string, threshold int, contentFunc func(string) ([]byte, error)) error { -func (c *Controller) NewNotifier(name string, threshold int, updateC <-chan []byte) (func(), error) { - c.mu.Lock() - if c.isActive(name) { - c.mu.Unlock() - return nil, fmt.Errorf("Notification service %s already exists in controller", name) - } - quitC := make(chan struct{}) - c.notifiers[name] = ¬ifier{ - bins: make(map[string]*sendBin), - topic: pss.BytesToTopic([]byte(name)), - threshold: threshold, - updateC: updateC, - quitC: quitC, - //contentFunc: contentFunc, - } - c.mu.Unlock() - go func() { - for { - select { - case <-quitC: - return - case data := <-updateC: - c.notify(name, data) - } - } - }() - - return c.notifiers[name].removeSubscription, nil -} - -// RemoveNotifier is used to stop a notification service. -// It cancels the event loop listening to the notification provider's update channel -func (c *Controller) RemoveNotifier(name string) error { - c.mu.Lock() - defer c.mu.Unlock() - currentNotifier, ok := c.notifiers[name] - if !ok { - return fmt.Errorf("Unknown notification service %s", name) - } - currentNotifier.removeSubscription() - delete(c.notifiers, name) - return nil -} - -// Notify is called by a notification service provider to issue a new notification -// It takes the name of the notification service and the data to be sent. -// It fails if a notifier with this name does not exist or if data could not be serialized -// Note that it does NOT fail on failure to send a message -func (c *Controller) notify(name string, data []byte) error { - c.mu.Lock() - defer c.mu.Unlock() - if !c.isActive(name) { - return fmt.Errorf("Notification service %s doesn't exist", name) - } - msg := NewMsg(MsgCodeNotify, name, data) - smsg, err := rlp.EncodeToBytes(msg) - if err != nil { - return err - } - for _, m := range c.notifiers[name].bins { - log.Debug("sending pss notify", "name", name, "addr", fmt.Sprintf("%x", m.address), "topic", fmt.Sprintf("%x", c.notifiers[name].topic), "data", data) - go func(m *sendBin) { - err = c.pss.SendSym(m.symKeyId, c.notifiers[name].topic, smsg) - if err != nil { - log.Warn("Failed to send notify to addr %x: %v", m.address, err) - } - }(m) - } - return nil -} - -// check if we already have the bin -// if we do, retrieve the symkey from it and increment the count -// if we dont make a new symkey and a new bin entry -func (c *Controller) addToBin(ntfr *notifier, address []byte) (symKeyId string, pssAddress pss.PssAddress, err error) { - - // parse the address from the message and truncate if longer than our bins threshold - if len(address) > ntfr.threshold { - address = address[:ntfr.threshold] - } - - pssAddress = pss.PssAddress(address) - hexAddress := fmt.Sprintf("%x", address) - currentBin, ok := ntfr.bins[hexAddress] - if ok { - currentBin.count++ - symKeyId = currentBin.symKeyId - } else { - symKeyId, err = c.pss.GenerateSymmetricKey(ntfr.topic, &pssAddress, false) - if err != nil { - return "", nil, err - } - ntfr.bins[hexAddress] = &sendBin{ - address: address, - symKeyId: symKeyId, - count: 1, - } - } - return symKeyId, pssAddress, nil -} - -func (c *Controller) handleStartMsg(msg *Msg, keyid string) (err error) { - - keyidbytes, err := hexutil.Decode(keyid) - if err != nil { - return err - } - pubkey, err := crypto.UnmarshalPubkey(keyidbytes) - if err != nil { - return err - } - - // if name is not registered for notifications we will not react - currentNotifier, ok := c.notifiers[msg.namestring] - if !ok { - return fmt.Errorf("Subscribe attempted on unknown resource '%s'", msg.namestring) - } - - // add to or open new bin - symKeyId, pssAddress, err := c.addToBin(currentNotifier, msg.Payload) - if err != nil { - return err - } - - // add to address book for send initial notify - symkey, err := c.pss.GetSymmetricKey(symKeyId) - if err != nil { - return err - } - err = c.pss.SetPeerPublicKey(pubkey, controlTopic, &pssAddress) - if err != nil { - return err - } - - // TODO this is set to zero-length byte pending decision on protocol for initial message, whether it should include message or not, and how to trigger the initial message so that current state of MRU is sent upon subscription - notify := []byte{} - replyMsg := NewMsg(MsgCodeNotifyWithKey, msg.namestring, make([]byte, len(notify)+symKeyLength)) - copy(replyMsg.Payload, notify) - copy(replyMsg.Payload[len(notify):], symkey) - sReplyMsg, err := rlp.EncodeToBytes(replyMsg) - if err != nil { - return err - } - return c.pss.SendAsym(keyid, controlTopic, sReplyMsg) -} - -func (c *Controller) handleNotifyWithKeyMsg(msg *Msg) error { - symkey := msg.Payload[len(msg.Payload)-symKeyLength:] - topic := pss.BytesToTopic(msg.Name) - - // \TODO keep track of and add actual address - updaterAddr := pss.PssAddress([]byte{}) - c.pss.SetSymmetricKey(symkey, topic, &updaterAddr, true) - c.pss.Register(&topic, c.Handler) - return c.subscriptions[msg.namestring].handler(msg.namestring, msg.Payload[:len(msg.Payload)-symKeyLength]) -} - -func (c *Controller) handleStopMsg(msg *Msg) error { - // if name is not registered for notifications we will not react - currentNotifier, ok := c.notifiers[msg.namestring] - if !ok { - return fmt.Errorf("Unsubscribe attempted on unknown resource '%s'", msg.namestring) - } - - // parse the address from the message and truncate if longer than our bins' address length threshold - address := msg.Payload - if len(msg.Payload) > currentNotifier.threshold { - address = address[:currentNotifier.threshold] - } - - // remove the entry from the bin if it exists, and remove the bin if it's the last remaining one - hexAddress := fmt.Sprintf("%x", address) - currentBin, ok := currentNotifier.bins[hexAddress] - if !ok { - return fmt.Errorf("found no active bin for address %s", hexAddress) - } - currentBin.count-- - if currentBin.count == 0 { // if no more clients in this bin, remove it - delete(currentNotifier.bins, hexAddress) - } - return nil -} - -// Handler is the pss topic handler to be used to process notification service messages -// It should be registered in the pss of both to any notification service provides and clients using the service -func (c *Controller) Handler(smsg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - c.mu.Lock() - defer c.mu.Unlock() - log.Debug("notify controller handler", "keyid", keyid) - - // see if the message is valid - msg, err := NewMsgFromPayload(smsg) - if err != nil { - return err - } - - switch msg.Code { - case MsgCodeStart: - return c.handleStartMsg(msg, keyid) - case MsgCodeNotifyWithKey: - return c.handleNotifyWithKeyMsg(msg) - case MsgCodeNotify: - return c.subscriptions[msg.namestring].handler(msg.namestring, msg.Payload) - case MsgCodeStop: - return c.handleStopMsg(msg) - } - - return fmt.Errorf("Invalid message code: %d", msg.Code) -} diff --git a/swarm/pss/notify/notify_test.go b/swarm/pss/notify/notify_test.go deleted file mode 100644 index 675b41ada254..000000000000 --- a/swarm/pss/notify/notify_test.go +++ /dev/null @@ -1,251 +0,0 @@ -package notify - -import ( - "bytes" - "context" - "flag" - "fmt" - "os" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/pss" - "github.com/ethereum/go-ethereum/swarm/state" - whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" -) - -var ( - loglevel = flag.Int("l", 3, "loglevel") - psses map[string]*pss.Pss - w *whisper.Whisper - wapi *whisper.PublicWhisperAPI -) - -func init() { - flag.Parse() - hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) - hf := log.LvlFilterHandler(log.Lvl(*loglevel), hs) - h := log.CallerFileHandler(hf) - log.Root().SetHandler(h) - - w = whisper.New(&whisper.DefaultConfig) - wapi = whisper.NewPublicWhisperAPI(w) - psses = make(map[string]*pss.Pss) -} - -// Creates a client node and notifier node -// Client sends pss notifications requests -// notifier sends initial notification with symmetric key, and -// second notification symmetrically encrypted -func TestStart(t *testing.T) { - adapter := adapters.NewSimAdapter(newServices(false)) - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: "bzz", - }) - leftNodeConf := adapters.RandomNodeConfig() - leftNodeConf.Services = []string{"bzz", "pss"} - leftNode, err := net.NewNodeWithConfig(leftNodeConf) - if err != nil { - t.Fatal(err) - } - err = net.Start(leftNode.ID()) - if err != nil { - t.Fatal(err) - } - - rightNodeConf := adapters.RandomNodeConfig() - rightNodeConf.Services = []string{"bzz", "pss"} - rightNode, err := net.NewNodeWithConfig(rightNodeConf) - if err != nil { - t.Fatal(err) - } - err = net.Start(rightNode.ID()) - if err != nil { - t.Fatal(err) - } - - err = net.Connect(rightNode.ID(), leftNode.ID()) - if err != nil { - t.Fatal(err) - } - - leftRpc, err := leftNode.Client() - if err != nil { - t.Fatal(err) - } - - rightRpc, err := rightNode.Client() - if err != nil { - t.Fatal(err) - } - - var leftAddr string - err = leftRpc.Call(&leftAddr, "pss_baseAddr") - if err != nil { - t.Fatal(err) - } - - var rightAddr string - err = rightRpc.Call(&rightAddr, "pss_baseAddr") - if err != nil { - t.Fatal(err) - } - - var leftPub string - err = leftRpc.Call(&leftPub, "pss_getPublicKey") - if err != nil { - t.Fatal(err) - } - - var rightPub string - err = rightRpc.Call(&rightPub, "pss_getPublicKey") - if err != nil { - t.Fatal(err) - } - - rsrcName := "foo.eth" - rsrcTopic := pss.BytesToTopic([]byte(rsrcName)) - - // wait for kademlia table to populate - time.Sleep(time.Second) - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) - defer cancel() - rmsgC := make(chan *pss.APIMsg) - rightSub, err := rightRpc.Subscribe(ctx, "pss", rmsgC, "receive", controlTopic) - if err != nil { - t.Fatal(err) - } - defer rightSub.Unsubscribe() - - updateC := make(chan []byte) - updateMsg := []byte{} - ctrlClient := NewController(psses[rightPub]) - ctrlNotifier := NewController(psses[leftPub]) - ctrlNotifier.NewNotifier("foo.eth", 2, updateC) - - pubkeybytes, err := hexutil.Decode(leftPub) - if err != nil { - t.Fatal(err) - } - pubkey, err := crypto.UnmarshalPubkey(pubkeybytes) - if err != nil { - t.Fatal(err) - } - addrbytes, err := hexutil.Decode(leftAddr) - if err != nil { - t.Fatal(err) - } - ctrlClient.Subscribe(rsrcName, pubkey, addrbytes, func(s string, b []byte) error { - if s != "foo.eth" || !bytes.Equal(updateMsg, b) { - t.Fatalf("unexpected result in client handler: '%s':'%x'", s, b) - } - log.Info("client handler receive", "s", s, "b", b) - return nil - }) - - var inMsg *pss.APIMsg - select { - case inMsg = <-rmsgC: - case <-ctx.Done(): - t.Fatal(ctx.Err()) - } - - dMsg, err := NewMsgFromPayload(inMsg.Msg) - if err != nil { - t.Fatal(err) - } - if dMsg.namestring != rsrcName { - t.Fatalf("expected name '%s', got '%s'", rsrcName, dMsg.namestring) - } - if !bytes.Equal(dMsg.Payload[:len(updateMsg)], updateMsg) { - t.Fatalf("expected payload first %d bytes '%x', got '%x'", len(updateMsg), updateMsg, dMsg.Payload[:len(updateMsg)]) - } - if len(updateMsg)+symKeyLength != len(dMsg.Payload) { - t.Fatalf("expected payload length %d, have %d", len(updateMsg)+symKeyLength, len(dMsg.Payload)) - } - - rightSubUpdate, err := rightRpc.Subscribe(ctx, "pss", rmsgC, "receive", rsrcTopic) - if err != nil { - t.Fatal(err) - } - defer rightSubUpdate.Unsubscribe() - - updateMsg = []byte("plugh") - updateC <- updateMsg - select { - case inMsg = <-rmsgC: - case <-ctx.Done(): - log.Error("timed out waiting for msg", "topic", fmt.Sprintf("%x", rsrcTopic)) - t.Fatal(ctx.Err()) - } - dMsg, err = NewMsgFromPayload(inMsg.Msg) - if err != nil { - t.Fatal(err) - } - if dMsg.namestring != rsrcName { - t.Fatalf("expected name %s, got %s", rsrcName, dMsg.namestring) - } - if !bytes.Equal(dMsg.Payload, updateMsg) { - t.Fatalf("expected payload '%x', got '%x'", updateMsg, dMsg.Payload) - } - -} - -func newServices(allowRaw bool) adapters.Services { - stateStore := state.NewInmemoryStore() - kademlias := make(map[enode.ID]*network.Kademlia) - kademlia := func(id enode.ID) *network.Kademlia { - if k, ok := kademlias[id]; ok { - return k - } - params := network.NewKadParams() - params.MinProxBinSize = 2 - params.MaxBinSize = 3 - params.MinBinSize = 1 - params.MaxRetries = 1000 - params.RetryExponent = 2 - params.RetryInterval = 1000000 - kademlias[id] = network.NewKademlia(id[:], params) - return kademlias[id] - } - return adapters.Services{ - "pss": func(ctx *adapters.ServiceContext) (node.Service, error) { - ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctxlocal) - privkey, err := w.GetPrivateKey(keys) - pssp := pss.NewPssParams().WithPrivateKey(privkey) - pssp.MsgTTL = time.Second * 30 - pssp.AllowRaw = allowRaw - pskad := kademlia(ctx.Config.ID) - ps, err := pss.NewPss(pskad, pssp) - if err != nil { - return nil, err - } - //psses[common.ToHex(crypto.FromECDSAPub(&privkey.PublicKey))] = ps - psses[hexutil.Encode(crypto.FromECDSAPub(&privkey.PublicKey))] = ps - return ps, nil - }, - "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil - }, - } -} diff --git a/swarm/pss/ping.go b/swarm/pss/ping.go deleted file mode 100644 index ff635f40a444..000000000000 --- a/swarm/pss/ping.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build !nopssprotocol,!nopssping - -package pss - -import ( - "context" - "errors" - "time" - - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/swarm/log" -) - -// Generic ping protocol implementation for -// pss devp2p protocol emulation -type PingMsg struct { - Created time.Time - Pong bool // set if message is pong reply -} - -type Ping struct { - Pong bool // toggle pong reply upon ping receive - OutC chan bool // trigger ping - InC chan bool // optional, report back to calling code -} - -func (p *Ping) pingHandler(ctx context.Context, msg interface{}) error { - var pingmsg *PingMsg - var ok bool - if pingmsg, ok = msg.(*PingMsg); !ok { - return errors.New("invalid msg") - } - log.Debug("ping handler", "msg", pingmsg, "outc", p.OutC) - if p.InC != nil { - p.InC <- pingmsg.Pong - } - if p.Pong && !pingmsg.Pong { - p.OutC <- true - } - return nil -} - -var PingProtocol = &protocols.Spec{ - Name: "psstest", - Version: 1, - MaxMsgSize: 1024, - Messages: []interface{}{ - PingMsg{}, - }, -} - -var PingTopic = ProtocolTopic(PingProtocol) - -func NewPingProtocol(ping *Ping) *p2p.Protocol { - return &p2p.Protocol{ - Name: PingProtocol.Name, - Version: PingProtocol.Version, - Length: uint64(PingProtocol.MaxMsgSize), - Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - quitC := make(chan struct{}) - pp := protocols.NewPeer(p, rw, PingProtocol) - log.Trace("running pss vprotocol", "peer", p, "outc", ping.OutC) - go func() { - for { - select { - case ispong := <-ping.OutC: - pp.Send(context.TODO(), &PingMsg{ - Created: time.Now(), - Pong: ispong, - }) - case <-quitC: - } - } - }() - err := pp.Run(ping.pingHandler) - quitC <- struct{}{} - return err - }, - } -} diff --git a/swarm/pss/protocol.go b/swarm/pss/protocol.go deleted file mode 100644 index 5fcae090efb9..000000000000 --- a/swarm/pss/protocol.go +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build !nopssprotocol - -package pss - -import ( - "bytes" - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/swarm/log" -) - -const ( - IsActiveProtocol = true -) - -// Convenience wrapper for devp2p protocol messages for transport over pss -type ProtocolMsg struct { - Code uint64 - Size uint32 - Payload []byte - ReceivedAt time.Time -} - -// Creates a ProtocolMsg -func NewProtocolMsg(code uint64, msg interface{}) ([]byte, error) { - - rlpdata, err := rlp.EncodeToBytes(msg) - if err != nil { - return nil, err - } - - // TODO verify that nested structs cannot be used in rlp - smsg := &ProtocolMsg{ - Code: code, - Size: uint32(len(rlpdata)), - Payload: rlpdata, - } - - return rlp.EncodeToBytes(smsg) -} - -// Protocol options to be passed to a new Protocol instance -// -// The parameters specify which encryption schemes to allow -type ProtocolParams struct { - Asymmetric bool - Symmetric bool -} - -// PssReadWriter bridges pss send/receive with devp2p protocol send/receive -// -// Implements p2p.MsgReadWriter -type PssReadWriter struct { - *Pss - LastActive time.Time - rw chan p2p.Msg - spec *protocols.Spec - topic *Topic - sendFunc func(string, Topic, []byte) error - key string - closed bool -} - -// Implements p2p.MsgReader -func (prw *PssReadWriter) ReadMsg() (p2p.Msg, error) { - msg := <-prw.rw - log.Trace(fmt.Sprintf("pssrw readmsg: %v", msg)) - return msg, nil -} - -// Implements p2p.MsgWriter -func (prw *PssReadWriter) WriteMsg(msg p2p.Msg) error { - log.Trace("pssrw writemsg", "msg", msg) - if prw.closed { - return fmt.Errorf("connection closed") - } - rlpdata := make([]byte, msg.Size) - msg.Payload.Read(rlpdata) - pmsg, err := rlp.EncodeToBytes(ProtocolMsg{ - Code: msg.Code, - Size: msg.Size, - Payload: rlpdata, - }) - if err != nil { - return err - } - return prw.sendFunc(prw.key, *prw.topic, pmsg) -} - -// Injects a p2p.Msg into the MsgReadWriter, so that it appears on the associated p2p.MsgReader -func (prw *PssReadWriter) injectMsg(msg p2p.Msg) error { - log.Trace(fmt.Sprintf("pssrw injectmsg: %v", msg)) - prw.rw <- msg - return nil -} - -// Convenience object for emulation devp2p over pss -type Protocol struct { - *Pss - proto *p2p.Protocol - topic *Topic - spec *protocols.Spec - pubKeyRWPool map[string]p2p.MsgReadWriter - symKeyRWPool map[string]p2p.MsgReadWriter - Asymmetric bool - Symmetric bool - RWPoolMu sync.Mutex -} - -// Activates devp2p emulation over a specific pss topic -// -// One or both encryption schemes must be specified. If -// only one is specified, the protocol will not be valid -// for the other, and will make the message handler -// return errors -func RegisterProtocol(ps *Pss, topic *Topic, spec *protocols.Spec, targetprotocol *p2p.Protocol, options *ProtocolParams) (*Protocol, error) { - if !options.Asymmetric && !options.Symmetric { - return nil, fmt.Errorf("specify at least one of asymmetric or symmetric messaging mode") - } - pp := &Protocol{ - Pss: ps, - proto: targetprotocol, - topic: topic, - spec: spec, - pubKeyRWPool: make(map[string]p2p.MsgReadWriter), - symKeyRWPool: make(map[string]p2p.MsgReadWriter), - Asymmetric: options.Asymmetric, - Symmetric: options.Symmetric, - } - return pp, nil -} - -// Generic handler for incoming messages over devp2p emulation -// -// To be passed to pss.Register() -// -// Will run the protocol on a new incoming peer, provided that -// the encryption key of the message has a match in the internal -// pss keypool -// -// Fails if protocol is not valid for the message encryption scheme, -// if adding a new peer fails, or if the message is not a serialized -// p2p.Msg (which it always will be if it is sent from this object). -func (p *Protocol) Handle(msg []byte, peer *p2p.Peer, asymmetric bool, keyid string) error { - var vrw *PssReadWriter - if p.Asymmetric != asymmetric && p.Symmetric == !asymmetric { - return fmt.Errorf("invalid protocol encryption") - } else if (!p.isActiveSymKey(keyid, *p.topic) && !asymmetric) || - (!p.isActiveAsymKey(keyid, *p.topic) && asymmetric) { - - rw, err := p.AddPeer(peer, *p.topic, asymmetric, keyid) - if err != nil { - return err - } else if rw == nil { - return fmt.Errorf("handle called on nil MsgReadWriter for new key " + keyid) - } - vrw = rw.(*PssReadWriter) - } - - pmsg, err := ToP2pMsg(msg) - if err != nil { - return fmt.Errorf("could not decode pssmsg") - } - if asymmetric { - if p.pubKeyRWPool[keyid] == nil { - return fmt.Errorf("handle called on nil MsgReadWriter for key " + keyid) - } - vrw = p.pubKeyRWPool[keyid].(*PssReadWriter) - } else { - if p.symKeyRWPool[keyid] == nil { - return fmt.Errorf("handle called on nil MsgReadWriter for key " + keyid) - } - vrw = p.symKeyRWPool[keyid].(*PssReadWriter) - } - vrw.injectMsg(pmsg) - return nil -} - -// check if (peer) symmetric key is currently registered with this topic -func (p *Protocol) isActiveSymKey(key string, topic Topic) bool { - return p.symKeyRWPool[key] != nil -} - -// check if (peer) asymmetric key is currently registered with this topic -func (p *Protocol) isActiveAsymKey(key string, topic Topic) bool { - return p.pubKeyRWPool[key] != nil -} - -// Creates a serialized (non-buffered) version of a p2p.Msg, used in the specialized internal p2p.MsgReadwriter implementations -func ToP2pMsg(msg []byte) (p2p.Msg, error) { - payload := &ProtocolMsg{} - if err := rlp.DecodeBytes(msg, payload); err != nil { - return p2p.Msg{}, fmt.Errorf("pss protocol handler unable to decode payload as p2p message: %v", err) - } - - return p2p.Msg{ - Code: payload.Code, - Size: uint32(len(payload.Payload)), - ReceivedAt: time.Now(), - Payload: bytes.NewBuffer(payload.Payload), - }, nil -} - -// Runs an emulated pss Protocol on the specified peer, -// linked to a specific topic -// `key` and `asymmetric` specifies what encryption key -// to link the peer to. -// The key must exist in the pss store prior to adding the peer. -func (p *Protocol) AddPeer(peer *p2p.Peer, topic Topic, asymmetric bool, key string) (p2p.MsgReadWriter, error) { - rw := &PssReadWriter{ - Pss: p.Pss, - rw: make(chan p2p.Msg), - spec: p.spec, - topic: p.topic, - key: key, - } - if asymmetric { - rw.sendFunc = p.Pss.SendAsym - } else { - rw.sendFunc = p.Pss.SendSym - } - if asymmetric { - p.Pss.pubKeyPoolMu.Lock() - if _, ok := p.Pss.pubKeyPool[key]; !ok { - return nil, fmt.Errorf("asym key does not exist: %s", key) - } - p.Pss.pubKeyPoolMu.Unlock() - p.RWPoolMu.Lock() - p.pubKeyRWPool[key] = rw - p.RWPoolMu.Unlock() - } else { - p.Pss.symKeyPoolMu.Lock() - if _, ok := p.Pss.symKeyPool[key]; !ok { - return nil, fmt.Errorf("symkey does not exist: %s", key) - } - p.Pss.symKeyPoolMu.Unlock() - p.RWPoolMu.Lock() - p.symKeyRWPool[key] = rw - p.RWPoolMu.Unlock() - } - go func() { - err := p.proto.Run(peer, rw) - log.Warn(fmt.Sprintf("pss vprotocol quit on %v topic %v: %v", peer, topic, err)) - }() - return rw, nil -} - -func (p *Protocol) RemovePeer(asymmetric bool, key string) { - log.Debug("closing pss peer", "asym", asymmetric, "key", key) - p.RWPoolMu.Lock() - defer p.RWPoolMu.Unlock() - if asymmetric { - rw := p.pubKeyRWPool[key].(*PssReadWriter) - rw.closed = true - delete(p.pubKeyRWPool, key) - } else { - rw := p.symKeyRWPool[key].(*PssReadWriter) - rw.closed = true - delete(p.symKeyRWPool, key) - } -} - -// Uniform translation of protocol specifiers to topic -func ProtocolTopic(spec *protocols.Spec) Topic { - return BytesToTopic([]byte(fmt.Sprintf("%s:%d", spec.Name, spec.Version))) -} diff --git a/swarm/pss/protocol_none.go b/swarm/pss/protocol_none.go deleted file mode 100644 index c92be3f902e7..000000000000 --- a/swarm/pss/protocol_none.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build nopssprotocol - -package pss - -const ( - IsActiveProtocol = false -) diff --git a/swarm/pss/protocol_test.go b/swarm/pss/protocol_test.go deleted file mode 100644 index f4209fea59ca..000000000000 --- a/swarm/pss/protocol_test.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package pss - -import ( - "bytes" - "context" - "fmt" - "strconv" - "strings" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/log" -) - -type protoCtrl struct { - C chan bool - protocol *Protocol - run func(*p2p.Peer, p2p.MsgReadWriter) error -} - -// simple ping pong protocol test for the pss devp2p emulation -func TestProtocol(t *testing.T) { - t.Run("32", testProtocol) - t.Run("8", testProtocol) - t.Run("0", testProtocol) -} - -func testProtocol(t *testing.T) { - - // address hint size - var addrsize int64 - paramstring := strings.Split(t.Name(), "/") - addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) - log.Info("protocol test", "addrsize", addrsize) - - topic := PingTopic.String() - - clients, err := setupNetwork(2, false) - if err != nil { - t.Fatal(err) - } - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - lnodeinfo := &p2p.NodeInfo{} - err = clients[0].Call(&lnodeinfo, "admin_nodeInfo") - if err != nil { - t.Fatalf("rpc nodeinfo node 11 fail: %v", err) - } - - var lpubkey string - err = clients[0].Call(&lpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 1000) // replace with hive healthy code - - lmsgC := make(chan APIMsg) - lctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic) - defer lsub.Unsubscribe() - rmsgC := make(chan APIMsg) - rctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic) - defer rsub.Unsubscribe() - - // set reciprocal public keys - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddrhex) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddrhex) - if err != nil { - t.Fatal(err) - } - - // add right peer's public key as protocol peer on left - p := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%x", common.FromHex(loaddrhex)), []p2p.Cap{}) - _, err = pssprotocols[lnodeinfo.ID].protocol.AddPeer(p, PingTopic, true, rpubkey) - if err != nil { - t.Fatal(err) - } - - // sends ping asym, checks delivery - pssprotocols[lnodeinfo.ID].C <- false - select { - case <-lmsgC: - log.Debug("lnode ok") - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - select { - case <-rmsgC: - log.Debug("rnode ok") - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - - // sends ping asym, checks delivery - pssprotocols[lnodeinfo.ID].C <- false - select { - case <-lmsgC: - log.Debug("lnode ok") - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - select { - case <-rmsgC: - log.Debug("rnode ok") - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - rw := pssprotocols[lnodeinfo.ID].protocol.pubKeyRWPool[rpubkey] - pssprotocols[lnodeinfo.ID].protocol.RemovePeer(true, rpubkey) - if err := rw.WriteMsg(p2p.Msg{ - Size: 3, - Payload: bytes.NewReader([]byte("foo")), - }); err == nil { - t.Fatalf("expected error on write") - } -} diff --git a/swarm/pss/pss.go b/swarm/pss/pss.go deleted file mode 100644 index e1e24e1f543a..000000000000 --- a/swarm/pss/pss.go +++ /dev/null @@ -1,945 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package pss - -import ( - "bytes" - "context" - "crypto/ecdsa" - "crypto/rand" - "errors" - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/pot" - "github.com/ethereum/go-ethereum/swarm/storage" - whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" -) - -const ( - defaultPaddingByteSize = 16 - DefaultMsgTTL = time.Second * 120 - defaultDigestCacheTTL = time.Second * 10 - defaultSymKeyCacheCapacity = 512 - digestLength = 32 // byte length of digest used for pss cache (currently same as swarm chunk hash) - defaultWhisperWorkTime = 3 - defaultWhisperPoW = 0.0000000001 - defaultMaxMsgSize = 1024 * 1024 - defaultCleanInterval = time.Second * 60 * 10 - defaultOutboxCapacity = 100000 - pssProtocolName = "pss" - pssVersion = 2 - hasherCount = 8 -) - -var ( - addressLength = len(pot.Address{}) -) - -// cache is used for preventing backwards routing -// will also be instrumental in flood guard mechanism -// and mailbox implementation -type pssCacheEntry struct { - expiresAt time.Time -} - -// abstraction to enable access to p2p.protocols.Peer.Send -type senderPeer interface { - Info() *p2p.PeerInfo - ID() enode.ID - Address() []byte - Send(context.Context, interface{}) error -} - -// per-key peer related information -// member `protected` prevents garbage collection of the instance -type pssPeer struct { - lastSeen time.Time - address *PssAddress - protected bool -} - -// Pss configuration parameters -type PssParams struct { - MsgTTL time.Duration - CacheTTL time.Duration - privateKey *ecdsa.PrivateKey - SymKeyCacheCapacity int - AllowRaw bool // If true, enables sending and receiving messages without builtin pss encryption -} - -// Sane defaults for Pss -func NewPssParams() *PssParams { - return &PssParams{ - MsgTTL: DefaultMsgTTL, - CacheTTL: defaultDigestCacheTTL, - SymKeyCacheCapacity: defaultSymKeyCacheCapacity, - } -} - -func (params *PssParams) WithPrivateKey(privatekey *ecdsa.PrivateKey) *PssParams { - params.privateKey = privatekey - return params -} - -// Toplevel pss object, takes care of message sending, receiving, decryption and encryption, message handler dispatchers and message forwarding. -// -// Implements node.Service -type Pss struct { - *network.Kademlia // we can get the Kademlia address from this - privateKey *ecdsa.PrivateKey // pss can have it's own independent key - w *whisper.Whisper // key and encryption backend - auxAPIs []rpc.API // builtins (handshake, test) can add APIs - - // sending and forwarding - fwdPool map[string]*protocols.Peer // keep track of all peers sitting on the pssmsg routing layer - fwdPoolMu sync.RWMutex - fwdCache map[pssDigest]pssCacheEntry // checksum of unique fields from pssmsg mapped to expiry, cache to determine whether to drop msg - fwdCacheMu sync.RWMutex - cacheTTL time.Duration // how long to keep messages in fwdCache (not implemented) - msgTTL time.Duration - paddingByteSize int - capstring string - outbox chan *PssMsg - - // keys and peers - pubKeyPool map[string]map[Topic]*pssPeer // mapping of hex public keys to peer address by topic. - pubKeyPoolMu sync.RWMutex - symKeyPool map[string]map[Topic]*pssPeer // mapping of symkeyids to peer address by topic. - symKeyPoolMu sync.RWMutex - symKeyDecryptCache []*string // fast lookup of symkeys recently used for decryption; last used is on top of stack - symKeyDecryptCacheCursor int // modular cursor pointing to last used, wraps on symKeyDecryptCache array - symKeyDecryptCacheCapacity int // max amount of symkeys to keep. - - // message handling - handlers map[Topic]map[*Handler]bool // topic and version based pss payload handlers. See pss.Handle() - handlersMu sync.RWMutex - allowRaw bool - hashPool sync.Pool - - // process - quitC chan struct{} -} - -func (p *Pss) String() string { - return fmt.Sprintf("pss: addr %x, pubkey %v", p.BaseAddr(), common.ToHex(crypto.FromECDSAPub(&p.privateKey.PublicKey))) -} - -// Creates a new Pss instance. -// -// In addition to params, it takes a swarm network Kademlia -// and a FileStore storage for message cache storage. -func NewPss(k *network.Kademlia, params *PssParams) (*Pss, error) { - if params.privateKey == nil { - return nil, errors.New("missing private key for pss") - } - cap := p2p.Cap{ - Name: pssProtocolName, - Version: pssVersion, - } - ps := &Pss{ - Kademlia: k, - privateKey: params.privateKey, - w: whisper.New(&whisper.DefaultConfig), - quitC: make(chan struct{}), - - fwdPool: make(map[string]*protocols.Peer), - fwdCache: make(map[pssDigest]pssCacheEntry), - cacheTTL: params.CacheTTL, - msgTTL: params.MsgTTL, - paddingByteSize: defaultPaddingByteSize, - capstring: cap.String(), - outbox: make(chan *PssMsg, defaultOutboxCapacity), - - pubKeyPool: make(map[string]map[Topic]*pssPeer), - symKeyPool: make(map[string]map[Topic]*pssPeer), - symKeyDecryptCache: make([]*string, params.SymKeyCacheCapacity), - symKeyDecryptCacheCapacity: params.SymKeyCacheCapacity, - - handlers: make(map[Topic]map[*Handler]bool), - allowRaw: params.AllowRaw, - hashPool: sync.Pool{ - New: func() interface{} { - return storage.MakeHashFunc(storage.DefaultHash)() - }, - }, - } - - for i := 0; i < hasherCount; i++ { - hashfunc := storage.MakeHashFunc(storage.DefaultHash)() - ps.hashPool.Put(hashfunc) - } - - return ps, nil -} - -///////////////////////////////////////////////////////////////////// -// SECTION: node.Service interface -///////////////////////////////////////////////////////////////////// - -func (p *Pss) Start(srv *p2p.Server) error { - go func() { - ticker := time.NewTicker(defaultCleanInterval) - cacheTicker := time.NewTicker(p.cacheTTL) - defer ticker.Stop() - defer cacheTicker.Stop() - for { - select { - case <-cacheTicker.C: - p.cleanFwdCache() - case <-ticker.C: - p.cleanKeys() - case <-p.quitC: - return - } - } - }() - go func() { - for { - select { - case msg := <-p.outbox: - err := p.forward(msg) - if err != nil { - log.Error(err.Error()) - metrics.GetOrRegisterCounter("pss.forward.err", nil).Inc(1) - } - case <-p.quitC: - return - } - } - }() - log.Info("Started Pss") - log.Info("Loaded EC keys", "pubkey", common.ToHex(crypto.FromECDSAPub(p.PublicKey())), "secp256", common.ToHex(crypto.CompressPubkey(p.PublicKey()))) - return nil -} - -func (p *Pss) Stop() error { - log.Info("Pss shutting down") - close(p.quitC) - return nil -} - -var pssSpec = &protocols.Spec{ - Name: pssProtocolName, - Version: pssVersion, - MaxMsgSize: defaultMaxMsgSize, - Messages: []interface{}{ - PssMsg{}, - }, -} - -func (p *Pss) Protocols() []p2p.Protocol { - return []p2p.Protocol{ - { - Name: pssSpec.Name, - Version: pssSpec.Version, - Length: pssSpec.Length(), - Run: p.Run, - }, - } -} - -func (p *Pss) Run(peer *p2p.Peer, rw p2p.MsgReadWriter) error { - pp := protocols.NewPeer(peer, rw, pssSpec) - p.fwdPoolMu.Lock() - p.fwdPool[peer.Info().ID] = pp - p.fwdPoolMu.Unlock() - return pp.Run(p.handlePssMsg) -} - -func (p *Pss) APIs() []rpc.API { - apis := []rpc.API{ - { - Namespace: "pss", - Version: "1.0", - Service: NewAPI(p), - Public: true, - }, - } - apis = append(apis, p.auxAPIs...) - return apis -} - -// add API methods to the pss API -// must be run before node is started -func (p *Pss) addAPI(api rpc.API) { - p.auxAPIs = append(p.auxAPIs, api) -} - -// Returns the swarm Kademlia address of the pss node -func (p *Pss) BaseAddr() []byte { - return p.Kademlia.BaseAddr() -} - -// Returns the pss node's public key -func (p *Pss) PublicKey() *ecdsa.PublicKey { - return &p.privateKey.PublicKey -} - -///////////////////////////////////////////////////////////////////// -// SECTION: Message handling -///////////////////////////////////////////////////////////////////// - -// Links a handler function to a Topic -// -// All incoming messages with an envelope Topic matching the -// topic specified will be passed to the given Handler function. -// -// There may be an arbitrary number of handler functions per topic. -// -// Returns a deregister function which needs to be called to -// deregister the handler, -func (p *Pss) Register(topic *Topic, handler Handler) func() { - p.handlersMu.Lock() - defer p.handlersMu.Unlock() - handlers := p.handlers[*topic] - if handlers == nil { - handlers = make(map[*Handler]bool) - p.handlers[*topic] = handlers - } - handlers[&handler] = true - return func() { p.deregister(topic, &handler) } -} -func (p *Pss) deregister(topic *Topic, h *Handler) { - p.handlersMu.Lock() - defer p.handlersMu.Unlock() - handlers := p.handlers[*topic] - if len(handlers) == 1 { - delete(p.handlers, *topic) - return - } - delete(handlers, h) -} - -// get all registered handlers for respective topics -func (p *Pss) getHandlers(topic Topic) map[*Handler]bool { - p.handlersMu.RLock() - defer p.handlersMu.RUnlock() - return p.handlers[topic] -} - -// Filters incoming messages for processing or forwarding. -// Check if address partially matches -// If yes, it CAN be for us, and we process it -// Only passes error to pss protocol handler if payload is not valid pssmsg -func (p *Pss) handlePssMsg(ctx context.Context, msg interface{}) error { - metrics.GetOrRegisterCounter("pss.handlepssmsg", nil).Inc(1) - - pssmsg, ok := msg.(*PssMsg) - - if !ok { - return fmt.Errorf("invalid message type. Expected *PssMsg, got %T ", msg) - } - if int64(pssmsg.Expire) < time.Now().Unix() { - metrics.GetOrRegisterCounter("pss.expire", nil).Inc(1) - log.Warn("pss filtered expired message", "from", common.ToHex(p.Kademlia.BaseAddr()), "to", common.ToHex(pssmsg.To)) - return nil - } - if p.checkFwdCache(pssmsg) { - log.Trace("pss relay block-cache match (process)", "from", common.ToHex(p.Kademlia.BaseAddr()), "to", (common.ToHex(pssmsg.To))) - return nil - } - p.addFwdCache(pssmsg) - - if !p.isSelfPossibleRecipient(pssmsg) { - log.Trace("pss was for someone else :'( ... forwarding", "pss", common.ToHex(p.BaseAddr())) - return p.enqueue(pssmsg) - } - - log.Trace("pss for us, yay! ... let's process!", "pss", common.ToHex(p.BaseAddr())) - if err := p.process(pssmsg); err != nil { - qerr := p.enqueue(pssmsg) - if qerr != nil { - return fmt.Errorf("process fail: processerr %v, queueerr: %v", err, qerr) - } - } - return nil - -} - -// Entry point to processing a message for which the current node can be the intended recipient. -// Attempts symmetric and asymmetric decryption with stored keys. -// Dispatches message to all handlers matching the message topic -func (p *Pss) process(pssmsg *PssMsg) error { - metrics.GetOrRegisterCounter("pss.process", nil).Inc(1) - - var err error - var recvmsg *whisper.ReceivedMessage - var payload []byte - var from *PssAddress - var asymmetric bool - var keyid string - var keyFunc func(envelope *whisper.Envelope) (*whisper.ReceivedMessage, string, *PssAddress, error) - - envelope := pssmsg.Payload - psstopic := Topic(envelope.Topic) - if pssmsg.isRaw() { - if !p.allowRaw { - return errors.New("raw message support disabled") - } - payload = pssmsg.Payload.Data - } else { - if pssmsg.isSym() { - keyFunc = p.processSym - } else { - asymmetric = true - keyFunc = p.processAsym - } - - recvmsg, keyid, from, err = keyFunc(envelope) - if err != nil { - return errors.New("Decryption failed") - } - payload = recvmsg.Payload - } - - if len(pssmsg.To) < addressLength { - if err := p.enqueue(pssmsg); err != nil { - return err - } - } - p.executeHandlers(psstopic, payload, from, asymmetric, keyid) - - return nil - -} - -func (p *Pss) executeHandlers(topic Topic, payload []byte, from *PssAddress, asymmetric bool, keyid string) { - handlers := p.getHandlers(topic) - peer := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%x", from), []p2p.Cap{}) - for f := range handlers { - err := (*f)(payload, peer, asymmetric, keyid) - if err != nil { - log.Warn("Pss handler %p failed: %v", f, err) - } - } -} - -// will return false if using partial address -func (p *Pss) isSelfRecipient(msg *PssMsg) bool { - return bytes.Equal(msg.To, p.Kademlia.BaseAddr()) -} - -// test match of leftmost bytes in given message to node's Kademlia address -func (p *Pss) isSelfPossibleRecipient(msg *PssMsg) bool { - local := p.Kademlia.BaseAddr() - return bytes.Equal(msg.To, local[:len(msg.To)]) -} - -///////////////////////////////////////////////////////////////////// -// SECTION: Encryption -///////////////////////////////////////////////////////////////////// - -// Links a peer ECDSA public key to a topic -// -// This is required for asymmetric message exchange -// on the given topic -// -// The value in `address` will be used as a routing hint for the -// public key / topic association -func (p *Pss) SetPeerPublicKey(pubkey *ecdsa.PublicKey, topic Topic, address *PssAddress) error { - pubkeybytes := crypto.FromECDSAPub(pubkey) - if len(pubkeybytes) == 0 { - return fmt.Errorf("invalid public key: %v", pubkey) - } - pubkeyid := common.ToHex(pubkeybytes) - psp := &pssPeer{ - address: address, - } - p.pubKeyPoolMu.Lock() - if _, ok := p.pubKeyPool[pubkeyid]; !ok { - p.pubKeyPool[pubkeyid] = make(map[Topic]*pssPeer) - } - p.pubKeyPool[pubkeyid][topic] = psp - p.pubKeyPoolMu.Unlock() - log.Trace("added pubkey", "pubkeyid", pubkeyid, "topic", topic, "address", common.ToHex(*address)) - return nil -} - -// Automatically generate a new symkey for a topic and address hint -func (p *Pss) GenerateSymmetricKey(topic Topic, address *PssAddress, addToCache bool) (string, error) { - keyid, err := p.w.GenerateSymKey() - if err != nil { - return "", err - } - p.addSymmetricKeyToPool(keyid, topic, address, addToCache, false) - return keyid, nil -} - -// Links a peer symmetric key (arbitrary byte sequence) to a topic -// -// This is required for symmetrically encrypted message exchange -// on the given topic -// -// The key is stored in the whisper backend. -// -// If addtocache is set to true, the key will be added to the cache of keys -// used to attempt symmetric decryption of incoming messages. -// -// Returns a string id that can be used to retrieve the key bytes -// from the whisper backend (see pss.GetSymmetricKey()) -func (p *Pss) SetSymmetricKey(key []byte, topic Topic, address *PssAddress, addtocache bool) (string, error) { - return p.setSymmetricKey(key, topic, address, addtocache, true) -} - -func (p *Pss) setSymmetricKey(key []byte, topic Topic, address *PssAddress, addtocache bool, protected bool) (string, error) { - keyid, err := p.w.AddSymKeyDirect(key) - if err != nil { - return "", err - } - p.addSymmetricKeyToPool(keyid, topic, address, addtocache, protected) - return keyid, nil -} - -// adds a symmetric key to the pss key pool, and optionally adds the key -// to the collection of keys used to attempt symmetric decryption of -// incoming messages -func (p *Pss) addSymmetricKeyToPool(keyid string, topic Topic, address *PssAddress, addtocache bool, protected bool) { - psp := &pssPeer{ - address: address, - protected: protected, - } - p.symKeyPoolMu.Lock() - if _, ok := p.symKeyPool[keyid]; !ok { - p.symKeyPool[keyid] = make(map[Topic]*pssPeer) - } - p.symKeyPool[keyid][topic] = psp - p.symKeyPoolMu.Unlock() - if addtocache { - p.symKeyDecryptCacheCursor++ - p.symKeyDecryptCache[p.symKeyDecryptCacheCursor%cap(p.symKeyDecryptCache)] = &keyid - } - key, _ := p.GetSymmetricKey(keyid) - log.Trace("added symkey", "symkeyid", keyid, "symkey", common.ToHex(key), "topic", topic, "address", fmt.Sprintf("%p", address), "cache", addtocache) -} - -// Returns a symmetric key byte seqyence stored in the whisper backend -// by its unique id -// -// Passes on the error value from the whisper backend -func (p *Pss) GetSymmetricKey(symkeyid string) ([]byte, error) { - symkey, err := p.w.GetSymKey(symkeyid) - if err != nil { - return nil, err - } - return symkey, nil -} - -// Returns all recorded topic and address combination for a specific public key -func (p *Pss) GetPublickeyPeers(keyid string) (topic []Topic, address []PssAddress, err error) { - p.pubKeyPoolMu.RLock() - defer p.pubKeyPoolMu.RUnlock() - for t, peer := range p.pubKeyPool[keyid] { - topic = append(topic, t) - address = append(address, *peer.address) - } - - return topic, address, nil -} - -func (p *Pss) getPeerAddress(keyid string, topic Topic) (PssAddress, error) { - p.pubKeyPoolMu.RLock() - defer p.pubKeyPoolMu.RUnlock() - if peers, ok := p.pubKeyPool[keyid]; ok { - if t, ok := peers[topic]; ok { - return *t.address, nil - } - } - return nil, fmt.Errorf("peer with pubkey %s, topic %x not found", keyid, topic) -} - -// Attempt to decrypt, validate and unpack a -// symmetrically encrypted message -// If successful, returns the unpacked whisper ReceivedMessage struct -// encapsulating the decrypted message, and the whisper backend id -// of the symmetric key used to decrypt the message. -// It fails if decryption of the message fails or if the message is corrupted -func (p *Pss) processSym(envelope *whisper.Envelope) (*whisper.ReceivedMessage, string, *PssAddress, error) { - metrics.GetOrRegisterCounter("pss.process.sym", nil).Inc(1) - - for i := p.symKeyDecryptCacheCursor; i > p.symKeyDecryptCacheCursor-cap(p.symKeyDecryptCache) && i > 0; i-- { - symkeyid := p.symKeyDecryptCache[i%cap(p.symKeyDecryptCache)] - symkey, err := p.w.GetSymKey(*symkeyid) - if err != nil { - continue - } - recvmsg, err := envelope.OpenSymmetric(symkey) - if err != nil { - continue - } - if !recvmsg.Validate() { - return nil, "", nil, fmt.Errorf("symmetrically encrypted message has invalid signature or is corrupt") - } - p.symKeyPoolMu.Lock() - from := p.symKeyPool[*symkeyid][Topic(envelope.Topic)].address - p.symKeyPoolMu.Unlock() - p.symKeyDecryptCacheCursor++ - p.symKeyDecryptCache[p.symKeyDecryptCacheCursor%cap(p.symKeyDecryptCache)] = symkeyid - return recvmsg, *symkeyid, from, nil - } - return nil, "", nil, fmt.Errorf("could not decrypt message") -} - -// Attempt to decrypt, validate and unpack an -// asymmetrically encrypted message -// If successful, returns the unpacked whisper ReceivedMessage struct -// encapsulating the decrypted message, and the byte representation of -// the public key used to decrypt the message. -// It fails if decryption of message fails, or if the message is corrupted -func (p *Pss) processAsym(envelope *whisper.Envelope) (*whisper.ReceivedMessage, string, *PssAddress, error) { - metrics.GetOrRegisterCounter("pss.process.asym", nil).Inc(1) - - recvmsg, err := envelope.OpenAsymmetric(p.privateKey) - if err != nil { - return nil, "", nil, fmt.Errorf("could not decrypt message: %s", err) - } - // check signature (if signed), strip padding - if !recvmsg.Validate() { - return nil, "", nil, fmt.Errorf("invalid message") - } - pubkeyid := common.ToHex(crypto.FromECDSAPub(recvmsg.Src)) - var from *PssAddress - p.pubKeyPoolMu.Lock() - if p.pubKeyPool[pubkeyid][Topic(envelope.Topic)] != nil { - from = p.pubKeyPool[pubkeyid][Topic(envelope.Topic)].address - } - p.pubKeyPoolMu.Unlock() - return recvmsg, pubkeyid, from, nil -} - -// Symkey garbage collection -// a key is removed if: -// - it is not marked as protected -// - it is not in the incoming decryption cache -func (p *Pss) cleanKeys() (count int) { - for keyid, peertopics := range p.symKeyPool { - var expiredtopics []Topic - for topic, psp := range peertopics { - if psp.protected { - continue - } - - var match bool - for i := p.symKeyDecryptCacheCursor; i > p.symKeyDecryptCacheCursor-cap(p.symKeyDecryptCache) && i > 0; i-- { - cacheid := p.symKeyDecryptCache[i%cap(p.symKeyDecryptCache)] - if *cacheid == keyid { - match = true - } - } - if !match { - expiredtopics = append(expiredtopics, topic) - } - } - for _, topic := range expiredtopics { - p.symKeyPoolMu.Lock() - delete(p.symKeyPool[keyid], topic) - log.Trace("symkey cleanup deletion", "symkeyid", keyid, "topic", topic, "val", p.symKeyPool[keyid]) - p.symKeyPoolMu.Unlock() - count++ - } - } - return -} - -///////////////////////////////////////////////////////////////////// -// SECTION: Message sending -///////////////////////////////////////////////////////////////////// - -func (p *Pss) enqueue(msg *PssMsg) error { - select { - case p.outbox <- msg: - return nil - default: - } - - metrics.GetOrRegisterCounter("pss.enqueue.outbox.full", nil).Inc(1) - return errors.New("outbox full") -} - -// Send a raw message (any encryption is responsibility of calling client) -// -// Will fail if raw messages are disallowed -func (p *Pss) SendRaw(address PssAddress, topic Topic, msg []byte) error { - if !p.allowRaw { - return errors.New("Raw messages not enabled") - } - pssMsgParams := &msgParams{ - raw: true, - } - payload := &whisper.Envelope{ - Data: msg, - Topic: whisper.TopicType(topic), - } - pssMsg := newPssMsg(pssMsgParams) - pssMsg.To = address - pssMsg.Expire = uint32(time.Now().Add(p.msgTTL).Unix()) - pssMsg.Payload = payload - p.addFwdCache(pssMsg) - return p.enqueue(pssMsg) -} - -// Send a message using symmetric encryption -// -// Fails if the key id does not match any of the stored symmetric keys -func (p *Pss) SendSym(symkeyid string, topic Topic, msg []byte) error { - symkey, err := p.GetSymmetricKey(symkeyid) - if err != nil { - return fmt.Errorf("missing valid send symkey %s: %v", symkeyid, err) - } - p.symKeyPoolMu.Lock() - psp, ok := p.symKeyPool[symkeyid][topic] - p.symKeyPoolMu.Unlock() - if !ok { - return fmt.Errorf("invalid topic '%s' for symkey '%s'", topic.String(), symkeyid) - } else if psp.address == nil { - return fmt.Errorf("no address hint for topic '%s' symkey '%s'", topic.String(), symkeyid) - } - err = p.send(*psp.address, topic, msg, false, symkey) - return err -} - -// Send a message using asymmetric encryption -// -// Fails if the key id does not match any in of the stored public keys -func (p *Pss) SendAsym(pubkeyid string, topic Topic, msg []byte) error { - if _, err := crypto.UnmarshalPubkey(common.FromHex(pubkeyid)); err != nil { - return fmt.Errorf("Cannot unmarshal pubkey: %x", pubkeyid) - } - p.pubKeyPoolMu.Lock() - psp, ok := p.pubKeyPool[pubkeyid][topic] - p.pubKeyPoolMu.Unlock() - if !ok { - return fmt.Errorf("invalid topic '%s' for pubkey '%s'", topic.String(), pubkeyid) - } else if psp.address == nil { - return fmt.Errorf("no address hint for topic '%s' pubkey '%s'", topic.String(), pubkeyid) - } - go func() { - p.send(*psp.address, topic, msg, true, common.FromHex(pubkeyid)) - }() - return nil -} - -// Send is payload agnostic, and will accept any byte slice as payload -// It generates an whisper envelope for the specified recipient and topic, -// and wraps the message payload in it. -// TODO: Implement proper message padding -func (p *Pss) send(to []byte, topic Topic, msg []byte, asymmetric bool, key []byte) error { - metrics.GetOrRegisterCounter("pss.send", nil).Inc(1) - - if key == nil || bytes.Equal(key, []byte{}) { - return fmt.Errorf("Zero length key passed to pss send") - } - padding := make([]byte, p.paddingByteSize) - c, err := rand.Read(padding) - if err != nil { - return err - } else if c < p.paddingByteSize { - return fmt.Errorf("invalid padding length: %d", c) - } - wparams := &whisper.MessageParams{ - TTL: defaultWhisperTTL, - Src: p.privateKey, - Topic: whisper.TopicType(topic), - WorkTime: defaultWhisperWorkTime, - PoW: defaultWhisperPoW, - Payload: msg, - Padding: padding, - } - if asymmetric { - pk, err := crypto.UnmarshalPubkey(key) - if err != nil { - return fmt.Errorf("Cannot unmarshal pubkey: %x", key) - } - wparams.Dst = pk - } else { - wparams.KeySym = key - } - // set up outgoing message container, which does encryption and envelope wrapping - woutmsg, err := whisper.NewSentMessage(wparams) - if err != nil { - return fmt.Errorf("failed to generate whisper message encapsulation: %v", err) - } - // performs encryption. - // Does NOT perform / performs negligible PoW due to very low difficulty setting - // after this the message is ready for sending - envelope, err := woutmsg.Wrap(wparams) - if err != nil { - return fmt.Errorf("failed to perform whisper encryption: %v", err) - } - log.Trace("pssmsg whisper done", "env", envelope, "wparams payload", common.ToHex(wparams.Payload), "to", common.ToHex(to), "asym", asymmetric, "key", common.ToHex(key)) - - // prepare for devp2p transport - pssMsgParams := &msgParams{ - sym: !asymmetric, - } - pssMsg := newPssMsg(pssMsgParams) - pssMsg.To = to - pssMsg.Expire = uint32(time.Now().Add(p.msgTTL).Unix()) - pssMsg.Payload = envelope - return p.enqueue(pssMsg) -} - -// Forwards a pss message to the peer(s) closest to the to recipient address in the PssMsg struct -// The recipient address can be of any length, and the byte slice will be matched to the MSB slice -// of the peer address of the equivalent length. -func (p *Pss) forward(msg *PssMsg) error { - metrics.GetOrRegisterCounter("pss.forward", nil).Inc(1) - - to := make([]byte, addressLength) - copy(to[:len(msg.To)], msg.To) - - // send with kademlia - // find the closest peer to the recipient and attempt to send - sent := 0 - p.Kademlia.EachConn(to, 256, func(sp *network.Peer, po int, isproxbin bool) bool { - info := sp.Info() - - // check if the peer is running pss - var ispss bool - for _, cap := range info.Caps { - if cap == p.capstring { - ispss = true - break - } - } - if !ispss { - log.Trace("peer doesn't have matching pss capabilities, skipping", "peer", info.Name, "caps", info.Caps) - return true - } - - // get the protocol peer from the forwarding peer cache - sendMsg := fmt.Sprintf("MSG TO %x FROM %x VIA %x", to, p.BaseAddr(), sp.Address()) - p.fwdPoolMu.RLock() - pp := p.fwdPool[sp.Info().ID] - p.fwdPoolMu.RUnlock() - - // attempt to send the message - err := pp.Send(context.TODO(), msg) - if err != nil { - metrics.GetOrRegisterCounter("pss.pp.send.error", nil).Inc(1) - log.Error(err.Error()) - return true - } - sent++ - log.Trace(fmt.Sprintf("%v: successfully forwarded", sendMsg)) - - // continue forwarding if: - // - if the peer is end recipient but the full address has not been disclosed - // - if the peer address matches the partial address fully - // - if the peer is in proxbin - if len(msg.To) < addressLength && bytes.Equal(msg.To, sp.Address()[:len(msg.To)]) { - log.Trace(fmt.Sprintf("Pss keep forwarding: Partial address + full partial match")) - return true - } else if isproxbin { - log.Trace(fmt.Sprintf("%x is in proxbin, keep forwarding", common.ToHex(sp.Address()))) - return true - } - // at this point we stop forwarding, and the state is as follows: - // - the peer is end recipient and we have full address - // - we are not in proxbin (directed routing) - // - partial addresses don't fully match - return false - }) - - if sent == 0 { - log.Debug("unable to forward to any peers") - if err := p.enqueue(msg); err != nil { - metrics.GetOrRegisterCounter("pss.forward.enqueue.error", nil).Inc(1) - log.Error(err.Error()) - return err - } - } - - // cache the message - p.addFwdCache(msg) - return nil -} - -///////////////////////////////////////////////////////////////////// -// SECTION: Caching -///////////////////////////////////////////////////////////////////// - -// cleanFwdCache is used to periodically remove expired entries from the forward cache -func (p *Pss) cleanFwdCache() { - metrics.GetOrRegisterCounter("pss.cleanfwdcache", nil).Inc(1) - p.fwdCacheMu.Lock() - defer p.fwdCacheMu.Unlock() - for k, v := range p.fwdCache { - if v.expiresAt.Before(time.Now()) { - delete(p.fwdCache, k) - } - } -} - -// add a message to the cache -func (p *Pss) addFwdCache(msg *PssMsg) error { - metrics.GetOrRegisterCounter("pss.addfwdcache", nil).Inc(1) - - var entry pssCacheEntry - var ok bool - - p.fwdCacheMu.Lock() - defer p.fwdCacheMu.Unlock() - - digest := p.digest(msg) - if entry, ok = p.fwdCache[digest]; !ok { - entry = pssCacheEntry{} - } - entry.expiresAt = time.Now().Add(p.cacheTTL) - p.fwdCache[digest] = entry - return nil -} - -// check if message is in the cache -func (p *Pss) checkFwdCache(msg *PssMsg) bool { - p.fwdCacheMu.Lock() - defer p.fwdCacheMu.Unlock() - - digest := p.digest(msg) - entry, ok := p.fwdCache[digest] - if ok { - if entry.expiresAt.After(time.Now()) { - log.Trace("unexpired cache", "digest", fmt.Sprintf("%x", digest)) - metrics.GetOrRegisterCounter("pss.checkfwdcache.unexpired", nil).Inc(1) - return true - } - metrics.GetOrRegisterCounter("pss.checkfwdcache.expired", nil).Inc(1) - } - return false -} - -// Digest of message -func (p *Pss) digest(msg *PssMsg) pssDigest { - hasher := p.hashPool.Get().(storage.SwarmHash) - defer p.hashPool.Put(hasher) - hasher.Reset() - hasher.Write(msg.serialize()) - digest := pssDigest{} - key := hasher.Sum(nil) - copy(digest[:], key[:digestLength]) - return digest -} diff --git a/swarm/pss/pss_test.go b/swarm/pss/pss_test.go deleted file mode 100644 index 574714114b40..000000000000 --- a/swarm/pss/pss_test.go +++ /dev/null @@ -1,1675 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package pss - -import ( - "bytes" - "context" - "crypto/ecdsa" - "encoding/binary" - "encoding/hex" - "encoding/json" - "flag" - "fmt" - "io/ioutil" - "math/rand" - "os" - "strconv" - "strings" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/metrics/influxdb" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/state" - whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" -) - -var ( - initOnce = sync.Once{} - debugdebugflag = flag.Bool("vv", false, "veryverbose") - debugflag = flag.Bool("v", false, "verbose") - longrunning = flag.Bool("longrunning", false, "do run long-running tests") - w *whisper.Whisper - wapi *whisper.PublicWhisperAPI - psslogmain log.Logger - pssprotocols map[string]*protoCtrl - useHandshake bool -) - -func init() { - flag.Parse() - rand.Seed(time.Now().Unix()) - - adapters.RegisterServices(newServices(false)) - initTest() -} - -func initTest() { - initOnce.Do( - func() { - loglevel := log.LvlInfo - if *debugflag { - loglevel = log.LvlDebug - } else if *debugdebugflag { - loglevel = log.LvlTrace - } - - psslogmain = log.New("psslog", "*") - hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) - hf := log.LvlFilterHandler(loglevel, hs) - h := log.CallerFileHandler(hf) - log.Root().SetHandler(h) - - w = whisper.New(&whisper.DefaultConfig) - wapi = whisper.NewPublicWhisperAPI(w) - - pssprotocols = make(map[string]*protoCtrl) - }, - ) -} - -// test that topic conversion functions give predictable results -func TestTopic(t *testing.T) { - - api := &API{} - - topicstr := strings.Join([]string{PingProtocol.Name, strconv.Itoa(int(PingProtocol.Version))}, ":") - - // bytestotopic is the authoritative topic conversion source - topicobj := BytesToTopic([]byte(topicstr)) - - // string to topic and bytes to topic must match - topicapiobj, _ := api.StringToTopic(topicstr) - if topicobj != topicapiobj { - t.Fatalf("bytes and string topic conversion mismatch; %s != %s", topicobj, topicapiobj) - } - - // string representation of topichex - topichex := topicobj.String() - - // protocoltopic wrapper on pingtopic should be same as topicstring - // check that it matches - pingtopichex := PingTopic.String() - if topichex != pingtopichex { - t.Fatalf("protocol topic conversion mismatch; %s != %s", topichex, pingtopichex) - } - - // json marshal of topic - topicjsonout, err := topicobj.MarshalJSON() - if err != nil { - t.Fatal(err) - } - if string(topicjsonout)[1:len(topicjsonout)-1] != topichex { - t.Fatalf("topic json marshal mismatch; %s != \"%s\"", topicjsonout, topichex) - } - - // json unmarshal of topic - var topicjsonin Topic - topicjsonin.UnmarshalJSON(topicjsonout) - if topicjsonin != topicobj { - t.Fatalf("topic json unmarshal mismatch: %x != %x", topicjsonin, topicobj) - } -} - -// test bit packing of message control flags -func TestMsgParams(t *testing.T) { - var ctrl byte - ctrl |= pssControlRaw - p := newMsgParamsFromBytes([]byte{ctrl}) - m := newPssMsg(p) - if !m.isRaw() || m.isSym() { - t.Fatal("expected raw=true and sym=false") - } - ctrl |= pssControlSym - p = newMsgParamsFromBytes([]byte{ctrl}) - m = newPssMsg(p) - if !m.isRaw() || !m.isSym() { - t.Fatal("expected raw=true and sym=true") - } - ctrl &= 0xff &^ pssControlRaw - p = newMsgParamsFromBytes([]byte{ctrl}) - m = newPssMsg(p) - if m.isRaw() || !m.isSym() { - t.Fatal("expected raw=false and sym=true") - } -} - -// test if we can insert into cache, match items with cache and cache expiry -func TestCache(t *testing.T) { - var err error - to, _ := hex.DecodeString("08090a0b0c0d0e0f1011121314150001020304050607161718191a1b1c1d1e1f") - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - if err != nil { - t.Fatal(err) - } - ps := newTestPss(privkey, nil, nil) - pp := NewPssParams().WithPrivateKey(privkey) - data := []byte("foo") - datatwo := []byte("bar") - datathree := []byte("baz") - wparams := &whisper.MessageParams{ - TTL: defaultWhisperTTL, - Src: privkey, - Dst: &privkey.PublicKey, - Topic: whisper.TopicType(PingTopic), - WorkTime: defaultWhisperWorkTime, - PoW: defaultWhisperPoW, - Payload: data, - } - woutmsg, err := whisper.NewSentMessage(wparams) - env, err := woutmsg.Wrap(wparams) - msg := &PssMsg{ - Payload: env, - To: to, - } - wparams.Payload = datatwo - woutmsg, err = whisper.NewSentMessage(wparams) - envtwo, err := woutmsg.Wrap(wparams) - msgtwo := &PssMsg{ - Payload: envtwo, - To: to, - } - wparams.Payload = datathree - woutmsg, err = whisper.NewSentMessage(wparams) - envthree, err := woutmsg.Wrap(wparams) - msgthree := &PssMsg{ - Payload: envthree, - To: to, - } - - digest := ps.digest(msg) - if err != nil { - t.Fatalf("could not store cache msgone: %v", err) - } - digesttwo := ps.digest(msgtwo) - if err != nil { - t.Fatalf("could not store cache msgtwo: %v", err) - } - digestthree := ps.digest(msgthree) - if err != nil { - t.Fatalf("could not store cache msgthree: %v", err) - } - - if digest == digesttwo { - t.Fatalf("different msgs return same hash: %d", digesttwo) - } - - // check the cache - err = ps.addFwdCache(msg) - if err != nil { - t.Fatalf("write to pss expire cache failed: %v", err) - } - - if !ps.checkFwdCache(msg) { - t.Fatalf("message %v should have EXPIRE record in cache but checkCache returned false", msg) - } - - if ps.checkFwdCache(msgtwo) { - t.Fatalf("message %v should NOT have EXPIRE record in cache but checkCache returned true", msgtwo) - } - - time.Sleep(pp.CacheTTL + 1*time.Second) - err = ps.addFwdCache(msgthree) - if err != nil { - t.Fatalf("write to pss expire cache failed: %v", err) - } - - if ps.checkFwdCache(msg) { - t.Fatalf("message %v should have expired from cache but checkCache returned true", msg) - } - - if _, ok := ps.fwdCache[digestthree]; !ok { - t.Fatalf("unexpired message should be in the cache: %v", digestthree) - } - - if _, ok := ps.fwdCache[digesttwo]; ok { - t.Fatalf("expired message should have been cleared from the cache: %v", digesttwo) - } -} - -// matching of address hints; whether a message could be or is for the node -func TestAddressMatch(t *testing.T) { - - localaddr := network.RandomAddr().Over() - copy(localaddr[:8], []byte("deadbeef")) - remoteaddr := []byte("feedbeef") - kadparams := network.NewKadParams() - kad := network.NewKademlia(localaddr, kadparams) - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - if err != nil { - t.Fatalf("Could not generate private key: %v", err) - } - privkey, err := w.GetPrivateKey(keys) - pssp := NewPssParams().WithPrivateKey(privkey) - ps, err := NewPss(kad, pssp) - if err != nil { - t.Fatal(err.Error()) - } - - pssmsg := &PssMsg{ - To: remoteaddr, - Payload: &whisper.Envelope{}, - } - - // differ from first byte - if ps.isSelfRecipient(pssmsg) { - t.Fatalf("isSelfRecipient true but %x != %x", remoteaddr, localaddr) - } - if ps.isSelfPossibleRecipient(pssmsg) { - t.Fatalf("isSelfPossibleRecipient true but %x != %x", remoteaddr[:8], localaddr[:8]) - } - - // 8 first bytes same - copy(remoteaddr[:4], localaddr[:4]) - if ps.isSelfRecipient(pssmsg) { - t.Fatalf("isSelfRecipient true but %x != %x", remoteaddr, localaddr) - } - if !ps.isSelfPossibleRecipient(pssmsg) { - t.Fatalf("isSelfPossibleRecipient false but %x == %x", remoteaddr[:8], localaddr[:8]) - } - - // all bytes same - pssmsg.To = localaddr - if !ps.isSelfRecipient(pssmsg) { - t.Fatalf("isSelfRecipient false but %x == %x", remoteaddr, localaddr) - } - if !ps.isSelfPossibleRecipient(pssmsg) { - t.Fatalf("isSelfPossibleRecipient false but %x == %x", remoteaddr[:8], localaddr[:8]) - } -} - -// -func TestHandlerConditions(t *testing.T) { - - t.Skip("Disabled due to probable faulty logic for outbox expectations") - // setup - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err.Error()) - } - - addr := make([]byte, 32) - addr[0] = 0x01 - ps := newTestPss(privkey, network.NewKademlia(addr, network.NewKadParams()), NewPssParams()) - - // message should pass - msg := &PssMsg{ - To: addr, - Expire: uint32(time.Now().Add(time.Second * 60).Unix()), - Payload: &whisper.Envelope{ - Topic: [4]byte{}, - Data: []byte{0x66, 0x6f, 0x6f}, - }, - } - if err := ps.handlePssMsg(context.TODO(), msg); err != nil { - t.Fatal(err.Error()) - } - tmr := time.NewTimer(time.Millisecond * 100) - var outmsg *PssMsg - select { - case outmsg = <-ps.outbox: - case <-tmr.C: - default: - } - if outmsg != nil { - t.Fatalf("expected outbox empty after full address on msg, but had message %s", msg) - } - - // message should pass and queue due to partial length - msg.To = addr[0:1] - msg.Payload.Data = []byte{0x78, 0x79, 0x80, 0x80, 0x79} - if err := ps.handlePssMsg(context.TODO(), msg); err != nil { - t.Fatal(err.Error()) - } - tmr.Reset(time.Millisecond * 100) - outmsg = nil - select { - case outmsg = <-ps.outbox: - case <-tmr.C: - } - if outmsg == nil { - t.Fatal("expected message in outbox on encrypt fail, but empty") - } - outmsg = nil - select { - case outmsg = <-ps.outbox: - default: - } - if outmsg != nil { - t.Fatalf("expected only one queued message but also had message %v", msg) - } - - // full address mismatch should put message in queue - msg.To[0] = 0xff - if err := ps.handlePssMsg(context.TODO(), msg); err != nil { - t.Fatal(err.Error()) - } - tmr.Reset(time.Millisecond * 10) - outmsg = nil - select { - case outmsg = <-ps.outbox: - case <-tmr.C: - } - if outmsg == nil { - t.Fatal("expected message in outbox on address mismatch, but empty") - } - outmsg = nil - select { - case outmsg = <-ps.outbox: - default: - } - if outmsg != nil { - t.Fatalf("expected only one queued message but also had message %v", msg) - } - - // expired message should be dropped - msg.Expire = uint32(time.Now().Add(-time.Second).Unix()) - if err := ps.handlePssMsg(context.TODO(), msg); err != nil { - t.Fatal(err.Error()) - } - tmr.Reset(time.Millisecond * 10) - outmsg = nil - select { - case outmsg = <-ps.outbox: - case <-tmr.C: - default: - } - if outmsg != nil { - t.Fatalf("expected empty queue but have message %v", msg) - } - - // invalid message should return error - fckedupmsg := &struct { - pssMsg *PssMsg - }{ - pssMsg: &PssMsg{}, - } - if err := ps.handlePssMsg(context.TODO(), fckedupmsg); err == nil { - t.Fatalf("expected error from processMsg but error nil") - } - - // outbox full should return error - msg.Expire = uint32(time.Now().Add(time.Second * 60).Unix()) - for i := 0; i < defaultOutboxCapacity; i++ { - ps.outbox <- msg - } - msg.Payload.Data = []byte{0x62, 0x61, 0x72} - err = ps.handlePssMsg(context.TODO(), msg) - if err == nil { - t.Fatal("expected error when mailbox full, but was nil") - } -} - -// set and generate pubkeys and symkeys -func TestKeys(t *testing.T) { - // make our key and init pss with it - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - ourkeys, err := wapi.NewKeyPair(ctx) - if err != nil { - t.Fatalf("create 'our' key fail") - } - ctx, cancel2 := context.WithTimeout(context.Background(), time.Second) - defer cancel2() - theirkeys, err := wapi.NewKeyPair(ctx) - if err != nil { - t.Fatalf("create 'their' key fail") - } - ourprivkey, err := w.GetPrivateKey(ourkeys) - if err != nil { - t.Fatalf("failed to retrieve 'our' private key") - } - theirprivkey, err := w.GetPrivateKey(theirkeys) - if err != nil { - t.Fatalf("failed to retrieve 'their' private key") - } - ps := newTestPss(ourprivkey, nil, nil) - - // set up peer with mock address, mapped to mocked publicaddress and with mocked symkey - addr := make(PssAddress, 32) - copy(addr, network.RandomAddr().Over()) - outkey := network.RandomAddr().Over() - topicobj := BytesToTopic([]byte("foo:42")) - ps.SetPeerPublicKey(&theirprivkey.PublicKey, topicobj, &addr) - outkeyid, err := ps.SetSymmetricKey(outkey, topicobj, &addr, false) - if err != nil { - t.Fatalf("failed to set 'our' outgoing symmetric key") - } - - // make a symmetric key that we will send to peer for encrypting messages to us - inkeyid, err := ps.GenerateSymmetricKey(topicobj, &addr, true) - if err != nil { - t.Fatalf("failed to set 'our' incoming symmetric key") - } - - // get the key back from whisper, check that it's still the same - outkeyback, err := ps.w.GetSymKey(outkeyid) - if err != nil { - t.Fatalf(err.Error()) - } - inkey, err := ps.w.GetSymKey(inkeyid) - if err != nil { - t.Fatalf(err.Error()) - } - if !bytes.Equal(outkeyback, outkey) { - t.Fatalf("passed outgoing symkey doesnt equal stored: %x / %x", outkey, outkeyback) - } - - t.Logf("symout: %v", outkeyback) - t.Logf("symin: %v", inkey) - - // check that the key is stored in the peerpool - psp := ps.symKeyPool[inkeyid][topicobj] - if psp.address != &addr { - t.Fatalf("inkey address does not match; %p != %p", psp.address, &addr) - } -} - -func TestGetPublickeyEntries(t *testing.T) { - - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - ps := newTestPss(privkey, nil, nil) - - peeraddr := network.RandomAddr().Over() - topicaddr := make(map[Topic]PssAddress) - topicaddr[Topic{0x13}] = peeraddr - topicaddr[Topic{0x2a}] = peeraddr[:16] - topicaddr[Topic{0x02, 0x9a}] = []byte{} - - remoteprivkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - remotepubkeybytes := crypto.FromECDSAPub(&remoteprivkey.PublicKey) - remotepubkeyhex := common.ToHex(remotepubkeybytes) - - pssapi := NewAPI(ps) - - for to, a := range topicaddr { - err = pssapi.SetPeerPublicKey(remotepubkeybytes, to, a) - if err != nil { - t.Fatal(err) - } - } - - intopic, err := pssapi.GetPeerTopics(remotepubkeyhex) - if err != nil { - t.Fatal(err) - } - -OUTER: - for _, tnew := range intopic { - for torig, addr := range topicaddr { - if bytes.Equal(torig[:], tnew[:]) { - inaddr, err := pssapi.GetPeerAddress(remotepubkeyhex, torig) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(addr, inaddr) { - t.Fatalf("Address mismatch for topic %x; got %x, expected %x", torig, inaddr, addr) - } - delete(topicaddr, torig) - continue OUTER - } - } - t.Fatalf("received topic %x did not match any existing topics", tnew) - } - - if len(topicaddr) != 0 { - t.Fatalf("%d topics were not matched", len(topicaddr)) - } -} - -// forwarding should skip peers that do not have matching pss capabilities -func TestMismatch(t *testing.T) { - - // create privkey for forwarder node - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - - // initialize kad - baseaddr := network.RandomAddr() - kad := network.NewKademlia((baseaddr).Over(), network.NewKadParams()) - rw := &p2p.MsgPipeRW{} - - // one peer has a mismatching version of pss - wrongpssaddr := network.RandomAddr() - wrongpsscap := p2p.Cap{ - Name: pssProtocolName, - Version: 0, - } - nid := enode.ID{0x01} - wrongpsspeer := network.NewPeer(&network.BzzPeer{ - Peer: protocols.NewPeer(p2p.NewPeer(nid, common.ToHex(wrongpssaddr.Over()), []p2p.Cap{wrongpsscap}), rw, nil), - BzzAddr: &network.BzzAddr{OAddr: wrongpssaddr.Over(), UAddr: nil}, - }, kad) - - // one peer doesn't even have pss (boo!) - nopssaddr := network.RandomAddr() - nopsscap := p2p.Cap{ - Name: "nopss", - Version: 1, - } - nid = enode.ID{0x02} - nopsspeer := network.NewPeer(&network.BzzPeer{ - Peer: protocols.NewPeer(p2p.NewPeer(nid, common.ToHex(nopssaddr.Over()), []p2p.Cap{nopsscap}), rw, nil), - BzzAddr: &network.BzzAddr{OAddr: nopssaddr.Over(), UAddr: nil}, - }, kad) - - // add peers to kademlia and activate them - // it's safe so don't check errors - kad.Register(wrongpsspeer.BzzAddr) - kad.On(wrongpsspeer) - kad.Register(nopsspeer.BzzAddr) - kad.On(nopsspeer) - - // create pss - pssmsg := &PssMsg{ - To: []byte{}, - Expire: uint32(time.Now().Add(time.Second).Unix()), - Payload: &whisper.Envelope{}, - } - ps := newTestPss(privkey, kad, nil) - - // run the forward - // it is enough that it completes; trying to send to incapable peers would create segfault - ps.forward(pssmsg) - -} - -func TestSendRaw(t *testing.T) { - t.Run("32", testSendRaw) - t.Run("8", testSendRaw) - t.Run("0", testSendRaw) -} - -func testSendRaw(t *testing.T) { - - var addrsize int64 - var err error - - paramstring := strings.Split(t.Name(), "/") - - addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) - log.Info("raw send test", "addrsize", addrsize) - - clients, err := setupNetwork(2, true) - if err != nil { - t.Fatal(err) - } - - topic := "0xdeadbeef" - - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - - time.Sleep(time.Millisecond * 500) - - // at this point we've verified that symkeys are saved and match on each peer - // now try sending symmetrically encrypted message, both directions - lmsgC := make(chan APIMsg) - lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10) - defer lcancel() - lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic) - log.Trace("lsub", "id", lsub) - defer lsub.Unsubscribe() - rmsgC := make(chan APIMsg) - rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10) - defer rcancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic) - log.Trace("rsub", "id", rsub) - defer rsub.Unsubscribe() - - // send and verify delivery - lmsg := []byte("plugh") - err = clients[1].Call(nil, "pss_sendRaw", loaddrhex, topic, lmsg) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-lmsgC: - if !bytes.Equal(recvmsg.Msg, lmsg) { - t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg) - } - case cerr := <-lctx.Done(): - t.Fatalf("test message (left) timed out: %v", cerr) - } - rmsg := []byte("xyzzy") - err = clients[0].Call(nil, "pss_sendRaw", roaddrhex, topic, rmsg) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-rmsgC: - if !bytes.Equal(recvmsg.Msg, rmsg) { - t.Fatalf("node 2 received payload mismatch: expected %x, got %v", rmsg, recvmsg.Msg) - } - case cerr := <-rctx.Done(): - t.Fatalf("test message (right) timed out: %v", cerr) - } -} - -// send symmetrically encrypted message between two directly connected peers -func TestSendSym(t *testing.T) { - t.Run("32", testSendSym) - t.Run("8", testSendSym) - t.Run("0", testSendSym) -} - -func testSendSym(t *testing.T) { - - // address hint size - var addrsize int64 - var err error - paramstring := strings.Split(t.Name(), "/") - addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) - log.Info("sym send test", "addrsize", addrsize) - - clients, err := setupNetwork(2, false) - if err != nil { - t.Fatal(err) - } - - var topic string - err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - - // retrieve public key from pss instance - // set this public key reciprocally - var lpubkeyhex string - err = clients[0].Call(&lpubkeyhex, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkeyhex string - err = clients[1].Call(&rpubkeyhex, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 500) - - // at this point we've verified that symkeys are saved and match on each peer - // now try sending symmetrically encrypted message, both directions - lmsgC := make(chan APIMsg) - lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10) - defer lcancel() - lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic) - log.Trace("lsub", "id", lsub) - defer lsub.Unsubscribe() - rmsgC := make(chan APIMsg) - rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10) - defer rcancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic) - log.Trace("rsub", "id", rsub) - defer rsub.Unsubscribe() - - lrecvkey := network.RandomAddr().Over() - rrecvkey := network.RandomAddr().Over() - - var lkeyids [2]string - var rkeyids [2]string - - // manually set reciprocal symkeys - err = clients[0].Call(&lkeyids, "psstest_setSymKeys", rpubkeyhex, lrecvkey, rrecvkey, defaultSymKeySendLimit, topic, roaddrhex) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(&rkeyids, "psstest_setSymKeys", lpubkeyhex, rrecvkey, lrecvkey, defaultSymKeySendLimit, topic, loaddrhex) - if err != nil { - t.Fatal(err) - } - - // send and verify delivery - lmsg := []byte("plugh") - err = clients[1].Call(nil, "pss_sendSym", rkeyids[1], topic, hexutil.Encode(lmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-lmsgC: - if !bytes.Equal(recvmsg.Msg, lmsg) { - t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg) - } - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - rmsg := []byte("xyzzy") - err = clients[0].Call(nil, "pss_sendSym", lkeyids[1], topic, hexutil.Encode(rmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-rmsgC: - if !bytes.Equal(recvmsg.Msg, rmsg) { - t.Fatalf("node 2 received payload mismatch: expected %x, got %v", rmsg, recvmsg.Msg) - } - case cerr := <-rctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } -} - -// send asymmetrically encrypted message between two directly connected peers -func TestSendAsym(t *testing.T) { - t.Run("32", testSendAsym) - t.Run("8", testSendAsym) - t.Run("0", testSendAsym) -} - -func testSendAsym(t *testing.T) { - - // address hint size - var addrsize int64 - var err error - paramstring := strings.Split(t.Name(), "/") - addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) - log.Info("asym send test", "addrsize", addrsize) - - clients, err := setupNetwork(2, false) - if err != nil { - t.Fatal(err) - } - - var topic string - err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Millisecond * 250) - - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - - // retrieve public key from pss instance - // set this public key reciprocally - var lpubkey string - err = clients[0].Call(&lpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 500) // replace with hive healthy code - - lmsgC := make(chan APIMsg) - lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10) - defer lcancel() - lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic) - log.Trace("lsub", "id", lsub) - defer lsub.Unsubscribe() - rmsgC := make(chan APIMsg) - rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10) - defer rcancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic) - log.Trace("rsub", "id", rsub) - defer rsub.Unsubscribe() - - // store reciprocal public keys - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddrhex) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddrhex) - if err != nil { - t.Fatal(err) - } - - // send and verify delivery - rmsg := []byte("xyzzy") - err = clients[0].Call(nil, "pss_sendAsym", rpubkey, topic, hexutil.Encode(rmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-rmsgC: - if !bytes.Equal(recvmsg.Msg, rmsg) { - t.Fatalf("node 2 received payload mismatch: expected %v, got %v", rmsg, recvmsg.Msg) - } - case cerr := <-rctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - lmsg := []byte("plugh") - err = clients[1].Call(nil, "pss_sendAsym", lpubkey, topic, hexutil.Encode(lmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-lmsgC: - if !bytes.Equal(recvmsg.Msg, lmsg) { - t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg.Msg) - } - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } -} - -type Job struct { - Msg []byte - SendNode enode.ID - RecvNode enode.ID -} - -func worker(id int, jobs <-chan Job, rpcs map[enode.ID]*rpc.Client, pubkeys map[enode.ID]string, topic string) { - for j := range jobs { - rpcs[j.SendNode].Call(nil, "pss_sendAsym", pubkeys[j.RecvNode], topic, hexutil.Encode(j.Msg)) - } -} - -func TestNetwork(t *testing.T) { - t.Run("16/1000/4/sim", testNetwork) -} - -// params in run name: -// nodes/msgs/addrbytes/adaptertype -// if adaptertype is exec uses execadapter, simadapter otherwise -func TestNetwork2000(t *testing.T) { - //enableMetrics() - - if !*longrunning { - t.Skip("run with --longrunning flag to run extensive network tests") - } - t.Run("3/2000/4/sim", testNetwork) - t.Run("4/2000/4/sim", testNetwork) - t.Run("8/2000/4/sim", testNetwork) - t.Run("16/2000/4/sim", testNetwork) -} - -func TestNetwork5000(t *testing.T) { - //enableMetrics() - - if !*longrunning { - t.Skip("run with --longrunning flag to run extensive network tests") - } - t.Run("3/5000/4/sim", testNetwork) - t.Run("4/5000/4/sim", testNetwork) - t.Run("8/5000/4/sim", testNetwork) - t.Run("16/5000/4/sim", testNetwork) -} - -func TestNetwork10000(t *testing.T) { - //enableMetrics() - - if !*longrunning { - t.Skip("run with --longrunning flag to run extensive network tests") - } - t.Run("3/10000/4/sim", testNetwork) - t.Run("4/10000/4/sim", testNetwork) - t.Run("8/10000/4/sim", testNetwork) -} - -func testNetwork(t *testing.T) { - type msgnotifyC struct { - id enode.ID - msgIdx int - } - - paramstring := strings.Split(t.Name(), "/") - nodecount, _ := strconv.ParseInt(paramstring[1], 10, 0) - msgcount, _ := strconv.ParseInt(paramstring[2], 10, 0) - addrsize, _ := strconv.ParseInt(paramstring[3], 10, 0) - adapter := paramstring[4] - - log.Info("network test", "nodecount", nodecount, "msgcount", msgcount, "addrhintsize", addrsize) - - nodes := make([]enode.ID, nodecount) - bzzaddrs := make(map[enode.ID]string, nodecount) - rpcs := make(map[enode.ID]*rpc.Client, nodecount) - pubkeys := make(map[enode.ID]string, nodecount) - - sentmsgs := make([][]byte, msgcount) - recvmsgs := make([]bool, msgcount) - nodemsgcount := make(map[enode.ID]int, nodecount) - - trigger := make(chan enode.ID) - - var a adapters.NodeAdapter - if adapter == "exec" { - dirname, err := ioutil.TempDir(".", "") - if err != nil { - t.Fatal(err) - } - a = adapters.NewExecAdapter(dirname) - } else if adapter == "tcp" { - a = adapters.NewTCPAdapter(newServices(false)) - } else if adapter == "sim" { - a = adapters.NewSimAdapter(newServices(false)) - } - net := simulations.NewNetwork(a, &simulations.NetworkConfig{ - ID: "0", - }) - defer net.Shutdown() - - f, err := os.Open(fmt.Sprintf("testdata/snapshot_%d.json", nodecount)) - if err != nil { - t.Fatal(err) - } - jsonbyte, err := ioutil.ReadAll(f) - if err != nil { - t.Fatal(err) - } - var snap simulations.Snapshot - err = json.Unmarshal(jsonbyte, &snap) - if err != nil { - t.Fatal(err) - } - err = net.Load(&snap) - if err != nil { - //TODO: Fix p2p simulation framework to not crash when loading 32-nodes - //t.Fatal(err) - } - - time.Sleep(1 * time.Second) - - triggerChecks := func(trigger chan enode.ID, id enode.ID, rpcclient *rpc.Client, topic string) error { - msgC := make(chan APIMsg) - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - sub, err := rpcclient.Subscribe(ctx, "pss", msgC, "receive", topic) - if err != nil { - t.Fatal(err) - } - go func() { - defer sub.Unsubscribe() - for { - select { - case recvmsg := <-msgC: - idx, _ := binary.Uvarint(recvmsg.Msg) - if !recvmsgs[idx] { - log.Debug("msg recv", "idx", idx, "id", id) - recvmsgs[idx] = true - trigger <- id - } - case <-sub.Err(): - return - } - } - }() - return nil - } - - var topic string - for i, nod := range net.GetNodes() { - nodes[i] = nod.ID() - rpcs[nodes[i]], err = nod.Client() - if err != nil { - t.Fatal(err) - } - if topic == "" { - err = rpcs[nodes[i]].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - } - var pubkey string - err = rpcs[nodes[i]].Call(&pubkey, "pss_getPublicKey") - if err != nil { - t.Fatal(err) - } - pubkeys[nod.ID()] = pubkey - var addrhex string - err = rpcs[nodes[i]].Call(&addrhex, "pss_baseAddr") - if err != nil { - t.Fatal(err) - } - bzzaddrs[nodes[i]] = addrhex - err = triggerChecks(trigger, nodes[i], rpcs[nodes[i]], topic) - if err != nil { - t.Fatal(err) - } - } - - time.Sleep(1 * time.Second) - - // setup workers - jobs := make(chan Job, 10) - for w := 1; w <= 10; w++ { - go worker(w, jobs, rpcs, pubkeys, topic) - } - - time.Sleep(1 * time.Second) - - for i := 0; i < int(msgcount); i++ { - sendnodeidx := rand.Intn(int(nodecount)) - recvnodeidx := rand.Intn(int(nodecount - 1)) - if recvnodeidx >= sendnodeidx { - recvnodeidx++ - } - nodemsgcount[nodes[recvnodeidx]]++ - sentmsgs[i] = make([]byte, 8) - c := binary.PutUvarint(sentmsgs[i], uint64(i)) - if c == 0 { - t.Fatal("0 byte message") - } - if err != nil { - t.Fatal(err) - } - err = rpcs[nodes[sendnodeidx]].Call(nil, "pss_setPeerPublicKey", pubkeys[nodes[recvnodeidx]], topic, bzzaddrs[nodes[recvnodeidx]]) - if err != nil { - t.Fatal(err) - } - - jobs <- Job{ - Msg: sentmsgs[i], - SendNode: nodes[sendnodeidx], - RecvNode: nodes[recvnodeidx], - } - } - - finalmsgcount := 0 - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) - defer cancel() -outer: - for i := 0; i < int(msgcount); i++ { - select { - case id := <-trigger: - nodemsgcount[id]-- - finalmsgcount++ - case <-ctx.Done(): - log.Warn("timeout") - break outer - } - } - - for i, msg := range recvmsgs { - if !msg { - log.Debug("missing message", "idx", i) - } - } - t.Logf("%d of %d messages received", finalmsgcount, msgcount) - - if finalmsgcount != int(msgcount) { - t.Fatalf("%d messages were not received", int(msgcount)-finalmsgcount) - } - -} - -// check that in a network of a -> b -> c -> a -// a doesn't receive a sent message twice -func TestDeduplication(t *testing.T) { - var err error - - clients, err := setupNetwork(3, false) - if err != nil { - t.Fatal(err) - } - - var addrsize = 32 - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - var xoaddrhex string - err = clients[2].Call(&xoaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 3 baseaddr fail: %v", err) - } - xoaddrhex = xoaddrhex[:2+(addrsize*2)] - - log.Info("peer", "l", loaddrhex, "r", roaddrhex, "x", xoaddrhex) - - var topic string - err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Millisecond * 250) - - // retrieve public key from pss instance - // set this public key reciprocally - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get receivenode pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 500) // replace with hive healthy code - - rmsgC := make(chan APIMsg) - rctx, cancel := context.WithTimeout(context.Background(), time.Second*1) - defer cancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic) - log.Trace("rsub", "id", rsub) - defer rsub.Unsubscribe() - - // store public key for recipient - // zero-length address means forward to all - // we have just two peers, they will be in proxbin, and will both receive - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, "0x") - if err != nil { - t.Fatal(err) - } - - // send and verify delivery - rmsg := []byte("xyzzy") - err = clients[0].Call(nil, "pss_sendAsym", rpubkey, topic, hexutil.Encode(rmsg)) - if err != nil { - t.Fatal(err) - } - - var receivedok bool -OUTER: - for { - select { - case <-rmsgC: - if receivedok { - t.Fatalf("duplicate message received") - } - receivedok = true - case <-rctx.Done(): - break OUTER - } - } - if !receivedok { - t.Fatalf("message did not arrive") - } -} - -// symmetric send performance with varying message sizes -func BenchmarkSymkeySend(b *testing.B) { - b.Run(fmt.Sprintf("%d", 256), benchmarkSymKeySend) - b.Run(fmt.Sprintf("%d", 1024), benchmarkSymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024), benchmarkSymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024*10), benchmarkSymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024*100), benchmarkSymKeySend) -} - -func benchmarkSymKeySend(b *testing.B) { - msgsizestring := strings.Split(b.Name(), "/") - if len(msgsizestring) != 2 { - b.Fatalf("benchmark called without msgsize param") - } - msgsize, err := strconv.ParseInt(msgsizestring[1], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid msgsize param '%s': %v", msgsizestring[1], err) - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - ps := newTestPss(privkey, nil, nil) - msg := make([]byte, msgsize) - rand.Read(msg) - topic := BytesToTopic([]byte("foo")) - to := make(PssAddress, 32) - copy(to[:], network.RandomAddr().Over()) - symkeyid, err := ps.GenerateSymmetricKey(topic, &to, true) - if err != nil { - b.Fatalf("could not generate symkey: %v", err) - } - symkey, err := ps.w.GetSymKey(symkeyid) - if err != nil { - b.Fatalf("could not retrieve symkey: %v", err) - } - ps.SetSymmetricKey(symkey, topic, &to, false) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - ps.SendSym(symkeyid, topic, msg) - } -} - -// asymmetric send performance with varying message sizes -func BenchmarkAsymkeySend(b *testing.B) { - b.Run(fmt.Sprintf("%d", 256), benchmarkAsymKeySend) - b.Run(fmt.Sprintf("%d", 1024), benchmarkAsymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024), benchmarkAsymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024*10), benchmarkAsymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024*100), benchmarkAsymKeySend) -} - -func benchmarkAsymKeySend(b *testing.B) { - msgsizestring := strings.Split(b.Name(), "/") - if len(msgsizestring) != 2 { - b.Fatalf("benchmark called without msgsize param") - } - msgsize, err := strconv.ParseInt(msgsizestring[1], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid msgsize param '%s': %v", msgsizestring[1], err) - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - ps := newTestPss(privkey, nil, nil) - msg := make([]byte, msgsize) - rand.Read(msg) - topic := BytesToTopic([]byte("foo")) - to := make(PssAddress, 32) - copy(to[:], network.RandomAddr().Over()) - ps.SetPeerPublicKey(&privkey.PublicKey, topic, &to) - b.ResetTimer() - for i := 0; i < b.N; i++ { - ps.SendAsym(common.ToHex(crypto.FromECDSAPub(&privkey.PublicKey)), topic, msg) - } -} -func BenchmarkSymkeyBruteforceChangeaddr(b *testing.B) { - for i := 100; i < 100000; i = i * 10 { - for j := 32; j < 10000; j = j * 8 { - b.Run(fmt.Sprintf("%d/%d", i, j), benchmarkSymkeyBruteforceChangeaddr) - } - //b.Run(fmt.Sprintf("%d", i), benchmarkSymkeyBruteforceChangeaddr) - } -} - -// decrypt performance using symkey cache, worst case -// (decrypt key always last in cache) -func benchmarkSymkeyBruteforceChangeaddr(b *testing.B) { - keycountstring := strings.Split(b.Name(), "/") - cachesize := int64(0) - var ps *Pss - if len(keycountstring) < 2 { - b.Fatalf("benchmark called without count param") - } - keycount, err := strconv.ParseInt(keycountstring[1], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid count param '%s': %v", keycountstring[1], err) - } - if len(keycountstring) == 3 { - cachesize, err = strconv.ParseInt(keycountstring[2], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid cachesize '%s': %v", keycountstring[2], err) - } - } - pssmsgs := make([]*PssMsg, 0, keycount) - var keyid string - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - if cachesize > 0 { - ps = newTestPss(privkey, nil, &PssParams{SymKeyCacheCapacity: int(cachesize)}) - } else { - ps = newTestPss(privkey, nil, nil) - } - topic := BytesToTopic([]byte("foo")) - for i := 0; i < int(keycount); i++ { - to := make(PssAddress, 32) - copy(to[:], network.RandomAddr().Over()) - keyid, err = ps.GenerateSymmetricKey(topic, &to, true) - if err != nil { - b.Fatalf("cant generate symkey #%d: %v", i, err) - } - symkey, err := ps.w.GetSymKey(keyid) - if err != nil { - b.Fatalf("could not retrieve symkey %s: %v", keyid, err) - } - wparams := &whisper.MessageParams{ - TTL: defaultWhisperTTL, - KeySym: symkey, - Topic: whisper.TopicType(topic), - WorkTime: defaultWhisperWorkTime, - PoW: defaultWhisperPoW, - Payload: []byte("xyzzy"), - Padding: []byte("1234567890abcdef"), - } - woutmsg, err := whisper.NewSentMessage(wparams) - if err != nil { - b.Fatalf("could not create whisper message: %v", err) - } - env, err := woutmsg.Wrap(wparams) - if err != nil { - b.Fatalf("could not generate whisper envelope: %v", err) - } - ps.Register(&topic, func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - return nil - }) - pssmsgs = append(pssmsgs, &PssMsg{ - To: to, - Payload: env, - }) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - if err := ps.process(pssmsgs[len(pssmsgs)-(i%len(pssmsgs))-1]); err != nil { - b.Fatalf("pss processing failed: %v", err) - } - } -} - -func BenchmarkSymkeyBruteforceSameaddr(b *testing.B) { - for i := 100; i < 100000; i = i * 10 { - for j := 32; j < 10000; j = j * 8 { - b.Run(fmt.Sprintf("%d/%d", i, j), benchmarkSymkeyBruteforceSameaddr) - } - } -} - -// decrypt performance using symkey cache, best case -// (decrypt key always first in cache) -func benchmarkSymkeyBruteforceSameaddr(b *testing.B) { - var keyid string - var ps *Pss - cachesize := int64(0) - keycountstring := strings.Split(b.Name(), "/") - if len(keycountstring) < 2 { - b.Fatalf("benchmark called without count param") - } - keycount, err := strconv.ParseInt(keycountstring[1], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid count param '%s': %v", keycountstring[1], err) - } - if len(keycountstring) == 3 { - cachesize, err = strconv.ParseInt(keycountstring[2], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid cachesize '%s': %v", keycountstring[2], err) - } - } - addr := make([]PssAddress, keycount) - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - if cachesize > 0 { - ps = newTestPss(privkey, nil, &PssParams{SymKeyCacheCapacity: int(cachesize)}) - } else { - ps = newTestPss(privkey, nil, nil) - } - topic := BytesToTopic([]byte("foo")) - for i := 0; i < int(keycount); i++ { - copy(addr[i], network.RandomAddr().Over()) - keyid, err = ps.GenerateSymmetricKey(topic, &addr[i], true) - if err != nil { - b.Fatalf("cant generate symkey #%d: %v", i, err) - } - - } - symkey, err := ps.w.GetSymKey(keyid) - if err != nil { - b.Fatalf("could not retrieve symkey %s: %v", keyid, err) - } - wparams := &whisper.MessageParams{ - TTL: defaultWhisperTTL, - KeySym: symkey, - Topic: whisper.TopicType(topic), - WorkTime: defaultWhisperWorkTime, - PoW: defaultWhisperPoW, - Payload: []byte("xyzzy"), - Padding: []byte("1234567890abcdef"), - } - woutmsg, err := whisper.NewSentMessage(wparams) - if err != nil { - b.Fatalf("could not create whisper message: %v", err) - } - env, err := woutmsg.Wrap(wparams) - if err != nil { - b.Fatalf("could not generate whisper envelope: %v", err) - } - ps.Register(&topic, func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - return nil - }) - pssmsg := &PssMsg{ - To: addr[len(addr)-1][:], - Payload: env, - } - for i := 0; i < b.N; i++ { - if err := ps.process(pssmsg); err != nil { - b.Fatalf("pss processing failed: %v", err) - } - } -} - -// setup simulated network with bzz/discovery and pss services. -// connects nodes in a circle -// if allowRaw is set, omission of builtin pss encryption is enabled (see PssParams) -func setupNetwork(numnodes int, allowRaw bool) (clients []*rpc.Client, err error) { - nodes := make([]*simulations.Node, numnodes) - clients = make([]*rpc.Client, numnodes) - if numnodes < 2 { - return nil, fmt.Errorf("Minimum two nodes in network") - } - adapter := adapters.NewSimAdapter(newServices(allowRaw)) - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: "bzz", - }) - for i := 0; i < numnodes; i++ { - nodeconf := adapters.RandomNodeConfig() - nodeconf.Services = []string{"bzz", pssProtocolName} - nodes[i], err = net.NewNodeWithConfig(nodeconf) - if err != nil { - return nil, fmt.Errorf("error creating node 1: %v", err) - } - err = net.Start(nodes[i].ID()) - if err != nil { - return nil, fmt.Errorf("error starting node 1: %v", err) - } - if i > 0 { - err = net.Connect(nodes[i].ID(), nodes[i-1].ID()) - if err != nil { - return nil, fmt.Errorf("error connecting nodes: %v", err) - } - } - clients[i], err = nodes[i].Client() - if err != nil { - return nil, fmt.Errorf("create node 1 rpc client fail: %v", err) - } - } - if numnodes > 2 { - err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID()) - if err != nil { - return nil, fmt.Errorf("error connecting first and last nodes") - } - } - return clients, nil -} - -func newServices(allowRaw bool) adapters.Services { - stateStore := state.NewInmemoryStore() - kademlias := make(map[enode.ID]*network.Kademlia) - kademlia := func(id enode.ID) *network.Kademlia { - if k, ok := kademlias[id]; ok { - return k - } - params := network.NewKadParams() - params.MinProxBinSize = 2 - params.MaxBinSize = 3 - params.MinBinSize = 1 - params.MaxRetries = 1000 - params.RetryExponent = 2 - params.RetryInterval = 1000000 - kademlias[id] = network.NewKademlia(id[:], params) - return kademlias[id] - } - return adapters.Services{ - pssProtocolName: func(ctx *adapters.ServiceContext) (node.Service, error) { - // execadapter does not exec init() - initTest() - - ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctxlocal) - privkey, err := w.GetPrivateKey(keys) - pssp := NewPssParams().WithPrivateKey(privkey) - pssp.AllowRaw = allowRaw - pskad := kademlia(ctx.Config.ID) - ps, err := NewPss(pskad, pssp) - if err != nil { - return nil, err - } - - ping := &Ping{ - OutC: make(chan bool), - Pong: true, - } - p2pp := NewPingProtocol(ping) - pp, err := RegisterProtocol(ps, &PingTopic, PingProtocol, p2pp, &ProtocolParams{Asymmetric: true}) - if err != nil { - return nil, err - } - if useHandshake { - SetHandshakeController(ps, NewHandshakeParams()) - } - ps.Register(&PingTopic, pp.Handle) - ps.addAPI(rpc.API{ - Namespace: "psstest", - Version: "0.3", - Service: NewAPITest(ps), - Public: false, - }) - if err != nil { - log.Error("Couldnt register pss protocol", "err", err) - os.Exit(1) - } - pssprotocols[ctx.Config.ID.String()] = &protoCtrl{ - C: ping.OutC, - protocol: pp, - run: p2pp.Run, - } - return ps, nil - }, - "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil - }, - } -} - -func newTestPss(privkey *ecdsa.PrivateKey, kad *network.Kademlia, ppextra *PssParams) *Pss { - nid := enode.PubkeyToIDV4(&privkey.PublicKey) - // set up routing if kademlia is not passed to us - if kad == nil { - kp := network.NewKadParams() - kp.MinProxBinSize = 3 - kad = network.NewKademlia(nid[:], kp) - } - - // create pss - pp := NewPssParams().WithPrivateKey(privkey) - if ppextra != nil { - pp.SymKeyCacheCapacity = ppextra.SymKeyCacheCapacity - } - ps, err := NewPss(kad, pp) - if err != nil { - return nil - } - ps.Start(nil) - - return ps -} - -// API calls for test/development use -type APITest struct { - *Pss -} - -func NewAPITest(ps *Pss) *APITest { - return &APITest{Pss: ps} -} - -func (apitest *APITest) SetSymKeys(pubkeyid string, recvsymkey []byte, sendsymkey []byte, limit uint16, topic Topic, to PssAddress) ([2]string, error) { - recvsymkeyid, err := apitest.SetSymmetricKey(recvsymkey, topic, &to, true) - if err != nil { - return [2]string{}, err - } - sendsymkeyid, err := apitest.SetSymmetricKey(sendsymkey, topic, &to, false) - if err != nil { - return [2]string{}, err - } - return [2]string{recvsymkeyid, sendsymkeyid}, nil -} - -func (apitest *APITest) Clean() (int, error) { - return apitest.Pss.cleanKeys(), nil -} - -// enableMetrics is starting InfluxDB reporter so that we collect stats when running tests locally -func enableMetrics() { - metrics.Enabled = true - go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 1*time.Second, "http://localhost:8086", "metrics", "admin", "admin", "swarm.", map[string]string{ - "host": "test", - }) -} diff --git a/swarm/pss/testdata/addpsstodiscoverytestsnapshot.pl b/swarm/pss/testdata/addpsstodiscoverytestsnapshot.pl deleted file mode 100644 index b75cc9894add..000000000000 --- a/swarm/pss/testdata/addpsstodiscoverytestsnapshot.pl +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/perl - -use JSON; - -my $f; -my $jsontext; -my $nodelist; -my $network; - -open($f, "<", $ARGV[0]) || die "cant open " . $ARGV[0]; -while (<$f>) { - $jsontext .= $_; -} -close($f); - -$network = decode_json($jsontext); -$nodelist = $network->{'nodes'}; - -for ($i = 0; $i < 0+@$nodelist; $i++) { - #my $protocollist = $$nodelist[$i]{'node'}{'info'}{'protocols'}; - #$$protocollist{'pss'} = "pss"; - my $svc = $$nodelist[$i]{'node'}{'config'}{'services'}; - pop(@$svc); - push(@$svc, "pss"); - push(@$svc, "bzz"); -} - -print encode_json($network); diff --git a/swarm/pss/testdata/addpsstodiscoverytestsnapshot.sh b/swarm/pss/testdata/addpsstodiscoverytestsnapshot.sh deleted file mode 100644 index 7d3c2849169d..000000000000 --- a/swarm/pss/testdata/addpsstodiscoverytestsnapshot.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -sed -e 's/\(\"services\"\):\["discovery\"]/\1:["pss","bzz"]/' diff --git a/swarm/pss/testdata/snapshot_128.json b/swarm/pss/testdata/snapshot_128.json deleted file mode 100644 index 7bafd358fb22..000000000000 --- a/swarm/pss/testdata/snapshot_128.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","private_key":"79eaaa1c3a9339a90cf54c511649caf683f2910588a872d2c12919355b7d5d28","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","private_key":"b067839f81534251ade8651e682dbd8324dfb83c7034aff4a48909e9310c990a","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","private_key":"4233e4c480ae197c265975cc7c83cc7b0cf1a8d67e4728bac4bcecaee63ad935","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","private_key":"ca0c9f1baad4f60ddeaafe287d43b4ef8ec4b96c4ef12da194074325ca6cc4ef","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","private_key":"b6c09a581c2a6d85a63c11e586391346fe9d9d24292de15333ae230a33c52c1e","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","private_key":"378e3e11e738557d2eea27e070d52c8355f8abe0c5f8607ac0792455a1d50bae","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","private_key":"e6710b29bb9b7f00ee1e921bd548fc7622d73a0aae3f25de7a3f3650191147a8","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","private_key":"2bed1cf9737dbf8239f560ab8b4e57dc47cf57a28ebd203e6fb159093fbe52c0","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","private_key":"3f63c3dd3bf2b5be6e9af3ce596eb65cb58a36749d0baff1759d8dc6f4da8993","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","private_key":"38ffbfff1b5ab2f905daabcbbc12a5e28aad826a80d0a40988a04d6653942a50","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","private_key":"aa2cc30f2f6e589ca122890fc95845f4a81ad7e57f2661343ff6af3d401c46f3","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","private_key":"5b4a4da121c72f3d0d453394e6f09fc9ddaa5a13e44acb1ef6684867b4cac14c","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","private_key":"98f5b9f4be5d997b66834ae619c58f54d941623dfcb9a6783bfce77fdb3f3d4b","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","private_key":"cbbe3c5ab5aafd2dae03deda6db9a3e7e58ffaad5c1edd37d7a13951aa733590","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","private_key":"62a83d45655860933bf8a2348695dd695176f3225f4ba72e70284b648130d330","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","private_key":"8c72a0c564073065c5300e822a476fe3dd8b373cfd0dabaf0cdb056ca0ece2f9","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","private_key":"b6eb72555f9952a32406b7576ac85ead5cbe9004f37b6ebe8f7c3b6e17973104","name":"node17","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","private_key":"e9bdb2a275f0f2fd6ef4266bca55fad475c5d9e4ee0db2951ae91fd629cb2029","name":"node18","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","private_key":"d9a2bcdb02288fd5844d0be689ea4286f27991bfc82c76f6050a3e3d2f0858a1","name":"node19","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","private_key":"8ee0c4634570903c3d7383adb12cd35a82bb1c9be593755bd77c90a1bd6bbdfe","name":"node20","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","private_key":"16df12116ebc93bdc671ba1351bf03b763d3e67b2c9c468e56177c80b0dcbf84","name":"node21","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","private_key":"1a78b7fedaab9310b17675717481b1331eed3fa3c77cd96addf6bf9abd778aae","name":"node22","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","private_key":"3d37e996f181b4f57d5c5a61a07f86f1869c760604dfe9166d5b3552acf1a43b","name":"node23","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","private_key":"5895ce723440eaa77daf0a8779cc52992427524e420e3ce71ce1b24f3bd4658c","name":"node24","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","private_key":"cf20ef905d7d3d1141c472afefd12332bff10edecc695e409af38086c7a1a5d1","name":"node25","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","private_key":"1a7c744024c7baee8c43425861a5a4ff2ea80533fe6549a58e61b50c93059fed","name":"node26","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","private_key":"7399aa5562abb3ca2add08c810d607ad6fed7a036622eaea561da8a5aa51c0af","name":"node27","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","private_key":"ded7b34b0c8218bfba59e8d061b50cea365a9f137b9a66064e2287ef660dc789","name":"node28","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","private_key":"39ac5498c92329fc18c4eb0ec36cca3c5270f322084a1fc42fad1be0b5f32081","name":"node29","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","private_key":"add3ad2926ebf0b30f111796475cf160bcd1f1756866dfaa19e048c6954975c9","name":"node30","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","private_key":"d5290ae40b68ae7b51fe7ce7d83ab96841aa97a3457fc1bcf70065a2d2b60c20","name":"node31","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","private_key":"ba7abd532b10496c6363f35e231ff80aef25246315302fd138dd977d5ece20e5","name":"node32","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","private_key":"e58bb287592c2b89814ed3475004f5c9b2eb226483fcb8235619b6b42747d10c","name":"node33","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","private_key":"53e9afc6c039fee226bd9a0b537355f23e93457dc0eabbdce75e4d1ad7a473e6","name":"node34","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","private_key":"079cf6730627562bbbff031d22ab1ae9e65b7747497adc327830e5d6768d6b04","name":"node35","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","private_key":"c3157fe034d3a477f697b756cd9ae1de532b0ae42bb5039f6d2bf399bb2ddbbd","name":"node36","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","private_key":"d4472d7bc821536231d70dbdb3f0a5e3fdd104dcbf5a97c9521b0778d9491680","name":"node37","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","private_key":"23c79a6a5af06f9e9cdb6f4b4e40e25eca8793ac91db22cde17e0a3851c1f48e","name":"node38","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","private_key":"0295fa1706ccdcbdc8d7943b8d2011c6f46225d85b574d2d02b4a8dec66f9a29","name":"node39","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","private_key":"34d1685a48b56e62b30247fffb44ba2b41f2d806344fe52f7dc9049a778c667f","name":"node40","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","private_key":"b6273af6a94c07db54566d0d2f93121d0ddf239921e8e46af19babd2fa9930a7","name":"node41","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","private_key":"362244251a7f1bf4bc855ff3b272b1c7c7fe5d8338af0c581fee2f49e2939ed8","name":"node42","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","private_key":"bf6cd10025d018c0abfae2c88aa7c46c3d12d612580e6b4aacdc51fd52476270","name":"node43","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","private_key":"0659e3a41adc716b493c6ad765c5b26d35c95a1edb254efc8ab967e71e3e0a16","name":"node44","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","private_key":"f6d48b4c10f3257bba2f626d48192d94a1b1de3ab1480b618a0bff07eb20396e","name":"node45","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","private_key":"4a487eb7a3b924414d988104fce6f87a70502db2d5d71dcbc1a115b37212cb06","name":"node46","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","private_key":"9e2309fa485ace73ce907035f5113e7b13e5719c819479b10fd9386a3ad5236f","name":"node47","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","private_key":"e511c730e803371042c631512a12d74b1c31a53caab237719b8fa007e4cef9ea","name":"node48","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","private_key":"bb4c6b3c0931311ef5e31087f74a1a95aa39da470737c4c1a2a730ea2cac1c76","name":"node49","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","private_key":"88c0abdb64c6dee8117b7b720d5782321ce583fcc76e6eed2ee1f6279a82ea39","name":"node50","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","private_key":"e6eef1e846329e10e247843f7cee455af8ad3579e5a1e6360aea0ecc51982759","name":"node51","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","private_key":"ffd961376b67cbfafd47d89610291ec8fc2af2c16bc31e6851f804e15b2e9cd7","name":"node52","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","private_key":"db9ca337fd3ecf30fa6c217606072c214028b8d723ce82de57cfb4f0266a653d","name":"node53","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","private_key":"40e9de0543bd2c35509ebfcf51aa5a543d9616831505b5644e982144f4971f3a","name":"node54","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","private_key":"f2806927e5ba924b002b05116a66bdd62d4eed7900e91f3e31892288bd06ebd1","name":"node55","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","private_key":"f38a84e8d30f9c12d52071b696ff7fbd355dc875cbf937d2f491f4f3e193fc8e","name":"node56","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","private_key":"a3895eb5276ca39ba15c02895c3537a6c3a7be75de7b2ee2bee1fc5b9a313240","name":"node57","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","private_key":"8135cdd3f1b3d517b1f4a11407dfcdf6a31b3dc087ddfe2224999f16ee7ca9de","name":"node58","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","private_key":"29e270aecc8603f2224bee7f11039231b7a28efc5b29deeb9d98d0af388a87d0","name":"node59","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","private_key":"04d1ab0b03908f14773c60464c51526f925e192645efc3781a7117f22bdc4835","name":"node60","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","private_key":"f7320ebd494ac4fd8d6871123b7531dee97fba428ff30994f4d3ecc3f9312001","name":"node61","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","private_key":"b71a899f42faf2bdf9824d145f6f5959178f61f05e460e888c862ba8b03b5448","name":"node62","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","private_key":"43ea846524b82ef37cdaa1546b555e1a8d7510fc0cc7f11a6e040b79a5fcf054","name":"node63","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","private_key":"0f863dee7eca46274fc2ec03645bf96424ffebbe6f5c26631051127cf730e223","name":"node64","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","private_key":"a70d3a2696371a3cdee8702bbc4b008a564f36a8570b3bef778d00e5c4bc7da6","name":"node65","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","private_key":"24cc61b4c4e59317c2927bd635bd3ad2863c0598321f0e5d60c3b534ed151558","name":"node66","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","private_key":"36459a9e26fc4c00dd4c89bdf4c86c717b9701169ad7154228b8fbfff55661d9","name":"node67","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","private_key":"b947082437b645032dfff6e9d20e2eed52aace2d5e29cc268b06898cededdabd","name":"node68","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","private_key":"5ac248334fa8c619d900ac284274784dc99fe0ae517e749c989a15bad1652ccf","name":"node69","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","private_key":"7c46fa70253c48efad70d0b3da97e5c5680b1fb430147ac6f821729a836c667d","name":"node70","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","private_key":"2d39f1bc0c0b3b7bdd1b9ef4fdfd54dd5b7db9743a16baa7c5f8b50948062e8d","name":"node71","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","private_key":"d4e45cb0946161c0f4333c4db19bdeabceb81b4db44982a776556e8da0bf3928","name":"node72","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","private_key":"df8fd4bcf5cb62281500f76bc0b09d7ac1576ffd0edadbb8d39301406ac8e0fd","name":"node73","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","private_key":"5ec7e6e237997309e30846fed2a2074e5a150ae82804f581cb4a69ea69fe0118","name":"node74","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","private_key":"06d5dc287feafe3797b6302002258d7ea058679dc501e7a05f64fabd41b1b701","name":"node75","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","private_key":"a06a77e7469d86991954524d4a1495b5aeb80bb413c0b1293479dcc8ce511108","name":"node76","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","private_key":"9e6c3d21c05d371fd69225b2eef1d1eabedad577ae026b6d8ad8f728a53d657b","name":"node77","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","private_key":"cd8b5f4a6c0d361bc118318b1f1c5e69ef7b546e5ded44742e97124cfb80c52e","name":"node78","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","private_key":"04ed808eb12d991a68104f16e8965f3e6d60ba0b0dabff4fe33b3878c63d25f7","name":"node79","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","private_key":"175d97bb42b8f0effb21274a929a499f0e49e8e6ecad97b853a164464ad20bde","name":"node80","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","private_key":"34dbf4adc051f2ab18ea18c1faaec6726857cc5e0fcb3181fb296a723d2971c7","name":"node81","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","private_key":"21c776bf36961c727b36ff521a7527764077944b7932dfb901ca6489b2e123e7","name":"node82","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","private_key":"db4ace065dad27967a83ad918dedd4b4d7b1aaa331057ca1a2033fcba3e16df6","name":"node83","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","private_key":"2642ed9d36375a48a74d6aee878a935a15e7bd219d39bbdf455b0a168c98a8b5","name":"node84","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","private_key":"c1c1f7cd104f6f7163fe144041570269558b335ae6ddbdb80c79687faf55f5bb","name":"node85","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","private_key":"89501ac0b58fa2ee82ba6ef2b45a3c0ab6d8f54f4b92da1111d97ecfedbf5fc3","name":"node86","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","private_key":"cf649d632a25375b28cc6f7821de3e0df16b52ad9e0ff8978b231e20d6ed37ee","name":"node87","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","private_key":"bceddc4ac81042ad71089e4c861518f8d018601263d1faa17238f1c326e4b317","name":"node88","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","private_key":"a870aecb16e345ef241f69348d08489eb250b113f2072ab6371dda815d799f3f","name":"node89","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","private_key":"07af0af8e7e43f2822c2c0c3d34a1742faf6e11328b6194a760e9acefb5dedc8","name":"node90","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","private_key":"683b9cd98aab26ece4c2e53dd44a1fde3ae2303f80f99dc7e7e5d4b80e5a40e2","name":"node91","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","private_key":"31b3da34d338fb902b718378f7b5ebbdcdff30e4e3d3deff8b021e3979a7c6de","name":"node92","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","private_key":"997bcdc19c47350a268aa991a33d767bb6fc29de16593e0b099e793aa1db638d","name":"node93","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","private_key":"393e54787cdfec2d8d987f785700170fbcb31fd541c9c05199cd77d3a16a6dc4","name":"node94","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","private_key":"0cd4a911f2b1193b22efc0823fc2ed9beddafb7705f5597ce6d7335aadae0e1a","name":"node95","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","private_key":"fb0590eb4eb2624363f0740cbc794f9adb8356ccbaf6650c8baca183edfde3b8","name":"node96","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","private_key":"40d4caee240073f0bfc9307eed26d4286f944f467837b7250ee206f40d2880d4","name":"node97","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","private_key":"207c5a4e99506c7afdfff66611cf0baefe929f7c8a1a7a802cb44df3fa650618","name":"node98","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","private_key":"fa964e311f099e564ffa3ff9820a9ad3a8723f738fce6da11be604636f275831","name":"node99","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","private_key":"23f2913103e5295ddfdc6485c2ea3c33bfda3e0ceea62cac5401ceabdda0668a","name":"node100","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","private_key":"f3c37d7a8e80e1e71fba834055bf934536fd9e117f496b156d46bca96632ba5c","name":"node101","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","private_key":"f4151729479b0ae76a7b853aa9d3460ee67adcedc364ac97248fb383478ba113","name":"node102","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","private_key":"482aa546e8e665988c7329424342961c10084e439d562aed129d21a8c212d007","name":"node103","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","private_key":"2641708c3c6101db41db1a7eba5ed6b54e7ebc3014cb575ed71d291a6aacfc28","name":"node104","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","private_key":"9b9c1c2253292c4de58f82fd6bba15922acfa246fa0717a869c0d651ce19e826","name":"node105","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","private_key":"7cc79c34ac4847aaba7f1e2de8d23910301dbfe606d052cce33ad0340a1f82fb","name":"node106","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","private_key":"4047502d07951bf2380ef595036f9e99db3b0f7e1229040e21da5fbc49e7d820","name":"node107","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","private_key":"02a6713184cf6e413a6ed6a6839150cad9c72d40951b265a754e56b5bdb74cbf","name":"node108","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","private_key":"12d74d71de5166524deeed2ba475f9ad46c296668af272f0ade12162bed0f50f","name":"node109","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","private_key":"4fff513c0f905a42d6d18a90ae6a78c60757490480579162c9e0760361baf184","name":"node110","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","private_key":"5db638bd9bfaf4c2e1af1f3f1dc1e89382a6a2982f303fc80504b44aac1a6264","name":"node111","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","private_key":"6caa9dcb10b84a658d4ef791909b6532395f0793f9f8bce99a3a1b985ce619b9","name":"node112","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","private_key":"63375740be7dc5d3a76a7b3249786a4c7382eaf8b648e5a39a7a850722bad29a","name":"node113","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","private_key":"110a610c6c2f1720584929baf4ab9c8490923fc7b421bd251e444b752f8f8957","name":"node114","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","private_key":"7a8380aa7312fe4859408a51876e9f44b56151086e4bc36569a8f55bfb3a007b","name":"node115","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","private_key":"1e498dce32dcdfdf4b6c691fa203e3809fddf1b19b1b1da0b1162b9037ecc303","name":"node116","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","private_key":"03de0803048f078de61e3eef039a9ecb0e761216573392a6692630f3f291cc25","name":"node117","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","private_key":"934aa39349989614a1b0a71785880e61c60bb2579a9d52b832887849de94ec24","name":"node118","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","private_key":"011d6fce7eed10fc8c5a7a9ca21769efc6581023c2c857c28d97a6ebb1c43a53","name":"node119","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","private_key":"76d98f9c684d01fe8121cf715f01457e9fc38146a717958c8bb325a3b4ea44ce","name":"node120","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","private_key":"7aa614585809bea3b748e6df2e1a8da2b201a9ae84f11c819b5669234a10f76d","name":"node121","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","private_key":"71857ed16ee507ae0dd576370348a196d43274a3895f26fb8659ec79c1ecb79c","name":"node122","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","private_key":"3e5c543d406054ba1338ea28c37198eb8153a157eb5a0aecc186dceb04e10632","name":"node123","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","private_key":"3771d716bd74a4be3b8e154d3aa3b2302700b5ca1607923f7414c147a7cf67b7","name":"node124","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","private_key":"25dc939bff90ac541a61b59e0d2b4d3b9891379de3893645f06891c5be0d5695","name":"node125","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","private_key":"e6ad803abcef9554bdff08a4f4b6a7a65dc574bf92d32ee882413c9269fd31f3","name":"node126","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","private_key":"a482a87960aae2e446cd2aeb304e7baeff9a24d2bace4d5f919b5bda00a5f0eb","name":"node127","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","private_key":"214126811a121d6fc0443ce66e59372bc72dea9e220ab6e7d6da961741590d47","name":"node128","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":true},{"one":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","other":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":true},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","up":true},{"one":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","other":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","up":true},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","up":true},{"one":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","up":true},{"one":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":true},{"one":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","up":true},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":false},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":false},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":false},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":false},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":false},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":false},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":false},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":false},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":false},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":false},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":false},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":false},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":false},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":false},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":false},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":false},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":false},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":false},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":false},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":false},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":false},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":false},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":false},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":false},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","up":false},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":false},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":false},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":false},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":false},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":false},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":false},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":false},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":false},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":false},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","up":false},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":false},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":false},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":false},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":false},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":false},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","up":false},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":false},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":false},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":false},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","up":false},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","up":false},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":false},{"one":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":false},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":false},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":false},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":false},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","up":false},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":false},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":false},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":false},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":false},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":false},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","up":false},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":false},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":false},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":false},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":false},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":false},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","up":false},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":false},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":false},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":false},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":false},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":false},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","up":false},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":false},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":false},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":false},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":false},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":false},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":false},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":false},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":false},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":false},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","up":false},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":false},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":false},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":false},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":false},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":false},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":false},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","up":false},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":false},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":false},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":false},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":false},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":false}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_16.json b/swarm/pss/testdata/snapshot_16.json deleted file mode 100644 index d35df9fc9b55..000000000000 --- a/swarm/pss/testdata/snapshot_16.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","private_key":"2c268d9cf0ca43f4b0ad80f8980f4fe019e0294819f881d505e02382b472b98b","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","private_key":"69ac59cce230e49f10c769fc8f2b717bdadc5ffa5dcf7fae19d8cb15315fa177","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","private_key":"b793f9ace49ecce16c0c86b49495093f7f4c5fa0003675c9eb6efa802c8daafe","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","private_key":"9fecef44b474621ce2ddd57cf67df319bd0e13c27f0f6e9d060c34ef813675ea","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","private_key":"c8f4336f88c90242744e9c04fba1a55027d9ad4295b7a2b0ad99e8dae12463d3","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","private_key":"0ca52c3e4781fc413a13448abaae042dae52e2bab5772c52440bc4b2c6a5bda3","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","private_key":"447c97a6c211160f0fb7990812c637bd346003a484cf05c3d92816007ab3745a","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","private_key":"8fa6ac35409a6df21ee32da8c36f61cd007a3515d23bb350351c263c241b851a","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","private_key":"e4143bd79f4a55f463b623afc397fe0166a144f45c41fd8b58f816e208212819","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","private_key":"6a2a32adb2b5cbc66adf29d5da1123b6e345e73ed42916e9535df3058801cb92","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","private_key":"ae486490233b1b16e6a35461a3b90573f59362b9bbf0b8c46b65c715b0506bd7","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","private_key":"cbf9da4b4f44f44c0bcf69bb2134e33ddfdda7742d7f5609db74bdf4fb683cfb","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","private_key":"180ee0110d87d330dd416568e300cacfd4d52f8c08875ada1a6d5b4a11142b1d","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","private_key":"d7a364b77d55a53453e94e10d235edf4ceb248653247bded6c1df31fc88ecbca","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","private_key":"7eaec2f68f3b0e562a5438324aa30b9c22746af6e8139b05b21e89103f508c5a","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","private_key":"b130fa04ab1f60d0713b9260156457f9139e819cb2f70bd87a2ea409f135f881","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","other":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","up":true},{"one":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","other":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","up":true},{"one":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","other":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","up":true},{"one":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","other":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","up":true},{"one":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","other":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","up":true},{"one":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","other":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","up":true},{"one":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","other":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","up":true},{"one":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","other":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","up":true},{"one":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","other":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","up":true},{"one":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","other":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","up":true},{"one":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","other":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","up":true},{"one":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","other":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","up":true},{"one":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","other":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","up":true},{"one":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","other":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","up":true},{"one":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","other":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","up":true},{"one":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","other":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","up":true},{"one":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","other":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","up":true},{"one":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","other":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","up":true},{"one":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","other":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","up":true},{"one":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","other":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","up":true},{"one":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","other":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","up":true},{"one":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","other":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","up":true},{"one":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","other":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","other":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","up":true},{"one":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","other":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","up":true},{"one":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","other":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","up":true},{"one":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","other":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","up":true},{"one":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","other":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","up":true},{"one":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","other":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","up":true},{"one":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","other":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","up":true},{"one":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","other":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","up":true},{"one":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","other":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","up":true},{"one":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","other":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_2.json b/swarm/pss/testdata/snapshot_2.json deleted file mode 100644 index b01ce303802a..000000000000 --- a/swarm/pss/testdata/snapshot_2.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","private_key":"e567b7d9c554e5102cdc99b6523bace02dbb8951415c8816d82ba2d2e97fa23b","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","private_key":"c7526db70acd02f36d3b201ef3e1d85e38c52bee6931453213dbc5edec4d0976","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_256.json b/swarm/pss/testdata/snapshot_256.json deleted file mode 100644 index 4397a7ea7d51..000000000000 --- a/swarm/pss/testdata/snapshot_256.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","private_key":"c4e98d074abce07e849be2810e5522bdacf2489125ed7577e02b4809f9619700","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","private_key":"d607b8638fa33ef417d88597579e00a2f93e76881193a8692b57d03b27a60ba7","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","private_key":"c4501aa97316685b3e707bd881c1d805e96430723fa88ffc60e1703485eff5b2","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","private_key":"f1fceda785676921048d116f40e4d331ab32873f4b0343fddbd372c836808f2a","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","private_key":"a5baeb4f2e35eedde63d573bbec157e61f0c0ba6ecc7b6cb6a42759bbc165e5b","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","private_key":"1b7e31744236baa89eaadd57ec870b5415111685fda883490b5a0e1dbc321210","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","private_key":"344f9ff7d68ca6a04e3141646044db06e5761248c64a01bb6cc2813fb7745ae4","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","private_key":"869c03072d8108be18544c579cca53ffe17682e3898f44baff9cc37507fc62ed","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","private_key":"1fe668699f54728124bbf993215de07682f072d145dd8acc428f04abd4a46f08","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","private_key":"a3af1294d727198fb3282659a35ae5b27f4b23b28d76e528809b68a6263fd673","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","private_key":"f7ad4635d864376fa4536bf23df764278d30805556cbf13e794e0ebacf389172","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","private_key":"237183f9e7834a03859c43be2a49bb8e4f1c9c7a5c334958f74d4ed36dfbd5a7","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","private_key":"7f7c361b6989c77419ac69848c9a4b06255aeb0f6115454566cde4ca544af085","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","private_key":"00133d03c85e03bcd54ddefc03d9060009ea78ee5ba1f6f335111f47ab8f433f","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","private_key":"ee3f0e3cca3720aa0727efa92a11ea9252c7fe72fe64c8814de2accbb91d049d","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","private_key":"470d12a7459f9fa9f1adf18e94b60340c5c442eadb1329fa871073e64d6bd7aa","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","private_key":"3450c9c68339a76f1f75fb1f770914dac1cfc5e0cb23d6fd703480beb3ddfd4a","name":"node17","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","private_key":"1df10df7cb050098e9713c3773a47962a6cfea944b53b12fd84563c98dc46e7a","name":"node18","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","private_key":"e699fe1e14d46a5a72d5696e397df71ac0d17abf136dc84d850b658e56881c75","name":"node19","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","private_key":"0974ab51554372614954b68ffb0fdde4a82efdc0bf4e6f802dbc3728cb4b5e47","name":"node20","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","private_key":"14ce7db5594270c24ed48fd5881d6f02b9cc6267731612c5117e4d273d3920ca","name":"node21","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","private_key":"32fa52ca7b60e6953e97635659e4a5153688636594be7f560fc5f8468fdf7022","name":"node22","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","private_key":"d28563bbfb6db23928a66e837cdfa794230537066eeb93063ebeff3f531b12ca","name":"node23","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","private_key":"137533f5c2f9257d2a60c22d205407f3cc14c52ec60fc34666b05dcb935178c7","name":"node24","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","private_key":"1dbab5393fba98797db2a32f7d2ee6ad019bbd9e26ee051313e566bb1e21a1b4","name":"node25","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","private_key":"87a7b7028ee1140af69055fb641d23473c44f238544e3cc23e2909a959d1e091","name":"node26","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","private_key":"102d3a405cf636abf7d0b4e4a1fc0a698dc0d4033c288762ce9cc975b91db032","name":"node27","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","private_key":"d8ecd7e813dbc7683f773cf38cd0e344ee9b4e308f12f557b6642eda2ef88ea1","name":"node28","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","private_key":"225f43e03ffb8a97b760538a5cb9cddb61e7a387a3e56e82160300ed8c53e073","name":"node29","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","private_key":"75acc8059053d23505c4513dbfd60777918db43c9713b3577c36836f066e31af","name":"node30","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","private_key":"d6bd6c72597f6ec178becb6cdf6520d7de3f1278f77aa42095d287f45513b1f2","name":"node31","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","private_key":"b329bd7d93dbc0fef82737292076fb91e323da4f34d22a5ee6fe311018203992","name":"node32","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","private_key":"f62b2e6c0ace2c204b4efdf62d3a9e4e41740aaa2a7aee72aa67272b08f65388","name":"node33","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","private_key":"5083c0504c95867fc5a924311192eeb35e80105fb25720516a8af8053516b87d","name":"node34","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","private_key":"52454a2b364cf029dbd0bd0f6880fd3c4a3eea2ef593277ca45c363888b025dc","name":"node35","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","private_key":"822f8bae08da0af5c00b04adc4653e9b425648c538f482224cc7406ed46694b4","name":"node36","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","private_key":"1e41a399b1b77f559bce8b0db22cabd26152fde5eab7c91576e4a2e00cbf3061","name":"node37","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","private_key":"f39163a2c0a70f6eb02436a58c6029082e040ee88271fb27deb0e9c61af2a409","name":"node38","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","private_key":"30358622050808cb05e6c497e4ab00bc0baa126282c0f0bd38a279f15161ebfa","name":"node39","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","private_key":"e96ccd329e3ce59cca1c371e0d97e891c8755d8285c414d227fe2d8dde438ada","name":"node40","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","private_key":"a8af10b8118821f3f7a1c456f857e4ddf50526337a38eddaffe15bbbb383ac32","name":"node41","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","private_key":"aea855db0ccd147bccfb6969c37e5ceb12623a95cde33c7725d51418c2a58e56","name":"node42","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","private_key":"14f5b342ec3c67c89537fc4dbaa64da24b8d7d02242eff9642b680d1923a000a","name":"node43","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","private_key":"b56fd7d35ab0d1f76d30c898f6794ff5399b2d6982c4d5afadacaf72aa535bd4","name":"node44","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","private_key":"59db345b1123f497ab8804ffed255e26dc028f68d9010314f9eebee243ee74cb","name":"node45","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","private_key":"87b0f18d2c52b3f0f6934c09421248a6d0457eab81b8dbd93840877ba7c25006","name":"node46","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","private_key":"86f6a5532361ee4f4511ef6ced21fe2e8d4e12b10d61b8d16f6805d5d6ff869c","name":"node47","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","private_key":"604cbd4183a23b452f0c9add6181effac6084e4411051850ed0bc4f1ae9a33d8","name":"node48","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","private_key":"ada9db22cbb971526fb9a1e050a039ae3bc1b898086642c093f9d2fd1b4a2e30","name":"node49","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","private_key":"c3e1cd6edffbca6121b114763c7cc8d8fce9b4444747af55b56cb111f3803b5e","name":"node50","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","private_key":"e74e4c545f1d04c35176065ee8e6610e9847ba30aa0b4ff9df3d574a9cd04bc5","name":"node51","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","private_key":"d44b65dad6f0fc7d3868207b4d13aa646925f53eef21981d7898ca8eef1f47f3","name":"node52","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","private_key":"5c0b688fe7738cf3e06e8f932ca1986d88f6c00a9f705d50335632433ad7d52a","name":"node53","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","private_key":"8d78762191955f66c6881143b2fbf367eb02b6182eb49c5f11d22381f8e34152","name":"node54","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","private_key":"296788d95df4ddf6af02ab317a50c417d36515453b5cebdae7c71f55a657c7f9","name":"node55","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","private_key":"b229e6aab9cd866a0aecbc7358eeb2986cdf2ff1bcd25ae6d3dc33ad282a03ee","name":"node56","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","private_key":"016f837cc16dfa3e8ed3519599b40bf8ee03872dbe01509e3928f5459be708d9","name":"node57","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","private_key":"fb9bd6643165414424261aa1dfdab87ad7b83e52d9bfcbaa69e1bb116f84b19a","name":"node58","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","private_key":"c761dd84c3923763ca0acfc07e4939b146d57bd6b42efd6c5e8e5c0b63dc1518","name":"node59","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","private_key":"4503d268231fe7b4f60290da3c7f7f67bc51e123b65b7fb48f8ababc2eccbf6a","name":"node60","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","private_key":"c643d7712e7aeffa425505349e837da25e2cae551f446e56a96e5b2df48f2bfe","name":"node61","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","private_key":"cc7a5a2b92089562a184b024a3782da10d925002ca1dac6c95d902ed4df95998","name":"node62","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","private_key":"31d2f152a7b173892132dcb790d697cb779cc886a67355b5907e803ec734a1e0","name":"node63","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","private_key":"f0045a14d36d5d17d8859c51edce3fd7afd083b6722cf6a3668dbd4f1db69e17","name":"node64","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","private_key":"f00404704ec4c556b0ee4cbbc1b8fec0b741d8a587b0baffa9a0ce79648f6560","name":"node65","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","private_key":"5998a146afa95186e2ecf2d1daa4376812bbcbbf22809ba0807dc5e34e5d1e9c","name":"node66","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","private_key":"542904a26056c4d86aafe32a8dbbb30ef4a31b36c81563f47a8ce22145e5da4d","name":"node67","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","private_key":"4feddb131b7fb4c20144641fd72951bf356b4ec190a8a8cb322f2d0819aaf317","name":"node68","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","private_key":"1fa8a1ef0703e81a32dd0faf6d25447a183ecb90d6994f45921c3db0e8dc3d06","name":"node69","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","private_key":"dffd7a3c7cb1c3a0d129522290be15481d609d4d268daa13364cb16e13213398","name":"node70","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","private_key":"c5ab7f8e52d35ba6f3aae971d7215e9dd234f82a3331ca904c2b6b526d2a59db","name":"node71","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","private_key":"07c9b7896ed7f5c9763b72ab6631797941cd615c3ecd431de30169fdbe89cc2a","name":"node72","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","private_key":"da65f19428056c9c512efa6c1e97a409861ab28956b2c9ed0b8a72bba67c010e","name":"node73","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","private_key":"3ea7d8647b5a7f04bdae56288940cc9dc8289c49fcc4a1a79e9d3fd9a6ceab2a","name":"node74","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","private_key":"86dd972691e02a4562fde8ab7cfa9ceb75201e42e506cf2d51c16d9d474bad2d","name":"node75","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","private_key":"cb578a8fabe87c91b214032286af35c973b3f27880dd80fcd1efb929d1dd4756","name":"node76","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","private_key":"d4921582200b69793cc182b16d32031dd9559865007b31b1011d35512379ae8a","name":"node77","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","private_key":"286143c4711912830a900f8a45b11baa1bef2b6b96e9a918484cb95aafd2164f","name":"node78","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","private_key":"48d763e65d8c5b6a83609844cf203d410e1afa134af6eb6ed22a42bbfd55ccb9","name":"node79","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","private_key":"98a9e2aaeb4c53a781d4150faa14cc0ff5f066e7be28098cbc25a0c379be18a4","name":"node80","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","private_key":"97df41163f6dfeb248b196fff24b95edb55e2b6c48c551480226459fde0ce62a","name":"node81","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","private_key":"887a82d3553c5107cd8d6220f2ac36ca2d6d499b8c82b765a17bd6295e9861d4","name":"node82","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","private_key":"b067efa25d200683b69e2fa485be6ac0a6bbc34a18796bc0b0e794d4dadf83b1","name":"node83","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","private_key":"f2b10950651367c628d1675c7a07962c0af4062b2c3c8154075cf61f9635cd67","name":"node84","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","private_key":"55f59b8404f62f76682812c128cde0b37da46140d69661f3de90af132daa04c8","name":"node85","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","private_key":"bc5bbbdd85ae3b09a493f0b43542448acf2976654a249f32bf92eff0d414866c","name":"node86","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","private_key":"f342c7683da21156a1f53ce673f78414f580cdd86eda879596d087439e4475f9","name":"node87","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","private_key":"f9550b9a11e9aece642e0e863b82852f4c5c8cb6044144627d678ce3988cda39","name":"node88","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","private_key":"111dc027f4345175a5a141eff93a8d04d82ec6d67a15d0ed0c53ae7fe954868c","name":"node89","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","private_key":"30caccc4af13ac896656ca1add341299bb51773c44f91f3105a1564abbe84f5b","name":"node90","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","private_key":"ca298279e19e3d8437a361debb136898e8bf05c7946dd3ffdef8d267f1c79049","name":"node91","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","private_key":"d513af6f8087302defbc40f0f03c63b144c07a636b7c5c970e962d445232a6f9","name":"node92","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","private_key":"e5808b0004f64868225ce7362aa1b0d787d6c8bafbf5d08aadf4a804bfa4519a","name":"node93","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","private_key":"68c381bcacc6c4396824a929cd7124a13b8032185de88ce2cc3cb75badc6a5d5","name":"node94","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","private_key":"0d0d4c6da032e6ceb496ec71883cff52efa41a9383d2b83b747d1bc6f8269a17","name":"node95","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","private_key":"53c79eca1a5cc6b186db543273722c0168564d7cecceb76d1433330101f8e62a","name":"node96","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","private_key":"cd3e3585e9c28d16a0a5c11e8efd66671e8cac68915eb6b7bae228e10e867fd8","name":"node97","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","private_key":"60f513f00eb15da948e892d69bec82991bfb0747c9d5879c6c26c2a5a6095365","name":"node98","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","private_key":"94b0c348b1ec7288d57eb195f114f38da5a6fc3f604e8f1ed76135ef26f50c6d","name":"node99","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","private_key":"a6e6ca4e3f494adc69bb1aaa01dfc3dd625d9923fa4c979ec80ee221b83a589b","name":"node100","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","private_key":"2c11691d22adc7bee004f61ad67b543d9ca22c7c65125427e310fc5c8784091f","name":"node101","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","private_key":"1ebabfc78e1b9d17e6fe38508bc354ab54be2a8bf57483b0afe7dc3530533e0f","name":"node102","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","private_key":"9b22a93b1dd1ac5ad34771c2cf183292f9ca7133b4ed8a1d0fceb889d6017170","name":"node103","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","private_key":"b4d7978eed053b73224b969ad03abd7503081764e86f7815f8b650b7ba9a34b0","name":"node104","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","private_key":"18bbd14788534b3f7490b55c2243e84c1ed1d158bd769a47fdc2d8550098ba97","name":"node105","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","private_key":"ff55b25abe67052213c916a734949cb6a98d1ad2f240183bfa1fe694cfa0937a","name":"node106","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","private_key":"406c029264f74f39f2ad851342bc311d4800fe07db744f69557ad9e3e5899aeb","name":"node107","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","private_key":"9f9be5e82bec360e52170374b35e26ab30480bf5effa10bc43527c191d1efc84","name":"node108","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","private_key":"01c46dd80b68bfbc5916277ab36142ff3033b126df71354bc7b21993be4f27b4","name":"node109","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","private_key":"d4ea8e3d466c3fadc709252e0b35240e831250311a3023363aaa2de0d4068efe","name":"node110","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","private_key":"ff786dd6bdf5a54dfd71c73ab93427d94008f2854eec2a87c96223aeaf5a2357","name":"node111","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","private_key":"81d2fd2b16f53fcb3749b3c8575a00ddf39ee32f760cc7e8365c046e364ec849","name":"node112","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","private_key":"5017533627afd71f2684b9ef264ac79ff826f1cbbfedd788d969d9ae1bb87b20","name":"node113","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","private_key":"92a91e558f70fffacaea7b5c86540ae940da57dcb660d8c3e6eb5c7b38f015f0","name":"node114","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","private_key":"91f18de340c4916711d69fea368a4248eca8a13910d576e24ff9125fbccae3a3","name":"node115","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","private_key":"f1e5638e4912ca0ccd446a27531942b75039807eea70118fad6880f5b1ad5ee7","name":"node116","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","private_key":"83bcea8f8c409f9470bca240d19fb29d9fea6cf94435ebbdf0a8faf5f1cb5ca0","name":"node117","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","private_key":"33c3e295cfb9706d4d5e081ec3c220d8c35415d7c256de99511e76474e8c906b","name":"node118","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","private_key":"af0dcfc78e50f0893cd504a3567a8515538bd85a1d3eb72809dd503690d0d274","name":"node119","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","private_key":"8c806f6fed9bc74fb07341b080bc3067c953b5d6093ef5779221924d4ead4bb8","name":"node120","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","private_key":"a1a11eedc4fe78f42dd23b093d9fbcbf1643899eca875296b0374ec0e8ab619c","name":"node121","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","private_key":"15d8362248798e68c5eda882717ee691573e5477b7f0444222fabaaf1a025a8a","name":"node122","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","private_key":"c1d6cf53ce48953f5b6bb0e0b644aaebd16b84a3910894f93c157140c88988a5","name":"node123","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","private_key":"a67b1d8e2abb33c866d215b81af3a23fe0657a9155a8e17754bc0028dcf87852","name":"node124","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","private_key":"b9da682c3a119f650ebbaccf2974166f3162ce600afd50152f95e9be3f688bd4","name":"node125","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","private_key":"a6ca067c4be7a67d6c5b14fe7e0b62a964d844462a6b26a981cb73ffcbb48e46","name":"node126","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","private_key":"08926af18a3a13a1bf786aa6946ab5bde52c531026a8561524925f1d9f0d665c","name":"node127","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","private_key":"793a4b0ec03ee3d4c1cc8fc8084366fc20e5852ecc3aa96ba2882babd7b8ff37","name":"node128","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","private_key":"9d2fd418a2966f748dd746ca5b5f0c3a82496a0a6274355c059d5f48be6870b8","name":"node129","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","private_key":"7c7cfd0cdb3cede7dc5d152c6f5a8d89941656a3e9e560cf993a319c9012f074","name":"node130","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","private_key":"457954e43019a3f3e510a0f818996c28e372410ba50490b5042068ff63f3e17d","name":"node131","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","private_key":"d45a6d15ff3a2073f6d31d9df7fe6778cac0ca1d62aeacec44341aef19924624","name":"node132","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","private_key":"c1e5c2bc35a1030f8bd3ffd9099376d32ca3029eff92b5c79055ae2454a6fd6a","name":"node133","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":false}},{"node":{"config":{"id":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","private_key":"89da1a80c7122d19de9b63637b1f1675ee7e009a5ecf1f6c51cb29b2a09cc908","name":"node134","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","private_key":"e5596012d345aff602e83361bc5fb1f7e3feee7b23782a8c7f0a1c7933ab928c","name":"node135","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","private_key":"91af9b7387bad90d696b549270c0302fbe3805efb01f311e801b317217b92cca","name":"node136","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","private_key":"af83c717380c5132acd3357ec3e29daaacfc4e4a65fd1f5b14479b78e5fb01f6","name":"node137","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","private_key":"2645348387e283c7f69d634a71ee38a65d4fc6928ecc383fb25cea4525fcdad9","name":"node138","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","private_key":"bc25724231b7bb54d17219feff13e1fe8e0486cace91c0cc6f3731a986f4a8ae","name":"node139","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","private_key":"1b90feec9d475fc13f1394c4b39d837fbd09f4c329ef5747d988b17b84967ccc","name":"node140","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","private_key":"392b881dddc671e72fc89ef71b340f19840650943cae22682d6cb6f97570c1ac","name":"node141","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","private_key":"f6541fa1eb8508dbcfde0259a988d0564c192cd25b2051e1299c32cad9ceb149","name":"node142","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","private_key":"59014852ab4f95ef336b10bb7c05d22e54eb0ea453d0f1c56638852ffac3aab0","name":"node143","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","private_key":"45d467a8320183e6e9f9fb0219c71ee08f43352c83c0b2d84da4ae4241b0173c","name":"node144","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","private_key":"3c564ae34741afc14a8ea217a734d5a8bc6d8dfcce3f4943acff14036edbf1c0","name":"node145","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","private_key":"43f552096880ddd297dd590b83f738fa13826e6120ec3d6311ac565b78a252c7","name":"node146","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","private_key":"177c7e7e8e870ff8b4b606ee3bc6f94d6fa57fd6deabefdabb250776939ef9f9","name":"node147","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","private_key":"26c019de3883a787fafed3839e768c71553ec8fe6cf607725f0e2acc80711cee","name":"node148","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","private_key":"943fd9910b9fa6cdb47ec68ec64b2faecd9a56de487fba1b7773a6dd54f94664","name":"node149","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","private_key":"f75e19af5d5e340e6a07d85042608f0500511042eb2e1ccbae8fe8569b9cbc8c","name":"node150","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","private_key":"e400c8293b9474c5aa84b48e37e1f435a53c910af98fd4e1b23ff9bd670bb51f","name":"node151","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","private_key":"f5a6a565c7c14cba96a75712373743d09ba804a9b8332a667492617dd5211abb","name":"node152","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","private_key":"4f592401cb57bcdc263bb96492ca66258130460b5fcb1a1cfafdedef3cee99f7","name":"node153","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","private_key":"97486d2d37010143a830ed6a0be6528a5611fc42962ae80e44a12c9b3399502c","name":"node154","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","private_key":"d93efde40fe67c2f412577aefbc6af1e876bde81b53c22ef6da4a5a23c8c13ad","name":"node155","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","private_key":"eaab112f5381b5b84ac9920fede88f2e04b725398e37a0b1b003442c281e32a1","name":"node156","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","private_key":"f79356978056456eb8f10bcf3c06b107a4afb4d5a8c2fc9380011a7420d59c81","name":"node157","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","private_key":"f0c66841f0adf1a9af04982fcce0c38c5012595de449dd0a8ea97ba06d5e43e9","name":"node158","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","private_key":"cc124633e255f1c6ba0beb16fb978958ed79be0e0f6ebd7968ef82b6d439fcda","name":"node159","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","private_key":"223b2c119cccb5059319a4a0305aec9c1bace6e731215f699cbd4d9a056ec777","name":"node160","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","private_key":"158d4468a6b4e7413f8b1d4112ef2b2c562e6dd26101b022ece2fa57801e6b03","name":"node161","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","private_key":"9b9249eb2418f61bc1e6a582b28e46c0d25eecf549e98414e2ca5ab1d3f5b1f7","name":"node162","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","private_key":"92f63cfcb2341c43aee585f9b965979e49d307de204dcc09b8e869f4e67640b4","name":"node163","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","private_key":"81e7d25a3c5700b592d3ea4cd85440f914f919e65f0a6e55c99ba619a519c70a","name":"node164","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","private_key":"09ab58931e7729bf23cdcb2772b3869d1aacece96070df5790f8343b70ef5e3b","name":"node165","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","private_key":"c330a5f7858f47d6653c52c88207fd10c6c87d8e77c87b9be95165f094918210","name":"node166","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","private_key":"7bbb910a655225eccc1fa6ab5abd3696725591448d5b628656692c1170f1f095","name":"node167","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","private_key":"9a0adb03a36d31dc716a280bc0b0ccdb5a891c5242f507aed5f6c370ea6bca05","name":"node168","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","private_key":"c9271845738bb80612a262956270b72e5152311e2e80fe21b3c7238f394911a7","name":"node169","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","private_key":"1710672c4d27d5363877ec9be4202445a3404d3e16ff221611f0c2d82c34af1c","name":"node170","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","private_key":"fe3ddcd5732357d3e602b35b79a21afd716fadbe7b569e44eb014dd4b944ad49","name":"node171","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","private_key":"85d961e31726c6d75913c901b5db7e115dd67338d9d89584e0c73df8f673a01c","name":"node172","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":false}},{"node":{"config":{"id":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","private_key":"ded7d4f338d0e906b79482b6a79c0a2224820bac1893e3ee083a66eaaebea363","name":"node173","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","private_key":"f2b75f511327f380d86989fed2d67129f32bb0aeafb3aba0250c8e9e5b581d16","name":"node174","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","private_key":"a9bc40abaa967e683f994c9d053b90fa4daa9602fc810cd974a8f6a3629dbd28","name":"node175","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","private_key":"fa312311679e17f36872e8c75b78bd3b730d7423c613f5d7cbcaf653d847419e","name":"node176","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","private_key":"3532d20f2d6b03b910ef2d4dc968b71d89bd0fa3c9a758fd355ec3f8c9b6b62b","name":"node177","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","private_key":"d491504fcc40f961febbbf2089616ac2a2b7cc79e5dc9c01b632ab9d226bca86","name":"node178","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","private_key":"9653af0c5c528f1079ce38ba8e44273a7eed8efe91036d0219e08121fc62ca06","name":"node179","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","private_key":"09d927a912f0daefdca0fdb594feea4e25c384ac07efb663ea46ba893d0f32f9","name":"node180","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","private_key":"b5c4da646e3485b765e530ff19f36c4753764dda9d4aa308fb8d5c3d52d9b04f","name":"node181","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","private_key":"cf80dfc2e5888e69aa7c570430d76fb7a11991c8f8bd4c8dec3e2303085624ad","name":"node182","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","private_key":"33a68fc227f5f745114937915a4678fbcd985ff8c589698f241091a32fd901b2","name":"node183","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","private_key":"ff80b3d224dd48711a8b71840a9762289dbcac4d27cb6c24878fb4dd01b7c55f","name":"node184","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","private_key":"9b8f03ec5acc438bfb8ef1d604066899d9108b46efa0136298d820aad5752cf6","name":"node185","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","private_key":"b3496c97ca4de82c4133936c457c24ece46c36d35193ff6a5cd269701841cfd4","name":"node186","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","private_key":"65f6b15bed8bfb72144314f9aa2a7364bcb356e60cdb0212a7d04a3eb9e2d3af","name":"node187","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","private_key":"fe832e4f1c7485f3906f1807544431a825ca6ff8ea89d3d87a14aba92ba4d995","name":"node188","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","private_key":"50f4adfdd5287853b06a93a0214c09ee109edc00698de65c0c0523e10e7d828b","name":"node189","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","private_key":"e40b799e72dc611e2a8f64d5b8c7ca95535499887a0eb36f5f4f3690097e0ce0","name":"node190","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","private_key":"11535d8be8b31e5bf636e9671c7be140d596984e31eb44adeb0002976fa05b97","name":"node191","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","private_key":"9870e0dfa67e07bbfca9e8eb065c1085adc82bf75d9d75fab9909f3681b654ed","name":"node192","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","private_key":"01d68cdd16950c65e5781ece848e201a6ebbd5097f74dadfd7a5fb007bbcc11d","name":"node193","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","private_key":"7d7d75371a52b4d22411fc3dec135a945466d9fcce8615dbb959ebaf62bcebac","name":"node194","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","private_key":"cdcb88f25a626c1434db6d9ee8ae5934f466813535a8b9425572a888ade1bd98","name":"node195","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","private_key":"70186f9ea20bd1f26270c4a3cc72d7fd6997f6ff1e81fa580ac396cfb8a53d96","name":"node196","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","private_key":"23e586de5f3e3d888e4b5afccbc7bbe9bc569233c4133cf8b4b6a6f722bcbcf4","name":"node197","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","private_key":"fa2860804ef40cd74e911bae08fd20f7fef5ee4d34f163dd456f566b899f18fd","name":"node198","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","private_key":"1552e3359f865f955336c9e44aa94278481ebc3fba1bbac62a7e6c95d3348d6b","name":"node199","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","private_key":"da57c89729140a0f359ddf902197cddcb6b13a00c226d1a8a0975bda02f3a495","name":"node200","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","private_key":"a71ad1e471863026826e723cb60ef8221c29ef9c115f59ec22dccfdbf13724cb","name":"node201","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","private_key":"66b7f7a02087e6dda466b0fb6d05311ce95e179b4baf6cb7dd1fc1052f066367","name":"node202","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","private_key":"f4efac8f64908b896f893bb4b4113b00734dfcbf9aa87245f1aa8e9f65b644ce","name":"node203","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","private_key":"f15da5ee626bdec9e7b303afaff488d87aff1815668f878ea6b1f270c6300ec2","name":"node204","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","private_key":"ec037812b58da37d27db08df00018a39dc06d096116acf7f56921452cf7cfc0b","name":"node205","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","private_key":"9a037c145472a92a10b90fce8fe35501e93af7b73b026641d66a53ccfd3930dd","name":"node206","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","private_key":"14480f714ca25c522c067b4bce766945c9c2e8d0b697eacf9ff286fb0c26dac9","name":"node207","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","private_key":"c756a2bbb4c7b536c169fea0b09c7834ce6ce6f687c4968e598b72606163b8f3","name":"node208","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","private_key":"a837afe73ba3598ea681339261b12f5b9f02f1ce5243d6f7d18c735562b5a485","name":"node209","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","private_key":"6dab6d6b30b7515d850f1f4e7d6fffc75064eafafd86b8754a4000153113b1de","name":"node210","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","private_key":"431d8e4e06f15988a4ea9b3c077ca2b2bfc5b8b04135fea5ad7dee050940422b","name":"node211","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","private_key":"adf12e35cb550ed5a52fb5fa25fe7a6298e71b77a2dae474ebefbf2f9b8aac69","name":"node212","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","private_key":"7a94e705247608b3fe77122138a93f8477964e4a1a5d068091ff655f6ff0acd9","name":"node213","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","private_key":"c121bd7298c0130e294b88e6bb3b99fa0db790e9760b605448356e1fd89a3e5b","name":"node214","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","private_key":"562bd811ced052733cf87caf5888571e4482ae46e14ae1585debfb6b10298249","name":"node215","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","private_key":"8ebd5353e11b993fd7941ca1a936fc21799344607325c2879687b5e90adee6db","name":"node216","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","private_key":"8234acebca52619acf23d978bbc19bf2d8cbbc933bc7e18c7903d4b047471348","name":"node217","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","private_key":"1a4a47a0b83da4f2ccd94ee24a3657f777cc93c6a58b8ec0145586ba2c161429","name":"node218","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","private_key":"5b5aede47f05e99b807a7451cec469c1f77786d45d9f55b5a797b82d76db93af","name":"node219","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","private_key":"96ada7ff2fc583b6dd41941edfff92a81778c698d3b1f9fbf4130c2f7cbbec84","name":"node220","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","private_key":"1616cc42cae550c0104204c1c7f6ed0b3f65da627bd834a2d1239d70cc5b1e77","name":"node221","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","private_key":"1d029cbabb2eaef44889598c8fa2297996a69661d29c14035424dce781deb15e","name":"node222","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","private_key":"83c0403796648d484818f74b9de3c755c56b24f69e3394e062dd55a9d7cecbc3","name":"node223","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","private_key":"3f64513ae7746b16fa9ef3978d1bdf3c87ab4842c75aa3b946385dcdb23a3430","name":"node224","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","private_key":"a9db544f2fa00dc2d658a531934db6efeec93208b76d5b6859e6f0c4abac116d","name":"node225","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","private_key":"d53b2fef355d63448b93647458df0ba5b73bc42492d376377401a568eeb4d81f","name":"node226","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","private_key":"a04acf8d5198d0e7da1a6e9228c8ac6a74542a8d91906d5e83f1db219ae25350","name":"node227","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","private_key":"d5ad27697670f66cacf3e0ffb4473ab4912ed96fba311ddc8af12ad7663adeda","name":"node228","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","private_key":"dd217caf701902c94b57e1eeccbeaeddc4a7837b56d82ae2f034935d2828d222","name":"node229","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","private_key":"69b9f99ba6c47542a17c63be200102194fe3ab24084ea1e684033e68d580b5af","name":"node230","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","private_key":"ead9e2c8c0b3993304cb0a4a0dcb3ebe7c4331a87fee7c70194a3b3690413f43","name":"node231","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","private_key":"96cf35a39c0753abb6cc71c2a23e92fc936169a0600e936611216fd8ec31e310","name":"node232","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","private_key":"12ecde7517662f6d425f22ce7ecde84688ab9ed7fd443de2f309f095857faca9","name":"node233","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","private_key":"bc558cb24210cea0443678c5a9a412b3512b5b965b14df80818039b6fe28fe06","name":"node234","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","private_key":"1f2ab03e6921c321f5f783a3105d69bb69a4c031d50195fb94324c3280d52310","name":"node235","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","private_key":"8f1333ea7bd671c671ba94c4c7c59d6b0687a5c475b21712c6a49600e71f78b5","name":"node236","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","private_key":"e7fceaf57233e8a351a5a97e433d38131867965c883d53430f8f635f0563a168","name":"node237","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","private_key":"c5c6440cb8356bd270d8ce8d543b85c784f5c049b80e951c26fbcc92cfd1669e","name":"node238","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":false}},{"node":{"config":{"id":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","private_key":"64939e66b20f857b3b5c94f6e5f72f15ae524ce46058ebf20c98e796bcc608c8","name":"node239","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","private_key":"9fa335b0c4f3fed78cb6aa4c0137589fe77d15b2127788adbca0633ef881b61c","name":"node240","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","private_key":"a36da338278d776a57dad648f8c5627834918fcaa86367e4aeaccefbb4142c1c","name":"node241","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","private_key":"dfbcc9238ce614f0a4711f04948064ddbd5b2997a19f1e62c8f9636e9961fd5d","name":"node242","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","private_key":"ea0d5ec78fdcca32a257905b595a0c7bc8f2934d088b0f4c695a76927fa9e791","name":"node243","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","private_key":"01bbc4df92bfd5efca325ff653fcab3ac6aca83696f57927d3313fdf03dadafb","name":"node244","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","private_key":"2e16fcbc5651872d962bf9cbbd32cccbef2adac9e86006e4b4e9abbe6c22d7cc","name":"node245","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","private_key":"a26a19f61e9c2c83a632e779651442713ae7026ff3889b0c2ba690ad206500cf","name":"node246","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","private_key":"fd1c4ea6d2c07317eeaebbcd485aaf9267d81f2dc547b2136eba8ed02ae2c635","name":"node247","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","private_key":"a655a637ca80f8c5354e51e46d31d79b36a8a8b44d50e2838a118ea8b33512ee","name":"node248","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","private_key":"02d1f6c1a867e9dd9cf7bff6121f3eb99e7c75866f8fb00d83782e69de6dacc5","name":"node249","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","private_key":"e0f98f6ae876455342403d6cd7ee64b21f5e5d691ed720d81e0db64529d8cd19","name":"node250","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","private_key":"53adafcbccccca52e7bbf9524234d7c6c5874e3a328d3ded48c93c7b07f34428","name":"node251","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","private_key":"b91ef086d245c3849c46234765c2d479c053b5974568062618a768ebb7014b64","name":"node252","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","private_key":"438a2cd1d35d995ba9e35fe1b4086196934e0a6087ca2ae18543512299224b1e","name":"node253","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","private_key":"1945283cb814bb48cbb80a03a2660606e5c5e023e3b8ac887baf7cc912ec5be7","name":"node254","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","private_key":"be6f375f22929e615c683dc9b07e4e2c609a06e07a849a718617c2a0c2ad49f6","name":"node255","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","private_key":"9775c9bb0b01e8a605866b96d386a1f8c3dbba2605cb9f8089c4f85fecfb6c62","name":"node256","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","up":true},{"one":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":false},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":false},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":false},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":false},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":false},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":false},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":false},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":false},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":false},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":false},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":false},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":false},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":false},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_3.json b/swarm/pss/testdata/snapshot_3.json deleted file mode 100644 index 38ce68f34012..000000000000 --- a/swarm/pss/testdata/snapshot_3.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","private_key":"e567b7d9c554e5102cdc99b6523bace02dbb8951415c8816d82ba2d2e97fa23b","name":"node01","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","private_key":"c7526db70acd02f36d3b201ef3e1d85e38c52bee6931453213dbc5edec4d0976","name":"node02","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","private_key":"61b5728f59bc43080c3b8eb0458fb30d7723e2747355b6dc980f35f3ed431199","name":"node03","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_32.json b/swarm/pss/testdata/snapshot_32.json deleted file mode 100644 index c33cc6e1bbcc..000000000000 --- a/swarm/pss/testdata/snapshot_32.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","private_key":"294c55925f084f4af87c7e09716c6334a538bac3e6b7157844c0c96a9dd02b4a","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","private_key":"010dbe172f1240848fae9639e029301ebd297b29ad2d6936c67669d23470cee4","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","private_key":"7f974cee5ec96d070bf88898c24035988667ea21242a02822bccbe4ec487d126","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","private_key":"d7e181b51ba95fd1475314470468045205d7ddefb1bbecfda3340267062489d1","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","private_key":"87ed3ffe3111baec0adfd92068b47ed9e1efb642d0ff3115d7d76338f25eea76","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","private_key":"7dbb4fe973c714c4291ce5a8aedce9c3425a25cdecfd5fe0c7f14b55e91d6a03","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","private_key":"6f8900888d42ea5340f13634776acfd4a261837cdb772b9a059b23c7d425da1d","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","private_key":"a94698db3c1a809d255fedabcb4f3314be27cad7be63cda59bb71724d24ca0d9","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","private_key":"37f683b58015f6a7ce73f814fc3860318bb2048052356a215f9eff00aa6ed34b","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","private_key":"b27bdea692559a2a77d497ee567e972e033d4e6e5dfb7c35948a9d231c25b0e0","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","private_key":"0a75e7e7dfabf4ee693bfe127221c97eb9b2f4e19d32f7bc836ba253445358d7","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","private_key":"1557c4754c71e6468fae0c7d0e1b5af2cf70511ed2d5d9b0bc276315a4c8f922","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","private_key":"d2b18f4edef23f629bc5624a36ac1d58f59207bf7de0b19220f90fc3c64b5a61","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","private_key":"48fe56dfc63a454ab004e7a5dc7938e29694377b6bcc27d1c19d8a72349a8c2d","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","private_key":"9155d38d2a2bbe1e5239f9993d96a350182e3840813436e23e1f2a4a9a32b7d9","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","private_key":"e60772916c9d248e3a3819de52aacdd4008412aab20a457e88e764752679b8f8","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","private_key":"e7f27ccf343d2124211ba980dfe8ee7e774a5956268a25522347bb3be99bf38e","name":"node17","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","private_key":"0e9cb88a7d70a04f0780ea51e001aabda0830f504e29e31c69d859acce0a9019","name":"node18","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","private_key":"cf8362e06e18a783f7e20baf956d40e2ea4a204ec868f8d34909802af222e997","name":"node19","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","private_key":"9a63fae9e77f9cfdc30f4747a939ba44e85824560d98b49047bfa8f4156d426c","name":"node20","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","private_key":"748efd85864661c429fd70a74bc32f1d81685bd81927c1499dbd93993dc27cad","name":"node21","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","private_key":"fed7bc6fd67e331e642253e604215ba088daa48a1b84979699ad770c09b909dd","name":"node22","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","private_key":"c61c4e9235825e60f2d8c57169e7d1913f45b057f298ba8fb05d51515e92a902","name":"node23","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","private_key":"53704ffbabad329a9032a58cd7ec012499b0a521bb0300e1d7160d4e5d1220fd","name":"node24","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","private_key":"7098a0386bb10a213728ea65f3ca98fd25a31daf3917190f6a1889d350e09674","name":"node25","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","private_key":"e967b2c9db78764c1ce024423c48e170b68fb6232c313a32133faf4936e2c114","name":"node26","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","private_key":"f8cf717ad5b26578e58a97eddc6074cebb814cdaf3f4144acbafcce51ccbd249","name":"node27","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","private_key":"e6573973825826d193b5093ec610c34368630376e4e13843e5f2203c3ca88fa9","name":"node28","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","private_key":"0ff9df0f439480bc31f8a3ae593af2662bad0f5bd4e0c3e87839af326929de07","name":"node29","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","private_key":"1daf1094602b9234a1651a8ba6013a807d9c0d56339c784d618e2c6705b65e23","name":"node30","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","private_key":"376cc1c769c48c4a04f3f1447fe31112cdbc8d898266a338f6675906511bc9c6","name":"node31","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","private_key":"6a9a93cae21630926926ece339463ca165823f499f47d45632dbe1a49a84257c","name":"node32","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","up":true},{"one":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","other":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","up":true},{"one":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","other":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","up":true},{"one":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","other":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","up":true},{"one":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","other":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","up":true},{"one":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","other":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","up":true},{"one":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","other":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","up":true},{"one":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","other":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","up":true},{"one":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","other":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","up":true},{"one":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","other":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","up":true},{"one":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","other":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","up":true},{"one":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","other":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","other":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","up":true},{"one":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","other":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","up":true},{"one":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","other":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","up":true},{"one":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","other":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","up":true},{"one":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","other":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","up":true},{"one":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","other":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","up":true},{"one":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","other":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","up":true},{"one":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","other":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","up":true},{"one":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","other":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","up":true},{"one":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","other":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","up":true},{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","up":true},{"one":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","other":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","up":true},{"one":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","up":true},{"one":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","other":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","up":true},{"one":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","other":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","up":true},{"one":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","other":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","up":true},{"one":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","other":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","up":true},{"one":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","other":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","up":true},{"one":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","other":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","up":true},{"one":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","other":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","up":true},{"one":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","other":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","up":true},{"one":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","other":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","other":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","up":true},{"one":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","up":true},{"one":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","up":true},{"one":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","other":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","up":true},{"one":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","other":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","up":true},{"one":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","other":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","up":true},{"one":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","other":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","up":true},{"one":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","other":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","up":true},{"one":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","other":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","other":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","up":true},{"one":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","other":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","other":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","up":true},{"one":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","other":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","up":true},{"one":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","other":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","up":true},{"one":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","other":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","up":true},{"one":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","other":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","up":true},{"one":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","other":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","up":true},{"one":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","other":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","up":true},{"one":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","other":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","up":true},{"one":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","up":true},{"one":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","other":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","up":true},{"one":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","other":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","up":true},{"one":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","up":true},{"one":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","other":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","up":true},{"one":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","up":true},{"one":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","other":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","up":true},{"one":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","other":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","up":true},{"one":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","other":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","up":true},{"one":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","other":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","up":true},{"one":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","other":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","up":true},{"one":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","other":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","up":true},{"one":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","other":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","up":true},{"one":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","other":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","up":true},{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_4.json b/swarm/pss/testdata/snapshot_4.json deleted file mode 100644 index a64f31375ae1..000000000000 --- a/swarm/pss/testdata/snapshot_4.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","private_key":"e567b7d9c554e5102cdc99b6523bace02dbb8951415c8816d82ba2d2e97fa23b","name":"node01","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","private_key":"c7526db70acd02f36d3b201ef3e1d85e38c52bee6931453213dbc5edec4d0976","name":"node02","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","private_key":"61b5728f59bc43080c3b8eb0458fb30d7723e2747355b6dc980f35f3ed431199","name":"node03","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","private_key":"075b07c29ceac4ffa2a114afd67b21dfc438126bc169bf7c154be6d81d86ed38","name":"node04","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","up":true},{"one":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","other":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_64.json b/swarm/pss/testdata/snapshot_64.json deleted file mode 100644 index d8031614e93b..000000000000 --- a/swarm/pss/testdata/snapshot_64.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","private_key":"8f572fa1cb0643b3413cd0dfceac00a4dac9ec09af0c2d134809b6385dad35d7","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","private_key":"a66e079664952b1fb1028e959dd8a05a21477e2f298ea89592adc522d38e511b","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","private_key":"072e1cf99b52c2f1d40560809048fea86f39ae1db94bec2c9b71b0bfe092910a","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","private_key":"003ec9cb18f157360d7a3eb506b37ec69dbbd141bbeb7b8fae5f470b1a0768db","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","private_key":"fd6fc50368fbc7e848635726291264cf6ad682fb4fe785b724c8b22ea31e1e24","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","private_key":"da156f269cb01e7fbea5efd5f7ab6283ef0994a1ca139768f49c68e027ca76b0","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","private_key":"ae570046bebe22a2cd095ca2b2282cab29b2501c6f217ae3e19d96bace36c199","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","private_key":"dee3b946981d4b7bd055941cd6722b166efc24f28f6b26da9cd52a8f91f3a411","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","private_key":"b7e566b24a7c97f714c9920c4e426dd462ee171bb8fd91a3efee9bd1d28dd060","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","private_key":"070b030d06605c46eafadabb979d38f9d4f48cf55e24a96378f4f0bbe2806887","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","private_key":"4ad1a65bb55e2f6d41cc3383b1de11c79bab13723c02d4f5abaf725d6aaea3e4","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","private_key":"bbe3351a79ad82f8b832dc16567dd1bcc24b1897bc9bfec930f3461a61f7d652","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","private_key":"26e548a577ae1fcc718256e75d48d70ed406dda8798f84c967d7dfe45c6aceb5","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","private_key":"97ca855261319532dfa74bf6194b4302c3d2f971adbd462e3437408df6dcbe47","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","private_key":"a762e1b25bed356f9a9e3aed01c7a38e8f57441b6caa18874712ef1159616b57","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","private_key":"53407f7862d16cdfd7beb23612d5d57dda1963cf729766feb046966e15850b32","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","private_key":"f3ffbcce6a7f7bfe25c3ab3ba95dd0574944bb5a09eabda3da69f187c48ea747","name":"node17","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","private_key":"0fc26e702e6bf4755536ef14b178df72099f9d2e818b53ce85f5b5ff3ea6c9c8","name":"node18","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","private_key":"6f1be181439476148e13cd2c39dd8983588047ef5f966091688ce37a01f78441","name":"node19","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","private_key":"b2732f7493e1101eb17248f6a6d83b5811c49cfc13f1aa41a624d1bb3e85368f","name":"node20","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","private_key":"b573a79bddda3cee3997d5c1210e33810dfce4f43a9a47d3f41ad02352d0515e","name":"node21","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","private_key":"3e8547c0320dad0457a7c6d576c1700ac4af59504cae9178faafcd60c9830e99","name":"node22","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","private_key":"dcee5e2db10836dcd5e3bbe14845a6203eebb791ae82200732e6b21d453e0642","name":"node23","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","private_key":"e895b2d5bfbd538d231463563cec8889c8aef0fbeb77acfd3ab9bb75504d39cd","name":"node24","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","private_key":"199b03688e42fbdcdd00b6230f59bf7a0b6ac22f6088c7d398535121f867b30a","name":"node25","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","private_key":"04a50f62b3bd30de9b6a4ca7c72d0fe81f6c111ab99bbbf4bb9c21b6c8983639","name":"node26","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","private_key":"dee1658338c1840984753b1121833d17232db7a62a8ed1b4fc1268e99138385e","name":"node27","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","private_key":"9fa3a527ec0ce68f936c2dadcc080238cfd5a3a462c20462567976eaf1d52810","name":"node28","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","private_key":"26df6d28e33e4da3390df260d9bbad739c31cc494a632239633485872b1ead29","name":"node29","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","private_key":"d7549640c8223b3b3e55195e3b519a85b7af1f1fc26ebbd56c9117a639544593","name":"node30","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","private_key":"16ea03e396aba3e56e9e2d89e53b68e46e51408b090fe2b99e65591ae6cd02c0","name":"node31","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","private_key":"2f111d17fef6870e109950bfd76e7e6db0913a06d14f8f5a311a39f447e65aea","name":"node32","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","private_key":"b20e729862ae141e3134c9eb2ed703957c0fd006f041df213946d66bfe06a3a7","name":"node33","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","private_key":"d35682e43d6382cb9508e5479fc2d09bec82166746bd406cc249f655715ae986","name":"node34","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","private_key":"9d7b2568317659ec35ed53c64f5c1aa0813dde36f1f492139ffefdd91ae0717e","name":"node35","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","private_key":"1177e7fa4a1e785fc30996682cf9ecd265d86943f65d7e3cf4c25cefcd861479","name":"node36","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","private_key":"29e2a9ddf2c5b8914fcf8d3782d464b0be6252d589b2a7daa1ea6b93b205c4f4","name":"node37","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","private_key":"de7a36b57175c1b9dd9686884f73048ea29215a01fdee9f2cf5068218efdc9d6","name":"node38","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","private_key":"209fa24e0d0a335e74967ae3ca2914ea6fb1ac99b9495820e9680855fab3081f","name":"node39","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","private_key":"225e538725db916b0e7be129cbda4da08e6be4ccaef64cf870551466d2658834","name":"node40","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","private_key":"1cf5c454ae9746fb367557d4f4a4a9d22157508dd1b19223b4640a3fa9c1dce8","name":"node41","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","private_key":"e4f81e7a844611f55194d22f62b681f479dadd58596a292cbbf6ef794df1c99a","name":"node42","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","private_key":"cfea4812067444b8816b5d70ed03fe5491d28ca6012a871bcb8aebbd100f9489","name":"node43","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","private_key":"384043ea1944918b9fac6bbbd88341254533ae49e3b2ce16c1df0941b1118303","name":"node44","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","private_key":"2de5004aa7337bd0819c88121cb0e708bc072c153bf94e274d7e786288996630","name":"node45","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","private_key":"aeb73b9ba035e0d3569e9dd5780dea2994151e2b43cb74e0e297fa285ba3d794","name":"node46","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","private_key":"6f192dda3ba98c5d13e94cc2e64ed95478ee64e97b230f224237977bf04cd724","name":"node47","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","private_key":"5c3a125bd1eca6243b28fcbd20a0811d7e09ce602ca98ba5f253435d76e0e4a9","name":"node48","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","private_key":"e4c7dec3dd327bfaa41b91fb8ccdbb96156d1fe464da973445a35f61e5bc6814","name":"node49","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","private_key":"07853d60907494e01f54f879c85c5f3fec6d4d615f9553d12b3da9ea1ad7a4ec","name":"node50","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","private_key":"6de081218acdb9ac4c4b8fbf1fde5f2be3c601cbf9104c970de43c2512c5e4c3","name":"node51","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","private_key":"7b7cb0ca071a27ee059bda50862b7fed343122d2546f5ac5a49dd5b47910530a","name":"node52","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","private_key":"542108cf09fe9447bb772d25802153811dd504943271556789165c6742636520","name":"node53","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","private_key":"87ab72e1c606a3b799ef3f34d3aa14549953c570f569a7b7952bb8f460b05a56","name":"node54","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","private_key":"a568b1f02f9c9129fd2924f704b8948351325edea81e43132c857be97dc7216d","name":"node55","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","private_key":"885083158aab574e1ab94645ea978b0e98a06605b1cbbfc48450f46522476b22","name":"node56","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","private_key":"5ee85ab61759ce457c89801346b14f68f1f16d6c59b2c034a2aef87242488041","name":"node57","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","private_key":"0bc8227f073c115b1ecd2add3e0ce8f58974528279de040eeaf189abfa6bc506","name":"node58","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","private_key":"a548a32f98cf950d6811b01fd764cd17b51d7012b18e944b3bb90dc660e35817","name":"node59","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","private_key":"55c9fd7b7ce7d50376a51050ac0a0a61b4657f9392ad14509bf432758a02b102","name":"node60","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","private_key":"daa4e758bca88df487bb1bcd41e59643256d23f237f96d654010801c07240435","name":"node61","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","private_key":"0090eced227d4fcb0e639349e4164040aa3c9d858531c2df416023c416753a5d","name":"node62","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","private_key":"96f0c30375428cd6184d43806adfbc9a4600e0180b50afa6ce06bfb1581cf1e0","name":"node63","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","private_key":"4738e28b9e3f0920f9c89ac195862299c670e5b354e5bbd644395336a446166f","name":"node64","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","other":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","up":true},{"one":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","up":true},{"one":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","other":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","up":true},{"one":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","other":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","up":true},{"one":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","other":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","other":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","up":true},{"one":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","other":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","up":true},{"one":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","other":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","up":true},{"one":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","other":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","up":true},{"one":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","other":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","other":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","up":true},{"one":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","other":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","other":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","up":true},{"one":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","other":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","other":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","other":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","up":true},{"one":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","other":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","other":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","up":true},{"one":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","up":true},{"one":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","up":true},{"one":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","other":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","other":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","up":true},{"one":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","up":true},{"one":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","up":true},{"one":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","up":true},{"one":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","up":true},{"one":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","other":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_8.json b/swarm/pss/testdata/snapshot_8.json deleted file mode 100644 index 307afe5a137b..000000000000 --- a/swarm/pss/testdata/snapshot_8.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","private_key":"e567b7d9c554e5102cdc99b6523bace02dbb8951415c8816d82ba2d2e97fa23b","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","private_key":"c7526db70acd02f36d3b201ef3e1d85e38c52bee6931453213dbc5edec4d0976","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","private_key":"61b5728f59bc43080c3b8eb0458fb30d7723e2747355b6dc980f35f3ed431199","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","private_key":"075b07c29ceac4ffa2a114afd67b21dfc438126bc169bf7c154be6d81d86ed38","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","private_key":"4882fdd34676c2158f7bfc761bf824fcf693736a8df294cc7e79ef1848c7bae6","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","private_key":"0470652ac57af40a43bc67b1b49699219fc35a805da167244f505d27858334c7","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","private_key":"2cbf6256e92736e1b54279b79addbb830a607a71488cdd3462a44fcaa68c018e","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","private_key":"e659774a5ff4f76b021bf4884ad359eadeb8ff33e843a3f76fcf4a38b0d82b35","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","up":true},{"one":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","other":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","up":true},{"one":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","other":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","up":true},{"one":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","other":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","up":true},{"one":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","other":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","up":true},{"one":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","other":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","up":true},{"one":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","other":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","up":true},{"one":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","other":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","up":true},{"one":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","other":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","up":true},{"one":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","other":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","up":true},{"one":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","other":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","up":true},{"one":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","other":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","up":true},{"one":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","other":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","up":true},{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","up":true},{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","up":true},{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","up":true}]} \ No newline at end of file diff --git a/swarm/pss/types.go b/swarm/pss/types.go deleted file mode 100644 index 1e33ecdcacf0..000000000000 --- a/swarm/pss/types.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package pss - -import ( - "encoding/json" - "fmt" - "sync" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/swarm/storage" - whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" -) - -const ( - defaultWhisperTTL = 6000 -) - -const ( - pssControlSym = 1 - pssControlRaw = 1 << 1 -) - -var ( - topicHashMutex = sync.Mutex{} - topicHashFunc = storage.MakeHashFunc("SHA256")() - rawTopic = Topic{} -) - -// Topic is the PSS encapsulation of the Whisper topic type -type Topic whisper.TopicType - -func (t *Topic) String() string { - return hexutil.Encode(t[:]) -} - -// MarshalJSON implements the json.Marshaler interface -func (t Topic) MarshalJSON() (b []byte, err error) { - return json.Marshal(t.String()) -} - -// MarshalJSON implements the json.Marshaler interface -func (t *Topic) UnmarshalJSON(input []byte) error { - topicbytes, err := hexutil.Decode(string(input[1 : len(input)-1])) - if err != nil { - return err - } - copy(t[:], topicbytes) - return nil -} - -// PssAddress is an alias for []byte. It represents a variable length address -type PssAddress []byte - -// MarshalJSON implements the json.Marshaler interface -func (a PssAddress) MarshalJSON() ([]byte, error) { - return json.Marshal(hexutil.Encode(a[:])) -} - -// UnmarshalJSON implements the json.Marshaler interface -func (a *PssAddress) UnmarshalJSON(input []byte) error { - b, err := hexutil.Decode(string(input[1 : len(input)-1])) - if err != nil { - return err - } - for _, bb := range b { - *a = append(*a, bb) - } - return nil -} - -// holds the digest of a message used for caching -type pssDigest [digestLength]byte - -// conceals bitwise operations on the control flags byte -type msgParams struct { - raw bool - sym bool -} - -func newMsgParamsFromBytes(paramBytes []byte) *msgParams { - if len(paramBytes) != 1 { - return nil - } - return &msgParams{ - raw: paramBytes[0]&pssControlRaw > 0, - sym: paramBytes[0]&pssControlSym > 0, - } -} - -func (m *msgParams) Bytes() (paramBytes []byte) { - var b byte - if m.raw { - b |= pssControlRaw - } - if m.sym { - b |= pssControlSym - } - paramBytes = append(paramBytes, b) - return paramBytes -} - -// PssMsg encapsulates messages transported over pss. -type PssMsg struct { - To []byte - Control []byte - Expire uint32 - Payload *whisper.Envelope -} - -func newPssMsg(param *msgParams) *PssMsg { - return &PssMsg{ - Control: param.Bytes(), - } -} - -// message is flagged as raw / external encryption -func (msg *PssMsg) isRaw() bool { - return msg.Control[0]&pssControlRaw > 0 -} - -// message is flagged as symmetrically encrypted -func (msg *PssMsg) isSym() bool { - return msg.Control[0]&pssControlSym > 0 -} - -// serializes the message for use in cache -func (msg *PssMsg) serialize() []byte { - rlpdata, _ := rlp.EncodeToBytes(struct { - To []byte - Payload *whisper.Envelope - }{ - To: msg.To, - Payload: msg.Payload, - }) - return rlpdata -} - -// String representation of PssMsg -func (msg *PssMsg) String() string { - return fmt.Sprintf("PssMsg: Recipient: %x", common.ToHex(msg.To)) -} - -// Signature for a message handler function for a PssMsg -// -// Implementations of this type are passed to Pss.Register together with a topic, -type Handler func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error - -// the stateStore handles saving and loading PSS peers and their corresponding keys -// it is currently unimplemented -type stateStore struct { - values map[string][]byte -} - -func newStateStore() *stateStore { - return &stateStore{values: make(map[string][]byte)} -} - -func (store *stateStore) Load(key string) ([]byte, error) { - return nil, nil -} - -func (store *stateStore) Save(key string, v []byte) error { - return nil -} - -// BytesToTopic hashes an arbitrary length byte slice and truncates it to the length of a topic, using only the first bytes of the digest -func BytesToTopic(b []byte) Topic { - topicHashMutex.Lock() - defer topicHashMutex.Unlock() - topicHashFunc.Reset() - topicHashFunc.Write(b) - return Topic(whisper.BytesToTopic(topicHashFunc.Sum(nil))) -} diff --git a/swarm/pss/writeup.md b/swarm/pss/writeup.md deleted file mode 100644 index af731fe7fdbb..000000000000 --- a/swarm/pss/writeup.md +++ /dev/null @@ -1,125 +0,0 @@ -## PSS tests failures explanation - -This document aims to explain the changes in https://github.com/ethersphere/go-ethereum/pull/126 and how those changes affect the pss_test.go TestNetwork tests. - -### Problem - -When running the TestNetwork test, execution sometimes: - -* deadlocks -* panics -* failures with wrong result, such as: - -``` -$ go test -v ./swarm/pss -cpu 4 -run TestNetwork -``` - -``` ---- FAIL: TestNetwork (68.13s) - --- FAIL: TestNetwork/3/10/4/sim (68.13s) - pss_test.go:697: 7 of 10 messages received - pss_test.go:700: 3 messages were not received -FAIL -``` - -Moreover execution almost always deadlocks with `sim` adapter, and `sock` adapter (when buffer is low), but is mostly stable with `exec` and `tcp` adapters. - -### Findings and Fixes - -#### 1. Addressing panics - -Panics were caused due to concurrent map read/writes and unsynchronised access to shared memory by multiple goroutines. This is visible when running the test with the `-race` flag. - -``` -go test -race -v ./swarm/pss -cpu 4 -run TestNetwork - - 1 ================== - 2 WARNING: DATA RACE - 3 Read at 0x00c424d456a0 by goroutine 1089: - 4 github.com/ethereum/go-ethereum/swarm/pss.(*Pss).forward.func1() - 5 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/swarm/pss/pss.go:654 +0x44f - 6 github.com/ethereum/go-ethereum/swarm/network.(*Kademlia).eachConn.func1() - 7 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/swarm/network/kademlia.go:350 +0xc9 - 8 github.com/ethereum/go-ethereum/pot.(*Pot).eachNeighbour.func1() - 9 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/pot/pot.go:599 +0x59 - ... - - 28 - 29 Previous write at 0x00c424d456a0 by goroutine 829: - 30 github.com/ethereum/go-ethereum/swarm/pss.(*Pss).Run() - 31 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/swarm/pss/pss.go:192 +0x16a - 32 github.com/ethereum/go-ethereum/swarm/pss.(*Pss).Run-fm() - 33 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/swarm/pss/pss.go:185 +0x63 - 34 github.com/ethereum/go-ethereum/p2p.(*Peer).startProtocols.func1() - 35 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/p2p/peer.go:347 +0x8b - ... -``` - -##### Current solution - -Adding a mutex around all shared data. - -#### 2. Failures with wrong result - -The validation phase of the TestNetwork test is done using an RPC subscription: - -``` - ... - triggerChecks := func(trigger chan enode.ID, id enode.ID, rpcclient *rpc.Client) error { - msgC := make(chan APIMsg) - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - sub, err := rpcclient.Subscribe(ctx, "pss", msgC, "receive", hextopic) - ... -``` - -By design the RPC uses a subscription buffer with a max length. When this length is reached, the subscription is dropped. The current config value is not suitable for stress tests. - -##### Current solution - -Increase the max length of the RPC subscription buffer. - -``` -const ( - // Subscriptions are removed when the subscriber cannot keep up. - // - // This can be worked around by supplying a channel with sufficiently sized buffer, - // but this can be inconvenient and hard to explain in the docs. Another issue with - // buffered channels is that the buffer is static even though it might not be needed - // most of the time. - // - // The approach taken here is to maintain a per-subscription linked list buffer - // shrinks on demand. If the buffer reaches the size below, the subscription is - // dropped. - maxClientSubscriptionBuffer = 20000 -) -``` - -#### 3. Deadlocks - -Deadlocks are triggered when using: -* `sim` adapter - synchronous, unbuffered channel -* `sock` adapter - asynchronous, buffered channel (when using a 1K buffer) - -No deadlocks were triggered when using: -* `tcp` adapter - asynchronous, buffered channel -* `exec` adapter - asynchronous, buffered channel - -Ultimately the deadlocks happen due to blocking `pp.Send()` call at: - - // attempt to send the message - err := pp.Send(msg) - if err != nil { - log.Debug(fmt.Sprintf("%v: failed forwarding: %v", sendMsg, err)) - return true - } - - `p2p` request handling is synchronous (as discussed at https://github.com/ethersphere/go-ethereum/issues/130), `pss` is also synchronous, therefore if two nodes happen to be processing a request, while at the same time waiting for response on `pp.Send(msg)`, deadlock occurs. - - `pp.Send(msg)` is only blocking when the underlying adapter is blocking (read `sim` or `sock`) or the buffer of the connection is full. - -##### Current solution - -Make no assumption on the undelying connection, and call `pp.Send` asynchronously in a go-routine. - -Alternatively, get rid of the `sim` and `sock` adapters, and use `tcp` adapter for testing. diff --git a/swarm/sctx/sctx.go b/swarm/sctx/sctx.go deleted file mode 100644 index bed2b1145821..000000000000 --- a/swarm/sctx/sctx.go +++ /dev/null @@ -1,22 +0,0 @@ -package sctx - -import "context" - -type ContextKey int - -const ( - HTTPRequestIDKey ContextKey = iota - requestHostKey -) - -func SetHost(ctx context.Context, domain string) context.Context { - return context.WithValue(ctx, requestHostKey, domain) -} - -func GetHost(ctx context.Context) string { - v, ok := ctx.Value(requestHostKey).(string) - if ok { - return v - } - return "" -} diff --git a/swarm/services/swap/swap.go b/swarm/services/swap/swap.go deleted file mode 100644 index 91fa54fcf034..000000000000 --- a/swarm/services/swap/swap.go +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swap - -import ( - "context" - "crypto/ecdsa" - "errors" - "fmt" - "math/big" - "os" - "path/filepath" - "sync" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/chequebook" - "github.com/ethereum/go-ethereum/contracts/chequebook/contract" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/services/swap/swap" -) - -// SwAP Swarm Accounting Protocol with -// SWAP^2 Strategies of Withholding Automatic Payments -// SWAP^3 Accreditation: payment via credit SWAP -// using chequebook pkg for delayed payments -// default parameters - -var ( - autoCashInterval = 300 * time.Second // default interval for autocash - autoCashThreshold = big.NewInt(50000000000000) // threshold that triggers autocash (wei) - autoDepositInterval = 300 * time.Second // default interval for autocash - autoDepositThreshold = big.NewInt(50000000000000) // threshold that triggers autodeposit (wei) - autoDepositBuffer = big.NewInt(100000000000000) // buffer that is surplus for fork protection etc (wei) - buyAt = big.NewInt(20000000000) // maximum chunk price host is willing to pay (wei) - sellAt = big.NewInt(20000000000) // minimum chunk price host requires (wei) - payAt = 100 // threshold that triggers payment {request} (units) - dropAt = 10000 // threshold that triggers disconnect (units) -) - -const ( - chequebookDeployRetries = 5 - chequebookDeployDelay = 1 * time.Second // delay between retries -) - -// LocalProfile combines a PayProfile with *swap.Params -type LocalProfile struct { - *swap.Params - *PayProfile -} - -// RemoteProfile combines a PayProfile with *swap.Profile -type RemoteProfile struct { - *swap.Profile - *PayProfile -} - -// PayProfile is a container for relevant chequebook and beneficiary options -type PayProfile struct { - PublicKey string // check against signature of promise - Contract common.Address // address of chequebook contract - Beneficiary common.Address // recipient address for swarm sales revenue - privateKey *ecdsa.PrivateKey - publicKey *ecdsa.PublicKey - owner common.Address - chbook *chequebook.Chequebook - lock sync.RWMutex -} - -// NewDefaultSwapParams create params with default values -func NewDefaultSwapParams() *LocalProfile { - return &LocalProfile{ - PayProfile: &PayProfile{}, - Params: &swap.Params{ - Profile: &swap.Profile{ - BuyAt: buyAt, - SellAt: sellAt, - PayAt: uint(payAt), - DropAt: uint(dropAt), - }, - Strategy: &swap.Strategy{ - AutoCashInterval: autoCashInterval, - AutoCashThreshold: autoCashThreshold, - AutoDepositInterval: autoDepositInterval, - AutoDepositThreshold: autoDepositThreshold, - AutoDepositBuffer: autoDepositBuffer, - }, - }, - } -} - -// Init this can only finally be set after all config options (file, cmd line, env vars) -// have been evaluated -func (lp *LocalProfile) Init(contract common.Address, prvkey *ecdsa.PrivateKey) { - pubkey := &prvkey.PublicKey - - lp.PayProfile = &PayProfile{ - PublicKey: common.ToHex(crypto.FromECDSAPub(pubkey)), - Contract: contract, - Beneficiary: crypto.PubkeyToAddress(*pubkey), - privateKey: prvkey, - publicKey: pubkey, - owner: crypto.PubkeyToAddress(*pubkey), - } -} - -// NewSwap constructor, parameters -// * global chequebook, assume deployed service and -// * the balance is at buffer. -// swap.Add(n) called in netstore -// n > 0 called when sending chunks = receiving retrieve requests -// OR sending cheques. -// n < 0 called when receiving chunks = receiving delivery responses -// OR receiving cheques. -func NewSwap(localProfile *LocalProfile, remoteProfile *RemoteProfile, backend chequebook.Backend, proto swap.Protocol) (swapInstance *swap.Swap, err error) { - var ( - ctx = context.TODO() - ok bool - in *chequebook.Inbox - out *chequebook.Outbox - ) - - remotekey, err := crypto.UnmarshalPubkey(common.FromHex(remoteProfile.PublicKey)) - if err != nil { - return nil, errors.New("invalid remote public key") - } - - // check if remoteProfile chequebook is valid - // insolvent chequebooks suicide so will signal as invalid - // TODO: monitoring a chequebooks events - ok, err = chequebook.ValidateCode(ctx, backend, remoteProfile.Contract) - if !ok { - log.Info(fmt.Sprintf("invalid contract %v for peer %v: %v)", remoteProfile.Contract.Hex()[:8], proto, err)) - } else { - // remoteProfile contract valid, create inbox - in, err = chequebook.NewInbox(localProfile.privateKey, remoteProfile.Contract, localProfile.Beneficiary, remotekey, backend) - if err != nil { - log.Warn(fmt.Sprintf("unable to set up inbox for chequebook contract %v for peer %v: %v)", remoteProfile.Contract.Hex()[:8], proto, err)) - } - } - - // check if localProfile chequebook contract is valid - ok, err = chequebook.ValidateCode(ctx, backend, localProfile.Contract) - if !ok { - log.Warn(fmt.Sprintf("unable to set up outbox for peer %v: chequebook contract (owner: %v): %v)", proto, localProfile.owner.Hex(), err)) - } else { - out = chequebook.NewOutbox(localProfile.Chequebook(), remoteProfile.Beneficiary) - } - - pm := swap.Payment{ - In: in, - Out: out, - Buys: out != nil, - Sells: in != nil, - } - swapInstance, err = swap.New(localProfile.Params, pm, proto) - if err != nil { - return - } - // remoteProfile profile given (first) in handshake - swapInstance.SetRemote(remoteProfile.Profile) - var buy, sell string - if swapInstance.Buys { - buy = "purchase from peer enabled at " + remoteProfile.SellAt.String() + " wei/chunk" - } else { - buy = "purchase from peer disabled" - } - if swapInstance.Sells { - sell = "selling to peer enabled at " + localProfile.SellAt.String() + " wei/chunk" - } else { - sell = "selling to peer disabled" - } - log.Warn(fmt.Sprintf("SWAP arrangement with <%v>: %v; %v)", proto, buy, sell)) - - return -} - -// Chequebook get's chequebook from the localProfile -func (lp *LocalProfile) Chequebook() *chequebook.Chequebook { - defer lp.lock.Unlock() - lp.lock.Lock() - return lp.chbook -} - -// PrivateKey accessor -func (lp *LocalProfile) PrivateKey() *ecdsa.PrivateKey { - return lp.privateKey -} - -// func (self *LocalProfile) PublicKey() *ecdsa.PublicKey { -// return self.publicKey -// } - -// SetKey set's private and public key on localProfile -func (lp *LocalProfile) SetKey(prvkey *ecdsa.PrivateKey) { - lp.privateKey = prvkey - lp.publicKey = &prvkey.PublicKey -} - -// SetChequebook wraps the chequebook initialiser and sets up autoDeposit to cover spending. -func (lp *LocalProfile) SetChequebook(ctx context.Context, backend chequebook.Backend, path string) error { - lp.lock.Lock() - swapContract := lp.Contract - lp.lock.Unlock() - - valid, err := chequebook.ValidateCode(ctx, backend, swapContract) - if err != nil { - return err - } else if valid { - return lp.newChequebookFromContract(path, backend) - } - return lp.deployChequebook(ctx, backend, path) -} - -// deployChequebook deploys the localProfile Chequebook -func (lp *LocalProfile) deployChequebook(ctx context.Context, backend chequebook.Backend, path string) error { - opts := bind.NewKeyedTransactor(lp.privateKey) - opts.Value = lp.AutoDepositBuffer - opts.Context = ctx - - log.Info(fmt.Sprintf("Deploying new chequebook (owner: %v)", opts.From.Hex())) - address, err := deployChequebookLoop(opts, backend) - if err != nil { - log.Error(fmt.Sprintf("unable to deploy new chequebook: %v", err)) - return err - } - log.Info(fmt.Sprintf("new chequebook deployed at %v (owner: %v)", address.Hex(), opts.From.Hex())) - - // need to save config at this point - lp.lock.Lock() - lp.Contract = address - err = lp.newChequebookFromContract(path, backend) - lp.lock.Unlock() - if err != nil { - log.Warn(fmt.Sprintf("error initialising cheque book (owner: %v): %v", opts.From.Hex(), err)) - } - return err -} - -// deployChequebookLoop repeatedly tries to deploy a chequebook. -func deployChequebookLoop(opts *bind.TransactOpts, backend chequebook.Backend) (addr common.Address, err error) { - var tx *types.Transaction - for try := 0; try < chequebookDeployRetries; try++ { - if try > 0 { - time.Sleep(chequebookDeployDelay) - } - if _, tx, _, err = contract.DeployChequebook(opts, backend); err != nil { - log.Warn(fmt.Sprintf("can't send chequebook deploy tx (try %d): %v", try, err)) - continue - } - if addr, err = bind.WaitDeployed(opts.Context, backend, tx); err != nil { - log.Warn(fmt.Sprintf("chequebook deploy error (try %d): %v", try, err)) - continue - } - return addr, nil - } - return addr, err -} - -// newChequebookFromContract - initialise the chequebook from a persisted json file or create a new one -// caller holds the lock -func (lp *LocalProfile) newChequebookFromContract(path string, backend chequebook.Backend) error { - hexkey := common.Bytes2Hex(lp.Contract.Bytes()) - err := os.MkdirAll(filepath.Join(path, "chequebooks"), os.ModePerm) - if err != nil { - return fmt.Errorf("unable to create directory for chequebooks: %v", err) - } - - chbookpath := filepath.Join(path, "chequebooks", hexkey+".json") - lp.chbook, err = chequebook.LoadChequebook(chbookpath, lp.privateKey, backend, true) - - if err != nil { - lp.chbook, err = chequebook.NewChequebook(chbookpath, lp.Contract, lp.privateKey, backend) - if err != nil { - log.Warn(fmt.Sprintf("unable to initialise chequebook (owner: %v): %v", lp.owner.Hex(), err)) - return fmt.Errorf("unable to initialise chequebook (owner: %v): %v", lp.owner.Hex(), err) - } - } - - lp.chbook.AutoDeposit(lp.AutoDepositInterval, lp.AutoDepositThreshold, lp.AutoDepositBuffer) - log.Info(fmt.Sprintf("auto deposit ON for %v -> %v: interval = %v, threshold = %v, buffer = %v)", crypto.PubkeyToAddress(*(lp.publicKey)).Hex()[:8], lp.Contract.Hex()[:8], lp.AutoDepositInterval, lp.AutoDepositThreshold, lp.AutoDepositBuffer)) - - return nil -} diff --git a/swarm/services/swap/swap/swap.go b/swarm/services/swap/swap/swap.go deleted file mode 100644 index 0afca9ab30a8..000000000000 --- a/swarm/services/swap/swap/swap.go +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swap - -import ( - "fmt" - "math/big" - "sync" - "time" - - "github.com/ethereum/go-ethereum/swarm/log" -) - -// SwAP Swarm Accounting Protocol with -// Swift Automatic Payments -// a peer to peer micropayment system - -// Profile - public swap profile -// public parameters for SWAP, serializable config struct passed in handshake -type Profile struct { - BuyAt *big.Int // accepted max price for chunk - SellAt *big.Int // offered sale price for chunk - PayAt uint // threshold that triggers payment request - DropAt uint // threshold that triggers disconnect -} - -// Strategy encapsulates parameters relating to -// automatic deposit and automatic cashing -type Strategy struct { - AutoCashInterval time.Duration // default interval for autocash - AutoCashThreshold *big.Int // threshold that triggers autocash (wei) - AutoDepositInterval time.Duration // default interval for autocash - AutoDepositThreshold *big.Int // threshold that triggers autodeposit (wei) - AutoDepositBuffer *big.Int // buffer that is surplus for fork protection etc (wei) -} - -// Params extends the public profile with private parameters relating to -// automatic deposit and automatic cashing -type Params struct { - *Profile - *Strategy -} - -// Promise - 3rd party Provable Promise of Payment -// issued by outPayment -// serializable to send with Protocol -type Promise interface{} - -// Protocol interface for the peer protocol for testing or external alternative payment -type Protocol interface { - Pay(int, Promise) // units, payment proof - Drop() - String() string -} - -// OutPayment interface for the (delayed) outgoing payment system with auto-deposit -type OutPayment interface { - Issue(amount *big.Int) (promise Promise, err error) - AutoDeposit(interval time.Duration, threshold, buffer *big.Int) - Stop() -} - -// InPayment interface for the (delayed) incoming payment system with autocash -type InPayment interface { - Receive(promise Promise) (*big.Int, error) - AutoCash(cashInterval time.Duration, maxUncashed *big.Int) - Stop() -} - -// Swap is the swarm accounting protocol instance -// * pairwise accounting and payments -type Swap struct { - lock sync.Mutex // mutex for balance access - balance int // units of chunk/retrieval request - local *Params // local peer's swap parameters - remote *Profile // remote peer's swap profile - proto Protocol // peer communication protocol - Payment -} - -// Payment handlers -type Payment struct { - Out OutPayment // outgoing payment handler - In InPayment // incoming payment handler - Buys, Sells bool -} - -// New - swap constructor -func New(local *Params, pm Payment, proto Protocol) (swap *Swap, err error) { - - swap = &Swap{ - local: local, - Payment: pm, - proto: proto, - } - - swap.SetParams(local) - - return -} - -// SetRemote - entry point for setting remote swap profile (e.g from handshake or other message) -func (swap *Swap) SetRemote(remote *Profile) { - defer swap.lock.Unlock() - swap.lock.Lock() - - swap.remote = remote - if swap.Sells && (remote.BuyAt.Sign() <= 0 || swap.local.SellAt.Sign() <= 0 || remote.BuyAt.Cmp(swap.local.SellAt) < 0) { - swap.Out.Stop() - swap.Sells = false - } - if swap.Buys && (remote.SellAt.Sign() <= 0 || swap.local.BuyAt.Sign() <= 0 || swap.local.BuyAt.Cmp(swap.remote.SellAt) < 0) { - swap.In.Stop() - swap.Buys = false - } - - log.Debug(fmt.Sprintf("<%v> remote profile set: pay at: %v, drop at: %v, buy at: %v, sell at: %v", swap.proto, remote.PayAt, remote.DropAt, remote.BuyAt, remote.SellAt)) - -} - -// SetParams - to set strategy dynamically -func (swap *Swap) SetParams(local *Params) { - defer swap.lock.Unlock() - swap.lock.Lock() - swap.local = local - swap.setParams(local) -} - -// setParams - caller holds the lock -func (swap *Swap) setParams(local *Params) { - - if swap.Sells { - swap.In.AutoCash(local.AutoCashInterval, local.AutoCashThreshold) - log.Info(fmt.Sprintf("<%v> set autocash to every %v, max uncashed limit: %v", swap.proto, local.AutoCashInterval, local.AutoCashThreshold)) - } else { - log.Info(fmt.Sprintf("<%v> autocash off (not selling)", swap.proto)) - } - if swap.Buys { - swap.Out.AutoDeposit(local.AutoDepositInterval, local.AutoDepositThreshold, local.AutoDepositBuffer) - log.Info(fmt.Sprintf("<%v> set autodeposit to every %v, pay at: %v, buffer: %v", swap.proto, local.AutoDepositInterval, local.AutoDepositThreshold, local.AutoDepositBuffer)) - } else { - log.Info(fmt.Sprintf("<%v> autodeposit off (not buying)", swap.proto)) - } -} - -// Add (n) -// n > 0 called when promised/provided n units of service -// n < 0 called when used/requested n units of service -func (swap *Swap) Add(n int) error { - defer swap.lock.Unlock() - swap.lock.Lock() - swap.balance += n - if !swap.Sells && swap.balance > 0 { - log.Trace(fmt.Sprintf("<%v> remote peer cannot have debt (balance: %v)", swap.proto, swap.balance)) - swap.proto.Drop() - return fmt.Errorf("[SWAP] <%v> remote peer cannot have debt (balance: %v)", swap.proto, swap.balance) - } - if !swap.Buys && swap.balance < 0 { - log.Trace(fmt.Sprintf("<%v> we cannot have debt (balance: %v)", swap.proto, swap.balance)) - return fmt.Errorf("[SWAP] <%v> we cannot have debt (balance: %v)", swap.proto, swap.balance) - } - if swap.balance >= int(swap.local.DropAt) { - log.Trace(fmt.Sprintf("<%v> remote peer has too much debt (balance: %v, disconnect threshold: %v)", swap.proto, swap.balance, swap.local.DropAt)) - swap.proto.Drop() - return fmt.Errorf("[SWAP] <%v> remote peer has too much debt (balance: %v, disconnect threshold: %v)", swap.proto, swap.balance, swap.local.DropAt) - } else if swap.balance <= -int(swap.remote.PayAt) { - swap.send() - } - return nil -} - -// Balance accessor -func (swap *Swap) Balance() int { - defer swap.lock.Unlock() - swap.lock.Lock() - return swap.balance -} - -// send (units) is called when payment is due -// In case of insolvency no promise is issued and sent, safe against fraud -// No return value: no error = payment is opportunistic = hang in till dropped -func (swap *Swap) send() { - if swap.local.BuyAt != nil && swap.balance < 0 { - amount := big.NewInt(int64(-swap.balance)) - amount.Mul(amount, swap.remote.SellAt) - promise, err := swap.Out.Issue(amount) - if err != nil { - log.Warn(fmt.Sprintf("<%v> cannot issue cheque (amount: %v, channel: %v): %v", swap.proto, amount, swap.Out, err)) - } else { - log.Warn(fmt.Sprintf("<%v> cheque issued (amount: %v, channel: %v)", swap.proto, amount, swap.Out)) - swap.proto.Pay(-swap.balance, promise) - swap.balance = 0 - } - } -} - -// Receive (units, promise) is called by the protocol when a payment msg is received -// returns error if promise is invalid. -func (swap *Swap) Receive(units int, promise Promise) error { - if units <= 0 { - return fmt.Errorf("invalid units: %v <= 0", units) - } - - price := new(big.Int).SetInt64(int64(units)) - price.Mul(price, swap.local.SellAt) - - amount, err := swap.In.Receive(promise) - - if err != nil { - err = fmt.Errorf("invalid promise: %v", err) - } else if price.Cmp(amount) != 0 { - // verify amount = units * unit sale price - return fmt.Errorf("invalid amount: %v = %v * %v (units sent in msg * agreed sale unit price) != %v (signed in cheque)", price, units, swap.local.SellAt, amount) - } - if err != nil { - log.Trace(fmt.Sprintf("<%v> invalid promise (amount: %v, channel: %v): %v", swap.proto, amount, swap.In, err)) - return err - } - - // credit remote peer with units - swap.Add(-units) - log.Trace(fmt.Sprintf("<%v> received promise (amount: %v, channel: %v): %v", swap.proto, amount, swap.In, promise)) - - return nil -} - -// Stop causes autocash loop to terminate. -// Called after protocol handle loop terminates. -func (swap *Swap) Stop() { - defer swap.lock.Unlock() - swap.lock.Lock() - if swap.Buys { - swap.Out.Stop() - } - if swap.Sells { - swap.In.Stop() - } -} diff --git a/swarm/services/swap/swap/swap_test.go b/swarm/services/swap/swap/swap_test.go deleted file mode 100644 index d0e34f8a54cb..000000000000 --- a/swarm/services/swap/swap/swap_test.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swap - -import ( - "math/big" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" -) - -type testInPayment struct { - received []*testPromise - autocashInterval time.Duration - autocashLimit *big.Int -} - -type testPromise struct { - amount *big.Int -} - -func (test *testInPayment) Receive(promise Promise) (*big.Int, error) { - p := promise.(*testPromise) - test.received = append(test.received, p) - return p.amount, nil -} - -func (test *testInPayment) AutoCash(interval time.Duration, limit *big.Int) { - test.autocashInterval = interval - test.autocashLimit = limit -} - -func (test *testInPayment) Cash() (string, error) { return "", nil } - -func (test *testInPayment) Stop() {} - -type testOutPayment struct { - deposits []*big.Int - autodepositInterval time.Duration - autodepositThreshold *big.Int - autodepositBuffer *big.Int -} - -func (test *testOutPayment) Issue(amount *big.Int) (promise Promise, err error) { - return &testPromise{amount}, nil -} - -func (test *testOutPayment) Deposit(amount *big.Int) (string, error) { - test.deposits = append(test.deposits, amount) - return "", nil -} - -func (test *testOutPayment) AutoDeposit(interval time.Duration, threshold, buffer *big.Int) { - test.autodepositInterval = interval - test.autodepositThreshold = threshold - test.autodepositBuffer = buffer -} - -func (test *testOutPayment) Stop() {} - -type testProtocol struct { - drop bool - amounts []int - promises []*testPromise -} - -func (test *testProtocol) Drop() { - test.drop = true -} - -func (test *testProtocol) String() string { - return "" -} - -func (test *testProtocol) Pay(amount int, promise Promise) { - p := promise.(*testPromise) - test.promises = append(test.promises, p) - test.amounts = append(test.amounts, amount) -} - -func TestSwap(t *testing.T) { - - strategy := &Strategy{ - AutoCashInterval: 1 * time.Second, - AutoCashThreshold: big.NewInt(20), - AutoDepositInterval: 1 * time.Second, - AutoDepositThreshold: big.NewInt(20), - AutoDepositBuffer: big.NewInt(40), - } - - local := &Params{ - Profile: &Profile{ - PayAt: 5, - DropAt: 10, - BuyAt: common.Big3, - SellAt: common.Big2, - }, - Strategy: strategy, - } - - in := &testInPayment{} - out := &testOutPayment{} - proto := &testProtocol{} - - swap, _ := New(local, Payment{In: in, Out: out, Buys: true, Sells: true}, proto) - - if in.autocashInterval != strategy.AutoCashInterval { - t.Fatalf("autocash interval not properly set, expect %v, got %v", strategy.AutoCashInterval, in.autocashInterval) - } - if out.autodepositInterval != strategy.AutoDepositInterval { - t.Fatalf("autodeposit interval not properly set, expect %v, got %v", strategy.AutoDepositInterval, out.autodepositInterval) - } - - remote := &Profile{ - PayAt: 3, - DropAt: 10, - BuyAt: common.Big2, - SellAt: common.Big3, - } - swap.SetRemote(remote) - - swap.Add(9) - if proto.drop { - t.Fatalf("not expected peer to be dropped") - } - swap.Add(1) - if !proto.drop { - t.Fatalf("expected peer to be dropped") - } - if !proto.drop { - t.Fatalf("expected peer to be dropped") - } - proto.drop = false - - swap.Receive(10, &testPromise{big.NewInt(20)}) - if swap.balance != 0 { - t.Fatalf("expected zero balance, got %v", swap.balance) - } - - if len(proto.amounts) != 0 { - t.Fatalf("expected zero balance, got %v", swap.balance) - } - - swap.Add(-2) - if len(proto.amounts) > 0 { - t.Fatalf("expected no payments yet, got %v", proto.amounts) - } - - swap.Add(-1) - if len(proto.amounts) != 1 { - t.Fatalf("expected one payment, got %v", len(proto.amounts)) - } - - if proto.amounts[0] != 3 { - t.Fatalf("expected payment for %v units, got %v", proto.amounts[0], 3) - } - - exp := new(big.Int).Mul(big.NewInt(int64(proto.amounts[0])), remote.SellAt) - if proto.promises[0].amount.Cmp(exp) != 0 { - t.Fatalf("expected payment amount %v, got %v", exp, proto.promises[0].amount) - } - - swap.SetParams(&Params{ - Profile: &Profile{ - PayAt: 5, - DropAt: 10, - BuyAt: common.Big3, - SellAt: common.Big2, - }, - Strategy: &Strategy{ - AutoCashInterval: 2 * time.Second, - AutoCashThreshold: big.NewInt(40), - AutoDepositInterval: 2 * time.Second, - AutoDepositThreshold: big.NewInt(40), - AutoDepositBuffer: big.NewInt(60), - }, - }) - -} diff --git a/swarm/spancontext/spancontext.go b/swarm/spancontext/spancontext.go deleted file mode 100644 index 2cb9f82f7c9e..000000000000 --- a/swarm/spancontext/spancontext.go +++ /dev/null @@ -1,49 +0,0 @@ -package spancontext - -import ( - "context" - - opentracing "github.com/opentracing/opentracing-go" -) - -func WithContext(ctx context.Context, sctx opentracing.SpanContext) context.Context { - return context.WithValue(ctx, "span_context", sctx) -} - -func FromContext(ctx context.Context) opentracing.SpanContext { - sctx, ok := ctx.Value("span_context").(opentracing.SpanContext) - if ok { - return sctx - } - - return nil -} - -func StartSpan(ctx context.Context, name string) (context.Context, opentracing.Span) { - tracer := opentracing.GlobalTracer() - - sctx := FromContext(ctx) - - var sp opentracing.Span - if sctx != nil { - sp = tracer.StartSpan( - name, - opentracing.ChildOf(sctx)) - } else { - sp = tracer.StartSpan(name) - } - - nctx := context.WithValue(ctx, "span_context", sp.Context()) - - return nctx, sp -} - -func StartSpanFrom(name string, sctx opentracing.SpanContext) opentracing.Span { - tracer := opentracing.GlobalTracer() - - sp := tracer.StartSpan( - name, - opentracing.ChildOf(sctx)) - - return sp -} diff --git a/swarm/state.go b/swarm/state.go deleted file mode 100644 index 1984ab031122..000000000000 --- a/swarm/state.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swarm - -type Voidstore struct { -} - -func (self Voidstore) Load(string) ([]byte, error) { - return nil, nil -} - -func (self Voidstore) Save(string, []byte) error { - return nil -} diff --git a/swarm/state/dbstore.go b/swarm/state/dbstore.go deleted file mode 100644 index 5e5c172b25ca..000000000000 --- a/swarm/state/dbstore.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package state - -import ( - "encoding" - "encoding/json" - "errors" - - "github.com/syndtr/goleveldb/leveldb" -) - -// ErrNotFound is returned when no results are returned from the database -var ErrNotFound = errors.New("ErrorNotFound") - -// ErrInvalidArgument is returned when the argument type does not match the expected type -var ErrInvalidArgument = errors.New("ErrorInvalidArgument") - -// DBStore uses LevelDB to store values. -type DBStore struct { - db *leveldb.DB -} - -// NewDBStore creates a new instance of DBStore. -func NewDBStore(path string) (s *DBStore, err error) { - db, err := leveldb.OpenFile(path, nil) - if err != nil { - return nil, err - } - return &DBStore{ - db: db, - }, nil -} - -// Get retrieves a persisted value for a specific key. If there is no results -// ErrNotFound is returned. The provided parameter should be either a byte slice or -// a struct that implements the encoding.BinaryUnmarshaler interface -func (s *DBStore) Get(key string, i interface{}) (err error) { - has, err := s.db.Has([]byte(key), nil) - if err != nil || !has { - return ErrNotFound - } - - data, err := s.db.Get([]byte(key), nil) - if err == leveldb.ErrNotFound { - return ErrNotFound - } - - unmarshaler, ok := i.(encoding.BinaryUnmarshaler) - if !ok { - return json.Unmarshal(data, i) - } - return unmarshaler.UnmarshalBinary(data) -} - -// Put stores an object that implements Binary for a specific key. -func (s *DBStore) Put(key string, i interface{}) (err error) { - bytes := []byte{} - - marshaler, ok := i.(encoding.BinaryMarshaler) - if !ok { - if bytes, err = json.Marshal(i); err != nil { - return err - } - } else { - if bytes, err = marshaler.MarshalBinary(); err != nil { - return err - } - } - - return s.db.Put([]byte(key), bytes, nil) -} - -// Delete removes entries stored under a specific key. -func (s *DBStore) Delete(key string) (err error) { - return s.db.Delete([]byte(key), nil) -} - -// Close releases the resources used by the underlying LevelDB. -func (s *DBStore) Close() error { - return s.db.Close() -} diff --git a/swarm/state/dbstore_test.go b/swarm/state/dbstore_test.go deleted file mode 100644 index 6683e788f7ed..000000000000 --- a/swarm/state/dbstore_test.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package state - -import ( - "bytes" - "errors" - "io/ioutil" - "os" - "strings" - "testing" -) - -var ErrInvalidArraySize = errors.New("invalid byte array size") -var ErrInvalidValuePersisted = errors.New("invalid value was persisted to the db") - -type SerializingType struct { - key string - value string -} - -func (st *SerializingType) MarshalBinary() (data []byte, err error) { - d := []byte(strings.Join([]string{st.key, st.value}, ";")) - - return d, nil -} - -func (st *SerializingType) UnmarshalBinary(data []byte) (err error) { - d := bytes.Split(data, []byte(";")) - l := len(d) - if l == 0 { - return ErrInvalidArraySize - } - if l == 2 { - keyLen := len(d[0]) - st.key = string(d[0][:keyLen]) - - valLen := len(d[1]) - st.value = string(d[1][:valLen]) - } - - return nil -} - -// TestDBStore tests basic functionality of DBStore. -func TestDBStore(t *testing.T) { - dir, err := ioutil.TempDir("", "db_store_test") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir) - - store, err := NewDBStore(dir) - if err != nil { - t.Fatal(err) - } - - testStore(t, store) - - store.Close() - - persistedStore, err := NewDBStore(dir) - if err != nil { - t.Fatal(err) - } - defer persistedStore.Close() - - testPersistedStore(t, persistedStore) -} - -func testStore(t *testing.T, store Store) { - ser := &SerializingType{key: "key1", value: "value1"} - jsonify := []string{"a", "b", "c"} - - err := store.Put(ser.key, ser) - if err != nil { - t.Fatal(err) - } - - err = store.Put("key2", jsonify) - if err != nil { - t.Fatal(err) - } - -} - -func testPersistedStore(t *testing.T, store Store) { - ser := &SerializingType{} - - err := store.Get("key1", ser) - if err != nil { - t.Fatal(err) - } - - if ser.key != "key1" || ser.value != "value1" { - t.Fatal(ErrInvalidValuePersisted) - } - - as := []string{} - err = store.Get("key2", &as) - - if len(as) != 3 { - t.Fatalf("serialized array did not match expectation") - } - if as[0] != "a" || as[1] != "b" || as[2] != "c" { - t.Fatalf("elements serialized did not match expected values") - } -} diff --git a/swarm/state/inmemorystore.go b/swarm/state/inmemorystore.go deleted file mode 100644 index 1ca25404a19e..000000000000 --- a/swarm/state/inmemorystore.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package state - -import ( - "encoding" - "encoding/json" - "sync" -) - -// InmemoryStore is the reference implementation of Store interface that is supposed -// to be used in tests. -type InmemoryStore struct { - db map[string][]byte - mu sync.RWMutex -} - -// NewInmemoryStore returns a new instance of InmemoryStore. -func NewInmemoryStore() *InmemoryStore { - return &InmemoryStore{ - db: make(map[string][]byte), - } -} - -// Get retrieves a value stored for a specific key. If there is no value found, -// ErrNotFound is returned. -func (s *InmemoryStore) Get(key string, i interface{}) (err error) { - s.mu.RLock() - defer s.mu.RUnlock() - - bytes, ok := s.db[key] - if !ok { - return ErrNotFound - } - - unmarshaler, ok := i.(encoding.BinaryUnmarshaler) - if !ok { - return json.Unmarshal(bytes, i) - } - - return unmarshaler.UnmarshalBinary(bytes) -} - -// Put stores a value for a specific key. -func (s *InmemoryStore) Put(key string, i interface{}) (err error) { - s.mu.Lock() - defer s.mu.Unlock() - bytes := []byte{} - - marshaler, ok := i.(encoding.BinaryMarshaler) - if !ok { - if bytes, err = json.Marshal(i); err != nil { - return err - } - } else { - if bytes, err = marshaler.MarshalBinary(); err != nil { - return err - } - } - - s.db[key] = bytes - return nil -} - -// Delete removes value stored under a specific key. -func (s *InmemoryStore) Delete(key string) (err error) { - s.mu.Lock() - defer s.mu.Unlock() - - if _, ok := s.db[key]; !ok { - return ErrNotFound - } - delete(s.db, key) - return nil -} - -// Close does not do anything. -func (s *InmemoryStore) Close() error { - return nil -} diff --git a/swarm/state/store.go b/swarm/state/store.go deleted file mode 100644 index fb7fe258f177..000000000000 --- a/swarm/state/store.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package state - -// Store defines methods required to get, set, delete values for different keys -// and close the underlying resources. -type Store interface { - Get(key string, i interface{}) (err error) - Put(key string, i interface{}) (err error) - Delete(key string) (err error) - Close() error -} diff --git a/swarm/storage/chunker.go b/swarm/storage/chunker.go deleted file mode 100644 index 40292e88f9b5..000000000000 --- a/swarm/storage/chunker.go +++ /dev/null @@ -1,614 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package storage - -import ( - "context" - "encoding/binary" - "errors" - "fmt" - "io" - "sync" - - "github.com/ethereum/go-ethereum/metrics" - ch "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/spancontext" - opentracing "github.com/opentracing/opentracing-go" - olog "github.com/opentracing/opentracing-go/log" -) - -/* -The distributed storage implemented in this package requires fix sized chunks of content. - -Chunker is the interface to a component that is responsible for disassembling and assembling larger data. - -TreeChunker implements a Chunker based on a tree structure defined as follows: - -1 each node in the tree including the root and other branching nodes are stored as a chunk. - -2 branching nodes encode data contents that includes the size of the dataslice covered by its entire subtree under the node as well as the hash keys of all its children : -data_{i} := size(subtree_{i}) || key_{j} || key_{j+1} .... || key_{j+n-1} - -3 Leaf nodes encode an actual subslice of the input data. - -4 if data size is not more than maximum chunksize, the data is stored in a single chunk - key = hash(int64(size) + data) - -5 if data size is more than chunksize*branches^l, but no more than chunksize* - branches^(l+1), the data vector is split into slices of chunksize* - branches^l length (except the last one). - key = hash(int64(size) + key(slice0) + key(slice1) + ...) - - The underlying hash function is configurable -*/ - -/* -Tree chunker is a concrete implementation of data chunking. -This chunker works in a simple way, it builds a tree out of the document so that each node either represents a chunk of real data or a chunk of data representing an branching non-leaf node of the tree. In particular each such non-leaf chunk will represent is a concatenation of the hash of its respective children. This scheme simultaneously guarantees data integrity as well as self addressing. Abstract nodes are transparent since their represented size component is strictly greater than their maximum data size, since they encode a subtree. - -If all is well it is possible to implement this by simply composing readers so that no extra allocation or buffering is necessary for the data splitting and joining. This means that in principle there can be direct IO between : memory, file system, network socket (bzz peers storage request is read from the socket). In practice there may be need for several stages of internal buffering. -The hashing itself does use extra copies and allocation though, since it does need it. -*/ - -var ( - errAppendOppNotSuported = errors.New("Append operation not supported") -) - -type ChunkerParams struct { - chunkSize int64 - hashSize int64 -} - -type SplitterParams struct { - ChunkerParams - reader io.Reader - putter Putter - addr Address -} - -type TreeSplitterParams struct { - SplitterParams - size int64 -} - -type JoinerParams struct { - ChunkerParams - addr Address - getter Getter - // TODO: there is a bug, so depth can only be 0 today, see: https://github.com/ethersphere/go-ethereum/issues/344 - depth int - ctx context.Context -} - -type TreeChunker struct { - ctx context.Context - - branches int64 - hashFunc SwarmHasher - dataSize int64 - data io.Reader - // calculated - addr Address - depth int - hashSize int64 // self.hashFunc.New().Size() - chunkSize int64 // hashSize* branches - workerCount int64 // the number of worker routines used - workerLock sync.RWMutex // lock for the worker count - jobC chan *hashJob - wg *sync.WaitGroup - putter Putter - getter Getter - errC chan error - quitC chan bool -} - -/* - Join reconstructs original content based on a root key. - When joining, the caller gets returned a Lazy SectionReader, which is - seekable and implements on-demand fetching of chunks as and where it is read. - New chunks to retrieve are coming from the getter, which the caller provides. - If an error is encountered during joining, it appears as a reader error. - The SectionReader. - As a result, partial reads from a document are possible even if other parts - are corrupt or lost. - The chunks are not meant to be validated by the chunker when joining. This - is because it is left to the DPA to decide which sources are trusted. -*/ -func TreeJoin(ctx context.Context, addr Address, getter Getter, depth int) *LazyChunkReader { - jp := &JoinerParams{ - ChunkerParams: ChunkerParams{ - chunkSize: ch.DefaultSize, - hashSize: int64(len(addr)), - }, - addr: addr, - getter: getter, - depth: depth, - ctx: ctx, - } - - return NewTreeJoiner(jp).Join(ctx) -} - -/* - When splitting, data is given as a SectionReader, and the key is a hashSize long byte slice (Key), the root hash of the entire content will fill this once processing finishes. - New chunks to store are store using the putter which the caller provides. -*/ -func TreeSplit(ctx context.Context, data io.Reader, size int64, putter Putter) (k Address, wait func(context.Context) error, err error) { - tsp := &TreeSplitterParams{ - SplitterParams: SplitterParams{ - ChunkerParams: ChunkerParams{ - chunkSize: ch.DefaultSize, - hashSize: putter.RefSize(), - }, - reader: data, - putter: putter, - }, - size: size, - } - return NewTreeSplitter(tsp).Split(ctx) -} - -func NewTreeJoiner(params *JoinerParams) *TreeChunker { - tc := &TreeChunker{} - tc.hashSize = params.hashSize - tc.branches = params.chunkSize / params.hashSize - tc.addr = params.addr - tc.getter = params.getter - tc.depth = params.depth - tc.chunkSize = params.chunkSize - tc.workerCount = 0 - tc.jobC = make(chan *hashJob, 2*ChunkProcessors) - tc.wg = &sync.WaitGroup{} - tc.errC = make(chan error) - tc.quitC = make(chan bool) - - tc.ctx = params.ctx - - return tc -} - -func NewTreeSplitter(params *TreeSplitterParams) *TreeChunker { - tc := &TreeChunker{} - tc.data = params.reader - tc.dataSize = params.size - tc.hashSize = params.hashSize - tc.branches = params.chunkSize / params.hashSize - tc.addr = params.addr - tc.chunkSize = params.chunkSize - tc.putter = params.putter - tc.workerCount = 0 - tc.jobC = make(chan *hashJob, 2*ChunkProcessors) - tc.wg = &sync.WaitGroup{} - tc.errC = make(chan error) - tc.quitC = make(chan bool) - - return tc -} - -type hashJob struct { - key Address - chunk []byte - size int64 - parentWg *sync.WaitGroup -} - -func (tc *TreeChunker) incrementWorkerCount() { - tc.workerLock.Lock() - defer tc.workerLock.Unlock() - tc.workerCount += 1 -} - -func (tc *TreeChunker) getWorkerCount() int64 { - tc.workerLock.RLock() - defer tc.workerLock.RUnlock() - return tc.workerCount -} - -func (tc *TreeChunker) decrementWorkerCount() { - tc.workerLock.Lock() - defer tc.workerLock.Unlock() - tc.workerCount -= 1 -} - -func (tc *TreeChunker) Split(ctx context.Context) (k Address, wait func(context.Context) error, err error) { - if tc.chunkSize <= 0 { - panic("chunker must be initialised") - } - - tc.runWorker(ctx) - - depth := 0 - treeSize := tc.chunkSize - - // takes lowest depth such that chunksize*HashCount^(depth+1) > size - // power series, will find the order of magnitude of the data size in base hashCount or numbers of levels of branching in the resulting tree. - for ; treeSize < tc.dataSize; treeSize *= tc.branches { - depth++ - } - - key := make([]byte, tc.hashSize) - // this waitgroup member is released after the root hash is calculated - tc.wg.Add(1) - //launch actual recursive function passing the waitgroups - go tc.split(ctx, depth, treeSize/tc.branches, key, tc.dataSize, tc.wg) - - // closes internal error channel if all subprocesses in the workgroup finished - go func() { - // waiting for all threads to finish - tc.wg.Wait() - close(tc.errC) - }() - - defer close(tc.quitC) - defer tc.putter.Close() - select { - case err := <-tc.errC: - if err != nil { - return nil, nil, err - } - case <-ctx.Done(): - return nil, nil, ctx.Err() - } - - return key, tc.putter.Wait, nil -} - -func (tc *TreeChunker) split(ctx context.Context, depth int, treeSize int64, addr Address, size int64, parentWg *sync.WaitGroup) { - - // - - for depth > 0 && size < treeSize { - treeSize /= tc.branches - depth-- - } - - if depth == 0 { - // leaf nodes -> content chunks - chunkData := make([]byte, size+8) - binary.LittleEndian.PutUint64(chunkData[0:8], uint64(size)) - var readBytes int64 - for readBytes < size { - n, err := tc.data.Read(chunkData[8+readBytes:]) - readBytes += int64(n) - if err != nil && !(err == io.EOF && readBytes == size) { - tc.errC <- err - return - } - } - select { - case tc.jobC <- &hashJob{addr, chunkData, size, parentWg}: - case <-tc.quitC: - } - return - } - // dept > 0 - // intermediate chunk containing child nodes hashes - branchCnt := (size + treeSize - 1) / treeSize - - var chunk = make([]byte, branchCnt*tc.hashSize+8) - var pos, i int64 - - binary.LittleEndian.PutUint64(chunk[0:8], uint64(size)) - - childrenWg := &sync.WaitGroup{} - var secSize int64 - for i < branchCnt { - // the last item can have shorter data - if size-pos < treeSize { - secSize = size - pos - } else { - secSize = treeSize - } - // the hash of that data - subTreeAddress := chunk[8+i*tc.hashSize : 8+(i+1)*tc.hashSize] - - childrenWg.Add(1) - tc.split(ctx, depth-1, treeSize/tc.branches, subTreeAddress, secSize, childrenWg) - - i++ - pos += treeSize - } - // wait for all the children to complete calculating their hashes and copying them onto sections of the chunk - // parentWg.Add(1) - // go func() { - childrenWg.Wait() - - worker := tc.getWorkerCount() - if int64(len(tc.jobC)) > worker && worker < ChunkProcessors { - tc.runWorker(ctx) - - } - select { - case tc.jobC <- &hashJob{addr, chunk, size, parentWg}: - case <-tc.quitC: - } -} - -func (tc *TreeChunker) runWorker(ctx context.Context) { - tc.incrementWorkerCount() - go func() { - defer tc.decrementWorkerCount() - for { - select { - - case job, ok := <-tc.jobC: - if !ok { - return - } - - h, err := tc.putter.Put(ctx, job.chunk) - if err != nil { - tc.errC <- err - return - } - copy(job.key, h) - job.parentWg.Done() - case <-tc.quitC: - return - } - } - }() -} - -func (tc *TreeChunker) Append() (Address, func(), error) { - return nil, nil, errAppendOppNotSuported -} - -// LazyChunkReader implements LazySectionReader -type LazyChunkReader struct { - ctx context.Context - addr Address // root address - chunkData ChunkData - off int64 // offset - chunkSize int64 // inherit from chunker - branches int64 // inherit from chunker - hashSize int64 // inherit from chunker - depth int - getter Getter -} - -func (tc *TreeChunker) Join(ctx context.Context) *LazyChunkReader { - return &LazyChunkReader{ - addr: tc.addr, - chunkSize: tc.chunkSize, - branches: tc.branches, - hashSize: tc.hashSize, - depth: tc.depth, - getter: tc.getter, - ctx: tc.ctx, - } -} - -func (r *LazyChunkReader) Context() context.Context { - return r.ctx -} - -// Size is meant to be called on the LazySectionReader -func (r *LazyChunkReader) Size(ctx context.Context, quitC chan bool) (n int64, err error) { - metrics.GetOrRegisterCounter("lazychunkreader.size", nil).Inc(1) - - var sp opentracing.Span - var cctx context.Context - cctx, sp = spancontext.StartSpan( - ctx, - "lcr.size") - defer sp.Finish() - - log.Debug("lazychunkreader.size", "addr", r.addr) - if r.chunkData == nil { - chunkData, err := r.getter.Get(cctx, Reference(r.addr)) - if err != nil { - return 0, err - } - r.chunkData = chunkData - s := r.chunkData.Size() - log.Debug("lazychunkreader.size", "key", r.addr, "size", s) - if s < 0 { - return 0, errors.New("corrupt size") - } - return int64(s), nil - } - s := r.chunkData.Size() - log.Debug("lazychunkreader.size", "key", r.addr, "size", s) - - return int64(s), nil -} - -// read at can be called numerous times -// concurrent reads are allowed -// Size() needs to be called synchronously on the LazyChunkReader first -func (r *LazyChunkReader) ReadAt(b []byte, off int64) (read int, err error) { - metrics.GetOrRegisterCounter("lazychunkreader.readat", nil).Inc(1) - - var sp opentracing.Span - var cctx context.Context - cctx, sp = spancontext.StartSpan( - r.ctx, - "lcr.read") - defer sp.Finish() - - defer func() { - sp.LogFields( - olog.Int("off", int(off)), - olog.Int("read", read)) - }() - - // this is correct, a swarm doc cannot be zero length, so no EOF is expected - if len(b) == 0 { - return 0, nil - } - quitC := make(chan bool) - size, err := r.Size(cctx, quitC) - if err != nil { - log.Debug("lazychunkreader.readat.size", "size", size, "err", err) - return 0, err - } - - errC := make(chan error) - - // } - var treeSize int64 - var depth int - // calculate depth and max treeSize - treeSize = r.chunkSize - for ; treeSize < size; treeSize *= r.branches { - depth++ - } - wg := sync.WaitGroup{} - length := int64(len(b)) - for d := 0; d < r.depth; d++ { - off *= r.chunkSize - length *= r.chunkSize - } - wg.Add(1) - go r.join(b, off, off+length, depth, treeSize/r.branches, r.chunkData, &wg, errC, quitC) - go func() { - wg.Wait() - close(errC) - }() - - err = <-errC - if err != nil { - log.Debug("lazychunkreader.readat.errc", "err", err) - close(quitC) - return 0, err - } - if off+int64(len(b)) >= size { - log.Debug("lazychunkreader.readat.return at end", "size", size, "off", off) - return int(size - off), io.EOF - } - log.Debug("lazychunkreader.readat.errc", "buff", len(b)) - return len(b), nil -} - -func (r *LazyChunkReader) join(b []byte, off int64, eoff int64, depth int, treeSize int64, chunkData ChunkData, parentWg *sync.WaitGroup, errC chan error, quitC chan bool) { - defer parentWg.Done() - // find appropriate block level - for chunkData.Size() < uint64(treeSize) && depth > r.depth { - treeSize /= r.branches - depth-- - } - - // leaf chunk found - if depth == r.depth { - extra := 8 + eoff - int64(len(chunkData)) - if extra > 0 { - eoff -= extra - } - copy(b, chunkData[8+off:8+eoff]) - return // simply give back the chunks reader for content chunks - } - - // subtree - start := off / treeSize - end := (eoff + treeSize - 1) / treeSize - - // last non-leaf chunk can be shorter than default chunk size, let's not read it further then its end - currentBranches := int64(len(chunkData)-8) / r.hashSize - if end > currentBranches { - end = currentBranches - } - - wg := &sync.WaitGroup{} - defer wg.Wait() - for i := start; i < end; i++ { - soff := i * treeSize - roff := soff - seoff := soff + treeSize - - if soff < off { - soff = off - } - if seoff > eoff { - seoff = eoff - } - if depth > 1 { - wg.Wait() - } - wg.Add(1) - go func(j int64) { - childAddress := chunkData[8+j*r.hashSize : 8+(j+1)*r.hashSize] - chunkData, err := r.getter.Get(r.ctx, Reference(childAddress)) - if err != nil { - log.Debug("lazychunkreader.join", "key", fmt.Sprintf("%x", childAddress), "err", err) - select { - case errC <- fmt.Errorf("chunk %v-%v not found; key: %s", off, off+treeSize, fmt.Sprintf("%x", childAddress)): - case <-quitC: - } - return - } - if l := len(chunkData); l < 9 { - select { - case errC <- fmt.Errorf("chunk %v-%v incomplete; key: %s, data length %v", off, off+treeSize, fmt.Sprintf("%x", childAddress), l): - case <-quitC: - } - return - } - if soff < off { - soff = off - } - r.join(b[soff-off:seoff-off], soff-roff, seoff-roff, depth-1, treeSize/r.branches, chunkData, wg, errC, quitC) - }(i) - } //for -} - -// Read keeps a cursor so cannot be called simulateously, see ReadAt -func (r *LazyChunkReader) Read(b []byte) (read int, err error) { - log.Debug("lazychunkreader.read", "key", r.addr) - metrics.GetOrRegisterCounter("lazychunkreader.read", nil).Inc(1) - - read, err = r.ReadAt(b, r.off) - if err != nil && err != io.EOF { - log.Debug("lazychunkreader.readat", "read", read, "err", err) - metrics.GetOrRegisterCounter("lazychunkreader.read.err", nil).Inc(1) - } - - metrics.GetOrRegisterCounter("lazychunkreader.read.bytes", nil).Inc(int64(read)) - - r.off += int64(read) - return read, err -} - -// completely analogous to standard SectionReader implementation -var errWhence = errors.New("Seek: invalid whence") -var errOffset = errors.New("Seek: invalid offset") - -func (r *LazyChunkReader) Seek(offset int64, whence int) (int64, error) { - log.Debug("lazychunkreader.seek", "key", r.addr, "offset", offset) - switch whence { - default: - return 0, errWhence - case 0: - offset += 0 - case 1: - offset += r.off - case 2: - if r.chunkData == nil { //seek from the end requires rootchunk for size. call Size first - _, err := r.Size(context.TODO(), nil) - if err != nil { - return 0, fmt.Errorf("can't get size: %v", err) - } - } - offset += int64(r.chunkData.Size()) - } - - if offset < 0 { - return 0, errOffset - } - r.off = offset - return offset, nil -} diff --git a/swarm/storage/chunker_test.go b/swarm/storage/chunker_test.go deleted file mode 100644 index db719ca047b3..000000000000 --- a/swarm/storage/chunker_test.go +++ /dev/null @@ -1,464 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "crypto/rand" - "encoding/binary" - "fmt" - "io" - "testing" - - "github.com/ethereum/go-ethereum/crypto/sha3" -) - -/* -Tests TreeChunker by splitting and joining a random byte slice -*/ - -type test interface { - Fatalf(string, ...interface{}) - Logf(string, ...interface{}) -} - -type chunkerTester struct { - inputs map[uint64][]byte - t test -} - -func newTestHasherStore(store ChunkStore, hash string) *hasherStore { - return NewHasherStore(store, MakeHashFunc(hash), false) -} - -func testRandomBrokenData(n int, tester *chunkerTester) { - data := io.LimitReader(rand.Reader, int64(n)) - brokendata := brokenLimitReader(data, n, n/2) - - buf := make([]byte, n) - _, err := brokendata.Read(buf) - if err == nil || err.Error() != "Broken reader" { - tester.t.Fatalf("Broken reader is not broken, hence broken. Returns: %v", err) - } - - data = io.LimitReader(rand.Reader, int64(n)) - brokendata = brokenLimitReader(data, n, n/2) - - putGetter := newTestHasherStore(NewMapChunkStore(), SHA3Hash) - - expectedError := fmt.Errorf("Broken reader") - ctx := context.Background() - key, _, err := TreeSplit(ctx, brokendata, int64(n), putGetter) - if err == nil || err.Error() != expectedError.Error() { - tester.t.Fatalf("Not receiving the correct error! Expected %v, received %v", expectedError, err) - } - tester.t.Logf(" Address = %v\n", key) -} - -func testRandomData(usePyramid bool, hash string, n int, tester *chunkerTester) Address { - if tester.inputs == nil { - tester.inputs = make(map[uint64][]byte) - } - input, found := tester.inputs[uint64(n)] - var data io.Reader - if !found { - data, input = GenerateRandomData(n) - tester.inputs[uint64(n)] = input - } else { - data = io.LimitReader(bytes.NewReader(input), int64(n)) - } - - putGetter := newTestHasherStore(NewMapChunkStore(), hash) - - var addr Address - var wait func(context.Context) error - var err error - ctx := context.TODO() - if usePyramid { - addr, wait, err = PyramidSplit(ctx, data, putGetter, putGetter) - } else { - addr, wait, err = TreeSplit(ctx, data, int64(n), putGetter) - } - if err != nil { - tester.t.Fatalf(err.Error()) - } - tester.t.Logf(" Address = %v\n", addr) - err = wait(ctx) - if err != nil { - tester.t.Fatalf(err.Error()) - } - - reader := TreeJoin(ctx, addr, putGetter, 0) - output := make([]byte, n) - r, err := reader.Read(output) - if r != n || err != io.EOF { - tester.t.Fatalf("read error read: %v n = %v err = %v\n", r, n, err) - } - if input != nil { - if !bytes.Equal(output, input) { - tester.t.Fatalf("input and output mismatch\n IN: %v\nOUT: %v\n", input, output) - } - } - - // testing partial read - for i := 1; i < n; i += 10000 { - readableLength := n - i - output := make([]byte, readableLength) - r, err := reader.ReadAt(output, int64(i)) - if r != readableLength || err != io.EOF { - tester.t.Fatalf("readAt error with offset %v read: %v n = %v err = %v\n", i, r, readableLength, err) - } - if input != nil { - if !bytes.Equal(output, input[i:]) { - tester.t.Fatalf("input and output mismatch\n IN: %v\nOUT: %v\n", input[i:], output) - } - } - } - - return addr -} - -func TestSha3ForCorrectness(t *testing.T) { - tester := &chunkerTester{t: t} - - size := 4096 - input := make([]byte, size+8) - binary.LittleEndian.PutUint64(input[:8], uint64(size)) - - io.LimitReader(bytes.NewReader(input[8:]), int64(size)) - - rawSha3 := sha3.NewKeccak256() - rawSha3.Reset() - rawSha3.Write(input) - rawSha3Output := rawSha3.Sum(nil) - - sha3FromMakeFunc := MakeHashFunc(SHA3Hash)() - sha3FromMakeFunc.ResetWithLength(input[:8]) - sha3FromMakeFunc.Write(input[8:]) - sha3FromMakeFuncOutput := sha3FromMakeFunc.Sum(nil) - - if len(rawSha3Output) != len(sha3FromMakeFuncOutput) { - tester.t.Fatalf("Original SHA3 and abstracted Sha3 has different length %v:%v\n", len(rawSha3Output), len(sha3FromMakeFuncOutput)) - } - - if !bytes.Equal(rawSha3Output, sha3FromMakeFuncOutput) { - tester.t.Fatalf("Original SHA3 and abstracted Sha3 mismatch %v:%v\n", rawSha3Output, sha3FromMakeFuncOutput) - } - -} - -func TestDataAppend(t *testing.T) { - sizes := []int{1, 1, 1, 4095, 4096, 4097, 1, 1, 1, 123456, 2345678, 2345678} - appendSizes := []int{4095, 4096, 4097, 1, 1, 1, 8191, 8192, 8193, 9000, 3000, 5000} - - tester := &chunkerTester{t: t} - for i := range sizes { - n := sizes[i] - m := appendSizes[i] - - if tester.inputs == nil { - tester.inputs = make(map[uint64][]byte) - } - input, found := tester.inputs[uint64(n)] - var data io.Reader - if !found { - data, input = GenerateRandomData(n) - tester.inputs[uint64(n)] = input - } else { - data = io.LimitReader(bytes.NewReader(input), int64(n)) - } - - store := NewMapChunkStore() - putGetter := newTestHasherStore(store, SHA3Hash) - - ctx := context.TODO() - addr, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - tester.t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - tester.t.Fatalf(err.Error()) - } - //create a append data stream - appendInput, found := tester.inputs[uint64(m)] - var appendData io.Reader - if !found { - appendData, appendInput = GenerateRandomData(m) - tester.inputs[uint64(m)] = appendInput - } else { - appendData = io.LimitReader(bytes.NewReader(appendInput), int64(m)) - } - - putGetter = newTestHasherStore(store, SHA3Hash) - newAddr, wait, err := PyramidAppend(ctx, addr, appendData, putGetter, putGetter) - if err != nil { - tester.t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - tester.t.Fatalf(err.Error()) - } - - reader := TreeJoin(ctx, newAddr, putGetter, 0) - newOutput := make([]byte, n+m) - r, err := reader.Read(newOutput) - if r != (n + m) { - tester.t.Fatalf("read error read: %v n = %v m = %v err = %v\n", r, n, m, err) - } - - newInput := append(input, appendInput...) - if !bytes.Equal(newOutput, newInput) { - tester.t.Fatalf("input and output mismatch\n IN: %v\nOUT: %v\n", newInput, newOutput) - } - } -} - -func TestRandomData(t *testing.T) { - // This test can validate files up to a relatively short length, as tree chunker slows down drastically. - // Validation of longer files is done by TestLocalStoreAndRetrieve in swarm package. - sizes := []int{1, 60, 83, 179, 253, 1024, 4095, 4096, 4097, 8191, 8192, 8193, 12287, 12288, 12289, 524288, 524288 + 1, 524288 + 4097, 7 * 524288, 7*524288 + 1, 7*524288 + 4097} - tester := &chunkerTester{t: t} - - for _, s := range sizes { - treeChunkerAddress := testRandomData(false, SHA3Hash, s, tester) - pyramidChunkerAddress := testRandomData(true, SHA3Hash, s, tester) - if treeChunkerAddress.String() != pyramidChunkerAddress.String() { - tester.t.Fatalf("tree chunker and pyramid chunker key mismatch for size %v\n TC: %v\n PC: %v\n", s, treeChunkerAddress.String(), pyramidChunkerAddress.String()) - } - } - - for _, s := range sizes { - treeChunkerAddress := testRandomData(false, BMTHash, s, tester) - pyramidChunkerAddress := testRandomData(true, BMTHash, s, tester) - if treeChunkerAddress.String() != pyramidChunkerAddress.String() { - tester.t.Fatalf("tree chunker and pyramid chunker key mismatch for size %v\n TC: %v\n PC: %v\n", s, treeChunkerAddress.String(), pyramidChunkerAddress.String()) - } - } -} - -func TestRandomBrokenData(t *testing.T) { - sizes := []int{1, 60, 83, 179, 253, 1024, 4095, 4096, 4097, 8191, 8192, 8193, 12287, 12288, 12289, 123456, 2345678} - tester := &chunkerTester{t: t} - for _, s := range sizes { - testRandomBrokenData(s, tester) - } -} - -func benchReadAll(reader LazySectionReader) { - size, _ := reader.Size(context.TODO(), nil) - output := make([]byte, 1000) - for pos := int64(0); pos < size; pos += 1000 { - reader.ReadAt(output, pos) - } -} - -func benchmarkSplitJoin(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testDataReader(n) - - putGetter := newTestHasherStore(NewMapChunkStore(), SHA3Hash) - ctx := context.TODO() - key, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - reader := TreeJoin(ctx, key, putGetter, 0) - benchReadAll(reader) - } -} - -func benchmarkSplitTreeSHA3(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testDataReader(n) - putGetter := newTestHasherStore(&FakeChunkStore{}, SHA3Hash) - - ctx := context.Background() - _, wait, err := TreeSplit(ctx, data, int64(n), putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - - } -} - -func benchmarkSplitTreeBMT(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testDataReader(n) - putGetter := newTestHasherStore(&FakeChunkStore{}, BMTHash) - - ctx := context.Background() - _, wait, err := TreeSplit(ctx, data, int64(n), putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - } -} - -func benchmarkSplitPyramidBMT(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testDataReader(n) - putGetter := newTestHasherStore(&FakeChunkStore{}, BMTHash) - - ctx := context.Background() - _, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - } -} - -func benchmarkSplitPyramidSHA3(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testDataReader(n) - putGetter := newTestHasherStore(&FakeChunkStore{}, SHA3Hash) - - ctx := context.Background() - _, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - } -} - -func benchmarkSplitAppendPyramid(n, m int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testDataReader(n) - data1 := testDataReader(m) - - store := NewMapChunkStore() - putGetter := newTestHasherStore(store, SHA3Hash) - - ctx := context.Background() - key, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - - putGetter = newTestHasherStore(store, SHA3Hash) - _, wait, err = PyramidAppend(ctx, key, data1, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - } -} - -func BenchmarkSplitJoin_2(t *testing.B) { benchmarkSplitJoin(100, t) } -func BenchmarkSplitJoin_3(t *testing.B) { benchmarkSplitJoin(1000, t) } -func BenchmarkSplitJoin_4(t *testing.B) { benchmarkSplitJoin(10000, t) } -func BenchmarkSplitJoin_5(t *testing.B) { benchmarkSplitJoin(100000, t) } -func BenchmarkSplitJoin_6(t *testing.B) { benchmarkSplitJoin(1000000, t) } -func BenchmarkSplitJoin_7(t *testing.B) { benchmarkSplitJoin(10000000, t) } - -// func BenchmarkSplitJoin_8(t *testing.B) { benchmarkJoin(100000000, t) } - -func BenchmarkSplitTreeSHA3_2(t *testing.B) { benchmarkSplitTreeSHA3(100, t) } -func BenchmarkSplitTreeSHA3_2h(t *testing.B) { benchmarkSplitTreeSHA3(500, t) } -func BenchmarkSplitTreeSHA3_3(t *testing.B) { benchmarkSplitTreeSHA3(1000, t) } -func BenchmarkSplitTreeSHA3_3h(t *testing.B) { benchmarkSplitTreeSHA3(5000, t) } -func BenchmarkSplitTreeSHA3_4(t *testing.B) { benchmarkSplitTreeSHA3(10000, t) } -func BenchmarkSplitTreeSHA3_4h(t *testing.B) { benchmarkSplitTreeSHA3(50000, t) } -func BenchmarkSplitTreeSHA3_5(t *testing.B) { benchmarkSplitTreeSHA3(100000, t) } -func BenchmarkSplitTreeSHA3_6(t *testing.B) { benchmarkSplitTreeSHA3(1000000, t) } -func BenchmarkSplitTreeSHA3_7(t *testing.B) { benchmarkSplitTreeSHA3(10000000, t) } - -// func BenchmarkSplitTreeSHA3_8(t *testing.B) { benchmarkSplitTreeSHA3(100000000, t) } - -func BenchmarkSplitTreeBMT_2(t *testing.B) { benchmarkSplitTreeBMT(100, t) } -func BenchmarkSplitTreeBMT_2h(t *testing.B) { benchmarkSplitTreeBMT(500, t) } -func BenchmarkSplitTreeBMT_3(t *testing.B) { benchmarkSplitTreeBMT(1000, t) } -func BenchmarkSplitTreeBMT_3h(t *testing.B) { benchmarkSplitTreeBMT(5000, t) } -func BenchmarkSplitTreeBMT_4(t *testing.B) { benchmarkSplitTreeBMT(10000, t) } -func BenchmarkSplitTreeBMT_4h(t *testing.B) { benchmarkSplitTreeBMT(50000, t) } -func BenchmarkSplitTreeBMT_5(t *testing.B) { benchmarkSplitTreeBMT(100000, t) } -func BenchmarkSplitTreeBMT_6(t *testing.B) { benchmarkSplitTreeBMT(1000000, t) } -func BenchmarkSplitTreeBMT_7(t *testing.B) { benchmarkSplitTreeBMT(10000000, t) } - -// func BenchmarkSplitTreeBMT_8(t *testing.B) { benchmarkSplitTreeBMT(100000000, t) } - -func BenchmarkSplitPyramidSHA3_2(t *testing.B) { benchmarkSplitPyramidSHA3(100, t) } -func BenchmarkSplitPyramidSHA3_2h(t *testing.B) { benchmarkSplitPyramidSHA3(500, t) } -func BenchmarkSplitPyramidSHA3_3(t *testing.B) { benchmarkSplitPyramidSHA3(1000, t) } -func BenchmarkSplitPyramidSHA3_3h(t *testing.B) { benchmarkSplitPyramidSHA3(5000, t) } -func BenchmarkSplitPyramidSHA3_4(t *testing.B) { benchmarkSplitPyramidSHA3(10000, t) } -func BenchmarkSplitPyramidSHA3_4h(t *testing.B) { benchmarkSplitPyramidSHA3(50000, t) } -func BenchmarkSplitPyramidSHA3_5(t *testing.B) { benchmarkSplitPyramidSHA3(100000, t) } -func BenchmarkSplitPyramidSHA3_6(t *testing.B) { benchmarkSplitPyramidSHA3(1000000, t) } -func BenchmarkSplitPyramidSHA3_7(t *testing.B) { benchmarkSplitPyramidSHA3(10000000, t) } - -// func BenchmarkSplitPyramidSHA3_8(t *testing.B) { benchmarkSplitPyramidSHA3(100000000, t) } - -func BenchmarkSplitPyramidBMT_2(t *testing.B) { benchmarkSplitPyramidBMT(100, t) } -func BenchmarkSplitPyramidBMT_2h(t *testing.B) { benchmarkSplitPyramidBMT(500, t) } -func BenchmarkSplitPyramidBMT_3(t *testing.B) { benchmarkSplitPyramidBMT(1000, t) } -func BenchmarkSplitPyramidBMT_3h(t *testing.B) { benchmarkSplitPyramidBMT(5000, t) } -func BenchmarkSplitPyramidBMT_4(t *testing.B) { benchmarkSplitPyramidBMT(10000, t) } -func BenchmarkSplitPyramidBMT_4h(t *testing.B) { benchmarkSplitPyramidBMT(50000, t) } -func BenchmarkSplitPyramidBMT_5(t *testing.B) { benchmarkSplitPyramidBMT(100000, t) } -func BenchmarkSplitPyramidBMT_6(t *testing.B) { benchmarkSplitPyramidBMT(1000000, t) } -func BenchmarkSplitPyramidBMT_7(t *testing.B) { benchmarkSplitPyramidBMT(10000000, t) } - -// func BenchmarkSplitPyramidBMT_8(t *testing.B) { benchmarkSplitPyramidBMT(100000000, t) } - -func BenchmarkSplitAppendPyramid_2(t *testing.B) { benchmarkSplitAppendPyramid(100, 1000, t) } -func BenchmarkSplitAppendPyramid_2h(t *testing.B) { benchmarkSplitAppendPyramid(500, 1000, t) } -func BenchmarkSplitAppendPyramid_3(t *testing.B) { benchmarkSplitAppendPyramid(1000, 1000, t) } -func BenchmarkSplitAppendPyramid_4(t *testing.B) { benchmarkSplitAppendPyramid(10000, 1000, t) } -func BenchmarkSplitAppendPyramid_4h(t *testing.B) { benchmarkSplitAppendPyramid(50000, 1000, t) } -func BenchmarkSplitAppendPyramid_5(t *testing.B) { benchmarkSplitAppendPyramid(1000000, 1000, t) } -func BenchmarkSplitAppendPyramid_6(t *testing.B) { benchmarkSplitAppendPyramid(1000000, 1000, t) } -func BenchmarkSplitAppendPyramid_7(t *testing.B) { benchmarkSplitAppendPyramid(10000000, 1000, t) } - -// func BenchmarkAppendPyramid_8(t *testing.B) { benchmarkAppendPyramid(100000000, 1000, t) } - -// go test -timeout 20m -cpu 4 -bench=./swarm/storage -run no -// If you dont add the timeout argument above .. the benchmark will timeout and dump diff --git a/swarm/storage/common_test.go b/swarm/storage/common_test.go deleted file mode 100644 index 33133edd74cd..000000000000 --- a/swarm/storage/common_test.go +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "crypto/rand" - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" - ch "github.com/ethereum/go-ethereum/swarm/chunk" - colorable "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 3, "verbosity of logs") - getTimeout = 30 * time.Second -) - -func init() { - flag.Parse() - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -type brokenLimitedReader struct { - lr io.Reader - errAt int - off int - size int -} - -func brokenLimitReader(data io.Reader, size int, errAt int) *brokenLimitedReader { - return &brokenLimitedReader{ - lr: data, - errAt: errAt, - size: size, - } -} - -func newLDBStore(t *testing.T) (*LDBStore, func()) { - dir, err := ioutil.TempDir("", "bzz-storage-test") - if err != nil { - t.Fatal(err) - } - log.Trace("memstore.tempdir", "dir", dir) - - ldbparams := NewLDBStoreParams(NewDefaultStoreParams(), dir) - db, err := NewLDBStore(ldbparams) - if err != nil { - t.Fatal(err) - } - - cleanup := func() { - db.Close() - err := os.RemoveAll(dir) - if err != nil { - t.Fatal(err) - } - } - - return db, cleanup -} - -func mputRandomChunks(store ChunkStore, n int, chunksize int64) ([]Chunk, error) { - return mput(store, n, GenerateRandomChunk) -} - -func mputChunks(store ChunkStore, chunks ...Chunk) error { - i := 0 - f := func(n int64) Chunk { - chunk := chunks[i] - i++ - return chunk - } - _, err := mput(store, len(chunks), f) - return err -} - -func mput(store ChunkStore, n int, f func(i int64) Chunk) (hs []Chunk, err error) { - // put to localstore and wait for stored channel - // does not check delivery error state - errc := make(chan error) - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - for i := int64(0); i < int64(n); i++ { - chunk := f(ch.DefaultSize) - go func() { - select { - case errc <- store.Put(ctx, chunk): - case <-ctx.Done(): - } - }() - hs = append(hs, chunk) - } - - // wait for all chunks to be stored - for i := 0; i < n; i++ { - err := <-errc - if err != nil { - return nil, err - } - } - return hs, nil -} - -func mget(store ChunkStore, hs []Address, f func(h Address, chunk Chunk) error) error { - wg := sync.WaitGroup{} - wg.Add(len(hs)) - errc := make(chan error) - - for _, k := range hs { - go func(h Address) { - defer wg.Done() - // TODO: write timeout with context - chunk, err := store.Get(context.TODO(), h) - if err != nil { - errc <- err - return - } - if f != nil { - err = f(h, chunk) - if err != nil { - errc <- err - return - } - } - }(k) - } - go func() { - wg.Wait() - close(errc) - }() - var err error - select { - case err = <-errc: - case <-time.NewTimer(5 * time.Second).C: - err = fmt.Errorf("timed out after 5 seconds") - } - return err -} - -func testDataReader(l int) (r io.Reader) { - return io.LimitReader(rand.Reader, int64(l)) -} - -func (r *brokenLimitedReader) Read(buf []byte) (int, error) { - if r.off+len(buf) > r.errAt { - return 0, fmt.Errorf("Broken reader") - } - r.off += len(buf) - return r.lr.Read(buf) -} - -func testStoreRandom(m ChunkStore, n int, chunksize int64, t *testing.T) { - chunks, err := mputRandomChunks(m, n, chunksize) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - err = mget(m, chunkAddresses(chunks), nil) - if err != nil { - t.Fatalf("testStore failed: %v", err) - } -} - -func testStoreCorrect(m ChunkStore, n int, chunksize int64, t *testing.T) { - chunks, err := mputRandomChunks(m, n, chunksize) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - f := func(h Address, chunk Chunk) error { - if !bytes.Equal(h, chunk.Address()) { - return fmt.Errorf("key does not match retrieved chunk Address") - } - hasher := MakeHashFunc(DefaultHash)() - hasher.ResetWithLength(chunk.SpanBytes()) - hasher.Write(chunk.Payload()) - exp := hasher.Sum(nil) - if !bytes.Equal(h, exp) { - return fmt.Errorf("key is not hash of chunk data") - } - return nil - } - err = mget(m, chunkAddresses(chunks), f) - if err != nil { - t.Fatalf("testStore failed: %v", err) - } -} - -func benchmarkStorePut(store ChunkStore, n int, chunksize int64, b *testing.B) { - chunks := make([]Chunk, n) - i := 0 - f := func(dataSize int64) Chunk { - chunk := GenerateRandomChunk(dataSize) - chunks[i] = chunk - i++ - return chunk - } - - mput(store, n, f) - - f = func(dataSize int64) Chunk { - chunk := chunks[i] - i++ - return chunk - } - - b.ReportAllocs() - b.ResetTimer() - - for j := 0; j < b.N; j++ { - i = 0 - mput(store, n, f) - } -} - -func benchmarkStoreGet(store ChunkStore, n int, chunksize int64, b *testing.B) { - chunks, err := mputRandomChunks(store, n, chunksize) - if err != nil { - b.Fatalf("expected no error, got %v", err) - } - b.ReportAllocs() - b.ResetTimer() - addrs := chunkAddresses(chunks) - for i := 0; i < b.N; i++ { - err := mget(store, addrs, nil) - if err != nil { - b.Fatalf("mget failed: %v", err) - } - } -} - -// MapChunkStore is a very simple ChunkStore implementation to store chunks in a map in memory. -type MapChunkStore struct { - chunks map[string]Chunk - mu sync.RWMutex -} - -func NewMapChunkStore() *MapChunkStore { - return &MapChunkStore{ - chunks: make(map[string]Chunk), - } -} - -func (m *MapChunkStore) Put(_ context.Context, ch Chunk) error { - m.mu.Lock() - defer m.mu.Unlock() - m.chunks[ch.Address().Hex()] = ch - return nil -} - -func (m *MapChunkStore) Get(_ context.Context, ref Address) (Chunk, error) { - m.mu.RLock() - defer m.mu.RUnlock() - chunk := m.chunks[ref.Hex()] - if chunk == nil { - return nil, ErrChunkNotFound - } - return chunk, nil -} - -func (m *MapChunkStore) Close() { -} - -func chunkAddresses(chunks []Chunk) []Address { - addrs := make([]Address, len(chunks)) - for i, ch := range chunks { - addrs[i] = ch.Address() - } - return addrs -} diff --git a/swarm/storage/database.go b/swarm/storage/database.go deleted file mode 100644 index 3b5d003de195..000000000000 --- a/swarm/storage/database.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -// this is a clone of an earlier state of the ethereum ethdb/database -// no need for queueing/caching - -import ( - "fmt" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -const openFileLimit = 128 - -type LDBDatabase struct { - db *leveldb.DB -} - -func NewLDBDatabase(file string) (*LDBDatabase, error) { - // Open the db - db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: openFileLimit}) - if err != nil { - return nil, err - } - - database := &LDBDatabase{db: db} - - return database, nil -} - -func (db *LDBDatabase) Put(key []byte, value []byte) { - metrics.GetOrRegisterCounter("ldbdatabase.put", nil).Inc(1) - - err := db.db.Put(key, value, nil) - if err != nil { - fmt.Println("Error put", err) - } -} - -func (db *LDBDatabase) Get(key []byte) ([]byte, error) { - metrics.GetOrRegisterCounter("ldbdatabase.get", nil).Inc(1) - - dat, err := db.db.Get(key, nil) - if err != nil { - return nil, err - } - return dat, nil -} - -func (db *LDBDatabase) Delete(key []byte) error { - return db.db.Delete(key, nil) -} - -func (db *LDBDatabase) LastKnownTD() []byte { - data, _ := db.Get([]byte("LTD")) - - if len(data) == 0 { - data = []byte{0x0} - } - - return data -} - -func (db *LDBDatabase) NewIterator() iterator.Iterator { - metrics.GetOrRegisterCounter("ldbdatabase.newiterator", nil).Inc(1) - - return db.db.NewIterator(nil, nil) -} - -func (db *LDBDatabase) Write(batch *leveldb.Batch) error { - metrics.GetOrRegisterCounter("ldbdatabase.write", nil).Inc(1) - - return db.db.Write(batch, nil) -} - -func (db *LDBDatabase) Close() { - // Close the leveldb database - db.db.Close() -} diff --git a/swarm/storage/encryption/encryption.go b/swarm/storage/encryption/encryption.go deleted file mode 100644 index 6fbdab062b33..000000000000 --- a/swarm/storage/encryption/encryption.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package encryption - -import ( - "crypto/rand" - "encoding/binary" - "fmt" - "hash" - "sync" -) - -const KeyLength = 32 - -type Key []byte - -type Encryption interface { - Encrypt(data []byte) ([]byte, error) - Decrypt(data []byte) ([]byte, error) -} - -type encryption struct { - key Key // the encryption key (hashSize bytes long) - keyLen int // length of the key = length of blockcipher block - padding int // encryption will pad the data upto this if > 0 - initCtr uint32 // initial counter used for counter mode blockcipher - hashFunc func() hash.Hash // hasher constructor function -} - -// New constructs a new encryptor/decryptor -func New(key Key, padding int, initCtr uint32, hashFunc func() hash.Hash) *encryption { - return &encryption{ - key: key, - keyLen: len(key), - padding: padding, - initCtr: initCtr, - hashFunc: hashFunc, - } -} - -// Encrypt encrypts the data and does padding if specified -func (e *encryption) Encrypt(data []byte) ([]byte, error) { - length := len(data) - outLength := length - isFixedPadding := e.padding > 0 - if isFixedPadding { - if length > e.padding { - return nil, fmt.Errorf("Data length longer than padding, data length %v padding %v", length, e.padding) - } - outLength = e.padding - } - out := make([]byte, outLength) - e.transform(data, out) - return out, nil -} - -// Decrypt decrypts the data, if padding was used caller must know original length and truncate -func (e *encryption) Decrypt(data []byte) ([]byte, error) { - length := len(data) - if e.padding > 0 && length != e.padding { - return nil, fmt.Errorf("Data length different than padding, data length %v padding %v", length, e.padding) - } - out := make([]byte, length) - e.transform(data, out) - return out, nil -} - -// -func (e *encryption) transform(in, out []byte) { - inLength := len(in) - wg := sync.WaitGroup{} - wg.Add((inLength-1)/e.keyLen + 1) - for i := 0; i < inLength; i += e.keyLen { - l := min(e.keyLen, inLength-i) - // call transformations per segment (asyncronously) - go func(i int, x, y []byte) { - defer wg.Done() - e.Transcrypt(i, x, y) - }(i/e.keyLen, in[i:i+l], out[i:i+l]) - } - // pad the rest if out is longer - pad(out[inLength:]) - wg.Wait() -} - -// used for segmentwise transformation -// if in is shorter than out, padding is used -func (e *encryption) Transcrypt(i int, in []byte, out []byte) { - // first hash key with counter (initial counter + i) - hasher := e.hashFunc() - hasher.Write(e.key) - - ctrBytes := make([]byte, 4) - binary.LittleEndian.PutUint32(ctrBytes, uint32(i)+e.initCtr) - hasher.Write(ctrBytes) - - ctrHash := hasher.Sum(nil) - hasher.Reset() - - // second round of hashing for selective disclosure - hasher.Write(ctrHash) - segmentKey := hasher.Sum(nil) - hasher.Reset() - - // XOR bytes uptil length of in (out must be at least as long) - inLength := len(in) - for j := 0; j < inLength; j++ { - out[j] = in[j] ^ segmentKey[j] - } - // insert padding if out is longer - pad(out[inLength:]) -} - -func pad(b []byte) { - l := len(b) - for total := 0; total < l; { - read, _ := rand.Read(b[total:]) - total += read - } -} - -// GenerateRandomKey generates a random key of length l -func GenerateRandomKey(l int) Key { - key := make([]byte, l) - var total int - for total < l { - read, _ := rand.Read(key[total:]) - total += read - } - return key -} - -func min(x, y int) int { - if x < y { - return x - } - return y -} diff --git a/swarm/storage/encryption/encryption_test.go b/swarm/storage/encryption/encryption_test.go deleted file mode 100644 index c3abefdcec8d..000000000000 --- a/swarm/storage/encryption/encryption_test.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package encryption - -import ( - "bytes" - "crypto/rand" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto/sha3" -) - -var expectedTransformedHex = "352187af3a843decc63ceca6cb01ea39dbcf77caf0a8f705f5c30d557044ceec9392b94a79376f1e5c10cd0c0f2a98e5353bf22b3ea4fdac6677ee553dec192e3db64e179d0474e96088fb4abd2babd67de123fb398bdf84d818f7bda2c1ab60b3ea0e0569ae54aa969658eb4844e6960d2ff44d7c087ee3aaffa1c0ee5df7e50b615f7ad90190f022934ad5300c7d1809bfe71a11cc04cece5274eb97a5f20350630522c1dbb7cebaf4f97f84e03f5cfd88f2b48880b25d12f4d5e75c150f704ef6b46c72e07db2b705ac3644569dccd22fd8f964f6ef787fda63c46759af334e6f665f70eac775a7017acea49f3c7696151cb1b9434fa4ac27fb803921ffb5ec58dafa168098d7d5b97e384be3384cf5bc235c3d887fef89fe76c0065f9b8d6ad837b442340d9e797b46ef5709ea3358bc415df11e4830de986ef0f1c418ffdcc80e9a3cda9bea0ab5676c0d4240465c43ba527e3b4ea50b4f6255b510e5d25774a75449b0bd71e56c537ade4fcf0f4d63c99ae1dbb5a844971e2c19941b8facfcfc8ee3056e7cb3c7114c5357e845b52f7103cb6e00d2308c37b12baa5b769e1cc7b00fc06f2d16e70cc27a82cb9c1a4e40cb0d43907f73df2c9db44f1b51a6b0bc6d09f77ac3be14041fae3f9df2da42df43ae110904f9ecee278030185254d7c6e918a5512024d047f77a992088cb3190a6587aa54d0c7231c1cd2e455e0d4c07f74bece68e29cd8ba0190c0bcfb26d24634af5d91a81ef5d4dd3d614836ce942ddbf7bb1399317f4c03faa675f325f18324bf9433844bfe5c4cc04130c8d5c329562b7cd66e72f7355de8f5375a72202971613c32bd7f3fcdcd51080758cd1d0a46dbe8f0374381dbc359f5864250c63dde8131cbd7c98ae2b0147d6ea4bf65d1443d511b18e6d608bbb46ac036353b4c51df306a10a6f6939c38629a5c18aaf89cac04bd3ad5156e6b92011c88341cb08551bab0a89e6a46538f5af33b86121dba17e3a434c273f385cd2e8cb90bdd32747d8425d929ccbd9b0815c73325988855549a8489dfd047daf777aaa3099e54cf997175a5d9e1edfe363e3b68c70e02f6bf4fcde6a0f3f7d0e7e98bde1a72ae8b6cd27b32990680cc4a04fc467f41c5adcaddabfc71928a3f6872c360c1d765260690dd28b269864c8e380d9c92ef6b89b0094c8f9bb22608b4156381b19b920e9583c9616ce5693b4d2a6c689f02e6a91584a8e501e107403d2689dd0045269dd9946c0e969fb656a3b39d84a798831f5f9290f163eb2f97d3ae25071324e95e2256d9c1e56eb83c26397855323edc202d56ad05894333b7f0ed3c1e4734782eb8bd5477242fd80d7a89b12866f85cfae476322f032465d6b1253993033fccd4723530630ab97a1566460af9c90c9da843c229406e65f3fa578bd6bf04dee9b6153807ddadb8ceefc5c601a8ab26023c67b1ab1e8e0f29ce94c78c308005a781853e7a2e0e51738939a657c987b5e611f32f47b5ff461c52e63e0ea390515a8e1f5393dae54ea526934b5f310b76e3fa050e40718cb4c8a20e58946d6ee1879f08c52764422fe542b3240e75eccb7aa75b1f8a651e37a3bc56b0932cdae0e985948468db1f98eb4b77b82081ea25d8a762db00f7898864984bd80e2f3f35f236bf57291dec28f550769943bcfb6f884b7687589b673642ef7fe5d7d5a87d3eca5017f83ccb9a3310520474479464cb3f433440e7e2f1e28c0aef700a45848573409e7ab66e0cfd4fe5d2147ace81bc65fd8891f6245cd69246bbf5c27830e5ab882dd1d02aba34ff6ca9af88df00fd602892f02fedbdc65dedec203faf3f8ff4a97314e0ddb58b9ab756a61a562597f4088b445fcc3b28a708ca7b1485dcd791b779fbf2b3ef1ec5c6205f595fbe45a02105034147e5a146089c200a49dae33ae051a08ea5f974a21540aaeffa7f9d9e3d35478016fb27b871036eb27217a5b834b461f535752fb5f1c8dded3ae14ce3a2ef6639e2fe41939e3509e46e347a95d50b2080f1ba42c804b290ddc912c952d1cec3f2661369f738feacc0dbf1ea27429c644e45f9e26f30c341acd34c7519b2a1663e334621691e810767e9918c2c547b2e23cce915f97d26aac8d0d2fcd3edb7986ad4e2b8a852edebad534cb6c0e9f0797d3563e5409d7e068e48356c67ce519246cd9c560e881453df97cbba562018811e6cf8c327f399d1d1253ab47a19f4a0ccc7c6d86a9603e0551da310ea595d71305c4aad96819120a92cdbaf1f77ec8df9cc7c838c0d4de1e8692dd81da38268d1d71324bcffdafbe5122e4b81828e021e936d83ae8021eac592aa52cd296b5ce392c7173d622f8e07d18f59bb1b08ba15211af6703463b09b593af3c37735296816d9f2e7a369354a5374ea3955e14ca8ac56d5bfe4aef7a21bd825d6ae85530bee5d2aaaa4914981b3dfdb2e92ec2a27c83d74b59e84ff5c056f7d8945745f2efc3dcf28f288c6cd8383700fb2312f7001f24dd40015e436ae23e052fe9070ea9535b9c989898a9bda3d5382cf10e432fae6ccf0c825b3e6436edd3a9f8846e5606f8563931b5f29ba407c5236e5730225dda211a8504ec1817bc935e1fd9a532b648c502df302ed2063aed008fd5676131ac9e95998e9447b02bd29d77e38fcfd2959f2de929b31970335eb2a74348cc6918bc35b9bf749eab0fe304c946cd9e1ca284e6853c42646e60b6b39e0d3fb3c260abfc5c1b4ca3c3770f344118ca7c7f5c1ad1f123f8f369cd60afc3cdb3e9e81968c5c9fa7c8b014ffe0508dd4f0a2a976d5d1ca8fc9ad7a237d92cfe7b41413d934d6e142824b252699397e48e4bac4e91ebc10602720684bd0863773c548f9a2f9724245e47b129ecf65afd7252aac48c8a8d6fd3d888af592a01fb02dc71ed7538a700d3d16243e4621e0fcf9f8ed2b4e11c9fa9a95338bb1dac74a7d9bc4eb8cbf900b634a2a56469c00f5994e4f0934bdb947640e6d67e47d0b621aacd632bfd3c800bd7d93bd329f494a90e06ed51535831bd6e07ac1b4b11434ef3918fa9511813a002913f33f836454798b8d1787fea9a4c4743ba091ed192ed92f4d33e43a226bf9503e1a83a16dd340b3cbbf38af6db0d99201da8de529b4225f3d2fa2aad6621afc6c79ef3537720591edfc681ae6d00ede53ed724fc71b23b90d2e9b7158aaee98d626a4fe029107df2cb5f90147e07ebe423b1519d848af18af365c71bfd0665db46be493bbe99b79a188de0cf3594aef2299f0324075bdce9eb0b87bc29d62401ba4fd6ae48b1ba33261b5b845279becf38ee03e3dc5c45303321c5fac96fd02a3ad8c9e3b02127b320501333c9e6360440d1ad5e64a6239501502dde1a49c9abe33b66098458eee3d611bb06ffcd234a1b9aef4af5021cd61f0de6789f822ee116b5078aae8c129e8391d8987500d322b58edd1595dc570b57341f2df221b94a96ab7fbcf32a8ca9684196455694024623d7ed49f7d66e8dd453c0bae50e0d8b34377b22d0ece059e2c385dfc70b9089fcd27577c51f4d870b5738ee2b68c361a67809c105c7848b68860a829f29930857a9f9d40b14fd2384ac43bafdf43c0661103794c4bd07d1cfdd4681b6aeaefad53d4c1473359bcc5a83b09189352e5bb9a7498dd0effb89c35aad26954551f8b0621374b449bf515630bd3974dca982279733470fdd059aa9c3df403d8f22b38c4709c82d8f12b888e22990350490e16179caf406293cc9e65f116bafcbe96af132f679877061107a2f690a82a8cb46eea57a90abd23798c5937c6fe6b17be3f9bfa01ce117d2c268181b9095bf49f395fea07ca03838de0588c5e2db633e836d64488c1421e653ea52d810d096048c092d0da6e02fa6613890219f51a76148c8588c2487b171a28f17b7a299204874af0131725d793481333be5f08e86ca837a226850b0c1060891603bfecf9e55cddd22c0dbb28d495342d9cc3de8409f72e52a0115141cffe755c74f061c1a770428ccb0ae59536ee6fc074fbfc6cacb51a549d327527e20f8407477e60355863f1153f9ce95641198663c968874e7fdb29407bd771d94fdda8180cbb0358f5874738db705924b8cbe0cd5e1484aeb64542fe8f38667b7c34baf818c63b1e18440e9fba575254d063fd49f24ef26432f4eb323f3836972dca87473e3e9bb26dc3be236c3aae6bc8a6da567442309da0e8450e242fc9db836e2964f2c76a3b80a2c677979882dda7d7ebf62c93664018bcf4ec431fe6b403d49b3b36618b9c07c2d0d4569cb8d52223903debc72ec113955b206c34f1ae5300990ccfc0180f47d91afdb542b6312d12aeff7e19c645dc0b9fe6e3288e9539f6d5870f99882df187bfa6d24d179dfd1dac22212c8b5339f7171a3efc15b760fed8f68538bc5cbd845c2d1ab41f3a6c692820653eaef7930c02fbe6061d93805d73decdbb945572a7c44ed0241982a6e4d2d730898f82b3d9877cb7bca41cc6dcee67aa0c3d6db76f0b0a708ace0031113e48429de5d886c10e9200f68f32263a2fbf44a5992c2459fda7b8796ba796e3a0804fc25992ed2c9a5fe0580a6b809200ecde6caa0364b58be11564dcb9a616766dd7906db5636ee708b0204f38d309466d8d4a162965dd727e29f5a6c133e9b4ed5bafe803e479f9b2a7640c942c4a40b14ac7dc9828546052761a070f6404008f1ec3605836339c3da95a00b4fd81b2cabf88b51d2087d5b83e8c5b69bf96d8c72cbd278dad3bbb42b404b436f84ad688a22948adf60a81090f1e904291503c16e9f54b05fc76c881a5f95f0e732949e95d3f1bae2d3652a14fe0dda2d68879604657171856ef72637def2a96ac47d7b3fe86eb3198f5e0e626f06be86232305f2ae79ffcd2725e48208f9d8d63523f81915acc957563ab627cd6bc68c2a37d59fb0ed77a90aa9d085d6914a8ebada22a2c2d471b5163aeddd799d90fbb10ed6851ace2c4af504b7d572686700a59d6db46d5e42bb83f8e0c0ffe1dfa6582cc0b34c921ff6e85e83188d24906d5c08bb90069639e713051b3102b53e6f703e8210017878add5df68e6f2b108de279c5490e9eef5590185c4a1c744d4e00d244e1245a8805bd30407b1bc488db44870ccfd75a8af104df78efa2fb7ba31f048a263efdb3b63271fff4922bece9a71187108f65744a24f4947dc556b7440cb4fa45d296bb7f724588d1f245125b21ea063500029bd49650237f53899daf1312809552c81c5827341263cc807a29fe84746170cdfa1ff3838399a5645319bcaff674bb70efccdd88b3d3bb2f2d98111413585dc5d5bd5168f43b3f55e58972a5b2b9b3733febf02f931bd436648cb617c3794841aab961fe41277ab07812e1d3bc4ff6f4350a3e615bfba08c3b9480ef57904d3a16f7e916345202e3f93d11f7a7305170cb8c4eb9ac88ace8bbd1f377bdd5855d3162d6723d4435e84ce529b8f276a8927915ac759a0d04e5ca4a9d3da6291f0333b475df527e99fe38f7a4082662e8125936640c26dd1d17cf284ce6e2b17777a05aa0574f7793a6a062cc6f7263f7ab126b4528a17becfdec49ac0f7d8705aa1704af97fb861faa8a466161b2b5c08a5bacc79fe8500b913d65c8d3c52d1fd52d2ab2c9f52196e712455619c1cd3e0f391b274487944240e2ed8858dd0823c801094310024ae3fe4dd1cf5a2b6487b42cc5937bbafb193ee331d87e378258963d49b9da90899bbb4b88e79f78e866b0213f4719f67da7bcc2fce073c01e87c62ea3cdbcd589cfc41281f2f4c757c742d6d1e" - -var hashFunc = sha3.NewKeccak256 -var testKey Key - -func init() { - var err error - testKey, err = hexutil.Decode("0x8abf1502f557f15026716030fb6384792583daf39608a3cd02ff2f47e9bc6e49") - if err != nil { - panic(err.Error()) - } -} - -func TestEncryptDataLongerThanPadding(t *testing.T) { - enc := New(testKey, 4095, uint32(0), hashFunc) - - data := make([]byte, 4096) - - expectedError := "Data length longer than padding, data length 4096 padding 4095" - - _, err := enc.Encrypt(data) - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected error \"%v\" got \"%v\"", expectedError, err) - } -} - -func TestEncryptDataZeroPadding(t *testing.T) { - enc := New(testKey, 0, uint32(0), hashFunc) - - data := make([]byte, 2048) - - encrypted, err := enc.Encrypt(data) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - if len(encrypted) != 2048 { - t.Fatalf("Encrypted data length expected \"%v\" got %v", 2048, len(encrypted)) - } -} - -func TestEncryptDataLengthEqualsPadding(t *testing.T) { - enc := New(testKey, 4096, uint32(0), hashFunc) - - data := make([]byte, 4096) - - encrypted, err := enc.Encrypt(data) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - encryptedHex := common.Bytes2Hex(encrypted) - expectedTransformed := common.Hex2Bytes(expectedTransformedHex) - - if !bytes.Equal(encrypted, expectedTransformed) { - t.Fatalf("Expected %v got %v", expectedTransformedHex, encryptedHex) - } -} - -func TestEncryptDataLengthSmallerThanPadding(t *testing.T) { - enc := New(testKey, 4096, uint32(0), hashFunc) - - data := make([]byte, 4080) - - encrypted, err := enc.Encrypt(data) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - if len(encrypted) != 4096 { - t.Fatalf("Encrypted data length expected %v got %v", 4096, len(encrypted)) - } -} - -func TestEncryptDataCounterNonZero(t *testing.T) { - // TODO -} - -func TestDecryptDataLengthNotEqualsPadding(t *testing.T) { - enc := New(testKey, 4096, uint32(0), hashFunc) - - data := make([]byte, 4097) - - expectedError := "Data length different than padding, data length 4097 padding 4096" - - _, err := enc.Decrypt(data) - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected error \"%v\" got \"%v\"", expectedError, err) - } -} - -func TestEncryptDecryptIsIdentity(t *testing.T) { - testEncryptDecryptIsIdentity(t, 2048, 0, 2048, 32) - testEncryptDecryptIsIdentity(t, 4096, 0, 4096, 32) - testEncryptDecryptIsIdentity(t, 4096, 0, 1000, 32) - testEncryptDecryptIsIdentity(t, 32, 10, 32, 32) -} - -func testEncryptDecryptIsIdentity(t *testing.T, padding int, initCtr uint32, dataLength int, keyLength int) { - key := GenerateRandomKey(keyLength) - enc := New(key, padding, initCtr, hashFunc) - - data := make([]byte, dataLength) - rand.Read(data) - - encrypted, err := enc.Encrypt(data) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - - decrypted, err := enc.Decrypt(encrypted) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - if len(decrypted) != padding { - t.Fatalf("Expected decrypted data length %v got %v", padding, len(decrypted)) - } - - // we have to remove the extra bytes which were randomly added to fill until padding - if len(data) < padding { - decrypted = decrypted[:len(data)] - } - - if !bytes.Equal(data, decrypted) { - t.Fatalf("Expected decrypted %v got %v", common.Bytes2Hex(data), common.Bytes2Hex(decrypted)) - } -} diff --git a/swarm/storage/error.go b/swarm/storage/error.go deleted file mode 100644 index 44261c084eca..000000000000 --- a/swarm/storage/error.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "errors" -) - -const ( - ErrInit = iota - ErrNotFound - ErrIO - ErrUnauthorized - ErrInvalidValue - ErrDataOverflow - ErrNothingToReturn - ErrCorruptData - ErrInvalidSignature - ErrNotSynced - ErrPeriodDepth - ErrCnt -) - -var ( - ErrChunkNotFound = errors.New("chunk not found") - ErrFetching = errors.New("chunk still fetching") - ErrChunkInvalid = errors.New("invalid chunk") - ErrChunkForward = errors.New("cannot forward") - ErrChunkUnavailable = errors.New("chunk unavailable") - ErrChunkTimeout = errors.New("timeout") -) diff --git a/swarm/storage/filestore.go b/swarm/storage/filestore.go deleted file mode 100644 index 2d8d82d95a50..000000000000 --- a/swarm/storage/filestore.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "io" -) - -/* -FileStore provides the client API entrypoints Store and Retrieve to store and retrieve -It can store anything that has a byte slice representation, so files or serialised objects etc. - -Storage: FileStore calls the Chunker to segment the input datastream of any size to a merkle hashed tree of chunks. The key of the root block is returned to the client. - -Retrieval: given the key of the root block, the FileStore retrieves the block chunks and reconstructs the original data and passes it back as a lazy reader. A lazy reader is a reader with on-demand delayed processing, i.e. the chunks needed to reconstruct a large file are only fetched and processed if that particular part of the document is actually read. - -As the chunker produces chunks, FileStore dispatches them to its own chunk store -implementation for storage or retrieval. -*/ - -const ( - defaultLDBCapacity = 5000000 // capacity for LevelDB, by default 5*10^6*4096 bytes == 20GB - defaultCacheCapacity = 10000 // capacity for in-memory chunks' cache - defaultChunkRequestsCacheCapacity = 5000000 // capacity for container holding outgoing requests for chunks. should be set to LevelDB capacity -) - -type FileStore struct { - ChunkStore - hashFunc SwarmHasher -} - -type FileStoreParams struct { - Hash string -} - -func NewFileStoreParams() *FileStoreParams { - return &FileStoreParams{ - Hash: DefaultHash, - } -} - -// for testing locally -func NewLocalFileStore(datadir string, basekey []byte) (*FileStore, error) { - params := NewDefaultLocalStoreParams() - params.Init(datadir) - localStore, err := NewLocalStore(params, nil) - if err != nil { - return nil, err - } - localStore.Validators = append(localStore.Validators, NewContentAddressValidator(MakeHashFunc(DefaultHash))) - return NewFileStore(localStore, NewFileStoreParams()), nil -} - -func NewFileStore(store ChunkStore, params *FileStoreParams) *FileStore { - hashFunc := MakeHashFunc(params.Hash) - return &FileStore{ - ChunkStore: store, - hashFunc: hashFunc, - } -} - -// Public API. Main entry point for document retrieval directly. Used by the -// FS-aware API and httpaccess -// Chunk retrieval blocks on netStore requests with a timeout so reader will -// report error if retrieval of chunks within requested range time out. -// It returns a reader with the chunk data and whether the content was encrypted -func (f *FileStore) Retrieve(ctx context.Context, addr Address) (reader *LazyChunkReader, isEncrypted bool) { - isEncrypted = len(addr) > f.hashFunc().Size() - getter := NewHasherStore(f.ChunkStore, f.hashFunc, isEncrypted) - reader = TreeJoin(ctx, addr, getter, 0) - return -} - -// Public API. Main entry point for document storage directly. Used by the -// FS-aware API and httpaccess -func (f *FileStore) Store(ctx context.Context, data io.Reader, size int64, toEncrypt bool) (addr Address, wait func(context.Context) error, err error) { - putter := NewHasherStore(f.ChunkStore, f.hashFunc, toEncrypt) - return PyramidSplit(ctx, data, putter, putter) -} - -func (f *FileStore) HashSize() int { - return f.hashFunc().Size() -} diff --git a/swarm/storage/filestore_test.go b/swarm/storage/filestore_test.go deleted file mode 100644 index d79efb530d1b..000000000000 --- a/swarm/storage/filestore_test.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "io" - "io/ioutil" - "os" - "testing" -) - -const testDataSize = 0x1000000 - -func TestFileStorerandom(t *testing.T) { - testFileStoreRandom(false, t) - testFileStoreRandom(true, t) -} - -func testFileStoreRandom(toEncrypt bool, t *testing.T) { - tdb, cleanup, err := newTestDbStore(false, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - db := tdb.LDBStore - db.setCapacity(50000) - memStore := NewMemStore(NewDefaultStoreParams(), db) - localStore := &LocalStore{ - memStore: memStore, - DbStore: db, - } - - fileStore := NewFileStore(localStore, NewFileStoreParams()) - defer os.RemoveAll("/tmp/bzz") - - reader, slice := GenerateRandomData(testDataSize) - ctx := context.TODO() - key, wait, err := fileStore.Store(ctx, reader, testDataSize, toEncrypt) - if err != nil { - t.Fatalf("Store error: %v", err) - } - err = wait(ctx) - if err != nil { - t.Fatalf("Store waitt error: %v", err.Error()) - } - resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - resultSlice := make([]byte, len(slice)) - n, err := resultReader.ReadAt(resultSlice, 0) - if err != io.EOF { - t.Fatalf("Retrieve error: %v", err) - } - if n != len(slice) { - t.Fatalf("Slice size error got %d, expected %d.", n, len(slice)) - } - if !bytes.Equal(slice, resultSlice) { - t.Fatalf("Comparison error.") - } - ioutil.WriteFile("/tmp/slice.bzz.16M", slice, 0666) - ioutil.WriteFile("/tmp/result.bzz.16M", resultSlice, 0666) - localStore.memStore = NewMemStore(NewDefaultStoreParams(), db) - resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - for i := range resultSlice { - resultSlice[i] = 0 - } - n, err = resultReader.ReadAt(resultSlice, 0) - if err != io.EOF { - t.Fatalf("Retrieve error after removing memStore: %v", err) - } - if n != len(slice) { - t.Fatalf("Slice size error after removing memStore got %d, expected %d.", n, len(slice)) - } - if !bytes.Equal(slice, resultSlice) { - t.Fatalf("Comparison error after removing memStore.") - } -} - -func TestFileStoreCapacity(t *testing.T) { - testFileStoreCapacity(false, t) - testFileStoreCapacity(true, t) -} - -func testFileStoreCapacity(toEncrypt bool, t *testing.T) { - tdb, cleanup, err := newTestDbStore(false, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - db := tdb.LDBStore - memStore := NewMemStore(NewDefaultStoreParams(), db) - localStore := &LocalStore{ - memStore: memStore, - DbStore: db, - } - fileStore := NewFileStore(localStore, NewFileStoreParams()) - reader, slice := GenerateRandomData(testDataSize) - ctx := context.TODO() - key, wait, err := fileStore.Store(ctx, reader, testDataSize, toEncrypt) - if err != nil { - t.Errorf("Store error: %v", err) - } - err = wait(ctx) - if err != nil { - t.Fatalf("Store error: %v", err) - } - resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - resultSlice := make([]byte, len(slice)) - n, err := resultReader.ReadAt(resultSlice, 0) - if err != io.EOF { - t.Fatalf("Retrieve error: %v", err) - } - if n != len(slice) { - t.Fatalf("Slice size error got %d, expected %d.", n, len(slice)) - } - if !bytes.Equal(slice, resultSlice) { - t.Fatalf("Comparison error.") - } - // Clear memStore - memStore.setCapacity(0) - // check whether it is, indeed, empty - fileStore.ChunkStore = memStore - resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - if _, err = resultReader.ReadAt(resultSlice, 0); err == nil { - t.Fatalf("Was able to read %d bytes from an empty memStore.", len(slice)) - } - // check how it works with localStore - fileStore.ChunkStore = localStore - // localStore.dbStore.setCapacity(0) - resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - for i := range resultSlice { - resultSlice[i] = 0 - } - n, err = resultReader.ReadAt(resultSlice, 0) - if err != io.EOF { - t.Fatalf("Retrieve error after clearing memStore: %v", err) - } - if n != len(slice) { - t.Fatalf("Slice size error after clearing memStore got %d, expected %d.", n, len(slice)) - } - if !bytes.Equal(slice, resultSlice) { - t.Fatalf("Comparison error after clearing memStore.") - } -} diff --git a/swarm/storage/hasherstore.go b/swarm/storage/hasherstore.go deleted file mode 100644 index ff18e64c7168..000000000000 --- a/swarm/storage/hasherstore.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "fmt" - "sync/atomic" - - "github.com/ethereum/go-ethereum/crypto/sha3" - ch "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/storage/encryption" -) - -type hasherStore struct { - store ChunkStore - toEncrypt bool - hashFunc SwarmHasher - hashSize int // content hash size - refSize int64 // reference size (content hash + possibly encryption key) - errC chan error // global error channel - doneC chan struct{} // closed by Close() call to indicate that count is the final number of chunks - quitC chan struct{} // closed to quit unterminated routines - // nrChunks is used with atomic functions - // it is required to be at the end of the struct to ensure 64bit alignment for arm architecture - // see: https://golang.org/pkg/sync/atomic/#pkg-note-BUG - nrChunks uint64 // number of chunks to store -} - -// NewHasherStore creates a hasherStore object, which implements Putter and Getter interfaces. -// With the HasherStore you can put and get chunk data (which is just []byte) into a ChunkStore -// and the hasherStore will take core of encryption/decryption of data if necessary -func NewHasherStore(store ChunkStore, hashFunc SwarmHasher, toEncrypt bool) *hasherStore { - hashSize := hashFunc().Size() - refSize := int64(hashSize) - if toEncrypt { - refSize += encryption.KeyLength - } - - h := &hasherStore{ - store: store, - toEncrypt: toEncrypt, - hashFunc: hashFunc, - hashSize: hashSize, - refSize: refSize, - errC: make(chan error), - doneC: make(chan struct{}), - quitC: make(chan struct{}), - } - - return h -} - -// Put stores the chunkData into the ChunkStore of the hasherStore and returns the reference. -// If hasherStore has a chunkEncryption object, the data will be encrypted. -// Asynchronous function, the data will not necessarily be stored when it returns. -func (h *hasherStore) Put(ctx context.Context, chunkData ChunkData) (Reference, error) { - c := chunkData - var encryptionKey encryption.Key - if h.toEncrypt { - var err error - c, encryptionKey, err = h.encryptChunkData(chunkData) - if err != nil { - return nil, err - } - } - chunk := h.createChunk(c) - h.storeChunk(ctx, chunk) - - return Reference(append(chunk.Address(), encryptionKey...)), nil -} - -// Get returns data of the chunk with the given reference (retrieved from the ChunkStore of hasherStore). -// If the data is encrypted and the reference contains an encryption key, it will be decrypted before -// return. -func (h *hasherStore) Get(ctx context.Context, ref Reference) (ChunkData, error) { - addr, encryptionKey, err := parseReference(ref, h.hashSize) - if err != nil { - return nil, err - } - - chunk, err := h.store.Get(ctx, addr) - if err != nil { - return nil, err - } - - chunkData := ChunkData(chunk.Data()) - toDecrypt := (encryptionKey != nil) - if toDecrypt { - var err error - chunkData, err = h.decryptChunkData(chunkData, encryptionKey) - if err != nil { - return nil, err - } - } - return chunkData, nil -} - -// Close indicates that no more chunks will be put with the hasherStore, so the Wait -// function can return when all the previously put chunks has been stored. -func (h *hasherStore) Close() { - close(h.doneC) -} - -// Wait returns when -// 1) the Close() function has been called and -// 2) all the chunks which has been Put has been stored -func (h *hasherStore) Wait(ctx context.Context) error { - defer close(h.quitC) - var nrStoredChunks uint64 // number of stored chunks - var done bool - doneC := h.doneC - for { - select { - // if context is done earlier, just return with the error - case <-ctx.Done(): - return ctx.Err() - // doneC is closed if all chunks have been submitted, from then we just wait until all of them are also stored - case <-doneC: - done = true - doneC = nil - // a chunk has been stored, if err is nil, then successfully, so increase the stored chunk counter - case err := <-h.errC: - if err != nil { - return err - } - nrStoredChunks++ - } - // if all the chunks have been submitted and all of them are stored, then we can return - if done { - if nrStoredChunks >= atomic.LoadUint64(&h.nrChunks) { - return nil - } - } - } -} - -func (h *hasherStore) createHash(chunkData ChunkData) Address { - hasher := h.hashFunc() - hasher.ResetWithLength(chunkData[:8]) // 8 bytes of length - hasher.Write(chunkData[8:]) // minus 8 []byte length - return hasher.Sum(nil) -} - -func (h *hasherStore) createChunk(chunkData ChunkData) *chunk { - hash := h.createHash(chunkData) - chunk := NewChunk(hash, chunkData) - return chunk -} - -func (h *hasherStore) encryptChunkData(chunkData ChunkData) (ChunkData, encryption.Key, error) { - if len(chunkData) < 8 { - return nil, nil, fmt.Errorf("Invalid ChunkData, min length 8 got %v", len(chunkData)) - } - - key, encryptedSpan, encryptedData, err := h.encrypt(chunkData) - if err != nil { - return nil, nil, err - } - c := make(ChunkData, len(encryptedSpan)+len(encryptedData)) - copy(c[:8], encryptedSpan) - copy(c[8:], encryptedData) - return c, key, nil -} - -func (h *hasherStore) decryptChunkData(chunkData ChunkData, encryptionKey encryption.Key) (ChunkData, error) { - if len(chunkData) < 8 { - return nil, fmt.Errorf("Invalid ChunkData, min length 8 got %v", len(chunkData)) - } - - decryptedSpan, decryptedData, err := h.decrypt(chunkData, encryptionKey) - if err != nil { - return nil, err - } - - // removing extra bytes which were just added for padding - length := ChunkData(decryptedSpan).Size() - for length > ch.DefaultSize { - length = length + (ch.DefaultSize - 1) - length = length / ch.DefaultSize - length *= uint64(h.refSize) - } - - c := make(ChunkData, length+8) - copy(c[:8], decryptedSpan) - copy(c[8:], decryptedData[:length]) - - return c, nil -} - -func (h *hasherStore) RefSize() int64 { - return h.refSize -} - -func (h *hasherStore) encrypt(chunkData ChunkData) (encryption.Key, []byte, []byte, error) { - key := encryption.GenerateRandomKey(encryption.KeyLength) - encryptedSpan, err := h.newSpanEncryption(key).Encrypt(chunkData[:8]) - if err != nil { - return nil, nil, nil, err - } - encryptedData, err := h.newDataEncryption(key).Encrypt(chunkData[8:]) - if err != nil { - return nil, nil, nil, err - } - return key, encryptedSpan, encryptedData, nil -} - -func (h *hasherStore) decrypt(chunkData ChunkData, key encryption.Key) ([]byte, []byte, error) { - encryptedSpan, err := h.newSpanEncryption(key).Encrypt(chunkData[:8]) - if err != nil { - return nil, nil, err - } - encryptedData, err := h.newDataEncryption(key).Encrypt(chunkData[8:]) - if err != nil { - return nil, nil, err - } - return encryptedSpan, encryptedData, nil -} - -func (h *hasherStore) newSpanEncryption(key encryption.Key) encryption.Encryption { - return encryption.New(key, 0, uint32(ch.DefaultSize/h.refSize), sha3.NewKeccak256) -} - -func (h *hasherStore) newDataEncryption(key encryption.Key) encryption.Encryption { - return encryption.New(key, int(ch.DefaultSize), 0, sha3.NewKeccak256) -} - -func (h *hasherStore) storeChunk(ctx context.Context, chunk *chunk) { - atomic.AddUint64(&h.nrChunks, 1) - go func() { - select { - case h.errC <- h.store.Put(ctx, chunk): - case <-h.quitC: - } - }() -} - -func parseReference(ref Reference, hashSize int) (Address, encryption.Key, error) { - encryptedRefLength := hashSize + encryption.KeyLength - switch len(ref) { - case AddressLength: - return Address(ref), nil, nil - case encryptedRefLength: - encKeyIdx := len(ref) - encryption.KeyLength - return Address(ref[:encKeyIdx]), encryption.Key(ref[encKeyIdx:]), nil - default: - return nil, nil, fmt.Errorf("Invalid reference length, expected %v or %v got %v", hashSize, encryptedRefLength, len(ref)) - } -} diff --git a/swarm/storage/hasherstore_test.go b/swarm/storage/hasherstore_test.go deleted file mode 100644 index 22cf98d0e882..000000000000 --- a/swarm/storage/hasherstore_test.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "testing" - - "github.com/ethereum/go-ethereum/swarm/storage/encryption" - - "github.com/ethereum/go-ethereum/common" -) - -func TestHasherStore(t *testing.T) { - var tests = []struct { - chunkLength int - toEncrypt bool - }{ - {10, false}, - {100, false}, - {1000, false}, - {4096, false}, - {10, true}, - {100, true}, - {1000, true}, - {4096, true}, - } - - for _, tt := range tests { - chunkStore := NewMapChunkStore() - hasherStore := NewHasherStore(chunkStore, MakeHashFunc(DefaultHash), tt.toEncrypt) - - // Put two random chunks into the hasherStore - chunkData1 := GenerateRandomChunk(int64(tt.chunkLength)).Data() - ctx, cancel := context.WithTimeout(context.Background(), getTimeout) - defer cancel() - key1, err := hasherStore.Put(ctx, chunkData1) - if err != nil { - t.Fatalf("Expected no error got \"%v\"", err) - } - - chunkData2 := GenerateRandomChunk(int64(tt.chunkLength)).Data() - key2, err := hasherStore.Put(ctx, chunkData2) - if err != nil { - t.Fatalf("Expected no error got \"%v\"", err) - } - - hasherStore.Close() - - // Wait until chunks are really stored - err = hasherStore.Wait(ctx) - if err != nil { - t.Fatalf("Expected no error got \"%v\"", err) - } - - // Get the first chunk - retrievedChunkData1, err := hasherStore.Get(ctx, key1) - if err != nil { - t.Fatalf("Expected no error, got \"%v\"", err) - } - - // Retrieved data should be same as the original - if !bytes.Equal(chunkData1, retrievedChunkData1) { - t.Fatalf("Expected retrieved chunk data %v, got %v", common.Bytes2Hex(chunkData1), common.Bytes2Hex(retrievedChunkData1)) - } - - // Get the second chunk - retrievedChunkData2, err := hasherStore.Get(ctx, key2) - if err != nil { - t.Fatalf("Expected no error, got \"%v\"", err) - } - - // Retrieved data should be same as the original - if !bytes.Equal(chunkData2, retrievedChunkData2) { - t.Fatalf("Expected retrieved chunk data %v, got %v", common.Bytes2Hex(chunkData2), common.Bytes2Hex(retrievedChunkData2)) - } - - hash1, encryptionKey1, err := parseReference(key1, hasherStore.hashSize) - if err != nil { - t.Fatalf("Expected no error, got \"%v\"", err) - } - - if tt.toEncrypt { - if encryptionKey1 == nil { - t.Fatal("Expected non-nil encryption key, got nil") - } else if len(encryptionKey1) != encryption.KeyLength { - t.Fatalf("Expected encryption key length %v, got %v", encryption.KeyLength, len(encryptionKey1)) - } - } - if !tt.toEncrypt && encryptionKey1 != nil { - t.Fatalf("Expected nil encryption key, got key with length %v", len(encryptionKey1)) - } - - // Check if chunk data in store is encrypted or not - chunkInStore, err := chunkStore.Get(ctx, hash1) - if err != nil { - t.Fatalf("Expected no error got \"%v\"", err) - } - - chunkDataInStore := chunkInStore.Data() - - if tt.toEncrypt && bytes.Equal(chunkData1, chunkDataInStore) { - t.Fatalf("Chunk expected to be encrypted but it is stored without encryption") - } - if !tt.toEncrypt && !bytes.Equal(chunkData1, chunkDataInStore) { - t.Fatalf("Chunk expected to be not encrypted but stored content is different. Expected %v got %v", common.Bytes2Hex(chunkData1), common.Bytes2Hex(chunkDataInStore)) - } - } -} diff --git a/swarm/storage/ldbstore.go b/swarm/storage/ldbstore.go deleted file mode 100644 index bde627394e7d..000000000000 --- a/swarm/storage/ldbstore.go +++ /dev/null @@ -1,868 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// disk storage layer for the package bzz -// DbStore implements the ChunkStore interface and is used by the FileStore as -// persistent storage of chunks -// it implements purging based on access count allowing for external control of -// max capacity - -package storage - -import ( - "archive/tar" - "bytes" - "context" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "io" - "io/ioutil" - "sort" - "sync" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/rlp" - ch "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage/mock" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -const ( - gcArrayFreeRatio = 0.1 - maxGCitems = 5000 // max number of items to be gc'd per call to collectGarbage() -) - -var ( - dbEntryCount = metrics.NewRegisteredCounter("ldbstore.entryCnt", nil) -) - -var ( - keyIndex = byte(0) - keyOldData = byte(1) - keyAccessCnt = []byte{2} - keyEntryCnt = []byte{3} - keyDataIdx = []byte{4} - keyData = byte(6) - keyDistanceCnt = byte(7) -) - -var ( - ErrDBClosed = errors.New("LDBStore closed") -) - -type gcItem struct { - idx uint64 - value uint64 - idxKey []byte - po uint8 -} - -type LDBStoreParams struct { - *StoreParams - Path string - Po func(Address) uint8 -} - -// NewLDBStoreParams constructs LDBStoreParams with the specified values. -func NewLDBStoreParams(storeparams *StoreParams, path string) *LDBStoreParams { - return &LDBStoreParams{ - StoreParams: storeparams, - Path: path, - Po: func(k Address) (ret uint8) { return uint8(Proximity(storeparams.BaseKey, k[:])) }, - } -} - -type LDBStore struct { - db *LDBDatabase - - // this should be stored in db, accessed transactionally - entryCnt uint64 // number of items in the LevelDB - accessCnt uint64 // ever-accumulating number increased every time we read/access an entry - dataIdx uint64 // similar to entryCnt, but we only increment it - capacity uint64 - bucketCnt []uint64 - - hashfunc SwarmHasher - po func(Address) uint8 - - batchC chan bool - batchesC chan struct{} - closed bool - batch *dbBatch - lock sync.RWMutex - quit chan struct{} - - // Functions encodeDataFunc is used to bypass - // the default functionality of DbStore with - // mock.NodeStore for testing purposes. - encodeDataFunc func(chunk Chunk) []byte - // If getDataFunc is defined, it will be used for - // retrieving the chunk data instead from the local - // LevelDB database. - getDataFunc func(key Address) (data []byte, err error) -} - -type dbBatch struct { - *leveldb.Batch - err error - c chan struct{} -} - -func newBatch() *dbBatch { - return &dbBatch{Batch: new(leveldb.Batch), c: make(chan struct{})} -} - -// TODO: Instead of passing the distance function, just pass the address from which distances are calculated -// to avoid the appearance of a pluggable distance metric and opportunities of bugs associated with providing -// a function different from the one that is actually used. -func NewLDBStore(params *LDBStoreParams) (s *LDBStore, err error) { - s = new(LDBStore) - s.hashfunc = params.Hash - s.quit = make(chan struct{}) - - s.batchesC = make(chan struct{}, 1) - go s.writeBatches() - s.batch = newBatch() - // associate encodeData with default functionality - s.encodeDataFunc = encodeData - - s.db, err = NewLDBDatabase(params.Path) - if err != nil { - return nil, err - } - - s.po = params.Po - s.setCapacity(params.DbCapacity) - - s.bucketCnt = make([]uint64, 0x100) - for i := 0; i < 0x100; i++ { - k := make([]byte, 2) - k[0] = keyDistanceCnt - k[1] = uint8(i) - cnt, _ := s.db.Get(k) - s.bucketCnt[i] = BytesToU64(cnt) - } - data, _ := s.db.Get(keyEntryCnt) - s.entryCnt = BytesToU64(data) - data, _ = s.db.Get(keyAccessCnt) - s.accessCnt = BytesToU64(data) - data, _ = s.db.Get(keyDataIdx) - s.dataIdx = BytesToU64(data) - - return s, nil -} - -// NewMockDbStore creates a new instance of DbStore with -// mockStore set to a provided value. If mockStore argument is nil, -// this function behaves exactly as NewDbStore. -func NewMockDbStore(params *LDBStoreParams, mockStore *mock.NodeStore) (s *LDBStore, err error) { - s, err = NewLDBStore(params) - if err != nil { - return nil, err - } - - // replace put and get with mock store functionality - if mockStore != nil { - s.encodeDataFunc = newMockEncodeDataFunc(mockStore) - s.getDataFunc = newMockGetDataFunc(mockStore) - } - return -} - -type dpaDBIndex struct { - Idx uint64 - Access uint64 -} - -func BytesToU64(data []byte) uint64 { - if len(data) < 8 { - return 0 - } - return binary.BigEndian.Uint64(data) -} - -func U64ToBytes(val uint64) []byte { - data := make([]byte, 8) - binary.BigEndian.PutUint64(data, val) - return data -} - -func (s *LDBStore) updateIndexAccess(index *dpaDBIndex) { - index.Access = s.accessCnt -} - -func getIndexKey(hash Address) []byte { - hashSize := len(hash) - key := make([]byte, hashSize+1) - key[0] = keyIndex - copy(key[1:], hash[:]) - return key -} - -func getDataKey(idx uint64, po uint8) []byte { - key := make([]byte, 10) - key[0] = keyData - key[1] = po - binary.BigEndian.PutUint64(key[2:], idx) - - return key -} - -func encodeIndex(index *dpaDBIndex) []byte { - data, _ := rlp.EncodeToBytes(index) - return data -} - -func encodeData(chunk Chunk) []byte { - // Always create a new underlying array for the returned byte slice. - // The chunk.Address array may be used in the returned slice which - // may be changed later in the code or by the LevelDB, resulting - // that the Address is changed as well. - return append(append([]byte{}, chunk.Address()[:]...), chunk.Data()...) -} - -func decodeIndex(data []byte, index *dpaDBIndex) error { - dec := rlp.NewStream(bytes.NewReader(data), 0) - return dec.Decode(index) -} - -func decodeData(addr Address, data []byte) (*chunk, error) { - return NewChunk(addr, data[32:]), nil -} - -func (s *LDBStore) collectGarbage(ratio float32) { - log.Trace("collectGarbage", "ratio", ratio) - - metrics.GetOrRegisterCounter("ldbstore.collectgarbage", nil).Inc(1) - - it := s.db.NewIterator() - defer it.Release() - - garbage := []*gcItem{} - gcnt := 0 - - for ok := it.Seek([]byte{keyIndex}); ok && (gcnt < maxGCitems) && (uint64(gcnt) < s.entryCnt); ok = it.Next() { - itkey := it.Key() - - if (itkey == nil) || (itkey[0] != keyIndex) { - break - } - - // it.Key() contents change on next call to it.Next(), so we must copy it - key := make([]byte, len(it.Key())) - copy(key, it.Key()) - - val := it.Value() - - var index dpaDBIndex - - hash := key[1:] - decodeIndex(val, &index) - po := s.po(hash) - - gci := &gcItem{ - idxKey: key, - idx: index.Idx, - value: index.Access, // the smaller, the more likely to be gc'd. see sort comparator below. - po: po, - } - - garbage = append(garbage, gci) - gcnt++ - } - - sort.Slice(garbage[:gcnt], func(i, j int) bool { return garbage[i].value < garbage[j].value }) - - cutoff := int(float32(gcnt) * ratio) - metrics.GetOrRegisterCounter("ldbstore.collectgarbage.delete", nil).Inc(int64(cutoff)) - - for i := 0; i < cutoff; i++ { - s.delete(garbage[i].idx, garbage[i].idxKey, garbage[i].po) - } -} - -// Export writes all chunks from the store to a tar archive, returning the -// number of chunks written. -func (s *LDBStore) Export(out io.Writer) (int64, error) { - tw := tar.NewWriter(out) - defer tw.Close() - - it := s.db.NewIterator() - defer it.Release() - var count int64 - for ok := it.Seek([]byte{keyIndex}); ok; ok = it.Next() { - key := it.Key() - if (key == nil) || (key[0] != keyIndex) { - break - } - - var index dpaDBIndex - - hash := key[1:] - decodeIndex(it.Value(), &index) - po := s.po(hash) - datakey := getDataKey(index.Idx, po) - log.Trace("store.export", "dkey", fmt.Sprintf("%x", datakey), "dataidx", index.Idx, "po", po) - data, err := s.db.Get(datakey) - if err != nil { - log.Warn(fmt.Sprintf("Chunk %x found but could not be accessed: %v", key, err)) - continue - } - - hdr := &tar.Header{ - Name: hex.EncodeToString(hash), - Mode: 0644, - Size: int64(len(data)), - } - if err := tw.WriteHeader(hdr); err != nil { - return count, err - } - if _, err := tw.Write(data); err != nil { - return count, err - } - count++ - } - - return count, nil -} - -// of chunks read. -func (s *LDBStore) Import(in io.Reader) (int64, error) { - tr := tar.NewReader(in) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - countC := make(chan int64) - errC := make(chan error) - var count int64 - go func() { - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } else if err != nil { - select { - case errC <- err: - case <-ctx.Done(): - } - } - - if len(hdr.Name) != 64 { - log.Warn("ignoring non-chunk file", "name", hdr.Name) - continue - } - - keybytes, err := hex.DecodeString(hdr.Name) - if err != nil { - log.Warn("ignoring invalid chunk file", "name", hdr.Name, "err", err) - continue - } - - data, err := ioutil.ReadAll(tr) - if err != nil { - select { - case errC <- err: - case <-ctx.Done(): - } - } - key := Address(keybytes) - chunk := NewChunk(key, data[32:]) - - go func() { - select { - case errC <- s.Put(ctx, chunk): - case <-ctx.Done(): - } - }() - - count++ - } - countC <- count - }() - - // wait for all chunks to be stored - i := int64(0) - var total int64 - for { - select { - case err := <-errC: - if err != nil { - return count, err - } - i++ - case total = <-countC: - case <-ctx.Done(): - return i, ctx.Err() - } - if total > 0 && i == total { - return total, nil - } - } -} - -func (s *LDBStore) Cleanup() { - //Iterates over the database and checks that there are no chunks bigger than 4kb - var errorsFound, removed, total int - - it := s.db.NewIterator() - defer it.Release() - for ok := it.Seek([]byte{keyIndex}); ok; ok = it.Next() { - key := it.Key() - if (key == nil) || (key[0] != keyIndex) { - break - } - total++ - var index dpaDBIndex - err := decodeIndex(it.Value(), &index) - if err != nil { - log.Warn("Cannot decode") - errorsFound++ - continue - } - hash := key[1:] - po := s.po(hash) - datakey := getDataKey(index.Idx, po) - data, err := s.db.Get(datakey) - if err != nil { - found := false - - // highest possible proximity is 255 - for po = 1; po <= 255; po++ { - datakey = getDataKey(index.Idx, po) - data, err = s.db.Get(datakey) - if err == nil { - found = true - break - } - } - - if !found { - log.Warn(fmt.Sprintf("Chunk %x found but count not be accessed with any po", key)) - errorsFound++ - continue - } - } - - ck := data[:32] - c, err := decodeData(ck, data) - if err != nil { - log.Error("decodeData error", "err", err) - continue - } - - cs := int64(binary.LittleEndian.Uint64(c.sdata[:8])) - log.Trace("chunk", "key", fmt.Sprintf("%x", key), "ck", fmt.Sprintf("%x", ck), "dkey", fmt.Sprintf("%x", datakey), "dataidx", index.Idx, "po", po, "len data", len(data), "len sdata", len(c.sdata), "size", cs) - - if len(c.sdata) > ch.DefaultSize+8 { - log.Warn("chunk for cleanup", "key", fmt.Sprintf("%x", key), "ck", fmt.Sprintf("%x", ck), "dkey", fmt.Sprintf("%x", datakey), "dataidx", index.Idx, "po", po, "len data", len(data), "len sdata", len(c.sdata), "size", cs) - s.delete(index.Idx, getIndexKey(key[1:]), po) - removed++ - errorsFound++ - } - } - - log.Warn(fmt.Sprintf("Found %v errors out of %v entries. Removed %v chunks.", errorsFound, total, removed)) -} - -func (s *LDBStore) ReIndex() { - //Iterates over the database and checks that there are no faulty chunks - it := s.db.NewIterator() - startPosition := []byte{keyOldData} - it.Seek(startPosition) - var key []byte - var errorsFound, total int - for it.Valid() { - key = it.Key() - if (key == nil) || (key[0] != keyOldData) { - break - } - data := it.Value() - hasher := s.hashfunc() - hasher.Write(data) - hash := hasher.Sum(nil) - - newKey := make([]byte, 10) - oldCntKey := make([]byte, 2) - newCntKey := make([]byte, 2) - oldCntKey[0] = keyDistanceCnt - newCntKey[0] = keyDistanceCnt - key[0] = keyData - key[1] = s.po(Address(key[1:])) - oldCntKey[1] = key[1] - newCntKey[1] = s.po(Address(newKey[1:])) - copy(newKey[2:], key[1:]) - newValue := append(hash, data...) - - batch := new(leveldb.Batch) - batch.Delete(key) - s.bucketCnt[oldCntKey[1]]-- - batch.Put(oldCntKey, U64ToBytes(s.bucketCnt[oldCntKey[1]])) - batch.Put(newKey, newValue) - s.bucketCnt[newCntKey[1]]++ - batch.Put(newCntKey, U64ToBytes(s.bucketCnt[newCntKey[1]])) - s.db.Write(batch) - it.Next() - } - it.Release() - log.Warn(fmt.Sprintf("Found %v errors out of %v entries", errorsFound, total)) -} - -func (s *LDBStore) Delete(addr Address) { - s.lock.Lock() - defer s.lock.Unlock() - - ikey := getIndexKey(addr) - - var indx dpaDBIndex - s.tryAccessIdx(ikey, &indx) - - s.delete(indx.Idx, ikey, s.po(addr)) -} - -func (s *LDBStore) delete(idx uint64, idxKey []byte, po uint8) { - metrics.GetOrRegisterCounter("ldbstore.delete", nil).Inc(1) - - batch := new(leveldb.Batch) - batch.Delete(idxKey) - batch.Delete(getDataKey(idx, po)) - s.entryCnt-- - dbEntryCount.Dec(1) - cntKey := make([]byte, 2) - cntKey[0] = keyDistanceCnt - cntKey[1] = po - batch.Put(keyEntryCnt, U64ToBytes(s.entryCnt)) - batch.Put(cntKey, U64ToBytes(s.bucketCnt[po])) - s.db.Write(batch) -} - -func (s *LDBStore) BinIndex(po uint8) uint64 { - s.lock.RLock() - defer s.lock.RUnlock() - return s.bucketCnt[po] -} - -func (s *LDBStore) Size() uint64 { - s.lock.RLock() - defer s.lock.RUnlock() - return s.entryCnt -} - -func (s *LDBStore) CurrentStorageIndex() uint64 { - s.lock.RLock() - defer s.lock.RUnlock() - return s.dataIdx -} - -func (s *LDBStore) Put(ctx context.Context, chunk Chunk) error { - metrics.GetOrRegisterCounter("ldbstore.put", nil).Inc(1) - log.Trace("ldbstore.put", "key", chunk.Address()) - - ikey := getIndexKey(chunk.Address()) - var index dpaDBIndex - - po := s.po(chunk.Address()) - - s.lock.Lock() - - if s.closed { - s.lock.Unlock() - return ErrDBClosed - } - batch := s.batch - - log.Trace("ldbstore.put: s.db.Get", "key", chunk.Address(), "ikey", fmt.Sprintf("%x", ikey)) - idata, err := s.db.Get(ikey) - if err != nil { - s.doPut(chunk, &index, po) - } else { - log.Trace("ldbstore.put: chunk already exists, only update access", "key", chunk.Address) - decodeIndex(idata, &index) - } - index.Access = s.accessCnt - s.accessCnt++ - idata = encodeIndex(&index) - s.batch.Put(ikey, idata) - - s.lock.Unlock() - - select { - case s.batchesC <- struct{}{}: - default: - } - - select { - case <-batch.c: - return batch.err - case <-ctx.Done(): - return ctx.Err() - } -} - -// force putting into db, does not check access index -func (s *LDBStore) doPut(chunk Chunk, index *dpaDBIndex, po uint8) { - data := s.encodeDataFunc(chunk) - dkey := getDataKey(s.dataIdx, po) - s.batch.Put(dkey, data) - index.Idx = s.dataIdx - s.bucketCnt[po] = s.dataIdx - s.entryCnt++ - dbEntryCount.Inc(1) - s.dataIdx++ - - cntKey := make([]byte, 2) - cntKey[0] = keyDistanceCnt - cntKey[1] = po - s.batch.Put(cntKey, U64ToBytes(s.bucketCnt[po])) -} - -func (s *LDBStore) writeBatches() { - for { - select { - case <-s.quit: - log.Debug("DbStore: quit batch write loop") - return - case <-s.batchesC: - err := s.writeCurrentBatch() - if err != nil { - log.Debug("DbStore: quit batch write loop", "err", err.Error()) - return - } - } - } - -} - -func (s *LDBStore) writeCurrentBatch() error { - s.lock.Lock() - defer s.lock.Unlock() - b := s.batch - l := b.Len() - if l == 0 { - return nil - } - e := s.entryCnt - d := s.dataIdx - a := s.accessCnt - s.batch = newBatch() - b.err = s.writeBatch(b, e, d, a) - close(b.c) - for e > s.capacity { - log.Trace("for >", "e", e, "s.capacity", s.capacity) - // Collect garbage in a separate goroutine - // to be able to interrupt this loop by s.quit. - done := make(chan struct{}) - go func() { - s.collectGarbage(gcArrayFreeRatio) - log.Trace("collectGarbage closing done") - close(done) - }() - - select { - case <-s.quit: - return errors.New("CollectGarbage terminated due to quit") - case <-done: - } - e = s.entryCnt - } - return nil -} - -// must be called non concurrently -func (s *LDBStore) writeBatch(b *dbBatch, entryCnt, dataIdx, accessCnt uint64) error { - b.Put(keyEntryCnt, U64ToBytes(entryCnt)) - b.Put(keyDataIdx, U64ToBytes(dataIdx)) - b.Put(keyAccessCnt, U64ToBytes(accessCnt)) - l := b.Len() - if err := s.db.Write(b.Batch); err != nil { - return fmt.Errorf("unable to write batch: %v", err) - } - log.Trace(fmt.Sprintf("batch write (%d entries)", l)) - return nil -} - -// newMockEncodeDataFunc returns a function that stores the chunk data -// to a mock store to bypass the default functionality encodeData. -// The constructed function always returns the nil data, as DbStore does -// not need to store the data, but still need to create the index. -func newMockEncodeDataFunc(mockStore *mock.NodeStore) func(chunk Chunk) []byte { - return func(chunk Chunk) []byte { - if err := mockStore.Put(chunk.Address(), encodeData(chunk)); err != nil { - log.Error(fmt.Sprintf("%T: Chunk %v put: %v", mockStore, chunk.Address().Log(), err)) - } - return chunk.Address()[:] - } -} - -// try to find index; if found, update access cnt and return true -func (s *LDBStore) tryAccessIdx(ikey []byte, index *dpaDBIndex) bool { - idata, err := s.db.Get(ikey) - if err != nil { - return false - } - decodeIndex(idata, index) - s.batch.Put(keyAccessCnt, U64ToBytes(s.accessCnt)) - s.accessCnt++ - index.Access = s.accessCnt - idata = encodeIndex(index) - s.batch.Put(ikey, idata) - select { - case s.batchesC <- struct{}{}: - default: - } - return true -} - -func (s *LDBStore) Get(_ context.Context, addr Address) (chunk Chunk, err error) { - metrics.GetOrRegisterCounter("ldbstore.get", nil).Inc(1) - log.Trace("ldbstore.get", "key", addr) - - s.lock.Lock() - defer s.lock.Unlock() - return s.get(addr) -} - -func (s *LDBStore) get(addr Address) (chunk *chunk, err error) { - var indx dpaDBIndex - if s.closed { - return nil, ErrDBClosed - } - if s.tryAccessIdx(getIndexKey(addr), &indx) { - var data []byte - if s.getDataFunc != nil { - // if getDataFunc is defined, use it to retrieve the chunk data - log.Trace("ldbstore.get retrieve with getDataFunc", "key", addr) - data, err = s.getDataFunc(addr) - if err != nil { - return - } - } else { - // default DbStore functionality to retrieve chunk data - proximity := s.po(addr) - datakey := getDataKey(indx.Idx, proximity) - data, err = s.db.Get(datakey) - log.Trace("ldbstore.get retrieve", "key", addr, "indexkey", indx.Idx, "datakey", fmt.Sprintf("%x", datakey), "proximity", proximity) - if err != nil { - log.Trace("ldbstore.get chunk found but could not be accessed", "key", addr, "err", err) - s.delete(indx.Idx, getIndexKey(addr), s.po(addr)) - return - } - } - - return decodeData(addr, data) - } else { - err = ErrChunkNotFound - } - - return -} - -// newMockGetFunc returns a function that reads chunk data from -// the mock database, which is used as the value for DbStore.getFunc -// to bypass the default functionality of DbStore with a mock store. -func newMockGetDataFunc(mockStore *mock.NodeStore) func(addr Address) (data []byte, err error) { - return func(addr Address) (data []byte, err error) { - data, err = mockStore.Get(addr) - if err == mock.ErrNotFound { - // preserve ErrChunkNotFound error - err = ErrChunkNotFound - } - return data, err - } -} - -func (s *LDBStore) updateAccessCnt(addr Address) { - - s.lock.Lock() - defer s.lock.Unlock() - - var index dpaDBIndex - s.tryAccessIdx(getIndexKey(addr), &index) // result_chn == nil, only update access cnt - -} - -func (s *LDBStore) setCapacity(c uint64) { - s.lock.Lock() - defer s.lock.Unlock() - - s.capacity = c - - if s.entryCnt > c { - ratio := float32(1.01) - float32(c)/float32(s.entryCnt) - if ratio < gcArrayFreeRatio { - ratio = gcArrayFreeRatio - } - if ratio > 1 { - ratio = 1 - } - for s.entryCnt > c { - s.collectGarbage(ratio) - } - } -} - -func (s *LDBStore) Close() { - close(s.quit) - s.lock.Lock() - s.closed = true - s.lock.Unlock() - // force writing out current batch - s.writeCurrentBatch() - close(s.batchesC) - s.db.Close() -} - -// SyncIterator(start, stop, po, f) calls f on each hash of a bin po from start to stop -func (s *LDBStore) SyncIterator(since uint64, until uint64, po uint8, f func(Address, uint64) bool) error { - metrics.GetOrRegisterCounter("ldbstore.synciterator", nil).Inc(1) - - sincekey := getDataKey(since, po) - untilkey := getDataKey(until, po) - it := s.db.NewIterator() - defer it.Release() - - for ok := it.Seek(sincekey); ok; ok = it.Next() { - metrics.GetOrRegisterCounter("ldbstore.synciterator.seek", nil).Inc(1) - - dbkey := it.Key() - if dbkey[0] != keyData || dbkey[1] != po || bytes.Compare(untilkey, dbkey) < 0 { - break - } - key := make([]byte, 32) - val := it.Value() - copy(key, val[:32]) - if !f(Address(key), binary.BigEndian.Uint64(dbkey[2:])) { - break - } - } - return it.Error() -} - -func databaseExists(path string) bool { - o := &opt.Options{ - ErrorIfMissing: true, - } - tdb, err := leveldb.OpenFile(path, o) - if err != nil { - return false - } - defer tdb.Close() - return true -} diff --git a/swarm/storage/ldbstore_test.go b/swarm/storage/ldbstore_test.go deleted file mode 100644 index 75b5d6aa95c7..000000000000 --- a/swarm/storage/ldbstore_test.go +++ /dev/null @@ -1,457 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "fmt" - "io/ioutil" - "os" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - ch "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage/mock/mem" - - ldberrors "github.com/syndtr/goleveldb/leveldb/errors" -) - -type testDbStore struct { - *LDBStore - dir string -} - -func newTestDbStore(mock bool, trusted bool) (*testDbStore, func(), error) { - dir, err := ioutil.TempDir("", "bzz-storage-test") - if err != nil { - return nil, func() {}, err - } - - var db *LDBStore - storeparams := NewDefaultStoreParams() - params := NewLDBStoreParams(storeparams, dir) - params.Po = testPoFunc - - if mock { - globalStore := mem.NewGlobalStore() - addr := common.HexToAddress("0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed") - mockStore := globalStore.NewNodeStore(addr) - - db, err = NewMockDbStore(params, mockStore) - } else { - db, err = NewLDBStore(params) - } - - cleanup := func() { - if db != nil { - db.Close() - } - err = os.RemoveAll(dir) - if err != nil { - panic(fmt.Sprintf("db cleanup failed: %v", err)) - } - } - - return &testDbStore{db, dir}, cleanup, err -} - -func testPoFunc(k Address) (ret uint8) { - basekey := make([]byte, 32) - return uint8(Proximity(basekey, k[:])) -} - -func (db *testDbStore) close() { - db.Close() - err := os.RemoveAll(db.dir) - if err != nil { - panic(err) - } -} - -func testDbStoreRandom(n int, chunksize int64, mock bool, t *testing.T) { - db, cleanup, err := newTestDbStore(mock, true) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - testStoreRandom(db, n, chunksize, t) -} - -func testDbStoreCorrect(n int, chunksize int64, mock bool, t *testing.T) { - db, cleanup, err := newTestDbStore(mock, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - testStoreCorrect(db, n, chunksize, t) -} - -func TestDbStoreRandom_1(t *testing.T) { - testDbStoreRandom(1, 0, false, t) -} - -func TestDbStoreCorrect_1(t *testing.T) { - testDbStoreCorrect(1, 4096, false, t) -} - -func TestDbStoreRandom_5k(t *testing.T) { - testDbStoreRandom(5000, 0, false, t) -} - -func TestDbStoreCorrect_5k(t *testing.T) { - testDbStoreCorrect(5000, 4096, false, t) -} - -func TestMockDbStoreRandom_1(t *testing.T) { - testDbStoreRandom(1, 0, true, t) -} - -func TestMockDbStoreCorrect_1(t *testing.T) { - testDbStoreCorrect(1, 4096, true, t) -} - -func TestMockDbStoreRandom_5k(t *testing.T) { - testDbStoreRandom(5000, 0, true, t) -} - -func TestMockDbStoreCorrect_5k(t *testing.T) { - testDbStoreCorrect(5000, 4096, true, t) -} - -func testDbStoreNotFound(t *testing.T, mock bool) { - db, cleanup, err := newTestDbStore(mock, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - - _, err = db.Get(context.TODO(), ZeroAddr) - if err != ErrChunkNotFound { - t.Errorf("Expected ErrChunkNotFound, got %v", err) - } -} - -func TestDbStoreNotFound(t *testing.T) { - testDbStoreNotFound(t, false) -} -func TestMockDbStoreNotFound(t *testing.T) { - testDbStoreNotFound(t, true) -} - -func testIterator(t *testing.T, mock bool) { - var chunkcount int = 32 - var i int - var poc uint - chunkkeys := NewAddressCollection(chunkcount) - chunkkeys_results := NewAddressCollection(chunkcount) - - db, cleanup, err := newTestDbStore(mock, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - - chunks := GenerateRandomChunks(ch.DefaultSize, chunkcount) - - for i = 0; i < len(chunks); i++ { - chunkkeys[i] = chunks[i].Address() - err := db.Put(context.TODO(), chunks[i]) - if err != nil { - t.Fatalf("dbStore.Put failed: %v", err) - } - } - - for i = 0; i < len(chunkkeys); i++ { - log.Trace(fmt.Sprintf("Chunk array pos %d/%d: '%v'", i, chunkcount, chunkkeys[i])) - } - i = 0 - for poc = 0; poc <= 255; poc++ { - err := db.SyncIterator(0, uint64(chunkkeys.Len()), uint8(poc), func(k Address, n uint64) bool { - log.Trace(fmt.Sprintf("Got key %v number %d poc %d", k, n, uint8(poc))) - chunkkeys_results[n] = k - i++ - return true - }) - if err != nil { - t.Fatalf("Iterator call failed: %v", err) - } - } - - for i = 0; i < chunkcount; i++ { - if !bytes.Equal(chunkkeys[i], chunkkeys_results[i]) { - t.Fatalf("Chunk put #%d key '%v' does not match iterator's key '%v'", i, chunkkeys[i], chunkkeys_results[i]) - } - } - -} - -func TestIterator(t *testing.T) { - testIterator(t, false) -} -func TestMockIterator(t *testing.T) { - testIterator(t, true) -} - -func benchmarkDbStorePut(n int, processors int, chunksize int64, mock bool, b *testing.B) { - db, cleanup, err := newTestDbStore(mock, true) - defer cleanup() - if err != nil { - b.Fatalf("init dbStore failed: %v", err) - } - benchmarkStorePut(db, n, chunksize, b) -} - -func benchmarkDbStoreGet(n int, processors int, chunksize int64, mock bool, b *testing.B) { - db, cleanup, err := newTestDbStore(mock, true) - defer cleanup() - if err != nil { - b.Fatalf("init dbStore failed: %v", err) - } - benchmarkStoreGet(db, n, chunksize, b) -} - -func BenchmarkDbStorePut_1_500(b *testing.B) { - benchmarkDbStorePut(500, 1, 4096, false, b) -} - -func BenchmarkDbStorePut_8_500(b *testing.B) { - benchmarkDbStorePut(500, 8, 4096, false, b) -} - -func BenchmarkDbStoreGet_1_500(b *testing.B) { - benchmarkDbStoreGet(500, 1, 4096, false, b) -} - -func BenchmarkDbStoreGet_8_500(b *testing.B) { - benchmarkDbStoreGet(500, 8, 4096, false, b) -} - -func BenchmarkMockDbStorePut_1_500(b *testing.B) { - benchmarkDbStorePut(500, 1, 4096, true, b) -} - -func BenchmarkMockDbStorePut_8_500(b *testing.B) { - benchmarkDbStorePut(500, 8, 4096, true, b) -} - -func BenchmarkMockDbStoreGet_1_500(b *testing.B) { - benchmarkDbStoreGet(500, 1, 4096, true, b) -} - -func BenchmarkMockDbStoreGet_8_500(b *testing.B) { - benchmarkDbStoreGet(500, 8, 4096, true, b) -} - -// TestLDBStoreWithoutCollectGarbage tests that we can put a number of random chunks in the LevelDB store, and -// retrieve them, provided we don't hit the garbage collection -func TestLDBStoreWithoutCollectGarbage(t *testing.T) { - capacity := 50 - n := 10 - - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(uint64(capacity)) - defer cleanup() - - chunks, err := mputRandomChunks(ldb, n, int64(ch.DefaultSize)) - if err != nil { - t.Fatal(err.Error()) - } - - log.Info("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) - - for _, ch := range chunks { - ret, err := ldb.Get(context.TODO(), ch.Address()) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(ret.Data(), ch.Data()) { - t.Fatal("expected to get the same data back, but got smth else") - } - } - - if ldb.entryCnt != uint64(n) { - t.Fatalf("expected entryCnt to be equal to %v, but got %v", n, ldb.entryCnt) - } - - if ldb.accessCnt != uint64(2*n) { - t.Fatalf("expected accessCnt to be equal to %v, but got %v", 2*n, ldb.accessCnt) - } -} - -// TestLDBStoreCollectGarbage tests that we can put more chunks than LevelDB's capacity, and -// retrieve only some of them, because garbage collection must have cleared some of them -func TestLDBStoreCollectGarbage(t *testing.T) { - capacity := 500 - n := 2000 - - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(uint64(capacity)) - defer cleanup() - - chunks, err := mputRandomChunks(ldb, n, int64(ch.DefaultSize)) - if err != nil { - t.Fatal(err.Error()) - } - log.Info("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) - - // wait for garbage collection to kick in on the responsible actor - time.Sleep(1 * time.Second) - - var missing int - for _, ch := range chunks { - ret, err := ldb.Get(context.Background(), ch.Address()) - if err == ErrChunkNotFound || err == ldberrors.ErrNotFound { - missing++ - continue - } - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(ret.Data(), ch.Data()) { - t.Fatal("expected to get the same data back, but got smth else") - } - - log.Trace("got back chunk", "chunk", ret) - } - - if missing < n-capacity { - t.Fatalf("gc failure: expected to miss %v chunks, but only %v are actually missing", n-capacity, missing) - } - - log.Info("ldbstore", "total", n, "missing", missing, "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) -} - -// TestLDBStoreAddRemove tests that we can put and then delete a given chunk -func TestLDBStoreAddRemove(t *testing.T) { - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(200) - defer cleanup() - - n := 100 - chunks, err := mputRandomChunks(ldb, n, int64(ch.DefaultSize)) - if err != nil { - t.Fatalf(err.Error()) - } - - for i := 0; i < n; i++ { - // delete all even index chunks - if i%2 == 0 { - ldb.Delete(chunks[i].Address()) - } - } - - log.Info("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) - - for i := 0; i < n; i++ { - ret, err := ldb.Get(nil, chunks[i].Address()) - - if i%2 == 0 { - // expect even chunks to be missing - if err == nil { - // if err != ErrChunkNotFound { - t.Fatal("expected chunk to be missing, but got no error") - } - } else { - // expect odd chunks to be retrieved successfully - if err != nil { - t.Fatalf("expected no error, but got %s", err) - } - - if !bytes.Equal(ret.Data(), chunks[i].Data()) { - t.Fatal("expected to get the same data back, but got smth else") - } - } - } -} - -// TestLDBStoreRemoveThenCollectGarbage tests that we can delete chunks and that we can trigger garbage collection -func TestLDBStoreRemoveThenCollectGarbage(t *testing.T) { - capacity := 11 - surplus := 4 - - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(uint64(capacity)) - - n := capacity - - chunks := []Chunk{} - for i := 0; i < n+surplus; i++ { - c := GenerateRandomChunk(ch.DefaultSize) - chunks = append(chunks, c) - log.Trace("generate random chunk", "idx", i, "chunk", c) - } - - for i := 0; i < n; i++ { - ldb.Put(context.TODO(), chunks[i]) - } - - // delete all chunks - for i := 0; i < n; i++ { - ldb.Delete(chunks[i].Address()) - } - - log.Info("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) - - if ldb.entryCnt != 0 { - t.Fatalf("ldb.entrCnt expected 0 got %v", ldb.entryCnt) - } - - expAccessCnt := uint64(n * 2) - if ldb.accessCnt != expAccessCnt { - t.Fatalf("ldb.accessCnt expected %v got %v", expAccessCnt, ldb.entryCnt) - } - - cleanup() - - ldb, cleanup = newLDBStore(t) - capacity = 10 - ldb.setCapacity(uint64(capacity)) - defer cleanup() - - n = capacity + surplus - - for i := 0; i < n; i++ { - ldb.Put(context.TODO(), chunks[i]) - } - - // wait for garbage collection - time.Sleep(1 * time.Second) - - // expect first surplus chunks to be missing, because they have the smallest access value - for i := 0; i < surplus; i++ { - _, err := ldb.Get(context.TODO(), chunks[i].Address()) - if err == nil { - t.Fatal("expected surplus chunk to be missing, but got no error") - } - } - - // expect last chunks to be present, as they have the largest access value - for i := surplus; i < surplus+capacity; i++ { - ret, err := ldb.Get(context.TODO(), chunks[i].Address()) - if err != nil { - t.Fatalf("chunk %v: expected no error, but got %s", i, err) - } - if !bytes.Equal(ret.Data(), chunks[i].Data()) { - t.Fatal("expected to get the same data back, but got smth else") - } - } -} diff --git a/swarm/storage/localstore.go b/swarm/storage/localstore.go deleted file mode 100644 index 04701ee69a4f..000000000000 --- a/swarm/storage/localstore.go +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "path/filepath" - "sync" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage/mock" -) - -type LocalStoreParams struct { - *StoreParams - ChunkDbPath string - Validators []ChunkValidator `toml:"-"` -} - -func NewDefaultLocalStoreParams() *LocalStoreParams { - return &LocalStoreParams{ - StoreParams: NewDefaultStoreParams(), - } -} - -//this can only finally be set after all config options (file, cmd line, env vars) -//have been evaluated -func (p *LocalStoreParams) Init(path string) { - if p.ChunkDbPath == "" { - p.ChunkDbPath = filepath.Join(path, "chunks") - } -} - -// LocalStore is a combination of inmemory db over a disk persisted db -// implements a Get/Put with fallback (caching) logic using any 2 ChunkStores -type LocalStore struct { - Validators []ChunkValidator - memStore *MemStore - DbStore *LDBStore - mu sync.Mutex -} - -// This constructor uses MemStore and DbStore as components -func NewLocalStore(params *LocalStoreParams, mockStore *mock.NodeStore) (*LocalStore, error) { - ldbparams := NewLDBStoreParams(params.StoreParams, params.ChunkDbPath) - dbStore, err := NewMockDbStore(ldbparams, mockStore) - if err != nil { - return nil, err - } - return &LocalStore{ - memStore: NewMemStore(params.StoreParams, dbStore), - DbStore: dbStore, - Validators: params.Validators, - }, nil -} - -func NewTestLocalStoreForAddr(params *LocalStoreParams) (*LocalStore, error) { - ldbparams := NewLDBStoreParams(params.StoreParams, params.ChunkDbPath) - dbStore, err := NewLDBStore(ldbparams) - if err != nil { - return nil, err - } - localStore := &LocalStore{ - memStore: NewMemStore(params.StoreParams, dbStore), - DbStore: dbStore, - Validators: params.Validators, - } - return localStore, nil -} - -// Put is responsible for doing validation and storage of the chunk -// by using configured ChunkValidators, MemStore and LDBStore. -// If the chunk is not valid, its GetErrored function will -// return ErrChunkInvalid. -// This method will check if the chunk is already in the MemStore -// and it will return it if it is. If there is an error from -// the MemStore.Get, it will be returned by calling GetErrored -// on the chunk. -// This method is responsible for closing Chunk.ReqC channel -// when the chunk is stored in memstore. -// After the LDBStore.Put, it is ensured that the MemStore -// contains the chunk with the same data, but nil ReqC channel. -func (ls *LocalStore) Put(ctx context.Context, chunk Chunk) error { - valid := true - // ls.Validators contains a list of one validator per chunk type. - // if one validator succeeds, then the chunk is valid - for _, v := range ls.Validators { - if valid = v.Validate(chunk.Address(), chunk.Data()); valid { - break - } - } - if !valid { - return ErrChunkInvalid - } - - log.Trace("localstore.put", "key", chunk.Address()) - ls.mu.Lock() - defer ls.mu.Unlock() - - _, err := ls.memStore.Get(ctx, chunk.Address()) - if err == nil { - return nil - } - if err != nil && err != ErrChunkNotFound { - return err - } - ls.memStore.Put(ctx, chunk) - err = ls.DbStore.Put(ctx, chunk) - return err -} - -// Get(chunk *Chunk) looks up a chunk in the local stores -// This method is blocking until the chunk is retrieved -// so additional timeout may be needed to wrap this call if -// ChunkStores are remote and can have long latency -func (ls *LocalStore) Get(ctx context.Context, addr Address) (chunk Chunk, err error) { - ls.mu.Lock() - defer ls.mu.Unlock() - - return ls.get(ctx, addr) -} - -func (ls *LocalStore) get(ctx context.Context, addr Address) (chunk Chunk, err error) { - chunk, err = ls.memStore.Get(ctx, addr) - - if err != nil && err != ErrChunkNotFound { - metrics.GetOrRegisterCounter("localstore.get.error", nil).Inc(1) - return nil, err - } - - if err == nil { - metrics.GetOrRegisterCounter("localstore.get.cachehit", nil).Inc(1) - return chunk, nil - } - - metrics.GetOrRegisterCounter("localstore.get.cachemiss", nil).Inc(1) - chunk, err = ls.DbStore.Get(ctx, addr) - if err != nil { - metrics.GetOrRegisterCounter("localstore.get.error", nil).Inc(1) - return nil, err - } - - ls.memStore.Put(ctx, chunk) - return chunk, nil -} - -func (ls *LocalStore) FetchFunc(ctx context.Context, addr Address) func(context.Context) error { - ls.mu.Lock() - defer ls.mu.Unlock() - - _, err := ls.get(ctx, addr) - if err == nil { - return nil - } - return func(context.Context) error { - return err - } -} - -func (ls *LocalStore) BinIndex(po uint8) uint64 { - return ls.DbStore.BinIndex(po) -} - -func (ls *LocalStore) Iterator(from uint64, to uint64, po uint8, f func(Address, uint64) bool) error { - return ls.DbStore.SyncIterator(from, to, po, f) -} - -// Close the local store -func (ls *LocalStore) Close() { - ls.DbStore.Close() -} diff --git a/swarm/storage/localstore_test.go b/swarm/storage/localstore_test.go deleted file mode 100644 index 814d270d38e5..000000000000 --- a/swarm/storage/localstore_test.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "io/ioutil" - "os" - "testing" - - ch "github.com/ethereum/go-ethereum/swarm/chunk" -) - -var ( - hashfunc = MakeHashFunc(DefaultHash) -) - -// tests that the content address validator correctly checks the data -// tests that resource update chunks are passed through content address validator -// the test checking the resouce update validator internal correctness is found in resource_test.go -func TestValidator(t *testing.T) { - // set up localstore - datadir, err := ioutil.TempDir("", "storage-testvalidator") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(datadir) - - params := NewDefaultLocalStoreParams() - params.Init(datadir) - store, err := NewLocalStore(params, nil) - if err != nil { - t.Fatal(err) - } - - // check puts with no validators, both succeed - chunks := GenerateRandomChunks(259, 2) - goodChunk := chunks[0] - badChunk := chunks[1] - copy(badChunk.Data(), goodChunk.Data()) - - errs := putChunks(store, goodChunk, badChunk) - if errs[0] != nil { - t.Fatalf("expected no error on good content address chunk in spite of no validation, but got: %s", err) - } - if errs[1] != nil { - t.Fatalf("expected no error on bad content address chunk in spite of no validation, but got: %s", err) - } - - // add content address validator and check puts - // bad should fail, good should pass - store.Validators = append(store.Validators, NewContentAddressValidator(hashfunc)) - chunks = GenerateRandomChunks(ch.DefaultSize, 2) - goodChunk = chunks[0] - badChunk = chunks[1] - copy(badChunk.Data(), goodChunk.Data()) - - errs = putChunks(store, goodChunk, badChunk) - if errs[0] != nil { - t.Fatalf("expected no error on good content address chunk with content address validator only, but got: %s", err) - } - if errs[1] == nil { - t.Fatal("expected error on bad content address chunk with content address validator only, but got nil") - } - - // append a validator that always denies - // bad should fail, good should pass, - var negV boolTestValidator - store.Validators = append(store.Validators, negV) - - chunks = GenerateRandomChunks(ch.DefaultSize, 2) - goodChunk = chunks[0] - badChunk = chunks[1] - copy(badChunk.Data(), goodChunk.Data()) - - errs = putChunks(store, goodChunk, badChunk) - if errs[0] != nil { - t.Fatalf("expected no error on good content address chunk with content address validator only, but got: %s", err) - } - if errs[1] == nil { - t.Fatal("expected error on bad content address chunk with content address validator only, but got nil") - } - - // append a validator that always approves - // all shall pass - var posV boolTestValidator = true - store.Validators = append(store.Validators, posV) - - chunks = GenerateRandomChunks(ch.DefaultSize, 2) - goodChunk = chunks[0] - badChunk = chunks[1] - copy(badChunk.Data(), goodChunk.Data()) - - errs = putChunks(store, goodChunk, badChunk) - if errs[0] != nil { - t.Fatalf("expected no error on good content address chunk with content address validator only, but got: %s", err) - } - if errs[1] != nil { - t.Fatalf("expected no error on bad content address chunk in spite of no validation, but got: %s", err) - } - -} - -type boolTestValidator bool - -func (self boolTestValidator) Validate(addr Address, data []byte) bool { - return bool(self) -} - -// putChunks adds chunks to localstore -// It waits for receive on the stored channel -// It logs but does not fail on delivery error -func putChunks(store *LocalStore, chunks ...Chunk) []error { - i := 0 - f := func(n int64) Chunk { - chunk := chunks[i] - i++ - return chunk - } - _, errs := put(store, len(chunks), f) - return errs -} - -func put(store *LocalStore, n int, f func(i int64) Chunk) (hs []Address, errs []error) { - for i := int64(0); i < int64(n); i++ { - chunk := f(ch.DefaultSize) - err := store.Put(context.TODO(), chunk) - errs = append(errs, err) - hs = append(hs, chunk.Address()) - } - return hs, errs -} diff --git a/swarm/storage/memstore.go b/swarm/storage/memstore.go deleted file mode 100644 index 36b1e00d9b80..000000000000 --- a/swarm/storage/memstore.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// memory storage layer for the package blockhash - -package storage - -import ( - "context" - - lru "github.com/hashicorp/golang-lru" -) - -type MemStore struct { - cache *lru.Cache - disabled bool -} - -//NewMemStore is instantiating a MemStore cache keeping all frequently requested -//chunks in the `cache` LRU cache. -func NewMemStore(params *StoreParams, _ *LDBStore) (m *MemStore) { - if params.CacheCapacity == 0 { - return &MemStore{ - disabled: true, - } - } - - c, err := lru.New(int(params.CacheCapacity)) - if err != nil { - panic(err) - } - - return &MemStore{ - cache: c, - } -} - -func (m *MemStore) Get(_ context.Context, addr Address) (Chunk, error) { - if m.disabled { - return nil, ErrChunkNotFound - } - - c, ok := m.cache.Get(string(addr)) - if !ok { - return nil, ErrChunkNotFound - } - return c.(*chunk), nil -} - -func (m *MemStore) Put(_ context.Context, c Chunk) error { - if m.disabled { - return nil - } - - m.cache.Add(string(c.Address()), c) - return nil -} - -func (m *MemStore) setCapacity(n int) { - if n <= 0 { - m.disabled = true - } else { - c, err := lru.New(n) - if err != nil { - panic(err) - } - - *m = MemStore{ - cache: c, - } - } -} - -func (s *MemStore) Close() {} diff --git a/swarm/storage/memstore_test.go b/swarm/storage/memstore_test.go deleted file mode 100644 index 6b370d2b41a0..000000000000 --- a/swarm/storage/memstore_test.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "testing" - - "github.com/ethereum/go-ethereum/swarm/log" -) - -func newTestMemStore() *MemStore { - storeparams := NewDefaultStoreParams() - return NewMemStore(storeparams, nil) -} - -func testMemStoreRandom(n int, chunksize int64, t *testing.T) { - m := newTestMemStore() - defer m.Close() - testStoreRandom(m, n, chunksize, t) -} - -func testMemStoreCorrect(n int, chunksize int64, t *testing.T) { - m := newTestMemStore() - defer m.Close() - testStoreCorrect(m, n, chunksize, t) -} - -func TestMemStoreRandom_1(t *testing.T) { - testMemStoreRandom(1, 0, t) -} - -func TestMemStoreCorrect_1(t *testing.T) { - testMemStoreCorrect(1, 4104, t) -} - -func TestMemStoreRandom_1k(t *testing.T) { - testMemStoreRandom(1000, 0, t) -} - -func TestMemStoreCorrect_1k(t *testing.T) { - testMemStoreCorrect(100, 4096, t) -} - -func TestMemStoreNotFound(t *testing.T) { - m := newTestMemStore() - defer m.Close() - - _, err := m.Get(context.TODO(), ZeroAddr) - if err != ErrChunkNotFound { - t.Errorf("Expected ErrChunkNotFound, got %v", err) - } -} - -func benchmarkMemStorePut(n int, processors int, chunksize int64, b *testing.B) { - m := newTestMemStore() - defer m.Close() - benchmarkStorePut(m, n, chunksize, b) -} - -func benchmarkMemStoreGet(n int, processors int, chunksize int64, b *testing.B) { - m := newTestMemStore() - defer m.Close() - benchmarkStoreGet(m, n, chunksize, b) -} - -func BenchmarkMemStorePut_1_500(b *testing.B) { - benchmarkMemStorePut(500, 1, 4096, b) -} - -func BenchmarkMemStorePut_8_500(b *testing.B) { - benchmarkMemStorePut(500, 8, 4096, b) -} - -func BenchmarkMemStoreGet_1_500(b *testing.B) { - benchmarkMemStoreGet(500, 1, 4096, b) -} - -func BenchmarkMemStoreGet_8_500(b *testing.B) { - benchmarkMemStoreGet(500, 8, 4096, b) -} - -func TestMemStoreAndLDBStore(t *testing.T) { - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(4000) - defer cleanup() - - cacheCap := 200 - memStore := NewMemStore(NewStoreParams(4000, 200, nil, nil), nil) - - tests := []struct { - n int // number of chunks to push to memStore - chunkSize int64 // size of chunk (by default in Swarm - 4096) - }{ - { - n: 1, - chunkSize: 4096, - }, - { - n: 201, - chunkSize: 4096, - }, - { - n: 501, - chunkSize: 4096, - }, - { - n: 3100, - chunkSize: 4096, - }, - { - n: 100, - chunkSize: 4096, - }, - } - - for i, tt := range tests { - log.Info("running test", "idx", i, "tt", tt) - var chunks []Chunk - - for i := 0; i < tt.n; i++ { - c := GenerateRandomChunk(tt.chunkSize) - chunks = append(chunks, c) - } - - for i := 0; i < tt.n; i++ { - err := ldb.Put(context.TODO(), chunks[i]) - if err != nil { - t.Fatal(err) - } - err = memStore.Put(context.TODO(), chunks[i]) - if err != nil { - t.Fatal(err) - } - - if got := memStore.cache.Len(); got > cacheCap { - t.Fatalf("expected to get cache capacity less than %v, but got %v", cacheCap, got) - } - - } - - for i := 0; i < tt.n; i++ { - _, err := memStore.Get(context.TODO(), chunks[i].Address()) - if err != nil { - if err == ErrChunkNotFound { - _, err := ldb.Get(context.TODO(), chunks[i].Address()) - if err != nil { - t.Fatalf("couldn't get chunk %v from ldb, got error: %v", i, err) - } - } else { - t.Fatalf("got error from memstore: %v", err) - } - } - } - } -} diff --git a/swarm/storage/mock/db/db.go b/swarm/storage/mock/db/db.go deleted file mode 100644 index 43bfa24f05c0..000000000000 --- a/swarm/storage/mock/db/db.go +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package db implements a mock store that keeps all chunk data in LevelDB database. -package db - -import ( - "archive/tar" - "bytes" - "encoding/json" - "io" - "io/ioutil" - - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/util" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/mock" -) - -// GlobalStore contains the LevelDB database that is storing -// chunk data for all swarm nodes. -// Closing the GlobalStore with Close method is required to -// release resources used by the database. -type GlobalStore struct { - db *leveldb.DB -} - -// NewGlobalStore creates a new instance of GlobalStore. -func NewGlobalStore(path string) (s *GlobalStore, err error) { - db, err := leveldb.OpenFile(path, nil) - if err != nil { - return nil, err - } - return &GlobalStore{ - db: db, - }, nil -} - -// Close releases the resources used by the underlying LevelDB. -func (s *GlobalStore) Close() error { - return s.db.Close() -} - -// NewNodeStore returns a new instance of NodeStore that retrieves and stores -// chunk data only for a node with address addr. -func (s *GlobalStore) NewNodeStore(addr common.Address) *mock.NodeStore { - return mock.NewNodeStore(addr, s) -} - -// Get returns chunk data if the chunk with key exists for node -// on address addr. -func (s *GlobalStore) Get(addr common.Address, key []byte) (data []byte, err error) { - has, err := s.db.Has(nodeDBKey(addr, key), nil) - if err != nil { - return nil, mock.ErrNotFound - } - if !has { - return nil, mock.ErrNotFound - } - data, err = s.db.Get(dataDBKey(key), nil) - if err == leveldb.ErrNotFound { - err = mock.ErrNotFound - } - return -} - -// Put saves the chunk data for node with address addr. -func (s *GlobalStore) Put(addr common.Address, key []byte, data []byte) error { - batch := new(leveldb.Batch) - batch.Put(nodeDBKey(addr, key), nil) - batch.Put(dataDBKey(key), data) - return s.db.Write(batch, nil) -} - -// HasKey returns whether a node with addr contains the key. -func (s *GlobalStore) HasKey(addr common.Address, key []byte) bool { - has, err := s.db.Has(nodeDBKey(addr, key), nil) - if err != nil { - has = false - } - return has -} - -// Import reads tar archive from a reader that contains exported chunk data. -// It returns the number of chunks imported and an error. -func (s *GlobalStore) Import(r io.Reader) (n int, err error) { - tr := tar.NewReader(r) - - for { - hdr, err := tr.Next() - if err != nil { - if err == io.EOF { - break - } - return n, err - } - - data, err := ioutil.ReadAll(tr) - if err != nil { - return n, err - } - - var c mock.ExportedChunk - if err = json.Unmarshal(data, &c); err != nil { - return n, err - } - - batch := new(leveldb.Batch) - for _, addr := range c.Addrs { - batch.Put(nodeDBKeyHex(addr, hdr.Name), nil) - } - - batch.Put(dataDBKey(common.Hex2Bytes(hdr.Name)), c.Data) - if err = s.db.Write(batch, nil); err != nil { - return n, err - } - - n++ - } - return n, err -} - -// Export writes to a writer a tar archive with all chunk data from -// the store. It returns the number fo chunks exported and an error. -func (s *GlobalStore) Export(w io.Writer) (n int, err error) { - tw := tar.NewWriter(w) - defer tw.Close() - - buf := bytes.NewBuffer(make([]byte, 0, 1024)) - encoder := json.NewEncoder(buf) - - iter := s.db.NewIterator(util.BytesPrefix(nodeKeyPrefix), nil) - defer iter.Release() - - var currentKey string - var addrs []common.Address - - saveChunk := func(hexKey string) error { - key := common.Hex2Bytes(hexKey) - - data, err := s.db.Get(dataDBKey(key), nil) - if err != nil { - return err - } - - buf.Reset() - if err = encoder.Encode(mock.ExportedChunk{ - Addrs: addrs, - Data: data, - }); err != nil { - return err - } - - d := buf.Bytes() - hdr := &tar.Header{ - Name: hexKey, - Mode: 0644, - Size: int64(len(d)), - } - if err := tw.WriteHeader(hdr); err != nil { - return err - } - if _, err := tw.Write(d); err != nil { - return err - } - n++ - return nil - } - - for iter.Next() { - k := bytes.TrimPrefix(iter.Key(), nodeKeyPrefix) - i := bytes.Index(k, []byte("-")) - if i < 0 { - continue - } - hexKey := string(k[:i]) - - if currentKey == "" { - currentKey = hexKey - } - - if hexKey != currentKey { - if err = saveChunk(currentKey); err != nil { - return n, err - } - - addrs = addrs[:0] - } - - currentKey = hexKey - addrs = append(addrs, common.BytesToAddress(k[i:])) - } - - if len(addrs) > 0 { - if err = saveChunk(currentKey); err != nil { - return n, err - } - } - - return n, err -} - -var ( - nodeKeyPrefix = []byte("node-") - dataKeyPrefix = []byte("data-") -) - -// nodeDBKey constructs a database key for key/node mappings. -func nodeDBKey(addr common.Address, key []byte) []byte { - return nodeDBKeyHex(addr, common.Bytes2Hex(key)) -} - -// nodeDBKeyHex constructs a database key for key/node mappings -// using the hexadecimal string representation of the key. -func nodeDBKeyHex(addr common.Address, hexKey string) []byte { - return append(append(nodeKeyPrefix, []byte(hexKey+"-")...), addr[:]...) -} - -// dataDBkey constructs a database key for key/data storage. -func dataDBKey(key []byte) []byte { - return append(dataKeyPrefix, key...) -} diff --git a/swarm/storage/mock/db/db_test.go b/swarm/storage/mock/db/db_test.go deleted file mode 100644 index 782faaf35c86..000000000000 --- a/swarm/storage/mock/db/db_test.go +++ /dev/null @@ -1,75 +0,0 @@ -// +build go1.8 -// -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package db - -import ( - "io/ioutil" - "os" - "testing" - - "github.com/ethereum/go-ethereum/swarm/storage/mock/test" -) - -// TestDBStore is running a test.MockStore tests -// using test.MockStore function. -func TestDBStore(t *testing.T) { - dir, err := ioutil.TempDir("", "mock_"+t.Name()) - if err != nil { - panic(err) - } - defer os.RemoveAll(dir) - - store, err := NewGlobalStore(dir) - if err != nil { - t.Fatal(err) - } - defer store.Close() - - test.MockStore(t, store, 100) -} - -// TestImportExport is running a test.ImportExport tests -// using test.MockStore function. -func TestImportExport(t *testing.T) { - dir1, err := ioutil.TempDir("", "mock_"+t.Name()+"_exporter") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir1) - - store1, err := NewGlobalStore(dir1) - if err != nil { - t.Fatal(err) - } - defer store1.Close() - - dir2, err := ioutil.TempDir("", "mock_"+t.Name()+"_importer") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir2) - - store2, err := NewGlobalStore(dir2) - if err != nil { - t.Fatal(err) - } - defer store2.Close() - - test.ImportExport(t, store1, store2, 100) -} diff --git a/swarm/storage/mock/mem/mem.go b/swarm/storage/mock/mem/mem.go deleted file mode 100644 index 8878309d0e7d..000000000000 --- a/swarm/storage/mock/mem/mem.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package mem implements a mock store that keeps all chunk data in memory. -// While it can be used for testing on smaller scales, the main purpose of this -// package is to provide the simplest reference implementation of a mock store. -package mem - -import ( - "archive/tar" - "bytes" - "encoding/json" - "io" - "io/ioutil" - "sync" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/mock" -) - -// GlobalStore stores all chunk data and also keys and node addresses relations. -// It implements mock.GlobalStore interface. -type GlobalStore struct { - nodes map[string]map[common.Address]struct{} - data map[string][]byte - mu sync.Mutex -} - -// NewGlobalStore creates a new instance of GlobalStore. -func NewGlobalStore() *GlobalStore { - return &GlobalStore{ - nodes: make(map[string]map[common.Address]struct{}), - data: make(map[string][]byte), - } -} - -// NewNodeStore returns a new instance of NodeStore that retrieves and stores -// chunk data only for a node with address addr. -func (s *GlobalStore) NewNodeStore(addr common.Address) *mock.NodeStore { - return mock.NewNodeStore(addr, s) -} - -// Get returns chunk data if the chunk with key exists for node -// on address addr. -func (s *GlobalStore) Get(addr common.Address, key []byte) (data []byte, err error) { - s.mu.Lock() - defer s.mu.Unlock() - - if _, ok := s.nodes[string(key)][addr]; !ok { - return nil, mock.ErrNotFound - } - - data, ok := s.data[string(key)] - if !ok { - return nil, mock.ErrNotFound - } - return data, nil -} - -// Put saves the chunk data for node with address addr. -func (s *GlobalStore) Put(addr common.Address, key []byte, data []byte) error { - s.mu.Lock() - defer s.mu.Unlock() - - if _, ok := s.nodes[string(key)]; !ok { - s.nodes[string(key)] = make(map[common.Address]struct{}) - } - s.nodes[string(key)][addr] = struct{}{} - s.data[string(key)] = data - return nil -} - -// HasKey returns whether a node with addr contains the key. -func (s *GlobalStore) HasKey(addr common.Address, key []byte) bool { - s.mu.Lock() - defer s.mu.Unlock() - - _, ok := s.nodes[string(key)][addr] - return ok -} - -// Import reads tar archive from a reader that contains exported chunk data. -// It returns the number of chunks imported and an error. -func (s *GlobalStore) Import(r io.Reader) (n int, err error) { - s.mu.Lock() - defer s.mu.Unlock() - - tr := tar.NewReader(r) - - for { - hdr, err := tr.Next() - if err != nil { - if err == io.EOF { - break - } - return n, err - } - - data, err := ioutil.ReadAll(tr) - if err != nil { - return n, err - } - - var c mock.ExportedChunk - if err = json.Unmarshal(data, &c); err != nil { - return n, err - } - - addrs := make(map[common.Address]struct{}) - for _, a := range c.Addrs { - addrs[a] = struct{}{} - } - - key := string(common.Hex2Bytes(hdr.Name)) - s.nodes[key] = addrs - s.data[key] = c.Data - n++ - } - return n, err -} - -// Export writes to a writer a tar archive with all chunk data from -// the store. It returns the number of chunks exported and an error. -func (s *GlobalStore) Export(w io.Writer) (n int, err error) { - s.mu.Lock() - defer s.mu.Unlock() - - tw := tar.NewWriter(w) - defer tw.Close() - - buf := bytes.NewBuffer(make([]byte, 0, 1024)) - encoder := json.NewEncoder(buf) - for key, addrs := range s.nodes { - al := make([]common.Address, 0, len(addrs)) - for a := range addrs { - al = append(al, a) - } - - buf.Reset() - if err = encoder.Encode(mock.ExportedChunk{ - Addrs: al, - Data: s.data[key], - }); err != nil { - return n, err - } - - data := buf.Bytes() - hdr := &tar.Header{ - Name: common.Bytes2Hex([]byte(key)), - Mode: 0644, - Size: int64(len(data)), - } - if err := tw.WriteHeader(hdr); err != nil { - return n, err - } - if _, err := tw.Write(data); err != nil { - return n, err - } - n++ - } - return n, err -} diff --git a/swarm/storage/mock/mem/mem_test.go b/swarm/storage/mock/mem/mem_test.go deleted file mode 100644 index adcefaabb41d..000000000000 --- a/swarm/storage/mock/mem/mem_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mem - -import ( - "testing" - - "github.com/ethereum/go-ethereum/swarm/storage/mock/test" -) - -// TestGlobalStore is running test for a GlobalStore -// using test.MockStore function. -func TestGlobalStore(t *testing.T) { - test.MockStore(t, NewGlobalStore(), 100) -} - -// TestImportExport is running tests for importing and -// exporting data between two GlobalStores -// using test.ImportExport function. -func TestImportExport(t *testing.T) { - test.ImportExport(t, NewGlobalStore(), NewGlobalStore(), 100) -} diff --git a/swarm/storage/mock/mock.go b/swarm/storage/mock/mock.go deleted file mode 100644 index 81340f927473..000000000000 --- a/swarm/storage/mock/mock.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package mock defines types that are used by different implementations -// of mock storages. -// -// Implementations of mock storages are located in directories -// under this package: -// -// - db - LevelDB backend -// - mem - in memory map backend -// - rpc - RPC client that can connect to other backends -// -// Mock storages can implement Importer and Exporter interfaces -// for importing and exporting all chunk data that they contain. -// The exported file is a tar archive with all files named by -// hexadecimal representations of chunk keys and with content -// with JSON-encoded ExportedChunk structure. Exported format -// should be preserved across all mock store implementations. -package mock - -import ( - "errors" - "io" - - "github.com/ethereum/go-ethereum/common" -) - -// ErrNotFound indicates that the chunk is not found. -var ErrNotFound = errors.New("not found") - -// NodeStore holds the node address and a reference to the GlobalStore -// in order to access and store chunk data only for one node. -type NodeStore struct { - store GlobalStorer - addr common.Address -} - -// NewNodeStore creates a new instance of NodeStore that keeps -// chunk data using GlobalStorer with a provided address. -func NewNodeStore(addr common.Address, store GlobalStorer) *NodeStore { - return &NodeStore{ - store: store, - addr: addr, - } -} - -// Get returns chunk data for a key for a node that has the address -// provided on NodeStore initialization. -func (n *NodeStore) Get(key []byte) (data []byte, err error) { - return n.store.Get(n.addr, key) -} - -// Put saves chunk data for a key for a node that has the address -// provided on NodeStore initialization. -func (n *NodeStore) Put(key []byte, data []byte) error { - return n.store.Put(n.addr, key, data) -} - -// GlobalStorer defines methods for mock db store -// that stores chunk data for all swarm nodes. -// It is used in tests to construct mock NodeStores -// for swarm nodes and to track and validate chunks. -type GlobalStorer interface { - Get(addr common.Address, key []byte) (data []byte, err error) - Put(addr common.Address, key []byte, data []byte) error - HasKey(addr common.Address, key []byte) bool - // NewNodeStore creates an instance of NodeStore - // to be used by a single swarm node with - // address addr. - NewNodeStore(addr common.Address) *NodeStore -} - -// Importer defines method for importing mock store data -// from an exported tar archive. -type Importer interface { - Import(r io.Reader) (n int, err error) -} - -// Exporter defines method for exporting mock store data -// to a tar archive. -type Exporter interface { - Export(w io.Writer) (n int, err error) -} - -// ImportExporter is an interface for importing and exporting -// mock store data to and from a tar archive. -type ImportExporter interface { - Importer - Exporter -} - -// ExportedChunk is the structure that is saved in tar archive for -// each chunk as JSON-encoded bytes. -type ExportedChunk struct { - Data []byte `json:"d"` - Addrs []common.Address `json:"a"` -} diff --git a/swarm/storage/mock/rpc/rpc.go b/swarm/storage/mock/rpc/rpc.go deleted file mode 100644 index 6e735f698843..000000000000 --- a/swarm/storage/mock/rpc/rpc.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package rpc implements an RPC client that connect to a centralized mock store. -// Centralazied mock store can be any other mock store implementation that is -// registered to Ethereum RPC server under mockStore name. Methods that defines -// mock.GlobalStore are the same that are used by RPC. Example: -// -// server := rpc.NewServer() -// server.RegisterName("mockStore", mem.NewGlobalStore()) -package rpc - -import ( - "fmt" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage/mock" -) - -// GlobalStore is rpc.Client that connects to a centralized mock store. -// Closing GlobalStore instance is required to release RPC client resources. -type GlobalStore struct { - client *rpc.Client -} - -// NewGlobalStore creates a new instance of GlobalStore. -func NewGlobalStore(client *rpc.Client) *GlobalStore { - return &GlobalStore{ - client: client, - } -} - -// Close closes RPC client. -func (s *GlobalStore) Close() error { - s.client.Close() - return nil -} - -// NewNodeStore returns a new instance of NodeStore that retrieves and stores -// chunk data only for a node with address addr. -func (s *GlobalStore) NewNodeStore(addr common.Address) *mock.NodeStore { - return mock.NewNodeStore(addr, s) -} - -// Get calls a Get method to RPC server. -func (s *GlobalStore) Get(addr common.Address, key []byte) (data []byte, err error) { - err = s.client.Call(&data, "mockStore_get", addr, key) - if err != nil && err.Error() == "not found" { - // pass the mock package value of error instead an rpc error - return data, mock.ErrNotFound - } - return data, err -} - -// Put calls a Put method to RPC server. -func (s *GlobalStore) Put(addr common.Address, key []byte, data []byte) error { - err := s.client.Call(nil, "mockStore_put", addr, key, data) - return err -} - -// HasKey calls a HasKey method to RPC server. -func (s *GlobalStore) HasKey(addr common.Address, key []byte) bool { - var has bool - if err := s.client.Call(&has, "mockStore_hasKey", addr, key); err != nil { - log.Error(fmt.Sprintf("mock store HasKey: addr %s, key %064x: %v", addr, key, err)) - return false - } - return has -} diff --git a/swarm/storage/mock/rpc/rpc_test.go b/swarm/storage/mock/rpc/rpc_test.go deleted file mode 100644 index 52b634a44512..000000000000 --- a/swarm/storage/mock/rpc/rpc_test.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package rpc - -import ( - "testing" - - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/storage/mock/mem" - "github.com/ethereum/go-ethereum/swarm/storage/mock/test" -) - -// TestDBStore is running test for a GlobalStore -// using test.MockStore function. -func TestRPCStore(t *testing.T) { - serverStore := mem.NewGlobalStore() - - server := rpc.NewServer() - if err := server.RegisterName("mockStore", serverStore); err != nil { - t.Fatal(err) - } - - store := NewGlobalStore(rpc.DialInProc(server)) - defer store.Close() - - test.MockStore(t, store, 100) -} diff --git a/swarm/storage/mock/test/test.go b/swarm/storage/mock/test/test.go deleted file mode 100644 index 02da3af553f1..000000000000 --- a/swarm/storage/mock/test/test.go +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package test provides functions that are used for testing -// GlobalStorer implementations. -package test - -import ( - "bytes" - "fmt" - "io" - "strconv" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mock" -) - -// MockStore creates NodeStore instances from provided GlobalStorer, -// each one with a unique address, stores different chunks on them -// and checks if they are retrievable or not on all nodes. -// Attribute n defines the number of NodeStores that will be created. -func MockStore(t *testing.T, globalStore mock.GlobalStorer, n int) { - t.Run("GlobalStore", func(t *testing.T) { - addrs := make([]common.Address, n) - for i := 0; i < n; i++ { - addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) - } - - for i, addr := range addrs { - chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) - data := []byte(strconv.FormatInt(int64(i)+1, 16)) - data = append(data, make([]byte, 4096-len(data))...) - globalStore.Put(addr, chunkAddr, data) - - for _, cAddr := range addrs { - cData, err := globalStore.Get(cAddr, chunkAddr) - if cAddr == addr { - if err != nil { - t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) - } - if !bytes.Equal(data, cData) { - t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) - } - if !globalStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) - } - } else { - if err != mock.ErrNotFound { - t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) - } - if len(cData) > 0 { - t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) - } - if globalStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) - } - } - } - } - }) - - t.Run("NodeStore", func(t *testing.T) { - nodes := make(map[common.Address]*mock.NodeStore) - for i := 0; i < n; i++ { - addr := common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) - nodes[addr] = globalStore.NewNodeStore(addr) - } - - i := 0 - for addr, store := range nodes { - i++ - chunkAddr := storage.Address(append(addr[:], []byte(fmt.Sprintf("%x", i))...)) - data := []byte(strconv.FormatInt(int64(i)+1, 16)) - data = append(data, make([]byte, 4096-len(data))...) - store.Put(chunkAddr, data) - - for cAddr, cStore := range nodes { - cData, err := cStore.Get(chunkAddr) - if cAddr == addr { - if err != nil { - t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) - } - if !bytes.Equal(data, cData) { - t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) - } - if !globalStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) - } - } else { - if err != mock.ErrNotFound { - t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) - } - if len(cData) > 0 { - t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) - } - if globalStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) - } - } - } - } - }) -} - -// ImportExport saves chunks to the outStore, exports them to the tar archive, -// imports tar archive to the inStore and checks if all chunks are imported correctly. -func ImportExport(t *testing.T, outStore, inStore mock.GlobalStorer, n int) { - exporter, ok := outStore.(mock.Exporter) - if !ok { - t.Fatal("outStore does not implement mock.Exporter") - } - importer, ok := inStore.(mock.Importer) - if !ok { - t.Fatal("inStore does not implement mock.Importer") - } - addrs := make([]common.Address, n) - for i := 0; i < n; i++ { - addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) - } - - for i, addr := range addrs { - chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) - data := []byte(strconv.FormatInt(int64(i)+1, 16)) - data = append(data, make([]byte, 4096-len(data))...) - outStore.Put(addr, chunkAddr, data) - } - - r, w := io.Pipe() - defer r.Close() - - go func() { - defer w.Close() - if _, err := exporter.Export(w); err != nil { - t.Fatalf("export: %v", err) - } - }() - - if _, err := importer.Import(r); err != nil { - t.Fatalf("import: %v", err) - } - - for i, addr := range addrs { - chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) - data := []byte(strconv.FormatInt(int64(i)+1, 16)) - data = append(data, make([]byte, 4096-len(data))...) - for _, cAddr := range addrs { - cData, err := inStore.Get(cAddr, chunkAddr) - if cAddr == addr { - if err != nil { - t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) - } - if !bytes.Equal(data, cData) { - t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) - } - if !inStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) - } - } else { - if err != mock.ErrNotFound { - t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) - } - if len(cData) > 0 { - t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) - } - if inStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) - } - } - } - } -} diff --git a/swarm/storage/mru/binaryserializer.go b/swarm/storage/mru/binaryserializer.go deleted file mode 100644 index 3123a82eea81..000000000000 --- a/swarm/storage/mru/binaryserializer.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import "github.com/ethereum/go-ethereum/common/hexutil" - -type binarySerializer interface { - binaryPut(serializedData []byte) error - binaryLength() int - binaryGet(serializedData []byte) error -} - -// Values interface represents a string key-value store -// useful for building query strings -type Values interface { - Get(key string) string - Set(key, value string) -} - -type valueSerializer interface { - FromValues(values Values) error - AppendValues(values Values) -} - -// Hex serializes the structure and converts it to a hex string -func Hex(bin binarySerializer) string { - b := make([]byte, bin.binaryLength()) - bin.binaryPut(b) - return hexutil.Encode(b) -} diff --git a/swarm/storage/mru/binaryserializer_test.go b/swarm/storage/mru/binaryserializer_test.go deleted file mode 100644 index f524157d611b..000000000000 --- a/swarm/storage/mru/binaryserializer_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "encoding/json" - "reflect" - "testing" - - "github.com/ethereum/go-ethereum/common/hexutil" -) - -// KV mocks a key value store -type KV map[string]string - -func (kv KV) Get(key string) string { - return kv[key] -} -func (kv KV) Set(key, value string) { - kv[key] = value -} - -func compareByteSliceToExpectedHex(t *testing.T, variableName string, actualValue []byte, expectedHex string) { - if hexutil.Encode(actualValue) != expectedHex { - t.Fatalf("%s: Expected %s to be %s, got %s", t.Name(), variableName, expectedHex, hexutil.Encode(actualValue)) - } -} - -func testBinarySerializerRecovery(t *testing.T, bin binarySerializer, expectedHex string) { - name := reflect.TypeOf(bin).Elem().Name() - serialized := make([]byte, bin.binaryLength()) - if err := bin.binaryPut(serialized); err != nil { - t.Fatalf("%s.binaryPut error when trying to serialize structure: %s", name, err) - } - - compareByteSliceToExpectedHex(t, name, serialized, expectedHex) - - recovered := reflect.New(reflect.TypeOf(bin).Elem()).Interface().(binarySerializer) - if err := recovered.binaryGet(serialized); err != nil { - t.Fatalf("%s.binaryGet error when trying to deserialize structure: %s", name, err) - } - - if !reflect.DeepEqual(bin, recovered) { - t.Fatalf("Expected that the recovered %s equals the marshalled %s", name, name) - } - - serializedWrongLength := make([]byte, 1) - copy(serializedWrongLength[:], serialized) - if err := recovered.binaryGet(serializedWrongLength); err == nil { - t.Fatalf("Expected %s.binaryGet to fail since data is too small", name) - } -} - -func testBinarySerializerLengthCheck(t *testing.T, bin binarySerializer) { - name := reflect.TypeOf(bin).Elem().Name() - // make a slice that is too small to contain the metadata - serialized := make([]byte, bin.binaryLength()-1) - - if err := bin.binaryPut(serialized); err == nil { - t.Fatalf("Expected %s.binaryPut to fail, since target slice is too small", name) - } -} - -func testValueSerializer(t *testing.T, v valueSerializer, expected KV) { - name := reflect.TypeOf(v).Elem().Name() - kv := make(KV) - - v.AppendValues(kv) - if !reflect.DeepEqual(expected, kv) { - expj, _ := json.Marshal(expected) - gotj, _ := json.Marshal(kv) - t.Fatalf("Expected %s.AppendValues to return %s, got %s", name, string(expj), string(gotj)) - } - - recovered := reflect.New(reflect.TypeOf(v).Elem()).Interface().(valueSerializer) - err := recovered.FromValues(kv) - if err != nil { - t.Fatal(err) - } - - if !reflect.DeepEqual(recovered, v) { - t.Fatalf("Expected recovered %s to be the same", name) - } -} diff --git a/swarm/storage/mru/cacheentry.go b/swarm/storage/mru/cacheentry.go deleted file mode 100644 index 280331f77f34..000000000000 --- a/swarm/storage/mru/cacheentry.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "bytes" - "context" - "time" - - "github.com/ethereum/go-ethereum/swarm/storage" -) - -const ( - hasherCount = 8 - resourceHashAlgorithm = storage.SHA3Hash - defaultRetrieveTimeout = 100 * time.Millisecond -) - -// cacheEntry caches resource data and the metadata of its root chunk. -type cacheEntry struct { - ResourceUpdate - *bytes.Reader - lastKey storage.Address -} - -// implements storage.LazySectionReader -func (r *cacheEntry) Size(ctx context.Context, _ chan bool) (int64, error) { - return int64(len(r.ResourceUpdate.data)), nil -} - -//returns the resource's topic -func (r *cacheEntry) Topic() Topic { - return r.View.Topic -} diff --git a/swarm/storage/mru/doc.go b/swarm/storage/mru/doc.go deleted file mode 100644 index 19330e0c1ae1..000000000000 --- a/swarm/storage/mru/doc.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -Package mru defines Mutable resource updates. - -A Mutable Resource is an entity which allows updates to a resource -without resorting to ENS on each update. -The update scheme is built on swarm chunks with chunk keys following -a predictable, versionable pattern. - -A Resource is tied to a unique identifier that is deterministically generated out of -the chosen topic. - -A Resource View is defined as a specific user's point of view about a particular resource. -Thus, a View is a Topic + the user's address (userAddr) - -Actual data updates are also made in the form of swarm chunks. The keys -of the updates are the hash of a concatenation of properties as follows: - -updateAddr = H(View, Epoch ID) -where H is the SHA3 hash function -View is the combination of Topic and the user address -Epoch ID is a time slot. See the lookup package for more information. - -A user looking up a resource would only need to know the View in order to -another user's updates - -The resource update data is: -resourcedata = View|Epoch|data - -the full update data that goes in the chunk payload is: -resourcedata|sign(resourcedata) - -Structure Summary: - -Request: Resource update with signature - ResourceUpdate: headers + data - Header: Protocol version and reserved for future use placeholders - ID: Information about how to locate a specific update - View: Author of the update and what is updating - Topic: Item that the updates are about - User: User who updates the resource - Epoch: time slot where the update is stored - -*/ -package mru diff --git a/swarm/storage/mru/error.go b/swarm/storage/mru/error.go deleted file mode 100644 index 18ab52558259..000000000000 --- a/swarm/storage/mru/error.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "fmt" -) - -const ( - ErrInit = iota - ErrNotFound - ErrIO - ErrUnauthorized - ErrInvalidValue - ErrDataOverflow - ErrNothingToReturn - ErrCorruptData - ErrInvalidSignature - ErrNotSynced - ErrPeriodDepth - ErrCnt -) - -// Error is a the typed error object used for Mutable Resources -type Error struct { - code int - err string -} - -// Error implements the error interface -func (e *Error) Error() string { - return e.err -} - -// Code returns the error code -// Error codes are enumerated in the error.go file within the mru package -func (e *Error) Code() int { - return e.code -} - -// NewError creates a new Mutable Resource Error object with the specified code and custom error message -func NewError(code int, s string) error { - if code < 0 || code >= ErrCnt { - panic("no such error code!") - } - r := &Error{ - err: s, - } - switch code { - case ErrNotFound, ErrIO, ErrUnauthorized, ErrInvalidValue, ErrDataOverflow, ErrNothingToReturn, ErrInvalidSignature, ErrNotSynced, ErrPeriodDepth, ErrCorruptData: - r.code = code - } - return r -} - -// NewErrorf is a convenience version of NewError that incorporates printf-style formatting -func NewErrorf(code int, format string, args ...interface{}) error { - return NewError(code, fmt.Sprintf(format, args...)) -} diff --git a/swarm/storage/mru/handler.go b/swarm/storage/mru/handler.go deleted file mode 100644 index 3e76547953da..000000000000 --- a/swarm/storage/mru/handler.go +++ /dev/null @@ -1,298 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Handler is the API for Mutable Resources -// It enables creating, updating, syncing and retrieving resources and their update data -package mru - -import ( - "bytes" - "context" - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" - - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -type Handler struct { - chunkStore *storage.NetStore - HashSize int - resources map[uint64]*cacheEntry - resourceLock sync.RWMutex - storeTimeout time.Duration - queryMaxPeriods uint32 -} - -// HandlerParams pass parameters to the Handler constructor NewHandler -// Signer and TimestampProvider are mandatory parameters -type HandlerParams struct { -} - -// hashPool contains a pool of ready hashers -var hashPool sync.Pool - -// init initializes the package and hashPool -func init() { - hashPool = sync.Pool{ - New: func() interface{} { - return storage.MakeHashFunc(resourceHashAlgorithm)() - }, - } -} - -// NewHandler creates a new Mutable Resource API -func NewHandler(params *HandlerParams) *Handler { - rh := &Handler{ - resources: make(map[uint64]*cacheEntry), - } - - for i := 0; i < hasherCount; i++ { - hashfunc := storage.MakeHashFunc(resourceHashAlgorithm)() - if rh.HashSize == 0 { - rh.HashSize = hashfunc.Size() - } - hashPool.Put(hashfunc) - } - - return rh -} - -// SetStore sets the store backend for the Mutable Resource API -func (h *Handler) SetStore(store *storage.NetStore) { - h.chunkStore = store -} - -// Validate is a chunk validation method -// If it looks like a resource update, the chunk address is checked against the userAddr of the update's signature -// It implements the storage.ChunkValidator interface -func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { - dataLength := len(data) - if dataLength < minimumSignedUpdateLength { - return false - } - - // check if it is a properly formatted update chunk with - // valid signature and proof of ownership of the resource it is trying - // to update - - // First, deserialize the chunk - var r Request - if err := r.fromChunk(chunkAddr, data); err != nil { - log.Debug("Invalid resource chunk", "addr", chunkAddr.Hex(), "err", err.Error()) - return false - } - - // Verify signatures and that the signer actually owns the resource - // If it fails, it means either the signature is not valid, data is corrupted - // or someone is trying to update someone else's resource. - if err := r.Verify(); err != nil { - log.Debug("Invalid signature", "err", err) - return false - } - - return true -} - -// GetContent retrieves the data payload of the last synced update of the Mutable Resource -func (h *Handler) GetContent(view *View) (storage.Address, []byte, error) { - if view == nil { - return nil, nil, NewError(ErrInvalidValue, "view is nil") - } - rsrc := h.get(view) - if rsrc == nil { - return nil, nil, NewError(ErrNotFound, "resource does not exist") - } - return rsrc.lastKey, rsrc.data, nil -} - -// NewRequest prepares a Request structure with all the necessary information to -// just add the desired data and sign it. -// The resulting structure can then be signed and passed to Handler.Update to be verified and sent -func (h *Handler) NewRequest(ctx context.Context, view *View) (request *Request, err error) { - if view == nil { - return nil, NewError(ErrInvalidValue, "view cannot be nil") - } - - now := TimestampProvider.Now().Time - request = new(Request) - request.Header.Version = ProtocolVersion - - query := NewQueryLatest(view, lookup.NoClue) - - rsrc, err := h.Lookup(ctx, query) - if err != nil { - if err.(*Error).code != ErrNotFound { - return nil, err - } - // not finding updates means that there is a network error - // or that the resource really does not have updates - } - - request.View = *view - - // if we already have an update, then find next epoch - if rsrc != nil { - request.Epoch = lookup.GetNextEpoch(rsrc.Epoch, now) - } else { - request.Epoch = lookup.GetFirstEpoch(now) - } - - return request, nil -} - -// Lookup retrieves a specific or latest version of the resource -// Lookup works differently depending on the configuration of `ID` -// See the `ID` documentation and helper functions: -// `LookupLatest` and `LookupBefore` -// When looking for the latest update, it starts at the next period after the current time. -// upon failure tries the corresponding keys of each previous period until one is found -// (or startTime is reached, in which case there are no updates). -func (h *Handler) Lookup(ctx context.Context, query *Query) (*cacheEntry, error) { - - timeLimit := query.TimeLimit - if timeLimit == 0 { // if time limit is set to zero, the user wants to get the latest update - timeLimit = TimestampProvider.Now().Time - } - - if query.Hint == lookup.NoClue { // try to use our cache - entry := h.get(&query.View) - if entry != nil && entry.Epoch.Time <= timeLimit { // avoid bad hints - query.Hint = entry.Epoch - } - } - - // we can't look for anything without a store - if h.chunkStore == nil { - return nil, NewError(ErrInit, "Call Handler.SetStore() before performing lookups") - } - - var ul ID - ul.View = query.View - var readCount int - - // Invoke the lookup engine. - // The callback will be called every time the lookup algorithm needs to guess - requestPtr, err := lookup.Lookup(timeLimit, query.Hint, func(epoch lookup.Epoch, now uint64) (interface{}, error) { - readCount++ - ul.Epoch = epoch - ctx, cancel := context.WithTimeout(ctx, defaultRetrieveTimeout) - defer cancel() - - chunk, err := h.chunkStore.Get(ctx, ul.Addr()) - if err != nil { // TODO: check for catastrophic errors other than chunk not found - return nil, nil - } - - var request Request - if err := request.fromChunk(chunk.Address(), chunk.Data()); err != nil { - return nil, nil - } - if request.Time <= timeLimit { - return &request, nil - } - return nil, nil - }) - if err != nil { - return nil, err - } - - log.Info(fmt.Sprintf("Resource lookup finished in %d lookups", readCount)) - - request, _ := requestPtr.(*Request) - if request == nil { - return nil, NewError(ErrNotFound, "no updates found") - } - return h.updateCache(request) - -} - -// update mutable resource cache map with specified content -func (h *Handler) updateCache(request *Request) (*cacheEntry, error) { - - updateAddr := request.Addr() - log.Trace("resource cache update", "topic", request.Topic.Hex(), "updatekey", updateAddr, "epoch time", request.Epoch.Time, "epoch level", request.Epoch.Level) - - rsrc := h.get(&request.View) - if rsrc == nil { - rsrc = &cacheEntry{} - h.set(&request.View, rsrc) - } - - // update our rsrcs entry map - rsrc.lastKey = updateAddr - rsrc.ResourceUpdate = request.ResourceUpdate - rsrc.Reader = bytes.NewReader(rsrc.data) - return rsrc, nil -} - -// Update adds an actual data update -// Uses the Mutable Resource metadata currently loaded in the resources map entry. -// It is the caller's responsibility to make sure that this data is not stale. -// Note that a Mutable Resource update cannot span chunks, and thus has a MAX NET LENGTH 4096, INCLUDING update header data and signature. An error will be returned if the total length of the chunk payload will exceed this limit. -// Update can only check if the caller is trying to overwrite the very last known version, otherwise it just puts the update -// on the network. -func (h *Handler) Update(ctx context.Context, r *Request) (updateAddr storage.Address, err error) { - - // we can't update anything without a store - if h.chunkStore == nil { - return nil, NewError(ErrInit, "Call Handler.SetStore() before updating") - } - - rsrc := h.get(&r.View) - if rsrc != nil && rsrc.Epoch.Equals(r.Epoch) { // This is the only cheap check we can do for sure - return nil, NewError(ErrInvalidValue, "A former update in this epoch is already known to exist") - } - - chunk, err := r.toChunk() // Serialize the update into a chunk. Fails if data is too big - if err != nil { - return nil, err - } - - // send the chunk - h.chunkStore.Put(ctx, chunk) - log.Trace("resource update", "updateAddr", r.idAddr, "epoch time", r.Epoch.Time, "epoch level", r.Epoch.Level, "data", chunk.Data()) - // update our resources map cache entry if the new update is older than the one we have, if we have it. - if rsrc != nil && r.Epoch.After(rsrc.Epoch) { - rsrc.Epoch = r.Epoch - rsrc.data = make([]byte, len(r.data)) - rsrc.lastKey = r.idAddr - copy(rsrc.data, r.data) - rsrc.Reader = bytes.NewReader(rsrc.data) - } - - return r.idAddr, nil -} - -// Retrieves the resource cache value for the given nameHash -func (h *Handler) get(view *View) *cacheEntry { - mapKey := view.mapKey() - h.resourceLock.RLock() - defer h.resourceLock.RUnlock() - rsrc := h.resources[mapKey] - return rsrc -} - -// Sets the resource cache value for the given View -func (h *Handler) set(view *View, rsrc *cacheEntry) { - mapKey := view.mapKey() - h.resourceLock.Lock() - defer h.resourceLock.Unlock() - h.resources[mapKey] = rsrc -} diff --git a/swarm/storage/mru/handler_test.go b/swarm/storage/mru/handler_test.go deleted file mode 100644 index 13eb9e51b301..000000000000 --- a/swarm/storage/mru/handler_test.go +++ /dev/null @@ -1,520 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "bytes" - "context" - "flag" - "fmt" - "io/ioutil" - "os" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" -) - -var ( - loglevel = flag.Int("loglevel", 3, "loglevel") - startTime = Timestamp{ - Time: uint64(4200), - } - cleanF func() - resourceName = "føø.bar" - hashfunc = storage.MakeHashFunc(storage.DefaultHash) -) - -func init() { - flag.Parse() - log.Root().SetHandler(log.CallerFileHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true))))) -} - -// simulated timeProvider -type fakeTimeProvider struct { - currentTime uint64 -} - -func (f *fakeTimeProvider) Tick() { - f.currentTime++ -} - -func (f *fakeTimeProvider) Set(time uint64) { - f.currentTime = time -} - -func (f *fakeTimeProvider) FastForward(offset uint64) { - f.currentTime += offset -} - -func (f *fakeTimeProvider) Now() Timestamp { - return Timestamp{ - Time: f.currentTime, - } -} - -// make updates and retrieve them based on periods and versions -func TestResourceHandler(t *testing.T) { - - // make fake timeProvider - clock := &fakeTimeProvider{ - currentTime: startTime.Time, // clock starts at t=4200 - } - - // signer containing private key - signer := newAliceSigner() - - rh, datadir, teardownTest, err := setupTest(clock, signer) - if err != nil { - t.Fatal(err) - } - defer teardownTest() - - // create a new resource - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - topic, _ := NewTopic("Mess with mru code and see what ghost catches you", nil) - view := View{ - Topic: topic, - User: signer.Address(), - } - - // data for updates: - updates := []string{ - "blinky", // t=4200 - "pinky", // t=4242 - "inky", // t=4284 - "clyde", // t=4285 - } - - request := NewFirstRequest(view.Topic) // this timestamps the update at t = 4200 (start time) - resourcekey := make(map[string]storage.Address) - data := []byte(updates[0]) - request.SetData(data) - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - resourcekey[updates[0]], err = rh.Update(ctx, request) - if err != nil { - t.Fatal(err) - } - - // move the clock ahead 21 seconds - clock.FastForward(21) // t=4221 - - request, err = rh.NewRequest(ctx, &request.View) // this timestamps the update at t = 4221 - if err != nil { - t.Fatal(err) - } - if request.Epoch.Base() != 0 || request.Epoch.Level != lookup.HighestLevel-1 { - t.Fatalf("Suggested epoch BaseTime should be 0 and Epoch level should be %d", lookup.HighestLevel-1) - } - - request.Epoch.Level = lookup.HighestLevel // force level 25 instead of 24 to make it fail - data = []byte(updates[1]) - request.SetData(data) - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - resourcekey[updates[1]], err = rh.Update(ctx, request) - if err == nil { - t.Fatal("Expected update to fail since an update in this epoch already exists") - } - - // move the clock ahead 21 seconds - clock.FastForward(21) // t=4242 - request, err = rh.NewRequest(ctx, &request.View) - if err != nil { - t.Fatal(err) - } - request.SetData(data) - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - resourcekey[updates[1]], err = rh.Update(ctx, request) - if err != nil { - t.Fatal(err) - } - - // move the clock ahead 42 seconds - clock.FastForward(42) // t=4284 - request, err = rh.NewRequest(ctx, &request.View) - if err != nil { - t.Fatal(err) - } - data = []byte(updates[2]) - request.SetData(data) - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - resourcekey[updates[2]], err = rh.Update(ctx, request) - if err != nil { - t.Fatal(err) - } - - // move the clock ahead 1 second - clock.FastForward(1) // t=4285 - request, err = rh.NewRequest(ctx, &request.View) - if err != nil { - t.Fatal(err) - } - if request.Epoch.Base() != 0 || request.Epoch.Level != 22 { - t.Fatalf("Expected epoch base time to be %d, got %d. Expected epoch level to be %d, got %d", 0, request.Epoch.Base(), 22, request.Epoch.Level) - } - data = []byte(updates[3]) - request.SetData(data) - - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - resourcekey[updates[3]], err = rh.Update(ctx, request) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Second) - rh.Close() - - // check we can retrieve the updates after close - clock.FastForward(2000) // t=6285 - - rhparams := &HandlerParams{} - - rh2, err := NewTestHandler(datadir, rhparams) - if err != nil { - t.Fatal(err) - } - - rsrc2, err := rh2.Lookup(ctx, NewQueryLatest(&request.View, lookup.NoClue)) - if err != nil { - t.Fatal(err) - } - - // last update should be "clyde" - if !bytes.Equal(rsrc2.data, []byte(updates[len(updates)-1])) { - t.Fatalf("resource data was %v, expected %v", string(rsrc2.data), updates[len(updates)-1]) - } - if rsrc2.Level != 22 { - t.Fatalf("resource epoch level was %d, expected 22", rsrc2.Level) - } - if rsrc2.Base() != 0 { - t.Fatalf("resource epoch base time was %d, expected 0", rsrc2.Base()) - } - log.Debug("Latest lookup", "epoch base time", rsrc2.Base(), "epoch level", rsrc2.Level, "data", rsrc2.data) - - // specific point in time - rsrc, err := rh2.Lookup(ctx, NewQuery(&request.View, 4284, lookup.NoClue)) - if err != nil { - t.Fatal(err) - } - // check data - if !bytes.Equal(rsrc.data, []byte(updates[2])) { - t.Fatalf("resource data (historical) was %v, expected %v", string(rsrc2.data), updates[2]) - } - log.Debug("Historical lookup", "epoch base time", rsrc2.Base(), "epoch level", rsrc2.Level, "data", rsrc2.data) - - // beyond the first should yield an error - rsrc, err = rh2.Lookup(ctx, NewQuery(&request.View, startTime.Time-1, lookup.NoClue)) - if err == nil { - t.Fatalf("expected previous to fail, returned epoch %s data %v", rsrc.Epoch.String(), rsrc.data) - } - -} - -const Day = 60 * 60 * 24 -const Year = Day * 365 -const Month = Day * 30 - -func generateData(x uint64) []byte { - return []byte(fmt.Sprintf("%d", x)) -} - -func TestSparseUpdates(t *testing.T) { - - // make fake timeProvider - timeProvider := &fakeTimeProvider{ - currentTime: startTime.Time, - } - - // signer containing private key - signer := newAliceSigner() - - rh, datadir, teardownTest, err := setupTest(timeProvider, signer) - if err != nil { - t.Fatal(err) - } - defer teardownTest() - defer os.RemoveAll(datadir) - - // create a new resource - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - topic, _ := NewTopic("Very slow updates", nil) - view := View{ - Topic: topic, - User: signer.Address(), - } - - // publish one update every 5 years since Unix 0 until today - today := uint64(1533799046) - var epoch lookup.Epoch - var lastUpdateTime uint64 - for T := uint64(0); T < today; T += 5 * Year { - request := NewFirstRequest(view.Topic) - request.Epoch = lookup.GetNextEpoch(epoch, T) - request.data = generateData(T) // this generates some data that depends on T, so we can check later - request.Sign(signer) - if err != nil { - t.Fatal(err) - } - - if _, err := rh.Update(ctx, request); err != nil { - t.Fatal(err) - } - epoch = request.Epoch - lastUpdateTime = T - } - - query := NewQuery(&view, today, lookup.NoClue) - - _, err = rh.Lookup(ctx, query) - if err != nil { - t.Fatal(err) - } - - _, content, err := rh.GetContent(&view) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(generateData(lastUpdateTime), content) { - t.Fatalf("Expected to recover last written value %d, got %s", lastUpdateTime, string(content)) - } - - // lookup the closest update to 35*Year + 6* Month (~ June 2005): - // it should find the update we put on 35*Year, since we were updating every 5 years. - - query.TimeLimit = 35*Year + 6*Month - - _, err = rh.Lookup(ctx, query) - if err != nil { - t.Fatal(err) - } - - _, content, err = rh.GetContent(&view) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(generateData(35*Year), content) { - t.Fatalf("Expected to recover %d, got %s", 35*Year, string(content)) - } -} - -func TestValidator(t *testing.T) { - - // make fake timeProvider - timeProvider := &fakeTimeProvider{ - currentTime: startTime.Time, - } - - // signer containing private key. Alice will be the good girl - signer := newAliceSigner() - - // set up sim timeProvider - rh, _, teardownTest, err := setupTest(timeProvider, signer) - if err != nil { - t.Fatal(err) - } - defer teardownTest() - - // create new resource - topic, _ := NewTopic(resourceName, nil) - view := View{ - Topic: topic, - User: signer.Address(), - } - mr := NewFirstRequest(view.Topic) - - // chunk with address - data := []byte("foo") - mr.SetData(data) - if err := mr.Sign(signer); err != nil { - t.Fatalf("sign fail: %v", err) - } - - chunk, err := mr.toChunk() - if err != nil { - t.Fatal(err) - } - if !rh.Validate(chunk.Address(), chunk.Data()) { - t.Fatal("Chunk validator fail on update chunk") - } - - address := chunk.Address() - // mess with the address - address[0] = 11 - address[15] = 99 - - if rh.Validate(address, chunk.Data()) { - t.Fatal("Expected Validate to fail with false chunk address") - } -} - -// tests that the content address validator correctly checks the data -// tests that resource update chunks are passed through content address validator -// there is some redundancy in this test as it also tests content addressed chunks, -// which should be evaluated as invalid chunks by this validator -func TestValidatorInStore(t *testing.T) { - - // make fake timeProvider - TimestampProvider = &fakeTimeProvider{ - currentTime: startTime.Time, - } - - // signer containing private key - signer := newAliceSigner() - - // set up localstore - datadir, err := ioutil.TempDir("", "storage-testresourcevalidator") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(datadir) - - handlerParams := storage.NewDefaultLocalStoreParams() - handlerParams.Init(datadir) - store, err := storage.NewLocalStore(handlerParams, nil) - if err != nil { - t.Fatal(err) - } - - // set up resource handler and add is as a validator to the localstore - rhParams := &HandlerParams{} - rh := NewHandler(rhParams) - store.Validators = append(store.Validators, rh) - - // create content addressed chunks, one good, one faulty - chunks := storage.GenerateRandomChunks(chunk.DefaultSize, 2) - goodChunk := chunks[0] - badChunk := storage.NewChunk(chunks[1].Address(), goodChunk.Data()) - - topic, _ := NewTopic("xyzzy", nil) - view := View{ - Topic: topic, - User: signer.Address(), - } - - // create a resource update chunk with correct publickey - id := ID{ - Epoch: lookup.Epoch{Time: 42, - Level: 1, - }, - View: view, - } - - updateAddr := id.Addr() - data := []byte("bar") - - r := new(Request) - r.idAddr = updateAddr - r.ResourceUpdate.ID = id - r.data = data - - r.Sign(signer) - - uglyChunk, err := r.toChunk() - if err != nil { - t.Fatal(err) - } - - // put the chunks in the store and check their error status - err = store.Put(context.Background(), goodChunk) - if err == nil { - t.Fatal("expected error on good content address chunk with resource validator only, but got nil") - } - err = store.Put(context.Background(), badChunk) - if err == nil { - t.Fatal("expected error on bad content address chunk with resource validator only, but got nil") - } - err = store.Put(context.Background(), uglyChunk) - if err != nil { - t.Fatalf("expected no error on resource update chunk with resource validator only, but got: %s", err) - } -} - -// create rpc and resourcehandler -func setupTest(timeProvider timestampProvider, signer Signer) (rh *TestHandler, datadir string, teardown func(), err error) { - - var fsClean func() - var rpcClean func() - cleanF = func() { - if fsClean != nil { - fsClean() - } - if rpcClean != nil { - rpcClean() - } - } - - // temp datadir - datadir, err = ioutil.TempDir("", "rh") - if err != nil { - return nil, "", nil, err - } - fsClean = func() { - os.RemoveAll(datadir) - } - - TimestampProvider = timeProvider - rhparams := &HandlerParams{} - rh, err = NewTestHandler(datadir, rhparams) - return rh, datadir, cleanF, err -} - -func newAliceSigner() *GenericSigner { - privKey, _ := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") - return NewGenericSigner(privKey) -} - -func newBobSigner() *GenericSigner { - privKey, _ := crypto.HexToECDSA("accedeaccedeaccedeaccedeaccedeaccedeaccedeaccedeaccedeaccedecaca") - return NewGenericSigner(privKey) -} - -func newCharlieSigner() *GenericSigner { - privKey, _ := crypto.HexToECDSA("facadefacadefacadefacadefacadefacadefacadefacadefacadefacadefaca") - return NewGenericSigner(privKey) -} - -func getUpdateDirect(rh *Handler, addr storage.Address) ([]byte, error) { - chunk, err := rh.chunkStore.Get(context.TODO(), addr) - if err != nil { - return nil, err - } - var r Request - if err := r.fromChunk(addr, chunk.Data()); err != nil { - return nil, err - } - return r.data, nil -} diff --git a/swarm/storage/mru/id.go b/swarm/storage/mru/id.go deleted file mode 100644 index f008169ed677..000000000000 --- a/swarm/storage/mru/id.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "fmt" - "hash" - "strconv" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" - - "github.com/ethereum/go-ethereum/swarm/storage" -) - -// ID uniquely identifies an update on the network. -type ID struct { - View `json:"view"` - lookup.Epoch `json:"epoch"` -} - -// ID layout: -// View viewLength bytes -// Epoch EpochLength -const idLength = viewLength + lookup.EpochLength - -// Addr calculates the resource update chunk address corresponding to this ID -func (u *ID) Addr() (updateAddr storage.Address) { - serializedData := make([]byte, idLength) - var cursor int - u.View.binaryPut(serializedData[cursor : cursor+viewLength]) - cursor += viewLength - - eid := u.Epoch.ID() - copy(serializedData[cursor:cursor+lookup.EpochLength], eid[:]) - - hasher := hashPool.Get().(hash.Hash) - defer hashPool.Put(hasher) - hasher.Reset() - hasher.Write(serializedData) - return hasher.Sum(nil) -} - -// binaryPut serializes this instance into the provided slice -func (u *ID) binaryPut(serializedData []byte) error { - if len(serializedData) != idLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize ID. Expected %d, got %d", idLength, len(serializedData)) - } - var cursor int - if err := u.View.binaryPut(serializedData[cursor : cursor+viewLength]); err != nil { - return err - } - cursor += viewLength - - epochBytes, err := u.Epoch.MarshalBinary() - if err != nil { - return err - } - copy(serializedData[cursor:cursor+lookup.EpochLength], epochBytes[:]) - cursor += lookup.EpochLength - - return nil -} - -// binaryLength returns the expected size of this structure when serialized -func (u *ID) binaryLength() int { - return idLength -} - -// binaryGet restores the current instance from the information contained in the passed slice -func (u *ID) binaryGet(serializedData []byte) error { - if len(serializedData) != idLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to read ID. Expected %d, got %d", idLength, len(serializedData)) - } - - var cursor int - if err := u.View.binaryGet(serializedData[cursor : cursor+viewLength]); err != nil { - return err - } - cursor += viewLength - - if err := u.Epoch.UnmarshalBinary(serializedData[cursor : cursor+lookup.EpochLength]); err != nil { - return err - } - cursor += lookup.EpochLength - - return nil -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (u *ID) FromValues(values Values) error { - level, _ := strconv.ParseUint(values.Get("level"), 10, 32) - u.Epoch.Level = uint8(level) - u.Epoch.Time, _ = strconv.ParseUint(values.Get("time"), 10, 64) - - if u.View.User == (common.Address{}) { - return u.View.FromValues(values) - } - return nil -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (u *ID) AppendValues(values Values) { - values.Set("level", fmt.Sprintf("%d", u.Epoch.Level)) - values.Set("time", fmt.Sprintf("%d", u.Epoch.Time)) - u.View.AppendValues(values) -} diff --git a/swarm/storage/mru/id_test.go b/swarm/storage/mru/id_test.go deleted file mode 100644 index eba58fbf3554..000000000000 --- a/swarm/storage/mru/id_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package mru - -import ( - "testing" - - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" -) - -func getTestID() *ID { - return &ID{ - View: *getTestView(), - Epoch: lookup.GetFirstEpoch(1000), - } -} - -func TestIDAddr(t *testing.T) { - ul := getTestID() - updateAddr := ul.Addr() - compareByteSliceToExpectedHex(t, "updateAddr", updateAddr, "0x8b24583ec293e085f4c78aaee66d1bc5abfb8b4233304d14a349afa57af2a783") -} - -func TestIDSerializer(t *testing.T) { - testBinarySerializerRecovery(t, getTestID(), "0x776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781ce803000000000019") -} - -func TestIDLengthCheck(t *testing.T) { - testBinarySerializerLengthCheck(t, getTestID()) -} diff --git a/swarm/storage/mru/lookup/epoch.go b/swarm/storage/mru/lookup/epoch.go deleted file mode 100644 index bafe9547798e..000000000000 --- a/swarm/storage/mru/lookup/epoch.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package lookup - -import ( - "encoding/binary" - "errors" - "fmt" -) - -// Epoch represents a time slot at a particular frequency level -type Epoch struct { - Time uint64 `json:"time"` // Time stores the time at which the update or lookup takes place - Level uint8 `json:"level"` // Level indicates the frequency level as the exponent of a power of 2 -} - -// EpochID is a unique identifier for an Epoch, based on its level and base time. -type EpochID [8]byte - -// EpochLength stores the serialized binary length of an Epoch -const EpochLength = 8 - -// MaxTime contains the highest possible time value an Epoch can handle -const MaxTime uint64 = (1 << 56) - 1 - -// Base returns the base time of the Epoch -func (e *Epoch) Base() uint64 { - return getBaseTime(e.Time, e.Level) -} - -// ID Returns the unique identifier of this epoch -func (e *Epoch) ID() EpochID { - base := e.Base() - var id EpochID - binary.LittleEndian.PutUint64(id[:], base) - id[7] = e.Level - return id -} - -// MarshalBinary implements the encoding.BinaryMarshaller interface -func (e *Epoch) MarshalBinary() (data []byte, err error) { - b := make([]byte, 8) - binary.LittleEndian.PutUint64(b[:], e.Time) - b[7] = e.Level - return b, nil -} - -// UnmarshalBinary implements the encoding.BinaryUnmarshaller interface -func (e *Epoch) UnmarshalBinary(data []byte) error { - if len(data) != EpochLength { - return errors.New("Invalid data unmarshalling Epoch") - } - b := make([]byte, 8) - copy(b, data) - e.Level = b[7] - b[7] = 0 - e.Time = binary.LittleEndian.Uint64(b) - return nil -} - -// After returns true if this epoch occurs later or exactly at the other epoch. -func (e *Epoch) After(epoch Epoch) bool { - if e.Time == epoch.Time { - return e.Level < epoch.Level - } - return e.Time >= epoch.Time -} - -// Equals compares two epochs and returns true if they refer to the same time period. -func (e *Epoch) Equals(epoch Epoch) bool { - return e.Level == epoch.Level && e.Base() == epoch.Base() -} - -// String implements the Stringer interface. -func (e *Epoch) String() string { - return fmt.Sprintf("Epoch{Time:%d, Level:%d}", e.Time, e.Level) -} diff --git a/swarm/storage/mru/lookup/epoch_test.go b/swarm/storage/mru/lookup/epoch_test.go deleted file mode 100644 index 62cf5523d806..000000000000 --- a/swarm/storage/mru/lookup/epoch_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package lookup_test - -import ( - "testing" - - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" -) - -func TestMarshallers(t *testing.T) { - - for i := uint64(1); i < lookup.MaxTime; i *= 3 { - e := lookup.Epoch{ - Time: i, - Level: uint8(i % 20), - } - b, err := e.MarshalBinary() - if err != nil { - t.Fatal(err) - } - var e2 lookup.Epoch - if err := e2.UnmarshalBinary(b); err != nil { - t.Fatal(err) - } - if e != e2 { - t.Fatal("Expected unmarshalled epoch to be equal to marshalled onet.Fatal(err)") - } - } - -} - -func TestAfter(t *testing.T) { - a := lookup.Epoch{ - Time: 5, - Level: 3, - } - b := lookup.Epoch{ - Time: 6, - Level: 3, - } - c := lookup.Epoch{ - Time: 6, - Level: 4, - } - - if !b.After(a) { - t.Fatal("Expected 'after' to be true, got false") - } - - if b.After(b) { - t.Fatal("Expected 'after' to be false when both epochs are identical, got true") - } - - if !b.After(c) { - t.Fatal("Expected 'after' to be true when both epochs have the same time but the level is lower in the first one, but got false") - } - -} diff --git a/swarm/storage/mru/lookup/lookup.go b/swarm/storage/mru/lookup/lookup.go deleted file mode 100644 index c98248d70bb3..000000000000 --- a/swarm/storage/mru/lookup/lookup.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -/* -Package lookup defines resource lookup algorithms and provides tools to place updates -so they can be found -*/ -package lookup - -const maxuint64 = ^uint64(0) - -// LowestLevel establishes the frequency resolution of the lookup algorithm as a power of 2. -const LowestLevel uint8 = 0 // default is 0 (1 second) - -// HighestLevel sets the lowest frequency the algorithm will operate at, as a power of 2. -// 25 -> 2^25 equals to roughly one year. -const HighestLevel = 25 // default is 25 (~1 year) - -// DefaultLevel sets what level will be chosen to search when there is no hint -const DefaultLevel = HighestLevel - -//Algorithm is the function signature of a lookup algorithm -type Algorithm func(now uint64, hint Epoch, read ReadFunc) (value interface{}, err error) - -// Lookup finds the update with the highest timestamp that is smaller or equal than 'now' -// It takes a hint which should be the epoch where the last known update was -// If you don't know in what epoch the last update happened, simply submit lookup.NoClue -// read() will be called on each lookup attempt -// Returns an error only if read() returns an error -// Returns nil if an update was not found -var Lookup Algorithm = FluzCapacitorAlgorithm - -// ReadFunc is a handler called by Lookup each time it attempts to find a value -// It should return if a value is not found -// It should return if a value is found, but its timestamp is higher than "now" -// It should only return an error in case the handler wants to stop the -// lookup process entirely. -type ReadFunc func(epoch Epoch, now uint64) (interface{}, error) - -// NoClue is a hint that can be provided when the Lookup caller does not have -// a clue about where the last update may be -var NoClue = Epoch{} - -// getBaseTime returns the epoch base time of the given -// time and level -func getBaseTime(t uint64, level uint8) uint64 { - return t & (maxuint64 << level) -} - -// Hint creates a hint based only on the last known update time -func Hint(last uint64) Epoch { - return Epoch{ - Time: last, - Level: DefaultLevel, - } -} - -// GetNextLevel returns the frequency level a next update should be placed at, provided where -// the last update was and what time it is now. -// This is the first nonzero bit of the XOR of 'last' and 'now', counting from the highest significant bit -// but limited to not return a level that is smaller than the last-1 -func GetNextLevel(last Epoch, now uint64) uint8 { - // First XOR the last epoch base time with the current clock. - // This will set all the common most significant bits to zero. - mix := (last.Base() ^ now) - - // Then, make sure we stop the below loop before one level below the current, by setting - // that level's bit to 1. - // If the next level is lower than the current one, it must be exactly level-1 and not lower. - mix |= (1 << (last.Level - 1)) - - // if the last update was more than 2^highestLevel seconds ago, choose the highest level - if mix > (maxuint64 >> (64 - HighestLevel - 1)) { - return HighestLevel - } - - // set up a mask to scan for nonzero bits, starting at the highest level - mask := uint64(1 << (HighestLevel)) - - for i := uint8(HighestLevel); i > LowestLevel; i-- { - if mix&mask != 0 { // if we find a nonzero bit, this is the level the next update should be at. - return i - } - mask = mask >> 1 // move our bit one position to the right - } - return 0 -} - -// GetNextEpoch returns the epoch where the next update should be located -// according to where the previous update was -// and what time it is now. -func GetNextEpoch(last Epoch, now uint64) Epoch { - if last == NoClue { - return GetFirstEpoch(now) - } - level := GetNextLevel(last, now) - return Epoch{ - Level: level, - Time: now, - } -} - -// GetFirstEpoch returns the epoch where the first update should be located -// based on what time it is now. -func GetFirstEpoch(now uint64) Epoch { - return Epoch{Level: HighestLevel, Time: now} -} - -var worstHint = Epoch{Time: 0, Level: 63} - -// FluzCapacitorAlgorithm works by narrowing the epoch search area if an update is found -// going back and forth in time -// First, it will attempt to find an update where it should be now if the hint was -// really the last update. If that lookup fails, then the last update must be either the hint itself -// or the epochs right below. If however, that lookup succeeds, then the update must be -// that one or within the epochs right below. -// see the guide for a more graphical representation -func FluzCapacitorAlgorithm(now uint64, hint Epoch, read ReadFunc) (value interface{}, err error) { - var lastFound interface{} - var epoch Epoch - if hint == NoClue { - hint = worstHint - } - - t := now - - for { - epoch = GetNextEpoch(hint, t) - value, err = read(epoch, now) - if err != nil { - return nil, err - } - if value != nil { - lastFound = value - if epoch.Level == LowestLevel || epoch.Equals(hint) { - return value, nil - } - hint = epoch - continue - } - if epoch.Base() == hint.Base() { - if lastFound != nil { - return lastFound, nil - } - // we have reached the hint itself - if hint == worstHint { - return nil, nil - } - // check it out - value, err = read(hint, now) - if err != nil { - return nil, err - } - if value != nil { - return value, nil - } - // bad hint. - epoch = hint - hint = worstHint - } - base := epoch.Base() - if base == 0 { - return nil, nil - } - t = base - 1 - } -} diff --git a/swarm/storage/mru/lookup/lookup_test.go b/swarm/storage/mru/lookup/lookup_test.go deleted file mode 100644 index 34bcb61f0c5d..000000000000 --- a/swarm/storage/mru/lookup/lookup_test.go +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package lookup_test - -import ( - "fmt" - "math/rand" - "testing" - - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" -) - -type Data struct { - Payload uint64 - Time uint64 -} - -type Store map[lookup.EpochID]*Data - -func write(store Store, epoch lookup.Epoch, value *Data) { - log.Debug("Write: %d-%d, value='%d'\n", epoch.Base(), epoch.Level, value.Payload) - store[epoch.ID()] = value -} - -func update(store Store, last lookup.Epoch, now uint64, value *Data) lookup.Epoch { - epoch := lookup.GetNextEpoch(last, now) - - write(store, epoch, value) - - return epoch -} - -const Day = 60 * 60 * 24 -const Year = Day * 365 -const Month = Day * 30 - -func makeReadFunc(store Store, counter *int) lookup.ReadFunc { - return func(epoch lookup.Epoch, now uint64) (interface{}, error) { - *counter++ - data := store[epoch.ID()] - var valueStr string - if data != nil { - valueStr = fmt.Sprintf("%d", data.Payload) - } - log.Debug("Read: %d-%d, value='%s'\n", epoch.Base(), epoch.Level, valueStr) - if data != nil && data.Time <= now { - return data, nil - } - return nil, nil - } -} - -func TestLookup(t *testing.T) { - - store := make(Store) - readCount := 0 - readFunc := makeReadFunc(store, &readCount) - - // write an update every month for 12 months 3 years ago and then silence for two years - now := uint64(1533799046) - var epoch lookup.Epoch - - var lastData *Data - for i := uint64(0); i < 12; i++ { - t := uint64(now - Year*3 + i*Month) - data := Data{ - Payload: t, //our "payload" will be the timestamp itself. - Time: t, - } - epoch = update(store, epoch, t, &data) - lastData = &data - } - - // try to get the last value - - value, err := lookup.Lookup(now, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - - readCountWithoutHint := readCount - - if value != lastData { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", lastData, value) - } - - // reset the read count for the next test - readCount = 0 - // Provide a hint to get a faster lookup. In particular, we give the exact location of the last update - value, err = lookup.Lookup(now, epoch, readFunc) - if err != nil { - t.Fatal(err) - } - - if value != lastData { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", lastData, value) - } - - if readCount > readCountWithoutHint { - t.Fatalf("Expected lookup to complete with fewer or same reads than %d since we provided a hint. Did %d reads.", readCountWithoutHint, readCount) - } - - // try to get an intermediate value - // if we look for a value in now - Year*3 + 6*Month, we should get that value - // Since the "payload" is the timestamp itself, we can check this. - - expectedTime := now - Year*3 + 6*Month - - value, err = lookup.Lookup(expectedTime, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - - data, ok := value.(*Data) - - if !ok { - t.Fatal("Expected value to contain data") - } - - if data.Time != expectedTime { - t.Fatalf("Expected value timestamp to be %d, got %d", data.Time, expectedTime) - } - -} - -func TestOneUpdateAt0(t *testing.T) { - - store := make(Store) - readCount := 0 - - readFunc := makeReadFunc(store, &readCount) - now := uint64(1533903729) - - var epoch lookup.Epoch - data := Data{ - Payload: 79, - Time: 0, - } - update(store, epoch, 0, &data) - - value, err := lookup.Lookup(now, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - if value != &data { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", data, value) - } -} - -// Tests the update is found even when a bad hint is given -func TestBadHint(t *testing.T) { - - store := make(Store) - readCount := 0 - - readFunc := makeReadFunc(store, &readCount) - now := uint64(1533903729) - - var epoch lookup.Epoch - data := Data{ - Payload: 79, - Time: 0, - } - - // place an update for t=1200 - update(store, epoch, 1200, &data) - - // come up with some evil hint - badHint := lookup.Epoch{ - Level: 18, - Time: 1200000000, - } - - value, err := lookup.Lookup(now, badHint, readFunc) - if err != nil { - t.Fatal(err) - } - if value != &data { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", data, value) - } -} - -func TestLookupFail(t *testing.T) { - - store := make(Store) - readCount := 0 - - readFunc := makeReadFunc(store, &readCount) - now := uint64(1533903729) - - // don't write anything and try to look up. - // we're testing we don't get stuck in a loop - - value, err := lookup.Lookup(now, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - if value != nil { - t.Fatal("Expected value to be nil, since the update should've failed") - } - - expectedReads := now/(1< readCountWithoutHint { - t.Fatalf("Expected lookup to complete with fewer or equal reads than %d since we provided a hint. Did %d reads.", readCountWithoutHint, readCount) - } - - for i := uint64(0); i <= 994; i++ { - T := uint64(now - 1000 + i) // update every second for the last 1000 seconds - value, err := lookup.Lookup(T, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - data, _ := value.(*Data) - if data == nil { - t.Fatalf("Expected lookup to return %d, got nil", T) - } - if data.Payload != T { - t.Fatalf("Expected lookup to return %d, got %d", T, data.Time) - } - } -} - -func TestSparseUpdates(t *testing.T) { - - store := make(Store) - readCount := 0 - readFunc := makeReadFunc(store, &readCount) - - // write an update every 5 years 3 times starting in Jan 1st 1970 and then silence - - now := uint64(1533799046) - var epoch lookup.Epoch - - var lastData *Data - for i := uint64(0); i < 5; i++ { - T := uint64(Year * 5 * i) // write an update every 5 years 3 times starting in Jan 1st 1970 and then silence - data := Data{ - Payload: T, //our "payload" will be the timestamp itself. - Time: T, - } - epoch = update(store, epoch, T, &data) - lastData = &data - } - - // try to get the last value - - value, err := lookup.Lookup(now, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - - readCountWithoutHint := readCount - - if value != lastData { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", lastData, value) - } - - // reset the read count for the next test - readCount = 0 - // Provide a hint to get a faster lookup. In particular, we give the exact location of the last update - value, err = lookup.Lookup(now, epoch, readFunc) - if err != nil { - t.Fatal(err) - } - - if value != lastData { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", lastData, value) - } - - if readCount > readCountWithoutHint { - t.Fatalf("Expected lookup to complete with fewer reads than %d since we provided a hint. Did %d reads.", readCountWithoutHint, readCount) - } - -} - -// testG will hold precooked test results -// fields are abbreviated to reduce the size of the literal below -type testG struct { - e lookup.Epoch // last - n uint64 // next level - x uint8 // expected result -} - -// test cases -var testGetNextLevelCases []testG = []testG{{e: lookup.Epoch{Time: 989875233, Level: 12}, n: 989875233, x: 11}, {e: lookup.Epoch{Time: 995807650, Level: 18}, n: 995598156, x: 19}, {e: lookup.Epoch{Time: 969167082, Level: 0}, n: 968990357, x: 18}, {e: lookup.Epoch{Time: 993087628, Level: 14}, n: 992987044, x: 20}, {e: lookup.Epoch{Time: 963364631, Level: 20}, n: 963364630, x: 19}, {e: lookup.Epoch{Time: 963497510, Level: 16}, n: 963370732, x: 18}, {e: lookup.Epoch{Time: 955421349, Level: 22}, n: 955421348, x: 21}, {e: lookup.Epoch{Time: 968220379, Level: 15}, n: 968220378, x: 14}, {e: lookup.Epoch{Time: 939129014, Level: 6}, n: 939128771, x: 11}, {e: lookup.Epoch{Time: 907847903, Level: 6}, n: 907791833, x: 18}, {e: lookup.Epoch{Time: 910835564, Level: 15}, n: 910835564, x: 14}, {e: lookup.Epoch{Time: 913578333, Level: 22}, n: 881808431, x: 25}, {e: lookup.Epoch{Time: 895818460, Level: 3}, n: 895818132, x: 9}, {e: lookup.Epoch{Time: 903843025, Level: 24}, n: 895609561, x: 23}, {e: lookup.Epoch{Time: 877889433, Level: 13}, n: 877877093, x: 15}, {e: lookup.Epoch{Time: 901450396, Level: 10}, n: 901450058, x: 9}, {e: lookup.Epoch{Time: 925179910, Level: 3}, n: 925168393, x: 16}, {e: lookup.Epoch{Time: 913485477, Level: 21}, n: 913485476, x: 20}, {e: lookup.Epoch{Time: 924462991, Level: 18}, n: 924462990, x: 17}, {e: lookup.Epoch{Time: 941175128, Level: 13}, n: 941175127, x: 12}, {e: lookup.Epoch{Time: 920126583, Level: 3}, n: 920100782, x: 19}, {e: lookup.Epoch{Time: 932403200, Level: 9}, n: 932279891, x: 17}, {e: lookup.Epoch{Time: 948284931, Level: 2}, n: 948284921, x: 9}, {e: lookup.Epoch{Time: 953540997, Level: 7}, n: 950547986, x: 22}, {e: lookup.Epoch{Time: 926639837, Level: 18}, n: 918608882, x: 24}, {e: lookup.Epoch{Time: 954637598, Level: 1}, n: 954578761, x: 17}, {e: lookup.Epoch{Time: 943482981, Level: 10}, n: 942924151, x: 19}, {e: lookup.Epoch{Time: 963580771, Level: 7}, n: 963580771, x: 6}, {e: lookup.Epoch{Time: 993744930, Level: 7}, n: 993690858, x: 16}, {e: lookup.Epoch{Time: 1018890213, Level: 12}, n: 1018890212, x: 11}, {e: lookup.Epoch{Time: 1030309411, Level: 2}, n: 1030309227, x: 9}, {e: lookup.Epoch{Time: 1063204997, Level: 20}, n: 1063204996, x: 19}, {e: lookup.Epoch{Time: 1094340832, Level: 6}, n: 1094340633, x: 7}, {e: lookup.Epoch{Time: 1077880597, Level: 10}, n: 1075914292, x: 20}, {e: lookup.Epoch{Time: 1051114957, Level: 18}, n: 1051114957, x: 17}, {e: lookup.Epoch{Time: 1045649701, Level: 22}, n: 1045649700, x: 21}, {e: lookup.Epoch{Time: 1066198885, Level: 14}, n: 1066198884, x: 13}, {e: lookup.Epoch{Time: 1053231952, Level: 1}, n: 1053210845, x: 16}, {e: lookup.Epoch{Time: 1068763404, Level: 14}, n: 1068675428, x: 18}, {e: lookup.Epoch{Time: 1039042173, Level: 15}, n: 1038973110, x: 17}, {e: lookup.Epoch{Time: 1050747636, Level: 6}, n: 1050747364, x: 9}, {e: lookup.Epoch{Time: 1030034434, Level: 23}, n: 1030034433, x: 22}, {e: lookup.Epoch{Time: 1003783425, Level: 18}, n: 1003783424, x: 17}, {e: lookup.Epoch{Time: 988163976, Level: 15}, n: 988084064, x: 17}, {e: lookup.Epoch{Time: 1007222377, Level: 15}, n: 1007222377, x: 14}, {e: lookup.Epoch{Time: 1001211375, Level: 13}, n: 1001208178, x: 14}, {e: lookup.Epoch{Time: 997623199, Level: 8}, n: 997623198, x: 7}, {e: lookup.Epoch{Time: 1026283830, Level: 10}, n: 1006681704, x: 24}, {e: lookup.Epoch{Time: 1019421907, Level: 20}, n: 1019421906, x: 19}, {e: lookup.Epoch{Time: 1043154306, Level: 16}, n: 1043108343, x: 16}, {e: lookup.Epoch{Time: 1075643767, Level: 17}, n: 1075325898, x: 18}, {e: lookup.Epoch{Time: 1043726309, Level: 20}, n: 1043726308, x: 19}, {e: lookup.Epoch{Time: 1056415324, Level: 17}, n: 1056415324, x: 16}, {e: lookup.Epoch{Time: 1088650219, Level: 13}, n: 1088650218, x: 12}, {e: lookup.Epoch{Time: 1088551662, Level: 7}, n: 1088543355, x: 13}, {e: lookup.Epoch{Time: 1069667265, Level: 6}, n: 1069667075, x: 7}, {e: lookup.Epoch{Time: 1079145970, Level: 18}, n: 1079145969, x: 17}, {e: lookup.Epoch{Time: 1083338876, Level: 7}, n: 1083338875, x: 6}, {e: lookup.Epoch{Time: 1051581086, Level: 4}, n: 1051568869, x: 14}, {e: lookup.Epoch{Time: 1028430882, Level: 4}, n: 1028430864, x: 5}, {e: lookup.Epoch{Time: 1057356462, Level: 1}, n: 1057356417, x: 5}, {e: lookup.Epoch{Time: 1033104266, Level: 0}, n: 1033097479, x: 13}, {e: lookup.Epoch{Time: 1031391367, Level: 11}, n: 1031387304, x: 14}, {e: lookup.Epoch{Time: 1049781164, Level: 15}, n: 1049781163, x: 14}, {e: lookup.Epoch{Time: 1027271628, Level: 12}, n: 1027271627, x: 11}, {e: lookup.Epoch{Time: 1057270560, Level: 23}, n: 1057270560, x: 22}, {e: lookup.Epoch{Time: 1047501317, Level: 15}, n: 1047501317, x: 14}, {e: lookup.Epoch{Time: 1058349035, Level: 11}, n: 1045175573, x: 24}, {e: lookup.Epoch{Time: 1057396147, Level: 20}, n: 1057396147, x: 19}, {e: lookup.Epoch{Time: 1048906375, Level: 18}, n: 1039616919, x: 25}, {e: lookup.Epoch{Time: 1074294831, Level: 20}, n: 1074294831, x: 19}, {e: lookup.Epoch{Time: 1088946052, Level: 1}, n: 1088917364, x: 14}, {e: lookup.Epoch{Time: 1112337595, Level: 17}, n: 1111008110, x: 22}, {e: lookup.Epoch{Time: 1099990284, Level: 5}, n: 1099968370, x: 15}, {e: lookup.Epoch{Time: 1087036441, Level: 16}, n: 1053967855, x: 25}, {e: lookup.Epoch{Time: 1069225185, Level: 8}, n: 1069224660, x: 10}, {e: lookup.Epoch{Time: 1057505479, Level: 9}, n: 1057505170, x: 14}, {e: lookup.Epoch{Time: 1072381377, Level: 12}, n: 1065950959, x: 22}, {e: lookup.Epoch{Time: 1093887139, Level: 8}, n: 1093863305, x: 14}, {e: lookup.Epoch{Time: 1082366510, Level: 24}, n: 1082366510, x: 23}, {e: lookup.Epoch{Time: 1103231132, Level: 14}, n: 1102292201, x: 22}, {e: lookup.Epoch{Time: 1094502355, Level: 3}, n: 1094324652, x: 18}, {e: lookup.Epoch{Time: 1068488344, Level: 12}, n: 1067577330, x: 19}, {e: lookup.Epoch{Time: 1050278233, Level: 12}, n: 1050278232, x: 11}, {e: lookup.Epoch{Time: 1047660768, Level: 5}, n: 1047652137, x: 17}, {e: lookup.Epoch{Time: 1060116167, Level: 11}, n: 1060114091, x: 12}, {e: lookup.Epoch{Time: 1068149392, Level: 21}, n: 1052074801, x: 24}, {e: lookup.Epoch{Time: 1081934120, Level: 6}, n: 1081933847, x: 8}, {e: lookup.Epoch{Time: 1107943693, Level: 16}, n: 1107096139, x: 25}, {e: lookup.Epoch{Time: 1131571649, Level: 9}, n: 1131570428, x: 11}, {e: lookup.Epoch{Time: 1123139367, Level: 0}, n: 1122912198, x: 20}, {e: lookup.Epoch{Time: 1121144423, Level: 6}, n: 1120568289, x: 20}, {e: lookup.Epoch{Time: 1089932411, Level: 17}, n: 1089932410, x: 16}, {e: lookup.Epoch{Time: 1104899012, Level: 22}, n: 1098978789, x: 22}, {e: lookup.Epoch{Time: 1094588059, Level: 21}, n: 1094588059, x: 20}, {e: lookup.Epoch{Time: 1114987438, Level: 24}, n: 1114987437, x: 23}, {e: lookup.Epoch{Time: 1084186305, Level: 7}, n: 1084186241, x: 6}, {e: lookup.Epoch{Time: 1058827111, Level: 8}, n: 1058826504, x: 9}, {e: lookup.Epoch{Time: 1090679810, Level: 12}, n: 1090616539, x: 17}, {e: lookup.Epoch{Time: 1084299475, Level: 23}, n: 1084299475, x: 22}} - -func TestGetNextLevel(t *testing.T) { - - // First, test well-known cases - last := lookup.Epoch{ - Time: 1533799046, - Level: 5, - } - - level := lookup.GetNextLevel(last, last.Time) - expected := uint8(4) - if level != expected { - t.Fatalf("Expected GetNextLevel to return %d for same-time updates at a nonzero level, got %d", expected, level) - } - - level = lookup.GetNextLevel(last, last.Time+(1< lookup.HighestLevel { - v = 0 - } - now = last.Time + uint64(rand.Intn(1<. - -package mru - -import ( - "fmt" - "strconv" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" -) - -// Query is used to specify constraints when performing an update lookup -// TimeLimit indicates an upper bound for the search. Set to 0 for "now" -type Query struct { - View - Hint lookup.Epoch - TimeLimit uint64 -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (q *Query) FromValues(values Values) error { - time, _ := strconv.ParseUint(values.Get("time"), 10, 64) - q.TimeLimit = time - - level, _ := strconv.ParseUint(values.Get("hint.level"), 10, 32) - q.Hint.Level = uint8(level) - q.Hint.Time, _ = strconv.ParseUint(values.Get("hint.time"), 10, 64) - if q.View.User == (common.Address{}) { - return q.View.FromValues(values) - } - return nil -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (q *Query) AppendValues(values Values) { - if q.TimeLimit != 0 { - values.Set("time", fmt.Sprintf("%d", q.TimeLimit)) - } - if q.Hint.Level != 0 { - values.Set("hint.level", fmt.Sprintf("%d", q.Hint.Level)) - } - if q.Hint.Time != 0 { - values.Set("hint.time", fmt.Sprintf("%d", q.Hint.Time)) - } - q.View.AppendValues(values) -} - -// NewQuery constructs an Query structure to find updates on or before `time` -// if time == 0, the latest update will be looked up -func NewQuery(view *View, time uint64, hint lookup.Epoch) *Query { - return &Query{ - TimeLimit: time, - View: *view, - Hint: hint, - } -} - -// NewQueryLatest generates lookup parameters that look for the latest version of a resource -func NewQueryLatest(view *View, hint lookup.Epoch) *Query { - return NewQuery(view, 0, hint) -} diff --git a/swarm/storage/mru/query_test.go b/swarm/storage/mru/query_test.go deleted file mode 100644 index 189a465d6eb3..000000000000 --- a/swarm/storage/mru/query_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "testing" -) - -func getTestQuery() *Query { - ul := getTestID() - return &Query{ - TimeLimit: 5000, - View: ul.View, - Hint: ul.Epoch, - } -} - -func TestQueryValues(t *testing.T) { - var expected = KV{"hint.level": "25", "hint.time": "1000", "time": "5000", "topic": "0x776f726c64206e657773207265706f72742c20657665727920686f7572000000", "user": "0x876A8936A7Cd0b79Ef0735AD0896c1AFe278781c"} - - query := getTestQuery() - testValueSerializer(t, query, expected) - -} diff --git a/swarm/storage/mru/request.go b/swarm/storage/mru/request.go deleted file mode 100644 index f6d0f38ff7ed..000000000000 --- a/swarm/storage/mru/request.go +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "bytes" - "encoding/json" - "hash" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" -) - -// Request represents an update and/or resource create message -type Request struct { - ResourceUpdate // actual content that will be put on the chunk, less signature - Signature *Signature - idAddr storage.Address // cached chunk address for the update (not serialized, for internal use) - binaryData []byte // cached serialized data (does not get serialized again!, for efficiency/internal use) -} - -// updateRequestJSON represents a JSON-serialized UpdateRequest -type updateRequestJSON struct { - ID - ProtocolVersion uint8 `json:"protocolVersion"` - Data string `json:"data,omitempty"` - Signature string `json:"signature,omitempty"` -} - -// Request layout -// resourceUpdate bytes -// SignatureLength bytes -const minimumSignedUpdateLength = minimumUpdateDataLength + signatureLength - -// NewFirstRequest returns a ready to sign request to publish a first update -func NewFirstRequest(topic Topic) *Request { - - request := new(Request) - - // get the current time - now := TimestampProvider.Now().Time - request.Epoch = lookup.GetFirstEpoch(now) - request.View.Topic = topic - request.Header.Version = ProtocolVersion - - return request -} - -// SetData stores the payload data the resource will be updated with -func (r *Request) SetData(data []byte) { - r.data = data - r.Signature = nil -} - -// IsUpdate returns true if this request models a signed update or otherwise it is a signature request -func (r *Request) IsUpdate() bool { - return r.Signature != nil -} - -// Verify checks that signatures are valid and that the signer owns the resource to be updated -func (r *Request) Verify() (err error) { - if len(r.data) == 0 { - return NewError(ErrInvalidValue, "Update does not contain data") - } - if r.Signature == nil { - return NewError(ErrInvalidSignature, "Missing signature field") - } - - digest, err := r.GetDigest() - if err != nil { - return err - } - - // get the address of the signer (which also checks that it's a valid signature) - r.View.User, err = getUserAddr(digest, *r.Signature) - if err != nil { - return err - } - - // check that the lookup information contained in the chunk matches the updateAddr (chunk search key) - // that was used to retrieve this chunk - // if this validation fails, someone forged a chunk. - if !bytes.Equal(r.idAddr, r.Addr()) { - return NewError(ErrInvalidSignature, "Signature address does not match with update user address") - } - - return nil -} - -// Sign executes the signature to validate the resource -func (r *Request) Sign(signer Signer) error { - r.View.User = signer.Address() - r.binaryData = nil //invalidate serialized data - digest, err := r.GetDigest() // computes digest and serializes into .binaryData - if err != nil { - return err - } - - signature, err := signer.Sign(digest) - if err != nil { - return err - } - - // Although the Signer interface returns the public address of the signer, - // recover it from the signature to see if they match - userAddr, err := getUserAddr(digest, signature) - if err != nil { - return NewError(ErrInvalidSignature, "Error verifying signature") - } - - if userAddr != signer.Address() { // sanity check to make sure the Signer is declaring the same address used to sign! - return NewError(ErrInvalidSignature, "Signer address does not match update user address") - } - - r.Signature = &signature - r.idAddr = r.Addr() - return nil -} - -// GetDigest creates the resource update digest used in signatures -// the serialized payload is cached in .binaryData -func (r *Request) GetDigest() (result common.Hash, err error) { - hasher := hashPool.Get().(hash.Hash) - defer hashPool.Put(hasher) - hasher.Reset() - dataLength := r.ResourceUpdate.binaryLength() - if r.binaryData == nil { - r.binaryData = make([]byte, dataLength+signatureLength) - if err := r.ResourceUpdate.binaryPut(r.binaryData[:dataLength]); err != nil { - return result, err - } - } - hasher.Write(r.binaryData[:dataLength]) //everything except the signature. - - return common.BytesToHash(hasher.Sum(nil)), nil -} - -// create an update chunk. -func (r *Request) toChunk() (storage.Chunk, error) { - - // Check that the update is signed and serialized - // For efficiency, data is serialized during signature and cached in - // the binaryData field when computing the signature digest in .getDigest() - if r.Signature == nil || r.binaryData == nil { - return nil, NewError(ErrInvalidSignature, "toChunk called without a valid signature or payload data. Call .Sign() first.") - } - - resourceUpdateLength := r.ResourceUpdate.binaryLength() - - // signature is the last item in the chunk data - copy(r.binaryData[resourceUpdateLength:], r.Signature[:]) - - chunk := storage.NewChunk(r.idAddr, r.binaryData) - return chunk, nil -} - -// fromChunk populates this structure from chunk data. It does not verify the signature is valid. -func (r *Request) fromChunk(updateAddr storage.Address, chunkdata []byte) error { - // for update chunk layout see Request definition - - //deserialize the resource update portion - if err := r.ResourceUpdate.binaryGet(chunkdata[:len(chunkdata)-signatureLength]); err != nil { - return err - } - - // Extract the signature - var signature *Signature - cursor := r.ResourceUpdate.binaryLength() - sigdata := chunkdata[cursor : cursor+signatureLength] - if len(sigdata) > 0 { - signature = &Signature{} - copy(signature[:], sigdata) - } - - r.Signature = signature - r.idAddr = updateAddr - r.binaryData = chunkdata - - return nil - -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (r *Request) FromValues(values Values, data []byte) error { - signatureBytes, err := hexutil.Decode(values.Get("signature")) - if err != nil { - r.Signature = nil - } else { - if len(signatureBytes) != signatureLength { - return NewError(ErrInvalidSignature, "Incorrect signature length") - } - r.Signature = new(Signature) - copy(r.Signature[:], signatureBytes) - } - err = r.ResourceUpdate.FromValues(values, data) - if err != nil { - return err - } - r.idAddr = r.Addr() - return err -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (r *Request) AppendValues(values Values) []byte { - if r.Signature != nil { - values.Set("signature", hexutil.Encode(r.Signature[:])) - } - return r.ResourceUpdate.AppendValues(values) -} - -// fromJSON takes an update request JSON and populates an UpdateRequest -func (r *Request) fromJSON(j *updateRequestJSON) error { - - r.ID = j.ID - r.Header.Version = j.ProtocolVersion - - var err error - if j.Data != "" { - r.data, err = hexutil.Decode(j.Data) - if err != nil { - return NewError(ErrInvalidValue, "Cannot decode data") - } - } - - if j.Signature != "" { - sigBytes, err := hexutil.Decode(j.Signature) - if err != nil || len(sigBytes) != signatureLength { - return NewError(ErrInvalidSignature, "Cannot decode signature") - } - r.Signature = new(Signature) - r.idAddr = r.Addr() - copy(r.Signature[:], sigBytes) - } - return nil -} - -// UnmarshalJSON takes a JSON structure stored in a byte array and populates the Request object -// Implements json.Unmarshaler interface -func (r *Request) UnmarshalJSON(rawData []byte) error { - var requestJSON updateRequestJSON - if err := json.Unmarshal(rawData, &requestJSON); err != nil { - return err - } - return r.fromJSON(&requestJSON) -} - -// MarshalJSON takes an update request and encodes it as a JSON structure into a byte array -// Implements json.Marshaler interface -func (r *Request) MarshalJSON() (rawData []byte, err error) { - var signatureString, dataString string - if r.Signature != nil { - signatureString = hexutil.Encode(r.Signature[:]) - } - if r.data != nil { - dataString = hexutil.Encode(r.data) - } - - requestJSON := &updateRequestJSON{ - ID: r.ID, - ProtocolVersion: r.Header.Version, - Data: dataString, - Signature: signatureString, - } - - return json.Marshal(requestJSON) -} diff --git a/swarm/storage/mru/request_test.go b/swarm/storage/mru/request_test.go deleted file mode 100644 index c32d5ec13680..000000000000 --- a/swarm/storage/mru/request_test.go +++ /dev/null @@ -1,314 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "fmt" - "reflect" - "testing" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" -) - -func areEqualJSON(s1, s2 string) (bool, error) { - //credit for the trick: turtlemonvh https://gist.github.com/turtlemonvh/e4f7404e28387fadb8ad275a99596f67 - var o1 interface{} - var o2 interface{} - - err := json.Unmarshal([]byte(s1), &o1) - if err != nil { - return false, fmt.Errorf("Error mashalling string 1 :: %s", err.Error()) - } - err = json.Unmarshal([]byte(s2), &o2) - if err != nil { - return false, fmt.Errorf("Error mashalling string 2 :: %s", err.Error()) - } - - return reflect.DeepEqual(o1, o2), nil -} - -// TestEncodingDecodingUpdateRequests ensures that requests are serialized properly -// while also checking cryptographically that only the owner of a resource can update it. -func TestEncodingDecodingUpdateRequests(t *testing.T) { - - charlie := newCharlieSigner() //Charlie - bob := newBobSigner() //Bob - - // Create a resource to our good guy Charlie's name - topic, _ := NewTopic("a good resource name", nil) - createRequest := NewFirstRequest(topic) - createRequest.User = charlie.Address() - - // We now encode the create message to simulate we send it over the wire - messageRawData, err := createRequest.MarshalJSON() - if err != nil { - t.Fatalf("Error encoding create resource request: %s", err) - } - - // ... the message arrives and is decoded... - var recoveredCreateRequest Request - if err := recoveredCreateRequest.UnmarshalJSON(messageRawData); err != nil { - t.Fatalf("Error decoding create resource request: %s", err) - } - - // ... but verification should fail because it is not signed! - if err := recoveredCreateRequest.Verify(); err == nil { - t.Fatal("Expected Verify to fail since the message is not signed") - } - - // We now assume that the resource was created and propagated. With rootAddr we can retrieve the resource metadata - // and recover the information above. To sign an update, we need the rootAddr and the metaHash to construct - // proof of ownership - - const expectedSignature = "0x32c2d2c7224e24e4d3ae6a10595fc6e945f1b3ecdf548a04d8247c240a50c9240076aa7730abad6c8a46dfea00cfb8f43b6211f02db5c4cc5ed8584cb0212a4d00" - const expectedJSON = `{"view":{"topic":"0x6120676f6f64207265736f75726365206e616d65000000000000000000000000","user":"0x876a8936a7cd0b79ef0735ad0896c1afe278781c"},"epoch":{"time":1000,"level":1},"protocolVersion":0,"data":"0x5468697320686f75722773207570646174653a20537761726d2039392e3020686173206265656e2072656c656173656421"}` - - //Put together an unsigned update request that we will serialize to send it to the signer. - data := []byte("This hour's update: Swarm 99.0 has been released!") - request := &Request{ - ResourceUpdate: ResourceUpdate{ - ID: ID{ - Epoch: lookup.Epoch{ - Time: 1000, - Level: 1, - }, - View: createRequest.ResourceUpdate.View, - }, - data: data, - }, - } - - messageRawData, err = request.MarshalJSON() - if err != nil { - t.Fatalf("Error encoding update request: %s", err) - } - - equalJSON, err := areEqualJSON(string(messageRawData), expectedJSON) - if err != nil { - t.Fatalf("Error decoding update request JSON: %s", err) - } - if !equalJSON { - t.Fatalf("Received a different JSON message. Expected %s, got %s", expectedJSON, string(messageRawData)) - } - - // now the encoded message messageRawData is sent over the wire and arrives to the signer - - //Attempt to extract an UpdateRequest out of the encoded message - var recoveredRequest Request - if err := recoveredRequest.UnmarshalJSON(messageRawData); err != nil { - t.Fatalf("Error decoding update request: %s", err) - } - - //sign the request and see if it matches our predefined signature above. - if err := recoveredRequest.Sign(charlie); err != nil { - t.Fatalf("Error signing request: %s", err) - } - - compareByteSliceToExpectedHex(t, "signature", recoveredRequest.Signature[:], expectedSignature) - - // mess with the signature and see what happens. To alter the signature, we briefly decode it as JSON - // to alter the signature field. - var j updateRequestJSON - if err := json.Unmarshal([]byte(expectedJSON), &j); err != nil { - t.Fatal("Error unmarshalling test json, check expectedJSON constant") - } - j.Signature = "Certainly not a signature" - corruptMessage, _ := json.Marshal(j) // encode the message with the bad signature - var corruptRequest Request - if err = corruptRequest.UnmarshalJSON(corruptMessage); err == nil { - t.Fatal("Expected DecodeUpdateRequest to fail when trying to interpret a corrupt message with an invalid signature") - } - - // Now imagine Bob wants to create an update of his own about the same resource, - // signing a message with his private key - if err := request.Sign(bob); err != nil { - t.Fatalf("Error signing: %s", err) - } - - // Now Bob encodes the message to send it over the wire... - messageRawData, err = request.MarshalJSON() - if err != nil { - t.Fatalf("Error encoding message:%s", err) - } - - // ... the message arrives to our Swarm node and it is decoded. - recoveredRequest = Request{} - if err := recoveredRequest.UnmarshalJSON(messageRawData); err != nil { - t.Fatalf("Error decoding message:%s", err) - } - - // Before checking what happened with Bob's update, let's see what would happen if we mess - // with the signature big time to see if Verify catches it - savedSignature := *recoveredRequest.Signature // save the signature for later - binary.LittleEndian.PutUint64(recoveredRequest.Signature[5:], 556845463424) // write some random data to break the signature - if err = recoveredRequest.Verify(); err == nil { - t.Fatal("Expected Verify to fail on corrupt signature") - } - - // restore the Bob's signature from corruption - *recoveredRequest.Signature = savedSignature - - // Now the signature is not corrupt - if err = recoveredRequest.Verify(); err != nil { - t.Fatal(err) - } - - // Reuse object and sign with our friend Charlie's private key - if err := recoveredRequest.Sign(charlie); err != nil { - t.Fatalf("Error signing with the correct private key: %s", err) - } - - // And now, Verify should work since this update now belongs to Charlie - if err = recoveredRequest.Verify(); err != nil { - t.Fatalf("Error verifying that Charlie, can sign a reused request object:%s", err) - } - - // mess with the lookup key to make sure Verify fails: - recoveredRequest.Time = 77999 // this will alter the lookup key - if err = recoveredRequest.Verify(); err == nil { - t.Fatalf("Expected Verify to fail since the lookup key has been altered") - } -} - -func getTestRequest() *Request { - return &Request{ - ResourceUpdate: *getTestResourceUpdate(), - } -} - -func TestUpdateChunkSerializationErrorChecking(t *testing.T) { - - // Test that parseUpdate fails if the chunk is too small - var r Request - if err := r.fromChunk(storage.ZeroAddr, make([]byte, minimumUpdateDataLength-1+signatureLength)); err == nil { - t.Fatalf("Expected request.fromChunk to fail when chunkData contains less than %d bytes", minimumUpdateDataLength) - } - - r = *getTestRequest() - - _, err := r.toChunk() - if err == nil { - t.Fatal("Expected request.toChunk to fail when there is no data") - } - r.data = []byte("Al bien hacer jamás le falta premio") // put some arbitrary length data - _, err = r.toChunk() - if err == nil { - t.Fatal("expected request.toChunk to fail when there is no signature") - } - - charlie := newCharlieSigner() - if err := r.Sign(charlie); err != nil { - t.Fatalf("error signing:%s", err) - } - - chunk, err := r.toChunk() - if err != nil { - t.Fatalf("error creating update chunk:%s", err) - } - - compareByteSliceToExpectedHex(t, "chunk", chunk.Data(), "0x0000000000000000776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781ce803000000000019416c206269656e206861636572206a616dc3a173206c652066616c7461207072656d696f5a0ffe0bc27f207cd5b00944c8b9cee93e08b89b5ada777f123ac535189333f174a6a4ca2f43a92c4a477a49d774813c36ce8288552c58e6205b0ac35d0507eb00") - - var recovered Request - recovered.fromChunk(chunk.Address(), chunk.Data()) - if !reflect.DeepEqual(recovered, r) { - t.Fatal("Expected recovered SignedResource update to equal the original one") - } -} - -// check that signature address matches update signer address -func TestReverse(t *testing.T) { - - epoch := lookup.Epoch{ - Time: 7888, - Level: 6, - } - - // make fake timeProvider - timeProvider := &fakeTimeProvider{ - currentTime: startTime.Time, - } - - // signer containing private key - signer := newAliceSigner() - - // set up rpc and create resourcehandler - _, _, teardownTest, err := setupTest(timeProvider, signer) - if err != nil { - t.Fatal(err) - } - defer teardownTest() - - topic, _ := NewTopic("Cervantes quotes", nil) - view := View{ - Topic: topic, - User: signer.Address(), - } - - data := []byte("Donde una puerta se cierra, otra se abre") - - request := new(Request) - request.View = view - request.Epoch = epoch - request.data = data - - // generate a chunk key for this request - key := request.Addr() - - if err = request.Sign(signer); err != nil { - t.Fatal(err) - } - - chunk, err := request.toChunk() - if err != nil { - t.Fatal(err) - } - - // check that we can recover the owner account from the update chunk's signature - var checkUpdate Request - if err := checkUpdate.fromChunk(chunk.Address(), chunk.Data()); err != nil { - t.Fatal(err) - } - checkdigest, err := checkUpdate.GetDigest() - if err != nil { - t.Fatal(err) - } - recoveredaddress, err := getUserAddr(checkdigest, *checkUpdate.Signature) - if err != nil { - t.Fatalf("Retrieve address from signature fail: %v", err) - } - originaladdress := crypto.PubkeyToAddress(signer.PrivKey.PublicKey) - - // check that the metadata retrieved from the chunk matches what we gave it - if recoveredaddress != originaladdress { - t.Fatalf("addresses dont match: %x != %x", originaladdress, recoveredaddress) - } - - if !bytes.Equal(key[:], chunk.Address()[:]) { - t.Fatalf("Expected chunk key '%x', was '%x'", key, chunk.Address()) - } - if epoch != checkUpdate.Epoch { - t.Fatalf("Expected epoch to be '%s', was '%s'", epoch.String(), checkUpdate.Epoch.String()) - } - if !bytes.Equal(data, checkUpdate.data) { - t.Fatalf("Expected data '%x', was '%x'", data, checkUpdate.data) - } -} diff --git a/swarm/storage/mru/resource_sign.go b/swarm/storage/mru/resource_sign.go deleted file mode 100644 index 58196f10e98c..000000000000 --- a/swarm/storage/mru/resource_sign.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "crypto/ecdsa" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" -) - -const signatureLength = 65 - -// Signature is an alias for a static byte array with the size of a signature -type Signature [signatureLength]byte - -// Signer signs Mutable Resource update payloads -type Signer interface { - Sign(common.Hash) (Signature, error) - Address() common.Address -} - -// GenericSigner implements the Signer interface -// It is the vanilla signer that probably should be used in most cases -type GenericSigner struct { - PrivKey *ecdsa.PrivateKey - address common.Address -} - -// NewGenericSigner builds a signer that will sign everything with the provided private key -func NewGenericSigner(privKey *ecdsa.PrivateKey) *GenericSigner { - return &GenericSigner{ - PrivKey: privKey, - address: crypto.PubkeyToAddress(privKey.PublicKey), - } -} - -// Sign signs the supplied data -// It wraps the ethereum crypto.Sign() method -func (s *GenericSigner) Sign(data common.Hash) (signature Signature, err error) { - signaturebytes, err := crypto.Sign(data.Bytes(), s.PrivKey) - if err != nil { - return - } - copy(signature[:], signaturebytes) - return -} - -// Address returns the public key of the signer's private key -func (s *GenericSigner) Address() common.Address { - return s.address -} - -// getUserAddr extracts the address of the resource update signer -func getUserAddr(digest common.Hash, signature Signature) (common.Address, error) { - pub, err := crypto.SigToPub(digest.Bytes(), signature[:]) - if err != nil { - return common.Address{}, err - } - return crypto.PubkeyToAddress(*pub), nil -} diff --git a/swarm/storage/mru/testutil.go b/swarm/storage/mru/testutil.go deleted file mode 100644 index 7a5a9e4d987a..000000000000 --- a/swarm/storage/mru/testutil.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "context" - "fmt" - "path/filepath" - "sync" - - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -const ( - testDbDirName = "mru" -) - -type TestHandler struct { - *Handler -} - -func (t *TestHandler) Close() { - t.chunkStore.Close() -} - -type mockNetFetcher struct{} - -func (m *mockNetFetcher) Request(ctx context.Context, hopCount uint8) { -} -func (m *mockNetFetcher) Offer(ctx context.Context, source *enode.ID) { -} - -func newFakeNetFetcher(context.Context, storage.Address, *sync.Map) storage.NetFetcher { - return &mockNetFetcher{} -} - -// NewTestHandler creates Handler object to be used for testing purposes. -func NewTestHandler(datadir string, params *HandlerParams) (*TestHandler, error) { - path := filepath.Join(datadir, testDbDirName) - rh := NewHandler(params) - localstoreparams := storage.NewDefaultLocalStoreParams() - localstoreparams.Init(path) - localStore, err := storage.NewLocalStore(localstoreparams, nil) - if err != nil { - return nil, fmt.Errorf("localstore create fail, path %s: %v", path, err) - } - localStore.Validators = append(localStore.Validators, storage.NewContentAddressValidator(storage.MakeHashFunc(resourceHashAlgorithm))) - localStore.Validators = append(localStore.Validators, rh) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, err - } - netStore.NewNetFetcherFunc = newFakeNetFetcher - rh.SetStore(netStore) - return &TestHandler{rh}, nil -} diff --git a/swarm/storage/mru/timestampprovider.go b/swarm/storage/mru/timestampprovider.go deleted file mode 100644 index 6ac1532134d4..000000000000 --- a/swarm/storage/mru/timestampprovider.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "encoding/binary" - "encoding/json" - "time" -) - -// TimestampProvider sets the time source of the mru package -var TimestampProvider timestampProvider = NewDefaultTimestampProvider() - -// Timestamp encodes a point in time as a Unix epoch -type Timestamp struct { - Time uint64 `json:"time"` // Unix epoch timestamp, in seconds -} - -// 8 bytes uint64 Time -const timestampLength = 8 - -// timestampProvider interface describes a source of timestamp information -type timestampProvider interface { - Now() Timestamp // returns the current timestamp information -} - -// binaryGet populates the timestamp structure from the given byte slice -func (t *Timestamp) binaryGet(data []byte) error { - if len(data) != timestampLength { - return NewError(ErrCorruptData, "timestamp data has the wrong size") - } - t.Time = binary.LittleEndian.Uint64(data[:8]) - return nil -} - -// binaryPut Serializes a Timestamp to a byte slice -func (t *Timestamp) binaryPut(data []byte) error { - if len(data) != timestampLength { - return NewError(ErrCorruptData, "timestamp data has the wrong size") - } - binary.LittleEndian.PutUint64(data, t.Time) - return nil -} - -// UnmarshalJSON implements the json.Unmarshaller interface -func (t *Timestamp) UnmarshalJSON(data []byte) error { - return json.Unmarshal(data, &t.Time) -} - -// MarshalJSON implements the json.Marshaller interface -func (t *Timestamp) MarshalJSON() ([]byte, error) { - return json.Marshal(t.Time) -} - -// DefaultTimestampProvider is a TimestampProvider that uses system time -// as time source -type DefaultTimestampProvider struct { -} - -// NewDefaultTimestampProvider creates a system clock based timestamp provider -func NewDefaultTimestampProvider() *DefaultTimestampProvider { - return &DefaultTimestampProvider{} -} - -// Now returns the current time according to this provider -func (dtp *DefaultTimestampProvider) Now() Timestamp { - return Timestamp{ - Time: uint64(time.Now().Unix()), - } -} diff --git a/swarm/storage/mru/topic.go b/swarm/storage/mru/topic.go deleted file mode 100644 index f318a5593894..000000000000 --- a/swarm/storage/mru/topic.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "bytes" - "encoding/json" - "fmt" - - "github.com/ethereum/go-ethereum/common/bitutil" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -// TopicLength establishes the max length of a topic string -const TopicLength = storage.AddressLength - -// Topic represents what a resource talks about -type Topic [TopicLength]byte - -// ErrTopicTooLong is returned when creating a topic with a name/related content too long -var ErrTopicTooLong = fmt.Errorf("Topic is too long. Max length is %d", TopicLength) - -// NewTopic creates a new topic from a provided name and "related content" byte array, -// merging the two together. -// If relatedContent or name are longer than TopicLength, they will be truncated and an error returned -// name can be an empty string -// relatedContent can be nil -func NewTopic(name string, relatedContent []byte) (topic Topic, err error) { - if relatedContent != nil { - contentLength := len(relatedContent) - if contentLength > TopicLength { - contentLength = TopicLength - err = ErrTopicTooLong - } - copy(topic[:], relatedContent[:contentLength]) - } - nameBytes := []byte(name) - nameLength := len(nameBytes) - if nameLength > TopicLength { - nameLength = TopicLength - err = ErrTopicTooLong - } - bitutil.XORBytes(topic[:], topic[:], nameBytes[:nameLength]) - return topic, err -} - -// Hex will return the topic encoded as an hex string -func (t *Topic) Hex() string { - return hexutil.Encode(t[:]) -} - -// FromHex will parse a hex string into this Topic instance -func (t *Topic) FromHex(hex string) error { - bytes, err := hexutil.Decode(hex) - if err != nil || len(bytes) != len(t) { - return NewErrorf(ErrInvalidValue, "Cannot decode topic") - } - copy(t[:], bytes) - return nil -} - -// Name will try to extract the resource name out of the topic -func (t *Topic) Name(relatedContent []byte) string { - nameBytes := *t - if relatedContent != nil { - contentLength := len(relatedContent) - if contentLength > TopicLength { - contentLength = TopicLength - } - bitutil.XORBytes(nameBytes[:], t[:], relatedContent[:contentLength]) - } - z := bytes.IndexByte(nameBytes[:], 0) - if z < 0 { - z = TopicLength - } - return string(nameBytes[:z]) - -} - -// UnmarshalJSON implements the json.Unmarshaller interface -func (t *Topic) UnmarshalJSON(data []byte) error { - var hex string - json.Unmarshal(data, &hex) - return t.FromHex(hex) -} - -// MarshalJSON implements the json.Marshaller interface -func (t *Topic) MarshalJSON() ([]byte, error) { - return json.Marshal(t.Hex()) -} diff --git a/swarm/storage/mru/topic_test.go b/swarm/storage/mru/topic_test.go deleted file mode 100644 index dad7c7ddceb3..000000000000 --- a/swarm/storage/mru/topic_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package mru - -import ( - "testing" - - "github.com/ethereum/go-ethereum/common/hexutil" -) - -func TestTopic(t *testing.T) { - related, _ := hexutil.Decode("0xabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789") - topicName := "test-topic" - topic, _ := NewTopic(topicName, related) - hex := topic.Hex() - expectedHex := "0xdfa89c750e3108f9c2aeef0123456789abcdef0123456789abcdef0123456789" - if hex != expectedHex { - t.Fatalf("Expected %s, got %s", expectedHex, hex) - } - - var topic2 Topic - topic2.FromHex(hex) - if topic2 != topic { - t.Fatal("Expected recovered topic to be equal to original one") - } - - if topic2.Name(related) != topicName { - t.Fatal("Retrieved name does not match") - } - - bytes, err := topic2.MarshalJSON() - if err != nil { - t.Fatal(err) - } - expectedJSON := `"0xdfa89c750e3108f9c2aeef0123456789abcdef0123456789abcdef0123456789"` - equal, err := areEqualJSON(expectedJSON, string(bytes)) - if err != nil { - t.Fatal(err) - } - if !equal { - t.Fatalf("Expected JSON to be %s, got %s", expectedJSON, string(bytes)) - } - - err = topic2.UnmarshalJSON(bytes) - if err != nil { - t.Fatal(err) - } - if topic2 != topic { - t.Fatal("Expected recovered topic to be equal to original one") - } - -} diff --git a/swarm/storage/mru/update.go b/swarm/storage/mru/update.go deleted file mode 100644 index 6aa57fce1cf8..000000000000 --- a/swarm/storage/mru/update.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "fmt" - "strconv" - - "github.com/ethereum/go-ethereum/swarm/chunk" -) - -// ProtocolVersion defines the current version of the protocol that will be included in each update message -const ProtocolVersion uint8 = 0 - -const headerLength = 8 - -// Header defines a update message header including a protocol version byte -type Header struct { - Version uint8 // Protocol version - Padding [headerLength - 1]uint8 // reserved for future use -} - -// ResourceUpdate encapsulates the information sent as part of a resource update -type ResourceUpdate struct { - Header Header // - ID // Resource update identifying information - data []byte // actual data payload -} - -const minimumUpdateDataLength = idLength + headerLength + 1 -const maxUpdateDataLength = chunk.DefaultSize - signatureLength - idLength - headerLength - -// binaryPut serializes the resource update information into the given slice -func (r *ResourceUpdate) binaryPut(serializedData []byte) error { - datalength := len(r.data) - if datalength == 0 { - return NewError(ErrInvalidValue, "cannot update a resource with no data") - } - - if datalength > maxUpdateDataLength { - return NewErrorf(ErrInvalidValue, "data is too big (length=%d). Max length=%d", datalength, maxUpdateDataLength) - } - - if len(serializedData) != r.binaryLength() { - return NewErrorf(ErrInvalidValue, "slice passed to putBinary must be of exact size. Expected %d bytes", r.binaryLength()) - } - - var cursor int - // serialize Header - serializedData[cursor] = r.Header.Version - copy(serializedData[cursor+1:headerLength], r.Header.Padding[:headerLength-1]) - cursor += headerLength - - // serialize ID - if err := r.ID.binaryPut(serializedData[cursor : cursor+idLength]); err != nil { - return err - } - cursor += idLength - - // add the data - copy(serializedData[cursor:], r.data) - cursor += datalength - - return nil -} - -// binaryLength returns the expected number of bytes this structure will take to encode -func (r *ResourceUpdate) binaryLength() int { - return idLength + headerLength + len(r.data) -} - -// binaryGet populates this instance from the information contained in the passed byte slice -func (r *ResourceUpdate) binaryGet(serializedData []byte) error { - if len(serializedData) < minimumUpdateDataLength { - return NewErrorf(ErrNothingToReturn, "chunk less than %d bytes cannot be a resource update chunk", minimumUpdateDataLength) - } - dataLength := len(serializedData) - idLength - headerLength - // at this point we can be satisfied that we have the correct data length to read - - var cursor int - - // deserialize Header - r.Header.Version = serializedData[cursor] // extract the protocol version - copy(r.Header.Padding[:headerLength-1], serializedData[cursor+1:headerLength]) // extract the padding - cursor += headerLength - - if err := r.ID.binaryGet(serializedData[cursor : cursor+idLength]); err != nil { - return err - } - cursor += idLength - - data := serializedData[cursor : cursor+dataLength] - cursor += dataLength - - // now that all checks have passed, copy data into structure - r.data = make([]byte, dataLength) - copy(r.data, data) - - return nil - -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (r *ResourceUpdate) FromValues(values Values, data []byte) error { - r.data = data - version, _ := strconv.ParseUint(values.Get("protocolVersion"), 10, 32) - r.Header.Version = uint8(version) - return r.ID.FromValues(values) -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (r *ResourceUpdate) AppendValues(values Values) []byte { - r.ID.AppendValues(values) - values.Set("protocolVersion", fmt.Sprintf("%d", r.Header.Version)) - return r.data -} diff --git a/swarm/storage/mru/update_test.go b/swarm/storage/mru/update_test.go deleted file mode 100644 index bd706d83ae41..000000000000 --- a/swarm/storage/mru/update_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "testing" -) - -func getTestResourceUpdate() *ResourceUpdate { - return &ResourceUpdate{ - ID: *getTestID(), - data: []byte("El que lee mucho y anda mucho, ve mucho y sabe mucho"), - } -} - -func TestResourceUpdateSerializer(t *testing.T) { - testBinarySerializerRecovery(t, getTestResourceUpdate(), "0x0000000000000000776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781ce803000000000019456c20717565206c6565206d7563686f207920616e6461206d7563686f2c207665206d7563686f20792073616265206d7563686f") -} - -func TestResourceUpdateLengthCheck(t *testing.T) { - testBinarySerializerLengthCheck(t, getTestResourceUpdate()) - // Test fail if update is too big - update := getTestResourceUpdate() - update.data = make([]byte, maxUpdateDataLength+100) - serialized := make([]byte, update.binaryLength()) - if err := update.binaryPut(serialized); err == nil { - t.Fatal("Expected resourceUpdate.binaryPut to fail since update is too big") - } - - // test fail if data is empty or nil - update.data = nil - serialized = make([]byte, update.binaryLength()) - if err := update.binaryPut(serialized); err == nil { - t.Fatal("Expected resourceUpdate.binaryPut to fail since data is empty") - } -} diff --git a/swarm/storage/mru/view.go b/swarm/storage/mru/view.go deleted file mode 100644 index 2e4ce4a0bf5d..000000000000 --- a/swarm/storage/mru/view.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package mru - -import ( - "hash" - "unsafe" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -// View represents a particular user's view of a resource -type View struct { - Topic Topic `json:"topic"` - User common.Address `json:"user"` -} - -// View layout: -// TopicLength bytes -// userAddr common.AddressLength bytes -const viewLength = TopicLength + common.AddressLength - -// mapKey calculates a unique id for this view for the cache map in `Handler` -func (u *View) mapKey() uint64 { - serializedData := make([]byte, viewLength) - u.binaryPut(serializedData) - hasher := hashPool.Get().(hash.Hash) - defer hashPool.Put(hasher) - hasher.Reset() - hasher.Write(serializedData) - hash := hasher.Sum(nil) - return *(*uint64)(unsafe.Pointer(&hash[0])) -} - -// binaryPut serializes this View instance into the provided slice -func (u *View) binaryPut(serializedData []byte) error { - if len(serializedData) != viewLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize View. Expected %d, got %d", viewLength, len(serializedData)) - } - var cursor int - copy(serializedData[cursor:cursor+TopicLength], u.Topic[:TopicLength]) - cursor += TopicLength - - copy(serializedData[cursor:cursor+common.AddressLength], u.User[:]) - cursor += common.AddressLength - - return nil -} - -// binaryLength returns the expected size of this structure when serialized -func (u *View) binaryLength() int { - return viewLength -} - -// binaryGet restores the current instance from the information contained in the passed slice -func (u *View) binaryGet(serializedData []byte) error { - if len(serializedData) != viewLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to read View. Expected %d, got %d", viewLength, len(serializedData)) - } - - var cursor int - copy(u.Topic[:], serializedData[cursor:cursor+TopicLength]) - cursor += TopicLength - - copy(u.User[:], serializedData[cursor:cursor+common.AddressLength]) - cursor += common.AddressLength - - return nil -} - -// Hex serializes the View to a hex string -func (u *View) Hex() string { - serializedData := make([]byte, viewLength) - u.binaryPut(serializedData) - return hexutil.Encode(serializedData) -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (u *View) FromValues(values Values) (err error) { - topic := values.Get("topic") - if topic != "" { - if err := u.Topic.FromHex(values.Get("topic")); err != nil { - return err - } - } else { // see if the user set name and relatedcontent - name := values.Get("name") - relatedContent, _ := hexutil.Decode(values.Get("relatedcontent")) - if len(relatedContent) > 0 { - if len(relatedContent) < storage.AddressLength { - return NewErrorf(ErrInvalidValue, "relatedcontent field must be a hex-encoded byte array exactly %d bytes long", storage.AddressLength) - } - relatedContent = relatedContent[:storage.AddressLength] - } - u.Topic, err = NewTopic(name, relatedContent) - if err != nil { - return err - } - } - u.User = common.HexToAddress(values.Get("user")) - return nil -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (u *View) AppendValues(values Values) { - values.Set("topic", u.Topic.Hex()) - values.Set("user", u.User.Hex()) -} diff --git a/swarm/storage/mru/view_test.go b/swarm/storage/mru/view_test.go deleted file mode 100644 index 45720ba79948..000000000000 --- a/swarm/storage/mru/view_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package mru - -import ( - "testing" -) - -func getTestView() *View { - topic, _ := NewTopic("world news report, every hour", nil) - return &View{ - Topic: topic, - User: newCharlieSigner().Address(), - } -} - -func TestViewSerializerDeserializer(t *testing.T) { - testBinarySerializerRecovery(t, getTestView(), "0x776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781c") -} - -func TestMetadataSerializerLengthCheck(t *testing.T) { - testBinarySerializerLengthCheck(t, getTestView()) -} diff --git a/swarm/storage/netstore.go b/swarm/storage/netstore.go deleted file mode 100644 index 16bc48a9a2cd..000000000000 --- a/swarm/storage/netstore.go +++ /dev/null @@ -1,297 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "encoding/hex" - "fmt" - "sync" - "sync/atomic" - "time" - - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/log" - lru "github.com/hashicorp/golang-lru" -) - -type ( - NewNetFetcherFunc func(ctx context.Context, addr Address, peers *sync.Map) NetFetcher -) - -type NetFetcher interface { - Request(ctx context.Context, hopCount uint8) - Offer(ctx context.Context, source *enode.ID) -} - -// NetStore is an extension of local storage -// it implements the ChunkStore interface -// on request it initiates remote cloud retrieval using a fetcher -// fetchers are unique to a chunk and are stored in fetchers LRU memory cache -// fetchFuncFactory is a factory object to create a fetch function for a specific chunk address -type NetStore struct { - mu sync.Mutex - store SyncChunkStore - fetchers *lru.Cache - NewNetFetcherFunc NewNetFetcherFunc - closeC chan struct{} -} - -var fetcherTimeout = 2 * time.Minute // timeout to cancel the fetcher even if requests are coming in - -// NewNetStore creates a new NetStore object using the given local store. newFetchFunc is a -// constructor function that can create a fetch function for a specific chunk address. -func NewNetStore(store SyncChunkStore, nnf NewNetFetcherFunc) (*NetStore, error) { - fetchers, err := lru.New(defaultChunkRequestsCacheCapacity) - if err != nil { - return nil, err - } - return &NetStore{ - store: store, - fetchers: fetchers, - NewNetFetcherFunc: nnf, - closeC: make(chan struct{}), - }, nil -} - -// Put stores a chunk in localstore, and delivers to all requestor peers using the fetcher stored in -// the fetchers cache -func (n *NetStore) Put(ctx context.Context, ch Chunk) error { - n.mu.Lock() - defer n.mu.Unlock() - - // put to the chunk to the store, there should be no error - err := n.store.Put(ctx, ch) - if err != nil { - return err - } - - // if chunk is now put in the store, check if there was an active fetcher and call deliver on it - // (this delivers the chunk to requestors via the fetcher) - if f := n.getFetcher(ch.Address()); f != nil { - f.deliver(ctx, ch) - } - return nil -} - -// Get retrieves the chunk from the NetStore DPA synchronously. -// It calls NetStore.get, and if the chunk is not in local Storage -// it calls fetch with the request, which blocks until the chunk -// arrived or context is done -func (n *NetStore) Get(rctx context.Context, ref Address) (Chunk, error) { - chunk, fetch, err := n.get(rctx, ref) - if err != nil { - return nil, err - } - if chunk != nil { - return chunk, nil - } - return fetch(rctx) -} - -func (n *NetStore) BinIndex(po uint8) uint64 { - return n.store.BinIndex(po) -} - -func (n *NetStore) Iterator(from uint64, to uint64, po uint8, f func(Address, uint64) bool) error { - return n.store.Iterator(from, to, po, f) -} - -// FetchFunc returns nil if the store contains the given address. Otherwise it returns a wait function, -// which returns after the chunk is available or the context is done -func (n *NetStore) FetchFunc(ctx context.Context, ref Address) func(context.Context) error { - chunk, fetch, _ := n.get(ctx, ref) - if chunk != nil { - return nil - } - return func(ctx context.Context) error { - _, err := fetch(ctx) - return err - } -} - -// Close chunk store -func (n *NetStore) Close() { - close(n.closeC) - n.store.Close() - // TODO: loop through fetchers to cancel them -} - -// get attempts at retrieving the chunk from LocalStore -// If it is not found then using getOrCreateFetcher: -// 1. Either there is already a fetcher to retrieve it -// 2. A new fetcher is created and saved in the fetchers cache -// From here on, all Get will hit on this fetcher until the chunk is delivered -// or all fetcher contexts are done. -// It returns a chunk, a fetcher function and an error -// If chunk is nil, the returned fetch function needs to be called with a context to return the chunk. -func (n *NetStore) get(ctx context.Context, ref Address) (Chunk, func(context.Context) (Chunk, error), error) { - n.mu.Lock() - defer n.mu.Unlock() - - chunk, err := n.store.Get(ctx, ref) - if err != nil { - if err != ErrChunkNotFound { - log.Debug("Received error from LocalStore other than ErrNotFound", "err", err) - } - // The chunk is not available in the LocalStore, let's get the fetcher for it, or create a new one - // if it doesn't exist yet - f := n.getOrCreateFetcher(ref) - // If the caller needs the chunk, it has to use the returned fetch function to get it - return nil, f.Fetch, nil - } - - return chunk, nil, nil -} - -// getOrCreateFetcher attempts at retrieving an existing fetchers -// if none exists, creates one and saves it in the fetchers cache -// caller must hold the lock -func (n *NetStore) getOrCreateFetcher(ref Address) *fetcher { - if f := n.getFetcher(ref); f != nil { - return f - } - - // no fetcher for the given address, we have to create a new one - key := hex.EncodeToString(ref) - // create the context during which fetching is kept alive - ctx, cancel := context.WithTimeout(context.Background(), fetcherTimeout) - // destroy is called when all requests finish - destroy := func() { - // remove fetcher from fetchers - n.fetchers.Remove(key) - // stop fetcher by cancelling context called when - // all requests cancelled/timedout or chunk is delivered - cancel() - } - // peers always stores all the peers which have an active request for the chunk. It is shared - // between fetcher and the NewFetchFunc function. It is needed by the NewFetchFunc because - // the peers which requested the chunk should not be requested to deliver it. - peers := &sync.Map{} - - fetcher := newFetcher(ref, n.NewNetFetcherFunc(ctx, ref, peers), destroy, peers, n.closeC) - n.fetchers.Add(key, fetcher) - - return fetcher -} - -// getFetcher retrieves the fetcher for the given address from the fetchers cache if it exists, -// otherwise it returns nil -func (n *NetStore) getFetcher(ref Address) *fetcher { - key := hex.EncodeToString(ref) - f, ok := n.fetchers.Get(key) - if ok { - return f.(*fetcher) - } - return nil -} - -// RequestsCacheLen returns the current number of outgoing requests stored in the cache -func (n *NetStore) RequestsCacheLen() int { - return n.fetchers.Len() -} - -// One fetcher object is responsible to fetch one chunk for one address, and keep track of all the -// peers who have requested it and did not receive it yet. -type fetcher struct { - addr Address // address of chunk - chunk Chunk // fetcher can set the chunk on the fetcher - deliveredC chan struct{} // chan signalling chunk delivery to requests - cancelledC chan struct{} // chan signalling the fetcher has been cancelled (removed from fetchers in NetStore) - netFetcher NetFetcher // remote fetch function to be called with a request source taken from the context - cancel func() // cleanup function for the remote fetcher to call when all upstream contexts are called - peers *sync.Map // the peers which asked for the chunk - requestCnt int32 // number of requests on this chunk. If all the requests are done (delivered or context is done) the cancel function is called - deliverOnce *sync.Once // guarantees that we only close deliveredC once -} - -// newFetcher creates a new fetcher object for the fiven addr. fetch is the function which actually -// does the retrieval (in non-test cases this is coming from the network package). cancel function is -// called either -// 1. when the chunk has been fetched all peers have been either notified or their context has been done -// 2. the chunk has not been fetched but all context from all the requests has been done -// The peers map stores all the peers which have requested chunk. -func newFetcher(addr Address, nf NetFetcher, cancel func(), peers *sync.Map, closeC chan struct{}) *fetcher { - cancelOnce := &sync.Once{} // cancel should only be called once - return &fetcher{ - addr: addr, - deliveredC: make(chan struct{}), - deliverOnce: &sync.Once{}, - cancelledC: closeC, - netFetcher: nf, - cancel: func() { - cancelOnce.Do(func() { - cancel() - }) - }, - peers: peers, - } -} - -// Fetch fetches the chunk synchronously, it is called by NetStore.Get is the chunk is not available -// locally. -func (f *fetcher) Fetch(rctx context.Context) (Chunk, error) { - atomic.AddInt32(&f.requestCnt, 1) - defer func() { - // if all the requests are done the fetcher can be cancelled - if atomic.AddInt32(&f.requestCnt, -1) == 0 { - f.cancel() - } - }() - - // The peer asking for the chunk. Store in the shared peers map, but delete after the request - // has been delivered - peer := rctx.Value("peer") - if peer != nil { - f.peers.Store(peer, time.Now()) - defer f.peers.Delete(peer) - } - - // If there is a source in the context then it is an offer, otherwise a request - sourceIF := rctx.Value("source") - - hopCount, _ := rctx.Value("hopcount").(uint8) - - if sourceIF != nil { - var source enode.ID - if err := source.UnmarshalText([]byte(sourceIF.(string))); err != nil { - return nil, err - } - f.netFetcher.Offer(rctx, &source) - } else { - f.netFetcher.Request(rctx, hopCount) - } - - // wait until either the chunk is delivered or the context is done - select { - case <-rctx.Done(): - return nil, rctx.Err() - case <-f.deliveredC: - return f.chunk, nil - case <-f.cancelledC: - return nil, fmt.Errorf("fetcher cancelled") - } -} - -// deliver is called by NetStore.Put to notify all pending requests -func (f *fetcher) deliver(ctx context.Context, ch Chunk) { - f.deliverOnce.Do(func() { - f.chunk = ch - // closing the deliveredC channel will terminate ongoing requests - close(f.deliveredC) - }) -} diff --git a/swarm/storage/netstore_test.go b/swarm/storage/netstore_test.go deleted file mode 100644 index 8a09fa5ae079..000000000000 --- a/swarm/storage/netstore_test.go +++ /dev/null @@ -1,644 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "crypto/rand" - "io/ioutil" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/p2p/enode" - ch "github.com/ethereum/go-ethereum/swarm/chunk" -) - -var sourcePeerID = enode.HexID("99d8594b52298567d2ca3f4c441a5ba0140ee9245e26460d01102a52773c73b9") - -type mockNetFetcher struct { - peers *sync.Map - sources []*enode.ID - peersPerRequest [][]Address - requestCalled bool - offerCalled bool - quit <-chan struct{} - ctx context.Context - hopCounts []uint8 -} - -func (m *mockNetFetcher) Offer(ctx context.Context, source *enode.ID) { - m.offerCalled = true - m.sources = append(m.sources, source) -} - -func (m *mockNetFetcher) Request(ctx context.Context, hopCount uint8) { - m.requestCalled = true - var peers []Address - m.peers.Range(func(key interface{}, _ interface{}) bool { - peers = append(peers, common.FromHex(key.(string))) - return true - }) - m.peersPerRequest = append(m.peersPerRequest, peers) - m.hopCounts = append(m.hopCounts, hopCount) -} - -type mockNetFetchFuncFactory struct { - fetcher *mockNetFetcher -} - -func (m *mockNetFetchFuncFactory) newMockNetFetcher(ctx context.Context, _ Address, peers *sync.Map) NetFetcher { - m.fetcher.peers = peers - m.fetcher.quit = ctx.Done() - m.fetcher.ctx = ctx - return m.fetcher -} - -func mustNewNetStore(t *testing.T) *NetStore { - netStore, _ := mustNewNetStoreWithFetcher(t) - return netStore -} - -func mustNewNetStoreWithFetcher(t *testing.T) (*NetStore, *mockNetFetcher) { - t.Helper() - - datadir, err := ioutil.TempDir("", "netstore") - if err != nil { - t.Fatal(err) - } - naddr := make([]byte, 32) - params := NewDefaultLocalStoreParams() - params.Init(datadir) - params.BaseKey = naddr - localStore, err := NewTestLocalStoreForAddr(params) - if err != nil { - t.Fatal(err) - } - - fetcher := &mockNetFetcher{} - mockNetFetchFuncFactory := &mockNetFetchFuncFactory{ - fetcher: fetcher, - } - netStore, err := NewNetStore(localStore, mockNetFetchFuncFactory.newMockNetFetcher) - if err != nil { - t.Fatal(err) - } - return netStore, fetcher -} - -// TestNetStoreGetAndPut tests calling NetStore.Get which is blocked until the same chunk is Put. -// After the Put there should no active fetchers, and the context created for the fetcher should -// be cancelled. -func TestNetStoreGetAndPut(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) - defer cancel() - - c := make(chan struct{}) // this channel ensures that the gouroutine with the Put does not run earlier than the Get - go func() { - <-c // wait for the Get to be called - time.Sleep(200 * time.Millisecond) // and a little more so it is surely called - - // check if netStore created a fetcher in the Get call for the unavailable chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatal("Expected netStore to use a fetcher for the Get call") - } - - err := netStore.Put(ctx, chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - }() - - close(c) - recChunk, err := netStore.Get(ctx, chunk.Address()) // this is blocked until the Put above is done - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - // the retrieved chunk should be the same as what we Put - if !bytes.Equal(recChunk.Address(), chunk.Address()) || !bytes.Equal(recChunk.Data(), chunk.Data()) { - t.Fatalf("Different chunk received than what was put") - } - // the chunk is already available locally, so there should be no active fetchers waiting for it - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after delivery") - } - - // A fetcher was created when the Get was called (and the chunk was not available). The chunk - // was delivered with the Put call, so the fetcher should be cancelled now. - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } - -} - -// TestNetStoreGetAndPut tests calling NetStore.Put and then NetStore.Get. -// After the Put the chunk is available locally, so the Get can just retrieve it from LocalStore, -// there is no need to create fetchers. -func TestNetStoreGetAfterPut(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) - defer cancel() - - // First we Put the chunk, so the chunk will be available locally - err := netStore.Put(ctx, chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - // Get should retrieve the chunk from LocalStore, without creating fetcher - recChunk, err := netStore.Get(ctx, chunk.Address()) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - // the retrieved chunk should be the same as what we Put - if !bytes.Equal(recChunk.Address(), chunk.Address()) || !bytes.Equal(recChunk.Data(), chunk.Data()) { - t.Fatalf("Different chunk received than what was put") - } - // no fetcher offer or request should be created for a locally available chunk - if fetcher.offerCalled || fetcher.requestCalled { - t.Fatal("NetFetcher.offerCalled or requestCalled not expected to be called") - } - // no fetchers should be created for a locally available chunk - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to not have fetcher") - } - -} - -// TestNetStoreGetTimeout tests a Get call for an unavailable chunk and waits for timeout -func TestNetStoreGetTimeout(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) - defer cancel() - - c := make(chan struct{}) // this channel ensures that the gouroutine does not run earlier than the Get - go func() { - <-c // wait for the Get to be called - time.Sleep(200 * time.Millisecond) // and a little more so it is surely called - - // check if netStore created a fetcher in the Get call for the unavailable chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatal("Expected netStore to use a fetcher for the Get call") - } - }() - - close(c) - // We call Get on this chunk, which is not in LocalStore. We don't Put it at all, so there will - // be a timeout - _, err := netStore.Get(ctx, chunk.Address()) - - // Check if the timeout happened - if err != context.DeadlineExceeded { - t.Fatalf("Expected context.DeadLineExceeded err got %v", err) - } - - // A fetcher was created, check if it has been removed after timeout - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after timeout") - } - - // Check if the fetcher context has been cancelled after the timeout - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -// TestNetStoreGetCancel tests a Get call for an unavailable chunk, then cancels the context and checks -// the errors -func TestNetStoreGetCancel(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - - c := make(chan struct{}) // this channel ensures that the gouroutine with the cancel does not run earlier than the Get - go func() { - <-c // wait for the Get to be called - time.Sleep(200 * time.Millisecond) // and a little more so it is surely called - // check if netStore created a fetcher in the Get call for the unavailable chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatal("Expected netStore to use a fetcher for the Get call") - } - cancel() - }() - - close(c) - // We call Get with an unavailable chunk, so it will create a fetcher and wait for delivery - _, err := netStore.Get(ctx, chunk.Address()) - - // After the context is cancelled above Get should return with an error - if err != context.Canceled { - t.Fatalf("Expected context.Canceled err got %v", err) - } - - // A fetcher was created, check if it has been removed after cancel - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after cancel") - } - - // Check if the fetcher context has been cancelled after the request context cancel - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -// TestNetStoreMultipleGetAndPut tests four Get calls for the same unavailable chunk. The chunk is -// delivered with a Put, we have to make sure all Get calls return, and they use a single fetcher -// for the chunk retrieval -func TestNetStoreMultipleGetAndPut(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) - defer cancel() - - go func() { - // sleep to make sure Put is called after all the Get - time.Sleep(500 * time.Millisecond) - // check if netStore created exactly one fetcher for all Get calls - if netStore.fetchers.Len() != 1 { - t.Fatal("Expected netStore to use one fetcher for all Get calls") - } - err := netStore.Put(ctx, chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - }() - - // call Get 4 times for the same unavailable chunk. The calls will be blocked until the Put above. - getWG := sync.WaitGroup{} - for i := 0; i < 4; i++ { - getWG.Add(1) - go func() { - defer getWG.Done() - recChunk, err := netStore.Get(ctx, chunk.Address()) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - if !bytes.Equal(recChunk.Address(), chunk.Address()) || !bytes.Equal(recChunk.Data(), chunk.Data()) { - t.Fatalf("Different chunk received than what was put") - } - }() - } - - finishedC := make(chan struct{}) - go func() { - getWG.Wait() - close(finishedC) - }() - - // The Get calls should return after Put, so no timeout expected - select { - case <-finishedC: - case <-time.After(1 * time.Second): - t.Fatalf("Timeout waiting for Get calls to return") - } - - // A fetcher was created, check if it has been removed after cancel - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after delivery") - } - - // A fetcher was created, check if it has been removed after delivery - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } - -} - -// TestNetStoreFetchFuncTimeout tests a FetchFunc call for an unavailable chunk and waits for timeout -func TestNetStoreFetchFuncTimeout(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) - defer cancel() - - // FetchFunc is called for an unavaible chunk, so the returned wait function should not be nil - wait := netStore.FetchFunc(ctx, chunk.Address()) - if wait == nil { - t.Fatal("Expected wait function to be not nil") - } - - // There should an active fetcher for the chunk after the FetchFunc call - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatalf("Expected netStore to have one fetcher for the requested chunk") - } - - // wait function should timeout because we don't deliver the chunk with a Put - err := wait(ctx) - if err != context.DeadlineExceeded { - t.Fatalf("Expected context.DeadLineExceeded err got %v", err) - } - - // the fetcher should be removed after timeout - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after timeout") - } - - // the fetcher context should be cancelled after timeout - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -// TestNetStoreFetchFuncAfterPut tests that the FetchFunc should return nil for a locally available chunk -func TestNetStoreFetchFuncAfterPut(t *testing.T) { - netStore := mustNewNetStore(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - defer cancel() - - // We deliver the created the chunk with a Put - err := netStore.Put(ctx, chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - // FetchFunc should return nil, because the chunk is available locally, no need to fetch it - wait := netStore.FetchFunc(ctx, chunk.Address()) - if wait != nil { - t.Fatal("Expected wait to be nil") - } - - // No fetchers should be created at all - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to not have fetcher") - } -} - -// TestNetStoreGetCallsRequest tests if Get created a request on the NetFetcher for an unavailable chunk -func TestNetStoreGetCallsRequest(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx := context.WithValue(context.Background(), "hopcount", uint8(5)) - ctx, cancel := context.WithTimeout(ctx, 200*time.Millisecond) - defer cancel() - - // We call get for a not available chunk, it will timeout because the chunk is not delivered - _, err := netStore.Get(ctx, chunk.Address()) - - if err != context.DeadlineExceeded { - t.Fatalf("Expected context.DeadlineExceeded err got %v", err) - } - - // NetStore should call NetFetcher.Request and wait for the chunk - if !fetcher.requestCalled { - t.Fatal("Expected NetFetcher.Request to be called") - } - - if fetcher.hopCounts[0] != 5 { - t.Fatalf("Expected NetFetcher.Request be called with hopCount 5, got %v", fetcher.hopCounts[0]) - } -} - -// TestNetStoreGetCallsOffer tests if Get created a request on the NetFetcher for an unavailable chunk -// in case of a source peer provided in the context. -func TestNetStoreGetCallsOffer(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - // If a source peer is added to the context, NetStore will handle it as an offer - ctx := context.WithValue(context.Background(), "source", sourcePeerID.String()) - ctx, cancel := context.WithTimeout(ctx, 200*time.Millisecond) - defer cancel() - - // We call get for a not available chunk, it will timeout because the chunk is not delivered - chunk, err := netStore.Get(ctx, chunk.Address()) - - if err != context.DeadlineExceeded { - t.Fatalf("Expect error %v got %v", context.DeadlineExceeded, err) - } - - // NetStore should call NetFetcher.Offer with the source peer - if !fetcher.offerCalled { - t.Fatal("Expected NetFetcher.Request to be called") - } - - if len(fetcher.sources) != 1 { - t.Fatalf("Expected fetcher sources length 1 got %v", len(fetcher.sources)) - } - - if fetcher.sources[0].String() != sourcePeerID.String() { - t.Fatalf("Expected fetcher source %v got %v", sourcePeerID, fetcher.sources[0]) - } - -} - -// TestNetStoreFetcherCountPeers tests multiple NetStore.Get calls with peer in the context. -// There is no Put call, so the Get calls timeout -func TestNetStoreFetcherCountPeers(t *testing.T) { - - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - addr := randomAddr() - peers := []string{randomAddr().Hex(), randomAddr().Hex(), randomAddr().Hex()} - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - defer cancel() - errC := make(chan error) - nrGets := 3 - - // Call Get 3 times with a peer in context - for i := 0; i < nrGets; i++ { - peer := peers[i] - go func() { - ctx := context.WithValue(ctx, "peer", peer) - _, err := netStore.Get(ctx, addr) - errC <- err - }() - } - - // All 3 Get calls should timeout - for i := 0; i < nrGets; i++ { - err := <-errC - if err != context.DeadlineExceeded { - t.Fatalf("Expected \"%v\" error got \"%v\"", context.DeadlineExceeded, err) - } - } - - // fetcher should be closed after timeout - select { - case <-fetcher.quit: - case <-time.After(3 * time.Second): - t.Fatalf("mockNetFetcher not closed after timeout") - } - - // All 3 peers should be given to NetFetcher after the 3 Get calls - if len(fetcher.peersPerRequest) != nrGets { - t.Fatalf("Expected 3 got %v", len(fetcher.peersPerRequest)) - } - - for i, peers := range fetcher.peersPerRequest { - if len(peers) < i+1 { - t.Fatalf("Expected at least %v got %v", i+1, len(peers)) - } - } -} - -// TestNetStoreFetchFuncCalledMultipleTimes calls the wait function given by FetchFunc three times, -// and checks there is still exactly one fetcher for one chunk. Afthe chunk is delivered, it checks -// if the fetcher is closed. -func TestNetStoreFetchFuncCalledMultipleTimes(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) - defer cancel() - - // FetchFunc should return a non-nil wait function, because the chunk is not available - wait := netStore.FetchFunc(ctx, chunk.Address()) - if wait == nil { - t.Fatal("Expected wait function to be not nil") - } - - // There should be exactly one fetcher for the chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatalf("Expected netStore to have one fetcher for the requested chunk") - } - - // Call wait three times parallelly - wg := sync.WaitGroup{} - for i := 0; i < 3; i++ { - wg.Add(1) - go func() { - err := wait(ctx) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - wg.Done() - }() - } - - // sleep a little so the wait functions are called above - time.Sleep(100 * time.Millisecond) - - // there should be still only one fetcher, because all wait calls are for the same chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatal("Expected netStore to have one fetcher for the requested chunk") - } - - // Deliver the chunk with a Put - err := netStore.Put(ctx, chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - // wait until all wait calls return (because the chunk is delivered) - wg.Wait() - - // There should be no more fetchers for the delivered chunk - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after delivery") - } - - // The context for the fetcher should be cancelled after delivery - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -// TestNetStoreFetcherLifeCycleWithTimeout is similar to TestNetStoreFetchFuncCalledMultipleTimes, -// the only difference is that we don't deilver the chunk, just wait for timeout -func TestNetStoreFetcherLifeCycleWithTimeout(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - defer cancel() - - // FetchFunc should return a non-nil wait function, because the chunk is not available - wait := netStore.FetchFunc(ctx, chunk.Address()) - if wait == nil { - t.Fatal("Expected wait function to be not nil") - } - - // There should be exactly one fetcher for the chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatalf("Expected netStore to have one fetcher for the requested chunk") - } - - // Call wait three times parallelly - wg := sync.WaitGroup{} - for i := 0; i < 3; i++ { - wg.Add(1) - go func() { - defer wg.Done() - rctx, rcancel := context.WithTimeout(context.Background(), 100*time.Millisecond) - defer rcancel() - err := wait(rctx) - if err != context.DeadlineExceeded { - t.Fatalf("Expected err %v got %v", context.DeadlineExceeded, err) - } - }() - } - - // wait until all wait calls timeout - wg.Wait() - - // There should be no more fetchers after timeout - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after delivery") - } - - // The context for the fetcher should be cancelled after timeout - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -func randomAddr() Address { - addr := make([]byte, 32) - rand.Read(addr) - return Address(addr) -} diff --git a/swarm/storage/pyramid.go b/swarm/storage/pyramid.go deleted file mode 100644 index f74eef06bce3..000000000000 --- a/swarm/storage/pyramid.go +++ /dev/null @@ -1,706 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "encoding/binary" - "errors" - "io" - "io/ioutil" - "sync" - "time" - - ch "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/log" -) - -/* - The main idea of a pyramid chunker is to process the input data without knowing the entire size apriori. - For this to be achieved, the chunker tree is built from the ground up until the data is exhausted. - This opens up new aveneus such as easy append and other sort of modifications to the tree thereby avoiding - duplication of data chunks. - - - Below is an example of a two level chunks tree. The leaf chunks are called data chunks and all the above - chunks are called tree chunks. The tree chunk above data chunks is level 0 and so on until it reaches - the root tree chunk. - - - - T10 <- Tree chunk lvl1 - | - __________________________|_____________________________ - / | | \ - / | \ \ - __T00__ ___T01__ ___T02__ ___T03__ <- Tree chunks lvl 0 - / / \ / / \ / / \ / / \ - / / \ / / \ / / \ / / \ - D1 D2 ... D128 D1 D2 ... D128 D1 D2 ... D128 D1 D2 ... D128 <- Data Chunks - - - The split function continuously read the data and creates data chunks and send them to storage. - When certain no of data chunks are created (defaultBranches), a signal is sent to create a tree - entry. When the level 0 tree entries reaches certain threshold (defaultBranches), another signal - is sent to a tree entry one level up.. and so on... until only the data is exhausted AND only one - tree entry is present in certain level. The key of tree entry is given out as the rootAddress of the file. - -*/ - -var ( - errLoadingTreeRootChunk = errors.New("LoadTree Error: Could not load root chunk") - errLoadingTreeChunk = errors.New("LoadTree Error: Could not load chunk") -) - -const ( - ChunkProcessors = 8 - splitTimeout = time.Minute * 5 -) - -const ( - DataChunk = 0 - TreeChunk = 1 -) - -type PyramidSplitterParams struct { - SplitterParams - getter Getter -} - -func NewPyramidSplitterParams(addr Address, reader io.Reader, putter Putter, getter Getter, chunkSize int64) *PyramidSplitterParams { - hashSize := putter.RefSize() - return &PyramidSplitterParams{ - SplitterParams: SplitterParams{ - ChunkerParams: ChunkerParams{ - chunkSize: chunkSize, - hashSize: hashSize, - }, - reader: reader, - putter: putter, - addr: addr, - }, - getter: getter, - } -} - -/* - When splitting, data is given as a SectionReader, and the key is a hashSize long byte slice (Address), the root hash of the entire content will fill this once processing finishes. - New chunks to store are store using the putter which the caller provides. -*/ -func PyramidSplit(ctx context.Context, reader io.Reader, putter Putter, getter Getter) (Address, func(context.Context) error, error) { - return NewPyramidSplitter(NewPyramidSplitterParams(nil, reader, putter, getter, ch.DefaultSize)).Split(ctx) -} - -func PyramidAppend(ctx context.Context, addr Address, reader io.Reader, putter Putter, getter Getter) (Address, func(context.Context) error, error) { - return NewPyramidSplitter(NewPyramidSplitterParams(addr, reader, putter, getter, ch.DefaultSize)).Append(ctx) -} - -// Entry to create a tree node -type TreeEntry struct { - level int - branchCount int64 - subtreeSize uint64 - chunk []byte - key []byte - index int // used in append to indicate the index of existing tree entry - updatePending bool // indicates if the entry is loaded from existing tree -} - -func NewTreeEntry(pyramid *PyramidChunker) *TreeEntry { - return &TreeEntry{ - level: 0, - branchCount: 0, - subtreeSize: 0, - chunk: make([]byte, pyramid.chunkSize+8), - key: make([]byte, pyramid.hashSize), - index: 0, - updatePending: false, - } -} - -// Used by the hash processor to create a data/tree chunk and send to storage -type chunkJob struct { - key Address - chunk []byte - parentWg *sync.WaitGroup -} - -type PyramidChunker struct { - chunkSize int64 - hashSize int64 - branches int64 - reader io.Reader - putter Putter - getter Getter - key Address - workerCount int64 - workerLock sync.RWMutex - jobC chan *chunkJob - wg *sync.WaitGroup - errC chan error - quitC chan bool - rootAddress []byte - chunkLevel [][]*TreeEntry -} - -func NewPyramidSplitter(params *PyramidSplitterParams) (pc *PyramidChunker) { - pc = &PyramidChunker{} - pc.reader = params.reader - pc.hashSize = params.hashSize - pc.branches = params.chunkSize / pc.hashSize - pc.chunkSize = pc.hashSize * pc.branches - pc.putter = params.putter - pc.getter = params.getter - pc.key = params.addr - pc.workerCount = 0 - pc.jobC = make(chan *chunkJob, 2*ChunkProcessors) - pc.wg = &sync.WaitGroup{} - pc.errC = make(chan error) - pc.quitC = make(chan bool) - pc.rootAddress = make([]byte, pc.hashSize) - pc.chunkLevel = make([][]*TreeEntry, pc.branches) - return -} - -func (pc *PyramidChunker) Join(addr Address, getter Getter, depth int) LazySectionReader { - return &LazyChunkReader{ - addr: addr, - depth: depth, - chunkSize: pc.chunkSize, - branches: pc.branches, - hashSize: pc.hashSize, - getter: getter, - } -} - -func (pc *PyramidChunker) incrementWorkerCount() { - pc.workerLock.Lock() - defer pc.workerLock.Unlock() - pc.workerCount += 1 -} - -func (pc *PyramidChunker) getWorkerCount() int64 { - pc.workerLock.Lock() - defer pc.workerLock.Unlock() - return pc.workerCount -} - -func (pc *PyramidChunker) decrementWorkerCount() { - pc.workerLock.Lock() - defer pc.workerLock.Unlock() - pc.workerCount -= 1 -} - -func (pc *PyramidChunker) Split(ctx context.Context) (k Address, wait func(context.Context) error, err error) { - log.Debug("pyramid.chunker: Split()") - - pc.wg.Add(1) - pc.prepareChunks(ctx, false) - - // closes internal error channel if all subprocesses in the workgroup finished - go func() { - - // waiting for all chunks to finish - pc.wg.Wait() - - //We close errC here because this is passed down to 8 parallel routines underneath. - // if a error happens in one of them.. that particular routine raises error... - // once they all complete successfully, the control comes back and we can safely close this here. - close(pc.errC) - }() - - defer close(pc.quitC) - defer pc.putter.Close() - - select { - case err := <-pc.errC: - if err != nil { - return nil, nil, err - } - case <-ctx.Done(): - _ = pc.putter.Wait(ctx) //??? - return nil, nil, ctx.Err() - } - return pc.rootAddress, pc.putter.Wait, nil - -} - -func (pc *PyramidChunker) Append(ctx context.Context) (k Address, wait func(context.Context) error, err error) { - log.Debug("pyramid.chunker: Append()") - // Load the right most unfinished tree chunks in every level - pc.loadTree(ctx) - - pc.wg.Add(1) - pc.prepareChunks(ctx, true) - - // closes internal error channel if all subprocesses in the workgroup finished - go func() { - - // waiting for all chunks to finish - pc.wg.Wait() - - close(pc.errC) - }() - - defer close(pc.quitC) - defer pc.putter.Close() - - select { - case err := <-pc.errC: - if err != nil { - return nil, nil, err - } - case <-time.NewTimer(splitTimeout).C: - } - - return pc.rootAddress, pc.putter.Wait, nil - -} - -func (pc *PyramidChunker) processor(ctx context.Context, id int64) { - defer pc.decrementWorkerCount() - for { - select { - - case job, ok := <-pc.jobC: - if !ok { - return - } - pc.processChunk(ctx, id, job) - case <-pc.quitC: - return - } - } -} - -func (pc *PyramidChunker) processChunk(ctx context.Context, id int64, job *chunkJob) { - log.Debug("pyramid.chunker: processChunk()", "id", id) - - ref, err := pc.putter.Put(ctx, job.chunk) - if err != nil { - select { - case pc.errC <- err: - case <-pc.quitC: - } - } - - // report hash of this chunk one level up (keys corresponds to the proper subslice of the parent chunk) - copy(job.key, ref) - - // send off new chunk to storage - job.parentWg.Done() -} - -func (pc *PyramidChunker) loadTree(ctx context.Context) error { - log.Debug("pyramid.chunker: loadTree()") - // Get the root chunk to get the total size - chunkData, err := pc.getter.Get(ctx, Reference(pc.key)) - if err != nil { - return errLoadingTreeRootChunk - } - chunkSize := int64(chunkData.Size()) - log.Trace("pyramid.chunker: root chunk", "chunk.Size", chunkSize, "pc.chunkSize", pc.chunkSize) - - //if data size is less than a chunk... add a parent with update as pending - if chunkSize <= pc.chunkSize { - newEntry := &TreeEntry{ - level: 0, - branchCount: 1, - subtreeSize: uint64(chunkSize), - chunk: make([]byte, pc.chunkSize+8), - key: make([]byte, pc.hashSize), - index: 0, - updatePending: true, - } - copy(newEntry.chunk[8:], pc.key) - pc.chunkLevel[0] = append(pc.chunkLevel[0], newEntry) - return nil - } - - var treeSize int64 - var depth int - treeSize = pc.chunkSize - for ; treeSize < chunkSize; treeSize *= pc.branches { - depth++ - } - log.Trace("pyramid.chunker", "depth", depth) - - // Add the root chunk entry - branchCount := int64(len(chunkData)-8) / pc.hashSize - newEntry := &TreeEntry{ - level: depth - 1, - branchCount: branchCount, - subtreeSize: uint64(chunkSize), - chunk: chunkData, - key: pc.key, - index: 0, - updatePending: true, - } - pc.chunkLevel[depth-1] = append(pc.chunkLevel[depth-1], newEntry) - - // Add the rest of the tree - for lvl := depth - 1; lvl >= 1; lvl-- { - - //TODO(jmozah): instead of loading finished branches and then trim in the end, - //avoid loading them in the first place - for _, ent := range pc.chunkLevel[lvl] { - branchCount = int64(len(ent.chunk)-8) / pc.hashSize - for i := int64(0); i < branchCount; i++ { - key := ent.chunk[8+(i*pc.hashSize) : 8+((i+1)*pc.hashSize)] - newChunkData, err := pc.getter.Get(ctx, Reference(key)) - if err != nil { - return errLoadingTreeChunk - } - newChunkSize := newChunkData.Size() - bewBranchCount := int64(len(newChunkData)-8) / pc.hashSize - newEntry := &TreeEntry{ - level: lvl - 1, - branchCount: bewBranchCount, - subtreeSize: newChunkSize, - chunk: newChunkData, - key: key, - index: 0, - updatePending: true, - } - pc.chunkLevel[lvl-1] = append(pc.chunkLevel[lvl-1], newEntry) - - } - - // We need to get only the right most unfinished branch.. so trim all finished branches - if int64(len(pc.chunkLevel[lvl-1])) >= pc.branches { - pc.chunkLevel[lvl-1] = nil - } - } - } - - return nil -} - -func (pc *PyramidChunker) prepareChunks(ctx context.Context, isAppend bool) { - log.Debug("pyramid.chunker: prepareChunks", "isAppend", isAppend) - defer pc.wg.Done() - - chunkWG := &sync.WaitGroup{} - - pc.incrementWorkerCount() - - go pc.processor(ctx, pc.workerCount) - - parent := NewTreeEntry(pc) - var unfinishedChunkData ChunkData - var unfinishedChunkSize uint64 - - if isAppend && len(pc.chunkLevel[0]) != 0 { - lastIndex := len(pc.chunkLevel[0]) - 1 - ent := pc.chunkLevel[0][lastIndex] - - if ent.branchCount < pc.branches { - parent = &TreeEntry{ - level: 0, - branchCount: ent.branchCount, - subtreeSize: ent.subtreeSize, - chunk: ent.chunk, - key: ent.key, - index: lastIndex, - updatePending: true, - } - - lastBranch := parent.branchCount - 1 - lastAddress := parent.chunk[8+lastBranch*pc.hashSize : 8+(lastBranch+1)*pc.hashSize] - - var err error - unfinishedChunkData, err = pc.getter.Get(ctx, lastAddress) - if err != nil { - pc.errC <- err - } - unfinishedChunkSize = unfinishedChunkData.Size() - if unfinishedChunkSize < uint64(pc.chunkSize) { - parent.subtreeSize = parent.subtreeSize - unfinishedChunkSize - parent.branchCount = parent.branchCount - 1 - } else { - unfinishedChunkData = nil - } - } - } - - for index := 0; ; index++ { - var err error - chunkData := make([]byte, pc.chunkSize+8) - - var readBytes int - - if unfinishedChunkData != nil { - copy(chunkData, unfinishedChunkData) - readBytes += int(unfinishedChunkSize) - unfinishedChunkData = nil - log.Trace("pyramid.chunker: found unfinished chunk", "readBytes", readBytes) - } - - var res []byte - res, err = ioutil.ReadAll(io.LimitReader(pc.reader, int64(len(chunkData)-(8+readBytes)))) - - // hack for ioutil.ReadAll: - // a successful call to ioutil.ReadAll returns err == nil, not err == EOF, whereas we - // want to propagate the io.EOF error - if len(res) == 0 && err == nil { - err = io.EOF - } - copy(chunkData[8+readBytes:], res) - - readBytes += len(res) - log.Trace("pyramid.chunker: copied all data", "readBytes", readBytes) - - if err != nil { - if err == io.EOF || err == io.ErrUnexpectedEOF { - - pc.cleanChunkLevels() - - // Check if we are appending or the chunk is the only one. - if parent.branchCount == 1 && (pc.depth() == 0 || isAppend) { - // Data is exactly one chunk.. pick the last chunk key as root - chunkWG.Wait() - lastChunksAddress := parent.chunk[8 : 8+pc.hashSize] - copy(pc.rootAddress, lastChunksAddress) - break - } - } else { - close(pc.quitC) - break - } - } - - // Data ended in chunk boundary.. just signal to start bulding tree - if readBytes == 0 { - pc.buildTree(isAppend, parent, chunkWG, true, nil) - break - } else { - pkey := pc.enqueueDataChunk(chunkData, uint64(readBytes), parent, chunkWG) - - // update tree related parent data structures - parent.subtreeSize += uint64(readBytes) - parent.branchCount++ - - // Data got exhausted... signal to send any parent tree related chunks - if int64(readBytes) < pc.chunkSize { - - pc.cleanChunkLevels() - - // only one data chunk .. so dont add any parent chunk - if parent.branchCount <= 1 { - chunkWG.Wait() - - if isAppend || pc.depth() == 0 { - // No need to build the tree if the depth is 0 - // or we are appending. - // Just use the last key. - copy(pc.rootAddress, pkey) - } else { - // We need to build the tree and and provide the lonely - // chunk key to replace the last tree chunk key. - pc.buildTree(isAppend, parent, chunkWG, true, pkey) - } - break - } - - pc.buildTree(isAppend, parent, chunkWG, true, nil) - break - } - - if parent.branchCount == pc.branches { - pc.buildTree(isAppend, parent, chunkWG, false, nil) - parent = NewTreeEntry(pc) - } - - } - - workers := pc.getWorkerCount() - if int64(len(pc.jobC)) > workers && workers < ChunkProcessors { - pc.incrementWorkerCount() - go pc.processor(ctx, pc.workerCount) - } - - } - -} - -func (pc *PyramidChunker) buildTree(isAppend bool, ent *TreeEntry, chunkWG *sync.WaitGroup, last bool, lonelyChunkKey []byte) { - chunkWG.Wait() - pc.enqueueTreeChunk(ent, chunkWG, last) - - compress := false - endLvl := pc.branches - for lvl := int64(0); lvl < pc.branches; lvl++ { - lvlCount := int64(len(pc.chunkLevel[lvl])) - if lvlCount >= pc.branches { - endLvl = lvl + 1 - compress = true - break - } - } - - if !compress && !last { - return - } - - // Wait for all the keys to be processed before compressing the tree - chunkWG.Wait() - - for lvl := int64(ent.level); lvl < endLvl; lvl++ { - - lvlCount := int64(len(pc.chunkLevel[lvl])) - if lvlCount == 1 && last { - copy(pc.rootAddress, pc.chunkLevel[lvl][0].key) - return - } - - for startCount := int64(0); startCount < lvlCount; startCount += pc.branches { - - endCount := startCount + pc.branches - if endCount > lvlCount { - endCount = lvlCount - } - - var nextLvlCount int64 - var tempEntry *TreeEntry - if len(pc.chunkLevel[lvl+1]) > 0 { - nextLvlCount = int64(len(pc.chunkLevel[lvl+1]) - 1) - tempEntry = pc.chunkLevel[lvl+1][nextLvlCount] - } - if isAppend && tempEntry != nil && tempEntry.updatePending { - updateEntry := &TreeEntry{ - level: int(lvl + 1), - branchCount: 0, - subtreeSize: 0, - chunk: make([]byte, pc.chunkSize+8), - key: make([]byte, pc.hashSize), - index: int(nextLvlCount), - updatePending: true, - } - for index := int64(0); index < lvlCount; index++ { - updateEntry.branchCount++ - updateEntry.subtreeSize += pc.chunkLevel[lvl][index].subtreeSize - copy(updateEntry.chunk[8+(index*pc.hashSize):8+((index+1)*pc.hashSize)], pc.chunkLevel[lvl][index].key[:pc.hashSize]) - } - - pc.enqueueTreeChunk(updateEntry, chunkWG, last) - - } else { - - noOfBranches := endCount - startCount - newEntry := &TreeEntry{ - level: int(lvl + 1), - branchCount: noOfBranches, - subtreeSize: 0, - chunk: make([]byte, (noOfBranches*pc.hashSize)+8), - key: make([]byte, pc.hashSize), - index: int(nextLvlCount), - updatePending: false, - } - - index := int64(0) - for i := startCount; i < endCount; i++ { - entry := pc.chunkLevel[lvl][i] - newEntry.subtreeSize += entry.subtreeSize - copy(newEntry.chunk[8+(index*pc.hashSize):8+((index+1)*pc.hashSize)], entry.key[:pc.hashSize]) - index++ - } - // Lonely chunk key is the key of the last chunk that is only one on the last branch. - // In this case, ignore the its tree chunk key and replace it with the lonely chunk key. - if lonelyChunkKey != nil { - // Overwrite the last tree chunk key with the lonely data chunk key. - copy(newEntry.chunk[int64(len(newEntry.chunk))-pc.hashSize:], lonelyChunkKey[:pc.hashSize]) - } - - pc.enqueueTreeChunk(newEntry, chunkWG, last) - - } - - } - - if !isAppend { - chunkWG.Wait() - if compress { - pc.chunkLevel[lvl] = nil - } - } - } - -} - -func (pc *PyramidChunker) enqueueTreeChunk(ent *TreeEntry, chunkWG *sync.WaitGroup, last bool) { - if ent != nil && ent.branchCount > 0 { - - // wait for data chunks to get over before processing the tree chunk - if last { - chunkWG.Wait() - } - - binary.LittleEndian.PutUint64(ent.chunk[:8], ent.subtreeSize) - ent.key = make([]byte, pc.hashSize) - chunkWG.Add(1) - select { - case pc.jobC <- &chunkJob{ent.key, ent.chunk[:ent.branchCount*pc.hashSize+8], chunkWG}: - case <-pc.quitC: - } - - // Update or append based on weather it is a new entry or being reused - if ent.updatePending { - chunkWG.Wait() - pc.chunkLevel[ent.level][ent.index] = ent - } else { - pc.chunkLevel[ent.level] = append(pc.chunkLevel[ent.level], ent) - } - - } -} - -func (pc *PyramidChunker) enqueueDataChunk(chunkData []byte, size uint64, parent *TreeEntry, chunkWG *sync.WaitGroup) Address { - binary.LittleEndian.PutUint64(chunkData[:8], size) - pkey := parent.chunk[8+parent.branchCount*pc.hashSize : 8+(parent.branchCount+1)*pc.hashSize] - - chunkWG.Add(1) - select { - case pc.jobC <- &chunkJob{pkey, chunkData[:size+8], chunkWG}: - case <-pc.quitC: - } - - return pkey - -} - -// depth returns the number of chunk levels. -// It is used to detect if there is only one data chunk -// left for the last branch. -func (pc *PyramidChunker) depth() (d int) { - for _, l := range pc.chunkLevel { - if l == nil { - return - } - d++ - } - return -} - -// cleanChunkLevels removes gaps (nil levels) between chunk levels -// that are not nil. -func (pc *PyramidChunker) cleanChunkLevels() { - for i, l := range pc.chunkLevel { - if l == nil { - pc.chunkLevel = append(pc.chunkLevel[:i], append(pc.chunkLevel[i+1:], nil)...) - } - } -} diff --git a/swarm/storage/swarmhasher.go b/swarm/storage/swarmhasher.go deleted file mode 100644 index fae03f0c72fe..000000000000 --- a/swarm/storage/swarmhasher.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "hash" -) - -const ( - BMTHash = "BMT" - SHA3Hash = "SHA3" // http://golang.org/pkg/hash/#Hash - DefaultHash = BMTHash -) - -type SwarmHash interface { - hash.Hash - ResetWithLength([]byte) -} - -type HashWithLength struct { - hash.Hash -} - -func (h *HashWithLength) ResetWithLength(length []byte) { - h.Reset() - h.Write(length) -} diff --git a/swarm/storage/types.go b/swarm/storage/types.go deleted file mode 100644 index 8c70f458482b..000000000000 --- a/swarm/storage/types.go +++ /dev/null @@ -1,394 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "crypto" - "crypto/rand" - "encoding/binary" - "fmt" - "hash" - "io" - "io/ioutil" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/sha3" - "github.com/ethereum/go-ethereum/swarm/bmt" - ch "github.com/ethereum/go-ethereum/swarm/chunk" -) - -const MaxPO = 16 -const AddressLength = 32 - -type Hasher func() hash.Hash -type SwarmHasher func() SwarmHash - -// Peer is the recorded as Source on the chunk -// should probably not be here? but network should wrap chunk object -type Peer interface{} - -type Address []byte - -func (a Address) Size() uint { - return uint(len(a)) -} - -func (a Address) isEqual(y Address) bool { - return bytes.Equal(a, y) -} - -func (a Address) bits(i, j uint) uint { - ii := i >> 3 - jj := i & 7 - if ii >= a.Size() { - return 0 - } - - if jj+j <= 8 { - return uint((a[ii] >> jj) & ((1 << j) - 1)) - } - - res := uint(a[ii] >> jj) - jj = 8 - jj - j -= jj - for j != 0 { - ii++ - if j < 8 { - res += uint(a[ii]&((1< len(one) { - b = len(one) - } - m := 8 - for i := 0; i < b; i++ { - oxo := one[i] ^ other[i] - if i == b-1 { - m = MaxPO % 8 - } - for j := 0; j < m; j++ { - if (oxo>>uint8(7-j))&0x01 != 0 { - return i*8 + j - } - } - } - return MaxPO -} - -func IsZeroAddr(addr Address) bool { - return len(addr) == 0 || bytes.Equal(addr, ZeroAddr) -} - -var ZeroAddr = Address(common.Hash{}.Bytes()) - -func MakeHashFunc(hash string) SwarmHasher { - switch hash { - case "SHA256": - return func() SwarmHash { return &HashWithLength{crypto.SHA256.New()} } - case "SHA3": - return func() SwarmHash { return &HashWithLength{sha3.NewKeccak256()} } - case "BMT": - return func() SwarmHash { - hasher := sha3.NewKeccak256 - hasherSize := hasher().Size() - segmentCount := ch.DefaultSize / hasherSize - pool := bmt.NewTreePool(hasher, segmentCount, bmt.PoolSize) - return bmt.New(pool) - } - } - return nil -} - -func (a Address) Hex() string { - return fmt.Sprintf("%064x", []byte(a[:])) -} - -func (a Address) Log() string { - if len(a[:]) < 8 { - return fmt.Sprintf("%x", []byte(a[:])) - } - return fmt.Sprintf("%016x", []byte(a[:8])) -} - -func (a Address) String() string { - return fmt.Sprintf("%064x", []byte(a)) -} - -func (a Address) MarshalJSON() (out []byte, err error) { - return []byte(`"` + a.String() + `"`), nil -} - -func (a *Address) UnmarshalJSON(value []byte) error { - s := string(value) - *a = make([]byte, 32) - h := common.Hex2Bytes(s[1 : len(s)-1]) - copy(*a, h) - return nil -} - -type AddressCollection []Address - -func NewAddressCollection(l int) AddressCollection { - return make(AddressCollection, l) -} - -func (c AddressCollection) Len() int { - return len(c) -} - -func (c AddressCollection) Less(i, j int) bool { - return bytes.Compare(c[i], c[j]) == -1 -} - -func (c AddressCollection) Swap(i, j int) { - c[i], c[j] = c[j], c[i] -} - -// Chunk interface implemented by context.Contexts and data chunks -type Chunk interface { - Address() Address - Payload() []byte - SpanBytes() []byte - Span() int64 - Data() []byte -} - -type chunk struct { - addr Address - sdata []byte - span int64 -} - -func NewChunk(addr Address, data []byte) *chunk { - return &chunk{ - addr: addr, - sdata: data, - span: -1, - } -} - -func (c *chunk) Address() Address { - return c.addr -} - -func (c *chunk) SpanBytes() []byte { - return c.sdata[:8] -} - -func (c *chunk) Span() int64 { - if c.span == -1 { - c.span = int64(binary.LittleEndian.Uint64(c.sdata[:8])) - } - return c.span -} - -func (c *chunk) Data() []byte { - return c.sdata -} - -func (c *chunk) Payload() []byte { - return c.sdata[8:] -} - -// String() for pretty printing -func (self *chunk) String() string { - return fmt.Sprintf("Address: %v TreeSize: %v Chunksize: %v", self.addr.Log(), self.span, len(self.sdata)) -} - -func GenerateRandomChunk(dataSize int64) Chunk { - hasher := MakeHashFunc(DefaultHash)() - sdata := make([]byte, dataSize+8) - rand.Read(sdata[8:]) - binary.LittleEndian.PutUint64(sdata[:8], uint64(dataSize)) - hasher.ResetWithLength(sdata[:8]) - hasher.Write(sdata[8:]) - return NewChunk(hasher.Sum(nil), sdata) -} - -func GenerateRandomChunks(dataSize int64, count int) (chunks []Chunk) { - if dataSize > ch.DefaultSize { - dataSize = ch.DefaultSize - } - for i := 0; i < count; i++ { - ch := GenerateRandomChunk(ch.DefaultSize) - chunks = append(chunks, ch) - } - return chunks -} - -func GenerateRandomData(l int) (r io.Reader, slice []byte) { - slice, err := ioutil.ReadAll(io.LimitReader(rand.Reader, int64(l))) - if err != nil { - panic("rand error") - } - // log.Warn("generate random data", "len", len(slice), "data", common.Bytes2Hex(slice)) - r = io.LimitReader(bytes.NewReader(slice), int64(l)) - return r, slice -} - -// Size, Seek, Read, ReadAt -type LazySectionReader interface { - Context() context.Context - Size(context.Context, chan bool) (int64, error) - io.Seeker - io.Reader - io.ReaderAt -} - -type LazyTestSectionReader struct { - *io.SectionReader -} - -func (r *LazyTestSectionReader) Size(context.Context, chan bool) (int64, error) { - return r.SectionReader.Size(), nil -} - -func (r *LazyTestSectionReader) Context() context.Context { - return context.TODO() -} - -type StoreParams struct { - Hash SwarmHasher `toml:"-"` - DbCapacity uint64 - CacheCapacity uint - BaseKey []byte -} - -func NewDefaultStoreParams() *StoreParams { - return NewStoreParams(defaultLDBCapacity, defaultCacheCapacity, nil, nil) -} - -func NewStoreParams(ldbCap uint64, cacheCap uint, hash SwarmHasher, basekey []byte) *StoreParams { - if basekey == nil { - basekey = make([]byte, 32) - } - if hash == nil { - hash = MakeHashFunc(DefaultHash) - } - return &StoreParams{ - Hash: hash, - DbCapacity: ldbCap, - CacheCapacity: cacheCap, - BaseKey: basekey, - } -} - -type ChunkData []byte - -type Reference []byte - -// Putter is responsible to store data and create a reference for it -type Putter interface { - Put(context.Context, ChunkData) (Reference, error) - // RefSize returns the length of the Reference created by this Putter - RefSize() int64 - // Close is to indicate that no more chunk data will be Put on this Putter - Close() - // Wait returns if all data has been store and the Close() was called. - Wait(context.Context) error -} - -// Getter is an interface to retrieve a chunk's data by its reference -type Getter interface { - Get(context.Context, Reference) (ChunkData, error) -} - -// NOTE: this returns invalid data if chunk is encrypted -func (c ChunkData) Size() uint64 { - return binary.LittleEndian.Uint64(c[:8]) -} - -func (c ChunkData) Data() []byte { - return c[8:] -} - -type ChunkValidator interface { - Validate(addr Address, data []byte) bool -} - -// Provides method for validation of content address in chunks -// Holds the corresponding hasher to create the address -type ContentAddressValidator struct { - Hasher SwarmHasher -} - -// Constructor -func NewContentAddressValidator(hasher SwarmHasher) *ContentAddressValidator { - return &ContentAddressValidator{ - Hasher: hasher, - } -} - -// Validate that the given key is a valid content address for the given data -func (v *ContentAddressValidator) Validate(addr Address, data []byte) bool { - if l := len(data); l < 9 || l > ch.DefaultSize+8 { - // log.Error("invalid chunk size", "chunk", addr.Hex(), "size", l) - return false - } - - hasher := v.Hasher() - hasher.ResetWithLength(data[:8]) - hasher.Write(data[8:]) - hash := hasher.Sum(nil) - - return bytes.Equal(hash, addr[:]) -} - -type ChunkStore interface { - Put(ctx context.Context, ch Chunk) (err error) - Get(rctx context.Context, ref Address) (ch Chunk, err error) - Close() -} - -// SyncChunkStore is a ChunkStore which supports syncing -type SyncChunkStore interface { - ChunkStore - BinIndex(po uint8) uint64 - Iterator(from uint64, to uint64, po uint8, f func(Address, uint64) bool) error - FetchFunc(ctx context.Context, ref Address) func(context.Context) error -} - -// FakeChunkStore doesn't store anything, just implements the ChunkStore interface -// It can be used to inject into a hasherStore if you don't want to actually store data just do the -// hashing -type FakeChunkStore struct { -} - -// Put doesn't store anything it is just here to implement ChunkStore -func (f *FakeChunkStore) Put(_ context.Context, ch Chunk) error { - return nil -} - -// Gut doesn't store anything it is just here to implement ChunkStore -func (f *FakeChunkStore) Get(_ context.Context, ref Address) (Chunk, error) { - panic("FakeChunkStore doesn't support Get") -} - -// Close doesn't store anything it is just here to implement ChunkStore -func (f *FakeChunkStore) Close() { -} diff --git a/swarm/swarm.go b/swarm/swarm.go deleted file mode 100644 index 0cd56d4eb626..000000000000 --- a/swarm/swarm.go +++ /dev/null @@ -1,512 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swarm - -import ( - "bytes" - "context" - "crypto/ecdsa" - "fmt" - "io" - "math/big" - "net" - "path/filepath" - "strings" - "time" - "unicode" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/chequebook" - "github.com/ethereum/go-ethereum/contracts/ens" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/api" - httpapi "github.com/ethereum/go-ethereum/swarm/api/http" - "github.com/ethereum/go-ethereum/swarm/fuse" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/stream" - "github.com/ethereum/go-ethereum/swarm/pss" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mock" - "github.com/ethereum/go-ethereum/swarm/storage/mru" - "github.com/ethereum/go-ethereum/swarm/tracing" -) - -var ( - startTime time.Time - updateGaugesPeriod = 5 * time.Second - startCounter = metrics.NewRegisteredCounter("stack,start", nil) - stopCounter = metrics.NewRegisteredCounter("stack,stop", nil) - uptimeGauge = metrics.NewRegisteredGauge("stack.uptime", nil) - requestsCacheGauge = metrics.NewRegisteredGauge("storage.cache.requests.size", nil) -) - -// the swarm stack -type Swarm struct { - config *api.Config // swarm configuration - api *api.API // high level api layer (fs/manifest) - dns api.Resolver // DNS registrar - fileStore *storage.FileStore // distributed preimage archive, the local API to the storage with document level storage/retrieval support - streamer *stream.Registry - bzz *network.Bzz // the logistic manager - backend chequebook.Backend // simple blockchain Backend - privateKey *ecdsa.PrivateKey - corsString string - swapEnabled bool - netStore *storage.NetStore - sfs *fuse.SwarmFS // need this to cleanup all the active mounts on node exit - ps *pss.Pss - - tracerClose io.Closer -} - -type SwarmAPI struct { - Api *api.API - Backend chequebook.Backend -} - -func (self *Swarm) API() *SwarmAPI { - return &SwarmAPI{ - Api: self.api, - Backend: self.backend, - } -} - -// creates a new swarm service instance -// implements node.Service -// If mockStore is not nil, it will be used as the storage for chunk data. -// MockStore should be used only for testing. -func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err error) { - - if bytes.Equal(common.FromHex(config.PublicKey), storage.ZeroAddr) { - return nil, fmt.Errorf("empty public key") - } - if bytes.Equal(common.FromHex(config.BzzKey), storage.ZeroAddr) { - return nil, fmt.Errorf("empty bzz key") - } - - var backend chequebook.Backend - if config.SwapAPI != "" && config.SwapEnabled { - log.Info("connecting to SWAP API", "url", config.SwapAPI) - backend, err = ethclient.Dial(config.SwapAPI) - if err != nil { - return nil, fmt.Errorf("error connecting to SWAP API %s: %s", config.SwapAPI, err) - } - } - - self = &Swarm{ - config: config, - backend: backend, - privateKey: config.ShiftPrivateKey(), - } - log.Debug("Setting up Swarm service components") - - config.HiveParams.Discovery = true - - bzzconfig := &network.BzzConfig{ - NetworkID: config.NetworkID, - OverlayAddr: common.FromHex(config.BzzKey), - HiveParams: config.HiveParams, - LightNode: config.LightNodeEnabled, - } - - stateStore, err := state.NewDBStore(filepath.Join(config.Path, "state-store.db")) - if err != nil { - return - } - - // set up high level api - var resolver *api.MultiResolver - if len(config.EnsAPIs) > 0 { - opts := []api.MultiResolverOption{} - for _, c := range config.EnsAPIs { - tld, endpoint, addr := parseEnsAPIAddress(c) - r, err := newEnsClient(endpoint, addr, config, self.privateKey) - if err != nil { - return nil, err - } - opts = append(opts, api.MultiResolverOptionWithResolver(r, tld)) - - } - resolver = api.NewMultiResolver(opts...) - self.dns = resolver - } - - lstore, err := storage.NewLocalStore(config.LocalStoreParams, mockStore) - if err != nil { - return nil, err - } - - self.netStore, err = storage.NewNetStore(lstore, nil) - if err != nil { - return nil, err - } - - to := network.NewKademlia( - common.FromHex(config.BzzKey), - network.NewKadParams(), - ) - delivery := stream.NewDelivery(to, self.netStore) - self.netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, config.DeliverySkipCheck).New - - var nodeID enode.ID - if err := nodeID.UnmarshalText([]byte(config.NodeID)); err != nil { - return nil, err - } - self.streamer = stream.NewRegistry(nodeID, delivery, self.netStore, stateStore, &stream.RegistryOptions{ - SkipCheck: config.DeliverySkipCheck, - DoSync: config.SyncEnabled, - DoRetrieve: true, - SyncUpdateDelay: config.SyncUpdateDelay, - MaxPeerServers: config.MaxStreamPeerServers, - }) - - // Swarm Hash Merklised Chunking for Arbitrary-length Document/File storage - self.fileStore = storage.NewFileStore(self.netStore, self.config.FileStoreParams) - - var resourceHandler *mru.Handler - rhparams := &mru.HandlerParams{} - - resourceHandler = mru.NewHandler(rhparams) - resourceHandler.SetStore(self.netStore) - - lstore.Validators = []storage.ChunkValidator{ - storage.NewContentAddressValidator(storage.MakeHashFunc(storage.DefaultHash)), - resourceHandler, - } - - log.Debug("Setup local storage") - - self.bzz = network.NewBzz(bzzconfig, to, stateStore, stream.Spec, self.streamer.Run) - - // Pss = postal service over swarm (devp2p over bzz) - self.ps, err = pss.NewPss(to, config.Pss) - if err != nil { - return nil, err - } - if pss.IsActiveHandshake { - pss.SetHandshakeController(self.ps, pss.NewHandshakeParams()) - } - - self.api = api.NewAPI(self.fileStore, self.dns, resourceHandler, self.privateKey) - - self.sfs = fuse.NewSwarmFS(self.api) - log.Debug("Initialized FUSE filesystem") - - return self, nil -} - -// parseEnsAPIAddress parses string according to format -// [tld:][contract-addr@]url and returns ENSClientConfig structure -// with endpoint, contract address and TLD. -func parseEnsAPIAddress(s string) (tld, endpoint string, addr common.Address) { - isAllLetterString := func(s string) bool { - for _, r := range s { - if !unicode.IsLetter(r) { - return false - } - } - return true - } - endpoint = s - if i := strings.Index(endpoint, ":"); i > 0 { - if isAllLetterString(endpoint[:i]) && len(endpoint) > i+2 && endpoint[i+1:i+3] != "//" { - tld = endpoint[:i] - endpoint = endpoint[i+1:] - } - } - if i := strings.Index(endpoint, "@"); i > 0 { - addr = common.HexToAddress(endpoint[:i]) - endpoint = endpoint[i+1:] - } - return -} - -// ensClient provides functionality for api.ResolveValidator -type ensClient struct { - *ens.ENS - *ethclient.Client -} - -// newEnsClient creates a new ENS client for that is a consumer of -// a ENS API on a specific endpoint. It is used as a helper function -// for creating multiple resolvers in NewSwarm function. -func newEnsClient(endpoint string, addr common.Address, config *api.Config, privkey *ecdsa.PrivateKey) (*ensClient, error) { - log.Info("connecting to ENS API", "url", endpoint) - client, err := rpc.Dial(endpoint) - if err != nil { - return nil, fmt.Errorf("error connecting to ENS API %s: %s", endpoint, err) - } - ethClient := ethclient.NewClient(client) - - ensRoot := config.EnsRoot - if addr != (common.Address{}) { - ensRoot = addr - } else { - a, err := detectEnsAddr(client) - if err == nil { - ensRoot = a - } else { - log.Warn(fmt.Sprintf("could not determine ENS contract address, using default %s", ensRoot), "err", err) - } - } - transactOpts := bind.NewKeyedTransactor(privkey) - dns, err := ens.NewENS(transactOpts, ensRoot, ethClient) - if err != nil { - return nil, err - } - log.Debug(fmt.Sprintf("-> Swarm Domain Name Registrar %v @ address %v", endpoint, ensRoot.Hex())) - return &ensClient{ - ENS: dns, - Client: ethClient, - }, err -} - -// detectEnsAddr determines the ENS contract address by getting both the -// version and genesis hash using the client and matching them to either -// mainnet or testnet addresses -func detectEnsAddr(client *rpc.Client) (common.Address, error) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - var version string - if err := client.CallContext(ctx, &version, "net_version"); err != nil { - return common.Address{}, err - } - - block, err := ethclient.NewClient(client).BlockByNumber(ctx, big.NewInt(0)) - if err != nil { - return common.Address{}, err - } - - switch { - - case version == "1" && block.Hash() == params.MainnetGenesisHash: - log.Info("using Mainnet ENS contract address", "addr", ens.MainNetAddress) - return ens.MainNetAddress, nil - - case version == "3" && block.Hash() == params.TestnetGenesisHash: - log.Info("using Testnet ENS contract address", "addr", ens.TestNetAddress) - return ens.TestNetAddress, nil - - default: - return common.Address{}, fmt.Errorf("unknown version and genesis hash: %s %s", version, block.Hash()) - } -} - -/* -Start is called when the stack is started -* starts the network kademlia hive peer management -* (starts netStore level 0 api) -* starts DPA level 1 api (chunking -> store/retrieve requests) -* (starts level 2 api) -* starts http proxy server -* registers url scheme handlers for bzz, etc -* TODO: start subservices like sword, swear, swarmdns -*/ -// implements the node.Service interface -func (self *Swarm) Start(srv *p2p.Server) error { - startTime = time.Now() - - self.tracerClose = tracing.Closer - - // update uaddr to correct enode - newaddr := self.bzz.UpdateLocalAddr([]byte(srv.Self().String())) - log.Info("Updated bzz local addr", "oaddr", fmt.Sprintf("%x", newaddr.OAddr), "uaddr", fmt.Sprintf("%s", newaddr.UAddr)) - // set chequebook - if self.config.SwapEnabled { - ctx := context.Background() // The initial setup has no deadline. - err := self.SetChequebook(ctx) - if err != nil { - return fmt.Errorf("Unable to set chequebook for SWAP: %v", err) - } - log.Debug(fmt.Sprintf("-> cheque book for SWAP: %v", self.config.Swap.Chequebook())) - } else { - log.Debug(fmt.Sprintf("SWAP disabled: no cheque book set")) - } - - log.Info("Starting bzz service") - - err := self.bzz.Start(srv) - if err != nil { - log.Error("bzz failed", "err", err) - return err - } - log.Info("Swarm network started", "bzzaddr", fmt.Sprintf("%x", self.bzz.Hive.BaseAddr())) - - if self.ps != nil { - self.ps.Start(srv) - } - - // start swarm http proxy server - if self.config.Port != "" { - addr := net.JoinHostPort(self.config.ListenAddr, self.config.Port) - server := httpapi.NewServer(self.api, self.config.Cors) - - if self.config.Cors != "" { - log.Debug("Swarm HTTP proxy CORS headers", "allowedOrigins", self.config.Cors) - } - - log.Debug("Starting Swarm HTTP proxy", "port", self.config.Port) - go func() { - err := server.ListenAndServe(addr) - if err != nil { - log.Error("Could not start Swarm HTTP proxy", "err", err.Error()) - } - }() - } - - self.periodicallyUpdateGauges() - - startCounter.Inc(1) - self.streamer.Start(srv) - return nil -} - -func (self *Swarm) periodicallyUpdateGauges() { - ticker := time.NewTicker(updateGaugesPeriod) - - go func() { - for range ticker.C { - self.updateGauges() - } - }() -} - -func (self *Swarm) updateGauges() { - uptimeGauge.Update(time.Since(startTime).Nanoseconds()) - requestsCacheGauge.Update(int64(self.netStore.RequestsCacheLen())) -} - -// implements the node.Service interface -// stops all component services. -func (self *Swarm) Stop() error { - if self.tracerClose != nil { - err := self.tracerClose.Close() - if err != nil { - return err - } - } - - if self.ps != nil { - self.ps.Stop() - } - if ch := self.config.Swap.Chequebook(); ch != nil { - ch.Stop() - ch.Save() - } - - if self.netStore != nil { - self.netStore.Close() - } - self.sfs.Stop() - stopCounter.Inc(1) - self.streamer.Stop() - return self.bzz.Stop() -} - -// implements the node.Service interface -func (self *Swarm) Protocols() (protos []p2p.Protocol) { - protos = append(protos, self.bzz.Protocols()...) - - if self.ps != nil { - protos = append(protos, self.ps.Protocols()...) - } - return -} - -func (self *Swarm) RegisterPssProtocol(spec *protocols.Spec, targetprotocol *p2p.Protocol, options *pss.ProtocolParams) (*pss.Protocol, error) { - if !pss.IsActiveProtocol { - return nil, fmt.Errorf("Pss protocols not available (built with !nopssprotocol tag)") - } - topic := pss.ProtocolTopic(spec) - return pss.RegisterProtocol(self.ps, &topic, spec, targetprotocol, options) -} - -// implements node.Service -// APIs returns the RPC API descriptors the Swarm implementation offers -func (self *Swarm) APIs() []rpc.API { - - apis := []rpc.API{ - // public APIs - { - Namespace: "bzz", - Version: "3.0", - Service: &Info{self.config, chequebook.ContractParams}, - Public: true, - }, - // admin APIs - { - Namespace: "bzz", - Version: "3.0", - Service: api.NewControl(self.api, self.bzz.Hive), - Public: false, - }, - { - Namespace: "chequebook", - Version: chequebook.Version, - Service: chequebook.NewApi(self.config.Swap.Chequebook), - Public: false, - }, - { - Namespace: "swarmfs", - Version: fuse.Swarmfs_Version, - Service: self.sfs, - Public: false, - }, - } - - apis = append(apis, self.bzz.APIs()...) - - if self.ps != nil { - apis = append(apis, self.ps.APIs()...) - } - - return apis -} - -func (self *Swarm) Api() *api.API { - return self.api -} - -// SetChequebook ensures that the local checquebook is set up on chain. -func (self *Swarm) SetChequebook(ctx context.Context) error { - err := self.config.Swap.SetChequebook(ctx, self.backend, self.config.Path) - if err != nil { - return err - } - log.Info(fmt.Sprintf("new chequebook set (%v): saving config file, resetting all connections in the hive", self.config.Swap.Contract.Hex())) - return nil -} - -// serialisable info about swarm -type Info struct { - *api.Config - *chequebook.Params -} - -func (self *Info) Info() *Info { - return self -} diff --git a/swarm/swarm_test.go b/swarm/swarm_test.go deleted file mode 100644 index c6569e37bf9c..000000000000 --- a/swarm/swarm_test.go +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swarm - -import ( - "context" - "encoding/hex" - "io/ioutil" - "math/rand" - "os" - "path" - "runtime" - "strings" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/api" -) - -// TestNewSwarm validates Swarm fields in repsect to the provided configuration. -func TestNewSwarm(t *testing.T) { - dir, err := ioutil.TempDir("", "swarm") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - // a simple rpc endpoint for testing dialing - ipcEndpoint := path.Join(dir, "TestSwarm.ipc") - - // windows namedpipes are not on filesystem but on NPFS - if runtime.GOOS == "windows" { - b := make([]byte, 8) - rand.Read(b) - ipcEndpoint = `\\.\pipe\TestSwarm-` + hex.EncodeToString(b) - } - - _, server, err := rpc.StartIPCEndpoint(ipcEndpoint, nil) - if err != nil { - t.Error(err) - } - defer server.Stop() - - for _, tc := range []struct { - name string - configure func(*api.Config) - check func(*testing.T, *Swarm, *api.Config) - }{ - { - name: "defaults", - configure: nil, - check: func(t *testing.T, s *Swarm, config *api.Config) { - if s.config != config { - t.Error("config is not the same object") - } - if s.backend != nil { - t.Error("backend is not nil") - } - if s.privateKey == nil { - t.Error("private key is not set") - } - if !s.config.HiveParams.Discovery { - t.Error("config.HiveParams.Discovery is false, must be true regardless the configuration") - } - if s.dns != nil { - t.Error("dns initialized, but it should not be") - } - if s.netStore == nil { - t.Error("netStore not initialized") - } - if s.streamer == nil { - t.Error("streamer not initialized") - } - if s.fileStore == nil { - t.Error("fileStore not initialized") - } - if s.bzz == nil { - t.Error("bzz not initialized") - } - if s.ps == nil { - t.Error("pss not initialized") - } - if s.api == nil { - t.Error("api not initialized") - } - if s.sfs == nil { - t.Error("swarm filesystem not initialized") - } - }, - }, - { - name: "with swap", - configure: func(config *api.Config) { - config.SwapAPI = ipcEndpoint - config.SwapEnabled = true - }, - check: func(t *testing.T, s *Swarm, _ *api.Config) { - if s.backend == nil { - t.Error("backend is nil") - } - }, - }, - { - name: "with swap disabled", - configure: func(config *api.Config) { - config.SwapAPI = ipcEndpoint - config.SwapEnabled = false - }, - check: func(t *testing.T, s *Swarm, _ *api.Config) { - if s.backend != nil { - t.Error("backend is not nil") - } - }, - }, - { - name: "with swap enabled and api endpoint blank", - configure: func(config *api.Config) { - config.SwapAPI = "" - config.SwapEnabled = true - }, - check: func(t *testing.T, s *Swarm, _ *api.Config) { - if s.backend != nil { - t.Error("backend is not nil") - } - }, - }, - { - name: "ens", - configure: func(config *api.Config) { - config.EnsAPIs = []string{ - "http://127.0.0.1:8888", - } - }, - check: func(t *testing.T, s *Swarm, _ *api.Config) { - if s.dns == nil { - t.Error("dns is not initialized") - } - }, - }, - } { - t.Run(tc.name, func(t *testing.T) { - config := api.NewConfig() - - dir, err := ioutil.TempDir("", "swarm") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - config.Path = dir - - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - - config.Init(privkey) - - if tc.configure != nil { - tc.configure(config) - } - - s, err := NewSwarm(config, nil) - if err != nil { - t.Fatal(err) - } - - if tc.check != nil { - tc.check(t, s, config) - } - }) - } -} - -func TestParseEnsAPIAddress(t *testing.T) { - for _, x := range []struct { - description string - value string - tld string - endpoint string - addr common.Address - }{ - { - description: "IPC endpoint", - value: "/data/testnet/geth.ipc", - endpoint: "/data/testnet/geth.ipc", - }, - { - description: "HTTP endpoint", - value: "http://127.0.0.1:1234", - endpoint: "http://127.0.0.1:1234", - }, - { - description: "WS endpoint", - value: "ws://127.0.0.1:1234", - endpoint: "ws://127.0.0.1:1234", - }, - { - description: "IPC Endpoint and TLD", - value: "test:/data/testnet/geth.ipc", - endpoint: "/data/testnet/geth.ipc", - tld: "test", - }, - { - description: "HTTP endpoint and TLD", - value: "test:http://127.0.0.1:1234", - endpoint: "http://127.0.0.1:1234", - tld: "test", - }, - { - description: "WS endpoint and TLD", - value: "test:ws://127.0.0.1:1234", - endpoint: "ws://127.0.0.1:1234", - tld: "test", - }, - { - description: "IPC Endpoint and contract address", - value: "314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", - endpoint: "/data/testnet/geth.ipc", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - }, - { - description: "HTTP endpoint and contract address", - value: "314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234", - endpoint: "http://127.0.0.1:1234", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - }, - { - description: "WS endpoint and contract address", - value: "314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:1234", - endpoint: "ws://127.0.0.1:1234", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - }, - { - description: "IPC Endpoint, TLD and contract address", - value: "test:314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", - endpoint: "/data/testnet/geth.ipc", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - tld: "test", - }, - { - description: "HTTP endpoint, TLD and contract address", - value: "eth:314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234", - endpoint: "http://127.0.0.1:1234", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - tld: "eth", - }, - { - description: "WS endpoint, TLD and contract address", - value: "eth:314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:1234", - endpoint: "ws://127.0.0.1:1234", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - tld: "eth", - }, - } { - t.Run(x.description, func(t *testing.T) { - tld, endpoint, addr := parseEnsAPIAddress(x.value) - if endpoint != x.endpoint { - t.Errorf("expected Endpoint %q, got %q", x.endpoint, endpoint) - } - if addr != x.addr { - t.Errorf("expected ContractAddress %q, got %q", x.addr.String(), addr.String()) - } - if tld != x.tld { - t.Errorf("expected TLD %q, got %q", x.tld, tld) - } - }) - } -} - -// TestLocalStoreAndRetrieve runs multiple tests where different size files are uploaded -// to a single Swarm instance using API Store and checked against the content returned -// by API Retrieve function. -// -// This test is intended to validate functionality of chunker store and join functions -// and their intergartion into Swarm, without comparing results with ones produced by -// another chunker implementation, as it is done in swarm/storage tests. -func TestLocalStoreAndRetrieve(t *testing.T) { - config := api.NewConfig() - - dir, err := ioutil.TempDir("", "node") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - config.Path = dir - - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - - config.Init(privkey) - - swarm, err := NewSwarm(config, nil) - if err != nil { - t.Fatal(err) - } - - // by default, test only the lonely chunk cases - sizes := []int{1, 60, 4097, 524288 + 1, 7*524288 + 1, 128*524288 + 1} - - if *longrunning { - // test broader set of cases if -longruning flag is set - sizes = append(sizes, 83, 179, 253, 1024, 4095, 4096, 8191, 8192, 8193, 12287, 12288, 12289, 123456, 2345678, 67298391, 524288, 524288+4096, 524288+4097, 7*524288, 7*524288+4096, 7*524288+4097, 128*524288, 128*524288+4096, 128*524288+4097, 816778334) - } - for _, n := range sizes { - testLocalStoreAndRetrieve(t, swarm, n, true) - testLocalStoreAndRetrieve(t, swarm, n, false) - } -} - -// testLocalStoreAndRetrieve is using a single Swarm instance, to upload -// a file of length n with optional random data using API Store function, -// and checks the output of API Retrieve function on the same instance. -// This is a regression test for issue -// https://github.com/ethersphere/go-ethereum/issues/639 -// where pyramid chunker did not split correctly files with lengths that -// are edge cases for chunk and tree parameters, depending whether there -// is a tree chunk with only one data chunk and how the compress functionality -// changed the tree. -func testLocalStoreAndRetrieve(t *testing.T, swarm *Swarm, n int, randomData bool) { - slice := make([]byte, n) - if randomData { - rand.Seed(time.Now().UnixNano()) - rand.Read(slice) - } - dataPut := string(slice) - - ctx := context.TODO() - k, wait, err := swarm.api.Store(ctx, strings.NewReader(dataPut), int64(len(dataPut)), false) - if err != nil { - t.Fatal(err) - } - if wait != nil { - err = wait(ctx) - if err != nil { - t.Fatal(err) - } - } - - r, _ := swarm.api.Retrieve(context.TODO(), k) - - d, err := ioutil.ReadAll(r) - if err != nil { - t.Fatal(err) - } - dataGet := string(d) - - if len(dataPut) != len(dataGet) { - t.Fatalf("data not matched: length expected %v, got %v", len(dataPut), len(dataGet)) - } else { - if dataPut != dataGet { - t.Fatal("data not matched") - } - } -} diff --git a/swarm/testutil/file.go b/swarm/testutil/file.go deleted file mode 100644 index ecb0d971ed60..000000000000 --- a/swarm/testutil/file.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package testutil - -import ( - "io" - "io/ioutil" - "os" - "strings" - "testing" -) - -// TempFileWithContent is a helper function that creates a temp file that contains the following string content then closes the file handle -// it returns the complete file path -func TempFileWithContent(t *testing.T, content string) string { - tempFile, err := ioutil.TempFile("", "swarm-temp-file") - if err != nil { - t.Fatal(err) - } - - _, err = io.Copy(tempFile, strings.NewReader(content)) - if err != nil { - os.RemoveAll(tempFile.Name()) - t.Fatal(err) - } - if err = tempFile.Close(); err != nil { - t.Fatal(err) - } - return tempFile.Name() -} diff --git a/swarm/testutil/http.go b/swarm/testutil/http.go deleted file mode 100644 index 2309c39f02e5..000000000000 --- a/swarm/testutil/http.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package testutil - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "testing" - - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru" -) - -type TestServer interface { - ServeHTTP(http.ResponseWriter, *http.Request) -} - -func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, resolver api.Resolver) *TestSwarmServer { - dir, err := ioutil.TempDir("", "swarm-storage-test") - if err != nil { - t.Fatal(err) - } - storeparams := storage.NewDefaultLocalStoreParams() - storeparams.DbCapacity = 5000000 - storeparams.CacheCapacity = 5000 - storeparams.Init(dir) - localStore, err := storage.NewLocalStore(storeparams, nil) - if err != nil { - os.RemoveAll(dir) - t.Fatal(err) - } - fileStore := storage.NewFileStore(localStore, storage.NewFileStoreParams()) - - // mutable resources test setup - resourceDir, err := ioutil.TempDir("", "swarm-resource-test") - if err != nil { - t.Fatal(err) - } - - rhparams := &mru.HandlerParams{} - rh, err := mru.NewTestHandler(resourceDir, rhparams) - if err != nil { - t.Fatal(err) - } - - a := api.NewAPI(fileStore, resolver, rh.Handler, nil) - srv := httptest.NewServer(serverFunc(a)) - tss := &TestSwarmServer{ - Server: srv, - FileStore: fileStore, - dir: dir, - Hasher: storage.MakeHashFunc(storage.DefaultHash)(), - cleanup: func() { - srv.Close() - rh.Close() - os.RemoveAll(dir) - os.RemoveAll(resourceDir) - }, - CurrentTime: 42, - } - mru.TimestampProvider = tss - return tss -} - -type TestSwarmServer struct { - *httptest.Server - Hasher storage.SwarmHash - FileStore *storage.FileStore - dir string - cleanup func() - CurrentTime uint64 -} - -func (t *TestSwarmServer) Close() { - t.cleanup() -} - -func (t *TestSwarmServer) Now() mru.Timestamp { - return mru.Timestamp{Time: t.CurrentTime} -} diff --git a/swarm/tracing/tracing.go b/swarm/tracing/tracing.go deleted file mode 100644 index b84cfb3102d5..000000000000 --- a/swarm/tracing/tracing.go +++ /dev/null @@ -1,103 +0,0 @@ -package tracing - -import ( - "io" - "os" - "strings" - "time" - - "github.com/ethereum/go-ethereum/log" - jaeger "github.com/uber/jaeger-client-go" - jaegercfg "github.com/uber/jaeger-client-go/config" - jaegerlog "github.com/uber/jaeger-client-go/log" - cli "gopkg.in/urfave/cli.v1" -) - -var Enabled bool = false - -// TracingEnabledFlag is the CLI flag name to use to enable trace collections. -const TracingEnabledFlag = "tracing" - -var ( - Closer io.Closer -) - -var ( - TracingFlag = cli.BoolFlag{ - Name: TracingEnabledFlag, - Usage: "Enable tracing", - } - TracingEndpointFlag = cli.StringFlag{ - Name: "tracing.endpoint", - Usage: "Tracing endpoint", - Value: "0.0.0.0:6831", - } - TracingSvcFlag = cli.StringFlag{ - Name: "tracing.svc", - Usage: "Tracing service name", - Value: "swarm", - } -) - -// Flags holds all command-line flags required for tracing collection. -var Flags = []cli.Flag{ - TracingFlag, - TracingEndpointFlag, - TracingSvcFlag, -} - -// Init enables or disables the open tracing system. -func init() { - for _, arg := range os.Args { - if flag := strings.TrimLeft(arg, "-"); flag == TracingEnabledFlag { - Enabled = true - } - } -} - -func Setup(ctx *cli.Context) { - if Enabled { - log.Info("Enabling opentracing") - var ( - endpoint = ctx.GlobalString(TracingEndpointFlag.Name) - svc = ctx.GlobalString(TracingSvcFlag.Name) - ) - - Closer = initTracer(endpoint, svc) - } -} - -func initTracer(endpoint, svc string) (closer io.Closer) { - // Sample configuration for testing. Use constant sampling to sample every trace - // and enable LogSpan to log every span via configured Logger. - cfg := jaegercfg.Configuration{ - Sampler: &jaegercfg.SamplerConfig{ - Type: jaeger.SamplerTypeConst, - Param: 1, - }, - Reporter: &jaegercfg.ReporterConfig{ - LogSpans: true, - BufferFlushInterval: 1 * time.Second, - LocalAgentHostPort: endpoint, - }, - } - - // Example logger and metrics factory. Use github.com/uber/jaeger-client-go/log - // and github.com/uber/jaeger-lib/metrics respectively to bind to real logging and metrics - // frameworks. - jLogger := jaegerlog.StdLogger - //jMetricsFactory := metrics.NullFactory - - // Initialize tracer with a logger and a metrics factory - closer, err := cfg.InitGlobalTracer( - svc, - jaegercfg.Logger(jLogger), - //jaegercfg.Metrics(jMetricsFactory), - //jaegercfg.Observer(rpcmetrics.NewObserver(jMetricsFactory, rpcmetrics.DefaultNameNormalizer)), - ) - if err != nil { - log.Error("Could not initialize Jaeger tracer", "err", err) - } - - return closer -} diff --git a/swarm/version/version.go b/swarm/version/version.go deleted file mode 100644 index e2804b9756f3..000000000000 --- a/swarm/version/version.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package version - -import ( - "fmt" -) - -const ( - VersionMajor = 0 // Major version component of the current release - VersionMinor = 3 // Minor version component of the current release - VersionPatch = 5 // Patch version component of the current release - VersionMeta = "unstable" // Version metadata to append to the version string -) - -// Version holds the textual version string. -var Version = func() string { - return fmt.Sprintf("%d.%d.%d", VersionMajor, VersionMinor, VersionPatch) -}() - -// VersionWithMeta holds the textual version string including the metadata. -var VersionWithMeta = func() string { - v := Version - if VersionMeta != "" { - v += "-" + VersionMeta - } - return v -}() - -// ArchiveVersion holds the textual version string used for Swarm archives. -// e.g. "0.3.0-dea1ce05" for stable releases, or -// "0.3.1-unstable-21c059b6" for unstable releases -func ArchiveVersion(gitCommit string) string { - vsn := Version - if VersionMeta != "stable" { - vsn += "-" + VersionMeta - } - if len(gitCommit) >= 8 { - vsn += "-" + gitCommit[:8] - } - return vsn -} - -func VersionWithCommit(gitCommit string) string { - vsn := Version - if len(gitCommit) >= 8 { - vsn += "-" + gitCommit[:8] - } - return vsn -} diff --git a/tests/block_test.go b/tests/block_test.go index 8315728a6369..711a3f8695b7 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -30,8 +30,6 @@ func TestBlockchain(t *testing.T) { bt.skipLoad(`^bcForgedTest/bcForkUncle\.json`) bt.skipLoad(`^bcMultiChainTest/(ChainAtoChainB_blockorder|CallContractFromNotBestBlock)`) bt.skipLoad(`^bcTotalDifficultyTest/(lotsOfLeafs|lotsOfBranches|sideChainWithMoreTransactions)`) - // This test is broken - bt.fails(`blockhashNonConstArg_Constantinople`, "Broken test") // Slow tests bt.slow(`^bcExploitTest/DelegateCallSpam.json`) bt.slow(`^bcExploitTest/ShanghaiLove.json`) @@ -40,6 +38,12 @@ func TestBlockchain(t *testing.T) { bt.slow(`^bcGasPricerTest/RPC_API_Test.json`) bt.slow(`^bcWalletTest/`) + // Still failing tests that we need to look into + //bt.fails(`^bcStateTests/suicideThenCheckBalance.json/suicideThenCheckBalance_Constantinople`, "TODO: investigate") + //bt.fails(`^bcStateTests/suicideStorageCheckVCreate2.json/suicideStorageCheckVCreate2_Constantinople`, "TODO: investigate") + //bt.fails(`^bcStateTests/suicideStorageCheckVCreate.json/suicideStorageCheckVCreate_Constantinople`, "TODO: investigate") + //bt.fails(`^bcStateTests/suicideStorageCheck.json/suicideStorageCheck_Constantinople`, "TODO: investigate") + bt.walk(t, blockTestDir, func(t *testing.T, name string, test *BlockTest) { if err := bt.checkFailure(t, name, test.Run()); err != nil { t.Error(err) diff --git a/tests/block_test_util.go b/tests/block_test_util.go index 427a94958ab6..81dd7b1d042a 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -27,12 +27,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" ) @@ -48,12 +49,13 @@ func (t *BlockTest) UnmarshalJSON(in []byte) error { } type btJSON struct { - Blocks []btBlock `json:"blocks"` - Genesis btHeader `json:"genesisBlockHeader"` - Pre core.GenesisAlloc `json:"pre"` - Post core.GenesisAlloc `json:"postState"` - BestBlock common.UnprefixedHash `json:"lastblockhash"` - Network string `json:"network"` + Blocks []btBlock `json:"blocks"` + Genesis btHeader `json:"genesisBlockHeader"` + Pre core.GenesisAlloc `json:"pre"` + Post core.GenesisAlloc `json:"postState"` + BestBlock common.UnprefixedHash `json:"lastblockhash"` + Network string `json:"network"` + SealEngine string `json:"sealEngine"` } type btBlock struct { @@ -80,7 +82,7 @@ type btHeader struct { Difficulty *big.Int GasLimit uint64 GasUsed uint64 - Timestamp *big.Int + Timestamp uint64 } type btHeaderMarshaling struct { @@ -89,7 +91,7 @@ type btHeaderMarshaling struct { Difficulty *math.HexOrDecimal256 GasLimit math.HexOrDecimal64 GasUsed math.HexOrDecimal64 - Timestamp *math.HexOrDecimal256 + Timestamp math.HexOrDecimal64 } func (t *BlockTest) Run() error { @@ -99,7 +101,7 @@ func (t *BlockTest) Run() error { } // import pre accounts & construct test genesis block & state root - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() gblock, err := t.genesis(config).Commit(db) if err != nil { return err @@ -110,8 +112,13 @@ func (t *BlockTest) Run() error { if gblock.Root() != t.json.Genesis.StateRoot { return fmt.Errorf("genesis block state root does not match test: computed=%x, test=%x", gblock.Root().Bytes()[:6], t.json.Genesis.StateRoot[:6]) } - - chain, err := core.NewBlockChain(db, nil, config, ethash.NewShared(), vm.Config{}, nil) + var engine consensus.Engine + if t.json.SealEngine == "NoProof" { + engine = ethash.NewFaker() + } else { + engine = ethash.NewShared() + } + chain, err := core.NewBlockChain(db, &core.CacheConfig{TrieCleanLimit: 0}, config, engine, vm.Config{}, nil) if err != nil { return err } @@ -139,7 +146,7 @@ func (t *BlockTest) genesis(config *params.ChainConfig) *core.Genesis { return &core.Genesis{ Config: config, Nonce: t.json.Genesis.Nonce.Uint64(), - Timestamp: t.json.Genesis.Timestamp.Uint64(), + Timestamp: t.json.Genesis.Timestamp, ParentHash: t.json.Genesis.ParentHash, ExtraData: t.json.Genesis.ExtraData, GasLimit: t.json.Genesis.GasLimit, @@ -241,7 +248,7 @@ func validateHeader(h *btHeader, h2 *types.Header) error { if h.GasUsed != h2.GasUsed { return fmt.Errorf("GasUsed: want: %d have: %d", h.GasUsed, h2.GasUsed) } - if h.Timestamp.Cmp(h2.Time) != 0 { + if h.Timestamp != h2.Time { return fmt.Errorf("Timestamp: want: %v have: %v", h.Timestamp, h2.Time) } return nil diff --git a/tests/difficulty_test.go b/tests/difficulty_test.go index 20294cc9d586..fde9db3ad4d3 100644 --- a/tests/difficulty_test.go +++ b/tests/difficulty_test.go @@ -17,9 +17,8 @@ package tests import ( - "testing" - "math/big" + "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" @@ -71,6 +70,9 @@ func TestDifficulty(t *testing.T) { dt.config("Frontier", *params.TestnetChainConfig) dt.config("MainNetwork", mainnetChainConfig) dt.config("CustomMainNetwork", mainnetChainConfig) + dt.config("Constantinople", params.ChainConfig{ + ConstantinopleBlock: big.NewInt(0), + }) dt.config("difficulty.json", mainnetChainConfig) dt.walk(t, difficultyTestDir, func(t *testing.T, name string, test *DifficultyTest) { diff --git a/tests/difficulty_test_util.go b/tests/difficulty_test_util.go index 00d699cf759f..fe6e90b027f2 100644 --- a/tests/difficulty_test_util.go +++ b/tests/difficulty_test_util.go @@ -30,18 +30,18 @@ import ( //go:generate gencodec -type DifficultyTest -field-override difficultyTestMarshaling -out gen_difficultytest.go type DifficultyTest struct { - ParentTimestamp *big.Int `json:"parentTimestamp"` + ParentTimestamp uint64 `json:"parentTimestamp"` ParentDifficulty *big.Int `json:"parentDifficulty"` UncleHash common.Hash `json:"parentUncles"` - CurrentTimestamp *big.Int `json:"currentTimestamp"` + CurrentTimestamp uint64 `json:"currentTimestamp"` CurrentBlockNumber uint64 `json:"currentBlockNumber"` CurrentDifficulty *big.Int `json:"currentDifficulty"` } type difficultyTestMarshaling struct { - ParentTimestamp *math.HexOrDecimal256 + ParentTimestamp math.HexOrDecimal64 ParentDifficulty *math.HexOrDecimal256 - CurrentTimestamp *math.HexOrDecimal256 + CurrentTimestamp math.HexOrDecimal64 CurrentDifficulty *math.HexOrDecimal256 UncleHash common.Hash CurrentBlockNumber math.HexOrDecimal64 @@ -56,7 +56,7 @@ func (test *DifficultyTest) Run(config *params.ChainConfig) error { UncleHash: test.UncleHash, } - actual := ethash.CalcDifficulty(config, test.CurrentTimestamp.Uint64(), parent) + actual := ethash.CalcDifficulty(config, test.CurrentTimestamp, parent) exp := test.CurrentDifficulty if actual.Cmp(exp) != 0 { diff --git a/tests/gen_btheader.go b/tests/gen_btheader.go index 5cfd4bd0aec0..f2e086a7b3be 100644 --- a/tests/gen_btheader.go +++ b/tests/gen_btheader.go @@ -14,6 +14,7 @@ import ( var _ = (*btHeaderMarshaling)(nil) +// MarshalJSON marshals as JSON. func (b btHeader) MarshalJSON() ([]byte, error) { type btHeader struct { Bloom types.Bloom @@ -31,7 +32,7 @@ func (b btHeader) MarshalJSON() ([]byte, error) { Difficulty *math.HexOrDecimal256 GasLimit math.HexOrDecimal64 GasUsed math.HexOrDecimal64 - Timestamp *math.HexOrDecimal256 + Timestamp math.HexOrDecimal64 } var enc btHeader enc.Bloom = b.Bloom @@ -49,10 +50,11 @@ func (b btHeader) MarshalJSON() ([]byte, error) { enc.Difficulty = (*math.HexOrDecimal256)(b.Difficulty) enc.GasLimit = math.HexOrDecimal64(b.GasLimit) enc.GasUsed = math.HexOrDecimal64(b.GasUsed) - enc.Timestamp = (*math.HexOrDecimal256)(b.Timestamp) + enc.Timestamp = math.HexOrDecimal64(b.Timestamp) return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (b *btHeader) UnmarshalJSON(input []byte) error { type btHeader struct { Bloom *types.Bloom @@ -70,7 +72,7 @@ func (b *btHeader) UnmarshalJSON(input []byte) error { Difficulty *math.HexOrDecimal256 GasLimit *math.HexOrDecimal64 GasUsed *math.HexOrDecimal64 - Timestamp *math.HexOrDecimal256 + Timestamp *math.HexOrDecimal64 } var dec btHeader if err := json.Unmarshal(input, &dec); err != nil { @@ -122,7 +124,7 @@ func (b *btHeader) UnmarshalJSON(input []byte) error { b.GasUsed = uint64(*dec.GasUsed) } if dec.Timestamp != nil { - b.Timestamp = (*big.Int)(dec.Timestamp) + b.Timestamp = uint64(*dec.Timestamp) } return nil } diff --git a/tests/gen_difficultytest.go b/tests/gen_difficultytest.go index 88f36ce99957..cd15ae31b5d3 100644 --- a/tests/gen_difficultytest.go +++ b/tests/gen_difficultytest.go @@ -12,31 +12,33 @@ import ( var _ = (*difficultyTestMarshaling)(nil) +// MarshalJSON marshals as JSON. func (d DifficultyTest) MarshalJSON() ([]byte, error) { type DifficultyTest struct { - ParentTimestamp *math.HexOrDecimal256 `json:"parentTimestamp"` + ParentTimestamp math.HexOrDecimal64 `json:"parentTimestamp"` ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` UncleHash common.Hash `json:"parentUncles"` - CurrentTimestamp *math.HexOrDecimal256 `json:"currentTimestamp"` + CurrentTimestamp math.HexOrDecimal64 `json:"currentTimestamp"` CurrentBlockNumber math.HexOrDecimal64 `json:"currentBlockNumber"` CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` } var enc DifficultyTest - enc.ParentTimestamp = (*math.HexOrDecimal256)(d.ParentTimestamp) + enc.ParentTimestamp = math.HexOrDecimal64(d.ParentTimestamp) enc.ParentDifficulty = (*math.HexOrDecimal256)(d.ParentDifficulty) enc.UncleHash = d.UncleHash - enc.CurrentTimestamp = (*math.HexOrDecimal256)(d.CurrentTimestamp) + enc.CurrentTimestamp = math.HexOrDecimal64(d.CurrentTimestamp) enc.CurrentBlockNumber = math.HexOrDecimal64(d.CurrentBlockNumber) enc.CurrentDifficulty = (*math.HexOrDecimal256)(d.CurrentDifficulty) return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (d *DifficultyTest) UnmarshalJSON(input []byte) error { type DifficultyTest struct { - ParentTimestamp *math.HexOrDecimal256 `json:"parentTimestamp"` + ParentTimestamp *math.HexOrDecimal64 `json:"parentTimestamp"` ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` UncleHash *common.Hash `json:"parentUncles"` - CurrentTimestamp *math.HexOrDecimal256 `json:"currentTimestamp"` + CurrentTimestamp *math.HexOrDecimal64 `json:"currentTimestamp"` CurrentBlockNumber *math.HexOrDecimal64 `json:"currentBlockNumber"` CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` } @@ -45,7 +47,7 @@ func (d *DifficultyTest) UnmarshalJSON(input []byte) error { return err } if dec.ParentTimestamp != nil { - d.ParentTimestamp = (*big.Int)(dec.ParentTimestamp) + d.ParentTimestamp = uint64(*dec.ParentTimestamp) } if dec.ParentDifficulty != nil { d.ParentDifficulty = (*big.Int)(dec.ParentDifficulty) @@ -54,7 +56,7 @@ func (d *DifficultyTest) UnmarshalJSON(input []byte) error { d.UncleHash = *dec.UncleHash } if dec.CurrentTimestamp != nil { - d.CurrentTimestamp = (*big.Int)(dec.CurrentTimestamp) + d.CurrentTimestamp = uint64(*dec.CurrentTimestamp) } if dec.CurrentBlockNumber != nil { d.CurrentBlockNumber = uint64(*dec.CurrentBlockNumber) diff --git a/tests/gen_tttransaction.go b/tests/gen_tttransaction.go deleted file mode 100644 index 2948842d972a..000000000000 --- a/tests/gen_tttransaction.go +++ /dev/null @@ -1,95 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - "errors" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" -) - -var _ = (*ttTransactionMarshaling)(nil) - -func (t ttTransaction) MarshalJSON() ([]byte, error) { - type ttTransaction struct { - Data hexutil.Bytes `gencodec:"required"` - GasLimit math.HexOrDecimal64 `gencodec:"required"` - GasPrice *math.HexOrDecimal256 `gencodec:"required"` - Nonce math.HexOrDecimal64 `gencodec:"required"` - Value *math.HexOrDecimal256 `gencodec:"required"` - R *math.HexOrDecimal256 `gencodec:"required"` - S *math.HexOrDecimal256 `gencodec:"required"` - V *math.HexOrDecimal256 `gencodec:"required"` - To common.Address `gencodec:"required"` - } - var enc ttTransaction - enc.Data = t.Data - enc.GasLimit = math.HexOrDecimal64(t.GasLimit) - enc.GasPrice = (*math.HexOrDecimal256)(t.GasPrice) - enc.Nonce = math.HexOrDecimal64(t.Nonce) - enc.Value = (*math.HexOrDecimal256)(t.Value) - enc.R = (*math.HexOrDecimal256)(t.R) - enc.S = (*math.HexOrDecimal256)(t.S) - enc.V = (*math.HexOrDecimal256)(t.V) - enc.To = t.To - return json.Marshal(&enc) -} - -func (t *ttTransaction) UnmarshalJSON(input []byte) error { - type ttTransaction struct { - Data *hexutil.Bytes `gencodec:"required"` - GasLimit *math.HexOrDecimal64 `gencodec:"required"` - GasPrice *math.HexOrDecimal256 `gencodec:"required"` - Nonce *math.HexOrDecimal64 `gencodec:"required"` - Value *math.HexOrDecimal256 `gencodec:"required"` - R *math.HexOrDecimal256 `gencodec:"required"` - S *math.HexOrDecimal256 `gencodec:"required"` - V *math.HexOrDecimal256 `gencodec:"required"` - To *common.Address `gencodec:"required"` - } - var dec ttTransaction - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Data == nil { - return errors.New("missing required field 'data' for ttTransaction") - } - t.Data = *dec.Data - if dec.GasLimit == nil { - return errors.New("missing required field 'gasLimit' for ttTransaction") - } - t.GasLimit = uint64(*dec.GasLimit) - if dec.GasPrice == nil { - return errors.New("missing required field 'gasPrice' for ttTransaction") - } - t.GasPrice = (*big.Int)(dec.GasPrice) - if dec.Nonce == nil { - return errors.New("missing required field 'nonce' for ttTransaction") - } - t.Nonce = uint64(*dec.Nonce) - if dec.Value == nil { - return errors.New("missing required field 'value' for ttTransaction") - } - t.Value = (*big.Int)(dec.Value) - if dec.R == nil { - return errors.New("missing required field 'r' for ttTransaction") - } - t.R = (*big.Int)(dec.R) - if dec.S == nil { - return errors.New("missing required field 's' for ttTransaction") - } - t.S = (*big.Int)(dec.S) - if dec.V == nil { - return errors.New("missing required field 'v' for ttTransaction") - } - t.V = (*big.Int)(dec.V) - if dec.To == nil { - return errors.New("missing required field 'to' for ttTransaction") - } - t.To = *dec.To - return nil -} diff --git a/tests/init.go b/tests/init.go index f0a4943c1356..188cdffe9d73 100644 --- a/tests/init.go +++ b/tests/init.go @@ -62,6 +62,18 @@ var Forks = map[string]*params.ChainConfig{ DAOForkBlock: big.NewInt(0), ByzantiumBlock: big.NewInt(0), ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(10000000), + }, + "ConstantinopleFix": { + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), }, "FrontierToHomesteadAt5": { ChainID: big.NewInt(1), @@ -86,6 +98,15 @@ var Forks = map[string]*params.ChainConfig{ EIP158Block: big.NewInt(0), ByzantiumBlock: big.NewInt(5), }, + "ByzantiumToConstantinopleAt5": { + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(5), + }, } // UnsupportedForkError is returned when a test requests a fork that isn't implemented. diff --git a/tests/rlp_test_util.go b/tests/rlp_test_util.go index 58ef8a6428c0..9069ec55a15d 100644 --- a/tests/rlp_test_util.go +++ b/tests/rlp_test_util.go @@ -42,9 +42,22 @@ type RLPTest struct { Out string } +// FromHex returns the bytes represented by the hexadecimal string s. +// s may be prefixed with "0x". +// This is copy-pasted from bytes.go, which does not return the error +func FromHex(s string) ([]byte, error) { + if len(s) > 1 && (s[0:2] == "0x" || s[0:2] == "0X") { + s = s[2:] + } + if len(s)%2 == 1 { + s = "0" + s + } + return hex.DecodeString(s) +} + // Run executes the test. func (t *RLPTest) Run() error { - outb, err := hex.DecodeString(t.Out) + outb, err := FromHex(t.Out) if err != nil { return fmt.Errorf("invalid hex in Out") } diff --git a/tests/state_test.go b/tests/state_test.go index c52e9abb8ee3..8b69da91f263 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -17,11 +17,14 @@ package tests import ( + "bufio" "bytes" + "flag" "fmt" "reflect" "testing" + "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/core/vm" ) @@ -43,16 +46,16 @@ func TestState(t *testing.T) { st.skipLoad(`^stTransactionTest/OverflowGasRequire\.json`) // gasLimit > 256 bits st.skipLoad(`^stTransactionTest/zeroSigTransa[^/]*\.json`) // EIP-86 is not supported yet // Expected failures: - st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/EIP158`, "bug in test") - st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test") + st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Byzantium/0`, "bug in test") + st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Byzantium/3`, "bug in test") + st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Constantinople/0`, "bug in test") + st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Constantinople/3`, "bug in test") + st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/ConstantinopleFix/0`, "bug in test") + st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/ConstantinopleFix/3`, "bug in test") st.walk(t, stateTestDir, func(t *testing.T, name string, test *StateTest) { for _, subtest := range test.Subtests() { subtest := subtest - if subtest.Fork == "Constantinople" { - // Skipping constantinople due to net sstore gas changes affecting all tests - continue - } key := fmt.Sprintf("%s/%d", subtest.Fork, subtest.Index) name := name + "/" + key t.Run(key, func(t *testing.T) { @@ -68,8 +71,17 @@ func TestState(t *testing.T) { // Transactions with gasLimit above this value will not get a VM trace on failure. const traceErrorLimit = 400000 +// The VM config for state tests that accepts --vm.* command line arguments. +var testVMConfig = func() vm.Config { + vmconfig := vm.Config{} + flag.StringVar(&vmconfig.EVMInterpreter, utils.EVMInterpreterFlag.Name, utils.EVMInterpreterFlag.Value, utils.EVMInterpreterFlag.Usage) + flag.StringVar(&vmconfig.EWASMInterpreter, utils.EWASMInterpreterFlag.Name, utils.EWASMInterpreterFlag.Value, utils.EWASMInterpreterFlag.Usage) + flag.Parse() + return vmconfig +}() + func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { - err := test(vm.Config{}) + err := test(testVMConfig) if err == nil { return } @@ -78,18 +90,19 @@ func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { t.Log("gas limit too high for EVM trace") return } - tracer := vm.NewStructLogger(nil) + buf := new(bytes.Buffer) + w := bufio.NewWriter(buf) + tracer := vm.NewJSONLogger(&vm.LogConfig{DisableMemory: true}, w) err2 := test(vm.Config{Debug: true, Tracer: tracer}) if !reflect.DeepEqual(err, err2) { t.Errorf("different error for second run: %v", err2) } - buf := new(bytes.Buffer) - vm.WriteTrace(buf, tracer.StructLogs()) + w.Flush() if buf.Len() == 0 { t.Log("no EVM operation logs generated") } else { t.Log("EVM operation log:\n" + buf.String()) } - t.Logf("EVM output: 0x%x", tracer.Output()) - t.Logf("EVM error: %v", tracer.Error()) + //t.Logf("EVM output: 0x%x", tracer.Output()) + //t.Logf("EVM error: %v", tracer.Error()) } diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 5d2251e52961..0b78f26ed1af 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -27,14 +27,15 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" ) // StateTest checks transaction processing without block context. @@ -126,7 +127,7 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateD return nil, UnsupportedForkError{subtest.Fork} } block := t.genesis(config).ToBlock(nil) - statedb := MakePreState(ethdb.NewMemDatabase(), t.json.Pre) + statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre) post := t.json.Post[subtest.Fork][subtest.Index] msg, err := t.json.Tx.toMessage(post) @@ -143,9 +144,6 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateD if _, _, _, err := core.ApplyMessage(evm, msg, gaspool); err != nil { statedb.RevertToSnapshot(snapshot) } - if logs := rlpHash(statedb.Logs()); logs != common.Hash(post.Logs) { - return statedb, fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs) - } // Commit block statedb.Commit(config.IsEIP158(block.Number())) // Add 0-value mining reward. This only makes a difference in the cases @@ -161,6 +159,9 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateD if root != common.Hash(post.Root) { return statedb, fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root) } + if logs := rlpHash(statedb.Logs()); logs != common.Hash(post.Logs) { + return statedb, fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs) + } return statedb, nil } @@ -248,7 +249,7 @@ func (tx *stTransaction) toMessage(ps stPostState) (core.Message, error) { } func rlpHash(x interface{}) (h common.Hash) { - hw := sha3.NewKeccak256() + hw := sha3.NewLegacyKeccak256() rlp.Encode(hw, x) hw.Sum(h[:0]) return h diff --git a/tests/testdata b/tests/testdata index ad2184adca36..6b85703b568f 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit ad2184adca367c0b68c65b44519dba16e1d0b9e2 +Subproject commit 6b85703b568f4456582a00665d8a3e5c3b20b484 diff --git a/tests/transaction_test.go b/tests/transaction_test.go index 42ad81877e97..0e3670d04bf7 100644 --- a/tests/transaction_test.go +++ b/tests/transaction_test.go @@ -17,7 +17,6 @@ package tests import ( - "math/big" "testing" "github.com/ethereum/go-ethereum/params" @@ -27,26 +26,27 @@ func TestTransaction(t *testing.T) { t.Parallel() txt := new(testMatcher) - txt.config(`^Homestead/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - }) - txt.config(`^EIP155/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ChainID: big.NewInt(1), - }) - txt.config(`^Byzantium/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - }) + // These can't be parsed, invalid hex in RLP + txt.skipLoad("^ttWrongRLP/.*") + // We don't allow more than uint64 in gas amount + // This is a pseudo-consensus vulnerability, but not in practice + // because of the gas limit + txt.skipLoad("^ttGasLimit/TransactionWithGasLimitxPriceOverflow.json") + // We _do_ allow more than uint64 in gas price, as opposed to the tests + // This is also not a concern, as long as tx.Cost() uses big.Int for + // calculating the final cozt + txt.skipLoad(".*TransactionWithGasPriceOverflow.*") + + // The nonce is too large for uint64. Not a concern, it means geth won't + // accept transactions at a certain point in the distant future + txt.skipLoad("^ttNonce/TransactionWithHighNonce256.json") + // The value is larger than uint64, which according to the test is invalid. + // Geth accepts it, which is not a consensus issue since we use big.Int's + // internally to calculate the cost + txt.skipLoad("^ttValue/TransactionWithHighValueOverflow.json") txt.walk(t, transactionTestDir, func(t *testing.T, name string, test *TransactionTest) { - cfg := txt.findConfig(name) + cfg := params.MainnetChainConfig if err := txt.checkFailure(t, name, test.Run(cfg)); err != nil { t.Error(err) } diff --git a/tests/transaction_test_util.go b/tests/transaction_test_util.go index 8c3dac088c22..12444720cc7a 100644 --- a/tests/transaction_test_util.go +++ b/tests/transaction_test_util.go @@ -17,14 +17,11 @@ package tests import ( - "bytes" - "errors" "fmt" - "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" @@ -32,101 +29,80 @@ import ( // TransactionTest checks RLP decoding and sender derivation of transactions. type TransactionTest struct { - json ttJSON + RLP hexutil.Bytes `json:"rlp"` + Byzantium ttFork + Constantinople ttFork + EIP150 ttFork + EIP158 ttFork + Frontier ttFork + Homestead ttFork } -type ttJSON struct { - BlockNumber math.HexOrDecimal64 `json:"blockNumber"` - RLP hexutil.Bytes `json:"rlp"` - Sender hexutil.Bytes `json:"sender"` - Transaction *ttTransaction `json:"transaction"` -} - -//go:generate gencodec -type ttTransaction -field-override ttTransactionMarshaling -out gen_tttransaction.go - -type ttTransaction struct { - Data []byte `gencodec:"required"` - GasLimit uint64 `gencodec:"required"` - GasPrice *big.Int `gencodec:"required"` - Nonce uint64 `gencodec:"required"` - Value *big.Int `gencodec:"required"` - R *big.Int `gencodec:"required"` - S *big.Int `gencodec:"required"` - V *big.Int `gencodec:"required"` - To common.Address `gencodec:"required"` -} - -type ttTransactionMarshaling struct { - Data hexutil.Bytes - GasLimit math.HexOrDecimal64 - GasPrice *math.HexOrDecimal256 - Nonce math.HexOrDecimal64 - Value *math.HexOrDecimal256 - R *math.HexOrDecimal256 - S *math.HexOrDecimal256 - V *math.HexOrDecimal256 +type ttFork struct { + Sender common.UnprefixedAddress `json:"sender"` + Hash common.UnprefixedHash `json:"hash"` } func (tt *TransactionTest) Run(config *params.ChainConfig) error { - tx := new(types.Transaction) - if err := rlp.DecodeBytes(tt.json.RLP, tx); err != nil { - if tt.json.Transaction == nil { - return nil + + validateTx := func(rlpData hexutil.Bytes, signer types.Signer, isHomestead bool) (*common.Address, *common.Hash, error) { + tx := new(types.Transaction) + if err := rlp.DecodeBytes(rlpData, tx); err != nil { + return nil, nil, err } - return fmt.Errorf("RLP decoding failed: %v", err) - } - // Check sender derivation. - signer := types.MakeSigner(config, new(big.Int).SetUint64(uint64(tt.json.BlockNumber))) - sender, err := types.Sender(signer, tx) - if err != nil { - return err - } - if sender != common.BytesToAddress(tt.json.Sender) { - return fmt.Errorf("Sender mismatch: got %x, want %x", sender, tt.json.Sender) - } - // Check decoded fields. - err = tt.json.Transaction.verify(signer, tx) - if tt.json.Sender == nil && err == nil { - return errors.New("field validations succeeded but should fail") - } - if tt.json.Sender != nil && err != nil { - return fmt.Errorf("field validations failed after RLP decoding: %s", err) + sender, err := types.Sender(signer, tx) + if err != nil { + return nil, nil, err + } + // Intrinsic gas + requiredGas, err := core.IntrinsicGas(tx.Data(), tx.To() == nil, isHomestead) + if err != nil { + return nil, nil, err + } + if requiredGas > tx.Gas() { + return nil, nil, fmt.Errorf("insufficient gas ( %d < %d )", tx.Gas(), requiredGas) + } + h := tx.Hash() + return &sender, &h, nil } - return nil -} -func (tt *ttTransaction) verify(signer types.Signer, tx *types.Transaction) error { - if !bytes.Equal(tx.Data(), tt.Data) { - return fmt.Errorf("Tx input data mismatch: got %x want %x", tx.Data(), tt.Data) - } - if tx.Gas() != tt.GasLimit { - return fmt.Errorf("GasLimit mismatch: got %d, want %d", tx.Gas(), tt.GasLimit) - } - if tx.GasPrice().Cmp(tt.GasPrice) != 0 { - return fmt.Errorf("GasPrice mismatch: got %v, want %v", tx.GasPrice(), tt.GasPrice) - } - if tx.Nonce() != tt.Nonce { - return fmt.Errorf("Nonce mismatch: got %v, want %v", tx.Nonce(), tt.Nonce) - } - v, r, s := tx.RawSignatureValues() - if r.Cmp(tt.R) != 0 { - return fmt.Errorf("R mismatch: got %v, want %v", r, tt.R) - } - if s.Cmp(tt.S) != 0 { - return fmt.Errorf("S mismatch: got %v, want %v", s, tt.S) - } - if v.Cmp(tt.V) != 0 { - return fmt.Errorf("V mismatch: got %v, want %v", v, tt.V) - } - if tx.To() == nil { - if tt.To != (common.Address{}) { - return fmt.Errorf("To mismatch when recipient is nil (contract creation): %x", tt.To) + for _, testcase := range []struct { + name string + signer types.Signer + fork ttFork + isHomestead bool + }{ + {"Frontier", types.FrontierSigner{}, tt.Frontier, false}, + {"Homestead", types.HomesteadSigner{}, tt.Homestead, true}, + {"EIP150", types.HomesteadSigner{}, tt.EIP150, true}, + {"EIP158", types.NewEIP155Signer(config.ChainID), tt.EIP158, true}, + {"Byzantium", types.NewEIP155Signer(config.ChainID), tt.Byzantium, true}, + {"Constantinople", types.NewEIP155Signer(config.ChainID), tt.Constantinople, true}, + } { + sender, txhash, err := validateTx(tt.RLP, testcase.signer, testcase.isHomestead) + + if testcase.fork.Sender == (common.UnprefixedAddress{}) { + if err == nil { + return fmt.Errorf("Expected error, got none (address %v)", sender.String()) + } + continue + } + // Should resolve the right address + if err != nil { + return fmt.Errorf("Got error, expected none: %v", err) + } + if sender == nil { + return fmt.Errorf("sender was nil, should be %x", common.Address(testcase.fork.Sender)) + } + if *sender != common.Address(testcase.fork.Sender) { + return fmt.Errorf("Sender mismatch: got %x, want %x", sender, testcase.fork.Sender) + } + if txhash == nil { + return fmt.Errorf("txhash was nil, should be %x", common.Hash(testcase.fork.Hash)) + } + if *txhash != common.Hash(testcase.fork.Hash) { + return fmt.Errorf("Hash mismatch: got %x, want %x", *txhash, testcase.fork.Hash) } - } else if *tx.To() != tt.To { - return fmt.Errorf("To mismatch: got %x, want %x", *tx.To(), tt.To) - } - if tx.Value().Cmp(tt.Value) != 0 { - return fmt.Errorf("Value mismatch: got %x, want %x", tx.Value(), tt.Value) } return nil } diff --git a/tests/vm_test_util.go b/tests/vm_test_util.go index cb81c5b94e39..91566c47e347 100644 --- a/tests/vm_test_util.go +++ b/tests/vm_test_util.go @@ -26,10 +26,10 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" ) @@ -79,7 +79,7 @@ type vmExecMarshaling struct { } func (t *VMTest) Run(vmconfig vm.Config) error { - statedb := MakePreState(ethdb.NewMemDatabase(), t.json.Pre) + statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre) ret, gasRemaining, err := t.exec(statedb, vmconfig) if t.json.GasRemaining == nil { diff --git a/trie/database.go b/trie/database.go index 7a755c043aef..452dbc7299e1 100644 --- a/trie/database.go +++ b/trie/database.go @@ -18,12 +18,16 @@ package trie import ( "bytes" + "encoding/binary" + "errors" "fmt" "io" + "reflect" "sort" "sync" "time" + "github.com/allegro/bigcache" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" @@ -32,6 +36,11 @@ import ( ) var ( + memcacheCleanHitMeter = metrics.NewRegisteredMeter("trie/memcache/clean/hit", nil) + memcacheCleanMissMeter = metrics.NewRegisteredMeter("trie/memcache/clean/miss", nil) + memcacheCleanReadMeter = metrics.NewRegisteredMeter("trie/memcache/clean/read", nil) + memcacheCleanWriteMeter = metrics.NewRegisteredMeter("trie/memcache/clean/write", nil) + memcacheFlushTimeTimer = metrics.NewRegisteredResettingTimer("trie/memcache/flush/time", nil) memcacheFlushNodesMeter = metrics.NewRegisteredMeter("trie/memcache/flush/nodes", nil) memcacheFlushSizeMeter = metrics.NewRegisteredMeter("trie/memcache/flush/size", nil) @@ -51,24 +60,21 @@ var secureKeyPrefix = []byte("secure-key-") // secureKeyLength is the length of the above prefix + 32byte hash. const secureKeyLength = 11 + 32 -// DatabaseReader wraps the Get and Has method of a backing store for the trie. -type DatabaseReader interface { - // Get retrieves the value associated with key from the database. - Get(key []byte) (value []byte, err error) - - // Has retrieves whether a key is present in the database. - Has(key []byte) (bool, error) -} - // Database is an intermediate write layer between the trie data structures and // the disk database. The aim is to accumulate trie writes in-memory and only // periodically flush a couple tries to disk, garbage collecting the remainder. +// +// Note, the trie Database is **not** thread safe in its mutations, but it **is** +// thread safe in providing individual, independent node access. The rationale +// behind this split design is to provide read access to RPC handlers and sync +// servers even while the trie is executing expensive garbage collection. type Database struct { - diskdb ethdb.Database // Persistent storage for matured trie nodes + diskdb ethdb.KeyValueStore // Persistent storage for matured trie nodes - nodes map[common.Hash]*cachedNode // Data and references relationships of a node - oldest common.Hash // Oldest tracked node, flush-list head - newest common.Hash // Newest tracked node, flush-list tail + cleans *bigcache.BigCache // GC friendly memory cache of clean node RLPs + dirties map[common.Hash]*cachedNode // Data and references relationships of dirty nodes + oldest common.Hash // Oldest tracked node, flush-list head + newest common.Hash // Newest tracked node, flush-list tail preimages map[common.Hash][]byte // Preimages of nodes from the secure trie seckeybuf [secureKeyLength]byte // Ephemeral buffer for calculating preimage keys @@ -81,7 +87,8 @@ type Database struct { flushnodes uint64 // Nodes flushed since last commit flushsize common.StorageSize // Data storage flushed since last commit - nodesSize common.StorageSize // Storage size of the nodes cache (exc. flushlist) + dirtiesSize common.StorageSize // Storage size of the dirty node cache (exc. metadata) + childrenSize common.StorageSize // Storage size of the external children tracking preimagesSize common.StorageSize // Storage size of the preimages cache lock sync.RWMutex @@ -136,13 +143,22 @@ type cachedNode struct { node node // Cached collapsed trie node, or raw rlp data size uint16 // Byte size of the useful cached data - parents uint16 // Number of live nodes referencing this one + parents uint32 // Number of live nodes referencing this one children map[common.Hash]uint16 // External children referenced by this node flushPrev common.Hash // Previous node in the flush-list flushNext common.Hash // Next node in the flush-list } +// cachedNodeSize is the raw size of a cachedNode data structure without any +// node data included. It's an approximate size, but should be a lot better +// than not counting them. +var cachedNodeSize = int(reflect.TypeOf(cachedNode{}).Size()) + +// cachedNodeChildrenSize is the raw size of an initialized but empty external +// reference map. +const cachedNodeChildrenSize = 48 + // rlp returns the raw rlp encoded blob of the cached node, either directly from // the cache, or by regenerating it from the collapsed node. func (n *cachedNode) rlp() []byte { @@ -158,11 +174,11 @@ func (n *cachedNode) rlp() []byte { // obj returns the decoded and expanded trie node, either directly from the cache, // or by regenerating it from the rlp encoded blob. -func (n *cachedNode) obj(hash common.Hash, cachegen uint16) node { +func (n *cachedNode) obj(hash common.Hash) node { if node, ok := n.node.(rawNode); ok { - return mustDecodeNode(hash[:], node, cachegen) + return mustDecodeNode(hash[:], node) } - return expandNode(hash[:], n.node, cachegen) + return expandNode(hash[:], n.node) } // childs returns all the tracked children of this node, both the implicit ones @@ -227,16 +243,15 @@ func simplifyNode(n node) node { // expandNode traverses the node hierarchy of a collapsed storage node and converts // all fields and keys into expanded memory form. -func expandNode(hash hashNode, n node, cachegen uint16) node { +func expandNode(hash hashNode, n node) node { switch n := n.(type) { case *rawShortNode: // Short nodes need key and child expansion return &shortNode{ Key: compactToHex(n.Key), - Val: expandNode(nil, n.Val, cachegen), + Val: expandNode(nil, n.Val), flags: nodeFlag{ hash: hash, - gen: cachegen, }, } @@ -245,12 +260,11 @@ func expandNode(hash hashNode, n node, cachegen uint16) node { node := &fullNode{ flags: nodeFlag{ hash: hash, - gen: cachegen, }, } for i := 0; i < len(node.Children); i++ { if n[i] != nil { - node.Children[i] = expandNode(nil, n[i], cachegen) + node.Children[i] = expandNode(nil, n[i]) } } return node @@ -263,18 +277,53 @@ func expandNode(hash hashNode, n node, cachegen uint16) node { } } +// trienodeHasher is a struct to be used with BigCache, which uses a Hasher to +// determine which shard to place an entry into. It's not a cryptographic hash, +// just to provide a bit of anti-collision (default is FNV64a). +// +// Since trie keys are already hashes, we can just use the key directly to +// map shard id. +type trienodeHasher struct{} + +// Sum64 implements the bigcache.Hasher interface. +func (t trienodeHasher) Sum64(key string) uint64 { + return binary.BigEndian.Uint64([]byte(key)) +} + // NewDatabase creates a new trie database to store ephemeral trie content before -// its written out to disk or garbage collected. -func NewDatabase(diskdb ethdb.Database) *Database { +// its written out to disk or garbage collected. No read cache is created, so all +// data retrievals will hit the underlying disk database. +func NewDatabase(diskdb ethdb.KeyValueStore) *Database { + return NewDatabaseWithCache(diskdb, 0) +} + +// NewDatabaseWithCache creates a new trie database to store ephemeral trie content +// before its written out to disk or garbage collected. It also acts as a read cache +// for nodes loaded from disk. +func NewDatabaseWithCache(diskdb ethdb.KeyValueStore, cache int) *Database { + var cleans *bigcache.BigCache + if cache > 0 { + cleans, _ = bigcache.NewBigCache(bigcache.Config{ + Shards: 1024, + LifeWindow: time.Hour, + MaxEntriesInWindow: cache * 1024, + MaxEntrySize: 512, + HardMaxCacheSize: cache, + Hasher: trienodeHasher{}, + }) + } return &Database{ - diskdb: diskdb, - nodes: map[common.Hash]*cachedNode{{}: {}}, + diskdb: diskdb, + cleans: cleans, + dirties: map[common.Hash]*cachedNode{{}: { + children: make(map[common.Hash]uint16), + }}, preimages: make(map[common.Hash][]byte), } } // DiskDB retrieves the persistent storage backing the trie database. -func (db *Database) DiskDB() DatabaseReader { +func (db *Database) DiskDB() ethdb.KeyValueReader { return db.diskdb } @@ -295,7 +344,7 @@ func (db *Database) InsertBlob(hash common.Hash, blob []byte) { // size tracking. func (db *Database) insert(hash common.Hash, blob []byte, node node) { // If the node's already cached, skip - if _, ok := db.nodes[hash]; ok { + if _, ok := db.dirties[hash]; ok { return } // Create the cached entry for this node @@ -305,19 +354,19 @@ func (db *Database) insert(hash common.Hash, blob []byte, node node) { flushPrev: db.newest, } for _, child := range entry.childs() { - if c := db.nodes[child]; c != nil { + if c := db.dirties[child]; c != nil { c.parents++ } } - db.nodes[hash] = entry + db.dirties[hash] = entry // Update the flush-list endpoints if db.oldest == (common.Hash{}) { db.oldest, db.newest = hash, hash } else { - db.nodes[db.newest].flushNext, db.newest = hash, hash + db.dirties[db.newest].flushNext, db.newest = hash, hash } - db.nodesSize += common.StorageSize(common.HashLength + entry.size) + db.dirtiesSize += common.StorageSize(common.HashLength + entry.size) } // insertPreimage writes a new trie node pre-image to the memory database if it's @@ -334,36 +383,69 @@ func (db *Database) insertPreimage(hash common.Hash, preimage []byte) { // node retrieves a cached trie node from memory, or returns nil if none can be // found in the memory cache. -func (db *Database) node(hash common.Hash, cachegen uint16) node { - // Retrieve the node from cache if available +func (db *Database) node(hash common.Hash) node { + // Retrieve the node from the clean cache if available + if db.cleans != nil { + if enc, err := db.cleans.Get(string(hash[:])); err == nil && enc != nil { + memcacheCleanHitMeter.Mark(1) + memcacheCleanReadMeter.Mark(int64(len(enc))) + return mustDecodeNode(hash[:], enc) + } + } + // Retrieve the node from the dirty cache if available db.lock.RLock() - node := db.nodes[hash] + dirty := db.dirties[hash] db.lock.RUnlock() - if node != nil { - return node.obj(hash, cachegen) + if dirty != nil { + return dirty.obj(hash) } // Content unavailable in memory, attempt to retrieve from disk enc, err := db.diskdb.Get(hash[:]) if err != nil || enc == nil { return nil } - return mustDecodeNode(hash[:], enc, cachegen) + if db.cleans != nil { + db.cleans.Set(string(hash[:]), enc) + memcacheCleanMissMeter.Mark(1) + memcacheCleanWriteMeter.Mark(int64(len(enc))) + } + return mustDecodeNode(hash[:], enc) } // Node retrieves an encoded cached trie node from memory. If it cannot be found // cached, the method queries the persistent database for the content. func (db *Database) Node(hash common.Hash) ([]byte, error) { - // Retrieve the node from cache if available + // It doens't make sense to retrieve the metaroot + if hash == (common.Hash{}) { + return nil, errors.New("not found") + } + // Retrieve the node from the clean cache if available + if db.cleans != nil { + if enc, err := db.cleans.Get(string(hash[:])); err == nil && enc != nil { + memcacheCleanHitMeter.Mark(1) + memcacheCleanReadMeter.Mark(int64(len(enc))) + return enc, nil + } + } + // Retrieve the node from the dirty cache if available db.lock.RLock() - node := db.nodes[hash] + dirty := db.dirties[hash] db.lock.RUnlock() - if node != nil { - return node.rlp(), nil + if dirty != nil { + return dirty.rlp(), nil } // Content unavailable in memory, attempt to retrieve from disk - return db.diskdb.Get(hash[:]) + enc, err := db.diskdb.Get(hash[:]) + if err == nil && enc != nil { + if db.cleans != nil { + db.cleans.Set(string(hash[:]), enc) + memcacheCleanMissMeter.Mark(1) + memcacheCleanWriteMeter.Mark(int64(len(enc))) + } + } + return enc, err } // preimage retrieves a cached trie node pre-image from memory. If it cannot be @@ -397,8 +479,8 @@ func (db *Database) Nodes() []common.Hash { db.lock.RLock() defer db.lock.RUnlock() - var hashes = make([]common.Hash, 0, len(db.nodes)) - for hash := range db.nodes { + var hashes = make([]common.Hash, 0, len(db.dirties)) + for hash := range db.dirties { if hash != (common.Hash{}) { // Special case for "root" references/nodes hashes = append(hashes, hash) } @@ -408,8 +490,8 @@ func (db *Database) Nodes() []common.Hash { // Reference adds a new reference from a parent node to a child node. func (db *Database) Reference(child common.Hash, parent common.Hash) { - db.lock.RLock() - defer db.lock.RUnlock() + db.lock.Lock() + defer db.lock.Unlock() db.reference(child, parent) } @@ -417,18 +499,22 @@ func (db *Database) Reference(child common.Hash, parent common.Hash) { // reference is the private locked version of Reference. func (db *Database) reference(child common.Hash, parent common.Hash) { // If the node does not exist, it's a node pulled from disk, skip - node, ok := db.nodes[child] + node, ok := db.dirties[child] if !ok { return } // If the reference already exists, only duplicate for roots - if db.nodes[parent].children == nil { - db.nodes[parent].children = make(map[common.Hash]uint16) - } else if _, ok = db.nodes[parent].children[child]; ok && parent != (common.Hash{}) { + if db.dirties[parent].children == nil { + db.dirties[parent].children = make(map[common.Hash]uint16) + db.childrenSize += cachedNodeChildrenSize + } else if _, ok = db.dirties[parent].children[child]; ok && parent != (common.Hash{}) { return } node.parents++ - db.nodes[parent].children[child]++ + db.dirties[parent].children[child]++ + if db.dirties[parent].children[child] == 1 { + db.childrenSize += common.HashLength + 2 // uint16 counter + } } // Dereference removes an existing reference from a root node. @@ -441,34 +527,35 @@ func (db *Database) Dereference(root common.Hash) { db.lock.Lock() defer db.lock.Unlock() - nodes, storage, start := len(db.nodes), db.nodesSize, time.Now() + nodes, storage, start := len(db.dirties), db.dirtiesSize, time.Now() db.dereference(root, common.Hash{}) - db.gcnodes += uint64(nodes - len(db.nodes)) - db.gcsize += storage - db.nodesSize + db.gcnodes += uint64(nodes - len(db.dirties)) + db.gcsize += storage - db.dirtiesSize db.gctime += time.Since(start) memcacheGCTimeTimer.Update(time.Since(start)) - memcacheGCSizeMeter.Mark(int64(storage - db.nodesSize)) - memcacheGCNodesMeter.Mark(int64(nodes - len(db.nodes))) + memcacheGCSizeMeter.Mark(int64(storage - db.dirtiesSize)) + memcacheGCNodesMeter.Mark(int64(nodes - len(db.dirties))) - log.Debug("Dereferenced trie from memory database", "nodes", nodes-len(db.nodes), "size", storage-db.nodesSize, "time", time.Since(start), - "gcnodes", db.gcnodes, "gcsize", db.gcsize, "gctime", db.gctime, "livenodes", len(db.nodes), "livesize", db.nodesSize) + log.Debug("Dereferenced trie from memory database", "nodes", nodes-len(db.dirties), "size", storage-db.dirtiesSize, "time", time.Since(start), + "gcnodes", db.gcnodes, "gcsize", db.gcsize, "gctime", db.gctime, "livenodes", len(db.dirties), "livesize", db.dirtiesSize) } // dereference is the private locked version of Dereference. func (db *Database) dereference(child common.Hash, parent common.Hash) { // Dereference the parent-child - node := db.nodes[parent] + node := db.dirties[parent] if node.children != nil && node.children[child] > 0 { node.children[child]-- if node.children[child] == 0 { delete(node.children, child) + db.childrenSize -= (common.HashLength + 2) // uint16 counter } } // If the child does not exist, it's a previously committed node. - node, ok := db.nodes[child] + node, ok := db.dirties[child] if !ok { return } @@ -485,39 +572,44 @@ func (db *Database) dereference(child common.Hash, parent common.Hash) { switch child { case db.oldest: db.oldest = node.flushNext - db.nodes[node.flushNext].flushPrev = common.Hash{} + db.dirties[node.flushNext].flushPrev = common.Hash{} case db.newest: db.newest = node.flushPrev - db.nodes[node.flushPrev].flushNext = common.Hash{} + db.dirties[node.flushPrev].flushNext = common.Hash{} default: - db.nodes[node.flushPrev].flushNext = node.flushNext - db.nodes[node.flushNext].flushPrev = node.flushPrev + db.dirties[node.flushPrev].flushNext = node.flushNext + db.dirties[node.flushNext].flushPrev = node.flushPrev } // Dereference all children and delete the node for _, hash := range node.childs() { db.dereference(hash, child) } - delete(db.nodes, child) - db.nodesSize -= common.StorageSize(common.HashLength + int(node.size)) + delete(db.dirties, child) + db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) + if node.children != nil { + db.childrenSize -= cachedNodeChildrenSize + } } } // Cap iteratively flushes old but still referenced trie nodes until the total // memory usage goes below the given threshold. +// +// Note, this method is a non-synchronized mutator. It is unsafe to call this +// concurrently with other mutators. func (db *Database) Cap(limit common.StorageSize) error { // Create a database batch to flush persistent data out. It is important that // outside code doesn't see an inconsistent state (referenced data removed from // memory cache during commit but not yet in persistent storage). This is ensured // by only uncaching existing data when the database write finalizes. - db.lock.RLock() - - nodes, storage, start := len(db.nodes), db.nodesSize, time.Now() + nodes, storage, start := len(db.dirties), db.dirtiesSize, time.Now() batch := db.diskdb.NewBatch() - // db.nodesSize only contains the useful data in the cache, but when reporting + // db.dirtiesSize only contains the useful data in the cache, but when reporting // the total memory consumption, the maintenance metadata is also needed to be - // counted. For every useful node, we track 2 extra hashes as the flushlist. - size := db.nodesSize + common.StorageSize((len(db.nodes)-1)*2*common.HashLength) + // counted. + size := db.dirtiesSize + common.StorageSize((len(db.dirties)-1)*cachedNodeSize) + size += db.childrenSize - common.StorageSize(len(db.dirties[common.Hash{}].children)*(common.HashLength+2)) // If the preimage cache got large enough, push to disk. If it's still small // leave for later to deduplicate writes. @@ -526,12 +618,10 @@ func (db *Database) Cap(limit common.StorageSize) error { for hash, preimage := range db.preimages { if err := batch.Put(db.secureKey(hash[:]), preimage); err != nil { log.Error("Failed to commit preimage from trie database", "err", err) - db.lock.RUnlock() return err } if batch.ValueSize() > ethdb.IdealBatchSize { if err := batch.Write(); err != nil { - db.lock.RUnlock() return err } batch.Reset() @@ -542,35 +632,32 @@ func (db *Database) Cap(limit common.StorageSize) error { oldest := db.oldest for size > limit && oldest != (common.Hash{}) { // Fetch the oldest referenced node and push into the batch - node := db.nodes[oldest] + node := db.dirties[oldest] if err := batch.Put(oldest[:], node.rlp()); err != nil { - db.lock.RUnlock() return err } // If we exceeded the ideal batch size, commit and reset if batch.ValueSize() >= ethdb.IdealBatchSize { if err := batch.Write(); err != nil { log.Error("Failed to write flush list to disk", "err", err) - db.lock.RUnlock() return err } batch.Reset() } // Iterate to the next flush item, or abort if the size cap was achieved. Size - // is the total size, including both the useful cached data (hash -> blob), as - // well as the flushlist metadata (2*hash). When flushing items from the cache, - // we need to reduce both. - size -= common.StorageSize(3*common.HashLength + int(node.size)) + // is the total size, including the useful cached data (hash -> blob), the + // cache item metadata, as well as external children mappings. + size -= common.StorageSize(common.HashLength + int(node.size) + cachedNodeSize) + if node.children != nil { + size -= common.StorageSize(cachedNodeChildrenSize + len(node.children)*(common.HashLength+2)) + } oldest = node.flushNext } // Flush out any remainder data from the last batch if err := batch.Write(); err != nil { log.Error("Failed to write flush list to disk", "err", err) - db.lock.RUnlock() return err } - db.lock.RUnlock() - // Write successful, clear out the flushed data db.lock.Lock() defer db.lock.Unlock() @@ -580,40 +667,43 @@ func (db *Database) Cap(limit common.StorageSize) error { db.preimagesSize = 0 } for db.oldest != oldest { - node := db.nodes[db.oldest] - delete(db.nodes, db.oldest) + node := db.dirties[db.oldest] + delete(db.dirties, db.oldest) db.oldest = node.flushNext - db.nodesSize -= common.StorageSize(common.HashLength + int(node.size)) + db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) + if node.children != nil { + db.childrenSize -= common.StorageSize(cachedNodeChildrenSize + len(node.children)*(common.HashLength+2)) + } } if db.oldest != (common.Hash{}) { - db.nodes[db.oldest].flushPrev = common.Hash{} + db.dirties[db.oldest].flushPrev = common.Hash{} } - db.flushnodes += uint64(nodes - len(db.nodes)) - db.flushsize += storage - db.nodesSize + db.flushnodes += uint64(nodes - len(db.dirties)) + db.flushsize += storage - db.dirtiesSize db.flushtime += time.Since(start) memcacheFlushTimeTimer.Update(time.Since(start)) - memcacheFlushSizeMeter.Mark(int64(storage - db.nodesSize)) - memcacheFlushNodesMeter.Mark(int64(nodes - len(db.nodes))) + memcacheFlushSizeMeter.Mark(int64(storage - db.dirtiesSize)) + memcacheFlushNodesMeter.Mark(int64(nodes - len(db.dirties))) - log.Debug("Persisted nodes from memory database", "nodes", nodes-len(db.nodes), "size", storage-db.nodesSize, "time", time.Since(start), - "flushnodes", db.flushnodes, "flushsize", db.flushsize, "flushtime", db.flushtime, "livenodes", len(db.nodes), "livesize", db.nodesSize) + log.Debug("Persisted nodes from memory database", "nodes", nodes-len(db.dirties), "size", storage-db.dirtiesSize, "time", time.Since(start), + "flushnodes", db.flushnodes, "flushsize", db.flushsize, "flushtime", db.flushtime, "livenodes", len(db.dirties), "livesize", db.dirtiesSize) return nil } // Commit iterates over all the children of a particular node, writes them out -// to disk, forcefully tearing down all references in both directions. +// to disk, forcefully tearing down all references in both directions. As a side +// effect, all pre-images accumulated up to this point are also written. // -// As a side effect, all pre-images accumulated up to this point are also written. +// Note, this method is a non-synchronized mutator. It is unsafe to call this +// concurrently with other mutators. func (db *Database) Commit(node common.Hash, report bool) error { // Create a database batch to flush persistent data out. It is important that // outside code doesn't see an inconsistent state (referenced data removed from // memory cache during commit but not yet in persistent storage). This is ensured // by only uncaching existing data when the database write finalizes. - db.lock.RLock() - start := time.Now() batch := db.diskdb.NewBatch() @@ -638,9 +728,9 @@ func (db *Database) Commit(node common.Hash, report bool) error { for _, preimage := range orderedPreimages { if err := batch.Put(db.secureKey(preimage.key), preimage.value); err != nil { log.Error("Failed to commit preimage from trie database", "err", err) - db.lock.RUnlock() return err } + // If the batch is too large, flush to disk if batch.ValueSize() > ethdb.IdealBatchSize { if err := batch.Write(); err != nil { return err @@ -648,40 +738,47 @@ func (db *Database) Commit(node common.Hash, report bool) error { batch.Reset() } } + // Since we're going to replay trie node writes into the clean cache, flush out + // any batched pre-images before continuing. + if err := batch.Write(); err != nil { + return err + } + batch.Reset() + // Move the trie itself into the batch, flushing if enough data is accumulated - nodes, storage := len(db.nodes), db.nodesSize - if err := db.commit(node, batch); err != nil { + nodes, storage := len(db.dirties), db.dirtiesSize + + uncacher := &cleaner{db} + if err := db.commit(node, batch, uncacher); err != nil { log.Error("Failed to commit trie from trie database", "err", err) - db.lock.RUnlock() return err } - // Write batch ready, unlock for readers during persistence + // Trie mostly committed to disk, flush any batch leftovers if err := batch.Write(); err != nil { log.Error("Failed to write trie to disk", "err", err) - db.lock.RUnlock() return err } - db.lock.RUnlock() - - // Write successful, clear out the flushed data + // Uncache any leftovers in the last batch db.lock.Lock() defer db.lock.Unlock() + batch.Replay(uncacher) + batch.Reset() + + // Reset the storage counters and bumpd metrics db.preimages = make(map[common.Hash][]byte) db.preimagesSize = 0 - db.uncache(node) - memcacheCommitTimeTimer.Update(time.Since(start)) - memcacheCommitSizeMeter.Mark(int64(storage - db.nodesSize)) - memcacheCommitNodesMeter.Mark(int64(nodes - len(db.nodes))) + memcacheCommitSizeMeter.Mark(int64(storage - db.dirtiesSize)) + memcacheCommitNodesMeter.Mark(int64(nodes - len(db.dirties))) logger := log.Info if !report { logger = log.Debug } - logger("Persisted trie from memory database", "nodes", nodes-len(db.nodes)+int(db.flushnodes), "size", storage-db.nodesSize+db.flushsize, "time", time.Since(start)+db.flushtime, - "gcnodes", db.gcnodes, "gcsize", db.gcsize, "gctime", db.gctime, "livenodes", len(db.nodes), "livesize", db.nodesSize) + logger("Persisted trie from memory database", "nodes", nodes-len(db.dirties)+int(db.flushnodes), "size", storage-db.dirtiesSize+db.flushsize, "time", time.Since(start)+db.flushtime, + "gcnodes", db.gcnodes, "gcsize", db.gcsize, "gctime", db.gctime, "livenodes", len(db.dirties), "livesize", db.dirtiesSize) // Reset the garbage collection statistics db.gcnodes, db.gcsize, db.gctime = 0, 0, 0 @@ -691,14 +788,14 @@ func (db *Database) Commit(node common.Hash, report bool) error { } // commit is the private locked version of Commit. -func (db *Database) commit(hash common.Hash, batch ethdb.Batch) error { +func (db *Database) commit(hash common.Hash, batch ethdb.Batch, uncacher *cleaner) error { // If the node does not exist, it's a previously committed node - node, ok := db.nodes[hash] + node, ok := db.dirties[hash] if !ok { return nil } for _, child := range node.childs() { - if err := db.commit(child, batch); err != nil { + if err := db.commit(child, batch, uncacher); err != nil { return err } } @@ -710,39 +807,60 @@ func (db *Database) commit(hash common.Hash, batch ethdb.Batch) error { if err := batch.Write(); err != nil { return err } + db.lock.Lock() + batch.Replay(uncacher) batch.Reset() + db.lock.Unlock() } return nil } -// uncache is the post-processing step of a commit operation where the already -// persisted trie is removed from the cache. The reason behind the two-phase -// commit is to ensure consistent data availability while moving from memory -// to disk. -func (db *Database) uncache(hash common.Hash) { +// cleaner is a database batch replayer that takes a batch of write operations +// and cleans up the trie database from anything written to disk. +type cleaner struct { + db *Database +} + +// Put reacts to database writes and implements dirty data uncaching. This is the +// post-processing step of a commit operation where the already persisted trie is +// removed from the dirty cache and moved into the clean cache. The reason behind +// the two-phase commit is to ensure ensure data availability while moving from +// memory to disk. +func (c *cleaner) Put(key []byte, rlp []byte) error { + hash := common.BytesToHash(key) + // If the node does not exist, we're done on this path - node, ok := db.nodes[hash] + node, ok := c.db.dirties[hash] if !ok { - return + return nil } // Node still exists, remove it from the flush-list switch hash { - case db.oldest: - db.oldest = node.flushNext - db.nodes[node.flushNext].flushPrev = common.Hash{} - case db.newest: - db.newest = node.flushPrev - db.nodes[node.flushPrev].flushNext = common.Hash{} + case c.db.oldest: + c.db.oldest = node.flushNext + c.db.dirties[node.flushNext].flushPrev = common.Hash{} + case c.db.newest: + c.db.newest = node.flushPrev + c.db.dirties[node.flushPrev].flushNext = common.Hash{} default: - db.nodes[node.flushPrev].flushNext = node.flushNext - db.nodes[node.flushNext].flushPrev = node.flushPrev + c.db.dirties[node.flushPrev].flushNext = node.flushNext + c.db.dirties[node.flushNext].flushPrev = node.flushPrev } - // Uncache the node's subtries and remove the node itself too - for _, child := range node.childs() { - db.uncache(child) + // Remove the node from the dirty cache + delete(c.db.dirties, hash) + c.db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) + if node.children != nil { + c.db.dirtiesSize -= common.StorageSize(cachedNodeChildrenSize + len(node.children)*(common.HashLength+2)) + } + // Move the flushed node into the clean cache to prevent insta-reloads + if c.db.cleans != nil { + c.db.cleans.Set(string(hash[:]), rlp) } - delete(db.nodes, hash) - db.nodesSize -= common.StorageSize(common.HashLength + int(node.size)) + return nil +} + +func (c *cleaner) Delete(key []byte) error { + panic("Not implemented") } // Size returns the current storage size of the memory cache in front of the @@ -751,11 +869,12 @@ func (db *Database) Size() (common.StorageSize, common.StorageSize) { db.lock.RLock() defer db.lock.RUnlock() - // db.nodesSize only contains the useful data in the cache, but when reporting + // db.dirtiesSize only contains the useful data in the cache, but when reporting // the total memory consumption, the maintenance metadata is also needed to be - // counted. For every useful node, we track 2 extra hashes as the flushlist. - var flushlistSize = common.StorageSize((len(db.nodes) - 1) * 2 * common.HashLength) - return db.nodesSize + flushlistSize, db.preimagesSize + // counted. + var metadataSize = common.StorageSize((len(db.dirties) - 1) * cachedNodeSize) + var metarootRefs = common.StorageSize(len(db.dirties[common.Hash{}].children) * (common.HashLength + 2)) + return db.dirtiesSize + db.childrenSize + metadataSize - metarootRefs, db.preimagesSize } // verifyIntegrity is a debug method to iterate over the entire trie stored in @@ -768,12 +887,12 @@ func (db *Database) verifyIntegrity() { // Iterate over all the cached nodes and accumulate them into a set reachable := map[common.Hash]struct{}{{}: {}} - for child := range db.nodes[common.Hash{}].children { + for child := range db.dirties[common.Hash{}].children { db.accumulate(child, reachable) } // Find any unreachable but cached nodes - unreachable := []string{} - for hash, node := range db.nodes { + var unreachable []string + for hash, node := range db.dirties { if _, ok := reachable[hash]; !ok { unreachable = append(unreachable, fmt.Sprintf("%x: {Node: %v, Parents: %d, Prev: %x, Next: %x}", hash, node.node, node.parents, node.flushPrev, node.flushNext)) @@ -788,7 +907,7 @@ func (db *Database) verifyIntegrity() { // cached children found in memory. func (db *Database) accumulate(hash common.Hash, reachable map[common.Hash]struct{}) { // Mark the node reachable if present in the memory cache - node, ok := db.nodes[hash] + node, ok := db.dirties[hash] if !ok { return } diff --git a/trie/database_test.go b/trie/database_test.go new file mode 100644 index 000000000000..81c469500f98 --- /dev/null +++ b/trie/database_test.go @@ -0,0 +1,33 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package trie + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb/memorydb" +) + +// Tests that the trie database returns a missing trie node error if attempting +// to retrieve the meta root. +func TestDatabaseMetarootFetch(t *testing.T) { + db := NewDatabase(memorydb.New()) + if _, err := db.Node(common.Hash{}); err == nil { + t.Fatalf("metaroot retrieval succeeded") + } +} diff --git a/trie/encoding.go b/trie/encoding.go index 5f120de638ce..1955a3e664f5 100644 --- a/trie/encoding.go +++ b/trie/encoding.go @@ -52,6 +52,9 @@ func hexToCompact(hex []byte) []byte { } func compactToHex(compact []byte) []byte { + if len(compact) == 0 { + return compact + } base := keybytesToHex(compact) // delete terminator flag if base[0] < 2 { diff --git a/trie/hasher.go b/trie/hasher.go index 7b1d7793fa65..54f6a9de2b6a 100644 --- a/trie/hasher.go +++ b/trie/hasher.go @@ -21,16 +21,14 @@ import ( "sync" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" ) type hasher struct { - tmp sliceBuffer - sha keccakState - cachegen uint16 - cachelimit uint16 - onleaf LeafCallback + tmp sliceBuffer + sha keccakState + onleaf LeafCallback } // keccakState wraps sha3.state. In addition to the usual hash methods, it also supports @@ -57,14 +55,14 @@ var hasherPool = sync.Pool{ New: func() interface{} { return &hasher{ tmp: make(sliceBuffer, 0, 550), // cap is as large as a full fullNode. - sha: sha3.NewKeccak256().(keccakState), + sha: sha3.NewLegacyKeccak256().(keccakState), } }, } -func newHasher(cachegen, cachelimit uint16, onleaf LeafCallback) *hasher { +func newHasher(onleaf LeafCallback) *hasher { h := hasherPool.Get().(*hasher) - h.cachegen, h.cachelimit, h.onleaf = cachegen, cachelimit, onleaf + h.onleaf = onleaf return h } @@ -80,14 +78,13 @@ func (h *hasher) hash(n node, db *Database, force bool) (node, node, error) { if db == nil { return hash, n, nil } - if n.canUnload(h.cachegen, h.cachelimit) { - // Unload the node from cache. All of its subnodes will have a lower or equal - // cache generation number. - cacheUnloadCounter.Inc(1) - return hash, hash, nil - } if !dirty { - return hash, n, nil + switch n.(type) { + case *fullNode, *shortNode: + return hash, hash, nil + default: + return hash, n, nil + } } } // Trie not processed yet or needs storage, walk the children diff --git a/trie/iterator.go b/trie/iterator.go index 00b890eb896f..da93b2fadb3b 100644 --- a/trie/iterator.go +++ b/trie/iterator.go @@ -180,7 +180,9 @@ func (it *nodeIterator) LeafBlob() []byte { func (it *nodeIterator) LeafProof() [][]byte { if len(it.stack) > 0 { if _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok { - hasher := newHasher(0, 0, nil) + hasher := newHasher(nil) + defer returnHasherToPool(hasher) + proofs := make([][]byte, 0, len(it.stack)) for i, item := range it.stack[:len(it.stack)-1] { diff --git a/trie/iterator_test.go b/trie/iterator_test.go index 2a510b1c2ddd..88b8103fb3f2 100644 --- a/trie/iterator_test.go +++ b/trie/iterator_test.go @@ -23,7 +23,7 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" ) func TestIterator(t *testing.T) { @@ -113,18 +113,21 @@ func TestNodeIteratorCoverage(t *testing.T) { t.Errorf("failed to retrieve reported node %x: %v", hash, err) } } - for hash, obj := range db.nodes { + for hash, obj := range db.dirties { if obj != nil && hash != (common.Hash{}) { if _, ok := hashes[hash]; !ok { t.Errorf("state entry not reported %x", hash) } } } - for _, key := range db.diskdb.(*ethdb.MemDatabase).Keys() { + it := db.diskdb.NewIterator() + for it.Next() { + key := it.Key() if _, ok := hashes[common.BytesToHash(key)]; !ok { t.Errorf("state entry not reported %x", key) } } + it.Release() } type kvs struct{ k, v string } @@ -289,7 +292,7 @@ func TestIteratorContinueAfterErrorDisk(t *testing.T) { testIteratorContinueA func TestIteratorContinueAfterErrorMemonly(t *testing.T) { testIteratorContinueAfterError(t, true) } func testIteratorContinueAfterError(t *testing.T, memonly bool) { - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) tr, _ := New(common.Hash{}, triedb) @@ -309,7 +312,11 @@ func testIteratorContinueAfterError(t *testing.T, memonly bool) { if memonly { memKeys = triedb.Nodes() } else { - diskKeys = diskdb.Keys() + it := diskdb.NewIterator() + for it.Next() { + diskKeys = append(diskKeys, it.Key()) + } + it.Release() } for i := 0; i < 20; i++ { // Create trie that will load all nodes from DB. @@ -333,8 +340,8 @@ func testIteratorContinueAfterError(t *testing.T, memonly bool) { } } if memonly { - robj = triedb.nodes[rkey] - delete(triedb.nodes, rkey) + robj = triedb.dirties[rkey] + delete(triedb.dirties, rkey) } else { rval, _ = diskdb.Get(rkey[:]) diskdb.Delete(rkey[:]) @@ -350,7 +357,7 @@ func testIteratorContinueAfterError(t *testing.T, memonly bool) { // Add the node back and continue iteration. if memonly { - triedb.nodes[rkey] = robj + triedb.dirties[rkey] = robj } else { diskdb.Put(rkey[:], rval) } @@ -376,7 +383,7 @@ func TestIteratorContinueAfterSeekErrorMemonly(t *testing.T) { func testIteratorContinueAfterSeekError(t *testing.T, memonly bool) { // Commit test trie to db, then remove the node containing "bars". - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) ctr, _ := New(common.Hash{}, triedb) @@ -393,8 +400,8 @@ func testIteratorContinueAfterSeekError(t *testing.T, memonly bool) { barNodeObj *cachedNode ) if memonly { - barNodeObj = triedb.nodes[barNodeHash] - delete(triedb.nodes, barNodeHash) + barNodeObj = triedb.dirties[barNodeHash] + delete(triedb.dirties, barNodeHash) } else { barNodeBlob, _ = diskdb.Get(barNodeHash[:]) diskdb.Delete(barNodeHash[:]) @@ -411,7 +418,7 @@ func testIteratorContinueAfterSeekError(t *testing.T, memonly bool) { } // Reinsert the missing node. if memonly { - triedb.nodes[barNodeHash] = barNodeObj + triedb.dirties[barNodeHash] = barNodeObj } else { diskdb.Put(barNodeHash[:], barNodeBlob) } diff --git a/trie/node.go b/trie/node.go index 1fafb7a53825..f4055e779a1b 100644 --- a/trie/node.go +++ b/trie/node.go @@ -30,7 +30,6 @@ var indices = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b type node interface { fstring(string) string cache() (hashNode, bool) - canUnload(cachegen, cachelimit uint16) bool } type ( @@ -71,20 +70,9 @@ func (n *shortNode) copy() *shortNode { copy := *n; return © } // nodeFlag contains caching-related metadata about a node. type nodeFlag struct { hash hashNode // cached hash of the node (may be nil) - gen uint16 // cache generation counter dirty bool // whether the node has changes that must be written to the database } -// canUnload tells whether a node can be unloaded. -func (n *nodeFlag) canUnload(cachegen, cachelimit uint16) bool { - return !n.dirty && cachegen-n.gen >= cachelimit -} - -func (n *fullNode) canUnload(gen, limit uint16) bool { return n.flags.canUnload(gen, limit) } -func (n *shortNode) canUnload(gen, limit uint16) bool { return n.flags.canUnload(gen, limit) } -func (n hashNode) canUnload(uint16, uint16) bool { return false } -func (n valueNode) canUnload(uint16, uint16) bool { return false } - func (n *fullNode) cache() (hashNode, bool) { return n.flags.hash, n.flags.dirty } func (n *shortNode) cache() (hashNode, bool) { return n.flags.hash, n.flags.dirty } func (n hashNode) cache() (hashNode, bool) { return nil, true } @@ -117,8 +105,8 @@ func (n valueNode) fstring(ind string) string { return fmt.Sprintf("%x ", []byte(n)) } -func mustDecodeNode(hash, buf []byte, cachegen uint16) node { - n, err := decodeNode(hash, buf, cachegen) +func mustDecodeNode(hash, buf []byte) node { + n, err := decodeNode(hash, buf) if err != nil { panic(fmt.Sprintf("node %x: %v", hash, err)) } @@ -126,7 +114,7 @@ func mustDecodeNode(hash, buf []byte, cachegen uint16) node { } // decodeNode parses the RLP encoding of a trie node. -func decodeNode(hash, buf []byte, cachegen uint16) (node, error) { +func decodeNode(hash, buf []byte) (node, error) { if len(buf) == 0 { return nil, io.ErrUnexpectedEOF } @@ -136,22 +124,22 @@ func decodeNode(hash, buf []byte, cachegen uint16) (node, error) { } switch c, _ := rlp.CountValues(elems); c { case 2: - n, err := decodeShort(hash, elems, cachegen) + n, err := decodeShort(hash, elems) return n, wrapError(err, "short") case 17: - n, err := decodeFull(hash, elems, cachegen) + n, err := decodeFull(hash, elems) return n, wrapError(err, "full") default: return nil, fmt.Errorf("invalid number of list elements: %v", c) } } -func decodeShort(hash, elems []byte, cachegen uint16) (node, error) { +func decodeShort(hash, elems []byte) (node, error) { kbuf, rest, err := rlp.SplitString(elems) if err != nil { return nil, err } - flag := nodeFlag{hash: hash, gen: cachegen} + flag := nodeFlag{hash: hash} key := compactToHex(kbuf) if hasTerm(key) { // value node @@ -161,17 +149,17 @@ func decodeShort(hash, elems []byte, cachegen uint16) (node, error) { } return &shortNode{key, append(valueNode{}, val...), flag}, nil } - r, _, err := decodeRef(rest, cachegen) + r, _, err := decodeRef(rest) if err != nil { return nil, wrapError(err, "val") } return &shortNode{key, r, flag}, nil } -func decodeFull(hash, elems []byte, cachegen uint16) (*fullNode, error) { - n := &fullNode{flags: nodeFlag{hash: hash, gen: cachegen}} +func decodeFull(hash, elems []byte) (*fullNode, error) { + n := &fullNode{flags: nodeFlag{hash: hash}} for i := 0; i < 16; i++ { - cld, rest, err := decodeRef(elems, cachegen) + cld, rest, err := decodeRef(elems) if err != nil { return n, wrapError(err, fmt.Sprintf("[%d]", i)) } @@ -189,7 +177,7 @@ func decodeFull(hash, elems []byte, cachegen uint16) (*fullNode, error) { const hashLen = len(common.Hash{}) -func decodeRef(buf []byte, cachegen uint16) (node, []byte, error) { +func decodeRef(buf []byte) (node, []byte, error) { kind, val, rest, err := rlp.Split(buf) if err != nil { return nil, buf, err @@ -202,7 +190,7 @@ func decodeRef(buf []byte, cachegen uint16) (node, []byte, error) { err := fmt.Errorf("oversized embedded node (size is %d bytes, want size < %d)", size, hashLen) return nil, buf, err } - n, err := decodeNode(nil, buf, cachegen) + n, err := decodeNode(nil, buf) return n, rest, err case kind == rlp.String && len(val) == 0: // empty node diff --git a/trie/node_test.go b/trie/node_test.go deleted file mode 100644 index 7ad1ff9e7bd3..000000000000 --- a/trie/node_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package trie - -import "testing" - -func TestCanUnload(t *testing.T) { - tests := []struct { - flag nodeFlag - cachegen, cachelimit uint16 - want bool - }{ - { - flag: nodeFlag{dirty: true, gen: 0}, - want: false, - }, - { - flag: nodeFlag{dirty: false, gen: 0}, - cachegen: 0, cachelimit: 0, - want: true, - }, - { - flag: nodeFlag{dirty: false, gen: 65534}, - cachegen: 65535, cachelimit: 1, - want: true, - }, - { - flag: nodeFlag{dirty: false, gen: 65534}, - cachegen: 0, cachelimit: 1, - want: true, - }, - { - flag: nodeFlag{dirty: false, gen: 1}, - cachegen: 65535, cachelimit: 1, - want: true, - }, - } - - for _, test := range tests { - if got := test.flag.canUnload(test.cachegen, test.cachelimit); got != test.want { - t.Errorf("%+v\n got %t, want %t", test, got, test.want) - } - } -} diff --git a/trie/proof.go b/trie/proof.go index 6cb8f4d5f772..9985e730dd37 100644 --- a/trie/proof.go +++ b/trie/proof.go @@ -21,7 +21,6 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" @@ -34,10 +33,10 @@ import ( // If the trie does not contain a value for key, the returned proof contains all // nodes of the longest existing prefix of the key (at least the root node), ending // with the node that proves the absence of the key. -func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { +func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error { // Collect all nodes on the path to key. key = keybytesToHex(key) - nodes := []node{} + var nodes []node tn := t.root for len(key) > 0 && tn != nil { switch n := tn.(type) { @@ -65,7 +64,9 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { panic(fmt.Sprintf("%T: invalid node: %v", tn, tn)) } } - hasher := newHasher(0, 0, nil) + hasher := newHasher(nil) + defer returnHasherToPool(hasher) + for i, n := range nodes { // Don't bother checking for errors here since hasher panics // if encoding doesn't work and we're not writing to any database. @@ -79,7 +80,7 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { } else { enc, _ := rlp.EncodeToBytes(n) if !ok { - hash = crypto.Keccak256(enc) + hash = hasher.makeHashNode(enc) } proofDb.Put(hash, enc) } @@ -95,14 +96,14 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { // If the trie does not contain a value for key, the returned proof contains all // nodes of the longest existing prefix of the key (at least the root node), ending // with the node that proves the absence of the key. -func (t *SecureTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { +func (t *SecureTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error { return t.trie.Prove(key, fromLevel, proofDb) } // VerifyProof checks merkle proofs. The given proof must contain the value for // key in a trie with the given root hash. VerifyProof returns an error if the // proof contains invalid trie nodes or the wrong value. -func VerifyProof(rootHash common.Hash, key []byte, proofDb DatabaseReader) (value []byte, nodes int, err error) { +func VerifyProof(rootHash common.Hash, key []byte, proofDb ethdb.KeyValueReader) (value []byte, nodes int, err error) { key = keybytesToHex(key) wantHash := rootHash for i := 0; ; i++ { @@ -110,7 +111,7 @@ func VerifyProof(rootHash common.Hash, key []byte, proofDb DatabaseReader) (valu if buf == nil { return nil, i, fmt.Errorf("proof node %d (hash %064x) missing", i, wantHash) } - n, err := decodeNode(wantHash[:], buf, 0) + n, err := decodeNode(wantHash[:], buf) if err != nil { return nil, i, fmt.Errorf("bad proof node %d: %v", i, err) } diff --git a/trie/proof_test.go b/trie/proof_test.go index 996f87478143..c488f342c872 100644 --- a/trie/proof_test.go +++ b/trie/proof_test.go @@ -25,7 +25,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" ) func init() { @@ -34,18 +34,18 @@ func init() { // makeProvers creates Merkle trie provers based on different implementations to // test all variations. -func makeProvers(trie *Trie) []func(key []byte) *ethdb.MemDatabase { - var provers []func(key []byte) *ethdb.MemDatabase +func makeProvers(trie *Trie) []func(key []byte) *memorydb.Database { + var provers []func(key []byte) *memorydb.Database // Create a direct trie based Merkle prover - provers = append(provers, func(key []byte) *ethdb.MemDatabase { - proof := ethdb.NewMemDatabase() + provers = append(provers, func(key []byte) *memorydb.Database { + proof := memorydb.New() trie.Prove(key, 0, proof) return proof }) // Create a leaf iterator based Merkle prover - provers = append(provers, func(key []byte) *ethdb.MemDatabase { - proof := ethdb.NewMemDatabase() + provers = append(provers, func(key []byte) *memorydb.Database { + proof := memorydb.New() if it := NewIterator(trie.NodeIterator(key)); it.Next() && bytes.Equal(key, it.Key) { for _, p := range it.Prove() { proof.Put(crypto.Keccak256(p), p) @@ -106,9 +106,14 @@ func TestBadProof(t *testing.T) { if proof == nil { t.Fatalf("prover %d: nil proof", i) } - key := proof.Keys()[mrand.Intn(proof.Len())] + it := proof.NewIterator() + for i, d := 0, mrand.Intn(proof.Len()); i <= d; i++ { + it.Next() + } + key := it.Key() val, _ := proof.Get(key) proof.Delete(key) + it.Release() mutateByte(val) proof.Put(crypto.Keccak256(val), val) @@ -127,7 +132,7 @@ func TestMissingKeyProof(t *testing.T) { updateString(trie, "k", "v") for i, key := range []string{"a", "j", "l", "z"} { - proof := ethdb.NewMemDatabase() + proof := memorydb.New() trie.Prove([]byte(key), 0, proof) if proof.Len() != 1 { @@ -164,8 +169,8 @@ func BenchmarkProve(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { kv := vals[keys[i%len(keys)]] - proofs := ethdb.NewMemDatabase() - if trie.Prove(kv.k, 0, proofs); len(proofs.Keys()) == 0 { + proofs := memorydb.New() + if trie.Prove(kv.k, 0, proofs); proofs.Len() == 0 { b.Fatalf("zero length proof for %x", kv.k) } } @@ -175,10 +180,10 @@ func BenchmarkVerifyProof(b *testing.B) { trie, vals := randomTrie(100) root := trie.Hash() var keys []string - var proofs []*ethdb.MemDatabase + var proofs []*memorydb.Database for k := range vals { keys = append(keys, k) - proof := ethdb.NewMemDatabase() + proof := memorydb.New() trie.Prove([]byte(k), 0, proof) proofs = append(proofs, proof) } diff --git a/trie/secure_trie.go b/trie/secure_trie.go index 6a50cfd5a65f..fbc591ed108a 100644 --- a/trie/secure_trie.go +++ b/trie/secure_trie.go @@ -51,7 +51,7 @@ type SecureTrie struct { // Loaded nodes are kept around until their 'cache generation' expires. // A new cache generation is created by each call to Commit. // cachelimit sets the number of past cache generations to keep. -func NewSecure(root common.Hash, db *Database, cachelimit uint16) (*SecureTrie, error) { +func NewSecure(root common.Hash, db *Database) (*SecureTrie, error) { if db == nil { panic("trie.NewSecure called without a database") } @@ -59,7 +59,6 @@ func NewSecure(root common.Hash, db *Database, cachelimit uint16) (*SecureTrie, if err != nil { return nil, err } - trie.SetCacheLimit(cachelimit) return &SecureTrie{trie: *trie}, nil } @@ -161,12 +160,6 @@ func (t *SecureTrie) Hash() common.Hash { return t.trie.Hash() } -// Root returns the root hash of SecureTrie. -// Deprecated: use Hash instead. -func (t *SecureTrie) Root() []byte { - return t.trie.Root() -} - // Copy returns a copy of SecureTrie. func (t *SecureTrie) Copy() *SecureTrie { cpy := *t @@ -183,7 +176,7 @@ func (t *SecureTrie) NodeIterator(start []byte) NodeIterator { // The caller must not hold onto the return value because it will become // invalid on the next call to hashKey or secKey. func (t *SecureTrie) hashKey(key []byte) []byte { - h := newHasher(0, 0, nil) + h := newHasher(nil) h.sha.Reset() h.sha.Write(key) buf := h.sha.Sum(t.hashKeyBuf[:0]) diff --git a/trie/secure_trie_test.go b/trie/secure_trie_test.go index d16d999684a3..fb6c38ee222b 100644 --- a/trie/secure_trie_test.go +++ b/trie/secure_trie_test.go @@ -24,20 +24,19 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" ) func newEmptySecure() *SecureTrie { - trie, _ := NewSecure(common.Hash{}, NewDatabase(ethdb.NewMemDatabase()), 0) + trie, _ := NewSecure(common.Hash{}, NewDatabase(memorydb.New())) return trie } // makeTestSecureTrie creates a large enough secure trie for testing. func makeTestSecureTrie() (*Database, *SecureTrie, map[string][]byte) { // Create an empty trie - triedb := NewDatabase(ethdb.NewMemDatabase()) - - trie, _ := NewSecure(common.Hash{}, triedb, 0) + triedb := NewDatabase(memorydb.New()) + trie, _ := NewSecure(common.Hash{}, triedb) // Fill it with some arbitrary data content := make(map[string][]byte) diff --git a/trie/sync.go b/trie/sync.go index 67dff5a8b6bc..6f40b45a1ebb 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -72,19 +72,21 @@ func newSyncMemBatch() *syncMemBatch { // unknown trie hashes to retrieve, accepts node data associated with said hashes // and reconstructs the trie step by step until all is done. type Sync struct { - database DatabaseReader // Persistent database to check for existing entries + database ethdb.KeyValueReader // Persistent database to check for existing entries membatch *syncMemBatch // Memory buffer to avoid frequent database writes requests map[common.Hash]*request // Pending requests pertaining to a key hash queue *prque.Prque // Priority queue with the pending requests + bloom *SyncBloom // Bloom filter for fast node existence checks } // NewSync creates a new trie data download scheduler. -func NewSync(root common.Hash, database DatabaseReader, callback LeafCallback) *Sync { +func NewSync(root common.Hash, database ethdb.KeyValueReader, callback LeafCallback, bloom *SyncBloom) *Sync { ts := &Sync{ database: database, membatch: newSyncMemBatch(), requests: make(map[common.Hash]*request), queue: prque.New(nil), + bloom: bloom, } ts.AddSubTrie(root, 0, common.Hash{}, callback) return ts @@ -99,10 +101,14 @@ func (s *Sync) AddSubTrie(root common.Hash, depth int, parent common.Hash, callb if _, ok := s.membatch.batch[root]; ok { return } - key := root.Bytes() - blob, _ := s.database.Get(key) - if local, err := decodeNode(key, blob, 0); local != nil && err == nil { - return + if s.bloom.Contains(root[:]) { + // Bloom filter says this might be a duplicate, double check + blob, _ := s.database.Get(root[:]) + if local, err := decodeNode(root[:], blob); local != nil && err == nil { + return + } + // False positive, bump fault meter + bloomFaultMeter.Mark(1) } // Assemble the new sub-trie sync request req := &request{ @@ -134,8 +140,13 @@ func (s *Sync) AddRawEntry(hash common.Hash, depth int, parent common.Hash) { if _, ok := s.membatch.batch[hash]; ok { return } - if ok, _ := s.database.Has(hash.Bytes()); ok { - return + if s.bloom.Contains(hash[:]) { + // Bloom filter says this might be a duplicate, double check + if ok, _ := s.database.Has(hash[:]); ok { + return + } + // False positive, bump fault meter + bloomFaultMeter.Mark(1) } // Assemble the new sub-trie sync request req := &request{ @@ -157,7 +168,7 @@ func (s *Sync) AddRawEntry(hash common.Hash, depth int, parent common.Hash) { // Missing retrieves the known missing nodes from the trie for retrieval. func (s *Sync) Missing(max int) []common.Hash { - requests := []common.Hash{} + var requests []common.Hash for !s.queue.Empty() && (max == 0 || len(requests) < max) { requests = append(requests, s.queue.PopItem().(common.Hash)) } @@ -187,7 +198,7 @@ func (s *Sync) Process(results []SyncResult) (bool, int, error) { continue } // Decode the node data content and update the request - node, err := decodeNode(item.Hash[:], item.Data, 0) + node, err := decodeNode(item.Hash[:], item.Data) if err != nil { return committed, i, err } @@ -213,14 +224,15 @@ func (s *Sync) Process(results []SyncResult) (bool, int, error) { // Commit flushes the data stored in the internal membatch out to persistent // storage, returning the number of items written and any occurred error. -func (s *Sync) Commit(dbw ethdb.Putter) (int, error) { +func (s *Sync) Commit(dbw ethdb.KeyValueWriter) (int, error) { // Dump the membatch into a database dbw for i, key := range s.membatch.order { if err := dbw.Put(key[:], s.membatch.batch[key]); err != nil { return i, err } + s.bloom.Add(key[:]) } - written := len(s.membatch.order) + written := len(s.membatch.order) // TODO(karalabe): could an order change improve write performance? // Drop the membatch data and return s.membatch = newSyncMemBatch() @@ -254,7 +266,7 @@ func (s *Sync) children(req *request, object node) ([]*request, error) { node node depth int } - children := []child{} + var children []child switch node := (object).(type) { case *shortNode: @@ -292,8 +304,13 @@ func (s *Sync) children(req *request, object node) ([]*request, error) { if _, ok := s.membatch.batch[hash]; ok { continue } - if ok, _ := s.database.Has(node); ok { - continue + if s.bloom.Contains(node) { + // Bloom filter says this might be a duplicate, double check + if ok, _ := s.database.Has(node); ok { + continue + } + // False positive, bump fault meter + bloomFaultMeter.Mark(1) } // Locally unknown node, schedule for retrieval requests = append(requests, &request{ diff --git a/trie/sync_bloom.go b/trie/sync_bloom.go new file mode 100644 index 000000000000..2182d1c43772 --- /dev/null +++ b/trie/sync_bloom.go @@ -0,0 +1,207 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package trie + +import ( + "encoding/binary" + "fmt" + "math" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/steakknife/bloomfilter" +) + +var ( + bloomAddMeter = metrics.NewRegisteredMeter("trie/bloom/add", nil) + bloomLoadMeter = metrics.NewRegisteredMeter("trie/bloom/load", nil) + bloomTestMeter = metrics.NewRegisteredMeter("trie/bloom/test", nil) + bloomMissMeter = metrics.NewRegisteredMeter("trie/bloom/miss", nil) + bloomFaultMeter = metrics.NewRegisteredMeter("trie/bloom/fault", nil) + bloomErrorGauge = metrics.NewRegisteredGauge("trie/bloom/error", nil) +) + +// syncBloomHasher is a wrapper around a byte blob to satisfy the interface API +// requirements of the bloom library used. It's used to convert a trie hash into +// a 64 bit mini hash. +type syncBloomHasher []byte + +func (f syncBloomHasher) Write(p []byte) (n int, err error) { panic("not implemented") } +func (f syncBloomHasher) Sum(b []byte) []byte { panic("not implemented") } +func (f syncBloomHasher) Reset() { panic("not implemented") } +func (f syncBloomHasher) BlockSize() int { panic("not implemented") } +func (f syncBloomHasher) Size() int { return 8 } +func (f syncBloomHasher) Sum64() uint64 { return binary.BigEndian.Uint64(f) } + +// SyncBloom is a bloom filter used during fast sync to quickly decide if a trie +// node already exists on disk or not. It self populates from the provided disk +// database on creation in a background thread and will only start returning live +// results once that's finished. +type SyncBloom struct { + bloom *bloomfilter.Filter + inited uint32 + closer sync.Once + closed uint32 + pend sync.WaitGroup +} + +// NewSyncBloom creates a new bloom filter of the given size (in megabytes) and +// initializes it from the database. The bloom is hard coded to use 3 filters. +func NewSyncBloom(memory uint64, database ethdb.Iteratee) *SyncBloom { + // Create the bloom filter to track known trie nodes + bloom, err := bloomfilter.New(memory*1024*1024*8, 3) + if err != nil { + panic(fmt.Sprintf("failed to create bloom: %v", err)) + } + log.Info("Allocated fast sync bloom", "size", common.StorageSize(memory*1024*1024)) + + // Assemble the fast sync bloom and init it from previous sessions + b := &SyncBloom{ + bloom: bloom, + } + b.pend.Add(2) + go func() { + defer b.pend.Done() + b.init(database) + }() + go func() { + defer b.pend.Done() + b.meter() + }() + return b +} + +// init iterates over the database, pushing every trie hash into the bloom filter. +func (b *SyncBloom) init(database ethdb.Iteratee) { + // Iterate over the database, but restart every now and again to avoid holding + // a persistent snapshot since fast sync can push a ton of data concurrently, + // bloating the disk. + // + // Note, this is fine, because everything inserted into leveldb by fast sync is + // also pushed into the bloom directly, so we're not missing anything when the + // iterator is swapped out for a new one. + it := database.NewIterator() + + var ( + start = time.Now() + swap = time.Now() + ) + for it.Next() && atomic.LoadUint32(&b.closed) == 0 { + // If the database entry is a trie node, add it to the bloom + if key := it.Key(); len(key) == common.HashLength { + b.bloom.Add(syncBloomHasher(key)) + bloomLoadMeter.Mark(1) + } + // If enough time elapsed since the last iterator swap, restart + if time.Since(swap) > 8*time.Second { + key := common.CopyBytes(it.Key()) + + it.Release() + it = database.NewIteratorWithStart(key) + + log.Info("Initializing fast sync bloom", "items", b.bloom.N(), "errorrate", b.errorRate(), "elapsed", common.PrettyDuration(time.Since(start))) + swap = time.Now() + } + } + it.Release() + + // Mark the bloom filter inited and return + log.Info("Initialized fast sync bloom", "items", b.bloom.N(), "errorrate", b.errorRate(), "elapsed", common.PrettyDuration(time.Since(start))) + atomic.StoreUint32(&b.inited, 1) +} + +// meter periodically recalculates the false positive error rate of the bloom +// filter and reports it in a metric. +func (b *SyncBloom) meter() { + for { + // Report the current error ration. No floats, lame, scale it up. + bloomErrorGauge.Update(int64(b.errorRate() * 100000)) + + // Wait one second, but check termination more frequently + for i := 0; i < 10; i++ { + if atomic.LoadUint32(&b.closed) == 1 { + return + } + time.Sleep(100 * time.Millisecond) + } + } +} + +// Close terminates any background initializer still running and releases all the +// memory allocated for the bloom. +func (b *SyncBloom) Close() error { + b.closer.Do(func() { + // Ensure the initializer is stopped + atomic.StoreUint32(&b.closed, 1) + b.pend.Wait() + + // Wipe the bloom, but mark it "uninited" just in case someone attempts an access + log.Info("Deallocated fast sync bloom", "items", b.bloom.N(), "errorrate", b.errorRate()) + + atomic.StoreUint32(&b.inited, 0) + b.bloom = nil + }) + return nil +} + +// Add inserts a new trie node hash into the bloom filter. +func (b *SyncBloom) Add(hash []byte) { + if atomic.LoadUint32(&b.closed) == 1 { + return + } + b.bloom.Add(syncBloomHasher(hash)) + bloomAddMeter.Mark(1) +} + +// Contains tests if the bloom filter contains the given hash: +// - false: the bloom definitely does not contain hash +// - true: the bloom maybe contains hash +// +// While the bloom is being initialized, any query will return true. +func (b *SyncBloom) Contains(hash []byte) bool { + bloomTestMeter.Mark(1) + if atomic.LoadUint32(&b.inited) == 0 { + // We didn't load all the trie nodes from the previous run of Geth yet. As + // such, we can't say for sure if a hash is not present for anything. Until + // the init is done, we're faking "possible presence" for everything. + return true + } + // Bloom initialized, check the real one and report any successful misses + maybe := b.bloom.Contains(syncBloomHasher(hash)) + if !maybe { + bloomMissMeter.Mark(1) + } + return maybe +} + +// errorRate calculates the probability of a random containment test returning a +// false positive. +// +// We're calculating it ourselves because the bloom library we used missed a +// parentheses in the formula and calculates it wrong. And it's discontinued... +func (b *SyncBloom) errorRate() float64 { + k := float64(b.bloom.K()) + n := float64(b.bloom.N()) + m := float64(b.bloom.M()) + + return math.Pow(1.0-math.Exp((-k)*(n+0.5)/(m-1)), k) +} diff --git a/trie/sync_test.go b/trie/sync_test.go index c76779e5c73d..0621bb43570e 100644 --- a/trie/sync_test.go +++ b/trie/sync_test.go @@ -21,13 +21,13 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" ) // makeTestTrie create a sample test trie to test node-wise reconstruction. func makeTestTrie() (*Database, *Trie, map[string][]byte) { // Create an empty trie - triedb := NewDatabase(ethdb.NewMemDatabase()) + triedb := NewDatabase(memorydb.New()) trie, _ := New(common.Hash{}, triedb) // Fill it with some arbitrary data @@ -88,13 +88,13 @@ func checkTrieConsistency(db *Database, root common.Hash) error { // Tests that an empty trie is not scheduled for syncing. func TestEmptySync(t *testing.T) { - dbA := NewDatabase(ethdb.NewMemDatabase()) - dbB := NewDatabase(ethdb.NewMemDatabase()) + dbA := NewDatabase(memorydb.New()) + dbB := NewDatabase(memorydb.New()) emptyA, _ := New(common.Hash{}, dbA) emptyB, _ := New(emptyRoot, dbB) for i, trie := range []*Trie{emptyA, emptyB} { - if req := NewSync(trie.Hash(), ethdb.NewMemDatabase(), nil).Missing(1); len(req) != 0 { + if req := NewSync(trie.Hash(), memorydb.New(), nil, NewSyncBloom(1, memorydb.New())).Missing(1); len(req) != 0 { t.Errorf("test %d: content requested for empty trie: %v", i, req) } } @@ -110,9 +110,9 @@ func testIterativeSync(t *testing.T, batch int) { srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) queue := append([]common.Hash{}, sched.Missing(batch)...) for len(queue) > 0 { @@ -133,7 +133,7 @@ func testIterativeSync(t *testing.T, batch int) { queue = append(queue[:0], sched.Missing(batch)...) } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that the trie scheduler can correctly reconstruct the state even if only @@ -143,9 +143,9 @@ func TestIterativeDelayedSync(t *testing.T) { srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) queue := append([]common.Hash{}, sched.Missing(10000)...) for len(queue) > 0 { @@ -167,7 +167,7 @@ func TestIterativeDelayedSync(t *testing.T) { queue = append(queue[len(results):], sched.Missing(10000)...) } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that given a root hash, a trie can sync iteratively on a single thread, @@ -181,9 +181,9 @@ func testIterativeRandomSync(t *testing.T, batch int) { srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) queue := make(map[common.Hash]struct{}) for _, hash := range sched.Missing(batch) { @@ -212,7 +212,7 @@ func testIterativeRandomSync(t *testing.T, batch int) { } } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that the trie scheduler can correctly reconstruct the state even if only @@ -222,9 +222,9 @@ func TestIterativeRandomDelayedSync(t *testing.T) { srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) queue := make(map[common.Hash]struct{}) for _, hash := range sched.Missing(10000) { @@ -259,7 +259,7 @@ func TestIterativeRandomDelayedSync(t *testing.T) { } } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that a trie sync will not request nodes multiple times, even if they @@ -269,9 +269,9 @@ func TestDuplicateAvoidanceSync(t *testing.T) { srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) queue := append([]common.Hash{}, sched.Missing(0)...) requested := make(map[common.Hash]struct{}) @@ -299,7 +299,7 @@ func TestDuplicateAvoidanceSync(t *testing.T) { queue = append(queue[:0], sched.Missing(0)...) } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that at any point in time during a sync, only complete sub-tries are in @@ -309,11 +309,11 @@ func TestIncompleteSync(t *testing.T) { srcDb, srcTrie, _ := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) - added := []common.Hash{} + var added []common.Hash queue := append([]common.Hash{}, sched.Missing(1)...) for len(queue) > 0 { // Fetch a batch of trie nodes diff --git a/trie/trie.go b/trie/trie.go index e920ccd23f10..920e331fd62f 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -24,7 +24,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" ) var ( @@ -35,25 +34,6 @@ var ( emptyState = crypto.Keccak256Hash(nil) ) -var ( - cacheMissCounter = metrics.NewRegisteredCounter("trie/cachemiss", nil) - cacheUnloadCounter = metrics.NewRegisteredCounter("trie/cacheunload", nil) -) - -// CacheMisses retrieves a global counter measuring the number of cache misses -// the trie had since process startup. This isn't useful for anything apart from -// trie debugging purposes. -func CacheMisses() int64 { - return cacheMissCounter.Count() -} - -// CacheUnloads retrieves a global counter measuring the number of cache unloads -// the trie did since process startup. This isn't useful for anything apart from -// trie debugging purposes. -func CacheUnloads() int64 { - return cacheUnloadCounter.Count() -} - // LeafCallback is a callback type invoked when a trie operation reaches a leaf // node. It's used by state sync and commit to allow handling external references // between account and storage tries. @@ -65,26 +45,13 @@ type LeafCallback func(leaf []byte, parent common.Hash) error // // Trie is not safe for concurrent use. type Trie struct { - db *Database - root node - originalRoot common.Hash - - // Cache generation values. - // cachegen increases by one with each commit operation. - // new nodes are tagged with the current generation and unloaded - // when their generation is older than than cachegen-cachelimit. - cachegen, cachelimit uint16 -} - -// SetCacheLimit sets the number of 'cache generations' to keep. -// A cache generation is created by a call to Commit. -func (t *Trie) SetCacheLimit(l uint16) { - t.cachelimit = l + db *Database + root node } // newFlag returns the cache flag value for a newly created node. func (t *Trie) newFlag() nodeFlag { - return nodeFlag{dirty: true, gen: t.cachegen} + return nodeFlag{dirty: true} } // New creates a trie with an existing root node from db. @@ -98,8 +65,7 @@ func New(root common.Hash, db *Database) (*Trie, error) { panic("trie.New called without a database") } trie := &Trie{ - db: db, - originalRoot: root, + db: db, } if root != (common.Hash{}) && root != emptyRoot { rootnode, err := trie.resolveHash(root[:], nil) @@ -154,14 +120,12 @@ func (t *Trie) tryGet(origNode node, key []byte, pos int) (value []byte, newnode if err == nil && didResolve { n = n.copy() n.Val = newnode - n.flags.gen = t.cachegen } return value, n, didResolve, err case *fullNode: value, newnode, didResolve, err = t.tryGet(n.Children[key[pos]], key, pos+1) if err == nil && didResolve { n = n.copy() - n.flags.gen = t.cachegen n.Children[key[pos]] = newnode } return value, n, didResolve, err @@ -430,19 +394,13 @@ func (t *Trie) resolve(n node, prefix []byte) (node, error) { } func (t *Trie) resolveHash(n hashNode, prefix []byte) (node, error) { - cacheMissCounter.Inc(1) - hash := common.BytesToHash(n) - if node := t.db.node(hash, t.cachegen); node != nil { + if node := t.db.node(hash); node != nil { return node, nil } return nil, &MissingNodeError{NodeHash: hash, Path: prefix} } -// Root returns the root hash of the trie. -// Deprecated: use Hash instead. -func (t *Trie) Root() []byte { return t.Hash().Bytes() } - // Hash returns the root hash of the trie. It does not write to the // database and can be used even if the trie doesn't have one. func (t *Trie) Hash() common.Hash { @@ -462,7 +420,6 @@ func (t *Trie) Commit(onleaf LeafCallback) (root common.Hash, err error) { return common.Hash{}, err } t.root = cached - t.cachegen++ return common.BytesToHash(hash.(hashNode)), nil } @@ -470,7 +427,7 @@ func (t *Trie) hashRoot(db *Database, onleaf LeafCallback) (node, node, error) { if t.root == nil { return hashNode(emptyRoot.Bytes()), nil, nil } - h := newHasher(t.cachegen, t.cachelimit, onleaf) + h := newHasher(onleaf) defer returnHasherToPool(h) return h.hash(t.root, db, true) } diff --git a/trie/trie_test.go b/trie/trie_test.go index f8e5fd12a184..2a9d53d0ad6b 100644 --- a/trie/trie_test.go +++ b/trie/trie_test.go @@ -19,7 +19,6 @@ package trie import ( "bytes" "encoding/binary" - "errors" "fmt" "io/ioutil" "math/big" @@ -33,6 +32,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/leveldb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" "github.com/ethereum/go-ethereum/rlp" ) @@ -43,7 +44,7 @@ func init() { // Used for testing func newEmpty() *Trie { - trie, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + trie, _ := New(common.Hash{}, NewDatabase(memorydb.New())) return trie } @@ -51,7 +52,7 @@ func TestEmptyTrie(t *testing.T) { var trie Trie res := trie.Hash() exp := emptyRoot - if res != common.Hash(exp) { + if res != exp { t.Errorf("expected %x got %x", exp, res) } } @@ -67,7 +68,7 @@ func TestNull(t *testing.T) { } func TestMissingRoot(t *testing.T) { - trie, err := New(common.HexToHash("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), NewDatabase(ethdb.NewMemDatabase())) + trie, err := New(common.HexToHash("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), NewDatabase(memorydb.New())) if trie != nil { t.Error("New returned non-nil trie for invalid root") } @@ -80,7 +81,7 @@ func TestMissingNodeDisk(t *testing.T) { testMissingNode(t, false) } func TestMissingNodeMemonly(t *testing.T) { testMissingNode(t, true) } func testMissingNode(t *testing.T, memonly bool) { - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) trie, _ := New(common.Hash{}, triedb) @@ -119,7 +120,7 @@ func testMissingNode(t *testing.T, memonly bool) { hash := common.HexToHash("0xe1d943cc8f061a0c0b98162830b970395ac9315654824bf21b73b891365262f9") if memonly { - delete(triedb.nodes, hash) + delete(triedb.dirties, hash) } else { diskdb.Delete(hash[:]) } @@ -317,44 +318,13 @@ func TestLargeValue(t *testing.T) { } type countingDB struct { - ethdb.Database + ethdb.KeyValueStore gets map[string]int } func (db *countingDB) Get(key []byte) ([]byte, error) { db.gets[string(key)]++ - return db.Database.Get(key) -} - -// TestCacheUnload checks that decoded nodes are unloaded after a -// certain number of commit operations. -func TestCacheUnload(t *testing.T) { - // Create test trie with two branches. - trie := newEmpty() - key1 := "---------------------------------" - key2 := "---some other branch" - updateString(trie, key1, "this is the branch of key1.") - updateString(trie, key2, "this is the branch of key2.") - - root, _ := trie.Commit(nil) - trie.db.Commit(root, true) - - // Commit the trie repeatedly and access key1. - // The branch containing it is loaded from DB exactly two times: - // in the 0th and 6th iteration. - db := &countingDB{Database: trie.db.diskdb, gets: make(map[string]int)} - trie, _ = New(root, NewDatabase(db)) - trie.SetCacheLimit(5) - for i := 0; i < 12; i++ { - getString(trie, key1) - trie.Commit(nil) - } - // Check that it got loaded two times. - for dbkey, count := range db.gets { - if count != 2 { - t.Errorf("db key %x loaded %d times, want %d times", []byte(dbkey), count, 2) - } - } + return db.KeyValueStore.Get(key) } // randTest performs random trie operations. @@ -376,7 +346,6 @@ const ( opHash opReset opItercheckhash - opCheckCacheInvariant opMax // boundary value, not an actual op ) @@ -411,7 +380,7 @@ func (randTest) Generate(r *rand.Rand, size int) reflect.Value { } func runRandTest(rt randTest) bool { - triedb := NewDatabase(ethdb.NewMemDatabase()) + triedb := NewDatabase(memorydb.New()) tr, _ := New(common.Hash{}, triedb) values := make(map[string]string) // tracks content of the trie @@ -455,8 +424,6 @@ func runRandTest(rt randTest) bool { if tr.Hash() != checktr.Hash() { rt[i].err = fmt.Errorf("hash mismatch in opItercheckhash") } - case opCheckCacheInvariant: - rt[i].err = checkCacheInvariant(tr.root, nil, tr.cachegen, false, 0) } // Abort the test on error. if rt[i].err != nil { @@ -466,40 +433,6 @@ func runRandTest(rt randTest) bool { return true } -func checkCacheInvariant(n, parent node, parentCachegen uint16, parentDirty bool, depth int) error { - var children []node - var flag nodeFlag - switch n := n.(type) { - case *shortNode: - flag = n.flags - children = []node{n.Val} - case *fullNode: - flag = n.flags - children = n.Children[:] - default: - return nil - } - - errorf := func(format string, args ...interface{}) error { - msg := fmt.Sprintf(format, args...) - msg += fmt.Sprintf("\nat depth %d node %s", depth, spew.Sdump(n)) - msg += fmt.Sprintf("parent: %s", spew.Sdump(parent)) - return errors.New(msg) - } - if flag.gen > parentCachegen { - return errorf("cache invariant violation: %d > %d\n", flag.gen, parentCachegen) - } - if depth > 0 && !parentDirty && flag.dirty { - return errorf("cache invariant violation: %d > %d\n", flag.gen, parentCachegen) - } - for _, child := range children { - if err := checkCacheInvariant(child, n, flag.gen, flag.dirty, depth+1); err != nil { - return err - } - } - return nil -} - func TestRandom(t *testing.T) { if err := quick.Check(runRandTest, nil); err != nil { if cerr, ok := err.(*quick.CheckError); ok { @@ -539,7 +472,7 @@ func benchGet(b *testing.B, commit bool) { b.StopTimer() if commit { - ldb := trie.db.diskdb.(*ethdb.LDBDatabase) + ldb := trie.db.diskdb.(*leveldb.Database) ldb.Close() os.RemoveAll(ldb.Path()) } @@ -595,7 +528,7 @@ func tempDB() (string, *Database) { if err != nil { panic(fmt.Sprintf("can't create temporary directory: %v", err)) } - diskdb, err := ethdb.NewLDBDatabase(dir, 256, 0) + diskdb, err := leveldb.New(dir, 256, 0, "") if err != nil { panic(fmt.Sprintf("can't create temporary database: %v", err)) } @@ -613,3 +546,16 @@ func updateString(trie *Trie, k, v string) { func deleteString(trie *Trie, k string) { trie.Delete([]byte(k)) } + +func TestDecodeNode(t *testing.T) { + t.Parallel() + var ( + hash = make([]byte, 20) + elems = make([]byte, 20) + ) + for i := 0; i < 5000000; i++ { + rand.Read(hash) + rand.Read(elems) + decodeNode(hash, elems) + } +} diff --git a/vendor/bazil.org/fuse/LICENSE b/vendor/bazil.org/fuse/LICENSE deleted file mode 100644 index 4ac7cd838960..000000000000 --- a/vendor/bazil.org/fuse/LICENSE +++ /dev/null @@ -1,93 +0,0 @@ -Copyright (c) 2013-2015 Tommi Virtanen. -Copyright (c) 2009, 2011, 2012 The Go Authors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - -The following included software components have additional copyright -notices and license terms that may differ from the above. - - -File fuse.go: - -// Adapted from Plan 9 from User Space's src/cmd/9pfuse/fuse.c, -// which carries this notice: -// -// The files in this directory are subject to the following license. -// -// The author of this software is Russ Cox. -// -// Copyright (c) 2006 Russ Cox -// -// Permission to use, copy, modify, and distribute this software for any -// purpose without fee is hereby granted, provided that this entire notice -// is included in all copies of any software which is or includes a copy -// or modification of this software and in all copies of the supporting -// documentation for such software. -// -// THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED -// WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION OR WARRANTY -// OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS -// FITNESS FOR ANY PARTICULAR PURPOSE. - - -File fuse_kernel.go: - -// Derived from FUSE's fuse_kernel.h -/* - This file defines the kernel interface of FUSE - Copyright (C) 2001-2007 Miklos Szeredi - - - This -- and only this -- header file may also be distributed under - the terms of the BSD Licence as follows: - - Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. -*/ diff --git a/vendor/bazil.org/fuse/README.md b/vendor/bazil.org/fuse/README.md deleted file mode 100644 index 8c6d556ee38d..000000000000 --- a/vendor/bazil.org/fuse/README.md +++ /dev/null @@ -1,23 +0,0 @@ -bazil.org/fuse -- Filesystems in Go -=================================== - -`bazil.org/fuse` is a Go library for writing FUSE userspace -filesystems. - -It is a from-scratch implementation of the kernel-userspace -communication protocol, and does not use the C library from the -project called FUSE. `bazil.org/fuse` embraces Go fully for safety and -ease of programming. - -Here’s how to get going: - - go get bazil.org/fuse - -Website: http://bazil.org/fuse/ - -Github repository: https://github.com/bazil/fuse - -API docs: http://godoc.org/bazil.org/fuse - -Our thanks to Russ Cox for his fuse library, which this project is -based on. diff --git a/vendor/bazil.org/fuse/buffer.go b/vendor/bazil.org/fuse/buffer.go deleted file mode 100644 index bb1d2b77696a..000000000000 --- a/vendor/bazil.org/fuse/buffer.go +++ /dev/null @@ -1,35 +0,0 @@ -package fuse - -import "unsafe" - -// buffer provides a mechanism for constructing a message from -// multiple segments. -type buffer []byte - -// alloc allocates size bytes and returns a pointer to the new -// segment. -func (w *buffer) alloc(size uintptr) unsafe.Pointer { - s := int(size) - if len(*w)+s > cap(*w) { - old := *w - *w = make([]byte, len(*w), 2*cap(*w)+s) - copy(*w, old) - } - l := len(*w) - *w = (*w)[:l+s] - return unsafe.Pointer(&(*w)[l]) -} - -// reset clears out the contents of the buffer. -func (w *buffer) reset() { - for i := range (*w)[:cap(*w)] { - (*w)[i] = 0 - } - *w = (*w)[:0] -} - -func newBuffer(extra uintptr) buffer { - const hdrSize = unsafe.Sizeof(outHeader{}) - buf := make(buffer, hdrSize, hdrSize+extra) - return buf -} diff --git a/vendor/bazil.org/fuse/debug.go b/vendor/bazil.org/fuse/debug.go deleted file mode 100644 index be9f900d5e1a..000000000000 --- a/vendor/bazil.org/fuse/debug.go +++ /dev/null @@ -1,21 +0,0 @@ -package fuse - -import ( - "runtime" -) - -func stack() string { - buf := make([]byte, 1024) - return string(buf[:runtime.Stack(buf, false)]) -} - -func nop(msg interface{}) {} - -// Debug is called to output debug messages, including protocol -// traces. The default behavior is to do nothing. -// -// The messages have human-friendly string representations and are -// safe to marshal to JSON. -// -// Implementations must not retain msg. -var Debug func(msg interface{}) = nop diff --git a/vendor/bazil.org/fuse/error_darwin.go b/vendor/bazil.org/fuse/error_darwin.go deleted file mode 100644 index a3fb89ca29f4..000000000000 --- a/vendor/bazil.org/fuse/error_darwin.go +++ /dev/null @@ -1,17 +0,0 @@ -package fuse - -import ( - "syscall" -) - -const ( - ENOATTR = Errno(syscall.ENOATTR) -) - -const ( - errNoXattr = ENOATTR -) - -func init() { - errnoNames[errNoXattr] = "ENOATTR" -} diff --git a/vendor/bazil.org/fuse/error_freebsd.go b/vendor/bazil.org/fuse/error_freebsd.go deleted file mode 100644 index c6ea6d6e71ff..000000000000 --- a/vendor/bazil.org/fuse/error_freebsd.go +++ /dev/null @@ -1,15 +0,0 @@ -package fuse - -import "syscall" - -const ( - ENOATTR = Errno(syscall.ENOATTR) -) - -const ( - errNoXattr = ENOATTR -) - -func init() { - errnoNames[errNoXattr] = "ENOATTR" -} diff --git a/vendor/bazil.org/fuse/error_linux.go b/vendor/bazil.org/fuse/error_linux.go deleted file mode 100644 index 6f113e71ed23..000000000000 --- a/vendor/bazil.org/fuse/error_linux.go +++ /dev/null @@ -1,17 +0,0 @@ -package fuse - -import ( - "syscall" -) - -const ( - ENODATA = Errno(syscall.ENODATA) -) - -const ( - errNoXattr = ENODATA -) - -func init() { - errnoNames[errNoXattr] = "ENODATA" -} diff --git a/vendor/bazil.org/fuse/error_std.go b/vendor/bazil.org/fuse/error_std.go deleted file mode 100644 index 398f43fbf694..000000000000 --- a/vendor/bazil.org/fuse/error_std.go +++ /dev/null @@ -1,31 +0,0 @@ -package fuse - -// There is very little commonality in extended attribute errors -// across platforms. -// -// getxattr return value for "extended attribute does not exist" is -// ENOATTR on OS X, and ENODATA on Linux and apparently at least -// NetBSD. There may be a #define ENOATTR on Linux too, but the value -// is ENODATA in the actual syscalls. FreeBSD and OpenBSD have no -// ENODATA, only ENOATTR. ENOATTR is not in any of the standards, -// ENODATA exists but is only used for STREAMs. -// -// Each platform will define it a errNoXattr constant, and this file -// will enforce that it implements the right interfaces and hide the -// implementation. -// -// https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/getxattr.2.html -// http://mail-index.netbsd.org/tech-kern/2012/04/30/msg013090.html -// http://mail-index.netbsd.org/tech-kern/2012/04/30/msg013097.html -// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html -// http://www.freebsd.org/cgi/man.cgi?query=extattr_get_file&sektion=2 -// http://nixdoc.net/man-pages/openbsd/man2/extattr_get_file.2.html - -// ErrNoXattr is a platform-independent error value meaning the -// extended attribute was not found. It can be used to respond to -// GetxattrRequest and such. -const ErrNoXattr = errNoXattr - -var _ error = ErrNoXattr -var _ Errno = ErrNoXattr -var _ ErrorNumber = ErrNoXattr diff --git a/vendor/bazil.org/fuse/fs/serve.go b/vendor/bazil.org/fuse/fs/serve.go deleted file mode 100644 index e9fc56590fd8..000000000000 --- a/vendor/bazil.org/fuse/fs/serve.go +++ /dev/null @@ -1,1568 +0,0 @@ -// FUSE service loop, for servers that wish to use it. - -package fs // import "bazil.org/fuse/fs" - -import ( - "encoding/binary" - "fmt" - "hash/fnv" - "io" - "log" - "reflect" - "runtime" - "strings" - "sync" - "time" - - "golang.org/x/net/context" -) - -import ( - "bytes" - - "bazil.org/fuse" - "bazil.org/fuse/fuseutil" -) - -const ( - attrValidTime = 1 * time.Minute - entryValidTime = 1 * time.Minute -) - -// TODO: FINISH DOCS - -// An FS is the interface required of a file system. -// -// Other FUSE requests can be handled by implementing methods from the -// FS* interfaces, for example FSStatfser. -type FS interface { - // Root is called to obtain the Node for the file system root. - Root() (Node, error) -} - -type FSStatfser interface { - // Statfs is called to obtain file system metadata. - // It should write that data to resp. - Statfs(ctx context.Context, req *fuse.StatfsRequest, resp *fuse.StatfsResponse) error -} - -type FSDestroyer interface { - // Destroy is called when the file system is shutting down. - // - // Linux only sends this request for block device backed (fuseblk) - // filesystems, to allow them to flush writes to disk before the - // unmount completes. - Destroy() -} - -type FSInodeGenerator interface { - // GenerateInode is called to pick a dynamic inode number when it - // would otherwise be 0. - // - // Not all filesystems bother tracking inodes, but FUSE requires - // the inode to be set, and fewer duplicates in general makes UNIX - // tools work better. - // - // Operations where the nodes may return 0 inodes include Getattr, - // Setattr and ReadDir. - // - // If FS does not implement FSInodeGenerator, GenerateDynamicInode - // is used. - // - // Implementing this is useful to e.g. constrain the range of - // inode values used for dynamic inodes. - GenerateInode(parentInode uint64, name string) uint64 -} - -// A Node is the interface required of a file or directory. -// See the documentation for type FS for general information -// pertaining to all methods. -// -// A Node must be usable as a map key, that is, it cannot be a -// function, map or slice. -// -// Other FUSE requests can be handled by implementing methods from the -// Node* interfaces, for example NodeOpener. -// -// Methods returning Node should take care to return the same Node -// when the result is logically the same instance. Without this, each -// Node will get a new NodeID, causing spurious cache invalidations, -// extra lookups and aliasing anomalies. This may not matter for a -// simple, read-only filesystem. -type Node interface { - // Attr fills attr with the standard metadata for the node. - // - // Fields with reasonable defaults are prepopulated. For example, - // all times are set to a fixed moment when the program started. - // - // If Inode is left as 0, a dynamic inode number is chosen. - // - // The result may be cached for the duration set in Valid. - Attr(ctx context.Context, attr *fuse.Attr) error -} - -type NodeGetattrer interface { - // Getattr obtains the standard metadata for the receiver. - // It should store that metadata in resp. - // - // If this method is not implemented, the attributes will be - // generated based on Attr(), with zero values filled in. - Getattr(ctx context.Context, req *fuse.GetattrRequest, resp *fuse.GetattrResponse) error -} - -type NodeSetattrer interface { - // Setattr sets the standard metadata for the receiver. - // - // Note, this is also used to communicate changes in the size of - // the file, outside of Writes. - // - // req.Valid is a bitmask of what fields are actually being set. - // For example, the method should not change the mode of the file - // unless req.Valid.Mode() is true. - Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error -} - -type NodeSymlinker interface { - // Symlink creates a new symbolic link in the receiver, which must be a directory. - // - // TODO is the above true about directories? - Symlink(ctx context.Context, req *fuse.SymlinkRequest) (Node, error) -} - -// This optional request will be called only for symbolic link nodes. -type NodeReadlinker interface { - // Readlink reads a symbolic link. - Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error) -} - -type NodeLinker interface { - // Link creates a new directory entry in the receiver based on an - // existing Node. Receiver must be a directory. - Link(ctx context.Context, req *fuse.LinkRequest, old Node) (Node, error) -} - -type NodeRemover interface { - // Remove removes the entry with the given name from - // the receiver, which must be a directory. The entry to be removed - // may correspond to a file (unlink) or to a directory (rmdir). - Remove(ctx context.Context, req *fuse.RemoveRequest) error -} - -type NodeAccesser interface { - // Access checks whether the calling context has permission for - // the given operations on the receiver. If so, Access should - // return nil. If not, Access should return EPERM. - // - // Note that this call affects the result of the access(2) system - // call but not the open(2) system call. If Access is not - // implemented, the Node behaves as if it always returns nil - // (permission granted), relying on checks in Open instead. - Access(ctx context.Context, req *fuse.AccessRequest) error -} - -type NodeStringLookuper interface { - // Lookup looks up a specific entry in the receiver, - // which must be a directory. Lookup should return a Node - // corresponding to the entry. If the name does not exist in - // the directory, Lookup should return ENOENT. - // - // Lookup need not to handle the names "." and "..". - Lookup(ctx context.Context, name string) (Node, error) -} - -type NodeRequestLookuper interface { - // Lookup looks up a specific entry in the receiver. - // See NodeStringLookuper for more. - Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (Node, error) -} - -type NodeMkdirer interface { - Mkdir(ctx context.Context, req *fuse.MkdirRequest) (Node, error) -} - -type NodeOpener interface { - // Open opens the receiver. After a successful open, a client - // process has a file descriptor referring to this Handle. - // - // Open can also be also called on non-files. For example, - // directories are Opened for ReadDir or fchdir(2). - // - // If this method is not implemented, the open will always - // succeed, and the Node itself will be used as the Handle. - // - // XXX note about access. XXX OpenFlags. - Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (Handle, error) -} - -type NodeCreater interface { - // Create creates a new directory entry in the receiver, which - // must be a directory. - Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (Node, Handle, error) -} - -type NodeForgetter interface { - // Forget about this node. This node will not receive further - // method calls. - // - // Forget is not necessarily seen on unmount, as all nodes are - // implicitly forgotten as part part of the unmount. - Forget() -} - -type NodeRenamer interface { - Rename(ctx context.Context, req *fuse.RenameRequest, newDir Node) error -} - -type NodeMknoder interface { - Mknod(ctx context.Context, req *fuse.MknodRequest) (Node, error) -} - -// TODO this should be on Handle not Node -type NodeFsyncer interface { - Fsync(ctx context.Context, req *fuse.FsyncRequest) error -} - -type NodeGetxattrer interface { - // Getxattr gets an extended attribute by the given name from the - // node. - // - // If there is no xattr by that name, returns fuse.ErrNoXattr. - Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error -} - -type NodeListxattrer interface { - // Listxattr lists the extended attributes recorded for the node. - Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error -} - -type NodeSetxattrer interface { - // Setxattr sets an extended attribute with the given name and - // value for the node. - Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error -} - -type NodeRemovexattrer interface { - // Removexattr removes an extended attribute for the name. - // - // If there is no xattr by that name, returns fuse.ErrNoXattr. - Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error -} - -var startTime = time.Now() - -func nodeAttr(ctx context.Context, n Node, attr *fuse.Attr) error { - attr.Valid = attrValidTime - attr.Nlink = 1 - attr.Atime = startTime - attr.Mtime = startTime - attr.Ctime = startTime - attr.Crtime = startTime - if err := n.Attr(ctx, attr); err != nil { - return err - } - return nil -} - -// A Handle is the interface required of an opened file or directory. -// See the documentation for type FS for general information -// pertaining to all methods. -// -// Other FUSE requests can be handled by implementing methods from the -// Handle* interfaces. The most common to implement are HandleReader, -// HandleReadDirer, and HandleWriter. -// -// TODO implement methods: Getlk, Setlk, Setlkw -type Handle interface { -} - -type HandleFlusher interface { - // Flush is called each time the file or directory is closed. - // Because there can be multiple file descriptors referring to a - // single opened file, Flush can be called multiple times. - Flush(ctx context.Context, req *fuse.FlushRequest) error -} - -type HandleReadAller interface { - ReadAll(ctx context.Context) ([]byte, error) -} - -type HandleReadDirAller interface { - ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) -} - -type HandleReader interface { - // Read requests to read data from the handle. - // - // There is a page cache in the kernel that normally submits only - // page-aligned reads spanning one or more pages. However, you - // should not rely on this. To see individual requests as - // submitted by the file system clients, set OpenDirectIO. - // - // Note that reads beyond the size of the file as reported by Attr - // are not even attempted (except in OpenDirectIO mode). - Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error -} - -type HandleWriter interface { - // Write requests to write data into the handle at the given offset. - // Store the amount of data written in resp.Size. - // - // There is a writeback page cache in the kernel that normally submits - // only page-aligned writes spanning one or more pages. However, - // you should not rely on this. To see individual requests as - // submitted by the file system clients, set OpenDirectIO. - // - // Writes that grow the file are expected to update the file size - // (as seen through Attr). Note that file size changes are - // communicated also through Setattr. - Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error -} - -type HandleReleaser interface { - Release(ctx context.Context, req *fuse.ReleaseRequest) error -} - -type Config struct { - // Function to send debug log messages to. If nil, use fuse.Debug. - // Note that changing this or fuse.Debug may not affect existing - // calls to Serve. - // - // See fuse.Debug for the rules that log functions must follow. - Debug func(msg interface{}) - - // Function to put things into context for processing the request. - // The returned context must have ctx as its parent. - // - // Note that changing this may not affect existing calls to Serve. - // - // Must not retain req. - WithContext func(ctx context.Context, req fuse.Request) context.Context -} - -// New returns a new FUSE server ready to serve this kernel FUSE -// connection. -// -// Config may be nil. -func New(conn *fuse.Conn, config *Config) *Server { - s := &Server{ - conn: conn, - req: map[fuse.RequestID]*serveRequest{}, - nodeRef: map[Node]fuse.NodeID{}, - dynamicInode: GenerateDynamicInode, - } - if config != nil { - s.debug = config.Debug - s.context = config.WithContext - } - if s.debug == nil { - s.debug = fuse.Debug - } - return s -} - -type Server struct { - // set in New - conn *fuse.Conn - debug func(msg interface{}) - context func(ctx context.Context, req fuse.Request) context.Context - - // set once at Serve time - fs FS - dynamicInode func(parent uint64, name string) uint64 - - // state, protected by meta - meta sync.Mutex - req map[fuse.RequestID]*serveRequest - node []*serveNode - nodeRef map[Node]fuse.NodeID - handle []*serveHandle - freeNode []fuse.NodeID - freeHandle []fuse.HandleID - nodeGen uint64 - - // Used to ensure worker goroutines finish before Serve returns - wg sync.WaitGroup -} - -// Serve serves the FUSE connection by making calls to the methods -// of fs and the Nodes and Handles it makes available. It returns only -// when the connection has been closed or an unexpected error occurs. -func (s *Server) Serve(fs FS) error { - defer s.wg.Wait() // Wait for worker goroutines to complete before return - - s.fs = fs - if dyn, ok := fs.(FSInodeGenerator); ok { - s.dynamicInode = dyn.GenerateInode - } - - root, err := fs.Root() - if err != nil { - return fmt.Errorf("cannot obtain root node: %v", err) - } - // Recognize the root node if it's ever returned from Lookup, - // passed to Invalidate, etc. - s.nodeRef[root] = 1 - s.node = append(s.node, nil, &serveNode{ - inode: 1, - generation: s.nodeGen, - node: root, - refs: 1, - }) - s.handle = append(s.handle, nil) - - for { - req, err := s.conn.ReadRequest() - if err != nil { - if err == io.EOF { - break - } - return err - } - - s.wg.Add(1) - go func() { - defer s.wg.Done() - s.serve(req) - }() - } - return nil -} - -// Serve serves a FUSE connection with the default settings. See -// Server.Serve. -func Serve(c *fuse.Conn, fs FS) error { - server := New(c, nil) - return server.Serve(fs) -} - -type nothing struct{} - -type serveRequest struct { - Request fuse.Request - cancel func() -} - -type serveNode struct { - inode uint64 - generation uint64 - node Node - refs uint64 - - // Delay freeing the NodeID until waitgroup is done. This allows - // using the NodeID for short periods of time without holding the - // Server.meta lock. - // - // Rules: - // - // - hold Server.meta while calling wg.Add, then unlock - // - do NOT try to reacquire Server.meta - wg sync.WaitGroup -} - -func (sn *serveNode) attr(ctx context.Context, attr *fuse.Attr) error { - err := nodeAttr(ctx, sn.node, attr) - if attr.Inode == 0 { - attr.Inode = sn.inode - } - return err -} - -type serveHandle struct { - handle Handle - readData []byte - nodeID fuse.NodeID -} - -// NodeRef is deprecated. It remains here to decrease code churn on -// FUSE library users. You may remove it from your program now; -// returning the same Node values are now recognized automatically, -// without needing NodeRef. -type NodeRef struct{} - -func (c *Server) saveNode(inode uint64, node Node) (id fuse.NodeID, gen uint64) { - c.meta.Lock() - defer c.meta.Unlock() - - if id, ok := c.nodeRef[node]; ok { - sn := c.node[id] - sn.refs++ - return id, sn.generation - } - - sn := &serveNode{inode: inode, node: node, refs: 1} - if n := len(c.freeNode); n > 0 { - id = c.freeNode[n-1] - c.freeNode = c.freeNode[:n-1] - c.node[id] = sn - c.nodeGen++ - } else { - id = fuse.NodeID(len(c.node)) - c.node = append(c.node, sn) - } - sn.generation = c.nodeGen - c.nodeRef[node] = id - return id, sn.generation -} - -func (c *Server) saveHandle(handle Handle, nodeID fuse.NodeID) (id fuse.HandleID) { - c.meta.Lock() - shandle := &serveHandle{handle: handle, nodeID: nodeID} - if n := len(c.freeHandle); n > 0 { - id = c.freeHandle[n-1] - c.freeHandle = c.freeHandle[:n-1] - c.handle[id] = shandle - } else { - id = fuse.HandleID(len(c.handle)) - c.handle = append(c.handle, shandle) - } - c.meta.Unlock() - return -} - -type nodeRefcountDropBug struct { - N uint64 - Refs uint64 - Node fuse.NodeID -} - -func (n *nodeRefcountDropBug) String() string { - return fmt.Sprintf("bug: trying to drop %d of %d references to %v", n.N, n.Refs, n.Node) -} - -func (c *Server) dropNode(id fuse.NodeID, n uint64) (forget bool) { - c.meta.Lock() - defer c.meta.Unlock() - snode := c.node[id] - - if snode == nil { - // this should only happen if refcounts kernel<->us disagree - // *and* two ForgetRequests for the same node race each other; - // this indicates a bug somewhere - c.debug(nodeRefcountDropBug{N: n, Node: id}) - - // we may end up triggering Forget twice, but that's better - // than not even once, and that's the best we can do - return true - } - - if n > snode.refs { - c.debug(nodeRefcountDropBug{N: n, Refs: snode.refs, Node: id}) - n = snode.refs - } - - snode.refs -= n - if snode.refs == 0 { - snode.wg.Wait() - c.node[id] = nil - delete(c.nodeRef, snode.node) - c.freeNode = append(c.freeNode, id) - return true - } - return false -} - -func (c *Server) dropHandle(id fuse.HandleID) { - c.meta.Lock() - c.handle[id] = nil - c.freeHandle = append(c.freeHandle, id) - c.meta.Unlock() -} - -type missingHandle struct { - Handle fuse.HandleID - MaxHandle fuse.HandleID -} - -func (m missingHandle) String() string { - return fmt.Sprint("missing handle: ", m.Handle, m.MaxHandle) -} - -// Returns nil for invalid handles. -func (c *Server) getHandle(id fuse.HandleID) (shandle *serveHandle) { - c.meta.Lock() - defer c.meta.Unlock() - if id < fuse.HandleID(len(c.handle)) { - shandle = c.handle[uint(id)] - } - if shandle == nil { - c.debug(missingHandle{ - Handle: id, - MaxHandle: fuse.HandleID(len(c.handle)), - }) - } - return -} - -type request struct { - Op string - Request *fuse.Header - In interface{} `json:",omitempty"` -} - -func (r request) String() string { - return fmt.Sprintf("<- %s", r.In) -} - -type logResponseHeader struct { - ID fuse.RequestID -} - -func (m logResponseHeader) String() string { - return fmt.Sprintf("ID=%v", m.ID) -} - -type response struct { - Op string - Request logResponseHeader - Out interface{} `json:",omitempty"` - // Errno contains the errno value as a string, for example "EPERM". - Errno string `json:",omitempty"` - // Error may contain a free form error message. - Error string `json:",omitempty"` -} - -func (r response) errstr() string { - s := r.Errno - if r.Error != "" { - // prefix the errno constant to the long form message - s = s + ": " + r.Error - } - return s -} - -func (r response) String() string { - switch { - case r.Errno != "" && r.Out != nil: - return fmt.Sprintf("-> [%v] %v error=%s", r.Request, r.Out, r.errstr()) - case r.Errno != "": - return fmt.Sprintf("-> [%v] %s error=%s", r.Request, r.Op, r.errstr()) - case r.Out != nil: - // make sure (seemingly) empty values are readable - switch r.Out.(type) { - case string: - return fmt.Sprintf("-> [%v] %s %q", r.Request, r.Op, r.Out) - case []byte: - return fmt.Sprintf("-> [%v] %s [% x]", r.Request, r.Op, r.Out) - default: - return fmt.Sprintf("-> [%v] %v", r.Request, r.Out) - } - default: - return fmt.Sprintf("-> [%v] %s", r.Request, r.Op) - } -} - -type notification struct { - Op string - Node fuse.NodeID - Out interface{} `json:",omitempty"` - Err string `json:",omitempty"` -} - -func (n notification) String() string { - var buf bytes.Buffer - fmt.Fprintf(&buf, "=> %s %v", n.Op, n.Node) - if n.Out != nil { - // make sure (seemingly) empty values are readable - switch n.Out.(type) { - case string: - fmt.Fprintf(&buf, " %q", n.Out) - case []byte: - fmt.Fprintf(&buf, " [% x]", n.Out) - default: - fmt.Fprintf(&buf, " %s", n.Out) - } - } - if n.Err != "" { - fmt.Fprintf(&buf, " Err:%v", n.Err) - } - return buf.String() -} - -type logMissingNode struct { - MaxNode fuse.NodeID -} - -func opName(req fuse.Request) string { - t := reflect.Indirect(reflect.ValueOf(req)).Type() - s := t.Name() - s = strings.TrimSuffix(s, "Request") - return s -} - -type logLinkRequestOldNodeNotFound struct { - Request *fuse.Header - In *fuse.LinkRequest -} - -func (m *logLinkRequestOldNodeNotFound) String() string { - return fmt.Sprintf("In LinkRequest (request %v), node %d not found", m.Request.Hdr().ID, m.In.OldNode) -} - -type renameNewDirNodeNotFound struct { - Request *fuse.Header - In *fuse.RenameRequest -} - -func (m *renameNewDirNodeNotFound) String() string { - return fmt.Sprintf("In RenameRequest (request %v), node %d not found", m.Request.Hdr().ID, m.In.NewDir) -} - -type handlerPanickedError struct { - Request interface{} - Err interface{} -} - -var _ error = handlerPanickedError{} - -func (h handlerPanickedError) Error() string { - return fmt.Sprintf("handler panicked: %v", h.Err) -} - -var _ fuse.ErrorNumber = handlerPanickedError{} - -func (h handlerPanickedError) Errno() fuse.Errno { - if err, ok := h.Err.(fuse.ErrorNumber); ok { - return err.Errno() - } - return fuse.DefaultErrno -} - -// handlerTerminatedError happens when a handler terminates itself -// with runtime.Goexit. This is most commonly because of incorrect use -// of testing.TB.FailNow, typically via t.Fatal. -type handlerTerminatedError struct { - Request interface{} -} - -var _ error = handlerTerminatedError{} - -func (h handlerTerminatedError) Error() string { - return fmt.Sprintf("handler terminated (called runtime.Goexit)") -} - -var _ fuse.ErrorNumber = handlerTerminatedError{} - -func (h handlerTerminatedError) Errno() fuse.Errno { - return fuse.DefaultErrno -} - -type handleNotReaderError struct { - handle Handle -} - -var _ error = handleNotReaderError{} - -func (e handleNotReaderError) Error() string { - return fmt.Sprintf("handle has no Read: %T", e.handle) -} - -var _ fuse.ErrorNumber = handleNotReaderError{} - -func (e handleNotReaderError) Errno() fuse.Errno { - return fuse.ENOTSUP -} - -func initLookupResponse(s *fuse.LookupResponse) { - s.EntryValid = entryValidTime -} - -func (c *Server) serve(r fuse.Request) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - parentCtx := ctx - if c.context != nil { - ctx = c.context(ctx, r) - } - - req := &serveRequest{Request: r, cancel: cancel} - - c.debug(request{ - Op: opName(r), - Request: r.Hdr(), - In: r, - }) - var node Node - var snode *serveNode - c.meta.Lock() - hdr := r.Hdr() - if id := hdr.Node; id != 0 { - if id < fuse.NodeID(len(c.node)) { - snode = c.node[uint(id)] - } - if snode == nil { - c.meta.Unlock() - c.debug(response{ - Op: opName(r), - Request: logResponseHeader{ID: hdr.ID}, - Error: fuse.ESTALE.ErrnoName(), - // this is the only place that sets both Error and - // Out; not sure if i want to do that; might get rid - // of len(c.node) things altogether - Out: logMissingNode{ - MaxNode: fuse.NodeID(len(c.node)), - }, - }) - r.RespondError(fuse.ESTALE) - return - } - node = snode.node - } - if c.req[hdr.ID] != nil { - // This happens with OSXFUSE. Assume it's okay and - // that we'll never see an interrupt for this one. - // Otherwise everything wedges. TODO: Report to OSXFUSE? - // - // TODO this might have been because of missing done() calls - } else { - c.req[hdr.ID] = req - } - c.meta.Unlock() - - // Call this before responding. - // After responding is too late: we might get another request - // with the same ID and be very confused. - done := func(resp interface{}) { - msg := response{ - Op: opName(r), - Request: logResponseHeader{ID: hdr.ID}, - } - if err, ok := resp.(error); ok { - msg.Error = err.Error() - if ferr, ok := err.(fuse.ErrorNumber); ok { - errno := ferr.Errno() - msg.Errno = errno.ErrnoName() - if errno == err { - // it's just a fuse.Errno with no extra detail; - // skip the textual message for log readability - msg.Error = "" - } - } else { - msg.Errno = fuse.DefaultErrno.ErrnoName() - } - } else { - msg.Out = resp - } - c.debug(msg) - - c.meta.Lock() - delete(c.req, hdr.ID) - c.meta.Unlock() - } - - var responded bool - defer func() { - if rec := recover(); rec != nil { - const size = 1 << 16 - buf := make([]byte, size) - n := runtime.Stack(buf, false) - buf = buf[:n] - log.Printf("fuse: panic in handler for %v: %v\n%s", r, rec, buf) - err := handlerPanickedError{ - Request: r, - Err: rec, - } - done(err) - r.RespondError(err) - return - } - - if !responded { - err := handlerTerminatedError{ - Request: r, - } - done(err) - r.RespondError(err) - } - }() - - if err := c.handleRequest(ctx, node, snode, r, done); err != nil { - if err == context.Canceled { - select { - case <-parentCtx.Done(): - // We canceled the parent context because of an - // incoming interrupt request, so return EINTR - // to trigger the right behavior in the client app. - // - // Only do this when it's the parent context that was - // canceled, not a context controlled by the program - // using this library, so we don't return EINTR too - // eagerly -- it might cause busy loops. - // - // Decent write-up on role of EINTR: - // http://250bpm.com/blog:12 - err = fuse.EINTR - default: - // nothing - } - } - done(err) - r.RespondError(err) - } - - // disarm runtime.Goexit protection - responded = true -} - -// handleRequest will either a) call done(s) and r.Respond(s) OR b) return an error. -func (c *Server) handleRequest(ctx context.Context, node Node, snode *serveNode, r fuse.Request, done func(resp interface{})) error { - switch r := r.(type) { - default: - // Note: To FUSE, ENOSYS means "this server never implements this request." - // It would be inappropriate to return ENOSYS for other operations in this - // switch that might only be unavailable in some contexts, not all. - return fuse.ENOSYS - - case *fuse.StatfsRequest: - s := &fuse.StatfsResponse{} - if fs, ok := c.fs.(FSStatfser); ok { - if err := fs.Statfs(ctx, r, s); err != nil { - return err - } - } - done(s) - r.Respond(s) - return nil - - // Node operations. - case *fuse.GetattrRequest: - s := &fuse.GetattrResponse{} - if n, ok := node.(NodeGetattrer); ok { - if err := n.Getattr(ctx, r, s); err != nil { - return err - } - } else { - if err := snode.attr(ctx, &s.Attr); err != nil { - return err - } - } - done(s) - r.Respond(s) - return nil - - case *fuse.SetattrRequest: - s := &fuse.SetattrResponse{} - if n, ok := node.(NodeSetattrer); ok { - if err := n.Setattr(ctx, r, s); err != nil { - return err - } - } - - if err := snode.attr(ctx, &s.Attr); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.SymlinkRequest: - s := &fuse.SymlinkResponse{} - initLookupResponse(&s.LookupResponse) - n, ok := node.(NodeSymlinker) - if !ok { - return fuse.EIO // XXX or EPERM like Mkdir? - } - n2, err := n.Symlink(ctx, r) - if err != nil { - return err - } - if err := c.saveLookup(ctx, &s.LookupResponse, snode, r.NewName, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.ReadlinkRequest: - n, ok := node.(NodeReadlinker) - if !ok { - return fuse.EIO /// XXX or EPERM? - } - target, err := n.Readlink(ctx, r) - if err != nil { - return err - } - done(target) - r.Respond(target) - return nil - - case *fuse.LinkRequest: - n, ok := node.(NodeLinker) - if !ok { - return fuse.EIO /// XXX or EPERM? - } - c.meta.Lock() - var oldNode *serveNode - if int(r.OldNode) < len(c.node) { - oldNode = c.node[r.OldNode] - } - c.meta.Unlock() - if oldNode == nil { - c.debug(logLinkRequestOldNodeNotFound{ - Request: r.Hdr(), - In: r, - }) - return fuse.EIO - } - n2, err := n.Link(ctx, r, oldNode.node) - if err != nil { - return err - } - s := &fuse.LookupResponse{} - initLookupResponse(s) - if err := c.saveLookup(ctx, s, snode, r.NewName, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.RemoveRequest: - n, ok := node.(NodeRemover) - if !ok { - return fuse.EIO /// XXX or EPERM? - } - err := n.Remove(ctx, r) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.AccessRequest: - if n, ok := node.(NodeAccesser); ok { - if err := n.Access(ctx, r); err != nil { - return err - } - } - done(nil) - r.Respond() - return nil - - case *fuse.LookupRequest: - var n2 Node - var err error - s := &fuse.LookupResponse{} - initLookupResponse(s) - if n, ok := node.(NodeStringLookuper); ok { - n2, err = n.Lookup(ctx, r.Name) - } else if n, ok := node.(NodeRequestLookuper); ok { - n2, err = n.Lookup(ctx, r, s) - } else { - return fuse.ENOENT - } - if err != nil { - return err - } - if err := c.saveLookup(ctx, s, snode, r.Name, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.MkdirRequest: - s := &fuse.MkdirResponse{} - initLookupResponse(&s.LookupResponse) - n, ok := node.(NodeMkdirer) - if !ok { - return fuse.EPERM - } - n2, err := n.Mkdir(ctx, r) - if err != nil { - return err - } - if err := c.saveLookup(ctx, &s.LookupResponse, snode, r.Name, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.OpenRequest: - s := &fuse.OpenResponse{} - var h2 Handle - if n, ok := node.(NodeOpener); ok { - hh, err := n.Open(ctx, r, s) - if err != nil { - return err - } - h2 = hh - } else { - h2 = node - } - s.Handle = c.saveHandle(h2, r.Hdr().Node) - done(s) - r.Respond(s) - return nil - - case *fuse.CreateRequest: - n, ok := node.(NodeCreater) - if !ok { - // If we send back ENOSYS, FUSE will try mknod+open. - return fuse.EPERM - } - s := &fuse.CreateResponse{OpenResponse: fuse.OpenResponse{}} - initLookupResponse(&s.LookupResponse) - n2, h2, err := n.Create(ctx, r, s) - if err != nil { - return err - } - if err := c.saveLookup(ctx, &s.LookupResponse, snode, r.Name, n2); err != nil { - return err - } - s.Handle = c.saveHandle(h2, r.Hdr().Node) - done(s) - r.Respond(s) - return nil - - case *fuse.GetxattrRequest: - n, ok := node.(NodeGetxattrer) - if !ok { - return fuse.ENOTSUP - } - s := &fuse.GetxattrResponse{} - err := n.Getxattr(ctx, r, s) - if err != nil { - return err - } - if r.Size != 0 && uint64(len(s.Xattr)) > uint64(r.Size) { - return fuse.ERANGE - } - done(s) - r.Respond(s) - return nil - - case *fuse.ListxattrRequest: - n, ok := node.(NodeListxattrer) - if !ok { - return fuse.ENOTSUP - } - s := &fuse.ListxattrResponse{} - err := n.Listxattr(ctx, r, s) - if err != nil { - return err - } - if r.Size != 0 && uint64(len(s.Xattr)) > uint64(r.Size) { - return fuse.ERANGE - } - done(s) - r.Respond(s) - return nil - - case *fuse.SetxattrRequest: - n, ok := node.(NodeSetxattrer) - if !ok { - return fuse.ENOTSUP - } - err := n.Setxattr(ctx, r) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.RemovexattrRequest: - n, ok := node.(NodeRemovexattrer) - if !ok { - return fuse.ENOTSUP - } - err := n.Removexattr(ctx, r) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.ForgetRequest: - forget := c.dropNode(r.Hdr().Node, r.N) - if forget { - n, ok := node.(NodeForgetter) - if ok { - n.Forget() - } - } - done(nil) - r.Respond() - return nil - - // Handle operations. - case *fuse.ReadRequest: - shandle := c.getHandle(r.Handle) - if shandle == nil { - return fuse.ESTALE - } - handle := shandle.handle - - s := &fuse.ReadResponse{Data: make([]byte, 0, r.Size)} - if r.Dir { - if h, ok := handle.(HandleReadDirAller); ok { - // detect rewinddir(3) or similar seek and refresh - // contents - if r.Offset == 0 { - shandle.readData = nil - } - - if shandle.readData == nil { - dirs, err := h.ReadDirAll(ctx) - if err != nil { - return err - } - var data []byte - for _, dir := range dirs { - if dir.Inode == 0 { - dir.Inode = c.dynamicInode(snode.inode, dir.Name) - } - data = fuse.AppendDirent(data, dir) - } - shandle.readData = data - } - fuseutil.HandleRead(r, s, shandle.readData) - done(s) - r.Respond(s) - return nil - } - } else { - if h, ok := handle.(HandleReadAller); ok { - if shandle.readData == nil { - data, err := h.ReadAll(ctx) - if err != nil { - return err - } - if data == nil { - data = []byte{} - } - shandle.readData = data - } - fuseutil.HandleRead(r, s, shandle.readData) - done(s) - r.Respond(s) - return nil - } - h, ok := handle.(HandleReader) - if !ok { - err := handleNotReaderError{handle: handle} - return err - } - if err := h.Read(ctx, r, s); err != nil { - return err - } - } - done(s) - r.Respond(s) - return nil - - case *fuse.WriteRequest: - shandle := c.getHandle(r.Handle) - if shandle == nil { - return fuse.ESTALE - } - - s := &fuse.WriteResponse{} - if h, ok := shandle.handle.(HandleWriter); ok { - if err := h.Write(ctx, r, s); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - } - return fuse.EIO - - case *fuse.FlushRequest: - shandle := c.getHandle(r.Handle) - if shandle == nil { - return fuse.ESTALE - } - handle := shandle.handle - - if h, ok := handle.(HandleFlusher); ok { - if err := h.Flush(ctx, r); err != nil { - return err - } - } - done(nil) - r.Respond() - return nil - - case *fuse.ReleaseRequest: - shandle := c.getHandle(r.Handle) - if shandle == nil { - return fuse.ESTALE - } - handle := shandle.handle - - // No matter what, release the handle. - c.dropHandle(r.Handle) - - if h, ok := handle.(HandleReleaser); ok { - if err := h.Release(ctx, r); err != nil { - return err - } - } - done(nil) - r.Respond() - return nil - - case *fuse.DestroyRequest: - if fs, ok := c.fs.(FSDestroyer); ok { - fs.Destroy() - } - done(nil) - r.Respond() - return nil - - case *fuse.RenameRequest: - c.meta.Lock() - var newDirNode *serveNode - if int(r.NewDir) < len(c.node) { - newDirNode = c.node[r.NewDir] - } - c.meta.Unlock() - if newDirNode == nil { - c.debug(renameNewDirNodeNotFound{ - Request: r.Hdr(), - In: r, - }) - return fuse.EIO - } - n, ok := node.(NodeRenamer) - if !ok { - return fuse.EIO // XXX or EPERM like Mkdir? - } - err := n.Rename(ctx, r, newDirNode.node) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.MknodRequest: - n, ok := node.(NodeMknoder) - if !ok { - return fuse.EIO - } - n2, err := n.Mknod(ctx, r) - if err != nil { - return err - } - s := &fuse.LookupResponse{} - initLookupResponse(s) - if err := c.saveLookup(ctx, s, snode, r.Name, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.FsyncRequest: - n, ok := node.(NodeFsyncer) - if !ok { - return fuse.EIO - } - err := n.Fsync(ctx, r) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.InterruptRequest: - c.meta.Lock() - ireq := c.req[r.IntrID] - if ireq != nil && ireq.cancel != nil { - ireq.cancel() - ireq.cancel = nil - } - c.meta.Unlock() - done(nil) - r.Respond() - return nil - - /* case *FsyncdirRequest: - return ENOSYS - - case *GetlkRequest, *SetlkRequest, *SetlkwRequest: - return ENOSYS - - case *BmapRequest: - return ENOSYS - - case *SetvolnameRequest, *GetxtimesRequest, *ExchangeRequest: - return ENOSYS - */ - } - - panic("not reached") -} - -func (c *Server) saveLookup(ctx context.Context, s *fuse.LookupResponse, snode *serveNode, elem string, n2 Node) error { - if err := nodeAttr(ctx, n2, &s.Attr); err != nil { - return err - } - if s.Attr.Inode == 0 { - s.Attr.Inode = c.dynamicInode(snode.inode, elem) - } - - s.Node, s.Generation = c.saveNode(s.Attr.Inode, n2) - return nil -} - -type invalidateNodeDetail struct { - Off int64 - Size int64 -} - -func (i invalidateNodeDetail) String() string { - return fmt.Sprintf("Off:%d Size:%d", i.Off, i.Size) -} - -func errstr(err error) string { - if err == nil { - return "" - } - return err.Error() -} - -func (s *Server) invalidateNode(node Node, off int64, size int64) error { - s.meta.Lock() - id, ok := s.nodeRef[node] - if ok { - snode := s.node[id] - snode.wg.Add(1) - defer snode.wg.Done() - } - s.meta.Unlock() - if !ok { - // This is what the kernel would have said, if we had been - // able to send this message; it's not cached. - return fuse.ErrNotCached - } - // Delay logging until after we can record the error too. We - // consider a /dev/fuse write to be instantaneous enough to not - // need separate before and after messages. - err := s.conn.InvalidateNode(id, off, size) - s.debug(notification{ - Op: "InvalidateNode", - Node: id, - Out: invalidateNodeDetail{ - Off: off, - Size: size, - }, - Err: errstr(err), - }) - return err -} - -// InvalidateNodeAttr invalidates the kernel cache of the attributes -// of node. -// -// Returns fuse.ErrNotCached if the kernel is not currently caching -// the node. -func (s *Server) InvalidateNodeAttr(node Node) error { - return s.invalidateNode(node, 0, 0) -} - -// InvalidateNodeData invalidates the kernel cache of the attributes -// and data of node. -// -// Returns fuse.ErrNotCached if the kernel is not currently caching -// the node. -func (s *Server) InvalidateNodeData(node Node) error { - return s.invalidateNode(node, 0, -1) -} - -// InvalidateNodeDataRange invalidates the kernel cache of the -// attributes and a range of the data of node. -// -// Returns fuse.ErrNotCached if the kernel is not currently caching -// the node. -func (s *Server) InvalidateNodeDataRange(node Node, off int64, size int64) error { - return s.invalidateNode(node, off, size) -} - -type invalidateEntryDetail struct { - Name string -} - -func (i invalidateEntryDetail) String() string { - return fmt.Sprintf("%q", i.Name) -} - -// InvalidateEntry invalidates the kernel cache of the directory entry -// identified by parent node and entry basename. -// -// Kernel may or may not cache directory listings. To invalidate -// those, use InvalidateNode to invalidate all of the data for a -// directory. (As of 2015-06, Linux FUSE does not cache directory -// listings.) -// -// Returns ErrNotCached if the kernel is not currently caching the -// node. -func (s *Server) InvalidateEntry(parent Node, name string) error { - s.meta.Lock() - id, ok := s.nodeRef[parent] - if ok { - snode := s.node[id] - snode.wg.Add(1) - defer snode.wg.Done() - } - s.meta.Unlock() - if !ok { - // This is what the kernel would have said, if we had been - // able to send this message; it's not cached. - return fuse.ErrNotCached - } - err := s.conn.InvalidateEntry(id, name) - s.debug(notification{ - Op: "InvalidateEntry", - Node: id, - Out: invalidateEntryDetail{ - Name: name, - }, - Err: errstr(err), - }) - return err -} - -// DataHandle returns a read-only Handle that satisfies reads -// using the given data. -func DataHandle(data []byte) Handle { - return &dataHandle{data} -} - -type dataHandle struct { - data []byte -} - -func (d *dataHandle) ReadAll(ctx context.Context) ([]byte, error) { - return d.data, nil -} - -// GenerateDynamicInode returns a dynamic inode. -// -// The parent inode and current entry name are used as the criteria -// for choosing a pseudorandom inode. This makes it likely the same -// entry will get the same inode on multiple runs. -func GenerateDynamicInode(parent uint64, name string) uint64 { - h := fnv.New64a() - var buf [8]byte - binary.LittleEndian.PutUint64(buf[:], parent) - _, _ = h.Write(buf[:]) - _, _ = h.Write([]byte(name)) - var inode uint64 - for { - inode = h.Sum64() - if inode != 0 { - break - } - // there's a tiny probability that result is zero; change the - // input a little and try again - _, _ = h.Write([]byte{'x'}) - } - return inode -} diff --git a/vendor/bazil.org/fuse/fs/tree.go b/vendor/bazil.org/fuse/fs/tree.go deleted file mode 100644 index 7e078045a5a0..000000000000 --- a/vendor/bazil.org/fuse/fs/tree.go +++ /dev/null @@ -1,99 +0,0 @@ -// FUSE directory tree, for servers that wish to use it with the service loop. - -package fs - -import ( - "os" - pathpkg "path" - "strings" - - "golang.org/x/net/context" -) - -import ( - "bazil.org/fuse" -) - -// A Tree implements a basic read-only directory tree for FUSE. -// The Nodes contained in it may still be writable. -type Tree struct { - tree -} - -func (t *Tree) Root() (Node, error) { - return &t.tree, nil -} - -// Add adds the path to the tree, resolving to the given node. -// If path or a prefix of path has already been added to the tree, -// Add panics. -// -// Add is only safe to call before starting to serve requests. -func (t *Tree) Add(path string, node Node) { - path = pathpkg.Clean("/" + path)[1:] - elems := strings.Split(path, "/") - dir := Node(&t.tree) - for i, elem := range elems { - dt, ok := dir.(*tree) - if !ok { - panic("fuse: Tree.Add for " + strings.Join(elems[:i], "/") + " and " + path) - } - n := dt.lookup(elem) - if n != nil { - if i+1 == len(elems) { - panic("fuse: Tree.Add for " + path + " conflicts with " + elem) - } - dir = n - } else { - if i+1 == len(elems) { - dt.add(elem, node) - } else { - dir = &tree{} - dt.add(elem, dir) - } - } - } -} - -type treeDir struct { - name string - node Node -} - -type tree struct { - dir []treeDir -} - -func (t *tree) lookup(name string) Node { - for _, d := range t.dir { - if d.name == name { - return d.node - } - } - return nil -} - -func (t *tree) add(name string, n Node) { - t.dir = append(t.dir, treeDir{name, n}) -} - -func (t *tree) Attr(ctx context.Context, a *fuse.Attr) error { - a.Mode = os.ModeDir | 0555 - return nil -} - -func (t *tree) Lookup(ctx context.Context, name string) (Node, error) { - n := t.lookup(name) - if n != nil { - return n, nil - } - return nil, fuse.ENOENT -} - -func (t *tree) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { - var out []fuse.Dirent - for _, d := range t.dir { - out = append(out, fuse.Dirent{Name: d.name}) - } - return out, nil -} diff --git a/vendor/bazil.org/fuse/fuse.go b/vendor/bazil.org/fuse/fuse.go deleted file mode 100644 index 6db0ef2935f4..000000000000 --- a/vendor/bazil.org/fuse/fuse.go +++ /dev/null @@ -1,2303 +0,0 @@ -// See the file LICENSE for copyright and licensing information. - -// Adapted from Plan 9 from User Space's src/cmd/9pfuse/fuse.c, -// which carries this notice: -// -// The files in this directory are subject to the following license. -// -// The author of this software is Russ Cox. -// -// Copyright (c) 2006 Russ Cox -// -// Permission to use, copy, modify, and distribute this software for any -// purpose without fee is hereby granted, provided that this entire notice -// is included in all copies of any software which is or includes a copy -// or modification of this software and in all copies of the supporting -// documentation for such software. -// -// THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED -// WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION OR WARRANTY -// OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS -// FITNESS FOR ANY PARTICULAR PURPOSE. - -// Package fuse enables writing FUSE file systems on Linux, OS X, and FreeBSD. -// -// On OS X, it requires OSXFUSE (http://osxfuse.github.com/). -// -// There are two approaches to writing a FUSE file system. The first is to speak -// the low-level message protocol, reading from a Conn using ReadRequest and -// writing using the various Respond methods. This approach is closest to -// the actual interaction with the kernel and can be the simplest one in contexts -// such as protocol translators. -// -// Servers of synthesized file systems tend to share common -// bookkeeping abstracted away by the second approach, which is to -// call fs.Serve to serve the FUSE protocol using an implementation of -// the service methods in the interfaces FS* (file system), Node* (file -// or directory), and Handle* (opened file or directory). -// There are a daunting number of such methods that can be written, -// but few are required. -// The specific methods are described in the documentation for those interfaces. -// -// The hellofs subdirectory contains a simple illustration of the fs.Serve approach. -// -// Service Methods -// -// The required and optional methods for the FS, Node, and Handle interfaces -// have the general form -// -// Op(ctx context.Context, req *OpRequest, resp *OpResponse) error -// -// where Op is the name of a FUSE operation. Op reads request -// parameters from req and writes results to resp. An operation whose -// only result is the error result omits the resp parameter. -// -// Multiple goroutines may call service methods simultaneously; the -// methods being called are responsible for appropriate -// synchronization. -// -// The operation must not hold on to the request or response, -// including any []byte fields such as WriteRequest.Data or -// SetxattrRequest.Xattr. -// -// Errors -// -// Operations can return errors. The FUSE interface can only -// communicate POSIX errno error numbers to file system clients, the -// message is not visible to file system clients. The returned error -// can implement ErrorNumber to control the errno returned. Without -// ErrorNumber, a generic errno (EIO) is returned. -// -// Error messages will be visible in the debug log as part of the -// response. -// -// Interrupted Operations -// -// In some file systems, some operations -// may take an undetermined amount of time. For example, a Read waiting for -// a network message or a matching Write might wait indefinitely. If the request -// is cancelled and no longer needed, the context will be cancelled. -// Blocking operations should select on a receive from ctx.Done() and attempt to -// abort the operation early if the receive succeeds (meaning the channel is closed). -// To indicate that the operation failed because it was aborted, return fuse.EINTR. -// -// If an operation does not block for an indefinite amount of time, supporting -// cancellation is not necessary. -// -// Authentication -// -// All requests types embed a Header, meaning that the method can -// inspect req.Pid, req.Uid, and req.Gid as necessary to implement -// permission checking. The kernel FUSE layer normally prevents other -// users from accessing the FUSE file system (to change this, see -// AllowOther, AllowRoot), but does not enforce access modes (to -// change this, see DefaultPermissions). -// -// Mount Options -// -// Behavior and metadata of the mounted file system can be changed by -// passing MountOption values to Mount. -// -package fuse // import "bazil.org/fuse" - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "os" - "sync" - "syscall" - "time" - "unsafe" -) - -// A Conn represents a connection to a mounted FUSE file system. -type Conn struct { - // Ready is closed when the mount is complete or has failed. - Ready <-chan struct{} - - // MountError stores any error from the mount process. Only valid - // after Ready is closed. - MountError error - - // File handle for kernel communication. Only safe to access if - // rio or wio is held. - dev *os.File - wio sync.RWMutex - rio sync.RWMutex - - // Protocol version negotiated with InitRequest/InitResponse. - proto Protocol -} - -// MountpointDoesNotExistError is an error returned when the -// mountpoint does not exist. -type MountpointDoesNotExistError struct { - Path string -} - -var _ error = (*MountpointDoesNotExistError)(nil) - -func (e *MountpointDoesNotExistError) Error() string { - return fmt.Sprintf("mountpoint does not exist: %v", e.Path) -} - -// Mount mounts a new FUSE connection on the named directory -// and returns a connection for reading and writing FUSE messages. -// -// After a successful return, caller must call Close to free -// resources. -// -// Even on successful return, the new mount is not guaranteed to be -// visible until after Conn.Ready is closed. See Conn.MountError for -// possible errors. Incoming requests on Conn must be served to make -// progress. -func Mount(dir string, options ...MountOption) (*Conn, error) { - conf := mountConfig{ - options: make(map[string]string), - } - for _, option := range options { - if err := option(&conf); err != nil { - return nil, err - } - } - - ready := make(chan struct{}, 1) - c := &Conn{ - Ready: ready, - } - f, err := mount(dir, &conf, ready, &c.MountError) - if err != nil { - return nil, err - } - c.dev = f - - if err := initMount(c, &conf); err != nil { - c.Close() - if err == ErrClosedWithoutInit { - // see if we can provide a better error - <-c.Ready - if err := c.MountError; err != nil { - return nil, err - } - } - return nil, err - } - - return c, nil -} - -type OldVersionError struct { - Kernel Protocol - LibraryMin Protocol -} - -func (e *OldVersionError) Error() string { - return fmt.Sprintf("kernel FUSE version is too old: %v < %v", e.Kernel, e.LibraryMin) -} - -var ( - ErrClosedWithoutInit = errors.New("fuse connection closed without init") -) - -func initMount(c *Conn, conf *mountConfig) error { - req, err := c.ReadRequest() - if err != nil { - if err == io.EOF { - return ErrClosedWithoutInit - } - return err - } - r, ok := req.(*InitRequest) - if !ok { - return fmt.Errorf("missing init, got: %T", req) - } - - min := Protocol{protoVersionMinMajor, protoVersionMinMinor} - if r.Kernel.LT(min) { - req.RespondError(Errno(syscall.EPROTO)) - c.Close() - return &OldVersionError{ - Kernel: r.Kernel, - LibraryMin: min, - } - } - - proto := Protocol{protoVersionMaxMajor, protoVersionMaxMinor} - if r.Kernel.LT(proto) { - // Kernel doesn't support the latest version we have. - proto = r.Kernel - } - c.proto = proto - - s := &InitResponse{ - Library: proto, - MaxReadahead: conf.maxReadahead, - MaxWrite: maxWrite, - Flags: InitBigWrites | conf.initFlags, - } - r.Respond(s) - return nil -} - -// A Request represents a single FUSE request received from the kernel. -// Use a type switch to determine the specific kind. -// A request of unrecognized type will have concrete type *Header. -type Request interface { - // Hdr returns the Header associated with this request. - Hdr() *Header - - // RespondError responds to the request with the given error. - RespondError(error) - - String() string -} - -// A RequestID identifies an active FUSE request. -type RequestID uint64 - -func (r RequestID) String() string { - return fmt.Sprintf("%#x", uint64(r)) -} - -// A NodeID is a number identifying a directory or file. -// It must be unique among IDs returned in LookupResponses -// that have not yet been forgotten by ForgetRequests. -type NodeID uint64 - -func (n NodeID) String() string { - return fmt.Sprintf("%#x", uint64(n)) -} - -// A HandleID is a number identifying an open directory or file. -// It only needs to be unique while the directory or file is open. -type HandleID uint64 - -func (h HandleID) String() string { - return fmt.Sprintf("%#x", uint64(h)) -} - -// The RootID identifies the root directory of a FUSE file system. -const RootID NodeID = rootID - -// A Header describes the basic information sent in every request. -type Header struct { - Conn *Conn `json:"-"` // connection this request was received on - ID RequestID // unique ID for request - Node NodeID // file or directory the request is about - Uid uint32 // user ID of process making request - Gid uint32 // group ID of process making request - Pid uint32 // process ID of process making request - - // for returning to reqPool - msg *message -} - -func (h *Header) String() string { - return fmt.Sprintf("ID=%v Node=%v Uid=%d Gid=%d Pid=%d", h.ID, h.Node, h.Uid, h.Gid, h.Pid) -} - -func (h *Header) Hdr() *Header { - return h -} - -func (h *Header) noResponse() { - putMessage(h.msg) -} - -func (h *Header) respond(msg []byte) { - out := (*outHeader)(unsafe.Pointer(&msg[0])) - out.Unique = uint64(h.ID) - h.Conn.respond(msg) - putMessage(h.msg) -} - -// An ErrorNumber is an error with a specific error number. -// -// Operations may return an error value that implements ErrorNumber to -// control what specific error number (errno) to return. -type ErrorNumber interface { - // Errno returns the the error number (errno) for this error. - Errno() Errno -} - -const ( - // ENOSYS indicates that the call is not supported. - ENOSYS = Errno(syscall.ENOSYS) - - // ESTALE is used by Serve to respond to violations of the FUSE protocol. - ESTALE = Errno(syscall.ESTALE) - - ENOENT = Errno(syscall.ENOENT) - EIO = Errno(syscall.EIO) - EPERM = Errno(syscall.EPERM) - - // EINTR indicates request was interrupted by an InterruptRequest. - // See also fs.Intr. - EINTR = Errno(syscall.EINTR) - - ERANGE = Errno(syscall.ERANGE) - ENOTSUP = Errno(syscall.ENOTSUP) - EEXIST = Errno(syscall.EEXIST) -) - -// DefaultErrno is the errno used when error returned does not -// implement ErrorNumber. -const DefaultErrno = EIO - -var errnoNames = map[Errno]string{ - ENOSYS: "ENOSYS", - ESTALE: "ESTALE", - ENOENT: "ENOENT", - EIO: "EIO", - EPERM: "EPERM", - EINTR: "EINTR", - EEXIST: "EEXIST", -} - -// Errno implements Error and ErrorNumber using a syscall.Errno. -type Errno syscall.Errno - -var _ = ErrorNumber(Errno(0)) -var _ = error(Errno(0)) - -func (e Errno) Errno() Errno { - return e -} - -func (e Errno) String() string { - return syscall.Errno(e).Error() -} - -func (e Errno) Error() string { - return syscall.Errno(e).Error() -} - -// ErrnoName returns the short non-numeric identifier for this errno. -// For example, "EIO". -func (e Errno) ErrnoName() string { - s := errnoNames[e] - if s == "" { - s = fmt.Sprint(e.Errno()) - } - return s -} - -func (e Errno) MarshalText() ([]byte, error) { - s := e.ErrnoName() - return []byte(s), nil -} - -func (h *Header) RespondError(err error) { - errno := DefaultErrno - if ferr, ok := err.(ErrorNumber); ok { - errno = ferr.Errno() - } - // FUSE uses negative errors! - // TODO: File bug report against OSXFUSE: positive error causes kernel panic. - buf := newBuffer(0) - hOut := (*outHeader)(unsafe.Pointer(&buf[0])) - hOut.Error = -int32(errno) - h.respond(buf) -} - -// All requests read from the kernel, without data, are shorter than -// this. -var maxRequestSize = syscall.Getpagesize() -var bufSize = maxRequestSize + maxWrite - -// reqPool is a pool of messages. -// -// Lifetime of a logical message is from getMessage to putMessage. -// getMessage is called by ReadRequest. putMessage is called by -// Conn.ReadRequest, Request.Respond, or Request.RespondError. -// -// Messages in the pool are guaranteed to have conn and off zeroed, -// buf allocated and len==bufSize, and hdr set. -var reqPool = sync.Pool{ - New: allocMessage, -} - -func allocMessage() interface{} { - m := &message{buf: make([]byte, bufSize)} - m.hdr = (*inHeader)(unsafe.Pointer(&m.buf[0])) - return m -} - -func getMessage(c *Conn) *message { - m := reqPool.Get().(*message) - m.conn = c - return m -} - -func putMessage(m *message) { - m.buf = m.buf[:bufSize] - m.conn = nil - m.off = 0 - reqPool.Put(m) -} - -// a message represents the bytes of a single FUSE message -type message struct { - conn *Conn - buf []byte // all bytes - hdr *inHeader // header - off int // offset for reading additional fields -} - -func (m *message) len() uintptr { - return uintptr(len(m.buf) - m.off) -} - -func (m *message) data() unsafe.Pointer { - var p unsafe.Pointer - if m.off < len(m.buf) { - p = unsafe.Pointer(&m.buf[m.off]) - } - return p -} - -func (m *message) bytes() []byte { - return m.buf[m.off:] -} - -func (m *message) Header() Header { - h := m.hdr - return Header{ - Conn: m.conn, - ID: RequestID(h.Unique), - Node: NodeID(h.Nodeid), - Uid: h.Uid, - Gid: h.Gid, - Pid: h.Pid, - - msg: m, - } -} - -// fileMode returns a Go os.FileMode from a Unix mode. -func fileMode(unixMode uint32) os.FileMode { - mode := os.FileMode(unixMode & 0777) - switch unixMode & syscall.S_IFMT { - case syscall.S_IFREG: - // nothing - case syscall.S_IFDIR: - mode |= os.ModeDir - case syscall.S_IFCHR: - mode |= os.ModeCharDevice | os.ModeDevice - case syscall.S_IFBLK: - mode |= os.ModeDevice - case syscall.S_IFIFO: - mode |= os.ModeNamedPipe - case syscall.S_IFLNK: - mode |= os.ModeSymlink - case syscall.S_IFSOCK: - mode |= os.ModeSocket - default: - // no idea - mode |= os.ModeDevice - } - if unixMode&syscall.S_ISUID != 0 { - mode |= os.ModeSetuid - } - if unixMode&syscall.S_ISGID != 0 { - mode |= os.ModeSetgid - } - return mode -} - -type noOpcode struct { - Opcode uint32 -} - -func (m noOpcode) String() string { - return fmt.Sprintf("No opcode %v", m.Opcode) -} - -type malformedMessage struct { -} - -func (malformedMessage) String() string { - return "malformed message" -} - -// Close closes the FUSE connection. -func (c *Conn) Close() error { - c.wio.Lock() - defer c.wio.Unlock() - c.rio.Lock() - defer c.rio.Unlock() - return c.dev.Close() -} - -// caller must hold wio or rio -func (c *Conn) fd() int { - return int(c.dev.Fd()) -} - -func (c *Conn) Protocol() Protocol { - return c.proto -} - -// ReadRequest returns the next FUSE request from the kernel. -// -// Caller must call either Request.Respond or Request.RespondError in -// a reasonable time. Caller must not retain Request after that call. -func (c *Conn) ReadRequest() (Request, error) { - m := getMessage(c) -loop: - c.rio.RLock() - n, err := syscall.Read(c.fd(), m.buf) - c.rio.RUnlock() - if err == syscall.EINTR { - // OSXFUSE sends EINTR to userspace when a request interrupt - // completed before it got sent to userspace? - goto loop - } - if err != nil && err != syscall.ENODEV { - putMessage(m) - return nil, err - } - if n <= 0 { - putMessage(m) - return nil, io.EOF - } - m.buf = m.buf[:n] - - if n < inHeaderSize { - putMessage(m) - return nil, errors.New("fuse: message too short") - } - - // FreeBSD FUSE sends a short length in the header - // for FUSE_INIT even though the actual read length is correct. - if n == inHeaderSize+initInSize && m.hdr.Opcode == opInit && m.hdr.Len < uint32(n) { - m.hdr.Len = uint32(n) - } - - // OSXFUSE sometimes sends the wrong m.hdr.Len in a FUSE_WRITE message. - if m.hdr.Len < uint32(n) && m.hdr.Len >= uint32(unsafe.Sizeof(writeIn{})) && m.hdr.Opcode == opWrite { - m.hdr.Len = uint32(n) - } - - if m.hdr.Len != uint32(n) { - // prepare error message before returning m to pool - err := fmt.Errorf("fuse: read %d opcode %d but expected %d", n, m.hdr.Opcode, m.hdr.Len) - putMessage(m) - return nil, err - } - - m.off = inHeaderSize - - // Convert to data structures. - // Do not trust kernel to hand us well-formed data. - var req Request - switch m.hdr.Opcode { - default: - Debug(noOpcode{Opcode: m.hdr.Opcode}) - goto unrecognized - - case opLookup: - buf := m.bytes() - n := len(buf) - if n == 0 || buf[n-1] != '\x00' { - goto corrupt - } - req = &LookupRequest{ - Header: m.Header(), - Name: string(buf[:n-1]), - } - - case opForget: - in := (*forgetIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &ForgetRequest{ - Header: m.Header(), - N: in.Nlookup, - } - - case opGetattr: - switch { - case c.proto.LT(Protocol{7, 9}): - req = &GetattrRequest{ - Header: m.Header(), - } - - default: - in := (*getattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &GetattrRequest{ - Header: m.Header(), - Flags: GetattrFlags(in.GetattrFlags), - Handle: HandleID(in.Fh), - } - } - - case opSetattr: - in := (*setattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &SetattrRequest{ - Header: m.Header(), - Valid: SetattrValid(in.Valid), - Handle: HandleID(in.Fh), - Size: in.Size, - Atime: time.Unix(int64(in.Atime), int64(in.AtimeNsec)), - Mtime: time.Unix(int64(in.Mtime), int64(in.MtimeNsec)), - Mode: fileMode(in.Mode), - Uid: in.Uid, - Gid: in.Gid, - Bkuptime: in.BkupTime(), - Chgtime: in.Chgtime(), - Flags: in.Flags(), - } - - case opReadlink: - if len(m.bytes()) > 0 { - goto corrupt - } - req = &ReadlinkRequest{ - Header: m.Header(), - } - - case opSymlink: - // m.bytes() is "newName\0target\0" - names := m.bytes() - if len(names) == 0 || names[len(names)-1] != 0 { - goto corrupt - } - i := bytes.IndexByte(names, '\x00') - if i < 0 { - goto corrupt - } - newName, target := names[0:i], names[i+1:len(names)-1] - req = &SymlinkRequest{ - Header: m.Header(), - NewName: string(newName), - Target: string(target), - } - - case opLink: - in := (*linkIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - newName := m.bytes()[unsafe.Sizeof(*in):] - if len(newName) < 2 || newName[len(newName)-1] != 0 { - goto corrupt - } - newName = newName[:len(newName)-1] - req = &LinkRequest{ - Header: m.Header(), - OldNode: NodeID(in.Oldnodeid), - NewName: string(newName), - } - - case opMknod: - size := mknodInSize(c.proto) - if m.len() < size { - goto corrupt - } - in := (*mknodIn)(m.data()) - name := m.bytes()[size:] - if len(name) < 2 || name[len(name)-1] != '\x00' { - goto corrupt - } - name = name[:len(name)-1] - r := &MknodRequest{ - Header: m.Header(), - Mode: fileMode(in.Mode), - Rdev: in.Rdev, - Name: string(name), - } - if c.proto.GE(Protocol{7, 12}) { - r.Umask = fileMode(in.Umask) & os.ModePerm - } - req = r - - case opMkdir: - size := mkdirInSize(c.proto) - if m.len() < size { - goto corrupt - } - in := (*mkdirIn)(m.data()) - name := m.bytes()[size:] - i := bytes.IndexByte(name, '\x00') - if i < 0 { - goto corrupt - } - r := &MkdirRequest{ - Header: m.Header(), - Name: string(name[:i]), - // observed on Linux: mkdirIn.Mode & syscall.S_IFMT == 0, - // and this causes fileMode to go into it's "no idea" - // code branch; enforce type to directory - Mode: fileMode((in.Mode &^ syscall.S_IFMT) | syscall.S_IFDIR), - } - if c.proto.GE(Protocol{7, 12}) { - r.Umask = fileMode(in.Umask) & os.ModePerm - } - req = r - - case opUnlink, opRmdir: - buf := m.bytes() - n := len(buf) - if n == 0 || buf[n-1] != '\x00' { - goto corrupt - } - req = &RemoveRequest{ - Header: m.Header(), - Name: string(buf[:n-1]), - Dir: m.hdr.Opcode == opRmdir, - } - - case opRename: - in := (*renameIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - newDirNodeID := NodeID(in.Newdir) - oldNew := m.bytes()[unsafe.Sizeof(*in):] - // oldNew should be "old\x00new\x00" - if len(oldNew) < 4 { - goto corrupt - } - if oldNew[len(oldNew)-1] != '\x00' { - goto corrupt - } - i := bytes.IndexByte(oldNew, '\x00') - if i < 0 { - goto corrupt - } - oldName, newName := string(oldNew[:i]), string(oldNew[i+1:len(oldNew)-1]) - req = &RenameRequest{ - Header: m.Header(), - NewDir: newDirNodeID, - OldName: oldName, - NewName: newName, - } - - case opOpendir, opOpen: - in := (*openIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &OpenRequest{ - Header: m.Header(), - Dir: m.hdr.Opcode == opOpendir, - Flags: openFlags(in.Flags), - } - - case opRead, opReaddir: - in := (*readIn)(m.data()) - if m.len() < readInSize(c.proto) { - goto corrupt - } - r := &ReadRequest{ - Header: m.Header(), - Dir: m.hdr.Opcode == opReaddir, - Handle: HandleID(in.Fh), - Offset: int64(in.Offset), - Size: int(in.Size), - } - if c.proto.GE(Protocol{7, 9}) { - r.Flags = ReadFlags(in.ReadFlags) - r.LockOwner = in.LockOwner - r.FileFlags = openFlags(in.Flags) - } - req = r - - case opWrite: - in := (*writeIn)(m.data()) - if m.len() < writeInSize(c.proto) { - goto corrupt - } - r := &WriteRequest{ - Header: m.Header(), - Handle: HandleID(in.Fh), - Offset: int64(in.Offset), - Flags: WriteFlags(in.WriteFlags), - } - if c.proto.GE(Protocol{7, 9}) { - r.LockOwner = in.LockOwner - r.FileFlags = openFlags(in.Flags) - } - buf := m.bytes()[writeInSize(c.proto):] - if uint32(len(buf)) < in.Size { - goto corrupt - } - r.Data = buf - req = r - - case opStatfs: - req = &StatfsRequest{ - Header: m.Header(), - } - - case opRelease, opReleasedir: - in := (*releaseIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &ReleaseRequest{ - Header: m.Header(), - Dir: m.hdr.Opcode == opReleasedir, - Handle: HandleID(in.Fh), - Flags: openFlags(in.Flags), - ReleaseFlags: ReleaseFlags(in.ReleaseFlags), - LockOwner: in.LockOwner, - } - - case opFsync, opFsyncdir: - in := (*fsyncIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &FsyncRequest{ - Dir: m.hdr.Opcode == opFsyncdir, - Header: m.Header(), - Handle: HandleID(in.Fh), - Flags: in.FsyncFlags, - } - - case opSetxattr: - in := (*setxattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - m.off += int(unsafe.Sizeof(*in)) - name := m.bytes() - i := bytes.IndexByte(name, '\x00') - if i < 0 { - goto corrupt - } - xattr := name[i+1:] - if uint32(len(xattr)) < in.Size { - goto corrupt - } - xattr = xattr[:in.Size] - req = &SetxattrRequest{ - Header: m.Header(), - Flags: in.Flags, - Position: in.position(), - Name: string(name[:i]), - Xattr: xattr, - } - - case opGetxattr: - in := (*getxattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - name := m.bytes()[unsafe.Sizeof(*in):] - i := bytes.IndexByte(name, '\x00') - if i < 0 { - goto corrupt - } - req = &GetxattrRequest{ - Header: m.Header(), - Name: string(name[:i]), - Size: in.Size, - Position: in.position(), - } - - case opListxattr: - in := (*getxattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &ListxattrRequest{ - Header: m.Header(), - Size: in.Size, - Position: in.position(), - } - - case opRemovexattr: - buf := m.bytes() - n := len(buf) - if n == 0 || buf[n-1] != '\x00' { - goto corrupt - } - req = &RemovexattrRequest{ - Header: m.Header(), - Name: string(buf[:n-1]), - } - - case opFlush: - in := (*flushIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &FlushRequest{ - Header: m.Header(), - Handle: HandleID(in.Fh), - Flags: in.FlushFlags, - LockOwner: in.LockOwner, - } - - case opInit: - in := (*initIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &InitRequest{ - Header: m.Header(), - Kernel: Protocol{in.Major, in.Minor}, - MaxReadahead: in.MaxReadahead, - Flags: InitFlags(in.Flags), - } - - case opGetlk: - panic("opGetlk") - case opSetlk: - panic("opSetlk") - case opSetlkw: - panic("opSetlkw") - - case opAccess: - in := (*accessIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &AccessRequest{ - Header: m.Header(), - Mask: in.Mask, - } - - case opCreate: - size := createInSize(c.proto) - if m.len() < size { - goto corrupt - } - in := (*createIn)(m.data()) - name := m.bytes()[size:] - i := bytes.IndexByte(name, '\x00') - if i < 0 { - goto corrupt - } - r := &CreateRequest{ - Header: m.Header(), - Flags: openFlags(in.Flags), - Mode: fileMode(in.Mode), - Name: string(name[:i]), - } - if c.proto.GE(Protocol{7, 12}) { - r.Umask = fileMode(in.Umask) & os.ModePerm - } - req = r - - case opInterrupt: - in := (*interruptIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &InterruptRequest{ - Header: m.Header(), - IntrID: RequestID(in.Unique), - } - - case opBmap: - panic("opBmap") - - case opDestroy: - req = &DestroyRequest{ - Header: m.Header(), - } - - // OS X - case opSetvolname: - panic("opSetvolname") - case opGetxtimes: - panic("opGetxtimes") - case opExchange: - in := (*exchangeIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - oldDirNodeID := NodeID(in.Olddir) - newDirNodeID := NodeID(in.Newdir) - oldNew := m.bytes()[unsafe.Sizeof(*in):] - // oldNew should be "oldname\x00newname\x00" - if len(oldNew) < 4 { - goto corrupt - } - if oldNew[len(oldNew)-1] != '\x00' { - goto corrupt - } - i := bytes.IndexByte(oldNew, '\x00') - if i < 0 { - goto corrupt - } - oldName, newName := string(oldNew[:i]), string(oldNew[i+1:len(oldNew)-1]) - req = &ExchangeDataRequest{ - Header: m.Header(), - OldDir: oldDirNodeID, - NewDir: newDirNodeID, - OldName: oldName, - NewName: newName, - // TODO options - } - } - - return req, nil - -corrupt: - Debug(malformedMessage{}) - putMessage(m) - return nil, fmt.Errorf("fuse: malformed message") - -unrecognized: - // Unrecognized message. - // Assume higher-level code will send a "no idea what you mean" error. - h := m.Header() - return &h, nil -} - -type bugShortKernelWrite struct { - Written int64 - Length int64 - Error string - Stack string -} - -func (b bugShortKernelWrite) String() string { - return fmt.Sprintf("short kernel write: written=%d/%d error=%q stack=\n%s", b.Written, b.Length, b.Error, b.Stack) -} - -type bugKernelWriteError struct { - Error string - Stack string -} - -func (b bugKernelWriteError) String() string { - return fmt.Sprintf("kernel write error: error=%q stack=\n%s", b.Error, b.Stack) -} - -// safe to call even with nil error -func errorString(err error) string { - if err == nil { - return "" - } - return err.Error() -} - -func (c *Conn) writeToKernel(msg []byte) error { - out := (*outHeader)(unsafe.Pointer(&msg[0])) - out.Len = uint32(len(msg)) - - c.wio.RLock() - defer c.wio.RUnlock() - nn, err := syscall.Write(c.fd(), msg) - if err == nil && nn != len(msg) { - Debug(bugShortKernelWrite{ - Written: int64(nn), - Length: int64(len(msg)), - Error: errorString(err), - Stack: stack(), - }) - } - return err -} - -func (c *Conn) respond(msg []byte) { - if err := c.writeToKernel(msg); err != nil { - Debug(bugKernelWriteError{ - Error: errorString(err), - Stack: stack(), - }) - } -} - -type notCachedError struct{} - -func (notCachedError) Error() string { - return "node not cached" -} - -var _ ErrorNumber = notCachedError{} - -func (notCachedError) Errno() Errno { - // Behave just like if the original syscall.ENOENT had been passed - // straight through. - return ENOENT -} - -var ( - ErrNotCached = notCachedError{} -) - -// sendInvalidate sends an invalidate notification to kernel. -// -// A returned ENOENT is translated to a friendlier error. -func (c *Conn) sendInvalidate(msg []byte) error { - switch err := c.writeToKernel(msg); err { - case syscall.ENOENT: - return ErrNotCached - default: - return err - } -} - -// InvalidateNode invalidates the kernel cache of the attributes and a -// range of the data of a node. -// -// Giving offset 0 and size -1 means all data. To invalidate just the -// attributes, give offset 0 and size 0. -// -// Returns ErrNotCached if the kernel is not currently caching the -// node. -func (c *Conn) InvalidateNode(nodeID NodeID, off int64, size int64) error { - buf := newBuffer(unsafe.Sizeof(notifyInvalInodeOut{})) - h := (*outHeader)(unsafe.Pointer(&buf[0])) - // h.Unique is 0 - h.Error = notifyCodeInvalInode - out := (*notifyInvalInodeOut)(buf.alloc(unsafe.Sizeof(notifyInvalInodeOut{}))) - out.Ino = uint64(nodeID) - out.Off = off - out.Len = size - return c.sendInvalidate(buf) -} - -// InvalidateEntry invalidates the kernel cache of the directory entry -// identified by parent directory node ID and entry basename. -// -// Kernel may or may not cache directory listings. To invalidate -// those, use InvalidateNode to invalidate all of the data for a -// directory. (As of 2015-06, Linux FUSE does not cache directory -// listings.) -// -// Returns ErrNotCached if the kernel is not currently caching the -// node. -func (c *Conn) InvalidateEntry(parent NodeID, name string) error { - const maxUint32 = ^uint32(0) - if uint64(len(name)) > uint64(maxUint32) { - // very unlikely, but we don't want to silently truncate - return syscall.ENAMETOOLONG - } - buf := newBuffer(unsafe.Sizeof(notifyInvalEntryOut{}) + uintptr(len(name)) + 1) - h := (*outHeader)(unsafe.Pointer(&buf[0])) - // h.Unique is 0 - h.Error = notifyCodeInvalEntry - out := (*notifyInvalEntryOut)(buf.alloc(unsafe.Sizeof(notifyInvalEntryOut{}))) - out.Parent = uint64(parent) - out.Namelen = uint32(len(name)) - buf = append(buf, name...) - buf = append(buf, '\x00') - return c.sendInvalidate(buf) -} - -// An InitRequest is the first request sent on a FUSE file system. -type InitRequest struct { - Header `json:"-"` - Kernel Protocol - // Maximum readahead in bytes that the kernel plans to use. - MaxReadahead uint32 - Flags InitFlags -} - -var _ = Request(&InitRequest{}) - -func (r *InitRequest) String() string { - return fmt.Sprintf("Init [%v] %v ra=%d fl=%v", &r.Header, r.Kernel, r.MaxReadahead, r.Flags) -} - -// An InitResponse is the response to an InitRequest. -type InitResponse struct { - Library Protocol - // Maximum readahead in bytes that the kernel can use. Ignored if - // greater than InitRequest.MaxReadahead. - MaxReadahead uint32 - Flags InitFlags - // Maximum size of a single write operation. - // Linux enforces a minimum of 4 KiB. - MaxWrite uint32 -} - -func (r *InitResponse) String() string { - return fmt.Sprintf("Init %v ra=%d fl=%v w=%d", r.Library, r.MaxReadahead, r.Flags, r.MaxWrite) -} - -// Respond replies to the request with the given response. -func (r *InitRequest) Respond(resp *InitResponse) { - buf := newBuffer(unsafe.Sizeof(initOut{})) - out := (*initOut)(buf.alloc(unsafe.Sizeof(initOut{}))) - out.Major = resp.Library.Major - out.Minor = resp.Library.Minor - out.MaxReadahead = resp.MaxReadahead - out.Flags = uint32(resp.Flags) - out.MaxWrite = resp.MaxWrite - - // MaxWrite larger than our receive buffer would just lead to - // errors on large writes. - if out.MaxWrite > maxWrite { - out.MaxWrite = maxWrite - } - r.respond(buf) -} - -// A StatfsRequest requests information about the mounted file system. -type StatfsRequest struct { - Header `json:"-"` -} - -var _ = Request(&StatfsRequest{}) - -func (r *StatfsRequest) String() string { - return fmt.Sprintf("Statfs [%s]", &r.Header) -} - -// Respond replies to the request with the given response. -func (r *StatfsRequest) Respond(resp *StatfsResponse) { - buf := newBuffer(unsafe.Sizeof(statfsOut{})) - out := (*statfsOut)(buf.alloc(unsafe.Sizeof(statfsOut{}))) - out.St = kstatfs{ - Blocks: resp.Blocks, - Bfree: resp.Bfree, - Bavail: resp.Bavail, - Files: resp.Files, - Bsize: resp.Bsize, - Namelen: resp.Namelen, - Frsize: resp.Frsize, - } - r.respond(buf) -} - -// A StatfsResponse is the response to a StatfsRequest. -type StatfsResponse struct { - Blocks uint64 // Total data blocks in file system. - Bfree uint64 // Free blocks in file system. - Bavail uint64 // Free blocks in file system if you're not root. - Files uint64 // Total files in file system. - Ffree uint64 // Free files in file system. - Bsize uint32 // Block size - Namelen uint32 // Maximum file name length? - Frsize uint32 // Fragment size, smallest addressable data size in the file system. -} - -func (r *StatfsResponse) String() string { - return fmt.Sprintf("Statfs blocks=%d/%d/%d files=%d/%d bsize=%d frsize=%d namelen=%d", - r.Bavail, r.Bfree, r.Blocks, - r.Ffree, r.Files, - r.Bsize, - r.Frsize, - r.Namelen, - ) -} - -// An AccessRequest asks whether the file can be accessed -// for the purpose specified by the mask. -type AccessRequest struct { - Header `json:"-"` - Mask uint32 -} - -var _ = Request(&AccessRequest{}) - -func (r *AccessRequest) String() string { - return fmt.Sprintf("Access [%s] mask=%#x", &r.Header, r.Mask) -} - -// Respond replies to the request indicating that access is allowed. -// To deny access, use RespondError. -func (r *AccessRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// An Attr is the metadata for a single file or directory. -type Attr struct { - Valid time.Duration // how long Attr can be cached - - Inode uint64 // inode number - Size uint64 // size in bytes - Blocks uint64 // size in 512-byte units - Atime time.Time // time of last access - Mtime time.Time // time of last modification - Ctime time.Time // time of last inode change - Crtime time.Time // time of creation (OS X only) - Mode os.FileMode // file mode - Nlink uint32 // number of links (usually 1) - Uid uint32 // owner uid - Gid uint32 // group gid - Rdev uint32 // device numbers - Flags uint32 // chflags(2) flags (OS X only) - BlockSize uint32 // preferred blocksize for filesystem I/O -} - -func (a Attr) String() string { - return fmt.Sprintf("valid=%v ino=%v size=%d mode=%v", a.Valid, a.Inode, a.Size, a.Mode) -} - -func unix(t time.Time) (sec uint64, nsec uint32) { - nano := t.UnixNano() - sec = uint64(nano / 1e9) - nsec = uint32(nano % 1e9) - return -} - -func (a *Attr) attr(out *attr, proto Protocol) { - out.Ino = a.Inode - out.Size = a.Size - out.Blocks = a.Blocks - out.Atime, out.AtimeNsec = unix(a.Atime) - out.Mtime, out.MtimeNsec = unix(a.Mtime) - out.Ctime, out.CtimeNsec = unix(a.Ctime) - out.SetCrtime(unix(a.Crtime)) - out.Mode = uint32(a.Mode) & 0777 - switch { - default: - out.Mode |= syscall.S_IFREG - case a.Mode&os.ModeDir != 0: - out.Mode |= syscall.S_IFDIR - case a.Mode&os.ModeDevice != 0: - if a.Mode&os.ModeCharDevice != 0 { - out.Mode |= syscall.S_IFCHR - } else { - out.Mode |= syscall.S_IFBLK - } - case a.Mode&os.ModeNamedPipe != 0: - out.Mode |= syscall.S_IFIFO - case a.Mode&os.ModeSymlink != 0: - out.Mode |= syscall.S_IFLNK - case a.Mode&os.ModeSocket != 0: - out.Mode |= syscall.S_IFSOCK - } - if a.Mode&os.ModeSetuid != 0 { - out.Mode |= syscall.S_ISUID - } - if a.Mode&os.ModeSetgid != 0 { - out.Mode |= syscall.S_ISGID - } - out.Nlink = a.Nlink - out.Uid = a.Uid - out.Gid = a.Gid - out.Rdev = a.Rdev - out.SetFlags(a.Flags) - if proto.GE(Protocol{7, 9}) { - out.Blksize = a.BlockSize - } - - return -} - -// A GetattrRequest asks for the metadata for the file denoted by r.Node. -type GetattrRequest struct { - Header `json:"-"` - Flags GetattrFlags - Handle HandleID -} - -var _ = Request(&GetattrRequest{}) - -func (r *GetattrRequest) String() string { - return fmt.Sprintf("Getattr [%s] %v fl=%v", &r.Header, r.Handle, r.Flags) -} - -// Respond replies to the request with the given response. -func (r *GetattrRequest) Respond(resp *GetattrResponse) { - size := attrOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*attrOut)(buf.alloc(size)) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A GetattrResponse is the response to a GetattrRequest. -type GetattrResponse struct { - Attr Attr // file attributes -} - -func (r *GetattrResponse) String() string { - return fmt.Sprintf("Getattr %v", r.Attr) -} - -// A GetxattrRequest asks for the extended attributes associated with r.Node. -type GetxattrRequest struct { - Header `json:"-"` - - // Maximum size to return. - Size uint32 - - // Name of the attribute requested. - Name string - - // Offset within extended attributes. - // - // Only valid for OS X, and then only with the resource fork - // attribute. - Position uint32 -} - -var _ = Request(&GetxattrRequest{}) - -func (r *GetxattrRequest) String() string { - return fmt.Sprintf("Getxattr [%s] %q %d @%d", &r.Header, r.Name, r.Size, r.Position) -} - -// Respond replies to the request with the given response. -func (r *GetxattrRequest) Respond(resp *GetxattrResponse) { - if r.Size == 0 { - buf := newBuffer(unsafe.Sizeof(getxattrOut{})) - out := (*getxattrOut)(buf.alloc(unsafe.Sizeof(getxattrOut{}))) - out.Size = uint32(len(resp.Xattr)) - r.respond(buf) - } else { - buf := newBuffer(uintptr(len(resp.Xattr))) - buf = append(buf, resp.Xattr...) - r.respond(buf) - } -} - -// A GetxattrResponse is the response to a GetxattrRequest. -type GetxattrResponse struct { - Xattr []byte -} - -func (r *GetxattrResponse) String() string { - return fmt.Sprintf("Getxattr %x", r.Xattr) -} - -// A ListxattrRequest asks to list the extended attributes associated with r.Node. -type ListxattrRequest struct { - Header `json:"-"` - Size uint32 // maximum size to return - Position uint32 // offset within attribute list -} - -var _ = Request(&ListxattrRequest{}) - -func (r *ListxattrRequest) String() string { - return fmt.Sprintf("Listxattr [%s] %d @%d", &r.Header, r.Size, r.Position) -} - -// Respond replies to the request with the given response. -func (r *ListxattrRequest) Respond(resp *ListxattrResponse) { - if r.Size == 0 { - buf := newBuffer(unsafe.Sizeof(getxattrOut{})) - out := (*getxattrOut)(buf.alloc(unsafe.Sizeof(getxattrOut{}))) - out.Size = uint32(len(resp.Xattr)) - r.respond(buf) - } else { - buf := newBuffer(uintptr(len(resp.Xattr))) - buf = append(buf, resp.Xattr...) - r.respond(buf) - } -} - -// A ListxattrResponse is the response to a ListxattrRequest. -type ListxattrResponse struct { - Xattr []byte -} - -func (r *ListxattrResponse) String() string { - return fmt.Sprintf("Listxattr %x", r.Xattr) -} - -// Append adds an extended attribute name to the response. -func (r *ListxattrResponse) Append(names ...string) { - for _, name := range names { - r.Xattr = append(r.Xattr, name...) - r.Xattr = append(r.Xattr, '\x00') - } -} - -// A RemovexattrRequest asks to remove an extended attribute associated with r.Node. -type RemovexattrRequest struct { - Header `json:"-"` - Name string // name of extended attribute -} - -var _ = Request(&RemovexattrRequest{}) - -func (r *RemovexattrRequest) String() string { - return fmt.Sprintf("Removexattr [%s] %q", &r.Header, r.Name) -} - -// Respond replies to the request, indicating that the attribute was removed. -func (r *RemovexattrRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A SetxattrRequest asks to set an extended attribute associated with a file. -type SetxattrRequest struct { - Header `json:"-"` - - // Flags can make the request fail if attribute does/not already - // exist. Unfortunately, the constants are platform-specific and - // not exposed by Go1.2. Look for XATTR_CREATE, XATTR_REPLACE. - // - // TODO improve this later - // - // TODO XATTR_CREATE and exist -> EEXIST - // - // TODO XATTR_REPLACE and not exist -> ENODATA - Flags uint32 - - // Offset within extended attributes. - // - // Only valid for OS X, and then only with the resource fork - // attribute. - Position uint32 - - Name string - Xattr []byte -} - -var _ = Request(&SetxattrRequest{}) - -func trunc(b []byte, max int) ([]byte, string) { - if len(b) > max { - return b[:max], "..." - } - return b, "" -} - -func (r *SetxattrRequest) String() string { - xattr, tail := trunc(r.Xattr, 16) - return fmt.Sprintf("Setxattr [%s] %q %x%s fl=%v @%#x", &r.Header, r.Name, xattr, tail, r.Flags, r.Position) -} - -// Respond replies to the request, indicating that the extended attribute was set. -func (r *SetxattrRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A LookupRequest asks to look up the given name in the directory named by r.Node. -type LookupRequest struct { - Header `json:"-"` - Name string -} - -var _ = Request(&LookupRequest{}) - -func (r *LookupRequest) String() string { - return fmt.Sprintf("Lookup [%s] %q", &r.Header, r.Name) -} - -// Respond replies to the request with the given response. -func (r *LookupRequest) Respond(resp *LookupResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A LookupResponse is the response to a LookupRequest. -type LookupResponse struct { - Node NodeID - Generation uint64 - EntryValid time.Duration - Attr Attr -} - -func (r *LookupResponse) string() string { - return fmt.Sprintf("%v gen=%d valid=%v attr={%v}", r.Node, r.Generation, r.EntryValid, r.Attr) -} - -func (r *LookupResponse) String() string { - return fmt.Sprintf("Lookup %s", r.string()) -} - -// An OpenRequest asks to open a file or directory -type OpenRequest struct { - Header `json:"-"` - Dir bool // is this Opendir? - Flags OpenFlags -} - -var _ = Request(&OpenRequest{}) - -func (r *OpenRequest) String() string { - return fmt.Sprintf("Open [%s] dir=%v fl=%v", &r.Header, r.Dir, r.Flags) -} - -// Respond replies to the request with the given response. -func (r *OpenRequest) Respond(resp *OpenResponse) { - buf := newBuffer(unsafe.Sizeof(openOut{})) - out := (*openOut)(buf.alloc(unsafe.Sizeof(openOut{}))) - out.Fh = uint64(resp.Handle) - out.OpenFlags = uint32(resp.Flags) - r.respond(buf) -} - -// A OpenResponse is the response to a OpenRequest. -type OpenResponse struct { - Handle HandleID - Flags OpenResponseFlags -} - -func (r *OpenResponse) string() string { - return fmt.Sprintf("%v fl=%v", r.Handle, r.Flags) -} - -func (r *OpenResponse) String() string { - return fmt.Sprintf("Open %s", r.string()) -} - -// A CreateRequest asks to create and open a file (not a directory). -type CreateRequest struct { - Header `json:"-"` - Name string - Flags OpenFlags - Mode os.FileMode - // Umask of the request. Not supported on OS X. - Umask os.FileMode -} - -var _ = Request(&CreateRequest{}) - -func (r *CreateRequest) String() string { - return fmt.Sprintf("Create [%s] %q fl=%v mode=%v umask=%v", &r.Header, r.Name, r.Flags, r.Mode, r.Umask) -} - -// Respond replies to the request with the given response. -func (r *CreateRequest) Respond(resp *CreateResponse) { - eSize := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(eSize + unsafe.Sizeof(openOut{})) - - e := (*entryOut)(buf.alloc(eSize)) - e.Nodeid = uint64(resp.Node) - e.Generation = resp.Generation - e.EntryValid = uint64(resp.EntryValid / time.Second) - e.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - e.AttrValid = uint64(resp.Attr.Valid / time.Second) - e.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&e.Attr, r.Header.Conn.proto) - - o := (*openOut)(buf.alloc(unsafe.Sizeof(openOut{}))) - o.Fh = uint64(resp.Handle) - o.OpenFlags = uint32(resp.Flags) - - r.respond(buf) -} - -// A CreateResponse is the response to a CreateRequest. -// It describes the created node and opened handle. -type CreateResponse struct { - LookupResponse - OpenResponse -} - -func (r *CreateResponse) String() string { - return fmt.Sprintf("Create {%s} {%s}", r.LookupResponse.string(), r.OpenResponse.string()) -} - -// A MkdirRequest asks to create (but not open) a directory. -type MkdirRequest struct { - Header `json:"-"` - Name string - Mode os.FileMode - // Umask of the request. Not supported on OS X. - Umask os.FileMode -} - -var _ = Request(&MkdirRequest{}) - -func (r *MkdirRequest) String() string { - return fmt.Sprintf("Mkdir [%s] %q mode=%v umask=%v", &r.Header, r.Name, r.Mode, r.Umask) -} - -// Respond replies to the request with the given response. -func (r *MkdirRequest) Respond(resp *MkdirResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A MkdirResponse is the response to a MkdirRequest. -type MkdirResponse struct { - LookupResponse -} - -func (r *MkdirResponse) String() string { - return fmt.Sprintf("Mkdir %v", r.LookupResponse.string()) -} - -// A ReadRequest asks to read from an open file. -type ReadRequest struct { - Header `json:"-"` - Dir bool // is this Readdir? - Handle HandleID - Offset int64 - Size int - Flags ReadFlags - LockOwner uint64 - FileFlags OpenFlags -} - -var _ = Request(&ReadRequest{}) - -func (r *ReadRequest) String() string { - return fmt.Sprintf("Read [%s] %v %d @%#x dir=%v fl=%v lock=%d ffl=%v", &r.Header, r.Handle, r.Size, r.Offset, r.Dir, r.Flags, r.LockOwner, r.FileFlags) -} - -// Respond replies to the request with the given response. -func (r *ReadRequest) Respond(resp *ReadResponse) { - buf := newBuffer(uintptr(len(resp.Data))) - buf = append(buf, resp.Data...) - r.respond(buf) -} - -// A ReadResponse is the response to a ReadRequest. -type ReadResponse struct { - Data []byte -} - -func (r *ReadResponse) String() string { - return fmt.Sprintf("Read %d", len(r.Data)) -} - -type jsonReadResponse struct { - Len uint64 -} - -func (r *ReadResponse) MarshalJSON() ([]byte, error) { - j := jsonReadResponse{ - Len: uint64(len(r.Data)), - } - return json.Marshal(j) -} - -// A ReleaseRequest asks to release (close) an open file handle. -type ReleaseRequest struct { - Header `json:"-"` - Dir bool // is this Releasedir? - Handle HandleID - Flags OpenFlags // flags from OpenRequest - ReleaseFlags ReleaseFlags - LockOwner uint32 -} - -var _ = Request(&ReleaseRequest{}) - -func (r *ReleaseRequest) String() string { - return fmt.Sprintf("Release [%s] %v fl=%v rfl=%v owner=%#x", &r.Header, r.Handle, r.Flags, r.ReleaseFlags, r.LockOwner) -} - -// Respond replies to the request, indicating that the handle has been released. -func (r *ReleaseRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A DestroyRequest is sent by the kernel when unmounting the file system. -// No more requests will be received after this one, but it should still be -// responded to. -type DestroyRequest struct { - Header `json:"-"` -} - -var _ = Request(&DestroyRequest{}) - -func (r *DestroyRequest) String() string { - return fmt.Sprintf("Destroy [%s]", &r.Header) -} - -// Respond replies to the request. -func (r *DestroyRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A ForgetRequest is sent by the kernel when forgetting about r.Node -// as returned by r.N lookup requests. -type ForgetRequest struct { - Header `json:"-"` - N uint64 -} - -var _ = Request(&ForgetRequest{}) - -func (r *ForgetRequest) String() string { - return fmt.Sprintf("Forget [%s] %d", &r.Header, r.N) -} - -// Respond replies to the request, indicating that the forgetfulness has been recorded. -func (r *ForgetRequest) Respond() { - // Don't reply to forget messages. - r.noResponse() -} - -// A Dirent represents a single directory entry. -type Dirent struct { - // Inode this entry names. - Inode uint64 - - // Type of the entry, for example DT_File. - // - // Setting this is optional. The zero value (DT_Unknown) means - // callers will just need to do a Getattr when the type is - // needed. Providing a type can speed up operations - // significantly. - Type DirentType - - // Name of the entry - Name string -} - -// Type of an entry in a directory listing. -type DirentType uint32 - -const ( - // These don't quite match os.FileMode; especially there's an - // explicit unknown, instead of zero value meaning file. They - // are also not quite syscall.DT_*; nothing says the FUSE - // protocol follows those, and even if they were, we don't - // want each fs to fiddle with syscall. - - // The shift by 12 is hardcoded in the FUSE userspace - // low-level C library, so it's safe here. - - DT_Unknown DirentType = 0 - DT_Socket DirentType = syscall.S_IFSOCK >> 12 - DT_Link DirentType = syscall.S_IFLNK >> 12 - DT_File DirentType = syscall.S_IFREG >> 12 - DT_Block DirentType = syscall.S_IFBLK >> 12 - DT_Dir DirentType = syscall.S_IFDIR >> 12 - DT_Char DirentType = syscall.S_IFCHR >> 12 - DT_FIFO DirentType = syscall.S_IFIFO >> 12 -) - -func (t DirentType) String() string { - switch t { - case DT_Unknown: - return "unknown" - case DT_Socket: - return "socket" - case DT_Link: - return "link" - case DT_File: - return "file" - case DT_Block: - return "block" - case DT_Dir: - return "dir" - case DT_Char: - return "char" - case DT_FIFO: - return "fifo" - } - return "invalid" -} - -// AppendDirent appends the encoded form of a directory entry to data -// and returns the resulting slice. -func AppendDirent(data []byte, dir Dirent) []byte { - de := dirent{ - Ino: dir.Inode, - Namelen: uint32(len(dir.Name)), - Type: uint32(dir.Type), - } - de.Off = uint64(len(data) + direntSize + (len(dir.Name)+7)&^7) - data = append(data, (*[direntSize]byte)(unsafe.Pointer(&de))[:]...) - data = append(data, dir.Name...) - n := direntSize + uintptr(len(dir.Name)) - if n%8 != 0 { - var pad [8]byte - data = append(data, pad[:8-n%8]...) - } - return data -} - -// A WriteRequest asks to write to an open file. -type WriteRequest struct { - Header - Handle HandleID - Offset int64 - Data []byte - Flags WriteFlags - LockOwner uint64 - FileFlags OpenFlags -} - -var _ = Request(&WriteRequest{}) - -func (r *WriteRequest) String() string { - return fmt.Sprintf("Write [%s] %v %d @%d fl=%v lock=%d ffl=%v", &r.Header, r.Handle, len(r.Data), r.Offset, r.Flags, r.LockOwner, r.FileFlags) -} - -type jsonWriteRequest struct { - Handle HandleID - Offset int64 - Len uint64 - Flags WriteFlags -} - -func (r *WriteRequest) MarshalJSON() ([]byte, error) { - j := jsonWriteRequest{ - Handle: r.Handle, - Offset: r.Offset, - Len: uint64(len(r.Data)), - Flags: r.Flags, - } - return json.Marshal(j) -} - -// Respond replies to the request with the given response. -func (r *WriteRequest) Respond(resp *WriteResponse) { - buf := newBuffer(unsafe.Sizeof(writeOut{})) - out := (*writeOut)(buf.alloc(unsafe.Sizeof(writeOut{}))) - out.Size = uint32(resp.Size) - r.respond(buf) -} - -// A WriteResponse replies to a write indicating how many bytes were written. -type WriteResponse struct { - Size int -} - -func (r *WriteResponse) String() string { - return fmt.Sprintf("Write %d", r.Size) -} - -// A SetattrRequest asks to change one or more attributes associated with a file, -// as indicated by Valid. -type SetattrRequest struct { - Header `json:"-"` - Valid SetattrValid - Handle HandleID - Size uint64 - Atime time.Time - Mtime time.Time - Mode os.FileMode - Uid uint32 - Gid uint32 - - // OS X only - Bkuptime time.Time - Chgtime time.Time - Crtime time.Time - Flags uint32 // see chflags(2) -} - -var _ = Request(&SetattrRequest{}) - -func (r *SetattrRequest) String() string { - var buf bytes.Buffer - fmt.Fprintf(&buf, "Setattr [%s]", &r.Header) - if r.Valid.Mode() { - fmt.Fprintf(&buf, " mode=%v", r.Mode) - } - if r.Valid.Uid() { - fmt.Fprintf(&buf, " uid=%d", r.Uid) - } - if r.Valid.Gid() { - fmt.Fprintf(&buf, " gid=%d", r.Gid) - } - if r.Valid.Size() { - fmt.Fprintf(&buf, " size=%d", r.Size) - } - if r.Valid.Atime() { - fmt.Fprintf(&buf, " atime=%v", r.Atime) - } - if r.Valid.AtimeNow() { - fmt.Fprintf(&buf, " atime=now") - } - if r.Valid.Mtime() { - fmt.Fprintf(&buf, " mtime=%v", r.Mtime) - } - if r.Valid.MtimeNow() { - fmt.Fprintf(&buf, " mtime=now") - } - if r.Valid.Handle() { - fmt.Fprintf(&buf, " handle=%v", r.Handle) - } else { - fmt.Fprintf(&buf, " handle=INVALID-%v", r.Handle) - } - if r.Valid.LockOwner() { - fmt.Fprintf(&buf, " lockowner") - } - if r.Valid.Crtime() { - fmt.Fprintf(&buf, " crtime=%v", r.Crtime) - } - if r.Valid.Chgtime() { - fmt.Fprintf(&buf, " chgtime=%v", r.Chgtime) - } - if r.Valid.Bkuptime() { - fmt.Fprintf(&buf, " bkuptime=%v", r.Bkuptime) - } - if r.Valid.Flags() { - fmt.Fprintf(&buf, " flags=%v", r.Flags) - } - return buf.String() -} - -// Respond replies to the request with the given response, -// giving the updated attributes. -func (r *SetattrRequest) Respond(resp *SetattrResponse) { - size := attrOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*attrOut)(buf.alloc(size)) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A SetattrResponse is the response to a SetattrRequest. -type SetattrResponse struct { - Attr Attr // file attributes -} - -func (r *SetattrResponse) String() string { - return fmt.Sprintf("Setattr %v", r.Attr) -} - -// A FlushRequest asks for the current state of an open file to be flushed -// to storage, as when a file descriptor is being closed. A single opened Handle -// may receive multiple FlushRequests over its lifetime. -type FlushRequest struct { - Header `json:"-"` - Handle HandleID - Flags uint32 - LockOwner uint64 -} - -var _ = Request(&FlushRequest{}) - -func (r *FlushRequest) String() string { - return fmt.Sprintf("Flush [%s] %v fl=%#x lk=%#x", &r.Header, r.Handle, r.Flags, r.LockOwner) -} - -// Respond replies to the request, indicating that the flush succeeded. -func (r *FlushRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A RemoveRequest asks to remove a file or directory from the -// directory r.Node. -type RemoveRequest struct { - Header `json:"-"` - Name string // name of the entry to remove - Dir bool // is this rmdir? -} - -var _ = Request(&RemoveRequest{}) - -func (r *RemoveRequest) String() string { - return fmt.Sprintf("Remove [%s] %q dir=%v", &r.Header, r.Name, r.Dir) -} - -// Respond replies to the request, indicating that the file was removed. -func (r *RemoveRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A SymlinkRequest is a request to create a symlink making NewName point to Target. -type SymlinkRequest struct { - Header `json:"-"` - NewName, Target string -} - -var _ = Request(&SymlinkRequest{}) - -func (r *SymlinkRequest) String() string { - return fmt.Sprintf("Symlink [%s] from %q to target %q", &r.Header, r.NewName, r.Target) -} - -// Respond replies to the request, indicating that the symlink was created. -func (r *SymlinkRequest) Respond(resp *SymlinkResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A SymlinkResponse is the response to a SymlinkRequest. -type SymlinkResponse struct { - LookupResponse -} - -func (r *SymlinkResponse) String() string { - return fmt.Sprintf("Symlink %v", r.LookupResponse.string()) -} - -// A ReadlinkRequest is a request to read a symlink's target. -type ReadlinkRequest struct { - Header `json:"-"` -} - -var _ = Request(&ReadlinkRequest{}) - -func (r *ReadlinkRequest) String() string { - return fmt.Sprintf("Readlink [%s]", &r.Header) -} - -func (r *ReadlinkRequest) Respond(target string) { - buf := newBuffer(uintptr(len(target))) - buf = append(buf, target...) - r.respond(buf) -} - -// A LinkRequest is a request to create a hard link. -type LinkRequest struct { - Header `json:"-"` - OldNode NodeID - NewName string -} - -var _ = Request(&LinkRequest{}) - -func (r *LinkRequest) String() string { - return fmt.Sprintf("Link [%s] node %d to %q", &r.Header, r.OldNode, r.NewName) -} - -func (r *LinkRequest) Respond(resp *LookupResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A RenameRequest is a request to rename a file. -type RenameRequest struct { - Header `json:"-"` - NewDir NodeID - OldName, NewName string -} - -var _ = Request(&RenameRequest{}) - -func (r *RenameRequest) String() string { - return fmt.Sprintf("Rename [%s] from %q to dirnode %v %q", &r.Header, r.OldName, r.NewDir, r.NewName) -} - -func (r *RenameRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -type MknodRequest struct { - Header `json:"-"` - Name string - Mode os.FileMode - Rdev uint32 - // Umask of the request. Not supported on OS X. - Umask os.FileMode -} - -var _ = Request(&MknodRequest{}) - -func (r *MknodRequest) String() string { - return fmt.Sprintf("Mknod [%s] Name %q mode=%v umask=%v rdev=%d", &r.Header, r.Name, r.Mode, r.Umask, r.Rdev) -} - -func (r *MknodRequest) Respond(resp *LookupResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -type FsyncRequest struct { - Header `json:"-"` - Handle HandleID - // TODO bit 1 is datasync, not well documented upstream - Flags uint32 - Dir bool -} - -var _ = Request(&FsyncRequest{}) - -func (r *FsyncRequest) String() string { - return fmt.Sprintf("Fsync [%s] Handle %v Flags %v", &r.Header, r.Handle, r.Flags) -} - -func (r *FsyncRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// An InterruptRequest is a request to interrupt another pending request. The -// response to that request should return an error status of EINTR. -type InterruptRequest struct { - Header `json:"-"` - IntrID RequestID // ID of the request to be interrupt. -} - -var _ = Request(&InterruptRequest{}) - -func (r *InterruptRequest) Respond() { - // nothing to do here - r.noResponse() -} - -func (r *InterruptRequest) String() string { - return fmt.Sprintf("Interrupt [%s] ID %v", &r.Header, r.IntrID) -} - -// An ExchangeDataRequest is a request to exchange the contents of two -// files, while leaving most metadata untouched. -// -// This request comes from OS X exchangedata(2) and represents its -// specific semantics. Crucially, it is very different from Linux -// renameat(2) RENAME_EXCHANGE. -// -// https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/exchangedata.2.html -type ExchangeDataRequest struct { - Header `json:"-"` - OldDir, NewDir NodeID - OldName, NewName string - // TODO options -} - -var _ = Request(&ExchangeDataRequest{}) - -func (r *ExchangeDataRequest) String() string { - // TODO options - return fmt.Sprintf("ExchangeData [%s] %v %q and %v %q", &r.Header, r.OldDir, r.OldName, r.NewDir, r.NewName) -} - -func (r *ExchangeDataRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} diff --git a/vendor/bazil.org/fuse/fuse.iml b/vendor/bazil.org/fuse/fuse.iml deleted file mode 100644 index 792ad4c30c83..000000000000 --- a/vendor/bazil.org/fuse/fuse.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/vendor/bazil.org/fuse/fuse_darwin.go b/vendor/bazil.org/fuse/fuse_darwin.go deleted file mode 100644 index b58dca97d648..000000000000 --- a/vendor/bazil.org/fuse/fuse_darwin.go +++ /dev/null @@ -1,9 +0,0 @@ -package fuse - -// Maximum file write size we are prepared to receive from the kernel. -// -// This value has to be >=16MB or OSXFUSE (3.4.0 observed) will -// forcibly close the /dev/fuse file descriptor on a Setxattr with a -// 16MB value. See TestSetxattr16MB and -// https://github.com/bazil/fuse/issues/42 -const maxWrite = 16 * 1024 * 1024 diff --git a/vendor/bazil.org/fuse/fuse_freebsd.go b/vendor/bazil.org/fuse/fuse_freebsd.go deleted file mode 100644 index 4aa83a0d4104..000000000000 --- a/vendor/bazil.org/fuse/fuse_freebsd.go +++ /dev/null @@ -1,6 +0,0 @@ -package fuse - -// Maximum file write size we are prepared to receive from the kernel. -// -// This number is just a guess. -const maxWrite = 128 * 1024 diff --git a/vendor/bazil.org/fuse/fuse_kernel.go b/vendor/bazil.org/fuse/fuse_kernel.go deleted file mode 100644 index 87c5ca1dc675..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel.go +++ /dev/null @@ -1,774 +0,0 @@ -// See the file LICENSE for copyright and licensing information. - -// Derived from FUSE's fuse_kernel.h, which carries this notice: -/* - This file defines the kernel interface of FUSE - Copyright (C) 2001-2007 Miklos Szeredi - - - This -- and only this -- header file may also be distributed under - the terms of the BSD Licence as follows: - - Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. -*/ - -package fuse - -import ( - "fmt" - "syscall" - "unsafe" -) - -// The FUSE version implemented by the package. -const ( - protoVersionMinMajor = 7 - protoVersionMinMinor = 8 - protoVersionMaxMajor = 7 - protoVersionMaxMinor = 12 -) - -const ( - rootID = 1 -) - -type kstatfs struct { - Blocks uint64 - Bfree uint64 - Bavail uint64 - Files uint64 - Ffree uint64 - Bsize uint32 - Namelen uint32 - Frsize uint32 - _ uint32 - Spare [6]uint32 -} - -type fileLock struct { - Start uint64 - End uint64 - Type uint32 - Pid uint32 -} - -// GetattrFlags are bit flags that can be seen in GetattrRequest. -type GetattrFlags uint32 - -const ( - // Indicates the handle is valid. - GetattrFh GetattrFlags = 1 << 0 -) - -var getattrFlagsNames = []flagName{ - {uint32(GetattrFh), "GetattrFh"}, -} - -func (fl GetattrFlags) String() string { - return flagString(uint32(fl), getattrFlagsNames) -} - -// The SetattrValid are bit flags describing which fields in the SetattrRequest -// are included in the change. -type SetattrValid uint32 - -const ( - SetattrMode SetattrValid = 1 << 0 - SetattrUid SetattrValid = 1 << 1 - SetattrGid SetattrValid = 1 << 2 - SetattrSize SetattrValid = 1 << 3 - SetattrAtime SetattrValid = 1 << 4 - SetattrMtime SetattrValid = 1 << 5 - SetattrHandle SetattrValid = 1 << 6 - - // Linux only(?) - SetattrAtimeNow SetattrValid = 1 << 7 - SetattrMtimeNow SetattrValid = 1 << 8 - SetattrLockOwner SetattrValid = 1 << 9 // http://www.mail-archive.com/git-commits-head@vger.kernel.org/msg27852.html - - // OS X only - SetattrCrtime SetattrValid = 1 << 28 - SetattrChgtime SetattrValid = 1 << 29 - SetattrBkuptime SetattrValid = 1 << 30 - SetattrFlags SetattrValid = 1 << 31 -) - -func (fl SetattrValid) Mode() bool { return fl&SetattrMode != 0 } -func (fl SetattrValid) Uid() bool { return fl&SetattrUid != 0 } -func (fl SetattrValid) Gid() bool { return fl&SetattrGid != 0 } -func (fl SetattrValid) Size() bool { return fl&SetattrSize != 0 } -func (fl SetattrValid) Atime() bool { return fl&SetattrAtime != 0 } -func (fl SetattrValid) Mtime() bool { return fl&SetattrMtime != 0 } -func (fl SetattrValid) Handle() bool { return fl&SetattrHandle != 0 } -func (fl SetattrValid) AtimeNow() bool { return fl&SetattrAtimeNow != 0 } -func (fl SetattrValid) MtimeNow() bool { return fl&SetattrMtimeNow != 0 } -func (fl SetattrValid) LockOwner() bool { return fl&SetattrLockOwner != 0 } -func (fl SetattrValid) Crtime() bool { return fl&SetattrCrtime != 0 } -func (fl SetattrValid) Chgtime() bool { return fl&SetattrChgtime != 0 } -func (fl SetattrValid) Bkuptime() bool { return fl&SetattrBkuptime != 0 } -func (fl SetattrValid) Flags() bool { return fl&SetattrFlags != 0 } - -func (fl SetattrValid) String() string { - return flagString(uint32(fl), setattrValidNames) -} - -var setattrValidNames = []flagName{ - {uint32(SetattrMode), "SetattrMode"}, - {uint32(SetattrUid), "SetattrUid"}, - {uint32(SetattrGid), "SetattrGid"}, - {uint32(SetattrSize), "SetattrSize"}, - {uint32(SetattrAtime), "SetattrAtime"}, - {uint32(SetattrMtime), "SetattrMtime"}, - {uint32(SetattrHandle), "SetattrHandle"}, - {uint32(SetattrAtimeNow), "SetattrAtimeNow"}, - {uint32(SetattrMtimeNow), "SetattrMtimeNow"}, - {uint32(SetattrLockOwner), "SetattrLockOwner"}, - {uint32(SetattrCrtime), "SetattrCrtime"}, - {uint32(SetattrChgtime), "SetattrChgtime"}, - {uint32(SetattrBkuptime), "SetattrBkuptime"}, - {uint32(SetattrFlags), "SetattrFlags"}, -} - -// Flags that can be seen in OpenRequest.Flags. -const ( - // Access modes. These are not 1-bit flags, but alternatives where - // only one can be chosen. See the IsReadOnly etc convenience - // methods. - OpenReadOnly OpenFlags = syscall.O_RDONLY - OpenWriteOnly OpenFlags = syscall.O_WRONLY - OpenReadWrite OpenFlags = syscall.O_RDWR - - // File was opened in append-only mode, all writes will go to end - // of file. OS X does not provide this information. - OpenAppend OpenFlags = syscall.O_APPEND - OpenCreate OpenFlags = syscall.O_CREAT - OpenDirectory OpenFlags = syscall.O_DIRECTORY - OpenExclusive OpenFlags = syscall.O_EXCL - OpenNonblock OpenFlags = syscall.O_NONBLOCK - OpenSync OpenFlags = syscall.O_SYNC - OpenTruncate OpenFlags = syscall.O_TRUNC -) - -// OpenAccessModeMask is a bitmask that separates the access mode -// from the other flags in OpenFlags. -const OpenAccessModeMask OpenFlags = syscall.O_ACCMODE - -// OpenFlags are the O_FOO flags passed to open/create/etc calls. For -// example, os.O_WRONLY | os.O_APPEND. -type OpenFlags uint32 - -func (fl OpenFlags) String() string { - // O_RDONLY, O_RWONLY, O_RDWR are not flags - s := accModeName(fl & OpenAccessModeMask) - flags := uint32(fl &^ OpenAccessModeMask) - if flags != 0 { - s = s + "+" + flagString(flags, openFlagNames) - } - return s -} - -// Return true if OpenReadOnly is set. -func (fl OpenFlags) IsReadOnly() bool { - return fl&OpenAccessModeMask == OpenReadOnly -} - -// Return true if OpenWriteOnly is set. -func (fl OpenFlags) IsWriteOnly() bool { - return fl&OpenAccessModeMask == OpenWriteOnly -} - -// Return true if OpenReadWrite is set. -func (fl OpenFlags) IsReadWrite() bool { - return fl&OpenAccessModeMask == OpenReadWrite -} - -func accModeName(flags OpenFlags) string { - switch flags { - case OpenReadOnly: - return "OpenReadOnly" - case OpenWriteOnly: - return "OpenWriteOnly" - case OpenReadWrite: - return "OpenReadWrite" - default: - return "" - } -} - -var openFlagNames = []flagName{ - {uint32(OpenAppend), "OpenAppend"}, - {uint32(OpenCreate), "OpenCreate"}, - {uint32(OpenDirectory), "OpenDirectory"}, - {uint32(OpenExclusive), "OpenExclusive"}, - {uint32(OpenNonblock), "OpenNonblock"}, - {uint32(OpenSync), "OpenSync"}, - {uint32(OpenTruncate), "OpenTruncate"}, -} - -// The OpenResponseFlags are returned in the OpenResponse. -type OpenResponseFlags uint32 - -const ( - OpenDirectIO OpenResponseFlags = 1 << 0 // bypass page cache for this open file - OpenKeepCache OpenResponseFlags = 1 << 1 // don't invalidate the data cache on open - OpenNonSeekable OpenResponseFlags = 1 << 2 // mark the file as non-seekable (not supported on OS X) - - OpenPurgeAttr OpenResponseFlags = 1 << 30 // OS X - OpenPurgeUBC OpenResponseFlags = 1 << 31 // OS X -) - -func (fl OpenResponseFlags) String() string { - return flagString(uint32(fl), openResponseFlagNames) -} - -var openResponseFlagNames = []flagName{ - {uint32(OpenDirectIO), "OpenDirectIO"}, - {uint32(OpenKeepCache), "OpenKeepCache"}, - {uint32(OpenNonSeekable), "OpenNonSeekable"}, - {uint32(OpenPurgeAttr), "OpenPurgeAttr"}, - {uint32(OpenPurgeUBC), "OpenPurgeUBC"}, -} - -// The InitFlags are used in the Init exchange. -type InitFlags uint32 - -const ( - InitAsyncRead InitFlags = 1 << 0 - InitPosixLocks InitFlags = 1 << 1 - InitFileOps InitFlags = 1 << 2 - InitAtomicTrunc InitFlags = 1 << 3 - InitExportSupport InitFlags = 1 << 4 - InitBigWrites InitFlags = 1 << 5 - // Do not mask file access modes with umask. Not supported on OS X. - InitDontMask InitFlags = 1 << 6 - InitSpliceWrite InitFlags = 1 << 7 - InitSpliceMove InitFlags = 1 << 8 - InitSpliceRead InitFlags = 1 << 9 - InitFlockLocks InitFlags = 1 << 10 - InitHasIoctlDir InitFlags = 1 << 11 - InitAutoInvalData InitFlags = 1 << 12 - InitDoReaddirplus InitFlags = 1 << 13 - InitReaddirplusAuto InitFlags = 1 << 14 - InitAsyncDIO InitFlags = 1 << 15 - InitWritebackCache InitFlags = 1 << 16 - InitNoOpenSupport InitFlags = 1 << 17 - - InitCaseSensitive InitFlags = 1 << 29 // OS X only - InitVolRename InitFlags = 1 << 30 // OS X only - InitXtimes InitFlags = 1 << 31 // OS X only -) - -type flagName struct { - bit uint32 - name string -} - -var initFlagNames = []flagName{ - {uint32(InitAsyncRead), "InitAsyncRead"}, - {uint32(InitPosixLocks), "InitPosixLocks"}, - {uint32(InitFileOps), "InitFileOps"}, - {uint32(InitAtomicTrunc), "InitAtomicTrunc"}, - {uint32(InitExportSupport), "InitExportSupport"}, - {uint32(InitBigWrites), "InitBigWrites"}, - {uint32(InitDontMask), "InitDontMask"}, - {uint32(InitSpliceWrite), "InitSpliceWrite"}, - {uint32(InitSpliceMove), "InitSpliceMove"}, - {uint32(InitSpliceRead), "InitSpliceRead"}, - {uint32(InitFlockLocks), "InitFlockLocks"}, - {uint32(InitHasIoctlDir), "InitHasIoctlDir"}, - {uint32(InitAutoInvalData), "InitAutoInvalData"}, - {uint32(InitDoReaddirplus), "InitDoReaddirplus"}, - {uint32(InitReaddirplusAuto), "InitReaddirplusAuto"}, - {uint32(InitAsyncDIO), "InitAsyncDIO"}, - {uint32(InitWritebackCache), "InitWritebackCache"}, - {uint32(InitNoOpenSupport), "InitNoOpenSupport"}, - - {uint32(InitCaseSensitive), "InitCaseSensitive"}, - {uint32(InitVolRename), "InitVolRename"}, - {uint32(InitXtimes), "InitXtimes"}, -} - -func (fl InitFlags) String() string { - return flagString(uint32(fl), initFlagNames) -} - -func flagString(f uint32, names []flagName) string { - var s string - - if f == 0 { - return "0" - } - - for _, n := range names { - if f&n.bit != 0 { - s += "+" + n.name - f &^= n.bit - } - } - if f != 0 { - s += fmt.Sprintf("%+#x", f) - } - return s[1:] -} - -// The ReleaseFlags are used in the Release exchange. -type ReleaseFlags uint32 - -const ( - ReleaseFlush ReleaseFlags = 1 << 0 -) - -func (fl ReleaseFlags) String() string { - return flagString(uint32(fl), releaseFlagNames) -} - -var releaseFlagNames = []flagName{ - {uint32(ReleaseFlush), "ReleaseFlush"}, -} - -// Opcodes -const ( - opLookup = 1 - opForget = 2 // no reply - opGetattr = 3 - opSetattr = 4 - opReadlink = 5 - opSymlink = 6 - opMknod = 8 - opMkdir = 9 - opUnlink = 10 - opRmdir = 11 - opRename = 12 - opLink = 13 - opOpen = 14 - opRead = 15 - opWrite = 16 - opStatfs = 17 - opRelease = 18 - opFsync = 20 - opSetxattr = 21 - opGetxattr = 22 - opListxattr = 23 - opRemovexattr = 24 - opFlush = 25 - opInit = 26 - opOpendir = 27 - opReaddir = 28 - opReleasedir = 29 - opFsyncdir = 30 - opGetlk = 31 - opSetlk = 32 - opSetlkw = 33 - opAccess = 34 - opCreate = 35 - opInterrupt = 36 - opBmap = 37 - opDestroy = 38 - opIoctl = 39 // Linux? - opPoll = 40 // Linux? - - // OS X - opSetvolname = 61 - opGetxtimes = 62 - opExchange = 63 -) - -type entryOut struct { - Nodeid uint64 // Inode ID - Generation uint64 // Inode generation - EntryValid uint64 // Cache timeout for the name - AttrValid uint64 // Cache timeout for the attributes - EntryValidNsec uint32 - AttrValidNsec uint32 - Attr attr -} - -func entryOutSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(entryOut{}.Attr) + unsafe.Offsetof(entryOut{}.Attr.Blksize) - default: - return unsafe.Sizeof(entryOut{}) - } -} - -type forgetIn struct { - Nlookup uint64 -} - -type getattrIn struct { - GetattrFlags uint32 - _ uint32 - Fh uint64 -} - -type attrOut struct { - AttrValid uint64 // Cache timeout for the attributes - AttrValidNsec uint32 - _ uint32 - Attr attr -} - -func attrOutSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(attrOut{}.Attr) + unsafe.Offsetof(attrOut{}.Attr.Blksize) - default: - return unsafe.Sizeof(attrOut{}) - } -} - -// OS X -type getxtimesOut struct { - Bkuptime uint64 - Crtime uint64 - BkuptimeNsec uint32 - CrtimeNsec uint32 -} - -type mknodIn struct { - Mode uint32 - Rdev uint32 - Umask uint32 - _ uint32 - // "filename\x00" follows. -} - -func mknodInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 12}): - return unsafe.Offsetof(mknodIn{}.Umask) - default: - return unsafe.Sizeof(mknodIn{}) - } -} - -type mkdirIn struct { - Mode uint32 - Umask uint32 - // filename follows -} - -func mkdirInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 12}): - return unsafe.Offsetof(mkdirIn{}.Umask) + 4 - default: - return unsafe.Sizeof(mkdirIn{}) - } -} - -type renameIn struct { - Newdir uint64 - // "oldname\x00newname\x00" follows -} - -// OS X -type exchangeIn struct { - Olddir uint64 - Newdir uint64 - Options uint64 - // "oldname\x00newname\x00" follows -} - -type linkIn struct { - Oldnodeid uint64 -} - -type setattrInCommon struct { - Valid uint32 - _ uint32 - Fh uint64 - Size uint64 - LockOwner uint64 // unused on OS X? - Atime uint64 - Mtime uint64 - Unused2 uint64 - AtimeNsec uint32 - MtimeNsec uint32 - Unused3 uint32 - Mode uint32 - Unused4 uint32 - Uid uint32 - Gid uint32 - Unused5 uint32 -} - -type openIn struct { - Flags uint32 - Unused uint32 -} - -type openOut struct { - Fh uint64 - OpenFlags uint32 - _ uint32 -} - -type createIn struct { - Flags uint32 - Mode uint32 - Umask uint32 - _ uint32 -} - -func createInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 12}): - return unsafe.Offsetof(createIn{}.Umask) - default: - return unsafe.Sizeof(createIn{}) - } -} - -type releaseIn struct { - Fh uint64 - Flags uint32 - ReleaseFlags uint32 - LockOwner uint32 -} - -type flushIn struct { - Fh uint64 - FlushFlags uint32 - _ uint32 - LockOwner uint64 -} - -type readIn struct { - Fh uint64 - Offset uint64 - Size uint32 - ReadFlags uint32 - LockOwner uint64 - Flags uint32 - _ uint32 -} - -func readInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(readIn{}.ReadFlags) + 4 - default: - return unsafe.Sizeof(readIn{}) - } -} - -// The ReadFlags are passed in ReadRequest. -type ReadFlags uint32 - -const ( - // LockOwner field is valid. - ReadLockOwner ReadFlags = 1 << 1 -) - -var readFlagNames = []flagName{ - {uint32(ReadLockOwner), "ReadLockOwner"}, -} - -func (fl ReadFlags) String() string { - return flagString(uint32(fl), readFlagNames) -} - -type writeIn struct { - Fh uint64 - Offset uint64 - Size uint32 - WriteFlags uint32 - LockOwner uint64 - Flags uint32 - _ uint32 -} - -func writeInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(writeIn{}.LockOwner) - default: - return unsafe.Sizeof(writeIn{}) - } -} - -type writeOut struct { - Size uint32 - _ uint32 -} - -// The WriteFlags are passed in WriteRequest. -type WriteFlags uint32 - -const ( - WriteCache WriteFlags = 1 << 0 - // LockOwner field is valid. - WriteLockOwner WriteFlags = 1 << 1 -) - -var writeFlagNames = []flagName{ - {uint32(WriteCache), "WriteCache"}, - {uint32(WriteLockOwner), "WriteLockOwner"}, -} - -func (fl WriteFlags) String() string { - return flagString(uint32(fl), writeFlagNames) -} - -const compatStatfsSize = 48 - -type statfsOut struct { - St kstatfs -} - -type fsyncIn struct { - Fh uint64 - FsyncFlags uint32 - _ uint32 -} - -type setxattrInCommon struct { - Size uint32 - Flags uint32 -} - -func (setxattrInCommon) position() uint32 { - return 0 -} - -type getxattrInCommon struct { - Size uint32 - _ uint32 -} - -func (getxattrInCommon) position() uint32 { - return 0 -} - -type getxattrOut struct { - Size uint32 - _ uint32 -} - -type lkIn struct { - Fh uint64 - Owner uint64 - Lk fileLock - LkFlags uint32 - _ uint32 -} - -func lkInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(lkIn{}.LkFlags) - default: - return unsafe.Sizeof(lkIn{}) - } -} - -type lkOut struct { - Lk fileLock -} - -type accessIn struct { - Mask uint32 - _ uint32 -} - -type initIn struct { - Major uint32 - Minor uint32 - MaxReadahead uint32 - Flags uint32 -} - -const initInSize = int(unsafe.Sizeof(initIn{})) - -type initOut struct { - Major uint32 - Minor uint32 - MaxReadahead uint32 - Flags uint32 - Unused uint32 - MaxWrite uint32 -} - -type interruptIn struct { - Unique uint64 -} - -type bmapIn struct { - Block uint64 - BlockSize uint32 - _ uint32 -} - -type bmapOut struct { - Block uint64 -} - -type inHeader struct { - Len uint32 - Opcode uint32 - Unique uint64 - Nodeid uint64 - Uid uint32 - Gid uint32 - Pid uint32 - _ uint32 -} - -const inHeaderSize = int(unsafe.Sizeof(inHeader{})) - -type outHeader struct { - Len uint32 - Error int32 - Unique uint64 -} - -type dirent struct { - Ino uint64 - Off uint64 - Namelen uint32 - Type uint32 - Name [0]byte -} - -const direntSize = 8 + 8 + 4 + 4 - -const ( - notifyCodePoll int32 = 1 - notifyCodeInvalInode int32 = 2 - notifyCodeInvalEntry int32 = 3 -) - -type notifyInvalInodeOut struct { - Ino uint64 - Off int64 - Len int64 -} - -type notifyInvalEntryOut struct { - Parent uint64 - Namelen uint32 - _ uint32 -} diff --git a/vendor/bazil.org/fuse/fuse_kernel_darwin.go b/vendor/bazil.org/fuse/fuse_kernel_darwin.go deleted file mode 100644 index b9873fdf3910..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel_darwin.go +++ /dev/null @@ -1,88 +0,0 @@ -package fuse - -import ( - "time" -) - -type attr struct { - Ino uint64 - Size uint64 - Blocks uint64 - Atime uint64 - Mtime uint64 - Ctime uint64 - Crtime_ uint64 // OS X only - AtimeNsec uint32 - MtimeNsec uint32 - CtimeNsec uint32 - CrtimeNsec uint32 // OS X only - Mode uint32 - Nlink uint32 - Uid uint32 - Gid uint32 - Rdev uint32 - Flags_ uint32 // OS X only; see chflags(2) - Blksize uint32 - padding uint32 -} - -func (a *attr) SetCrtime(s uint64, ns uint32) { - a.Crtime_, a.CrtimeNsec = s, ns -} - -func (a *attr) SetFlags(f uint32) { - a.Flags_ = f -} - -type setattrIn struct { - setattrInCommon - - // OS X only - Bkuptime_ uint64 - Chgtime_ uint64 - Crtime uint64 - BkuptimeNsec uint32 - ChgtimeNsec uint32 - CrtimeNsec uint32 - Flags_ uint32 // see chflags(2) -} - -func (in *setattrIn) BkupTime() time.Time { - return time.Unix(int64(in.Bkuptime_), int64(in.BkuptimeNsec)) -} - -func (in *setattrIn) Chgtime() time.Time { - return time.Unix(int64(in.Chgtime_), int64(in.ChgtimeNsec)) -} - -func (in *setattrIn) Flags() uint32 { - return in.Flags_ -} - -func openFlags(flags uint32) OpenFlags { - return OpenFlags(flags) -} - -type getxattrIn struct { - getxattrInCommon - - // OS X only - Position uint32 - Padding uint32 -} - -func (g *getxattrIn) position() uint32 { - return g.Position -} - -type setxattrIn struct { - setxattrInCommon - - // OS X only - Position uint32 - Padding uint32 -} - -func (s *setxattrIn) position() uint32 { - return s.Position -} diff --git a/vendor/bazil.org/fuse/fuse_kernel_freebsd.go b/vendor/bazil.org/fuse/fuse_kernel_freebsd.go deleted file mode 100644 index b1141e41dc96..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel_freebsd.go +++ /dev/null @@ -1,62 +0,0 @@ -package fuse - -import "time" - -type attr struct { - Ino uint64 - Size uint64 - Blocks uint64 - Atime uint64 - Mtime uint64 - Ctime uint64 - AtimeNsec uint32 - MtimeNsec uint32 - CtimeNsec uint32 - Mode uint32 - Nlink uint32 - Uid uint32 - Gid uint32 - Rdev uint32 - Blksize uint32 - padding uint32 -} - -func (a *attr) Crtime() time.Time { - return time.Time{} -} - -func (a *attr) SetCrtime(s uint64, ns uint32) { - // ignored on freebsd -} - -func (a *attr) SetFlags(f uint32) { - // ignored on freebsd -} - -type setattrIn struct { - setattrInCommon -} - -func (in *setattrIn) BkupTime() time.Time { - return time.Time{} -} - -func (in *setattrIn) Chgtime() time.Time { - return time.Time{} -} - -func (in *setattrIn) Flags() uint32 { - return 0 -} - -func openFlags(flags uint32) OpenFlags { - return OpenFlags(flags) -} - -type getxattrIn struct { - getxattrInCommon -} - -type setxattrIn struct { - setxattrInCommon -} diff --git a/vendor/bazil.org/fuse/fuse_kernel_linux.go b/vendor/bazil.org/fuse/fuse_kernel_linux.go deleted file mode 100644 index d3ba86617802..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel_linux.go +++ /dev/null @@ -1,70 +0,0 @@ -package fuse - -import "time" - -type attr struct { - Ino uint64 - Size uint64 - Blocks uint64 - Atime uint64 - Mtime uint64 - Ctime uint64 - AtimeNsec uint32 - MtimeNsec uint32 - CtimeNsec uint32 - Mode uint32 - Nlink uint32 - Uid uint32 - Gid uint32 - Rdev uint32 - Blksize uint32 - padding uint32 -} - -func (a *attr) Crtime() time.Time { - return time.Time{} -} - -func (a *attr) SetCrtime(s uint64, ns uint32) { - // Ignored on Linux. -} - -func (a *attr) SetFlags(f uint32) { - // Ignored on Linux. -} - -type setattrIn struct { - setattrInCommon -} - -func (in *setattrIn) BkupTime() time.Time { - return time.Time{} -} - -func (in *setattrIn) Chgtime() time.Time { - return time.Time{} -} - -func (in *setattrIn) Flags() uint32 { - return 0 -} - -func openFlags(flags uint32) OpenFlags { - // on amd64, the 32-bit O_LARGEFILE flag is always seen; - // on i386, the flag probably depends on the app - // requesting, but in any case should be utterly - // uninteresting to us here; our kernel protocol messages - // are not directly related to the client app's kernel - // API/ABI - flags &^= 0x8000 - - return OpenFlags(flags) -} - -type getxattrIn struct { - getxattrInCommon -} - -type setxattrIn struct { - setxattrInCommon -} diff --git a/vendor/bazil.org/fuse/fuse_kernel_std.go b/vendor/bazil.org/fuse/fuse_kernel_std.go deleted file mode 100644 index 074cfd322887..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel_std.go +++ /dev/null @@ -1 +0,0 @@ -package fuse diff --git a/vendor/bazil.org/fuse/fuse_linux.go b/vendor/bazil.org/fuse/fuse_linux.go deleted file mode 100644 index 5fb96f9ae942..000000000000 --- a/vendor/bazil.org/fuse/fuse_linux.go +++ /dev/null @@ -1,7 +0,0 @@ -package fuse - -// Maximum file write size we are prepared to receive from the kernel. -// -// Linux 4.2.0 has been observed to cap this value at 128kB -// (FUSE_MAX_PAGES_PER_REQ=32, 4kB pages). -const maxWrite = 128 * 1024 diff --git a/vendor/bazil.org/fuse/fuseutil/fuseutil.go b/vendor/bazil.org/fuse/fuseutil/fuseutil.go deleted file mode 100644 index b3f52b73b257..000000000000 --- a/vendor/bazil.org/fuse/fuseutil/fuseutil.go +++ /dev/null @@ -1,20 +0,0 @@ -package fuseutil // import "bazil.org/fuse/fuseutil" - -import ( - "bazil.org/fuse" -) - -// HandleRead handles a read request assuming that data is the entire file content. -// It adjusts the amount returned in resp according to req.Offset and req.Size. -func HandleRead(req *fuse.ReadRequest, resp *fuse.ReadResponse, data []byte) { - if req.Offset >= int64(len(data)) { - data = nil - } else { - data = data[req.Offset:] - } - if len(data) > req.Size { - data = data[:req.Size] - } - n := copy(resp.Data[:req.Size], data) - resp.Data = resp.Data[:n] -} diff --git a/vendor/bazil.org/fuse/mount.go b/vendor/bazil.org/fuse/mount.go deleted file mode 100644 index 8054e9021c4e..000000000000 --- a/vendor/bazil.org/fuse/mount.go +++ /dev/null @@ -1,38 +0,0 @@ -package fuse - -import ( - "bufio" - "errors" - "io" - "log" - "sync" -) - -var ( - // ErrOSXFUSENotFound is returned from Mount when the OSXFUSE - // installation is not detected. - // - // Only happens on OS X. Make sure OSXFUSE is installed, or see - // OSXFUSELocations for customization. - ErrOSXFUSENotFound = errors.New("cannot locate OSXFUSE") -) - -func neverIgnoreLine(line string) bool { - return false -} - -func lineLogger(wg *sync.WaitGroup, prefix string, ignore func(line string) bool, r io.ReadCloser) { - defer wg.Done() - - scanner := bufio.NewScanner(r) - for scanner.Scan() { - line := scanner.Text() - if ignore(line) { - continue - } - log.Printf("%s: %s", prefix, line) - } - if err := scanner.Err(); err != nil { - log.Printf("%s, error reading: %v", prefix, err) - } -} diff --git a/vendor/bazil.org/fuse/mount_darwin.go b/vendor/bazil.org/fuse/mount_darwin.go deleted file mode 100644 index c1c36e62b5f3..000000000000 --- a/vendor/bazil.org/fuse/mount_darwin.go +++ /dev/null @@ -1,208 +0,0 @@ -package fuse - -import ( - "errors" - "fmt" - "log" - "os" - "os/exec" - "path" - "strconv" - "strings" - "sync" - "syscall" -) - -var ( - errNoAvail = errors.New("no available fuse devices") - errNotLoaded = errors.New("osxfuse is not loaded") -) - -func loadOSXFUSE(bin string) error { - cmd := exec.Command(bin) - cmd.Dir = "/" - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err := cmd.Run() - return err -} - -func openOSXFUSEDev(devPrefix string) (*os.File, error) { - var f *os.File - var err error - for i := uint64(0); ; i++ { - path := devPrefix + strconv.FormatUint(i, 10) - f, err = os.OpenFile(path, os.O_RDWR, 0000) - if os.IsNotExist(err) { - if i == 0 { - // not even the first device was found -> fuse is not loaded - return nil, errNotLoaded - } - - // we've run out of kernel-provided devices - return nil, errNoAvail - } - - if err2, ok := err.(*os.PathError); ok && err2.Err == syscall.EBUSY { - // try the next one - continue - } - - if err != nil { - return nil, err - } - return f, nil - } -} - -func handleMountOSXFUSE(helperName string, errCh chan<- error) func(line string) (ignore bool) { - var noMountpointPrefix = helperName + `: ` - const noMountpointSuffix = `: No such file or directory` - return func(line string) (ignore bool) { - if strings.HasPrefix(line, noMountpointPrefix) && strings.HasSuffix(line, noMountpointSuffix) { - // re-extract it from the error message in case some layer - // changed the path - mountpoint := line[len(noMountpointPrefix) : len(line)-len(noMountpointSuffix)] - err := &MountpointDoesNotExistError{ - Path: mountpoint, - } - select { - case errCh <- err: - return true - default: - // not the first error; fall back to logging it - return false - } - } - - return false - } -} - -// isBoringMountOSXFUSEError returns whether the Wait error is -// uninteresting; exit status 64 is. -func isBoringMountOSXFUSEError(err error) bool { - if err, ok := err.(*exec.ExitError); ok && err.Exited() { - if status, ok := err.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == 64 { - return true - } - } - return false -} - -func callMount(bin string, daemonVar string, dir string, conf *mountConfig, f *os.File, ready chan<- struct{}, errp *error) error { - for k, v := range conf.options { - if strings.Contains(k, ",") || strings.Contains(v, ",") { - // Silly limitation but the mount helper does not - // understand any escaping. See TestMountOptionCommaError. - return fmt.Errorf("mount options cannot contain commas on darwin: %q=%q", k, v) - } - } - cmd := exec.Command( - bin, - "-o", conf.getOptions(), - // Tell osxfuse-kext how large our buffer is. It must split - // writes larger than this into multiple writes. - // - // OSXFUSE seems to ignore InitResponse.MaxWrite, and uses - // this instead. - "-o", "iosize="+strconv.FormatUint(maxWrite, 10), - // refers to fd passed in cmd.ExtraFiles - "3", - dir, - ) - cmd.ExtraFiles = []*os.File{f} - cmd.Env = os.Environ() - // OSXFUSE <3.3.0 - cmd.Env = append(cmd.Env, "MOUNT_FUSEFS_CALL_BY_LIB=") - // OSXFUSE >=3.3.0 - cmd.Env = append(cmd.Env, "MOUNT_OSXFUSE_CALL_BY_LIB=") - - daemon := os.Args[0] - if daemonVar != "" { - cmd.Env = append(cmd.Env, daemonVar+"="+daemon) - } - - stdout, err := cmd.StdoutPipe() - if err != nil { - return fmt.Errorf("setting up mount_osxfusefs stderr: %v", err) - } - stderr, err := cmd.StderrPipe() - if err != nil { - return fmt.Errorf("setting up mount_osxfusefs stderr: %v", err) - } - - if err := cmd.Start(); err != nil { - return fmt.Errorf("mount_osxfusefs: %v", err) - } - helperErrCh := make(chan error, 1) - go func() { - var wg sync.WaitGroup - wg.Add(2) - go lineLogger(&wg, "mount helper output", neverIgnoreLine, stdout) - helperName := path.Base(bin) - go lineLogger(&wg, "mount helper error", handleMountOSXFUSE(helperName, helperErrCh), stderr) - wg.Wait() - if err := cmd.Wait(); err != nil { - // see if we have a better error to report - select { - case helperErr := <-helperErrCh: - // log the Wait error if it's not what we expected - if !isBoringMountOSXFUSEError(err) { - log.Printf("mount helper failed: %v", err) - } - // and now return what we grabbed from stderr as the real - // error - *errp = helperErr - close(ready) - return - default: - // nope, fall back to generic message - } - - *errp = fmt.Errorf("mount_osxfusefs: %v", err) - close(ready) - return - } - - *errp = nil - close(ready) - }() - return nil -} - -func mount(dir string, conf *mountConfig, ready chan<- struct{}, errp *error) (*os.File, error) { - locations := conf.osxfuseLocations - if locations == nil { - locations = []OSXFUSEPaths{ - OSXFUSELocationV3, - OSXFUSELocationV2, - } - } - for _, loc := range locations { - if _, err := os.Stat(loc.Mount); os.IsNotExist(err) { - // try the other locations - continue - } - - f, err := openOSXFUSEDev(loc.DevicePrefix) - if err == errNotLoaded { - err = loadOSXFUSE(loc.Load) - if err != nil { - return nil, err - } - // try again - f, err = openOSXFUSEDev(loc.DevicePrefix) - } - if err != nil { - return nil, err - } - err = callMount(loc.Mount, loc.DaemonVar, dir, conf, f, ready, errp) - if err != nil { - f.Close() - return nil, err - } - return f, nil - } - return nil, ErrOSXFUSENotFound -} diff --git a/vendor/bazil.org/fuse/mount_freebsd.go b/vendor/bazil.org/fuse/mount_freebsd.go deleted file mode 100644 index 70bb41024978..000000000000 --- a/vendor/bazil.org/fuse/mount_freebsd.go +++ /dev/null @@ -1,111 +0,0 @@ -package fuse - -import ( - "fmt" - "log" - "os" - "os/exec" - "strings" - "sync" - "syscall" -) - -func handleMountFusefsStderr(errCh chan<- error) func(line string) (ignore bool) { - return func(line string) (ignore bool) { - const ( - noMountpointPrefix = `mount_fusefs: ` - noMountpointSuffix = `: No such file or directory` - ) - if strings.HasPrefix(line, noMountpointPrefix) && strings.HasSuffix(line, noMountpointSuffix) { - // re-extract it from the error message in case some layer - // changed the path - mountpoint := line[len(noMountpointPrefix) : len(line)-len(noMountpointSuffix)] - err := &MountpointDoesNotExistError{ - Path: mountpoint, - } - select { - case errCh <- err: - return true - default: - // not the first error; fall back to logging it - return false - } - } - - return false - } -} - -// isBoringMountFusefsError returns whether the Wait error is -// uninteresting; exit status 1 is. -func isBoringMountFusefsError(err error) bool { - if err, ok := err.(*exec.ExitError); ok && err.Exited() { - if status, ok := err.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == 1 { - return true - } - } - return false -} - -func mount(dir string, conf *mountConfig, ready chan<- struct{}, errp *error) (*os.File, error) { - for k, v := range conf.options { - if strings.Contains(k, ",") || strings.Contains(v, ",") { - // Silly limitation but the mount helper does not - // understand any escaping. See TestMountOptionCommaError. - return nil, fmt.Errorf("mount options cannot contain commas on FreeBSD: %q=%q", k, v) - } - } - - f, err := os.OpenFile("/dev/fuse", os.O_RDWR, 0000) - if err != nil { - *errp = err - return nil, err - } - - cmd := exec.Command( - "/sbin/mount_fusefs", - "--safe", - "-o", conf.getOptions(), - "3", - dir, - ) - cmd.ExtraFiles = []*os.File{f} - - stdout, err := cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("setting up mount_fusefs stderr: %v", err) - } - stderr, err := cmd.StderrPipe() - if err != nil { - return nil, fmt.Errorf("setting up mount_fusefs stderr: %v", err) - } - - if err := cmd.Start(); err != nil { - return nil, fmt.Errorf("mount_fusefs: %v", err) - } - helperErrCh := make(chan error, 1) - var wg sync.WaitGroup - wg.Add(2) - go lineLogger(&wg, "mount helper output", neverIgnoreLine, stdout) - go lineLogger(&wg, "mount helper error", handleMountFusefsStderr(helperErrCh), stderr) - wg.Wait() - if err := cmd.Wait(); err != nil { - // see if we have a better error to report - select { - case helperErr := <-helperErrCh: - // log the Wait error if it's not what we expected - if !isBoringMountFusefsError(err) { - log.Printf("mount helper failed: %v", err) - } - // and now return what we grabbed from stderr as the real - // error - return nil, helperErr - default: - // nope, fall back to generic message - } - return nil, fmt.Errorf("mount_fusefs: %v", err) - } - - close(ready) - return f, nil -} diff --git a/vendor/bazil.org/fuse/mount_linux.go b/vendor/bazil.org/fuse/mount_linux.go deleted file mode 100644 index 197d1044e926..000000000000 --- a/vendor/bazil.org/fuse/mount_linux.go +++ /dev/null @@ -1,150 +0,0 @@ -package fuse - -import ( - "fmt" - "log" - "net" - "os" - "os/exec" - "strings" - "sync" - "syscall" -) - -func handleFusermountStderr(errCh chan<- error) func(line string) (ignore bool) { - return func(line string) (ignore bool) { - if line == `fusermount: failed to open /etc/fuse.conf: Permission denied` { - // Silence this particular message, it occurs way too - // commonly and isn't very relevant to whether the mount - // succeeds or not. - return true - } - - const ( - noMountpointPrefix = `fusermount: failed to access mountpoint ` - noMountpointSuffix = `: No such file or directory` - ) - if strings.HasPrefix(line, noMountpointPrefix) && strings.HasSuffix(line, noMountpointSuffix) { - // re-extract it from the error message in case some layer - // changed the path - mountpoint := line[len(noMountpointPrefix) : len(line)-len(noMountpointSuffix)] - err := &MountpointDoesNotExistError{ - Path: mountpoint, - } - select { - case errCh <- err: - return true - default: - // not the first error; fall back to logging it - return false - } - } - - return false - } -} - -// isBoringFusermountError returns whether the Wait error is -// uninteresting; exit status 1 is. -func isBoringFusermountError(err error) bool { - if err, ok := err.(*exec.ExitError); ok && err.Exited() { - if status, ok := err.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == 1 { - return true - } - } - return false -} - -func mount(dir string, conf *mountConfig, ready chan<- struct{}, errp *error) (fusefd *os.File, err error) { - // linux mount is never delayed - close(ready) - - fds, err := syscall.Socketpair(syscall.AF_FILE, syscall.SOCK_STREAM, 0) - if err != nil { - return nil, fmt.Errorf("socketpair error: %v", err) - } - - writeFile := os.NewFile(uintptr(fds[0]), "fusermount-child-writes") - defer writeFile.Close() - - readFile := os.NewFile(uintptr(fds[1]), "fusermount-parent-reads") - defer readFile.Close() - - cmd := exec.Command( - "fusermount", - "-o", conf.getOptions(), - "--", - dir, - ) - cmd.Env = append(os.Environ(), "_FUSE_COMMFD=3") - - cmd.ExtraFiles = []*os.File{writeFile} - - var wg sync.WaitGroup - stdout, err := cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("setting up fusermount stderr: %v", err) - } - stderr, err := cmd.StderrPipe() - if err != nil { - return nil, fmt.Errorf("setting up fusermount stderr: %v", err) - } - - if err := cmd.Start(); err != nil { - return nil, fmt.Errorf("fusermount: %v", err) - } - helperErrCh := make(chan error, 1) - wg.Add(2) - go lineLogger(&wg, "mount helper output", neverIgnoreLine, stdout) - go lineLogger(&wg, "mount helper error", handleFusermountStderr(helperErrCh), stderr) - wg.Wait() - if err := cmd.Wait(); err != nil { - // see if we have a better error to report - select { - case helperErr := <-helperErrCh: - // log the Wait error if it's not what we expected - if !isBoringFusermountError(err) { - log.Printf("mount helper failed: %v", err) - } - // and now return what we grabbed from stderr as the real - // error - return nil, helperErr - default: - // nope, fall back to generic message - } - - return nil, fmt.Errorf("fusermount: %v", err) - } - - c, err := net.FileConn(readFile) - if err != nil { - return nil, fmt.Errorf("FileConn from fusermount socket: %v", err) - } - defer c.Close() - - uc, ok := c.(*net.UnixConn) - if !ok { - return nil, fmt.Errorf("unexpected FileConn type; expected UnixConn, got %T", c) - } - - buf := make([]byte, 32) // expect 1 byte - oob := make([]byte, 32) // expect 24 bytes - _, oobn, _, _, err := uc.ReadMsgUnix(buf, oob) - scms, err := syscall.ParseSocketControlMessage(oob[:oobn]) - if err != nil { - return nil, fmt.Errorf("ParseSocketControlMessage: %v", err) - } - if len(scms) != 1 { - return nil, fmt.Errorf("expected 1 SocketControlMessage; got scms = %#v", scms) - } - scm := scms[0] - gotFds, err := syscall.ParseUnixRights(&scm) - if err != nil { - return nil, fmt.Errorf("syscall.ParseUnixRights: %v", err) - } - if len(gotFds) != 1 { - return nil, fmt.Errorf("wanted 1 fd; got %#v", gotFds) - } - f := os.NewFile(uintptr(gotFds[0]), "/dev/fuse") - return f, nil -} diff --git a/vendor/bazil.org/fuse/options.go b/vendor/bazil.org/fuse/options.go deleted file mode 100644 index 65ce8a5410d2..000000000000 --- a/vendor/bazil.org/fuse/options.go +++ /dev/null @@ -1,310 +0,0 @@ -package fuse - -import ( - "errors" - "strings" -) - -func dummyOption(conf *mountConfig) error { - return nil -} - -// mountConfig holds the configuration for a mount operation. -// Use it by passing MountOption values to Mount. -type mountConfig struct { - options map[string]string - maxReadahead uint32 - initFlags InitFlags - osxfuseLocations []OSXFUSEPaths -} - -func escapeComma(s string) string { - s = strings.Replace(s, `\`, `\\`, -1) - s = strings.Replace(s, `,`, `\,`, -1) - return s -} - -// getOptions makes a string of options suitable for passing to FUSE -// mount flag `-o`. Returns an empty string if no options were set. -// Any platform specific adjustments should happen before the call. -func (m *mountConfig) getOptions() string { - var opts []string - for k, v := range m.options { - k = escapeComma(k) - if v != "" { - k += "=" + escapeComma(v) - } - opts = append(opts, k) - } - return strings.Join(opts, ",") -} - -type mountOption func(*mountConfig) error - -// MountOption is passed to Mount to change the behavior of the mount. -type MountOption mountOption - -// FSName sets the file system name (also called source) that is -// visible in the list of mounted file systems. -// -// FreeBSD ignores this option. -func FSName(name string) MountOption { - return func(conf *mountConfig) error { - conf.options["fsname"] = name - return nil - } -} - -// Subtype sets the subtype of the mount. The main type is always -// `fuse`. The type in a list of mounted file systems will look like -// `fuse.foo`. -// -// OS X ignores this option. -// FreeBSD ignores this option. -func Subtype(fstype string) MountOption { - return func(conf *mountConfig) error { - conf.options["subtype"] = fstype - return nil - } -} - -// LocalVolume sets the volume to be local (instead of network), -// changing the behavior of Finder, Spotlight, and such. -// -// OS X only. Others ignore this option. -func LocalVolume() MountOption { - return localVolume -} - -// VolumeName sets the volume name shown in Finder. -// -// OS X only. Others ignore this option. -func VolumeName(name string) MountOption { - return volumeName(name) -} - -// NoAppleDouble makes OSXFUSE disallow files with names used by OS X -// to store extended attributes on file systems that do not support -// them natively. -// -// Such file names are: -// -// ._* -// .DS_Store -// -// OS X only. Others ignore this option. -func NoAppleDouble() MountOption { - return noAppleDouble -} - -// NoAppleXattr makes OSXFUSE disallow extended attributes with the -// prefix "com.apple.". This disables persistent Finder state and -// other such information. -// -// OS X only. Others ignore this option. -func NoAppleXattr() MountOption { - return noAppleXattr -} - -// ExclCreate causes O_EXCL flag to be set for only "truly" exclusive creates, -// i.e. create calls for which the initiator explicitly set the O_EXCL flag. -// -// OSXFUSE expects all create calls to return EEXIST in case the file -// already exists, regardless of whether O_EXCL was specified or not. -// To ensure this behavior, it normally sets OpenExclusive for all -// Create calls, regardless of whether the original call had it set. -// For distributed filesystems, that may force every file create to be -// a distributed consensus action, causing undesirable delays. -// -// This option makes the FUSE filesystem see the original flag value, -// and better decide when to ensure global consensus. -// -// Note that returning EEXIST on existing file create is still -// expected with OSXFUSE, regardless of the presence of the -// OpenExclusive flag. -// -// For more information, see -// https://github.com/osxfuse/osxfuse/issues/209 -// -// OS X only. Others ignore this options. -// Requires OSXFUSE 3.4.1 or newer. -func ExclCreate() MountOption { - return exclCreate -} - -// DaemonTimeout sets the time in seconds between a request and a reply before -// the FUSE mount is declared dead. -// -// OS X and FreeBSD only. Others ignore this option. -func DaemonTimeout(name string) MountOption { - return daemonTimeout(name) -} - -var ErrCannotCombineAllowOtherAndAllowRoot = errors.New("cannot combine AllowOther and AllowRoot") - -// AllowOther allows other users to access the file system. -// -// Only one of AllowOther or AllowRoot can be used. -func AllowOther() MountOption { - return func(conf *mountConfig) error { - if _, ok := conf.options["allow_root"]; ok { - return ErrCannotCombineAllowOtherAndAllowRoot - } - conf.options["allow_other"] = "" - return nil - } -} - -// AllowRoot allows other users to access the file system. -// -// Only one of AllowOther or AllowRoot can be used. -// -// FreeBSD ignores this option. -func AllowRoot() MountOption { - return func(conf *mountConfig) error { - if _, ok := conf.options["allow_other"]; ok { - return ErrCannotCombineAllowOtherAndAllowRoot - } - conf.options["allow_root"] = "" - return nil - } -} - -// AllowDev enables interpreting character or block special devices on the -// filesystem. -func AllowDev() MountOption { - return func(conf *mountConfig) error { - conf.options["dev"] = "" - return nil - } -} - -// AllowSUID allows set-user-identifier or set-group-identifier bits to take -// effect. -func AllowSUID() MountOption { - return func(conf *mountConfig) error { - conf.options["suid"] = "" - return nil - } -} - -// DefaultPermissions makes the kernel enforce access control based on -// the file mode (as in chmod). -// -// Without this option, the Node itself decides what is and is not -// allowed. This is normally ok because FUSE file systems cannot be -// accessed by other users without AllowOther/AllowRoot. -// -// FreeBSD ignores this option. -func DefaultPermissions() MountOption { - return func(conf *mountConfig) error { - conf.options["default_permissions"] = "" - return nil - } -} - -// ReadOnly makes the mount read-only. -func ReadOnly() MountOption { - return func(conf *mountConfig) error { - conf.options["ro"] = "" - return nil - } -} - -// MaxReadahead sets the number of bytes that can be prefetched for -// sequential reads. The kernel can enforce a maximum value lower than -// this. -// -// This setting makes the kernel perform speculative reads that do not -// originate from any client process. This usually tremendously -// improves read performance. -func MaxReadahead(n uint32) MountOption { - return func(conf *mountConfig) error { - conf.maxReadahead = n - return nil - } -} - -// AsyncRead enables multiple outstanding read requests for the same -// handle. Without this, there is at most one request in flight at a -// time. -func AsyncRead() MountOption { - return func(conf *mountConfig) error { - conf.initFlags |= InitAsyncRead - return nil - } -} - -// WritebackCache enables the kernel to buffer writes before sending -// them to the FUSE server. Without this, writethrough caching is -// used. -func WritebackCache() MountOption { - return func(conf *mountConfig) error { - conf.initFlags |= InitWritebackCache - return nil - } -} - -// OSXFUSEPaths describes the paths used by an installed OSXFUSE -// version. See OSXFUSELocationV3 for typical values. -type OSXFUSEPaths struct { - // Prefix for the device file. At mount time, an incrementing - // number is suffixed until a free FUSE device is found. - DevicePrefix string - // Path of the load helper, used to load the kernel extension if - // no device files are found. - Load string - // Path of the mount helper, used for the actual mount operation. - Mount string - // Environment variable used to pass the path to the executable - // calling the mount helper. - DaemonVar string -} - -// Default paths for OSXFUSE. See OSXFUSELocations. -var ( - OSXFUSELocationV3 = OSXFUSEPaths{ - DevicePrefix: "/dev/osxfuse", - Load: "/Library/Filesystems/osxfuse.fs/Contents/Resources/load_osxfuse", - Mount: "/Library/Filesystems/osxfuse.fs/Contents/Resources/mount_osxfuse", - DaemonVar: "MOUNT_OSXFUSE_DAEMON_PATH", - } - OSXFUSELocationV2 = OSXFUSEPaths{ - DevicePrefix: "/dev/osxfuse", - Load: "/Library/Filesystems/osxfusefs.fs/Support/load_osxfusefs", - Mount: "/Library/Filesystems/osxfusefs.fs/Support/mount_osxfusefs", - DaemonVar: "MOUNT_FUSEFS_DAEMON_PATH", - } -) - -// OSXFUSELocations sets where to look for OSXFUSE files. The -// arguments are all the possible locations. The previous locations -// are replaced. -// -// Without this option, OSXFUSELocationV3 and OSXFUSELocationV2 are -// used. -// -// OS X only. Others ignore this option. -func OSXFUSELocations(paths ...OSXFUSEPaths) MountOption { - return func(conf *mountConfig) error { - if len(paths) == 0 { - return errors.New("must specify at least one location for OSXFUSELocations") - } - // replace previous values, but make a copy so there's no - // worries about caller mutating their slice - conf.osxfuseLocations = append(conf.osxfuseLocations[:0], paths...) - return nil - } -} - -// AllowNonEmptyMount allows the mounting over a non-empty directory. -// -// The files in it will be shadowed by the freshly created mount. By -// default these mounts are rejected to prevent accidental covering up -// of data, which could for example prevent automatic backup. -func AllowNonEmptyMount() MountOption { - return func(conf *mountConfig) error { - conf.options["nonempty"] = "" - return nil - } -} diff --git a/vendor/bazil.org/fuse/options_darwin.go b/vendor/bazil.org/fuse/options_darwin.go deleted file mode 100644 index faa9d78e7429..000000000000 --- a/vendor/bazil.org/fuse/options_darwin.go +++ /dev/null @@ -1,35 +0,0 @@ -package fuse - -func localVolume(conf *mountConfig) error { - conf.options["local"] = "" - return nil -} - -func volumeName(name string) MountOption { - return func(conf *mountConfig) error { - conf.options["volname"] = name - return nil - } -} - -func daemonTimeout(name string) MountOption { - return func(conf *mountConfig) error { - conf.options["daemon_timeout"] = name - return nil - } -} - -func noAppleXattr(conf *mountConfig) error { - conf.options["noapplexattr"] = "" - return nil -} - -func noAppleDouble(conf *mountConfig) error { - conf.options["noappledouble"] = "" - return nil -} - -func exclCreate(conf *mountConfig) error { - conf.options["excl_create"] = "" - return nil -} diff --git a/vendor/bazil.org/fuse/options_freebsd.go b/vendor/bazil.org/fuse/options_freebsd.go deleted file mode 100644 index 7c164b13687d..000000000000 --- a/vendor/bazil.org/fuse/options_freebsd.go +++ /dev/null @@ -1,28 +0,0 @@ -package fuse - -func localVolume(conf *mountConfig) error { - return nil -} - -func volumeName(name string) MountOption { - return dummyOption -} - -func daemonTimeout(name string) MountOption { - return func(conf *mountConfig) error { - conf.options["timeout"] = name - return nil - } -} - -func noAppleXattr(conf *mountConfig) error { - return nil -} - -func noAppleDouble(conf *mountConfig) error { - return nil -} - -func exclCreate(conf *mountConfig) error { - return nil -} diff --git a/vendor/bazil.org/fuse/options_linux.go b/vendor/bazil.org/fuse/options_linux.go deleted file mode 100644 index 13f0896d5844..000000000000 --- a/vendor/bazil.org/fuse/options_linux.go +++ /dev/null @@ -1,25 +0,0 @@ -package fuse - -func localVolume(conf *mountConfig) error { - return nil -} - -func volumeName(name string) MountOption { - return dummyOption -} - -func daemonTimeout(name string) MountOption { - return dummyOption -} - -func noAppleXattr(conf *mountConfig) error { - return nil -} - -func noAppleDouble(conf *mountConfig) error { - return nil -} - -func exclCreate(conf *mountConfig) error { - return nil -} diff --git a/vendor/bazil.org/fuse/protocol.go b/vendor/bazil.org/fuse/protocol.go deleted file mode 100644 index a77bbf72f1ad..000000000000 --- a/vendor/bazil.org/fuse/protocol.go +++ /dev/null @@ -1,75 +0,0 @@ -package fuse - -import ( - "fmt" -) - -// Protocol is a FUSE protocol version number. -type Protocol struct { - Major uint32 - Minor uint32 -} - -func (p Protocol) String() string { - return fmt.Sprintf("%d.%d", p.Major, p.Minor) -} - -// LT returns whether a is less than b. -func (a Protocol) LT(b Protocol) bool { - return a.Major < b.Major || - (a.Major == b.Major && a.Minor < b.Minor) -} - -// GE returns whether a is greater than or equal to b. -func (a Protocol) GE(b Protocol) bool { - return a.Major > b.Major || - (a.Major == b.Major && a.Minor >= b.Minor) -} - -func (a Protocol) is79() bool { - return a.GE(Protocol{7, 9}) -} - -// HasAttrBlockSize returns whether Attr.BlockSize is respected by the -// kernel. -func (a Protocol) HasAttrBlockSize() bool { - return a.is79() -} - -// HasReadWriteFlags returns whether ReadRequest/WriteRequest -// fields Flags and FileFlags are valid. -func (a Protocol) HasReadWriteFlags() bool { - return a.is79() -} - -// HasGetattrFlags returns whether GetattrRequest field Flags is -// valid. -func (a Protocol) HasGetattrFlags() bool { - return a.is79() -} - -func (a Protocol) is710() bool { - return a.GE(Protocol{7, 10}) -} - -// HasOpenNonSeekable returns whether OpenResponse field Flags flag -// OpenNonSeekable is supported. -func (a Protocol) HasOpenNonSeekable() bool { - return a.is710() -} - -func (a Protocol) is712() bool { - return a.GE(Protocol{7, 12}) -} - -// HasUmask returns whether CreateRequest/MkdirRequest/MknodRequest -// field Umask is valid. -func (a Protocol) HasUmask() bool { - return a.is712() -} - -// HasInvalidate returns whether InvalidateNode/InvalidateEntry are -// supported. -func (a Protocol) HasInvalidate() bool { - return a.is712() -} diff --git a/vendor/bazil.org/fuse/unmount.go b/vendor/bazil.org/fuse/unmount.go deleted file mode 100644 index ffe3f155c484..000000000000 --- a/vendor/bazil.org/fuse/unmount.go +++ /dev/null @@ -1,6 +0,0 @@ -package fuse - -// Unmount tries to unmount the filesystem mounted at dir. -func Unmount(dir string) error { - return unmount(dir) -} diff --git a/vendor/bazil.org/fuse/unmount_linux.go b/vendor/bazil.org/fuse/unmount_linux.go deleted file mode 100644 index 088f0cfeeec4..000000000000 --- a/vendor/bazil.org/fuse/unmount_linux.go +++ /dev/null @@ -1,21 +0,0 @@ -package fuse - -import ( - "bytes" - "errors" - "os/exec" -) - -func unmount(dir string) error { - cmd := exec.Command("fusermount", "-u", dir) - output, err := cmd.CombinedOutput() - if err != nil { - if len(output) > 0 { - output = bytes.TrimRight(output, "\n") - msg := err.Error() + ": " + string(output) - err = errors.New(msg) - } - return err - } - return nil -} diff --git a/vendor/bazil.org/fuse/unmount_std.go b/vendor/bazil.org/fuse/unmount_std.go deleted file mode 100644 index d6efe276f6cb..000000000000 --- a/vendor/bazil.org/fuse/unmount_std.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build !linux - -package fuse - -import ( - "os" - "syscall" -) - -func unmount(dir string) error { - err := syscall.Unmount(dir, 0) - if err != nil { - err = &os.PathError{Op: "unmount", Path: dir, Err: err} - return err - } - return nil -} diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/core.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/core.go index 0dde81d728c9..d7b866cdf959 100755 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/core.go +++ b/vendor/github.com/Azure/azure-pipeline-go/pipeline/core.go @@ -2,6 +2,7 @@ package pipeline import ( "context" + "github.com/mattn/go-ieproxy" "net" "net/http" "os" @@ -204,7 +205,7 @@ func newDefaultHTTPClient() *http.Client { // We want the Transport to have a large connection pool return &http.Client{ Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, + Proxy: ieproxy.GetProxyFunc(), // We use Dial instead of DialContext as DialContext has been reported to cause slower performance. Dial /*Context*/ : (&net.Dialer{ Timeout: 30 * time.Second, @@ -253,3 +254,31 @@ type methodFactoryMarker struct { func (methodFactoryMarker) New(next Policy, po *PolicyOptions) Policy { panic("methodFactoryMarker policy should have been replaced with a method policy") } + +// LogSanitizer can be implemented to clean secrets from lines logged by ForceLog +// By default no implemetation is provided here, because pipeline may be used in many different +// contexts, so the correct implementation is context-dependent +type LogSanitizer interface { + SanitizeLogMessage(raw string) string +} + +var sanitizer LogSanitizer +var enableForceLog bool = true + +// SetLogSanitizer can be called to supply a custom LogSanitizer. +// There is no threadsafety or locking on the underlying variable, +// so call this function just once at startup of your application +// (Don't later try to change the sanitizer on the fly). +func SetLogSanitizer(s LogSanitizer)(){ + sanitizer = s +} + +// SetForceLogEnabled can be used to disable ForceLog +// There is no threadsafety or locking on the underlying variable, +// so call this function just once at startup of your application +// (Don't later try to change the setting on the fly). +func SetForceLogEnabled(enable bool)() { + enableForceLog = enable +} + + diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog.go new file mode 100644 index 000000000000..e7ce4970b8b3 --- /dev/null +++ b/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog.go @@ -0,0 +1,14 @@ +package pipeline + + +// ForceLog should rarely be used. It forceable logs an entry to the +// Windows Event Log (on Windows) or to the SysLog (on Linux) +func ForceLog(level LogLevel, msg string) { + if !enableForceLog { + return + } + if sanitizer != nil { + msg = sanitizer.SanitizeLogMessage(msg) + } + forceLog(level, msg) +} diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_syslog.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_syslog.go index d0bb7740769c..819509a1e54a 100755 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_syslog.go +++ b/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_syslog.go @@ -7,9 +7,9 @@ import ( "log/syslog" ) -// ForceLog should rarely be used. It forceable logs an entry to the +// forceLog should rarely be used. It forceable logs an entry to the // Windows Event Log (on Windows) or to the SysLog (on Linux) -func ForceLog(level LogLevel, msg string) { +func forceLog(level LogLevel, msg string) { if defaultLogger == nil { return // Return fast if we failed to create the logger. } diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_windows.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_windows.go index cb67398995af..5fcf40014aab 100755 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_windows.go +++ b/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_windows.go @@ -6,9 +6,9 @@ import ( "unsafe" ) -// ForceLog should rarely be used. It forceable logs an entry to the +// forceLog should rarely be used. It forceable logs an entry to the // Windows Event Log (on Windows) or to the SysLog (on Linux) -func ForceLog(level LogLevel, msg string) { +func forceLog(level LogLevel, msg string) { var el eventType switch level { case LogError, LogFatal, LogPanic: @@ -35,7 +35,7 @@ const ( ) var reportEvent = func() func(eventType eventType, eventID int32, msg string) { - advAPI32 := syscall.MustLoadDLL("AdvAPI32.dll") + advAPI32 := syscall.MustLoadDLL("advapi32.dll") // lower case to tie in with Go's sysdll registration registerEventSource := advAPI32.MustFindProc("RegisterEventSourceW") sourceName, _ := os.Executable() diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/error.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/error.go index fd008364d633..4aaf066501ef 100755 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/error.go +++ b/vendor/github.com/Azure/azure-pipeline-go/pipeline/error.go @@ -9,6 +9,23 @@ type causer interface { Cause() error } +func errorWithPC(msg string, pc uintptr) string { + s := "" + if fn := runtime.FuncForPC(pc); fn != nil { + file, line := fn.FileLine(pc) + s = fmt.Sprintf("-> %v, %v:%v\n", fn.Name(), file, line) + } + s += msg + "\n\n" + return s +} + +func getPC(callersToSkip int) uintptr { + // Get the PC of Initialize method's caller. + pc := [1]uintptr{} + _ = runtime.Callers(callersToSkip, pc[:]) + return pc[0] +} + // ErrorNode can be an embedded field in a private error object. This field // adds Program Counter support and a 'cause' (reference to a preceding error). // When initializing a error type with this embedded field, initialize the @@ -22,12 +39,7 @@ type ErrorNode struct { // When defining a new error type, have its Error method call this one passing // it the string representation of the error. func (e *ErrorNode) Error(msg string) string { - s := "" - if fn := runtime.FuncForPC(e.pc); fn != nil { - file, line := fn.FileLine(e.pc) - s = fmt.Sprintf("-> %v, %v:%v\n", fn.Name(), file, line) - } - s += msg + "\n\n" + s := errorWithPC(msg, e.pc) if e.cause != nil { s += e.cause.Error() + "\n" } @@ -83,10 +95,8 @@ func (e ErrorNode) Timeout() bool { // value of 3 is very common; but, depending on your code nesting, you may need // a different value. func (ErrorNode) Initialize(cause error, callersToSkip int) ErrorNode { - // Get the PC of Initialize method's caller. - pc := [1]uintptr{} - _ = runtime.Callers(callersToSkip, pc[:]) - return ErrorNode{pc: pc[0], cause: cause} + pc := getPC(callersToSkip) + return ErrorNode{pc: pc, cause: cause} } // Cause walks all the preceding errors and return the originating error. @@ -101,12 +111,53 @@ func Cause(err error) error { return err } +// ErrorNodeNoCause can be an embedded field in a private error object. This field +// adds Program Counter support. +// When initializing a error type with this embedded field, initialize the +// ErrorNodeNoCause field by calling ErrorNodeNoCause{}.Initialize(). +type ErrorNodeNoCause struct { + pc uintptr // Represents a Program Counter that you can get symbols for. +} + +// Error returns a string with the PC's symbols or "" if the PC is invalid. +// When defining a new error type, have its Error method call this one passing +// it the string representation of the error. +func (e *ErrorNodeNoCause) Error(msg string) string { + return errorWithPC(msg, e.pc) +} + +// Temporary returns true if the error occurred due to a temporary condition. +func (e ErrorNodeNoCause) Temporary() bool { + return false +} + +// Timeout returns true if the error occurred due to time expiring. +func (e ErrorNodeNoCause) Timeout() bool { + return false +} + +// Initialize is used to initialize an embedded ErrorNode field. +// It captures the caller's program counter. +// To initialize the field, use "ErrorNodeNoCause{}.Initialize(3)". A callersToSkip +// value of 3 is very common; but, depending on your code nesting, you may need +// a different value. +func (ErrorNodeNoCause) Initialize(callersToSkip int) ErrorNodeNoCause { + pc := getPC(callersToSkip) + return ErrorNodeNoCause{pc: pc} +} + // NewError creates a simple string error (like Error.New). But, this -// error also captures the caller's Program Counter and the preceding error. +// error also captures the caller's Program Counter and the preceding error (if provided). func NewError(cause error, msg string) error { - return &pcError{ - ErrorNode: ErrorNode{}.Initialize(cause, 3), - msg: msg, + if cause != nil { + return &pcError{ + ErrorNode: ErrorNode{}.Initialize(cause, 3), + msg: msg, + } + } + return &pcErrorNoCause{ + ErrorNodeNoCause: ErrorNodeNoCause{}.Initialize(3), + msg: msg, } } @@ -119,3 +170,12 @@ type pcError struct { // Error satisfies the error interface. It shows the error with Program Counter // symbols and calls Error on the preceding error so you can see the full error chain. func (e *pcError) Error() string { return e.ErrorNode.Error(e.msg) } + +// pcErrorNoCause is a simple string error (like error.New) with an ErrorNode (PC). +type pcErrorNoCause struct { + ErrorNodeNoCause + msg string +} + +// Error satisfies the error interface. It shows the error with Program Counter symbols. +func (e *pcErrorNoCause) Error() string { return e.ErrorNodeNoCause.Error(e.msg) } diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/version.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/version.go index c4bb62d810b2..899f996b542d 100644 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/version.go +++ b/vendor/github.com/Azure/azure-pipeline-go/pipeline/version.go @@ -5,5 +5,5 @@ const ( UserAgent = "azure-pipeline-go/" + Version // Version is the semantic version (see http://semver.org) of the pipeline package. - Version = "0.1.0" + Version = "0.2.1" ) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/parsing_urls.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/parsing_urls.go deleted file mode 100644 index e797a59c0b97..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/parsing_urls.go +++ /dev/null @@ -1,111 +0,0 @@ -package azblob - -import ( - "net/url" - "strings" -) - -const ( - snapshot = "snapshot" - SnapshotTimeFormat = "2006-01-02T15:04:05.0000000Z07:00" -) - -// A BlobURLParts object represents the components that make up an Azure Storage Container/Blob URL. You parse an -// existing URL into its parts by calling NewBlobURLParts(). You construct a URL from parts by calling URL(). -// NOTE: Changing any SAS-related field requires computing a new SAS signature. -type BlobURLParts struct { - Scheme string // Ex: "https://" - Host string // Ex: "account.blob.core.windows.net" - ContainerName string // "" if no container - BlobName string // "" if no blob - Snapshot string // "" if not a snapshot - SAS SASQueryParameters - UnparsedParams string -} - -// NewBlobURLParts parses a URL initializing BlobURLParts' fields including any SAS-related & snapshot query parameters. Any other -// query parameters remain in the UnparsedParams field. This method overwrites all fields in the BlobURLParts object. -func NewBlobURLParts(u url.URL) BlobURLParts { - up := BlobURLParts{ - Scheme: u.Scheme, - Host: u.Host, - } - - // Find the container & blob names (if any) - if u.Path != "" { - path := u.Path - if path[0] == '/' { - path = path[1:] // If path starts with a slash, remove it - } - - // Find the next slash (if it exists) - containerEndIndex := strings.Index(path, "/") - if containerEndIndex == -1 { // Slash not found; path has container name & no blob name - up.ContainerName = path - } else { - up.ContainerName = path[:containerEndIndex] // The container name is the part between the slashes - up.BlobName = path[containerEndIndex+1:] // The blob name is after the container slash - } - } - - // Convert the query parameters to a case-sensitive map & trim whitespace - paramsMap := u.Query() - - up.Snapshot = "" // Assume no snapshot - if snapshotStr, ok := caseInsensitiveValues(paramsMap).Get(snapshot); ok { - up.Snapshot = snapshotStr[0] - // If we recognized the query parameter, remove it from the map - delete(paramsMap, snapshot) - } - up.SAS = newSASQueryParameters(paramsMap, true) - up.UnparsedParams = paramsMap.Encode() - return up -} - -type caseInsensitiveValues url.Values // map[string][]string -func (values caseInsensitiveValues) Get(key string) ([]string, bool) { - key = strings.ToLower(key) - for k, v := range values { - if strings.ToLower(k) == key { - return v, true - } - } - return []string{}, false -} - -// URL returns a URL object whose fields are initialized from the BlobURLParts fields. The URL's RawQuery -// field contains the SAS, snapshot, and unparsed query parameters. -func (up BlobURLParts) URL() url.URL { - path := "" - // Concatenate container & blob names (if they exist) - if up.ContainerName != "" { - path += "/" + up.ContainerName - if up.BlobName != "" { - path += "/" + up.BlobName - } - } - - rawQuery := up.UnparsedParams - - // Concatenate blob snapshot query parameter (if it exists) - if up.Snapshot != "" { - if len(rawQuery) > 0 { - rawQuery += "&" - } - rawQuery += snapshot + "=" + up.Snapshot - } - sas := up.SAS.Encode() - if sas != "" { - if len(rawQuery) > 0 { - rawQuery += "&" - } - rawQuery += sas - } - u := url.URL{ - Scheme: up.Scheme, - Host: up.Host, - Path: path, - RawQuery: rawQuery, - } - return u -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/sas_service.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/sas_service.go deleted file mode 100644 index d0b12bc17a89..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/sas_service.go +++ /dev/null @@ -1,206 +0,0 @@ -package azblob - -import ( - "bytes" - "fmt" - "strings" - "time" -) - -// BlobSASSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage container or blob. -type BlobSASSignatureValues struct { - Version string `param:"sv"` // If not specified, this defaults to SASVersion - Protocol SASProtocol `param:"spr"` // See the SASProtocol* constants - StartTime time.Time `param:"st"` // Not specified if IsZero - ExpiryTime time.Time `param:"se"` // Not specified if IsZero - Permissions string `param:"sp"` // Create by initializing a ContainerSASPermissions or BlobSASPermissions and then call String() - IPRange IPRange `param:"sip"` - Identifier string `param:"si"` - ContainerName string - BlobName string // Use "" to create a Container SAS - CacheControl string // rscc - ContentDisposition string // rscd - ContentEncoding string // rsce - ContentLanguage string // rscl - ContentType string // rsct -} - -// NewSASQueryParameters uses an account's shared key credential to sign this signature values to produce -// the proper SAS query parameters. -func (v BlobSASSignatureValues) NewSASQueryParameters(sharedKeyCredential *SharedKeyCredential) SASQueryParameters { - if sharedKeyCredential == nil { - panic("sharedKeyCredential can't be nil") - } - - resource := "c" - if v.BlobName == "" { - // Make sure the permission characters are in the correct order - perms := &ContainerSASPermissions{} - if err := perms.Parse(v.Permissions); err != nil { - panic(err) - } - v.Permissions = perms.String() - } else { - resource = "b" - // Make sure the permission characters are in the correct order - perms := &BlobSASPermissions{} - if err := perms.Parse(v.Permissions); err != nil { - panic(err) - } - v.Permissions = perms.String() - } - if v.Version == "" { - v.Version = SASVersion - } - startTime, expiryTime := FormatTimesForSASSigning(v.StartTime, v.ExpiryTime) - - // String to sign: http://msdn.microsoft.com/en-us/library/azure/dn140255.aspx - stringToSign := strings.Join([]string{ - v.Permissions, - startTime, - expiryTime, - getCanonicalName(sharedKeyCredential.AccountName(), v.ContainerName, v.BlobName), - v.Identifier, - v.IPRange.String(), - string(v.Protocol), - v.Version, - v.CacheControl, // rscc - v.ContentDisposition, // rscd - v.ContentEncoding, // rsce - v.ContentLanguage, // rscl - v.ContentType}, // rsct - "\n") - signature := sharedKeyCredential.ComputeHMACSHA256(stringToSign) - - p := SASQueryParameters{ - // Common SAS parameters - version: v.Version, - protocol: v.Protocol, - startTime: v.StartTime, - expiryTime: v.ExpiryTime, - permissions: v.Permissions, - ipRange: v.IPRange, - - // Container/Blob-specific SAS parameters - resource: resource, - identifier: v.Identifier, - - // Calculated SAS signature - signature: signature, - } - return p -} - -// getCanonicalName computes the canonical name for a container or blob resource for SAS signing. -func getCanonicalName(account string, containerName string, blobName string) string { - // Container: "/blob/account/containername" - // Blob: "/blob/account/containername/blobname" - elements := []string{"/blob/", account, "/", containerName} - if blobName != "" { - elements = append(elements, "/", strings.Replace(blobName, "\\", "/", -1)) - } - return strings.Join(elements, "") -} - -// The ContainerSASPermissions type simplifies creating the permissions string for an Azure Storage container SAS. -// Initialize an instance of this type and then call its String method to set BlobSASSignatureValues's Permissions field. -type ContainerSASPermissions struct { - Read, Add, Create, Write, Delete, List bool -} - -// String produces the SAS permissions string for an Azure Storage container. -// Call this method to set BlobSASSignatureValues's Permissions field. -func (p ContainerSASPermissions) String() string { - var b bytes.Buffer - if p.Read { - b.WriteRune('r') - } - if p.Add { - b.WriteRune('a') - } - if p.Create { - b.WriteRune('c') - } - if p.Write { - b.WriteRune('w') - } - if p.Delete { - b.WriteRune('d') - } - if p.List { - b.WriteRune('l') - } - return b.String() -} - -// Parse initializes the ContainerSASPermissions's fields from a string. -func (p *ContainerSASPermissions) Parse(s string) error { - *p = ContainerSASPermissions{} // Clear the flags - for _, r := range s { - switch r { - case 'r': - p.Read = true - case 'a': - p.Add = true - case 'c': - p.Create = true - case 'w': - p.Write = true - case 'd': - p.Delete = true - case 'l': - p.List = true - default: - return fmt.Errorf("Invalid permission: '%v'", r) - } - } - return nil -} - -// The BlobSASPermissions type simplifies creating the permissions string for an Azure Storage blob SAS. -// Initialize an instance of this type and then call its String method to set BlobSASSignatureValues's Permissions field. -type BlobSASPermissions struct{ Read, Add, Create, Write, Delete bool } - -// String produces the SAS permissions string for an Azure Storage blob. -// Call this method to set BlobSASSignatureValues's Permissions field. -func (p BlobSASPermissions) String() string { - var b bytes.Buffer - if p.Read { - b.WriteRune('r') - } - if p.Add { - b.WriteRune('a') - } - if p.Create { - b.WriteRune('c') - } - if p.Write { - b.WriteRune('w') - } - if p.Delete { - b.WriteRune('d') - } - return b.String() -} - -// Parse initializes the BlobSASPermissions's fields from a string. -func (p *BlobSASPermissions) Parse(s string) error { - *p = BlobSASPermissions{} // Clear the flags - for _, r := range s { - switch r { - case 'r': - p.Read = true - case 'a': - p.Add = true - case 'c': - p.Create = true - case 'w': - p.Write = true - case 'd': - p.Delete = true - default: - return fmt.Errorf("Invalid permission: '%v'", r) - } - } - return nil -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_append_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_append_blob.go deleted file mode 100644 index b8711f5a1c43..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_append_blob.go +++ /dev/null @@ -1,112 +0,0 @@ -package azblob - -import ( - "context" - "io" - "net/url" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -const ( - // AppendBlobMaxAppendBlockBytes indicates the maximum number of bytes that can be sent in a call to AppendBlock. - AppendBlobMaxAppendBlockBytes = 4 * 1024 * 1024 // 4MB - - // AppendBlobMaxBlocks indicates the maximum number of blocks allowed in an append blob. - AppendBlobMaxBlocks = 50000 -) - -// AppendBlobURL defines a set of operations applicable to append blobs. -type AppendBlobURL struct { - BlobURL - abClient appendBlobClient -} - -// NewAppendBlobURL creates an AppendBlobURL object using the specified URL and request policy pipeline. -func NewAppendBlobURL(url url.URL, p pipeline.Pipeline) AppendBlobURL { - blobClient := newBlobClient(url, p) - abClient := newAppendBlobClient(url, p) - return AppendBlobURL{BlobURL: BlobURL{blobClient: blobClient}, abClient: abClient} -} - -// WithPipeline creates a new AppendBlobURL object identical to the source but with the specific request policy pipeline. -func (ab AppendBlobURL) WithPipeline(p pipeline.Pipeline) AppendBlobURL { - return NewAppendBlobURL(ab.blobClient.URL(), p) -} - -// WithSnapshot creates a new AppendBlobURL object identical to the source but with the specified snapshot timestamp. -// Pass "" to remove the snapshot returning a URL to the base blob. -func (ab AppendBlobURL) WithSnapshot(snapshot string) AppendBlobURL { - p := NewBlobURLParts(ab.URL()) - p.Snapshot = snapshot - return NewAppendBlobURL(p.URL(), ab.blobClient.Pipeline()) -} - -// Create creates a 0-length append blob. Call AppendBlock to append data to an append blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. -func (ab AppendBlobURL) Create(ctx context.Context, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*AppendBlobCreateResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch := ac.HTTPAccessConditions.pointers() - return ab.abClient.Create(ctx, 0, nil, - &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, - &h.CacheControl, metadata, ac.LeaseAccessConditions.pointers(), &h.ContentDisposition, - ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, nil) -} - -// AppendBlock writes a stream to a new block of data to the end of the existing append blob. -// This method panics if the stream is not at position 0. -// Note that the http client closes the body stream after the request is sent to the service. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block. -func (ab AppendBlobURL) AppendBlock(ctx context.Context, body io.ReadSeeker, ac BlobAccessConditions) (*AppendBlobAppendBlockResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - ifAppendPositionEqual, ifMaxSizeLessThanOrEqual := ac.AppendBlobAccessConditions.pointers() - return ab.abClient.AppendBlock(ctx, body, validateSeekableStreamAt0AndGetCount(body), nil, - ac.LeaseAccessConditions.pointers(), - ifMaxSizeLessThanOrEqual, ifAppendPositionEqual, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// AppendBlobAccessConditions identifies append blob-specific access conditions which you optionally set. -type AppendBlobAccessConditions struct { - // IfAppendPositionEqual ensures that the AppendBlock operation succeeds - // only if the append position is equal to a value. - // IfAppendPositionEqual=0 means no 'IfAppendPositionEqual' header specified. - // IfAppendPositionEqual>0 means 'IfAppendPositionEqual' header specified with its value - // IfAppendPositionEqual==-1 means IfAppendPositionEqual' header specified with a value of 0 - IfAppendPositionEqual int64 - - // IfMaxSizeLessThanOrEqual ensures that the AppendBlock operation succeeds - // only if the append blob's size is less than or equal to a value. - // IfMaxSizeLessThanOrEqual=0 means no 'IfMaxSizeLessThanOrEqual' header specified. - // IfMaxSizeLessThanOrEqual>0 means 'IfMaxSizeLessThanOrEqual' header specified with its value - // IfMaxSizeLessThanOrEqual==-1 means 'IfMaxSizeLessThanOrEqual' header specified with a value of 0 - IfMaxSizeLessThanOrEqual int64 -} - -// pointers is for internal infrastructure. It returns the fields as pointers. -func (ac AppendBlobAccessConditions) pointers() (iape *int64, imsltoe *int64) { - if ac.IfAppendPositionEqual < -1 { - panic("IfAppendPositionEqual can't be less than -1") - } - if ac.IfMaxSizeLessThanOrEqual < -1 { - panic("IfMaxSizeLessThanOrEqual can't be less than -1") - } - var zero int64 // defaults to 0 - switch ac.IfAppendPositionEqual { - case -1: - iape = &zero - case 0: - iape = nil - default: - iape = &ac.IfAppendPositionEqual - } - - switch ac.IfMaxSizeLessThanOrEqual { - case -1: - imsltoe = &zero - case 0: - imsltoe = nil - default: - imsltoe = &ac.IfMaxSizeLessThanOrEqual - } - return -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_page_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_page_blob.go deleted file mode 100644 index fa87ef8527e2..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_page_blob.go +++ /dev/null @@ -1,236 +0,0 @@ -package azblob - -import ( - "context" - "fmt" - "io" - "net/url" - "strconv" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -const ( - // PageBlobPageBytes indicates the number of bytes in a page (512). - PageBlobPageBytes = 512 - - // PageBlobMaxPutPagesBytes indicates the maximum number of bytes that can be sent in a call to PutPage. - PageBlobMaxUploadPagesBytes = 4 * 1024 * 1024 // 4MB -) - -// PageBlobURL defines a set of operations applicable to page blobs. -type PageBlobURL struct { - BlobURL - pbClient pageBlobClient -} - -// NewPageBlobURL creates a PageBlobURL object using the specified URL and request policy pipeline. -func NewPageBlobURL(url url.URL, p pipeline.Pipeline) PageBlobURL { - if p == nil { - panic("p can't be nil") - } - blobClient := newBlobClient(url, p) - pbClient := newPageBlobClient(url, p) - return PageBlobURL{BlobURL: BlobURL{blobClient: blobClient}, pbClient: pbClient} -} - -// WithPipeline creates a new PageBlobURL object identical to the source but with the specific request policy pipeline. -func (pb PageBlobURL) WithPipeline(p pipeline.Pipeline) PageBlobURL { - return NewPageBlobURL(pb.blobClient.URL(), p) -} - -// WithSnapshot creates a new PageBlobURL object identical to the source but with the specified snapshot timestamp. -// Pass "" to remove the snapshot returning a URL to the base blob. -func (pb PageBlobURL) WithSnapshot(snapshot string) PageBlobURL { - p := NewBlobURLParts(pb.URL()) - p.Snapshot = snapshot - return NewPageBlobURL(p.URL(), pb.blobClient.Pipeline()) -} - -// CreatePageBlob creates a page blob of the specified length. Call PutPage to upload data data to a page blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. -func (pb PageBlobURL) Create(ctx context.Context, size int64, sequenceNumber int64, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*PageBlobCreateResponse, error) { - if sequenceNumber < 0 { - panic("sequenceNumber must be greater than or equal to 0") - } - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return pb.pbClient.Create(ctx, 0, nil, - &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, &h.CacheControl, - metadata, ac.LeaseAccessConditions.pointers(), - &h.ContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, &size, &sequenceNumber, nil) -} - -// UploadPages writes 1 or more pages to the page blob. The start offset and the stream size must be a multiple of 512 bytes. -// This method panics if the stream is not at position 0. -// Note that the http client closes the body stream after the request is sent to the service. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page. -func (pb PageBlobURL) UploadPages(ctx context.Context, offset int64, body io.ReadSeeker, ac BlobAccessConditions) (*PageBlobUploadPagesResponse, error) { - count := validateSeekableStreamAt0AndGetCount(body) - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual := ac.PageBlobAccessConditions.pointers() - return pb.pbClient.UploadPages(ctx, body, count, nil, - PageRange{Start: offset, End: offset + count - 1}.pointers(), - ac.LeaseAccessConditions.pointers(), - ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// ClearPages frees the specified pages from the page blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page. -func (pb PageBlobURL) ClearPages(ctx context.Context, offset int64, count int64, ac BlobAccessConditions) (*PageBlobClearPagesResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual := ac.PageBlobAccessConditions.pointers() - return pb.pbClient.ClearPages(ctx, 0, nil, - PageRange{Start: offset, End: offset + count - 1}.pointers(), - ac.LeaseAccessConditions.pointers(), - ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, - ifSequenceNumberEqual, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// GetPageRanges returns the list of valid page ranges for a page blob or snapshot of a page blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. -func (pb PageBlobURL) GetPageRanges(ctx context.Context, offset int64, count int64, ac BlobAccessConditions) (*PageList, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return pb.pbClient.GetPageRanges(ctx, nil, nil, - httpRange{offset: offset, count: count}.pointers(), - ac.LeaseAccessConditions.pointers(), - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// GetPageRangesDiff gets the collection of page ranges that differ between a specified snapshot and this page blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. -func (pb PageBlobURL) GetPageRangesDiff(ctx context.Context, offset int64, count int64, prevSnapshot string, ac BlobAccessConditions) (*PageList, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return pb.pbClient.GetPageRangesDiff(ctx, nil, nil, &prevSnapshot, - httpRange{offset: offset, count: count}.pointers(), - ac.LeaseAccessConditions.pointers(), - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, - nil) -} - -// Resize resizes the page blob to the specified size (which must be a multiple of 512). -// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. -func (pb PageBlobURL) Resize(ctx context.Context, size int64, ac BlobAccessConditions) (*PageBlobResizeResponse, error) { - if size%PageBlobPageBytes != 0 { - panic("Size must be a multiple of PageBlobPageBytes (512)") - } - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return pb.pbClient.Resize(ctx, size, nil, ac.LeaseAccessConditions.pointers(), - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// SetSequenceNumber sets the page blob's sequence number. -func (pb PageBlobURL) UpdateSequenceNumber(ctx context.Context, action SequenceNumberActionType, sequenceNumber int64, - ac BlobAccessConditions) (*PageBlobUpdateSequenceNumberResponse, error) { - if sequenceNumber < 0 { - panic("sequenceNumber must be greater than or equal to 0") - } - sn := &sequenceNumber - if action == SequenceNumberActionIncrement { - sn = nil - } - ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch := ac.HTTPAccessConditions.pointers() - return pb.pbClient.UpdateSequenceNumber(ctx, action, nil, - ac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, - sn, nil) -} - -// StartIncrementalCopy begins an operation to start an incremental copy from one page blob's snapshot to this page blob. -// The snapshot is copied such that only the differential changes between the previously copied snapshot are transferred to the destination. -// The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/incremental-copy-blob and -// https://docs.microsoft.com/en-us/azure/virtual-machines/windows/incremental-snapshots. -func (pb PageBlobURL) StartCopyIncremental(ctx context.Context, source url.URL, snapshot string, ac BlobAccessConditions) (*PageBlobCopyIncrementalResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - qp := source.Query() - qp.Set("snapshot", snapshot) - source.RawQuery = qp.Encode() - return pb.pbClient.CopyIncremental(ctx, source.String(), nil, nil, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -func (pr PageRange) pointers() *string { - if pr.Start < 0 { - panic("PageRange's Start value must be greater than or equal to 0") - } - if pr.End <= 0 { - panic("PageRange's End value must be greater than 0") - } - if pr.Start%PageBlobPageBytes != 0 { - panic("PageRange's Start value must be a multiple of 512") - } - if pr.End%PageBlobPageBytes != (PageBlobPageBytes - 1) { - panic("PageRange's End value must be 1 less than a multiple of 512") - } - if pr.End <= pr.Start { - panic("PageRange's End value must be after the start") - } - endOffset := strconv.FormatInt(int64(pr.End), 10) - asString := fmt.Sprintf("bytes=%v-%s", pr.Start, endOffset) - return &asString -} - -// PageBlobAccessConditions identifies page blob-specific access conditions which you optionally set. -type PageBlobAccessConditions struct { - // IfSequenceNumberLessThan ensures that the page blob operation succeeds - // only if the blob's sequence number is less than a value. - // IfSequenceNumberLessThan=0 means no 'IfSequenceNumberLessThan' header specified. - // IfSequenceNumberLessThan>0 means 'IfSequenceNumberLessThan' header specified with its value - // IfSequenceNumberLessThan==-1 means 'IfSequenceNumberLessThan' header specified with a value of 0 - IfSequenceNumberLessThan int64 - - // IfSequenceNumberLessThanOrEqual ensures that the page blob operation succeeds - // only if the blob's sequence number is less than or equal to a value. - // IfSequenceNumberLessThanOrEqual=0 means no 'IfSequenceNumberLessThanOrEqual' header specified. - // IfSequenceNumberLessThanOrEqual>0 means 'IfSequenceNumberLessThanOrEqual' header specified with its value - // IfSequenceNumberLessThanOrEqual=-1 means 'IfSequenceNumberLessThanOrEqual' header specified with a value of 0 - IfSequenceNumberLessThanOrEqual int64 - - // IfSequenceNumberEqual ensures that the page blob operation succeeds - // only if the blob's sequence number is equal to a value. - // IfSequenceNumberEqual=0 means no 'IfSequenceNumberEqual' header specified. - // IfSequenceNumberEqual>0 means 'IfSequenceNumberEqual' header specified with its value - // IfSequenceNumberEqual=-1 means 'IfSequenceNumberEqual' header specified with a value of 0 - IfSequenceNumberEqual int64 -} - -// pointers is for internal infrastructure. It returns the fields as pointers. -func (ac PageBlobAccessConditions) pointers() (snltoe *int64, snlt *int64, sne *int64) { - if ac.IfSequenceNumberLessThan < -1 { - panic("Ifsequencenumberlessthan can't be less than -1") - } - if ac.IfSequenceNumberLessThanOrEqual < -1 { - panic("IfSequenceNumberLessThanOrEqual can't be less than -1") - } - if ac.IfSequenceNumberEqual < -1 { - panic("IfSequenceNumberEqual can't be less than -1") - } - - var zero int64 // Defaults to 0 - switch ac.IfSequenceNumberLessThan { - case -1: - snlt = &zero - case 0: - snlt = nil - default: - snlt = &ac.IfSequenceNumberLessThan - } - - switch ac.IfSequenceNumberLessThanOrEqual { - case -1: - snltoe = &zero - case 0: - snltoe = nil - default: - snltoe = &ac.IfSequenceNumberLessThanOrEqual - } - switch ac.IfSequenceNumberEqual { - case -1: - sne = &zero - case 0: - sne = nil - default: - sne = &ac.IfSequenceNumberEqual - } - return -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/version.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/version.go deleted file mode 100644 index 8a8926bd33cc..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/version.go +++ /dev/null @@ -1,3 +0,0 @@ -package azblob - -const serviceLibVersion = "0.1" diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_retry.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_retry.go deleted file mode 100644 index 4c885ea1aa35..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_retry.go +++ /dev/null @@ -1,318 +0,0 @@ -package azblob - -import ( - "context" - "math/rand" - "net" - "net/http" - "strconv" - "time" - - "github.com/Azure/azure-pipeline-go/pipeline" - "io/ioutil" - "io" -) - -// RetryPolicy tells the pipeline what kind of retry policy to use. See the RetryPolicy* constants. -type RetryPolicy int32 - -const ( - // RetryPolicyExponential tells the pipeline to use an exponential back-off retry policy - RetryPolicyExponential RetryPolicy = 0 - - // RetryPolicyFixed tells the pipeline to use a fixed back-off retry policy - RetryPolicyFixed RetryPolicy = 1 -) - -// RetryOptions configures the retry policy's behavior. -type RetryOptions struct { - // Policy tells the pipeline what kind of retry policy to use. See the RetryPolicy* constants.\ - // A value of zero means that you accept our default policy. - Policy RetryPolicy - - // MaxTries specifies the maximum number of attempts an operation will be tried before producing an error (0=default). - // A value of zero means that you accept our default policy. A value of 1 means 1 try and no retries. - MaxTries int32 - - // TryTimeout indicates the maximum time allowed for any single try of an HTTP request. - // A value of zero means that you accept our default timeout. NOTE: When transferring large amounts - // of data, the default TryTimeout will probably not be sufficient. You should override this value - // based on the bandwidth available to the host machine and proximity to the Storage service. A good - // starting point may be something like (60 seconds per MB of anticipated-payload-size). - TryTimeout time.Duration - - // RetryDelay specifies the amount of delay to use before retrying an operation (0=default). - // When RetryPolicy is specified as RetryPolicyExponential, the delay increases exponentially - // with each retry up to a maximum specified by MaxRetryDelay. - // If you specify 0, then you must also specify 0 for MaxRetryDelay. - // If you specify RetryDelay, then you must also specify MaxRetryDelay, and MaxRetryDelay should be - // equal to or greater than RetryDelay. - RetryDelay time.Duration - - // MaxRetryDelay specifies the maximum delay allowed before retrying an operation (0=default). - // If you specify 0, then you must also specify 0 for RetryDelay. - MaxRetryDelay time.Duration - - // RetryReadsFromSecondaryHost specifies whether the retry policy should retry a read operation against another host. - // If RetryReadsFromSecondaryHost is "" (the default) then operations are not retried against another host. - // NOTE: Before setting this field, make sure you understand the issues around reading stale & potentially-inconsistent - // data at this webpage: https://docs.microsoft.com/en-us/azure/storage/common/storage-designing-ha-apps-with-ragrs - RetryReadsFromSecondaryHost string // Comment this our for non-Blob SDKs -} - -func (o RetryOptions) retryReadsFromSecondaryHost() string { - return o.RetryReadsFromSecondaryHost // This is for the Blob SDK only - //return "" // This is for non-blob SDKs -} - -func (o RetryOptions) defaults() RetryOptions { - if o.Policy != RetryPolicyExponential && o.Policy != RetryPolicyFixed { - panic("RetryPolicy must be RetryPolicyExponential or RetryPolicyFixed") - } - if o.MaxTries < 0 { - panic("MaxTries must be >= 0") - } - if o.TryTimeout < 0 || o.RetryDelay < 0 || o.MaxRetryDelay < 0 { - panic("TryTimeout, RetryDelay, and MaxRetryDelay must all be >= 0") - } - if o.RetryDelay > o.MaxRetryDelay { - panic("RetryDelay must be <= MaxRetryDelay") - } - if (o.RetryDelay == 0 && o.MaxRetryDelay != 0) || (o.RetryDelay != 0 && o.MaxRetryDelay == 0) { - panic("Both RetryDelay and MaxRetryDelay must be 0 or neither can be 0") - } - - IfDefault := func(current *time.Duration, desired time.Duration) { - if *current == time.Duration(0) { - *current = desired - } - } - - // Set defaults if unspecified - if o.MaxTries == 0 { - o.MaxTries = 4 - } - switch o.Policy { - case RetryPolicyExponential: - IfDefault(&o.TryTimeout, 1*time.Minute) - IfDefault(&o.RetryDelay, 4*time.Second) - IfDefault(&o.MaxRetryDelay, 120*time.Second) - - case RetryPolicyFixed: - IfDefault(&o.TryTimeout, 1*time.Minute) - IfDefault(&o.RetryDelay, 30*time.Second) - IfDefault(&o.MaxRetryDelay, 120*time.Second) - } - return o -} - -func (o RetryOptions) calcDelay(try int32) time.Duration { // try is >=1; never 0 - pow := func(number int64, exponent int32) int64 { // pow is nested helper function - var result int64 = 1 - for n := int32(0); n < exponent; n++ { - result *= number - } - return result - } - - delay := time.Duration(0) - switch o.Policy { - case RetryPolicyExponential: - delay = time.Duration(pow(2, try-1)-1) * o.RetryDelay - - case RetryPolicyFixed: - if try > 1 { // Any try after the 1st uses the fixed delay - delay = o.RetryDelay - } - } - - // Introduce some jitter: [0.0, 1.0) / 2 = [0.0, 0.5) + 0.8 = [0.8, 1.3) - delay = time.Duration(delay.Seconds() * (rand.Float64()/2 + 0.8) * float64(time.Second)) // NOTE: We want math/rand; not crypto/rand - if delay > o.MaxRetryDelay { - delay = o.MaxRetryDelay - } - return delay -} - -// NewRetryPolicyFactory creates a RetryPolicyFactory object configured using the specified options. -func NewRetryPolicyFactory(o RetryOptions) pipeline.Factory { - o = o.defaults() // Force defaults to be calculated - return pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc { - return func(ctx context.Context, request pipeline.Request) (response pipeline.Response, err error) { - // Before each try, we'll select either the primary or secondary URL. - primaryTry := int32(0) // This indicates how many tries we've attempted against the primary DC - - // We only consider retrying against a secondary if we have a read request (GET/HEAD) AND this policy has a Secondary URL it can use - considerSecondary := (request.Method == http.MethodGet || request.Method == http.MethodHead) && o.retryReadsFromSecondaryHost() != "" - - // Exponential retry algorithm: ((2 ^ attempt) - 1) * delay * random(0.8, 1.2) - // When to retry: connection failure or temporary/timeout. NOTE: StorageError considers HTTP 500/503 as temporary & is therefore retryable - // If using a secondary: - // Even tries go against primary; odd tries go against the secondary - // For a primary wait ((2 ^ primaryTries - 1) * delay * random(0.8, 1.2) - // If secondary gets a 404, don't fail, retry but future retries are only against the primary - // When retrying against a secondary, ignore the retry count and wait (.1 second * random(0.8, 1.2)) - for try := int32(1); try <= o.MaxTries; try++ { - logf("\n=====> Try=%d\n", try) - - // Determine which endpoint to try. It's primary if there is no secondary or if it is an add # attempt. - tryingPrimary := !considerSecondary || (try%2 == 1) - // Select the correct host and delay - if tryingPrimary { - primaryTry++ - delay := o.calcDelay(primaryTry) - logf("Primary try=%d, Delay=%v\n", primaryTry, delay) - time.Sleep(delay) // The 1st try returns 0 delay - } else { - delay := time.Second * time.Duration(rand.Float32()/2+0.8) - logf("Secondary try=%d, Delay=%v\n", try-primaryTry, delay) - time.Sleep(delay) // Delay with some jitter before trying secondary - } - - // Clone the original request to ensure that each try starts with the original (unmutated) request. - requestCopy := request.Copy() - - // For each try, seek to the beginning of the Body stream. We do this even for the 1st try because - // the stream may not be at offset 0 when we first get it and we want the same behavior for the - // 1st try as for additional tries. - if err = requestCopy.RewindBody(); err != nil { - panic(err) - } - if !tryingPrimary { - requestCopy.Request.URL.Host = o.retryReadsFromSecondaryHost() - } - - // Set the server-side timeout query parameter "timeout=[seconds]" - timeout := int32(o.TryTimeout.Seconds()) // Max seconds per try - if deadline, ok := ctx.Deadline(); ok { // If user's ctx has a deadline, make the timeout the smaller of the two - t := int32(deadline.Sub(time.Now()).Seconds()) // Duration from now until user's ctx reaches its deadline - logf("MaxTryTimeout=%d secs, TimeTilDeadline=%d sec\n", timeout, t) - if t < timeout { - timeout = t - } - if timeout < 0 { - timeout = 0 // If timeout ever goes negative, set it to zero; this happen while debugging - } - logf("TryTimeout adjusted to=%d sec\n", timeout) - } - q := requestCopy.Request.URL.Query() - q.Set("timeout", strconv.Itoa(int(timeout+1))) // Add 1 to "round up" - requestCopy.Request.URL.RawQuery = q.Encode() - logf("Url=%s\n", requestCopy.Request.URL.String()) - - // Set the time for this particular retry operation and then Do the operation. - tryCtx, tryCancel := context.WithTimeout(ctx, time.Second*time.Duration(timeout)) - //requestCopy.Body = &deadlineExceededReadCloser{r: requestCopy.Request.Body} - response, err = next.Do(tryCtx, requestCopy) // Make the request - /*err = improveDeadlineExceeded(err) - if err == nil { - response.Response().Body = &deadlineExceededReadCloser{r: response.Response().Body} - }*/ - logf("Err=%v, response=%v\n", err, response) - - action := "" // This MUST get changed within the switch code below - switch { - case ctx.Err() != nil: - action = "NoRetry: Op timeout" - case !tryingPrimary && response != nil && response.Response().StatusCode == http.StatusNotFound: - // If attempt was against the secondary & it returned a StatusNotFound (404), then - // the resource was not found. This may be due to replication delay. So, in this - // case, we'll never try the secondary again for this operation. - considerSecondary = false - action = "Retry: Secondary URL returned 404" - case err != nil: - // NOTE: Protocol Responder returns non-nil if REST API returns invalid status code for the invoked operation - if netErr, ok := err.(net.Error); ok && (netErr.Temporary() || netErr.Timeout()) { - action = "Retry: net.Error and Temporary() or Timeout()" - } else { - action = "NoRetry: unrecognized error" - } - default: - action = "NoRetry: successful HTTP request" // no error - } - - logf("Action=%s\n", action) - // fmt.Println(action + "\n") // This is where we could log the retry operation; action is why we're retrying - if action[0] != 'R' { // Retry only if action starts with 'R' - if err != nil { - tryCancel() // If we're returning an error, cancel this current/last per-retry timeout context - } else { - // TODO: Right now, we've decided to leak the per-try Context until the user's Context is canceled. - // Another option is that we wrap the last per-try context in a body and overwrite the Response's Body field with our wrapper. - // So, when the user closes the Body, the our per-try context gets closed too. - // Another option, is that the Last Policy do this wrapping for a per-retry context (not for the user's context) - _ = tryCancel // So, for now, we don't call cancel: cancel() - } - break // Don't retry - } - if response != nil && response.Response() != nil && response.Response().Body != nil { - // If we're going to retry and we got a previous response, then flush its body to avoid leaking its TCP connection - body := response.Response().Body - io.Copy(ioutil.Discard, body) - body.Close() - } - // If retrying, cancel the current per-try timeout context - tryCancel() - } - return response, err // Not retryable or too many retries; return the last response/error - } - }) -} - -// According to https://github.com/golang/go/wiki/CompilerOptimizations, the compiler will inline this method and hopefully optimize all calls to it away -var logf = func(format string, a ...interface{}) {} - -// Use this version to see the retry method's code path (import "fmt") -//var logf = fmt.Printf - -/* -type deadlineExceededReadCloser struct { - r io.ReadCloser -} - -func (r *deadlineExceededReadCloser) Read(p []byte) (int, error) { - n, err := 0, io.EOF - if r.r != nil { - n, err = r.r.Read(p) - } - return n, improveDeadlineExceeded(err) -} -func (r *deadlineExceededReadCloser) Seek(offset int64, whence int) (int64, error) { - // For an HTTP request, the ReadCloser MUST also implement seek - // For an HTTP response, Seek MUST not be called (or this will panic) - o, err := r.r.(io.Seeker).Seek(offset, whence) - return o, improveDeadlineExceeded(err) -} -func (r *deadlineExceededReadCloser) Close() error { - if c, ok := r.r.(io.Closer); ok { - c.Close() - } - return nil -} - -// timeoutError is the internal struct that implements our richer timeout error. -type deadlineExceeded struct { - responseError -} - -var _ net.Error = (*deadlineExceeded)(nil) // Ensure deadlineExceeded implements the net.Error interface at compile time - -// improveDeadlineExceeded creates a timeoutError object that implements the error interface IF cause is a context.DeadlineExceeded error. -func improveDeadlineExceeded(cause error) error { - // If cause is not DeadlineExceeded, return the same error passed in. - if cause != context.DeadlineExceeded { - return cause - } - // Else, convert DeadlineExceeded to our timeoutError which gives a richer string message - return &deadlineExceeded{ - responseError: responseError{ - ErrorNode: pipeline.ErrorNode{}.Initialize(cause, 3), - }, - } -} - -// Error implements the error interface's Error method to return a string representation of the error. -func (e *deadlineExceeded) Error() string { - return e.ErrorNode.Error("context deadline exceeded; when creating a pipeline, consider increasing RetryOptions' TryTimeout field") -} -*/ diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_retry_reader.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_retry_reader.go deleted file mode 100644 index 42724efa52c3..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_retry_reader.go +++ /dev/null @@ -1,122 +0,0 @@ -package azblob - -import ( - "context" - "io" - "net" - "net/http" -) - -const CountToEnd = 0 - -// HTTPGetter is a function type that refers to a method that performs an HTTP GET operation. -type HTTPGetter func(ctx context.Context, i HTTPGetterInfo) (*http.Response, error) - -// HTTPGetterInfo is passed to an HTTPGetter function passing it parameters -// that should be used to make an HTTP GET request. -type HTTPGetterInfo struct { - // Offset specifies the start offset that should be used when - // creating the HTTP GET request's Range header - Offset int64 - - // Count specifies the count of bytes that should be used to calculate - // the end offset when creating the HTTP GET request's Range header - Count int64 - - // ETag specifies the resource's etag that should be used when creating - // the HTTP GET request's If-Match header - ETag ETag -} - -// RetryReaderOptions contains properties which can help to decide when to do retry. -type RetryReaderOptions struct { - // MaxRetryRequests specifies the maximum number of HTTP GET requests that will be made - // while reading from a RetryReader. A value of zero means that no additional HTTP - // GET requests will be made. - MaxRetryRequests int - doInjectError bool - doInjectErrorRound int -} - -// retryReader implements io.ReaderCloser methods. -// retryReader tries to read from response, and if there is retriable network error -// returned during reading, it will retry according to retry reader option through executing -// user defined action with provided data to get a new response, and continue the overall reading process -// through reading from the new response. -type retryReader struct { - ctx context.Context - response *http.Response - info HTTPGetterInfo - countWasBounded bool - o RetryReaderOptions - getter HTTPGetter -} - -// NewRetryReader creates a retry reader. -func NewRetryReader(ctx context.Context, initialResponse *http.Response, - info HTTPGetterInfo, o RetryReaderOptions, getter HTTPGetter) io.ReadCloser { - if getter == nil { - panic("getter must not be nil") - } - if info.Count < 0 { - panic("info.Count must be >= 0") - } - if o.MaxRetryRequests < 0 { - panic("o.MaxRetryRequests must be >= 0") - } - return &retryReader{ctx: ctx, getter: getter, info: info, countWasBounded: info.Count != CountToEnd, response: initialResponse, o: o} -} - -func (s *retryReader) Read(p []byte) (n int, err error) { - for try := 0; ; try++ { - //fmt.Println(try) // Comment out for debugging. - if s.countWasBounded && s.info.Count == CountToEnd { - // User specified an original count and the remaining bytes are 0, return 0, EOF - return 0, io.EOF - } - - if s.response == nil { // We don't have a response stream to read from, try to get one. - response, err := s.getter(s.ctx, s.info) - if err != nil { - return 0, err - } - // Successful GET; this is the network stream we'll read from. - s.response = response - } - n, err := s.response.Body.Read(p) // Read from the stream - - // Injection mechanism for testing. - if s.o.doInjectError && try == s.o.doInjectErrorRound { - err = &net.DNSError{IsTemporary: true} - } - - // We successfully read data or end EOF. - if err == nil || err == io.EOF { - s.info.Offset += int64(n) // Increments the start offset in case we need to make a new HTTP request in the future - if s.info.Count != CountToEnd { - s.info.Count -= int64(n) // Decrement the count in case we need to make a new HTTP request in the future - } - return n, err // Return the return to the caller - } - s.Close() // Error, close stream - s.response = nil // Our stream is no longer good - - // Check the retry count and error code, and decide whether to retry. - if try >= s.o.MaxRetryRequests { - return n, err // All retries exhausted - } - - if netErr, ok := err.(net.Error); ok && (netErr.Timeout() || netErr.Temporary()) { - continue - // Loop around and try to get and read from new stream. - } - return n, err // Not retryable, just return - } -} - -func (s *retryReader) Close() error { - if s.response != nil && s.response.Body != nil { - return s.response.Body.Close() - } - return nil -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_query_params.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_query_params.go deleted file mode 100644 index db10171e7535..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_query_params.go +++ /dev/null @@ -1,211 +0,0 @@ -package azblob - -import ( - "net" - "net/url" - "strings" - "time" -) - -// SASVersion indicates the SAS version. -const SASVersion = ServiceVersion - -type SASProtocol string - -const ( - // SASProtocolHTTPS can be specified for a SAS protocol - SASProtocolHTTPS SASProtocol = "https" - - // SASProtocolHTTPSandHTTP can be specified for a SAS protocol - SASProtocolHTTPSandHTTP SASProtocol = "https,http" -) - -// FormatTimesForSASSigning converts a time.Time to a snapshotTimeFormat string suitable for a -// SASField's StartTime or ExpiryTime fields. Returns "" if value.IsZero(). -func FormatTimesForSASSigning(startTime, expiryTime time.Time) (string, string) { - ss := "" - if !startTime.IsZero() { - ss = startTime.Format(SASTimeFormat) // "yyyy-MM-ddTHH:mm:ssZ" - } - se := "" - if !expiryTime.IsZero() { - se = expiryTime.Format(SASTimeFormat) // "yyyy-MM-ddTHH:mm:ssZ" - } - return ss, se -} - -// SASTimeFormat represents the format of a SAS start or expiry time. Use it when formatting/parsing a time.Time. -const SASTimeFormat = "2006-01-02T15:04:05Z" //"2017-07-27T00:00:00Z" // ISO 8601 - -// https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas - -// A SASQueryParameters object represents the components that make up an Azure Storage SAS' query parameters. -// You parse a map of query parameters into its fields by calling NewSASQueryParameters(). You add the components -// to a query parameter map by calling AddToValues(). -// NOTE: Changing any field requires computing a new SAS signature using a XxxSASSignatureValues type. -// -// This type defines the components used by all Azure Storage resources (Containers, Blobs, Files, & Queues). -type SASQueryParameters struct { - // All members are immutable or values so copies of this struct are goroutine-safe. - version string `param:"sv"` - services string `param:"ss"` - resourceTypes string `param:"srt"` - protocol SASProtocol `param:"spr"` - startTime time.Time `param:"st"` - expiryTime time.Time `param:"se"` - ipRange IPRange `param:"sip"` - identifier string `param:"si"` - resource string `param:"sr"` - permissions string `param:"sp"` - signature string `param:"sig"` -} - -func (p *SASQueryParameters) Version() string { - return p.version -} - -func (p *SASQueryParameters) Services() string { - return p.services -} -func (p *SASQueryParameters) ResourceTypes() string { - return p.resourceTypes -} -func (p *SASQueryParameters) Protocol() SASProtocol { - return p.protocol -} -func (p *SASQueryParameters) StartTime() time.Time { - return p.startTime -} -func (p *SASQueryParameters) ExpiryTime() time.Time { - return p.expiryTime -} - -func (p *SASQueryParameters) IPRange() IPRange { - return p.ipRange -} - -func (p *SASQueryParameters) Identifier() string { - return p.identifier -} - -func (p *SASQueryParameters) Resource() string { - return p.resource -} -func (p *SASQueryParameters) Permissions() string { - return p.permissions -} - -func (p *SASQueryParameters) Signature() string { - return p.signature -} - -// IPRange represents a SAS IP range's start IP and (optionally) end IP. -type IPRange struct { - Start net.IP // Not specified if length = 0 - End net.IP // Not specified if length = 0 -} - -// String returns a string representation of an IPRange. -func (ipr *IPRange) String() string { - if len(ipr.Start) == 0 { - return "" - } - start := ipr.Start.String() - if len(ipr.End) == 0 { - return start - } - return start + "-" + ipr.End.String() -} - -// NewSASQueryParameters creates and initializes a SASQueryParameters object based on the -// query parameter map's passed-in values. If deleteSASParametersFromValues is true, -// all SAS-related query parameters are removed from the passed-in map. If -// deleteSASParametersFromValues is false, the map passed-in map is unaltered. -func newSASQueryParameters(values url.Values, deleteSASParametersFromValues bool) SASQueryParameters { - p := SASQueryParameters{} - for k, v := range values { - val := v[0] - isSASKey := true - switch strings.ToLower(k) { - case "sv": - p.version = val - case "ss": - p.services = val - case "srt": - p.resourceTypes = val - case "spr": - p.protocol = SASProtocol(val) - case "st": - p.startTime, _ = time.Parse(SASTimeFormat, val) - case "se": - p.expiryTime, _ = time.Parse(SASTimeFormat, val) - case "sip": - dashIndex := strings.Index(val, "-") - if dashIndex == -1 { - p.ipRange.Start = net.ParseIP(val) - } else { - p.ipRange.Start = net.ParseIP(val[:dashIndex]) - p.ipRange.End = net.ParseIP(val[dashIndex+1:]) - } - case "si": - p.identifier = val - case "sr": - p.resource = val - case "sp": - p.permissions = val - case "sig": - p.signature = val - default: - isSASKey = false // We didn't recognize the query parameter - } - if isSASKey && deleteSASParametersFromValues { - delete(values, k) - } - } - return p -} - -// AddToValues adds the SAS components to the specified query parameters map. -func (p *SASQueryParameters) addToValues(v url.Values) url.Values { - if p.version != "" { - v.Add("sv", p.version) - } - if p.services != "" { - v.Add("ss", p.services) - } - if p.resourceTypes != "" { - v.Add("srt", p.resourceTypes) - } - if p.protocol != "" { - v.Add("spr", string(p.protocol)) - } - if !p.startTime.IsZero() { - v.Add("st", p.startTime.Format(SASTimeFormat)) - } - if !p.expiryTime.IsZero() { - v.Add("se", p.expiryTime.Format(SASTimeFormat)) - } - if len(p.ipRange.Start) > 0 { - v.Add("sip", p.ipRange.String()) - } - if p.identifier != "" { - v.Add("si", p.identifier) - } - if p.resource != "" { - v.Add("sr", p.resource) - } - if p.permissions != "" { - v.Add("sp", p.permissions) - } - if p.signature != "" { - v.Add("sig", p.signature) - } - return v -} - -// Encode encodes the SAS query parameters into URL encoded form sorted by key. -func (p *SASQueryParameters) Encode() string { - v := url.Values{} - p.addToValues(v) - return v.Encode() -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_util_validate.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_util_validate.go deleted file mode 100644 index 001a21c69651..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_util_validate.go +++ /dev/null @@ -1,61 +0,0 @@ -package azblob - -import ( - "errors" - "fmt" - "io" - "strconv" -) - -// httpRange defines a range of bytes within an HTTP resource, starting at offset and -// ending at offset+count. A zero-value httpRange indicates the entire resource. An httpRange -// which has an offset but na zero value count indicates from the offset to the resource's end. -type httpRange struct { - offset int64 - count int64 -} - -func (r httpRange) pointers() *string { - if r.offset == 0 && r.count == 0 { // Do common case first for performance - return nil // No specified range - } - if r.offset < 0 { - panic("The range offset must be >= 0") - } - if r.count < 0 { - panic("The range count must be >= 0") - } - endOffset := "" // if count == 0 - if r.count > 0 { - endOffset = strconv.FormatInt((r.offset+r.count)-1, 10) - } - dataRange := fmt.Sprintf("bytes=%v-%s", r.offset, endOffset) - return &dataRange -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -func validateSeekableStreamAt0AndGetCount(body io.ReadSeeker) int64 { - if body == nil { // nil body's are "logically" seekable to 0 and are 0 bytes long - return 0 - } - validateSeekableStreamAt0(body) - count, err := body.Seek(0, io.SeekEnd) - if err != nil { - panic("failed to seek stream") - } - body.Seek(0, io.SeekStart) - return count -} - -func validateSeekableStreamAt0(body io.ReadSeeker) { - if body == nil { // nil body's are "logically" seekable to 0 - return - } - if pos, err := body.Seek(0, io.SeekCurrent); pos != 0 || err != nil { - if err != nil { - panic(err) - } - panic(errors.New("stream must be set to position 0")) - } -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_append_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_append_blob.go deleted file mode 100644 index 8f3dc9934973..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_append_blob.go +++ /dev/null @@ -1,234 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "context" - "encoding/base64" - "github.com/Azure/azure-pipeline-go/pipeline" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "time" -) - -// appendBlobClient is the client for the AppendBlob methods of the Azblob service. -type appendBlobClient struct { - managementClient -} - -// newAppendBlobClient creates an instance of the appendBlobClient client. -func newAppendBlobClient(url url.URL, p pipeline.Pipeline) appendBlobClient { - return appendBlobClient{newManagementClient(url, p)} -} - -// AppendBlock the Append Block operation commits a new block of data to the end of an existing append blob. The Append -// Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is -// supported only on version 2015-02-21 version or later. -// -// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an -// error.contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. maxSize is optional conditional header. The max length in bytes permitted for -// the append blob. If the Append Block operation would cause the blob to exceed that limit or if the blob size is -// already greater than the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error -// (HTTP status code 412 - Precondition Failed). appendPosition is optional conditional header, used only for the -// Append Block operation. A number indicating the byte offset to compare. Append Block will succeed only if the append -// position is equal to this number. If it is not, the request will fail with the AppendPositionConditionNotMet error -// (HTTP status code 412 - Precondition Failed). ifModifiedSince is specify this header value to operate only on a blob -// if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate -// only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to -// operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a -// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded -// in the analytics logs when storage analytics logging is enabled. -func (client appendBlobClient) AppendBlock(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*AppendBlobAppendBlockResponse, error) { - if err := validate([]validation{ - {targetValue: body, - constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.appendBlockPreparer(body, contentLength, timeout, leaseID, maxSize, appendPosition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.appendBlockResponder}, req) - if err != nil { - return nil, err - } - return resp.(*AppendBlobAppendBlockResponse), err -} - -// appendBlockPreparer prepares the AppendBlock request. -func (client appendBlobClient) appendBlockPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, body) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "appendblock") - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if maxSize != nil { - req.Header.Set("x-ms-blob-condition-maxsize", strconv.FormatInt(*maxSize, 10)) - } - if appendPosition != nil { - req.Header.Set("x-ms-blob-condition-appendpos", strconv.FormatInt(*appendPosition, 10)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// appendBlockResponder handles the response to the AppendBlock request. -func (client appendBlobClient) appendBlockResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &AppendBlobAppendBlockResponse{rawResponse: resp.Response()}, err -} - -// Create the Create Append Blob operation creates a new append blob. -// -// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. blobContentType is optional. Sets the blob's content type. If specified, -// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the -// blob's content encoding. If specified, this property is stored with the blob and returned with a read request. -// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the -// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this -// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded. -// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and -// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the -// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the -// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified -// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, -// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and -// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is -// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. -// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified -// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. -// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client appendBlobClient) Create(ctx context.Context, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*AppendBlobCreateResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.createPreparer(contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req) - if err != nil { - return nil, err - } - return resp.(*AppendBlobCreateResponse), err -} - -// createPreparer prepares the Create request. -func (client appendBlobClient) createPreparer(contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if blobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobContentType) - } - if blobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobContentEncoding) - } - if blobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobContentLanguage) - } - if blobContentMD5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(blobContentMD5)) - } - if blobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobCacheControl) - } - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if blobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobContentDisposition) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-blob-type", "AppendBlob") - return req, nil -} - -// createResponder handles the response to the Create request. -func (client appendBlobClient) createResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &AppendBlobCreateResponse{rawResponse: resp.Response()}, err -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_page_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_page_blob.go deleted file mode 100644 index ce6507080e79..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_page_blob.go +++ /dev/null @@ -1,794 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "context" - "encoding/base64" - "encoding/xml" - "github.com/Azure/azure-pipeline-go/pipeline" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "time" -) - -// pageBlobClient is the client for the PageBlob methods of the Azblob service. -type pageBlobClient struct { - managementClient -} - -// newPageBlobClient creates an instance of the pageBlobClient client. -func newPageBlobClient(url url.URL, p pipeline.Pipeline) pageBlobClient { - return pageBlobClient{newManagementClient(url, p)} -} - -// ClearPages the Clear Pages operation clears a set of pages from a page blob -// -// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified -// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// ifSequenceNumberLessThanOrEqualTo is specify this header value to operate only on a blob if it has a sequence number -// less than or equal to the specified. ifSequenceNumberLessThan is specify this header value to operate only on a blob -// if it has a sequence number less than the specified. ifSequenceNumberEqualTo is specify this header value to operate -// only on a blob if it has the specified sequence number. ifModifiedSince is specify this header value to operate only -// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is -// recorded in the analytics logs when storage analytics logging is enabled. -func (client pageBlobClient) ClearPages(ctx context.Context, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobClearPagesResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.clearPagesPreparer(contentLength, timeout, rangeParameter, leaseID, ifSequenceNumberLessThanOrEqualTo, ifSequenceNumberLessThan, ifSequenceNumberEqualTo, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.clearPagesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobClearPagesResponse), err -} - -// clearPagesPreparer prepares the ClearPages request. -func (client pageBlobClient) clearPagesPreparer(contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "page") - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if rangeParameter != nil { - req.Header.Set("x-ms-range", *rangeParameter) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifSequenceNumberLessThanOrEqualTo != nil { - req.Header.Set("x-ms-if-sequence-number-le", strconv.FormatInt(*ifSequenceNumberLessThanOrEqualTo, 10)) - } - if ifSequenceNumberLessThan != nil { - req.Header.Set("x-ms-if-sequence-number-lt", strconv.FormatInt(*ifSequenceNumberLessThan, 10)) - } - if ifSequenceNumberEqualTo != nil { - req.Header.Set("x-ms-if-sequence-number-eq", strconv.FormatInt(*ifSequenceNumberEqualTo, 10)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-page-write", "clear") - return req, nil -} - -// clearPagesResponder handles the response to the ClearPages request. -func (client pageBlobClient) clearPagesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobClearPagesResponse{rawResponse: resp.Response()}, err -} - -// CopyIncremental the Copy Incremental operation copies a snapshot of the source page blob to a destination page blob. -// The snapshot is copied such that only the differential changes between the previously copied snapshot are -// transferred to the destination. The copied snapshots are complete copies of the original snapshot and can be read or -// copied from as usual. This API is supported since REST version 2016-05-31. -// -// copySource is specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that -// specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob -// must either be public or must be authenticated via a shared access signature. timeout is the timeout parameter is -// expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. metadata is optional. Specifies a user-defined name-value pair associated -// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or -// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with -// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version -// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing -// Containers, Blobs, and Metadata for more information. ifModifiedSince is specify this header value to operate only -// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is -// recorded in the analytics logs when storage analytics logging is enabled. -func (client pageBlobClient) CopyIncremental(ctx context.Context, copySource string, timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobCopyIncrementalResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.copyIncrementalPreparer(copySource, timeout, metadata, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.copyIncrementalResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobCopyIncrementalResponse), err -} - -// copyIncrementalPreparer prepares the CopyIncremental request. -func (client pageBlobClient) copyIncrementalPreparer(copySource string, timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "incrementalcopy") - req.URL.RawQuery = params.Encode() - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-copy-source", copySource) - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// copyIncrementalResponder handles the response to the CopyIncremental request. -func (client pageBlobClient) copyIncrementalResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusAccepted) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobCopyIncrementalResponse{rawResponse: resp.Response()}, err -} - -// Create the Create operation creates a new page blob. -// -// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. blobContentType is optional. Sets the blob's content type. If specified, -// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the -// blob's content encoding. If specified, this property is stored with the blob and returned with a read request. -// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the -// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this -// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded. -// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and -// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the -// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the -// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified -// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, -// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and -// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is -// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. -// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified -// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. -// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. blobContentLength is this -// header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned to a 512-byte -// boundary. blobSequenceNumber is set for page blobs only. The sequence number is a user-controlled value that you can -// use to track requests. The value of the sequence number must be between 0 and 2^63 - 1. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client pageBlobClient) Create(ctx context.Context, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentLength *int64, blobSequenceNumber *int64, requestID *string) (*PageBlobCreateResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.createPreparer(contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, blobContentLength, blobSequenceNumber, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobCreateResponse), err -} - -// createPreparer prepares the Create request. -func (client pageBlobClient) createPreparer(contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentLength *int64, blobSequenceNumber *int64, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if blobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobContentType) - } - if blobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobContentEncoding) - } - if blobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobContentLanguage) - } - if blobContentMD5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(blobContentMD5)) - } - if blobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobCacheControl) - } - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if blobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobContentDisposition) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - if blobContentLength != nil { - req.Header.Set("x-ms-blob-content-length", strconv.FormatInt(*blobContentLength, 10)) - } - if blobSequenceNumber != nil { - req.Header.Set("x-ms-blob-sequence-number", strconv.FormatInt(*blobSequenceNumber, 10)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-blob-type", "PageBlob") - return req, nil -} - -// createResponder handles the response to the Create request. -func (client pageBlobClient) createResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobCreateResponse{rawResponse: resp.Response()}, err -} - -// GetPageRanges the Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a -// page blob -// -// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to -// retrieve. For more information on working with blob snapshots, see Creating -// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified -// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified -// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. -// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client pageBlobClient) GetPageRanges(ctx context.Context, snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageList, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getPageRangesPreparer(snapshot, timeout, rangeParameter, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPageRangesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageList), err -} - -// getPageRangesPreparer prepares the GetPageRanges request. -func (client pageBlobClient) getPageRangesPreparer(snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if snapshot != nil && len(*snapshot) > 0 { - params.Set("snapshot", *snapshot) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "pagelist") - req.URL.RawQuery = params.Encode() - if rangeParameter != nil { - req.Header.Set("x-ms-range", *rangeParameter) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getPageRangesResponder handles the response to the GetPageRanges request. -func (client pageBlobClient) getPageRangesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &PageList{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// GetPageRangesDiff [Update] The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob -// that were changed between target blob and previous snapshot. -// -// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to -// retrieve. For more information on working with blob snapshots, see Creating -// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. prevsnapshot is optional in version 2015-07-08 and newer. The prevsnapshot -// parameter is a DateTime value that specifies that the response will contain only pages that were changed between -// target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a -// snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots -// are currently supported only for blobs created on or after January 1, 2016. rangeParameter is return only the bytes -// of the blob in the specified range. leaseID is if specified, the operation only succeeds if the container's lease is -// active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it has been -// modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if -// it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only on blobs -// with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. -// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics -// logs when storage analytics logging is enabled. -func (client pageBlobClient) GetPageRangesDiff(ctx context.Context, snapshot *string, timeout *int32, prevsnapshot *string, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageList, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getPageRangesDiffPreparer(snapshot, timeout, prevsnapshot, rangeParameter, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPageRangesDiffResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageList), err -} - -// getPageRangesDiffPreparer prepares the GetPageRangesDiff request. -func (client pageBlobClient) getPageRangesDiffPreparer(snapshot *string, timeout *int32, prevsnapshot *string, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if snapshot != nil && len(*snapshot) > 0 { - params.Set("snapshot", *snapshot) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - if prevsnapshot != nil && len(*prevsnapshot) > 0 { - params.Set("prevsnapshot", *prevsnapshot) - } - params.Set("comp", "pagelist") - req.URL.RawQuery = params.Encode() - if rangeParameter != nil { - req.Header.Set("x-ms-range", *rangeParameter) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getPageRangesDiffResponder handles the response to the GetPageRangesDiff request. -func (client pageBlobClient) getPageRangesDiffResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &PageList{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// Resize resize the Blob -// -// blobContentLength is this header specifies the maximum size for the page blob, up to 1 TB. The page blob size must -// be aligned to a 512-byte boundary. timeout is the timeout parameter is expressed in seconds. For more information, -// see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it -// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the -// analytics logs when storage analytics logging is enabled. -func (client pageBlobClient) Resize(ctx context.Context, blobContentLength int64, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobResizeResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.resizePreparer(blobContentLength, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.resizeResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobResizeResponse), err -} - -// resizePreparer prepares the Resize request. -func (client pageBlobClient) resizePreparer(blobContentLength int64, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "properties") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-blob-content-length", strconv.FormatInt(blobContentLength, 10)) - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// resizeResponder handles the response to the Resize request. -func (client pageBlobClient) resizeResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobResizeResponse{rawResponse: resp.Response()}, err -} - -// UpdateSequenceNumber update the sequence number of the blob -// -// sequenceNumberAction is required if the x-ms-blob-sequence-number header is set for the request. This property -// applies to page blobs only. This property indicates how the service should modify the blob's sequence number timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it -// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. blobSequenceNumber is set for page blobs only. The sequence number is a user-controlled value that you can -// use to track requests. The value of the sequence number must be between 0 and 2^63 - 1. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client pageBlobClient) UpdateSequenceNumber(ctx context.Context, sequenceNumberAction SequenceNumberActionType, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (*PageBlobUpdateSequenceNumberResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.updateSequenceNumberPreparer(sequenceNumberAction, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, blobSequenceNumber, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.updateSequenceNumberResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobUpdateSequenceNumberResponse), err -} - -// updateSequenceNumberPreparer prepares the UpdateSequenceNumber request. -func (client pageBlobClient) updateSequenceNumberPreparer(sequenceNumberAction SequenceNumberActionType, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "properties") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-sequence-number-action", string(sequenceNumberAction)) - if blobSequenceNumber != nil { - req.Header.Set("x-ms-blob-sequence-number", strconv.FormatInt(*blobSequenceNumber, 10)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// updateSequenceNumberResponder handles the response to the UpdateSequenceNumber request. -func (client pageBlobClient) updateSequenceNumberResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobUpdateSequenceNumberResponse{rawResponse: resp.Response()}, err -} - -// UploadPages the Upload Pages operation writes a range of pages to a page blob -// -// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an -// error.contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified -// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// ifSequenceNumberLessThanOrEqualTo is specify this header value to operate only on a blob if it has a sequence number -// less than or equal to the specified. ifSequenceNumberLessThan is specify this header value to operate only on a blob -// if it has a sequence number less than the specified. ifSequenceNumberEqualTo is specify this header value to operate -// only on a blob if it has the specified sequence number. ifModifiedSince is specify this header value to operate only -// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is -// recorded in the analytics logs when storage analytics logging is enabled. -func (client pageBlobClient) UploadPages(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobUploadPagesResponse, error) { - if err := validate([]validation{ - {targetValue: body, - constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.uploadPagesPreparer(body, contentLength, timeout, rangeParameter, leaseID, ifSequenceNumberLessThanOrEqualTo, ifSequenceNumberLessThan, ifSequenceNumberEqualTo, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.uploadPagesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobUploadPagesResponse), err -} - -// uploadPagesPreparer prepares the UploadPages request. -func (client pageBlobClient) uploadPagesPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, body) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "page") - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if rangeParameter != nil { - req.Header.Set("x-ms-range", *rangeParameter) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifSequenceNumberLessThanOrEqualTo != nil { - req.Header.Set("x-ms-if-sequence-number-le", strconv.FormatInt(*ifSequenceNumberLessThanOrEqualTo, 10)) - } - if ifSequenceNumberLessThan != nil { - req.Header.Set("x-ms-if-sequence-number-lt", strconv.FormatInt(*ifSequenceNumberLessThan, 10)) - } - if ifSequenceNumberEqualTo != nil { - req.Header.Set("x-ms-if-sequence-number-eq", strconv.FormatInt(*ifSequenceNumberEqualTo, 10)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-page-write", "update") - return req, nil -} - -// uploadPagesResponder handles the response to the UploadPages request. -func (client pageBlobClient) uploadPagesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobUploadPagesResponse{rawResponse: resp.Response()}, err -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/access_conditions.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/access_conditions.go similarity index 83% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/access_conditions.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/access_conditions.go index c7432e41c323..25fe68422157 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/access_conditions.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/access_conditions.go @@ -4,8 +4,8 @@ import ( "time" ) -// HTTPAccessConditions identifies standard HTTP access conditions which you optionally set. -type HTTPAccessConditions struct { +// ModifiedAccessConditions identifies standard HTTP access conditions which you optionally set. +type ModifiedAccessConditions struct { IfModifiedSince time.Time IfUnmodifiedSince time.Time IfMatch ETag @@ -13,7 +13,7 @@ type HTTPAccessConditions struct { } // pointers is for internal infrastructure. It returns the fields as pointers. -func (ac HTTPAccessConditions) pointers() (ims *time.Time, ius *time.Time, ime *ETag, inme *ETag) { +func (ac ModifiedAccessConditions) pointers() (ims *time.Time, ius *time.Time, ime *ETag, inme *ETag) { if !ac.IfModifiedSince.IsZero() { ims = &ac.IfModifiedSince } @@ -31,16 +31,14 @@ func (ac HTTPAccessConditions) pointers() (ims *time.Time, ius *time.Time, ime * // ContainerAccessConditions identifies container-specific access conditions which you optionally set. type ContainerAccessConditions struct { - HTTPAccessConditions + ModifiedAccessConditions LeaseAccessConditions } // BlobAccessConditions identifies blob-specific access conditions which you optionally set. type BlobAccessConditions struct { - HTTPAccessConditions + ModifiedAccessConditions LeaseAccessConditions - AppendBlobAccessConditions - PageBlobAccessConditions } // LeaseAccessConditions identifies lease access conditions for a container or blob which you optionally set. diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/atomicmorph.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/atomicmorph.go similarity index 75% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/atomicmorph.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/atomicmorph.go index 385b0458b3d7..9e18a79436b0 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/atomicmorph.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/atomicmorph.go @@ -5,13 +5,12 @@ import "sync/atomic" // AtomicMorpherInt32 identifies a method passed to and invoked by the AtomicMorphInt32 function. // The AtomicMorpher callback is passed a startValue and based on this value it returns // what the new value should be and the result that AtomicMorph should return to its caller. -type AtomicMorpherInt32 func(startVal int32) (val int32, morphResult interface{}) +type atomicMorpherInt32 func(startVal int32) (val int32, morphResult interface{}) + +const targetAndMorpherMustNotBeNil = "target and morpher must not be nil" // AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function. -func AtomicMorphInt32(target *int32, morpher AtomicMorpherInt32) interface{} { - if target == nil || morpher == nil { - panic("target and morpher mut not be nil") - } +func atomicMorphInt32(target *int32, morpher atomicMorpherInt32) interface{} { for { currentVal := atomic.LoadInt32(target) desiredVal, morphResult := morpher(currentVal) @@ -24,13 +23,10 @@ func AtomicMorphInt32(target *int32, morpher AtomicMorpherInt32) interface{} { // AtomicMorpherUint32 identifies a method passed to and invoked by the AtomicMorph function. // The AtomicMorpher callback is passed a startValue and based on this value it returns // what the new value should be and the result that AtomicMorph should return to its caller. -type AtomicMorpherUint32 func(startVal uint32) (val uint32, morphResult interface{}) +type atomicMorpherUint32 func(startVal uint32) (val uint32, morphResult interface{}) // AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function. -func AtomicMorphUint32(target *uint32, morpher AtomicMorpherUint32) interface{} { - if target == nil || morpher == nil { - panic("target and morpher mut not be nil") - } +func atomicMorphUint32(target *uint32, morpher atomicMorpherUint32) interface{} { for { currentVal := atomic.LoadUint32(target) desiredVal, morphResult := morpher(currentVal) @@ -43,13 +39,10 @@ func AtomicMorphUint32(target *uint32, morpher AtomicMorpherUint32) interface{} // AtomicMorpherUint64 identifies a method passed to and invoked by the AtomicMorphUint64 function. // The AtomicMorpher callback is passed a startValue and based on this value it returns // what the new value should be and the result that AtomicMorph should return to its caller. -type AtomicMorpherInt64 func(startVal int64) (val int64, morphResult interface{}) +type atomicMorpherInt64 func(startVal int64) (val int64, morphResult interface{}) // AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function. -func AtomicMorphInt64(target *int64, morpher AtomicMorpherInt64) interface{} { - if target == nil || morpher == nil { - panic("target and morpher mut not be nil") - } +func atomicMorphInt64(target *int64, morpher atomicMorpherInt64) interface{} { for { currentVal := atomic.LoadInt64(target) desiredVal, morphResult := morpher(currentVal) @@ -62,13 +55,10 @@ func AtomicMorphInt64(target *int64, morpher AtomicMorpherInt64) interface{} { // AtomicMorpherUint64 identifies a method passed to and invoked by the AtomicMorphUint64 function. // The AtomicMorpher callback is passed a startValue and based on this value it returns // what the new value should be and the result that AtomicMorph should return to its caller. -type AtomicMorpherUint64 func(startVal uint64) (val uint64, morphResult interface{}) +type atomicMorpherUint64 func(startVal uint64) (val uint64, morphResult interface{}) // AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function. -func AtomicMorphUint64(target *uint64, morpher AtomicMorpherUint64) interface{} { - if target == nil || morpher == nil { - panic("target and morpher mut not be nil") - } +func atomicMorphUint64(target *uint64, morpher atomicMorpherUint64) interface{} { for { currentVal := atomic.LoadUint64(target) desiredVal, morphResult := morpher(currentVal) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/blob.json b/vendor/github.com/Azure/azure-storage-blob-go/azblob/blob.json new file mode 100644 index 000000000000..09addf083972 --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/blob.json @@ -0,0 +1,8009 @@ +{ + "swagger": "2.0", + "info": { + "title": "Azure Blob Storage", + "version": "2018-11-09", + "x-ms-code-generation-settings": { + "header": "MIT", + "strictSpecAdherence": false + } + }, + "x-ms-parameterized-host": { + "hostTemplate": "{url}", + "useSchemePrefix": false, + "positionInOperation": "first", + "parameters": [ + { + "$ref": "#/parameters/Url" + } + ] + }, + "securityDefinitions": { + "blob_shared_key": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + }, + "schemes": [ + "https" + ], + "consumes": [ + "application/xml" + ], + "produces": [ + "application/xml" + ], + "paths": {}, + "x-ms-paths": { + "/?restype=service&comp=properties": { + "put": { + "tags": [ + "service" + ], + "operationId": "Service_SetProperties", + "description": "Sets properties for a storage account's Blob service endpoint, including properties for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules", + "parameters": [ + { + "$ref": "#/parameters/StorageServiceProperties" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "Success (Accepted)", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "get": { + "tags": [ + "service" + ], + "operationId": "Service_GetProperties", + "description": "gets the properties of a storage account's Blob service, including properties for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + }, + "schema": { + "$ref": "#/definitions/StorageServiceProperties" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "service" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/?restype=service&comp=stats": { + "get": { + "tags": [ + "service" + ], + "operationId": "Service_GetStatistics", + "description": "Retrieves statistics related to replication for the Blob service. It is only available on the secondary location endpoint when read-access geo-redundant replication is enabled for the storage account.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/StorageServiceStats" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "service" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "stats" + ] + } + ] + }, + "/?comp=list": { + "get": { + "tags": [ + "service" + ], + "operationId": "Service_ListContainersSegment", + "description": "The List Containers Segment operation returns a list of the containers under the specified account", + "parameters": [ + { + "$ref": "#/parameters/Prefix" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + }, + { + "$ref": "#/parameters/ListContainersInclude" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + }, + "schema": { + "$ref": "#/definitions/ListContainersSegmentResponse" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "NextMarker" + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "list" + ] + } + ] + }, + "/?restype=service&comp=userdelegationkey": { + "post": { + "tags": [ + "service" + ], + "operationId": "Service_GetUserDelegationKey", + "description": "Retrieves a user delgation key for the Blob service. This is only a valid operation when using bearer token authentication.", + "parameters": [ + { + "$ref": "#/parameters/KeyInfo" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/UserDelegationKey" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "service" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "userdelegationkey" + ] + } + ] + }, + "/?restype=account&comp=properties": { + "get": { + "tags": [ + "service" + ], + "operationId": "Service_GetAccountInfo", + "description": "Returns the sku name and account kind ", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Success (OK)", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-sku-name": { + "x-ms-client-name": "SkuName", + "type": "string", + "enum": [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ], + "x-ms-enum": { + "name": "SkuName", + "modelAsString": false + }, + "description": "Identifies the sku name of the account" + }, + "x-ms-account-kind": { + "x-ms-client-name": "AccountKind", + "type": "string", + "enum": [ + "Storage", + "BlobStorage", + "StorageV2" + ], + "x-ms-enum": { + "name": "AccountKind", + "modelAsString": false + }, + "description": "Identifies the account kind" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "account" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}?restype=container": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_Create", + "description": "creates a new container under the specified account. If the container with the same name already exists, the operation fails", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/BlobPublicAccess" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "Success, Container created.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "get": { + "tags": [ + "container" + ], + "operationId": "Container_GetProperties", + "description": "returns all user-defined metadata and system properties for the specified container. The data returned does not include the container's list of blobs", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-public-access": { + "x-ms-client-name": "BlobPublicAccess", + "description": "Indicated whether data in the container may be accessed publicly and the level of access", + "type": "string", + "enum": [ + "container", + "blob" + ], + "x-ms-enum": { + "name": "PublicAccessType", + "modelAsString": true + } + }, + "x-ms-has-immutability-policy": { + "x-ms-client-name": "HasImmutabilityPolicy", + "description": "Indicates whether the container has an immutability policy set on it.", + "type": "boolean" + }, + "x-ms-has-legal-hold": { + "x-ms-client-name": "HasLegalHold", + "description": "Indicates whether the container has a legal hold.", + "type": "boolean" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "delete": { + "tags": [ + "container" + ], + "operationId": "Container_Delete", + "description": "operation marks the specified container for deletion. The container and any blobs contained within it are later deleted during garbage collection", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "Accepted", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + } + ] + }, + "/{containerName}?restype=container&comp=metadata": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_SetMetadata", + "description": "operation sets one or more user-defined name-value pairs for the specified container.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "metadata" + ] + } + ] + }, + "/{containerName}?restype=container&comp=acl": { + "get": { + "tags": [ + "container" + ], + "operationId": "Container_GetAccessPolicy", + "description": "gets the permissions for the specified container. The permissions indicate whether container data may be accessed publicly.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "x-ms-blob-public-access": { + "x-ms-client-name": "BlobPublicAccess", + "description": "Indicated whether data in the container may be accessed publicly and the level of access", + "type": "string", + "enum": [ + "container", + "blob" + ], + "x-ms-enum": { + "name": "PublicAccessType", + "modelAsString": true + } + }, + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/SignedIdentifiers" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "put": { + "tags": [ + "container" + ], + "operationId": "Container_SetAccessPolicy", + "description": "sets the permissions for the specified container. The permissions indicate whether blobs in a container may be accessed publicly.", + "parameters": [ + { + "$ref": "#/parameters/ContainerAcl" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobPublicAccess" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "acl" + ] + } + ] + }, + "/{containerName}?comp=lease&restype=container&acquire": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_AcquireLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseDuration" + }, + { + "$ref": "#/parameters/ProposedLeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The Acquire operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a container's lease" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "acquire" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?comp=lease&restype=container&release": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_ReleaseLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Release operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "release" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?comp=lease&restype=container&renew": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_RenewLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Renew operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a container's lease" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "renew" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?comp=lease&restype=container&break": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_BreakLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseBreakPeriod" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "The Break operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-time": { + "x-ms-client-name": "LeaseTime", + "type": "integer", + "description": "Approximate time remaining in the lease period, in seconds." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "break" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?comp=lease&restype=container&change": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_ChangeLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/ProposedLeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Change operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a container's lease" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "change" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?restype=container&comp=list&flat": { + "get": { + "tags": [ + "containers" + ], + "operationId": "Container_ListBlobFlatSegment", + "description": "[Update] The List Blobs operation returns a list of the blobs under the specified container", + "parameters": [ + { + "$ref": "#/parameters/Prefix" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + }, + { + "$ref": "#/parameters/ListBlobsInclude" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For List Blobs this is 'application/xml'" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/ListBlobsFlatSegmentResponse" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "NextMarker" + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "list" + ] + } + ] + }, + "/{containerName}?restype=container&comp=list&hierarchy": { + "get": { + "tags": [ + "containers" + ], + "operationId": "Container_ListBlobHierarchySegment", + "description": "[Update] The List Blobs operation returns a list of the blobs under the specified container", + "parameters": [ + { + "$ref": "#/parameters/Prefix" + }, + { + "$ref": "#/parameters/Delimiter" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + }, + { + "$ref": "#/parameters/ListBlobsInclude" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For List Blobs this is 'application/xml'" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/ListBlobsHierarchySegmentResponse" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "NextMarker" + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "list" + ] + } + ] + }, + "/{containerName}?restype=account&comp=properties": { + "get": { + "tags": [ + "container" + ], + "operationId": "Container_GetAccountInfo", + "description": "Returns the sku name and account kind ", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Success (OK)", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-sku-name": { + "x-ms-client-name": "SkuName", + "type": "string", + "enum": [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ], + "x-ms-enum": { + "name": "SkuName", + "modelAsString": false + }, + "description": "Identifies the sku name of the account" + }, + "x-ms-account-kind": { + "x-ms-client-name": "AccountKind", + "type": "string", + "enum": [ + "Storage", + "BlobStorage", + "StorageV2" + ], + "x-ms-enum": { + "name": "AccountKind", + "modelAsString": false + }, + "description": "Identifies the account kind" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "account" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}": { + "get": { + "tags": [ + "blob" + ], + "operationId": "Blob_Download", + "description": "The Download operation reads or downloads a blob from the system, including its metadata and properties. You can also call Download to read a snapshot.", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/GetRangeContentMD5" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Returns the content of the entire blob.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "The number of bytes present in the response body." + }, + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For Download Blob this is 'application/octet-stream'" + }, + "Content-Range": { + "type": "string", + "description": "Indicates the range of bytes returned in the event that the client requested a subset of the blob by setting the 'Range' request header." + }, + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "Content-Encoding": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Encoding request header" + }, + "Cache-Control": { + "type": "string", + "description": "This header is returned if it was previously specified for the blob." + }, + "Content-Disposition": { + "type": "string", + "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." + }, + "Content-Language": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Language request header." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-blob-type": { + "x-ms-client-name": "BlobType", + "description": "The blob's type.", + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "x-ms-copy-completion-time": { + "x-ms-client-name": "CopyCompletionTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status-description": { + "x-ms-client-name": "CopyStatusDescription", + "type": "string", + "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-progress": { + "x-ms-client-name": "CopyProgress", + "type": "string", + "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-source": { + "x-ms-client-name": "CopySource", + "type": "string", + "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Accept-Ranges": { + "type": "string", + "description": "Indicates that the service supports requests for partial blob content." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." + }, + "x-ms-blob-content-md5": { + "x-ms-client-name": "BlobContentMD5", + "type": "string", + "format": "byte", + "description": "If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this response header is returned with the value of the whole blob's MD5 value. This value may or may not be equal to the value returned in Content-MD5 header, with the latter calculated from the requested range" + } + }, + "schema": { + "type": "object", + "format": "file" + } + }, + "206": { + "description": "Returns the content of a specified range of the blob.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "The number of bytes present in the response body." + }, + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For Download Blob this is 'application/octet-stream'" + }, + "Content-Range": { + "type": "string", + "description": "Indicates the range of bytes returned in the event that the client requested a subset of the blob by setting the 'Range' request header." + }, + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "Content-Encoding": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Encoding request header" + }, + "Cache-Control": { + "type": "string", + "description": "This header is returned if it was previously specified for the blob." + }, + "Content-Disposition": { + "type": "string", + "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." + }, + "Content-Language": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Language request header." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-blob-type": { + "x-ms-client-name": "BlobType", + "description": "The blob's type.", + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "x-ms-copy-completion-time": { + "x-ms-client-name": "CopyCompletionTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status-description": { + "x-ms-client-name": "CopyStatusDescription", + "type": "string", + "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-progress": { + "x-ms-client-name": "CopyProgress", + "type": "string", + "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-source": { + "x-ms-client-name": "CopySource", + "type": "string", + "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Accept-Ranges": { + "type": "string", + "description": "Indicates that the service supports requests for partial blob content." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." + }, + "x-ms-blob-content-md5": { + "x-ms-client-name": "BlobContentMD5", + "type": "string", + "format": "byte", + "description": "If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this response header is returned with the value of the whole blob's MD5 value. This value may or may not be equal to the value returned in Content-MD5 header, with the latter calculated from the requested range" + } + }, + "schema": { + "type": "object", + "format": "file" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "head": { + "tags": [ + "blob" + ], + "operationId": "Blob_GetProperties", + "description": "The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system properties for the blob. It does not return the content of the blob.", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Returns the properties of the blob.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-creation-time": { + "x-ms-client-name": "CreationTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was created." + }, + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "x-ms-blob-type": { + "x-ms-client-name": "BlobType", + "description": "The blob's type.", + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "x-ms-copy-completion-time": { + "x-ms-client-name": "CopyCompletionTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status-description": { + "x-ms-client-name": "CopyStatusDescription", + "type": "string", + "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-progress": { + "x-ms-client-name": "CopyProgress", + "type": "string", + "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-source": { + "x-ms-client-name": "CopySource", + "type": "string", + "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "x-ms-incremental-copy": { + "x-ms-client-name": "IsIncrementalCopy", + "type": "boolean", + "description": "Included if the blob is incremental copy blob." + }, + "x-ms-copy-destination-snapshot": { + "x-ms-client-name": "DestinationSnapshot", + "type": "string", + "description": "Included if the blob is incremental copy blob or incremental copy snapshot, if x-ms-copy-status is success. Snapshot time of the last successful incremental copy snapshot for this blob." + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "The number of bytes present in the response body." + }, + "Content-Type": { + "type": "string", + "description": "The content type specified for the blob. The default content type is 'application/octet-stream'" + }, + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "Content-Encoding": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Encoding request header" + }, + "Content-Disposition": { + "type": "string", + "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." + }, + "Content-Language": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Language request header." + }, + "Cache-Control": { + "type": "string", + "description": "This header is returned if it was previously specified for the blob." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "Accept-Ranges": { + "type": "string", + "description": "Indicates that the service supports requests for partial blob content." + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." + }, + "x-ms-access-tier": { + "x-ms-client-name": "AccessTier", + "type": "string", + "description": "The tier of page blob on a premium storage account or tier of block blob on blob storage LRS accounts. For a list of allowed premium page blob tiers, see https://docs.microsoft.com/en-us/azure/virtual-machines/windows/premium-storage#features. For blob storage LRS accounts, valid values are Hot/Cool/Archive." + }, + "x-ms-access-tier-inferred": { + "x-ms-client-name": "AccessTierInferred", + "type": "boolean", + "description": "For page blobs on a premium storage account only. If the access tier is not explicitly set on the blob, the tier is inferred based on its content length and this header will be returned with true value." + }, + "x-ms-archive-status": { + "x-ms-client-name": "ArchiveStatus", + "type": "string", + "description": "For blob storage LRS accounts, valid values are rehydrate-pending-to-hot/rehydrate-pending-to-cool. If the blob is being rehydrated and is not complete then this header is returned indicating that rehydrate is pending and also tells the destination tier." + }, + "x-ms-access-tier-change-time": { + "x-ms-client-name": "AccessTierChangeTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "The time the tier was changed on the object. This is only returned if the tier on the block blob was ever set." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "delete": { + "tags": [ + "blob" + ], + "operationId": "Blob_Delete", + "description": "If the storage account's soft delete feature is disabled then, when a blob is deleted, it is permanently removed from the storage account. If the storage account's soft delete feature is enabled, then, when a blob is deleted, it is marked for deletion and becomes inaccessible immediately. However, the blob service retains the blob or snapshot for the number of days specified by the DeleteRetentionPolicy section of [Storage service properties] (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob's data is permanently removed from the storage account. Note that you continue to be charged for the soft-deleted blob's storage until it is permanently removed. Use the List Blobs API and specify the \"include=deleted\" query parameter to discover which blobs and snapshots have been soft deleted. You can then use the Undelete Blob API to restore a soft-deleted blob. All other operations on a soft-deleted blob or snapshot causes the service to return an HTTP status code of 404 (ResourceNotFound).", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/DeleteSnapshots" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "The delete request was accepted and the blob will be deleted.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + } + }, + "/{containerName}/{blob}?PageBlob": { + "put": { + "tags": [ + "blob" + ], + "operationId": "PageBlob_Create", + "description": "The Create operation creates a new page blob.", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/BlobContentLengthRequired" + }, + { + "$ref": "#/parameters/BlobSequenceNumber" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The blob was created.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "x-ms-blob-type", + "x-ms-client-name": "blobType", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", + "type": "string", + "enum": [ + "PageBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?AppendBlob": { + "put": { + "tags": [ + "blob" + ], + "operationId": "AppendBlob_Create", + "description": "The Create Append Blob operation creates a new append blob.", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The blob was created.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "x-ms-blob-type", + "x-ms-client-name": "blobType", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", + "type": "string", + "enum": [ + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?BlockBlob": { + "put": { + "tags": [ + "blob" + ], + "operationId": "BlockBlob_Upload", + "description": "The Upload Block Blob operation updates the content of an existing block blob. Updating an existing block blob overwrites any existing metadata on the blob. Partial updates are not supported with Put Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a partial update of the content of a block blob, use the Put Block List operation.", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The blob was updated.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "x-ms-blob-type", + "x-ms-client-name": "blobType", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", + "type": "string", + "enum": [ + "BlockBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?comp=undelete": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_Undelete", + "description": "Undelete a blob that was previously soft deleted", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The blob was undeleted successfully.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "undelete" + ] + } + ] + }, + "/{containerName}/{blob}?comp=properties&SetHTTPHeaders": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_SetHTTPHeaders", + "description": "The Set HTTP Headers operation sets system properties on the blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The properties were set successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}?comp=metadata": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_SetMetadata", + "description": "The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more name-value pairs", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The metadata was set successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "metadata" + ] + } + ] + }, + "/{containerName}/{blob}?comp=lease&acquire": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_AcquireLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseDuration" + }, + { + "$ref": "#/parameters/ProposedLeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The Acquire operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a blobs's lease" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "acquire" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=lease&release": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_ReleaseLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Release operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "release" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=lease&renew": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_RenewLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Renew operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a blobs's lease" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "renew" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=lease&change": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_ChangeLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/ProposedLeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Change operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a blobs's lease" + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "change" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=lease&break": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_BreakLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseBreakPeriod" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "The Break operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-time": { + "x-ms-client-name": "LeaseTime", + "type": "integer", + "description": "Approximate time remaining in the lease period, in seconds." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "break" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=snapshot": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_CreateSnapshot", + "description": "The Create Snapshot operation creates a read-only snapshot of a blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The snaptshot was taken successfully.", + "headers": { + "x-ms-snapshot": { + "x-ms-client-name": "Snapshot", + "type": "string", + "description": "Uniquely identifies the snapshot and indicates the snapshot version. It may be used in subsequent requests to access the snapshot" + }, + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "snapshot" + ] + } + ] + }, + "/{containerName}/{blob}?comp=copy": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_StartCopyFromURL", + "description": "The Start Copy From URL operation copies a blob or an internet resource to a new blob.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/CopySource" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "The copy blob has been accepted with the specified copy status.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [] + }, + "/{containerName}/{blob}?comp=copy&sync": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_CopyFromURL", + "description": "The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return a response until the copy is complete.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/CopySource" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "The copy has completed.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "success" + ], + "x-ms-enum": { + "name": "SyncCopyStatusType", + "modelAsString": false + } + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "x-ms-requires-sync", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "true" + ] + } + ] + }, + "/{containerName}/{blob}?comp=copy©id={CopyId}": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_AbortCopyFromURL", + "description": "The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination blob with zero length and full metadata.", + "parameters": [ + { + "$ref": "#/parameters/CopyId" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "204": { + "description": "The delete request was accepted and the blob will be deleted.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "copy" + ] + }, + { + "name": "x-ms-copy-action", + "x-ms-client-name": "copyActionAbortConstant", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "abort" + ], + "x-ms-parameter-location": "method" + } + ] + }, + "/{containerName}/{blob}?comp=tier": { + "put": { + "tags": [ + "blobs" + ], + "operationId": "Blob_SetTier", + "description": "The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium storage account and on a block blob in a blob storage account (locally redundant storage only). A premium page blob's tier determines the allowed size, IOPS, and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation does not update the blob's ETag.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/AccessTier" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + } + ], + "responses": { + "200": { + "description": "The new tier will take effect immediately.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and newer." + } + } + }, + "202": { + "description": "The transition to the new tier is pending.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and newer." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "tier" + ] + } + ] + }, + "/{containerName}/{blob}?restype=account&comp=properties": { + "get": { + "tags": [ + "blob" + ], + "operationId": "Blob_GetAccountInfo", + "description": "Returns the sku name and account kind ", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Success (OK)", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-sku-name": { + "x-ms-client-name": "SkuName", + "type": "string", + "enum": [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ], + "x-ms-enum": { + "name": "SkuName", + "modelAsString": false + }, + "description": "Identifies the sku name of the account" + }, + "x-ms-account-kind": { + "x-ms-client-name": "AccountKind", + "type": "string", + "enum": [ + "Storage", + "BlobStorage", + "StorageV2" + ], + "x-ms-enum": { + "name": "AccountKind", + "modelAsString": false + }, + "description": "Identifies the account kind" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "account" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}?comp=block": { + "put": { + "tags": [ + "blockblob" + ], + "operationId": "BlockBlob_StageBlock", + "description": "The Stage Block operation creates a new block to be committed as part of a blob", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/BlockId" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The block was created.", + "headers": { + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "block" + ] + } + ] + }, + "/{containerName}/{blob}?comp=block&fromURL": { + "put": { + "tags": [ + "blockblob" + ], + "operationId": "BlockBlob_StageBlockFromURL", + "description": "The Stage Block operation creates a new block to be committed as part of a blob where the contents are read from a URL.", + "parameters": [ + { + "$ref": "#/parameters/BlockId" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/SourceUrl" + }, + { + "$ref": "#/parameters/SourceRange" + }, + { + "$ref": "#/parameters/SourceContentMD5" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The block was created.", + "headers": { + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "block" + ] + } + ] + }, + "/{containerName}/{blob}?comp=blocklist": { + "put": { + "tags": [ + "blockblob" + ], + "operationId": "BlockBlob_CommitBlockList", + "description": "The Commit Block List operation writes a blob by specifying the list of block IDs that make up the blob. In order to be written as part of a blob, a block must have been successfully written to the server in a prior Put Block operation. You can call Put Block List to update a blob by uploading only those blocks that have changed, then committing the new and existing blocks together. You can do this by specifying whether to commit a block from the committed block list or from the uncommitted block list, or to commit the most recently uploaded version of the block, whichever list it may belong to.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "name": "blocks", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BlockLookupList" + } + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The block list was recorded.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "get": { + "tags": [ + "blockblob" + ], + "operationId": "BlockBlob_GetBlockList", + "description": "The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block blob", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/BlockListType" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The page range was written.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For Get Block List this is 'application/xml'" + }, + "x-ms-blob-content-length": { + "x-ms-client-name": "BlobContentLength", + "type": "integer", + "format": "int64", + "description": "The size of the blob in bytes." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/BlockList" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "blocklist" + ] + } + ] + }, + "/{containerName}/{blob}?comp=page&update": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_UploadPages", + "description": "The Upload Pages operation writes a range of pages to a page blob", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThanOrEqualTo" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThan" + }, + { + "$ref": "#/parameters/IfSequenceNumberEqualTo" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The page range was written.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for the page blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "page" + ] + }, + { + "name": "x-ms-page-write", + "x-ms-client-name": "pageWrite", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required. You may specify one of the following options:\n - Update: Writes the bytes specified by the request body into the specified range. The Range and Content-Length headers must match to perform the update.\n - Clear: Clears the specified range and releases the space used in storage for that range. To clear a range, set the Content-Length header to zero, and the Range header to a value that indicates the range to clear, up to maximum blob size.", + "type": "string", + "enum": [ + "update" + ], + "x-ms-enum": { + "name": "PageWriteType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?comp=page&clear": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_ClearPages", + "description": "The Clear Pages operation clears a set of pages from a page blob", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThanOrEqualTo" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThan" + }, + { + "$ref": "#/parameters/IfSequenceNumberEqualTo" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The page range was cleared.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for the page blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "page" + ] + }, + { + "name": "x-ms-page-write", + "x-ms-client-name": "pageWrite", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required. You may specify one of the following options:\n - Update: Writes the bytes specified by the request body into the specified range. The Range and Content-Length headers must match to perform the update.\n - Clear: Clears the specified range and releases the space used in storage for that range. To clear a range, set the Content-Length header to zero, and the Range header to a value that indicates the range to clear, up to maximum blob size.", + "type": "string", + "enum": [ + "clear" + ], + "x-ms-enum": { + "name": "PageWriteType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?comp=page&update&fromUrl": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_UploadPagesFromURL", + "description": "The Upload Pages operation writes a range of pages to a page blob where the contents are read from a URL", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/SourceUrl" + }, + { + "$ref": "#/parameters/SourceRangeRequiredPutPageFromUrl" + }, + { + "$ref": "#/parameters/SourceContentMD5" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/RangeRequiredPutPageFromUrl" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThanOrEqualTo" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThan" + }, + { + "$ref": "#/parameters/IfSequenceNumberEqualTo" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The page range was written.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for the page blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "page" + ] + }, + { + "name": "x-ms-page-write", + "x-ms-client-name": "pageWrite", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required. You may specify one of the following options:\n - Update: Writes the bytes specified by the request body into the specified range. The Range and Content-Length headers must match to perform the update.\n - Clear: Clears the specified range and releases the space used in storage for that range. To clear a range, set the Content-Length header to zero, and the Range header to a value that indicates the range to clear, up to maximum blob size.", + "type": "string", + "enum": [ + "update" + ], + "x-ms-enum": { + "name": "PageWriteType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?comp=pagelist": { + "get": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_GetPageRanges", + "description": "The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a page blob", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Information on the page blob was found.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "x-ms-blob-content-length": { + "x-ms-client-name": "BlobContentLength", + "type": "integer", + "format": "int64", + "description": "The size of the blob in bytes." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/PageList" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "pagelist" + ] + } + ] + }, + "/{containerName}/{blob}?comp=pagelist&diff": { + "get": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_GetPageRangesDiff", + "description": "The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were changed between target blob and previous snapshot.", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/PrevSnapshot" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Information on the page blob was found.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "x-ms-blob-content-length": { + "x-ms-client-name": "BlobContentLength", + "type": "integer", + "format": "int64", + "description": "The size of the blob in bytes." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/PageList" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "pagelist" + ] + } + ] + }, + "/{containerName}/{blob}?comp=properties&Resize": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_Resize", + "description": "Resize the Blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/BlobContentLengthRequired" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Blob was resized successfully", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}?comp=properties&UpdateSequenceNumber": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_UpdateSequenceNumber", + "description": "Update the sequence number of the blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/SequenceNumberAction" + }, + { + "$ref": "#/parameters/BlobSequenceNumber" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The sequence numbers were updated successfully.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}?comp=incrementalcopy": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_CopyIncremental", + "description": "The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob. The snapshot is copied such that only the differential changes between the previously copied snapshot are transferred to the destination. The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual. This API is supported since REST version 2016-05-31.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/CopySource" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "The blob was copied.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "incrementalcopy" + ] + } + ] + }, + "/{containerName}/{blob}?comp=appendblock": { + "put": { + "tags": [ + "appendblob" + ], + "consumes": [ + "application/octet-stream" + ], + "operationId": "AppendBlob_AppendBlock", + "description": "The Append Block operation commits a new block of data to the end of an existing append blob. The Append Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later.", + "parameters": [ + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobConditionMaxSize" + }, + { + "$ref": "#/parameters/BlobConditionAppendPos" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The block was created.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-append-offset": { + "x-ms-client-name": "BlobAppendOffset", + "type": "string", + "description": "This response header is returned only for append operations. It returns the offset at which the block was committed, in bytes." + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "appendblock" + ] + } + ] + }, + "/{containerName}/{blob}?comp=appendblock&fromUrl": { + "put": { + "tags": [ + "appendblob" + ], + "operationId": "AppendBlob_AppendBlockFromUrl", + "description": "The Append Block operation commits a new block of data to the end of an existing append blob where the contents are read from a source url. The Append Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later.", + "parameters": [ + { + "$ref": "#/parameters/SourceUrl" + }, + { + "$ref": "#/parameters/SourceRange" + }, + { + "$ref": "#/parameters/SourceContentMD5" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobConditionMaxSize" + }, + { + "$ref": "#/parameters/BlobConditionAppendPos" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The block was created.", + "headers": { + "ETag": { + "type": "string", + "format": "etag", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-append-offset": { + "x-ms-client-name": "BlobAppendOffset", + "type": "string", + "description": "This response header is returned only for append operations. It returns the offset at which the block was committed, in bytes." + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "appendblock" + ] + } + ] + } + }, + "definitions": { + "KeyInfo": { + "type": "object", + "required": [ + "Start", + "Expiry" + ], + "description": "Key information", + "properties": { + "Start": { + "description": "The date-time the key is active in ISO 8601 UTC time", + "type": "string" + }, + "Expiry": { + "description": "The date-time the key expires in ISO 8601 UTC time", + "type": "string" + } + } + }, + "UserDelegationKey": { + "type": "object", + "required": [ + "SignedOid", + "SignedTid", + "SignedStart", + "SignedExpiry", + "SignedService", + "SignedVersion", + "Value" + ], + "description": "A user delegation key", + "properties": { + "SignedOid": { + "description": "The Azure Active Directory object ID in GUID format.", + "type": "string" + }, + "SignedTid": { + "description": "The Azure Active Directory tenant ID in GUID format", + "type": "string" + }, + "SignedStart": { + "description": "The date-time the key is active", + "type": "string", + "format": "date-time" + }, + "SignedExpiry": { + "description": "The date-time the key expires", + "type": "string", + "format": "date-time" + }, + "SignedService": { + "description": "Abbreviation of the Azure Storage service that accepts the key", + "type": "string" + }, + "SignedVersion": { + "description": "The service version that created the key", + "type": "string" + }, + "Value": { + "description": "The key as a base64 string", + "type": "string" + } + } + }, + "PublicAccessType": { + "type": "string", + "enum": [ + "container", + "blob" + ], + "x-ms-enum": { + "name": "PublicAccessType", + "modelAsString": true + } + }, + "CopyStatus": { + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "LeaseDuration": { + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "LeaseState": { + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "LeaseStatus": { + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "StorageError": { + "type": "object", + "properties": { + "Code": { + "type": "string" + }, + "Message": { + "type": "string" + } + } + }, + "AccessPolicy": { + "type": "object", + "required": [ + "Start", + "Expiry", + "Permission" + ], + "description": "An Access policy", + "properties": { + "Start": { + "description": "the date-time the policy is active", + "type": "string", + "format": "date-time" + }, + "Expiry": { + "description": "the date-time the policy expires", + "type": "string", + "format": "date-time" + }, + "Permission": { + "description": "the permissions for the acl policy", + "type": "string" + } + } + }, + "AccessTier": { + "type": "string", + "enum": [ + "P4", + "P6", + "P10", + "P20", + "P30", + "P40", + "P50", + "Hot", + "Cool", + "Archive" + ], + "x-ms-enum": { + "name": "AccessTier", + "modelAsString": true + } + }, + "ArchiveStatus": { + "type": "string", + "enum": [ + "rehydrate-pending-to-hot", + "rehydrate-pending-to-cool" + ], + "x-ms-enum": { + "name": "ArchiveStatus", + "modelAsString": true + } + }, + "BlobItem": { + "xml": { + "name": "Blob" + }, + "description": "An Azure Storage blob", + "type": "object", + "required": [ + "Name", + "Deleted", + "Snapshot", + "Properties" + ], + "properties": { + "Name": { + "type": "string" + }, + "Deleted": { + "type": "boolean" + }, + "Snapshot": { + "type": "string" + }, + "Properties": { + "$ref": "#/definitions/BlobProperties" + }, + "Metadata": { + "$ref": "#/definitions/Metadata" + } + } + }, + "BlobProperties": { + "xml": { + "name": "Properties" + }, + "description": "Properties of a blob", + "type": "object", + "required": [ + "Etag", + "Last-Modified" + ], + "properties": { + "Creation-Time": { + "type": "string", + "format": "date-time-rfc1123" + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123" + }, + "Etag": { + "type": "string", + "format": "etag" + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "Size in bytes" + }, + "Content-Type": { + "type": "string" + }, + "Content-Encoding": { + "type": "string" + }, + "Content-Language": { + "type": "string" + }, + "Content-MD5": { + "type": "string", + "format": "byte" + }, + "Content-Disposition": { + "type": "string" + }, + "Cache-Control": { + "type": "string" + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "blobSequenceNumber", + "type": "integer", + "format": "int64" + }, + "BlobType": { + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "LeaseStatus": { + "$ref": "#/definitions/LeaseStatus" + }, + "LeaseState": { + "$ref": "#/definitions/LeaseState" + }, + "LeaseDuration": { + "$ref": "#/definitions/LeaseDuration" + }, + "CopyId": { + "type": "string" + }, + "CopyStatus": { + "$ref": "#/definitions/CopyStatus" + }, + "CopySource": { + "type": "string" + }, + "CopyProgress": { + "type": "string" + }, + "CopyCompletionTime": { + "type": "string", + "format": "date-time-rfc1123" + }, + "CopyStatusDescription": { + "type": "string" + }, + "ServerEncrypted": { + "type": "boolean" + }, + "IncrementalCopy": { + "type": "boolean" + }, + "DestinationSnapshot": { + "type": "string" + }, + "DeletedTime": { + "type": "string", + "format": "date-time-rfc1123" + }, + "RemainingRetentionDays": { + "type": "integer" + }, + "AccessTier": { + "$ref": "#/definitions/AccessTier" + }, + "AccessTierInferred": { + "type": "boolean" + }, + "ArchiveStatus": { + "$ref": "#/definitions/ArchiveStatus" + }, + "AccessTierChangeTime": { + "type": "string", + "format": "date-time-rfc1123" + } + } + }, + "ListBlobsFlatSegmentResponse": { + "xml": { + "name": "EnumerationResults" + }, + "description": "An enumeration of blobs", + "type": "object", + "required": [ + "ServiceEndpoint", + "ContainerName", + "Segment" + ], + "properties": { + "ServiceEndpoint": { + "type": "string", + "xml": { + "attribute": true + } + }, + "ContainerName": { + "type": "string", + "xml": { + "attribute": true + } + }, + "Prefix": { + "type": "string" + }, + "Marker": { + "type": "string" + }, + "MaxResults": { + "type": "integer" + }, + "Delimiter": { + "type": "string" + }, + "Segment": { + "$ref": "#/definitions/BlobFlatListSegment" + }, + "NextMarker": { + "type": "string" + } + } + }, + "ListBlobsHierarchySegmentResponse": { + "xml": { + "name": "EnumerationResults" + }, + "description": "An enumeration of blobs", + "type": "object", + "required": [ + "ServiceEndpoint", + "ContainerName", + "Segment" + ], + "properties": { + "ServiceEndpoint": { + "type": "string", + "xml": { + "attribute": true + } + }, + "ContainerName": { + "type": "string", + "xml": { + "attribute": true + } + }, + "Prefix": { + "type": "string" + }, + "Marker": { + "type": "string" + }, + "MaxResults": { + "type": "integer" + }, + "Delimiter": { + "type": "string" + }, + "Segment": { + "$ref": "#/definitions/BlobHierarchyListSegment" + }, + "NextMarker": { + "type": "string" + } + } + }, + "BlobFlatListSegment": { + "xml": { + "name": "Blobs" + }, + "required": [ + "BlobItems" + ], + "type": "object", + "properties": { + "BlobItems": { + "type": "array", + "items": { + "$ref": "#/definitions/BlobItem" + } + } + } + }, + "BlobHierarchyListSegment": { + "xml": { + "name": "Blobs" + }, + "type": "object", + "required": [ + "BlobItems" + ], + "properties": { + "BlobPrefixes": { + "type": "array", + "items": { + "$ref": "#/definitions/BlobPrefix" + } + }, + "BlobItems": { + "type": "array", + "items": { + "$ref": "#/definitions/BlobItem" + } + } + } + }, + "BlobPrefix": { + "type": "object", + "required": [ + "Name" + ], + "properties": { + "Name": { + "type": "string" + } + } + }, + "Block": { + "type": "object", + "required": [ + "Name", + "Size" + ], + "description": "Represents a single block in a block blob. It describes the block's ID and size.", + "properties": { + "Name": { + "description": "The base64 encoded block ID.", + "type": "string" + }, + "Size": { + "description": "The block size in bytes.", + "type": "integer" + } + } + }, + "BlockList": { + "type": "object", + "properties": { + "CommittedBlocks": { + "xml": { + "wrapped": true + }, + "type": "array", + "items": { + "$ref": "#/definitions/Block" + } + }, + "UncommittedBlocks": { + "xml": { + "wrapped": true + }, + "type": "array", + "items": { + "$ref": "#/definitions/Block" + } + } + } + }, + "BlockLookupList": { + "type": "object", + "properties": { + "Committed": { + "type": "array", + "items": { + "type": "string", + "xml": { + "name": "Committed" + } + } + }, + "Uncommitted": { + "type": "array", + "items": { + "type": "string", + "xml": { + "name": "Uncommitted" + } + } + }, + "Latest": { + "type": "array", + "items": { + "type": "string", + "xml": { + "name": "Latest" + } + } + } + }, + "xml": { + "name": "BlockList" + } + }, + "ContainerItem": { + "xml": { + "name": "Container" + }, + "type": "object", + "required": [ + "Name", + "Properties" + ], + "description": "An Azure Storage container", + "properties": { + "Name": { + "type": "string" + }, + "Properties": { + "$ref": "#/definitions/ContainerProperties" + }, + "Metadata": { + "$ref": "#/definitions/Metadata" + } + } + }, + "ContainerProperties": { + "type": "object", + "required": [ + "Last-Modified", + "Etag" + ], + "description": "Properties of a container", + "properties": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123" + }, + "Etag": { + "type": "string", + "format": "etag" + }, + "LeaseStatus": { + "$ref": "#/definitions/LeaseStatus" + }, + "LeaseState": { + "$ref": "#/definitions/LeaseState" + }, + "LeaseDuration": { + "$ref": "#/definitions/LeaseDuration" + }, + "PublicAccess": { + "$ref": "#/definitions/PublicAccessType" + }, + "HasImmutabilityPolicy": { + "type": "boolean" + }, + "HasLegalHold": { + "type": "boolean" + } + } + }, + "ListContainersSegmentResponse": { + "xml": { + "name": "EnumerationResults" + }, + "description": "An enumeration of containers", + "type": "object", + "required": [ + "ServiceEndpoint", + "ContainerItems" + ], + "properties": { + "ServiceEndpoint": { + "type": "string", + "xml": { + "attribute": true + } + }, + "Prefix": { + "type": "string" + }, + "Marker": { + "type": "string" + }, + "MaxResults": { + "type": "integer" + }, + "ContainerItems": { + "xml": { + "wrapped": true, + "name": "Containers" + }, + "type": "array", + "items": { + "$ref": "#/definitions/ContainerItem" + } + }, + "NextMarker": { + "type": "string" + } + } + }, + "CorsRule": { + "description": "CORS is an HTTP feature that enables a web application running under one domain to access resources in another domain. Web browsers implement a security restriction known as same-origin policy that prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain (the origin domain) to call APIs in another domain", + "type": "object", + "required": [ + "AllowedOrigins", + "AllowedMethods", + "AllowedHeaders", + "ExposedHeaders", + "MaxAgeInSeconds" + ], + "properties": { + "AllowedOrigins": { + "description": "The origin domains that are permitted to make a request against the storage service via CORS. The origin domain is the domain from which the request originates. Note that the origin must be an exact case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*' to allow all origin domains to make requests via CORS.", + "type": "string" + }, + "AllowedMethods": { + "description": "The methods (HTTP request verbs) that the origin domain may use for a CORS request. (comma separated)", + "type": "string" + }, + "AllowedHeaders": { + "description": "the request headers that the origin domain may specify on the CORS request.", + "type": "string" + }, + "ExposedHeaders": { + "description": "The response headers that may be sent in the response to the CORS request and exposed by the browser to the request issuer", + "type": "string" + }, + "MaxAgeInSeconds": { + "description": "The maximum amount time that a browser should cache the preflight OPTIONS request.", + "type": "integer", + "minimum": 0 + } + } + }, + "ErrorCode": { + "description": "Error codes returned by the service", + "type": "string", + "enum": [ + "AccountAlreadyExists", + "AccountBeingCreated", + "AccountIsDisabled", + "AuthenticationFailed", + "AuthorizationFailure", + "ConditionHeadersNotSupported", + "ConditionNotMet", + "EmptyMetadataKey", + "InsufficientAccountPermissions", + "InternalError", + "InvalidAuthenticationInfo", + "InvalidHeaderValue", + "InvalidHttpVerb", + "InvalidInput", + "InvalidMd5", + "InvalidMetadata", + "InvalidQueryParameterValue", + "InvalidRange", + "InvalidResourceName", + "InvalidUri", + "InvalidXmlDocument", + "InvalidXmlNodeValue", + "Md5Mismatch", + "MetadataTooLarge", + "MissingContentLengthHeader", + "MissingRequiredQueryParameter", + "MissingRequiredHeader", + "MissingRequiredXmlNode", + "MultipleConditionHeadersNotSupported", + "OperationTimedOut", + "OutOfRangeInput", + "OutOfRangeQueryParameterValue", + "RequestBodyTooLarge", + "ResourceTypeMismatch", + "RequestUrlFailedToParse", + "ResourceAlreadyExists", + "ResourceNotFound", + "ServerBusy", + "UnsupportedHeader", + "UnsupportedXmlNode", + "UnsupportedQueryParameter", + "UnsupportedHttpVerb", + "AppendPositionConditionNotMet", + "BlobAlreadyExists", + "BlobNotFound", + "BlobOverwritten", + "BlobTierInadequateForContentLength", + "BlockCountExceedsLimit", + "BlockListTooLong", + "CannotChangeToLowerTier", + "CannotVerifyCopySource", + "ContainerAlreadyExists", + "ContainerBeingDeleted", + "ContainerDisabled", + "ContainerNotFound", + "ContentLengthLargerThanTierLimit", + "CopyAcrossAccountsNotSupported", + "CopyIdMismatch", + "FeatureVersionMismatch", + "IncrementalCopyBlobMismatch", + "IncrementalCopyOfEralierVersionSnapshotNotAllowed", + "IncrementalCopySourceMustBeSnapshot", + "InfiniteLeaseDurationRequired", + "InvalidBlobOrBlock", + "InvalidBlobTier", + "InvalidBlobType", + "InvalidBlockId", + "InvalidBlockList", + "InvalidOperation", + "InvalidPageRange", + "InvalidSourceBlobType", + "InvalidSourceBlobUrl", + "InvalidVersionForPageBlobOperation", + "LeaseAlreadyPresent", + "LeaseAlreadyBroken", + "LeaseIdMismatchWithBlobOperation", + "LeaseIdMismatchWithContainerOperation", + "LeaseIdMismatchWithLeaseOperation", + "LeaseIdMissing", + "LeaseIsBreakingAndCannotBeAcquired", + "LeaseIsBreakingAndCannotBeChanged", + "LeaseIsBrokenAndCannotBeRenewed", + "LeaseLost", + "LeaseNotPresentWithBlobOperation", + "LeaseNotPresentWithContainerOperation", + "LeaseNotPresentWithLeaseOperation", + "MaxBlobSizeConditionNotMet", + "NoPendingCopyOperation", + "OperationNotAllowedOnIncrementalCopyBlob", + "PendingCopyOperation", + "PreviousSnapshotCannotBeNewer", + "PreviousSnapshotNotFound", + "PreviousSnapshotOperationNotSupported", + "SequenceNumberConditionNotMet", + "SequenceNumberIncrementTooLarge", + "SnapshotCountExceeded", + "SnaphotOperationRateExceeded", + "SnapshotsPresent", + "SourceConditionNotMet", + "SystemInUse", + "TargetConditionNotMet", + "UnauthorizedBlobOverwrite", + "BlobBeingRehydrated", + "BlobArchived", + "BlobNotArchived" + ], + "x-ms-enum": { + "name": "StorageErrorCode", + "modelAsString": true + } + }, + "GeoReplication": { + "description": "Geo-Replication information for the Secondary Storage Service", + "type": "object", + "required": [ + "Status", + "LastSyncTime" + ], + "properties": { + "Status": { + "description": "The status of the secondary location", + "type": "string", + "enum": [ + "live", + "bootstrap", + "unavailable" + ], + "x-ms-enum": { + "name": "GeoReplicationStatusType", + "modelAsString": true + } + }, + "LastSyncTime": { + "description": "A GMT date/time value, to the second. All primary writes preceding this value are guaranteed to be available for read operations at the secondary. Primary writes after this point in time may or may not be available for reads.", + "type": "string", + "format": "date-time-rfc1123" + } + } + }, + "Logging": { + "description": "Azure Analytics Logging settings.", + "type": "object", + "required": [ + "Version", + "Delete", + "Read", + "Write", + "RetentionPolicy" + ], + "properties": { + "Version": { + "description": "The version of Storage Analytics to configure.", + "type": "string" + }, + "Delete": { + "description": "Indicates whether all delete requests should be logged.", + "type": "boolean" + }, + "Read": { + "description": "Indicates whether all read requests should be logged.", + "type": "boolean" + }, + "Write": { + "description": "Indicates whether all write requests should be logged.", + "type": "boolean" + }, + "RetentionPolicy": { + "$ref": "#/definitions/RetentionPolicy" + } + } + }, + "Metadata": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "Metrics": { + "description": "a summary of request statistics grouped by API in hour or minute aggregates for blobs", + "required": [ + "Enabled" + ], + "properties": { + "Version": { + "description": "The version of Storage Analytics to configure.", + "type": "string" + }, + "Enabled": { + "description": "Indicates whether metrics are enabled for the Blob service.", + "type": "boolean" + }, + "IncludeAPIs": { + "description": "Indicates whether metrics should generate summary statistics for called API operations.", + "type": "boolean" + }, + "RetentionPolicy": { + "$ref": "#/definitions/RetentionPolicy" + } + } + }, + "PageList": { + "description": "the list of pages", + "type": "object", + "properties": { + "PageRange": { + "type": "array", + "items": { + "$ref": "#/definitions/PageRange" + } + }, + "ClearRange": { + "type": "array", + "items": { + "$ref": "#/definitions/ClearRange" + } + } + } + }, + "PageRange": { + "type": "object", + "required": [ + "Start", + "End" + ], + "properties": { + "Start": { + "type": "integer", + "format": "int64", + "xml": { + "name": "Start" + } + }, + "End": { + "type": "integer", + "format": "int64", + "xml": { + "name": "End" + } + } + }, + "xml": { + "name": "PageRange" + } + }, + "ClearRange": { + "type": "object", + "required": [ + "Start", + "End" + ], + "properties": { + "Start": { + "type": "integer", + "format": "int64", + "xml": { + "name": "Start" + } + }, + "End": { + "type": "integer", + "format": "int64", + "xml": { + "name": "End" + } + } + }, + "xml": { + "name": "ClearRange" + } + }, + "RetentionPolicy": { + "description": "the retention policy which determines how long the associated data should persist", + "type": "object", + "required": [ + "Enabled" + ], + "properties": { + "Enabled": { + "description": "Indicates whether a retention policy is enabled for the storage service", + "type": "boolean" + }, + "Days": { + "description": "Indicates the number of days that metrics or logging or soft-deleted data should be retained. All data older than this value will be deleted", + "type": "integer", + "minimum": 1 + } + } + }, + "SignedIdentifier": { + "xml": { + "name": "SignedIdentifier" + }, + "description": "signed identifier", + "type": "object", + "required": [ + "Id", + "AccessPolicy" + ], + "properties": { + "Id": { + "type": "string", + "description": "a unique id" + }, + "AccessPolicy": { + "$ref": "#/definitions/AccessPolicy" + } + } + }, + "SignedIdentifiers": { + "description": "a collection of signed identifiers", + "type": "array", + "items": { + "$ref": "#/definitions/SignedIdentifier" + }, + "xml": { + "wrapped": true, + "name": "SignedIdentifiers" + } + }, + "StaticWebsite": { + "description": "The properties that enable an account to host a static website", + "type": "object", + "required": [ + "Enabled" + ], + "properties": { + "Enabled": { + "description": "Indicates whether this account is hosting a static website", + "type": "boolean" + }, + "IndexDocument": { + "description": "The default name of the index page under each directory", + "type": "string" + }, + "ErrorDocument404Path": { + "description": "The absolute path of the custom 404 page", + "type": "string" + } + } + }, + "StorageServiceProperties": { + "description": "Storage Service Properties.", + "type": "object", + "properties": { + "Logging": { + "$ref": "#/definitions/Logging" + }, + "HourMetrics": { + "$ref": "#/definitions/Metrics" + }, + "MinuteMetrics": { + "$ref": "#/definitions/Metrics" + }, + "Cors": { + "description": "The set of CORS rules.", + "type": "array", + "items": { + "$ref": "#/definitions/CorsRule" + }, + "xml": { + "wrapped": true + } + }, + "DefaultServiceVersion": { + "description": "The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible values include version 2008-10-27 and all more recent versions", + "type": "string" + }, + "DeleteRetentionPolicy": { + "$ref": "#/definitions/RetentionPolicy" + }, + "StaticWebsite": { + "$ref": "#/definitions/StaticWebsite" + } + } + }, + "StorageServiceStats": { + "description": "Stats for the storage service.", + "type": "object", + "properties": { + "GeoReplication": { + "$ref": "#/definitions/GeoReplication" + } + } + } + }, + "parameters": { + "Url": { + "name": "url", + "description": "The URL of the service account, container, or blob that is the targe of the desired operation.", + "required": true, + "type": "string", + "in": "path", + "x-ms-skip-url-encoding": true + }, + "ApiVersionParameter": { + "name": "x-ms-version", + "x-ms-client-name": "version", + "in": "header", + "required": true, + "type": "string", + "description": "Specifies the version of the operation to use for this request.", + "enum": [ + "2018-11-09" + ] + }, + "Blob": { + "name": "blob", + "in": "path", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9]+(?:/[a-zA-Z0-9]+)*(?:\\.[a-zA-Z0-9]+){0,1}$", + "minLength": 1, + "maxLength": 1024, + "x-ms-parameter-location": "method", + "description": "The blob name." + }, + "BlobCacheControl": { + "name": "x-ms-blob-cache-control", + "x-ms-client-name": "blobCacheControl", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Sets the blob's cache control. If specified, this property is stored with the blob and returned with a read request." + }, + "BlobConditionAppendPos": { + "name": "x-ms-blob-condition-appendpos", + "x-ms-client-name": "appendPosition", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "append-position-access-conditions" + }, + "description": "Optional conditional header, used only for the Append Block operation. A number indicating the byte offset to compare. Append Block will succeed only if the append position is equal to this number. If it is not, the request will fail with the AppendPositionConditionNotMet error (HTTP status code 412 - Precondition Failed)." + }, + "BlobConditionMaxSize": { + "name": "x-ms-blob-condition-maxsize", + "x-ms-client-name": "maxSize", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "append-position-access-conditions" + }, + "description": "Optional conditional header. The max length in bytes permitted for the append blob. If the Append Block operation would cause the blob to exceed that limit or if the blob size is already greater than the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error (HTTP status code 412 - Precondition Failed)." + }, + "BlobPublicAccess": { + "name": "x-ms-blob-public-access", + "x-ms-client-name": "access", + "in": "header", + "required": false, + "x-ms-parameter-location": "method", + "description": "Specifies whether data in the container may be accessed publicly and the level of access", + "type": "string", + "enum": [ + "container", + "blob" + ], + "x-ms-enum": { + "name": "PublicAccessType", + "modelAsString": true + } + }, + "AccessTier": { + "name": "x-ms-access-tier", + "x-ms-client-name": "tier", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "P4", + "P6", + "P10", + "P20", + "P30", + "P40", + "P50", + "Hot", + "Cool", + "Archive" + ], + "x-ms-enum": { + "name": "AccessTier", + "modelAsString": true + }, + "x-ms-parameter-location": "method", + "description": "Indicates the tier to be set on the blob." + }, + "BlobContentDisposition": { + "name": "x-ms-blob-content-disposition", + "x-ms-client-name": "blobContentDisposition", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Sets the blob's Content-Disposition header." + }, + "BlobContentEncoding": { + "name": "x-ms-blob-content-encoding", + "x-ms-client-name": "blobContentEncoding", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Sets the blob's content encoding. If specified, this property is stored with the blob and returned with a read request." + }, + "BlobContentLanguage": { + "name": "x-ms-blob-content-language", + "x-ms-client-name": "blobContentLanguage", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Set the blob's content language. If specified, this property is stored with the blob and returned with a read request." + }, + "BlobContentLengthOptional": { + "name": "x-ms-blob-content-length", + "x-ms-client-name": "blobContentLength", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "description": "This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned to a 512-byte boundary." + }, + "BlobContentLengthRequired": { + "name": "x-ms-blob-content-length", + "x-ms-client-name": "blobContentLength", + "in": "header", + "required": true, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "description": "This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned to a 512-byte boundary." + }, + "BlobContentMD5": { + "name": "x-ms-blob-content-md5", + "x-ms-client-name": "blobContentMD5", + "in": "header", + "required": false, + "type": "string", + "format": "byte", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. An MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual blocks were validated when each was uploaded." + }, + "BlobContentType": { + "name": "x-ms-blob-content-type", + "x-ms-client-name": "blobContentType", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Sets the blob's content type. If specified, this property is stored with the blob and returned with a read request." + }, + "BlobSequenceNumber": { + "name": "x-ms-blob-sequence-number", + "x-ms-client-name": "blobSequenceNumber", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "default": 0, + "x-ms-parameter-location": "method", + "description": "Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of the sequence number must be between 0 and 2^63 - 1." + }, + "BlockId": { + "name": "blockid", + "x-ms-client-name": "blockId", + "in": "query", + "type": "string", + "required": true, + "x-ms-parameter-location": "method", + "description": "A valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified for the blockid parameter must be the same size for each block." + }, + "BlockListType": { + "name": "blocklisttype", + "x-ms-client-name": "listType", + "in": "query", + "required": true, + "default": "committed", + "x-ms-parameter-location": "method", + "description": "Specifies whether to return the list of committed blocks, the list of uncommitted blocks, or both lists together.", + "type": "string", + "enum": [ + "committed", + "uncommitted", + "all" + ], + "x-ms-enum": { + "name": "BlockListType", + "modelAsString": false + } + }, + "Body": { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "format": "file" + }, + "x-ms-parameter-location": "method", + "description": "Initial data" + }, + "ContainerAcl": { + "name": "containerAcl", + "in": "body", + "schema": { + "$ref": "#/definitions/SignedIdentifiers" + }, + "x-ms-parameter-location": "method", + "description": "the acls for the container" + }, + "CopyId": { + "name": "copyid", + "x-ms-client-name": "copyId", + "in": "query", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The copy identifier provided in the x-ms-copy-id header of the original Copy Blob operation." + }, + "ClientRequestId": { + "name": "x-ms-client-request-id", + "x-ms-client-name": "requestId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled." + }, + "ContainerName": { + "name": "containerName", + "in": "path", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The container name." + }, + + "ContentLength": { + "name": "Content-Length", + "in": "header", + "required": true, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "description": "The length of the request." + }, + "ContentMD5": { + "name": "Content-MD5", + "x-ms-client-name": "transactionalContentMD5", + "in": "header", + "required": false, + "type": "string", + "format": "byte", + "x-ms-parameter-location": "method", + "description": "Specify the transactional md5 for the body, to be validated by the service." + }, + "CopySource": { + "name": "x-ms-copy-source", + "x-ms-client-name": "copySource", + "in": "header", + "required": true, + "type": "string", + "format": "url", + "x-ms-parameter-location": "method", + "description": "Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob must either be public or must be authenticated via a shared access signature." + }, + "DeleteSnapshots": { + "name": "x-ms-delete-snapshots", + "x-ms-client-name": "deleteSnapshots", + "description": "Required if the blob has associated snapshots. Specify one of the following two options: include: Delete the base blob and all of its snapshots. only: Delete only the blob's snapshots and not the blob itself", + "x-ms-parameter-location": "method", + "in": "header", + "required": false, + "type": "string", + "enum": [ + "include", + "only" + ], + "x-ms-enum": { + "name": "DeleteSnapshotsOptionType", + "modelAsString": false + } + }, + "Delimiter": { + "name": "delimiter", + "description": "When the request includes this parameter, the operation returns a BlobPrefix element in the response body that acts as a placeholder for all blobs whose names begin with the same substring up to the appearance of the delimiter character. The delimiter may be a single character or a string.", + "type": "string", + "x-ms-parameter-location": "method", + "in": "query", + "required": true + }, + "GetRangeContentMD5": { + "name": "x-ms-range-get-content-md5", + "x-ms-client-name": "rangeGetContentMD5", + "in": "header", + "required": false, + "type": "boolean", + "x-ms-parameter-location": "method", + "description": "When set to true and specified together with the Range, the service returns the MD5 hash for the range, as long as the range is less than or equal to 4 MB in size." + }, + "IfMatch": { + "name": "If-Match", + "x-ms-client-name": "ifMatch", + "in": "header", + "required": false, + "type": "string", + "format": "etag", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "modified-access-conditions" + }, + "description": "Specify an ETag value to operate only on blobs with a matching value." + }, + "IfModifiedSince": { + "name": "If-Modified-Since", + "x-ms-client-name": "ifModifiedSince", + "in": "header", + "required": false, + "type": "string", + "format": "date-time-rfc1123", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "modified-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has been modified since the specified date/time." + }, + "IfNoneMatch": { + "name": "If-None-Match", + "x-ms-client-name": "ifNoneMatch", + "in": "header", + "required": false, + "type": "string", + "format": "etag", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "modified-access-conditions" + }, + "description": "Specify an ETag value to operate only on blobs without a matching value." + }, + "IfUnmodifiedSince": { + "name": "If-Unmodified-Since", + "x-ms-client-name": "ifUnmodifiedSince", + "in": "header", + "required": false, + "type": "string", + "format": "date-time-rfc1123", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "modified-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has not been modified since the specified date/time." + }, + "IfSequenceNumberEqualTo": { + "name": "x-ms-if-sequence-number-eq", + "x-ms-client-name": "ifSequenceNumberEqualTo", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "sequence-number-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has the specified sequence number." + }, + "IfSequenceNumberLessThan": { + "name": "x-ms-if-sequence-number-lt", + "x-ms-client-name": "ifSequenceNumberLessThan", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "sequence-number-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has a sequence number less than the specified." + }, + "IfSequenceNumberLessThanOrEqualTo": { + "name": "x-ms-if-sequence-number-le", + "x-ms-client-name": "ifSequenceNumberLessThanOrEqualTo", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "sequence-number-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has a sequence number less than or equal to the specified." + }, + "KeyInfo": { + "name": "KeyInfo", + "in": "body", + "x-ms-parameter-location": "method", + "required": true, + "schema": { + "$ref": "#/definitions/KeyInfo" + } + }, + "ListBlobsInclude": { + "name": "include", + "in": "query", + "required": false, + "type": "array", + "collectionFormat": "csv", + "items": { + "type": "string", + "enum": [ + "copy", + "deleted", + "metadata", + "snapshots", + "uncommittedblobs" + ], + "x-ms-enum": { + "name": "ListBlobsIncludeItem", + "modelAsString": false + } + }, + "x-ms-parameter-location": "method", + "description": "Include this parameter to specify one or more datasets to include in the response." + }, + "ListContainersInclude": { + "name": "include", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "metadata" + ], + "x-ms-enum": { + "name": "ListContainersIncludeType", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Include this parameter to specify that the container's metadata be returned as part of the response body." + }, + "LeaseBreakPeriod": { + "name": "x-ms-lease-break-period", + "x-ms-client-name": "breakPeriod", + "in": "header", + "required": false, + "type": "integer", + "x-ms-parameter-location": "method", + "description": "For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This break period is only used if it is shorter than the time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available before the break period has expired, but the lease may be held for longer than the break period. If this header does not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, and an infinite lease breaks immediately." + }, + "LeaseDuration": { + "name": "x-ms-lease-duration", + "x-ms-client-name": "duration", + "in": "header", + "required": false, + "type": "integer", + "x-ms-parameter-location": "method", + "description": "Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be changed using renew or change." + }, + "LeaseIdOptional": { + "name": "x-ms-lease-id", + "x-ms-client-name": "leaseId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "lease-access-conditions" + }, + "description": "If specified, the operation only succeeds if the resource's lease is active and matches this ID." + }, + "LeaseIdRequired": { + "name": "x-ms-lease-id", + "x-ms-client-name": "leaseId", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Specifies the current lease ID on the resource." + }, + "Marker": { + "name": "marker", + "in": "query", + "required": false, + "type": "string", + "description": "A string value that identifies the portion of the list of containers to be returned with the next listing operation. The operation returns the NextMarker value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client.", + "x-ms-parameter-location": "method" + }, + "MaxResults": { + "name": "maxresults", + "in": "query", + "required": false, + "type": "integer", + "minimum": 1, + "x-ms-parameter-location": "method", + "description": "Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or than the default of 5000." + }, + "Metadata": { + "name": "x-ms-meta", + "x-ms-client-name": "metadata", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information.", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "Prefix": { + "name": "prefix", + "in": "query", + "required": false, + "type": "string", + "description": "Filters the results to return only containers whose name begins with the specified prefix.", + "x-ms-parameter-location": "method" + }, + "PrevSnapshot": { + "name": "prevsnapshot", + "in": "query", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Optional in version 2015-07-08 and newer. The prevsnapshot parameter is a DateTime value that specifies that the response will contain only pages that were changed between target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots are currently supported only for blobs created on or after January 1, 2016." + }, + "ProposedLeaseIdOptional": { + "name": "x-ms-proposed-lease-id", + "x-ms-client-name": "proposedLeaseId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string formats." + }, + "ProposedLeaseIdRequired": { + "name": "x-ms-proposed-lease-id", + "x-ms-client-name": "proposedLeaseId", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string formats." + }, + "Range": { + "name": "x-ms-range", + "x-ms-client-name": "range", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Return only the bytes of the blob in the specified range." + }, + "RangeRequiredPutPageFromUrl": { + "name": "x-ms-range", + "x-ms-client-name": "range", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The range of bytes to which the source range would be written. The range should be 512 aligned and range-end is required." + }, + "SequenceNumberAction": { + "name": "x-ms-sequence-number-action", + "x-ms-client-name": "sequenceNumberAction", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required if the x-ms-blob-sequence-number header is set for the request. This property applies to page blobs only. This property indicates how the service should modify the blob's sequence number", + "type": "string", + "enum": [ + "max", + "update", + "increment" + ], + "x-ms-enum": { + "name": "SequenceNumberActionType", + "modelAsString": false + } + }, + "Snapshot": { + "name": "snapshot", + "in": "query", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with blob snapshots, see Creating a Snapshot of a Blob." + }, + "SourceContentMD5": { + "name": "x-ms-source-content-md5", + "x-ms-client-name": "sourceContentMD5", + "in": "header", + "required": false, + "type": "string", + "format": "byte", + "x-ms-parameter-location": "method", + "description": "Specify the md5 calculated for the range of bytes that must be read from the copy source." + }, + "SourceRange": { + "name": "x-ms-source-range", + "x-ms-client-name": "sourceRange", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Bytes of source data in the specified range." + }, + "SourceRangeRequiredPutPageFromUrl": { + "name": "x-ms-source-range", + "x-ms-client-name": "sourceRange", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Bytes of source data in the specified range. The length of this range should match the ContentLength header and x-ms-range/Range destination range header." + }, + "SourceIfMatch": { + "name": "x-ms-source-if-match", + "x-ms-client-name": "sourceIfMatch", + "in": "header", + "required": false, + "type": "string", + "format": "etag", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "source-modified-access-conditions" + }, + "description": "Specify an ETag value to operate only on blobs with a matching value." + }, + "SourceIfModifiedSince": { + "name": "x-ms-source-if-modified-since", + "x-ms-client-name": "sourceIfModifiedSince", + "in": "header", + "required": false, + "type": "string", + "format": "date-time-rfc1123", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "source-modified-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has been modified since the specified date/time." + }, + "SourceIfNoneMatch": { + "name": "x-ms-source-if-none-match", + "x-ms-client-name": "sourceIfNoneMatch", + "in": "header", + "required": false, + "type": "string", + "format": "etag", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "source-modified-access-conditions" + }, + "description": "Specify an ETag value to operate only on blobs without a matching value." + }, + "SourceIfUnmodifiedSince": { + "name": "x-ms-source-if-unmodified-since", + "x-ms-client-name": "sourceIfUnmodifiedSince", + "in": "header", + "required": false, + "type": "string", + "format": "date-time-rfc1123", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "source-modified-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has not been modified since the specified date/time." + }, + "SourceLeaseId": { + "name": "x-ms-source-lease-id", + "x-ms-client-name": "sourceLeaseId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "A lease ID for the source path. If specified, the source path must have an active lease and the leaase ID must match." + }, + "SourceUrl": { + "name": "x-ms-copy-source", + "x-ms-client-name": "sourceUrl", + "in": "header", + "required": true, + "type": "string", + "format": "url", + "x-ms-parameter-location": "method", + "description": "Specify a URL to the copy source." + }, + "StorageServiceProperties": { + "name": "StorageServiceProperties", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/StorageServiceProperties" + }, + "x-ms-parameter-location": "method", + "description": "The StorageService properties." + }, + "Timeout": { + "name": "timeout", + "in": "query", + "required": false, + "type": "integer", + "minimum": 0, + "x-ms-parameter-location": "method", + "description": "The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations." + } + } +} \ No newline at end of file diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/highlevel.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/highlevel.go similarity index 78% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/highlevel.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/highlevel.go index aa022826bb18..18f9e54a836d 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/highlevel.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/highlevel.go @@ -3,7 +3,6 @@ package azblob import ( "context" "encoding/base64" - "fmt" "io" "net/http" @@ -12,10 +11,12 @@ import ( "sync" "time" + "errors" + "github.com/Azure/azure-pipeline-go/pipeline" ) -// CommonResponseHeaders returns the headers common to all blob REST API responses. +// CommonResponse returns the headers common to all blob REST API responses. type CommonResponse interface { // ETag returns the value for header ETag. ETag() ETag @@ -42,6 +43,7 @@ type UploadToBlockBlobOptions struct { BlockSize int64 // Progress is a function that is invoked periodically as bytes are sent to the BlockBlobURL. + // Note that the progress reporting is not always increasing; it can go down when retrying a request. Progress pipeline.ProgressReceiver // BlobHTTPHeaders indicates the HTTP headers to be associated with the blob. @@ -60,17 +62,25 @@ type UploadToBlockBlobOptions struct { // UploadBufferToBlockBlob uploads a buffer in blocks to a block blob. func UploadBufferToBlockBlob(ctx context.Context, b []byte, blockBlobURL BlockBlobURL, o UploadToBlockBlobOptions) (CommonResponse, error) { - - // Validate parameters and set defaults - if o.BlockSize < 0 || o.BlockSize > BlockBlobMaxUploadBlobBytes { - panic(fmt.Sprintf("BlockSize option must be > 0 and <= %d", BlockBlobMaxUploadBlobBytes)) - } + bufferSize := int64(len(b)) if o.BlockSize == 0 { - o.BlockSize = BlockBlobMaxUploadBlobBytes // Default if unspecified + // If bufferSize > (BlockBlobMaxStageBlockBytes * BlockBlobMaxBlocks), then error + if bufferSize > BlockBlobMaxStageBlockBytes*BlockBlobMaxBlocks { + return nil, errors.New("Buffer is too large to upload to a block blob") + } + // If bufferSize <= BlockBlobMaxUploadBlobBytes, then Upload should be used with just 1 I/O request + if bufferSize <= BlockBlobMaxUploadBlobBytes { + o.BlockSize = BlockBlobMaxUploadBlobBytes // Default if unspecified + } else { + o.BlockSize = bufferSize / BlockBlobMaxBlocks // buffer / max blocks = block size to use all 50,000 blocks + if o.BlockSize < BlobDefaultDownloadBlockSize { // If the block size is smaller than 4MB, round up to 4MB + o.BlockSize = BlobDefaultDownloadBlockSize + } + // StageBlock will be called with blockSize blocks and a parallelism of (BufferSize / BlockSize). + } } - size := int64(len(b)) - if size <= BlockBlobMaxUploadBlobBytes { + if bufferSize <= BlockBlobMaxUploadBlobBytes { // If the size can fit in 1 Upload call, do it this way var body io.ReadSeeker = bytes.NewReader(b) if o.Progress != nil { @@ -79,10 +89,7 @@ func UploadBufferToBlockBlob(ctx context.Context, b []byte, return blockBlobURL.Upload(ctx, body, o.BlobHTTPHeaders, o.Metadata, o.AccessConditions) } - var numBlocks = uint16(((size - 1) / o.BlockSize) + 1) - if numBlocks > BlockBlobMaxBlocks { - panic(fmt.Sprintf("The buffer's size is too big or the BlockSize is too small; the number of blocks must be <= %d", BlockBlobMaxBlocks)) - } + var numBlocks = uint16(((bufferSize - 1) / o.BlockSize) + 1) blockIDList := make([]string, numBlocks) // Base-64 encoded block IDs progress := int64(0) @@ -90,7 +97,7 @@ func UploadBufferToBlockBlob(ctx context.Context, b []byte, err := doBatchTransfer(ctx, batchTransferOptions{ operationName: "UploadBufferToBlockBlob", - transferSize: size, + transferSize: bufferSize, chunkSize: o.BlockSize, parallelism: o.Parallelism, operation: func(offset int64, count int64) error { @@ -115,7 +122,7 @@ func UploadBufferToBlockBlob(ctx context.Context, b []byte, // Block IDs are unique values to avoid issue if 2+ clients are uploading blocks // at the same time causing PutBlockList to get a mix of blocks from all the clients. blockIDList[blockNum] = base64.StdEncoding.EncodeToString(newUUID().bytes()) - _, err := blockBlobURL.StageBlock(ctx, blockIDList[blockNum], body, o.AccessConditions.LeaseAccessConditions) + _, err := blockBlobURL.StageBlock(ctx, blockIDList[blockNum], body, o.AccessConditions.LeaseAccessConditions, nil) return err }, }) @@ -147,10 +154,9 @@ func UploadFileToBlockBlob(ctx context.Context, file *os.File, /////////////////////////////////////////////////////////////////////////////// - const BlobDefaultDownloadBlockSize = int64(4 * 1024 * 1024) // 4MB -// DownloadFromAzureFileOptions identifies options used by the DownloadAzureFileToBuffer and DownloadAzureFileToFile functions. +// DownloadFromBlobOptions identifies options used by the DownloadBlobToBuffer and DownloadBlobToFile functions. type DownloadFromBlobOptions struct { // BlockSize specifies the block size to use for each parallel download; the default size is BlobDefaultDownloadBlockSize. BlockSize int64 @@ -168,32 +174,19 @@ type DownloadFromBlobOptions struct { RetryReaderOptionsPerBlock RetryReaderOptions } -// downloadAzureFileToBuffer downloads an Azure file to a buffer with parallel. +// downloadBlobToBuffer downloads an Azure blob to a buffer with parallel. func downloadBlobToBuffer(ctx context.Context, blobURL BlobURL, offset int64, count int64, - ac BlobAccessConditions, b []byte, o DownloadFromBlobOptions, - initialDownloadResponse *DownloadResponse) error { - // Validate parameters, and set defaults. - if o.BlockSize < 0 { - panic("BlockSize option must be >= 0") - } + b []byte, o DownloadFromBlobOptions, initialDownloadResponse *DownloadResponse) error { if o.BlockSize == 0 { o.BlockSize = BlobDefaultDownloadBlockSize } - if offset < 0 { - panic("offset option must be >= 0") - } - - if count < 0 { - panic("count option must be >= 0") - } - if count == CountToEnd { // If size not specified, calculate it if initialDownloadResponse != nil { count = initialDownloadResponse.ContentLength() - offset // if we have the length, use it } else { // If we don't have the length at all, get it - dr, err := blobURL.Download(ctx, 0, CountToEnd, ac, false) + dr, err := blobURL.Download(ctx, 0, CountToEnd, o.AccessConditions, false) if err != nil { return err } @@ -201,21 +194,20 @@ func downloadBlobToBuffer(ctx context.Context, blobURL BlobURL, offset int64, co } } - if int64(len(b)) < count { - panic(fmt.Errorf("the buffer's size should be equal to or larger than the request count of bytes: %d", count)) - } - // Prepare and do parallel download. progress := int64(0) progressLock := &sync.Mutex{} err := doBatchTransfer(ctx, batchTransferOptions{ operationName: "downloadBlobToBuffer", - transferSize: count, + transferSize: count, chunkSize: o.BlockSize, parallelism: o.Parallelism, operation: func(chunkStart int64, count int64) error { - dr, err := blobURL.Download(ctx, chunkStart+ offset, count, ac, false) + dr, err := blobURL.Download(ctx, chunkStart+offset, count, o.AccessConditions, false) + if err != nil { + return err + } body := dr.Body(o.RetryReaderOptionsPerBlock) if o.Progress != nil { rangeProgress := int64(0) @@ -241,29 +233,24 @@ func downloadBlobToBuffer(ctx context.Context, blobURL BlobURL, offset int64, co return nil } -// DownloadAzureFileToBuffer downloads an Azure file to a buffer with parallel. +// DownloadBlobToBuffer downloads an Azure blob to a buffer with parallel. // Offset and count are optional, pass 0 for both to download the entire blob. func DownloadBlobToBuffer(ctx context.Context, blobURL BlobURL, offset int64, count int64, - ac BlobAccessConditions, b []byte, o DownloadFromBlobOptions) error { - return downloadBlobToBuffer(ctx, blobURL, offset, count, ac, b, o, nil) + b []byte, o DownloadFromBlobOptions) error { + return downloadBlobToBuffer(ctx, blobURL, offset, count, b, o, nil) } -// DownloadBlobToFile downloads an Azure file to a local file. +// DownloadBlobToFile downloads an Azure blob to a local file. // The file would be truncated if the size doesn't match. // Offset and count are optional, pass 0 for both to download the entire blob. func DownloadBlobToFile(ctx context.Context, blobURL BlobURL, offset int64, count int64, - ac BlobAccessConditions, file *os.File, o DownloadFromBlobOptions) error { - // 1. Validate parameters. - if file == nil { - panic("file must not be nil") - } - - // 2. Calculate the size of the destination file + file *os.File, o DownloadFromBlobOptions) error { + // 1. Calculate the size of the destination file var size int64 if count == CountToEnd { - // Try to get Azure file's size - props, err := blobURL.GetProperties(ctx, ac) + // Try to get Azure blob's size + props, err := blobURL.GetProperties(ctx, o.AccessConditions) if err != nil { return err } @@ -272,7 +259,7 @@ func DownloadBlobToFile(ctx context.Context, blobURL BlobURL, offset int64, coun size = count } - // 3. Compare and try to resize local file's size if it doesn't match Azure file's size. + // 2. Compare and try to resize local file's size if it doesn't match Azure blob's size. stat, err := file.Stat() if err != nil { return err @@ -284,19 +271,18 @@ func DownloadBlobToFile(ctx context.Context, blobURL BlobURL, offset int64, coun } if size > 0 { - // 4. Set mmap and call DownloadAzureFileToBuffer. + // 3. Set mmap and call downloadBlobToBuffer. m, err := newMMF(file, true, 0, int(size)) if err != nil { return err } defer m.unmap() - return downloadBlobToBuffer(ctx, blobURL, offset, size, ac, m, o, nil) + return downloadBlobToBuffer(ctx, blobURL, offset, size, m, o, nil) } else { // if the blob's size is 0, there is no need in downloading it return nil } } - /////////////////////////////////////////////////////////////////////////////// // BatchTransferOptions identifies options used by doBatchTransfer. @@ -374,7 +360,10 @@ func UploadStreamToBlockBlob(ctx context.Context, reader io.Reader, blockBlobURL result, err := uploadStream(ctx, reader, UploadStreamOptions{BufferSize: o.BufferSize, MaxBuffers: o.MaxBuffers}, &uploadStreamToBlockBlobOptions{b: blockBlobURL, o: o, blockIDPrefix: newUUID()}) - return result.(CommonResponse), err + if err != nil { + return nil, err + } + return result.(CommonResponse), nil } type uploadStreamToBlockBlobOptions struct { @@ -390,13 +379,17 @@ func (t *uploadStreamToBlockBlobOptions) start(ctx context.Context) (interface{} } func (t *uploadStreamToBlockBlobOptions) chunk(ctx context.Context, num uint32, buffer []byte) error { - if num == 0 && len(buffer) < t.o.BufferSize { - // If whole payload fits in 1 block, don't stage it; End will upload it with 1 I/O operation + if num == 0 { t.firstBlock = buffer - return nil + + // If whole payload fits in 1 block, don't stage it; End will upload it with 1 I/O operation + // If the payload is exactly the same size as the buffer, there may be more content coming in. + if len(buffer) < t.o.BufferSize { + return nil + } } // Else, upload a staged block... - AtomicMorphUint32(&t.maxBlockNum, func(startVal uint32) (val uint32, morphResult interface{}) { + atomicMorphUint32(&t.maxBlockNum, func(startVal uint32) (val uint32, morphResult interface{}) { // Atomically remember (in t.numBlocks) the maximum block num we've ever seen if startVal < num { return num, nil @@ -404,19 +397,21 @@ func (t *uploadStreamToBlockBlobOptions) chunk(ctx context.Context, num uint32, return startVal, nil }) blockID := newUuidBlockID(t.blockIDPrefix).WithBlockNumber(num).ToBase64() - _, err := t.b.StageBlock(ctx, blockID, bytes.NewReader(buffer), LeaseAccessConditions{}) + _, err := t.b.StageBlock(ctx, blockID, bytes.NewReader(buffer), LeaseAccessConditions{}, nil) return err } func (t *uploadStreamToBlockBlobOptions) end(ctx context.Context) (interface{}, error) { - if t.maxBlockNum == 0 { + // If the first block had the exact same size as the buffer + // we would have staged it as a block thinking that there might be more data coming + if t.maxBlockNum == 0 && len(t.firstBlock) != t.o.BufferSize { // If whole payload fits in 1 block (block #0), upload it with 1 I/O operation return t.b.Upload(ctx, bytes.NewReader(t.firstBlock), t.o.BlobHTTPHeaders, t.o.Metadata, t.o.AccessConditions) } // Multiple blocks staged, commit them all now blockID := newUuidBlockID(t.blockIDPrefix) - blockIDs := make([]string, t.maxBlockNum + 1) + blockIDs := make([]string, t.maxBlockNum+1) for bn := uint32(0); bn <= t.maxBlockNum; bn++ { blockIDs[bn] = blockID.WithBlockNumber(bn).ToBase64() } @@ -436,7 +431,28 @@ type UploadStreamOptions struct { BufferSize int } +type firstErr struct { + lock sync.Mutex + finalError error +} + +func (fe *firstErr) set(err error) { + fe.lock.Lock() + if fe.finalError == nil { + fe.finalError = err + } + fe.lock.Unlock() +} + +func (fe *firstErr) get() (err error) { + fe.lock.Lock() + err = fe.finalError + fe.lock.Unlock() + return +} + func uploadStream(ctx context.Context, reader io.Reader, o UploadStreamOptions, t iTransfer) (interface{}, error) { + firstErr := firstErr{} ctx, cancel := context.WithCancel(ctx) // New context so that any failure cancels everything defer cancel() wg := sync.WaitGroup{} // Used to know when all outgoing messages have finished processing @@ -463,9 +479,12 @@ func uploadStream(ctx context.Context, reader io.Reader, o UploadStreamOptions, err := t.chunk(ctx, outgoingMsg.chunkNum, outgoingMsg.buffer) wg.Done() // Indicate this buffer was sent if nil != err { + // NOTE: finalErr could be assigned to multiple times here which is OK, + // some error will be returned. + firstErr.set(err) cancel() } - incoming <- outgoingMsg.buffer // The goroutine reading from the stream can use reuse this buffer now + incoming <- outgoingMsg.buffer // The goroutine reading from the stream can reuse this buffer now } }() } @@ -490,7 +509,7 @@ func uploadStream(ctx context.Context, reader io.Reader, o UploadStreamOptions, buffer = <-incoming } n, err := io.ReadFull(reader, buffer) - if err != nil { + if err != nil { // Less than len(buffer) bytes were read buffer = buffer[:n] // Make slice match the # of read bytes } if len(buffer) > 0 { @@ -499,12 +518,21 @@ func uploadStream(ctx context.Context, reader io.Reader, o UploadStreamOptions, outgoing <- OutgoingMsg{chunkNum: c, buffer: buffer} } if err != nil { // The reader is done, no more outgoing buffers + if err == io.EOF || err == io.ErrUnexpectedEOF { + err = nil // This function does NOT return an error if io.ReadFull returns io.EOF or io.ErrUnexpectedEOF + } else { + firstErr.set(err) + } break } } // NOTE: Don't close the incoming channel because the outgoing goroutines post buffers into it when they are done close(outgoing) // Make all the outgoing goroutines terminate when this channel is empty wg.Wait() // Wait for all pending outgoing messages to complete - // After all blocks uploaded, commit them to the blob & return the result - return t.end(ctx) + err := firstErr.get() + if err == nil { + // If no error, after all blocks uploaded, commit them to the blob & return the result + return t.end(ctx) + } + return nil, err } diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/parsing_urls.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/parsing_urls.go new file mode 100644 index 000000000000..067939b1a42f --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/parsing_urls.go @@ -0,0 +1,153 @@ +package azblob + +import ( + "net" + "net/url" + "strings" +) + +const ( + snapshot = "snapshot" + SnapshotTimeFormat = "2006-01-02T15:04:05.0000000Z07:00" +) + +// A BlobURLParts object represents the components that make up an Azure Storage Container/Blob URL. You parse an +// existing URL into its parts by calling NewBlobURLParts(). You construct a URL from parts by calling URL(). +// NOTE: Changing any SAS-related field requires computing a new SAS signature. +type BlobURLParts struct { + Scheme string // Ex: "https://" + Host string // Ex: "account.blob.core.windows.net", "10.132.141.33", "10.132.141.33:80" + IPEndpointStyleInfo IPEndpointStyleInfo + ContainerName string // "" if no container + BlobName string // "" if no blob + Snapshot string // "" if not a snapshot + SAS SASQueryParameters + UnparsedParams string +} + +// IPEndpointStyleInfo is used for IP endpoint style URL when working with Azure storage emulator. +// Ex: "https://10.132.141.33/accountname/containername" +type IPEndpointStyleInfo struct { + AccountName string // "" if not using IP endpoint style +} + +// isIPEndpointStyle checkes if URL's host is IP, in this case the storage account endpoint will be composed as: +// http(s)://IP(:port)/storageaccount/container/... +// As url's Host property, host could be both host or host:port +func isIPEndpointStyle(host string) bool { + if host == "" { + return false + } + if h, _, err := net.SplitHostPort(host); err == nil { + host = h + } + // For IPv6, there could be case where SplitHostPort fails for cannot finding port. + // In this case, eliminate the '[' and ']' in the URL. + // For details about IPv6 URL, please refer to https://tools.ietf.org/html/rfc2732 + if host[0] == '[' && host[len(host)-1] == ']' { + host = host[1 : len(host)-1] + } + return net.ParseIP(host) != nil +} + +// NewBlobURLParts parses a URL initializing BlobURLParts' fields including any SAS-related & snapshot query parameters. Any other +// query parameters remain in the UnparsedParams field. This method overwrites all fields in the BlobURLParts object. +func NewBlobURLParts(u url.URL) BlobURLParts { + up := BlobURLParts{ + Scheme: u.Scheme, + Host: u.Host, + } + + // Find the container & blob names (if any) + if u.Path != "" { + path := u.Path + if path[0] == '/' { + path = path[1:] // If path starts with a slash, remove it + } + if isIPEndpointStyle(up.Host) { + if accountEndIndex := strings.Index(path, "/"); accountEndIndex == -1 { // Slash not found; path has account name & no container name or blob + up.IPEndpointStyleInfo.AccountName = path + } else { + up.IPEndpointStyleInfo.AccountName = path[:accountEndIndex] // The account name is the part between the slashes + path = path[accountEndIndex+1:] // path refers to portion after the account name now (container & blob names) + } + } + + containerEndIndex := strings.Index(path, "/") // Find the next slash (if it exists) + if containerEndIndex == -1 { // Slash not found; path has container name & no blob name + up.ContainerName = path + } else { + up.ContainerName = path[:containerEndIndex] // The container name is the part between the slashes + up.BlobName = path[containerEndIndex+1:] // The blob name is after the container slash + } + } + + // Convert the query parameters to a case-sensitive map & trim whitespace + paramsMap := u.Query() + + up.Snapshot = "" // Assume no snapshot + if snapshotStr, ok := caseInsensitiveValues(paramsMap).Get(snapshot); ok { + up.Snapshot = snapshotStr[0] + // If we recognized the query parameter, remove it from the map + delete(paramsMap, snapshot) + } + up.SAS = newSASQueryParameters(paramsMap, true) + up.UnparsedParams = paramsMap.Encode() + return up +} + +type caseInsensitiveValues url.Values // map[string][]string +func (values caseInsensitiveValues) Get(key string) ([]string, bool) { + key = strings.ToLower(key) + for k, v := range values { + if strings.ToLower(k) == key { + return v, true + } + } + return []string{}, false +} + +// URL returns a URL object whose fields are initialized from the BlobURLParts fields. The URL's RawQuery +// field contains the SAS, snapshot, and unparsed query parameters. +func (up BlobURLParts) URL() url.URL { + path := "" + if isIPEndpointStyle(up.Host) && up.IPEndpointStyleInfo.AccountName != "" { + path += "/" + up.IPEndpointStyleInfo.AccountName + } + // Concatenate container & blob names (if they exist) + if up.ContainerName != "" { + path += "/" + up.ContainerName + if up.BlobName != "" { + path += "/" + up.BlobName + } + } + + rawQuery := up.UnparsedParams + + //If no snapshot is initially provided, fill it in from the SAS query properties to help the user + if up.Snapshot == "" && !up.SAS.snapshotTime.IsZero() { + up.Snapshot = up.SAS.snapshotTime.Format(SnapshotTimeFormat) + } + + // Concatenate blob snapshot query parameter (if it exists) + if up.Snapshot != "" { + if len(rawQuery) > 0 { + rawQuery += "&" + } + rawQuery += snapshot + "=" + up.Snapshot + } + sas := up.SAS.Encode() + if sas != "" { + if len(rawQuery) > 0 { + rawQuery += "&" + } + rawQuery += sas + } + u := url.URL{ + Scheme: up.Scheme, + Host: up.Host, + Path: path, + RawQuery: rawQuery, + } + return u +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/sas_service.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/sas_service.go new file mode 100644 index 000000000000..4d45d3ec7775 --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/sas_service.go @@ -0,0 +1,256 @@ +package azblob + +import ( + "bytes" + "fmt" + "strings" + "time" +) + +// BlobSASSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage container or blob. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/constructing-a-service-sas +type BlobSASSignatureValues struct { + Version string `param:"sv"` // If not specified, this defaults to SASVersion + Protocol SASProtocol `param:"spr"` // See the SASProtocol* constants + StartTime time.Time `param:"st"` // Not specified if IsZero + ExpiryTime time.Time `param:"se"` // Not specified if IsZero + SnapshotTime time.Time + Permissions string `param:"sp"` // Create by initializing a ContainerSASPermissions or BlobSASPermissions and then call String() + IPRange IPRange `param:"sip"` + Identifier string `param:"si"` + ContainerName string + BlobName string // Use "" to create a Container SAS + CacheControl string // rscc + ContentDisposition string // rscd + ContentEncoding string // rsce + ContentLanguage string // rscl + ContentType string // rsct +} + +// NewSASQueryParameters uses an account's StorageAccountCredential to sign this signature values to produce +// the proper SAS query parameters. +// See: StorageAccountCredential. Compatible with both UserDelegationCredential and SharedKeyCredential +func (v BlobSASSignatureValues) NewSASQueryParameters(credential StorageAccountCredential) (SASQueryParameters, error) { + resource := "c" + if credential == nil { + return SASQueryParameters{}, fmt.Errorf("cannot sign SAS query without StorageAccountCredential") + } + + if !v.SnapshotTime.IsZero() { + resource = "bs" + //Make sure the permission characters are in the correct order + perms := &BlobSASPermissions{} + if err := perms.Parse(v.Permissions); err != nil { + return SASQueryParameters{}, err + } + v.Permissions = perms.String() + } else if v.BlobName == "" { + // Make sure the permission characters are in the correct order + perms := &ContainerSASPermissions{} + if err := perms.Parse(v.Permissions); err != nil { + return SASQueryParameters{}, err + } + v.Permissions = perms.String() + } else { + resource = "b" + // Make sure the permission characters are in the correct order + perms := &BlobSASPermissions{} + if err := perms.Parse(v.Permissions); err != nil { + return SASQueryParameters{}, err + } + v.Permissions = perms.String() + } + if v.Version == "" { + v.Version = SASVersion + } + startTime, expiryTime, snapshotTime := FormatTimesForSASSigning(v.StartTime, v.ExpiryTime, v.SnapshotTime) + + signedIdentifier := v.Identifier + + udk := credential.getUDKParams() + + if udk != nil { + udkStart, udkExpiry, _ := FormatTimesForSASSigning(udk.SignedStart, udk.SignedExpiry, time.Time{}) + //I don't like this answer to combining the functions + //But because signedIdentifier and the user delegation key strings share a place, this is an _OK_ way to do it. + signedIdentifier = strings.Join([]string{ + udk.SignedOid, + udk.SignedTid, + udkStart, + udkExpiry, + udk.SignedService, + udk.SignedVersion, + }, "\n") + } + + // String to sign: http://msdn.microsoft.com/en-us/library/azure/dn140255.aspx + stringToSign := strings.Join([]string{ + v.Permissions, + startTime, + expiryTime, + getCanonicalName(credential.AccountName(), v.ContainerName, v.BlobName), + signedIdentifier, + v.IPRange.String(), + string(v.Protocol), + v.Version, + resource, + snapshotTime, // signed timestamp + v.CacheControl, // rscc + v.ContentDisposition, // rscd + v.ContentEncoding, // rsce + v.ContentLanguage, // rscl + v.ContentType}, // rsct + "\n") + + signature := "" + signature = credential.ComputeHMACSHA256(stringToSign) + + p := SASQueryParameters{ + // Common SAS parameters + version: v.Version, + protocol: v.Protocol, + startTime: v.StartTime, + expiryTime: v.ExpiryTime, + permissions: v.Permissions, + ipRange: v.IPRange, + + // Container/Blob-specific SAS parameters + resource: resource, + identifier: v.Identifier, + cacheControl: v.CacheControl, + contentDisposition: v.ContentDisposition, + contentEncoding: v.ContentEncoding, + contentLanguage: v.ContentLanguage, + contentType: v.ContentType, + snapshotTime: v.SnapshotTime, + + // Calculated SAS signature + signature: signature, + } + + //User delegation SAS specific parameters + if udk != nil { + p.signedOid = udk.SignedOid + p.signedTid = udk.SignedTid + p.signedStart = udk.SignedStart + p.signedExpiry = udk.SignedExpiry + p.signedService = udk.SignedService + p.signedVersion = udk.SignedVersion + } + + return p, nil +} + +// getCanonicalName computes the canonical name for a container or blob resource for SAS signing. +func getCanonicalName(account string, containerName string, blobName string) string { + // Container: "/blob/account/containername" + // Blob: "/blob/account/containername/blobname" + elements := []string{"/blob/", account, "/", containerName} + if blobName != "" { + elements = append(elements, "/", strings.Replace(blobName, "\\", "/", -1)) + } + return strings.Join(elements, "") +} + +// The ContainerSASPermissions type simplifies creating the permissions string for an Azure Storage container SAS. +// Initialize an instance of this type and then call its String method to set BlobSASSignatureValues's Permissions field. +type ContainerSASPermissions struct { + Read, Add, Create, Write, Delete, List bool +} + +// String produces the SAS permissions string for an Azure Storage container. +// Call this method to set BlobSASSignatureValues's Permissions field. +func (p ContainerSASPermissions) String() string { + var b bytes.Buffer + if p.Read { + b.WriteRune('r') + } + if p.Add { + b.WriteRune('a') + } + if p.Create { + b.WriteRune('c') + } + if p.Write { + b.WriteRune('w') + } + if p.Delete { + b.WriteRune('d') + } + if p.List { + b.WriteRune('l') + } + return b.String() +} + +// Parse initializes the ContainerSASPermissions's fields from a string. +func (p *ContainerSASPermissions) Parse(s string) error { + *p = ContainerSASPermissions{} // Clear the flags + for _, r := range s { + switch r { + case 'r': + p.Read = true + case 'a': + p.Add = true + case 'c': + p.Create = true + case 'w': + p.Write = true + case 'd': + p.Delete = true + case 'l': + p.List = true + default: + return fmt.Errorf("Invalid permission: '%v'", r) + } + } + return nil +} + +// The BlobSASPermissions type simplifies creating the permissions string for an Azure Storage blob SAS. +// Initialize an instance of this type and then call its String method to set BlobSASSignatureValues's Permissions field. +type BlobSASPermissions struct{ Read, Add, Create, Write, Delete bool } + +// String produces the SAS permissions string for an Azure Storage blob. +// Call this method to set BlobSASSignatureValues's Permissions field. +func (p BlobSASPermissions) String() string { + var b bytes.Buffer + if p.Read { + b.WriteRune('r') + } + if p.Add { + b.WriteRune('a') + } + if p.Create { + b.WriteRune('c') + } + if p.Write { + b.WriteRune('w') + } + if p.Delete { + b.WriteRune('d') + } + return b.String() +} + +// Parse initializes the BlobSASPermissions's fields from a string. +func (p *BlobSASPermissions) Parse(s string) error { + *p = BlobSASPermissions{} // Clear the flags + for _, r := range s { + switch r { + case 'r': + p.Read = true + case 'a': + p.Add = true + case 'c': + p.Create = true + case 'w': + p.Write = true + case 'd': + p.Delete = true + default: + return fmt.Errorf("Invalid permission: '%v'", r) + } + } + return nil +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/service_codes_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/service_codes_blob.go similarity index 100% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/service_codes_blob.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/service_codes_blob.go diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/storage_account_credential.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/storage_account_credential.go new file mode 100644 index 000000000000..b89b18bb4112 --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/storage_account_credential.go @@ -0,0 +1,8 @@ +package azblob + +// StorageAccountCredential is a wrapper interface for SharedKeyCredential and UserDelegationCredential +type StorageAccountCredential interface { + AccountName() string + ComputeHMACSHA256(message string) (base64String string) + getUDKParams() *UserDelegationKey +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_append_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_append_blob.go new file mode 100644 index 000000000000..b6bd6af112bc --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_append_blob.go @@ -0,0 +1,128 @@ +package azblob + +import ( + "context" + "io" + "net/url" + + "github.com/Azure/azure-pipeline-go/pipeline" +) + +const ( + // AppendBlobMaxAppendBlockBytes indicates the maximum number of bytes that can be sent in a call to AppendBlock. + AppendBlobMaxAppendBlockBytes = 4 * 1024 * 1024 // 4MB + + // AppendBlobMaxBlocks indicates the maximum number of blocks allowed in an append blob. + AppendBlobMaxBlocks = 50000 +) + +// AppendBlobURL defines a set of operations applicable to append blobs. +type AppendBlobURL struct { + BlobURL + abClient appendBlobClient +} + +// NewAppendBlobURL creates an AppendBlobURL object using the specified URL and request policy pipeline. +func NewAppendBlobURL(url url.URL, p pipeline.Pipeline) AppendBlobURL { + blobClient := newBlobClient(url, p) + abClient := newAppendBlobClient(url, p) + return AppendBlobURL{BlobURL: BlobURL{blobClient: blobClient}, abClient: abClient} +} + +// WithPipeline creates a new AppendBlobURL object identical to the source but with the specific request policy pipeline. +func (ab AppendBlobURL) WithPipeline(p pipeline.Pipeline) AppendBlobURL { + return NewAppendBlobURL(ab.blobClient.URL(), p) +} + +// WithSnapshot creates a new AppendBlobURL object identical to the source but with the specified snapshot timestamp. +// Pass "" to remove the snapshot returning a URL to the base blob. +func (ab AppendBlobURL) WithSnapshot(snapshot string) AppendBlobURL { + p := NewBlobURLParts(ab.URL()) + p.Snapshot = snapshot + return NewAppendBlobURL(p.URL(), ab.blobClient.Pipeline()) +} + +// Create creates a 0-length append blob. Call AppendBlock to append data to an append blob. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. +func (ab AppendBlobURL) Create(ctx context.Context, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*AppendBlobCreateResponse, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch := ac.ModifiedAccessConditions.pointers() + return ab.abClient.Create(ctx, 0, nil, + &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, + &h.CacheControl, metadata, ac.LeaseAccessConditions.pointers(), &h.ContentDisposition, + ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, nil) +} + +// AppendBlock writes a stream to a new block of data to the end of the existing append blob. +// This method panics if the stream is not at position 0. +// Note that the http client closes the body stream after the request is sent to the service. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block. +func (ab AppendBlobURL) AppendBlock(ctx context.Context, body io.ReadSeeker, ac AppendBlobAccessConditions, transactionalMD5 []byte) (*AppendBlobAppendBlockResponse, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() + ifAppendPositionEqual, ifMaxSizeLessThanOrEqual := ac.AppendPositionAccessConditions.pointers() + count, err := validateSeekableStreamAt0AndGetCount(body) + if err != nil { + return nil, err + } + return ab.abClient.AppendBlock(ctx, body, count, nil, + transactionalMD5, ac.LeaseAccessConditions.pointers(), + ifMaxSizeLessThanOrEqual, ifAppendPositionEqual, + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) +} + +// AppendBlockFromURL copies a new block of data from source URL to the end of the existing append blob. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block-from-url. +func (ab AppendBlobURL) AppendBlockFromURL(ctx context.Context, sourceURL url.URL, offset int64, count int64, destinationAccessConditions AppendBlobAccessConditions, sourceAccessConditions ModifiedAccessConditions, transactionalMD5 []byte) (*AppendBlobAppendBlockFromURLResponse, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := destinationAccessConditions.ModifiedAccessConditions.pointers() + sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatchETag, sourceIfNoneMatchETag := sourceAccessConditions.pointers() + ifAppendPositionEqual, ifMaxSizeLessThanOrEqual := destinationAccessConditions.AppendPositionAccessConditions.pointers() + return ab.abClient.AppendBlockFromURL(ctx, sourceURL.String(), 0, httpRange{offset: offset, count: count}.pointers(), + transactionalMD5, nil, destinationAccessConditions.LeaseAccessConditions.pointers(), + ifMaxSizeLessThanOrEqual, ifAppendPositionEqual, + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatchETag, sourceIfNoneMatchETag, nil) +} + +type AppendBlobAccessConditions struct { + ModifiedAccessConditions + LeaseAccessConditions + AppendPositionAccessConditions +} + +// AppendPositionAccessConditions identifies append blob-specific access conditions which you optionally set. +type AppendPositionAccessConditions struct { + // IfAppendPositionEqual ensures that the AppendBlock operation succeeds + // only if the append position is equal to a value. + // IfAppendPositionEqual=0 means no 'IfAppendPositionEqual' header specified. + // IfAppendPositionEqual>0 means 'IfAppendPositionEqual' header specified with its value + // IfAppendPositionEqual==-1 means IfAppendPositionEqual' header specified with a value of 0 + IfAppendPositionEqual int64 + + // IfMaxSizeLessThanOrEqual ensures that the AppendBlock operation succeeds + // only if the append blob's size is less than or equal to a value. + // IfMaxSizeLessThanOrEqual=0 means no 'IfMaxSizeLessThanOrEqual' header specified. + // IfMaxSizeLessThanOrEqual>0 means 'IfMaxSizeLessThanOrEqual' header specified with its value + // IfMaxSizeLessThanOrEqual==-1 means 'IfMaxSizeLessThanOrEqual' header specified with a value of 0 + IfMaxSizeLessThanOrEqual int64 +} + +// pointers is for internal infrastructure. It returns the fields as pointers. +func (ac AppendPositionAccessConditions) pointers() (iape *int64, imsltoe *int64) { + var zero int64 // defaults to 0 + switch ac.IfAppendPositionEqual { + case -1: + iape = &zero + case 0: + iape = nil + default: + iape = &ac.IfAppendPositionEqual + } + + switch ac.IfMaxSizeLessThanOrEqual { + case -1: + imsltoe = &zero + case 0: + imsltoe = nil + default: + imsltoe = &ac.IfMaxSizeLessThanOrEqual + } + return +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_blob.go similarity index 90% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_blob.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/url_blob.go index 96d85cbfd8d3..41d13402c99d 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_blob.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_blob.go @@ -14,9 +14,6 @@ type BlobURL struct { // NewBlobURL creates a BlobURL object using the specified URL and request policy pipeline. func NewBlobURL(url url.URL, p pipeline.Pipeline) BlobURL { - if p == nil { - panic("p can't be nil") - } blobClient := newBlobClient(url, p) return BlobURL{blobClient: blobClient} } @@ -34,9 +31,6 @@ func (b BlobURL) String() string { // WithPipeline creates a new BlobURL object identical to the source but with the specified request policy pipeline. func (b BlobURL) WithPipeline(p pipeline.Pipeline) BlobURL { - if p == nil { - panic("p can't be nil") - } return NewBlobURL(b.blobClient.URL(), p) } @@ -64,13 +58,14 @@ func (b BlobURL) ToPageBlobURL() PageBlobURL { } // DownloadBlob reads a range of bytes from a blob. The response also includes the blob's properties and metadata. +// Passing azblob.CountToEnd (0) for count will download the blob from the offset to the end. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob. func (b BlobURL) Download(ctx context.Context, offset int64, count int64, ac BlobAccessConditions, rangeGetContentMD5 bool) (*DownloadResponse, error) { var xRangeGetContentMD5 *bool if rangeGetContentMD5 { xRangeGetContentMD5 = &rangeGetContentMD5 } - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() dr, err := b.blobClient.Download(ctx, nil, nil, httpRange{offset: offset, count: count}.pointers(), ac.LeaseAccessConditions.pointers(), xRangeGetContentMD5, @@ -90,7 +85,7 @@ func (b BlobURL) Download(ctx context.Context, offset int64, count int64, ac Blo // Note that deleting a blob also deletes all its snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob. func (b BlobURL) Delete(ctx context.Context, deleteOptions DeleteSnapshotsOptionType, ac BlobAccessConditions) (*BlobDeleteResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() return b.blobClient.Delete(ctx, nil, nil, ac.LeaseAccessConditions.pointers(), deleteOptions, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) } @@ -107,14 +102,14 @@ func (b BlobURL) Undelete(ctx context.Context) (*BlobUndeleteResponse, error) { // bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation // does not update the blob's ETag. // For detailed information about block blob level tiering see https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers. -func (b BlobURL) SetTier(ctx context.Context, tier AccessTierType) (*BlobSetTierResponse, error) { - return b.blobClient.SetTier(ctx, tier, nil, nil) +func (b BlobURL) SetTier(ctx context.Context, tier AccessTierType, lac LeaseAccessConditions) (*BlobSetTierResponse, error) { + return b.blobClient.SetTier(ctx, tier, nil, nil, lac.pointers()) } // GetBlobProperties returns the blob's properties. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties. func (b BlobURL) GetProperties(ctx context.Context, ac BlobAccessConditions) (*BlobGetPropertiesResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() return b.blobClient.GetProperties(ctx, nil, nil, ac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) } @@ -122,7 +117,7 @@ func (b BlobURL) GetProperties(ctx context.Context, ac BlobAccessConditions) (*B // SetBlobHTTPHeaders changes a blob's HTTP headers. // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. func (b BlobURL) SetHTTPHeaders(ctx context.Context, h BlobHTTPHeaders, ac BlobAccessConditions) (*BlobSetHTTPHeadersResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() return b.blobClient.SetHTTPHeaders(ctx, nil, &h.CacheControl, &h.ContentType, h.ContentMD5, &h.ContentEncoding, &h.ContentLanguage, ac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, @@ -132,7 +127,7 @@ func (b BlobURL) SetHTTPHeaders(ctx context.Context, h BlobHTTPHeaders, ac BlobA // SetBlobMetadata changes a blob's metadata. // https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata. func (b BlobURL) SetMetadata(ctx context.Context, metadata Metadata, ac BlobAccessConditions) (*BlobSetMetadataResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() return b.blobClient.SetMetadata(ctx, nil, metadata, ac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) } @@ -143,14 +138,14 @@ func (b BlobURL) CreateSnapshot(ctx context.Context, metadata Metadata, ac BlobA // CreateSnapshot does NOT panic if the user tries to create a snapshot using a URL that already has a snapshot query parameter // because checking this would be a performance hit for a VERY unusual path and I don't think the common case should suffer this // performance hit. - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() return b.blobClient.CreateSnapshot(ctx, nil, metadata, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, ac.LeaseAccessConditions.pointers(), nil) } // AcquireLease acquires a lease on the blob for write and delete operations. The lease duration must be between // 15 to 60 seconds, or infinite (-1). // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) AcquireLease(ctx context.Context, proposedID string, duration int32, ac HTTPAccessConditions) (*BlobAcquireLeaseResponse, error) { +func (b BlobURL) AcquireLease(ctx context.Context, proposedID string, duration int32, ac ModifiedAccessConditions) (*BlobAcquireLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() return b.blobClient.AcquireLease(ctx, nil, &duration, &proposedID, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) @@ -158,7 +153,7 @@ func (b BlobURL) AcquireLease(ctx context.Context, proposedID string, duration i // RenewLease renews the blob's previously-acquired lease. // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) RenewLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*BlobRenewLeaseResponse, error) { +func (b BlobURL) RenewLease(ctx context.Context, leaseID string, ac ModifiedAccessConditions) (*BlobRenewLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() return b.blobClient.RenewLease(ctx, leaseID, nil, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) @@ -166,7 +161,7 @@ func (b BlobURL) RenewLease(ctx context.Context, leaseID string, ac HTTPAccessCo // ReleaseLease releases the blob's previously-acquired lease. // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) ReleaseLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*BlobReleaseLeaseResponse, error) { +func (b BlobURL) ReleaseLease(ctx context.Context, leaseID string, ac ModifiedAccessConditions) (*BlobReleaseLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() return b.blobClient.ReleaseLease(ctx, leaseID, nil, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) @@ -175,7 +170,7 @@ func (b BlobURL) ReleaseLease(ctx context.Context, leaseID string, ac HTTPAccess // BreakLease breaks the blob's previously-acquired lease (if it exists). Pass the LeaseBreakDefault (-1) // constant to break a fixed-duration lease when it expires or an infinite lease immediately. // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) BreakLease(ctx context.Context, breakPeriodInSeconds int32, ac HTTPAccessConditions) (*BlobBreakLeaseResponse, error) { +func (b BlobURL) BreakLease(ctx context.Context, breakPeriodInSeconds int32, ac ModifiedAccessConditions) (*BlobBreakLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() return b.blobClient.BreakLease(ctx, nil, leasePeriodPointer(breakPeriodInSeconds), ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) @@ -183,7 +178,7 @@ func (b BlobURL) BreakLease(ctx context.Context, breakPeriodInSeconds int32, ac // ChangeLease changes the blob's lease ID. // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) ChangeLease(ctx context.Context, leaseID string, proposedID string, ac HTTPAccessConditions) (*BlobChangeLeaseResponse, error) { +func (b BlobURL) ChangeLease(ctx context.Context, leaseID string, proposedID string, ac ModifiedAccessConditions) (*BlobChangeLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() return b.blobClient.ChangeLease(ctx, leaseID, proposedID, nil, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) @@ -201,10 +196,9 @@ func leasePeriodPointer(period int32) (p *int32) { // StartCopyFromURL copies the data at the source URL to a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob. -func (b BlobURL) StartCopyFromURL(ctx context.Context, source url.URL, metadata Metadata, srcac BlobAccessConditions, dstac BlobAccessConditions) (*BlobStartCopyFromURLResponse, error) { - srcIfModifiedSince, srcIfUnmodifiedSince, srcIfMatchETag, srcIfNoneMatchETag := srcac.HTTPAccessConditions.pointers() - dstIfModifiedSince, dstIfUnmodifiedSince, dstIfMatchETag, dstIfNoneMatchETag := dstac.HTTPAccessConditions.pointers() - srcLeaseID := srcac.LeaseAccessConditions.pointers() +func (b BlobURL) StartCopyFromURL(ctx context.Context, source url.URL, metadata Metadata, srcac ModifiedAccessConditions, dstac BlobAccessConditions) (*BlobStartCopyFromURLResponse, error) { + srcIfModifiedSince, srcIfUnmodifiedSince, srcIfMatchETag, srcIfNoneMatchETag := srcac.pointers() + dstIfModifiedSince, dstIfUnmodifiedSince, dstIfMatchETag, dstIfNoneMatchETag := dstac.ModifiedAccessConditions.pointers() dstLeaseID := dstac.LeaseAccessConditions.pointers() return b.blobClient.StartCopyFromURL(ctx, source.String(), nil, metadata, @@ -212,7 +206,7 @@ func (b BlobURL) StartCopyFromURL(ctx context.Context, source url.URL, metadata srcIfMatchETag, srcIfNoneMatchETag, dstIfModifiedSince, dstIfUnmodifiedSince, dstIfMatchETag, dstIfNoneMatchETag, - dstLeaseID, srcLeaseID, nil) + dstLeaseID, nil) } // AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata. diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_block_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_block_blob.go similarity index 84% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_block_blob.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/url_block_blob.go index ec7028558763..25a9b324fc8c 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_block_blob.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_block_blob.go @@ -12,7 +12,7 @@ import ( ) const ( - // BlockBlobMaxPutBlobBytes indicates the maximum number of bytes that can be sent in a call to Upload. + // BlockBlobMaxUploadBlobBytes indicates the maximum number of bytes that can be sent in a call to Upload. BlockBlobMaxUploadBlobBytes = 256 * 1024 * 1024 // 256MB // BlockBlobMaxStageBlockBytes indicates the maximum number of bytes that can be sent in a call to StageBlock. @@ -30,9 +30,6 @@ type BlockBlobURL struct { // NewBlockBlobURL creates a BlockBlobURL object using the specified URL and request policy pipeline. func NewBlockBlobURL(url url.URL, p pipeline.Pipeline) BlockBlobURL { - if p == nil { - panic("p can't be nil") - } blobClient := newBlobClient(url, p) bbClient := newBlockBlobClient(url, p) return BlockBlobURL{BlobURL: BlobURL{blobClient: blobClient}, bbClient: bbClient} @@ -59,8 +56,12 @@ func (bb BlockBlobURL) WithSnapshot(snapshot string) BlockBlobURL { // Note that the http client closes the body stream after the request is sent to the service. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. func (bb BlockBlobURL) Upload(ctx context.Context, body io.ReadSeeker, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*BlockBlobUploadResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return bb.bbClient.Upload(ctx, body, validateSeekableStreamAt0AndGetCount(body), nil, + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() + count, err := validateSeekableStreamAt0AndGetCount(body) + if err != nil { + return nil, err + } + return bb.bbClient.Upload(ctx, body, count, nil, &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, &h.CacheControl, metadata, ac.LeaseAccessConditions.pointers(), &h.ContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, @@ -70,16 +71,20 @@ func (bb BlockBlobURL) Upload(ctx context.Context, body io.ReadSeeker, h BlobHTT // StageBlock uploads the specified block to the block blob's "staging area" to be later committed by a call to CommitBlockList. // Note that the http client closes the body stream after the request is sent to the service. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block. -func (bb BlockBlobURL) StageBlock(ctx context.Context, base64BlockID string, body io.ReadSeeker, ac LeaseAccessConditions) (*BlockBlobStageBlockResponse, error) { - return bb.bbClient.StageBlock(ctx, base64BlockID, validateSeekableStreamAt0AndGetCount(body), body, nil, ac.pointers(), nil) +func (bb BlockBlobURL) StageBlock(ctx context.Context, base64BlockID string, body io.ReadSeeker, ac LeaseAccessConditions, transactionalMD5 []byte) (*BlockBlobStageBlockResponse, error) { + count, err := validateSeekableStreamAt0AndGetCount(body) + if err != nil { + return nil, err + } + return bb.bbClient.StageBlock(ctx, base64BlockID, count, body, transactionalMD5, nil, ac.pointers(), nil) } // StageBlockFromURL copies the specified block from a source URL to the block blob's "staging area" to be later committed by a call to CommitBlockList. // If count is CountToEnd (0), then data is read from specified offset to the end. // For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/put-block-from-url. -func (bb BlockBlobURL) StageBlockFromURL(ctx context.Context, base64BlockID string, sourceURL url.URL, offset int64, count int64, ac LeaseAccessConditions) (*BlockBlobStageBlockFromURLResponse, error) { - sourceURLStr := sourceURL.String() - return bb.bbClient.StageBlockFromURL(ctx, base64BlockID, 0, &sourceURLStr, httpRange{offset: offset, count: count}.pointers(), nil, nil, ac.pointers(), nil) +func (bb BlockBlobURL) StageBlockFromURL(ctx context.Context, base64BlockID string, sourceURL url.URL, offset int64, count int64, destinationAccessConditions LeaseAccessConditions, sourceAccessConditions ModifiedAccessConditions) (*BlockBlobStageBlockFromURLResponse, error) { + sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatchETag, sourceIfNoneMatchETag := sourceAccessConditions.pointers() + return bb.bbClient.StageBlockFromURL(ctx, base64BlockID, 0, sourceURL.String(), httpRange{offset: offset, count: count}.pointers(), nil, nil, destinationAccessConditions.pointers(), sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatchETag, sourceIfNoneMatchETag, nil) } // CommitBlockList writes a blob by specifying the list of block IDs that make up the blob. @@ -90,7 +95,7 @@ func (bb BlockBlobURL) StageBlockFromURL(ctx context.Context, base64BlockID stri // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block-list. func (bb BlockBlobURL) CommitBlockList(ctx context.Context, base64BlockIDs []string, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*BlockBlobCommitBlockListResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() return bb.bbClient.CommitBlockList(ctx, BlockLookupList{Latest: base64BlockIDs}, nil, &h.CacheControl, &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, metadata, ac.LeaseAccessConditions.pointers(), &h.ContentDisposition, diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_container.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_container.go similarity index 90% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_container.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/url_container.go index 0fad9f07674e..48adf0804209 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_container.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_container.go @@ -3,6 +3,7 @@ package azblob import ( "bytes" "context" + "errors" "fmt" "net/url" @@ -16,9 +17,6 @@ type ContainerURL struct { // NewContainerURL creates a ContainerURL object using the specified URL and request policy pipeline. func NewContainerURL(url url.URL, p pipeline.Pipeline) ContainerURL { - if p == nil { - panic("p can't be nil") - } client := newContainerClient(url, p) return ContainerURL{client: client} } @@ -89,10 +87,10 @@ func (c ContainerURL) Create(ctx context.Context, metadata Metadata, publicAcces // For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-container. func (c ContainerURL) Delete(ctx context.Context, ac ContainerAccessConditions) (*ContainerDeleteResponse, error) { if ac.IfMatch != ETagNone || ac.IfNoneMatch != ETagNone { - panic("the IfMatch and IfNoneMatch access conditions must have their default values because they are ignored by the service") + return nil, errors.New("the IfMatch and IfNoneMatch access conditions must have their default values because they are ignored by the service") } - ifModifiedSince, ifUnmodifiedSince, _, _ := ac.HTTPAccessConditions.pointers() + ifModifiedSince, ifUnmodifiedSince, _, _ := ac.ModifiedAccessConditions.pointers() return c.client.Delete(ctx, nil, ac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, nil) } @@ -109,9 +107,9 @@ func (c ContainerURL) GetProperties(ctx context.Context, ac LeaseAccessCondition // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-container-metadata. func (c ContainerURL) SetMetadata(ctx context.Context, metadata Metadata, ac ContainerAccessConditions) (*ContainerSetMetadataResponse, error) { if !ac.IfUnmodifiedSince.IsZero() || ac.IfMatch != ETagNone || ac.IfNoneMatch != ETagNone { - panic("the IfUnmodifiedSince, IfMatch, and IfNoneMatch must have their default values because they are ignored by the blob service") + return nil, errors.New("the IfUnmodifiedSince, IfMatch, and IfNoneMatch must have their default values because they are ignored by the blob service") } - ifModifiedSince, _, _, _ := ac.HTTPAccessConditions.pointers() + ifModifiedSince, _, _, _ := ac.ModifiedAccessConditions.pointers() return c.client.SetMetadata(ctx, nil, ac.LeaseAccessConditions.pointers(), metadata, ifModifiedSince, nil) } @@ -181,16 +179,16 @@ func (p *AccessPolicyPermission) Parse(s string) error { func (c ContainerURL) SetAccessPolicy(ctx context.Context, accessType PublicAccessType, si []SignedIdentifier, ac ContainerAccessConditions) (*ContainerSetAccessPolicyResponse, error) { if ac.IfMatch != ETagNone || ac.IfNoneMatch != ETagNone { - panic("the IfMatch and IfNoneMatch access conditions must have their default values because they are ignored by the service") + return nil, errors.New("the IfMatch and IfNoneMatch access conditions must have their default values because they are ignored by the service") } - ifModifiedSince, ifUnmodifiedSince, _, _ := ac.HTTPAccessConditions.pointers() + ifModifiedSince, ifUnmodifiedSince, _, _ := ac.ModifiedAccessConditions.pointers() return c.client.SetAccessPolicy(ctx, si, nil, ac.LeaseAccessConditions.pointers(), accessType, ifModifiedSince, ifUnmodifiedSince, nil) } // AcquireLease acquires a lease on the container for delete operations. The lease duration must be between 15 to 60 seconds, or infinite (-1). // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) AcquireLease(ctx context.Context, proposedID string, duration int32, ac HTTPAccessConditions) (*ContainerAcquireLeaseResponse, error) { +func (c ContainerURL) AcquireLease(ctx context.Context, proposedID string, duration int32, ac ModifiedAccessConditions) (*ContainerAcquireLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() return c.client.AcquireLease(ctx, nil, &duration, &proposedID, ifModifiedSince, ifUnmodifiedSince, nil) @@ -198,28 +196,28 @@ func (c ContainerURL) AcquireLease(ctx context.Context, proposedID string, durat // RenewLease renews the container's previously-acquired lease. // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) RenewLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*ContainerRenewLeaseResponse, error) { +func (c ContainerURL) RenewLease(ctx context.Context, leaseID string, ac ModifiedAccessConditions) (*ContainerRenewLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() return c.client.RenewLease(ctx, leaseID, nil, ifModifiedSince, ifUnmodifiedSince, nil) } // ReleaseLease releases the container's previously-acquired lease. // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) ReleaseLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*ContainerReleaseLeaseResponse, error) { +func (c ContainerURL) ReleaseLease(ctx context.Context, leaseID string, ac ModifiedAccessConditions) (*ContainerReleaseLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() return c.client.ReleaseLease(ctx, leaseID, nil, ifModifiedSince, ifUnmodifiedSince, nil) } // BreakLease breaks the container's previously-acquired lease (if it exists). // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) BreakLease(ctx context.Context, period int32, ac HTTPAccessConditions) (*ContainerBreakLeaseResponse, error) { +func (c ContainerURL) BreakLease(ctx context.Context, period int32, ac ModifiedAccessConditions) (*ContainerBreakLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() return c.client.BreakLease(ctx, nil, leasePeriodPointer(period), ifModifiedSince, ifUnmodifiedSince, nil) } // ChangeLease changes the container's lease ID. // For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) ChangeLease(ctx context.Context, leaseID string, proposedID string, ac HTTPAccessConditions) (*ContainerChangeLeaseResponse, error) { +func (c ContainerURL) ChangeLease(ctx context.Context, leaseID string, proposedID string, ac ModifiedAccessConditions) (*ContainerChangeLeaseResponse, error) { ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() return c.client.ChangeLease(ctx, leaseID, proposedID, nil, ifModifiedSince, ifUnmodifiedSince, nil) } @@ -231,7 +229,7 @@ func (c ContainerURL) ChangeLease(ctx context.Context, leaseID string, proposedI // For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs. func (c ContainerURL) ListBlobsFlatSegment(ctx context.Context, marker Marker, o ListBlobsSegmentOptions) (*ListBlobsFlatSegmentResponse, error) { prefix, include, maxResults := o.pointers() - return c.client.ListBlobFlatSegment(ctx, prefix, marker.val, maxResults, include, nil, nil) + return c.client.ListBlobFlatSegment(ctx, prefix, marker.Val, maxResults, include, nil, nil) } // ListBlobsHierarchySegment returns a single segment of blobs starting from the specified Marker. Use an empty @@ -241,10 +239,10 @@ func (c ContainerURL) ListBlobsFlatSegment(ctx context.Context, marker Marker, o // For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs. func (c ContainerURL) ListBlobsHierarchySegment(ctx context.Context, marker Marker, delimiter string, o ListBlobsSegmentOptions) (*ListBlobsHierarchySegmentResponse, error) { if o.Details.Snapshots { - panic("snapshots are not supported in this listing operation") + return nil, errors.New("snapshots are not supported in this listing operation") } prefix, include, maxResults := o.pointers() - return c.client.ListBlobHierarchySegment(ctx, delimiter, prefix, marker.val, maxResults, include, nil, nil) + return c.client.ListBlobHierarchySegment(ctx, delimiter, prefix, marker.Val, maxResults, include, nil, nil) } // ListBlobsSegmentOptions defines options available when calling ListBlobs. @@ -264,9 +262,6 @@ func (o *ListBlobsSegmentOptions) pointers() (prefix *string, include []ListBlob } include = o.Details.slice() if o.MaxResults != 0 { - if o.MaxResults < 0 { - panic("MaxResults must be >= 0") - } maxResults = &o.MaxResults } return diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_page_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_page_blob.go new file mode 100644 index 000000000000..8ee34c05a645 --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_page_blob.go @@ -0,0 +1,223 @@ +package azblob + +import ( + "context" + "fmt" + "io" + "net/url" + "strconv" + + "github.com/Azure/azure-pipeline-go/pipeline" +) + +const ( + // PageBlobPageBytes indicates the number of bytes in a page (512). + PageBlobPageBytes = 512 + + // PageBlobMaxPutPagesBytes indicates the maximum number of bytes that can be sent in a call to PutPage. + PageBlobMaxUploadPagesBytes = 4 * 1024 * 1024 // 4MB +) + +// PageBlobURL defines a set of operations applicable to page blobs. +type PageBlobURL struct { + BlobURL + pbClient pageBlobClient +} + +// NewPageBlobURL creates a PageBlobURL object using the specified URL and request policy pipeline. +func NewPageBlobURL(url url.URL, p pipeline.Pipeline) PageBlobURL { + blobClient := newBlobClient(url, p) + pbClient := newPageBlobClient(url, p) + return PageBlobURL{BlobURL: BlobURL{blobClient: blobClient}, pbClient: pbClient} +} + +// WithPipeline creates a new PageBlobURL object identical to the source but with the specific request policy pipeline. +func (pb PageBlobURL) WithPipeline(p pipeline.Pipeline) PageBlobURL { + return NewPageBlobURL(pb.blobClient.URL(), p) +} + +// WithSnapshot creates a new PageBlobURL object identical to the source but with the specified snapshot timestamp. +// Pass "" to remove the snapshot returning a URL to the base blob. +func (pb PageBlobURL) WithSnapshot(snapshot string) PageBlobURL { + p := NewBlobURLParts(pb.URL()) + p.Snapshot = snapshot + return NewPageBlobURL(p.URL(), pb.blobClient.Pipeline()) +} + +// Create creates a page blob of the specified length. Call PutPage to upload data data to a page blob. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. +func (pb PageBlobURL) Create(ctx context.Context, size int64, sequenceNumber int64, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*PageBlobCreateResponse, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() + return pb.pbClient.Create(ctx, 0, size, nil, + &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, &h.CacheControl, + metadata, ac.LeaseAccessConditions.pointers(), + &h.ContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, &sequenceNumber, nil) +} + +// UploadPages writes 1 or more pages to the page blob. The start offset and the stream size must be a multiple of 512 bytes. +// This method panics if the stream is not at position 0. +// Note that the http client closes the body stream after the request is sent to the service. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page. +func (pb PageBlobURL) UploadPages(ctx context.Context, offset int64, body io.ReadSeeker, ac PageBlobAccessConditions, transactionalMD5 []byte) (*PageBlobUploadPagesResponse, error) { + count, err := validateSeekableStreamAt0AndGetCount(body) + if err != nil { + return nil, err + } + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() + ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual := ac.SequenceNumberAccessConditions.pointers() + return pb.pbClient.UploadPages(ctx, body, count, transactionalMD5, nil, + PageRange{Start: offset, End: offset + count - 1}.pointers(), + ac.LeaseAccessConditions.pointers(), + ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual, + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) +} + +// UploadPagesFromURL copies 1 or more pages from a source URL to the page blob. +// The sourceOffset specifies the start offset of source data to copy from. +// The destOffset specifies the start offset of data in page blob will be written to. +// The count must be a multiple of 512 bytes. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page-from-url. +func (pb PageBlobURL) UploadPagesFromURL(ctx context.Context, sourceURL url.URL, sourceOffset int64, destOffset int64, count int64, transactionalMD5 []byte, destinationAccessConditions PageBlobAccessConditions, sourceAccessConditions ModifiedAccessConditions) (*PageBlobUploadPagesFromURLResponse, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := destinationAccessConditions.ModifiedAccessConditions.pointers() + sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatchETag, sourceIfNoneMatchETag := sourceAccessConditions.pointers() + ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual := destinationAccessConditions.SequenceNumberAccessConditions.pointers() + return pb.pbClient.UploadPagesFromURL(ctx, sourceURL.String(), *PageRange{Start: sourceOffset, End: sourceOffset + count - 1}.pointers(), 0, + *PageRange{Start: destOffset, End: destOffset + count - 1}.pointers(), transactionalMD5, nil, destinationAccessConditions.LeaseAccessConditions.pointers(), + ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual, + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatchETag, sourceIfNoneMatchETag, nil) +} + +// ClearPages frees the specified pages from the page blob. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page. +func (pb PageBlobURL) ClearPages(ctx context.Context, offset int64, count int64, ac PageBlobAccessConditions) (*PageBlobClearPagesResponse, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() + ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual := ac.SequenceNumberAccessConditions.pointers() + return pb.pbClient.ClearPages(ctx, 0, nil, + PageRange{Start: offset, End: offset + count - 1}.pointers(), + ac.LeaseAccessConditions.pointers(), + ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, + ifSequenceNumberEqual, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) +} + +// GetPageRanges returns the list of valid page ranges for a page blob or snapshot of a page blob. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. +func (pb PageBlobURL) GetPageRanges(ctx context.Context, offset int64, count int64, ac BlobAccessConditions) (*PageList, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() + return pb.pbClient.GetPageRanges(ctx, nil, nil, + httpRange{offset: offset, count: count}.pointers(), + ac.LeaseAccessConditions.pointers(), + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) +} + +// GetPageRangesDiff gets the collection of page ranges that differ between a specified snapshot and this page blob. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. +func (pb PageBlobURL) GetPageRangesDiff(ctx context.Context, offset int64, count int64, prevSnapshot string, ac BlobAccessConditions) (*PageList, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() + return pb.pbClient.GetPageRangesDiff(ctx, nil, nil, &prevSnapshot, + httpRange{offset: offset, count: count}.pointers(), + ac.LeaseAccessConditions.pointers(), + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, + nil) +} + +// Resize resizes the page blob to the specified size (which must be a multiple of 512). +// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. +func (pb PageBlobURL) Resize(ctx context.Context, size int64, ac BlobAccessConditions) (*PageBlobResizeResponse, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() + return pb.pbClient.Resize(ctx, size, nil, ac.LeaseAccessConditions.pointers(), + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) +} + +// SetSequenceNumber sets the page blob's sequence number. +func (pb PageBlobURL) UpdateSequenceNumber(ctx context.Context, action SequenceNumberActionType, sequenceNumber int64, + ac BlobAccessConditions) (*PageBlobUpdateSequenceNumberResponse, error) { + sn := &sequenceNumber + if action == SequenceNumberActionIncrement { + sn = nil + } + ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch := ac.ModifiedAccessConditions.pointers() + return pb.pbClient.UpdateSequenceNumber(ctx, action, nil, + ac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, + sn, nil) +} + +// StartIncrementalCopy begins an operation to start an incremental copy from one page blob's snapshot to this page blob. +// The snapshot is copied such that only the differential changes between the previously copied snapshot are transferred to the destination. +// The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/incremental-copy-blob and +// https://docs.microsoft.com/en-us/azure/virtual-machines/windows/incremental-snapshots. +func (pb PageBlobURL) StartCopyIncremental(ctx context.Context, source url.URL, snapshot string, ac BlobAccessConditions) (*PageBlobCopyIncrementalResponse, error) { + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.ModifiedAccessConditions.pointers() + qp := source.Query() + qp.Set("snapshot", snapshot) + source.RawQuery = qp.Encode() + return pb.pbClient.CopyIncremental(ctx, source.String(), nil, + ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) +} + +func (pr PageRange) pointers() *string { + endOffset := strconv.FormatInt(int64(pr.End), 10) + asString := fmt.Sprintf("bytes=%v-%s", pr.Start, endOffset) + return &asString +} + +type PageBlobAccessConditions struct { + ModifiedAccessConditions + LeaseAccessConditions + SequenceNumberAccessConditions +} + +// SequenceNumberAccessConditions identifies page blob-specific access conditions which you optionally set. +type SequenceNumberAccessConditions struct { + // IfSequenceNumberLessThan ensures that the page blob operation succeeds + // only if the blob's sequence number is less than a value. + // IfSequenceNumberLessThan=0 means no 'IfSequenceNumberLessThan' header specified. + // IfSequenceNumberLessThan>0 means 'IfSequenceNumberLessThan' header specified with its value + // IfSequenceNumberLessThan==-1 means 'IfSequenceNumberLessThan' header specified with a value of 0 + IfSequenceNumberLessThan int64 + + // IfSequenceNumberLessThanOrEqual ensures that the page blob operation succeeds + // only if the blob's sequence number is less than or equal to a value. + // IfSequenceNumberLessThanOrEqual=0 means no 'IfSequenceNumberLessThanOrEqual' header specified. + // IfSequenceNumberLessThanOrEqual>0 means 'IfSequenceNumberLessThanOrEqual' header specified with its value + // IfSequenceNumberLessThanOrEqual=-1 means 'IfSequenceNumberLessThanOrEqual' header specified with a value of 0 + IfSequenceNumberLessThanOrEqual int64 + + // IfSequenceNumberEqual ensures that the page blob operation succeeds + // only if the blob's sequence number is equal to a value. + // IfSequenceNumberEqual=0 means no 'IfSequenceNumberEqual' header specified. + // IfSequenceNumberEqual>0 means 'IfSequenceNumberEqual' header specified with its value + // IfSequenceNumberEqual=-1 means 'IfSequenceNumberEqual' header specified with a value of 0 + IfSequenceNumberEqual int64 +} + +// pointers is for internal infrastructure. It returns the fields as pointers. +func (ac SequenceNumberAccessConditions) pointers() (snltoe *int64, snlt *int64, sne *int64) { + var zero int64 // Defaults to 0 + switch ac.IfSequenceNumberLessThan { + case -1: + snlt = &zero + case 0: + snlt = nil + default: + snlt = &ac.IfSequenceNumberLessThan + } + + switch ac.IfSequenceNumberLessThanOrEqual { + case -1: + snltoe = &zero + case 0: + snltoe = nil + default: + snltoe = &ac.IfSequenceNumberLessThanOrEqual + } + switch ac.IfSequenceNumberEqual { + case -1: + sne = &zero + case 0: + sne = nil + default: + sne = &ac.IfSequenceNumberEqual + } + return +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_service.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_service.go similarity index 84% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_service.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/url_service.go index d49a20846b3e..5974bc3a4225 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_service.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/url_service.go @@ -23,13 +23,21 @@ type ServiceURL struct { // NewServiceURL creates a ServiceURL object using the specified URL and request policy pipeline. func NewServiceURL(primaryURL url.URL, p pipeline.Pipeline) ServiceURL { - if p == nil { - panic("p can't be nil") - } client := newServiceClient(primaryURL, p) return ServiceURL{client: client} } +//GetUserDelegationCredential obtains a UserDelegationKey object using the base ServiceURL object. +//OAuth is required for this call, as well as any role that can delegate access to the storage account. +func (s ServiceURL) GetUserDelegationCredential(ctx context.Context, info KeyInfo, timeout *int32, requestID *string) (UserDelegationCredential, error) { + sc := newServiceClient(s.client.url, s.client.p) + udk, err := sc.GetUserDelegationKey(ctx, info, timeout, requestID) + if err != nil { + return UserDelegationCredential{}, err + } + return NewUserDelegationCredential(strings.Split(s.client.url.Host, ".")[0], *udk), nil +} + // URL returns the URL endpoint used by the ServiceURL object. func (s ServiceURL) URL() url.URL { return s.client.URL() @@ -81,16 +89,16 @@ func appendToURLPath(u url.URL, name string) url.URL { // After getting a segment, process it, and then call ListContainersFlatSegment again (passing the the // previously-returned Marker) to get the next segment. For more information, see // https://docs.microsoft.com/rest/api/storageservices/list-containers2. -func (s ServiceURL) ListContainersSegment(ctx context.Context, marker Marker, o ListContainersSegmentOptions) (*ListContainersResponse, error) { +func (s ServiceURL) ListContainersSegment(ctx context.Context, marker Marker, o ListContainersSegmentOptions) (*ListContainersSegmentResponse, error) { prefix, include, maxResults := o.pointers() - return s.client.ListContainersSegment(ctx, prefix, marker.val, maxResults, include, nil, nil) + return s.client.ListContainersSegment(ctx, prefix, marker.Val, maxResults, include, nil, nil) } // ListContainersOptions defines options available when calling ListContainers. type ListContainersSegmentOptions struct { Detail ListContainersDetail // No IncludeType header is produced if "" - Prefix string // No Prefix header is produced if "" - MaxResults int32 // 0 means unspecified + Prefix string // No Prefix header is produced if "" + MaxResults int32 // 0 means unspecified // TODO: update swagger to generate this type? } @@ -99,9 +107,6 @@ func (o *ListContainersSegmentOptions) pointers() (prefix *string, include ListC prefix = &o.Prefix } if o.MaxResults != 0 { - if o.MaxResults < 0 { - panic("MaxResults must be >= 0") - } maxResults = &o.MaxResults } include = ListContainersIncludeType(o.Detail.string()) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/user_delegation_credential.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/user_delegation_credential.go new file mode 100644 index 000000000000..9fcbbc4092cc --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/user_delegation_credential.go @@ -0,0 +1,38 @@ +package azblob + +import ( + "crypto/hmac" + "crypto/sha256" + "encoding/base64" +) + +// NewUserDelegationCredential creates a new UserDelegationCredential using a Storage account's name and a user delegation key from it +func NewUserDelegationCredential(accountName string, key UserDelegationKey) UserDelegationCredential { + return UserDelegationCredential{ + accountName: accountName, + accountKey: key, + } +} + +type UserDelegationCredential struct { + accountName string + accountKey UserDelegationKey +} + +// AccountName returns the Storage account's name +func (f UserDelegationCredential) AccountName() string { + return f.accountName +} + +// ComputeHMAC +func (f UserDelegationCredential) ComputeHMACSHA256(message string) (base64String string) { + bytes, _ := base64.StdEncoding.DecodeString(f.accountKey.Value) + h := hmac.New(sha256.New, bytes) + h.Write([]byte(message)) + return base64.StdEncoding.EncodeToString(h.Sum(nil)) +} + +// Private method to return important parameters for NewSASQueryParameters +func (f UserDelegationCredential) getUDKParams() *UserDelegationKey { + return &f.accountKey +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/version.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/version.go new file mode 100644 index 000000000000..bcc7b956c5e7 --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/version.go @@ -0,0 +1,3 @@ +package azblob + +const serviceLibVersion = "0.7" diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_anonymous.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_credential_anonymous.go similarity index 100% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_anonymous.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_credential_anonymous.go diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_shared_key.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_credential_shared_key.go similarity index 86% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_shared_key.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_credential_shared_key.go index 51da1627797a..3e27552f24ee 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_shared_key.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_credential_shared_key.go @@ -6,6 +6,7 @@ import ( "crypto/hmac" "crypto/sha256" "encoding/base64" + "errors" "net/http" "net/url" "sort" @@ -17,12 +18,12 @@ import ( // NewSharedKeyCredential creates an immutable SharedKeyCredential containing the // storage account's name and either its primary or secondary key. -func NewSharedKeyCredential(accountName, accountKey string) *SharedKeyCredential { +func NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error) { bytes, err := base64.StdEncoding.DecodeString(accountKey) if err != nil { - panic(err) + return &SharedKeyCredential{}, err } - return &SharedKeyCredential{accountName: accountName, accountKey: bytes} + return &SharedKeyCredential{accountName: accountName, accountKey: bytes}, nil } // SharedKeyCredential contains an account's name and its primary or secondary key. @@ -38,6 +39,15 @@ func (f SharedKeyCredential) AccountName() string { return f.accountName } +func (f SharedKeyCredential) getAccountKey() []byte { + return f.accountKey +} + +// noop function to satisfy StorageAccountCredential interface +func (f SharedKeyCredential) getUDKParams() *UserDelegationKey { + return nil +} + // New creates a credential policy object. func (f *SharedKeyCredential) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy { return pipeline.PolicyFunc(func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) { @@ -45,7 +55,10 @@ func (f *SharedKeyCredential) New(next pipeline.Policy, po *pipeline.PolicyOptio if d := request.Header.Get(headerXmsDate); d == "" { request.Header[headerXmsDate] = []string{time.Now().UTC().Format(http.TimeFormat)} } - stringToSign := f.buildStringToSign(request) + stringToSign, err := f.buildStringToSign(request) + if err != nil { + return nil, err + } signature := f.ComputeHMACSHA256(stringToSign) authHeader := strings.Join([]string{"SharedKey ", f.accountName, ":", signature}, "") request.Header[headerAuthorization] = []string{authHeader} @@ -84,13 +97,13 @@ const ( ) // ComputeHMACSHA256 generates a hash signature for an HTTP request or for a SAS. -func (f *SharedKeyCredential) ComputeHMACSHA256(message string) (base64String string) { +func (f SharedKeyCredential) ComputeHMACSHA256(message string) (base64String string) { h := hmac.New(sha256.New, f.accountKey) h.Write([]byte(message)) return base64.StdEncoding.EncodeToString(h.Sum(nil)) } -func (f *SharedKeyCredential) buildStringToSign(request pipeline.Request) string { +func (f *SharedKeyCredential) buildStringToSign(request pipeline.Request) (string, error) { // https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services headers := request.Header contentLength := headers.Get(headerContentLength) @@ -98,6 +111,11 @@ func (f *SharedKeyCredential) buildStringToSign(request pipeline.Request) string contentLength = "" } + canonicalizedResource, err := f.buildCanonicalizedResource(request.URL) + if err != nil { + return "", err + } + stringToSign := strings.Join([]string{ request.Method, headers.Get(headerContentEncoding), @@ -112,9 +130,9 @@ func (f *SharedKeyCredential) buildStringToSign(request pipeline.Request) string headers.Get(headerIfUnmodifiedSince), headers.Get(headerRange), buildCanonicalizedHeader(headers), - f.buildCanonicalizedResource(request.URL), + canonicalizedResource, }, "\n") - return stringToSign + return stringToSign, nil } func buildCanonicalizedHeader(headers http.Header) string { @@ -146,7 +164,7 @@ func buildCanonicalizedHeader(headers http.Header) string { return string(ch.Bytes()) } -func (f *SharedKeyCredential) buildCanonicalizedResource(u *url.URL) string { +func (f *SharedKeyCredential) buildCanonicalizedResource(u *url.URL) (string, error) { // https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services cr := bytes.NewBufferString("/") cr.WriteString(f.accountName) @@ -164,7 +182,7 @@ func (f *SharedKeyCredential) buildCanonicalizedResource(u *url.URL) string { // params is a map[string][]string; param name is key; params values is []string params, err := url.ParseQuery(u.RawQuery) // Returns URL decoded values if err != nil { - panic(err) + return "", errors.New("parsing query parameters must succeed, otherwise there might be serious problems in the SDK/generated code") } if len(params) > 0 { // There is at least 1 query parameter @@ -183,5 +201,5 @@ func (f *SharedKeyCredential) buildCanonicalizedResource(u *url.URL) string { cr.WriteString("\n" + paramName + ":" + strings.Join(paramValues, ",")) } } - return string(cr.Bytes()) + return string(cr.Bytes()), nil } diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_token.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_credential_token.go similarity index 76% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_token.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_credential_token.go index d7f925d39818..7e78d25f15ac 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_token.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_credential_token.go @@ -2,6 +2,7 @@ package azblob import ( "context" + "errors" "sync/atomic" "runtime" @@ -11,6 +12,10 @@ import ( "github.com/Azure/azure-pipeline-go/pipeline" ) +// TokenRefresher represents a callback method that you write; this method is called periodically +// so you can refresh the token credential's value. +type TokenRefresher func(credential TokenCredential) time.Duration + // TokenCredential represents a token credential (which is also a pipeline.Factory). type TokenCredential interface { Credential @@ -20,12 +25,15 @@ type TokenCredential interface { // NewTokenCredential creates a token credential for use with role-based access control (RBAC) access to Azure Storage // resources. You initialize the TokenCredential with an initial token value. If you pass a non-nil value for -// tokenRefresher, then the function you pass will be called immediately (so it can refresh and change the -// TokenCredential's token value by calling SetToken; your tokenRefresher function must return a time.Duration +// tokenRefresher, then the function you pass will be called immediately so it can refresh and change the +// TokenCredential's token value by calling SetToken. Your tokenRefresher function must return a time.Duration // indicating how long the TokenCredential object should wait before calling your tokenRefresher function again. -func NewTokenCredential(initialToken string, tokenRefresher func(credential TokenCredential) time.Duration) TokenCredential { +// If your tokenRefresher callback fails to refresh the token, you can return a duration of 0 to stop your +// TokenCredential object from ever invoking tokenRefresher again. Also, oen way to deal with failing to refresh a +// token is to cancel a context.Context object used by requests that have the TokenCredential object in their pipeline. +func NewTokenCredential(initialToken string, tokenRefresher TokenRefresher) TokenCredential { tc := &tokenCredential{} - tc.SetToken(initialToken) // We dont' set it above to guarantee atomicity + tc.SetToken(initialToken) // We don't set it above to guarantee atomicity if tokenRefresher == nil { return tc // If no callback specified, return the simple tokenCredential } @@ -68,7 +76,7 @@ type tokenCredential struct { // The members below are only used if the user specified a tokenRefresher callback function. timer *time.Timer - tokenRefresher func(c TokenCredential) time.Duration + tokenRefresher TokenRefresher lock sync.Mutex stopped bool } @@ -84,7 +92,7 @@ func (f *tokenCredential) SetToken(token string) { f.token.Store(token) } // startRefresh calls refresh which immediately calls tokenRefresher // and then starts a timer to call tokenRefresher in the future. -func (f *tokenCredential) startRefresh(tokenRefresher func(c TokenCredential) time.Duration) { +func (f *tokenCredential) startRefresh(tokenRefresher TokenRefresher) { f.tokenRefresher = tokenRefresher f.stopped = false // In case user calls StartRefresh, StopRefresh, & then StartRefresh again f.refresh() @@ -95,11 +103,13 @@ func (f *tokenCredential) startRefresh(tokenRefresher func(c TokenCredential) ti // in order to refresh the token again in the future. func (f *tokenCredential) refresh() { d := f.tokenRefresher(f) // Invoke the user's refresh callback outside of the lock - f.lock.Lock() - if !f.stopped { - f.timer = time.AfterFunc(d, f.refresh) + if d > 0 { // If duration is 0 or negative, refresher wants to not be called again + f.lock.Lock() + if !f.stopped { + f.timer = time.AfterFunc(d, f.refresh) + } + f.lock.Unlock() } - f.lock.Unlock() } // stopRefresh stops any pending timer and sets stopped field to true to prevent @@ -118,7 +128,8 @@ func (f *tokenCredential) stopRefresh() { func (f *tokenCredential) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy { return pipeline.PolicyFunc(func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) { if request.URL.Scheme != "https" { - panic("Token credentials require a URL using the https protocol scheme.") + // HTTPS must be used, otherwise the tokens are at the risk of being exposed + return nil, errors.New("token credentials require a URL using the https protocol scheme") } request.Header[headerAuthorization] = []string{"Bearer " + f.Token()} return next.Do(ctx, request) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_unix.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_mmf_unix.go similarity index 75% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_unix.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_mmf_unix.go index b6c668ac6480..3e8c7cba3dd6 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_unix.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_mmf_unix.go @@ -1,4 +1,4 @@ -// +build linux darwin freebsd +// +build linux darwin freebsd openbsd netbsd dragonfly package azblob @@ -22,6 +22,6 @@ func (m *mmf) unmap() { err := syscall.Munmap(*m) *m = nil if err != nil { - panic(err) + panic("if we are unable to unmap the memory-mapped file, there is serious concern for memory corruption") } } diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_mmf_windows.go similarity index 90% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_mmf_windows.go index 1a6e83dad9b2..2743644e16dc 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_mmf_windows.go @@ -33,6 +33,6 @@ func (m *mmf) unmap() { *m = mmf{} err := syscall.UnmapViewOfFile(addr) if err != nil { - panic(err) + panic("if we are unable to unmap the memory-mapped file, there is serious concern for memory corruption") } } diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_pipeline.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_pipeline.go similarity index 82% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_pipeline.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_pipeline.go index af5fcd6c7f88..7c249a298d4d 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_pipeline.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_pipeline.go @@ -17,14 +17,13 @@ type PipelineOptions struct { // Telemetry configures the built-in telemetry policy behavior. Telemetry TelemetryOptions + + // HTTPSender configures the sender of HTTP requests + HTTPSender pipeline.Factory } // NewPipeline creates a Pipeline using the specified credentials and options. func NewPipeline(c Credential, o PipelineOptions) pipeline.Pipeline { - if c == nil { - panic("c can't be nil") - } - // Closest to API goes first; closest to the wire goes last f := []pipeline.Factory{ NewTelemetryPolicyFactory(o.Telemetry), @@ -39,8 +38,9 @@ func NewPipeline(c Credential, o PipelineOptions) pipeline.Pipeline { f = append(f, c) } f = append(f, - pipeline.MethodFactoryMarker(), // indicates at what stage in the pipeline the method factory is invoked - NewRequestLogPolicyFactory(o.RequestLog)) + NewRequestLogPolicyFactory(o.RequestLog), + pipeline.MethodFactoryMarker()) // indicates at what stage in the pipeline the method factory is invoked + - return pipeline.NewPipeline(f, pipeline.Options{HTTPSender: nil, Log: o.Log}) + return pipeline.NewPipeline(f, pipeline.Options{HTTPSender: o.HTTPSender, Log: o.Log}) } diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_request_log.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_request_log.go similarity index 80% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_request_log.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_request_log.go index 23d559eb7c43..0a362ea8b684 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_request_log.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_request_log.go @@ -109,7 +109,8 @@ func NewRequestLogPolicyFactory(o RequestLogOptions) pipeline.Factory { }) } -func redactSigQueryParam(rawQuery string) (bool, string) { +// RedactSigQueryParam redacts the 'sig' query parameter in URL's raw query to protect secret. +func RedactSigQueryParam(rawQuery string) (bool, string) { rawQuery = strings.ToLower(rawQuery) // lowercase the string so we can look for ?sig= and &sig= sigFound := strings.Contains(rawQuery, "?sig=") if !sigFound { @@ -130,12 +131,13 @@ func redactSigQueryParam(rawQuery string) (bool, string) { func prepareRequestForLogging(request pipeline.Request) *http.Request { req := request - if sigFound, rawQuery := redactSigQueryParam(req.URL.RawQuery); sigFound { + if sigFound, rawQuery := RedactSigQueryParam(req.URL.RawQuery); sigFound { // Make copy so we don't destroy the query parameters we actually need to send in the request req = request.Copy() req.Request.URL.RawQuery = rawQuery } - return req.Request + + return prepareRequestForServiceLogging(req) } func stack() []byte { @@ -148,3 +150,33 @@ func stack() []byte { buf = make([]byte, 2*len(buf)) } } + +/////////////////////////////////////////////////////////////////////////////////////// +// Redact phase useful for blob and file service only. For other services, +// this method can directly return request.Request. +/////////////////////////////////////////////////////////////////////////////////////// +func prepareRequestForServiceLogging(request pipeline.Request) *http.Request { + req := request + if exist, key := doesHeaderExistCaseInsensitive(req.Header, xMsCopySourceHeader); exist { + req = request.Copy() + url, err := url.Parse(req.Header.Get(key)) + if err == nil { + if sigFound, rawQuery := RedactSigQueryParam(url.RawQuery); sigFound { + url.RawQuery = rawQuery + req.Header.Set(xMsCopySourceHeader, url.String()) + } + } + } + return req.Request +} + +const xMsCopySourceHeader = "x-ms-copy-source" + +func doesHeaderExistCaseInsensitive(header http.Header, key string) (bool, string) { + for keyInHeader := range header { + if strings.EqualFold(keyInHeader, key) { + return true, keyInHeader + } + } + return false, "" +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_retry.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_retry.go new file mode 100644 index 000000000000..00531fee0b26 --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_retry.go @@ -0,0 +1,412 @@ +package azblob + +import ( + "context" + "errors" + "io" + "io/ioutil" + "math/rand" + "net" + "net/http" + "strconv" + "strings" + "time" + + "github.com/Azure/azure-pipeline-go/pipeline" +) + +// RetryPolicy tells the pipeline what kind of retry policy to use. See the RetryPolicy* constants. +type RetryPolicy int32 + +const ( + // RetryPolicyExponential tells the pipeline to use an exponential back-off retry policy + RetryPolicyExponential RetryPolicy = 0 + + // RetryPolicyFixed tells the pipeline to use a fixed back-off retry policy + RetryPolicyFixed RetryPolicy = 1 +) + +// RetryOptions configures the retry policy's behavior. +type RetryOptions struct { + // Policy tells the pipeline what kind of retry policy to use. See the RetryPolicy* constants.\ + // A value of zero means that you accept our default policy. + Policy RetryPolicy + + // MaxTries specifies the maximum number of attempts an operation will be tried before producing an error (0=default). + // A value of zero means that you accept our default policy. A value of 1 means 1 try and no retries. + MaxTries int32 + + // TryTimeout indicates the maximum time allowed for any single try of an HTTP request. + // A value of zero means that you accept our default timeout. NOTE: When transferring large amounts + // of data, the default TryTimeout will probably not be sufficient. You should override this value + // based on the bandwidth available to the host machine and proximity to the Storage service. A good + // starting point may be something like (60 seconds per MB of anticipated-payload-size). + TryTimeout time.Duration + + // RetryDelay specifies the amount of delay to use before retrying an operation (0=default). + // When RetryPolicy is specified as RetryPolicyExponential, the delay increases exponentially + // with each retry up to a maximum specified by MaxRetryDelay. + // If you specify 0, then you must also specify 0 for MaxRetryDelay. + // If you specify RetryDelay, then you must also specify MaxRetryDelay, and MaxRetryDelay should be + // equal to or greater than RetryDelay. + RetryDelay time.Duration + + // MaxRetryDelay specifies the maximum delay allowed before retrying an operation (0=default). + // If you specify 0, then you must also specify 0 for RetryDelay. + MaxRetryDelay time.Duration + + // RetryReadsFromSecondaryHost specifies whether the retry policy should retry a read operation against another host. + // If RetryReadsFromSecondaryHost is "" (the default) then operations are not retried against another host. + // NOTE: Before setting this field, make sure you understand the issues around reading stale & potentially-inconsistent + // data at this webpage: https://docs.microsoft.com/en-us/azure/storage/common/storage-designing-ha-apps-with-ragrs + RetryReadsFromSecondaryHost string // Comment this our for non-Blob SDKs +} + +func (o RetryOptions) retryReadsFromSecondaryHost() string { + return o.RetryReadsFromSecondaryHost // This is for the Blob SDK only + //return "" // This is for non-blob SDKs +} + +func (o RetryOptions) defaults() RetryOptions { + // We assume the following: + // 1. o.Policy should either be RetryPolicyExponential or RetryPolicyFixed + // 2. o.MaxTries >= 0 + // 3. o.TryTimeout, o.RetryDelay, and o.MaxRetryDelay >=0 + // 4. o.RetryDelay <= o.MaxRetryDelay + // 5. Both o.RetryDelay and o.MaxRetryDelay must be 0 or neither can be 0 + + IfDefault := func(current *time.Duration, desired time.Duration) { + if *current == time.Duration(0) { + *current = desired + } + } + + // Set defaults if unspecified + if o.MaxTries == 0 { + o.MaxTries = 4 + } + switch o.Policy { + case RetryPolicyExponential: + IfDefault(&o.TryTimeout, 1*time.Minute) + IfDefault(&o.RetryDelay, 4*time.Second) + IfDefault(&o.MaxRetryDelay, 120*time.Second) + + case RetryPolicyFixed: + IfDefault(&o.TryTimeout, 1*time.Minute) + IfDefault(&o.RetryDelay, 30*time.Second) + IfDefault(&o.MaxRetryDelay, 120*time.Second) + } + return o +} + +func (o RetryOptions) calcDelay(try int32) time.Duration { // try is >=1; never 0 + pow := func(number int64, exponent int32) int64 { // pow is nested helper function + var result int64 = 1 + for n := int32(0); n < exponent; n++ { + result *= number + } + return result + } + + delay := time.Duration(0) + switch o.Policy { + case RetryPolicyExponential: + delay = time.Duration(pow(2, try-1)-1) * o.RetryDelay + + case RetryPolicyFixed: + if try > 1 { // Any try after the 1st uses the fixed delay + delay = o.RetryDelay + } + } + + // Introduce some jitter: [0.0, 1.0) / 2 = [0.0, 0.5) + 0.8 = [0.8, 1.3) + // For casts and rounding - be careful, as per https://github.com/golang/go/issues/20757 + delay = time.Duration(float32(delay) * (rand.Float32()/2 + 0.8)) // NOTE: We want math/rand; not crypto/rand + if delay > o.MaxRetryDelay { + delay = o.MaxRetryDelay + } + return delay +} + +// NewRetryPolicyFactory creates a RetryPolicyFactory object configured using the specified options. +func NewRetryPolicyFactory(o RetryOptions) pipeline.Factory { + o = o.defaults() // Force defaults to be calculated + return pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc { + return func(ctx context.Context, request pipeline.Request) (response pipeline.Response, err error) { + // Before each try, we'll select either the primary or secondary URL. + primaryTry := int32(0) // This indicates how many tries we've attempted against the primary DC + + // We only consider retrying against a secondary if we have a read request (GET/HEAD) AND this policy has a Secondary URL it can use + considerSecondary := (request.Method == http.MethodGet || request.Method == http.MethodHead) && o.retryReadsFromSecondaryHost() != "" + + // Exponential retry algorithm: ((2 ^ attempt) - 1) * delay * random(0.8, 1.2) + // When to retry: connection failure or temporary/timeout. NOTE: StorageError considers HTTP 500/503 as temporary & is therefore retryable + // If using a secondary: + // Even tries go against primary; odd tries go against the secondary + // For a primary wait ((2 ^ primaryTries - 1) * delay * random(0.8, 1.2) + // If secondary gets a 404, don't fail, retry but future retries are only against the primary + // When retrying against a secondary, ignore the retry count and wait (.1 second * random(0.8, 1.2)) + for try := int32(1); try <= o.MaxTries; try++ { + logf("\n=====> Try=%d\n", try) + + // Determine which endpoint to try. It's primary if there is no secondary or if it is an add # attempt. + tryingPrimary := !considerSecondary || (try%2 == 1) + // Select the correct host and delay + if tryingPrimary { + primaryTry++ + delay := o.calcDelay(primaryTry) + logf("Primary try=%d, Delay=%v\n", primaryTry, delay) + time.Sleep(delay) // The 1st try returns 0 delay + } else { + // For casts and rounding - be careful, as per https://github.com/golang/go/issues/20757 + delay := time.Duration(float32(time.Second) * (rand.Float32()/2 + 0.8)) + logf("Secondary try=%d, Delay=%v\n", try-primaryTry, delay) + time.Sleep(delay) // Delay with some jitter before trying secondary + } + + // Clone the original request to ensure that each try starts with the original (unmutated) request. + requestCopy := request.Copy() + + // For each try, seek to the beginning of the Body stream. We do this even for the 1st try because + // the stream may not be at offset 0 when we first get it and we want the same behavior for the + // 1st try as for additional tries. + err = requestCopy.RewindBody() + if err != nil { + return nil, errors.New("we must be able to seek on the Body Stream, otherwise retries would cause data corruption") + } + + if !tryingPrimary { + requestCopy.URL.Host = o.retryReadsFromSecondaryHost() + requestCopy.Host = o.retryReadsFromSecondaryHost() + } + + // Set the server-side timeout query parameter "timeout=[seconds]" + timeout := int32(o.TryTimeout.Seconds()) // Max seconds per try + if deadline, ok := ctx.Deadline(); ok { // If user's ctx has a deadline, make the timeout the smaller of the two + t := int32(deadline.Sub(time.Now()).Seconds()) // Duration from now until user's ctx reaches its deadline + logf("MaxTryTimeout=%d secs, TimeTilDeadline=%d sec\n", timeout, t) + if t < timeout { + timeout = t + } + if timeout < 0 { + timeout = 0 // If timeout ever goes negative, set it to zero; this happen while debugging + } + logf("TryTimeout adjusted to=%d sec\n", timeout) + } + q := requestCopy.Request.URL.Query() + q.Set("timeout", strconv.Itoa(int(timeout+1))) // Add 1 to "round up" + requestCopy.Request.URL.RawQuery = q.Encode() + logf("Url=%s\n", requestCopy.Request.URL.String()) + + // Set the time for this particular retry operation and then Do the operation. + tryCtx, tryCancel := context.WithTimeout(ctx, time.Second*time.Duration(timeout)) + //requestCopy.Body = &deadlineExceededReadCloser{r: requestCopy.Request.Body} + response, err = next.Do(tryCtx, requestCopy) // Make the request + /*err = improveDeadlineExceeded(err) + if err == nil { + response.Response().Body = &deadlineExceededReadCloser{r: response.Response().Body} + }*/ + logf("Err=%v, response=%v\n", err, response) + + action := "" // This MUST get changed within the switch code below + switch { + case ctx.Err() != nil: + action = "NoRetry: Op timeout" + case !tryingPrimary && response != nil && response.Response() != nil && response.Response().StatusCode == http.StatusNotFound: + // If attempt was against the secondary & it returned a StatusNotFound (404), then + // the resource was not found. This may be due to replication delay. So, in this + // case, we'll never try the secondary again for this operation. + considerSecondary = false + action = "Retry: Secondary URL returned 404" + case err != nil: + // NOTE: Protocol Responder returns non-nil if REST API returns invalid status code for the invoked operation. + // Use ServiceCode to verify if the error is related to storage service-side, + // ServiceCode is set only when error related to storage service happened. + if stErr, ok := err.(StorageError); ok { + if stErr.Temporary() { + action = "Retry: StorageError with error service code and Temporary()" + } else if stErr.Response() != nil && isSuccessStatusCode(stErr.Response()) { // TODO: This is a temporarily work around, remove this after protocol layer fix the issue that net.Error is wrapped as storageError + action = "Retry: StorageError with success status code" + } else { + action = "NoRetry: StorageError not Temporary() and without retriable status code" + } + } else if netErr, ok := err.(net.Error); ok { + // Use non-retriable net.Error list, but not retriable list. + // As there are errors without Temporary() implementation, + // while need be retried, like 'connection reset by peer', 'transport connection broken' and etc. + // So the SDK do retry for most of the case, unless the error should not be retried for sure. + if !isNotRetriable(netErr) { + action = "Retry: net.Error and not in the non-retriable list" + } else { + action = "NoRetry: net.Error and in the non-retriable list" + } + } else { + action = "NoRetry: unrecognized error" + } + default: + action = "NoRetry: successful HTTP request" // no error + } + + logf("Action=%s\n", action) + // fmt.Println(action + "\n") // This is where we could log the retry operation; action is why we're retrying + if action[0] != 'R' { // Retry only if action starts with 'R' + if err != nil { + tryCancel() // If we're returning an error, cancel this current/last per-retry timeout context + } else { + // We wrap the last per-try context in a body and overwrite the Response's Body field with our wrapper. + // So, when the user closes the Body, the our per-try context gets closed too. + // Another option, is that the Last Policy do this wrapping for a per-retry context (not for the user's context) + if response == nil || response.Response() == nil { + // We do panic in the case response or response.Response() is nil, + // as for client, the response should not be nil if request is sent and the operations is executed successfully. + // Another option, is that execute the cancel function when response or response.Response() is nil, + // as in this case, current per-try has nothing to do in future. + return nil, errors.New("invalid state, response should not be nil when the operation is executed successfully") + } + response.Response().Body = &contextCancelReadCloser{cf: tryCancel, body: response.Response().Body} + } + break // Don't retry + } + if response != nil && response.Response() != nil && response.Response().Body != nil { + // If we're going to retry and we got a previous response, then flush its body to avoid leaking its TCP connection + body := response.Response().Body + io.Copy(ioutil.Discard, body) + body.Close() + } + // If retrying, cancel the current per-try timeout context + tryCancel() + } + return response, err // Not retryable or too many retries; return the last response/error + } + }) +} + +// contextCancelReadCloser helps to invoke context's cancelFunc properly when the ReadCloser is closed. +type contextCancelReadCloser struct { + cf context.CancelFunc + body io.ReadCloser +} + +func (rc *contextCancelReadCloser) Read(p []byte) (n int, err error) { + return rc.body.Read(p) +} + +func (rc *contextCancelReadCloser) Close() error { + err := rc.body.Close() + if rc.cf != nil { + rc.cf() + } + return err +} + +// isNotRetriable checks if the provided net.Error isn't retriable. +func isNotRetriable(errToParse net.Error) bool { + // No error, so this is NOT retriable. + if errToParse == nil { + return true + } + + // The error is either temporary or a timeout so it IS retriable (not not retriable). + if errToParse.Temporary() || errToParse.Timeout() { + return false + } + + genericErr := error(errToParse) + + // From here all the error are neither Temporary() nor Timeout(). + switch err := errToParse.(type) { + case *net.OpError: + // The net.Error is also a net.OpError but the inner error is nil, so this is not retriable. + if err.Err == nil { + return true + } + genericErr = err.Err + } + + switch genericErr.(type) { + case *net.AddrError, net.UnknownNetworkError, *net.DNSError, net.InvalidAddrError, *net.ParseError, *net.DNSConfigError: + // If the error is one of the ones listed, then it is NOT retriable. + return true + } + + // If it's invalid header field name/value error thrown by http module, then it is NOT retriable. + // This could happen when metadata's key or value is invalid. (RoundTrip in transport.go) + if strings.Contains(genericErr.Error(), "invalid header field") { + return true + } + + // Assume the error is retriable. + return false +} + +var successStatusCodes = []int{http.StatusOK, http.StatusCreated, http.StatusAccepted, http.StatusNoContent, http.StatusPartialContent} + +func isSuccessStatusCode(resp *http.Response) bool { + if resp == nil { + return false + } + for _, i := range successStatusCodes { + if i == resp.StatusCode { + return true + } + } + return false +} + +// According to https://github.com/golang/go/wiki/CompilerOptimizations, the compiler will inline this method and hopefully optimize all calls to it away +var logf = func(format string, a ...interface{}) {} + +// Use this version to see the retry method's code path (import "fmt") +//var logf = fmt.Printf + +/* +type deadlineExceededReadCloser struct { + r io.ReadCloser +} + +func (r *deadlineExceededReadCloser) Read(p []byte) (int, error) { + n, err := 0, io.EOF + if r.r != nil { + n, err = r.r.Read(p) + } + return n, improveDeadlineExceeded(err) +} +func (r *deadlineExceededReadCloser) Seek(offset int64, whence int) (int64, error) { + // For an HTTP request, the ReadCloser MUST also implement seek + // For an HTTP response, Seek MUST not be called (or this will panic) + o, err := r.r.(io.Seeker).Seek(offset, whence) + return o, improveDeadlineExceeded(err) +} +func (r *deadlineExceededReadCloser) Close() error { + if c, ok := r.r.(io.Closer); ok { + c.Close() + } + return nil +} + +// timeoutError is the internal struct that implements our richer timeout error. +type deadlineExceeded struct { + responseError +} + +var _ net.Error = (*deadlineExceeded)(nil) // Ensure deadlineExceeded implements the net.Error interface at compile time + +// improveDeadlineExceeded creates a timeoutError object that implements the error interface IF cause is a context.DeadlineExceeded error. +func improveDeadlineExceeded(cause error) error { + // If cause is not DeadlineExceeded, return the same error passed in. + if cause != context.DeadlineExceeded { + return cause + } + // Else, convert DeadlineExceeded to our timeoutError which gives a richer string message + return &deadlineExceeded{ + responseError: responseError{ + ErrorNode: pipeline.ErrorNode{}.Initialize(cause, 3), + }, + } +} + +// Error implements the error interface's Error method to return a string representation of the error. +func (e *deadlineExceeded) Error() string { + return e.ErrorNode.Error("context deadline exceeded; when creating a pipeline, consider increasing RetryOptions' TryTimeout field") +} +*/ diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_telemetry.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_telemetry.go similarity index 100% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_telemetry.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_telemetry.go diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_unique_request_id.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_unique_request_id.go similarity index 100% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_unique_request_id.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_unique_request_id.go diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_retry_reader.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_retry_reader.go new file mode 100644 index 000000000000..3247aca6621f --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_retry_reader.go @@ -0,0 +1,178 @@ +package azblob + +import ( + "context" + "io" + "net" + "net/http" + "strings" + "sync" +) + +const CountToEnd = 0 + +// HTTPGetter is a function type that refers to a method that performs an HTTP GET operation. +type HTTPGetter func(ctx context.Context, i HTTPGetterInfo) (*http.Response, error) + +// HTTPGetterInfo is passed to an HTTPGetter function passing it parameters +// that should be used to make an HTTP GET request. +type HTTPGetterInfo struct { + // Offset specifies the start offset that should be used when + // creating the HTTP GET request's Range header + Offset int64 + + // Count specifies the count of bytes that should be used to calculate + // the end offset when creating the HTTP GET request's Range header + Count int64 + + // ETag specifies the resource's etag that should be used when creating + // the HTTP GET request's If-Match header + ETag ETag +} + +// FailedReadNotifier is a function type that represents the notification function called when a read fails +type FailedReadNotifier func(failureCount int, lastError error, offset int64, count int64, willRetry bool) + +// RetryReaderOptions contains properties which can help to decide when to do retry. +type RetryReaderOptions struct { + // MaxRetryRequests specifies the maximum number of HTTP GET requests that will be made + // while reading from a RetryReader. A value of zero means that no additional HTTP + // GET requests will be made. + MaxRetryRequests int + doInjectError bool + doInjectErrorRound int + + // NotifyFailedRead is called, if non-nil, after any failure to read. Expected usage is diagnostic logging. + NotifyFailedRead FailedReadNotifier + + // TreatEarlyCloseAsError can be set to true to prevent retries after "read on closed response body". By default, + // retryReader has the following special behaviour: closing the response body before it is all read is treated as a + // retryable error. This is to allow callers to force a retry by closing the body from another goroutine (e.g. if the = + // read is too slow, caller may want to force a retry in the hope that the retry will be quicker). If + // TreatEarlyCloseAsError is true, then retryReader's special behaviour is suppressed, and "read on closed body" is instead + // treated as a fatal (non-retryable) error. + // Note that setting TreatEarlyCloseAsError only guarantees that Closing will produce a fatal error if the Close happens + // from the same "thread" (goroutine) as Read. Concurrent Close calls from other goroutines may instead produce network errors + // which will be retried. + TreatEarlyCloseAsError bool +} + +// retryReader implements io.ReaderCloser methods. +// retryReader tries to read from response, and if there is retriable network error +// returned during reading, it will retry according to retry reader option through executing +// user defined action with provided data to get a new response, and continue the overall reading process +// through reading from the new response. +type retryReader struct { + ctx context.Context + info HTTPGetterInfo + countWasBounded bool + o RetryReaderOptions + getter HTTPGetter + + // we support Close-ing during Reads (from other goroutines), so we protect the shared state, which is response + responseMu *sync.Mutex + response *http.Response +} + +// NewRetryReader creates a retry reader. +func NewRetryReader(ctx context.Context, initialResponse *http.Response, + info HTTPGetterInfo, o RetryReaderOptions, getter HTTPGetter) io.ReadCloser { + return &retryReader{ + ctx: ctx, + getter: getter, + info: info, + countWasBounded: info.Count != CountToEnd, + response: initialResponse, + responseMu: &sync.Mutex{}, + o: o} +} + +func (s *retryReader) setResponse(r *http.Response) { + s.responseMu.Lock() + defer s.responseMu.Unlock() + s.response = r +} + +func (s *retryReader) Read(p []byte) (n int, err error) { + for try := 0; ; try++ { + //fmt.Println(try) // Comment out for debugging. + if s.countWasBounded && s.info.Count == CountToEnd { + // User specified an original count and the remaining bytes are 0, return 0, EOF + return 0, io.EOF + } + + s.responseMu.Lock() + resp := s.response + s.responseMu.Unlock() + if resp == nil { // We don't have a response stream to read from, try to get one. + newResponse, err := s.getter(s.ctx, s.info) + if err != nil { + return 0, err + } + // Successful GET; this is the network stream we'll read from. + s.setResponse(newResponse) + resp = newResponse + } + n, err := resp.Body.Read(p) // Read from the stream (this will return non-nil err if forceRetry is called, from another goroutine, while it is running) + + // Injection mechanism for testing. + if s.o.doInjectError && try == s.o.doInjectErrorRound { + err = &net.DNSError{IsTemporary: true} + } + + // We successfully read data or end EOF. + if err == nil || err == io.EOF { + s.info.Offset += int64(n) // Increments the start offset in case we need to make a new HTTP request in the future + if s.info.Count != CountToEnd { + s.info.Count -= int64(n) // Decrement the count in case we need to make a new HTTP request in the future + } + return n, err // Return the return to the caller + } + s.Close() // Error, close stream + s.setResponse(nil) // Our stream is no longer good + + // Check the retry count and error code, and decide whether to retry. + retriesExhausted := try >= s.o.MaxRetryRequests + _, isNetError := err.(net.Error) + willRetry := (isNetError || s.wasRetryableEarlyClose(err)) && !retriesExhausted + + // Notify, for logging purposes, of any failures + if s.o.NotifyFailedRead != nil { + failureCount := try + 1 // because try is zero-based + s.o.NotifyFailedRead(failureCount, err, s.info.Offset, s.info.Count, willRetry) + } + + if willRetry { + continue + // Loop around and try to get and read from new stream. + } + return n, err // Not retryable, or retries exhausted, so just return + } +} + +// By default, we allow early Closing, from another concurrent goroutine, to be used to force a retry +// Is this safe, to close early from another goroutine? Early close ultimately ends up calling +// net.Conn.Close, and that is documented as "Any blocked Read or Write operations will be unblocked and return errors" +// which is exactly the behaviour we want. +// NOTE: that if caller has forced an early Close from a separate goroutine (separate from the Read) +// then there are two different types of error that may happen - either the one one we check for here, +// or a net.Error (due to closure of connection). Which one happens depends on timing. We only need this routine +// to check for one, since the other is a net.Error, which our main Read retry loop is already handing. +func (s *retryReader) wasRetryableEarlyClose(err error) bool { + if s.o.TreatEarlyCloseAsError { + return false // user wants all early closes to be errors, and so not retryable + } + // unfortunately, http.errReadOnClosedResBody is private, so the best we can do here is to check for its text + return strings.HasSuffix(err.Error(), ReadOnClosedBodyMessage) +} + +const ReadOnClosedBodyMessage = "read on closed response body" + +func (s *retryReader) Close() error { + s.responseMu.Lock() + defer s.responseMu.Unlock() + if s.response != nil && s.response.Body != nil { + return s.response.Body.Close() + } + return nil +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_account.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_sas_account.go similarity index 94% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_account.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_sas_account.go index 8b51193f6a07..c000c48ec828 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_account.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_sas_account.go @@ -2,6 +2,7 @@ package azblob import ( "bytes" + "errors" "fmt" "strings" "time" @@ -22,21 +23,21 @@ type AccountSASSignatureValues struct { // NewSASQueryParameters uses an account's shared key credential to sign this signature values to produce // the proper SAS query parameters. -func (v AccountSASSignatureValues) NewSASQueryParameters(sharedKeyCredential *SharedKeyCredential) SASQueryParameters { +func (v AccountSASSignatureValues) NewSASQueryParameters(sharedKeyCredential *SharedKeyCredential) (SASQueryParameters, error) { // https://docs.microsoft.com/en-us/rest/api/storageservices/Constructing-an-Account-SAS if v.ExpiryTime.IsZero() || v.Permissions == "" || v.ResourceTypes == "" || v.Services == "" { - panic("Account SAS is missing at least one of these: ExpiryTime, Permissions, Service, or ResourceType") + return SASQueryParameters{}, errors.New("account SAS is missing at least one of these: ExpiryTime, Permissions, Service, or ResourceType") } if v.Version == "" { v.Version = SASVersion } perms := &AccountSASPermissions{} if err := perms.Parse(v.Permissions); err != nil { - panic(err) + return SASQueryParameters{}, err } v.Permissions = perms.String() - startTime, expiryTime := FormatTimesForSASSigning(v.StartTime, v.ExpiryTime) + startTime, expiryTime, _ := FormatTimesForSASSigning(v.StartTime, v.ExpiryTime, time.Time{}) stringToSign := strings.Join([]string{ sharedKeyCredential.AccountName(), @@ -68,7 +69,8 @@ func (v AccountSASSignatureValues) NewSASQueryParameters(sharedKeyCredential *Sh // Calculated SAS signature signature: signature, } - return p + + return p, nil } // The AccountSASPermissions type simplifies creating the permissions string for an Azure Storage Account SAS. @@ -205,7 +207,7 @@ func (rt *AccountSASResourceTypes) Parse(s string) error { switch r { case 's': rt.Service = true - case 'q': + case 'c': rt.Container = true case 'o': rt.Object = true diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_sas_query_params.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_sas_query_params.go new file mode 100644 index 000000000000..11b1b2ba0bb5 --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_sas_query_params.go @@ -0,0 +1,322 @@ +package azblob + +import ( + "net" + "net/url" + "strings" + "time" +) + +// SASVersion indicates the SAS version. +const SASVersion = ServiceVersion + +type SASProtocol string + +const ( + // SASProtocolHTTPS can be specified for a SAS protocol + SASProtocolHTTPS SASProtocol = "https" + + // SASProtocolHTTPSandHTTP can be specified for a SAS protocol + SASProtocolHTTPSandHTTP SASProtocol = "https,http" +) + +// FormatTimesForSASSigning converts a time.Time to a snapshotTimeFormat string suitable for a +// SASField's StartTime or ExpiryTime fields. Returns "" if value.IsZero(). +func FormatTimesForSASSigning(startTime, expiryTime, snapshotTime time.Time) (string, string, string) { + ss := "" + if !startTime.IsZero() { + ss = startTime.Format(SASTimeFormat) // "yyyy-MM-ddTHH:mm:ssZ" + } + se := "" + if !expiryTime.IsZero() { + se = expiryTime.Format(SASTimeFormat) // "yyyy-MM-ddTHH:mm:ssZ" + } + sh := "" + if !snapshotTime.IsZero() { + sh = snapshotTime.Format(SnapshotTimeFormat) + } + return ss, se, sh +} + +// SASTimeFormat represents the format of a SAS start or expiry time. Use it when formatting/parsing a time.Time. +const SASTimeFormat = "2006-01-02T15:04:05Z" //"2017-07-27T00:00:00Z" // ISO 8601 + +// https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas + +// A SASQueryParameters object represents the components that make up an Azure Storage SAS' query parameters. +// You parse a map of query parameters into its fields by calling NewSASQueryParameters(). You add the components +// to a query parameter map by calling AddToValues(). +// NOTE: Changing any field requires computing a new SAS signature using a XxxSASSignatureValues type. +// +// This type defines the components used by all Azure Storage resources (Containers, Blobs, Files, & Queues). +type SASQueryParameters struct { + // All members are immutable or values so copies of this struct are goroutine-safe. + version string `param:"sv"` + services string `param:"ss"` + resourceTypes string `param:"srt"` + protocol SASProtocol `param:"spr"` + startTime time.Time `param:"st"` + expiryTime time.Time `param:"se"` + snapshotTime time.Time `param:"snapshot"` + ipRange IPRange `param:"sip"` + identifier string `param:"si"` + resource string `param:"sr"` + permissions string `param:"sp"` + signature string `param:"sig"` + cacheControl string `param:"rscc"` + contentDisposition string `param:"rscd"` + contentEncoding string `param:"rsce"` + contentLanguage string `param:"rscl"` + contentType string `param:"rsct"` + signedOid string `param:"skoid"` + signedTid string `param:"sktid"` + signedStart time.Time `param:"skt"` + signedExpiry time.Time `param:"ske"` + signedService string `param:"sks"` + signedVersion string `param:"skv"` +} + +func (p *SASQueryParameters) SignedOid() string { + return p.signedOid +} + +func (p *SASQueryParameters) SignedTid() string { + return p.signedTid +} + +func (p *SASQueryParameters) SignedStart() time.Time { + return p.signedStart +} + +func (p *SASQueryParameters) SignedExpiry() time.Time { + return p.signedExpiry +} + +func (p *SASQueryParameters) SignedService() string { + return p.signedService +} + +func (p *SASQueryParameters) SignedVersion() string { + return p.signedVersion +} + +func (p *SASQueryParameters) SnapshotTime() time.Time { + return p.snapshotTime +} + +func (p *SASQueryParameters) Version() string { + return p.version +} + +func (p *SASQueryParameters) Services() string { + return p.services +} +func (p *SASQueryParameters) ResourceTypes() string { + return p.resourceTypes +} +func (p *SASQueryParameters) Protocol() SASProtocol { + return p.protocol +} +func (p *SASQueryParameters) StartTime() time.Time { + return p.startTime +} +func (p *SASQueryParameters) ExpiryTime() time.Time { + return p.expiryTime +} + +func (p *SASQueryParameters) IPRange() IPRange { + return p.ipRange +} + +func (p *SASQueryParameters) Identifier() string { + return p.identifier +} + +func (p *SASQueryParameters) Resource() string { + return p.resource +} +func (p *SASQueryParameters) Permissions() string { + return p.permissions +} + +func (p *SASQueryParameters) Signature() string { + return p.signature +} + +func (p *SASQueryParameters) CacheControl() string { + return p.cacheControl +} + +func (p *SASQueryParameters) ContentDisposition() string { + return p.contentDisposition +} + +func (p *SASQueryParameters) ContentEncoding() string { + return p.contentEncoding +} + +func (p *SASQueryParameters) ContentLanguage() string { + return p.contentLanguage +} + +func (p *SASQueryParameters) ContentType() string { + return p.contentType +} + +// IPRange represents a SAS IP range's start IP and (optionally) end IP. +type IPRange struct { + Start net.IP // Not specified if length = 0 + End net.IP // Not specified if length = 0 +} + +// String returns a string representation of an IPRange. +func (ipr *IPRange) String() string { + if len(ipr.Start) == 0 { + return "" + } + start := ipr.Start.String() + if len(ipr.End) == 0 { + return start + } + return start + "-" + ipr.End.String() +} + +// NewSASQueryParameters creates and initializes a SASQueryParameters object based on the +// query parameter map's passed-in values. If deleteSASParametersFromValues is true, +// all SAS-related query parameters are removed from the passed-in map. If +// deleteSASParametersFromValues is false, the map passed-in map is unaltered. +func newSASQueryParameters(values url.Values, deleteSASParametersFromValues bool) SASQueryParameters { + p := SASQueryParameters{} + for k, v := range values { + val := v[0] + isSASKey := true + switch strings.ToLower(k) { + case "sv": + p.version = val + case "ss": + p.services = val + case "srt": + p.resourceTypes = val + case "spr": + p.protocol = SASProtocol(val) + case "snapshot": + p.snapshotTime, _ = time.Parse(SnapshotTimeFormat, val) + case "st": + p.startTime, _ = time.Parse(SASTimeFormat, val) + case "se": + p.expiryTime, _ = time.Parse(SASTimeFormat, val) + case "sip": + dashIndex := strings.Index(val, "-") + if dashIndex == -1 { + p.ipRange.Start = net.ParseIP(val) + } else { + p.ipRange.Start = net.ParseIP(val[:dashIndex]) + p.ipRange.End = net.ParseIP(val[dashIndex+1:]) + } + case "si": + p.identifier = val + case "sr": + p.resource = val + case "sp": + p.permissions = val + case "sig": + p.signature = val + case "rscc": + p.cacheControl = val + case "rscd": + p.contentDisposition = val + case "rsce": + p.contentEncoding = val + case "rscl": + p.contentLanguage = val + case "rsct": + p.contentType = val + case "skoid": + p.signedOid = val + case "sktid": + p.signedTid = val + case "skt": + p.signedStart, _ = time.Parse(SASTimeFormat, val) + case "ske": + p.signedExpiry, _ = time.Parse(SASTimeFormat, val) + case "sks": + p.signedService = val + case "skv": + p.signedVersion = val + default: + isSASKey = false // We didn't recognize the query parameter + } + if isSASKey && deleteSASParametersFromValues { + delete(values, k) + } + } + return p +} + +// AddToValues adds the SAS components to the specified query parameters map. +func (p *SASQueryParameters) addToValues(v url.Values) url.Values { + if p.version != "" { + v.Add("sv", p.version) + } + if p.services != "" { + v.Add("ss", p.services) + } + if p.resourceTypes != "" { + v.Add("srt", p.resourceTypes) + } + if p.protocol != "" { + v.Add("spr", string(p.protocol)) + } + if !p.startTime.IsZero() { + v.Add("st", p.startTime.Format(SASTimeFormat)) + } + if !p.expiryTime.IsZero() { + v.Add("se", p.expiryTime.Format(SASTimeFormat)) + } + if len(p.ipRange.Start) > 0 { + v.Add("sip", p.ipRange.String()) + } + if p.identifier != "" { + v.Add("si", p.identifier) + } + if p.resource != "" { + v.Add("sr", p.resource) + } + if p.permissions != "" { + v.Add("sp", p.permissions) + } + if p.signedOid != "" { + v.Add("skoid", p.signedOid) + v.Add("sktid", p.signedTid) + v.Add("skt", p.signedStart.Format(SASTimeFormat)) + v.Add("ske", p.signedExpiry.Format(SASTimeFormat)) + v.Add("sks", p.signedService) + v.Add("skv", p.signedVersion) + } + if p.signature != "" { + v.Add("sig", p.signature) + } + if p.cacheControl != "" { + v.Add("rscc", p.cacheControl) + } + if p.contentDisposition != "" { + v.Add("rscd", p.contentDisposition) + } + if p.contentEncoding != "" { + v.Add("rsce", p.contentEncoding) + } + if p.contentLanguage != "" { + v.Add("rscl", p.contentLanguage) + } + if p.contentType != "" { + v.Add("rsct", p.contentType) + } + return v +} + +// Encode encodes the SAS query parameters into URL encoded form sorted by key. +func (p *SASQueryParameters) Encode() string { + v := url.Values{} + p.addToValues(v) + return v.Encode() +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_service_codes_common.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_service_codes_common.go similarity index 100% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_service_codes_common.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_service_codes_common.go diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_storage_error.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_storage_error.go similarity index 95% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_storage_error.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_storage_error.go index 03178b247abd..e7872a8a3f26 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_storage_error.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_storage_error.go @@ -43,11 +43,14 @@ func newStorageError(cause error, response *http.Response, description string) e response: response, description: description, }, + serviceCode: ServiceCodeType(response.Header.Get("x-ms-error-code")), } } // ServiceCode returns service-error information. The caller may examine these values but should not modify any of them. -func (e *storageError) ServiceCode() ServiceCodeType { return e.serviceCode } +func (e *storageError) ServiceCode() ServiceCodeType { + return e.serviceCode +} // Error implements the error interface's Error method to return a string representation of the error. func (e *storageError) Error() string { @@ -94,8 +97,6 @@ func (e *storageError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err break case xml.CharData: switch tokName { - case "Code": - e.serviceCode = ServiceCodeType(tt) case "Message": e.description = string(tt) default: diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_util_validate.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_util_validate.go new file mode 100644 index 000000000000..d7b2507e43f4 --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_util_validate.go @@ -0,0 +1,64 @@ +package azblob + +import ( + "errors" + "fmt" + "io" + "strconv" +) + +// httpRange defines a range of bytes within an HTTP resource, starting at offset and +// ending at offset+count. A zero-value httpRange indicates the entire resource. An httpRange +// which has an offset but na zero value count indicates from the offset to the resource's end. +type httpRange struct { + offset int64 + count int64 +} + +func (r httpRange) pointers() *string { + if r.offset == 0 && r.count == CountToEnd { // Do common case first for performance + return nil // No specified range + } + endOffset := "" // if count == CountToEnd (0) + if r.count > 0 { + endOffset = strconv.FormatInt((r.offset+r.count)-1, 10) + } + dataRange := fmt.Sprintf("bytes=%v-%s", r.offset, endOffset) + return &dataRange +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +func validateSeekableStreamAt0AndGetCount(body io.ReadSeeker) (int64, error) { + if body == nil { // nil body's are "logically" seekable to 0 and are 0 bytes long + return 0, nil + } + + err := validateSeekableStreamAt0(body) + if err != nil { + return 0, err + } + + count, err := body.Seek(0, io.SeekEnd) + if err != nil { + return 0, errors.New("body stream must be seekable") + } + + body.Seek(0, io.SeekStart) + return count, nil +} + +// return an error if body is not a valid seekable stream at 0 +func validateSeekableStreamAt0(body io.ReadSeeker) error { + if body == nil { // nil body's are "logically" seekable to 0 + return nil + } + if pos, err := body.Seek(0, io.SeekCurrent); pos != 0 || err != nil { + // Help detect programmer error + if err != nil { + return errors.New("body stream must be seekable") + } + return errors.New("body stream must be set to position 0") + } + return nil +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_uuid.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_uuid.go similarity index 96% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_uuid.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_uuid.go index 1fc7e89cf29e..66799f9cb65b 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_uuid.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_uuid.go @@ -21,10 +21,7 @@ type uuid [16]byte func newUUID() (u uuid) { u = uuid{} // Set all bits to randomly (or pseudo-randomly) chosen values. - _, err := rand.Read(u[:]) - if err != nil { - panic("ran.Read failed") - } + rand.Read(u[:]) u[8] = (u[8] | reservedRFC4122) & 0x7F // u.setVariant(ReservedRFC4122) var version byte = 4 diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zt_doc.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zt_doc.go similarity index 100% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zt_doc.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zt_doc.go diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_append_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_append_blob.go new file mode 100644 index 000000000000..719bcb624e8e --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_append_blob.go @@ -0,0 +1,349 @@ +package azblob + +// Code generated by Microsoft (R) AutoRest Code Generator. +// Changes may cause incorrect behavior and will be lost if the code is regenerated. + +import ( + "context" + "encoding/base64" + "github.com/Azure/azure-pipeline-go/pipeline" + "io" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "time" +) + +// appendBlobClient is the client for the AppendBlob methods of the Azblob service. +type appendBlobClient struct { + managementClient +} + +// newAppendBlobClient creates an instance of the appendBlobClient client. +func newAppendBlobClient(url url.URL, p pipeline.Pipeline) appendBlobClient { + return appendBlobClient{newManagementClient(url, p)} +} + +// AppendBlock the Append Block operation commits a new block of data to the end of an existing append blob. The Append +// Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is +// supported only on version 2015-02-21 version or later. +// +// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an +// error.contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more +// information, see Setting +// Timeouts for Blob Service Operations. transactionalContentMD5 is specify the transactional md5 for the body, to +// be validated by the service. leaseID is if specified, the operation only succeeds if the resource's lease is active +// and matches this ID. maxSize is optional conditional header. The max length in bytes permitted for the append blob. +// If the Append Block operation would cause the blob to exceed that limit or if the blob size is already greater than +// the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error (HTTP status code +// 412 - Precondition Failed). appendPosition is optional conditional header, used only for the Append Block operation. +// A number indicating the byte offset to compare. Append Block will succeed only if the append position is equal to +// this number. If it is not, the request will fail with the AppendPositionConditionNotMet error (HTTP status code 412 +// - Precondition Failed). ifModifiedSince is specify this header value to operate only on a blob if it has been +// modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if +// it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate only on blobs +// with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics +// logs when storage analytics logging is enabled. +func (client appendBlobClient) AppendBlock(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, transactionalContentMD5 []byte, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*AppendBlobAppendBlockResponse, error) { + if err := validate([]validation{ + {targetValue: body, + constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.appendBlockPreparer(body, contentLength, timeout, transactionalContentMD5, leaseID, maxSize, appendPosition, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.appendBlockResponder}, req) + if err != nil { + return nil, err + } + return resp.(*AppendBlobAppendBlockResponse), err +} + +// appendBlockPreparer prepares the AppendBlock request. +func (client appendBlobClient) appendBlockPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, transactionalContentMD5 []byte, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, body) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("comp", "appendblock") + req.URL.RawQuery = params.Encode() + req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) + if transactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(transactionalContentMD5)) + } + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if maxSize != nil { + req.Header.Set("x-ms-blob-condition-maxsize", strconv.FormatInt(*maxSize, 10)) + } + if appendPosition != nil { + req.Header.Set("x-ms-blob-condition-appendpos", strconv.FormatInt(*appendPosition, 10)) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + return req, nil +} + +// appendBlockResponder handles the response to the AppendBlock request. +func (client appendBlobClient) appendBlockResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK, http.StatusCreated) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &AppendBlobAppendBlockResponse{rawResponse: resp.Response()}, err +} + +// AppendBlockFromURL the Append Block operation commits a new block of data to the end of an existing append blob +// where the contents are read from a source url. The Append Block operation is permitted only if the blob was created +// with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later. +// +// sourceURL is specify a URL to the copy source. contentLength is the length of the request. sourceRange is bytes of +// source data in the specified range. sourceContentMD5 is specify the md5 calculated for the range of bytes that must +// be read from the copy source. timeout is the timeout parameter is expressed in seconds. For more information, see Setting +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's +// lease is active and matches this ID. maxSize is optional conditional header. The max length in bytes permitted for +// the append blob. If the Append Block operation would cause the blob to exceed that limit or if the blob size is +// already greater than the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error +// (HTTP status code 412 - Precondition Failed). appendPosition is optional conditional header, used only for the +// Append Block operation. A number indicating the byte offset to compare. Append Block will succeed only if the append +// position is equal to this number. If it is not, the request will fail with the AppendPositionConditionNotMet error +// (HTTP status code 412 - Precondition Failed). ifModifiedSince is specify this header value to operate only on a blob +// if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate +// only on a blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to +// operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a +// matching value. sourceIfModifiedSince is specify this header value to operate only on a blob if it has been modified +// since the specified date/time. sourceIfUnmodifiedSince is specify this header value to operate only on a blob if it +// has not been modified since the specified date/time. sourceIfMatch is specify an ETag value to operate only on blobs +// with a matching value. sourceIfNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics +// logs when storage analytics logging is enabled. +func (client appendBlobClient) AppendBlockFromURL(ctx context.Context, sourceURL string, contentLength int64, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, requestID *string) (*AppendBlobAppendBlockFromURLResponse, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.appendBlockFromURLPreparer(sourceURL, contentLength, sourceRange, sourceContentMD5, timeout, leaseID, maxSize, appendPosition, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatch, sourceIfNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.appendBlockFromURLResponder}, req) + if err != nil { + return nil, err + } + return resp.(*AppendBlobAppendBlockFromURLResponse), err +} + +// appendBlockFromURLPreparer prepares the AppendBlockFromURL request. +func (client appendBlobClient) appendBlockFromURLPreparer(sourceURL string, contentLength int64, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("comp", "appendblock") + req.URL.RawQuery = params.Encode() + req.Header.Set("x-ms-copy-source", sourceURL) + if sourceRange != nil { + req.Header.Set("x-ms-source-range", *sourceRange) + } + if sourceContentMD5 != nil { + req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(sourceContentMD5)) + } + req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if maxSize != nil { + req.Header.Set("x-ms-blob-condition-maxsize", strconv.FormatInt(*maxSize, 10)) + } + if appendPosition != nil { + req.Header.Set("x-ms-blob-condition-appendpos", strconv.FormatInt(*appendPosition, 10)) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + if sourceIfModifiedSince != nil { + req.Header.Set("x-ms-source-if-modified-since", (*sourceIfModifiedSince).In(gmt).Format(time.RFC1123)) + } + if sourceIfUnmodifiedSince != nil { + req.Header.Set("x-ms-source-if-unmodified-since", (*sourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if sourceIfMatch != nil { + req.Header.Set("x-ms-source-if-match", string(*sourceIfMatch)) + } + if sourceIfNoneMatch != nil { + req.Header.Set("x-ms-source-if-none-match", string(*sourceIfNoneMatch)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + return req, nil +} + +// appendBlockFromURLResponder handles the response to the AppendBlockFromURL request. +func (client appendBlobClient) appendBlockFromURLResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK, http.StatusCreated) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &AppendBlobAppendBlockFromURLResponse{rawResponse: resp.Response()}, err +} + +// Create the Create Append Blob operation creates a new append blob. +// +// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more +// information, see Setting +// Timeouts for Blob Service Operations. blobContentType is optional. Sets the blob's content type. If specified, +// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the +// blob's content encoding. If specified, this property is stored with the blob and returned with a read request. +// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the +// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this +// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded. +// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and +// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the +// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the +// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, +// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and +// Metadata for more information. leaseID is if specified, the operation only succeeds if the resource's lease is +// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. +// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified +// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified +// since the specified date/time. ifMatch is specify an ETag value to operate only on blobs with a matching value. +// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a +// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage +// analytics logging is enabled. +func (client appendBlobClient) Create(ctx context.Context, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*AppendBlobCreateResponse, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.createPreparer(contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req) + if err != nil { + return nil, err + } + return resp.(*AppendBlobCreateResponse), err +} + +// createPreparer prepares the Create request. +func (client appendBlobClient) createPreparer(contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + req.URL.RawQuery = params.Encode() + req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) + if blobContentType != nil { + req.Header.Set("x-ms-blob-content-type", *blobContentType) + } + if blobContentEncoding != nil { + req.Header.Set("x-ms-blob-content-encoding", *blobContentEncoding) + } + if blobContentLanguage != nil { + req.Header.Set("x-ms-blob-content-language", *blobContentLanguage) + } + if blobContentMD5 != nil { + req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(blobContentMD5)) + } + if blobCacheControl != nil { + req.Header.Set("x-ms-blob-cache-control", *blobCacheControl) + } + if metadata != nil { + for k, v := range metadata { + req.Header.Set("x-ms-meta-"+k, v) + } + } + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if blobContentDisposition != nil { + req.Header.Set("x-ms-blob-content-disposition", *blobContentDisposition) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + req.Header.Set("x-ms-blob-type", "AppendBlob") + return req, nil +} + +// createResponder handles the response to the Create request. +func (client appendBlobClient) createResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK, http.StatusCreated) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &AppendBlobCreateResponse{rawResponse: resp.Response()}, err +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_blob.go similarity index 75% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_blob.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_blob.go index b2f8eac665b7..5e30263a0bff 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_blob.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_blob.go @@ -6,14 +6,13 @@ package azblob import ( "context" "encoding/base64" + "github.com/Azure/azure-pipeline-go/pipeline" "io" "io/ioutil" "net/http" "net/url" "strconv" "time" - - "github.com/Azure/azure-pipeline-go/pipeline" ) // blobClient is the client for the Blob methods of the Azblob service. @@ -32,7 +31,7 @@ func newBlobClient(url url.URL, p pipeline.Pipeline) blobClient { // copyID is the copy identifier provided in the x-ms-copy-id header of the original Copy Blob operation. timeout is // the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character // limit that is recorded in the analytics logs when storage analytics logging is enabled. func (client blobClient) AbortCopyFromURL(ctx context.Context, copyID string, timeout *int32, leaseID *string, requestID *string) (*BlobAbortCopyFromURLResponse, error) { @@ -99,18 +98,18 @@ func (client blobClient) abortCopyFromURLResponder(resp pipeline.Response) (pipe // service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor // (String) for a list of valid GUID string formats. ifModifiedSince is specify this header value to operate only on a // blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value +// operate only on a blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value // to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs // without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is // recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) AcquireLease(ctx context.Context, timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobAcquireLeaseResponse, error) { +func (client blobClient) AcquireLease(ctx context.Context, timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlobAcquireLeaseResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.acquireLeasePreparer(timeout, duration, proposedLeaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.acquireLeasePreparer(timeout, duration, proposedLeaseID, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -122,7 +121,7 @@ func (client blobClient) AcquireLease(ctx context.Context, timeout *int32, durat } // acquireLeasePreparer prepares the AcquireLease request. -func (client blobClient) acquireLeasePreparer(timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blobClient) acquireLeasePreparer(timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -145,8 +144,8 @@ func (client blobClient) acquireLeasePreparer(timeout *int32, duration *int32, p if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -182,18 +181,18 @@ func (client blobClient) acquireLeaseResponder(resp pipeline.Response) (pipeline // not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, and an // infinite lease breaks immediately. ifModifiedSince is specify this header value to operate only on a blob if it has // been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the -// analytics logs when storage analytics logging is enabled. -func (client blobClient) BreakLease(ctx context.Context, timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobBreakLeaseResponse, error) { +// blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate only on +// blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics +// logs when storage analytics logging is enabled. +func (client blobClient) BreakLease(ctx context.Context, timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlobBreakLeaseResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.breakLeasePreparer(timeout, breakPeriod, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.breakLeasePreparer(timeout, breakPeriod, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -205,7 +204,7 @@ func (client blobClient) BreakLease(ctx context.Context, timeout *int32, breakPe } // breakLeasePreparer prepares the BreakLease request. -func (client blobClient) breakLeasePreparer(timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blobClient) breakLeasePreparer(timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -225,8 +224,8 @@ func (client blobClient) breakLeasePreparer(timeout *int32, breakPeriod *int32, if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -253,25 +252,25 @@ func (client blobClient) breakLeaseResponder(resp pipeline.Response) (pipeline.R // ChangeLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete // operations // -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// proposedLeaseID is proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the -// proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string -// formats. timeout is the timeout parameter is expressed in seconds. For more information, see Setting // Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if // it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only -// on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate +// on a blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate // only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a // matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded // in the analytics logs when storage analytics logging is enabled. -func (client blobClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobChangeLeaseResponse, error) { +func (client blobClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlobChangeLeaseResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.changeLeasePreparer(leaseID, proposedLeaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.changeLeasePreparer(leaseID, proposedLeaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -283,7 +282,7 @@ func (client blobClient) ChangeLease(ctx context.Context, leaseID string, propos } // changeLeasePreparer prepares the ChangeLease request. -func (client blobClient) changeLeasePreparer(leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blobClient) changeLeasePreparer(leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -302,8 +301,8 @@ func (client blobClient) changeLeasePreparer(leaseID string, proposedLeaseID str if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -327,6 +326,111 @@ func (client blobClient) changeLeaseResponder(resp pipeline.Response) (pipeline. return &BlobChangeLeaseResponse{rawResponse: resp.Response()}, err } +// CopyFromURL the Copy From URL operation copies a blob or an internet resource to a new blob. It will not return a +// response until the copy is complete. +// +// copySource is specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that +// specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob +// must either be public or must be authenticated via a shared access signature. timeout is the timeout parameter is +// expressed in seconds. For more information, see Setting +// Timeouts for Blob Service Operations. metadata is optional. Specifies a user-defined name-value pair associated +// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or +// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with +// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version +// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing +// Containers, Blobs, and Metadata for more information. sourceIfModifiedSince is specify this header value to operate +// only on a blob if it has been modified since the specified date/time. sourceIfUnmodifiedSince is specify this header +// value to operate only on a blob if it has not been modified since the specified date/time. sourceIfMatch is specify +// an ETag value to operate only on blobs with a matching value. sourceIfNoneMatch is specify an ETag value to operate +// only on blobs without a matching value. ifModifiedSince is specify this header value to operate only on a blob if it +// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a +// blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate only on +// blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// leaseID is if specified, the operation only succeeds if the resource's lease is active and matches this ID. +// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics +// logs when storage analytics logging is enabled. +func (client blobClient) CopyFromURL(ctx context.Context, copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, leaseID *string, requestID *string) (*BlobCopyFromURLResponse, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.copyFromURLPreparer(copySource, timeout, metadata, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatch, sourceIfNoneMatch, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, leaseID, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.copyFromURLResponder}, req) + if err != nil { + return nil, err + } + return resp.(*BlobCopyFromURLResponse), err +} + +// copyFromURLPreparer prepares the CopyFromURL request. +func (client blobClient) copyFromURLPreparer(copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, leaseID *string, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + req.URL.RawQuery = params.Encode() + if metadata != nil { + for k, v := range metadata { + req.Header.Set("x-ms-meta-"+k, v) + } + } + if sourceIfModifiedSince != nil { + req.Header.Set("x-ms-source-if-modified-since", (*sourceIfModifiedSince).In(gmt).Format(time.RFC1123)) + } + if sourceIfUnmodifiedSince != nil { + req.Header.Set("x-ms-source-if-unmodified-since", (*sourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if sourceIfMatch != nil { + req.Header.Set("x-ms-source-if-match", string(*sourceIfMatch)) + } + if sourceIfNoneMatch != nil { + req.Header.Set("x-ms-source-if-none-match", string(*sourceIfNoneMatch)) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-copy-source", copySource) + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + req.Header.Set("x-ms-requires-sync", "true") + return req, nil +} + +// copyFromURLResponder handles the response to the CopyFromURL request. +func (client blobClient) copyFromURLResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK, http.StatusAccepted) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &BlobCopyFromURLResponse{rawResponse: resp.Response()}, err +} + // CreateSnapshot the Create Snapshot operation creates a read-only snapshot of a blob // // timeout is the timeout parameter is expressed in seconds. For more information, see Creating // a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. deleteSnapshots is required if the blob has associated snapshots. Specify one // of the following two options: include: Delete the base blob and all of its snapshots. only: Delete only the blob's // snapshots and not the blob itself ifModifiedSince is specify this header value to operate only on a blob if it has // been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the -// analytics logs when storage analytics logging is enabled. -func (client blobClient) Delete(ctx context.Context, snapshot *string, timeout *int32, leaseID *string, deleteSnapshots DeleteSnapshotsOptionType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobDeleteResponse, error) { +// blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate only on +// blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics +// logs when storage analytics logging is enabled. +func (client blobClient) Delete(ctx context.Context, snapshot *string, timeout *int32, leaseID *string, deleteSnapshots DeleteSnapshotsOptionType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlobDeleteResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.deletePreparer(snapshot, timeout, leaseID, deleteSnapshots, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.deletePreparer(snapshot, timeout, leaseID, deleteSnapshots, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -458,7 +559,7 @@ func (client blobClient) Delete(ctx context.Context, snapshot *string, timeout * } // deletePreparer prepares the Delete request. -func (client blobClient) deletePreparer(snapshot *string, timeout *int32, leaseID *string, deleteSnapshots DeleteSnapshotsOptionType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blobClient) deletePreparer(snapshot *string, timeout *int32, leaseID *string, deleteSnapshots DeleteSnapshotsOptionType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("DELETE", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -483,8 +584,8 @@ func (client blobClient) deletePreparer(snapshot *string, timeout *int32, leaseI if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -516,22 +617,22 @@ func (client blobClient) deleteResponder(resp pipeline.Response) (pipeline.Respo // a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting // Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified -// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. +// range. leaseID is if specified, the operation only succeeds if the resource's lease is active and matches this ID. // rangeGetContentMD5 is when set to true and specified together with the Range, the service returns the MD5 hash for // the range, as long as the range is less than or equal to 4 MB in size. ifModifiedSince is specify this header value // to operate only on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this -// header value to operate only on a blob if it has not been modified since the specified date/time. ifMatches is -// specify an ETag value to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to -// operate only on blobs without a matching value. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) Download(ctx context.Context, snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, rangeGetContentMD5 *bool, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*downloadResponse, error) { +// header value to operate only on a blob if it has not been modified since the specified date/time. ifMatch is specify +// an ETag value to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only +// on blobs without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character +// limit that is recorded in the analytics logs when storage analytics logging is enabled. +func (client blobClient) Download(ctx context.Context, snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, rangeGetContentMD5 *bool, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*downloadResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.downloadPreparer(snapshot, timeout, rangeParameter, leaseID, rangeGetContentMD5, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.downloadPreparer(snapshot, timeout, rangeParameter, leaseID, rangeGetContentMD5, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -543,7 +644,7 @@ func (client blobClient) Download(ctx context.Context, snapshot *string, timeout } // downloadPreparer prepares the Download request. -func (client blobClient) downloadPreparer(snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, rangeGetContentMD5 *bool, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blobClient) downloadPreparer(snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, rangeGetContentMD5 *bool, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("GET", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -571,8 +672,8 @@ func (client blobClient) downloadPreparer(snapshot *string, timeout *int32, rang if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -593,6 +694,44 @@ func (client blobClient) downloadResponder(resp pipeline.Response) (pipeline.Res return &downloadResponse{rawResponse: resp.Response()}, err } +// GetAccountInfo returns the sku name and account kind +func (client blobClient) GetAccountInfo(ctx context.Context) (*BlobGetAccountInfoResponse, error) { + req, err := client.getAccountInfoPreparer() + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getAccountInfoResponder}, req) + if err != nil { + return nil, err + } + return resp.(*BlobGetAccountInfoResponse), err +} + +// getAccountInfoPreparer prepares the GetAccountInfo request. +func (client blobClient) getAccountInfoPreparer() (pipeline.Request, error) { + req, err := pipeline.NewRequest("GET", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + params.Set("restype", "account") + params.Set("comp", "properties") + req.URL.RawQuery = params.Encode() + req.Header.Set("x-ms-version", ServiceVersion) + return req, nil +} + +// getAccountInfoResponder handles the response to the GetAccountInfo request. +func (client blobClient) getAccountInfoResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &BlobGetAccountInfoResponse{rawResponse: resp.Response()}, err +} + // GetProperties the Get Properties operation returns all user-defined metadata, standard HTTP properties, and system // properties for the blob. It does not return the content of the blob. // @@ -601,21 +740,21 @@ func (client blobClient) downloadResponder(resp pipeline.Response) (pipeline.Res // href="https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob">Creating // a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it // has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the -// analytics logs when storage analytics logging is enabled. -func (client blobClient) GetProperties(ctx context.Context, snapshot *string, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobGetPropertiesResponse, error) { +// blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate only on +// blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics +// logs when storage analytics logging is enabled. +func (client blobClient) GetProperties(ctx context.Context, snapshot *string, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlobGetPropertiesResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.getPropertiesPreparer(snapshot, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.getPropertiesPreparer(snapshot, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -627,7 +766,7 @@ func (client blobClient) GetProperties(ctx context.Context, snapshot *string, ti } // getPropertiesPreparer prepares the GetProperties request. -func (client blobClient) getPropertiesPreparer(snapshot *string, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blobClient) getPropertiesPreparer(snapshot *string, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("HEAD", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -649,8 +788,8 @@ func (client blobClient) getPropertiesPreparer(snapshot *string, timeout *int32, if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -676,23 +815,23 @@ func (client blobClient) getPropertiesResponder(resp pipeline.Response) (pipelin // ReleaseLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete // operations // -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting // Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if // it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only -// on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate +// on a blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate // only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a // matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded // in the analytics logs when storage analytics logging is enabled. -func (client blobClient) ReleaseLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobReleaseLeaseResponse, error) { +func (client blobClient) ReleaseLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlobReleaseLeaseResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.releaseLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.releaseLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -704,7 +843,7 @@ func (client blobClient) ReleaseLease(ctx context.Context, leaseID string, timeo } // releaseLeasePreparer prepares the ReleaseLease request. -func (client blobClient) releaseLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blobClient) releaseLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -722,8 +861,8 @@ func (client blobClient) releaseLeasePreparer(leaseID string, timeout *int32, if if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -750,23 +889,23 @@ func (client blobClient) releaseLeaseResponder(resp pipeline.Response) (pipeline // RenewLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete // operations // -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting // Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if // it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only -// on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate +// on a blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate // only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a // matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded // in the analytics logs when storage analytics logging is enabled. -func (client blobClient) RenewLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobRenewLeaseResponse, error) { +func (client blobClient) RenewLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlobRenewLeaseResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.renewLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.renewLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -778,7 +917,7 @@ func (client blobClient) RenewLease(ctx context.Context, leaseID string, timeout } // renewLeasePreparer prepares the RenewLease request. -func (client blobClient) renewLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blobClient) renewLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -796,8 +935,8 @@ func (client blobClient) renewLeasePreparer(leaseID string, timeout *int32, ifMo if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -832,22 +971,21 @@ func (client blobClient) renewLeaseResponder(resp pipeline.Response) (pipeline.R // blocks were validated when each was uploaded. blobContentEncoding is optional. Sets the blob's content encoding. If // specified, this property is stored with the blob and returned with a read request. blobContentLanguage is optional. // Set the blob's content language. If specified, this property is stored with the blob and returned with a read -// request. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this -// ID. ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the -// specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been -// modified since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching -// value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. -// blobContentDisposition is optional. Sets the blob's Content-Disposition header. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client blobClient) SetHTTPHeaders(ctx context.Context, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentMD5 []byte, blobContentEncoding *string, blobContentLanguage *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentDisposition *string, requestID *string) (*BlobSetHTTPHeadersResponse, error) { +// request. leaseID is if specified, the operation only succeeds if the resource's lease is active and matches this ID. +// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified +// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified +// since the specified date/time. ifMatch is specify an ETag value to operate only on blobs with a matching value. +// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. blobContentDisposition is +// optional. Sets the blob's Content-Disposition header. requestID is provides a client-generated, opaque value with a +// 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. +func (client blobClient) SetHTTPHeaders(ctx context.Context, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentMD5 []byte, blobContentEncoding *string, blobContentLanguage *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, blobContentDisposition *string, requestID *string) (*BlobSetHTTPHeadersResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.setHTTPHeadersPreparer(timeout, blobCacheControl, blobContentType, blobContentMD5, blobContentEncoding, blobContentLanguage, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, blobContentDisposition, requestID) + req, err := client.setHTTPHeadersPreparer(timeout, blobCacheControl, blobContentType, blobContentMD5, blobContentEncoding, blobContentLanguage, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, blobContentDisposition, requestID) if err != nil { return nil, err } @@ -859,7 +997,7 @@ func (client blobClient) SetHTTPHeaders(ctx context.Context, timeout *int32, blo } // setHTTPHeadersPreparer prepares the SetHTTPHeaders request. -func (client blobClient) setHTTPHeadersPreparer(timeout *int32, blobCacheControl *string, blobContentType *string, blobContentMD5 []byte, blobContentEncoding *string, blobContentLanguage *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentDisposition *string, requestID *string) (pipeline.Request, error) { +func (client blobClient) setHTTPHeadersPreparer(timeout *int32, blobCacheControl *string, blobContentType *string, blobContentMD5 []byte, blobContentEncoding *string, blobContentLanguage *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, blobContentDisposition *string, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -894,8 +1032,8 @@ func (client blobClient) setHTTPHeadersPreparer(timeout *int32, blobCacheControl if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -932,23 +1070,20 @@ func (client blobClient) setHTTPHeadersResponder(resp pipeline.Response) (pipeli // the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version // 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing // Containers, Blobs, and Metadata for more information. leaseID is if specified, the operation only succeeds if the -// container's lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a +// resource's lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a // blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value +// operate only on a blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value // to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs // without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is // recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) SetMetadata(ctx context.Context, timeout *int32, metadata map[string]string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobSetMetadataResponse, error) { +func (client blobClient) SetMetadata(ctx context.Context, timeout *int32, metadata map[string]string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlobSetMetadataResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.setMetadataPreparer(timeout, metadata, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.setMetadataPreparer(timeout, metadata, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -960,7 +1095,7 @@ func (client blobClient) SetMetadata(ctx context.Context, timeout *int32, metada } // setMetadataPreparer prepares the SetMetadata request. -func (client blobClient) setMetadataPreparer(timeout *int32, metadata map[string]string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blobClient) setMetadataPreparer(timeout *int32, metadata map[string]string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -985,8 +1120,8 @@ func (client blobClient) setMetadataPreparer(timeout *int32, metadata map[string if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -1018,15 +1153,16 @@ func (client blobClient) setMetadataResponder(resp pipeline.Response) (pipeline. // information, see Setting // Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) SetTier(ctx context.Context, tier AccessTierType, timeout *int32, requestID *string) (*BlobSetTierResponse, error) { +// character limit that is recorded in the analytics logs when storage analytics logging is enabled. leaseID is if +// specified, the operation only succeeds if the resource's lease is active and matches this ID. +func (client blobClient) SetTier(ctx context.Context, tier AccessTierType, timeout *int32, requestID *string, leaseID *string) (*BlobSetTierResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.setTierPreparer(tier, timeout, requestID) + req, err := client.setTierPreparer(tier, timeout, requestID, leaseID) if err != nil { return nil, err } @@ -1038,7 +1174,7 @@ func (client blobClient) SetTier(ctx context.Context, tier AccessTierType, timeo } // setTierPreparer prepares the SetTier request. -func (client blobClient) setTierPreparer(tier AccessTierType, timeout *int32, requestID *string) (pipeline.Request, error) { +func (client blobClient) setTierPreparer(tier AccessTierType, timeout *int32, requestID *string, leaseID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -1054,6 +1190,9 @@ func (client blobClient) setTierPreparer(tier AccessTierType, timeout *int32, re if requestID != nil { req.Header.Set("x-ms-client-request-id", *requestID) } + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } return req, nil } @@ -1082,27 +1221,23 @@ func (client blobClient) setTierResponder(resp pipeline.Response) (pipeline.Resp // 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing // Containers, Blobs, and Metadata for more information. sourceIfModifiedSince is specify this header value to operate // only on a blob if it has been modified since the specified date/time. sourceIfUnmodifiedSince is specify this header -// value to operate only on a blob if it has not been modified since the specified date/time. sourceIfMatches is -// specify an ETag value to operate only on blobs with a matching value. sourceIfNoneMatch is specify an ETag value to -// operate only on blobs without a matching value. ifModifiedSince is specify this header value to operate only on a -// blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. leaseID is if specified, the operation only succeeds if the container's lease is active -// and matches this ID. sourceLeaseID is specify this header to perform the operation only if the lease ID given -// matches the active lease ID of the source blob. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) StartCopyFromURL(ctx context.Context, copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatches *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, sourceLeaseID *string, requestID *string) (*BlobStartCopyFromURLResponse, error) { +// value to operate only on a blob if it has not been modified since the specified date/time. sourceIfMatch is specify +// an ETag value to operate only on blobs with a matching value. sourceIfNoneMatch is specify an ETag value to operate +// only on blobs without a matching value. ifModifiedSince is specify this header value to operate only on a blob if it +// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a +// blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate only on +// blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// leaseID is if specified, the operation only succeeds if the resource's lease is active and matches this ID. +// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics +// logs when storage analytics logging is enabled. +func (client blobClient) StartCopyFromURL(ctx context.Context, copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, leaseID *string, requestID *string) (*BlobStartCopyFromURLResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.startCopyFromURLPreparer(copySource, timeout, metadata, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatches, sourceIfNoneMatch, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, leaseID, sourceLeaseID, requestID) + req, err := client.startCopyFromURLPreparer(copySource, timeout, metadata, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatch, sourceIfNoneMatch, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, leaseID, requestID) if err != nil { return nil, err } @@ -1114,7 +1249,7 @@ func (client blobClient) StartCopyFromURL(ctx context.Context, copySource string } // startCopyFromURLPreparer prepares the StartCopyFromURL request. -func (client blobClient) startCopyFromURLPreparer(copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatches *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, sourceLeaseID *string, requestID *string) (pipeline.Request, error) { +func (client blobClient) startCopyFromURLPreparer(copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, leaseID *string, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -1135,8 +1270,8 @@ func (client blobClient) startCopyFromURLPreparer(copySource string, timeout *in if sourceIfUnmodifiedSince != nil { req.Header.Set("x-ms-source-if-unmodified-since", (*sourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if sourceIfMatches != nil { - req.Header.Set("x-ms-source-if-match", string(*sourceIfMatches)) + if sourceIfMatch != nil { + req.Header.Set("x-ms-source-if-match", string(*sourceIfMatch)) } if sourceIfNoneMatch != nil { req.Header.Set("x-ms-source-if-none-match", string(*sourceIfNoneMatch)) @@ -1147,8 +1282,8 @@ func (client blobClient) startCopyFromURLPreparer(copySource string, timeout *in if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -1157,9 +1292,6 @@ func (client blobClient) startCopyFromURLPreparer(copySource string, timeout *in if leaseID != nil { req.Header.Set("x-ms-lease-id", *leaseID) } - if sourceLeaseID != nil { - req.Header.Set("x-ms-source-lease-id", *sourceLeaseID) - } req.Header.Set("x-ms-version", ServiceVersion) if requestID != nil { req.Header.Set("x-ms-client-request-id", *requestID) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_block_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_block_blob.go similarity index 84% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_block_blob.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_block_blob.go index 4e75dcea337e..955f7d1903c7 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_block_blob.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_block_blob.go @@ -48,25 +48,22 @@ func newBlockBlobClient(url url.URL, p pipeline.Pipeline) blockBlobClient { // destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, // metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and -// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is +// Metadata for more information. leaseID is if specified, the operation only succeeds if the resource's lease is // active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. // ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified // date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. +// since the specified date/time. ifMatch is specify an ETag value to operate only on blobs with a matching value. // ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a // client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. -func (client blockBlobClient) CommitBlockList(ctx context.Context, blocks BlockLookupList, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlockBlobCommitBlockListResponse, error) { +func (client blockBlobClient) CommitBlockList(ctx context.Context, blocks BlockLookupList, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlockBlobCommitBlockListResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.commitBlockListPreparer(blocks, timeout, blobCacheControl, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.commitBlockListPreparer(blocks, timeout, blobCacheControl, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -78,7 +75,7 @@ func (client blockBlobClient) CommitBlockList(ctx context.Context, blocks BlockL } // commitBlockListPreparer prepares the CommitBlockList request. -func (client blockBlobClient) commitBlockListPreparer(blocks BlockLookupList, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blockBlobClient) commitBlockListPreparer(blocks BlockLookupList, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -121,8 +118,8 @@ func (client blockBlobClient) commitBlockListPreparer(blocks BlockLookupList, ti if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) @@ -163,7 +160,7 @@ func (client blockBlobClient) commitBlockListResponder(resp pipeline.Response) ( // href="https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob">Creating // a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character // limit that is recorded in the analytics logs when storage analytics logging is enabled. func (client blockBlobClient) GetBlockList(ctx context.Context, listType BlockListType, snapshot *string, timeout *int32, leaseID *string, requestID *string) (*BlockList, error) { @@ -223,7 +220,7 @@ func (client blockBlobClient) getBlockListResponder(resp pipeline.Response) (pip defer resp.Response().Body.Close() b, err := ioutil.ReadAll(resp.Response().Body) if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") + return result, err } if len(b) > 0 { b = removeBOM(b) @@ -240,13 +237,14 @@ func (client blockBlobClient) getBlockListResponder(resp pipeline.Response) (pip // blockID is a valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or // equal to 64 bytes in size. For a given blob, the length of the value specified for the blockid parameter must be the // same size for each block. contentLength is the length of the request. body is initial data body will be closed upon -// successful return. Callers should ensure closure when receiving an error.timeout is the timeout parameter is -// expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character // limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blockBlobClient) StageBlock(ctx context.Context, blockID string, contentLength int64, body io.ReadSeeker, timeout *int32, leaseID *string, requestID *string) (*BlockBlobStageBlockResponse, error) { +func (client blockBlobClient) StageBlock(ctx context.Context, blockID string, contentLength int64, body io.ReadSeeker, transactionalContentMD5 []byte, timeout *int32, leaseID *string, requestID *string) (*BlockBlobStageBlockResponse, error) { if err := validate([]validation{ {targetValue: body, constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, @@ -255,7 +253,7 @@ func (client blockBlobClient) StageBlock(ctx context.Context, blockID string, co chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.stageBlockPreparer(blockID, contentLength, body, timeout, leaseID, requestID) + req, err := client.stageBlockPreparer(blockID, contentLength, body, transactionalContentMD5, timeout, leaseID, requestID) if err != nil { return nil, err } @@ -267,7 +265,7 @@ func (client blockBlobClient) StageBlock(ctx context.Context, blockID string, co } // stageBlockPreparer prepares the StageBlock request. -func (client blockBlobClient) stageBlockPreparer(blockID string, contentLength int64, body io.ReadSeeker, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) { +func (client blockBlobClient) stageBlockPreparer(blockID string, contentLength int64, body io.ReadSeeker, transactionalContentMD5 []byte, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, body) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -280,6 +278,9 @@ func (client blockBlobClient) stageBlockPreparer(blockID string, contentLength i params.Set("comp", "block") req.URL.RawQuery = params.Encode() req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) + if transactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(transactionalContentMD5)) + } if leaseID != nil { req.Header.Set("x-ms-lease-id", *leaseID) } @@ -306,22 +307,26 @@ func (client blockBlobClient) stageBlockResponder(resp pipeline.Response) (pipel // // blockID is a valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or // equal to 64 bytes in size. For a given blob, the length of the value specified for the blockid parameter must be the -// same size for each block. contentLength is the length of the request. sourceURL is specifiy an URL to the copy -// source. sourceRange is bytes of source data in the specified range. sourceContentMD5 is specify the md5 calculated -// for the range of bytes that must be read from the copy source. timeout is the timeout parameter is expressed in -// seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character -// limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blockBlobClient) StageBlockFromURL(ctx context.Context, blockID string, contentLength int64, sourceURL *string, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, requestID *string) (*BlockBlobStageBlockFromURLResponse, error) { +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's +// lease is active and matches this ID. sourceIfModifiedSince is specify this header value to operate only on a blob if +// it has been modified since the specified date/time. sourceIfUnmodifiedSince is specify this header value to operate +// only on a blob if it has not been modified since the specified date/time. sourceIfMatch is specify an ETag value to +// operate only on blobs with a matching value. sourceIfNoneMatch is specify an ETag value to operate only on blobs +// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is +// recorded in the analytics logs when storage analytics logging is enabled. +func (client blockBlobClient) StageBlockFromURL(ctx context.Context, blockID string, contentLength int64, sourceURL string, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, requestID *string) (*BlockBlobStageBlockFromURLResponse, error) { if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.stageBlockFromURLPreparer(blockID, contentLength, sourceURL, sourceRange, sourceContentMD5, timeout, leaseID, requestID) + req, err := client.stageBlockFromURLPreparer(blockID, contentLength, sourceURL, sourceRange, sourceContentMD5, timeout, leaseID, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatch, sourceIfNoneMatch, requestID) if err != nil { return nil, err } @@ -333,7 +338,7 @@ func (client blockBlobClient) StageBlockFromURL(ctx context.Context, blockID str } // stageBlockFromURLPreparer prepares the StageBlockFromURL request. -func (client blockBlobClient) stageBlockFromURLPreparer(blockID string, contentLength int64, sourceURL *string, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) { +func (client blockBlobClient) stageBlockFromURLPreparer(blockID string, contentLength int64, sourceURL string, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, nil) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -346,9 +351,7 @@ func (client blockBlobClient) stageBlockFromURLPreparer(blockID string, contentL params.Set("comp", "block") req.URL.RawQuery = params.Encode() req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if sourceURL != nil { - req.Header.Set("x-ms-copy-source", *sourceURL) - } + req.Header.Set("x-ms-copy-source", sourceURL) if sourceRange != nil { req.Header.Set("x-ms-source-range", *sourceRange) } @@ -358,6 +361,18 @@ func (client blockBlobClient) stageBlockFromURLPreparer(blockID string, contentL if leaseID != nil { req.Header.Set("x-ms-lease-id", *leaseID) } + if sourceIfModifiedSince != nil { + req.Header.Set("x-ms-source-if-modified-since", (*sourceIfModifiedSince).In(gmt).Format(time.RFC1123)) + } + if sourceIfUnmodifiedSince != nil { + req.Header.Set("x-ms-source-if-unmodified-since", (*sourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if sourceIfMatch != nil { + req.Header.Set("x-ms-source-if-match", string(*sourceIfMatch)) + } + if sourceIfNoneMatch != nil { + req.Header.Set("x-ms-source-if-none-match", string(*sourceIfNoneMatch)) + } req.Header.Set("x-ms-version", ServiceVersion) if requestID != nil { req.Header.Set("x-ms-client-request-id", *requestID) @@ -397,27 +412,24 @@ func (client blockBlobClient) stageBlockFromURLResponder(resp pipeline.Response) // destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, // metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and -// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is +// Metadata for more information. leaseID is if specified, the operation only succeeds if the resource's lease is // active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. // ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified // date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. +// since the specified date/time. ifMatch is specify an ETag value to operate only on blobs with a matching value. // ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a // client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. -func (client blockBlobClient) Upload(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlockBlobUploadResponse, error) { +func (client blockBlobClient) Upload(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*BlockBlobUploadResponse, error) { if err := validate([]validation{ {targetValue: body, constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } - req, err := client.uploadPreparer(body, contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) + req, err := client.uploadPreparer(body, contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) if err != nil { return nil, err } @@ -429,7 +441,7 @@ func (client blockBlobClient) Upload(ctx context.Context, body io.ReadSeeker, co } // uploadPreparer prepares the Upload request. -func (client blockBlobClient) uploadPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { +func (client blockBlobClient) uploadPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { req, err := pipeline.NewRequest("PUT", client.url, body) if err != nil { return req, pipeline.NewError(err, "failed to create request") @@ -472,8 +484,8 @@ func (client blockBlobClient) uploadPreparer(body io.ReadSeeker, contentLength i if ifUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) } if ifNoneMatch != nil { req.Header.Set("If-None-Match", string(*ifNoneMatch)) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_client.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_client.go similarity index 96% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_client.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_client.go index b42a79b1571c..1b3ea2e4b4fc 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_client.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_client.go @@ -10,7 +10,7 @@ import ( const ( // ServiceVersion specifies the version of the operations used in this package. - ServiceVersion = "2018-03-28" + ServiceVersion = "2018-11-09" ) // managementClient is the base client for Azblob. diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_container.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_container.go similarity index 94% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_container.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_container.go index 3e744fcbedb9..599e8118cc57 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_container.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_container.go @@ -7,14 +7,13 @@ import ( "bytes" "context" "encoding/xml" + "github.com/Azure/azure-pipeline-go/pipeline" "io" "io/ioutil" "net/http" "net/url" "strconv" "time" - - "github.com/Azure/azure-pipeline-go/pipeline" ) // containerClient is the client for the Container methods of the Azblob service. @@ -179,10 +178,10 @@ func (client containerClient) breakLeaseResponder(resp pipeline.Response) (pipel // ChangeLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be // 15 to 60 seconds, or can be infinite // -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// proposedLeaseID is proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the -// proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string -// formats. timeout is the timeout parameter is expressed in seconds. For more information, see Setting // Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if // it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only @@ -264,10 +263,7 @@ func (client containerClient) Create(ctx context.Context, timeout *int32, metada if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } req, err := client.createPreparer(timeout, metadata, access, requestID) @@ -324,7 +320,7 @@ func (client containerClient) createResponder(resp pipeline.Response) (pipeline. // // timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it // has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a // blob if it has not been modified since the specified date/time. requestID is provides a client-generated, opaque @@ -391,7 +387,7 @@ func (client containerClient) deleteResponder(resp pipeline.Response) (pipeline. // // timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character // limit that is recorded in the analytics logs when storage analytics logging is enabled. func (client containerClient) GetAccessPolicy(ctx context.Context, timeout *int32, leaseID *string, requestID *string) (*SignedIdentifiers, error) { @@ -448,7 +444,7 @@ func (client containerClient) getAccessPolicyResponder(resp pipeline.Response) ( defer resp.Response().Body.Close() b, err := ioutil.ReadAll(resp.Response().Body) if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") + return result, err } if len(b) > 0 { b = removeBOM(b) @@ -460,12 +456,50 @@ func (client containerClient) getAccessPolicyResponder(resp pipeline.Response) ( return result, nil } +// GetAccountInfo returns the sku name and account kind +func (client containerClient) GetAccountInfo(ctx context.Context) (*ContainerGetAccountInfoResponse, error) { + req, err := client.getAccountInfoPreparer() + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getAccountInfoResponder}, req) + if err != nil { + return nil, err + } + return resp.(*ContainerGetAccountInfoResponse), err +} + +// getAccountInfoPreparer prepares the GetAccountInfo request. +func (client containerClient) getAccountInfoPreparer() (pipeline.Request, error) { + req, err := pipeline.NewRequest("GET", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + params.Set("restype", "account") + params.Set("comp", "properties") + req.URL.RawQuery = params.Encode() + req.Header.Set("x-ms-version", ServiceVersion) + return req, nil +} + +// getAccountInfoResponder handles the response to the GetAccountInfo request. +func (client containerClient) getAccountInfoResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &ContainerGetAccountInfoResponse{rawResponse: resp.Response()}, err +} + // GetProperties returns all user-defined metadata and system properties for the specified container. The data returned // does not include the container's list of blobs // // timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character // limit that is recorded in the analytics logs when storage analytics logging is enabled. func (client containerClient) GetProperties(ctx context.Context, timeout *int32, leaseID *string, requestID *string) (*ContainerGetPropertiesResponse, error) { @@ -601,7 +635,7 @@ func (client containerClient) listBlobFlatSegmentResponder(resp pipeline.Respons defer resp.Response().Body.Close() b, err := ioutil.ReadAll(resp.Response().Body) if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") + return result, err } if len(b) > 0 { b = removeBOM(b) @@ -699,7 +733,7 @@ func (client containerClient) listBlobHierarchySegmentResponder(resp pipeline.Re defer resp.Response().Body.Close() b, err := ioutil.ReadAll(resp.Response().Body) if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") + return result, err } if len(b) > 0 { b = removeBOM(b) @@ -714,8 +748,8 @@ func (client containerClient) listBlobHierarchySegmentResponder(resp pipeline.Re // ReleaseLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be // 15 to 60 seconds, or can be infinite // -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting // Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if // it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only @@ -782,8 +816,8 @@ func (client containerClient) releaseLeaseResponder(resp pipeline.Response) (pip // RenewLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 // to 60 seconds, or can be infinite // -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting // Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if // it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only @@ -853,7 +887,7 @@ func (client containerClient) renewLeaseResponder(resp pipeline.Response) (pipel // containerACL is the acls for the container timeout is the timeout parameter is expressed in seconds. For more // information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. access is specifies whether data in the container may be accessed publicly and // the level of access ifModifiedSince is specify this header value to operate only on a blob if it has been modified // since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has @@ -933,7 +967,7 @@ func (client containerClient) setAccessPolicyResponder(resp pipeline.Response) ( // // timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's // lease is active and matches this ID. metadata is optional. Specifies a user-defined name-value pair associated with // the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to // the destination blob. If one or more name-value pairs are specified, the destination blob is created with the @@ -946,10 +980,7 @@ func (client containerClient) SetMetadata(ctx context.Context, timeout *int32, l if err := validate([]validation{ {targetValue: timeout, constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { return nil, err } req, err := client.setMetadataPreparer(timeout, leaseID, metadata, ifModifiedSince, requestID) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_models.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_models.go similarity index 81% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_models.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_models.go index 3d8114ae6b5e..391584969afb 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_models.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_models.go @@ -4,8 +4,11 @@ package azblob // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( + "crypto/hmac" + "crypto/sha256" "encoding/base64" "encoding/xml" + "errors" "io" "net/http" "reflect" @@ -54,7 +57,7 @@ func (md *Metadata) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { // Marker represents an opaque value used in paged responses. type Marker struct { - val *string + Val *string } // NotDone returns true if the list enumeration should be started or is not yet complete. Specifically, NotDone returns true @@ -62,14 +65,14 @@ type Marker struct { // the service. NotDone also returns true whenever the service returns an interim result portion. NotDone returns false only // after the service has returned the final result portion. func (m Marker) NotDone() bool { - return m.val == nil || *m.val != "" + return m.Val == nil || *m.Val != "" } // UnmarshalXML implements the xml.Unmarshaler interface for Marker. func (m *Marker) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { var out string err := d.DecodeElement(&out, &start) - m.val = &out + m.Val = &out return err } @@ -86,6 +89,12 @@ func joinConst(s interface{}, sep string) string { return strings.Join(ss, sep) } +func validateError(err error) { + if err != nil { + panic(err) + } +} + // AccessTierType enumerates the values for access tier type. type AccessTierType string @@ -119,6 +128,25 @@ func PossibleAccessTierTypeValues() []AccessTierType { return []AccessTierType{AccessTierArchive, AccessTierCool, AccessTierHot, AccessTierNone, AccessTierP10, AccessTierP20, AccessTierP30, AccessTierP4, AccessTierP40, AccessTierP50, AccessTierP6} } +// AccountKindType enumerates the values for account kind type. +type AccountKindType string + +const ( + // AccountKindBlobStorage ... + AccountKindBlobStorage AccountKindType = "BlobStorage" + // AccountKindNone represents an empty AccountKindType. + AccountKindNone AccountKindType = "" + // AccountKindStorage ... + AccountKindStorage AccountKindType = "Storage" + // AccountKindStorageV2 ... + AccountKindStorageV2 AccountKindType = "StorageV2" +) + +// PossibleAccountKindTypeValues returns an array of possible values for the AccountKindType const type. +func PossibleAccountKindTypeValues() []AccountKindType { + return []AccountKindType{AccountKindBlobStorage, AccountKindNone, AccountKindStorage, AccountKindStorageV2} +} + // ArchiveStatusType enumerates the values for archive status type. type ArchiveStatusType string @@ -362,6 +390,29 @@ func PossibleSequenceNumberActionTypeValues() []SequenceNumberActionType { return []SequenceNumberActionType{SequenceNumberActionIncrement, SequenceNumberActionMax, SequenceNumberActionNone, SequenceNumberActionUpdate} } +// SkuNameType enumerates the values for sku name type. +type SkuNameType string + +const ( + // SkuNameNone represents an empty SkuNameType. + SkuNameNone SkuNameType = "" + // SkuNamePremiumLRS ... + SkuNamePremiumLRS SkuNameType = "Premium_LRS" + // SkuNameStandardGRS ... + SkuNameStandardGRS SkuNameType = "Standard_GRS" + // SkuNameStandardLRS ... + SkuNameStandardLRS SkuNameType = "Standard_LRS" + // SkuNameStandardRAGRS ... + SkuNameStandardRAGRS SkuNameType = "Standard_RAGRS" + // SkuNameStandardZRS ... + SkuNameStandardZRS SkuNameType = "Standard_ZRS" +) + +// PossibleSkuNameTypeValues returns an array of possible values for the SkuNameType const type. +func PossibleSkuNameTypeValues() []SkuNameType { + return []SkuNameType{SkuNameNone, SkuNamePremiumLRS, SkuNameStandardGRS, SkuNameStandardLRS, SkuNameStandardRAGRS, SkuNameStandardZRS} +} + // StorageErrorCodeType enumerates the values for storage error code type. type StorageErrorCodeType string @@ -376,6 +427,8 @@ const ( StorageErrorCodeAppendPositionConditionNotMet StorageErrorCodeType = "AppendPositionConditionNotMet" // StorageErrorCodeAuthenticationFailed ... StorageErrorCodeAuthenticationFailed StorageErrorCodeType = "AuthenticationFailed" + // StorageErrorCodeAuthorizationFailure ... + StorageErrorCodeAuthorizationFailure StorageErrorCodeType = "AuthorizationFailure" // StorageErrorCodeBlobAlreadyExists ... StorageErrorCodeBlobAlreadyExists StorageErrorCodeType = "BlobAlreadyExists" // StorageErrorCodeBlobArchived ... @@ -580,7 +633,22 @@ const ( // PossibleStorageErrorCodeTypeValues returns an array of possible values for the StorageErrorCodeType const type. func PossibleStorageErrorCodeTypeValues() []StorageErrorCodeType { - return []StorageErrorCodeType{StorageErrorCodeAccountAlreadyExists, StorageErrorCodeAccountBeingCreated, StorageErrorCodeAccountIsDisabled, StorageErrorCodeAppendPositionConditionNotMet, StorageErrorCodeAuthenticationFailed, StorageErrorCodeBlobAlreadyExists, StorageErrorCodeBlobArchived, StorageErrorCodeBlobBeingRehydrated, StorageErrorCodeBlobNotArchived, StorageErrorCodeBlobNotFound, StorageErrorCodeBlobOverwritten, StorageErrorCodeBlobTierInadequateForContentLength, StorageErrorCodeBlockCountExceedsLimit, StorageErrorCodeBlockListTooLong, StorageErrorCodeCannotChangeToLowerTier, StorageErrorCodeCannotVerifyCopySource, StorageErrorCodeConditionHeadersNotSupported, StorageErrorCodeConditionNotMet, StorageErrorCodeContainerAlreadyExists, StorageErrorCodeContainerBeingDeleted, StorageErrorCodeContainerDisabled, StorageErrorCodeContainerNotFound, StorageErrorCodeContentLengthLargerThanTierLimit, StorageErrorCodeCopyAcrossAccountsNotSupported, StorageErrorCodeCopyIDMismatch, StorageErrorCodeEmptyMetadataKey, StorageErrorCodeFeatureVersionMismatch, StorageErrorCodeIncrementalCopyBlobMismatch, StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed, StorageErrorCodeIncrementalCopySourceMustBeSnapshot, StorageErrorCodeInfiniteLeaseDurationRequired, StorageErrorCodeInsufficientAccountPermissions, StorageErrorCodeInternalError, StorageErrorCodeInvalidAuthenticationInfo, StorageErrorCodeInvalidBlobOrBlock, StorageErrorCodeInvalidBlobTier, StorageErrorCodeInvalidBlobType, StorageErrorCodeInvalidBlockID, StorageErrorCodeInvalidBlockList, StorageErrorCodeInvalidHeaderValue, StorageErrorCodeInvalidHTTPVerb, StorageErrorCodeInvalidInput, StorageErrorCodeInvalidMd5, StorageErrorCodeInvalidMetadata, StorageErrorCodeInvalidOperation, StorageErrorCodeInvalidPageRange, StorageErrorCodeInvalidQueryParameterValue, StorageErrorCodeInvalidRange, StorageErrorCodeInvalidResourceName, StorageErrorCodeInvalidSourceBlobType, StorageErrorCodeInvalidSourceBlobURL, StorageErrorCodeInvalidURI, StorageErrorCodeInvalidVersionForPageBlobOperation, StorageErrorCodeInvalidXMLDocument, StorageErrorCodeInvalidXMLNodeValue, StorageErrorCodeLeaseAlreadyBroken, StorageErrorCodeLeaseAlreadyPresent, StorageErrorCodeLeaseIDMismatchWithBlobOperation, StorageErrorCodeLeaseIDMismatchWithContainerOperation, StorageErrorCodeLeaseIDMismatchWithLeaseOperation, StorageErrorCodeLeaseIDMissing, StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired, StorageErrorCodeLeaseIsBreakingAndCannotBeChanged, StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed, StorageErrorCodeLeaseLost, StorageErrorCodeLeaseNotPresentWithBlobOperation, StorageErrorCodeLeaseNotPresentWithContainerOperation, StorageErrorCodeLeaseNotPresentWithLeaseOperation, StorageErrorCodeMaxBlobSizeConditionNotMet, StorageErrorCodeMd5Mismatch, StorageErrorCodeMetadataTooLarge, StorageErrorCodeMissingContentLengthHeader, StorageErrorCodeMissingRequiredHeader, StorageErrorCodeMissingRequiredQueryParameter, StorageErrorCodeMissingRequiredXMLNode, StorageErrorCodeMultipleConditionHeadersNotSupported, StorageErrorCodeNone, StorageErrorCodeNoPendingCopyOperation, StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob, StorageErrorCodeOperationTimedOut, StorageErrorCodeOutOfRangeInput, StorageErrorCodeOutOfRangeQueryParameterValue, StorageErrorCodePendingCopyOperation, StorageErrorCodePreviousSnapshotCannotBeNewer, StorageErrorCodePreviousSnapshotNotFound, StorageErrorCodePreviousSnapshotOperationNotSupported, StorageErrorCodeRequestBodyTooLarge, StorageErrorCodeRequestURLFailedToParse, StorageErrorCodeResourceAlreadyExists, StorageErrorCodeResourceNotFound, StorageErrorCodeResourceTypeMismatch, StorageErrorCodeSequenceNumberConditionNotMet, StorageErrorCodeSequenceNumberIncrementTooLarge, StorageErrorCodeServerBusy, StorageErrorCodeSnaphotOperationRateExceeded, StorageErrorCodeSnapshotCountExceeded, StorageErrorCodeSnapshotsPresent, StorageErrorCodeSourceConditionNotMet, StorageErrorCodeSystemInUse, StorageErrorCodeTargetConditionNotMet, StorageErrorCodeUnauthorizedBlobOverwrite, StorageErrorCodeUnsupportedHeader, StorageErrorCodeUnsupportedHTTPVerb, StorageErrorCodeUnsupportedQueryParameter, StorageErrorCodeUnsupportedXMLNode} + return []StorageErrorCodeType{StorageErrorCodeAccountAlreadyExists, StorageErrorCodeAccountBeingCreated, StorageErrorCodeAccountIsDisabled, StorageErrorCodeAppendPositionConditionNotMet, StorageErrorCodeAuthenticationFailed, StorageErrorCodeAuthorizationFailure, StorageErrorCodeBlobAlreadyExists, StorageErrorCodeBlobArchived, StorageErrorCodeBlobBeingRehydrated, StorageErrorCodeBlobNotArchived, StorageErrorCodeBlobNotFound, StorageErrorCodeBlobOverwritten, StorageErrorCodeBlobTierInadequateForContentLength, StorageErrorCodeBlockCountExceedsLimit, StorageErrorCodeBlockListTooLong, StorageErrorCodeCannotChangeToLowerTier, StorageErrorCodeCannotVerifyCopySource, StorageErrorCodeConditionHeadersNotSupported, StorageErrorCodeConditionNotMet, StorageErrorCodeContainerAlreadyExists, StorageErrorCodeContainerBeingDeleted, StorageErrorCodeContainerDisabled, StorageErrorCodeContainerNotFound, StorageErrorCodeContentLengthLargerThanTierLimit, StorageErrorCodeCopyAcrossAccountsNotSupported, StorageErrorCodeCopyIDMismatch, StorageErrorCodeEmptyMetadataKey, StorageErrorCodeFeatureVersionMismatch, StorageErrorCodeIncrementalCopyBlobMismatch, StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed, StorageErrorCodeIncrementalCopySourceMustBeSnapshot, StorageErrorCodeInfiniteLeaseDurationRequired, StorageErrorCodeInsufficientAccountPermissions, StorageErrorCodeInternalError, StorageErrorCodeInvalidAuthenticationInfo, StorageErrorCodeInvalidBlobOrBlock, StorageErrorCodeInvalidBlobTier, StorageErrorCodeInvalidBlobType, StorageErrorCodeInvalidBlockID, StorageErrorCodeInvalidBlockList, StorageErrorCodeInvalidHeaderValue, StorageErrorCodeInvalidHTTPVerb, StorageErrorCodeInvalidInput, StorageErrorCodeInvalidMd5, StorageErrorCodeInvalidMetadata, StorageErrorCodeInvalidOperation, StorageErrorCodeInvalidPageRange, StorageErrorCodeInvalidQueryParameterValue, StorageErrorCodeInvalidRange, StorageErrorCodeInvalidResourceName, StorageErrorCodeInvalidSourceBlobType, StorageErrorCodeInvalidSourceBlobURL, StorageErrorCodeInvalidURI, StorageErrorCodeInvalidVersionForPageBlobOperation, StorageErrorCodeInvalidXMLDocument, StorageErrorCodeInvalidXMLNodeValue, StorageErrorCodeLeaseAlreadyBroken, StorageErrorCodeLeaseAlreadyPresent, StorageErrorCodeLeaseIDMismatchWithBlobOperation, StorageErrorCodeLeaseIDMismatchWithContainerOperation, StorageErrorCodeLeaseIDMismatchWithLeaseOperation, StorageErrorCodeLeaseIDMissing, StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired, StorageErrorCodeLeaseIsBreakingAndCannotBeChanged, StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed, StorageErrorCodeLeaseLost, StorageErrorCodeLeaseNotPresentWithBlobOperation, StorageErrorCodeLeaseNotPresentWithContainerOperation, StorageErrorCodeLeaseNotPresentWithLeaseOperation, StorageErrorCodeMaxBlobSizeConditionNotMet, StorageErrorCodeMd5Mismatch, StorageErrorCodeMetadataTooLarge, StorageErrorCodeMissingContentLengthHeader, StorageErrorCodeMissingRequiredHeader, StorageErrorCodeMissingRequiredQueryParameter, StorageErrorCodeMissingRequiredXMLNode, StorageErrorCodeMultipleConditionHeadersNotSupported, StorageErrorCodeNone, StorageErrorCodeNoPendingCopyOperation, StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob, StorageErrorCodeOperationTimedOut, StorageErrorCodeOutOfRangeInput, StorageErrorCodeOutOfRangeQueryParameterValue, StorageErrorCodePendingCopyOperation, StorageErrorCodePreviousSnapshotCannotBeNewer, StorageErrorCodePreviousSnapshotNotFound, StorageErrorCodePreviousSnapshotOperationNotSupported, StorageErrorCodeRequestBodyTooLarge, StorageErrorCodeRequestURLFailedToParse, StorageErrorCodeResourceAlreadyExists, StorageErrorCodeResourceNotFound, StorageErrorCodeResourceTypeMismatch, StorageErrorCodeSequenceNumberConditionNotMet, StorageErrorCodeSequenceNumberIncrementTooLarge, StorageErrorCodeServerBusy, StorageErrorCodeSnaphotOperationRateExceeded, StorageErrorCodeSnapshotCountExceeded, StorageErrorCodeSnapshotsPresent, StorageErrorCodeSourceConditionNotMet, StorageErrorCodeSystemInUse, StorageErrorCodeTargetConditionNotMet, StorageErrorCodeUnauthorizedBlobOverwrite, StorageErrorCodeUnsupportedHeader, StorageErrorCodeUnsupportedHTTPVerb, StorageErrorCodeUnsupportedQueryParameter, StorageErrorCodeUnsupportedXMLNode} +} + +// SyncCopyStatusType enumerates the values for sync copy status type. +type SyncCopyStatusType string + +const ( + // SyncCopyStatusNone represents an empty SyncCopyStatusType. + SyncCopyStatusNone SyncCopyStatusType = "" + // SyncCopyStatusSuccess ... + SyncCopyStatusSuccess SyncCopyStatusType = "success" +) + +// PossibleSyncCopyStatusTypeValues returns an array of possible values for the SyncCopyStatusType const type. +func PossibleSyncCopyStatusTypeValues() []SyncCopyStatusType { + return []SyncCopyStatusType{SyncCopyStatusNone, SyncCopyStatusSuccess} } // AccessPolicy - An Access policy @@ -595,22 +663,113 @@ type AccessPolicy struct { // MarshalXML implements the xml.Marshaler interface for AccessPolicy. func (ap AccessPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - if reflect.TypeOf((*AccessPolicy)(nil)).Elem().Size() != reflect.TypeOf((*accessPolicy)(nil)).Elem().Size() { - panic("size mismatch between AccessPolicy and accessPolicy") - } ap2 := (*accessPolicy)(unsafe.Pointer(&ap)) return e.EncodeElement(*ap2, start) } // UnmarshalXML implements the xml.Unmarshaler interface for AccessPolicy. func (ap *AccessPolicy) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - if reflect.TypeOf((*AccessPolicy)(nil)).Elem().Size() != reflect.TypeOf((*accessPolicy)(nil)).Elem().Size() { - panic("size mismatch between AccessPolicy and accessPolicy") - } ap2 := (*accessPolicy)(unsafe.Pointer(ap)) return d.DecodeElement(ap2, &start) } +// AppendBlobAppendBlockFromURLResponse ... +type AppendBlobAppendBlockFromURLResponse struct { + rawResponse *http.Response +} + +// Response returns the raw HTTP response object. +func (ababfur AppendBlobAppendBlockFromURLResponse) Response() *http.Response { + return ababfur.rawResponse +} + +// StatusCode returns the HTTP status code of the response, e.g. 200. +func (ababfur AppendBlobAppendBlockFromURLResponse) StatusCode() int { + return ababfur.rawResponse.StatusCode +} + +// Status returns the HTTP status message of the response, e.g. "200 OK". +func (ababfur AppendBlobAppendBlockFromURLResponse) Status() string { + return ababfur.rawResponse.Status +} + +// BlobAppendOffset returns the value for header x-ms-blob-append-offset. +func (ababfur AppendBlobAppendBlockFromURLResponse) BlobAppendOffset() string { + return ababfur.rawResponse.Header.Get("x-ms-blob-append-offset") +} + +// BlobCommittedBlockCount returns the value for header x-ms-blob-committed-block-count. +func (ababfur AppendBlobAppendBlockFromURLResponse) BlobCommittedBlockCount() int32 { + s := ababfur.rawResponse.Header.Get("x-ms-blob-committed-block-count") + if s == "" { + return -1 + } + i, err := strconv.ParseInt(s, 10, 32) + if err != nil { + i = 0 + } + return int32(i) +} + +// ContentMD5 returns the value for header Content-MD5. +func (ababfur AppendBlobAppendBlockFromURLResponse) ContentMD5() []byte { + s := ababfur.rawResponse.Header.Get("Content-MD5") + if s == "" { + return nil + } + b, err := base64.StdEncoding.DecodeString(s) + if err != nil { + b = nil + } + return b +} + +// Date returns the value for header Date. +func (ababfur AppendBlobAppendBlockFromURLResponse) Date() time.Time { + s := ababfur.rawResponse.Header.Get("Date") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// ErrorCode returns the value for header x-ms-error-code. +func (ababfur AppendBlobAppendBlockFromURLResponse) ErrorCode() string { + return ababfur.rawResponse.Header.Get("x-ms-error-code") +} + +// ETag returns the value for header ETag. +func (ababfur AppendBlobAppendBlockFromURLResponse) ETag() ETag { + return ETag(ababfur.rawResponse.Header.Get("ETag")) +} + +// LastModified returns the value for header Last-Modified. +func (ababfur AppendBlobAppendBlockFromURLResponse) LastModified() time.Time { + s := ababfur.rawResponse.Header.Get("Last-Modified") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// RequestID returns the value for header x-ms-request-id. +func (ababfur AppendBlobAppendBlockFromURLResponse) RequestID() string { + return ababfur.rawResponse.Header.Get("x-ms-request-id") +} + +// Version returns the value for header x-ms-version. +func (ababfur AppendBlobAppendBlockFromURLResponse) Version() string { + return ababfur.rawResponse.Header.Get("x-ms-version") +} + // AppendBlobAppendBlockResponse ... type AppendBlobAppendBlockResponse struct { rawResponse *http.Response @@ -644,7 +803,7 @@ func (ababr AppendBlobAppendBlockResponse) BlobCommittedBlockCount() int32 { } i, err := strconv.ParseInt(s, 10, 32) if err != nil { - panic(err) + i = 0 } return int32(i) } @@ -657,7 +816,7 @@ func (ababr AppendBlobAppendBlockResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -670,7 +829,7 @@ func (ababr AppendBlobAppendBlockResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -685,6 +844,11 @@ func (ababr AppendBlobAppendBlockResponse) ETag() ETag { return ETag(ababr.rawResponse.Header.Get("ETag")) } +// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. +func (ababr AppendBlobAppendBlockResponse) IsServerEncrypted() string { + return ababr.rawResponse.Header.Get("x-ms-request-server-encrypted") +} + // LastModified returns the value for header Last-Modified. func (ababr AppendBlobAppendBlockResponse) LastModified() time.Time { s := ababr.rawResponse.Header.Get("Last-Modified") @@ -693,7 +857,7 @@ func (ababr AppendBlobAppendBlockResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -736,7 +900,7 @@ func (abcr AppendBlobCreateResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -749,7 +913,7 @@ func (abcr AppendBlobCreateResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -777,7 +941,7 @@ func (abcr AppendBlobCreateResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -820,7 +984,7 @@ func (bacfur BlobAbortCopyFromURLResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -868,7 +1032,7 @@ func (balr BlobAcquireLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -891,7 +1055,7 @@ func (balr BlobAcquireLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -939,7 +1103,7 @@ func (bblr BlobBreakLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -962,7 +1126,7 @@ func (bblr BlobBreakLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -975,7 +1139,7 @@ func (bblr BlobBreakLeaseResponse) LeaseTime() int32 { } i, err := strconv.ParseInt(s, 10, 32) if err != nil { - panic(err) + i = 0 } return int32(i) } @@ -1018,7 +1182,7 @@ func (bclr BlobChangeLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1041,7 +1205,7 @@ func (bclr BlobChangeLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1061,6 +1225,82 @@ func (bclr BlobChangeLeaseResponse) Version() string { return bclr.rawResponse.Header.Get("x-ms-version") } +// BlobCopyFromURLResponse ... +type BlobCopyFromURLResponse struct { + rawResponse *http.Response +} + +// Response returns the raw HTTP response object. +func (bcfur BlobCopyFromURLResponse) Response() *http.Response { + return bcfur.rawResponse +} + +// StatusCode returns the HTTP status code of the response, e.g. 200. +func (bcfur BlobCopyFromURLResponse) StatusCode() int { + return bcfur.rawResponse.StatusCode +} + +// Status returns the HTTP status message of the response, e.g. "200 OK". +func (bcfur BlobCopyFromURLResponse) Status() string { + return bcfur.rawResponse.Status +} + +// CopyID returns the value for header x-ms-copy-id. +func (bcfur BlobCopyFromURLResponse) CopyID() string { + return bcfur.rawResponse.Header.Get("x-ms-copy-id") +} + +// CopyStatus returns the value for header x-ms-copy-status. +func (bcfur BlobCopyFromURLResponse) CopyStatus() SyncCopyStatusType { + return SyncCopyStatusType(bcfur.rawResponse.Header.Get("x-ms-copy-status")) +} + +// Date returns the value for header Date. +func (bcfur BlobCopyFromURLResponse) Date() time.Time { + s := bcfur.rawResponse.Header.Get("Date") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// ErrorCode returns the value for header x-ms-error-code. +func (bcfur BlobCopyFromURLResponse) ErrorCode() string { + return bcfur.rawResponse.Header.Get("x-ms-error-code") +} + +// ETag returns the value for header ETag. +func (bcfur BlobCopyFromURLResponse) ETag() ETag { + return ETag(bcfur.rawResponse.Header.Get("ETag")) +} + +// LastModified returns the value for header Last-Modified. +func (bcfur BlobCopyFromURLResponse) LastModified() time.Time { + s := bcfur.rawResponse.Header.Get("Last-Modified") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// RequestID returns the value for header x-ms-request-id. +func (bcfur BlobCopyFromURLResponse) RequestID() string { + return bcfur.rawResponse.Header.Get("x-ms-request-id") +} + +// Version returns the value for header x-ms-version. +func (bcfur BlobCopyFromURLResponse) Version() string { + return bcfur.rawResponse.Header.Get("x-ms-version") +} + // BlobCreateSnapshotResponse ... type BlobCreateSnapshotResponse struct { rawResponse *http.Response @@ -1089,7 +1329,7 @@ func (bcsr BlobCreateSnapshotResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1112,7 +1352,7 @@ func (bcsr BlobCreateSnapshotResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1160,7 +1400,7 @@ func (bdr BlobDeleteResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1180,11 +1420,71 @@ func (bdr BlobDeleteResponse) Version() string { return bdr.rawResponse.Header.Get("x-ms-version") } -// BlobFlatList ... -type BlobFlatList struct { +// BlobFlatListSegment ... +type BlobFlatListSegment struct { + // XMLName is used for marshalling and is subject to removal in a future release. + XMLName xml.Name `xml:"Blobs"` BlobItems []BlobItem `xml:"Blob"` } +// BlobGetAccountInfoResponse ... +type BlobGetAccountInfoResponse struct { + rawResponse *http.Response +} + +// Response returns the raw HTTP response object. +func (bgair BlobGetAccountInfoResponse) Response() *http.Response { + return bgair.rawResponse +} + +// StatusCode returns the HTTP status code of the response, e.g. 200. +func (bgair BlobGetAccountInfoResponse) StatusCode() int { + return bgair.rawResponse.StatusCode +} + +// Status returns the HTTP status message of the response, e.g. "200 OK". +func (bgair BlobGetAccountInfoResponse) Status() string { + return bgair.rawResponse.Status +} + +// AccountKind returns the value for header x-ms-account-kind. +func (bgair BlobGetAccountInfoResponse) AccountKind() AccountKindType { + return AccountKindType(bgair.rawResponse.Header.Get("x-ms-account-kind")) +} + +// Date returns the value for header Date. +func (bgair BlobGetAccountInfoResponse) Date() time.Time { + s := bgair.rawResponse.Header.Get("Date") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// ErrorCode returns the value for header x-ms-error-code. +func (bgair BlobGetAccountInfoResponse) ErrorCode() string { + return bgair.rawResponse.Header.Get("x-ms-error-code") +} + +// RequestID returns the value for header x-ms-request-id. +func (bgair BlobGetAccountInfoResponse) RequestID() string { + return bgair.rawResponse.Header.Get("x-ms-request-id") +} + +// SkuName returns the value for header x-ms-sku-name. +func (bgair BlobGetAccountInfoResponse) SkuName() SkuNameType { + return SkuNameType(bgair.rawResponse.Header.Get("x-ms-sku-name")) +} + +// Version returns the value for header x-ms-version. +func (bgair BlobGetAccountInfoResponse) Version() string { + return bgair.rawResponse.Header.Get("x-ms-version") +} + // BlobGetPropertiesResponse ... type BlobGetPropertiesResponse struct { rawResponse *http.Response @@ -1228,6 +1528,19 @@ func (bgpr BlobGetPropertiesResponse) AccessTier() string { return bgpr.rawResponse.Header.Get("x-ms-access-tier") } +// AccessTierChangeTime returns the value for header x-ms-access-tier-change-time. +func (bgpr BlobGetPropertiesResponse) AccessTierChangeTime() time.Time { + s := bgpr.rawResponse.Header.Get("x-ms-access-tier-change-time") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + // AccessTierInferred returns the value for header x-ms-access-tier-inferred. func (bgpr BlobGetPropertiesResponse) AccessTierInferred() string { return bgpr.rawResponse.Header.Get("x-ms-access-tier-inferred") @@ -1246,7 +1559,7 @@ func (bgpr BlobGetPropertiesResponse) BlobCommittedBlockCount() int32 { } i, err := strconv.ParseInt(s, 10, 32) if err != nil { - panic(err) + i = 0 } return int32(i) } @@ -1259,7 +1572,7 @@ func (bgpr BlobGetPropertiesResponse) BlobSequenceNumber() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -1297,7 +1610,7 @@ func (bgpr BlobGetPropertiesResponse) ContentLength() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -1310,7 +1623,7 @@ func (bgpr BlobGetPropertiesResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -1328,7 +1641,7 @@ func (bgpr BlobGetPropertiesResponse) CopyCompletionTime() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1358,6 +1671,19 @@ func (bgpr BlobGetPropertiesResponse) CopyStatusDescription() string { return bgpr.rawResponse.Header.Get("x-ms-copy-status-description") } +// CreationTime returns the value for header x-ms-creation-time. +func (bgpr BlobGetPropertiesResponse) CreationTime() time.Time { + s := bgpr.rawResponse.Header.Get("x-ms-creation-time") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + // Date returns the value for header Date. func (bgpr BlobGetPropertiesResponse) Date() time.Time { s := bgpr.rawResponse.Header.Get("Date") @@ -1366,7 +1692,7 @@ func (bgpr BlobGetPropertiesResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1404,7 +1730,7 @@ func (bgpr BlobGetPropertiesResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1434,14 +1760,18 @@ func (bgpr BlobGetPropertiesResponse) Version() string { return bgpr.rawResponse.Header.Get("x-ms-version") } -// BlobHierarchyList ... -type BlobHierarchyList struct { +// BlobHierarchyListSegment ... +type BlobHierarchyListSegment struct { + // XMLName is used for marshalling and is subject to removal in a future release. + XMLName xml.Name `xml:"Blobs"` BlobPrefixes []BlobPrefix `xml:"BlobPrefix"` BlobItems []BlobItem `xml:"Blob"` } // BlobItem - An Azure Storage blob type BlobItem struct { + // XMLName is used for marshalling and is subject to removal in a future release. + XMLName xml.Name `xml:"Blob"` Name string `xml:"Name"` Deleted bool `xml:"Deleted"` Snapshot string `xml:"Snapshot"` @@ -1456,8 +1786,11 @@ type BlobPrefix struct { // BlobProperties - Properties of a blob type BlobProperties struct { - LastModified time.Time `xml:"Last-Modified"` - Etag ETag `xml:"Etag"` + // XMLName is used for marshalling and is subject to removal in a future release. + XMLName xml.Name `xml:"Properties"` + CreationTime *time.Time `xml:"Creation-Time"` + LastModified time.Time `xml:"Last-Modified"` + Etag ETag `xml:"Etag"` // ContentLength - Size in bytes ContentLength *int64 `xml:"Content-Length"` ContentType *string `xml:"Content-Type"` @@ -1491,23 +1824,18 @@ type BlobProperties struct { AccessTier AccessTierType `xml:"AccessTier"` AccessTierInferred *bool `xml:"AccessTierInferred"` // ArchiveStatus - Possible values include: 'ArchiveStatusRehydratePendingToHot', 'ArchiveStatusRehydratePendingToCool', 'ArchiveStatusNone' - ArchiveStatus ArchiveStatusType `xml:"ArchiveStatus"` + ArchiveStatus ArchiveStatusType `xml:"ArchiveStatus"` + AccessTierChangeTime *time.Time `xml:"AccessTierChangeTime"` } // MarshalXML implements the xml.Marshaler interface for BlobProperties. func (bp BlobProperties) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - if reflect.TypeOf((*BlobProperties)(nil)).Elem().Size() != reflect.TypeOf((*blobProperties)(nil)).Elem().Size() { - panic("size mismatch between BlobProperties and blobProperties") - } bp2 := (*blobProperties)(unsafe.Pointer(&bp)) return e.EncodeElement(*bp2, start) } // UnmarshalXML implements the xml.Unmarshaler interface for BlobProperties. func (bp *BlobProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - if reflect.TypeOf((*BlobProperties)(nil)).Elem().Size() != reflect.TypeOf((*blobProperties)(nil)).Elem().Size() { - panic("size mismatch between BlobProperties and blobProperties") - } bp2 := (*blobProperties)(unsafe.Pointer(bp)) return d.DecodeElement(bp2, &start) } @@ -1540,7 +1868,7 @@ func (brlr BlobReleaseLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1563,7 +1891,7 @@ func (brlr BlobReleaseLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1606,7 +1934,7 @@ func (brlr BlobRenewLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1629,7 +1957,7 @@ func (brlr BlobRenewLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1677,7 +2005,7 @@ func (bshhr BlobSetHTTPHeadersResponse) BlobSequenceNumber() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -1690,7 +2018,7 @@ func (bshhr BlobSetHTTPHeadersResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1713,7 +2041,7 @@ func (bshhr BlobSetHTTPHeadersResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1756,7 +2084,7 @@ func (bsmr BlobSetMetadataResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1784,7 +2112,7 @@ func (bsmr BlobSetMetadataResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1872,7 +2200,7 @@ func (bscfur BlobStartCopyFromURLResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1895,7 +2223,7 @@ func (bscfur BlobStartCopyFromURLResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1938,7 +2266,7 @@ func (bur BlobUndeleteResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -1994,7 +2322,7 @@ func (bbcblr BlockBlobCommitBlockListResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -2007,7 +2335,7 @@ func (bbcblr BlockBlobCommitBlockListResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2035,7 +2363,7 @@ func (bbcblr BlockBlobCommitBlockListResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2078,7 +2406,7 @@ func (bbsbfur BlockBlobStageBlockFromURLResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -2091,7 +2419,7 @@ func (bbsbfur BlockBlobStageBlockFromURLResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2144,7 +2472,7 @@ func (bbsbr BlockBlobStageBlockResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -2157,7 +2485,7 @@ func (bbsbr BlockBlobStageBlockResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2210,7 +2538,7 @@ func (bbur BlockBlobUploadResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -2223,7 +2551,7 @@ func (bbur BlockBlobUploadResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2251,7 +2579,7 @@ func (bbur BlockBlobUploadResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2296,7 +2624,7 @@ func (bl BlockList) BlobContentLength() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -2314,7 +2642,7 @@ func (bl BlockList) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2337,7 +2665,7 @@ func (bl BlockList) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2395,7 +2723,7 @@ func (calr ContainerAcquireLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2418,7 +2746,7 @@ func (calr ContainerAcquireLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2466,7 +2794,7 @@ func (cblr ContainerBreakLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2489,7 +2817,7 @@ func (cblr ContainerBreakLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2502,7 +2830,7 @@ func (cblr ContainerBreakLeaseResponse) LeaseTime() int32 { } i, err := strconv.ParseInt(s, 10, 32) if err != nil { - panic(err) + i = 0 } return int32(i) } @@ -2545,7 +2873,7 @@ func (cclr ContainerChangeLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2568,7 +2896,7 @@ func (cclr ContainerChangeLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2616,7 +2944,7 @@ func (ccr ContainerCreateResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2639,7 +2967,7 @@ func (ccr ContainerCreateResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2682,7 +3010,7 @@ func (cdr ContainerDeleteResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2702,6 +3030,64 @@ func (cdr ContainerDeleteResponse) Version() string { return cdr.rawResponse.Header.Get("x-ms-version") } +// ContainerGetAccountInfoResponse ... +type ContainerGetAccountInfoResponse struct { + rawResponse *http.Response +} + +// Response returns the raw HTTP response object. +func (cgair ContainerGetAccountInfoResponse) Response() *http.Response { + return cgair.rawResponse +} + +// StatusCode returns the HTTP status code of the response, e.g. 200. +func (cgair ContainerGetAccountInfoResponse) StatusCode() int { + return cgair.rawResponse.StatusCode +} + +// Status returns the HTTP status message of the response, e.g. "200 OK". +func (cgair ContainerGetAccountInfoResponse) Status() string { + return cgair.rawResponse.Status +} + +// AccountKind returns the value for header x-ms-account-kind. +func (cgair ContainerGetAccountInfoResponse) AccountKind() AccountKindType { + return AccountKindType(cgair.rawResponse.Header.Get("x-ms-account-kind")) +} + +// Date returns the value for header Date. +func (cgair ContainerGetAccountInfoResponse) Date() time.Time { + s := cgair.rawResponse.Header.Get("Date") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// ErrorCode returns the value for header x-ms-error-code. +func (cgair ContainerGetAccountInfoResponse) ErrorCode() string { + return cgair.rawResponse.Header.Get("x-ms-error-code") +} + +// RequestID returns the value for header x-ms-request-id. +func (cgair ContainerGetAccountInfoResponse) RequestID() string { + return cgair.rawResponse.Header.Get("x-ms-request-id") +} + +// SkuName returns the value for header x-ms-sku-name. +func (cgair ContainerGetAccountInfoResponse) SkuName() SkuNameType { + return SkuNameType(cgair.rawResponse.Header.Get("x-ms-sku-name")) +} + +// Version returns the value for header x-ms-version. +func (cgair ContainerGetAccountInfoResponse) Version() string { + return cgair.rawResponse.Header.Get("x-ms-version") +} + // ContainerGetPropertiesResponse ... type ContainerGetPropertiesResponse struct { rawResponse *http.Response @@ -2748,7 +3134,7 @@ func (cgpr ContainerGetPropertiesResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2763,6 +3149,16 @@ func (cgpr ContainerGetPropertiesResponse) ETag() ETag { return ETag(cgpr.rawResponse.Header.Get("ETag")) } +// HasImmutabilityPolicy returns the value for header x-ms-has-immutability-policy. +func (cgpr ContainerGetPropertiesResponse) HasImmutabilityPolicy() string { + return cgpr.rawResponse.Header.Get("x-ms-has-immutability-policy") +} + +// HasLegalHold returns the value for header x-ms-has-legal-hold. +func (cgpr ContainerGetPropertiesResponse) HasLegalHold() string { + return cgpr.rawResponse.Header.Get("x-ms-has-legal-hold") +} + // LastModified returns the value for header Last-Modified. func (cgpr ContainerGetPropertiesResponse) LastModified() time.Time { s := cgpr.rawResponse.Header.Get("Last-Modified") @@ -2771,7 +3167,7 @@ func (cgpr ContainerGetPropertiesResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2803,6 +3199,8 @@ func (cgpr ContainerGetPropertiesResponse) Version() string { // ContainerItem - An Azure Storage container type ContainerItem struct { + // XMLName is used for marshalling and is subject to removal in a future release. + XMLName xml.Name `xml:"Container"` Name string `xml:"Name"` Properties ContainerProperties `xml:"Properties"` Metadata Metadata `xml:"Metadata"` @@ -2819,23 +3217,19 @@ type ContainerProperties struct { // LeaseDuration - Possible values include: 'LeaseDurationInfinite', 'LeaseDurationFixed', 'LeaseDurationNone' LeaseDuration LeaseDurationType `xml:"LeaseDuration"` // PublicAccess - Possible values include: 'PublicAccessContainer', 'PublicAccessBlob', 'PublicAccessNone' - PublicAccess PublicAccessType `xml:"PublicAccess"` + PublicAccess PublicAccessType `xml:"PublicAccess"` + HasImmutabilityPolicy *bool `xml:"HasImmutabilityPolicy"` + HasLegalHold *bool `xml:"HasLegalHold"` } // MarshalXML implements the xml.Marshaler interface for ContainerProperties. func (cp ContainerProperties) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - if reflect.TypeOf((*ContainerProperties)(nil)).Elem().Size() != reflect.TypeOf((*containerProperties)(nil)).Elem().Size() { - panic("size mismatch between ContainerProperties and containerProperties") - } cp2 := (*containerProperties)(unsafe.Pointer(&cp)) return e.EncodeElement(*cp2, start) } // UnmarshalXML implements the xml.Unmarshaler interface for ContainerProperties. func (cp *ContainerProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - if reflect.TypeOf((*ContainerProperties)(nil)).Elem().Size() != reflect.TypeOf((*containerProperties)(nil)).Elem().Size() { - panic("size mismatch between ContainerProperties and containerProperties") - } cp2 := (*containerProperties)(unsafe.Pointer(cp)) return d.DecodeElement(cp2, &start) } @@ -2868,7 +3262,7 @@ func (crlr ContainerReleaseLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2891,7 +3285,7 @@ func (crlr ContainerReleaseLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2934,7 +3328,7 @@ func (crlr ContainerRenewLeaseResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -2957,7 +3351,7 @@ func (crlr ContainerRenewLeaseResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3005,7 +3399,7 @@ func (csapr ContainerSetAccessPolicyResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3028,7 +3422,7 @@ func (csapr ContainerSetAccessPolicyResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3071,7 +3465,7 @@ func (csmr ContainerSetMetadataResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3094,7 +3488,7 @@ func (csmr ContainerSetMetadataResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3126,7 +3520,7 @@ type CorsRule struct { MaxAgeInSeconds int32 `xml:"MaxAgeInSeconds"` } -// downloadResponse ... +// downloadResponse - Wraps the response from the blobClient.Download method. type downloadResponse struct { rawResponse *http.Response } @@ -3177,7 +3571,7 @@ func (dr downloadResponse) BlobCommittedBlockCount() int32 { } i, err := strconv.ParseInt(s, 10, 32) if err != nil { - panic(err) + i = 0 } return int32(i) } @@ -3190,7 +3584,7 @@ func (dr downloadResponse) BlobContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -3203,7 +3597,7 @@ func (dr downloadResponse) BlobSequenceNumber() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -3241,7 +3635,7 @@ func (dr downloadResponse) ContentLength() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -3254,7 +3648,7 @@ func (dr downloadResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -3277,7 +3671,7 @@ func (dr downloadResponse) CopyCompletionTime() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3315,7 +3709,7 @@ func (dr downloadResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3343,7 +3737,7 @@ func (dr downloadResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3373,7 +3767,7 @@ func (dr downloadResponse) Version() string { return dr.rawResponse.Header.Get("x-ms-version") } -// GeoReplication ... +// GeoReplication - Geo-Replication information for the Secondary Storage Service type GeoReplication struct { // Status - The status of the secondary location. Possible values include: 'GeoReplicationStatusLive', 'GeoReplicationStatusBootstrap', 'GeoReplicationStatusUnavailable', 'GeoReplicationStatusNone' Status GeoReplicationStatusType `xml:"Status"` @@ -3383,35 +3777,45 @@ type GeoReplication struct { // MarshalXML implements the xml.Marshaler interface for GeoReplication. func (gr GeoReplication) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - if reflect.TypeOf((*GeoReplication)(nil)).Elem().Size() != reflect.TypeOf((*geoReplication)(nil)).Elem().Size() { - panic("size mismatch between GeoReplication and geoReplication") - } gr2 := (*geoReplication)(unsafe.Pointer(&gr)) return e.EncodeElement(*gr2, start) } // UnmarshalXML implements the xml.Unmarshaler interface for GeoReplication. func (gr *GeoReplication) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - if reflect.TypeOf((*GeoReplication)(nil)).Elem().Size() != reflect.TypeOf((*geoReplication)(nil)).Elem().Size() { - panic("size mismatch between GeoReplication and geoReplication") - } gr2 := (*geoReplication)(unsafe.Pointer(gr)) return d.DecodeElement(gr2, &start) } +// KeyInfo - Key information +type KeyInfo struct { + // Start - The date-time the key is active in ISO 8601 UTC time + Start string `xml:"Start"` + // Expiry - The date-time the key expires in ISO 8601 UTC time + Expiry string `xml:"Expiry"` +} + +//NewKeyInfo creates a new KeyInfo struct with the correct time formatting & conversion +func NewKeyInfo(Start, Expiry time.Time) KeyInfo { + return KeyInfo{ + Start: Start.UTC().Format(SASTimeFormat), + Expiry: Expiry.UTC().Format(SASTimeFormat), + } +} + // ListBlobsFlatSegmentResponse - An enumeration of blobs type ListBlobsFlatSegmentResponse struct { rawResponse *http.Response // XMLName is used for marshalling and is subject to removal in a future release. - XMLName xml.Name `xml:"EnumerationResults"` - ServiceEndpoint string `xml:"ServiceEndpoint,attr"` - ContainerName string `xml:"ContainerName,attr"` - Prefix string `xml:"Prefix"` - Marker string `xml:"Marker"` - MaxResults int32 `xml:"MaxResults"` - Delimiter string `xml:"Delimiter"` - Segment BlobFlatList `xml:"Blobs"` - NextMarker Marker `xml:"NextMarker"` + XMLName xml.Name `xml:"EnumerationResults"` + ServiceEndpoint string `xml:"ServiceEndpoint,attr"` + ContainerName string `xml:"ContainerName,attr"` + Prefix *string `xml:"Prefix"` + Marker *string `xml:"Marker"` + MaxResults *int32 `xml:"MaxResults"` + Delimiter *string `xml:"Delimiter"` + Segment BlobFlatListSegment `xml:"Blobs"` + NextMarker Marker `xml:"NextMarker"` } // Response returns the raw HTTP response object. @@ -3442,7 +3846,7 @@ func (lbfsr ListBlobsFlatSegmentResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3466,15 +3870,15 @@ func (lbfsr ListBlobsFlatSegmentResponse) Version() string { type ListBlobsHierarchySegmentResponse struct { rawResponse *http.Response // XMLName is used for marshalling and is subject to removal in a future release. - XMLName xml.Name `xml:"EnumerationResults"` - ServiceEndpoint string `xml:"ServiceEndpoint,attr"` - ContainerName string `xml:"ContainerName,attr"` - Prefix string `xml:"Prefix"` - Marker string `xml:"Marker"` - MaxResults int32 `xml:"MaxResults"` - Delimiter string `xml:"Delimiter"` - Segment BlobHierarchyList `xml:"Blobs"` - NextMarker Marker `xml:"NextMarker"` + XMLName xml.Name `xml:"EnumerationResults"` + ServiceEndpoint string `xml:"ServiceEndpoint,attr"` + ContainerName string `xml:"ContainerName,attr"` + Prefix *string `xml:"Prefix"` + Marker *string `xml:"Marker"` + MaxResults *int32 `xml:"MaxResults"` + Delimiter *string `xml:"Delimiter"` + Segment BlobHierarchyListSegment `xml:"Blobs"` + NextMarker Marker `xml:"NextMarker"` } // Response returns the raw HTTP response object. @@ -3505,7 +3909,7 @@ func (lbhsr ListBlobsHierarchySegmentResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3525,47 +3929,47 @@ func (lbhsr ListBlobsHierarchySegmentResponse) Version() string { return lbhsr.rawResponse.Header.Get("x-ms-version") } -// ListContainersResponse - An enumeration of containers -type ListContainersResponse struct { +// ListContainersSegmentResponse - An enumeration of containers +type ListContainersSegmentResponse struct { rawResponse *http.Response // XMLName is used for marshalling and is subject to removal in a future release. XMLName xml.Name `xml:"EnumerationResults"` ServiceEndpoint string `xml:"ServiceEndpoint,attr"` - Prefix string `xml:"Prefix"` + Prefix *string `xml:"Prefix"` Marker *string `xml:"Marker"` - MaxResults int32 `xml:"MaxResults"` + MaxResults *int32 `xml:"MaxResults"` ContainerItems []ContainerItem `xml:"Containers>Container"` NextMarker Marker `xml:"NextMarker"` } // Response returns the raw HTTP response object. -func (lcr ListContainersResponse) Response() *http.Response { - return lcr.rawResponse +func (lcsr ListContainersSegmentResponse) Response() *http.Response { + return lcsr.rawResponse } // StatusCode returns the HTTP status code of the response, e.g. 200. -func (lcr ListContainersResponse) StatusCode() int { - return lcr.rawResponse.StatusCode +func (lcsr ListContainersSegmentResponse) StatusCode() int { + return lcsr.rawResponse.StatusCode } // Status returns the HTTP status message of the response, e.g. "200 OK". -func (lcr ListContainersResponse) Status() string { - return lcr.rawResponse.Status +func (lcsr ListContainersSegmentResponse) Status() string { + return lcsr.rawResponse.Status } // ErrorCode returns the value for header x-ms-error-code. -func (lcr ListContainersResponse) ErrorCode() string { - return lcr.rawResponse.Header.Get("x-ms-error-code") +func (lcsr ListContainersSegmentResponse) ErrorCode() string { + return lcsr.rawResponse.Header.Get("x-ms-error-code") } // RequestID returns the value for header x-ms-request-id. -func (lcr ListContainersResponse) RequestID() string { - return lcr.rawResponse.Header.Get("x-ms-request-id") +func (lcsr ListContainersSegmentResponse) RequestID() string { + return lcsr.rawResponse.Header.Get("x-ms-request-id") } // Version returns the value for header x-ms-version. -func (lcr ListContainersResponse) Version() string { - return lcr.rawResponse.Header.Get("x-ms-version") +func (lcsr ListContainersSegmentResponse) Version() string { + return lcsr.rawResponse.Header.Get("x-ms-version") } // Logging - Azure Analytics Logging settings. @@ -3581,7 +3985,7 @@ type Logging struct { RetentionPolicy RetentionPolicy `xml:"RetentionPolicy"` } -// Metrics ... +// Metrics - a summary of request statistics grouped by API in hour or minute aggregates for blobs type Metrics struct { // Version - The version of Storage Analytics to configure. Version *string `xml:"Version"` @@ -3620,7 +4024,7 @@ func (pbcpr PageBlobClearPagesResponse) BlobSequenceNumber() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -3633,7 +4037,7 @@ func (pbcpr PageBlobClearPagesResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -3646,7 +4050,7 @@ func (pbcpr PageBlobClearPagesResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3669,7 +4073,7 @@ func (pbcpr PageBlobClearPagesResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3722,7 +4126,7 @@ func (pbcir PageBlobCopyIncrementalResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3745,7 +4149,7 @@ func (pbcir PageBlobCopyIncrementalResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3788,7 +4192,7 @@ func (pbcr PageBlobCreateResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -3801,7 +4205,7 @@ func (pbcr PageBlobCreateResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3829,7 +4233,7 @@ func (pbcr PageBlobCreateResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3872,7 +4276,7 @@ func (pbrr PageBlobResizeResponse) BlobSequenceNumber() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -3885,7 +4289,7 @@ func (pbrr PageBlobResizeResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3908,7 +4312,7 @@ func (pbrr PageBlobResizeResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3951,7 +4355,7 @@ func (pbusnr PageBlobUpdateSequenceNumberResponse) BlobSequenceNumber() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -3964,7 +4368,7 @@ func (pbusnr PageBlobUpdateSequenceNumberResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -3987,7 +4391,7 @@ func (pbusnr PageBlobUpdateSequenceNumberResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -4002,6 +4406,103 @@ func (pbusnr PageBlobUpdateSequenceNumberResponse) Version() string { return pbusnr.rawResponse.Header.Get("x-ms-version") } +// PageBlobUploadPagesFromURLResponse ... +type PageBlobUploadPagesFromURLResponse struct { + rawResponse *http.Response +} + +// Response returns the raw HTTP response object. +func (pbupfur PageBlobUploadPagesFromURLResponse) Response() *http.Response { + return pbupfur.rawResponse +} + +// StatusCode returns the HTTP status code of the response, e.g. 200. +func (pbupfur PageBlobUploadPagesFromURLResponse) StatusCode() int { + return pbupfur.rawResponse.StatusCode +} + +// Status returns the HTTP status message of the response, e.g. "200 OK". +func (pbupfur PageBlobUploadPagesFromURLResponse) Status() string { + return pbupfur.rawResponse.Status +} + +// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number. +func (pbupfur PageBlobUploadPagesFromURLResponse) BlobSequenceNumber() int64 { + s := pbupfur.rawResponse.Header.Get("x-ms-blob-sequence-number") + if s == "" { + return -1 + } + i, err := strconv.ParseInt(s, 10, 64) + if err != nil { + i = 0 + } + return i +} + +// ContentMD5 returns the value for header Content-MD5. +func (pbupfur PageBlobUploadPagesFromURLResponse) ContentMD5() []byte { + s := pbupfur.rawResponse.Header.Get("Content-MD5") + if s == "" { + return nil + } + b, err := base64.StdEncoding.DecodeString(s) + if err != nil { + b = nil + } + return b +} + +// Date returns the value for header Date. +func (pbupfur PageBlobUploadPagesFromURLResponse) Date() time.Time { + s := pbupfur.rawResponse.Header.Get("Date") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// ErrorCode returns the value for header x-ms-error-code. +func (pbupfur PageBlobUploadPagesFromURLResponse) ErrorCode() string { + return pbupfur.rawResponse.Header.Get("x-ms-error-code") +} + +// ETag returns the value for header ETag. +func (pbupfur PageBlobUploadPagesFromURLResponse) ETag() ETag { + return ETag(pbupfur.rawResponse.Header.Get("ETag")) +} + +// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. +func (pbupfur PageBlobUploadPagesFromURLResponse) IsServerEncrypted() string { + return pbupfur.rawResponse.Header.Get("x-ms-request-server-encrypted") +} + +// LastModified returns the value for header Last-Modified. +func (pbupfur PageBlobUploadPagesFromURLResponse) LastModified() time.Time { + s := pbupfur.rawResponse.Header.Get("Last-Modified") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// RequestID returns the value for header x-ms-request-id. +func (pbupfur PageBlobUploadPagesFromURLResponse) RequestID() string { + return pbupfur.rawResponse.Header.Get("x-ms-request-id") +} + +// Version returns the value for header x-ms-version. +func (pbupfur PageBlobUploadPagesFromURLResponse) Version() string { + return pbupfur.rawResponse.Header.Get("x-ms-version") +} + // PageBlobUploadPagesResponse ... type PageBlobUploadPagesResponse struct { rawResponse *http.Response @@ -4030,7 +4531,7 @@ func (pbupr PageBlobUploadPagesResponse) BlobSequenceNumber() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -4043,7 +4544,7 @@ func (pbupr PageBlobUploadPagesResponse) ContentMD5() []byte { } b, err := base64.StdEncoding.DecodeString(s) if err != nil { - panic(err) + b = nil } return b } @@ -4056,7 +4557,7 @@ func (pbupr PageBlobUploadPagesResponse) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -4084,7 +4585,7 @@ func (pbupr PageBlobUploadPagesResponse) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -4129,7 +4630,7 @@ func (pl PageList) BlobContentLength() int64 { } i, err := strconv.ParseInt(s, 10, 64) if err != nil { - panic(err) + i = 0 } return i } @@ -4142,7 +4643,7 @@ func (pl PageList) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -4165,7 +4666,7 @@ func (pl PageList) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -4186,7 +4687,7 @@ type PageRange struct { End int64 `xml:"End"` } -// RetentionPolicy - the retention policy +// RetentionPolicy - the retention policy which determines how long the associated data should persist type RetentionPolicy struct { // Enabled - Indicates whether a retention policy is enabled for the storage service Enabled bool `xml:"Enabled"` @@ -4194,6 +4695,64 @@ type RetentionPolicy struct { Days *int32 `xml:"Days"` } +// ServiceGetAccountInfoResponse ... +type ServiceGetAccountInfoResponse struct { + rawResponse *http.Response +} + +// Response returns the raw HTTP response object. +func (sgair ServiceGetAccountInfoResponse) Response() *http.Response { + return sgair.rawResponse +} + +// StatusCode returns the HTTP status code of the response, e.g. 200. +func (sgair ServiceGetAccountInfoResponse) StatusCode() int { + return sgair.rawResponse.StatusCode +} + +// Status returns the HTTP status message of the response, e.g. "200 OK". +func (sgair ServiceGetAccountInfoResponse) Status() string { + return sgair.rawResponse.Status +} + +// AccountKind returns the value for header x-ms-account-kind. +func (sgair ServiceGetAccountInfoResponse) AccountKind() AccountKindType { + return AccountKindType(sgair.rawResponse.Header.Get("x-ms-account-kind")) +} + +// Date returns the value for header Date. +func (sgair ServiceGetAccountInfoResponse) Date() time.Time { + s := sgair.rawResponse.Header.Get("Date") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// ErrorCode returns the value for header x-ms-error-code. +func (sgair ServiceGetAccountInfoResponse) ErrorCode() string { + return sgair.rawResponse.Header.Get("x-ms-error-code") +} + +// RequestID returns the value for header x-ms-request-id. +func (sgair ServiceGetAccountInfoResponse) RequestID() string { + return sgair.rawResponse.Header.Get("x-ms-request-id") +} + +// SkuName returns the value for header x-ms-sku-name. +func (sgair ServiceGetAccountInfoResponse) SkuName() SkuNameType { + return SkuNameType(sgair.rawResponse.Header.Get("x-ms-sku-name")) +} + +// Version returns the value for header x-ms-version. +func (sgair ServiceGetAccountInfoResponse) Version() string { + return sgair.rawResponse.Header.Get("x-ms-version") +} + // ServiceSetPropertiesResponse ... type ServiceSetPropertiesResponse struct { rawResponse *http.Response @@ -4232,12 +4791,11 @@ func (sspr ServiceSetPropertiesResponse) Version() string { // SignedIdentifier - signed identifier type SignedIdentifier struct { // ID - a unique id - ID string `xml:"Id"` - // AccessPolicy - The access policy + ID string `xml:"Id"` AccessPolicy AccessPolicy `xml:"AccessPolicy"` } -// SignedIdentifiers ... +// SignedIdentifiers - Wraps the response from the containerClient.GetAccessPolicy method. type SignedIdentifiers struct { rawResponse *http.Response Items []SignedIdentifier `xml:"SignedIdentifier"` @@ -4271,7 +4829,7 @@ func (si SignedIdentifiers) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -4294,7 +4852,7 @@ func (si SignedIdentifiers) LastModified() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -4309,21 +4867,28 @@ func (si SignedIdentifiers) Version() string { return si.rawResponse.Header.Get("x-ms-version") } +// StaticWebsite - The properties that enable an account to host a static website +type StaticWebsite struct { + // Enabled - Indicates whether this account is hosting a static website + Enabled bool `xml:"Enabled"` + // IndexDocument - The default name of the index page under each directory + IndexDocument *string `xml:"IndexDocument"` + // ErrorDocument404Path - The absolute path of the custom 404 page + ErrorDocument404Path *string `xml:"ErrorDocument404Path"` +} + // StorageServiceProperties - Storage Service Properties. type StorageServiceProperties struct { - rawResponse *http.Response - // Logging - Azure Analytics Logging settings - Logging *Logging `xml:"Logging"` - // HourMetrics - A summary of request statistics grouped by API in hourly aggregates for blobs - HourMetrics *Metrics `xml:"HourMetrics"` - // MinuteMetrics - a summary of request statistics grouped by API in minute aggregates for blobs + rawResponse *http.Response + Logging *Logging `xml:"Logging"` + HourMetrics *Metrics `xml:"HourMetrics"` MinuteMetrics *Metrics `xml:"MinuteMetrics"` // Cors - The set of CORS rules. Cors []CorsRule `xml:"Cors>CorsRule"` // DefaultServiceVersion - The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible values include version 2008-10-27 and all more recent versions - DefaultServiceVersion *string `xml:"DefaultServiceVersion"` - // DeleteRetentionPolicy - The Delete Retention Policy for the service + DefaultServiceVersion *string `xml:"DefaultServiceVersion"` DeleteRetentionPolicy *RetentionPolicy `xml:"DeleteRetentionPolicy"` + StaticWebsite *StaticWebsite `xml:"StaticWebsite"` } // Response returns the raw HTTP response object. @@ -4358,8 +4923,7 @@ func (ssp StorageServiceProperties) Version() string { // StorageServiceStats - Stats for the storage service. type StorageServiceStats struct { - rawResponse *http.Response - // GeoReplication - Geo-Replication information for the Secondary Storage Service + rawResponse *http.Response GeoReplication *GeoReplication `xml:"GeoReplication"` } @@ -4386,7 +4950,7 @@ func (sss StorageServiceStats) Date() time.Time { } t, err := time.Parse(time.RFC1123, s) if err != nil { - panic(err) + t = time.Time{} } return t } @@ -4406,8 +4970,107 @@ func (sss StorageServiceStats) Version() string { return sss.rawResponse.Header.Get("x-ms-version") } +// UserDelegationKey - A user delegation key +type UserDelegationKey struct { + rawResponse *http.Response + // SignedOid - The Azure Active Directory object ID in GUID format. + SignedOid string `xml:"SignedOid"` + // SignedTid - The Azure Active Directory tenant ID in GUID format + SignedTid string `xml:"SignedTid"` + // SignedStart - The date-time the key is active + SignedStart time.Time `xml:"SignedStart"` + // SignedExpiry - The date-time the key expires + SignedExpiry time.Time `xml:"SignedExpiry"` + // SignedService - Abbreviation of the Azure Storage service that accepts the key + SignedService string `xml:"SignedService"` + // SignedVersion - The service version that created the key + SignedVersion string `xml:"SignedVersion"` + // Value - The key as a base64 string + Value string `xml:"Value"` +} + +func (udk UserDelegationKey) ComputeHMACSHA256(message string) (base64String string) { + bytes, _ := base64.StdEncoding.DecodeString(udk.Value) + h := hmac.New(sha256.New, bytes) + h.Write([]byte(message)) + return base64.StdEncoding.EncodeToString(h.Sum(nil)) +} + +// MarshalXML implements the xml.Marshaler interface for UserDelegationKey. +func (udk UserDelegationKey) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + udk2 := (*userDelegationKey)(unsafe.Pointer(&udk)) + return e.EncodeElement(*udk2, start) +} + +// UnmarshalXML implements the xml.Unmarshaler interface for UserDelegationKey. +func (udk *UserDelegationKey) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + udk2 := (*userDelegationKey)(unsafe.Pointer(udk)) + return d.DecodeElement(udk2, &start) +} + +// Response returns the raw HTTP response object. +func (udk UserDelegationKey) Response() *http.Response { + return udk.rawResponse +} + +// StatusCode returns the HTTP status code of the response, e.g. 200. +func (udk UserDelegationKey) StatusCode() int { + return udk.rawResponse.StatusCode +} + +// Status returns the HTTP status message of the response, e.g. "200 OK". +func (udk UserDelegationKey) Status() string { + return udk.rawResponse.Status +} + +// Date returns the value for header Date. +func (udk UserDelegationKey) Date() time.Time { + s := udk.rawResponse.Header.Get("Date") + if s == "" { + return time.Time{} + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + t = time.Time{} + } + return t +} + +// ErrorCode returns the value for header x-ms-error-code. +func (udk UserDelegationKey) ErrorCode() string { + return udk.rawResponse.Header.Get("x-ms-error-code") +} + +// RequestID returns the value for header x-ms-request-id. +func (udk UserDelegationKey) RequestID() string { + return udk.rawResponse.Header.Get("x-ms-request-id") +} + +// Version returns the value for header x-ms-version. +func (udk UserDelegationKey) Version() string { + return udk.rawResponse.Header.Get("x-ms-version") +} + +func init() { + if reflect.TypeOf((*UserDelegationKey)(nil)).Elem().Size() != reflect.TypeOf((*userDelegationKey)(nil)).Elem().Size() { + validateError(errors.New("size mismatch between UserDelegationKey and userDelegationKey")) + } + if reflect.TypeOf((*AccessPolicy)(nil)).Elem().Size() != reflect.TypeOf((*accessPolicy)(nil)).Elem().Size() { + validateError(errors.New("size mismatch between AccessPolicy and accessPolicy")) + } + if reflect.TypeOf((*BlobProperties)(nil)).Elem().Size() != reflect.TypeOf((*blobProperties)(nil)).Elem().Size() { + validateError(errors.New("size mismatch between BlobProperties and blobProperties")) + } + if reflect.TypeOf((*ContainerProperties)(nil)).Elem().Size() != reflect.TypeOf((*containerProperties)(nil)).Elem().Size() { + validateError(errors.New("size mismatch between ContainerProperties and containerProperties")) + } + if reflect.TypeOf((*GeoReplication)(nil)).Elem().Size() != reflect.TypeOf((*geoReplication)(nil)).Elem().Size() { + validateError(errors.New("size mismatch between GeoReplication and geoReplication")) + } +} + const ( - rfc3339Format = "2006-01-02T15:04:05.0000000Z07:00" + rfc3339Format = "2006-01-02T15:04:05Z" //This was wrong in the generated code, FYI ) // used to convert times from UTC to GMT before sending across the wire @@ -4445,6 +5108,38 @@ func (t *timeRFC3339) UnmarshalText(data []byte) (err error) { return } +// internal type used for marshalling base64 encoded strings +type base64Encoded struct { + b []byte +} + +// MarshalText implements the encoding.TextMarshaler interface for base64Encoded. +func (c base64Encoded) MarshalText() ([]byte, error) { + return []byte(base64.StdEncoding.EncodeToString(c.b)), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface for base64Encoded. +func (c *base64Encoded) UnmarshalText(data []byte) error { + b, err := base64.StdEncoding.DecodeString(string(data)) + if err != nil { + return err + } + c.b = b + return nil +} + +// internal type used for marshalling +type userDelegationKey struct { + rawResponse *http.Response + SignedOid string `xml:"SignedOid"` + SignedTid string `xml:"SignedTid"` + SignedStart timeRFC3339 `xml:"SignedStart"` + SignedExpiry timeRFC3339 `xml:"SignedExpiry"` + SignedService string `xml:"SignedService"` + SignedVersion string `xml:"SignedVersion"` + Value string `xml:"Value"` +} + // internal type used for marshalling type accessPolicy struct { Start timeRFC3339 `xml:"Start"` @@ -4454,13 +5149,16 @@ type accessPolicy struct { // internal type used for marshalling type blobProperties struct { + // XMLName is used for marshalling and is subject to removal in a future release. + XMLName xml.Name `xml:"Properties"` + CreationTime *timeRFC1123 `xml:"Creation-Time"` LastModified timeRFC1123 `xml:"Last-Modified"` Etag ETag `xml:"Etag"` ContentLength *int64 `xml:"Content-Length"` ContentType *string `xml:"Content-Type"` ContentEncoding *string `xml:"Content-Encoding"` ContentLanguage *string `xml:"Content-Language"` - ContentMD5 []byte `xml:"Content-MD5"` + ContentMD5 base64Encoded `xml:"Content-MD5"` ContentDisposition *string `xml:"Content-Disposition"` CacheControl *string `xml:"Cache-Control"` BlobSequenceNumber *int64 `xml:"x-ms-blob-sequence-number"` @@ -4482,16 +5180,19 @@ type blobProperties struct { AccessTier AccessTierType `xml:"AccessTier"` AccessTierInferred *bool `xml:"AccessTierInferred"` ArchiveStatus ArchiveStatusType `xml:"ArchiveStatus"` + AccessTierChangeTime *timeRFC1123 `xml:"AccessTierChangeTime"` } // internal type used for marshalling type containerProperties struct { - LastModified timeRFC1123 `xml:"Last-Modified"` - Etag ETag `xml:"Etag"` - LeaseStatus LeaseStatusType `xml:"LeaseStatus"` - LeaseState LeaseStateType `xml:"LeaseState"` - LeaseDuration LeaseDurationType `xml:"LeaseDuration"` - PublicAccess PublicAccessType `xml:"PublicAccess"` + LastModified timeRFC1123 `xml:"Last-Modified"` + Etag ETag `xml:"Etag"` + LeaseStatus LeaseStatusType `xml:"LeaseStatus"` + LeaseState LeaseStateType `xml:"LeaseState"` + LeaseDuration LeaseDurationType `xml:"LeaseDuration"` + PublicAccess PublicAccessType `xml:"PublicAccess"` + HasImmutabilityPolicy *bool `xml:"HasImmutabilityPolicy"` + HasLegalHold *bool `xml:"HasLegalHold"` } // internal type used for marshalling diff --git a/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_page_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_page_blob.go new file mode 100644 index 000000000000..42e27da4c4c6 --- /dev/null +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_page_blob.go @@ -0,0 +1,896 @@ +package azblob + +// Code generated by Microsoft (R) AutoRest Code Generator. +// Changes may cause incorrect behavior and will be lost if the code is regenerated. + +import ( + "context" + "encoding/base64" + "encoding/xml" + "github.com/Azure/azure-pipeline-go/pipeline" + "io" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "time" +) + +// pageBlobClient is the client for the PageBlob methods of the Azblob service. +type pageBlobClient struct { + managementClient +} + +// newPageBlobClient creates an instance of the pageBlobClient client. +func newPageBlobClient(url url.URL, p pipeline.Pipeline) pageBlobClient { + return pageBlobClient{newManagementClient(url, p)} +} + +// ClearPages the Clear Pages operation clears a set of pages from a page blob +// +// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more +// information, see Setting +// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified +// range. leaseID is if specified, the operation only succeeds if the resource's lease is active and matches this ID. +// ifSequenceNumberLessThanOrEqualTo is specify this header value to operate only on a blob if it has a sequence number +// less than or equal to the specified. ifSequenceNumberLessThan is specify this header value to operate only on a blob +// if it has a sequence number less than the specified. ifSequenceNumberEqualTo is specify this header value to operate +// only on a blob if it has the specified sequence number. ifModifiedSince is specify this header value to operate only +// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to +// operate only on a blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value +// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs +// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is +// recorded in the analytics logs when storage analytics logging is enabled. +func (client pageBlobClient) ClearPages(ctx context.Context, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobClearPagesResponse, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.clearPagesPreparer(contentLength, timeout, rangeParameter, leaseID, ifSequenceNumberLessThanOrEqualTo, ifSequenceNumberLessThan, ifSequenceNumberEqualTo, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.clearPagesResponder}, req) + if err != nil { + return nil, err + } + return resp.(*PageBlobClearPagesResponse), err +} + +// clearPagesPreparer prepares the ClearPages request. +func (client pageBlobClient) clearPagesPreparer(contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("comp", "page") + req.URL.RawQuery = params.Encode() + req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) + if rangeParameter != nil { + req.Header.Set("x-ms-range", *rangeParameter) + } + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if ifSequenceNumberLessThanOrEqualTo != nil { + req.Header.Set("x-ms-if-sequence-number-le", strconv.FormatInt(*ifSequenceNumberLessThanOrEqualTo, 10)) + } + if ifSequenceNumberLessThan != nil { + req.Header.Set("x-ms-if-sequence-number-lt", strconv.FormatInt(*ifSequenceNumberLessThan, 10)) + } + if ifSequenceNumberEqualTo != nil { + req.Header.Set("x-ms-if-sequence-number-eq", strconv.FormatInt(*ifSequenceNumberEqualTo, 10)) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + req.Header.Set("x-ms-page-write", "clear") + return req, nil +} + +// clearPagesResponder handles the response to the ClearPages request. +func (client pageBlobClient) clearPagesResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK, http.StatusCreated) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &PageBlobClearPagesResponse{rawResponse: resp.Response()}, err +} + +// CopyIncremental the Copy Incremental operation copies a snapshot of the source page blob to a destination page blob. +// The snapshot is copied such that only the differential changes between the previously copied snapshot are +// transferred to the destination. The copied snapshots are complete copies of the original snapshot and can be read or +// copied from as usual. This API is supported since REST version 2016-05-31. +// +// copySource is specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that +// specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob +// must either be public or must be authenticated via a shared access signature. timeout is the timeout parameter is +// expressed in seconds. For more information, see Setting +// Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if +// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only +// on a blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate +// only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a +// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded +// in the analytics logs when storage analytics logging is enabled. +func (client pageBlobClient) CopyIncremental(ctx context.Context, copySource string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobCopyIncrementalResponse, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.copyIncrementalPreparer(copySource, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.copyIncrementalResponder}, req) + if err != nil { + return nil, err + } + return resp.(*PageBlobCopyIncrementalResponse), err +} + +// copyIncrementalPreparer prepares the CopyIncremental request. +func (client pageBlobClient) copyIncrementalPreparer(copySource string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("comp", "incrementalcopy") + req.URL.RawQuery = params.Encode() + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-copy-source", copySource) + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + return req, nil +} + +// copyIncrementalResponder handles the response to the CopyIncremental request. +func (client pageBlobClient) copyIncrementalResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK, http.StatusAccepted) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &PageBlobCopyIncrementalResponse{rawResponse: resp.Response()}, err +} + +// Create the Create operation creates a new page blob. +// +// contentLength is the length of the request. blobContentLength is this header specifies the maximum size for the page +// blob, up to 1 TB. The page blob size must be aligned to a 512-byte boundary. timeout is the timeout parameter is +// expressed in seconds. For more information, see Setting +// Timeouts for Blob Service Operations. blobContentType is optional. Sets the blob's content type. If specified, +// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the +// blob's content encoding. If specified, this property is stored with the blob and returned with a read request. +// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the +// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this +// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded. +// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and +// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the +// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the +// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, +// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and +// Metadata for more information. leaseID is if specified, the operation only succeeds if the resource's lease is +// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. +// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified +// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified +// since the specified date/time. ifMatch is specify an ETag value to operate only on blobs with a matching value. +// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. blobSequenceNumber is set +// for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of +// the sequence number must be between 0 and 2^63 - 1. requestID is provides a client-generated, opaque value with a 1 +// KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. +func (client pageBlobClient) Create(ctx context.Context, contentLength int64, blobContentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (*PageBlobCreateResponse, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.createPreparer(contentLength, blobContentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, blobSequenceNumber, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req) + if err != nil { + return nil, err + } + return resp.(*PageBlobCreateResponse), err +} + +// createPreparer prepares the Create request. +func (client pageBlobClient) createPreparer(contentLength int64, blobContentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + req.URL.RawQuery = params.Encode() + req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) + if blobContentType != nil { + req.Header.Set("x-ms-blob-content-type", *blobContentType) + } + if blobContentEncoding != nil { + req.Header.Set("x-ms-blob-content-encoding", *blobContentEncoding) + } + if blobContentLanguage != nil { + req.Header.Set("x-ms-blob-content-language", *blobContentLanguage) + } + if blobContentMD5 != nil { + req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(blobContentMD5)) + } + if blobCacheControl != nil { + req.Header.Set("x-ms-blob-cache-control", *blobCacheControl) + } + if metadata != nil { + for k, v := range metadata { + req.Header.Set("x-ms-meta-"+k, v) + } + } + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if blobContentDisposition != nil { + req.Header.Set("x-ms-blob-content-disposition", *blobContentDisposition) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-blob-content-length", strconv.FormatInt(blobContentLength, 10)) + if blobSequenceNumber != nil { + req.Header.Set("x-ms-blob-sequence-number", strconv.FormatInt(*blobSequenceNumber, 10)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + req.Header.Set("x-ms-blob-type", "PageBlob") + return req, nil +} + +// createResponder handles the response to the Create request. +func (client pageBlobClient) createResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK, http.StatusCreated) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &PageBlobCreateResponse{rawResponse: resp.Response()}, err +} + +// GetPageRanges the Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a +// page blob +// +// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to +// retrieve. For more information on working with blob snapshots, see Creating +// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting +// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified +// range. leaseID is if specified, the operation only succeeds if the resource's lease is active and matches this ID. +// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified +// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified +// since the specified date/time. ifMatch is specify an ETag value to operate only on blobs with a matching value. +// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a +// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage +// analytics logging is enabled. +func (client pageBlobClient) GetPageRanges(ctx context.Context, snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*PageList, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.getPageRangesPreparer(snapshot, timeout, rangeParameter, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPageRangesResponder}, req) + if err != nil { + return nil, err + } + return resp.(*PageList), err +} + +// getPageRangesPreparer prepares the GetPageRanges request. +func (client pageBlobClient) getPageRangesPreparer(snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("GET", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if snapshot != nil && len(*snapshot) > 0 { + params.Set("snapshot", *snapshot) + } + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("comp", "pagelist") + req.URL.RawQuery = params.Encode() + if rangeParameter != nil { + req.Header.Set("x-ms-range", *rangeParameter) + } + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + return req, nil +} + +// getPageRangesResponder handles the response to the GetPageRanges request. +func (client pageBlobClient) getPageRangesResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK) + if resp == nil { + return nil, err + } + result := &PageList{rawResponse: resp.Response()} + if err != nil { + return result, err + } + defer resp.Response().Body.Close() + b, err := ioutil.ReadAll(resp.Response().Body) + if err != nil { + return result, err + } + if len(b) > 0 { + b = removeBOM(b) + err = xml.Unmarshal(b, result) + if err != nil { + return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") + } + } + return result, nil +} + +// GetPageRangesDiff the Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were +// changed between target blob and previous snapshot. +// +// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to +// retrieve. For more information on working with blob snapshots, see Creating +// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting +// Timeouts for Blob Service Operations. prevsnapshot is optional in version 2015-07-08 and newer. The prevsnapshot +// parameter is a DateTime value that specifies that the response will contain only pages that were changed between +// target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a +// snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots +// are currently supported only for blobs created on or after January 1, 2016. rangeParameter is return only the bytes +// of the blob in the specified range. leaseID is if specified, the operation only succeeds if the resource's lease is +// active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it has been +// modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if +// it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate only on blobs +// with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics +// logs when storage analytics logging is enabled. +func (client pageBlobClient) GetPageRangesDiff(ctx context.Context, snapshot *string, timeout *int32, prevsnapshot *string, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*PageList, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.getPageRangesDiffPreparer(snapshot, timeout, prevsnapshot, rangeParameter, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPageRangesDiffResponder}, req) + if err != nil { + return nil, err + } + return resp.(*PageList), err +} + +// getPageRangesDiffPreparer prepares the GetPageRangesDiff request. +func (client pageBlobClient) getPageRangesDiffPreparer(snapshot *string, timeout *int32, prevsnapshot *string, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("GET", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if snapshot != nil && len(*snapshot) > 0 { + params.Set("snapshot", *snapshot) + } + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + if prevsnapshot != nil && len(*prevsnapshot) > 0 { + params.Set("prevsnapshot", *prevsnapshot) + } + params.Set("comp", "pagelist") + req.URL.RawQuery = params.Encode() + if rangeParameter != nil { + req.Header.Set("x-ms-range", *rangeParameter) + } + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + return req, nil +} + +// getPageRangesDiffResponder handles the response to the GetPageRangesDiff request. +func (client pageBlobClient) getPageRangesDiffResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK) + if resp == nil { + return nil, err + } + result := &PageList{rawResponse: resp.Response()} + if err != nil { + return result, err + } + defer resp.Response().Body.Close() + b, err := ioutil.ReadAll(resp.Response().Body) + if err != nil { + return result, err + } + if len(b) > 0 { + b = removeBOM(b) + err = xml.Unmarshal(b, result) + if err != nil { + return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") + } + } + return result, nil +} + +// Resize resize the Blob +// +// blobContentLength is this header specifies the maximum size for the page blob, up to 1 TB. The page blob size must +// be aligned to a 512-byte boundary. timeout is the timeout parameter is expressed in seconds. For more information, +// see Setting +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's +// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it +// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a +// blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate only on +// blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics +// logs when storage analytics logging is enabled. +func (client pageBlobClient) Resize(ctx context.Context, blobContentLength int64, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobResizeResponse, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.resizePreparer(blobContentLength, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.resizeResponder}, req) + if err != nil { + return nil, err + } + return resp.(*PageBlobResizeResponse), err +} + +// resizePreparer prepares the Resize request. +func (client pageBlobClient) resizePreparer(blobContentLength int64, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("comp", "properties") + req.URL.RawQuery = params.Encode() + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-blob-content-length", strconv.FormatInt(blobContentLength, 10)) + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + return req, nil +} + +// resizeResponder handles the response to the Resize request. +func (client pageBlobClient) resizeResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &PageBlobResizeResponse{rawResponse: resp.Response()}, err +} + +// UpdateSequenceNumber update the sequence number of the blob +// +// sequenceNumberAction is required if the x-ms-blob-sequence-number header is set for the request. This property +// applies to page blobs only. This property indicates how the service should modify the blob's sequence number timeout +// is the timeout parameter is expressed in seconds. For more information, see Setting +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's +// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it +// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a +// blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value to operate only on +// blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. +// blobSequenceNumber is set for page blobs only. The sequence number is a user-controlled value that you can use to +// track requests. The value of the sequence number must be between 0 and 2^63 - 1. requestID is provides a +// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage +// analytics logging is enabled. +func (client pageBlobClient) UpdateSequenceNumber(ctx context.Context, sequenceNumberAction SequenceNumberActionType, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (*PageBlobUpdateSequenceNumberResponse, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.updateSequenceNumberPreparer(sequenceNumberAction, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, blobSequenceNumber, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.updateSequenceNumberResponder}, req) + if err != nil { + return nil, err + } + return resp.(*PageBlobUpdateSequenceNumberResponse), err +} + +// updateSequenceNumberPreparer prepares the UpdateSequenceNumber request. +func (client pageBlobClient) updateSequenceNumberPreparer(sequenceNumberAction SequenceNumberActionType, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("comp", "properties") + req.URL.RawQuery = params.Encode() + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-sequence-number-action", string(sequenceNumberAction)) + if blobSequenceNumber != nil { + req.Header.Set("x-ms-blob-sequence-number", strconv.FormatInt(*blobSequenceNumber, 10)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + return req, nil +} + +// updateSequenceNumberResponder handles the response to the UpdateSequenceNumber request. +func (client pageBlobClient) updateSequenceNumberResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &PageBlobUpdateSequenceNumberResponse{rawResponse: resp.Response()}, err +} + +// UploadPages the Upload Pages operation writes a range of pages to a page blob +// +// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an +// error.contentLength is the length of the request. transactionalContentMD5 is specify the transactional md5 for the +// body, to be validated by the service. timeout is the timeout parameter is expressed in seconds. For more +// information, see Setting +// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified +// range. leaseID is if specified, the operation only succeeds if the resource's lease is active and matches this ID. +// ifSequenceNumberLessThanOrEqualTo is specify this header value to operate only on a blob if it has a sequence number +// less than or equal to the specified. ifSequenceNumberLessThan is specify this header value to operate only on a blob +// if it has a sequence number less than the specified. ifSequenceNumberEqualTo is specify this header value to operate +// only on a blob if it has the specified sequence number. ifModifiedSince is specify this header value to operate only +// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to +// operate only on a blob if it has not been modified since the specified date/time. ifMatch is specify an ETag value +// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs +// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is +// recorded in the analytics logs when storage analytics logging is enabled. +func (client pageBlobClient) UploadPages(ctx context.Context, body io.ReadSeeker, contentLength int64, transactionalContentMD5 []byte, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobUploadPagesResponse, error) { + if err := validate([]validation{ + {targetValue: body, + constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.uploadPagesPreparer(body, contentLength, transactionalContentMD5, timeout, rangeParameter, leaseID, ifSequenceNumberLessThanOrEqualTo, ifSequenceNumberLessThan, ifSequenceNumberEqualTo, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.uploadPagesResponder}, req) + if err != nil { + return nil, err + } + return resp.(*PageBlobUploadPagesResponse), err +} + +// uploadPagesPreparer prepares the UploadPages request. +func (client pageBlobClient) uploadPagesPreparer(body io.ReadSeeker, contentLength int64, transactionalContentMD5 []byte, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, body) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("comp", "page") + req.URL.RawQuery = params.Encode() + req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) + if transactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(transactionalContentMD5)) + } + if rangeParameter != nil { + req.Header.Set("x-ms-range", *rangeParameter) + } + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if ifSequenceNumberLessThanOrEqualTo != nil { + req.Header.Set("x-ms-if-sequence-number-le", strconv.FormatInt(*ifSequenceNumberLessThanOrEqualTo, 10)) + } + if ifSequenceNumberLessThan != nil { + req.Header.Set("x-ms-if-sequence-number-lt", strconv.FormatInt(*ifSequenceNumberLessThan, 10)) + } + if ifSequenceNumberEqualTo != nil { + req.Header.Set("x-ms-if-sequence-number-eq", strconv.FormatInt(*ifSequenceNumberEqualTo, 10)) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + req.Header.Set("x-ms-page-write", "update") + return req, nil +} + +// uploadPagesResponder handles the response to the UploadPages request. +func (client pageBlobClient) uploadPagesResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK, http.StatusCreated) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &PageBlobUploadPagesResponse{rawResponse: resp.Response()}, err +} + +// UploadPagesFromURL the Upload Pages operation writes a range of pages to a page blob where the contents are read +// from a URL +// +// sourceURL is specify a URL to the copy source. sourceRange is bytes of source data in the specified range. The +// length of this range should match the ContentLength header and x-ms-range/Range destination range header. +// contentLength is the length of the request. rangeParameter is the range of bytes to which the source range would be +// written. The range should be 512 aligned and range-end is required. sourceContentMD5 is specify the md5 calculated +// for the range of bytes that must be read from the copy source. timeout is the timeout parameter is expressed in +// seconds. For more information, see Setting +// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the resource's +// lease is active and matches this ID. ifSequenceNumberLessThanOrEqualTo is specify this header value to operate only +// on a blob if it has a sequence number less than or equal to the specified. ifSequenceNumberLessThan is specify this +// header value to operate only on a blob if it has a sequence number less than the specified. ifSequenceNumberEqualTo +// is specify this header value to operate only on a blob if it has the specified sequence number. ifModifiedSince is +// specify this header value to operate only on a blob if it has been modified since the specified date/time. +// ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified since the +// specified date/time. ifMatch is specify an ETag value to operate only on blobs with a matching value. ifNoneMatch is +// specify an ETag value to operate only on blobs without a matching value. sourceIfModifiedSince is specify this +// header value to operate only on a blob if it has been modified since the specified date/time. +// sourceIfUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified since the +// specified date/time. sourceIfMatch is specify an ETag value to operate only on blobs with a matching value. +// sourceIfNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides +// a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage +// analytics logging is enabled. +func (client pageBlobClient) UploadPagesFromURL(ctx context.Context, sourceURL string, sourceRange string, contentLength int64, rangeParameter string, sourceContentMD5 []byte, timeout *int32, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, requestID *string) (*PageBlobUploadPagesFromURLResponse, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.uploadPagesFromURLPreparer(sourceURL, sourceRange, contentLength, rangeParameter, sourceContentMD5, timeout, leaseID, ifSequenceNumberLessThanOrEqualTo, ifSequenceNumberLessThan, ifSequenceNumberEqualTo, ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatch, sourceIfNoneMatch, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.uploadPagesFromURLResponder}, req) + if err != nil { + return nil, err + } + return resp.(*PageBlobUploadPagesFromURLResponse), err +} + +// uploadPagesFromURLPreparer prepares the UploadPagesFromURL request. +func (client pageBlobClient) uploadPagesFromURLPreparer(sourceURL string, sourceRange string, contentLength int64, rangeParameter string, sourceContentMD5 []byte, timeout *int32, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatch *ETag, ifNoneMatch *ETag, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatch *ETag, sourceIfNoneMatch *ETag, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("PUT", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("comp", "page") + req.URL.RawQuery = params.Encode() + req.Header.Set("x-ms-copy-source", sourceURL) + req.Header.Set("x-ms-source-range", sourceRange) + if sourceContentMD5 != nil { + req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(sourceContentMD5)) + } + req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) + req.Header.Set("x-ms-range", rangeParameter) + if leaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseID) + } + if ifSequenceNumberLessThanOrEqualTo != nil { + req.Header.Set("x-ms-if-sequence-number-le", strconv.FormatInt(*ifSequenceNumberLessThanOrEqualTo, 10)) + } + if ifSequenceNumberLessThan != nil { + req.Header.Set("x-ms-if-sequence-number-lt", strconv.FormatInt(*ifSequenceNumberLessThan, 10)) + } + if ifSequenceNumberEqualTo != nil { + req.Header.Set("x-ms-if-sequence-number-eq", strconv.FormatInt(*ifSequenceNumberEqualTo, 10)) + } + if ifModifiedSince != nil { + req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifUnmodifiedSince != nil { + req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if ifMatch != nil { + req.Header.Set("If-Match", string(*ifMatch)) + } + if ifNoneMatch != nil { + req.Header.Set("If-None-Match", string(*ifNoneMatch)) + } + if sourceIfModifiedSince != nil { + req.Header.Set("x-ms-source-if-modified-since", (*sourceIfModifiedSince).In(gmt).Format(time.RFC1123)) + } + if sourceIfUnmodifiedSince != nil { + req.Header.Set("x-ms-source-if-unmodified-since", (*sourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)) + } + if sourceIfMatch != nil { + req.Header.Set("x-ms-source-if-match", string(*sourceIfMatch)) + } + if sourceIfNoneMatch != nil { + req.Header.Set("x-ms-source-if-none-match", string(*sourceIfNoneMatch)) + } + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + req.Header.Set("x-ms-page-write", "update") + return req, nil +} + +// uploadPagesFromURLResponder handles the response to the UploadPagesFromURL request. +func (client pageBlobClient) uploadPagesFromURLResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK, http.StatusCreated) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &PageBlobUploadPagesFromURLResponse{rawResponse: resp.Response()}, err +} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_responder_policy.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_responder_policy.go similarity index 96% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_responder_policy.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_responder_policy.go index 2f391d731258..8a023d0a02ce 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_responder_policy.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_responder_policy.go @@ -55,7 +55,7 @@ func validateResponse(resp pipeline.Response, successStatusCodes ...int) error { defer resp.Response().Body.Close() b, err := ioutil.ReadAll(resp.Response().Body) if err != nil { - return NewResponseError(err, resp.Response(), "failed to read response body") + return err } // the service code, description and details will be populated during unmarshalling responseError := NewResponseError(nil, resp.Response(), resp.Response().Status) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_response_error.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_response_error.go similarity index 100% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_response_error.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_response_error.go diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_service.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_service.go similarity index 76% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_service.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_service.go index 76f235e1595b..6c896b729abf 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_service.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_service.go @@ -25,6 +25,44 @@ func newServiceClient(url url.URL, p pipeline.Pipeline) serviceClient { return serviceClient{newManagementClient(url, p)} } +// GetAccountInfo returns the sku name and account kind +func (client serviceClient) GetAccountInfo(ctx context.Context) (*ServiceGetAccountInfoResponse, error) { + req, err := client.getAccountInfoPreparer() + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getAccountInfoResponder}, req) + if err != nil { + return nil, err + } + return resp.(*ServiceGetAccountInfoResponse), err +} + +// getAccountInfoPreparer prepares the GetAccountInfo request. +func (client serviceClient) getAccountInfoPreparer() (pipeline.Request, error) { + req, err := pipeline.NewRequest("GET", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + params.Set("restype", "account") + params.Set("comp", "properties") + req.URL.RawQuery = params.Encode() + req.Header.Set("x-ms-version", ServiceVersion) + return req, nil +} + +// getAccountInfoResponder handles the response to the GetAccountInfo request. +func (client serviceClient) getAccountInfoResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK) + if resp == nil { + return nil, err + } + io.Copy(ioutil.Discard, resp.Response().Body) + resp.Response().Body.Close() + return &ServiceGetAccountInfoResponse{rawResponse: resp.Response()}, err +} + // GetProperties gets the properties of a storage account's Blob service, including properties for Storage Analytics // and CORS (Cross-Origin Resource Sharing) rules. // @@ -83,7 +121,7 @@ func (client serviceClient) getPropertiesResponder(resp pipeline.Response) (pipe defer resp.Response().Body.Close() b, err := ioutil.ReadAll(resp.Response().Body) if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") + return result, err } if len(b) > 0 { b = removeBOM(b) @@ -153,7 +191,86 @@ func (client serviceClient) getStatisticsResponder(resp pipeline.Response) (pipe defer resp.Response().Body.Close() b, err := ioutil.ReadAll(resp.Response().Body) if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") + return result, err + } + if len(b) > 0 { + b = removeBOM(b) + err = xml.Unmarshal(b, result) + if err != nil { + return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") + } + } + return result, nil +} + +// GetUserDelegationKey retrieves a user delgation key for the Blob service. This is only a valid operation when using +// bearer token authentication. +// +// timeout is the timeout parameter is expressed in seconds. For more information, see Setting +// Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB +// character limit that is recorded in the analytics logs when storage analytics logging is enabled. +func (client serviceClient) GetUserDelegationKey(ctx context.Context, keyInfo KeyInfo, timeout *int32, requestID *string) (*UserDelegationKey, error) { + if err := validate([]validation{ + {targetValue: timeout, + constraints: []constraint{{target: "timeout", name: null, rule: false, + chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { + return nil, err + } + req, err := client.getUserDelegationKeyPreparer(keyInfo, timeout, requestID) + if err != nil { + return nil, err + } + resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getUserDelegationKeyResponder}, req) + if err != nil { + return nil, err + } + return resp.(*UserDelegationKey), err +} + +// getUserDelegationKeyPreparer prepares the GetUserDelegationKey request. +func (client serviceClient) getUserDelegationKeyPreparer(keyInfo KeyInfo, timeout *int32, requestID *string) (pipeline.Request, error) { + req, err := pipeline.NewRequest("POST", client.url, nil) + if err != nil { + return req, pipeline.NewError(err, "failed to create request") + } + params := req.URL.Query() + if timeout != nil { + params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) + } + params.Set("restype", "service") + params.Set("comp", "userdelegationkey") + req.URL.RawQuery = params.Encode() + req.Header.Set("x-ms-version", ServiceVersion) + if requestID != nil { + req.Header.Set("x-ms-client-request-id", *requestID) + } + b, err := xml.Marshal(keyInfo) + if err != nil { + return req, pipeline.NewError(err, "failed to marshal request body") + } + req.Header.Set("Content-Type", "application/xml") + err = req.SetBody(bytes.NewReader(b)) + if err != nil { + return req, pipeline.NewError(err, "failed to set request body") + } + return req, nil +} + +// getUserDelegationKeyResponder handles the response to the GetUserDelegationKey request. +func (client serviceClient) getUserDelegationKeyResponder(resp pipeline.Response) (pipeline.Response, error) { + err := validateResponse(resp, http.StatusOK) + if resp == nil { + return nil, err + } + result := &UserDelegationKey{rawResponse: resp.Response()} + if err != nil { + return result, err + } + defer resp.Response().Body.Close() + b, err := ioutil.ReadAll(resp.Response().Body) + if err != nil { + return result, err } if len(b) > 0 { b = removeBOM(b) @@ -183,7 +300,7 @@ func (client serviceClient) getStatisticsResponder(resp pipeline.Response) (pipe // href="https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations">Setting // Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB // character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client serviceClient) ListContainersSegment(ctx context.Context, prefix *string, marker *string, maxresults *int32, include ListContainersIncludeType, timeout *int32, requestID *string) (*ListContainersResponse, error) { +func (client serviceClient) ListContainersSegment(ctx context.Context, prefix *string, marker *string, maxresults *int32, include ListContainersIncludeType, timeout *int32, requestID *string) (*ListContainersSegmentResponse, error) { if err := validate([]validation{ {targetValue: maxresults, constraints: []constraint{{target: "maxresults", name: null, rule: false, @@ -201,7 +318,7 @@ func (client serviceClient) ListContainersSegment(ctx context.Context, prefix *s if err != nil { return nil, err } - return resp.(*ListContainersResponse), err + return resp.(*ListContainersSegmentResponse), err } // listContainersSegmentPreparer prepares the ListContainersSegment request. @@ -241,14 +358,14 @@ func (client serviceClient) listContainersSegmentResponder(resp pipeline.Respons if resp == nil { return nil, err } - result := &ListContainersResponse{rawResponse: resp.Response()} + result := &ListContainersSegmentResponse{rawResponse: resp.Response()} if err != nil { return result, err } defer resp.Response().Body.Close() b, err := ioutil.ReadAll(resp.Response().Body) if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") + return result, err } if len(b) > 0 { b = removeBOM(b) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_validation.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_validation.go similarity index 100% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_validation.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_validation.go diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_version.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_version.go similarity index 88% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_version.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_version.go index 760271a42159..4b49c18662ce 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_version.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_generated_version.go @@ -5,7 +5,7 @@ package azblob // UserAgent returns the UserAgent string to use when sending http.Requests. func UserAgent() string { - return "Azure-SDK-For-Go/0.0.0 azblob/2018-03-28" + return "Azure-SDK-For-Go/0.0.0 azblob/2018-11-09" } // Version returns the semantic version (see http://semver.org) of the client. diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_response_helpers.go b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_response_helpers.go similarity index 98% rename from vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_response_helpers.go rename to vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_response_helpers.go index b4f058b6748c..8c7f5945329c 100644 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_response_helpers.go +++ b/vendor/github.com/Azure/azure-storage-blob-go/azblob/zz_response_helpers.go @@ -65,7 +65,7 @@ func (r *DownloadResponse) Body(o RetryReaderOptions) io.ReadCloser { func(ctx context.Context, getInfo HTTPGetterInfo) (*http.Response, error) { resp, err := r.b.Download(ctx, getInfo.Offset, getInfo.Count, BlobAccessConditions{ - HTTPAccessConditions: HTTPAccessConditions{IfMatch: getInfo.ETag}, + ModifiedAccessConditions: ModifiedAccessConditions{IfMatch: getInfo.ETag}, }, false) if err != nil { diff --git a/vendor/github.com/allegro/bigcache/LICENSE b/vendor/github.com/allegro/bigcache/LICENSE new file mode 100644 index 000000000000..8dada3edaf50 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/allegro/bigcache/README.md b/vendor/github.com/allegro/bigcache/README.md new file mode 100644 index 000000000000..c23f7f36ce48 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/README.md @@ -0,0 +1,150 @@ +# BigCache [![Build Status](https://travis-ci.org/allegro/bigcache.svg?branch=master)](https://travis-ci.org/allegro/bigcache) [![Coverage Status](https://coveralls.io/repos/github/allegro/bigcache/badge.svg?branch=master)](https://coveralls.io/github/allegro/bigcache?branch=master) [![GoDoc](https://godoc.org/github.com/allegro/bigcache?status.svg)](https://godoc.org/github.com/allegro/bigcache) [![Go Report Card](https://goreportcard.com/badge/github.com/allegro/bigcache)](https://goreportcard.com/report/github.com/allegro/bigcache) + +Fast, concurrent, evicting in-memory cache written to keep big number of entries without impact on performance. +BigCache keeps entries on heap but omits GC for them. To achieve that operations on bytes arrays take place, +therefore entries (de)serialization in front of the cache will be needed in most use cases. + +## Usage + +### Simple initialization + +```go +import "github.com/allegro/bigcache" + +cache, _ := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute)) + +cache.Set("my-unique-key", []byte("value")) + +entry, _ := cache.Get("my-unique-key") +fmt.Println(string(entry)) +``` + +### Custom initialization + +When cache load can be predicted in advance then it is better to use custom initialization because additional memory +allocation can be avoided in that way. + +```go +import ( + "log" + + "github.com/allegro/bigcache" +) + +config := bigcache.Config { + // number of shards (must be a power of 2) + Shards: 1024, + // time after which entry can be evicted + LifeWindow: 10 * time.Minute, + // rps * lifeWindow, used only in initial memory allocation + MaxEntriesInWindow: 1000 * 10 * 60, + // max entry size in bytes, used only in initial memory allocation + MaxEntrySize: 500, + // prints information about additional memory allocation + Verbose: true, + // cache will not allocate more memory than this limit, value in MB + // if value is reached then the oldest entries can be overridden for the new ones + // 0 value means no size limit + HardMaxCacheSize: 8192, + // callback fired when the oldest entry is removed because of its expiration time or no space left + // for the new entry, or because delete was called. A bitmask representing the reason will be returned. + // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. + OnRemove: nil, + // OnRemoveWithReason is a callback fired when the oldest entry is removed because of its expiration time or no space left + // for the new entry, or because delete was called. A constant representing the reason will be passed through. + // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. + // Ignored if OnRemove is specified. + OnRemoveWithReason: nil, + } + +cache, initErr := bigcache.NewBigCache(config) +if initErr != nil { + log.Fatal(initErr) +} + +cache.Set("my-unique-key", []byte("value")) + +if entry, err := cache.Get("my-unique-key"); err == nil { + fmt.Println(string(entry)) +} +``` + +## Benchmarks + +Three caches were compared: bigcache, [freecache](https://github.com/coocood/freecache) and map. +Benchmark tests were made using an i7-6700K with 32GB of RAM on Windows 10. + +### Writes and reads + +```bash +cd caches_bench; go test -bench=. -benchtime=10s ./... -timeout 30m + +BenchmarkMapSet-8 3000000 569 ns/op 202 B/op 3 allocs/op +BenchmarkConcurrentMapSet-8 1000000 1592 ns/op 347 B/op 8 allocs/op +BenchmarkFreeCacheSet-8 3000000 775 ns/op 355 B/op 2 allocs/op +BenchmarkBigCacheSet-8 3000000 640 ns/op 303 B/op 2 allocs/op +BenchmarkMapGet-8 5000000 407 ns/op 24 B/op 1 allocs/op +BenchmarkConcurrentMapGet-8 3000000 558 ns/op 24 B/op 2 allocs/op +BenchmarkFreeCacheGet-8 2000000 682 ns/op 136 B/op 2 allocs/op +BenchmarkBigCacheGet-8 3000000 512 ns/op 152 B/op 4 allocs/op +BenchmarkBigCacheSetParallel-8 10000000 225 ns/op 313 B/op 3 allocs/op +BenchmarkFreeCacheSetParallel-8 10000000 218 ns/op 341 B/op 3 allocs/op +BenchmarkConcurrentMapSetParallel-8 5000000 318 ns/op 200 B/op 6 allocs/op +BenchmarkBigCacheGetParallel-8 20000000 178 ns/op 152 B/op 4 allocs/op +BenchmarkFreeCacheGetParallel-8 20000000 295 ns/op 136 B/op 3 allocs/op +BenchmarkConcurrentMapGetParallel-8 10000000 237 ns/op 24 B/op 2 allocs/op +``` + +Writes and reads in bigcache are faster than in freecache. +Writes to map are the slowest. + +### GC pause time + +```bash +cd caches_bench; go run caches_gc_overhead_comparison.go + +Number of entries: 20000000 +GC pause for bigcache: 5.8658ms +GC pause for freecache: 32.4341ms +GC pause for map: 52.9661ms +``` + +Test shows how long are the GC pauses for caches filled with 20mln of entries. +Bigcache and freecache have very similar GC pause time. +It is clear that both reduce GC overhead in contrast to map +which GC pause time took more than 10 seconds. + +## How it works + +BigCache relies on optimization presented in 1.5 version of Go ([issue-9477](https://github.com/golang/go/issues/9477)). +This optimization states that if map without pointers in keys and values is used then GC will omit its content. +Therefore BigCache uses `map[uint64]uint32` where keys are hashed and values are offsets of entries. + +Entries are kept in bytes array, to omit GC again. +Bytes array size can grow to gigabytes without impact on performance +because GC will only see single pointer to it. + +## Bigcache vs Freecache + +Both caches provide the same core features but they reduce GC overhead in different ways. +Bigcache relies on `map[uint64]uint32`, freecache implements its own mapping built on +slices to reduce number of pointers. + +Results from benchmark tests are presented above. +One of the advantage of bigcache over freecache is that you don’t need to know +the size of the cache in advance, because when bigcache is full, +it can allocate additional memory for new entries instead of +overwriting existing ones as freecache does currently. +However hard max size in bigcache also can be set, check [HardMaxCacheSize](https://godoc.org/github.com/allegro/bigcache#Config). + +## HTTP Server + +This package also includes an easily deployable HTTP implementation of BigCache, which can be found in the [server](/server) package. + +## More + +Bigcache genesis is described in allegro.tech blog post: [writing a very fast cache service in Go](http://allegro.tech/2016/03/writing-fast-cache-service-in-go.html) + +## License + +BigCache is released under the Apache 2.0 license (see [LICENSE](LICENSE)) diff --git a/vendor/github.com/allegro/bigcache/bigcache.go b/vendor/github.com/allegro/bigcache/bigcache.go new file mode 100644 index 000000000000..b3879264ac6f --- /dev/null +++ b/vendor/github.com/allegro/bigcache/bigcache.go @@ -0,0 +1,202 @@ +package bigcache + +import ( + "fmt" + "time" +) + +const ( + minimumEntriesInShard = 10 // Minimum number of entries in single shard +) + +// BigCache is fast, concurrent, evicting cache created to keep big number of entries without impact on performance. +// It keeps entries on heap but omits GC for them. To achieve that, operations take place on byte arrays, +// therefore entries (de)serialization in front of the cache will be needed in most use cases. +type BigCache struct { + shards []*cacheShard + lifeWindow uint64 + clock clock + hash Hasher + config Config + shardMask uint64 + maxShardSize uint32 + close chan struct{} +} + +// RemoveReason is a value used to signal to the user why a particular key was removed in the OnRemove callback. +type RemoveReason uint32 + +const ( + // Expired means the key is past its LifeWindow. + Expired RemoveReason = iota + // NoSpace means the key is the oldest and the cache size was at its maximum when Set was called, or the + // entry exceeded the maximum shard size. + NoSpace + // Deleted means Delete was called and this key was removed as a result. + Deleted +) + +// NewBigCache initialize new instance of BigCache +func NewBigCache(config Config) (*BigCache, error) { + return newBigCache(config, &systemClock{}) +} + +func newBigCache(config Config, clock clock) (*BigCache, error) { + + if !isPowerOfTwo(config.Shards) { + return nil, fmt.Errorf("Shards number must be power of two") + } + + if config.Hasher == nil { + config.Hasher = newDefaultHasher() + } + + cache := &BigCache{ + shards: make([]*cacheShard, config.Shards), + lifeWindow: uint64(config.LifeWindow.Seconds()), + clock: clock, + hash: config.Hasher, + config: config, + shardMask: uint64(config.Shards - 1), + maxShardSize: uint32(config.maximumShardSize()), + close: make(chan struct{}), + } + + var onRemove func(wrappedEntry []byte, reason RemoveReason) + if config.OnRemove != nil { + onRemove = cache.providedOnRemove + } else if config.OnRemoveWithReason != nil { + onRemove = cache.providedOnRemoveWithReason + } else { + onRemove = cache.notProvidedOnRemove + } + + for i := 0; i < config.Shards; i++ { + cache.shards[i] = initNewShard(config, onRemove, clock) + } + + if config.CleanWindow > 0 { + go func() { + ticker := time.NewTicker(config.CleanWindow) + defer ticker.Stop() + for { + select { + case t := <-ticker.C: + cache.cleanUp(uint64(t.Unix())) + case <-cache.close: + return + } + } + }() + } + + return cache, nil +} + +// Close is used to signal a shutdown of the cache when you are done with it. +// This allows the cleaning goroutines to exit and ensures references are not +// kept to the cache preventing GC of the entire cache. +func (c *BigCache) Close() error { + close(c.close) + return nil +} + +// Get reads entry for the key. +// It returns an ErrEntryNotFound when +// no entry exists for the given key. +func (c *BigCache) Get(key string) ([]byte, error) { + hashedKey := c.hash.Sum64(key) + shard := c.getShard(hashedKey) + return shard.get(key, hashedKey) +} + +// Set saves entry under the key +func (c *BigCache) Set(key string, entry []byte) error { + hashedKey := c.hash.Sum64(key) + shard := c.getShard(hashedKey) + return shard.set(key, hashedKey, entry) +} + +// Delete removes the key +func (c *BigCache) Delete(key string) error { + hashedKey := c.hash.Sum64(key) + shard := c.getShard(hashedKey) + return shard.del(key, hashedKey) +} + +// Reset empties all cache shards +func (c *BigCache) Reset() error { + for _, shard := range c.shards { + shard.reset(c.config) + } + return nil +} + +// Len computes number of entries in cache +func (c *BigCache) Len() int { + var len int + for _, shard := range c.shards { + len += shard.len() + } + return len +} + +// Capacity returns amount of bytes store in the cache. +func (c *BigCache) Capacity() int { + var len int + for _, shard := range c.shards { + len += shard.capacity() + } + return len +} + +// Stats returns cache's statistics +func (c *BigCache) Stats() Stats { + var s Stats + for _, shard := range c.shards { + tmp := shard.getStats() + s.Hits += tmp.Hits + s.Misses += tmp.Misses + s.DelHits += tmp.DelHits + s.DelMisses += tmp.DelMisses + s.Collisions += tmp.Collisions + } + return s +} + +// Iterator returns iterator function to iterate over EntryInfo's from whole cache. +func (c *BigCache) Iterator() *EntryInfoIterator { + return newIterator(c) +} + +func (c *BigCache) onEvict(oldestEntry []byte, currentTimestamp uint64, evict func(reason RemoveReason) error) bool { + oldestTimestamp := readTimestampFromEntry(oldestEntry) + if currentTimestamp-oldestTimestamp > c.lifeWindow { + evict(Expired) + return true + } + return false +} + +func (c *BigCache) cleanUp(currentTimestamp uint64) { + for _, shard := range c.shards { + shard.cleanUp(currentTimestamp) + } +} + +func (c *BigCache) getShard(hashedKey uint64) (shard *cacheShard) { + return c.shards[hashedKey&c.shardMask] +} + +func (c *BigCache) providedOnRemove(wrappedEntry []byte, reason RemoveReason) { + c.config.OnRemove(readKeyFromEntry(wrappedEntry), readEntry(wrappedEntry)) +} + +func (c *BigCache) providedOnRemoveWithReason(wrappedEntry []byte, reason RemoveReason) { + if c.config.onRemoveFilter == 0 || (1< 0 { + c.config.OnRemoveWithReason(readKeyFromEntry(wrappedEntry), readEntry(wrappedEntry), reason) + } +} + +func (c *BigCache) notProvidedOnRemove(wrappedEntry []byte, reason RemoveReason) { +} diff --git a/vendor/github.com/allegro/bigcache/bytes.go b/vendor/github.com/allegro/bigcache/bytes.go new file mode 100644 index 000000000000..3944bfe13599 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/bytes.go @@ -0,0 +1,14 @@ +// +build !appengine + +package bigcache + +import ( + "reflect" + "unsafe" +) + +func bytesToString(b []byte) string { + bytesHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + strHeader := reflect.StringHeader{Data: bytesHeader.Data, Len: bytesHeader.Len} + return *(*string)(unsafe.Pointer(&strHeader)) +} diff --git a/vendor/github.com/allegro/bigcache/bytes_appengine.go b/vendor/github.com/allegro/bigcache/bytes_appengine.go new file mode 100644 index 000000000000..3892f3b54f3d --- /dev/null +++ b/vendor/github.com/allegro/bigcache/bytes_appengine.go @@ -0,0 +1,7 @@ +// +build appengine + +package bigcache + +func bytesToString(b []byte) string { + return string(b) +} diff --git a/vendor/github.com/allegro/bigcache/clock.go b/vendor/github.com/allegro/bigcache/clock.go new file mode 100644 index 000000000000..f8b535e133a7 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/clock.go @@ -0,0 +1,14 @@ +package bigcache + +import "time" + +type clock interface { + epoch() int64 +} + +type systemClock struct { +} + +func (c systemClock) epoch() int64 { + return time.Now().Unix() +} diff --git a/vendor/github.com/allegro/bigcache/config.go b/vendor/github.com/allegro/bigcache/config.go new file mode 100644 index 000000000000..9654143ab132 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/config.go @@ -0,0 +1,86 @@ +package bigcache + +import "time" + +// Config for BigCache +type Config struct { + // Number of cache shards, value must be a power of two + Shards int + // Time after which entry can be evicted + LifeWindow time.Duration + // Interval between removing expired entries (clean up). + // If set to <= 0 then no action is performed. Setting to < 1 second is counterproductive — bigcache has a one second resolution. + CleanWindow time.Duration + // Max number of entries in life window. Used only to calculate initial size for cache shards. + // When proper value is set then additional memory allocation does not occur. + MaxEntriesInWindow int + // Max size of entry in bytes. Used only to calculate initial size for cache shards. + MaxEntrySize int + // Verbose mode prints information about new memory allocation + Verbose bool + // Hasher used to map between string keys and unsigned 64bit integers, by default fnv64 hashing is used. + Hasher Hasher + // HardMaxCacheSize is a limit for cache size in MB. Cache will not allocate more memory than this limit. + // It can protect application from consuming all available memory on machine, therefore from running OOM Killer. + // Default value is 0 which means unlimited size. When the limit is higher than 0 and reached then + // the oldest entries are overridden for the new ones. + HardMaxCacheSize int + // OnRemove is a callback fired when the oldest entry is removed because of its expiration time or no space left + // for the new entry, or because delete was called. + // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. + OnRemove func(key string, entry []byte) + // OnRemoveWithReason is a callback fired when the oldest entry is removed because of its expiration time or no space left + // for the new entry, or because delete was called. A constant representing the reason will be passed through. + // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. + // Ignored if OnRemove is specified. + OnRemoveWithReason func(key string, entry []byte, reason RemoveReason) + + onRemoveFilter int + + // Logger is a logging interface and used in combination with `Verbose` + // Defaults to `DefaultLogger()` + Logger Logger +} + +// DefaultConfig initializes config with default values. +// When load for BigCache can be predicted in advance then it is better to use custom config. +func DefaultConfig(eviction time.Duration) Config { + return Config{ + Shards: 1024, + LifeWindow: eviction, + CleanWindow: 0, + MaxEntriesInWindow: 1000 * 10 * 60, + MaxEntrySize: 500, + Verbose: true, + Hasher: newDefaultHasher(), + HardMaxCacheSize: 0, + Logger: DefaultLogger(), + } +} + +// initialShardSize computes initial shard size +func (c Config) initialShardSize() int { + return max(c.MaxEntriesInWindow/c.Shards, minimumEntriesInShard) +} + +// maximumShardSize computes maximum shard size +func (c Config) maximumShardSize() int { + maxShardSize := 0 + + if c.HardMaxCacheSize > 0 { + maxShardSize = convertMBToBytes(c.HardMaxCacheSize) / c.Shards + } + + return maxShardSize +} + +// OnRemoveFilterSet sets which remove reasons will trigger a call to OnRemoveWithReason. +// Filtering out reasons prevents bigcache from unwrapping them, which saves cpu. +func (c Config) OnRemoveFilterSet(reasons ...RemoveReason) Config { + c.onRemoveFilter = 0 + for i := range reasons { + c.onRemoveFilter |= 1 << uint(reasons[i]) + } + + return c +} diff --git a/vendor/github.com/allegro/bigcache/encoding.go b/vendor/github.com/allegro/bigcache/encoding.go new file mode 100644 index 000000000000..4d434e5dce0a --- /dev/null +++ b/vendor/github.com/allegro/bigcache/encoding.go @@ -0,0 +1,62 @@ +package bigcache + +import ( + "encoding/binary" +) + +const ( + timestampSizeInBytes = 8 // Number of bytes used for timestamp + hashSizeInBytes = 8 // Number of bytes used for hash + keySizeInBytes = 2 // Number of bytes used for size of entry key + headersSizeInBytes = timestampSizeInBytes + hashSizeInBytes + keySizeInBytes // Number of bytes used for all headers +) + +func wrapEntry(timestamp uint64, hash uint64, key string, entry []byte, buffer *[]byte) []byte { + keyLength := len(key) + blobLength := len(entry) + headersSizeInBytes + keyLength + + if blobLength > len(*buffer) { + *buffer = make([]byte, blobLength) + } + blob := *buffer + + binary.LittleEndian.PutUint64(blob, timestamp) + binary.LittleEndian.PutUint64(blob[timestampSizeInBytes:], hash) + binary.LittleEndian.PutUint16(blob[timestampSizeInBytes+hashSizeInBytes:], uint16(keyLength)) + copy(blob[headersSizeInBytes:], key) + copy(blob[headersSizeInBytes+keyLength:], entry) + + return blob[:blobLength] +} + +func readEntry(data []byte) []byte { + length := binary.LittleEndian.Uint16(data[timestampSizeInBytes+hashSizeInBytes:]) + + // copy on read + dst := make([]byte, len(data)-int(headersSizeInBytes+length)) + copy(dst, data[headersSizeInBytes+length:]) + + return dst +} + +func readTimestampFromEntry(data []byte) uint64 { + return binary.LittleEndian.Uint64(data) +} + +func readKeyFromEntry(data []byte) string { + length := binary.LittleEndian.Uint16(data[timestampSizeInBytes+hashSizeInBytes:]) + + // copy on read + dst := make([]byte, length) + copy(dst, data[headersSizeInBytes:headersSizeInBytes+length]) + + return bytesToString(dst) +} + +func readHashFromEntry(data []byte) uint64 { + return binary.LittleEndian.Uint64(data[timestampSizeInBytes:]) +} + +func resetKeyFromEntry(data []byte) { + binary.LittleEndian.PutUint64(data[timestampSizeInBytes:], 0) +} diff --git a/vendor/github.com/allegro/bigcache/entry_not_found_error.go b/vendor/github.com/allegro/bigcache/entry_not_found_error.go new file mode 100644 index 000000000000..051a71230790 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/entry_not_found_error.go @@ -0,0 +1,6 @@ +package bigcache + +import "errors" + +// ErrEntryNotFound is an error type struct which is returned when entry was not found for provided key +var ErrEntryNotFound = errors.New("Entry not found") diff --git a/vendor/github.com/allegro/bigcache/fnv.go b/vendor/github.com/allegro/bigcache/fnv.go new file mode 100644 index 000000000000..188c9aa6dcbd --- /dev/null +++ b/vendor/github.com/allegro/bigcache/fnv.go @@ -0,0 +1,28 @@ +package bigcache + +// newDefaultHasher returns a new 64-bit FNV-1a Hasher which makes no memory allocations. +// Its Sum64 method will lay the value out in big-endian byte order. +// See https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function +func newDefaultHasher() Hasher { + return fnv64a{} +} + +type fnv64a struct{} + +const ( + // offset64 FNVa offset basis. See https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function#FNV-1a_hash + offset64 = 14695981039346656037 + // prime64 FNVa prime value. See https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function#FNV-1a_hash + prime64 = 1099511628211 +) + +// Sum64 gets the string and returns its uint64 hash value. +func (f fnv64a) Sum64(key string) uint64 { + var hash uint64 = offset64 + for i := 0; i < len(key); i++ { + hash ^= uint64(key[i]) + hash *= prime64 + } + + return hash +} diff --git a/vendor/github.com/allegro/bigcache/hash.go b/vendor/github.com/allegro/bigcache/hash.go new file mode 100644 index 000000000000..5f8ade774daa --- /dev/null +++ b/vendor/github.com/allegro/bigcache/hash.go @@ -0,0 +1,8 @@ +package bigcache + +// Hasher is responsible for generating unsigned, 64 bit hash of provided string. Hasher should minimize collisions +// (generating same hash for different strings) and while performance is also important fast functions are preferable (i.e. +// you can use FarmHash family). +type Hasher interface { + Sum64(string) uint64 +} diff --git a/vendor/github.com/allegro/bigcache/iterator.go b/vendor/github.com/allegro/bigcache/iterator.go new file mode 100644 index 000000000000..70b98d900435 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/iterator.go @@ -0,0 +1,122 @@ +package bigcache + +import "sync" + +type iteratorError string + +func (e iteratorError) Error() string { + return string(e) +} + +// ErrInvalidIteratorState is reported when iterator is in invalid state +const ErrInvalidIteratorState = iteratorError("Iterator is in invalid state. Use SetNext() to move to next position") + +// ErrCannotRetrieveEntry is reported when entry cannot be retrieved from underlying +const ErrCannotRetrieveEntry = iteratorError("Could not retrieve entry from cache") + +var emptyEntryInfo = EntryInfo{} + +// EntryInfo holds informations about entry in the cache +type EntryInfo struct { + timestamp uint64 + hash uint64 + key string + value []byte +} + +// Key returns entry's underlying key +func (e EntryInfo) Key() string { + return e.key +} + +// Hash returns entry's hash value +func (e EntryInfo) Hash() uint64 { + return e.hash +} + +// Timestamp returns entry's timestamp (time of insertion) +func (e EntryInfo) Timestamp() uint64 { + return e.timestamp +} + +// Value returns entry's underlying value +func (e EntryInfo) Value() []byte { + return e.value +} + +// EntryInfoIterator allows to iterate over entries in the cache +type EntryInfoIterator struct { + mutex sync.Mutex + cache *BigCache + currentShard int + currentIndex int + elements []uint32 + elementsCount int + valid bool +} + +// SetNext moves to next element and returns true if it exists. +func (it *EntryInfoIterator) SetNext() bool { + it.mutex.Lock() + + it.valid = false + it.currentIndex++ + + if it.elementsCount > it.currentIndex { + it.valid = true + it.mutex.Unlock() + return true + } + + for i := it.currentShard + 1; i < it.cache.config.Shards; i++ { + it.elements, it.elementsCount = it.cache.shards[i].copyKeys() + + // Non empty shard - stick with it + if it.elementsCount > 0 { + it.currentIndex = 0 + it.currentShard = i + it.valid = true + it.mutex.Unlock() + return true + } + } + it.mutex.Unlock() + return false +} + +func newIterator(cache *BigCache) *EntryInfoIterator { + elements, count := cache.shards[0].copyKeys() + + return &EntryInfoIterator{ + cache: cache, + currentShard: 0, + currentIndex: -1, + elements: elements, + elementsCount: count, + } +} + +// Value returns current value from the iterator +func (it *EntryInfoIterator) Value() (EntryInfo, error) { + it.mutex.Lock() + + if !it.valid { + it.mutex.Unlock() + return emptyEntryInfo, ErrInvalidIteratorState + } + + entry, err := it.cache.shards[it.currentShard].getEntry(int(it.elements[it.currentIndex])) + + if err != nil { + it.mutex.Unlock() + return emptyEntryInfo, ErrCannotRetrieveEntry + } + it.mutex.Unlock() + + return EntryInfo{ + timestamp: readTimestampFromEntry(entry), + hash: readHashFromEntry(entry), + key: readKeyFromEntry(entry), + value: readEntry(entry), + }, nil +} diff --git a/vendor/github.com/allegro/bigcache/logger.go b/vendor/github.com/allegro/bigcache/logger.go new file mode 100644 index 000000000000..50e84abc8006 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/logger.go @@ -0,0 +1,30 @@ +package bigcache + +import ( + "log" + "os" +) + +// Logger is invoked when `Config.Verbose=true` +type Logger interface { + Printf(format string, v ...interface{}) +} + +// this is a safeguard, breaking on compile time in case +// `log.Logger` does not adhere to our `Logger` interface. +// see https://golang.org/doc/faq#guarantee_satisfies_interface +var _ Logger = &log.Logger{} + +// DefaultLogger returns a `Logger` implementation +// backed by stdlib's log +func DefaultLogger() *log.Logger { + return log.New(os.Stdout, "", log.LstdFlags) +} + +func newLogger(custom Logger) Logger { + if custom != nil { + return custom + } + + return DefaultLogger() +} diff --git a/vendor/github.com/allegro/bigcache/queue/bytes_queue.go b/vendor/github.com/allegro/bigcache/queue/bytes_queue.go new file mode 100644 index 000000000000..bda73740317a --- /dev/null +++ b/vendor/github.com/allegro/bigcache/queue/bytes_queue.go @@ -0,0 +1,238 @@ +package queue + +import ( + "encoding/binary" + "log" + "time" +) + +const ( + // Number of bytes used to keep information about entry size + headerEntrySize = 4 + // Bytes before left margin are not used. Zero index means element does not exist in queue, useful while reading slice from index + leftMarginIndex = 1 + // Minimum empty blob size in bytes. Empty blob fills space between tail and head in additional memory allocation. + // It keeps entries indexes unchanged + minimumEmptyBlobSize = 32 + headerEntrySize +) + +var ( + errEmptyQueue = &queueError{"Empty queue"} + errInvalidIndex = &queueError{"Index must be greater than zero. Invalid index."} + errIndexOutOfBounds = &queueError{"Index out of range"} +) + +// BytesQueue is a non-thread safe queue type of fifo based on bytes array. +// For every push operation index of entry is returned. It can be used to read the entry later +type BytesQueue struct { + array []byte + capacity int + maxCapacity int + head int + tail int + count int + rightMargin int + headerBuffer []byte + verbose bool + initialCapacity int +} + +type queueError struct { + message string +} + +// NewBytesQueue initialize new bytes queue. +// Initial capacity is used in bytes array allocation +// When verbose flag is set then information about memory allocation are printed +func NewBytesQueue(initialCapacity int, maxCapacity int, verbose bool) *BytesQueue { + return &BytesQueue{ + array: make([]byte, initialCapacity), + capacity: initialCapacity, + maxCapacity: maxCapacity, + headerBuffer: make([]byte, headerEntrySize), + tail: leftMarginIndex, + head: leftMarginIndex, + rightMargin: leftMarginIndex, + verbose: verbose, + initialCapacity: initialCapacity, + } +} + +// Reset removes all entries from queue +func (q *BytesQueue) Reset() { + // Just reset indexes + q.tail = leftMarginIndex + q.head = leftMarginIndex + q.rightMargin = leftMarginIndex + q.count = 0 +} + +// Push copies entry at the end of queue and moves tail pointer. Allocates more space if needed. +// Returns index for pushed data or error if maximum size queue limit is reached. +func (q *BytesQueue) Push(data []byte) (int, error) { + dataLen := len(data) + + if q.availableSpaceAfterTail() < dataLen+headerEntrySize { + if q.availableSpaceBeforeHead() >= dataLen+headerEntrySize { + q.tail = leftMarginIndex + } else if q.capacity+headerEntrySize+dataLen >= q.maxCapacity && q.maxCapacity > 0 { + return -1, &queueError{"Full queue. Maximum size limit reached."} + } else { + q.allocateAdditionalMemory(dataLen + headerEntrySize) + } + } + + index := q.tail + + q.push(data, dataLen) + + return index, nil +} + +func (q *BytesQueue) allocateAdditionalMemory(minimum int) { + start := time.Now() + if q.capacity < minimum { + q.capacity += minimum + } + q.capacity = q.capacity * 2 + if q.capacity > q.maxCapacity && q.maxCapacity > 0 { + q.capacity = q.maxCapacity + } + + oldArray := q.array + q.array = make([]byte, q.capacity) + + if leftMarginIndex != q.rightMargin { + copy(q.array, oldArray[:q.rightMargin]) + + if q.tail < q.head { + emptyBlobLen := q.head - q.tail - headerEntrySize + q.push(make([]byte, emptyBlobLen), emptyBlobLen) + q.head = leftMarginIndex + q.tail = q.rightMargin + } + } + + if q.verbose { + log.Printf("Allocated new queue in %s; Capacity: %d \n", time.Since(start), q.capacity) + } +} + +func (q *BytesQueue) push(data []byte, len int) { + binary.LittleEndian.PutUint32(q.headerBuffer, uint32(len)) + q.copy(q.headerBuffer, headerEntrySize) + + q.copy(data, len) + + if q.tail > q.head { + q.rightMargin = q.tail + } + + q.count++ +} + +func (q *BytesQueue) copy(data []byte, len int) { + q.tail += copy(q.array[q.tail:], data[:len]) +} + +// Pop reads the oldest entry from queue and moves head pointer to the next one +func (q *BytesQueue) Pop() ([]byte, error) { + data, size, err := q.peek(q.head) + if err != nil { + return nil, err + } + + q.head += headerEntrySize + size + q.count-- + + if q.head == q.rightMargin { + q.head = leftMarginIndex + if q.tail == q.rightMargin { + q.tail = leftMarginIndex + } + q.rightMargin = q.tail + } + + return data, nil +} + +// Peek reads the oldest entry from list without moving head pointer +func (q *BytesQueue) Peek() ([]byte, error) { + data, _, err := q.peek(q.head) + return data, err +} + +// Get reads entry from index +func (q *BytesQueue) Get(index int) ([]byte, error) { + data, _, err := q.peek(index) + return data, err +} + +// CheckGet checks if an entry can be read from index +func (q *BytesQueue) CheckGet(index int) error { + return q.peekCheckErr(index) +} + +// Capacity returns number of allocated bytes for queue +func (q *BytesQueue) Capacity() int { + return q.capacity +} + +// Len returns number of entries kept in queue +func (q *BytesQueue) Len() int { + return q.count +} + +// Error returns error message +func (e *queueError) Error() string { + return e.message +} + +// peekCheckErr is identical to peek, but does not actually return any data +func (q *BytesQueue) peekCheckErr(index int) error { + + if q.count == 0 { + return errEmptyQueue + } + + if index <= 0 { + return errInvalidIndex + } + + if index+headerEntrySize >= len(q.array) { + return errIndexOutOfBounds + } + return nil +} + +func (q *BytesQueue) peek(index int) ([]byte, int, error) { + + if q.count == 0 { + return nil, 0, errEmptyQueue + } + + if index <= 0 { + return nil, 0, errInvalidIndex + } + + if index+headerEntrySize >= len(q.array) { + return nil, 0, errIndexOutOfBounds + } + + blockSize := int(binary.LittleEndian.Uint32(q.array[index : index+headerEntrySize])) + return q.array[index+headerEntrySize : index+headerEntrySize+blockSize], blockSize, nil +} + +func (q *BytesQueue) availableSpaceAfterTail() int { + if q.tail >= q.head { + return q.capacity - q.tail + } + return q.head - q.tail - minimumEmptyBlobSize +} + +func (q *BytesQueue) availableSpaceBeforeHead() int { + if q.tail >= q.head { + return q.head - leftMarginIndex - minimumEmptyBlobSize + } + return q.head - q.tail - minimumEmptyBlobSize +} diff --git a/vendor/github.com/allegro/bigcache/shard.go b/vendor/github.com/allegro/bigcache/shard.go new file mode 100644 index 000000000000..a31094ff3880 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/shard.go @@ -0,0 +1,259 @@ +package bigcache + +import ( + "fmt" + "sync" + "sync/atomic" + + "github.com/allegro/bigcache/queue" +) + +type onRemoveCallback func(wrappedEntry []byte, reason RemoveReason) + +type cacheShard struct { + hashmap map[uint64]uint32 + entries queue.BytesQueue + lock sync.RWMutex + entryBuffer []byte + onRemove onRemoveCallback + + isVerbose bool + logger Logger + clock clock + lifeWindow uint64 + + stats Stats +} + +func (s *cacheShard) get(key string, hashedKey uint64) ([]byte, error) { + s.lock.RLock() + itemIndex := s.hashmap[hashedKey] + + if itemIndex == 0 { + s.lock.RUnlock() + s.miss() + return nil, ErrEntryNotFound + } + + wrappedEntry, err := s.entries.Get(int(itemIndex)) + if err != nil { + s.lock.RUnlock() + s.miss() + return nil, err + } + if entryKey := readKeyFromEntry(wrappedEntry); key != entryKey { + if s.isVerbose { + s.logger.Printf("Collision detected. Both %q and %q have the same hash %x", key, entryKey, hashedKey) + } + s.lock.RUnlock() + s.collision() + return nil, ErrEntryNotFound + } + entry := readEntry(wrappedEntry) + s.lock.RUnlock() + s.hit() + return entry, nil +} + +func (s *cacheShard) set(key string, hashedKey uint64, entry []byte) error { + currentTimestamp := uint64(s.clock.epoch()) + + s.lock.Lock() + + if previousIndex := s.hashmap[hashedKey]; previousIndex != 0 { + if previousEntry, err := s.entries.Get(int(previousIndex)); err == nil { + resetKeyFromEntry(previousEntry) + } + } + + if oldestEntry, err := s.entries.Peek(); err == nil { + s.onEvict(oldestEntry, currentTimestamp, s.removeOldestEntry) + } + + w := wrapEntry(currentTimestamp, hashedKey, key, entry, &s.entryBuffer) + + for { + if index, err := s.entries.Push(w); err == nil { + s.hashmap[hashedKey] = uint32(index) + s.lock.Unlock() + return nil + } + if s.removeOldestEntry(NoSpace) != nil { + s.lock.Unlock() + return fmt.Errorf("entry is bigger than max shard size") + } + } +} + +func (s *cacheShard) del(key string, hashedKey uint64) error { + // Optimistic pre-check using only readlock + s.lock.RLock() + itemIndex := s.hashmap[hashedKey] + + if itemIndex == 0 { + s.lock.RUnlock() + s.delmiss() + return ErrEntryNotFound + } + + if err := s.entries.CheckGet(int(itemIndex)); err != nil { + s.lock.RUnlock() + s.delmiss() + return err + } + s.lock.RUnlock() + + s.lock.Lock() + { + // After obtaining the writelock, we need to read the same again, + // since the data delivered earlier may be stale now + itemIndex = s.hashmap[hashedKey] + + if itemIndex == 0 { + s.lock.Unlock() + s.delmiss() + return ErrEntryNotFound + } + + wrappedEntry, err := s.entries.Get(int(itemIndex)) + if err != nil { + s.lock.Unlock() + s.delmiss() + return err + } + + delete(s.hashmap, hashedKey) + s.onRemove(wrappedEntry, Deleted) + resetKeyFromEntry(wrappedEntry) + } + s.lock.Unlock() + + s.delhit() + return nil +} + +func (s *cacheShard) onEvict(oldestEntry []byte, currentTimestamp uint64, evict func(reason RemoveReason) error) bool { + oldestTimestamp := readTimestampFromEntry(oldestEntry) + if currentTimestamp-oldestTimestamp > s.lifeWindow { + evict(Expired) + return true + } + return false +} + +func (s *cacheShard) cleanUp(currentTimestamp uint64) { + s.lock.Lock() + for { + if oldestEntry, err := s.entries.Peek(); err != nil { + break + } else if evicted := s.onEvict(oldestEntry, currentTimestamp, s.removeOldestEntry); !evicted { + break + } + } + s.lock.Unlock() +} + +func (s *cacheShard) getOldestEntry() ([]byte, error) { + s.lock.RLock() + defer s.lock.RUnlock() + return s.entries.Peek() +} + +func (s *cacheShard) getEntry(index int) ([]byte, error) { + s.lock.RLock() + entry, err := s.entries.Get(index) + s.lock.RUnlock() + + return entry, err +} + +func (s *cacheShard) copyKeys() (keys []uint32, next int) { + s.lock.RLock() + keys = make([]uint32, len(s.hashmap)) + + for _, index := range s.hashmap { + keys[next] = index + next++ + } + + s.lock.RUnlock() + return keys, next +} + +func (s *cacheShard) removeOldestEntry(reason RemoveReason) error { + oldest, err := s.entries.Pop() + if err == nil { + hash := readHashFromEntry(oldest) + delete(s.hashmap, hash) + s.onRemove(oldest, reason) + return nil + } + return err +} + +func (s *cacheShard) reset(config Config) { + s.lock.Lock() + s.hashmap = make(map[uint64]uint32, config.initialShardSize()) + s.entryBuffer = make([]byte, config.MaxEntrySize+headersSizeInBytes) + s.entries.Reset() + s.lock.Unlock() +} + +func (s *cacheShard) len() int { + s.lock.RLock() + res := len(s.hashmap) + s.lock.RUnlock() + return res +} + +func (s *cacheShard) capacity() int { + s.lock.RLock() + res := s.entries.Capacity() + s.lock.RUnlock() + return res +} + +func (s *cacheShard) getStats() Stats { + var stats = Stats{ + Hits: atomic.LoadInt64(&s.stats.Hits), + Misses: atomic.LoadInt64(&s.stats.Misses), + DelHits: atomic.LoadInt64(&s.stats.DelHits), + DelMisses: atomic.LoadInt64(&s.stats.DelMisses), + Collisions: atomic.LoadInt64(&s.stats.Collisions), + } + return stats +} + +func (s *cacheShard) hit() { + atomic.AddInt64(&s.stats.Hits, 1) +} + +func (s *cacheShard) miss() { + atomic.AddInt64(&s.stats.Misses, 1) +} + +func (s *cacheShard) delhit() { + atomic.AddInt64(&s.stats.DelHits, 1) +} + +func (s *cacheShard) delmiss() { + atomic.AddInt64(&s.stats.DelMisses, 1) +} + +func (s *cacheShard) collision() { + atomic.AddInt64(&s.stats.Collisions, 1) +} + +func initNewShard(config Config, callback onRemoveCallback, clock clock) *cacheShard { + return &cacheShard{ + hashmap: make(map[uint64]uint32, config.initialShardSize()), + entries: *queue.NewBytesQueue(config.initialShardSize()*config.MaxEntrySize, config.maximumShardSize(), config.Verbose), + entryBuffer: make([]byte, config.MaxEntrySize+headersSizeInBytes), + onRemove: callback, + + isVerbose: config.Verbose, + logger: newLogger(config.Logger), + clock: clock, + lifeWindow: uint64(config.LifeWindow.Seconds()), + } +} diff --git a/vendor/github.com/allegro/bigcache/stats.go b/vendor/github.com/allegro/bigcache/stats.go new file mode 100644 index 000000000000..07157132a239 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/stats.go @@ -0,0 +1,15 @@ +package bigcache + +// Stats stores cache statistics +type Stats struct { + // Hits is a number of successfully found keys + Hits int64 `json:"hits"` + // Misses is a number of not found keys + Misses int64 `json:"misses"` + // DelHits is a number of successfully deleted keys + DelHits int64 `json:"delete_hits"` + // DelMisses is a number of not deleted keys + DelMisses int64 `json:"delete_misses"` + // Collisions is a number of happened key-collisions + Collisions int64 `json:"collisions"` +} diff --git a/vendor/github.com/allegro/bigcache/utils.go b/vendor/github.com/allegro/bigcache/utils.go new file mode 100644 index 000000000000..ca1df79b9335 --- /dev/null +++ b/vendor/github.com/allegro/bigcache/utils.go @@ -0,0 +1,16 @@ +package bigcache + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func convertMBToBytes(value int) int { + return value * 1024 * 1024 +} + +func isPowerOfTwo(number int) bool { + return (number & (number - 1)) == 0 +} diff --git a/vendor/github.com/apilayer/freegeoip/AUTHORS b/vendor/github.com/apilayer/freegeoip/AUTHORS new file mode 100644 index 000000000000..7d80c4d211c7 --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/AUTHORS @@ -0,0 +1,11 @@ +# This is the official list of freegeoip authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS file. +# +# Names should be added to this file as +# Name or Organization +# +# The email address is not required for organizations. +# +# Please keep the list sorted. + +Alexandre Fiori diff --git a/vendor/github.com/apilayer/freegeoip/CONTRIBUTORS b/vendor/github.com/apilayer/freegeoip/CONTRIBUTORS new file mode 100644 index 000000000000..a460460e4e05 --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/CONTRIBUTORS @@ -0,0 +1,22 @@ +# This is the official list of freegeoip contributors for copyright purposes. +# This file is distinct from the AUTHORS file. +# +# Names should be added to this file as +# Name or Organization +# +# Please keep the list sorted. +# +# Use the following command to generate the list: +# +# git shortlog -se | awk '{print $2 " " $3 " " $4}' +# +# The email address is not required for organizations. + +Alex Goretoy +Gleicon Moraes +Leandro Pereira +Lucas Fontes +Matthias Nehlsen +Melchi +Nick Muerdter +Vladimir Agafonkin diff --git a/vendor/github.com/apilayer/freegeoip/Dockerfile b/vendor/github.com/apilayer/freegeoip/Dockerfile new file mode 100644 index 000000000000..ac3b5e5a2efd --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/Dockerfile @@ -0,0 +1,25 @@ +FROM golang:1.9 + +COPY cmd/freegeoip/public /var/www + +ADD . /go/src/github.com/apilayer/freegeoip +RUN \ + cd /go/src/github.com/apilayer/freegeoip/cmd/freegeoip && \ + go get -d && go install && \ + apt-get update && apt-get install -y libcap2-bin && \ + setcap cap_net_bind_service=+ep /go/bin/freegeoip && \ + apt-get clean && rm -rf /var/lib/apt/lists/* && \ + useradd -ms /bin/bash freegeoip + +USER freegeoip +ENTRYPOINT ["/go/bin/freegeoip"] + +EXPOSE 8080 + +# CMD instructions: +# Add "-use-x-forwarded-for" if your server is behind a reverse proxy +# Add "-public", "/var/www" to enable the web front-end +# Add "-internal-server", "8888" to enable the pprof+metrics server +# +# Example: +# CMD ["-use-x-forwarded-for", "-public", "/var/www", "-internal-server", "8888"] diff --git a/vendor/github.com/apilayer/freegeoip/HISTORY.md b/vendor/github.com/apilayer/freegeoip/HISTORY.md new file mode 100644 index 000000000000..1a8e68db7676 --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/HISTORY.md @@ -0,0 +1,55 @@ +# History of freegeoip.net + +The freegeoip software is the result of a web server research project that +started in 2009, written in Python and hosted on +[Google App Engine](http://appengine.google.com). It was rapidly adopted by +many developers around the world due to its simplistic and straightforward +HTTP API, causing the free account on GAE to exceed its quota every day +after few hours of operation. + +A year later freegeoip 1.0 was released, and the freegeoip.net domain +moved over to its own server infrastructure. The software was rewritten +using the [Cyclone](http://cyclone.io) web framework, backed by +[Twisted](http://twistedmatrix.com) and [PyPy](http://pypy.org) in +production. That's when the first database management tool was created, +a script that would download many pieces of information from the Internet +to create the IP database, an sqlite flat file used by the server. + +This version of the Python server shipped with a much better front-end as +well, but still as a server-side rendered template inherited from the GAE +version. It was only circa 2011 that freegeoip got its first standalone +front-end based on jQuery, and is when Twitter bootstrap was first used. + +Python played an important role in the early life of freegeoip and +allowed the service to grow and evolve fast. It provided a lot of +flexibility in building and maintaining the IP database using multiple +sources of data. This version of the server lasted until 2013, when +it was once again rewritten from scratch, this time in Go. The database +tool, however, remained intact. + +In 2013 the Go version was released as freegeoip 2.0 and this version +had many iterations. The first versions of the server written in Go were +very rustic, practically a verbatim transcription of the Python server. +Took a while until it started looking more like common Go code, and to +have tests. + +Another important change that shipped with v2 was a front-end based on +AngularJS, but still mixed with some jQuery. The Google map in the front +page was made optional to put more focus on the HTTP API. The popularity +of freegeoip has increased considerably over the years of 2013 and 2014, +calling for more. + +Enter freegeoip 3.0, an evolution of the Go server. The foundation of +freegeoip, which is the IP database and HTTP API, now lives in a Go +package that other developers can leverage. The freegeoip web server is +built on this package making its code cleaner, the server faster, +and requires zero maintenance for the IP database. The server downloads +the file from MaxMind and keep it up to date in background. + +This and other changes make it very Docker friendly. + +The front-end has been trimmed down to a single index.html file that loads +CSS and JS from CDNs on the internet. The JS part is based on AngularJS +and handles the search request and response of the public site. The +optional map has become a link to Google Maps following the lat/long +of the query results. diff --git a/vendor/github.com/apilayer/freegeoip/LICENSE b/vendor/github.com/apilayer/freegeoip/LICENSE new file mode 100644 index 000000000000..12d6a5cd539d --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The freegeoip authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * The names of authors or contributors may NOT be used to endorse or +promote products derived from this software without specific prior +written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/apilayer/freegeoip/Procfile b/vendor/github.com/apilayer/freegeoip/Procfile new file mode 100644 index 000000000000..de810e15d969 --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/Procfile @@ -0,0 +1 @@ +web: freegeoip -http :${PORT} -use-x-forwarded-for -public /app/cmd/freegeoip/public -quota-backend map -quota-max 10000 diff --git a/vendor/github.com/apilayer/freegeoip/README.md b/vendor/github.com/apilayer/freegeoip/README.md new file mode 100644 index 000000000000..d89310d8c110 --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/README.md @@ -0,0 +1,259 @@ +![freegeoip ipstack](https://raw.githubusercontent.com/apilayer/freegeoip/master/freegeo-warning.png) + +# freegeoip - Important Announcement + +*[The old freegeoip API is now deprecated and will be discontinued on July 1st, 2018]* + +Launched more than 6 years ago, the freegeoip.net API has grown into one of the biggest and most widely used APIs for IP to location services worldwide. The API is used by thousands of developers, SMBs and large corporations around the globe and is currently handling more than 2 billion requests per day. After years of operation and the API remaining almost unchanged, today we announce the complete re-launch of freegeoip into a faster, more advanced and more scalable API service called ipstack (https://ipstack.com). All users that wish to continue using our IP to location service will be required to sign up to obtain a free API access key and perform a few simple changes to their integration. While the new API offers the ability to return data in the same structure as the old freegeoip API, the new API structure offers various options of delivering much more advanced data for IP Addresses. + +## Required Changes to Legacy Integrations (freegeoip.net/json/xml) + +As of March 31 2018 the old freegeoip API is deprecated and a completely re-designed API is now accessible at http://api.ipstack.com. While the new API offers the same capabilities as the old one and also has the option of returning data in the legacy format, the API URL has now changed and all users are required to sign up for a free API Access Key to use the service. + +1. Get a free ipstack Account and Access Key + +Head over to https://ipstack.com and follow the instructions to create your account and obtain your access token. If you only need basic IP to Geolocation data and do not require more than 10,000 requests per month, you can use the free account. If you'd like more advanced features or more requests than included in the free account you will need to choose one of the paid options. You can find an overview of all available plans at https://ipstack.com/product + +2. Integrate the new API URL + +The new API comes with a completely new endpoint (api.ipstack.com) and requires you to append your API Access Key to the URL as a GET parameter. For complete integration instructions, please head over to the API Documentation at https://ipstack.com/documentation. While the new API offers a completely reworked response structure with many additional data points, we also offer the option to receive results in the old freegeoip.net format in JSON or XML. + +To receive your API results in the old freegeoip format, please simply append &legacy=1 to the new API URL. + +JSON Example: http://api.ipstack.com/186.116.207.169?access_key=YOUR_ACCESS_KEY&output=json&legacy=1 + +XML Example: http://api.ipstack.com/186.116.207.169?access_key=YOUR_ACCESS_KEY&output=xml&legacy=1 + +## New features with ipstack +While the new ipstack service now runs on a commercial/freemium model, we have worked hard at building a faster, more scalable, and more advanced IP to location API product. You can read more about all the new features by navigating to https://ipstack.com, but here's a list of the most important changes and additions: + +- We're still free for basic usage + +While we now offer paid / premium options for our more advanced users, our core product and IP to Country/Region/City product is still completely free of charge for up to 10,000 requests per month. If you need more advanced data or more requests, you can choose one of the paid plans listed at https://ipstack.com/product + +- Batch Requests + +Need to validate more than 1 IP Address in a single API Call? Our new Bulk Lookup Feature (available on our paid plans) allows you to geolocate up to 50 IP Addresses in a single API Call. + +- Much more Data + +While the old freegeoip API was limited to provide only the most basic IP to location data, our new API provides more than 20 additional data points including Language, Time Zone, Current Time, Currencies, Connection & ASN Information, and much more. To learn more about all the data points available, please head over to the ipstack website. + +- Security & Fraud Prevention Tools + +Do you want to prevent fraudulent traffic from arriving at your website or from abusing your service? Easily spot malicious / proxy / VPN traffic by using our new Security Module, which outputs a lot of valuable security information about an IP Address. + +Next Steps + +- Deprecation of the old API + +While we want to keep the disruption to our current users as minimal as possible, we are planning to shut the old API down on July 1st, 2018. This should give all users enough time to adapt to changes, and should we still see high volumes of traffic going to the old API by that date, we may decide to extend it further. In any case, we highly recommend you switch to the new API as soon as possible. We will keep you posted here about any changes to the planned shutdown date. + +- Any Questions? Please get in touch! + +It's very important to ensure a smooth transition to ipstack for all freegeoip API users. If you are a developer that has published a plugin/addon that includes the legacy API, we recommend you get in touch with us and also share this announcement with your users. If you have any questions about the transition or the new API, please get in touch with us at support@ipstack.com + + + + + + + + + + + +# freegeoip - Deprecated Documentation + +[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy) + +This is the source code of the freegeoip software. It contains both the web server that empowers freegeoip.net, and a package for the [Go](http://golang.org) programming language that enables any web server to support IP geolocation with a simple and clean API. + +See http://en.wikipedia.org/wiki/Geolocation for details about geolocation. + +Developers looking for the Go API can skip to the [Package freegeoip](#packagefreegeoip) section below. + +## Running + +This section is for people who desire to run the freegeoip web server on their own infrastructure. The easiest and most generic way of doing this is by using Docker. All examples below use Docker. + +### Docker + +#### Install Docker + +Docker has [install instructions for many platforms](https://docs.docker.com/engine/installation/), +including +- [Ubuntu](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/) +- [CentOS](https://docs.docker.com/engine/installation/linux/docker-ce/centos/) +- [Mac](https://docs.docker.com/docker-for-mac/install/) + +#### Run the API in a container + +```bash +docker run --restart=always -p 8080:8080 -d apilayer/freegeoip +``` + +#### Test + +```bash +curl localhost:8080/json/1.2.3.4 +# => {"ip":"1.2.3.4","country_code":"US","country_name":"United States", # ... +``` + +### Other Linux, OS X, FreeBSD, and Windows + +There are [pre-compiled binaries](https://github.com/apilayer/freegeoip/releases) available. + +### Production configuration + +For production workloads you may want to use different configuration for the freegeoip web server, for example: + +* Enabling the "internal server" for collecting metrics and profiling/tracing the freegeoip web server on demand +* Monitoring the internal server using [Prometheus](https://prometheus.io), or exporting your metrics to [New Relic](https://newrelic.com) +* Serving the freegeoip API over HTTPS (TLS) using your own certificates, or provisioned automatically using [LetsEncrypt.org](https://letsencrypt.org) +* Configuring [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) to restrict your browser clients to always use HTTPS +* Configuring the read and write timeouts to avoid stale clients consuming server resources +* Configuring the freegeoip web server to read the client IP (for logs, etc) from the X-Forwarded-For header when running behind a reverse proxy +* Configuring [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) to restrict access to your API to specific domains +* Configuring a specific endpoint path prefix other than the default "/" (thus /json, /xml, /csv) to serve the API alongside other APIs on the same host +* Optimizing your round trips by enabling [TCP Fast Open](https://en.wikipedia.org/wiki/TCP_Fast_Open) on your OS and the freegeoip web server +* Setting up usage limits (quotas) for your clients (per client IP) based on requests per time interval; we support various backends such as in-memory map (for single instance), or redis or memcache for distributed deployments +* Serve the default [GeoLite2 City](http://dev.maxmind.com/geoip/geoip2/geolite2/) free database that is downloaded and updated automatically in background on a configurable schedule, or +* Serve the commercial [GeoIP2 City](https://www.maxmind.com/en/geoip2-city) database from MaxMind, either as a local file that you provide and update periodically (so the server can reload it), or configured to be downloaded periodically using your API key + +See the [Server Options](#serveroptions) section below for more information on configuring the server. + +For automation, check out the [freegeoip chef cookbook](https://supermarket.chef.io/cookbooks/freegeoip) or the (legacy) [Ansible Playbook](./cmd/freegeoip/ansible-playbook) for Ubuntu 14.04 LTS. + + + +### Server Options + +To see all the available options, use the `-help` option: + +```bash +docker run --rm -it apilayer/freegeoip -help +``` + +If you're using LetsEncrypt.org to provision your TLS certificates, you have to listen for HTTPS on port 443. Following is an example of the server listening on 3 different ports: metrics + pprof (8888), http (80), and https (443): + +```bash +docker run -p 8888:8888 -p 80:8080 -p 443:8443 -d apilayer/freegeoip \ + -internal-server=:8888 \ + -http=:8080 \ + -https=:8443 \ + -hsts=max-age=31536000 \ + -letsencrypt \ + -letsencrypt-hosts=myfancydomain.io +``` + + You can configure the freegeiop web server via command line flags or environment variables. The names of environment variables are the same for command line flags, but prefixed with FREEGEOIP, all upperscase, separated by underscores. If you want to use environment variables instead: + +```bash +$ cat prod.env +FREEGEOIP_INTERNAL_SERVER=:8888 +FREEGEOIP_HTTP=:8080 +FREEGEOIP_HTTPS=:8443 +FREEGEOIP_HSTS=max-age=31536000 +FREEGEOIP_LETSENCRYPT=true +FREEGEOIP_LETSENCRYPT_HOSTS=myfancydomain.io + +$ docker run --env-file=prod.env -p 8888:8888 -p 80:8080 -p 443:8443 -d apilayer/freegeoip +``` + +By default, HTTP/2 is enabled over HTTPS. You can disable by passing the `-http2=false` flag. + +Also, the Docker image of freegeoip does not provide the web page from freegeiop.net, it only provides the API. If you want to serve that page, you can pass the `-public=/var/www` parameter in the command line. You can also tell Docker to mount that directory as a volume on the host machine and have it serve your own page, using Docker's `-v` parameter. + +If the freegeoip web server is running behind a reverse proxy or load balancer, you have to run it passing the `-use-x-forwarded-for` parameter and provide the `X-Forwarded-For` HTTP header in all requests. This is for the freegeoip web server be able to log the client IP, and to perform geolocation lookups when an IP is not provided to the API, e.g. `/json/` (uses client IP) vs `/json/1.2.3.4`. + +## Database + +The current implementation uses the free [GeoLite2 City](http://dev.maxmind.com/geoip/geoip2/geolite2/) database from MaxMind. + +In the past we had databases from other providers, and at some point even our own database comprised of data from different sources. This means it might change in the future. + +If you have purchased the commercial database from MaxMind, you can point the freegeoip web server or (Go API, for dev) to the URL containing the file, or local file, and the server will use it. + +In case of files on disk, you can replace the file with a newer version and the freegeoip web server will reload it automatically in background. If instead of a file you use a URL (the default), we periodically check the URL in background to see if there's a new database version available, then download the reload it automatically. + +All responses from the freegeiop API contain the date that the database was downloaded in the X-Database-Date HTTP header. + +## API + +The freegeoip API is served by endpoints that encode the response in different formats. + +Example: + +```bash +curl freegeoip.net/json/ +``` + +Returns the geolocation information of your own IP address, the source IP address of the connection. + +You can pass a different IP or hostname. For example, to lookup the geolocation of `github.com` the server resolves the name first, then uses the first IP address available, which might be IPv4 or IPv6: + +```bash +curl freegeoip.net/json/github.com +``` + +Same semantics are available for the `/xml/{ip}` and `/csv/{ip}` endpoints. + +JSON responses can be encoded as JSONP, by adding the `callback` parameter: + +```bash +curl freegeoip.net/json/?callback=foobar +``` + +The callback parameter is ignored on all other endpoints. + +## Metrics and profiling + +The freegeoip web server can provide metrics about its usage, and also supports runtime profiling and tracing. + +Both are disabled by default, but can be enabled by passing the `-internal-server` parameter in the command line. Metrics are generated for [Prometheus](http://prometheus.io) and can be queried at `/metrics` even with curl. + +HTTP pprof is available at `/debug/pprof` and the examples from the [pprof](https://golang.org/pkg/net/http/pprof/) package documentation should work on the freegeiop web server. + + + +## Package freegeoip + +The freegeoip package for the Go programming language provides two APIs: + +- A database API that requires zero maintenance of the IP database; +- A geolocation `http.Handler` that can be used/served by any http server. + +tl;dr if all you want is code then see the `example_test.go` file. + +Otherwise check out the godoc reference. + +[![GoDoc](https://godoc.org/github.com/apilayer/freegeoip?status.svg)](https://godoc.org/github.com/apilayer/freegeoip) +[![Build Status](https://secure.travis-ci.org/apilayer/freegeoip.png)](http://travis-ci.org/apilayer/freegeoip) +[![GoReportCard](https://goreportcard.com/badge/github.com/apilayer/freegeoip)](https://goreportcard.com/report/github.com/apilayer/freegeoip) + +### Features + +- Zero maintenance + +The DB object alone can download an IP database file from the internet and service lookups to your program right away. It will auto-update the file in background and always magically work. + +- DevOps friendly + +If you do care about the database and have the commercial version of the MaxMind database, you can update the database file with your program running and the DB object will load it in background. You can focus on your stuff. + +- Extensible + +Besides the database part, the package provides an `http.Handler` object that you can add to your HTTP server to service IP geolocation lookups with the same simplistic API of freegeoip.net. There's also an interface for crafting your own HTTP responses encoded in any format. + +### Install + +Download the package: + + go get -d github.com/apilayer/freegeoip/... + +Install the web server: + + go install github.com/apilayer/freegeoip/cmd/freegeoip + +Test coverage is quite good, and test code may help you find the stuff you need. diff --git a/vendor/github.com/apilayer/freegeoip/app.json b/vendor/github.com/apilayer/freegeoip/app.json new file mode 100644 index 000000000000..99495bc8e6a7 --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/app.json @@ -0,0 +1,7 @@ +{ + "name": "freegeoip", + "description": "IP geolocation web server", + "website": "https://github.com/apilayer/freegeoip", + "success_url": "/", + "keywords": ["golang", "geoip", "api"] +} diff --git a/vendor/github.com/apilayer/freegeoip/db.go b/vendor/github.com/apilayer/freegeoip/db.go new file mode 100644 index 000000000000..2810a7ed5012 --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/db.go @@ -0,0 +1,453 @@ +// Copyright 2009 The freegeoip authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package freegeoip + +import ( + "compress/gzip" + "crypto/md5" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + "math" + "net" + "net/http" + "net/url" + "os" + "path/filepath" + "sync" + "time" + + "github.com/howeyc/fsnotify" + "github.com/oschwald/maxminddb-golang" +) + +var ( + // ErrUnavailable may be returned by DB.Lookup when the database + // points to a URL and is not yet available because it's being + // downloaded in background. + ErrUnavailable = errors.New("no database available") + + // Local cached copy of a database downloaded from a URL. + defaultDB = filepath.Join(os.TempDir(), "freegeoip", "db.gz") + + // MaxMindDB is the URL of the free MaxMind GeoLite2 database. + MaxMindDB = "http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz" +) + +// DB is the IP geolocation database. +type DB struct { + file string // Database file name. + checksum string // MD5 of the unzipped database file + reader *maxminddb.Reader // Actual db object. + notifyQuit chan struct{} // Stop auto-update and watch goroutines. + notifyOpen chan string // Notify when a db file is open. + notifyError chan error // Notify when an error occurs. + notifyInfo chan string // Notify random actions for logging + closed bool // Mark this db as closed. + lastUpdated time.Time // Last time the db was updated. + mu sync.RWMutex // Protects all the above. + + updateInterval time.Duration // Update interval. + maxRetryInterval time.Duration // Max retry interval in case of failure. +} + +// Open creates and initializes a DB from a local file. +// +// The database file is monitored by fsnotify and automatically +// reloads when the file is updated or overwritten. +func Open(dsn string) (*DB, error) { + db := &DB{ + file: dsn, + notifyQuit: make(chan struct{}), + notifyOpen: make(chan string, 1), + notifyError: make(chan error, 1), + notifyInfo: make(chan string, 1), + } + err := db.openFile() + if err != nil { + db.Close() + return nil, err + } + err = db.watchFile() + if err != nil { + db.Close() + return nil, fmt.Errorf("fsnotify failed for %s: %s", dsn, err) + } + return db, nil +} + +// MaxMindUpdateURL generates the URL for MaxMind paid databases. +func MaxMindUpdateURL(hostname, productID, userID, licenseKey string) (string, error) { + limiter := func(r io.Reader) *io.LimitedReader { + return &io.LimitedReader{R: r, N: 1 << 30} + } + baseurl := "https://" + hostname + "/app/" + // Get the file name for the product ID. + u := baseurl + "update_getfilename?product_id=" + productID + resp, err := http.Get(u) + if err != nil { + return "", err + } + defer resp.Body.Close() + md5hash := md5.New() + _, err = io.Copy(md5hash, limiter(resp.Body)) + if err != nil { + return "", err + } + sum := md5hash.Sum(nil) + hexdigest1 := hex.EncodeToString(sum[:]) + // Get our client IP address. + resp, err = http.Get(baseurl + "update_getipaddr") + if err != nil { + return "", err + } + defer resp.Body.Close() + md5hash = md5.New() + io.WriteString(md5hash, licenseKey) + _, err = io.Copy(md5hash, limiter(resp.Body)) + if err != nil { + return "", err + } + sum = md5hash.Sum(nil) + hexdigest2 := hex.EncodeToString(sum[:]) + // Generate the URL. + params := url.Values{ + "db_md5": {hexdigest1}, + "challenge_md5": {hexdigest2}, + "user_id": {userID}, + "edition_id": {productID}, + } + u = baseurl + "update_secure?" + params.Encode() + return u, nil +} + +// OpenURL creates and initializes a DB from a URL. +// It automatically downloads and updates the file in background, and +// keeps a local copy on $TMPDIR. +func OpenURL(url string, updateInterval, maxRetryInterval time.Duration) (*DB, error) { + db := &DB{ + file: defaultDB, + notifyQuit: make(chan struct{}), + notifyOpen: make(chan string, 1), + notifyError: make(chan error, 1), + notifyInfo: make(chan string, 1), + updateInterval: updateInterval, + maxRetryInterval: maxRetryInterval, + } + db.openFile() // Optional, might fail. + go db.autoUpdate(url) + err := db.watchFile() + if err != nil { + db.Close() + return nil, fmt.Errorf("fsnotify failed for %s: %s", db.file, err) + } + return db, nil +} + +func (db *DB) watchFile() error { + watcher, err := fsnotify.NewWatcher() + if err != nil { + return err + } + dbdir, err := db.makeDir() + if err != nil { + return err + } + go db.watchEvents(watcher) + return watcher.Watch(dbdir) +} + +func (db *DB) watchEvents(watcher *fsnotify.Watcher) { + for { + select { + case ev := <-watcher.Event: + if ev.Name == db.file && (ev.IsCreate() || ev.IsModify()) { + db.openFile() + } + case <-watcher.Error: + case <-db.notifyQuit: + watcher.Close() + return + } + time.Sleep(time.Second) // Suppress high-rate events. + } +} + +func (db *DB) openFile() error { + reader, checksum, err := db.newReader(db.file) + if err != nil { + return err + } + stat, err := os.Stat(db.file) + if err != nil { + return err + } + db.setReader(reader, stat.ModTime(), checksum) + return nil +} + +func (db *DB) newReader(dbfile string) (*maxminddb.Reader, string, error) { + f, err := os.Open(dbfile) + if err != nil { + return nil, "", err + } + defer f.Close() + gzf, err := gzip.NewReader(f) + if err != nil { + return nil, "", err + } + defer gzf.Close() + b, err := ioutil.ReadAll(gzf) + if err != nil { + return nil, "", err + } + checksum := fmt.Sprintf("%x", md5.Sum(b)) + mmdb, err := maxminddb.FromBytes(b) + return mmdb, checksum, err +} + +func (db *DB) setReader(reader *maxminddb.Reader, modtime time.Time, checksum string) { + db.mu.Lock() + defer db.mu.Unlock() + if db.closed { + reader.Close() + return + } + if db.reader != nil { + db.reader.Close() + } + db.reader = reader + db.lastUpdated = modtime.UTC() + db.checksum = checksum + select { + case db.notifyOpen <- db.file: + default: + } +} + +func (db *DB) autoUpdate(url string) { + backoff := time.Second + for { + db.sendInfo("starting update") + err := db.runUpdate(url) + if err != nil { + bs := backoff.Seconds() + ms := db.maxRetryInterval.Seconds() + backoff = time.Duration(math.Min(bs*math.E, ms)) * time.Second + db.sendError(fmt.Errorf("download failed (will retry in %s): %s", backoff, err)) + } else { + backoff = db.updateInterval + } + db.sendInfo("finished update") + select { + case <-db.notifyQuit: + return + case <-time.After(backoff): + // Sleep till time for the next update attempt. + } + } +} + +func (db *DB) runUpdate(url string) error { + yes, err := db.needUpdate(url) + if err != nil { + return err + } + if !yes { + return nil + } + tmpfile, err := db.download(url) + if err != nil { + return err + } + err = db.renameFile(tmpfile) + if err != nil { + // Cleanup the tempfile if renaming failed. + os.RemoveAll(tmpfile) + } + return err +} + +func (db *DB) needUpdate(url string) (bool, error) { + stat, err := os.Stat(db.file) + if err != nil { + return true, nil // Local db is missing, must be downloaded. + } + + resp, err := http.Head(url) + if err != nil { + return false, err + } + defer resp.Body.Close() + + // Check X-Database-MD5 if it exists + headerMd5 := resp.Header.Get("X-Database-MD5") + if len(headerMd5) > 0 && db.checksum != headerMd5 { + return true, nil + } + + if stat.Size() != resp.ContentLength { + return true, nil + } + return false, nil +} + +func (db *DB) download(url string) (tmpfile string, err error) { + resp, err := http.Get(url) + if err != nil { + return "", err + } + defer resp.Body.Close() + tmpfile = filepath.Join(os.TempDir(), + fmt.Sprintf("_freegeoip.%d.db.gz", time.Now().UnixNano())) + f, err := os.Create(tmpfile) + if err != nil { + return "", err + } + defer f.Close() + _, err = io.Copy(f, resp.Body) + if err != nil { + return "", err + } + return tmpfile, nil +} + +func (db *DB) makeDir() (dbdir string, err error) { + dbdir = filepath.Dir(db.file) + _, err = os.Stat(dbdir) + if err != nil { + err = os.MkdirAll(dbdir, 0755) + if err != nil { + return "", err + } + } + return dbdir, nil +} + +func (db *DB) renameFile(name string) error { + os.Rename(db.file, db.file+".bak") // Optional, might fail. + _, err := db.makeDir() + if err != nil { + return err + } + return os.Rename(name, db.file) +} + +// Date returns the UTC date the database file was last modified. +// If no database file has been opened the behaviour of Date is undefined. +func (db *DB) Date() time.Time { + db.mu.RLock() + defer db.mu.RUnlock() + return db.lastUpdated +} + +// NotifyClose returns a channel that is closed when the database is closed. +func (db *DB) NotifyClose() <-chan struct{} { + return db.notifyQuit +} + +// NotifyOpen returns a channel that notifies when a new database is +// loaded or reloaded. This can be used to monitor background updates +// when the DB points to a URL. +func (db *DB) NotifyOpen() (filename <-chan string) { + return db.notifyOpen +} + +// NotifyError returns a channel that notifies when an error occurs +// while downloading or reloading a DB that points to a URL. +func (db *DB) NotifyError() (errChan <-chan error) { + return db.notifyError +} + +// NotifyInfo returns a channel that notifies informational messages +// while downloading or reloading. +func (db *DB) NotifyInfo() <-chan string { + return db.notifyInfo +} + +func (db *DB) sendError(err error) { + db.mu.RLock() + defer db.mu.RUnlock() + if db.closed { + return + } + select { + case db.notifyError <- err: + default: + } +} + +func (db *DB) sendInfo(message string) { + db.mu.RLock() + defer db.mu.RUnlock() + if db.closed { + return + } + select { + case db.notifyInfo <- message: + default: + } +} + +// Lookup performs a database lookup of the given IP address, and stores +// the response into the result value. The result value must be a struct +// with specific fields and tags as described here: +// https://godoc.org/github.com/oschwald/maxminddb-golang#Reader.Lookup +// +// See the DefaultQuery for an example of the result struct. +func (db *DB) Lookup(addr net.IP, result interface{}) error { + db.mu.RLock() + defer db.mu.RUnlock() + if db.reader != nil { + return db.reader.Lookup(addr, result) + } + return ErrUnavailable +} + +// DefaultQuery is the default query used for database lookups. +type DefaultQuery struct { + Continent struct { + Names map[string]string `maxminddb:"names"` + } `maxminddb:"continent"` + Country struct { + ISOCode string `maxminddb:"iso_code"` + Names map[string]string `maxminddb:"names"` + } `maxminddb:"country"` + Region []struct { + ISOCode string `maxminddb:"iso_code"` + Names map[string]string `maxminddb:"names"` + } `maxminddb:"subdivisions"` + City struct { + Names map[string]string `maxminddb:"names"` + } `maxminddb:"city"` + Location struct { + Latitude float64 `maxminddb:"latitude"` + Longitude float64 `maxminddb:"longitude"` + MetroCode uint `maxminddb:"metro_code"` + TimeZone string `maxminddb:"time_zone"` + } `maxminddb:"location"` + Postal struct { + Code string `maxminddb:"code"` + } `maxminddb:"postal"` +} + +// Close closes the database. +func (db *DB) Close() { + db.mu.Lock() + defer db.mu.Unlock() + if !db.closed { + db.closed = true + close(db.notifyQuit) + close(db.notifyOpen) + close(db.notifyError) + close(db.notifyInfo) + } + if db.reader != nil { + db.reader.Close() + db.reader = nil + } +} diff --git a/vendor/github.com/apilayer/freegeoip/doc.go b/vendor/github.com/apilayer/freegeoip/doc.go new file mode 100644 index 000000000000..65903477df52 --- /dev/null +++ b/vendor/github.com/apilayer/freegeoip/doc.go @@ -0,0 +1,14 @@ +// Copyright 2009 The freegeoip authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Package freegeoip provides an API for searching the geolocation of IP +// addresses. It uses a database that can be either a local file or a +// remote resource from a URL. +// +// Local databases are monitored by fsnotify and reloaded when the file is +// either updated or overwritten. +// +// Remote databases are automatically downloaded and updated in background +// so you can focus on using the API and not managing the database. +package freegeoip diff --git a/vendor/github.com/apilayer/freegeoip/freegeo-warning.png b/vendor/github.com/apilayer/freegeoip/freegeo-warning.png new file mode 100644 index 000000000000..0e142cb4020b Binary files /dev/null and b/vendor/github.com/apilayer/freegeoip/freegeo-warning.png differ diff --git a/vendor/github.com/codahale/hdrhistogram/LICENSE b/vendor/github.com/codahale/hdrhistogram/LICENSE deleted file mode 100644 index f9835c241fc4..000000000000 --- a/vendor/github.com/codahale/hdrhistogram/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Coda Hale - -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. diff --git a/vendor/github.com/codahale/hdrhistogram/README.md b/vendor/github.com/codahale/hdrhistogram/README.md deleted file mode 100644 index 614b197c3dd3..000000000000 --- a/vendor/github.com/codahale/hdrhistogram/README.md +++ /dev/null @@ -1,15 +0,0 @@ -hdrhistogram -============ - -[![Build Status](https://travis-ci.org/codahale/hdrhistogram.png?branch=master)](https://travis-ci.org/codahale/hdrhistogram) - -A pure Go implementation of the [HDR Histogram](https://github.com/HdrHistogram/HdrHistogram). - -> A Histogram that supports recording and analyzing sampled data value counts -> across a configurable integer value range with configurable value precision -> within the range. Value precision is expressed as the number of significant -> digits in the value recording, and provides control over value quantization -> behavior across the value range and the subsequent value resolution at any -> given level. - -For documentation, check [godoc](http://godoc.org/github.com/codahale/hdrhistogram). diff --git a/vendor/github.com/codahale/hdrhistogram/hdr.go b/vendor/github.com/codahale/hdrhistogram/hdr.go deleted file mode 100644 index c97842926d67..000000000000 --- a/vendor/github.com/codahale/hdrhistogram/hdr.go +++ /dev/null @@ -1,564 +0,0 @@ -// Package hdrhistogram provides an implementation of Gil Tene's HDR Histogram -// data structure. The HDR Histogram allows for fast and accurate analysis of -// the extreme ranges of data with non-normal distributions, like latency. -package hdrhistogram - -import ( - "fmt" - "math" -) - -// A Bracket is a part of a cumulative distribution. -type Bracket struct { - Quantile float64 - Count, ValueAt int64 -} - -// A Snapshot is an exported view of a Histogram, useful for serializing them. -// A Histogram can be constructed from it by passing it to Import. -type Snapshot struct { - LowestTrackableValue int64 - HighestTrackableValue int64 - SignificantFigures int64 - Counts []int64 -} - -// A Histogram is a lossy data structure used to record the distribution of -// non-normally distributed data (like latency) with a high degree of accuracy -// and a bounded degree of precision. -type Histogram struct { - lowestTrackableValue int64 - highestTrackableValue int64 - unitMagnitude int64 - significantFigures int64 - subBucketHalfCountMagnitude int32 - subBucketHalfCount int32 - subBucketMask int64 - subBucketCount int32 - bucketCount int32 - countsLen int32 - totalCount int64 - counts []int64 -} - -// New returns a new Histogram instance capable of tracking values in the given -// range and with the given amount of precision. -func New(minValue, maxValue int64, sigfigs int) *Histogram { - if sigfigs < 1 || 5 < sigfigs { - panic(fmt.Errorf("sigfigs must be [1,5] (was %d)", sigfigs)) - } - - largestValueWithSingleUnitResolution := 2 * math.Pow10(sigfigs) - subBucketCountMagnitude := int32(math.Ceil(math.Log2(float64(largestValueWithSingleUnitResolution)))) - - subBucketHalfCountMagnitude := subBucketCountMagnitude - if subBucketHalfCountMagnitude < 1 { - subBucketHalfCountMagnitude = 1 - } - subBucketHalfCountMagnitude-- - - unitMagnitude := int32(math.Floor(math.Log2(float64(minValue)))) - if unitMagnitude < 0 { - unitMagnitude = 0 - } - - subBucketCount := int32(math.Pow(2, float64(subBucketHalfCountMagnitude)+1)) - - subBucketHalfCount := subBucketCount / 2 - subBucketMask := int64(subBucketCount-1) << uint(unitMagnitude) - - // determine exponent range needed to support the trackable value with no - // overflow: - smallestUntrackableValue := int64(subBucketCount) << uint(unitMagnitude) - bucketsNeeded := int32(1) - for smallestUntrackableValue < maxValue { - smallestUntrackableValue <<= 1 - bucketsNeeded++ - } - - bucketCount := bucketsNeeded - countsLen := (bucketCount + 1) * (subBucketCount / 2) - - return &Histogram{ - lowestTrackableValue: minValue, - highestTrackableValue: maxValue, - unitMagnitude: int64(unitMagnitude), - significantFigures: int64(sigfigs), - subBucketHalfCountMagnitude: subBucketHalfCountMagnitude, - subBucketHalfCount: subBucketHalfCount, - subBucketMask: subBucketMask, - subBucketCount: subBucketCount, - bucketCount: bucketCount, - countsLen: countsLen, - totalCount: 0, - counts: make([]int64, countsLen), - } -} - -// ByteSize returns an estimate of the amount of memory allocated to the -// histogram in bytes. -// -// N.B.: This does not take into account the overhead for slices, which are -// small, constant, and specific to the compiler version. -func (h *Histogram) ByteSize() int { - return 6*8 + 5*4 + len(h.counts)*8 -} - -// Merge merges the data stored in the given histogram with the receiver, -// returning the number of recorded values which had to be dropped. -func (h *Histogram) Merge(from *Histogram) (dropped int64) { - i := from.rIterator() - for i.next() { - v := i.valueFromIdx - c := i.countAtIdx - - if h.RecordValues(v, c) != nil { - dropped += c - } - } - - return -} - -// TotalCount returns total number of values recorded. -func (h *Histogram) TotalCount() int64 { - return h.totalCount -} - -// Max returns the approximate maximum recorded value. -func (h *Histogram) Max() int64 { - var max int64 - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 { - max = i.highestEquivalentValue - } - } - return h.highestEquivalentValue(max) -} - -// Min returns the approximate minimum recorded value. -func (h *Histogram) Min() int64 { - var min int64 - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 && min == 0 { - min = i.highestEquivalentValue - break - } - } - return h.lowestEquivalentValue(min) -} - -// Mean returns the approximate arithmetic mean of the recorded values. -func (h *Histogram) Mean() float64 { - if h.totalCount == 0 { - return 0 - } - var total int64 - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 { - total += i.countAtIdx * h.medianEquivalentValue(i.valueFromIdx) - } - } - return float64(total) / float64(h.totalCount) -} - -// StdDev returns the approximate standard deviation of the recorded values. -func (h *Histogram) StdDev() float64 { - if h.totalCount == 0 { - return 0 - } - - mean := h.Mean() - geometricDevTotal := 0.0 - - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 { - dev := float64(h.medianEquivalentValue(i.valueFromIdx)) - mean - geometricDevTotal += (dev * dev) * float64(i.countAtIdx) - } - } - - return math.Sqrt(geometricDevTotal / float64(h.totalCount)) -} - -// Reset deletes all recorded values and restores the histogram to its original -// state. -func (h *Histogram) Reset() { - h.totalCount = 0 - for i := range h.counts { - h.counts[i] = 0 - } -} - -// RecordValue records the given value, returning an error if the value is out -// of range. -func (h *Histogram) RecordValue(v int64) error { - return h.RecordValues(v, 1) -} - -// RecordCorrectedValue records the given value, correcting for stalls in the -// recording process. This only works for processes which are recording values -// at an expected interval (e.g., doing jitter analysis). Processes which are -// recording ad-hoc values (e.g., latency for incoming requests) can't take -// advantage of this. -func (h *Histogram) RecordCorrectedValue(v, expectedInterval int64) error { - if err := h.RecordValue(v); err != nil { - return err - } - - if expectedInterval <= 0 || v <= expectedInterval { - return nil - } - - missingValue := v - expectedInterval - for missingValue >= expectedInterval { - if err := h.RecordValue(missingValue); err != nil { - return err - } - missingValue -= expectedInterval - } - - return nil -} - -// RecordValues records n occurrences of the given value, returning an error if -// the value is out of range. -func (h *Histogram) RecordValues(v, n int64) error { - idx := h.countsIndexFor(v) - if idx < 0 || int(h.countsLen) <= idx { - return fmt.Errorf("value %d is too large to be recorded", v) - } - h.counts[idx] += n - h.totalCount += n - - return nil -} - -// ValueAtQuantile returns the recorded value at the given quantile (0..100). -func (h *Histogram) ValueAtQuantile(q float64) int64 { - if q > 100 { - q = 100 - } - - total := int64(0) - countAtPercentile := int64(((q / 100) * float64(h.totalCount)) + 0.5) - - i := h.iterator() - for i.next() { - total += i.countAtIdx - if total >= countAtPercentile { - return h.highestEquivalentValue(i.valueFromIdx) - } - } - - return 0 -} - -// CumulativeDistribution returns an ordered list of brackets of the -// distribution of recorded values. -func (h *Histogram) CumulativeDistribution() []Bracket { - var result []Bracket - - i := h.pIterator(1) - for i.next() { - result = append(result, Bracket{ - Quantile: i.percentile, - Count: i.countToIdx, - ValueAt: i.highestEquivalentValue, - }) - } - - return result -} - -// SignificantFigures returns the significant figures used to create the -// histogram -func (h *Histogram) SignificantFigures() int64 { - return h.significantFigures -} - -// LowestTrackableValue returns the lower bound on values that will be added -// to the histogram -func (h *Histogram) LowestTrackableValue() int64 { - return h.lowestTrackableValue -} - -// HighestTrackableValue returns the upper bound on values that will be added -// to the histogram -func (h *Histogram) HighestTrackableValue() int64 { - return h.highestTrackableValue -} - -// Histogram bar for plotting -type Bar struct { - From, To, Count int64 -} - -// Pretty print as csv for easy plotting -func (b Bar) String() string { - return fmt.Sprintf("%v, %v, %v\n", b.From, b.To, b.Count) -} - -// Distribution returns an ordered list of bars of the -// distribution of recorded values, counts can be normalized to a probability -func (h *Histogram) Distribution() (result []Bar) { - i := h.iterator() - for i.next() { - result = append(result, Bar{ - Count: i.countAtIdx, - From: h.lowestEquivalentValue(i.valueFromIdx), - To: i.highestEquivalentValue, - }) - } - - return result -} - -// Equals returns true if the two Histograms are equivalent, false if not. -func (h *Histogram) Equals(other *Histogram) bool { - switch { - case - h.lowestTrackableValue != other.lowestTrackableValue, - h.highestTrackableValue != other.highestTrackableValue, - h.unitMagnitude != other.unitMagnitude, - h.significantFigures != other.significantFigures, - h.subBucketHalfCountMagnitude != other.subBucketHalfCountMagnitude, - h.subBucketHalfCount != other.subBucketHalfCount, - h.subBucketMask != other.subBucketMask, - h.subBucketCount != other.subBucketCount, - h.bucketCount != other.bucketCount, - h.countsLen != other.countsLen, - h.totalCount != other.totalCount: - return false - default: - for i, c := range h.counts { - if c != other.counts[i] { - return false - } - } - } - return true -} - -// Export returns a snapshot view of the Histogram. This can be later passed to -// Import to construct a new Histogram with the same state. -func (h *Histogram) Export() *Snapshot { - return &Snapshot{ - LowestTrackableValue: h.lowestTrackableValue, - HighestTrackableValue: h.highestTrackableValue, - SignificantFigures: h.significantFigures, - Counts: append([]int64(nil), h.counts...), // copy - } -} - -// Import returns a new Histogram populated from the Snapshot data (which the -// caller must stop accessing). -func Import(s *Snapshot) *Histogram { - h := New(s.LowestTrackableValue, s.HighestTrackableValue, int(s.SignificantFigures)) - h.counts = s.Counts - totalCount := int64(0) - for i := int32(0); i < h.countsLen; i++ { - countAtIndex := h.counts[i] - if countAtIndex > 0 { - totalCount += countAtIndex - } - } - h.totalCount = totalCount - return h -} - -func (h *Histogram) iterator() *iterator { - return &iterator{ - h: h, - subBucketIdx: -1, - } -} - -func (h *Histogram) rIterator() *rIterator { - return &rIterator{ - iterator: iterator{ - h: h, - subBucketIdx: -1, - }, - } -} - -func (h *Histogram) pIterator(ticksPerHalfDistance int32) *pIterator { - return &pIterator{ - iterator: iterator{ - h: h, - subBucketIdx: -1, - }, - ticksPerHalfDistance: ticksPerHalfDistance, - } -} - -func (h *Histogram) sizeOfEquivalentValueRange(v int64) int64 { - bucketIdx := h.getBucketIndex(v) - subBucketIdx := h.getSubBucketIdx(v, bucketIdx) - adjustedBucket := bucketIdx - if subBucketIdx >= h.subBucketCount { - adjustedBucket++ - } - return int64(1) << uint(h.unitMagnitude+int64(adjustedBucket)) -} - -func (h *Histogram) valueFromIndex(bucketIdx, subBucketIdx int32) int64 { - return int64(subBucketIdx) << uint(int64(bucketIdx)+h.unitMagnitude) -} - -func (h *Histogram) lowestEquivalentValue(v int64) int64 { - bucketIdx := h.getBucketIndex(v) - subBucketIdx := h.getSubBucketIdx(v, bucketIdx) - return h.valueFromIndex(bucketIdx, subBucketIdx) -} - -func (h *Histogram) nextNonEquivalentValue(v int64) int64 { - return h.lowestEquivalentValue(v) + h.sizeOfEquivalentValueRange(v) -} - -func (h *Histogram) highestEquivalentValue(v int64) int64 { - return h.nextNonEquivalentValue(v) - 1 -} - -func (h *Histogram) medianEquivalentValue(v int64) int64 { - return h.lowestEquivalentValue(v) + (h.sizeOfEquivalentValueRange(v) >> 1) -} - -func (h *Histogram) getCountAtIndex(bucketIdx, subBucketIdx int32) int64 { - return h.counts[h.countsIndex(bucketIdx, subBucketIdx)] -} - -func (h *Histogram) countsIndex(bucketIdx, subBucketIdx int32) int32 { - bucketBaseIdx := (bucketIdx + 1) << uint(h.subBucketHalfCountMagnitude) - offsetInBucket := subBucketIdx - h.subBucketHalfCount - return bucketBaseIdx + offsetInBucket -} - -func (h *Histogram) getBucketIndex(v int64) int32 { - pow2Ceiling := bitLen(v | h.subBucketMask) - return int32(pow2Ceiling - int64(h.unitMagnitude) - - int64(h.subBucketHalfCountMagnitude+1)) -} - -func (h *Histogram) getSubBucketIdx(v int64, idx int32) int32 { - return int32(v >> uint(int64(idx)+int64(h.unitMagnitude))) -} - -func (h *Histogram) countsIndexFor(v int64) int { - bucketIdx := h.getBucketIndex(v) - subBucketIdx := h.getSubBucketIdx(v, bucketIdx) - return int(h.countsIndex(bucketIdx, subBucketIdx)) -} - -type iterator struct { - h *Histogram - bucketIdx, subBucketIdx int32 - countAtIdx, countToIdx, valueFromIdx int64 - highestEquivalentValue int64 -} - -func (i *iterator) next() bool { - if i.countToIdx >= i.h.totalCount { - return false - } - - // increment bucket - i.subBucketIdx++ - if i.subBucketIdx >= i.h.subBucketCount { - i.subBucketIdx = i.h.subBucketHalfCount - i.bucketIdx++ - } - - if i.bucketIdx >= i.h.bucketCount { - return false - } - - i.countAtIdx = i.h.getCountAtIndex(i.bucketIdx, i.subBucketIdx) - i.countToIdx += i.countAtIdx - i.valueFromIdx = i.h.valueFromIndex(i.bucketIdx, i.subBucketIdx) - i.highestEquivalentValue = i.h.highestEquivalentValue(i.valueFromIdx) - - return true -} - -type rIterator struct { - iterator - countAddedThisStep int64 -} - -func (r *rIterator) next() bool { - for r.iterator.next() { - if r.countAtIdx != 0 { - r.countAddedThisStep = r.countAtIdx - return true - } - } - return false -} - -type pIterator struct { - iterator - seenLastValue bool - ticksPerHalfDistance int32 - percentileToIteratorTo float64 - percentile float64 -} - -func (p *pIterator) next() bool { - if !(p.countToIdx < p.h.totalCount) { - if p.seenLastValue { - return false - } - - p.seenLastValue = true - p.percentile = 100 - - return true - } - - if p.subBucketIdx == -1 && !p.iterator.next() { - return false - } - - var done = false - for !done { - currentPercentile := (100.0 * float64(p.countToIdx)) / float64(p.h.totalCount) - if p.countAtIdx != 0 && p.percentileToIteratorTo <= currentPercentile { - p.percentile = p.percentileToIteratorTo - halfDistance := math.Trunc(math.Pow(2, math.Trunc(math.Log2(100.0/(100.0-p.percentileToIteratorTo)))+1)) - percentileReportingTicks := float64(p.ticksPerHalfDistance) * halfDistance - p.percentileToIteratorTo += 100.0 / percentileReportingTicks - return true - } - done = !p.iterator.next() - } - - return true -} - -func bitLen(x int64) (n int64) { - for ; x >= 0x8000; x >>= 16 { - n += 16 - } - if x >= 0x80 { - x >>= 8 - n += 8 - } - if x >= 0x8 { - x >>= 4 - n += 4 - } - if x >= 0x2 { - x >>= 2 - n += 2 - } - if x >= 0x1 { - n++ - } - return -} diff --git a/vendor/github.com/codahale/hdrhistogram/window.go b/vendor/github.com/codahale/hdrhistogram/window.go deleted file mode 100644 index dc43612a4b60..000000000000 --- a/vendor/github.com/codahale/hdrhistogram/window.go +++ /dev/null @@ -1,45 +0,0 @@ -package hdrhistogram - -// A WindowedHistogram combines histograms to provide windowed statistics. -type WindowedHistogram struct { - idx int - h []Histogram - m *Histogram - - Current *Histogram -} - -// NewWindowed creates a new WindowedHistogram with N underlying histograms with -// the given parameters. -func NewWindowed(n int, minValue, maxValue int64, sigfigs int) *WindowedHistogram { - w := WindowedHistogram{ - idx: -1, - h: make([]Histogram, n), - m: New(minValue, maxValue, sigfigs), - } - - for i := range w.h { - w.h[i] = *New(minValue, maxValue, sigfigs) - } - w.Rotate() - - return &w -} - -// Merge returns a histogram which includes the recorded values from all the -// sections of the window. -func (w *WindowedHistogram) Merge() *Histogram { - w.m.Reset() - for _, h := range w.h { - w.m.Merge(&h) - } - return w.m -} - -// Rotate resets the oldest histogram and rotates it to be used as the current -// histogram. -func (w *WindowedHistogram) Rotate() { - w.idx++ - w.Current = &w.h[w.idx%len(w.h)] - w.Current.Reset() -} diff --git a/vendor/github.com/dgrijalva/jwt-go/LICENSE b/vendor/github.com/dgrijalva/jwt-go/LICENSE deleted file mode 100644 index df83a9c2f019..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) 2012 Dave Grijalva - -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. - diff --git a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md b/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md deleted file mode 100644 index 7fc1f793cbc4..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md +++ /dev/null @@ -1,97 +0,0 @@ -## Migration Guide from v2 -> v3 - -Version 3 adds several new, frequently requested features. To do so, it introduces a few breaking changes. We've worked to keep these as minimal as possible. This guide explains the breaking changes and how you can quickly update your code. - -### `Token.Claims` is now an interface type - -The most requested feature from the 2.0 verison of this library was the ability to provide a custom type to the JSON parser for claims. This was implemented by introducing a new interface, `Claims`, to replace `map[string]interface{}`. We also included two concrete implementations of `Claims`: `MapClaims` and `StandardClaims`. - -`MapClaims` is an alias for `map[string]interface{}` with built in validation behavior. It is the default claims type when using `Parse`. The usage is unchanged except you must type cast the claims property. - -The old example for parsing a token looked like this.. - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is now directly mapped to... - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -`StandardClaims` is designed to be embedded in your custom type. You can supply a custom claims type with the new `ParseWithClaims` function. Here's an example of using a custom claims type. - -```go - type MyCustomClaims struct { - User string - *StandardClaims - } - - if token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, keyLookupFunc); err == nil { - claims := token.Claims.(*MyCustomClaims) - fmt.Printf("Token for user %v expires %v", claims.User, claims.StandardClaims.ExpiresAt) - } -``` - -### `ParseFromRequest` has been moved - -To keep this library focused on the tokens without becoming overburdened with complex request processing logic, `ParseFromRequest` and its new companion `ParseFromRequestWithClaims` have been moved to a subpackage, `request`. The method signatues have also been augmented to receive a new argument: `Extractor`. - -`Extractors` do the work of picking the token string out of a request. The interface is simple and composable. - -This simple parsing example: - -```go - if token, err := jwt.ParseFromRequest(tokenString, req, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is directly mapped to: - -```go - if token, err := request.ParseFromRequest(req, request.OAuth2Extractor, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -There are several concrete `Extractor` types provided for your convenience: - -* `HeaderExtractor` will search a list of headers until one contains content. -* `ArgumentExtractor` will search a list of keys in request query and form arguments until one contains content. -* `MultiExtractor` will try a list of `Extractors` in order until one returns content. -* `AuthorizationHeaderExtractor` will look in the `Authorization` header for a `Bearer` token. -* `OAuth2Extractor` searches the places an OAuth2 token would be specified (per the spec): `Authorization` header and `access_token` argument -* `PostExtractionFilter` wraps an `Extractor`, allowing you to process the content before it's parsed. A simple example is stripping the `Bearer ` text from a header - - -### RSA signing methods no longer accept `[]byte` keys - -Due to a [critical vulnerability](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/), we've decided the convenience of accepting `[]byte` instead of `rsa.PublicKey` or `rsa.PrivateKey` isn't worth the risk of misuse. - -To replace this behavior, we've added two helper methods: `ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error)` and `ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error)`. These are just simple helpers for unpacking PEM encoded PKCS1 and PKCS8 keys. If your keys are encoded any other way, all you need to do is convert them to the `crypto/rsa` package's types. - -```go - func keyLookupFunc(*Token) (interface{}, error) { - // Don't forget to validate the alg is what you expect: - if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { - return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) - } - - // Look up key - key, err := lookupPublicKey(token.Header["kid"]) - if err != nil { - return nil, err - } - - // Unpack key from PEM encoded PKCS8 - return jwt.ParseRSAPublicKeyFromPEM(key) - } -``` diff --git a/vendor/github.com/dgrijalva/jwt-go/README.md b/vendor/github.com/dgrijalva/jwt-go/README.md deleted file mode 100644 index f48365fafbfd..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/README.md +++ /dev/null @@ -1,85 +0,0 @@ -A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html) - -[![Build Status](https://travis-ci.org/dgrijalva/jwt-go.svg?branch=master)](https://travis-ci.org/dgrijalva/jwt-go) - -**BREAKING CHANGES:*** Version 3.0.0 is here. It includes _a lot_ of changes including a few that break the API. We've tried to break as few things as possible, so there should just be a few type signature changes. A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code. - -**NOTICE:** A vulnerability in JWT was [recently published](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). As this library doesn't force users to validate the `alg` is what they expected, it's possible your usage is effected. There will be an update soon to remedy this, and it will likey require backwards-incompatible changes to the API. In the short term, please make sure your implementation verifies the `alg` is what you expect. - - -## What the heck is a JWT? - -JWT.io has [a great introduction](https://jwt.io/introduction) to JSON Web Tokens. - -In short, it's a signed JSON object that does something useful (for example, authentication). It's commonly used for `Bearer` tokens in Oauth 2. A token is made of three parts, separated by `.`'s. The first two parts are JSON objects, that have been [base64url](http://tools.ietf.org/html/rfc4648) encoded. The last part is the signature, encoded the same way. - -The first part is called the header. It contains the necessary information for verifying the last part, the signature. For example, which encryption method was used for signing and what key was used. - -The part in the middle is the interesting bit. It's called the Claims and contains the actual stuff you care about. Refer to [the RFC](http://self-issued.info/docs/draft-jones-json-web-token.html) for information about reserved keys and the proper way to add your own. - -## What's in the box? - -This library supports the parsing and verification as well as the generation and signing of JWTs. Current supported signing algorithms are HMAC SHA, RSA, RSA-PSS, and ECDSA, though hooks are present for adding your own. - -## Examples - -See [the project documentation](https://godoc.org/github.com/dgrijalva/jwt-go) for examples of usage: - -* [Simple example of parsing and validating a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-Parse--Hmac) -* [Simple example of building and signing a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-New--Hmac) -* [Directory of Examples](https://godoc.org/github.com/dgrijalva/jwt-go#pkg-examples) - -## Extensions - -This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. - -Here's an example of an extension that integrates with the Google App Engine signing tools: https://github.com/someone1/gcp-jwt-go - -## Compliance - -This library was last reviewed to comply with [RTF 7519](http://www.rfc-editor.org/info/rfc7519) dated May 2015 with a few notable differences: - -* In order to protect against accidental use of [Unsecured JWTs](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#UnsecuredJWT), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key. - -## Project Status & Versioning - -This library is considered production ready. Feedback and feature requests are appreciated. The API should be considered stable. There should be very few backwards-incompatible changes outside of major version updates (and only with good reason). - -This project uses [Semantic Versioning 2.0.0](http://semver.org). Accepted pull requests will land on `master`. Periodically, versions will be tagged from `master`. You can find all the releases on [the project releases page](https://github.com/dgrijalva/jwt-go/releases). - -While we try to make it obvious when we make breaking changes, there isn't a great mechanism for pushing announcements out to users. You may want to use this alternative package include: `gopkg.in/dgrijalva/jwt-go.v2`. It will do the right thing WRT semantic versioning. - -## Usage Tips - -### Signing vs Encryption - -A token is simply a JSON object that is signed by its author. this tells you exactly two things about the data: - -* The author of the token was in the possession of the signing secret -* The data has not been modified since it was signed - -It's important to know that JWT does not provide encryption, which means anyone who has access to the token can read its contents. If you need to protect (encrypt) the data, there is a companion spec, `JWE`, that provides this functionality. JWE is currently outside the scope of this library. - -### Choosing a Signing Method - -There are several signing methods available, and you should probably take the time to learn about the various options before choosing one. The principal design decision is most likely going to be symmetric vs asymmetric. - -Symmetric signing methods, such as HSA, use only a single secret. This is probably the simplest signing method to use since any `[]byte` can be used as a valid secret. They are also slightly computationally faster to use, though this rarely is enough to matter. Symmetric signing methods work the best when both producers and consumers of tokens are trusted, or even the same system. Since the same secret is used to both sign and validate tokens, you can't easily distribute the key for validation. - -Asymmetric signing methods, such as RSA, use different keys for signing and verifying tokens. This makes it possible to produce tokens with a private key, and allow any consumer to access the public key for verification. - -### JWT and OAuth - -It's worth mentioning that OAuth and JWT are not the same thing. A JWT token is simply a signed JSON object. It can be used anywhere such a thing is useful. There is some confusion, though, as JWT is the most common type of bearer token used in OAuth2 authentication. - -Without going too far down the rabbit hole, here's a description of the interaction of these technologies: - -* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to. For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth. -* OAuth defines several options for passing around authentication data. One popular method is called a "bearer token". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token. -* Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL. - -## More - -Documentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go). - -The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in to documentation. diff --git a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md b/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md deleted file mode 100644 index b605b4509309..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md +++ /dev/null @@ -1,105 +0,0 @@ -## `jwt-go` Version History - -#### 3.0.0 - -* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code - * Dropped support for `[]byte` keys when using RSA signing methods. This convenience feature could contribute to security vulnerabilities involving mismatched key types with signing methods. - * `ParseFromRequest` has been moved to `request` subpackage and usage has changed - * The `Claims` property on `Token` is now type `Claims` instead of `map[string]interface{}`. The default value is type `MapClaims`, which is an alias to `map[string]interface{}`. This makes it possible to use a custom type when decoding claims. -* Other Additions and Changes - * Added `Claims` interface type to allow users to decode the claims into a custom type - * Added `ParseWithClaims`, which takes a third argument of type `Claims`. Use this function instead of `Parse` if you have a custom type you'd like to decode into. - * Dramatically improved the functionality and flexibility of `ParseFromRequest`, which is now in the `request` subpackage - * Added `ParseFromRequestWithClaims` which is the `FromRequest` equivalent of `ParseWithClaims` - * Added new interface type `Extractor`, which is used for extracting JWT strings from http requests. Used with `ParseFromRequest` and `ParseFromRequestWithClaims`. - * Added several new, more specific, validation errors to error type bitmask - * Moved examples from README to executable example files - * Signing method registry is now thread safe - * Added new property to `ValidationError`, which contains the raw error returned by calls made by parse/verify (such as those returned by keyfunc or json parser) - -#### 2.7.0 - -This will likely be the last backwards compatible release before 3.0.0, excluding essential bug fixes. - -* Added new option `-show` to the `jwt` command that will just output the decoded token without verifying -* Error text for expired tokens includes how long it's been expired -* Fixed incorrect error returned from `ParseRSAPublicKeyFromPEM` -* Documentation updates - -#### 2.6.0 - -* Exposed inner error within ValidationError -* Fixed validation errors when using UseJSONNumber flag -* Added several unit tests - -#### 2.5.0 - -* Added support for signing method none. You shouldn't use this. The API tries to make this clear. -* Updated/fixed some documentation -* Added more helpful error message when trying to parse tokens that begin with `BEARER ` - -#### 2.4.0 - -* Added new type, Parser, to allow for configuration of various parsing parameters - * You can now specify a list of valid signing methods. Anything outside this set will be rejected. - * You can now opt to use the `json.Number` type instead of `float64` when parsing token JSON -* Added support for [Travis CI](https://travis-ci.org/dgrijalva/jwt-go) -* Fixed some bugs with ECDSA parsing - -#### 2.3.0 - -* Added support for ECDSA signing methods -* Added support for RSA PSS signing methods (requires go v1.4) - -#### 2.2.0 - -* Gracefully handle a `nil` `Keyfunc` being passed to `Parse`. Result will now be the parsed token and an error, instead of a panic. - -#### 2.1.0 - -Backwards compatible API change that was missed in 2.0.0. - -* The `SignedString` method on `Token` now takes `interface{}` instead of `[]byte` - -#### 2.0.0 - -There were two major reasons for breaking backwards compatibility with this update. The first was a refactor required to expand the width of the RSA and HMAC-SHA signing implementations. There will likely be no required code changes to support this change. - -The second update, while unfortunately requiring a small change in integration, is required to open up this library to other signing methods. Not all keys used for all signing methods have a single standard on-disk representation. Requiring `[]byte` as the type for all keys proved too limiting. Additionally, this implementation allows for pre-parsed tokens to be reused, which might matter in an application that parses a high volume of tokens with a small set of keys. Backwards compatibilty has been maintained for passing `[]byte` to the RSA signing methods, but they will also accept `*rsa.PublicKey` and `*rsa.PrivateKey`. - -It is likely the only integration change required here will be to change `func(t *jwt.Token) ([]byte, error)` to `func(t *jwt.Token) (interface{}, error)` when calling `Parse`. - -* **Compatibility Breaking Changes** - * `SigningMethodHS256` is now `*SigningMethodHMAC` instead of `type struct` - * `SigningMethodRS256` is now `*SigningMethodRSA` instead of `type struct` - * `KeyFunc` now returns `interface{}` instead of `[]byte` - * `SigningMethod.Sign` now takes `interface{}` instead of `[]byte` for the key - * `SigningMethod.Verify` now takes `interface{}` instead of `[]byte` for the key -* Renamed type `SigningMethodHS256` to `SigningMethodHMAC`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodHS256` - * Added public package global `SigningMethodHS384` - * Added public package global `SigningMethodHS512` -* Renamed type `SigningMethodRS256` to `SigningMethodRSA`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodRS256` - * Added public package global `SigningMethodRS384` - * Added public package global `SigningMethodRS512` -* Moved sample private key for HMAC tests from an inline value to a file on disk. Value is unchanged. -* Refactored the RSA implementation to be easier to read -* Exposed helper methods `ParseRSAPrivateKeyFromPEM` and `ParseRSAPublicKeyFromPEM` - -#### 1.0.2 - -* Fixed bug in parsing public keys from certificates -* Added more tests around the parsing of keys for RS256 -* Code refactoring in RS256 implementation. No functional changes - -#### 1.0.1 - -* Fixed panic if RS256 signing method was passed an invalid key - -#### 1.0.0 - -* First versioned release -* API stabilized -* Supports creating, signing, parsing, and validating JWT tokens -* Supports RS256 and HS256 signing methods \ No newline at end of file diff --git a/vendor/github.com/dgrijalva/jwt-go/claims.go b/vendor/github.com/dgrijalva/jwt-go/claims.go deleted file mode 100644 index f0228f02e033..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/claims.go +++ /dev/null @@ -1,134 +0,0 @@ -package jwt - -import ( - "crypto/subtle" - "fmt" - "time" -) - -// For a type to be a Claims object, it must just have a Valid method that determines -// if the token is invalid for any supported reason -type Claims interface { - Valid() error -} - -// Structured version of Claims Section, as referenced at -// https://tools.ietf.org/html/rfc7519#section-4.1 -// See examples for how to use this with your own claim types -type StandardClaims struct { - Audience string `json:"aud,omitempty"` - ExpiresAt int64 `json:"exp,omitempty"` - Id string `json:"jti,omitempty"` - IssuedAt int64 `json:"iat,omitempty"` - Issuer string `json:"iss,omitempty"` - NotBefore int64 `json:"nbf,omitempty"` - Subject string `json:"sub,omitempty"` -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (c StandardClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - // The claims below are optional, by default, so if they are set to the - // default value in Go, let's not fail the verification for them. - if c.VerifyExpiresAt(now, false) == false { - delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0)) - vErr.Inner = fmt.Errorf("token is expired by %v", delta) - vErr.Errors |= ValidationErrorExpired - } - - if c.VerifyIssuedAt(now, false) == false { - vErr.Inner = fmt.Errorf("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if c.VerifyNotBefore(now, false) == false { - vErr.Inner = fmt.Errorf("token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool { - return verifyAud(c.Audience, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool { - return verifyExp(c.ExpiresAt, cmp, req) -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool { - return verifyIat(c.IssuedAt, cmp, req) -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool { - return verifyIss(c.Issuer, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool { - return verifyNbf(c.NotBefore, cmp, req) -} - -// ----- helpers - -func verifyAud(aud string, cmp string, required bool) bool { - if aud == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(aud), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyExp(exp int64, now int64, required bool) bool { - if exp == 0 { - return !required - } - return now <= exp -} - -func verifyIat(iat int64, now int64, required bool) bool { - if iat == 0 { - return !required - } - return now >= iat -} - -func verifyIss(iss string, cmp string, required bool) bool { - if iss == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(iss), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyNbf(nbf int64, now int64, required bool) bool { - if nbf == 0 { - return !required - } - return now >= nbf -} diff --git a/vendor/github.com/dgrijalva/jwt-go/doc.go b/vendor/github.com/dgrijalva/jwt-go/doc.go deleted file mode 100644 index a86dc1a3b348..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html -// -// See README.md for more info. -package jwt diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa.go deleted file mode 100644 index 2f59a2223638..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go +++ /dev/null @@ -1,147 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/ecdsa" - "crypto/rand" - "errors" - "math/big" -) - -var ( - // Sadly this is missing from crypto/ecdsa compared to crypto/rsa - ErrECDSAVerification = errors.New("crypto/ecdsa: verification error") -) - -// Implements the ECDSA family of signing methods signing methods -type SigningMethodECDSA struct { - Name string - Hash crypto.Hash - KeySize int - CurveBits int -} - -// Specific instances for EC256 and company -var ( - SigningMethodES256 *SigningMethodECDSA - SigningMethodES384 *SigningMethodECDSA - SigningMethodES512 *SigningMethodECDSA -) - -func init() { - // ES256 - SigningMethodES256 = &SigningMethodECDSA{"ES256", crypto.SHA256, 32, 256} - RegisterSigningMethod(SigningMethodES256.Alg(), func() SigningMethod { - return SigningMethodES256 - }) - - // ES384 - SigningMethodES384 = &SigningMethodECDSA{"ES384", crypto.SHA384, 48, 384} - RegisterSigningMethod(SigningMethodES384.Alg(), func() SigningMethod { - return SigningMethodES384 - }) - - // ES512 - SigningMethodES512 = &SigningMethodECDSA{"ES512", crypto.SHA512, 66, 521} - RegisterSigningMethod(SigningMethodES512.Alg(), func() SigningMethod { - return SigningMethodES512 - }) -} - -func (m *SigningMethodECDSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an ecdsa.PublicKey struct -func (m *SigningMethodECDSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - // Get the key - var ecdsaKey *ecdsa.PublicKey - switch k := key.(type) { - case *ecdsa.PublicKey: - ecdsaKey = k - default: - return ErrInvalidKeyType - } - - if len(sig) != 2*m.KeySize { - return ErrECDSAVerification - } - - r := big.NewInt(0).SetBytes(sig[:m.KeySize]) - s := big.NewInt(0).SetBytes(sig[m.KeySize:]) - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - if verifystatus := ecdsa.Verify(ecdsaKey, hasher.Sum(nil), r, s); verifystatus == true { - return nil - } else { - return ErrECDSAVerification - } -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an ecdsa.PrivateKey struct -func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) { - // Get the key - var ecdsaKey *ecdsa.PrivateKey - switch k := key.(type) { - case *ecdsa.PrivateKey: - ecdsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return r, s - if r, s, err := ecdsa.Sign(rand.Reader, ecdsaKey, hasher.Sum(nil)); err == nil { - curveBits := ecdsaKey.Curve.Params().BitSize - - if m.CurveBits != curveBits { - return "", ErrInvalidKey - } - - keyBytes := curveBits / 8 - if curveBits%8 > 0 { - keyBytes += 1 - } - - // We serialize the outpus (r and s) into big-endian byte arrays and pad - // them with zeros on the left to make sure the sizes work out. Both arrays - // must be keyBytes long, and the output must be 2*keyBytes long. - rBytes := r.Bytes() - rBytesPadded := make([]byte, keyBytes) - copy(rBytesPadded[keyBytes-len(rBytes):], rBytes) - - sBytes := s.Bytes() - sBytesPadded := make([]byte, keyBytes) - copy(sBytesPadded[keyBytes-len(sBytes):], sBytes) - - out := append(rBytesPadded, sBytesPadded...) - - return EncodeSegment(out), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go deleted file mode 100644 index d19624b7264f..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go +++ /dev/null @@ -1,67 +0,0 @@ -package jwt - -import ( - "crypto/ecdsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrNotECPublicKey = errors.New("Key is not a valid ECDSA public key") - ErrNotECPrivateKey = errors.New("Key is not a valid ECDSA private key") -) - -// Parse PEM encoded Elliptic Curve Private Key Structure -func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParseECPrivateKey(block.Bytes); err != nil { - return nil, err - } - - var pkey *ecdsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PrivateKey); !ok { - return nil, ErrNotECPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *ecdsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PublicKey); !ok { - return nil, ErrNotECPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/errors.go b/vendor/github.com/dgrijalva/jwt-go/errors.go deleted file mode 100644 index 1c93024aad2e..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/errors.go +++ /dev/null @@ -1,59 +0,0 @@ -package jwt - -import ( - "errors" -) - -// Error constants -var ( - ErrInvalidKey = errors.New("key is invalid") - ErrInvalidKeyType = errors.New("key is of invalid type") - ErrHashUnavailable = errors.New("the requested hash function is unavailable") -) - -// The errors that might occur when parsing and validating a token -const ( - ValidationErrorMalformed uint32 = 1 << iota // Token is malformed - ValidationErrorUnverifiable // Token could not be verified because of signing problems - ValidationErrorSignatureInvalid // Signature validation failed - - // Standard Claim validation errors - ValidationErrorAudience // AUD validation failed - ValidationErrorExpired // EXP validation failed - ValidationErrorIssuedAt // IAT validation failed - ValidationErrorIssuer // ISS validation failed - ValidationErrorNotValidYet // NBF validation failed - ValidationErrorId // JTI validation failed - ValidationErrorClaimsInvalid // Generic claims validation error -) - -// Helper for constructing a ValidationError with a string error message -func NewValidationError(errorText string, errorFlags uint32) *ValidationError { - return &ValidationError{ - text: errorText, - Errors: errorFlags, - } -} - -// The error from Parse if token is not valid -type ValidationError struct { - Inner error // stores the error returned by external dependencies, i.e.: KeyFunc - Errors uint32 // bitfield. see ValidationError... constants - text string // errors that do not have a valid error just have text -} - -// Validation error is an error type -func (e ValidationError) Error() string { - if e.Inner != nil { - return e.Inner.Error() - } else if e.text != "" { - return e.text - } else { - return "token is invalid" - } -} - -// No errors -func (e *ValidationError) valid() bool { - return e.Errors == 0 -} diff --git a/vendor/github.com/dgrijalva/jwt-go/hmac.go b/vendor/github.com/dgrijalva/jwt-go/hmac.go deleted file mode 100644 index c22991925455..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/hmac.go +++ /dev/null @@ -1,94 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/hmac" - "errors" -) - -// Implements the HMAC-SHA family of signing methods signing methods -type SigningMethodHMAC struct { - Name string - Hash crypto.Hash -} - -// Specific instances for HS256 and company -var ( - SigningMethodHS256 *SigningMethodHMAC - SigningMethodHS384 *SigningMethodHMAC - SigningMethodHS512 *SigningMethodHMAC - ErrSignatureInvalid = errors.New("signature is invalid") -) - -func init() { - // HS256 - SigningMethodHS256 = &SigningMethodHMAC{"HS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodHS256.Alg(), func() SigningMethod { - return SigningMethodHS256 - }) - - // HS384 - SigningMethodHS384 = &SigningMethodHMAC{"HS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodHS384.Alg(), func() SigningMethod { - return SigningMethodHS384 - }) - - // HS512 - SigningMethodHS512 = &SigningMethodHMAC{"HS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodHS512.Alg(), func() SigningMethod { - return SigningMethodHS512 - }) -} - -func (m *SigningMethodHMAC) Alg() string { - return m.Name -} - -// Verify the signature of HSXXX tokens. Returns nil if the signature is valid. -func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error { - // Verify the key is the right type - keyBytes, ok := key.([]byte) - if !ok { - return ErrInvalidKeyType - } - - // Decode signature, for comparison - sig, err := DecodeSegment(signature) - if err != nil { - return err - } - - // Can we use the specified hashing method? - if !m.Hash.Available() { - return ErrHashUnavailable - } - - // This signing method is symmetric, so we validate the signature - // by reproducing the signature from the signing string and key, then - // comparing that against the provided signature. - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - if !hmac.Equal(sig, hasher.Sum(nil)) { - return ErrSignatureInvalid - } - - // No validation errors. Signature is good. - return nil -} - -// Implements the Sign method from SigningMethod for this signing method. -// Key must be []byte -func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) { - if keyBytes, ok := key.([]byte); ok { - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - - return EncodeSegment(hasher.Sum(nil)), nil - } - - return "", ErrInvalidKey -} diff --git a/vendor/github.com/dgrijalva/jwt-go/map_claims.go b/vendor/github.com/dgrijalva/jwt-go/map_claims.go deleted file mode 100644 index 291213c460d4..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/map_claims.go +++ /dev/null @@ -1,94 +0,0 @@ -package jwt - -import ( - "encoding/json" - "errors" - // "fmt" -) - -// Claims type that uses the map[string]interface{} for JSON decoding -// This is the default claims type if you don't supply one -type MapClaims map[string]interface{} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyAudience(cmp string, req bool) bool { - aud, _ := m["aud"].(string) - return verifyAud(aud, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool { - switch exp := m["exp"].(type) { - case float64: - return verifyExp(int64(exp), cmp, req) - case json.Number: - v, _ := exp.Int64() - return verifyExp(v, cmp, req) - } - return req == false -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool { - switch iat := m["iat"].(type) { - case float64: - return verifyIat(int64(iat), cmp, req) - case json.Number: - v, _ := iat.Int64() - return verifyIat(v, cmp, req) - } - return req == false -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuer(cmp string, req bool) bool { - iss, _ := m["iss"].(string) - return verifyIss(iss, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool { - switch nbf := m["nbf"].(type) { - case float64: - return verifyNbf(int64(nbf), cmp, req) - case json.Number: - v, _ := nbf.Int64() - return verifyNbf(v, cmp, req) - } - return req == false -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (m MapClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - if m.VerifyExpiresAt(now, false) == false { - vErr.Inner = errors.New("Token is expired") - vErr.Errors |= ValidationErrorExpired - } - - if m.VerifyIssuedAt(now, false) == false { - vErr.Inner = errors.New("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if m.VerifyNotBefore(now, false) == false { - vErr.Inner = errors.New("Token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} diff --git a/vendor/github.com/dgrijalva/jwt-go/none.go b/vendor/github.com/dgrijalva/jwt-go/none.go deleted file mode 100644 index f04d189d067b..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/none.go +++ /dev/null @@ -1,52 +0,0 @@ -package jwt - -// Implements the none signing method. This is required by the spec -// but you probably should never use it. -var SigningMethodNone *signingMethodNone - -const UnsafeAllowNoneSignatureType unsafeNoneMagicConstant = "none signing method allowed" - -var NoneSignatureTypeDisallowedError error - -type signingMethodNone struct{} -type unsafeNoneMagicConstant string - -func init() { - SigningMethodNone = &signingMethodNone{} - NoneSignatureTypeDisallowedError = NewValidationError("'none' signature type is not allowed", ValidationErrorSignatureInvalid) - - RegisterSigningMethod(SigningMethodNone.Alg(), func() SigningMethod { - return SigningMethodNone - }) -} - -func (m *signingMethodNone) Alg() string { - return "none" -} - -// Only allow 'none' alg type if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Verify(signingString, signature string, key interface{}) (err error) { - // Key must be UnsafeAllowNoneSignatureType to prevent accidentally - // accepting 'none' signing method - if _, ok := key.(unsafeNoneMagicConstant); !ok { - return NoneSignatureTypeDisallowedError - } - // If signing method is none, signature must be an empty string - if signature != "" { - return NewValidationError( - "'none' signing method with non-empty signature", - ValidationErrorSignatureInvalid, - ) - } - - // Accept 'none' signing method. - return nil -} - -// Only allow 'none' signing if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Sign(signingString string, key interface{}) (string, error) { - if _, ok := key.(unsafeNoneMagicConstant); ok { - return "", nil - } - return "", NoneSignatureTypeDisallowedError -} diff --git a/vendor/github.com/dgrijalva/jwt-go/parser.go b/vendor/github.com/dgrijalva/jwt-go/parser.go deleted file mode 100644 index 7bf1c4ea0842..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/parser.go +++ /dev/null @@ -1,131 +0,0 @@ -package jwt - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" -) - -type Parser struct { - ValidMethods []string // If populated, only these methods will be considered valid - UseJSONNumber bool // Use JSON Number format in JSON decoder - SkipClaimsValidation bool // Skip claims validation during token parsing -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) -} - -func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - parts := strings.Split(tokenString, ".") - if len(parts) != 3 { - return nil, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - var err error - token := &Token{Raw: tokenString} - - // parse Header - var headerBytes []byte - if headerBytes, err = DecodeSegment(parts[0]); err != nil { - if strings.HasPrefix(strings.ToLower(tokenString), "bearer ") { - return token, NewValidationError("tokenstring should not contain 'bearer '", ValidationErrorMalformed) - } - return token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - if err = json.Unmarshal(headerBytes, &token.Header); err != nil { - return token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // parse Claims - var claimBytes []byte - token.Claims = claims - - if claimBytes, err = DecodeSegment(parts[1]); err != nil { - return token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) - if p.UseJSONNumber { - dec.UseNumber() - } - // JSON Decode. Special case for map type to avoid weird pointer behavior - if c, ok := token.Claims.(MapClaims); ok { - err = dec.Decode(&c) - } else { - err = dec.Decode(&claims) - } - // Handle decode error - if err != nil { - return token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // Lookup signature method - if method, ok := token.Header["alg"].(string); ok { - if token.Method = GetSigningMethod(method); token.Method == nil { - return token, NewValidationError("signing method (alg) is unavailable.", ValidationErrorUnverifiable) - } - } else { - return token, NewValidationError("signing method (alg) is unspecified.", ValidationErrorUnverifiable) - } - - // Verify signing method is in the required set - if p.ValidMethods != nil { - var signingMethodValid = false - var alg = token.Method.Alg() - for _, m := range p.ValidMethods { - if m == alg { - signingMethodValid = true - break - } - } - if !signingMethodValid { - // signing method is not in the listed set - return token, NewValidationError(fmt.Sprintf("signing method %v is invalid", alg), ValidationErrorSignatureInvalid) - } - } - - // Lookup key - var key interface{} - if keyFunc == nil { - // keyFunc was not provided. short circuiting validation - return token, NewValidationError("no Keyfunc was provided.", ValidationErrorUnverifiable) - } - if key, err = keyFunc(token); err != nil { - // keyFunc returned an error - return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} - } - - vErr := &ValidationError{} - - // Validate Claims - if !p.SkipClaimsValidation { - if err := token.Claims.Valid(); err != nil { - - // If the Claims Valid returned an error, check if it is a validation error, - // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set - if e, ok := err.(*ValidationError); !ok { - vErr = &ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid} - } else { - vErr = e - } - } - } - - // Perform validation - token.Signature = parts[2] - if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { - vErr.Inner = err - vErr.Errors |= ValidationErrorSignatureInvalid - } - - if vErr.valid() { - token.Valid = true - return token, nil - } - - return token, vErr -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa.go b/vendor/github.com/dgrijalva/jwt-go/rsa.go deleted file mode 100644 index 0ae0b1984e5a..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa.go +++ /dev/null @@ -1,100 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSA family of signing methods signing methods -type SigningMethodRSA struct { - Name string - Hash crypto.Hash -} - -// Specific instances for RS256 and company -var ( - SigningMethodRS256 *SigningMethodRSA - SigningMethodRS384 *SigningMethodRSA - SigningMethodRS512 *SigningMethodRSA -) - -func init() { - // RS256 - SigningMethodRS256 = &SigningMethodRSA{"RS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodRS256.Alg(), func() SigningMethod { - return SigningMethodRS256 - }) - - // RS384 - SigningMethodRS384 = &SigningMethodRSA{"RS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodRS384.Alg(), func() SigningMethod { - return SigningMethodRS384 - }) - - // RS512 - SigningMethodRS512 = &SigningMethodRSA{"RS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodRS512.Alg(), func() SigningMethod { - return SigningMethodRS512 - }) -} - -func (m *SigningMethodRSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this signing method, must be an rsa.PublicKey structure. -func (m *SigningMethodRSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - var ok bool - - if rsaKey, ok = key.(*rsa.PublicKey); !ok { - return ErrInvalidKeyType - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - return rsa.VerifyPKCS1v15(rsaKey, m.Hash, hasher.Sum(nil), sig) -} - -// Implements the Sign method from SigningMethod -// For this signing method, must be an rsa.PrivateKey structure. -func (m *SigningMethodRSA) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - var ok bool - - // Validate type of key - if rsaKey, ok = key.(*rsa.PrivateKey); !ok { - return "", ErrInvalidKey - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPKCS1v15(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil)); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go b/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go deleted file mode 100644 index 10ee9db8a4ed..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go +++ /dev/null @@ -1,126 +0,0 @@ -// +build go1.4 - -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSAPSS family of signing methods signing methods -type SigningMethodRSAPSS struct { - *SigningMethodRSA - Options *rsa.PSSOptions -} - -// Specific instances for RS/PS and company -var ( - SigningMethodPS256 *SigningMethodRSAPSS - SigningMethodPS384 *SigningMethodRSAPSS - SigningMethodPS512 *SigningMethodRSAPSS -) - -func init() { - // PS256 - SigningMethodPS256 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS256", - Hash: crypto.SHA256, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA256, - }, - } - RegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod { - return SigningMethodPS256 - }) - - // PS384 - SigningMethodPS384 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS384", - Hash: crypto.SHA384, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA384, - }, - } - RegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod { - return SigningMethodPS384 - }) - - // PS512 - SigningMethodPS512 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS512", - Hash: crypto.SHA512, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA512, - }, - } - RegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod { - return SigningMethodPS512 - }) -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an rsa.PublicKey struct -func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - switch k := key.(type) { - case *rsa.PublicKey: - rsaKey = k - default: - return ErrInvalidKey - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, m.Options) -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an rsa.PrivateKey struct -func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - - switch k := key.(type) { - case *rsa.PrivateKey: - rsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil), m.Options); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go deleted file mode 100644 index 213a90dbbf8d..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go +++ /dev/null @@ -1,69 +0,0 @@ -package jwt - -import ( - "crypto/rsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be PEM encoded PKCS1 or PKCS8 private key") - ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key") - ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key") -) - -// Parse PEM encoded PKCS1 or PKCS8 private key -func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - var parsedKey interface{} - if parsedKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil { - if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil { - return nil, err - } - } - - var pkey *rsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { - return nil, ErrNotRSAPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *rsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PublicKey); !ok { - return nil, ErrNotRSAPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/signing_method.go b/vendor/github.com/dgrijalva/jwt-go/signing_method.go deleted file mode 100644 index ed1f212b21e1..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/signing_method.go +++ /dev/null @@ -1,35 +0,0 @@ -package jwt - -import ( - "sync" -) - -var signingMethods = map[string]func() SigningMethod{} -var signingMethodLock = new(sync.RWMutex) - -// Implement SigningMethod to add new methods for signing or verifying tokens. -type SigningMethod interface { - Verify(signingString, signature string, key interface{}) error // Returns nil if signature is valid - Sign(signingString string, key interface{}) (string, error) // Returns encoded signature or error - Alg() string // returns the alg identifier for this method (example: 'HS256') -} - -// Register the "alg" name and a factory function for signing method. -// This is typically done during init() in the method's implementation -func RegisterSigningMethod(alg string, f func() SigningMethod) { - signingMethodLock.Lock() - defer signingMethodLock.Unlock() - - signingMethods[alg] = f -} - -// Get a signing method from an "alg" string -func GetSigningMethod(alg string) (method SigningMethod) { - signingMethodLock.RLock() - defer signingMethodLock.RUnlock() - - if methodF, ok := signingMethods[alg]; ok { - method = methodF() - } - return -} diff --git a/vendor/github.com/dgrijalva/jwt-go/token.go b/vendor/github.com/dgrijalva/jwt-go/token.go deleted file mode 100644 index d637e0867c65..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/token.go +++ /dev/null @@ -1,108 +0,0 @@ -package jwt - -import ( - "encoding/base64" - "encoding/json" - "strings" - "time" -) - -// TimeFunc provides the current time when parsing token to validate "exp" claim (expiration time). -// You can override it to use another time value. This is useful for testing or if your -// server uses a different time zone than your tokens. -var TimeFunc = time.Now - -// Parse methods use this callback function to supply -// the key for verification. The function receives the parsed, -// but unverified Token. This allows you to use properties in the -// Header of the token (such as `kid`) to identify which key to use. -type Keyfunc func(*Token) (interface{}, error) - -// A JWT Token. Different fields will be used depending on whether you're -// creating or parsing/verifying a token. -type Token struct { - Raw string // The raw token. Populated when you Parse a token - Method SigningMethod // The signing method used or to be used - Header map[string]interface{} // The first segment of the token - Claims Claims // The second segment of the token - Signature string // The third segment of the token. Populated when you Parse a token - Valid bool // Is the token valid? Populated when you Parse/Verify a token -} - -// Create a new Token. Takes a signing method -func New(method SigningMethod) *Token { - return NewWithClaims(method, MapClaims{}) -} - -func NewWithClaims(method SigningMethod, claims Claims) *Token { - return &Token{ - Header: map[string]interface{}{ - "typ": "JWT", - "alg": method.Alg(), - }, - Claims: claims, - Method: method, - } -} - -// Get the complete, signed token -func (t *Token) SignedString(key interface{}) (string, error) { - var sig, sstr string - var err error - if sstr, err = t.SigningString(); err != nil { - return "", err - } - if sig, err = t.Method.Sign(sstr, key); err != nil { - return "", err - } - return strings.Join([]string{sstr, sig}, "."), nil -} - -// Generate the signing string. This is the -// most expensive part of the whole deal. Unless you -// need this for something special, just go straight for -// the SignedString. -func (t *Token) SigningString() (string, error) { - var err error - parts := make([]string, 2) - for i, _ := range parts { - var jsonValue []byte - if i == 0 { - if jsonValue, err = json.Marshal(t.Header); err != nil { - return "", err - } - } else { - if jsonValue, err = json.Marshal(t.Claims); err != nil { - return "", err - } - } - - parts[i] = EncodeSegment(jsonValue) - } - return strings.Join(parts, "."), nil -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return new(Parser).Parse(tokenString, keyFunc) -} - -func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - return new(Parser).ParseWithClaims(tokenString, claims, keyFunc) -} - -// Encode JWT specific base64url encoding with padding stripped -func EncodeSegment(seg []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(seg), "=") -} - -// Decode JWT specific base64url encoding with padding stripped -func DecodeSegment(seg string) ([]byte, error) { - if l := len(seg) % 4; l > 0 { - seg += strings.Repeat("=", 4-l) - } - - return base64.URLEncoding.DecodeString(seg) -} diff --git a/vendor/github.com/gballet/go-libpcsclite/LICENSE b/vendor/github.com/gballet/go-libpcsclite/LICENSE new file mode 100644 index 000000000000..52d9e62b07bb --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2019, Guillaume Ballet +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/gballet/go-libpcsclite/README.md b/vendor/github.com/gballet/go-libpcsclite/README.md new file mode 100644 index 000000000000..182398e39df4 --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/README.md @@ -0,0 +1,73 @@ +# go-libpcsclite + +A golang implementation of the [libpcpsclite](http://github.com/LudovicRousseau/PCSC) client. It connects to the `pcscd` daemon over sockets. + +## Purpose + +The goal is for major open source projects to distribute a single binary that doesn't depend on `libpcsclite`. It provides an extra function `CheckPCSCDaemon` that will tell the user if `pcscd` is running. + +## Example + +```golang +func main() { + client, err := EstablishContext(2) + if err != nil { + fmt.Printf("Error establishing context: %v\n", err) + os.Exit(1) + } + + _, err = client.ListReaders() + if err != nil { + fmt.Printf("Error getting the list of readers: %v\n", err) + os.Exit(1) + } + + card, err := client.Connect(client.readerStateDescriptors[0].Name, ShareShared, ProtocolT0|ProtocolT1) + if err != nil { + fmt.Printf("Error connecting: %v\n", err) + os.Exit(1) + } + + resp, _, err := card.Transmit([]byte{0, 0xa4, 4, 0, 0xA0, 0, 0, 8, 4, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}) + + card.Disconnect(LeaveCard) +} +``` + +## TODO + + - [x] Finish this README + - [x] Lock context + - [ ] implement missing functions + +## License + +BSD 3-Clause License + +Copyright (c) 2019, Guillaume Ballet +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/gballet/go-libpcsclite/doc.go b/vendor/github.com/gballet/go-libpcsclite/doc.go new file mode 100644 index 000000000000..0f28c0c9c4f7 --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/doc.go @@ -0,0 +1,95 @@ +// BSD 3-Clause License +// +// Copyright (c) 2019, Guillaume Ballet +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package pcsc + +const ( + AutoAllocate = -1 /* see SCardFreeMemory() */ + ScopeUser = 0x0000 /* Scope in user space */ + ScopeTerminal = 0x0001 /* Scope in terminal */ + ScopeSystem = 0x0002 /* Scope in system */ + ScopeGlobal = 0x0003 /* Scope is global */ + + ProtocolUndefined = 0x0000 /* protocol not set */ + ProtocolUnSet = ProtocolUndefined /* backward compat */ + ProtocolT0 = 0x0001 /* T=0 active protocol. */ + ProtocolT1 = 0x0002 /* T=1 active protocol. */ + ProtocolRaw = 0x0004 /* Raw active protocol. */ + ProtocolT15 = 0x0008 /* T=15 protocol. */ + ProtocolAny = (ProtocolT0 | ProtocolT1) /* IFD determines prot. */ + + ShareExclusive = 0x0001 /* Exclusive mode only */ + ShareShared = 0x0002 /* Shared mode only */ + ShareDirect = 0x0003 /* Raw mode only */ + + LeaveCard = 0x0000 /* Do nothing on close */ + ResetCard = 0x0001 /* Reset on close */ + UnpowerCard = 0x0002 /* Power down on close */ + EjectCard = 0x0003 /* Eject on close */ + + SCardUnknown = 0x0001 /* Unknown state */ + SCardAbsent = 0x0002 /* Card is absent */ + SCardPresent = 0x0004 /* Card is present */ + SCardSwallowed = 0x0008 /* Card not powered */ + SCardPowever = 0x0010 /* Card is powered */ + SCardNegotiable = 0x0020 /* Ready for PTS */ + SCardSpecific = 0x0040 /* PTS has been set */ +) + +// List of commands to send to the daemon +const ( + _ = iota + SCardEstablishContext /* used by SCardEstablishContext() */ + SCardReleaseContext /* used by SCardReleaseContext() */ + SCardListReaders /* used by SCardListReaders() */ + SCardConnect /* used by SCardConnect() */ + SCardReConnect /* used by SCardReconnect() */ + SCardDisConnect /* used by SCardDisconnect() */ + SCardBeginTransaction /* used by SCardBeginTransaction() */ + SCardEndTransaction /* used by SCardEndTransaction() */ + SCardTransmit /* used by SCardTransmit() */ + SCardControl /* used by SCardControl() */ + SCardStatus /* used by SCardStatus() */ + SCardGetStatusChange /* not used */ + SCardCancel /* used by SCardCancel() */ + SCardCancelTransaction /* not used */ + SCardGetAttrib /* used by SCardGetAttrib() */ + SCardSetAttrib /* used by SCardSetAttrib() */ + CommandVersion /* get the client/server protocol version */ + CommandGetReaderState /* get the readers state */ + CommandWaitReaderStateChange /* wait for a reader state change */ + CommandStopWaitingReaderStateChange /* stop waiting for a reader state change */ +) + +// Protocol information +const ( + ProtocolVersionMajor = uint32(4) /* IPC major */ + ProtocolVersionMinor = uint32(3) /* IPC minor */ +) diff --git a/vendor/github.com/gballet/go-libpcsclite/doc_bsd.go b/vendor/github.com/gballet/go-libpcsclite/doc_bsd.go new file mode 100644 index 000000000000..672c672e4f69 --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/doc_bsd.go @@ -0,0 +1,35 @@ +// BSD 3-Clause License +// +// Copyright (c) 2019, Guillaume Ballet +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build dragonfly freebsd netbsd openbsd solaris + +package pcsc + +const PCSCDSockName string = "/var/run/pcscd/pcscd.comm" diff --git a/vendor/github.com/gballet/go-libpcsclite/doc_darwin.go b/vendor/github.com/gballet/go-libpcsclite/doc_darwin.go new file mode 100644 index 000000000000..3dec7c79b414 --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/doc_darwin.go @@ -0,0 +1,35 @@ +// BSD 3-Clause License +// +// Copyright (c) 2019, Guillaume Ballet +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build darwin + +package pcsc + +const PCSCDSockName string = "" diff --git a/vendor/github.com/gballet/go-libpcsclite/doc_linux.go b/vendor/github.com/gballet/go-libpcsclite/doc_linux.go new file mode 100644 index 000000000000..becbf1677594 --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/doc_linux.go @@ -0,0 +1,35 @@ +// BSD 3-Clause License +// +// Copyright (c) 2019, Guillaume Ballet +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build linux + +package pcsc + +const PCSCDSockName string = "/run/pcscd/pcscd.comm" \ No newline at end of file diff --git a/vendor/github.com/gballet/go-libpcsclite/doc_windows.go b/vendor/github.com/gballet/go-libpcsclite/doc_windows.go new file mode 100644 index 000000000000..9bd6bd333f22 --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/doc_windows.go @@ -0,0 +1,35 @@ +// BSD 3-Clause License +// +// Copyright (c) 2019, Guillaume Ballet +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build windows + +package pcsc + +const PCSCDSockName string = "" diff --git a/vendor/github.com/gballet/go-libpcsclite/error.go b/vendor/github.com/gballet/go-libpcsclite/error.go new file mode 100644 index 000000000000..4710de5e6029 --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/error.go @@ -0,0 +1,246 @@ +// BSD 3-Clause License +// +// Copyright (c) 2019, Guillaume Ballet +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package pcsc + +import "fmt" + +type ErrorCode uint32 + +const ( + SCardSuccess ErrorCode = 0x00000000 /* No error was encountered. */ + ErrSCardInternal = 0x80100001 /* An internal consistency check failed. */ + ErrSCardCancelled = 0x80100002 /* The action was cancelled by an SCardCancel request. */ + ErrSCardInvalidHandle = 0x80100003 /* The supplied handle was invalid. */ + ErrSCardInvalidParameter = 0x80100004 /* One or more of the supplied parameters could not be properly interpreted. */ + ErrSCardInvalidTarget = 0x80100005 /* Registry startup information is missing or invalid. */ + ErrSCardNoMemory = 0x80100006 /* Not enough memory available to complete this command. */ + ErrSCardWaitedTooLong = 0x80100007 /* An internal consistency timer has expired. */ + ErrSCardInsufficientBuffer = 0x80100008 /* The data buffer to receive returned data is too small for the returned data. */ + ErrScardUnknownReader = 0x80100009 /* The specified reader name is not recognized. */ + ErrSCardTimeout = 0x8010000A /* The user-specified timeout value has expired. */ + ErrSCardSharingViolation = 0x8010000B /* The smart card cannot be accessed because of other connections outstanding. */ + ErrSCardNoSmartCard = 0x8010000C /* The operation requires a Smart Card, but no Smart Card is currently in the device. */ + ErrSCardUnknownCard = 0x8010000D /* The specified smart card name is not recognized. */ + ErrSCardCannotDispose = 0x8010000E /* The system could not dispose of the media in the requested manner. */ + ErrSCardProtoMismatch = 0x8010000F /* The requested protocols are incompatible with the protocol currently in use with the smart card. */ + ErrSCardNotReady = 0x80100010 /* The reader or smart card is not ready to accept commands. */ + ErrSCardInvalidValue = 0x80100011 /* One or more of the supplied parameters values could not be properly interpreted. */ + ErrSCardSystemCancelled = 0x80100012 /* The action was cancelled by the system, presumably to log off or shut down. */ + ErrSCardCommError = 0x80100013 /* An internal communications error has been detected. */ + ErrScardUnknownError = 0x80100014 /* An internal error has been detected, but the source is unknown. */ + ErrSCardInvalidATR = 0x80100015 /* An ATR obtained from the registry is not a valid ATR string. */ + ErrSCardNotTransacted = 0x80100016 /* An attempt was made to end a non-existent transaction. */ + ErrSCardReaderUnavailable = 0x80100017 /* The specified reader is not currently available for use. */ + ErrSCardShutdown = 0x80100018 /* The operation has been aborted to allow the server application to exit. */ + ErrSCardPCITooSmall = 0x80100019 /* The PCI Receive buffer was too small. */ + ErrSCardReaderUnsupported = 0x8010001A /* The reader driver does not meet minimal requirements for support. */ + ErrSCardDuplicateReader = 0x8010001B /* The reader driver did not produce a unique reader name. */ + ErrSCardCardUnsupported = 0x8010001C /* The smart card does not meet minimal requirements for support. */ + ErrScardNoService = 0x8010001D /* The Smart card resource manager is not running. */ + ErrSCardServiceStopped = 0x8010001E /* The Smart card resource manager has shut down. */ + ErrSCardUnexpected = 0x8010001F /* An unexpected card error has occurred. */ + ErrSCardUnsupportedFeature = 0x8010001F /* This smart card does not support the requested feature. */ + ErrSCardICCInstallation = 0x80100020 /* No primary provider can be found for the smart card. */ + ErrSCardICCCreateOrder = 0x80100021 /* The requested order of object creation is not supported. */ + ErrSCardDirNotFound = 0x80100023 /* The identified directory does not exist in the smart card. */ + ErrSCardFileNotFound = 0x80100024 /* The identified file does not exist in the smart card. */ + ErrSCardNoDir = 0x80100025 /* The supplied path does not represent a smart card directory. */ + ErrSCardNoFile = 0x80100026 /* The supplied path does not represent a smart card file. */ + ErrScardNoAccess = 0x80100027 /* Access is denied to this file. */ + ErrSCardWriteTooMany = 0x80100028 /* The smart card does not have enough memory to store the information. */ + ErrSCardBadSeek = 0x80100029 /* There was an error trying to set the smart card file object pointer. */ + ErrSCardInvalidCHV = 0x8010002A /* The supplied PIN is incorrect. */ + ErrSCardUnknownResMNG = 0x8010002B /* An unrecognized error code was returned from a layered component. */ + ErrSCardNoSuchCertificate = 0x8010002C /* The requested certificate does not exist. */ + ErrSCardCertificateUnavailable = 0x8010002D /* The requested certificate could not be obtained. */ + ErrSCardNoReadersAvailable = 0x8010002E /* Cannot find a smart card reader. */ + ErrSCardCommDataLost = 0x8010002F /* A communications error with the smart card has been detected. Retry the operation. */ + ErrScardNoKeyContainer = 0x80100030 /* The requested key container does not exist on the smart card. */ + ErrSCardServerTooBusy = 0x80100031 /* The Smart Card Resource Manager is too busy to complete this operation. */ + ErrSCardUnsupportedCard = 0x80100065 /* The reader cannot communicate with the card, due to ATR string configuration conflicts. */ + ErrSCardUnresponsiveCard = 0x80100066 /* The smart card is not responding to a reset. */ + ErrSCardUnpoweredCard = 0x80100067 /* Power has been removed from the smart card, so that further communication is not possible. */ + ErrSCardResetCard = 0x80100068 /* The smart card has been reset, so any shared state information is invalid. */ + ErrSCardRemovedCard = 0x80100069 /* The smart card has been removed, so further communication is not possible. */ + ErrSCardSecurityViolation = 0x8010006A /* Access was denied because of a security violation. */ + ErrSCardWrongCHV = 0x8010006B /* The card cannot be accessed because the wrong PIN was presented. */ + ErrSCardCHVBlocked = 0x8010006C /* The card cannot be accessed because the maximum number of PIN entry attempts has been reached. */ + ErrSCardEOF = 0x8010006D /* The end of the smart card file has been reached. */ + ErrSCardCancelledByUser = 0x8010006E /* The user pressed "Cancel" on a Smart Card Selection Dialog. */ + ErrSCardCardNotAuthenticated = 0x8010006F /* No PIN was presented to the smart card. */ +) + +// Code returns the error code, with an uint32 type to be used in PutUInt32 +func (code ErrorCode) Code() uint32 { + return uint32(code) +} + +func (code ErrorCode) Error() error { + switch code { + case SCardSuccess: + return fmt.Errorf("Command successful") + + case ErrSCardInternal: + return fmt.Errorf("Internal error") + + case ErrSCardCancelled: + return fmt.Errorf("Command cancelled") + + case ErrSCardInvalidHandle: + return fmt.Errorf("Invalid handle") + + case ErrSCardInvalidParameter: + return fmt.Errorf("Invalid parameter given") + + case ErrSCardInvalidTarget: + return fmt.Errorf("Invalid target given") + + case ErrSCardNoMemory: + return fmt.Errorf("Not enough memory") + + case ErrSCardWaitedTooLong: + return fmt.Errorf("Waited too long") + + case ErrSCardInsufficientBuffer: + return fmt.Errorf("Insufficient buffer") + + case ErrScardUnknownReader: + return fmt.Errorf("Unknown reader specified") + + case ErrSCardTimeout: + return fmt.Errorf("Command timeout") + + case ErrSCardSharingViolation: + return fmt.Errorf("Sharing violation") + + case ErrSCardNoSmartCard: + return fmt.Errorf("No smart card inserted") + + case ErrSCardUnknownCard: + return fmt.Errorf("Unknown card") + + case ErrSCardCannotDispose: + return fmt.Errorf("Cannot dispose handle") + + case ErrSCardProtoMismatch: + return fmt.Errorf("Card protocol mismatch") + + case ErrSCardNotReady: + return fmt.Errorf("Subsystem not ready") + + case ErrSCardInvalidValue: + return fmt.Errorf("Invalid value given") + + case ErrSCardSystemCancelled: + return fmt.Errorf("System cancelled") + + case ErrSCardCommError: + return fmt.Errorf("RPC transport error") + + case ErrScardUnknownError: + return fmt.Errorf("Unknown error") + + case ErrSCardInvalidATR: + return fmt.Errorf("Invalid ATR") + + case ErrSCardNotTransacted: + return fmt.Errorf("Transaction failed") + + case ErrSCardReaderUnavailable: + return fmt.Errorf("Reader is unavailable") + + /* case SCARD_P_SHUTDOWN: */ + case ErrSCardPCITooSmall: + return fmt.Errorf("PCI struct too small") + + case ErrSCardReaderUnsupported: + return fmt.Errorf("Reader is unsupported") + + case ErrSCardDuplicateReader: + return fmt.Errorf("Reader already exists") + + case ErrSCardCardUnsupported: + return fmt.Errorf("Card is unsupported") + + case ErrScardNoService: + return fmt.Errorf("Service not available") + + case ErrSCardServiceStopped: + return fmt.Errorf("Service was stopped") + + /* case SCARD_E_UNEXPECTED: */ + /* case SCARD_E_ICC_CREATEORDER: */ + /* case SCARD_E_UNSUPPORTED_FEATURE: */ + /* case SCARD_E_DIR_NOT_FOUND: */ + /* case SCARD_E_NO_DIR: */ + /* case SCARD_E_NO_FILE: */ + /* case SCARD_E_NO_ACCESS: */ + /* case SCARD_E_WRITE_TOO_MANY: */ + /* case SCARD_E_BAD_SEEK: */ + /* case SCARD_E_INVALID_CHV: */ + /* case SCARD_E_UNKNOWN_RES_MNG: */ + /* case SCARD_E_NO_SUCH_CERTIFICATE: */ + /* case SCARD_E_CERTIFICATE_UNAVAILABLE: */ + case ErrSCardNoReadersAvailable: + return fmt.Errorf("Cannot find a smart card reader") + + /* case SCARD_E_COMM_DATA_LOST: */ + /* case SCARD_E_NO_KEY_CONTAINER: */ + /* case SCARD_E_SERVER_TOO_BUSY: */ + case ErrSCardUnsupportedCard: + return fmt.Errorf("Card is not supported") + + case ErrSCardUnresponsiveCard: + return fmt.Errorf("Card is unresponsive") + + case ErrSCardUnpoweredCard: + return fmt.Errorf("Card is unpowered") + + case ErrSCardResetCard: + return fmt.Errorf("Card was reset") + + case ErrSCardRemovedCard: + return fmt.Errorf("Card was removed") + + /* case SCARD_W_SECURITY_VIOLATION: */ + /* case SCARD_W_WRONG_CHV: */ + /* case SCARD_W_CHV_BLOCKED: */ + /* case SCARD_W_EOF: */ + /* case SCARD_W_CANCELLED_BY_USER: */ + /* case SCARD_W_CARD_NOT_AUTHENTICATED: */ + + case ErrSCardUnsupportedFeature: + return fmt.Errorf("Feature not supported") + + default: + return fmt.Errorf("unknown error: %08x", code) + } +} diff --git a/vendor/github.com/gballet/go-libpcsclite/go.mod b/vendor/github.com/gballet/go-libpcsclite/go.mod new file mode 100644 index 000000000000..e97f46b7fe86 --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/go.mod @@ -0,0 +1 @@ +module github.com/gballet/go-libpcsclite diff --git a/vendor/github.com/gballet/go-libpcsclite/msg.go b/vendor/github.com/gballet/go-libpcsclite/msg.go new file mode 100644 index 000000000000..1377082b14fa --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/msg.go @@ -0,0 +1,82 @@ +// BSD 3-Clause License +// +// Copyright (c) 2019, Guillaume Ballet +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package pcsc + +import ( + "encoding/binary" + "net" +) + +/** + * @brief Wrapper for the MessageSend() function. + * + * Called by clients to send messages to the server. + * The parameters \p command and \p data are set in the \c sharedSegmentMsg + * struct in order to be sent. + * + * @param[in] command Command to be sent. + * @param[in] dwClientID Client socket handle. + * @param[in] size Size of the message (\p data). + * @param[in] data_void Data to be sent. + * + * @return Same error codes as MessageSend(). + */ +func messageSendWithHeader(command uint32, conn net.Conn, data []byte) error { + /* Translate header into bytes */ + msgData := make([]byte, 8+len(data)) + binary.LittleEndian.PutUint32(msgData[4:], command) + binary.LittleEndian.PutUint32(msgData, uint32(len(data))) + + /* Copy payload */ + copy(msgData[8:], data) + + _, err := conn.Write(msgData) + return err +} + +// clientSetupSession prepares a communication channel for the client to talk to the server. +// This is called by the application to create a socket for local IPC with the +// server. The socket is associated to the file \c PCSCLITE_CSOCK_NAME. +/* + * @param[out] pdwClientID Client Connection ID. + * + * @retval 0 Success. + * @retval -1 Can not create the socket. + * @retval -1 The socket can not open a connection. + * @retval -1 Can not set the socket to non-blocking. + */ +func clientSetupSession(daemonPath string) (net.Conn, error) { + path := PCSCDSockName + if len(daemonPath) > 0 { + path = daemonPath + } + return net.Dial("unix", path) +} diff --git a/vendor/github.com/gballet/go-libpcsclite/winscard.go b/vendor/github.com/gballet/go-libpcsclite/winscard.go new file mode 100644 index 000000000000..b916db1621e7 --- /dev/null +++ b/vendor/github.com/gballet/go-libpcsclite/winscard.go @@ -0,0 +1,402 @@ +// BSD 3-Clause License +// +// Copyright (c) 2019, Guillaume Ballet +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package pcsc + +import ( + "encoding/binary" + "fmt" + "net" + "sync" + "unsafe" +) + +// Client contains all the information needed to establish +// and maintain a connection to the deamon/card. +type Client struct { + conn net.Conn + + minor uint32 + major uint32 + + ctx uint32 + + mutex sync.Mutex + + readerStateDescriptors [MaxReaderStateDescriptors]ReaderState +} + +// EstablishContext asks the PCSC daemon to create a context +// handle for further communication with connected cards and +// readers. +func EstablishContext(path string, scope uint32) (*Client, error) { + client := &Client{} + + conn, err := clientSetupSession(path) + if err != nil { + return nil, err + } + client.conn = conn + + payload := make([]byte, 12) + response := make([]byte, 12) + + var code uint32 + var minor uint32 + for minor = ProtocolVersionMinor; minor <= ProtocolVersionMinor+1; minor++ { + /* Exchange version information */ + binary.LittleEndian.PutUint32(payload, ProtocolVersionMajor) + binary.LittleEndian.PutUint32(payload[4:], minor) + binary.LittleEndian.PutUint32(payload[8:], SCardSuccess.Code()) + err = messageSendWithHeader(CommandVersion, conn, payload) + if err != nil { + return nil, err + } + n, err := conn.Read(response) + if err != nil { + return nil, err + } + if n != len(response) { + return nil, fmt.Errorf("invalid response length: expected %d, got %d", len(response), n) + } + code = binary.LittleEndian.Uint32(response[8:]) + if code != SCardSuccess.Code() { + continue + } + client.major = binary.LittleEndian.Uint32(response) + client.minor = binary.LittleEndian.Uint32(response[4:]) + if client.major != ProtocolVersionMajor || client.minor != minor { + continue + } + break + } + + if code != SCardSuccess.Code() { + return nil, fmt.Errorf("invalid response code: expected %d, got %d (%v)", SCardSuccess, code, ErrorCode(code).Error()) + } + if client.major != ProtocolVersionMajor || (client.minor != minor && client.minor+1 != minor) { + return nil, fmt.Errorf("invalid version found: expected %d.%d, got %d.%d", ProtocolVersionMajor, ProtocolVersionMinor, client.major, client.minor) + } + + /* Establish the context proper */ + binary.LittleEndian.PutUint32(payload, scope) + binary.LittleEndian.PutUint32(payload[4:], 0) + binary.LittleEndian.PutUint32(payload[8:], SCardSuccess.Code()) + err = messageSendWithHeader(SCardEstablishContext, conn, payload) + if err != nil { + return nil, err + } + response = make([]byte, 12) + n, err := conn.Read(response) + if err != nil { + return nil, err + } + if n != len(response) { + return nil, fmt.Errorf("invalid response length: expected %d, got %d", len(response), n) + } + code = binary.LittleEndian.Uint32(response[8:]) + if code != SCardSuccess.Code() { + return nil, fmt.Errorf("invalid response code: expected %d, got %d (%v)", SCardSuccess, code, ErrorCode(code).Error()) + } + client.ctx = binary.LittleEndian.Uint32(response[4:]) + + return client, nil +} + +// ReleaseContext tells the daemon that the client will no longer +// need the context. +func (client *Client) ReleaseContext() error { + client.mutex.Lock() + defer client.mutex.Unlock() + + data := [8]byte{} + binary.LittleEndian.PutUint32(data[:], client.ctx) + binary.LittleEndian.PutUint32(data[4:], SCardSuccess.Code()) + err := messageSendWithHeader(SCardReleaseContext, client.conn, data[:]) + if err != nil { + return err + } + total := 0 + for total < len(data) { + n, err := client.conn.Read(data[total:]) + if err != nil { + return err + } + total += n + } + code := binary.LittleEndian.Uint32(data[4:]) + if code != SCardSuccess.Code() { + return fmt.Errorf("invalid return code: %x, %v", code, ErrorCode(code).Error()) + } + + return nil +} + +// Constants related to the reader state structure +const ( + ReaderStateNameLength = 128 + ReaderStateMaxAtrSizeLength = 33 + // NOTE: ATR is 32-byte aligned in the C version, which means it's + // actually 36 byte long and not 33. + ReaderStateDescriptorLength = ReaderStateNameLength + ReaderStateMaxAtrSizeLength + 5*4 + 3 + + MaxReaderStateDescriptors = 16 +) + +// ReaderState represent the state of a single reader, as reported +// by the PCSC daemon. +type ReaderState struct { + Name string /* reader name */ + eventCounter uint32 /* number of card events */ + readerState uint32 /* SCARD_* bit field */ + readerSharing uint32 /* PCSCLITE_SHARING_* sharing status */ + + cardAtr [ReaderStateMaxAtrSizeLength]byte /* ATR */ + cardAtrLength uint32 /* ATR length */ + cardProtocol uint32 /* SCARD_PROTOCOL_* value */ +} + +func getReaderState(data []byte) (ReaderState, error) { + ret := ReaderState{} + if len(data) < ReaderStateDescriptorLength { + return ret, fmt.Errorf("could not unmarshall data of length %d < %d", len(data), ReaderStateDescriptorLength) + } + + ret.Name = string(data[:ReaderStateNameLength]) + ret.eventCounter = binary.LittleEndian.Uint32(data[unsafe.Offsetof(ret.eventCounter):]) + ret.readerState = binary.LittleEndian.Uint32(data[unsafe.Offsetof(ret.readerState):]) + ret.readerSharing = binary.LittleEndian.Uint32(data[unsafe.Offsetof(ret.readerSharing):]) + copy(ret.cardAtr[:], data[unsafe.Offsetof(ret.cardAtr):unsafe.Offsetof(ret.cardAtr)+ReaderStateMaxAtrSizeLength]) + ret.cardAtrLength = binary.LittleEndian.Uint32(data[unsafe.Offsetof(ret.cardAtrLength):]) + ret.cardProtocol = binary.LittleEndian.Uint32(data[unsafe.Offsetof(ret.cardProtocol):]) + + return ret, nil +} + +// ListReaders gets the list of readers from the daemon +func (client *Client) ListReaders() ([]string, error) { + client.mutex.Lock() + defer client.mutex.Unlock() + + err := messageSendWithHeader(CommandGetReaderState, client.conn, []byte{}) + if err != nil { + return nil, err + } + response := make([]byte, ReaderStateDescriptorLength*MaxReaderStateDescriptors) + total := 0 + for total < len(response) { + n, err := client.conn.Read(response[total:]) + if err != nil { + return nil, err + } + total += n + } + + var names []string + for i := range client.readerStateDescriptors { + desc, err := getReaderState(response[i*ReaderStateDescriptorLength:]) + if err != nil { + return nil, err + } + client.readerStateDescriptors[i] = desc + if desc.Name[0] == 0 { + break + } + names = append(names, desc.Name) + } + + return names, nil +} + +// Offsets into the Connect request/response packet +const ( + SCardConnectReaderNameOffset = 4 + SCardConnectShareModeOffset = SCardConnectReaderNameOffset + ReaderStateNameLength + SCardConnectPreferredProtocolOffset = SCardConnectShareModeOffset + 4 + SCardConnectReturnValueOffset = SCardConnectPreferredProtocolOffset + 12 +) + +// Card represents the connection to a card +type Card struct { + handle uint32 + activeProto uint32 + client *Client +} + +// Connect asks the daemon to connect to the card +func (client *Client) Connect(name string, shareMode uint32, preferredProtocol uint32) (*Card, error) { + client.mutex.Lock() + defer client.mutex.Unlock() + + request := make([]byte, ReaderStateNameLength+4*6) + binary.LittleEndian.PutUint32(request, client.ctx) + copy(request[SCardConnectReaderNameOffset:], []byte(name)) + binary.LittleEndian.PutUint32(request[SCardConnectShareModeOffset:], shareMode) + binary.LittleEndian.PutUint32(request[SCardConnectPreferredProtocolOffset:], preferredProtocol) + binary.LittleEndian.PutUint32(request[SCardConnectReturnValueOffset:], SCardSuccess.Code()) + + err := messageSendWithHeader(SCardConnect, client.conn, request) + if err != nil { + return nil, err + } + response := make([]byte, ReaderStateNameLength+4*6) + total := 0 + for total < len(response) { + n, err := client.conn.Read(response[total:]) + if err != nil { + return nil, err + } + // fmt.Println("total, n", total, n, response) + total += n + } + code := binary.LittleEndian.Uint32(response[148:]) + if code != SCardSuccess.Code() { + return nil, fmt.Errorf("invalid return code: %x (%v)", code, ErrorCode(code).Error()) + } + handle := binary.LittleEndian.Uint32(response[140:]) + active := binary.LittleEndian.Uint32(response[SCardConnectPreferredProtocolOffset:]) + + return &Card{handle: handle, activeProto: active, client: client}, nil +} + +/** +* @brief contained in \ref SCARD_TRANSMIT Messages. +* +* These data are passed throw the field \c sharedSegmentMsg.data. + */ +type transmit struct { + hCard uint32 + ioSendPciProtocol uint32 + ioSendPciLength uint32 + cbSendLength uint32 + ioRecvPciProtocol uint32 + ioRecvPciLength uint32 + pcbRecvLength uint32 + rv uint32 +} + +// SCardIoRequest contains the info needed for performing an IO request +type SCardIoRequest struct { + proto uint32 + length uint32 +} + +const ( + TransmitRequestLength = 32 +) + +// Transmit sends request data to a card and returns the response +func (card *Card) Transmit(adpu []byte) ([]byte, *SCardIoRequest, error) { + card.client.mutex.Lock() + defer card.client.mutex.Unlock() + + request := [TransmitRequestLength]byte{} + binary.LittleEndian.PutUint32(request[:], card.handle) + binary.LittleEndian.PutUint32(request[4:] /*card.activeProto*/, 2) + binary.LittleEndian.PutUint32(request[8:], 8) + binary.LittleEndian.PutUint32(request[12:], uint32(len(adpu))) + binary.LittleEndian.PutUint32(request[16:], 0) + binary.LittleEndian.PutUint32(request[20:], 0) + binary.LittleEndian.PutUint32(request[24:], 0x10000) + binary.LittleEndian.PutUint32(request[28:], SCardSuccess.Code()) + err := messageSendWithHeader(SCardTransmit, card.client.conn, request[:]) + if err != nil { + return nil, nil, err + } + // Add the ADPU payload after the transmit descriptor + n, err := card.client.conn.Write(adpu) + if err != nil { + return nil, nil, err + } + if n != len(adpu) { + return nil, nil, fmt.Errorf("Invalid number of bytes written: expected %d, got %d", len(adpu), n) + } + response := [TransmitRequestLength]byte{} + total := 0 + for total < len(response) { + n, err = card.client.conn.Read(response[total:]) + if err != nil { + return nil, nil, err + } + total += n + } + + code := binary.LittleEndian.Uint32(response[28:]) + if code != SCardSuccess.Code() { + return nil, nil, fmt.Errorf("invalid return code: %x (%v)", code, ErrorCode(code).Error()) + } + + // Recover the response data + recvProto := binary.LittleEndian.Uint32(response[16:]) + recvLength := binary.LittleEndian.Uint32(response[20:]) + recv := &SCardIoRequest{proto: recvProto, length: recvLength} + recvLength = binary.LittleEndian.Uint32(response[24:]) + recvData := make([]byte, recvLength) + total = 0 + for uint32(total) < recvLength { + n, err := card.client.conn.Read(recvData[total:]) + if err != nil { + return nil, nil, err + } + total += n + } + + return recvData, recv, nil +} + +// Disconnect tells the PCSC daemon that the client is no longer +// interested in communicating with the card. +func (card *Card) Disconnect(disposition uint32) error { + card.client.mutex.Lock() + defer card.client.mutex.Unlock() + + data := [12]byte{} + binary.LittleEndian.PutUint32(data[:], card.handle) + binary.LittleEndian.PutUint32(data[4:], disposition) + binary.LittleEndian.PutUint32(data[8:], SCardSuccess.Code()) + err := messageSendWithHeader(SCardDisConnect, card.client.conn, data[:]) + if err != nil { + return err + } + total := 0 + for total < len(data) { + n, err := card.client.conn.Read(data[total:]) + if err != nil { + return err + } + total += n + } + code := binary.LittleEndian.Uint32(data[8:]) + if code != SCardSuccess.Code() { + return fmt.Errorf("invalid return code: %x (%v)", code, ErrorCode(code).Error()) + } + + return nil +} diff --git a/vendor/github.com/gizak/termui/LICENSE b/vendor/github.com/gizak/termui/LICENSE deleted file mode 100644 index 311ccc74fbfe..000000000000 --- a/vendor/github.com/gizak/termui/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Zack Guo - -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. - diff --git a/vendor/github.com/gizak/termui/README.md b/vendor/github.com/gizak/termui/README.md deleted file mode 100644 index d5f3d9a8f117..000000000000 --- a/vendor/github.com/gizak/termui/README.md +++ /dev/null @@ -1,151 +0,0 @@ -# termui [![Build Status](https://travis-ci.org/gizak/termui.svg?branch=master)](https://travis-ci.org/gizak/termui) [![Doc Status](https://godoc.org/github.com/gizak/termui?status.png)](https://godoc.org/github.com/gizak/termui) - -demo cast under osx 10.10; Terminal.app; Menlo Regular 12pt.) - -`termui` is a cross-platform, easy-to-compile, and fully-customizable terminal dashboard. It is inspired by [blessed-contrib](https://github.com/yaronn/blessed-contrib), but purely in Go. - -Now version v2 has arrived! It brings new event system, new theme system, new `Buffer` interface and specific colour text rendering. (some docs are missing, but it will be completed soon!) - -## Installation - -`master` mirrors v2 branch, to install: - - go get -u github.com/gizak/termui - -It is recommanded to use locked deps by using [glide](https://glide.sh): move to `termui` src directory then run `glide up`. - -For the compatible reason, you can choose to install the legacy version of `termui`: - - go get gopkg.in/gizak/termui.v1 - -## Usage - -### Layout - -To use `termui`, the very first thing you may want to know is how to manage layout. `termui` offers two ways of doing this, known as absolute layout and grid layout. - -__Absolute layout__ - -Each widget has an underlying block structure which basically is a box model. It has border, label and padding properties. A border of a widget can be chosen to hide or display (with its border label), you can pick a different front/back colour for the border as well. To display such a widget at a specific location in terminal window, you need to assign `.X`, `.Y`, `.Height`, `.Width` values for each widget before sending it to `.Render`. Let's demonstrate these by a code snippet: - -`````go - import ui "github.com/gizak/termui" // <- ui shortcut, optional - - func main() { - err := ui.Init() - if err != nil { - panic(err) - } - defer ui.Close() - - p := ui.NewPar(":PRESS q TO QUIT DEMO") - p.Height = 3 - p.Width = 50 - p.TextFgColor = ui.ColorWhite - p.BorderLabel = "Text Box" - p.BorderFg = ui.ColorCyan - - g := ui.NewGauge() - g.Percent = 50 - g.Width = 50 - g.Height = 3 - g.Y = 11 - g.BorderLabel = "Gauge" - g.BarColor = ui.ColorRed - g.BorderFg = ui.ColorWhite - g.BorderLabelFg = ui.ColorCyan - - ui.Render(p, g) // feel free to call Render, it's async and non-block - - // event handler... - } -````` - -Note that components can be overlapped (I'd rather call this a feature...), `Render(rs ...Renderer)` renders its args from left to right (i.e. each component's weight is arising from left to right). - -__Grid layout:__ - -grid - -Grid layout uses [12 columns grid system](http://www.w3schools.com/bootstrap/bootstrap_grid_system.asp) with expressive syntax. To use `Grid`, all we need to do is build a widget tree consisting of `Row`s and `Col`s (Actually a `Col` is also a `Row` but with a widget endpoint attached). - -```go - import ui "github.com/gizak/termui" - // init and create widgets... - - // build - ui.Body.AddRows( - ui.NewRow( - ui.NewCol(6, 0, widget0), - ui.NewCol(6, 0, widget1)), - ui.NewRow( - ui.NewCol(3, 0, widget2), - ui.NewCol(3, 0, widget30, widget31, widget32), - ui.NewCol(6, 0, widget4))) - - // calculate layout - ui.Body.Align() - - ui.Render(ui.Body) -``` - -### Events - -`termui` ships with a http-like event mux handling system. All events are channeled up from different sources (typing, click, windows resize, custom event) and then encoded as universal `Event` object. `Event.Path` indicates the event type and `Event.Data` stores the event data struct. Add a handler to a certain event is easy as below: - -```go - // handle key q pressing - ui.Handle("/sys/kbd/q", func(ui.Event) { - // press q to quit - ui.StopLoop() - }) - - ui.Handle("/sys/kbd/C-x", func(ui.Event) { - // handle Ctrl + x combination - }) - - ui.Handle("/sys/kbd", func(ui.Event) { - // handle all other key pressing - }) - - // handle a 1s timer - ui.Handle("/timer/1s", func(e ui.Event) { - t := e.Data.(ui.EvtTimer) - // t is a EvtTimer - if t.Count%2 ==0 { - // do something - } - }) - - ui.Loop() // block until StopLoop is called -``` - -### Widgets - -Click image to see the corresponding demo codes. - -[par](https://github.com/gizak/termui/blob/master/_example/par.go) -[list](https://github.com/gizak/termui/blob/master/_example/list.go) -[gauge](https://github.com/gizak/termui/blob/master/_example/gauge.go) -[linechart](https://github.com/gizak/termui/blob/master/_example/linechart.go) -[barchart](https://github.com/gizak/termui/blob/master/_example/barchart.go) -[barchart](https://github.com/gizak/termui/blob/master/_example/mbarchart.go) -[sparklines](https://github.com/gizak/termui/blob/master/_example/sparklines.go) -[table](https://github.com/gizak/termui/blob/master/_example/table.go) - -## GoDoc - -[godoc](https://godoc.org/github.com/gizak/termui) - -## TODO - -- [x] Grid layout -- [x] Event system -- [x] Canvas widget -- [x] Refine APIs -- [ ] Focusable widgets - -## Changelog - -## License -This library is under the [MIT License](http://opensource.org/licenses/MIT) diff --git a/vendor/github.com/gizak/termui/barchart.go b/vendor/github.com/gizak/termui/barchart.go deleted file mode 100644 index 6560c8b14e46..000000000000 --- a/vendor/github.com/gizak/termui/barchart.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "fmt" - -// BarChart creates multiple bars in a widget: -/* - bc := termui.NewBarChart() - data := []int{3, 2, 5, 3, 9, 5} - bclabels := []string{"S0", "S1", "S2", "S3", "S4", "S5"} - bc.BorderLabel = "Bar Chart" - bc.Data = data - bc.Width = 26 - bc.Height = 10 - bc.DataLabels = bclabels - bc.TextColor = termui.ColorGreen - bc.BarColor = termui.ColorRed - bc.NumColor = termui.ColorYellow -*/ -type BarChart struct { - Block - BarColor Attribute - TextColor Attribute - NumColor Attribute - Data []int - DataLabels []string - BarWidth int - BarGap int - CellChar rune - labels [][]rune - dataNum [][]rune - numBar int - scale float64 - max int -} - -// NewBarChart returns a new *BarChart with current theme. -func NewBarChart() *BarChart { - bc := &BarChart{Block: *NewBlock()} - bc.BarColor = ThemeAttr("barchart.bar.bg") - bc.NumColor = ThemeAttr("barchart.num.fg") - bc.TextColor = ThemeAttr("barchart.text.fg") - bc.BarGap = 1 - bc.BarWidth = 3 - bc.CellChar = ' ' - return bc -} - -func (bc *BarChart) layout() { - bc.numBar = bc.innerArea.Dx() / (bc.BarGap + bc.BarWidth) - bc.labels = make([][]rune, bc.numBar) - bc.dataNum = make([][]rune, len(bc.Data)) - - for i := 0; i < bc.numBar && i < len(bc.DataLabels) && i < len(bc.Data); i++ { - bc.labels[i] = trimStr2Runes(bc.DataLabels[i], bc.BarWidth) - n := bc.Data[i] - s := fmt.Sprint(n) - bc.dataNum[i] = trimStr2Runes(s, bc.BarWidth) - } - - //bc.max = bc.Data[0] // what if Data is nil? Sometimes when bar graph is nill it produces panic with panic: runtime error: index out of range - // Asign a negative value to get maxvalue auto-populates - if bc.max == 0 { - bc.max = -1 - } - for i := 0; i < len(bc.Data); i++ { - if bc.max < bc.Data[i] { - bc.max = bc.Data[i] - } - } - bc.scale = float64(bc.max) / float64(bc.innerArea.Dy()-1) -} - -func (bc *BarChart) SetMax(max int) { - - if max > 0 { - bc.max = max - } -} - -// Buffer implements Bufferer interface. -func (bc *BarChart) Buffer() Buffer { - buf := bc.Block.Buffer() - bc.layout() - - for i := 0; i < bc.numBar && i < len(bc.Data) && i < len(bc.DataLabels); i++ { - h := int(float64(bc.Data[i]) / bc.scale) - oftX := i * (bc.BarWidth + bc.BarGap) - - barBg := bc.Bg - barFg := bc.BarColor - - if bc.CellChar == ' ' { - barBg = bc.BarColor - barFg = ColorDefault - if bc.BarColor == ColorDefault { // the same as above - barBg |= AttrReverse - } - } - - // plot bar - for j := 0; j < bc.BarWidth; j++ { - for k := 0; k < h; k++ { - c := Cell{ - Ch: bc.CellChar, - Bg: barBg, - Fg: barFg, - } - - x := bc.innerArea.Min.X + i*(bc.BarWidth+bc.BarGap) + j - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - k - buf.Set(x, y, c) - } - } - // plot text - for j, k := 0, 0; j < len(bc.labels[i]); j++ { - w := charWidth(bc.labels[i][j]) - c := Cell{ - Ch: bc.labels[i][j], - Bg: bc.Bg, - Fg: bc.TextColor, - } - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 1 - x := bc.innerArea.Min.X + oftX + k - buf.Set(x, y, c) - k += w - } - // plot num - for j := 0; j < len(bc.dataNum[i]); j++ { - c := Cell{ - Ch: bc.dataNum[i][j], - Fg: bc.NumColor, - Bg: barBg, - } - - if h == 0 { - c.Bg = bc.Bg - } - x := bc.innerArea.Min.X + oftX + (bc.BarWidth-len(bc.dataNum[i]))/2 + j - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - buf.Set(x, y, c) - } - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/block.go b/vendor/github.com/gizak/termui/block.go deleted file mode 100644 index 3e8571bc2326..000000000000 --- a/vendor/github.com/gizak/termui/block.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "image" - -// Hline is a horizontal line. -type Hline struct { - X int - Y int - Len int - Fg Attribute - Bg Attribute -} - -// Vline is a vertical line. -type Vline struct { - X int - Y int - Len int - Fg Attribute - Bg Attribute -} - -// Buffer draws a horizontal line. -func (l Hline) Buffer() Buffer { - if l.Len <= 0 { - return NewBuffer() - } - return NewFilledBuffer(l.X, l.Y, l.X+l.Len, l.Y+1, HORIZONTAL_LINE, l.Fg, l.Bg) -} - -// Buffer draws a vertical line. -func (l Vline) Buffer() Buffer { - if l.Len <= 0 { - return NewBuffer() - } - return NewFilledBuffer(l.X, l.Y, l.X+1, l.Y+l.Len, VERTICAL_LINE, l.Fg, l.Bg) -} - -// Buffer draws a box border. -func (b Block) drawBorder(buf Buffer) { - if !b.Border { - return - } - - min := b.area.Min - max := b.area.Max - - x0 := min.X - y0 := min.Y - x1 := max.X - 1 - y1 := max.Y - 1 - - // draw lines - if b.BorderTop { - buf.Merge(Hline{x0, y0, x1 - x0, b.BorderFg, b.BorderBg}.Buffer()) - } - if b.BorderBottom { - buf.Merge(Hline{x0, y1, x1 - x0, b.BorderFg, b.BorderBg}.Buffer()) - } - if b.BorderLeft { - buf.Merge(Vline{x0, y0, y1 - y0, b.BorderFg, b.BorderBg}.Buffer()) - } - if b.BorderRight { - buf.Merge(Vline{x1, y0, y1 - y0, b.BorderFg, b.BorderBg}.Buffer()) - } - - // draw corners - if b.BorderTop && b.BorderLeft && b.area.Dx() > 0 && b.area.Dy() > 0 { - buf.Set(x0, y0, Cell{TOP_LEFT, b.BorderFg, b.BorderBg}) - } - if b.BorderTop && b.BorderRight && b.area.Dx() > 1 && b.area.Dy() > 0 { - buf.Set(x1, y0, Cell{TOP_RIGHT, b.BorderFg, b.BorderBg}) - } - if b.BorderBottom && b.BorderLeft && b.area.Dx() > 0 && b.area.Dy() > 1 { - buf.Set(x0, y1, Cell{BOTTOM_LEFT, b.BorderFg, b.BorderBg}) - } - if b.BorderBottom && b.BorderRight && b.area.Dx() > 1 && b.area.Dy() > 1 { - buf.Set(x1, y1, Cell{BOTTOM_RIGHT, b.BorderFg, b.BorderBg}) - } -} - -func (b Block) drawBorderLabel(buf Buffer) { - maxTxtW := b.area.Dx() - 2 - tx := DTrimTxCls(DefaultTxBuilder.Build(b.BorderLabel, b.BorderLabelFg, b.BorderLabelBg), maxTxtW) - - for i, w := 0, 0; i < len(tx); i++ { - buf.Set(b.area.Min.X+1+w, b.area.Min.Y, tx[i]) - w += tx[i].Width() - } -} - -// Block is a base struct for all other upper level widgets, -// consider it as css: display:block. -// Normally you do not need to create it manually. -type Block struct { - area image.Rectangle - innerArea image.Rectangle - X int - Y int - Border bool - BorderFg Attribute - BorderBg Attribute - BorderLeft bool - BorderRight bool - BorderTop bool - BorderBottom bool - BorderLabel string - BorderLabelFg Attribute - BorderLabelBg Attribute - Display bool - Bg Attribute - Width int - Height int - PaddingTop int - PaddingBottom int - PaddingLeft int - PaddingRight int - id string - Float Align -} - -// NewBlock returns a *Block which inherits styles from current theme. -func NewBlock() *Block { - b := Block{} - b.Display = true - b.Border = true - b.BorderLeft = true - b.BorderRight = true - b.BorderTop = true - b.BorderBottom = true - b.BorderBg = ThemeAttr("border.bg") - b.BorderFg = ThemeAttr("border.fg") - b.BorderLabelBg = ThemeAttr("label.bg") - b.BorderLabelFg = ThemeAttr("label.fg") - b.Bg = ThemeAttr("block.bg") - b.Width = 2 - b.Height = 2 - b.id = GenId() - b.Float = AlignNone - return &b -} - -func (b Block) Id() string { - return b.id -} - -// Align computes box model -func (b *Block) Align() { - // outer - b.area.Min.X = 0 - b.area.Min.Y = 0 - b.area.Max.X = b.Width - b.area.Max.Y = b.Height - - // float - b.area = AlignArea(TermRect(), b.area, b.Float) - b.area = MoveArea(b.area, b.X, b.Y) - - // inner - b.innerArea.Min.X = b.area.Min.X + b.PaddingLeft - b.innerArea.Min.Y = b.area.Min.Y + b.PaddingTop - b.innerArea.Max.X = b.area.Max.X - b.PaddingRight - b.innerArea.Max.Y = b.area.Max.Y - b.PaddingBottom - - if b.Border { - if b.BorderLeft { - b.innerArea.Min.X++ - } - if b.BorderRight { - b.innerArea.Max.X-- - } - if b.BorderTop { - b.innerArea.Min.Y++ - } - if b.BorderBottom { - b.innerArea.Max.Y-- - } - } -} - -// InnerBounds returns the internal bounds of the block after aligning and -// calculating the padding and border, if any. -func (b *Block) InnerBounds() image.Rectangle { - b.Align() - return b.innerArea -} - -// Buffer implements Bufferer interface. -// Draw background and border (if any). -func (b *Block) Buffer() Buffer { - b.Align() - - buf := NewBuffer() - buf.SetArea(b.area) - buf.Fill(' ', ColorDefault, b.Bg) - - b.drawBorder(buf) - b.drawBorderLabel(buf) - - return buf -} - -// GetHeight implements GridBufferer. -// It returns current height of the block. -func (b Block) GetHeight() int { - return b.Height -} - -// SetX implements GridBufferer interface, which sets block's x position. -func (b *Block) SetX(x int) { - b.X = x -} - -// SetY implements GridBufferer interface, it sets y position for block. -func (b *Block) SetY(y int) { - b.Y = y -} - -// SetWidth implements GridBuffer interface, it sets block's width. -func (b *Block) SetWidth(w int) { - b.Width = w -} - -func (b Block) InnerWidth() int { - return b.innerArea.Dx() -} - -func (b Block) InnerHeight() int { - return b.innerArea.Dy() -} - -func (b Block) InnerX() int { - return b.innerArea.Min.X -} - -func (b Block) InnerY() int { return b.innerArea.Min.Y } diff --git a/vendor/github.com/gizak/termui/block_common.go b/vendor/github.com/gizak/termui/block_common.go deleted file mode 100644 index 6438bf217dd7..000000000000 --- a/vendor/github.com/gizak/termui/block_common.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -// +build !windows - -package termui - -const TOP_RIGHT = '┐' -const VERTICAL_LINE = '│' -const HORIZONTAL_LINE = '─' -const TOP_LEFT = '┌' -const BOTTOM_RIGHT = '┘' -const BOTTOM_LEFT = '└' -const VERTICAL_LEFT = '┤' -const VERTICAL_RIGHT = '├' -const HORIZONTAL_DOWN = '┬' -const HORIZONTAL_UP = '┴' -const QUOTA_LEFT = '«' -const QUOTA_RIGHT = '»' diff --git a/vendor/github.com/gizak/termui/block_windows.go b/vendor/github.com/gizak/termui/block_windows.go deleted file mode 100644 index a4fba77d7c31..000000000000 --- a/vendor/github.com/gizak/termui/block_windows.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -// +build windows - -package termui - -const TOP_RIGHT = '+' -const VERTICAL_LINE = '|' -const HORIZONTAL_LINE = '-' -const TOP_LEFT = '+' -const BOTTOM_RIGHT = '+' -const BOTTOM_LEFT = '+' diff --git a/vendor/github.com/gizak/termui/buffer.go b/vendor/github.com/gizak/termui/buffer.go deleted file mode 100644 index 9e3a97345d25..000000000000 --- a/vendor/github.com/gizak/termui/buffer.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "image" - -// Cell is a rune with assigned Fg and Bg -type Cell struct { - Ch rune - Fg Attribute - Bg Attribute -} - -// Buffer is a renderable rectangle cell data container. -type Buffer struct { - Area image.Rectangle // selected drawing area - CellMap map[image.Point]Cell -} - -// At returns the cell at (x,y). -func (b Buffer) At(x, y int) Cell { - return b.CellMap[image.Pt(x, y)] -} - -// Set assigns a char to (x,y) -func (b Buffer) Set(x, y int, c Cell) { - b.CellMap[image.Pt(x, y)] = c -} - -// Bounds returns the domain for which At can return non-zero color. -func (b Buffer) Bounds() image.Rectangle { - x0, y0, x1, y1 := 0, 0, 0, 0 - for p := range b.CellMap { - if p.X > x1 { - x1 = p.X - } - if p.X < x0 { - x0 = p.X - } - if p.Y > y1 { - y1 = p.Y - } - if p.Y < y0 { - y0 = p.Y - } - } - return image.Rect(x0, y0, x1+1, y1+1) -} - -// SetArea assigns a new rect area to Buffer b. -func (b *Buffer) SetArea(r image.Rectangle) { - b.Area.Max = r.Max - b.Area.Min = r.Min -} - -// Sync sets drawing area to the buffer's bound -func (b *Buffer) Sync() { - b.SetArea(b.Bounds()) -} - -// NewCell returns a new cell -func NewCell(ch rune, fg, bg Attribute) Cell { - return Cell{ch, fg, bg} -} - -// Merge merges bs Buffers onto b -func (b *Buffer) Merge(bs ...Buffer) { - for _, buf := range bs { - for p, v := range buf.CellMap { - b.Set(p.X, p.Y, v) - } - b.SetArea(b.Area.Union(buf.Area)) - } -} - -// NewBuffer returns a new Buffer -func NewBuffer() Buffer { - return Buffer{ - CellMap: make(map[image.Point]Cell), - Area: image.Rectangle{}} -} - -// Fill fills the Buffer b with ch,fg and bg. -func (b Buffer) Fill(ch rune, fg, bg Attribute) { - for x := b.Area.Min.X; x < b.Area.Max.X; x++ { - for y := b.Area.Min.Y; y < b.Area.Max.Y; y++ { - b.Set(x, y, Cell{ch, fg, bg}) - } - } -} - -// NewFilledBuffer returns a new Buffer filled with ch, fb and bg. -func NewFilledBuffer(x0, y0, x1, y1 int, ch rune, fg, bg Attribute) Buffer { - buf := NewBuffer() - buf.Area.Min = image.Pt(x0, y0) - buf.Area.Max = image.Pt(x1, y1) - - for x := buf.Area.Min.X; x < buf.Area.Max.X; x++ { - for y := buf.Area.Min.Y; y < buf.Area.Max.Y; y++ { - buf.Set(x, y, Cell{ch, fg, bg}) - } - } - return buf -} diff --git a/vendor/github.com/gizak/termui/canvas.go b/vendor/github.com/gizak/termui/canvas.go deleted file mode 100644 index 6d2513ebd4f1..000000000000 --- a/vendor/github.com/gizak/termui/canvas.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -/* -dots: - ,___, - |1 4| - |2 5| - |3 6| - |7 8| - ````` -*/ - -var brailleBase = '\u2800' - -var brailleOftMap = [4][2]rune{ - {'\u0001', '\u0008'}, - {'\u0002', '\u0010'}, - {'\u0004', '\u0020'}, - {'\u0040', '\u0080'}} - -// Canvas contains drawing map: i,j -> rune -type Canvas map[[2]int]rune - -// NewCanvas returns an empty Canvas -func NewCanvas() Canvas { - return make(map[[2]int]rune) -} - -func chOft(x, y int) rune { - return brailleOftMap[y%4][x%2] -} - -func (c Canvas) rawCh(x, y int) rune { - if ch, ok := c[[2]int{x, y}]; ok { - return ch - } - return '\u0000' //brailleOffset -} - -// return coordinate in terminal -func chPos(x, y int) (int, int) { - return y / 4, x / 2 -} - -// Set sets a point (x,y) in the virtual coordinate -func (c Canvas) Set(x, y int) { - i, j := chPos(x, y) - ch := c.rawCh(i, j) - ch |= chOft(x, y) - c[[2]int{i, j}] = ch -} - -// Unset removes point (x,y) -func (c Canvas) Unset(x, y int) { - i, j := chPos(x, y) - ch := c.rawCh(i, j) - ch &= ^chOft(x, y) - c[[2]int{i, j}] = ch -} - -// Buffer returns un-styled points -func (c Canvas) Buffer() Buffer { - buf := NewBuffer() - for k, v := range c { - buf.Set(k[0], k[1], Cell{Ch: v + brailleBase}) - } - return buf -} diff --git a/vendor/github.com/gizak/termui/config.py b/vendor/github.com/gizak/termui/config.py deleted file mode 100644 index 30fadcf86897..000000000000 --- a/vendor/github.com/gizak/termui/config.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 - -import re -import os -import io - -copyright = """// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -""" - -exclude_dirs = [".git", "_docs"] -exclude_files = [] -include_dirs = [".", "debug", "extra", "test", "_example"] - - -def is_target(fpath): - if os.path.splitext(fpath)[-1] == ".go": - return True - return False - - -def update_copyright(fpath): - print("processing " + fpath) - f = io.open(fpath, 'r', encoding='utf-8') - fstr = f.read() - f.close() - - # remove old - m = re.search('^// Copyright .+?\r?\n\r?\n', fstr, re.MULTILINE|re.DOTALL) - if m: - fstr = fstr[m.end():] - - # add new - fstr = copyright + fstr - f = io.open(fpath, 'w',encoding='utf-8') - f.write(fstr) - f.close() - - -def main(): - for d in include_dirs: - files = [ - os.path.join(d, f) for f in os.listdir(d) - if os.path.isfile(os.path.join(d, f)) - ] - for f in files: - if is_target(f): - update_copyright(f) - - -if __name__ == '__main__': - main() diff --git a/vendor/github.com/gizak/termui/doc.go b/vendor/github.com/gizak/termui/doc.go deleted file mode 100644 index 13924eb1f7d7..000000000000 --- a/vendor/github.com/gizak/termui/doc.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -/* -Package termui is a library designed for creating command line UI. For more info, goto http://github.com/gizak/termui - -A simplest example: - package main - - import ui "github.com/gizak/termui" - - func main() { - if err:=ui.Init(); err != nil { - panic(err) - } - defer ui.Close() - - g := ui.NewGauge() - g.Percent = 50 - g.Width = 50 - g.BorderLabel = "Gauge" - - ui.Render(g) - - ui.Loop() - } -*/ -package termui diff --git a/vendor/github.com/gizak/termui/events.go b/vendor/github.com/gizak/termui/events.go deleted file mode 100644 index 16d9bd9cc34a..000000000000 --- a/vendor/github.com/gizak/termui/events.go +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "path" - "strconv" - "sync" - "time" - - "github.com/nsf/termbox-go" -) - -type Event struct { - Type string - Path string - From string - To string - Data interface{} - Time int64 -} - -var sysEvtChs []chan Event - -type EvtKbd struct { - KeyStr string -} - -func evtKbd(e termbox.Event) EvtKbd { - ek := EvtKbd{} - - k := string(e.Ch) - pre := "" - mod := "" - - if e.Mod == termbox.ModAlt { - mod = "M-" - } - if e.Ch == 0 { - if e.Key > 0xFFFF-12 { - k = "" - } else if e.Key > 0xFFFF-25 { - ks := []string{"", "", "", "", "", "", "", "", "", ""} - k = ks[0xFFFF-int(e.Key)-12] - } - - if e.Key <= 0x7F { - pre = "C-" - k = string('a' - 1 + int(e.Key)) - kmap := map[termbox.Key][2]string{ - termbox.KeyCtrlSpace: {"C-", ""}, - termbox.KeyBackspace: {"", ""}, - termbox.KeyTab: {"", ""}, - termbox.KeyEnter: {"", ""}, - termbox.KeyEsc: {"", ""}, - termbox.KeyCtrlBackslash: {"C-", "\\"}, - termbox.KeyCtrlSlash: {"C-", "/"}, - termbox.KeySpace: {"", ""}, - termbox.KeyCtrl8: {"C-", "8"}, - } - if sk, ok := kmap[e.Key]; ok { - pre = sk[0] - k = sk[1] - } - } - } - - ek.KeyStr = pre + mod + k - return ek -} - -func crtTermboxEvt(e termbox.Event) Event { - systypemap := map[termbox.EventType]string{ - termbox.EventKey: "keyboard", - termbox.EventResize: "window", - termbox.EventMouse: "mouse", - termbox.EventError: "error", - termbox.EventInterrupt: "interrupt", - } - ne := Event{From: "/sys", Time: time.Now().Unix()} - typ := e.Type - ne.Type = systypemap[typ] - - switch typ { - case termbox.EventKey: - kbd := evtKbd(e) - ne.Path = "/sys/kbd/" + kbd.KeyStr - ne.Data = kbd - case termbox.EventResize: - wnd := EvtWnd{} - wnd.Width = e.Width - wnd.Height = e.Height - ne.Path = "/sys/wnd/resize" - ne.Data = wnd - case termbox.EventError: - err := EvtErr(e.Err) - ne.Path = "/sys/err" - ne.Data = err - case termbox.EventMouse: - m := EvtMouse{} - m.X = e.MouseX - m.Y = e.MouseY - ne.Path = "/sys/mouse" - ne.Data = m - } - return ne -} - -type EvtWnd struct { - Width int - Height int -} - -type EvtMouse struct { - X int - Y int - Press string -} - -type EvtErr error - -func hookTermboxEvt() { - for { - e := termbox.PollEvent() - - for _, c := range sysEvtChs { - go func(ch chan Event) { - ch <- crtTermboxEvt(e) - }(c) - } - } -} - -func NewSysEvtCh() chan Event { - ec := make(chan Event) - sysEvtChs = append(sysEvtChs, ec) - return ec -} - -var DefaultEvtStream = NewEvtStream() - -type EvtStream struct { - sync.RWMutex - srcMap map[string]chan Event - stream chan Event - wg sync.WaitGroup - sigStopLoop chan Event - Handlers map[string]func(Event) - hook func(Event) -} - -func NewEvtStream() *EvtStream { - return &EvtStream{ - srcMap: make(map[string]chan Event), - stream: make(chan Event), - Handlers: make(map[string]func(Event)), - sigStopLoop: make(chan Event), - } -} - -func (es *EvtStream) Init() { - es.Merge("internal", es.sigStopLoop) - go func() { - es.wg.Wait() - close(es.stream) - }() -} - -func cleanPath(p string) string { - if p == "" { - return "/" - } - if p[0] != '/' { - p = "/" + p - } - return path.Clean(p) -} - -func isPathMatch(pattern, path string) bool { - if len(pattern) == 0 { - return false - } - n := len(pattern) - return len(path) >= n && path[0:n] == pattern -} - -func (es *EvtStream) Merge(name string, ec chan Event) { - es.Lock() - defer es.Unlock() - - es.wg.Add(1) - es.srcMap[name] = ec - - go func(a chan Event) { - for n := range a { - n.From = name - es.stream <- n - } - es.wg.Done() - }(ec) -} - -func (es *EvtStream) Handle(path string, handler func(Event)) { - es.Handlers[cleanPath(path)] = handler -} - -func findMatch(mux map[string]func(Event), path string) string { - n := -1 - pattern := "" - for m := range mux { - if !isPathMatch(m, path) { - continue - } - if len(m) > n { - pattern = m - n = len(m) - } - } - return pattern - -} - -// Remove all existing defined Handlers from the map -func (es *EvtStream) ResetHandlers() { - for Path, _ := range es.Handlers { - delete(es.Handlers, Path) - } - return -} - -func (es *EvtStream) match(path string) string { - return findMatch(es.Handlers, path) -} - -func (es *EvtStream) Hook(f func(Event)) { - es.hook = f -} - -func (es *EvtStream) Loop() { - for e := range es.stream { - switch e.Path { - case "/sig/stoploop": - return - } - go func(a Event) { - es.RLock() - defer es.RUnlock() - if pattern := es.match(a.Path); pattern != "" { - es.Handlers[pattern](a) - } - }(e) - if es.hook != nil { - es.hook(e) - } - } -} - -func (es *EvtStream) StopLoop() { - go func() { - e := Event{ - Path: "/sig/stoploop", - } - es.sigStopLoop <- e - }() -} - -func Merge(name string, ec chan Event) { - DefaultEvtStream.Merge(name, ec) -} - -func Handle(path string, handler func(Event)) { - DefaultEvtStream.Handle(path, handler) -} - -func Loop() { - DefaultEvtStream.Loop() -} - -func StopLoop() { - DefaultEvtStream.StopLoop() -} - -type EvtTimer struct { - Duration time.Duration - Count uint64 -} - -func NewTimerCh(du time.Duration) chan Event { - t := make(chan Event) - - go func(a chan Event) { - n := uint64(0) - for { - n++ - time.Sleep(du) - e := Event{} - e.Type = "timer" - e.Path = "/timer/" + du.String() - e.Time = time.Now().Unix() - e.Data = EvtTimer{ - Duration: du, - Count: n, - } - t <- e - - } - }(t) - return t -} - -var DefaultHandler = func(e Event) { -} - -var usrEvtCh = make(chan Event) - -func SendCustomEvt(path string, data interface{}) { - e := Event{} - e.Path = path - e.Data = data - e.Time = time.Now().Unix() - usrEvtCh <- e -} diff --git a/vendor/github.com/gizak/termui/gauge.go b/vendor/github.com/gizak/termui/gauge.go deleted file mode 100644 index 9f6ce3a706c2..000000000000 --- a/vendor/github.com/gizak/termui/gauge.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "strconv" - "strings" -) - -// Gauge is a progress bar like widget. -// A simple example: -/* - g := termui.NewGauge() - g.Percent = 40 - g.Width = 50 - g.Height = 3 - g.BorderLabel = "Slim Gauge" - g.BarColor = termui.ColorRed - g.PercentColor = termui.ColorBlue -*/ - -const ColorUndef Attribute = Attribute(^uint16(0)) - -type Gauge struct { - Block - Percent int - BarColor Attribute - PercentColor Attribute - PercentColorHighlighted Attribute - Label string - LabelAlign Align -} - -// NewGauge return a new gauge with current theme. -func NewGauge() *Gauge { - g := &Gauge{ - Block: *NewBlock(), - PercentColor: ThemeAttr("gauge.percent.fg"), - BarColor: ThemeAttr("gauge.bar.bg"), - Label: "{{percent}}%", - LabelAlign: AlignCenter, - PercentColorHighlighted: ColorUndef, - } - - g.Width = 12 - g.Height = 5 - return g -} - -// Buffer implements Bufferer interface. -func (g *Gauge) Buffer() Buffer { - buf := g.Block.Buffer() - - // plot bar - w := g.Percent * g.innerArea.Dx() / 100 - for i := 0; i < g.innerArea.Dy(); i++ { - for j := 0; j < w; j++ { - c := Cell{} - c.Ch = ' ' - c.Bg = g.BarColor - if c.Bg == ColorDefault { - c.Bg |= AttrReverse - } - buf.Set(g.innerArea.Min.X+j, g.innerArea.Min.Y+i, c) - } - } - - // plot percentage - s := strings.Replace(g.Label, "{{percent}}", strconv.Itoa(g.Percent), -1) - pry := g.innerArea.Min.Y + g.innerArea.Dy()/2 - rs := str2runes(s) - var pos int - switch g.LabelAlign { - case AlignLeft: - pos = 0 - - case AlignCenter: - pos = (g.innerArea.Dx() - strWidth(s)) / 2 - - case AlignRight: - pos = g.innerArea.Dx() - strWidth(s) - 1 - } - pos += g.innerArea.Min.X - - for i, v := range rs { - c := Cell{ - Ch: v, - Fg: g.PercentColor, - } - - if w+g.innerArea.Min.X > pos+i { - c.Bg = g.BarColor - if c.Bg == ColorDefault { - c.Bg |= AttrReverse - } - - if g.PercentColorHighlighted != ColorUndef { - c.Fg = g.PercentColorHighlighted - } - } else { - c.Bg = g.Block.Bg - } - - buf.Set(1+pos+i, pry, c) - } - return buf -} diff --git a/vendor/github.com/gizak/termui/glide.lock b/vendor/github.com/gizak/termui/glide.lock deleted file mode 100644 index be5952d4666d..000000000000 --- a/vendor/github.com/gizak/termui/glide.lock +++ /dev/null @@ -1,30 +0,0 @@ -hash: 7a754ba100256404a978b2fc8738aee337beb822458e4b6060399fb89ebd215c -updated: 2016-11-03T17:39:24.323773674-04:00 -imports: -- name: github.com/maruel/panicparse - version: ad661195ed0e88491e0f14be6613304e3b1141d6 - subpackages: - - stack -- name: github.com/mattn/go-runewidth - version: 737072b4e32b7a5018b4a7125da8d12de90e8045 -- name: github.com/mitchellh/go-wordwrap - version: ad45545899c7b13c020ea92b2072220eefad42b8 -- name: github.com/nsf/termbox-go - version: b6acae516ace002cb8105a89024544a1480655a5 -- name: golang.org/x/net - version: 569280fa63be4e201b975e5411e30a92178f0118 - subpackages: - - websocket -testImports: -- name: github.com/davecgh/go-spew - version: 346938d642f2ec3594ed81d874461961cd0faa76 - subpackages: - - spew -- name: github.com/pmezard/go-difflib - version: d8ed2627bdf02c080bf22230dbb337003b7aba2d - subpackages: - - difflib -- name: github.com/stretchr/testify - version: 976c720a22c8eb4eb6a0b4348ad85ad12491a506 - subpackages: - - assert diff --git a/vendor/github.com/gizak/termui/glide.yaml b/vendor/github.com/gizak/termui/glide.yaml deleted file mode 100644 index a6812317f7a6..000000000000 --- a/vendor/github.com/gizak/termui/glide.yaml +++ /dev/null @@ -1,9 +0,0 @@ -package: github.com/gizak/termui -import: -- package: github.com/mattn/go-runewidth -- package: github.com/mitchellh/go-wordwrap -- package: github.com/nsf/termbox-go -- package: golang.org/x/net - subpackages: - - websocket -- package: github.com/maruel/panicparse diff --git a/vendor/github.com/gizak/termui/grid.go b/vendor/github.com/gizak/termui/grid.go deleted file mode 100644 index a9502322535a..000000000000 --- a/vendor/github.com/gizak/termui/grid.go +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -// GridBufferer introduces a Bufferer that can be manipulated by Grid. -type GridBufferer interface { - Bufferer - GetHeight() int - SetWidth(int) - SetX(int) - SetY(int) -} - -// Row builds a layout tree -type Row struct { - Cols []*Row //children - Widget GridBufferer // root - X int - Y int - Width int - Height int - Span int - Offset int -} - -// calculate and set the underlying layout tree's x, y, height and width. -func (r *Row) calcLayout() { - r.assignWidth(r.Width) - r.Height = r.solveHeight() - r.assignX(r.X) - r.assignY(r.Y) -} - -// tell if the node is leaf in the tree. -func (r *Row) isLeaf() bool { - return r.Cols == nil || len(r.Cols) == 0 -} - -func (r *Row) isRenderableLeaf() bool { - return r.isLeaf() && r.Widget != nil -} - -// assign widgets' (and their parent rows') width recursively. -func (r *Row) assignWidth(w int) { - r.SetWidth(w) - - accW := 0 // acc span and offset - calcW := make([]int, len(r.Cols)) // calculated width - calcOftX := make([]int, len(r.Cols)) // computated start position of x - - for i, c := range r.Cols { - accW += c.Span + c.Offset - cw := int(float64(c.Span*r.Width) / 12.0) - - if i >= 1 { - calcOftX[i] = calcOftX[i-1] + - calcW[i-1] + - int(float64(r.Cols[i-1].Offset*r.Width)/12.0) - } - - // use up the space if it is the last col - if i == len(r.Cols)-1 && accW == 12 { - cw = r.Width - calcOftX[i] - } - calcW[i] = cw - r.Cols[i].assignWidth(cw) - } -} - -// bottom up calc and set rows' (and their widgets') height, -// return r's total height. -func (r *Row) solveHeight() int { - if r.isRenderableLeaf() { - r.Height = r.Widget.GetHeight() - return r.Widget.GetHeight() - } - - maxh := 0 - if !r.isLeaf() { - for _, c := range r.Cols { - nh := c.solveHeight() - // when embed rows in Cols, row widgets stack up - if r.Widget != nil { - nh += r.Widget.GetHeight() - } - if nh > maxh { - maxh = nh - } - } - } - - r.Height = maxh - return maxh -} - -// recursively assign x position for r tree. -func (r *Row) assignX(x int) { - r.SetX(x) - - if !r.isLeaf() { - acc := 0 - for i, c := range r.Cols { - if c.Offset != 0 { - acc += int(float64(c.Offset*r.Width) / 12.0) - } - r.Cols[i].assignX(x + acc) - acc += c.Width - } - } -} - -// recursively assign y position to r. -func (r *Row) assignY(y int) { - r.SetY(y) - - if r.isLeaf() { - return - } - - for i := range r.Cols { - acc := 0 - if r.Widget != nil { - acc = r.Widget.GetHeight() - } - r.Cols[i].assignY(y + acc) - } - -} - -// GetHeight implements GridBufferer interface. -func (r Row) GetHeight() int { - return r.Height -} - -// SetX implements GridBufferer interface. -func (r *Row) SetX(x int) { - r.X = x - if r.Widget != nil { - r.Widget.SetX(x) - } -} - -// SetY implements GridBufferer interface. -func (r *Row) SetY(y int) { - r.Y = y - if r.Widget != nil { - r.Widget.SetY(y) - } -} - -// SetWidth implements GridBufferer interface. -func (r *Row) SetWidth(w int) { - r.Width = w - if r.Widget != nil { - r.Widget.SetWidth(w) - } -} - -// Buffer implements Bufferer interface, -// recursively merge all widgets buffer -func (r *Row) Buffer() Buffer { - merged := NewBuffer() - - if r.isRenderableLeaf() { - return r.Widget.Buffer() - } - - // for those are not leaves but have a renderable widget - if r.Widget != nil { - merged.Merge(r.Widget.Buffer()) - } - - // collect buffer from children - if !r.isLeaf() { - for _, c := range r.Cols { - merged.Merge(c.Buffer()) - } - } - - return merged -} - -// Grid implements 12 columns system. -// A simple example: -/* - import ui "github.com/gizak/termui" - // init and create widgets... - - // build - ui.Body.AddRows( - ui.NewRow( - ui.NewCol(6, 0, widget0), - ui.NewCol(6, 0, widget1)), - ui.NewRow( - ui.NewCol(3, 0, widget2), - ui.NewCol(3, 0, widget30, widget31, widget32), - ui.NewCol(6, 0, widget4))) - - // calculate layout - ui.Body.Align() - - ui.Render(ui.Body) -*/ -type Grid struct { - Rows []*Row - Width int - X int - Y int - BgColor Attribute -} - -// NewGrid returns *Grid with given rows. -func NewGrid(rows ...*Row) *Grid { - return &Grid{Rows: rows} -} - -// AddRows appends given rows to Grid. -func (g *Grid) AddRows(rs ...*Row) { - g.Rows = append(g.Rows, rs...) -} - -// NewRow creates a new row out of given columns. -func NewRow(cols ...*Row) *Row { - rs := &Row{Span: 12, Cols: cols} - return rs -} - -// NewCol accepts: widgets are LayoutBufferer or widgets is A NewRow. -// Note that if multiple widgets are provided, they will stack up in the col. -func NewCol(span, offset int, widgets ...GridBufferer) *Row { - r := &Row{Span: span, Offset: offset} - - if widgets != nil && len(widgets) == 1 { - wgt := widgets[0] - nw, isRow := wgt.(*Row) - if isRow { - r.Cols = nw.Cols - } else { - r.Widget = wgt - } - return r - } - - r.Cols = []*Row{} - ir := r - for _, w := range widgets { - nr := &Row{Span: 12, Widget: w} - ir.Cols = []*Row{nr} - ir = nr - } - - return r -} - -// Align calculate each rows' layout. -func (g *Grid) Align() { - h := 0 - for _, r := range g.Rows { - r.SetWidth(g.Width) - r.SetX(g.X) - r.SetY(g.Y + h) - r.calcLayout() - h += r.GetHeight() - } -} - -// Buffer implments Bufferer interface. -func (g Grid) Buffer() Buffer { - buf := NewBuffer() - - for _, r := range g.Rows { - buf.Merge(r.Buffer()) - } - return buf -} - -var Body *Grid diff --git a/vendor/github.com/gizak/termui/helper.go b/vendor/github.com/gizak/termui/helper.go deleted file mode 100644 index 18a677043577..000000000000 --- a/vendor/github.com/gizak/termui/helper.go +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "regexp" - "strings" - - tm "github.com/nsf/termbox-go" -) -import rw "github.com/mattn/go-runewidth" - -/* ---------------Port from termbox-go --------------------- */ - -// Attribute is printable cell's color and style. -type Attribute uint16 - -// 8 basic clolrs -const ( - ColorDefault Attribute = iota - ColorBlack - ColorRed - ColorGreen - ColorYellow - ColorBlue - ColorMagenta - ColorCyan - ColorWhite -) - -//Have a constant that defines number of colors -const NumberofColors = 8 - -// Text style -const ( - AttrBold Attribute = 1 << (iota + 9) - AttrUnderline - AttrReverse -) - -var ( - dot = "…" - dotw = rw.StringWidth(dot) -) - -/* ----------------------- End ----------------------------- */ - -func toTmAttr(x Attribute) tm.Attribute { - return tm.Attribute(x) -} - -func str2runes(s string) []rune { - return []rune(s) -} - -// Here for backwards-compatibility. -func trimStr2Runes(s string, w int) []rune { - return TrimStr2Runes(s, w) -} - -// TrimStr2Runes trims string to w[-1 rune], appends …, and returns the runes -// of that string if string is grather then n. If string is small then w, -// return the runes. -func TrimStr2Runes(s string, w int) []rune { - if w <= 0 { - return []rune{} - } - - sw := rw.StringWidth(s) - if sw > w { - return []rune(rw.Truncate(s, w, dot)) - } - return str2runes(s) -} - -// TrimStrIfAppropriate trim string to "s[:-1] + …" -// if string > width otherwise return string -func TrimStrIfAppropriate(s string, w int) string { - if w <= 0 { - return "" - } - - sw := rw.StringWidth(s) - if sw > w { - return rw.Truncate(s, w, dot) - } - - return s -} - -func strWidth(s string) int { - return rw.StringWidth(s) -} - -func charWidth(ch rune) int { - return rw.RuneWidth(ch) -} - -var whiteSpaceRegex = regexp.MustCompile(`\s`) - -// StringToAttribute converts text to a termui attribute. You may specifiy more -// then one attribute like that: "BLACK, BOLD, ...". All whitespaces -// are ignored. -func StringToAttribute(text string) Attribute { - text = whiteSpaceRegex.ReplaceAllString(strings.ToLower(text), "") - attributes := strings.Split(text, ",") - result := Attribute(0) - - for _, theAttribute := range attributes { - var match Attribute - switch theAttribute { - case "reset", "default": - match = ColorDefault - - case "black": - match = ColorBlack - - case "red": - match = ColorRed - - case "green": - match = ColorGreen - - case "yellow": - match = ColorYellow - - case "blue": - match = ColorBlue - - case "magenta": - match = ColorMagenta - - case "cyan": - match = ColorCyan - - case "white": - match = ColorWhite - - case "bold": - match = AttrBold - - case "underline": - match = AttrUnderline - - case "reverse": - match = AttrReverse - } - - result |= match - } - - return result -} - -// TextCells returns a coloured text cells []Cell -func TextCells(s string, fg, bg Attribute) []Cell { - cs := make([]Cell, 0, len(s)) - - // sequence := MarkdownTextRendererFactory{}.TextRenderer(s).Render(fg, bg) - // runes := []rune(sequence.NormalizedText) - runes := str2runes(s) - - for n := range runes { - // point, _ := sequence.PointAt(n, 0, 0) - // cs = append(cs, Cell{point.Ch, point.Fg, point.Bg}) - cs = append(cs, Cell{runes[n], fg, bg}) - } - return cs -} - -// Width returns the actual screen space the cell takes (usually 1 or 2). -func (c Cell) Width() int { - return charWidth(c.Ch) -} - -// Copy return a copy of c -func (c Cell) Copy() Cell { - return c -} - -// TrimTxCells trims the overflowed text cells sequence. -func TrimTxCells(cs []Cell, w int) []Cell { - if len(cs) <= w { - return cs - } - return cs[:w] -} - -// DTrimTxCls trims the overflowed text cells sequence and append dots at the end. -func DTrimTxCls(cs []Cell, w int) []Cell { - l := len(cs) - if l <= 0 { - return []Cell{} - } - - rt := make([]Cell, 0, w) - csw := 0 - for i := 0; i < l && csw <= w; i++ { - c := cs[i] - cw := c.Width() - - if cw+csw < w { - rt = append(rt, c) - csw += cw - } else { - rt = append(rt, Cell{'…', c.Fg, c.Bg}) - break - } - } - - return rt -} - -func CellsToStr(cs []Cell) string { - str := "" - for _, c := range cs { - str += string(c.Ch) - } - return str -} diff --git a/vendor/github.com/gizak/termui/linechart.go b/vendor/github.com/gizak/termui/linechart.go deleted file mode 100644 index f7eea28bbe45..000000000000 --- a/vendor/github.com/gizak/termui/linechart.go +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "fmt" - "math" -) - -// only 16 possible combinations, why bother -var braillePatterns = map[[2]int]rune{ - [2]int{0, 0}: '⣀', - [2]int{0, 1}: '⡠', - [2]int{0, 2}: '⡐', - [2]int{0, 3}: '⡈', - - [2]int{1, 0}: '⢄', - [2]int{1, 1}: '⠤', - [2]int{1, 2}: '⠔', - [2]int{1, 3}: '⠌', - - [2]int{2, 0}: '⢂', - [2]int{2, 1}: '⠢', - [2]int{2, 2}: '⠒', - [2]int{2, 3}: '⠊', - - [2]int{3, 0}: '⢁', - [2]int{3, 1}: '⠡', - [2]int{3, 2}: '⠑', - [2]int{3, 3}: '⠉', -} - -var lSingleBraille = [4]rune{'\u2840', '⠄', '⠂', '⠁'} -var rSingleBraille = [4]rune{'\u2880', '⠠', '⠐', '⠈'} - -// LineChart has two modes: braille(default) and dot. Using braille gives 2x capicity as dot mode, -// because one braille char can represent two data points. -/* - lc := termui.NewLineChart() - lc.BorderLabel = "braille-mode Line Chart" - lc.Data = [1.2, 1.3, 1.5, 1.7, 1.5, 1.6, 1.8, 2.0] - lc.Width = 50 - lc.Height = 12 - lc.AxesColor = termui.ColorWhite - lc.LineColor = termui.ColorGreen | termui.AttrBold - // termui.Render(lc)... -*/ -type LineChart struct { - Block - Data []float64 - DataLabels []string // if unset, the data indices will be used - Mode string // braille | dot - DotStyle rune - LineColor Attribute - scale float64 // data span per cell on y-axis - AxesColor Attribute - drawingX int - drawingY int - axisYHeight int - axisXWidth int - axisYLabelGap int - axisXLabelGap int - topValue float64 - bottomValue float64 - labelX [][]rune - labelY [][]rune - labelYSpace int - maxY float64 - minY float64 - autoLabels bool -} - -// NewLineChart returns a new LineChart with current theme. -func NewLineChart() *LineChart { - lc := &LineChart{Block: *NewBlock()} - lc.AxesColor = ThemeAttr("linechart.axes.fg") - lc.LineColor = ThemeAttr("linechart.line.fg") - lc.Mode = "braille" - lc.DotStyle = '•' - lc.axisXLabelGap = 2 - lc.axisYLabelGap = 1 - lc.bottomValue = math.Inf(1) - lc.topValue = math.Inf(-1) - return lc -} - -// one cell contains two data points -// so the capicity is 2x as dot-mode -func (lc *LineChart) renderBraille() Buffer { - buf := NewBuffer() - - // return: b -> which cell should the point be in - // m -> in the cell, divided into 4 equal height levels, which subcell? - getPos := func(d float64) (b, m int) { - cnt4 := int((d-lc.bottomValue)/(lc.scale/4) + 0.5) - b = cnt4 / 4 - m = cnt4 % 4 - return - } - // plot points - for i := 0; 2*i+1 < len(lc.Data) && i < lc.axisXWidth; i++ { - b0, m0 := getPos(lc.Data[2*i]) - b1, m1 := getPos(lc.Data[2*i+1]) - - if b0 == b1 { - c := Cell{ - Ch: braillePatterns[[2]int{m0, m1}], - Bg: lc.Bg, - Fg: lc.LineColor, - } - y := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - b0 - x := lc.innerArea.Min.X + lc.labelYSpace + 1 + i - buf.Set(x, y, c) - } else { - c0 := Cell{Ch: lSingleBraille[m0], - Fg: lc.LineColor, - Bg: lc.Bg} - x0 := lc.innerArea.Min.X + lc.labelYSpace + 1 + i - y0 := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - b0 - buf.Set(x0, y0, c0) - - c1 := Cell{Ch: rSingleBraille[m1], - Fg: lc.LineColor, - Bg: lc.Bg} - x1 := lc.innerArea.Min.X + lc.labelYSpace + 1 + i - y1 := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - b1 - buf.Set(x1, y1, c1) - } - - } - return buf -} - -func (lc *LineChart) renderDot() Buffer { - buf := NewBuffer() - for i := 0; i < len(lc.Data) && i < lc.axisXWidth; i++ { - c := Cell{ - Ch: lc.DotStyle, - Fg: lc.LineColor, - Bg: lc.Bg, - } - x := lc.innerArea.Min.X + lc.labelYSpace + 1 + i - y := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - int((lc.Data[i]-lc.bottomValue)/lc.scale+0.5) - buf.Set(x, y, c) - } - - return buf -} - -func (lc *LineChart) calcLabelX() { - lc.labelX = [][]rune{} - - for i, l := 0, 0; i < len(lc.DataLabels) && l < lc.axisXWidth; i++ { - if lc.Mode == "dot" { - if l >= len(lc.DataLabels) { - break - } - - s := str2runes(lc.DataLabels[l]) - w := strWidth(lc.DataLabels[l]) - if l+w <= lc.axisXWidth { - lc.labelX = append(lc.labelX, s) - } - l += w + lc.axisXLabelGap - } else { // braille - if 2*l >= len(lc.DataLabels) { - break - } - - s := str2runes(lc.DataLabels[2*l]) - w := strWidth(lc.DataLabels[2*l]) - if l+w <= lc.axisXWidth { - lc.labelX = append(lc.labelX, s) - } - l += w + lc.axisXLabelGap - - } - } -} - -func shortenFloatVal(x float64) string { - s := fmt.Sprintf("%.2f", x) - if len(s)-3 > 3 { - s = fmt.Sprintf("%.2e", x) - } - - if x < 0 { - s = fmt.Sprintf("%.2f", x) - } - return s -} - -func (lc *LineChart) calcLabelY() { - span := lc.topValue - lc.bottomValue - lc.scale = span / float64(lc.axisYHeight) - - n := (1 + lc.axisYHeight) / (lc.axisYLabelGap + 1) - lc.labelY = make([][]rune, n) - maxLen := 0 - for i := 0; i < n; i++ { - s := str2runes(shortenFloatVal(lc.bottomValue + float64(i)*span/float64(n))) - if len(s) > maxLen { - maxLen = len(s) - } - lc.labelY[i] = s - } - - lc.labelYSpace = maxLen -} - -func (lc *LineChart) calcLayout() { - // set datalabels if it is not provided - if (lc.DataLabels == nil || len(lc.DataLabels) == 0) || lc.autoLabels { - lc.autoLabels = true - lc.DataLabels = make([]string, len(lc.Data)) - for i := range lc.Data { - lc.DataLabels[i] = fmt.Sprint(i) - } - } - - // lazy increase, to avoid y shaking frequently - // update bound Y when drawing is gonna overflow - lc.minY = lc.Data[0] - lc.maxY = lc.Data[0] - - // valid visible range - vrange := lc.innerArea.Dx() - if lc.Mode == "braille" { - vrange = 2 * lc.innerArea.Dx() - } - if vrange > len(lc.Data) { - vrange = len(lc.Data) - } - - for _, v := range lc.Data[:vrange] { - if v > lc.maxY { - lc.maxY = v - } - if v < lc.minY { - lc.minY = v - } - } - - span := lc.maxY - lc.minY - - if lc.minY < lc.bottomValue { - lc.bottomValue = lc.minY - 0.2*span - } - - if lc.maxY > lc.topValue { - lc.topValue = lc.maxY + 0.2*span - } - - lc.axisYHeight = lc.innerArea.Dy() - 2 - lc.calcLabelY() - - lc.axisXWidth = lc.innerArea.Dx() - 1 - lc.labelYSpace - lc.calcLabelX() - - lc.drawingX = lc.innerArea.Min.X + 1 + lc.labelYSpace - lc.drawingY = lc.innerArea.Min.Y -} - -func (lc *LineChart) plotAxes() Buffer { - buf := NewBuffer() - - origY := lc.innerArea.Min.Y + lc.innerArea.Dy() - 2 - origX := lc.innerArea.Min.X + lc.labelYSpace - - buf.Set(origX, origY, Cell{Ch: ORIGIN, Fg: lc.AxesColor, Bg: lc.Bg}) - - for x := origX + 1; x < origX+lc.axisXWidth; x++ { - buf.Set(x, origY, Cell{Ch: HDASH, Fg: lc.AxesColor, Bg: lc.Bg}) - } - - for dy := 1; dy <= lc.axisYHeight; dy++ { - buf.Set(origX, origY-dy, Cell{Ch: VDASH, Fg: lc.AxesColor, Bg: lc.Bg}) - } - - // x label - oft := 0 - for _, rs := range lc.labelX { - if oft+len(rs) > lc.axisXWidth { - break - } - for j, r := range rs { - c := Cell{ - Ch: r, - Fg: lc.AxesColor, - Bg: lc.Bg, - } - x := origX + oft + j - y := lc.innerArea.Min.Y + lc.innerArea.Dy() - 1 - buf.Set(x, y, c) - } - oft += len(rs) + lc.axisXLabelGap - } - - // y labels - for i, rs := range lc.labelY { - for j, r := range rs { - buf.Set( - lc.innerArea.Min.X+j, - origY-i*(lc.axisYLabelGap+1), - Cell{Ch: r, Fg: lc.AxesColor, Bg: lc.Bg}) - } - } - - return buf -} - -// Buffer implements Bufferer interface. -func (lc *LineChart) Buffer() Buffer { - buf := lc.Block.Buffer() - - if lc.Data == nil || len(lc.Data) == 0 { - return buf - } - lc.calcLayout() - buf.Merge(lc.plotAxes()) - - if lc.Mode == "dot" { - buf.Merge(lc.renderDot()) - } else { - buf.Merge(lc.renderBraille()) - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/linechart_others.go b/vendor/github.com/gizak/termui/linechart_others.go deleted file mode 100644 index 14897ea0f838..000000000000 --- a/vendor/github.com/gizak/termui/linechart_others.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -// +build !windows - -package termui - -const VDASH = '┊' -const HDASH = '┈' -const ORIGIN = '└' diff --git a/vendor/github.com/gizak/termui/linechart_windows.go b/vendor/github.com/gizak/termui/linechart_windows.go deleted file mode 100644 index 994d3e590045..000000000000 --- a/vendor/github.com/gizak/termui/linechart_windows.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -// +build windows - -package termui - -const VDASH = '|' -const HDASH = '-' -const ORIGIN = '+' diff --git a/vendor/github.com/gizak/termui/list.go b/vendor/github.com/gizak/termui/list.go deleted file mode 100644 index ea6635eccc00..000000000000 --- a/vendor/github.com/gizak/termui/list.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "strings" - -// List displays []string as its items, -// it has a Overflow option (default is "hidden"), when set to "hidden", -// the item exceeding List's width is truncated, but when set to "wrap", -// the overflowed text breaks into next line. -/* - strs := []string{ - "[0] github.com/gizak/termui", - "[1] editbox.go", - "[2] iterrupt.go", - "[3] keyboard.go", - "[4] output.go", - "[5] random_out.go", - "[6] dashboard.go", - "[7] nsf/termbox-go"} - - ls := termui.NewList() - ls.Items = strs - ls.ItemFgColor = termui.ColorYellow - ls.BorderLabel = "List" - ls.Height = 7 - ls.Width = 25 - ls.Y = 0 -*/ -type List struct { - Block - Items []string - Overflow string - ItemFgColor Attribute - ItemBgColor Attribute -} - -// NewList returns a new *List with current theme. -func NewList() *List { - l := &List{Block: *NewBlock()} - l.Overflow = "hidden" - l.ItemFgColor = ThemeAttr("list.item.fg") - l.ItemBgColor = ThemeAttr("list.item.bg") - return l -} - -// Buffer implements Bufferer interface. -func (l *List) Buffer() Buffer { - buf := l.Block.Buffer() - - switch l.Overflow { - case "wrap": - cs := DefaultTxBuilder.Build(strings.Join(l.Items, "\n"), l.ItemFgColor, l.ItemBgColor) - i, j, k := 0, 0, 0 - for i < l.innerArea.Dy() && k < len(cs) { - w := cs[k].Width() - if cs[k].Ch == '\n' || j+w > l.innerArea.Dx() { - i++ - j = 0 - if cs[k].Ch == '\n' { - k++ - } - continue - } - buf.Set(l.innerArea.Min.X+j, l.innerArea.Min.Y+i, cs[k]) - - k++ - j++ - } - - case "hidden": - trimItems := l.Items - if len(trimItems) > l.innerArea.Dy() { - trimItems = trimItems[:l.innerArea.Dy()] - } - for i, v := range trimItems { - cs := DTrimTxCls(DefaultTxBuilder.Build(v, l.ItemFgColor, l.ItemBgColor), l.innerArea.Dx()) - j := 0 - for _, vv := range cs { - w := vv.Width() - buf.Set(l.innerArea.Min.X+j, l.innerArea.Min.Y+i, vv) - j += w - } - } - } - return buf -} diff --git a/vendor/github.com/gizak/termui/mbarchart.go b/vendor/github.com/gizak/termui/mbarchart.go deleted file mode 100644 index 0f91e9713f34..000000000000 --- a/vendor/github.com/gizak/termui/mbarchart.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "fmt" -) - -// This is the implemetation of multi-colored or stacked bar graph. This is different from default barGraph which is implemented in bar.go -// Multi-Colored-BarChart creates multiple bars in a widget: -/* - bc := termui.NewMBarChart() - data := make([][]int, 2) - data[0] := []int{3, 2, 5, 7, 9, 4} - data[1] := []int{7, 8, 5, 3, 1, 6} - bclabels := []string{"S0", "S1", "S2", "S3", "S4", "S5"} - bc.BorderLabel = "Bar Chart" - bc.Data = data - bc.Width = 26 - bc.Height = 10 - bc.DataLabels = bclabels - bc.TextColor = termui.ColorGreen - bc.BarColor = termui.ColorRed - bc.NumColor = termui.ColorYellow -*/ -type MBarChart struct { - Block - BarColor [NumberofColors]Attribute - TextColor Attribute - NumColor [NumberofColors]Attribute - Data [NumberofColors][]int - DataLabels []string - BarWidth int - BarGap int - labels [][]rune - dataNum [NumberofColors][][]rune - numBar int - scale float64 - max int - minDataLen int - numStack int - ShowScale bool - maxScale []rune -} - -// NewBarChart returns a new *BarChart with current theme. -func NewMBarChart() *MBarChart { - bc := &MBarChart{Block: *NewBlock()} - bc.BarColor[0] = ThemeAttr("mbarchart.bar.bg") - bc.NumColor[0] = ThemeAttr("mbarchart.num.fg") - bc.TextColor = ThemeAttr("mbarchart.text.fg") - bc.BarGap = 1 - bc.BarWidth = 3 - return bc -} - -func (bc *MBarChart) layout() { - bc.numBar = bc.innerArea.Dx() / (bc.BarGap + bc.BarWidth) - bc.labels = make([][]rune, bc.numBar) - DataLen := 0 - LabelLen := len(bc.DataLabels) - bc.minDataLen = 9999 //Set this to some very hight value so that we find the minimum one We want to know which array among data[][] has got the least length - - // We need to know how many stack/data array data[0] , data[1] are there - for i := 0; i < len(bc.Data); i++ { - if bc.Data[i] == nil { - break - } - DataLen++ - } - bc.numStack = DataLen - - //We need to know what is the mimimum size of data array data[0] could have 10 elements data[1] could have only 5, so we plot only 5 bar graphs - - for i := 0; i < DataLen; i++ { - if bc.minDataLen > len(bc.Data[i]) { - bc.minDataLen = len(bc.Data[i]) - } - } - - if LabelLen > bc.minDataLen { - LabelLen = bc.minDataLen - } - - for i := 0; i < LabelLen && i < bc.numBar; i++ { - bc.labels[i] = trimStr2Runes(bc.DataLabels[i], bc.BarWidth) - } - - for i := 0; i < bc.numStack; i++ { - bc.dataNum[i] = make([][]rune, len(bc.Data[i])) - //For each stack of bar calcualte the rune - for j := 0; j < LabelLen && i < bc.numBar; j++ { - n := bc.Data[i][j] - s := fmt.Sprint(n) - bc.dataNum[i][j] = trimStr2Runes(s, bc.BarWidth) - } - //If color is not defined by default then populate a color that is different from the prevous bar - if bc.BarColor[i] == ColorDefault && bc.NumColor[i] == ColorDefault { - if i == 0 { - bc.BarColor[i] = ColorBlack - } else { - bc.BarColor[i] = bc.BarColor[i-1] + 1 - if bc.BarColor[i] > NumberofColors { - bc.BarColor[i] = ColorBlack - } - } - bc.NumColor[i] = (NumberofColors + 1) - bc.BarColor[i] //Make NumColor opposite of barColor for visibility - } - } - - //If Max value is not set then we have to populate, this time the max value will be max(sum(d1[0],d2[0],d3[0]) .... sum(d1[n], d2[n], d3[n])) - - if bc.max == 0 { - bc.max = -1 - } - for i := 0; i < bc.minDataLen && i < LabelLen; i++ { - var dsum int - for j := 0; j < bc.numStack; j++ { - dsum += bc.Data[j][i] - } - if dsum > bc.max { - bc.max = dsum - } - } - - //Finally Calculate max sale - if bc.ShowScale { - s := fmt.Sprintf("%d", bc.max) - bc.maxScale = trimStr2Runes(s, len(s)) - bc.scale = float64(bc.max) / float64(bc.innerArea.Dy()-2) - } else { - bc.scale = float64(bc.max) / float64(bc.innerArea.Dy()-1) - } - -} - -func (bc *MBarChart) SetMax(max int) { - - if max > 0 { - bc.max = max - } -} - -// Buffer implements Bufferer interface. -func (bc *MBarChart) Buffer() Buffer { - buf := bc.Block.Buffer() - bc.layout() - var oftX int - - for i := 0; i < bc.numBar && i < bc.minDataLen && i < len(bc.DataLabels); i++ { - ph := 0 //Previous Height to stack up - oftX = i * (bc.BarWidth + bc.BarGap) - for i1 := 0; i1 < bc.numStack; i1++ { - h := int(float64(bc.Data[i1][i]) / bc.scale) - // plot bars - for j := 0; j < bc.BarWidth; j++ { - for k := 0; k < h; k++ { - c := Cell{ - Ch: ' ', - Bg: bc.BarColor[i1], - } - if bc.BarColor[i1] == ColorDefault { // when color is default, space char treated as transparent! - c.Bg |= AttrReverse - } - x := bc.innerArea.Min.X + i*(bc.BarWidth+bc.BarGap) + j - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - k - ph - buf.Set(x, y, c) - - } - } - ph += h - } - // plot text - for j, k := 0, 0; j < len(bc.labels[i]); j++ { - w := charWidth(bc.labels[i][j]) - c := Cell{ - Ch: bc.labels[i][j], - Bg: bc.Bg, - Fg: bc.TextColor, - } - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 1 - x := bc.innerArea.Max.X + oftX + ((bc.BarWidth - len(bc.labels[i])) / 2) + k - buf.Set(x, y, c) - k += w - } - // plot num - ph = 0 //re-initialize previous height - for i1 := 0; i1 < bc.numStack; i1++ { - h := int(float64(bc.Data[i1][i]) / bc.scale) - for j := 0; j < len(bc.dataNum[i1][i]) && h > 0; j++ { - c := Cell{ - Ch: bc.dataNum[i1][i][j], - Fg: bc.NumColor[i1], - Bg: bc.BarColor[i1], - } - if bc.BarColor[i1] == ColorDefault { // the same as above - c.Bg |= AttrReverse - } - if h == 0 { - c.Bg = bc.Bg - } - x := bc.innerArea.Min.X + oftX + (bc.BarWidth-len(bc.dataNum[i1][i]))/2 + j - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - ph - buf.Set(x, y, c) - } - ph += h - } - } - - if bc.ShowScale { - //Currently bar graph only supprts data range from 0 to MAX - //Plot 0 - c := Cell{ - Ch: '0', - Bg: bc.Bg, - Fg: bc.TextColor, - } - - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - x := bc.X - buf.Set(x, y, c) - - //Plot the maximum sacle value - for i := 0; i < len(bc.maxScale); i++ { - c := Cell{ - Ch: bc.maxScale[i], - Bg: bc.Bg, - Fg: bc.TextColor, - } - - y := bc.innerArea.Min.Y - x := bc.X + i - - buf.Set(x, y, c) - } - - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/mkdocs.yml b/vendor/github.com/gizak/termui/mkdocs.yml deleted file mode 100644 index 2ab45f064b15..000000000000 --- a/vendor/github.com/gizak/termui/mkdocs.yml +++ /dev/null @@ -1,28 +0,0 @@ -pages: -- Home: 'index.md' -- Quickstart: 'quickstart.md' -- Recipes: 'recipes.md' -- References: - - Layouts: 'layouts.md' - - Components: 'components.md' - - Events: 'events.md' - - Themes: 'themes.md' -- Versions: 'versions.md' -- About: 'about.md' - -site_name: termui -repo_url: https://github.com/gizak/termui/ -site_description: 'termui user guide' -site_author: gizak - -docs_dir: '_docs' - -theme: readthedocs - -markdown_extensions: - - smarty - - admonition - - toc - -extra: - version: 1.0 diff --git a/vendor/github.com/gizak/termui/par.go b/vendor/github.com/gizak/termui/par.go deleted file mode 100644 index 29b6d462f91b..000000000000 --- a/vendor/github.com/gizak/termui/par.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -// Par displays a paragraph. -/* - par := termui.NewPar("Simple Text") - par.Height = 3 - par.Width = 17 - par.BorderLabel = "Label" -*/ -type Par struct { - Block - Text string - TextFgColor Attribute - TextBgColor Attribute - WrapLength int // words wrap limit. Note it may not work properly with multi-width char -} - -// NewPar returns a new *Par with given text as its content. -func NewPar(s string) *Par { - return &Par{ - Block: *NewBlock(), - Text: s, - TextFgColor: ThemeAttr("par.text.fg"), - TextBgColor: ThemeAttr("par.text.bg"), - WrapLength: 0, - } -} - -// Buffer implements Bufferer interface. -func (p *Par) Buffer() Buffer { - buf := p.Block.Buffer() - - fg, bg := p.TextFgColor, p.TextBgColor - cs := DefaultTxBuilder.Build(p.Text, fg, bg) - - // wrap if WrapLength set - if p.WrapLength < 0 { - cs = wrapTx(cs, p.Width-2) - } else if p.WrapLength > 0 { - cs = wrapTx(cs, p.WrapLength) - } - - y, x, n := 0, 0, 0 - for y < p.innerArea.Dy() && n < len(cs) { - w := cs[n].Width() - if cs[n].Ch == '\n' || x+w > p.innerArea.Dx() { - y++ - x = 0 // set x = 0 - if cs[n].Ch == '\n' { - n++ - } - - if y >= p.innerArea.Dy() { - buf.Set(p.innerArea.Min.X+p.innerArea.Dx()-1, - p.innerArea.Min.Y+p.innerArea.Dy()-1, - Cell{Ch: '…', Fg: p.TextFgColor, Bg: p.TextBgColor}) - break - } - continue - } - - buf.Set(p.innerArea.Min.X+x, p.innerArea.Min.Y+y, cs[n]) - - n++ - x += w - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/pos.go b/vendor/github.com/gizak/termui/pos.go deleted file mode 100644 index c7d647f31b78..000000000000 --- a/vendor/github.com/gizak/termui/pos.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "image" - -// Align is the position of the gauge's label. -type Align uint - -// All supported positions. -const ( - AlignNone Align = 0 - AlignLeft Align = 1 << iota - AlignRight - AlignBottom - AlignTop - AlignCenterVertical - AlignCenterHorizontal - AlignCenter = AlignCenterVertical | AlignCenterHorizontal -) - -func AlignArea(parent, child image.Rectangle, a Align) image.Rectangle { - w, h := child.Dx(), child.Dy() - - // parent center - pcx, pcy := parent.Min.X+parent.Dx()/2, parent.Min.Y+parent.Dy()/2 - // child center - ccx, ccy := child.Min.X+child.Dx()/2, child.Min.Y+child.Dy()/2 - - if a&AlignLeft == AlignLeft { - child.Min.X = parent.Min.X - child.Max.X = child.Min.X + w - } - - if a&AlignRight == AlignRight { - child.Max.X = parent.Max.X - child.Min.X = child.Max.X - w - } - - if a&AlignBottom == AlignBottom { - child.Max.Y = parent.Max.Y - child.Min.Y = child.Max.Y - h - } - - if a&AlignTop == AlignRight { - child.Min.Y = parent.Min.Y - child.Max.Y = child.Min.Y + h - } - - if a&AlignCenterHorizontal == AlignCenterHorizontal { - child.Min.X += pcx - ccx - child.Max.X = child.Min.X + w - } - - if a&AlignCenterVertical == AlignCenterVertical { - child.Min.Y += pcy - ccy - child.Max.Y = child.Min.Y + h - } - - return child -} - -func MoveArea(a image.Rectangle, dx, dy int) image.Rectangle { - a.Min.X += dx - a.Max.X += dx - a.Min.Y += dy - a.Max.Y += dy - return a -} - -var termWidth int -var termHeight int - -func TermRect() image.Rectangle { - return image.Rect(0, 0, termWidth, termHeight) -} diff --git a/vendor/github.com/gizak/termui/render.go b/vendor/github.com/gizak/termui/render.go deleted file mode 100644 index b9d37d93867f..000000000000 --- a/vendor/github.com/gizak/termui/render.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "image" - "io" - "sync" - "time" - - "fmt" - - "os" - - "runtime/debug" - - "bytes" - - "github.com/maruel/panicparse/stack" - tm "github.com/nsf/termbox-go" -) - -// Bufferer should be implemented by all renderable components. -type Bufferer interface { - Buffer() Buffer -} - -// Init initializes termui library. This function should be called before any others. -// After initialization, the library must be finalized by 'Close' function. -func Init() error { - if err := tm.Init(); err != nil { - return err - } - - sysEvtChs = make([]chan Event, 0) - go hookTermboxEvt() - - renderJobs = make(chan []Bufferer) - //renderLock = new(sync.RWMutex) - - Body = NewGrid() - Body.X = 0 - Body.Y = 0 - Body.BgColor = ThemeAttr("bg") - Body.Width = TermWidth() - - DefaultEvtStream.Init() - DefaultEvtStream.Merge("termbox", NewSysEvtCh()) - DefaultEvtStream.Merge("timer", NewTimerCh(time.Second)) - DefaultEvtStream.Merge("custom", usrEvtCh) - - DefaultEvtStream.Handle("/", DefaultHandler) - DefaultEvtStream.Handle("/sys/wnd/resize", func(e Event) { - w := e.Data.(EvtWnd) - Body.Width = w.Width - }) - - DefaultWgtMgr = NewWgtMgr() - DefaultEvtStream.Hook(DefaultWgtMgr.WgtHandlersHook()) - - go func() { - for bs := range renderJobs { - render(bs...) - } - }() - - return nil -} - -// Close finalizes termui library, -// should be called after successful initialization when termui's functionality isn't required anymore. -func Close() { - tm.Close() -} - -var renderLock sync.Mutex - -func termSync() { - renderLock.Lock() - tm.Sync() - termWidth, termHeight = tm.Size() - renderLock.Unlock() -} - -// TermWidth returns the current terminal's width. -func TermWidth() int { - termSync() - return termWidth -} - -// TermHeight returns the current terminal's height. -func TermHeight() int { - termSync() - return termHeight -} - -// Render renders all Bufferer in the given order from left to right, -// right could overlap on left ones. -func render(bs ...Bufferer) { - defer func() { - if e := recover(); e != nil { - Close() - fmt.Fprintf(os.Stderr, "Captured a panic(value=%v) when rendering Bufferer. Exit termui and clean terminal...\nPrint stack trace:\n\n", e) - //debug.PrintStack() - gs, err := stack.ParseDump(bytes.NewReader(debug.Stack()), os.Stderr) - if err != nil { - debug.PrintStack() - os.Exit(1) - } - p := &stack.Palette{} - buckets := stack.SortBuckets(stack.Bucketize(gs, stack.AnyValue)) - srcLen, pkgLen := stack.CalcLengths(buckets, false) - for _, bucket := range buckets { - io.WriteString(os.Stdout, p.BucketHeader(&bucket, false, len(buckets) > 1)) - io.WriteString(os.Stdout, p.StackLines(&bucket.Signature, srcLen, pkgLen, false)) - } - os.Exit(1) - } - }() - for _, b := range bs { - - buf := b.Buffer() - // set cels in buf - for p, c := range buf.CellMap { - if p.In(buf.Area) { - - tm.SetCell(p.X, p.Y, c.Ch, toTmAttr(c.Fg), toTmAttr(c.Bg)) - - } - } - - } - - renderLock.Lock() - // render - tm.Flush() - renderLock.Unlock() -} - -func Clear() { - tm.Clear(tm.ColorDefault, toTmAttr(ThemeAttr("bg"))) -} - -func clearArea(r image.Rectangle, bg Attribute) { - for i := r.Min.X; i < r.Max.X; i++ { - for j := r.Min.Y; j < r.Max.Y; j++ { - tm.SetCell(i, j, ' ', tm.ColorDefault, toTmAttr(bg)) - } - } -} - -func ClearArea(r image.Rectangle, bg Attribute) { - clearArea(r, bg) - tm.Flush() -} - -var renderJobs chan []Bufferer - -func Render(bs ...Bufferer) { - //go func() { renderJobs <- bs }() - renderJobs <- bs -} diff --git a/vendor/github.com/gizak/termui/sparkline.go b/vendor/github.com/gizak/termui/sparkline.go deleted file mode 100644 index d906e49dfca2..000000000000 --- a/vendor/github.com/gizak/termui/sparkline.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -// Sparkline is like: ▅▆▂▂▅▇▂▂▃▆▆▆▅▃. The data points should be non-negative integers. -/* - data := []int{4, 2, 1, 6, 3, 9, 1, 4, 2, 15, 14, 9, 8, 6, 10, 13, 15, 12, 10, 5, 3, 6, 1} - spl := termui.NewSparkline() - spl.Data = data - spl.Title = "Sparkline 0" - spl.LineColor = termui.ColorGreen -*/ -type Sparkline struct { - Data []int - Height int - Title string - TitleColor Attribute - LineColor Attribute - displayHeight int - scale float32 - max int -} - -// Sparklines is a renderable widget which groups together the given sparklines. -/* - spls := termui.NewSparklines(spl0,spl1,spl2) //... - spls.Height = 2 - spls.Width = 20 -*/ -type Sparklines struct { - Block - Lines []Sparkline - displayLines int - displayWidth int -} - -var sparks = []rune{'▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'} - -// Add appends a given Sparkline to s *Sparklines. -func (s *Sparklines) Add(sl Sparkline) { - s.Lines = append(s.Lines, sl) -} - -// NewSparkline returns a unrenderable single sparkline that intended to be added into Sparklines. -func NewSparkline() Sparkline { - return Sparkline{ - Height: 1, - TitleColor: ThemeAttr("sparkline.title.fg"), - LineColor: ThemeAttr("sparkline.line.fg")} -} - -// NewSparklines return a new *Spaklines with given Sparkline(s), you can always add a new Sparkline later. -func NewSparklines(ss ...Sparkline) *Sparklines { - s := &Sparklines{Block: *NewBlock(), Lines: ss} - return s -} - -func (sl *Sparklines) update() { - for i, v := range sl.Lines { - if v.Title == "" { - sl.Lines[i].displayHeight = v.Height - } else { - sl.Lines[i].displayHeight = v.Height + 1 - } - } - sl.displayWidth = sl.innerArea.Dx() - - // get how many lines gotta display - h := 0 - sl.displayLines = 0 - for _, v := range sl.Lines { - if h+v.displayHeight <= sl.innerArea.Dy() { - sl.displayLines++ - } else { - break - } - h += v.displayHeight - } - - for i := 0; i < sl.displayLines; i++ { - data := sl.Lines[i].Data - - max := 0 - for _, v := range data { - if max < v { - max = v - } - } - sl.Lines[i].max = max - if max != 0 { - sl.Lines[i].scale = float32(8*sl.Lines[i].Height) / float32(max) - } else { // when all negative - sl.Lines[i].scale = 0 - } - } -} - -// Buffer implements Bufferer interface. -func (sl *Sparklines) Buffer() Buffer { - buf := sl.Block.Buffer() - sl.update() - - oftY := 0 - for i := 0; i < sl.displayLines; i++ { - l := sl.Lines[i] - data := l.Data - - if len(data) > sl.innerArea.Dx() { - data = data[len(data)-sl.innerArea.Dx():] - } - - if l.Title != "" { - rs := trimStr2Runes(l.Title, sl.innerArea.Dx()) - oftX := 0 - for _, v := range rs { - w := charWidth(v) - c := Cell{ - Ch: v, - Fg: l.TitleColor, - Bg: sl.Bg, - } - x := sl.innerArea.Min.X + oftX - y := sl.innerArea.Min.Y + oftY - buf.Set(x, y, c) - oftX += w - } - } - - for j, v := range data { - // display height of the data point, zero when data is negative - h := int(float32(v)*l.scale + 0.5) - if v < 0 { - h = 0 - } - - barCnt := h / 8 - barMod := h % 8 - for jj := 0; jj < barCnt; jj++ { - c := Cell{ - Ch: ' ', // => sparks[7] - Bg: l.LineColor, - } - x := sl.innerArea.Min.X + j - y := sl.innerArea.Min.Y + oftY + l.Height - jj - - //p.Bg = sl.BgColor - buf.Set(x, y, c) - } - if barMod != 0 { - c := Cell{ - Ch: sparks[barMod-1], - Fg: l.LineColor, - Bg: sl.Bg, - } - x := sl.innerArea.Min.X + j - y := sl.innerArea.Min.Y + oftY + l.Height - barCnt - buf.Set(x, y, c) - } - } - - oftY += l.displayHeight - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/table.go b/vendor/github.com/gizak/termui/table.go deleted file mode 100644 index e3d1bbf309a2..000000000000 --- a/vendor/github.com/gizak/termui/table.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "strings" - -/* Table is like: - -┌Awesome Table ────────────────────────────────────────────────┐ -│ Col0 | Col1 | Col2 | Col3 | Col4 | Col5 | Col6 | -│──────────────────────────────────────────────────────────────│ -│ Some Item #1 | AAA | 123 | CCCCC | EEEEE | GGGGG | IIIII | -│──────────────────────────────────────────────────────────────│ -│ Some Item #2 | BBB | 456 | DDDDD | FFFFF | HHHHH | JJJJJ | -└──────────────────────────────────────────────────────────────┘ - -Datapoints are a two dimensional array of strings: [][]string - -Example: - data := [][]string{ - {"Col0", "Col1", "Col3", "Col4", "Col5", "Col6"}, - {"Some Item #1", "AAA", "123", "CCCCC", "EEEEE", "GGGGG", "IIIII"}, - {"Some Item #2", "BBB", "456", "DDDDD", "FFFFF", "HHHHH", "JJJJJ"}, - } - - table := termui.NewTable() - table.Rows = data // type [][]string - table.FgColor = termui.ColorWhite - table.BgColor = termui.ColorDefault - table.Height = 7 - table.Width = 62 - table.Y = 0 - table.X = 0 - table.Border = true -*/ - -// Table tracks all the attributes of a Table instance -type Table struct { - Block - Rows [][]string - CellWidth []int - FgColor Attribute - BgColor Attribute - FgColors []Attribute - BgColors []Attribute - Separator bool - TextAlign Align -} - -// NewTable returns a new Table instance -func NewTable() *Table { - table := &Table{Block: *NewBlock()} - table.FgColor = ColorWhite - table.BgColor = ColorDefault - table.Separator = true - return table -} - -// CellsWidth calculates the width of a cell array and returns an int -func cellsWidth(cells []Cell) int { - width := 0 - for _, c := range cells { - width += c.Width() - } - return width -} - -// Analysis generates and returns an array of []Cell that represent all columns in the Table -func (table *Table) Analysis() [][]Cell { - var rowCells [][]Cell - length := len(table.Rows) - if length < 1 { - return rowCells - } - - if len(table.FgColors) == 0 { - table.FgColors = make([]Attribute, len(table.Rows)) - } - if len(table.BgColors) == 0 { - table.BgColors = make([]Attribute, len(table.Rows)) - } - - cellWidths := make([]int, len(table.Rows[0])) - - for y, row := range table.Rows { - if table.FgColors[y] == 0 { - table.FgColors[y] = table.FgColor - } - if table.BgColors[y] == 0 { - table.BgColors[y] = table.BgColor - } - for x, str := range row { - cells := DefaultTxBuilder.Build(str, table.FgColors[y], table.BgColors[y]) - cw := cellsWidth(cells) - if cellWidths[x] < cw { - cellWidths[x] = cw - } - rowCells = append(rowCells, cells) - } - } - table.CellWidth = cellWidths - return rowCells -} - -// SetSize calculates the table size and sets the internal value -func (table *Table) SetSize() { - length := len(table.Rows) - if table.Separator { - table.Height = length*2 + 1 - } else { - table.Height = length + 2 - } - table.Width = 2 - if length != 0 { - for _, cellWidth := range table.CellWidth { - table.Width += cellWidth + 3 - } - } -} - -// CalculatePosition ... -func (table *Table) CalculatePosition(x int, y int, coordinateX *int, coordinateY *int, cellStart *int) { - if table.Separator { - *coordinateY = table.innerArea.Min.Y + y*2 - } else { - *coordinateY = table.innerArea.Min.Y + y - } - if x == 0 { - *cellStart = table.innerArea.Min.X - } else { - *cellStart += table.CellWidth[x-1] + 3 - } - - switch table.TextAlign { - case AlignRight: - *coordinateX = *cellStart + (table.CellWidth[x] - len(table.Rows[y][x])) + 2 - case AlignCenter: - *coordinateX = *cellStart + (table.CellWidth[x]-len(table.Rows[y][x]))/2 + 2 - default: - *coordinateX = *cellStart + 2 - } -} - -// Buffer ... -func (table *Table) Buffer() Buffer { - buffer := table.Block.Buffer() - rowCells := table.Analysis() - pointerX := table.innerArea.Min.X + 2 - pointerY := table.innerArea.Min.Y - borderPointerX := table.innerArea.Min.X - for y, row := range table.Rows { - for x := range row { - table.CalculatePosition(x, y, &pointerX, &pointerY, &borderPointerX) - background := DefaultTxBuilder.Build(strings.Repeat(" ", table.CellWidth[x]+3), table.BgColors[y], table.BgColors[y]) - cells := rowCells[y*len(row)+x] - for i, back := range background { - buffer.Set(borderPointerX+i, pointerY, back) - } - - coordinateX := pointerX - for _, printer := range cells { - buffer.Set(coordinateX, pointerY, printer) - coordinateX += printer.Width() - } - - if x != 0 { - dividors := DefaultTxBuilder.Build("|", table.FgColors[y], table.BgColors[y]) - for _, dividor := range dividors { - buffer.Set(borderPointerX, pointerY, dividor) - } - } - } - - if table.Separator { - border := DefaultTxBuilder.Build(strings.Repeat("─", table.Width-2), table.FgColor, table.BgColor) - for i, cell := range border { - buffer.Set(i+1, pointerY+1, cell) - } - } - } - - return buffer -} diff --git a/vendor/github.com/gizak/termui/textbuilder.go b/vendor/github.com/gizak/termui/textbuilder.go deleted file mode 100644 index 12e2055b5095..000000000000 --- a/vendor/github.com/gizak/termui/textbuilder.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "regexp" - "strings" - - "github.com/mitchellh/go-wordwrap" -) - -// TextBuilder is a minimal interface to produce text []Cell using specific syntax (markdown). -type TextBuilder interface { - Build(s string, fg, bg Attribute) []Cell -} - -// DefaultTxBuilder is set to be MarkdownTxBuilder. -var DefaultTxBuilder = NewMarkdownTxBuilder() - -// MarkdownTxBuilder implements TextBuilder interface, using markdown syntax. -type MarkdownTxBuilder struct { - baseFg Attribute - baseBg Attribute - plainTx []rune - markers []marker -} - -type marker struct { - st int - ed int - fg Attribute - bg Attribute -} - -var colorMap = map[string]Attribute{ - "red": ColorRed, - "blue": ColorBlue, - "black": ColorBlack, - "cyan": ColorCyan, - "yellow": ColorYellow, - "white": ColorWhite, - "default": ColorDefault, - "green": ColorGreen, - "magenta": ColorMagenta, -} - -var attrMap = map[string]Attribute{ - "bold": AttrBold, - "underline": AttrUnderline, - "reverse": AttrReverse, -} - -func rmSpc(s string) string { - reg := regexp.MustCompile(`\s+`) - return reg.ReplaceAllString(s, "") -} - -// readAttr translates strings like `fg-red,fg-bold,bg-white` to fg and bg Attribute -func (mtb MarkdownTxBuilder) readAttr(s string) (Attribute, Attribute) { - fg := mtb.baseFg - bg := mtb.baseBg - - updateAttr := func(a Attribute, attrs []string) Attribute { - for _, s := range attrs { - // replace the color - if c, ok := colorMap[s]; ok { - a &= 0xFF00 // erase clr 0 ~ 8 bits - a |= c // set clr - } - // add attrs - if c, ok := attrMap[s]; ok { - a |= c - } - } - return a - } - - ss := strings.Split(s, ",") - fgs := []string{} - bgs := []string{} - for _, v := range ss { - subs := strings.Split(v, "-") - if len(subs) > 1 { - if subs[0] == "fg" { - fgs = append(fgs, subs[1]) - } - if subs[0] == "bg" { - bgs = append(bgs, subs[1]) - } - } - } - - fg = updateAttr(fg, fgs) - bg = updateAttr(bg, bgs) - return fg, bg -} - -func (mtb *MarkdownTxBuilder) reset() { - mtb.plainTx = []rune{} - mtb.markers = []marker{} -} - -// parse streams and parses text into normalized text and render sequence. -func (mtb *MarkdownTxBuilder) parse(str string) { - rs := str2runes(str) - normTx := []rune{} - square := []rune{} - brackt := []rune{} - accSquare := false - accBrackt := false - cntSquare := 0 - - reset := func() { - square = []rune{} - brackt = []rune{} - accSquare = false - accBrackt = false - cntSquare = 0 - } - // pipe stacks into normTx and clear - rollback := func() { - normTx = append(normTx, square...) - normTx = append(normTx, brackt...) - reset() - } - // chop first and last - chop := func(s []rune) []rune { - return s[1 : len(s)-1] - } - - for i, r := range rs { - switch { - // stacking brackt - case accBrackt: - brackt = append(brackt, r) - if ')' == r { - fg, bg := mtb.readAttr(string(chop(brackt))) - st := len(normTx) - ed := len(normTx) + len(square) - 2 - mtb.markers = append(mtb.markers, marker{st, ed, fg, bg}) - normTx = append(normTx, chop(square)...) - reset() - } else if i+1 == len(rs) { - rollback() - } - // stacking square - case accSquare: - switch { - // squares closed and followed by a '(' - case cntSquare == 0 && '(' == r: - accBrackt = true - brackt = append(brackt, '(') - // squares closed but not followed by a '(' - case cntSquare == 0: - rollback() - if '[' == r { - accSquare = true - cntSquare = 1 - brackt = append(brackt, '[') - } else { - normTx = append(normTx, r) - } - // hit the end - case i+1 == len(rs): - square = append(square, r) - rollback() - case '[' == r: - cntSquare++ - square = append(square, '[') - case ']' == r: - cntSquare-- - square = append(square, ']') - // normal char - default: - square = append(square, r) - } - // stacking normTx - default: - if '[' == r { - accSquare = true - cntSquare = 1 - square = append(square, '[') - } else { - normTx = append(normTx, r) - } - } - } - - mtb.plainTx = normTx -} - -func wrapTx(cs []Cell, wl int) []Cell { - tmpCell := make([]Cell, len(cs)) - copy(tmpCell, cs) - - // get the plaintext - plain := CellsToStr(cs) - - // wrap - plainWrapped := wordwrap.WrapString(plain, uint(wl)) - - // find differences and insert - finalCell := tmpCell // finalcell will get the inserts and is what is returned - - plainRune := []rune(plain) - plainWrappedRune := []rune(plainWrapped) - trigger := "go" - plainRuneNew := plainRune - - for trigger != "stop" { - plainRune = plainRuneNew - for i := range plainRune { - if plainRune[i] == plainWrappedRune[i] { - trigger = "stop" - } else if plainRune[i] != plainWrappedRune[i] && plainWrappedRune[i] == 10 { - trigger = "go" - cell := Cell{10, 0, 0} - j := i - 0 - - // insert a cell into the []Cell in correct position - tmpCell[i] = cell - - // insert the newline into plain so we avoid indexing errors - plainRuneNew = append(plainRune, 10) - copy(plainRuneNew[j+1:], plainRuneNew[j:]) - plainRuneNew[j] = plainWrappedRune[j] - - // restart the inner for loop until plain and plain wrapped are - // the same; yeah, it's inefficient, but the text amounts - // should be small - break - - } else if plainRune[i] != plainWrappedRune[i] && - plainWrappedRune[i-1] == 10 && // if the prior rune is a newline - plainRune[i] == 32 { // and this rune is a space - trigger = "go" - // need to delete plainRune[i] because it gets rid of an extra - // space - plainRuneNew = append(plainRune[:i], plainRune[i+1:]...) - break - - } else { - trigger = "stop" // stops the outer for loop - } - } - } - - finalCell = tmpCell - - return finalCell -} - -// Build implements TextBuilder interface. -func (mtb MarkdownTxBuilder) Build(s string, fg, bg Attribute) []Cell { - mtb.baseFg = fg - mtb.baseBg = bg - mtb.reset() - mtb.parse(s) - cs := make([]Cell, len(mtb.plainTx)) - for i := range cs { - cs[i] = Cell{Ch: mtb.plainTx[i], Fg: fg, Bg: bg} - } - for _, mrk := range mtb.markers { - for i := mrk.st; i < mrk.ed; i++ { - cs[i].Fg = mrk.fg - cs[i].Bg = mrk.bg - } - } - - return cs -} - -// NewMarkdownTxBuilder returns a TextBuilder employing markdown syntax. -func NewMarkdownTxBuilder() TextBuilder { - return MarkdownTxBuilder{} -} diff --git a/vendor/github.com/gizak/termui/theme.go b/vendor/github.com/gizak/termui/theme.go deleted file mode 100644 index 21fb3bfb751a..000000000000 --- a/vendor/github.com/gizak/termui/theme.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "strings" - -/* -// A ColorScheme represents the current look-and-feel of the dashboard. -type ColorScheme struct { - BodyBg Attribute - BlockBg Attribute - HasBorder bool - BorderFg Attribute - BorderBg Attribute - BorderLabelTextFg Attribute - BorderLabelTextBg Attribute - ParTextFg Attribute - ParTextBg Attribute - SparklineLine Attribute - SparklineTitle Attribute - GaugeBar Attribute - GaugePercent Attribute - LineChartLine Attribute - LineChartAxes Attribute - ListItemFg Attribute - ListItemBg Attribute - BarChartBar Attribute - BarChartText Attribute - BarChartNum Attribute - MBarChartBar Attribute - MBarChartText Attribute - MBarChartNum Attribute - TabActiveBg Attribute -} - -// default color scheme depends on the user's terminal setting. -var themeDefault = ColorScheme{HasBorder: true} - -var themeHelloWorld = ColorScheme{ - BodyBg: ColorBlack, - BlockBg: ColorBlack, - HasBorder: true, - BorderFg: ColorWhite, - BorderBg: ColorBlack, - BorderLabelTextBg: ColorBlack, - BorderLabelTextFg: ColorGreen, - ParTextBg: ColorBlack, - ParTextFg: ColorWhite, - SparklineLine: ColorMagenta, - SparklineTitle: ColorWhite, - GaugeBar: ColorRed, - GaugePercent: ColorWhite, - LineChartLine: ColorYellow | AttrBold, - LineChartAxes: ColorWhite, - ListItemBg: ColorBlack, - ListItemFg: ColorYellow, - BarChartBar: ColorRed, - BarChartNum: ColorWhite, - BarChartText: ColorCyan, - MBarChartBar: ColorRed, - MBarChartNum: ColorWhite, - MBarChartText: ColorCyan, - TabActiveBg: ColorMagenta, -} - -var theme = themeDefault // global dep - -// Theme returns the currently used theme. -func Theme() ColorScheme { - return theme -} - -// SetTheme sets a new, custom theme. -func SetTheme(newTheme ColorScheme) { - theme = newTheme -} - -// UseTheme sets a predefined scheme. Currently available: "hello-world" and -// "black-and-white". -func UseTheme(th string) { - switch th { - case "helloworld": - theme = themeHelloWorld - default: - theme = themeDefault - } -} -*/ - -var ColorMap = map[string]Attribute{ - "fg": ColorWhite, - "bg": ColorDefault, - "border.fg": ColorWhite, - "label.fg": ColorGreen, - "par.fg": ColorYellow, - "par.label.bg": ColorWhite, -} - -func ThemeAttr(name string) Attribute { - return lookUpAttr(ColorMap, name) -} - -func lookUpAttr(clrmap map[string]Attribute, name string) Attribute { - - a, ok := clrmap[name] - if ok { - return a - } - - ns := strings.Split(name, ".") - for i := range ns { - nn := strings.Join(ns[i:len(ns)], ".") - a, ok = ColorMap[nn] - if ok { - break - } - } - - return a -} - -// 0<=r,g,b <= 5 -func ColorRGB(r, g, b int) Attribute { - within := func(n int) int { - if n < 0 { - return 0 - } - - if n > 5 { - return 5 - } - - return n - } - - r, b, g = within(r), within(b), within(g) - return Attribute(0x0f + 36*r + 6*g + b) -} diff --git a/vendor/github.com/gizak/termui/widget.go b/vendor/github.com/gizak/termui/widget.go deleted file mode 100644 index 80276bf1f181..000000000000 --- a/vendor/github.com/gizak/termui/widget.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "fmt" - "sync" -) - -// event mixins -type WgtMgr map[string]WgtInfo - -type WgtInfo struct { - Handlers map[string]func(Event) - WgtRef Widget - Id string -} - -type Widget interface { - Id() string -} - -func NewWgtInfo(wgt Widget) WgtInfo { - return WgtInfo{ - Handlers: make(map[string]func(Event)), - WgtRef: wgt, - Id: wgt.Id(), - } -} - -func NewWgtMgr() WgtMgr { - wm := WgtMgr(make(map[string]WgtInfo)) - return wm - -} - -func (wm WgtMgr) AddWgt(wgt Widget) { - wm[wgt.Id()] = NewWgtInfo(wgt) -} - -func (wm WgtMgr) RmWgt(wgt Widget) { - wm.RmWgtById(wgt.Id()) -} - -func (wm WgtMgr) RmWgtById(id string) { - delete(wm, id) -} - -func (wm WgtMgr) AddWgtHandler(id, path string, h func(Event)) { - if w, ok := wm[id]; ok { - w.Handlers[path] = h - } -} - -func (wm WgtMgr) RmWgtHandler(id, path string) { - if w, ok := wm[id]; ok { - delete(w.Handlers, path) - } -} - -var counter struct { - sync.RWMutex - count int -} - -func GenId() string { - counter.Lock() - defer counter.Unlock() - - counter.count += 1 - return fmt.Sprintf("%d", counter.count) -} - -func (wm WgtMgr) WgtHandlersHook() func(Event) { - return func(e Event) { - for _, v := range wm { - if k := findMatch(v.Handlers, e.Path); k != "" { - v.Handlers[k](e) - } - } - } -} - -var DefaultWgtMgr WgtMgr - -func (b *Block) Handle(path string, handler func(Event)) { - if _, ok := DefaultWgtMgr[b.Id()]; !ok { - DefaultWgtMgr.AddWgt(b) - } - - DefaultWgtMgr.AddWgtHandler(b.Id(), path, handler) -} diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE index 1b1b1921efa6..0f646931a462 100644 --- a/vendor/github.com/golang/protobuf/LICENSE +++ b/vendor/github.com/golang/protobuf/LICENSE @@ -1,7 +1,4 @@ -Go support for Protocol Buffers - Google's data interchange format - Copyright 2010 The Go Authors. All rights reserved. -https://github.com/golang/protobuf Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/github.com/golang/protobuf/proto/Makefile b/vendor/github.com/golang/protobuf/proto/Makefile deleted file mode 100644 index e2e0651a934d..000000000000 --- a/vendor/github.com/golang/protobuf/proto/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -install: - go install - -test: install generate-test-pbs - go test - - -generate-test-pbs: - make install - make -C testdata - protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto - make diff --git a/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go index e392575b353a..3cd3249f7062 100644 --- a/vendor/github.com/golang/protobuf/proto/clone.go +++ b/vendor/github.com/golang/protobuf/proto/clone.go @@ -35,22 +35,39 @@ package proto import ( + "fmt" "log" "reflect" "strings" ) // Clone returns a deep copy of a protocol buffer. -func Clone(pb Message) Message { - in := reflect.ValueOf(pb) +func Clone(src Message) Message { + in := reflect.ValueOf(src) if in.IsNil() { - return pb + return src } - out := reflect.New(in.Type().Elem()) - // out is empty so a merge is a deep copy. - mergeStruct(out.Elem(), in.Elem()) - return out.Interface().(Message) + dst := out.Interface().(Message) + Merge(dst, src) + return dst +} + +// Merger is the interface representing objects that can merge messages of the same type. +type Merger interface { + // Merge merges src into this message. + // Required and optional fields that are set in src will be set to that value in dst. + // Elements of repeated fields will be appended. + // + // Merge may panic if called with a different argument type than the receiver. + Merge(src Message) +} + +// generatedMerger is the custom merge method that generated protos will have. +// We must add this method since a generate Merge method will conflict with +// many existing protos that have a Merge data field already defined. +type generatedMerger interface { + XXX_Merge(src Message) } // Merge merges src into dst. @@ -58,17 +75,24 @@ func Clone(pb Message) Message { // Elements of repeated fields will be appended. // Merge panics if src and dst are not the same type, or if dst is nil. func Merge(dst, src Message) { + if m, ok := dst.(Merger); ok { + m.Merge(src) + return + } + in := reflect.ValueOf(src) out := reflect.ValueOf(dst) if out.IsNil() { panic("proto: nil destination") } if in.Type() != out.Type() { - // Explicit test prior to mergeStruct so that mistyped nils will fail - panic("proto: type mismatch") + panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) } if in.IsNil() { - // Merging nil into non-nil is a quiet no-op + return // Merge from nil src is a noop + } + if m, ok := dst.(generatedMerger); ok { + m.XXX_Merge(src) return } mergeStruct(out.Elem(), in.Elem()) @@ -84,7 +108,7 @@ func mergeStruct(out, in reflect.Value) { mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) } - if emIn, ok := extendable(in.Addr().Interface()); ok { + if emIn, err := extendable(in.Addr().Interface()); err == nil { emOut, _ := extendable(out.Addr().Interface()) mIn, muIn := emIn.extensionsRead() if mIn != nil { diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go index aa207298f997..63b0f08bef2a 100644 --- a/vendor/github.com/golang/protobuf/proto/decode.go +++ b/vendor/github.com/golang/protobuf/proto/decode.go @@ -39,8 +39,6 @@ import ( "errors" "fmt" "io" - "os" - "reflect" ) // errOverflow is returned when an integer is too large to be represented. @@ -50,10 +48,6 @@ var errOverflow = errors.New("proto: integer overflow") // wire type is encountered. It does not get returned to user code. var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") -// The fundamental decoders that interpret bytes on the wire. -// Those that take integer types all return uint64 and are -// therefore of type valueDecoder. - // DecodeVarint reads a varint-encoded integer from the slice. // It returns the integer and the number of bytes consumed, or // zero if there is not enough. @@ -192,7 +186,6 @@ func (p *Buffer) DecodeVarint() (x uint64, err error) { if b&0x80 == 0 { goto done } - // x -= 0x80 << 63 // Always zero. return 0, errOverflow @@ -267,9 +260,6 @@ func (p *Buffer) DecodeZigzag32() (x uint64, err error) { return } -// These are not ValueDecoders: they produce an array of bytes or a string. -// bytes, embedded messages - // DecodeRawBytes reads a count-delimited byte buffer from the Buffer. // This is the format used for the bytes protocol buffer // type and for embedded messages. @@ -311,81 +301,29 @@ func (p *Buffer) DecodeStringBytes() (s string, err error) { return string(buf), nil } -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -// If the protocol buffer has extensions, and the field matches, add it as an extension. -// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. -func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { - oi := o.index - - err := o.skip(t, tag, wire) - if err != nil { - return err - } - - if !unrecField.IsValid() { - return nil - } - - ptr := structPointer_Bytes(base, unrecField) - - // Add the skipped field to struct field - obuf := o.buf - - o.buf = *ptr - o.EncodeVarint(uint64(tag<<3 | wire)) - *ptr = append(o.buf, obuf[oi:o.index]...) - - o.buf = obuf - - return nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -func (o *Buffer) skip(t reflect.Type, tag, wire int) error { - - var u uint64 - var err error - - switch wire { - case WireVarint: - _, err = o.DecodeVarint() - case WireFixed64: - _, err = o.DecodeFixed64() - case WireBytes: - _, err = o.DecodeRawBytes(false) - case WireFixed32: - _, err = o.DecodeFixed32() - case WireStartGroup: - for { - u, err = o.DecodeVarint() - if err != nil { - break - } - fwire := int(u & 0x7) - if fwire == WireEndGroup { - break - } - ftag := int(u >> 3) - err = o.skip(t, ftag, fwire) - if err != nil { - break - } - } - default: - err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) - } - return err -} - // Unmarshaler is the interface representing objects that can -// unmarshal themselves. The method should reset the receiver before -// decoding starts. The argument points to data that may be +// unmarshal themselves. The argument points to data that may be // overwritten, so implementations should not keep references to the // buffer. +// Unmarshal implementations should not clear the receiver. +// Any unmarshaled data should be merged into the receiver. +// Callers of Unmarshal that do not want to retain existing data +// should Reset the receiver before calling Unmarshal. type Unmarshaler interface { Unmarshal([]byte) error } +// newUnmarshaler is the interface representing objects that can +// unmarshal themselves. The semantics are identical to Unmarshaler. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newUnmarshaler interface { + XXX_Unmarshal([]byte) error +} + // Unmarshal parses the protocol buffer representation in buf and places the // decoded result in pb. If the struct underlying pb does not match // the data in buf, the results can be unpredictable. @@ -395,7 +333,13 @@ type Unmarshaler interface { // to preserve and append to existing data. func Unmarshal(buf []byte, pb Message) error { pb.Reset() - return UnmarshalMerge(buf, pb) + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) } // UnmarshalMerge parses the protocol buffer representation in buf and @@ -405,8 +349,16 @@ func Unmarshal(buf []byte, pb Message) error { // UnmarshalMerge merges into existing data in pb. // Most code should use Unmarshal instead. func UnmarshalMerge(buf []byte, pb Message) error { - // If the object can unmarshal itself, let it. + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 return u.Unmarshal(buf) } return NewBuffer(buf).Unmarshal(pb) @@ -422,12 +374,17 @@ func (p *Buffer) DecodeMessage(pb Message) error { } // DecodeGroup reads a tag-delimited group from the Buffer. +// StartGroup tag is already consumed. This function consumes +// EndGroup tag. func (p *Buffer) DecodeGroup(pb Message) error { - typ, base, err := getbase(pb) - if err != nil { - return err + b := p.buf[p.index:] + x, y := findEndGroup(b) + if x < 0 { + return io.ErrUnexpectedEOF } - return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) + err := Unmarshal(b[:x], pb) + p.index += y + return err } // Unmarshal parses the protocol buffer representation in the @@ -438,533 +395,33 @@ func (p *Buffer) DecodeGroup(pb Message) error { // Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. func (p *Buffer) Unmarshal(pb Message) error { // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - err := u.Unmarshal(p.buf[p.index:]) + if u, ok := pb.(newUnmarshaler); ok { + err := u.XXX_Unmarshal(p.buf[p.index:]) p.index = len(p.buf) return err } - - typ, base, err := getbase(pb) - if err != nil { - return err - } - - err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) - - if collectStats { - stats.Decode++ - } - - return err -} - -// unmarshalType does the work of unmarshaling a structure. -func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { - var state errorState - required, reqFields := prop.reqCount, uint64(0) - - var err error - for err == nil && o.index < len(o.buf) { - oi := o.index - var u uint64 - u, err = o.DecodeVarint() - if err != nil { - break - } - wire := int(u & 0x7) - if wire == WireEndGroup { - if is_group { - if required > 0 { - // Not enough information to determine the exact field. - // (See below.) - return &RequiredNotSetError{"{Unknown}"} - } - return nil // input is satisfied - } - return fmt.Errorf("proto: %s: wiretype end group for non-group", st) - } - tag := int(u >> 3) - if tag <= 0 { - return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) - } - fieldnum, ok := prop.decoderTags.get(tag) - if !ok { - // Maybe it's an extension? - if prop.extendable { - if e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) { - if err = o.skip(st, tag, wire); err == nil { - extmap := e.extensionsWrite() - ext := extmap[int32(tag)] // may be missing - ext.enc = append(ext.enc, o.buf[oi:o.index]...) - extmap[int32(tag)] = ext - } - continue - } - } - // Maybe it's a oneof? - if prop.oneofUnmarshaler != nil { - m := structPointer_Interface(base, st).(Message) - // First return value indicates whether tag is a oneof field. - ok, err = prop.oneofUnmarshaler(m, tag, wire, o) - if err == ErrInternalBadWireType { - // Map the error to something more descriptive. - // Do the formatting here to save generated code space. - err = fmt.Errorf("bad wiretype for oneof field in %T", m) - } - if ok { - continue - } - } - err = o.skipAndSave(st, tag, wire, base, prop.unrecField) - continue - } - p := prop.Prop[fieldnum] - - if p.dec == nil { - fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) - continue - } - dec := p.dec - if wire != WireStartGroup && wire != p.WireType { - if wire == WireBytes && p.packedDec != nil { - // a packable field - dec = p.packedDec - } else { - err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) - continue - } - } - decErr := dec(o, p, base) - if decErr != nil && !state.shouldContinue(decErr, p) { - err = decErr - } - if err == nil && p.Required { - // Successfully decoded a required field. - if tag <= 64 { - // use bitmap for fields 1-64 to catch field reuse. - var mask uint64 = 1 << uint64(tag-1) - if reqFields&mask == 0 { - // new required field - reqFields |= mask - required-- - } - } else { - // This is imprecise. It can be fooled by a required field - // with a tag > 64 that is encoded twice; that's very rare. - // A fully correct implementation would require allocating - // a data structure, which we would like to avoid. - required-- - } - } - } - if err == nil { - if is_group { - return io.ErrUnexpectedEOF - } - if state.err != nil { - return state.err - } - if required > 0 { - // Not enough information to determine the exact field. If we use extra - // CPU, we could determine the field only if the missing required field - // has a tag <= 64 and we check reqFields. - return &RequiredNotSetError{"{Unknown}"} - } - } - return err -} - -// Individual type decoders -// For each, -// u is the decoded value, -// v is a pointer to the field (pointer) in the struct - -// Sizes of the pools to allocate inside the Buffer. -// The goal is modest amortization and allocation -// on at least 16-byte boundaries. -const ( - boolPoolSize = 16 - uint32PoolSize = 8 - uint64PoolSize = 4 -) - -// Decode a bool. -func (o *Buffer) dec_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - if len(o.bools) == 0 { - o.bools = make([]bool, boolPoolSize) - } - o.bools[0] = u != 0 - *structPointer_Bool(base, p.field) = &o.bools[0] - o.bools = o.bools[1:] - return nil -} - -func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - *structPointer_BoolVal(base, p.field) = u != 0 - return nil -} - -// Decode an int32. -func (o *Buffer) dec_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) - return nil -} - -func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) - return nil -} - -// Decode an int64. -func (o *Buffer) dec_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64_Set(structPointer_Word64(base, p.field), o, u) - return nil -} - -func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64Val_Set(structPointer_Word64Val(base, p.field), o, u) - return nil -} - -// Decode a string. -func (o *Buffer) dec_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_String(base, p.field) = &s - return nil -} - -func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_StringVal(base, p.field) = s - return nil -} - -// Decode a slice of bytes ([]byte). -func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - *structPointer_Bytes(base, p.field) = b - return nil -} - -// Decode a slice of bools ([]bool). -func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - v := structPointer_BoolSlice(base, p.field) - *v = append(*v, u != 0) - return nil -} - -// Decode a slice of bools ([]bool) in packed format. -func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { - v := structPointer_BoolSlice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded bools - fin := o.index + nb - if fin < o.index { - return errOverflow - } - - y := *v - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - y = append(y, u != 0) - } - - *v = y - return nil -} - -// Decode a slice of int32s ([]int32). -func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - structPointer_Word32Slice(base, p.field).Append(uint32(u)) - return nil -} - -// Decode a slice of int32s ([]int32) in packed format. -func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int32s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(uint32(u)) - } - return nil -} - -// Decode a slice of int64s ([]int64). -func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - - structPointer_Word64Slice(base, p.field).Append(u) - return nil -} - -// Decode a slice of int64s ([]int64) in packed format. -func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int64s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(u) - } - return nil -} - -// Decode a slice of strings ([]string). -func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - v := structPointer_StringSlice(base, p.field) - *v = append(*v, s) - return nil -} - -// Decode a slice of slice of bytes ([][]byte). -func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - v := structPointer_BytesSlice(base, p.field) - *v = append(*v, b) - return nil -} - -// Decode a map field. -func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - oi := o.index // index at the end of this map entry - o.index -= len(raw) // move buffer back to start of map entry - - mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V - if mptr.Elem().IsNil() { - mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) - } - v := mptr.Elem() // map[K]V - - // Prepare addressable doubly-indirect placeholders for the key and value types. - // See enc_new_map for why. - keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K - keybase := toStructPointer(keyptr.Addr()) // **K - - var valbase structPointer - var valptr reflect.Value - switch p.mtype.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valptr = reflect.ValueOf(&dummy) // *[]byte - valbase = toStructPointer(valptr) // *[]byte - case reflect.Ptr: - // message; valptr is **Msg; need to allocate the intermediate pointer - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valptr.Set(reflect.New(valptr.Type().Elem())) - valbase = toStructPointer(valptr) - default: - // everything else - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valbase = toStructPointer(valptr.Addr()) // **V - } - - // Decode. - // This parses a restricted wire format, namely the encoding of a message - // with two fields. See enc_new_map for the format. - for o.index < oi { - // tagcode for key and value properties are always a single byte - // because they have tags 1 and 2. - tagcode := o.buf[o.index] - o.index++ - switch tagcode { - case p.mkeyprop.tagcode[0]: - if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { - return err - } - case p.mvalprop.tagcode[0]: - if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { - return err - } - default: - // TODO: Should we silently skip this instead? - return fmt.Errorf("proto: bad map data tag %d", raw[0]) - } - } - keyelem, valelem := keyptr.Elem(), valptr.Elem() - if !keyelem.IsValid() { - keyelem = reflect.Zero(p.mtype.Key()) - } - if !valelem.IsValid() { - valelem = reflect.Zero(p.mtype.Elem()) - } - - v.SetMapIndex(keyelem, valelem) - return nil -} - -// Decode a group. -func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - return o.unmarshalType(p.stype, p.sprop, true, bas) -} - -// Decode an embedded message. -func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { - raw, e := o.DecodeRawBytes(false) - if e != nil { - return e - } - - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := structPointer_Interface(bas, p.stype) - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, false, bas) - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of embedded messages. -func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, false, base) -} - -// Decode a slice of embedded groups. -func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, true, base) -} - -// Decode a slice of structs ([]*struct). -func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { - v := reflect.New(p.stype) - bas := toStructPointer(v) - structPointer_StructPointerSlice(base, p.field).Append(bas) - - if is_group { - err := o.unmarshalType(p.stype, p.sprop, is_group, bas) - return err - } - - raw, err := o.DecodeRawBytes(false) - if err != nil { + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) return err } - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := v.Interface() - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, is_group, bas) - - o.buf = obuf - o.index = oi - + // Slow workaround for messages that aren't Unmarshalers. + // This includes some hand-coded .pb.go files and + // bootstrap protos. + // TODO: fix all of those and then add Unmarshal to + // the Message interface. Then: + // The cast above and code below can be deleted. + // The old unmarshaler can be deleted. + // Clients can call Unmarshal directly (can already do that, actually). + var info InternalMessageInfo + err := info.Unmarshal(pb, p.buf[p.index:]) + p.index = len(p.buf) return err } diff --git a/vendor/github.com/golang/protobuf/proto/deprecated.go b/vendor/github.com/golang/protobuf/proto/deprecated.go new file mode 100644 index 000000000000..35b882c09aaf --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/deprecated.go @@ -0,0 +1,63 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import "errors" + +// Deprecated: do not use. +type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } + +// Deprecated: do not use. +func GetStats() Stats { return Stats{} } + +// Deprecated: do not use. +func MarshalMessageSet(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSet([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func MarshalMessageSetJSON(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSetJSON([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func RegisterMessageSetType(Message, int32, string) {} diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go new file mode 100644 index 000000000000..dea2617ced34 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/discard.go @@ -0,0 +1,350 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +type generatedDiscarder interface { + XXX_DiscardUnknown() +} + +// DiscardUnknown recursively discards all unknown fields from this message +// and all embedded messages. +// +// When unmarshaling a message with unrecognized fields, the tags and values +// of such fields are preserved in the Message. This allows a later call to +// marshal to be able to produce a message that continues to have those +// unrecognized fields. To avoid this, DiscardUnknown is used to +// explicitly clear the unknown fields after unmarshaling. +// +// For proto2 messages, the unknown fields of message extensions are only +// discarded from messages that have been accessed via GetExtension. +func DiscardUnknown(m Message) { + if m, ok := m.(generatedDiscarder); ok { + m.XXX_DiscardUnknown() + return + } + // TODO: Dynamically populate a InternalMessageInfo for legacy messages, + // but the master branch has no implementation for InternalMessageInfo, + // so it would be more work to replicate that approach. + discardLegacy(m) +} + +// DiscardUnknown recursively discards all unknown fields. +func (a *InternalMessageInfo) DiscardUnknown(m Message) { + di := atomicLoadDiscardInfo(&a.discard) + if di == nil { + di = getDiscardInfo(reflect.TypeOf(m).Elem()) + atomicStoreDiscardInfo(&a.discard, di) + } + di.discard(toPointer(&m)) +} + +type discardInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []discardFieldInfo + unrecognized field +} + +type discardFieldInfo struct { + field field // Offset of field, guaranteed to be valid + discard func(src pointer) +} + +var ( + discardInfoMap = map[reflect.Type]*discardInfo{} + discardInfoLock sync.Mutex +) + +func getDiscardInfo(t reflect.Type) *discardInfo { + discardInfoLock.Lock() + defer discardInfoLock.Unlock() + di := discardInfoMap[t] + if di == nil { + di = &discardInfo{typ: t} + discardInfoMap[t] = di + } + return di +} + +func (di *discardInfo) discard(src pointer) { + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&di.initialized) == 0 { + di.computeDiscardInfo() + } + + for _, fi := range di.fields { + sfp := src.offset(fi.field) + fi.discard(sfp) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { + // Ignore lock since DiscardUnknown is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + DiscardUnknown(m) + } + } + } + + if di.unrecognized.IsValid() { + *src.offset(di.unrecognized).toBytes() = nil + } +} + +func (di *discardInfo) computeDiscardInfo() { + di.lock.Lock() + defer di.lock.Unlock() + if di.initialized != 0 { + return + } + t := di.typ + n := t.NumField() + + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + dfi := discardFieldInfo{field: toField(&f)} + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) + case isSlice: // E.g., []*pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sps := src.getPointerSlice() + for _, sp := range sps { + if !sp.isNil() { + di.discard(sp) + } + } + } + default: // E.g., *pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sp := src.getPointer() + if !sp.isNil() { + di.discard(sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) + default: // E.g., map[K]V + if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) + dfi.discard = func(src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + DiscardUnknown(val.Interface().(Message)) + } + } + } else { + dfi.discard = func(pointer) {} // Noop + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) + default: // E.g., interface{} + // TODO: Make this faster? + dfi.discard = func(src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + DiscardUnknown(sv.Interface().(Message)) + } + } + } + } + default: + continue + } + di.fields = append(di.fields, dfi) + } + + di.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + di.unrecognized = toField(&f) + } + + atomic.StoreInt32(&di.initialized, 1) +} + +func discardLegacy(m Message) { + v := reflect.ValueOf(m) + if v.Kind() != reflect.Ptr || v.IsNil() { + return + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return + } + t := v.Type() + + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + vf := v.Field(i) + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) + case isSlice: // E.g., []*pb.T + for j := 0; j < vf.Len(); j++ { + discardLegacy(vf.Index(j).Interface().(Message)) + } + default: // E.g., *pb.T + discardLegacy(vf.Interface().(Message)) + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) + default: // E.g., map[K]V + tv := vf.Type().Elem() + if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) + for _, key := range vf.MapKeys() { + val := vf.MapIndex(key) + discardLegacy(val.Interface().(Message)) + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) + default: // E.g., test_proto.isCommunique_Union interface + if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { + vf = vf.Elem() // E.g., *test_proto.Communique_Msg + if !vf.IsNil() { + vf = vf.Elem() // E.g., test_proto.Communique_Msg + vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value + if vf.Kind() == reflect.Ptr { + discardLegacy(vf.Interface().(Message)) + } + } + } + } + } + } + + if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { + if vf.Type() != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + vf.Set(reflect.ValueOf([]byte(nil))) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(m); err == nil { + // Ignore lock since discardLegacy is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + discardLegacy(m) + } + } + } +} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go index 8b84d1b22d4c..3abfed2cff04 100644 --- a/vendor/github.com/golang/protobuf/proto/encode.go +++ b/vendor/github.com/golang/protobuf/proto/encode.go @@ -37,28 +37,9 @@ package proto import ( "errors" - "fmt" "reflect" - "sort" ) -// RequiredNotSetError is the error returned if Marshal is called with -// a protocol buffer struct whose required fields have not -// all been initialized. It is also the error returned if Unmarshal is -// called with an encoded protocol buffer that does not include all the -// required fields. -// -// When printed, RequiredNotSetError reports the first unset required field in a -// message. If the field cannot be precisely determined, it is reported as -// "{Unknown}". -type RequiredNotSetError struct { - field string -} - -func (e *RequiredNotSetError) Error() string { - return fmt.Sprintf("proto: required field %q not set", e.field) -} - var ( // errRepeatedHasNil is the error returned if Marshal is called with // a struct with a repeated field containing a nil element. @@ -82,10 +63,6 @@ var ( const maxVarintBytes = 10 // maximum length of a varint -// maxMarshalSize is the largest allowed size of an encoded protobuf, -// since C++ and Java use signed int32s for the size. -const maxMarshalSize = 1<<31 - 1 - // EncodeVarint returns the varint encoding of x. // This is the format for the // int32, int64, uint32, uint64, bool, and enum @@ -119,18 +96,27 @@ func (p *Buffer) EncodeVarint(x uint64) error { // SizeVarint returns the varint encoding size of an integer. func SizeVarint(x uint64) int { - return sizeVarint(x) -} - -func sizeVarint(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + switch { + case x < 1<<7: + return 1 + case x < 1<<14: + return 2 + case x < 1<<21: + return 3 + case x < 1<<28: + return 4 + case x < 1<<35: + return 5 + case x < 1<<42: + return 6 + case x < 1<<49: + return 7 + case x < 1<<56: + return 8 + case x < 1<<63: + return 9 + } + return 10 } // EncodeFixed64 writes a 64-bit integer to the Buffer. @@ -149,10 +135,6 @@ func (p *Buffer) EncodeFixed64(x uint64) error { return nil } -func sizeFixed64(x uint64) int { - return 8 -} - // EncodeFixed32 writes a 32-bit integer to the Buffer. // This is the format for the // fixed32, sfixed32, and float protocol buffer types. @@ -165,20 +147,12 @@ func (p *Buffer) EncodeFixed32(x uint64) error { return nil } -func sizeFixed32(x uint64) int { - return 4 -} - // EncodeZigzag64 writes a zigzag-encoded 64-bit integer // to the Buffer. // This is the format used for the sint64 protocol buffer type. func (p *Buffer) EncodeZigzag64(x uint64) error { // use signed number to get arithmetic right shift. - return p.EncodeVarint((x << 1) ^ uint64((int64(x) >> 63))) -} - -func sizeZigzag64(x uint64) int { - return sizeVarint((x << 1) ^ uint64((int64(x) >> 63))) + return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } // EncodeZigzag32 writes a zigzag-encoded 32-bit integer @@ -189,10 +163,6 @@ func (p *Buffer) EncodeZigzag32(x uint64) error { return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) } -func sizeZigzag32(x uint64) int { - return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - // EncodeRawBytes writes a count-delimited byte buffer to the Buffer. // This is the format used for the bytes protocol buffer // type and for embedded messages. @@ -202,11 +172,6 @@ func (p *Buffer) EncodeRawBytes(b []byte) error { return nil } -func sizeRawBytes(b []byte) int { - return sizeVarint(uint64(len(b))) + - len(b) -} - // EncodeStringBytes writes an encoded string to the Buffer. // This is the format used for the proto2 string type. func (p *Buffer) EncodeStringBytes(s string) error { @@ -215,319 +180,17 @@ func (p *Buffer) EncodeStringBytes(s string) error { return nil } -func sizeStringBytes(s string) int { - return sizeVarint(uint64(len(s))) + - len(s) -} - // Marshaler is the interface representing objects that can marshal themselves. type Marshaler interface { Marshal() ([]byte, error) } -// Marshal takes the protocol buffer -// and encodes it into the wire format, returning the data. -func Marshal(pb Message) ([]byte, error) { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - return m.Marshal() - } - p := NewBuffer(nil) - err := p.Marshal(pb) - if p.buf == nil && err == nil { - // Return a non-nil slice on success. - return []byte{}, nil - } - return p.buf, err -} - // EncodeMessage writes the protocol buffer to the Buffer, // prefixed by a varint-encoded length. func (p *Buffer) EncodeMessage(pb Message) error { - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - var state errorState - err = p.enc_len_struct(GetProperties(t.Elem()), base, &state) - } - return err -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, writing the result to the -// Buffer. -func (p *Buffer) Marshal(pb Message) error { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - data, err := m.Marshal() - p.buf = append(p.buf, data...) - return err - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - err = p.enc_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - (stats).Encode++ // Parens are to work around a goimports bug. - } - - if len(p.buf) > maxMarshalSize { - return ErrTooLarge - } - return err -} - -// Size returns the encoded size of a protocol buffer. -func Size(pb Message) (n int) { - // Can the object marshal itself? If so, Size is slow. - // TODO: add Size to Marshaler, or add a Sizer interface. - if m, ok := pb.(Marshaler); ok { - b, _ := m.Marshal() - return len(b) - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return 0 - } - if err == nil { - n = size_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - (stats).Size++ // Parens are to work around a goimports bug. - } - - return -} - -// Individual type encoders. - -// Encode a bool. -func (o *Buffer) enc_bool(p *Properties, base structPointer) error { - v := *structPointer_Bool(base, p.field) - if v == nil { - return ErrNil - } - x := 0 - if *v { - x = 1 - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error { - v := *structPointer_BoolVal(base, p.field) - if !v { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, 1) - return nil -} - -func size_bool(p *Properties, base structPointer) int { - v := *structPointer_Bool(base, p.field) - if v == nil { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -func size_proto3_bool(p *Properties, base structPointer) int { - v := *structPointer_BoolVal(base, p.field) - if !v && !p.oneof { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -// Encode an int32. -func (o *Buffer) enc_int32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode a uint32. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := word32_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := word32_Get(v) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode an int64. -func (o *Buffer) enc_int64(p *Properties, base structPointer) error { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return ErrNil - } - x := word64_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func size_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return 0 - } - x := word64_Get(v) - n += len(p.tagcode) - n += p.valSize(x) - return -} - -func size_proto3_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(x) - return -} - -// Encode a string. -func (o *Buffer) enc_string(p *Properties, base structPointer) error { - v := *structPointer_String(base, p.field) - if v == nil { - return ErrNil - } - x := *v - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(x) - return nil -} - -func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error { - v := *structPointer_StringVal(base, p.field) - if v == "" { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(v) - return nil -} - -func size_string(p *Properties, base structPointer) (n int) { - v := *structPointer_String(base, p.field) - if v == nil { - return 0 - } - x := *v - n += len(p.tagcode) - n += sizeStringBytes(x) - return -} - -func size_proto3_string(p *Properties, base structPointer) (n int) { - v := *structPointer_StringVal(base, p.field) - if v == "" && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeStringBytes(v) - return + siz := Size(pb) + p.EncodeVarint(uint64(siz)) + return p.Marshal(pb) } // All protocol buffer fields are nillable, but be careful. @@ -538,825 +201,3 @@ func isNil(v reflect.Value) bool { } return false } - -// Encode a message struct. -func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { - var state errorState - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return state.err - } - - o.buf = append(o.buf, p.tagcode...) - return o.enc_len_struct(p.sprop, structp, &state) -} - -func size_struct_message(p *Properties, base structPointer) int { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n0 := len(p.tagcode) - n1 := sizeRawBytes(data) - return n0 + n1 - } - - n0 := len(p.tagcode) - n1 := size_struct(p.sprop, structp) - n2 := sizeVarint(uint64(n1)) // size of encoded length - return n0 + n1 + n2 -} - -// Encode a group struct. -func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { - var state errorState - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return ErrNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - err := o.enc_struct(p.sprop, b) - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return state.err -} - -func size_struct_group(p *Properties, base structPointer) (n int) { - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return 0 - } - - n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) - n += size_struct(p.sprop, b) - n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return -} - -// Encode a slice of bools ([]bool). -func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - for _, x := range s { - o.buf = append(o.buf, p.tagcode...) - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_bool(p *Properties, base structPointer) int { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - return l * (len(p.tagcode) + 1) // each bool takes exactly one byte -} - -// Encode a slice of bools ([]bool) in packed format. -func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(l)) // each bool takes exactly one byte - for _, x := range s { - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_packed_bool(p *Properties, base structPointer) (n int) { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - n += len(p.tagcode) - n += sizeVarint(uint64(l)) - n += l // each bool takes exactly one byte - return -} - -// Encode a slice of bytes ([]byte). -func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func size_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if s == nil && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -func size_proto3_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -// Encode a slice of int32s ([]int32). -func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of int32s ([]int32) in packed format. -func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(buf, uint64(x)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - bufSize += p.valSize(uint64(x)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of uint32s ([]uint32). -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := s.Index(i) - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := s.Index(i) - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of uint32s ([]uint32) in packed format. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, uint64(s.Index(i))) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(uint64(s.Index(i))) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of int64s ([]int64). -func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, s.Index(i)) - } - return nil -} - -func size_slice_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - n += p.valSize(s.Index(i)) - } - return -} - -// Encode a slice of int64s ([]int64) in packed format. -func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, s.Index(i)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(s.Index(i)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of slice of bytes ([][]byte). -func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(ss[i]) - } - return nil -} - -func size_slice_slice_byte(p *Properties, base structPointer) (n int) { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return 0 - } - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeRawBytes(ss[i]) - } - return -} - -// Encode a slice of strings ([]string). -func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(ss[i]) - } - return nil -} - -func size_slice_string(p *Properties, base structPointer) (n int) { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeStringBytes(ss[i]) - } - return -} - -// Encode a slice of message structs ([]*struct). -func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return errRepeatedHasNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - continue - } - - o.buf = append(o.buf, p.tagcode...) - err := o.enc_len_struct(p.sprop, structp, &state) - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - } - return state.err -} - -func size_slice_struct_message(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return // return the size up to this point - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n += sizeRawBytes(data) - continue - } - - n0 := size_struct(p.sprop, structp) - n1 := sizeVarint(uint64(n0)) // size of encoded length - n += n0 + n1 - } - return -} - -// Encode a slice of group structs ([]*struct). -func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return errRepeatedHasNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - - err := o.enc_struct(p.sprop, b) - - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - } - return state.err -} - -func size_slice_struct_group(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) - n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return // return size up to this point - } - - n += size_struct(p.sprop, b) - } - return -} - -// Encode an extension map. -func (o *Buffer) enc_map(p *Properties, base structPointer) error { - exts := structPointer_ExtMap(base, p.field) - if err := encodeExtensionsMap(*exts); err != nil { - return err - } - - return o.enc_map_body(*exts) -} - -func (o *Buffer) enc_exts(p *Properties, base structPointer) error { - exts := structPointer_Extensions(base, p.field) - - v, mu := exts.extensionsRead() - if v == nil { - return nil - } - - mu.Lock() - defer mu.Unlock() - if err := encodeExtensionsMap(v); err != nil { - return err - } - - return o.enc_map_body(v) -} - -func (o *Buffer) enc_map_body(v map[int32]Extension) error { - // Fast-path for common cases: zero or one extensions. - if len(v) <= 1 { - for _, e := range v { - o.buf = append(o.buf, e.enc...) - } - return nil - } - - // Sort keys to provide a deterministic encoding. - keys := make([]int, 0, len(v)) - for k := range v { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - o.buf = append(o.buf, v[int32(k)].enc...) - } - return nil -} - -func size_map(p *Properties, base structPointer) int { - v := structPointer_ExtMap(base, p.field) - return extensionsMapSize(*v) -} - -func size_exts(p *Properties, base structPointer) int { - v := structPointer_Extensions(base, p.field) - return extensionsSize(v) -} - -// Encode a map field. -func (o *Buffer) enc_new_map(p *Properties, base structPointer) error { - var state errorState // XXX: or do we need to plumb this through? - - /* - A map defined as - map map_field = N; - is encoded in the same way as - message MapFieldEntry { - key_type key = 1; - value_type value = 2; - } - repeated MapFieldEntry map_field = N; - */ - - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - if v.Len() == 0 { - return nil - } - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - enc := func() error { - if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil { - return err - } - if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil { - return err - } - return nil - } - - // Don't sort map keys. It is not required by the spec, and C++ doesn't do it. - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - - keycopy.Set(key) - valcopy.Set(val) - - o.buf = append(o.buf, p.tagcode...) - if err := o.enc_len_thing(enc, &state); err != nil { - return err - } - } - return nil -} - -func size_new_map(p *Properties, base structPointer) int { - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - n := 0 - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - keycopy.Set(key) - valcopy.Set(val) - - // Tag codes for key and val are the responsibility of the sub-sizer. - keysize := p.mkeyprop.size(p.mkeyprop, keybase) - valsize := p.mvalprop.size(p.mvalprop, valbase) - entry := keysize + valsize - // Add on tag code and length of map entry itself. - n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry - } - return n -} - -// mapEncodeScratch returns a new reflect.Value matching the map's value type, -// and a structPointer suitable for passing to an encoder or sizer. -func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) { - // Prepare addressable doubly-indirect placeholders for the key and value types. - // This is needed because the element-type encoders expect **T, but the map iteration produces T. - - keycopy = reflect.New(mapType.Key()).Elem() // addressable K - keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K - keyptr.Set(keycopy.Addr()) // - keybase = toStructPointer(keyptr.Addr()) // **K - - // Value types are more varied and require special handling. - switch mapType.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte - valbase = toStructPointer(valcopy.Addr()) - case reflect.Ptr: - // message; the generated field type is map[K]*Msg (so V is *Msg), - // so we only need one level of indirection. - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valbase = toStructPointer(valcopy.Addr()) - default: - // everything else - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V - valptr.Set(valcopy.Addr()) // - valbase = toStructPointer(valptr.Addr()) // **V - } - return -} - -// Encode a struct. -func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { - var state errorState - // Encode fields in tag order so that decoders may use optimizations - // that depend on the ordering. - // https://developers.google.com/protocol-buffers/docs/encoding#order - for _, i := range prop.order { - p := prop.Prop[i] - if p.enc != nil { - err := p.enc(o, p, base) - if err != nil { - if err == ErrNil { - if p.Required && state.err == nil { - state.err = &RequiredNotSetError{p.Name} - } - } else if err == errRepeatedHasNil { - // Give more context to nil values in repeated fields. - return errors.New("repeated field " + p.OrigName + " has nil element") - } else if !state.shouldContinue(err, p) { - return err - } - } - if len(o.buf) > maxMarshalSize { - return ErrTooLarge - } - } - } - - // Do oneof fields. - if prop.oneofMarshaler != nil { - m := structPointer_Interface(base, prop.stype).(Message) - if err := prop.oneofMarshaler(m, o); err == ErrNil { - return errOneofHasNil - } else if err != nil { - return err - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - if len(o.buf)+len(v) > maxMarshalSize { - return ErrTooLarge - } - if len(v) > 0 { - o.buf = append(o.buf, v...) - } - } - - return state.err -} - -func size_struct(prop *StructProperties, base structPointer) (n int) { - for _, i := range prop.order { - p := prop.Prop[i] - if p.size != nil { - n += p.size(p, base) - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - n += len(v) - } - - // Factor in any oneof fields. - if prop.oneofSizer != nil { - m := structPointer_Interface(base, prop.stype).(Message) - n += prop.oneofSizer(m) - } - - return -} - -var zeroes [20]byte // longer than any conceivable sizeVarint - -// Encode a struct, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { - return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state) -} - -// Encode something, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error { - iLen := len(o.buf) - o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length - iMsg := len(o.buf) - err := enc() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - lMsg := len(o.buf) - iMsg - lLen := sizeVarint(uint64(lMsg)) - switch x := lLen - (iMsg - iLen); { - case x > 0: // actual length is x bytes larger than the space we reserved - // Move msg x bytes right. - o.buf = append(o.buf, zeroes[:x]...) - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - case x < 0: // actual length is x bytes smaller than the space we reserved - // Move msg x bytes left. - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - o.buf = o.buf[:len(o.buf)+x] // x is negative - } - // Encode the length in the reserved space. - o.buf = o.buf[:iLen] - o.EncodeVarint(uint64(lMsg)) - o.buf = o.buf[:len(o.buf)+lMsg] - return state.err -} - -// errorState maintains the first error that occurs and updates that error -// with additional context. -type errorState struct { - err error -} - -// shouldContinue reports whether encoding should continue upon encountering the -// given error. If the error is RequiredNotSetError, shouldContinue returns true -// and, if this is the first appearance of that error, remembers it for future -// reporting. -// -// If prop is not nil, it may update any error with additional context about the -// field with the error. -func (s *errorState) shouldContinue(err error, prop *Properties) bool { - // Ignore unset required fields. - reqNotSet, ok := err.(*RequiredNotSetError) - if !ok { - return false - } - if s.err == nil { - if prop != nil { - err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} - } - s.err = err - } - return true -} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go index 2ed1cf596664..f9b6e41b3c10 100644 --- a/vendor/github.com/golang/protobuf/proto/equal.go +++ b/vendor/github.com/golang/protobuf/proto/equal.go @@ -109,15 +109,6 @@ func equalStruct(v1, v2 reflect.Value) bool { // set/unset mismatch return false } - b1, ok := f1.Interface().(raw) - if ok { - b2 := f2.Interface().(raw) - // RawMessage - if !bytes.Equal(b1.Bytes(), b2.Bytes()) { - return false - } - continue - } f1, f2 = f1.Elem(), f2.Elem() } if !equalAny(f1, f2, sprop.Prop[i]) { @@ -146,11 +137,7 @@ func equalStruct(v1, v2 reflect.Value) bool { u1 := uf.Bytes() u2 := v2.FieldByName("XXX_unrecognized").Bytes() - if !bytes.Equal(u1, u2) { - return false - } - - return true + return bytes.Equal(u1, u2) } // v1 and v2 are known to have the same type. @@ -259,7 +246,17 @@ func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { return false } - m1, m2 := e1.value, e2.value + m1 := extensionAsLegacyType(e1.value) + m2 := extensionAsLegacyType(e2.value) + + if m1 == nil && m2 == nil { + // Both have only encoded form. + if bytes.Equal(e1.enc, e2.enc) { + continue + } + // The bytes are different, but the extensions might still be + // equal. We need to decode them to compare. + } if m1 != nil && m2 != nil { // Both are unencoded. @@ -276,8 +273,12 @@ func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { desc = m[extNum] } if desc == nil { + // If both have only encoded form and the bytes are the same, + // it is handled above. We get here when the bytes are different. + // We don't know how to decode it, so just compare them as byte + // slices. log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - continue + return false } var err error if m1 == nil { diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go index eaad21831263..fa88add30a41 100644 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ b/vendor/github.com/golang/protobuf/proto/extensions.go @@ -38,6 +38,7 @@ package proto import ( "errors" "fmt" + "io" "reflect" "strconv" "sync" @@ -91,14 +92,29 @@ func (n notLocker) Unlock() {} // extendable returns the extendableProto interface for the given generated proto message. // If the proto message has the old extension format, it returns a wrapper that implements // the extendableProto interface. -func extendable(p interface{}) (extendableProto, bool) { - if ep, ok := p.(extendableProto); ok { - return ep, ok - } - if ep, ok := p.(extendableProtoV1); ok { - return extensionAdapter{ep}, ok +func extendable(p interface{}) (extendableProto, error) { + switch p := p.(type) { + case extendableProto: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return p, nil + case extendableProtoV1: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return extensionAdapter{p}, nil } - return nil, false + // Don't allocate a specific error containing %T: + // this is the hot path for Clone and MarshalText. + return nil, errNotExtendable +} + +var errNotExtendable = errors.New("proto: not an extendable proto.Message") + +func isNilPtr(x interface{}) bool { + v := reflect.ValueOf(x) + return v.Kind() == reflect.Ptr && v.IsNil() } // XXX_InternalExtensions is an internal representation of proto extensions. @@ -143,9 +159,6 @@ func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Loc return e.p.extensionMap, &e.p.mu } -var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() -var extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem() - // ExtensionDesc represents an extension specification. // Used in generated code from the protocol compiler. type ExtensionDesc struct { @@ -172,15 +185,31 @@ type Extension struct { // extension will have only enc set. When such an extension is // accessed using GetExtension (or GetExtensions) desc and value // will be set. - desc *ExtensionDesc + desc *ExtensionDesc + + // value is a concrete value for the extension field. Let the type of + // desc.ExtensionType be the "API type" and the type of Extension.value + // be the "storage type". The API type and storage type are the same except: + // * For scalars (except []byte), the API type uses *T, + // while the storage type uses T. + // * For repeated fields, the API type uses []T, while the storage type + // uses *[]T. + // + // The reason for the divergence is so that the storage type more naturally + // matches what is expected of when retrieving the values through the + // protobuf reflection APIs. + // + // The value may only be populated if desc is also populated. value interface{} - enc []byte + + // enc is the raw bytes for the extension field. + enc []byte } // SetRawExtension is for testing only. func SetRawExtension(base Message, id int32, b []byte) { - epb, ok := extendable(base) - if !ok { + epb, err := extendable(base) + if err != nil { return } extmap := epb.extensionsWrite() @@ -205,7 +234,7 @@ func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { pbi = ea.extendableProtoV1 } if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { - return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) + return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) } // Check the range. if !isExtensionField(pb, extension.Field) { @@ -250,85 +279,11 @@ func extensionProperties(ed *ExtensionDesc) *Properties { return prop } -// encode encodes any unmarshaled (unencoded) extensions in e. -func encodeExtensions(e *XXX_InternalExtensions) error { - m, mu := e.extensionsRead() - if m == nil { - return nil // fast path - } - mu.Lock() - defer mu.Unlock() - return encodeExtensionsMap(m) -} - -// encode encodes any unmarshaled (unencoded) extensions in e. -func encodeExtensionsMap(m map[int32]Extension) error { - for k, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - p := NewBuffer(nil) - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - if err := props.enc(p, props, toStructPointer(x)); err != nil { - return err - } - e.enc = p.buf - m[k] = e - } - return nil -} - -func extensionsSize(e *XXX_InternalExtensions) (n int) { - m, mu := e.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - defer mu.Unlock() - return extensionsMapSize(m) -} - -func extensionsMapSize(m map[int32]Extension) (n int) { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - n += props.size(props, toStructPointer(x)) - } - return -} - // HasExtension returns whether the given extension is present in pb. func HasExtension(pb Message, extension *ExtensionDesc) bool { // TODO: Check types, field numbers, etc.? - epb, ok := extendable(pb) - if !ok { + epb, err := extendable(pb) + if err != nil { return false } extmap, mu := epb.extensionsRead() @@ -336,15 +291,15 @@ func HasExtension(pb Message, extension *ExtensionDesc) bool { return false } mu.Lock() - _, ok = extmap[extension.Field] + _, ok := extmap[extension.Field] mu.Unlock() return ok } // ClearExtension removes the given extension from pb. func ClearExtension(pb Message, extension *ExtensionDesc) { - epb, ok := extendable(pb) - if !ok { + epb, err := extendable(pb) + if err != nil { return } // TODO: Check types, field numbers, etc.? @@ -352,16 +307,26 @@ func ClearExtension(pb Message, extension *ExtensionDesc) { delete(extmap, extension.Field) } -// GetExtension parses and returns the given extension of pb. -// If the extension is not present and has no default value it returns ErrMissingExtension. +// GetExtension retrieves a proto2 extended field from pb. +// +// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), +// then GetExtension parses the encoded field and returns a Go value of the specified type. +// If the field is not present, then the default value is returned (if one is specified), +// otherwise ErrMissingExtension is reported. +// +// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), +// then GetExtension returns the raw encoded bytes of the field extension. func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { - epb, ok := extendable(pb) - if !ok { - return nil, errors.New("proto: not an extendable proto") + epb, err := extendable(pb) + if err != nil { + return nil, err } - if err := checkExtensionTypes(epb, extension); err != nil { - return nil, err + if extension.ExtendedType != nil { + // can only check type if this is a complete descriptor + if err := checkExtensionTypes(epb, extension); err != nil { + return nil, err + } } emap, mu := epb.extensionsRead() @@ -385,7 +350,12 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { // descriptors with the same field number. return nil, errors.New("proto: descriptor conflict") } - return e.value, nil + return extensionAsLegacyType(e.value), nil + } + + if extension.ExtensionType == nil { + // incomplete descriptor + return e.enc, nil } v, err := decodeExtension(e.enc, extension) @@ -395,16 +365,21 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { // Remember the decoded version and drop the encoded version. // That way it is safe to mutate what we return. - e.value = v + e.value = extensionAsStorageType(v) e.desc = extension e.enc = nil emap[extension.Field] = e - return e.value, nil + return extensionAsLegacyType(e.value), nil } // defaultExtensionValue returns the default value for extension. // If no default for an extension is defined ErrMissingExtension is returned. func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + if extension.ExtensionType == nil { + // incomplete descriptor, so no default + return nil, ErrMissingExtension + } + t := reflect.TypeOf(extension.ExtensionType) props := extensionProperties(extension) @@ -439,31 +414,28 @@ func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { // decodeExtension decodes an extension encoded in b. func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { - o := NewBuffer(b) - t := reflect.TypeOf(extension.ExtensionType) - - props := extensionProperties(extension) + unmarshal := typeUnmarshaler(t, extension.Tag) // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate a "field" to store the pointer/slice itself; the - // pointer/slice will be stored here. We pass - // the address of this field to props.dec. - // This passes a zero field and a *t and lets props.dec - // interpret it as a *struct{ x t }. + // Allocate space to store the pointer/slice. value := reflect.New(t).Elem() + var err error for { - // Discard wire type and field number varint. It isn't needed. - if _, err := o.DecodeVarint(); err != nil { - return nil, err + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF } + b = b[n:] + wire := int(x) & 7 - if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { + b, err = unmarshal(b, valToPointer(value.Addr()), wire) + if err != nil { return nil, err } - if o.index >= len(o.buf) { + if len(b) == 0 { break } } @@ -473,9 +445,9 @@ func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { // GetExtensions returns a slice of the extensions present in pb that are also listed in es. // The returned slice has the same length as es; missing extensions will appear as nil elements. func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - epb, ok := extendable(pb) - if !ok { - return nil, errors.New("proto: not an extendable proto") + epb, err := extendable(pb) + if err != nil { + return nil, err } extensions = make([]interface{}, len(es)) for i, e := range es { @@ -494,9 +466,9 @@ func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, e // For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing // just the Field field, which defines the extension's field number. func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { - epb, ok := extendable(pb) - if !ok { - return nil, fmt.Errorf("proto: %T is not an extendable proto.Message", pb) + epb, err := extendable(pb) + if err != nil { + return nil, err } registeredExtensions := RegisteredExtensions(pb) @@ -523,16 +495,16 @@ func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { // SetExtension sets the specified extension of pb to the specified value. func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { - epb, ok := extendable(pb) - if !ok { - return errors.New("proto: not an extendable proto") + epb, err := extendable(pb) + if err != nil { + return err } if err := checkExtensionTypes(epb, extension); err != nil { return err } typ := reflect.TypeOf(extension.ExtensionType) if typ != reflect.TypeOf(value) { - return errors.New("proto: bad extension value type") + return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType) } // nil extension values need to be caught early, because the // encoder can't distinguish an ErrNil due to a nil extension @@ -544,14 +516,14 @@ func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error } extmap := epb.extensionsWrite() - extmap[extension.Field] = Extension{desc: extension, value: value} + extmap[extension.Field] = Extension{desc: extension, value: extensionAsStorageType(value)} return nil } // ClearAllExtensions clears all extensions from pb. func ClearAllExtensions(pb Message) { - epb, ok := extendable(pb) - if !ok { + epb, err := extendable(pb) + if err != nil { return } m := epb.extensionsWrite() @@ -585,3 +557,51 @@ func RegisterExtension(desc *ExtensionDesc) { func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { return extensionMaps[reflect.TypeOf(pb).Elem()] } + +// extensionAsLegacyType converts an value in the storage type as the API type. +// See Extension.value. +func extensionAsLegacyType(v interface{}) interface{} { + switch rv := reflect.ValueOf(v); rv.Kind() { + case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: + // Represent primitive types as a pointer to the value. + rv2 := reflect.New(rv.Type()) + rv2.Elem().Set(rv) + v = rv2.Interface() + case reflect.Ptr: + // Represent slice types as the value itself. + switch rv.Type().Elem().Kind() { + case reflect.Slice: + if rv.IsNil() { + v = reflect.Zero(rv.Type().Elem()).Interface() + } else { + v = rv.Elem().Interface() + } + } + } + return v +} + +// extensionAsStorageType converts an value in the API type as the storage type. +// See Extension.value. +func extensionAsStorageType(v interface{}) interface{} { + switch rv := reflect.ValueOf(v); rv.Kind() { + case reflect.Ptr: + // Represent slice types as the value itself. + switch rv.Type().Elem().Kind() { + case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: + if rv.IsNil() { + v = reflect.Zero(rv.Type().Elem()).Interface() + } else { + v = rv.Elem().Interface() + } + } + case reflect.Slice: + // Represent slice types as a pointer to the value. + if rv.Type().Elem().Kind() != reflect.Uint8 { + rv2 := reflect.New(rv.Type()) + rv2.Elem().Set(rv) + v = rv2.Interface() + } + } + return v +} diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go index 1c225504a013..fdd328bb7f54 100644 --- a/vendor/github.com/golang/protobuf/proto/lib.go +++ b/vendor/github.com/golang/protobuf/proto/lib.go @@ -273,32 +273,73 @@ import ( "sync" ) -// Message is implemented by generated protocol buffer messages. -type Message interface { - Reset() - String() string - ProtoMessage() +// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. +// Marshal reports this when a required field is not initialized. +// Unmarshal reports this when a required field is missing from the wire data. +type RequiredNotSetError struct{ field string } + +func (e *RequiredNotSetError) Error() string { + if e.field == "" { + return fmt.Sprintf("proto: required field not set") + } + return fmt.Sprintf("proto: required field %q not set", e.field) +} +func (e *RequiredNotSetError) RequiredNotSet() bool { + return true } -// Stats records allocation details about the protocol buffer encoders -// and decoders. Useful for tuning the library itself. -type Stats struct { - Emalloc uint64 // mallocs in encode - Dmalloc uint64 // mallocs in decode - Encode uint64 // number of encodes - Decode uint64 // number of decodes - Chit uint64 // number of cache hits - Cmiss uint64 // number of cache misses - Size uint64 // number of sizes +type invalidUTF8Error struct{ field string } + +func (e *invalidUTF8Error) Error() string { + if e.field == "" { + return "proto: invalid UTF-8 detected" + } + return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) +} +func (e *invalidUTF8Error) InvalidUTF8() bool { + return true } -// Set to true to enable stats collection. -const collectStats = false +// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. +// This error should not be exposed to the external API as such errors should +// be recreated with the field information. +var errInvalidUTF8 = &invalidUTF8Error{} -var stats Stats +// isNonFatal reports whether the error is either a RequiredNotSet error +// or a InvalidUTF8 error. +func isNonFatal(err error) bool { + if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { + return true + } + if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { + return true + } + return false +} -// GetStats returns a copy of the global Stats structure. -func GetStats() Stats { return stats } +type nonFatal struct{ E error } + +// Merge merges err into nf and reports whether it was successful. +// Otherwise it returns false for any fatal non-nil errors. +func (nf *nonFatal) Merge(err error) (ok bool) { + if err == nil { + return true // not an error + } + if !isNonFatal(err) { + return false // fatal error + } + if nf.E == nil { + nf.E = err // store first instance of non-fatal error + } + return true +} + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} // A Buffer is a buffer manager for marshaling and unmarshaling // protocol buffers. It may be reused between invocations to @@ -309,16 +350,7 @@ type Buffer struct { buf []byte // encode/decode byte stream index int // read point - // pools of basic types to amortize allocation. - bools []bool - uint32s []uint32 - uint64s []uint64 - - // extra pools, only used with pointer_reflect.go - int32s []int32 - int64s []int64 - float32s []float32 - float64s []float64 + deterministic bool } // NewBuffer allocates a new Buffer and initializes its internal data to @@ -343,6 +375,30 @@ func (p *Buffer) SetBuf(s []byte) { // Bytes returns the contents of the Buffer. func (p *Buffer) Bytes() []byte { return p.buf } +// SetDeterministic sets whether to use deterministic serialization. +// +// Deterministic serialization guarantees that for a given binary, equal +// messages will always be serialized to the same bytes. This implies: +// +// - Repeated serialization of a message will return the same bytes. +// - Different processes of the same binary (which may be executing on +// different machines) will serialize equal messages to the same bytes. +// +// Note that the deterministic serialization is NOT canonical across +// languages. It is not guaranteed to remain stable over time. It is unstable +// across different builds with schema changes due to unknown fields. +// Users who need canonical serialization (e.g., persistent storage in a +// canonical form, fingerprinting, etc.) should define their own +// canonicalization specification and implement their own serializer rather +// than relying on this API. +// +// If deterministic serialization is requested, map entries will be sorted +// by keys in lexographical order. This is an implementation detail and +// subject to change. +func (p *Buffer) SetDeterministic(deterministic bool) { + p.deterministic = deterministic +} + /* * Helper routines for simplifying the creation of optional fields of basic type. */ @@ -831,22 +887,12 @@ func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMes return sf, false, nil } +// mapKeys returns a sort.Interface to be used for sorting the map keys. // Map fields may have key types of non-float scalars, strings and enums. -// The easiest way to sort them in some deterministic order is to use fmt. -// If this turns out to be inefficient we can always consider other options, -// such as doing a Schwartzian transform. - func mapKeys(vs []reflect.Value) sort.Interface { - s := mapKeySorter{ - vs: vs, - // default Less function: textual comparison - less: func(a, b reflect.Value) bool { - return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) - }, - } + s := mapKeySorter{vs: vs} - // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; - // numeric keys are sorted numerically. + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. if len(vs) == 0 { return s } @@ -855,6 +901,12 @@ func mapKeys(vs []reflect.Value) sort.Interface { s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } case reflect.Uint32, reflect.Uint64: s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + case reflect.Bool: + s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true + case reflect.String: + s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } + default: + panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) } return s @@ -888,10 +940,26 @@ func isProto3Zero(v reflect.Value) bool { return false } -// ProtoPackageIsVersion2 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const ProtoPackageIsVersion2 = true +const ( + // ProtoPackageIsVersion3 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + ProtoPackageIsVersion3 = true + + // ProtoPackageIsVersion2 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + ProtoPackageIsVersion2 = true -// ProtoPackageIsVersion1 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const ProtoPackageIsVersion1 = true + // ProtoPackageIsVersion1 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + ProtoPackageIsVersion1 = true +) + +// InternalMessageInfo is a type used internally by generated .pb.go files. +// This type is not intended to be used by non-generated code. +// This type is not subject to any compatibility guarantee. +type InternalMessageInfo struct { + marshal *marshalInfo + unmarshal *unmarshalInfo + merge *mergeInfo + discard *discardInfo +} diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go index fd982decd66e..f48a756761ea 100644 --- a/vendor/github.com/golang/protobuf/proto/message_set.go +++ b/vendor/github.com/golang/protobuf/proto/message_set.go @@ -36,12 +36,7 @@ package proto */ import ( - "bytes" - "encoding/json" "errors" - "fmt" - "reflect" - "sort" ) // errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. @@ -94,10 +89,7 @@ func (ms *messageSet) find(pb Message) *_MessageSet_Item { } func (ms *messageSet) Has(pb Message) bool { - if ms.find(pb) != nil { - return true - } - return false + return ms.find(pb) != nil } func (ms *messageSet) Unmarshal(pb Message) error { @@ -147,50 +139,9 @@ func skipVarint(buf []byte) []byte { return buf[i+1:] } -// MarshalMessageSet encodes the extension map represented by m in the message set wire format. -// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSet(exts interface{}) ([]byte, error) { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - if err := encodeExtensions(exts); err != nil { - return nil, err - } - m, _ = exts.extensionsRead() - case map[int32]Extension: - if err := encodeExtensionsMap(exts); err != nil { - return nil, err - } - m = exts - default: - return nil, errors.New("proto: not an extension map") - } - - // Sort extension IDs to provide a deterministic encoding. - // See also enc_map in encode.go. - ids := make([]int, 0, len(m)) - for id := range m { - ids = append(ids, int(id)) - } - sort.Ints(ids) - - ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} - for _, id := range ids { - e := m[int32(id)] - // Remove the wire type and field number varint, as well as the length varint. - msg := skipVarint(skipVarint(e.enc)) - - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: Int32(int32(id)), - Message: msg, - }) - } - return Marshal(ms) -} - -// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSet(buf []byte, exts interface{}) error { +// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func unmarshalMessageSet(buf []byte, exts interface{}) error { var m map[int32]Extension switch exts := exts.(type) { case *XXX_InternalExtensions: @@ -228,84 +179,3 @@ func UnmarshalMessageSet(buf []byte, exts interface{}) error { } return nil } - -// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. -// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m, _ = exts.extensionsRead() - case map[int32]Extension: - m = exts - default: - return nil, errors.New("proto: not an extension map") - } - var b bytes.Buffer - b.WriteByte('{') - - // Process the map in key order for deterministic output. - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) // int32Slice defined in text.go - - for i, id := range ids { - ext := m[id] - if i > 0 { - b.WriteByte(',') - } - - msd, ok := messageSetMap[id] - if !ok { - // Unknown type; we can't render it, so skip it. - continue - } - fmt.Fprintf(&b, `"[%s]":`, msd.name) - - x := ext.value - if x == nil { - x = reflect.New(msd.t.Elem()).Interface() - if err := Unmarshal(ext.enc, x.(Message)); err != nil { - return nil, err - } - } - d, err := json.Marshal(x) - if err != nil { - return nil, err - } - b.Write(d) - } - b.WriteByte('}') - return b.Bytes(), nil -} - -// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. -// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { - // Common-case fast path. - if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { - return nil - } - - // This is fairly tricky, and it's not clear that it is needed. - return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") -} - -// A global registry of types that can be used in a MessageSet. - -var messageSetMap = make(map[int32]messageSetDesc) - -type messageSetDesc struct { - t reflect.Type // pointer to struct - name string -} - -// RegisterMessageSetType is called from the generated code. -func RegisterMessageSetType(m Message, fieldNum int32, name string) { - messageSetMap[fieldNum] = messageSetDesc{ - t: reflect.TypeOf(m), - name: name, - } -} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go index fb512e2e16dc..94fa9194a882 100644 --- a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go +++ b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go @@ -29,7 +29,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +build appengine js +// +build purego appengine js // This file contains an implementation of proto field accesses using package reflect. // It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can @@ -38,32 +38,13 @@ package proto import ( - "math" "reflect" + "sync" ) -// A structPointer is a pointer to a struct. -type structPointer struct { - v reflect.Value -} - -// toStructPointer returns a structPointer equivalent to the given reflect value. -// The reflect value must itself be a pointer to a struct. -func toStructPointer(v reflect.Value) structPointer { - return structPointer{v} -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p.v.IsNil() -} +const unsafeAllowed = false -// Interface returns the struct pointer as an interface value. -func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { - return p.v.Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. +// A field identifies a field in a struct, accessible from a pointer. // In this implementation, a field is identified by the sequence of field indices // passed to reflect's FieldByIndex. type field []int @@ -76,409 +57,304 @@ func toField(f *reflect.StructField) field { // invalidField is an invalid field identifier. var invalidField = field(nil) +// zeroField is a noop when calling pointer.offset. +var zeroField = field([]int{}) + // IsValid reports whether the field identifier is valid. func (f field) IsValid() bool { return f != nil } -// field returns the given field in the struct as a reflect value. -func structPointer_field(p structPointer, f field) reflect.Value { - // Special case: an extension map entry with a value of type T - // passes a *T to the struct-handling code with a zero field, - // expecting that it will be treated as equivalent to *struct{ X T }, - // which has the same memory layout. We have to handle that case - // specially, because reflect will panic if we call FieldByIndex on a - // non-struct. - if f == nil { - return p.v.Elem() - } - - return p.v.Elem().FieldByIndex(f) +// The pointer type is for the table-driven decoder. +// The implementation here uses a reflect.Value of pointer type to +// create a generic pointer. In pointer_unsafe.go we use unsafe +// instead of reflect to implement the same (but faster) interface. +type pointer struct { + v reflect.Value } -// ifield returns the given field in the struct as an interface value. -func structPointer_ifield(p structPointer, f field) interface{} { - return structPointer_field(p, f).Addr().Interface() +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + return pointer{v: reflect.ValueOf(*i)} } -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return structPointer_ifield(p, f).(*[]byte) +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr, deref bool) pointer { + v := reflect.ValueOf(*i) + u := reflect.New(v.Type()) + u.Elem().Set(v) + if deref { + u = u.Elem() + } + return pointer{v: u} } -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return structPointer_ifield(p, f).(*[][]byte) +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{v: v} } -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return structPointer_ifield(p, f).(**bool) +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} } -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return structPointer_ifield(p, f).(*bool) +func (p pointer) isNil() bool { + return p.v.IsNil() } -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return structPointer_ifield(p, f).(*[]bool) +// grow updates the slice s in place to make it one element longer. +// s must be addressable. +// Returns the (addressable) new element. +func grow(s reflect.Value) reflect.Value { + n, m := s.Len(), s.Cap() + if n < m { + s.SetLen(n + 1) + } else { + s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) + } + return s.Index(n) } -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return structPointer_ifield(p, f).(**string) +func (p pointer) toInt64() *int64 { + return p.v.Interface().(*int64) } - -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return structPointer_ifield(p, f).(*string) +func (p pointer) toInt64Ptr() **int64 { + return p.v.Interface().(**int64) } - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return structPointer_ifield(p, f).(*[]string) +func (p pointer) toInt64Slice() *[]int64 { + return p.v.Interface().(*[]int64) } -// Extensions returns the address of an extension map field in the struct. -func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { - return structPointer_ifield(p, f).(*XXX_InternalExtensions) -} +var int32ptr = reflect.TypeOf((*int32)(nil)) -// ExtMap returns the address of an extension map field in the struct. -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return structPointer_ifield(p, f).(*map[int32]Extension) +func (p pointer) toInt32() *int32 { + return p.v.Convert(int32ptr).Interface().(*int32) } -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return structPointer_field(p, f).Addr() +// The toInt32Ptr/Slice methods don't work because of enums. +// Instead, we must use set/get methods for the int32ptr/slice case. +/* + func (p pointer) toInt32Ptr() **int32 { + return p.v.Interface().(**int32) } - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - structPointer_field(p, f).Set(q.v) + func (p pointer) toInt32Slice() *[]int32 { + return p.v.Interface().(*[]int32) } - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return structPointer{structPointer_field(p, f)} +*/ +func (p pointer) getInt32Ptr() *int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().(*int32) + } + // an enum + return p.v.Elem().Convert(int32PtrType).Interface().(*int32) +} +func (p pointer) setInt32Ptr(v int32) { + // Allocate value in a *int32. Possibly convert that to a *enum. + // Then assign it to a **int32 or **enum. + // Note: we can convert *int32 to *enum, but we can't convert + // **int32 to **enum! + p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) +} + +// getInt32Slice copies []int32 from p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getInt32Slice() []int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().([]int32) + } + // an enum + // Allocate a []int32, then assign []enum's values into it. + // Note: we can't convert []enum to []int32. + slice := p.v.Elem() + s := make([]int32, slice.Len()) + for i := 0; i < slice.Len(); i++ { + s[i] = int32(slice.Index(i).Int()) + } + return s } -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { - return structPointerSlice{structPointer_field(p, f)} +// setInt32Slice copies []int32 into p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setInt32Slice(v []int32) { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + p.v.Elem().Set(reflect.ValueOf(v)) + return + } + // an enum + // Allocate a []enum, then assign []int32's values into it. + // Note: we can't convert []enum to []int32. + slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) + for i, x := range v { + slice.Index(i).SetInt(int64(x)) + } + p.v.Elem().Set(slice) } - -// A structPointerSlice represents the address of a slice of pointers to structs -// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. -type structPointerSlice struct { - v reflect.Value +func (p pointer) appendInt32Slice(v int32) { + grow(p.v.Elem()).SetInt(int64(v)) } -func (p structPointerSlice) Len() int { return p.v.Len() } -func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } -func (p structPointerSlice) Append(q structPointer) { - p.v.Set(reflect.Append(p.v, q.v)) +func (p pointer) toUint64() *uint64 { + return p.v.Interface().(*uint64) } - -var ( - int32Type = reflect.TypeOf(int32(0)) - uint32Type = reflect.TypeOf(uint32(0)) - float32Type = reflect.TypeOf(float32(0)) - int64Type = reflect.TypeOf(int64(0)) - uint64Type = reflect.TypeOf(uint64(0)) - float64Type = reflect.TypeOf(float64(0)) -) - -// A word32 represents a field of type *int32, *uint32, *float32, or *enum. -// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. -type word32 struct { - v reflect.Value +func (p pointer) toUint64Ptr() **uint64 { + return p.v.Interface().(**uint64) } - -// IsNil reports whether p is nil. -func word32_IsNil(p word32) bool { - return p.v.IsNil() +func (p pointer) toUint64Slice() *[]uint64 { + return p.v.Interface().(*[]uint64) } - -// Set sets p to point at a newly allocated word with bits set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - t := p.v.Type().Elem() - switch t { - case int32Type: - if len(o.int32s) == 0 { - o.int32s = make([]int32, uint32PoolSize) - } - o.int32s[0] = int32(x) - p.v.Set(reflect.ValueOf(&o.int32s[0])) - o.int32s = o.int32s[1:] - return - case uint32Type: - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - p.v.Set(reflect.ValueOf(&o.uint32s[0])) - o.uint32s = o.uint32s[1:] - return - case float32Type: - if len(o.float32s) == 0 { - o.float32s = make([]float32, uint32PoolSize) - } - o.float32s[0] = math.Float32frombits(x) - p.v.Set(reflect.ValueOf(&o.float32s[0])) - o.float32s = o.float32s[1:] - return - } - - // must be enum - p.v.Set(reflect.New(t)) - p.v.Elem().SetInt(int64(int32(x))) +func (p pointer) toUint32() *uint32 { + return p.v.Interface().(*uint32) } - -// Get gets the bits pointed at by p, as a uint32. -func word32_Get(p word32) uint32 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") +func (p pointer) toUint32Ptr() **uint32 { + return p.v.Interface().(**uint32) } - -// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32{structPointer_field(p, f)} +func (p pointer) toUint32Slice() *[]uint32 { + return p.v.Interface().(*[]uint32) } - -// A word32Val represents a field of type int32, uint32, float32, or enum. -// That is, v.Type() is int32, uint32, float32, or enum and v is assignable. -type word32Val struct { - v reflect.Value +func (p pointer) toBool() *bool { + return p.v.Interface().(*bool) } - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - switch p.v.Type() { - case int32Type: - p.v.SetInt(int64(x)) - return - case uint32Type: - p.v.SetUint(uint64(x)) - return - case float32Type: - p.v.SetFloat(float64(math.Float32frombits(x))) - return - } - - // must be enum - p.v.SetInt(int64(int32(x))) +func (p pointer) toBoolPtr() **bool { + return p.v.Interface().(**bool) } - -// Get gets the bits pointed at by p, as a uint32. -func word32Val_Get(p word32Val) uint32 { - elem := p.v - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") +func (p pointer) toBoolSlice() *[]bool { + return p.v.Interface().(*[]bool) } - -// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val{structPointer_field(p, f)} +func (p pointer) toFloat64() *float64 { + return p.v.Interface().(*float64) } - -// A word32Slice is a slice of 32-bit values. -// That is, v.Type() is []int32, []uint32, []float32, or []enum. -type word32Slice struct { - v reflect.Value +func (p pointer) toFloat64Ptr() **float64 { + return p.v.Interface().(**float64) } - -func (p word32Slice) Append(x uint32) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int32: - elem.SetInt(int64(int32(x))) - case reflect.Uint32: - elem.SetUint(uint64(x)) - case reflect.Float32: - elem.SetFloat(float64(math.Float32frombits(x))) - } +func (p pointer) toFloat64Slice() *[]float64 { + return p.v.Interface().(*[]float64) } - -func (p word32Slice) Len() int { - return p.v.Len() +func (p pointer) toFloat32() *float32 { + return p.v.Interface().(*float32) } - -func (p word32Slice) Index(i int) uint32 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") +func (p pointer) toFloat32Ptr() **float32 { + return p.v.Interface().(**float32) } - -// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) word32Slice { - return word32Slice{structPointer_field(p, f)} +func (p pointer) toFloat32Slice() *[]float32 { + return p.v.Interface().(*[]float32) } - -// word64 is like word32 but for 64-bit values. -type word64 struct { - v reflect.Value +func (p pointer) toString() *string { + return p.v.Interface().(*string) } - -func word64_Set(p word64, o *Buffer, x uint64) { - t := p.v.Type().Elem() - switch t { - case int64Type: - if len(o.int64s) == 0 { - o.int64s = make([]int64, uint64PoolSize) - } - o.int64s[0] = int64(x) - p.v.Set(reflect.ValueOf(&o.int64s[0])) - o.int64s = o.int64s[1:] - return - case uint64Type: - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - p.v.Set(reflect.ValueOf(&o.uint64s[0])) - o.uint64s = o.uint64s[1:] - return - case float64Type: - if len(o.float64s) == 0 { - o.float64s = make([]float64, uint64PoolSize) - } - o.float64s[0] = math.Float64frombits(x) - p.v.Set(reflect.ValueOf(&o.float64s[0])) - o.float64s = o.float64s[1:] - return - } - panic("unreachable") +func (p pointer) toStringPtr() **string { + return p.v.Interface().(**string) } - -func word64_IsNil(p word64) bool { - return p.v.IsNil() +func (p pointer) toStringSlice() *[]string { + return p.v.Interface().(*[]string) } - -func word64_Get(p word64) uint64 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) - } - panic("unreachable") +func (p pointer) toBytes() *[]byte { + return p.v.Interface().(*[]byte) } - -func structPointer_Word64(p structPointer, f field) word64 { - return word64{structPointer_field(p, f)} +func (p pointer) toBytesSlice() *[][]byte { + return p.v.Interface().(*[][]byte) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return p.v.Interface().(*XXX_InternalExtensions) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return p.v.Interface().(*map[int32]Extension) +} +func (p pointer) getPointer() pointer { + return pointer{v: p.v.Elem()} +} +func (p pointer) setPointer(q pointer) { + p.v.Elem().Set(q.v) +} +func (p pointer) appendPointer(q pointer) { + grow(p.v.Elem()).Set(q.v) } -// word64Val is like word32Val but for 64-bit values. -type word64Val struct { - v reflect.Value +// getPointerSlice copies []*T from p as a new []pointer. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getPointerSlice() []pointer { + if p.v.IsNil() { + return nil + } + n := p.v.Elem().Len() + s := make([]pointer, n) + for i := 0; i < n; i++ { + s[i] = pointer{v: p.v.Elem().Index(i)} + } + return s } -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - switch p.v.Type() { - case int64Type: - p.v.SetInt(int64(x)) - return - case uint64Type: - p.v.SetUint(x) - return - case float64Type: - p.v.SetFloat(math.Float64frombits(x)) +// setPointerSlice copies []pointer into p as a new []*T. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setPointerSlice(v []pointer) { + if v == nil { + p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) return } - panic("unreachable") + s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) + for _, p := range v { + s = reflect.Append(s, p.v) + } + p.v.Elem().Set(s) } -func word64Val_Get(p word64Val) uint64 { - elem := p.v - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + if p.v.Elem().IsNil() { + return pointer{v: p.v.Elem()} } - panic("unreachable") + return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct } -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val{structPointer_field(p, f)} +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + // TODO: check that p.v.Type().Elem() == t? + return p.v } -type word64Slice struct { - v reflect.Value +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p } - -func (p word64Slice) Append(x uint64) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int64: - elem.SetInt(int64(int64(x))) - case reflect.Uint64: - elem.SetUint(uint64(x)) - case reflect.Float64: - elem.SetFloat(float64(math.Float64frombits(x))) - } +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v } - -func (p word64Slice) Len() int { - return p.v.Len() +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p } - -func (p word64Slice) Index(i int) uint64 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return uint64(elem.Uint()) - case reflect.Float64: - return math.Float64bits(float64(elem.Float())) - } - panic("unreachable") +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v } - -func structPointer_Word64Slice(p structPointer, f field) word64Slice { - return word64Slice{structPointer_field(p, f)} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v } +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} + +var atomicLock sync.Mutex diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go index 6b5567d47cd3..dbfffe071b82 100644 --- a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go +++ b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -29,7 +29,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +build !appengine,!js +// +build !purego,!appengine,!js // This file contains the implementation of the proto field accesses using package unsafe. @@ -37,38 +37,13 @@ package proto import ( "reflect" + "sync/atomic" "unsafe" ) -// NOTE: These type_Foo functions would more idiomatically be methods, -// but Go does not allow methods on pointer types, and we must preserve -// some pointer type for the garbage collector. We use these -// funcs with clunky names as our poor approximation to methods. -// -// An alternative would be -// type structPointer struct { p unsafe.Pointer } -// but that does not registerize as well. - -// A structPointer is a pointer to a struct. -type structPointer unsafe.Pointer - -// toStructPointer returns a structPointer equivalent to the given reflect value. -func toStructPointer(v reflect.Value) structPointer { - return structPointer(unsafe.Pointer(v.Pointer())) -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p == nil -} - -// Interface returns the struct pointer, assumed to have element type t, -// as an interface value. -func structPointer_Interface(p structPointer, t reflect.Type) interface{} { - return reflect.NewAt(t, unsafe.Pointer(p)).Interface() -} +const unsafeAllowed = true -// A field identifies a field in a struct, accessible from a structPointer. +// A field identifies a field in a struct, accessible from a pointer. // In this implementation, a field is identified by its byte offset from the start of the struct. type field uintptr @@ -80,191 +55,259 @@ func toField(f *reflect.StructField) field { // invalidField is an invalid field identifier. const invalidField = ^field(0) +// zeroField is a noop when calling pointer.offset. +const zeroField = field(0) + // IsValid reports whether the field identifier is valid. func (f field) IsValid() bool { - return f != ^field(0) + return f != invalidField +} + +// The pointer type below is for the new table-driven encoder/decoder. +// The implementation here uses unsafe.Pointer to create a generic pointer. +// In pointer_reflect.go we use reflect instead of unsafe to implement +// the same (but slower) interface. +type pointer struct { + p unsafe.Pointer +} + +// size of pointer +var ptrSize = unsafe.Sizeof(uintptr(0)) + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + // Super-tricky - read pointer out of data word of interface value. + // Saves ~25ns over the equivalent: + // return valToPointer(reflect.ValueOf(*i)) + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr, deref bool) (p pointer) { + // Super-tricky - read or get the address of data word of interface value. + if isptr { + // The interface is of pointer type, thus it is a direct interface. + // The data word is the pointer data itself. We take its address. + p = pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} + } else { + // The interface is not of pointer type. The data word is the pointer + // to the data. + p = pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} + } + if deref { + p.p = *(*unsafe.Pointer)(p.p) + } + return p } -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{p: unsafe.Pointer(v.Pointer())} } -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + // For safety, we should panic if !f.IsValid, however calling panic causes + // this to no longer be inlineable, which is a serious performance cost. + /* + if !f.IsValid() { + panic("invalid field") + } + */ + return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} } -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) isNil() bool { + return p.p == nil } -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toInt64() *int64 { + return (*int64)(p.p) } - -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toInt64Ptr() **int64 { + return (**int64)(p.p) } - -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toInt64Slice() *[]int64 { + return (*[]int64)(p.p) } - -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toInt32() *int32 { + return (*int32)(p.p) } -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. +/* + func (p pointer) toInt32Ptr() **int32 { + return (**int32)(p.p) + } + func (p pointer) toInt32Slice() *[]int32 { + return (*[]int32)(p.p) + } +*/ +func (p pointer) getInt32Ptr() *int32 { + return *(**int32)(p.p) } - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { - return (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) setInt32Ptr(v int32) { + *(**int32)(p.p) = &v } -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// getInt32Slice loads a []int32 from p. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getInt32Slice() []int32 { + return *(*[]int32)(p.p) } -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) +// setInt32Slice stores a []int32 to p. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setInt32Slice(v []int32) { + *(*[]int32)(p.p) = v } -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q +// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? +func (p pointer) appendInt32Slice(v int32) { + s := (*[]int32)(p.p) + *s = append(*s, v) } -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toUint64() *uint64 { + return (*uint64)(p.p) } - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { - return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toUint64Ptr() **uint64 { + return (**uint64)(p.p) } - -// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). -type structPointerSlice []structPointer - -func (v *structPointerSlice) Len() int { return len(*v) } -func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } -func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } - -// A word32 is the address of a "pointer to 32-bit value" field. -type word32 **uint32 - -// IsNil reports whether *v is nil. -func word32_IsNil(p word32) bool { - return *p == nil +func (p pointer) toUint64Slice() *[]uint64 { + return (*[]uint64)(p.p) } - -// Set sets *v to point at a newly allocated word set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - *p = &o.uint32s[0] - o.uint32s = o.uint32s[1:] +func (p pointer) toUint32() *uint32 { + return (*uint32)(p.p) } - -// Get gets the value pointed at by *v. -func word32_Get(p word32) uint32 { - return **p +func (p pointer) toUint32Ptr() **uint32 { + return (**uint32)(p.p) } - -// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +func (p pointer) toUint32Slice() *[]uint32 { + return (*[]uint32)(p.p) } - -// A word32Val is the address of a 32-bit value field. -type word32Val *uint32 - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - *p = x +func (p pointer) toBool() *bool { + return (*bool)(p.p) } - -// Get gets the value pointed at by p. -func word32Val_Get(p word32Val) uint32 { - return *p +func (p pointer) toBoolPtr() **bool { + return (**bool)(p.p) } - -// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +func (p pointer) toBoolSlice() *[]bool { + return (*[]bool)(p.p) } - -// A word32Slice is a slice of 32-bit values. -type word32Slice []uint32 - -func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } -func (v *word32Slice) Len() int { return len(*v) } -func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } - -// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) *word32Slice { - return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toFloat64() *float64 { + return (*float64)(p.p) } - -// word64 is like word32 but for 64-bit values. -type word64 **uint64 - -func word64_Set(p word64, o *Buffer, x uint64) { - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - *p = &o.uint64s[0] - o.uint64s = o.uint64s[1:] +func (p pointer) toFloat64Ptr() **float64 { + return (**float64)(p.p) } - -func word64_IsNil(p word64) bool { - return *p == nil +func (p pointer) toFloat64Slice() *[]float64 { + return (*[]float64)(p.p) } - -func word64_Get(p word64) uint64 { - return **p +func (p pointer) toFloat32() *float32 { + return (*float32)(p.p) +} +func (p pointer) toFloat32Ptr() **float32 { + return (**float32)(p.p) +} +func (p pointer) toFloat32Slice() *[]float32 { + return (*[]float32)(p.p) +} +func (p pointer) toString() *string { + return (*string)(p.p) +} +func (p pointer) toStringPtr() **string { + return (**string)(p.p) +} +func (p pointer) toStringSlice() *[]string { + return (*[]string)(p.p) +} +func (p pointer) toBytes() *[]byte { + return (*[]byte)(p.p) +} +func (p pointer) toBytesSlice() *[][]byte { + return (*[][]byte)(p.p) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(p.p) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return (*map[int32]Extension)(p.p) } -func structPointer_Word64(p structPointer, f field) word64 { - return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +// getPointerSlice loads []*T from p as a []pointer. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getPointerSlice() []pointer { + // Super-tricky - p should point to a []*T where T is a + // message type. We load it as []pointer. + return *(*[]pointer)(p.p) } -// word64Val is like word32Val but for 64-bit values. -type word64Val *uint64 +// setPointerSlice stores []pointer into p as a []*T. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setPointerSlice(v []pointer) { + // Super-tricky - p should point to a []*T where T is a + // message type. We store it as []pointer. + *(*[]pointer)(p.p) = v +} -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - *p = x +// getPointer loads the pointer at p and returns it. +func (p pointer) getPointer() pointer { + return pointer{p: *(*unsafe.Pointer)(p.p)} } -func word64Val_Get(p word64Val) uint64 { - return *p +// setPointer stores the pointer q at p. +func (p pointer) setPointer(q pointer) { + *(*unsafe.Pointer)(p.p) = q.p } -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +// append q to the slice pointed to by p. +func (p pointer) appendPointer(q pointer) { + s := (*[]unsafe.Pointer)(p.p) + *s = append(*s, q.p) } -// word64Slice is like word32Slice but for 64-bit values. -type word64Slice []uint64 +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + // Super-tricky - read pointer out of data word of interface value. + return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +} -func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } -func (v *word64Slice) Len() int { return len(*v) } -func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } +// asPointerTo returns a reflect.Value that is a pointer to an +// object of type t stored at p. +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + return reflect.NewAt(t, p.p) +} -func structPointer_Word64Slice(p structPointer, f field) *word64Slice { - return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) } diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go index ec2289c0058e..a4b8c0cd3a86 100644 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ b/vendor/github.com/golang/protobuf/proto/properties.go @@ -38,7 +38,6 @@ package proto import ( "fmt" "log" - "os" "reflect" "sort" "strconv" @@ -58,42 +57,6 @@ const ( WireFixed32 = 5 ) -const startSize = 10 // initial slice/string sizes - -// Encoders are defined in encode.go -// An encoder outputs the full representation of a field, including its -// tag and encoder type. -type encoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueEncoder encodes a single integer in a particular encoding. -type valueEncoder func(o *Buffer, x uint64) error - -// Sizers are defined in encode.go -// A sizer returns the encoded size of a field, including its tag and encoder -// type. -type sizer func(prop *Properties, base structPointer) int - -// A valueSizer returns the encoded size of a single integer in a particular -// encoding. -type valueSizer func(x uint64) int - -// Decoders are defined in decode.go -// A decoder creates a value from its wire representation. -// Unrecognized subelements are saved in unrec. -type decoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueDecoder decodes a single integer in a particular encoding. -type valueDecoder func(o *Buffer) (x uint64, err error) - -// A oneofMarshaler does the marshaling for all oneof fields in a message. -type oneofMarshaler func(Message, *Buffer) error - -// A oneofUnmarshaler does the unmarshaling for a oneof field in a message. -type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) - -// A oneofSizer does the sizing for all oneof fields in a message. -type oneofSizer func(Message) int - // tagMap is an optimization over map[int]int for typical protocol buffer // use-cases. Encoded protocol buffers are often in tag order with small tag // numbers. @@ -140,13 +103,6 @@ type StructProperties struct { decoderTags tagMap // map from proto tag to struct field number decoderOrigNames map[string]int // map from original name to struct field number order []int // list of struct field numbers in tag order - unrecField field // field id of the XXX_unrecognized []byte field - extendable bool // is this an extendable proto - - oneofMarshaler oneofMarshaler - oneofUnmarshaler oneofUnmarshaler - oneofSizer oneofSizer - stype reflect.Type // OneofTypes contains information about the oneof fields in this message. // It is keyed by the original name of a field. @@ -182,41 +138,24 @@ type Properties struct { Repeated bool Packed bool // relevant for repeated primitives only Enum string // set for enum types only - proto3 bool // whether this is known to be a proto3 field; set for []byte only + proto3 bool // whether this is known to be a proto3 field oneof bool // whether this is a oneof field Default string // default value HasDefault bool // whether an explicit default was provided - def_uint64 uint64 - - enc encoder - valEnc valueEncoder // set for bool and numeric types only - field field - tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) - tagbuf [8]byte - stype reflect.Type // set for struct types only - sprop *StructProperties // set for struct types only - isMarshaler bool - isUnmarshaler bool - - mtype reflect.Type // set for map types only - mkeyprop *Properties // set for map types only - mvalprop *Properties // set for map types only - - size sizer - valSize valueSizer // set for bool and numeric types only - - dec decoder - valDec valueDecoder // set for bool and numeric types only - - // If this is a packable field, this will be the decoder for the packed version of the field. - packedDec decoder + + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + + mtype reflect.Type // set for map types only + MapKeyProp *Properties // set for map types only + MapValProp *Properties // set for map types only } // String formats the properties in the protobuf struct field tag style. func (p *Properties) String() string { s := p.Wire - s = "," + s += "," s += strconv.Itoa(p.Tag) if p.Required { s += ",req" @@ -254,7 +193,7 @@ func (p *Properties) Parse(s string) { // "bytes,49,opt,name=foo,def=hello!" fields := strings.Split(s, ",") // breaks def=, but handled below. if len(fields) < 2 { - fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) + log.Printf("proto: tag has too few fields: %q", s) return } @@ -262,34 +201,19 @@ func (p *Properties) Parse(s string) { switch p.Wire { case "varint": p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeVarint - p.valDec = (*Buffer).DecodeVarint - p.valSize = sizeVarint case "fixed32": p.WireType = WireFixed32 - p.valEnc = (*Buffer).EncodeFixed32 - p.valDec = (*Buffer).DecodeFixed32 - p.valSize = sizeFixed32 case "fixed64": p.WireType = WireFixed64 - p.valEnc = (*Buffer).EncodeFixed64 - p.valDec = (*Buffer).DecodeFixed64 - p.valSize = sizeFixed64 case "zigzag32": p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag32 - p.valDec = (*Buffer).DecodeZigzag32 - p.valSize = sizeZigzag32 case "zigzag64": p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag64 - p.valDec = (*Buffer).DecodeZigzag64 - p.valSize = sizeZigzag64 case "bytes", "group": p.WireType = WireBytes // no numeric converter for non-numeric types default: - fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) + log.Printf("proto: tag has unknown wire type: %q", s) return } @@ -299,6 +223,7 @@ func (p *Properties) Parse(s string) { return } +outer: for i := 2; i < len(fields); i++ { f := fields[i] switch { @@ -326,255 +251,40 @@ func (p *Properties) Parse(s string) { if i+1 < len(fields) { // Commas aren't escaped, and def is always last. p.Default += "," + strings.Join(fields[i+1:], ",") - break + break outer } } } } -func logNoSliceEnc(t1, t2 reflect.Type) { - fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) -} - var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() -// Initialize the fields for encoding and decoding. -func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { - p.enc = nil - p.dec = nil - p.size = nil - +// setFieldProps initializes the field properties for submessages and maps. +func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { switch t1 := typ; t1.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) - - // proto3 scalar types - - case reflect.Bool: - p.enc = (*Buffer).enc_proto3_bool - p.dec = (*Buffer).dec_proto3_bool - p.size = size_proto3_bool - case reflect.Int32: - p.enc = (*Buffer).enc_proto3_int32 - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_proto3_uint32 - p.dec = (*Buffer).dec_proto3_int32 // can reuse - p.size = size_proto3_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_proto3_int64 - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - case reflect.String: - p.enc = (*Buffer).enc_proto3_string - p.dec = (*Buffer).dec_proto3_string - p.size = size_proto3_string - case reflect.Ptr: - switch t2 := t1.Elem(); t2.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) - break - case reflect.Bool: - p.enc = (*Buffer).enc_bool - p.dec = (*Buffer).dec_bool - p.size = size_bool - case reflect.Int32: - p.enc = (*Buffer).enc_int32 - p.dec = (*Buffer).dec_int32 - p.size = size_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_uint32 - p.dec = (*Buffer).dec_int32 // can reuse - p.size = size_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_int64 - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_int32 - p.size = size_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_int64 // can just treat them as bits - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.String: - p.enc = (*Buffer).enc_string - p.dec = (*Buffer).dec_string - p.size = size_string - case reflect.Struct: + if t1.Elem().Kind() == reflect.Struct { p.stype = t1.Elem() - p.isMarshaler = isMarshaler(t1) - p.isUnmarshaler = isUnmarshaler(t1) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_struct_message - p.dec = (*Buffer).dec_struct_message - p.size = size_struct_message - } else { - p.enc = (*Buffer).enc_struct_group - p.dec = (*Buffer).dec_struct_group - p.size = size_struct_group - } } case reflect.Slice: - switch t2 := t1.Elem(); t2.Kind() { - default: - logNoSliceEnc(t1, t2) - break - case reflect.Bool: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_bool - p.size = size_slice_packed_bool - } else { - p.enc = (*Buffer).enc_slice_bool - p.size = size_slice_bool - } - p.dec = (*Buffer).dec_slice_bool - p.packedDec = (*Buffer).dec_slice_packed_bool - case reflect.Int32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int32 - p.size = size_slice_packed_int32 - } else { - p.enc = (*Buffer).enc_slice_int32 - p.size = size_slice_int32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Uint32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Int64, reflect.Uint64: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - case reflect.Uint8: - p.dec = (*Buffer).dec_slice_byte - if p.proto3 { - p.enc = (*Buffer).enc_proto3_slice_byte - p.size = size_proto3_slice_byte - } else { - p.enc = (*Buffer).enc_slice_byte - p.size = size_slice_byte - } - case reflect.Float32, reflect.Float64: - switch t2.Bits() { - case 32: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case 64: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - default: - logNoSliceEnc(t1, t2) - break - } - case reflect.String: - p.enc = (*Buffer).enc_slice_string - p.dec = (*Buffer).dec_slice_string - p.size = size_slice_string - case reflect.Ptr: - switch t3 := t2.Elem(); t3.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) - break - case reflect.Struct: - p.stype = t2.Elem() - p.isMarshaler = isMarshaler(t2) - p.isUnmarshaler = isUnmarshaler(t2) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_slice_struct_message - p.dec = (*Buffer).dec_slice_struct_message - p.size = size_slice_struct_message - } else { - p.enc = (*Buffer).enc_slice_struct_group - p.dec = (*Buffer).dec_slice_struct_group - p.size = size_slice_struct_group - } - } - case reflect.Slice: - switch t2.Elem().Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) - break - case reflect.Uint8: - p.enc = (*Buffer).enc_slice_slice_byte - p.dec = (*Buffer).dec_slice_slice_byte - p.size = size_slice_slice_byte - } + if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct { + p.stype = t2.Elem() } case reflect.Map: - p.enc = (*Buffer).enc_new_map - p.dec = (*Buffer).dec_new_map - p.size = size_new_map - p.mtype = t1 - p.mkeyprop = &Properties{} - p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) - p.mvalprop = &Properties{} + p.MapKeyProp = &Properties{} + p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.MapValProp = &Properties{} vtype := p.mtype.Elem() if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { // The value type is not a message (*T) or bytes ([]byte), // so we need encoders for the pointer to this type. vtype = reflect.PtrTo(vtype) } - p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) - } - - // precalculate tag code - wire := p.WireType - if p.Packed { - wire = WireBytes + p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) } - x := uint32(p.Tag)<<3 | uint32(wire) - i := 0 - for i = 0; x > 127; i++ { - p.tagbuf[i] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - p.tagbuf[i] = uint8(x) - p.tagcode = p.tagbuf[0 : i+1] if p.stype != nil { if lockGetProp { @@ -586,32 +296,9 @@ func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lock } var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() - unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() ) -// isMarshaler reports whether type t implements Marshaler. -func isMarshaler(t reflect.Type) bool { - // We're checking for (likely) pointer-receiver methods - // so if t is not a pointer, something is very wrong. - // The calls above only invoke isMarshaler on pointer types. - if t.Kind() != reflect.Ptr { - panic("proto: misuse of isMarshaler") - } - return t.Implements(marshalerType) -} - -// isUnmarshaler reports whether type t implements Unmarshaler. -func isUnmarshaler(t reflect.Type) bool { - // We're checking for (likely) pointer-receiver methods - // so if t is not a pointer, something is very wrong. - // The calls above only invoke isUnmarshaler on pointer types. - if t.Kind() != reflect.Ptr { - panic("proto: misuse of isUnmarshaler") - } - return t.Implements(unmarshalerType) -} - // Init populates the properties from a protocol buffer struct tag. func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { p.init(typ, name, tag, f, true) @@ -621,14 +308,11 @@ func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructF // "bytes,49,opt,def=hello!" p.Name = name p.OrigName = name - if f != nil { - p.field = toField(f) - } if tag == "" { return } p.Parse(tag) - p.setEncAndDec(typ, f, lockGetProp) + p.setFieldProps(typ, f, lockGetProp) } var ( @@ -649,9 +333,6 @@ func GetProperties(t reflect.Type) *StructProperties { sprop, ok := propertiesMap[t] propertiesMu.RUnlock() if ok { - if collectStats { - stats.Chit++ - } return sprop } @@ -661,26 +342,26 @@ func GetProperties(t reflect.Type) *StructProperties { return sprop } +type ( + oneofFuncsIface interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + oneofWrappersIface interface { + XXX_OneofWrappers() []interface{} + } +) + // getPropertiesLocked requires that propertiesMu is held. func getPropertiesLocked(t reflect.Type) *StructProperties { if prop, ok := propertiesMap[t]; ok { - if collectStats { - stats.Chit++ - } return prop } - if collectStats { - stats.Cmiss++ - } prop := new(StructProperties) // in case of recursive protos, fill this in now. propertiesMap[t] = prop // build properties - prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) || - reflect.PtrTo(t).Implements(extendableProtoV1Type) - prop.unrecField = invalidField prop.Prop = make([]*Properties, t.NumField()) prop.order = make([]int, t.NumField()) @@ -690,17 +371,6 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { name := f.Name p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) - if f.Name == "XXX_InternalExtensions" { // special case - p.enc = (*Buffer).enc_exts - p.dec = nil // not needed - p.size = size_exts - } else if f.Name == "XXX_extensions" { // special case - p.enc = (*Buffer).enc_map - p.dec = nil // not needed - p.size = size_map - } else if f.Name == "XXX_unrecognized" { // special case - prop.unrecField = toField(&f) - } oneof := f.Tag.Get("protobuf_oneof") // special case if oneof != "" { // Oneof fields don't use the traditional protobuf tag. @@ -715,22 +385,19 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { } print("\n") } - if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { - fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") - } } // Re-order prop.order. sort.Sort(prop) - type oneofMessage interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + var oots []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oots = m.XXX_OneofFuncs() + case oneofWrappersIface: + oots = m.XXX_OneofWrappers() } - if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { - var oots []interface{} - prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() - prop.stype = t - + if len(oots) > 0 { // Interpret oneof metadata. prop.OneofTypes = make(map[string]*OneofProperties) for _, oot := range oots { @@ -779,30 +446,6 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { return prop } -// Return the Properties object for the x[0]'th field of the structure. -func propByIndex(t reflect.Type, x []int) *Properties { - if len(x) != 1 { - fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) - return nil - } - prop := GetProperties(t) - return prop.Prop[x[0]] -} - -// Get the address and type of a pointer to a struct from an interface. -func getbase(pb Message) (t reflect.Type, b structPointer, err error) { - if pb == nil { - err = ErrNil - return - } - // get the reflect type of the pointer to the struct. - t = reflect.TypeOf(pb) - // get the address of the struct. - value := reflect.ValueOf(pb) - b = toStructPointer(value) - return -} - // A global registry of enum types. // The generated code will register the generated maps by calling RegisterEnum. @@ -826,20 +469,42 @@ func EnumValueMap(enumType string) map[string]int32 { // A registry of all linked message types. // The string is a fully-qualified proto name ("pkg.Message"). var ( - protoTypes = make(map[string]reflect.Type) - revProtoTypes = make(map[reflect.Type]string) + protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers + protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types + revProtoTypes = make(map[reflect.Type]string) ) // RegisterType is called from generated code and maps from the fully qualified // proto name to the type (pointer to struct) of the protocol buffer. func RegisterType(x Message, name string) { - if _, ok := protoTypes[name]; ok { + if _, ok := protoTypedNils[name]; ok { // TODO: Some day, make this a panic. log.Printf("proto: duplicate proto type registered: %s", name) return } t := reflect.TypeOf(x) - protoTypes[name] = t + if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { + // Generated code always calls RegisterType with nil x. + // This check is just for extra safety. + protoTypedNils[name] = x + } else { + protoTypedNils[name] = reflect.Zero(t).Interface().(Message) + } + revProtoTypes[t] = name +} + +// RegisterMapType is called from generated code and maps from the fully qualified +// proto name to the native map type of the proto map definition. +func RegisterMapType(x interface{}, name string) { + if reflect.TypeOf(x).Kind() != reflect.Map { + panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) + } + if _, ok := protoMapTypes[name]; ok { + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoMapTypes[name] = t revProtoTypes[t] = name } @@ -855,7 +520,14 @@ func MessageName(x Message) string { } // MessageType returns the message type (pointer to struct) for a named message. -func MessageType(name string) reflect.Type { return protoTypes[name] } +// The type is not guaranteed to implement proto.Message if the name refers to a +// map entry. +func MessageType(name string) reflect.Type { + if t, ok := protoTypedNils[name]; ok { + return reflect.TypeOf(t) + } + return protoMapTypes[name] +} // A registry of all linked proto files. var ( diff --git a/vendor/github.com/golang/protobuf/proto/table_marshal.go b/vendor/github.com/golang/protobuf/proto/table_marshal.go new file mode 100644 index 000000000000..5cb11fa955e4 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_marshal.go @@ -0,0 +1,2776 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// a sizer takes a pointer to a field and the size of its tag, computes the size of +// the encoded data. +type sizer func(pointer, int) int + +// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), +// marshals the field to the end of the slice, returns the slice and error (if any). +type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) + +// marshalInfo is the information used for marshaling a message. +type marshalInfo struct { + typ reflect.Type + fields []*marshalFieldInfo + unrecognized field // offset of XXX_unrecognized + extensions field // offset of XXX_InternalExtensions + v1extensions field // offset of XXX_extensions + sizecache field // offset of XXX_sizecache + initialized int32 // 0 -- only typ is set, 1 -- fully initialized + messageset bool // uses message set wire format + hasmarshaler bool // has custom marshaler + sync.RWMutex // protect extElems map, also for initialization + extElems map[int32]*marshalElemInfo // info of extension elements +} + +// marshalFieldInfo is the information used for marshaling a field of a message. +type marshalFieldInfo struct { + field field + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isPointer bool + required bool // field is required + name string // name of the field, for error reporting + oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements +} + +// marshalElemInfo is the information used for marshaling an extension or oneof element. +type marshalElemInfo struct { + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) + deref bool // dereference the pointer before operating on it; implies isptr +} + +var ( + marshalInfoMap = map[reflect.Type]*marshalInfo{} + marshalInfoLock sync.Mutex +) + +// getMarshalInfo returns the information to marshal a given type of message. +// The info it returns may not necessarily initialized. +// t is the type of the message (NOT the pointer to it). +func getMarshalInfo(t reflect.Type) *marshalInfo { + marshalInfoLock.Lock() + u, ok := marshalInfoMap[t] + if !ok { + u = &marshalInfo{typ: t} + marshalInfoMap[t] = u + } + marshalInfoLock.Unlock() + return u +} + +// Size is the entry point from generated code, +// and should be ONLY called by generated code. +// It computes the size of encoded data of msg. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Size(msg Message) int { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return 0 + } + return u.size(ptr) +} + +// Marshal is the entry point from generated code, +// and should be ONLY called by generated code. +// It marshals msg to the end of b. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return b, ErrNil + } + return u.marshal(b, ptr, deterministic) +} + +func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { + // u := a.marshal, but atomically. + // We use an atomic here to ensure memory consistency. + u := atomicLoadMarshalInfo(&a.marshal) + if u == nil { + // Get marshal information from type of message. + t := reflect.ValueOf(msg).Type() + if t.Kind() != reflect.Ptr { + panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) + } + u = getMarshalInfo(t.Elem()) + // Store it in the cache for later users. + // a.marshal = u, but atomically. + atomicStoreMarshalInfo(&a.marshal, u) + } + return u +} + +// size is the main function to compute the size of the encoded data of a message. +// ptr is the pointer to the message. +func (u *marshalInfo) size(ptr pointer) int { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b, _ := m.Marshal() + return len(b) + } + + n := 0 + for _, f := range u.fields { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + n += f.sizer(ptr.offset(f.field), f.tagsize) + } + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + n += u.sizeMessageSet(e) + } else { + n += u.sizeExtensions(e) + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + n += u.sizeV1Extensions(m) + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + n += len(s) + } + // cache the result for use in marshal + if u.sizecache.IsValid() { + atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) + } + return n +} + +// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), +// fall back to compute the size. +func (u *marshalInfo) cachedsize(ptr pointer) int { + if u.sizecache.IsValid() { + return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) + } + return u.size(ptr) +} + +// marshal is the main function to marshal a message. It takes a byte slice and appends +// the encoded data to the end of the slice, returns the slice and error (if any). +// ptr is the pointer to the message. +// If deterministic is true, map is marshaled in deterministic order. +func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b1, err := m.Marshal() + b = append(b, b1...) + return b, err + } + + var err, errLater error + // The old marshaler encodes extensions at beginning. + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + b, err = u.appendMessageSet(b, e, deterministic) + } else { + b, err = u.appendExtensions(b, e, deterministic) + } + if err != nil { + return b, err + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + b, err = u.appendV1Extensions(b, m, deterministic) + if err != nil { + return b, err + } + } + for _, f := range u.fields { + if f.required { + if ptr.offset(f.field).getPointer().isNil() { + // Required field is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name} + } + continue + } + } + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) + if err != nil { + if err1, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name + "." + err1.field} + } + continue + } + if err == errRepeatedHasNil { + err = errors.New("proto: repeated field " + f.name + " has nil element") + } + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return b, err + } + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + b = append(b, s...) + } + return b, errLater +} + +// computeMarshalInfo initializes the marshal info. +func (u *marshalInfo) computeMarshalInfo() { + u.Lock() + defer u.Unlock() + if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock + return + } + + t := u.typ + u.unrecognized = invalidField + u.extensions = invalidField + u.v1extensions = invalidField + u.sizecache = invalidField + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if reflect.PtrTo(t).Implements(marshalerType) { + u.hasmarshaler = true + atomic.StoreInt32(&u.initialized, 1) + return + } + + // get oneof implementers + var oneofImplementers []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + + n := t.NumField() + + // deal with XXX fields first + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if !strings.HasPrefix(f.Name, "XXX_") { + continue + } + switch f.Name { + case "XXX_sizecache": + u.sizecache = toField(&f) + case "XXX_unrecognized": + u.unrecognized = toField(&f) + case "XXX_InternalExtensions": + u.extensions = toField(&f) + u.messageset = f.Tag.Get("protobuf_messageset") == "1" + case "XXX_extensions": + u.v1extensions = toField(&f) + case "XXX_NoUnkeyedLiteral": + // nothing to do + default: + panic("unknown XXX field: " + f.Name) + } + n-- + } + + // normal fields + fields := make([]marshalFieldInfo, n) // batch allocation + u.fields = make([]*marshalFieldInfo, 0, n) + for i, j := 0, 0; i < t.NumField(); i++ { + f := t.Field(i) + + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + field := &fields[j] + j++ + field.name = f.Name + u.fields = append(u.fields, field) + if f.Tag.Get("protobuf_oneof") != "" { + field.computeOneofFieldInfo(&f, oneofImplementers) + continue + } + if f.Tag.Get("protobuf") == "" { + // field has no tag (not in generated message), ignore it + u.fields = u.fields[:len(u.fields)-1] + j-- + continue + } + field.computeMarshalFieldInfo(&f) + } + + // fields are marshaled in tag order on the wire. + sort.Sort(byTag(u.fields)) + + atomic.StoreInt32(&u.initialized, 1) +} + +// helper for sorting fields by tag +type byTag []*marshalFieldInfo + +func (a byTag) Len() int { return len(a) } +func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } + +// getExtElemInfo returns the information to marshal an extension element. +// The info it returns is initialized. +func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { + // get from cache first + u.RLock() + e, ok := u.extElems[desc.Field] + u.RUnlock() + if ok { + return e + } + + t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct + tags := strings.Split(desc.Tag, ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct { + t = t.Elem() + } + sizer, marshaler := typeMarshaler(t, tags, false, false) + var deref bool + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + t = reflect.PtrTo(t) + deref = true + } + e = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + isptr: t.Kind() == reflect.Ptr, + deref: deref, + } + + // update cache + u.Lock() + if u.extElems == nil { + u.extElems = make(map[int32]*marshalElemInfo) + } + u.extElems[desc.Field] = e + u.Unlock() + return e +} + +// computeMarshalFieldInfo fills up the information to marshal a field. +func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { + // parse protobuf tag of the field. + // tag has format of "bytes,49,opt,name=foo,def=hello!" + tags := strings.Split(f.Tag.Get("protobuf"), ",") + if tags[0] == "" { + return + } + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if tags[2] == "req" { + fi.required = true + } + fi.setTag(f, tag, wt) + fi.setMarshaler(f, tags) +} + +func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { + fi.field = toField(f) + fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. + fi.isPointer = true + fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) + fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) + + ityp := f.Type // interface type + for _, o := range oneofImplementers { + t := reflect.TypeOf(o) + if !t.Implements(ityp) { + continue + } + sf := t.Elem().Field(0) // oneof implementer is a struct with a single field + tags := strings.Split(sf.Tag.Get("protobuf"), ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizer, marshaler := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value + fi.oneofElems[t.Elem()] = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + } + } +} + +// wiretype returns the wire encoding of the type. +func wiretype(encoding string) uint64 { + switch encoding { + case "fixed32": + return WireFixed32 + case "fixed64": + return WireFixed64 + case "varint", "zigzag32", "zigzag64": + return WireVarint + case "bytes": + return WireBytes + case "group": + return WireStartGroup + } + panic("unknown wire type " + encoding) +} + +// setTag fills up the tag (in wire format) and its size in the info of a field. +func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { + fi.field = toField(f) + fi.wiretag = uint64(tag)<<3 | wt + fi.tagsize = SizeVarint(uint64(tag) << 3) +} + +// setMarshaler fills up the sizer and marshaler in the info of a field. +func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { + switch f.Type.Kind() { + case reflect.Map: + // map field + fi.isPointer = true + fi.sizer, fi.marshaler = makeMapMarshaler(f) + return + case reflect.Ptr, reflect.Slice: + fi.isPointer = true + } + fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) +} + +// typeMarshaler returns the sizer and marshaler of a given field. +// t is the type of the field. +// tags is the generated "protobuf" tag of the field. +// If nozero is true, zero value is not marshaled to the wire. +// If oneof is true, it is a oneof field. +func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { + encoding := tags[0] + + pointer := false + slice := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + packed := false + proto3 := false + validateUTF8 := true + for i := 2; i < len(tags); i++ { + if tags[i] == "packed" { + packed = true + } + if tags[i] == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + switch t.Kind() { + case reflect.Bool: + if pointer { + return sizeBoolPtr, appendBoolPtr + } + if slice { + if packed { + return sizeBoolPackedSlice, appendBoolPackedSlice + } + return sizeBoolSlice, appendBoolSlice + } + if nozero { + return sizeBoolValueNoZero, appendBoolValueNoZero + } + return sizeBoolValue, appendBoolValue + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixed32Ptr, appendFixed32Ptr + } + if slice { + if packed { + return sizeFixed32PackedSlice, appendFixed32PackedSlice + } + return sizeFixed32Slice, appendFixed32Slice + } + if nozero { + return sizeFixed32ValueNoZero, appendFixed32ValueNoZero + } + return sizeFixed32Value, appendFixed32Value + case "varint": + if pointer { + return sizeVarint32Ptr, appendVarint32Ptr + } + if slice { + if packed { + return sizeVarint32PackedSlice, appendVarint32PackedSlice + } + return sizeVarint32Slice, appendVarint32Slice + } + if nozero { + return sizeVarint32ValueNoZero, appendVarint32ValueNoZero + } + return sizeVarint32Value, appendVarint32Value + } + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixedS32Ptr, appendFixedS32Ptr + } + if slice { + if packed { + return sizeFixedS32PackedSlice, appendFixedS32PackedSlice + } + return sizeFixedS32Slice, appendFixedS32Slice + } + if nozero { + return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero + } + return sizeFixedS32Value, appendFixedS32Value + case "varint": + if pointer { + return sizeVarintS32Ptr, appendVarintS32Ptr + } + if slice { + if packed { + return sizeVarintS32PackedSlice, appendVarintS32PackedSlice + } + return sizeVarintS32Slice, appendVarintS32Slice + } + if nozero { + return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero + } + return sizeVarintS32Value, appendVarintS32Value + case "zigzag32": + if pointer { + return sizeZigzag32Ptr, appendZigzag32Ptr + } + if slice { + if packed { + return sizeZigzag32PackedSlice, appendZigzag32PackedSlice + } + return sizeZigzag32Slice, appendZigzag32Slice + } + if nozero { + return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero + } + return sizeZigzag32Value, appendZigzag32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixed64Ptr, appendFixed64Ptr + } + if slice { + if packed { + return sizeFixed64PackedSlice, appendFixed64PackedSlice + } + return sizeFixed64Slice, appendFixed64Slice + } + if nozero { + return sizeFixed64ValueNoZero, appendFixed64ValueNoZero + } + return sizeFixed64Value, appendFixed64Value + case "varint": + if pointer { + return sizeVarint64Ptr, appendVarint64Ptr + } + if slice { + if packed { + return sizeVarint64PackedSlice, appendVarint64PackedSlice + } + return sizeVarint64Slice, appendVarint64Slice + } + if nozero { + return sizeVarint64ValueNoZero, appendVarint64ValueNoZero + } + return sizeVarint64Value, appendVarint64Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixedS64Ptr, appendFixedS64Ptr + } + if slice { + if packed { + return sizeFixedS64PackedSlice, appendFixedS64PackedSlice + } + return sizeFixedS64Slice, appendFixedS64Slice + } + if nozero { + return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero + } + return sizeFixedS64Value, appendFixedS64Value + case "varint": + if pointer { + return sizeVarintS64Ptr, appendVarintS64Ptr + } + if slice { + if packed { + return sizeVarintS64PackedSlice, appendVarintS64PackedSlice + } + return sizeVarintS64Slice, appendVarintS64Slice + } + if nozero { + return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero + } + return sizeVarintS64Value, appendVarintS64Value + case "zigzag64": + if pointer { + return sizeZigzag64Ptr, appendZigzag64Ptr + } + if slice { + if packed { + return sizeZigzag64PackedSlice, appendZigzag64PackedSlice + } + return sizeZigzag64Slice, appendZigzag64Slice + } + if nozero { + return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero + } + return sizeZigzag64Value, appendZigzag64Value + } + case reflect.Float32: + if pointer { + return sizeFloat32Ptr, appendFloat32Ptr + } + if slice { + if packed { + return sizeFloat32PackedSlice, appendFloat32PackedSlice + } + return sizeFloat32Slice, appendFloat32Slice + } + if nozero { + return sizeFloat32ValueNoZero, appendFloat32ValueNoZero + } + return sizeFloat32Value, appendFloat32Value + case reflect.Float64: + if pointer { + return sizeFloat64Ptr, appendFloat64Ptr + } + if slice { + if packed { + return sizeFloat64PackedSlice, appendFloat64PackedSlice + } + return sizeFloat64Slice, appendFloat64Slice + } + if nozero { + return sizeFloat64ValueNoZero, appendFloat64ValueNoZero + } + return sizeFloat64Value, appendFloat64Value + case reflect.String: + if validateUTF8 { + if pointer { + return sizeStringPtr, appendUTF8StringPtr + } + if slice { + return sizeStringSlice, appendUTF8StringSlice + } + if nozero { + return sizeStringValueNoZero, appendUTF8StringValueNoZero + } + return sizeStringValue, appendUTF8StringValue + } + if pointer { + return sizeStringPtr, appendStringPtr + } + if slice { + return sizeStringSlice, appendStringSlice + } + if nozero { + return sizeStringValueNoZero, appendStringValueNoZero + } + return sizeStringValue, appendStringValue + case reflect.Slice: + if slice { + return sizeBytesSlice, appendBytesSlice + } + if oneof { + // Oneof bytes field may also have "proto3" tag. + // We want to marshal it as a oneof field. Do this + // check before the proto3 check. + return sizeBytesOneof, appendBytesOneof + } + if proto3 { + return sizeBytes3, appendBytes3 + } + return sizeBytes, appendBytes + case reflect.Struct: + switch encoding { + case "group": + if slice { + return makeGroupSliceMarshaler(getMarshalInfo(t)) + } + return makeGroupMarshaler(getMarshalInfo(t)) + case "bytes": + if slice { + return makeMessageSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageMarshaler(getMarshalInfo(t)) + } + } + panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) +} + +// Below are functions to size/marshal a specific type of a field. +// They are stored in the field's info, and called by function pointers. +// They have type sizer or marshaler. + +func sizeFixed32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixedS32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFloat32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + return (4 + tagsize) * len(s) +} +func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixed64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFixedS64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFloat64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + return (8 + tagsize) * len(s) +} +func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeVarint32Value(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarint32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarint64Value(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + return SizeVarint(v) + tagsize +} +func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return SizeVarint(v) + tagsize +} +func sizeVarint64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return SizeVarint(*p) + tagsize +} +func sizeVarint64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(v) + tagsize + } + return n +} +func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize + } + return n +} +func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize + } + return n +} +func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeBoolValue(_ pointer, tagsize int) int { + return 1 + tagsize +} +func sizeBoolValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toBool() + if !v { + return 0 + } + return 1 + tagsize +} +func sizeBoolPtr(ptr pointer, tagsize int) int { + p := *ptr.toBoolPtr() + if p == nil { + return 0 + } + return 1 + tagsize +} +func sizeBoolSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + return (1 + tagsize) * len(s) +} +func sizeBoolPackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return 0 + } + return len(s) + SizeVarint(uint64(len(s))) + tagsize +} +func sizeStringValue(ptr pointer, tagsize int) int { + v := *ptr.toString() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toString() + if v == "" { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringPtr(ptr pointer, tagsize int) int { + p := *ptr.toStringPtr() + if p == nil { + return 0 + } + v := *p + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringSlice(ptr pointer, tagsize int) int { + s := *ptr.toStringSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} +func sizeBytes(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if v == nil { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytes3(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if len(v) == 0 { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesOneof(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesSlice(ptr pointer, tagsize int) int { + s := *ptr.toBytesSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} + +// appendFixed32 appends an encoded fixed32 to b. +func appendFixed32(b []byte, v uint32) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24)) + return b +} + +// appendFixed64 appends an encoded fixed64 to b. +func appendFixed64(b []byte, v uint64) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24), + byte(v>>32), + byte(v>>40), + byte(v>>48), + byte(v>>56)) + return b +} + +// appendVarint appends an encoded varint to b. +func appendVarint(b []byte, v uint64) []byte { + // TODO: make 1-byte (maybe 2-byte) case inline-able, once we + // have non-leaf inliner. + switch { + case v < 1<<7: + b = append(b, byte(v)) + case v < 1<<14: + b = append(b, + byte(v&0x7f|0x80), + byte(v>>7)) + case v < 1<<21: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte(v>>14)) + case v < 1<<28: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte(v>>21)) + case v < 1<<35: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte(v>>28)) + case v < 1<<42: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte(v>>35)) + case v < 1<<49: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte(v>>42)) + case v < 1<<56: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte(v>>49)) + case v < 1<<63: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte(v>>56)) + default: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte((v>>56)&0x7f|0x80), + 1) + } + return b +} + +func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, *p) + return b, nil +} +func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(*p)) + return b, nil +} +func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(*p)) + return b, nil +} +func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, *p) + return b, nil +} +func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(*p)) + return b, nil +} +func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(*p)) + return b, nil +} +func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, *p) + return b, nil +} +func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + } + return b, nil +} +func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, v) + } + return b, nil +} +func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + if !v { + return b, nil + } + b = appendVarint(b, wiretag) + b = append(b, 1) + return b, nil +} + +func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toBoolPtr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + if *p { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(len(s))) + for _, v := range s { + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if v == "" { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toStringSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} +func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if v == "" { + return b, nil + } + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + s := *ptr.toStringSlice() + for _, v := range s { + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if v == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if len(v) == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBytesSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} + +// makeGroupMarshaler returns the sizer and marshaler for a group. +// u is the marshal info of the underlying message. +func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + return u.size(p) + 2*tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + var err error + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, p, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + return b, err + } +} + +// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. +// u is the marshal info of the underlying message. +func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + n += u.size(v) + 2*tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, v, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMessageMarshaler returns the sizer and marshaler for a message field. +// u is the marshal info of the message. +func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.size(p) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(p) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, p, deterministic) + } +} + +// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. +// u is the marshal info of the message. +func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMapMarshaler returns the sizer and marshaler for a map field. +// f is the pointer to the reflect data structure of the field. +func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { + // figure out key and value type + t := f.Type + keyType := t.Key() + valType := t.Elem() + keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map + valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map + keyWireTag := 1<<3 | wiretype(keyTags[0]) + valWireTag := 2<<3 | wiretype(valTags[0]) + + // We create an interface to get the addresses of the map key and value. + // If value is pointer-typed, the interface is a direct interface, the + // idata itself is the value. Otherwise, the idata is the pointer to the + // value. + // Key cannot be pointer-typed. + valIsPtr := valType.Kind() == reflect.Ptr + + // If value is a message with nested maps, calling + // valSizer in marshal may be quadratic. We should use + // cached version in marshal (but not in size). + // If value is not message type, we don't have size cache, + // but it cannot be nested either. Just use valSizer. + valCachedSizer := valSizer + if valIsPtr && valType.Elem().Kind() == reflect.Struct { + u := getMarshalInfo(valType.Elem()) + valCachedSizer = func(ptr pointer, tagsize int) int { + // Same as message sizer, but use cache. + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.cachedsize(p) + return siz + SizeVarint(uint64(siz)) + tagsize + } + } + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(t).Elem() // the map + n := 0 + for _, k := range m.MapKeys() { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(t).Elem() // the map + var err error + keys := m.MapKeys() + if len(keys) > 1 && deterministic { + sort.Sort(mapKeys(keys)) + } + + var nerr nonFatal + for _, k := range keys { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value + b = appendVarint(b, tag) + siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + b = appendVarint(b, uint64(siz)) + b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) + if !nerr.Merge(err) { + return b, err + } + b, err = valMarshaler(b, vaddr, valWireTag, deterministic) + if err != ErrNil && !nerr.Merge(err) { // allow nil value in map + return b, err + } + } + return b, nerr.E + } +} + +// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. +// fi is the marshal info of the field. +// f is the pointer to the reflect data structure of the field. +func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { + // Oneof field is an interface. We need to get the actual data type on the fly. + t := f.Type + return func(ptr pointer, _ int) int { + p := ptr.getInterfacePointer() + if p.isNil() { + return 0 + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + e := fi.oneofElems[telem] + return e.sizer(p, e.tagsize) + }, + func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { + p := ptr.getInterfacePointer() + if p.isNil() { + return b, nil + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { + return b, errOneofHasNil + } + e := fi.oneofElems[telem] + return e.marshaler(b, p, e.wiretag, deterministic) + } +} + +// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. +func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + n += ei.sizer(p, ei.tagsize) + } + mu.Unlock() + return n +} + +// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. +func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + // Not sure this is required, but the old code does it. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// message set format is: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } + +// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field +// in message set format (above). +func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for id, e := range m { + n += 2 // start group, end group. tag = 1 (size=1) + n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + siz := len(msgWithLen) + n += siz + 1 // message, tag = 3 (size=1) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + n += ei.sizer(p, 1) // message, tag = 3 (size=1) + } + mu.Unlock() + return n +} + +// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) +// to the end of byte slice b. +func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for id, e := range m { + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + if !nerr.Merge(err) { + return b, err + } + b = append(b, 1<<3|WireEndGroup) + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, id := range keys { + e := m[int32(id)] + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + b = append(b, 1<<3|WireEndGroup) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// sizeV1Extensions computes the size of encoded data for a V1-API extension field. +func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { + if m == nil { + return 0 + } + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + n += ei.sizer(p, ei.tagsize) + } + return n +} + +// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. +func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { + if m == nil { + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + var err error + var nerr nonFatal + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// newMarshaler is the interface representing objects that can marshal themselves. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newMarshaler interface { + XXX_Size() int + XXX_Marshal(b []byte, deterministic bool) ([]byte, error) +} + +// Size returns the encoded size of a protocol buffer message. +// This is the main entry point. +func Size(pb Message) int { + if m, ok := pb.(newMarshaler); ok { + return m.XXX_Size() + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, _ := m.Marshal() + return len(b) + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return 0 + } + var info InternalMessageInfo + return info.Size(pb) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, returning the data. +// This is the main entry point. +func Marshal(pb Message) ([]byte, error) { + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + b := make([]byte, 0, siz) + return m.XXX_Marshal(b, false) + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + return m.Marshal() + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return nil, ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + b := make([]byte, 0, siz) + return info.Marshal(b, pb, false) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, writing the result to the +// Buffer. +// This is an alternative entry point. It is not necessary to use +// a Buffer for most applications. +func (p *Buffer) Marshal(pb Message) error { + var err error + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + p.grow(siz) // make sure buf has enough capacity + p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) + return err + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, err := m.Marshal() + p.buf = append(p.buf, b...) + return err + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + p.grow(siz) // make sure buf has enough capacity + p.buf, err = info.Marshal(p.buf, pb, p.deterministic) + return err +} + +// grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After grow(n), at least n bytes can be written to the +// buffer without another allocation. +func (p *Buffer) grow(n int) { + need := len(p.buf) + n + if need <= cap(p.buf) { + return + } + newCap := len(p.buf) * 2 + if newCap < need { + newCap = need + } + p.buf = append(make([]byte, 0, newCap), p.buf...) +} diff --git a/vendor/github.com/golang/protobuf/proto/table_merge.go b/vendor/github.com/golang/protobuf/proto/table_merge.go new file mode 100644 index 000000000000..5525def6a5da --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_merge.go @@ -0,0 +1,654 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +// Merge merges the src message into dst. +// This assumes that dst and src of the same type and are non-nil. +func (a *InternalMessageInfo) Merge(dst, src Message) { + mi := atomicLoadMergeInfo(&a.merge) + if mi == nil { + mi = getMergeInfo(reflect.TypeOf(dst).Elem()) + atomicStoreMergeInfo(&a.merge, mi) + } + mi.merge(toPointer(&dst), toPointer(&src)) +} + +type mergeInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []mergeFieldInfo + unrecognized field // Offset of XXX_unrecognized +} + +type mergeFieldInfo struct { + field field // Offset of field, guaranteed to be valid + + // isPointer reports whether the value in the field is a pointer. + // This is true for the following situations: + // * Pointer to struct + // * Pointer to basic type (proto2 only) + // * Slice (first value in slice header is a pointer) + // * String (first value in string header is a pointer) + isPointer bool + + // basicWidth reports the width of the field assuming that it is directly + // embedded in the struct (as is the case for basic types in proto3). + // The possible values are: + // 0: invalid + // 1: bool + // 4: int32, uint32, float32 + // 8: int64, uint64, float64 + basicWidth int + + // Where dst and src are pointers to the types being merged. + merge func(dst, src pointer) +} + +var ( + mergeInfoMap = map[reflect.Type]*mergeInfo{} + mergeInfoLock sync.Mutex +) + +func getMergeInfo(t reflect.Type) *mergeInfo { + mergeInfoLock.Lock() + defer mergeInfoLock.Unlock() + mi := mergeInfoMap[t] + if mi == nil { + mi = &mergeInfo{typ: t} + mergeInfoMap[t] = mi + } + return mi +} + +// merge merges src into dst assuming they are both of type *mi.typ. +func (mi *mergeInfo) merge(dst, src pointer) { + if dst.isNil() { + panic("proto: nil destination") + } + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&mi.initialized) == 0 { + mi.computeMergeInfo() + } + + for _, fi := range mi.fields { + sfp := src.offset(fi.field) + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string + continue + } + if fi.basicWidth > 0 { + switch { + case fi.basicWidth == 1 && !*sfp.toBool(): + continue + case fi.basicWidth == 4 && *sfp.toUint32() == 0: + continue + case fi.basicWidth == 8 && *sfp.toUint64() == 0: + continue + } + } + } + + dfp := dst.offset(fi.field) + fi.merge(dfp, sfp) + } + + // TODO: Make this faster? + out := dst.asPointerTo(mi.typ).Elem() + in := src.asPointerTo(mi.typ).Elem() + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + if mi.unrecognized.IsValid() { + if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { + *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) + } + } +} + +func (mi *mergeInfo) computeMergeInfo() { + mi.lock.Lock() + defer mi.lock.Unlock() + if mi.initialized != 0 { + return + } + t := mi.typ + n := t.NumField() + + props := GetProperties(t) + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + mfi := mergeFieldInfo{field: toField(&f)} + tf := f.Type + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + switch tf.Kind() { + case reflect.Ptr, reflect.Slice, reflect.String: + // As a special case, we assume slices and strings are pointers + // since we know that the first field in the SliceSlice or + // StringHeader is a data pointer. + mfi.isPointer = true + case reflect.Bool: + mfi.basicWidth = 1 + case reflect.Int32, reflect.Uint32, reflect.Float32: + mfi.basicWidth = 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + mfi.basicWidth = 8 + } + } + + // Unwrap tf to get at its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + tf.Name()) + } + + switch tf.Kind() { + case reflect.Int32: + switch { + case isSlice: // E.g., []int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Slice is not defined (see pointer_reflect.go). + /* + sfsp := src.toInt32Slice() + if *sfsp != nil { + dfsp := dst.toInt32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + */ + sfs := src.getInt32Slice() + if sfs != nil { + dfs := dst.getInt32Slice() + dfs = append(dfs, sfs...) + if dfs == nil { + dfs = []int32{} + } + dst.setInt32Slice(dfs) + } + } + case isPointer: // E.g., *int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). + /* + sfpp := src.toInt32Ptr() + if *sfpp != nil { + dfpp := dst.toInt32Ptr() + if *dfpp == nil { + *dfpp = Int32(**sfpp) + } else { + **dfpp = **sfpp + } + } + */ + sfp := src.getInt32Ptr() + if sfp != nil { + dfp := dst.getInt32Ptr() + if dfp == nil { + dst.setInt32Ptr(*sfp) + } else { + *dfp = *sfp + } + } + } + default: // E.g., int32 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt32(); v != 0 { + *dst.toInt32() = v + } + } + } + case reflect.Int64: + switch { + case isSlice: // E.g., []int64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toInt64Slice() + if *sfsp != nil { + dfsp := dst.toInt64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + } + case isPointer: // E.g., *int64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toInt64Ptr() + if *sfpp != nil { + dfpp := dst.toInt64Ptr() + if *dfpp == nil { + *dfpp = Int64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., int64 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt64(); v != 0 { + *dst.toInt64() = v + } + } + } + case reflect.Uint32: + switch { + case isSlice: // E.g., []uint32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint32Slice() + if *sfsp != nil { + dfsp := dst.toUint32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint32{} + } + } + } + case isPointer: // E.g., *uint32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint32Ptr() + if *sfpp != nil { + dfpp := dst.toUint32Ptr() + if *dfpp == nil { + *dfpp = Uint32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint32 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint32(); v != 0 { + *dst.toUint32() = v + } + } + } + case reflect.Uint64: + switch { + case isSlice: // E.g., []uint64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint64Slice() + if *sfsp != nil { + dfsp := dst.toUint64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint64{} + } + } + } + case isPointer: // E.g., *uint64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint64Ptr() + if *sfpp != nil { + dfpp := dst.toUint64Ptr() + if *dfpp == nil { + *dfpp = Uint64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint64 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint64(); v != 0 { + *dst.toUint64() = v + } + } + } + case reflect.Float32: + switch { + case isSlice: // E.g., []float32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat32Slice() + if *sfsp != nil { + dfsp := dst.toFloat32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float32{} + } + } + } + case isPointer: // E.g., *float32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat32Ptr() + if *sfpp != nil { + dfpp := dst.toFloat32Ptr() + if *dfpp == nil { + *dfpp = Float32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float32 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat32(); v != 0 { + *dst.toFloat32() = v + } + } + } + case reflect.Float64: + switch { + case isSlice: // E.g., []float64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat64Slice() + if *sfsp != nil { + dfsp := dst.toFloat64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float64{} + } + } + } + case isPointer: // E.g., *float64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat64Ptr() + if *sfpp != nil { + dfpp := dst.toFloat64Ptr() + if *dfpp == nil { + *dfpp = Float64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float64 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat64(); v != 0 { + *dst.toFloat64() = v + } + } + } + case reflect.Bool: + switch { + case isSlice: // E.g., []bool + mfi.merge = func(dst, src pointer) { + sfsp := src.toBoolSlice() + if *sfsp != nil { + dfsp := dst.toBoolSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []bool{} + } + } + } + case isPointer: // E.g., *bool + mfi.merge = func(dst, src pointer) { + sfpp := src.toBoolPtr() + if *sfpp != nil { + dfpp := dst.toBoolPtr() + if *dfpp == nil { + *dfpp = Bool(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., bool + mfi.merge = func(dst, src pointer) { + if v := *src.toBool(); v { + *dst.toBool() = v + } + } + } + case reflect.String: + switch { + case isSlice: // E.g., []string + mfi.merge = func(dst, src pointer) { + sfsp := src.toStringSlice() + if *sfsp != nil { + dfsp := dst.toStringSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []string{} + } + } + } + case isPointer: // E.g., *string + mfi.merge = func(dst, src pointer) { + sfpp := src.toStringPtr() + if *sfpp != nil { + dfpp := dst.toStringPtr() + if *dfpp == nil { + *dfpp = String(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., string + mfi.merge = func(dst, src pointer) { + if v := *src.toString(); v != "" { + *dst.toString() = v + } + } + } + case reflect.Slice: + isProto3 := props.Prop[i].proto3 + switch { + case isPointer: + panic("bad pointer in byte slice case in " + tf.Name()) + case tf.Elem().Kind() != reflect.Uint8: + panic("bad element kind in byte slice case in " + tf.Name()) + case isSlice: // E.g., [][]byte + mfi.merge = func(dst, src pointer) { + sbsp := src.toBytesSlice() + if *sbsp != nil { + dbsp := dst.toBytesSlice() + for _, sb := range *sbsp { + if sb == nil { + *dbsp = append(*dbsp, nil) + } else { + *dbsp = append(*dbsp, append([]byte{}, sb...)) + } + } + if *dbsp == nil { + *dbsp = [][]byte{} + } + } + } + default: // E.g., []byte + mfi.merge = func(dst, src pointer) { + sbp := src.toBytes() + if *sbp != nil { + dbp := dst.toBytes() + if !isProto3 || len(*sbp) > 0 { + *dbp = append([]byte{}, *sbp...) + } + } + } + } + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("message field %s without pointer", tf)) + case isSlice: // E.g., []*pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sps := src.getPointerSlice() + if sps != nil { + dps := dst.getPointerSlice() + for _, sp := range sps { + var dp pointer + if !sp.isNil() { + dp = valToPointer(reflect.New(tf)) + mi.merge(dp, sp) + } + dps = append(dps, dp) + } + if dps == nil { + dps = []pointer{} + } + dst.setPointerSlice(dps) + } + } + default: // E.g., *pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sp := src.getPointer() + if !sp.isNil() { + dp := dst.getPointer() + if dp.isNil() { + dp = valToPointer(reflect.New(tf)) + dst.setPointer(dp) + } + mi.merge(dp, sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic("bad pointer or slice in map case in " + tf.Name()) + default: // E.g., map[K]V + mfi.merge = func(dst, src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + dm := dst.asPointerTo(tf).Elem() + if dm.IsNil() { + dm.Set(reflect.MakeMap(tf)) + } + + switch tf.Elem().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(Clone(val.Interface().(Message))) + dm.SetMapIndex(key, val) + } + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + dm.SetMapIndex(key, val) + } + default: // Basic type (e.g., string) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + dm.SetMapIndex(key, val) + } + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic("bad pointer or slice in interface case in " + tf.Name()) + default: // E.g., interface{} + // TODO: Make this faster? + mfi.merge = func(dst, src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + du := dst.asPointerTo(tf).Elem() + typ := su.Elem().Type() + if du.IsNil() || du.Elem().Type() != typ { + du.Set(reflect.New(typ.Elem())) // Initialize interface if empty + } + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + dv := du.Elem().Elem().Field(0) + if dv.Kind() == reflect.Ptr && dv.IsNil() { + dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + Merge(dv.Interface().(Message), sv.Interface().(Message)) + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) + default: // Basic type (e.g., string) + dv.Set(sv) + } + } + } + } + default: + panic(fmt.Sprintf("merger not found for type:%s", tf)) + } + mi.fields = append(mi.fields, mfi) + } + + mi.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + mi.unrecognized = toField(&f) + } + + atomic.StoreInt32(&mi.initialized, 1) +} diff --git a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go new file mode 100644 index 000000000000..acee2fc52964 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go @@ -0,0 +1,2053 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// Unmarshal is the entry point from the generated .pb.go files. +// This function is not intended to be used by non-generated code. +// This function is not subject to any compatibility guarantee. +// msg contains a pointer to a protocol buffer struct. +// b is the data to be unmarshaled into the protocol buffer. +// a is a pointer to a place to store cached unmarshal information. +func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { + // Load the unmarshal information for this message type. + // The atomic load ensures memory consistency. + u := atomicLoadUnmarshalInfo(&a.unmarshal) + if u == nil { + // Slow path: find unmarshal info for msg, update a with it. + u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) + atomicStoreUnmarshalInfo(&a.unmarshal, u) + } + // Then do the unmarshaling. + err := u.unmarshal(toPointer(&msg), b) + return err +} + +type unmarshalInfo struct { + typ reflect.Type // type of the protobuf struct + + // 0 = only typ field is initialized + // 1 = completely initialized + initialized int32 + lock sync.Mutex // prevents double initialization + dense []unmarshalFieldInfo // fields indexed by tag # + sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # + reqFields []string // names of required fields + reqMask uint64 // 1< 0 { + // Read tag and wire type. + // Special case 1 and 2 byte varints. + var x uint64 + if b[0] < 128 { + x = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + x = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + x, n = decodeVarint(b) + if n == 0 { + return io.ErrUnexpectedEOF + } + b = b[n:] + } + tag := x >> 3 + wire := int(x) & 7 + + // Dispatch on the tag to one of the unmarshal* functions below. + var f unmarshalFieldInfo + if tag < uint64(len(u.dense)) { + f = u.dense[tag] + } else { + f = u.sparse[tag] + } + if fn := f.unmarshal; fn != nil { + var err error + b, err = fn(b, m.offset(f.field), wire) + if err == nil { + reqMask |= f.reqMask + continue + } + if r, ok := err.(*RequiredNotSetError); ok { + // Remember this error, but keep parsing. We need to produce + // a full parse even if a required field is missing. + if errLater == nil { + errLater = r + } + reqMask |= f.reqMask + continue + } + if err != errInternalBadWireType { + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return err + } + // Fragments with bad wire type are treated as unknown fields. + } + + // Unknown tag. + if !u.unrecognized.IsValid() { + // Don't keep unrecognized data; just skip it. + var err error + b, err = skipField(b, wire) + if err != nil { + return err + } + continue + } + // Keep unrecognized data around. + // maybe in extensions, maybe in the unrecognized field. + z := m.offset(u.unrecognized).toBytes() + var emap map[int32]Extension + var e Extension + for _, r := range u.extensionRanges { + if uint64(r.Start) <= tag && tag <= uint64(r.End) { + if u.extensions.IsValid() { + mp := m.offset(u.extensions).toExtensions() + emap = mp.extensionsWrite() + e = emap[int32(tag)] + z = &e.enc + break + } + if u.oldExtensions.IsValid() { + p := m.offset(u.oldExtensions).toOldExtensions() + emap = *p + if emap == nil { + emap = map[int32]Extension{} + *p = emap + } + e = emap[int32(tag)] + z = &e.enc + break + } + panic("no extensions field available") + } + } + + // Use wire type to skip data. + var err error + b0 := b + b, err = skipField(b, wire) + if err != nil { + return err + } + *z = encodeVarint(*z, tag<<3|uint64(wire)) + *z = append(*z, b0[:len(b0)-len(b)]...) + + if emap != nil { + emap[int32(tag)] = e + } + } + if reqMask != u.reqMask && errLater == nil { + // A required field of this message is missing. + for _, n := range u.reqFields { + if reqMask&1 == 0 { + errLater = &RequiredNotSetError{n} + } + reqMask >>= 1 + } + } + return errLater +} + +// computeUnmarshalInfo fills in u with information for use +// in unmarshaling protocol buffers of type u.typ. +func (u *unmarshalInfo) computeUnmarshalInfo() { + u.lock.Lock() + defer u.lock.Unlock() + if u.initialized != 0 { + return + } + t := u.typ + n := t.NumField() + + // Set up the "not found" value for the unrecognized byte buffer. + // This is the default for proto3. + u.unrecognized = invalidField + u.extensions = invalidField + u.oldExtensions = invalidField + + // List of the generated type and offset for each oneof field. + type oneofField struct { + ityp reflect.Type // interface type of oneof field + field field // offset in containing message + } + var oneofFields []oneofField + + for i := 0; i < n; i++ { + f := t.Field(i) + if f.Name == "XXX_unrecognized" { + // The byte slice used to hold unrecognized input is special. + if f.Type != reflect.TypeOf(([]byte)(nil)) { + panic("bad type for XXX_unrecognized field: " + f.Type.Name()) + } + u.unrecognized = toField(&f) + continue + } + if f.Name == "XXX_InternalExtensions" { + // Ditto here. + if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { + panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) + } + u.extensions = toField(&f) + if f.Tag.Get("protobuf_messageset") == "1" { + u.isMessageSet = true + } + continue + } + if f.Name == "XXX_extensions" { + // An older form of the extensions field. + if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) { + panic("bad type for XXX_extensions field: " + f.Type.Name()) + } + u.oldExtensions = toField(&f) + continue + } + if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { + continue + } + + oneof := f.Tag.Get("protobuf_oneof") + if oneof != "" { + oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) + // The rest of oneof processing happens below. + continue + } + + tags := f.Tag.Get("protobuf") + tagArray := strings.Split(tags, ",") + if len(tagArray) < 2 { + panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) + } + tag, err := strconv.Atoi(tagArray[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tagArray[1]) + } + + name := "" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Extract unmarshaling function from the field (its type and tags). + unmarshal := fieldUnmarshaler(&f) + + // Required field? + var reqMask uint64 + if tagArray[2] == "req" { + bit := len(u.reqFields) + u.reqFields = append(u.reqFields, name) + reqMask = uint64(1) << uint(bit) + // TODO: if we have more than 64 required fields, we end up + // not verifying that all required fields are present. + // Fix this, perhaps using a count of required fields? + } + + // Store the info in the correct slot in the message. + u.setTag(tag, toField(&f), unmarshal, reqMask, name) + } + + // Find any types associated with oneof fields. + var oneofImplementers []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + for _, v := range oneofImplementers { + tptr := reflect.TypeOf(v) // *Msg_X + typ := tptr.Elem() // Msg_X + + f := typ.Field(0) // oneof implementers have one field + baseUnmarshal := fieldUnmarshaler(&f) + tags := strings.Split(f.Tag.Get("protobuf"), ",") + fieldNum, err := strconv.Atoi(tags[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tags[1]) + } + var name string + for _, tag := range tags { + if strings.HasPrefix(tag, "name=") { + name = strings.TrimPrefix(tag, "name=") + break + } + } + + // Find the oneof field that this struct implements. + // Might take O(n^2) to process all of the oneofs, but who cares. + for _, of := range oneofFields { + if tptr.Implements(of.ityp) { + // We have found the corresponding interface for this struct. + // That lets us know where this struct should be stored + // when we encounter it during unmarshaling. + unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) + u.setTag(fieldNum, of.field, unmarshal, 0, name) + } + } + + } + + // Get extension ranges, if any. + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + if fn.IsValid() { + if !u.extensions.IsValid() && !u.oldExtensions.IsValid() { + panic("a message with extensions, but no extensions field in " + t.Name()) + } + u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) + } + + // Explicitly disallow tag 0. This will ensure we flag an error + // when decoding a buffer of all zeros. Without this code, we + // would decode and skip an all-zero buffer of even length. + // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. + u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { + return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) + }, 0, "") + + // Set mask for required field check. + u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? + for len(u.dense) <= tag { + u.dense = append(u.dense, unmarshalFieldInfo{}) + } + u.dense[tag] = i + return + } + if u.sparse == nil { + u.sparse = map[uint64]unmarshalFieldInfo{} + } + u.sparse[uint64(tag)] = i +} + +// fieldUnmarshaler returns an unmarshaler for the given field. +func fieldUnmarshaler(f *reflect.StructField) unmarshaler { + if f.Type.Kind() == reflect.Map { + return makeUnmarshalMap(f) + } + return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) +} + +// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. +func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { + tagArray := strings.Split(tags, ",") + encoding := tagArray[0] + name := "unknown" + proto3 := false + validateUTF8 := true + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + if tag == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + // Figure out packaging (pointer, slice, or both) + slice := false + pointer := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + // We'll never have both pointer and slice for basic types. + if pointer && slice && t.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + t.Name()) + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return unmarshalBoolPtr + } + if slice { + return unmarshalBoolSlice + } + return unmarshalBoolValue + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixedS32Ptr + } + if slice { + return unmarshalFixedS32Slice + } + return unmarshalFixedS32Value + case "varint": + // this could be int32 or enum + if pointer { + return unmarshalInt32Ptr + } + if slice { + return unmarshalInt32Slice + } + return unmarshalInt32Value + case "zigzag32": + if pointer { + return unmarshalSint32Ptr + } + if slice { + return unmarshalSint32Slice + } + return unmarshalSint32Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixedS64Ptr + } + if slice { + return unmarshalFixedS64Slice + } + return unmarshalFixedS64Value + case "varint": + if pointer { + return unmarshalInt64Ptr + } + if slice { + return unmarshalInt64Slice + } + return unmarshalInt64Value + case "zigzag64": + if pointer { + return unmarshalSint64Ptr + } + if slice { + return unmarshalSint64Slice + } + return unmarshalSint64Value + } + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixed32Ptr + } + if slice { + return unmarshalFixed32Slice + } + return unmarshalFixed32Value + case "varint": + if pointer { + return unmarshalUint32Ptr + } + if slice { + return unmarshalUint32Slice + } + return unmarshalUint32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixed64Ptr + } + if slice { + return unmarshalFixed64Slice + } + return unmarshalFixed64Value + case "varint": + if pointer { + return unmarshalUint64Ptr + } + if slice { + return unmarshalUint64Slice + } + return unmarshalUint64Value + } + case reflect.Float32: + if pointer { + return unmarshalFloat32Ptr + } + if slice { + return unmarshalFloat32Slice + } + return unmarshalFloat32Value + case reflect.Float64: + if pointer { + return unmarshalFloat64Ptr + } + if slice { + return unmarshalFloat64Slice + } + return unmarshalFloat64Value + case reflect.Map: + panic("map type in typeUnmarshaler in " + t.Name()) + case reflect.Slice: + if pointer { + panic("bad pointer in slice case in " + t.Name()) + } + if slice { + return unmarshalBytesSlice + } + return unmarshalBytesValue + case reflect.String: + if validateUTF8 { + if pointer { + return unmarshalUTF8StringPtr + } + if slice { + return unmarshalUTF8StringSlice + } + return unmarshalUTF8StringValue + } + if pointer { + return unmarshalStringPtr + } + if slice { + return unmarshalStringSlice + } + return unmarshalStringValue + case reflect.Struct: + // message or group field + if !pointer { + panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding)) + } + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) + case "group": + if slice { + return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) + } + } + panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) +} + +// Below are all the unmarshalers for individual fields of various types. + +func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64() = v + return b, nil +} + +func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64() = v + return b, nil +} + +func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64() = v + return b, nil +} + +func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64Ptr() = &v + return b, nil +} + +func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + *f.toInt32() = v + return b, nil +} + +func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + *f.toInt32() = v + return b, nil +} + +func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32() = v + return b, nil +} + +func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32Ptr() = &v + return b, nil +} + +func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64() = v + return b[8:], nil +} + +func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64() = v + return b[8:], nil +} + +func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32() = v + return b[4:], nil +} + +func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32Ptr() = &v + return b[4:], nil +} + +func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + *f.toInt32() = v + return b[4:], nil +} + +func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.setInt32Ptr(v) + return b[4:], nil +} + +func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + return b[4:], nil +} + +func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + // Note: any length varint is allowed, even though any sane + // encoder will use one byte. + // See https://github.com/golang/protobuf/issues/76 + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + // TODO: check if x>1? Tests seem to indicate no. + v := x != 0 + *f.toBool() = v + return b[n:], nil +} + +func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + *f.toBoolPtr() = &v + return b[n:], nil +} + +func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + b = b[n:] + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + return b[n:], nil +} + +func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64() = v + return b[8:], nil +} + +func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64Ptr() = &v + return b[8:], nil +} + +func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32() = v + return b[4:], nil +} + +func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32Ptr() = &v + return b[4:], nil +} + +func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + return b[x:], nil +} + +func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + return b[x:], nil +} + +func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + return b[x:], nil +} + +func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +var emptyBuf [0]byte + +func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // The use of append here is a trick which avoids the zeroing + // that would be required if we used a make/copy pair. + // We append to emptyBuf instead of nil because we want + // a non-nil result even when the length is 0. + v := append(emptyBuf[:], b[:x]...) + *f.toBytes() = v + return b[x:], nil +} + +func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := append(emptyBuf[:], b[:x]...) + s := f.toBytesSlice() + *s = append(*s, v) + return b[x:], nil +} + +func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[y:], err + } +} + +func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[y:], err + } +} + +func makeUnmarshalMap(f *reflect.StructField) unmarshaler { + t := f.Type + kt := t.Key() + vt := t.Elem() + unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) + unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val")) + return func(b []byte, f pointer, w int) ([]byte, error) { + // The map entry is a submessage. Figure out how big it is. + if w != WireBytes { + return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + r := b[x:] // unused data to return + b = b[:x] // data for map entry + + // Note: we could use #keys * #values ~= 200 functions + // to do map decoding without reflection. Probably not worth it. + // Maps will be somewhat slow. Oh well. + + // Read key and value from data. + var nerr nonFatal + k := reflect.New(kt) + v := reflect.New(vt) + for len(b) > 0 { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + wire := int(x) & 7 + b = b[n:] + + var err error + switch x >> 3 { + case 1: + b, err = unmarshalKey(b, valToPointer(k), wire) + case 2: + b, err = unmarshalVal(b, valToPointer(v), wire) + default: + err = errInternalBadWireType // skip unknown tag + } + + if nerr.Merge(err) { + continue + } + if err != errInternalBadWireType { + return nil, err + } + + // Skip past unknown fields. + b, err = skipField(b, wire) + if err != nil { + return nil, err + } + } + + // Get map, allocate if needed. + m := f.asPointerTo(t).Elem() // an addressable map[K]T + if m.IsNil() { + m.Set(reflect.MakeMap(t)) + } + + // Insert into map. + m.SetMapIndex(k.Elem(), v.Elem()) + + return r, nerr.E + } +} + +// makeUnmarshalOneof makes an unmarshaler for oneof fields. +// for: +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } +// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). +// ityp is the interface type of the oneof field (e.g. isMsg_F). +// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). +// Note that this function will be called once for each case in the oneof. +func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { + sf := typ.Field(0) + field0 := toField(&sf) + return func(b []byte, f pointer, w int) ([]byte, error) { + // Allocate holder for value. + v := reflect.New(typ) + + // Unmarshal data into holder. + // We unmarshal into the first field of the holder object. + var err error + var nerr nonFatal + b, err = unmarshal(b, valToPointer(v).offset(field0), w) + if !nerr.Merge(err) { + return nil, err + } + + // Write pointer to holder into target field. + f.asPointerTo(ityp).Elem().Set(v) + + return b, nerr.E + } +} + +// Error used by decode internally. +var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") + +// skipField skips past a field of type wire and returns the remaining bytes. +func skipField(b []byte, wire int) ([]byte, error) { + switch wire { + case WireVarint: + _, k := decodeVarint(b) + if k == 0 { + return b, io.ErrUnexpectedEOF + } + b = b[k:] + case WireFixed32: + if len(b) < 4 { + return b, io.ErrUnexpectedEOF + } + b = b[4:] + case WireFixed64: + if len(b) < 8 { + return b, io.ErrUnexpectedEOF + } + b = b[8:] + case WireBytes: + m, k := decodeVarint(b) + if k == 0 || uint64(len(b)-k) < m { + return b, io.ErrUnexpectedEOF + } + b = b[uint64(k)+m:] + case WireStartGroup: + _, i := findEndGroup(b) + if i == -1 { + return b, io.ErrUnexpectedEOF + } + b = b[i:] + default: + return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) + } + return b, nil +} + +// findEndGroup finds the index of the next EndGroup tag. +// Groups may be nested, so the "next" EndGroup tag is the first +// unpaired EndGroup. +// findEndGroup returns the indexes of the start and end of the EndGroup tag. +// Returns (-1,-1) if it can't find one. +func findEndGroup(b []byte) (int, int) { + depth := 1 + i := 0 + for { + x, n := decodeVarint(b[i:]) + if n == 0 { + return -1, -1 + } + j := i + i += n + switch x & 7 { + case WireVarint: + _, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + case WireFixed32: + if len(b)-4 < i { + return -1, -1 + } + i += 4 + case WireFixed64: + if len(b)-8 < i { + return -1, -1 + } + i += 8 + case WireBytes: + m, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + if uint64(len(b)-i) < m { + return -1, -1 + } + i += int(m) + case WireStartGroup: + depth++ + case WireEndGroup: + depth-- + if depth == 0 { + return j, i + } + default: + return -1, -1 + } + } +} + +// encodeVarint appends a varint-encoded integer to b and returns the result. +func encodeVarint(b []byte, x uint64) []byte { + for x >= 1<<7 { + b = append(b, byte(x&0x7f|0x80)) + x >>= 7 + } + return append(b, byte(x)) +} + +// decodeVarint reads a varint-encoded integer from b. +// Returns the decoded integer and the number of bytes read. +// If there is an error, it returns 0,0. +func decodeVarint(b []byte) (uint64, int) { + var x, y uint64 + if len(b) == 0 { + goto bad + } + x = uint64(b[0]) + if x < 0x80 { + return x, 1 + } + x -= 0x80 + + if len(b) <= 1 { + goto bad + } + y = uint64(b[1]) + x += y << 7 + if y < 0x80 { + return x, 2 + } + x -= 0x80 << 7 + + if len(b) <= 2 { + goto bad + } + y = uint64(b[2]) + x += y << 14 + if y < 0x80 { + return x, 3 + } + x -= 0x80 << 14 + + if len(b) <= 3 { + goto bad + } + y = uint64(b[3]) + x += y << 21 + if y < 0x80 { + return x, 4 + } + x -= 0x80 << 21 + + if len(b) <= 4 { + goto bad + } + y = uint64(b[4]) + x += y << 28 + if y < 0x80 { + return x, 5 + } + x -= 0x80 << 28 + + if len(b) <= 5 { + goto bad + } + y = uint64(b[5]) + x += y << 35 + if y < 0x80 { + return x, 6 + } + x -= 0x80 << 35 + + if len(b) <= 6 { + goto bad + } + y = uint64(b[6]) + x += y << 42 + if y < 0x80 { + return x, 7 + } + x -= 0x80 << 42 + + if len(b) <= 7 { + goto bad + } + y = uint64(b[7]) + x += y << 49 + if y < 0x80 { + return x, 8 + } + x -= 0x80 << 49 + + if len(b) <= 8 { + goto bad + } + y = uint64(b[8]) + x += y << 56 + if y < 0x80 { + return x, 9 + } + x -= 0x80 << 56 + + if len(b) <= 9 { + goto bad + } + y = uint64(b[9]) + x += y << 63 + if y < 2 { + return x, 10 + } + +bad: + return 0, 0 +} diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go index 965876bf033b..1aaee725b45b 100644 --- a/vendor/github.com/golang/protobuf/proto/text.go +++ b/vendor/github.com/golang/protobuf/proto/text.go @@ -50,7 +50,6 @@ import ( var ( newline = []byte("\n") spaces = []byte(" ") - gtNewline = []byte(">\n") endBraceNewline = []byte("}\n") backslashN = []byte{'\\', 'n'} backslashR = []byte{'\\', 'r'} @@ -170,11 +169,6 @@ func writeName(w *textWriter, props *Properties) error { return nil } -// raw is the interface satisfied by RawMessage. -type raw interface { - Bytes() []byte -} - func requiresQuotes(u string) bool { // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. for _, ch := range u { @@ -269,6 +263,10 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { props := sprops.Prop[i] name := st.Field(i).Name + if name == "XXX_NoUnkeyedLiteral" { + continue + } + if strings.HasPrefix(name, "XXX_") { // There are two XXX_ fields: // XXX_unrecognized []byte @@ -355,7 +353,7 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return err } } - if err := tm.writeAny(w, key, props.mkeyprop); err != nil { + if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { return err } if err := w.WriteByte('\n'); err != nil { @@ -372,7 +370,7 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return err } } - if err := tm.writeAny(w, val, props.mvalprop); err != nil { + if err := tm.writeAny(w, val, props.MapValProp); err != nil { return err } if err := w.WriteByte('\n'); err != nil { @@ -436,12 +434,6 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return err } } - if b, ok := fv.Interface().(raw); ok { - if err := writeRaw(w, b.Bytes()); err != nil { - return err - } - continue - } // Enums have a String method, so writeAny will work fine. if err := tm.writeAny(w, fv, props); err != nil { @@ -455,7 +447,7 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { // Extensions (the XXX_extensions field). pv := sv.Addr() - if _, ok := extendable(pv.Interface()); ok { + if _, err := extendable(pv.Interface()); err == nil { if err := tm.writeExtensions(w, pv); err != nil { return err } @@ -464,27 +456,6 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return nil } -// writeRaw writes an uninterpreted raw message. -func writeRaw(w *textWriter, b []byte) error { - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if err := writeUnknownStruct(w, b); err != nil { - return err - } - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - return nil -} - // writeAny writes an arbitrary field. func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { v = reflect.Indirect(v) @@ -535,6 +506,19 @@ func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Propert } } w.indent() + if v.CanAddr() { + // Calling v.Interface on a struct causes the reflect package to + // copy the entire struct. This is racy with the new Marshaler + // since we atomically update the XXX_sizecache. + // + // Thus, we retrieve a pointer to the struct if possible to avoid + // a race since v.Interface on the pointer doesn't copy the struct. + // + // If v is not addressable, then we are not worried about a race + // since it implies that the binary Marshaler cannot possibly be + // mutating this value. + v = v.Addr() + } if etm, ok := v.Interface().(encoding.TextMarshaler); ok { text, err := etm.MarshalText() if err != nil { @@ -543,8 +527,13 @@ func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Propert if _, err = w.Write(text); err != nil { return err } - } else if err := tm.writeStruct(w, v); err != nil { - return err + } else { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if err := tm.writeStruct(w, v); err != nil { + return err + } } w.unindent() if err := w.WriteByte(ket); err != nil { diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go index 5e14513f28c9..bb55a3af2769 100644 --- a/vendor/github.com/golang/protobuf/proto/text_parser.go +++ b/vendor/github.com/golang/protobuf/proto/text_parser.go @@ -206,7 +206,6 @@ func (p *textParser) advance() { var ( errBadUTF8 = errors.New("proto: bad UTF-8") - errBadHex = errors.New("proto: bad hexadecimal") ) func unquoteC(s string, quote rune) (string, error) { @@ -277,60 +276,47 @@ func unescape(s string) (ch string, tail string, err error) { return "?", s, nil // trigraph workaround case '\'', '"', '\\': return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': + case '0', '1', '2', '3', '4', '5', '6', '7': if len(s) < 2 { return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) } - base := 8 - ss := s[:2] + ss := string(r) + s[:2] s = s[2:] - if r == 'x' || r == 'X' { - base = 16 - } else { - ss = string(r) + ss - } - i, err := strconv.ParseUint(ss, base, 8) + i, err := strconv.ParseUint(ss, 8, 8) if err != nil { - return "", "", err + return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) } return string([]byte{byte(i)}), s, nil - case 'u', 'U': - n := 4 - if r == 'U' { + case 'x', 'X', 'u', 'U': + var n int + switch r { + case 'x', 'X': + n = 2 + case 'u': + n = 4 + case 'U': n = 8 } if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) - } - - bs := make([]byte, n/2) - for i := 0; i < n; i += 2 { - a, ok1 := unhex(s[i]) - b, ok2 := unhex(s[i+1]) - if !ok1 || !ok2 { - return "", "", errBadHex - } - bs[i/2] = a<<4 | b + return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) } + ss := s[:n] s = s[n:] - return string(bs), s, nil + i, err := strconv.ParseUint(ss, 16, 64) + if err != nil { + return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) + } + if r == 'x' || r == 'X' { + return string([]byte{byte(i)}), s, nil + } + if i > utf8.MaxRune { + return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + } + return string(i), s, nil } return "", "", fmt.Errorf(`unknown escape \%c`, r) } -// Adapted from src/pkg/strconv/quote.go. -func unhex(b byte) (v byte, ok bool) { - switch { - case '0' <= b && b <= '9': - return b - '0', true - case 'a' <= b && b <= 'f': - return b - 'a' + 10, true - case 'A' <= b && b <= 'F': - return b - 'A' + 10, true - } - return 0, false -} - // Back off the parser by one token. Can only be done between calls to next(). // It makes the next advance() a no-op. func (p *textParser) back() { p.backed = true } @@ -644,17 +630,17 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { if err := p.consumeToken(":"); err != nil { return err } - if err := p.readAny(key, props.mkeyprop); err != nil { + if err := p.readAny(key, props.MapKeyProp); err != nil { return err } if err := p.consumeOptionalSeparator(); err != nil { return err } case "value": - if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { + if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { return err } - if err := p.readAny(val, props.mvalprop); err != nil { + if err := p.readAny(val, props.MapValProp); err != nil { return err } if err := p.consumeOptionalSeparator(); err != nil { @@ -728,6 +714,9 @@ func (p *textParser) consumeExtName() (string, error) { if tok.err != nil { return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) } + if p.done && tok.value != "]" { + return "", p.errorf("unclosed type_url or extension name") + } } return strings.Join(parts, ""), nil } @@ -865,7 +854,7 @@ func (p *textParser) readAny(v reflect.Value, props *Properties) error { return p.readStruct(fv, terminator) case reflect.Uint32: if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - fv.SetUint(x) + fv.SetUint(uint64(x)) return nil } case reflect.Uint64: @@ -883,13 +872,9 @@ func (p *textParser) readAny(v reflect.Value, props *Properties) error { // UnmarshalText returns *RequiredNotSetError. func UnmarshalText(s string, pb Message) error { if um, ok := pb.(encoding.TextUnmarshaler); ok { - err := um.UnmarshalText([]byte(s)) - return err + return um.UnmarshalText([]byte(s)) } pb.Reset() v := reflect.ValueOf(pb) - if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { - return pe - } - return nil + return newTextParser(s).readStruct(v.Elem(), "") } diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile deleted file mode 100644 index 41a2d04d0144..000000000000 --- a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# Not stored here, but descriptor.proto is in https://github.com/google/protobuf/ -# at src/google/protobuf/descriptor.proto -regenerate: - @echo WARNING! THIS RULE IS PROBABLY NOT RIGHT FOR YOUR INSTALLATION - protoc --go_out=../../../../.. -I$(HOME)/src/protobuf/include $(HOME)/src/protobuf/include/google/protobuf/descriptor.proto diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go index 63cf2c80aade..1ded05bbe71b 100644 --- a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go @@ -1,39 +1,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: google/protobuf/descriptor.proto -/* -Package descriptor is a generated protocol buffer package. - -It is generated from these files: - google/protobuf/descriptor.proto - -It has these top-level messages: - FileDescriptorSet - FileDescriptorProto - DescriptorProto - FieldDescriptorProto - OneofDescriptorProto - EnumDescriptorProto - EnumValueDescriptorProto - ServiceDescriptorProto - MethodDescriptorProto - FileOptions - MessageOptions - FieldOptions - OneofOptions - EnumOptions - EnumValueOptions - ServiceOptions - MethodOptions - UninterpretedOption - SourceCodeInfo - GeneratedCodeInfo -*/ package descriptor -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -44,7 +18,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type FieldDescriptorProto_Type int32 @@ -100,6 +74,7 @@ var FieldDescriptorProto_Type_name = map[int32]string{ 17: "TYPE_SINT32", 18: "TYPE_SINT64", } + var FieldDescriptorProto_Type_value = map[string]int32{ "TYPE_DOUBLE": 1, "TYPE_FLOAT": 2, @@ -126,9 +101,11 @@ func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type { *p = x return p } + func (x FieldDescriptorProto_Type) String() string { return proto.EnumName(FieldDescriptorProto_Type_name, int32(x)) } + func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type") if err != nil { @@ -137,7 +114,10 @@ func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { *x = FieldDescriptorProto_Type(value) return nil } -func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} } + +func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{4, 0} +} type FieldDescriptorProto_Label int32 @@ -153,6 +133,7 @@ var FieldDescriptorProto_Label_name = map[int32]string{ 2: "LABEL_REQUIRED", 3: "LABEL_REPEATED", } + var FieldDescriptorProto_Label_value = map[string]int32{ "LABEL_OPTIONAL": 1, "LABEL_REQUIRED": 2, @@ -164,9 +145,11 @@ func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label { *p = x return p } + func (x FieldDescriptorProto_Label) String() string { return proto.EnumName(FieldDescriptorProto_Label_name, int32(x)) } + func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label") if err != nil { @@ -175,8 +158,9 @@ func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { *x = FieldDescriptorProto_Label(value) return nil } + func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{3, 1} + return fileDescriptor_e5baabe45344a177, []int{4, 1} } // Generated classes can be optimized for speed or code size. @@ -194,6 +178,7 @@ var FileOptions_OptimizeMode_name = map[int32]string{ 2: "CODE_SIZE", 3: "LITE_RUNTIME", } + var FileOptions_OptimizeMode_value = map[string]int32{ "SPEED": 1, "CODE_SIZE": 2, @@ -205,9 +190,11 @@ func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode { *p = x return p } + func (x FileOptions_OptimizeMode) String() string { return proto.EnumName(FileOptions_OptimizeMode_name, int32(x)) } + func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode") if err != nil { @@ -216,7 +203,10 @@ func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { *x = FileOptions_OptimizeMode(value) return nil } -func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{9, 0} } + +func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{10, 0} +} type FieldOptions_CType int32 @@ -232,6 +222,7 @@ var FieldOptions_CType_name = map[int32]string{ 1: "CORD", 2: "STRING_PIECE", } + var FieldOptions_CType_value = map[string]int32{ "STRING": 0, "CORD": 1, @@ -243,9 +234,11 @@ func (x FieldOptions_CType) Enum() *FieldOptions_CType { *p = x return p } + func (x FieldOptions_CType) String() string { return proto.EnumName(FieldOptions_CType_name, int32(x)) } + func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType") if err != nil { @@ -254,7 +247,10 @@ func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { *x = FieldOptions_CType(value) return nil } -func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 0} } + +func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{12, 0} +} type FieldOptions_JSType int32 @@ -272,6 +268,7 @@ var FieldOptions_JSType_name = map[int32]string{ 1: "JS_STRING", 2: "JS_NUMBER", } + var FieldOptions_JSType_value = map[string]int32{ "JS_NORMAL": 0, "JS_STRING": 1, @@ -283,9 +280,11 @@ func (x FieldOptions_JSType) Enum() *FieldOptions_JSType { *p = x return p } + func (x FieldOptions_JSType) String() string { return proto.EnumName(FieldOptions_JSType_name, int32(x)) } + func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType") if err != nil { @@ -294,7 +293,10 @@ func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error { *x = FieldOptions_JSType(value) return nil } -func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 1} } + +func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{12, 1} +} // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, // or neither? HTTP based RPC implementation may choose GET verb for safe @@ -312,6 +314,7 @@ var MethodOptions_IdempotencyLevel_name = map[int32]string{ 1: "NO_SIDE_EFFECTS", 2: "IDEMPOTENT", } + var MethodOptions_IdempotencyLevel_value = map[string]int32{ "IDEMPOTENCY_UNKNOWN": 0, "NO_SIDE_EFFECTS": 1, @@ -323,9 +326,11 @@ func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel { *p = x return p } + func (x MethodOptions_IdempotencyLevel) String() string { return proto.EnumName(MethodOptions_IdempotencyLevel_name, int32(x)) } + func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel") if err != nil { @@ -334,21 +339,44 @@ func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error { *x = MethodOptions_IdempotencyLevel(value) return nil } + func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{16, 0} + return fileDescriptor_e5baabe45344a177, []int{17, 0} } // The protocol compiler can output a FileDescriptorSet containing the .proto // files it parses. type FileDescriptorSet struct { - File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` - XXX_unrecognized []byte `json:"-"` + File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } +func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorSet) ProtoMessage() {} +func (*FileDescriptorSet) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{0} +} + +func (m *FileDescriptorSet) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorSet.Unmarshal(m, b) +} +func (m *FileDescriptorSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorSet.Marshal(b, m, deterministic) +} +func (m *FileDescriptorSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorSet.Merge(m, src) +} +func (m *FileDescriptorSet) XXX_Size() int { + return xxx_messageInfo_FileDescriptorSet.Size(m) +} +func (m *FileDescriptorSet) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorSet.DiscardUnknown(m) } -func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } -func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } -func (*FileDescriptorSet) ProtoMessage() {} -func (*FileDescriptorSet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +var xxx_messageInfo_FileDescriptorSet proto.InternalMessageInfo func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto { if m != nil { @@ -381,14 +409,36 @@ type FileDescriptorProto struct { SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` // The syntax of the proto file. // The supported values are "proto2" and "proto3". - Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` - XXX_unrecognized []byte `json:"-"` + Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } +func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorProto) ProtoMessage() {} +func (*FileDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{1} +} + +func (m *FileDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorProto.Unmarshal(m, b) +} +func (m *FileDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorProto.Marshal(b, m, deterministic) +} +func (m *FileDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorProto.Merge(m, src) +} +func (m *FileDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FileDescriptorProto.Size(m) +} +func (m *FileDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorProto.DiscardUnknown(m) } -func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } -func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*FileDescriptorProto) ProtoMessage() {} -func (*FileDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +var xxx_messageInfo_FileDescriptorProto proto.InternalMessageInfo func (m *FileDescriptorProto) GetName() string { if m != nil && m.Name != nil { @@ -487,14 +537,36 @@ type DescriptorProto struct { ReservedRange []*DescriptorProto_ReservedRange `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` // Reserved field names, which may not be used by fields in the same message. // A given name may only be reserved once. - ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` - XXX_unrecognized []byte `json:"-"` + ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } +func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto) ProtoMessage() {} +func (*DescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{2} +} + +func (m *DescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto.Unmarshal(m, b) +} +func (m *DescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto.Marshal(b, m, deterministic) +} +func (m *DescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto.Merge(m, src) +} +func (m *DescriptorProto) XXX_Size() int { + return xxx_messageInfo_DescriptorProto.Size(m) +} +func (m *DescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto.DiscardUnknown(m) } -func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } -func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } -func (*DescriptorProto) ProtoMessage() {} -func (*DescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +var xxx_messageInfo_DescriptorProto proto.InternalMessageInfo func (m *DescriptorProto) GetName() string { if m != nil && m.Name != nil { @@ -567,17 +639,38 @@ func (m *DescriptorProto) GetReservedName() []string { } type DescriptorProto_ExtensionRange struct { - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` - XXX_unrecognized []byte `json:"-"` + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} } func (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) } func (*DescriptorProto_ExtensionRange) ProtoMessage() {} func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{2, 0} + return fileDescriptor_e5baabe45344a177, []int{2, 0} +} + +func (m *DescriptorProto_ExtensionRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Unmarshal(m, b) } +func (m *DescriptorProto_ExtensionRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Marshal(b, m, deterministic) +} +func (m *DescriptorProto_ExtensionRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ExtensionRange.Merge(m, src) +} +func (m *DescriptorProto_ExtensionRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Size(m) +} +func (m *DescriptorProto_ExtensionRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ExtensionRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ExtensionRange proto.InternalMessageInfo func (m *DescriptorProto_ExtensionRange) GetStart() int32 { if m != nil && m.Start != nil { @@ -593,21 +686,48 @@ func (m *DescriptorProto_ExtensionRange) GetEnd() int32 { return 0 } +func (m *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions { + if m != nil { + return m.Options + } + return nil +} + // Range of reserved tag numbers. Reserved tag numbers may not be used by // fields or extension ranges in the same message. Reserved ranges may // not overlap. type DescriptorProto_ReservedRange struct { - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` - XXX_unrecognized []byte `json:"-"` + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *DescriptorProto_ReservedRange) Reset() { *m = DescriptorProto_ReservedRange{} } func (m *DescriptorProto_ReservedRange) String() string { return proto.CompactTextString(m) } func (*DescriptorProto_ReservedRange) ProtoMessage() {} func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{2, 1} + return fileDescriptor_e5baabe45344a177, []int{2, 1} +} + +func (m *DescriptorProto_ReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ReservedRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ReservedRange.Marshal(b, m, deterministic) +} +func (m *DescriptorProto_ReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ReservedRange.Merge(m, src) } +func (m *DescriptorProto_ReservedRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ReservedRange.Size(m) +} +func (m *DescriptorProto_ReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ReservedRange proto.InternalMessageInfo func (m *DescriptorProto_ReservedRange) GetStart() int32 { if m != nil && m.Start != nil { @@ -623,6 +743,55 @@ func (m *DescriptorProto_ReservedRange) GetEnd() int32 { return 0 } +type ExtensionRangeOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExtensionRangeOptions) Reset() { *m = ExtensionRangeOptions{} } +func (m *ExtensionRangeOptions) String() string { return proto.CompactTextString(m) } +func (*ExtensionRangeOptions) ProtoMessage() {} +func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{3} +} + +var extRange_ExtensionRangeOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ExtensionRangeOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ExtensionRangeOptions +} + +func (m *ExtensionRangeOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExtensionRangeOptions.Unmarshal(m, b) +} +func (m *ExtensionRangeOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExtensionRangeOptions.Marshal(b, m, deterministic) +} +func (m *ExtensionRangeOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExtensionRangeOptions.Merge(m, src) +} +func (m *ExtensionRangeOptions) XXX_Size() int { + return xxx_messageInfo_ExtensionRangeOptions.Size(m) +} +func (m *ExtensionRangeOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ExtensionRangeOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ExtensionRangeOptions proto.InternalMessageInfo + +func (m *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + // Describes a field within a message. type FieldDescriptorProto struct { Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` @@ -653,15 +822,37 @@ type FieldDescriptorProto struct { // user has set a "json_name" option on this field, that option's value // will be used. Otherwise, it's deduced from the field's name by converting // it to camelCase. - JsonName *string `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"` - Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` - XXX_unrecognized []byte `json:"-"` + JsonName *string `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"` + Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } +func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FieldDescriptorProto) ProtoMessage() {} +func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{4} } -func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } -func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*FieldDescriptorProto) ProtoMessage() {} -func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } +func (m *FieldDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldDescriptorProto.Unmarshal(m, b) +} +func (m *FieldDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldDescriptorProto.Marshal(b, m, deterministic) +} +func (m *FieldDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldDescriptorProto.Merge(m, src) +} +func (m *FieldDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FieldDescriptorProto.Size(m) +} +func (m *FieldDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FieldDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldDescriptorProto proto.InternalMessageInfo func (m *FieldDescriptorProto) GetName() string { if m != nil && m.Name != nil { @@ -735,15 +926,37 @@ func (m *FieldDescriptorProto) GetOptions() *FieldOptions { // Describes a oneof. type OneofDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` - XXX_unrecognized []byte `json:"-"` + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } +func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*OneofDescriptorProto) ProtoMessage() {} +func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{5} +} + +func (m *OneofDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofDescriptorProto.Unmarshal(m, b) +} +func (m *OneofDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofDescriptorProto.Marshal(b, m, deterministic) +} +func (m *OneofDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofDescriptorProto.Merge(m, src) +} +func (m *OneofDescriptorProto) XXX_Size() int { + return xxx_messageInfo_OneofDescriptorProto.Size(m) +} +func (m *OneofDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_OneofDescriptorProto.DiscardUnknown(m) } -func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } -func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*OneofDescriptorProto) ProtoMessage() {} -func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } +var xxx_messageInfo_OneofDescriptorProto proto.InternalMessageInfo func (m *OneofDescriptorProto) GetName() string { if m != nil && m.Name != nil { @@ -761,16 +974,45 @@ func (m *OneofDescriptorProto) GetOptions() *OneofOptions { // Describes an enum type. type EnumDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` - Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` - XXX_unrecognized []byte `json:"-"` + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + // Range of reserved numeric values. Reserved numeric values may not be used + // by enum values in the same enum declaration. Reserved ranges may not + // overlap. + ReservedRange []*EnumDescriptorProto_EnumReservedRange `protobuf:"bytes,4,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved enum value names, which may not be reused. A given name may only + // be reserved once. + ReservedName []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } +func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto) ProtoMessage() {} +func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{6} +} + +func (m *EnumDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto.Unmarshal(m, b) +} +func (m *EnumDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto.Marshal(b, m, deterministic) +} +func (m *EnumDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto.Merge(m, src) +} +func (m *EnumDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto.Size(m) +} +func (m *EnumDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto.DiscardUnknown(m) } -func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } -func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*EnumDescriptorProto) ProtoMessage() {} -func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +var xxx_messageInfo_EnumDescriptorProto proto.InternalMessageInfo func (m *EnumDescriptorProto) GetName() string { if m != nil && m.Name != nil { @@ -793,18 +1035,107 @@ func (m *EnumDescriptorProto) GetOptions() *EnumOptions { return nil } +func (m *EnumDescriptorProto) GetReservedRange() []*EnumDescriptorProto_EnumReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *EnumDescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +// Range of reserved numeric values. Reserved values may not be used by +// entries in the same enum. Reserved ranges may not overlap. +// +// Note that this is distinct from DescriptorProto.ReservedRange in that it +// is inclusive such that it can appropriately represent the entire int32 +// domain. +type EnumDescriptorProto_EnumReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto_EnumReservedRange) Reset() { *m = EnumDescriptorProto_EnumReservedRange{} } +func (m *EnumDescriptorProto_EnumReservedRange) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} +func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{6, 0} +} + +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Unmarshal(m, b) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Marshal(b, m, deterministic) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Merge(m, src) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Size(m) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto_EnumReservedRange proto.InternalMessageInfo + +func (m *EnumDescriptorProto_EnumReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + // Describes a value within an enum. type EnumValueDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` - Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` - XXX_unrecognized []byte `json:"-"` + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` + Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } +func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumValueDescriptorProto) ProtoMessage() {} +func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{7} +} + +func (m *EnumValueDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueDescriptorProto.Unmarshal(m, b) +} +func (m *EnumValueDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueDescriptorProto.Marshal(b, m, deterministic) +} +func (m *EnumValueDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueDescriptorProto.Merge(m, src) +} +func (m *EnumValueDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumValueDescriptorProto.Size(m) +} +func (m *EnumValueDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueDescriptorProto.DiscardUnknown(m) } -func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } -func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*EnumValueDescriptorProto) ProtoMessage() {} -func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } +var xxx_messageInfo_EnumValueDescriptorProto proto.InternalMessageInfo func (m *EnumValueDescriptorProto) GetName() string { if m != nil && m.Name != nil { @@ -829,16 +1160,38 @@ func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { // Describes a service. type ServiceDescriptorProto struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` - Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` - XXX_unrecognized []byte `json:"-"` + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` + Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } +func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*ServiceDescriptorProto) ProtoMessage() {} +func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{8} +} + +func (m *ServiceDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceDescriptorProto.Unmarshal(m, b) +} +func (m *ServiceDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceDescriptorProto.Marshal(b, m, deterministic) +} +func (m *ServiceDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceDescriptorProto.Merge(m, src) +} +func (m *ServiceDescriptorProto) XXX_Size() int { + return xxx_messageInfo_ServiceDescriptorProto.Size(m) +} +func (m *ServiceDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceDescriptorProto.DiscardUnknown(m) } -func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } -func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*ServiceDescriptorProto) ProtoMessage() {} -func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +var xxx_messageInfo_ServiceDescriptorProto proto.InternalMessageInfo func (m *ServiceDescriptorProto) GetName() string { if m != nil && m.Name != nil { @@ -872,14 +1225,36 @@ type MethodDescriptorProto struct { // Identifies if client streams multiple client messages ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` // Identifies if server streams multiple server messages - ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` - XXX_unrecognized []byte `json:"-"` + ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } +func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*MethodDescriptorProto) ProtoMessage() {} +func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{9} +} + +func (m *MethodDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodDescriptorProto.Unmarshal(m, b) +} +func (m *MethodDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodDescriptorProto.Marshal(b, m, deterministic) +} +func (m *MethodDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodDescriptorProto.Merge(m, src) +} +func (m *MethodDescriptorProto) XXX_Size() int { + return xxx_messageInfo_MethodDescriptorProto.Size(m) +} +func (m *MethodDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_MethodDescriptorProto.DiscardUnknown(m) } -func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } -func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } -func (*MethodDescriptorProto) ProtoMessage() {} -func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +var xxx_messageInfo_MethodDescriptorProto proto.InternalMessageInfo const Default_MethodDescriptorProto_ClientStreaming bool = false const Default_MethodDescriptorProto_ServerStreaming bool = false @@ -946,7 +1321,7 @@ type FileOptions struct { // top-level extensions defined in the file. JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` // This option does nothing. - JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` + JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // Deprecated: Do not use. // If set true, then the Java2 code generator will generate code that // throws an exception whenever an attempt is made to assign a non-UTF-8 // byte sequence to a string field. @@ -974,6 +1349,7 @@ type FileOptions struct { CcGenericServices *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"` JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"` PyGenericServices *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"` + PhpGenericServices *bool `protobuf:"varint,42,opt,name=php_generic_services,json=phpGenericServices,def=0" json:"php_generic_services,omitempty"` // Is this file deprecated? // Depending on the target platform, this can emit Deprecated annotations // for everything in the file, or it will be completely ignored; in the very @@ -995,31 +1371,67 @@ type FileOptions struct { // Sets the php class prefix which is prepended to all php generated classes // from this .proto. Default is empty. PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"` - // The parser stores options it doesn't recognize here. See above. + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + PhpNamespace *string `protobuf:"bytes,41,opt,name=php_namespace,json=phpNamespace" json:"php_namespace,omitempty"` + // Use this option to change the namespace of php generated metadata classes. + // Default is empty. When this option is empty, the proto file name will be used + // for determining the namespace. + PhpMetadataNamespace *string `protobuf:"bytes,44,opt,name=php_metadata_namespace,json=phpMetadataNamespace" json:"php_metadata_namespace,omitempty"` + // Use this option to change the package of ruby generated classes. Default + // is empty. When this option is not set, the package name will be used for + // determining the ruby package. + RubyPackage *string `protobuf:"bytes,45,opt,name=ruby_package,json=rubyPackage" json:"ruby_package,omitempty"` + // The parser stores options it doesn't recognize here. + // See the documentation for the "Options" section above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` proto.XXX_InternalExtensions `json:"-"` XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *FileOptions) Reset() { *m = FileOptions{} } -func (m *FileOptions) String() string { return proto.CompactTextString(m) } -func (*FileOptions) ProtoMessage() {} -func (*FileOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } +func (m *FileOptions) Reset() { *m = FileOptions{} } +func (m *FileOptions) String() string { return proto.CompactTextString(m) } +func (*FileOptions) ProtoMessage() {} +func (*FileOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{10} +} var extRange_FileOptions = []proto.ExtensionRange{ - {1000, 536870911}, + {Start: 1000, End: 536870911}, } func (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange { return extRange_FileOptions } +func (m *FileOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileOptions.Unmarshal(m, b) +} +func (m *FileOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileOptions.Marshal(b, m, deterministic) +} +func (m *FileOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileOptions.Merge(m, src) +} +func (m *FileOptions) XXX_Size() int { + return xxx_messageInfo_FileOptions.Size(m) +} +func (m *FileOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FileOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FileOptions proto.InternalMessageInfo + const Default_FileOptions_JavaMultipleFiles bool = false const Default_FileOptions_JavaStringCheckUtf8 bool = false const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED const Default_FileOptions_CcGenericServices bool = false const Default_FileOptions_JavaGenericServices bool = false const Default_FileOptions_PyGenericServices bool = false +const Default_FileOptions_PhpGenericServices bool = false const Default_FileOptions_Deprecated bool = false const Default_FileOptions_CcEnableArenas bool = false @@ -1044,6 +1456,7 @@ func (m *FileOptions) GetJavaMultipleFiles() bool { return Default_FileOptions_JavaMultipleFiles } +// Deprecated: Do not use. func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool { if m != nil && m.JavaGenerateEqualsAndHash != nil { return *m.JavaGenerateEqualsAndHash @@ -1093,6 +1506,13 @@ func (m *FileOptions) GetPyGenericServices() bool { return Default_FileOptions_PyGenericServices } +func (m *FileOptions) GetPhpGenericServices() bool { + if m != nil && m.PhpGenericServices != nil { + return *m.PhpGenericServices + } + return Default_FileOptions_PhpGenericServices +} + func (m *FileOptions) GetDeprecated() bool { if m != nil && m.Deprecated != nil { return *m.Deprecated @@ -1135,6 +1555,27 @@ func (m *FileOptions) GetPhpClassPrefix() string { return "" } +func (m *FileOptions) GetPhpNamespace() string { + if m != nil && m.PhpNamespace != nil { + return *m.PhpNamespace + } + return "" +} + +func (m *FileOptions) GetPhpMetadataNamespace() string { + if m != nil && m.PhpMetadataNamespace != nil { + return *m.PhpMetadataNamespace + } + return "" +} + +func (m *FileOptions) GetRubyPackage() string { + if m != nil && m.RubyPackage != nil { + return *m.RubyPackage + } + return "" +} + func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption { if m != nil { return m.UninterpretedOption @@ -1195,23 +1636,45 @@ type MessageOptions struct { MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` proto.XXX_InternalExtensions `json:"-"` XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *MessageOptions) Reset() { *m = MessageOptions{} } -func (m *MessageOptions) String() string { return proto.CompactTextString(m) } -func (*MessageOptions) ProtoMessage() {} -func (*MessageOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } +func (m *MessageOptions) Reset() { *m = MessageOptions{} } +func (m *MessageOptions) String() string { return proto.CompactTextString(m) } +func (*MessageOptions) ProtoMessage() {} +func (*MessageOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{11} +} var extRange_MessageOptions = []proto.ExtensionRange{ - {1000, 536870911}, + {Start: 1000, End: 536870911}, } func (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange { return extRange_MessageOptions } +func (m *MessageOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageOptions.Unmarshal(m, b) +} +func (m *MessageOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageOptions.Marshal(b, m, deterministic) +} +func (m *MessageOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageOptions.Merge(m, src) +} +func (m *MessageOptions) XXX_Size() int { + return xxx_messageInfo_MessageOptions.Size(m) +} +func (m *MessageOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MessageOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageOptions proto.InternalMessageInfo + const Default_MessageOptions_MessageSetWireFormat bool = false const Default_MessageOptions_NoStandardDescriptorAccessor bool = false const Default_MessageOptions_Deprecated bool = false @@ -1265,13 +1728,15 @@ type FieldOptions struct { Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` // The jstype option determines the JavaScript type used for values of the // field. The option is permitted only for 64 bit integral and fixed types - // (int64, uint64, sint64, fixed64, sfixed64). By default these types are - // represented as JavaScript strings. This avoids loss of precision that can - // happen when a large value is converted to a floating point JavaScript - // numbers. Specifying JS_NUMBER for the jstype causes the generated - // JavaScript code to use the JavaScript "number" type instead of strings. - // This option is an enum to permit additional types to be added, - // e.g. goog.math.Integer. + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"` // Should this field be parsed lazily? Lazy applies only to message-type // fields. It means that when the outer message is initially parsed, the @@ -1311,23 +1776,45 @@ type FieldOptions struct { Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` proto.XXX_InternalExtensions `json:"-"` XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *FieldOptions) Reset() { *m = FieldOptions{} } -func (m *FieldOptions) String() string { return proto.CompactTextString(m) } -func (*FieldOptions) ProtoMessage() {} -func (*FieldOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } +func (m *FieldOptions) Reset() { *m = FieldOptions{} } +func (m *FieldOptions) String() string { return proto.CompactTextString(m) } +func (*FieldOptions) ProtoMessage() {} +func (*FieldOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{12} +} var extRange_FieldOptions = []proto.ExtensionRange{ - {1000, 536870911}, + {Start: 1000, End: 536870911}, } func (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange { return extRange_FieldOptions } +func (m *FieldOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldOptions.Unmarshal(m, b) +} +func (m *FieldOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldOptions.Marshal(b, m, deterministic) +} +func (m *FieldOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldOptions.Merge(m, src) +} +func (m *FieldOptions) XXX_Size() int { + return xxx_messageInfo_FieldOptions.Size(m) +} +func (m *FieldOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FieldOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldOptions proto.InternalMessageInfo + const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL const Default_FieldOptions_Lazy bool = false @@ -1386,23 +1873,45 @@ func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { type OneofOptions struct { // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` proto.XXX_InternalExtensions `json:"-"` XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *OneofOptions) Reset() { *m = OneofOptions{} } -func (m *OneofOptions) String() string { return proto.CompactTextString(m) } -func (*OneofOptions) ProtoMessage() {} -func (*OneofOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } +func (m *OneofOptions) Reset() { *m = OneofOptions{} } +func (m *OneofOptions) String() string { return proto.CompactTextString(m) } +func (*OneofOptions) ProtoMessage() {} +func (*OneofOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{13} +} var extRange_OneofOptions = []proto.ExtensionRange{ - {1000, 536870911}, + {Start: 1000, End: 536870911}, } func (*OneofOptions) ExtensionRangeArray() []proto.ExtensionRange { return extRange_OneofOptions } +func (m *OneofOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofOptions.Unmarshal(m, b) +} +func (m *OneofOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofOptions.Marshal(b, m, deterministic) +} +func (m *OneofOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofOptions.Merge(m, src) +} +func (m *OneofOptions) XXX_Size() int { + return xxx_messageInfo_OneofOptions.Size(m) +} +func (m *OneofOptions) XXX_DiscardUnknown() { + xxx_messageInfo_OneofOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofOptions proto.InternalMessageInfo + func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { if m != nil { return m.UninterpretedOption @@ -1421,23 +1930,45 @@ type EnumOptions struct { Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` proto.XXX_InternalExtensions `json:"-"` XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *EnumOptions) Reset() { *m = EnumOptions{} } -func (m *EnumOptions) String() string { return proto.CompactTextString(m) } -func (*EnumOptions) ProtoMessage() {} -func (*EnumOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } +func (m *EnumOptions) Reset() { *m = EnumOptions{} } +func (m *EnumOptions) String() string { return proto.CompactTextString(m) } +func (*EnumOptions) ProtoMessage() {} +func (*EnumOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{14} +} var extRange_EnumOptions = []proto.ExtensionRange{ - {1000, 536870911}, + {Start: 1000, End: 536870911}, } func (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange { return extRange_EnumOptions } +func (m *EnumOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumOptions.Unmarshal(m, b) +} +func (m *EnumOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumOptions.Marshal(b, m, deterministic) +} +func (m *EnumOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumOptions.Merge(m, src) +} +func (m *EnumOptions) XXX_Size() int { + return xxx_messageInfo_EnumOptions.Size(m) +} +func (m *EnumOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumOptions proto.InternalMessageInfo + const Default_EnumOptions_Deprecated bool = false func (m *EnumOptions) GetAllowAlias() bool { @@ -1469,23 +2000,45 @@ type EnumValueOptions struct { Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` proto.XXX_InternalExtensions `json:"-"` XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } -func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } -func (*EnumValueOptions) ProtoMessage() {} -func (*EnumValueOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } +func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } +func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } +func (*EnumValueOptions) ProtoMessage() {} +func (*EnumValueOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{15} +} var extRange_EnumValueOptions = []proto.ExtensionRange{ - {1000, 536870911}, + {Start: 1000, End: 536870911}, } func (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange { return extRange_EnumValueOptions } +func (m *EnumValueOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueOptions.Unmarshal(m, b) +} +func (m *EnumValueOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueOptions.Marshal(b, m, deterministic) +} +func (m *EnumValueOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueOptions.Merge(m, src) +} +func (m *EnumValueOptions) XXX_Size() int { + return xxx_messageInfo_EnumValueOptions.Size(m) +} +func (m *EnumValueOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueOptions proto.InternalMessageInfo + const Default_EnumValueOptions_Deprecated bool = false func (m *EnumValueOptions) GetDeprecated() bool { @@ -1510,23 +2063,45 @@ type ServiceOptions struct { Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` proto.XXX_InternalExtensions `json:"-"` XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } -func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } -func (*ServiceOptions) ProtoMessage() {} -func (*ServiceOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } +func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } +func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } +func (*ServiceOptions) ProtoMessage() {} +func (*ServiceOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{16} +} var extRange_ServiceOptions = []proto.ExtensionRange{ - {1000, 536870911}, + {Start: 1000, End: 536870911}, } func (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange { return extRange_ServiceOptions } +func (m *ServiceOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceOptions.Unmarshal(m, b) +} +func (m *ServiceOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceOptions.Marshal(b, m, deterministic) +} +func (m *ServiceOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceOptions.Merge(m, src) +} +func (m *ServiceOptions) XXX_Size() int { + return xxx_messageInfo_ServiceOptions.Size(m) +} +func (m *ServiceOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceOptions proto.InternalMessageInfo + const Default_ServiceOptions_Deprecated bool = false func (m *ServiceOptions) GetDeprecated() bool { @@ -1552,23 +2127,45 @@ type MethodOptions struct { IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` proto.XXX_InternalExtensions `json:"-"` XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *MethodOptions) Reset() { *m = MethodOptions{} } -func (m *MethodOptions) String() string { return proto.CompactTextString(m) } -func (*MethodOptions) ProtoMessage() {} -func (*MethodOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } +func (m *MethodOptions) Reset() { *m = MethodOptions{} } +func (m *MethodOptions) String() string { return proto.CompactTextString(m) } +func (*MethodOptions) ProtoMessage() {} +func (*MethodOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{17} +} var extRange_MethodOptions = []proto.ExtensionRange{ - {1000, 536870911}, + {Start: 1000, End: 536870911}, } func (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange { return extRange_MethodOptions } +func (m *MethodOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodOptions.Unmarshal(m, b) +} +func (m *MethodOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodOptions.Marshal(b, m, deterministic) +} +func (m *MethodOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodOptions.Merge(m, src) +} +func (m *MethodOptions) XXX_Size() int { + return xxx_messageInfo_MethodOptions.Size(m) +} +func (m *MethodOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MethodOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodOptions proto.InternalMessageInfo + const Default_MethodOptions_Deprecated bool = false const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN @@ -1603,19 +2200,41 @@ type UninterpretedOption struct { Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` // The value of the uninterpreted option, in whatever type the tokenizer // identified it as during parsing. Exactly one of these should be set. - IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` - PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` - NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` - DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` - StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` - AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` - XXX_unrecognized []byte `json:"-"` + IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` + PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` + NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` + StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` + AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } +func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption) ProtoMessage() {} +func (*UninterpretedOption) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{18} +} + +func (m *UninterpretedOption) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption.Unmarshal(m, b) +} +func (m *UninterpretedOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption.Marshal(b, m, deterministic) +} +func (m *UninterpretedOption) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption.Merge(m, src) +} +func (m *UninterpretedOption) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption.Size(m) +} +func (m *UninterpretedOption) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption.DiscardUnknown(m) } -func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } -func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } -func (*UninterpretedOption) ProtoMessage() {} -func (*UninterpretedOption) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } +var xxx_messageInfo_UninterpretedOption proto.InternalMessageInfo func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { if m != nil { @@ -1672,18 +2291,38 @@ func (m *UninterpretedOption) GetAggregateValue() string { // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents // "foo.(bar.baz).qux". type UninterpretedOption_NamePart struct { - NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` - IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` - XXX_unrecognized []byte `json:"-"` + NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` + IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} } func (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) } func (*UninterpretedOption_NamePart) ProtoMessage() {} func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{17, 0} + return fileDescriptor_e5baabe45344a177, []int{18, 0} } +func (m *UninterpretedOption_NamePart) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption_NamePart.Unmarshal(m, b) +} +func (m *UninterpretedOption_NamePart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption_NamePart.Marshal(b, m, deterministic) +} +func (m *UninterpretedOption_NamePart) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption_NamePart.Merge(m, src) +} +func (m *UninterpretedOption_NamePart) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption_NamePart.Size(m) +} +func (m *UninterpretedOption_NamePart) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption_NamePart.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption_NamePart proto.InternalMessageInfo + func (m *UninterpretedOption_NamePart) GetNamePart() string { if m != nil && m.NamePart != nil { return *m.NamePart @@ -1744,14 +2383,36 @@ type SourceCodeInfo struct { // - Code which tries to interpret locations should probably be designed to // ignore those that it doesn't understand, as more types of locations could // be recorded in the future. - Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` - XXX_unrecognized []byte `json:"-"` + Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } +func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo) ProtoMessage() {} +func (*SourceCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{19} +} + +func (m *SourceCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo.Unmarshal(m, b) +} +func (m *SourceCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo.Marshal(b, m, deterministic) +} +func (m *SourceCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo.Merge(m, src) +} +func (m *SourceCodeInfo) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo.Size(m) +} +func (m *SourceCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo.DiscardUnknown(m) } -func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } -func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } -func (*SourceCodeInfo) ProtoMessage() {} -func (*SourceCodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } +var xxx_messageInfo_SourceCodeInfo proto.InternalMessageInfo func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { if m != nil { @@ -1841,13 +2502,35 @@ type SourceCodeInfo_Location struct { LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } +func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo_Location) ProtoMessage() {} +func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{19, 0} +} + +func (m *SourceCodeInfo_Location) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo_Location.Unmarshal(m, b) +} +func (m *SourceCodeInfo_Location) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo_Location.Marshal(b, m, deterministic) +} +func (m *SourceCodeInfo_Location) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo_Location.Merge(m, src) +} +func (m *SourceCodeInfo_Location) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo_Location.Size(m) +} +func (m *SourceCodeInfo_Location) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo_Location.DiscardUnknown(m) } -func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } -func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } -func (*SourceCodeInfo_Location) ProtoMessage() {} -func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18, 0} } +var xxx_messageInfo_SourceCodeInfo_Location proto.InternalMessageInfo func (m *SourceCodeInfo_Location) GetPath() []int32 { if m != nil { @@ -1890,14 +2573,36 @@ func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { type GeneratedCodeInfo struct { // An Annotation connects some span of text in generated code to an element // of its generating .proto file. - Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` - XXX_unrecognized []byte `json:"-"` + Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} } +func (m *GeneratedCodeInfo) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo) ProtoMessage() {} +func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{20} +} + +func (m *GeneratedCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo.Marshal(b, m, deterministic) +} +func (m *GeneratedCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo.Merge(m, src) +} +func (m *GeneratedCodeInfo) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo.Size(m) +} +func (m *GeneratedCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo.DiscardUnknown(m) } -func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} } -func (m *GeneratedCodeInfo) String() string { return proto.CompactTextString(m) } -func (*GeneratedCodeInfo) ProtoMessage() {} -func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } +var xxx_messageInfo_GeneratedCodeInfo proto.InternalMessageInfo func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { if m != nil { @@ -1918,16 +2623,36 @@ type GeneratedCodeInfo_Annotation struct { // Identifies the ending offset in bytes in the generated code that // relates to the identified offset. The end offset should be one past // the last relevant byte (so the length of the text = end - begin). - End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` - XXX_unrecognized []byte `json:"-"` + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *GeneratedCodeInfo_Annotation) Reset() { *m = GeneratedCodeInfo_Annotation{} } func (m *GeneratedCodeInfo_Annotation) String() string { return proto.CompactTextString(m) } func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{19, 0} + return fileDescriptor_e5baabe45344a177, []int{20, 0} +} + +func (m *GeneratedCodeInfo_Annotation) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Marshal(b, m, deterministic) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo_Annotation.Merge(m, src) } +func (m *GeneratedCodeInfo_Annotation) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Size(m) +} +func (m *GeneratedCodeInfo_Annotation) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo_Annotation.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneratedCodeInfo_Annotation proto.InternalMessageInfo func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 { if m != nil { @@ -1958,14 +2683,22 @@ func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 { } func init() { + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) + proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) + proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) + proto.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value) + proto.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value) proto.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet") proto.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto") proto.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto") proto.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange") proto.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange") + proto.RegisterType((*ExtensionRangeOptions)(nil), "google.protobuf.ExtensionRangeOptions") proto.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto") proto.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto") proto.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto") + proto.RegisterType((*EnumDescriptorProto_EnumReservedRange)(nil), "google.protobuf.EnumDescriptorProto.EnumReservedRange") proto.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto") proto.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto") proto.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto") @@ -1983,170 +2716,172 @@ func init() { proto.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location") proto.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo") proto.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation") - proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) - proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) - proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) - proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) - proto.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value) - proto.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value) } -func init() { proto.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 2460 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0x5b, 0x6f, 0xdb, 0xc8, - 0x15, 0x5e, 0x5d, 0x2d, 0x1d, 0xc9, 0xf2, 0x78, 0xec, 0x4d, 0x18, 0xef, 0x25, 0x8e, 0xf6, 0x12, - 0x6f, 0xd2, 0xc8, 0x0b, 0xe7, 0xb2, 0x59, 0xa7, 0x48, 0x21, 0x4b, 0x8c, 0x57, 0xa9, 0x2c, 0xa9, - 0x94, 0xdc, 0x4d, 0xf6, 0x85, 0x18, 0x93, 0x23, 0x99, 0x09, 0x45, 0x72, 0x49, 0x2a, 0x89, 0xf7, - 0x29, 0x40, 0x9f, 0x0a, 0xf4, 0x07, 0x14, 0x45, 0xd1, 0x87, 0x7d, 0x59, 0xa0, 0x3f, 0xa0, 0xcf, - 0xfd, 0x05, 0x05, 0xf6, 0xb9, 0x2f, 0x45, 0x51, 0xa0, 0xfd, 0x07, 0x7d, 0x2d, 0x66, 0x86, 0xa4, - 0x48, 0x5d, 0x12, 0x77, 0x81, 0xec, 0x3e, 0xd9, 0x73, 0xce, 0x77, 0x0e, 0xcf, 0x9c, 0xf9, 0x66, - 0xce, 0x99, 0x11, 0x6c, 0x8f, 0x6c, 0x7b, 0x64, 0xd2, 0x5d, 0xc7, 0xb5, 0x7d, 0xfb, 0x64, 0x32, - 0xdc, 0xd5, 0xa9, 0xa7, 0xb9, 0x86, 0xe3, 0xdb, 0x6e, 0x8d, 0xcb, 0xf0, 0x9a, 0x40, 0xd4, 0x42, - 0x44, 0xf5, 0x08, 0xd6, 0x1f, 0x18, 0x26, 0x6d, 0x46, 0xc0, 0x3e, 0xf5, 0xf1, 0x5d, 0xc8, 0x0e, - 0x0d, 0x93, 0x4a, 0xa9, 0xed, 0xcc, 0x4e, 0x69, 0xef, 0xc3, 0xda, 0x8c, 0x51, 0x2d, 0x69, 0xd1, - 0x63, 0x62, 0x85, 0x5b, 0x54, 0xff, 0x95, 0x85, 0x8d, 0x05, 0x5a, 0x8c, 0x21, 0x6b, 0x91, 0x31, - 0xf3, 0x98, 0xda, 0x29, 0x2a, 0xfc, 0x7f, 0x2c, 0xc1, 0x8a, 0x43, 0xb4, 0xa7, 0x64, 0x44, 0xa5, - 0x34, 0x17, 0x87, 0x43, 0xfc, 0x3e, 0x80, 0x4e, 0x1d, 0x6a, 0xe9, 0xd4, 0xd2, 0xce, 0xa4, 0xcc, - 0x76, 0x66, 0xa7, 0xa8, 0xc4, 0x24, 0xf8, 0x3a, 0xac, 0x3b, 0x93, 0x13, 0xd3, 0xd0, 0xd4, 0x18, - 0x0c, 0xb6, 0x33, 0x3b, 0x39, 0x05, 0x09, 0x45, 0x73, 0x0a, 0xbe, 0x0a, 0x6b, 0xcf, 0x29, 0x79, - 0x1a, 0x87, 0x96, 0x38, 0xb4, 0xc2, 0xc4, 0x31, 0x60, 0x03, 0xca, 0x63, 0xea, 0x79, 0x64, 0x44, - 0x55, 0xff, 0xcc, 0xa1, 0x52, 0x96, 0xcf, 0x7e, 0x7b, 0x6e, 0xf6, 0xb3, 0x33, 0x2f, 0x05, 0x56, - 0x83, 0x33, 0x87, 0xe2, 0x3a, 0x14, 0xa9, 0x35, 0x19, 0x0b, 0x0f, 0xb9, 0x25, 0xf9, 0x93, 0xad, - 0xc9, 0x78, 0xd6, 0x4b, 0x81, 0x99, 0x05, 0x2e, 0x56, 0x3c, 0xea, 0x3e, 0x33, 0x34, 0x2a, 0xe5, - 0xb9, 0x83, 0xab, 0x73, 0x0e, 0xfa, 0x42, 0x3f, 0xeb, 0x23, 0xb4, 0xc3, 0x0d, 0x28, 0xd2, 0x17, - 0x3e, 0xb5, 0x3c, 0xc3, 0xb6, 0xa4, 0x15, 0xee, 0xe4, 0xa3, 0x05, 0xab, 0x48, 0x4d, 0x7d, 0xd6, - 0xc5, 0xd4, 0x0e, 0xdf, 0x81, 0x15, 0xdb, 0xf1, 0x0d, 0xdb, 0xf2, 0xa4, 0xc2, 0x76, 0x6a, 0xa7, - 0xb4, 0xf7, 0xee, 0x42, 0x22, 0x74, 0x05, 0x46, 0x09, 0xc1, 0xb8, 0x05, 0xc8, 0xb3, 0x27, 0xae, - 0x46, 0x55, 0xcd, 0xd6, 0xa9, 0x6a, 0x58, 0x43, 0x5b, 0x2a, 0x72, 0x07, 0x97, 0xe7, 0x27, 0xc2, - 0x81, 0x0d, 0x5b, 0xa7, 0x2d, 0x6b, 0x68, 0x2b, 0x15, 0x2f, 0x31, 0xc6, 0x17, 0x20, 0xef, 0x9d, - 0x59, 0x3e, 0x79, 0x21, 0x95, 0x39, 0x43, 0x82, 0x51, 0xf5, 0xbf, 0x39, 0x58, 0x3b, 0x0f, 0xc5, - 0xee, 0x41, 0x6e, 0xc8, 0x66, 0x29, 0xa5, 0xff, 0x9f, 0x1c, 0x08, 0x9b, 0x64, 0x12, 0xf3, 0x3f, - 0x30, 0x89, 0x75, 0x28, 0x59, 0xd4, 0xf3, 0xa9, 0x2e, 0x18, 0x91, 0x39, 0x27, 0xa7, 0x40, 0x18, - 0xcd, 0x53, 0x2a, 0xfb, 0x83, 0x28, 0xf5, 0x08, 0xd6, 0xa2, 0x90, 0x54, 0x97, 0x58, 0xa3, 0x90, - 0x9b, 0xbb, 0xaf, 0x8b, 0xa4, 0x26, 0x87, 0x76, 0x0a, 0x33, 0x53, 0x2a, 0x34, 0x31, 0xc6, 0x4d, - 0x00, 0xdb, 0xa2, 0xf6, 0x50, 0xd5, 0xa9, 0x66, 0x4a, 0x85, 0x25, 0x59, 0xea, 0x32, 0xc8, 0x5c, - 0x96, 0x6c, 0x21, 0xd5, 0x4c, 0xfc, 0xf9, 0x94, 0x6a, 0x2b, 0x4b, 0x98, 0x72, 0x24, 0x36, 0xd9, - 0x1c, 0xdb, 0x8e, 0xa1, 0xe2, 0x52, 0xc6, 0x7b, 0xaa, 0x07, 0x33, 0x2b, 0xf2, 0x20, 0x6a, 0xaf, - 0x9d, 0x99, 0x12, 0x98, 0x89, 0x89, 0xad, 0xba, 0xf1, 0x21, 0xfe, 0x00, 0x22, 0x81, 0xca, 0x69, - 0x05, 0xfc, 0x14, 0x2a, 0x87, 0xc2, 0x0e, 0x19, 0xd3, 0xad, 0xbb, 0x50, 0x49, 0xa6, 0x07, 0x6f, - 0x42, 0xce, 0xf3, 0x89, 0xeb, 0x73, 0x16, 0xe6, 0x14, 0x31, 0xc0, 0x08, 0x32, 0xd4, 0xd2, 0xf9, - 0x29, 0x97, 0x53, 0xd8, 0xbf, 0x5b, 0x9f, 0xc1, 0x6a, 0xe2, 0xf3, 0xe7, 0x35, 0xac, 0xfe, 0x3e, - 0x0f, 0x9b, 0x8b, 0x38, 0xb7, 0x90, 0xfe, 0x17, 0x20, 0x6f, 0x4d, 0xc6, 0x27, 0xd4, 0x95, 0x32, - 0xdc, 0x43, 0x30, 0xc2, 0x75, 0xc8, 0x99, 0xe4, 0x84, 0x9a, 0x52, 0x76, 0x3b, 0xb5, 0x53, 0xd9, - 0xbb, 0x7e, 0x2e, 0x56, 0xd7, 0xda, 0xcc, 0x44, 0x11, 0x96, 0xf8, 0x3e, 0x64, 0x83, 0x23, 0x8e, - 0x79, 0xb8, 0x76, 0x3e, 0x0f, 0x8c, 0x8b, 0x0a, 0xb7, 0xc3, 0xef, 0x40, 0x91, 0xfd, 0x15, 0xb9, - 0xcd, 0xf3, 0x98, 0x0b, 0x4c, 0xc0, 0xf2, 0x8a, 0xb7, 0xa0, 0xc0, 0x69, 0xa6, 0xd3, 0xb0, 0x34, - 0x44, 0x63, 0xb6, 0x30, 0x3a, 0x1d, 0x92, 0x89, 0xe9, 0xab, 0xcf, 0x88, 0x39, 0xa1, 0x9c, 0x30, - 0x45, 0xa5, 0x1c, 0x08, 0x7f, 0xcd, 0x64, 0xf8, 0x32, 0x94, 0x04, 0x2b, 0x0d, 0x4b, 0xa7, 0x2f, - 0xf8, 0xe9, 0x93, 0x53, 0x04, 0x51, 0x5b, 0x4c, 0xc2, 0x3e, 0xff, 0xc4, 0xb3, 0xad, 0x70, 0x69, - 0xf9, 0x27, 0x98, 0x80, 0x7f, 0xfe, 0xb3, 0xd9, 0x83, 0xef, 0xbd, 0xc5, 0xd3, 0x9b, 0xe5, 0x62, - 0xf5, 0x2f, 0x69, 0xc8, 0xf2, 0xfd, 0xb6, 0x06, 0xa5, 0xc1, 0xe3, 0x9e, 0xac, 0x36, 0xbb, 0xc7, - 0x07, 0x6d, 0x19, 0xa5, 0x70, 0x05, 0x80, 0x0b, 0x1e, 0xb4, 0xbb, 0xf5, 0x01, 0x4a, 0x47, 0xe3, - 0x56, 0x67, 0x70, 0xe7, 0x16, 0xca, 0x44, 0x06, 0xc7, 0x42, 0x90, 0x8d, 0x03, 0x6e, 0xee, 0xa1, - 0x1c, 0x46, 0x50, 0x16, 0x0e, 0x5a, 0x8f, 0xe4, 0xe6, 0x9d, 0x5b, 0x28, 0x9f, 0x94, 0xdc, 0xdc, - 0x43, 0x2b, 0x78, 0x15, 0x8a, 0x5c, 0x72, 0xd0, 0xed, 0xb6, 0x51, 0x21, 0xf2, 0xd9, 0x1f, 0x28, - 0xad, 0xce, 0x21, 0x2a, 0x46, 0x3e, 0x0f, 0x95, 0xee, 0x71, 0x0f, 0x41, 0xe4, 0xe1, 0x48, 0xee, - 0xf7, 0xeb, 0x87, 0x32, 0x2a, 0x45, 0x88, 0x83, 0xc7, 0x03, 0xb9, 0x8f, 0xca, 0x89, 0xb0, 0x6e, - 0xee, 0xa1, 0xd5, 0xe8, 0x13, 0x72, 0xe7, 0xf8, 0x08, 0x55, 0xf0, 0x3a, 0xac, 0x8a, 0x4f, 0x84, - 0x41, 0xac, 0xcd, 0x88, 0xee, 0xdc, 0x42, 0x68, 0x1a, 0x88, 0xf0, 0xb2, 0x9e, 0x10, 0xdc, 0xb9, - 0x85, 0x70, 0xb5, 0x01, 0x39, 0xce, 0x2e, 0x8c, 0xa1, 0xd2, 0xae, 0x1f, 0xc8, 0x6d, 0xb5, 0xdb, - 0x1b, 0xb4, 0xba, 0x9d, 0x7a, 0x1b, 0xa5, 0xa6, 0x32, 0x45, 0xfe, 0xd5, 0x71, 0x4b, 0x91, 0x9b, - 0x28, 0x1d, 0x97, 0xf5, 0xe4, 0xfa, 0x40, 0x6e, 0xa2, 0x4c, 0x55, 0x83, 0xcd, 0x45, 0xe7, 0xcc, - 0xc2, 0x9d, 0x11, 0x5b, 0xe2, 0xf4, 0x92, 0x25, 0xe6, 0xbe, 0xe6, 0x96, 0xf8, 0xdb, 0x14, 0x6c, - 0x2c, 0x38, 0x6b, 0x17, 0x7e, 0xe4, 0x17, 0x90, 0x13, 0x14, 0x15, 0xd5, 0xe7, 0x93, 0x85, 0x87, - 0x36, 0x27, 0xec, 0x5c, 0x05, 0xe2, 0x76, 0xf1, 0x0a, 0x9c, 0x59, 0x52, 0x81, 0x99, 0x8b, 0xb9, - 0x20, 0x7f, 0x93, 0x02, 0x69, 0x99, 0xef, 0xd7, 0x1c, 0x14, 0xe9, 0xc4, 0x41, 0x71, 0x6f, 0x36, - 0x80, 0x2b, 0xcb, 0xe7, 0x30, 0x17, 0xc5, 0x77, 0x29, 0xb8, 0xb0, 0xb8, 0x51, 0x59, 0x18, 0xc3, - 0x7d, 0xc8, 0x8f, 0xa9, 0x7f, 0x6a, 0x87, 0xc5, 0xfa, 0xe3, 0x05, 0x25, 0x80, 0xa9, 0x67, 0x73, - 0x15, 0x58, 0xc5, 0x6b, 0x48, 0x66, 0x59, 0xb7, 0x21, 0xa2, 0x99, 0x8b, 0xf4, 0xb7, 0x69, 0x78, - 0x7b, 0xa1, 0xf3, 0x85, 0x81, 0xbe, 0x07, 0x60, 0x58, 0xce, 0xc4, 0x17, 0x05, 0x59, 0x9c, 0x4f, - 0x45, 0x2e, 0xe1, 0x7b, 0x9f, 0x9d, 0x3d, 0x13, 0x3f, 0xd2, 0x67, 0xb8, 0x1e, 0x84, 0x88, 0x03, - 0xee, 0x4e, 0x03, 0xcd, 0xf2, 0x40, 0xdf, 0x5f, 0x32, 0xd3, 0xb9, 0x5a, 0xf7, 0x29, 0x20, 0xcd, - 0x34, 0xa8, 0xe5, 0xab, 0x9e, 0xef, 0x52, 0x32, 0x36, 0xac, 0x11, 0x3f, 0x80, 0x0b, 0xfb, 0xb9, - 0x21, 0x31, 0x3d, 0xaa, 0xac, 0x09, 0x75, 0x3f, 0xd4, 0x32, 0x0b, 0x5e, 0x65, 0xdc, 0x98, 0x45, - 0x3e, 0x61, 0x21, 0xd4, 0x91, 0x45, 0xf5, 0xef, 0x2b, 0x50, 0x8a, 0xb5, 0x75, 0xf8, 0x0a, 0x94, - 0x9f, 0x90, 0x67, 0x44, 0x0d, 0x5b, 0x75, 0x91, 0x89, 0x12, 0x93, 0xf5, 0x82, 0x76, 0xfd, 0x53, - 0xd8, 0xe4, 0x10, 0x7b, 0xe2, 0x53, 0x57, 0xd5, 0x4c, 0xe2, 0x79, 0x3c, 0x69, 0x05, 0x0e, 0xc5, - 0x4c, 0xd7, 0x65, 0xaa, 0x46, 0xa8, 0xc1, 0xb7, 0x61, 0x83, 0x5b, 0x8c, 0x27, 0xa6, 0x6f, 0x38, - 0x26, 0x55, 0xd9, 0xe5, 0xc1, 0xe3, 0x07, 0x71, 0x14, 0xd9, 0x3a, 0x43, 0x1c, 0x05, 0x00, 0x16, - 0x91, 0x87, 0x9b, 0xf0, 0x1e, 0x37, 0x1b, 0x51, 0x8b, 0xba, 0xc4, 0xa7, 0x2a, 0xfd, 0x7a, 0x42, - 0x4c, 0x4f, 0x25, 0x96, 0xae, 0x9e, 0x12, 0xef, 0x54, 0xda, 0x64, 0x0e, 0x0e, 0xd2, 0x52, 0x4a, - 0xb9, 0xc4, 0x80, 0x87, 0x01, 0x4e, 0xe6, 0xb0, 0xba, 0xa5, 0x7f, 0x41, 0xbc, 0x53, 0xbc, 0x0f, - 0x17, 0xb8, 0x17, 0xcf, 0x77, 0x0d, 0x6b, 0xa4, 0x6a, 0xa7, 0x54, 0x7b, 0xaa, 0x4e, 0xfc, 0xe1, - 0x5d, 0xe9, 0x9d, 0xf8, 0xf7, 0x79, 0x84, 0x7d, 0x8e, 0x69, 0x30, 0xc8, 0xb1, 0x3f, 0xbc, 0x8b, - 0xfb, 0x50, 0x66, 0x8b, 0x31, 0x36, 0xbe, 0xa1, 0xea, 0xd0, 0x76, 0x79, 0x65, 0xa9, 0x2c, 0xd8, - 0xd9, 0xb1, 0x0c, 0xd6, 0xba, 0x81, 0xc1, 0x91, 0xad, 0xd3, 0xfd, 0x5c, 0xbf, 0x27, 0xcb, 0x4d, - 0xa5, 0x14, 0x7a, 0x79, 0x60, 0xbb, 0x8c, 0x50, 0x23, 0x3b, 0x4a, 0x70, 0x49, 0x10, 0x6a, 0x64, - 0x87, 0xe9, 0xbd, 0x0d, 0x1b, 0x9a, 0x26, 0xe6, 0x6c, 0x68, 0x6a, 0xd0, 0xe2, 0x7b, 0x12, 0x4a, - 0x24, 0x4b, 0xd3, 0x0e, 0x05, 0x20, 0xe0, 0xb8, 0x87, 0x3f, 0x87, 0xb7, 0xa7, 0xc9, 0x8a, 0x1b, - 0xae, 0xcf, 0xcd, 0x72, 0xd6, 0xf4, 0x36, 0x6c, 0x38, 0x67, 0xf3, 0x86, 0x38, 0xf1, 0x45, 0xe7, - 0x6c, 0xd6, 0xec, 0x23, 0x7e, 0x6d, 0x73, 0xa9, 0x46, 0x7c, 0xaa, 0x4b, 0x17, 0xe3, 0xe8, 0x98, - 0x02, 0xef, 0x02, 0xd2, 0x34, 0x95, 0x5a, 0xe4, 0xc4, 0xa4, 0x2a, 0x71, 0xa9, 0x45, 0x3c, 0xe9, - 0x72, 0x1c, 0x5c, 0xd1, 0x34, 0x99, 0x6b, 0xeb, 0x5c, 0x89, 0xaf, 0xc1, 0xba, 0x7d, 0xf2, 0x44, - 0x13, 0xcc, 0x52, 0x1d, 0x97, 0x0e, 0x8d, 0x17, 0xd2, 0x87, 0x3c, 0x4d, 0x6b, 0x4c, 0xc1, 0x79, - 0xd5, 0xe3, 0x62, 0xfc, 0x09, 0x20, 0xcd, 0x3b, 0x25, 0xae, 0xc3, 0x4b, 0xbb, 0xe7, 0x10, 0x8d, - 0x4a, 0x1f, 0x09, 0xa8, 0x90, 0x77, 0x42, 0x31, 0x63, 0xb6, 0xf7, 0xdc, 0x18, 0xfa, 0xa1, 0xc7, - 0xab, 0x82, 0xd9, 0x5c, 0x16, 0x78, 0xdb, 0x01, 0xe4, 0x9c, 0x3a, 0xc9, 0x0f, 0xef, 0x70, 0x58, - 0xc5, 0x39, 0x75, 0xe2, 0xdf, 0x7d, 0x04, 0x9b, 0x13, 0xcb, 0xb0, 0x7c, 0xea, 0x3a, 0x2e, 0x65, - 0xed, 0xbe, 0xd8, 0xb3, 0xd2, 0xbf, 0x57, 0x96, 0x34, 0xec, 0xc7, 0x71, 0xb4, 0xa0, 0x8a, 0xb2, - 0x31, 0x99, 0x17, 0x56, 0xf7, 0xa1, 0x1c, 0x67, 0x10, 0x2e, 0x82, 0xe0, 0x10, 0x4a, 0xb1, 0x6a, - 0xdc, 0xe8, 0x36, 0x59, 0x1d, 0xfd, 0x4a, 0x46, 0x69, 0x56, 0xcf, 0xdb, 0xad, 0x81, 0xac, 0x2a, - 0xc7, 0x9d, 0x41, 0xeb, 0x48, 0x46, 0x99, 0x6b, 0xc5, 0xc2, 0x7f, 0x56, 0xd0, 0xcb, 0x97, 0x2f, - 0x5f, 0xa6, 0x1f, 0x66, 0x0b, 0x1f, 0xa3, 0xab, 0xd5, 0xef, 0xd3, 0x50, 0x49, 0x76, 0xd2, 0xf8, - 0xe7, 0x70, 0x31, 0xbc, 0xf6, 0x7a, 0xd4, 0x57, 0x9f, 0x1b, 0x2e, 0xa7, 0xf6, 0x98, 0x88, 0x5e, - 0x34, 0x5a, 0x95, 0xcd, 0x00, 0xd5, 0xa7, 0xfe, 0x97, 0x86, 0xcb, 0x88, 0x3b, 0x26, 0x3e, 0x6e, - 0xc3, 0x65, 0xcb, 0x56, 0x3d, 0x9f, 0x58, 0x3a, 0x71, 0x75, 0x75, 0xfa, 0xe0, 0xa0, 0x12, 0x4d, - 0xa3, 0x9e, 0x67, 0x8b, 0x92, 0x12, 0x79, 0x79, 0xd7, 0xb2, 0xfb, 0x01, 0x78, 0x7a, 0xd6, 0xd6, - 0x03, 0xe8, 0x0c, 0x83, 0x32, 0xcb, 0x18, 0xf4, 0x0e, 0x14, 0xc7, 0xc4, 0x51, 0xa9, 0xe5, 0xbb, - 0x67, 0xbc, 0xff, 0x2b, 0x28, 0x85, 0x31, 0x71, 0x64, 0x36, 0x7e, 0x73, 0x2b, 0x91, 0xcc, 0x66, - 0x01, 0x15, 0x1f, 0x66, 0x0b, 0x45, 0x04, 0xd5, 0x7f, 0x66, 0xa0, 0x1c, 0xef, 0x07, 0x59, 0x7b, - 0xad, 0xf1, 0xb3, 0x3f, 0xc5, 0x4f, 0x87, 0x0f, 0x5e, 0xd9, 0x3d, 0xd6, 0x1a, 0xac, 0x28, 0xec, - 0xe7, 0x45, 0x97, 0xa6, 0x08, 0x4b, 0x56, 0x90, 0xd9, 0x79, 0x40, 0x45, 0xef, 0x5f, 0x50, 0x82, - 0x11, 0x3e, 0x84, 0xfc, 0x13, 0x8f, 0xfb, 0xce, 0x73, 0xdf, 0x1f, 0xbe, 0xda, 0xf7, 0xc3, 0x3e, - 0x77, 0x5e, 0x7c, 0xd8, 0x57, 0x3b, 0x5d, 0xe5, 0xa8, 0xde, 0x56, 0x02, 0x73, 0x7c, 0x09, 0xb2, - 0x26, 0xf9, 0xe6, 0x2c, 0x59, 0x3e, 0xb8, 0xe8, 0xbc, 0x8b, 0x70, 0x09, 0xb2, 0xcf, 0x29, 0x79, - 0x9a, 0x3c, 0xb4, 0xb9, 0xe8, 0x0d, 0x6e, 0x86, 0x5d, 0xc8, 0xf1, 0x7c, 0x61, 0x80, 0x20, 0x63, - 0xe8, 0x2d, 0x5c, 0x80, 0x6c, 0xa3, 0xab, 0xb0, 0x0d, 0x81, 0xa0, 0x2c, 0xa4, 0x6a, 0xaf, 0x25, - 0x37, 0x64, 0x94, 0xae, 0xde, 0x86, 0xbc, 0x48, 0x02, 0xdb, 0x2c, 0x51, 0x1a, 0xd0, 0x5b, 0xc1, - 0x30, 0xf0, 0x91, 0x0a, 0xb5, 0xc7, 0x47, 0x07, 0xb2, 0x82, 0xd2, 0xc9, 0xa5, 0xce, 0xa2, 0x5c, - 0xd5, 0x83, 0x72, 0xbc, 0x21, 0xfc, 0x51, 0x58, 0x56, 0xfd, 0x6b, 0x0a, 0x4a, 0xb1, 0x06, 0x8f, - 0xb5, 0x16, 0xc4, 0x34, 0xed, 0xe7, 0x2a, 0x31, 0x0d, 0xe2, 0x05, 0xd4, 0x00, 0x2e, 0xaa, 0x33, - 0xc9, 0x79, 0x97, 0xee, 0x47, 0xda, 0x22, 0x39, 0x94, 0xaf, 0xfe, 0x29, 0x05, 0x68, 0xb6, 0x45, - 0x9c, 0x09, 0x33, 0xf5, 0x53, 0x86, 0x59, 0xfd, 0x63, 0x0a, 0x2a, 0xc9, 0xbe, 0x70, 0x26, 0xbc, - 0x2b, 0x3f, 0x69, 0x78, 0xff, 0x48, 0xc3, 0x6a, 0xa2, 0x1b, 0x3c, 0x6f, 0x74, 0x5f, 0xc3, 0xba, - 0xa1, 0xd3, 0xb1, 0x63, 0xfb, 0xd4, 0xd2, 0xce, 0x54, 0x93, 0x3e, 0xa3, 0xa6, 0x54, 0xe5, 0x87, - 0xc6, 0xee, 0xab, 0xfb, 0xcd, 0x5a, 0x6b, 0x6a, 0xd7, 0x66, 0x66, 0xfb, 0x1b, 0xad, 0xa6, 0x7c, - 0xd4, 0xeb, 0x0e, 0xe4, 0x4e, 0xe3, 0xb1, 0x7a, 0xdc, 0xf9, 0x65, 0xa7, 0xfb, 0x65, 0x47, 0x41, - 0xc6, 0x0c, 0xec, 0x0d, 0x6e, 0xfb, 0x1e, 0xa0, 0xd9, 0xa0, 0xf0, 0x45, 0x58, 0x14, 0x16, 0x7a, - 0x0b, 0x6f, 0xc0, 0x5a, 0xa7, 0xab, 0xf6, 0x5b, 0x4d, 0x59, 0x95, 0x1f, 0x3c, 0x90, 0x1b, 0x83, - 0xbe, 0xb8, 0x80, 0x47, 0xe8, 0x41, 0x62, 0x83, 0x57, 0xff, 0x90, 0x81, 0x8d, 0x05, 0x91, 0xe0, - 0x7a, 0xd0, 0xfb, 0x8b, 0xeb, 0xc8, 0x8d, 0xf3, 0x44, 0x5f, 0x63, 0xdd, 0x45, 0x8f, 0xb8, 0x7e, - 0x70, 0x55, 0xf8, 0x04, 0x58, 0x96, 0x2c, 0xdf, 0x18, 0x1a, 0xd4, 0x0d, 0xde, 0x2b, 0xc4, 0x85, - 0x60, 0x6d, 0x2a, 0x17, 0x4f, 0x16, 0x3f, 0x03, 0xec, 0xd8, 0x9e, 0xe1, 0x1b, 0xcf, 0xa8, 0x6a, - 0x58, 0xe1, 0xe3, 0x06, 0xbb, 0x20, 0x64, 0x15, 0x14, 0x6a, 0x5a, 0x96, 0x1f, 0xa1, 0x2d, 0x3a, - 0x22, 0x33, 0x68, 0x76, 0x98, 0x67, 0x14, 0x14, 0x6a, 0x22, 0xf4, 0x15, 0x28, 0xeb, 0xf6, 0x84, - 0xb5, 0x5b, 0x02, 0xc7, 0x6a, 0x47, 0x4a, 0x29, 0x09, 0x59, 0x04, 0x09, 0xfa, 0xe1, 0xe9, 0xab, - 0x4a, 0x59, 0x29, 0x09, 0x99, 0x80, 0x5c, 0x85, 0x35, 0x32, 0x1a, 0xb9, 0xcc, 0x79, 0xe8, 0x48, - 0x74, 0xf8, 0x95, 0x48, 0xcc, 0x81, 0x5b, 0x0f, 0xa1, 0x10, 0xe6, 0x81, 0x95, 0x6a, 0x96, 0x09, - 0xd5, 0x11, 0x6f, 0x5b, 0xe9, 0x9d, 0xa2, 0x52, 0xb0, 0x42, 0xe5, 0x15, 0x28, 0x1b, 0x9e, 0x3a, - 0x7d, 0x64, 0x4d, 0x6f, 0xa7, 0x77, 0x0a, 0x4a, 0xc9, 0xf0, 0xa2, 0x57, 0xb5, 0xea, 0x77, 0x69, - 0xa8, 0x24, 0x1f, 0x89, 0x71, 0x13, 0x0a, 0xa6, 0xad, 0x11, 0x4e, 0x2d, 0xf1, 0x0b, 0xc5, 0xce, - 0x6b, 0xde, 0x95, 0x6b, 0xed, 0x00, 0xaf, 0x44, 0x96, 0x5b, 0x7f, 0x4b, 0x41, 0x21, 0x14, 0xe3, - 0x0b, 0x90, 0x75, 0x88, 0x7f, 0xca, 0xdd, 0xe5, 0x0e, 0xd2, 0x28, 0xa5, 0xf0, 0x31, 0x93, 0x7b, - 0x0e, 0xb1, 0x38, 0x05, 0x02, 0x39, 0x1b, 0xb3, 0x75, 0x35, 0x29, 0xd1, 0xf9, 0xf5, 0xc1, 0x1e, - 0x8f, 0xa9, 0xe5, 0x7b, 0xe1, 0xba, 0x06, 0xf2, 0x46, 0x20, 0xc6, 0xd7, 0x61, 0xdd, 0x77, 0x89, - 0x61, 0x26, 0xb0, 0x59, 0x8e, 0x45, 0xa1, 0x22, 0x02, 0xef, 0xc3, 0xa5, 0xd0, 0xaf, 0x4e, 0x7d, - 0xa2, 0x9d, 0x52, 0x7d, 0x6a, 0x94, 0xe7, 0x2f, 0x90, 0x17, 0x03, 0x40, 0x33, 0xd0, 0x87, 0xb6, - 0xd5, 0xef, 0x53, 0xb0, 0x1e, 0x5e, 0x78, 0xf4, 0x28, 0x59, 0x47, 0x00, 0xc4, 0xb2, 0x6c, 0x3f, - 0x9e, 0xae, 0x79, 0x2a, 0xcf, 0xd9, 0xd5, 0xea, 0x91, 0x91, 0x12, 0x73, 0xb0, 0x35, 0x06, 0x98, - 0x6a, 0x96, 0xa6, 0xed, 0x32, 0x94, 0x82, 0x5f, 0x00, 0xf8, 0xcf, 0x48, 0xe2, 0x8a, 0x0c, 0x42, - 0xc4, 0x6e, 0x46, 0x78, 0x13, 0x72, 0x27, 0x74, 0x64, 0x58, 0xc1, 0xbb, 0xa4, 0x18, 0x84, 0xaf, - 0x9d, 0xd9, 0xe8, 0xb5, 0xf3, 0xe0, 0x77, 0x29, 0xd8, 0xd0, 0xec, 0xf1, 0x6c, 0xbc, 0x07, 0x68, - 0xe6, 0x9e, 0xee, 0x7d, 0x91, 0xfa, 0xea, 0xfe, 0xc8, 0xf0, 0x4f, 0x27, 0x27, 0x35, 0xcd, 0x1e, - 0xef, 0x8e, 0x6c, 0x93, 0x58, 0xa3, 0xe9, 0xef, 0x60, 0xfc, 0x1f, 0xed, 0xc6, 0x88, 0x5a, 0x37, - 0x46, 0x76, 0xec, 0x57, 0xb1, 0x7b, 0xd3, 0x7f, 0xbf, 0x4d, 0x67, 0x0e, 0x7b, 0x07, 0x7f, 0x4e, - 0x6f, 0x1d, 0x8a, 0x6f, 0xf5, 0xc2, 0xdc, 0x28, 0x74, 0x68, 0x52, 0x8d, 0xcd, 0xf7, 0x7f, 0x01, - 0x00, 0x00, 0xff, 0xff, 0x8e, 0x54, 0xe7, 0xef, 0x60, 0x1b, 0x00, 0x00, +func init() { proto.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor_e5baabe45344a177) } + +var fileDescriptor_e5baabe45344a177 = []byte{ + // 2589 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xdd, 0x8e, 0xdb, 0xc6, + 0x15, 0x0e, 0xf5, 0xb7, 0xd2, 0x91, 0x56, 0x3b, 0x3b, 0xbb, 0xb1, 0xe9, 0xcd, 0x8f, 0xd7, 0xca, + 0x8f, 0xd7, 0x4e, 0xac, 0x0d, 0x1c, 0xdb, 0x71, 0xd6, 0x45, 0x5a, 0xad, 0x44, 0x6f, 0xe4, 0xee, + 0x4a, 0x2a, 0xa5, 0x6d, 0x7e, 0x80, 0x82, 0x98, 0x25, 0x47, 0x12, 0x6d, 0x8a, 0x64, 0x48, 0xca, + 0xf6, 0x06, 0xbd, 0x30, 0xd0, 0xab, 0x5e, 0x15, 0xe8, 0x55, 0x51, 0x14, 0xbd, 0xe8, 0x4d, 0x80, + 0x3e, 0x40, 0x81, 0xde, 0xf5, 0x09, 0x0a, 0xe4, 0x0d, 0x8a, 0xb6, 0x40, 0xfb, 0x08, 0xbd, 0x2c, + 0x66, 0x86, 0xa4, 0x48, 0x49, 0x1b, 0x6f, 0x02, 0xc4, 0xb9, 0x92, 0xe6, 0x3b, 0xdf, 0x39, 0x73, + 0xe6, 0xcc, 0x99, 0x99, 0x33, 0x43, 0xd8, 0x1e, 0x39, 0xce, 0xc8, 0xa2, 0xbb, 0xae, 0xe7, 0x04, + 0xce, 0xc9, 0x74, 0xb8, 0x6b, 0x50, 0x5f, 0xf7, 0x4c, 0x37, 0x70, 0xbc, 0x3a, 0xc7, 0xf0, 0x9a, + 0x60, 0xd4, 0x23, 0x46, 0xed, 0x08, 0xd6, 0xef, 0x9b, 0x16, 0x6d, 0xc5, 0xc4, 0x3e, 0x0d, 0xf0, + 0x5d, 0xc8, 0x0d, 0x4d, 0x8b, 0xca, 0xd2, 0x76, 0x76, 0xa7, 0x7c, 0xf3, 0xcd, 0xfa, 0x9c, 0x52, + 0x3d, 0xad, 0xd1, 0x63, 0xb0, 0xca, 0x35, 0x6a, 0xff, 0xce, 0xc1, 0xc6, 0x12, 0x29, 0xc6, 0x90, + 0xb3, 0xc9, 0x84, 0x59, 0x94, 0x76, 0x4a, 0x2a, 0xff, 0x8f, 0x65, 0x58, 0x71, 0x89, 0xfe, 0x88, + 0x8c, 0xa8, 0x9c, 0xe1, 0x70, 0xd4, 0xc4, 0xaf, 0x03, 0x18, 0xd4, 0xa5, 0xb6, 0x41, 0x6d, 0xfd, + 0x54, 0xce, 0x6e, 0x67, 0x77, 0x4a, 0x6a, 0x02, 0xc1, 0xef, 0xc0, 0xba, 0x3b, 0x3d, 0xb1, 0x4c, + 0x5d, 0x4b, 0xd0, 0x60, 0x3b, 0xbb, 0x93, 0x57, 0x91, 0x10, 0xb4, 0x66, 0xe4, 0xab, 0xb0, 0xf6, + 0x84, 0x92, 0x47, 0x49, 0x6a, 0x99, 0x53, 0xab, 0x0c, 0x4e, 0x10, 0x9b, 0x50, 0x99, 0x50, 0xdf, + 0x27, 0x23, 0xaa, 0x05, 0xa7, 0x2e, 0x95, 0x73, 0x7c, 0xf4, 0xdb, 0x0b, 0xa3, 0x9f, 0x1f, 0x79, + 0x39, 0xd4, 0x1a, 0x9c, 0xba, 0x14, 0x37, 0xa0, 0x44, 0xed, 0xe9, 0x44, 0x58, 0xc8, 0x9f, 0x11, + 0x3f, 0xc5, 0x9e, 0x4e, 0xe6, 0xad, 0x14, 0x99, 0x5a, 0x68, 0x62, 0xc5, 0xa7, 0xde, 0x63, 0x53, + 0xa7, 0x72, 0x81, 0x1b, 0xb8, 0xba, 0x60, 0xa0, 0x2f, 0xe4, 0xf3, 0x36, 0x22, 0x3d, 0xdc, 0x84, + 0x12, 0x7d, 0x1a, 0x50, 0xdb, 0x37, 0x1d, 0x5b, 0x5e, 0xe1, 0x46, 0xde, 0x5a, 0x32, 0x8b, 0xd4, + 0x32, 0xe6, 0x4d, 0xcc, 0xf4, 0xf0, 0x1d, 0x58, 0x71, 0xdc, 0xc0, 0x74, 0x6c, 0x5f, 0x2e, 0x6e, + 0x4b, 0x3b, 0xe5, 0x9b, 0xaf, 0x2e, 0x4d, 0x84, 0xae, 0xe0, 0xa8, 0x11, 0x19, 0xb7, 0x01, 0xf9, + 0xce, 0xd4, 0xd3, 0xa9, 0xa6, 0x3b, 0x06, 0xd5, 0x4c, 0x7b, 0xe8, 0xc8, 0x25, 0x6e, 0xe0, 0xf2, + 0xe2, 0x40, 0x38, 0xb1, 0xe9, 0x18, 0xb4, 0x6d, 0x0f, 0x1d, 0xb5, 0xea, 0xa7, 0xda, 0xf8, 0x02, + 0x14, 0xfc, 0x53, 0x3b, 0x20, 0x4f, 0xe5, 0x0a, 0xcf, 0x90, 0xb0, 0x55, 0xfb, 0x6b, 0x01, 0xd6, + 0xce, 0x93, 0x62, 0xf7, 0x20, 0x3f, 0x64, 0xa3, 0x94, 0x33, 0xdf, 0x26, 0x06, 0x42, 0x27, 0x1d, + 0xc4, 0xc2, 0x77, 0x0c, 0x62, 0x03, 0xca, 0x36, 0xf5, 0x03, 0x6a, 0x88, 0x8c, 0xc8, 0x9e, 0x33, + 0xa7, 0x40, 0x28, 0x2d, 0xa6, 0x54, 0xee, 0x3b, 0xa5, 0xd4, 0xa7, 0xb0, 0x16, 0xbb, 0xa4, 0x79, + 0xc4, 0x1e, 0x45, 0xb9, 0xb9, 0xfb, 0x3c, 0x4f, 0xea, 0x4a, 0xa4, 0xa7, 0x32, 0x35, 0xb5, 0x4a, + 0x53, 0x6d, 0xdc, 0x02, 0x70, 0x6c, 0xea, 0x0c, 0x35, 0x83, 0xea, 0x96, 0x5c, 0x3c, 0x23, 0x4a, + 0x5d, 0x46, 0x59, 0x88, 0x92, 0x23, 0x50, 0xdd, 0xc2, 0x1f, 0xce, 0x52, 0x6d, 0xe5, 0x8c, 0x4c, + 0x39, 0x12, 0x8b, 0x6c, 0x21, 0xdb, 0x8e, 0xa1, 0xea, 0x51, 0x96, 0xf7, 0xd4, 0x08, 0x47, 0x56, + 0xe2, 0x4e, 0xd4, 0x9f, 0x3b, 0x32, 0x35, 0x54, 0x13, 0x03, 0x5b, 0xf5, 0x92, 0x4d, 0xfc, 0x06, + 0xc4, 0x80, 0xc6, 0xd3, 0x0a, 0xf8, 0x2e, 0x54, 0x89, 0xc0, 0x0e, 0x99, 0xd0, 0xad, 0x2f, 0xa1, + 0x9a, 0x0e, 0x0f, 0xde, 0x84, 0xbc, 0x1f, 0x10, 0x2f, 0xe0, 0x59, 0x98, 0x57, 0x45, 0x03, 0x23, + 0xc8, 0x52, 0xdb, 0xe0, 0xbb, 0x5c, 0x5e, 0x65, 0x7f, 0xf1, 0x4f, 0x66, 0x03, 0xce, 0xf2, 0x01, + 0xbf, 0xbd, 0x38, 0xa3, 0x29, 0xcb, 0xf3, 0xe3, 0xde, 0xfa, 0x00, 0x56, 0x53, 0x03, 0x38, 0x6f, + 0xd7, 0xb5, 0x5f, 0xc2, 0xcb, 0x4b, 0x4d, 0xe3, 0x4f, 0x61, 0x73, 0x6a, 0x9b, 0x76, 0x40, 0x3d, + 0xd7, 0xa3, 0x2c, 0x63, 0x45, 0x57, 0xf2, 0x7f, 0x56, 0xce, 0xc8, 0xb9, 0xe3, 0x24, 0x5b, 0x58, + 0x51, 0x37, 0xa6, 0x8b, 0xe0, 0xf5, 0x52, 0xf1, 0xbf, 0x2b, 0xe8, 0xd9, 0xb3, 0x67, 0xcf, 0x32, + 0xb5, 0xdf, 0x15, 0x60, 0x73, 0xd9, 0x9a, 0x59, 0xba, 0x7c, 0x2f, 0x40, 0xc1, 0x9e, 0x4e, 0x4e, + 0xa8, 0xc7, 0x83, 0x94, 0x57, 0xc3, 0x16, 0x6e, 0x40, 0xde, 0x22, 0x27, 0xd4, 0x92, 0x73, 0xdb, + 0xd2, 0x4e, 0xf5, 0xe6, 0x3b, 0xe7, 0x5a, 0x95, 0xf5, 0x43, 0xa6, 0xa2, 0x0a, 0x4d, 0xfc, 0x11, + 0xe4, 0xc2, 0x2d, 0x9a, 0x59, 0xb8, 0x7e, 0x3e, 0x0b, 0x6c, 0x2d, 0xa9, 0x5c, 0x0f, 0xbf, 0x02, + 0x25, 0xf6, 0x2b, 0x72, 0xa3, 0xc0, 0x7d, 0x2e, 0x32, 0x80, 0xe5, 0x05, 0xde, 0x82, 0x22, 0x5f, + 0x26, 0x06, 0x8d, 0x8e, 0xb6, 0xb8, 0xcd, 0x12, 0xcb, 0xa0, 0x43, 0x32, 0xb5, 0x02, 0xed, 0x31, + 0xb1, 0xa6, 0x94, 0x27, 0x7c, 0x49, 0xad, 0x84, 0xe0, 0xcf, 0x19, 0x86, 0x2f, 0x43, 0x59, 0xac, + 0x2a, 0xd3, 0x36, 0xe8, 0x53, 0xbe, 0x7b, 0xe6, 0x55, 0xb1, 0xd0, 0xda, 0x0c, 0x61, 0xdd, 0x3f, + 0xf4, 0x1d, 0x3b, 0x4a, 0x4d, 0xde, 0x05, 0x03, 0x78, 0xf7, 0x1f, 0xcc, 0x6f, 0xdc, 0xaf, 0x2d, + 0x1f, 0xde, 0x7c, 0x4e, 0xd5, 0xfe, 0x92, 0x81, 0x1c, 0xdf, 0x2f, 0xd6, 0xa0, 0x3c, 0xf8, 0xac, + 0xa7, 0x68, 0xad, 0xee, 0xf1, 0xfe, 0xa1, 0x82, 0x24, 0x5c, 0x05, 0xe0, 0xc0, 0xfd, 0xc3, 0x6e, + 0x63, 0x80, 0x32, 0x71, 0xbb, 0xdd, 0x19, 0xdc, 0xb9, 0x85, 0xb2, 0xb1, 0xc2, 0xb1, 0x00, 0x72, + 0x49, 0xc2, 0xfb, 0x37, 0x51, 0x1e, 0x23, 0xa8, 0x08, 0x03, 0xed, 0x4f, 0x95, 0xd6, 0x9d, 0x5b, + 0xa8, 0x90, 0x46, 0xde, 0xbf, 0x89, 0x56, 0xf0, 0x2a, 0x94, 0x38, 0xb2, 0xdf, 0xed, 0x1e, 0xa2, + 0x62, 0x6c, 0xb3, 0x3f, 0x50, 0xdb, 0x9d, 0x03, 0x54, 0x8a, 0x6d, 0x1e, 0xa8, 0xdd, 0xe3, 0x1e, + 0x82, 0xd8, 0xc2, 0x91, 0xd2, 0xef, 0x37, 0x0e, 0x14, 0x54, 0x8e, 0x19, 0xfb, 0x9f, 0x0d, 0x94, + 0x3e, 0xaa, 0xa4, 0xdc, 0x7a, 0xff, 0x26, 0x5a, 0x8d, 0xbb, 0x50, 0x3a, 0xc7, 0x47, 0xa8, 0x8a, + 0xd7, 0x61, 0x55, 0x74, 0x11, 0x39, 0xb1, 0x36, 0x07, 0xdd, 0xb9, 0x85, 0xd0, 0xcc, 0x11, 0x61, + 0x65, 0x3d, 0x05, 0xdc, 0xb9, 0x85, 0x70, 0xad, 0x09, 0x79, 0x9e, 0x5d, 0x18, 0x43, 0xf5, 0xb0, + 0xb1, 0xaf, 0x1c, 0x6a, 0xdd, 0xde, 0xa0, 0xdd, 0xed, 0x34, 0x0e, 0x91, 0x34, 0xc3, 0x54, 0xe5, + 0x67, 0xc7, 0x6d, 0x55, 0x69, 0xa1, 0x4c, 0x12, 0xeb, 0x29, 0x8d, 0x81, 0xd2, 0x42, 0xd9, 0x9a, + 0x0e, 0x9b, 0xcb, 0xf6, 0xc9, 0xa5, 0x2b, 0x23, 0x31, 0xc5, 0x99, 0x33, 0xa6, 0x98, 0xdb, 0x5a, + 0x98, 0xe2, 0x7f, 0x65, 0x60, 0x63, 0xc9, 0x59, 0xb1, 0xb4, 0x93, 0x1f, 0x43, 0x5e, 0xa4, 0xa8, + 0x38, 0x3d, 0xaf, 0x2d, 0x3d, 0x74, 0x78, 0xc2, 0x2e, 0x9c, 0xa0, 0x5c, 0x2f, 0x59, 0x41, 0x64, + 0xcf, 0xa8, 0x20, 0x98, 0x89, 0x85, 0x3d, 0xfd, 0x17, 0x0b, 0x7b, 0xba, 0x38, 0xf6, 0xee, 0x9c, + 0xe7, 0xd8, 0xe3, 0xd8, 0xb7, 0xdb, 0xdb, 0xf3, 0x4b, 0xf6, 0xf6, 0x7b, 0xb0, 0xbe, 0x60, 0xe8, + 0xdc, 0x7b, 0xec, 0xaf, 0x24, 0x90, 0xcf, 0x0a, 0xce, 0x73, 0x76, 0xba, 0x4c, 0x6a, 0xa7, 0xbb, + 0x37, 0x1f, 0xc1, 0x2b, 0x67, 0x4f, 0xc2, 0xc2, 0x5c, 0x7f, 0x25, 0xc1, 0x85, 0xe5, 0x95, 0xe2, + 0x52, 0x1f, 0x3e, 0x82, 0xc2, 0x84, 0x06, 0x63, 0x27, 0xaa, 0x96, 0xde, 0x5e, 0x72, 0x06, 0x33, + 0xf1, 0xfc, 0x64, 0x87, 0x5a, 0xc9, 0x43, 0x3c, 0x7b, 0x56, 0xb9, 0x27, 0xbc, 0x59, 0xf0, 0xf4, + 0xd7, 0x19, 0x78, 0x79, 0xa9, 0xf1, 0xa5, 0x8e, 0xbe, 0x06, 0x60, 0xda, 0xee, 0x34, 0x10, 0x15, + 0x91, 0xd8, 0x60, 0x4b, 0x1c, 0xe1, 0x9b, 0x17, 0xdb, 0x3c, 0xa7, 0x41, 0x2c, 0xcf, 0x72, 0x39, + 0x08, 0x88, 0x13, 0xee, 0xce, 0x1c, 0xcd, 0x71, 0x47, 0x5f, 0x3f, 0x63, 0xa4, 0x0b, 0x89, 0xf9, + 0x1e, 0x20, 0xdd, 0x32, 0xa9, 0x1d, 0x68, 0x7e, 0xe0, 0x51, 0x32, 0x31, 0xed, 0x11, 0x3f, 0x41, + 0x8a, 0x7b, 0xf9, 0x21, 0xb1, 0x7c, 0xaa, 0xae, 0x09, 0x71, 0x3f, 0x92, 0x32, 0x0d, 0x9e, 0x40, + 0x5e, 0x42, 0xa3, 0x90, 0xd2, 0x10, 0xe2, 0x58, 0xa3, 0xf6, 0xdb, 0x12, 0x94, 0x13, 0x75, 0x35, + 0xbe, 0x02, 0x95, 0x87, 0xe4, 0x31, 0xd1, 0xa2, 0xbb, 0x92, 0x88, 0x44, 0x99, 0x61, 0xbd, 0xf0, + 0xbe, 0xf4, 0x1e, 0x6c, 0x72, 0x8a, 0x33, 0x0d, 0xa8, 0xa7, 0xe9, 0x16, 0xf1, 0x7d, 0x1e, 0xb4, + 0x22, 0xa7, 0x62, 0x26, 0xeb, 0x32, 0x51, 0x33, 0x92, 0xe0, 0xdb, 0xb0, 0xc1, 0x35, 0x26, 0x53, + 0x2b, 0x30, 0x5d, 0x8b, 0x6a, 0xec, 0xf6, 0xe6, 0xf3, 0x93, 0x24, 0xf6, 0x6c, 0x9d, 0x31, 0x8e, + 0x42, 0x02, 0xf3, 0xc8, 0xc7, 0x2d, 0x78, 0x8d, 0xab, 0x8d, 0xa8, 0x4d, 0x3d, 0x12, 0x50, 0x8d, + 0x7e, 0x31, 0x25, 0x96, 0xaf, 0x11, 0xdb, 0xd0, 0xc6, 0xc4, 0x1f, 0xcb, 0x9b, 0xcc, 0xc0, 0x7e, + 0x46, 0x96, 0xd4, 0x4b, 0x8c, 0x78, 0x10, 0xf2, 0x14, 0x4e, 0x6b, 0xd8, 0xc6, 0xc7, 0xc4, 0x1f, + 0xe3, 0x3d, 0xb8, 0xc0, 0xad, 0xf8, 0x81, 0x67, 0xda, 0x23, 0x4d, 0x1f, 0x53, 0xfd, 0x91, 0x36, + 0x0d, 0x86, 0x77, 0xe5, 0x57, 0x92, 0xfd, 0x73, 0x0f, 0xfb, 0x9c, 0xd3, 0x64, 0x94, 0xe3, 0x60, + 0x78, 0x17, 0xf7, 0xa1, 0xc2, 0x26, 0x63, 0x62, 0x7e, 0x49, 0xb5, 0xa1, 0xe3, 0xf1, 0xa3, 0xb1, + 0xba, 0x64, 0x6b, 0x4a, 0x44, 0xb0, 0xde, 0x0d, 0x15, 0x8e, 0x1c, 0x83, 0xee, 0xe5, 0xfb, 0x3d, + 0x45, 0x69, 0xa9, 0xe5, 0xc8, 0xca, 0x7d, 0xc7, 0x63, 0x09, 0x35, 0x72, 0xe2, 0x00, 0x97, 0x45, + 0x42, 0x8d, 0x9c, 0x28, 0xbc, 0xb7, 0x61, 0x43, 0xd7, 0xc5, 0x98, 0x4d, 0x5d, 0x0b, 0xef, 0x58, + 0xbe, 0x8c, 0x52, 0xc1, 0xd2, 0xf5, 0x03, 0x41, 0x08, 0x73, 0xdc, 0xc7, 0x1f, 0xc2, 0xcb, 0xb3, + 0x60, 0x25, 0x15, 0xd7, 0x17, 0x46, 0x39, 0xaf, 0x7a, 0x1b, 0x36, 0xdc, 0xd3, 0x45, 0x45, 0x9c, + 0xea, 0xd1, 0x3d, 0x9d, 0x57, 0xfb, 0x00, 0x36, 0xdd, 0xb1, 0xbb, 0xa8, 0x77, 0x3d, 0xa9, 0x87, + 0xdd, 0xb1, 0x3b, 0xaf, 0xf8, 0x16, 0xbf, 0x70, 0x7b, 0x54, 0x27, 0x01, 0x35, 0xe4, 0x8b, 0x49, + 0x7a, 0x42, 0x80, 0x77, 0x01, 0xe9, 0xba, 0x46, 0x6d, 0x72, 0x62, 0x51, 0x8d, 0x78, 0xd4, 0x26, + 0xbe, 0x7c, 0x39, 0x49, 0xae, 0xea, 0xba, 0xc2, 0xa5, 0x0d, 0x2e, 0xc4, 0xd7, 0x61, 0xdd, 0x39, + 0x79, 0xa8, 0x8b, 0x94, 0xd4, 0x5c, 0x8f, 0x0e, 0xcd, 0xa7, 0xf2, 0x9b, 0x3c, 0xbe, 0x6b, 0x4c, + 0xc0, 0x13, 0xb2, 0xc7, 0x61, 0x7c, 0x0d, 0x90, 0xee, 0x8f, 0x89, 0xe7, 0xf2, 0x3d, 0xd9, 0x77, + 0x89, 0x4e, 0xe5, 0xb7, 0x04, 0x55, 0xe0, 0x9d, 0x08, 0x66, 0x4b, 0xc2, 0x7f, 0x62, 0x0e, 0x83, + 0xc8, 0xe2, 0x55, 0xb1, 0x24, 0x38, 0x16, 0x5a, 0xdb, 0x01, 0xc4, 0x42, 0x91, 0xea, 0x78, 0x87, + 0xd3, 0xaa, 0xee, 0xd8, 0x4d, 0xf6, 0xfb, 0x06, 0xac, 0x32, 0xe6, 0xac, 0xd3, 0x6b, 0xa2, 0x20, + 0x73, 0xc7, 0x89, 0x1e, 0x6f, 0xc1, 0x05, 0x46, 0x9a, 0xd0, 0x80, 0x18, 0x24, 0x20, 0x09, 0xf6, + 0xbb, 0x9c, 0xcd, 0xe2, 0x7e, 0x14, 0x0a, 0x53, 0x7e, 0x7a, 0xd3, 0x93, 0xd3, 0x38, 0xb3, 0x6e, + 0x08, 0x3f, 0x19, 0x16, 0xe5, 0xd6, 0xf7, 0x56, 0x74, 0xd7, 0xf6, 0xa0, 0x92, 0x4c, 0x7c, 0x5c, + 0x02, 0x91, 0xfa, 0x48, 0x62, 0x55, 0x50, 0xb3, 0xdb, 0x62, 0xf5, 0xcb, 0xe7, 0x0a, 0xca, 0xb0, + 0x3a, 0xea, 0xb0, 0x3d, 0x50, 0x34, 0xf5, 0xb8, 0x33, 0x68, 0x1f, 0x29, 0x28, 0x9b, 0x28, 0xd8, + 0x1f, 0xe4, 0x8a, 0x6f, 0xa3, 0xab, 0xb5, 0xaf, 0x33, 0x50, 0x4d, 0xdf, 0xc0, 0xf0, 0x8f, 0xe0, + 0x62, 0xf4, 0x5c, 0xe2, 0xd3, 0x40, 0x7b, 0x62, 0x7a, 0x7c, 0x45, 0x4e, 0x88, 0x38, 0x1d, 0xe3, + 0x9c, 0xd8, 0x0c, 0x59, 0x7d, 0x1a, 0x7c, 0x62, 0x7a, 0x6c, 0xbd, 0x4d, 0x48, 0x80, 0x0f, 0xe1, + 0xb2, 0xed, 0x68, 0x7e, 0x40, 0x6c, 0x83, 0x78, 0x86, 0x36, 0x7b, 0xa8, 0xd2, 0x88, 0xae, 0x53, + 0xdf, 0x77, 0xc4, 0x49, 0x18, 0x5b, 0x79, 0xd5, 0x76, 0xfa, 0x21, 0x79, 0x76, 0x44, 0x34, 0x42, + 0xea, 0x5c, 0xfe, 0x66, 0xcf, 0xca, 0xdf, 0x57, 0xa0, 0x34, 0x21, 0xae, 0x46, 0xed, 0xc0, 0x3b, + 0xe5, 0x75, 0x77, 0x51, 0x2d, 0x4e, 0x88, 0xab, 0xb0, 0xf6, 0x0b, 0xb9, 0xfe, 0x3c, 0xc8, 0x15, + 0x8b, 0xa8, 0xf4, 0x20, 0x57, 0x2c, 0x21, 0xa8, 0xfd, 0x33, 0x0b, 0x95, 0x64, 0x1d, 0xce, 0xae, + 0x35, 0x3a, 0x3f, 0xb2, 0x24, 0xbe, 0xa9, 0xbd, 0xf1, 0x8d, 0x55, 0x7b, 0xbd, 0xc9, 0xce, 0xb2, + 0xbd, 0x82, 0xa8, 0x8e, 0x55, 0xa1, 0xc9, 0xea, 0x08, 0x96, 0x6c, 0x54, 0x54, 0x23, 0x45, 0x35, + 0x6c, 0xe1, 0x03, 0x28, 0x3c, 0xf4, 0xb9, 0xed, 0x02, 0xb7, 0xfd, 0xe6, 0x37, 0xdb, 0x7e, 0xd0, + 0xe7, 0xc6, 0x4b, 0x0f, 0xfa, 0x5a, 0xa7, 0xab, 0x1e, 0x35, 0x0e, 0xd5, 0x50, 0x1d, 0x5f, 0x82, + 0x9c, 0x45, 0xbe, 0x3c, 0x4d, 0x9f, 0x7a, 0x1c, 0x3a, 0xef, 0x24, 0x5c, 0x82, 0xdc, 0x13, 0x4a, + 0x1e, 0xa5, 0xcf, 0x1a, 0x0e, 0x7d, 0x8f, 0x8b, 0x61, 0x17, 0xf2, 0x3c, 0x5e, 0x18, 0x20, 0x8c, + 0x18, 0x7a, 0x09, 0x17, 0x21, 0xd7, 0xec, 0xaa, 0x6c, 0x41, 0x20, 0xa8, 0x08, 0x54, 0xeb, 0xb5, + 0x95, 0xa6, 0x82, 0x32, 0xb5, 0xdb, 0x50, 0x10, 0x41, 0x60, 0x8b, 0x25, 0x0e, 0x03, 0x7a, 0x29, + 0x6c, 0x86, 0x36, 0xa4, 0x48, 0x7a, 0x7c, 0xb4, 0xaf, 0xa8, 0x28, 0x93, 0x9e, 0xea, 0x1c, 0xca, + 0xd7, 0x7c, 0xa8, 0x24, 0x0b, 0xf1, 0x17, 0x73, 0xc9, 0xfe, 0x9b, 0x04, 0xe5, 0x44, 0x61, 0xcd, + 0x2a, 0x22, 0x62, 0x59, 0xce, 0x13, 0x8d, 0x58, 0x26, 0xf1, 0xc3, 0xd4, 0x00, 0x0e, 0x35, 0x18, + 0x72, 0xde, 0xa9, 0x7b, 0x41, 0x4b, 0x24, 0x8f, 0x0a, 0xb5, 0x3f, 0x4a, 0x80, 0xe6, 0x2b, 0xdb, + 0x39, 0x37, 0xa5, 0x1f, 0xd2, 0xcd, 0xda, 0x1f, 0x24, 0xa8, 0xa6, 0xcb, 0xd9, 0x39, 0xf7, 0xae, + 0xfc, 0xa0, 0xee, 0xfd, 0x23, 0x03, 0xab, 0xa9, 0x22, 0xf6, 0xbc, 0xde, 0x7d, 0x01, 0xeb, 0xa6, + 0x41, 0x27, 0xae, 0x13, 0x50, 0x5b, 0x3f, 0xd5, 0x2c, 0xfa, 0x98, 0x5a, 0x72, 0x8d, 0x6f, 0x1a, + 0xbb, 0xdf, 0x5c, 0x26, 0xd7, 0xdb, 0x33, 0xbd, 0x43, 0xa6, 0xb6, 0xb7, 0xd1, 0x6e, 0x29, 0x47, + 0xbd, 0xee, 0x40, 0xe9, 0x34, 0x3f, 0xd3, 0x8e, 0x3b, 0x3f, 0xed, 0x74, 0x3f, 0xe9, 0xa8, 0xc8, + 0x9c, 0xa3, 0x7d, 0x8f, 0xcb, 0xbe, 0x07, 0x68, 0xde, 0x29, 0x7c, 0x11, 0x96, 0xb9, 0x85, 0x5e, + 0xc2, 0x1b, 0xb0, 0xd6, 0xe9, 0x6a, 0xfd, 0x76, 0x4b, 0xd1, 0x94, 0xfb, 0xf7, 0x95, 0xe6, 0xa0, + 0x2f, 0x1e, 0x3e, 0x62, 0xf6, 0x20, 0xb5, 0xc0, 0x6b, 0xbf, 0xcf, 0xc2, 0xc6, 0x12, 0x4f, 0x70, + 0x23, 0xbc, 0xb2, 0x88, 0x5b, 0xd4, 0x8d, 0xf3, 0x78, 0x5f, 0x67, 0x35, 0x43, 0x8f, 0x78, 0x41, + 0x78, 0xc3, 0xb9, 0x06, 0x2c, 0x4a, 0x76, 0x60, 0x0e, 0x4d, 0xea, 0x85, 0xef, 0x44, 0xe2, 0x1e, + 0xb3, 0x36, 0xc3, 0xc5, 0x53, 0xd1, 0xbb, 0x80, 0x5d, 0xc7, 0x37, 0x03, 0xf3, 0x31, 0xd5, 0x4c, + 0x3b, 0x7a, 0x54, 0x62, 0xf7, 0x9a, 0x9c, 0x8a, 0x22, 0x49, 0xdb, 0x0e, 0x62, 0xb6, 0x4d, 0x47, + 0x64, 0x8e, 0xcd, 0x36, 0xf3, 0xac, 0x8a, 0x22, 0x49, 0xcc, 0xbe, 0x02, 0x15, 0xc3, 0x99, 0xb2, + 0x62, 0x4f, 0xf0, 0xd8, 0xd9, 0x21, 0xa9, 0x65, 0x81, 0xc5, 0x94, 0xb0, 0x8c, 0x9f, 0xbd, 0x66, + 0x55, 0xd4, 0xb2, 0xc0, 0x04, 0xe5, 0x2a, 0xac, 0x91, 0xd1, 0xc8, 0x63, 0xc6, 0x23, 0x43, 0xe2, + 0x62, 0x52, 0x8d, 0x61, 0x4e, 0xdc, 0x7a, 0x00, 0xc5, 0x28, 0x0e, 0xec, 0xa8, 0x66, 0x91, 0xd0, + 0x5c, 0x71, 0xdb, 0xce, 0xec, 0x94, 0xd4, 0xa2, 0x1d, 0x09, 0xaf, 0x40, 0xc5, 0xf4, 0xb5, 0xd9, + 0xe3, 0x7c, 0x66, 0x3b, 0xb3, 0x53, 0x54, 0xcb, 0xa6, 0x1f, 0x3f, 0x6c, 0xd6, 0xbe, 0xca, 0x40, + 0x35, 0xfd, 0x71, 0x01, 0xb7, 0xa0, 0x68, 0x39, 0x3a, 0xe1, 0xa9, 0x25, 0xbe, 0x6c, 0xed, 0x3c, + 0xe7, 0x7b, 0x44, 0xfd, 0x30, 0xe4, 0xab, 0xb1, 0xe6, 0xd6, 0xdf, 0x25, 0x28, 0x46, 0x30, 0xbe, + 0x00, 0x39, 0x97, 0x04, 0x63, 0x6e, 0x2e, 0xbf, 0x9f, 0x41, 0x92, 0xca, 0xdb, 0x0c, 0xf7, 0x5d, + 0x62, 0xf3, 0x14, 0x08, 0x71, 0xd6, 0x66, 0xf3, 0x6a, 0x51, 0x62, 0xf0, 0x5b, 0x8f, 0x33, 0x99, + 0x50, 0x3b, 0xf0, 0xa3, 0x79, 0x0d, 0xf1, 0x66, 0x08, 0xe3, 0x77, 0x60, 0x3d, 0xf0, 0x88, 0x69, + 0xa5, 0xb8, 0x39, 0xce, 0x45, 0x91, 0x20, 0x26, 0xef, 0xc1, 0xa5, 0xc8, 0xae, 0x41, 0x03, 0xa2, + 0x8f, 0xa9, 0x31, 0x53, 0x2a, 0xf0, 0xd7, 0x8d, 0x8b, 0x21, 0xa1, 0x15, 0xca, 0x23, 0xdd, 0xda, + 0xd7, 0x12, 0xac, 0x47, 0xf7, 0x34, 0x23, 0x0e, 0xd6, 0x11, 0x00, 0xb1, 0x6d, 0x27, 0x48, 0x86, + 0x6b, 0x31, 0x95, 0x17, 0xf4, 0xea, 0x8d, 0x58, 0x49, 0x4d, 0x18, 0xd8, 0x9a, 0x00, 0xcc, 0x24, + 0x67, 0x86, 0xed, 0x32, 0x94, 0xc3, 0x2f, 0x47, 0xfc, 0xf3, 0xa3, 0xb8, 0xd9, 0x83, 0x80, 0xd8, + 0x85, 0x0e, 0x6f, 0x42, 0xfe, 0x84, 0x8e, 0x4c, 0x3b, 0x7c, 0x0f, 0x16, 0x8d, 0xe8, 0xfd, 0x25, + 0x17, 0xbf, 0xbf, 0xec, 0xff, 0x46, 0x82, 0x0d, 0xdd, 0x99, 0xcc, 0xfb, 0xbb, 0x8f, 0xe6, 0x9e, + 0x17, 0xfc, 0x8f, 0xa5, 0xcf, 0x3f, 0x1a, 0x99, 0xc1, 0x78, 0x7a, 0x52, 0xd7, 0x9d, 0xc9, 0xee, + 0xc8, 0xb1, 0x88, 0x3d, 0x9a, 0x7d, 0x3f, 0xe5, 0x7f, 0xf4, 0x1b, 0x23, 0x6a, 0xdf, 0x18, 0x39, + 0x89, 0xaf, 0xa9, 0xf7, 0x66, 0x7f, 0xff, 0x27, 0x49, 0x7f, 0xca, 0x64, 0x0f, 0x7a, 0xfb, 0x7f, + 0xce, 0x6c, 0x1d, 0x88, 0xee, 0x7a, 0x51, 0x78, 0x54, 0x3a, 0xb4, 0xa8, 0xce, 0x86, 0xfc, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x3e, 0xe8, 0xef, 0xc4, 0x9b, 0x1d, 0x00, 0x00, } diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto new file mode 100644 index 000000000000..ed08fcbc5429 --- /dev/null +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto @@ -0,0 +1,883 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + +syntax = "proto2"; + +package google.protobuf; +option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; +option csharp_namespace = "Google.Protobuf.Reflection"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + // Indexes of the public imported files in the dependency list above. + repeated int32 public_dependency = 10; + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + repeated int32 weak_dependency = 11; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; + + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + optional string syntax = 12; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + + optional ExtensionRangeOptions options = 3; + } + repeated ExtensionRange extension_range = 5; + + repeated OneofDescriptorProto oneof_decl = 8; + + optional MessageOptions options = 7; + + // Range of reserved tag numbers. Reserved tag numbers may not be used by + // fields or extension ranges in the same message. Reserved ranges may + // not overlap. + message ReservedRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Exclusive. + } + repeated ReservedRange reserved_range = 9; + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + repeated string reserved_name = 10; +} + +message ExtensionRangeOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + TYPE_GROUP = 10; + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + optional int32 oneof_index = 9; + + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + optional string json_name = 10; + + optional FieldOptions options = 8; +} + +// Describes a oneof. +message OneofDescriptorProto { + optional string name = 1; + optional OneofOptions options = 2; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; + + // Range of reserved numeric values. Reserved values may not be used by + // entries in the same enum. Reserved ranges may not overlap. + // + // Note that this is distinct from DescriptorProto.ReservedRange in that it + // is inclusive such that it can appropriately represent the entire int32 + // domain. + message EnumReservedRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Inclusive. + } + + // Range of reserved numeric values. Reserved numeric values may not be used + // by enum values in the same enum declaration. Reserved ranges may not + // overlap. + repeated EnumReservedRange reserved_range = 4; + + // Reserved enum value names, which may not be reused. A given name may only + // be reserved once. + repeated string reserved_name = 5; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; + + // Identifies if client streams multiple client messages + optional bool client_streaming = 5 [default=false]; + // Identifies if server streams multiple server messages + optional bool server_streaming = 6 [default=false]; +} + + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail protobuf-global-extension-registry@google.com +// to reserve extension numbers. Simply provide your project name (e.g. +// Objective-C plugin) and your project website (if available) -- there's no +// need to explain how you intend to use them. Usually you only need one +// extension number. You can declare multiple options with only one extension +// number by putting them in a sub-message. See the Custom Options section of +// the docs for examples: +// https://developers.google.com/protocol-buffers/docs/proto#options +// If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // This option does nothing. + optional bool java_generate_equals_and_hash = 20 [deprecated=true]; + + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + optional bool java_string_check_utf8 = 27 [default=false]; + + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + optional string go_package = 11; + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + optional bool php_generic_services = 42 [default=false]; + + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + optional bool deprecated = 23 [default=false]; + + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + optional bool cc_enable_arenas = 31 [default=false]; + + + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + optional string objc_class_prefix = 36; + + // Namespace for generated classes; defaults to the package. + optional string csharp_namespace = 37; + + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + optional string swift_prefix = 39; + + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + optional string php_class_prefix = 40; + + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + optional string php_namespace = 41; + + + // Use this option to change the namespace of php generated metadata classes. + // Default is empty. When this option is empty, the proto file name will be used + // for determining the namespace. + optional string php_metadata_namespace = 44; + + // Use this option to change the package of ruby generated classes. Default + // is empty. When this option is not set, the package name will be used for + // determining the ruby package. + optional string ruby_package = 45; + + // The parser stores options it doesn't recognize here. + // See the documentation for the "Options" section above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. + // See the documentation for the "Options" section above. + extensions 1000 to max; + + reserved 38; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + optional bool deprecated = 3 [default=false]; + + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + optional bool map_entry = 7; + + reserved 8; // javalite_serializable + reserved 9; // javanano_as_lite + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + optional bool packed = 2; + + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + optional JSType jstype = 6 [default = JS_NORMAL]; + enum JSType { + // Use the default type. + JS_NORMAL = 0; + + // Use JavaScript strings. + JS_STRING = 1; + + // Use JavaScript numbers. + JS_NUMBER = 2; + } + + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + optional bool lazy = 5 [default=false]; + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // For Google-internal migration only. Do not use. + optional bool weak = 10 [default=false]; + + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; + + reserved 4; // removed jtype +} + +message OneofOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // Set this option to true to allow mapping different tag names to the same + // value. + optional bool allow_alias = 2; + + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + optional bool deprecated = 3 [default=false]; + + reserved 5; // javanano_as_lite + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + optional bool deprecated = 1 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + optional bool deprecated = 33 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + optional bool deprecated = 33 [default=false]; + + // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, + // or neither? HTTP based RPC implementation may choose GET verb for safe + // methods, and PUT verb for idempotent methods instead of the default POST. + enum IdempotencyLevel { + IDEMPOTENCY_UNKNOWN = 0; + NO_SIDE_EFFECTS = 1; // implies idempotent + IDEMPOTENT = 2; // idempotent, but may have side effects + } + optional IdempotencyLevel idempotency_level = + 34 [default=IDEMPOTENCY_UNKNOWN]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + optional string leading_comments = 3; + optional string trailing_comments = 4; + repeated string leading_detached_comments = 6; + } +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +message GeneratedCodeInfo { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + repeated Annotation annotation = 1; + message Annotation { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + repeated int32 path = 1 [packed=true]; + + // Identifies the filesystem path to the original source .proto. + optional string source_file = 2; + + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + optional int32 begin = 3; + + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + optional int32 end = 4; + } +} diff --git a/vendor/github.com/gorilla/websocket/AUTHORS b/vendor/github.com/gorilla/websocket/AUTHORS new file mode 100644 index 000000000000..1931f400682c --- /dev/null +++ b/vendor/github.com/gorilla/websocket/AUTHORS @@ -0,0 +1,9 @@ +# This is the official list of Gorilla WebSocket authors for copyright +# purposes. +# +# Please keep the list sorted. + +Gary Burd +Google LLC (https://opensource.google.com/) +Joachim Bauch + diff --git a/vendor/github.com/gorilla/websocket/LICENSE b/vendor/github.com/gorilla/websocket/LICENSE new file mode 100644 index 000000000000..9171c9722522 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/gorilla/websocket/README.md b/vendor/github.com/gorilla/websocket/README.md new file mode 100644 index 000000000000..0827d059c11a --- /dev/null +++ b/vendor/github.com/gorilla/websocket/README.md @@ -0,0 +1,64 @@ +# Gorilla WebSocket + +[![GoDoc](https://godoc.org/github.com/gorilla/websocket?status.svg)](https://godoc.org/github.com/gorilla/websocket) +[![CircleCI](https://circleci.com/gh/gorilla/websocket.svg?style=svg)](https://circleci.com/gh/gorilla/websocket) + +Gorilla WebSocket is a [Go](http://golang.org/) implementation of the +[WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. + +### Documentation + +* [API Reference](http://godoc.org/github.com/gorilla/websocket) +* [Chat example](https://github.com/gorilla/websocket/tree/master/examples/chat) +* [Command example](https://github.com/gorilla/websocket/tree/master/examples/command) +* [Client and server example](https://github.com/gorilla/websocket/tree/master/examples/echo) +* [File watch example](https://github.com/gorilla/websocket/tree/master/examples/filewatch) + +### Status + +The Gorilla WebSocket package provides a complete and tested implementation of +the [WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. The +package API is stable. + +### Installation + + go get github.com/gorilla/websocket + +### Protocol Compliance + +The Gorilla WebSocket package passes the server tests in the [Autobahn Test +Suite](https://github.com/crossbario/autobahn-testsuite) using the application in the [examples/autobahn +subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn). + +### Gorilla WebSocket compared with other packages + + + + + + + + + + + + + + + + + + +
github.com/gorillagolang.org/x/net
RFC 6455 Features
Passes Autobahn Test SuiteYesNo
Receive fragmented messageYesNo, see note 1
Send close messageYesNo
Send pings and receive pongsYesNo
Get the type of a received data messageYesYes, see note 2
Other Features
Compression ExtensionsExperimentalNo
Read message using io.ReaderYesNo, see note 3
Write message using io.WriteCloserYesNo, see note 3
+ +Notes: + +1. Large messages are fragmented in [Chrome's new WebSocket implementation](http://www.ietf.org/mail-archive/web/hybi/current/msg10503.html). +2. The application can get the type of a received data message by implementing + a [Codec marshal](http://godoc.org/golang.org/x/net/websocket#Codec.Marshal) + function. +3. The go.net io.Reader and io.Writer operate across WebSocket frame boundaries. + Read returns when the input buffer is full or a frame boundary is + encountered. Each call to Write sends a single frame message. The Gorilla + io.Reader and io.WriteCloser operate on a single WebSocket message. + diff --git a/vendor/github.com/gorilla/websocket/client.go b/vendor/github.com/gorilla/websocket/client.go new file mode 100644 index 000000000000..962c06a391c2 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/client.go @@ -0,0 +1,395 @@ +// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "bytes" + "context" + "crypto/tls" + "errors" + "io" + "io/ioutil" + "net" + "net/http" + "net/http/httptrace" + "net/url" + "strings" + "time" +) + +// ErrBadHandshake is returned when the server response to opening handshake is +// invalid. +var ErrBadHandshake = errors.New("websocket: bad handshake") + +var errInvalidCompression = errors.New("websocket: invalid compression negotiation") + +// NewClient creates a new client connection using the given net connection. +// The URL u specifies the host and request URI. Use requestHeader to specify +// the origin (Origin), subprotocols (Sec-WebSocket-Protocol) and cookies +// (Cookie). Use the response.Header to get the selected subprotocol +// (Sec-WebSocket-Protocol) and cookies (Set-Cookie). +// +// If the WebSocket handshake fails, ErrBadHandshake is returned along with a +// non-nil *http.Response so that callers can handle redirects, authentication, +// etc. +// +// Deprecated: Use Dialer instead. +func NewClient(netConn net.Conn, u *url.URL, requestHeader http.Header, readBufSize, writeBufSize int) (c *Conn, response *http.Response, err error) { + d := Dialer{ + ReadBufferSize: readBufSize, + WriteBufferSize: writeBufSize, + NetDial: func(net, addr string) (net.Conn, error) { + return netConn, nil + }, + } + return d.Dial(u.String(), requestHeader) +} + +// A Dialer contains options for connecting to WebSocket server. +type Dialer struct { + // NetDial specifies the dial function for creating TCP connections. If + // NetDial is nil, net.Dial is used. + NetDial func(network, addr string) (net.Conn, error) + + // NetDialContext specifies the dial function for creating TCP connections. If + // NetDialContext is nil, net.DialContext is used. + NetDialContext func(ctx context.Context, network, addr string) (net.Conn, error) + + // Proxy specifies a function to return a proxy for a given + // Request. If the function returns a non-nil error, the + // request is aborted with the provided error. + // If Proxy is nil or returns a nil *URL, no proxy is used. + Proxy func(*http.Request) (*url.URL, error) + + // TLSClientConfig specifies the TLS configuration to use with tls.Client. + // If nil, the default configuration is used. + TLSClientConfig *tls.Config + + // HandshakeTimeout specifies the duration for the handshake to complete. + HandshakeTimeout time.Duration + + // ReadBufferSize and WriteBufferSize specify I/O buffer sizes in bytes. If a buffer + // size is zero, then a useful default size is used. The I/O buffer sizes + // do not limit the size of the messages that can be sent or received. + ReadBufferSize, WriteBufferSize int + + // WriteBufferPool is a pool of buffers for write operations. If the value + // is not set, then write buffers are allocated to the connection for the + // lifetime of the connection. + // + // A pool is most useful when the application has a modest volume of writes + // across a large number of connections. + // + // Applications should use a single pool for each unique value of + // WriteBufferSize. + WriteBufferPool BufferPool + + // Subprotocols specifies the client's requested subprotocols. + Subprotocols []string + + // EnableCompression specifies if the client should attempt to negotiate + // per message compression (RFC 7692). Setting this value to true does not + // guarantee that compression will be supported. Currently only "no context + // takeover" modes are supported. + EnableCompression bool + + // Jar specifies the cookie jar. + // If Jar is nil, cookies are not sent in requests and ignored + // in responses. + Jar http.CookieJar +} + +// Dial creates a new client connection by calling DialContext with a background context. +func (d *Dialer) Dial(urlStr string, requestHeader http.Header) (*Conn, *http.Response, error) { + return d.DialContext(context.Background(), urlStr, requestHeader) +} + +var errMalformedURL = errors.New("malformed ws or wss URL") + +func hostPortNoPort(u *url.URL) (hostPort, hostNoPort string) { + hostPort = u.Host + hostNoPort = u.Host + if i := strings.LastIndex(u.Host, ":"); i > strings.LastIndex(u.Host, "]") { + hostNoPort = hostNoPort[:i] + } else { + switch u.Scheme { + case "wss": + hostPort += ":443" + case "https": + hostPort += ":443" + default: + hostPort += ":80" + } + } + return hostPort, hostNoPort +} + +// DefaultDialer is a dialer with all fields set to the default values. +var DefaultDialer = &Dialer{ + Proxy: http.ProxyFromEnvironment, + HandshakeTimeout: 45 * time.Second, +} + +// nilDialer is dialer to use when receiver is nil. +var nilDialer = *DefaultDialer + +// DialContext creates a new client connection. Use requestHeader to specify the +// origin (Origin), subprotocols (Sec-WebSocket-Protocol) and cookies (Cookie). +// Use the response.Header to get the selected subprotocol +// (Sec-WebSocket-Protocol) and cookies (Set-Cookie). +// +// The context will be used in the request and in the Dialer. +// +// If the WebSocket handshake fails, ErrBadHandshake is returned along with a +// non-nil *http.Response so that callers can handle redirects, authentication, +// etcetera. The response body may not contain the entire response and does not +// need to be closed by the application. +func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader http.Header) (*Conn, *http.Response, error) { + if d == nil { + d = &nilDialer + } + + challengeKey, err := generateChallengeKey() + if err != nil { + return nil, nil, err + } + + u, err := url.Parse(urlStr) + if err != nil { + return nil, nil, err + } + + switch u.Scheme { + case "ws": + u.Scheme = "http" + case "wss": + u.Scheme = "https" + default: + return nil, nil, errMalformedURL + } + + if u.User != nil { + // User name and password are not allowed in websocket URIs. + return nil, nil, errMalformedURL + } + + req := &http.Request{ + Method: "GET", + URL: u, + Proto: "HTTP/1.1", + ProtoMajor: 1, + ProtoMinor: 1, + Header: make(http.Header), + Host: u.Host, + } + req = req.WithContext(ctx) + + // Set the cookies present in the cookie jar of the dialer + if d.Jar != nil { + for _, cookie := range d.Jar.Cookies(u) { + req.AddCookie(cookie) + } + } + + // Set the request headers using the capitalization for names and values in + // RFC examples. Although the capitalization shouldn't matter, there are + // servers that depend on it. The Header.Set method is not used because the + // method canonicalizes the header names. + req.Header["Upgrade"] = []string{"websocket"} + req.Header["Connection"] = []string{"Upgrade"} + req.Header["Sec-WebSocket-Key"] = []string{challengeKey} + req.Header["Sec-WebSocket-Version"] = []string{"13"} + if len(d.Subprotocols) > 0 { + req.Header["Sec-WebSocket-Protocol"] = []string{strings.Join(d.Subprotocols, ", ")} + } + for k, vs := range requestHeader { + switch { + case k == "Host": + if len(vs) > 0 { + req.Host = vs[0] + } + case k == "Upgrade" || + k == "Connection" || + k == "Sec-Websocket-Key" || + k == "Sec-Websocket-Version" || + k == "Sec-Websocket-Extensions" || + (k == "Sec-Websocket-Protocol" && len(d.Subprotocols) > 0): + return nil, nil, errors.New("websocket: duplicate header not allowed: " + k) + case k == "Sec-Websocket-Protocol": + req.Header["Sec-WebSocket-Protocol"] = vs + default: + req.Header[k] = vs + } + } + + if d.EnableCompression { + req.Header["Sec-WebSocket-Extensions"] = []string{"permessage-deflate; server_no_context_takeover; client_no_context_takeover"} + } + + if d.HandshakeTimeout != 0 { + var cancel func() + ctx, cancel = context.WithTimeout(ctx, d.HandshakeTimeout) + defer cancel() + } + + // Get network dial function. + var netDial func(network, add string) (net.Conn, error) + + if d.NetDialContext != nil { + netDial = func(network, addr string) (net.Conn, error) { + return d.NetDialContext(ctx, network, addr) + } + } else if d.NetDial != nil { + netDial = d.NetDial + } else { + netDialer := &net.Dialer{} + netDial = func(network, addr string) (net.Conn, error) { + return netDialer.DialContext(ctx, network, addr) + } + } + + // If needed, wrap the dial function to set the connection deadline. + if deadline, ok := ctx.Deadline(); ok { + forwardDial := netDial + netDial = func(network, addr string) (net.Conn, error) { + c, err := forwardDial(network, addr) + if err != nil { + return nil, err + } + err = c.SetDeadline(deadline) + if err != nil { + c.Close() + return nil, err + } + return c, nil + } + } + + // If needed, wrap the dial function to connect through a proxy. + if d.Proxy != nil { + proxyURL, err := d.Proxy(req) + if err != nil { + return nil, nil, err + } + if proxyURL != nil { + dialer, err := proxy_FromURL(proxyURL, netDialerFunc(netDial)) + if err != nil { + return nil, nil, err + } + netDial = dialer.Dial + } + } + + hostPort, hostNoPort := hostPortNoPort(u) + trace := httptrace.ContextClientTrace(ctx) + if trace != nil && trace.GetConn != nil { + trace.GetConn(hostPort) + } + + netConn, err := netDial("tcp", hostPort) + if trace != nil && trace.GotConn != nil { + trace.GotConn(httptrace.GotConnInfo{ + Conn: netConn, + }) + } + if err != nil { + return nil, nil, err + } + + defer func() { + if netConn != nil { + netConn.Close() + } + }() + + if u.Scheme == "https" { + cfg := cloneTLSConfig(d.TLSClientConfig) + if cfg.ServerName == "" { + cfg.ServerName = hostNoPort + } + tlsConn := tls.Client(netConn, cfg) + netConn = tlsConn + + var err error + if trace != nil { + err = doHandshakeWithTrace(trace, tlsConn, cfg) + } else { + err = doHandshake(tlsConn, cfg) + } + + if err != nil { + return nil, nil, err + } + } + + conn := newConn(netConn, false, d.ReadBufferSize, d.WriteBufferSize, d.WriteBufferPool, nil, nil) + + if err := req.Write(netConn); err != nil { + return nil, nil, err + } + + if trace != nil && trace.GotFirstResponseByte != nil { + if peek, err := conn.br.Peek(1); err == nil && len(peek) == 1 { + trace.GotFirstResponseByte() + } + } + + resp, err := http.ReadResponse(conn.br, req) + if err != nil { + return nil, nil, err + } + + if d.Jar != nil { + if rc := resp.Cookies(); len(rc) > 0 { + d.Jar.SetCookies(u, rc) + } + } + + if resp.StatusCode != 101 || + !strings.EqualFold(resp.Header.Get("Upgrade"), "websocket") || + !strings.EqualFold(resp.Header.Get("Connection"), "upgrade") || + resp.Header.Get("Sec-Websocket-Accept") != computeAcceptKey(challengeKey) { + // Before closing the network connection on return from this + // function, slurp up some of the response to aid application + // debugging. + buf := make([]byte, 1024) + n, _ := io.ReadFull(resp.Body, buf) + resp.Body = ioutil.NopCloser(bytes.NewReader(buf[:n])) + return nil, resp, ErrBadHandshake + } + + for _, ext := range parseExtensions(resp.Header) { + if ext[""] != "permessage-deflate" { + continue + } + _, snct := ext["server_no_context_takeover"] + _, cnct := ext["client_no_context_takeover"] + if !snct || !cnct { + return nil, resp, errInvalidCompression + } + conn.newCompressionWriter = compressNoContextTakeover + conn.newDecompressionReader = decompressNoContextTakeover + break + } + + resp.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) + conn.subprotocol = resp.Header.Get("Sec-Websocket-Protocol") + + netConn.SetDeadline(time.Time{}) + netConn = nil // to avoid close in defer. + return conn, resp, nil +} + +func doHandshake(tlsConn *tls.Conn, cfg *tls.Config) error { + if err := tlsConn.Handshake(); err != nil { + return err + } + if !cfg.InsecureSkipVerify { + if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/gorilla/websocket/client_clone.go b/vendor/github.com/gorilla/websocket/client_clone.go new file mode 100644 index 000000000000..4f0d943723a9 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/client_clone.go @@ -0,0 +1,16 @@ +// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.8 + +package websocket + +import "crypto/tls" + +func cloneTLSConfig(cfg *tls.Config) *tls.Config { + if cfg == nil { + return &tls.Config{} + } + return cfg.Clone() +} diff --git a/vendor/github.com/gorilla/websocket/client_clone_legacy.go b/vendor/github.com/gorilla/websocket/client_clone_legacy.go new file mode 100644 index 000000000000..babb007fb414 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/client_clone_legacy.go @@ -0,0 +1,38 @@ +// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.8 + +package websocket + +import "crypto/tls" + +// cloneTLSConfig clones all public fields except the fields +// SessionTicketsDisabled and SessionTicketKey. This avoids copying the +// sync.Mutex in the sync.Once and makes it safe to call cloneTLSConfig on a +// config in active use. +func cloneTLSConfig(cfg *tls.Config) *tls.Config { + if cfg == nil { + return &tls.Config{} + } + return &tls.Config{ + Rand: cfg.Rand, + Time: cfg.Time, + Certificates: cfg.Certificates, + NameToCertificate: cfg.NameToCertificate, + GetCertificate: cfg.GetCertificate, + RootCAs: cfg.RootCAs, + NextProtos: cfg.NextProtos, + ServerName: cfg.ServerName, + ClientAuth: cfg.ClientAuth, + ClientCAs: cfg.ClientCAs, + InsecureSkipVerify: cfg.InsecureSkipVerify, + CipherSuites: cfg.CipherSuites, + PreferServerCipherSuites: cfg.PreferServerCipherSuites, + ClientSessionCache: cfg.ClientSessionCache, + MinVersion: cfg.MinVersion, + MaxVersion: cfg.MaxVersion, + CurvePreferences: cfg.CurvePreferences, + } +} diff --git a/vendor/github.com/gorilla/websocket/compression.go b/vendor/github.com/gorilla/websocket/compression.go new file mode 100644 index 000000000000..813ffb1e8433 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/compression.go @@ -0,0 +1,148 @@ +// Copyright 2017 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "compress/flate" + "errors" + "io" + "strings" + "sync" +) + +const ( + minCompressionLevel = -2 // flate.HuffmanOnly not defined in Go < 1.6 + maxCompressionLevel = flate.BestCompression + defaultCompressionLevel = 1 +) + +var ( + flateWriterPools [maxCompressionLevel - minCompressionLevel + 1]sync.Pool + flateReaderPool = sync.Pool{New: func() interface{} { + return flate.NewReader(nil) + }} +) + +func decompressNoContextTakeover(r io.Reader) io.ReadCloser { + const tail = + // Add four bytes as specified in RFC + "\x00\x00\xff\xff" + + // Add final block to squelch unexpected EOF error from flate reader. + "\x01\x00\x00\xff\xff" + + fr, _ := flateReaderPool.Get().(io.ReadCloser) + fr.(flate.Resetter).Reset(io.MultiReader(r, strings.NewReader(tail)), nil) + return &flateReadWrapper{fr} +} + +func isValidCompressionLevel(level int) bool { + return minCompressionLevel <= level && level <= maxCompressionLevel +} + +func compressNoContextTakeover(w io.WriteCloser, level int) io.WriteCloser { + p := &flateWriterPools[level-minCompressionLevel] + tw := &truncWriter{w: w} + fw, _ := p.Get().(*flate.Writer) + if fw == nil { + fw, _ = flate.NewWriter(tw, level) + } else { + fw.Reset(tw) + } + return &flateWriteWrapper{fw: fw, tw: tw, p: p} +} + +// truncWriter is an io.Writer that writes all but the last four bytes of the +// stream to another io.Writer. +type truncWriter struct { + w io.WriteCloser + n int + p [4]byte +} + +func (w *truncWriter) Write(p []byte) (int, error) { + n := 0 + + // fill buffer first for simplicity. + if w.n < len(w.p) { + n = copy(w.p[w.n:], p) + p = p[n:] + w.n += n + if len(p) == 0 { + return n, nil + } + } + + m := len(p) + if m > len(w.p) { + m = len(w.p) + } + + if nn, err := w.w.Write(w.p[:m]); err != nil { + return n + nn, err + } + + copy(w.p[:], w.p[m:]) + copy(w.p[len(w.p)-m:], p[len(p)-m:]) + nn, err := w.w.Write(p[:len(p)-m]) + return n + nn, err +} + +type flateWriteWrapper struct { + fw *flate.Writer + tw *truncWriter + p *sync.Pool +} + +func (w *flateWriteWrapper) Write(p []byte) (int, error) { + if w.fw == nil { + return 0, errWriteClosed + } + return w.fw.Write(p) +} + +func (w *flateWriteWrapper) Close() error { + if w.fw == nil { + return errWriteClosed + } + err1 := w.fw.Flush() + w.p.Put(w.fw) + w.fw = nil + if w.tw.p != [4]byte{0, 0, 0xff, 0xff} { + return errors.New("websocket: internal error, unexpected bytes at end of flate stream") + } + err2 := w.tw.w.Close() + if err1 != nil { + return err1 + } + return err2 +} + +type flateReadWrapper struct { + fr io.ReadCloser +} + +func (r *flateReadWrapper) Read(p []byte) (int, error) { + if r.fr == nil { + return 0, io.ErrClosedPipe + } + n, err := r.fr.Read(p) + if err == io.EOF { + // Preemptively place the reader back in the pool. This helps with + // scenarios where the application does not call NextReader() soon after + // this final read. + r.Close() + } + return n, err +} + +func (r *flateReadWrapper) Close() error { + if r.fr == nil { + return io.ErrClosedPipe + } + err := r.fr.Close() + flateReaderPool.Put(r.fr) + r.fr = nil + return err +} diff --git a/vendor/github.com/gorilla/websocket/conn.go b/vendor/github.com/gorilla/websocket/conn.go new file mode 100644 index 000000000000..9971ea363077 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/conn.go @@ -0,0 +1,1163 @@ +// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "bufio" + "encoding/binary" + "errors" + "io" + "io/ioutil" + "math/rand" + "net" + "strconv" + "sync" + "time" + "unicode/utf8" +) + +const ( + // Frame header byte 0 bits from Section 5.2 of RFC 6455 + finalBit = 1 << 7 + rsv1Bit = 1 << 6 + rsv2Bit = 1 << 5 + rsv3Bit = 1 << 4 + + // Frame header byte 1 bits from Section 5.2 of RFC 6455 + maskBit = 1 << 7 + + maxFrameHeaderSize = 2 + 8 + 4 // Fixed header + length + mask + maxControlFramePayloadSize = 125 + + writeWait = time.Second + + defaultReadBufferSize = 4096 + defaultWriteBufferSize = 4096 + + continuationFrame = 0 + noFrame = -1 +) + +// Close codes defined in RFC 6455, section 11.7. +const ( + CloseNormalClosure = 1000 + CloseGoingAway = 1001 + CloseProtocolError = 1002 + CloseUnsupportedData = 1003 + CloseNoStatusReceived = 1005 + CloseAbnormalClosure = 1006 + CloseInvalidFramePayloadData = 1007 + ClosePolicyViolation = 1008 + CloseMessageTooBig = 1009 + CloseMandatoryExtension = 1010 + CloseInternalServerErr = 1011 + CloseServiceRestart = 1012 + CloseTryAgainLater = 1013 + CloseTLSHandshake = 1015 +) + +// The message types are defined in RFC 6455, section 11.8. +const ( + // TextMessage denotes a text data message. The text message payload is + // interpreted as UTF-8 encoded text data. + TextMessage = 1 + + // BinaryMessage denotes a binary data message. + BinaryMessage = 2 + + // CloseMessage denotes a close control message. The optional message + // payload contains a numeric code and text. Use the FormatCloseMessage + // function to format a close message payload. + CloseMessage = 8 + + // PingMessage denotes a ping control message. The optional message payload + // is UTF-8 encoded text. + PingMessage = 9 + + // PongMessage denotes a pong control message. The optional message payload + // is UTF-8 encoded text. + PongMessage = 10 +) + +// ErrCloseSent is returned when the application writes a message to the +// connection after sending a close message. +var ErrCloseSent = errors.New("websocket: close sent") + +// ErrReadLimit is returned when reading a message that is larger than the +// read limit set for the connection. +var ErrReadLimit = errors.New("websocket: read limit exceeded") + +// netError satisfies the net Error interface. +type netError struct { + msg string + temporary bool + timeout bool +} + +func (e *netError) Error() string { return e.msg } +func (e *netError) Temporary() bool { return e.temporary } +func (e *netError) Timeout() bool { return e.timeout } + +// CloseError represents a close message. +type CloseError struct { + // Code is defined in RFC 6455, section 11.7. + Code int + + // Text is the optional text payload. + Text string +} + +func (e *CloseError) Error() string { + s := []byte("websocket: close ") + s = strconv.AppendInt(s, int64(e.Code), 10) + switch e.Code { + case CloseNormalClosure: + s = append(s, " (normal)"...) + case CloseGoingAway: + s = append(s, " (going away)"...) + case CloseProtocolError: + s = append(s, " (protocol error)"...) + case CloseUnsupportedData: + s = append(s, " (unsupported data)"...) + case CloseNoStatusReceived: + s = append(s, " (no status)"...) + case CloseAbnormalClosure: + s = append(s, " (abnormal closure)"...) + case CloseInvalidFramePayloadData: + s = append(s, " (invalid payload data)"...) + case ClosePolicyViolation: + s = append(s, " (policy violation)"...) + case CloseMessageTooBig: + s = append(s, " (message too big)"...) + case CloseMandatoryExtension: + s = append(s, " (mandatory extension missing)"...) + case CloseInternalServerErr: + s = append(s, " (internal server error)"...) + case CloseTLSHandshake: + s = append(s, " (TLS handshake error)"...) + } + if e.Text != "" { + s = append(s, ": "...) + s = append(s, e.Text...) + } + return string(s) +} + +// IsCloseError returns boolean indicating whether the error is a *CloseError +// with one of the specified codes. +func IsCloseError(err error, codes ...int) bool { + if e, ok := err.(*CloseError); ok { + for _, code := range codes { + if e.Code == code { + return true + } + } + } + return false +} + +// IsUnexpectedCloseError returns boolean indicating whether the error is a +// *CloseError with a code not in the list of expected codes. +func IsUnexpectedCloseError(err error, expectedCodes ...int) bool { + if e, ok := err.(*CloseError); ok { + for _, code := range expectedCodes { + if e.Code == code { + return false + } + } + return true + } + return false +} + +var ( + errWriteTimeout = &netError{msg: "websocket: write timeout", timeout: true, temporary: true} + errUnexpectedEOF = &CloseError{Code: CloseAbnormalClosure, Text: io.ErrUnexpectedEOF.Error()} + errBadWriteOpCode = errors.New("websocket: bad write message type") + errWriteClosed = errors.New("websocket: write closed") + errInvalidControlFrame = errors.New("websocket: invalid control frame") +) + +func newMaskKey() [4]byte { + n := rand.Uint32() + return [4]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)} +} + +func hideTempErr(err error) error { + if e, ok := err.(net.Error); ok && e.Temporary() { + err = &netError{msg: e.Error(), timeout: e.Timeout()} + } + return err +} + +func isControl(frameType int) bool { + return frameType == CloseMessage || frameType == PingMessage || frameType == PongMessage +} + +func isData(frameType int) bool { + return frameType == TextMessage || frameType == BinaryMessage +} + +var validReceivedCloseCodes = map[int]bool{ + // see http://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number + + CloseNormalClosure: true, + CloseGoingAway: true, + CloseProtocolError: true, + CloseUnsupportedData: true, + CloseNoStatusReceived: false, + CloseAbnormalClosure: false, + CloseInvalidFramePayloadData: true, + ClosePolicyViolation: true, + CloseMessageTooBig: true, + CloseMandatoryExtension: true, + CloseInternalServerErr: true, + CloseServiceRestart: true, + CloseTryAgainLater: true, + CloseTLSHandshake: false, +} + +func isValidReceivedCloseCode(code int) bool { + return validReceivedCloseCodes[code] || (code >= 3000 && code <= 4999) +} + +// BufferPool represents a pool of buffers. The *sync.Pool type satisfies this +// interface. The type of the value stored in a pool is not specified. +type BufferPool interface { + // Get gets a value from the pool or returns nil if the pool is empty. + Get() interface{} + // Put adds a value to the pool. + Put(interface{}) +} + +// writePoolData is the type added to the write buffer pool. This wrapper is +// used to prevent applications from peeking at and depending on the values +// added to the pool. +type writePoolData struct{ buf []byte } + +// The Conn type represents a WebSocket connection. +type Conn struct { + conn net.Conn + isServer bool + subprotocol string + + // Write fields + mu chan bool // used as mutex to protect write to conn + writeBuf []byte // frame is constructed in this buffer. + writePool BufferPool + writeBufSize int + writeDeadline time.Time + writer io.WriteCloser // the current writer returned to the application + isWriting bool // for best-effort concurrent write detection + + writeErrMu sync.Mutex + writeErr error + + enableWriteCompression bool + compressionLevel int + newCompressionWriter func(io.WriteCloser, int) io.WriteCloser + + // Read fields + reader io.ReadCloser // the current reader returned to the application + readErr error + br *bufio.Reader + readRemaining int64 // bytes remaining in current frame. + readFinal bool // true the current message has more frames. + readLength int64 // Message size. + readLimit int64 // Maximum message size. + readMaskPos int + readMaskKey [4]byte + handlePong func(string) error + handlePing func(string) error + handleClose func(int, string) error + readErrCount int + messageReader *messageReader // the current low-level reader + + readDecompress bool // whether last read frame had RSV1 set + newDecompressionReader func(io.Reader) io.ReadCloser +} + +func newConn(conn net.Conn, isServer bool, readBufferSize, writeBufferSize int, writeBufferPool BufferPool, br *bufio.Reader, writeBuf []byte) *Conn { + + if br == nil { + if readBufferSize == 0 { + readBufferSize = defaultReadBufferSize + } else if readBufferSize < maxControlFramePayloadSize { + // must be large enough for control frame + readBufferSize = maxControlFramePayloadSize + } + br = bufio.NewReaderSize(conn, readBufferSize) + } + + if writeBufferSize <= 0 { + writeBufferSize = defaultWriteBufferSize + } + writeBufferSize += maxFrameHeaderSize + + if writeBuf == nil && writeBufferPool == nil { + writeBuf = make([]byte, writeBufferSize) + } + + mu := make(chan bool, 1) + mu <- true + c := &Conn{ + isServer: isServer, + br: br, + conn: conn, + mu: mu, + readFinal: true, + writeBuf: writeBuf, + writePool: writeBufferPool, + writeBufSize: writeBufferSize, + enableWriteCompression: true, + compressionLevel: defaultCompressionLevel, + } + c.SetCloseHandler(nil) + c.SetPingHandler(nil) + c.SetPongHandler(nil) + return c +} + +// Subprotocol returns the negotiated protocol for the connection. +func (c *Conn) Subprotocol() string { + return c.subprotocol +} + +// Close closes the underlying network connection without sending or waiting +// for a close message. +func (c *Conn) Close() error { + return c.conn.Close() +} + +// LocalAddr returns the local network address. +func (c *Conn) LocalAddr() net.Addr { + return c.conn.LocalAddr() +} + +// RemoteAddr returns the remote network address. +func (c *Conn) RemoteAddr() net.Addr { + return c.conn.RemoteAddr() +} + +// Write methods + +func (c *Conn) writeFatal(err error) error { + err = hideTempErr(err) + c.writeErrMu.Lock() + if c.writeErr == nil { + c.writeErr = err + } + c.writeErrMu.Unlock() + return err +} + +func (c *Conn) read(n int) ([]byte, error) { + p, err := c.br.Peek(n) + if err == io.EOF { + err = errUnexpectedEOF + } + c.br.Discard(len(p)) + return p, err +} + +func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error { + <-c.mu + defer func() { c.mu <- true }() + + c.writeErrMu.Lock() + err := c.writeErr + c.writeErrMu.Unlock() + if err != nil { + return err + } + + c.conn.SetWriteDeadline(deadline) + if len(buf1) == 0 { + _, err = c.conn.Write(buf0) + } else { + err = c.writeBufs(buf0, buf1) + } + if err != nil { + return c.writeFatal(err) + } + if frameType == CloseMessage { + c.writeFatal(ErrCloseSent) + } + return nil +} + +// WriteControl writes a control message with the given deadline. The allowed +// message types are CloseMessage, PingMessage and PongMessage. +func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) error { + if !isControl(messageType) { + return errBadWriteOpCode + } + if len(data) > maxControlFramePayloadSize { + return errInvalidControlFrame + } + + b0 := byte(messageType) | finalBit + b1 := byte(len(data)) + if !c.isServer { + b1 |= maskBit + } + + buf := make([]byte, 0, maxFrameHeaderSize+maxControlFramePayloadSize) + buf = append(buf, b0, b1) + + if c.isServer { + buf = append(buf, data...) + } else { + key := newMaskKey() + buf = append(buf, key[:]...) + buf = append(buf, data...) + maskBytes(key, 0, buf[6:]) + } + + d := time.Hour * 1000 + if !deadline.IsZero() { + d = deadline.Sub(time.Now()) + if d < 0 { + return errWriteTimeout + } + } + + timer := time.NewTimer(d) + select { + case <-c.mu: + timer.Stop() + case <-timer.C: + return errWriteTimeout + } + defer func() { c.mu <- true }() + + c.writeErrMu.Lock() + err := c.writeErr + c.writeErrMu.Unlock() + if err != nil { + return err + } + + c.conn.SetWriteDeadline(deadline) + _, err = c.conn.Write(buf) + if err != nil { + return c.writeFatal(err) + } + if messageType == CloseMessage { + c.writeFatal(ErrCloseSent) + } + return err +} + +// beginMessage prepares a connection and message writer for a new message. +func (c *Conn) beginMessage(mw *messageWriter, messageType int) error { + // Close previous writer if not already closed by the application. It's + // probably better to return an error in this situation, but we cannot + // change this without breaking existing applications. + if c.writer != nil { + c.writer.Close() + c.writer = nil + } + + if !isControl(messageType) && !isData(messageType) { + return errBadWriteOpCode + } + + c.writeErrMu.Lock() + err := c.writeErr + c.writeErrMu.Unlock() + if err != nil { + return err + } + + mw.c = c + mw.frameType = messageType + mw.pos = maxFrameHeaderSize + + if c.writeBuf == nil { + wpd, ok := c.writePool.Get().(writePoolData) + if ok { + c.writeBuf = wpd.buf + } else { + c.writeBuf = make([]byte, c.writeBufSize) + } + } + return nil +} + +// NextWriter returns a writer for the next message to send. The writer's Close +// method flushes the complete message to the network. +// +// There can be at most one open writer on a connection. NextWriter closes the +// previous writer if the application has not already done so. +// +// All message types (TextMessage, BinaryMessage, CloseMessage, PingMessage and +// PongMessage) are supported. +func (c *Conn) NextWriter(messageType int) (io.WriteCloser, error) { + var mw messageWriter + if err := c.beginMessage(&mw, messageType); err != nil { + return nil, err + } + c.writer = &mw + if c.newCompressionWriter != nil && c.enableWriteCompression && isData(messageType) { + w := c.newCompressionWriter(c.writer, c.compressionLevel) + mw.compress = true + c.writer = w + } + return c.writer, nil +} + +type messageWriter struct { + c *Conn + compress bool // whether next call to flushFrame should set RSV1 + pos int // end of data in writeBuf. + frameType int // type of the current frame. + err error +} + +func (w *messageWriter) endMessage(err error) error { + if w.err != nil { + return err + } + c := w.c + w.err = err + c.writer = nil + if c.writePool != nil { + c.writePool.Put(writePoolData{buf: c.writeBuf}) + c.writeBuf = nil + } + return err +} + +// flushFrame writes buffered data and extra as a frame to the network. The +// final argument indicates that this is the last frame in the message. +func (w *messageWriter) flushFrame(final bool, extra []byte) error { + c := w.c + length := w.pos - maxFrameHeaderSize + len(extra) + + // Check for invalid control frames. + if isControl(w.frameType) && + (!final || length > maxControlFramePayloadSize) { + return w.endMessage(errInvalidControlFrame) + } + + b0 := byte(w.frameType) + if final { + b0 |= finalBit + } + if w.compress { + b0 |= rsv1Bit + } + w.compress = false + + b1 := byte(0) + if !c.isServer { + b1 |= maskBit + } + + // Assume that the frame starts at beginning of c.writeBuf. + framePos := 0 + if c.isServer { + // Adjust up if mask not included in the header. + framePos = 4 + } + + switch { + case length >= 65536: + c.writeBuf[framePos] = b0 + c.writeBuf[framePos+1] = b1 | 127 + binary.BigEndian.PutUint64(c.writeBuf[framePos+2:], uint64(length)) + case length > 125: + framePos += 6 + c.writeBuf[framePos] = b0 + c.writeBuf[framePos+1] = b1 | 126 + binary.BigEndian.PutUint16(c.writeBuf[framePos+2:], uint16(length)) + default: + framePos += 8 + c.writeBuf[framePos] = b0 + c.writeBuf[framePos+1] = b1 | byte(length) + } + + if !c.isServer { + key := newMaskKey() + copy(c.writeBuf[maxFrameHeaderSize-4:], key[:]) + maskBytes(key, 0, c.writeBuf[maxFrameHeaderSize:w.pos]) + if len(extra) > 0 { + return w.endMessage(c.writeFatal(errors.New("websocket: internal error, extra used in client mode"))) + } + } + + // Write the buffers to the connection with best-effort detection of + // concurrent writes. See the concurrency section in the package + // documentation for more info. + + if c.isWriting { + panic("concurrent write to websocket connection") + } + c.isWriting = true + + err := c.write(w.frameType, c.writeDeadline, c.writeBuf[framePos:w.pos], extra) + + if !c.isWriting { + panic("concurrent write to websocket connection") + } + c.isWriting = false + + if err != nil { + return w.endMessage(err) + } + + if final { + w.endMessage(errWriteClosed) + return nil + } + + // Setup for next frame. + w.pos = maxFrameHeaderSize + w.frameType = continuationFrame + return nil +} + +func (w *messageWriter) ncopy(max int) (int, error) { + n := len(w.c.writeBuf) - w.pos + if n <= 0 { + if err := w.flushFrame(false, nil); err != nil { + return 0, err + } + n = len(w.c.writeBuf) - w.pos + } + if n > max { + n = max + } + return n, nil +} + +func (w *messageWriter) Write(p []byte) (int, error) { + if w.err != nil { + return 0, w.err + } + + if len(p) > 2*len(w.c.writeBuf) && w.c.isServer { + // Don't buffer large messages. + err := w.flushFrame(false, p) + if err != nil { + return 0, err + } + return len(p), nil + } + + nn := len(p) + for len(p) > 0 { + n, err := w.ncopy(len(p)) + if err != nil { + return 0, err + } + copy(w.c.writeBuf[w.pos:], p[:n]) + w.pos += n + p = p[n:] + } + return nn, nil +} + +func (w *messageWriter) WriteString(p string) (int, error) { + if w.err != nil { + return 0, w.err + } + + nn := len(p) + for len(p) > 0 { + n, err := w.ncopy(len(p)) + if err != nil { + return 0, err + } + copy(w.c.writeBuf[w.pos:], p[:n]) + w.pos += n + p = p[n:] + } + return nn, nil +} + +func (w *messageWriter) ReadFrom(r io.Reader) (nn int64, err error) { + if w.err != nil { + return 0, w.err + } + for { + if w.pos == len(w.c.writeBuf) { + err = w.flushFrame(false, nil) + if err != nil { + break + } + } + var n int + n, err = r.Read(w.c.writeBuf[w.pos:]) + w.pos += n + nn += int64(n) + if err != nil { + if err == io.EOF { + err = nil + } + break + } + } + return nn, err +} + +func (w *messageWriter) Close() error { + if w.err != nil { + return w.err + } + return w.flushFrame(true, nil) +} + +// WritePreparedMessage writes prepared message into connection. +func (c *Conn) WritePreparedMessage(pm *PreparedMessage) error { + frameType, frameData, err := pm.frame(prepareKey{ + isServer: c.isServer, + compress: c.newCompressionWriter != nil && c.enableWriteCompression && isData(pm.messageType), + compressionLevel: c.compressionLevel, + }) + if err != nil { + return err + } + if c.isWriting { + panic("concurrent write to websocket connection") + } + c.isWriting = true + err = c.write(frameType, c.writeDeadline, frameData, nil) + if !c.isWriting { + panic("concurrent write to websocket connection") + } + c.isWriting = false + return err +} + +// WriteMessage is a helper method for getting a writer using NextWriter, +// writing the message and closing the writer. +func (c *Conn) WriteMessage(messageType int, data []byte) error { + + if c.isServer && (c.newCompressionWriter == nil || !c.enableWriteCompression) { + // Fast path with no allocations and single frame. + + var mw messageWriter + if err := c.beginMessage(&mw, messageType); err != nil { + return err + } + n := copy(c.writeBuf[mw.pos:], data) + mw.pos += n + data = data[n:] + return mw.flushFrame(true, data) + } + + w, err := c.NextWriter(messageType) + if err != nil { + return err + } + if _, err = w.Write(data); err != nil { + return err + } + return w.Close() +} + +// SetWriteDeadline sets the write deadline on the underlying network +// connection. After a write has timed out, the websocket state is corrupt and +// all future writes will return an error. A zero value for t means writes will +// not time out. +func (c *Conn) SetWriteDeadline(t time.Time) error { + c.writeDeadline = t + return nil +} + +// Read methods + +func (c *Conn) advanceFrame() (int, error) { + // 1. Skip remainder of previous frame. + + if c.readRemaining > 0 { + if _, err := io.CopyN(ioutil.Discard, c.br, c.readRemaining); err != nil { + return noFrame, err + } + } + + // 2. Read and parse first two bytes of frame header. + + p, err := c.read(2) + if err != nil { + return noFrame, err + } + + final := p[0]&finalBit != 0 + frameType := int(p[0] & 0xf) + mask := p[1]&maskBit != 0 + c.readRemaining = int64(p[1] & 0x7f) + + c.readDecompress = false + if c.newDecompressionReader != nil && (p[0]&rsv1Bit) != 0 { + c.readDecompress = true + p[0] &^= rsv1Bit + } + + if rsv := p[0] & (rsv1Bit | rsv2Bit | rsv3Bit); rsv != 0 { + return noFrame, c.handleProtocolError("unexpected reserved bits 0x" + strconv.FormatInt(int64(rsv), 16)) + } + + switch frameType { + case CloseMessage, PingMessage, PongMessage: + if c.readRemaining > maxControlFramePayloadSize { + return noFrame, c.handleProtocolError("control frame length > 125") + } + if !final { + return noFrame, c.handleProtocolError("control frame not final") + } + case TextMessage, BinaryMessage: + if !c.readFinal { + return noFrame, c.handleProtocolError("message start before final message frame") + } + c.readFinal = final + case continuationFrame: + if c.readFinal { + return noFrame, c.handleProtocolError("continuation after final message frame") + } + c.readFinal = final + default: + return noFrame, c.handleProtocolError("unknown opcode " + strconv.Itoa(frameType)) + } + + // 3. Read and parse frame length. + + switch c.readRemaining { + case 126: + p, err := c.read(2) + if err != nil { + return noFrame, err + } + c.readRemaining = int64(binary.BigEndian.Uint16(p)) + case 127: + p, err := c.read(8) + if err != nil { + return noFrame, err + } + c.readRemaining = int64(binary.BigEndian.Uint64(p)) + } + + // 4. Handle frame masking. + + if mask != c.isServer { + return noFrame, c.handleProtocolError("incorrect mask flag") + } + + if mask { + c.readMaskPos = 0 + p, err := c.read(len(c.readMaskKey)) + if err != nil { + return noFrame, err + } + copy(c.readMaskKey[:], p) + } + + // 5. For text and binary messages, enforce read limit and return. + + if frameType == continuationFrame || frameType == TextMessage || frameType == BinaryMessage { + + c.readLength += c.readRemaining + if c.readLimit > 0 && c.readLength > c.readLimit { + c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait)) + return noFrame, ErrReadLimit + } + + return frameType, nil + } + + // 6. Read control frame payload. + + var payload []byte + if c.readRemaining > 0 { + payload, err = c.read(int(c.readRemaining)) + c.readRemaining = 0 + if err != nil { + return noFrame, err + } + if c.isServer { + maskBytes(c.readMaskKey, 0, payload) + } + } + + // 7. Process control frame payload. + + switch frameType { + case PongMessage: + if err := c.handlePong(string(payload)); err != nil { + return noFrame, err + } + case PingMessage: + if err := c.handlePing(string(payload)); err != nil { + return noFrame, err + } + case CloseMessage: + closeCode := CloseNoStatusReceived + closeText := "" + if len(payload) >= 2 { + closeCode = int(binary.BigEndian.Uint16(payload)) + if !isValidReceivedCloseCode(closeCode) { + return noFrame, c.handleProtocolError("invalid close code") + } + closeText = string(payload[2:]) + if !utf8.ValidString(closeText) { + return noFrame, c.handleProtocolError("invalid utf8 payload in close frame") + } + } + if err := c.handleClose(closeCode, closeText); err != nil { + return noFrame, err + } + return noFrame, &CloseError{Code: closeCode, Text: closeText} + } + + return frameType, nil +} + +func (c *Conn) handleProtocolError(message string) error { + c.WriteControl(CloseMessage, FormatCloseMessage(CloseProtocolError, message), time.Now().Add(writeWait)) + return errors.New("websocket: " + message) +} + +// NextReader returns the next data message received from the peer. The +// returned messageType is either TextMessage or BinaryMessage. +// +// There can be at most one open reader on a connection. NextReader discards +// the previous message if the application has not already consumed it. +// +// Applications must break out of the application's read loop when this method +// returns a non-nil error value. Errors returned from this method are +// permanent. Once this method returns a non-nil error, all subsequent calls to +// this method return the same error. +func (c *Conn) NextReader() (messageType int, r io.Reader, err error) { + // Close previous reader, only relevant for decompression. + if c.reader != nil { + c.reader.Close() + c.reader = nil + } + + c.messageReader = nil + c.readLength = 0 + + for c.readErr == nil { + frameType, err := c.advanceFrame() + if err != nil { + c.readErr = hideTempErr(err) + break + } + if frameType == TextMessage || frameType == BinaryMessage { + c.messageReader = &messageReader{c} + c.reader = c.messageReader + if c.readDecompress { + c.reader = c.newDecompressionReader(c.reader) + } + return frameType, c.reader, nil + } + } + + // Applications that do handle the error returned from this method spin in + // tight loop on connection failure. To help application developers detect + // this error, panic on repeated reads to the failed connection. + c.readErrCount++ + if c.readErrCount >= 1000 { + panic("repeated read on failed websocket connection") + } + + return noFrame, nil, c.readErr +} + +type messageReader struct{ c *Conn } + +func (r *messageReader) Read(b []byte) (int, error) { + c := r.c + if c.messageReader != r { + return 0, io.EOF + } + + for c.readErr == nil { + + if c.readRemaining > 0 { + if int64(len(b)) > c.readRemaining { + b = b[:c.readRemaining] + } + n, err := c.br.Read(b) + c.readErr = hideTempErr(err) + if c.isServer { + c.readMaskPos = maskBytes(c.readMaskKey, c.readMaskPos, b[:n]) + } + c.readRemaining -= int64(n) + if c.readRemaining > 0 && c.readErr == io.EOF { + c.readErr = errUnexpectedEOF + } + return n, c.readErr + } + + if c.readFinal { + c.messageReader = nil + return 0, io.EOF + } + + frameType, err := c.advanceFrame() + switch { + case err != nil: + c.readErr = hideTempErr(err) + case frameType == TextMessage || frameType == BinaryMessage: + c.readErr = errors.New("websocket: internal error, unexpected text or binary in Reader") + } + } + + err := c.readErr + if err == io.EOF && c.messageReader == r { + err = errUnexpectedEOF + } + return 0, err +} + +func (r *messageReader) Close() error { + return nil +} + +// ReadMessage is a helper method for getting a reader using NextReader and +// reading from that reader to a buffer. +func (c *Conn) ReadMessage() (messageType int, p []byte, err error) { + var r io.Reader + messageType, r, err = c.NextReader() + if err != nil { + return messageType, nil, err + } + p, err = ioutil.ReadAll(r) + return messageType, p, err +} + +// SetReadDeadline sets the read deadline on the underlying network connection. +// After a read has timed out, the websocket connection state is corrupt and +// all future reads will return an error. A zero value for t means reads will +// not time out. +func (c *Conn) SetReadDeadline(t time.Time) error { + return c.conn.SetReadDeadline(t) +} + +// SetReadLimit sets the maximum size in bytes for a message read from the peer. If a +// message exceeds the limit, the connection sends a close message to the peer +// and returns ErrReadLimit to the application. +func (c *Conn) SetReadLimit(limit int64) { + c.readLimit = limit +} + +// CloseHandler returns the current close handler +func (c *Conn) CloseHandler() func(code int, text string) error { + return c.handleClose +} + +// SetCloseHandler sets the handler for close messages received from the peer. +// The code argument to h is the received close code or CloseNoStatusReceived +// if the close message is empty. The default close handler sends a close +// message back to the peer. +// +// The handler function is called from the NextReader, ReadMessage and message +// reader Read methods. The application must read the connection to process +// close messages as described in the section on Control Messages above. +// +// The connection read methods return a CloseError when a close message is +// received. Most applications should handle close messages as part of their +// normal error handling. Applications should only set a close handler when the +// application must perform some action before sending a close message back to +// the peer. +func (c *Conn) SetCloseHandler(h func(code int, text string) error) { + if h == nil { + h = func(code int, text string) error { + message := FormatCloseMessage(code, "") + c.WriteControl(CloseMessage, message, time.Now().Add(writeWait)) + return nil + } + } + c.handleClose = h +} + +// PingHandler returns the current ping handler +func (c *Conn) PingHandler() func(appData string) error { + return c.handlePing +} + +// SetPingHandler sets the handler for ping messages received from the peer. +// The appData argument to h is the PING message application data. The default +// ping handler sends a pong to the peer. +// +// The handler function is called from the NextReader, ReadMessage and message +// reader Read methods. The application must read the connection to process +// ping messages as described in the section on Control Messages above. +func (c *Conn) SetPingHandler(h func(appData string) error) { + if h == nil { + h = func(message string) error { + err := c.WriteControl(PongMessage, []byte(message), time.Now().Add(writeWait)) + if err == ErrCloseSent { + return nil + } else if e, ok := err.(net.Error); ok && e.Temporary() { + return nil + } + return err + } + } + c.handlePing = h +} + +// PongHandler returns the current pong handler +func (c *Conn) PongHandler() func(appData string) error { + return c.handlePong +} + +// SetPongHandler sets the handler for pong messages received from the peer. +// The appData argument to h is the PONG message application data. The default +// pong handler does nothing. +// +// The handler function is called from the NextReader, ReadMessage and message +// reader Read methods. The application must read the connection to process +// pong messages as described in the section on Control Messages above. +func (c *Conn) SetPongHandler(h func(appData string) error) { + if h == nil { + h = func(string) error { return nil } + } + c.handlePong = h +} + +// UnderlyingConn returns the internal net.Conn. This can be used to further +// modifications to connection specific flags. +func (c *Conn) UnderlyingConn() net.Conn { + return c.conn +} + +// EnableWriteCompression enables and disables write compression of +// subsequent text and binary messages. This function is a noop if +// compression was not negotiated with the peer. +func (c *Conn) EnableWriteCompression(enable bool) { + c.enableWriteCompression = enable +} + +// SetCompressionLevel sets the flate compression level for subsequent text and +// binary messages. This function is a noop if compression was not negotiated +// with the peer. See the compress/flate package for a description of +// compression levels. +func (c *Conn) SetCompressionLevel(level int) error { + if !isValidCompressionLevel(level) { + return errors.New("websocket: invalid compression level") + } + c.compressionLevel = level + return nil +} + +// FormatCloseMessage formats closeCode and text as a WebSocket close message. +// An empty message is returned for code CloseNoStatusReceived. +func FormatCloseMessage(closeCode int, text string) []byte { + if closeCode == CloseNoStatusReceived { + // Return empty message because it's illegal to send + // CloseNoStatusReceived. Return non-nil value in case application + // checks for nil. + return []byte{} + } + buf := make([]byte, 2+len(text)) + binary.BigEndian.PutUint16(buf, uint16(closeCode)) + copy(buf[2:], text) + return buf +} diff --git a/vendor/github.com/gorilla/websocket/conn_write.go b/vendor/github.com/gorilla/websocket/conn_write.go new file mode 100644 index 000000000000..a509a21f87af --- /dev/null +++ b/vendor/github.com/gorilla/websocket/conn_write.go @@ -0,0 +1,15 @@ +// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.8 + +package websocket + +import "net" + +func (c *Conn) writeBufs(bufs ...[]byte) error { + b := net.Buffers(bufs) + _, err := b.WriteTo(c.conn) + return err +} diff --git a/vendor/github.com/gorilla/websocket/conn_write_legacy.go b/vendor/github.com/gorilla/websocket/conn_write_legacy.go new file mode 100644 index 000000000000..37edaff5a578 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/conn_write_legacy.go @@ -0,0 +1,18 @@ +// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.8 + +package websocket + +func (c *Conn) writeBufs(bufs ...[]byte) error { + for _, buf := range bufs { + if len(buf) > 0 { + if _, err := c.conn.Write(buf); err != nil { + return err + } + } + } + return nil +} diff --git a/vendor/github.com/gorilla/websocket/doc.go b/vendor/github.com/gorilla/websocket/doc.go new file mode 100644 index 000000000000..c6f4df8960ff --- /dev/null +++ b/vendor/github.com/gorilla/websocket/doc.go @@ -0,0 +1,227 @@ +// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package websocket implements the WebSocket protocol defined in RFC 6455. +// +// Overview +// +// The Conn type represents a WebSocket connection. A server application calls +// the Upgrader.Upgrade method from an HTTP request handler to get a *Conn: +// +// var upgrader = websocket.Upgrader{ +// ReadBufferSize: 1024, +// WriteBufferSize: 1024, +// } +// +// func handler(w http.ResponseWriter, r *http.Request) { +// conn, err := upgrader.Upgrade(w, r, nil) +// if err != nil { +// log.Println(err) +// return +// } +// ... Use conn to send and receive messages. +// } +// +// Call the connection's WriteMessage and ReadMessage methods to send and +// receive messages as a slice of bytes. This snippet of code shows how to echo +// messages using these methods: +// +// for { +// messageType, p, err := conn.ReadMessage() +// if err != nil { +// log.Println(err) +// return +// } +// if err := conn.WriteMessage(messageType, p); err != nil { +// log.Println(err) +// return +// } +// } +// +// In above snippet of code, p is a []byte and messageType is an int with value +// websocket.BinaryMessage or websocket.TextMessage. +// +// An application can also send and receive messages using the io.WriteCloser +// and io.Reader interfaces. To send a message, call the connection NextWriter +// method to get an io.WriteCloser, write the message to the writer and close +// the writer when done. To receive a message, call the connection NextReader +// method to get an io.Reader and read until io.EOF is returned. This snippet +// shows how to echo messages using the NextWriter and NextReader methods: +// +// for { +// messageType, r, err := conn.NextReader() +// if err != nil { +// return +// } +// w, err := conn.NextWriter(messageType) +// if err != nil { +// return err +// } +// if _, err := io.Copy(w, r); err != nil { +// return err +// } +// if err := w.Close(); err != nil { +// return err +// } +// } +// +// Data Messages +// +// The WebSocket protocol distinguishes between text and binary data messages. +// Text messages are interpreted as UTF-8 encoded text. The interpretation of +// binary messages is left to the application. +// +// This package uses the TextMessage and BinaryMessage integer constants to +// identify the two data message types. The ReadMessage and NextReader methods +// return the type of the received message. The messageType argument to the +// WriteMessage and NextWriter methods specifies the type of a sent message. +// +// It is the application's responsibility to ensure that text messages are +// valid UTF-8 encoded text. +// +// Control Messages +// +// The WebSocket protocol defines three types of control messages: close, ping +// and pong. Call the connection WriteControl, WriteMessage or NextWriter +// methods to send a control message to the peer. +// +// Connections handle received close messages by calling the handler function +// set with the SetCloseHandler method and by returning a *CloseError from the +// NextReader, ReadMessage or the message Read method. The default close +// handler sends a close message to the peer. +// +// Connections handle received ping messages by calling the handler function +// set with the SetPingHandler method. The default ping handler sends a pong +// message to the peer. +// +// Connections handle received pong messages by calling the handler function +// set with the SetPongHandler method. The default pong handler does nothing. +// If an application sends ping messages, then the application should set a +// pong handler to receive the corresponding pong. +// +// The control message handler functions are called from the NextReader, +// ReadMessage and message reader Read methods. The default close and ping +// handlers can block these methods for a short time when the handler writes to +// the connection. +// +// The application must read the connection to process close, ping and pong +// messages sent from the peer. If the application is not otherwise interested +// in messages from the peer, then the application should start a goroutine to +// read and discard messages from the peer. A simple example is: +// +// func readLoop(c *websocket.Conn) { +// for { +// if _, _, err := c.NextReader(); err != nil { +// c.Close() +// break +// } +// } +// } +// +// Concurrency +// +// Connections support one concurrent reader and one concurrent writer. +// +// Applications are responsible for ensuring that no more than one goroutine +// calls the write methods (NextWriter, SetWriteDeadline, WriteMessage, +// WriteJSON, EnableWriteCompression, SetCompressionLevel) concurrently and +// that no more than one goroutine calls the read methods (NextReader, +// SetReadDeadline, ReadMessage, ReadJSON, SetPongHandler, SetPingHandler) +// concurrently. +// +// The Close and WriteControl methods can be called concurrently with all other +// methods. +// +// Origin Considerations +// +// Web browsers allow Javascript applications to open a WebSocket connection to +// any host. It's up to the server to enforce an origin policy using the Origin +// request header sent by the browser. +// +// The Upgrader calls the function specified in the CheckOrigin field to check +// the origin. If the CheckOrigin function returns false, then the Upgrade +// method fails the WebSocket handshake with HTTP status 403. +// +// If the CheckOrigin field is nil, then the Upgrader uses a safe default: fail +// the handshake if the Origin request header is present and the Origin host is +// not equal to the Host request header. +// +// The deprecated package-level Upgrade function does not perform origin +// checking. The application is responsible for checking the Origin header +// before calling the Upgrade function. +// +// Buffers +// +// Connections buffer network input and output to reduce the number +// of system calls when reading or writing messages. +// +// Write buffers are also used for constructing WebSocket frames. See RFC 6455, +// Section 5 for a discussion of message framing. A WebSocket frame header is +// written to the network each time a write buffer is flushed to the network. +// Decreasing the size of the write buffer can increase the amount of framing +// overhead on the connection. +// +// The buffer sizes in bytes are specified by the ReadBufferSize and +// WriteBufferSize fields in the Dialer and Upgrader. The Dialer uses a default +// size of 4096 when a buffer size field is set to zero. The Upgrader reuses +// buffers created by the HTTP server when a buffer size field is set to zero. +// The HTTP server buffers have a size of 4096 at the time of this writing. +// +// The buffer sizes do not limit the size of a message that can be read or +// written by a connection. +// +// Buffers are held for the lifetime of the connection by default. If the +// Dialer or Upgrader WriteBufferPool field is set, then a connection holds the +// write buffer only when writing a message. +// +// Applications should tune the buffer sizes to balance memory use and +// performance. Increasing the buffer size uses more memory, but can reduce the +// number of system calls to read or write the network. In the case of writing, +// increasing the buffer size can reduce the number of frame headers written to +// the network. +// +// Some guidelines for setting buffer parameters are: +// +// Limit the buffer sizes to the maximum expected message size. Buffers larger +// than the largest message do not provide any benefit. +// +// Depending on the distribution of message sizes, setting the buffer size to +// to a value less than the maximum expected message size can greatly reduce +// memory use with a small impact on performance. Here's an example: If 99% of +// the messages are smaller than 256 bytes and the maximum message size is 512 +// bytes, then a buffer size of 256 bytes will result in 1.01 more system calls +// than a buffer size of 512 bytes. The memory savings is 50%. +// +// A write buffer pool is useful when the application has a modest number +// writes over a large number of connections. when buffers are pooled, a larger +// buffer size has a reduced impact on total memory use and has the benefit of +// reducing system calls and frame overhead. +// +// Compression EXPERIMENTAL +// +// Per message compression extensions (RFC 7692) are experimentally supported +// by this package in a limited capacity. Setting the EnableCompression option +// to true in Dialer or Upgrader will attempt to negotiate per message deflate +// support. +// +// var upgrader = websocket.Upgrader{ +// EnableCompression: true, +// } +// +// If compression was successfully negotiated with the connection's peer, any +// message received in compressed form will be automatically decompressed. +// All Read methods will return uncompressed bytes. +// +// Per message compression of messages written to a connection can be enabled +// or disabled by calling the corresponding Conn method: +// +// conn.EnableWriteCompression(false) +// +// Currently this package does not support compression with "context takeover". +// This means that messages must be compressed and decompressed in isolation, +// without retaining sliding window or dictionary state across messages. For +// more details refer to RFC 7692. +// +// Use of compression is experimental and may result in decreased performance. +package websocket diff --git a/vendor/github.com/gorilla/websocket/go.mod b/vendor/github.com/gorilla/websocket/go.mod new file mode 100644 index 000000000000..93a9e924a777 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/go.mod @@ -0,0 +1 @@ +module github.com/gorilla/websocket diff --git a/vendor/github.com/gorilla/websocket/go.sum b/vendor/github.com/gorilla/websocket/go.sum new file mode 100644 index 000000000000..cf4fbbaa07ac --- /dev/null +++ b/vendor/github.com/gorilla/websocket/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= diff --git a/vendor/github.com/gorilla/websocket/join.go b/vendor/github.com/gorilla/websocket/join.go new file mode 100644 index 000000000000..c64f8c82901a --- /dev/null +++ b/vendor/github.com/gorilla/websocket/join.go @@ -0,0 +1,42 @@ +// Copyright 2019 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "io" + "strings" +) + +// JoinMessages concatenates received messages to create a single io.Reader. +// The string term is appended to each message. The returned reader does not +// support concurrent calls to the Read method. +func JoinMessages(c *Conn, term string) io.Reader { + return &joinReader{c: c, term: term} +} + +type joinReader struct { + c *Conn + term string + r io.Reader +} + +func (r *joinReader) Read(p []byte) (int, error) { + if r.r == nil { + var err error + _, r.r, err = r.c.NextReader() + if err != nil { + return 0, err + } + if r.term != "" { + r.r = io.MultiReader(r.r, strings.NewReader(r.term)) + } + } + n, err := r.r.Read(p) + if err == io.EOF { + err = nil + r.r = nil + } + return n, err +} diff --git a/vendor/github.com/gorilla/websocket/json.go b/vendor/github.com/gorilla/websocket/json.go new file mode 100644 index 000000000000..dc2c1f6415ff --- /dev/null +++ b/vendor/github.com/gorilla/websocket/json.go @@ -0,0 +1,60 @@ +// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "encoding/json" + "io" +) + +// WriteJSON writes the JSON encoding of v as a message. +// +// Deprecated: Use c.WriteJSON instead. +func WriteJSON(c *Conn, v interface{}) error { + return c.WriteJSON(v) +} + +// WriteJSON writes the JSON encoding of v as a message. +// +// See the documentation for encoding/json Marshal for details about the +// conversion of Go values to JSON. +func (c *Conn) WriteJSON(v interface{}) error { + w, err := c.NextWriter(TextMessage) + if err != nil { + return err + } + err1 := json.NewEncoder(w).Encode(v) + err2 := w.Close() + if err1 != nil { + return err1 + } + return err2 +} + +// ReadJSON reads the next JSON-encoded message from the connection and stores +// it in the value pointed to by v. +// +// Deprecated: Use c.ReadJSON instead. +func ReadJSON(c *Conn, v interface{}) error { + return c.ReadJSON(v) +} + +// ReadJSON reads the next JSON-encoded message from the connection and stores +// it in the value pointed to by v. +// +// See the documentation for the encoding/json Unmarshal function for details +// about the conversion of JSON to a Go value. +func (c *Conn) ReadJSON(v interface{}) error { + _, r, err := c.NextReader() + if err != nil { + return err + } + err = json.NewDecoder(r).Decode(v) + if err == io.EOF { + // One value is expected in the message. + err = io.ErrUnexpectedEOF + } + return err +} diff --git a/vendor/github.com/gorilla/websocket/mask.go b/vendor/github.com/gorilla/websocket/mask.go new file mode 100644 index 000000000000..577fce9efd72 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/mask.go @@ -0,0 +1,54 @@ +// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in the +// LICENSE file. + +// +build !appengine + +package websocket + +import "unsafe" + +const wordSize = int(unsafe.Sizeof(uintptr(0))) + +func maskBytes(key [4]byte, pos int, b []byte) int { + // Mask one byte at a time for small buffers. + if len(b) < 2*wordSize { + for i := range b { + b[i] ^= key[pos&3] + pos++ + } + return pos & 3 + } + + // Mask one byte at a time to word boundary. + if n := int(uintptr(unsafe.Pointer(&b[0]))) % wordSize; n != 0 { + n = wordSize - n + for i := range b[:n] { + b[i] ^= key[pos&3] + pos++ + } + b = b[n:] + } + + // Create aligned word size key. + var k [wordSize]byte + for i := range k { + k[i] = key[(pos+i)&3] + } + kw := *(*uintptr)(unsafe.Pointer(&k)) + + // Mask one word at a time. + n := (len(b) / wordSize) * wordSize + for i := 0; i < n; i += wordSize { + *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&b[0])) + uintptr(i))) ^= kw + } + + // Mask one byte at a time for remaining bytes. + b = b[n:] + for i := range b { + b[i] ^= key[pos&3] + pos++ + } + + return pos & 3 +} diff --git a/vendor/github.com/gorilla/websocket/mask_safe.go b/vendor/github.com/gorilla/websocket/mask_safe.go new file mode 100644 index 000000000000..2aac060e52e7 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/mask_safe.go @@ -0,0 +1,15 @@ +// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in the +// LICENSE file. + +// +build appengine + +package websocket + +func maskBytes(key [4]byte, pos int, b []byte) int { + for i := range b { + b[i] ^= key[pos&3] + pos++ + } + return pos & 3 +} diff --git a/vendor/github.com/gorilla/websocket/prepared.go b/vendor/github.com/gorilla/websocket/prepared.go new file mode 100644 index 000000000000..74ec565d2c38 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/prepared.go @@ -0,0 +1,102 @@ +// Copyright 2017 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "bytes" + "net" + "sync" + "time" +) + +// PreparedMessage caches on the wire representations of a message payload. +// Use PreparedMessage to efficiently send a message payload to multiple +// connections. PreparedMessage is especially useful when compression is used +// because the CPU and memory expensive compression operation can be executed +// once for a given set of compression options. +type PreparedMessage struct { + messageType int + data []byte + mu sync.Mutex + frames map[prepareKey]*preparedFrame +} + +// prepareKey defines a unique set of options to cache prepared frames in PreparedMessage. +type prepareKey struct { + isServer bool + compress bool + compressionLevel int +} + +// preparedFrame contains data in wire representation. +type preparedFrame struct { + once sync.Once + data []byte +} + +// NewPreparedMessage returns an initialized PreparedMessage. You can then send +// it to connection using WritePreparedMessage method. Valid wire +// representation will be calculated lazily only once for a set of current +// connection options. +func NewPreparedMessage(messageType int, data []byte) (*PreparedMessage, error) { + pm := &PreparedMessage{ + messageType: messageType, + frames: make(map[prepareKey]*preparedFrame), + data: data, + } + + // Prepare a plain server frame. + _, frameData, err := pm.frame(prepareKey{isServer: true, compress: false}) + if err != nil { + return nil, err + } + + // To protect against caller modifying the data argument, remember the data + // copied to the plain server frame. + pm.data = frameData[len(frameData)-len(data):] + return pm, nil +} + +func (pm *PreparedMessage) frame(key prepareKey) (int, []byte, error) { + pm.mu.Lock() + frame, ok := pm.frames[key] + if !ok { + frame = &preparedFrame{} + pm.frames[key] = frame + } + pm.mu.Unlock() + + var err error + frame.once.Do(func() { + // Prepare a frame using a 'fake' connection. + // TODO: Refactor code in conn.go to allow more direct construction of + // the frame. + mu := make(chan bool, 1) + mu <- true + var nc prepareConn + c := &Conn{ + conn: &nc, + mu: mu, + isServer: key.isServer, + compressionLevel: key.compressionLevel, + enableWriteCompression: true, + writeBuf: make([]byte, defaultWriteBufferSize+maxFrameHeaderSize), + } + if key.compress { + c.newCompressionWriter = compressNoContextTakeover + } + err = c.WriteMessage(pm.messageType, pm.data) + frame.data = nc.buf.Bytes() + }) + return pm.messageType, frame.data, err +} + +type prepareConn struct { + buf bytes.Buffer + net.Conn +} + +func (pc *prepareConn) Write(p []byte) (int, error) { return pc.buf.Write(p) } +func (pc *prepareConn) SetWriteDeadline(t time.Time) error { return nil } diff --git a/vendor/github.com/gorilla/websocket/proxy.go b/vendor/github.com/gorilla/websocket/proxy.go new file mode 100644 index 000000000000..e87a8c9f0c96 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/proxy.go @@ -0,0 +1,77 @@ +// Copyright 2017 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "bufio" + "encoding/base64" + "errors" + "net" + "net/http" + "net/url" + "strings" +) + +type netDialerFunc func(network, addr string) (net.Conn, error) + +func (fn netDialerFunc) Dial(network, addr string) (net.Conn, error) { + return fn(network, addr) +} + +func init() { + proxy_RegisterDialerType("http", func(proxyURL *url.URL, forwardDialer proxy_Dialer) (proxy_Dialer, error) { + return &httpProxyDialer{proxyURL: proxyURL, forwardDial: forwardDialer.Dial}, nil + }) +} + +type httpProxyDialer struct { + proxyURL *url.URL + forwardDial func(network, addr string) (net.Conn, error) +} + +func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error) { + hostPort, _ := hostPortNoPort(hpd.proxyURL) + conn, err := hpd.forwardDial(network, hostPort) + if err != nil { + return nil, err + } + + connectHeader := make(http.Header) + if user := hpd.proxyURL.User; user != nil { + proxyUser := user.Username() + if proxyPassword, passwordSet := user.Password(); passwordSet { + credential := base64.StdEncoding.EncodeToString([]byte(proxyUser + ":" + proxyPassword)) + connectHeader.Set("Proxy-Authorization", "Basic "+credential) + } + } + + connectReq := &http.Request{ + Method: "CONNECT", + URL: &url.URL{Opaque: addr}, + Host: addr, + Header: connectHeader, + } + + if err := connectReq.Write(conn); err != nil { + conn.Close() + return nil, err + } + + // Read response. It's OK to use and discard buffered reader here becaue + // the remote server does not speak until spoken to. + br := bufio.NewReader(conn) + resp, err := http.ReadResponse(br, connectReq) + if err != nil { + conn.Close() + return nil, err + } + + if resp.StatusCode != 200 { + conn.Close() + f := strings.SplitN(resp.Status, " ", 2) + return nil, errors.New(f[1]) + } + return conn, nil +} diff --git a/vendor/github.com/gorilla/websocket/server.go b/vendor/github.com/gorilla/websocket/server.go new file mode 100644 index 000000000000..3d4480a47764 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/server.go @@ -0,0 +1,363 @@ +// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "bufio" + "errors" + "io" + "net/http" + "net/url" + "strings" + "time" +) + +// HandshakeError describes an error with the handshake from the peer. +type HandshakeError struct { + message string +} + +func (e HandshakeError) Error() string { return e.message } + +// Upgrader specifies parameters for upgrading an HTTP connection to a +// WebSocket connection. +type Upgrader struct { + // HandshakeTimeout specifies the duration for the handshake to complete. + HandshakeTimeout time.Duration + + // ReadBufferSize and WriteBufferSize specify I/O buffer sizes in bytes. If a buffer + // size is zero, then buffers allocated by the HTTP server are used. The + // I/O buffer sizes do not limit the size of the messages that can be sent + // or received. + ReadBufferSize, WriteBufferSize int + + // WriteBufferPool is a pool of buffers for write operations. If the value + // is not set, then write buffers are allocated to the connection for the + // lifetime of the connection. + // + // A pool is most useful when the application has a modest volume of writes + // across a large number of connections. + // + // Applications should use a single pool for each unique value of + // WriteBufferSize. + WriteBufferPool BufferPool + + // Subprotocols specifies the server's supported protocols in order of + // preference. If this field is not nil, then the Upgrade method negotiates a + // subprotocol by selecting the first match in this list with a protocol + // requested by the client. If there's no match, then no protocol is + // negotiated (the Sec-Websocket-Protocol header is not included in the + // handshake response). + Subprotocols []string + + // Error specifies the function for generating HTTP error responses. If Error + // is nil, then http.Error is used to generate the HTTP response. + Error func(w http.ResponseWriter, r *http.Request, status int, reason error) + + // CheckOrigin returns true if the request Origin header is acceptable. If + // CheckOrigin is nil, then a safe default is used: return false if the + // Origin request header is present and the origin host is not equal to + // request Host header. + // + // A CheckOrigin function should carefully validate the request origin to + // prevent cross-site request forgery. + CheckOrigin func(r *http.Request) bool + + // EnableCompression specify if the server should attempt to negotiate per + // message compression (RFC 7692). Setting this value to true does not + // guarantee that compression will be supported. Currently only "no context + // takeover" modes are supported. + EnableCompression bool +} + +func (u *Upgrader) returnError(w http.ResponseWriter, r *http.Request, status int, reason string) (*Conn, error) { + err := HandshakeError{reason} + if u.Error != nil { + u.Error(w, r, status, err) + } else { + w.Header().Set("Sec-Websocket-Version", "13") + http.Error(w, http.StatusText(status), status) + } + return nil, err +} + +// checkSameOrigin returns true if the origin is not set or is equal to the request host. +func checkSameOrigin(r *http.Request) bool { + origin := r.Header["Origin"] + if len(origin) == 0 { + return true + } + u, err := url.Parse(origin[0]) + if err != nil { + return false + } + return equalASCIIFold(u.Host, r.Host) +} + +func (u *Upgrader) selectSubprotocol(r *http.Request, responseHeader http.Header) string { + if u.Subprotocols != nil { + clientProtocols := Subprotocols(r) + for _, serverProtocol := range u.Subprotocols { + for _, clientProtocol := range clientProtocols { + if clientProtocol == serverProtocol { + return clientProtocol + } + } + } + } else if responseHeader != nil { + return responseHeader.Get("Sec-Websocket-Protocol") + } + return "" +} + +// Upgrade upgrades the HTTP server connection to the WebSocket protocol. +// +// The responseHeader is included in the response to the client's upgrade +// request. Use the responseHeader to specify cookies (Set-Cookie) and the +// application negotiated subprotocol (Sec-WebSocket-Protocol). +// +// If the upgrade fails, then Upgrade replies to the client with an HTTP error +// response. +func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header) (*Conn, error) { + const badHandshake = "websocket: the client is not using the websocket protocol: " + + if !tokenListContainsValue(r.Header, "Connection", "upgrade") { + return u.returnError(w, r, http.StatusBadRequest, badHandshake+"'upgrade' token not found in 'Connection' header") + } + + if !tokenListContainsValue(r.Header, "Upgrade", "websocket") { + return u.returnError(w, r, http.StatusBadRequest, badHandshake+"'websocket' token not found in 'Upgrade' header") + } + + if r.Method != "GET" { + return u.returnError(w, r, http.StatusMethodNotAllowed, badHandshake+"request method is not GET") + } + + if !tokenListContainsValue(r.Header, "Sec-Websocket-Version", "13") { + return u.returnError(w, r, http.StatusBadRequest, "websocket: unsupported version: 13 not found in 'Sec-Websocket-Version' header") + } + + if _, ok := responseHeader["Sec-Websocket-Extensions"]; ok { + return u.returnError(w, r, http.StatusInternalServerError, "websocket: application specific 'Sec-WebSocket-Extensions' headers are unsupported") + } + + checkOrigin := u.CheckOrigin + if checkOrigin == nil { + checkOrigin = checkSameOrigin + } + if !checkOrigin(r) { + return u.returnError(w, r, http.StatusForbidden, "websocket: request origin not allowed by Upgrader.CheckOrigin") + } + + challengeKey := r.Header.Get("Sec-Websocket-Key") + if challengeKey == "" { + return u.returnError(w, r, http.StatusBadRequest, "websocket: not a websocket handshake: `Sec-WebSocket-Key' header is missing or blank") + } + + subprotocol := u.selectSubprotocol(r, responseHeader) + + // Negotiate PMCE + var compress bool + if u.EnableCompression { + for _, ext := range parseExtensions(r.Header) { + if ext[""] != "permessage-deflate" { + continue + } + compress = true + break + } + } + + h, ok := w.(http.Hijacker) + if !ok { + return u.returnError(w, r, http.StatusInternalServerError, "websocket: response does not implement http.Hijacker") + } + var brw *bufio.ReadWriter + netConn, brw, err := h.Hijack() + if err != nil { + return u.returnError(w, r, http.StatusInternalServerError, err.Error()) + } + + if brw.Reader.Buffered() > 0 { + netConn.Close() + return nil, errors.New("websocket: client sent data before handshake is complete") + } + + var br *bufio.Reader + if u.ReadBufferSize == 0 && bufioReaderSize(netConn, brw.Reader) > 256 { + // Reuse hijacked buffered reader as connection reader. + br = brw.Reader + } + + buf := bufioWriterBuffer(netConn, brw.Writer) + + var writeBuf []byte + if u.WriteBufferPool == nil && u.WriteBufferSize == 0 && len(buf) >= maxFrameHeaderSize+256 { + // Reuse hijacked write buffer as connection buffer. + writeBuf = buf + } + + c := newConn(netConn, true, u.ReadBufferSize, u.WriteBufferSize, u.WriteBufferPool, br, writeBuf) + c.subprotocol = subprotocol + + if compress { + c.newCompressionWriter = compressNoContextTakeover + c.newDecompressionReader = decompressNoContextTakeover + } + + // Use larger of hijacked buffer and connection write buffer for header. + p := buf + if len(c.writeBuf) > len(p) { + p = c.writeBuf + } + p = p[:0] + + p = append(p, "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "...) + p = append(p, computeAcceptKey(challengeKey)...) + p = append(p, "\r\n"...) + if c.subprotocol != "" { + p = append(p, "Sec-WebSocket-Protocol: "...) + p = append(p, c.subprotocol...) + p = append(p, "\r\n"...) + } + if compress { + p = append(p, "Sec-WebSocket-Extensions: permessage-deflate; server_no_context_takeover; client_no_context_takeover\r\n"...) + } + for k, vs := range responseHeader { + if k == "Sec-Websocket-Protocol" { + continue + } + for _, v := range vs { + p = append(p, k...) + p = append(p, ": "...) + for i := 0; i < len(v); i++ { + b := v[i] + if b <= 31 { + // prevent response splitting. + b = ' ' + } + p = append(p, b) + } + p = append(p, "\r\n"...) + } + } + p = append(p, "\r\n"...) + + // Clear deadlines set by HTTP server. + netConn.SetDeadline(time.Time{}) + + if u.HandshakeTimeout > 0 { + netConn.SetWriteDeadline(time.Now().Add(u.HandshakeTimeout)) + } + if _, err = netConn.Write(p); err != nil { + netConn.Close() + return nil, err + } + if u.HandshakeTimeout > 0 { + netConn.SetWriteDeadline(time.Time{}) + } + + return c, nil +} + +// Upgrade upgrades the HTTP server connection to the WebSocket protocol. +// +// Deprecated: Use websocket.Upgrader instead. +// +// Upgrade does not perform origin checking. The application is responsible for +// checking the Origin header before calling Upgrade. An example implementation +// of the same origin policy check is: +// +// if req.Header.Get("Origin") != "http://"+req.Host { +// http.Error(w, "Origin not allowed", http.StatusForbidden) +// return +// } +// +// If the endpoint supports subprotocols, then the application is responsible +// for negotiating the protocol used on the connection. Use the Subprotocols() +// function to get the subprotocols requested by the client. Use the +// Sec-Websocket-Protocol response header to specify the subprotocol selected +// by the application. +// +// The responseHeader is included in the response to the client's upgrade +// request. Use the responseHeader to specify cookies (Set-Cookie) and the +// negotiated subprotocol (Sec-Websocket-Protocol). +// +// The connection buffers IO to the underlying network connection. The +// readBufSize and writeBufSize parameters specify the size of the buffers to +// use. Messages can be larger than the buffers. +// +// If the request is not a valid WebSocket handshake, then Upgrade returns an +// error of type HandshakeError. Applications should handle this error by +// replying to the client with an HTTP error response. +func Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header, readBufSize, writeBufSize int) (*Conn, error) { + u := Upgrader{ReadBufferSize: readBufSize, WriteBufferSize: writeBufSize} + u.Error = func(w http.ResponseWriter, r *http.Request, status int, reason error) { + // don't return errors to maintain backwards compatibility + } + u.CheckOrigin = func(r *http.Request) bool { + // allow all connections by default + return true + } + return u.Upgrade(w, r, responseHeader) +} + +// Subprotocols returns the subprotocols requested by the client in the +// Sec-Websocket-Protocol header. +func Subprotocols(r *http.Request) []string { + h := strings.TrimSpace(r.Header.Get("Sec-Websocket-Protocol")) + if h == "" { + return nil + } + protocols := strings.Split(h, ",") + for i := range protocols { + protocols[i] = strings.TrimSpace(protocols[i]) + } + return protocols +} + +// IsWebSocketUpgrade returns true if the client requested upgrade to the +// WebSocket protocol. +func IsWebSocketUpgrade(r *http.Request) bool { + return tokenListContainsValue(r.Header, "Connection", "upgrade") && + tokenListContainsValue(r.Header, "Upgrade", "websocket") +} + +// bufioReaderSize size returns the size of a bufio.Reader. +func bufioReaderSize(originalReader io.Reader, br *bufio.Reader) int { + // This code assumes that peek on a reset reader returns + // bufio.Reader.buf[:0]. + // TODO: Use bufio.Reader.Size() after Go 1.10 + br.Reset(originalReader) + if p, err := br.Peek(0); err == nil { + return cap(p) + } + return 0 +} + +// writeHook is an io.Writer that records the last slice passed to it vio +// io.Writer.Write. +type writeHook struct { + p []byte +} + +func (wh *writeHook) Write(p []byte) (int, error) { + wh.p = p + return len(p), nil +} + +// bufioWriterBuffer grabs the buffer from a bufio.Writer. +func bufioWriterBuffer(originalWriter io.Writer, bw *bufio.Writer) []byte { + // This code assumes that bufio.Writer.buf[:1] is passed to the + // bufio.Writer's underlying writer. + var wh writeHook + bw.Reset(&wh) + bw.WriteByte(0) + bw.Flush() + + bw.Reset(originalWriter) + + return wh.p[:cap(wh.p)] +} diff --git a/vendor/github.com/gorilla/websocket/trace.go b/vendor/github.com/gorilla/websocket/trace.go new file mode 100644 index 000000000000..834f122a00db --- /dev/null +++ b/vendor/github.com/gorilla/websocket/trace.go @@ -0,0 +1,19 @@ +// +build go1.8 + +package websocket + +import ( + "crypto/tls" + "net/http/httptrace" +) + +func doHandshakeWithTrace(trace *httptrace.ClientTrace, tlsConn *tls.Conn, cfg *tls.Config) error { + if trace.TLSHandshakeStart != nil { + trace.TLSHandshakeStart() + } + err := doHandshake(tlsConn, cfg) + if trace.TLSHandshakeDone != nil { + trace.TLSHandshakeDone(tlsConn.ConnectionState(), err) + } + return err +} diff --git a/vendor/github.com/gorilla/websocket/trace_17.go b/vendor/github.com/gorilla/websocket/trace_17.go new file mode 100644 index 000000000000..77d05a0b5748 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/trace_17.go @@ -0,0 +1,12 @@ +// +build !go1.8 + +package websocket + +import ( + "crypto/tls" + "net/http/httptrace" +) + +func doHandshakeWithTrace(trace *httptrace.ClientTrace, tlsConn *tls.Conn, cfg *tls.Config) error { + return doHandshake(tlsConn, cfg) +} diff --git a/vendor/github.com/gorilla/websocket/util.go b/vendor/github.com/gorilla/websocket/util.go new file mode 100644 index 000000000000..7bf2f66c6747 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/util.go @@ -0,0 +1,283 @@ +// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "crypto/rand" + "crypto/sha1" + "encoding/base64" + "io" + "net/http" + "strings" + "unicode/utf8" +) + +var keyGUID = []byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11") + +func computeAcceptKey(challengeKey string) string { + h := sha1.New() + h.Write([]byte(challengeKey)) + h.Write(keyGUID) + return base64.StdEncoding.EncodeToString(h.Sum(nil)) +} + +func generateChallengeKey() (string, error) { + p := make([]byte, 16) + if _, err := io.ReadFull(rand.Reader, p); err != nil { + return "", err + } + return base64.StdEncoding.EncodeToString(p), nil +} + +// Token octets per RFC 2616. +var isTokenOctet = [256]bool{ + '!': true, + '#': true, + '$': true, + '%': true, + '&': true, + '\'': true, + '*': true, + '+': true, + '-': true, + '.': true, + '0': true, + '1': true, + '2': true, + '3': true, + '4': true, + '5': true, + '6': true, + '7': true, + '8': true, + '9': true, + 'A': true, + 'B': true, + 'C': true, + 'D': true, + 'E': true, + 'F': true, + 'G': true, + 'H': true, + 'I': true, + 'J': true, + 'K': true, + 'L': true, + 'M': true, + 'N': true, + 'O': true, + 'P': true, + 'Q': true, + 'R': true, + 'S': true, + 'T': true, + 'U': true, + 'W': true, + 'V': true, + 'X': true, + 'Y': true, + 'Z': true, + '^': true, + '_': true, + '`': true, + 'a': true, + 'b': true, + 'c': true, + 'd': true, + 'e': true, + 'f': true, + 'g': true, + 'h': true, + 'i': true, + 'j': true, + 'k': true, + 'l': true, + 'm': true, + 'n': true, + 'o': true, + 'p': true, + 'q': true, + 'r': true, + 's': true, + 't': true, + 'u': true, + 'v': true, + 'w': true, + 'x': true, + 'y': true, + 'z': true, + '|': true, + '~': true, +} + +// skipSpace returns a slice of the string s with all leading RFC 2616 linear +// whitespace removed. +func skipSpace(s string) (rest string) { + i := 0 + for ; i < len(s); i++ { + if b := s[i]; b != ' ' && b != '\t' { + break + } + } + return s[i:] +} + +// nextToken returns the leading RFC 2616 token of s and the string following +// the token. +func nextToken(s string) (token, rest string) { + i := 0 + for ; i < len(s); i++ { + if !isTokenOctet[s[i]] { + break + } + } + return s[:i], s[i:] +} + +// nextTokenOrQuoted returns the leading token or quoted string per RFC 2616 +// and the string following the token or quoted string. +func nextTokenOrQuoted(s string) (value string, rest string) { + if !strings.HasPrefix(s, "\"") { + return nextToken(s) + } + s = s[1:] + for i := 0; i < len(s); i++ { + switch s[i] { + case '"': + return s[:i], s[i+1:] + case '\\': + p := make([]byte, len(s)-1) + j := copy(p, s[:i]) + escape := true + for i = i + 1; i < len(s); i++ { + b := s[i] + switch { + case escape: + escape = false + p[j] = b + j++ + case b == '\\': + escape = true + case b == '"': + return string(p[:j]), s[i+1:] + default: + p[j] = b + j++ + } + } + return "", "" + } + } + return "", "" +} + +// equalASCIIFold returns true if s is equal to t with ASCII case folding as +// defined in RFC 4790. +func equalASCIIFold(s, t string) bool { + for s != "" && t != "" { + sr, size := utf8.DecodeRuneInString(s) + s = s[size:] + tr, size := utf8.DecodeRuneInString(t) + t = t[size:] + if sr == tr { + continue + } + if 'A' <= sr && sr <= 'Z' { + sr = sr + 'a' - 'A' + } + if 'A' <= tr && tr <= 'Z' { + tr = tr + 'a' - 'A' + } + if sr != tr { + return false + } + } + return s == t +} + +// tokenListContainsValue returns true if the 1#token header with the given +// name contains a token equal to value with ASCII case folding. +func tokenListContainsValue(header http.Header, name string, value string) bool { +headers: + for _, s := range header[name] { + for { + var t string + t, s = nextToken(skipSpace(s)) + if t == "" { + continue headers + } + s = skipSpace(s) + if s != "" && s[0] != ',' { + continue headers + } + if equalASCIIFold(t, value) { + return true + } + if s == "" { + continue headers + } + s = s[1:] + } + } + return false +} + +// parseExtensions parses WebSocket extensions from a header. +func parseExtensions(header http.Header) []map[string]string { + // From RFC 6455: + // + // Sec-WebSocket-Extensions = extension-list + // extension-list = 1#extension + // extension = extension-token *( ";" extension-param ) + // extension-token = registered-token + // registered-token = token + // extension-param = token [ "=" (token | quoted-string) ] + // ;When using the quoted-string syntax variant, the value + // ;after quoted-string unescaping MUST conform to the + // ;'token' ABNF. + + var result []map[string]string +headers: + for _, s := range header["Sec-Websocket-Extensions"] { + for { + var t string + t, s = nextToken(skipSpace(s)) + if t == "" { + continue headers + } + ext := map[string]string{"": t} + for { + s = skipSpace(s) + if !strings.HasPrefix(s, ";") { + break + } + var k string + k, s = nextToken(skipSpace(s[1:])) + if k == "" { + continue headers + } + s = skipSpace(s) + var v string + if strings.HasPrefix(s, "=") { + v, s = nextTokenOrQuoted(skipSpace(s[1:])) + s = skipSpace(s) + } + if s != "" && s[0] != ',' && s[0] != ';' { + continue headers + } + ext[k] = v + } + if s != "" && s[0] != ',' { + continue headers + } + result = append(result, ext) + if s == "" { + continue headers + } + s = s[1:] + } + } + return result +} diff --git a/vendor/github.com/gorilla/websocket/x_net_proxy.go b/vendor/github.com/gorilla/websocket/x_net_proxy.go new file mode 100644 index 000000000000..2e668f6b8821 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/x_net_proxy.go @@ -0,0 +1,473 @@ +// Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT. +//go:generate bundle -o x_net_proxy.go golang.org/x/net/proxy + +// Package proxy provides support for a variety of protocols to proxy network +// data. +// + +package websocket + +import ( + "errors" + "io" + "net" + "net/url" + "os" + "strconv" + "strings" + "sync" +) + +type proxy_direct struct{} + +// Direct is a direct proxy: one that makes network connections directly. +var proxy_Direct = proxy_direct{} + +func (proxy_direct) Dial(network, addr string) (net.Conn, error) { + return net.Dial(network, addr) +} + +// A PerHost directs connections to a default Dialer unless the host name +// requested matches one of a number of exceptions. +type proxy_PerHost struct { + def, bypass proxy_Dialer + + bypassNetworks []*net.IPNet + bypassIPs []net.IP + bypassZones []string + bypassHosts []string +} + +// NewPerHost returns a PerHost Dialer that directs connections to either +// defaultDialer or bypass, depending on whether the connection matches one of +// the configured rules. +func proxy_NewPerHost(defaultDialer, bypass proxy_Dialer) *proxy_PerHost { + return &proxy_PerHost{ + def: defaultDialer, + bypass: bypass, + } +} + +// Dial connects to the address addr on the given network through either +// defaultDialer or bypass. +func (p *proxy_PerHost) Dial(network, addr string) (c net.Conn, err error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + + return p.dialerForRequest(host).Dial(network, addr) +} + +func (p *proxy_PerHost) dialerForRequest(host string) proxy_Dialer { + if ip := net.ParseIP(host); ip != nil { + for _, net := range p.bypassNetworks { + if net.Contains(ip) { + return p.bypass + } + } + for _, bypassIP := range p.bypassIPs { + if bypassIP.Equal(ip) { + return p.bypass + } + } + return p.def + } + + for _, zone := range p.bypassZones { + if strings.HasSuffix(host, zone) { + return p.bypass + } + if host == zone[1:] { + // For a zone ".example.com", we match "example.com" + // too. + return p.bypass + } + } + for _, bypassHost := range p.bypassHosts { + if bypassHost == host { + return p.bypass + } + } + return p.def +} + +// AddFromString parses a string that contains comma-separated values +// specifying hosts that should use the bypass proxy. Each value is either an +// IP address, a CIDR range, a zone (*.example.com) or a host name +// (localhost). A best effort is made to parse the string and errors are +// ignored. +func (p *proxy_PerHost) AddFromString(s string) { + hosts := strings.Split(s, ",") + for _, host := range hosts { + host = strings.TrimSpace(host) + if len(host) == 0 { + continue + } + if strings.Contains(host, "/") { + // We assume that it's a CIDR address like 127.0.0.0/8 + if _, net, err := net.ParseCIDR(host); err == nil { + p.AddNetwork(net) + } + continue + } + if ip := net.ParseIP(host); ip != nil { + p.AddIP(ip) + continue + } + if strings.HasPrefix(host, "*.") { + p.AddZone(host[1:]) + continue + } + p.AddHost(host) + } +} + +// AddIP specifies an IP address that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match an IP. +func (p *proxy_PerHost) AddIP(ip net.IP) { + p.bypassIPs = append(p.bypassIPs, ip) +} + +// AddNetwork specifies an IP range that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match. +func (p *proxy_PerHost) AddNetwork(net *net.IPNet) { + p.bypassNetworks = append(p.bypassNetworks, net) +} + +// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of +// "example.com" matches "example.com" and all of its subdomains. +func (p *proxy_PerHost) AddZone(zone string) { + if strings.HasSuffix(zone, ".") { + zone = zone[:len(zone)-1] + } + if !strings.HasPrefix(zone, ".") { + zone = "." + zone + } + p.bypassZones = append(p.bypassZones, zone) +} + +// AddHost specifies a host name that will use the bypass proxy. +func (p *proxy_PerHost) AddHost(host string) { + if strings.HasSuffix(host, ".") { + host = host[:len(host)-1] + } + p.bypassHosts = append(p.bypassHosts, host) +} + +// A Dialer is a means to establish a connection. +type proxy_Dialer interface { + // Dial connects to the given address via the proxy. + Dial(network, addr string) (c net.Conn, err error) +} + +// Auth contains authentication parameters that specific Dialers may require. +type proxy_Auth struct { + User, Password string +} + +// FromEnvironment returns the dialer specified by the proxy related variables in +// the environment. +func proxy_FromEnvironment() proxy_Dialer { + allProxy := proxy_allProxyEnv.Get() + if len(allProxy) == 0 { + return proxy_Direct + } + + proxyURL, err := url.Parse(allProxy) + if err != nil { + return proxy_Direct + } + proxy, err := proxy_FromURL(proxyURL, proxy_Direct) + if err != nil { + return proxy_Direct + } + + noProxy := proxy_noProxyEnv.Get() + if len(noProxy) == 0 { + return proxy + } + + perHost := proxy_NewPerHost(proxy, proxy_Direct) + perHost.AddFromString(noProxy) + return perHost +} + +// proxySchemes is a map from URL schemes to a function that creates a Dialer +// from a URL with such a scheme. +var proxy_proxySchemes map[string]func(*url.URL, proxy_Dialer) (proxy_Dialer, error) + +// RegisterDialerType takes a URL scheme and a function to generate Dialers from +// a URL with that scheme and a forwarding Dialer. Registered schemes are used +// by FromURL. +func proxy_RegisterDialerType(scheme string, f func(*url.URL, proxy_Dialer) (proxy_Dialer, error)) { + if proxy_proxySchemes == nil { + proxy_proxySchemes = make(map[string]func(*url.URL, proxy_Dialer) (proxy_Dialer, error)) + } + proxy_proxySchemes[scheme] = f +} + +// FromURL returns a Dialer given a URL specification and an underlying +// Dialer for it to make network requests. +func proxy_FromURL(u *url.URL, forward proxy_Dialer) (proxy_Dialer, error) { + var auth *proxy_Auth + if u.User != nil { + auth = new(proxy_Auth) + auth.User = u.User.Username() + if p, ok := u.User.Password(); ok { + auth.Password = p + } + } + + switch u.Scheme { + case "socks5": + return proxy_SOCKS5("tcp", u.Host, auth, forward) + } + + // If the scheme doesn't match any of the built-in schemes, see if it + // was registered by another package. + if proxy_proxySchemes != nil { + if f, ok := proxy_proxySchemes[u.Scheme]; ok { + return f(u, forward) + } + } + + return nil, errors.New("proxy: unknown scheme: " + u.Scheme) +} + +var ( + proxy_allProxyEnv = &proxy_envOnce{ + names: []string{"ALL_PROXY", "all_proxy"}, + } + proxy_noProxyEnv = &proxy_envOnce{ + names: []string{"NO_PROXY", "no_proxy"}, + } +) + +// envOnce looks up an environment variable (optionally by multiple +// names) once. It mitigates expensive lookups on some platforms +// (e.g. Windows). +// (Borrowed from net/http/transport.go) +type proxy_envOnce struct { + names []string + once sync.Once + val string +} + +func (e *proxy_envOnce) Get() string { + e.once.Do(e.init) + return e.val +} + +func (e *proxy_envOnce) init() { + for _, n := range e.names { + e.val = os.Getenv(n) + if e.val != "" { + return + } + } +} + +// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address +// with an optional username and password. See RFC 1928 and RFC 1929. +func proxy_SOCKS5(network, addr string, auth *proxy_Auth, forward proxy_Dialer) (proxy_Dialer, error) { + s := &proxy_socks5{ + network: network, + addr: addr, + forward: forward, + } + if auth != nil { + s.user = auth.User + s.password = auth.Password + } + + return s, nil +} + +type proxy_socks5 struct { + user, password string + network, addr string + forward proxy_Dialer +} + +const proxy_socks5Version = 5 + +const ( + proxy_socks5AuthNone = 0 + proxy_socks5AuthPassword = 2 +) + +const proxy_socks5Connect = 1 + +const ( + proxy_socks5IP4 = 1 + proxy_socks5Domain = 3 + proxy_socks5IP6 = 4 +) + +var proxy_socks5Errors = []string{ + "", + "general failure", + "connection forbidden", + "network unreachable", + "host unreachable", + "connection refused", + "TTL expired", + "command not supported", + "address type not supported", +} + +// Dial connects to the address addr on the given network via the SOCKS5 proxy. +func (s *proxy_socks5) Dial(network, addr string) (net.Conn, error) { + switch network { + case "tcp", "tcp6", "tcp4": + default: + return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network) + } + + conn, err := s.forward.Dial(s.network, s.addr) + if err != nil { + return nil, err + } + if err := s.connect(conn, addr); err != nil { + conn.Close() + return nil, err + } + return conn, nil +} + +// connect takes an existing connection to a socks5 proxy server, +// and commands the server to extend that connection to target, +// which must be a canonical address with a host and port. +func (s *proxy_socks5) connect(conn net.Conn, target string) error { + host, portStr, err := net.SplitHostPort(target) + if err != nil { + return err + } + + port, err := strconv.Atoi(portStr) + if err != nil { + return errors.New("proxy: failed to parse port number: " + portStr) + } + if port < 1 || port > 0xffff { + return errors.New("proxy: port number out of range: " + portStr) + } + + // the size here is just an estimate + buf := make([]byte, 0, 6+len(host)) + + buf = append(buf, proxy_socks5Version) + if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 { + buf = append(buf, 2 /* num auth methods */, proxy_socks5AuthNone, proxy_socks5AuthPassword) + } else { + buf = append(buf, 1 /* num auth methods */, proxy_socks5AuthNone) + } + + if _, err := conn.Write(buf); err != nil { + return errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if _, err := io.ReadFull(conn, buf[:2]); err != nil { + return errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + if buf[0] != 5 { + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) + } + if buf[1] == 0xff { + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") + } + + // See RFC 1929 + if buf[1] == proxy_socks5AuthPassword { + buf = buf[:0] + buf = append(buf, 1 /* password protocol version */) + buf = append(buf, uint8(len(s.user))) + buf = append(buf, s.user...) + buf = append(buf, uint8(len(s.password))) + buf = append(buf, s.password...) + + if _, err := conn.Write(buf); err != nil { + return errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if _, err := io.ReadFull(conn, buf[:2]); err != nil { + return errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if buf[1] != 0 { + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") + } + } + + buf = buf[:0] + buf = append(buf, proxy_socks5Version, proxy_socks5Connect, 0 /* reserved */) + + if ip := net.ParseIP(host); ip != nil { + if ip4 := ip.To4(); ip4 != nil { + buf = append(buf, proxy_socks5IP4) + ip = ip4 + } else { + buf = append(buf, proxy_socks5IP6) + } + buf = append(buf, ip...) + } else { + if len(host) > 255 { + return errors.New("proxy: destination host name too long: " + host) + } + buf = append(buf, proxy_socks5Domain) + buf = append(buf, byte(len(host))) + buf = append(buf, host...) + } + buf = append(buf, byte(port>>8), byte(port)) + + if _, err := conn.Write(buf); err != nil { + return errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if _, err := io.ReadFull(conn, buf[:4]); err != nil { + return errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + failure := "unknown error" + if int(buf[1]) < len(proxy_socks5Errors) { + failure = proxy_socks5Errors[buf[1]] + } + + if len(failure) > 0 { + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) + } + + bytesToDiscard := 0 + switch buf[3] { + case proxy_socks5IP4: + bytesToDiscard = net.IPv4len + case proxy_socks5IP6: + bytesToDiscard = net.IPv6len + case proxy_socks5Domain: + _, err := io.ReadFull(conn, buf[:1]) + if err != nil { + return errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + bytesToDiscard = int(buf[0]) + default: + return errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) + } + + if cap(buf) < bytesToDiscard { + buf = make([]byte, bytesToDiscard) + } else { + buf = buf[:bytesToDiscard] + } + if _, err := io.ReadFull(conn, buf); err != nil { + return errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + // Also need to discard the port number + if _, err := io.ReadFull(conn, buf[:2]); err != nil { + return errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + return nil +} diff --git a/vendor/github.com/graph-gophers/graphql-go/Gopkg.lock b/vendor/github.com/graph-gophers/graphql-go/Gopkg.lock new file mode 100644 index 000000000000..4574275c5d79 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/Gopkg.lock @@ -0,0 +1,25 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/opentracing/opentracing-go" + packages = [ + ".", + "ext", + "log" + ] + revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38" + version = "v1.0.2" + +[[projects]] + branch = "master" + name = "golang.org/x/net" + packages = ["context"] + revision = "f5dfe339be1d06f81b22525fe34671ee7d2c8904" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "f417062128566756a9360b1c13ada79bdeeb6bab1f53ee9147a3328d95c1653f" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/graph-gophers/graphql-go/Gopkg.toml b/vendor/github.com/graph-gophers/graphql-go/Gopkg.toml new file mode 100644 index 000000000000..62b936799851 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/Gopkg.toml @@ -0,0 +1,10 @@ +# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html +# for detailed Gopkg.toml documentation. + +[[constraint]] + name = "github.com/opentracing/opentracing-go" + version = "1.0.2" + +[prune] + go-tests = true + unused-packages = true diff --git a/vendor/github.com/graph-gophers/graphql-go/LICENSE b/vendor/github.com/graph-gophers/graphql-go/LICENSE new file mode 100644 index 000000000000..3907cecacf28 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2016 Richard Musiol. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/graph-gophers/graphql-go/README.md b/vendor/github.com/graph-gophers/graphql-go/README.md new file mode 100644 index 000000000000..ef4b4639b522 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/README.md @@ -0,0 +1,100 @@ +# graphql-go [![Sourcegraph](https://sourcegraph.com/github.com/graph-gophers/graphql-go/-/badge.svg)](https://sourcegraph.com/github.com/graph-gophers/graphql-go?badge) [![Build Status](https://semaphoreci.com/api/v1/graph-gophers/graphql-go/branches/master/badge.svg)](https://semaphoreci.com/graph-gophers/graphql-go) [![GoDoc](https://godoc.org/github.com/graph-gophers/graphql-go?status.svg)](https://godoc.org/github.com/graph-gophers/graphql-go) + +

+ +The goal of this project is to provide full support of the [GraphQL draft specification](https://facebook.github.io/graphql/draft) with a set of idiomatic, easy to use Go packages. + +While still under heavy development (`internal` APIs are almost certainly subject to change), this library is +safe for production use. + +## Features + +- minimal API +- support for `context.Context` +- support for the `OpenTracing` standard +- schema type-checking against resolvers +- resolvers are matched to the schema based on method sets (can resolve a GraphQL schema with a Go interface or Go struct). +- handles panics in resolvers +- parallel execution of resolvers + +## Roadmap + +We're trying out the GitHub Project feature to manage `graphql-go`'s [development roadmap](https://github.com/graph-gophers/graphql-go/projects/1). +Feedback is welcome and appreciated. + +## (Some) Documentation + +### Basic Sample + +```go +package main + +import ( + "log" + "net/http" + + graphql "github.com/graph-gophers/graphql-go" + "github.com/graph-gophers/graphql-go/relay" +) + +type query struct{} + +func (_ *query) Hello() string { return "Hello, world!" } + +func main() { + s := ` + schema { + query: Query + } + type Query { + hello: String! + } + ` + schema := graphql.MustParseSchema(s, &query{}) + http.Handle("/query", &relay.Handler{Schema: schema}) + log.Fatal(http.ListenAndServe(":8080", nil)) +} +``` + +To test: +```sh +$ curl -XPOST -d '{"query": "{ hello }"}' localhost:8080/query +``` + +### Resolvers + +A resolver must have one method for each field of the GraphQL type it resolves. The method name has to be [exported](https://golang.org/ref/spec#Exported_identifiers) and match the field's name in a non-case-sensitive way. + +The method has up to two arguments: + +- Optional `context.Context` argument. +- Mandatory `*struct { ... }` argument if the corresponding GraphQL field has arguments. The names of the struct fields have to be [exported](https://golang.org/ref/spec#Exported_identifiers) and have to match the names of the GraphQL arguments in a non-case-sensitive way. + +The method has up to two results: + +- The GraphQL field's value as determined by the resolver. +- Optional `error` result. + +Example for a simple resolver method: + +```go +func (r *helloWorldResolver) Hello() string { + return "Hello world!" +} +``` + +The following signature is also allowed: + +```go +func (r *helloWorldResolver) Hello(ctx context.Context) (string, error) { + return "Hello world!", nil +} +``` + +### Community Examples + +[tonyghita/graphql-go-example](https://github.com/tonyghita/graphql-go-example) - A more "productionized" version of the Star Wars API example given in this repository. + +[deltaskelta/graphql-go-pets-example](https://github.com/deltaskelta/graphql-go-pets-example) - graphql-go resolving against a sqlite database + +[OscarYuen/go-graphql-starter](https://github.com/OscarYuen/go-graphql-starter) - a starter application integrated with dataloader, psql and basic authentication diff --git a/vendor/github.com/graph-gophers/graphql-go/errors/errors.go b/vendor/github.com/graph-gophers/graphql-go/errors/errors.go new file mode 100644 index 000000000000..fdfa62024db1 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/errors/errors.go @@ -0,0 +1,41 @@ +package errors + +import ( + "fmt" +) + +type QueryError struct { + Message string `json:"message"` + Locations []Location `json:"locations,omitempty"` + Path []interface{} `json:"path,omitempty"` + Rule string `json:"-"` + ResolverError error `json:"-"` +} + +type Location struct { + Line int `json:"line"` + Column int `json:"column"` +} + +func (a Location) Before(b Location) bool { + return a.Line < b.Line || (a.Line == b.Line && a.Column < b.Column) +} + +func Errorf(format string, a ...interface{}) *QueryError { + return &QueryError{ + Message: fmt.Sprintf(format, a...), + } +} + +func (err *QueryError) Error() string { + if err == nil { + return "" + } + str := fmt.Sprintf("graphql: %s", err.Message) + for _, loc := range err.Locations { + str += fmt.Sprintf(" (line %d, column %d)", loc.Line, loc.Column) + } + return str +} + +var _ error = &QueryError{} diff --git a/vendor/github.com/graph-gophers/graphql-go/graphql.go b/vendor/github.com/graph-gophers/graphql-go/graphql.go new file mode 100644 index 000000000000..06ffd4599749 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/graphql.go @@ -0,0 +1,205 @@ +package graphql + +import ( + "context" + "fmt" + + "encoding/json" + + "github.com/graph-gophers/graphql-go/errors" + "github.com/graph-gophers/graphql-go/internal/common" + "github.com/graph-gophers/graphql-go/internal/exec" + "github.com/graph-gophers/graphql-go/internal/exec/resolvable" + "github.com/graph-gophers/graphql-go/internal/exec/selected" + "github.com/graph-gophers/graphql-go/internal/query" + "github.com/graph-gophers/graphql-go/internal/schema" + "github.com/graph-gophers/graphql-go/internal/validation" + "github.com/graph-gophers/graphql-go/introspection" + "github.com/graph-gophers/graphql-go/log" + "github.com/graph-gophers/graphql-go/trace" +) + +// ParseSchema parses a GraphQL schema and attaches the given root resolver. It returns an error if +// the Go type signature of the resolvers does not match the schema. If nil is passed as the +// resolver, then the schema can not be executed, but it may be inspected (e.g. with ToJSON). +func ParseSchema(schemaString string, resolver interface{}, opts ...SchemaOpt) (*Schema, error) { + s := &Schema{ + schema: schema.New(), + maxParallelism: 10, + tracer: trace.OpenTracingTracer{}, + validationTracer: trace.NoopValidationTracer{}, + logger: &log.DefaultLogger{}, + } + for _, opt := range opts { + opt(s) + } + + if err := s.schema.Parse(schemaString); err != nil { + return nil, err + } + + if resolver != nil { + r, err := resolvable.ApplyResolver(s.schema, resolver) + if err != nil { + return nil, err + } + s.res = r + } + + return s, nil +} + +// MustParseSchema calls ParseSchema and panics on error. +func MustParseSchema(schemaString string, resolver interface{}, opts ...SchemaOpt) *Schema { + s, err := ParseSchema(schemaString, resolver, opts...) + if err != nil { + panic(err) + } + return s +} + +// Schema represents a GraphQL schema with an optional resolver. +type Schema struct { + schema *schema.Schema + res *resolvable.Schema + + maxDepth int + maxParallelism int + tracer trace.Tracer + validationTracer trace.ValidationTracer + logger log.Logger +} + +// SchemaOpt is an option to pass to ParseSchema or MustParseSchema. +type SchemaOpt func(*Schema) + +// MaxDepth specifies the maximum field nesting depth in a query. The default is 0 which disables max depth checking. +func MaxDepth(n int) SchemaOpt { + return func(s *Schema) { + s.maxDepth = n + } +} + +// MaxParallelism specifies the maximum number of resolvers per request allowed to run in parallel. The default is 10. +func MaxParallelism(n int) SchemaOpt { + return func(s *Schema) { + s.maxParallelism = n + } +} + +// Tracer is used to trace queries and fields. It defaults to trace.OpenTracingTracer. +func Tracer(tracer trace.Tracer) SchemaOpt { + return func(s *Schema) { + s.tracer = tracer + } +} + +// ValidationTracer is used to trace validation errors. It defaults to trace.NoopValidationTracer. +func ValidationTracer(tracer trace.ValidationTracer) SchemaOpt { + return func(s *Schema) { + s.validationTracer = tracer + } +} + +// Logger is used to log panics during query execution. It defaults to exec.DefaultLogger. +func Logger(logger log.Logger) SchemaOpt { + return func(s *Schema) { + s.logger = logger + } +} + +// Response represents a typical response of a GraphQL server. It may be encoded to JSON directly or +// it may be further processed to a custom response type, for example to include custom error data. +// Errors are intentionally serialized first based on the advice in https://github.com/facebook/graphql/commit/7b40390d48680b15cb93e02d46ac5eb249689876#diff-757cea6edf0288677a9eea4cfc801d87R107 +type Response struct { + Errors []*errors.QueryError `json:"errors,omitempty"` + Data json.RawMessage `json:"data,omitempty"` + Extensions map[string]interface{} `json:"extensions,omitempty"` +} + +// Validate validates the given query with the schema. +func (s *Schema) Validate(queryString string) []*errors.QueryError { + doc, qErr := query.Parse(queryString) + if qErr != nil { + return []*errors.QueryError{qErr} + } + + return validation.Validate(s.schema, doc, s.maxDepth) +} + +// Exec executes the given query with the schema's resolver. It panics if the schema was created +// without a resolver. If the context get cancelled, no further resolvers will be called and a +// the context error will be returned as soon as possible (not immediately). +func (s *Schema) Exec(ctx context.Context, queryString string, operationName string, variables map[string]interface{}) *Response { + if s.res == nil { + panic("schema created without resolver, can not exec") + } + return s.exec(ctx, queryString, operationName, variables, s.res) +} + +func (s *Schema) exec(ctx context.Context, queryString string, operationName string, variables map[string]interface{}, res *resolvable.Schema) *Response { + doc, qErr := query.Parse(queryString) + if qErr != nil { + return &Response{Errors: []*errors.QueryError{qErr}} + } + + validationFinish := s.validationTracer.TraceValidation() + errs := validation.Validate(s.schema, doc, s.maxDepth) + validationFinish(errs) + if len(errs) != 0 { + return &Response{Errors: errs} + } + + op, err := getOperation(doc, operationName) + if err != nil { + return &Response{Errors: []*errors.QueryError{errors.Errorf("%s", err)}} + } + + r := &exec.Request{ + Request: selected.Request{ + Doc: doc, + Vars: variables, + Schema: s.schema, + }, + Limiter: make(chan struct{}, s.maxParallelism), + Tracer: s.tracer, + Logger: s.logger, + } + varTypes := make(map[string]*introspection.Type) + for _, v := range op.Vars { + t, err := common.ResolveType(v.Type, s.schema.Resolve) + if err != nil { + return &Response{Errors: []*errors.QueryError{err}} + } + varTypes[v.Name.Name] = introspection.WrapType(t) + } + traceCtx, finish := s.tracer.TraceQuery(ctx, queryString, operationName, variables, varTypes) + data, errs := r.Execute(traceCtx, res, op) + finish(errs) + + return &Response{ + Data: data, + Errors: errs, + } +} + +func getOperation(document *query.Document, operationName string) (*query.Operation, error) { + if len(document.Operations) == 0 { + return nil, fmt.Errorf("no operations in query document") + } + + if operationName == "" { + if len(document.Operations) > 1 { + return nil, fmt.Errorf("more than one operation in query document and no operation name given") + } + for _, op := range document.Operations { + return op, nil // return the one and only operation + } + } + + op := document.Operations.Get(operationName) + if op == nil { + return nil, fmt.Errorf("no operation with name %q", operationName) + } + return op, nil +} diff --git a/vendor/github.com/graph-gophers/graphql-go/id.go b/vendor/github.com/graph-gophers/graphql-go/id.go new file mode 100644 index 000000000000..52771c413b03 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/id.go @@ -0,0 +1,30 @@ +package graphql + +import ( + "errors" + "strconv" +) + +// ID represents GraphQL's "ID" scalar type. A custom type may be used instead. +type ID string + +func (ID) ImplementsGraphQLType(name string) bool { + return name == "ID" +} + +func (id *ID) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + *id = ID(input) + case int32: + *id = ID(strconv.Itoa(int(input))) + default: + err = errors.New("wrong type") + } + return err +} + +func (id ID) MarshalJSON() ([]byte, error) { + return strconv.AppendQuote(nil, string(id)), nil +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/common/directive.go b/vendor/github.com/graph-gophers/graphql-go/internal/common/directive.go new file mode 100644 index 000000000000..62dca47f8166 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/common/directive.go @@ -0,0 +1,32 @@ +package common + +type Directive struct { + Name Ident + Args ArgumentList +} + +func ParseDirectives(l *Lexer) DirectiveList { + var directives DirectiveList + for l.Peek() == '@' { + l.ConsumeToken('@') + d := &Directive{} + d.Name = l.ConsumeIdentWithLoc() + d.Name.Loc.Column-- + if l.Peek() == '(' { + d.Args = ParseArguments(l) + } + directives = append(directives, d) + } + return directives +} + +type DirectiveList []*Directive + +func (l DirectiveList) Get(name string) *Directive { + for _, d := range l { + if d.Name.Name == name { + return d + } + } + return nil +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/common/lexer.go b/vendor/github.com/graph-gophers/graphql-go/internal/common/lexer.go new file mode 100644 index 000000000000..a38fcbaf7068 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/common/lexer.go @@ -0,0 +1,161 @@ +package common + +import ( + "fmt" + "strings" + "text/scanner" + + "github.com/graph-gophers/graphql-go/errors" +) + +type syntaxError string + +type Lexer struct { + sc *scanner.Scanner + next rune + descComment string +} + +type Ident struct { + Name string + Loc errors.Location +} + +func NewLexer(s string) *Lexer { + sc := &scanner.Scanner{ + Mode: scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats | scanner.ScanStrings, + } + sc.Init(strings.NewReader(s)) + + return &Lexer{sc: sc} +} + +func (l *Lexer) CatchSyntaxError(f func()) (errRes *errors.QueryError) { + defer func() { + if err := recover(); err != nil { + if err, ok := err.(syntaxError); ok { + errRes = errors.Errorf("syntax error: %s", err) + errRes.Locations = []errors.Location{l.Location()} + return + } + panic(err) + } + }() + + f() + return +} + +func (l *Lexer) Peek() rune { + return l.next +} + +// Consume whitespace and tokens equivalent to whitespace (e.g. commas and comments). +// +// Consumed comment characters will build the description for the next type or field encountered. +// The description is available from `DescComment()`, and will be reset every time `Consume()` is +// executed. +func (l *Lexer) Consume() { + l.descComment = "" + for { + l.next = l.sc.Scan() + + if l.next == ',' { + // Similar to white space and line terminators, commas (',') are used to improve the + // legibility of source text and separate lexical tokens but are otherwise syntactically and + // semantically insignificant within GraphQL documents. + // + // http://facebook.github.io/graphql/draft/#sec-Insignificant-Commas + continue + } + + if l.next == '#' { + // GraphQL source documents may contain single-line comments, starting with the '#' marker. + // + // A comment can contain any Unicode code point except `LineTerminator` so a comment always + // consists of all code points starting with the '#' character up to but not including the + // line terminator. + + l.consumeComment() + continue + } + + break + } +} + +func (l *Lexer) ConsumeIdent() string { + name := l.sc.TokenText() + l.ConsumeToken(scanner.Ident) + return name +} + +func (l *Lexer) ConsumeIdentWithLoc() Ident { + loc := l.Location() + name := l.sc.TokenText() + l.ConsumeToken(scanner.Ident) + return Ident{name, loc} +} + +func (l *Lexer) ConsumeKeyword(keyword string) { + if l.next != scanner.Ident || l.sc.TokenText() != keyword { + l.SyntaxError(fmt.Sprintf("unexpected %q, expecting %q", l.sc.TokenText(), keyword)) + } + l.Consume() +} + +func (l *Lexer) ConsumeLiteral() *BasicLit { + lit := &BasicLit{Type: l.next, Text: l.sc.TokenText()} + l.Consume() + return lit +} + +func (l *Lexer) ConsumeToken(expected rune) { + if l.next != expected { + l.SyntaxError(fmt.Sprintf("unexpected %q, expecting %s", l.sc.TokenText(), scanner.TokenString(expected))) + } + l.Consume() +} + +func (l *Lexer) DescComment() string { + return l.descComment +} + +func (l *Lexer) SyntaxError(message string) { + panic(syntaxError(message)) +} + +func (l *Lexer) Location() errors.Location { + return errors.Location{ + Line: l.sc.Line, + Column: l.sc.Column, + } +} + +// consumeComment consumes all characters from `#` to the first encountered line terminator. +// The characters are appended to `l.descComment`. +func (l *Lexer) consumeComment() { + if l.next != '#' { + return + } + + // TODO: count and trim whitespace so we can dedent any following lines. + if l.sc.Peek() == ' ' { + l.sc.Next() + } + + if l.descComment != "" { + // TODO: use a bytes.Buffer or strings.Builder instead of this. + l.descComment += "\n" + } + + for { + next := l.sc.Next() + if next == '\r' || next == '\n' || next == scanner.EOF { + break + } + + // TODO: use a bytes.Buffer or strings.Build instead of this. + l.descComment += string(next) + } +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/common/literals.go b/vendor/github.com/graph-gophers/graphql-go/internal/common/literals.go new file mode 100644 index 000000000000..e7bbe2638e9f --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/common/literals.go @@ -0,0 +1,206 @@ +package common + +import ( + "strconv" + "strings" + "text/scanner" + + "github.com/graph-gophers/graphql-go/errors" +) + +type Literal interface { + Value(vars map[string]interface{}) interface{} + String() string + Location() errors.Location +} + +type BasicLit struct { + Type rune + Text string + Loc errors.Location +} + +func (lit *BasicLit) Value(vars map[string]interface{}) interface{} { + switch lit.Type { + case scanner.Int: + value, err := strconv.ParseInt(lit.Text, 10, 32) + if err != nil { + panic(err) + } + return int32(value) + + case scanner.Float: + value, err := strconv.ParseFloat(lit.Text, 64) + if err != nil { + panic(err) + } + return value + + case scanner.String: + value, err := strconv.Unquote(lit.Text) + if err != nil { + panic(err) + } + return value + + case scanner.Ident: + switch lit.Text { + case "true": + return true + case "false": + return false + default: + return lit.Text + } + + default: + panic("invalid literal") + } +} + +func (lit *BasicLit) String() string { + return lit.Text +} + +func (lit *BasicLit) Location() errors.Location { + return lit.Loc +} + +type ListLit struct { + Entries []Literal + Loc errors.Location +} + +func (lit *ListLit) Value(vars map[string]interface{}) interface{} { + entries := make([]interface{}, len(lit.Entries)) + for i, entry := range lit.Entries { + entries[i] = entry.Value(vars) + } + return entries +} + +func (lit *ListLit) String() string { + entries := make([]string, len(lit.Entries)) + for i, entry := range lit.Entries { + entries[i] = entry.String() + } + return "[" + strings.Join(entries, ", ") + "]" +} + +func (lit *ListLit) Location() errors.Location { + return lit.Loc +} + +type ObjectLit struct { + Fields []*ObjectLitField + Loc errors.Location +} + +type ObjectLitField struct { + Name Ident + Value Literal +} + +func (lit *ObjectLit) Value(vars map[string]interface{}) interface{} { + fields := make(map[string]interface{}, len(lit.Fields)) + for _, f := range lit.Fields { + fields[f.Name.Name] = f.Value.Value(vars) + } + return fields +} + +func (lit *ObjectLit) String() string { + entries := make([]string, 0, len(lit.Fields)) + for _, f := range lit.Fields { + entries = append(entries, f.Name.Name+": "+f.Value.String()) + } + return "{" + strings.Join(entries, ", ") + "}" +} + +func (lit *ObjectLit) Location() errors.Location { + return lit.Loc +} + +type NullLit struct { + Loc errors.Location +} + +func (lit *NullLit) Value(vars map[string]interface{}) interface{} { + return nil +} + +func (lit *NullLit) String() string { + return "null" +} + +func (lit *NullLit) Location() errors.Location { + return lit.Loc +} + +type Variable struct { + Name string + Loc errors.Location +} + +func (v Variable) Value(vars map[string]interface{}) interface{} { + return vars[v.Name] +} + +func (v Variable) String() string { + return "$" + v.Name +} + +func (v *Variable) Location() errors.Location { + return v.Loc +} + +func ParseLiteral(l *Lexer, constOnly bool) Literal { + loc := l.Location() + switch l.Peek() { + case '$': + if constOnly { + l.SyntaxError("variable not allowed") + panic("unreachable") + } + l.ConsumeToken('$') + return &Variable{l.ConsumeIdent(), loc} + + case scanner.Int, scanner.Float, scanner.String, scanner.Ident: + lit := l.ConsumeLiteral() + if lit.Type == scanner.Ident && lit.Text == "null" { + return &NullLit{loc} + } + lit.Loc = loc + return lit + case '-': + l.ConsumeToken('-') + lit := l.ConsumeLiteral() + lit.Text = "-" + lit.Text + lit.Loc = loc + return lit + case '[': + l.ConsumeToken('[') + var list []Literal + for l.Peek() != ']' { + list = append(list, ParseLiteral(l, constOnly)) + } + l.ConsumeToken(']') + return &ListLit{list, loc} + + case '{': + l.ConsumeToken('{') + var fields []*ObjectLitField + for l.Peek() != '}' { + name := l.ConsumeIdentWithLoc() + l.ConsumeToken(':') + value := ParseLiteral(l, constOnly) + fields = append(fields, &ObjectLitField{name, value}) + } + l.ConsumeToken('}') + return &ObjectLit{fields, loc} + + default: + l.SyntaxError("invalid value") + panic("unreachable") + } +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/common/types.go b/vendor/github.com/graph-gophers/graphql-go/internal/common/types.go new file mode 100644 index 000000000000..a20ca309069c --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/common/types.go @@ -0,0 +1,80 @@ +package common + +import ( + "github.com/graph-gophers/graphql-go/errors" +) + +type Type interface { + Kind() string + String() string +} + +type List struct { + OfType Type +} + +type NonNull struct { + OfType Type +} + +type TypeName struct { + Ident +} + +func (*List) Kind() string { return "LIST" } +func (*NonNull) Kind() string { return "NON_NULL" } +func (*TypeName) Kind() string { panic("TypeName needs to be resolved to actual type") } + +func (t *List) String() string { return "[" + t.OfType.String() + "]" } +func (t *NonNull) String() string { return t.OfType.String() + "!" } +func (*TypeName) String() string { panic("TypeName needs to be resolved to actual type") } + +func ParseType(l *Lexer) Type { + t := parseNullType(l) + if l.Peek() == '!' { + l.ConsumeToken('!') + return &NonNull{OfType: t} + } + return t +} + +func parseNullType(l *Lexer) Type { + if l.Peek() == '[' { + l.ConsumeToken('[') + ofType := ParseType(l) + l.ConsumeToken(']') + return &List{OfType: ofType} + } + + return &TypeName{Ident: l.ConsumeIdentWithLoc()} +} + +type Resolver func(name string) Type + +func ResolveType(t Type, resolver Resolver) (Type, *errors.QueryError) { + switch t := t.(type) { + case *List: + ofType, err := ResolveType(t.OfType, resolver) + if err != nil { + return nil, err + } + return &List{OfType: ofType}, nil + case *NonNull: + ofType, err := ResolveType(t.OfType, resolver) + if err != nil { + return nil, err + } + return &NonNull{OfType: ofType}, nil + case *TypeName: + refT := resolver(t.Name) + if refT == nil { + err := errors.Errorf("Unknown type %q.", t.Name) + err.Rule = "KnownTypeNames" + err.Locations = []errors.Location{t.Loc} + return nil, err + } + return refT, nil + default: + return t, nil + } +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/common/values.go b/vendor/github.com/graph-gophers/graphql-go/internal/common/values.go new file mode 100644 index 000000000000..fcd456abfa5d --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/common/values.go @@ -0,0 +1,78 @@ +package common + +import ( + "github.com/graph-gophers/graphql-go/errors" +) + +// http://facebook.github.io/graphql/draft/#InputValueDefinition +type InputValue struct { + Name Ident + Type Type + Default Literal + Desc string + Loc errors.Location + TypeLoc errors.Location +} + +type InputValueList []*InputValue + +func (l InputValueList) Get(name string) *InputValue { + for _, v := range l { + if v.Name.Name == name { + return v + } + } + return nil +} + +func ParseInputValue(l *Lexer) *InputValue { + p := &InputValue{} + p.Loc = l.Location() + p.Desc = l.DescComment() + p.Name = l.ConsumeIdentWithLoc() + l.ConsumeToken(':') + p.TypeLoc = l.Location() + p.Type = ParseType(l) + if l.Peek() == '=' { + l.ConsumeToken('=') + p.Default = ParseLiteral(l, true) + } + return p +} + +type Argument struct { + Name Ident + Value Literal +} + +type ArgumentList []Argument + +func (l ArgumentList) Get(name string) (Literal, bool) { + for _, arg := range l { + if arg.Name.Name == name { + return arg.Value, true + } + } + return nil, false +} + +func (l ArgumentList) MustGet(name string) Literal { + value, ok := l.Get(name) + if !ok { + panic("argument not found") + } + return value +} + +func ParseArguments(l *Lexer) ArgumentList { + var args ArgumentList + l.ConsumeToken('(') + for l.Peek() != ')' { + name := l.ConsumeIdentWithLoc() + l.ConsumeToken(':') + value := ParseLiteral(l, false) + args = append(args, Argument{Name: name, Value: value}) + } + l.ConsumeToken(')') + return args +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/exec/exec.go b/vendor/github.com/graph-gophers/graphql-go/internal/exec/exec.go new file mode 100644 index 000000000000..e6cca7448d70 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/exec/exec.go @@ -0,0 +1,305 @@ +package exec + +import ( + "bytes" + "context" + "encoding/json" + "reflect" + "sync" + + "github.com/graph-gophers/graphql-go/errors" + "github.com/graph-gophers/graphql-go/internal/common" + "github.com/graph-gophers/graphql-go/internal/exec/resolvable" + "github.com/graph-gophers/graphql-go/internal/exec/selected" + "github.com/graph-gophers/graphql-go/internal/query" + "github.com/graph-gophers/graphql-go/internal/schema" + "github.com/graph-gophers/graphql-go/log" + "github.com/graph-gophers/graphql-go/trace" +) + +type Request struct { + selected.Request + Limiter chan struct{} + Tracer trace.Tracer + Logger log.Logger +} + +func (r *Request) handlePanic(ctx context.Context) { + if value := recover(); value != nil { + r.Logger.LogPanic(ctx, value) + r.AddError(makePanicError(value)) + } +} + +func makePanicError(value interface{}) *errors.QueryError { + return errors.Errorf("graphql: panic occurred: %v", value) +} + +func (r *Request) Execute(ctx context.Context, s *resolvable.Schema, op *query.Operation) ([]byte, []*errors.QueryError) { + var out bytes.Buffer + func() { + defer r.handlePanic(ctx) + sels := selected.ApplyOperation(&r.Request, s, op) + r.execSelections(ctx, sels, nil, s.Resolver, &out, op.Type == query.Mutation) + }() + + if err := ctx.Err(); err != nil { + return nil, []*errors.QueryError{errors.Errorf("%s", err)} + } + + return out.Bytes(), r.Errs +} + +type fieldToExec struct { + field *selected.SchemaField + sels []selected.Selection + resolver reflect.Value + out *bytes.Buffer +} + +func (r *Request) execSelections(ctx context.Context, sels []selected.Selection, path *pathSegment, resolver reflect.Value, out *bytes.Buffer, serially bool) { + async := !serially && selected.HasAsyncSel(sels) + + var fields []*fieldToExec + collectFieldsToResolve(sels, resolver, &fields, make(map[string]*fieldToExec)) + + if async { + var wg sync.WaitGroup + wg.Add(len(fields)) + for _, f := range fields { + go func(f *fieldToExec) { + defer wg.Done() + defer r.handlePanic(ctx) + f.out = new(bytes.Buffer) + execFieldSelection(ctx, r, f, &pathSegment{path, f.field.Alias}, true) + }(f) + } + wg.Wait() + } + + out.WriteByte('{') + for i, f := range fields { + if i > 0 { + out.WriteByte(',') + } + out.WriteByte('"') + out.WriteString(f.field.Alias) + out.WriteByte('"') + out.WriteByte(':') + if async { + out.Write(f.out.Bytes()) + continue + } + f.out = out + execFieldSelection(ctx, r, f, &pathSegment{path, f.field.Alias}, false) + } + out.WriteByte('}') +} + +func collectFieldsToResolve(sels []selected.Selection, resolver reflect.Value, fields *[]*fieldToExec, fieldByAlias map[string]*fieldToExec) { + for _, sel := range sels { + switch sel := sel.(type) { + case *selected.SchemaField: + field, ok := fieldByAlias[sel.Alias] + if !ok { // validation already checked for conflict (TODO) + field = &fieldToExec{field: sel, resolver: resolver} + fieldByAlias[sel.Alias] = field + *fields = append(*fields, field) + } + field.sels = append(field.sels, sel.Sels...) + + case *selected.TypenameField: + sf := &selected.SchemaField{ + Field: resolvable.MetaFieldTypename, + Alias: sel.Alias, + FixedResult: reflect.ValueOf(typeOf(sel, resolver)), + } + *fields = append(*fields, &fieldToExec{field: sf, resolver: resolver}) + + case *selected.TypeAssertion: + out := resolver.Method(sel.MethodIndex).Call(nil) + if !out[1].Bool() { + continue + } + collectFieldsToResolve(sel.Sels, out[0], fields, fieldByAlias) + + default: + panic("unreachable") + } + } +} + +func typeOf(tf *selected.TypenameField, resolver reflect.Value) string { + if len(tf.TypeAssertions) == 0 { + return tf.Name + } + for name, a := range tf.TypeAssertions { + out := resolver.Method(a.MethodIndex).Call(nil) + if out[1].Bool() { + return name + } + } + return "" +} + +func execFieldSelection(ctx context.Context, r *Request, f *fieldToExec, path *pathSegment, applyLimiter bool) { + if applyLimiter { + r.Limiter <- struct{}{} + } + + var result reflect.Value + var err *errors.QueryError + + traceCtx, finish := r.Tracer.TraceField(ctx, f.field.TraceLabel, f.field.TypeName, f.field.Name, !f.field.Async, f.field.Args) + defer func() { + finish(err) + }() + + err = func() (err *errors.QueryError) { + defer func() { + if panicValue := recover(); panicValue != nil { + r.Logger.LogPanic(ctx, panicValue) + err = makePanicError(panicValue) + err.Path = path.toSlice() + } + }() + + if f.field.FixedResult.IsValid() { + result = f.field.FixedResult + return nil + } + + if err := traceCtx.Err(); err != nil { + return errors.Errorf("%s", err) // don't execute any more resolvers if context got cancelled + } + + var in []reflect.Value + if f.field.HasContext { + in = append(in, reflect.ValueOf(traceCtx)) + } + if f.field.ArgsPacker != nil { + in = append(in, f.field.PackedArgs) + } + callOut := f.resolver.Method(f.field.MethodIndex).Call(in) + result = callOut[0] + if f.field.HasError && !callOut[1].IsNil() { + resolverErr := callOut[1].Interface().(error) + err := errors.Errorf("%s", resolverErr) + err.Path = path.toSlice() + err.ResolverError = resolverErr + return err + } + return nil + }() + + if applyLimiter { + <-r.Limiter + } + + if err != nil { + r.AddError(err) + f.out.WriteString("null") // TODO handle non-nil + return + } + + r.execSelectionSet(traceCtx, f.sels, f.field.Type, path, result, f.out) +} + +func (r *Request) execSelectionSet(ctx context.Context, sels []selected.Selection, typ common.Type, path *pathSegment, resolver reflect.Value, out *bytes.Buffer) { + t, nonNull := unwrapNonNull(typ) + switch t := t.(type) { + case *schema.Object, *schema.Interface, *schema.Union: + // a reflect.Value of a nil interface will show up as an Invalid value + if resolver.Kind() == reflect.Invalid || ((resolver.Kind() == reflect.Ptr || resolver.Kind() == reflect.Interface) && resolver.IsNil()) { + if nonNull { + panic(errors.Errorf("got nil for non-null %q", t)) + } + out.WriteString("null") + return + } + + r.execSelections(ctx, sels, path, resolver, out, false) + return + } + + if !nonNull { + if resolver.IsNil() { + out.WriteString("null") + return + } + resolver = resolver.Elem() + } + + switch t := t.(type) { + case *common.List: + l := resolver.Len() + + if selected.HasAsyncSel(sels) { + var wg sync.WaitGroup + wg.Add(l) + entryouts := make([]bytes.Buffer, l) + for i := 0; i < l; i++ { + go func(i int) { + defer wg.Done() + defer r.handlePanic(ctx) + r.execSelectionSet(ctx, sels, t.OfType, &pathSegment{path, i}, resolver.Index(i), &entryouts[i]) + }(i) + } + wg.Wait() + + out.WriteByte('[') + for i, entryout := range entryouts { + if i > 0 { + out.WriteByte(',') + } + out.Write(entryout.Bytes()) + } + out.WriteByte(']') + return + } + + out.WriteByte('[') + for i := 0; i < l; i++ { + if i > 0 { + out.WriteByte(',') + } + r.execSelectionSet(ctx, sels, t.OfType, &pathSegment{path, i}, resolver.Index(i), out) + } + out.WriteByte(']') + + case *schema.Scalar: + v := resolver.Interface() + data, err := json.Marshal(v) + if err != nil { + panic(errors.Errorf("could not marshal %v: %s", v, err)) + } + out.Write(data) + + case *schema.Enum: + out.WriteByte('"') + out.WriteString(resolver.String()) + out.WriteByte('"') + + default: + panic("unreachable") + } +} + +func unwrapNonNull(t common.Type) (common.Type, bool) { + if nn, ok := t.(*common.NonNull); ok { + return nn.OfType, true + } + return t, false +} + +type pathSegment struct { + parent *pathSegment + value interface{} +} + +func (p *pathSegment) toSlice() []interface{} { + if p == nil { + return nil + } + return append(p.parent.toSlice(), p.value) +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/exec/packer/packer.go b/vendor/github.com/graph-gophers/graphql-go/internal/exec/packer/packer.go new file mode 100644 index 000000000000..22706bcd1f1e --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/exec/packer/packer.go @@ -0,0 +1,371 @@ +package packer + +import ( + "fmt" + "math" + "reflect" + "strings" + + "github.com/graph-gophers/graphql-go/errors" + "github.com/graph-gophers/graphql-go/internal/common" + "github.com/graph-gophers/graphql-go/internal/schema" +) + +type packer interface { + Pack(value interface{}) (reflect.Value, error) +} + +type Builder struct { + packerMap map[typePair]*packerMapEntry + structPackers []*StructPacker +} + +type typePair struct { + graphQLType common.Type + resolverType reflect.Type +} + +type packerMapEntry struct { + packer packer + targets []*packer +} + +func NewBuilder() *Builder { + return &Builder{ + packerMap: make(map[typePair]*packerMapEntry), + } +} + +func (b *Builder) Finish() error { + for _, entry := range b.packerMap { + for _, target := range entry.targets { + *target = entry.packer + } + } + + for _, p := range b.structPackers { + p.defaultStruct = reflect.New(p.structType).Elem() + for _, f := range p.fields { + if defaultVal := f.field.Default; defaultVal != nil { + v, err := f.fieldPacker.Pack(defaultVal.Value(nil)) + if err != nil { + return err + } + p.defaultStruct.FieldByIndex(f.fieldIndex).Set(v) + } + } + } + + return nil +} + +func (b *Builder) assignPacker(target *packer, schemaType common.Type, reflectType reflect.Type) error { + k := typePair{schemaType, reflectType} + ref, ok := b.packerMap[k] + if !ok { + ref = &packerMapEntry{} + b.packerMap[k] = ref + var err error + ref.packer, err = b.makePacker(schemaType, reflectType) + if err != nil { + return err + } + } + ref.targets = append(ref.targets, target) + return nil +} + +func (b *Builder) makePacker(schemaType common.Type, reflectType reflect.Type) (packer, error) { + t, nonNull := unwrapNonNull(schemaType) + if !nonNull { + if reflectType.Kind() != reflect.Ptr { + return nil, fmt.Errorf("%s is not a pointer", reflectType) + } + elemType := reflectType.Elem() + addPtr := true + if _, ok := t.(*schema.InputObject); ok { + elemType = reflectType // keep pointer for input objects + addPtr = false + } + elem, err := b.makeNonNullPacker(t, elemType) + if err != nil { + return nil, err + } + return &nullPacker{ + elemPacker: elem, + valueType: reflectType, + addPtr: addPtr, + }, nil + } + + return b.makeNonNullPacker(t, reflectType) +} + +func (b *Builder) makeNonNullPacker(schemaType common.Type, reflectType reflect.Type) (packer, error) { + if u, ok := reflect.New(reflectType).Interface().(Unmarshaler); ok { + if !u.ImplementsGraphQLType(schemaType.String()) { + return nil, fmt.Errorf("can not unmarshal %s into %s", schemaType, reflectType) + } + return &unmarshalerPacker{ + ValueType: reflectType, + }, nil + } + + switch t := schemaType.(type) { + case *schema.Scalar: + return &ValuePacker{ + ValueType: reflectType, + }, nil + + case *schema.Enum: + if reflectType.Kind() != reflect.String { + return nil, fmt.Errorf("wrong type, expected %s", reflect.String) + } + return &ValuePacker{ + ValueType: reflectType, + }, nil + + case *schema.InputObject: + e, err := b.MakeStructPacker(t.Values, reflectType) + if err != nil { + return nil, err + } + return e, nil + + case *common.List: + if reflectType.Kind() != reflect.Slice { + return nil, fmt.Errorf("expected slice, got %s", reflectType) + } + p := &listPacker{ + sliceType: reflectType, + } + if err := b.assignPacker(&p.elem, t.OfType, reflectType.Elem()); err != nil { + return nil, err + } + return p, nil + + case *schema.Object, *schema.Interface, *schema.Union: + return nil, fmt.Errorf("type of kind %s can not be used as input", t.Kind()) + + default: + panic("unreachable") + } +} + +func (b *Builder) MakeStructPacker(values common.InputValueList, typ reflect.Type) (*StructPacker, error) { + structType := typ + usePtr := false + if typ.Kind() == reflect.Ptr { + structType = typ.Elem() + usePtr = true + } + if structType.Kind() != reflect.Struct { + return nil, fmt.Errorf("expected struct or pointer to struct, got %s", typ) + } + + var fields []*structPackerField + for _, v := range values { + fe := &structPackerField{field: v} + fx := func(n string) bool { + return strings.EqualFold(stripUnderscore(n), stripUnderscore(v.Name.Name)) + } + + sf, ok := structType.FieldByNameFunc(fx) + if !ok { + return nil, fmt.Errorf("missing argument %q", v.Name) + } + if sf.PkgPath != "" { + return nil, fmt.Errorf("field %q must be exported", sf.Name) + } + fe.fieldIndex = sf.Index + + ft := v.Type + if v.Default != nil { + ft, _ = unwrapNonNull(ft) + ft = &common.NonNull{OfType: ft} + } + + if err := b.assignPacker(&fe.fieldPacker, ft, sf.Type); err != nil { + return nil, fmt.Errorf("field %q: %s", sf.Name, err) + } + + fields = append(fields, fe) + } + + p := &StructPacker{ + structType: structType, + usePtr: usePtr, + fields: fields, + } + b.structPackers = append(b.structPackers, p) + return p, nil +} + +type StructPacker struct { + structType reflect.Type + usePtr bool + defaultStruct reflect.Value + fields []*structPackerField +} + +type structPackerField struct { + field *common.InputValue + fieldIndex []int + fieldPacker packer +} + +func (p *StructPacker) Pack(value interface{}) (reflect.Value, error) { + if value == nil { + return reflect.Value{}, errors.Errorf("got null for non-null") + } + + values := value.(map[string]interface{}) + v := reflect.New(p.structType) + v.Elem().Set(p.defaultStruct) + for _, f := range p.fields { + if value, ok := values[f.field.Name.Name]; ok { + packed, err := f.fieldPacker.Pack(value) + if err != nil { + return reflect.Value{}, err + } + v.Elem().FieldByIndex(f.fieldIndex).Set(packed) + } + } + if !p.usePtr { + return v.Elem(), nil + } + return v, nil +} + +type listPacker struct { + sliceType reflect.Type + elem packer +} + +func (e *listPacker) Pack(value interface{}) (reflect.Value, error) { + list, ok := value.([]interface{}) + if !ok { + list = []interface{}{value} + } + + v := reflect.MakeSlice(e.sliceType, len(list), len(list)) + for i := range list { + packed, err := e.elem.Pack(list[i]) + if err != nil { + return reflect.Value{}, err + } + v.Index(i).Set(packed) + } + return v, nil +} + +type nullPacker struct { + elemPacker packer + valueType reflect.Type + addPtr bool +} + +func (p *nullPacker) Pack(value interface{}) (reflect.Value, error) { + if value == nil { + return reflect.Zero(p.valueType), nil + } + + v, err := p.elemPacker.Pack(value) + if err != nil { + return reflect.Value{}, err + } + + if p.addPtr { + ptr := reflect.New(p.valueType.Elem()) + ptr.Elem().Set(v) + return ptr, nil + } + + return v, nil +} + +type ValuePacker struct { + ValueType reflect.Type +} + +func (p *ValuePacker) Pack(value interface{}) (reflect.Value, error) { + if value == nil { + return reflect.Value{}, errors.Errorf("got null for non-null") + } + + coerced, err := unmarshalInput(p.ValueType, value) + if err != nil { + return reflect.Value{}, fmt.Errorf("could not unmarshal %#v (%T) into %s: %s", value, value, p.ValueType, err) + } + return reflect.ValueOf(coerced), nil +} + +type unmarshalerPacker struct { + ValueType reflect.Type +} + +func (p *unmarshalerPacker) Pack(value interface{}) (reflect.Value, error) { + if value == nil { + return reflect.Value{}, errors.Errorf("got null for non-null") + } + + v := reflect.New(p.ValueType) + if err := v.Interface().(Unmarshaler).UnmarshalGraphQL(value); err != nil { + return reflect.Value{}, err + } + return v.Elem(), nil +} + +type Unmarshaler interface { + ImplementsGraphQLType(name string) bool + UnmarshalGraphQL(input interface{}) error +} + +func unmarshalInput(typ reflect.Type, input interface{}) (interface{}, error) { + if reflect.TypeOf(input) == typ { + return input, nil + } + + switch typ.Kind() { + case reflect.Int32: + switch input := input.(type) { + case int: + if input < math.MinInt32 || input > math.MaxInt32 { + return nil, fmt.Errorf("not a 32-bit integer") + } + return int32(input), nil + case float64: + coerced := int32(input) + if input < math.MinInt32 || input > math.MaxInt32 || float64(coerced) != input { + return nil, fmt.Errorf("not a 32-bit integer") + } + return coerced, nil + } + + case reflect.Float64: + switch input := input.(type) { + case int32: + return float64(input), nil + case int: + return float64(input), nil + } + + case reflect.String: + if reflect.TypeOf(input).ConvertibleTo(typ) { + return reflect.ValueOf(input).Convert(typ).Interface(), nil + } + } + + return nil, fmt.Errorf("incompatible type") +} + +func unwrapNonNull(t common.Type) (common.Type, bool) { + if nn, ok := t.(*common.NonNull); ok { + return nn.OfType, true + } + return t, false +} + +func stripUnderscore(s string) string { + return strings.Replace(s, "_", "", -1) +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/exec/resolvable/meta.go b/vendor/github.com/graph-gophers/graphql-go/internal/exec/resolvable/meta.go new file mode 100644 index 000000000000..826c8234841b --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/exec/resolvable/meta.go @@ -0,0 +1,58 @@ +package resolvable + +import ( + "fmt" + "reflect" + + "github.com/graph-gophers/graphql-go/internal/common" + "github.com/graph-gophers/graphql-go/internal/schema" + "github.com/graph-gophers/graphql-go/introspection" +) + +var MetaSchema *Object +var MetaType *Object + +func init() { + var err error + b := newBuilder(schema.Meta) + + metaSchema := schema.Meta.Types["__Schema"].(*schema.Object) + MetaSchema, err = b.makeObjectExec(metaSchema.Name, metaSchema.Fields, nil, false, reflect.TypeOf(&introspection.Schema{})) + if err != nil { + panic(err) + } + + metaType := schema.Meta.Types["__Type"].(*schema.Object) + MetaType, err = b.makeObjectExec(metaType.Name, metaType.Fields, nil, false, reflect.TypeOf(&introspection.Type{})) + if err != nil { + panic(err) + } + + if err := b.finish(); err != nil { + panic(err) + } +} + +var MetaFieldTypename = Field{ + Field: schema.Field{ + Name: "__typename", + Type: &common.NonNull{OfType: schema.Meta.Types["String"]}, + }, + TraceLabel: fmt.Sprintf("GraphQL field: __typename"), +} + +var MetaFieldSchema = Field{ + Field: schema.Field{ + Name: "__schema", + Type: schema.Meta.Types["__Schema"], + }, + TraceLabel: fmt.Sprintf("GraphQL field: __schema"), +} + +var MetaFieldType = Field{ + Field: schema.Field{ + Name: "__type", + Type: schema.Meta.Types["__Type"], + }, + TraceLabel: fmt.Sprintf("GraphQL field: __type"), +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/exec/resolvable/resolvable.go b/vendor/github.com/graph-gophers/graphql-go/internal/exec/resolvable/resolvable.go new file mode 100644 index 000000000000..3e5d9e44d90e --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/exec/resolvable/resolvable.go @@ -0,0 +1,331 @@ +package resolvable + +import ( + "context" + "fmt" + "reflect" + "strings" + + "github.com/graph-gophers/graphql-go/internal/common" + "github.com/graph-gophers/graphql-go/internal/exec/packer" + "github.com/graph-gophers/graphql-go/internal/schema" +) + +type Schema struct { + schema.Schema + Query Resolvable + Mutation Resolvable + Resolver reflect.Value +} + +type Resolvable interface { + isResolvable() +} + +type Object struct { + Name string + Fields map[string]*Field + TypeAssertions map[string]*TypeAssertion +} + +type Field struct { + schema.Field + TypeName string + MethodIndex int + HasContext bool + HasError bool + ArgsPacker *packer.StructPacker + ValueExec Resolvable + TraceLabel string +} + +type TypeAssertion struct { + MethodIndex int + TypeExec Resolvable +} + +type List struct { + Elem Resolvable +} + +type Scalar struct{} + +func (*Object) isResolvable() {} +func (*List) isResolvable() {} +func (*Scalar) isResolvable() {} + +func ApplyResolver(s *schema.Schema, resolver interface{}) (*Schema, error) { + b := newBuilder(s) + + var query, mutation Resolvable + + if t, ok := s.EntryPoints["query"]; ok { + if err := b.assignExec(&query, t, reflect.TypeOf(resolver)); err != nil { + return nil, err + } + } + + if t, ok := s.EntryPoints["mutation"]; ok { + if err := b.assignExec(&mutation, t, reflect.TypeOf(resolver)); err != nil { + return nil, err + } + } + + if err := b.finish(); err != nil { + return nil, err + } + + return &Schema{ + Schema: *s, + Resolver: reflect.ValueOf(resolver), + Query: query, + Mutation: mutation, + }, nil +} + +type execBuilder struct { + schema *schema.Schema + resMap map[typePair]*resMapEntry + packerBuilder *packer.Builder +} + +type typePair struct { + graphQLType common.Type + resolverType reflect.Type +} + +type resMapEntry struct { + exec Resolvable + targets []*Resolvable +} + +func newBuilder(s *schema.Schema) *execBuilder { + return &execBuilder{ + schema: s, + resMap: make(map[typePair]*resMapEntry), + packerBuilder: packer.NewBuilder(), + } +} + +func (b *execBuilder) finish() error { + for _, entry := range b.resMap { + for _, target := range entry.targets { + *target = entry.exec + } + } + + return b.packerBuilder.Finish() +} + +func (b *execBuilder) assignExec(target *Resolvable, t common.Type, resolverType reflect.Type) error { + k := typePair{t, resolverType} + ref, ok := b.resMap[k] + if !ok { + ref = &resMapEntry{} + b.resMap[k] = ref + var err error + ref.exec, err = b.makeExec(t, resolverType) + if err != nil { + return err + } + } + ref.targets = append(ref.targets, target) + return nil +} + +func (b *execBuilder) makeExec(t common.Type, resolverType reflect.Type) (Resolvable, error) { + var nonNull bool + t, nonNull = unwrapNonNull(t) + + switch t := t.(type) { + case *schema.Object: + return b.makeObjectExec(t.Name, t.Fields, nil, nonNull, resolverType) + + case *schema.Interface: + return b.makeObjectExec(t.Name, t.Fields, t.PossibleTypes, nonNull, resolverType) + + case *schema.Union: + return b.makeObjectExec(t.Name, nil, t.PossibleTypes, nonNull, resolverType) + } + + if !nonNull { + if resolverType.Kind() != reflect.Ptr { + return nil, fmt.Errorf("%s is not a pointer", resolverType) + } + resolverType = resolverType.Elem() + } + + switch t := t.(type) { + case *schema.Scalar: + return makeScalarExec(t, resolverType) + + case *schema.Enum: + return &Scalar{}, nil + + case *common.List: + if resolverType.Kind() != reflect.Slice { + return nil, fmt.Errorf("%s is not a slice", resolverType) + } + e := &List{} + if err := b.assignExec(&e.Elem, t.OfType, resolverType.Elem()); err != nil { + return nil, err + } + return e, nil + + default: + panic("invalid type: " + t.String()) + } +} + +func makeScalarExec(t *schema.Scalar, resolverType reflect.Type) (Resolvable, error) { + implementsType := false + switch r := reflect.New(resolverType).Interface().(type) { + case *int32: + implementsType = (t.Name == "Int") + case *float64: + implementsType = (t.Name == "Float") + case *string: + implementsType = (t.Name == "String") + case *bool: + implementsType = (t.Name == "Boolean") + case packer.Unmarshaler: + implementsType = r.ImplementsGraphQLType(t.Name) + } + if !implementsType { + return nil, fmt.Errorf("can not use %s as %s", resolverType, t.Name) + } + return &Scalar{}, nil +} + +func (b *execBuilder) makeObjectExec(typeName string, fields schema.FieldList, possibleTypes []*schema.Object, nonNull bool, resolverType reflect.Type) (*Object, error) { + if !nonNull { + if resolverType.Kind() != reflect.Ptr && resolverType.Kind() != reflect.Interface { + return nil, fmt.Errorf("%s is not a pointer or interface", resolverType) + } + } + + methodHasReceiver := resolverType.Kind() != reflect.Interface + + Fields := make(map[string]*Field) + for _, f := range fields { + methodIndex := findMethod(resolverType, f.Name) + if methodIndex == -1 { + hint := "" + if findMethod(reflect.PtrTo(resolverType), f.Name) != -1 { + hint = " (hint: the method exists on the pointer type)" + } + return nil, fmt.Errorf("%s does not resolve %q: missing method for field %q%s", resolverType, typeName, f.Name, hint) + } + + m := resolverType.Method(methodIndex) + fe, err := b.makeFieldExec(typeName, f, m, methodIndex, methodHasReceiver) + if err != nil { + return nil, fmt.Errorf("%s\n\treturned by (%s).%s", err, resolverType, m.Name) + } + Fields[f.Name] = fe + } + + typeAssertions := make(map[string]*TypeAssertion) + for _, impl := range possibleTypes { + methodIndex := findMethod(resolverType, "To"+impl.Name) + if methodIndex == -1 { + return nil, fmt.Errorf("%s does not resolve %q: missing method %q to convert to %q", resolverType, typeName, "To"+impl.Name, impl.Name) + } + if resolverType.Method(methodIndex).Type.NumOut() != 2 { + return nil, fmt.Errorf("%s does not resolve %q: method %q should return a value and a bool indicating success", resolverType, typeName, "To"+impl.Name) + } + a := &TypeAssertion{ + MethodIndex: methodIndex, + } + if err := b.assignExec(&a.TypeExec, impl, resolverType.Method(methodIndex).Type.Out(0)); err != nil { + return nil, err + } + typeAssertions[impl.Name] = a + } + + return &Object{ + Name: typeName, + Fields: Fields, + TypeAssertions: typeAssertions, + }, nil +} + +var contextType = reflect.TypeOf((*context.Context)(nil)).Elem() +var errorType = reflect.TypeOf((*error)(nil)).Elem() + +func (b *execBuilder) makeFieldExec(typeName string, f *schema.Field, m reflect.Method, methodIndex int, methodHasReceiver bool) (*Field, error) { + in := make([]reflect.Type, m.Type.NumIn()) + for i := range in { + in[i] = m.Type.In(i) + } + if methodHasReceiver { + in = in[1:] // first parameter is receiver + } + + hasContext := len(in) > 0 && in[0] == contextType + if hasContext { + in = in[1:] + } + + var argsPacker *packer.StructPacker + if len(f.Args) > 0 { + if len(in) == 0 { + return nil, fmt.Errorf("must have parameter for field arguments") + } + var err error + argsPacker, err = b.packerBuilder.MakeStructPacker(f.Args, in[0]) + if err != nil { + return nil, err + } + in = in[1:] + } + + if len(in) > 0 { + return nil, fmt.Errorf("too many parameters") + } + + if m.Type.NumOut() > 2 { + return nil, fmt.Errorf("too many return values") + } + + hasError := m.Type.NumOut() == 2 + if hasError { + if m.Type.Out(1) != errorType { + return nil, fmt.Errorf(`must have "error" as its second return value`) + } + } + + fe := &Field{ + Field: *f, + TypeName: typeName, + MethodIndex: methodIndex, + HasContext: hasContext, + ArgsPacker: argsPacker, + HasError: hasError, + TraceLabel: fmt.Sprintf("GraphQL field: %s.%s", typeName, f.Name), + } + if err := b.assignExec(&fe.ValueExec, f.Type, m.Type.Out(0)); err != nil { + return nil, err + } + return fe, nil +} + +func findMethod(t reflect.Type, name string) int { + for i := 0; i < t.NumMethod(); i++ { + if strings.EqualFold(stripUnderscore(name), stripUnderscore(t.Method(i).Name)) { + return i + } + } + return -1 +} + +func unwrapNonNull(t common.Type) (common.Type, bool) { + if nn, ok := t.(*common.NonNull); ok { + return nn.OfType, true + } + return t, false +} + +func stripUnderscore(s string) string { + return strings.Replace(s, "_", "", -1) +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/exec/selected/selected.go b/vendor/github.com/graph-gophers/graphql-go/internal/exec/selected/selected.go new file mode 100644 index 000000000000..aed079b6713a --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/exec/selected/selected.go @@ -0,0 +1,238 @@ +package selected + +import ( + "fmt" + "reflect" + "sync" + + "github.com/graph-gophers/graphql-go/errors" + "github.com/graph-gophers/graphql-go/internal/common" + "github.com/graph-gophers/graphql-go/internal/exec/packer" + "github.com/graph-gophers/graphql-go/internal/exec/resolvable" + "github.com/graph-gophers/graphql-go/internal/query" + "github.com/graph-gophers/graphql-go/internal/schema" + "github.com/graph-gophers/graphql-go/introspection" +) + +type Request struct { + Schema *schema.Schema + Doc *query.Document + Vars map[string]interface{} + Mu sync.Mutex + Errs []*errors.QueryError +} + +func (r *Request) AddError(err *errors.QueryError) { + r.Mu.Lock() + r.Errs = append(r.Errs, err) + r.Mu.Unlock() +} + +func ApplyOperation(r *Request, s *resolvable.Schema, op *query.Operation) []Selection { + var obj *resolvable.Object + switch op.Type { + case query.Query: + obj = s.Query.(*resolvable.Object) + case query.Mutation: + obj = s.Mutation.(*resolvable.Object) + } + return applySelectionSet(r, obj, op.Selections) +} + +type Selection interface { + isSelection() +} + +type SchemaField struct { + resolvable.Field + Alias string + Args map[string]interface{} + PackedArgs reflect.Value + Sels []Selection + Async bool + FixedResult reflect.Value +} + +type TypeAssertion struct { + resolvable.TypeAssertion + Sels []Selection +} + +type TypenameField struct { + resolvable.Object + Alias string +} + +func (*SchemaField) isSelection() {} +func (*TypeAssertion) isSelection() {} +func (*TypenameField) isSelection() {} + +func applySelectionSet(r *Request, e *resolvable.Object, sels []query.Selection) (flattenedSels []Selection) { + for _, sel := range sels { + switch sel := sel.(type) { + case *query.Field: + field := sel + if skipByDirective(r, field.Directives) { + continue + } + + switch field.Name.Name { + case "__typename": + flattenedSels = append(flattenedSels, &TypenameField{ + Object: *e, + Alias: field.Alias.Name, + }) + + case "__schema": + flattenedSels = append(flattenedSels, &SchemaField{ + Field: resolvable.MetaFieldSchema, + Alias: field.Alias.Name, + Sels: applySelectionSet(r, resolvable.MetaSchema, field.Selections), + Async: true, + FixedResult: reflect.ValueOf(introspection.WrapSchema(r.Schema)), + }) + + case "__type": + p := packer.ValuePacker{ValueType: reflect.TypeOf("")} + v, err := p.Pack(field.Arguments.MustGet("name").Value(r.Vars)) + if err != nil { + r.AddError(errors.Errorf("%s", err)) + return nil + } + + t, ok := r.Schema.Types[v.String()] + if !ok { + return nil + } + + flattenedSels = append(flattenedSels, &SchemaField{ + Field: resolvable.MetaFieldType, + Alias: field.Alias.Name, + Sels: applySelectionSet(r, resolvable.MetaType, field.Selections), + Async: true, + FixedResult: reflect.ValueOf(introspection.WrapType(t)), + }) + + default: + fe := e.Fields[field.Name.Name] + + var args map[string]interface{} + var packedArgs reflect.Value + if fe.ArgsPacker != nil { + args = make(map[string]interface{}) + for _, arg := range field.Arguments { + args[arg.Name.Name] = arg.Value.Value(r.Vars) + } + var err error + packedArgs, err = fe.ArgsPacker.Pack(args) + if err != nil { + r.AddError(errors.Errorf("%s", err)) + return + } + } + + fieldSels := applyField(r, fe.ValueExec, field.Selections) + flattenedSels = append(flattenedSels, &SchemaField{ + Field: *fe, + Alias: field.Alias.Name, + Args: args, + PackedArgs: packedArgs, + Sels: fieldSels, + Async: fe.HasContext || fe.ArgsPacker != nil || fe.HasError || HasAsyncSel(fieldSels), + }) + } + + case *query.InlineFragment: + frag := sel + if skipByDirective(r, frag.Directives) { + continue + } + flattenedSels = append(flattenedSels, applyFragment(r, e, &frag.Fragment)...) + + case *query.FragmentSpread: + spread := sel + if skipByDirective(r, spread.Directives) { + continue + } + flattenedSels = append(flattenedSels, applyFragment(r, e, &r.Doc.Fragments.Get(spread.Name.Name).Fragment)...) + + default: + panic("invalid type") + } + } + return +} + +func applyFragment(r *Request, e *resolvable.Object, frag *query.Fragment) []Selection { + if frag.On.Name != "" && frag.On.Name != e.Name { + a, ok := e.TypeAssertions[frag.On.Name] + if !ok { + panic(fmt.Errorf("%q does not implement %q", frag.On, e.Name)) // TODO proper error handling + } + + return []Selection{&TypeAssertion{ + TypeAssertion: *a, + Sels: applySelectionSet(r, a.TypeExec.(*resolvable.Object), frag.Selections), + }} + } + return applySelectionSet(r, e, frag.Selections) +} + +func applyField(r *Request, e resolvable.Resolvable, sels []query.Selection) []Selection { + switch e := e.(type) { + case *resolvable.Object: + return applySelectionSet(r, e, sels) + case *resolvable.List: + return applyField(r, e.Elem, sels) + case *resolvable.Scalar: + return nil + default: + panic("unreachable") + } +} + +func skipByDirective(r *Request, directives common.DirectiveList) bool { + if d := directives.Get("skip"); d != nil { + p := packer.ValuePacker{ValueType: reflect.TypeOf(false)} + v, err := p.Pack(d.Args.MustGet("if").Value(r.Vars)) + if err != nil { + r.AddError(errors.Errorf("%s", err)) + } + if err == nil && v.Bool() { + return true + } + } + + if d := directives.Get("include"); d != nil { + p := packer.ValuePacker{ValueType: reflect.TypeOf(false)} + v, err := p.Pack(d.Args.MustGet("if").Value(r.Vars)) + if err != nil { + r.AddError(errors.Errorf("%s", err)) + } + if err == nil && !v.Bool() { + return true + } + } + + return false +} + +func HasAsyncSel(sels []Selection) bool { + for _, sel := range sels { + switch sel := sel.(type) { + case *SchemaField: + if sel.Async { + return true + } + case *TypeAssertion: + if HasAsyncSel(sel.Sels) { + return true + } + case *TypenameField: + // sync + default: + panic("unreachable") + } + } + return false +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/query/query.go b/vendor/github.com/graph-gophers/graphql-go/internal/query/query.go new file mode 100644 index 000000000000..faba4d2adee4 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/query/query.go @@ -0,0 +1,234 @@ +package query + +import ( + "fmt" + "text/scanner" + + "github.com/graph-gophers/graphql-go/errors" + "github.com/graph-gophers/graphql-go/internal/common" +) + +type Document struct { + Operations OperationList + Fragments FragmentList +} + +type OperationList []*Operation + +func (l OperationList) Get(name string) *Operation { + for _, f := range l { + if f.Name.Name == name { + return f + } + } + return nil +} + +type FragmentList []*FragmentDecl + +func (l FragmentList) Get(name string) *FragmentDecl { + for _, f := range l { + if f.Name.Name == name { + return f + } + } + return nil +} + +type Operation struct { + Type OperationType + Name common.Ident + Vars common.InputValueList + Selections []Selection + Directives common.DirectiveList + Loc errors.Location +} + +type OperationType string + +const ( + Query OperationType = "QUERY" + Mutation = "MUTATION" + Subscription = "SUBSCRIPTION" +) + +type Fragment struct { + On common.TypeName + Selections []Selection +} + +type FragmentDecl struct { + Fragment + Name common.Ident + Directives common.DirectiveList + Loc errors.Location +} + +type Selection interface { + isSelection() +} + +type Field struct { + Alias common.Ident + Name common.Ident + Arguments common.ArgumentList + Directives common.DirectiveList + Selections []Selection + SelectionSetLoc errors.Location +} + +type InlineFragment struct { + Fragment + Directives common.DirectiveList + Loc errors.Location +} + +type FragmentSpread struct { + Name common.Ident + Directives common.DirectiveList + Loc errors.Location +} + +func (Field) isSelection() {} +func (InlineFragment) isSelection() {} +func (FragmentSpread) isSelection() {} + +func Parse(queryString string) (*Document, *errors.QueryError) { + l := common.NewLexer(queryString) + + var doc *Document + err := l.CatchSyntaxError(func() { doc = parseDocument(l) }) + if err != nil { + return nil, err + } + + return doc, nil +} + +func parseDocument(l *common.Lexer) *Document { + d := &Document{} + l.Consume() + for l.Peek() != scanner.EOF { + if l.Peek() == '{' { + op := &Operation{Type: Query, Loc: l.Location()} + op.Selections = parseSelectionSet(l) + d.Operations = append(d.Operations, op) + continue + } + + loc := l.Location() + switch x := l.ConsumeIdent(); x { + case "query": + op := parseOperation(l, Query) + op.Loc = loc + d.Operations = append(d.Operations, op) + + case "mutation": + d.Operations = append(d.Operations, parseOperation(l, Mutation)) + + case "subscription": + d.Operations = append(d.Operations, parseOperation(l, Subscription)) + + case "fragment": + frag := parseFragment(l) + frag.Loc = loc + d.Fragments = append(d.Fragments, frag) + + default: + l.SyntaxError(fmt.Sprintf(`unexpected %q, expecting "fragment"`, x)) + } + } + return d +} + +func parseOperation(l *common.Lexer, opType OperationType) *Operation { + op := &Operation{Type: opType} + op.Name.Loc = l.Location() + if l.Peek() == scanner.Ident { + op.Name = l.ConsumeIdentWithLoc() + } + op.Directives = common.ParseDirectives(l) + if l.Peek() == '(' { + l.ConsumeToken('(') + for l.Peek() != ')' { + loc := l.Location() + l.ConsumeToken('$') + iv := common.ParseInputValue(l) + iv.Loc = loc + op.Vars = append(op.Vars, iv) + } + l.ConsumeToken(')') + } + op.Selections = parseSelectionSet(l) + return op +} + +func parseFragment(l *common.Lexer) *FragmentDecl { + f := &FragmentDecl{} + f.Name = l.ConsumeIdentWithLoc() + l.ConsumeKeyword("on") + f.On = common.TypeName{Ident: l.ConsumeIdentWithLoc()} + f.Directives = common.ParseDirectives(l) + f.Selections = parseSelectionSet(l) + return f +} + +func parseSelectionSet(l *common.Lexer) []Selection { + var sels []Selection + l.ConsumeToken('{') + for l.Peek() != '}' { + sels = append(sels, parseSelection(l)) + } + l.ConsumeToken('}') + return sels +} + +func parseSelection(l *common.Lexer) Selection { + if l.Peek() == '.' { + return parseSpread(l) + } + return parseField(l) +} + +func parseField(l *common.Lexer) *Field { + f := &Field{} + f.Alias = l.ConsumeIdentWithLoc() + f.Name = f.Alias + if l.Peek() == ':' { + l.ConsumeToken(':') + f.Name = l.ConsumeIdentWithLoc() + } + if l.Peek() == '(' { + f.Arguments = common.ParseArguments(l) + } + f.Directives = common.ParseDirectives(l) + if l.Peek() == '{' { + f.SelectionSetLoc = l.Location() + f.Selections = parseSelectionSet(l) + } + return f +} + +func parseSpread(l *common.Lexer) Selection { + loc := l.Location() + l.ConsumeToken('.') + l.ConsumeToken('.') + l.ConsumeToken('.') + + f := &InlineFragment{Loc: loc} + if l.Peek() == scanner.Ident { + ident := l.ConsumeIdentWithLoc() + if ident.Name != "on" { + fs := &FragmentSpread{ + Name: ident, + Loc: loc, + } + fs.Directives = common.ParseDirectives(l) + return fs + } + f.On = common.TypeName{Ident: l.ConsumeIdentWithLoc()} + } + f.Directives = common.ParseDirectives(l) + f.Selections = parseSelectionSet(l) + return f +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/schema/meta.go b/vendor/github.com/graph-gophers/graphql-go/internal/schema/meta.go new file mode 100644 index 000000000000..b48bf7acf286 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/schema/meta.go @@ -0,0 +1,190 @@ +package schema + +var Meta *Schema + +func init() { + Meta = &Schema{} // bootstrap + Meta = New() + if err := Meta.Parse(metaSrc); err != nil { + panic(err) + } +} + +var metaSrc = ` + # The ` + "`" + `Int` + "`" + ` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. + scalar Int + + # The ` + "`" + `Float` + "`" + ` scalar type represents signed double-precision fractional values as specified by [IEEE 754](http://en.wikipedia.org/wiki/IEEE_floating_point). + scalar Float + + # The ` + "`" + `String` + "`" + ` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. + scalar String + + # The ` + "`" + `Boolean` + "`" + ` scalar type represents ` + "`" + `true` + "`" + ` or ` + "`" + `false` + "`" + `. + scalar Boolean + + # The ` + "`" + `ID` + "`" + ` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as ` + "`" + `"4"` + "`" + `) or integer (such as ` + "`" + `4` + "`" + `) input value will be accepted as an ID. + scalar ID + + # Directs the executor to include this field or fragment only when the ` + "`" + `if` + "`" + ` argument is true. + directive @include( + # Included when true. + if: Boolean! + ) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT + + # Directs the executor to skip this field or fragment when the ` + "`" + `if` + "`" + ` argument is true. + directive @skip( + # Skipped when true. + if: Boolean! + ) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT + + # Marks an element of a GraphQL schema as no longer supported. + directive @deprecated( + # Explains why this element was deprecated, usually also including a suggestion + # for how to access supported similar data. Formatted in + # [Markdown](https://daringfireball.net/projects/markdown/). + reason: String = "No longer supported" + ) on FIELD_DEFINITION | ENUM_VALUE + + # A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document. + # + # In some cases, you need to provide options to alter GraphQL's execution behavior + # in ways field arguments will not suffice, such as conditionally including or + # skipping a field. Directives provide this by describing additional information + # to the executor. + type __Directive { + name: String! + description: String + locations: [__DirectiveLocation!]! + args: [__InputValue!]! + } + + # A Directive can be adjacent to many parts of the GraphQL language, a + # __DirectiveLocation describes one such possible adjacencies. + enum __DirectiveLocation { + # Location adjacent to a query operation. + QUERY + # Location adjacent to a mutation operation. + MUTATION + # Location adjacent to a subscription operation. + SUBSCRIPTION + # Location adjacent to a field. + FIELD + # Location adjacent to a fragment definition. + FRAGMENT_DEFINITION + # Location adjacent to a fragment spread. + FRAGMENT_SPREAD + # Location adjacent to an inline fragment. + INLINE_FRAGMENT + # Location adjacent to a schema definition. + SCHEMA + # Location adjacent to a scalar definition. + SCALAR + # Location adjacent to an object type definition. + OBJECT + # Location adjacent to a field definition. + FIELD_DEFINITION + # Location adjacent to an argument definition. + ARGUMENT_DEFINITION + # Location adjacent to an interface definition. + INTERFACE + # Location adjacent to a union definition. + UNION + # Location adjacent to an enum definition. + ENUM + # Location adjacent to an enum value definition. + ENUM_VALUE + # Location adjacent to an input object type definition. + INPUT_OBJECT + # Location adjacent to an input object field definition. + INPUT_FIELD_DEFINITION + } + + # One possible value for a given Enum. Enum values are unique values, not a + # placeholder for a string or numeric value. However an Enum value is returned in + # a JSON response as a string. + type __EnumValue { + name: String! + description: String + isDeprecated: Boolean! + deprecationReason: String + } + + # Object and Interface types are described by a list of Fields, each of which has + # a name, potentially a list of arguments, and a return type. + type __Field { + name: String! + description: String + args: [__InputValue!]! + type: __Type! + isDeprecated: Boolean! + deprecationReason: String + } + + # Arguments provided to Fields or Directives and the input fields of an + # InputObject are represented as Input Values which describe their type and + # optionally a default value. + type __InputValue { + name: String! + description: String + type: __Type! + # A GraphQL-formatted string representing the default value for this input value. + defaultValue: String + } + + # A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all + # available types and directives on the server, as well as the entry points for + # query, mutation, and subscription operations. + type __Schema { + # A list of all types supported by this server. + types: [__Type!]! + # The type that query operations will be rooted at. + queryType: __Type! + # If this server supports mutation, the type that mutation operations will be rooted at. + mutationType: __Type + # If this server support subscription, the type that subscription operations will be rooted at. + subscriptionType: __Type + # A list of all directives supported by this server. + directives: [__Directive!]! + } + + # The fundamental unit of any GraphQL Schema is the type. There are many kinds of + # types in GraphQL as represented by the ` + "`" + `__TypeKind` + "`" + ` enum. + # + # Depending on the kind of a type, certain fields describe information about that + # type. Scalar types provide no information beyond a name and description, while + # Enum types provide their values. Object and Interface types provide the fields + # they describe. Abstract types, Union and Interface, provide the Object types + # possible at runtime. List and NonNull types compose other types. + type __Type { + kind: __TypeKind! + name: String + description: String + fields(includeDeprecated: Boolean = false): [__Field!] + interfaces: [__Type!] + possibleTypes: [__Type!] + enumValues(includeDeprecated: Boolean = false): [__EnumValue!] + inputFields: [__InputValue!] + ofType: __Type + } + + # An enum describing what kind of type a given ` + "`" + `__Type` + "`" + ` is. + enum __TypeKind { + # Indicates this type is a scalar. + SCALAR + # Indicates this type is an object. ` + "`" + `fields` + "`" + ` and ` + "`" + `interfaces` + "`" + ` are valid fields. + OBJECT + # Indicates this type is an interface. ` + "`" + `fields` + "`" + ` and ` + "`" + `possibleTypes` + "`" + ` are valid fields. + INTERFACE + # Indicates this type is a union. ` + "`" + `possibleTypes` + "`" + ` is a valid field. + UNION + # Indicates this type is an enum. ` + "`" + `enumValues` + "`" + ` is a valid field. + ENUM + # Indicates this type is an input object. ` + "`" + `inputFields` + "`" + ` is a valid field. + INPUT_OBJECT + # Indicates this type is a list. ` + "`" + `ofType` + "`" + ` is a valid field. + LIST + # Indicates this type is a non-null. ` + "`" + `ofType` + "`" + ` is a valid field. + NON_NULL + } +` diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/schema/schema.go b/vendor/github.com/graph-gophers/graphql-go/internal/schema/schema.go new file mode 100644 index 000000000000..e549f17c07ed --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/schema/schema.go @@ -0,0 +1,570 @@ +package schema + +import ( + "fmt" + "text/scanner" + + "github.com/graph-gophers/graphql-go/errors" + "github.com/graph-gophers/graphql-go/internal/common" +) + +// Schema represents a GraphQL service's collective type system capabilities. +// A schema is defined in terms of the types and directives it supports as well as the root +// operation types for each kind of operation: `query`, `mutation`, and `subscription`. +// +// For a more formal definition, read the relevant section in the specification: +// +// http://facebook.github.io/graphql/draft/#sec-Schema +type Schema struct { + // EntryPoints determines the place in the type system where `query`, `mutation`, and + // `subscription` operations begin. + // + // http://facebook.github.io/graphql/draft/#sec-Root-Operation-Types + // + // NOTE: The specification refers to this concept as "Root Operation Types". + // TODO: Rename the `EntryPoints` field to `RootOperationTypes` to align with spec terminology. + EntryPoints map[string]NamedType + + // Types are the fundamental unit of any GraphQL schema. + // There are six kinds of named types, and two wrapping types. + // + // http://facebook.github.io/graphql/draft/#sec-Types + Types map[string]NamedType + + // TODO: Type extensions? + // http://facebook.github.io/graphql/draft/#sec-Type-Extensions + + // Directives are used to annotate various parts of a GraphQL document as an indicator that they + // should be evaluated differently by a validator, executor, or client tool such as a code + // generator. + // + // http://facebook.github.io/graphql/draft/#sec-Type-System.Directives + Directives map[string]*DirectiveDecl + + entryPointNames map[string]string + objects []*Object + unions []*Union + enums []*Enum +} + +// Resolve a named type in the schema by its name. +func (s *Schema) Resolve(name string) common.Type { + return s.Types[name] +} + +// NamedType represents a type with a name. +// +// http://facebook.github.io/graphql/draft/#NamedType +type NamedType interface { + common.Type + TypeName() string + Description() string +} + +// Scalar types represent primitive leaf values (e.g. a string or an integer) in a GraphQL type +// system. +// +// GraphQL responses take the form of a hierarchical tree; the leaves on these trees are GraphQL +// scalars. +// +// http://facebook.github.io/graphql/draft/#sec-Scalars +type Scalar struct { + Name string + Desc string + // TODO: Add a list of directives? +} + +// Object types represent a list of named fields, each of which yield a value of a specific type. +// +// GraphQL queries are hierarchical and composed, describing a tree of information. +// While Scalar types describe the leaf values of these hierarchical types, Objects describe the +// intermediate levels. +// +// http://facebook.github.io/graphql/draft/#sec-Objects +type Object struct { + Name string + Interfaces []*Interface + Fields FieldList + Desc string + // TODO: Add a list of directives? + + interfaceNames []string +} + +// Interface types represent a list of named fields and their arguments. +// +// GraphQL objects can then implement these interfaces which requires that the object type will +// define all fields defined by those interfaces. +// +// http://facebook.github.io/graphql/draft/#sec-Interfaces +type Interface struct { + Name string + PossibleTypes []*Object + Fields FieldList // NOTE: the spec refers to this as `FieldsDefinition`. + Desc string + // TODO: Add a list of directives? +} + +// Union types represent objects that could be one of a list of GraphQL object types, but provides no +// guaranteed fields between those types. +// +// They also differ from interfaces in that object types declare what interfaces they implement, but +// are not aware of what unions contain them. +// +// http://facebook.github.io/graphql/draft/#sec-Unions +type Union struct { + Name string + PossibleTypes []*Object // NOTE: the spec refers to this as `UnionMemberTypes`. + Desc string + // TODO: Add a list of directives? + + typeNames []string +} + +// Enum types describe a set of possible values. +// +// Like scalar types, Enum types also represent leaf values in a GraphQL type system. +// +// http://facebook.github.io/graphql/draft/#sec-Enums +type Enum struct { + Name string + Values []*EnumValue // NOTE: the spec refers to this as `EnumValuesDefinition`. + Desc string + // TODO: Add a list of directives? +} + +// EnumValue types are unique values that may be serialized as a string: the name of the +// represented value. +// +// http://facebook.github.io/graphql/draft/#EnumValueDefinition +type EnumValue struct { + Name string + Directives common.DirectiveList + Desc string + // TODO: Add a list of directives? +} + +// InputObject types define a set of input fields; the input fields are either scalars, enums, or +// other input objects. +// +// This allows arguments to accept arbitrarily complex structs. +// +// http://facebook.github.io/graphql/draft/#sec-Input-Objects +type InputObject struct { + Name string + Desc string + Values common.InputValueList + // TODO: Add a list of directives? +} + +// FieldsList is a list of an Object's Fields. +// +// http://facebook.github.io/graphql/draft/#FieldsDefinition +type FieldList []*Field + +// Get iterates over the field list, returning a pointer-to-Field when the field name matches the +// provided `name` argument. +// Returns nil when no field was found by that name. +func (l FieldList) Get(name string) *Field { + for _, f := range l { + if f.Name == name { + return f + } + } + return nil +} + +// Names returns a string slice of the field names in the FieldList. +func (l FieldList) Names() []string { + names := make([]string, len(l)) + for i, f := range l { + names[i] = f.Name + } + return names +} + +// http://facebook.github.io/graphql/draft/#sec-Type-System.Directives +type DirectiveDecl struct { + Name string + Desc string + Locs []string + Args common.InputValueList +} + +func (*Scalar) Kind() string { return "SCALAR" } +func (*Object) Kind() string { return "OBJECT" } +func (*Interface) Kind() string { return "INTERFACE" } +func (*Union) Kind() string { return "UNION" } +func (*Enum) Kind() string { return "ENUM" } +func (*InputObject) Kind() string { return "INPUT_OBJECT" } + +func (t *Scalar) String() string { return t.Name } +func (t *Object) String() string { return t.Name } +func (t *Interface) String() string { return t.Name } +func (t *Union) String() string { return t.Name } +func (t *Enum) String() string { return t.Name } +func (t *InputObject) String() string { return t.Name } + +func (t *Scalar) TypeName() string { return t.Name } +func (t *Object) TypeName() string { return t.Name } +func (t *Interface) TypeName() string { return t.Name } +func (t *Union) TypeName() string { return t.Name } +func (t *Enum) TypeName() string { return t.Name } +func (t *InputObject) TypeName() string { return t.Name } + +func (t *Scalar) Description() string { return t.Desc } +func (t *Object) Description() string { return t.Desc } +func (t *Interface) Description() string { return t.Desc } +func (t *Union) Description() string { return t.Desc } +func (t *Enum) Description() string { return t.Desc } +func (t *InputObject) Description() string { return t.Desc } + +// Field is a conceptual function which yields values. +// http://facebook.github.io/graphql/draft/#FieldDefinition +type Field struct { + Name string + Args common.InputValueList // NOTE: the spec refers to this as `ArgumentsDefinition`. + Type common.Type + Directives common.DirectiveList + Desc string +} + +// New initializes an instance of Schema. +func New() *Schema { + s := &Schema{ + entryPointNames: make(map[string]string), + Types: make(map[string]NamedType), + Directives: make(map[string]*DirectiveDecl), + } + for n, t := range Meta.Types { + s.Types[n] = t + } + for n, d := range Meta.Directives { + s.Directives[n] = d + } + return s +} + +// Parse the schema string. +func (s *Schema) Parse(schemaString string) error { + l := common.NewLexer(schemaString) + + err := l.CatchSyntaxError(func() { parseSchema(s, l) }) + if err != nil { + return err + } + + for _, t := range s.Types { + if err := resolveNamedType(s, t); err != nil { + return err + } + } + for _, d := range s.Directives { + for _, arg := range d.Args { + t, err := common.ResolveType(arg.Type, s.Resolve) + if err != nil { + return err + } + arg.Type = t + } + } + + s.EntryPoints = make(map[string]NamedType) + for key, name := range s.entryPointNames { + t, ok := s.Types[name] + if !ok { + if !ok { + return errors.Errorf("type %q not found", name) + } + } + s.EntryPoints[key] = t + } + + for _, obj := range s.objects { + obj.Interfaces = make([]*Interface, len(obj.interfaceNames)) + for i, intfName := range obj.interfaceNames { + t, ok := s.Types[intfName] + if !ok { + return errors.Errorf("interface %q not found", intfName) + } + intf, ok := t.(*Interface) + if !ok { + return errors.Errorf("type %q is not an interface", intfName) + } + obj.Interfaces[i] = intf + intf.PossibleTypes = append(intf.PossibleTypes, obj) + } + } + + for _, union := range s.unions { + union.PossibleTypes = make([]*Object, len(union.typeNames)) + for i, name := range union.typeNames { + t, ok := s.Types[name] + if !ok { + return errors.Errorf("object type %q not found", name) + } + obj, ok := t.(*Object) + if !ok { + return errors.Errorf("type %q is not an object", name) + } + union.PossibleTypes[i] = obj + } + } + + for _, enum := range s.enums { + for _, value := range enum.Values { + if err := resolveDirectives(s, value.Directives); err != nil { + return err + } + } + } + + return nil +} + +func resolveNamedType(s *Schema, t NamedType) error { + switch t := t.(type) { + case *Object: + for _, f := range t.Fields { + if err := resolveField(s, f); err != nil { + return err + } + } + case *Interface: + for _, f := range t.Fields { + if err := resolveField(s, f); err != nil { + return err + } + } + case *InputObject: + if err := resolveInputObject(s, t.Values); err != nil { + return err + } + } + return nil +} + +func resolveField(s *Schema, f *Field) error { + t, err := common.ResolveType(f.Type, s.Resolve) + if err != nil { + return err + } + f.Type = t + if err := resolveDirectives(s, f.Directives); err != nil { + return err + } + return resolveInputObject(s, f.Args) +} + +func resolveDirectives(s *Schema, directives common.DirectiveList) error { + for _, d := range directives { + dirName := d.Name.Name + dd, ok := s.Directives[dirName] + if !ok { + return errors.Errorf("directive %q not found", dirName) + } + for _, arg := range d.Args { + if dd.Args.Get(arg.Name.Name) == nil { + return errors.Errorf("invalid argument %q for directive %q", arg.Name.Name, dirName) + } + } + for _, arg := range dd.Args { + if _, ok := d.Args.Get(arg.Name.Name); !ok { + d.Args = append(d.Args, common.Argument{Name: arg.Name, Value: arg.Default}) + } + } + } + return nil +} + +func resolveInputObject(s *Schema, values common.InputValueList) error { + for _, v := range values { + t, err := common.ResolveType(v.Type, s.Resolve) + if err != nil { + return err + } + v.Type = t + } + return nil +} + +func parseSchema(s *Schema, l *common.Lexer) { + l.Consume() + + for l.Peek() != scanner.EOF { + desc := l.DescComment() + switch x := l.ConsumeIdent(); x { + + case "schema": + l.ConsumeToken('{') + for l.Peek() != '}' { + name := l.ConsumeIdent() + l.ConsumeToken(':') + typ := l.ConsumeIdent() + s.entryPointNames[name] = typ + } + l.ConsumeToken('}') + + case "type": + obj := parseObjectDef(l) + obj.Desc = desc + s.Types[obj.Name] = obj + s.objects = append(s.objects, obj) + + case "interface": + iface := parseInterfaceDef(l) + iface.Desc = desc + s.Types[iface.Name] = iface + + case "union": + union := parseUnionDef(l) + union.Desc = desc + s.Types[union.Name] = union + s.unions = append(s.unions, union) + + case "enum": + enum := parseEnumDef(l) + enum.Desc = desc + s.Types[enum.Name] = enum + s.enums = append(s.enums, enum) + + case "input": + input := parseInputDef(l) + input.Desc = desc + s.Types[input.Name] = input + + case "scalar": + name := l.ConsumeIdent() + s.Types[name] = &Scalar{Name: name, Desc: desc} + + case "directive": + directive := parseDirectiveDef(l) + directive.Desc = desc + s.Directives[directive.Name] = directive + + default: + // TODO: Add support for type extensions. + l.SyntaxError(fmt.Sprintf(`unexpected %q, expecting "schema", "type", "enum", "interface", "union", "input", "scalar" or "directive"`, x)) + } + } +} + +func parseObjectDef(l *common.Lexer) *Object { + object := &Object{Name: l.ConsumeIdent()} + + if l.Peek() == scanner.Ident { + l.ConsumeKeyword("implements") + + for l.Peek() != '{' { + if l.Peek() == '&' { + l.ConsumeToken('&') + } + + object.interfaceNames = append(object.interfaceNames, l.ConsumeIdent()) + } + } + + l.ConsumeToken('{') + object.Fields = parseFieldsDef(l) + l.ConsumeToken('}') + + return object +} + +func parseInterfaceDef(l *common.Lexer) *Interface { + i := &Interface{Name: l.ConsumeIdent()} + + l.ConsumeToken('{') + i.Fields = parseFieldsDef(l) + l.ConsumeToken('}') + + return i +} + +func parseUnionDef(l *common.Lexer) *Union { + union := &Union{Name: l.ConsumeIdent()} + + l.ConsumeToken('=') + union.typeNames = []string{l.ConsumeIdent()} + for l.Peek() == '|' { + l.ConsumeToken('|') + union.typeNames = append(union.typeNames, l.ConsumeIdent()) + } + + return union +} + +func parseInputDef(l *common.Lexer) *InputObject { + i := &InputObject{} + i.Name = l.ConsumeIdent() + l.ConsumeToken('{') + for l.Peek() != '}' { + i.Values = append(i.Values, common.ParseInputValue(l)) + } + l.ConsumeToken('}') + return i +} + +func parseEnumDef(l *common.Lexer) *Enum { + enum := &Enum{Name: l.ConsumeIdent()} + + l.ConsumeToken('{') + for l.Peek() != '}' { + v := &EnumValue{ + Desc: l.DescComment(), + Name: l.ConsumeIdent(), + Directives: common.ParseDirectives(l), + } + + enum.Values = append(enum.Values, v) + } + l.ConsumeToken('}') + return enum +} + +func parseDirectiveDef(l *common.Lexer) *DirectiveDecl { + l.ConsumeToken('@') + d := &DirectiveDecl{Name: l.ConsumeIdent()} + + if l.Peek() == '(' { + l.ConsumeToken('(') + for l.Peek() != ')' { + v := common.ParseInputValue(l) + d.Args = append(d.Args, v) + } + l.ConsumeToken(')') + } + + l.ConsumeKeyword("on") + + for { + loc := l.ConsumeIdent() + d.Locs = append(d.Locs, loc) + if l.Peek() != '|' { + break + } + l.ConsumeToken('|') + } + return d +} + +func parseFieldsDef(l *common.Lexer) FieldList { + var fields FieldList + for l.Peek() != '}' { + f := &Field{} + f.Desc = l.DescComment() + f.Name = l.ConsumeIdent() + if l.Peek() == '(' { + l.ConsumeToken('(') + for l.Peek() != ')' { + f.Args = append(f.Args, common.ParseInputValue(l)) + } + l.ConsumeToken(')') + } + l.ConsumeToken(':') + f.Type = common.ParseType(l) + f.Directives = common.ParseDirectives(l) + fields = append(fields, f) + } + return fields +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/validation/suggestion.go b/vendor/github.com/graph-gophers/graphql-go/internal/validation/suggestion.go new file mode 100644 index 000000000000..9702b5f52947 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/validation/suggestion.go @@ -0,0 +1,71 @@ +package validation + +import ( + "fmt" + "sort" + "strconv" + "strings" +) + +func makeSuggestion(prefix string, options []string, input string) string { + var selected []string + distances := make(map[string]int) + for _, opt := range options { + distance := levenshteinDistance(input, opt) + threshold := max(len(input)/2, max(len(opt)/2, 1)) + if distance < threshold { + selected = append(selected, opt) + distances[opt] = distance + } + } + + if len(selected) == 0 { + return "" + } + sort.Slice(selected, func(i, j int) bool { + return distances[selected[i]] < distances[selected[j]] + }) + + parts := make([]string, len(selected)) + for i, opt := range selected { + parts[i] = strconv.Quote(opt) + } + if len(parts) > 1 { + parts[len(parts)-1] = "or " + parts[len(parts)-1] + } + return fmt.Sprintf(" %s %s?", prefix, strings.Join(parts, ", ")) +} + +func levenshteinDistance(s1, s2 string) int { + column := make([]int, len(s1)+1) + for y := range s1 { + column[y+1] = y + 1 + } + for x, rx := range s2 { + column[0] = x + 1 + lastdiag := x + for y, ry := range s1 { + olddiag := column[y+1] + if rx != ry { + lastdiag++ + } + column[y+1] = min(column[y+1]+1, min(column[y]+1, lastdiag)) + lastdiag = olddiag + } + } + return column[len(s1)] +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} diff --git a/vendor/github.com/graph-gophers/graphql-go/internal/validation/validation.go b/vendor/github.com/graph-gophers/graphql-go/internal/validation/validation.go new file mode 100644 index 000000000000..94ad5ca7fbac --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/internal/validation/validation.go @@ -0,0 +1,909 @@ +package validation + +import ( + "fmt" + "math" + "reflect" + "strconv" + "strings" + "text/scanner" + + "github.com/graph-gophers/graphql-go/errors" + "github.com/graph-gophers/graphql-go/internal/common" + "github.com/graph-gophers/graphql-go/internal/query" + "github.com/graph-gophers/graphql-go/internal/schema" +) + +type varSet map[*common.InputValue]struct{} + +type selectionPair struct{ a, b query.Selection } + +type fieldInfo struct { + sf *schema.Field + parent schema.NamedType +} + +type context struct { + schema *schema.Schema + doc *query.Document + errs []*errors.QueryError + opErrs map[*query.Operation][]*errors.QueryError + usedVars map[*query.Operation]varSet + fieldMap map[*query.Field]fieldInfo + overlapValidated map[selectionPair]struct{} + maxDepth int +} + +func (c *context) addErr(loc errors.Location, rule string, format string, a ...interface{}) { + c.addErrMultiLoc([]errors.Location{loc}, rule, format, a...) +} + +func (c *context) addErrMultiLoc(locs []errors.Location, rule string, format string, a ...interface{}) { + c.errs = append(c.errs, &errors.QueryError{ + Message: fmt.Sprintf(format, a...), + Locations: locs, + Rule: rule, + }) +} + +type opContext struct { + *context + ops []*query.Operation +} + +func newContext(s *schema.Schema, doc *query.Document, maxDepth int) *context { + return &context{ + schema: s, + doc: doc, + opErrs: make(map[*query.Operation][]*errors.QueryError), + usedVars: make(map[*query.Operation]varSet), + fieldMap: make(map[*query.Field]fieldInfo), + overlapValidated: make(map[selectionPair]struct{}), + maxDepth: maxDepth, + } +} + +func Validate(s *schema.Schema, doc *query.Document, maxDepth int) []*errors.QueryError { + c := newContext(s, doc, maxDepth) + + opNames := make(nameSet) + fragUsedBy := make(map[*query.FragmentDecl][]*query.Operation) + for _, op := range doc.Operations { + c.usedVars[op] = make(varSet) + opc := &opContext{c, []*query.Operation{op}} + + // Check if max depth is exceeded, if it's set. If max depth is exceeded, + // don't continue to validate the document and exit early. + if validateMaxDepth(opc, op.Selections, 1) { + return c.errs + } + + if op.Name.Name == "" && len(doc.Operations) != 1 { + c.addErr(op.Loc, "LoneAnonymousOperation", "This anonymous operation must be the only defined operation.") + } + if op.Name.Name != "" { + validateName(c, opNames, op.Name, "UniqueOperationNames", "operation") + } + + validateDirectives(opc, string(op.Type), op.Directives) + + varNames := make(nameSet) + for _, v := range op.Vars { + validateName(c, varNames, v.Name, "UniqueVariableNames", "variable") + + t := resolveType(c, v.Type) + if !canBeInput(t) { + c.addErr(v.TypeLoc, "VariablesAreInputTypes", "Variable %q cannot be non-input type %q.", "$"+v.Name.Name, t) + } + + if v.Default != nil { + validateLiteral(opc, v.Default) + + if t != nil { + if nn, ok := t.(*common.NonNull); ok { + c.addErr(v.Default.Location(), "DefaultValuesOfCorrectType", "Variable %q of type %q is required and will not use the default value. Perhaps you meant to use type %q.", "$"+v.Name.Name, t, nn.OfType) + } + + if ok, reason := validateValueType(opc, v.Default, t); !ok { + c.addErr(v.Default.Location(), "DefaultValuesOfCorrectType", "Variable %q of type %q has invalid default value %s.\n%s", "$"+v.Name.Name, t, v.Default, reason) + } + } + } + } + + var entryPoint schema.NamedType + switch op.Type { + case query.Query: + entryPoint = s.EntryPoints["query"] + case query.Mutation: + entryPoint = s.EntryPoints["mutation"] + case query.Subscription: + entryPoint = s.EntryPoints["subscription"] + default: + panic("unreachable") + } + + validateSelectionSet(opc, op.Selections, entryPoint) + + fragUsed := make(map[*query.FragmentDecl]struct{}) + markUsedFragments(c, op.Selections, fragUsed) + for frag := range fragUsed { + fragUsedBy[frag] = append(fragUsedBy[frag], op) + } + } + + fragNames := make(nameSet) + fragVisited := make(map[*query.FragmentDecl]struct{}) + for _, frag := range doc.Fragments { + opc := &opContext{c, fragUsedBy[frag]} + + validateName(c, fragNames, frag.Name, "UniqueFragmentNames", "fragment") + validateDirectives(opc, "FRAGMENT_DEFINITION", frag.Directives) + + t := unwrapType(resolveType(c, &frag.On)) + // continue even if t is nil + if t != nil && !canBeFragment(t) { + c.addErr(frag.On.Loc, "FragmentsOnCompositeTypes", "Fragment %q cannot condition on non composite type %q.", frag.Name.Name, t) + continue + } + + validateSelectionSet(opc, frag.Selections, t) + + if _, ok := fragVisited[frag]; !ok { + detectFragmentCycle(c, frag.Selections, fragVisited, nil, map[string]int{frag.Name.Name: 0}) + } + } + + for _, frag := range doc.Fragments { + if len(fragUsedBy[frag]) == 0 { + c.addErr(frag.Loc, "NoUnusedFragments", "Fragment %q is never used.", frag.Name.Name) + } + } + + for _, op := range doc.Operations { + c.errs = append(c.errs, c.opErrs[op]...) + + opUsedVars := c.usedVars[op] + for _, v := range op.Vars { + if _, ok := opUsedVars[v]; !ok { + opSuffix := "" + if op.Name.Name != "" { + opSuffix = fmt.Sprintf(" in operation %q", op.Name.Name) + } + c.addErr(v.Loc, "NoUnusedVariables", "Variable %q is never used%s.", "$"+v.Name.Name, opSuffix) + } + } + } + + return c.errs +} + +// validates the query doesn't go deeper than maxDepth (if set). Returns whether +// or not query validated max depth to avoid excessive recursion. +func validateMaxDepth(c *opContext, sels []query.Selection, depth int) bool { + // maxDepth checking is turned off when maxDepth is 0 + if c.maxDepth == 0 { + return false + } + + exceededMaxDepth := false + + for _, sel := range sels { + switch sel := sel.(type) { + case *query.Field: + if depth > c.maxDepth { + exceededMaxDepth = true + c.addErr(sel.Alias.Loc, "MaxDepthExceeded", "Field %q has depth %d that exceeds max depth %d", sel.Name.Name, depth, c.maxDepth) + continue + } + exceededMaxDepth = exceededMaxDepth || validateMaxDepth(c, sel.Selections, depth+1) + case *query.InlineFragment: + // Depth is not checked because inline fragments resolve to other fields which are checked. + // Depth is not incremented because inline fragments have the same depth as neighboring fields + exceededMaxDepth = exceededMaxDepth || validateMaxDepth(c, sel.Selections, depth) + case *query.FragmentSpread: + // Depth is not checked because fragments resolve to other fields which are checked. + frag := c.doc.Fragments.Get(sel.Name.Name) + if frag == nil { + // In case of unknown fragment (invalid request), ignore max depth evaluation + c.addErr(sel.Loc, "MaxDepthEvaluationError", "Unknown fragment %q. Unable to evaluate depth.", sel.Name.Name) + continue + } + // Depth is not incremented because fragments have the same depth as surrounding fields + exceededMaxDepth = exceededMaxDepth || validateMaxDepth(c, frag.Selections, depth) + } + } + + return exceededMaxDepth +} + +func validateSelectionSet(c *opContext, sels []query.Selection, t schema.NamedType) { + for _, sel := range sels { + validateSelection(c, sel, t) + } + + for i, a := range sels { + for _, b := range sels[i+1:] { + c.validateOverlap(a, b, nil, nil) + } + } +} + +func validateSelection(c *opContext, sel query.Selection, t schema.NamedType) { + switch sel := sel.(type) { + case *query.Field: + validateDirectives(c, "FIELD", sel.Directives) + + fieldName := sel.Name.Name + var f *schema.Field + switch fieldName { + case "__typename": + f = &schema.Field{ + Name: "__typename", + Type: c.schema.Types["String"], + } + case "__schema": + f = &schema.Field{ + Name: "__schema", + Type: c.schema.Types["__Schema"], + } + case "__type": + f = &schema.Field{ + Name: "__type", + Args: common.InputValueList{ + &common.InputValue{ + Name: common.Ident{Name: "name"}, + Type: &common.NonNull{OfType: c.schema.Types["String"]}, + }, + }, + Type: c.schema.Types["__Type"], + } + default: + f = fields(t).Get(fieldName) + if f == nil && t != nil { + suggestion := makeSuggestion("Did you mean", fields(t).Names(), fieldName) + c.addErr(sel.Alias.Loc, "FieldsOnCorrectType", "Cannot query field %q on type %q.%s", fieldName, t, suggestion) + } + } + c.fieldMap[sel] = fieldInfo{sf: f, parent: t} + + validateArgumentLiterals(c, sel.Arguments) + if f != nil { + validateArgumentTypes(c, sel.Arguments, f.Args, sel.Alias.Loc, + func() string { return fmt.Sprintf("field %q of type %q", fieldName, t) }, + func() string { return fmt.Sprintf("Field %q", fieldName) }, + ) + } + + var ft common.Type + if f != nil { + ft = f.Type + sf := hasSubfields(ft) + if sf && sel.Selections == nil { + c.addErr(sel.Alias.Loc, "ScalarLeafs", "Field %q of type %q must have a selection of subfields. Did you mean \"%s { ... }\"?", fieldName, ft, fieldName) + } + if !sf && sel.Selections != nil { + c.addErr(sel.SelectionSetLoc, "ScalarLeafs", "Field %q must not have a selection since type %q has no subfields.", fieldName, ft) + } + } + if sel.Selections != nil { + validateSelectionSet(c, sel.Selections, unwrapType(ft)) + } + + case *query.InlineFragment: + validateDirectives(c, "INLINE_FRAGMENT", sel.Directives) + if sel.On.Name != "" { + fragTyp := unwrapType(resolveType(c.context, &sel.On)) + if fragTyp != nil && !compatible(t, fragTyp) { + c.addErr(sel.Loc, "PossibleFragmentSpreads", "Fragment cannot be spread here as objects of type %q can never be of type %q.", t, fragTyp) + } + t = fragTyp + // continue even if t is nil + } + if t != nil && !canBeFragment(t) { + c.addErr(sel.On.Loc, "FragmentsOnCompositeTypes", "Fragment cannot condition on non composite type %q.", t) + return + } + validateSelectionSet(c, sel.Selections, unwrapType(t)) + + case *query.FragmentSpread: + validateDirectives(c, "FRAGMENT_SPREAD", sel.Directives) + frag := c.doc.Fragments.Get(sel.Name.Name) + if frag == nil { + c.addErr(sel.Name.Loc, "KnownFragmentNames", "Unknown fragment %q.", sel.Name.Name) + return + } + fragTyp := c.schema.Types[frag.On.Name] + if !compatible(t, fragTyp) { + c.addErr(sel.Loc, "PossibleFragmentSpreads", "Fragment %q cannot be spread here as objects of type %q can never be of type %q.", frag.Name.Name, t, fragTyp) + } + + default: + panic("unreachable") + } +} + +func compatible(a, b common.Type) bool { + for _, pta := range possibleTypes(a) { + for _, ptb := range possibleTypes(b) { + if pta == ptb { + return true + } + } + } + return false +} + +func possibleTypes(t common.Type) []*schema.Object { + switch t := t.(type) { + case *schema.Object: + return []*schema.Object{t} + case *schema.Interface: + return t.PossibleTypes + case *schema.Union: + return t.PossibleTypes + default: + return nil + } +} + +func markUsedFragments(c *context, sels []query.Selection, fragUsed map[*query.FragmentDecl]struct{}) { + for _, sel := range sels { + switch sel := sel.(type) { + case *query.Field: + if sel.Selections != nil { + markUsedFragments(c, sel.Selections, fragUsed) + } + + case *query.InlineFragment: + markUsedFragments(c, sel.Selections, fragUsed) + + case *query.FragmentSpread: + frag := c.doc.Fragments.Get(sel.Name.Name) + if frag == nil { + return + } + + if _, ok := fragUsed[frag]; ok { + return + } + fragUsed[frag] = struct{}{} + markUsedFragments(c, frag.Selections, fragUsed) + + default: + panic("unreachable") + } + } +} + +func detectFragmentCycle(c *context, sels []query.Selection, fragVisited map[*query.FragmentDecl]struct{}, spreadPath []*query.FragmentSpread, spreadPathIndex map[string]int) { + for _, sel := range sels { + detectFragmentCycleSel(c, sel, fragVisited, spreadPath, spreadPathIndex) + } +} + +func detectFragmentCycleSel(c *context, sel query.Selection, fragVisited map[*query.FragmentDecl]struct{}, spreadPath []*query.FragmentSpread, spreadPathIndex map[string]int) { + switch sel := sel.(type) { + case *query.Field: + if sel.Selections != nil { + detectFragmentCycle(c, sel.Selections, fragVisited, spreadPath, spreadPathIndex) + } + + case *query.InlineFragment: + detectFragmentCycle(c, sel.Selections, fragVisited, spreadPath, spreadPathIndex) + + case *query.FragmentSpread: + frag := c.doc.Fragments.Get(sel.Name.Name) + if frag == nil { + return + } + + spreadPath = append(spreadPath, sel) + if i, ok := spreadPathIndex[frag.Name.Name]; ok { + cyclePath := spreadPath[i:] + via := "" + if len(cyclePath) > 1 { + names := make([]string, len(cyclePath)-1) + for i, frag := range cyclePath[:len(cyclePath)-1] { + names[i] = frag.Name.Name + } + via = " via " + strings.Join(names, ", ") + } + + locs := make([]errors.Location, len(cyclePath)) + for i, frag := range cyclePath { + locs[i] = frag.Loc + } + c.addErrMultiLoc(locs, "NoFragmentCycles", "Cannot spread fragment %q within itself%s.", frag.Name.Name, via) + return + } + + if _, ok := fragVisited[frag]; ok { + return + } + fragVisited[frag] = struct{}{} + + spreadPathIndex[frag.Name.Name] = len(spreadPath) + detectFragmentCycle(c, frag.Selections, fragVisited, spreadPath, spreadPathIndex) + delete(spreadPathIndex, frag.Name.Name) + + default: + panic("unreachable") + } +} + +func (c *context) validateOverlap(a, b query.Selection, reasons *[]string, locs *[]errors.Location) { + if a == b { + return + } + + if _, ok := c.overlapValidated[selectionPair{a, b}]; ok { + return + } + c.overlapValidated[selectionPair{a, b}] = struct{}{} + c.overlapValidated[selectionPair{b, a}] = struct{}{} + + switch a := a.(type) { + case *query.Field: + switch b := b.(type) { + case *query.Field: + if b.Alias.Loc.Before(a.Alias.Loc) { + a, b = b, a + } + if reasons2, locs2 := c.validateFieldOverlap(a, b); len(reasons2) != 0 { + locs2 = append(locs2, a.Alias.Loc, b.Alias.Loc) + if reasons == nil { + c.addErrMultiLoc(locs2, "OverlappingFieldsCanBeMerged", "Fields %q conflict because %s. Use different aliases on the fields to fetch both if this was intentional.", a.Alias.Name, strings.Join(reasons2, " and ")) + return + } + for _, r := range reasons2 { + *reasons = append(*reasons, fmt.Sprintf("subfields %q conflict because %s", a.Alias.Name, r)) + } + *locs = append(*locs, locs2...) + } + + case *query.InlineFragment: + for _, sel := range b.Selections { + c.validateOverlap(a, sel, reasons, locs) + } + + case *query.FragmentSpread: + if frag := c.doc.Fragments.Get(b.Name.Name); frag != nil { + for _, sel := range frag.Selections { + c.validateOverlap(a, sel, reasons, locs) + } + } + + default: + panic("unreachable") + } + + case *query.InlineFragment: + for _, sel := range a.Selections { + c.validateOverlap(sel, b, reasons, locs) + } + + case *query.FragmentSpread: + if frag := c.doc.Fragments.Get(a.Name.Name); frag != nil { + for _, sel := range frag.Selections { + c.validateOverlap(sel, b, reasons, locs) + } + } + + default: + panic("unreachable") + } +} + +func (c *context) validateFieldOverlap(a, b *query.Field) ([]string, []errors.Location) { + if a.Alias.Name != b.Alias.Name { + return nil, nil + } + + if asf := c.fieldMap[a].sf; asf != nil { + if bsf := c.fieldMap[b].sf; bsf != nil { + if !typesCompatible(asf.Type, bsf.Type) { + return []string{fmt.Sprintf("they return conflicting types %s and %s", asf.Type, bsf.Type)}, nil + } + } + } + + at := c.fieldMap[a].parent + bt := c.fieldMap[b].parent + if at == nil || bt == nil || at == bt { + if a.Name.Name != b.Name.Name { + return []string{fmt.Sprintf("%s and %s are different fields", a.Name.Name, b.Name.Name)}, nil + } + + if argumentsConflict(a.Arguments, b.Arguments) { + return []string{"they have differing arguments"}, nil + } + } + + var reasons []string + var locs []errors.Location + for _, a2 := range a.Selections { + for _, b2 := range b.Selections { + c.validateOverlap(a2, b2, &reasons, &locs) + } + } + return reasons, locs +} + +func argumentsConflict(a, b common.ArgumentList) bool { + if len(a) != len(b) { + return true + } + for _, argA := range a { + valB, ok := b.Get(argA.Name.Name) + if !ok || !reflect.DeepEqual(argA.Value.Value(nil), valB.Value(nil)) { + return true + } + } + return false +} + +func fields(t common.Type) schema.FieldList { + switch t := t.(type) { + case *schema.Object: + return t.Fields + case *schema.Interface: + return t.Fields + default: + return nil + } +} + +func unwrapType(t common.Type) schema.NamedType { + if t == nil { + return nil + } + for { + switch t2 := t.(type) { + case schema.NamedType: + return t2 + case *common.List: + t = t2.OfType + case *common.NonNull: + t = t2.OfType + default: + panic("unreachable") + } + } +} + +func resolveType(c *context, t common.Type) common.Type { + t2, err := common.ResolveType(t, c.schema.Resolve) + if err != nil { + c.errs = append(c.errs, err) + } + return t2 +} + +func validateDirectives(c *opContext, loc string, directives common.DirectiveList) { + directiveNames := make(nameSet) + for _, d := range directives { + dirName := d.Name.Name + validateNameCustomMsg(c.context, directiveNames, d.Name, "UniqueDirectivesPerLocation", func() string { + return fmt.Sprintf("The directive %q can only be used once at this location.", dirName) + }) + + validateArgumentLiterals(c, d.Args) + + dd, ok := c.schema.Directives[dirName] + if !ok { + c.addErr(d.Name.Loc, "KnownDirectives", "Unknown directive %q.", dirName) + continue + } + + locOK := false + for _, allowedLoc := range dd.Locs { + if loc == allowedLoc { + locOK = true + break + } + } + if !locOK { + c.addErr(d.Name.Loc, "KnownDirectives", "Directive %q may not be used on %s.", dirName, loc) + } + + validateArgumentTypes(c, d.Args, dd.Args, d.Name.Loc, + func() string { return fmt.Sprintf("directive %q", "@"+dirName) }, + func() string { return fmt.Sprintf("Directive %q", "@"+dirName) }, + ) + } +} + +type nameSet map[string]errors.Location + +func validateName(c *context, set nameSet, name common.Ident, rule string, kind string) { + validateNameCustomMsg(c, set, name, rule, func() string { + return fmt.Sprintf("There can be only one %s named %q.", kind, name.Name) + }) +} + +func validateNameCustomMsg(c *context, set nameSet, name common.Ident, rule string, msg func() string) { + if loc, ok := set[name.Name]; ok { + c.addErrMultiLoc([]errors.Location{loc, name.Loc}, rule, msg()) + return + } + set[name.Name] = name.Loc +} + +func validateArgumentTypes(c *opContext, args common.ArgumentList, argDecls common.InputValueList, loc errors.Location, owner1, owner2 func() string) { + for _, selArg := range args { + arg := argDecls.Get(selArg.Name.Name) + if arg == nil { + c.addErr(selArg.Name.Loc, "KnownArgumentNames", "Unknown argument %q on %s.", selArg.Name.Name, owner1()) + continue + } + value := selArg.Value + if ok, reason := validateValueType(c, value, arg.Type); !ok { + c.addErr(value.Location(), "ArgumentsOfCorrectType", "Argument %q has invalid value %s.\n%s", arg.Name.Name, value, reason) + } + } + for _, decl := range argDecls { + if _, ok := decl.Type.(*common.NonNull); ok { + if _, ok := args.Get(decl.Name.Name); !ok { + c.addErr(loc, "ProvidedNonNullArguments", "%s argument %q of type %q is required but not provided.", owner2(), decl.Name.Name, decl.Type) + } + } + } +} + +func validateArgumentLiterals(c *opContext, args common.ArgumentList) { + argNames := make(nameSet) + for _, arg := range args { + validateName(c.context, argNames, arg.Name, "UniqueArgumentNames", "argument") + validateLiteral(c, arg.Value) + } +} + +func validateLiteral(c *opContext, l common.Literal) { + switch l := l.(type) { + case *common.ObjectLit: + fieldNames := make(nameSet) + for _, f := range l.Fields { + validateName(c.context, fieldNames, f.Name, "UniqueInputFieldNames", "input field") + validateLiteral(c, f.Value) + } + case *common.ListLit: + for _, entry := range l.Entries { + validateLiteral(c, entry) + } + case *common.Variable: + for _, op := range c.ops { + v := op.Vars.Get(l.Name) + if v == nil { + byOp := "" + if op.Name.Name != "" { + byOp = fmt.Sprintf(" by operation %q", op.Name.Name) + } + c.opErrs[op] = append(c.opErrs[op], &errors.QueryError{ + Message: fmt.Sprintf("Variable %q is not defined%s.", "$"+l.Name, byOp), + Locations: []errors.Location{l.Loc, op.Loc}, + Rule: "NoUndefinedVariables", + }) + continue + } + c.usedVars[op][v] = struct{}{} + } + } +} + +func validateValueType(c *opContext, v common.Literal, t common.Type) (bool, string) { + if v, ok := v.(*common.Variable); ok { + for _, op := range c.ops { + if v2 := op.Vars.Get(v.Name); v2 != nil { + t2, err := common.ResolveType(v2.Type, c.schema.Resolve) + if _, ok := t2.(*common.NonNull); !ok && v2.Default != nil { + t2 = &common.NonNull{OfType: t2} + } + if err == nil && !typeCanBeUsedAs(t2, t) { + c.addErrMultiLoc([]errors.Location{v2.Loc, v.Loc}, "VariablesInAllowedPosition", "Variable %q of type %q used in position expecting type %q.", "$"+v.Name, t2, t) + } + } + } + return true, "" + } + + if nn, ok := t.(*common.NonNull); ok { + if isNull(v) { + return false, fmt.Sprintf("Expected %q, found null.", t) + } + t = nn.OfType + } + if isNull(v) { + return true, "" + } + + switch t := t.(type) { + case *schema.Scalar, *schema.Enum: + if lit, ok := v.(*common.BasicLit); ok { + if validateBasicLit(lit, t) { + return true, "" + } + } + + case *common.List: + list, ok := v.(*common.ListLit) + if !ok { + return validateValueType(c, v, t.OfType) // single value instead of list + } + for i, entry := range list.Entries { + if ok, reason := validateValueType(c, entry, t.OfType); !ok { + return false, fmt.Sprintf("In element #%d: %s", i, reason) + } + } + return true, "" + + case *schema.InputObject: + v, ok := v.(*common.ObjectLit) + if !ok { + return false, fmt.Sprintf("Expected %q, found not an object.", t) + } + for _, f := range v.Fields { + name := f.Name.Name + iv := t.Values.Get(name) + if iv == nil { + return false, fmt.Sprintf("In field %q: Unknown field.", name) + } + if ok, reason := validateValueType(c, f.Value, iv.Type); !ok { + return false, fmt.Sprintf("In field %q: %s", name, reason) + } + } + for _, iv := range t.Values { + found := false + for _, f := range v.Fields { + if f.Name.Name == iv.Name.Name { + found = true + break + } + } + if !found { + if _, ok := iv.Type.(*common.NonNull); ok && iv.Default == nil { + return false, fmt.Sprintf("In field %q: Expected %q, found null.", iv.Name.Name, iv.Type) + } + } + } + return true, "" + } + + return false, fmt.Sprintf("Expected type %q, found %s.", t, v) +} + +func validateBasicLit(v *common.BasicLit, t common.Type) bool { + switch t := t.(type) { + case *schema.Scalar: + switch t.Name { + case "Int": + if v.Type != scanner.Int { + return false + } + f, err := strconv.ParseFloat(v.Text, 64) + if err != nil { + panic(err) + } + return f >= math.MinInt32 && f <= math.MaxInt32 + case "Float": + return v.Type == scanner.Int || v.Type == scanner.Float + case "String": + return v.Type == scanner.String + case "Boolean": + return v.Type == scanner.Ident && (v.Text == "true" || v.Text == "false") + case "ID": + return v.Type == scanner.Int || v.Type == scanner.String + default: + //TODO: Type-check against expected type by Unmarshalling + return true + } + + case *schema.Enum: + if v.Type != scanner.Ident { + return false + } + for _, option := range t.Values { + if option.Name == v.Text { + return true + } + } + return false + } + + return false +} + +func canBeFragment(t common.Type) bool { + switch t.(type) { + case *schema.Object, *schema.Interface, *schema.Union: + return true + default: + return false + } +} + +func canBeInput(t common.Type) bool { + switch t := t.(type) { + case *schema.InputObject, *schema.Scalar, *schema.Enum: + return true + case *common.List: + return canBeInput(t.OfType) + case *common.NonNull: + return canBeInput(t.OfType) + default: + return false + } +} + +func hasSubfields(t common.Type) bool { + switch t := t.(type) { + case *schema.Object, *schema.Interface, *schema.Union: + return true + case *common.List: + return hasSubfields(t.OfType) + case *common.NonNull: + return hasSubfields(t.OfType) + default: + return false + } +} + +func isLeaf(t common.Type) bool { + switch t.(type) { + case *schema.Scalar, *schema.Enum: + return true + default: + return false + } +} + +func isNull(lit interface{}) bool { + _, ok := lit.(*common.NullLit) + return ok +} + +func typesCompatible(a, b common.Type) bool { + al, aIsList := a.(*common.List) + bl, bIsList := b.(*common.List) + if aIsList || bIsList { + return aIsList && bIsList && typesCompatible(al.OfType, bl.OfType) + } + + ann, aIsNN := a.(*common.NonNull) + bnn, bIsNN := b.(*common.NonNull) + if aIsNN || bIsNN { + return aIsNN && bIsNN && typesCompatible(ann.OfType, bnn.OfType) + } + + if isLeaf(a) || isLeaf(b) { + return a == b + } + + return true +} + +func typeCanBeUsedAs(t, as common.Type) bool { + nnT, okT := t.(*common.NonNull) + if okT { + t = nnT.OfType + } + + nnAs, okAs := as.(*common.NonNull) + if okAs { + as = nnAs.OfType + if !okT { + return false // nullable can not be used as non-null + } + } + + if t == as { + return true + } + + if lT, ok := t.(*common.List); ok { + if lAs, ok := as.(*common.List); ok { + return typeCanBeUsedAs(lT.OfType, lAs.OfType) + } + } + return false +} diff --git a/vendor/github.com/graph-gophers/graphql-go/introspection.go b/vendor/github.com/graph-gophers/graphql-go/introspection.go new file mode 100644 index 000000000000..7e515cf25f4b --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/introspection.go @@ -0,0 +1,117 @@ +package graphql + +import ( + "context" + "encoding/json" + + "github.com/graph-gophers/graphql-go/internal/exec/resolvable" + "github.com/graph-gophers/graphql-go/introspection" +) + +// Inspect allows inspection of the given schema. +func (s *Schema) Inspect() *introspection.Schema { + return introspection.WrapSchema(s.schema) +} + +// ToJSON encodes the schema in a JSON format used by tools like Relay. +func (s *Schema) ToJSON() ([]byte, error) { + result := s.exec(context.Background(), introspectionQuery, "", nil, &resolvable.Schema{ + Query: &resolvable.Object{}, + Schema: *s.schema, + }) + if len(result.Errors) != 0 { + panic(result.Errors[0]) + } + return json.MarshalIndent(result.Data, "", "\t") +} + +var introspectionQuery = ` + query { + __schema { + queryType { name } + mutationType { name } + subscriptionType { name } + types { + ...FullType + } + directives { + name + description + locations + args { + ...InputValue + } + } + } + } + fragment FullType on __Type { + kind + name + description + fields(includeDeprecated: true) { + name + description + args { + ...InputValue + } + type { + ...TypeRef + } + isDeprecated + deprecationReason + } + inputFields { + ...InputValue + } + interfaces { + ...TypeRef + } + enumValues(includeDeprecated: true) { + name + description + isDeprecated + deprecationReason + } + possibleTypes { + ...TypeRef + } + } + fragment InputValue on __InputValue { + name + description + type { ...TypeRef } + defaultValue + } + fragment TypeRef on __Type { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + } + } + } + } + } + } + } + } +` diff --git a/vendor/github.com/graph-gophers/graphql-go/introspection/introspection.go b/vendor/github.com/graph-gophers/graphql-go/introspection/introspection.go new file mode 100644 index 000000000000..2f4acad0a689 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/introspection/introspection.go @@ -0,0 +1,313 @@ +package introspection + +import ( + "sort" + + "github.com/graph-gophers/graphql-go/internal/common" + "github.com/graph-gophers/graphql-go/internal/schema" +) + +type Schema struct { + schema *schema.Schema +} + +// WrapSchema is only used internally. +func WrapSchema(schema *schema.Schema) *Schema { + return &Schema{schema} +} + +func (r *Schema) Types() []*Type { + var names []string + for name := range r.schema.Types { + names = append(names, name) + } + sort.Strings(names) + + l := make([]*Type, len(names)) + for i, name := range names { + l[i] = &Type{r.schema.Types[name]} + } + return l +} + +func (r *Schema) Directives() []*Directive { + var names []string + for name := range r.schema.Directives { + names = append(names, name) + } + sort.Strings(names) + + l := make([]*Directive, len(names)) + for i, name := range names { + l[i] = &Directive{r.schema.Directives[name]} + } + return l +} + +func (r *Schema) QueryType() *Type { + t, ok := r.schema.EntryPoints["query"] + if !ok { + return nil + } + return &Type{t} +} + +func (r *Schema) MutationType() *Type { + t, ok := r.schema.EntryPoints["mutation"] + if !ok { + return nil + } + return &Type{t} +} + +func (r *Schema) SubscriptionType() *Type { + t, ok := r.schema.EntryPoints["subscription"] + if !ok { + return nil + } + return &Type{t} +} + +type Type struct { + typ common.Type +} + +// WrapType is only used internally. +func WrapType(typ common.Type) *Type { + return &Type{typ} +} + +func (r *Type) Kind() string { + return r.typ.Kind() +} + +func (r *Type) Name() *string { + if named, ok := r.typ.(schema.NamedType); ok { + name := named.TypeName() + return &name + } + return nil +} + +func (r *Type) Description() *string { + if named, ok := r.typ.(schema.NamedType); ok { + desc := named.Description() + if desc == "" { + return nil + } + return &desc + } + return nil +} + +func (r *Type) Fields(args *struct{ IncludeDeprecated bool }) *[]*Field { + var fields schema.FieldList + switch t := r.typ.(type) { + case *schema.Object: + fields = t.Fields + case *schema.Interface: + fields = t.Fields + default: + return nil + } + + var l []*Field + for _, f := range fields { + if d := f.Directives.Get("deprecated"); d == nil || args.IncludeDeprecated { + l = append(l, &Field{f}) + } + } + return &l +} + +func (r *Type) Interfaces() *[]*Type { + t, ok := r.typ.(*schema.Object) + if !ok { + return nil + } + + l := make([]*Type, len(t.Interfaces)) + for i, intf := range t.Interfaces { + l[i] = &Type{intf} + } + return &l +} + +func (r *Type) PossibleTypes() *[]*Type { + var possibleTypes []*schema.Object + switch t := r.typ.(type) { + case *schema.Interface: + possibleTypes = t.PossibleTypes + case *schema.Union: + possibleTypes = t.PossibleTypes + default: + return nil + } + + l := make([]*Type, len(possibleTypes)) + for i, intf := range possibleTypes { + l[i] = &Type{intf} + } + return &l +} + +func (r *Type) EnumValues(args *struct{ IncludeDeprecated bool }) *[]*EnumValue { + t, ok := r.typ.(*schema.Enum) + if !ok { + return nil + } + + var l []*EnumValue + for _, v := range t.Values { + if d := v.Directives.Get("deprecated"); d == nil || args.IncludeDeprecated { + l = append(l, &EnumValue{v}) + } + } + return &l +} + +func (r *Type) InputFields() *[]*InputValue { + t, ok := r.typ.(*schema.InputObject) + if !ok { + return nil + } + + l := make([]*InputValue, len(t.Values)) + for i, v := range t.Values { + l[i] = &InputValue{v} + } + return &l +} + +func (r *Type) OfType() *Type { + switch t := r.typ.(type) { + case *common.List: + return &Type{t.OfType} + case *common.NonNull: + return &Type{t.OfType} + default: + return nil + } +} + +type Field struct { + field *schema.Field +} + +func (r *Field) Name() string { + return r.field.Name +} + +func (r *Field) Description() *string { + if r.field.Desc == "" { + return nil + } + return &r.field.Desc +} + +func (r *Field) Args() []*InputValue { + l := make([]*InputValue, len(r.field.Args)) + for i, v := range r.field.Args { + l[i] = &InputValue{v} + } + return l +} + +func (r *Field) Type() *Type { + return &Type{r.field.Type} +} + +func (r *Field) IsDeprecated() bool { + return r.field.Directives.Get("deprecated") != nil +} + +func (r *Field) DeprecationReason() *string { + d := r.field.Directives.Get("deprecated") + if d == nil { + return nil + } + reason := d.Args.MustGet("reason").Value(nil).(string) + return &reason +} + +type InputValue struct { + value *common.InputValue +} + +func (r *InputValue) Name() string { + return r.value.Name.Name +} + +func (r *InputValue) Description() *string { + if r.value.Desc == "" { + return nil + } + return &r.value.Desc +} + +func (r *InputValue) Type() *Type { + return &Type{r.value.Type} +} + +func (r *InputValue) DefaultValue() *string { + if r.value.Default == nil { + return nil + } + s := r.value.Default.String() + return &s +} + +type EnumValue struct { + value *schema.EnumValue +} + +func (r *EnumValue) Name() string { + return r.value.Name +} + +func (r *EnumValue) Description() *string { + if r.value.Desc == "" { + return nil + } + return &r.value.Desc +} + +func (r *EnumValue) IsDeprecated() bool { + return r.value.Directives.Get("deprecated") != nil +} + +func (r *EnumValue) DeprecationReason() *string { + d := r.value.Directives.Get("deprecated") + if d == nil { + return nil + } + reason := d.Args.MustGet("reason").Value(nil).(string) + return &reason +} + +type Directive struct { + directive *schema.DirectiveDecl +} + +func (r *Directive) Name() string { + return r.directive.Name +} + +func (r *Directive) Description() *string { + if r.directive.Desc == "" { + return nil + } + return &r.directive.Desc +} + +func (r *Directive) Locations() []string { + return r.directive.Locs +} + +func (r *Directive) Args() []*InputValue { + l := make([]*InputValue, len(r.directive.Args)) + for i, v := range r.directive.Args { + l[i] = &InputValue{v} + } + return l +} diff --git a/vendor/github.com/graph-gophers/graphql-go/log/log.go b/vendor/github.com/graph-gophers/graphql-go/log/log.go new file mode 100644 index 000000000000..25569af7cacf --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/log/log.go @@ -0,0 +1,23 @@ +package log + +import ( + "context" + "log" + "runtime" +) + +// Logger is the interface used to log panics that occur during query execution. It is settable via graphql.ParseSchema +type Logger interface { + LogPanic(ctx context.Context, value interface{}) +} + +// DefaultLogger is the default logger used to log panics that occur during query execution +type DefaultLogger struct{} + +// LogPanic is used to log recovered panic values that occur during query execution +func (l *DefaultLogger) LogPanic(_ context.Context, value interface{}) { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + log.Printf("graphql: panic occurred: %v\n%s", value, buf) +} diff --git a/vendor/github.com/graph-gophers/graphql-go/relay/relay.go b/vendor/github.com/graph-gophers/graphql-go/relay/relay.go new file mode 100644 index 000000000000..78e4dfdd51d5 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/relay/relay.go @@ -0,0 +1,70 @@ +package relay + +import ( + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "net/http" + "strings" + + graphql "github.com/graph-gophers/graphql-go" +) + +func MarshalID(kind string, spec interface{}) graphql.ID { + d, err := json.Marshal(spec) + if err != nil { + panic(fmt.Errorf("relay.MarshalID: %s", err)) + } + return graphql.ID(base64.URLEncoding.EncodeToString(append([]byte(kind+":"), d...))) +} + +func UnmarshalKind(id graphql.ID) string { + s, err := base64.URLEncoding.DecodeString(string(id)) + if err != nil { + return "" + } + i := strings.IndexByte(string(s), ':') + if i == -1 { + return "" + } + return string(s[:i]) +} + +func UnmarshalSpec(id graphql.ID, v interface{}) error { + s, err := base64.URLEncoding.DecodeString(string(id)) + if err != nil { + return err + } + i := strings.IndexByte(string(s), ':') + if i == -1 { + return errors.New("invalid graphql.ID") + } + return json.Unmarshal([]byte(s[i+1:]), v) +} + +type Handler struct { + Schema *graphql.Schema +} + +func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + var params struct { + Query string `json:"query"` + OperationName string `json:"operationName"` + Variables map[string]interface{} `json:"variables"` + } + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + response := h.Schema.Exec(r.Context(), params.Query, params.OperationName, params.Variables) + responseJSON, err := json.Marshal(response) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + w.Write(responseJSON) +} diff --git a/vendor/github.com/graph-gophers/graphql-go/time.go b/vendor/github.com/graph-gophers/graphql-go/time.go new file mode 100644 index 000000000000..829c502275d7 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/time.go @@ -0,0 +1,51 @@ +package graphql + +import ( + "encoding/json" + "fmt" + "time" +) + +// Time is a custom GraphQL type to represent an instant in time. It has to be added to a schema +// via "scalar Time" since it is not a predeclared GraphQL type like "ID". +type Time struct { + time.Time +} + +// ImplementsGraphQLType maps this custom Go type +// to the graphql scalar type in the schema. +func (Time) ImplementsGraphQLType(name string) bool { + return name == "Time" +} + +// UnmarshalGraphQL is a custom unmarshaler for Time +// +// This function will be called whenever you use the +// time scalar as an input +func (t *Time) UnmarshalGraphQL(input interface{}) error { + switch input := input.(type) { + case time.Time: + t.Time = input + return nil + case string: + var err error + t.Time, err = time.Parse(time.RFC3339, input) + return err + case int: + t.Time = time.Unix(int64(input), 0) + return nil + case float64: + t.Time = time.Unix(int64(input), 0) + return nil + default: + return fmt.Errorf("wrong type") + } +} + +// MarshalJSON is a custom marshaler for Time +// +// This function will be called whenever you +// query for fields that use the Time type +func (t Time) MarshalJSON() ([]byte, error) { + return json.Marshal(t.Time) +} diff --git a/vendor/github.com/graph-gophers/graphql-go/trace/trace.go b/vendor/github.com/graph-gophers/graphql-go/trace/trace.go new file mode 100644 index 000000000000..68b856ae7199 --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/trace/trace.go @@ -0,0 +1,80 @@ +package trace + +import ( + "context" + "fmt" + + "github.com/graph-gophers/graphql-go/errors" + "github.com/graph-gophers/graphql-go/introspection" + opentracing "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "github.com/opentracing/opentracing-go/log" +) + +type TraceQueryFinishFunc func([]*errors.QueryError) +type TraceFieldFinishFunc func(*errors.QueryError) + +type Tracer interface { + TraceQuery(ctx context.Context, queryString string, operationName string, variables map[string]interface{}, varTypes map[string]*introspection.Type) (context.Context, TraceQueryFinishFunc) + TraceField(ctx context.Context, label, typeName, fieldName string, trivial bool, args map[string]interface{}) (context.Context, TraceFieldFinishFunc) +} + +type OpenTracingTracer struct{} + +func (OpenTracingTracer) TraceQuery(ctx context.Context, queryString string, operationName string, variables map[string]interface{}, varTypes map[string]*introspection.Type) (context.Context, TraceQueryFinishFunc) { + span, spanCtx := opentracing.StartSpanFromContext(ctx, "GraphQL request") + span.SetTag("graphql.query", queryString) + + if operationName != "" { + span.SetTag("graphql.operationName", operationName) + } + + if len(variables) != 0 { + span.LogFields(log.Object("graphql.variables", variables)) + } + + return spanCtx, func(errs []*errors.QueryError) { + if len(errs) > 0 { + msg := errs[0].Error() + if len(errs) > 1 { + msg += fmt.Sprintf(" (and %d more errors)", len(errs)-1) + } + ext.Error.Set(span, true) + span.SetTag("graphql.error", msg) + } + span.Finish() + } +} + +func (OpenTracingTracer) TraceField(ctx context.Context, label, typeName, fieldName string, trivial bool, args map[string]interface{}) (context.Context, TraceFieldFinishFunc) { + if trivial { + return ctx, noop + } + + span, spanCtx := opentracing.StartSpanFromContext(ctx, label) + span.SetTag("graphql.type", typeName) + span.SetTag("graphql.field", fieldName) + for name, value := range args { + span.SetTag("graphql.args."+name, value) + } + + return spanCtx, func(err *errors.QueryError) { + if err != nil { + ext.Error.Set(span, true) + span.SetTag("graphql.error", err.Error()) + } + span.Finish() + } +} + +func noop(*errors.QueryError) {} + +type NoopTracer struct{} + +func (NoopTracer) TraceQuery(ctx context.Context, queryString string, operationName string, variables map[string]interface{}, varTypes map[string]*introspection.Type) (context.Context, TraceQueryFinishFunc) { + return ctx, func(errs []*errors.QueryError) {} +} + +func (NoopTracer) TraceField(ctx context.Context, label, typeName, fieldName string, trivial bool, args map[string]interface{}) (context.Context, TraceFieldFinishFunc) { + return ctx, func(err *errors.QueryError) {} +} diff --git a/vendor/github.com/graph-gophers/graphql-go/trace/validation_trace.go b/vendor/github.com/graph-gophers/graphql-go/trace/validation_trace.go new file mode 100644 index 000000000000..e223f0fdbc9c --- /dev/null +++ b/vendor/github.com/graph-gophers/graphql-go/trace/validation_trace.go @@ -0,0 +1,17 @@ +package trace + +import ( + "github.com/graph-gophers/graphql-go/errors" +) + +type TraceValidationFinishFunc = TraceQueryFinishFunc + +type ValidationTracer interface { + TraceValidation() TraceValidationFinishFunc +} + +type NoopValidationTracer struct{} + +func (NoopValidationTracer) TraceValidation() TraceValidationFinishFunc { + return func(errs []*errors.QueryError) {} +} diff --git a/vendor/github.com/howeyc/fsnotify/AUTHORS b/vendor/github.com/howeyc/fsnotify/AUTHORS new file mode 100644 index 000000000000..e52b72f83a18 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/AUTHORS @@ -0,0 +1,28 @@ +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# You can update this list using the following command: +# +# $ git shortlog -se | awk '{print $2 " " $3 " " $4}' + +# Please keep the list sorted. + +Adrien Bustany +Caleb Spare +Case Nelson +Chris Howey +Christoffer Buchholz +Dave Cheney +Francisco Souza +John C Barstow +Kelvin Fo +Nathan Youngman +Paul Hammond +Pursuit92 +Rob Figueiredo +Travis Cline +Tudor Golubenco +bronze1man +debrando +henrikedwards diff --git a/vendor/github.com/howeyc/fsnotify/CHANGELOG.md b/vendor/github.com/howeyc/fsnotify/CHANGELOG.md new file mode 100644 index 000000000000..761686aa9539 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/CHANGELOG.md @@ -0,0 +1,160 @@ +# Changelog + +## v0.9.0 / 2014-01-17 + +* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany) +* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare) +* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library. + +## v0.8.12 / 2013-11-13 + +* [API] Remove FD_SET and friends from Linux adapter + +## v0.8.11 / 2013-11-02 + +* [Doc] Add Changelog [#72][] (thanks @nathany) +* [Doc] Spotlight and double modify events on OS X [#62][] (reported by @paulhammond) + +## v0.8.10 / 2013-10-19 + +* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott) +* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer) +* [Doc] specify OS-specific limits in README (thanks @debrando) + +## v0.8.9 / 2013-09-08 + +* [Doc] Contributing (thanks @nathany) +* [Doc] update package path in example code [#63][] (thanks @paulhammond) +* [Doc] GoCI badge in README (Linux only) [#60][] +* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany) + +## v0.8.8 / 2013-06-17 + +* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie) + +## v0.8.7 / 2013-06-03 + +* [API] Make syscall flags internal +* [Fix] inotify: ignore event changes +* [Fix] race in symlink test [#45][] (reported by @srid) +* [Fix] tests on Windows +* lower case error messages + +## v0.8.6 / 2013-05-23 + +* kqueue: Use EVT_ONLY flag on Darwin +* [Doc] Update README with full example + +## v0.8.5 / 2013-05-09 + +* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg) + +## v0.8.4 / 2013-04-07 + +* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz) + +## v0.8.3 / 2013-03-13 + +* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin) +* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin) + +## v0.8.2 / 2013-02-07 + +* [Doc] add Authors +* [Fix] fix data races for map access [#29][] (thanks @fsouza) + +## v0.8.1 / 2013-01-09 + +* [Fix] Windows path separators +* [Doc] BSD License + +## v0.8.0 / 2012-11-09 + +* kqueue: directory watching improvements (thanks @vmirage) +* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto) +* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr) + +## v0.7.4 / 2012-10-09 + +* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji) +* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig) +* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig) +* [Fix] kqueue: modify after recreation of file + +## v0.7.3 / 2012-09-27 + +* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage) +* [Fix] kqueue: no longer get duplicate CREATE events + +## v0.7.2 / 2012-09-01 + +* kqueue: events for created directories + +## v0.7.1 / 2012-07-14 + +* [Fix] for renaming files + +## v0.7.0 / 2012-07-02 + +* [Feature] FSNotify flags +* [Fix] inotify: Added file name back to event path + +## v0.6.0 / 2012-06-06 + +* kqueue: watch files after directory created (thanks @tmc) + +## v0.5.1 / 2012-05-22 + +* [Fix] inotify: remove all watches before Close() + +## v0.5.0 / 2012-05-03 + +* [API] kqueue: return errors during watch instead of sending over channel +* kqueue: match symlink behavior on Linux +* inotify: add `DELETE_SELF` (requested by @taralx) +* [Fix] kqueue: handle EINTR (reported by @robfig) +* [Doc] Godoc example [#1][] (thanks @davecheney) + +## v0.4.0 / 2012-03-30 + +* Go 1 released: build with go tool +* [Feature] Windows support using winfsnotify +* Windows does not have attribute change notifications +* Roll attribute notifications into IsModify + +## v0.3.0 / 2012-02-19 + +* kqueue: add files when watch directory + +## v0.2.0 / 2011-12-30 + +* update to latest Go weekly code + +## v0.1.0 / 2011-10-19 + +* kqueue: add watch on file creation to match inotify +* kqueue: create file event +* inotify: ignore `IN_IGNORED` events +* event String() +* linux: common FileEvent functions +* initial commit + +[#79]: https://github.com/howeyc/fsnotify/pull/79 +[#77]: https://github.com/howeyc/fsnotify/pull/77 +[#72]: https://github.com/howeyc/fsnotify/issues/72 +[#71]: https://github.com/howeyc/fsnotify/issues/71 +[#70]: https://github.com/howeyc/fsnotify/issues/70 +[#63]: https://github.com/howeyc/fsnotify/issues/63 +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#60]: https://github.com/howeyc/fsnotify/issues/60 +[#59]: https://github.com/howeyc/fsnotify/issues/59 +[#49]: https://github.com/howeyc/fsnotify/issues/49 +[#45]: https://github.com/howeyc/fsnotify/issues/45 +[#40]: https://github.com/howeyc/fsnotify/issues/40 +[#36]: https://github.com/howeyc/fsnotify/issues/36 +[#33]: https://github.com/howeyc/fsnotify/issues/33 +[#29]: https://github.com/howeyc/fsnotify/issues/29 +[#25]: https://github.com/howeyc/fsnotify/issues/25 +[#24]: https://github.com/howeyc/fsnotify/issues/24 +[#21]: https://github.com/howeyc/fsnotify/issues/21 +[#1]: https://github.com/howeyc/fsnotify/issues/1 diff --git a/vendor/github.com/howeyc/fsnotify/CONTRIBUTING.md b/vendor/github.com/howeyc/fsnotify/CONTRIBUTING.md new file mode 100644 index 000000000000..b2025d72c395 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing + +## Moving Notice + +There is a fork being actively developed with a new API in preparation for the Go Standard Library: +[github.com/go-fsnotify/fsnotify](https://github.com/go-fsnotify/fsnotify) + diff --git a/vendor/github.com/howeyc/fsnotify/LICENSE b/vendor/github.com/howeyc/fsnotify/LICENSE new file mode 100644 index 000000000000..f21e54080090 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2012 fsnotify Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/howeyc/fsnotify/README.md b/vendor/github.com/howeyc/fsnotify/README.md new file mode 100644 index 000000000000..7fdaf7c995e7 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/README.md @@ -0,0 +1,93 @@ +# File system notifications for Go + +[![GoDoc](https://godoc.org/github.com/howeyc/fsnotify?status.png)](http://godoc.org/github.com/howeyc/fsnotify) + +Cross platform: Windows, Linux, BSD and OS X. + +## Moving Notice + +There is a fork being actively developed with a new API in preparation for the Go Standard Library: +[github.com/go-fsnotify/fsnotify](https://github.com/go-fsnotify/fsnotify) + +## Example: + +```go +package main + +import ( + "log" + + "github.com/howeyc/fsnotify" +) + +func main() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + + done := make(chan bool) + + // Process events + go func() { + for { + select { + case ev := <-watcher.Event: + log.Println("event:", ev) + case err := <-watcher.Error: + log.Println("error:", err) + } + } + }() + + err = watcher.Watch("testDir") + if err != nil { + log.Fatal(err) + } + + // Hang so program doesn't exit + <-done + + /* ... do stuff ... */ + watcher.Close() +} +``` + +For each event: +* Name +* IsCreate() +* IsDelete() +* IsModify() +* IsRename() + +## FAQ + +**When a file is moved to another directory is it still being watched?** + +No (it shouldn't be, unless you are watching where it was moved to). + +**When I watch a directory, are all subdirectories watched as well?** + +No, you must add watches for any directory you want to watch (a recursive watcher is in the works [#56][]). + +**Do I have to watch the Error and Event channels in a separate goroutine?** + +As of now, yes. Looking into making this single-thread friendly (see [#7][]) + +**Why am I receiving multiple events for the same file on OS X?** + +Spotlight indexing on OS X can result in multiple events (see [#62][]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#54][]). + +**How many files can be watched at once?** + +There are OS-specific limits as to how many watches can be created: +* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, +reaching this limit results in a "no space left on device" error. +* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. + + +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#56]: https://github.com/howeyc/fsnotify/issues/56 +[#54]: https://github.com/howeyc/fsnotify/issues/54 +[#7]: https://github.com/howeyc/fsnotify/issues/7 + diff --git a/vendor/github.com/howeyc/fsnotify/fsnotify.go b/vendor/github.com/howeyc/fsnotify/fsnotify.go new file mode 100644 index 000000000000..9a48d847d3a5 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/fsnotify.go @@ -0,0 +1,111 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package fsnotify implements file system notification. +package fsnotify + +import "fmt" + +const ( + FSN_CREATE = 1 + FSN_MODIFY = 2 + FSN_DELETE = 4 + FSN_RENAME = 8 + + FSN_ALL = FSN_MODIFY | FSN_DELETE | FSN_RENAME | FSN_CREATE +) + +// Purge events from interal chan to external chan if passes filter +func (w *Watcher) purgeEvents() { + for ev := range w.internalEvent { + sendEvent := false + w.fsnmut.Lock() + fsnFlags := w.fsnFlags[ev.Name] + w.fsnmut.Unlock() + + if (fsnFlags&FSN_CREATE == FSN_CREATE) && ev.IsCreate() { + sendEvent = true + } + + if (fsnFlags&FSN_MODIFY == FSN_MODIFY) && ev.IsModify() { + sendEvent = true + } + + if (fsnFlags&FSN_DELETE == FSN_DELETE) && ev.IsDelete() { + sendEvent = true + } + + if (fsnFlags&FSN_RENAME == FSN_RENAME) && ev.IsRename() { + sendEvent = true + } + + if sendEvent { + w.Event <- ev + } + + // If there's no file, then no more events for user + // BSD must keep watch for internal use (watches DELETEs to keep track + // what files exist for create events) + if ev.IsDelete() { + w.fsnmut.Lock() + delete(w.fsnFlags, ev.Name) + w.fsnmut.Unlock() + } + } + + close(w.Event) +} + +// Watch a given file path +func (w *Watcher) Watch(path string) error { + return w.WatchFlags(path, FSN_ALL) +} + +// Watch a given file path for a particular set of notifications (FSN_MODIFY etc.) +func (w *Watcher) WatchFlags(path string, flags uint32) error { + w.fsnmut.Lock() + w.fsnFlags[path] = flags + w.fsnmut.Unlock() + return w.watch(path) +} + +// Remove a watch on a file +func (w *Watcher) RemoveWatch(path string) error { + w.fsnmut.Lock() + delete(w.fsnFlags, path) + w.fsnmut.Unlock() + return w.removeWatch(path) +} + +// String formats the event e in the form +// "filename: DELETE|MODIFY|..." +func (e *FileEvent) String() string { + var events string = "" + + if e.IsCreate() { + events += "|" + "CREATE" + } + + if e.IsDelete() { + events += "|" + "DELETE" + } + + if e.IsModify() { + events += "|" + "MODIFY" + } + + if e.IsRename() { + events += "|" + "RENAME" + } + + if e.IsAttrib() { + events += "|" + "ATTRIB" + } + + if len(events) > 0 { + events = events[1:] + } + + return fmt.Sprintf("%q: %s", e.Name, events) +} diff --git a/vendor/github.com/howeyc/fsnotify/fsnotify_bsd.go b/vendor/github.com/howeyc/fsnotify/fsnotify_bsd.go new file mode 100644 index 000000000000..40c84768bc34 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/fsnotify_bsd.go @@ -0,0 +1,496 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd openbsd netbsd dragonfly darwin + +package fsnotify + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + "syscall" +) + +const ( + // Flags (from ) + sys_NOTE_DELETE = 0x0001 /* vnode was removed */ + sys_NOTE_WRITE = 0x0002 /* data contents changed */ + sys_NOTE_EXTEND = 0x0004 /* size increased */ + sys_NOTE_ATTRIB = 0x0008 /* attributes changed */ + sys_NOTE_LINK = 0x0010 /* link count changed */ + sys_NOTE_RENAME = 0x0020 /* vnode was renamed */ + sys_NOTE_REVOKE = 0x0040 /* vnode access was revoked */ + + // Watch all events + sys_NOTE_ALLEVENTS = sys_NOTE_DELETE | sys_NOTE_WRITE | sys_NOTE_ATTRIB | sys_NOTE_RENAME + + // Block for 100 ms on each call to kevent + keventWaitTime = 100e6 +) + +type FileEvent struct { + mask uint32 // Mask of events + Name string // File name (optional) + create bool // set by fsnotify package if found new file +} + +// IsCreate reports whether the FileEvent was triggered by a creation +func (e *FileEvent) IsCreate() bool { return e.create } + +// IsDelete reports whether the FileEvent was triggered by a delete +func (e *FileEvent) IsDelete() bool { return (e.mask & sys_NOTE_DELETE) == sys_NOTE_DELETE } + +// IsModify reports whether the FileEvent was triggered by a file modification +func (e *FileEvent) IsModify() bool { + return ((e.mask&sys_NOTE_WRITE) == sys_NOTE_WRITE || (e.mask&sys_NOTE_ATTRIB) == sys_NOTE_ATTRIB) +} + +// IsRename reports whether the FileEvent was triggered by a change name +func (e *FileEvent) IsRename() bool { return (e.mask & sys_NOTE_RENAME) == sys_NOTE_RENAME } + +// IsAttrib reports whether the FileEvent was triggered by a change in the file metadata. +func (e *FileEvent) IsAttrib() bool { + return (e.mask & sys_NOTE_ATTRIB) == sys_NOTE_ATTRIB +} + +type Watcher struct { + mu sync.Mutex // Mutex for the Watcher itself. + kq int // File descriptor (as returned by the kqueue() syscall) + watches map[string]int // Map of watched file descriptors (key: path) + wmut sync.Mutex // Protects access to watches. + fsnFlags map[string]uint32 // Map of watched files to flags used for filter + fsnmut sync.Mutex // Protects access to fsnFlags. + enFlags map[string]uint32 // Map of watched files to evfilt note flags used in kqueue + enmut sync.Mutex // Protects access to enFlags. + paths map[int]string // Map of watched paths (key: watch descriptor) + finfo map[int]os.FileInfo // Map of file information (isDir, isReg; key: watch descriptor) + pmut sync.Mutex // Protects access to paths and finfo. + fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events) + femut sync.Mutex // Protects access to fileExists. + externalWatches map[string]bool // Map of watches added by user of the library. + ewmut sync.Mutex // Protects access to externalWatches. + Error chan error // Errors are sent on this channel + internalEvent chan *FileEvent // Events are queued on this channel + Event chan *FileEvent // Events are returned on this channel + done chan bool // Channel for sending a "quit message" to the reader goroutine + isClosed bool // Set to true when Close() is first called +} + +// NewWatcher creates and returns a new kevent instance using kqueue(2) +func NewWatcher() (*Watcher, error) { + fd, errno := syscall.Kqueue() + if fd == -1 { + return nil, os.NewSyscallError("kqueue", errno) + } + w := &Watcher{ + kq: fd, + watches: make(map[string]int), + fsnFlags: make(map[string]uint32), + enFlags: make(map[string]uint32), + paths: make(map[int]string), + finfo: make(map[int]os.FileInfo), + fileExists: make(map[string]bool), + externalWatches: make(map[string]bool), + internalEvent: make(chan *FileEvent), + Event: make(chan *FileEvent), + Error: make(chan error), + done: make(chan bool, 1), + } + + go w.readEvents() + go w.purgeEvents() + return w, nil +} + +// Close closes a kevent watcher instance +// It sends a message to the reader goroutine to quit and removes all watches +// associated with the kevent instance +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + w.mu.Unlock() + + // Send "quit" message to the reader goroutine + w.done <- true + w.wmut.Lock() + ws := w.watches + w.wmut.Unlock() + for path := range ws { + w.removeWatch(path) + } + + return nil +} + +// AddWatch adds path to the watched file set. +// The flags are interpreted as described in kevent(2). +func (w *Watcher) addWatch(path string, flags uint32) error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return errors.New("kevent instance already closed") + } + w.mu.Unlock() + + watchDir := false + + w.wmut.Lock() + watchfd, found := w.watches[path] + w.wmut.Unlock() + if !found { + fi, errstat := os.Lstat(path) + if errstat != nil { + return errstat + } + + // don't watch socket + if fi.Mode()&os.ModeSocket == os.ModeSocket { + return nil + } + + // Follow Symlinks + // Unfortunately, Linux can add bogus symlinks to watch list without + // issue, and Windows can't do symlinks period (AFAIK). To maintain + // consistency, we will act like everything is fine. There will simply + // be no file events for broken symlinks. + // Hence the returns of nil on errors. + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + path, err := filepath.EvalSymlinks(path) + if err != nil { + return nil + } + + fi, errstat = os.Lstat(path) + if errstat != nil { + return nil + } + } + + fd, errno := syscall.Open(path, open_FLAGS, 0700) + if fd == -1 { + return errno + } + watchfd = fd + + w.wmut.Lock() + w.watches[path] = watchfd + w.wmut.Unlock() + + w.pmut.Lock() + w.paths[watchfd] = path + w.finfo[watchfd] = fi + w.pmut.Unlock() + } + // Watch the directory if it has not been watched before. + w.pmut.Lock() + w.enmut.Lock() + if w.finfo[watchfd].IsDir() && + (flags&sys_NOTE_WRITE) == sys_NOTE_WRITE && + (!found || (w.enFlags[path]&sys_NOTE_WRITE) != sys_NOTE_WRITE) { + watchDir = true + } + w.enmut.Unlock() + w.pmut.Unlock() + + w.enmut.Lock() + w.enFlags[path] = flags + w.enmut.Unlock() + + var kbuf [1]syscall.Kevent_t + watchEntry := &kbuf[0] + watchEntry.Fflags = flags + syscall.SetKevent(watchEntry, watchfd, syscall.EVFILT_VNODE, syscall.EV_ADD|syscall.EV_CLEAR) + entryFlags := watchEntry.Flags + success, errno := syscall.Kevent(w.kq, kbuf[:], nil, nil) + if success == -1 { + return errno + } else if (entryFlags & syscall.EV_ERROR) == syscall.EV_ERROR { + return errors.New("kevent add error") + } + + if watchDir { + errdir := w.watchDirectoryFiles(path) + if errdir != nil { + return errdir + } + } + return nil +} + +// Watch adds path to the watched file set, watching all events. +func (w *Watcher) watch(path string) error { + w.ewmut.Lock() + w.externalWatches[path] = true + w.ewmut.Unlock() + return w.addWatch(path, sys_NOTE_ALLEVENTS) +} + +// RemoveWatch removes path from the watched file set. +func (w *Watcher) removeWatch(path string) error { + w.wmut.Lock() + watchfd, ok := w.watches[path] + w.wmut.Unlock() + if !ok { + return errors.New(fmt.Sprintf("can't remove non-existent kevent watch for: %s", path)) + } + var kbuf [1]syscall.Kevent_t + watchEntry := &kbuf[0] + syscall.SetKevent(watchEntry, watchfd, syscall.EVFILT_VNODE, syscall.EV_DELETE) + entryFlags := watchEntry.Flags + success, errno := syscall.Kevent(w.kq, kbuf[:], nil, nil) + if success == -1 { + return os.NewSyscallError("kevent_rm_watch", errno) + } else if (entryFlags & syscall.EV_ERROR) == syscall.EV_ERROR { + return errors.New("kevent rm error") + } + syscall.Close(watchfd) + w.wmut.Lock() + delete(w.watches, path) + w.wmut.Unlock() + w.enmut.Lock() + delete(w.enFlags, path) + w.enmut.Unlock() + w.pmut.Lock() + delete(w.paths, watchfd) + fInfo := w.finfo[watchfd] + delete(w.finfo, watchfd) + w.pmut.Unlock() + + // Find all watched paths that are in this directory that are not external. + if fInfo.IsDir() { + var pathsToRemove []string + w.pmut.Lock() + for _, wpath := range w.paths { + wdir, _ := filepath.Split(wpath) + if filepath.Clean(wdir) == filepath.Clean(path) { + w.ewmut.Lock() + if !w.externalWatches[wpath] { + pathsToRemove = append(pathsToRemove, wpath) + } + w.ewmut.Unlock() + } + } + w.pmut.Unlock() + for _, p := range pathsToRemove { + // Since these are internal, not much sense in propagating error + // to the user, as that will just confuse them with an error about + // a path they did not explicitly watch themselves. + w.removeWatch(p) + } + } + + return nil +} + +// readEvents reads from the kqueue file descriptor, converts the +// received events into Event objects and sends them via the Event channel +func (w *Watcher) readEvents() { + var ( + eventbuf [10]syscall.Kevent_t // Event buffer + events []syscall.Kevent_t // Received events + twait *syscall.Timespec // Time to block waiting for events + n int // Number of events returned from kevent + errno error // Syscall errno + ) + events = eventbuf[0:0] + twait = new(syscall.Timespec) + *twait = syscall.NsecToTimespec(keventWaitTime) + + for { + // See if there is a message on the "done" channel + var done bool + select { + case done = <-w.done: + default: + } + + // If "done" message is received + if done { + errno := syscall.Close(w.kq) + if errno != nil { + w.Error <- os.NewSyscallError("close", errno) + } + close(w.internalEvent) + close(w.Error) + return + } + + // Get new events + if len(events) == 0 { + n, errno = syscall.Kevent(w.kq, nil, eventbuf[:], twait) + + // EINTR is okay, basically the syscall was interrupted before + // timeout expired. + if errno != nil && errno != syscall.EINTR { + w.Error <- os.NewSyscallError("kevent", errno) + continue + } + + // Received some events + if n > 0 { + events = eventbuf[0:n] + } + } + + // Flush the events we received to the events channel + for len(events) > 0 { + fileEvent := new(FileEvent) + watchEvent := &events[0] + fileEvent.mask = uint32(watchEvent.Fflags) + w.pmut.Lock() + fileEvent.Name = w.paths[int(watchEvent.Ident)] + fileInfo := w.finfo[int(watchEvent.Ident)] + w.pmut.Unlock() + if fileInfo != nil && fileInfo.IsDir() && !fileEvent.IsDelete() { + // Double check to make sure the directory exist. This can happen when + // we do a rm -fr on a recursively watched folders and we receive a + // modification event first but the folder has been deleted and later + // receive the delete event + if _, err := os.Lstat(fileEvent.Name); os.IsNotExist(err) { + // mark is as delete event + fileEvent.mask |= sys_NOTE_DELETE + } + } + + if fileInfo != nil && fileInfo.IsDir() && fileEvent.IsModify() && !fileEvent.IsDelete() { + w.sendDirectoryChangeEvents(fileEvent.Name) + } else { + // Send the event on the events channel + w.internalEvent <- fileEvent + } + + // Move to next event + events = events[1:] + + if fileEvent.IsRename() { + w.removeWatch(fileEvent.Name) + w.femut.Lock() + delete(w.fileExists, fileEvent.Name) + w.femut.Unlock() + } + if fileEvent.IsDelete() { + w.removeWatch(fileEvent.Name) + w.femut.Lock() + delete(w.fileExists, fileEvent.Name) + w.femut.Unlock() + + // Look for a file that may have overwritten this + // (ie mv f1 f2 will delete f2 then create f2) + fileDir, _ := filepath.Split(fileEvent.Name) + fileDir = filepath.Clean(fileDir) + w.wmut.Lock() + _, found := w.watches[fileDir] + w.wmut.Unlock() + if found { + // make sure the directory exist before we watch for changes. When we + // do a recursive watch and perform rm -fr, the parent directory might + // have gone missing, ignore the missing directory and let the + // upcoming delete event remove the watch form the parent folder + if _, err := os.Lstat(fileDir); !os.IsNotExist(err) { + w.sendDirectoryChangeEvents(fileDir) + } + } + } + } + } +} + +func (w *Watcher) watchDirectoryFiles(dirPath string) error { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + return err + } + + // Search for new files + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + + // Inherit fsnFlags from parent directory + w.fsnmut.Lock() + if flags, found := w.fsnFlags[dirPath]; found { + w.fsnFlags[filePath] = flags + } else { + w.fsnFlags[filePath] = FSN_ALL + } + w.fsnmut.Unlock() + + if fileInfo.IsDir() == false { + // Watch file to mimic linux fsnotify + e := w.addWatch(filePath, sys_NOTE_ALLEVENTS) + if e != nil { + return e + } + } else { + // If the user is currently watching directory + // we want to preserve the flags used + w.enmut.Lock() + currFlags, found := w.enFlags[filePath] + w.enmut.Unlock() + var newFlags uint32 = sys_NOTE_DELETE + if found { + newFlags |= currFlags + } + + // Linux gives deletes if not explicitly watching + e := w.addWatch(filePath, newFlags) + if e != nil { + return e + } + } + w.femut.Lock() + w.fileExists[filePath] = true + w.femut.Unlock() + } + + return nil +} + +// sendDirectoryEvents searches the directory for newly created files +// and sends them over the event channel. This functionality is to have +// the BSD version of fsnotify match linux fsnotify which provides a +// create event for files created in a watched directory. +func (w *Watcher) sendDirectoryChangeEvents(dirPath string) { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + w.Error <- err + } + + // Search for new files + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + w.femut.Lock() + _, doesExist := w.fileExists[filePath] + w.femut.Unlock() + if !doesExist { + // Inherit fsnFlags from parent directory + w.fsnmut.Lock() + if flags, found := w.fsnFlags[dirPath]; found { + w.fsnFlags[filePath] = flags + } else { + w.fsnFlags[filePath] = FSN_ALL + } + w.fsnmut.Unlock() + + // Send create event + fileEvent := new(FileEvent) + fileEvent.Name = filePath + fileEvent.create = true + w.internalEvent <- fileEvent + } + w.femut.Lock() + w.fileExists[filePath] = true + w.femut.Unlock() + } + w.watchDirectoryFiles(dirPath) +} diff --git a/vendor/github.com/howeyc/fsnotify/fsnotify_linux.go b/vendor/github.com/howeyc/fsnotify/fsnotify_linux.go new file mode 100644 index 000000000000..80ade879fde0 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/fsnotify_linux.go @@ -0,0 +1,304 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "strings" + "sync" + "syscall" + "unsafe" +) + +const ( + // Options for inotify_init() are not exported + // sys_IN_CLOEXEC uint32 = syscall.IN_CLOEXEC + // sys_IN_NONBLOCK uint32 = syscall.IN_NONBLOCK + + // Options for AddWatch + sys_IN_DONT_FOLLOW uint32 = syscall.IN_DONT_FOLLOW + sys_IN_ONESHOT uint32 = syscall.IN_ONESHOT + sys_IN_ONLYDIR uint32 = syscall.IN_ONLYDIR + + // The "sys_IN_MASK_ADD" option is not exported, as AddWatch + // adds it automatically, if there is already a watch for the given path + // sys_IN_MASK_ADD uint32 = syscall.IN_MASK_ADD + + // Events + sys_IN_ACCESS uint32 = syscall.IN_ACCESS + sys_IN_ALL_EVENTS uint32 = syscall.IN_ALL_EVENTS + sys_IN_ATTRIB uint32 = syscall.IN_ATTRIB + sys_IN_CLOSE uint32 = syscall.IN_CLOSE + sys_IN_CLOSE_NOWRITE uint32 = syscall.IN_CLOSE_NOWRITE + sys_IN_CLOSE_WRITE uint32 = syscall.IN_CLOSE_WRITE + sys_IN_CREATE uint32 = syscall.IN_CREATE + sys_IN_DELETE uint32 = syscall.IN_DELETE + sys_IN_DELETE_SELF uint32 = syscall.IN_DELETE_SELF + sys_IN_MODIFY uint32 = syscall.IN_MODIFY + sys_IN_MOVE uint32 = syscall.IN_MOVE + sys_IN_MOVED_FROM uint32 = syscall.IN_MOVED_FROM + sys_IN_MOVED_TO uint32 = syscall.IN_MOVED_TO + sys_IN_MOVE_SELF uint32 = syscall.IN_MOVE_SELF + sys_IN_OPEN uint32 = syscall.IN_OPEN + + sys_AGNOSTIC_EVENTS = sys_IN_MOVED_TO | sys_IN_MOVED_FROM | sys_IN_CREATE | sys_IN_ATTRIB | sys_IN_MODIFY | sys_IN_MOVE_SELF | sys_IN_DELETE | sys_IN_DELETE_SELF + + // Special events + sys_IN_ISDIR uint32 = syscall.IN_ISDIR + sys_IN_IGNORED uint32 = syscall.IN_IGNORED + sys_IN_Q_OVERFLOW uint32 = syscall.IN_Q_OVERFLOW + sys_IN_UNMOUNT uint32 = syscall.IN_UNMOUNT +) + +type FileEvent struct { + mask uint32 // Mask of events + cookie uint32 // Unique cookie associating related events (for rename(2)) + Name string // File name (optional) +} + +// IsCreate reports whether the FileEvent was triggered by a creation +func (e *FileEvent) IsCreate() bool { + return (e.mask&sys_IN_CREATE) == sys_IN_CREATE || (e.mask&sys_IN_MOVED_TO) == sys_IN_MOVED_TO +} + +// IsDelete reports whether the FileEvent was triggered by a delete +func (e *FileEvent) IsDelete() bool { + return (e.mask&sys_IN_DELETE_SELF) == sys_IN_DELETE_SELF || (e.mask&sys_IN_DELETE) == sys_IN_DELETE +} + +// IsModify reports whether the FileEvent was triggered by a file modification or attribute change +func (e *FileEvent) IsModify() bool { + return ((e.mask&sys_IN_MODIFY) == sys_IN_MODIFY || (e.mask&sys_IN_ATTRIB) == sys_IN_ATTRIB) +} + +// IsRename reports whether the FileEvent was triggered by a change name +func (e *FileEvent) IsRename() bool { + return ((e.mask&sys_IN_MOVE_SELF) == sys_IN_MOVE_SELF || (e.mask&sys_IN_MOVED_FROM) == sys_IN_MOVED_FROM) +} + +// IsAttrib reports whether the FileEvent was triggered by a change in the file metadata. +func (e *FileEvent) IsAttrib() bool { + return (e.mask & sys_IN_ATTRIB) == sys_IN_ATTRIB +} + +type watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) +} + +type Watcher struct { + mu sync.Mutex // Map access + fd int // File descriptor (as returned by the inotify_init() syscall) + watches map[string]*watch // Map of inotify watches (key: path) + fsnFlags map[string]uint32 // Map of watched files to flags used for filter + fsnmut sync.Mutex // Protects access to fsnFlags. + paths map[int]string // Map of watched paths (key: watch descriptor) + Error chan error // Errors are sent on this channel + internalEvent chan *FileEvent // Events are queued on this channel + Event chan *FileEvent // Events are returned on this channel + done chan bool // Channel for sending a "quit message" to the reader goroutine + isClosed bool // Set to true when Close() is first called +} + +// NewWatcher creates and returns a new inotify instance using inotify_init(2) +func NewWatcher() (*Watcher, error) { + fd, errno := syscall.InotifyInit() + if fd == -1 { + return nil, os.NewSyscallError("inotify_init", errno) + } + w := &Watcher{ + fd: fd, + watches: make(map[string]*watch), + fsnFlags: make(map[string]uint32), + paths: make(map[int]string), + internalEvent: make(chan *FileEvent), + Event: make(chan *FileEvent), + Error: make(chan error), + done: make(chan bool, 1), + } + + go w.readEvents() + go w.purgeEvents() + return w, nil +} + +// Close closes an inotify watcher instance +// It sends a message to the reader goroutine to quit and removes all watches +// associated with the inotify instance +func (w *Watcher) Close() error { + if w.isClosed { + return nil + } + w.isClosed = true + + // Remove all watches + for path := range w.watches { + w.RemoveWatch(path) + } + + // Send "quit" message to the reader goroutine + w.done <- true + + return nil +} + +// AddWatch adds path to the watched file set. +// The flags are interpreted as described in inotify_add_watch(2). +func (w *Watcher) addWatch(path string, flags uint32) error { + if w.isClosed { + return errors.New("inotify instance already closed") + } + + w.mu.Lock() + watchEntry, found := w.watches[path] + w.mu.Unlock() + if found { + watchEntry.flags |= flags + flags |= syscall.IN_MASK_ADD + } + wd, errno := syscall.InotifyAddWatch(w.fd, path, flags) + if wd == -1 { + return errno + } + + w.mu.Lock() + w.watches[path] = &watch{wd: uint32(wd), flags: flags} + w.paths[wd] = path + w.mu.Unlock() + + return nil +} + +// Watch adds path to the watched file set, watching all events. +func (w *Watcher) watch(path string) error { + return w.addWatch(path, sys_AGNOSTIC_EVENTS) +} + +// RemoveWatch removes path from the watched file set. +func (w *Watcher) removeWatch(path string) error { + w.mu.Lock() + defer w.mu.Unlock() + watch, ok := w.watches[path] + if !ok { + return errors.New(fmt.Sprintf("can't remove non-existent inotify watch for: %s", path)) + } + success, errno := syscall.InotifyRmWatch(w.fd, watch.wd) + if success == -1 { + return os.NewSyscallError("inotify_rm_watch", errno) + } + delete(w.watches, path) + return nil +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Event channel +func (w *Watcher) readEvents() { + var ( + buf [syscall.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events + n int // Number of bytes read with read() + errno error // Syscall errno + ) + + for { + // See if there is a message on the "done" channel + select { + case <-w.done: + syscall.Close(w.fd) + close(w.internalEvent) + close(w.Error) + return + default: + } + + n, errno = syscall.Read(w.fd, buf[:]) + + // If EOF is received + if n == 0 { + syscall.Close(w.fd) + close(w.internalEvent) + close(w.Error) + return + } + + if n < 0 { + w.Error <- os.NewSyscallError("read", errno) + continue + } + if n < syscall.SizeofInotifyEvent { + w.Error <- errors.New("inotify: short read in readEvents()") + continue + } + + var offset uint32 = 0 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-syscall.SizeofInotifyEvent) { + // Point "raw" to the event in the buffer + raw := (*syscall.InotifyEvent)(unsafe.Pointer(&buf[offset])) + event := new(FileEvent) + event.mask = uint32(raw.Mask) + event.cookie = uint32(raw.Cookie) + nameLen := uint32(raw.Len) + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + w.mu.Lock() + event.Name = w.paths[int(raw.Wd)] + w.mu.Unlock() + watchedName := event.Name + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[syscall.PathMax]byte)(unsafe.Pointer(&buf[offset+syscall.SizeofInotifyEvent])) + // The filename is padded with NUL bytes. TrimRight() gets rid of those. + event.Name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + + // Send the events that are not ignored on the events channel + if !event.ignoreLinux() { + // Setup FSNotify flags (inherit from directory watch) + w.fsnmut.Lock() + if _, fsnFound := w.fsnFlags[event.Name]; !fsnFound { + if fsnFlags, watchFound := w.fsnFlags[watchedName]; watchFound { + w.fsnFlags[event.Name] = fsnFlags + } else { + w.fsnFlags[event.Name] = FSN_ALL + } + } + w.fsnmut.Unlock() + + w.internalEvent <- event + } + + // Move to the next event in the buffer + offset += syscall.SizeofInotifyEvent + nameLen + } + } +} + +// Certain types of events can be "ignored" and not sent over the Event +// channel. Such as events marked ignore by the kernel, or MODIFY events +// against files that do not exist. +func (e *FileEvent) ignoreLinux() bool { + // Ignore anything the inotify API says to ignore + if e.mask&sys_IN_IGNORED == sys_IN_IGNORED { + return true + } + + // If the event is not a DELETE or RENAME, the file must exist. + // Otherwise the event is ignored. + // *Note*: this was put in place because it was seen that a MODIFY + // event was sent after the DELETE. This ignores that MODIFY and + // assumes a DELETE will come or has come if the file doesn't exist. + if !(e.IsDelete() || e.IsRename()) { + _, statErr := os.Lstat(e.Name) + return os.IsNotExist(statErr) + } + return false +} diff --git a/vendor/github.com/howeyc/fsnotify/fsnotify_open_bsd.go b/vendor/github.com/howeyc/fsnotify/fsnotify_open_bsd.go new file mode 100644 index 000000000000..f728a6ffd731 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/fsnotify_open_bsd.go @@ -0,0 +1,11 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd openbsd netbsd dragonfly + +package fsnotify + +import "syscall" + +const open_FLAGS = syscall.O_NONBLOCK | syscall.O_RDONLY diff --git a/vendor/github.com/howeyc/fsnotify/fsnotify_open_darwin.go b/vendor/github.com/howeyc/fsnotify/fsnotify_open_darwin.go new file mode 100644 index 000000000000..d450318e6063 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/fsnotify_open_darwin.go @@ -0,0 +1,11 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin + +package fsnotify + +import "syscall" + +const open_FLAGS = syscall.O_EVTONLY diff --git a/vendor/github.com/howeyc/fsnotify/fsnotify_windows.go b/vendor/github.com/howeyc/fsnotify/fsnotify_windows.go new file mode 100644 index 000000000000..d88ae63407d2 --- /dev/null +++ b/vendor/github.com/howeyc/fsnotify/fsnotify_windows.go @@ -0,0 +1,598 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sync" + "syscall" + "unsafe" +) + +const ( + // Options for AddWatch + sys_FS_ONESHOT = 0x80000000 + sys_FS_ONLYDIR = 0x1000000 + + // Events + sys_FS_ACCESS = 0x1 + sys_FS_ALL_EVENTS = 0xfff + sys_FS_ATTRIB = 0x4 + sys_FS_CLOSE = 0x18 + sys_FS_CREATE = 0x100 + sys_FS_DELETE = 0x200 + sys_FS_DELETE_SELF = 0x400 + sys_FS_MODIFY = 0x2 + sys_FS_MOVE = 0xc0 + sys_FS_MOVED_FROM = 0x40 + sys_FS_MOVED_TO = 0x80 + sys_FS_MOVE_SELF = 0x800 + + // Special events + sys_FS_IGNORED = 0x8000 + sys_FS_Q_OVERFLOW = 0x4000 +) + +const ( + // TODO(nj): Use syscall.ERROR_MORE_DATA from ztypes_windows in Go 1.3+ + sys_ERROR_MORE_DATA syscall.Errno = 234 +) + +// Event is the type of the notification messages +// received on the watcher's Event channel. +type FileEvent struct { + mask uint32 // Mask of events + cookie uint32 // Unique cookie associating related events (for rename) + Name string // File name (optional) +} + +// IsCreate reports whether the FileEvent was triggered by a creation +func (e *FileEvent) IsCreate() bool { return (e.mask & sys_FS_CREATE) == sys_FS_CREATE } + +// IsDelete reports whether the FileEvent was triggered by a delete +func (e *FileEvent) IsDelete() bool { + return ((e.mask&sys_FS_DELETE) == sys_FS_DELETE || (e.mask&sys_FS_DELETE_SELF) == sys_FS_DELETE_SELF) +} + +// IsModify reports whether the FileEvent was triggered by a file modification or attribute change +func (e *FileEvent) IsModify() bool { + return ((e.mask&sys_FS_MODIFY) == sys_FS_MODIFY || (e.mask&sys_FS_ATTRIB) == sys_FS_ATTRIB) +} + +// IsRename reports whether the FileEvent was triggered by a change name +func (e *FileEvent) IsRename() bool { + return ((e.mask&sys_FS_MOVE) == sys_FS_MOVE || (e.mask&sys_FS_MOVE_SELF) == sys_FS_MOVE_SELF || (e.mask&sys_FS_MOVED_FROM) == sys_FS_MOVED_FROM || (e.mask&sys_FS_MOVED_TO) == sys_FS_MOVED_TO) +} + +// IsAttrib reports whether the FileEvent was triggered by a change in the file metadata. +func (e *FileEvent) IsAttrib() bool { + return (e.mask & sys_FS_ATTRIB) == sys_FS_ATTRIB +} + +const ( + opAddWatch = iota + opRemoveWatch +) + +const ( + provisional uint64 = 1 << (32 + iota) +) + +type input struct { + op int + path string + flags uint32 + reply chan error +} + +type inode struct { + handle syscall.Handle + volume uint32 + index uint64 +} + +type watch struct { + ov syscall.Overlapped + ino *inode // i-number + path string // Directory path + mask uint64 // Directory itself is being watched with these notify flags + names map[string]uint64 // Map of names being watched and their notify flags + rename string // Remembers the old name while renaming a file + buf [4096]byte +} + +type indexMap map[uint64]*watch +type watchMap map[uint32]indexMap + +// A Watcher waits for and receives event notifications +// for a specific set of files and directories. +type Watcher struct { + mu sync.Mutex // Map access + port syscall.Handle // Handle to completion port + watches watchMap // Map of watches (key: i-number) + fsnFlags map[string]uint32 // Map of watched files to flags used for filter + fsnmut sync.Mutex // Protects access to fsnFlags. + input chan *input // Inputs to the reader are sent on this channel + internalEvent chan *FileEvent // Events are queued on this channel + Event chan *FileEvent // Events are returned on this channel + Error chan error // Errors are sent on this channel + isClosed bool // Set to true when Close() is first called + quit chan chan<- error + cookie uint32 +} + +// NewWatcher creates and returns a Watcher. +func NewWatcher() (*Watcher, error) { + port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) + if e != nil { + return nil, os.NewSyscallError("CreateIoCompletionPort", e) + } + w := &Watcher{ + port: port, + watches: make(watchMap), + fsnFlags: make(map[string]uint32), + input: make(chan *input, 1), + Event: make(chan *FileEvent, 50), + internalEvent: make(chan *FileEvent), + Error: make(chan error), + quit: make(chan chan<- error, 1), + } + go w.readEvents() + go w.purgeEvents() + return w, nil +} + +// Close closes a Watcher. +// It sends a message to the reader goroutine to quit and removes all watches +// associated with the watcher. +func (w *Watcher) Close() error { + if w.isClosed { + return nil + } + w.isClosed = true + + // Send "quit" message to the reader goroutine + ch := make(chan error) + w.quit <- ch + if err := w.wakeupReader(); err != nil { + return err + } + return <-ch +} + +// AddWatch adds path to the watched file set. +func (w *Watcher) AddWatch(path string, flags uint32) error { + if w.isClosed { + return errors.New("watcher already closed") + } + in := &input{ + op: opAddWatch, + path: filepath.Clean(path), + flags: flags, + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// Watch adds path to the watched file set, watching all events. +func (w *Watcher) watch(path string) error { + return w.AddWatch(path, sys_FS_ALL_EVENTS) +} + +// RemoveWatch removes path from the watched file set. +func (w *Watcher) removeWatch(path string) error { + in := &input{ + op: opRemoveWatch, + path: filepath.Clean(path), + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +func (w *Watcher) wakeupReader() error { + e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) + if e != nil { + return os.NewSyscallError("PostQueuedCompletionStatus", e) + } + return nil +} + +func getDir(pathname string) (dir string, err error) { + attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) + if e != nil { + return "", os.NewSyscallError("GetFileAttributes", e) + } + if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { + dir = pathname + } else { + dir, _ = filepath.Split(pathname) + dir = filepath.Clean(dir) + } + return +} + +func getIno(path string) (ino *inode, err error) { + h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), + syscall.FILE_LIST_DIRECTORY, + syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, + nil, syscall.OPEN_EXISTING, + syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) + if e != nil { + return nil, os.NewSyscallError("CreateFile", e) + } + var fi syscall.ByHandleFileInformation + if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { + syscall.CloseHandle(h) + return nil, os.NewSyscallError("GetFileInformationByHandle", e) + } + ino = &inode{ + handle: h, + volume: fi.VolumeSerialNumber, + index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), + } + return ino, nil +} + +// Must run within the I/O thread. +func (m watchMap) get(ino *inode) *watch { + if i := m[ino.volume]; i != nil { + return i[ino.index] + } + return nil +} + +// Must run within the I/O thread. +func (m watchMap) set(ino *inode, watch *watch) { + i := m[ino.volume] + if i == nil { + i = make(indexMap) + m[ino.volume] = i + } + i[ino.index] = watch +} + +// Must run within the I/O thread. +func (w *Watcher) addWatch(pathname string, flags uint64) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + if flags&sys_FS_ONLYDIR != 0 && pathname != dir { + return nil + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watchEntry := w.watches.get(ino) + w.mu.Unlock() + if watchEntry == nil { + if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { + syscall.CloseHandle(ino.handle) + return os.NewSyscallError("CreateIoCompletionPort", e) + } + watchEntry = &watch{ + ino: ino, + path: dir, + names: make(map[string]uint64), + } + w.mu.Lock() + w.watches.set(ino, watchEntry) + w.mu.Unlock() + flags |= provisional + } else { + syscall.CloseHandle(ino.handle) + } + if pathname == dir { + watchEntry.mask |= flags + } else { + watchEntry.names[filepath.Base(pathname)] |= flags + } + if err = w.startRead(watchEntry); err != nil { + return err + } + if pathname == dir { + watchEntry.mask &= ^provisional + } else { + watchEntry.names[filepath.Base(pathname)] &= ^provisional + } + return nil +} + +// Must run within the I/O thread. +func (w *Watcher) remWatch(pathname string) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watch := w.watches.get(ino) + w.mu.Unlock() + if watch == nil { + return fmt.Errorf("can't remove non-existent watch for: %s", pathname) + } + if pathname == dir { + w.sendEvent(watch.path, watch.mask&sys_FS_IGNORED) + watch.mask = 0 + } else { + name := filepath.Base(pathname) + w.sendEvent(watch.path+"\\"+name, watch.names[name]&sys_FS_IGNORED) + delete(watch.names, name) + } + return w.startRead(watch) +} + +// Must run within the I/O thread. +func (w *Watcher) deleteWatch(watch *watch) { + for name, mask := range watch.names { + if mask&provisional == 0 { + w.sendEvent(watch.path+"\\"+name, mask&sys_FS_IGNORED) + } + delete(watch.names, name) + } + if watch.mask != 0 { + if watch.mask&provisional == 0 { + w.sendEvent(watch.path, watch.mask&sys_FS_IGNORED) + } + watch.mask = 0 + } +} + +// Must run within the I/O thread. +func (w *Watcher) startRead(watch *watch) error { + if e := syscall.CancelIo(watch.ino.handle); e != nil { + w.Error <- os.NewSyscallError("CancelIo", e) + w.deleteWatch(watch) + } + mask := toWindowsFlags(watch.mask) + for _, m := range watch.names { + mask |= toWindowsFlags(m) + } + if mask == 0 { + if e := syscall.CloseHandle(watch.ino.handle); e != nil { + w.Error <- os.NewSyscallError("CloseHandle", e) + } + w.mu.Lock() + delete(w.watches[watch.ino.volume], watch.ino.index) + w.mu.Unlock() + return nil + } + e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], + uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) + if e != nil { + err := os.NewSyscallError("ReadDirectoryChanges", e) + if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { + // Watched directory was probably removed + if w.sendEvent(watch.path, watch.mask&sys_FS_DELETE_SELF) { + if watch.mask&sys_FS_ONESHOT != 0 { + watch.mask = 0 + } + } + err = nil + } + w.deleteWatch(watch) + w.startRead(watch) + return err + } + return nil +} + +// readEvents reads from the I/O completion port, converts the +// received events into Event objects and sends them via the Event channel. +// Entry point to the I/O thread. +func (w *Watcher) readEvents() { + var ( + n, key uint32 + ov *syscall.Overlapped + ) + runtime.LockOSThread() + + for { + e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) + watch := (*watch)(unsafe.Pointer(ov)) + + if watch == nil { + select { + case ch := <-w.quit: + w.mu.Lock() + var indexes []indexMap + for _, index := range w.watches { + indexes = append(indexes, index) + } + w.mu.Unlock() + for _, index := range indexes { + for _, watch := range index { + w.deleteWatch(watch) + w.startRead(watch) + } + } + var err error + if e := syscall.CloseHandle(w.port); e != nil { + err = os.NewSyscallError("CloseHandle", e) + } + close(w.internalEvent) + close(w.Error) + ch <- err + return + case in := <-w.input: + switch in.op { + case opAddWatch: + in.reply <- w.addWatch(in.path, uint64(in.flags)) + case opRemoveWatch: + in.reply <- w.remWatch(in.path) + } + default: + } + continue + } + + switch e { + case sys_ERROR_MORE_DATA: + if watch == nil { + w.Error <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer") + } else { + // The i/o succeeded but the buffer is full. + // In theory we should be building up a full packet. + // In practice we can get away with just carrying on. + n = uint32(unsafe.Sizeof(watch.buf)) + } + case syscall.ERROR_ACCESS_DENIED: + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sys_FS_DELETE_SELF) + w.deleteWatch(watch) + w.startRead(watch) + continue + case syscall.ERROR_OPERATION_ABORTED: + // CancelIo was called on this handle + continue + default: + w.Error <- os.NewSyscallError("GetQueuedCompletionPort", e) + continue + case nil: + } + + var offset uint32 + for { + if n == 0 { + w.internalEvent <- &FileEvent{mask: sys_FS_Q_OVERFLOW} + w.Error <- errors.New("short read in readEvents()") + break + } + + // Point "raw" to the event in the buffer + raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) + buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName)) + name := syscall.UTF16ToString(buf[:raw.FileNameLength/2]) + fullname := watch.path + "\\" + name + + var mask uint64 + switch raw.Action { + case syscall.FILE_ACTION_REMOVED: + mask = sys_FS_DELETE_SELF + case syscall.FILE_ACTION_MODIFIED: + mask = sys_FS_MODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + watch.rename = name + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + if watch.names[watch.rename] != 0 { + watch.names[name] |= watch.names[watch.rename] + delete(watch.names, watch.rename) + mask = sys_FS_MOVE_SELF + } + } + + sendNameEvent := func() { + if w.sendEvent(fullname, watch.names[name]&mask) { + if watch.names[name]&sys_FS_ONESHOT != 0 { + delete(watch.names, name) + } + } + } + if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { + sendNameEvent() + } + if raw.Action == syscall.FILE_ACTION_REMOVED { + w.sendEvent(fullname, watch.names[name]&sys_FS_IGNORED) + delete(watch.names, name) + } + if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { + if watch.mask&sys_FS_ONESHOT != 0 { + watch.mask = 0 + } + } + if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { + fullname = watch.path + "\\" + watch.rename + sendNameEvent() + } + + // Move to the next event in the buffer + if raw.NextEntryOffset == 0 { + break + } + offset += raw.NextEntryOffset + + // Error! + if offset >= n { + w.Error <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.") + break + } + } + + if err := w.startRead(watch); err != nil { + w.Error <- err + } + } +} + +func (w *Watcher) sendEvent(name string, mask uint64) bool { + if mask == 0 { + return false + } + event := &FileEvent{mask: uint32(mask), Name: name} + if mask&sys_FS_MOVE != 0 { + if mask&sys_FS_MOVED_FROM != 0 { + w.cookie++ + } + event.cookie = w.cookie + } + select { + case ch := <-w.quit: + w.quit <- ch + case w.Event <- event: + } + return true +} + +func toWindowsFlags(mask uint64) uint32 { + var m uint32 + if mask&sys_FS_ACCESS != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS + } + if mask&sys_FS_MODIFY != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE + } + if mask&sys_FS_ATTRIB != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES + } + if mask&(sys_FS_MOVE|sys_FS_CREATE|sys_FS_DELETE) != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME + } + return m +} + +func toFSnotifyFlags(action uint32) uint64 { + switch action { + case syscall.FILE_ACTION_ADDED: + return sys_FS_CREATE + case syscall.FILE_ACTION_REMOVED: + return sys_FS_DELETE + case syscall.FILE_ACTION_MODIFIED: + return sys_FS_MODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + return sys_FS_MOVED_FROM + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + return sys_FS_MOVED_TO + } + return 0 +} diff --git a/vendor/github.com/influxdata/influxdb/client/v2/client.go b/vendor/github.com/influxdata/influxdb/client/v2/client.go deleted file mode 100644 index 77d44f2b34fb..000000000000 --- a/vendor/github.com/influxdata/influxdb/client/v2/client.go +++ /dev/null @@ -1,635 +0,0 @@ -// Package client (v2) is the current official Go client for InfluxDB. -package client // import "github.com/influxdata/influxdb/client/v2" - -import ( - "bytes" - "crypto/tls" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "mime" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "github.com/influxdata/influxdb/models" -) - -// HTTPConfig is the config data needed to create an HTTP Client. -type HTTPConfig struct { - // Addr should be of the form "http://host:port" - // or "http://[ipv6-host%zone]:port". - Addr string - - // Username is the influxdb username, optional. - Username string - - // Password is the influxdb password, optional. - Password string - - // UserAgent is the http User Agent, defaults to "InfluxDBClient". - UserAgent string - - // Timeout for influxdb writes, defaults to no timeout. - Timeout time.Duration - - // InsecureSkipVerify gets passed to the http client, if true, it will - // skip https certificate verification. Defaults to false. - InsecureSkipVerify bool - - // TLSConfig allows the user to set their own TLS config for the HTTP - // Client. If set, this option overrides InsecureSkipVerify. - TLSConfig *tls.Config -} - -// BatchPointsConfig is the config data needed to create an instance of the BatchPoints struct. -type BatchPointsConfig struct { - // Precision is the write precision of the points, defaults to "ns". - Precision string - - // Database is the database to write points to. - Database string - - // RetentionPolicy is the retention policy of the points. - RetentionPolicy string - - // Write consistency is the number of servers required to confirm write. - WriteConsistency string -} - -// Client is a client interface for writing & querying the database. -type Client interface { - // Ping checks that status of cluster, and will always return 0 time and no - // error for UDP clients. - Ping(timeout time.Duration) (time.Duration, string, error) - - // Write takes a BatchPoints object and writes all Points to InfluxDB. - Write(bp BatchPoints) error - - // Query makes an InfluxDB Query on the database. This will fail if using - // the UDP client. - Query(q Query) (*Response, error) - - // Close releases any resources a Client may be using. - Close() error -} - -// NewHTTPClient returns a new Client from the provided config. -// Client is safe for concurrent use by multiple goroutines. -func NewHTTPClient(conf HTTPConfig) (Client, error) { - if conf.UserAgent == "" { - conf.UserAgent = "InfluxDBClient" - } - - u, err := url.Parse(conf.Addr) - if err != nil { - return nil, err - } else if u.Scheme != "http" && u.Scheme != "https" { - m := fmt.Sprintf("Unsupported protocol scheme: %s, your address"+ - " must start with http:// or https://", u.Scheme) - return nil, errors.New(m) - } - - tr := &http.Transport{ - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: conf.InsecureSkipVerify, - }, - } - if conf.TLSConfig != nil { - tr.TLSClientConfig = conf.TLSConfig - } - return &client{ - url: *u, - username: conf.Username, - password: conf.Password, - useragent: conf.UserAgent, - httpClient: &http.Client{ - Timeout: conf.Timeout, - Transport: tr, - }, - transport: tr, - }, nil -} - -// Ping will check to see if the server is up with an optional timeout on waiting for leader. -// Ping returns how long the request took, the version of the server it connected to, and an error if one occurred. -func (c *client) Ping(timeout time.Duration) (time.Duration, string, error) { - now := time.Now() - u := c.url - u.Path = "ping" - - req, err := http.NewRequest("GET", u.String(), nil) - if err != nil { - return 0, "", err - } - - req.Header.Set("User-Agent", c.useragent) - - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - - if timeout > 0 { - params := req.URL.Query() - params.Set("wait_for_leader", fmt.Sprintf("%.0fs", timeout.Seconds())) - req.URL.RawQuery = params.Encode() - } - - resp, err := c.httpClient.Do(req) - if err != nil { - return 0, "", err - } - defer resp.Body.Close() - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return 0, "", err - } - - if resp.StatusCode != http.StatusNoContent { - var err = fmt.Errorf(string(body)) - return 0, "", err - } - - version := resp.Header.Get("X-Influxdb-Version") - return time.Since(now), version, nil -} - -// Close releases the client's resources. -func (c *client) Close() error { - c.transport.CloseIdleConnections() - return nil -} - -// client is safe for concurrent use as the fields are all read-only -// once the client is instantiated. -type client struct { - // N.B - if url.UserInfo is accessed in future modifications to the - // methods on client, you will need to syncronise access to url. - url url.URL - username string - password string - useragent string - httpClient *http.Client - transport *http.Transport -} - -// BatchPoints is an interface into a batched grouping of points to write into -// InfluxDB together. BatchPoints is NOT thread-safe, you must create a separate -// batch for each goroutine. -type BatchPoints interface { - // AddPoint adds the given point to the Batch of points. - AddPoint(p *Point) - // AddPoints adds the given points to the Batch of points. - AddPoints(ps []*Point) - // Points lists the points in the Batch. - Points() []*Point - - // Precision returns the currently set precision of this Batch. - Precision() string - // SetPrecision sets the precision of this batch. - SetPrecision(s string) error - - // Database returns the currently set database of this Batch. - Database() string - // SetDatabase sets the database of this Batch. - SetDatabase(s string) - - // WriteConsistency returns the currently set write consistency of this Batch. - WriteConsistency() string - // SetWriteConsistency sets the write consistency of this Batch. - SetWriteConsistency(s string) - - // RetentionPolicy returns the currently set retention policy of this Batch. - RetentionPolicy() string - // SetRetentionPolicy sets the retention policy of this Batch. - SetRetentionPolicy(s string) -} - -// NewBatchPoints returns a BatchPoints interface based on the given config. -func NewBatchPoints(conf BatchPointsConfig) (BatchPoints, error) { - if conf.Precision == "" { - conf.Precision = "ns" - } - if _, err := time.ParseDuration("1" + conf.Precision); err != nil { - return nil, err - } - bp := &batchpoints{ - database: conf.Database, - precision: conf.Precision, - retentionPolicy: conf.RetentionPolicy, - writeConsistency: conf.WriteConsistency, - } - return bp, nil -} - -type batchpoints struct { - points []*Point - database string - precision string - retentionPolicy string - writeConsistency string -} - -func (bp *batchpoints) AddPoint(p *Point) { - bp.points = append(bp.points, p) -} - -func (bp *batchpoints) AddPoints(ps []*Point) { - bp.points = append(bp.points, ps...) -} - -func (bp *batchpoints) Points() []*Point { - return bp.points -} - -func (bp *batchpoints) Precision() string { - return bp.precision -} - -func (bp *batchpoints) Database() string { - return bp.database -} - -func (bp *batchpoints) WriteConsistency() string { - return bp.writeConsistency -} - -func (bp *batchpoints) RetentionPolicy() string { - return bp.retentionPolicy -} - -func (bp *batchpoints) SetPrecision(p string) error { - if _, err := time.ParseDuration("1" + p); err != nil { - return err - } - bp.precision = p - return nil -} - -func (bp *batchpoints) SetDatabase(db string) { - bp.database = db -} - -func (bp *batchpoints) SetWriteConsistency(wc string) { - bp.writeConsistency = wc -} - -func (bp *batchpoints) SetRetentionPolicy(rp string) { - bp.retentionPolicy = rp -} - -// Point represents a single data point. -type Point struct { - pt models.Point -} - -// NewPoint returns a point with the given timestamp. If a timestamp is not -// given, then data is sent to the database without a timestamp, in which case -// the server will assign local time upon reception. NOTE: it is recommended to -// send data with a timestamp. -func NewPoint( - name string, - tags map[string]string, - fields map[string]interface{}, - t ...time.Time, -) (*Point, error) { - var T time.Time - if len(t) > 0 { - T = t[0] - } - - pt, err := models.NewPoint(name, models.NewTags(tags), fields, T) - if err != nil { - return nil, err - } - return &Point{ - pt: pt, - }, nil -} - -// String returns a line-protocol string of the Point. -func (p *Point) String() string { - return p.pt.String() -} - -// PrecisionString returns a line-protocol string of the Point, -// with the timestamp formatted for the given precision. -func (p *Point) PrecisionString(precison string) string { - return p.pt.PrecisionString(precison) -} - -// Name returns the measurement name of the point. -func (p *Point) Name() string { - return string(p.pt.Name()) -} - -// Tags returns the tags associated with the point. -func (p *Point) Tags() map[string]string { - return p.pt.Tags().Map() -} - -// Time return the timestamp for the point. -func (p *Point) Time() time.Time { - return p.pt.Time() -} - -// UnixNano returns timestamp of the point in nanoseconds since Unix epoch. -func (p *Point) UnixNano() int64 { - return p.pt.UnixNano() -} - -// Fields returns the fields for the point. -func (p *Point) Fields() (map[string]interface{}, error) { - return p.pt.Fields() -} - -// NewPointFrom returns a point from the provided models.Point. -func NewPointFrom(pt models.Point) *Point { - return &Point{pt: pt} -} - -func (c *client) Write(bp BatchPoints) error { - var b bytes.Buffer - - for _, p := range bp.Points() { - if _, err := b.WriteString(p.pt.PrecisionString(bp.Precision())); err != nil { - return err - } - - if err := b.WriteByte('\n'); err != nil { - return err - } - } - - u := c.url - u.Path = "write" - req, err := http.NewRequest("POST", u.String(), &b) - if err != nil { - return err - } - req.Header.Set("Content-Type", "") - req.Header.Set("User-Agent", c.useragent) - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - - params := req.URL.Query() - params.Set("db", bp.Database()) - params.Set("rp", bp.RetentionPolicy()) - params.Set("precision", bp.Precision()) - params.Set("consistency", bp.WriteConsistency()) - req.URL.RawQuery = params.Encode() - - resp, err := c.httpClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { - var err = fmt.Errorf(string(body)) - return err - } - - return nil -} - -// Query defines a query to send to the server. -type Query struct { - Command string - Database string - Precision string - Chunked bool - ChunkSize int - Parameters map[string]interface{} -} - -// NewQuery returns a query object. -// The database and precision arguments can be empty strings if they are not needed for the query. -func NewQuery(command, database, precision string) Query { - return Query{ - Command: command, - Database: database, - Precision: precision, - Parameters: make(map[string]interface{}), - } -} - -// NewQueryWithParameters returns a query object. -// The database and precision arguments can be empty strings if they are not needed for the query. -// parameters is a map of the parameter names used in the command to their values. -func NewQueryWithParameters(command, database, precision string, parameters map[string]interface{}) Query { - return Query{ - Command: command, - Database: database, - Precision: precision, - Parameters: parameters, - } -} - -// Response represents a list of statement results. -type Response struct { - Results []Result - Err string `json:"error,omitempty"` -} - -// Error returns the first error from any statement. -// It returns nil if no errors occurred on any statements. -func (r *Response) Error() error { - if r.Err != "" { - return fmt.Errorf(r.Err) - } - for _, result := range r.Results { - if result.Err != "" { - return fmt.Errorf(result.Err) - } - } - return nil -} - -// Message represents a user message. -type Message struct { - Level string - Text string -} - -// Result represents a resultset returned from a single statement. -type Result struct { - Series []models.Row - Messages []*Message - Err string `json:"error,omitempty"` -} - -// Query sends a command to the server and returns the Response. -func (c *client) Query(q Query) (*Response, error) { - u := c.url - u.Path = "query" - - jsonParameters, err := json.Marshal(q.Parameters) - - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", u.String(), nil) - if err != nil { - return nil, err - } - - req.Header.Set("Content-Type", "") - req.Header.Set("User-Agent", c.useragent) - - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - - params := req.URL.Query() - params.Set("q", q.Command) - params.Set("db", q.Database) - params.Set("params", string(jsonParameters)) - if q.Chunked { - params.Set("chunked", "true") - if q.ChunkSize > 0 { - params.Set("chunk_size", strconv.Itoa(q.ChunkSize)) - } - } - - if q.Precision != "" { - params.Set("epoch", q.Precision) - } - req.URL.RawQuery = params.Encode() - - resp, err := c.httpClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - // If we lack a X-Influxdb-Version header, then we didn't get a response from influxdb - // but instead some other service. If the error code is also a 500+ code, then some - // downstream loadbalancer/proxy/etc had an issue and we should report that. - if resp.Header.Get("X-Influxdb-Version") == "" && resp.StatusCode >= http.StatusInternalServerError { - body, err := ioutil.ReadAll(resp.Body) - if err != nil || len(body) == 0 { - return nil, fmt.Errorf("received status code %d from downstream server", resp.StatusCode) - } - - return nil, fmt.Errorf("received status code %d from downstream server, with response body: %q", resp.StatusCode, body) - } - - // If we get an unexpected content type, then it is also not from influx direct and therefore - // we want to know what we received and what status code was returned for debugging purposes. - if cType, _, _ := mime.ParseMediaType(resp.Header.Get("Content-Type")); cType != "application/json" { - // Read up to 1kb of the body to help identify downstream errors and limit the impact of things - // like downstream serving a large file - body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1024)) - if err != nil || len(body) == 0 { - return nil, fmt.Errorf("expected json response, got empty body, with status: %v", resp.StatusCode) - } - - return nil, fmt.Errorf("expected json response, got %q, with status: %v and response body: %q", cType, resp.StatusCode, body) - } - - var response Response - if q.Chunked { - cr := NewChunkedResponse(resp.Body) - for { - r, err := cr.NextResponse() - if err != nil { - // If we got an error while decoding the response, send that back. - return nil, err - } - - if r == nil { - break - } - - response.Results = append(response.Results, r.Results...) - if r.Err != "" { - response.Err = r.Err - break - } - } - } else { - dec := json.NewDecoder(resp.Body) - dec.UseNumber() - decErr := dec.Decode(&response) - - // ignore this error if we got an invalid status code - if decErr != nil && decErr.Error() == "EOF" && resp.StatusCode != http.StatusOK { - decErr = nil - } - // If we got a valid decode error, send that back - if decErr != nil { - return nil, fmt.Errorf("unable to decode json: received status code %d err: %s", resp.StatusCode, decErr) - } - } - - // If we don't have an error in our json response, and didn't get statusOK - // then send back an error - if resp.StatusCode != http.StatusOK && response.Error() == nil { - return &response, fmt.Errorf("received status code %d from server", resp.StatusCode) - } - return &response, nil -} - -// duplexReader reads responses and writes it to another writer while -// satisfying the reader interface. -type duplexReader struct { - r io.Reader - w io.Writer -} - -func (r *duplexReader) Read(p []byte) (n int, err error) { - n, err = r.r.Read(p) - if err == nil { - r.w.Write(p[:n]) - } - return n, err -} - -// ChunkedResponse represents a response from the server that -// uses chunking to stream the output. -type ChunkedResponse struct { - dec *json.Decoder - duplex *duplexReader - buf bytes.Buffer -} - -// NewChunkedResponse reads a stream and produces responses from the stream. -func NewChunkedResponse(r io.Reader) *ChunkedResponse { - resp := &ChunkedResponse{} - resp.duplex = &duplexReader{r: r, w: &resp.buf} - resp.dec = json.NewDecoder(resp.duplex) - resp.dec.UseNumber() - return resp -} - -// NextResponse reads the next line of the stream and returns a response. -func (r *ChunkedResponse) NextResponse() (*Response, error) { - var response Response - - if err := r.dec.Decode(&response); err != nil { - if err == io.EOF { - return nil, nil - } - // A decoding error happened. This probably means the server crashed - // and sent a last-ditch error message to us. Ensure we have read the - // entirety of the connection to get any remaining error text. - io.Copy(ioutil.Discard, r.duplex) - return nil, errors.New(strings.TrimSpace(r.buf.String())) - } - - r.buf.Reset() - return &response, nil -} diff --git a/vendor/github.com/influxdata/influxdb/client/v2/udp.go b/vendor/github.com/influxdata/influxdb/client/v2/udp.go deleted file mode 100644 index 779a28b33f34..000000000000 --- a/vendor/github.com/influxdata/influxdb/client/v2/udp.go +++ /dev/null @@ -1,112 +0,0 @@ -package client - -import ( - "fmt" - "io" - "net" - "time" -) - -const ( - // UDPPayloadSize is a reasonable default payload size for UDP packets that - // could be travelling over the internet. - UDPPayloadSize = 512 -) - -// UDPConfig is the config data needed to create a UDP Client. -type UDPConfig struct { - // Addr should be of the form "host:port" - // or "[ipv6-host%zone]:port". - Addr string - - // PayloadSize is the maximum size of a UDP client message, optional - // Tune this based on your network. Defaults to UDPPayloadSize. - PayloadSize int -} - -// NewUDPClient returns a client interface for writing to an InfluxDB UDP -// service from the given config. -func NewUDPClient(conf UDPConfig) (Client, error) { - var udpAddr *net.UDPAddr - udpAddr, err := net.ResolveUDPAddr("udp", conf.Addr) - if err != nil { - return nil, err - } - - conn, err := net.DialUDP("udp", nil, udpAddr) - if err != nil { - return nil, err - } - - payloadSize := conf.PayloadSize - if payloadSize == 0 { - payloadSize = UDPPayloadSize - } - - return &udpclient{ - conn: conn, - payloadSize: payloadSize, - }, nil -} - -// Close releases the udpclient's resources. -func (uc *udpclient) Close() error { - return uc.conn.Close() -} - -type udpclient struct { - conn io.WriteCloser - payloadSize int -} - -func (uc *udpclient) Write(bp BatchPoints) error { - var b = make([]byte, 0, uc.payloadSize) // initial buffer size, it will grow as needed - var d, _ = time.ParseDuration("1" + bp.Precision()) - - var delayedError error - - var checkBuffer = func(n int) { - if len(b) > 0 && len(b)+n > uc.payloadSize { - if _, err := uc.conn.Write(b); err != nil { - delayedError = err - } - b = b[:0] - } - } - - for _, p := range bp.Points() { - p.pt.Round(d) - pointSize := p.pt.StringSize() + 1 // include newline in size - //point := p.pt.RoundedString(d) + "\n" - - checkBuffer(pointSize) - - if p.Time().IsZero() || pointSize <= uc.payloadSize { - b = p.pt.AppendString(b) - b = append(b, '\n') - continue - } - - points := p.pt.Split(uc.payloadSize - 1) // account for newline character - for _, sp := range points { - checkBuffer(sp.StringSize() + 1) - b = sp.AppendString(b) - b = append(b, '\n') - } - } - - if len(b) > 0 { - if _, err := uc.conn.Write(b); err != nil { - return err - } - } - return delayedError -} - -func (uc *udpclient) Query(q Query) (*Response, error) { - return nil, fmt.Errorf("Querying via UDP is not supported") -} - -func (uc *udpclient) Ping(timeout time.Duration) (time.Duration, string, error) { - return 0, "", nil -} diff --git a/vendor/github.com/karalabe/hid/LICENSE.md b/vendor/github.com/karalabe/hid/LICENSE.md deleted file mode 100644 index 230d1daeb619..000000000000 --- a/vendor/github.com/karalabe/hid/LICENSE.md +++ /dev/null @@ -1,8 +0,0 @@ -The components of `hid` are licensed as such: - - * `hidapi` is released under the [3-clause BSD](https://github.com/signal11/hidapi/blob/master/LICENSE-bsd.txt) license. - * `libusb` is released under the [GNU LGPL 2.1](https://github.com/libusb/libusb/blob/master/COPYING)license. - * `go.hid` is released under the [2-clause BSD](https://github.com/GeertJohan/go.hid/blob/master/LICENSE) license. - * `gowchar` is released under the [3-clause BSD](https://github.com/orofarne/gowchar/blob/master/LICENSE) license. - -Given the above, `hid` is licensed under GNU LGPL 2.1 or later on Linux and 3-clause BSD on other platforms. diff --git a/vendor/github.com/karalabe/hid/README.md b/vendor/github.com/karalabe/hid/README.md deleted file mode 100644 index 2851ffe4200f..000000000000 --- a/vendor/github.com/karalabe/hid/README.md +++ /dev/null @@ -1,53 +0,0 @@ -[![Travis][travisimg]][travisurl] -[![AppVeyor][appveyorimg]][appveyorurl] -[![GoDoc][docimg]][docurl] - -[travisimg]: https://travis-ci.org/karalabe/hid.svg?branch=master -[travisurl]: https://travis-ci.org/karalabe/hid -[appveyorimg]: https://ci.appveyor.com/api/projects/status/plroy54odykb0ch3/branch/master?svg=true -[appveyorurl]: https://ci.appveyor.com/project/karalabe/hid -[docimg]: https://godoc.org/github.com/karalabe/hid?status.svg -[docurl]: https://godoc.org/github.com/karalabe/hid - -# Gopher Interface Devices (USB HID) - -The `hid` package is a cross platform library for accessing and communicating with USB Human Interface -Devices (HID). It is an alternative package to [`gousb`](https://github.com/karalabe/gousb) for use -cases where devices support this ligher mode of operation (e.g. input devices, hardware crypto wallets). - -The package wraps [`hidapi`](https://github.com/signal11/hidapi) for accessing OS specific USB HID APIs -directly instead of using low level USB constructs, which might have permission issues on some platforms. -On Linux the package also wraps [`libusb`](https://github.com/libusb/libusb). Both of these dependencies -are vendored directly into the repository and wrapped using CGO, making the `hid` package self-contained -and go-gettable. - -Supported platforms at the moment are Linux, macOS and Windows (exclude constraints are also specified -for Android and iOS to allow smoother vendoring into cross platform projects). - -## Cross-compiling - -Using `go get` the embedded C library is compiled into the binary format of your host OS. Cross compiling to a different platform or architecture entails disabling CGO by default in Go, causing device enumeration `hid.Enumerate()` to yield no results. - -To cross compile a functional version of this library, you'll need to enable CGO during cross compilation via `CGO_ENABLED=1` and you'll need to install and set a cross compilation enabled C toolkit via `CC=your-cross-gcc`. - -## Acknowledgements - -Although the `hid` package is an implementation from scratch, it was heavily inspired by the existing -[`go.hid`](https://github.com/GeertJohan/go.hid) library, which seems abandoned since 2015; is incompatible -with Go 1.6+; and has various external dependencies. Given its inspirational roots, I thought it important -to give credit to the author of said package too. - -Wide character support in the `hid` package is done via the [`gowchar`](https://github.com/orofarne/gowchar) -library, unmaintained since 2013; non buildable with a modern Go release and failing `go vet` checks. As -such, `gowchar` was also vendored in inline (copyright headers and origins preserved). - -## License - -The components of `hid` are licensed as such: - - * `hidapi` is released under the [3-clause BSD](https://github.com/signal11/hidapi/blob/master/LICENSE-bsd.txt) license. - * `libusb` is released under the [GNU LGPL 2.1](https://github.com/libusb/libusb/blob/master/COPYING)license. - * `go.hid` is released under the [2-clause BSD](https://github.com/GeertJohan/go.hid/blob/master/LICENSE) license. - * `gowchar` is released under the [3-clause BSD](https://github.com/orofarne/gowchar/blob/master/LICENSE) license. - -Given the above, `hid` is licensed under GNU LGPL 2.1 or later on Linux and 3-clause BSD on other platforms. diff --git a/vendor/github.com/karalabe/hid/appveyor.yml b/vendor/github.com/karalabe/hid/appveyor.yml deleted file mode 100644 index f43958747c86..000000000000 --- a/vendor/github.com/karalabe/hid/appveyor.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: Visual Studio 2015 - -# Clone directly into GOPATH. -clone_folder: C:\gopath\src\github.com\karalabe\hid -clone_depth: 1 -version: "{branch}.{build}" -environment: - global: - GOPATH: C:\gopath - CC: gcc.exe - matrix: - - GOARCH: amd64 - MSYS2_ARCH: x86_64 - MSYS2_BITS: 64 - MSYSTEM: MINGW64 - PATH: C:\msys64\mingw64\bin\;%PATH% - - GOARCH: 386 - MSYS2_ARCH: i686 - MSYS2_BITS: 32 - MSYSTEM: MINGW32 - PATH: C:\msys64\mingw32\bin\;%PATH% - -install: - - rmdir C:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go1.8.windows-%GOARCH%.zip - - 7z x go1.8.windows-%GOARCH%.zip -y -oC:\ > NUL - - go version - - gcc --version - -build_script: - - go install ./... - - go test -v ./... diff --git a/vendor/github.com/karalabe/hid/hid.go b/vendor/github.com/karalabe/hid/hid.go deleted file mode 100644 index 60a40b8c24af..000000000000 --- a/vendor/github.com/karalabe/hid/hid.go +++ /dev/null @@ -1,37 +0,0 @@ -// hid - Gopher Interface Devices (USB HID) -// Copyright (c) 2017 Péter Szilágyi. All rights reserved. -// -// This file is released under the 3-clause BSD license. Note however that Linux -// support depends on libusb, released under GNU LGPL 2.1 or later. - -// Package hid provides an interface for USB HID devices. -package hid - -import "errors" - -// ErrDeviceClosed is returned for operations where the device closed before or -// during the execution. -var ErrDeviceClosed = errors.New("hid: device closed") - -// ErrUnsupportedPlatform is returned for all operations where the underlying -// operating system is not supported by the library. -var ErrUnsupportedPlatform = errors.New("hid: unsupported platform") - -// DeviceInfo is a hidapi info structure. -type DeviceInfo struct { - Path string // Platform-specific device path - VendorID uint16 // Device Vendor ID - ProductID uint16 // Device Product ID - Release uint16 // Device Release Number in binary-coded decimal, also known as Device Version Number - Serial string // Serial Number - Manufacturer string // Manufacturer String - Product string // Product string - UsagePage uint16 // Usage Page for this Device/Interface (Windows/Mac only) - Usage uint16 // Usage for this Device/Interface (Windows/Mac only) - - // The USB interface which this logical device - // represents. Valid on both Linux implementations - // in all cases, and valid on the Windows implementation - // only if the device contains more than one interface. - Interface int -} diff --git a/vendor/github.com/karalabe/hid/hid_disabled.go b/vendor/github.com/karalabe/hid/hid_disabled.go deleted file mode 100644 index 1f4026379175..000000000000 --- a/vendor/github.com/karalabe/hid/hid_disabled.go +++ /dev/null @@ -1,51 +0,0 @@ -// hid - Gopher Interface Devices (USB HID) -// Copyright (c) 2017 Péter Szilágyi. All rights reserved. -// -// This file is released under the 3-clause BSD license. Note however that Linux -// support depends on libusb, released under GNU LGPL 2.1 or later. - -// +build !linux,!darwin,!windows ios !cgo - -package hid - -// Supported returns whether this platform is supported by the HID library or not. -// The goal of this method is to allow programatically handling platforms that do -// not support USB HID and not having to fall back to build constraints. -func Supported() bool { - return false -} - -// Enumerate returns a list of all the HID devices attached to the system which -// match the vendor and product id. On platforms that this file implements the -// function is a noop and returns an empty list always. -func Enumerate(vendorID uint16, productID uint16) []DeviceInfo { - return nil -} - -// Device is a live HID USB connected device handle. On platforms that this file -// implements the type lacks the actual HID device and all methods are noop. -type Device struct { - DeviceInfo // Embed the infos for easier access -} - -// Open connects to an HID device by its path name. On platforms that this file -// implements the method just returns an error. -func (info DeviceInfo) Open() (*Device, error) { - return nil, ErrUnsupportedPlatform -} - -// Close releases the HID USB device handle. On platforms that this file implements -// the method is just a noop. -func (dev *Device) Close() {} - -// Write sends an output report to a HID device. On platforms that this file -// implements the method just returns an error. -func (dev *Device) Write(b []byte) (int, error) { - return 0, ErrUnsupportedPlatform -} - -// Read retrieves an input report from a HID device. On platforms that this file -// implements the method just returns an error. -func (dev *Device) Read(b []byte) (int, error) { - return 0, ErrUnsupportedPlatform -} diff --git a/vendor/github.com/karalabe/hid/hid_enabled.go b/vendor/github.com/karalabe/hid/hid_enabled.go deleted file mode 100644 index 419273be6a3d..000000000000 --- a/vendor/github.com/karalabe/hid/hid_enabled.go +++ /dev/null @@ -1,228 +0,0 @@ -// hid - Gopher Interface Devices (USB HID) -// Copyright (c) 2017 Péter Szilágyi. All rights reserved. -// -// This file is released under the 3-clause BSD license. Note however that Linux -// support depends on libusb, released under LGNU GPL 2.1 or later. - -// +build linux,cgo darwin,!ios,cgo windows,cgo - -package hid - -/* -#cgo CFLAGS: -I./hidapi/hidapi - -#cgo linux CFLAGS: -I./libusb/libusb -DDEFAULT_VISIBILITY="" -DOS_LINUX -D_GNU_SOURCE -DPOLL_NFDS_TYPE=int -#cgo linux,!android LDFLAGS: -lrt -#cgo darwin CFLAGS: -DOS_DARWIN -#cgo darwin LDFLAGS: -framework CoreFoundation -framework IOKit -#cgo windows CFLAGS: -DOS_WINDOWS -#cgo windows LDFLAGS: -lsetupapi - -#ifdef OS_LINUX - #include - #include "os/threads_posix.c" - #include "os/poll_posix.c" - - #include "os/linux_usbfs.c" - #include "os/linux_netlink.c" - - #include "core.c" - #include "descriptor.c" - #include "hotplug.c" - #include "io.c" - #include "strerror.c" - #include "sync.c" - - #include "hidapi/libusb/hid.c" -#elif OS_DARWIN - #include "hidapi/mac/hid.c" -#elif OS_WINDOWS - #include "hidapi/windows/hid.c" -#endif -*/ -import "C" -import ( - "errors" - "runtime" - "sync" - "unsafe" -) - -// enumerateLock is a mutex serializing access to USB device enumeration needed -// by the macOS USB HID system calls, which require 2 consecutive method calls -// for enumeration, causing crashes if called concurrently. -// -// For more details, see: -// https://developer.apple.com/documentation/iokit/1438371-iohidmanagersetdevicematching -// > "subsequent calls will cause the hid manager to release previously enumerated devices" -var enumerateLock sync.Mutex - -func init() { - // Initialize the HIDAPI library - C.hid_init() -} - -// Supported returns whether this platform is supported by the HID library or not. -// The goal of this method is to allow programatically handling platforms that do -// not support USB HID and not having to fall back to build constraints. -func Supported() bool { - return true -} - -// Enumerate returns a list of all the HID devices attached to the system which -// match the vendor and product id: -// - If the vendor id is set to 0 then any vendor matches. -// - If the product id is set to 0 then any product matches. -// - If the vendor and product id are both 0, all HID devices are returned. -func Enumerate(vendorID uint16, productID uint16) []DeviceInfo { - enumerateLock.Lock() - defer enumerateLock.Unlock() - - // Gather all device infos and ensure they are freed before returning - head := C.hid_enumerate(C.ushort(vendorID), C.ushort(productID)) - if head == nil { - return nil - } - defer C.hid_free_enumeration(head) - - // Iterate the list and retrieve the device details - var infos []DeviceInfo - for ; head != nil; head = head.next { - info := DeviceInfo{ - Path: C.GoString(head.path), - VendorID: uint16(head.vendor_id), - ProductID: uint16(head.product_id), - Release: uint16(head.release_number), - UsagePage: uint16(head.usage_page), - Usage: uint16(head.usage), - Interface: int(head.interface_number), - } - if head.serial_number != nil { - info.Serial, _ = wcharTToString(head.serial_number) - } - if head.product_string != nil { - info.Product, _ = wcharTToString(head.product_string) - } - if head.manufacturer_string != nil { - info.Manufacturer, _ = wcharTToString(head.manufacturer_string) - } - infos = append(infos, info) - } - return infos -} - -// Open connects to an HID device by its path name. -func (info DeviceInfo) Open() (*Device, error) { - path := C.CString(info.Path) - defer C.free(unsafe.Pointer(path)) - - device := C.hid_open_path(path) - if device == nil { - return nil, errors.New("hidapi: failed to open device") - } - return &Device{ - DeviceInfo: info, - device: device, - }, nil -} - -// Device is a live HID USB connected device handle. -type Device struct { - DeviceInfo // Embed the infos for easier access - - device *C.hid_device // Low level HID device to communicate through - lock sync.Mutex -} - -// Close releases the HID USB device handle. -func (dev *Device) Close() { - dev.lock.Lock() - defer dev.lock.Unlock() - - if dev.device != nil { - C.hid_close(dev.device) - dev.device = nil - } -} - -// Write sends an output report to a HID device. -// -// Write will send the data on the first OUT endpoint, if one exists. If it does -// not, it will send the data through the Control Endpoint (Endpoint 0). -func (dev *Device) Write(b []byte) (int, error) { - // Abort if nothing to write - if len(b) == 0 { - return 0, nil - } - // Abort if device closed in between - dev.lock.Lock() - device := dev.device - dev.lock.Unlock() - - if device == nil { - return 0, ErrDeviceClosed - } - // Prepend a HID report ID on Windows, other OSes don't need it - var report []byte - if runtime.GOOS == "windows" { - report = append([]byte{0x00}, b...) - } else { - report = b - } - // Execute the write operation - written := int(C.hid_write(device, (*C.uchar)(&report[0]), C.size_t(len(report)))) - if written == -1 { - // If the write failed, verify if closed or other error - dev.lock.Lock() - device = dev.device - dev.lock.Unlock() - - if device == nil { - return 0, ErrDeviceClosed - } - // Device not closed, some other error occurred - message := C.hid_error(device) - if message == nil { - return 0, errors.New("hidapi: unknown failure") - } - failure, _ := wcharTToString(message) - return 0, errors.New("hidapi: " + failure) - } - return written, nil -} - -// Read retrieves an input report from a HID device. -func (dev *Device) Read(b []byte) (int, error) { - // Aborth if nothing to read - if len(b) == 0 { - return 0, nil - } - // Abort if device closed in between - dev.lock.Lock() - device := dev.device - dev.lock.Unlock() - - if device == nil { - return 0, ErrDeviceClosed - } - // Execute the read operation - read := int(C.hid_read(device, (*C.uchar)(&b[0]), C.size_t(len(b)))) - if read == -1 { - // If the read failed, verify if closed or other error - dev.lock.Lock() - device = dev.device - dev.lock.Unlock() - - if device == nil { - return 0, ErrDeviceClosed - } - // Device not closed, some other error occurred - message := C.hid_error(device) - if message == nil { - return 0, errors.New("hidapi: unknown failure") - } - failure, _ := wcharTToString(message) - return 0, errors.New("hidapi: " + failure) - } - return read, nil -} diff --git a/vendor/github.com/karalabe/hid/libusb/AUTHORS b/vendor/github.com/karalabe/hid/libusb/AUTHORS deleted file mode 100644 index 70d407bd19f9..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/AUTHORS +++ /dev/null @@ -1,89 +0,0 @@ -Copyright © 2001 Johannes Erdfelt -Copyright © 2007-2009 Daniel Drake -Copyright © 2010-2012 Peter Stuge -Copyright © 2008-2016 Nathan Hjelm -Copyright © 2009-2013 Pete Batard -Copyright © 2009-2013 Ludovic Rousseau -Copyright © 2010-2012 Michael Plante -Copyright © 2011-2013 Hans de Goede -Copyright © 2012-2013 Martin Pieuchot -Copyright © 2012-2013 Toby Gray -Copyright © 2013-2015 Chris Dickens - -Other contributors: -Akshay Jaggi -Alan Ott -Alan Stern -Alex Vatchenko -Andrew Fernandes -Anthony Clay -Antonio Ospite -Artem Egorkine -Aurelien Jarno -Bastien Nocera -Bei Zhang -Benjamin Dobell -Carl Karsten -Colin Walters -Dave Camarillo -David Engraf -David Moore -Davidlohr Bueso -Federico Manzan -Felipe Balbi -Florian Albrechtskirchinger -Francesco Montorsi -Francisco Facioni -Gaurav Gupta -Graeme Gill -Gustavo Zacarias -Hans Ulrich Niedermann -Hector Martin -Hoi-Ho Chan -Ilya Konstantinov -James Hanko -John Sheu -Joshua Blake -Justin Bischoff -Karsten Koenig -Konrad Rzepecki -Kuangye Guo -Lars Kanis -Lars Wirzenius -Luca Longinotti -Marcus Meissner -Markus Heidelberg -Martin Ettl -Martin Koegler -Matthias Bolte -Mike Frysinger -Mikhail Gusarov -Moritz Fischer -Ларионов Даниил -Nicholas Corgan -Omri Iluz -Orin Eman -Paul Fertser -Pekka Nikander -Rob Walker -Sean McBride -Sebastian Pipping -Simon Haggett -Simon Newton -Thomas Röfer -Tim Hutt -Tim Roberts -Tobias Klauser -Toby Peterson -Tormod Volden -Trygve Laugstøl -Uri Lublin -Vasily Khoruzhick -Vegard Storheil Eriksen -Venkatesh Shukla -Vitali Lovich -Xiaofan Chen -Zoltán Kovács -Роман Донченко -parafin -xantares diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.h b/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.h deleted file mode 100644 index 2bec81b06c42..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ -/* - * Hotplug support for libusb - * Copyright © 2012-2013 Nathan Hjelm - * Copyright © 2012-2013 Peter Stuge - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#if !defined(USBI_HOTPLUG_H) -#define USBI_HOTPLUG_H - -#ifndef LIBUSBI_H -#include "libusbi.h" -#endif - -/** \ingroup hotplug - * The hotplug callback structure. The user populates this structure with - * libusb_hotplug_prepare_callback() and then calls libusb_hotplug_register_callback() - * to receive notification of hotplug events. - */ -struct libusb_hotplug_callback { - /** Context this callback is associated with */ - struct libusb_context *ctx; - - /** Vendor ID to match or LIBUSB_HOTPLUG_MATCH_ANY */ - int vendor_id; - - /** Product ID to match or LIBUSB_HOTPLUG_MATCH_ANY */ - int product_id; - - /** Device class to match or LIBUSB_HOTPLUG_MATCH_ANY */ - int dev_class; - - /** Hotplug callback flags */ - libusb_hotplug_flag flags; - - /** Event(s) that will trigger this callback */ - libusb_hotplug_event events; - - /** Callback function to invoke for matching event/device */ - libusb_hotplug_callback_fn cb; - - /** Handle for this callback (used to match on deregister) */ - libusb_hotplug_callback_handle handle; - - /** User data that will be passed to the callback function */ - void *user_data; - - /** Callback is marked for deletion */ - int needs_free; - - /** List this callback is registered in (ctx->hotplug_cbs) */ - struct list_head list; -}; - -typedef struct libusb_hotplug_callback libusb_hotplug_callback; - -struct libusb_hotplug_message { - /** The hotplug event that occurred */ - libusb_hotplug_event event; - - /** The device for which this hotplug event occurred */ - struct libusb_device *device; - - /** List this message is contained in (ctx->hotplug_msgs) */ - struct list_head list; -}; - -typedef struct libusb_hotplug_message libusb_hotplug_message; - -void usbi_hotplug_deregister_all(struct libusb_context *ctx); -void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, - libusb_hotplug_event event); -void usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev, - libusb_hotplug_event event); - -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.h deleted file mode 100644 index 118043421a3a..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * darwin backend for libusb 1.0 - * Copyright © 2008-2015 Nathan Hjelm - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#if !defined(LIBUSB_DARWIN_H) -#define LIBUSB_DARWIN_H - -#include "libusbi.h" - -#include -#include -#include -#include - -/* IOUSBInterfaceInferface */ -#if defined (kIOUSBInterfaceInterfaceID700) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 - -#define usb_interface_t IOUSBInterfaceInterface700 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID700 -#define InterfaceVersion 700 - -#elif defined (kIOUSBInterfaceInterfaceID550) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 - -#define usb_interface_t IOUSBInterfaceInterface550 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID550 -#define InterfaceVersion 550 - -#elif defined (kIOUSBInterfaceInterfaceID500) - -#define usb_interface_t IOUSBInterfaceInterface500 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID500 -#define InterfaceVersion 500 - -#elif defined (kIOUSBInterfaceInterfaceID300) - -#define usb_interface_t IOUSBInterfaceInterface300 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300 -#define InterfaceVersion 300 - -#elif defined (kIOUSBInterfaceInterfaceID245) - -#define usb_interface_t IOUSBInterfaceInterface245 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245 -#define InterfaceVersion 245 - -#elif defined (kIOUSBInterfaceInterfaceID220) - -#define usb_interface_t IOUSBInterfaceInterface220 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220 -#define InterfaceVersion 220 - -#else - -#error "IOUSBFamily is too old. Please upgrade your OS" - -#endif - -/* IOUSBDeviceInterface */ -#if defined (kIOUSBDeviceInterfaceID500) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 - -#define usb_device_t IOUSBDeviceInterface500 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID500 -#define DeviceVersion 500 - -#elif defined (kIOUSBDeviceInterfaceID320) - -#define usb_device_t IOUSBDeviceInterface320 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID320 -#define DeviceVersion 320 - -#elif defined (kIOUSBDeviceInterfaceID300) - -#define usb_device_t IOUSBDeviceInterface300 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID300 -#define DeviceVersion 300 - -#elif defined (kIOUSBDeviceInterfaceID245) - -#define usb_device_t IOUSBDeviceInterface245 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID245 -#define DeviceVersion 245 - -#elif defined (kIOUSBDeviceInterfaceID220) -#define usb_device_t IOUSBDeviceInterface197 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID197 -#define DeviceVersion 197 - -#else - -#error "IOUSBFamily is too old. Please upgrade your OS" - -#endif - -#if !defined(IO_OBJECT_NULL) -#define IO_OBJECT_NULL ((io_object_t) 0) -#endif - -typedef IOCFPlugInInterface *io_cf_plugin_ref_t; -typedef IONotificationPortRef io_notification_port_t; - -/* private structures */ -struct darwin_cached_device { - struct list_head list; - IOUSBDeviceDescriptor dev_descriptor; - UInt32 location; - UInt64 parent_session; - UInt64 session; - UInt16 address; - char sys_path[21]; - usb_device_t **device; - int open_count; - UInt8 first_config, active_config, port; - int can_enumerate; - int refcount; -}; - -struct darwin_device_priv { - struct darwin_cached_device *dev; -}; - -struct darwin_device_handle_priv { - int is_open; - CFRunLoopSourceRef cfSource; - - struct darwin_interface { - usb_interface_t **interface; - uint8_t num_endpoints; - CFRunLoopSourceRef cfSource; - uint64_t frames[256]; - uint8_t endpoint_addrs[USB_MAXENDPOINTS]; - } interfaces[USB_MAXINTERFACES]; -}; - -struct darwin_transfer_priv { - /* Isoc */ - IOUSBIsocFrame *isoc_framelist; - int num_iso_packets; - - /* Control */ - IOUSBDevRequestTO req; - - /* Bulk */ - - /* Completion status */ - IOReturn result; - UInt32 size; -}; - -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.c deleted file mode 100644 index e2f55a57a140..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * poll_posix: poll compatibility wrapper for POSIX systems - * Copyright © 2013 RealVNC Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -#include -#include -#include -#include - -#include "libusbi.h" - -int usbi_pipe(int pipefd[2]) -{ - int ret = pipe(pipefd); - if (ret != 0) { - return ret; - } - ret = fcntl(pipefd[1], F_GETFL); - if (ret == -1) { - usbi_dbg("Failed to get pipe fd flags: %d", errno); - goto err_close_pipe; - } - ret = fcntl(pipefd[1], F_SETFL, ret | O_NONBLOCK); - if (ret != 0) { - usbi_dbg("Failed to set non-blocking on new pipe: %d", errno); - goto err_close_pipe; - } - - return 0; - -err_close_pipe: - usbi_close(pipefd[0]); - usbi_close(pipefd[1]); - return ret; -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.c deleted file mode 100644 index 982560751217..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.c +++ /dev/null @@ -1,728 +0,0 @@ -/* - * poll_windows: poll compatibility wrapper for Windows - * Copyright © 2012-2013 RealVNC Ltd. - * Copyright © 2009-2010 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -/* - * poll() and pipe() Windows compatibility layer for libusb 1.0 - * - * The way this layer works is by using OVERLAPPED with async I/O transfers, as - * OVERLAPPED have an associated event which is flagged for I/O completion. - * - * For USB pollable async I/O, you would typically: - * - obtain a Windows HANDLE to a file or device that has been opened in - * OVERLAPPED mode - * - call usbi_create_fd with this handle to obtain a custom fd. - * Note that if you need simultaneous R/W access, you need to call create_fd - * twice, once in RW_READ and once in RW_WRITE mode to obtain 2 separate - * pollable fds - * - leave the core functions call the poll routine and flag POLLIN/POLLOUT - * - * The pipe pollable synchronous I/O works using the overlapped event associated - * with a fake pipe. The read/write functions are only meant to be used in that - * context. - */ -#include - -#include -#include -#include - -#include "libusbi.h" - -// Uncomment to debug the polling layer -//#define DEBUG_POLL_WINDOWS -#if defined(DEBUG_POLL_WINDOWS) -#define poll_dbg usbi_dbg -#else -// MSVC++ < 2005 cannot use a variadic argument and non MSVC -// compilers produce warnings if parenthesis are omitted. -#if defined(_MSC_VER) && (_MSC_VER < 1400) -#define poll_dbg -#else -#define poll_dbg(...) -#endif -#endif - -#if defined(_PREFAST_) -#pragma warning(disable:28719) -#endif - -#define CHECK_INIT_POLLING do {if(!is_polling_set) init_polling();} while(0) - -// public fd data -const struct winfd INVALID_WINFD = {-1, INVALID_HANDLE_VALUE, NULL, NULL, NULL, RW_NONE}; -struct winfd poll_fd[MAX_FDS]; -// internal fd data -struct { - CRITICAL_SECTION mutex; // lock for fds - // Additional variables for XP CancelIoEx partial emulation - HANDLE original_handle; - DWORD thread_id; -} _poll_fd[MAX_FDS]; - -// globals -BOOLEAN is_polling_set = FALSE; -LONG pipe_number = 0; -static volatile LONG compat_spinlock = 0; - -#if !defined(_WIN32_WCE) -// CancelIoEx, available on Vista and later only, provides the ability to cancel -// a single transfer (OVERLAPPED) when used. As it may not be part of any of the -// platform headers, we hook into the Kernel32 system DLL directly to seek it. -static BOOL (__stdcall *pCancelIoEx)(HANDLE, LPOVERLAPPED) = NULL; -#define Use_Duplicate_Handles (pCancelIoEx == NULL) - -static inline void setup_cancel_io(void) -{ - HMODULE hKernel32 = GetModuleHandleA("KERNEL32"); - if (hKernel32 != NULL) { - pCancelIoEx = (BOOL (__stdcall *)(HANDLE,LPOVERLAPPED)) - GetProcAddress(hKernel32, "CancelIoEx"); - } - usbi_dbg("Will use CancelIo%s for I/O cancellation", - Use_Duplicate_Handles?"":"Ex"); -} - -static inline BOOL cancel_io(int _index) -{ - if ((_index < 0) || (_index >= MAX_FDS)) { - return FALSE; - } - - if ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE) - || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) { - return TRUE; - } - if (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) { - // Cancel outstanding transfer via the specific callback - (*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer); - return TRUE; - } - if (pCancelIoEx != NULL) { - return (*pCancelIoEx)(poll_fd[_index].handle, poll_fd[_index].overlapped); - } - if (_poll_fd[_index].thread_id == GetCurrentThreadId()) { - return CancelIo(poll_fd[_index].handle); - } - usbi_warn(NULL, "Unable to cancel I/O that was started from another thread"); - return FALSE; -} -#else -#define Use_Duplicate_Handles FALSE - -static __inline void setup_cancel_io() -{ - // No setup needed on WinCE -} - -static __inline BOOL cancel_io(int _index) -{ - if ((_index < 0) || (_index >= MAX_FDS)) { - return FALSE; - } - if ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE) - || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) { - return TRUE; - } - if (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) { - // Cancel outstanding transfer via the specific callback - (*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer); - } - return TRUE; -} -#endif - -// Init -void init_polling(void) -{ - int i; - - while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { - SleepEx(0, TRUE); - } - if (!is_polling_set) { - setup_cancel_io(); - for (i=0; ihEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if(overlapped->hEvent == NULL) { - free (overlapped); - return NULL; - } - return overlapped; -} - -static void free_overlapped(OVERLAPPED *overlapped) -{ - if (overlapped == NULL) - return; - - if ( (overlapped->hEvent != 0) - && (overlapped->hEvent != INVALID_HANDLE_VALUE) ) { - CloseHandle(overlapped->hEvent); - } - free(overlapped); -} - -void exit_polling(void) -{ - int i; - - while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { - SleepEx(0, TRUE); - } - if (is_polling_set) { - is_polling_set = FALSE; - - for (i=0; iInternal = STATUS_PENDING; - overlapped->InternalHigh = 0; - - for (i=0; i= 0) { - LeaveCriticalSection(&_poll_fd[i].mutex); - continue; - } - - // Use index as the unique fd number - poll_fd[i].fd = i; - // Read end of the "pipe" - filedes[0] = poll_fd[i].fd; - // We can use the same handle for both ends - filedes[1] = filedes[0]; - - poll_fd[i].handle = DUMMY_HANDLE; - poll_fd[i].overlapped = overlapped; - // There's no polling on the write end, so we just use READ for our needs - poll_fd[i].rw = RW_READ; - _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; - LeaveCriticalSection(&_poll_fd[i].mutex); - return 0; - } - } - free_overlapped(overlapped); - return -1; -} - -/* - * Create both an fd and an OVERLAPPED from an open Windows handle, so that - * it can be used with our polling function - * The handle MUST support overlapped transfers (usually requires CreateFile - * with FILE_FLAG_OVERLAPPED) - * Return a pollable file descriptor struct, or INVALID_WINFD on error - * - * Note that the fd returned by this function is a per-transfer fd, rather - * than a per-session fd and cannot be used for anything else but our - * custom functions (the fd itself points to the NUL: device) - * if you plan to do R/W on the same handle, you MUST create 2 fds: one for - * read and one for write. Using a single R/W fd is unsupported and will - * produce unexpected results - */ -struct winfd usbi_create_fd(HANDLE handle, int access_mode, struct usbi_transfer *itransfer, cancel_transfer *cancel_fn) -{ - int i; - struct winfd wfd = INVALID_WINFD; - OVERLAPPED* overlapped = NULL; - - CHECK_INIT_POLLING; - - if ((handle == 0) || (handle == INVALID_HANDLE_VALUE)) { - return INVALID_WINFD; - } - - wfd.itransfer = itransfer; - wfd.cancel_fn = cancel_fn; - - if ((access_mode != RW_READ) && (access_mode != RW_WRITE)) { - usbi_warn(NULL, "only one of RW_READ or RW_WRITE are supported. " - "If you want to poll for R/W simultaneously, create multiple fds from the same handle."); - return INVALID_WINFD; - } - if (access_mode == RW_READ) { - wfd.rw = RW_READ; - } else { - wfd.rw = RW_WRITE; - } - - overlapped = create_overlapped(); - if(overlapped == NULL) { - return INVALID_WINFD; - } - - for (i=0; i= 0) { - LeaveCriticalSection(&_poll_fd[i].mutex); - continue; - } - // Use index as the unique fd number - wfd.fd = i; - // Attempt to emulate some of the CancelIoEx behaviour on platforms - // that don't have it - if (Use_Duplicate_Handles) { - _poll_fd[i].thread_id = GetCurrentThreadId(); - if (!DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(), - &wfd.handle, 0, TRUE, DUPLICATE_SAME_ACCESS)) { - usbi_dbg("could not duplicate handle for CancelIo - using original one"); - wfd.handle = handle; - // Make sure we won't close the original handle on fd deletion then - _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; - } else { - _poll_fd[i].original_handle = handle; - } - } else { - wfd.handle = handle; - } - wfd.overlapped = overlapped; - memcpy(&poll_fd[i], &wfd, sizeof(struct winfd)); - LeaveCriticalSection(&_poll_fd[i].mutex); - return wfd; - } - } - free_overlapped(overlapped); - return INVALID_WINFD; -} - -static void _free_index(int _index) -{ - // Cancel any async IO (Don't care about the validity of our handles for this) - cancel_io(_index); - // close the duplicate handle (if we have an actual duplicate) - if (Use_Duplicate_Handles) { - if (_poll_fd[_index].original_handle != INVALID_HANDLE_VALUE) { - CloseHandle(poll_fd[_index].handle); - } - _poll_fd[_index].original_handle = INVALID_HANDLE_VALUE; - _poll_fd[_index].thread_id = 0; - } - free_overlapped(poll_fd[_index].overlapped); - poll_fd[_index] = INVALID_WINFD; -} - -/* - * Release a pollable file descriptor. - * - * Note that the associated Windows handle is not closed by this call - */ -void usbi_free_fd(struct winfd *wfd) -{ - int _index; - - CHECK_INIT_POLLING; - - _index = _fd_to_index_and_lock(wfd->fd); - if (_index < 0) { - return; - } - _free_index(_index); - *wfd = INVALID_WINFD; - LeaveCriticalSection(&_poll_fd[_index].mutex); -} - -/* - * The functions below perform various conversions between fd, handle and OVERLAPPED - */ -struct winfd fd_to_winfd(int fd) -{ - int i; - struct winfd wfd; - - CHECK_INIT_POLLING; - - if (fd < 0) - return INVALID_WINFD; - - for (i=0; i= 0) { - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - usbi_warn(NULL, "invalid fd"); - triggered = -1; - goto poll_exit; - } - - // IN or OUT must match our fd direction - if ((fds[i].events & POLLIN) && (poll_fd[_index].rw != RW_READ)) { - fds[i].revents |= POLLNVAL | POLLERR; - errno = EBADF; - usbi_warn(NULL, "attempted POLLIN on fd without READ access"); - LeaveCriticalSection(&_poll_fd[_index].mutex); - triggered = -1; - goto poll_exit; - } - - if ((fds[i].events & POLLOUT) && (poll_fd[_index].rw != RW_WRITE)) { - fds[i].revents |= POLLNVAL | POLLERR; - errno = EBADF; - usbi_warn(NULL, "attempted POLLOUT on fd without WRITE access"); - LeaveCriticalSection(&_poll_fd[_index].mutex); - triggered = -1; - goto poll_exit; - } - - // The following macro only works if overlapped I/O was reported pending - if ( (HasOverlappedIoCompleted(poll_fd[_index].overlapped)) - || (HasOverlappedIoCompletedSync(poll_fd[_index].overlapped)) ) { - poll_dbg(" completed"); - // checks above should ensure this works: - fds[i].revents = fds[i].events; - triggered++; - } else { - handles_to_wait_on[nb_handles_to_wait_on] = poll_fd[_index].overlapped->hEvent; - handle_to_index[nb_handles_to_wait_on] = i; - nb_handles_to_wait_on++; - } - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - - // If nothing was triggered, wait on all fds that require it - if ((timeout != 0) && (triggered == 0) && (nb_handles_to_wait_on != 0)) { - if (timeout < 0) { - poll_dbg("starting infinite wait for %u handles...", (unsigned int)nb_handles_to_wait_on); - } else { - poll_dbg("starting %d ms wait for %u handles...", timeout, (unsigned int)nb_handles_to_wait_on); - } - ret = WaitForMultipleObjects(nb_handles_to_wait_on, handles_to_wait_on, - FALSE, (timeout<0)?INFINITE:(DWORD)timeout); - object_index = ret-WAIT_OBJECT_0; - if ((object_index >= 0) && ((DWORD)object_index < nb_handles_to_wait_on)) { - poll_dbg(" completed after wait"); - i = handle_to_index[object_index]; - _index = _fd_to_index_and_lock(fds[i].fd); - fds[i].revents = fds[i].events; - triggered++; - if (_index >= 0) { - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - } else if (ret == WAIT_TIMEOUT) { - poll_dbg(" timed out"); - triggered = 0; // 0 = timeout - } else { - errno = EIO; - triggered = -1; // error - } - } - -poll_exit: - if (handles_to_wait_on != NULL) { - free(handles_to_wait_on); - } - if (handle_to_index != NULL) { - free(handle_to_index); - } - return triggered; -} - -/* - * close a fake pipe fd - */ -int usbi_close(int fd) -{ - int _index; - int r = -1; - - CHECK_INIT_POLLING; - - _index = _fd_to_index_and_lock(fd); - - if (_index < 0) { - errno = EBADF; - } else { - free_overlapped(poll_fd[_index].overlapped); - poll_fd[_index] = INVALID_WINFD; - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - return r; -} - -/* - * synchronous write for fake "pipe" signaling - */ -ssize_t usbi_write(int fd, const void *buf, size_t count) -{ - int _index; - UNUSED(buf); - - CHECK_INIT_POLLING; - - if (count != sizeof(unsigned char)) { - usbi_err(NULL, "this function should only used for signaling"); - return -1; - } - - _index = _fd_to_index_and_lock(fd); - - if ( (_index < 0) || (poll_fd[_index].overlapped == NULL) ) { - errno = EBADF; - if (_index >= 0) { - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - return -1; - } - - poll_dbg("set pipe event (fd = %d, thread = %08X)", _index, (unsigned int)GetCurrentThreadId()); - SetEvent(poll_fd[_index].overlapped->hEvent); - poll_fd[_index].overlapped->Internal = STATUS_WAIT_0; - // If two threads write on the pipe at the same time, we need to - // process two separate reads => use the overlapped as a counter - poll_fd[_index].overlapped->InternalHigh++; - - LeaveCriticalSection(&_poll_fd[_index].mutex); - return sizeof(unsigned char); -} - -/* - * synchronous read for fake "pipe" signaling - */ -ssize_t usbi_read(int fd, void *buf, size_t count) -{ - int _index; - ssize_t r = -1; - UNUSED(buf); - - CHECK_INIT_POLLING; - - if (count != sizeof(unsigned char)) { - usbi_err(NULL, "this function should only used for signaling"); - return -1; - } - - _index = _fd_to_index_and_lock(fd); - - if (_index < 0) { - errno = EBADF; - return -1; - } - - if (WaitForSingleObject(poll_fd[_index].overlapped->hEvent, INFINITE) != WAIT_OBJECT_0) { - usbi_warn(NULL, "waiting for event failed: %u", (unsigned int)GetLastError()); - errno = EIO; - goto out; - } - - poll_dbg("clr pipe event (fd = %d, thread = %08X)", _index, (unsigned int)GetCurrentThreadId()); - poll_fd[_index].overlapped->InternalHigh--; - // Don't reset unless we don't have any more events to process - if (poll_fd[_index].overlapped->InternalHigh <= 0) { - ResetEvent(poll_fd[_index].overlapped->hEvent); - poll_fd[_index].overlapped->Internal = STATUS_PENDING; - } - - r = sizeof(unsigned char); - -out: - LeaveCriticalSection(&_poll_fd[_index].mutex); - return r; -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.h deleted file mode 100644 index aa4c985daecd..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Windows compat: POSIX compatibility wrapper - * Copyright © 2012-2013 RealVNC Ltd. - * Copyright © 2009-2010 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ -#pragma once - -#if defined(_MSC_VER) -// disable /W4 MSVC warnings that are benign -#pragma warning(disable:4127) // conditional expression is constant -#endif - -// Handle synchronous completion through the overlapped structure -#if !defined(STATUS_REPARSE) // reuse the REPARSE status code -#define STATUS_REPARSE ((LONG)0x00000104L) -#endif -#define STATUS_COMPLETED_SYNCHRONOUSLY STATUS_REPARSE -#if defined(_WIN32_WCE) -// WinCE doesn't have a HasOverlappedIoCompleted() macro, so attempt to emulate it -#define HasOverlappedIoCompleted(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) != STATUS_PENDING) -#endif -#define HasOverlappedIoCompletedSync(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) == STATUS_COMPLETED_SYNCHRONOUSLY) - -#define DUMMY_HANDLE ((HANDLE)(LONG_PTR)-2) - -/* Windows versions */ -enum windows_version { - WINDOWS_CE = -2, - WINDOWS_UNDEFINED = -1, - WINDOWS_UNSUPPORTED = 0, - WINDOWS_XP = 0x51, - WINDOWS_2003 = 0x52, // Also XP x64 - WINDOWS_VISTA = 0x60, - WINDOWS_7 = 0x61, - WINDOWS_8 = 0x62, - WINDOWS_8_1_OR_LATER = 0x63, - WINDOWS_MAX -}; -extern int windows_version; - -#define MAX_FDS 256 - -#define POLLIN 0x0001 /* There is data to read */ -#define POLLPRI 0x0002 /* There is urgent data to read */ -#define POLLOUT 0x0004 /* Writing now will not block */ -#define POLLERR 0x0008 /* Error condition */ -#define POLLHUP 0x0010 /* Hung up */ -#define POLLNVAL 0x0020 /* Invalid request: fd not open */ - -struct pollfd { - int fd; /* file descriptor */ - short events; /* requested events */ - short revents; /* returned events */ -}; - -// access modes -enum rw_type { - RW_NONE, - RW_READ, - RW_WRITE, -}; - -// fd struct that can be used for polling on Windows -typedef int cancel_transfer(struct usbi_transfer *itransfer); - -struct winfd { - int fd; // what's exposed to libusb core - HANDLE handle; // what we need to attach overlapped to the I/O op, so we can poll it - OVERLAPPED* overlapped; // what will report our I/O status - struct usbi_transfer *itransfer; // Associated transfer, or NULL if completed - cancel_transfer *cancel_fn; // Function pointer to cancel transfer API - enum rw_type rw; // I/O transfer direction: read *XOR* write (NOT BOTH) -}; -extern const struct winfd INVALID_WINFD; - -int usbi_pipe(int pipefd[2]); -int usbi_poll(struct pollfd *fds, unsigned int nfds, int timeout); -ssize_t usbi_write(int fd, const void *buf, size_t count); -ssize_t usbi_read(int fd, void *buf, size_t count); -int usbi_close(int fd); - -void init_polling(void); -void exit_polling(void); -struct winfd usbi_create_fd(HANDLE handle, int access_mode, - struct usbi_transfer *transfer, cancel_transfer *cancel_fn); -void usbi_free_fd(struct winfd* winfd); -struct winfd fd_to_winfd(int fd); -struct winfd handle_to_winfd(HANDLE handle); -struct winfd overlapped_to_winfd(OVERLAPPED* overlapped); - -/* - * Timeval operations - */ -#if defined(DDKBUILD) -#include // defines timeval functions on DDK -#endif - -#if !defined(TIMESPEC_TO_TIMEVAL) -#define TIMESPEC_TO_TIMEVAL(tv, ts) { \ - (tv)->tv_sec = (long)(ts)->tv_sec; \ - (tv)->tv_usec = (long)(ts)->tv_nsec / 1000; \ -} -#endif -#if !defined(timersub) -#define timersub(a, b, result) \ -do { \ - (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ - if ((result)->tv_usec < 0) { \ - --(result)->tv_sec; \ - (result)->tv_usec += 1000000; \ - } \ -} while (0) -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.c deleted file mode 100644 index cb608976b642..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.c +++ /dev/null @@ -1,1292 +0,0 @@ -/* - * - * Copyright (c) 2016, Oracle and/or its affiliates. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libusbi.h" -#include "sunos_usb.h" - -/* - * Backend functions - */ -static int sunos_init(struct libusb_context *); -static void sunos_exit(void); -static int sunos_get_device_list(struct libusb_context *, - struct discovered_devs **); -static int sunos_open(struct libusb_device_handle *); -static void sunos_close(struct libusb_device_handle *); -static int sunos_get_device_descriptor(struct libusb_device *, - uint8_t*, int *); -static int sunos_get_active_config_descriptor(struct libusb_device *, - uint8_t*, size_t, int *); -static int sunos_get_config_descriptor(struct libusb_device *, uint8_t, - uint8_t*, size_t, int *); -static int sunos_get_configuration(struct libusb_device_handle *, int *); -static int sunos_set_configuration(struct libusb_device_handle *, int); -static int sunos_claim_interface(struct libusb_device_handle *, int); -static int sunos_release_interface(struct libusb_device_handle *, int); -static int sunos_set_interface_altsetting(struct libusb_device_handle *, - int, int); -static int sunos_clear_halt(struct libusb_device_handle *, uint8_t); -static int sunos_reset_device(struct libusb_device_handle *); -static void sunos_destroy_device(struct libusb_device *); -static int sunos_submit_transfer(struct usbi_transfer *); -static int sunos_cancel_transfer(struct usbi_transfer *); -static void sunos_clear_transfer_priv(struct usbi_transfer *); -static int sunos_handle_transfer_completion(struct usbi_transfer *); -static int sunos_clock_gettime(int, struct timespec *); - -/* - * Private functions - */ -static int _errno_to_libusb(int); -static int sunos_usb_get_status(int fd); - -static int sunos_init(struct libusb_context *ctx) -{ - return (LIBUSB_SUCCESS); -} - -static void sunos_exit(void) -{ - usbi_dbg(""); -} - -static int -sunos_fill_in_dev_info(di_node_t node, struct libusb_device *dev) -{ - int proplen; - int n, *addr, *port_prop; - char *phypath; - uint8_t *rdata; - struct libusb_device_descriptor *descr; - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; - - /* Device descriptors */ - proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node, - "usb-dev-descriptor", &rdata); - if (proplen <= 0) { - - return (LIBUSB_ERROR_IO); - } - - descr = (struct libusb_device_descriptor *)rdata; - bcopy(descr, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE); - dpriv->dev_descr.bcdUSB = libusb_cpu_to_le16(descr->bcdUSB); - dpriv->dev_descr.idVendor = libusb_cpu_to_le16(descr->idVendor); - dpriv->dev_descr.idProduct = libusb_cpu_to_le16(descr->idProduct); - dpriv->dev_descr.bcdDevice = libusb_cpu_to_le16(descr->bcdDevice); - - /* Raw configuration descriptors */ - proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node, - "usb-raw-cfg-descriptors", &rdata); - if (proplen <= 0) { - usbi_dbg("can't find raw config descriptors"); - - return (LIBUSB_ERROR_IO); - } - dpriv->raw_cfgdescr = calloc(1, proplen); - if (dpriv->raw_cfgdescr == NULL) { - return (LIBUSB_ERROR_NO_MEM); - } else { - bcopy(rdata, dpriv->raw_cfgdescr, proplen); - dpriv->cfgvalue = ((struct libusb_config_descriptor *) - rdata)->bConfigurationValue; - } - - n = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "reg", &port_prop); - - if ((n != 1) || (*port_prop <= 0)) { - return (LIBUSB_ERROR_IO); - } - dev->port_number = *port_prop; - - /* device physical path */ - phypath = di_devfs_path(node); - if (phypath) { - dpriv->phypath = strdup(phypath); - di_devfs_path_free(phypath); - } else { - free(dpriv->raw_cfgdescr); - - return (LIBUSB_ERROR_IO); - } - - /* address */ - n = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "assigned-address", &addr); - if (n != 1 || *addr == 0) { - usbi_dbg("can't get address"); - } else { - dev->device_address = *addr; - } - - /* speed */ - if (di_prop_exists(DDI_DEV_T_ANY, node, "low-speed") == 1) { - dev->speed = LIBUSB_SPEED_LOW; - } else if (di_prop_exists(DDI_DEV_T_ANY, node, "high-speed") == 1) { - dev->speed = LIBUSB_SPEED_HIGH; - } else if (di_prop_exists(DDI_DEV_T_ANY, node, "full-speed") == 1) { - dev->speed = LIBUSB_SPEED_FULL; - } else if (di_prop_exists(DDI_DEV_T_ANY, node, "super-speed") == 1) { - dev->speed = LIBUSB_SPEED_SUPER; - } - - usbi_dbg("vid=%x pid=%x, path=%s, bus_nmber=0x%x, port_number=%d, " - "speed=%d", dpriv->dev_descr.idVendor, dpriv->dev_descr.idProduct, - dpriv->phypath, dev->bus_number, dev->port_number, dev->speed); - - return (LIBUSB_SUCCESS); -} - - -static int -sunos_add_devices(di_devlink_t link, void *arg) -{ - struct devlink_cbarg *largs = (struct devlink_cbarg *)arg; - struct node_args *nargs; - di_node_t myself, pnode; - uint64_t session_id = 0; - uint16_t bdf = 0; - struct libusb_device *dev; - sunos_dev_priv_t *devpriv; - const char *path, *newpath; - int n, i; - int *addr_prop; - uint8_t bus_number = 0; - - nargs = (struct node_args *)largs->nargs; - myself = largs->myself; - if (nargs->last_ugenpath) { - /* the same node's links */ - return (DI_WALK_CONTINUE); - } - - /* - * Construct session ID. - * session ID = ...parent hub addr|hub addr|dev addr. - */ - pnode = myself; - i = 0; - while (pnode != DI_NODE_NIL) { - if (di_prop_exists(DDI_DEV_T_ANY, pnode, "root-hub") == 1) { - /* walk to root */ - uint32_t *regbuf = NULL; - uint32_t reg; - - n = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode, "reg", - (int **)®buf); - reg = regbuf[0]; - bdf = (PCI_REG_BUS_G(reg) << 8) | - (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg); - session_id |= (bdf << i * 8); - - /* same as 'unit-address' property */ - bus_number = - (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg); - - usbi_dbg("device bus address=%s:%x", - di_bus_addr(pnode), bus_number); - - break; - } - - /* usb_addr */ - n = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode, - "assigned-address", &addr_prop); - if ((n != 1) || (addr_prop[0] == 0)) { - usbi_dbg("cannot get valid usb_addr"); - - return (DI_WALK_CONTINUE); - } - - session_id |= ((addr_prop[0] & 0xff) << i * 8); - if (++i > 7) - break; - - pnode = di_parent_node(pnode); - } - - path = di_devlink_path(link); - dev = usbi_get_device_by_session_id(nargs->ctx, session_id); - if (dev == NULL) { - dev = usbi_alloc_device(nargs->ctx, session_id); - if (dev == NULL) { - usbi_dbg("can't alloc device"); - - return (DI_WALK_TERMINATE); - } - devpriv = (sunos_dev_priv_t *)dev->os_priv; - if ((newpath = strrchr(path, '/')) == NULL) { - libusb_unref_device(dev); - - return (DI_WALK_TERMINATE); - } - devpriv->ugenpath = strndup(path, strlen(path) - - strlen(newpath)); - dev->bus_number = bus_number; - - if (sunos_fill_in_dev_info(myself, dev) != LIBUSB_SUCCESS) { - libusb_unref_device(dev); - - return (DI_WALK_TERMINATE); - } - if (usbi_sanitize_device(dev) < 0) { - libusb_unref_device(dev); - usbi_dbg("sanatize failed: "); - return (DI_WALK_TERMINATE); - } - } else { - usbi_dbg("Dev %s exists", path); - } - - devpriv = (sunos_dev_priv_t *)dev->os_priv; - if (nargs->last_ugenpath == NULL) { - /* first device */ - nargs->last_ugenpath = devpriv->ugenpath; - - if (discovered_devs_append(*(nargs->discdevs), dev) == NULL) { - usbi_dbg("cannot append device"); - } - - /* - * we alloc and hence ref this dev. We don't need to ref it - * hereafter. Front end or app should take care of their ref. - */ - libusb_unref_device(dev); - } - - usbi_dbg("Device %s %s id=0x%llx, devcount:%d, bdf=%x", - devpriv->ugenpath, path, (uint64_t)session_id, - (*nargs->discdevs)->len, bdf); - - return (DI_WALK_CONTINUE); -} - -static int -sunos_walk_minor_node_link(di_node_t node, void *args) -{ - di_minor_t minor = DI_MINOR_NIL; - char *minor_path; - struct devlink_cbarg arg; - struct node_args *nargs = (struct node_args *)args; - di_devlink_handle_t devlink_hdl = nargs->dlink_hdl; - - /* walk each minor to find ugen devices */ - while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) { - minor_path = di_devfs_minor_path(minor); - arg.nargs = args; - arg.myself = node; - arg.minor = minor; - (void) di_devlink_walk(devlink_hdl, - "^usb/[0-9a-f]+[.][0-9a-f]+", minor_path, - DI_PRIMARY_LINK, (void *)&arg, sunos_add_devices); - di_devfs_path_free(minor_path); - } - - /* switch to a different node */ - nargs->last_ugenpath = NULL; - - return (DI_WALK_CONTINUE); -} - -int -sunos_get_device_list(struct libusb_context * ctx, - struct discovered_devs **discdevs) -{ - di_node_t root_node; - struct node_args args; - di_devlink_handle_t devlink_hdl; - - args.ctx = ctx; - args.discdevs = discdevs; - args.last_ugenpath = NULL; - if ((root_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) { - usbi_dbg("di_int() failed: %s", strerror(errno)); - return (LIBUSB_ERROR_IO); - } - - if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) { - di_fini(root_node); - usbi_dbg("di_devlink_init() failed: %s", strerror(errno)); - - return (LIBUSB_ERROR_IO); - } - args.dlink_hdl = devlink_hdl; - - /* walk each node to find USB devices */ - if (di_walk_node(root_node, DI_WALK_SIBFIRST, &args, - sunos_walk_minor_node_link) == -1) { - usbi_dbg("di_walk_node() failed: %s", strerror(errno)); - di_fini(root_node); - - return (LIBUSB_ERROR_IO); - } - - di_fini(root_node); - di_devlink_fini(&devlink_hdl); - - usbi_dbg("%d devices", (*discdevs)->len); - - return ((*discdevs)->len); -} - -static int -sunos_usb_open_ep0(sunos_dev_handle_priv_t *hpriv, sunos_dev_priv_t *dpriv) -{ - char filename[PATH_MAX + 1]; - - if (hpriv->eps[0].datafd > 0) { - - return (LIBUSB_SUCCESS); - } - snprintf(filename, PATH_MAX, "%s/cntrl0", dpriv->ugenpath); - - usbi_dbg("opening %s", filename); - hpriv->eps[0].datafd = open(filename, O_RDWR); - if (hpriv->eps[0].datafd < 0) { - return(_errno_to_libusb(errno)); - } - - snprintf(filename, PATH_MAX, "%s/cntrl0stat", dpriv->ugenpath); - hpriv->eps[0].statfd = open(filename, O_RDONLY); - if (hpriv->eps[0].statfd < 0) { - close(hpriv->eps[0].datafd); - hpriv->eps[0].datafd = -1; - - return(_errno_to_libusb(errno)); - } - - return (LIBUSB_SUCCESS); -} - -static void -sunos_usb_close_all_eps(sunos_dev_handle_priv_t *hdev) -{ - int i; - - /* not close ep0 */ - for (i = 1; i < USB_MAXENDPOINTS; i++) { - if (hdev->eps[i].datafd != -1) { - (void) close(hdev->eps[i].datafd); - hdev->eps[i].datafd = -1; - } - if (hdev->eps[i].statfd != -1) { - (void) close(hdev->eps[i].statfd); - hdev->eps[i].statfd = -1; - } - } -} - -static void -sunos_usb_close_ep0(sunos_dev_handle_priv_t *hdev, sunos_dev_priv_t *dpriv) -{ - if (hdev->eps[0].datafd >= 0) { - close(hdev->eps[0].datafd); - close(hdev->eps[0].statfd); - hdev->eps[0].datafd = -1; - hdev->eps[0].statfd = -1; - } -} - -static uchar_t -sunos_usb_ep_index(uint8_t ep_addr) -{ - return ((ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK) + - ((ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? 16 : 0)); -} - -static int -sunos_find_interface(struct libusb_device_handle *hdev, - uint8_t endpoint, uint8_t *interface) -{ - struct libusb_config_descriptor *config; - int r; - int iface_idx; - - r = libusb_get_active_config_descriptor(hdev->dev, &config); - if (r < 0) { - return (LIBUSB_ERROR_INVALID_PARAM); - } - - for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) { - const struct libusb_interface *iface = - &config->interface[iface_idx]; - int altsetting_idx; - - for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting; - altsetting_idx++) { - const struct libusb_interface_descriptor *altsetting = - &iface->altsetting[altsetting_idx]; - int ep_idx; - - for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; - ep_idx++) { - const struct libusb_endpoint_descriptor *ep = - &altsetting->endpoint[ep_idx]; - if (ep->bEndpointAddress == endpoint) { - *interface = iface_idx; - libusb_free_config_descriptor(config); - - return (LIBUSB_SUCCESS); - } - } - } - } - libusb_free_config_descriptor(config); - - return (LIBUSB_ERROR_INVALID_PARAM); -} - -static int -sunos_check_device_and_status_open(struct libusb_device_handle *hdl, - uint8_t ep_addr, int ep_type) -{ - char filename[PATH_MAX + 1], statfilename[PATH_MAX + 1]; - char cfg_num[16], alt_num[16]; - int fd, fdstat, mode; - uint8_t ifc = 0; - uint8_t ep_index; - sunos_dev_handle_priv_t *hpriv; - - usbi_dbg("open ep 0x%02x", ep_addr); - hpriv = (sunos_dev_handle_priv_t *)hdl->os_priv; - ep_index = sunos_usb_ep_index(ep_addr); - /* ep already opened */ - if ((hpriv->eps[ep_index].datafd > 0) && - (hpriv->eps[ep_index].statfd > 0)) { - usbi_dbg("ep 0x%02x already opened, return success", - ep_addr); - - return (0); - } - - if (sunos_find_interface(hdl, ep_addr, &ifc) < 0) { - usbi_dbg("can't find interface for endpoint 0x%02x", - ep_addr); - - return (LIBUSB_ERROR_ACCESS); - } - - /* create filename */ - if (hpriv->config_index > 0) { - (void) snprintf(cfg_num, sizeof (cfg_num), "cfg%d", - hpriv->config_index + 1); - } else { - bzero(cfg_num, sizeof (cfg_num)); - } - - if (hpriv->altsetting[ifc] > 0) { - (void) snprintf(alt_num, sizeof (alt_num), ".%d", - hpriv->altsetting[ifc]); - } else { - bzero(alt_num, sizeof (alt_num)); - } - - (void) snprintf(filename, PATH_MAX, "%s/%sif%d%s%s%d", - hpriv->dpriv->ugenpath, cfg_num, ifc, alt_num, - (ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? "in" : - "out", (ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK)); - (void) snprintf(statfilename, PATH_MAX, "%sstat", filename); - - /* - * for interrupt IN endpoints, we need to enable one xfer - * mode before opening the endpoint - */ - if ((ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) && - (ep_addr & LIBUSB_ENDPOINT_IN)) { - char control = USB_EP_INTR_ONE_XFER; - int count; - - /* open the status device node for the ep first RDWR */ - if ((fdstat = open(statfilename, O_RDWR)) == -1) { - usbi_dbg("can't open %s RDWR: %d", - statfilename, errno); - } else { - count = write(fdstat, &control, sizeof (control)); - if (count != 1) { - /* this should have worked */ - usbi_dbg("can't write to %s: %d", - statfilename, errno); - (void) close(fdstat); - - return (errno); - } - /* close status node and open xfer node first */ - close (fdstat); - } - } - - /* open the xfer node first in case alt needs to be changed */ - if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { - mode = O_RDWR; - } else if (ep_addr & LIBUSB_ENDPOINT_IN) { - mode = O_RDONLY; - } else { - mode = O_WRONLY; - } - - /* - * IMPORTANT: must open data xfer node first and then open stat node - * Otherwise, it will fail on multi-config or multi-altsetting devices - * with "Device Busy" error. See ugen_epxs_switch_cfg_alt() and - * ugen_epxs_check_alt_switch() in ugen driver source code. - */ - if ((fd = open(filename, mode)) == -1) { - usbi_dbg("can't open %s: %d(%s)", filename, errno, - strerror(errno)); - - return (errno); - } - /* open the status node */ - if ((fdstat = open(statfilename, O_RDONLY)) == -1) { - usbi_dbg("can't open %s: %d", statfilename, errno); - - (void) close(fd); - - return (errno); - } - - hpriv->eps[ep_index].datafd = fd; - hpriv->eps[ep_index].statfd = fdstat; - usbi_dbg("ep=0x%02x datafd=%d, statfd=%d", ep_addr, fd, fdstat); - - return (0); -} - -int -sunos_open(struct libusb_device_handle *handle) -{ - sunos_dev_handle_priv_t *hpriv; - sunos_dev_priv_t *dpriv; - int i; - int ret; - - hpriv = (sunos_dev_handle_priv_t *)handle->os_priv; - dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - hpriv->dpriv = dpriv; - - /* set all file descriptors to "closed" */ - for (i = 0; i < USB_MAXENDPOINTS; i++) { - hpriv->eps[i].datafd = -1; - hpriv->eps[i].statfd = -1; - } - - if ((ret = sunos_usb_open_ep0(hpriv, dpriv)) != LIBUSB_SUCCESS) { - usbi_dbg("fail: %d", ret); - return (ret); - } - - return (LIBUSB_SUCCESS); -} - -void -sunos_close(struct libusb_device_handle *handle) -{ - sunos_dev_handle_priv_t *hpriv; - sunos_dev_priv_t *dpriv; - - usbi_dbg(""); - if (!handle) { - return; - } - - hpriv = (sunos_dev_handle_priv_t *)handle->os_priv; - if (!hpriv) { - return; - } - dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - if (!dpriv) { - return; - } - - sunos_usb_close_all_eps(hpriv); - sunos_usb_close_ep0(hpriv, dpriv); -} - -int -sunos_get_device_descriptor(struct libusb_device *dev, uint8_t *buf, - int *host_endian) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; - - memcpy(buf, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE); - *host_endian = 0; - - return (LIBUSB_SUCCESS); -} - -int -sunos_get_active_config_descriptor(struct libusb_device *dev, - uint8_t *buf, size_t len, int *host_endian) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; - struct libusb_config_descriptor *cfg; - int proplen; - di_node_t node; - uint8_t *rdata; - - /* - * Keep raw configuration descriptors updated, in case config - * has ever been changed through setCfg. - */ - if ((node = di_init(dpriv->phypath, DINFOCPYALL)) == DI_NODE_NIL) { - usbi_dbg("di_int() failed: %s", strerror(errno)); - return (LIBUSB_ERROR_IO); - } - proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node, - "usb-raw-cfg-descriptors", &rdata); - if (proplen <= 0) { - usbi_dbg("can't find raw config descriptors"); - - return (LIBUSB_ERROR_IO); - } - dpriv->raw_cfgdescr = realloc(dpriv->raw_cfgdescr, proplen); - if (dpriv->raw_cfgdescr == NULL) { - return (LIBUSB_ERROR_NO_MEM); - } else { - bcopy(rdata, dpriv->raw_cfgdescr, proplen); - dpriv->cfgvalue = ((struct libusb_config_descriptor *) - rdata)->bConfigurationValue; - } - di_fini(node); - - cfg = (struct libusb_config_descriptor *)dpriv->raw_cfgdescr; - len = MIN(len, libusb_le16_to_cpu(cfg->wTotalLength)); - memcpy(buf, dpriv->raw_cfgdescr, len); - *host_endian = 0; - usbi_dbg("path:%s len %d", dpriv->phypath, len); - - return (len); -} - -int -sunos_get_config_descriptor(struct libusb_device *dev, uint8_t idx, - uint8_t *buf, size_t len, int *host_endian) -{ - /* XXX */ - return(sunos_get_active_config_descriptor(dev, buf, len, host_endian)); -} - -int -sunos_get_configuration(struct libusb_device_handle *handle, int *config) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - - *config = dpriv->cfgvalue; - - usbi_dbg("bConfigurationValue %d", *config); - - return (LIBUSB_SUCCESS); -} - -int -sunos_set_configuration(struct libusb_device_handle *handle, int config) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - sunos_dev_handle_priv_t *hpriv; - - usbi_dbg("bConfigurationValue %d", config); - hpriv = (sunos_dev_handle_priv_t *)handle->os_priv; - - if (dpriv->ugenpath == NULL) - return (LIBUSB_ERROR_NOT_SUPPORTED); - - if (config < 1 || config > dpriv->dev_descr.bNumConfigurations) - return (LIBUSB_ERROR_INVALID_PARAM); - - dpriv->cfgvalue = config; - hpriv->config_index = config - 1; - - return (LIBUSB_SUCCESS); -} - -int -sunos_claim_interface(struct libusb_device_handle *handle, int iface) -{ - usbi_dbg("iface %d", iface); - if (iface < 0) { - return (LIBUSB_ERROR_INVALID_PARAM); - } - - return (LIBUSB_SUCCESS); -} - -int -sunos_release_interface(struct libusb_device_handle *handle, int iface) -{ - sunos_dev_handle_priv_t *hpriv = - (sunos_dev_handle_priv_t *)handle->os_priv; - - usbi_dbg("iface %d", iface); - if (iface < 0) { - return (LIBUSB_ERROR_INVALID_PARAM); - } - - /* XXX: can we release it? */ - hpriv->altsetting[iface] = 0; - - return (LIBUSB_SUCCESS); -} - -int -sunos_set_interface_altsetting(struct libusb_device_handle *handle, int iface, - int altsetting) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - sunos_dev_handle_priv_t *hpriv = - (sunos_dev_handle_priv_t *)handle->os_priv; - - usbi_dbg("iface %d, setting %d", iface, altsetting); - - if (iface < 0 || altsetting < 0) { - return (LIBUSB_ERROR_INVALID_PARAM); - } - if (dpriv->ugenpath == NULL) - return (LIBUSB_ERROR_NOT_FOUND); - - /* XXX: can we switch altsetting? */ - hpriv->altsetting[iface] = altsetting; - - return (LIBUSB_SUCCESS); -} - -static void -usb_dump_data(unsigned char *data, size_t size) -{ - int i; - - if (getenv("LIBUSB_DEBUG") == NULL) { - return; - } - - (void) fprintf(stderr, "data dump:"); - for (i = 0; i < size; i++) { - if (i % 16 == 0) { - (void) fprintf(stderr, "\n%08x ", i); - } - (void) fprintf(stderr, "%02x ", (uchar_t)data[i]); - } - (void) fprintf(stderr, "\n"); -} - -static void -sunos_async_callback(union sigval arg) -{ - struct sunos_transfer_priv *tpriv = - (struct sunos_transfer_priv *)arg.sival_ptr; - struct libusb_transfer *xfer = tpriv->transfer; - struct aiocb *aiocb = &tpriv->aiocb; - int ret; - sunos_dev_handle_priv_t *hpriv; - uint8_t ep; - - hpriv = (sunos_dev_handle_priv_t *)xfer->dev_handle->os_priv; - ep = sunos_usb_ep_index(xfer->endpoint); - - ret = aio_error(aiocb); - if (ret != 0) { - xfer->status = sunos_usb_get_status(hpriv->eps[ep].statfd); - } else { - xfer->actual_length = - LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)->transferred = - aio_return(aiocb); - } - - usb_dump_data(xfer->buffer, xfer->actual_length); - - usbi_dbg("ret=%d, len=%d, actual_len=%d", ret, xfer->length, - xfer->actual_length); - - /* async notification */ - usbi_signal_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)); -} - -static int -sunos_do_async_io(struct libusb_transfer *transfer) -{ - int ret = -1; - struct aiocb *aiocb; - sunos_dev_handle_priv_t *hpriv; - uint8_t ep; - struct sunos_transfer_priv *tpriv; - - usbi_dbg(""); - - tpriv = usbi_transfer_get_os_priv(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer)); - hpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv; - ep = sunos_usb_ep_index(transfer->endpoint); - - tpriv->transfer = transfer; - aiocb = &tpriv->aiocb; - bzero(aiocb, sizeof (*aiocb)); - aiocb->aio_fildes = hpriv->eps[ep].datafd; - aiocb->aio_buf = transfer->buffer; - aiocb->aio_nbytes = transfer->length; - aiocb->aio_lio_opcode = - ((transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) == - LIBUSB_ENDPOINT_IN) ? LIO_READ:LIO_WRITE; - aiocb->aio_sigevent.sigev_notify = SIGEV_THREAD; - aiocb->aio_sigevent.sigev_value.sival_ptr = tpriv; - aiocb->aio_sigevent.sigev_notify_function = sunos_async_callback; - - if (aiocb->aio_lio_opcode == LIO_READ) { - ret = aio_read(aiocb); - } else { - ret = aio_write(aiocb); - } - - return (ret); -} - -/* return the number of bytes read/written */ -static int -usb_do_io(int fd, int stat_fd, char *data, size_t size, int flag, int *status) -{ - int error; - int ret = -1; - - usbi_dbg("usb_do_io(): datafd=%d statfd=%d size=0x%x flag=%s", - fd, stat_fd, size, flag? "WRITE":"READ"); - - switch (flag) { - case READ: - errno = 0; - ret = read(fd, data, size); - usb_dump_data(data, size); - break; - case WRITE: - usb_dump_data(data, size); - errno = 0; - ret = write(fd, data, size); - break; - } - - usbi_dbg("usb_do_io(): amount=%d", ret); - - if (ret < 0) { - int save_errno = errno; - - usbi_dbg("TID=%x io %s errno=%d(%s) ret=%d", pthread_self(), - flag?"WRITE":"READ", errno, strerror(errno), ret); - - /* sunos_usb_get_status will do a read and overwrite errno */ - error = sunos_usb_get_status(stat_fd); - usbi_dbg("io status=%d errno=%d(%s)", error, - save_errno, strerror(save_errno)); - - if (status) { - *status = save_errno; - } - - return (save_errno); - - } else if (status) { - *status = 0; - } - - return (ret); -} - -static int -solaris_submit_ctrl_on_default(struct libusb_transfer *transfer) -{ - int ret = -1, setup_ret; - int status; - sunos_dev_handle_priv_t *hpriv; - struct libusb_device_handle *hdl = transfer->dev_handle; - uint16_t wLength; - uint8_t *data = transfer->buffer; - - hpriv = (sunos_dev_handle_priv_t *)hdl->os_priv; - wLength = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; - - if (hpriv->eps[0].datafd == -1) { - usbi_dbg("ep0 not opened"); - - return (LIBUSB_ERROR_NOT_FOUND); - } - - if ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) { - usbi_dbg("IN request"); - ret = usb_do_io(hpriv->eps[0].datafd, - hpriv->eps[0].statfd, (char *)data, LIBUSB_CONTROL_SETUP_SIZE, - WRITE, (int *)&status); - } else { - usbi_dbg("OUT request"); - ret = usb_do_io(hpriv->eps[0].datafd, hpriv->eps[0].statfd, - transfer->buffer, transfer->length, WRITE, - (int *)&transfer->status); - } - - setup_ret = ret; - if (ret < LIBUSB_CONTROL_SETUP_SIZE) { - usbi_dbg("error sending control msg: %d", ret); - - return (LIBUSB_ERROR_IO); - } - - ret = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; - - /* Read the remaining bytes for IN request */ - if ((wLength) && ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) == - LIBUSB_ENDPOINT_IN)) { - usbi_dbg("DATA: %d", transfer->length - setup_ret); - ret = usb_do_io(hpriv->eps[0].datafd, - hpriv->eps[0].statfd, - (char *)transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, - wLength, READ, (int *)&transfer->status); - } - - if (ret >= 0) { - transfer->actual_length = ret; - LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer)->transferred = ret; - } - usbi_dbg("Done: ctrl data bytes %d", ret); - - /* sync transfer handling */ - ret = usbi_handle_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer), - transfer->status); - - return (ret); -} - -int -sunos_clear_halt(struct libusb_device_handle *handle, uint8_t endpoint) -{ - int ret; - - usbi_dbg("endpoint=0x%02x", endpoint); - - ret = libusb_control_transfer(handle, LIBUSB_ENDPOINT_OUT | - LIBUSB_RECIPIENT_ENDPOINT | LIBUSB_REQUEST_TYPE_STANDARD, - LIBUSB_REQUEST_CLEAR_FEATURE, 0, endpoint, NULL, 0, 1000); - - usbi_dbg("ret=%d", ret); - - return (ret); -} - -int -sunos_reset_device(struct libusb_device_handle *handle) -{ - usbi_dbg(""); - - return (LIBUSB_ERROR_NOT_SUPPORTED); -} - -void -sunos_destroy_device(struct libusb_device *dev) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; - - usbi_dbg(""); - - free(dpriv->raw_cfgdescr); - free(dpriv->ugenpath); - free(dpriv->phypath); -} - -int -sunos_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - struct libusb_device_handle *hdl; - int err = 0; - - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - hdl = transfer->dev_handle; - - err = sunos_check_device_and_status_open(hdl, - transfer->endpoint, transfer->type); - if (err < 0) { - - return (_errno_to_libusb(err)); - } - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - /* sync transfer */ - usbi_dbg("CTRL transfer: %d", transfer->length); - err = solaris_submit_ctrl_on_default(transfer); - break; - - case LIBUSB_TRANSFER_TYPE_BULK: - /* fallthru */ - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - if (transfer->type == LIBUSB_TRANSFER_TYPE_BULK) - usbi_dbg("BULK transfer: %d", transfer->length); - else - usbi_dbg("INTR transfer: %d", transfer->length); - err = sunos_do_async_io(transfer); - break; - - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - /* Isochronous/Stream is not supported */ - - /* fallthru */ - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) - usbi_dbg("ISOC transfer: %d", transfer->length); - else - usbi_dbg("BULK STREAM transfer: %d", transfer->length); - err = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - - return (err); -} - -int -sunos_cancel_transfer(struct usbi_transfer *itransfer) -{ - sunos_xfer_priv_t *tpriv; - sunos_dev_handle_priv_t *hpriv; - struct libusb_transfer *transfer; - struct aiocb *aiocb; - uint8_t ep; - int ret; - - tpriv = usbi_transfer_get_os_priv(itransfer); - aiocb = &tpriv->aiocb; - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - hpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv; - ep = sunos_usb_ep_index(transfer->endpoint); - - ret = aio_cancel(hpriv->eps[ep].datafd, aiocb); - - usbi_dbg("aio->fd=%d fd=%d ret = %d, %s", aiocb->aio_fildes, - hpriv->eps[ep].datafd, ret, (ret == AIO_CANCELED)? - strerror(0):strerror(errno)); - - if (ret != AIO_CANCELED) { - ret = _errno_to_libusb(errno); - } else { - /* - * we don't need to call usbi_handle_transfer_cancellation(), - * because we'll handle everything in sunos_async_callback. - */ - ret = LIBUSB_SUCCESS; - } - - return (ret); -} - -void -sunos_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - usbi_dbg(""); - - /* Nothing to do */ -} - -int -sunos_handle_transfer_completion(struct usbi_transfer *itransfer) -{ - return usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED); -} - -int -sunos_clock_gettime(int clkid, struct timespec *tp) -{ - usbi_dbg("clock %d", clkid); - - if (clkid == USBI_CLOCK_REALTIME) - return clock_gettime(CLOCK_REALTIME, tp); - - if (clkid == USBI_CLOCK_MONOTONIC) - return clock_gettime(CLOCK_MONOTONIC, tp); - - return (LIBUSB_ERROR_INVALID_PARAM); -} - -int -_errno_to_libusb(int err) -{ - usbi_dbg("error: %s (%d)", strerror(err), err); - - switch (err) { - case EIO: - return (LIBUSB_ERROR_IO); - case EACCES: - return (LIBUSB_ERROR_ACCESS); - case ENOENT: - return (LIBUSB_ERROR_NO_DEVICE); - case ENOMEM: - return (LIBUSB_ERROR_NO_MEM); - case ETIMEDOUT: - return (LIBUSB_ERROR_TIMEOUT); - } - - return (LIBUSB_ERROR_OTHER); -} - -/* - * sunos_usb_get_status: - * gets status of endpoint - * - * Returns: ugen's last cmd status - */ -static int -sunos_usb_get_status(int fd) -{ - int status, ret; - - usbi_dbg("sunos_usb_get_status(): fd=%d", fd); - - ret = read(fd, &status, sizeof (status)); - if (ret == sizeof (status)) { - switch (status) { - case USB_LC_STAT_NOERROR: - usbi_dbg("No Error"); - break; - case USB_LC_STAT_CRC: - usbi_dbg("CRC Timeout Detected\n"); - break; - case USB_LC_STAT_BITSTUFFING: - usbi_dbg("Bit Stuffing Violation\n"); - break; - case USB_LC_STAT_DATA_TOGGLE_MM: - usbi_dbg("Data Toggle Mismatch\n"); - break; - case USB_LC_STAT_STALL: - usbi_dbg("End Point Stalled\n"); - break; - case USB_LC_STAT_DEV_NOT_RESP: - usbi_dbg("Device is Not Responding\n"); - break; - case USB_LC_STAT_PID_CHECKFAILURE: - usbi_dbg("PID Check Failure\n"); - break; - case USB_LC_STAT_UNEXP_PID: - usbi_dbg("Unexpected PID\n"); - break; - case USB_LC_STAT_DATA_OVERRUN: - usbi_dbg("Data Exceeded Size\n"); - break; - case USB_LC_STAT_DATA_UNDERRUN: - usbi_dbg("Less data received\n"); - break; - case USB_LC_STAT_BUFFER_OVERRUN: - usbi_dbg("Buffer Size Exceeded\n"); - break; - case USB_LC_STAT_BUFFER_UNDERRUN: - usbi_dbg("Buffer Underrun\n"); - break; - case USB_LC_STAT_TIMEOUT: - usbi_dbg("Command Timed Out\n"); - break; - case USB_LC_STAT_NOT_ACCESSED: - usbi_dbg("Not Accessed by h/w\n"); - break; - case USB_LC_STAT_UNSPECIFIED_ERR: - usbi_dbg("Unspecified Error\n"); - break; - case USB_LC_STAT_NO_BANDWIDTH: - usbi_dbg("No Bandwidth\n"); - break; - case USB_LC_STAT_HW_ERR: - usbi_dbg("Host Controller h/w Error\n"); - break; - case USB_LC_STAT_SUSPENDED: - usbi_dbg("Device was Suspended\n"); - break; - case USB_LC_STAT_DISCONNECTED: - usbi_dbg("Device was Disconnected\n"); - break; - case USB_LC_STAT_INTR_BUF_FULL: - usbi_dbg("Interrupt buffer was full\n"); - break; - case USB_LC_STAT_INVALID_REQ: - usbi_dbg("Request was Invalid\n"); - break; - case USB_LC_STAT_INTERRUPTED: - usbi_dbg("Request was Interrupted\n"); - break; - case USB_LC_STAT_NO_RESOURCES: - usbi_dbg("No resources available for " - "request\n"); - break; - case USB_LC_STAT_INTR_POLLING_FAILED: - usbi_dbg("Failed to Restart Poll"); - break; - default: - usbi_dbg("Error Not Determined %d\n", - status); - break; - } - } else { - usbi_dbg("read stat error: %s",strerror(errno)); - status = -1; - } - - return (status); -} - -const struct usbi_os_backend sunos_backend = { - .name = "Solaris", - .caps = 0, - .init = sunos_init, - .exit = sunos_exit, - .get_device_list = sunos_get_device_list, - .get_device_descriptor = sunos_get_device_descriptor, - .get_active_config_descriptor = sunos_get_active_config_descriptor, - .get_config_descriptor = sunos_get_config_descriptor, - .hotplug_poll = NULL, - .open = sunos_open, - .close = sunos_close, - .get_configuration = sunos_get_configuration, - .set_configuration = sunos_set_configuration, - - .claim_interface = sunos_claim_interface, - .release_interface = sunos_release_interface, - .set_interface_altsetting = sunos_set_interface_altsetting, - .clear_halt = sunos_clear_halt, - .reset_device = sunos_reset_device, /* TODO */ - .alloc_streams = NULL, - .free_streams = NULL, - .kernel_driver_active = NULL, - .detach_kernel_driver = NULL, - .attach_kernel_driver = NULL, - .destroy_device = sunos_destroy_device, - .submit_transfer = sunos_submit_transfer, - .cancel_transfer = sunos_cancel_transfer, - .handle_events = NULL, - .clear_transfer_priv = sunos_clear_transfer_priv, - .handle_transfer_completion = sunos_handle_transfer_completion, - .clock_gettime = sunos_clock_gettime, - .device_priv_size = sizeof(sunos_dev_priv_t), - .device_handle_priv_size = sizeof(sunos_dev_handle_priv_t), - .transfer_priv_size = sizeof(sunos_xfer_priv_t), -}; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.h deleted file mode 100644 index 4c1514ea612c..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * libusb synchronization using POSIX Threads - * - * Copyright © 2010 Peter Stuge - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef LIBUSB_THREADS_POSIX_H -#define LIBUSB_THREADS_POSIX_H - -#include -#ifdef HAVE_SYS_TIME_H -#include -#endif - -#define usbi_mutex_static_t pthread_mutex_t -#define USBI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER -#define usbi_mutex_static_lock pthread_mutex_lock -#define usbi_mutex_static_unlock pthread_mutex_unlock - -#define usbi_mutex_t pthread_mutex_t -#define usbi_mutex_init(mutex) pthread_mutex_init((mutex), NULL) -#define usbi_mutex_lock pthread_mutex_lock -#define usbi_mutex_unlock pthread_mutex_unlock -#define usbi_mutex_trylock pthread_mutex_trylock -#define usbi_mutex_destroy pthread_mutex_destroy - -#define usbi_cond_t pthread_cond_t -#define usbi_cond_init(cond) pthread_cond_init((cond), NULL) -#define usbi_cond_wait pthread_cond_wait -#define usbi_cond_broadcast pthread_cond_broadcast -#define usbi_cond_destroy pthread_cond_destroy - -#define usbi_tls_key_t pthread_key_t -#define usbi_tls_key_create(key) pthread_key_create((key), NULL) -#define usbi_tls_key_get pthread_getspecific -#define usbi_tls_key_set pthread_setspecific -#define usbi_tls_key_delete pthread_key_delete - -int usbi_get_tid(void); - -#endif /* LIBUSB_THREADS_POSIX_H */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.c deleted file mode 100644 index 7c2e52dba6a2..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * libusb synchronization on Microsoft Windows - * - * Copyright © 2010 Michael Plante - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include - -#include "libusbi.h" - -struct usbi_cond_perthread { - struct list_head list; - DWORD tid; - HANDLE event; -}; - -int usbi_mutex_static_lock(usbi_mutex_static_t *mutex) -{ - if (!mutex) - return EINVAL; - while (InterlockedExchange(mutex, 1) == 1) - SleepEx(0, TRUE); - return 0; -} - -int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex) -{ - if (!mutex) - return EINVAL; - InterlockedExchange(mutex, 0); - return 0; -} - -int usbi_mutex_init(usbi_mutex_t *mutex) -{ - if (!mutex) - return EINVAL; - *mutex = CreateMutex(NULL, FALSE, NULL); - if (!*mutex) - return ENOMEM; - return 0; -} - -int usbi_mutex_lock(usbi_mutex_t *mutex) -{ - DWORD result; - - if (!mutex) - return EINVAL; - result = WaitForSingleObject(*mutex, INFINITE); - if (result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) - return 0; // acquired (ToDo: check that abandoned is ok) - else - return EINVAL; // don't know how this would happen - // so don't know proper errno -} - -int usbi_mutex_unlock(usbi_mutex_t *mutex) -{ - if (!mutex) - return EINVAL; - if (ReleaseMutex(*mutex)) - return 0; - else - return EPERM; -} - -int usbi_mutex_trylock(usbi_mutex_t *mutex) -{ - DWORD result; - - if (!mutex) - return EINVAL; - result = WaitForSingleObject(*mutex, 0); - if (result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) - return 0; // acquired (ToDo: check that abandoned is ok) - else if (result == WAIT_TIMEOUT) - return EBUSY; - else - return EINVAL; // don't know how this would happen - // so don't know proper error -} - -int usbi_mutex_destroy(usbi_mutex_t *mutex) -{ - // It is not clear if CloseHandle failure is due to failure to unlock. - // If so, this should be errno=EBUSY. - if (!mutex || !CloseHandle(*mutex)) - return EINVAL; - *mutex = NULL; - return 0; -} - -int usbi_cond_init(usbi_cond_t *cond) -{ - if (!cond) - return EINVAL; - list_init(&cond->waiters); - list_init(&cond->not_waiting); - return 0; -} - -int usbi_cond_destroy(usbi_cond_t *cond) -{ - // This assumes no one is using this anymore. The check MAY NOT BE safe. - struct usbi_cond_perthread *pos, *next_pos; - - if(!cond) - return EINVAL; - if (!list_empty(&cond->waiters)) - return EBUSY; // (!see above!) - list_for_each_entry_safe(pos, next_pos, &cond->not_waiting, list, struct usbi_cond_perthread) { - CloseHandle(pos->event); - list_del(&pos->list); - free(pos); - } - return 0; -} - -int usbi_cond_broadcast(usbi_cond_t *cond) -{ - // Assumes mutex is locked; this is not in keeping with POSIX spec, but - // libusb does this anyway, so we simplify by not adding more sync - // primitives to the CV definition! - int fail = 0; - struct usbi_cond_perthread *pos; - - if (!cond) - return EINVAL; - list_for_each_entry(pos, &cond->waiters, list, struct usbi_cond_perthread) { - if (!SetEvent(pos->event)) - fail = 1; - } - // The wait function will remove its respective item from the list. - return fail ? EINVAL : 0; -} - -__inline static int usbi_cond_intwait(usbi_cond_t *cond, - usbi_mutex_t *mutex, DWORD timeout_ms) -{ - struct usbi_cond_perthread *pos; - int r, found = 0; - DWORD r2, tid = GetCurrentThreadId(); - - if (!cond || !mutex) - return EINVAL; - list_for_each_entry(pos, &cond->not_waiting, list, struct usbi_cond_perthread) { - if(tid == pos->tid) { - found = 1; - break; - } - } - - if (!found) { - pos = calloc(1, sizeof(struct usbi_cond_perthread)); - if (!pos) - return ENOMEM; // This errno is not POSIX-allowed. - pos->tid = tid; - pos->event = CreateEvent(NULL, FALSE, FALSE, NULL); // auto-reset. - if (!pos->event) { - free(pos); - return ENOMEM; - } - list_add(&pos->list, &cond->not_waiting); - } - - list_del(&pos->list); // remove from not_waiting list. - list_add(&pos->list, &cond->waiters); - - r = usbi_mutex_unlock(mutex); - if (r) - return r; - - r2 = WaitForSingleObject(pos->event, timeout_ms); - r = usbi_mutex_lock(mutex); - if (r) - return r; - - list_del(&pos->list); - list_add(&pos->list, &cond->not_waiting); - - if (r2 == WAIT_OBJECT_0) - return 0; - else if (r2 == WAIT_TIMEOUT) - return ETIMEDOUT; - else - return EINVAL; -} -// N.B.: usbi_cond_*wait() can also return ENOMEM, even though pthread_cond_*wait cannot! -int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex) -{ - return usbi_cond_intwait(cond, mutex, INFINITE); -} - -int usbi_cond_timedwait(usbi_cond_t *cond, - usbi_mutex_t *mutex, const struct timeval *tv) -{ - DWORD millis; - - millis = (DWORD)(tv->tv_sec * 1000) + (tv->tv_usec / 1000); - /* round up to next millisecond */ - if (tv->tv_usec % 1000) - millis++; - return usbi_cond_intwait(cond, mutex, millis); -} - -int usbi_tls_key_create(usbi_tls_key_t *key) -{ - if (!key) - return EINVAL; - *key = TlsAlloc(); - if (*key == TLS_OUT_OF_INDEXES) - return ENOMEM; - else - return 0; -} - -void *usbi_tls_key_get(usbi_tls_key_t key) -{ - return TlsGetValue(key); -} - -int usbi_tls_key_set(usbi_tls_key_t key, void *value) -{ - if (TlsSetValue(key, value)) - return 0; - else - return EINVAL; -} - -int usbi_tls_key_delete(usbi_tls_key_t key) -{ - if (TlsFree(key)) - return 0; - else - return EINVAL; -} - -int usbi_get_tid(void) -{ - return (int)GetCurrentThreadId(); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.h deleted file mode 100644 index e97ee787572d..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * libusb synchronization on Microsoft Windows - * - * Copyright © 2010 Michael Plante - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef LIBUSB_THREADS_WINDOWS_H -#define LIBUSB_THREADS_WINDOWS_H - -#define usbi_mutex_static_t volatile LONG -#define USBI_MUTEX_INITIALIZER 0 - -#define usbi_mutex_t HANDLE - -typedef struct usbi_cond { - // Every time a thread touches the CV, it winds up in one of these lists. - // It stays there until the CV is destroyed, even if the thread terminates. - struct list_head waiters; - struct list_head not_waiting; -} usbi_cond_t; - -// We *were* getting timespec from pthread.h: -#if (!defined(HAVE_STRUCT_TIMESPEC) && !defined(_TIMESPEC_DEFINED)) -#define HAVE_STRUCT_TIMESPEC 1 -#define _TIMESPEC_DEFINED 1 -struct timespec { - long tv_sec; - long tv_nsec; -}; -#endif /* HAVE_STRUCT_TIMESPEC | _TIMESPEC_DEFINED */ - -// We *were* getting ETIMEDOUT from pthread.h: -#ifndef ETIMEDOUT -# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ -#endif - -#define usbi_tls_key_t DWORD - -int usbi_mutex_static_lock(usbi_mutex_static_t *mutex); -int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex); - -int usbi_mutex_init(usbi_mutex_t *mutex); -int usbi_mutex_lock(usbi_mutex_t *mutex); -int usbi_mutex_unlock(usbi_mutex_t *mutex); -int usbi_mutex_trylock(usbi_mutex_t *mutex); -int usbi_mutex_destroy(usbi_mutex_t *mutex); - -int usbi_cond_init(usbi_cond_t *cond); -int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex); -int usbi_cond_timedwait(usbi_cond_t *cond, - usbi_mutex_t *mutex, const struct timeval *tv); -int usbi_cond_broadcast(usbi_cond_t *cond); -int usbi_cond_destroy(usbi_cond_t *cond); - -int usbi_tls_key_create(usbi_tls_key_t *key); -void *usbi_tls_key_get(usbi_tls_key_t key); -int usbi_tls_key_set(usbi_tls_key_t key, void *value); -int usbi_tls_key_delete(usbi_tls_key_t key); - -int usbi_get_tid(void); - -#endif /* LIBUSB_THREADS_WINDOWS_H */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.c deleted file mode 100644 index d935394a65b2..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.c +++ /dev/null @@ -1,591 +0,0 @@ -/* - * windows backend for libusb 1.0 - * Copyright © 2009-2012 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software - * Hash table functions adapted from glibc, by Ulrich Drepper et al. - * Major code testing contribution by Xiaofan Chen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include - -#include "libusbi.h" -#include "windows_common.h" -#include "windows_nt_common.h" - -// Global variables for clock_gettime mechanism -static uint64_t hires_ticks_to_ps; -static uint64_t hires_frequency; - -#define TIMER_REQUEST_RETRY_MS 100 -#define WM_TIMER_REQUEST (WM_USER + 1) -#define WM_TIMER_EXIT (WM_USER + 2) - -// used for monotonic clock_gettime() -struct timer_request { - struct timespec *tp; - HANDLE event; -}; - -// Timer thread -static HANDLE timer_thread = NULL; -static DWORD timer_thread_id = 0; - -/* User32 dependencies */ -DLL_DECLARE_HANDLE(User32); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, GetMessageA, (LPMSG, HWND, UINT, UINT)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PeekMessageA, (LPMSG, HWND, UINT, UINT, UINT)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PostThreadMessageA, (DWORD, UINT, WPARAM, LPARAM)); - -static unsigned __stdcall windows_clock_gettime_threaded(void *param); - -/* -* Converts a windows error to human readable string -* uses retval as errorcode, or, if 0, use GetLastError() -*/ -#if defined(ENABLE_LOGGING) -const char *windows_error_str(DWORD error_code) -{ - static char err_string[ERR_BUFFER_SIZE]; - - DWORD size; - int len; - - if (error_code == 0) - error_code = GetLastError(); - - len = sprintf(err_string, "[%u] ", (unsigned int)error_code); - - // Translate codes returned by SetupAPI. The ones we are dealing with are either - // in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes. - // See http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011.aspx - switch (error_code & 0xE0000000) { - case 0: - error_code = HRESULT_FROM_WIN32(error_code); // Still leaves ERROR_SUCCESS unmodified - break; - case 0xE0000000: - error_code = 0x80000000 | (FACILITY_SETUPAPI << 16) | (error_code & 0x0000FFFF); - break; - default: - break; - } - - size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - &err_string[len], ERR_BUFFER_SIZE - len, NULL); - if (size == 0) { - DWORD format_error = GetLastError(); - if (format_error) - snprintf(err_string, ERR_BUFFER_SIZE, - "Windows error code %u (FormatMessage error code %u)", - (unsigned int)error_code, (unsigned int)format_error); - else - snprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", (unsigned int)error_code); - } else { - // Remove CRLF from end of message, if present - size_t pos = len + size - 2; - if (err_string[pos] == '\r') - err_string[pos] = '\0'; - } - - return err_string; -} -#endif - -/* Hash table functions - modified From glibc 2.3.2: - [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 - [Knuth] The Art of Computer Programming, part 3 (6.4) */ - -#define HTAB_SIZE 1021UL // *MUST* be a prime number!! - -typedef struct htab_entry { - unsigned long used; - char *str; -} htab_entry; - -static htab_entry *htab_table = NULL; -static usbi_mutex_t htab_mutex = NULL; -static unsigned long htab_filled; - -/* Before using the hash table we must allocate memory for it. - We allocate one element more as the found prime number says. - This is done for more effective indexing as explained in the - comment for the hash function. */ -static bool htab_create(struct libusb_context *ctx) -{ - if (htab_table != NULL) { - usbi_err(ctx, "hash table already allocated"); - return true; - } - - // Create a mutex - usbi_mutex_init(&htab_mutex); - - usbi_dbg("using %lu entries hash table", HTAB_SIZE); - htab_filled = 0; - - // allocate memory and zero out. - htab_table = calloc(HTAB_SIZE + 1, sizeof(htab_entry)); - if (htab_table == NULL) { - usbi_err(ctx, "could not allocate space for hash table"); - return false; - } - - return true; -} - -/* After using the hash table it has to be destroyed. */ -static void htab_destroy(void) -{ - unsigned long i; - - if (htab_table == NULL) - return; - - for (i = 0; i < HTAB_SIZE; i++) - free(htab_table[i].str); - - safe_free(htab_table); - - usbi_mutex_destroy(&htab_mutex); -} - -/* This is the search function. It uses double hashing with open addressing. - We use a trick to speed up the lookup. The table is created with one - more element available. This enables us to use the index zero special. - This index will never be used because we store the first hash index in - the field used where zero means not used. Every other value means used. - The used field can be used as a first fast comparison for equality of - the stored and the parameter value. This helps to prevent unnecessary - expensive calls of strcmp. */ -unsigned long htab_hash(const char *str) -{ - unsigned long hval, hval2; - unsigned long idx; - unsigned long r = 5381; - int c; - const char *sz = str; - - if (str == NULL) - return 0; - - // Compute main hash value (algorithm suggested by Nokia) - while ((c = *sz++) != 0) - r = ((r << 5) + r) + c; - if (r == 0) - ++r; - - // compute table hash: simply take the modulus - hval = r % HTAB_SIZE; - if (hval == 0) - ++hval; - - // Try the first index - idx = hval; - - // Mutually exclusive access (R/W lock would be better) - usbi_mutex_lock(&htab_mutex); - - if (htab_table[idx].used) { - if ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0)) - goto out_unlock; // existing hash - - usbi_dbg("hash collision ('%s' vs '%s')", str, htab_table[idx].str); - - // Second hash function, as suggested in [Knuth] - hval2 = 1 + hval % (HTAB_SIZE - 2); - - do { - // Because size is prime this guarantees to step through all available indexes - if (idx <= hval2) - idx = HTAB_SIZE + idx - hval2; - else - idx -= hval2; - - // If we visited all entries leave the loop unsuccessfully - if (idx == hval) - break; - - // If entry is found use it. - if ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0)) - goto out_unlock; - } while (htab_table[idx].used); - } - - // Not found => New entry - - // If the table is full return an error - if (htab_filled >= HTAB_SIZE) { - usbi_err(NULL, "hash table is full (%lu entries)", HTAB_SIZE); - idx = 0; - goto out_unlock; - } - - htab_table[idx].str = _strdup(str); - if (htab_table[idx].str == NULL) { - usbi_err(NULL, "could not duplicate string for hash table"); - idx = 0; - goto out_unlock; - } - - htab_table[idx].used = hval; - ++htab_filled; - -out_unlock: - usbi_mutex_unlock(&htab_mutex); - - return idx; -} - -static int windows_init_dlls(void) -{ - DLL_GET_HANDLE(User32); - DLL_LOAD_FUNC_PREFIXED(User32, p, GetMessageA, TRUE); - DLL_LOAD_FUNC_PREFIXED(User32, p, PeekMessageA, TRUE); - DLL_LOAD_FUNC_PREFIXED(User32, p, PostThreadMessageA, TRUE); - - return LIBUSB_SUCCESS; -} - -static void windows_exit_dlls(void) -{ - DLL_FREE_HANDLE(User32); -} - -static bool windows_init_clock(struct libusb_context *ctx) -{ - DWORD_PTR affinity, dummy; - HANDLE event = NULL; - LARGE_INTEGER li_frequency; - int i; - - if (QueryPerformanceFrequency(&li_frequency)) { - // Load DLL imports - if (windows_init_dlls() != LIBUSB_SUCCESS) { - usbi_err(ctx, "could not resolve DLL functions"); - return false; - } - - // The hires frequency can go as high as 4 GHz, so we'll use a conversion - // to picoseconds to compute the tv_nsecs part in clock_gettime - hires_frequency = li_frequency.QuadPart; - hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; - usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); - - // Because QueryPerformanceCounter might report different values when - // running on different cores, we create a separate thread for the timer - // calls, which we glue to the first available core always to prevent timing discrepancies. - if (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy) || (affinity == 0)) { - usbi_err(ctx, "could not get process affinity: %s", windows_error_str(0)); - return false; - } - - // The process affinity mask is a bitmask where each set bit represents a core on - // which this process is allowed to run, so we find the first set bit - for (i = 0; !(affinity & (DWORD_PTR)(1 << i)); i++); - affinity = (DWORD_PTR)(1 << i); - - usbi_dbg("timer thread will run on core #%d", i); - - event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (event == NULL) { - usbi_err(ctx, "could not create event: %s", windows_error_str(0)); - return false; - } - - timer_thread = (HANDLE)_beginthreadex(NULL, 0, windows_clock_gettime_threaded, (void *)event, - 0, (unsigned int *)&timer_thread_id); - if (timer_thread == NULL) { - usbi_err(ctx, "unable to create timer thread - aborting"); - CloseHandle(event); - return false; - } - - if (!SetThreadAffinityMask(timer_thread, affinity)) - usbi_warn(ctx, "unable to set timer thread affinity, timer discrepancies may arise"); - - // Wait for timer thread to init before continuing. - if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) { - usbi_err(ctx, "failed to wait for timer thread to become ready - aborting"); - CloseHandle(event); - return false; - } - - CloseHandle(event); - } else { - usbi_dbg("no hires timer available on this platform"); - hires_frequency = 0; - hires_ticks_to_ps = UINT64_C(0); - } - - return true; -} - -void windows_destroy_clock(void) -{ - if (timer_thread) { - // actually the signal to quit the thread. - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) - || (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { - usbi_dbg("could not wait for timer thread to quit"); - TerminateThread(timer_thread, 1); - // shouldn't happen, but we're destroying - // all objects it might have held anyway. - } - CloseHandle(timer_thread); - timer_thread = NULL; - timer_thread_id = 0; - } -} - -/* -* Monotonic and real time functions -*/ -static unsigned __stdcall windows_clock_gettime_threaded(void *param) -{ - struct timer_request *request; - LARGE_INTEGER hires_counter; - MSG msg; - - // The following call will create this thread's message queue - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx - pPeekMessageA(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); - - // Signal windows_init_clock() that we're ready to service requests - if (!SetEvent((HANDLE)param)) - usbi_dbg("SetEvent failed for timer init event: %s", windows_error_str(0)); - param = NULL; - - // Main loop - wait for requests - while (1) { - if (pGetMessageA(&msg, NULL, WM_TIMER_REQUEST, WM_TIMER_EXIT) == -1) { - usbi_err(NULL, "GetMessage failed for timer thread: %s", windows_error_str(0)); - return 1; - } - - switch (msg.message) { - case WM_TIMER_REQUEST: - // Requests to this thread are for hires always - // Microsoft says that this function always succeeds on XP and later - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904.aspx - request = (struct timer_request *)msg.lParam; - QueryPerformanceCounter(&hires_counter); - request->tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); - request->tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps); - if (!SetEvent(request->event)) - usbi_err(NULL, "SetEvent failed for timer request: %s", windows_error_str(0)); - break; - case WM_TIMER_EXIT: - usbi_dbg("timer thread quitting"); - return 0; - } - } -} - -int windows_clock_gettime(int clk_id, struct timespec *tp) -{ - struct timer_request request; -#if !defined(_MSC_VER) || (_MSC_VER < 1900) - FILETIME filetime; - ULARGE_INTEGER rtime; -#endif - DWORD r; - - switch (clk_id) { - case USBI_CLOCK_MONOTONIC: - if (timer_thread) { - request.tp = tp; - request.event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (request.event == NULL) - return LIBUSB_ERROR_NO_MEM; - - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_REQUEST, 0, (LPARAM)&request)) { - usbi_err(NULL, "PostThreadMessage failed for timer thread: %s", windows_error_str(0)); - CloseHandle(request.event); - return LIBUSB_ERROR_OTHER; - } - - do { - r = WaitForSingleObject(request.event, TIMER_REQUEST_RETRY_MS); - if (r == WAIT_TIMEOUT) - usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); - else if (r == WAIT_FAILED) - usbi_err(NULL, "WaitForSingleObject failed: %s", windows_error_str(0)); - } while (r == WAIT_TIMEOUT); - CloseHandle(request.event); - - if (r == WAIT_OBJECT_0) - return LIBUSB_SUCCESS; - else - return LIBUSB_ERROR_OTHER; - } - // Fall through and return real-time if monotonic was not detected @ timer init - case USBI_CLOCK_REALTIME: -#if defined(_MSC_VER) && (_MSC_VER >= 1900) - timespec_get(tp, TIME_UTC); -#else - // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx - // with a predef epoch time to have an epoch that starts at 1970.01.01 00:00 - // Note however that our resolution is bounded by the Windows system time - // functions and is at best of the order of 1 ms (or, usually, worse) - GetSystemTimeAsFileTime(&filetime); - rtime.LowPart = filetime.dwLowDateTime; - rtime.HighPart = filetime.dwHighDateTime; - rtime.QuadPart -= EPOCH_TIME; - tp->tv_sec = (long)(rtime.QuadPart / 10000000); - tp->tv_nsec = (long)((rtime.QuadPart % 10000000) * 100); -#endif - return LIBUSB_SUCCESS; - default: - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static void windows_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) -{ - int status, istatus; - - usbi_dbg("handling I/O completion with errcode %u, size %u", io_result, io_size); - - switch (io_result) { - case NO_ERROR: - status = windows_copy_transfer_data(itransfer, io_size); - break; - case ERROR_GEN_FAILURE: - usbi_dbg("detected endpoint stall"); - status = LIBUSB_TRANSFER_STALL; - break; - case ERROR_SEM_TIMEOUT: - usbi_dbg("detected semaphore timeout"); - status = LIBUSB_TRANSFER_TIMED_OUT; - break; - case ERROR_OPERATION_ABORTED: - istatus = windows_copy_transfer_data(itransfer, io_size); - if (istatus != LIBUSB_TRANSFER_COMPLETED) - usbi_dbg("Failed to copy partial data in aborted operation: %d", istatus); - - usbi_dbg("detected operation aborted"); - status = LIBUSB_TRANSFER_CANCELLED; - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error %u: %s", io_result, windows_error_str(io_result)); - status = LIBUSB_TRANSFER_ERROR; - break; - } - windows_clear_transfer_priv(itransfer); // Cancel polling - if (status == LIBUSB_TRANSFER_CANCELLED) - usbi_handle_transfer_cancellation(itransfer); - else - usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); -} - -void windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - windows_transfer_callback(itransfer, io_result, io_size); - break; - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - usbi_warn(ITRANSFER_CTX(itransfer), "bulk stream transfers are not yet supported on this platform"); - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); - } -} - -int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) -{ - POLL_NFDS_TYPE i; - bool found = false; - struct usbi_transfer *transfer; - struct winfd *pollable_fd = NULL; - DWORD io_size, io_result; - int r = LIBUSB_SUCCESS; - - usbi_mutex_lock(&ctx->open_devs_lock); - for (i = 0; i < nfds && num_ready > 0; i++) { - - usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); - - if (!fds[i].revents) - continue; - - num_ready--; - - // Because a Windows OVERLAPPED is used for poll emulation, - // a pollable fd is created and stored with each transfer - usbi_mutex_lock(&ctx->flying_transfers_lock); - found = false; - list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { - pollable_fd = windows_get_fd(transfer); - if (pollable_fd->fd == fds[i].fd) { - found = true; - break; - } - } - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - if (found) { - windows_get_overlapped_result(transfer, pollable_fd, &io_result, &io_size); - - usbi_remove_pollfd(ctx, pollable_fd->fd); - // let handle_callback free the event using the transfer wfd - // If you don't use the transfer wfd, you run a risk of trying to free a - // newly allocated wfd that took the place of the one from the transfer. - windows_handle_callback(transfer, io_result, io_size); - } else { - usbi_err(ctx, "could not find a matching transfer for fd %d", fds[i]); - r = LIBUSB_ERROR_NOT_FOUND; - break; - } - } - usbi_mutex_unlock(&ctx->open_devs_lock); - - return r; -} - -int windows_common_init(struct libusb_context *ctx) -{ - if (!windows_init_clock(ctx)) - goto error_roll_back; - - if (!htab_create(ctx)) - goto error_roll_back; - - return LIBUSB_SUCCESS; - -error_roll_back: - windows_common_exit(); - return LIBUSB_ERROR_NO_MEM; -} - -void windows_common_exit(void) -{ - htab_destroy(); - windows_destroy_clock(); - windows_exit_dlls(); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.h deleted file mode 100644 index 52ea8708b043..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Windows backend common header for libusb 1.0 - * - * This file brings together header code common between - * the desktop Windows backends. - * Copyright © 2012-2013 RealVNC Ltd. - * Copyright © 2009-2012 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * Major code testing contribution by Xiaofan Chen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#pragma once - -// Missing from MinGW -#if !defined(FACILITY_SETUPAPI) -#define FACILITY_SETUPAPI 15 -#endif - -typedef struct USB_CONFIGURATION_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - USHORT wTotalLength; - UCHAR bNumInterfaces; - UCHAR bConfigurationValue; - UCHAR iConfiguration; - UCHAR bmAttributes; - UCHAR MaxPower; -} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; - -typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; - -int windows_common_init(struct libusb_context *ctx); -void windows_common_exit(void); - -unsigned long htab_hash(const char *str); -int windows_clock_gettime(int clk_id, struct timespec *tp); - -void windows_clear_transfer_priv(struct usbi_transfer *itransfer); -int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size); -struct winfd *windows_get_fd(struct usbi_transfer *transfer); -void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size); - -void windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size); -int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready); - -#if defined(ENABLE_LOGGING) -const char *windows_error_str(DWORD error_code); -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.c deleted file mode 100644 index 7cc5793872a3..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.c +++ /dev/null @@ -1,905 +0,0 @@ -/* - * windows UsbDk backend for libusb 1.0 - * Copyright © 2014 Red Hat, Inc. - - * Authors: - * Dmitry Fleytman - * Pavel Gurvich - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#if defined(USE_USBDK) - -#include -#include -#include - -#include "libusbi.h" -#include "windows_common.h" -#include "windows_nt_common.h" - -#define ULONG64 uint64_t -#define PVOID64 uint64_t - -typedef CONST WCHAR *PCWCHAR; -#define wcsncpy_s wcsncpy - -#include "windows_usbdk.h" - -#if !defined(STATUS_SUCCESS) -typedef LONG NTSTATUS; -#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) -#endif - -#if !defined(STATUS_CANCELLED) -#define STATUS_CANCELLED ((NTSTATUS)0xC0000120L) -#endif - -#if !defined(STATUS_REQUEST_CANCELED) -#define STATUS_REQUEST_CANCELED ((NTSTATUS)0xC0000703L) -#endif - -#if !defined(USBD_SUCCESS) -typedef int32_t USBD_STATUS; -#define USBD_SUCCESS(Status) ((USBD_STATUS) (Status) >= 0) -#define USBD_PENDING(Status) ((ULONG) (Status) >> 30 == 1) -#define USBD_ERROR(Status) ((USBD_STATUS) (Status) < 0) -#define USBD_STATUS_STALL_PID ((USBD_STATUS) 0xc0000004) -#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS) 0xc0000030) -#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS) 0xc0000a00) -#define USBD_STATUS_TIMEOUT ((USBD_STATUS) 0xc0006000) -#define USBD_STATUS_CANCELED ((USBD_STATUS) 0xc0010000) -#endif - -static int concurrent_usage = -1; - -struct usbdk_device_priv { - USB_DK_DEVICE_INFO info; - PUSB_CONFIGURATION_DESCRIPTOR *config_descriptors; - HANDLE redirector_handle; - uint8_t active_configuration; -}; - -struct usbdk_transfer_priv { - USB_DK_TRANSFER_REQUEST request; - struct winfd pollable_fd; - PULONG64 IsochronousPacketsArray; - PUSB_DK_ISO_TRANSFER_RESULT IsochronousResultsArray; -}; - -static inline struct usbdk_device_priv *_usbdk_device_priv(struct libusb_device *dev) -{ - return (struct usbdk_device_priv *)dev->os_priv; -} - -static inline struct usbdk_transfer_priv *_usbdk_transfer_priv(struct usbi_transfer *itransfer) -{ - return (struct usbdk_transfer_priv *)usbi_transfer_get_os_priv(itransfer); -} - -static struct { - HMODULE module; - - USBDK_GET_DEVICES_LIST GetDevicesList; - USBDK_RELEASE_DEVICES_LIST ReleaseDevicesList; - USBDK_START_REDIRECT StartRedirect; - USBDK_STOP_REDIRECT StopRedirect; - USBDK_GET_CONFIGURATION_DESCRIPTOR GetConfigurationDescriptor; - USBDK_RELEASE_CONFIGURATION_DESCRIPTOR ReleaseConfigurationDescriptor; - USBDK_READ_PIPE ReadPipe; - USBDK_WRITE_PIPE WritePipe; - USBDK_ABORT_PIPE AbortPipe; - USBDK_RESET_PIPE ResetPipe; - USBDK_SET_ALTSETTING SetAltsetting; - USBDK_RESET_DEVICE ResetDevice; - USBDK_GET_REDIRECTOR_SYSTEM_HANDLE GetRedirectorSystemHandle; -} usbdk_helper; - -static FARPROC get_usbdk_proc_addr(struct libusb_context *ctx, LPCSTR api_name) -{ - FARPROC api_ptr = GetProcAddress(usbdk_helper.module, api_name); - - if (api_ptr == NULL) - usbi_err(ctx, "UsbDkHelper API %s not found, error %d", api_name, GetLastError()); - - return api_ptr; -} - -static void unload_usbdk_helper_dll(void) -{ - if (usbdk_helper.module != NULL) { - FreeLibrary(usbdk_helper.module); - usbdk_helper.module = NULL; - } -} - -static int load_usbdk_helper_dll(struct libusb_context *ctx) -{ - usbdk_helper.module = LoadLibraryA("UsbDkHelper"); - if (usbdk_helper.module == NULL) { - usbi_err(ctx, "Failed to load UsbDkHelper.dll, error %d", GetLastError()); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbdk_helper.GetDevicesList = (USBDK_GET_DEVICES_LIST)get_usbdk_proc_addr(ctx, "UsbDk_GetDevicesList"); - if (usbdk_helper.GetDevicesList == NULL) - goto error_unload; - - usbdk_helper.ReleaseDevicesList = (USBDK_RELEASE_DEVICES_LIST)get_usbdk_proc_addr(ctx, "UsbDk_ReleaseDevicesList"); - if (usbdk_helper.ReleaseDevicesList == NULL) - goto error_unload; - - usbdk_helper.StartRedirect = (USBDK_START_REDIRECT)get_usbdk_proc_addr(ctx, "UsbDk_StartRedirect"); - if (usbdk_helper.StartRedirect == NULL) - goto error_unload; - - usbdk_helper.StopRedirect = (USBDK_STOP_REDIRECT)get_usbdk_proc_addr(ctx, "UsbDk_StopRedirect"); - if (usbdk_helper.StopRedirect == NULL) - goto error_unload; - - usbdk_helper.GetConfigurationDescriptor = (USBDK_GET_CONFIGURATION_DESCRIPTOR)get_usbdk_proc_addr(ctx, "UsbDk_GetConfigurationDescriptor"); - if (usbdk_helper.GetConfigurationDescriptor == NULL) - goto error_unload; - - usbdk_helper.ReleaseConfigurationDescriptor = (USBDK_RELEASE_CONFIGURATION_DESCRIPTOR)get_usbdk_proc_addr(ctx, "UsbDk_ReleaseConfigurationDescriptor"); - if (usbdk_helper.ReleaseConfigurationDescriptor == NULL) - goto error_unload; - - usbdk_helper.ReadPipe = (USBDK_READ_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_ReadPipe"); - if (usbdk_helper.ReadPipe == NULL) - goto error_unload; - - usbdk_helper.WritePipe = (USBDK_WRITE_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_WritePipe"); - if (usbdk_helper.WritePipe == NULL) - goto error_unload; - - usbdk_helper.AbortPipe = (USBDK_ABORT_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_AbortPipe"); - if (usbdk_helper.AbortPipe == NULL) - goto error_unload; - - usbdk_helper.ResetPipe = (USBDK_RESET_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_ResetPipe"); - if (usbdk_helper.ResetPipe == NULL) - goto error_unload; - - usbdk_helper.SetAltsetting = (USBDK_SET_ALTSETTING)get_usbdk_proc_addr(ctx, "UsbDk_SetAltsetting"); - if (usbdk_helper.SetAltsetting == NULL) - goto error_unload; - - usbdk_helper.ResetDevice = (USBDK_RESET_DEVICE)get_usbdk_proc_addr(ctx, "UsbDk_ResetDevice"); - if (usbdk_helper.ResetDevice == NULL) - goto error_unload; - - usbdk_helper.GetRedirectorSystemHandle = (USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)get_usbdk_proc_addr(ctx, "UsbDk_GetRedirectorSystemHandle"); - if (usbdk_helper.GetRedirectorSystemHandle == NULL) - goto error_unload; - - return LIBUSB_SUCCESS; - -error_unload: - FreeLibrary(usbdk_helper.module); - usbdk_helper.module = NULL; - return LIBUSB_ERROR_NOT_FOUND; -} - -static int usbdk_init(struct libusb_context *ctx) -{ - int r; - - if (++concurrent_usage == 0) { // First init? - r = load_usbdk_helper_dll(ctx); - if (r) - goto init_exit; - - init_polling(); - - r = windows_common_init(ctx); - if (r) - goto init_exit; - } - // At this stage, either we went through full init successfully, or didn't need to - r = LIBUSB_SUCCESS; - -init_exit: - if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? - exit_polling(); - windows_common_exit(); - unload_usbdk_helper_dll(); - } - - if (r != LIBUSB_SUCCESS) - --concurrent_usage; // Not expected to call libusb_exit if we failed. - - return r; -} - -static int usbdk_get_session_id_for_device(struct libusb_context *ctx, - PUSB_DK_DEVICE_ID id, unsigned long *session_id) -{ - char dev_identity[ARRAYSIZE(id->DeviceID) + ARRAYSIZE(id->InstanceID)]; - - if (sprintf(dev_identity, "%S%S", id->DeviceID, id->InstanceID) == -1) { - usbi_warn(ctx, "cannot form device identity", id->DeviceID); - return LIBUSB_ERROR_NOT_SUPPORTED; - } - - *session_id = htab_hash(dev_identity); - - return LIBUSB_SUCCESS; -} - -static void usbdk_release_config_descriptors(struct usbdk_device_priv *p, uint8_t count) -{ - uint8_t i; - - for (i = 0; i < count; i++) - usbdk_helper.ReleaseConfigurationDescriptor(p->config_descriptors[i]); - - free(p->config_descriptors); - p->config_descriptors = NULL; -} - -static int usbdk_cache_config_descriptors(struct libusb_context *ctx, - struct usbdk_device_priv *p, PUSB_DK_DEVICE_INFO info) -{ - uint8_t i; - USB_DK_CONFIG_DESCRIPTOR_REQUEST Request; - Request.ID = info->ID; - - p->config_descriptors = calloc(info->DeviceDescriptor.bNumConfigurations, sizeof(PUSB_CONFIGURATION_DESCRIPTOR)); - if (p->config_descriptors == NULL) { - usbi_err(ctx, "failed to allocate configuration descriptors holder"); - return LIBUSB_ERROR_NO_MEM; - } - - for (i = 0; i < info->DeviceDescriptor.bNumConfigurations; i++) { - ULONG Length; - - Request.Index = i; - if (!usbdk_helper.GetConfigurationDescriptor(&Request, &p->config_descriptors[i], &Length)) { - usbi_err(ctx, "failed to retrieve configuration descriptors"); - usbdk_release_config_descriptors(p, i); - return LIBUSB_ERROR_OTHER; - } - } - - return LIBUSB_SUCCESS; -} - -static inline int usbdk_device_priv_init(struct libusb_context *ctx, struct libusb_device *dev, PUSB_DK_DEVICE_INFO info) -{ - struct usbdk_device_priv *p = _usbdk_device_priv(dev); - - p->info = *info; - p->active_configuration = 0; - - return usbdk_cache_config_descriptors(ctx, p, info); -} - -static void usbdk_device_init(libusb_device *dev, PUSB_DK_DEVICE_INFO info) -{ - dev->bus_number = (uint8_t)info->FilterID; - dev->port_number = (uint8_t)info->Port; - dev->parent_dev = NULL; - - //Addresses in libusb are 1-based - dev->device_address = (uint8_t)(info->Port + 1); - - dev->num_configurations = info->DeviceDescriptor.bNumConfigurations; - dev->device_descriptor = info->DeviceDescriptor; - - switch (info->Speed) { - case LowSpeed: - dev->speed = LIBUSB_SPEED_LOW; - break; - case FullSpeed: - dev->speed = LIBUSB_SPEED_FULL; - break; - case HighSpeed: - dev->speed = LIBUSB_SPEED_HIGH; - break; - case SuperSpeed: - dev->speed = LIBUSB_SPEED_SUPER; - break; - case NoSpeed: - default: - dev->speed = LIBUSB_SPEED_UNKNOWN; - break; - } -} - -static int usbdk_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) -{ - int r = LIBUSB_SUCCESS; - ULONG i; - struct discovered_devs *discdevs = NULL; - ULONG dev_number; - PUSB_DK_DEVICE_INFO devices; - - if(!usbdk_helper.GetDevicesList(&devices, &dev_number)) - return LIBUSB_ERROR_OTHER; - - for (i = 0; i < dev_number; i++) { - unsigned long session_id; - struct libusb_device *dev = NULL; - - if (usbdk_get_session_id_for_device(ctx, &devices[i].ID, &session_id)) - continue; - - dev = usbi_get_device_by_session_id(ctx, session_id); - if (dev == NULL) { - dev = usbi_alloc_device(ctx, session_id); - if (dev == NULL) { - usbi_err(ctx, "failed to allocate a new device structure"); - continue; - } - - usbdk_device_init(dev, &devices[i]); - if (usbdk_device_priv_init(ctx, dev, &devices[i]) != LIBUSB_SUCCESS) { - libusb_unref_device(dev); - continue; - } - } - - discdevs = discovered_devs_append(*_discdevs, dev); - libusb_unref_device(dev); - if (!discdevs) { - usbi_err(ctx, "cannot append new device to list"); - r = LIBUSB_ERROR_NO_MEM; - goto func_exit; - } - - *_discdevs = discdevs; - } - -func_exit: - usbdk_helper.ReleaseDevicesList(devices); - return r; -} - -static void usbdk_exit(void) -{ - if (--concurrent_usage < 0) { - windows_common_exit(); - exit_polling(); - unload_usbdk_helper_dll(); - } -} - -static int usbdk_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) -{ - struct usbdk_device_priv *priv = _usbdk_device_priv(dev); - - memcpy(buffer, &priv->info.DeviceDescriptor, DEVICE_DESC_LENGTH); - *host_endian = 0; - - return LIBUSB_SUCCESS; -} - -static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) -{ - struct usbdk_device_priv *priv = _usbdk_device_priv(dev); - PUSB_CONFIGURATION_DESCRIPTOR config_header; - size_t size; - - if (config_index >= dev->num_configurations) - return LIBUSB_ERROR_INVALID_PARAM; - - config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptors[config_index]; - - size = min(config_header->wTotalLength, len); - memcpy(buffer, config_header, size); - *host_endian = 0; - - return (int)size; -} - -static inline int usbdk_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) -{ - return usbdk_get_config_descriptor(dev, _usbdk_device_priv(dev)->active_configuration, - buffer, len, host_endian); -} - -static int usbdk_open(struct libusb_device_handle *dev_handle) -{ - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - priv->redirector_handle = usbdk_helper.StartRedirect(&priv->info.ID); - if (priv->redirector_handle == INVALID_HANDLE_VALUE) { - usbi_err(DEVICE_CTX(dev_handle->dev), "Redirector startup failed"); - return LIBUSB_ERROR_OTHER; - } - - return LIBUSB_SUCCESS; -} - -static void usbdk_close(struct libusb_device_handle *dev_handle) -{ - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - if (!usbdk_helper.StopRedirect(priv->redirector_handle)) { - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - usbi_err(ctx, "Redirector shutdown failed"); - } -} - -static int usbdk_get_configuration(struct libusb_device_handle *dev_handle, int *config) -{ - *config = _usbdk_device_priv(dev_handle->dev)->active_configuration; - - return LIBUSB_SUCCESS; -} - -static int usbdk_set_configuration(struct libusb_device_handle *dev_handle, int config) -{ - UNUSED(dev_handle); - UNUSED(config); - return LIBUSB_SUCCESS; -} - -static int usbdk_claim_interface(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_SUCCESS; -} - -static int usbdk_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - if (!usbdk_helper.SetAltsetting(priv->redirector_handle, iface, altsetting)) { - usbi_err(ctx, "SetAltsetting failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -static int usbdk_release_interface(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_SUCCESS; -} - -static int usbdk_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - if (!usbdk_helper.ResetPipe(priv->redirector_handle, endpoint)) { - usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -static int usbdk_reset_device(struct libusb_device_handle *dev_handle) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - if (!usbdk_helper.ResetDevice(priv->redirector_handle)) { - usbi_err(ctx, "ResetDevice failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -static int usbdk_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int usbdk_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int usbdk_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static void usbdk_destroy_device(struct libusb_device *dev) -{ - struct usbdk_device_priv* p = _usbdk_device_priv(dev); - - if (p->config_descriptors != NULL) - usbdk_release_config_descriptors(p, p->info.DeviceDescriptor.bNumConfigurations); -} - -void windows_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - usbi_free_fd(&transfer_priv->pollable_fd); - - if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { - safe_free(transfer_priv->IsochronousPacketsArray); - safe_free(transfer_priv->IsochronousResultsArray); - } -} - -static int usbdk_do_control_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct winfd wfd; - ULONG Length; - TransferResult transResult; - HANDLE sysHandle; - - sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); - - wfd = usbi_create_fd(sysHandle, RW_READ, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; - transfer_priv->request.BufferLength = transfer->length; - transfer_priv->request.TransferType = ControlTransferType; - transfer_priv->pollable_fd = INVALID_WINFD; - Length = (ULONG)transfer->length; - - if (IS_XFERIN(transfer)) - transResult = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - else - transResult = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - - switch (transResult) { - case TransferSuccess: - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = (DWORD)Length; - break; - case TransferSuccessAsync: - break; - case TransferFailure: - usbi_err(ctx, "ControlTransfer failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_IO; - } - - // Use priv_transfer to store data needed for async polling - transfer_priv->pollable_fd = wfd; - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN); - - return LIBUSB_SUCCESS; -} - -static int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct winfd wfd; - TransferResult transferRes; - HANDLE sysHandle; - - transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; - transfer_priv->request.BufferLength = transfer->length; - transfer_priv->request.EndpointAddress = transfer->endpoint; - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_BULK: - transfer_priv->request.TransferType = BulkTransferType; - break; - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - transfer_priv->request.TransferType = IntertuptTransferType; - break; - default: - usbi_err(ctx, "Wrong transfer type (%d) in usbdk_do_bulk_transfer. %s", transfer->type, windows_error_str(0)); - return LIBUSB_ERROR_INVALID_PARAM; - } - - transfer_priv->pollable_fd = INVALID_WINFD; - - sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); - - wfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - if (IS_XFERIN(transfer)) - transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - else - transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - - switch (transferRes) { - case TransferSuccess: - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - break; - case TransferSuccessAsync: - break; - case TransferFailure: - usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_IO; - } - - transfer_priv->pollable_fd = wfd; - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, IS_XFERIN(transfer) ? POLLIN : POLLOUT); - - return LIBUSB_SUCCESS; -} - -static int usbdk_do_iso_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct winfd wfd; - TransferResult transferRes; - int i; - HANDLE sysHandle; - - transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; - transfer_priv->request.BufferLength = transfer->length; - transfer_priv->request.EndpointAddress = transfer->endpoint; - transfer_priv->request.TransferType = IsochronousTransferType; - transfer_priv->request.IsochronousPacketsArraySize = transfer->num_iso_packets; - transfer_priv->IsochronousPacketsArray = malloc(transfer->num_iso_packets * sizeof(ULONG64)); - transfer_priv->request.IsochronousPacketsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousPacketsArray; - if (!transfer_priv->IsochronousPacketsArray) { - usbi_err(ctx, "Allocation of IsochronousPacketsArray is failed, %s", windows_error_str(0)); - return LIBUSB_ERROR_IO; - } - - transfer_priv->IsochronousResultsArray = malloc(transfer->num_iso_packets * sizeof(USB_DK_ISO_TRANSFER_RESULT)); - transfer_priv->request.Result.IsochronousResultsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousResultsArray; - if (!transfer_priv->IsochronousResultsArray) { - usbi_err(ctx, "Allocation of isochronousResultsArray is failed, %s", windows_error_str(0)); - free(transfer_priv->IsochronousPacketsArray); - return LIBUSB_ERROR_IO; - } - - for (i = 0; i < transfer->num_iso_packets; i++) - transfer_priv->IsochronousPacketsArray[i] = transfer->iso_packet_desc[i].length; - - transfer_priv->pollable_fd = INVALID_WINFD; - - sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); - - wfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) { - free(transfer_priv->IsochronousPacketsArray); - free(transfer_priv->IsochronousResultsArray); - return LIBUSB_ERROR_NO_MEM; - } - - if (IS_XFERIN(transfer)) - transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - else - transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - - switch (transferRes) { - case TransferSuccess: - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - break; - case TransferSuccessAsync: - break; - case TransferFailure: - usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - free(transfer_priv->IsochronousPacketsArray); - free(transfer_priv->IsochronousResultsArray); - return LIBUSB_ERROR_IO; - } - - transfer_priv->pollable_fd = wfd; - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, IS_XFERIN(transfer) ? POLLIN : POLLOUT); - - return LIBUSB_SUCCESS; -} - -static int usbdk_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - return usbdk_do_control_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - if (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)) - return LIBUSB_ERROR_NOT_SUPPORTED; //TODO: Check whether we can support this in UsbDk - else - return usbdk_do_bulk_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return usbdk_do_iso_transfer(itransfer); - default: - usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static int usbdk_abort_transfers(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); - - if (!usbdk_helper.AbortPipe(priv->redirector_handle, transfer->endpoint)) { - usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -static int usbdk_cancel_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - // Control transfers cancelled by IoCancelXXX() API - // No special treatment needed - return LIBUSB_SUCCESS; - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return usbdk_abort_transfers(itransfer); - default: - usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) -{ - itransfer->transferred += io_size; - return LIBUSB_TRANSFER_COMPLETED; -} - -struct winfd *windows_get_fd(struct usbi_transfer *transfer) -{ - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer); - return &transfer_priv->pollable_fd; -} - -static DWORD usbdk_translate_usbd_status(USBD_STATUS UsbdStatus) -{ - if (USBD_SUCCESS(UsbdStatus)) - return NO_ERROR; - - switch (UsbdStatus) { - case USBD_STATUS_STALL_PID: - case USBD_STATUS_ENDPOINT_HALTED: - case USBD_STATUS_BAD_START_FRAME: - return ERROR_GEN_FAILURE; - case USBD_STATUS_TIMEOUT: - return ERROR_SEM_TIMEOUT; - case USBD_STATUS_CANCELED: - return ERROR_OPERATION_ABORTED; - default: - return ERROR_FUNCTION_FAILED; - } -} - -void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size) -{ - if (HasOverlappedIoCompletedSync(pollable_fd->overlapped) // Handle async requests that completed synchronously first - || GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { // Regular async overlapped - struct libusb_transfer *ltransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer); - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer); - - if (ltransfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { - int i; - for (i = 0; i < transfer_priv->request.IsochronousPacketsArraySize; i++) { - struct libusb_iso_packet_descriptor *lib_desc = <ransfer->iso_packet_desc[i]; - - switch (transfer_priv->IsochronousResultsArray[i].TransferResult) { - case STATUS_SUCCESS: - case STATUS_CANCELLED: - case STATUS_REQUEST_CANCELED: - lib_desc->status = LIBUSB_TRANSFER_COMPLETED; // == ERROR_SUCCESS - break; - default: - lib_desc->status = LIBUSB_TRANSFER_ERROR; // ERROR_UNKNOWN_EXCEPTION; - break; - } - - lib_desc->actual_length = (unsigned int)transfer_priv->IsochronousResultsArray[i].ActualLength; - } - } - - *io_size = (DWORD) transfer_priv->request.Result.GenResult.BytesTransferred; - *io_result = usbdk_translate_usbd_status((USBD_STATUS) transfer_priv->request.Result.GenResult.UsbdStatus); - } - else { - *io_result = GetLastError(); - } -} - -static int usbdk_clock_gettime(int clk_id, struct timespec *tp) -{ - return windows_clock_gettime(clk_id, tp); -} - -const struct usbi_os_backend usbdk_backend = { - "Windows", - USBI_CAP_HAS_HID_ACCESS, - usbdk_init, - usbdk_exit, - - usbdk_get_device_list, - NULL, - usbdk_open, - usbdk_close, - - usbdk_get_device_descriptor, - usbdk_get_active_config_descriptor, - usbdk_get_config_descriptor, - NULL, - - usbdk_get_configuration, - usbdk_set_configuration, - usbdk_claim_interface, - usbdk_release_interface, - - usbdk_set_interface_altsetting, - usbdk_clear_halt, - usbdk_reset_device, - - NULL, - NULL, - - NULL, // dev_mem_alloc() - NULL, // dev_mem_free() - - usbdk_kernel_driver_active, - usbdk_detach_kernel_driver, - usbdk_attach_kernel_driver, - - usbdk_destroy_device, - - usbdk_submit_transfer, - usbdk_cancel_transfer, - windows_clear_transfer_priv, - - windows_handle_events, - NULL, - - usbdk_clock_gettime, -#if defined(USBI_TIMERFD_AVAILABLE) - NULL, -#endif - sizeof(struct usbdk_device_priv), - 0, - sizeof(struct usbdk_transfer_priv), -}; - -#endif /* USE_USBDK */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.h deleted file mode 100644 index 04a9787f2d6b..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.h +++ /dev/null @@ -1,146 +0,0 @@ -/* -* windows UsbDk backend for libusb 1.0 -* Copyright © 2014 Red Hat, Inc. - -* Authors: -* Dmitry Fleytman -* Pavel Gurvich -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; either -* version 2.1 of the License, or (at your option) any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#pragma once - -typedef struct tag_USB_DK_DEVICE_ID { - WCHAR DeviceID[MAX_DEVICE_ID_LEN]; - WCHAR InstanceID[MAX_DEVICE_ID_LEN]; -} USB_DK_DEVICE_ID, *PUSB_DK_DEVICE_ID; - -static inline void UsbDkFillIDStruct(USB_DK_DEVICE_ID *ID, PCWCHAR DeviceID, PCWCHAR InstanceID) -{ - wcsncpy_s(ID->DeviceID, DeviceID, MAX_DEVICE_ID_LEN); - wcsncpy_s(ID->InstanceID, InstanceID, MAX_DEVICE_ID_LEN); -} - -typedef struct tag_USB_DK_DEVICE_INFO { - USB_DK_DEVICE_ID ID; - ULONG64 FilterID; - ULONG64 Port; - ULONG64 Speed; - USB_DEVICE_DESCRIPTOR DeviceDescriptor; -} USB_DK_DEVICE_INFO, *PUSB_DK_DEVICE_INFO; - -typedef struct tag_USB_DK_CONFIG_DESCRIPTOR_REQUEST { - USB_DK_DEVICE_ID ID; - ULONG64 Index; -} USB_DK_CONFIG_DESCRIPTOR_REQUEST, *PUSB_DK_CONFIG_DESCRIPTOR_REQUEST; - -typedef struct tag_USB_DK_ISO_TRANSFER_RESULT { - ULONG64 ActualLength; - ULONG64 TransferResult; -} USB_DK_ISO_TRANSFER_RESULT, *PUSB_DK_ISO_TRANSFER_RESULT; - -typedef struct tag_USB_DK_GEN_TRANSFER_RESULT { - ULONG64 BytesTransferred; - ULONG64 UsbdStatus; // USBD_STATUS code -} USB_DK_GEN_TRANSFER_RESULT, *PUSB_DK_GEN_TRANSFER_RESULT; - -typedef struct tag_USB_DK_TRANSFER_RESULT { - USB_DK_GEN_TRANSFER_RESULT GenResult; - PVOID64 IsochronousResultsArray; // array of USB_DK_ISO_TRANSFER_RESULT -} USB_DK_TRANSFER_RESULT, *PUSB_DK_TRANSFER_RESULT; - -typedef struct tag_USB_DK_TRANSFER_REQUEST { - ULONG64 EndpointAddress; - PVOID64 Buffer; - ULONG64 BufferLength; - ULONG64 TransferType; - ULONG64 IsochronousPacketsArraySize; - PVOID64 IsochronousPacketsArray; - - USB_DK_TRANSFER_RESULT Result; -} USB_DK_TRANSFER_REQUEST, *PUSB_DK_TRANSFER_REQUEST; - -typedef enum { - TransferFailure = 0, - TransferSuccess, - TransferSuccessAsync -} TransferResult; - -typedef enum { - NoSpeed = 0, - LowSpeed, - FullSpeed, - HighSpeed, - SuperSpeed -} USB_DK_DEVICE_SPEED; - -typedef enum { - ControlTransferType, - BulkTransferType, - IntertuptTransferType, - IsochronousTransferType -} USB_DK_TRANSFER_TYPE; - -typedef BOOL (__cdecl *USBDK_GET_DEVICES_LIST)( - PUSB_DK_DEVICE_INFO *DeviceInfo, - PULONG DeviceNumber -); -typedef void (__cdecl *USBDK_RELEASE_DEVICES_LIST)( - PUSB_DK_DEVICE_INFO DeviceInfo -); -typedef HANDLE (__cdecl *USBDK_START_REDIRECT)( - PUSB_DK_DEVICE_ID DeviceId -); -typedef BOOL (__cdecl *USBDK_STOP_REDIRECT)( - HANDLE DeviceHandle -); -typedef BOOL (__cdecl *USBDK_GET_CONFIGURATION_DESCRIPTOR)( - PUSB_DK_CONFIG_DESCRIPTOR_REQUEST Request, - PUSB_CONFIGURATION_DESCRIPTOR *Descriptor, - PULONG Length -); -typedef void (__cdecl *USBDK_RELEASE_CONFIGURATION_DESCRIPTOR)( - PUSB_CONFIGURATION_DESCRIPTOR Descriptor -); -typedef TransferResult (__cdecl *USBDK_WRITE_PIPE)( - HANDLE DeviceHandle, - PUSB_DK_TRANSFER_REQUEST Request, - LPOVERLAPPED lpOverlapped -); -typedef TransferResult (__cdecl *USBDK_READ_PIPE)( - HANDLE DeviceHandle, - PUSB_DK_TRANSFER_REQUEST Request, - LPOVERLAPPED lpOverlapped -); -typedef BOOL (__cdecl *USBDK_ABORT_PIPE)( - HANDLE DeviceHandle, - ULONG64 PipeAddress -); -typedef BOOL (__cdecl *USBDK_RESET_PIPE)( - HANDLE DeviceHandle, - ULONG64 PipeAddress -); -typedef BOOL (__cdecl *USBDK_SET_ALTSETTING)( - HANDLE DeviceHandle, - ULONG64 InterfaceIdx, - ULONG64 AltSettingIdx -); -typedef BOOL (__cdecl *USBDK_RESET_DEVICE)( - HANDLE DeviceHandle -); -typedef HANDLE (__cdecl *USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)( - HANDLE DeviceHandle -); diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.c deleted file mode 100644 index 0dce0ea6cb68..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.c +++ /dev/null @@ -1,4290 +0,0 @@ -/* - * windows backend for libusb 1.0 - * Copyright © 2009-2012 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software - * Hash table functions adapted from glibc, by Ulrich Drepper et al. - * Major code testing contribution by Xiaofan Chen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#if !defined(USE_USBDK) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libusbi.h" -#include "poll_windows.h" -#include "windows_winusb.h" - -#define HANDLE_VALID(h) (((h) != 0) && ((h) != INVALID_HANDLE_VALUE)) - -// The 2 macros below are used in conjunction with safe loops. -#define LOOP_CHECK(fcall) \ - { \ - r = fcall; \ - if (r != LIBUSB_SUCCESS) \ - continue; \ - } -#define LOOP_BREAK(err) \ - { \ - r = err; \ - continue; \ - } - -// WinUSB-like API prototypes -static int winusbx_init(int sub_api, struct libusb_context *ctx); -static int winusbx_exit(int sub_api); -static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle); -static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle); -static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); -static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); -static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); -static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); -static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer); -static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer); -static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle); -static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); -// HID API prototypes -static int hid_init(int sub_api, struct libusb_context *ctx); -static int hid_exit(int sub_api); -static int hid_open(int sub_api, struct libusb_device_handle *dev_handle); -static void hid_close(int sub_api, struct libusb_device_handle *dev_handle); -static int hid_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int hid_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int hid_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); -static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); -static int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); -static int hid_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); -static int hid_abort_transfers(int sub_api, struct usbi_transfer *itransfer); -static int hid_reset_device(int sub_api, struct libusb_device_handle *dev_handle); -static int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); -// Composite API prototypes -static int composite_init(int sub_api, struct libusb_context *ctx); -static int composite_exit(int sub_api); -static int composite_open(int sub_api, struct libusb_device_handle *dev_handle); -static void composite_close(int sub_api, struct libusb_device_handle *dev_handle); -static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); -static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); -static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); -static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer); -static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); -static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer); -static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer); -static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle); -static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); - - -// Global variables -int windows_version = WINDOWS_UNDEFINED; -static char windows_version_str[128] = "Undefined"; -// Concurrency -static int concurrent_usage = -1; -static usbi_mutex_t autoclaim_lock; -// API globals -#define CHECK_WINUSBX_AVAILABLE(sub_api) \ - do { \ - if (sub_api == SUB_API_NOTSET) \ - sub_api = priv->sub_api; \ - if (!WinUSBX[sub_api].initialized) \ - return LIBUSB_ERROR_ACCESS; \ - } while(0) - -static HMODULE WinUSBX_handle = NULL; -static struct winusb_interface WinUSBX[SUB_API_MAX]; -static const char *sub_api_name[SUB_API_MAX] = WINUSBX_DRV_NAMES; - -static bool api_hid_available = false; -#define CHECK_HID_AVAILABLE \ - do { \ - if (!api_hid_available) \ - return LIBUSB_ERROR_ACCESS; \ - } while (0) - -static inline BOOLEAN guid_eq(const GUID *guid1, const GUID *guid2) -{ - if ((guid1 != NULL) && (guid2 != NULL)) - return (memcmp(guid1, guid2, sizeof(GUID)) == 0); - - return false; -} - -#if defined(ENABLE_LOGGING) -static char *guid_to_string(const GUID *guid) -{ - static char guid_string[MAX_GUID_STRING_LENGTH]; - - if (guid == NULL) - return NULL; - - sprintf(guid_string, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", - (unsigned int)guid->Data1, guid->Data2, guid->Data3, - guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], - guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); - - return guid_string; -} -#endif - -/* - * Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes. - * Return an allocated sanitized string or NULL on error. - */ -static char *sanitize_path(const char *path) -{ - const char root_prefix[] = { '\\', '\\', '.', '\\' }; - size_t j, size; - char *ret_path; - size_t add_root = 0; - - if (path == NULL) - return NULL; - - size = strlen(path) + 1; - - // Microsoft indiscriminately uses '\\?\', '\\.\', '##?#" or "##.#" for root prefixes. - if (!((size > 3) && (((path[0] == '\\') && (path[1] == '\\') && (path[3] == '\\')) - || ((path[0] == '#') && (path[1] == '#') && (path[3] == '#'))))) { - add_root = sizeof(root_prefix); - size += add_root; - } - - ret_path = malloc(size); - if (ret_path == NULL) - return NULL; - - strcpy(&ret_path[add_root], path); - - // Ensure consistency with root prefix - memcpy(ret_path, root_prefix, sizeof(root_prefix)); - - // Same goes for '\' and '#' after the root prefix. Ensure '#' is used - for (j = sizeof(root_prefix); j < size; j++) { - ret_path[j] = (char)toupper((int)ret_path[j]); // Fix case too - if (ret_path[j] == '\\') - ret_path[j] = '#'; - } - - return ret_path; -} - -/* - * Cfgmgr32, OLE32 and SetupAPI DLL functions - */ -static int init_dlls(void) -{ - DLL_GET_HANDLE(Cfgmgr32); - DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Parent, TRUE); - DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Child, TRUE); - DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Sibling, TRUE); - DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Device_IDA, TRUE); - - // Prefixed to avoid conflict with header files - DLL_GET_HANDLE(AdvAPI32); - DLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegQueryValueExW, TRUE); - DLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegCloseKey, TRUE); - - DLL_GET_HANDLE(Kernel32); - DLL_LOAD_FUNC_PREFIXED(Kernel32, p, IsWow64Process, FALSE); - - DLL_GET_HANDLE(OLE32); - DLL_LOAD_FUNC_PREFIXED(OLE32, p, CLSIDFromString, TRUE); - - DLL_GET_HANDLE(SetupAPI); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetClassDevsA, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInfo, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInterfaces, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceInterfaceDetailA, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiDestroyDeviceInfoList, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDevRegKey, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceRegistryPropertyA, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDeviceInterfaceRegKey, TRUE); - - return LIBUSB_SUCCESS; -} - -static void exit_dlls(void) -{ - DLL_FREE_HANDLE(Cfgmgr32); - DLL_FREE_HANDLE(AdvAPI32); - DLL_FREE_HANDLE(Kernel32); - DLL_FREE_HANDLE(OLE32); - DLL_FREE_HANDLE(SetupAPI); -} - -/* - * enumerate interfaces for the whole USB class - * - * Parameters: - * dev_info: a pointer to a dev_info list - * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) - * usb_class: the generic USB class for which to retrieve interface details - * index: zero based index of the interface in the device info list - * - * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA - * structure returned and call this function repeatedly using the same guid (with an - * incremented index starting at zero) until all interfaces have been returned. - */ -static bool get_devinfo_data(struct libusb_context *ctx, - HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const char *usb_class, unsigned _index) -{ - if (_index <= 0) { - *dev_info = pSetupDiGetClassDevsA(NULL, usb_class, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); - if (*dev_info == INVALID_HANDLE_VALUE) - return false; - } - - dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); - if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain device info data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return false; - } - return true; -} - -/* - * enumerate interfaces for a specific GUID - * - * Parameters: - * dev_info: a pointer to a dev_info list - * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) - * guid: the GUID for which to retrieve interface details - * index: zero based index of the interface in the device info list - * - * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA - * structure returned and call this function repeatedly using the same guid (with an - * incremented index starting at zero) until all interfaces have been returned. - */ -static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details(struct libusb_context *ctx, - HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID *guid, unsigned _index) -{ - SP_DEVICE_INTERFACE_DATA dev_interface_data; - SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details; - DWORD size; - - if (_index <= 0) - *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); - - if (dev_info_data != NULL) { - dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); - if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain device info data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; - } - } - - dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain interface data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; - } - - // Read interface data (dummy + actual) to access the device path - if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { - // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", - _index, windows_error_str(0)); - goto err_exit; - } - } else { - usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); - goto err_exit; - } - - dev_interface_details = calloc(1, size); - if (dev_interface_details == NULL) { - usbi_err(ctx, "could not allocate interface data for index %u.", _index); - goto err_exit; - } - - dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); - if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, - dev_interface_details, size, &size, NULL)) { - usbi_err(ctx, "could not access interface data (actual) for index %u: %s", - _index, windows_error_str(0)); - } - - return dev_interface_details; - -err_exit: - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; -} - -/* For libusb0 filter */ -static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details_filter(struct libusb_context *ctx, - HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID *guid, unsigned _index, char *filter_path) -{ - SP_DEVICE_INTERFACE_DATA dev_interface_data; - SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details; - DWORD size; - - if (_index <= 0) - *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); - - if (dev_info_data != NULL) { - dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); - if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain device info data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; - } - } - - dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain interface data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; - } - - // Read interface data (dummy + actual) to access the device path - if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { - // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", - _index, windows_error_str(0)); - goto err_exit; - } - } else { - usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); - goto err_exit; - } - - dev_interface_details = calloc(1, size); - if (dev_interface_details == NULL) { - usbi_err(ctx, "could not allocate interface data for index %u.", _index); - goto err_exit; - } - - dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); - if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, dev_interface_details, size, &size, NULL)) - usbi_err(ctx, "could not access interface data (actual) for index %u: %s", - _index, windows_error_str(0)); - - // [trobinso] lookup the libusb0 symbolic index. - if (dev_interface_details) { - HKEY hkey_device_interface = pSetupDiOpenDeviceInterfaceRegKey(*dev_info, &dev_interface_data, 0, KEY_READ); - if (hkey_device_interface != INVALID_HANDLE_VALUE) { - DWORD libusb0_symboliclink_index = 0; - DWORD value_length = sizeof(DWORD); - DWORD value_type = 0; - LONG status; - - status = pRegQueryValueExW(hkey_device_interface, L"LUsb0", NULL, &value_type, - (LPBYTE)&libusb0_symboliclink_index, &value_length); - if (status == ERROR_SUCCESS) { - if (libusb0_symboliclink_index < 256) { - // libusb0.sys is connected to this device instance. - // If the the device interface guid is {F9F3FF14-AE21-48A0-8A25-8011A7A931D9} then it's a filter. - sprintf(filter_path, "\\\\.\\libusb0-%04u", (unsigned int)libusb0_symboliclink_index); - usbi_dbg("assigned libusb0 symbolic link %s", filter_path); - } else { - // libusb0.sys was connected to this device instance at one time; but not anymore. - } - } - pRegCloseKey(hkey_device_interface); - } - } - - return dev_interface_details; - -err_exit: - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; -} - -/* - * Returns the session ID of a device's nth level ancestor - * If there's no device at the nth level, return 0 - */ -static unsigned long get_ancestor_session_id(DWORD devinst, unsigned level) -{ - DWORD parent_devinst; - unsigned long session_id; - char *sanitized_path; - char path[MAX_PATH_LENGTH]; - unsigned i; - - if (level < 1) - return 0; - - for (i = 0; i < level; i++) { - if (CM_Get_Parent(&parent_devinst, devinst, 0) != CR_SUCCESS) - return 0; - devinst = parent_devinst; - } - - if (CM_Get_Device_IDA(devinst, path, MAX_PATH_LENGTH, 0) != CR_SUCCESS) - return 0; - - // TODO: (post hotplug): try without sanitizing - sanitized_path = sanitize_path(path); - if (sanitized_path == NULL) - return 0; - - session_id = htab_hash(sanitized_path); - free(sanitized_path); - return session_id; -} - -/* - * Determine which interface the given endpoint address belongs to - */ -static int get_interface_by_endpoint(struct libusb_config_descriptor *conf_desc, uint8_t ep) -{ - const struct libusb_interface *intf; - const struct libusb_interface_descriptor *intf_desc; - int i, j, k; - - for (i = 0; i < conf_desc->bNumInterfaces; i++) { - intf = &conf_desc->interface[i]; - for (j = 0; j < intf->num_altsetting; j++) { - intf_desc = &intf->altsetting[j]; - for (k = 0; k < intf_desc->bNumEndpoints; k++) { - if (intf_desc->endpoint[k].bEndpointAddress == ep) { - usbi_dbg("found endpoint %02X on interface %d", intf_desc->bInterfaceNumber, i); - return intf_desc->bInterfaceNumber; - } - } - } - } - - usbi_dbg("endpoint %02X not found on any interface", ep); - return LIBUSB_ERROR_NOT_FOUND; -} - -/* - * Populate the endpoints addresses of the device_priv interface helper structs - */ -static int windows_assign_endpoints(struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - int i, r; - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct libusb_config_descriptor *conf_desc; - const struct libusb_interface_descriptor *if_desc; - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - - r = libusb_get_active_config_descriptor(dev_handle->dev, &conf_desc); - if (r != LIBUSB_SUCCESS) { - usbi_warn(ctx, "could not read config descriptor: error %d", r); - return r; - } - - if_desc = &conf_desc->interface[iface].altsetting[altsetting]; - safe_free(priv->usb_interface[iface].endpoint); - - if (if_desc->bNumEndpoints == 0) { - usbi_dbg("no endpoints found for interface %d", iface); - libusb_free_config_descriptor(conf_desc); - return LIBUSB_SUCCESS; - } - - priv->usb_interface[iface].endpoint = malloc(if_desc->bNumEndpoints); - if (priv->usb_interface[iface].endpoint == NULL) { - libusb_free_config_descriptor(conf_desc); - return LIBUSB_ERROR_NO_MEM; - } - - priv->usb_interface[iface].nb_endpoints = if_desc->bNumEndpoints; - for (i = 0; i < if_desc->bNumEndpoints; i++) { - priv->usb_interface[iface].endpoint[i] = if_desc->endpoint[i].bEndpointAddress; - usbi_dbg("(re)assigned endpoint %02X to interface %d", priv->usb_interface[iface].endpoint[i], iface); - } - libusb_free_config_descriptor(conf_desc); - - // Extra init may be required to configure endpoints - return priv->apib->configure_endpoints(SUB_API_NOTSET, dev_handle, iface); -} - -// Lookup for a match in the list of API driver names -// return -1 if not found, driver match number otherwise -static int get_sub_api(char *driver, int api) -{ - int i; - const char sep_str[2] = {LIST_SEPARATOR, 0}; - char *tok, *tmp_str; - size_t len = strlen(driver); - - if (len == 0) - return SUB_API_NOTSET; - - tmp_str = _strdup(driver); - if (tmp_str == NULL) - return SUB_API_NOTSET; - - tok = strtok(tmp_str, sep_str); - while (tok != NULL) { - for (i = 0; i < usb_api_backend[api].nb_driver_names; i++) { - if (_stricmp(tok, usb_api_backend[api].driver_name_list[i]) == 0) { - free(tmp_str); - return i; - } - } - tok = strtok(NULL, sep_str); - } - - free(tmp_str); - return SUB_API_NOTSET; -} - -/* - * auto-claiming and auto-release helper functions - */ -static int auto_claim(struct libusb_transfer *transfer, int *interface_number, int api_type) -{ - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv( - transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int current_interface = *interface_number; - int r = LIBUSB_SUCCESS; - - switch(api_type) { - case USB_API_WINUSBX: - case USB_API_HID: - break; - default: - return LIBUSB_ERROR_INVALID_PARAM; - } - - usbi_mutex_lock(&autoclaim_lock); - if (current_interface < 0) { // No serviceable interface was found - for (current_interface = 0; current_interface < USB_MAXINTERFACES; current_interface++) { - // Must claim an interface of the same API type - if ((priv->usb_interface[current_interface].apib->id == api_type) - && (libusb_claim_interface(transfer->dev_handle, current_interface) == LIBUSB_SUCCESS)) { - usbi_dbg("auto-claimed interface %d for control request", current_interface); - if (handle_priv->autoclaim_count[current_interface] != 0) - usbi_warn(ctx, "program assertion failed - autoclaim_count was nonzero"); - handle_priv->autoclaim_count[current_interface]++; - break; - } - } - if (current_interface == USB_MAXINTERFACES) { - usbi_err(ctx, "could not auto-claim any interface"); - r = LIBUSB_ERROR_NOT_FOUND; - } - } else { - // If we have a valid interface that was autoclaimed, we must increment - // its autoclaim count so that we can prevent an early release. - if (handle_priv->autoclaim_count[current_interface] != 0) - handle_priv->autoclaim_count[current_interface]++; - } - usbi_mutex_unlock(&autoclaim_lock); - - *interface_number = current_interface; - return r; -} - -static void auto_release(struct usbi_transfer *itransfer) -{ - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - libusb_device_handle *dev_handle = transfer->dev_handle; - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - int r; - - usbi_mutex_lock(&autoclaim_lock); - if (handle_priv->autoclaim_count[transfer_priv->interface_number] > 0) { - handle_priv->autoclaim_count[transfer_priv->interface_number]--; - if (handle_priv->autoclaim_count[transfer_priv->interface_number] == 0) { - r = libusb_release_interface(dev_handle, transfer_priv->interface_number); - if (r == LIBUSB_SUCCESS) - usbi_dbg("auto-released interface %d", transfer_priv->interface_number); - else - usbi_dbg("failed to auto-release interface %d (%s)", - transfer_priv->interface_number, libusb_error_name((enum libusb_error)r)); - } - } - usbi_mutex_unlock(&autoclaim_lock); -} - -/* Windows version dtection */ -static BOOL is_x64(void) -{ - BOOL ret = FALSE; - - // Detect if we're running a 32 or 64 bit system - if (sizeof(uintptr_t) < 8) { - if (pIsWow64Process != NULL) - pIsWow64Process(GetCurrentProcess(), &ret); - } else { - ret = TRUE; - } - - return ret; -} - -static void get_windows_version(void) -{ - OSVERSIONINFOEXA vi, vi2; - const char *arch, *w = NULL; - unsigned major, minor; - ULONGLONG major_equal, minor_equal; - BOOL ws; - - memset(&vi, 0, sizeof(vi)); - vi.dwOSVersionInfoSize = sizeof(vi); - if (!GetVersionExA((OSVERSIONINFOA *)&vi)) { - memset(&vi, 0, sizeof(vi)); - vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); - if (!GetVersionExA((OSVERSIONINFOA *)&vi)) - return; - } - - if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) { - if (vi.dwMajorVersion > 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion >= 2)) { - // Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the actual OS version - // See: http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx - - major_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); - for (major = vi.dwMajorVersion; major <= 9; major++) { - memset(&vi2, 0, sizeof(vi2)); - vi2.dwOSVersionInfoSize = sizeof(vi2); - vi2.dwMajorVersion = major; - if (!VerifyVersionInfoA(&vi2, VER_MAJORVERSION, major_equal)) - continue; - - if (vi.dwMajorVersion < major) { - vi.dwMajorVersion = major; - vi.dwMinorVersion = 0; - } - - minor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL); - for (minor = vi.dwMinorVersion; minor <= 9; minor++) { - memset(&vi2, 0, sizeof(vi2)); - vi2.dwOSVersionInfoSize = sizeof(vi2); - vi2.dwMinorVersion = minor; - if (!VerifyVersionInfoA(&vi2, VER_MINORVERSION, minor_equal)) - continue; - - vi.dwMinorVersion = minor; - break; - } - - break; - } - } - - if (vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) { - ws = (vi.wProductType <= VER_NT_WORKSTATION); - windows_version = vi.dwMajorVersion << 4 | vi.dwMinorVersion; - switch (windows_version) { - case 0x50: w = "2000"; break; - case 0x51: w = "XP"; break; - case 0x52: w = "2003"; break; - case 0x60: w = (ws ? "Vista" : "2008"); break; - case 0x61: w = (ws ? "7" : "2008_R2"); break; - case 0x62: w = (ws ? "8" : "2012"); break; - case 0x63: w = (ws ? "8.1" : "2012_R2"); break; - case 0x64: w = (ws ? "10" : "2015"); break; - default: - if (windows_version < 0x50) - windows_version = WINDOWS_UNSUPPORTED; - else - w = "11 or later"; - break; - } - } - } - - arch = is_x64() ? "64-bit" : "32-bit"; - - if (w == NULL) - snprintf(windows_version_str, sizeof(windows_version_str), "%s %u.%u %s", - (vi.dwPlatformId == VER_PLATFORM_WIN32_NT ? "NT" : "??"), - (unsigned int)vi.dwMajorVersion, (unsigned int)vi.dwMinorVersion, arch); - else if (vi.wServicePackMinor) - snprintf(windows_version_str, sizeof(windows_version_str), "%s SP%u.%u %s", - w, vi.wServicePackMajor, vi.wServicePackMinor, arch); - else if (vi.wServicePackMajor) - snprintf(windows_version_str, sizeof(windows_version_str), "%s SP%u %s", - w, vi.wServicePackMajor, arch); - else - snprintf(windows_version_str, sizeof(windows_version_str), "%s %s", - w, arch); -} - -/* - * init: libusb backend init function - * - * This function enumerates the HCDs (Host Controller Drivers) and populates our private HCD list - * In our implementation, we equate Windows' "HCD" to libusb's "bus". Note that bus is zero indexed. - * HCDs are not expected to change after init (might not hold true for hot pluggable USB PCI card?) - */ -static int windows_init(struct libusb_context *ctx) -{ - int i, r = LIBUSB_ERROR_OTHER; - HANDLE semaphore; - char sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' - - sprintf(sem_name, "libusb_init%08X", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); - semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); - if (semaphore == NULL) { - usbi_err(ctx, "could not create semaphore: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_MEM; - } - - // A successful wait brings our semaphore count to 0 (unsignaled) - // => any concurent wait stalls until the semaphore's release - if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { - usbi_err(ctx, "failure to access semaphore: %s", windows_error_str(0)); - CloseHandle(semaphore); - return LIBUSB_ERROR_NO_MEM; - } - - // NB: concurrent usage supposes that init calls are equally balanced with - // exit calls. If init is called more than exit, we will not exit properly - if (++concurrent_usage == 0) { // First init? - get_windows_version(); - usbi_dbg("Windows %s", windows_version_str); - - if (windows_version == WINDOWS_UNSUPPORTED) { - usbi_err(ctx, "This version of Windows is NOT supported"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - goto init_exit; - } - - // We need a lock for proper auto-release - usbi_mutex_init(&autoclaim_lock); - - // Initialize pollable file descriptors - init_polling(); - - // Load DLL imports - if (init_dlls() != LIBUSB_SUCCESS) { - usbi_err(ctx, "could not resolve DLL functions"); - goto init_exit; - } - - // Initialize the low level APIs (we don't care about errors at this stage) - for (i = 0; i < USB_API_MAX; i++) - usb_api_backend[i].init(SUB_API_NOTSET, ctx); - - r = windows_common_init(ctx); - if (r) - goto init_exit; - } - // At this stage, either we went through full init successfully, or didn't need to - r = LIBUSB_SUCCESS; - -init_exit: // Holds semaphore here. - if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? - for (i = 0; i < USB_API_MAX; i++) - usb_api_backend[i].exit(SUB_API_NOTSET); - exit_dlls(); - exit_polling(); - windows_common_exit(); - usbi_mutex_destroy(&autoclaim_lock); - } - - if (r != LIBUSB_SUCCESS) - --concurrent_usage; // Not expected to call libusb_exit if we failed. - - ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 - CloseHandle(semaphore); - return r; -} - -/* - * HCD (root) hubs need to have their device descriptor manually populated - * - * Note that, like Microsoft does in the device manager, we populate the - * Vendor and Device ID for HCD hubs with the ones from the PCI HCD device. - */ -static int force_hcd_device_descriptor(struct libusb_device *dev) -{ - struct windows_device_priv *parent_priv, *priv = _device_priv(dev); - struct libusb_context *ctx = DEVICE_CTX(dev); - int vid, pid; - - dev->num_configurations = 1; - priv->dev_descriptor.bLength = sizeof(USB_DEVICE_DESCRIPTOR); - priv->dev_descriptor.bDescriptorType = USB_DEVICE_DESCRIPTOR_TYPE; - priv->dev_descriptor.bNumConfigurations = 1; - priv->active_config = 1; - - if (dev->parent_dev == NULL) { - usbi_err(ctx, "program assertion failed - HCD hub has no parent"); - return LIBUSB_ERROR_NO_DEVICE; - } - - parent_priv = _device_priv(dev->parent_dev); - if (sscanf(parent_priv->path, "\\\\.\\PCI#VEN_%04x&DEV_%04x%*s", &vid, &pid) == 2) { - priv->dev_descriptor.idVendor = (uint16_t)vid; - priv->dev_descriptor.idProduct = (uint16_t)pid; - } else { - usbi_warn(ctx, "could not infer VID/PID of HCD hub from '%s'", parent_priv->path); - priv->dev_descriptor.idVendor = 0x1d6b; // Linux Foundation root hub - priv->dev_descriptor.idProduct = 1; - } - - return LIBUSB_SUCCESS; -} - -/* - * fetch and cache all the config descriptors through I/O - */ -static int cache_config_descriptors(struct libusb_device *dev, HANDLE hub_handle, char *device_id) -{ - DWORD size, ret_size; - struct libusb_context *ctx = DEVICE_CTX(dev); - struct windows_device_priv *priv = _device_priv(dev); - int r; - uint8_t i; - - USB_CONFIGURATION_DESCRIPTOR_SHORT cd_buf_short; // dummy request - PUSB_DESCRIPTOR_REQUEST cd_buf_actual = NULL; // actual request - PUSB_CONFIGURATION_DESCRIPTOR cd_data = NULL; - - if (dev->num_configurations == 0) - return LIBUSB_ERROR_INVALID_PARAM; - - priv->config_descriptor = calloc(dev->num_configurations, sizeof(unsigned char *)); - if (priv->config_descriptor == NULL) - return LIBUSB_ERROR_NO_MEM; - - for (i = 0; i < dev->num_configurations; i++) - priv->config_descriptor[i] = NULL; - - for (i = 0, r = LIBUSB_SUCCESS; ; i++) { - // safe loop: release all dynamic resources - safe_free(cd_buf_actual); - - // safe loop: end of loop condition - if ((i >= dev->num_configurations) || (r != LIBUSB_SUCCESS)) - break; - - size = sizeof(USB_CONFIGURATION_DESCRIPTOR_SHORT); - memset(&cd_buf_short, 0, size); - - cd_buf_short.req.ConnectionIndex = (ULONG)priv->port; - cd_buf_short.req.SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; - cd_buf_short.req.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; - cd_buf_short.req.SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; - cd_buf_short.req.SetupPacket.wIndex = 0; - cd_buf_short.req.SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); - - // Dummy call to get the required data size. Initial failures are reported as info rather - // than error as they can occur for non-penalizing situations, such as with some hubs. - // coverity[tainted_data_argument] - if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, &cd_buf_short, size, - &cd_buf_short, size, &ret_size, NULL)) { - usbi_info(ctx, "could not access configuration descriptor (dummy) for '%s': %s", device_id, windows_error_str(0)); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - if ((ret_size != size) || (cd_buf_short.data.wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))) { - usbi_info(ctx, "unexpected configuration descriptor size (dummy) for '%s'.", device_id); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - size = sizeof(USB_DESCRIPTOR_REQUEST) + cd_buf_short.data.wTotalLength; - cd_buf_actual = calloc(1, size); - if (cd_buf_actual == NULL) { - usbi_err(ctx, "could not allocate configuration descriptor buffer for '%s'.", device_id); - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - } - - // Actual call - cd_buf_actual->ConnectionIndex = (ULONG)priv->port; - cd_buf_actual->SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; - cd_buf_actual->SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; - cd_buf_actual->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; - cd_buf_actual->SetupPacket.wIndex = 0; - cd_buf_actual->SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); - - if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, cd_buf_actual, size, - cd_buf_actual, size, &ret_size, NULL)) { - usbi_err(ctx, "could not access configuration descriptor (actual) for '%s': %s", device_id, windows_error_str(0)); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - cd_data = (PUSB_CONFIGURATION_DESCRIPTOR)((UCHAR *)cd_buf_actual + sizeof(USB_DESCRIPTOR_REQUEST)); - - if ((size != ret_size) || (cd_data->wTotalLength != cd_buf_short.data.wTotalLength)) { - usbi_err(ctx, "unexpected configuration descriptor size (actual) for '%s'.", device_id); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - if (cd_data->bDescriptorType != USB_CONFIGURATION_DESCRIPTOR_TYPE) { - usbi_err(ctx, "not a configuration descriptor for '%s'", device_id); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - usbi_dbg("cached config descriptor %d (bConfigurationValue=%u, %u bytes)", - i, cd_data->bConfigurationValue, cd_data->wTotalLength); - - // Cache the descriptor - priv->config_descriptor[i] = malloc(cd_data->wTotalLength); - if (priv->config_descriptor[i] == NULL) - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - memcpy(priv->config_descriptor[i], cd_data, cd_data->wTotalLength); - } - return LIBUSB_SUCCESS; -} - -/* - * Populate a libusb device structure - */ -static int init_device(struct libusb_device *dev, struct libusb_device *parent_dev, - uint8_t port_number, char *device_id, DWORD devinst) -{ - HANDLE handle; - DWORD size; - USB_NODE_CONNECTION_INFORMATION_EX conn_info; - USB_NODE_CONNECTION_INFORMATION_EX_V2 conn_info_v2; - struct windows_device_priv *priv, *parent_priv; - struct libusb_context *ctx; - struct libusb_device *tmp_dev; - unsigned long tmp_id; - unsigned i; - - if ((dev == NULL) || (parent_dev == NULL)) - return LIBUSB_ERROR_NOT_FOUND; - - ctx = DEVICE_CTX(dev); - priv = _device_priv(dev); - parent_priv = _device_priv(parent_dev); - if (parent_priv->apib->id != USB_API_HUB) { - usbi_warn(ctx, "parent for device '%s' is not a hub", device_id); - return LIBUSB_ERROR_NOT_FOUND; - } - - // It is possible for the parent hub not to have been initialized yet - // If that's the case, lookup the ancestors to set the bus number - if (parent_dev->bus_number == 0) { - for (i = 2; ; i++) { - tmp_id = get_ancestor_session_id(devinst, i); - if (tmp_id == 0) - break; - - tmp_dev = usbi_get_device_by_session_id(ctx, tmp_id); - if (tmp_dev == NULL) - continue; - - if (tmp_dev->bus_number != 0) { - usbi_dbg("got bus number from ancestor #%u", i); - parent_dev->bus_number = tmp_dev->bus_number; - libusb_unref_device(tmp_dev); - break; - } - - libusb_unref_device(tmp_dev); - } - } - - if (parent_dev->bus_number == 0) { - usbi_err(ctx, "program assertion failed: unable to find ancestor bus number for '%s'", device_id); - return LIBUSB_ERROR_NOT_FOUND; - } - - dev->bus_number = parent_dev->bus_number; - priv->port = port_number; - dev->port_number = port_number; - priv->depth = parent_priv->depth + 1; - dev->parent_dev = parent_dev; - - // If the device address is already set, we can stop here - if (dev->device_address != 0) - return LIBUSB_SUCCESS; - - memset(&conn_info, 0, sizeof(conn_info)); - if (priv->depth != 0) { // Not a HCD hub - handle = CreateFileA(parent_priv->path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, - FILE_FLAG_OVERLAPPED, NULL); - if (handle == INVALID_HANDLE_VALUE) { - usbi_warn(ctx, "could not open hub %s: %s", parent_priv->path, windows_error_str(0)); - return LIBUSB_ERROR_ACCESS; - } - - size = sizeof(conn_info); - conn_info.ConnectionIndex = (ULONG)port_number; - // coverity[tainted_data_argument] - if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, size, - &conn_info, size, &size, NULL)) { - usbi_warn(ctx, "could not get node connection information for device '%s': %s", - device_id, windows_error_str(0)); - CloseHandle(handle); - return LIBUSB_ERROR_NO_DEVICE; - } - - if (conn_info.ConnectionStatus == NoDeviceConnected) { - usbi_err(ctx, "device '%s' is no longer connected!", device_id); - CloseHandle(handle); - return LIBUSB_ERROR_NO_DEVICE; - } - - memcpy(&priv->dev_descriptor, &(conn_info.DeviceDescriptor), sizeof(USB_DEVICE_DESCRIPTOR)); - dev->num_configurations = priv->dev_descriptor.bNumConfigurations; - priv->active_config = conn_info.CurrentConfigurationValue; - usbi_dbg("found %u configurations (active conf: %u)", dev->num_configurations, priv->active_config); - - // If we can't read the config descriptors, just set the number of confs to zero - if (cache_config_descriptors(dev, handle, device_id) != LIBUSB_SUCCESS) { - dev->num_configurations = 0; - priv->dev_descriptor.bNumConfigurations = 0; - } - - // In their great wisdom, Microsoft decided to BREAK the USB speed report between Windows 7 and Windows 8 - if (windows_version >= WINDOWS_8) { - memset(&conn_info_v2, 0, sizeof(conn_info_v2)); - size = sizeof(conn_info_v2); - conn_info_v2.ConnectionIndex = (ULONG)port_number; - conn_info_v2.Length = size; - conn_info_v2.SupportedUsbProtocols.Usb300 = 1; - if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, - &conn_info_v2, size, &conn_info_v2, size, &size, NULL)) { - usbi_warn(ctx, "could not get node connection information (V2) for device '%s': %s", - device_id, windows_error_str(0)); - } else if (conn_info_v2.Flags.DeviceIsOperatingAtSuperSpeedOrHigher) { - conn_info.Speed = 3; - } - } - - CloseHandle(handle); - - if (conn_info.DeviceAddress > UINT8_MAX) - usbi_err(ctx, "program assertion failed: device address overflow"); - - dev->device_address = (uint8_t)conn_info.DeviceAddress + 1; - if (dev->device_address == 1) - usbi_err(ctx, "program assertion failed: device address collision with root hub"); - - switch (conn_info.Speed) { - case 0: dev->speed = LIBUSB_SPEED_LOW; break; - case 1: dev->speed = LIBUSB_SPEED_FULL; break; - case 2: dev->speed = LIBUSB_SPEED_HIGH; break; - case 3: dev->speed = LIBUSB_SPEED_SUPER; break; - default: - usbi_warn(ctx, "Got unknown device speed %u", conn_info.Speed); - break; - } - } else { - dev->device_address = 1; // root hubs are set to use device number 1 - force_hcd_device_descriptor(dev); - } - - usbi_sanitize_device(dev); - - usbi_dbg("(bus: %u, addr: %u, depth: %u, port: %u): '%s'", - dev->bus_number, dev->device_address, priv->depth, priv->port, device_id); - - return LIBUSB_SUCCESS; -} - -// Returns the api type, or 0 if not found/unsupported -static void get_api_type(struct libusb_context *ctx, HDEVINFO *dev_info, - SP_DEVINFO_DATA *dev_info_data, int *api, int *sub_api) -{ - // Precedence for filter drivers vs driver is in the order of this array - struct driver_lookup lookup[3] = { - {"\0\0", SPDRP_SERVICE, "driver"}, - {"\0\0", SPDRP_UPPERFILTERS, "upper filter driver"}, - {"\0\0", SPDRP_LOWERFILTERS, "lower filter driver"} - }; - DWORD size, reg_type; - unsigned k, l; - int i, j; - - *api = USB_API_UNSUPPORTED; - *sub_api = SUB_API_NOTSET; - - // Check the service & filter names to know the API we should use - for (k = 0; k < 3; k++) { - if (pSetupDiGetDeviceRegistryPropertyA(*dev_info, dev_info_data, lookup[k].reg_prop, - ®_type, (BYTE *)lookup[k].list, MAX_KEY_LENGTH, &size)) { - // Turn the REG_SZ SPDRP_SERVICE into REG_MULTI_SZ - if (lookup[k].reg_prop == SPDRP_SERVICE) - // our buffers are MAX_KEY_LENGTH + 1 so we can overflow if needed - lookup[k].list[strlen(lookup[k].list) + 1] = 0; - - // MULTI_SZ is a pain to work with. Turn it into something much more manageable - // NB: none of the driver names we check against contain LIST_SEPARATOR, - // (currently ';'), so even if an unsuported one does, it's not an issue - for (l = 0; (lookup[k].list[l] != 0) || (lookup[k].list[l + 1] != 0); l++) { - if (lookup[k].list[l] == 0) - lookup[k].list[l] = LIST_SEPARATOR; - } - usbi_dbg("%s(s): %s", lookup[k].designation, lookup[k].list); - } else { - if (GetLastError() != ERROR_INVALID_DATA) - usbi_dbg("could not access %s: %s", lookup[k].designation, windows_error_str(0)); - lookup[k].list[0] = 0; - } - } - - for (i = 1; i < USB_API_MAX; i++) { - for (k = 0; k < 3; k++) { - j = get_sub_api(lookup[k].list, i); - if (j >= 0) { - usbi_dbg("matched %s name against %s", lookup[k].designation, - (i != USB_API_WINUSBX) ? usb_api_backend[i].designation : sub_api_name[j]); - *api = i; - *sub_api = j; - return; - } - } - } -} - -static int set_composite_interface(struct libusb_context *ctx, struct libusb_device *dev, - char *dev_interface_path, char *device_id, int api, int sub_api) -{ - unsigned i; - struct windows_device_priv *priv = _device_priv(dev); - int interface_number; - - if (priv->apib->id != USB_API_COMPOSITE) { - usbi_err(ctx, "program assertion failed: '%s' is not composite", device_id); - return LIBUSB_ERROR_NO_DEVICE; - } - - // Because MI_## are not necessarily in sequential order (some composite - // devices will have only MI_00 & MI_03 for instance), we retrieve the actual - // interface number from the path's MI value - interface_number = 0; - for (i = 0; device_id[i] != 0; ) { - if ((device_id[i++] == 'M') && (device_id[i++] == 'I') - && (device_id[i++] == '_')) { - interface_number = (device_id[i++] - '0') * 10; - interface_number += device_id[i] - '0'; - break; - } - } - - if (device_id[i] == 0) - usbi_warn(ctx, "failure to read interface number for %s. Using default value %d", - device_id, interface_number); - - if (priv->usb_interface[interface_number].path != NULL) { - if (api == USB_API_HID) { - // HID devices can have multiple collections (COL##) for each MI_## interface - usbi_dbg("interface[%d] already set - ignoring HID collection: %s", - interface_number, device_id); - return LIBUSB_ERROR_ACCESS; - } - // In other cases, just use the latest data - safe_free(priv->usb_interface[interface_number].path); - } - - usbi_dbg("interface[%d] = %s", interface_number, dev_interface_path); - priv->usb_interface[interface_number].path = dev_interface_path; - priv->usb_interface[interface_number].apib = &usb_api_backend[api]; - priv->usb_interface[interface_number].sub_api = sub_api; - if ((api == USB_API_HID) && (priv->hid == NULL)) { - priv->hid = calloc(1, sizeof(struct hid_device_priv)); - if (priv->hid == NULL) - return LIBUSB_ERROR_NO_MEM; - } - - return LIBUSB_SUCCESS; -} - -static int set_hid_interface(struct libusb_context *ctx, struct libusb_device *dev, - char *dev_interface_path) -{ - int i; - struct windows_device_priv *priv = _device_priv(dev); - - if (priv->hid == NULL) { - usbi_err(ctx, "program assertion failed: parent is not HID"); - return LIBUSB_ERROR_NO_DEVICE; - } else if (priv->hid->nb_interfaces == USB_MAXINTERFACES) { - usbi_err(ctx, "program assertion failed: max USB interfaces reached for HID device"); - return LIBUSB_ERROR_NO_DEVICE; - } - - for (i = 0; i < priv->hid->nb_interfaces; i++) { - if ((priv->usb_interface[i].path != NULL) && strcmp(priv->usb_interface[i].path, dev_interface_path) == 0) { - usbi_dbg("interface[%d] already set to %s", i, dev_interface_path); - return LIBUSB_ERROR_ACCESS; - } - } - - priv->usb_interface[priv->hid->nb_interfaces].path = dev_interface_path; - priv->usb_interface[priv->hid->nb_interfaces].apib = &usb_api_backend[USB_API_HID]; - usbi_dbg("interface[%u] = %s", priv->hid->nb_interfaces, dev_interface_path); - priv->hid->nb_interfaces++; - return LIBUSB_SUCCESS; -} - -/* - * get_device_list: libusb backend device enumeration function - */ -static int windows_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) -{ - struct discovered_devs *discdevs; - HDEVINFO dev_info = { 0 }; - const char *usb_class[] = {"USB", "NUSB3", "IUSB3", "IARUSB3"}; - SP_DEVINFO_DATA dev_info_data = { 0 }; - SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; - GUID hid_guid; -#define MAX_ENUM_GUIDS 64 - const GUID *guid[MAX_ENUM_GUIDS]; -#define HCD_PASS 0 -#define HUB_PASS 1 -#define GEN_PASS 2 -#define DEV_PASS 3 -#define HID_PASS 4 - int r = LIBUSB_SUCCESS; - int api, sub_api; - size_t class_index = 0; - unsigned int nb_guids, pass, i, j, ancestor; - char path[MAX_PATH_LENGTH]; - char strbuf[MAX_PATH_LENGTH]; - struct libusb_device *dev, *parent_dev; - struct windows_device_priv *priv, *parent_priv; - char *dev_interface_path = NULL; - char *dev_id_path = NULL; - unsigned long session_id; - DWORD size, reg_type, port_nr, install_state; - HKEY key; - WCHAR guid_string_w[MAX_GUID_STRING_LENGTH]; - GUID *if_guid; - LONG s; - // Keep a list of newly allocated devs to unref - libusb_device **unref_list, **new_unref_list; - unsigned int unref_size = 64; - unsigned int unref_cur = 0; - - // PASS 1 : (re)enumerate HCDs (allows for HCD hotplug) - // PASS 2 : (re)enumerate HUBS - // PASS 3 : (re)enumerate generic USB devices (including driverless) - // and list additional USB device interface GUIDs to explore - // PASS 4 : (re)enumerate master USB devices that have a device interface - // PASS 5+: (re)enumerate device interfaced GUIDs (including HID) and - // set the device interfaces. - - // Init the GUID table - guid[HCD_PASS] = &GUID_DEVINTERFACE_USB_HOST_CONTROLLER; - guid[HUB_PASS] = &GUID_DEVINTERFACE_USB_HUB; - guid[GEN_PASS] = NULL; - guid[DEV_PASS] = &GUID_DEVINTERFACE_USB_DEVICE; - HidD_GetHidGuid(&hid_guid); - guid[HID_PASS] = &hid_guid; - nb_guids = HID_PASS + 1; - - unref_list = calloc(unref_size, sizeof(libusb_device *)); - if (unref_list == NULL) - return LIBUSB_ERROR_NO_MEM; - - for (pass = 0; ((pass < nb_guids) && (r == LIBUSB_SUCCESS)); pass++) { -//#define ENUM_DEBUG -#if defined(ENABLE_LOGGING) && defined(ENUM_DEBUG) - const char *passname[] = { "HCD", "HUB", "GEN", "DEV", "HID", "EXT" }; - usbi_dbg("#### PROCESSING %ss %s", passname[(pass <= HID_PASS) ? pass : (HID_PASS + 1)], - (pass != GEN_PASS) ? guid_to_string(guid[pass]) : ""); -#endif - for (i = 0; ; i++) { - // safe loop: free up any (unprotected) dynamic resource - // NB: this is always executed before breaking the loop - safe_free(dev_interface_details); - safe_free(dev_interface_path); - safe_free(dev_id_path); - priv = parent_priv = NULL; - dev = parent_dev = NULL; - - // Safe loop: end of loop conditions - if (r != LIBUSB_SUCCESS) - break; - - if ((pass == HCD_PASS) && (i == UINT8_MAX)) { - usbi_warn(ctx, "program assertion failed - found more than %d buses, skipping the rest.", UINT8_MAX); - break; - } - - if (pass != GEN_PASS) { - // Except for GEN, all passes deal with device interfaces - dev_interface_details = get_interface_details(ctx, &dev_info, &dev_info_data, guid[pass], i); - if (dev_interface_details == NULL) - break; - - dev_interface_path = sanitize_path(dev_interface_details->DevicePath); - if (dev_interface_path == NULL) { - usbi_warn(ctx, "could not sanitize device interface path for '%s'", dev_interface_details->DevicePath); - continue; - } - } else { - // Workaround for a Nec/Renesas USB 3.0 driver bug where root hubs are - // being listed under the "NUSB3" PnP Symbolic Name rather than "USB". - // The Intel USB 3.0 driver behaves similar, but uses "IUSB3" - // The Intel Alpine Ridge USB 3.1 driver uses "IARUSB3" - for (; class_index < ARRAYSIZE(usb_class); class_index++) { - if (get_devinfo_data(ctx, &dev_info, &dev_info_data, usb_class[class_index], i)) - break; - i = 0; - } - if (class_index >= ARRAYSIZE(usb_class)) - break; - } - - // Read the Device ID path. This is what we'll use as UID - // Note that if the device is plugged in a different port or hub, the Device ID changes - if (CM_Get_Device_IDA(dev_info_data.DevInst, path, sizeof(path), 0) != CR_SUCCESS) { - usbi_warn(ctx, "could not read the device id path for devinst %X, skipping", - (unsigned int)dev_info_data.DevInst); - continue; - } - - dev_id_path = sanitize_path(path); - if (dev_id_path == NULL) { - usbi_warn(ctx, "could not sanitize device id path for devinst %X, skipping", - (unsigned int)dev_info_data.DevInst); - continue; - } -#ifdef ENUM_DEBUG - usbi_dbg("PRO: %s", dev_id_path); -#endif - - // The SPDRP_ADDRESS for USB devices is the device port number on the hub - port_nr = 0; - if ((pass >= HUB_PASS) && (pass <= GEN_PASS)) { - if ((!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ADDRESS, - ®_type, (BYTE *)&port_nr, 4, &size)) || (size != 4)) { - usbi_warn(ctx, "could not retrieve port number for device '%s', skipping: %s", - dev_id_path, windows_error_str(0)); - continue; - } - } - - // Set API to use or get additional data from generic pass - api = USB_API_UNSUPPORTED; - sub_api = SUB_API_NOTSET; - switch (pass) { - case HCD_PASS: - break; - case GEN_PASS: - // We use the GEN pass to detect driverless devices... - size = sizeof(strbuf); - if (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_DRIVER, - ®_type, (BYTE *)strbuf, size, &size)) { - usbi_info(ctx, "The following device has no driver: '%s'", dev_id_path); - usbi_info(ctx, "libusb will not be able to access it."); - } - // ...and to add the additional device interface GUIDs - key = pSetupDiOpenDevRegKey(dev_info, &dev_info_data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); - if (key != INVALID_HANDLE_VALUE) { - size = sizeof(guid_string_w); - s = pRegQueryValueExW(key, L"DeviceInterfaceGUIDs", NULL, ®_type, - (BYTE *)guid_string_w, &size); - pRegCloseKey(key); - if (s == ERROR_SUCCESS) { - if (nb_guids >= MAX_ENUM_GUIDS) { - // If this assert is ever reported, grow a GUID table dynamically - usbi_err(ctx, "program assertion failed: too many GUIDs"); - LOOP_BREAK(LIBUSB_ERROR_OVERFLOW); - } - if_guid = calloc(1, sizeof(GUID)); - if (if_guid == NULL) { - usbi_err(ctx, "could not calloc for if_guid: not enough memory"); - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - } - pCLSIDFromString(guid_string_w, if_guid); - guid[nb_guids++] = if_guid; - usbi_dbg("extra GUID: %s", guid_to_string(if_guid)); - } - } - break; - case HID_PASS: - api = USB_API_HID; - break; - default: - // Get the API type (after checking that the driver installation is OK) - if ((!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_INSTALL_STATE, - ®_type, (BYTE *)&install_state, 4, &size)) || (size != 4)) { - usbi_warn(ctx, "could not detect installation state of driver for '%s': %s", - dev_id_path, windows_error_str(0)); - } else if (install_state != 0) { - usbi_warn(ctx, "driver for device '%s' is reporting an issue (code: %u) - skipping", - dev_id_path, (unsigned int)install_state); - continue; - } - get_api_type(ctx, &dev_info, &dev_info_data, &api, &sub_api); - break; - } - - // Find parent device (for the passes that need it) - switch (pass) { - case HCD_PASS: - case DEV_PASS: - case HUB_PASS: - break; - default: - // Go through the ancestors until we see a face we recognize - parent_dev = NULL; - for (ancestor = 1; parent_dev == NULL; ancestor++) { - session_id = get_ancestor_session_id(dev_info_data.DevInst, ancestor); - if (session_id == 0) - break; - - parent_dev = usbi_get_device_by_session_id(ctx, session_id); - } - - if (parent_dev == NULL) { - usbi_dbg("unlisted ancestor for '%s' (non USB HID, newly connected, etc.) - ignoring", dev_id_path); - continue; - } - - parent_priv = _device_priv(parent_dev); - // virtual USB devices are also listed during GEN - don't process these yet - if ((pass == GEN_PASS) && (parent_priv->apib->id != USB_API_HUB)) { - libusb_unref_device(parent_dev); - continue; - } - - break; - } - - // Create new or match existing device, using the (hashed) device_id as session id - if (pass <= DEV_PASS) { // For subsequent passes, we'll lookup the parent - // These are the passes that create "new" devices - session_id = htab_hash(dev_id_path); - dev = usbi_get_device_by_session_id(ctx, session_id); - if (dev == NULL) { - if (pass == DEV_PASS) { - // This can occur if the OS only reports a newly plugged device after we started enum - usbi_warn(ctx, "'%s' was only detected in late pass (newly connected device?)" - " - ignoring", dev_id_path); - continue; - } - - usbi_dbg("allocating new device for session [%lX]", session_id); - dev = usbi_alloc_device(ctx, session_id); - if (dev == NULL) - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - - priv = windows_device_priv_init(dev); - } else { - usbi_dbg("found existing device for session [%lX] (%u.%u)", - session_id, dev->bus_number, dev->device_address); - - priv = _device_priv(dev); - if ((parent_dev != NULL) && (dev->parent_dev != NULL)) { - if (dev->parent_dev != parent_dev) { - // It is possible for the actual parent device to not have existed at the - // time of enumeration, so the currently assigned parent may in fact be a - // grandparent. If the devices differ, we assume the "new" parent device - // is in fact closer to the device. - usbi_dbg("updating parent device [session %lX -> %lX]", - dev->parent_dev->session_data, parent_dev->session_data); - libusb_unref_device(dev->parent_dev); - dev->parent_dev = parent_dev; - } else { - // We hold a reference to parent_dev instance, but this device already - // has a parent_dev reference (only one per child) - libusb_unref_device(parent_dev); - } - } - } - - // Keep track of devices that need unref - unref_list[unref_cur++] = dev; - if (unref_cur >= unref_size) { - unref_size += 64; - new_unref_list = usbi_reallocf(unref_list, unref_size * sizeof(libusb_device *)); - if (new_unref_list == NULL) { - usbi_err(ctx, "could not realloc list for unref - aborting."); - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - } else { - unref_list = new_unref_list; - } - } - } - - // Setup device - switch (pass) { - case HCD_PASS: - // If the hcd has already been setup, don't do it again - if (priv->path != NULL) - break; - dev->bus_number = (uint8_t)(i + 1); // bus 0 is reserved for disconnected - dev->device_address = 0; - dev->num_configurations = 0; - priv->apib = &usb_api_backend[USB_API_HUB]; - priv->sub_api = SUB_API_NOTSET; - priv->depth = UINT8_MAX; // Overflow to 0 for HCD Hubs - priv->path = dev_interface_path; - dev_interface_path = NULL; - break; - case HUB_PASS: - case DEV_PASS: - // If the device has already been setup, don't do it again - if (priv->path != NULL) - break; - // Take care of API initialization - priv->path = dev_interface_path; - dev_interface_path = NULL; - priv->apib = &usb_api_backend[api]; - priv->sub_api = sub_api; - switch(api) { - case USB_API_COMPOSITE: - case USB_API_HUB: - break; - case USB_API_HID: - priv->hid = calloc(1, sizeof(struct hid_device_priv)); - if (priv->hid == NULL) - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - - priv->hid->nb_interfaces = 0; - break; - default: - // For other devices, the first interface is the same as the device - priv->usb_interface[0].path = _strdup(priv->path); - if (priv->usb_interface[0].path == NULL) - usbi_warn(ctx, "could not duplicate interface path '%s'", priv->path); - // The following is needed if we want API calls to work for both simple - // and composite devices. - for (j = 0; j < USB_MAXINTERFACES; j++) - priv->usb_interface[j].apib = &usb_api_backend[api]; - - break; - } - break; - case GEN_PASS: - r = init_device(dev, parent_dev, (uint8_t)port_nr, dev_id_path, dev_info_data.DevInst); - if (r == LIBUSB_SUCCESS) { - // Append device to the list of discovered devices - discdevs = discovered_devs_append(*_discdevs, dev); - if (!discdevs) - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - - *_discdevs = discdevs; - } else if (r == LIBUSB_ERROR_NO_DEVICE) { - // This can occur if the device was disconnected but Windows hasn't - // refreshed its enumeration yet - in that case, we ignore the device - r = LIBUSB_SUCCESS; - } - break; - default: // HID_PASS and later - if (parent_priv->apib->id == USB_API_HID || parent_priv->apib->id == USB_API_COMPOSITE) { - if (parent_priv->apib->id == USB_API_HID) { - usbi_dbg("setting HID interface for [%lX]:", parent_dev->session_data); - r = set_hid_interface(ctx, parent_dev, dev_interface_path); - } else { - usbi_dbg("setting composite interface for [%lX]:", parent_dev->session_data); - r = set_composite_interface(ctx, parent_dev, dev_interface_path, dev_id_path, api, sub_api); - } - switch (r) { - case LIBUSB_SUCCESS: - dev_interface_path = NULL; - break; - case LIBUSB_ERROR_ACCESS: - // interface has already been set => make sure dev_interface_path is freed then - r = LIBUSB_SUCCESS; - break; - default: - LOOP_BREAK(r); - break; - } - } - libusb_unref_device(parent_dev); - break; - } - } - } - - // Free any additional GUIDs - for (pass = HID_PASS + 1; pass < nb_guids; pass++) - free((void *)guid[pass]); - - // Unref newly allocated devs - for (i = 0; i < unref_cur; i++) - libusb_unref_device(unref_list[i]); - free(unref_list); - - return r; -} - -/* - * exit: libusb backend deinitialization function - */ -static void windows_exit(void) -{ - int i; - HANDLE semaphore; - char sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' - - sprintf(sem_name, "libusb_init%08X", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); - semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); - if (semaphore == NULL) - return; - - // A successful wait brings our semaphore count to 0 (unsignaled) - // => any concurent wait stalls until the semaphore release - if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { - CloseHandle(semaphore); - return; - } - - // Only works if exits and inits are balanced exactly - if (--concurrent_usage < 0) { // Last exit - for (i = 0; i < USB_API_MAX; i++) - usb_api_backend[i].exit(SUB_API_NOTSET); - exit_dlls(); - exit_polling(); - windows_common_exit(); - usbi_mutex_destroy(&autoclaim_lock); - } - - ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 - CloseHandle(semaphore); -} - -static int windows_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) -{ - struct windows_device_priv *priv = _device_priv(dev); - - memcpy(buffer, &priv->dev_descriptor, DEVICE_DESC_LENGTH); - *host_endian = 0; - - return LIBUSB_SUCCESS; -} - -static int windows_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) -{ - struct windows_device_priv *priv = _device_priv(dev); - PUSB_CONFIGURATION_DESCRIPTOR config_header; - size_t size; - - // config index is zero based - if (config_index >= dev->num_configurations) - return LIBUSB_ERROR_INVALID_PARAM; - - if ((priv->config_descriptor == NULL) || (priv->config_descriptor[config_index] == NULL)) - return LIBUSB_ERROR_NOT_FOUND; - - config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[config_index]; - - size = MIN(config_header->wTotalLength, len); - memcpy(buffer, priv->config_descriptor[config_index], size); - *host_endian = 0; - - return (int)size; -} - -static int windows_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue, - unsigned char **buffer, int *host_endian) -{ - struct windows_device_priv *priv = _device_priv(dev); - PUSB_CONFIGURATION_DESCRIPTOR config_header; - uint8_t index; - - *buffer = NULL; - *host_endian = 0; - - if (priv->config_descriptor == NULL) - return LIBUSB_ERROR_NOT_FOUND; - - for (index = 0; index < dev->num_configurations; index++) { - config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[index]; - if (config_header->bConfigurationValue == bConfigurationValue) { - *buffer = priv->config_descriptor[index]; - return (int)config_header->wTotalLength; - } - } - - return LIBUSB_ERROR_NOT_FOUND; -} - -/* - * return the cached copy of the active config descriptor - */ -static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) -{ - struct windows_device_priv *priv = _device_priv(dev); - unsigned char *config_desc; - int r; - - if (priv->active_config == 0) - return LIBUSB_ERROR_NOT_FOUND; - - r = windows_get_config_descriptor_by_value(dev, priv->active_config, &config_desc, host_endian); - if (r < 0) - return r; - - len = MIN((size_t)r, len); - memcpy(buffer, config_desc, len); - return (int)len; -} - -static int windows_open(struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - - if (priv->apib == NULL) { - usbi_err(ctx, "program assertion failed - device is not initialized"); - return LIBUSB_ERROR_NO_DEVICE; - } - - return priv->apib->open(SUB_API_NOTSET, dev_handle); -} - -static void windows_close(struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - priv->apib->close(SUB_API_NOTSET, dev_handle); -} - -static int windows_get_configuration(struct libusb_device_handle *dev_handle, int *config) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - if (priv->active_config == 0) { - *config = 0; - return LIBUSB_ERROR_NOT_FOUND; - } - - *config = priv->active_config; - return LIBUSB_SUCCESS; -} - -/* - * from http://msdn.microsoft.com/en-us/library/ms793522.aspx: "The port driver - * does not currently expose a service that allows higher-level drivers to set - * the configuration." - */ -static int windows_set_configuration(struct libusb_device_handle *dev_handle, int config) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int r = LIBUSB_SUCCESS; - - if (config >= USB_MAXCONFIG) - return LIBUSB_ERROR_INVALID_PARAM; - - r = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_OUT | - LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_RECIPIENT_DEVICE, - LIBUSB_REQUEST_SET_CONFIGURATION, (uint16_t)config, - 0, NULL, 0, 1000); - - if (r == LIBUSB_SUCCESS) - priv->active_config = (uint8_t)config; - - return r; -} - -static int windows_claim_interface(struct libusb_device_handle *dev_handle, int iface) -{ - int r = LIBUSB_SUCCESS; - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - safe_free(priv->usb_interface[iface].endpoint); - priv->usb_interface[iface].nb_endpoints = 0; - - r = priv->apib->claim_interface(SUB_API_NOTSET, dev_handle, iface); - - if (r == LIBUSB_SUCCESS) - r = windows_assign_endpoints(dev_handle, iface, 0); - - return r; -} - -static int windows_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - int r = LIBUSB_SUCCESS; - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - safe_free(priv->usb_interface[iface].endpoint); - priv->usb_interface[iface].nb_endpoints = 0; - - r = priv->apib->set_interface_altsetting(SUB_API_NOTSET, dev_handle, iface, altsetting); - - if (r == LIBUSB_SUCCESS) - r = windows_assign_endpoints(dev_handle, iface, altsetting); - - return r; -} - -static int windows_release_interface(struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - return priv->apib->release_interface(SUB_API_NOTSET, dev_handle, iface); -} - -static int windows_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - return priv->apib->clear_halt(SUB_API_NOTSET, dev_handle, endpoint); -} - -static int windows_reset_device(struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - return priv->apib->reset_device(SUB_API_NOTSET, dev_handle); -} - -// The 3 functions below are unlikely to ever get supported on Windows -static int windows_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface) -{ - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int windows_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) -{ - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int windows_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) -{ - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static void windows_destroy_device(struct libusb_device *dev) -{ - windows_device_priv_release(dev); -} - -void windows_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - - usbi_free_fd(&transfer_priv->pollable_fd); - safe_free(transfer_priv->hid_buffer); - // When auto claim is in use, attempt to release the auto-claimed interface - auto_release(itransfer); -} - -static int submit_bulk_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int r; - - r = priv->apib->submit_bulk_transfer(SUB_API_NOTSET, itransfer); - if (r != LIBUSB_SUCCESS) - return r; - - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, - (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); - - return LIBUSB_SUCCESS; -} - -static int submit_iso_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int r; - - r = priv->apib->submit_iso_transfer(SUB_API_NOTSET, itransfer); - if (r != LIBUSB_SUCCESS) - return r; - - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, - (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); - - return LIBUSB_SUCCESS; -} - -static int submit_control_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int r; - - r = priv->apib->submit_control_transfer(SUB_API_NOTSET, itransfer); - if (r != LIBUSB_SUCCESS) - return r; - - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN); - - return LIBUSB_SUCCESS; -} - -static int windows_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - return submit_control_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - if (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)) - return LIBUSB_ERROR_NOT_SUPPORTED; - return submit_bulk_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return submit_iso_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - return LIBUSB_ERROR_NOT_SUPPORTED; - default: - usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static int windows_abort_control(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->apib->abort_control(SUB_API_NOTSET, itransfer); -} - -static int windows_abort_transfers(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->apib->abort_transfers(SUB_API_NOTSET, itransfer); -} - -static int windows_cancel_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - return windows_abort_control(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return windows_abort_transfers(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - return LIBUSB_ERROR_NOT_SUPPORTED; - default: - usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - return priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); -} - -struct winfd *windows_get_fd(struct usbi_transfer *transfer) -{ - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(transfer); - return &transfer_priv->pollable_fd; -} - -void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size) -{ - if (HasOverlappedIoCompletedSync(pollable_fd->overlapped)) { - *io_result = NO_ERROR; - *io_size = (DWORD)pollable_fd->overlapped->InternalHigh; - } else if (GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { - // Regular async overlapped - *io_result = NO_ERROR; - } else { - *io_result = GetLastError(); - } -} - -// NB: MSVC6 does not support named initializers. -const struct usbi_os_backend windows_backend = { - "Windows", - USBI_CAP_HAS_HID_ACCESS, - windows_init, - windows_exit, - - windows_get_device_list, - NULL, /* hotplug_poll */ - windows_open, - windows_close, - - windows_get_device_descriptor, - windows_get_active_config_descriptor, - windows_get_config_descriptor, - windows_get_config_descriptor_by_value, - - windows_get_configuration, - windows_set_configuration, - windows_claim_interface, - windows_release_interface, - - windows_set_interface_altsetting, - windows_clear_halt, - windows_reset_device, - - NULL, /* alloc_streams */ - NULL, /* free_streams */ - - NULL, /* dev_mem_alloc */ - NULL, /* dev_mem_free */ - - windows_kernel_driver_active, - windows_detach_kernel_driver, - windows_attach_kernel_driver, - - windows_destroy_device, - - windows_submit_transfer, - windows_cancel_transfer, - windows_clear_transfer_priv, - - windows_handle_events, - NULL, - - windows_clock_gettime, -#if defined(USBI_TIMERFD_AVAILABLE) - NULL, -#endif - sizeof(struct windows_device_priv), - sizeof(struct windows_device_handle_priv), - sizeof(struct windows_transfer_priv), -}; - - -/* - * USB API backends - */ -static int unsupported_init(int sub_api, struct libusb_context *ctx) -{ - return LIBUSB_SUCCESS; -} - -static int unsupported_exit(int sub_api) -{ - return LIBUSB_SUCCESS; -} - -static int unsupported_open(int sub_api, struct libusb_device_handle *dev_handle) -{ - PRINT_UNSUPPORTED_API(open); -} - -static void unsupported_close(int sub_api, struct libusb_device_handle *dev_handle) -{ - usbi_dbg("unsupported API call for 'close'"); -} - -static int unsupported_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - PRINT_UNSUPPORTED_API(configure_endpoints); -} - -static int unsupported_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - PRINT_UNSUPPORTED_API(claim_interface); -} - -static int unsupported_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - PRINT_UNSUPPORTED_API(set_interface_altsetting); -} - -static int unsupported_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - PRINT_UNSUPPORTED_API(release_interface); -} - -static int unsupported_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - PRINT_UNSUPPORTED_API(clear_halt); -} - -static int unsupported_reset_device(int sub_api, struct libusb_device_handle *dev_handle) -{ - PRINT_UNSUPPORTED_API(reset_device); -} - -static int unsupported_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(submit_bulk_transfer); -} - -static int unsupported_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(submit_iso_transfer); -} - -static int unsupported_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(submit_control_transfer); -} - -static int unsupported_abort_control(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(abort_control); -} - -static int unsupported_abort_transfers(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(abort_transfers); -} - -static int unsupported_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) -{ - PRINT_UNSUPPORTED_API(copy_transfer_data); -} - -static int common_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - return LIBUSB_SUCCESS; -} - -// These names must be uppercase -static const char *hub_driver_names[] = {"USBHUB", "USBHUB3", "USB3HUB", "NUSB3HUB", "RUSB3HUB", "FLXHCIH", "TIHUB3", "ETRONHUB3", "VIAHUB3", "ASMTHUB3", "IUSB3HUB", "VUSB3HUB", "AMDHUB30", "VHHUB", "AUSB3HUB"}; -static const char *composite_driver_names[] = {"USBCCGP"}; -static const char *winusbx_driver_names[] = WINUSBX_DRV_NAMES; -static const char *hid_driver_names[] = {"HIDUSB", "MOUHID", "KBDHID"}; -const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { - { - USB_API_UNSUPPORTED, - "Unsupported API", - NULL, - 0, - unsupported_init, - unsupported_exit, - unsupported_open, - unsupported_close, - unsupported_configure_endpoints, - unsupported_claim_interface, - unsupported_set_interface_altsetting, - unsupported_release_interface, - unsupported_clear_halt, - unsupported_reset_device, - unsupported_submit_bulk_transfer, - unsupported_submit_iso_transfer, - unsupported_submit_control_transfer, - unsupported_abort_control, - unsupported_abort_transfers, - unsupported_copy_transfer_data, - }, - { - USB_API_HUB, - "HUB API", - hub_driver_names, - ARRAYSIZE(hub_driver_names), - unsupported_init, - unsupported_exit, - unsupported_open, - unsupported_close, - unsupported_configure_endpoints, - unsupported_claim_interface, - unsupported_set_interface_altsetting, - unsupported_release_interface, - unsupported_clear_halt, - unsupported_reset_device, - unsupported_submit_bulk_transfer, - unsupported_submit_iso_transfer, - unsupported_submit_control_transfer, - unsupported_abort_control, - unsupported_abort_transfers, - unsupported_copy_transfer_data, - }, - { - USB_API_COMPOSITE, - "Composite API", - composite_driver_names, - ARRAYSIZE(composite_driver_names), - composite_init, - composite_exit, - composite_open, - composite_close, - common_configure_endpoints, - composite_claim_interface, - composite_set_interface_altsetting, - composite_release_interface, - composite_clear_halt, - composite_reset_device, - composite_submit_bulk_transfer, - composite_submit_iso_transfer, - composite_submit_control_transfer, - composite_abort_control, - composite_abort_transfers, - composite_copy_transfer_data, - }, - { - USB_API_WINUSBX, - "WinUSB-like APIs", - winusbx_driver_names, - ARRAYSIZE(winusbx_driver_names), - winusbx_init, - winusbx_exit, - winusbx_open, - winusbx_close, - winusbx_configure_endpoints, - winusbx_claim_interface, - winusbx_set_interface_altsetting, - winusbx_release_interface, - winusbx_clear_halt, - winusbx_reset_device, - winusbx_submit_bulk_transfer, - unsupported_submit_iso_transfer, - winusbx_submit_control_transfer, - winusbx_abort_control, - winusbx_abort_transfers, - winusbx_copy_transfer_data, - }, - { - USB_API_HID, - "HID API", - hid_driver_names, - ARRAYSIZE(hid_driver_names), - hid_init, - hid_exit, - hid_open, - hid_close, - common_configure_endpoints, - hid_claim_interface, - hid_set_interface_altsetting, - hid_release_interface, - hid_clear_halt, - hid_reset_device, - hid_submit_bulk_transfer, - unsupported_submit_iso_transfer, - hid_submit_control_transfer, - hid_abort_transfers, - hid_abort_transfers, - hid_copy_transfer_data, - }, -}; - - -/* - * WinUSB-like (WinUSB, libusb0/libusbK through libusbk DLL) API functions - */ -#define WinUSBX_Set(fn) \ - do { \ - if (native_winusb) \ - WinUSBX[i].fn = (WinUsb_##fn##_t)GetProcAddress(h, "WinUsb_" #fn); \ - else \ - pLibK_GetProcAddress((PVOID *)&WinUSBX[i].fn, i, KUSB_FNID_##fn); \ - } while (0) - -static int winusbx_init(int sub_api, struct libusb_context *ctx) -{ - HMODULE h; - bool native_winusb; - int i; - KLIB_VERSION LibK_Version; - LibK_GetProcAddress_t pLibK_GetProcAddress = NULL; - LibK_GetVersion_t pLibK_GetVersion; - - h = LoadLibraryA("libusbK"); - - if (h == NULL) { - usbi_info(ctx, "libusbK DLL is not available, will use native WinUSB"); - h = LoadLibraryA("WinUSB"); - - if (h == NULL) { - usbi_warn(ctx, "WinUSB DLL is not available either, " - "you will not be able to access devices outside of enumeration"); - return LIBUSB_ERROR_NOT_FOUND; - } - } else { - usbi_dbg("using libusbK DLL for universal access"); - pLibK_GetVersion = (LibK_GetVersion_t)GetProcAddress(h, "LibK_GetVersion"); - if (pLibK_GetVersion != NULL) { - pLibK_GetVersion(&LibK_Version); - usbi_dbg("libusbK version: %d.%d.%d.%d", LibK_Version.Major, LibK_Version.Minor, - LibK_Version.Micro, LibK_Version.Nano); - } - pLibK_GetProcAddress = (LibK_GetProcAddress_t)GetProcAddress(h, "LibK_GetProcAddress"); - if (pLibK_GetProcAddress == NULL) { - usbi_err(ctx, "LibK_GetProcAddress() not found in libusbK DLL"); - FreeLibrary(h); - return LIBUSB_ERROR_NOT_FOUND; - } - } - - native_winusb = (pLibK_GetProcAddress == NULL); - for (i = SUB_API_LIBUSBK; i < SUB_API_MAX; i++) { - WinUSBX_Set(AbortPipe); - WinUSBX_Set(ControlTransfer); - WinUSBX_Set(FlushPipe); - WinUSBX_Set(Free); - WinUSBX_Set(GetAssociatedInterface); - WinUSBX_Set(GetCurrentAlternateSetting); - WinUSBX_Set(GetDescriptor); - WinUSBX_Set(GetOverlappedResult); - WinUSBX_Set(GetPipePolicy); - WinUSBX_Set(GetPowerPolicy); - WinUSBX_Set(Initialize); - WinUSBX_Set(QueryDeviceInformation); - WinUSBX_Set(QueryInterfaceSettings); - WinUSBX_Set(QueryPipe); - WinUSBX_Set(ReadPipe); - WinUSBX_Set(ResetPipe); - WinUSBX_Set(SetCurrentAlternateSetting); - WinUSBX_Set(SetPipePolicy); - WinUSBX_Set(SetPowerPolicy); - WinUSBX_Set(WritePipe); - if (!native_winusb) - WinUSBX_Set(ResetDevice); - - if (WinUSBX[i].Initialize != NULL) { - WinUSBX[i].initialized = true; - usbi_dbg("initalized sub API %s", sub_api_name[i]); - } else { - usbi_warn(ctx, "Failed to initalize sub API %s", sub_api_name[i]); - WinUSBX[i].initialized = false; - } - } - - WinUSBX_handle = h; - return LIBUSB_SUCCESS; -} - -static int winusbx_exit(int sub_api) -{ - if (WinUSBX_handle != NULL) { - FreeLibrary(WinUSBX_handle); - WinUSBX_handle = NULL; - - /* Reset the WinUSBX API structures */ - memset(&WinUSBX, 0, sizeof(WinUSBX)); - } - - return LIBUSB_SUCCESS; -} - -// NB: open and close must ensure that they only handle interface of -// the right API type, as these functions can be called wholesale from -// composite_open(), with interfaces belonging to different APIs -static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - - HANDLE file_handle; - int i; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - // WinUSB requires a separate handle for each interface - for (i = 0; i < USB_MAXINTERFACES; i++) { - if ((priv->usb_interface[i].path != NULL) - && (priv->usb_interface[i].apib->id == USB_API_WINUSBX)) { - file_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); - if (file_handle == INVALID_HANDLE_VALUE) { - usbi_err(ctx, "could not open device %s (interface %d): %s", priv->usb_interface[i].path, i, windows_error_str(0)); - switch(GetLastError()) { - case ERROR_FILE_NOT_FOUND: // The device was disconnected - return LIBUSB_ERROR_NO_DEVICE; - case ERROR_ACCESS_DENIED: - return LIBUSB_ERROR_ACCESS; - default: - return LIBUSB_ERROR_IO; - } - } - handle_priv->interface_handle[i].dev_handle = file_handle; - } - } - - return LIBUSB_SUCCESS; -} - -static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE handle; - int i; - - if (sub_api == SUB_API_NOTSET) - sub_api = priv->sub_api; - - if (!WinUSBX[sub_api].initialized) - return; - - if (priv->apib->id == USB_API_COMPOSITE) { - // If this is a composite device, just free and close all WinUSB-like - // interfaces directly (each is independent and not associated with another) - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (priv->usb_interface[i].apib->id == USB_API_WINUSBX) { - handle = handle_priv->interface_handle[i].api_handle; - if (HANDLE_VALID(handle)) - WinUSBX[sub_api].Free(handle); - - handle = handle_priv->interface_handle[i].dev_handle; - if (HANDLE_VALID(handle)) - CloseHandle(handle); - } - } - } else { - // If this is a WinUSB device, free all interfaces above interface 0, - // then free and close interface 0 last - for (i = 1; i < USB_MAXINTERFACES; i++) { - handle = handle_priv->interface_handle[i].api_handle; - if (HANDLE_VALID(handle)) - WinUSBX[sub_api].Free(handle); - } - handle = handle_priv->interface_handle[0].api_handle; - if (HANDLE_VALID(handle)) - WinUSBX[sub_api].Free(handle); - - handle = handle_priv->interface_handle[0].dev_handle; - if (HANDLE_VALID(handle)) - CloseHandle(handle); - } -} - -static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE winusb_handle = handle_priv->interface_handle[iface].api_handle; - UCHAR policy; - ULONG timeout = 0; - uint8_t endpoint_address; - int i; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - // With handle and enpoints set (in parent), we can setup the default pipe properties - // see http://download.microsoft.com/download/D/1/D/D1DD7745-426B-4CC3-A269-ABBBE427C0EF/DVC-T705_DDC08.pptx - for (i = -1; i < priv->usb_interface[iface].nb_endpoints; i++) { - endpoint_address = (i == -1) ? 0 : priv->usb_interface[iface].endpoint[i]; - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - PIPE_TRANSFER_TIMEOUT, sizeof(ULONG), &timeout)) - usbi_dbg("failed to set PIPE_TRANSFER_TIMEOUT for control endpoint %02X", endpoint_address); - - if ((i == -1) || (sub_api == SUB_API_LIBUSB0)) - continue; // Other policies don't apply to control endpoint or libusb0 - - policy = false; - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - SHORT_PACKET_TERMINATE, sizeof(UCHAR), &policy)) - usbi_dbg("failed to disable SHORT_PACKET_TERMINATE for endpoint %02X", endpoint_address); - - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - IGNORE_SHORT_PACKETS, sizeof(UCHAR), &policy)) - usbi_dbg("failed to disable IGNORE_SHORT_PACKETS for endpoint %02X", endpoint_address); - - policy = true; - /* ALLOW_PARTIAL_READS must be enabled due to likely libusbK bug. See: - https://sourceforge.net/mailarchive/message.php?msg_id=29736015 */ - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - ALLOW_PARTIAL_READS, sizeof(UCHAR), &policy)) - usbi_dbg("failed to enable ALLOW_PARTIAL_READS for endpoint %02X", endpoint_address); - - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - AUTO_CLEAR_STALL, sizeof(UCHAR), &policy)) - usbi_dbg("failed to enable AUTO_CLEAR_STALL for endpoint %02X", endpoint_address); - } - - return LIBUSB_SUCCESS; -} - -static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - bool is_using_usbccgp = (priv->apib->id == USB_API_COMPOSITE); - SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; - HDEVINFO dev_info = INVALID_HANDLE_VALUE; - SP_DEVINFO_DATA dev_info_data; - char *dev_path_no_guid = NULL; - char filter_path[] = "\\\\.\\libusb0-0000"; - bool found_filter = false; - HANDLE file_handle, winusb_handle; - DWORD err; - int i; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - // If the device is composite, but using the default Windows composite parent driver (usbccgp) - // or if it's the first WinUSB-like interface, we get a handle through Initialize(). - if ((is_using_usbccgp) || (iface == 0)) { - // composite device (independent interfaces) or interface 0 - file_handle = handle_priv->interface_handle[iface].dev_handle; - if (!HANDLE_VALID(file_handle)) - return LIBUSB_ERROR_NOT_FOUND; - - if (!WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { - handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; - err = GetLastError(); - switch(err) { - case ERROR_BAD_COMMAND: - // The device was disconnected - usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - default: - // it may be that we're using the libusb0 filter driver. - // TODO: can we move this whole business into the K/0 DLL? - for (i = 0; ; i++) { - safe_free(dev_interface_details); - safe_free(dev_path_no_guid); - - dev_interface_details = get_interface_details_filter(ctx, &dev_info, &dev_info_data, &GUID_DEVINTERFACE_LIBUSB0_FILTER, i, filter_path); - if ((found_filter) || (dev_interface_details == NULL)) - break; - - // ignore GUID part - dev_path_no_guid = sanitize_path(strtok(dev_interface_details->DevicePath, "{")); - if (dev_path_no_guid == NULL) - continue; - - if (strncmp(dev_path_no_guid, priv->usb_interface[iface].path, strlen(dev_path_no_guid)) == 0) { - file_handle = CreateFileA(filter_path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); - if (file_handle != INVALID_HANDLE_VALUE) { - if (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { - // Replace the existing file handle with the working one - CloseHandle(handle_priv->interface_handle[iface].dev_handle); - handle_priv->interface_handle[iface].dev_handle = file_handle; - found_filter = true; - } else { - usbi_err(ctx, "could not initialize filter driver for %s", filter_path); - CloseHandle(file_handle); - } - } else { - usbi_err(ctx, "could not open device %s: %s", filter_path, windows_error_str(0)); - } - } - } - free(dev_interface_details); - if (!found_filter) { - usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(err)); - return LIBUSB_ERROR_ACCESS; - } - } - } - handle_priv->interface_handle[iface].api_handle = winusb_handle; - } else { - // For all other interfaces, use GetAssociatedInterface() - winusb_handle = handle_priv->interface_handle[0].api_handle; - // It is a requirement for multiple interface devices on Windows that, to you - // must first claim the first interface before you claim the others - if (!HANDLE_VALID(winusb_handle)) { - file_handle = handle_priv->interface_handle[0].dev_handle; - if (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { - handle_priv->interface_handle[0].api_handle = winusb_handle; - usbi_warn(ctx, "auto-claimed interface 0 (required to claim %d with WinUSB)", iface); - } else { - usbi_warn(ctx, "failed to auto-claim interface 0 (required to claim %d with WinUSB): %s", iface, windows_error_str(0)); - return LIBUSB_ERROR_ACCESS; - } - } - if (!WinUSBX[sub_api].GetAssociatedInterface(winusb_handle, (UCHAR)(iface - 1), - &handle_priv->interface_handle[iface].api_handle)) { - handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; - switch(GetLastError()) { - case ERROR_NO_MORE_ITEMS: // invalid iface - return LIBUSB_ERROR_NOT_FOUND; - case ERROR_BAD_COMMAND: // The device was disconnected - return LIBUSB_ERROR_NO_DEVICE; - case ERROR_ALREADY_EXISTS: // already claimed - return LIBUSB_ERROR_BUSY; - default: - usbi_err(ctx, "could not claim interface %d: %s", iface, windows_error_str(0)); - return LIBUSB_ERROR_ACCESS; - } - } - } - usbi_dbg("claimed interface %d", iface); - handle_priv->active_interface = iface; - - return LIBUSB_SUCCESS; -} - -static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE winusb_handle; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - winusb_handle = handle_priv->interface_handle[iface].api_handle; - if (!HANDLE_VALID(winusb_handle)) - return LIBUSB_ERROR_NOT_FOUND; - - WinUSBX[sub_api].Free(winusb_handle); - handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; - - return LIBUSB_SUCCESS; -} - -/* - * Return the first valid interface (of the same API type), for control transfers - */ -static int get_valid_interface(struct libusb_device_handle *dev_handle, int api_id) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int i; - - if ((api_id < USB_API_WINUSBX) || (api_id > USB_API_HID)) { - usbi_dbg("unsupported API ID"); - return -1; - } - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (HANDLE_VALID(handle_priv->interface_handle[i].dev_handle) - && HANDLE_VALID(handle_priv->interface_handle[i].api_handle) - && (priv->usb_interface[i].apib->id == api_id)) - return i; - } - - return -1; -} - -/* - * Lookup interface by endpoint address. -1 if not found - */ -static int interface_by_endpoint(struct windows_device_priv *priv, - struct windows_device_handle_priv *handle_priv, uint8_t endpoint_address) -{ - int i, j; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (!HANDLE_VALID(handle_priv->interface_handle[i].api_handle)) - continue; - if (priv->usb_interface[i].endpoint == NULL) - continue; - for (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) { - if (priv->usb_interface[i].endpoint[j] == endpoint_address) - return i; - } - } - - return -1; -} - -static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer; - ULONG size; - HANDLE winusb_handle; - int current_interface; - struct winfd wfd; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - transfer_priv->pollable_fd = INVALID_WINFD; - size = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; - - // Windows places upper limits on the control transfer size - // See: https://msdn.microsoft.com/en-us/library/windows/hardware/ff538112.aspx - if (size > MAX_CTRL_BUFFER_LENGTH) - return LIBUSB_ERROR_INVALID_PARAM; - - current_interface = get_valid_interface(transfer->dev_handle, USB_API_WINUSBX); - if (current_interface < 0) { - if (auto_claim(transfer, ¤t_interface, USB_API_WINUSBX) != LIBUSB_SUCCESS) - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("will use interface %d", current_interface); - winusb_handle = handle_priv->interface_handle[current_interface].api_handle; - - wfd = usbi_create_fd(winusb_handle, RW_READ, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - // Sending of set configuration control requests from WinUSB creates issues - if (((setup->request_type & (0x03 << 5)) == LIBUSB_REQUEST_TYPE_STANDARD) - && (setup->request == LIBUSB_REQUEST_SET_CONFIGURATION)) { - if (setup->value != priv->active_config) { - usbi_warn(ctx, "cannot set configuration other than the default one"); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_INVALID_PARAM; - } - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = 0; - } else { - if (!WinUSBX[sub_api].ControlTransfer(wfd.handle, *setup, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, size, NULL, wfd.overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_warn(ctx, "ControlTransfer failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_IO; - } - } else { - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = (DWORD)size; - } - } - - // Use priv_transfer to store data needed for async polling - transfer_priv->pollable_fd = wfd; - transfer_priv->interface_number = (uint8_t)current_interface; - - return LIBUSB_SUCCESS; -} - -static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE winusb_handle; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - if (altsetting > 255) - return LIBUSB_ERROR_INVALID_PARAM; - - winusb_handle = handle_priv->interface_handle[iface].api_handle; - if (!HANDLE_VALID(winusb_handle)) { - usbi_err(ctx, "interface must be claimed first"); - return LIBUSB_ERROR_NOT_FOUND; - } - - if (!WinUSBX[sub_api].SetCurrentAlternateSetting(winusb_handle, (UCHAR)altsetting)) { - usbi_err(ctx, "SetCurrentAlternateSetting failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_IO; - } - - return LIBUSB_SUCCESS; -} - -static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - HANDLE winusb_handle; - bool ret; - int current_interface; - struct winfd wfd; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - transfer_priv->pollable_fd = INVALID_WINFD; - - current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); - - winusb_handle = handle_priv->interface_handle[current_interface].api_handle; - - wfd = usbi_create_fd(winusb_handle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - if (IS_XFERIN(transfer)) { - usbi_dbg("reading %d bytes", transfer->length); - ret = WinUSBX[sub_api].ReadPipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); - } else { - usbi_dbg("writing %d bytes", transfer->length); - ret = WinUSBX[sub_api].WritePipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); - } - - if (!ret) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_IO; - } - } else { - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = (DWORD)transfer->length; - } - - transfer_priv->pollable_fd = wfd; - transfer_priv->interface_number = (uint8_t)current_interface; - - return LIBUSB_SUCCESS; -} - -static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE winusb_handle; - int current_interface; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - current_interface = interface_by_endpoint(priv, handle_priv, endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("matched endpoint %02X with interface %d", endpoint, current_interface); - winusb_handle = handle_priv->interface_handle[current_interface].api_handle; - - if (!WinUSBX[sub_api].ResetPipe(winusb_handle, endpoint)) { - usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -/* - * from http://www.winvistatips.com/winusb-bugchecks-t335323.html (confirmed - * through testing as well): - * "You can not call WinUsb_AbortPipe on control pipe. You can possibly cancel - * the control transfer using CancelIo" - */ -static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer) -{ - // Cancelling of the I/O is done in the parent - return LIBUSB_SUCCESS; -} - -static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - HANDLE winusb_handle; - int current_interface; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - current_interface = transfer_priv->interface_number; - if ((current_interface < 0) || (current_interface >= USB_MAXINTERFACES)) { - usbi_err(ctx, "program assertion failed: invalid interface_number"); - return LIBUSB_ERROR_NOT_FOUND; - } - usbi_dbg("will use interface %d", current_interface); - - winusb_handle = handle_priv->interface_handle[current_interface].api_handle; - - if (!WinUSBX[sub_api].AbortPipe(winusb_handle, transfer->endpoint)) { - usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -/* - * from the "How to Use WinUSB to Communicate with a USB Device" Microsoft white paper - * (http://www.microsoft.com/whdc/connect/usb/winusb_howto.mspx): - * "WinUSB does not support host-initiated reset port and cycle port operations" and - * IOCTL_INTERNAL_USB_CYCLE_PORT is only available in kernel mode and the - * IOCTL_USB_HUB_CYCLE_PORT ioctl was removed from Vista => the best we can do is - * cycle the pipes (and even then, the control pipe can not be reset using WinUSB) - */ -// TODO: (post hotplug): see if we can force eject the device and redetect it (reuse hotplug?) -static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct winfd wfd; - HANDLE winusb_handle; - int i, j; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - // Reset any available pipe (except control) - for (i = 0; i < USB_MAXINTERFACES; i++) { - winusb_handle = handle_priv->interface_handle[i].api_handle; - for (wfd = handle_to_winfd(winusb_handle); wfd.fd > 0; ) { - // Cancel any pollable I/O - usbi_remove_pollfd(ctx, wfd.fd); - usbi_free_fd(&wfd); - wfd = handle_to_winfd(winusb_handle); - } - - if (HANDLE_VALID(winusb_handle)) { - for (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) { - usbi_dbg("resetting ep %02X", priv->usb_interface[i].endpoint[j]); - if (!WinUSBX[sub_api].AbortPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) - usbi_err(ctx, "AbortPipe (pipe address %02X) failed: %s", - priv->usb_interface[i].endpoint[j], windows_error_str(0)); - - // FlushPipe seems to fail on OUT pipes - if (IS_EPIN(priv->usb_interface[i].endpoint[j]) - && (!WinUSBX[sub_api].FlushPipe(winusb_handle, priv->usb_interface[i].endpoint[j]))) - usbi_err(ctx, "FlushPipe (pipe address %02X) failed: %s", - priv->usb_interface[i].endpoint[j], windows_error_str(0)); - - if (!WinUSBX[sub_api].ResetPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) - usbi_err(ctx, "ResetPipe (pipe address %02X) failed: %s", - priv->usb_interface[i].endpoint[j], windows_error_str(0)); - } - } - } - - // libusbK & libusb0 have the ability to issue an actual device reset - if (WinUSBX[sub_api].ResetDevice != NULL) { - winusb_handle = handle_priv->interface_handle[0].api_handle; - if (HANDLE_VALID(winusb_handle)) - WinUSBX[sub_api].ResetDevice(winusb_handle); - } - - return LIBUSB_SUCCESS; -} - -static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) -{ - itransfer->transferred += io_size; - return LIBUSB_TRANSFER_COMPLETED; -} - -/* - * Internal HID Support functions (from libusb-win32) - * Note that functions that complete data transfer synchronously must return - * LIBUSB_COMPLETED instead of LIBUSB_SUCCESS - */ -static int _hid_get_hid_descriptor(struct hid_device_priv *dev, void *data, size_t *size); -static int _hid_get_report_descriptor(struct hid_device_priv *dev, void *data, size_t *size); - -static int _hid_wcslen(WCHAR *str) -{ - int i = 0; - - while (str[i] && (str[i] != 0x409)) - i++; - - return i; -} - -static int _hid_get_device_descriptor(struct hid_device_priv *dev, void *data, size_t *size) -{ - struct libusb_device_descriptor d; - - d.bLength = LIBUSB_DT_DEVICE_SIZE; - d.bDescriptorType = LIBUSB_DT_DEVICE; - d.bcdUSB = 0x0200; /* 2.00 */ - d.bDeviceClass = 0; - d.bDeviceSubClass = 0; - d.bDeviceProtocol = 0; - d.bMaxPacketSize0 = 64; /* fix this! */ - d.idVendor = (uint16_t)dev->vid; - d.idProduct = (uint16_t)dev->pid; - d.bcdDevice = 0x0100; - d.iManufacturer = dev->string_index[0]; - d.iProduct = dev->string_index[1]; - d.iSerialNumber = dev->string_index[2]; - d.bNumConfigurations = 1; - - if (*size > LIBUSB_DT_DEVICE_SIZE) - *size = LIBUSB_DT_DEVICE_SIZE; - memcpy(data, &d, *size); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_config_descriptor(struct hid_device_priv *dev, void *data, size_t *size) -{ - char num_endpoints = 0; - size_t config_total_len = 0; - char tmp[HID_MAX_CONFIG_DESC_SIZE]; - struct libusb_config_descriptor *cd; - struct libusb_interface_descriptor *id; - struct libusb_hid_descriptor *hd; - struct libusb_endpoint_descriptor *ed; - size_t tmp_size; - - if (dev->input_report_size) - num_endpoints++; - if (dev->output_report_size) - num_endpoints++; - - config_total_len = LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE - + LIBUSB_DT_HID_SIZE + num_endpoints * LIBUSB_DT_ENDPOINT_SIZE; - - cd = (struct libusb_config_descriptor *)tmp; - id = (struct libusb_interface_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE); - hd = (struct libusb_hid_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE - + LIBUSB_DT_INTERFACE_SIZE); - ed = (struct libusb_endpoint_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE - + LIBUSB_DT_INTERFACE_SIZE - + LIBUSB_DT_HID_SIZE); - - cd->bLength = LIBUSB_DT_CONFIG_SIZE; - cd->bDescriptorType = LIBUSB_DT_CONFIG; - cd->wTotalLength = (uint16_t)config_total_len; - cd->bNumInterfaces = 1; - cd->bConfigurationValue = 1; - cd->iConfiguration = 0; - cd->bmAttributes = 1 << 7; /* bus powered */ - cd->MaxPower = 50; - - id->bLength = LIBUSB_DT_INTERFACE_SIZE; - id->bDescriptorType = LIBUSB_DT_INTERFACE; - id->bInterfaceNumber = 0; - id->bAlternateSetting = 0; - id->bNumEndpoints = num_endpoints; - id->bInterfaceClass = 3; - id->bInterfaceSubClass = 0; - id->bInterfaceProtocol = 0; - id->iInterface = 0; - - tmp_size = LIBUSB_DT_HID_SIZE; - _hid_get_hid_descriptor(dev, hd, &tmp_size); - - if (dev->input_report_size) { - ed->bLength = LIBUSB_DT_ENDPOINT_SIZE; - ed->bDescriptorType = LIBUSB_DT_ENDPOINT; - ed->bEndpointAddress = HID_IN_EP; - ed->bmAttributes = 3; - ed->wMaxPacketSize = dev->input_report_size - 1; - ed->bInterval = 10; - ed = (struct libusb_endpoint_descriptor *)((char *)ed + LIBUSB_DT_ENDPOINT_SIZE); - } - - if (dev->output_report_size) { - ed->bLength = LIBUSB_DT_ENDPOINT_SIZE; - ed->bDescriptorType = LIBUSB_DT_ENDPOINT; - ed->bEndpointAddress = HID_OUT_EP; - ed->bmAttributes = 3; - ed->wMaxPacketSize = dev->output_report_size - 1; - ed->bInterval = 10; - } - - if (*size > config_total_len) - *size = config_total_len; - memcpy(data, tmp, *size); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_string_descriptor(struct hid_device_priv *dev, int _index, - void *data, size_t *size) -{ - void *tmp = NULL; - size_t tmp_size = 0; - int i; - - /* language ID, EN-US */ - char string_langid[] = {0x09, 0x04}; - - if ((*size < 2) || (*size > 255)) - return LIBUSB_ERROR_OVERFLOW; - - if (_index == 0) { - tmp = string_langid; - tmp_size = sizeof(string_langid) + 2; - } else { - for (i = 0; i < 3; i++) { - if (_index == (dev->string_index[i])) { - tmp = dev->string[i]; - tmp_size = (_hid_wcslen(dev->string[i]) + 1) * sizeof(WCHAR); - break; - } - } - - if (i == 3) // not found - return LIBUSB_ERROR_INVALID_PARAM; - } - - if (!tmp_size) - return LIBUSB_ERROR_INVALID_PARAM; - - if (tmp_size < *size) - *size = tmp_size; - - // 2 byte header - ((uint8_t *)data)[0] = (uint8_t)*size; - ((uint8_t *)data)[1] = LIBUSB_DT_STRING; - memcpy((uint8_t *)data + 2, tmp, *size - 2); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_hid_descriptor(struct hid_device_priv *dev, void *data, size_t *size) -{ - struct libusb_hid_descriptor d; - uint8_t tmp[MAX_HID_DESCRIPTOR_SIZE]; - size_t report_len = MAX_HID_DESCRIPTOR_SIZE; - - _hid_get_report_descriptor(dev, tmp, &report_len); - - d.bLength = LIBUSB_DT_HID_SIZE; - d.bDescriptorType = LIBUSB_DT_HID; - d.bcdHID = 0x0110; /* 1.10 */ - d.bCountryCode = 0; - d.bNumDescriptors = 1; - d.bClassDescriptorType = LIBUSB_DT_REPORT; - d.wClassDescriptorLength = (uint16_t)report_len; - - if (*size > LIBUSB_DT_HID_SIZE) - *size = LIBUSB_DT_HID_SIZE; - memcpy(data, &d, *size); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_report_descriptor(struct hid_device_priv *dev, void *data, size_t *size) -{ - uint8_t d[MAX_HID_DESCRIPTOR_SIZE]; - size_t i = 0; - - /* usage page (0xFFA0 == vendor defined) */ - d[i++] = 0x06; d[i++] = 0xA0; d[i++] = 0xFF; - /* usage (vendor defined) */ - d[i++] = 0x09; d[i++] = 0x01; - /* start collection (application) */ - d[i++] = 0xA1; d[i++] = 0x01; - /* input report */ - if (dev->input_report_size) { - /* usage (vendor defined) */ - d[i++] = 0x09; d[i++] = 0x01; - /* logical minimum (0) */ - d[i++] = 0x15; d[i++] = 0x00; - /* logical maximum (255) */ - d[i++] = 0x25; d[i++] = 0xFF; - /* report size (8 bits) */ - d[i++] = 0x75; d[i++] = 0x08; - /* report count */ - d[i++] = 0x95; d[i++] = (uint8_t)dev->input_report_size - 1; - /* input (data, variable, absolute) */ - d[i++] = 0x81; d[i++] = 0x00; - } - /* output report */ - if (dev->output_report_size) { - /* usage (vendor defined) */ - d[i++] = 0x09; d[i++] = 0x02; - /* logical minimum (0) */ - d[i++] = 0x15; d[i++] = 0x00; - /* logical maximum (255) */ - d[i++] = 0x25; d[i++] = 0xFF; - /* report size (8 bits) */ - d[i++] = 0x75; d[i++] = 0x08; - /* report count */ - d[i++] = 0x95; d[i++] = (uint8_t)dev->output_report_size - 1; - /* output (data, variable, absolute) */ - d[i++] = 0x91; d[i++] = 0x00; - } - /* feature report */ - if (dev->feature_report_size) { - /* usage (vendor defined) */ - d[i++] = 0x09; d[i++] = 0x03; - /* logical minimum (0) */ - d[i++] = 0x15; d[i++] = 0x00; - /* logical maximum (255) */ - d[i++] = 0x25; d[i++] = 0xFF; - /* report size (8 bits) */ - d[i++] = 0x75; d[i++] = 0x08; - /* report count */ - d[i++] = 0x95; d[i++] = (uint8_t)dev->feature_report_size - 1; - /* feature (data, variable, absolute) */ - d[i++] = 0xb2; d[i++] = 0x02; d[i++] = 0x01; - } - - /* end collection */ - d[i++] = 0xC0; - - if (*size > i) - *size = i; - memcpy(data, d, *size); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_descriptor(struct hid_device_priv *dev, HANDLE hid_handle, int recipient, - int type, int _index, void *data, size_t *size) -{ - switch(type) { - case LIBUSB_DT_DEVICE: - usbi_dbg("LIBUSB_DT_DEVICE"); - return _hid_get_device_descriptor(dev, data, size); - case LIBUSB_DT_CONFIG: - usbi_dbg("LIBUSB_DT_CONFIG"); - if (!_index) - return _hid_get_config_descriptor(dev, data, size); - return LIBUSB_ERROR_INVALID_PARAM; - case LIBUSB_DT_STRING: - usbi_dbg("LIBUSB_DT_STRING"); - return _hid_get_string_descriptor(dev, _index, data, size); - case LIBUSB_DT_HID: - usbi_dbg("LIBUSB_DT_HID"); - if (!_index) - return _hid_get_hid_descriptor(dev, data, size); - return LIBUSB_ERROR_INVALID_PARAM; - case LIBUSB_DT_REPORT: - usbi_dbg("LIBUSB_DT_REPORT"); - if (!_index) - return _hid_get_report_descriptor(dev, data, size); - return LIBUSB_ERROR_INVALID_PARAM; - case LIBUSB_DT_PHYSICAL: - usbi_dbg("LIBUSB_DT_PHYSICAL"); - if (HidD_GetPhysicalDescriptor(hid_handle, data, (ULONG)*size)) - return LIBUSB_COMPLETED; - return LIBUSB_ERROR_OTHER; - } - - usbi_dbg("unsupported"); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int _hid_get_report(struct hid_device_priv *dev, HANDLE hid_handle, int id, void *data, - struct windows_transfer_priv *tp, size_t *size, OVERLAPPED *overlapped, int report_type) -{ - uint8_t *buf; - DWORD ioctl_code, read_size, expected_size = (DWORD)*size; - int r = LIBUSB_SUCCESS; - - if (tp->hid_buffer != NULL) - usbi_dbg("program assertion failed: hid_buffer is not NULL"); - - if ((*size == 0) || (*size > MAX_HID_REPORT_SIZE)) { - usbi_dbg("invalid size (%u)", *size); - return LIBUSB_ERROR_INVALID_PARAM; - } - - switch (report_type) { - case HID_REPORT_TYPE_INPUT: - ioctl_code = IOCTL_HID_GET_INPUT_REPORT; - break; - case HID_REPORT_TYPE_FEATURE: - ioctl_code = IOCTL_HID_GET_FEATURE; - break; - default: - usbi_dbg("unknown HID report type %d", report_type); - return LIBUSB_ERROR_INVALID_PARAM; - } - - // Add a trailing byte to detect overflows - buf = calloc(1, expected_size + 1); - if (buf == NULL) - return LIBUSB_ERROR_NO_MEM; - - buf[0] = (uint8_t)id; // Must be set always - usbi_dbg("report ID: 0x%02X", buf[0]); - - tp->hid_expected_size = expected_size; - read_size = expected_size; - - // NB: The size returned by DeviceIoControl doesn't include report IDs when not in use (0) - if (!DeviceIoControl(hid_handle, ioctl_code, buf, expected_size + 1, - buf, expected_size + 1, &read_size, overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_dbg("Failed to Read HID Report: %s", windows_error_str(0)); - free(buf); - return LIBUSB_ERROR_IO; - } - // Asynchronous wait - tp->hid_buffer = buf; - tp->hid_dest = data; // copy dest, as not necessarily the start of the transfer buffer - return LIBUSB_SUCCESS; - } - - // Transfer completed synchronously => copy and discard extra buffer - if (read_size == 0) { - usbi_warn(NULL, "program assertion failed - read completed synchronously, but no data was read"); - *size = 0; - } else { - if (buf[0] != id) - usbi_warn(NULL, "mismatched report ID (data is %02X, parameter is %02X)", buf[0], id); - - if ((size_t)read_size > expected_size) { - r = LIBUSB_ERROR_OVERFLOW; - usbi_dbg("OVERFLOW!"); - } else { - r = LIBUSB_COMPLETED; - } - - *size = MIN((size_t)read_size, *size); - if (id == 0) - memcpy(data, buf + 1, *size); // Discard report ID - else - memcpy(data, buf, *size); - } - - free(buf); - return r; -} - -static int _hid_set_report(struct hid_device_priv *dev, HANDLE hid_handle, int id, void *data, - struct windows_transfer_priv *tp, size_t *size, OVERLAPPED *overlapped, int report_type) -{ - uint8_t *buf = NULL; - DWORD ioctl_code, write_size = (DWORD)*size; - - if (tp->hid_buffer != NULL) - usbi_dbg("program assertion failed: hid_buffer is not NULL"); - - if ((*size == 0) || (*size > MAX_HID_REPORT_SIZE)) { - usbi_dbg("invalid size (%u)", *size); - return LIBUSB_ERROR_INVALID_PARAM; - } - - switch (report_type) { - case HID_REPORT_TYPE_OUTPUT: - ioctl_code = IOCTL_HID_SET_OUTPUT_REPORT; - break; - case HID_REPORT_TYPE_FEATURE: - ioctl_code = IOCTL_HID_SET_FEATURE; - break; - default: - usbi_dbg("unknown HID report type %d", report_type); - return LIBUSB_ERROR_INVALID_PARAM; - } - - usbi_dbg("report ID: 0x%02X", id); - // When report IDs are not used (i.e. when id == 0), we must add - // a null report ID. Otherwise, we just use original data buffer - if (id == 0) - write_size++; - - buf = malloc(write_size); - if (buf == NULL) - return LIBUSB_ERROR_NO_MEM; - - if (id == 0) { - buf[0] = 0; - memcpy(buf + 1, data, *size); - } else { - // This seems like a waste, but if we don't duplicate the - // data, we'll get issues when freeing hid_buffer - memcpy(buf, data, *size); - if (buf[0] != id) - usbi_warn(NULL, "mismatched report ID (data is %02X, parameter is %02X)", buf[0], id); - } - - // NB: The size returned by DeviceIoControl doesn't include report IDs when not in use (0) - if (!DeviceIoControl(hid_handle, ioctl_code, buf, write_size, - buf, write_size, &write_size, overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_dbg("Failed to Write HID Output Report: %s", windows_error_str(0)); - free(buf); - return LIBUSB_ERROR_IO; - } - tp->hid_buffer = buf; - tp->hid_dest = NULL; - return LIBUSB_SUCCESS; - } - - // Transfer completed synchronously - *size = write_size; - if (write_size == 0) - usbi_dbg("program assertion failed - write completed synchronously, but no data was written"); - - free(buf); - return LIBUSB_COMPLETED; -} - -static int _hid_class_request(struct hid_device_priv *dev, HANDLE hid_handle, int request_type, - int request, int value, int _index, void *data, struct windows_transfer_priv *tp, - size_t *size, OVERLAPPED *overlapped) -{ - int report_type = (value >> 8) & 0xFF; - int report_id = value & 0xFF; - - if ((LIBUSB_REQ_RECIPIENT(request_type) != LIBUSB_RECIPIENT_INTERFACE) - && (LIBUSB_REQ_RECIPIENT(request_type) != LIBUSB_RECIPIENT_DEVICE)) - return LIBUSB_ERROR_INVALID_PARAM; - - if (LIBUSB_REQ_OUT(request_type) && request == HID_REQ_SET_REPORT) - return _hid_set_report(dev, hid_handle, report_id, data, tp, size, overlapped, report_type); - - if (LIBUSB_REQ_IN(request_type) && request == HID_REQ_GET_REPORT) - return _hid_get_report(dev, hid_handle, report_id, data, tp, size, overlapped, report_type); - - return LIBUSB_ERROR_INVALID_PARAM; -} - - -/* - * HID API functions - */ -static int hid_init(int sub_api, struct libusb_context *ctx) -{ - DLL_GET_HANDLE(hid); - DLL_LOAD_FUNC(hid, HidD_GetAttributes, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetHidGuid, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetPreparsedData, TRUE); - DLL_LOAD_FUNC(hid, HidD_FreePreparsedData, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetManufacturerString, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetProductString, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetSerialNumberString, TRUE); - DLL_LOAD_FUNC(hid, HidP_GetCaps, TRUE); - DLL_LOAD_FUNC(hid, HidD_SetNumInputBuffers, TRUE); - DLL_LOAD_FUNC(hid, HidD_SetFeature, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetFeature, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetPhysicalDescriptor, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetInputReport, FALSE); - DLL_LOAD_FUNC(hid, HidD_SetOutputReport, FALSE); - DLL_LOAD_FUNC(hid, HidD_FlushQueue, TRUE); - DLL_LOAD_FUNC(hid, HidP_GetValueCaps, TRUE); - - api_hid_available = true; - return LIBUSB_SUCCESS; -} - -static int hid_exit(int sub_api) -{ - DLL_FREE_HANDLE(hid); - - return LIBUSB_SUCCESS; -} - -// NB: open and close must ensure that they only handle interface of -// the right API type, as these functions can be called wholesale from -// composite_open(), with interfaces belonging to different APIs -static int hid_open(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - HIDD_ATTRIBUTES hid_attributes; - PHIDP_PREPARSED_DATA preparsed_data = NULL; - HIDP_CAPS capabilities; - HIDP_VALUE_CAPS *value_caps; - HANDLE hid_handle = INVALID_HANDLE_VALUE; - int i, j; - // report IDs handling - ULONG size[3]; - int nb_ids[2]; // zero and nonzero report IDs -#if defined(ENABLE_LOGGING) - const char *type[3] = {"input", "output", "feature"}; -#endif - - CHECK_HID_AVAILABLE; - - if (priv->hid == NULL) { - usbi_err(ctx, "program assertion failed - private HID structure is unitialized"); - return LIBUSB_ERROR_NOT_FOUND; - } - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if ((priv->usb_interface[i].path != NULL) - && (priv->usb_interface[i].apib->id == USB_API_HID)) { - hid_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); - /* - * http://www.lvr.com/hidfaq.htm: Why do I receive "Access denied" when attempting to access my HID? - * "Windows 2000 and later have exclusive read/write access to HIDs that are configured as a system - * keyboards or mice. An application can obtain a handle to a system keyboard or mouse by not - * requesting READ or WRITE access with CreateFile. Applications can then use HidD_SetFeature and - * HidD_GetFeature (if the device supports Feature reports)." - */ - if (hid_handle == INVALID_HANDLE_VALUE) { - usbi_warn(ctx, "could not open HID device in R/W mode (keyboard or mouse?) - trying without"); - hid_handle = CreateFileA(priv->usb_interface[i].path, 0, FILE_SHARE_WRITE | FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); - if (hid_handle == INVALID_HANDLE_VALUE) { - usbi_err(ctx, "could not open device %s (interface %d): %s", priv->path, i, windows_error_str(0)); - switch(GetLastError()) { - case ERROR_FILE_NOT_FOUND: // The device was disconnected - return LIBUSB_ERROR_NO_DEVICE; - case ERROR_ACCESS_DENIED: - return LIBUSB_ERROR_ACCESS; - default: - return LIBUSB_ERROR_IO; - } - } - priv->usb_interface[i].restricted_functionality = true; - } - handle_priv->interface_handle[i].api_handle = hid_handle; - } - } - - hid_attributes.Size = sizeof(hid_attributes); - do { - if (!HidD_GetAttributes(hid_handle, &hid_attributes)) { - usbi_err(ctx, "could not gain access to HID top collection (HidD_GetAttributes)"); - break; - } - - priv->hid->vid = hid_attributes.VendorID; - priv->hid->pid = hid_attributes.ProductID; - - // Set the maximum available input buffer size - for (i = 32; HidD_SetNumInputBuffers(hid_handle, i); i *= 2); - usbi_dbg("set maximum input buffer size to %d", i / 2); - - // Get the maximum input and output report size - if (!HidD_GetPreparsedData(hid_handle, &preparsed_data) || !preparsed_data) { - usbi_err(ctx, "could not read HID preparsed data (HidD_GetPreparsedData)"); - break; - } - if (HidP_GetCaps(preparsed_data, &capabilities) != HIDP_STATUS_SUCCESS) { - usbi_err(ctx, "could not parse HID capabilities (HidP_GetCaps)"); - break; - } - - // Find out if interrupt will need report IDs - size[0] = capabilities.NumberInputValueCaps; - size[1] = capabilities.NumberOutputValueCaps; - size[2] = capabilities.NumberFeatureValueCaps; - for (j = HidP_Input; j <= HidP_Feature; j++) { - usbi_dbg("%u HID %s report value(s) found", (unsigned int)size[j], type[j]); - priv->hid->uses_report_ids[j] = false; - if (size[j] > 0) { - value_caps = calloc(size[j], sizeof(HIDP_VALUE_CAPS)); - if ((value_caps != NULL) - && (HidP_GetValueCaps((HIDP_REPORT_TYPE)j, value_caps, &size[j], preparsed_data) == HIDP_STATUS_SUCCESS) - && (size[j] >= 1)) { - nb_ids[0] = 0; - nb_ids[1] = 0; - for (i = 0; i < (int)size[j]; i++) { - usbi_dbg(" Report ID: 0x%02X", value_caps[i].ReportID); - if (value_caps[i].ReportID != 0) - nb_ids[1]++; - else - nb_ids[0]++; - } - if (nb_ids[1] != 0) { - if (nb_ids[0] != 0) - usbi_warn(ctx, "program assertion failed: zero and nonzero report IDs used for %s", - type[j]); - priv->hid->uses_report_ids[j] = true; - } - } else { - usbi_warn(ctx, " could not process %s report IDs", type[j]); - } - free(value_caps); - } - } - - // Set the report sizes - priv->hid->input_report_size = capabilities.InputReportByteLength; - priv->hid->output_report_size = capabilities.OutputReportByteLength; - priv->hid->feature_report_size = capabilities.FeatureReportByteLength; - - // Fetch string descriptors - priv->hid->string_index[0] = priv->dev_descriptor.iManufacturer; - if (priv->hid->string_index[0] != 0) - HidD_GetManufacturerString(hid_handle, priv->hid->string[0], sizeof(priv->hid->string[0])); - else - priv->hid->string[0][0] = 0; - - priv->hid->string_index[1] = priv->dev_descriptor.iProduct; - if (priv->hid->string_index[1] != 0) - HidD_GetProductString(hid_handle, priv->hid->string[1], sizeof(priv->hid->string[1])); - else - priv->hid->string[1][0] = 0; - - priv->hid->string_index[2] = priv->dev_descriptor.iSerialNumber; - if (priv->hid->string_index[2] != 0) - HidD_GetSerialNumberString(hid_handle, priv->hid->string[2], sizeof(priv->hid->string[2])); - else - priv->hid->string[2][0] = 0; - } while(0); - - if (preparsed_data) - HidD_FreePreparsedData(preparsed_data); - - return LIBUSB_SUCCESS; -} - -static void hid_close(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - HANDLE file_handle; - int i; - - if (!api_hid_available) - return; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (priv->usb_interface[i].apib->id == USB_API_HID) { - file_handle = handle_priv->interface_handle[i].api_handle; - if (HANDLE_VALID(file_handle)) - CloseHandle(file_handle); - } - } -} - -static int hid_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - CHECK_HID_AVAILABLE; - - // NB: Disconnection detection is not possible in this function - if (priv->usb_interface[iface].path == NULL) - return LIBUSB_ERROR_NOT_FOUND; // invalid iface - - // We use dev_handle as a flag for interface claimed - if (handle_priv->interface_handle[iface].dev_handle == INTERFACE_CLAIMED) - return LIBUSB_ERROR_BUSY; // already claimed - - - handle_priv->interface_handle[iface].dev_handle = INTERFACE_CLAIMED; - - usbi_dbg("claimed interface %d", iface); - handle_priv->active_interface = iface; - - return LIBUSB_SUCCESS; -} - -static int hid_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - CHECK_HID_AVAILABLE; - - if (priv->usb_interface[iface].path == NULL) - return LIBUSB_ERROR_NOT_FOUND; // invalid iface - - if (handle_priv->interface_handle[iface].dev_handle != INTERFACE_CLAIMED) - return LIBUSB_ERROR_NOT_FOUND; // invalid iface - - handle_priv->interface_handle[iface].dev_handle = INVALID_HANDLE_VALUE; - - return LIBUSB_SUCCESS; -} - -static int hid_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - - CHECK_HID_AVAILABLE; - - if (altsetting > 255) - return LIBUSB_ERROR_INVALID_PARAM; - - if (altsetting != 0) { - usbi_err(ctx, "set interface altsetting not supported for altsetting >0"); - return LIBUSB_ERROR_NOT_SUPPORTED; - } - - return LIBUSB_SUCCESS; -} - -static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer; - HANDLE hid_handle; - struct winfd wfd; - int current_interface, config; - size_t size; - int r = LIBUSB_ERROR_INVALID_PARAM; - - CHECK_HID_AVAILABLE; - - transfer_priv->pollable_fd = INVALID_WINFD; - safe_free(transfer_priv->hid_buffer); - transfer_priv->hid_dest = NULL; - size = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; - - if (size > MAX_CTRL_BUFFER_LENGTH) - return LIBUSB_ERROR_INVALID_PARAM; - - current_interface = get_valid_interface(transfer->dev_handle, USB_API_HID); - if (current_interface < 0) { - if (auto_claim(transfer, ¤t_interface, USB_API_HID) != LIBUSB_SUCCESS) - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("will use interface %d", current_interface); - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - // Always use the handle returned from usbi_create_fd (wfd.handle) - wfd = usbi_create_fd(hid_handle, RW_READ, NULL, NULL); - if (wfd.fd < 0) - return LIBUSB_ERROR_NOT_FOUND; - - switch(LIBUSB_REQ_TYPE(setup->request_type)) { - case LIBUSB_REQUEST_TYPE_STANDARD: - switch(setup->request) { - case LIBUSB_REQUEST_GET_DESCRIPTOR: - r = _hid_get_descriptor(priv->hid, wfd.handle, LIBUSB_REQ_RECIPIENT(setup->request_type), - (setup->value >> 8) & 0xFF, setup->value & 0xFF, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, &size); - break; - case LIBUSB_REQUEST_GET_CONFIGURATION: - r = windows_get_configuration(transfer->dev_handle, &config); - if (r == LIBUSB_SUCCESS) { - size = 1; - ((uint8_t *)transfer->buffer)[LIBUSB_CONTROL_SETUP_SIZE] = (uint8_t)config; - r = LIBUSB_COMPLETED; - } - break; - case LIBUSB_REQUEST_SET_CONFIGURATION: - if (setup->value == priv->active_config) { - r = LIBUSB_COMPLETED; - } else { - usbi_warn(ctx, "cannot set configuration other than the default one"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - } - break; - case LIBUSB_REQUEST_GET_INTERFACE: - size = 1; - ((uint8_t *)transfer->buffer)[LIBUSB_CONTROL_SETUP_SIZE] = 0; - r = LIBUSB_COMPLETED; - break; - case LIBUSB_REQUEST_SET_INTERFACE: - r = hid_set_interface_altsetting(0, transfer->dev_handle, setup->index, setup->value); - if (r == LIBUSB_SUCCESS) - r = LIBUSB_COMPLETED; - break; - default: - usbi_warn(ctx, "unsupported HID control request"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - break; - case LIBUSB_REQUEST_TYPE_CLASS: - r = _hid_class_request(priv->hid, wfd.handle, setup->request_type, setup->request, setup->value, - setup->index, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, transfer_priv, - &size, wfd.overlapped); - break; - default: - usbi_warn(ctx, "unsupported HID control request"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - - if (r == LIBUSB_COMPLETED) { - // Force request to be completed synchronously. Transferred size has been set by previous call - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - // http://msdn.microsoft.com/en-us/library/ms684342%28VS.85%29.aspx - // set InternalHigh to the number of bytes transferred - wfd.overlapped->InternalHigh = (DWORD)size; - r = LIBUSB_SUCCESS; - } - - if (r == LIBUSB_SUCCESS) { - // Use priv_transfer to store data needed for async polling - transfer_priv->pollable_fd = wfd; - transfer_priv->interface_number = (uint8_t)current_interface; - } else { - usbi_free_fd(&wfd); - } - - return r; -} - -static int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - struct winfd wfd; - HANDLE hid_handle; - bool direction_in, ret; - int current_interface, length; - DWORD size; - int r = LIBUSB_SUCCESS; - - CHECK_HID_AVAILABLE; - - transfer_priv->pollable_fd = INVALID_WINFD; - transfer_priv->hid_dest = NULL; - safe_free(transfer_priv->hid_buffer); - - current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); - - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - direction_in = transfer->endpoint & LIBUSB_ENDPOINT_IN; - - wfd = usbi_create_fd(hid_handle, direction_in?RW_READ:RW_WRITE, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - // If report IDs are not in use, an extra prefix byte must be added - if (((direction_in) && (!priv->hid->uses_report_ids[0])) - || ((!direction_in) && (!priv->hid->uses_report_ids[1]))) - length = transfer->length + 1; - else - length = transfer->length; - - // Add a trailing byte to detect overflows on input - transfer_priv->hid_buffer = calloc(1, length + 1); - if (transfer_priv->hid_buffer == NULL) - return LIBUSB_ERROR_NO_MEM; - - transfer_priv->hid_expected_size = length; - - if (direction_in) { - transfer_priv->hid_dest = transfer->buffer; - usbi_dbg("reading %d bytes (report ID: 0x00)", length); - ret = ReadFile(wfd.handle, transfer_priv->hid_buffer, length + 1, &size, wfd.overlapped); - } else { - if (!priv->hid->uses_report_ids[1]) - memcpy(transfer_priv->hid_buffer + 1, transfer->buffer, transfer->length); - else - // We could actually do without the calloc and memcpy in this case - memcpy(transfer_priv->hid_buffer, transfer->buffer, transfer->length); - - usbi_dbg("writing %d bytes (report ID: 0x%02X)", length, transfer_priv->hid_buffer[0]); - ret = WriteFile(wfd.handle, transfer_priv->hid_buffer, length, &size, wfd.overlapped); - } - - if (!ret) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_err(ctx, "HID transfer failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - safe_free(transfer_priv->hid_buffer); - return LIBUSB_ERROR_IO; - } - } else { - // Only write operations that completed synchronously need to free up - // hid_buffer. For reads, copy_transfer_data() handles that process. - if (!direction_in) - safe_free(transfer_priv->hid_buffer); - - if (size == 0) { - usbi_err(ctx, "program assertion failed - no data was transferred"); - size = 1; - } - if (size > (size_t)length) { - usbi_err(ctx, "OVERFLOW!"); - r = LIBUSB_ERROR_OVERFLOW; - } - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = size; - } - - transfer_priv->pollable_fd = wfd; - transfer_priv->interface_number = (uint8_t)current_interface; - - return r; -} - -static int hid_abort_transfers(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - HANDLE hid_handle; - int current_interface; - - CHECK_HID_AVAILABLE; - - current_interface = transfer_priv->interface_number; - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - CancelIo(hid_handle); - - return LIBUSB_SUCCESS; -} - -static int hid_reset_device(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - HANDLE hid_handle; - int current_interface; - - CHECK_HID_AVAILABLE; - - // Flushing the queues on all interfaces is the best we can achieve - for (current_interface = 0; current_interface < USB_MAXINTERFACES; current_interface++) { - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - if (HANDLE_VALID(hid_handle)) - HidD_FlushQueue(hid_handle); - } - - return LIBUSB_SUCCESS; -} - -static int hid_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE hid_handle; - int current_interface; - - CHECK_HID_AVAILABLE; - - current_interface = interface_by_endpoint(priv, handle_priv, endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("matched endpoint %02X with interface %d", endpoint, current_interface); - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - - // No endpoint selection with Microsoft's implementation, so we try to flush the - // whole interface. Should be OK for most case scenarios - if (!HidD_FlushQueue(hid_handle)) { - usbi_err(ctx, "Flushing of HID queue failed: %s", windows_error_str(0)); - // Device was probably disconnected - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -// This extra function is only needed for HID -static int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - int r = LIBUSB_TRANSFER_COMPLETED; - uint32_t corrected_size = io_size; - - if (transfer_priv->hid_buffer != NULL) { - // If we have a valid hid_buffer, it means the transfer was async - if (transfer_priv->hid_dest != NULL) { // Data readout - if (corrected_size > 0) { - // First, check for overflow - if (corrected_size > transfer_priv->hid_expected_size) { - usbi_err(ctx, "OVERFLOW!"); - corrected_size = (uint32_t)transfer_priv->hid_expected_size; - r = LIBUSB_TRANSFER_OVERFLOW; - } - - if (transfer_priv->hid_buffer[0] == 0) { - // Discard the 1 byte report ID prefix - corrected_size--; - memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer + 1, corrected_size); - } else { - memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer, corrected_size); - } - } - transfer_priv->hid_dest = NULL; - } - // For write, we just need to free the hid buffer - safe_free(transfer_priv->hid_buffer); - } - - itransfer->transferred += corrected_size; - return r; -} - - -/* - * Composite API functions - */ -static int composite_init(int sub_api, struct libusb_context *ctx) -{ - return LIBUSB_SUCCESS; -} - -static int composite_exit(int sub_api) -{ - return LIBUSB_SUCCESS; -} - -static int composite_open(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int r = LIBUSB_ERROR_NOT_FOUND; - uint8_t i; - // SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID - bool available[SUB_API_MAX + 1] = { 0 }; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - switch (priv->usb_interface[i].apib->id) { - case USB_API_WINUSBX: - if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) - available[priv->usb_interface[i].sub_api] = true; - break; - case USB_API_HID: - available[SUB_API_MAX] = true; - break; - default: - break; - } - } - - for (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers - if (available[i]) { - r = usb_api_backend[USB_API_WINUSBX].open(i, dev_handle); - if (r != LIBUSB_SUCCESS) - return r; - } - } - - if (available[SUB_API_MAX]) // HID driver - r = hid_open(SUB_API_NOTSET, dev_handle); - - return r; -} - -static void composite_close(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - uint8_t i; - // SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID - bool available[SUB_API_MAX + 1] = { 0 }; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - switch (priv->usb_interface[i].apib->id) { - case USB_API_WINUSBX: - if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) - available[priv->usb_interface[i].sub_api] = true; - break; - case USB_API_HID: - available[SUB_API_MAX] = true; - break; - default: - break; - } - } - - for (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers - if (available[i]) - usb_api_backend[USB_API_WINUSBX].close(i, dev_handle); - } - - if (available[SUB_API_MAX]) // HID driver - hid_close(SUB_API_NOTSET, dev_handle); -} - -static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - return priv->usb_interface[iface].apib-> - claim_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); -} - -static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - return priv->usb_interface[iface].apib-> - set_interface_altsetting(priv->usb_interface[iface].sub_api, dev_handle, iface, altsetting); -} - -static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - return priv->usb_interface[iface].apib-> - release_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); -} - -static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - struct libusb_config_descriptor *conf_desc; - WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer; - int iface, pass, r; - - // Interface shouldn't matter for control, but it does in practice, with Windows' - // restrictions with regards to accessing HID keyboards and mice. Try to target - // a specific interface first, if possible. - switch (LIBUSB_REQ_RECIPIENT(setup->request_type)) { - case LIBUSB_RECIPIENT_INTERFACE: - iface = setup->index & 0xFF; - break; - case LIBUSB_RECIPIENT_ENDPOINT: - r = libusb_get_active_config_descriptor(transfer->dev_handle->dev, &conf_desc); - if (r == LIBUSB_SUCCESS) { - iface = get_interface_by_endpoint(conf_desc, (setup->index & 0xFF)); - libusb_free_config_descriptor(conf_desc); - break; - } - // Fall through if not able to determine interface - default: - iface = -1; - break; - } - - // Try and target a specific interface if the control setup indicates such - if ((iface >= 0) && (iface < USB_MAXINTERFACES)) { - usbi_dbg("attempting control transfer targeted to interface %d", iface); - if (priv->usb_interface[iface].path != NULL) { - r = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer); - if (r == LIBUSB_SUCCESS) - return r; - } - } - - // Either not targeted to a specific interface or no luck in doing so. - // Try a 2 pass approach with all interfaces. - for (pass = 0; pass < 2; pass++) { - for (iface = 0; iface < USB_MAXINTERFACES; iface++) { - if (priv->usb_interface[iface].path != NULL) { - if ((pass == 0) && (priv->usb_interface[iface].restricted_functionality)) { - usbi_dbg("trying to skip restricted interface #%d (HID keyboard or mouse?)", iface); - continue; - } - usbi_dbg("using interface %d", iface); - r = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer); - // If not supported on this API, it may be supported on another, so don't give up yet!! - if (r == LIBUSB_ERROR_NOT_SUPPORTED) - continue; - return r; - } - } - } - - usbi_err(ctx, "no libusb supported interfaces to complete request"); - return LIBUSB_ERROR_NOT_FOUND; -} - -static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int current_interface; - - current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); - return LIBUSB_ERROR_NOT_FOUND; - } - - return priv->usb_interface[current_interface].apib-> - submit_bulk_transfer(priv->usb_interface[current_interface].sub_api, itransfer); -} - -static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int current_interface; - - current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); - return LIBUSB_ERROR_NOT_FOUND; - } - - return priv->usb_interface[current_interface].apib-> - submit_iso_transfer(priv->usb_interface[current_interface].sub_api, itransfer); -} - -static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int current_interface; - - current_interface = interface_by_endpoint(priv, handle_priv, endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); - return LIBUSB_ERROR_NOT_FOUND; - } - - return priv->usb_interface[current_interface].apib-> - clear_halt(priv->usb_interface[current_interface].sub_api, dev_handle, endpoint); -} - -static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->usb_interface[transfer_priv->interface_number].apib-> - abort_control(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer); -} - -static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->usb_interface[transfer_priv->interface_number].apib-> - abort_transfers(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer); -} - -static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int r; - uint8_t i; - bool available[SUB_API_MAX]; - - for (i = 0; i < SUB_API_MAX; i++) - available[i] = false; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if ((priv->usb_interface[i].apib->id == USB_API_WINUSBX) - && (priv->usb_interface[i].sub_api != SUB_API_NOTSET)) - available[priv->usb_interface[i].sub_api] = true; - } - - for (i = 0; i < SUB_API_MAX; i++) { - if (available[i]) { - r = usb_api_backend[USB_API_WINUSBX].reset_device(i, dev_handle); - if (r != LIBUSB_SUCCESS) - return r; - } - } - - return LIBUSB_SUCCESS; -} - -static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->usb_interface[transfer_priv->interface_number].apib-> - copy_transfer_data(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer, io_size); -} - -#endif /* !USE_USBDK */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.h deleted file mode 100644 index b7b9cd919a98..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.h +++ /dev/null @@ -1,937 +0,0 @@ -/* - * Windows backend for libusb 1.0 - * Copyright © 2009-2012 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * Major code testing contribution by Xiaofan Chen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#pragma once - -#include "windows_common.h" -#include "windows_nt_common.h" - -#if defined(_MSC_VER) -// disable /W4 MSVC warnings that are benign -#pragma warning(disable:4100) // unreferenced formal parameter -#pragma warning(disable:4127) // conditional expression is constant -#pragma warning(disable:4201) // nameless struct/union -#pragma warning(disable:4214) // bit field types other than int -#pragma warning(disable:4996) // deprecated API calls -#pragma warning(disable:28159) // more deprecated API calls -#endif - -// Missing from MSVC6 setupapi.h -#if !defined(SPDRP_ADDRESS) -#define SPDRP_ADDRESS 28 -#endif -#if !defined(SPDRP_INSTALL_STATE) -#define SPDRP_INSTALL_STATE 34 -#endif - -#define MAX_CTRL_BUFFER_LENGTH 4096 -#define MAX_USB_DEVICES 256 -#define MAX_USB_STRING_LENGTH 128 -#define MAX_HID_REPORT_SIZE 1024 -#define MAX_HID_DESCRIPTOR_SIZE 256 -#define MAX_GUID_STRING_LENGTH 40 -#define MAX_PATH_LENGTH 128 -#define MAX_KEY_LENGTH 256 -#define LIST_SEPARATOR ';' - -// Handle code for HID interface that have been claimed ("dibs") -#define INTERFACE_CLAIMED ((HANDLE)(intptr_t)0xD1B5) -// Additional return code for HID operations that completed synchronously -#define LIBUSB_COMPLETED (LIBUSB_SUCCESS + 1) - -// http://msdn.microsoft.com/en-us/library/ff545978.aspx -// http://msdn.microsoft.com/en-us/library/ff545972.aspx -// http://msdn.microsoft.com/en-us/library/ff545982.aspx -#if !defined(GUID_DEVINTERFACE_USB_HOST_CONTROLLER) -const GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27} }; -#endif -#if !defined(GUID_DEVINTERFACE_USB_DEVICE) -const GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} }; -#endif -#if !defined(GUID_DEVINTERFACE_USB_HUB) -const GUID GUID_DEVINTERFACE_USB_HUB = { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8} }; -#endif -#if !defined(GUID_DEVINTERFACE_LIBUSB0_FILTER) -const GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = { 0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9} }; -#endif - - -/* - * Multiple USB API backend support - */ -#define USB_API_UNSUPPORTED 0 -#define USB_API_HUB 1 -#define USB_API_COMPOSITE 2 -#define USB_API_WINUSBX 3 -#define USB_API_HID 4 -#define USB_API_MAX 5 -// The following is used to indicate if the HID or composite extra props have already been set. -#define USB_API_SET (1 << USB_API_MAX) - -// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL) -// Must have the same values as the KUSB_DRVID enum from libusbk.h -#define SUB_API_NOTSET -1 -#define SUB_API_LIBUSBK 0 -#define SUB_API_LIBUSB0 1 -#define SUB_API_WINUSB 2 -#define SUB_API_MAX 3 - -#define WINUSBX_DRV_NAMES {"libusbK", "libusb0", "WinUSB"} - -struct windows_usb_api_backend { - const uint8_t id; - const char *designation; - const char **driver_name_list; // Driver name, without .sys, e.g. "usbccgp" - const uint8_t nb_driver_names; - int (*init)(int sub_api, struct libusb_context *ctx); - int (*exit)(int sub_api); - int (*open)(int sub_api, struct libusb_device_handle *dev_handle); - void (*close)(int sub_api, struct libusb_device_handle *dev_handle); - int (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface); - int (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); - int (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); - int (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); - int (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); - int (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle); - int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer); - int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer); - int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer); - int (*abort_control)(int sub_api, struct usbi_transfer *itransfer); - int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer); - int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); -}; - -extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX]; - -#define PRINT_UNSUPPORTED_API(fname) \ - usbi_dbg("unsupported API call for '" \ - #fname "' (unrecognized device driver)"); \ - return LIBUSB_ERROR_NOT_SUPPORTED; - -/* - * private structures definition - * with inline pseudo constructors/destructors - */ - -// TODO (v2+): move hid desc to libusb.h? -struct libusb_hid_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdHID; - uint8_t bCountryCode; - uint8_t bNumDescriptors; - uint8_t bClassDescriptorType; - uint16_t wClassDescriptorLength; -}; - -#define LIBUSB_DT_HID_SIZE 9 -#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \ - + LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE) -#define HID_MAX_REPORT_SIZE 1024 -#define HID_IN_EP 0x81 -#define HID_OUT_EP 0x02 -#define LIBUSB_REQ_RECIPIENT(request_type) ((request_type) & 0x1F) -#define LIBUSB_REQ_TYPE(request_type) ((request_type) & (0x03 << 5)) -#define LIBUSB_REQ_IN(request_type) ((request_type) & LIBUSB_ENDPOINT_IN) -#define LIBUSB_REQ_OUT(request_type) (!LIBUSB_REQ_IN(request_type)) - -// The following are used for HID reports IOCTLs -#define HID_CTL_CODE(id) \ - CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS) -#define HID_BUFFER_CTL_CODE(id) \ - CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_BUFFERED, FILE_ANY_ACCESS) -#define HID_IN_CTL_CODE(id) \ - CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS) -#define HID_OUT_CTL_CODE(id) \ - CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) - -#define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) -#define IOCTL_HID_GET_INPUT_REPORT HID_OUT_CTL_CODE(104) -#define IOCTL_HID_SET_FEATURE HID_IN_CTL_CODE(100) -#define IOCTL_HID_SET_OUTPUT_REPORT HID_IN_CTL_CODE(101) - -enum libusb_hid_request_type { - HID_REQ_GET_REPORT = 0x01, - HID_REQ_GET_IDLE = 0x02, - HID_REQ_GET_PROTOCOL = 0x03, - HID_REQ_SET_REPORT = 0x09, - HID_REQ_SET_IDLE = 0x0A, - HID_REQ_SET_PROTOCOL = 0x0B -}; - -enum libusb_hid_report_type { - HID_REPORT_TYPE_INPUT = 0x01, - HID_REPORT_TYPE_OUTPUT = 0x02, - HID_REPORT_TYPE_FEATURE = 0x03 -}; - -struct hid_device_priv { - uint16_t vid; - uint16_t pid; - uint8_t config; - uint8_t nb_interfaces; - bool uses_report_ids[3]; // input, ouptput, feature - uint16_t input_report_size; - uint16_t output_report_size; - uint16_t feature_report_size; - WCHAR string[3][MAX_USB_STRING_LENGTH]; - uint8_t string_index[3]; // man, prod, ser -}; - -struct windows_device_priv { - uint8_t depth; // distance to HCD - uint8_t port; // port number on the hub - uint8_t active_config; - struct windows_usb_api_backend const *apib; - char *path; // device interface path - int sub_api; // for WinUSB-like APIs - struct { - char *path; // each interface needs a device interface path, - struct windows_usb_api_backend const *apib; // an API backend (multiple drivers support), - int sub_api; - int8_t nb_endpoints; // and a set of endpoint addresses (USB_MAXENDPOINTS) - uint8_t *endpoint; - bool restricted_functionality; // indicates if the interface functionality is restricted - // by Windows (eg. HID keyboards or mice cannot do R/W) - } usb_interface[USB_MAXINTERFACES]; - struct hid_device_priv *hid; - USB_DEVICE_DESCRIPTOR dev_descriptor; - unsigned char **config_descriptor; // list of pointers to the cached config descriptors -}; - -static inline struct windows_device_priv *_device_priv(struct libusb_device *dev) -{ - return (struct windows_device_priv *)dev->os_priv; -} - -static inline struct windows_device_priv *windows_device_priv_init(struct libusb_device *dev) -{ - struct windows_device_priv *p = _device_priv(dev); - int i; - - p->apib = &usb_api_backend[USB_API_UNSUPPORTED]; - p->sub_api = SUB_API_NOTSET; - for (i = 0; i < USB_MAXINTERFACES; i++) { - p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED]; - p->usb_interface[i].sub_api = SUB_API_NOTSET; - } - - return p; -} - -static inline void windows_device_priv_release(struct libusb_device *dev) -{ - struct windows_device_priv *p = _device_priv(dev); - int i; - - free(p->path); - if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) { - for (i = 0; i < dev->num_configurations; i++) - free(p->config_descriptor[i]); - } - free(p->config_descriptor); - free(p->hid); - for (i = 0; i < USB_MAXINTERFACES; i++) { - free(p->usb_interface[i].path); - free(p->usb_interface[i].endpoint); - } -} - -struct interface_handle_t { - HANDLE dev_handle; // WinUSB needs an extra handle for the file - HANDLE api_handle; // used by the API to communicate with the device -}; - -struct windows_device_handle_priv { - int active_interface; - struct interface_handle_t interface_handle[USB_MAXINTERFACES]; - int autoclaim_count[USB_MAXINTERFACES]; // For auto-release -}; - -static inline struct windows_device_handle_priv *_device_handle_priv( - struct libusb_device_handle *handle) -{ - return (struct windows_device_handle_priv *)handle->os_priv; -} - -// used for async polling functions -struct windows_transfer_priv { - struct winfd pollable_fd; - uint8_t interface_number; - uint8_t *hid_buffer; // 1 byte extended data buffer, required for HID - uint8_t *hid_dest; // transfer buffer destination, required for HID - size_t hid_expected_size; -}; - -// used to match a device driver (including filter drivers) against a supported API -struct driver_lookup { - char list[MAX_KEY_LENGTH + 1]; // REG_MULTI_SZ list of services (driver) names - const DWORD reg_prop; // SPDRP registry key to use to retrieve list - const char* designation; // internal designation (for debug output) -}; - -/* OLE32 dependency */ -DLL_DECLARE_HANDLE(OLE32); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID)); - -/* Kernel32 dependencies */ -DLL_DECLARE_HANDLE(Kernel32); -/* This call is only available from XP SP2 */ -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, IsWow64Process, (HANDLE, PBOOL)); - -/* SetupAPI dependencies */ -DLL_DECLARE_HANDLE(SetupAPI); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (const GUID*, PCSTR, HWND, DWORD)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA, - const GUID*, DWORD, PSP_DEVICE_INTERFACE_DATA)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, - PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO, - PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD)); - -/* AdvAPI32 dependencies */ -DLL_DECLARE_HANDLE(AdvAPI32); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); - -/* - * Windows DDK API definitions. Most of it copied from MinGW's includes - */ -typedef DWORD DEVNODE, DEVINST; -typedef DEVNODE *PDEVNODE, *PDEVINST; -typedef DWORD RETURN_TYPE; -typedef RETURN_TYPE CONFIGRET; - -#define CR_SUCCESS 0x00000000 -#define CR_NO_SUCH_DEVNODE 0x0000000D - -#define USB_DEVICE_DESCRIPTOR_TYPE LIBUSB_DT_DEVICE -#define USB_CONFIGURATION_DESCRIPTOR_TYPE LIBUSB_DT_CONFIG -#define USB_STRING_DESCRIPTOR_TYPE LIBUSB_DT_STRING -#define USB_INTERFACE_DESCRIPTOR_TYPE LIBUSB_DT_INTERFACE -#define USB_ENDPOINT_DESCRIPTOR_TYPE LIBUSB_DT_ENDPOINT - -#define USB_REQUEST_GET_STATUS LIBUSB_REQUEST_GET_STATUS -#define USB_REQUEST_CLEAR_FEATURE LIBUSB_REQUEST_CLEAR_FEATURE -#define USB_REQUEST_SET_FEATURE LIBUSB_REQUEST_SET_FEATURE -#define USB_REQUEST_SET_ADDRESS LIBUSB_REQUEST_SET_ADDRESS -#define USB_REQUEST_GET_DESCRIPTOR LIBUSB_REQUEST_GET_DESCRIPTOR -#define USB_REQUEST_SET_DESCRIPTOR LIBUSB_REQUEST_SET_DESCRIPTOR -#define USB_REQUEST_GET_CONFIGURATION LIBUSB_REQUEST_GET_CONFIGURATION -#define USB_REQUEST_SET_CONFIGURATION LIBUSB_REQUEST_SET_CONFIGURATION -#define USB_REQUEST_GET_INTERFACE LIBUSB_REQUEST_GET_INTERFACE -#define USB_REQUEST_SET_INTERFACE LIBUSB_REQUEST_SET_INTERFACE -#define USB_REQUEST_SYNC_FRAME LIBUSB_REQUEST_SYNCH_FRAME - -#define USB_GET_NODE_INFORMATION 258 -#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260 -#define USB_GET_NODE_CONNECTION_NAME 261 -#define USB_GET_HUB_CAPABILITIES 271 -#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX) -#define USB_GET_NODE_CONNECTION_INFORMATION_EX 274 -#endif -#if !defined(USB_GET_HUB_CAPABILITIES_EX) -#define USB_GET_HUB_CAPABILITIES_EX 276 -#endif -#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX_V2) -#define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 279 -#endif - -#ifndef METHOD_BUFFERED -#define METHOD_BUFFERED 0 -#endif -#ifndef FILE_ANY_ACCESS -#define FILE_ANY_ACCESS 0x00000000 -#endif -#ifndef FILE_DEVICE_UNKNOWN -#define FILE_DEVICE_UNKNOWN 0x00000022 -#endif -#ifndef FILE_DEVICE_USB -#define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN -#endif - -#ifndef CTL_CODE -#define CTL_CODE(DeviceType, Function, Method, Access) \ - (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) -#endif - -typedef enum USB_CONNECTION_STATUS { - NoDeviceConnected, - DeviceConnected, - DeviceFailedEnumeration, - DeviceGeneralFailure, - DeviceCausedOvercurrent, - DeviceNotEnoughPower, - DeviceNotEnoughBandwidth, - DeviceHubNestedTooDeeply, - DeviceInLegacyHub -} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; - -typedef enum USB_HUB_NODE { - UsbHub, - UsbMIParent -} USB_HUB_NODE; - -/* Cfgmgr32.dll interface */ -DLL_DECLARE_HANDLE(Cfgmgr32); -DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG)); -DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG)); -DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Sibling, (PDEVINST, DEVINST, ULONG)); -DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG)); - -#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \ - CTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_HUB_CAPABILITIES \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_ROOT_HUB_NAME \ - CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_INFORMATION \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -// Most of the structures below need to be packed -#pragma pack(push, 1) - -typedef struct USB_INTERFACE_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - UCHAR bInterfaceNumber; - UCHAR bAlternateSetting; - UCHAR bNumEndpoints; - UCHAR bInterfaceClass; - UCHAR bInterfaceSubClass; - UCHAR bInterfaceProtocol; - UCHAR iInterface; -} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; - -typedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT { - struct { - ULONG ConnectionIndex; - struct { - UCHAR bmRequest; - UCHAR bRequest; - USHORT wValue; - USHORT wIndex; - USHORT wLength; - } SetupPacket; - } req; - USB_CONFIGURATION_DESCRIPTOR data; -} USB_CONFIGURATION_DESCRIPTOR_SHORT; - -typedef struct USB_ENDPOINT_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - UCHAR bEndpointAddress; - UCHAR bmAttributes; - USHORT wMaxPacketSize; - UCHAR bInterval; -} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; - -typedef struct USB_DESCRIPTOR_REQUEST { - ULONG ConnectionIndex; - struct { - UCHAR bmRequest; - UCHAR bRequest; - USHORT wValue; - USHORT wIndex; - USHORT wLength; - } SetupPacket; -// UCHAR Data[0]; -} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; - -typedef struct USB_HUB_DESCRIPTOR { - UCHAR bDescriptorLength; - UCHAR bDescriptorType; - UCHAR bNumberOfPorts; - USHORT wHubCharacteristics; - UCHAR bPowerOnToPowerGood; - UCHAR bHubControlCurrent; - UCHAR bRemoveAndPowerMask[64]; -} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR; - -typedef struct USB_ROOT_HUB_NAME { - ULONG ActualLength; - WCHAR RootHubName[1]; -} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; - -typedef struct USB_ROOT_HUB_NAME_FIXED { - ULONG ActualLength; - WCHAR RootHubName[MAX_PATH_LENGTH]; -} USB_ROOT_HUB_NAME_FIXED; - -typedef struct USB_NODE_CONNECTION_NAME { - ULONG ConnectionIndex; - ULONG ActualLength; - WCHAR NodeName[1]; -} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; - -typedef struct USB_NODE_CONNECTION_NAME_FIXED { - ULONG ConnectionIndex; - ULONG ActualLength; - WCHAR NodeName[MAX_PATH_LENGTH]; -} USB_NODE_CONNECTION_NAME_FIXED; - -typedef struct USB_HUB_NAME_FIXED { - union { - USB_ROOT_HUB_NAME_FIXED root; - USB_NODE_CONNECTION_NAME_FIXED node; - } u; -} USB_HUB_NAME_FIXED; - -typedef struct USB_HUB_INFORMATION { - USB_HUB_DESCRIPTOR HubDescriptor; - BOOLEAN HubIsBusPowered; -} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; - -typedef struct USB_MI_PARENT_INFORMATION { - ULONG NumberOfInterfaces; -} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; - -typedef struct USB_NODE_INFORMATION { - USB_HUB_NODE NodeType; - union { - USB_HUB_INFORMATION HubInformation; - USB_MI_PARENT_INFORMATION MiParentInformation; - } u; -} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; - -typedef struct USB_PIPE_INFO { - USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; - ULONG ScheduleOffset; -} USB_PIPE_INFO, *PUSB_PIPE_INFO; - -typedef struct USB_NODE_CONNECTION_INFORMATION_EX { - ULONG ConnectionIndex; - USB_DEVICE_DESCRIPTOR DeviceDescriptor; - UCHAR CurrentConfigurationValue; - UCHAR Speed; - BOOLEAN DeviceIsHub; - USHORT DeviceAddress; - ULONG NumberOfOpenPipes; - USB_CONNECTION_STATUS ConnectionStatus; -// USB_PIPE_INFO PipeList[0]; -} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX; - -typedef union _USB_PROTOCOLS { - ULONG ul; - struct { - ULONG Usb110:1; - ULONG Usb200:1; - ULONG Usb300:1; - ULONG ReservedMBZ:29; - }; -} USB_PROTOCOLS, *PUSB_PROTOCOLS; - -typedef union _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS { - ULONG ul; - struct { - ULONG DeviceIsOperatingAtSuperSpeedOrHigher:1; - ULONG DeviceIsSuperSpeedCapableOrHigher:1; - ULONG ReservedMBZ:30; - }; -} USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS; - -typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 { - ULONG ConnectionIndex; - ULONG Length; - USB_PROTOCOLS SupportedUsbProtocols; - USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags; -} USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2; - -typedef struct USB_HUB_CAP_FLAGS { - ULONG HubIsHighSpeedCapable:1; - ULONG HubIsHighSpeed:1; - ULONG HubIsMultiTtCapable:1; - ULONG HubIsMultiTt:1; - ULONG HubIsRoot:1; - ULONG HubIsArmedWakeOnConnect:1; - ULONG ReservedMBZ:26; -} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS; - -typedef struct USB_HUB_CAPABILITIES { - ULONG HubIs2xCapable:1; -} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; - -typedef struct USB_HUB_CAPABILITIES_EX { - USB_HUB_CAP_FLAGS CapabilityFlags; -} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX; - -#pragma pack(pop) - -/* winusb.dll interface */ - -#define SHORT_PACKET_TERMINATE 0x01 -#define AUTO_CLEAR_STALL 0x02 -#define PIPE_TRANSFER_TIMEOUT 0x03 -#define IGNORE_SHORT_PACKETS 0x04 -#define ALLOW_PARTIAL_READS 0x05 -#define AUTO_FLUSH 0x06 -#define RAW_IO 0x07 -#define MAXIMUM_TRANSFER_SIZE 0x08 -#define AUTO_SUSPEND 0x81 -#define SUSPEND_DELAY 0x83 -#define DEVICE_SPEED 0x01 -#define LowSpeed 0x01 -#define FullSpeed 0x02 -#define HighSpeed 0x03 - -typedef enum USBD_PIPE_TYPE { - UsbdPipeTypeControl, - UsbdPipeTypeIsochronous, - UsbdPipeTypeBulk, - UsbdPipeTypeInterrupt -} USBD_PIPE_TYPE; - -typedef struct { - USBD_PIPE_TYPE PipeType; - UCHAR PipeId; - USHORT MaximumPacketSize; - UCHAR Interval; -} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION; - -#pragma pack(1) -typedef struct { - UCHAR request_type; - UCHAR request; - USHORT value; - USHORT index; - USHORT length; -} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET; -#pragma pack() - -typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; - -typedef BOOL (WINAPI *WinUsb_AbortPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID -); -typedef BOOL (WINAPI *WinUsb_ControlTransfer_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - WINUSB_SETUP_PACKET SetupPacket, - PUCHAR Buffer, - ULONG BufferLength, - PULONG LengthTransferred, - LPOVERLAPPED Overlapped -); -typedef BOOL (WINAPI *WinUsb_FlushPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID -); -typedef BOOL (WINAPI *WinUsb_Free_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle -); -typedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR AssociatedInterfaceIndex, - PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle -); -typedef BOOL (WINAPI *WinUsb_GetCurrentAlternateSetting_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - PUCHAR AlternateSetting -); -typedef BOOL (WINAPI *WinUsb_GetDescriptor_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR DescriptorType, - UCHAR Index, - USHORT LanguageID, - PUCHAR Buffer, - ULONG BufferLength, - PULONG LengthTransferred -); -typedef BOOL (WINAPI *WinUsb_GetOverlappedResult_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - LPOVERLAPPED lpOverlapped, - LPDWORD lpNumberOfBytesTransferred, - BOOL bWait -); -typedef BOOL (WINAPI *WinUsb_GetPipePolicy_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - ULONG PolicyType, - PULONG ValueLength, - PVOID Value -); -typedef BOOL (WINAPI *WinUsb_GetPowerPolicy_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - ULONG PolicyType, - PULONG ValueLength, - PVOID Value -); -typedef BOOL (WINAPI *WinUsb_Initialize_t)( - HANDLE DeviceHandle, - PWINUSB_INTERFACE_HANDLE InterfaceHandle -); -typedef BOOL (WINAPI *WinUsb_QueryDeviceInformation_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - ULONG InformationType, - PULONG BufferLength, - PVOID Buffer -); -typedef BOOL (WINAPI *WinUsb_QueryInterfaceSettings_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR AlternateSettingNumber, - PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor -); -typedef BOOL (WINAPI *WinUsb_QueryPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR AlternateInterfaceNumber, - UCHAR PipeIndex, - PWINUSB_PIPE_INFORMATION PipeInformation -); -typedef BOOL (WINAPI *WinUsb_ReadPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - PUCHAR Buffer, - ULONG BufferLength, - PULONG LengthTransferred, - LPOVERLAPPED Overlapped -); -typedef BOOL (WINAPI *WinUsb_ResetPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID -); -typedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR AlternateSetting -); -typedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - ULONG PolicyType, - ULONG ValueLength, - PVOID Value -); -typedef BOOL (WINAPI *WinUsb_SetPowerPolicy_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - ULONG PolicyType, - ULONG ValueLength, - PVOID Value -); -typedef BOOL (WINAPI *WinUsb_WritePipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - PUCHAR Buffer, - ULONG BufferLength, - PULONG LengthTransferred, - LPOVERLAPPED Overlapped -); -typedef BOOL (WINAPI *WinUsb_ResetDevice_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle -); - -/* /!\ These must match the ones from the official libusbk.h */ -typedef enum _KUSB_FNID { - KUSB_FNID_Init, - KUSB_FNID_Free, - KUSB_FNID_ClaimInterface, - KUSB_FNID_ReleaseInterface, - KUSB_FNID_SetAltInterface, - KUSB_FNID_GetAltInterface, - KUSB_FNID_GetDescriptor, - KUSB_FNID_ControlTransfer, - KUSB_FNID_SetPowerPolicy, - KUSB_FNID_GetPowerPolicy, - KUSB_FNID_SetConfiguration, - KUSB_FNID_GetConfiguration, - KUSB_FNID_ResetDevice, - KUSB_FNID_Initialize, - KUSB_FNID_SelectInterface, - KUSB_FNID_GetAssociatedInterface, - KUSB_FNID_Clone, - KUSB_FNID_QueryInterfaceSettings, - KUSB_FNID_QueryDeviceInformation, - KUSB_FNID_SetCurrentAlternateSetting, - KUSB_FNID_GetCurrentAlternateSetting, - KUSB_FNID_QueryPipe, - KUSB_FNID_SetPipePolicy, - KUSB_FNID_GetPipePolicy, - KUSB_FNID_ReadPipe, - KUSB_FNID_WritePipe, - KUSB_FNID_ResetPipe, - KUSB_FNID_AbortPipe, - KUSB_FNID_FlushPipe, - KUSB_FNID_IsoReadPipe, - KUSB_FNID_IsoWritePipe, - KUSB_FNID_GetCurrentFrameNumber, - KUSB_FNID_GetOverlappedResult, - KUSB_FNID_GetProperty, - KUSB_FNID_COUNT, -} KUSB_FNID; - -typedef struct _KLIB_VERSION { - INT Major; - INT Minor; - INT Micro; - INT Nano; -} KLIB_VERSION; -typedef KLIB_VERSION* PKLIB_VERSION; - -typedef BOOL (WINAPI *LibK_GetProcAddress_t)( - PVOID *ProcAddress, - ULONG DriverID, - ULONG FunctionID -); - -typedef VOID (WINAPI *LibK_GetVersion_t)( - PKLIB_VERSION Version -); - -struct winusb_interface { - bool initialized; - WinUsb_AbortPipe_t AbortPipe; - WinUsb_ControlTransfer_t ControlTransfer; - WinUsb_FlushPipe_t FlushPipe; - WinUsb_Free_t Free; - WinUsb_GetAssociatedInterface_t GetAssociatedInterface; - WinUsb_GetCurrentAlternateSetting_t GetCurrentAlternateSetting; - WinUsb_GetDescriptor_t GetDescriptor; - WinUsb_GetOverlappedResult_t GetOverlappedResult; - WinUsb_GetPipePolicy_t GetPipePolicy; - WinUsb_GetPowerPolicy_t GetPowerPolicy; - WinUsb_Initialize_t Initialize; - WinUsb_QueryDeviceInformation_t QueryDeviceInformation; - WinUsb_QueryInterfaceSettings_t QueryInterfaceSettings; - WinUsb_QueryPipe_t QueryPipe; - WinUsb_ReadPipe_t ReadPipe; - WinUsb_ResetPipe_t ResetPipe; - WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting; - WinUsb_SetPipePolicy_t SetPipePolicy; - WinUsb_SetPowerPolicy_t SetPowerPolicy; - WinUsb_WritePipe_t WritePipe; - WinUsb_ResetDevice_t ResetDevice; -}; - -/* hid.dll interface */ - -#define HIDP_STATUS_SUCCESS 0x110000 -typedef void * PHIDP_PREPARSED_DATA; - -#pragma pack(1) -typedef struct { - ULONG Size; - USHORT VendorID; - USHORT ProductID; - USHORT VersionNumber; -} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; -#pragma pack() - -typedef USHORT USAGE; -typedef struct { - USAGE Usage; - USAGE UsagePage; - USHORT InputReportByteLength; - USHORT OutputReportByteLength; - USHORT FeatureReportByteLength; - USHORT Reserved[17]; - USHORT NumberLinkCollectionNodes; - USHORT NumberInputButtonCaps; - USHORT NumberInputValueCaps; - USHORT NumberInputDataIndices; - USHORT NumberOutputButtonCaps; - USHORT NumberOutputValueCaps; - USHORT NumberOutputDataIndices; - USHORT NumberFeatureButtonCaps; - USHORT NumberFeatureValueCaps; - USHORT NumberFeatureDataIndices; -} HIDP_CAPS, *PHIDP_CAPS; - -typedef enum _HIDP_REPORT_TYPE { - HidP_Input, - HidP_Output, - HidP_Feature -} HIDP_REPORT_TYPE; - -typedef struct _HIDP_VALUE_CAPS { - USAGE UsagePage; - UCHAR ReportID; - BOOLEAN IsAlias; - USHORT BitField; - USHORT LinkCollection; - USAGE LinkUsage; - USAGE LinkUsagePage; - BOOLEAN IsRange; - BOOLEAN IsStringRange; - BOOLEAN IsDesignatorRange; - BOOLEAN IsAbsolute; - BOOLEAN HasNull; - UCHAR Reserved; - USHORT BitSize; - USHORT ReportCount; - USHORT Reserved2[5]; - ULONG UnitsExp; - ULONG Units; - LONG LogicalMin, LogicalMax; - LONG PhysicalMin, PhysicalMax; - union { - struct { - USAGE UsageMin, UsageMax; - USHORT StringMin, StringMax; - USHORT DesignatorMin, DesignatorMax; - USHORT DataIndexMin, DataIndexMax; - } Range; - struct { - USAGE Usage, Reserved1; - USHORT StringIndex, Reserved2; - USHORT DesignatorIndex, Reserved3; - USHORT DataIndex, Reserved4; - } NotRange; - } u; -} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS; - -DLL_DECLARE_HANDLE(hid); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES)); -DLL_DECLARE_FUNC(WINAPI, VOID, HidD_GetHidGuid, (LPGUID)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, LONG, HidP_GetCaps, (PHIDP_PREPARSED_DATA, PHIDP_CAPS)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetFeature, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetFeature, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetInputReport, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetOutputReport, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FlushQueue, (HANDLE)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA)); \ No newline at end of file diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/version_nano.h b/vendor/github.com/karalabe/hid/libusb/libusb/version_nano.h deleted file mode 100644 index 0a5d1c992640..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/version_nano.h +++ /dev/null @@ -1 +0,0 @@ -#define LIBUSB_NANO 11182 diff --git a/vendor/github.com/karalabe/usb/AUTHORS b/vendor/github.com/karalabe/usb/AUTHORS new file mode 100644 index 000000000000..bae45b3ec294 --- /dev/null +++ b/vendor/github.com/karalabe/usb/AUTHORS @@ -0,0 +1,7 @@ +Felix Lange +Guillaume Ballet +Jakob Weisblat +Martin Holst Swende +Mateusz Mikołajczyk +Péter Szilágyi +Rosen Penev diff --git a/vendor/github.com/karalabe/usb/Dockerfile.alpine b/vendor/github.com/karalabe/usb/Dockerfile.alpine new file mode 100644 index 000000000000..342bdf79a7ab --- /dev/null +++ b/vendor/github.com/karalabe/usb/Dockerfile.alpine @@ -0,0 +1,6 @@ +FROM golang:alpine + +RUN apk add --no-cache git gcc musl-dev linux-headers + +ADD . $GOPATH/src/github.com/karalabe/usb +RUN cd $GOPATH/src/github.com/karalabe/usb && go install diff --git a/vendor/github.com/karalabe/usb/Dockerfile.ubuntu b/vendor/github.com/karalabe/usb/Dockerfile.ubuntu new file mode 100644 index 000000000000..b861e497beec --- /dev/null +++ b/vendor/github.com/karalabe/usb/Dockerfile.ubuntu @@ -0,0 +1,4 @@ +FROM golang:latest + +ADD . $GOPATH/src/github.com/karalabe/usb +RUN cd $GOPATH/src/github.com/karalabe/usb && go install diff --git a/vendor/github.com/karalabe/usb/LICENSE b/vendor/github.com/karalabe/usb/LICENSE new file mode 100644 index 000000000000..65c5ca88a67c --- /dev/null +++ b/vendor/github.com/karalabe/usb/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/vendor/github.com/karalabe/usb/README.md b/vendor/github.com/karalabe/usb/README.md new file mode 100644 index 000000000000..b6920f51a130 --- /dev/null +++ b/vendor/github.com/karalabe/usb/README.md @@ -0,0 +1,47 @@ +[![Travis][travisimg]][travisurl] +[![AppVeyor][appveyorimg]][appveyorurl] +[![GoDoc][docimg]][docurl] + +[travisimg]: https://travis-ci.org/karalabe/usb.svg?branch=master +[travisurl]: https://travis-ci.org/karalabe/usb +[appveyorimg]: https://ci.appveyor.com/api/projects/status/u96eq262bj2itprh/branch/master?svg=true +[appveyorurl]: https://ci.appveyor.com/project/karalabe/usb +[docimg]: https://godoc.org/github.com/karalabe/usb?status.svg +[docurl]: https://godoc.org/github.com/karalabe/usb + +# Yet another USB library for Go + +The `usb` package is a cross platform, fully self-contained library for accessing and communicating with USB devices **either via HID or low level interrupts**. The goal of the library was to create a simple way to find-, attach to- and read/write form USB devices. + +There are multiple already existing USB libraries: + + * The original `gousb` package [created by @kylelemons](https://github.com/kylelemons/gousb) and nowadays [maintained by @google](https://github.com/google/gousb) is a CGO wrapper around `libusb`. It is the most advanced USB library for Go out there. + * Unfortunately, `gousb` requires the `libusb` C library to be installed both during build as well as during runtime on the host operating system. This breaks binary portability and also adds unnecessary hurdles on Windows. + * Furthermore, whilst HID devices are supported by `libusb`, the OS on Macos and Windows explicitly takes over these devices, so only native system calls can be used on recent versions (i.e. you **cannot** use `libusb` for HID). + * There is a fork of `gousb` [created by @karalabe](https://github.com/karalabe/gousb) that statically linked `libusb` during build, but with the lack of HID access, that work was abandoned. + * For HID-only devices, a previous self-contained package was created at [`github.com/karalabe/hid`](https://github.com/karalabe/hid), which worked well for hardware wallet uses cases in [`go-ethereum`](https://github.com/ethereum/go-ethereum). It's a simple package that does it's thing well. + * Unfortunately, `hid` is not capable of talking to generic USB devices. When multiple different devices are needed, eventually some will not support the HID spec (e.g. WebUSB). Pulling in both `hid` and `gousb` will break down due to both depending internally on different versions of `libusb` on Linux. + +This `usb` package is a proper integration of `hidapi` and `libusb` so that communication with HID devices is done via system calls, whereas communication with lower level USB devices is done via interrupts. All this detail is hidden away behind a tiny interface. + +The package supports Linux, macOS, Windows and FreeBSD. Exclude constraints are also specified for Android and iOS to allow smoother vendoring into cross platform projects. + +## Cross-compiling + +Using `go get`, the embedded C library is compiled into the binary format of your host OS. Cross compiling to a different platform or architecture entails disabling CGO by default in Go, causing device enumeration `hid.Enumerate()` to yield no results. + +To cross compile a functional version of this library, you'll need to enable CGO during cross compilation via `CGO_ENABLED=1` and you'll need to install and set a cross compilation enabled C toolkit via `CC=your-cross-gcc`. + +## Acknowledgements + +Although the `usb` package is an implementation from scratch, HID support was heavily inspired by the existing [`go.hid`](https://github.com/GeertJohan/go.hid) library, which seems abandoned since 2015; is incompatible with Go 1.6+; and has various external dependencies. + +Wide character support in the HID support is done via the [`gowchar`](https://github.com/orofarne/gowchar) library, unmaintained since 2013; non buildable with a modern Go release and failing `go vet` checks. As such, `gowchar` was also vendored in inline. + +Error handling for the `libusb` integration originates from the [`gousb`](https://github.com/google/gousb) library. + +## License + +This USB library is licensed under the [GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html) (dictated by libusb). + +If you are only interested in Human Interface devices, a less restrictive package can be found at [`github.com/karalabe/hid`](https://github.com/karalabe/hid). diff --git a/vendor/github.com/karalabe/usb/appveyor.yml b/vendor/github.com/karalabe/usb/appveyor.yml new file mode 100644 index 000000000000..1d921ae51da1 --- /dev/null +++ b/vendor/github.com/karalabe/usb/appveyor.yml @@ -0,0 +1,35 @@ +os: Visual Studio 2015 + +# Clone directly into GOPATH. +clone_folder: C:\gopath\src\github.com\karalabe\usb +clone_depth: 1 +version: "{branch}.{build}" +environment: + global: + GOPATH: C:\gopath + CC: gcc.exe + matrix: + - GOARCH: amd64 + MSYS2_ARCH: x86_64 + MSYS2_BITS: 64 + MSYSTEM: MINGW64 + PATH: C:\msys64\mingw64\bin\;%PATH% + - GOARCH: 386 + MSYS2_ARCH: i686 + MSYS2_BITS: 32 + MSYSTEM: MINGW32 + PATH: C:\msys64\mingw32\bin\;%PATH% + +install: + - rmdir C:\go /s /q + - appveyor DownloadFile https://storage.googleapis.com/golang/go1.12.6.windows-%GOARCH%.zip + - 7z x go1.12.6.windows-%GOARCH%.zip -y -oC:\ > NUL + - go version + - gcc --version + +build_script: + - go install ./... + - go test -v ./... + - set CGO_ENABLED=0 + - go install ./... + - go test -v ./... diff --git a/vendor/github.com/karalabe/usb/demo.go b/vendor/github.com/karalabe/usb/demo.go new file mode 100644 index 000000000000..229faaf5f801 --- /dev/null +++ b/vendor/github.com/karalabe/usb/demo.go @@ -0,0 +1,76 @@ +// usb - Self contained USB and HID library for Go +// Copyright 2019 The library Authors +// +// This library is free software: you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// The library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with the library. If not, see . + +// +build none + +package main + +import ( + "fmt" + "strings" + + "github.com/karalabe/usb" +) + +func main() { + // Enumerate all the HID devices in alphabetical path order + hids, err := usb.EnumerateHid(0, 0) + if err != nil { + panic(err) + } + for i := 0; i < len(hids); i++ { + for j := i + 1; j < len(hids); j++ { + if hids[i].Path > hids[j].Path { + hids[i], hids[j] = hids[j], hids[i] + } + } + } + for i, hid := range hids { + fmt.Println(strings.Repeat("-", 128)) + fmt.Printf("HID #%d\n", i) + fmt.Printf(" OS Path: %s\n", hid.Path) + fmt.Printf(" Vendor ID: %#04x\n", hid.VendorID) + fmt.Printf(" Product ID: %#04x\n", hid.ProductID) + fmt.Printf(" Release: %d\n", hid.Release) + fmt.Printf(" Serial: %s\n", hid.Serial) + fmt.Printf(" Manufacturer: %s\n", hid.Manufacturer) + fmt.Printf(" Product: %s\n", hid.Product) + fmt.Printf(" Usage Page: %d\n", hid.UsagePage) + fmt.Printf(" Usage: %d\n", hid.Usage) + fmt.Printf(" Interface: %d\n", hid.Interface) + } + fmt.Println(strings.Repeat("=", 128)) + + // Enumerate all the non-HID devices in alphabetical path order + raws, err := usb.EnumerateRaw(0, 0) + if err != nil { + panic(err) + } + for i := 0; i < len(raws); i++ { + for j := i + 1; j < len(raws); j++ { + if raws[i].Path > raws[j].Path { + raws[i], raws[j] = raws[j], raws[i] + } + } + } + for i, raw := range raws { + fmt.Printf("RAW #%d\n", i) + fmt.Printf(" OS Path: %s\n", raw.Path) + fmt.Printf(" Vendor ID: %#04x\n", raw.VendorID) + fmt.Printf(" Product ID: %#04x\n", raw.ProductID) + fmt.Printf(" Interface: %d\n", raw.Interface) + fmt.Println(strings.Repeat("-", 128)) + } +} diff --git a/vendor/github.com/karalabe/usb/go.mod b/vendor/github.com/karalabe/usb/go.mod new file mode 100644 index 000000000000..ef549d28f55e --- /dev/null +++ b/vendor/github.com/karalabe/usb/go.mod @@ -0,0 +1,3 @@ +module github.com/karalabe/usb + +go 1.12 diff --git a/vendor/github.com/karalabe/usb/hid_disabled.go b/vendor/github.com/karalabe/usb/hid_disabled.go new file mode 100644 index 000000000000..a85964bf355e --- /dev/null +++ b/vendor/github.com/karalabe/usb/hid_disabled.go @@ -0,0 +1,42 @@ +// usb - Self contained USB and HID library for Go +// Copyright 2017 The library Authors +// +// This library is free software: you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// The library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with the library. If not, see . + +// +build !freebsd,!linux,!darwin,!windows ios !cgo + +package usb + +// HidDevice is a live HID USB connected device handle. On platforms that this file +// implements, the type lacks the actual HID device and all methods are noop. +type HidDevice struct { + DeviceInfo // Embed the infos for easier access +} + +// Close releases the HID USB device handle. On platforms that this file implements, +// the method is just a noop. +func (dev *HidDevice) Close() error { + return ErrUnsupportedPlatform +} + +// Write sends an output report to a HID device. On platforms that this file +// implements, the method just returns an error. +func (dev *HidDevice) Write(b []byte) (int, error) { + return 0, ErrUnsupportedPlatform +} + +// Read retrieves an input report from a HID device. On platforms that this file +// implements, the method just returns an error. +func (dev *HidDevice) Read(b []byte) (int, error) { + return 0, ErrUnsupportedPlatform +} diff --git a/vendor/github.com/karalabe/usb/hid_enabled.go b/vendor/github.com/karalabe/usb/hid_enabled.go new file mode 100644 index 000000000000..c2b3720989f9 --- /dev/null +++ b/vendor/github.com/karalabe/usb/hid_enabled.go @@ -0,0 +1,187 @@ +// usb - Self contained USB and HID library for Go +// Copyright 2017 The library Authors +// +// This library is free software: you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// The library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with the library. If not, see . + +// +build freebsd,cgo linux,cgo darwin,!ios,cgo windows,cgo + +package usb + +/* +#include +#include "./hidapi/hidapi/hidapi.h" +*/ +import "C" + +import ( + "errors" + "runtime" + "sync" + "unsafe" +) + +// enumerateHid returns a list of all the HID devices attached to the system which +// match the vendor and product id: +// - If the vendor id is set to 0 then any vendor matches. +// - If the product id is set to 0 then any product matches. +// - If the vendor and product id are both 0, all HID devices are returned. +func enumerateHid(vendorID uint16, productID uint16) ([]DeviceInfo, error) { + // Gather all device infos and ensure they are freed before returning + head := C.hid_enumerate(C.ushort(vendorID), C.ushort(productID)) + if head == nil { + return nil, nil + } + defer C.hid_free_enumeration(head) + + // Iterate the list and retrieve the device details + var infos []DeviceInfo + for ; head != nil; head = head.next { + info := DeviceInfo{ + Path: C.GoString(head.path), + VendorID: uint16(head.vendor_id), + ProductID: uint16(head.product_id), + Release: uint16(head.release_number), + UsagePage: uint16(head.usage_page), + Usage: uint16(head.usage), + Interface: int(head.interface_number), + } + if head.serial_number != nil { + info.Serial, _ = wcharTToString(head.serial_number) + } + if head.product_string != nil { + info.Product, _ = wcharTToString(head.product_string) + } + if head.manufacturer_string != nil { + info.Manufacturer, _ = wcharTToString(head.manufacturer_string) + } + infos = append(infos, info) + } + return infos, nil +} + +// openHid connects to an HID device by its path name. +func openHid(info DeviceInfo) (*hidDevice, error) { + path := C.CString(info.Path) + defer C.free(unsafe.Pointer(path)) + + device := C.hid_open_path(path) + if device == nil { + return nil, errors.New("hidapi: failed to open device") + } + return &hidDevice{ + DeviceInfo: info, + device: device, + }, nil +} + +// hidDevice is a live HID USB connected device handle. +type hidDevice struct { + DeviceInfo // Embed the infos for easier access + + device *C.hid_device // Low level HID device to communicate through + lock sync.Mutex +} + +// Close releases the HID USB device handle. +func (dev *hidDevice) Close() error { + dev.lock.Lock() + defer dev.lock.Unlock() + + if dev.device != nil { + C.hid_close(dev.device) + dev.device = nil + } + return nil +} + +// Write sends an output report to a HID device. +// +// Write will send the data on the first OUT endpoint, if one exists. If it does +// not, it will send the data through the Control Endpoint (Endpoint 0). +func (dev *hidDevice) Write(b []byte) (int, error) { + // Abort if nothing to write + if len(b) == 0 { + return 0, nil + } + // Abort if device closed in between + dev.lock.Lock() + device := dev.device + dev.lock.Unlock() + + if device == nil { + return 0, ErrDeviceClosed + } + // Prepend a HID report ID on Windows, other OSes don't need it + var report []byte + if runtime.GOOS == "windows" { + report = append([]byte{0x00}, b...) + } else { + report = b + } + // Execute the write operation + written := int(C.hid_write(device, (*C.uchar)(&report[0]), C.size_t(len(report)))) + if written == -1 { + // If the write failed, verify if closed or other error + dev.lock.Lock() + device = dev.device + dev.lock.Unlock() + + if device == nil { + return 0, ErrDeviceClosed + } + // Device not closed, some other error occurred + message := C.hid_error(device) + if message == nil { + return 0, errors.New("hidapi: unknown failure") + } + failure, _ := wcharTToString(message) + return 0, errors.New("hidapi: " + failure) + } + return written, nil +} + +// Read retrieves an input report from a HID device. +func (dev *hidDevice) Read(b []byte) (int, error) { + // Aborth if nothing to read + if len(b) == 0 { + return 0, nil + } + // Abort if device closed in between + dev.lock.Lock() + device := dev.device + dev.lock.Unlock() + + if device == nil { + return 0, ErrDeviceClosed + } + // Execute the read operation + read := int(C.hid_read(device, (*C.uchar)(&b[0]), C.size_t(len(b)))) + if read == -1 { + // If the read failed, verify if closed or other error + dev.lock.Lock() + device = dev.device + dev.lock.Unlock() + + if device == nil { + return 0, ErrDeviceClosed + } + // Device not closed, some other error occurred + message := C.hid_error(device) + if message == nil { + return 0, errors.New("hidapi: unknown failure") + } + failure, _ := wcharTToString(message) + return 0, errors.New("hidapi: " + failure) + } + return read, nil +} diff --git a/vendor/github.com/karalabe/hid/hidapi/AUTHORS.txt b/vendor/github.com/karalabe/usb/hidapi/AUTHORS.txt similarity index 100% rename from vendor/github.com/karalabe/hid/hidapi/AUTHORS.txt rename to vendor/github.com/karalabe/usb/hidapi/AUTHORS.txt diff --git a/vendor/github.com/karalabe/hid/hidapi/LICENSE-bsd.txt b/vendor/github.com/karalabe/usb/hidapi/LICENSE-bsd.txt similarity index 100% rename from vendor/github.com/karalabe/hid/hidapi/LICENSE-bsd.txt rename to vendor/github.com/karalabe/usb/hidapi/LICENSE-bsd.txt diff --git a/vendor/github.com/karalabe/hid/hidapi/LICENSE-gpl3.txt b/vendor/github.com/karalabe/usb/hidapi/LICENSE-gpl3.txt similarity index 100% rename from vendor/github.com/karalabe/hid/hidapi/LICENSE-gpl3.txt rename to vendor/github.com/karalabe/usb/hidapi/LICENSE-gpl3.txt diff --git a/vendor/github.com/karalabe/hid/hidapi/LICENSE-orig.txt b/vendor/github.com/karalabe/usb/hidapi/LICENSE-orig.txt similarity index 100% rename from vendor/github.com/karalabe/hid/hidapi/LICENSE-orig.txt rename to vendor/github.com/karalabe/usb/hidapi/LICENSE-orig.txt diff --git a/vendor/github.com/karalabe/hid/hidapi/LICENSE.txt b/vendor/github.com/karalabe/usb/hidapi/LICENSE.txt similarity index 100% rename from vendor/github.com/karalabe/hid/hidapi/LICENSE.txt rename to vendor/github.com/karalabe/usb/hidapi/LICENSE.txt diff --git a/vendor/github.com/karalabe/hid/hidapi/README.txt b/vendor/github.com/karalabe/usb/hidapi/README.txt similarity index 100% rename from vendor/github.com/karalabe/hid/hidapi/README.txt rename to vendor/github.com/karalabe/usb/hidapi/README.txt diff --git a/vendor/github.com/karalabe/hid/hidapi/hidapi/hidapi.h b/vendor/github.com/karalabe/usb/hidapi/hidapi/hidapi.h similarity index 99% rename from vendor/github.com/karalabe/hid/hidapi/hidapi/hidapi.h rename to vendor/github.com/karalabe/usb/hidapi/hidapi/hidapi.h index e5bc2dc40a98..166f3509ab84 100644 --- a/vendor/github.com/karalabe/hid/hidapi/hidapi/hidapi.h +++ b/vendor/github.com/karalabe/usb/hidapi/hidapi/hidapi.h @@ -87,7 +87,7 @@ extern "C" { needed. This function should be called at the beginning of execution however, if there is a chance of HIDAPI handles being opened by different threads simultaneously. - + @ingroup API @returns @@ -388,4 +388,3 @@ extern "C" { #endif #endif - diff --git a/vendor/github.com/karalabe/hid/hidapi/libusb/hid.c b/vendor/github.com/karalabe/usb/hidapi/libusb/hid.c similarity index 100% rename from vendor/github.com/karalabe/hid/hidapi/libusb/hid.c rename to vendor/github.com/karalabe/usb/hidapi/libusb/hid.c diff --git a/vendor/github.com/karalabe/hid/hidapi/mac/hid.c b/vendor/github.com/karalabe/usb/hidapi/mac/hid.c similarity index 100% rename from vendor/github.com/karalabe/hid/hidapi/mac/hid.c rename to vendor/github.com/karalabe/usb/hidapi/mac/hid.c diff --git a/vendor/github.com/karalabe/hid/hidapi/windows/hid.c b/vendor/github.com/karalabe/usb/hidapi/windows/hid.c old mode 100755 new mode 100644 similarity index 99% rename from vendor/github.com/karalabe/hid/hidapi/windows/hid.c rename to vendor/github.com/karalabe/usb/hidapi/windows/hid.c index 86810d7e567c..4e92cc8bc9c1 --- a/vendor/github.com/karalabe/hid/hidapi/windows/hid.c +++ b/vendor/github.com/karalabe/usb/hidapi/windows/hid.c @@ -8,7 +8,7 @@ 8/22/2009 Copyright 2009, All Rights Reserved. - + At the discretion of the user of this library, this software may be licensed under the terms of the GNU General Public License v3, a BSD-Style license, or the @@ -181,7 +181,7 @@ static void register_error(hid_device *device, const char *op) MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPVOID)&msg, 0/*sz*/, NULL); - + /* Get rid of the CR and LF that FormatMessage() sticks at the end of the message. Thanks Microsoft! */ ptr = msg; @@ -292,9 +292,9 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor /* Get information for all the devices belonging to the HID class. */ device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - + /* Iterate over each device in the HID class, looking for the right one. */ - + for (;;) { HANDLE write_handle = INVALID_HANDLE_VALUE; DWORD required_size = 0; @@ -305,7 +305,7 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor &InterfaceClassGuid, device_index, &device_interface_data); - + if (!res) { /* A return of FALSE from this function means that there are no more devices. */ @@ -377,7 +377,7 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor /* Unable to open the device. */ //register_error(dev, "CreateFile"); goto cont_close; - } + } /* Get the Vendor ID and Product ID for this device. */ @@ -421,14 +421,14 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor HidD_FreePreparsedData(pp_data); } - + /* Fill out the record */ cur_dev->next = NULL; str = device_interface_detail_data->DevicePath; if (str) { len = strlen(str); cur_dev->path = (char*) calloc(len+1, sizeof(char)); - strncpy(cur_dev->path, str, len+1); + strncpy(cur_dev->path, str, sizeof(cur_dev->path)); cur_dev->path[len] = '\0'; } else @@ -521,7 +521,7 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsi struct hid_device_info *devs, *cur_dev; const char *path_to_open = NULL; hid_device *handle = NULL; - + devs = hid_enumerate(vendor_id, product_id); cur_dev = devs; while (cur_dev) { @@ -547,7 +547,7 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsi } hid_free_enumeration(devs); - + return handle; } @@ -590,7 +590,7 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) } nt_res = HidP_GetCaps(pp_data, &caps); if (nt_res != HIDP_STATUS_SUCCESS) { - register_error(dev, "HidP_GetCaps"); + register_error(dev, "HidP_GetCaps"); goto err_pp_data; } dev->output_report_length = caps.OutputReportByteLength; @@ -603,7 +603,7 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) err_pp_data: HidD_FreePreparsedData(pp_data); -err: +err: free_hid_device(dev); return NULL; } @@ -636,7 +636,7 @@ int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char * } res = WriteFile(dev->device_handle, buf, length, NULL, &ol); - + if (!res) { if (GetLastError() != ERROR_IO_PENDING) { /* WriteFile() failed. Return error. */ @@ -679,7 +679,7 @@ int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char memset(dev->read_buf, 0, dev->input_report_length); ResetEvent(ev); res = ReadFile(dev->device_handle, dev->read_buf, dev->input_report_length, &bytes_read, &dev->ol); - + if (!res) { if (GetLastError() != ERROR_IO_PENDING) { /* ReadFile() has failed. @@ -705,7 +705,7 @@ int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char we are in non-blocking mode. Get the number of bytes read. The actual data has been copied to the data[] array which was passed to ReadFile(). */ res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/); - + /* Set pending back to false, even if GetOverlappedResult() returned error. */ dev->read_pending = FALSE; @@ -725,13 +725,13 @@ int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char memcpy(data, dev->read_buf, copy_len); } } - + end_of_function: if (!res) { register_error(dev, "GetOverlappedResult"); return -1; } - + return copy_len; } @@ -876,7 +876,7 @@ HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) /*#define PICPGM*/ /*#define S11*/ #define P32 -#ifdef S11 +#ifdef S11 unsigned short VendorID = 0xa0a0; unsigned short ProductID = 0x0001; #endif @@ -906,7 +906,7 @@ int __cdecl main(int argc, char* argv[]) memset(buf,0x00,sizeof(buf)); buf[0] = 0; buf[1] = 0x81; - + /* Open the device. */ int handle = open(VendorID, ProductID, L"12345"); diff --git a/vendor/github.com/karalabe/usb/libs.go b/vendor/github.com/karalabe/usb/libs.go new file mode 100644 index 000000000000..6446acee9e0a --- /dev/null +++ b/vendor/github.com/karalabe/usb/libs.go @@ -0,0 +1,74 @@ +// usb - Self contained USB and HID library for Go +// Copyright 2019 The library Authors +// +// This library is free software: you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// The library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with the library. If not, see . + +// +build freebsd,cgo linux,cgo darwin,!ios,cgo windows,cgo + +package usb + +/* +#cgo CFLAGS: -I./hidapi/hidapi +#cgo CFLAGS: -I./libusb/libusb +#cgo CFLAGS: -DDEFAULT_VISIBILITY="" +#cgo CFLAGS: -DPOLL_NFDS_TYPE=int + +#cgo linux CFLAGS: -DOS_LINUX -D_GNU_SOURCE -DHAVE_SYS_TIME_H +#cgo linux,!android LDFLAGS: -lrt +#cgo darwin CFLAGS: -DOS_DARWIN -DHAVE_SYS_TIME_H +#cgo darwin LDFLAGS: -framework CoreFoundation -framework IOKit -lobjc +#cgo windows CFLAGS: -DOS_WINDOWS +#cgo windows LDFLAGS: -lsetupapi +#cgo freebsd CFLAGS: -DOS_FREEBSD +#cgo freebsd LDFLAGS: -lusb +#cgo openbsd CFLAGS: -DOS_OPENBSD + +#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(DOS_FREEBSD) || defined(OS_OPENBSD) + #include + #include "os/threads_posix.c" + #include "os/poll_posix.c" +#elif defined(OS_WINDOWS) + #include "os/poll_windows.c" + #include "os/threads_windows.c" +#endif + +#ifdef OS_LINUX + #include "os/linux_usbfs.c" + #include "os/linux_netlink.c" + #include "hidapi/libusb/hid.c" +#elif OS_DARWIN + #include "os/darwin_usb.c" + #include "hidapi/mac/hid.c" +#elif OS_WINDOWS + #include "os/windows_nt_common.c" + #include "os/windows_usbdk.c" + #include "os/windows_winusb.c" + #include "hidapi/windows/hid.c" +#elif OS_FREEBSD + #include + #include "hidapi/libusb/hid.c" +#elif DOS_OPENBSD + #include "os/openbsd_usb.c" + #include "hidapi/libusb/hid.c" +#endif + +#ifndef OS_FREEBSD + #include "core.c" + #include "descriptor.c" + #include "hotplug.c" + #include "io.c" + #include "strerror.c" + #include "sync.c" +#endif +*/ +import "C" diff --git a/vendor/github.com/karalabe/usb/libusb/AUTHORS b/vendor/github.com/karalabe/usb/libusb/AUTHORS new file mode 100644 index 000000000000..e90ad9bb2ab8 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/AUTHORS @@ -0,0 +1,119 @@ +Copyright © 2001 Johannes Erdfelt +Copyright © 2007-2009 Daniel Drake +Copyright © 2010-2012 Peter Stuge +Copyright © 2008-2016 Nathan Hjelm +Copyright © 2009-2013 Pete Batard +Copyright © 2009-2013 Ludovic Rousseau +Copyright © 2010-2012 Michael Plante +Copyright © 2011-2013 Hans de Goede +Copyright © 2012-2013 Martin Pieuchot +Copyright © 2012-2013 Toby Gray +Copyright © 2013-2018 Chris Dickens + +Other contributors: +Adrian Bunk +Akshay Jaggi +Alan Ott +Alan Stern +Alex Vatchenko +Andrew Fernandes +Andy Chunyu +Andy McFadden +Angus Gratton +Anil Nair +Anthony Clay +Antonio Ospite +Artem Egorkine +Aurelien Jarno +Bastien Nocera +Bei Zhang +Benjamin Dobell +Brent Rector +Carl Karsten +Christophe Zeitouny +Colin Walters +Dave Camarillo +David Engraf +David Moore +Davidlohr Bueso +Dmitry Fleytman +Doug Johnston +Evan Hunter +Federico Manzan +Felipe Balbi +Florian Albrechtskirchinger +Francesco Montorsi +Francisco Facioni +Gaurav Gupta +Graeme Gill +Gustavo Zacarias +Hans Ulrich Niedermann +Hector Martin +Hoi-Ho Chan +Ilya Konstantinov +Jakub Klama +James Hanko +Jeffrey Nichols +Johann Richard +John Sheu +Jonathon Jongsma +Joost Muller +Josh Gao +Joshua Blake +Justin Bischoff +KIMURA Masaru +Karsten Koenig +Konrad Rzepecki +Kuangye Guo +Lars Kanis +Lars Wirzenius +Lei Chen +Luca Longinotti +Marcus Meissner +Markus Heidelberg +Martin Ettl +Martin Koegler +Matthew Stapleton +Matthias Bolte +Michel Zou +Mike Frysinger +Mikhail Gusarov +Morgan Leborgne +Moritz Fischer +Ларионов Даниил +Nicholas Corgan +Omri Iluz +Orin Eman +Paul Fertser +Pekka Nikander +Rob Walker +Romain Vimont +Roman Kalashnikov +Sameeh Jubran +Sean McBride +Sebastian Pipping +Sergey Serb +Simon Haggett +Simon Newton +Stefan Agner +Stefan Tauner +Steinar H. Gunderson +Thomas Röfer +Tim Hutt +Tim Roberts +Tobias Klauser +Toby Peterson +Tormod Volden +Trygve Laugstøl +Uri Lublin +Vasily Khoruzhick +Vegard Storheil Eriksen +Venkatesh Shukla +Vianney le Clément de Saint-Marcq +Victor Toso +Vitali Lovich +William Skellenger +Xiaofan Chen +Zoltán Kovács +Роман Донченко +parafin diff --git a/vendor/github.com/karalabe/hid/libusb/COPYING b/vendor/github.com/karalabe/usb/libusb/COPYING similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/COPYING rename to vendor/github.com/karalabe/usb/libusb/COPYING diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/config.h b/vendor/github.com/karalabe/usb/libusb/libusb/config.h similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/libusb/config.h rename to vendor/github.com/karalabe/usb/libusb/libusb/config.h diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/core.c b/vendor/github.com/karalabe/usb/libusb/libusb/core.c similarity index 91% rename from vendor/github.com/karalabe/hid/libusb/libusb/core.c rename to vendor/github.com/karalabe/usb/libusb/libusb/core.c index d45bfe177e7b..50f92f6b1b46 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/core.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/core.c @@ -44,32 +44,6 @@ #include "libusbi.h" #include "hotplug.h" -#if defined(OS_LINUX) -const struct usbi_os_backend * const usbi_backend = &linux_usbfs_backend; -#elif defined(OS_DARWIN) -const struct usbi_os_backend * const usbi_backend = &darwin_backend; -#elif defined(OS_OPENBSD) -const struct usbi_os_backend * const usbi_backend = &openbsd_backend; -#elif defined(OS_NETBSD) -const struct usbi_os_backend * const usbi_backend = &netbsd_backend; -#elif defined(OS_WINDOWS) - -#if defined(USE_USBDK) -const struct usbi_os_backend * const usbi_backend = &usbdk_backend; -#else -const struct usbi_os_backend * const usbi_backend = &windows_backend; -#endif - -#elif defined(OS_WINCE) -const struct usbi_os_backend * const usbi_backend = &wince_backend; -#elif defined(OS_HAIKU) -const struct usbi_os_backend * const usbi_backend = &haiku_usb_raw_backend; -#elif defined (OS_SUNOS) -const struct usbi_os_backend * const usbi_backend = &sunos_backend; -#else -#error "Unsupported OS" -#endif - struct libusb_context *usbi_default_context = NULL; static const struct libusb_version libusb_version_internal = { LIBUSB_MAJOR, LIBUSB_MINOR, LIBUSB_MICRO, LIBUSB_NANO, @@ -142,15 +116,17 @@ struct list_head active_contexts_list; * libusb uses stderr for all logging. By default, logging is set to NONE, * which means that no output will be produced. However, unless the library * has been compiled with logging disabled, then any application calls to - * libusb_set_debug(), or the setting of the environmental variable - * LIBUSB_DEBUG outside of the application, can result in logging being - * produced. Your application should therefore not close stderr, but instead - * direct it to the null device if its output is undesirable. - * - * The libusb_set_debug() function can be used to enable logging of certain - * messages. Under standard configuration, libusb doesn't really log much - * so you are advised to use this function to enable all error/warning/ - * informational messages. It will help debug problems with your software. + * libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL, level), or the setting of the + * environmental variable LIBUSB_DEBUG outside of the application, can result + * in logging being produced. Your application should therefore not close + * stderr, but instead direct it to the null device if its output is + * undesirable. + * + * The libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL, level) function can be + * used to enable logging of certain messages. Under standard configuration, + * libusb doesn't really log much so you are advised to use this function + * to enable all error/warning/ informational messages. It will help debug + * problems with your software. * * The logged messages are unstructured. There is no one-to-one correspondence * between messages being logged and success or failure return codes from @@ -165,18 +141,20 @@ struct list_head active_contexts_list; * * The LIBUSB_DEBUG environment variable can be used to enable message logging * at run-time. This environment variable should be set to a log level number, - * which is interpreted the same as the libusb_set_debug() parameter. When this + * which is interpreted the same as the + * libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL, level) parameter. When this * environment variable is set, the message logging verbosity level is fixed - * and libusb_set_debug() effectively does nothing. + * and libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL, level) effectively does + * nothing. * * libusb can be compiled without any logging functions, useful for embedded - * systems. In this case, libusb_set_debug() and the LIBUSB_DEBUG environment - * variable have no effects. + * systems. In this case, libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL, level) + * and the LIBUSB_DEBUG environment variable have no effects. * * libusb can also be compiled with verbose debugging messages always. When * the library is compiled in this way, all messages of all verbosities are - * always logged. libusb_set_debug() and the LIBUSB_DEBUG environment variable - * have no effects. + * always logged. libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL, level) and + * the LIBUSB_DEBUG environment variable have no effects. * * \section remarks Other remarks * @@ -187,6 +165,20 @@ struct list_head active_contexts_list; /** * \page libusb_caveats Caveats * + * \section fork Fork considerations + * + * libusb is not designed to work across fork() calls. Depending on + * the platform, there may be resources in the parent process that are not + * available to the child (e.g. the hotplug monitor thread on Linux). In + * addition, since the parent and child will share libusb's internal file + * descriptors, using libusb in any way from the child could cause the parent + * process's \ref libusb_context to get into an inconsistent state. + * + * On Linux, libusb's file descriptors will be marked as CLOEXEC, which means + * that it is safe to fork() and exec() without worrying about the child + * process needing to clean up state or having access to these file descriptors. + * Other platforms may not be so forgiving, so consider yourself warned! + * * \section devresets Device resets * * The libusb_reset_device() function allows you to reset a device. If your @@ -291,7 +283,6 @@ if (cfg != desired) * information about the end of the short packet, and the user probably wanted * that surplus data to arrive in the next logical transfer. * - * * \section zlp Zero length packets * * - libusb is able to send a packet of zero length to an endpoint simply by @@ -310,7 +301,7 @@ if (cfg != desired) * developed modules may both use libusb. * * libusb is written to allow for these multiple user scenarios. The two - * "instances" of libusb will not interfere: libusb_set_debug() calls + * "instances" of libusb will not interfere: libusb_set_option() calls * from one user will not affect the same settings for other users, other * users can continue using libusb after one of them calls libusb_exit(), etc. * @@ -435,6 +426,7 @@ if (cfg != desired) * - libusb_set_debug() * - libusb_set_interface_alt_setting() * - libusb_set_iso_packet_lengths() + * - libusb_set_option() * - libusb_setlocale() * - libusb_set_pollfd_notifiers() * - libusb_strerror() @@ -478,6 +470,7 @@ if (cfg != desired) * - \ref libusb_iso_sync_type * - \ref libusb_iso_usage_type * - \ref libusb_log_level + * - \ref libusb_option * - \ref libusb_request_recipient * - \ref libusb_request_type * - \ref libusb_speed @@ -680,7 +673,7 @@ struct discovered_devs *discovered_devs_append( struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, unsigned long session_id) { - size_t priv_size = usbi_backend->device_priv_size; + size_t priv_size = usbi_backend.device_priv_size; struct libusb_device *dev = calloc(1, sizeof(*dev) + priv_size); int r; @@ -824,8 +817,8 @@ ssize_t API_EXPORTED libusb_get_device_list(libusb_context *ctx, /* backend provides hotplug support */ struct libusb_device *dev; - if (usbi_backend->hotplug_poll) - usbi_backend->hotplug_poll(); + if (usbi_backend.hotplug_poll) + usbi_backend.hotplug_poll(); usbi_mutex_lock(&ctx->usb_devs_lock); list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) { @@ -839,7 +832,7 @@ ssize_t API_EXPORTED libusb_get_device_list(libusb_context *ctx, usbi_mutex_unlock(&ctx->usb_devs_lock); } else { /* backend does not provide hotplug support */ - r = usbi_backend->get_device_list(ctx, &discdevs); + r = usbi_backend.get_device_list(ctx, &discdevs); } if (r < 0) { @@ -1167,8 +1160,8 @@ void API_EXPORTED libusb_unref_device(libusb_device *dev) libusb_unref_device(dev->parent_dev); - if (usbi_backend->destroy_device) - usbi_backend->destroy_device(dev); + if (usbi_backend.destroy_device) + usbi_backend.destroy_device(dev); if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { /* backend does not support hotplug */ @@ -1242,7 +1235,7 @@ int API_EXPORTED libusb_open(libusb_device *dev, { struct libusb_context *ctx = DEVICE_CTX(dev); struct libusb_device_handle *_dev_handle; - size_t priv_size = usbi_backend->device_handle_priv_size; + size_t priv_size = usbi_backend.device_handle_priv_size; int r; usbi_dbg("open %d.%d", dev->bus_number, dev->device_address); @@ -1265,7 +1258,7 @@ int API_EXPORTED libusb_open(libusb_device *dev, _dev_handle->claimed_interfaces = 0; memset(&_dev_handle->os_priv, 0, priv_size); - r = usbi_backend->open(_dev_handle); + r = usbi_backend.open(_dev_handle); if (r < 0) { usbi_dbg("open %d.%d returns %d", dev->bus_number, dev->device_address, r); libusb_unref_device(dev); @@ -1382,7 +1375,7 @@ static void do_close(struct libusb_context *ctx, list_del(&dev_handle->list); usbi_mutex_unlock(&ctx->open_devs_lock); - usbi_backend->close(dev_handle); + usbi_backend.close(dev_handle); libusb_unref_device(dev_handle->dev); usbi_mutex_destroy(&dev_handle->lock); free(dev_handle); @@ -1491,8 +1484,8 @@ int API_EXPORTED libusb_get_configuration(libusb_device_handle *dev_handle, int r = LIBUSB_ERROR_NOT_SUPPORTED; usbi_dbg(""); - if (usbi_backend->get_configuration) - r = usbi_backend->get_configuration(dev_handle, config); + if (usbi_backend.get_configuration) + r = usbi_backend.get_configuration(dev_handle, config); if (r == LIBUSB_ERROR_NOT_SUPPORTED) { uint8_t tmp = 0; @@ -1567,7 +1560,7 @@ int API_EXPORTED libusb_set_configuration(libusb_device_handle *dev_handle, int configuration) { usbi_dbg("configuration %d", configuration); - return usbi_backend->set_configuration(dev_handle, configuration); + return usbi_backend.set_configuration(dev_handle, configuration); } /** \ingroup libusb_dev @@ -1614,7 +1607,7 @@ int API_EXPORTED libusb_claim_interface(libusb_device_handle *dev_handle, if (dev_handle->claimed_interfaces & (1 << interface_number)) goto out; - r = usbi_backend->claim_interface(dev_handle, interface_number); + r = usbi_backend.claim_interface(dev_handle, interface_number); if (r == 0) dev_handle->claimed_interfaces |= 1 << interface_number; @@ -1657,7 +1650,7 @@ int API_EXPORTED libusb_release_interface(libusb_device_handle *dev_handle, goto out; } - r = usbi_backend->release_interface(dev_handle, interface_number); + r = usbi_backend.release_interface(dev_handle, interface_number); if (r == 0) dev_handle->claimed_interfaces &= ~(1 << interface_number); @@ -1707,7 +1700,7 @@ int API_EXPORTED libusb_set_interface_alt_setting(libusb_device_handle *dev_hand } usbi_mutex_unlock(&dev_handle->lock); - return usbi_backend->set_interface_altsetting(dev_handle, interface_number, + return usbi_backend.set_interface_altsetting(dev_handle, interface_number, alternate_setting); } @@ -1734,7 +1727,7 @@ int API_EXPORTED libusb_clear_halt(libusb_device_handle *dev_handle, if (!dev_handle->dev->attached) return LIBUSB_ERROR_NO_DEVICE; - return usbi_backend->clear_halt(dev_handle, endpoint); + return usbi_backend.clear_halt(dev_handle, endpoint); } /** \ingroup libusb_dev @@ -1762,7 +1755,7 @@ int API_EXPORTED libusb_reset_device(libusb_device_handle *dev_handle) if (!dev_handle->dev->attached) return LIBUSB_ERROR_NO_DEVICE; - return usbi_backend->reset_device(dev_handle); + return usbi_backend.reset_device(dev_handle); } /** \ingroup libusb_asyncio @@ -1794,8 +1787,8 @@ int API_EXPORTED libusb_alloc_streams(libusb_device_handle *dev_handle, if (!dev_handle->dev->attached) return LIBUSB_ERROR_NO_DEVICE; - if (usbi_backend->alloc_streams) - return usbi_backend->alloc_streams(dev_handle, num_streams, endpoints, + if (usbi_backend.alloc_streams) + return usbi_backend.alloc_streams(dev_handle, num_streams, endpoints, num_endpoints); else return LIBUSB_ERROR_NOT_SUPPORTED; @@ -1821,8 +1814,8 @@ int API_EXPORTED libusb_free_streams(libusb_device_handle *dev_handle, if (!dev_handle->dev->attached) return LIBUSB_ERROR_NO_DEVICE; - if (usbi_backend->free_streams) - return usbi_backend->free_streams(dev_handle, endpoints, + if (usbi_backend.free_streams) + return usbi_backend.free_streams(dev_handle, endpoints, num_endpoints); else return LIBUSB_ERROR_NOT_SUPPORTED; @@ -1859,8 +1852,8 @@ unsigned char * LIBUSB_CALL libusb_dev_mem_alloc(libusb_device_handle *dev_handl if (!dev_handle->dev->attached) return NULL; - if (usbi_backend->dev_mem_alloc) - return usbi_backend->dev_mem_alloc(dev_handle, length); + if (usbi_backend.dev_mem_alloc) + return usbi_backend.dev_mem_alloc(dev_handle, length); else return NULL; } @@ -1876,8 +1869,8 @@ unsigned char * LIBUSB_CALL libusb_dev_mem_alloc(libusb_device_handle *dev_handl int API_EXPORTED libusb_dev_mem_free(libusb_device_handle *dev_handle, unsigned char *buffer, size_t length) { - if (usbi_backend->dev_mem_free) - return usbi_backend->dev_mem_free(dev_handle, buffer, length); + if (usbi_backend.dev_mem_free) + return usbi_backend.dev_mem_free(dev_handle, buffer, length); else return LIBUSB_ERROR_NOT_SUPPORTED; } @@ -1907,8 +1900,8 @@ int API_EXPORTED libusb_kernel_driver_active(libusb_device_handle *dev_handle, if (!dev_handle->dev->attached) return LIBUSB_ERROR_NO_DEVICE; - if (usbi_backend->kernel_driver_active) - return usbi_backend->kernel_driver_active(dev_handle, interface_number); + if (usbi_backend.kernel_driver_active) + return usbi_backend.kernel_driver_active(dev_handle, interface_number); else return LIBUSB_ERROR_NOT_SUPPORTED; } @@ -1942,8 +1935,8 @@ int API_EXPORTED libusb_detach_kernel_driver(libusb_device_handle *dev_handle, if (!dev_handle->dev->attached) return LIBUSB_ERROR_NO_DEVICE; - if (usbi_backend->detach_kernel_driver) - return usbi_backend->detach_kernel_driver(dev_handle, interface_number); + if (usbi_backend.detach_kernel_driver) + return usbi_backend.detach_kernel_driver(dev_handle, interface_number); else return LIBUSB_ERROR_NOT_SUPPORTED; } @@ -1976,8 +1969,8 @@ int API_EXPORTED libusb_attach_kernel_driver(libusb_device_handle *dev_handle, if (!dev_handle->dev->attached) return LIBUSB_ERROR_NO_DEVICE; - if (usbi_backend->attach_kernel_driver) - return usbi_backend->attach_kernel_driver(dev_handle, interface_number); + if (usbi_backend.attach_kernel_driver) + return usbi_backend.attach_kernel_driver(dev_handle, interface_number); else return LIBUSB_ERROR_NOT_SUPPORTED; } @@ -2007,7 +2000,7 @@ int API_EXPORTED libusb_attach_kernel_driver(libusb_device_handle *dev_handle, int API_EXPORTED libusb_set_auto_detach_kernel_driver( libusb_device_handle *dev_handle, int enable) { - if (!(usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER)) + if (!(usbi_backend.caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER)) return LIBUSB_ERROR_NOT_SUPPORTED; dev_handle->auto_detach_kernel_driver = enable; @@ -2015,37 +2008,100 @@ int API_EXPORTED libusb_set_auto_detach_kernel_driver( } /** \ingroup libusb_lib - * Set log message verbosity. - * - * The default level is LIBUSB_LOG_LEVEL_NONE, which means no messages are ever - * printed. If you choose to increase the message verbosity level, ensure - * that your application does not close the stdout/stderr file descriptors. + * \deprecated Use libusb_set_option() instead using the + * \ref LIBUSB_OPTION_LOG_LEVEL option. + */ +void API_EXPORTED libusb_set_debug(libusb_context *ctx, int level) +{ +#if defined(ENABLE_LOGGING) && !defined(ENABLE_DEBUG_LOGGING) + USBI_GET_CONTEXT(ctx); + if (!ctx->debug_fixed) { + level = CLAMP(level, LIBUSB_LOG_LEVEL_NONE, LIBUSB_LOG_LEVEL_DEBUG); + ctx->debug = (enum libusb_log_level)level; + } +#else + UNUSED(ctx); + UNUSED(level); +#endif +} + +/** \ingroup libusb_lib + * Set an option in the library. * - * You are advised to use level LIBUSB_LOG_LEVEL_WARNING. libusb is conservative - * with its message logging and most of the time, will only log messages that - * explain error conditions and other oddities. This will help you debug - * your software. + * Use this function to configure a specific option within the library. * - * If the LIBUSB_DEBUG environment variable was set when libusb was - * initialized, this function does nothing: the message verbosity is fixed - * to the value in the environment variable. + * Some options require one or more arguments to be provided. Consult each + * option's documentation for specific requirements. * - * If libusb was compiled without any message logging, this function does - * nothing: you'll never get any messages. + * Since version 1.0.22, \ref LIBUSB_API_VERSION >= 0x01000106 * - * If libusb was compiled with verbose debug message logging, this function - * does nothing: you'll always get messages from all levels. + * \param ctx context on which to operate + * \param option which option to set + * \param ... any required arguments for the specified option * - * \param ctx the context to operate on, or NULL for the default context - * \param level debug level to set + * \returns LIBUSB_SUCCESS on success + * \returns LIBUSB_ERROR_INVALID_PARAM if the option or arguments are invalid + * \returns LIBUSB_ERROR_NOT_SUPPORTED if the option is valid but not supported + * on this platform */ -void API_EXPORTED libusb_set_debug(libusb_context *ctx, int level) +int API_EXPORTED libusb_set_option(libusb_context *ctx, + enum libusb_option option, ...) { + int arg, r = LIBUSB_SUCCESS; + va_list ap; + USBI_GET_CONTEXT(ctx); - if (!ctx->debug_fixed) - ctx->debug = level; + + va_start(ap, option); + switch (option) { + case LIBUSB_OPTION_LOG_LEVEL: + arg = va_arg(ap, int); + if (arg < LIBUSB_LOG_LEVEL_NONE || arg > LIBUSB_LOG_LEVEL_DEBUG) { + r = LIBUSB_ERROR_INVALID_PARAM; + break; + } +#if defined(ENABLE_LOGGING) && !defined(ENABLE_DEBUG_LOGGING) + if (!ctx->debug_fixed) + ctx->debug = (enum libusb_log_level)arg; +#endif + break; + + /* Handle all backend-specific options here */ + case LIBUSB_OPTION_USE_USBDK: + if (usbi_backend.set_option) + r = usbi_backend.set_option(ctx, option, ap); + else + r = LIBUSB_ERROR_NOT_SUPPORTED; + break; + + default: + r = LIBUSB_ERROR_INVALID_PARAM; + } + va_end(ap); + + return r; } +#if defined(ENABLE_LOGGING) && !defined(ENABLE_DEBUG_LOGGING) +/* returns the log level as defined in the LIBUSB_DEBUG environment variable. + * if LIBUSB_DEBUG is not present or not a number, returns LIBUSB_LOG_LEVEL_NONE. + * value is clamped to ensure it is within the valid range of possibilities. + */ +static enum libusb_log_level get_env_debug_level(void) +{ + const char *dbg = getenv("LIBUSB_DEBUG"); + enum libusb_log_level level; + if (dbg) { + int dbg_level = atoi(dbg); + dbg_level = CLAMP(dbg_level, LIBUSB_LOG_LEVEL_NONE, LIBUSB_LOG_LEVEL_DEBUG); + level = (enum libusb_log_level)dbg_level; + } else { + level = LIBUSB_LOG_LEVEL_NONE; + } + return level; +} +#endif + /** \ingroup libusb_lib * Initialize libusb. This function must be called before calling any other * libusb function. @@ -2062,7 +2118,7 @@ void API_EXPORTED libusb_set_debug(libusb_context *ctx, int level) int API_EXPORTED libusb_init(libusb_context **context) { struct libusb_device *dev, *next; - char *dbg = getenv("LIBUSB_DEBUG"); + size_t priv_size = usbi_backend.context_priv_size; struct libusb_context *ctx; static int first_init = 1; int r = 0; @@ -2070,7 +2126,7 @@ int API_EXPORTED libusb_init(libusb_context **context) usbi_mutex_static_lock(&default_context_lock); if (!timestamp_origin.tv_sec) { - usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, ×tamp_origin); + usbi_backend.clock_gettime(USBI_CLOCK_REALTIME, ×tamp_origin); } if (!context && usbi_default_context) { @@ -2080,22 +2136,18 @@ int API_EXPORTED libusb_init(libusb_context **context) return 0; } - ctx = calloc(1, sizeof(*ctx)); + ctx = calloc(1, sizeof(*ctx) + priv_size); if (!ctx) { r = LIBUSB_ERROR_NO_MEM; goto err_unlock; } -#ifdef ENABLE_DEBUG_LOGGING - ctx->debug = LIBUSB_LOG_LEVEL_DEBUG; +#if defined(ENABLE_LOGGING) && !defined(ENABLE_DEBUG_LOGGING) + ctx->debug = get_env_debug_level(); + if (ctx->debug != LIBUSB_LOG_LEVEL_NONE) + ctx->debug_fixed = 1; #endif - if (dbg) { - ctx->debug = atoi(dbg); - if (ctx->debug) - ctx->debug_fixed = 1; - } - /* default context should be initialized before calling usbi_dbg */ if (!usbi_default_context) { usbi_default_context = ctx; @@ -2112,6 +2164,7 @@ int API_EXPORTED libusb_init(libusb_context **context) list_init(&ctx->usb_devs); list_init(&ctx->open_devs); list_init(&ctx->hotplug_cbs); + ctx->next_hotplug_cb_handle = 1; usbi_mutex_static_lock(&active_contexts_lock); if (first_init) { @@ -2121,8 +2174,8 @@ int API_EXPORTED libusb_init(libusb_context **context) list_add (&ctx->list, &active_contexts_list); usbi_mutex_static_unlock(&active_contexts_lock); - if (usbi_backend->init) { - r = usbi_backend->init(ctx); + if (usbi_backend.init) { + r = usbi_backend.init(ctx); if (r) goto err_free_ctx; } @@ -2139,8 +2192,8 @@ int API_EXPORTED libusb_init(libusb_context **context) return 0; err_backend_exit: - if (usbi_backend->exit) - usbi_backend->exit(); + if (usbi_backend.exit) + usbi_backend.exit(ctx); err_free_ctx: if (ctx == usbi_default_context) { usbi_default_context = NULL; @@ -2200,7 +2253,7 @@ void API_EXPORTED libusb_exit(struct libusb_context *ctx) usbi_mutex_static_unlock(&active_contexts_lock); if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { - usbi_hotplug_deregister_all(ctx); + usbi_hotplug_deregister(ctx, 1); /* * Ensure any pending unplug events are read from the hotplug @@ -2230,8 +2283,8 @@ void API_EXPORTED libusb_exit(struct libusb_context *ctx) usbi_warn(ctx, "application left some devices open"); usbi_io_exit(ctx); - if (usbi_backend->exit) - usbi_backend->exit(); + if (usbi_backend.exit) + usbi_backend.exit(ctx); usbi_mutex_destroy(&ctx->open_devs_lock); usbi_mutex_destroy(&ctx->usb_devs_lock); @@ -2253,15 +2306,17 @@ int API_EXPORTED libusb_has_capability(uint32_t capability) case LIBUSB_CAP_HAS_CAPABILITY: return 1; case LIBUSB_CAP_HAS_HOTPLUG: - return !(usbi_backend->get_device_list); + return !(usbi_backend.get_device_list); case LIBUSB_CAP_HAS_HID_ACCESS: - return (usbi_backend->caps & USBI_CAP_HAS_HID_ACCESS); + return (usbi_backend.caps & USBI_CAP_HAS_HID_ACCESS); case LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER: - return (usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER); + return (usbi_backend.caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER); } return 0; } +#ifdef ENABLE_LOGGING + /* this is defined in libusbi.h if needed */ #ifdef LIBUSB_PRINTF_WIN32 /* @@ -2301,10 +2356,9 @@ int usbi_vsnprintf(char *str, size_t size, const char *format, va_list ap) return ret; } -#endif +#endif /* LIBUSB_PRINTF_WIN32 */ -static void usbi_log_str(struct libusb_context *ctx, - enum libusb_log_level level, const char * str) +static void usbi_log_str(enum libusb_log_level level, const char *str) { #if defined(USE_SYSTEM_LOGGING_FACILITY) #if defined(OS_WINDOWS) @@ -2317,18 +2371,20 @@ static void usbi_log_str(struct libusb_context *ctx, #elif defined(__ANDROID__) int priority = ANDROID_LOG_UNKNOWN; switch (level) { - case LIBUSB_LOG_LEVEL_INFO: priority = ANDROID_LOG_INFO; break; - case LIBUSB_LOG_LEVEL_WARNING: priority = ANDROID_LOG_WARN; break; + case LIBUSB_LOG_LEVEL_NONE: return; case LIBUSB_LOG_LEVEL_ERROR: priority = ANDROID_LOG_ERROR; break; + case LIBUSB_LOG_LEVEL_WARNING: priority = ANDROID_LOG_WARN; break; + case LIBUSB_LOG_LEVEL_INFO: priority = ANDROID_LOG_INFO; break; case LIBUSB_LOG_LEVEL_DEBUG: priority = ANDROID_LOG_DEBUG; break; } __android_log_write(priority, "libusb", str); #elif defined(HAVE_SYSLOG_FUNC) int syslog_level = LOG_INFO; switch (level) { - case LIBUSB_LOG_LEVEL_INFO: syslog_level = LOG_INFO; break; - case LIBUSB_LOG_LEVEL_WARNING: syslog_level = LOG_WARNING; break; + case LIBUSB_LOG_LEVEL_NONE: return; case LIBUSB_LOG_LEVEL_ERROR: syslog_level = LOG_ERR; break; + case LIBUSB_LOG_LEVEL_WARNING: syslog_level = LOG_WARNING; break; + case LIBUSB_LOG_LEVEL_INFO: syslog_level = LOG_INFO; break; case LIBUSB_LOG_LEVEL_DEBUG: syslog_level = LOG_DEBUG; break; } syslog(syslog_level, "%s", str); @@ -2339,14 +2395,13 @@ static void usbi_log_str(struct libusb_context *ctx, #else fputs(str, stderr); #endif /* USE_SYSTEM_LOGGING_FACILITY */ - UNUSED(ctx); UNUSED(level); } void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, const char *function, const char *format, va_list args) { - const char *prefix = ""; + const char *prefix; char buf[USBI_MAX_LOG_LEN]; struct timespec now; int global_debug, header_len, text_len; @@ -2356,18 +2411,15 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, global_debug = 1; UNUSED(ctx); #else - int ctx_level = 0; + enum libusb_log_level ctx_level = LIBUSB_LOG_LEVEL_NONE; USBI_GET_CONTEXT(ctx); - if (ctx) { + if (ctx) ctx_level = ctx->debug; - } else { - char *dbg = getenv("LIBUSB_DEBUG"); - if (dbg) - ctx_level = atoi(dbg); - } - global_debug = (ctx_level == LIBUSB_LOG_LEVEL_DEBUG); - if (!ctx_level) + else + ctx_level = get_env_debug_level(); + + if (ctx_level == LIBUSB_LOG_LEVEL_NONE) return; if (level == LIBUSB_LOG_LEVEL_WARNING && ctx_level < LIBUSB_LOG_LEVEL_WARNING) return; @@ -2375,13 +2427,15 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, return; if (level == LIBUSB_LOG_LEVEL_DEBUG && ctx_level < LIBUSB_LOG_LEVEL_DEBUG) return; + + global_debug = (ctx_level == LIBUSB_LOG_LEVEL_DEBUG); #endif - usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &now); + usbi_backend.clock_gettime(USBI_CLOCK_REALTIME, &now); if ((global_debug) && (!has_debug_header_been_displayed)) { has_debug_header_been_displayed = 1; - usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "[timestamp] [threadID] facility level [function call] " USBI_LOG_LINE_END); - usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "--------------------------------------------------------------------------------" USBI_LOG_LINE_END); + usbi_log_str(LIBUSB_LOG_LEVEL_DEBUG, "[timestamp] [threadID] facility level [function call] " USBI_LOG_LINE_END); + usbi_log_str(LIBUSB_LOG_LEVEL_DEBUG, "--------------------------------------------------------------------------------" USBI_LOG_LINE_END); } if (now.tv_nsec < timestamp_origin.tv_nsec) { now.tv_sec--; @@ -2391,20 +2445,20 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, now.tv_nsec -= timestamp_origin.tv_nsec; switch (level) { - case LIBUSB_LOG_LEVEL_INFO: - prefix = "info"; + case LIBUSB_LOG_LEVEL_NONE: + return; + case LIBUSB_LOG_LEVEL_ERROR: + prefix = "error"; break; case LIBUSB_LOG_LEVEL_WARNING: prefix = "warning"; break; - case LIBUSB_LOG_LEVEL_ERROR: - prefix = "error"; + case LIBUSB_LOG_LEVEL_INFO: + prefix = "info"; break; case LIBUSB_LOG_LEVEL_DEBUG: prefix = "debug"; break; - case LIBUSB_LOG_LEVEL_NONE: - return; default: prefix = "unknown"; break; @@ -2439,7 +2493,7 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, } strcpy(buf + header_len + text_len, USBI_LOG_LINE_END); - usbi_log_str(ctx, level, buf); + usbi_log_str(level, buf); } void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, @@ -2452,6 +2506,8 @@ void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, va_end (args); } +#endif /* ENABLE_LOGGING */ + /** \ingroup libusb_misc * Returns a constant NULL-terminated string with the ASCII name of a libusb * error or transfer status code. The caller must not free() the returned diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/descriptor.c b/vendor/github.com/karalabe/usb/libusb/libusb/descriptor.c similarity index 98% rename from vendor/github.com/karalabe/hid/libusb/libusb/descriptor.c rename to vendor/github.com/karalabe/usb/libusb/libusb/descriptor.c index 4c9435fffe4f..74d6de557eab 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/descriptor.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/descriptor.c @@ -333,7 +333,7 @@ static int parse_interface(libusb_context *ctx, goto err; if (r == 0) { ifp->bNumEndpoints = (uint8_t)i; - break;; + break; } buffer += r; @@ -513,7 +513,7 @@ int usbi_device_cache_descriptor(libusb_device *dev) { int r, host_endian = 0; - r = usbi_backend->get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor, + r = usbi_backend.get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor, &host_endian); if (r < 0) return r; @@ -572,7 +572,7 @@ int API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev, int host_endian = 0; int r; - r = usbi_backend->get_active_config_descriptor(dev, tmp, + r = usbi_backend.get_active_config_descriptor(dev, tmp, LIBUSB_DT_CONFIG_SIZE, &host_endian); if (r < 0) return r; @@ -587,7 +587,7 @@ int API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev, if (!buf) return LIBUSB_ERROR_NO_MEM; - r = usbi_backend->get_active_config_descriptor(dev, buf, + r = usbi_backend.get_active_config_descriptor(dev, buf, _config.wTotalLength, &host_endian); if (r >= 0) r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); @@ -625,7 +625,7 @@ int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev, if (config_index >= dev->num_configurations) return LIBUSB_ERROR_NOT_FOUND; - r = usbi_backend->get_config_descriptor(dev, config_index, tmp, + r = usbi_backend.get_config_descriptor(dev, config_index, tmp, LIBUSB_DT_CONFIG_SIZE, &host_endian); if (r < 0) return r; @@ -640,7 +640,7 @@ int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev, if (!buf) return LIBUSB_ERROR_NO_MEM; - r = usbi_backend->get_config_descriptor(dev, config_index, buf, + r = usbi_backend.get_config_descriptor(dev, config_index, buf, _config.wTotalLength, &host_endian); if (r >= 0) r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); @@ -663,7 +663,7 @@ int usbi_get_config_index_by_value(struct libusb_device *dev, for (i = 0; i < dev->num_configurations; i++) { unsigned char tmp[6]; int host_endian; - int r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp), + int r = usbi_backend.get_config_descriptor(dev, i, tmp, sizeof(tmp), &host_endian); if (r < 0) { *idx = -1; @@ -702,8 +702,8 @@ int API_EXPORTED libusb_get_config_descriptor_by_value(libusb_device *dev, int r, idx, host_endian; unsigned char *buf = NULL; - if (usbi_backend->get_config_descriptor_by_value) { - r = usbi_backend->get_config_descriptor_by_value(dev, + if (usbi_backend.get_config_descriptor_by_value) { + r = usbi_backend.get_config_descriptor_by_value(dev, bConfigurationValue, &buf, &host_endian); if (r < 0) return r; @@ -1176,7 +1176,8 @@ int API_EXPORTED libusb_get_string_descriptor_ascii(libusb_device_handle *dev_ha if (tbuf[0] > r) return LIBUSB_ERROR_IO; - for (di = 0, si = 2; si < tbuf[0]; si += 2) { + di = 0; + for (si = 2; si < tbuf[0]; si += 2) { if (di >= (length - 1)) break; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.c b/vendor/github.com/karalabe/usb/libusb/libusb/hotplug.c similarity index 76% rename from vendor/github.com/karalabe/hid/libusb/libusb/hotplug.c rename to vendor/github.com/karalabe/usb/libusb/libusb/hotplug.c index bbfd6e79a1a9..a4320bc42e59 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/hotplug.c @@ -154,36 +154,30 @@ int main (void) { \endcode */ -static int usbi_hotplug_match_cb (struct libusb_context *ctx, +static int usbi_hotplug_match_cb(struct libusb_context *ctx, struct libusb_device *dev, libusb_hotplug_event event, struct libusb_hotplug_callback *hotplug_cb) { - /* Handle lazy deregistration of callback */ - if (hotplug_cb->needs_free) { - /* Free callback */ - return 1; - } - - if (!(hotplug_cb->events & event)) { + if (!(hotplug_cb->flags & event)) { return 0; } - if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->vendor_id && + if ((hotplug_cb->flags & USBI_HOTPLUG_VENDOR_ID_VALID) && hotplug_cb->vendor_id != dev->device_descriptor.idVendor) { return 0; } - if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->product_id && + if ((hotplug_cb->flags & USBI_HOTPLUG_PRODUCT_ID_VALID) && hotplug_cb->product_id != dev->device_descriptor.idProduct) { return 0; } - if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->dev_class && + if ((hotplug_cb->flags & USBI_HOTPLUG_DEV_CLASS_VALID) && hotplug_cb->dev_class != dev->device_descriptor.bDeviceClass) { return 0; } - return hotplug_cb->cb (ctx, dev, event, hotplug_cb->user_data); + return hotplug_cb->cb(ctx, dev, event, hotplug_cb->user_data); } void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, @@ -195,8 +189,13 @@ void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, usbi_mutex_lock(&ctx->hotplug_cbs_lock); list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) { + if (hotplug_cb->flags & USBI_HOTPLUG_NEEDS_FREE) { + /* process deregistration in usbi_hotplug_deregister() */ + continue; + } + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); - ret = usbi_hotplug_match_cb (ctx, dev, event, hotplug_cb); + ret = usbi_hotplug_match_cb(ctx, dev, event, hotplug_cb); usbi_mutex_lock(&ctx->hotplug_cbs_lock); if (ret) { @@ -206,15 +205,13 @@ void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, } usbi_mutex_unlock(&ctx->hotplug_cbs_lock); - - /* the backend is expected to call the callback for each active transfer */ } void usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev, libusb_hotplug_event event) { int pending_events; - libusb_hotplug_message *message = calloc(1, sizeof(*message)); + struct libusb_hotplug_message *message = calloc(1, sizeof(*message)); if (!message) { usbi_err(ctx, "error allocating hotplug message"); @@ -240,59 +237,70 @@ int API_EXPORTED libusb_hotplug_register_callback(libusb_context *ctx, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *callback_handle) { - libusb_hotplug_callback *new_callback; - static int handle_id = 1; - - /* check for hotplug support */ - if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { - return LIBUSB_ERROR_NOT_SUPPORTED; - } + struct libusb_hotplug_callback *new_callback; /* check for sane values */ - if ((LIBUSB_HOTPLUG_MATCH_ANY != vendor_id && (~0xffff & vendor_id)) || + if ((!events || (~(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) & events)) || + (flags && (~LIBUSB_HOTPLUG_ENUMERATE & flags)) || + (LIBUSB_HOTPLUG_MATCH_ANY != vendor_id && (~0xffff & vendor_id)) || (LIBUSB_HOTPLUG_MATCH_ANY != product_id && (~0xffff & product_id)) || (LIBUSB_HOTPLUG_MATCH_ANY != dev_class && (~0xff & dev_class)) || !cb_fn) { return LIBUSB_ERROR_INVALID_PARAM; } + /* check for hotplug support */ + if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + return LIBUSB_ERROR_NOT_SUPPORTED; + } + USBI_GET_CONTEXT(ctx); - new_callback = (libusb_hotplug_callback *)calloc(1, sizeof (*new_callback)); + new_callback = calloc(1, sizeof(*new_callback)); if (!new_callback) { return LIBUSB_ERROR_NO_MEM; } - new_callback->ctx = ctx; - new_callback->vendor_id = vendor_id; - new_callback->product_id = product_id; - new_callback->dev_class = dev_class; - new_callback->flags = flags; - new_callback->events = events; + new_callback->flags = (uint8_t)events; + if (LIBUSB_HOTPLUG_MATCH_ANY != vendor_id) { + new_callback->flags |= USBI_HOTPLUG_VENDOR_ID_VALID; + new_callback->vendor_id = (uint16_t)vendor_id; + } + if (LIBUSB_HOTPLUG_MATCH_ANY != product_id) { + new_callback->flags |= USBI_HOTPLUG_PRODUCT_ID_VALID; + new_callback->product_id = (uint16_t)product_id; + } + if (LIBUSB_HOTPLUG_MATCH_ANY != dev_class) { + new_callback->flags |= USBI_HOTPLUG_DEV_CLASS_VALID; + new_callback->dev_class = (uint8_t)dev_class; + } new_callback->cb = cb_fn; new_callback->user_data = user_data; - new_callback->needs_free = 0; usbi_mutex_lock(&ctx->hotplug_cbs_lock); - /* protect the handle by the context hotplug lock. it doesn't matter if the same handle - * is used for different contexts only that the handle is unique for this context */ - new_callback->handle = handle_id++; + /* protect the handle by the context hotplug lock */ + new_callback->handle = ctx->next_hotplug_cb_handle++; + + /* handle the unlikely case of overflow */ + if (ctx->next_hotplug_cb_handle < 0) + ctx->next_hotplug_cb_handle = 1; list_add(&new_callback->list, &ctx->hotplug_cbs); usbi_mutex_unlock(&ctx->hotplug_cbs_lock); + usbi_dbg("new hotplug cb %p with handle %d", new_callback, new_callback->handle); - if (flags & LIBUSB_HOTPLUG_ENUMERATE) { - int i, len; + if ((flags & LIBUSB_HOTPLUG_ENUMERATE) && (events & LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED)) { + ssize_t i, len; struct libusb_device **devs; - len = (int) libusb_get_device_list(ctx, &devs); + len = libusb_get_device_list(ctx, &devs); if (len < 0) { libusb_hotplug_deregister_callback(ctx, new_callback->handle); - return len; + return (int)len; } for (i = 0; i < len; i++) { @@ -311,10 +319,11 @@ int API_EXPORTED libusb_hotplug_register_callback(libusb_context *ctx, return LIBUSB_SUCCESS; } -void API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx, +void API_EXPORTED libusb_hotplug_deregister_callback(struct libusb_context *ctx, libusb_hotplug_callback_handle callback_handle) { struct libusb_hotplug_callback *hotplug_cb; + int deregistered = 0; /* check for hotplug support */ if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { @@ -323,28 +332,42 @@ void API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx USBI_GET_CONTEXT(ctx); + usbi_dbg("deregister hotplug cb %d", callback_handle); + usbi_mutex_lock(&ctx->hotplug_cbs_lock); - list_for_each_entry(hotplug_cb, &ctx->hotplug_cbs, list, - struct libusb_hotplug_callback) { + list_for_each_entry(hotplug_cb, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) { if (callback_handle == hotplug_cb->handle) { /* Mark this callback for deregistration */ - hotplug_cb->needs_free = 1; + hotplug_cb->flags |= USBI_HOTPLUG_NEEDS_FREE; + deregistered = 1; } } usbi_mutex_unlock(&ctx->hotplug_cbs_lock); - usbi_hotplug_notification(ctx, NULL, 0); + if (deregistered) { + int pending_events; + + usbi_mutex_lock(&ctx->event_data_lock); + pending_events = usbi_pending_events(ctx); + ctx->event_flags |= USBI_EVENT_HOTPLUG_CB_DEREGISTERED; + if (!pending_events) + usbi_signal_event(ctx); + usbi_mutex_unlock(&ctx->event_data_lock); + } } -void usbi_hotplug_deregister_all(struct libusb_context *ctx) { +void usbi_hotplug_deregister(struct libusb_context *ctx, int forced) +{ struct libusb_hotplug_callback *hotplug_cb, *next; usbi_mutex_lock(&ctx->hotplug_cbs_lock); - list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, - struct libusb_hotplug_callback) { - list_del(&hotplug_cb->list); - free(hotplug_cb); + list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) { + if (forced || (hotplug_cb->flags & USBI_HOTPLUG_NEEDS_FREE)) { + usbi_dbg("freeing hotplug cb %p with handle %d", hotplug_cb, + hotplug_cb->handle); + list_del(&hotplug_cb->list); + free(hotplug_cb); + } } - usbi_mutex_unlock(&ctx->hotplug_cbs_lock); } diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/hotplug.h b/vendor/github.com/karalabe/usb/libusb/libusb/hotplug.h new file mode 100644 index 000000000000..dbadbcb93d54 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/hotplug.h @@ -0,0 +1,99 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * Hotplug support for libusb + * Copyright © 2012-2013 Nathan Hjelm + * Copyright © 2012-2013 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef USBI_HOTPLUG_H +#define USBI_HOTPLUG_H + +#include "libusbi.h" + +enum usbi_hotplug_flags { + /* This callback is interested in device arrivals */ + USBI_HOTPLUG_DEVICE_ARRIVED = LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, + + /* This callback is interested in device removals */ + USBI_HOTPLUG_DEVICE_LEFT = LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, + + /* IMPORTANT: The values for the below entries must start *after* + * the highest value of the above entries!!! + */ + + /* The vendor_id field is valid for matching */ + USBI_HOTPLUG_VENDOR_ID_VALID = (1 << 3), + + /* The product_id field is valid for matching */ + USBI_HOTPLUG_PRODUCT_ID_VALID = (1 << 4), + + /* The dev_class field is valid for matching */ + USBI_HOTPLUG_DEV_CLASS_VALID = (1 << 5), + + /* This callback has been unregistered and needs to be freed */ + USBI_HOTPLUG_NEEDS_FREE = (1 << 6), +}; + +/** \ingroup hotplug + * The hotplug callback structure. The user populates this structure with + * libusb_hotplug_prepare_callback() and then calls libusb_hotplug_register_callback() + * to receive notification of hotplug events. + */ +struct libusb_hotplug_callback { + /** Flags that control how this callback behaves */ + uint8_t flags; + + /** Vendor ID to match (if flags says this is valid) */ + uint16_t vendor_id; + + /** Product ID to match (if flags says this is valid) */ + uint16_t product_id; + + /** Device class to match (if flags says this is valid) */ + uint8_t dev_class; + + /** Callback function to invoke for matching event/device */ + libusb_hotplug_callback_fn cb; + + /** Handle for this callback (used to match on deregister) */ + libusb_hotplug_callback_handle handle; + + /** User data that will be passed to the callback function */ + void *user_data; + + /** List this callback is registered in (ctx->hotplug_cbs) */ + struct list_head list; +}; + +struct libusb_hotplug_message { + /** The hotplug event that occurred */ + libusb_hotplug_event event; + + /** The device for which this hotplug event occurred */ + struct libusb_device *device; + + /** List this message is contained in (ctx->hotplug_msgs) */ + struct list_head list; +}; + +void usbi_hotplug_deregister(struct libusb_context *ctx, int forced); +void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event); +void usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event); + +#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/io.c b/vendor/github.com/karalabe/usb/libusb/libusb/io.c similarity index 98% rename from vendor/github.com/karalabe/hid/libusb/libusb/io.c rename to vendor/github.com/karalabe/usb/libusb/libusb/io.c index eb1eabf1cb74..a03bfaae1a9e 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/io.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/io.c @@ -1144,8 +1144,8 @@ int usbi_io_init(struct libusb_context *ctx) goto err_close_pipe; #ifdef USBI_TIMERFD_AVAILABLE - ctx->timerfd = timerfd_create(usbi_backend->get_timerfd_clockid(), - TFD_NONBLOCK); + ctx->timerfd = timerfd_create(usbi_backend.get_timerfd_clockid(), + TFD_NONBLOCK | TFD_CLOEXEC); if (ctx->timerfd >= 0) { usbi_dbg("using timerfd for timeouts"); r = usbi_add_pollfd(ctx, ctx->timerfd, POLLIN); @@ -1205,10 +1205,12 @@ static int calculate_timeout(struct usbi_transfer *transfer) unsigned int timeout = USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout; - if (!timeout) + if (!timeout) { + timerclear(&transfer->timeout); return 0; + } - r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, ¤t_time); + r = usbi_backend.clock_gettime(USBI_CLOCK_MONOTONIC, ¤t_time); if (r < 0) { usbi_err(ITRANSFER_CTX(transfer), "failed to read monotonic clock, errno=%d", errno); @@ -1255,7 +1257,7 @@ struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer( int iso_packets) { struct libusb_transfer *transfer; - size_t os_alloc_size = usbi_backend->transfer_priv_size; + size_t os_alloc_size = usbi_backend.transfer_priv_size; size_t alloc_size = sizeof(struct usbi_transfer) + sizeof(struct libusb_transfer) + (sizeof(struct libusb_iso_packet_descriptor) * iso_packets) @@ -1526,7 +1528,7 @@ int API_EXPORTED libusb_submit_transfer(struct libusb_transfer *transfer) */ usbi_mutex_unlock(&ctx->flying_transfers_lock); - r = usbi_backend->submit_transfer(itransfer); + r = usbi_backend.submit_transfer(itransfer); if (r == LIBUSB_SUCCESS) { itransfer->state_flags |= USBI_TRANSFER_IN_FLIGHT; /* keep a reference to this device */ @@ -1567,7 +1569,7 @@ int API_EXPORTED libusb_cancel_transfer(struct libusb_transfer *transfer) r = LIBUSB_ERROR_NOT_FOUND; goto out; } - r = usbi_backend->cancel_transfer(itransfer); + r = usbi_backend.cancel_transfer(itransfer); if (r < 0) { if (r != LIBUSB_ERROR_NOT_FOUND && r != LIBUSB_ERROR_NO_DEVICE) @@ -2004,7 +2006,7 @@ static int handle_timeouts_locked(struct libusb_context *ctx) return 0; /* get current time */ - r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &systime_ts); + r = usbi_backend.clock_gettime(USBI_CLOCK_MONOTONIC, &systime_ts); if (r < 0) return r; @@ -2077,7 +2079,6 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) struct pollfd *fds = NULL; int i = -1; int timeout_ms; - int special_event; /* prevent attempts to recursively handle events (e.g. calling into * libusb_handle_events() from within a hotplug or transfer callback) */ @@ -2146,32 +2147,30 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) if (tv->tv_usec % 1000) timeout_ms++; -redo_poll: usbi_dbg("poll() %d fds with timeout in %dms", nfds, timeout_ms); r = usbi_poll(fds, nfds, timeout_ms); usbi_dbg("poll() returned %d", r); if (r == 0) { r = handle_timeouts(ctx); goto done; - } - else if (r == -1 && errno == EINTR) { + } else if (r == -1 && errno == EINTR) { r = LIBUSB_ERROR_INTERRUPTED; goto done; - } - else if (r < 0) { + } else if (r < 0) { usbi_err(ctx, "poll failed %d err=%d", r, errno); r = LIBUSB_ERROR_IO; goto done; } - special_event = 0; - /* fds[0] is always the event pipe */ if (fds[0].revents) { - libusb_hotplug_message *message = NULL; + struct list_head hotplug_msgs; struct usbi_transfer *itransfer; + int hotplug_cb_deregistered = 0; int ret = 0; + list_init(&hotplug_msgs); + usbi_dbg("caught a fish on the event pipe"); /* take the the event data lock while processing events */ @@ -2186,6 +2185,12 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) ctx->event_flags &= ~USBI_EVENT_USER_INTERRUPT; } + if (ctx->event_flags & USBI_EVENT_HOTPLUG_CB_DEREGISTERED) { + usbi_dbg("someone unregistered a hotplug cb"); + ctx->event_flags &= ~USBI_EVENT_HOTPLUG_CB_DEREGISTERED; + hotplug_cb_deregistered = 1; + } + /* check if someone is closing a device */ if (ctx->device_close) usbi_dbg("someone is closing a device"); @@ -2193,9 +2198,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) /* check for any pending hotplug messages */ if (!list_empty(&ctx->hotplug_msgs)) { usbi_dbg("hotplug message received"); - special_event = 1; - message = list_first_entry(&ctx->hotplug_msgs, libusb_hotplug_message, list); - list_del(&message->list); + list_cut(&hotplug_msgs, &ctx->hotplug_msgs); } /* complete any pending transfers */ @@ -2203,7 +2206,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) itransfer = list_first_entry(&ctx->completed_transfers, struct usbi_transfer, completed_list); list_del(&itransfer->completed_list); usbi_mutex_unlock(&ctx->event_data_lock); - ret = usbi_backend->handle_transfer_completion(itransfer); + ret = usbi_backend.handle_transfer_completion(itransfer); if (ret) usbi_err(ctx, "backend handle_transfer_completion failed with error %d", ret); usbi_mutex_lock(&ctx->event_data_lock); @@ -2215,14 +2218,21 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) usbi_mutex_unlock(&ctx->event_data_lock); - /* process the hotplug message, if any */ - if (message) { + if (hotplug_cb_deregistered) + usbi_hotplug_deregister(ctx, 0); + + /* process the hotplug messages, if any */ + while (!list_empty(&hotplug_msgs)) { + struct libusb_hotplug_message *message = + list_first_entry(&hotplug_msgs, struct libusb_hotplug_message, list); + usbi_hotplug_match(ctx, message->device, message->event); /* the device left, dereference the device */ if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == message->event) libusb_unref_device(message->device); + list_del(&message->list); free(message); } @@ -2233,7 +2243,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) } if (0 == --r) - goto handled; + goto done; } #ifdef USBI_TIMERFD_AVAILABLE @@ -2242,7 +2252,6 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) /* timerfd indicates that a timeout has expired */ int ret; usbi_dbg("timerfd triggered"); - special_event = 1; ret = handle_timerfd_trigger(ctx); if (ret < 0) { @@ -2252,20 +2261,14 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) } if (0 == --r) - goto handled; + goto done; } #endif - r = usbi_backend->handle_events(ctx, fds + internal_nfds, nfds - internal_nfds, r); + r = usbi_backend.handle_events(ctx, fds + internal_nfds, nfds - internal_nfds, r); if (r) usbi_err(ctx, "backend handle_events failed with error %d", r); -handled: - if (r == 0 && special_event) { - timeout_ms = 0; - goto redo_poll; - } - done: usbi_end_event_handling(ctx); return r; @@ -2583,7 +2586,7 @@ int API_EXPORTED libusb_get_next_timeout(libusb_context *ctx, return 0; } - r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &cur_ts); + r = usbi_backend.clock_gettime(USBI_CLOCK_MONOTONIC, &cur_ts); if (r < 0) { usbi_err(ctx, "failed to read monotonic clock, errno=%d", errno); return 0; @@ -2811,7 +2814,7 @@ void usbi_handle_disconnect(struct libusb_device_handle *dev_handle) USBI_TRANSFER_TO_LIBUSB_TRANSFER(to_cancel)); usbi_mutex_lock(&to_cancel->lock); - usbi_backend->clear_transfer_priv(to_cancel); + usbi_backend.clear_transfer_priv(to_cancel); usbi_mutex_unlock(&to_cancel->lock); usbi_handle_transfer_completion(to_cancel, LIBUSB_TRANSFER_NO_DEVICE); } diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/libusb.h b/vendor/github.com/karalabe/usb/libusb/libusb/libusb.h similarity index 96% rename from vendor/github.com/karalabe/hid/libusb/libusb/libusb.h rename to vendor/github.com/karalabe/usb/libusb/libusb/libusb.h index c562690f9afe..430136b2e285 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/libusb.h +++ b/vendor/github.com/karalabe/usb/libusb/libusb/libusb.h @@ -54,13 +54,19 @@ typedef unsigned __int32 uint32_t; #include #endif -#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) || defined(__HAIKU__) +#if defined(__linux__) || defined(__APPLE__) || defined(__CYGWIN__) || defined(__HAIKU__) #include #endif #include #include +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#define ZERO_SIZED_ARRAY /* [] - valid C99 code */ +#else +#define ZERO_SIZED_ARRAY 0 /* [0] - non-standard, but usually working code */ +#endif + /* 'interface' might be defined as a macro on Windows, so we need to * undefine it so as not to break the current libusb API, because * libusb_config_descriptor has an 'interface' member @@ -79,6 +85,8 @@ typedef unsigned __int32 uint32_t; #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) #define LIBUSB_DEPRECATED_FOR(f) \ __attribute__((deprecated("Use " #f " instead"))) +#elif __GNUC__ >= 3 +#define LIBUSB_DEPRECATED_FOR(f) __attribute__((deprecated)) #else #define LIBUSB_DEPRECATED_FOR(f) #endif /* __GNUC__ */ @@ -141,7 +149,7 @@ typedef unsigned __int32 uint32_t; * Internally, LIBUSB_API_VERSION is defined as follows: * (libusb major << 24) | (libusb minor << 16) | (16 bit incremental) */ -#define LIBUSB_API_VERSION 0x01000105 +#define LIBUSB_API_VERSION 0x01000106 /* The following is kept for compatibility, but will be deprecated in the future */ #define LIBUSBX_API_VERSION LIBUSB_API_VERSION @@ -729,13 +737,7 @@ struct libusb_bos_dev_capability_descriptor { /** Device Capability type */ uint8_t bDevCapabilityType; /** Device Capability data (bLength - 3 bytes) */ - uint8_t dev_capability_data -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; + uint8_t dev_capability_data[ZERO_SIZED_ARRAY]; }; /** \ingroup libusb_desc @@ -760,13 +762,7 @@ struct libusb_bos_descriptor { uint8_t bNumDeviceCaps; /** bNumDeviceCap Device Capability Descriptors */ - struct libusb_bos_dev_capability_descriptor *dev_capability -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; + struct libusb_bos_dev_capability_descriptor *dev_capability[ZERO_SIZED_ARRAY]; }; /** \ingroup libusb_desc @@ -927,7 +923,7 @@ struct libusb_version { * sessions allows for your program to use two libraries (or dynamically * load two modules) which both independently use libusb. This will prevent * interference between the individual libusb users - for example - * libusb_set_debug() will not affect the other user of the library, and + * libusb_set_option() will not affect the other user of the library, and * libusb_exit() will not destroy resources that the other user is still * using. * @@ -987,6 +983,9 @@ enum libusb_speed { /** The device is operating at super speed (5000MBit/s). */ LIBUSB_SPEED_SUPER = 4, + + /** The device is operating at super speed plus (10000MBit/s). */ + LIBUSB_SPEED_SUPER_PLUS = 5, }; /** \ingroup libusb_dev @@ -1256,13 +1255,7 @@ struct libusb_transfer { int num_iso_packets; /** Isochronous packet descriptors, for isochronous transfers only. */ - struct libusb_iso_packet_descriptor iso_packet_desc -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; + struct libusb_iso_packet_descriptor iso_packet_desc[ZERO_SIZED_ARRAY]; }; /** \ingroup libusb_misc @@ -1290,21 +1283,20 @@ enum libusb_capability { * - LIBUSB_LOG_LEVEL_NONE (0) : no messages ever printed by the library (default) * - LIBUSB_LOG_LEVEL_ERROR (1) : error messages are printed to stderr * - LIBUSB_LOG_LEVEL_WARNING (2) : warning and error messages are printed to stderr - * - LIBUSB_LOG_LEVEL_INFO (3) : informational messages are printed to stdout, warning - * and error messages are printed to stderr - * - LIBUSB_LOG_LEVEL_DEBUG (4) : debug and informational messages are printed to stdout, - * warnings and errors to stderr + * - LIBUSB_LOG_LEVEL_INFO (3) : informational messages are printed to stderr + * - LIBUSB_LOG_LEVEL_DEBUG (4) : debug and informational messages are printed to stderr */ enum libusb_log_level { LIBUSB_LOG_LEVEL_NONE = 0, - LIBUSB_LOG_LEVEL_ERROR, - LIBUSB_LOG_LEVEL_WARNING, - LIBUSB_LOG_LEVEL_INFO, - LIBUSB_LOG_LEVEL_DEBUG, + LIBUSB_LOG_LEVEL_ERROR = 1, + LIBUSB_LOG_LEVEL_WARNING = 2, + LIBUSB_LOG_LEVEL_INFO = 3, + LIBUSB_LOG_LEVEL_DEBUG = 4, }; int LIBUSB_CALL libusb_init(libusb_context **ctx); void LIBUSB_CALL libusb_exit(libusb_context *ctx); +LIBUSB_DEPRECATED_FOR(libusb_set_option) void LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level); const struct libusb_version * LIBUSB_CALL libusb_get_version(void); int LIBUSB_CALL libusb_has_capability(uint32_t capability); @@ -2001,6 +1993,45 @@ int LIBUSB_CALL libusb_hotplug_register_callback(libusb_context *ctx, void LIBUSB_CALL libusb_hotplug_deregister_callback(libusb_context *ctx, libusb_hotplug_callback_handle callback_handle); +/** \ingroup libusb_lib + * Available option values for libusb_set_option(). + */ +enum libusb_option { + /** Set the log message verbosity. + * + * The default level is LIBUSB_LOG_LEVEL_NONE, which means no messages are ever + * printed. If you choose to increase the message verbosity level, ensure + * that your application does not close the stderr file descriptor. + * + * You are advised to use level LIBUSB_LOG_LEVEL_WARNING. libusb is conservative + * with its message logging and most of the time, will only log messages that + * explain error conditions and other oddities. This will help you debug + * your software. + * + * If the LIBUSB_DEBUG environment variable was set when libusb was + * initialized, this function does nothing: the message verbosity is fixed + * to the value in the environment variable. + * + * If libusb was compiled without any message logging, this function does + * nothing: you'll never get any messages. + * + * If libusb was compiled with verbose debug message logging, this function + * does nothing: you'll always get messages from all levels. + */ + LIBUSB_OPTION_LOG_LEVEL, + + /** Use the UsbDk backend for a specific context, if available. + * + * This option should be set immediately after calling libusb_init(), otherwise + * unspecified behavior may occur. + * + * Only valid on Windows. + */ + LIBUSB_OPTION_USE_USBDK, +}; + +int LIBUSB_CALL libusb_set_option(libusb_context *ctx, enum libusb_option option, ...); + #ifdef __cplusplus } #endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/libusbi.h b/vendor/github.com/karalabe/usb/libusb/libusb/libusbi.h similarity index 94% rename from vendor/github.com/karalabe/hid/libusb/libusb/libusbi.h rename to vendor/github.com/karalabe/usb/libusb/libusb/libusbi.h index 752e3988787b..31d6ce98d49c 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/libusbi.h +++ b/vendor/github.com/karalabe/usb/libusb/libusb/libusbi.h @@ -39,6 +39,20 @@ #include "libusb.h" #include "version.h" +/* Attribute to ensure that a structure member is aligned to a natural + * pointer alignment. Used for os_priv member. */ +#if defined(_MSC_VER) +#if defined(_WIN64) +#define PTR_ALIGNED __declspec(align(8)) +#else +#define PTR_ALIGNED __declspec(align(4)) +#endif +#elif defined(__GNUC__) +#define PTR_ALIGNED __attribute__((aligned(sizeof(void *)))) +#else +#define PTR_ALIGNED +#endif + /* Inside the libusb code, mark all public functions as follows: * return_type API_EXPORTED function_name(params) { ... } * But if the function returns a pointer, mark it as follows: @@ -139,6 +153,19 @@ static inline void list_del(struct list_head *entry) entry->next = entry->prev = NULL; } +static inline void list_cut(struct list_head *list, struct list_head *head) +{ + if (list_empty(head)) + return; + + list->next = head->next; + list->next->prev = list; + list->prev = head->prev; + list->prev->next = list; + + list_init(head); +} + static inline void *usbi_reallocf(void *ptr, size_t size) { void *ret = realloc(ptr, size); @@ -151,6 +178,9 @@ static inline void *usbi_reallocf(void *ptr, size_t size) const typeof( ((type *)0)->member ) *mptr = (ptr); \ (type *)( (char *)mptr - offsetof(type,member) );}) +#ifndef CLAMP +#define CLAMP(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val))) +#endif #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif @@ -175,29 +205,33 @@ static inline void *usbi_reallocf(void *ptr, size_t size) } while (0) #endif +#ifdef ENABLE_LOGGING + +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#define snprintf usbi_snprintf +#define vsnprintf usbi_vsnprintf +int usbi_snprintf(char *dst, size_t size, const char *format, ...); +int usbi_vsnprintf(char *dst, size_t size, const char *format, va_list ap); +#define LIBUSB_PRINTF_WIN32 +#endif /* defined(_MSC_VER) && (_MSC_VER < 1900) */ + void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, const char *function, const char *format, ...); void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, const char *function, const char *format, va_list args); -#if !defined(_MSC_VER) || _MSC_VER >= 1400 +#if !defined(_MSC_VER) || (_MSC_VER >= 1400) -#ifdef ENABLE_LOGGING #define _usbi_log(ctx, level, ...) usbi_log(ctx, level, __FUNCTION__, __VA_ARGS__) -#define usbi_dbg(...) _usbi_log(NULL, LIBUSB_LOG_LEVEL_DEBUG, __VA_ARGS__) -#else -#define _usbi_log(ctx, level, ...) do { (void)(ctx); } while(0) -#define usbi_dbg(...) do {} while(0) -#endif -#define usbi_info(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_INFO, __VA_ARGS__) -#define usbi_warn(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_WARNING, __VA_ARGS__) #define usbi_err(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_ERROR, __VA_ARGS__) +#define usbi_warn(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_WARNING, __VA_ARGS__) +#define usbi_info(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_INFO, __VA_ARGS__) +#define usbi_dbg(...) _usbi_log(NULL, LIBUSB_LOG_LEVEL_DEBUG, __VA_ARGS__) -#else /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ +#else /* !defined(_MSC_VER) || (_MSC_VER >= 1400) */ -#ifdef ENABLE_LOGGING #define LOG_BODY(ctxt, level) \ { \ va_list args; \ @@ -205,24 +239,26 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, usbi_log_v(ctxt, level, "", format, args); \ va_end(args); \ } -#else -#define LOG_BODY(ctxt, level) \ -{ \ - (void)(ctxt); \ -} -#endif -static inline void usbi_info(struct libusb_context *ctx, const char *format, ...) - LOG_BODY(ctx, LIBUSB_LOG_LEVEL_INFO) -static inline void usbi_warn(struct libusb_context *ctx, const char *format, ...) - LOG_BODY(ctx, LIBUSB_LOG_LEVEL_WARNING) static inline void usbi_err(struct libusb_context *ctx, const char *format, ...) LOG_BODY(ctx, LIBUSB_LOG_LEVEL_ERROR) - +static inline void usbi_warn(struct libusb_context *ctx, const char *format, ...) + LOG_BODY(ctx, LIBUSB_LOG_LEVEL_WARNING) +static inline void usbi_info(struct libusb_context *ctx, const char *format, ...) + LOG_BODY(ctx, LIBUSB_LOG_LEVEL_INFO) static inline void usbi_dbg(const char *format, ...) LOG_BODY(NULL, LIBUSB_LOG_LEVEL_DEBUG) -#endif /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ +#endif /* !defined(_MSC_VER) || (_MSC_VER >= 1400) */ + +#else /* ENABLE_LOGGING */ + +#define usbi_err(ctx, ...) do { (void)ctx; } while (0) +#define usbi_warn(ctx, ...) do { (void)ctx; } while (0) +#define usbi_info(ctx, ...) do { (void)ctx; } while (0) +#define usbi_dbg(...) do {} while (0) + +#endif /* ENABLE_LOGGING */ #define USBI_GET_CONTEXT(ctx) \ do { \ @@ -254,8 +290,10 @@ extern struct libusb_context *usbi_default_context; struct pollfd; struct libusb_context { - int debug; +#if defined(ENABLE_LOGGING) && !defined(ENABLE_DEBUG_LOGGING) + enum libusb_log_level debug; int debug_fixed; +#endif /* internal event pipe, used for signalling occurrence of an internal event. */ int event_pipe[2]; @@ -270,6 +308,7 @@ struct libusb_context { /* A list of registered hotplug callbacks */ struct list_head hotplug_cbs; + libusb_hotplug_callback_handle next_hotplug_cb_handle; usbi_mutex_t hotplug_cbs_lock; /* this is a list of in-flight transfer handles, sorted by timeout @@ -331,6 +370,8 @@ struct libusb_context { #endif struct list_head list; + + PTR_ALIGNED unsigned char os_priv[ZERO_SIZED_ARRAY]; }; enum usbi_event_flags { @@ -339,6 +380,9 @@ enum usbi_event_flags { /* The user has interrupted the event handler */ USBI_EVENT_USER_INTERRUPT = 1 << 1, + + /* A hotplug callback deregistration is pending */ + USBI_EVENT_HOTPLUG_CB_DEREGISTERED = 1 << 2, }; /* Macros for managing event handling state */ @@ -383,17 +427,7 @@ struct libusb_device { struct libusb_device_descriptor device_descriptor; int attached; - unsigned char os_priv -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif -#if defined(OS_SUNOS) - __attribute__ ((aligned (8))); -#else - ; -#endif + PTR_ALIGNED unsigned char os_priv[ZERO_SIZED_ARRAY]; }; struct libusb_device_handle { @@ -404,17 +438,8 @@ struct libusb_device_handle { struct list_head list; struct libusb_device *dev; int auto_detach_kernel_driver; - unsigned char os_priv -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif -#if defined(OS_SUNOS) - __attribute__ ((aligned (8))); -#else - ; -#endif + + PTR_ALIGNED unsigned char os_priv[ZERO_SIZED_ARRAY]; }; enum { @@ -540,14 +565,6 @@ int usbi_clear_event(struct libusb_context *ctx); #include "os/poll_windows.h" #endif -#if defined(_MSC_VER) && (_MSC_VER < 1900) -#define snprintf usbi_snprintf -#define vsnprintf usbi_vsnprintf -int usbi_snprintf(char *dst, size_t size, const char *format, ...); -int usbi_vsnprintf(char *dst, size_t size, const char *format, va_list ap); -#define LIBUSB_PRINTF_WIN32 -#endif - struct usbi_pollfd { /* must come first */ struct libusb_pollfd pollfd; @@ -568,13 +585,7 @@ void usbi_remove_pollfd(struct libusb_context *ctx, int fd); struct discovered_devs { size_t len; size_t capacity; - struct libusb_device *devices -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; + struct libusb_device *devices[ZERO_SIZED_ARRAY]; }; struct discovered_devs *discovered_devs_append( @@ -607,7 +618,17 @@ struct usbi_os_backend { * * This function is called when the user deinitializes the library. */ - void (*exit)(void); + void (*exit)(struct libusb_context *ctx); + + /* Set a backend-specific option. Optional. + * + * This function is called when the user calls libusb_set_option() and + * the option is not handled by the core library. + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*set_option)(struct libusb_context *ctx, enum libusb_option option, + va_list args); /* Enumerate all the USB devices on the system, returning them in a list * of discovered devices. @@ -1110,6 +1131,11 @@ struct usbi_os_backend { clockid_t (*get_timerfd_clockid)(void); #endif + /* Number of bytes to reserve for per-context private backend data. + * This private data area is accessible through the "os_priv" field of + * struct libusb_context. */ + size_t context_priv_size; + /* Number of bytes to reserve for per-device private backend data. * This private data area is accessible through the "os_priv" field of * struct libusb_device. */ @@ -1127,17 +1153,7 @@ struct usbi_os_backend { size_t transfer_priv_size; }; -extern const struct usbi_os_backend * const usbi_backend; - -extern const struct usbi_os_backend linux_usbfs_backend; -extern const struct usbi_os_backend darwin_backend; -extern const struct usbi_os_backend openbsd_backend; -extern const struct usbi_os_backend netbsd_backend; -extern const struct usbi_os_backend windows_backend; -extern const struct usbi_os_backend usbdk_backend; -extern const struct usbi_os_backend wince_backend; -extern const struct usbi_os_backend haiku_usb_raw_backend; -extern const struct usbi_os_backend sunos_backend; +extern const struct usbi_os_backend usbi_backend; extern struct list_head active_contexts_list; extern usbi_mutex_static_t active_contexts_lock; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/darwin_usb.c similarity index 96% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.c rename to vendor/github.com/karalabe/usb/libusb/libusb/os/darwin_usb.c index b0219d1b0573..35ea1c321e72 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/darwin_usb.c @@ -1,7 +1,7 @@ /* -*- Mode: C; indent-tabs-mode:nil -*- */ /* * darwin backend for libusb 1.0 - * Copyright © 2008-2016 Nathan Hjelm + * Copyright © 2008-2017 Nathan Hjelm * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -36,6 +36,10 @@ #include #include +/* Suppress warnings about the use of the deprecated objc_registerThreadWithCollector + * function. Its use is also conditionalized to only older deployment targets. */ +#define OBJC_SILENCE_GC_DEPRECATIONS 1 + #include #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && MAC_OS_X_VERSION_MIN_REQUIRED < 101200 #include @@ -55,6 +59,14 @@ _Atomic int32_t initCount = ATOMIC_VAR_INIT(0); #define libusb_darwin_atomic_fetch_add(x, y) (OSAtomicAdd32Barrier(y, x) - y) static volatile int32_t initCount = 0; + +#endif + +/* On 10.12 and later, use newly available clock_*() functions */ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101200 +#define OSX_USE_CLOCK_GETTIME 1 +#else +#define OSX_USE_CLOCK_GETTIME 0 #endif #include "darwin_usb.h" @@ -65,15 +77,17 @@ static pthread_cond_t libusb_darwin_at_cond = PTHREAD_COND_INITIALIZER; static pthread_once_t darwin_init_once = PTHREAD_ONCE_INIT; +#if !OSX_USE_CLOCK_GETTIME static clock_serv_t clock_realtime; static clock_serv_t clock_monotonic; +#endif static CFRunLoopRef libusb_darwin_acfl = NULL; /* event cf loop */ static CFRunLoopSourceRef libusb_darwin_acfls = NULL; /* shutdown signal for event cf loop */ static usbi_mutex_t darwin_cached_devices_lock = PTHREAD_MUTEX_INITIALIZER; static struct list_head darwin_cached_devices = {&darwin_cached_devices, &darwin_cached_devices}; -static char *darwin_device_class = kIOUSBDeviceClassName; +static const char *darwin_device_class = kIOUSBDeviceClassName; #define DARWIN_CACHED_DEVICE(a) ((struct darwin_cached_device *) (((struct darwin_device_priv *)((a)->os_priv))->dev)) @@ -219,20 +233,21 @@ static int usb_setup_device_iterator (io_iterator_t *deviceIterator, UInt32 loca &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - if (propertyMatchDict) { - /* there are no unsigned CFNumber types so treat the value as signed. the os seems to do this - internally (CFNumberType of locationID is 3) */ - CFTypeRef locationCF = CFNumberCreate (NULL, kCFNumberSInt32Type, &location); + /* there are no unsigned CFNumber types so treat the value as signed. the OS seems to do this + internally (CFNumberType of locationID is kCFNumberSInt32Type) */ + CFTypeRef locationCF = CFNumberCreate (NULL, kCFNumberSInt32Type, &location); + if (propertyMatchDict && locationCF) { CFDictionarySetValue (propertyMatchDict, CFSTR(kUSBDevicePropertyLocationID), locationCF); - /* release our reference to the CFNumber (CFDictionarySetValue retains it) */ - CFRelease (locationCF); - CFDictionarySetValue (matchingDict, CFSTR(kIOPropertyMatchKey), propertyMatchDict); - /* release out reference to the CFMutableDictionaryRef (CFDictionarySetValue retains it) */ - CFRelease (propertyMatchDict); } /* else we can still proceed as long as the caller accounts for the possibility of other devices in the iterator */ + + /* release our references as per the Create Rule */ + if (propertyMatchDict) + CFRelease (propertyMatchDict); + if (locationCF) + CFRelease (locationCF); } return IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, deviceIterator); @@ -300,6 +315,7 @@ static usb_device_t **darwin_device_from_service (io_service_t service) } static void darwin_devices_attached (void *ptr, io_iterator_t add_devices) { + UNUSED(ptr); struct libusb_context *ctx; io_service_t service; @@ -308,7 +324,7 @@ static void darwin_devices_attached (void *ptr, io_iterator_t add_devices) { while ((service = IOIteratorNext(add_devices))) { /* add this device to each active context's device list */ list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { - process_new_device (ctx, service);; + process_new_device (ctx, service); } IOObjectRelease(service); @@ -318,6 +334,7 @@ static void darwin_devices_attached (void *ptr, io_iterator_t add_devices) { } static void darwin_devices_detached (void *ptr, io_iterator_t rem_devices) { + UNUSED(ptr); struct libusb_device *dev = NULL; struct libusb_context *ctx; struct darwin_cached_device *old_device; @@ -516,7 +533,6 @@ static void darwin_check_version (void) { } static int darwin_init(struct libusb_context *ctx) { - host_name_port_t host_self; int rc; rc = pthread_once (&darwin_init_once, darwin_check_version); @@ -530,12 +546,15 @@ static int darwin_init(struct libusb_context *ctx) { } if (libusb_darwin_atomic_fetch_add (&initCount, 1) == 0) { - /* create the clocks that will be used */ +#if !OSX_USE_CLOCK_GETTIME + /* create the clocks that will be used if clock_gettime() is not available */ + host_name_port_t host_self; host_self = mach_host_self(); host_get_clock_service(host_self, CALENDAR_CLOCK, &clock_realtime); host_get_clock_service(host_self, SYSTEM_CLOCK, &clock_monotonic); mach_port_deallocate(mach_task_self(), host_self); +#endif pthread_create (&libusb_darwin_at, NULL, darwin_event_thread_main, ctx); @@ -548,10 +567,13 @@ static int darwin_init(struct libusb_context *ctx) { return rc; } -static void darwin_exit (void) { +static void darwin_exit (struct libusb_context *ctx) { + UNUSED(ctx); if (libusb_darwin_atomic_fetch_add (&initCount, -1) == 1) { +#if !OSX_USE_CLOCK_GETTIME mach_port_deallocate(mach_task_self(), clock_realtime); mach_port_deallocate(mach_task_self(), clock_monotonic); +#endif /* stop the event runloop and wait for the thread to terminate. */ CFRunLoopSourceSignal(libusb_darwin_acfls); @@ -866,14 +888,29 @@ static int get_device_port (io_service_t service, UInt8 *port) { return ret; } +static int get_device_parent_sessionID(io_service_t service, UInt64 *parent_sessionID) { + kern_return_t result; + io_service_t parent; + + /* Walk up the tree in the IOService plane until we find a parent that has a sessionID */ + parent = service; + while((result = IORegistryEntryGetParentEntry (parent, kIOServicePlane, &parent)) == kIOReturnSuccess) { + if (get_ioregistry_value_number (parent, CFSTR("sessionID"), kCFNumberSInt64Type, parent_sessionID)) { + /* Success */ + return 1; + } + } + + /* We ran out of parents */ + return 0; +} + static int darwin_get_cached_device(struct libusb_context *ctx, io_service_t service, struct darwin_cached_device **cached_out) { struct darwin_cached_device *new_device; UInt64 sessionID = 0, parent_sessionID = 0; int ret = LIBUSB_SUCCESS; usb_device_t **device; - io_service_t parent; - kern_return_t result; UInt8 port = 0; /* get some info from the io registry */ @@ -884,11 +921,8 @@ static int darwin_get_cached_device(struct libusb_context *ctx, io_service_t ser usbi_dbg("finding cached device for sessionID 0x%" PRIx64, sessionID); - result = IORegistryEntryGetParentEntry (service, kIOUSBPlane, &parent); - - if (kIOReturnSuccess == result) { - (void) get_ioregistry_value_number (parent, CFSTR("sessionID"), kCFNumberSInt64Type, &parent_sessionID); - IOObjectRelease(parent); + if (get_device_parent_sessionID(service, &parent_sessionID)) { + usbi_dbg("parent sessionID: 0x%" PRIx64, parent_sessionID); } usbi_mutex_lock(&darwin_cached_devices_lock); @@ -1005,8 +1039,11 @@ static int process_new_device (struct libusb_context *ctx, io_service_t service) case kUSBDeviceSpeedLow: dev->speed = LIBUSB_SPEED_LOW; break; case kUSBDeviceSpeedFull: dev->speed = LIBUSB_SPEED_FULL; break; case kUSBDeviceSpeedHigh: dev->speed = LIBUSB_SPEED_HIGH; break; -#if DeviceVersion >= 500 +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 case kUSBDeviceSpeedSuper: dev->speed = LIBUSB_SPEED_SUPER; break; +#endif +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101200 + case kUSBDeviceSpeedSuperPlus: dev->speed = LIBUSB_SPEED_SUPER_PLUS; break; #endif default: usbi_warn (ctx, "Got unknown device speed %d", devSpeed); @@ -1216,9 +1253,9 @@ static int get_endpoints (struct libusb_device_handle *dev_handle, int iface) { kern_return_t kresult; - u_int8_t numep, direction, number; - u_int8_t dont_care1, dont_care3; - u_int16_t dont_care2; + UInt8 numep, direction, number; + UInt8 dont_care1, dont_care3; + UInt16 dont_care2; int rc; usbi_dbg ("building table of endpoints."); @@ -1965,6 +2002,7 @@ static int darwin_handle_transfer_completion (struct usbi_transfer *itransfer) { } static int darwin_clock_gettime(int clk_id, struct timespec *tp) { +#if !OSX_USE_CLOCK_GETTIME mach_timespec_t sys_time; clock_serv_t clock_ref; @@ -1987,6 +2025,16 @@ static int darwin_clock_gettime(int clk_id, struct timespec *tp) { tp->tv_nsec = sys_time.tv_nsec; return 0; +#else + switch (clk_id) { + case USBI_CLOCK_MONOTONIC: + return clock_gettime(CLOCK_MONOTONIC, tp); + case USBI_CLOCK_REALTIME: + return clock_gettime(CLOCK_REALTIME, tp); + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +#endif } #if InterfaceVersion >= 550 @@ -2047,7 +2095,7 @@ static int darwin_free_streams (struct libusb_device_handle *dev_handle, unsigne } #endif -const struct usbi_os_backend darwin_backend = { +const struct usbi_os_backend usbi_backend = { .name = "Darwin", .caps = 0, .init = darwin_init, diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/darwin_usb.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/darwin_usb.h new file mode 100644 index 000000000000..474567f6ac77 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/darwin_usb.h @@ -0,0 +1,199 @@ +/* + * darwin backend for libusb 1.0 + * Copyright © 2008-2015 Nathan Hjelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if !defined(LIBUSB_DARWIN_H) +#define LIBUSB_DARWIN_H + +#include "libusbi.h" + +#include +#include +#include +#include + +/* IOUSBInterfaceInferface */ + +/* New in OS 10.12.0. */ +#if defined (kIOUSBInterfaceInterfaceID800) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 101200) + +#define usb_interface_t IOUSBInterfaceInterface800 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID800 +#define InterfaceVersion 800 + +/* New in OS 10.10.0. */ +#elif defined (kIOUSBInterfaceInterfaceID700) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 101000) + +#define usb_interface_t IOUSBInterfaceInterface700 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID700 +#define InterfaceVersion 700 + +/* New in OS 10.9.0. */ +#elif defined (kIOUSBInterfaceInterfaceID650) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1090) + +#define usb_interface_t IOUSBInterfaceInterface650 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID650 +#define InterfaceVersion 650 + +/* New in OS 10.8.2 but can't test deployment target to that granularity, so round up. */ +#elif defined (kIOUSBInterfaceInterfaceID550) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1090) + +#define usb_interface_t IOUSBInterfaceInterface550 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID550 +#define InterfaceVersion 550 + +/* New in OS 10.7.3 but can't test deployment target to that granularity, so round up. */ +#elif defined (kIOUSBInterfaceInterfaceID500) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1080) + +#define usb_interface_t IOUSBInterfaceInterface500 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID500 +#define InterfaceVersion 500 + +/* New in OS 10.5.0. */ +#elif defined (kIOUSBInterfaceInterfaceID300) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) + +#define usb_interface_t IOUSBInterfaceInterface300 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300 +#define InterfaceVersion 300 + +/* New in OS 10.4.5 (or 10.4.6?) but can't test deployment target to that granularity, so round up. */ +#elif defined (kIOUSBInterfaceInterfaceID245) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) + +#define usb_interface_t IOUSBInterfaceInterface245 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245 +#define InterfaceVersion 245 + +/* New in OS 10.4.0. */ +#elif defined (kIOUSBInterfaceInterfaceID220) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1040) + +#define usb_interface_t IOUSBInterfaceInterface220 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220 +#define InterfaceVersion 220 + +#else + +#error "IOUSBFamily is too old. Please upgrade your SDK and/or deployment target" + +#endif + +/* IOUSBDeviceInterface */ + +/* New in OS 10.9.0. */ +#if defined (kIOUSBDeviceInterfaceID650) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1090) + +#define usb_device_t IOUSBDeviceInterface650 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID650 +#define DeviceVersion 650 + +/* New in OS 10.7.3 but can't test deployment target to that granularity, so round up. */ +#elif defined (kIOUSBDeviceInterfaceID500) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1080) + +#define usb_device_t IOUSBDeviceInterface500 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID500 +#define DeviceVersion 500 + +/* New in OS 10.5.4 but can't test deployment target to that granularity, so round up. */ +#elif defined (kIOUSBDeviceInterfaceID320) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1060) + +#define usb_device_t IOUSBDeviceInterface320 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID320 +#define DeviceVersion 320 + +/* New in OS 10.5.0. */ +#elif defined (kIOUSBDeviceInterfaceID300) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) + +#define usb_device_t IOUSBDeviceInterface300 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID300 +#define DeviceVersion 300 + +/* New in OS 10.4.5 (or 10.4.6?) but can't test deployment target to that granularity, so round up. */ +#elif defined (kIOUSBDeviceInterfaceID245) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) + +#define usb_device_t IOUSBDeviceInterface245 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID245 +#define DeviceVersion 245 + +/* New in OS 10.2.3 but can't test deployment target to that granularity, so round up. */ +#elif defined (kIOUSBDeviceInterfaceID197) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1030) + +#define usb_device_t IOUSBDeviceInterface197 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID197 +#define DeviceVersion 197 + +#else + +#error "IOUSBFamily is too old. Please upgrade your SDK and/or deployment target" + +#endif + +#if !defined(IO_OBJECT_NULL) +#define IO_OBJECT_NULL ((io_object_t) 0) +#endif + +typedef IOCFPlugInInterface *io_cf_plugin_ref_t; +typedef IONotificationPortRef io_notification_port_t; + +/* private structures */ +struct darwin_cached_device { + struct list_head list; + IOUSBDeviceDescriptor dev_descriptor; + UInt32 location; + UInt64 parent_session; + UInt64 session; + UInt16 address; + char sys_path[21]; + usb_device_t **device; + int open_count; + UInt8 first_config, active_config, port; + int can_enumerate; + int refcount; +}; + +struct darwin_device_priv { + struct darwin_cached_device *dev; +}; + +struct darwin_device_handle_priv { + int is_open; + CFRunLoopSourceRef cfSource; + + struct darwin_interface { + usb_interface_t **interface; + uint8_t num_endpoints; + CFRunLoopSourceRef cfSource; + uint64_t frames[256]; + uint8_t endpoint_addrs[USB_MAXENDPOINTS]; + } interfaces[USB_MAXINTERFACES]; +}; + +struct darwin_transfer_priv { + /* Isoc */ + IOUSBIsocFrame *isoc_framelist; + int num_iso_packets; + + /* Control */ + IOUSBDevRequestTO req; + + /* Bulk */ + + /* Completion status */ + IOReturn result; + UInt32 size; +}; + +#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_pollfs.cpp b/vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_pollfs.cpp similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_pollfs.cpp rename to vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_pollfs.cpp diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_usb.h similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb.h rename to vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_usb.h diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_backend.cpp b/vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_usb_backend.cpp similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_backend.cpp rename to vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_usb_backend.cpp diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.cpp b/vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_usb_raw.cpp similarity index 98% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.cpp rename to vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_usb_raw.cpp index 77adbd1e60e9..c701e34421c1 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.cpp +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_usb_raw.cpp @@ -38,8 +38,9 @@ haiku_init(struct libusb_context *ctx) } static void -haiku_exit(void) +haiku_exit(struct libusb_context *ctx) { + UNUSED(ctx); if (atomic_add(&gInitCount, -1) == 1) gUsbRoster.Stop(); } @@ -195,11 +196,12 @@ haiku_clock_gettime(int clkid, struct timespec *tp) return LIBUSB_ERROR_INVALID_PARAM; } -const struct usbi_os_backend haiku_usb_raw_backend = { +const struct usbi_os_backend usbi_backend = { /*.name =*/ "Haiku usbfs", /*.caps =*/ 0, /*.init =*/ haiku_init, /*.exit =*/ haiku_exit, + /*.set_option =*/ NULL, /*.get_device_list =*/ NULL, /*.hotplug_poll =*/ NULL, /*.open =*/ haiku_open, @@ -244,6 +246,7 @@ const struct usbi_os_backend haiku_usb_raw_backend = { /*.get_timerfd_clockid =*/ NULL, #endif + /*.context_priv_size=*/ 0, /*.device_priv_size =*/ sizeof(USBDevice *), /*.device_handle_priv_size =*/ sizeof(USBDeviceHandle *), /*.transfer_priv_size =*/ sizeof(USBTransfer *), diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_usb_raw.h similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.h rename to vendor/github.com/karalabe/usb/libusb/libusb/os/haiku_usb_raw.h diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_netlink.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/linux_netlink.c similarity index 89% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/linux_netlink.c rename to vendor/github.com/karalabe/usb/libusb/libusb/os/linux_netlink.c index 60cf3ad1bd0e..c1ad1ec51faf 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_netlink.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/linux_netlink.c @@ -45,24 +45,33 @@ #define NL_GROUP_KERNEL 1 +#ifndef SOCK_CLOEXEC +#define SOCK_CLOEXEC 0 +#endif + +#ifndef SOCK_NONBLOCK +#define SOCK_NONBLOCK 0 +#endif + static int linux_netlink_socket = -1; static int netlink_control_pipe[2] = { -1, -1 }; static pthread_t libusb_linux_event_thread; static void *linux_netlink_event_thread_main(void *arg); -static int set_fd_cloexec_nb(int fd) +static int set_fd_cloexec_nb(int fd, int socktype) { int flags; #if defined(FD_CLOEXEC) - flags = fcntl(fd, F_GETFD); - if (flags == -1) { - usbi_err(NULL, "failed to get netlink fd flags (%d)", errno); - return -1; - } + /* Make sure the netlink socket file descriptor is marked as CLOEXEC */ + if (!(socktype & SOCK_CLOEXEC)) { + flags = fcntl(fd, F_GETFD); + if (flags == -1) { + usbi_err(NULL, "failed to get netlink fd flags (%d)", errno); + return -1; + } - if (!(flags & FD_CLOEXEC)) { if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) { usbi_err(NULL, "failed to set netlink fd flags (%d)", errno); return -1; @@ -70,13 +79,14 @@ static int set_fd_cloexec_nb(int fd) } #endif - flags = fcntl(fd, F_GETFL); - if (flags == -1) { - usbi_err(NULL, "failed to get netlink fd status flags (%d)", errno); - return -1; - } + /* Make sure the netlink socket is non-blocking */ + if (!(socktype & SOCK_NONBLOCK)) { + flags = fcntl(fd, F_GETFL); + if (flags == -1) { + usbi_err(NULL, "failed to get netlink fd status flags (%d)", errno); + return -1; + } - if (!(flags & O_NONBLOCK)) { if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) { usbi_err(NULL, "failed to set netlink fd status flags (%d)", errno); return -1; @@ -89,21 +99,15 @@ static int set_fd_cloexec_nb(int fd) int linux_netlink_start_event_monitor(void) { struct sockaddr_nl sa_nl = { .nl_family = AF_NETLINK, .nl_groups = NL_GROUP_KERNEL }; - int socktype = SOCK_RAW; + int socktype = SOCK_RAW | SOCK_NONBLOCK | SOCK_CLOEXEC; int opt = 1; int ret; -#if defined(SOCK_CLOEXEC) - socktype |= SOCK_CLOEXEC; -#endif -#if defined(SOCK_NONBLOCK) - socktype |= SOCK_NONBLOCK; -#endif - linux_netlink_socket = socket(PF_NETLINK, socktype, NETLINK_KOBJECT_UEVENT); if (linux_netlink_socket == -1 && errno == EINVAL) { usbi_dbg("failed to create netlink socket of type %d, attempting SOCK_RAW", socktype); - linux_netlink_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT); + socktype = SOCK_RAW; + linux_netlink_socket = socket(PF_NETLINK, socktype, NETLINK_KOBJECT_UEVENT); } if (linux_netlink_socket == -1) { @@ -111,7 +115,7 @@ int linux_netlink_start_event_monitor(void) goto err; } - ret = set_fd_cloexec_nb(linux_netlink_socket); + ret = set_fd_cloexec_nb(linux_netlink_socket, socktype); if (ret == -1) goto err_close_socket; @@ -162,7 +166,7 @@ int linux_netlink_stop_event_monitor(void) /* Write some dummy data to the control pipe and * wait for the thread to exit */ - r = usbi_write(netlink_control_pipe[1], &dummy, sizeof(dummy)); + r = write(netlink_control_pipe[1], &dummy, sizeof(dummy)); if (r <= 0) usbi_warn(NULL, "netlink control pipe signal failed"); @@ -356,7 +360,8 @@ static int linux_netlink_read_message(void) static void *linux_netlink_event_thread_main(void *arg) { char dummy; - ssize_t r; + int r; + ssize_t nb; struct pollfd fds[] = { { .fd = netlink_control_pipe[0], .events = POLLIN }, @@ -368,11 +373,15 @@ static void *linux_netlink_event_thread_main(void *arg) usbi_dbg("netlink event thread entering"); - while (poll(fds, 2, -1) >= 0) { + while ((r = poll(fds, 2, -1)) >= 0 || errno == EINTR) { + if (r < 0) { + /* temporary failure */ + continue; + } if (fds[0].revents & POLLIN) { /* activity on control pipe, read the byte and exit */ - r = usbi_read(netlink_control_pipe[0], &dummy, sizeof(dummy)); - if (r <= 0) + nb = read(netlink_control_pipe[0], &dummy, sizeof(dummy)); + if (nb <= 0) usbi_warn(NULL, "netlink control pipe read failed"); break; } diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_udev.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/linux_udev.c similarity index 90% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/linux_udev.c rename to vendor/github.com/karalabe/usb/libusb/libusb/os/linux_udev.c index 61d953d8c2df..c97806ba6b16 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_udev.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/linux_udev.c @@ -82,17 +82,33 @@ int linux_udev_start_event_monitor(void) udev_monitor_fd = udev_monitor_get_fd(udev_monitor); +#if defined(FD_CLOEXEC) + /* Make sure the udev file descriptor is marked as CLOEXEC */ + r = fcntl(udev_monitor_fd, F_GETFD); + if (r == -1) { + usbi_err(NULL, "geting udev monitor fd flags (%d)", errno); + goto err_free_monitor; + } + if (!(r & FD_CLOEXEC)) { + if (fcntl(udev_monitor_fd, F_SETFD, r | FD_CLOEXEC) == -1) { + usbi_err(NULL, "setting udev monitor fd flags (%d)", errno); + goto err_free_monitor; + } + } +#endif + /* Some older versions of udev are not non-blocking by default, * so make sure this is set */ r = fcntl(udev_monitor_fd, F_GETFL); if (r == -1) { - usbi_err(NULL, "getting udev monitor fd flags (%d)", errno); + usbi_err(NULL, "getting udev monitor fd status flags (%d)", errno); goto err_free_monitor; } - r = fcntl(udev_monitor_fd, F_SETFL, r | O_NONBLOCK); - if (r) { - usbi_err(NULL, "setting udev monitor fd flags (%d)", errno); - goto err_free_monitor; + if (!(r & O_NONBLOCK)) { + if (fcntl(udev_monitor_fd, F_SETFL, r | O_NONBLOCK) == -1) { + usbi_err(NULL, "setting udev monitor fd status flags (%d)", errno); + goto err_free_monitor; + } } r = usbi_pipe(udev_control_pipe); @@ -134,7 +150,7 @@ int linux_udev_stop_event_monitor(void) /* Write some dummy data to the control pipe and * wait for the thread to exit */ - r = usbi_write(udev_control_pipe[1], &dummy, sizeof(dummy)); + r = write(udev_control_pipe[1], &dummy, sizeof(dummy)); if (r <= 0) { usbi_warn(NULL, "udev control pipe signal failed"); } @@ -162,6 +178,7 @@ static void *linux_udev_event_thread_main(void *arg) { char dummy; int r; + ssize_t nb; struct udev_device* udev_dev; struct pollfd fds[] = { {.fd = udev_control_pipe[0], @@ -179,8 +196,8 @@ static void *linux_udev_event_thread_main(void *arg) } if (fds[0].revents & POLLIN) { /* activity on control pipe, read the byte and exit */ - r = usbi_read(udev_control_pipe[0], &dummy, sizeof(dummy)); - if (r <= 0) { + nb = read(udev_control_pipe[0], &dummy, sizeof(dummy)); + if (nb <= 0) { usbi_warn(NULL, "udev control pipe read failed"); } break; @@ -274,6 +291,7 @@ int linux_udev_scan_devices(struct libusb_context *ctx) udev_enumerate_scan_devices(enumerator); devices = udev_enumerate_get_list_entry(enumerator); + entry = NULL; udev_list_entry_foreach(entry, devices) { const char *path = udev_list_entry_get_name(entry); uint8_t busnum = 0, devaddr = 0; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/linux_usbfs.c similarity index 93% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.c rename to vendor/github.com/karalabe/usb/libusb/libusb/os/linux_usbfs.c index 6b89ba2889fb..768e7d5a64ee 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/linux_usbfs.c @@ -81,6 +81,19 @@ static const char *usbfs_path = NULL; /* use usbdev*.* device names in /dev instead of the usbfs bus directories */ static int usbdev_names = 0; +/* Linux has changed the maximum length of an individual isochronous packet + * over time. Initially this limit was 1,023 bytes, but Linux 2.6.18 + * (commit 3612242e527eb47ee4756b5350f8bdf791aa5ede) increased this value to + * 8,192 bytes to support higher bandwidth devices. Linux 3.10 + * (commit e2e2f0ea1c935edcf53feb4c4c8fdb4f86d57dd9) further increased this + * value to 49,152 bytes to support super speed devices. + */ +static unsigned int max_iso_packet_len = 0; + +/* Linux 2.6.23 adds support for O_CLOEXEC when opening files, which marks the + * close-on-exec flag in the underlying file descriptor. */ +static int supports_flag_cloexec = -1; + /* Linux 2.6.32 adds support for a bulk continuation URB flag. this basically * allows us to mark URBs as being part of a specific logical transfer when * we submit them to the kernel. then, on any error except a cancellation, all @@ -136,6 +149,12 @@ static int detach_kernel_driver_and_claim(struct libusb_device_handle *, int); static int linux_default_scan_devices (struct libusb_context *ctx); #endif +struct kernel_version { + int major; + int minor; + int sublevel; +}; + struct linux_device_priv { char *sysfs_dir; unsigned char *descriptors; @@ -180,6 +199,16 @@ struct linux_transfer_priv { int iso_packet_offset; }; +static int _open(const char *path, int flags) +{ +#if defined(O_CLOEXEC) + if (supports_flag_cloexec) + return open(path, flags | O_CLOEXEC); + else +#endif + return open(path, flags); +} + static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent) { struct libusb_context *ctx = DEVICE_CTX(dev); @@ -194,7 +223,7 @@ static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent) snprintf(path, PATH_MAX, "%s/%03d/%03d", usbfs_path, dev->bus_number, dev->device_address); - fd = open(path, mode); + fd = _open(path, mode); if (fd != -1) return fd; /* Success */ @@ -205,7 +234,7 @@ static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent) /* Wait 10ms for USB device path creation.*/ nanosleep(&(struct timespec){delay / 1000000, (delay * 1000) % 1000000000UL}, NULL); - fd = open(path, mode); + fd = _open(path, mode); if (fd != -1) return fd; /* Success */ } @@ -342,39 +371,59 @@ static clockid_t find_monotonic_clock(void) return CLOCK_REALTIME; } -static int kernel_version_ge(int major, int minor, int sublevel) +static int get_kernel_version(struct libusb_context *ctx, + struct kernel_version *ver) { struct utsname uts; - int atoms, kmajor, kminor, ksublevel; + int atoms; - if (uname(&uts) < 0) + if (uname(&uts) < 0) { + usbi_err(ctx, "uname failed, errno %d", errno); return -1; - atoms = sscanf(uts.release, "%d.%d.%d", &kmajor, &kminor, &ksublevel); - if (atoms < 1) + } + + atoms = sscanf(uts.release, "%d.%d.%d", &ver->major, &ver->minor, &ver->sublevel); + if (atoms < 1) { + usbi_err(ctx, "failed to parse uname release '%s'", uts.release); return -1; + } + + if (atoms < 2) + ver->minor = -1; + if (atoms < 3) + ver->sublevel = -1; - if (kmajor > major) + usbi_dbg("reported kernel version is %s", uts.release); + + return 0; +} + +static int kernel_version_ge(const struct kernel_version *ver, + int major, int minor, int sublevel) +{ + if (ver->major > major) return 1; - if (kmajor < major) + else if (ver->major < major) return 0; /* kmajor == major */ - if (atoms < 2) + if (ver->minor == -1 && ver->sublevel == -1) return 0 == minor && 0 == sublevel; - if (kminor > minor) + else if (ver->minor > minor) return 1; - if (kminor < minor) + else if (ver->minor < minor) return 0; /* kminor == minor */ - if (atoms < 3) + if (ver->sublevel == -1) return 0 == sublevel; - return ksublevel >= sublevel; + return ver->sublevel >= sublevel; } static int op_init(struct libusb_context *ctx) { + struct kernel_version kversion; struct stat statbuf; int r; @@ -387,13 +436,17 @@ static int op_init(struct libusb_context *ctx) if (monotonic_clkid == -1) monotonic_clkid = find_monotonic_clock(); + if (get_kernel_version(ctx, &kversion) < 0) + return LIBUSB_ERROR_OTHER; + + if (supports_flag_cloexec == -1) { + /* O_CLOEXEC flag available from Linux 2.6.23 */ + supports_flag_cloexec = kernel_version_ge(&kversion,2,6,23); + } + if (supports_flag_bulk_continuation == -1) { /* bulk continuation URB flag available from Linux 2.6.32 */ - supports_flag_bulk_continuation = kernel_version_ge(2,6,32); - if (supports_flag_bulk_continuation == -1) { - usbi_err(ctx, "error checking for bulk continuation support"); - return LIBUSB_ERROR_OTHER; - } + supports_flag_bulk_continuation = kernel_version_ge(&kversion,2,6,32); } if (supports_flag_bulk_continuation) @@ -401,32 +454,31 @@ static int op_init(struct libusb_context *ctx) if (-1 == supports_flag_zero_packet) { /* zero length packet URB flag fixed since Linux 2.6.31 */ - supports_flag_zero_packet = kernel_version_ge(2,6,31); - if (-1 == supports_flag_zero_packet) { - usbi_err(ctx, "error checking for zero length packet support"); - return LIBUSB_ERROR_OTHER; - } + supports_flag_zero_packet = kernel_version_ge(&kversion,2,6,31); } if (supports_flag_zero_packet) usbi_dbg("zero length packet flag supported"); + if (!max_iso_packet_len) { + if (kernel_version_ge(&kversion,3,10,0)) + max_iso_packet_len = 49152; + else if (kernel_version_ge(&kversion,2,6,18)) + max_iso_packet_len = 8192; + else + max_iso_packet_len = 1023; + } + + usbi_dbg("max iso packet length is (likely) %u bytes", max_iso_packet_len); + if (-1 == sysfs_has_descriptors) { /* sysfs descriptors has all descriptors since Linux 2.6.26 */ - sysfs_has_descriptors = kernel_version_ge(2,6,26); - if (-1 == sysfs_has_descriptors) { - usbi_err(ctx, "error checking for sysfs descriptors"); - return LIBUSB_ERROR_OTHER; - } + sysfs_has_descriptors = kernel_version_ge(&kversion,2,6,26); } if (-1 == sysfs_can_relate_devices) { /* sysfs has busnum since Linux 2.6.22 */ - sysfs_can_relate_devices = kernel_version_ge(2,6,22); - if (-1 == sysfs_can_relate_devices) { - usbi_err(ctx, "error checking for sysfs busnum"); - return LIBUSB_ERROR_OTHER; - } + sysfs_can_relate_devices = kernel_version_ge(&kversion,2,6,22); } if (sysfs_can_relate_devices || sysfs_has_descriptors) { @@ -463,8 +515,9 @@ static int op_init(struct libusb_context *ctx) return r; } -static void op_exit(void) +static void op_exit(struct libusb_context *ctx) { + UNUSED(ctx); usbi_mutex_static_lock(&linux_hotplug_startstop_lock); assert(init_count != 0); if (!--init_count) { @@ -526,7 +579,7 @@ static int _open_sysfs_attr(struct libusb_device *dev, const char *attr) snprintf(filename, PATH_MAX, "%s/%s/%s", SYSFS_DEVICE_PATH, priv->sysfs_dir, attr); - fd = open(filename, O_RDONLY); + fd = _open(filename, O_RDONLY); if (fd < 0) { usbi_err(DEVICE_CTX(dev), "open %s failed ret=%d errno=%d", filename, fd, errno); @@ -542,12 +595,12 @@ static int __read_sysfs_attr(struct libusb_context *ctx, { char filename[PATH_MAX]; FILE *f; - int r, value; + int fd, r, value; snprintf(filename, PATH_MAX, "%s/%s/%s", SYSFS_DEVICE_PATH, devname, attr); - f = fopen(filename, "r"); - if (f == NULL) { + fd = _open(filename, O_RDONLY); + if (fd == -1) { if (errno == ENOENT) { /* File doesn't exist. Assume the device has been disconnected (see trac ticket #70). */ @@ -557,6 +610,13 @@ static int __read_sysfs_attr(struct libusb_context *ctx, return LIBUSB_ERROR_IO; } + f = fdopen(fd, "r"); + if (f == NULL) { + usbi_err(ctx, "fdopen %s failed errno=%d", filename, errno); + close(fd); + return LIBUSB_ERROR_OTHER; + } + r = fscanf(f, "%d", &value); fclose(f); if (r != 1) { @@ -806,7 +866,7 @@ static int op_get_active_config_descriptor(struct libusb_device *dev, if (r < 0) return r; - len = MIN(len, r); + len = MIN(len, (size_t)r); memcpy(buffer, config_desc, len); return len; } @@ -836,7 +896,7 @@ static int op_get_config_descriptor(struct libusb_device *dev, descriptors += r; } - len = MIN(len, r); + len = MIN(len, (size_t)r); memcpy(buffer, descriptors, len); return len; } @@ -911,6 +971,7 @@ static int initialize_device(struct libusb_device *dev, uint8_t busnum, case 12: dev->speed = LIBUSB_SPEED_FULL; break; case 480: dev->speed = LIBUSB_SPEED_HIGH; break; case 5000: dev->speed = LIBUSB_SPEED_SUPER; break; + case 10000: dev->speed = LIBUSB_SPEED_SUPER_PLUS; break; default: usbi_warn(DEVICE_CTX(dev), "Unknown device speed: %d Mbps", speed); } @@ -1239,11 +1300,12 @@ static int sysfs_get_device_list(struct libusb_context *ctx) { DIR *devices = opendir(SYSFS_DEVICE_PATH); struct dirent *entry; - int r = LIBUSB_ERROR_IO; + int num_devices = 0; + int num_enumerated = 0; if (!devices) { usbi_err(ctx, "opendir devices failed errno=%d", errno); - return r; + return LIBUSB_ERROR_IO; } while ((entry = readdir(devices))) { @@ -1251,16 +1313,23 @@ static int sysfs_get_device_list(struct libusb_context *ctx) || strchr(entry->d_name, ':')) continue; + num_devices++; + if (sysfs_scan_device(ctx, entry->d_name)) { usbi_dbg("failed to enumerate dir entry %s", entry->d_name); continue; } - r = 0; + num_enumerated++; } closedir(devices); - return r; + + /* successful if at least one device was enumerated or no devices were found */ + if (num_enumerated || !num_devices) + return LIBUSB_SUCCESS; + else + return LIBUSB_ERROR_IO; } static int linux_default_scan_devices (struct libusb_context *ctx) @@ -1685,10 +1754,7 @@ static int detach_kernel_driver_and_claim(struct libusb_device_handle *handle, strcpy(dc.driver, "usbfs"); dc.flags = USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER; r = ioctl(fd, IOCTL_USBFS_DISCONNECT_CLAIM, &dc); - if (r == 0 || (r != 0 && errno != ENOTTY)) { - if (r == 0) - return 0; - + if (r != 0 && errno != ENOTTY) { switch (errno) { case EBUSY: return LIBUSB_ERROR_BUSY; @@ -1700,7 +1766,8 @@ static int detach_kernel_driver_and_claim(struct libusb_device_handle *handle, usbi_err(HANDLE_CTX(handle), "disconnect-and-claim failed errno %d", errno); return LIBUSB_ERROR_OTHER; - } + } else if (r == 0) + return 0; /* Fallback code for kernels which don't support the disconnect-and-claim ioctl */ @@ -1973,38 +2040,43 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) struct linux_device_handle_priv *dpriv = _device_handle_priv(transfer->dev_handle); struct usbfs_urb **urbs; - size_t alloc_size; int num_packets = transfer->num_iso_packets; - int i; - int this_urb_len = 0; - int num_urbs = 1; - int packet_offset = 0; + int num_packets_remaining; + int i, j; + int num_urbs; unsigned int packet_len; + unsigned int total_len = 0; unsigned char *urb_buffer = transfer->buffer; + if (num_packets < 1) + return LIBUSB_ERROR_INVALID_PARAM; + /* usbfs places arbitrary limits on iso URBs. this limit has changed - * at least three times, and it's difficult to accurately detect which - * limit this running kernel might impose. so we attempt to submit - * whatever the user has provided. if the kernel rejects the request - * due to its size, we return an error indicating such to the user. + * at least three times, but we attempt to detect this limit during + * init and check it here. if the kernel rejects the request due to + * its size, we return an error indicating such to the user. */ - - /* calculate how many URBs we need */ for (i = 0; i < num_packets; i++) { - unsigned int space_remaining = MAX_ISO_BUFFER_LENGTH - this_urb_len; packet_len = transfer->iso_packet_desc[i].length; - if (packet_len > space_remaining) { - num_urbs++; - this_urb_len = packet_len; - /* check that we can actually support this packet length */ - if (this_urb_len > MAX_ISO_BUFFER_LENGTH) - return LIBUSB_ERROR_INVALID_PARAM; - } else { - this_urb_len += packet_len; + if (packet_len > max_iso_packet_len) { + usbi_warn(TRANSFER_CTX(transfer), + "iso packet length of %u bytes exceeds maximum of %u bytes", + packet_len, max_iso_packet_len); + return LIBUSB_ERROR_INVALID_PARAM; } + + total_len += packet_len; } - usbi_dbg("need %d %dk URBs for transfer", num_urbs, MAX_ISO_BUFFER_LENGTH / 1024); + + if (transfer->length < (int)total_len) + return LIBUSB_ERROR_INVALID_PARAM; + + /* usbfs limits the number of iso packets per URB */ + num_urbs = (num_packets + (MAX_ISO_PACKETS_PER_URB - 1)) / MAX_ISO_PACKETS_PER_URB; + + usbi_dbg("need %d urbs for new transfer with length %d", num_urbs, + transfer->length); urbs = calloc(num_urbs, sizeof(*urbs)); if (!urbs) @@ -2017,31 +2089,15 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) tpriv->iso_packet_offset = 0; /* allocate + initialize each URB with the correct number of packets */ - for (i = 0; i < num_urbs; i++) { + num_packets_remaining = num_packets; + for (i = 0, j = 0; i < num_urbs; i++) { + int num_packets_in_urb = MIN(num_packets_remaining, MAX_ISO_PACKETS_PER_URB); struct usbfs_urb *urb; - unsigned int space_remaining_in_urb = MAX_ISO_BUFFER_LENGTH; - int urb_packet_offset = 0; - unsigned char *urb_buffer_orig = urb_buffer; - int j; + size_t alloc_size; int k; - /* swallow up all the packets we can fit into this URB */ - while (packet_offset < transfer->num_iso_packets) { - packet_len = transfer->iso_packet_desc[packet_offset].length; - if (packet_len <= space_remaining_in_urb) { - /* throw it in */ - urb_packet_offset++; - packet_offset++; - space_remaining_in_urb -= packet_len; - urb_buffer += packet_len; - } else { - /* it can't fit, save it for the next URB */ - break; - } - } - alloc_size = sizeof(*urb) - + (urb_packet_offset * sizeof(struct usbfs_iso_packet_desc)); + + (num_packets_in_urb * sizeof(struct usbfs_iso_packet_desc)); urb = calloc(1, alloc_size); if (!urb) { free_iso_urbs(tpriv); @@ -2050,10 +2106,10 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) urbs[i] = urb; /* populate packet lengths */ - for (j = 0, k = packet_offset - urb_packet_offset; - k < packet_offset; k++, j++) { - packet_len = transfer->iso_packet_desc[k].length; - urb->iso_frame_desc[j].length = packet_len; + for (k = 0; k < num_packets_in_urb; j++, k++) { + packet_len = transfer->iso_packet_desc[j].length; + urb->buffer_length += packet_len; + urb->iso_frame_desc[k].length = packet_len; } urb->usercontext = itransfer; @@ -2061,8 +2117,11 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) /* FIXME: interface for non-ASAP data? */ urb->flags = USBFS_URB_ISO_ASAP; urb->endpoint = transfer->endpoint; - urb->number_of_packets = urb_packet_offset; - urb->buffer = urb_buffer_orig; + urb->number_of_packets = num_packets_in_urb; + urb->buffer = urb_buffer; + + urb_buffer += urb->buffer_length; + num_packets_remaining -= num_packets_in_urb; } /* submit URBs */ @@ -2075,6 +2134,10 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) usbi_warn(TRANSFER_CTX(transfer), "submiturb failed, transfer too large"); r = LIBUSB_ERROR_INVALID_PARAM; + } else if (errno == EMSGSIZE) { + usbi_warn(TRANSFER_CTX(transfer), + "submiturb failed, iso packet length too large"); + r = LIBUSB_ERROR_INVALID_PARAM; } else { usbi_err(TRANSFER_CTX(transfer), "submiturb failed error %d errno=%d", r, errno); @@ -2213,7 +2276,6 @@ static void op_clear_transfer_priv(struct usbi_transfer *itransfer) USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - /* urbs can be freed also in submit_transfer so lock mutex first */ switch (transfer->type) { case LIBUSB_TRANSFER_TYPE_CONTROL: case LIBUSB_TRANSFER_TYPE_BULK: @@ -2685,7 +2747,7 @@ static clockid_t op_get_timerfd_clockid(void) } #endif -const struct usbi_os_backend linux_usbfs_backend = { +const struct usbi_os_backend usbi_backend = { .name = "Linux usbfs", .caps = USBI_CAP_HAS_HID_ACCESS|USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER, .init = op_init, diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/linux_usbfs.h similarity index 99% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.h rename to vendor/github.com/karalabe/usb/libusb/libusb/os/linux_usbfs.h index 8bd3ebcb163e..24496325f6b6 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.h +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/linux_usbfs.h @@ -81,10 +81,11 @@ struct usbfs_iso_packet_desc { unsigned int status; }; -#define MAX_ISO_BUFFER_LENGTH 49152 * 128 #define MAX_BULK_BUFFER_LENGTH 16384 #define MAX_CTRL_BUFFER_LENGTH 4096 +#define MAX_ISO_PACKETS_PER_URB 128 + struct usbfs_urb { unsigned char type; unsigned char endpoint; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/netbsd_usb.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/netbsd_usb.c similarity index 98% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/netbsd_usb.c rename to vendor/github.com/karalabe/usb/libusb/libusb/os/netbsd_usb.c index ad1ede73e10f..d9c059a7764f 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/netbsd_usb.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/netbsd_usb.c @@ -86,11 +86,12 @@ static int _sync_control_transfer(struct usbi_transfer *); static int _sync_gen_transfer(struct usbi_transfer *); static int _access_endpoint(struct libusb_transfer *); -const struct usbi_os_backend netbsd_backend = { +const struct usbi_os_backend usbi_backend = { "Synchronous NetBSD backend", 0, NULL, /* init() */ NULL, /* exit() */ + NULL, /* set_option() */ netbsd_get_device_list, NULL, /* hotplug_poll */ netbsd_open, @@ -131,6 +132,7 @@ const struct usbi_os_backend netbsd_backend = { netbsd_handle_transfer_completion, netbsd_clock_gettime, + 0, /* context_priv_size */ sizeof(struct device_priv), sizeof(struct handle_priv), 0, /* transfer_priv_size */ @@ -212,7 +214,6 @@ netbsd_get_device_list(struct libusb_context * ctx, int netbsd_open(struct libusb_device_handle *handle) { - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; dpriv->fd = open(dpriv->devnode, O_RDWR); @@ -230,7 +231,6 @@ netbsd_open(struct libusb_device_handle *handle) void netbsd_close(struct libusb_device_handle *handle) { - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; usbi_dbg("close: fd %d", dpriv->fd); diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/openbsd_usb.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/openbsd_usb.c similarity index 99% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/openbsd_usb.c rename to vendor/github.com/karalabe/usb/libusb/libusb/os/openbsd_usb.c index c660257114b5..f174e496c44d 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/openbsd_usb.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/openbsd_usb.c @@ -89,11 +89,12 @@ static int _access_endpoint(struct libusb_transfer *); static int _bus_open(int); -const struct usbi_os_backend openbsd_backend = { +const struct usbi_os_backend usbi_backend = { "Synchronous OpenBSD backend", 0, NULL, /* init() */ NULL, /* exit() */ + NULL, /* set_option() */ obsd_get_device_list, NULL, /* hotplug_poll */ obsd_open, @@ -134,6 +135,7 @@ const struct usbi_os_backend openbsd_backend = { obsd_handle_transfer_completion, obsd_clock_gettime, + 0, /* context_priv_size */ sizeof(struct device_priv), sizeof(struct handle_priv), 0, /* transfer_priv_size */ @@ -246,7 +248,6 @@ obsd_get_device_list(struct libusb_context * ctx, int obsd_open(struct libusb_device_handle *handle) { - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; char devnode[16]; @@ -270,7 +271,6 @@ obsd_open(struct libusb_device_handle *handle) void obsd_close(struct libusb_device_handle *handle) { - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; if (dpriv->devname) { diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_posix.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_posix.c new file mode 100644 index 000000000000..337714aa6bbe --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_posix.c @@ -0,0 +1,84 @@ +/* + * poll_posix: poll compatibility wrapper for POSIX systems + * Copyright © 2013 RealVNC Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include + +#include +#include +#include +#include + +#include "libusbi.h" + +int usbi_pipe(int pipefd[2]) +{ +#if defined(HAVE_PIPE2) + int ret = pipe2(pipefd, O_CLOEXEC); +#else + int ret = pipe(pipefd); +#endif + + if (ret != 0) { + usbi_err(NULL, "failed to create pipe (%d)", errno); + return ret; + } + +#if !defined(HAVE_PIPE2) && defined(FD_CLOEXEC) + ret = fcntl(pipefd[0], F_GETFD); + if (ret == -1) { + usbi_err(NULL, "failed to get pipe fd flags (%d)", errno); + goto err_close_pipe; + } + ret = fcntl(pipefd[0], F_SETFD, ret | FD_CLOEXEC); + if (ret == -1) { + usbi_err(NULL, "failed to set pipe fd flags (%d)", errno); + goto err_close_pipe; + } + + ret = fcntl(pipefd[1], F_GETFD); + if (ret == -1) { + usbi_err(NULL, "failed to get pipe fd flags (%d)", errno); + goto err_close_pipe; + } + ret = fcntl(pipefd[1], F_SETFD, ret | FD_CLOEXEC); + if (ret == -1) { + usbi_err(NULL, "failed to set pipe fd flags (%d)", errno); + goto err_close_pipe; + } +#endif + + ret = fcntl(pipefd[1], F_GETFL); + if (ret == -1) { + usbi_err(NULL, "failed to get pipe fd status flags (%d)", errno); + goto err_close_pipe; + } + ret = fcntl(pipefd[1], F_SETFL, ret | O_NONBLOCK); + if (ret == -1) { + usbi_err(NULL, "failed to set pipe fd status flags (%d)", errno); + goto err_close_pipe; + } + + return 0; + +err_close_pipe: + close(pipefd[0]); + close(pipefd[1]); + return ret; +} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_posix.h similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.h rename to vendor/github.com/karalabe/usb/libusb/libusb/os/poll_posix.h diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_windows.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_windows.c new file mode 100644 index 000000000000..4d283333d18f --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_windows.c @@ -0,0 +1,364 @@ +/* + * poll_windows: poll compatibility wrapper for Windows + * Copyright © 2017 Chris Dickens + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* + * poll() and pipe() Windows compatibility layer for libusb 1.0 + * + * The way this layer works is by using OVERLAPPED with async I/O transfers, as + * OVERLAPPED have an associated event which is flagged for I/O completion. + * + * For USB pollable async I/O, you would typically: + * - obtain a Windows HANDLE to a file or device that has been opened in + * OVERLAPPED mode + * - call usbi_create_fd with this handle to obtain a custom fd. + * - leave the core functions call the poll routine and flag POLLIN/POLLOUT + * + * The pipe pollable synchronous I/O works using the overlapped event associated + * with a fake pipe. The read/write functions are only meant to be used in that + * context. + */ +#include + +#include +#include +#include + +#include "libusbi.h" +#include "windows_common.h" + +// public fd data +const struct winfd INVALID_WINFD = { -1, NULL }; + +// private data +struct file_descriptor { + enum fd_type { FD_TYPE_PIPE, FD_TYPE_TRANSFER } type; + OVERLAPPED overlapped; +}; + +static usbi_mutex_static_t fd_table_lock = USBI_MUTEX_INITIALIZER; +static struct file_descriptor *fd_table[MAX_FDS]; + +static struct file_descriptor *create_fd(enum fd_type type) +{ + struct file_descriptor *fd = calloc(1, sizeof(*fd)); + if (fd == NULL) + return NULL; + fd->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (fd->overlapped.hEvent == NULL) { + free(fd); + return NULL; + } + fd->type = type; + return fd; +} + +static void free_fd(struct file_descriptor *fd) +{ + CloseHandle(fd->overlapped.hEvent); + free(fd); +} + +/* + * Create both an fd and an OVERLAPPED, so that it can be used with our + * polling function + * The handle MUST support overlapped transfers (usually requires CreateFile + * with FILE_FLAG_OVERLAPPED) + * Return a pollable file descriptor struct, or INVALID_WINFD on error + * + * Note that the fd returned by this function is a per-transfer fd, rather + * than a per-session fd and cannot be used for anything else but our + * custom functions. + * if you plan to do R/W on the same handle, you MUST create 2 fds: one for + * read and one for write. Using a single R/W fd is unsupported and will + * produce unexpected results + */ +struct winfd usbi_create_fd(void) +{ + struct file_descriptor *fd; + struct winfd wfd; + + fd = create_fd(FD_TYPE_TRANSFER); + if (fd == NULL) + return INVALID_WINFD; + + usbi_mutex_static_lock(&fd_table_lock); + for (wfd.fd = 0; wfd.fd < MAX_FDS; wfd.fd++) { + if (fd_table[wfd.fd] != NULL) + continue; + fd_table[wfd.fd] = fd; + break; + } + usbi_mutex_static_unlock(&fd_table_lock); + + if (wfd.fd == MAX_FDS) { + free_fd(fd); + return INVALID_WINFD; + } + + wfd.overlapped = &fd->overlapped; + + return wfd; +} + +static int check_pollfds(struct pollfd *fds, unsigned int nfds, + HANDLE *wait_handles, DWORD *nb_wait_handles) +{ + struct file_descriptor *fd; + unsigned int n; + int nready = 0; + + usbi_mutex_static_lock(&fd_table_lock); + + for (n = 0; n < nfds; ++n) { + fds[n].revents = 0; + + // Keep it simple - only allow either POLLIN *or* POLLOUT + assert((fds[n].events == POLLIN) || (fds[n].events == POLLOUT)); + if ((fds[n].events != POLLIN) && (fds[n].events != POLLOUT)) { + fds[n].revents = POLLNVAL; + nready++; + continue; + } + + if ((fds[n].fd >= 0) && (fds[n].fd < MAX_FDS)) + fd = fd_table[fds[n].fd]; + else + fd = NULL; + + assert(fd != NULL); + if (fd == NULL) { + fds[n].revents = POLLNVAL; + nready++; + continue; + } + + if (HasOverlappedIoCompleted(&fd->overlapped) + && (WaitForSingleObject(fd->overlapped.hEvent, 0) == WAIT_OBJECT_0)) { + fds[n].revents = fds[n].events; + nready++; + } else if (wait_handles != NULL) { + if (*nb_wait_handles == MAXIMUM_WAIT_OBJECTS) { + usbi_warn(NULL, "too many HANDLEs to wait on"); + continue; + } + wait_handles[*nb_wait_handles] = fd->overlapped.hEvent; + (*nb_wait_handles)++; + } + } + + usbi_mutex_static_unlock(&fd_table_lock); + + return nready; +} +/* + * POSIX poll equivalent, using Windows OVERLAPPED + * Currently, this function only accepts one of POLLIN or POLLOUT per fd + * (but you can create multiple fds from the same handle for read and write) + */ +int usbi_poll(struct pollfd *fds, unsigned int nfds, int timeout) +{ + HANDLE wait_handles[MAXIMUM_WAIT_OBJECTS]; + DWORD nb_wait_handles = 0; + DWORD ret; + int nready; + + nready = check_pollfds(fds, nfds, wait_handles, &nb_wait_handles); + + // If nothing was triggered, wait on all fds that require it + if ((nready == 0) && (nb_wait_handles != 0) && (timeout != 0)) { + ret = WaitForMultipleObjects(nb_wait_handles, wait_handles, + FALSE, (timeout < 0) ? INFINITE : (DWORD)timeout); + if (ret < (WAIT_OBJECT_0 + nb_wait_handles)) { + nready = check_pollfds(fds, nfds, NULL, NULL); + } else if (ret != WAIT_TIMEOUT) { + if (ret == WAIT_FAILED) + usbi_err(NULL, "WaitForMultipleObjects failed: %u", (unsigned int)GetLastError()); + nready = -1; + } + } + + return nready; +} + +/* + * close a fake file descriptor + */ +int usbi_close(int _fd) +{ + struct file_descriptor *fd; + + if (_fd < 0 || _fd >= MAX_FDS) + goto err_badfd; + + usbi_mutex_static_lock(&fd_table_lock); + fd = fd_table[_fd]; + fd_table[_fd] = NULL; + usbi_mutex_static_unlock(&fd_table_lock); + + if (fd == NULL) + goto err_badfd; + + if (fd->type == FD_TYPE_PIPE) { + // InternalHigh is our reference count + fd->overlapped.InternalHigh--; + if (fd->overlapped.InternalHigh == 0) + free_fd(fd); + } else { + free_fd(fd); + } + + return 0; + +err_badfd: + errno = EBADF; + return -1; +} + +/* +* Create a fake pipe. +* As libusb only uses pipes for signaling, all we need from a pipe is an +* event. To that extent, we create a single wfd and overlapped as a means +* to access that event. +*/ +int usbi_pipe(int filedes[2]) +{ + struct file_descriptor *fd; + int r_fd = -1, w_fd = -1; + int i; + + fd = create_fd(FD_TYPE_PIPE); + if (fd == NULL) { + errno = ENOMEM; + return -1; + } + + // Use InternalHigh as a reference count + fd->overlapped.Internal = STATUS_PENDING; + fd->overlapped.InternalHigh = 2; + + usbi_mutex_static_lock(&fd_table_lock); + do { + for (i = 0; i < MAX_FDS; i++) { + if (fd_table[i] != NULL) + continue; + if (r_fd == -1) { + r_fd = i; + } else if (w_fd == -1) { + w_fd = i; + break; + } + } + + if (i == MAX_FDS) + break; + + fd_table[r_fd] = fd; + fd_table[w_fd] = fd; + + } while (0); + usbi_mutex_static_unlock(&fd_table_lock); + + if (i == MAX_FDS) { + free_fd(fd); + errno = EMFILE; + return -1; + } + + filedes[0] = r_fd; + filedes[1] = w_fd; + + return 0; +} + +/* + * synchronous write for fake "pipe" signaling + */ +ssize_t usbi_write(int fd, const void *buf, size_t count) +{ + int error = EBADF; + + UNUSED(buf); + + if (fd < 0 || fd >= MAX_FDS) + goto err_out; + + if (count != sizeof(unsigned char)) { + usbi_err(NULL, "this function should only used for signaling"); + error = EINVAL; + goto err_out; + } + + usbi_mutex_static_lock(&fd_table_lock); + if ((fd_table[fd] != NULL) && (fd_table[fd]->type == FD_TYPE_PIPE)) { + assert(fd_table[fd]->overlapped.Internal == STATUS_PENDING); + assert(fd_table[fd]->overlapped.InternalHigh == 2); + fd_table[fd]->overlapped.Internal = STATUS_WAIT_0; + SetEvent(fd_table[fd]->overlapped.hEvent); + error = 0; + } + usbi_mutex_static_unlock(&fd_table_lock); + + if (error) + goto err_out; + + return sizeof(unsigned char); + +err_out: + errno = error; + return -1; +} + +/* + * synchronous read for fake "pipe" signaling + */ +ssize_t usbi_read(int fd, void *buf, size_t count) +{ + int error = EBADF; + + UNUSED(buf); + + if (fd < 0 || fd >= MAX_FDS) + goto err_out; + + if (count != sizeof(unsigned char)) { + usbi_err(NULL, "this function should only used for signaling"); + error = EINVAL; + goto err_out; + } + + usbi_mutex_static_lock(&fd_table_lock); + if ((fd_table[fd] != NULL) && (fd_table[fd]->type == FD_TYPE_PIPE)) { + assert(fd_table[fd]->overlapped.Internal == STATUS_WAIT_0); + assert(fd_table[fd]->overlapped.InternalHigh == 2); + fd_table[fd]->overlapped.Internal = STATUS_PENDING; + ResetEvent(fd_table[fd]->overlapped.hEvent); + error = 0; + } + usbi_mutex_static_unlock(&fd_table_lock); + + if (error) + goto err_out; + + return sizeof(unsigned char); + +err_out: + errno = error; + return -1; +} diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_windows.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_windows.h new file mode 100644 index 000000000000..bd22c7f62308 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/poll_windows.h @@ -0,0 +1,97 @@ +/* + * Windows compat: POSIX compatibility wrapper + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2010 Pete Batard + * Copyright © 2016-2018 Chris Dickens + * With contributions from Michael Plante, Orin Eman et al. + * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#pragma once + +#if defined(_MSC_VER) +// disable /W4 MSVC warnings that are benign +#pragma warning(disable:4127) // conditional expression is constant +#endif + +// Handle synchronous completion through the overlapped structure +#if !defined(STATUS_REPARSE) // reuse the REPARSE status code +#define STATUS_REPARSE ((LONG)0x00000104L) +#endif +#define STATUS_COMPLETED_SYNCHRONOUSLY STATUS_REPARSE +#if defined(_WIN32_WCE) +// WinCE doesn't have a HasOverlappedIoCompleted() macro, so attempt to emulate it +#define HasOverlappedIoCompleted(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) != STATUS_PENDING) +#endif +#define HasOverlappedIoCompletedSync(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) == STATUS_COMPLETED_SYNCHRONOUSLY) + +#define DUMMY_HANDLE ((HANDLE)(LONG_PTR)-2) + +#define MAX_FDS 256 + +#define POLLIN 0x0001 /* There is data to read */ +#define POLLPRI 0x0002 /* There is urgent data to read */ +#define POLLOUT 0x0004 /* Writing now will not block */ +#define POLLERR 0x0008 /* Error condition */ +#define POLLHUP 0x0010 /* Hung up */ +#define POLLNVAL 0x0020 /* Invalid request: fd not open */ + +struct pollfd { + int fd; /* file descriptor */ + short events; /* requested events */ + short revents; /* returned events */ +}; + +struct winfd { + int fd; // what's exposed to libusb core + OVERLAPPED *overlapped; // what will report our I/O status +}; + +extern const struct winfd INVALID_WINFD; + +struct winfd usbi_create_fd(void); + +int usbi_pipe(int pipefd[2]); +int usbi_poll(struct pollfd *fds, unsigned int nfds, int timeout); +ssize_t usbi_write(int fd, const void *buf, size_t count); +ssize_t usbi_read(int fd, void *buf, size_t count); +int usbi_close(int fd); + +/* + * Timeval operations + */ +#if defined(DDKBUILD) +#include // defines timeval functions on DDK +#endif + +#if !defined(TIMESPEC_TO_TIMEVAL) +#define TIMESPEC_TO_TIMEVAL(tv, ts) { \ + (tv)->tv_sec = (long)(ts)->tv_sec; \ + (tv)->tv_usec = (long)(ts)->tv_nsec / 1000; \ +} +#endif +#if !defined(timersub) +#define timersub(a, b, result) \ +do { \ + (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ + (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ + if ((result)->tv_usec < 0) { \ + --(result)->tv_sec; \ + (result)->tv_usec += 1000000; \ + } \ +} while (0) +#endif diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/sunos_usb.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/sunos_usb.c new file mode 100644 index 000000000000..7150a3e9d970 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/sunos_usb.c @@ -0,0 +1,1675 @@ +/* + * + * Copyright (c) 2016, Oracle and/or its affiliates. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libusbi.h" +#include "sunos_usb.h" + +#define UPDATEDRV_PATH "/usr/sbin/update_drv" +#define UPDATEDRV "update_drv" + +typedef list_t string_list_t; +typedef struct string_node { + char *string; + list_node_t link; +} string_node_t; + +/* + * Backend functions + */ +static int sunos_init(struct libusb_context *); +static void sunos_exit(struct libusb_context *); +static int sunos_get_device_list(struct libusb_context *, + struct discovered_devs **); +static int sunos_open(struct libusb_device_handle *); +static void sunos_close(struct libusb_device_handle *); +static int sunos_get_device_descriptor(struct libusb_device *, + uint8_t*, int *); +static int sunos_get_active_config_descriptor(struct libusb_device *, + uint8_t*, size_t, int *); +static int sunos_get_config_descriptor(struct libusb_device *, uint8_t, + uint8_t*, size_t, int *); +static int sunos_get_configuration(struct libusb_device_handle *, int *); +static int sunos_set_configuration(struct libusb_device_handle *, int); +static int sunos_claim_interface(struct libusb_device_handle *, int); +static int sunos_release_interface(struct libusb_device_handle *, int); +static int sunos_set_interface_altsetting(struct libusb_device_handle *, + int, int); +static int sunos_clear_halt(struct libusb_device_handle *, uint8_t); +static int sunos_reset_device(struct libusb_device_handle *); +static void sunos_destroy_device(struct libusb_device *); +static int sunos_submit_transfer(struct usbi_transfer *); +static int sunos_cancel_transfer(struct usbi_transfer *); +static void sunos_clear_transfer_priv(struct usbi_transfer *); +static int sunos_handle_transfer_completion(struct usbi_transfer *); +static int sunos_clock_gettime(int, struct timespec *); +static int sunos_kernel_driver_active(struct libusb_device_handle *, int interface); +static int sunos_detach_kernel_driver (struct libusb_device_handle *dev, int interface_number); +static int sunos_attach_kernel_driver (struct libusb_device_handle *dev, int interface_number); +static int sunos_usb_open_ep0(sunos_dev_handle_priv_t *hpriv, sunos_dev_priv_t *dpriv); +static int sunos_usb_ioctl(struct libusb_device *dev, int cmd); + +static struct devctl_iocdata iocdata; +static int sunos_get_link(di_devlink_t devlink, void *arg) +{ + walk_link_t *larg = (walk_link_t *)arg; + const char *p; + const char *q; + + if (larg->path) { + char *content = (char *)di_devlink_content(devlink); + char *start = strstr(content, "/devices/"); + start += strlen("/devices"); + usbi_dbg("%s", start); + + /* line content must have minor node */ + if (start == NULL || + strncmp(start, larg->path, larg->len) != 0 || + start[larg->len] != ':') + return (DI_WALK_CONTINUE); + } + + p = di_devlink_path(devlink); + q = strrchr(p, '/'); + usbi_dbg("%s", q); + + *(larg->linkpp) = strndup(p, strlen(p) - strlen(q)); + + return (DI_WALK_TERMINATE); +} + + +static int sunos_physpath_to_devlink( + const char *node_path, const char *match, char **link_path) +{ + walk_link_t larg; + di_devlink_handle_t hdl; + + *link_path = NULL; + larg.linkpp = link_path; + if ((hdl = di_devlink_init(NULL, 0)) == NULL) { + usbi_dbg("di_devlink_init failure"); + return (-1); + } + + larg.len = strlen(node_path); + larg.path = (char *)node_path; + + (void) di_devlink_walk(hdl, match, NULL, DI_PRIMARY_LINK, + (void *)&larg, sunos_get_link); + + (void) di_devlink_fini(&hdl); + + if (*link_path == NULL) { + usbi_dbg("there is no devlink for this path"); + return (-1); + } + + return 0; +} + +static int +sunos_usb_ioctl(struct libusb_device *dev, int cmd) +{ + int fd; + nvlist_t *nvlist; + char *end; + char *phypath; + char *hubpath; + char path_arg[PATH_MAX]; + sunos_dev_priv_t *dpriv; + devctl_ap_state_t devctl_ap_state; + + dpriv = (sunos_dev_priv_t *)dev->os_priv; + phypath = dpriv->phypath; + + end = strrchr(phypath, '/'); + if (end == NULL) + return (-1); + hubpath = strndup(phypath, end - phypath); + if (hubpath == NULL) + return (-1); + + end = strrchr(hubpath, '@'); + if (end == NULL) { + free(hubpath); + return (-1); + } + end++; + usbi_dbg("unitaddr: %s", end); + + nvlist_alloc(&nvlist, NV_UNIQUE_NAME_TYPE, KM_NOSLEEP); + nvlist_add_int32(nvlist, "port", dev->port_number); + //find the hub path + snprintf(path_arg, sizeof(path_arg), "/devices%s:hubd", hubpath); + usbi_dbg("ioctl hub path: %s", path_arg); + + fd = open(path_arg, O_RDONLY); + if (fd < 0) { + usbi_err(DEVICE_CTX(dev), "open failed: %d (%s)", errno, strerror(errno)); + nvlist_free(nvlist); + free(hubpath); + return (-1); + } + + memset(&iocdata, 0, sizeof(iocdata)); + memset(&devctl_ap_state, 0, sizeof(devctl_ap_state)); + + nvlist_pack(nvlist, (char **)&iocdata.nvl_user, &iocdata.nvl_usersz, NV_ENCODE_NATIVE, 0); + + iocdata.cmd = DEVCTL_AP_GETSTATE; + iocdata.flags = 0; + iocdata.c_nodename = "hub"; + iocdata.c_unitaddr = end; + iocdata.cpyout_buf = &devctl_ap_state; + usbi_dbg("%p, %d", iocdata.nvl_user, iocdata.nvl_usersz); + + errno = 0; + if (ioctl(fd, DEVCTL_AP_GETSTATE, &iocdata) == -1) { + usbi_err(DEVICE_CTX(dev), "ioctl failed: fd %d, cmd %x, errno %d (%s)", + fd, DEVCTL_AP_GETSTATE, errno, strerror(errno)); + } else { + usbi_dbg("dev rstate: %d", devctl_ap_state.ap_rstate); + usbi_dbg("dev ostate: %d", devctl_ap_state.ap_ostate); + } + + errno = 0; + iocdata.cmd = cmd; + if (ioctl(fd, (int)cmd, &iocdata) != 0) { + usbi_err(DEVICE_CTX(dev), "ioctl failed: fd %d, cmd %x, errno %d (%s)", + fd, cmd, errno, strerror(errno)); + sleep(2); + } + + close(fd); + free(iocdata.nvl_user); + nvlist_free(nvlist); + free(hubpath); + + return (-errno); +} + +static int +sunos_kernel_driver_active(struct libusb_device_handle *dev, int interface) +{ + sunos_dev_priv_t *dpriv; + dpriv = (sunos_dev_priv_t *)dev->dev->os_priv; + + usbi_dbg("%s", dpriv->ugenpath); + + return (dpriv->ugenpath == NULL); +} + +/* + * Private functions + */ +static int _errno_to_libusb(int); +static int sunos_usb_get_status(int fd); + +static int sunos_init(struct libusb_context *ctx) +{ + return (LIBUSB_SUCCESS); +} + +static void sunos_exit(struct libusb_context *ctx) +{ + usbi_dbg(""); +} + +static string_list_t * +sunos_new_string_list(void) +{ + string_list_t *list; + + list = calloc(1, sizeof(*list)); + if (list != NULL) + list_create(list, sizeof(string_node_t), + offsetof(string_node_t, link)); + + return (list); +} + +static int +sunos_append_to_string_list(string_list_t *list, const char *arg) +{ + string_node_t *np; + + np = calloc(1, sizeof(*np)); + if (!np) + return (-1); + + np->string = strdup(arg); + if (!np->string) { + free(np); + return (-1); + } + + list_insert_tail(list, np); + + return (0); +} + +static void +sunos_free_string_list(string_list_t *list) +{ + string_node_t *np; + + while ((np = list_remove_head(list)) != NULL) { + free(np->string); + free(np); + } + + free(list); +} + +static char ** +sunos_build_argv_list(string_list_t *list) +{ + char **argv_list; + string_node_t *np; + int n; + + n = 1; /* Start at 1 for NULL terminator */ + for (np = list_head(list); np != NULL; np = list_next(list, np)) + n++; + + argv_list = calloc(n, sizeof(char *)); + if (argv_list == NULL) + return NULL; + + n = 0; + for (np = list_head(list); np != NULL; np = list_next(list, np)) + argv_list[n++] = np->string; + + return (argv_list); +} + + +static int +sunos_exec_command(struct libusb_context *ctx, const char *path, + string_list_t *list) +{ + pid_t pid; + int status; + int waitstat; + int exit_status; + char **argv_list; + + argv_list = sunos_build_argv_list(list); + if (argv_list == NULL) + return (-1); + + pid = fork(); + if (pid == 0) { + /* child */ + execv(path, argv_list); + _exit(127); + } else if (pid > 0) { + /* parent */ + do { + waitstat = waitpid(pid, &status, 0); + } while ((waitstat == -1 && errno == EINTR) || + (waitstat == 0 && !WIFEXITED(status) && !WIFSIGNALED(status))); + + if (waitstat == 0) { + if (WIFEXITED(status)) + exit_status = WEXITSTATUS(status); + else + exit_status = WTERMSIG(status); + } else { + usbi_err(ctx, "waitpid failed: errno %d (%s)", errno, strerror(errno)); + exit_status = -1; + } + } else { + /* fork failed */ + usbi_err(ctx, "fork failed: errno %d (%s)", errno, strerror(errno)); + exit_status = -1; + } + + free(argv_list); + + return (exit_status); +} + +static int +sunos_detach_kernel_driver(struct libusb_device_handle *dev_handle, + int interface_number) +{ + struct libusb_context *ctx = HANDLE_CTX(dev_handle); + string_list_t *list; + char path_arg[PATH_MAX]; + sunos_dev_priv_t *dpriv; + int r; + + dpriv = (sunos_dev_priv_t *)dev_handle->dev->os_priv; + snprintf(path_arg, sizeof(path_arg), "\'\"%s\"\'", dpriv->phypath); + usbi_dbg("%s", path_arg); + + list = sunos_new_string_list(); + if (list == NULL) + return (LIBUSB_ERROR_NO_MEM); + + /* attach ugen driver */ + r = 0; + r |= sunos_append_to_string_list(list, UPDATEDRV); + r |= sunos_append_to_string_list(list, "-a"); /* add rule */ + r |= sunos_append_to_string_list(list, "-i"); /* specific device */ + r |= sunos_append_to_string_list(list, path_arg); /* physical path */ + r |= sunos_append_to_string_list(list, "ugen"); + if (r) { + sunos_free_string_list(list); + return (LIBUSB_ERROR_NO_MEM); + } + + r = sunos_exec_command(ctx, UPDATEDRV_PATH, list); + sunos_free_string_list(list); + if (r < 0) + return (LIBUSB_ERROR_OTHER); + + /* reconfigure the driver node */ + r = 0; + r |= sunos_usb_ioctl(dev_handle->dev, DEVCTL_AP_DISCONNECT); + r |= sunos_usb_ioctl(dev_handle->dev, DEVCTL_AP_CONFIGURE); + if (r) + usbi_warn(HANDLE_CTX(dev_handle), "one or more ioctls failed"); + + snprintf(path_arg, sizeof(path_arg), "^usb/%x.%x", dpriv->dev_descr.idVendor, + dpriv->dev_descr.idProduct); + sunos_physpath_to_devlink(dpriv->phypath, path_arg, &dpriv->ugenpath); + + if (access(dpriv->ugenpath, F_OK) == -1) { + usbi_err(HANDLE_CTX(dev_handle), "fail to detach kernel driver"); + return (LIBUSB_ERROR_IO); + } + + return sunos_usb_open_ep0((sunos_dev_handle_priv_t *)dev_handle->os_priv, dpriv); +} + +static int +sunos_attach_kernel_driver(struct libusb_device_handle *dev_handle, + int interface_number) +{ + struct libusb_context *ctx = HANDLE_CTX(dev_handle); + string_list_t *list; + char path_arg[PATH_MAX]; + sunos_dev_priv_t *dpriv; + int r; + + /* we open the dev in detach driver, so we need close it first. */ + sunos_close(dev_handle); + + dpriv = (sunos_dev_priv_t *)dev_handle->dev->os_priv; + snprintf(path_arg, sizeof(path_arg), "\'\"%s\"\'", dpriv->phypath); + usbi_dbg("%s", path_arg); + + list = sunos_new_string_list(); + if (list == NULL) + return (LIBUSB_ERROR_NO_MEM); + + /* detach ugen driver */ + r = 0; + r |= sunos_append_to_string_list(list, UPDATEDRV); + r |= sunos_append_to_string_list(list, "-d"); /* add rule */ + r |= sunos_append_to_string_list(list, "-i"); /* specific device */ + r |= sunos_append_to_string_list(list, path_arg); /* physical path */ + r |= sunos_append_to_string_list(list, "ugen"); + if (r) { + sunos_free_string_list(list); + return (LIBUSB_ERROR_NO_MEM); + } + + r = sunos_exec_command(ctx, UPDATEDRV_PATH, list); + sunos_free_string_list(list); + if (r < 0) + return (LIBUSB_ERROR_OTHER); + + /* reconfigure the driver node */ + r = 0; + r |= sunos_usb_ioctl(dev_handle->dev, DEVCTL_AP_CONFIGURE); + r |= sunos_usb_ioctl(dev_handle->dev, DEVCTL_AP_DISCONNECT); + r |= sunos_usb_ioctl(dev_handle->dev, DEVCTL_AP_CONFIGURE); + if (r) + usbi_warn(HANDLE_CTX(dev_handle), "one or more ioctls failed"); + + return 0; +} + +static int +sunos_fill_in_dev_info(di_node_t node, struct libusb_device *dev) +{ + int proplen; + int n, *addr, *port_prop; + char *phypath; + uint8_t *rdata; + struct libusb_device_descriptor *descr; + sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; + char match_str[PATH_MAX]; + + /* Device descriptors */ + proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node, + "usb-dev-descriptor", &rdata); + if (proplen <= 0) { + + return (LIBUSB_ERROR_IO); + } + + descr = (struct libusb_device_descriptor *)rdata; + bcopy(descr, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE); + dpriv->dev_descr.bcdUSB = libusb_cpu_to_le16(descr->bcdUSB); + dpriv->dev_descr.idVendor = libusb_cpu_to_le16(descr->idVendor); + dpriv->dev_descr.idProduct = libusb_cpu_to_le16(descr->idProduct); + dpriv->dev_descr.bcdDevice = libusb_cpu_to_le16(descr->bcdDevice); + + /* Raw configuration descriptors */ + proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node, + "usb-raw-cfg-descriptors", &rdata); + if (proplen <= 0) { + usbi_dbg("can't find raw config descriptors"); + + return (LIBUSB_ERROR_IO); + } + dpriv->raw_cfgdescr = calloc(1, proplen); + if (dpriv->raw_cfgdescr == NULL) { + return (LIBUSB_ERROR_NO_MEM); + } else { + bcopy(rdata, dpriv->raw_cfgdescr, proplen); + dpriv->cfgvalue = ((struct libusb_config_descriptor *) + rdata)->bConfigurationValue; + } + + n = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "reg", &port_prop); + + if ((n != 1) || (*port_prop <= 0)) { + return (LIBUSB_ERROR_IO); + } + dev->port_number = *port_prop; + + /* device physical path */ + phypath = di_devfs_path(node); + if (phypath) { + dpriv->phypath = strdup(phypath); + snprintf(match_str, sizeof(match_str), "^usb/%x.%x", dpriv->dev_descr.idVendor, dpriv->dev_descr.idProduct); + usbi_dbg("match is %s", match_str); + sunos_physpath_to_devlink(dpriv->phypath, match_str, &dpriv->ugenpath); + di_devfs_path_free(phypath); + + } else { + free(dpriv->raw_cfgdescr); + + return (LIBUSB_ERROR_IO); + } + + /* address */ + n = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "assigned-address", &addr); + if (n != 1 || *addr == 0) { + usbi_dbg("can't get address"); + } else { + dev->device_address = *addr; + } + + /* speed */ + if (di_prop_exists(DDI_DEV_T_ANY, node, "low-speed") == 1) { + dev->speed = LIBUSB_SPEED_LOW; + } else if (di_prop_exists(DDI_DEV_T_ANY, node, "high-speed") == 1) { + dev->speed = LIBUSB_SPEED_HIGH; + } else if (di_prop_exists(DDI_DEV_T_ANY, node, "full-speed") == 1) { + dev->speed = LIBUSB_SPEED_FULL; + } else if (di_prop_exists(DDI_DEV_T_ANY, node, "super-speed") == 1) { + dev->speed = LIBUSB_SPEED_SUPER; + } + + usbi_dbg("vid=%x pid=%x, path=%s, bus_nmber=0x%x, port_number=%d, " + "speed=%d", dpriv->dev_descr.idVendor, dpriv->dev_descr.idProduct, + dpriv->phypath, dev->bus_number, dev->port_number, dev->speed); + + return (LIBUSB_SUCCESS); +} + +static int +sunos_add_devices(di_devlink_t link, void *arg) +{ + struct devlink_cbarg *largs = (struct devlink_cbarg *)arg; + struct node_args *nargs; + di_node_t myself, dn; + uint64_t session_id = 0; + uint64_t sid = 0; + uint64_t bdf = 0; + struct libusb_device *dev; + sunos_dev_priv_t *devpriv; + int n; + int i = 0; + int *addr_prop; + uint8_t bus_number = 0; + uint32_t * regbuf = NULL; + uint32_t reg; + + nargs = (struct node_args *)largs->nargs; + myself = largs->myself; + + /* + * Construct session ID. + * session ID = dev_addr | hub addr |parent hub addr|...|root hub bdf + * 8 bits 8bits 8 bits 16bits + */ + if (myself == DI_NODE_NIL) + return (DI_WALK_CONTINUE); + + dn = myself; + /* find the root hub */ + while (di_prop_exists(DDI_DEV_T_ANY, dn, "root-hub") != 1) { + usbi_dbg("find_root_hub:%s", di_devfs_path(dn)); + n = di_prop_lookup_ints(DDI_DEV_T_ANY, dn, + "assigned-address", &addr_prop); + session_id |= ((addr_prop[0] & 0xff) << i++ * 8); + dn = di_parent_node(dn); + } + + /* dn is the root hub node */ + n = di_prop_lookup_ints(DDI_DEV_T_ANY, dn, "reg", (int **)®buf); + reg = regbuf[0]; + bdf = (PCI_REG_BUS_G(reg) << 8) | (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg); + /* bdf must larger than i*8 bits */ + session_id |= (bdf << i * 8); + bus_number = (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg); + + usbi_dbg("device bus address=%s:%x, name:%s", + di_bus_addr(myself), bus_number, di_node_name(dn)); + usbi_dbg("session id org:%lx", session_id); + + /* dn is the usb device */ + for (dn = di_child_node(myself); dn != DI_NODE_NIL; dn = di_sibling_node(dn)) { + usbi_dbg("device path:%s", di_devfs_path(dn)); + /* skip hub devices, because its driver can not been unload */ + if (di_prop_lookup_ints(DDI_DEV_T_ANY, dn, "usb-port-count", &addr_prop) != -1) + continue; + /* usb_addr */ + n = di_prop_lookup_ints(DDI_DEV_T_ANY, dn, + "assigned-address", &addr_prop); + if ((n != 1) || (addr_prop[0] == 0)) { + usbi_dbg("cannot get valid usb_addr"); + continue; + } + + sid = (session_id << 8) | (addr_prop[0] & 0xff) ; + usbi_dbg("session id %lx", sid); + + dev = usbi_get_device_by_session_id(nargs->ctx, sid); + if (dev == NULL) { + dev = usbi_alloc_device(nargs->ctx, sid); + if (dev == NULL) { + usbi_dbg("can't alloc device"); + continue; + } + devpriv = (sunos_dev_priv_t *)dev->os_priv; + dev->bus_number = bus_number; + + if (sunos_fill_in_dev_info(dn, dev) != LIBUSB_SUCCESS) { + libusb_unref_device(dev); + usbi_dbg("get infomation fail"); + continue; + } + if (usbi_sanitize_device(dev) < 0) { + libusb_unref_device(dev); + usbi_dbg("sanatize failed: "); + return (DI_WALK_TERMINATE); + } + } else { + devpriv = (sunos_dev_priv_t *)dev->os_priv; + usbi_dbg("Dev %s exists", devpriv->ugenpath); + } + + if (discovered_devs_append(*(nargs->discdevs), dev) == NULL) { + usbi_dbg("cannot append device"); + } + + /* + * we alloc and hence ref this dev. We don't need to ref it + * hereafter. Front end or app should take care of their ref. + */ + libusb_unref_device(dev); + + usbi_dbg("Device %s %s id=0x%llx, devcount:%d, bdf=%x", + devpriv->ugenpath, di_devfs_path(dn), (uint64_t)sid, + (*nargs->discdevs)->len, bdf); + } + + return (DI_WALK_CONTINUE); +} + +static int +sunos_walk_minor_node_link(di_node_t node, void *args) +{ + di_minor_t minor = DI_MINOR_NIL; + char *minor_path; + struct devlink_cbarg arg; + struct node_args *nargs = (struct node_args *)args; + di_devlink_handle_t devlink_hdl = nargs->dlink_hdl; + + /* walk each minor to find usb devices */ + while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) { + minor_path = di_devfs_minor_path(minor); + arg.nargs = args; + arg.myself = node; + arg.minor = minor; + (void) di_devlink_walk(devlink_hdl, + "^usb/hub[0-9]+", minor_path, + DI_PRIMARY_LINK, (void *)&arg, sunos_add_devices); + di_devfs_path_free(minor_path); + } + + /* switch to a different node */ + nargs->last_ugenpath = NULL; + + return (DI_WALK_CONTINUE); +} + +int +sunos_get_device_list(struct libusb_context * ctx, + struct discovered_devs **discdevs) +{ + di_node_t root_node; + struct node_args args; + di_devlink_handle_t devlink_hdl; + + args.ctx = ctx; + args.discdevs = discdevs; + args.last_ugenpath = NULL; + if ((root_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) { + usbi_dbg("di_int() failed: %s", strerror(errno)); + return (LIBUSB_ERROR_IO); + } + + if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) { + di_fini(root_node); + usbi_dbg("di_devlink_init() failed: %s", strerror(errno)); + + return (LIBUSB_ERROR_IO); + } + args.dlink_hdl = devlink_hdl; + + /* walk each node to find USB devices */ + if (di_walk_node(root_node, DI_WALK_SIBFIRST, &args, + sunos_walk_minor_node_link) == -1) { + usbi_dbg("di_walk_node() failed: %s", strerror(errno)); + di_fini(root_node); + + return (LIBUSB_ERROR_IO); + } + + di_fini(root_node); + di_devlink_fini(&devlink_hdl); + + usbi_dbg("%d devices", (*discdevs)->len); + + return ((*discdevs)->len); +} + +static int +sunos_usb_open_ep0(sunos_dev_handle_priv_t *hpriv, sunos_dev_priv_t *dpriv) +{ + char filename[PATH_MAX + 1]; + + if (hpriv->eps[0].datafd > 0) { + + return (LIBUSB_SUCCESS); + } + snprintf(filename, PATH_MAX, "%s/cntrl0", dpriv->ugenpath); + + usbi_dbg("opening %s", filename); + hpriv->eps[0].datafd = open(filename, O_RDWR); + if (hpriv->eps[0].datafd < 0) { + return(_errno_to_libusb(errno)); + } + + snprintf(filename, PATH_MAX, "%s/cntrl0stat", dpriv->ugenpath); + hpriv->eps[0].statfd = open(filename, O_RDONLY); + if (hpriv->eps[0].statfd < 0) { + close(hpriv->eps[0].datafd); + hpriv->eps[0].datafd = -1; + + return(_errno_to_libusb(errno)); + } + + return (LIBUSB_SUCCESS); +} + +static void +sunos_usb_close_all_eps(sunos_dev_handle_priv_t *hdev) +{ + int i; + + /* not close ep0 */ + for (i = 1; i < USB_MAXENDPOINTS; i++) { + if (hdev->eps[i].datafd != -1) { + (void) close(hdev->eps[i].datafd); + hdev->eps[i].datafd = -1; + } + if (hdev->eps[i].statfd != -1) { + (void) close(hdev->eps[i].statfd); + hdev->eps[i].statfd = -1; + } + } +} + +static void +sunos_usb_close_ep0(sunos_dev_handle_priv_t *hdev, sunos_dev_priv_t *dpriv) +{ + if (hdev->eps[0].datafd >= 0) { + close(hdev->eps[0].datafd); + close(hdev->eps[0].statfd); + hdev->eps[0].datafd = -1; + hdev->eps[0].statfd = -1; + } +} + +static uchar_t +sunos_usb_ep_index(uint8_t ep_addr) +{ + return ((ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK) + + ((ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? 16 : 0)); +} + +static int +sunos_find_interface(struct libusb_device_handle *hdev, + uint8_t endpoint, uint8_t *interface) +{ + struct libusb_config_descriptor *config; + int r; + int iface_idx; + + r = libusb_get_active_config_descriptor(hdev->dev, &config); + if (r < 0) { + return (LIBUSB_ERROR_INVALID_PARAM); + } + + for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) { + const struct libusb_interface *iface = + &config->interface[iface_idx]; + int altsetting_idx; + + for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting; + altsetting_idx++) { + const struct libusb_interface_descriptor *altsetting = + &iface->altsetting[altsetting_idx]; + int ep_idx; + + for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; + ep_idx++) { + const struct libusb_endpoint_descriptor *ep = + &altsetting->endpoint[ep_idx]; + if (ep->bEndpointAddress == endpoint) { + *interface = iface_idx; + libusb_free_config_descriptor(config); + + return (LIBUSB_SUCCESS); + } + } + } + } + libusb_free_config_descriptor(config); + + return (LIBUSB_ERROR_INVALID_PARAM); +} + +static int +sunos_check_device_and_status_open(struct libusb_device_handle *hdl, + uint8_t ep_addr, int ep_type) +{ + char filename[PATH_MAX + 1], statfilename[PATH_MAX + 1]; + char cfg_num[16], alt_num[16]; + int fd, fdstat, mode; + uint8_t ifc = 0; + uint8_t ep_index; + sunos_dev_handle_priv_t *hpriv; + + usbi_dbg("open ep 0x%02x", ep_addr); + hpriv = (sunos_dev_handle_priv_t *)hdl->os_priv; + ep_index = sunos_usb_ep_index(ep_addr); + /* ep already opened */ + if ((hpriv->eps[ep_index].datafd > 0) && + (hpriv->eps[ep_index].statfd > 0)) { + usbi_dbg("ep 0x%02x already opened, return success", + ep_addr); + + return (0); + } + + if (sunos_find_interface(hdl, ep_addr, &ifc) < 0) { + usbi_dbg("can't find interface for endpoint 0x%02x", + ep_addr); + + return (EACCES); + } + + /* create filename */ + if (hpriv->config_index > 0) { + (void) snprintf(cfg_num, sizeof (cfg_num), "cfg%d", + hpriv->config_index + 1); + } else { + bzero(cfg_num, sizeof (cfg_num)); + } + + if (hpriv->altsetting[ifc] > 0) { + (void) snprintf(alt_num, sizeof (alt_num), ".%d", + hpriv->altsetting[ifc]); + } else { + bzero(alt_num, sizeof (alt_num)); + } + + (void) snprintf(filename, PATH_MAX, "%s/%sif%d%s%s%d", + hpriv->dpriv->ugenpath, cfg_num, ifc, alt_num, + (ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? "in" : + "out", (ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK)); + (void) snprintf(statfilename, PATH_MAX, "%sstat", filename); + + /* + * for interrupt IN endpoints, we need to enable one xfer + * mode before opening the endpoint + */ + if ((ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) && + (ep_addr & LIBUSB_ENDPOINT_IN)) { + char control = USB_EP_INTR_ONE_XFER; + int count; + + /* open the status device node for the ep first RDWR */ + if ((fdstat = open(statfilename, O_RDWR)) == -1) { + usbi_dbg("can't open %s RDWR: %d", + statfilename, errno); + } else { + count = write(fdstat, &control, sizeof (control)); + if (count != 1) { + /* this should have worked */ + usbi_dbg("can't write to %s: %d", + statfilename, errno); + (void) close(fdstat); + + return (errno); + } + /* close status node and open xfer node first */ + close (fdstat); + } + } + + /* open the xfer node first in case alt needs to be changed */ + if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { + mode = O_RDWR; + } else if (ep_addr & LIBUSB_ENDPOINT_IN) { + mode = O_RDONLY; + } else { + mode = O_WRONLY; + } + + /* + * IMPORTANT: must open data xfer node first and then open stat node + * Otherwise, it will fail on multi-config or multi-altsetting devices + * with "Device Busy" error. See ugen_epxs_switch_cfg_alt() and + * ugen_epxs_check_alt_switch() in ugen driver source code. + */ + if ((fd = open(filename, mode)) == -1) { + usbi_dbg("can't open %s: %d(%s)", filename, errno, + strerror(errno)); + + return (errno); + } + /* open the status node */ + if ((fdstat = open(statfilename, O_RDONLY)) == -1) { + usbi_dbg("can't open %s: %d", statfilename, errno); + + (void) close(fd); + + return (errno); + } + + hpriv->eps[ep_index].datafd = fd; + hpriv->eps[ep_index].statfd = fdstat; + usbi_dbg("ep=0x%02x datafd=%d, statfd=%d", ep_addr, fd, fdstat); + + return (0); +} + +int +sunos_open(struct libusb_device_handle *handle) +{ + sunos_dev_handle_priv_t *hpriv; + sunos_dev_priv_t *dpriv; + int i; + int ret; + + hpriv = (sunos_dev_handle_priv_t *)handle->os_priv; + dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; + hpriv->dpriv = dpriv; + + /* set all file descriptors to "closed" */ + for (i = 0; i < USB_MAXENDPOINTS; i++) { + hpriv->eps[i].datafd = -1; + hpriv->eps[i].statfd = -1; + } + + if (sunos_kernel_driver_active(handle, 0)) { + /* pretend we can open the device */ + return (LIBUSB_SUCCESS); + } + + if ((ret = sunos_usb_open_ep0(hpriv, dpriv)) != LIBUSB_SUCCESS) { + usbi_dbg("fail: %d", ret); + return (ret); + } + + return (LIBUSB_SUCCESS); +} + +void +sunos_close(struct libusb_device_handle *handle) +{ + sunos_dev_handle_priv_t *hpriv; + sunos_dev_priv_t *dpriv; + + usbi_dbg(""); + if (!handle) { + return; + } + + hpriv = (sunos_dev_handle_priv_t *)handle->os_priv; + if (!hpriv) { + return; + } + dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; + if (!dpriv) { + return; + } + + sunos_usb_close_all_eps(hpriv); + sunos_usb_close_ep0(hpriv, dpriv); +} + +int +sunos_get_device_descriptor(struct libusb_device *dev, uint8_t *buf, + int *host_endian) +{ + sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; + + memcpy(buf, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE); + *host_endian = 0; + + return (LIBUSB_SUCCESS); +} + +int +sunos_get_active_config_descriptor(struct libusb_device *dev, + uint8_t *buf, size_t len, int *host_endian) +{ + sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; + struct libusb_config_descriptor *cfg; + int proplen; + di_node_t node; + uint8_t *rdata; + + /* + * Keep raw configuration descriptors updated, in case config + * has ever been changed through setCfg. + */ + if ((node = di_init(dpriv->phypath, DINFOCPYALL)) == DI_NODE_NIL) { + usbi_dbg("di_int() failed: %s", strerror(errno)); + return (LIBUSB_ERROR_IO); + } + proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node, + "usb-raw-cfg-descriptors", &rdata); + if (proplen <= 0) { + usbi_dbg("can't find raw config descriptors"); + + return (LIBUSB_ERROR_IO); + } + dpriv->raw_cfgdescr = realloc(dpriv->raw_cfgdescr, proplen); + if (dpriv->raw_cfgdescr == NULL) { + return (LIBUSB_ERROR_NO_MEM); + } else { + bcopy(rdata, dpriv->raw_cfgdescr, proplen); + dpriv->cfgvalue = ((struct libusb_config_descriptor *) + rdata)->bConfigurationValue; + } + di_fini(node); + + cfg = (struct libusb_config_descriptor *)dpriv->raw_cfgdescr; + len = MIN(len, libusb_le16_to_cpu(cfg->wTotalLength)); + memcpy(buf, dpriv->raw_cfgdescr, len); + *host_endian = 0; + usbi_dbg("path:%s len %d", dpriv->phypath, len); + + return (len); +} + +int +sunos_get_config_descriptor(struct libusb_device *dev, uint8_t idx, + uint8_t *buf, size_t len, int *host_endian) +{ + /* XXX */ + return(sunos_get_active_config_descriptor(dev, buf, len, host_endian)); +} + +int +sunos_get_configuration(struct libusb_device_handle *handle, int *config) +{ + sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; + + *config = dpriv->cfgvalue; + + usbi_dbg("bConfigurationValue %d", *config); + + return (LIBUSB_SUCCESS); +} + +int +sunos_set_configuration(struct libusb_device_handle *handle, int config) +{ + sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; + sunos_dev_handle_priv_t *hpriv; + + usbi_dbg("bConfigurationValue %d", config); + hpriv = (sunos_dev_handle_priv_t *)handle->os_priv; + + if (dpriv->ugenpath == NULL) + return (LIBUSB_ERROR_NOT_SUPPORTED); + + if (config < 1 || config > dpriv->dev_descr.bNumConfigurations) + return (LIBUSB_ERROR_INVALID_PARAM); + + dpriv->cfgvalue = config; + hpriv->config_index = config - 1; + + return (LIBUSB_SUCCESS); +} + +int +sunos_claim_interface(struct libusb_device_handle *handle, int iface) +{ + usbi_dbg("iface %d", iface); + if (iface < 0) { + return (LIBUSB_ERROR_INVALID_PARAM); + } + + return (LIBUSB_SUCCESS); +} + +int +sunos_release_interface(struct libusb_device_handle *handle, int iface) +{ + sunos_dev_handle_priv_t *hpriv = + (sunos_dev_handle_priv_t *)handle->os_priv; + + usbi_dbg("iface %d", iface); + if (iface < 0) { + return (LIBUSB_ERROR_INVALID_PARAM); + } + + /* XXX: can we release it? */ + hpriv->altsetting[iface] = 0; + + return (LIBUSB_SUCCESS); +} + +int +sunos_set_interface_altsetting(struct libusb_device_handle *handle, int iface, + int altsetting) +{ + sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; + sunos_dev_handle_priv_t *hpriv = + (sunos_dev_handle_priv_t *)handle->os_priv; + + usbi_dbg("iface %d, setting %d", iface, altsetting); + + if (iface < 0 || altsetting < 0) { + return (LIBUSB_ERROR_INVALID_PARAM); + } + if (dpriv->ugenpath == NULL) + return (LIBUSB_ERROR_NOT_FOUND); + + /* XXX: can we switch altsetting? */ + hpriv->altsetting[iface] = altsetting; + + return (LIBUSB_SUCCESS); +} + +static void +usb_dump_data(unsigned char *data, size_t size) +{ + int i; + + if (getenv("LIBUSB_DEBUG") == NULL) { + return; + } + + (void) fprintf(stderr, "data dump:"); + for (i = 0; i < size; i++) { + if (i % 16 == 0) { + (void) fprintf(stderr, "\n%08x ", i); + } + (void) fprintf(stderr, "%02x ", (uchar_t)data[i]); + } + (void) fprintf(stderr, "\n"); +} + +static void +sunos_async_callback(union sigval arg) +{ + struct sunos_transfer_priv *tpriv = + (struct sunos_transfer_priv *)arg.sival_ptr; + struct libusb_transfer *xfer = tpriv->transfer; + struct aiocb *aiocb = &tpriv->aiocb; + int ret; + sunos_dev_handle_priv_t *hpriv; + uint8_t ep; + + hpriv = (sunos_dev_handle_priv_t *)xfer->dev_handle->os_priv; + ep = sunos_usb_ep_index(xfer->endpoint); + + ret = aio_error(aiocb); + if (ret != 0) { + xfer->status = sunos_usb_get_status(hpriv->eps[ep].statfd); + } else { + xfer->actual_length = + LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)->transferred = + aio_return(aiocb); + } + + usb_dump_data(xfer->buffer, xfer->actual_length); + + usbi_dbg("ret=%d, len=%d, actual_len=%d", ret, xfer->length, + xfer->actual_length); + + /* async notification */ + usbi_signal_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)); +} + +static int +sunos_do_async_io(struct libusb_transfer *transfer) +{ + int ret = -1; + struct aiocb *aiocb; + sunos_dev_handle_priv_t *hpriv; + uint8_t ep; + struct sunos_transfer_priv *tpriv; + + usbi_dbg(""); + + tpriv = usbi_transfer_get_os_priv(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer)); + hpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv; + ep = sunos_usb_ep_index(transfer->endpoint); + + tpriv->transfer = transfer; + aiocb = &tpriv->aiocb; + bzero(aiocb, sizeof (*aiocb)); + aiocb->aio_fildes = hpriv->eps[ep].datafd; + aiocb->aio_buf = transfer->buffer; + aiocb->aio_nbytes = transfer->length; + aiocb->aio_lio_opcode = + ((transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) == + LIBUSB_ENDPOINT_IN) ? LIO_READ:LIO_WRITE; + aiocb->aio_sigevent.sigev_notify = SIGEV_THREAD; + aiocb->aio_sigevent.sigev_value.sival_ptr = tpriv; + aiocb->aio_sigevent.sigev_notify_function = sunos_async_callback; + + if (aiocb->aio_lio_opcode == LIO_READ) { + ret = aio_read(aiocb); + } else { + ret = aio_write(aiocb); + } + + return (ret); +} + +/* return the number of bytes read/written */ +static int +usb_do_io(int fd, int stat_fd, char *data, size_t size, int flag, int *status) +{ + int error; + int ret = -1; + + usbi_dbg("usb_do_io(): datafd=%d statfd=%d size=0x%x flag=%s", + fd, stat_fd, size, flag? "WRITE":"READ"); + + switch (flag) { + case READ: + errno = 0; + ret = read(fd, data, size); + usb_dump_data(data, size); + break; + case WRITE: + usb_dump_data(data, size); + errno = 0; + ret = write(fd, data, size); + break; + } + + usbi_dbg("usb_do_io(): amount=%d", ret); + + if (ret < 0) { + int save_errno = errno; + + usbi_dbg("TID=%x io %s errno=%d(%s) ret=%d", pthread_self(), + flag?"WRITE":"READ", errno, strerror(errno), ret); + + /* sunos_usb_get_status will do a read and overwrite errno */ + error = sunos_usb_get_status(stat_fd); + usbi_dbg("io status=%d errno=%d(%s)", error, + save_errno, strerror(save_errno)); + + if (status) { + *status = save_errno; + } + + return (save_errno); + + } else if (status) { + *status = 0; + } + + return (ret); +} + +static int +solaris_submit_ctrl_on_default(struct libusb_transfer *transfer) +{ + int ret = -1, setup_ret; + int status; + sunos_dev_handle_priv_t *hpriv; + struct libusb_device_handle *hdl = transfer->dev_handle; + uint16_t wLength; + uint8_t *data = transfer->buffer; + + hpriv = (sunos_dev_handle_priv_t *)hdl->os_priv; + wLength = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; + + if (hpriv->eps[0].datafd == -1) { + usbi_dbg("ep0 not opened"); + + return (LIBUSB_ERROR_NOT_FOUND); + } + + if ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) { + usbi_dbg("IN request"); + ret = usb_do_io(hpriv->eps[0].datafd, + hpriv->eps[0].statfd, (char *)data, LIBUSB_CONTROL_SETUP_SIZE, + WRITE, (int *)&status); + } else { + usbi_dbg("OUT request"); + ret = usb_do_io(hpriv->eps[0].datafd, hpriv->eps[0].statfd, + transfer->buffer, transfer->length, WRITE, + (int *)&transfer->status); + } + + setup_ret = ret; + if (ret < LIBUSB_CONTROL_SETUP_SIZE) { + usbi_dbg("error sending control msg: %d", ret); + + return (LIBUSB_ERROR_IO); + } + + ret = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; + + /* Read the remaining bytes for IN request */ + if ((wLength) && ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) == + LIBUSB_ENDPOINT_IN)) { + usbi_dbg("DATA: %d", transfer->length - setup_ret); + ret = usb_do_io(hpriv->eps[0].datafd, + hpriv->eps[0].statfd, + (char *)transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, + wLength, READ, (int *)&transfer->status); + } + + if (ret >= 0) { + transfer->actual_length = ret; + LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer)->transferred = ret; + } + usbi_dbg("Done: ctrl data bytes %d", ret); + + /* sync transfer handling */ + ret = usbi_handle_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer), + transfer->status); + + return (ret); +} + +int +sunos_clear_halt(struct libusb_device_handle *handle, uint8_t endpoint) +{ + int ret; + + usbi_dbg("endpoint=0x%02x", endpoint); + + ret = libusb_control_transfer(handle, LIBUSB_ENDPOINT_OUT | + LIBUSB_RECIPIENT_ENDPOINT | LIBUSB_REQUEST_TYPE_STANDARD, + LIBUSB_REQUEST_CLEAR_FEATURE, 0, endpoint, NULL, 0, 1000); + + usbi_dbg("ret=%d", ret); + + return (ret); +} + +int +sunos_reset_device(struct libusb_device_handle *handle) +{ + usbi_dbg(""); + + return (LIBUSB_ERROR_NOT_SUPPORTED); +} + +void +sunos_destroy_device(struct libusb_device *dev) +{ + sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; + usbi_dbg("destroy everyting"); + free(dpriv->raw_cfgdescr); + free(dpriv->ugenpath); + free(dpriv->phypath); +} + +int +sunos_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer; + struct libusb_device_handle *hdl; + int err = 0; + + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + hdl = transfer->dev_handle; + + err = sunos_check_device_and_status_open(hdl, + transfer->endpoint, transfer->type); + if (err < 0) { + + return (_errno_to_libusb(err)); + } + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + /* sync transfer */ + usbi_dbg("CTRL transfer: %d", transfer->length); + err = solaris_submit_ctrl_on_default(transfer); + break; + + case LIBUSB_TRANSFER_TYPE_BULK: + /* fallthru */ + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (transfer->type == LIBUSB_TRANSFER_TYPE_BULK) + usbi_dbg("BULK transfer: %d", transfer->length); + else + usbi_dbg("INTR transfer: %d", transfer->length); + err = sunos_do_async_io(transfer); + break; + + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + /* Isochronous/Stream is not supported */ + + /* fallthru */ + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) + usbi_dbg("ISOC transfer: %d", transfer->length); + else + usbi_dbg("BULK STREAM transfer: %d", transfer->length); + err = LIBUSB_ERROR_NOT_SUPPORTED; + break; + } + + return (err); +} + +int +sunos_cancel_transfer(struct usbi_transfer *itransfer) +{ + sunos_xfer_priv_t *tpriv; + sunos_dev_handle_priv_t *hpriv; + struct libusb_transfer *transfer; + struct aiocb *aiocb; + uint8_t ep; + int ret; + + tpriv = usbi_transfer_get_os_priv(itransfer); + aiocb = &tpriv->aiocb; + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + hpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv; + ep = sunos_usb_ep_index(transfer->endpoint); + + ret = aio_cancel(hpriv->eps[ep].datafd, aiocb); + + usbi_dbg("aio->fd=%d fd=%d ret = %d, %s", aiocb->aio_fildes, + hpriv->eps[ep].datafd, ret, (ret == AIO_CANCELED)? + strerror(0):strerror(errno)); + + if (ret != AIO_CANCELED) { + ret = _errno_to_libusb(errno); + } else { + /* + * we don't need to call usbi_handle_transfer_cancellation(), + * because we'll handle everything in sunos_async_callback. + */ + ret = LIBUSB_SUCCESS; + } + + return (ret); +} + +void +sunos_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + usbi_dbg(""); + + /* Nothing to do */ +} + +int +sunos_handle_transfer_completion(struct usbi_transfer *itransfer) +{ + return usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED); +} + +int +sunos_clock_gettime(int clkid, struct timespec *tp) +{ + usbi_dbg("clock %d", clkid); + + if (clkid == USBI_CLOCK_REALTIME) + return clock_gettime(CLOCK_REALTIME, tp); + + if (clkid == USBI_CLOCK_MONOTONIC) + return clock_gettime(CLOCK_MONOTONIC, tp); + + return (LIBUSB_ERROR_INVALID_PARAM); +} + +int +_errno_to_libusb(int err) +{ + usbi_dbg("error: %s (%d)", strerror(err), err); + + switch (err) { + case EIO: + return (LIBUSB_ERROR_IO); + case EACCES: + return (LIBUSB_ERROR_ACCESS); + case ENOENT: + return (LIBUSB_ERROR_NO_DEVICE); + case ENOMEM: + return (LIBUSB_ERROR_NO_MEM); + case ETIMEDOUT: + return (LIBUSB_ERROR_TIMEOUT); + } + + return (LIBUSB_ERROR_OTHER); +} + +/* + * sunos_usb_get_status: + * gets status of endpoint + * + * Returns: ugen's last cmd status + */ +static int +sunos_usb_get_status(int fd) +{ + int status, ret; + + usbi_dbg("sunos_usb_get_status(): fd=%d", fd); + + ret = read(fd, &status, sizeof (status)); + if (ret == sizeof (status)) { + switch (status) { + case USB_LC_STAT_NOERROR: + usbi_dbg("No Error"); + break; + case USB_LC_STAT_CRC: + usbi_dbg("CRC Timeout Detected\n"); + break; + case USB_LC_STAT_BITSTUFFING: + usbi_dbg("Bit Stuffing Violation\n"); + break; + case USB_LC_STAT_DATA_TOGGLE_MM: + usbi_dbg("Data Toggle Mismatch\n"); + break; + case USB_LC_STAT_STALL: + usbi_dbg("End Point Stalled\n"); + break; + case USB_LC_STAT_DEV_NOT_RESP: + usbi_dbg("Device is Not Responding\n"); + break; + case USB_LC_STAT_PID_CHECKFAILURE: + usbi_dbg("PID Check Failure\n"); + break; + case USB_LC_STAT_UNEXP_PID: + usbi_dbg("Unexpected PID\n"); + break; + case USB_LC_STAT_DATA_OVERRUN: + usbi_dbg("Data Exceeded Size\n"); + break; + case USB_LC_STAT_DATA_UNDERRUN: + usbi_dbg("Less data received\n"); + break; + case USB_LC_STAT_BUFFER_OVERRUN: + usbi_dbg("Buffer Size Exceeded\n"); + break; + case USB_LC_STAT_BUFFER_UNDERRUN: + usbi_dbg("Buffer Underrun\n"); + break; + case USB_LC_STAT_TIMEOUT: + usbi_dbg("Command Timed Out\n"); + break; + case USB_LC_STAT_NOT_ACCESSED: + usbi_dbg("Not Accessed by h/w\n"); + break; + case USB_LC_STAT_UNSPECIFIED_ERR: + usbi_dbg("Unspecified Error\n"); + break; + case USB_LC_STAT_NO_BANDWIDTH: + usbi_dbg("No Bandwidth\n"); + break; + case USB_LC_STAT_HW_ERR: + usbi_dbg("Host Controller h/w Error\n"); + break; + case USB_LC_STAT_SUSPENDED: + usbi_dbg("Device was Suspended\n"); + break; + case USB_LC_STAT_DISCONNECTED: + usbi_dbg("Device was Disconnected\n"); + break; + case USB_LC_STAT_INTR_BUF_FULL: + usbi_dbg("Interrupt buffer was full\n"); + break; + case USB_LC_STAT_INVALID_REQ: + usbi_dbg("Request was Invalid\n"); + break; + case USB_LC_STAT_INTERRUPTED: + usbi_dbg("Request was Interrupted\n"); + break; + case USB_LC_STAT_NO_RESOURCES: + usbi_dbg("No resources available for " + "request\n"); + break; + case USB_LC_STAT_INTR_POLLING_FAILED: + usbi_dbg("Failed to Restart Poll"); + break; + default: + usbi_dbg("Error Not Determined %d\n", + status); + break; + } + } else { + usbi_dbg("read stat error: %s",strerror(errno)); + status = -1; + } + + return (status); +} + +const struct usbi_os_backend usbi_backend = { + .name = "Solaris", + .caps = 0, + .init = sunos_init, + .exit = sunos_exit, + .get_device_list = sunos_get_device_list, + .get_device_descriptor = sunos_get_device_descriptor, + .get_active_config_descriptor = sunos_get_active_config_descriptor, + .get_config_descriptor = sunos_get_config_descriptor, + .hotplug_poll = NULL, + .open = sunos_open, + .close = sunos_close, + .get_configuration = sunos_get_configuration, + .set_configuration = sunos_set_configuration, + + .claim_interface = sunos_claim_interface, + .release_interface = sunos_release_interface, + .set_interface_altsetting = sunos_set_interface_altsetting, + .clear_halt = sunos_clear_halt, + .reset_device = sunos_reset_device, /* TODO */ + .alloc_streams = NULL, + .free_streams = NULL, + .kernel_driver_active = sunos_kernel_driver_active, + .detach_kernel_driver = sunos_detach_kernel_driver, + .attach_kernel_driver = sunos_attach_kernel_driver, + .destroy_device = sunos_destroy_device, + .submit_transfer = sunos_submit_transfer, + .cancel_transfer = sunos_cancel_transfer, + .handle_events = NULL, + .clear_transfer_priv = sunos_clear_transfer_priv, + .handle_transfer_completion = sunos_handle_transfer_completion, + .clock_gettime = sunos_clock_gettime, + .device_priv_size = sizeof(sunos_dev_priv_t), + .device_handle_priv_size = sizeof(sunos_dev_handle_priv_t), + .transfer_priv_size = sizeof(sunos_xfer_priv_t), +}; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/sunos_usb.h similarity index 96% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.h rename to vendor/github.com/karalabe/usb/libusb/libusb/os/sunos_usb.h index 574166031994..52bb3d33a0a8 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.h +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/sunos_usb.h @@ -65,6 +65,12 @@ struct devlink_cbarg { di_minor_t minor; }; +typedef struct walk_link { + char *path; + int len; + char **linkpp; +} walk_link_t; + /* AIO callback args */ struct aio_callback_args{ struct libusb_transfer *transfer; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_posix.c similarity index 92% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.c rename to vendor/github.com/karalabe/usb/libusb/libusb/os/threads_posix.c index a4f270bbe5bd..16a7578b81ff 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_posix.c @@ -29,7 +29,7 @@ # include # include #elif defined(__APPLE__) -# include +# include #elif defined(__CYGWIN__) # include #endif @@ -43,7 +43,7 @@ int usbi_cond_timedwait(pthread_cond_t *cond, struct timespec timeout; int r; - r = usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &timeout); + r = usbi_backend.clock_gettime(USBI_CLOCK_REALTIME, &timeout); if (r < 0) return r; @@ -59,7 +59,7 @@ int usbi_cond_timedwait(pthread_cond_t *cond, int usbi_get_tid(void) { - int ret = -1; + int ret; #if defined(__ANDROID__) ret = gettid(); #elif defined(__linux__) @@ -69,10 +69,11 @@ int usbi_get_tid(void) real thread support. For 5.1 and earlier, -1 is returned. */ ret = syscall(SYS_getthrid); #elif defined(__APPLE__) - ret = mach_thread_self(); - mach_port_deallocate(mach_task_self(), ret); + ret = (int)pthread_mach_thread_np(pthread_self()); #elif defined(__CYGWIN__) ret = GetCurrentThreadId(); +#else + ret = -1; #endif /* TODO: NetBSD thread ID support */ return ret; diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_posix.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_posix.h new file mode 100644 index 000000000000..9f1ef94bc7a8 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_posix.h @@ -0,0 +1,102 @@ +/* + * libusb synchronization using POSIX Threads + * + * Copyright © 2010 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_THREADS_POSIX_H +#define LIBUSB_THREADS_POSIX_H + +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#define USBI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +typedef pthread_mutex_t usbi_mutex_static_t; +static inline void usbi_mutex_static_lock(usbi_mutex_static_t *mutex) +{ + (void)pthread_mutex_lock(mutex); +} +static inline void usbi_mutex_static_unlock(usbi_mutex_static_t *mutex) +{ + (void)pthread_mutex_unlock(mutex); +} + +typedef pthread_mutex_t usbi_mutex_t; +static inline int usbi_mutex_init(usbi_mutex_t *mutex) +{ + return pthread_mutex_init(mutex, NULL); +} +static inline void usbi_mutex_lock(usbi_mutex_t *mutex) +{ + (void)pthread_mutex_lock(mutex); +} +static inline void usbi_mutex_unlock(usbi_mutex_t *mutex) +{ + (void)pthread_mutex_unlock(mutex); +} +static inline int usbi_mutex_trylock(usbi_mutex_t *mutex) +{ + return pthread_mutex_trylock(mutex); +} +static inline void usbi_mutex_destroy(usbi_mutex_t *mutex) +{ + (void)pthread_mutex_destroy(mutex); +} + +typedef pthread_cond_t usbi_cond_t; +static inline void usbi_cond_init(pthread_cond_t *cond) +{ + (void)pthread_cond_init(cond, NULL); +} +static inline int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex) +{ + return pthread_cond_wait(cond, mutex); +} +int usbi_cond_timedwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, const struct timeval *tv); +static inline void usbi_cond_broadcast(usbi_cond_t *cond) +{ + (void)pthread_cond_broadcast(cond); +} +static inline void usbi_cond_destroy(usbi_cond_t *cond) +{ + (void)pthread_cond_destroy(cond); +} + +typedef pthread_key_t usbi_tls_key_t; +static inline void usbi_tls_key_create(usbi_tls_key_t *key) +{ + (void)pthread_key_create(key, NULL); +} +static inline void *usbi_tls_key_get(usbi_tls_key_t key) +{ + return pthread_getspecific(key); +} +static inline void usbi_tls_key_set(usbi_tls_key_t key, void *ptr) +{ + (void)pthread_setspecific(key, ptr); +} +static inline void usbi_tls_key_delete(usbi_tls_key_t key) +{ + (void)pthread_key_delete(key); +} + +int usbi_get_tid(void); + +#endif /* LIBUSB_THREADS_POSIX_H */ diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_windows.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_windows.c new file mode 100644 index 000000000000..409c49055392 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_windows.c @@ -0,0 +1,126 @@ +/* + * libusb synchronization on Microsoft Windows + * + * Copyright © 2010 Michael Plante + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include + +#include "libusbi.h" + +struct usbi_cond_perthread { + struct list_head list; + HANDLE event; +}; + +void usbi_mutex_static_lock(usbi_mutex_static_t *mutex) +{ + while (InterlockedExchange(mutex, 1L) == 1L) + SleepEx(0, TRUE); +} + +void usbi_cond_init(usbi_cond_t *cond) +{ + list_init(&cond->waiters); + list_init(&cond->not_waiting); +} + +static int usbi_cond_intwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, DWORD timeout_ms) +{ + struct usbi_cond_perthread *pos; + DWORD r; + + // Same assumption as usbi_cond_broadcast() holds + if (list_empty(&cond->not_waiting)) { + pos = malloc(sizeof(*pos)); + if (pos == NULL) + return ENOMEM; // This errno is not POSIX-allowed. + pos->event = CreateEvent(NULL, FALSE, FALSE, NULL); // auto-reset. + if (pos->event == NULL) { + free(pos); + return ENOMEM; + } + } else { + pos = list_first_entry(&cond->not_waiting, struct usbi_cond_perthread, list); + list_del(&pos->list); // remove from not_waiting list. + // Ensure the event is clear before waiting + WaitForSingleObject(pos->event, 0); + } + + list_add(&pos->list, &cond->waiters); + + LeaveCriticalSection(mutex); + r = WaitForSingleObject(pos->event, timeout_ms); + EnterCriticalSection(mutex); + + list_del(&pos->list); + list_add(&pos->list, &cond->not_waiting); + + if (r == WAIT_OBJECT_0) + return 0; + else if (r == WAIT_TIMEOUT) + return ETIMEDOUT; + else + return EINVAL; +} + +// N.B.: usbi_cond_*wait() can also return ENOMEM, even though pthread_cond_*wait cannot! +int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex) +{ + return usbi_cond_intwait(cond, mutex, INFINITE); +} + +int usbi_cond_timedwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, const struct timeval *tv) +{ + DWORD millis; + + millis = (DWORD)(tv->tv_sec * 1000) + (tv->tv_usec / 1000); + /* round up to next millisecond */ + if (tv->tv_usec % 1000) + millis++; + return usbi_cond_intwait(cond, mutex, millis); +} + +void usbi_cond_broadcast(usbi_cond_t *cond) +{ + // Assumes mutex is locked; this is not in keeping with POSIX spec, but + // libusb does this anyway, so we simplify by not adding more sync + // primitives to the CV definition! + struct usbi_cond_perthread *pos; + + list_for_each_entry(pos, &cond->waiters, list, struct usbi_cond_perthread) + SetEvent(pos->event); + // The wait function will remove its respective item from the list. +} + +void usbi_cond_destroy(usbi_cond_t *cond) +{ + // This assumes no one is using this anymore. The check MAY NOT BE safe. + struct usbi_cond_perthread *pos, *next; + + if (!list_empty(&cond->waiters)) + return; // (!see above!) + list_for_each_entry_safe(pos, next, &cond->not_waiting, list, struct usbi_cond_perthread) { + CloseHandle(pos->event); + list_del(&pos->list); + free(pos); + } +} diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_windows.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_windows.h new file mode 100644 index 000000000000..409de2d0e25e --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/threads_windows.h @@ -0,0 +1,111 @@ +/* + * libusb synchronization on Microsoft Windows + * + * Copyright © 2010 Michael Plante + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_THREADS_WINDOWS_H +#define LIBUSB_THREADS_WINDOWS_H + +#define USBI_MUTEX_INITIALIZER 0L +#ifdef _WIN32_WCE +typedef LONG usbi_mutex_static_t; +#else +typedef volatile LONG usbi_mutex_static_t; +#endif +void usbi_mutex_static_lock(usbi_mutex_static_t *mutex); +static inline void usbi_mutex_static_unlock(usbi_mutex_static_t *mutex) +{ + InterlockedExchange(mutex, 0L); +} + +typedef CRITICAL_SECTION usbi_mutex_t; +static inline int usbi_mutex_init(usbi_mutex_t *mutex) +{ + InitializeCriticalSection(mutex); + return 0; +} +static inline void usbi_mutex_lock(usbi_mutex_t *mutex) +{ + EnterCriticalSection(mutex); +} +static inline void usbi_mutex_unlock(usbi_mutex_t *mutex) +{ + LeaveCriticalSection(mutex); +} +static inline int usbi_mutex_trylock(usbi_mutex_t *mutex) +{ + return !TryEnterCriticalSection(mutex); +} +static inline void usbi_mutex_destroy(usbi_mutex_t *mutex) +{ + DeleteCriticalSection(mutex); +} + +// We *were* getting timespec from pthread.h: +#if (!defined(HAVE_STRUCT_TIMESPEC) && !defined(_TIMESPEC_DEFINED)) +#define HAVE_STRUCT_TIMESPEC 1 +#define _TIMESPEC_DEFINED 1 +struct timespec { + long tv_sec; + long tv_nsec; +}; +#endif /* HAVE_STRUCT_TIMESPEC | _TIMESPEC_DEFINED */ + +// We *were* getting ETIMEDOUT from pthread.h: +#ifndef ETIMEDOUT +#define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +#endif + +typedef struct usbi_cond { + // Every time a thread touches the CV, it winds up in one of these lists. + // It stays there until the CV is destroyed, even if the thread terminates. + struct list_head waiters; + struct list_head not_waiting; +} usbi_cond_t; + +void usbi_cond_init(usbi_cond_t *cond); +int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex); +int usbi_cond_timedwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, const struct timeval *tv); +void usbi_cond_broadcast(usbi_cond_t *cond); +void usbi_cond_destroy(usbi_cond_t *cond); + +typedef DWORD usbi_tls_key_t; +static inline void usbi_tls_key_create(usbi_tls_key_t *key) +{ + *key = TlsAlloc(); +} +static inline void *usbi_tls_key_get(usbi_tls_key_t key) +{ + return TlsGetValue(key); +} +static inline void usbi_tls_key_set(usbi_tls_key_t key, void *ptr) +{ + (void)TlsSetValue(key, ptr); +} +static inline void usbi_tls_key_delete(usbi_tls_key_t key) +{ + (void)TlsFree(key); +} + +static inline int usbi_get_tid(void) +{ + return (int)GetCurrentThreadId(); +} + +#endif /* LIBUSB_THREADS_WINDOWS_H */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/wince_usb.c similarity index 94% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.c rename to vendor/github.com/karalabe/usb/libusb/libusb/os/wince_usb.c index 0d466b8c9c9a..a0f35e93e5de 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.c +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/wince_usb.c @@ -31,7 +31,7 @@ #include "wince_usb.h" // Global variables -int windows_version = WINDOWS_CE; +int errno = 0; static uint64_t hires_frequency, hires_ticks_to_ps; static HANDLE driver_handle = INVALID_HANDLE_VALUE; static int concurrent_usage = -1; @@ -109,7 +109,7 @@ static int translate_driver_error(DWORD error) } } -static int init_dllimports(void) +static BOOL init_dllimports(void) { DLL_GET_HANDLE(ceusbkwrapper); DLL_LOAD_FUNC(ceusbkwrapper, UkwOpenDriver, TRUE); @@ -135,7 +135,7 @@ static int init_dllimports(void) DLL_LOAD_FUNC(ceusbkwrapper, UkwIssueBulkTransfer, TRUE); DLL_LOAD_FUNC(ceusbkwrapper, UkwIsPipeHalted, TRUE); - return LIBUSB_SUCCESS; + return TRUE; } static void exit_dllimports(void) @@ -186,11 +186,8 @@ static int wince_init(struct libusb_context *ctx) // NB: concurrent usage supposes that init calls are equally balanced with // exit calls. If init is called more than exit, we will not exit properly if ( ++concurrent_usage == 0 ) { // First init? - // Initialize pollable file descriptors - init_polling(); - // Load DLL imports - if (init_dllimports() != LIBUSB_SUCCESS) { + if (!init_dllimports()) { usbi_err(ctx, "could not resolve DLL functions"); r = LIBUSB_ERROR_NOT_SUPPORTED; goto init_exit; @@ -223,7 +220,6 @@ static int wince_init(struct libusb_context *ctx) init_exit: // Holds semaphore here. if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? exit_dllimports(); - exit_polling(); if (driver_handle != INVALID_HANDLE_VALUE) { UkwCloseDriver(driver_handle); @@ -239,10 +235,11 @@ static int wince_init(struct libusb_context *ctx) return r; } -static void wince_exit(void) +static void wince_exit(struct libusb_context *ctx) { HANDLE semaphore; TCHAR sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' + UNUSED(ctx); _stprintf(sem_name, _T("libusb_init%08X"), (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); semaphore = CreateSemaphore(NULL, 1, 1, sem_name); @@ -259,7 +256,6 @@ static void wince_exit(void) // Only works if exits and inits are balanced exactly if (--concurrent_usage < 0) { // Last exit exit_dllimports(); - exit_polling(); if (driver_handle != INVALID_HANDLE_VALUE) { UkwCloseDriver(driver_handle); @@ -328,7 +324,7 @@ static int wince_get_device_list( } new_devices = discovered_devs_append(new_devices, dev); - if (!discdevs) { + if (!new_devices) { r = LIBUSB_ERROR_NO_MEM; goto err_out; } @@ -541,12 +537,9 @@ static void wince_destroy_device(struct libusb_device *dev) static void wince_clear_transfer_priv(struct usbi_transfer *itransfer) { struct wince_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct winfd wfd = fd_to_winfd(transfer_priv->pollable_fd.fd); - // No need to cancel transfer as it is either complete or abandoned - wfd.itransfer = NULL; - CloseHandle(wfd.handle); - usbi_free_fd(&transfer_priv->pollable_fd); + usbi_close(transfer_priv->pollable_fd.fd); + transfer_priv->pollable_fd = INVALID_WINFD; } static int wince_cancel_transfer(struct usbi_transfer *itransfer) @@ -570,11 +563,10 @@ static int wince_submit_control_or_bulk_transfer(struct usbi_transfer *itransfer BOOL direction_in, ret; struct winfd wfd; DWORD flags; - HANDLE eventHandle; PUKW_CONTROL_HEADER setup = NULL; const BOOL control_transfer = transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL; + int r; - transfer_priv->pollable_fd = INVALID_WINFD; if (control_transfer) { setup = (PUKW_CONTROL_HEADER) transfer->buffer; direction_in = setup->bmRequestType & LIBUSB_ENDPOINT_IN; @@ -584,19 +576,18 @@ static int wince_submit_control_or_bulk_transfer(struct usbi_transfer *itransfer flags = direction_in ? UKW_TF_IN_TRANSFER : UKW_TF_OUT_TRANSFER; flags |= UKW_TF_SHORT_TRANSFER_OK; - eventHandle = CreateEvent(NULL, FALSE, FALSE, NULL); - if (eventHandle == NULL) { - usbi_err(ctx, "Failed to create event for async transfer"); + wfd = usbi_create_fd(); + if (wfd.fd < 0) return LIBUSB_ERROR_NO_MEM; - } - wfd = usbi_create_fd(eventHandle, direction_in ? RW_READ : RW_WRITE, itransfer, &wince_cancel_transfer); - if (wfd.fd < 0) { - CloseHandle(eventHandle); - return LIBUSB_ERROR_NO_MEM; + r = usbi_add_pollfd(ctx, wfd.fd, direction_in ? POLLIN : POLLOUT); + if (r) { + usbi_close(wfd.fd); + return r; } transfer_priv->pollable_fd = wfd; + if (control_transfer) { // Split out control setup header and data buffer DWORD bufLen = transfer->length - sizeof(UKW_CONTROL_HEADER); @@ -612,17 +603,14 @@ static int wince_submit_control_or_bulk_transfer(struct usbi_transfer *itransfer int libusbErr = translate_driver_error(GetLastError()); usbi_err(ctx, "UkwIssue%sTransfer failed: error %u", control_transfer ? "Control" : "Bulk", (unsigned int)GetLastError()); - wince_clear_transfer_priv(itransfer); + usbi_remove_pollfd(ctx, wfd.fd); + usbi_close(wfd.fd); + transfer_priv->pollable_fd = INVALID_WINFD; return libusbErr; } - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, direction_in ? POLLIN : POLLOUT); - return LIBUSB_SUCCESS; -} -static int wince_submit_iso_transfer(struct usbi_transfer *itransfer) -{ - return LIBUSB_ERROR_NOT_SUPPORTED; + return LIBUSB_SUCCESS; } static int wince_submit_transfer(struct usbi_transfer *itransfer) @@ -635,7 +623,6 @@ static int wince_submit_transfer(struct usbi_transfer *itransfer) case LIBUSB_TRANSFER_TYPE_INTERRUPT: return wince_submit_control_or_bulk_transfer(itransfer); case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return wince_submit_iso_transfer(itransfer); case LIBUSB_TRANSFER_TYPE_BULK_STREAM: return LIBUSB_ERROR_NOT_SUPPORTED; default: @@ -763,7 +750,7 @@ static int wince_handle_events( struct wince_transfer_priv* transfer_priv = NULL; POLL_NFDS_TYPE i = 0; BOOL found = FALSE; - struct usbi_transfer *transfer; + struct usbi_transfer *itransfer; DWORD io_size, io_result; int r = LIBUSB_SUCCESS; @@ -780,8 +767,8 @@ static int wince_handle_events( // Because a Windows OVERLAPPED is used for poll emulation, // a pollable fd is created and stored with each transfer usbi_mutex_lock(&ctx->flying_transfers_lock); - list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { - transfer_priv = usbi_transfer_get_os_priv(transfer); + list_for_each_entry(itransfer, &ctx->flying_transfers, list, struct usbi_transfer) { + transfer_priv = usbi_transfer_get_os_priv(itransfer); if (transfer_priv->pollable_fd.fd == fds[i].fd) { found = TRUE; break; @@ -796,7 +783,7 @@ static int wince_handle_events( // let handle_callback free the event using the transfer wfd // If you don't use the transfer wfd, you run a risk of trying to free a // newly allocated wfd that took the place of the one from the transfer. - wince_handle_callback(transfer, io_result, io_size); + wince_handle_callback(itransfer, io_result, io_size); } else if (found) { usbi_err(ctx, "matching transfer for fd %d has not completed", fds[i]); r = LIBUSB_ERROR_OTHER; @@ -848,11 +835,12 @@ static int wince_clock_gettime(int clk_id, struct timespec *tp) } } -const struct usbi_os_backend wince_backend = { +const struct usbi_os_backend usbi_backend = { "Windows CE", 0, wince_init, wince_exit, + NULL, /* set_option() */ wince_get_device_list, NULL, /* hotplug_poll */ @@ -893,6 +881,7 @@ const struct usbi_os_backend wince_backend = { NULL, /* handle_transfer_completion() */ wince_clock_gettime, + 0, sizeof(struct wince_device_priv), 0, sizeof(struct wince_transfer_priv), diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/wince_usb.h similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.h rename to vendor/github.com/karalabe/usb/libusb/libusb/os/wince_usb.h diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_common.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_common.h similarity index 82% rename from vendor/github.com/karalabe/hid/libusb/libusb/os/windows_common.h rename to vendor/github.com/karalabe/usb/libusb/libusb/os/windows_common.h index 55344ca264e2..b1725c2e3261 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_common.h +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_common.h @@ -68,31 +68,35 @@ /* * Macros for handling DLL themselves */ +#define DLL_HANDLE_NAME(name) __dll_##name##_handle + #define DLL_DECLARE_HANDLE(name) \ - static HMODULE __dll_##name##_handle = NULL + static HMODULE DLL_HANDLE_NAME(name) = NULL #define DLL_GET_HANDLE(name) \ do { \ - __dll_##name##_handle = DLL_LOAD_LIBRARY(name); \ - if (!__dll_##name##_handle) \ - return LIBUSB_ERROR_OTHER; \ + DLL_HANDLE_NAME(name) = DLL_LOAD_LIBRARY(name); \ + if (!DLL_HANDLE_NAME(name)) \ + return FALSE; \ } while (0) #define DLL_FREE_HANDLE(name) \ do { \ - if (__dll_##name##_handle) { \ - FreeLibrary(__dll_##name##_handle); \ - __dll_##name##_handle = NULL; \ + if (DLL_HANDLE_NAME(name)) { \ + FreeLibrary(DLL_HANDLE_NAME(name)); \ + DLL_HANDLE_NAME(name) = NULL; \ } \ - } while(0) + } while (0) /* * Macros for handling functions within a DLL */ +#define DLL_FUNC_NAME(name) __dll_##name##_func_t + #define DLL_DECLARE_FUNC_PREFIXNAME(api, ret, prefixname, name, args) \ - typedef ret (api * __dll_##name##_func_t)args; \ - static __dll_##name##_func_t prefixname = NULL + typedef ret (api * DLL_FUNC_NAME(name))args; \ + static DLL_FUNC_NAME(name) prefixname = NULL #define DLL_DECLARE_FUNC(api, ret, name, args) \ DLL_DECLARE_FUNC_PREFIXNAME(api, ret, name, name, args) @@ -101,22 +105,22 @@ #define DLL_LOAD_FUNC_PREFIXNAME(dll, prefixname, name, ret_on_failure) \ do { \ - HMODULE h = __dll_##dll##_handle; \ - prefixname = (__dll_##name##_func_t)GetProcAddress(h, \ + HMODULE h = DLL_HANDLE_NAME(dll); \ + prefixname = (DLL_FUNC_NAME(name))GetProcAddress(h, \ DLL_STRINGIFY(name)); \ if (prefixname) \ break; \ - prefixname = (__dll_##name##_func_t)GetProcAddress(h, \ + prefixname = (DLL_FUNC_NAME(name))GetProcAddress(h, \ DLL_STRINGIFY(name) DLL_STRINGIFY(A)); \ if (prefixname) \ break; \ - prefixname = (__dll_##name##_func_t)GetProcAddress(h, \ + prefixname = (DLL_FUNC_NAME(name))GetProcAddress(h, \ DLL_STRINGIFY(name) DLL_STRINGIFY(W)); \ if (prefixname) \ break; \ if (ret_on_failure) \ - return LIBUSB_ERROR_NOT_FOUND; \ - } while(0) + return FALSE; \ + } while (0) #define DLL_LOAD_FUNC(dll, name, ret_on_failure) \ DLL_LOAD_FUNC_PREFIXNAME(dll, name, name, ret_on_failure) diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_nt_common.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_nt_common.c new file mode 100644 index 000000000000..92dbde5a8445 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_nt_common.c @@ -0,0 +1,1008 @@ +/* + * windows backend for libusb 1.0 + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software + * Hash table functions adapted from glibc, by Ulrich Drepper et al. + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include + +#include "libusbi.h" +#include "windows_common.h" +#include "windows_nt_common.h" + +// Public +BOOL (WINAPI *pCancelIoEx)(HANDLE, LPOVERLAPPED); +enum windows_version windows_version = WINDOWS_UNDEFINED; + + // Global variables for init/exit +static unsigned int init_count = 0; +static bool usbdk_available = false; + +// Global variables for clock_gettime mechanism +static uint64_t hires_ticks_to_ps; +static uint64_t hires_frequency; + +#define TIMER_REQUEST_RETRY_MS 100 +#define WM_TIMER_REQUEST (WM_USER + 1) +#define WM_TIMER_EXIT (WM_USER + 2) + +// used for monotonic clock_gettime() +struct timer_request { + struct timespec *tp; + HANDLE event; +}; + +// Timer thread +static HANDLE timer_thread = NULL; +static DWORD timer_thread_id = 0; + +/* Kernel32 dependencies */ +DLL_DECLARE_HANDLE(Kernel32); +/* This call is only available from XP SP2 */ +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, IsWow64Process, (HANDLE, PBOOL)); + +/* User32 dependencies */ +DLL_DECLARE_HANDLE(User32); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, GetMessageA, (LPMSG, HWND, UINT, UINT)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PeekMessageA, (LPMSG, HWND, UINT, UINT, UINT)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PostThreadMessageA, (DWORD, UINT, WPARAM, LPARAM)); + +static unsigned __stdcall windows_clock_gettime_threaded(void *param); + +/* +* Converts a windows error to human readable string +* uses retval as errorcode, or, if 0, use GetLastError() +*/ +#if defined(ENABLE_LOGGING) +const char *windows_error_str(DWORD error_code) +{ + static char err_string[ERR_BUFFER_SIZE]; + + DWORD size; + int len; + + if (error_code == 0) + error_code = GetLastError(); + + len = sprintf(err_string, "[%u] ", (unsigned int)error_code); + + // Translate codes returned by SetupAPI. The ones we are dealing with are either + // in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes. + // See http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011.aspx + switch (error_code & 0xE0000000) { + case 0: + error_code = HRESULT_FROM_WIN32(error_code); // Still leaves ERROR_SUCCESS unmodified + break; + case 0xE0000000: + error_code = 0x80000000 | (FACILITY_SETUPAPI << 16) | (error_code & 0x0000FFFF); + break; + default: + break; + } + + size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + &err_string[len], ERR_BUFFER_SIZE - len, NULL); + if (size == 0) { + DWORD format_error = GetLastError(); + if (format_error) + snprintf(err_string, ERR_BUFFER_SIZE, + "Windows error code %u (FormatMessage error code %u)", + (unsigned int)error_code, (unsigned int)format_error); + else + snprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", (unsigned int)error_code); + } else { + // Remove CRLF from end of message, if present + size_t pos = len + size - 2; + if (err_string[pos] == '\r') + err_string[pos] = '\0'; + } + + return err_string; +} +#endif + +static inline struct windows_context_priv *_context_priv(struct libusb_context *ctx) +{ + return (struct windows_context_priv *)ctx->os_priv; +} + +/* Hash table functions - modified From glibc 2.3.2: + [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 + [Knuth] The Art of Computer Programming, part 3 (6.4) */ + +#define HTAB_SIZE 1021UL // *MUST* be a prime number!! + +typedef struct htab_entry { + unsigned long used; + char *str; +} htab_entry; + +static htab_entry *htab_table = NULL; +static usbi_mutex_t htab_mutex; +static unsigned long htab_filled; + +/* Before using the hash table we must allocate memory for it. + We allocate one element more as the found prime number says. + This is done for more effective indexing as explained in the + comment for the hash function. */ +static bool htab_create(struct libusb_context *ctx) +{ + if (htab_table != NULL) { + usbi_err(ctx, "hash table already allocated"); + return true; + } + + // Create a mutex + usbi_mutex_init(&htab_mutex); + + usbi_dbg("using %lu entries hash table", HTAB_SIZE); + htab_filled = 0; + + // allocate memory and zero out. + htab_table = calloc(HTAB_SIZE + 1, sizeof(htab_entry)); + if (htab_table == NULL) { + usbi_err(ctx, "could not allocate space for hash table"); + return false; + } + + return true; +} + +/* After using the hash table it has to be destroyed. */ +static void htab_destroy(void) +{ + unsigned long i; + + if (htab_table == NULL) + return; + + for (i = 0; i < HTAB_SIZE; i++) + free(htab_table[i].str); + + safe_free(htab_table); + + usbi_mutex_destroy(&htab_mutex); +} + +/* This is the search function. It uses double hashing with open addressing. + We use a trick to speed up the lookup. The table is created with one + more element available. This enables us to use the index zero special. + This index will never be used because we store the first hash index in + the field used where zero means not used. Every other value means used. + The used field can be used as a first fast comparison for equality of + the stored and the parameter value. This helps to prevent unnecessary + expensive calls of strcmp. */ +unsigned long htab_hash(const char *str) +{ + unsigned long hval, hval2; + unsigned long idx; + unsigned long r = 5381; + int c; + const char *sz = str; + + if (str == NULL) + return 0; + + // Compute main hash value (algorithm suggested by Nokia) + while ((c = *sz++) != 0) + r = ((r << 5) + r) + c; + if (r == 0) + ++r; + + // compute table hash: simply take the modulus + hval = r % HTAB_SIZE; + if (hval == 0) + ++hval; + + // Try the first index + idx = hval; + + // Mutually exclusive access (R/W lock would be better) + usbi_mutex_lock(&htab_mutex); + + if (htab_table[idx].used) { + if ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0)) + goto out_unlock; // existing hash + + usbi_dbg("hash collision ('%s' vs '%s')", str, htab_table[idx].str); + + // Second hash function, as suggested in [Knuth] + hval2 = 1 + hval % (HTAB_SIZE - 2); + + do { + // Because size is prime this guarantees to step through all available indexes + if (idx <= hval2) + idx = HTAB_SIZE + idx - hval2; + else + idx -= hval2; + + // If we visited all entries leave the loop unsuccessfully + if (idx == hval) + break; + + // If entry is found use it. + if ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0)) + goto out_unlock; + } while (htab_table[idx].used); + } + + // Not found => New entry + + // If the table is full return an error + if (htab_filled >= HTAB_SIZE) { + usbi_err(NULL, "hash table is full (%lu entries)", HTAB_SIZE); + idx = 0; + goto out_unlock; + } + + htab_table[idx].str = _strdup(str); + if (htab_table[idx].str == NULL) { + usbi_err(NULL, "could not duplicate string for hash table"); + idx = 0; + goto out_unlock; + } + + htab_table[idx].used = hval; + ++htab_filled; + +out_unlock: + usbi_mutex_unlock(&htab_mutex); + + return idx; +} + +/* +* Make a transfer complete synchronously +*/ +void windows_force_sync_completion(OVERLAPPED *overlapped, ULONG size) +{ + overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + overlapped->InternalHigh = size; + SetEvent(overlapped->hEvent); +} + +static BOOL windows_init_dlls(void) +{ + DLL_GET_HANDLE(Kernel32); + DLL_LOAD_FUNC_PREFIXED(Kernel32, p, IsWow64Process, FALSE); + pCancelIoEx = (BOOL (WINAPI *)(HANDLE, LPOVERLAPPED)) + GetProcAddress(DLL_HANDLE_NAME(Kernel32), "CancelIoEx"); + usbi_dbg("Will use CancelIo%s for I/O cancellation", pCancelIoEx ? "Ex" : ""); + + DLL_GET_HANDLE(User32); + DLL_LOAD_FUNC_PREFIXED(User32, p, GetMessageA, TRUE); + DLL_LOAD_FUNC_PREFIXED(User32, p, PeekMessageA, TRUE); + DLL_LOAD_FUNC_PREFIXED(User32, p, PostThreadMessageA, TRUE); + + return TRUE; +} + +static void windows_exit_dlls(void) +{ + DLL_FREE_HANDLE(Kernel32); + DLL_FREE_HANDLE(User32); +} + +static bool windows_init_clock(struct libusb_context *ctx) +{ + DWORD_PTR affinity, dummy; + HANDLE event; + LARGE_INTEGER li_frequency; + int i; + + if (QueryPerformanceFrequency(&li_frequency)) { + // The hires frequency can go as high as 4 GHz, so we'll use a conversion + // to picoseconds to compute the tv_nsecs part in clock_gettime + hires_frequency = li_frequency.QuadPart; + hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; + usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); + + // Because QueryPerformanceCounter might report different values when + // running on different cores, we create a separate thread for the timer + // calls, which we glue to the first available core always to prevent timing discrepancies. + if (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy) || (affinity == 0)) { + usbi_err(ctx, "could not get process affinity: %s", windows_error_str(0)); + return false; + } + + // The process affinity mask is a bitmask where each set bit represents a core on + // which this process is allowed to run, so we find the first set bit + for (i = 0; !(affinity & (DWORD_PTR)(1 << i)); i++); + affinity = (DWORD_PTR)(1 << i); + + usbi_dbg("timer thread will run on core #%d", i); + + event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (event == NULL) { + usbi_err(ctx, "could not create event: %s", windows_error_str(0)); + return false; + } + + timer_thread = (HANDLE)_beginthreadex(NULL, 0, windows_clock_gettime_threaded, (void *)event, + 0, (unsigned int *)&timer_thread_id); + if (timer_thread == NULL) { + usbi_err(ctx, "unable to create timer thread - aborting"); + CloseHandle(event); + return false; + } + + if (!SetThreadAffinityMask(timer_thread, affinity)) + usbi_warn(ctx, "unable to set timer thread affinity, timer discrepancies may arise"); + + // Wait for timer thread to init before continuing. + if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) { + usbi_err(ctx, "failed to wait for timer thread to become ready - aborting"); + CloseHandle(event); + return false; + } + + CloseHandle(event); + } else { + usbi_dbg("no hires timer available on this platform"); + hires_frequency = 0; + hires_ticks_to_ps = UINT64_C(0); + } + + return true; +} + +static void windows_destroy_clock(void) +{ + if (timer_thread) { + // actually the signal to quit the thread. + if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) + || (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { + usbi_dbg("could not wait for timer thread to quit"); + TerminateThread(timer_thread, 1); + // shouldn't happen, but we're destroying + // all objects it might have held anyway. + } + CloseHandle(timer_thread); + timer_thread = NULL; + timer_thread_id = 0; + } +} + +/* Windows version detection */ +static BOOL is_x64(void) +{ + BOOL ret = FALSE; + + // Detect if we're running a 32 or 64 bit system + if (sizeof(uintptr_t) < 8) { + if (pIsWow64Process != NULL) + pIsWow64Process(GetCurrentProcess(), &ret); + } else { + ret = TRUE; + } + + return ret; +} + +static void get_windows_version(void) +{ + OSVERSIONINFOEXA vi, vi2; + const char *arch, *w = NULL; + unsigned major, minor, version; + ULONGLONG major_equal, minor_equal; + BOOL ws; + + windows_version = WINDOWS_UNDEFINED; + + memset(&vi, 0, sizeof(vi)); + vi.dwOSVersionInfoSize = sizeof(vi); + if (!GetVersionExA((OSVERSIONINFOA *)&vi)) { + memset(&vi, 0, sizeof(vi)); + vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + if (!GetVersionExA((OSVERSIONINFOA *)&vi)) + return; + } + + if (vi.dwPlatformId != VER_PLATFORM_WIN32_NT) + return; + + if ((vi.dwMajorVersion > 6) || ((vi.dwMajorVersion == 6) && (vi.dwMinorVersion >= 2))) { + // Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the actual OS version + // See: http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx + + major_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); + for (major = vi.dwMajorVersion; major <= 9; major++) { + memset(&vi2, 0, sizeof(vi2)); + vi2.dwOSVersionInfoSize = sizeof(vi2); + vi2.dwMajorVersion = major; + if (!VerifyVersionInfoA(&vi2, VER_MAJORVERSION, major_equal)) + continue; + + if (vi.dwMajorVersion < major) { + vi.dwMajorVersion = major; + vi.dwMinorVersion = 0; + } + + minor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL); + for (minor = vi.dwMinorVersion; minor <= 9; minor++) { + memset(&vi2, 0, sizeof(vi2)); + vi2.dwOSVersionInfoSize = sizeof(vi2); + vi2.dwMinorVersion = minor; + if (!VerifyVersionInfoA(&vi2, VER_MINORVERSION, minor_equal)) + continue; + + vi.dwMinorVersion = minor; + break; + } + + break; + } + } + + if ((vi.dwMajorVersion > 0xf) || (vi.dwMinorVersion > 0xf)) + return; + + ws = (vi.wProductType <= VER_NT_WORKSTATION); + version = vi.dwMajorVersion << 4 | vi.dwMinorVersion; + switch (version) { + case 0x50: windows_version = WINDOWS_2000; w = "2000"; break; + case 0x51: windows_version = WINDOWS_XP; w = "XP"; break; + case 0x52: windows_version = WINDOWS_2003; w = "2003"; break; + case 0x60: windows_version = WINDOWS_VISTA; w = (ws ? "Vista" : "2008"); break; + case 0x61: windows_version = WINDOWS_7; w = (ws ? "7" : "2008_R2"); break; + case 0x62: windows_version = WINDOWS_8; w = (ws ? "8" : "2012"); break; + case 0x63: windows_version = WINDOWS_8_1; w = (ws ? "8.1" : "2012_R2"); break; + case 0x64: windows_version = WINDOWS_10; w = (ws ? "10" : "2016"); break; + default: + if (version < 0x50) { + return; + } else { + windows_version = WINDOWS_11_OR_LATER; + w = "11 or later"; + } + } + + arch = is_x64() ? "64-bit" : "32-bit"; + + if (vi.wServicePackMinor) + usbi_dbg("Windows %s SP%u.%u %s", w, vi.wServicePackMajor, vi.wServicePackMinor, arch); + else if (vi.wServicePackMajor) + usbi_dbg("Windows %s SP%u %s", w, vi.wServicePackMajor, arch); + else + usbi_dbg("Windows %s %s", w, arch); +} + +/* +* Monotonic and real time functions +*/ +static unsigned __stdcall windows_clock_gettime_threaded(void *param) +{ + struct timer_request *request; + LARGE_INTEGER hires_counter; + MSG msg; + + // The following call will create this thread's message queue + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx + pPeekMessageA(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); + + // Signal windows_init_clock() that we're ready to service requests + if (!SetEvent((HANDLE)param)) + usbi_dbg("SetEvent failed for timer init event: %s", windows_error_str(0)); + param = NULL; + + // Main loop - wait for requests + while (1) { + if (pGetMessageA(&msg, NULL, WM_TIMER_REQUEST, WM_TIMER_EXIT) == -1) { + usbi_err(NULL, "GetMessage failed for timer thread: %s", windows_error_str(0)); + return 1; + } + + switch (msg.message) { + case WM_TIMER_REQUEST: + // Requests to this thread are for hires always + // Microsoft says that this function always succeeds on XP and later + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904.aspx + request = (struct timer_request *)msg.lParam; + QueryPerformanceCounter(&hires_counter); + request->tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); + request->tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps); + if (!SetEvent(request->event)) + usbi_err(NULL, "SetEvent failed for timer request: %s", windows_error_str(0)); + break; + case WM_TIMER_EXIT: + usbi_dbg("timer thread quitting"); + return 0; + } + } +} + +static void windows_transfer_callback(const struct windows_backend *backend, + struct usbi_transfer *itransfer, DWORD io_result, DWORD io_size) +{ + int status, istatus; + + usbi_dbg("handling I/O completion with errcode %u, size %u", (unsigned int)io_result, (unsigned int)io_size); + + switch (io_result) { + case NO_ERROR: + status = backend->copy_transfer_data(itransfer, (uint32_t)io_size); + break; + case ERROR_GEN_FAILURE: + usbi_dbg("detected endpoint stall"); + status = LIBUSB_TRANSFER_STALL; + break; + case ERROR_SEM_TIMEOUT: + usbi_dbg("detected semaphore timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + break; + case ERROR_OPERATION_ABORTED: + istatus = backend->copy_transfer_data(itransfer, (uint32_t)io_size); + if (istatus != LIBUSB_TRANSFER_COMPLETED) + usbi_dbg("Failed to copy partial data in aborted operation: %d", istatus); + + usbi_dbg("detected operation aborted"); + status = LIBUSB_TRANSFER_CANCELLED; + break; + case ERROR_FILE_NOT_FOUND: + usbi_dbg("detected device removed"); + status = LIBUSB_TRANSFER_NO_DEVICE; + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error %u: %s", (unsigned int)io_result, windows_error_str(io_result)); + status = LIBUSB_TRANSFER_ERROR; + break; + } + backend->clear_transfer_priv(itransfer); // Cancel polling + if (status == LIBUSB_TRANSFER_CANCELLED) + usbi_handle_transfer_cancellation(itransfer); + else + usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); +} + +static void windows_handle_callback(const struct windows_backend *backend, + struct usbi_transfer *itransfer, DWORD io_result, DWORD io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + windows_transfer_callback(backend, itransfer, io_result, io_size); + break; + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + usbi_warn(ITRANSFER_CTX(itransfer), "bulk stream transfers are not yet supported on this platform"); + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + } +} + +static int windows_init(struct libusb_context *ctx) +{ + struct windows_context_priv *priv = _context_priv(ctx); + HANDLE semaphore; + char sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' + int r = LIBUSB_ERROR_OTHER; + bool winusb_backend_init = false; + + sprintf(sem_name, "libusb_init%08X", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); + semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); + if (semaphore == NULL) { + usbi_err(ctx, "could not create semaphore: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_MEM; + } + + // A successful wait brings our semaphore count to 0 (unsignaled) + // => any concurent wait stalls until the semaphore's release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + usbi_err(ctx, "failure to access semaphore: %s", windows_error_str(0)); + CloseHandle(semaphore); + return LIBUSB_ERROR_NO_MEM; + } + + // NB: concurrent usage supposes that init calls are equally balanced with + // exit calls. If init is called more than exit, we will not exit properly + if (++init_count == 1) { // First init? + // Load DLL imports + if (!windows_init_dlls()) { + usbi_err(ctx, "could not resolve DLL functions"); + goto init_exit; + } + + get_windows_version(); + + if (windows_version == WINDOWS_UNDEFINED) { + usbi_err(ctx, "failed to detect Windows version"); + r = LIBUSB_ERROR_NOT_SUPPORTED; + goto init_exit; + } + + if (!windows_init_clock(ctx)) + goto init_exit; + + if (!htab_create(ctx)) + goto init_exit; + + r = winusb_backend.init(ctx); + if (r != LIBUSB_SUCCESS) + goto init_exit; + winusb_backend_init = true; + + r = usbdk_backend.init(ctx); + if (r == LIBUSB_SUCCESS) { + usbi_dbg("UsbDk backend is available"); + usbdk_available = true; + } else { + usbi_info(ctx, "UsbDk backend is not available"); + // Do not report this as an error + r = LIBUSB_SUCCESS; + } + } + + // By default, new contexts will use the WinUSB backend + priv->backend = &winusb_backend; + + r = LIBUSB_SUCCESS; + +init_exit: // Holds semaphore here + if ((init_count == 1) && (r != LIBUSB_SUCCESS)) { // First init failed? + if (winusb_backend_init) + winusb_backend.exit(ctx); + htab_destroy(); + windows_destroy_clock(); + windows_exit_dlls(); + --init_count; + } + + ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 + CloseHandle(semaphore); + return r; +} + +static void windows_exit(struct libusb_context *ctx) +{ + HANDLE semaphore; + char sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' + UNUSED(ctx); + + sprintf(sem_name, "libusb_init%08X", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); + semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); + if (semaphore == NULL) + return; + + // A successful wait brings our semaphore count to 0 (unsignaled) + // => any concurent wait stalls until the semaphore release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + CloseHandle(semaphore); + return; + } + + // Only works if exits and inits are balanced exactly + if (--init_count == 0) { // Last exit + if (usbdk_available) { + usbdk_backend.exit(ctx); + usbdk_available = false; + } + winusb_backend.exit(ctx); + htab_destroy(); + windows_destroy_clock(); + windows_exit_dlls(); + } + + ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 + CloseHandle(semaphore); +} + +static int windows_set_option(struct libusb_context *ctx, enum libusb_option option, va_list ap) +{ + struct windows_context_priv *priv = _context_priv(ctx); + + UNUSED(ap); + + switch (option) { + case LIBUSB_OPTION_USE_USBDK: + if (usbdk_available) { + usbi_dbg("switching context %p to use UsbDk backend", ctx); + priv->backend = &usbdk_backend; + } else { + usbi_err(ctx, "UsbDk backend not available"); + return LIBUSB_ERROR_NOT_FOUND; + } + return LIBUSB_SUCCESS; + default: + return LIBUSB_ERROR_NOT_SUPPORTED; + } + +} + +static int windows_get_device_list(struct libusb_context *ctx, struct discovered_devs **discdevs) +{ + struct windows_context_priv *priv = _context_priv(ctx); + return priv->backend->get_device_list(ctx, discdevs); +} + +static int windows_open(struct libusb_device_handle *dev_handle) +{ + struct windows_context_priv *priv = _context_priv(HANDLE_CTX(dev_handle)); + return priv->backend->open(dev_handle); +} + +static void windows_close(struct libusb_device_handle *dev_handle) +{ + struct windows_context_priv *priv = _context_priv(HANDLE_CTX(dev_handle)); + priv->backend->close(dev_handle); +} + +static int windows_get_device_descriptor(struct libusb_device *dev, + unsigned char *buffer, int *host_endian) +{ + struct windows_context_priv *priv = _context_priv(DEVICE_CTX(dev)); + *host_endian = 0; + return priv->backend->get_device_descriptor(dev, buffer); +} + +static int windows_get_active_config_descriptor(struct libusb_device *dev, + unsigned char *buffer, size_t len, int *host_endian) +{ + struct windows_context_priv *priv = _context_priv(DEVICE_CTX(dev)); + *host_endian = 0; + return priv->backend->get_active_config_descriptor(dev, buffer, len); +} + +static int windows_get_config_descriptor(struct libusb_device *dev, + uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +{ + struct windows_context_priv *priv = _context_priv(DEVICE_CTX(dev)); + *host_endian = 0; + return priv->backend->get_config_descriptor(dev, config_index, buffer, len); +} + +static int windows_get_config_descriptor_by_value(struct libusb_device *dev, + uint8_t bConfigurationValue, unsigned char **buffer, int *host_endian) +{ + struct windows_context_priv *priv = _context_priv(DEVICE_CTX(dev)); + *host_endian = 0; + return priv->backend->get_config_descriptor_by_value(dev, bConfigurationValue, buffer); +} + +static int windows_get_configuration(struct libusb_device_handle *dev_handle, int *config) +{ + struct windows_context_priv *priv = _context_priv(HANDLE_CTX(dev_handle)); + return priv->backend->get_configuration(dev_handle, config); +} + +static int windows_set_configuration(struct libusb_device_handle *dev_handle, int config) +{ + struct windows_context_priv *priv = _context_priv(HANDLE_CTX(dev_handle)); + return priv->backend->set_configuration(dev_handle, config); +} + +static int windows_claim_interface(struct libusb_device_handle *dev_handle, int interface_number) +{ + struct windows_context_priv *priv = _context_priv(HANDLE_CTX(dev_handle)); + return priv->backend->claim_interface(dev_handle, interface_number); +} + +static int windows_release_interface(struct libusb_device_handle *dev_handle, int interface_number) +{ + struct windows_context_priv *priv = _context_priv(HANDLE_CTX(dev_handle)); + return priv->backend->release_interface(dev_handle, interface_number); +} + +static int windows_set_interface_altsetting(struct libusb_device_handle *dev_handle, + int interface_number, int altsetting) +{ + struct windows_context_priv *priv = _context_priv(HANDLE_CTX(dev_handle)); + return priv->backend->set_interface_altsetting(dev_handle, interface_number, altsetting); +} + +static int windows_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct windows_context_priv *priv = _context_priv(HANDLE_CTX(dev_handle)); + return priv->backend->clear_halt(dev_handle, endpoint); +} + +static int windows_reset_device(struct libusb_device_handle *dev_handle) +{ + struct windows_context_priv *priv = _context_priv(HANDLE_CTX(dev_handle)); + return priv->backend->reset_device(dev_handle); +} + +static void windows_destroy_device(struct libusb_device *dev) +{ + struct windows_context_priv *priv = _context_priv(DEVICE_CTX(dev)); + priv->backend->destroy_device(dev); +} + +static int windows_submit_transfer(struct usbi_transfer *itransfer) +{ + struct windows_context_priv *priv = _context_priv(ITRANSFER_CTX(itransfer)); + return priv->backend->submit_transfer(itransfer); +} + +static int windows_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct windows_context_priv *priv = _context_priv(ITRANSFER_CTX(itransfer)); + return priv->backend->cancel_transfer(itransfer); +} + +static void windows_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct windows_context_priv *priv = _context_priv(ITRANSFER_CTX(itransfer)); + priv->backend->clear_transfer_priv(itransfer); +} + +static int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + struct windows_context_priv *priv = _context_priv(ctx); + struct usbi_transfer *itransfer; + DWORD io_size, io_result; + POLL_NFDS_TYPE i; + bool found; + int transfer_fd; + int r = LIBUSB_SUCCESS; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + + usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); + + if (!fds[i].revents) + continue; + + num_ready--; + + // Because a Windows OVERLAPPED is used for poll emulation, + // a pollable fd is created and stored with each transfer + found = false; + transfer_fd = -1; + usbi_mutex_lock(&ctx->flying_transfers_lock); + list_for_each_entry(itransfer, &ctx->flying_transfers, list, struct usbi_transfer) { + transfer_fd = priv->backend->get_transfer_fd(itransfer); + if (transfer_fd == fds[i].fd) { + found = true; + break; + } + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (found) { + priv->backend->get_overlapped_result(itransfer, &io_result, &io_size); + + usbi_remove_pollfd(ctx, transfer_fd); + + // let handle_callback free the event using the transfer wfd + // If you don't use the transfer wfd, you run a risk of trying to free a + // newly allocated wfd that took the place of the one from the transfer. + windows_handle_callback(priv->backend, itransfer, io_result, io_size); + } else { + usbi_err(ctx, "could not find a matching transfer for fd %d", fds[i].fd); + r = LIBUSB_ERROR_NOT_FOUND; + break; + } + } + usbi_mutex_unlock(&ctx->open_devs_lock); + + return r; +} + +static int windows_clock_gettime(int clk_id, struct timespec *tp) +{ + struct timer_request request; +#if !defined(_MSC_VER) || (_MSC_VER < 1900) + FILETIME filetime; + ULARGE_INTEGER rtime; +#endif + DWORD r; + + switch (clk_id) { + case USBI_CLOCK_MONOTONIC: + if (timer_thread) { + request.tp = tp; + request.event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (request.event == NULL) + return LIBUSB_ERROR_NO_MEM; + + if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_REQUEST, 0, (LPARAM)&request)) { + usbi_err(NULL, "PostThreadMessage failed for timer thread: %s", windows_error_str(0)); + CloseHandle(request.event); + return LIBUSB_ERROR_OTHER; + } + + do { + r = WaitForSingleObject(request.event, TIMER_REQUEST_RETRY_MS); + if (r == WAIT_TIMEOUT) + usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); + else if (r == WAIT_FAILED) + usbi_err(NULL, "WaitForSingleObject failed: %s", windows_error_str(0)); + } while (r == WAIT_TIMEOUT); + CloseHandle(request.event); + + if (r == WAIT_OBJECT_0) + return LIBUSB_SUCCESS; + else + return LIBUSB_ERROR_OTHER; + } + // Fall through and return real-time if monotonic was not detected @ timer init + case USBI_CLOCK_REALTIME: +#if defined(_MSC_VER) && (_MSC_VER >= 1900) + timespec_get(tp, TIME_UTC); +#else + // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx + // with a predef epoch time to have an epoch that starts at 1970.01.01 00:00 + // Note however that our resolution is bounded by the Windows system time + // functions and is at best of the order of 1 ms (or, usually, worse) + GetSystemTimeAsFileTime(&filetime); + rtime.LowPart = filetime.dwLowDateTime; + rtime.HighPart = filetime.dwHighDateTime; + rtime.QuadPart -= EPOCH_TIME; + tp->tv_sec = (long)(rtime.QuadPart / 10000000); + tp->tv_nsec = (long)((rtime.QuadPart % 10000000) * 100); +#endif + return LIBUSB_SUCCESS; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +// NB: MSVC6 does not support named initializers. +const struct usbi_os_backend usbi_backend = { + "Windows", + USBI_CAP_HAS_HID_ACCESS, + windows_init, + windows_exit, + windows_set_option, + windows_get_device_list, + NULL, /* hotplug_poll */ + windows_open, + windows_close, + windows_get_device_descriptor, + windows_get_active_config_descriptor, + windows_get_config_descriptor, + windows_get_config_descriptor_by_value, + windows_get_configuration, + windows_set_configuration, + windows_claim_interface, + windows_release_interface, + windows_set_interface_altsetting, + windows_clear_halt, + windows_reset_device, + NULL, /* alloc_streams */ + NULL, /* free_streams */ + NULL, /* dev_mem_alloc */ + NULL, /* dev_mem_free */ + NULL, /* kernel_driver_active */ + NULL, /* detach_kernel_driver */ + NULL, /* attach_kernel_driver */ + windows_destroy_device, + windows_submit_transfer, + windows_cancel_transfer, + windows_clear_transfer_priv, + windows_handle_events, + NULL, /* handle_transfer_completion */ + windows_clock_gettime, + sizeof(struct windows_context_priv), + sizeof(union windows_device_priv), + sizeof(union windows_device_handle_priv), + sizeof(union windows_transfer_priv), +}; diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_nt_common.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_nt_common.h new file mode 100644 index 000000000000..e155b5d3e3c4 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_nt_common.h @@ -0,0 +1,110 @@ +/* + * Windows backend common header for libusb 1.0 + * + * This file brings together header code common between + * the desktop Windows backends. + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +#include "windows_nt_shared_types.h" + + /* Windows versions */ +enum windows_version { + WINDOWS_UNDEFINED, + WINDOWS_2000, + WINDOWS_XP, + WINDOWS_2003, // Also XP x64 + WINDOWS_VISTA, + WINDOWS_7, + WINDOWS_8, + WINDOWS_8_1, + WINDOWS_10, + WINDOWS_11_OR_LATER +}; + +extern enum windows_version windows_version; + +/* This call is only available from Vista */ +extern BOOL (WINAPI *pCancelIoEx)(HANDLE, LPOVERLAPPED); + +struct windows_backend { + int (*init)(struct libusb_context *ctx); + void (*exit)(struct libusb_context *ctx); + int (*get_device_list)(struct libusb_context *ctx, + struct discovered_devs **discdevs); + int (*open)(struct libusb_device_handle *dev_handle); + void (*close)(struct libusb_device_handle *dev_handle); + int (*get_device_descriptor)(struct libusb_device *device, unsigned char *buffer); + int (*get_active_config_descriptor)(struct libusb_device *device, + unsigned char *buffer, size_t len); + int (*get_config_descriptor)(struct libusb_device *device, + uint8_t config_index, unsigned char *buffer, size_t len); + int (*get_config_descriptor_by_value)(struct libusb_device *device, + uint8_t bConfigurationValue, unsigned char **buffer); + int (*get_configuration)(struct libusb_device_handle *dev_handle, int *config); + int (*set_configuration)(struct libusb_device_handle *dev_handle, int config); + int (*claim_interface)(struct libusb_device_handle *dev_handle, int interface_number); + int (*release_interface)(struct libusb_device_handle *dev_handle, int interface_number); + int (*set_interface_altsetting)(struct libusb_device_handle *dev_handle, + int interface_number, int altsetting); + int (*clear_halt)(struct libusb_device_handle *dev_handle, + unsigned char endpoint); + int (*reset_device)(struct libusb_device_handle *dev_handle); + void (*destroy_device)(struct libusb_device *dev); + int (*submit_transfer)(struct usbi_transfer *itransfer); + int (*cancel_transfer)(struct usbi_transfer *itransfer); + void (*clear_transfer_priv)(struct usbi_transfer *itransfer); + int (*copy_transfer_data)(struct usbi_transfer *itransfer, uint32_t io_size); + int (*get_transfer_fd)(struct usbi_transfer *itransfer); + void (*get_overlapped_result)(struct usbi_transfer *itransfer, + DWORD *io_result, DWORD *io_size); +}; + +struct windows_context_priv { + const struct windows_backend *backend; +}; + +union windows_device_priv { + struct usbdk_device_priv usbdk_priv; + struct winusb_device_priv winusb_priv; +}; + +union windows_device_handle_priv { + struct usbdk_device_handle_priv usbdk_priv; + struct winusb_device_handle_priv winusb_priv; +}; + +union windows_transfer_priv { + struct usbdk_transfer_priv usbdk_priv; + struct winusb_transfer_priv winusb_priv; +}; + +extern const struct windows_backend usbdk_backend; +extern const struct windows_backend winusb_backend; + +unsigned long htab_hash(const char *str); +void windows_force_sync_completion(OVERLAPPED *overlapped, ULONG size); + +#if defined(ENABLE_LOGGING) +const char *windows_error_str(DWORD error_code); +#endif diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_nt_shared_types.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_nt_shared_types.h new file mode 100644 index 000000000000..68bf261d5d6a --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_nt_shared_types.h @@ -0,0 +1,138 @@ +#pragma once + +#include "windows_common.h" + +#include + +typedef struct USB_DEVICE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT bcdUSB; + UCHAR bDeviceClass; + UCHAR bDeviceSubClass; + UCHAR bDeviceProtocol; + UCHAR bMaxPacketSize0; + USHORT idVendor; + USHORT idProduct; + USHORT bcdDevice; + UCHAR iManufacturer; + UCHAR iProduct; + UCHAR iSerialNumber; + UCHAR bNumConfigurations; +} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; + +typedef struct USB_CONFIGURATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT wTotalLength; + UCHAR bNumInterfaces; + UCHAR bConfigurationValue; + UCHAR iConfiguration; + UCHAR bmAttributes; + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; + +#include + +#define MAX_DEVICE_ID_LEN 200 + +typedef struct USB_DK_DEVICE_ID { + WCHAR DeviceID[MAX_DEVICE_ID_LEN]; + WCHAR InstanceID[MAX_DEVICE_ID_LEN]; +} USB_DK_DEVICE_ID, *PUSB_DK_DEVICE_ID; + +typedef struct USB_DK_DEVICE_INFO { + USB_DK_DEVICE_ID ID; + ULONG64 FilterID; + ULONG64 Port; + ULONG64 Speed; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; +} USB_DK_DEVICE_INFO, *PUSB_DK_DEVICE_INFO; + +typedef struct USB_DK_ISO_TRANSFER_RESULT { + ULONG64 ActualLength; + ULONG64 TransferResult; +} USB_DK_ISO_TRANSFER_RESULT, *PUSB_DK_ISO_TRANSFER_RESULT; + +typedef struct USB_DK_GEN_TRANSFER_RESULT { + ULONG64 BytesTransferred; + ULONG64 UsbdStatus; // USBD_STATUS code +} USB_DK_GEN_TRANSFER_RESULT, *PUSB_DK_GEN_TRANSFER_RESULT; + +typedef struct USB_DK_TRANSFER_RESULT { + USB_DK_GEN_TRANSFER_RESULT GenResult; + PVOID64 IsochronousResultsArray; // array of USB_DK_ISO_TRANSFER_RESULT +} USB_DK_TRANSFER_RESULT, *PUSB_DK_TRANSFER_RESULT; + +typedef struct USB_DK_TRANSFER_REQUEST { + ULONG64 EndpointAddress; + PVOID64 Buffer; + ULONG64 BufferLength; + ULONG64 TransferType; + ULONG64 IsochronousPacketsArraySize; + PVOID64 IsochronousPacketsArray; + USB_DK_TRANSFER_RESULT Result; +} USB_DK_TRANSFER_REQUEST, *PUSB_DK_TRANSFER_REQUEST; + +struct usbdk_device_priv { + USB_DK_DEVICE_INFO info; + PUSB_CONFIGURATION_DESCRIPTOR *config_descriptors; + HANDLE redirector_handle; + HANDLE system_handle; + uint8_t active_configuration; +}; + +struct winusb_device_priv { + bool initialized; + bool root_hub; + uint8_t active_config; + uint8_t depth; // distance to HCD + const struct windows_usb_api_backend *apib; + char *dev_id; + char *path; // device interface path + int sub_api; // for WinUSB-like APIs + struct { + char *path; // each interface needs a device interface path, + const struct windows_usb_api_backend *apib; // an API backend (multiple drivers support), + int sub_api; + int8_t nb_endpoints; // and a set of endpoint addresses (USB_MAXENDPOINTS) + uint8_t *endpoint; + bool restricted_functionality; // indicates if the interface functionality is restricted + // by Windows (eg. HID keyboards or mice cannot do R/W) + } usb_interface[USB_MAXINTERFACES]; + struct hid_device_priv *hid; + USB_DEVICE_DESCRIPTOR dev_descriptor; + PUSB_CONFIGURATION_DESCRIPTOR *config_descriptor; // list of pointers to the cached config descriptors +}; + +struct usbdk_device_handle_priv { + // Not currently used + char dummy; +}; + +struct winusb_device_handle_priv { + int active_interface; + struct { + HANDLE dev_handle; // WinUSB needs an extra handle for the file + HANDLE api_handle; // used by the API to communicate with the device + } interface_handle[USB_MAXINTERFACES]; + int autoclaim_count[USB_MAXINTERFACES]; // For auto-release +}; + +struct usbdk_transfer_priv { + USB_DK_TRANSFER_REQUEST request; + struct winfd pollable_fd; + HANDLE system_handle; + PULONG64 IsochronousPacketsArray; + PUSB_DK_ISO_TRANSFER_RESULT IsochronousResultsArray; +}; + +struct winusb_transfer_priv { + struct winfd pollable_fd; + HANDLE handle; + uint8_t interface_number; + uint8_t *hid_buffer; // 1 byte extended data buffer, required for HID + uint8_t *hid_dest; // transfer buffer destination, required for HID + size_t hid_expected_size; + void *iso_context; +}; diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_usbdk.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_usbdk.c new file mode 100644 index 000000000000..fbccbd5cffcb --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_usbdk.c @@ -0,0 +1,830 @@ +/* + * windows UsbDk backend for libusb 1.0 + * Copyright © 2014 Red Hat, Inc. + + * Authors: + * Dmitry Fleytman + * Pavel Gurvich + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include + +#include "libusbi.h" +#include "windows_common.h" +#include "windows_nt_common.h" +#include "windows_usbdk.h" + +#if !defined(STATUS_SUCCESS) +typedef LONG NTSTATUS; +#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) +#endif + +#if !defined(STATUS_CANCELLED) +#define STATUS_CANCELLED ((NTSTATUS)0xC0000120L) +#endif + +#if !defined(STATUS_REQUEST_CANCELED) +#define STATUS_REQUEST_CANCELED ((NTSTATUS)0xC0000703L) +#endif + +#if !defined(USBD_SUCCESS) +typedef LONG USBD_STATUS; +#define USBD_SUCCESS(Status) ((USBD_STATUS) (Status) >= 0) +#define USBD_PENDING(Status) ((ULONG) (Status) >> 30 == 1) +#define USBD_ERROR(Status) ((USBD_STATUS) (Status) < 0) +#define USBD_STATUS_STALL_PID ((USBD_STATUS) 0xc0000004) +#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS) 0xc0000030) +#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS) 0xc0000a00) +#define USBD_STATUS_TIMEOUT ((USBD_STATUS) 0xc0006000) +#define USBD_STATUS_CANCELED ((USBD_STATUS) 0xc0010000) +#endif + +static inline struct usbdk_device_priv *_usbdk_device_priv(struct libusb_device *dev) +{ + return (struct usbdk_device_priv *)dev->os_priv; +} + +static inline struct usbdk_transfer_priv *_usbdk_transfer_priv(struct usbi_transfer *itransfer) +{ + return (struct usbdk_transfer_priv *)usbi_transfer_get_os_priv(itransfer); +} + +static struct { + HMODULE module; + + USBDK_GET_DEVICES_LIST GetDevicesList; + USBDK_RELEASE_DEVICES_LIST ReleaseDevicesList; + USBDK_START_REDIRECT StartRedirect; + USBDK_STOP_REDIRECT StopRedirect; + USBDK_GET_CONFIGURATION_DESCRIPTOR GetConfigurationDescriptor; + USBDK_RELEASE_CONFIGURATION_DESCRIPTOR ReleaseConfigurationDescriptor; + USBDK_READ_PIPE ReadPipe; + USBDK_WRITE_PIPE WritePipe; + USBDK_ABORT_PIPE AbortPipe; + USBDK_RESET_PIPE ResetPipe; + USBDK_SET_ALTSETTING SetAltsetting; + USBDK_RESET_DEVICE ResetDevice; + USBDK_GET_REDIRECTOR_SYSTEM_HANDLE GetRedirectorSystemHandle; +} usbdk_helper; + +static FARPROC get_usbdk_proc_addr(struct libusb_context *ctx, LPCSTR api_name) +{ + FARPROC api_ptr = GetProcAddress(usbdk_helper.module, api_name); + + if (api_ptr == NULL) + usbi_err(ctx, "UsbDkHelper API %s not found: %s", api_name, windows_error_str(0)); + + return api_ptr; +} + +static void unload_usbdk_helper_dll(void) +{ + if (usbdk_helper.module != NULL) { + FreeLibrary(usbdk_helper.module); + usbdk_helper.module = NULL; + } +} + +static int load_usbdk_helper_dll(struct libusb_context *ctx) +{ + usbdk_helper.module = LoadLibraryA("UsbDkHelper"); + if (usbdk_helper.module == NULL) { + usbi_err(ctx, "Failed to load UsbDkHelper.dll: %s", windows_error_str(0)); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbdk_helper.GetDevicesList = (USBDK_GET_DEVICES_LIST)get_usbdk_proc_addr(ctx, "UsbDk_GetDevicesList"); + if (usbdk_helper.GetDevicesList == NULL) + goto error_unload; + + usbdk_helper.ReleaseDevicesList = (USBDK_RELEASE_DEVICES_LIST)get_usbdk_proc_addr(ctx, "UsbDk_ReleaseDevicesList"); + if (usbdk_helper.ReleaseDevicesList == NULL) + goto error_unload; + + usbdk_helper.StartRedirect = (USBDK_START_REDIRECT)get_usbdk_proc_addr(ctx, "UsbDk_StartRedirect"); + if (usbdk_helper.StartRedirect == NULL) + goto error_unload; + + usbdk_helper.StopRedirect = (USBDK_STOP_REDIRECT)get_usbdk_proc_addr(ctx, "UsbDk_StopRedirect"); + if (usbdk_helper.StopRedirect == NULL) + goto error_unload; + + usbdk_helper.GetConfigurationDescriptor = (USBDK_GET_CONFIGURATION_DESCRIPTOR)get_usbdk_proc_addr(ctx, "UsbDk_GetConfigurationDescriptor"); + if (usbdk_helper.GetConfigurationDescriptor == NULL) + goto error_unload; + + usbdk_helper.ReleaseConfigurationDescriptor = (USBDK_RELEASE_CONFIGURATION_DESCRIPTOR)get_usbdk_proc_addr(ctx, "UsbDk_ReleaseConfigurationDescriptor"); + if (usbdk_helper.ReleaseConfigurationDescriptor == NULL) + goto error_unload; + + usbdk_helper.ReadPipe = (USBDK_READ_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_ReadPipe"); + if (usbdk_helper.ReadPipe == NULL) + goto error_unload; + + usbdk_helper.WritePipe = (USBDK_WRITE_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_WritePipe"); + if (usbdk_helper.WritePipe == NULL) + goto error_unload; + + usbdk_helper.AbortPipe = (USBDK_ABORT_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_AbortPipe"); + if (usbdk_helper.AbortPipe == NULL) + goto error_unload; + + usbdk_helper.ResetPipe = (USBDK_RESET_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_ResetPipe"); + if (usbdk_helper.ResetPipe == NULL) + goto error_unload; + + usbdk_helper.SetAltsetting = (USBDK_SET_ALTSETTING)get_usbdk_proc_addr(ctx, "UsbDk_SetAltsetting"); + if (usbdk_helper.SetAltsetting == NULL) + goto error_unload; + + usbdk_helper.ResetDevice = (USBDK_RESET_DEVICE)get_usbdk_proc_addr(ctx, "UsbDk_ResetDevice"); + if (usbdk_helper.ResetDevice == NULL) + goto error_unload; + + usbdk_helper.GetRedirectorSystemHandle = (USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)get_usbdk_proc_addr(ctx, "UsbDk_GetRedirectorSystemHandle"); + if (usbdk_helper.GetRedirectorSystemHandle == NULL) + goto error_unload; + + return LIBUSB_SUCCESS; + +error_unload: + FreeLibrary(usbdk_helper.module); + usbdk_helper.module = NULL; + return LIBUSB_ERROR_NOT_FOUND; +} + +static int usbdk_init(struct libusb_context *ctx) +{ + SC_HANDLE managerHandle; + SC_HANDLE serviceHandle; + + managerHandle = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); + if (managerHandle == NULL) { + usbi_warn(ctx, "failed to open service control manager: %s", windows_error_str(0)); + return LIBUSB_ERROR_OTHER; + } + + serviceHandle = OpenServiceA(managerHandle, "UsbDk", GENERIC_READ); + CloseServiceHandle(managerHandle); + + if (serviceHandle == NULL) { + if (GetLastError() != ERROR_SERVICE_DOES_NOT_EXIST) + usbi_warn(ctx, "failed to open UsbDk service: %s", windows_error_str(0)); + return LIBUSB_ERROR_NOT_FOUND; + } + + CloseServiceHandle(serviceHandle); + + return load_usbdk_helper_dll(ctx); +} + +static void usbdk_exit(struct libusb_context *ctx) +{ + UNUSED(ctx); + unload_usbdk_helper_dll(); +} + +static int usbdk_get_session_id_for_device(struct libusb_context *ctx, + PUSB_DK_DEVICE_ID id, unsigned long *session_id) +{ + char dev_identity[ARRAYSIZE(id->DeviceID) + ARRAYSIZE(id->InstanceID) + 1]; + + if (snprintf(dev_identity, sizeof(dev_identity), "%S%S", id->DeviceID, id->InstanceID) == -1) { + usbi_warn(ctx, "cannot form device identity", id->DeviceID); + return LIBUSB_ERROR_NOT_SUPPORTED; + } + + *session_id = htab_hash(dev_identity); + + return LIBUSB_SUCCESS; +} + +static void usbdk_release_config_descriptors(struct usbdk_device_priv *p, uint8_t count) +{ + uint8_t i; + + for (i = 0; i < count; i++) + usbdk_helper.ReleaseConfigurationDescriptor(p->config_descriptors[i]); + + free(p->config_descriptors); + p->config_descriptors = NULL; +} + +static int usbdk_cache_config_descriptors(struct libusb_context *ctx, + struct usbdk_device_priv *p, PUSB_DK_DEVICE_INFO info) +{ + uint8_t i; + USB_DK_CONFIG_DESCRIPTOR_REQUEST Request; + Request.ID = info->ID; + + p->config_descriptors = calloc(info->DeviceDescriptor.bNumConfigurations, sizeof(PUSB_CONFIGURATION_DESCRIPTOR)); + if (p->config_descriptors == NULL) { + usbi_err(ctx, "failed to allocate configuration descriptors holder"); + return LIBUSB_ERROR_NO_MEM; + } + + for (i = 0; i < info->DeviceDescriptor.bNumConfigurations; i++) { + ULONG Length; + + Request.Index = i; + if (!usbdk_helper.GetConfigurationDescriptor(&Request, &p->config_descriptors[i], &Length)) { + usbi_err(ctx, "failed to retrieve configuration descriptors"); + usbdk_release_config_descriptors(p, i); + return LIBUSB_ERROR_OTHER; + } + } + + return LIBUSB_SUCCESS; +} + +static inline int usbdk_device_priv_init(struct libusb_context *ctx, struct libusb_device *dev, PUSB_DK_DEVICE_INFO info) +{ + struct usbdk_device_priv *p = _usbdk_device_priv(dev); + + p->info = *info; + p->active_configuration = 0; + + return usbdk_cache_config_descriptors(ctx, p, info); +} + +static void usbdk_device_init(libusb_device *dev, PUSB_DK_DEVICE_INFO info) +{ + dev->bus_number = (uint8_t)info->FilterID; + dev->port_number = (uint8_t)info->Port; + dev->parent_dev = NULL; + + // Addresses in libusb are 1-based + dev->device_address = (uint8_t)(info->Port + 1); + + dev->num_configurations = info->DeviceDescriptor.bNumConfigurations; + memcpy(&dev->device_descriptor, &info->DeviceDescriptor, LIBUSB_DT_DEVICE_SIZE); + + switch (info->Speed) { + case LowSpeed: + dev->speed = LIBUSB_SPEED_LOW; + break; + case FullSpeed: + dev->speed = LIBUSB_SPEED_FULL; + break; + case HighSpeed: + dev->speed = LIBUSB_SPEED_HIGH; + break; + case SuperSpeed: + dev->speed = LIBUSB_SPEED_SUPER; + break; + case NoSpeed: + default: + dev->speed = LIBUSB_SPEED_UNKNOWN; + break; + } +} + +static int usbdk_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) +{ + int r = LIBUSB_SUCCESS; + ULONG i; + struct discovered_devs *discdevs = NULL; + ULONG dev_number; + PUSB_DK_DEVICE_INFO devices; + + if (!usbdk_helper.GetDevicesList(&devices, &dev_number)) + return LIBUSB_ERROR_OTHER; + + for (i = 0; i < dev_number; i++) { + unsigned long session_id; + struct libusb_device *dev = NULL; + + if (usbdk_get_session_id_for_device(ctx, &devices[i].ID, &session_id)) + continue; + + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev == NULL) { + dev = usbi_alloc_device(ctx, session_id); + if (dev == NULL) { + usbi_err(ctx, "failed to allocate a new device structure"); + continue; + } + + usbdk_device_init(dev, &devices[i]); + if (usbdk_device_priv_init(ctx, dev, &devices[i]) != LIBUSB_SUCCESS) { + libusb_unref_device(dev); + continue; + } + } + + discdevs = discovered_devs_append(*_discdevs, dev); + libusb_unref_device(dev); + if (!discdevs) { + usbi_err(ctx, "cannot append new device to list"); + r = LIBUSB_ERROR_NO_MEM; + goto func_exit; + } + + *_discdevs = discdevs; + } + +func_exit: + usbdk_helper.ReleaseDevicesList(devices); + return r; +} + +static int usbdk_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev); + + memcpy(buffer, &priv->info.DeviceDescriptor, DEVICE_DESC_LENGTH); + + return LIBUSB_SUCCESS; +} + +static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + size_t size; + + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_INVALID_PARAM; + + config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptors[config_index]; + + size = min(config_header->wTotalLength, len); + memcpy(buffer, config_header, size); + return (int)size; +} + +static int usbdk_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue, + unsigned char **buffer) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + uint8_t index; + + for (index = 0; index < dev->num_configurations; index++) { + config_header = priv->config_descriptors[index]; + if (config_header->bConfigurationValue == bConfigurationValue) { + *buffer = (unsigned char *)priv->config_descriptors[index]; + return (int)config_header->wTotalLength; + } + } + + return LIBUSB_ERROR_NOT_FOUND; +} + +static int usbdk_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len) +{ + return usbdk_get_config_descriptor(dev, _usbdk_device_priv(dev)->active_configuration, + buffer, len); +} + +static int usbdk_open(struct libusb_device_handle *dev_handle) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + priv->redirector_handle = usbdk_helper.StartRedirect(&priv->info.ID); + if (priv->redirector_handle == INVALID_HANDLE_VALUE) { + usbi_err(DEVICE_CTX(dev_handle->dev), "Redirector startup failed"); + return LIBUSB_ERROR_OTHER; + } + + priv->system_handle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); + + return LIBUSB_SUCCESS; +} + +static void usbdk_close(struct libusb_device_handle *dev_handle) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.StopRedirect(priv->redirector_handle)) + usbi_err(HANDLE_CTX(dev_handle), "Redirector shutdown failed"); +} + +static int usbdk_get_configuration(struct libusb_device_handle *dev_handle, int *config) +{ + *config = _usbdk_device_priv(dev_handle->dev)->active_configuration; + + return LIBUSB_SUCCESS; +} + +static int usbdk_set_configuration(struct libusb_device_handle *dev_handle, int config) +{ + UNUSED(dev_handle); + UNUSED(config); + return LIBUSB_SUCCESS; +} + +static int usbdk_claim_interface(struct libusb_device_handle *dev_handle, int iface) +{ + UNUSED(dev_handle); + UNUSED(iface); + return LIBUSB_SUCCESS; +} + +static int usbdk_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct libusb_context *ctx = HANDLE_CTX(dev_handle); + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.SetAltsetting(priv->redirector_handle, iface, altsetting)) { + usbi_err(ctx, "SetAltsetting failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_release_interface(struct libusb_device_handle *dev_handle, int iface) +{ + UNUSED(dev_handle); + UNUSED(iface); + return LIBUSB_SUCCESS; +} + +static int usbdk_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = HANDLE_CTX(dev_handle); + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.ResetPipe(priv->redirector_handle, endpoint)) { + usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_reset_device(struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = HANDLE_CTX(dev_handle); + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.ResetDevice(priv->redirector_handle)) { + usbi_err(ctx, "ResetDevice failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static void usbdk_destroy_device(struct libusb_device *dev) +{ + struct usbdk_device_priv* p = _usbdk_device_priv(dev); + + if (p->config_descriptors != NULL) + usbdk_release_config_descriptors(p, p->info.DeviceDescriptor.bNumConfigurations); +} + +static void usbdk_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + usbi_close(transfer_priv->pollable_fd.fd); + transfer_priv->pollable_fd = INVALID_WINFD; + transfer_priv->system_handle = NULL; + + if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { + safe_free(transfer_priv->IsochronousPacketsArray); + safe_free(transfer_priv->IsochronousResultsArray); + } +} + +static int usbdk_do_control_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_context *ctx = TRANSFER_CTX(transfer); + OVERLAPPED *overlapped = transfer_priv->pollable_fd.overlapped; + TransferResult transResult; + + transfer_priv->request.Buffer = (PVOID64)transfer->buffer; + transfer_priv->request.BufferLength = transfer->length; + transfer_priv->request.TransferType = ControlTransferType; + + if (transfer->buffer[0] & LIBUSB_ENDPOINT_IN) + transResult = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, overlapped); + else + transResult = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, overlapped); + + switch (transResult) { + case TransferSuccess: + windows_force_sync_completion(overlapped, (ULONG)transfer_priv->request.Result.GenResult.BytesTransferred); + break; + case TransferSuccessAsync: + break; + case TransferFailure: + usbi_err(ctx, "ControlTransfer failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_context *ctx = TRANSFER_CTX(transfer); + OVERLAPPED *overlapped = transfer_priv->pollable_fd.overlapped; + TransferResult transferRes; + + transfer_priv->request.Buffer = (PVOID64)transfer->buffer; + transfer_priv->request.BufferLength = transfer->length; + transfer_priv->request.EndpointAddress = transfer->endpoint; + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_BULK: + transfer_priv->request.TransferType = BulkTransferType; + break; + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + transfer_priv->request.TransferType = InterruptTransferType; + break; + default: + usbi_err(ctx, "Wrong transfer type (%d) in usbdk_do_bulk_transfer", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } + + if (IS_XFERIN(transfer)) + transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, overlapped); + else + transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, overlapped); + + switch (transferRes) { + case TransferSuccess: + windows_force_sync_completion(overlapped, (ULONG)transfer_priv->request.Result.GenResult.BytesTransferred); + break; + case TransferSuccessAsync: + break; + case TransferFailure: + usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_do_iso_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_context *ctx = TRANSFER_CTX(transfer); + OVERLAPPED *overlapped = transfer_priv->pollable_fd.overlapped; + TransferResult transferRes; + int i; + + transfer_priv->request.Buffer = (PVOID64)transfer->buffer; + transfer_priv->request.BufferLength = transfer->length; + transfer_priv->request.EndpointAddress = transfer->endpoint; + transfer_priv->request.TransferType = IsochronousTransferType; + transfer_priv->request.IsochronousPacketsArraySize = transfer->num_iso_packets; + transfer_priv->IsochronousPacketsArray = malloc(transfer->num_iso_packets * sizeof(ULONG64)); + transfer_priv->request.IsochronousPacketsArray = (PVOID64)transfer_priv->IsochronousPacketsArray; + if (!transfer_priv->IsochronousPacketsArray) { + usbi_err(ctx, "Allocation of IsochronousPacketsArray failed"); + return LIBUSB_ERROR_NO_MEM; + } + + transfer_priv->IsochronousResultsArray = malloc(transfer->num_iso_packets * sizeof(USB_DK_ISO_TRANSFER_RESULT)); + transfer_priv->request.Result.IsochronousResultsArray = (PVOID64)transfer_priv->IsochronousResultsArray; + if (!transfer_priv->IsochronousResultsArray) { + usbi_err(ctx, "Allocation of isochronousResultsArray failed"); + return LIBUSB_ERROR_NO_MEM; + } + + for (i = 0; i < transfer->num_iso_packets; i++) + transfer_priv->IsochronousPacketsArray[i] = transfer->iso_packet_desc[i].length; + + if (IS_XFERIN(transfer)) + transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, overlapped); + else + transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, overlapped); + + switch (transferRes) { + case TransferSuccess: + windows_force_sync_completion(overlapped, (ULONG)transfer_priv->request.Result.GenResult.BytesTransferred); + break; + case TransferSuccessAsync: + break; + case TransferFailure: + return LIBUSB_ERROR_IO; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_do_submit_transfer(struct usbi_transfer *itransfer, + short events, int (*transfer_fn)(struct usbi_transfer *)) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = TRANSFER_CTX(transfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct winfd wfd; + int r; + + wfd = usbi_create_fd(); + if (wfd.fd < 0) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_add_pollfd(ctx, wfd.fd, events); + if (r) { + usbi_close(wfd.fd); + return r; + } + + // Use transfer_priv to store data needed for async polling + transfer_priv->pollable_fd = wfd; + transfer_priv->system_handle = priv->system_handle; + + r = transfer_fn(itransfer); + if (r != LIBUSB_SUCCESS) { + usbi_remove_pollfd(ctx, wfd.fd); + usbdk_clear_transfer_priv(itransfer); + return r; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + int (*transfer_fn)(struct usbi_transfer *); + short events; + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + events = (transfer->buffer[0] & LIBUSB_ENDPOINT_IN) ? POLLIN : POLLOUT; + transfer_fn = usbdk_do_control_transfer; + break; + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)) + return LIBUSB_ERROR_NOT_SUPPORTED; //TODO: Check whether we can support this in UsbDk + events = IS_XFERIN(transfer) ? POLLIN : POLLOUT; + transfer_fn = usbdk_do_bulk_transfer; + break; + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + events = IS_XFERIN(transfer) ? POLLIN : POLLOUT; + transfer_fn = usbdk_do_iso_transfer; + break; + default: + usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } + + return usbdk_do_submit_transfer(itransfer, events, transfer_fn); +} + +static int usbdk_abort_transfers(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = TRANSFER_CTX(transfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct winfd *pollable_fd = &transfer_priv->pollable_fd; + + if (pCancelIoEx != NULL) { + // Use CancelIoEx if available to cancel just a single transfer + if (!pCancelIoEx(priv->system_handle, pollable_fd->overlapped)) { + usbi_err(ctx, "CancelIoEx failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + } else { + if (!usbdk_helper.AbortPipe(priv->redirector_handle, transfer->endpoint)) { + usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + // Control transfers cancelled by IoCancelXXX() API + // No special treatment needed + return LIBUSB_SUCCESS; + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return usbdk_abort_transfers(itransfer); + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int usbdk_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) +{ + itransfer->transferred += io_size; + return LIBUSB_TRANSFER_COMPLETED; +} + +static int usbdk_get_transfer_fd(struct usbi_transfer *itransfer) +{ + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + return transfer_priv->pollable_fd.fd; +} + +static DWORD usbdk_translate_usbd_status(USBD_STATUS UsbdStatus) +{ + if (USBD_SUCCESS(UsbdStatus)) + return NO_ERROR; + + switch (UsbdStatus) { + case USBD_STATUS_TIMEOUT: + return ERROR_SEM_TIMEOUT; + case USBD_STATUS_CANCELED: + return ERROR_OPERATION_ABORTED; + default: + return ERROR_GEN_FAILURE; + } +} + +static void usbdk_get_overlapped_result(struct usbi_transfer *itransfer, DWORD *io_result, DWORD *io_size) +{ + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct winfd *pollable_fd = &transfer_priv->pollable_fd; + + if (HasOverlappedIoCompletedSync(pollable_fd->overlapped) // Handle async requests that completed synchronously first + || GetOverlappedResult(transfer_priv->system_handle, pollable_fd->overlapped, io_size, FALSE)) { // Regular async overlapped + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { + ULONG64 i; + for (i = 0; i < transfer_priv->request.IsochronousPacketsArraySize; i++) { + struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[i]; + + switch (transfer_priv->IsochronousResultsArray[i].TransferResult) { + case STATUS_SUCCESS: + case STATUS_CANCELLED: + case STATUS_REQUEST_CANCELED: + lib_desc->status = LIBUSB_TRANSFER_COMPLETED; // == ERROR_SUCCESS + break; + default: + lib_desc->status = LIBUSB_TRANSFER_ERROR; // ERROR_UNKNOWN_EXCEPTION; + break; + } + + lib_desc->actual_length = (unsigned int)transfer_priv->IsochronousResultsArray[i].ActualLength; + } + } + + *io_size = (DWORD)transfer_priv->request.Result.GenResult.BytesTransferred; + *io_result = usbdk_translate_usbd_status((USBD_STATUS)transfer_priv->request.Result.GenResult.UsbdStatus); + } else { + *io_result = GetLastError(); + } +} + +const struct windows_backend usbdk_backend = { + usbdk_init, + usbdk_exit, + usbdk_get_device_list, + usbdk_open, + usbdk_close, + usbdk_get_device_descriptor, + usbdk_get_active_config_descriptor, + usbdk_get_config_descriptor, + usbdk_get_config_descriptor_by_value, + usbdk_get_configuration, + usbdk_set_configuration, + usbdk_claim_interface, + usbdk_release_interface, + usbdk_set_interface_altsetting, + usbdk_clear_halt, + usbdk_reset_device, + usbdk_destroy_device, + usbdk_submit_transfer, + usbdk_cancel_transfer, + usbdk_clear_transfer_priv, + usbdk_copy_transfer_data, + usbdk_get_transfer_fd, + usbdk_get_overlapped_result, +}; diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_usbdk.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_usbdk.h new file mode 100644 index 000000000000..77660ae97ffc --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_usbdk.h @@ -0,0 +1,103 @@ +/* +* windows UsbDk backend for libusb 1.0 +* Copyright © 2014 Red Hat, Inc. + +* Authors: +* Dmitry Fleytman +* Pavel Gurvich +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#pragma once + +#include "windows_nt_common.h" + +typedef struct USB_DK_CONFIG_DESCRIPTOR_REQUEST { + USB_DK_DEVICE_ID ID; + ULONG64 Index; +} USB_DK_CONFIG_DESCRIPTOR_REQUEST, *PUSB_DK_CONFIG_DESCRIPTOR_REQUEST; + +typedef enum { + TransferFailure = 0, + TransferSuccess, + TransferSuccessAsync +} TransferResult; + +typedef enum { + NoSpeed = 0, + LowSpeed, + FullSpeed, + HighSpeed, + SuperSpeed +} USB_DK_DEVICE_SPEED; + +typedef enum { + ControlTransferType, + BulkTransferType, + InterruptTransferType, + IsochronousTransferType +} USB_DK_TRANSFER_TYPE; + +typedef BOOL (__cdecl *USBDK_GET_DEVICES_LIST)( + PUSB_DK_DEVICE_INFO *DeviceInfo, + PULONG DeviceNumber +); +typedef void (__cdecl *USBDK_RELEASE_DEVICES_LIST)( + PUSB_DK_DEVICE_INFO DeviceInfo +); +typedef HANDLE (__cdecl *USBDK_START_REDIRECT)( + PUSB_DK_DEVICE_ID DeviceId +); +typedef BOOL (__cdecl *USBDK_STOP_REDIRECT)( + HANDLE DeviceHandle +); +typedef BOOL (__cdecl *USBDK_GET_CONFIGURATION_DESCRIPTOR)( + PUSB_DK_CONFIG_DESCRIPTOR_REQUEST Request, + PUSB_CONFIGURATION_DESCRIPTOR *Descriptor, + PULONG Length +); +typedef void (__cdecl *USBDK_RELEASE_CONFIGURATION_DESCRIPTOR)( + PUSB_CONFIGURATION_DESCRIPTOR Descriptor +); +typedef TransferResult (__cdecl *USBDK_WRITE_PIPE)( + HANDLE DeviceHandle, + PUSB_DK_TRANSFER_REQUEST Request, + LPOVERLAPPED lpOverlapped +); +typedef TransferResult (__cdecl *USBDK_READ_PIPE)( + HANDLE DeviceHandle, + PUSB_DK_TRANSFER_REQUEST Request, + LPOVERLAPPED lpOverlapped +); +typedef BOOL (__cdecl *USBDK_ABORT_PIPE)( + HANDLE DeviceHandle, + ULONG64 PipeAddress +); +typedef BOOL (__cdecl *USBDK_RESET_PIPE)( + HANDLE DeviceHandle, + ULONG64 PipeAddress +); +typedef BOOL (__cdecl *USBDK_SET_ALTSETTING)( + HANDLE DeviceHandle, + ULONG64 InterfaceIdx, + ULONG64 AltSettingIdx +); +typedef BOOL (__cdecl *USBDK_RESET_DEVICE)( + HANDLE DeviceHandle +); +typedef HANDLE (__cdecl *USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)( + HANDLE DeviceHandle +); diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_winusb.c b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_winusb.c new file mode 100644 index 000000000000..ce1b55cd61b0 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_winusb.c @@ -0,0 +1,3009 @@ +/* + * windows backend for libusb 1.0 + * Copyright © 2009-2012 Pete Batard + * Copyright © 2016-2018 Chris Dickens + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software + * Hash table functions adapted from glibc, by Ulrich Drepper et al. + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libusbi.h" +#include "windows_common.h" +#include "windows_nt_common.h" +#include "windows_winusb.h" + +// Unfuckup the 'inferface' keyword +#undef interface + +#define HANDLE_VALID(h) (((h) != NULL) && ((h) != INVALID_HANDLE_VALUE)) + +// The 2 macros below are used in conjunction with safe loops. +#define LOOP_CHECK(fcall) \ + { \ + r = fcall; \ + if (r != LIBUSB_SUCCESS) \ + continue; \ + } +#define LOOP_BREAK(err) \ + { \ + r = err; \ + continue; \ + } + +// WinUSB-like API prototypes +static int winusbx_init(struct libusb_context *ctx); +static void winusbx_exit(void); +static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle); +static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle); +static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); +static int winusbx_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); +static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle); +static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); +// Composite API prototypes +static int composite_open(int sub_api, struct libusb_device_handle *dev_handle); +static void composite_close(int sub_api, struct libusb_device_handle *dev_handle); +static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); +static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); +static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); +static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer); +static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); +static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer); +static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer); +static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle); +static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); + +static usbi_mutex_t autoclaim_lock; + +// API globals +static HMODULE WinUSBX_handle = NULL; +static struct winusb_interface WinUSBX[SUB_API_MAX]; +#define CHECK_WINUSBX_AVAILABLE(sub_api) \ + do { \ + if (sub_api == SUB_API_NOTSET) \ + sub_api = priv->sub_api; \ + if (!WinUSBX[sub_api].initialized) \ + return LIBUSB_ERROR_ACCESS; \ + } while (0) + +static bool api_hid_available = false; +#define CHECK_HID_AVAILABLE \ + do { \ + if (!api_hid_available) \ + return LIBUSB_ERROR_ACCESS; \ + } while (0) + +#if defined(ENABLE_LOGGING) +static const char *guid_to_string(const GUID *guid) +{ + static char guid_string[MAX_GUID_STRING_LENGTH]; + + if (guid == NULL) + return ""; + + sprintf(guid_string, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + (unsigned int)guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); + + return guid_string; +} +#endif + +/* + * Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes. + * Return an allocated sanitized string or NULL on error. + */ +static char *sanitize_path(const char *path) +{ + const char root_prefix[] = {'\\', '\\', '.', '\\'}; + size_t j, size; + char *ret_path; + size_t add_root = 0; + + if (path == NULL) + return NULL; + + size = strlen(path) + 1; + + // Microsoft indiscriminately uses '\\?\', '\\.\', '##?#" or "##.#" for root prefixes. + if (!((size > 3) && (((path[0] == '\\') && (path[1] == '\\') && (path[3] == '\\')) + || ((path[0] == '#') && (path[1] == '#') && (path[3] == '#'))))) { + add_root = sizeof(root_prefix); + size += add_root; + } + + ret_path = malloc(size); + if (ret_path == NULL) + return NULL; + + strcpy(&ret_path[add_root], path); + + // Ensure consistency with root prefix + memcpy(ret_path, root_prefix, sizeof(root_prefix)); + + // Same goes for '\' and '#' after the root prefix. Ensure '#' is used + for (j = sizeof(root_prefix); j < size; j++) { + ret_path[j] = (char)toupper((int)ret_path[j]); // Fix case too + if (ret_path[j] == '\\') + ret_path[j] = '#'; + } + + return ret_path; +} + +/* + * Cfgmgr32, AdvAPI32, OLE32 and SetupAPI DLL functions + */ +static BOOL init_dlls(void) +{ + DLL_GET_HANDLE(Cfgmgr32); + DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Parent, TRUE); + DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Child, TRUE); + + // Prefixed to avoid conflict with header files + DLL_GET_HANDLE(AdvAPI32); + DLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegQueryValueExW, TRUE); + DLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegCloseKey, TRUE); + + DLL_GET_HANDLE(OLE32); + DLL_LOAD_FUNC_PREFIXED(OLE32, p, IIDFromString, TRUE); + + DLL_GET_HANDLE(SetupAPI); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetClassDevsA, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInfo, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInterfaces, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceInstanceIdA, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceInterfaceDetailA, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceRegistryPropertyA, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiDestroyDeviceInfoList, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDevRegKey, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDeviceInterfaceRegKey, TRUE); + + return TRUE; +} + +static void exit_dlls(void) +{ + DLL_FREE_HANDLE(Cfgmgr32); + DLL_FREE_HANDLE(AdvAPI32); + DLL_FREE_HANDLE(OLE32); + DLL_FREE_HANDLE(SetupAPI); +} + +/* + * enumerate interfaces for the whole USB class + * + * Parameters: + * dev_info: a pointer to a dev_info list + * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) + * enumerator: the generic USB class for which to retrieve interface details + * index: zero based index of the interface in the device info list + * + * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA + * structure returned and call this function repeatedly using the same guid (with an + * incremented index starting at zero) until all interfaces have been returned. + */ +static bool get_devinfo_data(struct libusb_context *ctx, + HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const char *enumerator, unsigned _index) +{ + if (_index == 0) { + *dev_info = pSetupDiGetClassDevsA(NULL, enumerator, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); + if (*dev_info == INVALID_HANDLE_VALUE) { + usbi_err(ctx, "could not obtain device info set for PnP enumerator '%s': %s", + enumerator, windows_error_str(0)); + return false; + } + } + + dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) + usbi_err(ctx, "could not obtain device info data for PnP enumerator '%s' index %u: %s", + enumerator, _index, windows_error_str(0)); + + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return false; + } + return true; +} + +/* + * enumerate interfaces for a specific GUID + * + * Parameters: + * dev_info: a pointer to a dev_info list + * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) + * guid: the GUID for which to retrieve interface details + * index: zero based index of the interface in the device info list + * + * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA + * structure returned and call this function repeatedly using the same guid (with an + * incremented index starting at zero) until all interfaces have been returned. + */ +static int get_interface_details(struct libusb_context *ctx, HDEVINFO dev_info, + PSP_DEVINFO_DATA dev_info_data, LPCGUID guid, DWORD *_index, char **dev_interface_path) +{ + SP_DEVICE_INTERFACE_DATA dev_interface_data; + PSP_DEVICE_INTERFACE_DETAIL_DATA_A dev_interface_details; + DWORD size; + + dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); + dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + for (;;) { + if (!pSetupDiEnumDeviceInfo(dev_info, *_index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain device info data for %s index %u: %s", + guid_to_string(guid), *_index, windows_error_str(0)); + return LIBUSB_ERROR_OTHER; + } + + // No more devices + return LIBUSB_SUCCESS; + } + + // Always advance the index for the next iteration + (*_index)++; + + if (pSetupDiEnumDeviceInterfaces(dev_info, dev_info_data, guid, 0, &dev_interface_data)) + break; + + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain interface data for %s devInst %X: %s", + guid_to_string(guid), dev_info_data->DevInst, windows_error_str(0)); + return LIBUSB_ERROR_OTHER; + } + + // Device does not have an interface matching this GUID, skip + } + + // Read interface data (dummy + actual) to access the device path + if (!pSetupDiGetDeviceInterfaceDetailA(dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { + // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + usbi_err(ctx, "could not access interface data (dummy) for %s devInst %X: %s", + guid_to_string(guid), dev_info_data->DevInst, windows_error_str(0)); + return LIBUSB_ERROR_OTHER; + } + } else { + usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong"); + return LIBUSB_ERROR_OTHER; + } + + dev_interface_details = malloc(size); + if (dev_interface_details == NULL) { + usbi_err(ctx, "could not allocate interface data for %s devInst %X", + guid_to_string(guid), dev_info_data->DevInst); + return LIBUSB_ERROR_NO_MEM; + } + + dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + if (!pSetupDiGetDeviceInterfaceDetailA(dev_info, &dev_interface_data, + dev_interface_details, size, NULL, NULL)) { + usbi_err(ctx, "could not access interface data (actual) for %s devInst %X: %s", + guid_to_string(guid), dev_info_data->DevInst, windows_error_str(0)); + free(dev_interface_details); + return LIBUSB_ERROR_OTHER; + } + + *dev_interface_path = sanitize_path(dev_interface_details->DevicePath); + free(dev_interface_details); + + if (*dev_interface_path == NULL) { + usbi_err(ctx, "could not allocate interface path for %s devInst %X", + guid_to_string(guid), dev_info_data->DevInst); + return LIBUSB_ERROR_NO_MEM; + } + + return LIBUSB_SUCCESS; +} + +/* For libusb0 filter */ +static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details_filter(struct libusb_context *ctx, + HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID *guid, unsigned _index, char *filter_path) +{ + SP_DEVICE_INTERFACE_DATA dev_interface_data; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details; + DWORD size; + + if (_index == 0) + *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); + + if (dev_info_data != NULL) { + dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) + usbi_err(ctx, "Could not obtain device info data for index %u: %s", + _index, windows_error_str(0)); + + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + } + + dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) + usbi_err(ctx, "Could not obtain interface data for index %u: %s", + _index, windows_error_str(0)); + + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + + // Read interface data (dummy + actual) to access the device path + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { + // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", + _index, windows_error_str(0)); + goto err_exit; + } + } else { + usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); + goto err_exit; + } + + dev_interface_details = calloc(1, size); + if (dev_interface_details == NULL) { + usbi_err(ctx, "could not allocate interface data for index %u.", _index); + goto err_exit; + } + + dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, dev_interface_details, size, &size, NULL)) + usbi_err(ctx, "could not access interface data (actual) for index %u: %s", + _index, windows_error_str(0)); + + // [trobinso] lookup the libusb0 symbolic index. + if (dev_interface_details) { + HKEY hkey_device_interface = pSetupDiOpenDeviceInterfaceRegKey(*dev_info, &dev_interface_data, 0, KEY_READ); + if (hkey_device_interface != INVALID_HANDLE_VALUE) { + DWORD libusb0_symboliclink_index = 0; + DWORD value_length = sizeof(DWORD); + DWORD value_type = 0; + LONG status; + + status = pRegQueryValueExW(hkey_device_interface, L"LUsb0", NULL, &value_type, + (LPBYTE)&libusb0_symboliclink_index, &value_length); + if (status == ERROR_SUCCESS) { + if (libusb0_symboliclink_index < 256) { + // libusb0.sys is connected to this device instance. + // If the the device interface guid is {F9F3FF14-AE21-48A0-8A25-8011A7A931D9} then it's a filter. + sprintf(filter_path, "\\\\.\\libusb0-%04u", (unsigned int)libusb0_symboliclink_index); + usbi_dbg("assigned libusb0 symbolic link %s", filter_path); + } else { + // libusb0.sys was connected to this device instance at one time; but not anymore. + } + } + pRegCloseKey(hkey_device_interface); + } + } + + return dev_interface_details; + +err_exit: + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; +} + +/* + * Returns the first known ancestor of a device + */ +static struct libusb_device *get_ancestor(struct libusb_context *ctx, + DEVINST devinst, PDEVINST _parent_devinst) +{ + struct libusb_device *dev = NULL; + DEVINST parent_devinst; + + while (dev == NULL) { + if (CM_Get_Parent(&parent_devinst, devinst, 0) != CR_SUCCESS) + break; + devinst = parent_devinst; + dev = usbi_get_device_by_session_id(ctx, (unsigned long)devinst); + } + + if ((dev != NULL) && (_parent_devinst != NULL)) + *_parent_devinst = devinst; + + return dev; +} + +/* + * Determine which interface the given endpoint address belongs to + */ +static int get_interface_by_endpoint(struct libusb_config_descriptor *conf_desc, uint8_t ep) +{ + const struct libusb_interface *intf; + const struct libusb_interface_descriptor *intf_desc; + int i, j, k; + + for (i = 0; i < conf_desc->bNumInterfaces; i++) { + intf = &conf_desc->interface[i]; + for (j = 0; j < intf->num_altsetting; j++) { + intf_desc = &intf->altsetting[j]; + for (k = 0; k < intf_desc->bNumEndpoints; k++) { + if (intf_desc->endpoint[k].bEndpointAddress == ep) { + usbi_dbg("found endpoint %02X on interface %d", intf_desc->bInterfaceNumber, i); + return intf_desc->bInterfaceNumber; + } + } + } + } + + usbi_dbg("endpoint %02X not found on any interface", ep); + return LIBUSB_ERROR_NOT_FOUND; +} + +/* + * Populate the endpoints addresses of the device_priv interface helper structs + */ +static int windows_assign_endpoints(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + int i, r; + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + struct libusb_config_descriptor *conf_desc; + const struct libusb_interface_descriptor *if_desc; + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + + r = libusb_get_active_config_descriptor(dev_handle->dev, &conf_desc); + if (r != LIBUSB_SUCCESS) { + usbi_warn(ctx, "could not read config descriptor: error %d", r); + return r; + } + + if_desc = &conf_desc->interface[iface].altsetting[altsetting]; + safe_free(priv->usb_interface[iface].endpoint); + + if (if_desc->bNumEndpoints == 0) { + usbi_dbg("no endpoints found for interface %d", iface); + libusb_free_config_descriptor(conf_desc); + return LIBUSB_SUCCESS; + } + + priv->usb_interface[iface].endpoint = malloc(if_desc->bNumEndpoints); + if (priv->usb_interface[iface].endpoint == NULL) { + libusb_free_config_descriptor(conf_desc); + return LIBUSB_ERROR_NO_MEM; + } + + priv->usb_interface[iface].nb_endpoints = if_desc->bNumEndpoints; + for (i = 0; i < if_desc->bNumEndpoints; i++) { + priv->usb_interface[iface].endpoint[i] = if_desc->endpoint[i].bEndpointAddress; + usbi_dbg("(re)assigned endpoint %02X to interface %d", priv->usb_interface[iface].endpoint[i], iface); + } + libusb_free_config_descriptor(conf_desc); + + // Extra init may be required to configure endpoints + if (priv->apib->configure_endpoints) + r = priv->apib->configure_endpoints(SUB_API_NOTSET, dev_handle, iface); + + return r; +} + +// Lookup for a match in the list of API driver names +// return -1 if not found, driver match number otherwise +static int get_sub_api(char *driver, int api) +{ + int i; + const char sep_str[2] = {LIST_SEPARATOR, 0}; + char *tok, *tmp_str; + size_t len = strlen(driver); + + if (len == 0) + return SUB_API_NOTSET; + + tmp_str = _strdup(driver); + if (tmp_str == NULL) + return SUB_API_NOTSET; + + tok = strtok(tmp_str, sep_str); + while (tok != NULL) { + for (i = 0; i < usb_api_backend[api].nb_driver_names; i++) { + if (_stricmp(tok, usb_api_backend[api].driver_name_list[i]) == 0) { + free(tmp_str); + return i; + } + } + tok = strtok(NULL, sep_str); + } + + free(tmp_str); + return SUB_API_NOTSET; +} + +/* + * auto-claiming and auto-release helper functions + */ +static int auto_claim(struct libusb_transfer *transfer, int *interface_number, int api_type) +{ + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv( + transfer->dev_handle); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface = *interface_number; + int r = LIBUSB_SUCCESS; + + switch (api_type) { + case USB_API_WINUSBX: + case USB_API_HID: + break; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } + + usbi_mutex_lock(&autoclaim_lock); + if (current_interface < 0) { // No serviceable interface was found + for (current_interface = 0; current_interface < USB_MAXINTERFACES; current_interface++) { + // Must claim an interface of the same API type + if ((priv->usb_interface[current_interface].apib->id == api_type) + && (libusb_claim_interface(transfer->dev_handle, current_interface) == LIBUSB_SUCCESS)) { + usbi_dbg("auto-claimed interface %d for control request", current_interface); + if (handle_priv->autoclaim_count[current_interface] != 0) + usbi_warn(ctx, "program assertion failed - autoclaim_count was nonzero"); + handle_priv->autoclaim_count[current_interface]++; + break; + } + } + if (current_interface == USB_MAXINTERFACES) { + usbi_err(ctx, "could not auto-claim any interface"); + r = LIBUSB_ERROR_NOT_FOUND; + } + } else { + // If we have a valid interface that was autoclaimed, we must increment + // its autoclaim count so that we can prevent an early release. + if (handle_priv->autoclaim_count[current_interface] != 0) + handle_priv->autoclaim_count[current_interface]++; + } + usbi_mutex_unlock(&autoclaim_lock); + + *interface_number = current_interface; + return r; +} + +static void auto_release(struct usbi_transfer *itransfer) +{ + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + libusb_device_handle *dev_handle = transfer->dev_handle; + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + int r; + + usbi_mutex_lock(&autoclaim_lock); + if (handle_priv->autoclaim_count[transfer_priv->interface_number] > 0) { + handle_priv->autoclaim_count[transfer_priv->interface_number]--; + if (handle_priv->autoclaim_count[transfer_priv->interface_number] == 0) { + r = libusb_release_interface(dev_handle, transfer_priv->interface_number); + if (r == LIBUSB_SUCCESS) + usbi_dbg("auto-released interface %d", transfer_priv->interface_number); + else + usbi_dbg("failed to auto-release interface %d (%s)", + transfer_priv->interface_number, libusb_error_name((enum libusb_error)r)); + } + } + usbi_mutex_unlock(&autoclaim_lock); +} + +/* + * init: libusb backend init function + */ +static int winusb_init(struct libusb_context *ctx) +{ + int i; + + // We need a lock for proper auto-release + usbi_mutex_init(&autoclaim_lock); + + // Load DLL imports + if (!init_dlls()) { + usbi_err(ctx, "could not resolve DLL functions"); + return LIBUSB_ERROR_OTHER; + } + + // Initialize the low level APIs (we don't care about errors at this stage) + for (i = 0; i < USB_API_MAX; i++) { + if (usb_api_backend[i].init && usb_api_backend[i].init(ctx)) + usbi_warn(ctx, "error initializing %s backend", + usb_api_backend[i].designation); + } + + return LIBUSB_SUCCESS; +} + +/* +* exit: libusb backend deinitialization function +*/ +static void winusb_exit(struct libusb_context *ctx) +{ + int i; + + for (i = 0; i < USB_API_MAX; i++) { + if (usb_api_backend[i].exit) + usb_api_backend[i].exit(); + } + + exit_dlls(); + usbi_mutex_destroy(&autoclaim_lock); +} + +/* + * fetch and cache all the config descriptors through I/O + */ +static void cache_config_descriptors(struct libusb_device *dev, HANDLE hub_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + struct winusb_device_priv *priv = _device_priv(dev); + DWORD size, ret_size; + uint8_t i; + + USB_CONFIGURATION_DESCRIPTOR_SHORT cd_buf_short; // dummy request + PUSB_DESCRIPTOR_REQUEST cd_buf_actual = NULL; // actual request + PUSB_CONFIGURATION_DESCRIPTOR cd_data; + + if (dev->num_configurations == 0) + return; + + priv->config_descriptor = calloc(dev->num_configurations, sizeof(PUSB_CONFIGURATION_DESCRIPTOR)); + if (priv->config_descriptor == NULL) { + usbi_err(ctx, "could not allocate configuration descriptor array for '%s'", priv->dev_id); + return; + } + + for (i = 0; i <= dev->num_configurations; i++) { + safe_free(cd_buf_actual); + + if (i == dev->num_configurations) + break; + + size = sizeof(cd_buf_short); + memset(&cd_buf_short, 0, size); + + cd_buf_short.req.ConnectionIndex = (ULONG)dev->port_number; + cd_buf_short.req.SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; + cd_buf_short.req.SetupPacket.bRequest = LIBUSB_REQUEST_GET_DESCRIPTOR; + cd_buf_short.req.SetupPacket.wValue = (LIBUSB_DT_CONFIG << 8) | i; + cd_buf_short.req.SetupPacket.wIndex = 0; + cd_buf_short.req.SetupPacket.wLength = (USHORT)sizeof(USB_CONFIGURATION_DESCRIPTOR); + + // Dummy call to get the required data size. Initial failures are reported as info rather + // than error as they can occur for non-penalizing situations, such as with some hubs. + // coverity[tainted_data_argument] + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, &cd_buf_short, size, + &cd_buf_short, size, &ret_size, NULL)) { + usbi_info(ctx, "could not access configuration descriptor %u (dummy) for '%s': %s", i, priv->dev_id, windows_error_str(0)); + continue; + } + + if ((ret_size != size) || (cd_buf_short.desc.wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))) { + usbi_info(ctx, "unexpected configuration descriptor %u size (dummy) for '%s'", i, priv->dev_id); + continue; + } + + size = sizeof(USB_DESCRIPTOR_REQUEST) + cd_buf_short.desc.wTotalLength; + cd_buf_actual = malloc(size); + if (cd_buf_actual == NULL) { + usbi_err(ctx, "could not allocate configuration descriptor %u buffer for '%s'", i, priv->dev_id); + continue; + } + + // Actual call + cd_buf_actual->ConnectionIndex = (ULONG)dev->port_number; + cd_buf_actual->SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; + cd_buf_actual->SetupPacket.bRequest = LIBUSB_REQUEST_GET_DESCRIPTOR; + cd_buf_actual->SetupPacket.wValue = (LIBUSB_DT_CONFIG << 8) | i; + cd_buf_actual->SetupPacket.wIndex = 0; + cd_buf_actual->SetupPacket.wLength = cd_buf_short.desc.wTotalLength; + + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, cd_buf_actual, size, + cd_buf_actual, size, &ret_size, NULL)) { + usbi_err(ctx, "could not access configuration descriptor %u (actual) for '%s': %s", i, priv->dev_id, windows_error_str(0)); + continue; + } + + cd_data = (PUSB_CONFIGURATION_DESCRIPTOR)((UCHAR *)cd_buf_actual + sizeof(USB_DESCRIPTOR_REQUEST)); + + if ((size != ret_size) || (cd_data->wTotalLength != cd_buf_short.desc.wTotalLength)) { + usbi_err(ctx, "unexpected configuration descriptor %u size (actual) for '%s'", i, priv->dev_id); + continue; + } + + if (cd_data->bDescriptorType != LIBUSB_DT_CONFIG) { + usbi_err(ctx, "descriptor %u not a configuration descriptor for '%s'", i, priv->dev_id); + continue; + } + + usbi_dbg("cached config descriptor %u (bConfigurationValue=%u, %u bytes)", + i, cd_data->bConfigurationValue, cd_data->wTotalLength); + + // Cache the descriptor + priv->config_descriptor[i] = malloc(cd_data->wTotalLength); + if (priv->config_descriptor[i] != NULL) { + memcpy(priv->config_descriptor[i], cd_data, cd_data->wTotalLength); + } else { + usbi_err(ctx, "could not allocate configuration descriptor %u buffer for '%s'", i, priv->dev_id); + } + } +} + +/* + * Populate a libusb device structure + */ +static int init_device(struct libusb_device *dev, struct libusb_device *parent_dev, + uint8_t port_number, DEVINST devinst) +{ + struct libusb_context *ctx; + struct libusb_device *tmp_dev; + struct winusb_device_priv *priv, *parent_priv; + USB_NODE_CONNECTION_INFORMATION_EX conn_info; + USB_NODE_CONNECTION_INFORMATION_EX_V2 conn_info_v2; + HANDLE hub_handle; + DWORD size; + uint8_t bus_number, depth; + int r; + + priv = _device_priv(dev); + + // If the device is already initialized, we can stop here + if (priv->initialized) + return LIBUSB_SUCCESS; + + if (parent_dev != NULL) { // Not a HCD root hub + ctx = DEVICE_CTX(dev); + parent_priv = _device_priv(parent_dev); + if (parent_priv->apib->id != USB_API_HUB) { + usbi_warn(ctx, "parent for device '%s' is not a hub", priv->dev_id); + return LIBUSB_ERROR_NOT_FOUND; + } + + // Calculate depth and fetch bus number + bus_number = parent_dev->bus_number; + if (bus_number == 0) { + tmp_dev = get_ancestor(ctx, devinst, &devinst); + if (tmp_dev != parent_dev) { + usbi_err(ctx, "program assertion failed - first ancestor is not parent"); + return LIBUSB_ERROR_NOT_FOUND; + } + libusb_unref_device(tmp_dev); + + for (depth = 1; bus_number == 0; depth++) { + tmp_dev = get_ancestor(ctx, devinst, &devinst); + if (tmp_dev->bus_number != 0) { + bus_number = tmp_dev->bus_number; + depth += _device_priv(tmp_dev)->depth; + } + libusb_unref_device(tmp_dev); + } + } else { + depth = parent_priv->depth + 1; + } + + if (bus_number == 0) { + usbi_err(ctx, "program assertion failed - bus number not found for '%s'", priv->dev_id); + return LIBUSB_ERROR_NOT_FOUND; + } + + dev->bus_number = bus_number; + dev->port_number = port_number; + dev->parent_dev = parent_dev; + priv->depth = depth; + + hub_handle = CreateFileA(parent_priv->path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + 0, NULL); + if (hub_handle == INVALID_HANDLE_VALUE) { + usbi_warn(ctx, "could not open hub %s: %s", parent_priv->path, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + + memset(&conn_info, 0, sizeof(conn_info)); + conn_info.ConnectionIndex = (ULONG)port_number; + // coverity[tainted_data_argument] + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, sizeof(conn_info), + &conn_info, sizeof(conn_info), &size, NULL)) { + usbi_warn(ctx, "could not get node connection information for device '%s': %s", + priv->dev_id, windows_error_str(0)); + CloseHandle(hub_handle); + return LIBUSB_ERROR_NO_DEVICE; + } + + if (conn_info.ConnectionStatus == NoDeviceConnected) { + usbi_err(ctx, "device '%s' is no longer connected!", priv->dev_id); + CloseHandle(hub_handle); + return LIBUSB_ERROR_NO_DEVICE; + } + + memcpy(&priv->dev_descriptor, &(conn_info.DeviceDescriptor), sizeof(USB_DEVICE_DESCRIPTOR)); + dev->num_configurations = priv->dev_descriptor.bNumConfigurations; + priv->active_config = conn_info.CurrentConfigurationValue; + usbi_dbg("found %u configurations (active conf: %u)", dev->num_configurations, priv->active_config); + + // Cache as many config descriptors as we can + cache_config_descriptors(dev, hub_handle); + + // In their great wisdom, Microsoft decided to BREAK the USB speed report between Windows 7 and Windows 8 + if (windows_version >= WINDOWS_8) { + conn_info_v2.ConnectionIndex = (ULONG)port_number; + conn_info_v2.Length = sizeof(USB_NODE_CONNECTION_INFORMATION_EX_V2); + conn_info_v2.SupportedUsbProtocols.Usb300 = 1; + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, + &conn_info_v2, sizeof(conn_info_v2), &conn_info_v2, sizeof(conn_info_v2), &size, NULL)) { + usbi_warn(ctx, "could not get node connection information (V2) for device '%s': %s", + priv->dev_id, windows_error_str(0)); + } else if (conn_info_v2.Flags.DeviceIsOperatingAtSuperSpeedOrHigher) { + conn_info.Speed = 3; + } + } + + CloseHandle(hub_handle); + + if (conn_info.DeviceAddress > UINT8_MAX) + usbi_err(ctx, "program assertion failed - device address overflow"); + + dev->device_address = (uint8_t)conn_info.DeviceAddress; + + switch (conn_info.Speed) { + case 0: dev->speed = LIBUSB_SPEED_LOW; break; + case 1: dev->speed = LIBUSB_SPEED_FULL; break; + case 2: dev->speed = LIBUSB_SPEED_HIGH; break; + case 3: dev->speed = LIBUSB_SPEED_SUPER; break; + default: + usbi_warn(ctx, "unknown device speed %u", conn_info.Speed); + break; + } + } + + r = usbi_sanitize_device(dev); + if (r) + return r; + + priv->initialized = true; + + usbi_dbg("(bus: %u, addr: %u, depth: %u, port: %u): '%s'", + dev->bus_number, dev->device_address, priv->depth, dev->port_number, priv->dev_id); + + return LIBUSB_SUCCESS; +} + +static int enumerate_hcd_root_hub(struct libusb_context *ctx, const char *dev_id, + uint8_t bus_number, DEVINST devinst) +{ + struct libusb_device *dev; + struct winusb_device_priv *priv; + unsigned long session_id; + DEVINST child_devinst; + + if (CM_Get_Child(&child_devinst, devinst, 0) != CR_SUCCESS) { + usbi_err(ctx, "could not get child devinst for '%s'", dev_id); + return LIBUSB_ERROR_OTHER; + } + + session_id = (unsigned long)child_devinst; + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev == NULL) { + usbi_err(ctx, "program assertion failed - HCD '%s' child not found", dev_id); + return LIBUSB_ERROR_NO_DEVICE; + } + + if (dev->bus_number == 0) { + // Only do this once + usbi_dbg("assigning HCD '%s' bus number %u", dev_id, bus_number); + priv = _device_priv(dev); + dev->bus_number = bus_number; + dev->num_configurations = 1; + priv->dev_descriptor.bLength = LIBUSB_DT_DEVICE_SIZE; + priv->dev_descriptor.bDescriptorType = LIBUSB_DT_DEVICE; + priv->dev_descriptor.bDeviceClass = LIBUSB_CLASS_HUB; + priv->dev_descriptor.bNumConfigurations = 1; + priv->active_config = 1; + priv->root_hub = true; + if (sscanf(dev_id, "PCI\\VEN_%04hx&DEV_%04hx%*s", &priv->dev_descriptor.idVendor, &priv->dev_descriptor.idProduct) != 2) { + usbi_warn(ctx, "could not infer VID/PID of HCD root hub from '%s'", dev_id); + priv->dev_descriptor.idVendor = 0x1d6b; // Linux Foundation root hub + priv->dev_descriptor.idProduct = 1; + } + } + + libusb_unref_device(dev); + return LIBUSB_SUCCESS; +} + +// Returns the api type, or 0 if not found/unsupported +static void get_api_type(struct libusb_context *ctx, HDEVINFO *dev_info, + SP_DEVINFO_DATA *dev_info_data, int *api, int *sub_api) +{ + // Precedence for filter drivers vs driver is in the order of this array + struct driver_lookup lookup[3] = { + {"\0\0", SPDRP_SERVICE, "driver"}, + {"\0\0", SPDRP_UPPERFILTERS, "upper filter driver"}, + {"\0\0", SPDRP_LOWERFILTERS, "lower filter driver"} + }; + DWORD size, reg_type; + unsigned k, l; + int i, j; + + // Check the service & filter names to know the API we should use + for (k = 0; k < 3; k++) { + if (pSetupDiGetDeviceRegistryPropertyA(*dev_info, dev_info_data, lookup[k].reg_prop, + ®_type, (PBYTE)lookup[k].list, MAX_KEY_LENGTH, &size)) { + // Turn the REG_SZ SPDRP_SERVICE into REG_MULTI_SZ + if (lookup[k].reg_prop == SPDRP_SERVICE) + // our buffers are MAX_KEY_LENGTH + 1 so we can overflow if needed + lookup[k].list[strlen(lookup[k].list) + 1] = 0; + + // MULTI_SZ is a pain to work with. Turn it into something much more manageable + // NB: none of the driver names we check against contain LIST_SEPARATOR, + // (currently ';'), so even if an unsuported one does, it's not an issue + for (l = 0; (lookup[k].list[l] != 0) || (lookup[k].list[l + 1] != 0); l++) { + if (lookup[k].list[l] == 0) + lookup[k].list[l] = LIST_SEPARATOR; + } + usbi_dbg("%s(s): %s", lookup[k].designation, lookup[k].list); + } else { + if (GetLastError() != ERROR_INVALID_DATA) + usbi_dbg("could not access %s: %s", lookup[k].designation, windows_error_str(0)); + lookup[k].list[0] = 0; + } + } + + for (i = 2; i < USB_API_MAX; i++) { + for (k = 0; k < 3; k++) { + j = get_sub_api(lookup[k].list, i); + if (j >= 0) { + usbi_dbg("matched %s name against %s", lookup[k].designation, + (i != USB_API_WINUSBX) ? usb_api_backend[i].designation : usb_api_backend[i].driver_name_list[j]); + *api = i; + *sub_api = j; + return; + } + } + } +} + +static int set_composite_interface(struct libusb_context *ctx, struct libusb_device *dev, + char *dev_interface_path, char *device_id, int api, int sub_api) +{ + struct winusb_device_priv *priv = _device_priv(dev); + int interface_number; + const char *mi_str; + + // Because MI_## are not necessarily in sequential order (some composite + // devices will have only MI_00 & MI_03 for instance), we retrieve the actual + // interface number from the path's MI value + mi_str = strstr(device_id, "MI_"); + if ((mi_str != NULL) && isdigit(mi_str[3]) && isdigit(mi_str[4])) { + interface_number = ((mi_str[3] - '0') * 10) + (mi_str[4] - '0'); + } else { + usbi_warn(ctx, "failure to read interface number for %s, using default value", device_id); + interface_number = 0; + } + + if (interface_number >= USB_MAXINTERFACES) { + usbi_warn(ctx, "interface %d too large - ignoring interface path %s", interface_number, dev_interface_path); + return LIBUSB_ERROR_ACCESS; + } + + if (priv->usb_interface[interface_number].path != NULL) { + if (api == USB_API_HID) { + // HID devices can have multiple collections (COL##) for each MI_## interface + usbi_dbg("interface[%d] already set - ignoring HID collection: %s", + interface_number, device_id); + return LIBUSB_ERROR_ACCESS; + } + // In other cases, just use the latest data + safe_free(priv->usb_interface[interface_number].path); + } + + usbi_dbg("interface[%d] = %s", interface_number, dev_interface_path); + priv->usb_interface[interface_number].path = dev_interface_path; + priv->usb_interface[interface_number].apib = &usb_api_backend[api]; + priv->usb_interface[interface_number].sub_api = sub_api; + if ((api == USB_API_HID) && (priv->hid == NULL)) { + priv->hid = calloc(1, sizeof(struct hid_device_priv)); + if (priv->hid == NULL) + return LIBUSB_ERROR_NO_MEM; + } + + return LIBUSB_SUCCESS; +} + +static int set_hid_interface(struct libusb_context *ctx, struct libusb_device *dev, + char *dev_interface_path) +{ + int i; + struct winusb_device_priv *priv = _device_priv(dev); + + if (priv->hid == NULL) { + usbi_err(ctx, "program assertion failed: parent is not HID"); + return LIBUSB_ERROR_NO_DEVICE; + } else if (priv->hid->nb_interfaces == USB_MAXINTERFACES) { + usbi_err(ctx, "program assertion failed: max USB interfaces reached for HID device"); + return LIBUSB_ERROR_NO_DEVICE; + } + + for (i = 0; i < priv->hid->nb_interfaces; i++) { + if ((priv->usb_interface[i].path != NULL) && strcmp(priv->usb_interface[i].path, dev_interface_path) == 0) { + usbi_dbg("interface[%d] already set to %s", i, dev_interface_path); + return LIBUSB_ERROR_ACCESS; + } + } + + priv->usb_interface[priv->hid->nb_interfaces].path = dev_interface_path; + priv->usb_interface[priv->hid->nb_interfaces].apib = &usb_api_backend[USB_API_HID]; + usbi_dbg("interface[%u] = %s", priv->hid->nb_interfaces, dev_interface_path); + priv->hid->nb_interfaces++; + return LIBUSB_SUCCESS; +} + +/* + * get_device_list: libusb backend device enumeration function + */ +static int winusb_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) +{ + struct discovered_devs *discdevs; + HDEVINFO *dev_info, dev_info_intf, dev_info_enum; + SP_DEVINFO_DATA dev_info_data; + DWORD _index = 0; + GUID hid_guid; + int r = LIBUSB_SUCCESS; + int api, sub_api; + unsigned int pass, i, j; + char enumerator[16]; + char dev_id[MAX_PATH_LENGTH]; + struct libusb_device *dev, *parent_dev; + struct winusb_device_priv *priv, *parent_priv; + char *dev_interface_path = NULL; + unsigned long session_id; + DWORD size, port_nr, reg_type, install_state; + HKEY key; + WCHAR guid_string_w[MAX_GUID_STRING_LENGTH]; + GUID *if_guid; + LONG s; +#define HUB_PASS 0 +#define DEV_PASS 1 +#define HCD_PASS 2 +#define GEN_PASS 3 +#define HID_PASS 4 +#define EXT_PASS 5 + // Keep a list of guids that will be enumerated +#define GUID_SIZE_STEP 8 + const GUID **guid_list, **new_guid_list; + unsigned int guid_size = GUID_SIZE_STEP; + unsigned int nb_guids; + // Keep a list of PnP enumerator strings that are found + char *usb_enumerator[8] = { "USB" }; + unsigned int nb_usb_enumerators = 1; + unsigned int usb_enum_index = 0; + // Keep a list of newly allocated devs to unref +#define UNREF_SIZE_STEP 16 + libusb_device **unref_list, **new_unref_list; + unsigned int unref_size = UNREF_SIZE_STEP; + unsigned int unref_cur = 0; + + // PASS 1 : (re)enumerate HCDs (allows for HCD hotplug) + // PASS 2 : (re)enumerate HUBS + // PASS 3 : (re)enumerate generic USB devices (including driverless) + // and list additional USB device interface GUIDs to explore + // PASS 4 : (re)enumerate master USB devices that have a device interface + // PASS 5+: (re)enumerate device interfaced GUIDs (including HID) and + // set the device interfaces. + + // Init the GUID table + guid_list = malloc(guid_size * sizeof(void *)); + if (guid_list == NULL) { + usbi_err(ctx, "failed to alloc guid list"); + return LIBUSB_ERROR_NO_MEM; + } + + guid_list[HUB_PASS] = &GUID_DEVINTERFACE_USB_HUB; + guid_list[DEV_PASS] = &GUID_DEVINTERFACE_USB_DEVICE; + guid_list[HCD_PASS] = &GUID_DEVINTERFACE_USB_HOST_CONTROLLER; + guid_list[GEN_PASS] = NULL; + if (api_hid_available) { + HidD_GetHidGuid(&hid_guid); + guid_list[HID_PASS] = &hid_guid; + } else { + guid_list[HID_PASS] = NULL; + } + nb_guids = EXT_PASS; + + unref_list = malloc(unref_size * sizeof(void *)); + if (unref_list == NULL) { + usbi_err(ctx, "failed to alloc unref list"); + free((void *)guid_list); + return LIBUSB_ERROR_NO_MEM; + } + + dev_info_intf = pSetupDiGetClassDevsA(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + if (dev_info_intf == INVALID_HANDLE_VALUE) { + usbi_err(ctx, "failed to obtain device info list: %s", windows_error_str(0)); + free(unref_list); + free((void *)guid_list); + return LIBUSB_ERROR_OTHER; + } + + for (pass = 0; ((pass < nb_guids) && (r == LIBUSB_SUCCESS)); pass++) { +//#define ENUM_DEBUG +#if defined(ENABLE_LOGGING) && defined(ENUM_DEBUG) + const char * const passname[] = {"HUB", "DEV", "HCD", "GEN", "HID", "EXT"}; + usbi_dbg("#### PROCESSING %ss %s", passname[MIN(pass, EXT_PASS)], guid_to_string(guid_list[pass])); +#endif + if ((pass == HID_PASS) && (guid_list[HID_PASS] == NULL)) + continue; + + dev_info = (pass != GEN_PASS) ? &dev_info_intf : &dev_info_enum; + + for (i = 0; ; i++) { + // safe loop: free up any (unprotected) dynamic resource + // NB: this is always executed before breaking the loop + safe_free(dev_interface_path); + priv = parent_priv = NULL; + dev = parent_dev = NULL; + + // Safe loop: end of loop conditions + if (r != LIBUSB_SUCCESS) + break; + + if ((pass == HCD_PASS) && (i == UINT8_MAX)) { + usbi_warn(ctx, "program assertion failed - found more than %u buses, skipping the rest.", UINT8_MAX); + break; + } + + if (pass != GEN_PASS) { + // Except for GEN, all passes deal with device interfaces + r = get_interface_details(ctx, *dev_info, &dev_info_data, guid_list[pass], &_index, &dev_interface_path); + if ((r != LIBUSB_SUCCESS) || (dev_interface_path == NULL)) { + _index = 0; + break; + } + } else { + // Workaround for a Nec/Renesas USB 3.0 driver bug where root hubs are + // being listed under the "NUSB3" PnP Symbolic Name rather than "USB". + // The Intel USB 3.0 driver behaves similar, but uses "IUSB3" + // The Intel Alpine Ridge USB 3.1 driver uses "IARUSB3" + for (; usb_enum_index < nb_usb_enumerators; usb_enum_index++) { + if (get_devinfo_data(ctx, dev_info, &dev_info_data, usb_enumerator[usb_enum_index], i)) + break; + i = 0; + } + if (usb_enum_index == nb_usb_enumerators) + break; + } + + // Read the Device ID path + if (!pSetupDiGetDeviceInstanceIdA(*dev_info, &dev_info_data, dev_id, sizeof(dev_id), NULL)) { + usbi_warn(ctx, "could not read the device instance ID for devInst %X, skipping", + dev_info_data.DevInst); + continue; + } + +#ifdef ENUM_DEBUG + usbi_dbg("PRO: %s", dev_id); +#endif + + // Set API to use or get additional data from generic pass + api = USB_API_UNSUPPORTED; + sub_api = SUB_API_NOTSET; + switch (pass) { + case HCD_PASS: + break; + case HUB_PASS: + api = USB_API_HUB; + // Fetch the PnP enumerator class for this hub + // This will allow us to enumerate all classes during the GEN pass + if (!pSetupDiGetDeviceRegistryPropertyA(*dev_info, &dev_info_data, SPDRP_ENUMERATOR_NAME, + NULL, (PBYTE)enumerator, sizeof(enumerator), NULL)) { + usbi_err(ctx, "could not read enumerator string for device '%s': %s", dev_id, windows_error_str(0)); + LOOP_BREAK(LIBUSB_ERROR_OTHER); + } + for (j = 0; j < nb_usb_enumerators; j++) { + if (strcmp(usb_enumerator[j], enumerator) == 0) + break; + } + if (j == nb_usb_enumerators) { + usbi_dbg("found new PnP enumerator string '%s'", enumerator); + if (nb_usb_enumerators < ARRAYSIZE(usb_enumerator)) { + usb_enumerator[nb_usb_enumerators] = _strdup(enumerator); + if (usb_enumerator[nb_usb_enumerators] != NULL) { + nb_usb_enumerators++; + } else { + usbi_err(ctx, "could not allocate enumerator string '%s'", enumerator); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + } else { + usbi_warn(ctx, "too many enumerator strings, some devices may not be accessible"); + } + } + break; + case GEN_PASS: + // We use the GEN pass to detect driverless devices... + if (!pSetupDiGetDeviceRegistryPropertyA(*dev_info, &dev_info_data, SPDRP_DRIVER, + NULL, NULL, 0, NULL) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER)) { + usbi_info(ctx, "The following device has no driver: '%s'", dev_id); + usbi_info(ctx, "libusb will not be able to access it"); + } + // ...and to add the additional device interface GUIDs + key = pSetupDiOpenDevRegKey(*dev_info, &dev_info_data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); + if (key == INVALID_HANDLE_VALUE) + break; + // Look for both DeviceInterfaceGUIDs *and* DeviceInterfaceGUID, in that order + size = sizeof(guid_string_w); + s = pRegQueryValueExW(key, L"DeviceInterfaceGUIDs", NULL, ®_type, + (LPBYTE)guid_string_w, &size); + if (s == ERROR_FILE_NOT_FOUND) + s = pRegQueryValueExW(key, L"DeviceInterfaceGUID", NULL, ®_type, + (LPBYTE)guid_string_w, &size); + pRegCloseKey(key); + if ((s == ERROR_SUCCESS) && + (((reg_type == REG_SZ) && (size == (sizeof(guid_string_w) - sizeof(WCHAR)))) || + ((reg_type == REG_MULTI_SZ) && (size == sizeof(guid_string_w))))) { + if (nb_guids == guid_size) { + new_guid_list = realloc((void *)guid_list, (guid_size + GUID_SIZE_STEP) * sizeof(void *)); + if (new_guid_list == NULL) { + usbi_err(ctx, "failed to realloc guid list"); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + guid_list = new_guid_list; + guid_size += GUID_SIZE_STEP; + } + if_guid = malloc(sizeof(*if_guid)); + if (if_guid == NULL) { + usbi_err(ctx, "failed to alloc if_guid"); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + if (pIIDFromString(guid_string_w, if_guid) != 0) { + usbi_warn(ctx, "device '%s' has malformed DeviceInterfaceGUID string, skipping", dev_id); + free(if_guid); + } else { + // Check if we've already seen this GUID + for (j = EXT_PASS; j < nb_guids; j++) { + if (memcmp(guid_list[j], if_guid, sizeof(*if_guid)) == 0) + break; + } + if (j == nb_guids) { + usbi_dbg("extra GUID: %s", guid_to_string(if_guid)); + guid_list[nb_guids++] = if_guid; + } else { + // Duplicate, ignore + free(if_guid); + } + } + } else if (s == ERROR_SUCCESS) { + usbi_warn(ctx, "unexpected type/size of DeviceInterfaceGUID for '%s'", dev_id); + } + break; + case HID_PASS: + api = USB_API_HID; + break; + default: + // Get the API type (after checking that the driver installation is OK) + if ((!pSetupDiGetDeviceRegistryPropertyA(*dev_info, &dev_info_data, SPDRP_INSTALL_STATE, + NULL, (PBYTE)&install_state, sizeof(install_state), &size)) || (size != sizeof(install_state))) { + usbi_warn(ctx, "could not detect installation state of driver for '%s': %s", + dev_id, windows_error_str(0)); + } else if (install_state != 0) { + usbi_warn(ctx, "driver for device '%s' is reporting an issue (code: %u) - skipping", + dev_id, (unsigned int)install_state); + continue; + } + get_api_type(ctx, dev_info, &dev_info_data, &api, &sub_api); + break; + } + + // Find parent device (for the passes that need it) + if (pass >= GEN_PASS) { + parent_dev = get_ancestor(ctx, dev_info_data.DevInst, NULL); + if (parent_dev == NULL) { + // Root hubs will not have a parent + dev = usbi_get_device_by_session_id(ctx, (unsigned long)dev_info_data.DevInst); + if (dev != NULL) { + priv = _device_priv(dev); + if (priv->root_hub) + goto track_unref; + libusb_unref_device(dev); + } + + usbi_dbg("unlisted ancestor for '%s' (non USB HID, newly connected, etc.) - ignoring", dev_id); + continue; + } + + parent_priv = _device_priv(parent_dev); + // virtual USB devices are also listed during GEN - don't process these yet + if ((pass == GEN_PASS) && (parent_priv->apib->id != USB_API_HUB)) { + libusb_unref_device(parent_dev); + continue; + } + } + + // Create new or match existing device, using the devInst as session id + if ((pass <= GEN_PASS) && (pass != HCD_PASS)) { // For subsequent passes, we'll lookup the parent + // These are the passes that create "new" devices + session_id = (unsigned long)dev_info_data.DevInst; + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev == NULL) { + alloc_device: + usbi_dbg("allocating new device for session [%lX]", session_id); + dev = usbi_alloc_device(ctx, session_id); + if (dev == NULL) + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + + priv = winusb_device_priv_init(dev); + priv->dev_id = _strdup(dev_id); + if (priv->dev_id == NULL) { + libusb_unref_device(dev); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + } else { + usbi_dbg("found existing device for session [%lX]", session_id); + + priv = _device_priv(dev); + if (strcmp(priv->dev_id, dev_id) != 0) { + usbi_dbg("device instance ID for session [%lX] changed", session_id); + usbi_disconnect_device(dev); + libusb_unref_device(dev); + goto alloc_device; + } + } + + track_unref: + // Keep track of devices that need unref + if (unref_cur == unref_size) { + new_unref_list = realloc(unref_list, (unref_size + UNREF_SIZE_STEP) * sizeof(void *)); + if (new_unref_list == NULL) { + usbi_err(ctx, "could not realloc list for unref - aborting"); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + unref_list = new_unref_list; + unref_size += UNREF_SIZE_STEP; + } + unref_list[unref_cur++] = dev; + } + + // Setup device + switch (pass) { + case HUB_PASS: + case DEV_PASS: + // If the device has already been setup, don't do it again + if (priv->path != NULL) + break; + // Take care of API initialization + priv->path = dev_interface_path; + dev_interface_path = NULL; + priv->apib = &usb_api_backend[api]; + priv->sub_api = sub_api; + switch (api) { + case USB_API_COMPOSITE: + case USB_API_HUB: + break; + case USB_API_HID: + priv->hid = calloc(1, sizeof(struct hid_device_priv)); + if (priv->hid == NULL) + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + break; + default: + // For other devices, the first interface is the same as the device + priv->usb_interface[0].path = _strdup(priv->path); + if (priv->usb_interface[0].path == NULL) + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + // The following is needed if we want API calls to work for both simple + // and composite devices. + for (j = 0; j < USB_MAXINTERFACES; j++) + priv->usb_interface[j].apib = &usb_api_backend[api]; + break; + } + break; + case HCD_PASS: + r = enumerate_hcd_root_hub(ctx, dev_id, (uint8_t)(i + 1), dev_info_data.DevInst); + break; + case GEN_PASS: + // The SPDRP_ADDRESS for USB devices is the device port number on the hub + port_nr = 0; + if (!pSetupDiGetDeviceRegistryPropertyA(*dev_info, &dev_info_data, SPDRP_ADDRESS, + NULL, (PBYTE)&port_nr, sizeof(port_nr), &size) || (size != sizeof(port_nr))) + usbi_warn(ctx, "could not retrieve port number for device '%s': %s", dev_id, windows_error_str(0)); + r = init_device(dev, parent_dev, (uint8_t)port_nr, dev_info_data.DevInst); + if (r == LIBUSB_SUCCESS) { + // Append device to the list of discovered devices + discdevs = discovered_devs_append(*_discdevs, dev); + if (!discdevs) + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + + *_discdevs = discdevs; + } else if (r == LIBUSB_ERROR_NO_DEVICE) { + // This can occur if the device was disconnected but Windows hasn't + // refreshed its enumeration yet - in that case, we ignore the device + r = LIBUSB_SUCCESS; + } + break; + default: // HID_PASS and later + if (parent_priv->apib->id == USB_API_HID || parent_priv->apib->id == USB_API_COMPOSITE) { + if (parent_priv->apib->id == USB_API_HID) { + usbi_dbg("setting HID interface for [%lX]:", parent_dev->session_data); + r = set_hid_interface(ctx, parent_dev, dev_interface_path); + } else { + usbi_dbg("setting composite interface for [%lX]:", parent_dev->session_data); + r = set_composite_interface(ctx, parent_dev, dev_interface_path, dev_id, api, sub_api); + } + switch (r) { + case LIBUSB_SUCCESS: + dev_interface_path = NULL; + break; + case LIBUSB_ERROR_ACCESS: + // interface has already been set => make sure dev_interface_path is freed then + r = LIBUSB_SUCCESS; + break; + default: + LOOP_BREAK(r); + break; + } + } + libusb_unref_device(parent_dev); + break; + } + } + } + + pSetupDiDestroyDeviceInfoList(dev_info_intf); + + // Free any additional GUIDs + for (pass = EXT_PASS; pass < nb_guids; pass++) + free((void *)guid_list[pass]); + free((void *)guid_list); + + // Free any PnP enumerator strings + for (i = 1; i < nb_usb_enumerators; i++) + free(usb_enumerator[i]); + + // Unref newly allocated devs + for (i = 0; i < unref_cur; i++) + libusb_unref_device(unref_list[i]); + free(unref_list); + + return r; +} + +static int winusb_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer) +{ + struct winusb_device_priv *priv = _device_priv(dev); + + memcpy(buffer, &priv->dev_descriptor, DEVICE_DESC_LENGTH); + return LIBUSB_SUCCESS; +} + +static int winusb_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len) +{ + struct winusb_device_priv *priv = _device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + size_t size; + + // config index is zero based + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_INVALID_PARAM; + + if ((priv->config_descriptor == NULL) || (priv->config_descriptor[config_index] == NULL)) + return LIBUSB_ERROR_NOT_FOUND; + + config_header = priv->config_descriptor[config_index]; + + size = MIN(config_header->wTotalLength, len); + memcpy(buffer, priv->config_descriptor[config_index], size); + return (int)size; +} + +static int winusb_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue, + unsigned char **buffer) +{ + struct winusb_device_priv *priv = _device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + uint8_t index; + + if (priv->config_descriptor == NULL) + return LIBUSB_ERROR_NOT_FOUND; + + for (index = 0; index < dev->num_configurations; index++) { + config_header = priv->config_descriptor[index]; + if (config_header == NULL) + continue; + if (config_header->bConfigurationValue == bConfigurationValue) { + *buffer = (unsigned char *)priv->config_descriptor[index]; + return (int)config_header->wTotalLength; + } + } + + return LIBUSB_ERROR_NOT_FOUND; +} + +/* + * return the cached copy of the active config descriptor + */ +static int winusb_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len) +{ + struct winusb_device_priv *priv = _device_priv(dev); + unsigned char *config_desc; + int r; + + if (priv->active_config == 0) + return LIBUSB_ERROR_NOT_FOUND; + + r = winusb_get_config_descriptor_by_value(dev, priv->active_config, &config_desc); + if (r < 0) + return r; + + len = MIN((size_t)r, len); + memcpy(buffer, config_desc, len); + return (int)len; +} + +static int winusb_open(struct libusb_device_handle *dev_handle) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + + CHECK_SUPPORTED_API(priv->apib, open); + + return priv->apib->open(SUB_API_NOTSET, dev_handle); +} + +static void winusb_close(struct libusb_device_handle *dev_handle) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + + if (priv->apib->close) + priv->apib->close(SUB_API_NOTSET, dev_handle); +} + +static int winusb_get_configuration(struct libusb_device_handle *dev_handle, int *config) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + + if (priv->active_config == 0) { + *config = 0; + return LIBUSB_ERROR_NOT_FOUND; + } + + *config = priv->active_config; + return LIBUSB_SUCCESS; +} + +/* + * from http://msdn.microsoft.com/en-us/library/ms793522.aspx: "The port driver + * does not currently expose a service that allows higher-level drivers to set + * the configuration." + */ +static int winusb_set_configuration(struct libusb_device_handle *dev_handle, int config) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + int r = LIBUSB_SUCCESS; + + if (config >= USB_MAXCONFIG) + return LIBUSB_ERROR_INVALID_PARAM; + + r = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_OUT | + LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_RECIPIENT_DEVICE, + LIBUSB_REQUEST_SET_CONFIGURATION, (uint16_t)config, + 0, NULL, 0, 1000); + + if (r == LIBUSB_SUCCESS) + priv->active_config = (uint8_t)config; + + return r; +} + +static int winusb_claim_interface(struct libusb_device_handle *dev_handle, int iface) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + int r; + + CHECK_SUPPORTED_API(priv->apib, claim_interface); + + safe_free(priv->usb_interface[iface].endpoint); + priv->usb_interface[iface].nb_endpoints = 0; + + r = priv->apib->claim_interface(SUB_API_NOTSET, dev_handle, iface); + + if (r == LIBUSB_SUCCESS) + r = windows_assign_endpoints(dev_handle, iface, 0); + + return r; +} + +static int winusb_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + int r; + + CHECK_SUPPORTED_API(priv->apib, set_interface_altsetting); + + safe_free(priv->usb_interface[iface].endpoint); + priv->usb_interface[iface].nb_endpoints = 0; + + r = priv->apib->set_interface_altsetting(SUB_API_NOTSET, dev_handle, iface, altsetting); + + if (r == LIBUSB_SUCCESS) + r = windows_assign_endpoints(dev_handle, iface, altsetting); + + return r; +} + +static int winusb_release_interface(struct libusb_device_handle *dev_handle, int iface) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + + CHECK_SUPPORTED_API(priv->apib, release_interface); + + return priv->apib->release_interface(SUB_API_NOTSET, dev_handle, iface); +} + +static int winusb_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + + CHECK_SUPPORTED_API(priv->apib, clear_halt); + + return priv->apib->clear_halt(SUB_API_NOTSET, dev_handle, endpoint); +} + +static int winusb_reset_device(struct libusb_device_handle *dev_handle) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + + CHECK_SUPPORTED_API(priv->apib, reset_device); + + return priv->apib->reset_device(SUB_API_NOTSET, dev_handle); +} + +static void winusb_destroy_device(struct libusb_device *dev) +{ + winusb_device_priv_release(dev); +} + +static void winusb_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + + usbi_close(transfer_priv->pollable_fd.fd); + transfer_priv->pollable_fd = INVALID_WINFD; + transfer_priv->handle = NULL; + safe_free(transfer_priv->hid_buffer); + safe_free(transfer_priv->iso_context); + + // When auto claim is in use, attempt to release the auto-claimed interface + auto_release(itransfer); +} + +static int do_submit_transfer(struct usbi_transfer *itransfer, short events, + int (*transfer_fn)(int, struct usbi_transfer *)) +{ + struct libusb_context *ctx = ITRANSFER_CTX(itransfer); + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winfd wfd; + int r; + + wfd = usbi_create_fd(); + if (wfd.fd < 0) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_add_pollfd(ctx, wfd.fd, events); + if (r) { + usbi_close(wfd.fd); + return r; + } + + // Use transfer_priv to store data needed for async polling + transfer_priv->pollable_fd = wfd; + + r = transfer_fn(SUB_API_NOTSET, itransfer); + + if ((r != LIBUSB_SUCCESS) && (r != LIBUSB_ERROR_OVERFLOW)) { + usbi_remove_pollfd(ctx, wfd.fd); + usbi_close(wfd.fd); + transfer_priv->pollable_fd = INVALID_WINFD; + } + + return r; +} + +static int winusb_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int (*transfer_fn)(int, struct usbi_transfer *); + short events; + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + events = (transfer->buffer[0] & LIBUSB_ENDPOINT_IN) ? POLLIN : POLLOUT; + transfer_fn = priv->apib->submit_control_transfer; + break; + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)) + return LIBUSB_ERROR_NOT_SUPPORTED; + events = IS_XFERIN(transfer) ? POLLIN : POLLOUT; + transfer_fn = priv->apib->submit_bulk_transfer; + break; + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + events = IS_XFERIN(transfer) ? POLLIN : POLLOUT; + transfer_fn = priv->apib->submit_iso_transfer; + break; + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + return LIBUSB_ERROR_NOT_SUPPORTED; + default: + usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } + + if (transfer_fn == NULL) { + usbi_warn(TRANSFER_CTX(transfer), + "unsupported transfer type %d (unrecognized device driver)", + transfer->type); + return LIBUSB_ERROR_NOT_SUPPORTED; + } + + return do_submit_transfer(itransfer, events, transfer_fn); +} + +static int windows_abort_control(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + CHECK_SUPPORTED_API(priv->apib, abort_control); + + return priv->apib->abort_control(SUB_API_NOTSET, itransfer); +} + +static int windows_abort_transfers(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + CHECK_SUPPORTED_API(priv->apib, abort_transfers); + + return priv->apib->abort_transfers(SUB_API_NOTSET, itransfer); +} + +static int winusb_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return windows_abort_control(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return windows_abort_transfers(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + return LIBUSB_ERROR_NOT_SUPPORTED; + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int winusb_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + return priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); +} + +static int winusb_get_transfer_fd(struct usbi_transfer *itransfer) +{ + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + return transfer_priv->pollable_fd.fd; +} + +static void winusb_get_overlapped_result(struct usbi_transfer *itransfer, + DWORD *io_result, DWORD *io_size) +{ + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winfd *pollable_fd = &transfer_priv->pollable_fd; + + if (HasOverlappedIoCompletedSync(pollable_fd->overlapped)) { + *io_result = NO_ERROR; + *io_size = (DWORD)pollable_fd->overlapped->InternalHigh; + } else if (GetOverlappedResult(transfer_priv->handle, pollable_fd->overlapped, io_size, FALSE)) { + // Regular async overlapped + *io_result = NO_ERROR; + } else { + *io_result = GetLastError(); + } +} + +// NB: MSVC6 does not support named initializers. +const struct windows_backend winusb_backend = { + winusb_init, + winusb_exit, + winusb_get_device_list, + winusb_open, + winusb_close, + winusb_get_device_descriptor, + winusb_get_active_config_descriptor, + winusb_get_config_descriptor, + winusb_get_config_descriptor_by_value, + winusb_get_configuration, + winusb_set_configuration, + winusb_claim_interface, + winusb_release_interface, + winusb_set_interface_altsetting, + winusb_clear_halt, + winusb_reset_device, + winusb_destroy_device, + winusb_submit_transfer, + winusb_cancel_transfer, + winusb_clear_transfer_priv, + winusb_copy_transfer_data, + winusb_get_transfer_fd, + winusb_get_overlapped_result, +}; + +/* + * USB API backends + */ + +static const char * const composite_driver_names[] = {"USBCCGP"}; +static const char * const winusbx_driver_names[] = {"libusbK", "libusb0", "WinUSB"}; +static const char * const hid_driver_names[] = {"HIDUSB", "MOUHID", "KBDHID"}; +const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { + { + USB_API_UNSUPPORTED, + "Unsupported API", + // No supported operations + }, + { + USB_API_HUB, + "HUB API", + // No supported operations + }, + { + USB_API_COMPOSITE, + "Composite API", + composite_driver_names, + ARRAYSIZE(composite_driver_names), + NULL, /* init */ + NULL, /* exit */ + composite_open, + composite_close, + NULL, /* configure_endpoints */ + composite_claim_interface, + composite_set_interface_altsetting, + composite_release_interface, + composite_clear_halt, + composite_reset_device, + composite_submit_bulk_transfer, + composite_submit_iso_transfer, + composite_submit_control_transfer, + composite_abort_control, + composite_abort_transfers, + composite_copy_transfer_data, + }, + { + USB_API_WINUSBX, + "WinUSB-like APIs", + winusbx_driver_names, + ARRAYSIZE(winusbx_driver_names), + winusbx_init, + winusbx_exit, + winusbx_open, + winusbx_close, + winusbx_configure_endpoints, + winusbx_claim_interface, + winusbx_set_interface_altsetting, + winusbx_release_interface, + winusbx_clear_halt, + winusbx_reset_device, + winusbx_submit_bulk_transfer, + winusbx_submit_iso_transfer, + winusbx_submit_control_transfer, + winusbx_abort_control, + winusbx_abort_transfers, + winusbx_copy_transfer_data, + }, + { + USB_API_HID, + "HID API", + // No supported operations + }, +}; + + +/* + * WinUSB-like (WinUSB, libusb0/libusbK through libusbk DLL) API functions + */ +#define WinUSBX_Set(fn) \ + do { \ + if (native_winusb) \ + WinUSBX[i].fn = (WinUsb_##fn##_t)GetProcAddress(h, "WinUsb_" #fn); \ + else \ + pLibK_GetProcAddress((PVOID *)&WinUSBX[i].fn, i, KUSB_FNID_##fn); \ + } while (0) + +static int winusbx_init(struct libusb_context *ctx) +{ + HMODULE h; + bool native_winusb; + int i; + KLIB_VERSION LibK_Version; + LibK_GetProcAddress_t pLibK_GetProcAddress = NULL; + LibK_GetVersion_t pLibK_GetVersion; + + h = LoadLibraryA("libusbK"); + + if (h == NULL) { + usbi_info(ctx, "libusbK DLL is not available, will use native WinUSB"); + h = LoadLibraryA("WinUSB"); + + if (h == NULL) { + usbi_warn(ctx, "WinUSB DLL is not available either, " + "you will not be able to access devices outside of enumeration"); + return LIBUSB_ERROR_NOT_FOUND; + } + } else { + usbi_dbg("using libusbK DLL for universal access"); + pLibK_GetVersion = (LibK_GetVersion_t)GetProcAddress(h, "LibK_GetVersion"); + if (pLibK_GetVersion != NULL) { + pLibK_GetVersion(&LibK_Version); + usbi_dbg("libusbK version: %d.%d.%d.%d", LibK_Version.Major, LibK_Version.Minor, + LibK_Version.Micro, LibK_Version.Nano); + } + pLibK_GetProcAddress = (LibK_GetProcAddress_t)GetProcAddress(h, "LibK_GetProcAddress"); + if (pLibK_GetProcAddress == NULL) { + usbi_err(ctx, "LibK_GetProcAddress() not found in libusbK DLL"); + FreeLibrary(h); + return LIBUSB_ERROR_NOT_FOUND; + } + } + + native_winusb = (pLibK_GetProcAddress == NULL); + for (i = 0; i < SUB_API_MAX; i++) { + WinUSBX_Set(AbortPipe); + WinUSBX_Set(ControlTransfer); + WinUSBX_Set(FlushPipe); + WinUSBX_Set(Free); + WinUSBX_Set(GetAssociatedInterface); + WinUSBX_Set(Initialize); + WinUSBX_Set(ReadPipe); + if (!native_winusb) + WinUSBX_Set(ResetDevice); + WinUSBX_Set(ResetPipe); + WinUSBX_Set(SetCurrentAlternateSetting); + WinUSBX_Set(SetPipePolicy); + WinUSBX_Set(WritePipe); + WinUSBX_Set(IsoReadPipe); + WinUSBX_Set(IsoWritePipe); + + if (WinUSBX[i].Initialize != NULL) { + WinUSBX[i].initialized = true; + // Assume driver supports CancelIoEx() if it is available + WinUSBX[i].CancelIoEx_supported = (pCancelIoEx != NULL); + usbi_dbg("initalized sub API %s", winusbx_driver_names[i]); + } else { + usbi_warn(ctx, "Failed to initalize sub API %s", winusbx_driver_names[i]); + WinUSBX[i].initialized = false; + } + } + + WinUSBX_handle = h; + return LIBUSB_SUCCESS; +} + +static void winusbx_exit(void) +{ + if (WinUSBX_handle != NULL) { + FreeLibrary(WinUSBX_handle); + WinUSBX_handle = NULL; + + /* Reset the WinUSBX API structures */ + memset(&WinUSBX, 0, sizeof(WinUSBX)); + } +} + +// NB: open and close must ensure that they only handle interface of +// the right API type, as these functions can be called wholesale from +// composite_open(), with interfaces belonging to different APIs +static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + HANDLE file_handle; + int i; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // WinUSB requires a separate handle for each interface + for (i = 0; i < USB_MAXINTERFACES; i++) { + if ((priv->usb_interface[i].path != NULL) + && (priv->usb_interface[i].apib->id == USB_API_WINUSBX)) { + file_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (file_handle == INVALID_HANDLE_VALUE) { + usbi_err(ctx, "could not open device %s (interface %d): %s", priv->usb_interface[i].path, i, windows_error_str(0)); + switch (GetLastError()) { + case ERROR_FILE_NOT_FOUND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_ACCESS_DENIED: + return LIBUSB_ERROR_ACCESS; + default: + return LIBUSB_ERROR_IO; + } + } + handle_priv->interface_handle[i].dev_handle = file_handle; + } + } + return LIBUSB_SUCCESS; +} + +static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE handle; + int i; + + if (sub_api == SUB_API_NOTSET) + sub_api = priv->sub_api; + + if (!WinUSBX[sub_api].initialized) + return; + + if (priv->apib->id == USB_API_COMPOSITE) { + // If this is a composite device, just free and close all WinUSB-like + // interfaces directly (each is independent and not associated with another) + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (priv->usb_interface[i].apib->id == USB_API_WINUSBX) { + handle = handle_priv->interface_handle[i].api_handle; + if (HANDLE_VALID(handle)) + WinUSBX[sub_api].Free(handle); + + handle = handle_priv->interface_handle[i].dev_handle; + if (HANDLE_VALID(handle)) + CloseHandle(handle); + } + } + } else { + // If this is a WinUSB device, free all interfaces above interface 0, + // then free and close interface 0 last + for (i = 1; i < USB_MAXINTERFACES; i++) { + handle = handle_priv->interface_handle[i].api_handle; + if (HANDLE_VALID(handle)) + WinUSBX[sub_api].Free(handle); + } + handle = handle_priv->interface_handle[0].api_handle; + if (HANDLE_VALID(handle)) + WinUSBX[sub_api].Free(handle); + + handle = handle_priv->interface_handle[0].dev_handle; + if (HANDLE_VALID(handle)) + CloseHandle(handle); + } +} + +static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle = handle_priv->interface_handle[iface].api_handle; + UCHAR policy; + ULONG timeout = 0; + uint8_t endpoint_address; + int i; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // With handle and enpoints set (in parent), we can setup the default pipe properties + // see http://download.microsoft.com/download/D/1/D/D1DD7745-426B-4CC3-A269-ABBBE427C0EF/DVC-T705_DDC08.pptx + for (i = -1; i < priv->usb_interface[iface].nb_endpoints; i++) { + endpoint_address = (i == -1) ? 0 : priv->usb_interface[iface].endpoint[i]; + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + PIPE_TRANSFER_TIMEOUT, sizeof(ULONG), &timeout)) + usbi_dbg("failed to set PIPE_TRANSFER_TIMEOUT for control endpoint %02X", endpoint_address); + + if ((i == -1) || (sub_api == SUB_API_LIBUSB0)) + continue; // Other policies don't apply to control endpoint or libusb0 + + policy = false; + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + SHORT_PACKET_TERMINATE, sizeof(UCHAR), &policy)) + usbi_dbg("failed to disable SHORT_PACKET_TERMINATE for endpoint %02X", endpoint_address); + + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + IGNORE_SHORT_PACKETS, sizeof(UCHAR), &policy)) + usbi_dbg("failed to disable IGNORE_SHORT_PACKETS for endpoint %02X", endpoint_address); + + policy = true; + /* ALLOW_PARTIAL_READS must be enabled due to likely libusbK bug. See: + https://sourceforge.net/mailarchive/message.php?msg_id=29736015 */ + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + ALLOW_PARTIAL_READS, sizeof(UCHAR), &policy)) + usbi_dbg("failed to enable ALLOW_PARTIAL_READS for endpoint %02X", endpoint_address); + + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + AUTO_CLEAR_STALL, sizeof(UCHAR), &policy)) + usbi_dbg("failed to enable AUTO_CLEAR_STALL for endpoint %02X", endpoint_address); + } + + return LIBUSB_SUCCESS; +} + +static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + bool is_using_usbccgp = (priv->apib->id == USB_API_COMPOSITE); + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; + HDEVINFO dev_info = INVALID_HANDLE_VALUE; + SP_DEVINFO_DATA dev_info_data; + char *dev_path_no_guid = NULL; + char filter_path[] = "\\\\.\\libusb0-0000"; + bool found_filter = false; + HANDLE file_handle, winusb_handle; + DWORD err; + int i; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // If the device is composite, but using the default Windows composite parent driver (usbccgp) + // or if it's the first WinUSB-like interface, we get a handle through Initialize(). + if ((is_using_usbccgp) || (iface == 0)) { + // composite device (independent interfaces) or interface 0 + file_handle = handle_priv->interface_handle[iface].dev_handle; + if (!HANDLE_VALID(file_handle)) + return LIBUSB_ERROR_NOT_FOUND; + + if (!WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + err = GetLastError(); + switch (err) { + case ERROR_BAD_COMMAND: + // The device was disconnected + usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + default: + // it may be that we're using the libusb0 filter driver. + // TODO: can we move this whole business into the K/0 DLL? + for (i = 0; ; i++) { + safe_free(dev_interface_details); + safe_free(dev_path_no_guid); + + dev_interface_details = get_interface_details_filter(ctx, &dev_info, &dev_info_data, &GUID_DEVINTERFACE_LIBUSB0_FILTER, i, filter_path); + if ((found_filter) || (dev_interface_details == NULL)) + break; + + // ignore GUID part + dev_path_no_guid = sanitize_path(strtok(dev_interface_details->DevicePath, "{")); + if (dev_path_no_guid == NULL) + continue; + + if (strncmp(dev_path_no_guid, priv->usb_interface[iface].path, strlen(dev_path_no_guid)) == 0) { + file_handle = CreateFileA(filter_path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (file_handle != INVALID_HANDLE_VALUE) { + if (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { + // Replace the existing file handle with the working one + CloseHandle(handle_priv->interface_handle[iface].dev_handle); + handle_priv->interface_handle[iface].dev_handle = file_handle; + found_filter = true; + } else { + usbi_err(ctx, "could not initialize filter driver for %s", filter_path); + CloseHandle(file_handle); + } + } else { + usbi_err(ctx, "could not open device %s: %s", filter_path, windows_error_str(0)); + } + } + } + free(dev_interface_details); + if (!found_filter) { + usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(err)); + return LIBUSB_ERROR_ACCESS; + } + } + } + handle_priv->interface_handle[iface].api_handle = winusb_handle; + } else { + // For all other interfaces, use GetAssociatedInterface() + winusb_handle = handle_priv->interface_handle[0].api_handle; + // It is a requirement for multiple interface devices on Windows that, to you + // must first claim the first interface before you claim the others + if (!HANDLE_VALID(winusb_handle)) { + file_handle = handle_priv->interface_handle[0].dev_handle; + if (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { + handle_priv->interface_handle[0].api_handle = winusb_handle; + usbi_warn(ctx, "auto-claimed interface 0 (required to claim %d with WinUSB)", iface); + } else { + usbi_warn(ctx, "failed to auto-claim interface 0 (required to claim %d with WinUSB): %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + } + if (!WinUSBX[sub_api].GetAssociatedInterface(winusb_handle, (UCHAR)(iface - 1), + &handle_priv->interface_handle[iface].api_handle)) { + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + switch (GetLastError()) { + case ERROR_NO_MORE_ITEMS: // invalid iface + return LIBUSB_ERROR_NOT_FOUND; + case ERROR_BAD_COMMAND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_ALREADY_EXISTS: // already claimed + return LIBUSB_ERROR_BUSY; + default: + usbi_err(ctx, "could not claim interface %d: %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + } + } + usbi_dbg("claimed interface %d", iface); + handle_priv->active_interface = iface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + winusb_handle = handle_priv->interface_handle[iface].api_handle; + if (!HANDLE_VALID(winusb_handle)) + return LIBUSB_ERROR_NOT_FOUND; + + WinUSBX[sub_api].Free(winusb_handle); + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + + return LIBUSB_SUCCESS; +} + +/* + * Return the first valid interface (of the same API type), for control transfers + */ +static int get_valid_interface(struct libusb_device_handle *dev_handle, int api_id) +{ + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + int i; + + if ((api_id < USB_API_WINUSBX) || (api_id > USB_API_HID)) { + usbi_dbg("unsupported API ID"); + return -1; + } + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (HANDLE_VALID(handle_priv->interface_handle[i].dev_handle) + && HANDLE_VALID(handle_priv->interface_handle[i].api_handle) + && (priv->usb_interface[i].apib->id == api_id)) + return i; + } + + return -1; +} + +/* + * Lookup interface by endpoint address. -1 if not found + */ +static int interface_by_endpoint(struct winusb_device_priv *priv, + struct winusb_device_handle_priv *handle_priv, uint8_t endpoint_address) +{ + int i, j; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (!HANDLE_VALID(handle_priv->interface_handle[i].api_handle)) + continue; + if (priv->usb_interface[i].endpoint == NULL) + continue; + for (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) { + if (priv->usb_interface[i].endpoint[j] == endpoint_address) + return i; + } + } + + return -1; +} + +static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + PWINUSB_SETUP_PACKET setup = (PWINUSB_SETUP_PACKET)transfer->buffer; + ULONG size; + HANDLE winusb_handle; + OVERLAPPED *overlapped; + int current_interface; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + size = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; + + // Windows places upper limits on the control transfer size + // See: https://msdn.microsoft.com/en-us/library/windows/hardware/ff538112.aspx + if (size > MAX_CTRL_BUFFER_LENGTH) + return LIBUSB_ERROR_INVALID_PARAM; + + current_interface = get_valid_interface(transfer->dev_handle, USB_API_WINUSBX); + if (current_interface < 0) { + if (auto_claim(transfer, ¤t_interface, USB_API_WINUSBX) != LIBUSB_SUCCESS) + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("will use interface %d", current_interface); + + transfer_priv->handle = winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + overlapped = transfer_priv->pollable_fd.overlapped; + + // Sending of set configuration control requests from WinUSB creates issues + if ((LIBUSB_REQ_TYPE(setup->RequestType) == LIBUSB_REQUEST_TYPE_STANDARD) + && (setup->Request == LIBUSB_REQUEST_SET_CONFIGURATION)) { + if (setup->Value != priv->active_config) { + usbi_warn(ctx, "cannot set configuration other than the default one"); + return LIBUSB_ERROR_INVALID_PARAM; + } + windows_force_sync_completion(overlapped, 0); + } else { + if (!WinUSBX[sub_api].ControlTransfer(winusb_handle, *setup, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, size, NULL, overlapped)) { + if (GetLastError() != ERROR_IO_PENDING) { + usbi_warn(ctx, "ControlTransfer failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + } else { + windows_force_sync_completion(overlapped, size); + } + } + + transfer_priv->interface_number = (uint8_t)current_interface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + if (altsetting > 255) + return LIBUSB_ERROR_INVALID_PARAM; + + winusb_handle = handle_priv->interface_handle[iface].api_handle; + if (!HANDLE_VALID(winusb_handle)) { + usbi_err(ctx, "interface must be claimed first"); + return LIBUSB_ERROR_NOT_FOUND; + } + + if (!WinUSBX[sub_api].SetCurrentAlternateSetting(winusb_handle, (UCHAR)altsetting)) { + usbi_err(ctx, "SetCurrentAlternateSetting failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + + return LIBUSB_SUCCESS; +} + +static int winusbx_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + HANDLE winusb_handle; + OVERLAPPED *overlapped; + bool ret; + int current_interface; + int i; + UINT offset; + PKISO_CONTEXT iso_context; + size_t iso_ctx_size; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + if ((sub_api != SUB_API_LIBUSBK) && (sub_api != SUB_API_LIBUSB0)) { + // iso only supported on libusbk-based backends + PRINT_UNSUPPORTED_API(submit_iso_transfer); + return LIBUSB_ERROR_NOT_SUPPORTED; + }; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); + + transfer_priv->handle = winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + overlapped = transfer_priv->pollable_fd.overlapped; + + iso_ctx_size = sizeof(KISO_CONTEXT) + (transfer->num_iso_packets * sizeof(KISO_PACKET)); + transfer_priv->iso_context = iso_context = calloc(1, iso_ctx_size); + if (transfer_priv->iso_context == NULL) + return LIBUSB_ERROR_NO_MEM; + + // start ASAP + iso_context->StartFrame = 0; + iso_context->NumberOfPackets = (SHORT)transfer->num_iso_packets; + + // convert the transfer packet lengths to iso_packet offsets + offset = 0; + for (i = 0; i < transfer->num_iso_packets; i++) { + iso_context->IsoPackets[i].offset = offset; + offset += transfer->iso_packet_desc[i].length; + } + + if (IS_XFERIN(transfer)) { + usbi_dbg("reading %d iso packets", transfer->num_iso_packets); + ret = WinUSBX[sub_api].IsoReadPipe(winusb_handle, transfer->endpoint, transfer->buffer, transfer->length, overlapped, iso_context); + } else { + usbi_dbg("writing %d iso packets", transfer->num_iso_packets); + ret = WinUSBX[sub_api].IsoWritePipe(winusb_handle, transfer->endpoint, transfer->buffer, transfer->length, overlapped, iso_context); + } + + if (!ret) { + if (GetLastError() != ERROR_IO_PENDING) { + usbi_err(ctx, "IsoReadPipe/IsoWritePipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + } else { + windows_force_sync_completion(overlapped, (ULONG)transfer->length); + } + + transfer_priv->interface_number = (uint8_t)current_interface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + HANDLE winusb_handle; + OVERLAPPED *overlapped; + bool ret; + int current_interface; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); + + transfer_priv->handle = winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + overlapped = transfer_priv->pollable_fd.overlapped; + + if (IS_XFERIN(transfer)) { + usbi_dbg("reading %d bytes", transfer->length); + ret = WinUSBX[sub_api].ReadPipe(winusb_handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, overlapped); + } else { + usbi_dbg("writing %d bytes", transfer->length); + ret = WinUSBX[sub_api].WritePipe(winusb_handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, overlapped); + } + + if (!ret) { + if (GetLastError() != ERROR_IO_PENDING) { + usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + } else { + windows_force_sync_completion(overlapped, (ULONG)transfer->length); + } + + transfer_priv->interface_number = (uint8_t)current_interface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + int current_interface; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + current_interface = interface_by_endpoint(priv, handle_priv, endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", endpoint, current_interface); + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + if (!WinUSBX[sub_api].ResetPipe(winusb_handle, endpoint)) { + usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +/* + * from http://www.winvistatips.com/winusb-bugchecks-t335323.html (confirmed + * through testing as well): + * "You can not call WinUsb_AbortPipe on control pipe. You can possibly cancel + * the control transfer using CancelIo" + */ +static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer) +{ + // Cancelling of the I/O is done in the parent + return LIBUSB_SUCCESS; +} + +static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + HANDLE handle; + int current_interface; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + current_interface = transfer_priv->interface_number; + if ((current_interface < 0) || (current_interface >= USB_MAXINTERFACES)) { + usbi_err(ctx, "program assertion failed: invalid interface_number"); + return LIBUSB_ERROR_NOT_FOUND; + } + usbi_dbg("will use interface %d", current_interface); + + if (WinUSBX[sub_api].CancelIoEx_supported) { + // Try to use CancelIoEx if available to cancel just a single transfer + handle = handle_priv->interface_handle[current_interface].dev_handle; + if (pCancelIoEx(handle, transfer_priv->pollable_fd.overlapped)) + return LIBUSB_SUCCESS; + else if (GetLastError() == ERROR_NOT_FOUND) + return LIBUSB_ERROR_NOT_FOUND; + + // Not every driver implements the necessary functionality for CancelIoEx + usbi_warn(ctx, "CancelIoEx not supported for sub API %s", winusbx_driver_names[sub_api]); + WinUSBX[sub_api].CancelIoEx_supported = false; + } + + handle = handle_priv->interface_handle[current_interface].api_handle; + if (!WinUSBX[sub_api].AbortPipe(handle, transfer->endpoint)) { + usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +/* + * from the "How to Use WinUSB to Communicate with a USB Device" Microsoft white paper + * (http://www.microsoft.com/whdc/connect/usb/winusb_howto.mspx): + * "WinUSB does not support host-initiated reset port and cycle port operations" and + * IOCTL_INTERNAL_USB_CYCLE_PORT is only available in kernel mode and the + * IOCTL_USB_HUB_CYCLE_PORT ioctl was removed from Vista => the best we can do is + * cycle the pipes (and even then, the control pipe can not be reset using WinUSB) + */ +// TODO: (post hotplug): see if we can force eject the device and redetect it (reuse hotplug?) +static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + int i, j; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // Reset any available pipe (except control) + for (i = 0; i < USB_MAXINTERFACES; i++) { + winusb_handle = handle_priv->interface_handle[i].api_handle; + if (HANDLE_VALID(winusb_handle)) { + for (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) { + usbi_dbg("resetting ep %02X", priv->usb_interface[i].endpoint[j]); + if (!WinUSBX[sub_api].AbortPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) + usbi_err(ctx, "AbortPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + + // FlushPipe seems to fail on OUT pipes + if (IS_EPIN(priv->usb_interface[i].endpoint[j]) + && (!WinUSBX[sub_api].FlushPipe(winusb_handle, priv->usb_interface[i].endpoint[j]))) + usbi_err(ctx, "FlushPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + + if (!WinUSBX[sub_api].ResetPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) + usbi_err(ctx, "ResetPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + } + } + } + + // libusbK & libusb0 have the ability to issue an actual device reset + if (WinUSBX[sub_api].ResetDevice != NULL) { + winusb_handle = handle_priv->interface_handle[0].api_handle; + if (HANDLE_VALID(winusb_handle)) + WinUSBX[sub_api].ResetDevice(winusb_handle); + } + + return LIBUSB_SUCCESS; +} + +static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + PKISO_CONTEXT iso_context; + int i; + + if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { + CHECK_WINUSBX_AVAILABLE(sub_api); + + // for isochronous, need to copy the individual iso packet actual_lengths and statuses + if ((sub_api == SUB_API_LIBUSBK) || (sub_api == SUB_API_LIBUSB0)) { + // iso only supported on libusbk-based backends for now + iso_context = transfer_priv->iso_context; + for (i = 0; i < transfer->num_iso_packets; i++) { + transfer->iso_packet_desc[i].actual_length = iso_context->IsoPackets[i].actual_length; + // TODO translate USDB_STATUS codes http://msdn.microsoft.com/en-us/library/ff539136(VS.85).aspx to libusb_transfer_status + //transfer->iso_packet_desc[i].status = transfer_priv->iso_context->IsoPackets[i].status; + } + } else { + // This should only occur if backend is not set correctly or other backend isoc is partially implemented + PRINT_UNSUPPORTED_API(copy_transfer_data); + return LIBUSB_ERROR_NOT_SUPPORTED; + } + } + + itransfer->transferred += io_size; + return LIBUSB_TRANSFER_COMPLETED; +} + +/* + * Composite API functions + */ +static int composite_open(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + int r = LIBUSB_ERROR_NOT_FOUND; + uint8_t i; + // SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID + bool available[SUB_API_MAX + 1] = { 0 }; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + switch (priv->usb_interface[i].apib->id) { + case USB_API_WINUSBX: + if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) { + available[priv->usb_interface[i].sub_api] = true; + } + break; + case USB_API_HID: + available[SUB_API_MAX] = true; + break; + default: + break; + } + } + + for (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers + if (available[i]) { + r = usb_api_backend[USB_API_WINUSBX].open(i, dev_handle); + if (r != LIBUSB_SUCCESS) { + return r; + } + } + } +/* + if (available[SUB_API_MAX]) // HID driver + r = hid_open(SUB_API_NOTSET, dev_handle); +*/ + return r; +} + +static void composite_close(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + uint8_t i; + // SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID + bool available[SUB_API_MAX + 1] = { 0 }; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + switch (priv->usb_interface[i].apib->id) { + case USB_API_WINUSBX: + if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) + available[priv->usb_interface[i].sub_api] = true; + break; + case USB_API_HID: + available[SUB_API_MAX] = true; + break; + default: + break; + } + } + + for (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers + if (available[i]) + usb_api_backend[USB_API_WINUSBX].close(i, dev_handle); + } +/* + if (available[SUB_API_MAX]) // HID driver + hid_close(SUB_API_NOTSET, dev_handle); +*/ +} + +static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + + CHECK_SUPPORTED_API(priv->usb_interface[iface].apib, claim_interface); + + return priv->usb_interface[iface].apib-> + claim_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); +} + +static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + + CHECK_SUPPORTED_API(priv->usb_interface[iface].apib, set_interface_altsetting); + + return priv->usb_interface[iface].apib-> + set_interface_altsetting(priv->usb_interface[iface].sub_api, dev_handle, iface, altsetting); +} + +static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + + CHECK_SUPPORTED_API(priv->usb_interface[iface].apib, release_interface); + + return priv->usb_interface[iface].apib-> + release_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); +} + +static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + struct libusb_config_descriptor *conf_desc; + WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer; + int iface, pass, r; + + // Interface shouldn't matter for control, but it does in practice, with Windows' + // restrictions with regards to accessing HID keyboards and mice. Try to target + // a specific interface first, if possible. + switch (LIBUSB_REQ_RECIPIENT(setup->RequestType)) { + case LIBUSB_RECIPIENT_INTERFACE: + iface = setup->Index & 0xFF; + break; + case LIBUSB_RECIPIENT_ENDPOINT: + r = libusb_get_active_config_descriptor(transfer->dev_handle->dev, &conf_desc); + if (r == LIBUSB_SUCCESS) { + iface = get_interface_by_endpoint(conf_desc, (setup->Index & 0xFF)); + libusb_free_config_descriptor(conf_desc); + break; + } + // Fall through if not able to determine interface + default: + iface = -1; + break; + } + + // Try and target a specific interface if the control setup indicates such + if ((iface >= 0) && (iface < USB_MAXINTERFACES)) { + usbi_dbg("attempting control transfer targeted to interface %d", iface); + if ((priv->usb_interface[iface].path != NULL) + && (priv->usb_interface[iface].apib->submit_control_transfer != NULL)) { + r = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer); + if (r == LIBUSB_SUCCESS) + return r; + } + } + + // Either not targeted to a specific interface or no luck in doing so. + // Try a 2 pass approach with all interfaces. + for (pass = 0; pass < 2; pass++) { + for (iface = 0; iface < USB_MAXINTERFACES; iface++) { + if ((priv->usb_interface[iface].path != NULL) + && (priv->usb_interface[iface].apib->submit_control_transfer != NULL)) { + if ((pass == 0) && (priv->usb_interface[iface].restricted_functionality)) { + usbi_dbg("trying to skip restricted interface #%d (HID keyboard or mouse?)", iface); + continue; + } + usbi_dbg("using interface %d", iface); + r = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer); + // If not supported on this API, it may be supported on another, so don't give up yet!! + if (r == LIBUSB_ERROR_NOT_SUPPORTED) + continue; + return r; + } + } + } + usbi_err(ctx, "no libusb supported interfaces to complete request"); + return LIBUSB_ERROR_NOT_FOUND; +} + +static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, submit_bulk_transfer); + + return priv->usb_interface[current_interface].apib-> + submit_bulk_transfer(priv->usb_interface[current_interface].sub_api, itransfer); +} + +static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, submit_iso_transfer); + + return priv->usb_interface[current_interface].apib-> + submit_iso_transfer(priv->usb_interface[current_interface].sub_api, itransfer); +} + +static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct winusb_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); + return LIBUSB_ERROR_NOT_FOUND; + } + + CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, clear_halt); + + return priv->usb_interface[current_interface].apib-> + clear_halt(priv->usb_interface[current_interface].sub_api, dev_handle, endpoint); +} + +static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface = transfer_priv->interface_number; + + if ((current_interface < 0) || (current_interface >= USB_MAXINTERFACES)) { + usbi_err(TRANSFER_CTX(transfer), "program assertion failed: invalid interface_number"); + return LIBUSB_ERROR_NOT_FOUND; + } + + CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, abort_control); + + return priv->usb_interface[current_interface].apib-> + abort_control(priv->usb_interface[current_interface].sub_api, itransfer); +} + +static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface = transfer_priv->interface_number; + + if ((current_interface < 0) || (current_interface >= USB_MAXINTERFACES)) { + usbi_err(TRANSFER_CTX(transfer), "program assertion failed: invalid interface_number"); + return LIBUSB_ERROR_NOT_FOUND; + } + + CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, abort_transfers); + + return priv->usb_interface[current_interface].apib-> + abort_transfers(priv->usb_interface[current_interface].sub_api, itransfer); +} + +static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct winusb_device_priv *priv = _device_priv(dev_handle->dev); + int r; + uint8_t i; + bool available[SUB_API_MAX]; + + for (i = 0; i < SUB_API_MAX; i++) + available[i] = false; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if ((priv->usb_interface[i].apib->id == USB_API_WINUSBX) + && (priv->usb_interface[i].sub_api != SUB_API_NOTSET)) + available[priv->usb_interface[i].sub_api] = true; + } + + for (i = 0; i < SUB_API_MAX; i++) { + if (available[i]) { + r = usb_api_backend[USB_API_WINUSBX].reset_device(i, dev_handle); + if (r != LIBUSB_SUCCESS) + return r; + } + } + + return LIBUSB_SUCCESS; +} + +static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface = transfer_priv->interface_number; + + CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, copy_transfer_data); + + return priv->usb_interface[current_interface].apib-> + copy_transfer_data(priv->usb_interface[current_interface].sub_api, itransfer, io_size); +} diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_winusb.h b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_winusb.h new file mode 100644 index 000000000000..c1ad4eb9b2dd --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/os/windows_winusb.h @@ -0,0 +1,680 @@ +/* + * Windows backend for libusb 1.0 + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +#include "windows_common.h" +#include "windows_nt_common.h" + +#if defined(_MSC_VER) +// disable /W4 MSVC warnings that are benign +#pragma warning(disable:4100) // unreferenced formal parameter +#pragma warning(disable:4127) // conditional expression is constant +#pragma warning(disable:4201) // nameless struct/union +#pragma warning(disable:4214) // bit field types other than int +#pragma warning(disable:4996) // deprecated API calls +#pragma warning(disable:28159) // more deprecated API calls +#endif + +// Missing from MSVC6 setupapi.h +#ifndef SPDRP_ADDRESS +#define SPDRP_ADDRESS 28 +#endif +#ifndef SPDRP_INSTALL_STATE +#define SPDRP_INSTALL_STATE 34 +#endif + +#define MAX_CTRL_BUFFER_LENGTH 4096 +#define MAX_USB_STRING_LENGTH 128 +#define MAX_HID_REPORT_SIZE 1024 +#define MAX_HID_DESCRIPTOR_SIZE 256 +#define MAX_GUID_STRING_LENGTH 40 +#define MAX_PATH_LENGTH 128 +#define MAX_KEY_LENGTH 256 +#define LIST_SEPARATOR ';' + +// Handle code for HID interface that have been claimed ("dibs") +#define INTERFACE_CLAIMED ((HANDLE)(intptr_t)0xD1B5) +// Additional return code for HID operations that completed synchronously +#define LIBUSB_COMPLETED (LIBUSB_SUCCESS + 1) + +// http://msdn.microsoft.com/en-us/library/ff545978.aspx +// http://msdn.microsoft.com/en-us/library/ff545972.aspx +// http://msdn.microsoft.com/en-us/library/ff545982.aspx +#ifndef GUID_DEVINTERFACE_USB_HOST_CONTROLLER +const GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = {0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27}}; +#endif +#ifndef GUID_DEVINTERFACE_USB_DEVICE +const GUID GUID_DEVINTERFACE_USB_DEVICE = {0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}}; +#endif +#ifndef GUID_DEVINTERFACE_USB_HUB +const GUID GUID_DEVINTERFACE_USB_HUB = {0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8}}; +#endif +#ifndef GUID_DEVINTERFACE_LIBUSB0_FILTER +const GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = {0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9}}; +#endif + + +/* + * Multiple USB API backend support + */ +#define USB_API_UNSUPPORTED 0 +#define USB_API_HUB 1 +#define USB_API_COMPOSITE 2 +#define USB_API_WINUSBX 3 +#define USB_API_HID 4 +#define USB_API_MAX 5 + +// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL) +// Must have the same values as the KUSB_DRVID enum from libusbk.h +#define SUB_API_NOTSET -1 +#define SUB_API_LIBUSBK 0 +#define SUB_API_LIBUSB0 1 +#define SUB_API_WINUSB 2 +#define SUB_API_MAX 3 + +struct windows_usb_api_backend { + const uint8_t id; + const char * const designation; + const char * const * const driver_name_list; // Driver name, without .sys, e.g. "usbccgp" + const uint8_t nb_driver_names; + int (*init)(struct libusb_context *ctx); + void (*exit)(void); + int (*open)(int sub_api, struct libusb_device_handle *dev_handle); + void (*close)(int sub_api, struct libusb_device_handle *dev_handle); + int (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface); + int (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); + int (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); + int (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); + int (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); + int (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle); + int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer); + int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer); + int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer); + int (*abort_control)(int sub_api, struct usbi_transfer *itransfer); + int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer); + int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); +}; + +extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX]; + +#define PRINT_UNSUPPORTED_API(fname) \ + usbi_dbg("unsupported API call for '%s' " \ + "(unrecognized device driver)", #fname) + +#define CHECK_SUPPORTED_API(apip, fname) \ + do { \ + if ((apip)->fname == NULL) { \ + PRINT_UNSUPPORTED_API(fname); \ + return LIBUSB_ERROR_NOT_SUPPORTED; \ + } \ + } while (0) + +/* + * private structures definition + * with inline pseudo constructors/destructors + */ + +// TODO (v2+): move hid desc to libusb.h? +struct libusb_hid_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdHID; + uint8_t bCountryCode; + uint8_t bNumDescriptors; + uint8_t bClassDescriptorType; + uint16_t wClassDescriptorLength; +}; + +#define LIBUSB_DT_HID_SIZE 9 +#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \ + + LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE) +#define HID_MAX_REPORT_SIZE 1024 +#define HID_IN_EP 0x81 +#define HID_OUT_EP 0x02 +#define LIBUSB_REQ_RECIPIENT(request_type) ((request_type) & 0x1F) +#define LIBUSB_REQ_TYPE(request_type) ((request_type) & (0x03 << 5)) +#define LIBUSB_REQ_IN(request_type) ((request_type) & LIBUSB_ENDPOINT_IN) +#define LIBUSB_REQ_OUT(request_type) (!LIBUSB_REQ_IN(request_type)) + +#ifndef CTL_CODE +#define CTL_CODE(DeviceType, Function, Method, Access) \ + (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) +#endif + +// The following are used for HID reports IOCTLs +#define HID_IN_CTL_CODE(id) \ + CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS) +#define HID_OUT_CTL_CODE(id) \ + CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) +#define IOCTL_HID_GET_INPUT_REPORT HID_OUT_CTL_CODE(104) +#define IOCTL_HID_SET_FEATURE HID_IN_CTL_CODE(100) +#define IOCTL_HID_SET_OUTPUT_REPORT HID_IN_CTL_CODE(101) + +enum libusb_hid_request_type { + HID_REQ_GET_REPORT = 0x01, + HID_REQ_GET_IDLE = 0x02, + HID_REQ_GET_PROTOCOL = 0x03, + HID_REQ_SET_REPORT = 0x09, + HID_REQ_SET_IDLE = 0x0A, + HID_REQ_SET_PROTOCOL = 0x0B +}; + +enum libusb_hid_report_type { + HID_REPORT_TYPE_INPUT = 0x01, + HID_REPORT_TYPE_OUTPUT = 0x02, + HID_REPORT_TYPE_FEATURE = 0x03 +}; + +struct hid_device_priv { + uint16_t vid; + uint16_t pid; + uint8_t config; + uint8_t nb_interfaces; + bool uses_report_ids[3]; // input, ouptput, feature + uint16_t input_report_size; + uint16_t output_report_size; + uint16_t feature_report_size; + uint16_t usage; + uint16_t usagePage; + WCHAR string[3][MAX_USB_STRING_LENGTH]; + uint8_t string_index[3]; // man, prod, ser +}; + +static inline struct winusb_device_priv *_device_priv(struct libusb_device *dev) +{ + return (struct winusb_device_priv *)dev->os_priv; +} + +static inline struct winusb_device_priv *winusb_device_priv_init(struct libusb_device *dev) +{ + struct winusb_device_priv *p = _device_priv(dev); + int i; + + p->apib = &usb_api_backend[USB_API_UNSUPPORTED]; + p->sub_api = SUB_API_NOTSET; + for (i = 0; i < USB_MAXINTERFACES; i++) { + p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED]; + p->usb_interface[i].sub_api = SUB_API_NOTSET; + } + + return p; +} + +static inline void winusb_device_priv_release(struct libusb_device *dev) +{ + struct winusb_device_priv *p = _device_priv(dev); + int i; + + free(p->dev_id); + free(p->path); + if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) { + for (i = 0; i < dev->num_configurations; i++) + free(p->config_descriptor[i]); + } + free(p->config_descriptor); + free(p->hid); + for (i = 0; i < USB_MAXINTERFACES; i++) { + free(p->usb_interface[i].path); + free(p->usb_interface[i].endpoint); + } +} + +static inline struct winusb_device_handle_priv *_device_handle_priv( + struct libusb_device_handle *handle) +{ + return (struct winusb_device_handle_priv *)handle->os_priv; +} + +// used to match a device driver (including filter drivers) against a supported API +struct driver_lookup { + char list[MAX_KEY_LENGTH + 1]; // REG_MULTI_SZ list of services (driver) names + const DWORD reg_prop; // SPDRP registry key to use to retrieve list + const char* designation; // internal designation (for debug output) +}; + +/* + * Windows DDK API definitions. Most of it copied from MinGW's includes + */ +typedef DWORD DEVNODE, DEVINST; +typedef DEVNODE *PDEVNODE, *PDEVINST; +typedef DWORD RETURN_TYPE; +typedef RETURN_TYPE CONFIGRET; + +#define CR_SUCCESS 0x00000000 + +/* Cfgmgr32 dependencies */ +DLL_DECLARE_HANDLE(Cfgmgr32); +DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG)); + +/* AdvAPI32 dependencies */ +DLL_DECLARE_HANDLE(AdvAPI32); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); + +/* OLE32 dependency */ +DLL_DECLARE_HANDLE(OLE32); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, HRESULT, p, IIDFromString, (LPCOLESTR, LPIID)); + +/* SetupAPI dependencies */ +DLL_DECLARE_HANDLE(SetupAPI); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (LPCGUID, PCSTR, HWND, DWORD)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA, + LPCGUID, DWORD, PSP_DEVICE_INTERFACE_DATA)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInstanceIdA, (HDEVINFO, PSP_DEVINFO_DATA, + PCSTR, DWORD, PDWORD)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, + PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO, + PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD)); + + +#ifndef USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION +#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260 +#endif +#ifndef USB_GET_NODE_CONNECTION_INFORMATION_EX +#define USB_GET_NODE_CONNECTION_INFORMATION_EX 274 +#endif +#ifndef USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 +#define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 279 +#endif + +#ifndef FILE_DEVICE_USB +#define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN +#endif + +#define USB_CTL_CODE(id) \ + CTL_CODE(FILE_DEVICE_USB, (id), METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ + USB_CTL_CODE(USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION) + +#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ + USB_CTL_CODE(USB_GET_NODE_CONNECTION_INFORMATION_EX) + +#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \ + USB_CTL_CODE(USB_GET_NODE_CONNECTION_INFORMATION_EX_V2) + +typedef enum USB_CONNECTION_STATUS { + NoDeviceConnected, + DeviceConnected, + DeviceFailedEnumeration, + DeviceGeneralFailure, + DeviceCausedOvercurrent, + DeviceNotEnoughPower, + DeviceNotEnoughBandwidth, + DeviceHubNestedTooDeeply, + DeviceInLegacyHub +} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; + +typedef enum USB_HUB_NODE { + UsbHub, + UsbMIParent +} USB_HUB_NODE; + +// Most of the structures below need to be packed +#include + +typedef struct _USB_DESCRIPTOR_REQUEST { + ULONG ConnectionIndex; + struct { + UCHAR bmRequest; + UCHAR bRequest; + USHORT wValue; + USHORT wIndex; + USHORT wLength; + } SetupPacket; +// UCHAR Data[0]; +} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; + +typedef struct _USB_CONFIGURATION_DESCRIPTOR_SHORT { + USB_DESCRIPTOR_REQUEST req; + USB_CONFIGURATION_DESCRIPTOR desc; +} USB_CONFIGURATION_DESCRIPTOR_SHORT; + +typedef struct USB_INTERFACE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bInterfaceNumber; + UCHAR bAlternateSetting; + UCHAR bNumEndpoints; + UCHAR bInterfaceClass; + UCHAR bInterfaceSubClass; + UCHAR bInterfaceProtocol; + UCHAR iInterface; +} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; + +typedef struct _USB_NODE_CONNECTION_INFORMATION_EX { + ULONG ConnectionIndex; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + UCHAR CurrentConfigurationValue; + UCHAR Speed; + BOOLEAN DeviceIsHub; + USHORT DeviceAddress; + ULONG NumberOfOpenPipes; + USB_CONNECTION_STATUS ConnectionStatus; +// USB_PIPE_INFO PipeList[0]; +} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX; + +typedef union _USB_PROTOCOLS { + ULONG ul; + struct { + ULONG Usb110:1; + ULONG Usb200:1; + ULONG Usb300:1; + ULONG ReservedMBZ:29; + }; +} USB_PROTOCOLS, *PUSB_PROTOCOLS; + +typedef union _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS { + ULONG ul; + struct { + ULONG DeviceIsOperatingAtSuperSpeedOrHigher:1; + ULONG DeviceIsSuperSpeedCapableOrHigher:1; + ULONG ReservedMBZ:30; + }; +} USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS; + +typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 { + ULONG ConnectionIndex; + ULONG Length; + USB_PROTOCOLS SupportedUsbProtocols; + USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags; +} USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2; + +#include + +/* winusb.dll interface */ + +#define SHORT_PACKET_TERMINATE 0x01 +#define AUTO_CLEAR_STALL 0x02 +#define PIPE_TRANSFER_TIMEOUT 0x03 +#define IGNORE_SHORT_PACKETS 0x04 +#define ALLOW_PARTIAL_READS 0x05 +#define AUTO_FLUSH 0x06 +#define RAW_IO 0x07 +#define MAXIMUM_TRANSFER_SIZE 0x08 + +typedef enum _USBD_PIPE_TYPE { + UsbdPipeTypeControl, + UsbdPipeTypeIsochronous, + UsbdPipeTypeBulk, + UsbdPipeTypeInterrupt +} USBD_PIPE_TYPE; + +#include + +typedef struct _WINUSB_SETUP_PACKET { + UCHAR RequestType; + UCHAR Request; + USHORT Value; + USHORT Index; + USHORT Length; +} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET; + +#include + +typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; + +typedef BOOL (WINAPI *WinUsb_AbortPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID +); +typedef BOOL (WINAPI *WinUsb_ControlTransfer_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + WINUSB_SETUP_PACKET SetupPacket, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +); +typedef BOOL (WINAPI *WinUsb_FlushPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID +); +typedef BOOL (WINAPI *WinUsb_Free_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AssociatedInterfaceIndex, + PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_Initialize_t)( + HANDLE DeviceHandle, + PWINUSB_INTERFACE_HANDLE InterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_ReadPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +); +typedef BOOL (WINAPI *WinUsb_ResetDevice_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_ResetPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID +); +typedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AlternateSetting +); +typedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + ULONG PolicyType, + ULONG ValueLength, + PVOID Value +); +typedef BOOL (WINAPI *WinUsb_WritePipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +); + +/* /!\ These must match the ones from the official libusbk.h */ +typedef enum _KUSB_FNID { + KUSB_FNID_Init, + KUSB_FNID_Free, + KUSB_FNID_ClaimInterface, + KUSB_FNID_ReleaseInterface, + KUSB_FNID_SetAltInterface, + KUSB_FNID_GetAltInterface, + KUSB_FNID_GetDescriptor, + KUSB_FNID_ControlTransfer, + KUSB_FNID_SetPowerPolicy, + KUSB_FNID_GetPowerPolicy, + KUSB_FNID_SetConfiguration, + KUSB_FNID_GetConfiguration, + KUSB_FNID_ResetDevice, + KUSB_FNID_Initialize, + KUSB_FNID_SelectInterface, + KUSB_FNID_GetAssociatedInterface, + KUSB_FNID_Clone, + KUSB_FNID_QueryInterfaceSettings, + KUSB_FNID_QueryDeviceInformation, + KUSB_FNID_SetCurrentAlternateSetting, + KUSB_FNID_GetCurrentAlternateSetting, + KUSB_FNID_QueryPipe, + KUSB_FNID_SetPipePolicy, + KUSB_FNID_GetPipePolicy, + KUSB_FNID_ReadPipe, + KUSB_FNID_WritePipe, + KUSB_FNID_ResetPipe, + KUSB_FNID_AbortPipe, + KUSB_FNID_FlushPipe, + KUSB_FNID_IsoReadPipe, + KUSB_FNID_IsoWritePipe, + KUSB_FNID_GetCurrentFrameNumber, + KUSB_FNID_GetOverlappedResult, + KUSB_FNID_GetProperty, + KUSB_FNID_COUNT, +} KUSB_FNID; + +typedef struct _KLIB_VERSION { + INT Major; + INT Minor; + INT Micro; + INT Nano; +} KLIB_VERSION, *PKLIB_VERSION; + +typedef BOOL (WINAPI *LibK_GetProcAddress_t)( + PVOID *ProcAddress, + ULONG DriverID, + ULONG FunctionID +); + +typedef VOID (WINAPI *LibK_GetVersion_t)( + PKLIB_VERSION Version +); + +//KISO_PACKET is equivalent of libusb_iso_packet_descriptor except uses absolute "offset" field instead of sequential Lengths +typedef struct _KISO_PACKET { + UINT offset; + USHORT actual_length; //changed from libusbk_shared.h "Length" for clarity + USHORT status; +} KISO_PACKET, *PKISO_PACKET; + +typedef enum _KISO_FLAG { + KISO_FLAG_NONE = 0, + KISO_FLAG_SET_START_FRAME = 0x00000001, +} KISO_FLAG; + +//KISO_CONTEXT is the conceptual equivalent of libusb_transfer except is isochronous-specific and must match libusbk's version +typedef struct _KISO_CONTEXT { + KISO_FLAG Flags; + UINT StartFrame; + SHORT ErrorCount; + SHORT NumberOfPackets; + UINT UrbHdrStatus; + KISO_PACKET IsoPackets[0]; +} KISO_CONTEXT, *PKISO_CONTEXT; + +typedef BOOL(WINAPI *WinUsb_IsoReadPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + LPOVERLAPPED Overlapped, + PKISO_CONTEXT IsoContext +); + +typedef BOOL(WINAPI *WinUsb_IsoWritePipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + LPOVERLAPPED Overlapped, + PKISO_CONTEXT IsoContext +); + +struct winusb_interface { + bool initialized; + bool CancelIoEx_supported; + WinUsb_AbortPipe_t AbortPipe; + WinUsb_ControlTransfer_t ControlTransfer; + WinUsb_FlushPipe_t FlushPipe; + WinUsb_Free_t Free; + WinUsb_GetAssociatedInterface_t GetAssociatedInterface; + WinUsb_Initialize_t Initialize; + WinUsb_ReadPipe_t ReadPipe; + WinUsb_ResetDevice_t ResetDevice; + WinUsb_ResetPipe_t ResetPipe; + WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting; + WinUsb_SetPipePolicy_t SetPipePolicy; + WinUsb_WritePipe_t WritePipe; + WinUsb_IsoReadPipe_t IsoReadPipe; + WinUsb_IsoWritePipe_t IsoWritePipe; +}; + +/* hid.dll interface */ + +#define HIDP_STATUS_SUCCESS 0x110000 +typedef void * PHIDP_PREPARSED_DATA; + +#include +#include + +typedef USHORT USAGE; + +typedef enum _HIDP_REPORT_TYPE { + HidP_Input, + HidP_Output, + HidP_Feature +} HIDP_REPORT_TYPE; + +typedef struct _HIDP_VALUE_CAPS { + USAGE UsagePage; + UCHAR ReportID; + BOOLEAN IsAlias; + USHORT BitField; + USHORT LinkCollection; + USAGE LinkUsage; + USAGE LinkUsagePage; + BOOLEAN IsRange; + BOOLEAN IsStringRange; + BOOLEAN IsDesignatorRange; + BOOLEAN IsAbsolute; + BOOLEAN HasNull; + UCHAR Reserved; + USHORT BitSize; + USHORT ReportCount; + USHORT Reserved2[5]; + ULONG UnitsExp; + ULONG Units; + LONG LogicalMin, LogicalMax; + LONG PhysicalMin, PhysicalMax; + union { + struct { + USAGE UsageMin, UsageMax; + USHORT StringMin, StringMax; + USHORT DesignatorMin, DesignatorMax; + USHORT DataIndexMin, DataIndexMax; + } Range; + struct { + USAGE Usage, Reserved1; + USHORT StringIndex, Reserved2; + USHORT DesignatorIndex, Reserved3; + USHORT DataIndex, Reserved4; + } NotRange; + } u; +} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS; + +DLL_DECLARE_HANDLE(hid); +DLL_DECLARE_FUNC(WINAPI, VOID, HidD_GetHidGuid, (LPGUID)); +DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG)); +DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FlushQueue, (HANDLE)); +DLL_DECLARE_FUNC(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA)); diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/strerror.c b/vendor/github.com/karalabe/usb/libusb/libusb/strerror.c similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/libusb/strerror.c rename to vendor/github.com/karalabe/usb/libusb/libusb/strerror.c diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/sync.c b/vendor/github.com/karalabe/usb/libusb/libusb/sync.c similarity index 100% rename from vendor/github.com/karalabe/hid/libusb/libusb/sync.c rename to vendor/github.com/karalabe/usb/libusb/libusb/sync.c diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/version.h b/vendor/github.com/karalabe/usb/libusb/libusb/version.h similarity index 94% rename from vendor/github.com/karalabe/hid/libusb/libusb/version.h rename to vendor/github.com/karalabe/usb/libusb/libusb/version.h index 6ce48a7d01ad..c6dfe3709344 100644 --- a/vendor/github.com/karalabe/hid/libusb/libusb/version.h +++ b/vendor/github.com/karalabe/usb/libusb/libusb/version.h @@ -7,7 +7,7 @@ #define LIBUSB_MINOR 0 #endif #ifndef LIBUSB_MICRO -#define LIBUSB_MICRO 21 +#define LIBUSB_MICRO 22 #endif #ifndef LIBUSB_NANO #define LIBUSB_NANO 0 diff --git a/vendor/github.com/karalabe/usb/libusb/libusb/version_nano.h b/vendor/github.com/karalabe/usb/libusb/libusb/version_nano.h new file mode 100644 index 000000000000..90a782a6bf94 --- /dev/null +++ b/vendor/github.com/karalabe/usb/libusb/libusb/version_nano.h @@ -0,0 +1 @@ +#define LIBUSB_NANO 11312 diff --git a/vendor/github.com/karalabe/usb/raw_disabled.go b/vendor/github.com/karalabe/usb/raw_disabled.go new file mode 100644 index 000000000000..a05ef8ebb211 --- /dev/null +++ b/vendor/github.com/karalabe/usb/raw_disabled.go @@ -0,0 +1,42 @@ +// usb - Self contained USB and HID library for Go +// Copyright 2017 The library Authors +// +// This library is free software: you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// The library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with the library. If not, see . + +// +build !freebsd,!linux,!darwin,!windows ios !cgo + +package usb + +// RawDevice is a live raw USB connected device handle. On platforms that this file +// implements, the type lacks the actual USB device and all methods are noop. +type RawDevice struct { + DeviceInfo // Embed the infos for easier access +} + +// Close releases the USB device handle. On platforms that this file implements, +// the method is just a noop. +func (dev *RawDevice) Close() error { + return ErrUnsupportedPlatform +} + +// Write sends a binary blob to a USB device. On platforms that this file +// implements, the method just returns an error. +func (dev *RawDevice) Write(b []byte) (int, error) { + return 0, ErrUnsupportedPlatform +} + +// Read retrieves a binary blob from a USB device. On platforms that this file +// implements, the method just returns an error. +func (dev *RawDevice) Read(b []byte) (int, error) { + return 0, ErrUnsupportedPlatform +} diff --git a/vendor/github.com/karalabe/usb/raw_enabled.go b/vendor/github.com/karalabe/usb/raw_enabled.go new file mode 100644 index 000000000000..326ac97add3a --- /dev/null +++ b/vendor/github.com/karalabe/usb/raw_enabled.go @@ -0,0 +1,253 @@ +// usb - Self contained USB and HID library for Go +// Copyright 2019 The library Authors +// +// This library is free software: you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// The library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with the library. If not, see . + +// +build freebsd,cgo linux,cgo darwin,!ios,cgo windows,cgo + +package usb + +/* + #include "./libusb/libusb/libusb.h" + + // ctx is a global libusb context to interact with devices through. + libusb_context* ctx; +*/ +import "C" + +import ( + "fmt" + "reflect" + "sync" + "unsafe" +) + +// enumerateRaw returns a list of all the USB devices attached to the system which +// match the vendor and product id: +// - If the vendor id is set to 0 then any vendor matches. +// - If the product id is set to 0 then any product matches. +// - If the vendor and product id are both 0, all USB devices are returned. +func enumerateRaw(vendorID uint16, productID uint16) ([]DeviceInfo, error) { + // Enumerate the devices, and free all the matching refcounts (we'll reopen any + // explicitly requested). + infos, err := enumerateRawWithRef(vendorID, productID) + for _, info := range infos { + C.libusb_unref_device(info.rawDevice.(*C.libusb_device)) + } + // If enumeration failed, don't return anything, otherwise everything + if err != nil { + return nil, err + } + return infos, nil +} + +// enumerateRawWithRef is the internal device enumerator that retains 1 reference +// to every matched device so they may selectively be opened on request. +func enumerateRawWithRef(vendorID uint16, productID uint16) ([]DeviceInfo, error) { + // Ensure we have a libusb context to interact through. The enumerate call is + // protexted by a mutex outside, so it's fine to do the below check and init. + if C.ctx == nil { + if err := fromRawErrno(C.libusb_init((**C.libusb_context)(&C.ctx))); err != nil { + return nil, fmt.Errorf("failed to initialize libusb: %v", err) + } + } + // Retrieve all the available USB devices and wrap them in Go + var deviceList **C.libusb_device + count := C.libusb_get_device_list(C.ctx, &deviceList) + if count < 0 { + return nil, rawError(count) + } + defer C.libusb_free_device_list(deviceList, 1) + + var devices []*C.libusb_device + *(*reflect.SliceHeader)(unsafe.Pointer(&devices)) = reflect.SliceHeader{ + Data: uintptr(unsafe.Pointer(deviceList)), + Len: int(count), + Cap: int(count), + } + // + var infos []DeviceInfo + for devnum, dev := range devices { + // Retrieve the libusb device descriptor and skip non-queried ones + var desc C.struct_libusb_device_descriptor + if err := fromRawErrno(C.libusb_get_device_descriptor(dev, &desc)); err != nil { + return infos, fmt.Errorf("failed to get device %d descriptor: %v", devnum, err) + } + if (vendorID > 0 && uint16(desc.idVendor) != vendorID) || (productID > 0 && uint16(desc.idProduct) != productID) { + continue + } + // Skip HID devices, they are handled directly by OS libraries + if desc.bDeviceClass == C.LIBUSB_CLASS_HID { + continue + } + // Iterate over all the configurations and find raw interfaces + for cfgnum := 0; cfgnum < int(desc.bNumConfigurations); cfgnum++ { + // Retrieve the all the possible USB configurations of the device + var cfg *C.struct_libusb_config_descriptor + if err := fromRawErrno(C.libusb_get_config_descriptor(dev, C.uint8_t(cfgnum), &cfg)); err != nil { + return infos, fmt.Errorf("failed to get device %d config %d: %v", devnum, cfgnum, err) + } + var ifaces []C.struct_libusb_interface + *(*reflect.SliceHeader)(unsafe.Pointer(&ifaces)) = reflect.SliceHeader{ + Data: uintptr(unsafe.Pointer(cfg._interface)), + Len: int(cfg.bNumInterfaces), + Cap: int(cfg.bNumInterfaces), + } + // Drill down into each advertised interface + for ifacenum, iface := range ifaces { + if iface.num_altsetting == 0 { + continue + } + var alts []C.struct_libusb_interface_descriptor + *(*reflect.SliceHeader)(unsafe.Pointer(&alts)) = reflect.SliceHeader{ + Data: uintptr(unsafe.Pointer(iface.altsetting)), + Len: int(iface.num_altsetting), + Cap: int(iface.num_altsetting), + } + for _, alt := range alts { + // Skip HID interfaces, they are handled directly by OS libraries + if alt.bInterfaceClass == C.LIBUSB_CLASS_HID { + continue + } + // Find the endpoints that can speak libusb interrupts + var ends []C.struct_libusb_endpoint_descriptor + *(*reflect.SliceHeader)(unsafe.Pointer(&ends)) = reflect.SliceHeader{ + Data: uintptr(unsafe.Pointer(alt.endpoint)), + Len: int(alt.bNumEndpoints), + Cap: int(alt.bNumEndpoints), + } + var reader, writer *uint8 + for _, end := range ends { + // Skip any non-interrupt endpoints + if end.bmAttributes != C.LIBUSB_TRANSFER_TYPE_INTERRUPT { + continue + } + if end.bEndpointAddress&C.LIBUSB_ENDPOINT_IN == C.LIBUSB_ENDPOINT_IN { + reader = new(uint8) + *reader = uint8(end.bEndpointAddress) + } else { + writer = new(uint8) + *writer = uint8(end.bEndpointAddress) + } + } + // If both in and out interrupts are available, match the device + if reader != nil && writer != nil { + // Enumeration matched, bump the device refcount to avoid cleaning it up + C.libusb_ref_device(dev) + + port := uint8(C.libusb_get_port_number(dev)) + infos = append(infos, DeviceInfo{ + Path: fmt.Sprintf("%04x:%04x:%02d", vendorID, uint16(desc.idProduct), port), + VendorID: uint16(desc.idVendor), + ProductID: uint16(desc.idProduct), + Interface: ifacenum, + rawDevice: dev, + rawPort: &port, + rawReader: reader, + rawWriter: writer, + }) + } + } + } + } + } + return infos, nil +} + +// openRaw connects to a low level libusb device by its path name. +func openRaw(info DeviceInfo) (*rawDevice, error) { + // Enumerate all the devices matching this particular info + matches, err := enumerateRawWithRef(info.VendorID, info.ProductID) + if err != nil { + // Enumeration failed, make sure any subresults are released + for _, match := range matches { + C.libusb_unref_device(match.rawDevice.(*C.libusb_device)) + } + return nil, err + } + // Find the specific endpoint we're interested in + var device *C.libusb_device + for _, match := range matches { + // Keep the matching device reference, release anything else + if device == nil && *match.rawPort == *info.rawPort && match.Interface == info.Interface { + device = match.rawDevice.(*C.libusb_device) + } else { + C.libusb_unref_device(match.rawDevice.(*C.libusb_device)) + } + } + if device == nil { + return nil, fmt.Errorf("failed to open device: not found") + } + // Open the mathcing device + info.rawDevice = device + + var handle *C.struct_libusb_device_handle + if err := fromRawErrno(C.libusb_open(info.rawDevice.(*C.libusb_device), (**C.struct_libusb_device_handle)(&handle))); err != nil { + return nil, fmt.Errorf("failed to open device: %v", err) + } + if err := fromRawErrno(C.libusb_claim_interface(handle, (C.int)(info.Interface))); err != nil { + C.libusb_close(handle) + return nil, fmt.Errorf("failed to claim interface: %v", err) + } + return &rawDevice{ + DeviceInfo: info, + handle: handle, + }, nil +} + +// rawDevice is a live low level USB connected device handle. +type rawDevice struct { + DeviceInfo // Embed the infos for easier access + + handle *C.struct_libusb_device_handle // Low level USB device to communicate through + lock sync.Mutex +} + +// Close releases the raw USB device handle. +func (dev *rawDevice) Close() error { + dev.lock.Lock() + defer dev.lock.Unlock() + + if dev.handle != nil { + C.libusb_release_interface(dev.handle, (C.int)(dev.Interface)) + C.libusb_close(dev.handle) + dev.handle = nil + } + C.libusb_unref_device(dev.rawDevice.(*C.libusb_device)) + + return nil +} + +// Write sends a binary blob to a low level USB device. +func (dev *rawDevice) Write(b []byte) (int, error) { + dev.lock.Lock() + defer dev.lock.Unlock() + + var transferred C.int + if err := fromRawErrno(C.libusb_interrupt_transfer(dev.handle, (C.uchar)(*dev.rawWriter), (*C.uchar)(&b[0]), (C.int)(len(b)), &transferred, (C.uint)(0))); err != nil { + return 0, fmt.Errorf("failed to write to device: %v", err) + } + return int(transferred), nil +} + +// Read retrieves a binary blob from a low level USB device. +func (dev *rawDevice) Read(b []byte) (int, error) { + dev.lock.Lock() + defer dev.lock.Unlock() + + var transferred C.int + if err := fromRawErrno(C.libusb_interrupt_transfer(dev.handle, (C.uchar)(*dev.rawReader), (*C.uchar)(&b[0]), (C.int)(len(b)), &transferred, (C.uint)(0))); err != nil { + return 0, fmt.Errorf("failed to read from device: %v", err) + } + return int(transferred), nil +} diff --git a/vendor/github.com/karalabe/usb/raw_errors.go b/vendor/github.com/karalabe/usb/raw_errors.go new file mode 100644 index 000000000000..9e071f861fe7 --- /dev/null +++ b/vendor/github.com/karalabe/usb/raw_errors.go @@ -0,0 +1,74 @@ +// Copyright 2013 Google Inc. All rights reserved. +// Copyright 2016 the gousb Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package usb + +import ( + "fmt" +) + +// #include "./libusb/libusb/libusb.h" +import "C" + +// rawError is an error code from libusb. +type rawError C.int + +// Error implements the error interface. +func (e rawError) Error() string { + return fmt.Sprintf("libusb: %s [code %d]", rawErrorString[e], e) +} + +// fromRawErrno converts a raw libusb error into a Go type. +func fromRawErrno(errno C.int) error { + err := rawError(errno) + if err == errSuccess { + return nil + } + return err +} + +const ( + errSuccess rawError = C.LIBUSB_SUCCESS + errIO rawError = C.LIBUSB_ERROR_IO + errInvalidParam rawError = C.LIBUSB_ERROR_INVALID_PARAM + errAccess rawError = C.LIBUSB_ERROR_ACCESS + errNoDevice rawError = C.LIBUSB_ERROR_NO_DEVICE + errNotFound rawError = C.LIBUSB_ERROR_NOT_FOUND + errBusy rawError = C.LIBUSB_ERROR_BUSY + errTimeout rawError = C.LIBUSB_ERROR_TIMEOUT + errOverflow rawError = C.LIBUSB_ERROR_OVERFLOW + errPipe rawError = C.LIBUSB_ERROR_PIPE + errInterrupted rawError = C.LIBUSB_ERROR_INTERRUPTED + errNoMem rawError = C.LIBUSB_ERROR_NO_MEM + errNotSupported rawError = C.LIBUSB_ERROR_NOT_SUPPORTED + errOther rawError = C.LIBUSB_ERROR_OTHER +) + +var rawErrorString = map[rawError]string{ + errSuccess: "success", + errIO: "i/o error", + errInvalidParam: "invalid param", + errAccess: "bad access", + errNoDevice: "no device", + errNotFound: "not found", + errBusy: "device or resource busy", + errTimeout: "timeout", + errOverflow: "overflow", + errPipe: "pipe error", + errInterrupted: "interrupted", + errNoMem: "out of memory", + errNotSupported: "not supported", + errOther: "unknown error", +} diff --git a/vendor/github.com/karalabe/usb/usb.go b/vendor/github.com/karalabe/usb/usb.go new file mode 100644 index 000000000000..96a1e2502c1b --- /dev/null +++ b/vendor/github.com/karalabe/usb/usb.go @@ -0,0 +1,68 @@ +// usb - Self contained USB and HID library for Go +// Copyright 2019 The library Authors +// +// This library is free software: you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// The library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with the library. If not, see . + +// Package usb provide interfaces for generic USB devices. +package usb + +import "errors" + +// ErrDeviceClosed is returned for operations where the device closed before or +// during the execution. +var ErrDeviceClosed = errors.New("usb: device closed") + +// ErrUnsupportedPlatform is returned for all operations where the underlying +// operating system is not supported by the library. +var ErrUnsupportedPlatform = errors.New("usb: unsupported platform") + +// DeviceInfo contains all the information we know about a USB device. In case of +// HID devices, that might be a lot more extensive (empty fields for raw USB). +type DeviceInfo struct { + Path string // Platform-specific device path + VendorID uint16 // Device Vendor ID + ProductID uint16 // Device Product ID + Release uint16 // Device Release Number in binary-coded decimal, also known as Device Version Number + Serial string // Serial Number + Manufacturer string // Manufacturer String + Product string // Product string + UsagePage uint16 // Usage Page for this Device/Interface (Windows/Mac only) + Usage uint16 // Usage for this Device/Interface (Windows/Mac only) + + // The USB interface which this logical device + // represents. Valid on both Linux implementations + // in all cases, and valid on the Windows implementation + // only if the device contains more than one interface. + Interface int + + // Raw low level libusb endpoint data for simplified communication + rawDevice interface{} + rawPort *uint8 // Pointer to differentiate between unset and port 0 + rawReader *uint8 // Pointer to differentiate between unset and endpoint 0 + rawWriter *uint8 // Pointer to differentiate between unset and endpoint 0 +} + +// Device is a generic USB device interface. It may either be backed by a USB HID +// device or a low level raw (libusb) device. +type Device interface { + // Close releases the USB device handle. + Close() error + + // Write sends a binary blob to a USB device. For HID devices write uses reports, + // for low level USB write uses interrupt transfers. + Write(b []byte) (int, error) + + // Read retrieves a binary blob from a USB device. For HID devices read uses + // reports, for low level USB read uses interrupt transfers. + Read(b []byte) (int, error) +} diff --git a/vendor/github.com/karalabe/usb/usb_disabled.go b/vendor/github.com/karalabe/usb/usb_disabled.go new file mode 100644 index 000000000000..77c90076119b --- /dev/null +++ b/vendor/github.com/karalabe/usb/usb_disabled.go @@ -0,0 +1,51 @@ +// usb - Self contained USB and HID library for Go +// Copyright 2019 The library Authors +// +// This library is free software: you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// The library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with the library. If not, see . + +// +build !freebsd,!linux,!darwin,!windows ios !cgo + +package usb + +// Supported returns whether this platform is supported by the USB library or not. +// The goal of this method is to allow programatically handling platforms that do +// not support USB and not having to fall back to build constraints. +func Supported() bool { + return false +} + +// Enumerate returns a list of all the USB devices attached to the system which +// match the vendor and product id. On platforms that this file implements the +// function is a noop and returns an empty list always. +func Enumerate(vendorID uint16, productID uint16) ([]DeviceInfo, error) { + return nil, nil +} + +// EnumerateRaw returns a list of all the USB devices attached to the system which +// match the vendor and product id. On platforms that this file implements the +// function is a noop and returns an empty list always. +func EnumerateRaw(vendorID uint16, productID uint16) ([]DeviceInfo, error) { + return nil, nil +} + +// EnumerateHid returns a list of all the HID devices attached to the system which +// match the vendor and product id. On platforms that this file implements the +// function is a noop and returns an empty list always. +func EnumerateHid(vendorID uint16, productID uint16) ([]DeviceInfo, error) { + return nil, nil +} + +// Open connects to a previsouly discovered USB device. +func (info DeviceInfo) Open() (Device, error) { + return nil, ErrUnsupportedPlatform +} diff --git a/vendor/github.com/karalabe/usb/usb_enabled.go b/vendor/github.com/karalabe/usb/usb_enabled.go new file mode 100644 index 000000000000..6ba37af7beb9 --- /dev/null +++ b/vendor/github.com/karalabe/usb/usb_enabled.go @@ -0,0 +1,98 @@ +// usb - Self contained USB and HID library for Go +// Copyright 2019 The library Authors +// +// This library is free software: you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// The library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along +// with the library. If not, see . + +// +build freebsd,cgo linux,cgo darwin,!ios,cgo windows,cgo + +package usb + +import ( + "sync" +) + +// enumerateLock is a mutex serializing access to USB device enumeration needed +// by the macOS USB HID system calls, which require 2 consecutive method calls +// for enumeration, causing crashes if called concurrently. +// +// For more details, see: +// https://developer.apple.com/documentation/iokit/1438371-iohidmanagersetdevicematching +// > "subsequent calls will cause the hid manager to release previously enumerated devices" +var enumerateLock sync.Mutex + +// Supported returns whether this platform is supported by the USB library or not. +// The goal of this method is to allow programatically handling platforms that do +// not support USB and not having to fall back to build constraints. +func Supported() bool { + return true +} + +// Enumerate returns a list of all the USB devices attached to the system which +// match the vendor and product id: +// - If the vendor id is set to 0 then any vendor matches. +// - If the product id is set to 0 then any product matches. +// - If the vendor and product id are both 0, all devices are returned. +// +// For any device that is HID capable, the enumeration will return an interface +// to the HID endpoints. For pure raw USB access, please use EnumerateRaw. +func Enumerate(vendorID uint16, productID uint16) ([]DeviceInfo, error) { + enumerateLock.Lock() + defer enumerateLock.Unlock() + + // Enumerate all the raw USB devices and skip the HID ones + raws, err := enumerateRaw(vendorID, productID) + if err != nil { + return nil, err + } + // Enumerate all the HID USB devices + hids, err := enumerateHid(vendorID, productID) + if err != nil { + return nil, err + } + return append(raws, hids...), nil +} + +// EnumerateRaw returns a list of all the USB devices attached to the system which +// match the vendor and product id: +// - If the vendor id is set to 0 then any vendor matches. +// - If the product id is set to 0 then any product matches. +// - If the vendor and product id are both 0, all devices are returned. +func EnumerateRaw(vendorID uint16, productID uint16) ([]DeviceInfo, error) { + enumerateLock.Lock() + defer enumerateLock.Unlock() + + return enumerateRaw(vendorID, productID) +} + +// EnumerateHid returns a list of all the HID devices attached to the system which +// match the vendor and product id: +// - If the vendor id is set to 0 then any vendor matches. +// - If the product id is set to 0 then any product matches. +// - If the vendor and product id are both 0, all devices are returned. +func EnumerateHid(vendorID uint16, productID uint16) ([]DeviceInfo, error) { + enumerateLock.Lock() + defer enumerateLock.Unlock() + + return enumerateHid(vendorID, productID) +} + +// Open connects to a previsouly discovered USB device. +func (info DeviceInfo) Open() (Device, error) { + enumerateLock.Lock() + defer enumerateLock.Unlock() + + if info.rawDevice == nil { + return openHid(info) + } + return openRaw(info) +} diff --git a/vendor/github.com/karalabe/hid/wchar.go b/vendor/github.com/karalabe/usb/wchar.go similarity index 98% rename from vendor/github.com/karalabe/hid/wchar.go rename to vendor/github.com/karalabe/usb/wchar.go index d103beff5ee5..cbc7e4d569e9 100644 --- a/vendor/github.com/karalabe/hid/wchar.go +++ b/vendor/github.com/karalabe/usb/wchar.go @@ -7,9 +7,9 @@ // https://github.com/orofarne/gowchar/blob/master/LICENSE // +build !ios -// +build linux darwin windows +// +build freebsd linux darwin windows -package hid +package usb /* #include diff --git a/vendor/github.com/maruel/panicparse/.travis.yml b/vendor/github.com/maruel/panicparse/.travis.yml deleted file mode 100644 index c6da8f0b8c00..000000000000 --- a/vendor/github.com/maruel/panicparse/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2014 Marc-Antoine Ruel. All rights reserved. -# Use of this source code is governed under the Apache License, Version 2.0 -# that can be found in the LICENSE file. - -sudo: false -language: go - -go: -- tip - -before_install: - - go get github.com/maruel/pre-commit-go/cmd/pcg - -script: - - pcg diff --git a/vendor/github.com/maruel/panicparse/LICENSE b/vendor/github.com/maruel/panicparse/LICENSE deleted file mode 100644 index b76840c25822..000000000000 --- a/vendor/github.com/maruel/panicparse/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2015 Marc-Antoine Ruel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/maruel/panicparse/README.md b/vendor/github.com/maruel/panicparse/README.md deleted file mode 100644 index 9fc039cd9ccc..000000000000 --- a/vendor/github.com/maruel/panicparse/README.md +++ /dev/null @@ -1,123 +0,0 @@ -panicparse -========== - -Parses panic stack traces, densifies and deduplicates goroutines with similar -stack traces. Helps debugging crashes and deadlocks in heavily parallelized -process. - -[![Build Status](https://travis-ci.org/maruel/panicparse.svg?branch=master)](https://travis-ci.org/maruel/panicparse) - -panicparse helps make sense of Go crash dumps: - -![Screencast](https://raw.githubusercontent.com/wiki/maruel/panicparse/parse.gif "Screencast") - - -Features --------- - - * >50% more compact output than original stack dump yet more readable. - * Exported symbols are bold, private symbols are darker. - * Stdlib is green, main is yellow, rest is red. - * Deduplicates redundant goroutine stacks. Useful for large server crashes. - * Arguments as pointer IDs instead of raw pointer values. - * Pushes stdlib-only stacks at the bottom to help focus on important code. - * Usable as a library! - [![GoDoc](https://godoc.org/github.com/maruel/panicparse/stack?status.svg)](https://godoc.org/github.com/maruel/panicparse/stack) - * Warning: please pin the version (e.g. vendor it). Breaking changes are - not planned but may happen. - * Parses the source files if available to augment the output. - * Works on Windows. - - -Installation ------------- - - go get github.com/maruel/panicparse/cmd/pp - - -Usage ------ - -### Piping a stack trace from another process - -#### TL;DR - - * Ubuntu (bash v4 or zsh): `|&` - * OSX, [install bash 4+](README.md#updating-bash-on-osx), then: `|&` - * Windows _or_ OSX with stock bash v3: `2>&1 |` - * [Fish](http://fishshell.com/) shell: `^|` - - -#### Longer version - -`pp` streams its stdin to stdout as long as it doesn't detect any panic. -`panic()` and Go's native deadlock detector [print to -stderr](https://golang.org/src/runtime/panic1.go) via the native [`print()` -function](https://golang.org/pkg/builtin/#print). - - -**Bash v4** or **zsh**: `|&` tells the shell to redirect stderr to stdout, -it's an alias for `2>&1 |` ([bash -v4](https://www.gnu.org/software/bash/manual/bash.html#Pipelines), -[zsh](http://zsh.sourceforge.net/Doc/Release/Shell-Grammar.html#Simple-Commands-_0026-Pipelines)): - - go test -v |&pp - - -**Windows or OSX native bash** [(which is -3.2.57)](http://meta.ath0.com/2012/02/05/apples-great-gpl-purge/): They don't -have this shortcut, so use the long form: - - go test -v 2>&1 | pp - - -**Fish**: It uses [^ for stderr -redirection](http://fishshell.com/docs/current/tutorial.html#tut_pipes_and_redirections) -so the shortcut is `^|`: - - go test -v ^|pp - - -**PowerShell**: [It has broken `2>&1` redirection](https://connect.microsoft.com/PowerShell/feedback/details/765551/in-powershell-v3-you-cant-redirect-stderr-to-stdout-without-generating-error-records). The workaround is to shell out to cmd.exe. :( - - -### Investigate deadlock - -On POSIX, use `Ctrl-\` to send SIGQUIT to your process, `pp` will ignore -the signal and will parse the stack trace. - - -### Parsing from a file - -To dump to a file then parse, pass the file path of a stack trace - - go test 2> stack.txt - pp stack.txt - - -Tips ----- - -### GOTRACEBACK - -Starting with Go 1.6, [`GOTRACEBACK`](https://golang.org/pkg/runtime/) defaults -to `single` instead of `all` / `1` that was used in 1.5 and before. To get all -goroutines trace and not just the crashing one, set the environment variable: - - export GOTRACEBACK=all - -or `set GOTRACEBACK=all` on Windows. Probably worth to put it in your `.bashrc`. - - -### Updating bash on OSX - -Install bash v4+ on OSX via [homebrew](http://brew.sh) or -[macports](https://www.macports.org/). Your future self will appreciate having -done that. - - -### If you have `/usr/bin/pp` installed - -You may have the Perl PAR Packager installed. Use long name `panicparse` then; - - go get github.com/maruel/panicparse diff --git a/vendor/github.com/maruel/panicparse/stack/source.go b/vendor/github.com/maruel/panicparse/stack/source.go deleted file mode 100644 index f09e67336a09..000000000000 --- a/vendor/github.com/maruel/panicparse/stack/source.go +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2015 Marc-Antoine Ruel. All rights reserved. -// Use of this source code is governed under the Apache License, Version 2.0 -// that can be found in the LICENSE file. - -// This file contains the code to process sources, to be able to deduct the -// original types. - -package stack - -import ( - "bytes" - "fmt" - "go/ast" - "go/parser" - "go/token" - "io/ioutil" - "log" - "math" - "strings" -) - -// cache is a cache of sources on the file system. -type cache struct { - files map[string][]byte - parsed map[string]*parsedFile -} - -// Augment processes source files to improve calls to be more descriptive. -// -// It modifies goroutines in place. -func Augment(goroutines []Goroutine) { - c := &cache{} - for i := range goroutines { - c.augmentGoroutine(&goroutines[i]) - } -} - -// augmentGoroutine processes source files to improve call to be more -// descriptive. -// -// It modifies the routine. -func (c *cache) augmentGoroutine(goroutine *Goroutine) { - if c.files == nil { - c.files = map[string][]byte{} - } - if c.parsed == nil { - c.parsed = map[string]*parsedFile{} - } - // For each call site, look at the next call and populate it. Then we can - // walk back and reformat things. - for i := range goroutine.Stack.Calls { - c.load(goroutine.Stack.Calls[i].SourcePath) - } - - // Once all loaded, we can look at the next call when available. - for i := 1; i < len(goroutine.Stack.Calls); i++ { - // Get the AST from the previous call and process the call line with it. - if f := c.getFuncAST(&goroutine.Stack.Calls[i]); f != nil { - processCall(&goroutine.Stack.Calls[i], f) - } - } -} - -// Private stuff. - -// load loads a source file and parses the AST tree. Failures are ignored. -func (c *cache) load(fileName string) { - if _, ok := c.parsed[fileName]; ok { - return - } - c.parsed[fileName] = nil - if !strings.HasSuffix(fileName, ".go") { - // Ignore C and assembly. - c.files[fileName] = nil - return - } - log.Printf("load(%s)", fileName) - if _, ok := c.files[fileName]; !ok { - var err error - if c.files[fileName], err = ioutil.ReadFile(fileName); err != nil { - log.Printf("Failed to read %s: %s", fileName, err) - c.files[fileName] = nil - return - } - } - fset := token.NewFileSet() - src := c.files[fileName] - parsed, err := parser.ParseFile(fset, fileName, src, 0) - if err != nil { - log.Printf("Failed to parse %s: %s", fileName, err) - return - } - // Convert the line number into raw file offset. - offsets := []int{0, 0} - start := 0 - for l := 1; start < len(src); l++ { - start += bytes.IndexByte(src[start:], '\n') + 1 - offsets = append(offsets, start) - } - c.parsed[fileName] = &parsedFile{offsets, parsed} -} - -func (c *cache) getFuncAST(call *Call) *ast.FuncDecl { - if p := c.parsed[call.SourcePath]; p != nil { - return p.getFuncAST(call.Func.Name(), call.Line) - } - return nil -} - -type parsedFile struct { - lineToByteOffset []int - parsed *ast.File -} - -// getFuncAST gets the callee site function AST representation for the code -// inside the function f at line l. -func (p *parsedFile) getFuncAST(f string, l int) (d *ast.FuncDecl) { - // Walk the AST to find the lineToByteOffset that fits the line number. - var lastFunc *ast.FuncDecl - var found ast.Node - // Inspect() goes depth first. This means for example that a function like: - // func a() { - // b := func() {} - // c() - // } - // - // Were we are looking at the c() call can return confused values. It is - // important to look at the actual ast.Node hierarchy. - ast.Inspect(p.parsed, func(n ast.Node) bool { - if d != nil { - return false - } - if n == nil { - return true - } - if found != nil { - // We are walking up. - } - if int(n.Pos()) >= p.lineToByteOffset[l] { - // We are expecting a ast.CallExpr node. It can be harder to figure out - // when there are multiple calls on a single line, as the stack trace - // doesn't have file byte offset information, only line based. - // gofmt will always format to one function call per line but there can - // be edge cases, like: - // a = A{Foo(), Bar()} - d = lastFunc - //p.processNode(call, n) - return false - } else if f, ok := n.(*ast.FuncDecl); ok { - lastFunc = f - } - return true - }) - return -} - -func name(n ast.Node) string { - if _, ok := n.(*ast.InterfaceType); ok { - return "interface{}" - } - if i, ok := n.(*ast.Ident); ok { - return i.Name - } - if _, ok := n.(*ast.FuncType); ok { - return "func" - } - if s, ok := n.(*ast.SelectorExpr); ok { - return s.Sel.Name - } - // TODO(maruel): Implement anything missing. - return "" -} - -// fieldToType returns the type name and whether if it's an ellipsis. -func fieldToType(f *ast.Field) (string, bool) { - switch arg := f.Type.(type) { - case *ast.ArrayType: - return "[]" + name(arg.Elt), false - case *ast.Ellipsis: - return name(arg.Elt), true - case *ast.FuncType: - // Do not print the function signature to not overload the trace. - return "func", false - case *ast.Ident: - return arg.Name, false - case *ast.InterfaceType: - return "interface{}", false - case *ast.SelectorExpr: - return arg.Sel.Name, false - case *ast.StarExpr: - return "*" + name(arg.X), false - default: - // TODO(maruel): Implement anything missing. - return "", false - } -} - -// extractArgumentsType returns the name of the type of each input argument. -func extractArgumentsType(f *ast.FuncDecl) ([]string, bool) { - var fields []*ast.Field - if f.Recv != nil { - if len(f.Recv.List) != 1 { - panic("Expect only one receiver; please fix panicparse's code") - } - // If it is an object receiver (vs a pointer receiver), its address is not - // printed in the stack trace so it needs to be ignored. - if _, ok := f.Recv.List[0].Type.(*ast.StarExpr); ok { - fields = append(fields, f.Recv.List[0]) - } - } - var types []string - extra := false - for _, arg := range append(fields, f.Type.Params.List...) { - // Assert that extra is only set on the last item of fields? - var t string - t, extra = fieldToType(arg) - mult := len(arg.Names) - if mult == 0 { - mult = 1 - } - for i := 0; i < mult; i++ { - types = append(types, t) - } - } - return types, extra -} - -// processCall walks the function and populate call accordingly. -func processCall(call *Call, f *ast.FuncDecl) { - values := make([]uint64, len(call.Args.Values)) - for i := range call.Args.Values { - values[i] = call.Args.Values[i].Value - } - index := 0 - pop := func() uint64 { - if len(values) != 0 { - x := values[0] - values = values[1:] - index++ - return x - } - return 0 - } - popName := func() string { - n := call.Args.Values[index].Name - v := pop() - if len(n) == 0 { - return fmt.Sprintf("0x%x", v) - } - return n - } - - types, extra := extractArgumentsType(f) - for i := 0; len(values) != 0; i++ { - var t string - if i >= len(types) { - if !extra { - // These are unexpected value! Print them as hex. - call.Args.Processed = append(call.Args.Processed, popName()) - continue - } - t = types[len(types)-1] - } else { - t = types[i] - } - switch t { - case "float32": - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%g", math.Float32frombits(uint32(pop())))) - case "float64": - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%g", math.Float64frombits(pop()))) - case "int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", "uint32", "uint64": - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%d", pop())) - case "string": - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%s(%s, len=%d)", t, popName(), pop())) - default: - if strings.HasPrefix(t, "*") { - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%s(%s)", t, popName())) - } else if strings.HasPrefix(t, "[]") { - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%s(%s len=%d cap=%d)", t, popName(), pop(), pop())) - } else { - // Assumes it's an interface. For now, discard the object value, which - // is probably not a good idea. - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%s(%s)", t, popName())) - pop() - } - } - if len(values) == 0 && call.Args.Elided { - return - } - } -} diff --git a/vendor/github.com/maruel/panicparse/stack/stack.go b/vendor/github.com/maruel/panicparse/stack/stack.go deleted file mode 100644 index cfb502e6639a..000000000000 --- a/vendor/github.com/maruel/panicparse/stack/stack.go +++ /dev/null @@ -1,832 +0,0 @@ -// Copyright 2015 Marc-Antoine Ruel. All rights reserved. -// Use of this source code is governed under the Apache License, Version 2.0 -// that can be found in the LICENSE file. - -// Package stack analyzes stack dump of Go processes and simplifies it. -// -// It is mostly useful on servers will large number of identical goroutines, -// making the crash dump harder to read than strictly necesary. -package stack - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "math" - "net/url" - "os" - "path/filepath" - "regexp" - "runtime" - "sort" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -const lockedToThread = "locked to thread" - -var ( - // TODO(maruel): Handle corrupted stack cases: - // - missed stack barrier - // - found next stack barrier at 0x123; expected - // - runtime: unexpected return pc for FUNC_NAME called from 0x123 - - reRoutineHeader = regexp.MustCompile("^goroutine (\\d+) \\[([^\\]]+)\\]\\:\n$") - reMinutes = regexp.MustCompile("^(\\d+) minutes$") - reUnavail = regexp.MustCompile("^(?:\t| +)goroutine running on other thread; stack unavailable") - // See gentraceback() in src/runtime/traceback.go for more information. - // - Sometimes the source file comes up as "". It is the - // compiler than generated these, not the runtime. - // - The tab may be replaced with spaces when a user copy-paste it, handle - // this transparently. - // - "runtime.gopanic" is explicitly replaced with "panic" by gentraceback(). - // - The +0x123 byte offset is printed when frame.pc > _func.entry. _func is - // generated by the linker. - // - The +0x123 byte offset is not included with generated code, e.g. unnamed - // functions "func·006()" which is generally go func() { ... }() - // statements. Since the _func is generated at runtime, it's probably why - // _func.entry is not set. - // - C calls may have fp=0x123 sp=0x123 appended. I think it normally happens - // when a signal is not correctly handled. It is printed with m.throwing>0. - // These are discarded. - // - For cgo, the source file may be "??". - reFile = regexp.MustCompile("^(?:\t| +)(\\?\\?|\\|.+\\.(?:c|go|s))\\:(\\d+)(?:| \\+0x[0-9a-f]+)(?:| fp=0x[0-9a-f]+ sp=0x[0-9a-f]+)\n$") - // Sadly, it doesn't note the goroutine number so we could cascade them per - // parenthood. - reCreated = regexp.MustCompile("^created by (.+)\n$") - reFunc = regexp.MustCompile("^(.+)\\((.*)\\)\n$") - reElided = regexp.MustCompile("^\\.\\.\\.additional frames elided\\.\\.\\.\n$") - // Include frequent GOROOT value on Windows, distro provided and user - // installed path. This simplifies the user's life when processing a trace - // generated on another VM. - // TODO(maruel): Guess the path automatically via traces containing the - // 'runtime' package, which is very frequent. This would be "less bad" than - // throwing up random values at the parser. - goroots = []string{runtime.GOROOT(), "c:/go", "/usr/lib/go", "/usr/local/go"} -) - -// Similarity is the level at which two call lines arguments must match to be -// considered similar enough to coalesce them. -type Similarity int - -const ( - // ExactFlags requires same bits (e.g. Locked). - ExactFlags Similarity = iota - // ExactLines requests the exact same arguments on the call line. - ExactLines - // AnyPointer considers different pointers a similar call line. - AnyPointer - // AnyValue accepts any value as similar call line. - AnyValue -) - -// Function is a function call. -// -// Go stack traces print a mangled function call, this wrapper unmangle the -// string before printing and adds other filtering methods. -type Function struct { - Raw string -} - -// String is the fully qualified function name. -// -// Sadly Go is a bit confused when the package name doesn't match the directory -// containing the source file and will use the directory name instead of the -// real package name. -func (f Function) String() string { - s, _ := url.QueryUnescape(f.Raw) - return s -} - -// Name is the naked function name. -func (f Function) Name() string { - parts := strings.SplitN(filepath.Base(f.Raw), ".", 2) - if len(parts) == 1 { - return parts[0] - } - return parts[1] -} - -// PkgName is the package name for this function reference. -func (f Function) PkgName() string { - parts := strings.SplitN(filepath.Base(f.Raw), ".", 2) - if len(parts) == 1 { - return "" - } - s, _ := url.QueryUnescape(parts[0]) - return s -} - -// PkgDotName returns "." format. -func (f Function) PkgDotName() string { - parts := strings.SplitN(filepath.Base(f.Raw), ".", 2) - s, _ := url.QueryUnescape(parts[0]) - if len(parts) == 1 { - return parts[0] - } - if s != "" || parts[1] != "" { - return s + "." + parts[1] - } - return "" -} - -// IsExported returns true if the function is exported. -func (f Function) IsExported() bool { - name := f.Name() - parts := strings.Split(name, ".") - r, _ := utf8.DecodeRuneInString(parts[len(parts)-1]) - if unicode.ToUpper(r) == r { - return true - } - return f.PkgName() == "main" && name == "main" -} - -// Arg is an argument on a Call. -type Arg struct { - Value uint64 // Value is the raw value as found in the stack trace - Name string // Name is a pseudo name given to the argument -} - -// IsPtr returns true if we guess it's a pointer. It's only a guess, it can be -// easily be confused by a bitmask. -func (a *Arg) IsPtr() bool { - // Assumes all pointers are above 16Mb and positive. - return a.Value > 16*1024*1024 && a.Value < math.MaxInt64 -} - -func (a Arg) String() string { - if a.Name != "" { - return a.Name - } - if a.Value == 0 { - return "0" - } - return fmt.Sprintf("0x%x", a.Value) -} - -// Args is a series of function call arguments. -type Args struct { - Values []Arg // Values is the arguments as shown on the stack trace. They are mangled via simplification. - Processed []string // Processed is the arguments generated from processing the source files. It can have a length lower than Values. - Elided bool // If set, it means there was a trailing ", ..." -} - -func (a Args) String() string { - var v []string - if len(a.Processed) != 0 { - v = make([]string, 0, len(a.Processed)) - for _, item := range a.Processed { - v = append(v, item) - } - } else { - v = make([]string, 0, len(a.Values)) - for _, item := range a.Values { - v = append(v, item.String()) - } - } - if a.Elided { - v = append(v, "...") - } - return strings.Join(v, ", ") -} - -// Equal returns true only if both arguments are exactly equal. -func (a *Args) Equal(r *Args) bool { - if a.Elided != r.Elided || len(a.Values) != len(r.Values) { - return false - } - for i, l := range a.Values { - if l != r.Values[i] { - return false - } - } - return true -} - -// Similar returns true if the two Args are equal or almost but not quite -// equal. -func (a *Args) Similar(r *Args, similar Similarity) bool { - if a.Elided != r.Elided || len(a.Values) != len(r.Values) { - return false - } - if similar == AnyValue { - return true - } - for i, l := range a.Values { - switch similar { - case ExactFlags, ExactLines: - if l != r.Values[i] { - return false - } - default: - if l.IsPtr() != r.Values[i].IsPtr() || (!l.IsPtr() && l != r.Values[i]) { - return false - } - } - } - return true -} - -// Merge merges two similar Args, zapping out differences. -func (a *Args) Merge(r *Args) Args { - out := Args{ - Values: make([]Arg, len(a.Values)), - Elided: a.Elided, - } - for i, l := range a.Values { - if l != r.Values[i] { - out.Values[i].Name = "*" - out.Values[i].Value = l.Value - } else { - out.Values[i] = l - } - } - return out -} - -// Call is an item in the stack trace. -type Call struct { - SourcePath string // Full path name of the source file - Line int // Line number - Func Function // Fully qualified function name (encoded). - Args Args // Call arguments -} - -// Equal returns true only if both calls are exactly equal. -func (c *Call) Equal(r *Call) bool { - return c.SourcePath == r.SourcePath && c.Line == r.Line && c.Func == r.Func && c.Args.Equal(&r.Args) -} - -// Similar returns true if the two Call are equal or almost but not quite -// equal. -func (c *Call) Similar(r *Call, similar Similarity) bool { - return c.SourcePath == r.SourcePath && c.Line == r.Line && c.Func == r.Func && c.Args.Similar(&r.Args, similar) -} - -// Merge merges two similar Call, zapping out differences. -func (c *Call) Merge(r *Call) Call { - return Call{ - SourcePath: c.SourcePath, - Line: c.Line, - Func: c.Func, - Args: c.Args.Merge(&r.Args), - } -} - -// SourceName returns the base file name of the source file. -func (c *Call) SourceName() string { - return filepath.Base(c.SourcePath) -} - -// SourceLine returns "source.go:line", including only the base file name. -func (c *Call) SourceLine() string { - return fmt.Sprintf("%s:%d", c.SourceName(), c.Line) -} - -// FullSourceLine returns "/path/to/source.go:line". -func (c *Call) FullSourceLine() string { - return fmt.Sprintf("%s:%d", c.SourcePath, c.Line) -} - -// PkgSource is one directory plus the file name of the source file. -func (c *Call) PkgSource() string { - return filepath.Join(filepath.Base(filepath.Dir(c.SourcePath)), c.SourceName()) -} - -const testMainSource = "_test" + string(os.PathSeparator) + "_testmain.go" - -// IsStdlib returns true if it is a Go standard library function. This includes -// the 'go test' generated main executable. -func (c *Call) IsStdlib() bool { - for _, goroot := range goroots { - if strings.HasPrefix(c.SourcePath, goroot) { - return true - } - } - // Consider _test/_testmain.go as stdlib since it's injected by "go test". - return c.PkgSource() == testMainSource -} - -// IsPkgMain returns true if it is in the main package. -func (c *Call) IsPkgMain() bool { - return c.Func.PkgName() == "main" -} - -// Stack is a call stack. -type Stack struct { - Calls []Call // Call stack. First is original function, last is leaf function. - Elided bool // Happens when there's >100 items in Stack, currently hardcoded in package runtime. -} - -// Equal returns true on if both call stacks are exactly equal. -func (s *Stack) Equal(r *Stack) bool { - if len(s.Calls) != len(r.Calls) || s.Elided != r.Elided { - return false - } - for i := range s.Calls { - if !s.Calls[i].Equal(&r.Calls[i]) { - return false - } - } - return true -} - -// Similar returns true if the two Stack are equal or almost but not quite -// equal. -func (s *Stack) Similar(r *Stack, similar Similarity) bool { - if len(s.Calls) != len(r.Calls) || s.Elided != r.Elided { - return false - } - for i := range s.Calls { - if !s.Calls[i].Similar(&r.Calls[i], similar) { - return false - } - } - return true -} - -// Merge merges two similar Stack, zapping out differences. -func (s *Stack) Merge(r *Stack) *Stack { - // Assumes similar stacks have the same length. - out := &Stack{ - Calls: make([]Call, len(s.Calls)), - Elided: s.Elided, - } - for i := range s.Calls { - out.Calls[i] = s.Calls[i].Merge(&r.Calls[i]) - } - return out -} - -// Less compares two Stack, where the ones that are less are more -// important, so they come up front. A Stack with more private functions is -// 'less' so it is at the top. Inversely, a Stack with only public -// functions is 'more' so it is at the bottom. -func (s *Stack) Less(r *Stack) bool { - lStdlib := 0 - lPrivate := 0 - for _, c := range s.Calls { - if c.IsStdlib() { - lStdlib++ - } else { - lPrivate++ - } - } - rStdlib := 0 - rPrivate := 0 - for _, s := range r.Calls { - if s.IsStdlib() { - rStdlib++ - } else { - rPrivate++ - } - } - if lPrivate > rPrivate { - return true - } - if lPrivate < rPrivate { - return false - } - if lStdlib > rStdlib { - return false - } - if lStdlib < rStdlib { - return true - } - - // Stack lengths are the same. - for x := range s.Calls { - if s.Calls[x].Func.Raw < r.Calls[x].Func.Raw { - return true - } - if s.Calls[x].Func.Raw > r.Calls[x].Func.Raw { - return true - } - if s.Calls[x].PkgSource() < r.Calls[x].PkgSource() { - return true - } - if s.Calls[x].PkgSource() > r.Calls[x].PkgSource() { - return true - } - if s.Calls[x].Line < r.Calls[x].Line { - return true - } - if s.Calls[x].Line > r.Calls[x].Line { - return true - } - } - return false -} - -// Signature represents the signature of one or multiple goroutines. -// -// It is effectively the stack trace plus the goroutine internal bits, like -// it's state, if it is thread locked, which call site created this goroutine, -// etc. -type Signature struct { - // Use git grep 'gopark(|unlock)\(' to find them all plus everything listed - // in runtime/traceback.go. Valid values includes: - // - chan send, chan receive, select - // - finalizer wait, mark wait (idle), - // - Concurrent GC wait, GC sweep wait, force gc (idle) - // - IO wait, panicwait - // - semacquire, semarelease - // - sleep, timer goroutine (idle) - // - trace reader (blocked) - // Stuck cases: - // - chan send (nil chan), chan receive (nil chan), select (no cases) - // Runnable states: - // - idle, runnable, running, syscall, waiting, dead, enqueue, copystack, - // Scan states: - // - scan, scanrunnable, scanrunning, scansyscall, scanwaiting, scandead, - // scanenqueue - State string - CreatedBy Call // Which other goroutine which created this one. - SleepMin int // Wait time in minutes, if applicable. - SleepMax int // Wait time in minutes, if applicable. - Stack Stack - Locked bool // Locked to an OS thread. -} - -// Equal returns true only if both signatures are exactly equal. -func (s *Signature) Equal(r *Signature) bool { - if s.State != r.State || !s.CreatedBy.Equal(&r.CreatedBy) || s.Locked != r.Locked || s.SleepMin != r.SleepMin || s.SleepMax != r.SleepMax { - return false - } - return s.Stack.Equal(&r.Stack) -} - -// Similar returns true if the two Signature are equal or almost but not quite -// equal. -func (s *Signature) Similar(r *Signature, similar Similarity) bool { - if s.State != r.State || !s.CreatedBy.Similar(&r.CreatedBy, similar) { - return false - } - if similar == ExactFlags && s.Locked != r.Locked { - return false - } - return s.Stack.Similar(&r.Stack, similar) -} - -// Merge merges two similar Signature, zapping out differences. -func (s *Signature) Merge(r *Signature) *Signature { - min := s.SleepMin - if r.SleepMin < min { - min = r.SleepMin - } - max := s.SleepMax - if r.SleepMax > max { - max = r.SleepMax - } - return &Signature{ - State: s.State, // Drop right side. - CreatedBy: s.CreatedBy, // Drop right side. - SleepMin: min, - SleepMax: max, - Stack: *s.Stack.Merge(&r.Stack), - Locked: s.Locked || r.Locked, // TODO(maruel): This is weirdo. - } -} - -// Less compares two Signature, where the ones that are less are more -// important, so they come up front. A Signature with more private functions is -// 'less' so it is at the top. Inversely, a Signature with only public -// functions is 'more' so it is at the bottom. -func (s *Signature) Less(r *Signature) bool { - if s.Stack.Less(&r.Stack) { - return true - } - if r.Stack.Less(&s.Stack) { - return false - } - if s.Locked && !r.Locked { - return true - } - if r.Locked && !s.Locked { - return false - } - if s.State < r.State { - return true - } - if s.State > r.State { - return false - } - return false -} - -// Goroutine represents the state of one goroutine, including the stack trace. -type Goroutine struct { - Signature // It's stack trace, internal bits, state, which call site created it, etc. - ID int // Goroutine ID. - First bool // First is the goroutine first printed, normally the one that crashed. -} - -// Bucketize returns the number of similar goroutines. -func Bucketize(goroutines []Goroutine, similar Similarity) map[*Signature][]Goroutine { - out := map[*Signature][]Goroutine{} - // O(n²). Fix eventually. - for _, routine := range goroutines { - found := false - for key := range out { - // When a match is found, this effectively drops the other goroutine ID. - if key.Similar(&routine.Signature, similar) { - found = true - if !key.Equal(&routine.Signature) { - // Almost but not quite equal. There's different pointers passed - // around but the same values. Zap out the different values. - newKey := key.Merge(&routine.Signature) - out[newKey] = append(out[key], routine) - delete(out, key) - } else { - out[key] = append(out[key], routine) - } - break - } - } - if !found { - key := &Signature{} - *key = routine.Signature - out[key] = []Goroutine{routine} - } - } - return out -} - -// Bucket is a stack trace signature and the list of goroutines that fits this -// signature. -type Bucket struct { - Signature - Routines []Goroutine -} - -// First returns true if it contains the first goroutine, e.g. the ones that -// likely generated the panic() call, if any. -func (b *Bucket) First() bool { - for _, r := range b.Routines { - if r.First { - return true - } - } - return false -} - -// Less does reverse sort. -func (b *Bucket) Less(r *Bucket) bool { - if b.First() { - return true - } - if r.First() { - return false - } - return b.Signature.Less(&r.Signature) -} - -// Buckets is a list of Bucket sorted by repeation count. -type Buckets []Bucket - -func (b Buckets) Len() int { - return len(b) -} - -func (b Buckets) Less(i, j int) bool { - return b[i].Less(&b[j]) -} - -func (b Buckets) Swap(i, j int) { - b[j], b[i] = b[i], b[j] -} - -// SortBuckets creates a list of Bucket from each goroutine stack trace count. -func SortBuckets(buckets map[*Signature][]Goroutine) Buckets { - out := make(Buckets, 0, len(buckets)) - for signature, count := range buckets { - out = append(out, Bucket{*signature, count}) - } - sort.Sort(out) - return out -} - -// scanLines is similar to bufio.ScanLines except that it: -// - doesn't drop '\n' -// - doesn't strip '\r' -// - returns when the data is bufio.MaxScanTokenSize bytes -func scanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { - if atEOF && len(data) == 0 { - return 0, nil, nil - } - if i := bytes.IndexByte(data, '\n'); i >= 0 { - return i + 1, data[0 : i+1], nil - } - if atEOF { - return len(data), data, nil - } - if len(data) >= bufio.MaxScanTokenSize { - // Returns the line even if it is not at EOF nor has a '\n', otherwise the - // scanner will return bufio.ErrTooLong which is definitely not what we - // want. - return len(data), data, nil - } - return 0, nil, nil -} - -// ParseDump processes the output from runtime.Stack(). -// -// It supports piping from another command and assumes there is junk before the -// actual stack trace. The junk is streamed to out. -func ParseDump(r io.Reader, out io.Writer) ([]Goroutine, error) { - goroutines := make([]Goroutine, 0, 16) - var goroutine *Goroutine - scanner := bufio.NewScanner(r) - scanner.Split(scanLines) - // TODO(maruel): Use a formal state machine. Patterns follows: - // - reRoutineHeader - // Either: - // - reUnavail - // - reFunc + reFile in a loop - // - reElided - // Optionally ends with: - // - reCreated + reFile - // Between each goroutine stack dump: an empty line - created := false - // firstLine is the first line after the reRoutineHeader header line. - firstLine := false - for scanner.Scan() { - line := scanner.Text() - if line == "\n" { - if goroutine != nil { - goroutine = nil - continue - } - } else if line[len(line)-1] == '\n' { - if goroutine == nil { - if match := reRoutineHeader.FindStringSubmatch(line); match != nil { - if id, err := strconv.Atoi(match[1]); err == nil { - // See runtime/traceback.go. - // ", \d+ minutes, locked to thread" - items := strings.Split(match[2], ", ") - sleep := 0 - locked := false - for i := 1; i < len(items); i++ { - if items[i] == lockedToThread { - locked = true - continue - } - // Look for duration, if any. - if match2 := reMinutes.FindStringSubmatch(items[i]); match2 != nil { - sleep, _ = strconv.Atoi(match2[1]) - } - } - goroutines = append(goroutines, Goroutine{ - Signature: Signature{ - State: items[0], - SleepMin: sleep, - SleepMax: sleep, - Locked: locked, - }, - ID: id, - First: len(goroutines) == 0, - }) - goroutine = &goroutines[len(goroutines)-1] - firstLine = true - continue - } - } - } else { - if firstLine { - firstLine = false - if match := reUnavail.FindStringSubmatch(line); match != nil { - // Generate a fake stack entry. - goroutine.Stack.Calls = []Call{{SourcePath: ""}} - continue - } - } - - if match := reFile.FindStringSubmatch(line); match != nil { - // Triggers after a reFunc or a reCreated. - num, err := strconv.Atoi(match[2]) - if err != nil { - return goroutines, fmt.Errorf("failed to parse int on line: \"%s\"", line) - } - if created { - created = false - goroutine.CreatedBy.SourcePath = match[1] - goroutine.CreatedBy.Line = num - } else { - i := len(goroutine.Stack.Calls) - 1 - if i < 0 { - return goroutines, errors.New("unexpected order") - } - goroutine.Stack.Calls[i].SourcePath = match[1] - goroutine.Stack.Calls[i].Line = num - } - continue - } - - if match := reCreated.FindStringSubmatch(line); match != nil { - created = true - goroutine.CreatedBy.Func.Raw = match[1] - continue - } - - if match := reFunc.FindStringSubmatch(line); match != nil { - args := Args{} - for _, a := range strings.Split(match[2], ", ") { - if a == "..." { - args.Elided = true - continue - } - if a == "" { - // Remaining values were dropped. - break - } - v, err := strconv.ParseUint(a, 0, 64) - if err != nil { - return goroutines, fmt.Errorf("failed to parse int on line: \"%s\"", line) - } - args.Values = append(args.Values, Arg{Value: v}) - } - goroutine.Stack.Calls = append(goroutine.Stack.Calls, Call{Func: Function{match[1]}, Args: args}) - continue - } - - if match := reElided.FindStringSubmatch(line); match != nil { - goroutine.Stack.Elided = true - continue - } - } - } - _, _ = io.WriteString(out, line) - goroutine = nil - } - nameArguments(goroutines) - return goroutines, scanner.Err() -} - -// Private stuff. - -func nameArguments(goroutines []Goroutine) { - // Set a name for any pointer occuring more than once. - type object struct { - args []*Arg - inPrimary bool - id int - } - objects := map[uint64]object{} - // Enumerate all the arguments. - for i := range goroutines { - for j := range goroutines[i].Stack.Calls { - for k := range goroutines[i].Stack.Calls[j].Args.Values { - arg := goroutines[i].Stack.Calls[j].Args.Values[k] - if arg.IsPtr() { - objects[arg.Value] = object{ - args: append(objects[arg.Value].args, &goroutines[i].Stack.Calls[j].Args.Values[k]), - inPrimary: objects[arg.Value].inPrimary || i == 0, - } - } - } - } - // CreatedBy.Args is never set. - } - order := uint64Slice{} - for k, obj := range objects { - if len(obj.args) > 1 && obj.inPrimary { - order = append(order, k) - } - } - sort.Sort(order) - nextID := 1 - for _, k := range order { - for _, arg := range objects[k].args { - arg.Name = fmt.Sprintf("#%d", nextID) - } - nextID++ - } - - // Now do the rest. This is done so the output is deterministic. - order = uint64Slice{} - for k := range objects { - order = append(order, k) - } - sort.Sort(order) - for _, k := range order { - // Process the remaining pointers, they were not referenced by primary - // thread so will have higher IDs. - if objects[k].inPrimary { - continue - } - for _, arg := range objects[k].args { - arg.Name = fmt.Sprintf("#%d", nextID) - } - nextID++ - } -} - -type uint64Slice []uint64 - -func (a uint64Slice) Len() int { return len(a) } -func (a uint64Slice) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a uint64Slice) Less(i, j int) bool { return a[i] < a[j] } diff --git a/vendor/github.com/maruel/panicparse/stack/ui.go b/vendor/github.com/maruel/panicparse/stack/ui.go deleted file mode 100644 index b125fc940687..000000000000 --- a/vendor/github.com/maruel/panicparse/stack/ui.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2016 Marc-Antoine Ruel. All rights reserved. -// Use of this source code is governed under the Apache License, Version 2.0 -// that can be found in the LICENSE file. - -package stack - -import ( - "fmt" - "strings" -) - -// Palette defines the color used. -// -// An empty object Palette{} can be used to disable coloring. -type Palette struct { - EOLReset string - - // Routine header. - RoutineFirst string // The first routine printed. - Routine string // Following routines. - CreatedBy string - - // Call line. - Package string - SourceFile string - FunctionStdLib string - FunctionStdLibExported string - FunctionMain string - FunctionOther string - FunctionOtherExported string - Arguments string -} - -// CalcLengths returns the maximum length of the source lines and package names. -func CalcLengths(buckets Buckets, fullPath bool) (int, int) { - srcLen := 0 - pkgLen := 0 - for _, bucket := range buckets { - for _, line := range bucket.Signature.Stack.Calls { - l := 0 - if fullPath { - l = len(line.FullSourceLine()) - } else { - l = len(line.SourceLine()) - } - if l > srcLen { - srcLen = l - } - l = len(line.Func.PkgName()) - if l > pkgLen { - pkgLen = l - } - } - } - return srcLen, pkgLen -} - -// functionColor returns the color to be used for the function name based on -// the type of package the function is in. -func (p *Palette) functionColor(line *Call) string { - if line.IsStdlib() { - if line.Func.IsExported() { - return p.FunctionStdLibExported - } - return p.FunctionStdLib - } else if line.IsPkgMain() { - return p.FunctionMain - } else if line.Func.IsExported() { - return p.FunctionOtherExported - } - return p.FunctionOther -} - -// routineColor returns the color for the header of the goroutines bucket. -func (p *Palette) routineColor(bucket *Bucket, multipleBuckets bool) string { - if bucket.First() && multipleBuckets { - return p.RoutineFirst - } - return p.Routine -} - -// BucketHeader prints the header of a goroutine signature. -func (p *Palette) BucketHeader(bucket *Bucket, fullPath, multipleBuckets bool) string { - extra := "" - if bucket.SleepMax != 0 { - if bucket.SleepMin != bucket.SleepMax { - extra += fmt.Sprintf(" [%d~%d minutes]", bucket.SleepMin, bucket.SleepMax) - } else { - extra += fmt.Sprintf(" [%d minutes]", bucket.SleepMax) - } - } - if bucket.Locked { - extra += " [locked]" - } - created := bucket.CreatedBy.Func.PkgDotName() - if created != "" { - created += " @ " - if fullPath { - created += bucket.CreatedBy.FullSourceLine() - } else { - created += bucket.CreatedBy.SourceLine() - } - extra += p.CreatedBy + " [Created by " + created + "]" - } - return fmt.Sprintf( - "%s%d: %s%s%s\n", - p.routineColor(bucket, multipleBuckets), len(bucket.Routines), - bucket.State, extra, - p.EOLReset) -} - -// callLine prints one stack line. -func (p *Palette) callLine(line *Call, srcLen, pkgLen int, fullPath bool) string { - src := "" - if fullPath { - src = line.FullSourceLine() - } else { - src = line.SourceLine() - } - return fmt.Sprintf( - " %s%-*s %s%-*s %s%s%s(%s)%s", - p.Package, pkgLen, line.Func.PkgName(), - p.SourceFile, srcLen, src, - p.functionColor(line), line.Func.Name(), - p.Arguments, line.Args, - p.EOLReset) -} - -// StackLines prints one complete stack trace, without the header. -func (p *Palette) StackLines(signature *Signature, srcLen, pkgLen int, fullPath bool) string { - out := make([]string, len(signature.Stack.Calls)) - for i := range signature.Stack.Calls { - out[i] = p.callLine(&signature.Stack.Calls[i], srcLen, pkgLen, fullPath) - } - if signature.Stack.Elided { - out = append(out, " (...)") - } - return strings.Join(out, "\n") + "\n" -} diff --git a/vendor/github.com/maruel/panicparse/vendor.yml b/vendor/github.com/maruel/panicparse/vendor.yml deleted file mode 100644 index ff3d43f5f2d7..000000000000 --- a/vendor/github.com/maruel/panicparse/vendor.yml +++ /dev/null @@ -1,17 +0,0 @@ -vendors: -- path: github.com/kr/pretty - rev: 737b74a46c4bf788349f72cb256fed10aea4d0ac -- path: github.com/kr/text - rev: 7cafcd837844e784b526369c9bce262804aebc60 -- path: github.com/maruel/ut - rev: a9c9f15ccfa6f8b90182a53df32f4745586fbae3 -- path: github.com/mattn/go-colorable - rev: 9056b7a9f2d1f2d96498d6d146acd1f9d5ed3d59 -- path: github.com/mattn/go-isatty - rev: 56b76bdf51f7708750eac80fa38b952bb9f32639 -- path: github.com/mgutz/ansi - rev: c286dcecd19ff979eeb73ea444e479b903f2cfcb -- path: github.com/pmezard/go-difflib - rev: 792786c7400a136282c1664665ae0a8db921c6c2 -- path: golang.org/x/sys - rev: a646d33e2ee3172a661fc09bca23bb4889a41bc8 diff --git a/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/mattn/go-colorable/colorable_appengine.go new file mode 100644 index 000000000000..1f28d773d748 --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/colorable_appengine.go @@ -0,0 +1,29 @@ +// +build appengine + +package colorable + +import ( + "io" + "os" + + _ "github.com/mattn/go-isatty" +) + +// NewColorable return new instance of Writer which handle escape sequence. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + return file +} + +// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +func NewColorableStdout() io.Writer { + return os.Stdout +} + +// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +func NewColorableStderr() io.Writer { + return os.Stderr +} diff --git a/vendor/github.com/mattn/go-ieproxy/GetProxyFunc.go b/vendor/github.com/mattn/go-ieproxy/GetProxyFunc.go new file mode 100644 index 000000000000..b2ff9147b926 --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/GetProxyFunc.go @@ -0,0 +1,11 @@ +package ieproxy + +import ( + "net/http" + "net/url" +) + +// GetProxyFunc is a forwarder for the OS-Exclusive proxyMiddleman_os.go files +func GetProxyFunc() func(*http.Request) (*url.URL, error) { + return proxyMiddleman() +} diff --git a/vendor/github.com/mattn/go-ieproxy/LICENSE b/vendor/github.com/mattn/go-ieproxy/LICENSE new file mode 100644 index 000000000000..7b7c0f855af7 --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/LICENSE @@ -0,0 +1,23 @@ +MIT License + +Copyright (c) 2014 mattn +Copyright (c) 2017 oliverpool +Copyright (c) 2019 Adele Reed + +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. diff --git a/vendor/github.com/mattn/go-ieproxy/README.md b/vendor/github.com/mattn/go-ieproxy/README.md new file mode 100644 index 000000000000..fbc801ae5d1a --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/README.md @@ -0,0 +1,49 @@ +# ieproxy + +Go package to detect the proxy settings on Windows platform. + +The settings are initially attempted to be read from the [`WinHttpGetIEProxyConfigForCurrentUser` DLL call](https://docs.microsoft.com/en-us/windows/desktop/api/winhttp/nf-winhttp-winhttpgetieproxyconfigforcurrentuser), but falls back to the registry (`CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings`) in the event the DLL call fails. + +For more information, take a look at the [documentation](https://godoc.org/github.com/mattn/go-ieproxy) + +## Methods + +You can either obtain a `net/http` compatible proxy function using `ieproxy.GetProxyFunc()`, set environment variables using `ieproxy.OverrideEnvWithStaticProxy()` (though no automatic configuration is available this way), or obtain the proxy settings via `ieproxy.GetConf()`. + +| Method | Supported configuration options: | +|----------------------------------------|-----------------------------------------------| +| `ieproxy.GetProxyFunc()` | Static, Specified script, and fully automatic | +| `ieproxy.OverrideEnvWithStaticProxy()` | Static | +| `ieproxy.GetConf()` | Depends on how you use it | + +## Examples + +### Using GetProxyFunc(): + +```go +func init() { + http.DefaultTransport.(*http.Transport).Proxy = ieproxy.GetProxyFunc() +} +``` + +GetProxyFunc acts as a middleman between `net/http` and `mattn/go-ieproxy` in order to select the correct proxy configuration based off the details supplied in the config. + +### Using OverrideEnvWithStaticProxy(): + +```go +func init() { + ieproxy.OverrideEnvWithStaticProxy() + http.DefaultTransport.(*http.Transport).Proxy = http.ProxyFromEnvironment +} +``` + +OverrideEnvWithStaticProxy overrides the relevant environment variables (`HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY`) with the **static, manually configured** proxy details typically found in the registry. + +### Using GetConf(): + +```go +func main() { + conf := ieproxy.GetConf() + //Handle proxies how you want to. +} +``` diff --git a/vendor/github.com/mattn/go-ieproxy/ieproxy.go b/vendor/github.com/mattn/go-ieproxy/ieproxy.go new file mode 100644 index 000000000000..51fe18e3dbed --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/ieproxy.go @@ -0,0 +1,51 @@ +// Package ieproxy is a utility to retrieve the proxy parameters (especially of Internet Explorer on windows) +// +// On windows, it gathers the parameters from the registry (regedit), while it uses env variable on other platforms +package ieproxy + +import "os" + +// ProxyConf gathers the configuration for proxy +type ProxyConf struct { + Static StaticProxyConf // static configuration + Automatic ProxyScriptConf // script configuration +} + +// StaticProxyConf contains the configuration for static proxy +type StaticProxyConf struct { + // Is the proxy active? + Active bool + // Proxy address for each scheme (http, https) + // "" (empty string) is the fallback proxy + Protocols map[string]string + // Addresses not to be browsed via the proxy (comma-separated, linux-like) + NoProxy string +} + +// ProxyScriptConf contains the configuration for automatic proxy +type ProxyScriptConf struct { + // Is the proxy active? + Active bool + // PreConfiguredURL of the .pac file. + // If this is empty and Active is true, auto-configuration should be assumed. + PreConfiguredURL string +} + +// GetConf retrieves the proxy configuration from the Windows Regedit +func GetConf() ProxyConf { + return getConf() +} + +// OverrideEnvWithStaticProxy writes new values to the +// `http_proxy`, `https_proxy` and `no_proxy` environment variables. +// The values are taken from the Windows Regedit (should be called in `init()` function - see example) +func OverrideEnvWithStaticProxy() { + overrideEnvWithStaticProxy(GetConf(), os.Setenv) +} + +// FindProxyForURL computes the proxy for a given URL according to the pac file +func (psc *ProxyScriptConf) FindProxyForURL(URL string) string { + return psc.findProxyForURL(URL) +} + +type envSetter func(string, string) error diff --git a/vendor/github.com/mattn/go-ieproxy/ieproxy_unix.go b/vendor/github.com/mattn/go-ieproxy/ieproxy_unix.go new file mode 100644 index 000000000000..dc2bccfc2970 --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/ieproxy_unix.go @@ -0,0 +1,10 @@ +// +build !windows + +package ieproxy + +func getConf() ProxyConf { + return ProxyConf{} +} + +func overrideEnvWithStaticProxy(pc ProxyConf, setenv envSetter) { +} diff --git a/vendor/github.com/mattn/go-ieproxy/ieproxy_windows.go b/vendor/github.com/mattn/go-ieproxy/ieproxy_windows.go new file mode 100644 index 000000000000..a3d4c11c47e5 --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/ieproxy_windows.go @@ -0,0 +1,164 @@ +package ieproxy + +import ( + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/windows/registry" +) + +type regeditValues struct { + ProxyServer string + ProxyOverride string + ProxyEnable uint64 + AutoConfigURL string +} + +var once sync.Once +var windowsProxyConf ProxyConf + +// GetConf retrieves the proxy configuration from the Windows Regedit +func getConf() ProxyConf { + once.Do(writeConf) + return windowsProxyConf +} + +func writeConf() { + var ( + cfg *tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG + err error + ) + + if cfg, err = getUserConfigFromWindowsSyscall(); err != nil { + regedit, _ := readRegedit() // If the syscall fails, backup to manual detection. + windowsProxyConf = parseRegedit(regedit) + return + } + + defer globalFreeWrapper(cfg.lpszProxy) + defer globalFreeWrapper(cfg.lpszProxyBypass) + defer globalFreeWrapper(cfg.lpszAutoConfigUrl) + + windowsProxyConf = ProxyConf{ + Static: StaticProxyConf{ + Active: cfg.lpszProxy != nil, + }, + Automatic: ProxyScriptConf{ + Active: cfg.lpszAutoConfigUrl != nil || cfg.fAutoDetect, + }, + } + + if windowsProxyConf.Static.Active { + protocol := make(map[string]string) + for _, s := range strings.Split(StringFromUTF16Ptr(cfg.lpszProxy), ";") { + s = strings.TrimSpace(s) + if s == "" { + continue + } + pair := strings.SplitN(s, "=", 2) + if len(pair) > 1 { + protocol[pair[0]] = pair[1] + } else { + protocol[""] = pair[0] + } + } + + windowsProxyConf.Static.Protocols = protocol + if cfg.lpszProxyBypass != nil { + windowsProxyConf.Static.NoProxy = strings.Replace(StringFromUTF16Ptr(cfg.lpszProxyBypass), ";", ",", -1) + } + } + + if windowsProxyConf.Automatic.Active { + windowsProxyConf.Automatic.PreConfiguredURL = StringFromUTF16Ptr(cfg.lpszAutoConfigUrl) + } +} + +func getUserConfigFromWindowsSyscall() (*tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG, error) { + handle, _, err := winHttpOpen.Call(0, 0, 0, 0, 0) + if handle == 0 { + return &tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG{}, err + } + defer winHttpCloseHandle.Call(handle) + + config := new(tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG) + + ret, _, err := winHttpGetIEProxyConfigForCurrentUser.Call(uintptr(unsafe.Pointer(config))) + if ret > 0 { + err = nil + } + + return config, err +} + +// OverrideEnvWithStaticProxy writes new values to the +// http_proxy, https_proxy and no_proxy environment variables. +// The values are taken from the Windows Regedit (should be called in init() function) +func overrideEnvWithStaticProxy(conf ProxyConf, setenv envSetter) { + if conf.Static.Active { + for _, scheme := range []string{"http", "https"} { + url := mapFallback(scheme, "", conf.Static.Protocols) + setenv(scheme+"_proxy", url) + } + if conf.Static.NoProxy != "" { + setenv("no_proxy", conf.Static.NoProxy) + } + } +} + +func parseRegedit(regedit regeditValues) ProxyConf { + protocol := make(map[string]string) + for _, s := range strings.Split(regedit.ProxyServer, ";") { + if s == "" { + continue + } + pair := strings.SplitN(s, "=", 2) + if len(pair) > 1 { + protocol[pair[0]] = pair[1] + } else { + protocol[""] = pair[0] + } + } + + return ProxyConf{ + Static: StaticProxyConf{ + Active: regedit.ProxyEnable > 0, + Protocols: protocol, + NoProxy: strings.Replace(regedit.ProxyOverride, ";", ",", -1), // to match linux style + }, + Automatic: ProxyScriptConf{ + Active: regedit.AutoConfigURL != "", + PreConfiguredURL: regedit.AutoConfigURL, + }, + } +} + +func readRegedit() (values regeditValues, err error) { + k, err := registry.OpenKey(registry.CURRENT_USER, `Software\Microsoft\Windows\CurrentVersion\Internet Settings`, registry.QUERY_VALUE) + if err != nil { + return + } + defer k.Close() + + values.ProxyServer, _, err = k.GetStringValue("ProxyServer") + if err != nil && err != registry.ErrNotExist { + return + } + values.ProxyOverride, _, err = k.GetStringValue("ProxyOverride") + if err != nil && err != registry.ErrNotExist { + return + } + + values.ProxyEnable, _, err = k.GetIntegerValue("ProxyEnable") + if err != nil && err != registry.ErrNotExist { + return + } + + values.AutoConfigURL, _, err = k.GetStringValue("AutoConfigURL") + if err != nil && err != registry.ErrNotExist { + return + } + err = nil + return +} diff --git a/vendor/github.com/mattn/go-ieproxy/kernel32_data_windows.go b/vendor/github.com/mattn/go-ieproxy/kernel32_data_windows.go new file mode 100644 index 000000000000..cfb4349e23ea --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/kernel32_data_windows.go @@ -0,0 +1,15 @@ +package ieproxy + +import ( + "golang.org/x/sys/windows" + "unsafe" +) + +var kernel32 = windows.NewLazySystemDLL("kernel32.dll") +var globalFree = kernel32.NewProc("GlobalFree") + +func globalFreeWrapper(ptr *uint16) { + if ptr != nil { + _, _, _ = globalFree.Call(uintptr(unsafe.Pointer(ptr))) + } +} diff --git a/vendor/github.com/mattn/go-ieproxy/pac_unix.go b/vendor/github.com/mattn/go-ieproxy/pac_unix.go new file mode 100644 index 000000000000..d44ec3cca246 --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/pac_unix.go @@ -0,0 +1,7 @@ +// +build !windows + +package ieproxy + +func (psc *ProxyScriptConf) findProxyForURL(URL string) string { + return "" +} diff --git a/vendor/github.com/mattn/go-ieproxy/pac_windows.go b/vendor/github.com/mattn/go-ieproxy/pac_windows.go new file mode 100644 index 000000000000..6a2ee677855f --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/pac_windows.go @@ -0,0 +1,72 @@ +package ieproxy + +import ( + "strings" + "syscall" + "unsafe" +) + +func (psc *ProxyScriptConf) findProxyForURL(URL string) string { + if !psc.Active { + return "" + } + proxy, _ := getProxyForURL(psc.PreConfiguredURL, URL) + i := strings.Index(proxy, ";") + if i >= 0 { + return proxy[:i] + } + return proxy +} + +func getProxyForURL(pacfileURL, URL string) (string, error) { + pacfileURLPtr, err := syscall.UTF16PtrFromString(pacfileURL) + if err != nil { + return "", err + } + URLPtr, err := syscall.UTF16PtrFromString(URL) + if err != nil { + return "", err + } + + handle, _, err := winHttpOpen.Call(0, 0, 0, 0, 0) + if handle == 0 { + return "", err + } + defer winHttpCloseHandle.Call(handle) + + dwFlags := fWINHTTP_AUTOPROXY_CONFIG_URL + dwAutoDetectFlags := autoDetectFlag(0) + pfURLptr := pacfileURLPtr + + if pacfileURL == "" { + dwFlags = fWINHTTP_AUTOPROXY_AUTO_DETECT + dwAutoDetectFlags = fWINHTTP_AUTO_DETECT_TYPE_DNS_A | fWINHTTP_AUTO_DETECT_TYPE_DHCP + pfURLptr = nil + } + + options := tWINHTTP_AUTOPROXY_OPTIONS{ + dwFlags: dwFlags, // adding cache might cause issues: https://github.com/mattn/go-ieproxy/issues/6 + dwAutoDetectFlags: dwAutoDetectFlags, + lpszAutoConfigUrl: pfURLptr, + lpvReserved: nil, + dwReserved: 0, + fAutoLogonIfChallenged: true, // may not be optimal https://msdn.microsoft.com/en-us/library/windows/desktop/aa383153(v=vs.85).aspx + } // lpszProxyBypass isn't used as this only executes in cases where there (may) be a pac file (autodetect can fail), where lpszProxyBypass couldn't be returned. + // in the case that autodetect fails and no pre-specified pacfile is present, no proxy is returned. + + info := new(tWINHTTP_PROXY_INFO) + + ret, _, err := winHttpGetProxyForURL.Call( + handle, + uintptr(unsafe.Pointer(URLPtr)), + uintptr(unsafe.Pointer(&options)), + uintptr(unsafe.Pointer(info)), + ) + if ret > 0 { + err = nil + } + + defer globalFreeWrapper(info.lpszProxyBypass) + defer globalFreeWrapper(info.lpszProxy) + return StringFromUTF16Ptr(info.lpszProxy), err +} diff --git a/vendor/github.com/mattn/go-ieproxy/proxyMiddleman_unix.go b/vendor/github.com/mattn/go-ieproxy/proxyMiddleman_unix.go new file mode 100644 index 000000000000..d0b16ec288c2 --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/proxyMiddleman_unix.go @@ -0,0 +1,13 @@ +// +build !windows + +package ieproxy + +import ( + "net/http" + "net/url" +) + +func proxyMiddleman() func(req *http.Request) (i *url.URL, e error) { + // Fallthrough to ProxyFromEnvironment on all other OSes. + return http.ProxyFromEnvironment +} diff --git a/vendor/github.com/mattn/go-ieproxy/proxyMiddleman_windows.go b/vendor/github.com/mattn/go-ieproxy/proxyMiddleman_windows.go new file mode 100644 index 000000000000..355d432c1418 --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/proxyMiddleman_windows.go @@ -0,0 +1,51 @@ +package ieproxy + +import ( + "net/http" + "net/url" + + "golang.org/x/net/http/httpproxy" +) + +func proxyMiddleman() func(req *http.Request) (i *url.URL, e error) { + // Get the proxy configuration + conf := GetConf() + envcfg := httpproxy.FromEnvironment() + + if envcfg.HTTPProxy != "" || envcfg.HTTPSProxy != "" { + // If the user manually specifies environment variables, prefer those over the Windows config. + return http.ProxyFromEnvironment + } else if conf.Automatic.Active { + // If automatic proxy obtaining is specified + return func(req *http.Request) (i *url.URL, e error) { + host := conf.Automatic.FindProxyForURL(req.URL.String()) + if host == "" { + return nil, nil + } + return &url.URL{Host: host}, nil + } + } else if conf.Static.Active { + // If static proxy obtaining is specified + prox := httpproxy.Config{ + HTTPSProxy: mapFallback("https", "", conf.Static.Protocols), + HTTPProxy: mapFallback("http", "", conf.Static.Protocols), + NoProxy: conf.Static.NoProxy, + } + + return func(req *http.Request) (i *url.URL, e error) { + return prox.ProxyFunc()(req.URL) + } + } else { + // Final fallthrough case; use the environment variables. + return http.ProxyFromEnvironment + } +} + +// Return oKey or fbKey if oKey doesn't exist in the map. +func mapFallback(oKey, fbKey string, m map[string]string) string { + if v, ok := m[oKey]; ok { + return v + } else { + return m[fbKey] + } +} diff --git a/vendor/github.com/mattn/go-ieproxy/utils.go b/vendor/github.com/mattn/go-ieproxy/utils.go new file mode 100644 index 000000000000..353b231120a0 --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/utils.go @@ -0,0 +1,23 @@ +package ieproxy + +import ( + "unicode/utf16" + "unsafe" +) + +// StringFromUTF16Ptr converts a *uint16 C string to a Go String +func StringFromUTF16Ptr(s *uint16) string { + if s == nil { + return "" + } + + p := (*[1<<30 - 1]uint16)(unsafe.Pointer(s)) + + // find the string length + sz := 0 + for p[sz] != 0 { + sz++ + } + + return string(utf16.Decode(p[:sz:sz])) +} diff --git a/vendor/github.com/mattn/go-ieproxy/winhttp_data_windows.go b/vendor/github.com/mattn/go-ieproxy/winhttp_data_windows.go new file mode 100644 index 000000000000..560940df88f4 --- /dev/null +++ b/vendor/github.com/mattn/go-ieproxy/winhttp_data_windows.go @@ -0,0 +1,50 @@ +package ieproxy + +import "golang.org/x/sys/windows" + +var winHttp = windows.NewLazySystemDLL("winhttp.dll") +var winHttpGetProxyForURL = winHttp.NewProc("WinHttpGetProxyForUrl") +var winHttpOpen = winHttp.NewProc("WinHttpOpen") +var winHttpCloseHandle = winHttp.NewProc("WinHttpCloseHandle") +var winHttpGetIEProxyConfigForCurrentUser = winHttp.NewProc("WinHttpGetIEProxyConfigForCurrentUser") + +type tWINHTTP_AUTOPROXY_OPTIONS struct { + dwFlags autoProxyFlag + dwAutoDetectFlags autoDetectFlag + lpszAutoConfigUrl *uint16 + lpvReserved *uint16 + dwReserved uint32 + fAutoLogonIfChallenged bool +} +type autoProxyFlag uint32 + +const ( + fWINHTTP_AUTOPROXY_AUTO_DETECT = autoProxyFlag(0x00000001) + fWINHTTP_AUTOPROXY_CONFIG_URL = autoProxyFlag(0x00000002) + fWINHTTP_AUTOPROXY_NO_CACHE_CLIENT = autoProxyFlag(0x00080000) + fWINHTTP_AUTOPROXY_NO_CACHE_SVC = autoProxyFlag(0x00100000) + fWINHTTP_AUTOPROXY_NO_DIRECTACCESS = autoProxyFlag(0x00040000) + fWINHTTP_AUTOPROXY_RUN_INPROCESS = autoProxyFlag(0x00010000) + fWINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY = autoProxyFlag(0x00020000) + fWINHTTP_AUTOPROXY_SORT_RESULTS = autoProxyFlag(0x00400000) +) + +type autoDetectFlag uint32 + +const ( + fWINHTTP_AUTO_DETECT_TYPE_DHCP = autoDetectFlag(0x00000001) + fWINHTTP_AUTO_DETECT_TYPE_DNS_A = autoDetectFlag(0x00000002) +) + +type tWINHTTP_PROXY_INFO struct { + dwAccessType uint32 + lpszProxy *uint16 + lpszProxyBypass *uint16 +} + +type tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG struct { + fAutoDetect bool + lpszAutoConfigUrl *uint16 + lpszProxy *uint16 + lpszProxyBypass *uint16 +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go b/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go new file mode 100644 index 000000000000..bb7d3c42245b --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go @@ -0,0 +1,25 @@ +// +build linux +// +build ppc64 ppc64le + +package isatty + +import ( + "unsafe" + + syscall "golang.org/x/sys/unix" +) + +const ioctlReadTermios = syscall.TCGETS + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var termios syscall.Termios + _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) + return err == 0 +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go new file mode 100644 index 000000000000..f02849c56f22 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_others.go @@ -0,0 +1,15 @@ +// +build appengine js + +package isatty + +// IsTerminal returns true if the file descriptor is terminal which +// is always false on js and appengine classic which is a sandboxed PaaS. +func IsTerminal(fd uintptr) bool { + return false +} + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mitchellh/go-wordwrap/LICENSE.md b/vendor/github.com/mitchellh/go-wordwrap/LICENSE.md deleted file mode 100644 index 229851590442..000000000000 --- a/vendor/github.com/mitchellh/go-wordwrap/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Mitchell Hashimoto - -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. diff --git a/vendor/github.com/mitchellh/go-wordwrap/README.md b/vendor/github.com/mitchellh/go-wordwrap/README.md deleted file mode 100644 index 60ae3117008d..000000000000 --- a/vendor/github.com/mitchellh/go-wordwrap/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# go-wordwrap - -`go-wordwrap` (Golang package: `wordwrap`) is a package for Go that -automatically wraps words into multiple lines. The primary use case for this -is in formatting CLI output, but of course word wrapping is a generally useful -thing to do. - -## Installation and Usage - -Install using `go get github.com/mitchellh/go-wordwrap`. - -Full documentation is available at -http://godoc.org/github.com/mitchellh/go-wordwrap - -Below is an example of its usage ignoring errors: - -```go -wrapped := wordwrap.WrapString("foo bar baz", 3) -fmt.Println(wrapped) -``` - -Would output: - -``` -foo -bar -baz -``` - -## Word Wrap Algorithm - -This library doesn't use any clever algorithm for word wrapping. The wrapping -is actually very naive: whenever there is whitespace or an explicit linebreak. -The goal of this library is for word wrapping CLI output, so the input is -typically pretty well controlled human language. Because of this, the naive -approach typically works just fine. - -In the future, we'd like to make the algorithm more advanced. We would do -so without breaking the API. diff --git a/vendor/github.com/mitchellh/go-wordwrap/wordwrap.go b/vendor/github.com/mitchellh/go-wordwrap/wordwrap.go deleted file mode 100644 index ac67205bc2e5..000000000000 --- a/vendor/github.com/mitchellh/go-wordwrap/wordwrap.go +++ /dev/null @@ -1,73 +0,0 @@ -package wordwrap - -import ( - "bytes" - "unicode" -) - -// WrapString wraps the given string within lim width in characters. -// -// Wrapping is currently naive and only happens at white-space. A future -// version of the library will implement smarter wrapping. This means that -// pathological cases can dramatically reach past the limit, such as a very -// long word. -func WrapString(s string, lim uint) string { - // Initialize a buffer with a slightly larger size to account for breaks - init := make([]byte, 0, len(s)) - buf := bytes.NewBuffer(init) - - var current uint - var wordBuf, spaceBuf bytes.Buffer - - for _, char := range s { - if char == '\n' { - if wordBuf.Len() == 0 { - if current+uint(spaceBuf.Len()) > lim { - current = 0 - } else { - current += uint(spaceBuf.Len()) - spaceBuf.WriteTo(buf) - } - spaceBuf.Reset() - } else { - current += uint(spaceBuf.Len() + wordBuf.Len()) - spaceBuf.WriteTo(buf) - spaceBuf.Reset() - wordBuf.WriteTo(buf) - wordBuf.Reset() - } - buf.WriteRune(char) - current = 0 - } else if unicode.IsSpace(char) { - if spaceBuf.Len() == 0 || wordBuf.Len() > 0 { - current += uint(spaceBuf.Len() + wordBuf.Len()) - spaceBuf.WriteTo(buf) - spaceBuf.Reset() - wordBuf.WriteTo(buf) - wordBuf.Reset() - } - - spaceBuf.WriteRune(char) - } else { - - wordBuf.WriteRune(char) - - if current+uint(spaceBuf.Len()+wordBuf.Len()) > lim && uint(wordBuf.Len()) < lim { - buf.WriteRune('\n') - current = 0 - spaceBuf.Reset() - } - } - } - - if wordBuf.Len() == 0 { - if current+uint(spaceBuf.Len()) <= lim { - spaceBuf.WriteTo(buf) - } - } else { - spaceBuf.WriteTo(buf) - wordBuf.WriteTo(buf) - } - - return buf.String() -} diff --git a/vendor/github.com/nsf/termbox-go/AUTHORS b/vendor/github.com/nsf/termbox-go/AUTHORS deleted file mode 100644 index fe26fb0fb058..000000000000 --- a/vendor/github.com/nsf/termbox-go/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -# Please keep this file sorted. - -Georg Reinke -nsf diff --git a/vendor/github.com/nsf/termbox-go/LICENSE b/vendor/github.com/nsf/termbox-go/LICENSE deleted file mode 100644 index d9bc068ce748..000000000000 --- a/vendor/github.com/nsf/termbox-go/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2012 termbox-go authors - -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. diff --git a/vendor/github.com/nsf/termbox-go/README.md b/vendor/github.com/nsf/termbox-go/README.md deleted file mode 100644 index 4b2e73ccc13a..000000000000 --- a/vendor/github.com/nsf/termbox-go/README.md +++ /dev/null @@ -1,31 +0,0 @@ -## Termbox -Termbox is a library that provides a minimalistic API which allows the programmer to write text-based user interfaces. The library is crossplatform and has both terminal-based implementations on *nix operating systems and a winapi console based implementation for windows operating systems. The basic idea is an abstraction of the greatest common subset of features available on all major terminals and other terminal-like APIs in a minimalistic fashion. Small API means it is easy to implement, test, maintain and learn it, that's what makes the termbox a distinct library in its area. - -### Installation -Install and update this go package with `go get -u github.com/nsf/termbox-go` - -### Examples -For examples of what can be done take a look at demos in the _demos directory. You can try them with go run: `go run _demos/keyboard.go` - -There are also some interesting projects using termbox-go: - - [godit](https://github.com/nsf/godit) is an emacsish lightweight text editor written using termbox. - - [gomatrix](https://github.com/GeertJohan/gomatrix) connects to The Matrix and displays its data streams in your terminal. - - [gotetris](https://github.com/jjinux/gotetris) is an implementation of Tetris. - - [sokoban-go](https://github.com/rn2dy/sokoban-go) is an implementation of sokoban game. - - [hecate](https://github.com/evanmiller/hecate) is a hex editor designed by Satan. - - [httopd](https://github.com/verdverm/httopd) is top for httpd logs. - - [mop](https://github.com/michaeldv/mop) is stock market tracker for hackers. - - [termui](https://github.com/gizak/termui) is a terminal dashboard. - - [termloop](https://github.com/JoelOtter/termloop) is a terminal game engine. - - [xterm-color-chart](https://github.com/kutuluk/xterm-color-chart) is a XTerm 256 color chart. - - [gocui](https://github.com/jroimartin/gocui) is a minimalist Go library aimed at creating console user interfaces. - - [dry](https://github.com/moncho/dry) is an interactive cli to manage Docker containers. - - [pxl](https://github.com/ichinaski/pxl) displays images in the terminal. - - [snake-game](https://github.com/DyegoCosta/snake-game) is an implementation of the Snake game. - - [gone](https://github.com/guillaumebreton/gone) is a CLI pomodoro® timer. - - [Spoof.go](https://github.com/sabey/spoofgo) controllable movement spoofing from the cli - - [lf](https://github.com/gokcehan/lf) is a terminal file manager - - [rat](https://github.com/ericfreese/rat) lets you compose shell commands to build terminal applications. - -### API reference -[godoc.org/github.com/nsf/termbox-go](http://godoc.org/github.com/nsf/termbox-go) diff --git a/vendor/github.com/nsf/termbox-go/api.go b/vendor/github.com/nsf/termbox-go/api.go deleted file mode 100644 index b242ddcf3a23..000000000000 --- a/vendor/github.com/nsf/termbox-go/api.go +++ /dev/null @@ -1,457 +0,0 @@ -// +build !windows - -package termbox - -import "github.com/mattn/go-runewidth" -import "fmt" -import "os" -import "os/signal" -import "syscall" -import "runtime" - -// public API - -// Initializes termbox library. This function should be called before any other functions. -// After successful initialization, the library must be finalized using 'Close' function. -// -// Example usage: -// err := termbox.Init() -// if err != nil { -// panic(err) -// } -// defer termbox.Close() -func Init() error { - var err error - - out, err = os.OpenFile("/dev/tty", syscall.O_WRONLY, 0) - if err != nil { - return err - } - in, err = syscall.Open("/dev/tty", syscall.O_RDONLY, 0) - if err != nil { - return err - } - - err = setup_term() - if err != nil { - return fmt.Errorf("termbox: error while reading terminfo data: %v", err) - } - - signal.Notify(sigwinch, syscall.SIGWINCH) - signal.Notify(sigio, syscall.SIGIO) - - _, err = fcntl(in, syscall.F_SETFL, syscall.O_ASYNC|syscall.O_NONBLOCK) - if err != nil { - return err - } - _, err = fcntl(in, syscall.F_SETOWN, syscall.Getpid()) - if runtime.GOOS != "darwin" && err != nil { - return err - } - err = tcgetattr(out.Fd(), &orig_tios) - if err != nil { - return err - } - - tios := orig_tios - tios.Iflag &^= syscall_IGNBRK | syscall_BRKINT | syscall_PARMRK | - syscall_ISTRIP | syscall_INLCR | syscall_IGNCR | - syscall_ICRNL | syscall_IXON - tios.Lflag &^= syscall_ECHO | syscall_ECHONL | syscall_ICANON | - syscall_ISIG | syscall_IEXTEN - tios.Cflag &^= syscall_CSIZE | syscall_PARENB - tios.Cflag |= syscall_CS8 - tios.Cc[syscall_VMIN] = 1 - tios.Cc[syscall_VTIME] = 0 - - err = tcsetattr(out.Fd(), &tios) - if err != nil { - return err - } - - out.WriteString(funcs[t_enter_ca]) - out.WriteString(funcs[t_enter_keypad]) - out.WriteString(funcs[t_hide_cursor]) - out.WriteString(funcs[t_clear_screen]) - - termw, termh = get_term_size(out.Fd()) - back_buffer.init(termw, termh) - front_buffer.init(termw, termh) - back_buffer.clear() - front_buffer.clear() - - go func() { - buf := make([]byte, 128) - for { - select { - case <-sigio: - for { - n, err := syscall.Read(in, buf) - if err == syscall.EAGAIN || err == syscall.EWOULDBLOCK { - break - } - select { - case input_comm <- input_event{buf[:n], err}: - ie := <-input_comm - buf = ie.data[:128] - case <-quit: - return - } - } - case <-quit: - return - } - } - }() - - IsInit = true - return nil -} - -// Interrupt an in-progress call to PollEvent by causing it to return -// EventInterrupt. Note that this function will block until the PollEvent -// function has successfully been interrupted. -func Interrupt() { - interrupt_comm <- struct{}{} -} - -// Finalizes termbox library, should be called after successful initialization -// when termbox's functionality isn't required anymore. -func Close() { - quit <- 1 - out.WriteString(funcs[t_show_cursor]) - out.WriteString(funcs[t_sgr0]) - out.WriteString(funcs[t_clear_screen]) - out.WriteString(funcs[t_exit_ca]) - out.WriteString(funcs[t_exit_keypad]) - out.WriteString(funcs[t_exit_mouse]) - tcsetattr(out.Fd(), &orig_tios) - - out.Close() - syscall.Close(in) - - // reset the state, so that on next Init() it will work again - termw = 0 - termh = 0 - input_mode = InputEsc - out = nil - in = 0 - lastfg = attr_invalid - lastbg = attr_invalid - lastx = coord_invalid - lasty = coord_invalid - cursor_x = cursor_hidden - cursor_y = cursor_hidden - foreground = ColorDefault - background = ColorDefault - IsInit = false -} - -// Synchronizes the internal back buffer with the terminal. -func Flush() error { - // invalidate cursor position - lastx = coord_invalid - lasty = coord_invalid - - update_size_maybe() - - for y := 0; y < front_buffer.height; y++ { - line_offset := y * front_buffer.width - for x := 0; x < front_buffer.width; { - cell_offset := line_offset + x - back := &back_buffer.cells[cell_offset] - front := &front_buffer.cells[cell_offset] - if back.Ch < ' ' { - back.Ch = ' ' - } - w := runewidth.RuneWidth(back.Ch) - if w == 0 || w == 2 && runewidth.IsAmbiguousWidth(back.Ch) { - w = 1 - } - if *back == *front { - x += w - continue - } - *front = *back - send_attr(back.Fg, back.Bg) - - if w == 2 && x == front_buffer.width-1 { - // there's not enough space for 2-cells rune, - // let's just put a space in there - send_char(x, y, ' ') - } else { - send_char(x, y, back.Ch) - if w == 2 { - next := cell_offset + 1 - front_buffer.cells[next] = Cell{ - Ch: 0, - Fg: back.Fg, - Bg: back.Bg, - } - } - } - x += w - } - } - if !is_cursor_hidden(cursor_x, cursor_y) { - write_cursor(cursor_x, cursor_y) - } - return flush() -} - -// Sets the position of the cursor. See also HideCursor(). -func SetCursor(x, y int) { - if is_cursor_hidden(cursor_x, cursor_y) && !is_cursor_hidden(x, y) { - outbuf.WriteString(funcs[t_show_cursor]) - } - - if !is_cursor_hidden(cursor_x, cursor_y) && is_cursor_hidden(x, y) { - outbuf.WriteString(funcs[t_hide_cursor]) - } - - cursor_x, cursor_y = x, y - if !is_cursor_hidden(cursor_x, cursor_y) { - write_cursor(cursor_x, cursor_y) - } -} - -// The shortcut for SetCursor(-1, -1). -func HideCursor() { - SetCursor(cursor_hidden, cursor_hidden) -} - -// Changes cell's parameters in the internal back buffer at the specified -// position. -func SetCell(x, y int, ch rune, fg, bg Attribute) { - if x < 0 || x >= back_buffer.width { - return - } - if y < 0 || y >= back_buffer.height { - return - } - - back_buffer.cells[y*back_buffer.width+x] = Cell{ch, fg, bg} -} - -// Returns a slice into the termbox's back buffer. You can get its dimensions -// using 'Size' function. The slice remains valid as long as no 'Clear' or -// 'Flush' function calls were made after call to this function. -func CellBuffer() []Cell { - return back_buffer.cells -} - -// After getting a raw event from PollRawEvent function call, you can parse it -// again into an ordinary one using termbox logic. That is parse an event as -// termbox would do it. Returned event in addition to usual Event struct fields -// sets N field to the amount of bytes used within 'data' slice. If the length -// of 'data' slice is zero or event cannot be parsed for some other reason, the -// function will return a special event type: EventNone. -// -// IMPORTANT: EventNone may contain a non-zero N, which means you should skip -// these bytes, because termbox cannot recognize them. -// -// NOTE: This API is experimental and may change in future. -func ParseEvent(data []byte) Event { - event := Event{Type: EventKey} - ok := extract_event(data, &event) - if !ok { - return Event{Type: EventNone, N: event.N} - } - return event -} - -// Wait for an event and return it. This is a blocking function call. Instead -// of EventKey and EventMouse it returns EventRaw events. Raw event is written -// into `data` slice and Event's N field is set to the amount of bytes written. -// The minimum required length of the 'data' slice is 1. This requirement may -// vary on different platforms. -// -// NOTE: This API is experimental and may change in future. -func PollRawEvent(data []byte) Event { - if len(data) == 0 { - panic("len(data) >= 1 is a requirement") - } - - var event Event - if extract_raw_event(data, &event) { - return event - } - - for { - select { - case ev := <-input_comm: - if ev.err != nil { - return Event{Type: EventError, Err: ev.err} - } - - inbuf = append(inbuf, ev.data...) - input_comm <- ev - if extract_raw_event(data, &event) { - return event - } - case <-interrupt_comm: - event.Type = EventInterrupt - return event - - case <-sigwinch: - event.Type = EventResize - event.Width, event.Height = get_term_size(out.Fd()) - return event - } - } -} - -// Wait for an event and return it. This is a blocking function call. -func PollEvent() Event { - var event Event - - // try to extract event from input buffer, return on success - event.Type = EventKey - ok := extract_event(inbuf, &event) - if event.N != 0 { - copy(inbuf, inbuf[event.N:]) - inbuf = inbuf[:len(inbuf)-event.N] - } - if ok { - return event - } - - for { - select { - case ev := <-input_comm: - if ev.err != nil { - return Event{Type: EventError, Err: ev.err} - } - - inbuf = append(inbuf, ev.data...) - input_comm <- ev - ok := extract_event(inbuf, &event) - if event.N != 0 { - copy(inbuf, inbuf[event.N:]) - inbuf = inbuf[:len(inbuf)-event.N] - } - if ok { - return event - } - case <-interrupt_comm: - event.Type = EventInterrupt - return event - - case <-sigwinch: - event.Type = EventResize - event.Width, event.Height = get_term_size(out.Fd()) - return event - } - } -} - -// Returns the size of the internal back buffer (which is mostly the same as -// terminal's window size in characters). But it doesn't always match the size -// of the terminal window, after the terminal size has changed, the internal -// back buffer will get in sync only after Clear or Flush function calls. -func Size() (width int, height int) { - return termw, termh -} - -// Clears the internal back buffer. -func Clear(fg, bg Attribute) error { - foreground, background = fg, bg - err := update_size_maybe() - back_buffer.clear() - return err -} - -// Sets termbox input mode. Termbox has two input modes: -// -// 1. Esc input mode. When ESC sequence is in the buffer and it doesn't match -// any known sequence. ESC means KeyEsc. This is the default input mode. -// -// 2. Alt input mode. When ESC sequence is in the buffer and it doesn't match -// any known sequence. ESC enables ModAlt modifier for the next keyboard event. -// -// Both input modes can be OR'ed with Mouse mode. Setting Mouse mode bit up will -// enable mouse button press/release and drag events. -// -// If 'mode' is InputCurrent, returns the current input mode. See also Input* -// constants. -func SetInputMode(mode InputMode) InputMode { - if mode == InputCurrent { - return input_mode - } - if mode&(InputEsc|InputAlt) == 0 { - mode |= InputEsc - } - if mode&(InputEsc|InputAlt) == InputEsc|InputAlt { - mode &^= InputAlt - } - if mode&InputMouse != 0 { - out.WriteString(funcs[t_enter_mouse]) - } else { - out.WriteString(funcs[t_exit_mouse]) - } - - input_mode = mode - return input_mode -} - -// Sets the termbox output mode. Termbox has four output options: -// -// 1. OutputNormal => [1..8] -// This mode provides 8 different colors: -// black, red, green, yellow, blue, magenta, cyan, white -// Shortcut: ColorBlack, ColorRed, ... -// Attributes: AttrBold, AttrUnderline, AttrReverse -// -// Example usage: -// SetCell(x, y, '@', ColorBlack | AttrBold, ColorRed); -// -// 2. Output256 => [1..256] -// In this mode you can leverage the 256 terminal mode: -// 0x01 - 0x08: the 8 colors as in OutputNormal -// 0x09 - 0x10: Color* | AttrBold -// 0x11 - 0xe8: 216 different colors -// 0xe9 - 0x1ff: 24 different shades of grey -// -// Example usage: -// SetCell(x, y, '@', 184, 240); -// SetCell(x, y, '@', 0xb8, 0xf0); -// -// 3. Output216 => [1..216] -// This mode supports the 3rd range of the 256 mode only. -// But you dont need to provide an offset. -// -// 4. OutputGrayscale => [1..26] -// This mode supports the 4th range of the 256 mode -// and black and white colors from 3th range of the 256 mode -// But you dont need to provide an offset. -// -// In all modes, 0x00 represents the default color. -// -// `go run _demos/output.go` to see its impact on your terminal. -// -// If 'mode' is OutputCurrent, it returns the current output mode. -// -// Note that this may return a different OutputMode than the one requested, -// as the requested mode may not be available on the target platform. -func SetOutputMode(mode OutputMode) OutputMode { - if mode == OutputCurrent { - return output_mode - } - - output_mode = mode - return output_mode -} - -// Sync comes handy when something causes desync between termbox's understanding -// of a terminal buffer and the reality. Such as a third party process. Sync -// forces a complete resync between the termbox and a terminal, it may not be -// visually pretty though. -func Sync() error { - front_buffer.clear() - err := send_clear() - if err != nil { - return err - } - - return Flush() -} diff --git a/vendor/github.com/nsf/termbox-go/api_common.go b/vendor/github.com/nsf/termbox-go/api_common.go deleted file mode 100644 index 9f23661f561e..000000000000 --- a/vendor/github.com/nsf/termbox-go/api_common.go +++ /dev/null @@ -1,187 +0,0 @@ -// termbox is a library for creating cross-platform text-based interfaces -package termbox - -// public API, common OS agnostic part - -type ( - InputMode int - OutputMode int - EventType uint8 - Modifier uint8 - Key uint16 - Attribute uint16 -) - -// This type represents a termbox event. The 'Mod', 'Key' and 'Ch' fields are -// valid if 'Type' is EventKey. The 'Width' and 'Height' fields are valid if -// 'Type' is EventResize. The 'Err' field is valid if 'Type' is EventError. -type Event struct { - Type EventType // one of Event* constants - Mod Modifier // one of Mod* constants or 0 - Key Key // one of Key* constants, invalid if 'Ch' is not 0 - Ch rune // a unicode character - Width int // width of the screen - Height int // height of the screen - Err error // error in case if input failed - MouseX int // x coord of mouse - MouseY int // y coord of mouse - N int // number of bytes written when getting a raw event -} - -// A cell, single conceptual entity on the screen. The screen is basically a 2d -// array of cells. 'Ch' is a unicode character, 'Fg' and 'Bg' are foreground -// and background attributes respectively. -type Cell struct { - Ch rune - Fg Attribute - Bg Attribute -} - -// To know if termbox has been initialized or not -var ( - IsInit bool = false -) - -// Key constants, see Event.Key field. -const ( - KeyF1 Key = 0xFFFF - iota - KeyF2 - KeyF3 - KeyF4 - KeyF5 - KeyF6 - KeyF7 - KeyF8 - KeyF9 - KeyF10 - KeyF11 - KeyF12 - KeyInsert - KeyDelete - KeyHome - KeyEnd - KeyPgup - KeyPgdn - KeyArrowUp - KeyArrowDown - KeyArrowLeft - KeyArrowRight - key_min // see terminfo - MouseLeft - MouseMiddle - MouseRight - MouseRelease - MouseWheelUp - MouseWheelDown -) - -const ( - KeyCtrlTilde Key = 0x00 - KeyCtrl2 Key = 0x00 - KeyCtrlSpace Key = 0x00 - KeyCtrlA Key = 0x01 - KeyCtrlB Key = 0x02 - KeyCtrlC Key = 0x03 - KeyCtrlD Key = 0x04 - KeyCtrlE Key = 0x05 - KeyCtrlF Key = 0x06 - KeyCtrlG Key = 0x07 - KeyBackspace Key = 0x08 - KeyCtrlH Key = 0x08 - KeyTab Key = 0x09 - KeyCtrlI Key = 0x09 - KeyCtrlJ Key = 0x0A - KeyCtrlK Key = 0x0B - KeyCtrlL Key = 0x0C - KeyEnter Key = 0x0D - KeyCtrlM Key = 0x0D - KeyCtrlN Key = 0x0E - KeyCtrlO Key = 0x0F - KeyCtrlP Key = 0x10 - KeyCtrlQ Key = 0x11 - KeyCtrlR Key = 0x12 - KeyCtrlS Key = 0x13 - KeyCtrlT Key = 0x14 - KeyCtrlU Key = 0x15 - KeyCtrlV Key = 0x16 - KeyCtrlW Key = 0x17 - KeyCtrlX Key = 0x18 - KeyCtrlY Key = 0x19 - KeyCtrlZ Key = 0x1A - KeyEsc Key = 0x1B - KeyCtrlLsqBracket Key = 0x1B - KeyCtrl3 Key = 0x1B - KeyCtrl4 Key = 0x1C - KeyCtrlBackslash Key = 0x1C - KeyCtrl5 Key = 0x1D - KeyCtrlRsqBracket Key = 0x1D - KeyCtrl6 Key = 0x1E - KeyCtrl7 Key = 0x1F - KeyCtrlSlash Key = 0x1F - KeyCtrlUnderscore Key = 0x1F - KeySpace Key = 0x20 - KeyBackspace2 Key = 0x7F - KeyCtrl8 Key = 0x7F -) - -// Alt modifier constant, see Event.Mod field and SetInputMode function. -const ( - ModAlt Modifier = 1 << iota - ModMotion -) - -// Cell colors, you can combine a color with multiple attributes using bitwise -// OR ('|'). -const ( - ColorDefault Attribute = iota - ColorBlack - ColorRed - ColorGreen - ColorYellow - ColorBlue - ColorMagenta - ColorCyan - ColorWhite -) - -// Cell attributes, it is possible to use multiple attributes by combining them -// using bitwise OR ('|'). Although, colors cannot be combined. But you can -// combine attributes and a single color. -// -// It's worth mentioning that some platforms don't support certain attibutes. -// For example windows console doesn't support AttrUnderline. And on some -// terminals applying AttrBold to background may result in blinking text. Use -// them with caution and test your code on various terminals. -const ( - AttrBold Attribute = 1 << (iota + 9) - AttrUnderline - AttrReverse -) - -// Input mode. See SetInputMode function. -const ( - InputEsc InputMode = 1 << iota - InputAlt - InputMouse - InputCurrent InputMode = 0 -) - -// Output mode. See SetOutputMode function. -const ( - OutputCurrent OutputMode = iota - OutputNormal - Output256 - Output216 - OutputGrayscale -) - -// Event type. See Event.Type field. -const ( - EventKey EventType = iota - EventResize - EventMouse - EventError - EventInterrupt - EventRaw - EventNone -) diff --git a/vendor/github.com/nsf/termbox-go/api_windows.go b/vendor/github.com/nsf/termbox-go/api_windows.go deleted file mode 100644 index 7def30a67df0..000000000000 --- a/vendor/github.com/nsf/termbox-go/api_windows.go +++ /dev/null @@ -1,239 +0,0 @@ -package termbox - -import ( - "syscall" -) - -// public API - -// Initializes termbox library. This function should be called before any other functions. -// After successful initialization, the library must be finalized using 'Close' function. -// -// Example usage: -// err := termbox.Init() -// if err != nil { -// panic(err) -// } -// defer termbox.Close() -func Init() error { - var err error - - interrupt, err = create_event() - if err != nil { - return err - } - - in, err = syscall.Open("CONIN$", syscall.O_RDWR, 0) - if err != nil { - return err - } - out, err = syscall.Open("CONOUT$", syscall.O_RDWR, 0) - if err != nil { - return err - } - - err = get_console_mode(in, &orig_mode) - if err != nil { - return err - } - - err = set_console_mode(in, enable_window_input) - if err != nil { - return err - } - - orig_size = get_term_size(out) - win_size := get_win_size(out) - - err = set_console_screen_buffer_size(out, win_size) - if err != nil { - return err - } - - err = get_console_cursor_info(out, &orig_cursor_info) - if err != nil { - return err - } - - show_cursor(false) - term_size = get_term_size(out) - back_buffer.init(int(term_size.x), int(term_size.y)) - front_buffer.init(int(term_size.x), int(term_size.y)) - back_buffer.clear() - front_buffer.clear() - clear() - - diffbuf = make([]diff_msg, 0, 32) - - go input_event_producer() - IsInit = true - return nil -} - -// Finalizes termbox library, should be called after successful initialization -// when termbox's functionality isn't required anymore. -func Close() { - // we ignore errors here, because we can't really do anything about them - Clear(0, 0) - Flush() - - // stop event producer - cancel_comm <- true - set_event(interrupt) - select { - case <-input_comm: - default: - } - <-cancel_done_comm - - set_console_cursor_info(out, &orig_cursor_info) - set_console_cursor_position(out, coord{}) - set_console_screen_buffer_size(out, orig_size) - set_console_mode(in, orig_mode) - syscall.Close(in) - syscall.Close(out) - syscall.Close(interrupt) - IsInit = false -} - -// Interrupt an in-progress call to PollEvent by causing it to return -// EventInterrupt. Note that this function will block until the PollEvent -// function has successfully been interrupted. -func Interrupt() { - interrupt_comm <- struct{}{} -} - -// Synchronizes the internal back buffer with the terminal. -func Flush() error { - update_size_maybe() - prepare_diff_messages() - for _, diff := range diffbuf { - r := small_rect{ - left: 0, - top: diff.pos, - right: term_size.x - 1, - bottom: diff.pos + diff.lines - 1, - } - write_console_output(out, diff.chars, r) - } - if !is_cursor_hidden(cursor_x, cursor_y) { - move_cursor(cursor_x, cursor_y) - } - return nil -} - -// Sets the position of the cursor. See also HideCursor(). -func SetCursor(x, y int) { - if is_cursor_hidden(cursor_x, cursor_y) && !is_cursor_hidden(x, y) { - show_cursor(true) - } - - if !is_cursor_hidden(cursor_x, cursor_y) && is_cursor_hidden(x, y) { - show_cursor(false) - } - - cursor_x, cursor_y = x, y - if !is_cursor_hidden(cursor_x, cursor_y) { - move_cursor(cursor_x, cursor_y) - } -} - -// The shortcut for SetCursor(-1, -1). -func HideCursor() { - SetCursor(cursor_hidden, cursor_hidden) -} - -// Changes cell's parameters in the internal back buffer at the specified -// position. -func SetCell(x, y int, ch rune, fg, bg Attribute) { - if x < 0 || x >= back_buffer.width { - return - } - if y < 0 || y >= back_buffer.height { - return - } - - back_buffer.cells[y*back_buffer.width+x] = Cell{ch, fg, bg} -} - -// Returns a slice into the termbox's back buffer. You can get its dimensions -// using 'Size' function. The slice remains valid as long as no 'Clear' or -// 'Flush' function calls were made after call to this function. -func CellBuffer() []Cell { - return back_buffer.cells -} - -// Wait for an event and return it. This is a blocking function call. -func PollEvent() Event { - select { - case ev := <-input_comm: - return ev - case <-interrupt_comm: - return Event{Type: EventInterrupt} - } -} - -// Returns the size of the internal back buffer (which is mostly the same as -// console's window size in characters). But it doesn't always match the size -// of the console window, after the console size has changed, the internal back -// buffer will get in sync only after Clear or Flush function calls. -func Size() (int, int) { - return int(term_size.x), int(term_size.y) -} - -// Clears the internal back buffer. -func Clear(fg, bg Attribute) error { - foreground, background = fg, bg - update_size_maybe() - back_buffer.clear() - return nil -} - -// Sets termbox input mode. Termbox has two input modes: -// -// 1. Esc input mode. When ESC sequence is in the buffer and it doesn't match -// any known sequence. ESC means KeyEsc. This is the default input mode. -// -// 2. Alt input mode. When ESC sequence is in the buffer and it doesn't match -// any known sequence. ESC enables ModAlt modifier for the next keyboard event. -// -// Both input modes can be OR'ed with Mouse mode. Setting Mouse mode bit up will -// enable mouse button press/release and drag events. -// -// If 'mode' is InputCurrent, returns the current input mode. See also Input* -// constants. -func SetInputMode(mode InputMode) InputMode { - if mode == InputCurrent { - return input_mode - } - if mode&InputMouse != 0 { - err := set_console_mode(in, enable_window_input|enable_mouse_input|enable_extended_flags) - if err != nil { - panic(err) - } - } else { - err := set_console_mode(in, enable_window_input) - if err != nil { - panic(err) - } - } - - input_mode = mode - return input_mode -} - -// Sets the termbox output mode. -// -// Windows console does not support extra colour modes, -// so this will always set and return OutputNormal. -func SetOutputMode(mode OutputMode) OutputMode { - return OutputNormal -} - -// Sync comes handy when something causes desync between termbox's understanding -// of a terminal buffer and the reality. Such as a third party process. Sync -// forces a complete resync between the termbox and a terminal, it may not be -// visually pretty though. At the moment on Windows it does nothing. -func Sync() error { - return nil -} diff --git a/vendor/github.com/nsf/termbox-go/collect_terminfo.py b/vendor/github.com/nsf/termbox-go/collect_terminfo.py deleted file mode 100755 index 5e50975e63ab..000000000000 --- a/vendor/github.com/nsf/termbox-go/collect_terminfo.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python - -import sys, os, subprocess - -def escaped(s): - return repr(s)[1:-1] - -def tput(term, name): - try: - return subprocess.check_output(['tput', '-T%s' % term, name]).decode() - except subprocess.CalledProcessError as e: - return e.output.decode() - - -def w(s): - if s == None: - return - sys.stdout.write(s) - -terminals = { - 'xterm' : 'xterm', - 'rxvt-256color' : 'rxvt_256color', - 'rxvt-unicode' : 'rxvt_unicode', - 'linux' : 'linux', - 'Eterm' : 'eterm', - 'screen' : 'screen' -} - -keys = [ - "F1", "kf1", - "F2", "kf2", - "F3", "kf3", - "F4", "kf4", - "F5", "kf5", - "F6", "kf6", - "F7", "kf7", - "F8", "kf8", - "F9", "kf9", - "F10", "kf10", - "F11", "kf11", - "F12", "kf12", - "INSERT", "kich1", - "DELETE", "kdch1", - "HOME", "khome", - "END", "kend", - "PGUP", "kpp", - "PGDN", "knp", - "KEY_UP", "kcuu1", - "KEY_DOWN", "kcud1", - "KEY_LEFT", "kcub1", - "KEY_RIGHT", "kcuf1" -] - -funcs = [ - "T_ENTER_CA", "smcup", - "T_EXIT_CA", "rmcup", - "T_SHOW_CURSOR", "cnorm", - "T_HIDE_CURSOR", "civis", - "T_CLEAR_SCREEN", "clear", - "T_SGR0", "sgr0", - "T_UNDERLINE", "smul", - "T_BOLD", "bold", - "T_BLINK", "blink", - "T_REVERSE", "rev", - "T_ENTER_KEYPAD", "smkx", - "T_EXIT_KEYPAD", "rmkx" -] - -def iter_pairs(iterable): - iterable = iter(iterable) - while True: - yield (next(iterable), next(iterable)) - -def do_term(term, nick): - w("// %s\n" % term) - w("var %s_keys = []string{\n\t" % nick) - for k, v in iter_pairs(keys): - w('"') - w(escaped(tput(term, v))) - w('",') - w("\n}\n") - w("var %s_funcs = []string{\n\t" % nick) - for k,v in iter_pairs(funcs): - w('"') - if v == "sgr": - w("\\033[3%d;4%dm") - elif v == "cup": - w("\\033[%d;%dH") - else: - w(escaped(tput(term, v))) - w('", ') - w("\n}\n\n") - -def do_terms(d): - w("var terms = []struct {\n") - w("\tname string\n") - w("\tkeys []string\n") - w("\tfuncs []string\n") - w("}{\n") - for k, v in d.items(): - w('\t{"%s", %s_keys, %s_funcs},\n' % (k, v, v)) - w("}\n\n") - -w("// +build !windows\n\npackage termbox\n\n") - -for k,v in terminals.items(): - do_term(k, v) - -do_terms(terminals) - diff --git a/vendor/github.com/nsf/termbox-go/syscalls.go b/vendor/github.com/nsf/termbox-go/syscalls.go deleted file mode 100644 index 4f52bb9af9a1..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build ignore - -package termbox - -/* -#include -#include -*/ -import "C" - -type syscall_Termios C.struct_termios - -const ( - syscall_IGNBRK = C.IGNBRK - syscall_BRKINT = C.BRKINT - syscall_PARMRK = C.PARMRK - syscall_ISTRIP = C.ISTRIP - syscall_INLCR = C.INLCR - syscall_IGNCR = C.IGNCR - syscall_ICRNL = C.ICRNL - syscall_IXON = C.IXON - syscall_OPOST = C.OPOST - syscall_ECHO = C.ECHO - syscall_ECHONL = C.ECHONL - syscall_ICANON = C.ICANON - syscall_ISIG = C.ISIG - syscall_IEXTEN = C.IEXTEN - syscall_CSIZE = C.CSIZE - syscall_PARENB = C.PARENB - syscall_CS8 = C.CS8 - syscall_VMIN = C.VMIN - syscall_VTIME = C.VTIME - - // on darwin change these to (on *bsd too?): - // C.TIOCGETA - // C.TIOCSETA - syscall_TCGETS = C.TCGETS - syscall_TCSETS = C.TCSETS -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_darwin.go b/vendor/github.com/nsf/termbox-go/syscalls_darwin.go deleted file mode 100644 index 25b78f7ab70b..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_darwin.go +++ /dev/null @@ -1,41 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -// +build !amd64 - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed uint32 - Ospeed uint32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_darwin_amd64.go b/vendor/github.com/nsf/termbox-go/syscalls_darwin_amd64.go deleted file mode 100644 index 11f25be79a4b..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_darwin_amd64.go +++ /dev/null @@ -1,40 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint64 - Oflag uint64 - Cflag uint64 - Lflag uint64 - Cc [20]uint8 - Pad_cgo_0 [4]byte - Ispeed uint64 - Ospeed uint64 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x40487413 - syscall_TCSETS = 0x80487414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_dragonfly.go b/vendor/github.com/nsf/termbox-go/syscalls_dragonfly.go deleted file mode 100644 index e03624ebc71a..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_dragonfly.go +++ /dev/null @@ -1,39 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed uint32 - Ospeed uint32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_freebsd.go b/vendor/github.com/nsf/termbox-go/syscalls_freebsd.go deleted file mode 100644 index e03624ebc71a..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_freebsd.go +++ /dev/null @@ -1,39 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed uint32 - Ospeed uint32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_linux.go b/vendor/github.com/nsf/termbox-go/syscalls_linux.go deleted file mode 100644 index b88960de617c..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_linux.go +++ /dev/null @@ -1,33 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -import "syscall" - -type syscall_Termios syscall.Termios - -const ( - syscall_IGNBRK = syscall.IGNBRK - syscall_BRKINT = syscall.BRKINT - syscall_PARMRK = syscall.PARMRK - syscall_ISTRIP = syscall.ISTRIP - syscall_INLCR = syscall.INLCR - syscall_IGNCR = syscall.IGNCR - syscall_ICRNL = syscall.ICRNL - syscall_IXON = syscall.IXON - syscall_OPOST = syscall.OPOST - syscall_ECHO = syscall.ECHO - syscall_ECHONL = syscall.ECHONL - syscall_ICANON = syscall.ICANON - syscall_ISIG = syscall.ISIG - syscall_IEXTEN = syscall.IEXTEN - syscall_CSIZE = syscall.CSIZE - syscall_PARENB = syscall.PARENB - syscall_CS8 = syscall.CS8 - syscall_VMIN = syscall.VMIN - syscall_VTIME = syscall.VTIME - - syscall_TCGETS = syscall.TCGETS - syscall_TCSETS = syscall.TCSETS -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_netbsd.go b/vendor/github.com/nsf/termbox-go/syscalls_netbsd.go deleted file mode 100644 index 49a3355b9a2d..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_netbsd.go +++ /dev/null @@ -1,39 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed int32 - Ospeed int32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_openbsd.go b/vendor/github.com/nsf/termbox-go/syscalls_openbsd.go deleted file mode 100644 index 49a3355b9a2d..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_openbsd.go +++ /dev/null @@ -1,39 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed int32 - Ospeed int32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_windows.go b/vendor/github.com/nsf/termbox-go/syscalls_windows.go deleted file mode 100644 index 472d002a56aa..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_windows.go +++ /dev/null @@ -1,61 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -DUNICODE syscalls.go - -package termbox - -const ( - foreground_blue = 0x1 - foreground_green = 0x2 - foreground_red = 0x4 - foreground_intensity = 0x8 - background_blue = 0x10 - background_green = 0x20 - background_red = 0x40 - background_intensity = 0x80 - std_input_handle = -0xa - std_output_handle = -0xb - key_event = 0x1 - mouse_event = 0x2 - window_buffer_size_event = 0x4 - enable_window_input = 0x8 - enable_mouse_input = 0x10 - enable_extended_flags = 0x80 - - vk_f1 = 0x70 - vk_f2 = 0x71 - vk_f3 = 0x72 - vk_f4 = 0x73 - vk_f5 = 0x74 - vk_f6 = 0x75 - vk_f7 = 0x76 - vk_f8 = 0x77 - vk_f9 = 0x78 - vk_f10 = 0x79 - vk_f11 = 0x7a - vk_f12 = 0x7b - vk_insert = 0x2d - vk_delete = 0x2e - vk_home = 0x24 - vk_end = 0x23 - vk_pgup = 0x21 - vk_pgdn = 0x22 - vk_arrow_up = 0x26 - vk_arrow_down = 0x28 - vk_arrow_left = 0x25 - vk_arrow_right = 0x27 - vk_backspace = 0x8 - vk_tab = 0x9 - vk_enter = 0xd - vk_esc = 0x1b - vk_space = 0x20 - - left_alt_pressed = 0x2 - left_ctrl_pressed = 0x8 - right_alt_pressed = 0x1 - right_ctrl_pressed = 0x4 - shift_pressed = 0x10 - - generic_read = 0x80000000 - generic_write = 0x40000000 - console_textmode_buffer = 0x1 -) diff --git a/vendor/github.com/nsf/termbox-go/termbox.go b/vendor/github.com/nsf/termbox-go/termbox.go deleted file mode 100644 index c2d86c6584e3..000000000000 --- a/vendor/github.com/nsf/termbox-go/termbox.go +++ /dev/null @@ -1,511 +0,0 @@ -// +build !windows - -package termbox - -import "unicode/utf8" -import "bytes" -import "syscall" -import "unsafe" -import "strings" -import "strconv" -import "os" -import "io" - -// private API - -const ( - t_enter_ca = iota - t_exit_ca - t_show_cursor - t_hide_cursor - t_clear_screen - t_sgr0 - t_underline - t_bold - t_blink - t_reverse - t_enter_keypad - t_exit_keypad - t_enter_mouse - t_exit_mouse - t_max_funcs -) - -const ( - coord_invalid = -2 - attr_invalid = Attribute(0xFFFF) -) - -type input_event struct { - data []byte - err error -} - -var ( - // term specific sequences - keys []string - funcs []string - - // termbox inner state - orig_tios syscall_Termios - back_buffer cellbuf - front_buffer cellbuf - termw int - termh int - input_mode = InputEsc - output_mode = OutputNormal - out *os.File - in int - lastfg = attr_invalid - lastbg = attr_invalid - lastx = coord_invalid - lasty = coord_invalid - cursor_x = cursor_hidden - cursor_y = cursor_hidden - foreground = ColorDefault - background = ColorDefault - inbuf = make([]byte, 0, 64) - outbuf bytes.Buffer - sigwinch = make(chan os.Signal, 1) - sigio = make(chan os.Signal, 1) - quit = make(chan int) - input_comm = make(chan input_event) - interrupt_comm = make(chan struct{}) - intbuf = make([]byte, 0, 16) - - // grayscale indexes - grayscale = []Attribute{ - 0, 17, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 232, - } -) - -func write_cursor(x, y int) { - outbuf.WriteString("\033[") - outbuf.Write(strconv.AppendUint(intbuf, uint64(y+1), 10)) - outbuf.WriteString(";") - outbuf.Write(strconv.AppendUint(intbuf, uint64(x+1), 10)) - outbuf.WriteString("H") -} - -func write_sgr_fg(a Attribute) { - switch output_mode { - case Output256, Output216, OutputGrayscale: - outbuf.WriteString("\033[38;5;") - outbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10)) - outbuf.WriteString("m") - default: - outbuf.WriteString("\033[3") - outbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10)) - outbuf.WriteString("m") - } -} - -func write_sgr_bg(a Attribute) { - switch output_mode { - case Output256, Output216, OutputGrayscale: - outbuf.WriteString("\033[48;5;") - outbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10)) - outbuf.WriteString("m") - default: - outbuf.WriteString("\033[4") - outbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10)) - outbuf.WriteString("m") - } -} - -func write_sgr(fg, bg Attribute) { - switch output_mode { - case Output256, Output216, OutputGrayscale: - outbuf.WriteString("\033[38;5;") - outbuf.Write(strconv.AppendUint(intbuf, uint64(fg-1), 10)) - outbuf.WriteString("m") - outbuf.WriteString("\033[48;5;") - outbuf.Write(strconv.AppendUint(intbuf, uint64(bg-1), 10)) - outbuf.WriteString("m") - default: - outbuf.WriteString("\033[3") - outbuf.Write(strconv.AppendUint(intbuf, uint64(fg-1), 10)) - outbuf.WriteString(";4") - outbuf.Write(strconv.AppendUint(intbuf, uint64(bg-1), 10)) - outbuf.WriteString("m") - } -} - -type winsize struct { - rows uint16 - cols uint16 - xpixels uint16 - ypixels uint16 -} - -func get_term_size(fd uintptr) (int, int) { - var sz winsize - _, _, _ = syscall.Syscall(syscall.SYS_IOCTL, - fd, uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&sz))) - return int(sz.cols), int(sz.rows) -} - -func send_attr(fg, bg Attribute) { - if fg == lastfg && bg == lastbg { - return - } - - outbuf.WriteString(funcs[t_sgr0]) - - var fgcol, bgcol Attribute - - switch output_mode { - case Output256: - fgcol = fg & 0x1FF - bgcol = bg & 0x1FF - case Output216: - fgcol = fg & 0xFF - bgcol = bg & 0xFF - if fgcol > 216 { - fgcol = ColorDefault - } - if bgcol > 216 { - bgcol = ColorDefault - } - if fgcol != ColorDefault { - fgcol += 0x10 - } - if bgcol != ColorDefault { - bgcol += 0x10 - } - case OutputGrayscale: - fgcol = fg & 0x1F - bgcol = bg & 0x1F - if fgcol > 26 { - fgcol = ColorDefault - } - if bgcol > 26 { - bgcol = ColorDefault - } - if fgcol != ColorDefault { - fgcol = grayscale[fgcol] - } - if bgcol != ColorDefault { - bgcol = grayscale[bgcol] - } - default: - fgcol = fg & 0x0F - bgcol = bg & 0x0F - } - - if fgcol != ColorDefault { - if bgcol != ColorDefault { - write_sgr(fgcol, bgcol) - } else { - write_sgr_fg(fgcol) - } - } else if bgcol != ColorDefault { - write_sgr_bg(bgcol) - } - - if fg&AttrBold != 0 { - outbuf.WriteString(funcs[t_bold]) - } - if bg&AttrBold != 0 { - outbuf.WriteString(funcs[t_blink]) - } - if fg&AttrUnderline != 0 { - outbuf.WriteString(funcs[t_underline]) - } - if fg&AttrReverse|bg&AttrReverse != 0 { - outbuf.WriteString(funcs[t_reverse]) - } - - lastfg, lastbg = fg, bg -} - -func send_char(x, y int, ch rune) { - var buf [8]byte - n := utf8.EncodeRune(buf[:], ch) - if x-1 != lastx || y != lasty { - write_cursor(x, y) - } - lastx, lasty = x, y - outbuf.Write(buf[:n]) -} - -func flush() error { - _, err := io.Copy(out, &outbuf) - outbuf.Reset() - return err -} - -func send_clear() error { - send_attr(foreground, background) - outbuf.WriteString(funcs[t_clear_screen]) - if !is_cursor_hidden(cursor_x, cursor_y) { - write_cursor(cursor_x, cursor_y) - } - - // we need to invalidate cursor position too and these two vars are - // used only for simple cursor positioning optimization, cursor - // actually may be in the correct place, but we simply discard - // optimization once and it gives us simple solution for the case when - // cursor moved - lastx = coord_invalid - lasty = coord_invalid - - return flush() -} - -func update_size_maybe() error { - w, h := get_term_size(out.Fd()) - if w != termw || h != termh { - termw, termh = w, h - back_buffer.resize(termw, termh) - front_buffer.resize(termw, termh) - front_buffer.clear() - return send_clear() - } - return nil -} - -func tcsetattr(fd uintptr, termios *syscall_Termios) error { - r, _, e := syscall.Syscall(syscall.SYS_IOCTL, - fd, uintptr(syscall_TCSETS), uintptr(unsafe.Pointer(termios))) - if r != 0 { - return os.NewSyscallError("SYS_IOCTL", e) - } - return nil -} - -func tcgetattr(fd uintptr, termios *syscall_Termios) error { - r, _, e := syscall.Syscall(syscall.SYS_IOCTL, - fd, uintptr(syscall_TCGETS), uintptr(unsafe.Pointer(termios))) - if r != 0 { - return os.NewSyscallError("SYS_IOCTL", e) - } - return nil -} - -func parse_mouse_event(event *Event, buf string) (int, bool) { - if strings.HasPrefix(buf, "\033[M") && len(buf) >= 6 { - // X10 mouse encoding, the simplest one - // \033 [ M Cb Cx Cy - b := buf[3] - 32 - switch b & 3 { - case 0: - if b&64 != 0 { - event.Key = MouseWheelUp - } else { - event.Key = MouseLeft - } - case 1: - if b&64 != 0 { - event.Key = MouseWheelDown - } else { - event.Key = MouseMiddle - } - case 2: - event.Key = MouseRight - case 3: - event.Key = MouseRelease - default: - return 6, false - } - event.Type = EventMouse // KeyEvent by default - if b&32 != 0 { - event.Mod |= ModMotion - } - - // the coord is 1,1 for upper left - event.MouseX = int(buf[4]) - 1 - 32 - event.MouseY = int(buf[5]) - 1 - 32 - return 6, true - } else if strings.HasPrefix(buf, "\033[<") || strings.HasPrefix(buf, "\033[") { - // xterm 1006 extended mode or urxvt 1015 extended mode - // xterm: \033 [ < Cb ; Cx ; Cy (M or m) - // urxvt: \033 [ Cb ; Cx ; Cy M - - // find the first M or m, that's where we stop - mi := strings.IndexAny(buf, "Mm") - if mi == -1 { - return 0, false - } - - // whether it's a capital M or not - isM := buf[mi] == 'M' - - // whether it's urxvt or not - isU := false - - // buf[2] is safe here, because having M or m found means we have at - // least 3 bytes in a string - if buf[2] == '<' { - buf = buf[3:mi] - } else { - isU = true - buf = buf[2:mi] - } - - s1 := strings.Index(buf, ";") - s2 := strings.LastIndex(buf, ";") - // not found or only one ';' - if s1 == -1 || s2 == -1 || s1 == s2 { - return 0, false - } - - n1, err := strconv.ParseInt(buf[0:s1], 10, 64) - if err != nil { - return 0, false - } - n2, err := strconv.ParseInt(buf[s1+1:s2], 10, 64) - if err != nil { - return 0, false - } - n3, err := strconv.ParseInt(buf[s2+1:], 10, 64) - if err != nil { - return 0, false - } - - // on urxvt, first number is encoded exactly as in X10, but we need to - // make it zero-based, on xterm it is zero-based already - if isU { - n1 -= 32 - } - switch n1 & 3 { - case 0: - if n1&64 != 0 { - event.Key = MouseWheelUp - } else { - event.Key = MouseLeft - } - case 1: - if n1&64 != 0 { - event.Key = MouseWheelDown - } else { - event.Key = MouseMiddle - } - case 2: - event.Key = MouseRight - case 3: - event.Key = MouseRelease - default: - return mi + 1, false - } - if !isM { - // on xterm mouse release is signaled by lowercase m - event.Key = MouseRelease - } - - event.Type = EventMouse // KeyEvent by default - if n1&32 != 0 { - event.Mod |= ModMotion - } - - event.MouseX = int(n2) - 1 - event.MouseY = int(n3) - 1 - return mi + 1, true - } - - return 0, false -} - -func parse_escape_sequence(event *Event, buf []byte) (int, bool) { - bufstr := string(buf) - for i, key := range keys { - if strings.HasPrefix(bufstr, key) { - event.Ch = 0 - event.Key = Key(0xFFFF - i) - return len(key), true - } - } - - // if none of the keys match, let's try mouse seqences - return parse_mouse_event(event, bufstr) -} - -func extract_raw_event(data []byte, event *Event) bool { - if len(inbuf) == 0 { - return false - } - - n := len(data) - if n == 0 { - return false - } - - n = copy(data, inbuf) - copy(inbuf, inbuf[n:]) - inbuf = inbuf[:len(inbuf)-n] - - event.N = n - event.Type = EventRaw - return true -} - -func extract_event(inbuf []byte, event *Event) bool { - if len(inbuf) == 0 { - event.N = 0 - return false - } - - if inbuf[0] == '\033' { - // possible escape sequence - if n, ok := parse_escape_sequence(event, inbuf); n != 0 { - event.N = n - return ok - } - - // it's not escape sequence, then it's Alt or Esc, check input_mode - switch { - case input_mode&InputEsc != 0: - // if we're in escape mode, fill Esc event, pop buffer, return success - event.Ch = 0 - event.Key = KeyEsc - event.Mod = 0 - event.N = 1 - return true - case input_mode&InputAlt != 0: - // if we're in alt mode, set Alt modifier to event and redo parsing - event.Mod = ModAlt - ok := extract_event(inbuf[1:], event) - if ok { - event.N++ - } else { - event.N = 0 - } - return ok - default: - panic("unreachable") - } - } - - // if we're here, this is not an escape sequence and not an alt sequence - // so, it's a FUNCTIONAL KEY or a UNICODE character - - // first of all check if it's a functional key - if Key(inbuf[0]) <= KeySpace || Key(inbuf[0]) == KeyBackspace2 { - // fill event, pop buffer, return success - event.Ch = 0 - event.Key = Key(inbuf[0]) - event.N = 1 - return true - } - - // the only possible option is utf8 rune - if r, n := utf8.DecodeRune(inbuf); r != utf8.RuneError { - event.Ch = r - event.Key = 0 - event.N = n - return true - } - - return false -} - -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r, _, e := syscall.Syscall(syscall.SYS_FCNTL, uintptr(fd), uintptr(cmd), - uintptr(arg)) - val = int(r) - if e != 0 { - err = e - } - return -} diff --git a/vendor/github.com/nsf/termbox-go/termbox_common.go b/vendor/github.com/nsf/termbox-go/termbox_common.go deleted file mode 100644 index c3355cc25e38..000000000000 --- a/vendor/github.com/nsf/termbox-go/termbox_common.go +++ /dev/null @@ -1,59 +0,0 @@ -package termbox - -// private API, common OS agnostic part - -type cellbuf struct { - width int - height int - cells []Cell -} - -func (this *cellbuf) init(width, height int) { - this.width = width - this.height = height - this.cells = make([]Cell, width*height) -} - -func (this *cellbuf) resize(width, height int) { - if this.width == width && this.height == height { - return - } - - oldw := this.width - oldh := this.height - oldcells := this.cells - - this.init(width, height) - this.clear() - - minw, minh := oldw, oldh - - if width < minw { - minw = width - } - if height < minh { - minh = height - } - - for i := 0; i < minh; i++ { - srco, dsto := i*oldw, i*width - src := oldcells[srco : srco+minw] - dst := this.cells[dsto : dsto+minw] - copy(dst, src) - } -} - -func (this *cellbuf) clear() { - for i := range this.cells { - c := &this.cells[i] - c.Ch = ' ' - c.Fg = foreground - c.Bg = background - } -} - -const cursor_hidden = -1 - -func is_cursor_hidden(x, y int) bool { - return x == cursor_hidden || y == cursor_hidden -} diff --git a/vendor/github.com/nsf/termbox-go/termbox_windows.go b/vendor/github.com/nsf/termbox-go/termbox_windows.go deleted file mode 100644 index f7dad7b8a5fb..000000000000 --- a/vendor/github.com/nsf/termbox-go/termbox_windows.go +++ /dev/null @@ -1,856 +0,0 @@ -package termbox - -import "syscall" -import "unsafe" -import "unicode/utf16" -import "github.com/mattn/go-runewidth" - -type ( - wchar uint16 - short int16 - dword uint32 - word uint16 - char_info struct { - char wchar - attr word - } - coord struct { - x short - y short - } - small_rect struct { - left short - top short - right short - bottom short - } - console_screen_buffer_info struct { - size coord - cursor_position coord - attributes word - window small_rect - maximum_window_size coord - } - console_cursor_info struct { - size dword - visible int32 - } - input_record struct { - event_type word - _ [2]byte - event [16]byte - } - key_event_record struct { - key_down int32 - repeat_count word - virtual_key_code word - virtual_scan_code word - unicode_char wchar - control_key_state dword - } - window_buffer_size_record struct { - size coord - } - mouse_event_record struct { - mouse_pos coord - button_state dword - control_key_state dword - event_flags dword - } -) - -const ( - mouse_lmb = 0x1 - mouse_rmb = 0x2 - mouse_mmb = 0x4 | 0x8 | 0x10 -) - -func (this coord) uintptr() uintptr { - return uintptr(*(*int32)(unsafe.Pointer(&this))) -} - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") -var is_cjk = runewidth.IsEastAsian() - -var ( - proc_set_console_active_screen_buffer = kernel32.NewProc("SetConsoleActiveScreenBuffer") - proc_set_console_screen_buffer_size = kernel32.NewProc("SetConsoleScreenBufferSize") - proc_create_console_screen_buffer = kernel32.NewProc("CreateConsoleScreenBuffer") - proc_get_console_screen_buffer_info = kernel32.NewProc("GetConsoleScreenBufferInfo") - proc_write_console_output = kernel32.NewProc("WriteConsoleOutputW") - proc_write_console_output_character = kernel32.NewProc("WriteConsoleOutputCharacterW") - proc_write_console_output_attribute = kernel32.NewProc("WriteConsoleOutputAttribute") - proc_set_console_cursor_info = kernel32.NewProc("SetConsoleCursorInfo") - proc_set_console_cursor_position = kernel32.NewProc("SetConsoleCursorPosition") - proc_get_console_cursor_info = kernel32.NewProc("GetConsoleCursorInfo") - proc_read_console_input = kernel32.NewProc("ReadConsoleInputW") - proc_get_console_mode = kernel32.NewProc("GetConsoleMode") - proc_set_console_mode = kernel32.NewProc("SetConsoleMode") - proc_fill_console_output_character = kernel32.NewProc("FillConsoleOutputCharacterW") - proc_fill_console_output_attribute = kernel32.NewProc("FillConsoleOutputAttribute") - proc_create_event = kernel32.NewProc("CreateEventW") - proc_wait_for_multiple_objects = kernel32.NewProc("WaitForMultipleObjects") - proc_set_event = kernel32.NewProc("SetEvent") -) - -func set_console_active_screen_buffer(h syscall.Handle) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_active_screen_buffer.Addr(), - 1, uintptr(h), 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_console_screen_buffer_size(h syscall.Handle, size coord) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_screen_buffer_size.Addr(), - 2, uintptr(h), size.uintptr(), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func create_console_screen_buffer() (h syscall.Handle, err error) { - r0, _, e1 := syscall.Syscall6(proc_create_console_screen_buffer.Addr(), - 5, uintptr(generic_read|generic_write), 0, 0, console_textmode_buffer, 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return syscall.Handle(r0), err -} - -func get_console_screen_buffer_info(h syscall.Handle, info *console_screen_buffer_info) (err error) { - r0, _, e1 := syscall.Syscall(proc_get_console_screen_buffer_info.Addr(), - 2, uintptr(h), uintptr(unsafe.Pointer(info)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func write_console_output(h syscall.Handle, chars []char_info, dst small_rect) (err error) { - tmp_coord = coord{dst.right - dst.left + 1, dst.bottom - dst.top + 1} - tmp_rect = dst - r0, _, e1 := syscall.Syscall6(proc_write_console_output.Addr(), - 5, uintptr(h), uintptr(unsafe.Pointer(&chars[0])), tmp_coord.uintptr(), - tmp_coord0.uintptr(), uintptr(unsafe.Pointer(&tmp_rect)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func write_console_output_character(h syscall.Handle, chars []wchar, pos coord) (err error) { - r0, _, e1 := syscall.Syscall6(proc_write_console_output_character.Addr(), - 5, uintptr(h), uintptr(unsafe.Pointer(&chars[0])), uintptr(len(chars)), - pos.uintptr(), uintptr(unsafe.Pointer(&tmp_arg)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func write_console_output_attribute(h syscall.Handle, attrs []word, pos coord) (err error) { - r0, _, e1 := syscall.Syscall6(proc_write_console_output_attribute.Addr(), - 5, uintptr(h), uintptr(unsafe.Pointer(&attrs[0])), uintptr(len(attrs)), - pos.uintptr(), uintptr(unsafe.Pointer(&tmp_arg)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_console_cursor_info(h syscall.Handle, info *console_cursor_info) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_cursor_info.Addr(), - 2, uintptr(h), uintptr(unsafe.Pointer(info)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func get_console_cursor_info(h syscall.Handle, info *console_cursor_info) (err error) { - r0, _, e1 := syscall.Syscall(proc_get_console_cursor_info.Addr(), - 2, uintptr(h), uintptr(unsafe.Pointer(info)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_console_cursor_position(h syscall.Handle, pos coord) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_cursor_position.Addr(), - 2, uintptr(h), pos.uintptr(), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func read_console_input(h syscall.Handle, record *input_record) (err error) { - r0, _, e1 := syscall.Syscall6(proc_read_console_input.Addr(), - 4, uintptr(h), uintptr(unsafe.Pointer(record)), 1, uintptr(unsafe.Pointer(&tmp_arg)), 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func get_console_mode(h syscall.Handle, mode *dword) (err error) { - r0, _, e1 := syscall.Syscall(proc_get_console_mode.Addr(), - 2, uintptr(h), uintptr(unsafe.Pointer(mode)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_console_mode(h syscall.Handle, mode dword) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_mode.Addr(), - 2, uintptr(h), uintptr(mode), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func fill_console_output_character(h syscall.Handle, char wchar, n int) (err error) { - r0, _, e1 := syscall.Syscall6(proc_fill_console_output_character.Addr(), - 5, uintptr(h), uintptr(char), uintptr(n), tmp_coord.uintptr(), - uintptr(unsafe.Pointer(&tmp_arg)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func fill_console_output_attribute(h syscall.Handle, attr word, n int) (err error) { - r0, _, e1 := syscall.Syscall6(proc_fill_console_output_attribute.Addr(), - 5, uintptr(h), uintptr(attr), uintptr(n), tmp_coord.uintptr(), - uintptr(unsafe.Pointer(&tmp_arg)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func create_event() (out syscall.Handle, err error) { - r0, _, e1 := syscall.Syscall6(proc_create_event.Addr(), - 4, 0, 0, 0, 0, 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return syscall.Handle(r0), err -} - -func wait_for_multiple_objects(objects []syscall.Handle) (err error) { - r0, _, e1 := syscall.Syscall6(proc_wait_for_multiple_objects.Addr(), - 4, uintptr(len(objects)), uintptr(unsafe.Pointer(&objects[0])), - 0, 0xFFFFFFFF, 0, 0) - if uint32(r0) == 0xFFFFFFFF { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_event(ev syscall.Handle) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_event.Addr(), - 1, uintptr(ev), 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -type diff_msg struct { - pos short - lines short - chars []char_info -} - -type input_event struct { - event Event - err error -} - -var ( - orig_cursor_info console_cursor_info - orig_size coord - orig_mode dword - orig_screen syscall.Handle - back_buffer cellbuf - front_buffer cellbuf - term_size coord - input_mode = InputEsc - cursor_x = cursor_hidden - cursor_y = cursor_hidden - foreground = ColorDefault - background = ColorDefault - in syscall.Handle - out syscall.Handle - interrupt syscall.Handle - charbuf []char_info - diffbuf []diff_msg - beg_x = -1 - beg_y = -1 - beg_i = -1 - input_comm = make(chan Event) - interrupt_comm = make(chan struct{}) - cancel_comm = make(chan bool, 1) - cancel_done_comm = make(chan bool) - alt_mode_esc = false - - // these ones just to prevent heap allocs at all costs - tmp_info console_screen_buffer_info - tmp_arg dword - tmp_coord0 = coord{0, 0} - tmp_coord = coord{0, 0} - tmp_rect = small_rect{0, 0, 0, 0} -) - -func get_cursor_position(out syscall.Handle) coord { - err := get_console_screen_buffer_info(out, &tmp_info) - if err != nil { - panic(err) - } - return tmp_info.cursor_position -} - -func get_term_size(out syscall.Handle) coord { - err := get_console_screen_buffer_info(out, &tmp_info) - if err != nil { - panic(err) - } - return tmp_info.size -} - -func get_win_size(out syscall.Handle) coord { - err := get_console_screen_buffer_info(out, &tmp_info) - if err != nil { - panic(err) - } - return coord{ - x: tmp_info.window.right - tmp_info.window.left + 1, - y: tmp_info.window.bottom - tmp_info.window.top + 1, - } -} - -func update_size_maybe() { - size := get_term_size(out) - if size.x != term_size.x || size.y != term_size.y { - term_size = size - back_buffer.resize(int(size.x), int(size.y)) - front_buffer.resize(int(size.x), int(size.y)) - front_buffer.clear() - clear() - - area := int(size.x) * int(size.y) - if cap(charbuf) < area { - charbuf = make([]char_info, 0, area) - } - } -} - -var color_table_bg = []word{ - 0, // default (black) - 0, // black - background_red, - background_green, - background_red | background_green, // yellow - background_blue, - background_red | background_blue, // magenta - background_green | background_blue, // cyan - background_red | background_blue | background_green, // white -} - -var color_table_fg = []word{ - foreground_red | foreground_blue | foreground_green, // default (white) - 0, - foreground_red, - foreground_green, - foreground_red | foreground_green, // yellow - foreground_blue, - foreground_red | foreground_blue, // magenta - foreground_green | foreground_blue, // cyan - foreground_red | foreground_blue | foreground_green, // white -} - -const ( - replacement_char = '\uFFFD' - max_rune = '\U0010FFFF' - surr1 = 0xd800 - surr2 = 0xdc00 - surr3 = 0xe000 - surr_self = 0x10000 -) - -func append_diff_line(y int) int { - n := 0 - for x := 0; x < front_buffer.width; { - cell_offset := y*front_buffer.width + x - back := &back_buffer.cells[cell_offset] - front := &front_buffer.cells[cell_offset] - attr, char := cell_to_char_info(*back) - charbuf = append(charbuf, char_info{attr: attr, char: char[0]}) - *front = *back - n++ - w := runewidth.RuneWidth(back.Ch) - if w == 0 || w == 2 && runewidth.IsAmbiguousWidth(back.Ch) { - w = 1 - } - x += w - // If not CJK, fill trailing space with whitespace - if !is_cjk && w == 2 { - charbuf = append(charbuf, char_info{attr: attr, char: ' '}) - } - } - return n -} - -// compares 'back_buffer' with 'front_buffer' and prepares all changes in the form of -// 'diff_msg's in the 'diff_buf' -func prepare_diff_messages() { - // clear buffers - diffbuf = diffbuf[:0] - charbuf = charbuf[:0] - - var diff diff_msg - gbeg := 0 - for y := 0; y < front_buffer.height; y++ { - same := true - line_offset := y * front_buffer.width - for x := 0; x < front_buffer.width; x++ { - cell_offset := line_offset + x - back := &back_buffer.cells[cell_offset] - front := &front_buffer.cells[cell_offset] - if *back != *front { - same = false - break - } - } - if same && diff.lines > 0 { - diffbuf = append(diffbuf, diff) - diff = diff_msg{} - } - if !same { - beg := len(charbuf) - end := beg + append_diff_line(y) - if diff.lines == 0 { - diff.pos = short(y) - gbeg = beg - } - diff.lines++ - diff.chars = charbuf[gbeg:end] - } - } - if diff.lines > 0 { - diffbuf = append(diffbuf, diff) - diff = diff_msg{} - } -} - -func get_ct(table []word, idx int) word { - idx = idx & 0x0F - if idx >= len(table) { - idx = len(table) - 1 - } - return table[idx] -} - -func cell_to_char_info(c Cell) (attr word, wc [2]wchar) { - attr = get_ct(color_table_fg, int(c.Fg)) | get_ct(color_table_bg, int(c.Bg)) - if c.Fg&AttrReverse|c.Bg&AttrReverse != 0 { - attr = (attr&0xF0)>>4 | (attr&0x0F)<<4 - } - if c.Fg&AttrBold != 0 { - attr |= foreground_intensity - } - if c.Bg&AttrBold != 0 { - attr |= background_intensity - } - - r0, r1 := utf16.EncodeRune(c.Ch) - if r0 == 0xFFFD { - wc[0] = wchar(c.Ch) - wc[1] = ' ' - } else { - wc[0] = wchar(r0) - wc[1] = wchar(r1) - } - return -} - -func move_cursor(x, y int) { - err := set_console_cursor_position(out, coord{short(x), short(y)}) - if err != nil { - panic(err) - } -} - -func show_cursor(visible bool) { - var v int32 - if visible { - v = 1 - } - - var info console_cursor_info - info.size = 100 - info.visible = v - err := set_console_cursor_info(out, &info) - if err != nil { - panic(err) - } -} - -func clear() { - var err error - attr, char := cell_to_char_info(Cell{ - ' ', - foreground, - background, - }) - - area := int(term_size.x) * int(term_size.y) - err = fill_console_output_attribute(out, attr, area) - if err != nil { - panic(err) - } - err = fill_console_output_character(out, char[0], area) - if err != nil { - panic(err) - } - if !is_cursor_hidden(cursor_x, cursor_y) { - move_cursor(cursor_x, cursor_y) - } -} - -func key_event_record_to_event(r *key_event_record) (Event, bool) { - if r.key_down == 0 { - return Event{}, false - } - - e := Event{Type: EventKey} - if input_mode&InputAlt != 0 { - if alt_mode_esc { - e.Mod = ModAlt - alt_mode_esc = false - } - if r.control_key_state&(left_alt_pressed|right_alt_pressed) != 0 { - e.Mod = ModAlt - } - } - - ctrlpressed := r.control_key_state&(left_ctrl_pressed|right_ctrl_pressed) != 0 - - if r.virtual_key_code >= vk_f1 && r.virtual_key_code <= vk_f12 { - switch r.virtual_key_code { - case vk_f1: - e.Key = KeyF1 - case vk_f2: - e.Key = KeyF2 - case vk_f3: - e.Key = KeyF3 - case vk_f4: - e.Key = KeyF4 - case vk_f5: - e.Key = KeyF5 - case vk_f6: - e.Key = KeyF6 - case vk_f7: - e.Key = KeyF7 - case vk_f8: - e.Key = KeyF8 - case vk_f9: - e.Key = KeyF9 - case vk_f10: - e.Key = KeyF10 - case vk_f11: - e.Key = KeyF11 - case vk_f12: - e.Key = KeyF12 - default: - panic("unreachable") - } - - return e, true - } - - if r.virtual_key_code <= vk_delete { - switch r.virtual_key_code { - case vk_insert: - e.Key = KeyInsert - case vk_delete: - e.Key = KeyDelete - case vk_home: - e.Key = KeyHome - case vk_end: - e.Key = KeyEnd - case vk_pgup: - e.Key = KeyPgup - case vk_pgdn: - e.Key = KeyPgdn - case vk_arrow_up: - e.Key = KeyArrowUp - case vk_arrow_down: - e.Key = KeyArrowDown - case vk_arrow_left: - e.Key = KeyArrowLeft - case vk_arrow_right: - e.Key = KeyArrowRight - case vk_backspace: - if ctrlpressed { - e.Key = KeyBackspace2 - } else { - e.Key = KeyBackspace - } - case vk_tab: - e.Key = KeyTab - case vk_enter: - e.Key = KeyEnter - case vk_esc: - switch { - case input_mode&InputEsc != 0: - e.Key = KeyEsc - case input_mode&InputAlt != 0: - alt_mode_esc = true - return Event{}, false - } - case vk_space: - if ctrlpressed { - // manual return here, because KeyCtrlSpace is zero - e.Key = KeyCtrlSpace - return e, true - } else { - e.Key = KeySpace - } - } - - if e.Key != 0 { - return e, true - } - } - - if ctrlpressed { - if Key(r.unicode_char) >= KeyCtrlA && Key(r.unicode_char) <= KeyCtrlRsqBracket { - e.Key = Key(r.unicode_char) - if input_mode&InputAlt != 0 && e.Key == KeyEsc { - alt_mode_esc = true - return Event{}, false - } - return e, true - } - switch r.virtual_key_code { - case 192, 50: - // manual return here, because KeyCtrl2 is zero - e.Key = KeyCtrl2 - return e, true - case 51: - if input_mode&InputAlt != 0 { - alt_mode_esc = true - return Event{}, false - } - e.Key = KeyCtrl3 - case 52: - e.Key = KeyCtrl4 - case 53: - e.Key = KeyCtrl5 - case 54: - e.Key = KeyCtrl6 - case 189, 191, 55: - e.Key = KeyCtrl7 - case 8, 56: - e.Key = KeyCtrl8 - } - - if e.Key != 0 { - return e, true - } - } - - if r.unicode_char != 0 { - e.Ch = rune(r.unicode_char) - return e, true - } - - return Event{}, false -} - -func input_event_producer() { - var r input_record - var err error - var last_button Key - var last_button_pressed Key - var last_state = dword(0) - var last_x, last_y = -1, -1 - handles := []syscall.Handle{in, interrupt} - for { - err = wait_for_multiple_objects(handles) - if err != nil { - input_comm <- Event{Type: EventError, Err: err} - } - - select { - case <-cancel_comm: - cancel_done_comm <- true - return - default: - } - - err = read_console_input(in, &r) - if err != nil { - input_comm <- Event{Type: EventError, Err: err} - } - - switch r.event_type { - case key_event: - kr := (*key_event_record)(unsafe.Pointer(&r.event)) - ev, ok := key_event_record_to_event(kr) - if ok { - for i := 0; i < int(kr.repeat_count); i++ { - input_comm <- ev - } - } - case window_buffer_size_event: - sr := *(*window_buffer_size_record)(unsafe.Pointer(&r.event)) - input_comm <- Event{ - Type: EventResize, - Width: int(sr.size.x), - Height: int(sr.size.y), - } - case mouse_event: - mr := *(*mouse_event_record)(unsafe.Pointer(&r.event)) - ev := Event{Type: EventMouse} - switch mr.event_flags { - case 0, 2: - // single or double click - cur_state := mr.button_state - switch { - case last_state&mouse_lmb == 0 && cur_state&mouse_lmb != 0: - last_button = MouseLeft - last_button_pressed = last_button - case last_state&mouse_rmb == 0 && cur_state&mouse_rmb != 0: - last_button = MouseRight - last_button_pressed = last_button - case last_state&mouse_mmb == 0 && cur_state&mouse_mmb != 0: - last_button = MouseMiddle - last_button_pressed = last_button - case last_state&mouse_lmb != 0 && cur_state&mouse_lmb == 0: - last_button = MouseRelease - case last_state&mouse_rmb != 0 && cur_state&mouse_rmb == 0: - last_button = MouseRelease - case last_state&mouse_mmb != 0 && cur_state&mouse_mmb == 0: - last_button = MouseRelease - default: - last_state = cur_state - continue - } - last_state = cur_state - ev.Key = last_button - last_x, last_y = int(mr.mouse_pos.x), int(mr.mouse_pos.y) - ev.MouseX = last_x - ev.MouseY = last_y - case 1: - // mouse motion - x, y := int(mr.mouse_pos.x), int(mr.mouse_pos.y) - if last_state != 0 && (last_x != x || last_y != y) { - ev.Key = last_button_pressed - ev.Mod = ModMotion - ev.MouseX = x - ev.MouseY = y - last_x, last_y = x, y - } else { - ev.Type = EventNone - } - case 4: - // mouse wheel - n := int16(mr.button_state >> 16) - if n > 0 { - ev.Key = MouseWheelUp - } else { - ev.Key = MouseWheelDown - } - last_x, last_y = int(mr.mouse_pos.x), int(mr.mouse_pos.y) - ev.MouseX = last_x - ev.MouseY = last_y - default: - ev.Type = EventNone - } - if ev.Type != EventNone { - input_comm <- ev - } - } - } -} diff --git a/vendor/github.com/nsf/termbox-go/terminfo.go b/vendor/github.com/nsf/termbox-go/terminfo.go deleted file mode 100644 index 35dbd70b8941..000000000000 --- a/vendor/github.com/nsf/termbox-go/terminfo.go +++ /dev/null @@ -1,221 +0,0 @@ -// +build !windows -// This file contains a simple and incomplete implementation of the terminfo -// database. Information was taken from the ncurses manpages term(5) and -// terminfo(5). Currently, only the string capabilities for special keys and for -// functions without parameters are actually used. Colors are still done with -// ANSI escape sequences. Other special features that are not (yet?) supported -// are reading from ~/.terminfo, the TERMINFO_DIRS variable, Berkeley database -// format and extended capabilities. - -package termbox - -import ( - "bytes" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "io/ioutil" - "os" - "strings" -) - -const ( - ti_magic = 0432 - ti_header_length = 12 - ti_mouse_enter = "\x1b[?1000h\x1b[?1002h\x1b[?1015h\x1b[?1006h" - ti_mouse_leave = "\x1b[?1006l\x1b[?1015l\x1b[?1002l\x1b[?1000l" -) - -func load_terminfo() ([]byte, error) { - var data []byte - var err error - - term := os.Getenv("TERM") - if term == "" { - return nil, fmt.Errorf("termbox: TERM not set") - } - - // The following behaviour follows the one described in terminfo(5) as - // distributed by ncurses. - - terminfo := os.Getenv("TERMINFO") - if terminfo != "" { - // if TERMINFO is set, no other directory should be searched - return ti_try_path(terminfo) - } - - // next, consider ~/.terminfo - home := os.Getenv("HOME") - if home != "" { - data, err = ti_try_path(home + "/.terminfo") - if err == nil { - return data, nil - } - } - - // next, TERMINFO_DIRS - dirs := os.Getenv("TERMINFO_DIRS") - if dirs != "" { - for _, dir := range strings.Split(dirs, ":") { - if dir == "" { - // "" -> "/usr/share/terminfo" - dir = "/usr/share/terminfo" - } - data, err = ti_try_path(dir) - if err == nil { - return data, nil - } - } - } - - // fall back to /usr/share/terminfo - return ti_try_path("/usr/share/terminfo") -} - -func ti_try_path(path string) (data []byte, err error) { - // load_terminfo already made sure it is set - term := os.Getenv("TERM") - - // first try, the typical *nix path - terminfo := path + "/" + term[0:1] + "/" + term - data, err = ioutil.ReadFile(terminfo) - if err == nil { - return - } - - // fallback to darwin specific dirs structure - terminfo = path + "/" + hex.EncodeToString([]byte(term[:1])) + "/" + term - data, err = ioutil.ReadFile(terminfo) - return -} - -func setup_term_builtin() error { - name := os.Getenv("TERM") - if name == "" { - return errors.New("termbox: TERM environment variable not set") - } - - for _, t := range terms { - if t.name == name { - keys = t.keys - funcs = t.funcs - return nil - } - } - - compat_table := []struct { - partial string - keys []string - funcs []string - }{ - {"xterm", xterm_keys, xterm_funcs}, - {"rxvt", rxvt_unicode_keys, rxvt_unicode_funcs}, - {"linux", linux_keys, linux_funcs}, - {"Eterm", eterm_keys, eterm_funcs}, - {"screen", screen_keys, screen_funcs}, - // let's assume that 'cygwin' is xterm compatible - {"cygwin", xterm_keys, xterm_funcs}, - {"st", xterm_keys, xterm_funcs}, - } - - // try compatibility variants - for _, it := range compat_table { - if strings.Contains(name, it.partial) { - keys = it.keys - funcs = it.funcs - return nil - } - } - - return errors.New("termbox: unsupported terminal") -} - -func setup_term() (err error) { - var data []byte - var header [6]int16 - var str_offset, table_offset int16 - - data, err = load_terminfo() - if err != nil { - return setup_term_builtin() - } - - rd := bytes.NewReader(data) - // 0: magic number, 1: size of names section, 2: size of boolean section, 3: - // size of numbers section (in integers), 4: size of the strings section (in - // integers), 5: size of the string table - - err = binary.Read(rd, binary.LittleEndian, header[:]) - if err != nil { - return - } - - if (header[1]+header[2])%2 != 0 { - // old quirk to align everything on word boundaries - header[2] += 1 - } - str_offset = ti_header_length + header[1] + header[2] + 2*header[3] - table_offset = str_offset + 2*header[4] - - keys = make([]string, 0xFFFF-key_min) - for i, _ := range keys { - keys[i], err = ti_read_string(rd, str_offset+2*ti_keys[i], table_offset) - if err != nil { - return - } - } - funcs = make([]string, t_max_funcs) - // the last two entries are reserved for mouse. because the table offset is - // not there, the two entries have to fill in manually - for i, _ := range funcs[:len(funcs)-2] { - funcs[i], err = ti_read_string(rd, str_offset+2*ti_funcs[i], table_offset) - if err != nil { - return - } - } - funcs[t_max_funcs-2] = ti_mouse_enter - funcs[t_max_funcs-1] = ti_mouse_leave - return nil -} - -func ti_read_string(rd *bytes.Reader, str_off, table int16) (string, error) { - var off int16 - - _, err := rd.Seek(int64(str_off), 0) - if err != nil { - return "", err - } - err = binary.Read(rd, binary.LittleEndian, &off) - if err != nil { - return "", err - } - _, err = rd.Seek(int64(table+off), 0) - if err != nil { - return "", err - } - var bs []byte - for { - b, err := rd.ReadByte() - if err != nil { - return "", err - } - if b == byte(0x00) { - break - } - bs = append(bs, b) - } - return string(bs), nil -} - -// "Maps" the function constants from termbox.go to the number of the respective -// string capability in the terminfo file. Taken from (ncurses) term.h. -var ti_funcs = []int16{ - 28, 40, 16, 13, 5, 39, 36, 27, 26, 34, 89, 88, -} - -// Same as above for the special keys. -var ti_keys = []int16{ - 66, 68 /* apparently not a typo; 67 is F10 for whatever reason */, 69, 70, - 71, 72, 73, 74, 75, 67, 216, 217, 77, 59, 76, 164, 82, 81, 87, 61, 79, 83, -} diff --git a/vendor/github.com/nsf/termbox-go/terminfo_builtin.go b/vendor/github.com/nsf/termbox-go/terminfo_builtin.go deleted file mode 100644 index a94866067bae..000000000000 --- a/vendor/github.com/nsf/termbox-go/terminfo_builtin.go +++ /dev/null @@ -1,64 +0,0 @@ -// +build !windows - -package termbox - -// Eterm -var eterm_keys = []string{ - "\x1b[11~", "\x1b[12~", "\x1b[13~", "\x1b[14~", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[7~", "\x1b[8~", "\x1b[5~", "\x1b[6~", "\x1b[A", "\x1b[B", "\x1b[D", "\x1b[C", -} -var eterm_funcs = []string{ - "\x1b7\x1b[?47h", "\x1b[2J\x1b[?47l\x1b8", "\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[2J", "\x1b[m\x0f", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "", "", "", "", -} - -// screen -var screen_keys = []string{ - "\x1bOP", "\x1bOQ", "\x1bOR", "\x1bOS", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[1~", "\x1b[4~", "\x1b[5~", "\x1b[6~", "\x1bOA", "\x1bOB", "\x1bOD", "\x1bOC", -} -var screen_funcs = []string{ - "\x1b[?1049h", "\x1b[?1049l", "\x1b[34h\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[J", "\x1b[m\x0f", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "\x1b[?1h\x1b=", "\x1b[?1l\x1b>", ti_mouse_enter, ti_mouse_leave, -} - -// xterm -var xterm_keys = []string{ - "\x1bOP", "\x1bOQ", "\x1bOR", "\x1bOS", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1bOH", "\x1bOF", "\x1b[5~", "\x1b[6~", "\x1bOA", "\x1bOB", "\x1bOD", "\x1bOC", -} -var xterm_funcs = []string{ - "\x1b[?1049h", "\x1b[?1049l", "\x1b[?12l\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[2J", "\x1b(B\x1b[m", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "\x1b[?1h\x1b=", "\x1b[?1l\x1b>", ti_mouse_enter, ti_mouse_leave, -} - -// rxvt-unicode -var rxvt_unicode_keys = []string{ - "\x1b[11~", "\x1b[12~", "\x1b[13~", "\x1b[14~", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[7~", "\x1b[8~", "\x1b[5~", "\x1b[6~", "\x1b[A", "\x1b[B", "\x1b[D", "\x1b[C", -} -var rxvt_unicode_funcs = []string{ - "\x1b[?1049h", "\x1b[r\x1b[?1049l", "\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[2J", "\x1b[m\x1b(B", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "\x1b=", "\x1b>", ti_mouse_enter, ti_mouse_leave, -} - -// linux -var linux_keys = []string{ - "\x1b[[A", "\x1b[[B", "\x1b[[C", "\x1b[[D", "\x1b[[E", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[1~", "\x1b[4~", "\x1b[5~", "\x1b[6~", "\x1b[A", "\x1b[B", "\x1b[D", "\x1b[C", -} -var linux_funcs = []string{ - "", "", "\x1b[?25h\x1b[?0c", "\x1b[?25l\x1b[?1c", "\x1b[H\x1b[J", "\x1b[0;10m", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "", "", "", "", -} - -// rxvt-256color -var rxvt_256color_keys = []string{ - "\x1b[11~", "\x1b[12~", "\x1b[13~", "\x1b[14~", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[7~", "\x1b[8~", "\x1b[5~", "\x1b[6~", "\x1b[A", "\x1b[B", "\x1b[D", "\x1b[C", -} -var rxvt_256color_funcs = []string{ - "\x1b7\x1b[?47h", "\x1b[2J\x1b[?47l\x1b8", "\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[2J", "\x1b[m\x0f", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "\x1b=", "\x1b>", ti_mouse_enter, ti_mouse_leave, -} - -var terms = []struct { - name string - keys []string - funcs []string -}{ - {"Eterm", eterm_keys, eterm_funcs}, - {"screen", screen_keys, screen_funcs}, - {"xterm", xterm_keys, xterm_funcs}, - {"rxvt-unicode", rxvt_unicode_keys, rxvt_unicode_funcs}, - {"linux", linux_keys, linux_funcs}, - {"rxvt-256color", rxvt_256color_keys, rxvt_256color_funcs}, -} diff --git a/vendor/github.com/olekukonko/tablewriter/LICENCE.md b/vendor/github.com/olekukonko/tablewriter/LICENCE.md deleted file mode 100644 index 1fd8484253fb..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/LICENCE.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2014 by Oleku Konko - -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. \ No newline at end of file diff --git a/vendor/github.com/olekukonko/tablewriter/LICENSE.md b/vendor/github.com/olekukonko/tablewriter/LICENSE.md new file mode 100644 index 000000000000..a0769b5c1581 --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/LICENSE.md @@ -0,0 +1,19 @@ +Copyright (C) 2014 by Oleku Konko + +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. diff --git a/vendor/github.com/olekukonko/tablewriter/README.md b/vendor/github.com/olekukonko/tablewriter/README.md index 805330adcd37..92d71ed48b18 100644 --- a/vendor/github.com/olekukonko/tablewriter/README.md +++ b/vendor/github.com/olekukonko/tablewriter/README.md @@ -1,11 +1,13 @@ ASCII Table Writer ========= -[![Build Status](https://travis-ci.org/olekukonko/tablewriter.png?branch=master)](https://travis-ci.org/olekukonko/tablewriter) [![Total views](https://sourcegraph.com/api/repos/github.com/olekukonko/tablewriter/counters/views.png)](https://sourcegraph.com/github.com/olekukonko/tablewriter) +[![Build Status](https://travis-ci.org/olekukonko/tablewriter.png?branch=master)](https://travis-ci.org/olekukonko/tablewriter) +[![Total views](https://img.shields.io/sourcegraph/rrc/github.com/olekukonko/tablewriter.svg)](https://sourcegraph.com/github.com/olekukonko/tablewriter) +[![Godoc](https://godoc.org/github.com/olekukonko/tablewriter?status.svg)](https://godoc.org/github.com/olekukonko/tablewriter) Generate ASCII table on the fly ... Installation is simple as - go get github.com/olekukonko/tablewriter + go get github.com/olekukonko/tablewriter #### Features @@ -22,7 +24,8 @@ Generate ASCII table on the fly ... Installation is simple as - Enable or disable table border - Set custom footer support - Optional identical cells merging - +- Set custom caption +- Optional reflowing of paragrpahs in multi-line cells. #### Example 1 - Basic ```go @@ -75,21 +78,21 @@ table.Render() ``` DATE | DESCRIPTION | CV2 | AMOUNT -+----------+--------------------------+-------+---------+ +-----------+--------------------------+-------+---------- 1/1/2014 | Domain name | 2233 | $10.98 1/1/2014 | January Hosting | 2233 | $54.95 1/4/2014 | February Hosting | 2233 | $51.00 1/4/2014 | February Extra Bandwidth | 2233 | $30.00 -+----------+--------------------------+-------+---------+ +-----------+--------------------------+-------+---------- TOTAL | $146 93 - +-------+---------+ + --------+---------- ``` #### Example 3 - CSV ```go -table, _ := tablewriter.NewCSV(os.Stdout, "test_info.csv", true) +table, _ := tablewriter.NewCSV(os.Stdout, "testdata/test_info.csv", true) table.SetAlignment(tablewriter.ALIGN_LEFT) // Set Alignment table.Render() ``` @@ -107,12 +110,12 @@ table.Render() #### Example 4 - Custom Separator ```go -table, _ := tablewriter.NewCSV(os.Stdout, "test.csv", true) +table, _ := tablewriter.NewCSV(os.Stdout, "testdata/test.csv", true) table.SetRowLine(true) // Enable row line // Change table lines table.SetCenterSeparator("*") -table.SetColumnSeparator("‡") +table.SetColumnSeparator("╪") table.SetRowSeparator("-") table.SetAlignment(tablewriter.ALIGN_LEFT) @@ -132,7 +135,7 @@ table.Render() *------------*-----------*---------* ``` -##### Example 5 - Markdown Format +#### Example 5 - Markdown Format ```go data := [][]string{ []string{"1/1/2014", "Domain name", "2233", "$10.98"}, @@ -194,11 +197,109 @@ table.Render() +----------+--------------------------+-------+---------+ ``` + +#### Table with color +```go +data := [][]string{ + []string{"1/1/2014", "Domain name", "2233", "$10.98"}, + []string{"1/1/2014", "January Hosting", "2233", "$54.95"}, + []string{"1/4/2014", "February Hosting", "2233", "$51.00"}, + []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"}, +} + +table := tablewriter.NewWriter(os.Stdout) +table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) +table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer +table.SetBorder(false) // Set Border to false + +table.SetHeaderColor(tablewriter.Colors{tablewriter.Bold, tablewriter.BgGreenColor}, + tablewriter.Colors{tablewriter.FgHiRedColor, tablewriter.Bold, tablewriter.BgBlackColor}, + tablewriter.Colors{tablewriter.BgRedColor, tablewriter.FgWhiteColor}, + tablewriter.Colors{tablewriter.BgCyanColor, tablewriter.FgWhiteColor}) + +table.SetColumnColor(tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor}, + tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiRedColor}, + tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor}, + tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlackColor}) + +table.SetFooterColor(tablewriter.Colors{}, tablewriter.Colors{}, + tablewriter.Colors{tablewriter.Bold}, + tablewriter.Colors{tablewriter.FgHiRedColor}) + +table.AppendBulk(data) +table.Render() +``` + +#### Table with color Output +![Table with Color](https://cloud.githubusercontent.com/assets/6460392/21101956/bbc7b356-c0a1-11e6-9f36-dba694746efc.png) + +#### Example 6 - Set table caption +```go +data := [][]string{ + []string{"A", "The Good", "500"}, + []string{"B", "The Very very Bad Man", "288"}, + []string{"C", "The Ugly", "120"}, + []string{"D", "The Gopher", "800"}, +} + +table := tablewriter.NewWriter(os.Stdout) +table.SetHeader([]string{"Name", "Sign", "Rating"}) +table.SetCaption(true, "Movie ratings.") + +for _, v := range data { + table.Append(v) +} +table.Render() // Send output +``` + +Note: Caption text will wrap with total width of rendered table. + +##### Output 6 +``` ++------+-----------------------+--------+ +| NAME | SIGN | RATING | ++------+-----------------------+--------+ +| A | The Good | 500 | +| B | The Very very Bad Man | 288 | +| C | The Ugly | 120 | +| D | The Gopher | 800 | ++------+-----------------------+--------+ +Movie ratings. +``` + +#### Render table into a string + +Instead of rendering the table to `io.Stdout` you can also render it into a string. Go 1.10 introduced the `strings.Builder` type which implements the `io.Writer` interface and can therefore be used for this task. Example: + +```go +package main + +import ( + "strings" + "fmt" + + "github.com/olekukonko/tablewriter" +) + +func main() { + tableString := &strings.Builder{} + table := tablewriter.NewWriter(tableString) + + /* + * Code to fill the table + */ + + table.Render() + + fmt.Println(tableString.String()) +} +``` + #### TODO - ~~Import Directly from CSV~~ - `done` - ~~Support for `SetFooter`~~ - `done` - ~~Support for `SetBorder`~~ - `done` - ~~Support table with uneven rows~~ - `done` -- Support custom alignment +- ~~Support custom alignment~~ - General Improvement & Optimisation - `NewHTML` Parse table from HTML diff --git a/vendor/github.com/olekukonko/tablewriter/table.go b/vendor/github.com/olekukonko/tablewriter/table.go index 3314bfba5cf8..3cf09969e639 100644 --- a/vendor/github.com/olekukonko/tablewriter/table.go +++ b/vendor/github.com/olekukonko/tablewriter/table.go @@ -36,8 +36,8 @@ const ( ) var ( - decimal = regexp.MustCompile(`^-*\d*\.?\d*$`) - percent = regexp.MustCompile(`^-*\d*\.?\d*$%$`) + decimal = regexp.MustCompile(`^-?(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$`) + percent = regexp.MustCompile(`^-?\d+\.?\d*$%$`) ) type Border struct { @@ -53,10 +53,13 @@ type Table struct { lines [][][]string cs map[int]int rs map[int]int - headers []string - footers []string + headers [][]string + footers [][]string + caption bool + captionText string autoFmt bool autoWrap bool + reflowText bool mW int pCenter string pRow string @@ -72,40 +75,51 @@ type Table struct { hdrLine bool borders Border colSize int + headerParams []string + columnsParams []string + footerParams []string + columnsAlign []int } // Start New Table // Take io.Writer Directly func NewWriter(writer io.Writer) *Table { t := &Table{ - out: writer, - rows: [][]string{}, - lines: [][][]string{}, - cs: make(map[int]int), - rs: make(map[int]int), - headers: []string{}, - footers: []string{}, - autoFmt: true, - autoWrap: true, - mW: MAX_ROW_WIDTH, - pCenter: CENTER, - pRow: ROW, - pColumn: COLUMN, - tColumn: -1, - tRow: -1, - hAlign: ALIGN_DEFAULT, - fAlign: ALIGN_DEFAULT, - align: ALIGN_DEFAULT, - newLine: NEWLINE, - rowLine: false, - hdrLine: true, - borders: Border{Left: true, Right: true, Bottom: true, Top: true}, - colSize: -1} + out: writer, + rows: [][]string{}, + lines: [][][]string{}, + cs: make(map[int]int), + rs: make(map[int]int), + headers: [][]string{}, + footers: [][]string{}, + caption: false, + captionText: "Table caption.", + autoFmt: true, + autoWrap: true, + reflowText: true, + mW: MAX_ROW_WIDTH, + pCenter: CENTER, + pRow: ROW, + pColumn: COLUMN, + tColumn: -1, + tRow: -1, + hAlign: ALIGN_DEFAULT, + fAlign: ALIGN_DEFAULT, + align: ALIGN_DEFAULT, + newLine: NEWLINE, + rowLine: false, + hdrLine: true, + borders: Border{Left: true, Right: true, Bottom: true, Top: true}, + colSize: -1, + headerParams: []string{}, + columnsParams: []string{}, + footerParams: []string{}, + columnsAlign: []int{}} return t } // Render table output -func (t Table) Render() { +func (t *Table) Render() { if t.borders.Top { t.printLine(true) } @@ -115,20 +129,27 @@ func (t Table) Render() { } else { t.printRows() } - if !t.rowLine && t.borders.Bottom { t.printLine(true) } t.printFooter() + if t.caption { + t.printCaption() + } } +const ( + headerRowIdx = -1 + footerRowIdx = -2 +) + // Set table header func (t *Table) SetHeader(keys []string) { t.colSize = len(keys) for i, v := range keys { - t.parseDimension(v, i, -1) - t.headers = append(t.headers, v) + lines := t.parseDimension(v, i, headerRowIdx) + t.headers = append(t.headers, lines) } } @@ -136,8 +157,16 @@ func (t *Table) SetHeader(keys []string) { func (t *Table) SetFooter(keys []string) { //t.colSize = len(keys) for i, v := range keys { - t.parseDimension(v, i, -1) - t.footers = append(t.footers, v) + lines := t.parseDimension(v, i, footerRowIdx) + t.footers = append(t.footers, lines) + } +} + +// Set table Caption +func (t *Table) SetCaption(caption bool, captionText ...string) { + t.caption = caption + if len(captionText) == 1 { + t.captionText = captionText[0] } } @@ -151,11 +180,21 @@ func (t *Table) SetAutoWrapText(auto bool) { t.autoWrap = auto } +// Turn automatic reflowing of multiline text when rewrapping. Default is on (true). +func (t *Table) SetReflowDuringAutoWrap(auto bool) { + t.reflowText = auto +} + // Set the Default column width func (t *Table) SetColWidth(width int) { t.mW = width } +// Set the minimal width for a column +func (t *Table) SetColMinWidth(column int, width int) { + t.cs[column] = width +} + // Set the Column Separator func (t *Table) SetColumnSeparator(sep string) { t.pColumn = sep @@ -186,6 +225,22 @@ func (t *Table) SetAlignment(align int) { t.align = align } +func (t *Table) SetColumnAlignment(keys []int) { + for _, v := range keys { + switch v { + case ALIGN_CENTER: + break + case ALIGN_LEFT: + break + case ALIGN_RIGHT: + break + default: + v = ALIGN_DEFAULT + } + t.columnsAlign = append(t.columnsAlign, v) + } +} + // Set New Line func (t *Table) SetNewLine(nl string) { t.newLine = nl @@ -249,16 +304,44 @@ func (t *Table) AppendBulk(rows [][]string) { } } +// NumLines to get the number of lines +func (t *Table) NumLines() int { + return len(t.lines) +} + +// Clear rows +func (t *Table) ClearRows() { + t.lines = [][][]string{} +} + +// Clear footer +func (t *Table) ClearFooter() { + t.footers = [][]string{} +} + +// Center based on position and border. +func (t *Table) center(i int) string { + if i == -1 && !t.borders.Left { + return t.pRow + } + + if i == len(t.cs)-1 && !t.borders.Right { + return t.pRow + } + + return t.pCenter +} + // Print line based on row width -func (t Table) printLine(nl bool) { - fmt.Fprint(t.out, t.pCenter) +func (t *Table) printLine(nl bool) { + fmt.Fprint(t.out, t.center(-1)) for i := 0; i < len(t.cs); i++ { v := t.cs[i] fmt.Fprintf(t.out, "%s%s%s%s", t.pRow, strings.Repeat(string(t.pRow), v), t.pRow, - t.pCenter) + t.center(i)) } if nl { fmt.Fprint(t.out, t.newLine) @@ -266,7 +349,7 @@ func (t Table) printLine(nl bool) { } // Print line based on row width with our without cell separator -func (t Table) printLineOptionalCellSeparators(nl bool, displayCellSeparator []bool) { +func (t *Table) printLineOptionalCellSeparators(nl bool, displayCellSeparator []bool) { fmt.Fprint(t.out, t.pCenter) for i := 0; i < len(t.cs); i++ { v := t.cs[i] @@ -303,43 +386,64 @@ func pad(align int) func(string, string, int) string { } // Print heading information -func (t Table) printHeading() { +func (t *Table) printHeading() { // Check if headers is available if len(t.headers) < 1 { return } - // Check if border is set - // Replace with space if not set - fmt.Fprint(t.out, ConditionString(t.borders.Left, t.pColumn, SPACE)) - // Identify last column end := len(t.cs) - 1 // Get pad function padFunc := pad(t.hAlign) - // Print Heading column - for i := 0; i <= end; i++ { - v := t.cs[i] - h := t.headers[i] - if t.autoFmt { - h = Title(h) + // Checking for ANSI escape sequences for header + is_esc_seq := false + if len(t.headerParams) > 0 { + is_esc_seq = true + } + + // Maximum height. + max := t.rs[headerRowIdx] + + // Print Heading + for x := 0; x < max; x++ { + // Check if border is set + // Replace with space if not set + fmt.Fprint(t.out, ConditionString(t.borders.Left, t.pColumn, SPACE)) + + for y := 0; y <= end; y++ { + v := t.cs[y] + h := "" + if y < len(t.headers) && x < len(t.headers[y]) { + h = t.headers[y][x] + } + if t.autoFmt { + h = Title(h) + } + pad := ConditionString((y == end && !t.borders.Left), SPACE, t.pColumn) + + if is_esc_seq { + fmt.Fprintf(t.out, " %s %s", + format(padFunc(h, SPACE, v), + t.headerParams[y]), pad) + } else { + fmt.Fprintf(t.out, " %s %s", + padFunc(h, SPACE, v), + pad) + } } - pad := ConditionString((i == end && !t.borders.Left), SPACE, t.pColumn) - fmt.Fprintf(t.out, " %s %s", - padFunc(h, SPACE, v), - pad) + // Next line + fmt.Fprint(t.out, t.newLine) } - // Next line - fmt.Fprint(t.out, t.newLine) if t.hdrLine { t.printLine(true) } } // Print heading information -func (t Table) printFooter() { +func (t *Table) printFooter() { // Check if headers is available if len(t.footers) < 1 { return @@ -349,9 +453,6 @@ func (t Table) printFooter() { if !t.borders.Bottom { t.printLine(true) } - // Check if border is set - // Replace with space if not set - fmt.Fprint(t.out, ConditionString(t.borders.Bottom, t.pColumn, SPACE)) // Identify last column end := len(t.cs) - 1 @@ -359,25 +460,56 @@ func (t Table) printFooter() { // Get pad function padFunc := pad(t.fAlign) - // Print Heading column - for i := 0; i <= end; i++ { - v := t.cs[i] - f := t.footers[i] - if t.autoFmt { - f = Title(f) - } - pad := ConditionString((i == end && !t.borders.Top), SPACE, t.pColumn) + // Checking for ANSI escape sequences for header + is_esc_seq := false + if len(t.footerParams) > 0 { + is_esc_seq = true + } - if len(t.footers[i]) == 0 { - pad = SPACE + // Maximum height. + max := t.rs[footerRowIdx] + + // Print Footer + erasePad := make([]bool, len(t.footers)) + for x := 0; x < max; x++ { + // Check if border is set + // Replace with space if not set + fmt.Fprint(t.out, ConditionString(t.borders.Bottom, t.pColumn, SPACE)) + + for y := 0; y <= end; y++ { + v := t.cs[y] + f := "" + if y < len(t.footers) && x < len(t.footers[y]) { + f = t.footers[y][x] + } + if t.autoFmt { + f = Title(f) + } + pad := ConditionString((y == end && !t.borders.Top), SPACE, t.pColumn) + + if erasePad[y] || (x == 0 && len(f) == 0) { + pad = SPACE + erasePad[y] = true + } + + if is_esc_seq { + fmt.Fprintf(t.out, " %s %s", + format(padFunc(f, SPACE, v), + t.footerParams[y]), pad) + } else { + fmt.Fprintf(t.out, " %s %s", + padFunc(f, SPACE, v), + pad) + } + + //fmt.Fprintf(t.out, " %s %s", + // padFunc(f, SPACE, v), + // pad) } - fmt.Fprintf(t.out, " %s %s", - padFunc(f, SPACE, v), - pad) + // Next line + fmt.Fprint(t.out, t.newLine) + //t.printLine(true) } - // Next line - fmt.Fprint(t.out, t.newLine) - //t.printLine(true) hasPrinted := false @@ -385,7 +517,7 @@ func (t Table) printFooter() { v := t.cs[i] pad := t.pRow center := t.pCenter - length := len(t.footers[i]) + length := len(t.footers[i][0]) if length > 0 { hasPrinted = true @@ -398,6 +530,9 @@ func (t Table) printFooter() { // Print first junction if i == 0 { + if length > 0 && !t.borders.Left { + center = t.pRow + } fmt.Fprint(t.out, center) } @@ -405,16 +540,27 @@ func (t Table) printFooter() { if length == 0 { pad = SPACE } - // Ignore left space of it has printed before + // Ignore left space as it has printed before if hasPrinted || t.borders.Left { pad = t.pRow center = t.pCenter } + // Change Center end position + if center != SPACE { + if i == end && !t.borders.Right { + center = t.pRow + } + } + // Change Center start position if center == SPACE { - if i < end && len(t.footers[i+1]) != 0 { - center = t.pCenter + if i < end && len(t.footers[i+1][0]) != 0 { + if !t.borders.Left { + center = t.pRow + } else { + center = t.pCenter + } } } @@ -428,22 +574,53 @@ func (t Table) printFooter() { } fmt.Fprint(t.out, t.newLine) +} + +// Print caption text +func (t Table) printCaption() { + width := t.getTableWidth() + paragraph, _ := WrapString(t.captionText, width) + for linecount := 0; linecount < len(paragraph); linecount++ { + fmt.Fprintln(t.out, paragraph[linecount]) + } +} + +// Calculate the total number of characters in a row +func (t Table) getTableWidth() int { + var chars int + for _, v := range t.cs { + chars += v + } + + // Add chars, spaces, seperators to calculate the total width of the table. + // ncols := t.colSize + // spaces := ncols * 2 + // seps := ncols + 1 + return (chars + (3 * t.colSize) + 2) } func (t Table) printRows() { for i, lines := range t.lines { t.printRow(lines, i) } +} +func (t *Table) fillAlignment(num int) { + if len(t.columnsAlign) < num { + t.columnsAlign = make([]int, num) + for i := range t.columnsAlign { + t.columnsAlign[i] = t.align + } + } } // Print Row Information // Adjust column alignment based on type -func (t Table) printRow(columns [][]string, colKey int) { +func (t *Table) printRow(columns [][]string, rowIdx int) { // Get Maximum Height - max := t.rs[colKey] + max := t.rs[rowIdx] total := len(columns) // TODO Fix uneven col size @@ -455,9 +632,15 @@ func (t Table) printRow(columns [][]string, colKey int) { //} // Pad Each Height - // pads := []int{} pads := []int{} + // Checking for ANSI escape sequences for columns + is_esc_seq := false + if len(t.columnsParams) > 0 { + is_esc_seq = true + } + t.fillAlignment(total) + for i, line := range columns { length := len(line) pad := max - length @@ -476,9 +659,14 @@ func (t Table) printRow(columns [][]string, colKey int) { fmt.Fprintf(t.out, SPACE) str := columns[y][x] + // Embedding escape sequence with column value + if is_esc_seq { + str = format(str, t.columnsParams[y]) + } + // This would print alignment // Default alignment would use multiple configuration - switch t.align { + switch t.columnsAlign[y] { case ALIGN_CENTER: // fmt.Fprintf(t.out, "%s", Pad(str, SPACE, t.cs[y])) case ALIGN_RIGHT: @@ -514,7 +702,7 @@ func (t Table) printRow(columns [][]string, colKey int) { } // Print the rows of the table and merge the cells that are identical -func (t Table) printRowsMergeCells() { +func (t *Table) printRowsMergeCells() { var previousLine []string var displayCellBorder []bool var tmpWriter bytes.Buffer @@ -537,14 +725,19 @@ func (t Table) printRowsMergeCells() { // Print Row Information to a writer and merge identical cells. // Adjust column alignment based on type -func (t Table) printRowMergeCells(writer io.Writer, columns [][]string, colKey int, previousLine []string) ([]string, []bool) { +func (t *Table) printRowMergeCells(writer io.Writer, columns [][]string, rowIdx int, previousLine []string) ([]string, []bool) { // Get Maximum Height - max := t.rs[colKey] + max := t.rs[rowIdx] total := len(columns) // Pad Each Height pads := []int{} + // Checking for ANSI escape sequences for columns + is_esc_seq := false + if len(t.columnsParams) > 0 { + is_esc_seq = true + } for i, line := range columns { length := len(line) pad := max - length @@ -555,6 +748,7 @@ func (t Table) printRowMergeCells(writer io.Writer, columns [][]string, colKey i } var displayCellBorder []bool + t.fillAlignment(total) for x := 0; x < max; x++ { for y := 0; y < total; y++ { @@ -565,6 +759,11 @@ func (t Table) printRowMergeCells(writer io.Writer, columns [][]string, colKey i str := columns[y][x] + // Embedding escape sequence with column value + if is_esc_seq { + str = format(str, t.columnsParams[y]) + } + if t.autoMergeCells { //Store the full line to merge mutli-lines cells fullLine := strings.Join(columns[y], " ") @@ -580,7 +779,7 @@ func (t Table) printRowMergeCells(writer io.Writer, columns [][]string, colKey i // This would print alignment // Default alignment would use multiple configuration - switch t.align { + switch t.columnsAlign[y] { case ALIGN_CENTER: // fmt.Fprintf(writer, "%s", Pad(str, SPACE, t.cs[y])) case ALIGN_RIGHT: @@ -613,44 +812,59 @@ func (t Table) printRowMergeCells(writer io.Writer, columns [][]string, colKey i func (t *Table) parseDimension(str string, colKey, rowKey int) []string { var ( - raw []string - max int + raw []string + maxWidth int ) - w := DisplayWidth(str) - // Calculate Width - // Check if with is grater than maximum width - if w > t.mW { - w = t.mW - } - // Check if width exists - v, ok := t.cs[colKey] - if !ok || v < w || v == 0 { - t.cs[colKey] = w + raw = getLines(str) + maxWidth = 0 + for _, line := range raw { + if w := DisplayWidth(line); w > maxWidth { + maxWidth = w + } } - if rowKey == -1 { - return raw - } - // Calculate Height + // If wrapping, ensure that all paragraphs in the cell fit in the + // specified width. if t.autoWrap { - raw, _ = WrapString(str, t.cs[colKey]) - } else { - raw = getLines(str) - } + // If there's a maximum allowed width for wrapping, use that. + if maxWidth > t.mW { + maxWidth = t.mW + } - for _, line := range raw { - if w := DisplayWidth(line); w > max { - max = w + // In the process of doing so, we need to recompute maxWidth. This + // is because perhaps a word in the cell is longer than the + // allowed maximum width in t.mW. + newMaxWidth := maxWidth + newRaw := make([]string, 0, len(raw)) + + if t.reflowText { + // Make a single paragraph of everything. + raw = []string{strings.Join(raw, " ")} + } + for i, para := range raw { + paraLines, _ := WrapString(para, maxWidth) + for _, line := range paraLines { + if w := DisplayWidth(line); w > newMaxWidth { + newMaxWidth = w + } + } + if i > 0 { + newRaw = append(newRaw, " ") + } + newRaw = append(newRaw, paraLines...) } + raw = newRaw + maxWidth = newMaxWidth } - // Make sure the with is the same length as maximum word - // Important for cases where the width is smaller than maxu word - if max > t.cs[colKey] { - t.cs[colKey] = max + // Store the new known maximum width. + v, ok := t.cs[colKey] + if !ok || v < maxWidth || v == 0 { + t.cs[colKey] = maxWidth } + // Remember the number of lines for the row printer. h := len(raw) v, ok = t.rs[rowKey] diff --git a/vendor/github.com/olekukonko/tablewriter/table_with_color.go b/vendor/github.com/olekukonko/tablewriter/table_with_color.go new file mode 100644 index 000000000000..5a4a53ec2a38 --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/table_with_color.go @@ -0,0 +1,134 @@ +package tablewriter + +import ( + "fmt" + "strconv" + "strings" +) + +const ESC = "\033" +const SEP = ";" + +const ( + BgBlackColor int = iota + 40 + BgRedColor + BgGreenColor + BgYellowColor + BgBlueColor + BgMagentaColor + BgCyanColor + BgWhiteColor +) + +const ( + FgBlackColor int = iota + 30 + FgRedColor + FgGreenColor + FgYellowColor + FgBlueColor + FgMagentaColor + FgCyanColor + FgWhiteColor +) + +const ( + BgHiBlackColor int = iota + 100 + BgHiRedColor + BgHiGreenColor + BgHiYellowColor + BgHiBlueColor + BgHiMagentaColor + BgHiCyanColor + BgHiWhiteColor +) + +const ( + FgHiBlackColor int = iota + 90 + FgHiRedColor + FgHiGreenColor + FgHiYellowColor + FgHiBlueColor + FgHiMagentaColor + FgHiCyanColor + FgHiWhiteColor +) + +const ( + Normal = 0 + Bold = 1 + UnderlineSingle = 4 + Italic +) + +type Colors []int + +func startFormat(seq string) string { + return fmt.Sprintf("%s[%sm", ESC, seq) +} + +func stopFormat() string { + return fmt.Sprintf("%s[%dm", ESC, Normal) +} + +// Making the SGR (Select Graphic Rendition) sequence. +func makeSequence(codes []int) string { + codesInString := []string{} + for _, code := range codes { + codesInString = append(codesInString, strconv.Itoa(code)) + } + return strings.Join(codesInString, SEP) +} + +// Adding ANSI escape sequences before and after string +func format(s string, codes interface{}) string { + var seq string + + switch v := codes.(type) { + + case string: + seq = v + case []int: + seq = makeSequence(v) + default: + return s + } + + if len(seq) == 0 { + return s + } + return startFormat(seq) + s + stopFormat() +} + +// Adding header colors (ANSI codes) +func (t *Table) SetHeaderColor(colors ...Colors) { + if t.colSize != len(colors) { + panic("Number of header colors must be equal to number of headers.") + } + for i := 0; i < len(colors); i++ { + t.headerParams = append(t.headerParams, makeSequence(colors[i])) + } +} + +// Adding column colors (ANSI codes) +func (t *Table) SetColumnColor(colors ...Colors) { + if t.colSize != len(colors) { + panic("Number of column colors must be equal to number of headers.") + } + for i := 0; i < len(colors); i++ { + t.columnsParams = append(t.columnsParams, makeSequence(colors[i])) + } +} + +// Adding column colors (ANSI codes) +func (t *Table) SetFooterColor(colors ...Colors) { + if len(t.footers) != len(colors) { + panic("Number of footer colors must be equal to number of footer.") + } + for i := 0; i < len(colors); i++ { + t.footerParams = append(t.footerParams, makeSequence(colors[i])) + } +} + +func Color(colors ...int) []int { + return colors +} diff --git a/vendor/github.com/olekukonko/tablewriter/test.csv b/vendor/github.com/olekukonko/tablewriter/test.csv deleted file mode 100644 index 1609327e930f..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/test.csv +++ /dev/null @@ -1,4 +0,0 @@ -first_name,last_name,ssn -John,Barry,123456 -Kathy,Smith,687987 -Bob,McCornick,3979870 \ No newline at end of file diff --git a/vendor/github.com/olekukonko/tablewriter/test_info.csv b/vendor/github.com/olekukonko/tablewriter/test_info.csv deleted file mode 100644 index e4c40e983aca..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/test_info.csv +++ /dev/null @@ -1,4 +0,0 @@ -Field,Type,Null,Key,Default,Extra -user_id,smallint(5),NO,PRI,NULL,auto_increment -username,varchar(10),NO,,NULL, -password,varchar(100),NO,,NULL, \ No newline at end of file diff --git a/vendor/github.com/olekukonko/tablewriter/util.go b/vendor/github.com/olekukonko/tablewriter/util.go index 2deefbc52a0a..380e7ab35b65 100644 --- a/vendor/github.com/olekukonko/tablewriter/util.go +++ b/vendor/github.com/olekukonko/tablewriter/util.go @@ -30,17 +30,38 @@ func ConditionString(cond bool, valid, inValid string) string { return inValid } +func isNumOrSpace(r rune) bool { + return ('0' <= r && r <= '9') || r == ' ' +} + // Format Table Header // Replace _ , . and spaces func Title(name string) string { - name = strings.Replace(name, "_", " ", -1) - name = strings.Replace(name, ".", " ", -1) + origLen := len(name) + rs := []rune(name) + for i, r := range rs { + switch r { + case '_': + rs[i] = ' ' + case '.': + // ignore floating number 0.0 + if (i != 0 && !isNumOrSpace(rs[i-1])) || (i != len(rs)-1 && !isNumOrSpace(rs[i+1])) { + rs[i] = ' ' + } + } + } + name = string(rs) name = strings.TrimSpace(name) + if len(name) == 0 && origLen > 0 { + // Keep at least one character. This is important to preserve + // empty lines in multi-line headers/footers. + name = " " + } return strings.ToUpper(name) } // Pad String -// Attempts to play string in the center +// Attempts to place string in the center func Pad(s, pad string, width int) string { gap := width - DisplayWidth(s) if gap > 0 { @@ -52,7 +73,7 @@ func Pad(s, pad string, width int) string { } // Pad String Right position -// This would pace string at the left side fo the screen +// This would place string at the left side of the screen func PadRight(s, pad string, width int) string { gap := width - DisplayWidth(s) if gap > 0 { @@ -62,7 +83,7 @@ func PadRight(s, pad string, width int) string { } // Pad String Left position -// This would pace string at the right side fo the screen +// This would place string at the right side of the screen func PadLeft(s, pad string, width int) string { gap := width - DisplayWidth(s) if gap > 0 { diff --git a/vendor/github.com/olekukonko/tablewriter/wrap.go b/vendor/github.com/olekukonko/tablewriter/wrap.go index 5290fb65a279..a092ee1f75d3 100644 --- a/vendor/github.com/olekukonko/tablewriter/wrap.go +++ b/vendor/github.com/olekukonko/tablewriter/wrap.go @@ -10,7 +10,8 @@ package tablewriter import ( "math" "strings" - "unicode/utf8" + + "github.com/mattn/go-runewidth" ) var ( @@ -27,7 +28,7 @@ func WrapString(s string, lim int) ([]string, int) { var lines []string max := 0 for _, v := range words { - max = len(v) + max = runewidth.StringWidth(v) if max > lim { lim = max } @@ -55,9 +56,9 @@ func WrapWords(words []string, spc, lim, pen int) [][]string { length := make([][]int, n) for i := 0; i < n; i++ { length[i] = make([]int, n) - length[i][i] = utf8.RuneCountInString(words[i]) + length[i][i] = runewidth.StringWidth(words[i]) for j := i + 1; j < n; j++ { - length[i][j] = length[i][j-1] + spc + utf8.RuneCountInString(words[j]) + length[i][j] = length[i][j-1] + spc + runewidth.StringWidth(words[j]) } } nbrk := make([]int, n) @@ -94,10 +95,5 @@ func WrapWords(words []string, spc, lim, pen int) [][]string { // getLines decomposes a multiline string into a slice of strings. func getLines(s string) []string { - var lines []string - - for _, line := range strings.Split(s, nl) { - lines = append(lines, line) - } - return lines + return strings.Split(s, nl) } diff --git a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md b/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md index 1fc9fdf7f36a..ecfb7e3b799b 100644 --- a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md +++ b/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md @@ -10,5 +10,5 @@ Changes by Version 1.0.0 (2016-09-26) ------------------- -- This release implements OpenTracing Specification 1.0 (http://opentracing.io/spec) +- This release implements OpenTracing Specification 1.0 (https://opentracing.io/spec) diff --git a/vendor/github.com/opentracing/opentracing-go/Makefile b/vendor/github.com/opentracing/opentracing-go/Makefile index d49a5c0d44fb..62abb63f58de 100644 --- a/vendor/github.com/opentracing/opentracing-go/Makefile +++ b/vendor/github.com/opentracing/opentracing-go/Makefile @@ -1,26 +1,15 @@ -PACKAGES := . ./mocktracer/... ./ext/... - .DEFAULT_GOAL := test-and-lint -.PHONE: test-and-lint - +.PHONY: test-and-lint test-and-lint: test lint .PHONY: test test: go test -v -cover -race ./... +.PHONY: cover cover: - @rm -rf cover-all.out - $(foreach pkg, $(PACKAGES), $(MAKE) cover-pkg PKG=$(pkg) || true;) - @grep mode: cover.out > coverage.out - @cat cover-all.out >> coverage.out - go tool cover -html=coverage.out -o cover.html - @rm -rf cover.out cover-all.out coverage.out - -cover-pkg: - go test -coverprofile cover.out $(PKG) - @grep -v mode: cover.out >> cover-all.out + go test -v -coverprofile=coverage.txt -covermode=atomic -race ./... .PHONY: lint lint: @@ -29,4 +18,3 @@ lint: @# Run again with magic to exit non-zero if golint outputs anything. @! (golint ./... | read dummy) go vet ./... - diff --git a/vendor/github.com/opentracing/opentracing-go/README.md b/vendor/github.com/opentracing/opentracing-go/README.md index 007ee237c8a1..6ef1d7c9d274 100644 --- a/vendor/github.com/opentracing/opentracing-go/README.md +++ b/vendor/github.com/opentracing/opentracing-go/README.md @@ -8,8 +8,8 @@ This package is a Go platform API for OpenTracing. ## Required Reading In order to understand the Go platform API, one must first be familiar with the -[OpenTracing project](http://opentracing.io) and -[terminology](http://opentracing.io/documentation/pages/spec.html) more specifically. +[OpenTracing project](https://opentracing.io) and +[terminology](https://opentracing.io/specification/) more specifically. ## API overview for those adding instrumentation diff --git a/vendor/github.com/opentracing/opentracing-go/globaltracer.go b/vendor/github.com/opentracing/opentracing-go/globaltracer.go index 8c8e793ff23c..4f7066a925cd 100644 --- a/vendor/github.com/opentracing/opentracing-go/globaltracer.go +++ b/vendor/github.com/opentracing/opentracing-go/globaltracer.go @@ -1,7 +1,12 @@ package opentracing +type registeredTracer struct { + tracer Tracer + isRegistered bool +} + var ( - globalTracer Tracer = NoopTracer{} + globalTracer = registeredTracer{NoopTracer{}, false} ) // SetGlobalTracer sets the [singleton] opentracing.Tracer returned by @@ -11,22 +16,27 @@ var ( // Prior to calling `SetGlobalTracer`, any Spans started via the `StartSpan` // (etc) globals are noops. func SetGlobalTracer(tracer Tracer) { - globalTracer = tracer + globalTracer = registeredTracer{tracer, true} } // GlobalTracer returns the global singleton `Tracer` implementation. // Before `SetGlobalTracer()` is called, the `GlobalTracer()` is a noop // implementation that drops all data handed to it. func GlobalTracer() Tracer { - return globalTracer + return globalTracer.tracer } // StartSpan defers to `Tracer.StartSpan`. See `GlobalTracer()`. func StartSpan(operationName string, opts ...StartSpanOption) Span { - return globalTracer.StartSpan(operationName, opts...) + return globalTracer.tracer.StartSpan(operationName, opts...) } // InitGlobalTracer is deprecated. Please use SetGlobalTracer. func InitGlobalTracer(tracer Tracer) { SetGlobalTracer(tracer) } + +// IsGlobalTracerRegistered returns a `bool` to indicate if a tracer has been globally registered +func IsGlobalTracerRegistered() bool { + return globalTracer.isRegistered +} diff --git a/vendor/github.com/opentracing/opentracing-go/propagation.go b/vendor/github.com/opentracing/opentracing-go/propagation.go index 0dd466a373ef..b0c275eb05e4 100644 --- a/vendor/github.com/opentracing/opentracing-go/propagation.go +++ b/vendor/github.com/opentracing/opentracing-go/propagation.go @@ -160,7 +160,7 @@ type HTTPHeadersCarrier http.Header // Set conforms to the TextMapWriter interface. func (c HTTPHeadersCarrier) Set(key, val string) { h := http.Header(c) - h.Add(key, val) + h.Set(key, val) } // ForeachKey conforms to the TextMapReader interface. diff --git a/vendor/github.com/oschwald/maxminddb-golang/LICENSE b/vendor/github.com/oschwald/maxminddb-golang/LICENSE new file mode 100644 index 000000000000..2969677f1590 --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2015, Gregory J. Oschwald + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/oschwald/maxminddb-golang/README.md b/vendor/github.com/oschwald/maxminddb-golang/README.md new file mode 100644 index 000000000000..cdd6bd1a8594 --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/README.md @@ -0,0 +1,38 @@ +# MaxMind DB Reader for Go # + +[![Build Status](https://travis-ci.org/oschwald/maxminddb-golang.png?branch=master)](https://travis-ci.org/oschwald/maxminddb-golang) +[![Windows Build Status](https://ci.appveyor.com/api/projects/status/4j2f9oep8nnfrmov/branch/master?svg=true)](https://ci.appveyor.com/project/oschwald/maxminddb-golang/branch/master) +[![GoDoc](https://godoc.org/github.com/oschwald/maxminddb-golang?status.png)](https://godoc.org/github.com/oschwald/maxminddb-golang) + +This is a Go reader for the MaxMind DB format. Although this can be used to +read [GeoLite2](http://dev.maxmind.com/geoip/geoip2/geolite2/) and +[GeoIP2](https://www.maxmind.com/en/geoip2-databases) databases, +[geoip2](https://github.com/oschwald/geoip2-golang) provides a higher-level +API for doing so. + +This is not an official MaxMind API. + +## Installation ## + +``` +go get github.com/oschwald/maxminddb-golang +``` + +## Usage ## + +[See GoDoc](http://godoc.org/github.com/oschwald/maxminddb-golang) for +documentation and examples. + +## Examples ## + +See [GoDoc](http://godoc.org/github.com/oschwald/maxminddb-golang) or +`example_test.go` for examples. + +## Contributing ## + +Contributions welcome! Please fork the repository and open a pull request +with your changes. + +## License ## + +This is free software, licensed under the ISC License. diff --git a/vendor/github.com/oschwald/maxminddb-golang/appveyor.yml b/vendor/github.com/oschwald/maxminddb-golang/appveyor.yml new file mode 100644 index 000000000000..e2bb9dd23750 --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/appveyor.yml @@ -0,0 +1,19 @@ +version: "{build}" + +os: Windows Server 2012 R2 + +clone_folder: c:\gopath\src\github.com\oschwald\maxminddb-golang + +environment: + GOPATH: c:\gopath + +install: + - echo %PATH% + - echo %GOPATH% + - git submodule update --init --recursive + - go version + - go env + - go get -v -t ./... + +build_script: + - go test -v ./... diff --git a/vendor/github.com/oschwald/maxminddb-golang/decoder.go b/vendor/github.com/oschwald/maxminddb-golang/decoder.go new file mode 100644 index 000000000000..6e4d7e5b83f6 --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/decoder.go @@ -0,0 +1,721 @@ +package maxminddb + +import ( + "encoding/binary" + "math" + "math/big" + "reflect" + "sync" +) + +type decoder struct { + buffer []byte +} + +type dataType int + +const ( + _Extended dataType = iota + _Pointer + _String + _Float64 + _Bytes + _Uint16 + _Uint32 + _Map + _Int32 + _Uint64 + _Uint128 + _Slice + _Container + _Marker + _Bool + _Float32 +) + +const ( + // This is the value used in libmaxminddb + maximumDataStructureDepth = 512 +) + +func (d *decoder) decode(offset uint, result reflect.Value, depth int) (uint, error) { + if depth > maximumDataStructureDepth { + return 0, newInvalidDatabaseError("exceeded maximum data structure depth; database is likely corrupt") + } + typeNum, size, newOffset, err := d.decodeCtrlData(offset) + if err != nil { + return 0, err + } + + if typeNum != _Pointer && result.Kind() == reflect.Uintptr { + result.Set(reflect.ValueOf(uintptr(offset))) + return d.nextValueOffset(offset, 1) + } + return d.decodeFromType(typeNum, size, newOffset, result, depth+1) +} + +func (d *decoder) decodeCtrlData(offset uint) (dataType, uint, uint, error) { + newOffset := offset + 1 + if offset >= uint(len(d.buffer)) { + return 0, 0, 0, newOffsetError() + } + ctrlByte := d.buffer[offset] + + typeNum := dataType(ctrlByte >> 5) + if typeNum == _Extended { + if newOffset >= uint(len(d.buffer)) { + return 0, 0, 0, newOffsetError() + } + typeNum = dataType(d.buffer[newOffset] + 7) + newOffset++ + } + + var size uint + size, newOffset, err := d.sizeFromCtrlByte(ctrlByte, newOffset, typeNum) + return typeNum, size, newOffset, err +} + +func (d *decoder) sizeFromCtrlByte(ctrlByte byte, offset uint, typeNum dataType) (uint, uint, error) { + size := uint(ctrlByte & 0x1f) + if typeNum == _Extended { + return size, offset, nil + } + + var bytesToRead uint + if size < 29 { + return size, offset, nil + } + + bytesToRead = size - 28 + newOffset := offset + bytesToRead + if newOffset > uint(len(d.buffer)) { + return 0, 0, newOffsetError() + } + if size == 29 { + return 29 + uint(d.buffer[offset]), offset + 1, nil + } + + sizeBytes := d.buffer[offset:newOffset] + + switch { + case size == 30: + size = 285 + uintFromBytes(0, sizeBytes) + case size > 30: + size = uintFromBytes(0, sizeBytes) + 65821 + } + return size, newOffset, nil +} + +func (d *decoder) decodeFromType( + dtype dataType, + size uint, + offset uint, + result reflect.Value, + depth int, +) (uint, error) { + result = d.indirect(result) + + // For these types, size has a special meaning + switch dtype { + case _Bool: + return d.unmarshalBool(size, offset, result) + case _Map: + return d.unmarshalMap(size, offset, result, depth) + case _Pointer: + return d.unmarshalPointer(size, offset, result, depth) + case _Slice: + return d.unmarshalSlice(size, offset, result, depth) + } + + // For the remaining types, size is the byte size + if offset+size > uint(len(d.buffer)) { + return 0, newOffsetError() + } + switch dtype { + case _Bytes: + return d.unmarshalBytes(size, offset, result) + case _Float32: + return d.unmarshalFloat32(size, offset, result) + case _Float64: + return d.unmarshalFloat64(size, offset, result) + case _Int32: + return d.unmarshalInt32(size, offset, result) + case _String: + return d.unmarshalString(size, offset, result) + case _Uint16: + return d.unmarshalUint(size, offset, result, 16) + case _Uint32: + return d.unmarshalUint(size, offset, result, 32) + case _Uint64: + return d.unmarshalUint(size, offset, result, 64) + case _Uint128: + return d.unmarshalUint128(size, offset, result) + default: + return 0, newInvalidDatabaseError("unknown type: %d", dtype) + } +} + +func (d *decoder) unmarshalBool(size uint, offset uint, result reflect.Value) (uint, error) { + if size > 1 { + return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (bool size of %v)", size) + } + value, newOffset, err := d.decodeBool(size, offset) + if err != nil { + return 0, err + } + switch result.Kind() { + case reflect.Bool: + result.SetBool(value) + return newOffset, nil + case reflect.Interface: + if result.NumMethod() == 0 { + result.Set(reflect.ValueOf(value)) + return newOffset, nil + } + } + return newOffset, newUnmarshalTypeError(value, result.Type()) +} + +// indirect follows pointers and create values as necessary. This is +// heavily based on encoding/json as my original version had a subtle +// bug. This method should be considered to be licensed under +// https://golang.org/LICENSE +func (d *decoder) indirect(result reflect.Value) reflect.Value { + for { + // Load value from interface, but only if the result will be + // usefully addressable. + if result.Kind() == reflect.Interface && !result.IsNil() { + e := result.Elem() + if e.Kind() == reflect.Ptr && !e.IsNil() { + result = e + continue + } + } + + if result.Kind() != reflect.Ptr { + break + } + + if result.IsNil() { + result.Set(reflect.New(result.Type().Elem())) + } + result = result.Elem() + } + return result +} + +var sliceType = reflect.TypeOf([]byte{}) + +func (d *decoder) unmarshalBytes(size uint, offset uint, result reflect.Value) (uint, error) { + value, newOffset, err := d.decodeBytes(size, offset) + if err != nil { + return 0, err + } + switch result.Kind() { + case reflect.Slice: + if result.Type() == sliceType { + result.SetBytes(value) + return newOffset, nil + } + case reflect.Interface: + if result.NumMethod() == 0 { + result.Set(reflect.ValueOf(value)) + return newOffset, nil + } + } + return newOffset, newUnmarshalTypeError(value, result.Type()) +} + +func (d *decoder) unmarshalFloat32(size uint, offset uint, result reflect.Value) (uint, error) { + if size != 4 { + return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (float32 size of %v)", size) + } + value, newOffset, err := d.decodeFloat32(size, offset) + if err != nil { + return 0, err + } + + switch result.Kind() { + case reflect.Float32, reflect.Float64: + result.SetFloat(float64(value)) + return newOffset, nil + case reflect.Interface: + if result.NumMethod() == 0 { + result.Set(reflect.ValueOf(value)) + return newOffset, nil + } + } + return newOffset, newUnmarshalTypeError(value, result.Type()) +} + +func (d *decoder) unmarshalFloat64(size uint, offset uint, result reflect.Value) (uint, error) { + + if size != 8 { + return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (float 64 size of %v)", size) + } + value, newOffset, err := d.decodeFloat64(size, offset) + if err != nil { + return 0, err + } + switch result.Kind() { + case reflect.Float32, reflect.Float64: + if result.OverflowFloat(value) { + return 0, newUnmarshalTypeError(value, result.Type()) + } + result.SetFloat(value) + return newOffset, nil + case reflect.Interface: + if result.NumMethod() == 0 { + result.Set(reflect.ValueOf(value)) + return newOffset, nil + } + } + return newOffset, newUnmarshalTypeError(value, result.Type()) +} + +func (d *decoder) unmarshalInt32(size uint, offset uint, result reflect.Value) (uint, error) { + if size > 4 { + return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (int32 size of %v)", size) + } + value, newOffset, err := d.decodeInt(size, offset) + if err != nil { + return 0, err + } + + switch result.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + n := int64(value) + if !result.OverflowInt(n) { + result.SetInt(n) + return newOffset, nil + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + n := uint64(value) + if !result.OverflowUint(n) { + result.SetUint(n) + return newOffset, nil + } + case reflect.Interface: + if result.NumMethod() == 0 { + result.Set(reflect.ValueOf(value)) + return newOffset, nil + } + } + return newOffset, newUnmarshalTypeError(value, result.Type()) +} + +func (d *decoder) unmarshalMap( + size uint, + offset uint, + result reflect.Value, + depth int, +) (uint, error) { + result = d.indirect(result) + switch result.Kind() { + default: + return 0, newUnmarshalTypeError("map", result.Type()) + case reflect.Struct: + return d.decodeStruct(size, offset, result, depth) + case reflect.Map: + return d.decodeMap(size, offset, result, depth) + case reflect.Interface: + if result.NumMethod() == 0 { + rv := reflect.ValueOf(make(map[string]interface{}, size)) + newOffset, err := d.decodeMap(size, offset, rv, depth) + result.Set(rv) + return newOffset, err + } + return 0, newUnmarshalTypeError("map", result.Type()) + } +} + +func (d *decoder) unmarshalPointer(size uint, offset uint, result reflect.Value, depth int) (uint, error) { + pointer, newOffset, err := d.decodePointer(size, offset) + if err != nil { + return 0, err + } + _, err = d.decode(pointer, result, depth) + return newOffset, err +} + +func (d *decoder) unmarshalSlice( + size uint, + offset uint, + result reflect.Value, + depth int, +) (uint, error) { + switch result.Kind() { + case reflect.Slice: + return d.decodeSlice(size, offset, result, depth) + case reflect.Interface: + if result.NumMethod() == 0 { + a := []interface{}{} + rv := reflect.ValueOf(&a).Elem() + newOffset, err := d.decodeSlice(size, offset, rv, depth) + result.Set(rv) + return newOffset, err + } + } + return 0, newUnmarshalTypeError("array", result.Type()) +} + +func (d *decoder) unmarshalString(size uint, offset uint, result reflect.Value) (uint, error) { + value, newOffset, err := d.decodeString(size, offset) + + if err != nil { + return 0, err + } + switch result.Kind() { + case reflect.String: + result.SetString(value) + return newOffset, nil + case reflect.Interface: + if result.NumMethod() == 0 { + result.Set(reflect.ValueOf(value)) + return newOffset, nil + } + } + return newOffset, newUnmarshalTypeError(value, result.Type()) + +} + +func (d *decoder) unmarshalUint(size uint, offset uint, result reflect.Value, uintType uint) (uint, error) { + if size > uintType/8 { + return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (uint%v size of %v)", uintType, size) + } + + value, newOffset, err := d.decodeUint(size, offset) + if err != nil { + return 0, err + } + + switch result.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + n := int64(value) + if !result.OverflowInt(n) { + result.SetInt(n) + return newOffset, nil + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + if !result.OverflowUint(value) { + result.SetUint(value) + return newOffset, nil + } + case reflect.Interface: + if result.NumMethod() == 0 { + result.Set(reflect.ValueOf(value)) + return newOffset, nil + } + } + return newOffset, newUnmarshalTypeError(value, result.Type()) +} + +var bigIntType = reflect.TypeOf(big.Int{}) + +func (d *decoder) unmarshalUint128(size uint, offset uint, result reflect.Value) (uint, error) { + if size > 16 { + return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (uint128 size of %v)", size) + } + value, newOffset, err := d.decodeUint128(size, offset) + if err != nil { + return 0, err + } + + switch result.Kind() { + case reflect.Struct: + if result.Type() == bigIntType { + result.Set(reflect.ValueOf(*value)) + return newOffset, nil + } + case reflect.Interface: + if result.NumMethod() == 0 { + result.Set(reflect.ValueOf(value)) + return newOffset, nil + } + } + return newOffset, newUnmarshalTypeError(value, result.Type()) +} + +func (d *decoder) decodeBool(size uint, offset uint) (bool, uint, error) { + return size != 0, offset, nil +} + +func (d *decoder) decodeBytes(size uint, offset uint) ([]byte, uint, error) { + newOffset := offset + size + bytes := make([]byte, size) + copy(bytes, d.buffer[offset:newOffset]) + return bytes, newOffset, nil +} + +func (d *decoder) decodeFloat64(size uint, offset uint) (float64, uint, error) { + newOffset := offset + size + bits := binary.BigEndian.Uint64(d.buffer[offset:newOffset]) + return math.Float64frombits(bits), newOffset, nil +} + +func (d *decoder) decodeFloat32(size uint, offset uint) (float32, uint, error) { + newOffset := offset + size + bits := binary.BigEndian.Uint32(d.buffer[offset:newOffset]) + return math.Float32frombits(bits), newOffset, nil +} + +func (d *decoder) decodeInt(size uint, offset uint) (int, uint, error) { + newOffset := offset + size + var val int32 + for _, b := range d.buffer[offset:newOffset] { + val = (val << 8) | int32(b) + } + return int(val), newOffset, nil +} + +func (d *decoder) decodeMap( + size uint, + offset uint, + result reflect.Value, + depth int, +) (uint, error) { + if result.IsNil() { + result.Set(reflect.MakeMap(result.Type())) + } + + for i := uint(0); i < size; i++ { + var key []byte + var err error + key, offset, err = d.decodeKey(offset) + + if err != nil { + return 0, err + } + + value := reflect.New(result.Type().Elem()) + offset, err = d.decode(offset, value, depth) + if err != nil { + return 0, err + } + result.SetMapIndex(reflect.ValueOf(string(key)), value.Elem()) + } + return offset, nil +} + +func (d *decoder) decodePointer( + size uint, + offset uint, +) (uint, uint, error) { + pointerSize := ((size >> 3) & 0x3) + 1 + newOffset := offset + pointerSize + if newOffset > uint(len(d.buffer)) { + return 0, 0, newOffsetError() + } + pointerBytes := d.buffer[offset:newOffset] + var prefix uint + if pointerSize == 4 { + prefix = 0 + } else { + prefix = uint(size & 0x7) + } + unpacked := uintFromBytes(prefix, pointerBytes) + + var pointerValueOffset uint + switch pointerSize { + case 1: + pointerValueOffset = 0 + case 2: + pointerValueOffset = 2048 + case 3: + pointerValueOffset = 526336 + case 4: + pointerValueOffset = 0 + } + + pointer := unpacked + pointerValueOffset + + return pointer, newOffset, nil +} + +func (d *decoder) decodeSlice( + size uint, + offset uint, + result reflect.Value, + depth int, +) (uint, error) { + result.Set(reflect.MakeSlice(result.Type(), int(size), int(size))) + for i := 0; i < int(size); i++ { + var err error + offset, err = d.decode(offset, result.Index(i), depth) + if err != nil { + return 0, err + } + } + return offset, nil +} + +func (d *decoder) decodeString(size uint, offset uint) (string, uint, error) { + newOffset := offset + size + return string(d.buffer[offset:newOffset]), newOffset, nil +} + +type fieldsType struct { + namedFields map[string]int + anonymousFields []int +} + +var ( + fieldMap = map[reflect.Type]*fieldsType{} + fieldMapMu sync.RWMutex +) + +func (d *decoder) decodeStruct( + size uint, + offset uint, + result reflect.Value, + depth int, +) (uint, error) { + resultType := result.Type() + + fieldMapMu.RLock() + fields, ok := fieldMap[resultType] + fieldMapMu.RUnlock() + if !ok { + numFields := resultType.NumField() + namedFields := make(map[string]int, numFields) + var anonymous []int + for i := 0; i < numFields; i++ { + field := resultType.Field(i) + + fieldName := field.Name + if tag := field.Tag.Get("maxminddb"); tag != "" { + if tag == "-" { + continue + } + fieldName = tag + } + if field.Anonymous { + anonymous = append(anonymous, i) + continue + } + namedFields[fieldName] = i + } + fieldMapMu.Lock() + fields = &fieldsType{namedFields, anonymous} + fieldMap[resultType] = fields + fieldMapMu.Unlock() + } + + // This fills in embedded structs + for _, i := range fields.anonymousFields { + _, err := d.unmarshalMap(size, offset, result.Field(i), depth) + if err != nil { + return 0, err + } + } + + // This handles named fields + for i := uint(0); i < size; i++ { + var ( + err error + key []byte + ) + key, offset, err = d.decodeKey(offset) + if err != nil { + return 0, err + } + // The string() does not create a copy due to this compiler + // optimization: https://github.com/golang/go/issues/3512 + j, ok := fields.namedFields[string(key)] + if !ok { + offset, err = d.nextValueOffset(offset, 1) + if err != nil { + return 0, err + } + continue + } + + offset, err = d.decode(offset, result.Field(j), depth) + if err != nil { + return 0, err + } + } + return offset, nil +} + +func (d *decoder) decodeUint(size uint, offset uint) (uint64, uint, error) { + newOffset := offset + size + bytes := d.buffer[offset:newOffset] + + var val uint64 + for _, b := range bytes { + val = (val << 8) | uint64(b) + } + return val, newOffset, nil +} + +func (d *decoder) decodeUint128(size uint, offset uint) (*big.Int, uint, error) { + newOffset := offset + size + val := new(big.Int) + val.SetBytes(d.buffer[offset:newOffset]) + + return val, newOffset, nil +} + +func uintFromBytes(prefix uint, uintBytes []byte) uint { + val := prefix + for _, b := range uintBytes { + val = (val << 8) | uint(b) + } + return val +} + +// decodeKey decodes a map key into []byte slice. We use a []byte so that we +// can take advantage of https://github.com/golang/go/issues/3512 to avoid +// copying the bytes when decoding a struct. Previously, we achieved this by +// using unsafe. +func (d *decoder) decodeKey(offset uint) ([]byte, uint, error) { + typeNum, size, dataOffset, err := d.decodeCtrlData(offset) + if err != nil { + return nil, 0, err + } + if typeNum == _Pointer { + pointer, ptrOffset, err := d.decodePointer(size, dataOffset) + if err != nil { + return nil, 0, err + } + key, _, err := d.decodeKey(pointer) + return key, ptrOffset, err + } + if typeNum != _String { + return nil, 0, newInvalidDatabaseError("unexpected type when decoding string: %v", typeNum) + } + newOffset := dataOffset + size + if newOffset > uint(len(d.buffer)) { + return nil, 0, newOffsetError() + } + return d.buffer[dataOffset:newOffset], newOffset, nil +} + +// This function is used to skip ahead to the next value without decoding +// the one at the offset passed in. The size bits have different meanings for +// different data types +func (d *decoder) nextValueOffset(offset uint, numberToSkip uint) (uint, error) { + if numberToSkip == 0 { + return offset, nil + } + typeNum, size, offset, err := d.decodeCtrlData(offset) + if err != nil { + return 0, err + } + switch typeNum { + case _Pointer: + _, offset, err = d.decodePointer(size, offset) + if err != nil { + return 0, err + } + case _Map: + numberToSkip += 2 * size + case _Slice: + numberToSkip += size + case _Bool: + default: + offset += size + } + return d.nextValueOffset(offset, numberToSkip-1) +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/errors.go b/vendor/github.com/oschwald/maxminddb-golang/errors.go new file mode 100644 index 000000000000..132780019bb3 --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/errors.go @@ -0,0 +1,42 @@ +package maxminddb + +import ( + "fmt" + "reflect" +) + +// InvalidDatabaseError is returned when the database contains invalid data +// and cannot be parsed. +type InvalidDatabaseError struct { + message string +} + +func newOffsetError() InvalidDatabaseError { + return InvalidDatabaseError{"unexpected end of database"} +} + +func newInvalidDatabaseError(format string, args ...interface{}) InvalidDatabaseError { + return InvalidDatabaseError{fmt.Sprintf(format, args...)} +} + +func (e InvalidDatabaseError) Error() string { + return e.message +} + +// UnmarshalTypeError is returned when the value in the database cannot be +// assigned to the specified data type. +type UnmarshalTypeError struct { + Value string // stringified copy of the database value that caused the error + Type reflect.Type // type of the value that could not be assign to +} + +func newUnmarshalTypeError(value interface{}, rType reflect.Type) UnmarshalTypeError { + return UnmarshalTypeError{ + Value: fmt.Sprintf("%v", value), + Type: rType, + } +} + +func (e UnmarshalTypeError) Error() string { + return fmt.Sprintf("maxminddb: cannot unmarshal %s into type %s", e.Value, e.Type.String()) +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go b/vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go new file mode 100644 index 000000000000..d898d25704e9 --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go @@ -0,0 +1,15 @@ +// +build !windows,!appengine + +package maxminddb + +import ( + "golang.org/x/sys/unix" +) + +func mmap(fd int, length int) (data []byte, err error) { + return unix.Mmap(fd, 0, length, unix.PROT_READ, unix.MAP_SHARED) +} + +func munmap(b []byte) (err error) { + return unix.Munmap(b) +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go b/vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go new file mode 100644 index 000000000000..661250eca00b --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go @@ -0,0 +1,85 @@ +// +build windows,!appengine + +package maxminddb + +// Windows support largely borrowed from mmap-go. +// +// Copyright 2011 Evan Shaw. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +import ( + "errors" + "os" + "reflect" + "sync" + "unsafe" + + "golang.org/x/sys/windows" +) + +type memoryMap []byte + +// Windows +var handleLock sync.Mutex +var handleMap = map[uintptr]windows.Handle{} + +func mmap(fd int, length int) (data []byte, err error) { + h, errno := windows.CreateFileMapping(windows.Handle(fd), nil, + uint32(windows.PAGE_READONLY), 0, uint32(length), nil) + if h == 0 { + return nil, os.NewSyscallError("CreateFileMapping", errno) + } + + addr, errno := windows.MapViewOfFile(h, uint32(windows.FILE_MAP_READ), 0, + 0, uintptr(length)) + if addr == 0 { + return nil, os.NewSyscallError("MapViewOfFile", errno) + } + handleLock.Lock() + handleMap[addr] = h + handleLock.Unlock() + + m := memoryMap{} + dh := m.header() + dh.Data = addr + dh.Len = length + dh.Cap = dh.Len + + return m, nil +} + +func (m *memoryMap) header() *reflect.SliceHeader { + return (*reflect.SliceHeader)(unsafe.Pointer(m)) +} + +func flush(addr, len uintptr) error { + errno := windows.FlushViewOfFile(addr, len) + return os.NewSyscallError("FlushViewOfFile", errno) +} + +func munmap(b []byte) (err error) { + m := memoryMap(b) + dh := m.header() + + addr := dh.Data + length := uintptr(dh.Len) + + flush(addr, length) + err = windows.UnmapViewOfFile(addr) + if err != nil { + return err + } + + handleLock.Lock() + defer handleLock.Unlock() + handle, ok := handleMap[addr] + if !ok { + // should be impossible; we would've errored above + return errors.New("unknown base address") + } + delete(handleMap, addr) + + e := windows.CloseHandle(windows.Handle(handle)) + return os.NewSyscallError("CloseHandle", e) +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader.go b/vendor/github.com/oschwald/maxminddb-golang/reader.go new file mode 100644 index 000000000000..97b96070fc62 --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/reader.go @@ -0,0 +1,259 @@ +package maxminddb + +import ( + "bytes" + "errors" + "fmt" + "net" + "reflect" +) + +const ( + // NotFound is returned by LookupOffset when a matched root record offset + // cannot be found. + NotFound = ^uintptr(0) + + dataSectionSeparatorSize = 16 +) + +var metadataStartMarker = []byte("\xAB\xCD\xEFMaxMind.com") + +// Reader holds the data corresponding to the MaxMind DB file. Its only public +// field is Metadata, which contains the metadata from the MaxMind DB file. +type Reader struct { + hasMappedFile bool + buffer []byte + decoder decoder + Metadata Metadata + ipv4Start uint +} + +// Metadata holds the metadata decoded from the MaxMind DB file. In particular +// in has the format version, the build time as Unix epoch time, the database +// type and description, the IP version supported, and a slice of the natural +// languages included. +type Metadata struct { + BinaryFormatMajorVersion uint `maxminddb:"binary_format_major_version"` + BinaryFormatMinorVersion uint `maxminddb:"binary_format_minor_version"` + BuildEpoch uint `maxminddb:"build_epoch"` + DatabaseType string `maxminddb:"database_type"` + Description map[string]string `maxminddb:"description"` + IPVersion uint `maxminddb:"ip_version"` + Languages []string `maxminddb:"languages"` + NodeCount uint `maxminddb:"node_count"` + RecordSize uint `maxminddb:"record_size"` +} + +// FromBytes takes a byte slice corresponding to a MaxMind DB file and returns +// a Reader structure or an error. +func FromBytes(buffer []byte) (*Reader, error) { + metadataStart := bytes.LastIndex(buffer, metadataStartMarker) + + if metadataStart == -1 { + return nil, newInvalidDatabaseError("error opening database: invalid MaxMind DB file") + } + + metadataStart += len(metadataStartMarker) + metadataDecoder := decoder{buffer[metadataStart:]} + + var metadata Metadata + + rvMetdata := reflect.ValueOf(&metadata) + _, err := metadataDecoder.decode(0, rvMetdata, 0) + if err != nil { + return nil, err + } + + searchTreeSize := metadata.NodeCount * metadata.RecordSize / 4 + dataSectionStart := searchTreeSize + dataSectionSeparatorSize + dataSectionEnd := uint(metadataStart - len(metadataStartMarker)) + if dataSectionStart > dataSectionEnd { + return nil, newInvalidDatabaseError("the MaxMind DB contains invalid metadata") + } + d := decoder{ + buffer[searchTreeSize+dataSectionSeparatorSize : metadataStart-len(metadataStartMarker)], + } + + reader := &Reader{ + buffer: buffer, + decoder: d, + Metadata: metadata, + ipv4Start: 0, + } + + reader.ipv4Start, err = reader.startNode() + + return reader, err +} + +func (r *Reader) startNode() (uint, error) { + if r.Metadata.IPVersion != 6 { + return 0, nil + } + + nodeCount := r.Metadata.NodeCount + + node := uint(0) + var err error + for i := 0; i < 96 && node < nodeCount; i++ { + node, err = r.readNode(node, 0) + if err != nil { + return 0, err + } + } + return node, err +} + +// Lookup takes an IP address as a net.IP structure and a pointer to the +// result value to Decode into. +func (r *Reader) Lookup(ipAddress net.IP, result interface{}) error { + if r.buffer == nil { + return errors.New("cannot call Lookup on a closed database") + } + pointer, err := r.lookupPointer(ipAddress) + if pointer == 0 || err != nil { + return err + } + return r.retrieveData(pointer, result) +} + +// LookupOffset maps an argument net.IP to a corresponding record offset in the +// database. NotFound is returned if no such record is found, and a record may +// otherwise be extracted by passing the returned offset to Decode. LookupOffset +// is an advanced API, which exists to provide clients with a means to cache +// previously-decoded records. +func (r *Reader) LookupOffset(ipAddress net.IP) (uintptr, error) { + if r.buffer == nil { + return 0, errors.New("cannot call LookupOffset on a closed database") + } + pointer, err := r.lookupPointer(ipAddress) + if pointer == 0 || err != nil { + return NotFound, err + } + return r.resolveDataPointer(pointer) +} + +// Decode the record at |offset| into |result|. The result value pointed to +// must be a data value that corresponds to a record in the database. This may +// include a struct representation of the data, a map capable of holding the +// data or an empty interface{} value. +// +// If result is a pointer to a struct, the struct need not include a field +// for every value that may be in the database. If a field is not present in +// the structure, the decoder will not decode that field, reducing the time +// required to decode the record. +// +// As a special case, a struct field of type uintptr will be used to capture +// the offset of the value. Decode may later be used to extract the stored +// value from the offset. MaxMind DBs are highly normalized: for example in +// the City database, all records of the same country will reference a +// single representative record for that country. This uintptr behavior allows +// clients to leverage this normalization in their own sub-record caching. +func (r *Reader) Decode(offset uintptr, result interface{}) error { + if r.buffer == nil { + return errors.New("cannot call Decode on a closed database") + } + return r.decode(offset, result) +} + +func (r *Reader) decode(offset uintptr, result interface{}) error { + rv := reflect.ValueOf(result) + if rv.Kind() != reflect.Ptr || rv.IsNil() { + return errors.New("result param must be a pointer") + } + + _, err := r.decoder.decode(uint(offset), reflect.ValueOf(result), 0) + return err +} + +func (r *Reader) lookupPointer(ipAddress net.IP) (uint, error) { + if ipAddress == nil { + return 0, errors.New("ipAddress passed to Lookup cannot be nil") + } + + ipV4Address := ipAddress.To4() + if ipV4Address != nil { + ipAddress = ipV4Address + } + if len(ipAddress) == 16 && r.Metadata.IPVersion == 4 { + return 0, fmt.Errorf("error looking up '%s': you attempted to look up an IPv6 address in an IPv4-only database", ipAddress.String()) + } + + return r.findAddressInTree(ipAddress) +} + +func (r *Reader) findAddressInTree(ipAddress net.IP) (uint, error) { + + bitCount := uint(len(ipAddress) * 8) + + var node uint + if bitCount == 32 { + node = r.ipv4Start + } + + nodeCount := r.Metadata.NodeCount + + for i := uint(0); i < bitCount && node < nodeCount; i++ { + bit := uint(1) & (uint(ipAddress[i>>3]) >> (7 - (i % 8))) + + var err error + node, err = r.readNode(node, bit) + if err != nil { + return 0, err + } + } + if node == nodeCount { + // Record is empty + return 0, nil + } else if node > nodeCount { + return node, nil + } + + return 0, newInvalidDatabaseError("invalid node in search tree") +} + +func (r *Reader) readNode(nodeNumber uint, index uint) (uint, error) { + RecordSize := r.Metadata.RecordSize + + baseOffset := nodeNumber * RecordSize / 4 + + var nodeBytes []byte + var prefix uint + switch RecordSize { + case 24: + offset := baseOffset + index*3 + nodeBytes = r.buffer[offset : offset+3] + case 28: + prefix = uint(r.buffer[baseOffset+3]) + if index != 0 { + prefix &= 0x0F + } else { + prefix = (0xF0 & prefix) >> 4 + } + offset := baseOffset + index*4 + nodeBytes = r.buffer[offset : offset+3] + case 32: + offset := baseOffset + index*4 + nodeBytes = r.buffer[offset : offset+4] + default: + return 0, newInvalidDatabaseError("unknown record size: %d", RecordSize) + } + return uintFromBytes(prefix, nodeBytes), nil +} + +func (r *Reader) retrieveData(pointer uint, result interface{}) error { + offset, err := r.resolveDataPointer(pointer) + if err != nil { + return err + } + return r.decode(offset, result) +} + +func (r *Reader) resolveDataPointer(pointer uint) (uintptr, error) { + var resolved = uintptr(pointer - r.Metadata.NodeCount - dataSectionSeparatorSize) + + if resolved > uintptr(len(r.buffer)) { + return 0, newInvalidDatabaseError("the MaxMind DB file's search tree is corrupt") + } + return resolved, nil +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go b/vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go new file mode 100644 index 000000000000..d200f9fe05eb --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go @@ -0,0 +1,28 @@ +// +build appengine + +package maxminddb + +import "io/ioutil" + +// Open takes a string path to a MaxMind DB file and returns a Reader +// structure or an error. The database file is opened using a memory map, +// except on Google App Engine where mmap is not supported; there the database +// is loaded into memory. Use the Close method on the Reader object to return +// the resources to the system. +func Open(file string) (*Reader, error) { + bytes, err := ioutil.ReadFile(file) + if err != nil { + return nil, err + } + + return FromBytes(bytes) +} + +// Close unmaps the database file from virtual memory and returns the +// resources to the system. If called on a Reader opened using FromBytes +// or Open on Google App Engine, this method sets the underlying buffer +// to nil, returning the resources to the system. +func (r *Reader) Close() error { + r.buffer = nil + return nil +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader_other.go b/vendor/github.com/oschwald/maxminddb-golang/reader_other.go new file mode 100644 index 000000000000..2a89fa676e8a --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/reader_other.go @@ -0,0 +1,63 @@ +// +build !appengine + +package maxminddb + +import ( + "os" + "runtime" +) + +// Open takes a string path to a MaxMind DB file and returns a Reader +// structure or an error. The database file is opened using a memory map, +// except on Google App Engine where mmap is not supported; there the database +// is loaded into memory. Use the Close method on the Reader object to return +// the resources to the system. +func Open(file string) (*Reader, error) { + mapFile, err := os.Open(file) + if err != nil { + return nil, err + } + defer func() { + if rerr := mapFile.Close(); rerr != nil { + err = rerr + } + }() + + stats, err := mapFile.Stat() + if err != nil { + return nil, err + } + + fileSize := int(stats.Size()) + mmap, err := mmap(int(mapFile.Fd()), fileSize) + if err != nil { + return nil, err + } + + reader, err := FromBytes(mmap) + if err != nil { + if err2 := munmap(mmap); err2 != nil { + // failing to unmap the file is probably the more severe error + return nil, err2 + } + return nil, err + } + + reader.hasMappedFile = true + runtime.SetFinalizer(reader, (*Reader).Close) + return reader, err +} + +// Close unmaps the database file from virtual memory and returns the +// resources to the system. If called on a Reader opened using FromBytes +// or Open on Google App Engine, this method does nothing. +func (r *Reader) Close() error { + var err error + if r.hasMappedFile { + runtime.SetFinalizer(r, nil) + r.hasMappedFile = false + err = munmap(r.buffer) + } + r.buffer = nil + return err +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/traverse.go b/vendor/github.com/oschwald/maxminddb-golang/traverse.go new file mode 100644 index 000000000000..f9b443c0dffc --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/traverse.go @@ -0,0 +1,108 @@ +package maxminddb + +import "net" + +// Internal structure used to keep track of nodes we still need to visit. +type netNode struct { + ip net.IP + bit uint + pointer uint +} + +// Networks represents a set of subnets that we are iterating over. +type Networks struct { + reader *Reader + nodes []netNode // Nodes we still have to visit. + lastNode netNode + err error +} + +// Networks returns an iterator that can be used to traverse all networks in +// the database. +// +// Please note that a MaxMind DB may map IPv4 networks into several locations +// in in an IPv6 database. This iterator will iterate over all of these +// locations separately. +func (r *Reader) Networks() *Networks { + s := 4 + if r.Metadata.IPVersion == 6 { + s = 16 + } + return &Networks{ + reader: r, + nodes: []netNode{ + { + ip: make(net.IP, s), + }, + }, + } +} + +// Next prepares the next network for reading with the Network method. It +// returns true if there is another network to be processed and false if there +// are no more networks or if there is an error. +func (n *Networks) Next() bool { + for len(n.nodes) > 0 { + node := n.nodes[len(n.nodes)-1] + n.nodes = n.nodes[:len(n.nodes)-1] + + for { + if node.pointer < n.reader.Metadata.NodeCount { + ipRight := make(net.IP, len(node.ip)) + copy(ipRight, node.ip) + if len(ipRight) <= int(node.bit>>3) { + n.err = newInvalidDatabaseError( + "invalid search tree at %v/%v", ipRight, node.bit) + return false + } + ipRight[node.bit>>3] |= 1 << (7 - (node.bit % 8)) + + rightPointer, err := n.reader.readNode(node.pointer, 1) + if err != nil { + n.err = err + return false + } + + node.bit++ + n.nodes = append(n.nodes, netNode{ + pointer: rightPointer, + ip: ipRight, + bit: node.bit, + }) + + node.pointer, err = n.reader.readNode(node.pointer, 0) + if err != nil { + n.err = err + return false + } + + } else if node.pointer > n.reader.Metadata.NodeCount { + n.lastNode = node + return true + } else { + break + } + } + } + + return false +} + +// Network returns the current network or an error if there is a problem +// decoding the data for the network. It takes a pointer to a result value to +// decode the network's data into. +func (n *Networks) Network(result interface{}) (*net.IPNet, error) { + if err := n.reader.retrieveData(n.lastNode.pointer, result); err != nil { + return nil, err + } + + return &net.IPNet{ + IP: n.lastNode.ip, + Mask: net.CIDRMask(int(n.lastNode.bit), len(n.lastNode.ip)*8), + }, nil +} + +// Err returns an error, if any, that was encountered during iteration. +func (n *Networks) Err() error { + return n.err +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/verifier.go b/vendor/github.com/oschwald/maxminddb-golang/verifier.go new file mode 100644 index 000000000000..ace9d35c400a --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/verifier.go @@ -0,0 +1,185 @@ +package maxminddb + +import "reflect" + +type verifier struct { + reader *Reader +} + +// Verify checks that the database is valid. It validates the search tree, +// the data section, and the metadata section. This verifier is stricter than +// the specification and may return errors on databases that are readable. +func (r *Reader) Verify() error { + v := verifier{r} + if err := v.verifyMetadata(); err != nil { + return err + } + + return v.verifyDatabase() +} + +func (v *verifier) verifyMetadata() error { + metadata := v.reader.Metadata + + if metadata.BinaryFormatMajorVersion != 2 { + return testError( + "binary_format_major_version", + 2, + metadata.BinaryFormatMajorVersion, + ) + } + + if metadata.BinaryFormatMinorVersion != 0 { + return testError( + "binary_format_minor_version", + 0, + metadata.BinaryFormatMinorVersion, + ) + } + + if metadata.DatabaseType == "" { + return testError( + "database_type", + "non-empty string", + metadata.DatabaseType, + ) + } + + if len(metadata.Description) == 0 { + return testError( + "description", + "non-empty slice", + metadata.Description, + ) + } + + if metadata.IPVersion != 4 && metadata.IPVersion != 6 { + return testError( + "ip_version", + "4 or 6", + metadata.IPVersion, + ) + } + + if metadata.RecordSize != 24 && + metadata.RecordSize != 28 && + metadata.RecordSize != 32 { + return testError( + "record_size", + "24, 28, or 32", + metadata.RecordSize, + ) + } + + if metadata.NodeCount == 0 { + return testError( + "node_count", + "positive integer", + metadata.NodeCount, + ) + } + return nil +} + +func (v *verifier) verifyDatabase() error { + offsets, err := v.verifySearchTree() + if err != nil { + return err + } + + if err := v.verifyDataSectionSeparator(); err != nil { + return err + } + + return v.verifyDataSection(offsets) +} + +func (v *verifier) verifySearchTree() (map[uint]bool, error) { + offsets := make(map[uint]bool) + + it := v.reader.Networks() + for it.Next() { + offset, err := v.reader.resolveDataPointer(it.lastNode.pointer) + if err != nil { + return nil, err + } + offsets[uint(offset)] = true + } + if err := it.Err(); err != nil { + return nil, err + } + return offsets, nil +} + +func (v *verifier) verifyDataSectionSeparator() error { + separatorStart := v.reader.Metadata.NodeCount * v.reader.Metadata.RecordSize / 4 + + separator := v.reader.buffer[separatorStart : separatorStart+dataSectionSeparatorSize] + + for _, b := range separator { + if b != 0 { + return newInvalidDatabaseError("unexpected byte in data separator: %v", separator) + } + } + return nil +} + +func (v *verifier) verifyDataSection(offsets map[uint]bool) error { + pointerCount := len(offsets) + + decoder := v.reader.decoder + + var offset uint + bufferLen := uint(len(decoder.buffer)) + for offset < bufferLen { + var data interface{} + rv := reflect.ValueOf(&data) + newOffset, err := decoder.decode(offset, rv, 0) + if err != nil { + return newInvalidDatabaseError("received decoding error (%v) at offset of %v", err, offset) + } + if newOffset <= offset { + return newInvalidDatabaseError("data section offset unexpectedly went from %v to %v", offset, newOffset) + } + + pointer := offset + + if _, ok := offsets[pointer]; ok { + delete(offsets, pointer) + } else { + return newInvalidDatabaseError("found data (%v) at %v that the search tree does not point to", data, pointer) + } + + offset = newOffset + } + + if offset != bufferLen { + return newInvalidDatabaseError( + "unexpected data at the end of the data section (last offset: %v, end: %v)", + offset, + bufferLen, + ) + } + + if len(offsets) != 0 { + return newInvalidDatabaseError( + "found %v pointers (of %v) in the search tree that we did not see in the data section", + len(offsets), + pointerCount, + ) + } + return nil +} + +func testError( + field string, + expected interface{}, + actual interface{}, +) error { + return newInvalidDatabaseError( + "%v - Expected: %v Actual: %v", + field, + expected, + actual, + ) +} diff --git a/vendor/github.com/peterh/liner/fallbackinput.go b/vendor/github.com/peterh/liner/fallbackinput.go index d9eb79d9e055..043fb33218f1 100644 --- a/vendor/github.com/peterh/liner/fallbackinput.go +++ b/vendor/github.com/peterh/liner/fallbackinput.go @@ -55,3 +55,5 @@ func (n noopMode) ApplyMode() error { func TerminalMode() (ModeApplier, error) { return noopMode{}, nil } + +const cursorColumn = true diff --git a/vendor/github.com/peterh/liner/go.mod b/vendor/github.com/peterh/liner/go.mod new file mode 100644 index 000000000000..6804de36f553 --- /dev/null +++ b/vendor/github.com/peterh/liner/go.mod @@ -0,0 +1,3 @@ +module github.com/peterh/liner + +require github.com/mattn/go-runewidth v0.0.3 diff --git a/vendor/github.com/peterh/liner/go.sum b/vendor/github.com/peterh/liner/go.sum new file mode 100644 index 000000000000..1c1891604c8a --- /dev/null +++ b/vendor/github.com/peterh/liner/go.sum @@ -0,0 +1,2 @@ +github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= diff --git a/vendor/github.com/peterh/liner/input.go b/vendor/github.com/peterh/liner/input.go index 95dd5d14357c..e04e7722535a 100644 --- a/vendor/github.com/peterh/liner/input.go +++ b/vendor/github.com/peterh/liner/input.go @@ -264,9 +264,9 @@ func (s *State) readNext() (interface{}, error) { return pageUp, nil case 6: return pageDown, nil - case 7: + case 1, 7: return home, nil - case 8: + case 4, 8: return end, nil case 15: return f5, nil @@ -328,6 +328,9 @@ func (s *State) readNext() (interface{}, error) { case 'b': s.pending = s.pending[:0] // escape code complete return altB, nil + case 'd': + s.pending = s.pending[:0] // escape code complete + return altD, nil case 'f': s.pending = s.pending[:0] // escape code complete return altF, nil diff --git a/vendor/github.com/peterh/liner/input_windows.go b/vendor/github.com/peterh/liner/input_windows.go index a48eb0f1d2cd..36e95161adf5 100644 --- a/vendor/github.com/peterh/liner/input_windows.go +++ b/vendor/github.com/peterh/liner/input_windows.go @@ -4,6 +4,7 @@ import ( "bufio" "os" "syscall" + "unicode/utf16" "unsafe" ) @@ -103,7 +104,7 @@ type key_event_record struct { RepeatCount uint16 VirtualKeyCode uint16 VirtualScanCode uint16 - Char int16 + Char uint16 ControlKeyState uint32 } @@ -111,6 +112,7 @@ type key_event_record struct { // what golint suggests) const ( vk_tab = 0x09 + vk_menu = 0x12 // ALT key vk_prior = 0x21 vk_next = 0x22 vk_end = 0x23 @@ -134,6 +136,7 @@ const ( vk_f11 = 0x7a vk_f12 = 0x7b bKey = 0x42 + dKey = 0x44 fKey = 0x46 yKey = 0x59 ) @@ -174,6 +177,8 @@ func (s *State) readNext() (interface{}, error) { var rv uint32 prv := uintptr(unsafe.Pointer(&rv)) + var surrogate uint16 + for { ok, _, err := procReadConsoleInput.Call(uintptr(s.handle), pbuf, 1, prv) @@ -184,9 +189,6 @@ func (s *State) readNext() (interface{}, error) { if input.eventType == window_buffer_size_event { xy := (*coord)(unsafe.Pointer(&input.blob[0])) s.columns = int(xy.x) - if s.columns > 1 { - s.columns-- - } return winch, nil } if input.eventType != key_event { @@ -194,6 +196,17 @@ func (s *State) readNext() (interface{}, error) { } ke := (*key_event_record)(unsafe.Pointer(&input.blob[0])) if ke.KeyDown == 0 { + if ke.VirtualKeyCode == vk_menu && ke.Char > 0 { + // paste of unicode (eg. via ALT-numpad) + if surrogate > 0 { + return utf16.DecodeRune(rune(surrogate), rune(ke.Char)), nil + } else if utf16.IsSurrogate(rune(ke.Char)) { + surrogate = ke.Char + continue + } else { + return rune(ke.Char), nil + } + } continue } @@ -202,6 +215,9 @@ func (s *State) readNext() (interface{}, error) { } else if ke.VirtualKeyCode == bKey && (ke.ControlKeyState&modKeys == leftAltPressed || ke.ControlKeyState&modKeys == rightAltPressed) { s.key = altB + } else if ke.VirtualKeyCode == dKey && (ke.ControlKeyState&modKeys == leftAltPressed || + ke.ControlKeyState&modKeys == rightAltPressed) { + s.key = altD } else if ke.VirtualKeyCode == fKey && (ke.ControlKeyState&modKeys == leftAltPressed || ke.ControlKeyState&modKeys == rightAltPressed) { s.key = altF @@ -209,7 +225,14 @@ func (s *State) readNext() (interface{}, error) { ke.ControlKeyState&modKeys == rightAltPressed) { s.key = altY } else if ke.Char > 0 { - s.key = rune(ke.Char) + if surrogate > 0 { + s.key = utf16.DecodeRune(rune(surrogate), rune(ke.Char)) + } else if utf16.IsSurrogate(rune(ke.Char)) { + surrogate = ke.Char + continue + } else { + s.key = rune(ke.Char) + } } else { switch ke.VirtualKeyCode { case vk_prior: @@ -337,3 +360,5 @@ func TerminalMode() (ModeApplier, error) { } return mode, err } + +const cursorColumn = true diff --git a/vendor/github.com/peterh/liner/line.go b/vendor/github.com/peterh/liner/line.go index d61f0696b0e8..076a195c4379 100644 --- a/vendor/github.com/peterh/liner/line.go +++ b/vendor/github.com/peterh/liner/line.go @@ -40,6 +40,7 @@ const ( f11 f12 altB + altD altF altY shiftTab @@ -112,6 +113,10 @@ func (s *State) refreshSingleLine(prompt []rune, buf []rune, pos int) error { pLen := countGlyphs(prompt) bLen := countGlyphs(buf) + // on some OS / terminals extra column is needed to place the cursor char + if cursorColumn { + bLen++ + } pos = countGlyphs(buf[:pos]) if pLen+bLen < s.columns { _, err = fmt.Print(string(buf)) @@ -162,6 +167,14 @@ func (s *State) refreshSingleLine(prompt []rune, buf []rune, pos int) error { func (s *State) refreshMultiLine(prompt []rune, buf []rune, pos int) error { promptColumns := countMultiLineGlyphs(prompt, s.columns, 0) totalColumns := countMultiLineGlyphs(buf, s.columns, promptColumns) + // on some OS / terminals extra column is needed to place the cursor char + // if cursorColumn { + // totalColumns++ + // } + + // it looks like Multiline mode always assume that a cursor need an extra column, + // and always emit a newline if we are at the screen end, so no worarounds needed there + totalRows := (totalColumns + s.columns - 1) / s.columns maxRows := s.maxRows if totalRows > s.maxRows { @@ -583,7 +596,7 @@ func (s *State) Prompt(prompt string) (string, error) { // PromptWithSuggestion displays prompt and an editable text with cursor at // given position. The cursor will be set to the end of the line if given position -// is negative or greater than length of text. Returns a line of user input, not +// is negative or greater than length of text (in runes). Returns a line of user input, not // including a trailing newline character. An io.EOF error is returned if the user // signals end-of-file by pressing Ctrl-D. func (s *State) PromptWithSuggestion(prompt string, text string, pos int) (string, error) { @@ -618,8 +631,8 @@ func (s *State) PromptWithSuggestion(prompt string, text string, pos int) (strin defer s.stopPrompt() - if pos < 0 || len(text) < pos { - pos = len(text) + if pos < 0 || len(line) < pos { + pos = len(line) } if len(line) > 0 { err := s.refresh(p, line, pos) @@ -969,6 +982,35 @@ mainLoop: pos = 0 case end: // End of line pos = len(line) + case altD: // Delete next word + if pos == len(line) { + fmt.Print(beep) + break + } + // Remove whitespace to the right + var buf []rune // Store the deleted chars in a buffer + for { + if pos == len(line) || !unicode.IsSpace(line[pos]) { + break + } + buf = append(buf, line[pos]) + line = append(line[:pos], line[pos+1:]...) + } + // Remove non-whitespace to the right + for { + if pos == len(line) || unicode.IsSpace(line[pos]) { + break + } + buf = append(buf, line[pos]) + line = append(line[:pos], line[pos+1:]...) + } + // Save the result on the killRing + if killAction > 0 { + s.addToKillRing(buf, 2) // Add in prepend mode + } else { + s.addToKillRing(buf, 0) // Add in normal mode + } + killAction = 2 // Mark that there was some killing case winch: // Window change if s.multiLineMode { if s.maxRows-s.cursorRows > 0 { diff --git a/vendor/github.com/peterh/liner/output.go b/vendor/github.com/peterh/liner/output.go index 6d83d4ebfd7c..db0641cfe082 100644 --- a/vendor/github.com/peterh/liner/output.go +++ b/vendor/github.com/peterh/liner/output.go @@ -56,9 +56,6 @@ func (s *State) getColumns() bool { return false } s.columns = int(ws.col) - if cursorColumn && s.columns > 1 { - s.columns-- - } return true } diff --git a/vendor/github.com/peterh/liner/output_windows.go b/vendor/github.com/peterh/liner/output_windows.go index 63c9c5d75713..45cd978c96d3 100644 --- a/vendor/github.com/peterh/liner/output_windows.go +++ b/vendor/github.com/peterh/liner/output_windows.go @@ -69,8 +69,4 @@ func (s *State) getColumns() { var sbi consoleScreenBufferInfo procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) s.columns = int(sbi.dwSize.x) - if s.columns > 1 { - // Windows 10 needs a spare column for the cursor - s.columns-- - } } diff --git a/vendor/github.com/peterh/liner/width.go b/vendor/github.com/peterh/liner/width.go index 42e89998341b..0395f3a8be67 100644 --- a/vendor/github.com/peterh/liner/width.go +++ b/vendor/github.com/peterh/liner/width.go @@ -1,6 +1,10 @@ package liner -import "unicode" +import ( + "unicode" + + "github.com/mattn/go-runewidth" +) // These character classes are mostly zero width (when combined). // A few might not be, depending on the user's font. Fixing this @@ -13,13 +17,6 @@ var zeroWidth = []*unicode.RangeTable{ unicode.Cf, } -var doubleWidth = []*unicode.RangeTable{ - unicode.Han, - unicode.Hangul, - unicode.Hiragana, - unicode.Katakana, -} - // countGlyphs considers zero-width characters to be zero glyphs wide, // and members of Chinese, Japanese, and Korean scripts to be 2 glyphs wide. func countGlyphs(s []rune) int { @@ -31,13 +28,7 @@ func countGlyphs(s []rune) int { continue } - switch { - case unicode.IsOneOf(zeroWidth, r): - case unicode.IsOneOf(doubleWidth, r): - n += 2 - default: - n++ - } + n += runewidth.RuneWidth(r) } return n } @@ -49,17 +40,17 @@ func countMultiLineGlyphs(s []rune, columns int, start int) int { n++ continue } - switch { - case unicode.IsOneOf(zeroWidth, r): - case unicode.IsOneOf(doubleWidth, r): + switch runewidth.RuneWidth(r) { + case 0: + case 1: + n++ + case 2: n += 2 // no room for a 2-glyphs-wide char in the ending // so skip a column and display it at the beginning if n%columns == 1 { n++ } - default: - n++ } } return n diff --git a/vendor/github.com/prometheus/prometheus/NOTICE b/vendor/github.com/prometheus/prometheus/NOTICE deleted file mode 100644 index 47de2415e1b6..000000000000 --- a/vendor/github.com/prometheus/prometheus/NOTICE +++ /dev/null @@ -1,87 +0,0 @@ -The Prometheus systems and service monitoring server -Copyright 2012-2015 The Prometheus Authors - -This product includes software developed at -SoundCloud Ltd. (http://soundcloud.com/). - - -The following components are included in this product: - -Bootstrap -http://getbootstrap.com -Copyright 2011-2014 Twitter, Inc. -Licensed under the MIT License - -bootstrap3-typeahead.js -https://github.com/bassjobsen/Bootstrap-3-Typeahead -Original written by @mdo and @fat -Copyright 2014 Bass Jobsen @bassjobsen -Licensed under the Apache License, Version 2.0 - -fuzzy -https://github.com/mattyork/fuzzy -Original written by @mattyork -Copyright 2012 Matt York -Licensed under the MIT License - -bootstrap-datetimepicker.js -https://github.com/Eonasdan/bootstrap-datetimepicker -Copyright 2015 Jonathan Peterson (@Eonasdan) -Licensed under the MIT License - -moment.js -https://github.com/moment/moment/ -Copyright JS Foundation and other contributors -Licensed under the MIT License - -Rickshaw -https://github.com/shutterstock/rickshaw -Copyright 2011-2014 by Shutterstock Images, LLC -See https://github.com/shutterstock/rickshaw/blob/master/LICENSE for license details - -mustache.js -https://github.com/janl/mustache.js -Copyright 2009 Chris Wanstrath (Ruby) -Copyright 2010-2014 Jan Lehnardt (JavaScript) -Copyright 2010-2015 The mustache.js community -Licensed under the MIT License - -jQuery -https://jquery.org -Copyright jQuery Foundation and other contributors -Licensed under the MIT License - -Go support for Protocol Buffers - Google's data interchange format -http://github.com/golang/protobuf/ -Copyright 2010 The Go Authors -See source code for license details. - -Go support for leveled logs, analogous to -https://code.google.com/p/google-glog/ -Copyright 2013 Google Inc. -Licensed under the Apache License, Version 2.0 - -Support for streaming Protocol Buffer messages for the Go language (golang). -https://github.com/matttproud/golang_protobuf_extensions -Copyright 2013 Matt T. Proud -Licensed under the Apache License, Version 2.0 - -DNS library in Go -http://miek.nl/posts/2014/Aug/16/go-dns-package/ -Copyright 2009 The Go Authors, 2011 Miek Gieben -See https://github.com/miekg/dns/blob/master/LICENSE for license details. - -LevelDB key/value database in Go -https://github.com/syndtr/goleveldb -Copyright 2012 Suryandaru Triandana -See https://github.com/syndtr/goleveldb/blob/master/LICENSE for license details. - -gosnappy - a fork of code.google.com/p/snappy-go -https://github.com/syndtr/gosnappy -Copyright 2011 The Snappy-Go Authors -See https://github.com/syndtr/gosnappy/blob/master/LICENSE for license details. - -go-zookeeper - Native ZooKeeper client for Go -https://github.com/samuel/go-zookeeper -Copyright (c) 2013, Samuel Stauffer -See https://github.com/samuel/go-zookeeper/blob/master/LICENSE for license details. diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock.go b/vendor/github.com/prometheus/prometheus/util/flock/flock.go deleted file mode 100644 index 5dc22a2fae8f..000000000000 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2016 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package flock provides portable file locking. It is essentially ripped out -// from the code of github.com/syndtr/goleveldb. Strange enough that the -// standard library does not provide this functionality. Once this package has -// proven to work as expected, we should probably turn it into a separate -// general purpose package for humanity. -package flock - -import ( - "os" - "path/filepath" -) - -// Releaser provides the Release method to release a file lock. -type Releaser interface { - Release() error -} - -// New locks the file with the provided name. If the file does not exist, it is -// created. The returned Releaser is used to release the lock. existed is true -// if the file to lock already existed. A non-nil error is returned if the -// locking has failed. Neither this function nor the returned Releaser is -// goroutine-safe. -func New(fileName string) (r Releaser, existed bool, err error) { - if err = os.MkdirAll(filepath.Dir(fileName), 0755); err != nil { - return - } - - _, err = os.Stat(fileName) - existed = err == nil - - r, err = newLock(fileName) - return -} diff --git a/vendor/github.com/prometheus/prometheus/LICENSE b/vendor/github.com/prometheus/tsdb/LICENSE similarity index 100% rename from vendor/github.com/prometheus/prometheus/LICENSE rename to vendor/github.com/prometheus/tsdb/LICENSE diff --git a/vendor/github.com/prometheus/tsdb/fileutil/dir_unix.go b/vendor/github.com/prometheus/tsdb/fileutil/dir_unix.go new file mode 100644 index 000000000000..58a77dfc1a99 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/dir_unix.go @@ -0,0 +1,22 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package fileutil + +import "os" + +// OpenDir opens a directory for syncing. +func OpenDir(path string) (*os.File, error) { return os.Open(path) } diff --git a/vendor/github.com/prometheus/tsdb/fileutil/dir_windows.go b/vendor/github.com/prometheus/tsdb/fileutil/dir_windows.go new file mode 100644 index 000000000000..c123395c0040 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/dir_windows.go @@ -0,0 +1,46 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build windows + +package fileutil + +import ( + "os" + "syscall" +) + +// OpenDir opens a directory in windows with write access for syncing. +func OpenDir(path string) (*os.File, error) { + fd, err := openDir(path) + if err != nil { + return nil, err + } + return os.NewFile(uintptr(fd), path), nil +} + +func openDir(path string) (fd syscall.Handle, err error) { + if len(path) == 0 { + return syscall.InvalidHandle, syscall.ERROR_FILE_NOT_FOUND + } + pathp, err := syscall.UTF16PtrFromString(path) + if err != nil { + return syscall.InvalidHandle, err + } + access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE) + sharemode := uint32(syscall.FILE_SHARE_READ | syscall.FILE_SHARE_WRITE) + createmode := uint32(syscall.OPEN_EXISTING) + fl := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS) + return syscall.CreateFile(pathp, access, sharemode, nil, createmode, fl, 0) +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/fileutil.go b/vendor/github.com/prometheus/tsdb/fileutil/fileutil.go new file mode 100644 index 000000000000..154fa184436e --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/fileutil.go @@ -0,0 +1,149 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package fileutil provides utility methods used when dealing with the filesystem in tsdb. +// It is largely copied from github.com/coreos/etcd/pkg/fileutil to avoid the +// dependency chain it brings with it. +// Please check github.com/coreos/etcd for licensing information. +package fileutil + +import ( + "io/ioutil" + "os" + "path/filepath" + "sort" + "strings" +) + +// CopyDirs copies all directories, subdirectories and files recursively including the empty folders. +// Source and destination must be full paths. +func CopyDirs(src, dest string) error { + if err := os.MkdirAll(dest, 0777); err != nil { + return err + } + files, err := readDirs(src) + if err != nil { + return err + } + + for _, f := range files { + dp := filepath.Join(dest, f) + sp := filepath.Join(src, f) + + stat, err := os.Stat(sp) + if err != nil { + return err + } + + // Empty directories are also created. + if stat.IsDir() { + if err := os.MkdirAll(dp, 0777); err != nil { + return err + } + continue + } + + if err := copyFile(sp, dp); err != nil { + return err + } + } + return nil +} + +func copyFile(src, dest string) error { + data, err := ioutil.ReadFile(src) + if err != nil { + return err + } + + err = ioutil.WriteFile(dest, data, 0644) + if err != nil { + return err + } + return nil +} + +// readDirs reads the source directory recursively and +// returns relative paths to all files and empty directories. +func readDirs(src string) ([]string, error) { + var files []string + + err := filepath.Walk(src, func(path string, f os.FileInfo, err error) error { + relativePath := strings.TrimPrefix(path, src) + if len(relativePath) > 0 { + files = append(files, relativePath) + } + return nil + }) + if err != nil { + return nil, err + } + return files, nil +} + +// ReadDir returns the filenames in the given directory in sorted order. +func ReadDir(dirpath string) ([]string, error) { + dir, err := os.Open(dirpath) + if err != nil { + return nil, err + } + defer dir.Close() + names, err := dir.Readdirnames(-1) + if err != nil { + return nil, err + } + sort.Strings(names) + return names, nil +} + +// Rename safely renames a file. +func Rename(from, to string) error { + if err := os.Rename(from, to); err != nil { + return err + } + + // Directory was renamed; sync parent dir to persist rename. + pdir, err := OpenDir(filepath.Dir(to)) + if err != nil { + return err + } + + if err = Fsync(pdir); err != nil { + pdir.Close() + return err + } + return pdir.Close() +} + +// Replace moves a file or directory to a new location and deletes any previous data. +// It is not atomic. +func Replace(from, to string) error { + if err := os.RemoveAll(to); err != nil { + return err + } + if err := os.Rename(from, to); err != nil { + return err + } + + // Directory was renamed; sync parent dir to persist rename. + pdir, err := OpenDir(filepath.Dir(to)) + if err != nil { + return err + } + + if err = Fsync(pdir); err != nil { + pdir.Close() + return err + } + return pdir.Close() +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/flock.go b/vendor/github.com/prometheus/tsdb/fileutil/flock.go new file mode 100644 index 000000000000..d5eaa7ca2adf --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock.go @@ -0,0 +1,41 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fileutil + +import ( + "os" + "path/filepath" +) + +// Releaser provides the Release method to release a file lock. +type Releaser interface { + Release() error +} + +// Flock locks the file with the provided name. If the file does not exist, it is +// created. The returned Releaser is used to release the lock. existed is true +// if the file to lock already existed. A non-nil error is returned if the +// locking has failed. Neither this function nor the returned Releaser is +// goroutine-safe. +func Flock(fileName string) (r Releaser, existed bool, err error) { + if err = os.MkdirAll(filepath.Dir(fileName), 0755); err != nil { + return nil, false, err + } + + _, err = os.Stat(fileName) + existed = err == nil + + r, err = newLock(fileName) + return r, existed, err +} diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock_plan9.go b/vendor/github.com/prometheus/tsdb/fileutil/flock_plan9.go similarity index 98% rename from vendor/github.com/prometheus/prometheus/util/flock/flock_plan9.go rename to vendor/github.com/prometheus/tsdb/fileutil/flock_plan9.go index 004e85c0fe4a..8a3d44c5e146 100644 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock_plan9.go +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock_plan9.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package flock +package fileutil import "os" diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock_solaris.go b/vendor/github.com/prometheus/tsdb/fileutil/flock_solaris.go similarity index 98% rename from vendor/github.com/prometheus/prometheus/util/flock/flock_solaris.go rename to vendor/github.com/prometheus/tsdb/fileutil/flock_solaris.go index 299fc874465f..7f527ae6c49a 100644 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock_solaris.go +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock_solaris.go @@ -13,7 +13,7 @@ // +build solaris -package flock +package fileutil import ( "os" diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock_unix.go b/vendor/github.com/prometheus/tsdb/fileutil/flock_unix.go similarity index 98% rename from vendor/github.com/prometheus/prometheus/util/flock/flock_unix.go rename to vendor/github.com/prometheus/tsdb/fileutil/flock_unix.go index 7d71f8fc095a..f493fbd831da 100644 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock_unix.go +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock_unix.go @@ -13,7 +13,7 @@ // +build darwin dragonfly freebsd linux netbsd openbsd -package flock +package fileutil import ( "os" diff --git a/vendor/github.com/prometheus/prometheus/util/flock/flock_windows.go b/vendor/github.com/prometheus/tsdb/fileutil/flock_windows.go similarity index 98% rename from vendor/github.com/prometheus/prometheus/util/flock/flock_windows.go rename to vendor/github.com/prometheus/tsdb/fileutil/flock_windows.go index bf7266f14ca1..1c17ff4ea303 100644 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock_windows.go +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock_windows.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package flock +package fileutil import "syscall" diff --git a/vendor/github.com/prometheus/tsdb/fileutil/mmap.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap.go new file mode 100644 index 000000000000..26fc80c58503 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap.go @@ -0,0 +1,61 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fileutil + +import ( + "os" + + "github.com/pkg/errors" +) + +type MmapFile struct { + f *os.File + b []byte +} + +func OpenMmapFile(path string) (*MmapFile, error) { + f, err := os.Open(path) + if err != nil { + return nil, errors.Wrap(err, "try lock file") + } + info, err := f.Stat() + if err != nil { + return nil, errors.Wrap(err, "stat") + } + + b, err := mmap(f, int(info.Size())) + if err != nil { + return nil, errors.Wrap(err, "mmap") + } + + return &MmapFile{f: f, b: b}, nil +} + +func (f *MmapFile) Close() error { + err0 := munmap(f.b) + err1 := f.f.Close() + + if err0 != nil { + return err0 + } + return err1 +} + +func (f *MmapFile) File() *os.File { + return f.f +} + +func (f *MmapFile) Bytes() []byte { + return f.b +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/mmap_386.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap_386.go new file mode 100644 index 000000000000..66b9d3680344 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap_386.go @@ -0,0 +1,18 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build windows + +package fileutil + +const maxMapSize = 0x7FFFFFFF // 2GB diff --git a/vendor/github.com/prometheus/tsdb/fileutil/mmap_amd64.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap_amd64.go new file mode 100644 index 000000000000..4b523bc67c2e --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap_amd64.go @@ -0,0 +1,18 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build windows + +package fileutil + +const maxMapSize = 0xFFFFFFFFFFFF // 256TB diff --git a/vendor/github.com/prometheus/tsdb/fileutil/mmap_unix.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap_unix.go new file mode 100644 index 000000000000..043f4d408cc3 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap_unix.go @@ -0,0 +1,30 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows,!plan9 + +package fileutil + +import ( + "os" + + "golang.org/x/sys/unix" +) + +func mmap(f *os.File, length int) ([]byte, error) { + return unix.Mmap(int(f.Fd()), 0, length, unix.PROT_READ, unix.MAP_SHARED) +} + +func munmap(b []byte) (err error) { + return unix.Munmap(b) +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/mmap_windows.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap_windows.go new file mode 100644 index 000000000000..b9422641239f --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap_windows.go @@ -0,0 +1,46 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fileutil + +import ( + "os" + "syscall" + "unsafe" +) + +func mmap(f *os.File, size int) ([]byte, error) { + low, high := uint32(size), uint32(size>>32) + h, errno := syscall.CreateFileMapping(syscall.Handle(f.Fd()), nil, syscall.PAGE_READONLY, high, low, nil) + if h == 0 { + return nil, os.NewSyscallError("CreateFileMapping", errno) + } + + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(size)) + if addr == 0 { + return nil, os.NewSyscallError("MapViewOfFile", errno) + } + + if err := syscall.CloseHandle(syscall.Handle(h)); err != nil { + return nil, os.NewSyscallError("CloseHandle", err) + } + + return (*[maxMapSize]byte)(unsafe.Pointer(addr))[:size], nil +} + +func munmap(b []byte) error { + if err := syscall.UnmapViewOfFile((uintptr)(unsafe.Pointer(&b[0]))); err != nil { + return os.NewSyscallError("UnmapViewOfFile", err) + } + return nil +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/preallocate.go b/vendor/github.com/prometheus/tsdb/fileutil/preallocate.go new file mode 100644 index 000000000000..c747b7cf81f9 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/preallocate.go @@ -0,0 +1,54 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fileutil + +import ( + "io" + "os" +) + +// Preallocate tries to allocate the space for given +// file. This operation is only supported on linux by a +// few filesystems (btrfs, ext4, etc.). +// If the operation is unsupported, no error will be returned. +// Otherwise, the error encountered will be returned. +func Preallocate(f *os.File, sizeInBytes int64, extendFile bool) error { + if sizeInBytes == 0 { + // fallocate will return EINVAL if length is 0; skip + return nil + } + if extendFile { + return preallocExtend(f, sizeInBytes) + } + return preallocFixed(f, sizeInBytes) +} + +func preallocExtendTrunc(f *os.File, sizeInBytes int64) error { + curOff, err := f.Seek(0, io.SeekCurrent) + if err != nil { + return err + } + size, err := f.Seek(sizeInBytes, io.SeekEnd) + if err != nil { + return err + } + if _, err = f.Seek(curOff, io.SeekStart); err != nil { + return err + } + if sizeInBytes > size { + return nil + } + return f.Truncate(sizeInBytes) +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/preallocate_darwin.go b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_darwin.go new file mode 100644 index 000000000000..c9fa1a6c2260 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_darwin.go @@ -0,0 +1,41 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fileutil + +import ( + "os" + "syscall" + "unsafe" +) + +func preallocExtend(f *os.File, sizeInBytes int64) error { + if err := preallocFixed(f, sizeInBytes); err != nil { + return err + } + return preallocExtendTrunc(f, sizeInBytes) +} + +func preallocFixed(f *os.File, sizeInBytes int64) error { + fstore := &syscall.Fstore_t{ + Flags: syscall.F_ALLOCATEALL, + Posmode: syscall.F_PEOFPOSMODE, + Length: sizeInBytes} + p := unsafe.Pointer(fstore) + _, _, errno := syscall.Syscall(syscall.SYS_FCNTL, f.Fd(), uintptr(syscall.F_PREALLOCATE), uintptr(p)) + if errno == 0 || errno == syscall.ENOTSUP { + return nil + } + return errno +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/preallocate_linux.go b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_linux.go new file mode 100644 index 000000000000..ada0462213e3 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_linux.go @@ -0,0 +1,47 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fileutil + +import ( + "os" + "syscall" +) + +func preallocExtend(f *os.File, sizeInBytes int64) error { + // use mode = 0 to change size + err := syscall.Fallocate(int(f.Fd()), 0, 0, sizeInBytes) + if err != nil { + errno, ok := err.(syscall.Errno) + // not supported; fallback + // fallocate EINTRs frequently in some environments; fallback + if ok && (errno == syscall.ENOTSUP || errno == syscall.EINTR) { + return preallocExtendTrunc(f, sizeInBytes) + } + } + return err +} + +func preallocFixed(f *os.File, sizeInBytes int64) error { + // use mode = 1 to keep size; see FALLOC_FL_KEEP_SIZE + err := syscall.Fallocate(int(f.Fd()), 1, 0, sizeInBytes) + if err != nil { + errno, ok := err.(syscall.Errno) + // treat not supported as nil error + if ok && errno == syscall.ENOTSUP { + return nil + } + } + return err +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/preallocate_other.go b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_other.go new file mode 100644 index 000000000000..162fbc5f7826 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_other.go @@ -0,0 +1,25 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !linux,!darwin + +package fileutil + +import "os" + +func preallocExtend(f *os.File, sizeInBytes int64) error { + return preallocExtendTrunc(f, sizeInBytes) +} + +func preallocFixed(f *os.File, sizeInBytes int64) error { return nil } diff --git a/vendor/github.com/prometheus/tsdb/fileutil/sync.go b/vendor/github.com/prometheus/tsdb/fileutil/sync.go new file mode 100644 index 000000000000..54dd41f4f351 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/sync.go @@ -0,0 +1,29 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !linux,!darwin + +package fileutil + +import "os" + +// Fsync is a wrapper around file.Sync(). Special handling is needed on darwin platform. +func Fsync(f *os.File) error { + return f.Sync() +} + +// Fdatasync is a wrapper around file.Sync(). Special handling is needed on linux platform. +func Fdatasync(f *os.File) error { + return f.Sync() +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/sync_darwin.go b/vendor/github.com/prometheus/tsdb/fileutil/sync_darwin.go new file mode 100644 index 000000000000..c2f39bf204d2 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/sync_darwin.go @@ -0,0 +1,40 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build darwin + +package fileutil + +import ( + "os" + "syscall" +) + +// Fsync on HFS/OSX flushes the data on to the physical drive but the drive +// may not write it to the persistent media for quite sometime and it may be +// written in out-of-order sequence. Using F_FULLFSYNC ensures that the +// physical drive's buffer will also get flushed to the media. +func Fsync(f *os.File) error { + _, _, errno := syscall.Syscall(syscall.SYS_FCNTL, f.Fd(), uintptr(syscall.F_FULLFSYNC), uintptr(0)) + if errno == 0 { + return nil + } + return errno +} + +// Fdatasync on darwin platform invokes fcntl(F_FULLFSYNC) for actual persistence +// on physical drive media. +func Fdatasync(f *os.File) error { + return Fsync(f) +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/sync_linux.go b/vendor/github.com/prometheus/tsdb/fileutil/sync_linux.go new file mode 100644 index 000000000000..1bbced915e9b --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/sync_linux.go @@ -0,0 +1,34 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build linux + +package fileutil + +import ( + "os" + "syscall" +) + +// Fsync is a wrapper around file.Sync(). Special handling is needed on darwin platform. +func Fsync(f *os.File) error { + return f.Sync() +} + +// Fdatasync is similar to fsync(), but does not flush modified metadata +// unless that metadata is needed in order to allow a subsequent data retrieval +// to be correctly handled. +func Fdatasync(f *os.File) error { + return syscall.Fdatasync(int(f.Fd())) +} diff --git a/vendor/github.com/status-im/keycard-go/LICENSE.md b/vendor/github.com/status-im/keycard-go/LICENSE.md new file mode 100644 index 000000000000..3759302a4770 --- /dev/null +++ b/vendor/github.com/status-im/keycard-go/LICENSE.md @@ -0,0 +1,356 @@ +Mozilla Public License Version 2.0 +================================== + +### 1. Definitions + +**1.1. “Contributor”** + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +**1.2. “Contributor Version”** + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +**1.3. “Contribution”** + means Covered Software of a particular Contributor. + +**1.4. “Covered Software”** + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +**1.5. “Incompatible With Secondary Licenses”** + means + +* **(a)** that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or +* **(b)** that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +**1.6. “Executable Form”** + means any form of the work other than Source Code Form. + +**1.7. “Larger Work”** + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +**1.8. “License”** + means this document. + +**1.9. “Licensable”** + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +**1.10. “Modifications”** + means any of the following: + +* **(a)** any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or +* **(b)** any new file in Source Code Form that contains any Covered + Software. + +**1.11. “Patent Claims” of a Contributor** + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +**1.12. “Secondary License”** + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +**1.13. “Source Code Form”** + means the form of the work preferred for making modifications. + +**1.14. “You” (or “Your”)** + means an individual or a legal entity exercising rights under this + License. For legal entities, “You” includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, “control” means **(a)** the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or **(b)** ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + + +### 2. License Grants and Conditions + +#### 2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +* **(a)** under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and +* **(b)** under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +#### 2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +#### 2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +* **(a)** for any code that a Contributor has removed from Covered Software; + or +* **(b)** for infringements caused by: **(i)** Your and any other third party's + modifications of Covered Software, or **(ii)** the combination of its + Contributions with other software (except as part of its Contributor + Version); or +* **(c)** under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +#### 2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +#### 2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +#### 2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +#### 2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + + +### 3. Responsibilities + +#### 3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +#### 3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +* **(a)** such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +* **(b)** You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +#### 3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +#### 3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +#### 3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + + +### 4. Inability to Comply Due to Statute or Regulation + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: **(a)** comply with +the terms of this License to the maximum extent possible; and **(b)** +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + + +### 5. Termination + +**5.1.** The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated **(a)** provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and **(b)** on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +**5.2.** If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +**5.3.** In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + + +### 6. Disclaimer of Warranty + +> Covered Software is provided under this License on an “as is” +> basis, without warranty of any kind, either expressed, implied, or +> statutory, including, without limitation, warranties that the +> Covered Software is free of defects, merchantable, fit for a +> particular purpose or non-infringing. The entire risk as to the +> quality and performance of the Covered Software is with You. +> Should any Covered Software prove defective in any respect, You +> (not any Contributor) assume the cost of any necessary servicing, +> repair, or correction. This disclaimer of warranty constitutes an +> essential part of this License. No use of any Covered Software is +> authorized under this License except under this disclaimer. + +### 7. Limitation of Liability + +> Under no circumstances and under no legal theory, whether tort +> (including negligence), contract, or otherwise, shall any +> Contributor, or anyone who distributes Covered Software as +> permitted above, be liable to You for any direct, indirect, +> special, incidental, or consequential damages of any character +> including, without limitation, damages for lost profits, loss of +> goodwill, work stoppage, computer failure or malfunction, or any +> and all other commercial damages or losses, even if such party +> shall have been informed of the possibility of such damages. This +> limitation of liability shall not apply to liability for death or +> personal injury resulting from such party's negligence to the +> extent applicable law prohibits such limitation. Some +> jurisdictions do not allow the exclusion or limitation of +> incidental or consequential damages, so this exclusion and +> limitation may not apply to You. + + +### 8. Litigation + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + + +### 9. Miscellaneous + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + + +### 10. Versions of the License + +#### 10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +#### 10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +#### 10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +#### 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +## Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +## Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + diff --git a/vendor/github.com/status-im/keycard-go/derivationpath/decoder.go b/vendor/github.com/status-im/keycard-go/derivationpath/decoder.go new file mode 100644 index 000000000000..f269da258e24 --- /dev/null +++ b/vendor/github.com/status-im/keycard-go/derivationpath/decoder.go @@ -0,0 +1,214 @@ +package derivationpath + +import ( + "fmt" + "io" + "strconv" + "strings" +) + +type StartingPoint int + +const ( + tokenMaster = 0x6D // char m + tokenSeparator = 0x2F // char / + tokenHardened = 0x27 // char ' + tokenDot = 0x2E // char . + + hardenedStart = 0x80000000 // 2^31 +) + +const ( + StartingPointMaster StartingPoint = iota + 1 + StartingPointCurrent + StartingPointParent +) + +type parseFunc = func() error + +type decoder struct { + r *strings.Reader + f parseFunc + pos int + path []uint32 + start StartingPoint + currentToken string + currentTokenHardened bool +} + +func newDecoder(path string) *decoder { + d := &decoder{ + r: strings.NewReader(path), + } + + d.reset() + + return d +} + +func (d *decoder) reset() { + d.r.Seek(0, io.SeekStart) + d.pos = 0 + d.start = StartingPointCurrent + d.f = d.parseStart + d.path = make([]uint32, 0) + d.resetCurrentToken() +} + +func (d *decoder) resetCurrentToken() { + d.currentToken = "" + d.currentTokenHardened = false +} + +func (d *decoder) parse() (StartingPoint, []uint32, error) { + for { + err := d.f() + if err != nil { + if err == io.EOF { + err = nil + } else { + err = fmt.Errorf("at position %d, %s", d.pos, err.Error()) + } + + return d.start, d.path, err + } + } + + return d.start, d.path, nil +} + +func (d *decoder) readByte() (byte, error) { + b, err := d.r.ReadByte() + if err != nil { + return b, err + } + + d.pos++ + + return b, nil +} + +func (d *decoder) unreadByte() error { + err := d.r.UnreadByte() + if err != nil { + return err + } + + d.pos-- + + return nil +} + +func (d *decoder) parseStart() error { + b, err := d.readByte() + if err != nil { + return err + } + + if b == tokenMaster { + d.start = StartingPointMaster + d.f = d.parseSeparator + return nil + } + + if b == tokenDot { + b2, err := d.readByte() + if err != nil { + return err + } + + if b2 == tokenDot { + d.f = d.parseSeparator + d.start = StartingPointParent + return nil + } + + d.f = d.parseSeparator + d.start = StartingPointCurrent + return d.unreadByte() + } + + d.f = d.parseSegment + + return d.unreadByte() +} + +func (d *decoder) saveSegment() error { + if len(d.currentToken) > 0 { + i, err := strconv.ParseUint(d.currentToken, 10, 32) + if err != nil { + return err + } + + if i >= hardenedStart { + d.pos -= len(d.currentToken) - 1 + return fmt.Errorf("index must be lower than 2^31, got %d", i) + } + + if d.currentTokenHardened { + i += hardenedStart + } + + d.path = append(d.path, uint32(i)) + } + + d.f = d.parseSegment + d.resetCurrentToken() + + return nil +} + +func (d *decoder) parseSeparator() error { + b, err := d.readByte() + if err != nil { + return err + } + + if b == tokenSeparator { + return d.saveSegment() + } + + return fmt.Errorf("expected %s, got %s", string(tokenSeparator), string(b)) +} + +func (d *decoder) parseSegment() error { + b, err := d.readByte() + if err == io.EOF { + if len(d.currentToken) == 0 { + return fmt.Errorf("expected number, got EOF") + } + + if newErr := d.saveSegment(); newErr != nil { + return newErr + } + + return err + } + + if err != nil { + return err + } + + if len(d.currentToken) > 0 && b == tokenSeparator { + return d.saveSegment() + } + + if len(d.currentToken) > 0 && b == tokenHardened { + d.currentTokenHardened = true + d.f = d.parseSeparator + return nil + } + + if b < 0x30 || b > 0x39 { + return fmt.Errorf("expected number, got %s", string(b)) + } + + d.currentToken = fmt.Sprintf("%s%s", d.currentToken, string(b)) + + return nil +} + +func Decode(str string) (StartingPoint, []uint32, error) { + d := newDecoder(str) + return d.parse() +} diff --git a/vendor/github.com/status-im/keycard-go/derivationpath/encoder.go b/vendor/github.com/status-im/keycard-go/derivationpath/encoder.go new file mode 100644 index 000000000000..c1f5b0239813 --- /dev/null +++ b/vendor/github.com/status-im/keycard-go/derivationpath/encoder.go @@ -0,0 +1,36 @@ +package derivationpath + +import ( + "bytes" + "encoding/binary" + "fmt" + "strings" +) + +func Encode(rawPath []uint32) string { + segments := []string{string(tokenMaster)} + + for _, i := range rawPath { + suffix := "" + + if i >= hardenedStart { + i = i - hardenedStart + suffix = string(tokenHardened) + } + + segments = append(segments, fmt.Sprintf("%d%s", i, suffix)) + } + + return strings.Join(segments, string(tokenSeparator)) +} + +func EncodeFromBytes(data []byte) (string, error) { + buf := bytes.NewBuffer(data) + rawPath := make([]uint32, buf.Len()/4) + err := binary.Read(buf, binary.BigEndian, &rawPath) + if err != nil { + return "", err + } + + return Encode(rawPath), nil +} diff --git a/vendor/github.com/steakknife/bloomfilter/MIT-LICENSE.txt b/vendor/github.com/steakknife/bloomfilter/MIT-LICENSE.txt new file mode 100644 index 000000000000..ccf77fe465c8 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/MIT-LICENSE.txt @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright © 2014, 2015 Barry Allard + +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. diff --git a/vendor/github.com/steakknife/bloomfilter/README.md b/vendor/github.com/steakknife/bloomfilter/README.md new file mode 100644 index 000000000000..4587f143af8c --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/README.md @@ -0,0 +1,123 @@ +**Important**: Zeroth, [consider](https://bdupras.github.io/filter-tutorial/) if a [Cuckoo filter](https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf) could be [right for your use-case](https://github.com/seiflotfy/cuckoofilter). + + +[![GoDoc](https://godoc.org/github.com/steakknife/bloomfilter?status.png)](https://godoc.org/github.com/steakknife/bloomfilter) [![travis](https://img.shields.io/travis/steakknife/bloomfilter.svg)](https://travis-ci.org/steakknife/bloomfilter) + +# Face-meltingly fast, thread-safe, marshalable, unionable, probability- and optimal-size-calculating Bloom filter in go + +Copyright © 2014-2016,2018 Barry Allard + +[MIT license](MIT-LICENSE.txt) + +## WTF is a bloom filter + +**TL;DR: **Probabilistic, extra lookup table to track a set of elements kept elsewhere to reduce expensive, unnecessary set element retrieval and/or iterator operations **when an element is not present in the set.** It's a classic time-storage tradeoff algoritm. + +### Properties + +#### [See wikipedia](https://en.wikipedia.org/wiki/Bloom_filter) for algorithm details + +|Impact|What|Description| +|---|---|---| +|Good|No false negatives|know for certain if a given element is definitely NOT in the set| +|Bad|False positives|uncertain if a given element is in the set| +|Bad|Theoretical potential for hash collisions|in very large systems and/or badly hash.Hash64-conforming implementations| +|Bad|Add only|Cannot remove an element, it would destroy information about other elements| +|Good|Constant storage|uses only a fixed amount of memory| + +## Naming conventions + +(Similar to algorithm) + +|Variable/function|Description|Range| +|---|---|---| +|m/M()|number of bits in the bloom filter (memory representation is about m/8 bytes in size)|>=2| +|n/N()|number of elements present|>=0| +|k/K()|number of keys to use (keys are kept private to user code but are de/serialized to Marshal and file I/O)|>=0| +|maxN|maximum capacity of intended structure|>0| +|p|maximum allowed probability of collision (for computing m and k for optimal sizing)|>0..<1| + +- Memory representation should be exactly `24 + 8*(k + (m+63)/64) + unsafe.Sizeof(RWMutex)` bytes. +- Serialized (`BinaryMarshaler`) representation should be exactly `72 + 8*(k + (m+63)/64)` bytes. (Disk format is less due to compression.) + +## Binary serialization format + +All values in Little-endian format + +|Offset|Offset (Hex)|Length (bytes)|Name|Type| +|---|---|---|---|---| +|0|00|8|k|`uint64`| +|8|08|8|n|`uint64`| +|16|10|8|m|`uint64`| +|24|18|k|(keys)|`[k]uint64`| +|24+8*k|...|(m+63)/64|(bloom filter)|`[(m+63)/64]uint64`| +|24+8\*k+8\*((m+63)/64)|...|48|(SHA384 of all previous fields, hashed in order)|`[48]byte`| + +- `bloomfilter.Filter` conforms to `encoding.BinaryMarshaler` and `encoding.BinaryUnmarshaler' + +## Usage + +```go + +import "github.com/steakknife/bloomfilter" + +const ( + maxElements = 100000 + probCollide = 0.0000001 +) + +bf, err := bloomfilter.NewOptimal(maxElements, probCollide) +if err != nil { + panic(err) +} + +someValue := ... // must conform to hash.Hash64 + +bf.Add(someValue) +if bf.Contains(someValue) { // probably true, could be false + // whatever +} + +anotherValue := ... // must also conform to hash.Hash64 + +if bf.Contains(anotherValue) { + panic("This should never happen") +} + +err := bf.WriteFile("1.bf.gz") // saves this BF to a file +if err != nil { + panic(err) +} + +bf2, err := bloomfilter.ReadFile("1.bf.gz") // read the BF to another var +if err != nil { + panic(err) +} +``` + + +## Design + +Where possible, branch-free operations are used to avoid deep pipeline / execution unit stalls on branch-misses. + +## Get + + go get -u github.com/steakknife/bloomfilter # master is always stable + +## Source + +- On the web: [https://github.com/steakknife/bloomfilter](https://github.com/steakknife/bloomfilter) + +- Git: `git clone https://github.com/steakknife/bloomfilter` + +## Contact + +- [Feedback](mailto:barry.allard@gmail.com) + +- [Issues](https://github.com/steakknife/bloomfilter/issues) + +## License + +[MIT license](MIT-LICENSE.txt) + +Copyright © 2014-2016 Barry Allard diff --git a/vendor/github.com/steakknife/bloomfilter/binarymarshaler.go b/vendor/github.com/steakknife/bloomfilter/binarymarshaler.go new file mode 100644 index 000000000000..2fa669254a08 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/binarymarshaler.go @@ -0,0 +1,87 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "bytes" + "crypto/sha512" + "encoding/binary" +) + +// conforms to encoding.BinaryMarshaler + +// marshalled binary layout (Little Endian): +// +// k 1 uint64 +// n 1 uint64 +// m 1 uint64 +// keys [k]uint64 +// bits [(m+63)/64]uint64 +// hash sha384 (384 bits == 48 bytes) +// +// size = (3 + k + (m+63)/64) * 8 bytes +// + +func (f *Filter) marshal() (buf *bytes.Buffer, + hash [sha512.Size384]byte, + err error, +) { + f.lock.RLock() + defer f.lock.RUnlock() + + debug("write bf k=%d n=%d m=%d\n", f.K(), f.n, f.m) + + buf = new(bytes.Buffer) + + err = binary.Write(buf, binary.LittleEndian, f.K()) + if err != nil { + return nil, hash, err + } + + err = binary.Write(buf, binary.LittleEndian, f.n) + if err != nil { + return nil, hash, err + } + + err = binary.Write(buf, binary.LittleEndian, f.m) + if err != nil { + return nil, hash, err + } + + err = binary.Write(buf, binary.LittleEndian, f.keys) + if err != nil { + return nil, hash, err + } + + err = binary.Write(buf, binary.LittleEndian, f.bits) + if err != nil { + return nil, hash, err + } + + hash = sha512.Sum384(buf.Bytes()) + err = binary.Write(buf, binary.LittleEndian, hash) + return buf, hash, err +} + +// MarshalBinary converts a Filter into []bytes +func (f *Filter) MarshalBinary() (data []byte, err error) { + buf, hash, err := f.marshal() + if err != nil { + return nil, err + } + + debug( + "bloomfilter.MarshalBinary: Successfully wrote %d byte(s), sha384 %v", + buf.Len(), hash, + ) + data = buf.Bytes() + return data, nil +} diff --git a/vendor/github.com/steakknife/bloomfilter/binaryunmarshaler.go b/vendor/github.com/steakknife/bloomfilter/binaryunmarshaler.go new file mode 100644 index 000000000000..5be1670c58e9 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/binaryunmarshaler.go @@ -0,0 +1,111 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "bytes" + "crypto/hmac" + "crypto/sha512" + "encoding/binary" + "io" +) + +func unmarshalBinaryHeader(r io.Reader) (k, n, m uint64, err error) { + err = binary.Read(r, binary.LittleEndian, &k) + if err != nil { + return k, n, m, err + } + + if k < KMin { + return k, n, m, errK() + } + + err = binary.Read(r, binary.LittleEndian, &n) + if err != nil { + return k, n, m, err + } + + err = binary.Read(r, binary.LittleEndian, &m) + if err != nil { + return k, n, m, err + } + + if m < MMin { + return k, n, m, errM() + } + + debug("read bf k=%d n=%d m=%d\n", k, n, m) + + return k, n, m, err +} + +func unmarshalBinaryBits(r io.Reader, m uint64) (bits []uint64, err error) { + bits, err = newBits(m) + if err != nil { + return bits, err + } + err = binary.Read(r, binary.LittleEndian, bits) + return bits, err + +} + +func unmarshalBinaryKeys(r io.Reader, k uint64) (keys []uint64, err error) { + keys = make([]uint64, k) + err = binary.Read(r, binary.LittleEndian, keys) + return keys, err +} + +func checkBinaryHash(r io.Reader, data []byte) (err error) { + expectedHash := make([]byte, sha512.Size384) + err = binary.Read(r, binary.LittleEndian, expectedHash) + if err != nil { + return err + } + + actualHash := sha512.Sum384(data[:len(data)-sha512.Size384]) + + if !hmac.Equal(expectedHash, actualHash[:]) { + debug("bloomfilter.UnmarshalBinary() sha384 hash failed:"+ + " actual %v expected %v", actualHash, expectedHash) + return errHash() + } + + debug("bloomfilter.UnmarshalBinary() successfully read"+ + " %d byte(s), sha384 %v", len(data), actualHash) + return nil +} + +// UnmarshalBinary converts []bytes into a Filter +// conforms to encoding.BinaryUnmarshaler +func (f *Filter) UnmarshalBinary(data []byte) (err error) { + f.lock.Lock() + defer f.lock.Unlock() + + buf := bytes.NewBuffer(data) + + var k uint64 + k, f.n, f.m, err = unmarshalBinaryHeader(buf) + if err != nil { + return err + } + + f.keys, err = unmarshalBinaryKeys(buf, k) + if err != nil { + return err + } + + f.bits, err = unmarshalBinaryBits(buf, f.m) + if err != nil { + return err + } + + return checkBinaryHash(buf, data) +} diff --git a/vendor/github.com/steakknife/bloomfilter/bloomfilter.go b/vendor/github.com/steakknife/bloomfilter/bloomfilter.go new file mode 100644 index 000000000000..822506365309 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/bloomfilter.go @@ -0,0 +1,123 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "hash" + "sync" +) + +// Filter is an opaque Bloom filter type +type Filter struct { + lock sync.RWMutex + bits []uint64 + keys []uint64 + m uint64 // number of bits the "bits" field should recognize + n uint64 // number of inserted elements +} + +// Hashable -> hashes +func (f *Filter) hash(v hash.Hash64) []uint64 { + rawHash := v.Sum64() + n := len(f.keys) + hashes := make([]uint64, n) + for i := 0; i < n; i++ { + hashes[i] = rawHash ^ f.keys[i] + } + return hashes +} + +// M is the size of Bloom filter, in bits +func (f *Filter) M() uint64 { + return f.m +} + +// K is the count of keys +func (f *Filter) K() uint64 { + return uint64(len(f.keys)) +} + +// Add a hashable item, v, to the filter +func (f *Filter) Add(v hash.Hash64) { + f.lock.Lock() + defer f.lock.Unlock() + + for _, i := range f.hash(v) { + // f.setBit(i) + i %= f.m + f.bits[i>>6] |= 1 << uint(i&0x3f) + } + f.n++ +} + +// Contains tests if f contains v +// false: f definitely does not contain value v +// true: f maybe contains value v +func (f *Filter) Contains(v hash.Hash64) bool { + f.lock.RLock() + defer f.lock.RUnlock() + + r := uint64(1) + for _, i := range f.hash(v) { + // r |= f.getBit(k) + i %= f.m + r &= (f.bits[i>>6] >> uint(i&0x3f)) & 1 + } + return uint64ToBool(r) +} + +// Copy f to a new Bloom filter +func (f *Filter) Copy() (*Filter, error) { + f.lock.RLock() + defer f.lock.RUnlock() + + out, err := f.NewCompatible() + if err != nil { + return nil, err + } + copy(out.bits, f.bits) + out.n = f.n + return out, nil +} + +// UnionInPlace merges Bloom filter f2 into f +func (f *Filter) UnionInPlace(f2 *Filter) error { + if !f.IsCompatible(f2) { + return errIncompatibleBloomFilters() + } + + f.lock.Lock() + defer f.lock.Unlock() + + for i, bitword := range f2.bits { + f.bits[i] |= bitword + } + return nil +} + +// Union merges f2 and f2 into a new Filter out +func (f *Filter) Union(f2 *Filter) (out *Filter, err error) { + if !f.IsCompatible(f2) { + return nil, errIncompatibleBloomFilters() + } + + f.lock.RLock() + defer f.lock.RUnlock() + + out, err = f.NewCompatible() + if err != nil { + return nil, err + } + for i, bitword := range f2.bits { + out.bits[i] = f.bits[i] | bitword + } + return out, nil +} diff --git a/vendor/github.com/steakknife/bloomfilter/conformance.go b/vendor/github.com/steakknife/bloomfilter/conformance.go new file mode 100644 index 000000000000..2963686f85ba --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/conformance.go @@ -0,0 +1,29 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "encoding" + "encoding/gob" + "io" +) + +// compile-time conformance tests +var ( + _ encoding.BinaryMarshaler = (*Filter)(nil) + _ encoding.BinaryUnmarshaler = (*Filter)(nil) + _ encoding.TextMarshaler = (*Filter)(nil) + _ encoding.TextUnmarshaler = (*Filter)(nil) + _ io.ReaderFrom = (*Filter)(nil) + _ io.WriterTo = (*Filter)(nil) + _ gob.GobDecoder = (*Filter)(nil) + _ gob.GobEncoder = (*Filter)(nil) +) diff --git a/vendor/github.com/steakknife/bloomfilter/debug.go b/vendor/github.com/steakknife/bloomfilter/debug.go new file mode 100644 index 000000000000..e88b934c1742 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/debug.go @@ -0,0 +1,37 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "log" + "os" +) + +const debugVar = "GOLANG_STEAKKNIFE_BLOOMFILTER_DEBUG" + +// EnableDebugging permits debug() logging of details to stderr +func EnableDebugging() { + err := os.Setenv(debugVar, "1") + if err != nil { + panic("Unable to Setenv " + debugVar) + } +} + +func debugging() bool { + return os.Getenv(debugVar) != "" +} + +// debug printing when debugging() is true +func debug(format string, a ...interface{}) { + if debugging() { + log.Printf(format, a...) + } +} diff --git a/vendor/github.com/steakknife/bloomfilter/errors.go b/vendor/github.com/steakknife/bloomfilter/errors.go new file mode 100644 index 000000000000..b279739b3634 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/errors.go @@ -0,0 +1,34 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import "fmt" + +func errHash() error { + return fmt.Errorf( + "Hash mismatch, the Bloom filter is probably corrupt") +} +func errK() error { + return fmt.Errorf( + "keys must have length %d or greater", KMin) +} +func errM() error { + return fmt.Errorf( + "m (number of bits in the Bloom filter) must be >= %d", MMin) +} +func errUniqueKeys() error { + return fmt.Errorf( + "Bloom filter keys must be unique") +} +func errIncompatibleBloomFilters() error { + return fmt.Errorf( + "Cannot perform union on two incompatible Bloom filters") +} diff --git a/vendor/github.com/steakknife/bloomfilter/fileio.go b/vendor/github.com/steakknife/bloomfilter/fileio.go new file mode 100644 index 000000000000..a47969956641 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/fileio.go @@ -0,0 +1,105 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "compress/gzip" + "io" + "io/ioutil" + "os" +) + +// ReadFrom r and overwrite f with new Bloom filter data +func (f *Filter) ReadFrom(r io.Reader) (n int64, err error) { + f2, n, err := ReadFrom(r) + if err != nil { + return -1, err + } + f.lock.Lock() + defer f.lock.Unlock() + f.m = f2.m + f.n = f2.n + f.bits = f2.bits + f.keys = f2.keys + return n, nil +} + +// ReadFrom Reader r into a lossless-compressed Bloom filter f +func ReadFrom(r io.Reader) (f *Filter, n int64, err error) { + rawR, err := gzip.NewReader(r) + if err != nil { + return nil, -1, err + } + defer func() { + err = rawR.Close() + }() + + content, err := ioutil.ReadAll(rawR) + if err != nil { + return nil, -1, err + } + + f = new(Filter) + n = int64(len(content)) + err = f.UnmarshalBinary(content) + if err != nil { + return nil, -1, err + } + return f, n, nil +} + +// ReadFile from filename into a lossless-compressed Bloom Filter f +// Suggested file extension: .bf.gz +func ReadFile(filename string) (f *Filter, n int64, err error) { + r, err := os.Open(filename) + if err != nil { + return nil, -1, err + } + defer func() { + err = r.Close() + }() + + return ReadFrom(r) +} + +// WriteTo a Writer w from lossless-compressed Bloom Filter f +func (f *Filter) WriteTo(w io.Writer) (n int64, err error) { + f.lock.RLock() + defer f.lock.RUnlock() + + rawW := gzip.NewWriter(w) + defer func() { + err = rawW.Close() + }() + + content, err := f.MarshalBinary() + if err != nil { + return -1, err + } + + intN, err := rawW.Write(content) + n = int64(intN) + return n, err +} + +// WriteFile filename from a a lossless-compressed Bloom Filter f +// Suggested file extension: .bf.gz +func (f *Filter) WriteFile(filename string) (n int64, err error) { + w, err := os.Create(filename) + if err != nil { + return -1, err + } + defer func() { + err = w.Close() + }() + + return f.WriteTo(w) +} diff --git a/vendor/github.com/steakknife/bloomfilter/gob.go b/vendor/github.com/steakknife/bloomfilter/gob.go new file mode 100644 index 000000000000..0d99e55d43a4 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/gob.go @@ -0,0 +1,23 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import _ "encoding/gob" // make sure gob is available + +// GobDecode conforms to interface gob.GobDecoder +func (f *Filter) GobDecode(data []byte) error { + return f.UnmarshalBinary(data) +} + +// GobEncode conforms to interface gob.GobEncoder +func (f *Filter) GobEncode() ([]byte, error) { + return f.MarshalBinary() +} diff --git a/vendor/github.com/steakknife/bloomfilter/iscompatible.go b/vendor/github.com/steakknife/bloomfilter/iscompatible.go new file mode 100644 index 000000000000..2073d8083ea7 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/iscompatible.go @@ -0,0 +1,41 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import "unsafe" + +func uint64ToBool(x uint64) bool { + return *(*bool)(unsafe.Pointer(&x)) // #nosec +} + +// returns 0 if equal, does not compare len(b0) with len(b1) +func noBranchCompareUint64s(b0, b1 []uint64) uint64 { + r := uint64(0) + for i, b0i := range b0 { + r |= b0i ^ b1[i] + } + return r +} + +// IsCompatible is true if f and f2 can be Union()ed together +func (f *Filter) IsCompatible(f2 *Filter) bool { + f.lock.RLock() + defer f.lock.RUnlock() + + f.lock.RLock() + defer f2.lock.RUnlock() + + // 0 is true, non-0 is false + compat := f.M() ^ f2.M() + compat |= f.K() ^ f2.K() + compat |= noBranchCompareUint64s(f.keys, f2.keys) + return uint64ToBool(^compat) +} diff --git a/vendor/github.com/steakknife/bloomfilter/new.go b/vendor/github.com/steakknife/bloomfilter/new.go new file mode 100644 index 000000000000..bf4323a7ed38 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/new.go @@ -0,0 +1,134 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "crypto/rand" + "encoding/binary" + "log" +) + +const ( + // MMin is the minimum Bloom filter bits count + MMin = 2 + // KMin is the minimum number of keys + KMin = 1 + // Uint64Bytes is the number of bytes in type uint64 + Uint64Bytes = 8 +) + +// New Filter with CSPRNG keys +// +// m is the size of the Bloom filter, in bits, >= 2 +// +// k is the number of random keys, >= 1 +func New(m, k uint64) (*Filter, error) { + return NewWithKeys(m, newRandKeys(k)) +} + +func newRandKeys(k uint64) []uint64 { + keys := make([]uint64, k) + err := binary.Read(rand.Reader, binary.LittleEndian, keys) + if err != nil { + log.Panicf( + "Cannot read %d bytes from CSRPNG crypto/rand.Read (err=%v)", + Uint64Bytes, err, + ) + } + return keys +} + +// NewCompatible Filter compatible with f +func (f *Filter) NewCompatible() (*Filter, error) { + return NewWithKeys(f.m, f.keys) +} + +// NewOptimal Bloom filter with random CSPRNG keys +func NewOptimal(maxN uint64, p float64) (*Filter, error) { + m := OptimalM(maxN, p) + k := OptimalK(m, maxN) + debug("New optimal bloom filter ::"+ + " requested max elements (n):%d,"+ + " probability of collision (p):%1.10f "+ + "-> recommends -> bits (m): %d (%f GiB), "+ + "number of keys (k): %d", + maxN, p, m, float64(m)/(gigabitsPerGiB), k) + return New(m, k) +} + +// UniqueKeys is true if all keys are unique +func UniqueKeys(keys []uint64) bool { + for j := 0; j < len(keys)-1; j++ { + elem := keys[j] + for i := 1; i < j; i++ { + if keys[i] == elem { + return false + } + } + } + return true +} + +// NewWithKeys creates a new Filter from user-supplied origKeys +func NewWithKeys(m uint64, origKeys []uint64) (f *Filter, err error) { + bits, err := newBits(m) + if err != nil { + return nil, err + } + keys, err := newKeysCopy(origKeys) + if err != nil { + return nil, err + } + return &Filter{ + m: m, + n: 0, + bits: bits, + keys: keys, + }, nil +} + +func newBits(m uint64) ([]uint64, error) { + if m < MMin { + return nil, errM() + } + return make([]uint64, (m+63)/64), nil +} + +func newKeysBlank(k uint64) ([]uint64, error) { + if k < KMin { + return nil, errK() + } + return make([]uint64, k), nil +} + +func newKeysCopy(origKeys []uint64) (keys []uint64, err error) { + if !UniqueKeys(origKeys) { + return nil, errUniqueKeys() + } + keys, err = newKeysBlank(uint64(len(origKeys))) + if err != nil { + return keys, err + } + copy(keys, origKeys) + return keys, err +} + +func newWithKeysAndBits(m uint64, keys []uint64, bits []uint64, n uint64) ( + f *Filter, err error, +) { + f, err = NewWithKeys(m, keys) + if err != nil { + return nil, err + } + copy(f.bits, bits) + f.n = n + return f, nil +} diff --git a/vendor/github.com/steakknife/bloomfilter/optimal.go b/vendor/github.com/steakknife/bloomfilter/optimal.go new file mode 100644 index 000000000000..a8361434a59f --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/optimal.go @@ -0,0 +1,28 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import "math" + +const gigabitsPerGiB float64 = 8.0 * 1024 * 1024 * 1024 + +// OptimalK calculates the optimal k value for creating a new Bloom filter +// maxn is the maximum anticipated number of elements +func OptimalK(m, maxN uint64) uint64 { + return uint64(math.Ceil(float64(m) * math.Ln2 / float64(maxN))) +} + +// OptimalM calculates the optimal m value for creating a new Bloom filter +// p is the desired false positive probability +// optimal m = ceiling( - n * ln(p) / ln(2)**2 ) +func OptimalM(maxN uint64, p float64) uint64 { + return uint64(math.Ceil(-float64(maxN) * math.Log(p) / (math.Ln2 * math.Ln2))) +} diff --git a/vendor/github.com/steakknife/bloomfilter/statistics.go b/vendor/github.com/steakknife/bloomfilter/statistics.go new file mode 100644 index 000000000000..fe50ffa544e6 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/statistics.go @@ -0,0 +1,43 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "math" + + "github.com/steakknife/hamming" +) + +// PreciseFilledRatio is an exhaustive count # of 1's +func (f *Filter) PreciseFilledRatio() float64 { + f.lock.RLock() + defer f.lock.RUnlock() + + return float64(hamming.CountBitsUint64s(f.bits)) / float64(f.M()) +} + +// N is how many elements have been inserted +// (actually, how many Add()s have been performed?) +func (f *Filter) N() uint64 { + f.lock.RLock() + defer f.lock.RUnlock() + + return f.n +} + +// FalsePosititveProbability is the upper-bound probability of false positives +// (1 - exp(-k*(n+0.5)/(m-1))) ** k +func (f *Filter) FalsePosititveProbability() float64 { + k := float64(f.K()) + n := float64(f.N()) + m := float64(f.M()) + return math.Pow(1.0-math.Exp(-k)*(n+0.5)/(m-1), k) +} diff --git a/vendor/github.com/steakknife/bloomfilter/textmarshaler.go b/vendor/github.com/steakknife/bloomfilter/textmarshaler.go new file mode 100644 index 000000000000..7ed08eb7f9b3 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/textmarshaler.go @@ -0,0 +1,49 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import "fmt" + +// MarshalText conforms to encoding.TextMarshaler +func (f *Filter) MarshalText() (text []byte, err error) { + f.lock.RLock() + defer f.lock.RUnlock() + + s := fmt.Sprintln("k") + s += fmt.Sprintln(f.K()) + s += fmt.Sprintln("n") + s += fmt.Sprintln(f.n) + s += fmt.Sprintln("m") + s += fmt.Sprintln(f.m) + + s += fmt.Sprintln("keys") + for key := range f.keys { + s += fmt.Sprintf(keyFormat, key) + nl() + } + + s += fmt.Sprintln("bits") + for w := range f.bits { + s += fmt.Sprintf(bitsFormat, w) + nl() + } + + _, hash, err := f.marshal() + if err != nil { + return nil, err + } + s += fmt.Sprintln("sha384") + for b := range hash { + s += fmt.Sprintf("%02x", b) + } + s += nl() + + text = []byte(s) + return text, nil +} diff --git a/vendor/github.com/steakknife/bloomfilter/textunmarshaler.go b/vendor/github.com/steakknife/bloomfilter/textunmarshaler.go new file mode 100644 index 000000000000..93240a1a7dd1 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/textunmarshaler.go @@ -0,0 +1,150 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "bytes" + "crypto/hmac" + "crypto/sha512" + "fmt" + "io" +) + +const ( + keyFormat = "%016x" + bitsFormat = "%016x" +) + +func nl() string { + return fmt.Sprintln() +} + +func unmarshalTextHeader(r io.Reader) (k, n, m uint64, err error) { + format := "k" + nl() + "%d" + nl() + format += "n" + nl() + "%d" + nl() + format += "m" + nl() + "%d" + nl() + format += "keys" + nl() + + _, err = fmt.Fscanf(r, format, k, n, m) + return k, n, m, err +} + +func unmarshalTextKeys(r io.Reader, keys []uint64) (err error) { + for i := range keys { + _, err = fmt.Fscanf(r, keyFormat, keys[i]) + if err != nil { + return err + } + } + return nil +} + +func unmarshalTextBits(r io.Reader, bits []uint64) (err error) { + _, err = fmt.Fscanf(r, "bits") + if err != nil { + return err + } + + for i := range bits { + _, err = fmt.Fscanf(r, bitsFormat, bits[i]) + if err != nil { + return err + } + } + + return nil +} + +func unmarshalAndCheckTextHash(r io.Reader, f *Filter) (err error) { + _, err = fmt.Fscanf(r, "sha384") + if err != nil { + return err + } + + actualHash := [sha512.Size384]byte{} + + for i := range actualHash { + _, err = fmt.Fscanf(r, "%02x", actualHash[i]) + if err != nil { + return err + } + } + + _, expectedHash, err := f.marshal() + if err != nil { + return err + } + + if !hmac.Equal(expectedHash[:], actualHash[:]) { + return errHash() + } + + return nil +} + +// UnmarshalText conforms to TextUnmarshaler +func UnmarshalText(text []byte) (f *Filter, err error) { + r := bytes.NewBuffer(text) + k, n, m, err := unmarshalTextHeader(r) + if err != nil { + return nil, err + } + + keys, err := newKeysBlank(k) + if err != nil { + return nil, err + } + + err = unmarshalTextKeys(r, keys) + if err != nil { + return nil, err + } + + bits, err := newBits(m) + if err != nil { + return nil, err + } + + err = unmarshalTextBits(r, bits) + if err != nil { + return nil, err + } + + f, err = newWithKeysAndBits(m, keys, bits, n) + if err != nil { + return nil, err + } + + err = unmarshalAndCheckTextHash(r, f) + if err != nil { + return nil, err + } + + return f, nil +} + +// UnmarshalText method overwrites f with data decoded from text +func (f *Filter) UnmarshalText(text []byte) error { + f.lock.Lock() + defer f.lock.Unlock() + + f2, err := UnmarshalText(text) + if err != nil { + return err + } + + f.m = f2.m + f.n = f2.n + copy(f.bits, f2.bits) + copy(f.keys, f2.keys) + + return nil +} diff --git a/vendor/github.com/steakknife/hamming/MIT-LICENSE.txt b/vendor/github.com/steakknife/hamming/MIT-LICENSE.txt new file mode 100644 index 000000000000..924f4c0918e9 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/MIT-LICENSE.txt @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright © 2014, 2015, 2016 Barry Allard + +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. diff --git a/vendor/github.com/steakknife/hamming/README.md b/vendor/github.com/steakknife/hamming/README.md new file mode 100644 index 000000000000..23f69bdf5e9b --- /dev/null +++ b/vendor/github.com/steakknife/hamming/README.md @@ -0,0 +1,82 @@ +[![GoDoc](https://godoc.org/github.com/steakknife/hamming?status.png)](https://godoc.org/github.com/steakknife/hamming) [![Build Status](https://travis-ci.org/steakknife/hamming.svg?branch=master)](https://travis-ci.org/steakknife/hamming) + + +# hamming distance calculations in Go + +Copyright © 2014, 2015, 2016, 2018 Barry Allard + +[MIT license](MIT-LICENSE.txt) + +## Performance + +``` +$ go test -bench=. +BenchmarkCountBitsInt8PopCnt-4 300000000 4.30 ns/op +BenchmarkCountBitsInt16PopCnt-4 300000000 3.83 ns/op +BenchmarkCountBitsInt32PopCnt-4 300000000 3.64 ns/op +BenchmarkCountBitsInt64PopCnt-4 500000000 3.60 ns/op +BenchmarkCountBitsIntPopCnt-4 300000000 5.72 ns/op +BenchmarkCountBitsUint8PopCnt-4 1000000000 2.98 ns/op +BenchmarkCountBitsUint16PopCnt-4 500000000 3.23 ns/op +BenchmarkCountBitsUint32PopCnt-4 500000000 3.00 ns/op +BenchmarkCountBitsUint64PopCnt-4 1000000000 2.94 ns/op +BenchmarkCountBitsUintPopCnt-4 300000000 5.04 ns/op +BenchmarkCountBitsBytePopCnt-4 300000000 3.99 ns/op +BenchmarkCountBitsRunePopCnt-4 300000000 3.83 ns/op +BenchmarkCountBitsInt8-4 2000000000 0.74 ns/op +BenchmarkCountBitsInt16-4 2000000000 1.54 ns/op +BenchmarkCountBitsInt32-4 1000000000 2.63 ns/op +BenchmarkCountBitsInt64-4 1000000000 2.56 ns/op +BenchmarkCountBitsInt-4 200000000 7.23 ns/op +BenchmarkCountBitsUint16-4 2000000000 1.51 ns/op +BenchmarkCountBitsUint32-4 500000000 4.00 ns/op +BenchmarkCountBitsUint64-4 1000000000 2.64 ns/op +BenchmarkCountBitsUint64Alt-4 200000000 7.60 ns/op +BenchmarkCountBitsUint-4 300000000 5.48 ns/op +BenchmarkCountBitsUintReference-4 100000000 19.2 ns/op +BenchmarkCountBitsByte-4 2000000000 0.75 ns/op +BenchmarkCountBitsByteAlt-4 1000000000 2.37 ns/op +BenchmarkCountBitsRune-4 500000000 2.85 ns/op +PASS +ok _/Users/bmf/Projects/hamming 58.305s +$ +``` + +## Usage + +```go +import 'github.com/steakknife/hamming' + +// ... + +// hamming distance between values +hamming.Byte(0xFF, 0x00) // 8 +hamming.Byte(0x00, 0x00) // 0 + +// just count bits in a byte +hamming.CountBitsByte(0xA5), // 4 +``` + +See help in the [docs](https://godoc.org/github.com/steakknife/hamming) + +## Get + + go get -u github.com/steakknife/hamming # master is always stable + +## Source + +- On the web: https://github.com/steakknife/hamming + +- Git: `git clone https://github.com/steakknife/hamming` + +## Contact + +- [Feedback](mailto:barry.allard@gmail.com) + +- [Issues](https://github.com/steakknife/hamming/issues) + +## License + +[MIT license](MIT-LICENSE.txt) + +Copyright © 2014, 2015, 2016 Barry Allard diff --git a/vendor/github.com/steakknife/hamming/doc.go b/vendor/github.com/steakknife/hamming/doc.go new file mode 100644 index 000000000000..179e29da9274 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/doc.go @@ -0,0 +1,35 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +// +// Usage +// +// For functions named CountBits.+s?. The plural forms are for slices. +// The CountBits.+ forms are Population Count only, where the bare-type +// forms are Hamming distance (number of bits different) between two values. +// +// Optimized assembly .+PopCnt forms are available on amd64, and operate just +// like the regular forms (Must check and guard on HasPopCnt() first before +// trying to call .+PopCnt functions). +// +// import 'github.com/steakknife/hamming' +// +// // ... +// +// // hamming distance between values +// hamming.Byte(0xFF, 0x00) // 8 +// hamming.Byte(0x00, 0x00) // 0 +// +// // just count bits in a byte +// hamming.CountBitsByte(0xA5), // 4 +// +// Got rune? use int32 +// Got uint8? use byte +// +package hamming diff --git a/vendor/github.com/steakknife/hamming/hamming.go b/vendor/github.com/steakknife/hamming/hamming.go new file mode 100644 index 000000000000..269e91a4d1d6 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/hamming.go @@ -0,0 +1,70 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +// Int8 hamming distance of two int8's +func Int8(x, y int8) int { + return CountBitsInt8(x ^ y) +} + +// Int16 hamming distance of two int16's +func Int16(x, y int16) int { + return CountBitsInt16(x ^ y) +} + +// Int32 hamming distance of two int32's +func Int32(x, y int32) int { + return CountBitsInt32(x ^ y) +} + +// Int64 hamming distance of two int64's +func Int64(x, y int64) int { + return CountBitsInt64(x ^ y) +} + +// Int hamming distance of two ints +func Int(x, y int) int { + return CountBitsInt(x ^ y) +} + +// Uint8 hamming distance of two uint8's +func Uint8(x, y uint8) int { + return CountBitsUint8(x ^ y) +} + +// Uint16 hamming distance of two uint16's +func Uint16(x, y uint16) int { + return CountBitsUint16(x ^ y) +} + +// Uint32 hamming distance of two uint32's +func Uint32(x, y uint32) int { + return CountBitsUint32(x ^ y) +} + +// Uint64 hamming distance of two uint64's +func Uint64(x, y uint64) int { + return CountBitsUint64(x ^ y) +} + +// Uint hamming distance of two uint's +func Uint(x, y uint) int { + return CountBitsUint(x ^ y) +} + +// Byte hamming distance of two bytes +func Byte(x, y byte) int { + return CountBitsByte(x ^ y) +} + +// Rune hamming distance of two runes +func Rune(x, y rune) int { + return CountBitsRune(x ^ y) +} diff --git a/vendor/github.com/steakknife/hamming/popcnt_amd64.go b/vendor/github.com/steakknife/hamming/popcnt_amd64.go new file mode 100644 index 000000000000..a1a6d92bdec2 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcnt_amd64.go @@ -0,0 +1,65 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +import "strconv" + +// HasPopCnt returns true if *PopCnt functions are callable +func HasPopCnt() (ret bool) + +// CountBitsInt8PopCnt count 1's in x +func CountBitsInt8PopCnt(x int8) (ret int) + +// CountBitsInt16PopCnt count 1's in x +func CountBitsInt16PopCnt(x int16) (ret int) + +// CountBitsInt32PopCnt count 1's in x +func CountBitsInt32PopCnt(x int32) (ret int) + +// CountBitsInt64PopCnt count 1's in x +func CountBitsInt64PopCnt(x int64) (ret int) + +// CountBitsIntPopCnt count 1's in x +func CountBitsIntPopCnt(x int) int { + if strconv.IntSize == 64 { + return CountBitsInt64PopCnt(int64(x)) + } else if strconv.IntSize == 32 { + return CountBitsInt32PopCnt(int32(x)) + } + panic("strconv.IntSize must be 32 or 64") +} + +// CountBitsUint8PopCnt count 1's in x +func CountBitsUint8PopCnt(x uint8) (ret int) + +// CountBitsUint16PopCnt count 1's in x +func CountBitsUint16PopCnt(x uint16) (ret int) + +// CountBitsUint32PopCnt count 1's in x +func CountBitsUint32PopCnt(x uint32) (ret int) + +// CountBitsUint64PopCnt count 1's in x +func CountBitsUint64PopCnt(x uint64) (ret int) + +// CountBitsUintPopCnt count 1's in x +func CountBitsUintPopCnt(x uint) int { + if strconv.IntSize == 64 { + return CountBitsUint64PopCnt(uint64(x)) + } else if strconv.IntSize == 32 { + return CountBitsUint32PopCnt(uint32(x)) + } + panic("strconv.IntSize must be 32 or 64") +} + +// CountBitsBytePopCnt count 1's in x +func CountBitsBytePopCnt(x byte) (ret int) + +// CountBitsRunePopCnt count 1's in x +func CountBitsRunePopCnt(x rune) (ret int) diff --git a/vendor/github.com/steakknife/hamming/popcnt_amd64.s b/vendor/github.com/steakknife/hamming/popcnt_amd64.s new file mode 100644 index 000000000000..51c51248a3d8 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcnt_amd64.s @@ -0,0 +1,64 @@ +// +// hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016 Barry Allard +// +// MIT license +// + +#include "textflag.h" + +TEXT ·CountBitsInt8PopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsBytePopCnt(SB) + +TEXT ·CountBitsInt16PopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint16PopCnt(SB) + +TEXT ·CountBitsInt32PopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint32PopCnt(SB) + +TEXT ·CountBitsInt64PopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint64PopCnt(SB) + +TEXT ·CountBitsBytePopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint8PopCnt(SB) + +TEXT ·CountBitsRunePopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint32PopCnt(SB) + +TEXT ·CountBitsUint8PopCnt(SB),NOSPLIT,$0 + XORQ AX, AX + MOVB x+0(FP), AX + POPCNTQ AX, AX + MOVQ AX, ret+8(FP) + RET + +TEXT ·CountBitsUint16PopCnt(SB),NOSPLIT,$0 + XORQ AX, AX + MOVW x+0(FP), AX + POPCNTQ AX, AX + MOVQ AX, ret+8(FP) + RET + +TEXT ·CountBitsUint32PopCnt(SB),NOSPLIT,$0 + XORQ AX, AX + MOVL x+0(FP), AX + POPCNTQ AX, AX + MOVQ AX, ret+8(FP) + RET + +TEXT ·CountBitsUint64PopCnt(SB),NOSPLIT,$0 + POPCNTQ x+0(FP), AX + MOVQ AX, ret+8(FP) + RET + +// func hasPopCnt() (ret bool) +TEXT ·HasPopCnt(SB),NOSPLIT,$0 + MOVL $1, AX + CPUID + SHRL $23, CX // bit 23: Advanced Bit Manipulation Bit (ABM) -> POPCNTQ + ANDL $1, CX + MOVB CX, ret+0(FP) + RET diff --git a/vendor/github.com/steakknife/hamming/popcount.go b/vendor/github.com/steakknife/hamming/popcount.go new file mode 100644 index 000000000000..848103bbf5f6 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcount.go @@ -0,0 +1,134 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +import "strconv" + +// References: check out Hacker's Delight, about p. 70 + +func table() [256]uint8 { + return [256]uint8{ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, + } +} + +// CountBitsByteAlt table-less, branch-free implementation +func CountBitsByteAlt(x byte) int { + x = (x & 0x55) + ((x >> 1) & 0x55) + x = (x & 0x33) + ((x >> 2) & 0x33) + return int((x & 0x0f) + ((x >> 4) & 0x0f)) +} + +// CountBitsInt8 count 1's in x +func CountBitsInt8(x int8) int { return CountBitsByte(byte(x)) } + +// CountBitsInt16 count 1's in x +func CountBitsInt16(x int16) int { return CountBitsUint16(uint16(x)) } + +// CountBitsInt32 count 1's in x +func CountBitsInt32(x int32) int { return CountBitsUint32(uint32(x)) } + +// CountBitsInt64 count 1's in x +func CountBitsInt64(x int64) int { return CountBitsUint64(uint64(x)) } + +// CountBitsInt count 1's in x +func CountBitsInt(x int) int { return CountBitsUint(uint(x)) } + +// CountBitsByte count 1's in x +func CountBitsByte(x byte) int { return CountBitsUint8(x) } + +// CountBitsRune count 1's in x +func CountBitsRune(x rune) int { return CountBitsInt32(x) } + +// CountBitsUint8 count 1's in x +func CountBitsUint8(x uint8) int { return int(table()[x]) } + +// CountBitsUint16 count 1's in x +func CountBitsUint16(x uint16) int { + return int(table()[x&0xFF] + table()[(x>>8)&0xFF]) +} + +const ( + m1d uint32 = 0x55555555 + m2d = 0x33333333 + m4d = 0x0f0f0f0f +) + +// CountBitsUint32 count 1's in x +func CountBitsUint32(x uint32) int { + x -= ((x >> 1) & m1d) + x = (x & m2d) + ((x >> 2) & m2d) + x = (x + (x >> 4)) & m4d + x += x >> 8 + x += x >> 16 + return int(x & 0x3f) +} + +const ( + m1q uint64 = 0x5555555555555555 + m2q = 0x3333333333333333 + m4q = 0x0f0f0f0f0f0f0f0f + hq = 0x0101010101010101 +) + +// CountBitsUint64 count 1's in x +func CountBitsUint64(x uint64) int { + // put count of each 2 bits into those 2 bits + x -= (x >> 1) & m1q + + // put count of each 4 bits into those 4 bits + x = (x & m2q) + ((x >> 2) & m2q) + + // put count of each 8 bits into those 8 bits + x = (x + (x >> 4)) & m4q + + // returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ... + return int((x * hq) >> 56) +} + +// CountBitsUint64Alt count 1's in x +func CountBitsUint64Alt(x uint64) int { + return CountBitsUint32(uint32(x>>32)) + CountBitsUint32(uint32(x)) +} + +// CountBitsUintReference count 1's in x +func CountBitsUintReference(x uint) int { + c := 0 + for x != 0 { + x &= x - 1 + c++ + } + return c +} + +// CountBitsUint count 1's in x +func CountBitsUint(x uint) int { + if strconv.IntSize == 64 { + return CountBitsUint64(uint64(x)) + } else if strconv.IntSize == 32 { + return CountBitsUint32(uint32(x)) + } + panic("strconv.IntSize must be 32 or 64 bits") +} diff --git a/vendor/github.com/steakknife/hamming/popcount_slices.go b/vendor/github.com/steakknife/hamming/popcount_slices.go new file mode 100644 index 000000000000..957fe1165314 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcount_slices.go @@ -0,0 +1,123 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +// CountBitsInt8s count 1's in b +func CountBitsInt8s(b []int8) int { + c := 0 + for _, x := range b { + c += CountBitsInt8(x) + } + return c +} + +// CountBitsInt16s count 1's in b +func CountBitsInt16s(b []int16) int { + c := 0 + for _, x := range b { + c += CountBitsInt16(x) + } + return c +} + +// CountBitsInt32s count 1's in b +func CountBitsInt32s(b []int32) int { + c := 0 + for _, x := range b { + c += CountBitsInt32(x) + } + return c +} + +// CountBitsInt64s count 1's in b +func CountBitsInt64s(b []int64) int { + c := 0 + for _, x := range b { + c += CountBitsInt64(x) + } + return c +} + +// CountBitsInts count 1's in b +func CountBitsInts(b []int) int { + c := 0 + for _, x := range b { + c += CountBitsInt(x) + } + return c +} + +// CountBitsUint8s count 1's in b +func CountBitsUint8s(b []uint8) int { + c := 0 + for _, x := range b { + c += CountBitsUint8(x) + } + return c +} + +// CountBitsUint16s count 1's in b +func CountBitsUint16s(b []uint16) int { + c := 0 + for _, x := range b { + c += CountBitsUint16(x) + } + return c +} + +// CountBitsUint32s count 1's in b +func CountBitsUint32s(b []uint32) int { + c := 0 + for _, x := range b { + c += CountBitsUint32(x) + } + return c +} + +// CountBitsUint64s count 1's in b +func CountBitsUint64s(b []uint64) int { + c := 0 + for _, x := range b { + c += CountBitsUint64(x) + } + return c +} + +// CountBitsUints count 1's in b +func CountBitsUints(b []uint) int { + c := 0 + for _, x := range b { + c += CountBitsUint(x) + } + return c +} + +// CountBitsBytes count 1's in b +func CountBitsBytes(b []byte) int { + c := 0 + for _, x := range b { + c += CountBitsByte(x) + } + return c +} + +// CountBitsRunes count 1's in b +func CountBitsRunes(b []rune) int { + c := 0 + for _, x := range b { + c += CountBitsRune(x) + } + return c +} + +// CountBitsString count 1's in s +func CountBitsString(s string) int { + return CountBitsBytes([]byte(s)) +} diff --git a/vendor/github.com/steakknife/hamming/popcount_slices_amd64.go b/vendor/github.com/steakknife/hamming/popcount_slices_amd64.go new file mode 100644 index 000000000000..b3e13fdf9496 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcount_slices_amd64.go @@ -0,0 +1,72 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +import ( + "strconv" + "unsafe" +) + +// CountBitsInt8sPopCnt count 1's in x +func CountBitsInt8sPopCnt(x []int8) (ret int) + +// CountBitsInt16sPopCnt count 1's in x +func CountBitsInt16sPopCnt(x []int16) (ret int) + +// CountBitsInt32sPopCnt count 1's in x +func CountBitsInt32sPopCnt(x []int32) (ret int) + +// CountBitsInt64sPopCnt count 1's in x +func CountBitsInt64sPopCnt(x []int64) (ret int) + +// CountBitsIntsPopCnt count 1's in x +func CountBitsIntsPopCnt(x []int) int { + if strconv.IntSize == 64 { + y := (*[]int64)(unsafe.Pointer(&x)) // #nosec G103 + return CountBitsInt64sPopCnt(*y) + } else if strconv.IntSize == 32 { + y := (*[]int32)(unsafe.Pointer(&x)) // #nosec G103 + return CountBitsInt32sPopCnt(*y) + } + panic("strconv.IntSize must be 32 or 64 bits") +} + +// CountBitsUint8sPopCnt count 1's in x +func CountBitsUint8sPopCnt(x []uint8) (ret int) + +// CountBitsUint16sPopCnt count 1's in x +func CountBitsUint16sPopCnt(x []uint16) (ret int) + +// CountBitsUint32sPopCnt count 1's in x +func CountBitsUint32sPopCnt(x []uint32) (ret int) + +// CountBitsUint64sPopCnt count 1's in x +func CountBitsUint64sPopCnt(x []uint64) (ret int) + +// CountBitsUintsPopCnt count 1's in x +func CountBitsUintsPopCnt(x []uint) int { + if strconv.IntSize == 64 { + y := (*[]uint64)(unsafe.Pointer(&x)) // #nosec G103 + return CountBitsUint64sPopCnt(*y) + } else if strconv.IntSize == 32 { + y := (*[]uint32)(unsafe.Pointer(&x)) // #nosec G103 + return CountBitsUint32sPopCnt(*y) + } + panic("strconv.IntSize must be 32 or 64 bits") +} + +// CountBitsBytesPopCnt count 1's in x +func CountBitsBytesPopCnt(x []byte) (ret int) + +// CountBitsRunesPopCnt count 1's in x +func CountBitsRunesPopCnt(x []rune) (ret int) + +// CountBitsStringPopCnt count 1's in s +func CountBitsStringPopCnt(s string) (ret int) diff --git a/vendor/github.com/steakknife/hamming/popcount_slices_amd64.s b/vendor/github.com/steakknife/hamming/popcount_slices_amd64.s new file mode 100644 index 000000000000..b6b8c7835ad9 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcount_slices_amd64.s @@ -0,0 +1,370 @@ +// +// hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016 Barry Allard +// +// MIT license +// + +#include "textflag.h" + +// type SliceHeader struct { +// Data uintptr 0 +// Len int 8 +// Cap int 16 +// } + +// 0 x.Data +// 8 x.Len +// 16 x.Cap +// 24 ret + +// type StringHeader struct { +// Data uintptr 0 +// Len int 8 +// } + +// 0 x.Data +// 8 x.Len +// 16 ret + +// func CountBitsInt8sPopCnt(x []int8) (ret int) +TEXT ·CountBitsInt8sPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint8sPopCnt(SB) + +// func CountBitsInt16sPopCnt(x []int16) (ret int) +TEXT ·CountBitsInt16sPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint16sPopCnt(SB) + +// func CountBitsInt32sPopCnt(x []int32) (ret int) +TEXT ·CountBitsInt32sPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint32sPopCnt(SB) + +// func CountBitsInt64sPopCnt(x []int64) (ret int) +TEXT ·CountBitsInt64sPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint64sPopCnt(SB) + +// func CountBitsUint8sPopCnt(x []uint8) (ret int) +TEXT ·CountBitsUint8sPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + +test_negative_slice_len: + MOVQ CX, BX // x.Len < 0 ---> x.Len[63] != 0 + SHRQ $63, BX + JNZ done + + MOVQ x+0(FP), DI // x.Data -> DI + + CMPQ CX, $32 // x.Len >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 + ADDQ R10, R9 + POPCNTQ 8(DI), R11 + ADDQ R11, AX + POPCNTQ 16(DI), R12 + ADDQ R12, BX + POPCNTQ 24(DI), R13 + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX + +remainder_loop: + MOVB 0(DI), DL + POPCNTQ DX, BX + ADDQ BX, AX + + INCQ DI + DECQ CX + JNZ remainder_loop + +done: + MOVQ AX, ret+24(FP) + RET + +// func CountBitsUint16sPopCnt(x []uint16) (ret int) +TEXT ·CountBitsUint16sPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + +test_negative_slice_len: + MOVQ CX, BX // x.Len*2 < 0 ---> x.Len[63:62] != 0 + SHLQ $1, CX + SHRQ $62, BX + JNZ done + + MOVQ x+0(FP), DI // x.Data -> DI + + + CMPQ CX, $32 // x.Len*2 >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 + ADDQ R10, R9 + POPCNTQ 8(DI), R11 + ADDQ R11, AX + POPCNTQ 16(DI), R12 + ADDQ R12, BX + POPCNTQ 24(DI), R13 + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len*2 >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX + +remainder_loop: + MOVW 0(DI), DX + POPCNTQ DX, BX + ADDQ BX, AX + + ADDQ $2, DI + SUBQ $2, CX + JNZ remainder_loop + +done: + MOVQ AX, ret+24(FP) + RET + +// func CountBitsUint32sPopCnt(x []uint32) (ret int) +TEXT ·CountBitsUint32sPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + MOVQ CX, BX + MOVQ x+0(FP), DI // x.Data -> DI + +test_negative_slice_len: + SHLQ $2, CX // x.Len*4 < 0 ---> x.Len[63:61] != 0 + SHRQ $61, BX + JNZ done + + + + CMPQ CX, $32 // x.Len*4 >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 // r9 += popcntq(QW DI+0) + ADDQ R10, R9 + POPCNTQ 8(DI), R11 // ax += popcntq(QW DI+8) + ADDQ R11, AX + POPCNTQ 16(DI), R12 // bx += popcntq(QW DI+16) + ADDQ R12, BX + POPCNTQ 24(DI), R13 // dx += popcntq(QW DI+24) + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len*4 >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX // ax = (ax + r9) + (bx + dx) + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX +remainder_loop: + MOVB (DI), DX // ax += popcnt(DB 0(DI)) + POPCNTQ DX, BX + ADDQ BX, AX + + INCQ DI + DECQ CX + JNZ remainder_loop + +done: + MOVQ AX, ret+24(FP) + RET + +// func CountBitsUint64sPopCnt(x []uint64) (ret int) +TEXT ·CountBitsUint64sPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + +test_negative_slice_len: + MOVQ CX, BX // x.Len*8 < 0 ---> x.Len[63:60] != 0 + SHLQ $3, CX + SHRQ $60, BX + JNZ done + + MOVQ x+0(FP), DI // x.Data -> DI + + + CMPQ CX, $32 // x.Len*8 >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 + ADDQ R10, R9 + POPCNTQ 8(DI), R11 + ADDQ R11, AX + POPCNTQ 16(DI), R12 + ADDQ R12, BX + POPCNTQ 24(DI), R13 + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len*4 >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX + +remainder_loop: + MOVQ 0(DI), DX + POPCNTQ DX, BX + ADDQ BX, AX + + ADDQ $8, DI + SUBQ $8, CX + JNZ remainder_loop + +done: + MOVQ AX, ret+24(FP) + RET + +// func CountBitsBytesPopCnt(x []byte) (ret int) +TEXT ·CountBitsBytesPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint8sPopCnt(SB) + +// func CountBitsRunesPopCnt(x []rune) (ret int) +TEXT ·CountBitsRunesPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint32sPopCnt(SB) + +// func CountBitsStringPopCnt(s string) (ret int) +TEXT ·CountBitsStringPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + +test_negative_slice_len: + MOVQ CX, BX // x.Len < 0 ---> x.Len[63] != 0 + SHRQ $63, BX + JNZ done + + MOVQ x+0(FP), DI // x.Data -> DI + + CMPQ CX, $32 // x.Len >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 + ADDQ R10, R9 + POPCNTQ 8(DI), R11 + ADDQ R11, AX + POPCNTQ 16(DI), R12 + ADDQ R12, BX + POPCNTQ 24(DI), R13 + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX + +remainder_loop: + MOVB 0(DI), DL + POPCNTQ DX, BX + ADDQ BX, AX + + INCQ DI + DECQ CX + JNZ remainder_loop + +done: + MOVQ AX, ret+16(FP) + RET diff --git a/vendor/github.com/steakknife/hamming/slices_of_hamming.go b/vendor/github.com/steakknife/hamming/slices_of_hamming.go new file mode 100644 index 000000000000..82ce948fac7c --- /dev/null +++ b/vendor/github.com/steakknife/hamming/slices_of_hamming.go @@ -0,0 +1,144 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +// Int8s hamming distance of two int8 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Int8s(b0, b1 []int8) int { + d := 0 + for i, x := range b0 { + d += Int8(x, b1[i]) + } + return d +} + +// Int16s hamming distance of two int16 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Int16s(b0, b1 []int16) int { + d := 0 + for i, x := range b0 { + d += Int16(x, b1[i]) + } + return d +} + +// Int32s hamming distance of two int32 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Int32s(b0, b1 []int32) int { + d := 0 + for i, x := range b0 { + d += Int32(x, b1[i]) + } + return d +} + +// Int64s hamming distance of two int64 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Int64s(b0, b1 []int64) int { + d := 0 + for i, x := range b0 { + d += Int64(x, b1[i]) + } + return d +} + +// Ints hamming distance of two int buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Ints(b0, b1 []int) int { + d := 0 + for i, x := range b0 { + d += Int(x, b1[i]) + } + return d +} + +// Uint8s hamming distance of two uint8 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uint8s(b0, b1 []uint8) int { + d := 0 + for i, x := range b0 { + d += Uint8(x, b1[i]) + } + return d +} + +// Uint16s hamming distance of two uint16 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uint16s(b0, b1 []uint16) int { + d := 0 + for i, x := range b0 { + d += Uint16(x, b1[i]) + } + return d +} + +// Uint32s hamming distance of two uint32 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uint32s(b0, b1 []uint32) int { + d := 0 + for i, x := range b0 { + d += Uint32(x, b1[i]) + } + return d +} + +// Uint64s hamming distance of two uint64 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uint64s(b0, b1 []uint64) int { + d := 0 + for i, x := range b0 { + d += Uint64(x, b1[i]) + } + return d +} + +// Uints hamming distance of two uint buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uints(b0, b1 []uint) int { + d := 0 + for i, x := range b0 { + d += Uint(x, b1[i]) + } + return d +} + +// Bytes hamming distance of two byte buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Bytes(b0, b1 []byte) int { + d := 0 + for i, x := range b0 { + d += Byte(x, b1[i]) + } + return d +} + +// Runes hamming distance of two rune buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Runes(b0, b1 []rune) int { + d := 0 + for i, x := range b0 { + d += Rune(x, b1[i]) + } + return d +} + +// Strings hamming distance of two strings, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Strings(b0, b1 string) int { + return Runes(runes(b0), runes(b1)) +} + +// runize string +func runes(s string) (r []rune) { + for _, ch := range s { + r = append(r, ch) + } + return +} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go b/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go index c5940b232cda..c36ad323597e 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go @@ -331,7 +331,6 @@ func (r *Cache) delete(n *Node) bool { return deleted } } - return false } // Nodes returns number of 'cache node' in the map. diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go b/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go index 14dddf88dd20..abf9fb65c7a6 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go @@ -29,7 +29,7 @@ func (bytesComparer) Separator(dst, a, b []byte) []byte { // Do not shorten if one string is a prefix of the other } else if c := a[i]; c < 0xff && c+1 < b[i] { dst = append(dst, a[:i+1]...) - dst[i]++ + dst[len(dst)-1]++ return dst } return nil @@ -39,7 +39,7 @@ func (bytesComparer) Successor(dst, b []byte) []byte { for i, c := range b { if c != 0xff { dst = append(dst, b[:i+1]...) - dst[i]++ + dst[len(dst)-1]++ return dst } } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go b/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go index 14a28f16fcee..2c522db23b90 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go @@ -36,7 +36,7 @@ type Comparer interface { // by any users of this package. Name() string - // Bellow are advanced functions used used to reduce the space requirements + // Bellow are advanced functions used to reduce the space requirements // for internal data structures such as index blocks. // Separator appends a sequence of bytes x to dst such that a <= x && x < b, diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db.go b/vendor/github.com/syndtr/goleveldb/leveldb/db.go index e7ac0654187d..0de5ffe8d7a1 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db.go @@ -182,7 +182,7 @@ func Open(stor storage.Storage, o *opt.Options) (db *DB, err error) { err = s.recover() if err != nil { - if !os.IsNotExist(err) || s.o.GetErrorIfMissing() { + if !os.IsNotExist(err) || s.o.GetErrorIfMissing() || s.o.GetReadOnly() { return } err = s.create() @@ -468,7 +468,7 @@ func recoverTable(s *session, o *opt.Options) error { } // Commit. - return s.commit(rec) + return s.commit(rec, false) } func (db *DB) recoverJournal() error { @@ -538,7 +538,7 @@ func (db *DB) recoverJournal() error { rec.setJournalNum(fd.Num) rec.setSeqNum(db.seq) - if err := db.s.commit(rec); err != nil { + if err := db.s.commit(rec, false); err != nil { fr.Close() return err } @@ -617,7 +617,7 @@ func (db *DB) recoverJournal() error { // Commit. rec.setJournalNum(db.journalFd.Num) rec.setSeqNum(db.seq) - if err := db.s.commit(rec); err != nil { + if err := db.s.commit(rec, false); err != nil { // Close journal on error. if db.journal != nil { db.journal.Close() @@ -872,6 +872,10 @@ func (db *DB) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) { // DB. And a nil Range.Limit is treated as a key after all keys in // the DB. // +// WARNING: Any slice returned by interator (e.g. slice returned by calling +// Iterator.Key() or Iterator.Key() methods), its content should not be modified +// unless noted otherwise. +// // The iterator must be released after use, by calling Release method. // // Also read Iterator documentation of the leveldb/iterator package. @@ -953,15 +957,27 @@ func (db *DB) GetProperty(name string) (value string, err error) { value = "Compactions\n" + " Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB)\n" + "-------+------------+---------------+---------------+---------------+---------------\n" + var totalTables int + var totalSize, totalRead, totalWrite int64 + var totalDuration time.Duration for level, tables := range v.levels { duration, read, write := db.compStats.getStat(level) if len(tables) == 0 && duration == 0 { continue } + totalTables += len(tables) + totalSize += tables.size() + totalRead += read + totalWrite += write + totalDuration += duration value += fmt.Sprintf(" %3d | %10d | %13.5f | %13.5f | %13.5f | %13.5f\n", level, len(tables), float64(tables.size())/1048576.0, duration.Seconds(), float64(read)/1048576.0, float64(write)/1048576.0) } + value += "-------+------------+---------------+---------------+---------------+---------------\n" + value += fmt.Sprintf(" Total | %10d | %13.5f | %13.5f | %13.5f | %13.5f\n", + totalTables, float64(totalSize)/1048576.0, totalDuration.Seconds(), + float64(totalRead)/1048576.0, float64(totalWrite)/1048576.0) case p == "iostats": value = fmt.Sprintf("Read(MB):%.5f Write(MB):%.5f", float64(db.s.stor.reads())/1048576.0, @@ -1013,10 +1029,10 @@ type DBStats struct { BlockCacheSize int OpenedTablesCount int - LevelSizes []int64 + LevelSizes Sizes LevelTablesCounts []int - LevelRead []int64 - LevelWrite []int64 + LevelRead Sizes + LevelWrite Sizes LevelDurations []time.Duration } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go index 28e50906adb6..56f3632a7d29 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go @@ -260,7 +260,7 @@ func (db *DB) compactionCommit(name string, rec *sessionRecord) { db.compCommitLk.Lock() defer db.compCommitLk.Unlock() // Defer is necessary. db.compactionTransactFunc(name+"@commit", func(cnt *compactionTransactCounter) error { - return db.s.commit(rec) + return db.s.commit(rec, true) }, nil) } @@ -663,7 +663,7 @@ type cCmd interface { } type cAuto struct { - // Note for table compaction, an empty ackC represents it's a compaction waiting command. + // Note for table compaction, an non-empty ackC represents it's a compaction waiting command. ackC chan<- error } @@ -777,8 +777,8 @@ func (db *DB) mCompaction() { func (db *DB) tCompaction() { var ( - x cCmd - ackQ, waitQ []cCmd + x cCmd + waitQ []cCmd ) defer func() { @@ -787,10 +787,6 @@ func (db *DB) tCompaction() { panic(x) } } - for i := range ackQ { - ackQ[i].ack(ErrClosed) - ackQ[i] = nil - } for i := range waitQ { waitQ[i].ack(ErrClosed) waitQ[i] = nil @@ -821,11 +817,6 @@ func (db *DB) tCompaction() { waitQ = waitQ[:0] } } else { - for i := range ackQ { - ackQ[i].ack(nil) - ackQ[i] = nil - } - ackQ = ackQ[:0] for i := range waitQ { waitQ[i].ack(nil) waitQ[i] = nil @@ -844,9 +835,12 @@ func (db *DB) tCompaction() { switch cmd := x.(type) { case cAuto: if cmd.ackC != nil { - waitQ = append(waitQ, x) - } else { - ackQ = append(ackQ, x) + // Check the write pause state before caching it. + if db.resumeWrite() { + x.ack(nil) + } else { + waitQ = append(waitQ, x) + } } case cRange: x.ack(db.tableRangeCompaction(cmd.level, cmd.min, cmd.max)) diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go index 2c69d2e531d5..c2ad70c8476c 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go @@ -142,6 +142,10 @@ func (snap *Snapshot) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) // DB. And a nil Range.Limit is treated as a key after all keys in // the DB. // +// WARNING: Any slice returned by interator (e.g. slice returned by calling +// Iterator.Key() or Iterator.Value() methods), its content should not be +// modified unless noted otherwise. +// // The iterator must be released after use, by calling Release method. // Releasing the snapshot doesn't mean releasing the iterator too, the // iterator would be still valid until released. diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go index b8f7e7d21dfa..f145b64fbbce 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go @@ -69,6 +69,10 @@ func (tr *Transaction) Has(key []byte, ro *opt.ReadOptions) (bool, error) { // DB. And a nil Range.Limit is treated as a key after all keys in // the DB. // +// WARNING: Any slice returned by interator (e.g. slice returned by calling +// Iterator.Key() or Iterator.Key() methods), its content should not be modified +// unless noted otherwise. +// // The iterator must be released after use, by calling Release method. // // Also read Iterator documentation of the leveldb/iterator package. @@ -205,7 +209,7 @@ func (tr *Transaction) Commit() error { tr.stats.startTimer() var cerr error for retry := 0; retry < 3; retry++ { - cerr = tr.db.s.commit(&tr.rec) + cerr = tr.db.s.commit(&tr.rec, false) if cerr != nil { tr.db.logf("transaction@commit error R·%d %q", retry, cerr) select { diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go index 7ecd960d2ce2..3f0654894b44 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go @@ -84,7 +84,7 @@ func (db *DB) checkAndCleanFiles() error { var mfds []storage.FileDesc for num, present := range tmap { if !present { - mfds = append(mfds, storage.FileDesc{storage.TypeTable, num}) + mfds = append(mfds, storage.FileDesc{Type: storage.TypeTable, Num: num}) db.logf("db@janitor table missing @%d", num) } } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go index b16e3a704523..96fb0f6859ca 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go @@ -40,11 +40,11 @@ type IteratorSeeker interface { Seek(key []byte) bool // Next moves the iterator to the next key/value pair. - // It returns whether the iterator is exhausted. + // It returns false if the iterator is exhausted. Next() bool // Prev moves the iterator to the previous key/value pair. - // It returns whether the iterator is exhausted. + // It returns false if the iterator is exhausted. Prev() bool } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go b/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go index 44e7d9adce42..528b16423321 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go @@ -158,6 +158,12 @@ type Options struct { // The default value is 8MiB. BlockCacheCapacity int + // BlockCacheEvictRemoved allows enable forced-eviction on cached block belonging + // to removed 'sorted table'. + // + // The default if false. + BlockCacheEvictRemoved bool + // BlockRestartInterval is the number of keys between restart points for // delta encoding of keys. // @@ -384,6 +390,13 @@ func (o *Options) GetBlockCacheCapacity() int { return o.BlockCacheCapacity } +func (o *Options) GetBlockCacheEvictRemoved() bool { + if o == nil { + return false + } + return o.BlockCacheEvictRemoved +} + func (o *Options) GetBlockRestartInterval() int { if o == nil || o.BlockRestartInterval <= 0 { return DefaultBlockRestartInterval diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session.go b/vendor/github.com/syndtr/goleveldb/leveldb/session.go index 3f391f934622..7310209baff2 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/session.go @@ -47,15 +47,24 @@ type session struct { o *cachedOptions icmp *iComparer tops *tOps - fileRef map[int64]int manifest *journal.Writer manifestWriter storage.Writer manifestFd storage.FileDesc - stCompPtrs []internalKey // compaction pointers; need external synchronization - stVersion *version // current version - vmu sync.Mutex + stCompPtrs []internalKey // compaction pointers; need external synchronization + stVersion *version // current version + ntVersionId int64 // next version id to assign + refCh chan *vTask + relCh chan *vTask + deltaCh chan *vDelta + abandon chan int64 + closeC chan struct{} + closeW sync.WaitGroup + vmu sync.Mutex + + // Testing fields + fileRefCh chan chan map[int64]int // channel used to pass current reference stat } // Creates new initialized session instance. @@ -68,13 +77,21 @@ func newSession(stor storage.Storage, o *opt.Options) (s *session, err error) { return } s = &session{ - stor: newIStorage(stor), - storLock: storLock, - fileRef: make(map[int64]int), + stor: newIStorage(stor), + storLock: storLock, + refCh: make(chan *vTask), + relCh: make(chan *vTask), + deltaCh: make(chan *vDelta), + abandon: make(chan int64), + fileRefCh: make(chan chan map[int64]int), + closeC: make(chan struct{}), } s.setOptions(o) s.tops = newTableOps(s) - s.setVersion(newVersion(s)) + + s.closeW.Add(1) + go s.refLoop() + s.setVersion(nil, newVersion(s)) s.log("log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed") return } @@ -90,7 +107,11 @@ func (s *session) close() { } s.manifest = nil s.manifestWriter = nil - s.setVersion(&version{s: s, closing: true}) + s.setVersion(nil, &version{s: s, closing: true, id: s.ntVersionId}) + + // Close all background goroutines + close(s.closeC) + s.closeW.Wait() } // Release session lock. @@ -180,19 +201,27 @@ func (s *session) recover() (err error) { } s.manifestFd = fd - s.setVersion(staging.finish()) + s.setVersion(rec, staging.finish(false)) s.setNextFileNum(rec.nextFileNum) s.recordCommited(rec) return nil } // Commit session; need external synchronization. -func (s *session) commit(r *sessionRecord) (err error) { +func (s *session) commit(r *sessionRecord, trivial bool) (err error) { v := s.version() defer v.release() // spawn new version based on current version - nv := v.spawn(r) + nv := v.spawn(r, trivial) + + // abandon useless version id to prevent blocking version processing loop. + defer func() { + if err != nil { + s.abandon <- nv.id + s.logf("commit@abandon useless vid D%d", nv.id) + } + }() if s.manifest == nil { // manifest journal writer not yet created, create one @@ -203,7 +232,7 @@ func (s *session) commit(r *sessionRecord) (err error) { // finally, apply new version if no error rise if err == nil { - s.setVersion(nv) + s.setVersion(r, nv) } return diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go index 089cd00b26d5..f6030022de98 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go @@ -181,10 +181,14 @@ func (c *compaction) expand() { t0, t1 := c.levels[0], c.levels[1] imin, imax := t0.getRange(c.s.icmp) - // We expand t0 here just incase ukey hop across tables. - t0 = vt0.getOverlaps(t0, c.s.icmp, imin.ukey(), imax.ukey(), c.sourceLevel == 0) - if len(t0) != len(c.levels[0]) { - imin, imax = t0.getRange(c.s.icmp) + + // For non-zero levels, the ukey can't hop across tables at all. + if c.sourceLevel == 0 { + // We expand t0 here just incase ukey hop across tables. + t0 = vt0.getOverlaps(t0, c.s.icmp, imin.ukey(), imax.ukey(), c.sourceLevel == 0) + if len(t0) != len(c.levels[0]) { + imin, imax = t0.getRange(c.s.icmp) + } } t1 = vt1.getOverlaps(t1, c.s.icmp, imin.ukey(), imax.ukey(), false) // Get entire range covered by compaction. diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go b/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go index 92328933cc6a..67a6df979023 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go @@ -9,6 +9,7 @@ package leveldb import ( "fmt" "sync/atomic" + "time" "github.com/syndtr/goleveldb/leveldb/journal" "github.com/syndtr/goleveldb/leveldb/storage" @@ -36,22 +37,216 @@ func (s *session) logf(format string, v ...interface{}) { s.stor.Log(fmt.Sprintf func (s *session) newTemp() storage.FileDesc { num := atomic.AddInt64(&s.stTempFileNum, 1) - 1 - return storage.FileDesc{storage.TypeTemp, num} + return storage.FileDesc{Type: storage.TypeTemp, Num: num} } -func (s *session) addFileRef(fd storage.FileDesc, ref int) int { - ref += s.fileRef[fd.Num] - if ref > 0 { - s.fileRef[fd.Num] = ref - } else if ref == 0 { - delete(s.fileRef, fd.Num) - } else { - panic(fmt.Sprintf("negative ref: %v", fd)) - } - return ref +// Session state. + +const ( + // maxCachedNumber represents the maximum number of version tasks + // that can be cached in the ref loop. + maxCachedNumber = 256 + + // maxCachedTime represents the maximum time for ref loop to cache + // a version task. + maxCachedTime = 5 * time.Minute +) + +// vDelta indicates the change information between the next version +// and the currently specified version +type vDelta struct { + vid int64 + added []int64 + deleted []int64 } -// Session state. +// vTask defines a version task for either reference or release. +type vTask struct { + vid int64 + files []tFiles + created time.Time +} + +func (s *session) refLoop() { + var ( + fileRef = make(map[int64]int) // Table file reference counter + ref = make(map[int64]*vTask) // Current referencing version store + deltas = make(map[int64]*vDelta) + referenced = make(map[int64]struct{}) + released = make(map[int64]*vDelta) // Released version that waiting for processing + abandoned = make(map[int64]struct{}) // Abandoned version id + next, last int64 + ) + // addFileRef adds file reference counter with specified file number and + // reference value + addFileRef := func(fnum int64, ref int) int { + ref += fileRef[fnum] + if ref > 0 { + fileRef[fnum] = ref + } else if ref == 0 { + delete(fileRef, fnum) + } else { + panic(fmt.Sprintf("negative ref: %v", fnum)) + } + return ref + } + // skipAbandoned skips useless abandoned version id. + skipAbandoned := func() bool { + if _, exist := abandoned[next]; exist { + delete(abandoned, next) + return true + } + return false + } + // applyDelta applies version change to current file reference. + applyDelta := func(d *vDelta) { + for _, t := range d.added { + addFileRef(t, 1) + } + for _, t := range d.deleted { + if addFileRef(t, -1) == 0 { + s.tops.remove(storage.FileDesc{Type: storage.TypeTable, Num: t}) + } + } + } + + timer := time.NewTimer(0) + <-timer.C // discard the initial tick + defer timer.Stop() + + // processTasks processes version tasks in strict order. + // + // If we want to use delta to reduce the cost of file references and dereferences, + // we must strictly follow the id of the version, otherwise some files that are + // being referenced will be deleted. + // + // In addition, some db operations (such as iterators) may cause a version to be + // referenced for a long time. In order to prevent such operations from blocking + // the entire processing queue, we will properly convert some of the version tasks + // into full file references and releases. + processTasks := func() { + timer.Reset(maxCachedTime) + // Make sure we don't cache too many version tasks. + for { + // Skip any abandoned version number to prevent blocking processing. + if skipAbandoned() { + next += 1 + continue + } + // Don't bother the version that has been released. + if _, exist := released[next]; exist { + break + } + // Ensure the specified version has been referenced. + if _, exist := ref[next]; !exist { + break + } + if last-next < maxCachedNumber && time.Since(ref[next].created) < maxCachedTime { + break + } + // Convert version task into full file references and releases mode. + // Reference version(i+1) first and wait version(i) to release. + // FileRef(i+1) = FileRef(i) + Delta(i) + for _, tt := range ref[next].files { + for _, t := range tt { + addFileRef(t.fd.Num, 1) + } + } + // Note, if some compactions take a long time, even more than 5 minutes, + // we may miss the corresponding delta information here. + // Fortunately it will not affect the correctness of the file reference, + // and we can apply the delta once we receive it. + if d := deltas[next]; d != nil { + applyDelta(d) + } + referenced[next] = struct{}{} + delete(ref, next) + delete(deltas, next) + next += 1 + } + + // Use delta information to process all released versions. + for { + if skipAbandoned() { + next += 1 + continue + } + if d, exist := released[next]; exist { + if d != nil { + applyDelta(d) + } + delete(released, next) + next += 1 + continue + } + return + } + } + + for { + processTasks() + + select { + case t := <-s.refCh: + if _, exist := ref[t.vid]; exist { + panic("duplicate reference request") + } + ref[t.vid] = t + if t.vid > last { + last = t.vid + } + + case d := <-s.deltaCh: + if _, exist := ref[d.vid]; !exist { + if _, exist2 := referenced[d.vid]; !exist2 { + panic("invalid release request") + } + // The reference opt is already expired, apply + // delta here. + applyDelta(d) + continue + } + deltas[d.vid] = d + + case t := <-s.relCh: + if _, exist := referenced[t.vid]; exist { + for _, tt := range t.files { + for _, t := range tt { + if addFileRef(t.fd.Num, -1) == 0 { + s.tops.remove(t.fd) + } + } + } + delete(referenced, t.vid) + continue + } + if _, exist := ref[t.vid]; !exist { + panic("invalid release request") + } + released[t.vid] = deltas[t.vid] + delete(deltas, t.vid) + delete(ref, t.vid) + + case id := <-s.abandon: + if id >= next { + abandoned[id] = struct{}{} + } + + case <-timer.C: + + case r := <-s.fileRefCh: + ref := make(map[int64]int) + for f, c := range fileRef { + ref[f] = c + } + r <- ref + + case <-s.closeC: + s.closeW.Done() + return + } + } +} // Get current version. This will incr version ref, must call // version.release (exactly once) after use. @@ -69,13 +264,30 @@ func (s *session) tLen(level int) int { } // Set current version to v. -func (s *session) setVersion(v *version) { +func (s *session) setVersion(r *sessionRecord, v *version) { s.vmu.Lock() defer s.vmu.Unlock() // Hold by session. It is important to call this first before releasing // current version, otherwise the still used files might get released. v.incref() if s.stVersion != nil { + if r != nil { + var ( + added = make([]int64, 0, len(r.addedTables)) + deleted = make([]int64, 0, len(r.deletedTables)) + ) + for _, t := range r.addedTables { + added = append(added, t.num) + } + for _, t := range r.deletedTables { + deleted = append(deleted, t.num) + } + select { + case s.deltaCh <- &vDelta{vid: s.stVersion.id, added: added, deleted: deleted}: + case <-v.s.closeC: + s.log("reference loop already exist") + } + } // Release current version. s.stVersion.releaseNB() } @@ -190,7 +402,7 @@ func (s *session) recordCommited(rec *sessionRecord) { // Create a new manifest file; need external synchronization. func (s *session) newManifest(rec *sessionRecord, v *version) (err error) { - fd := storage.FileDesc{storage.TypeManifest, s.allocFileNum()} + fd := storage.FileDesc{Type: storage.TypeManifest, Num: s.allocFileNum()} writer, err := s.stor.Create(fd) if err != nil { return diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table.go b/vendor/github.com/syndtr/goleveldb/leveldb/table.go index 81d18a531e01..5ad1f805439d 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/table.go @@ -7,6 +7,7 @@ package leveldb import ( + "bytes" "fmt" "sort" "sync/atomic" @@ -78,7 +79,7 @@ func newTableFile(fd storage.FileDesc, size int64, imin, imax internalKey) *tFil } func tableFileFromRecord(r atRecord) *tFile { - return newTableFile(storage.FileDesc{storage.TypeTable, r.num}, r.size, r.imin, r.imax) + return newTableFile(storage.FileDesc{Type: storage.TypeTable, Num: r.num}, r.size, r.imin, r.imax) } // tFiles hold multiple tFile. @@ -150,6 +151,30 @@ func (tf tFiles) searchMax(icmp *iComparer, ikey internalKey) int { }) } +// Searches smallest index of tables whose its file number +// is smaller than the given number. +func (tf tFiles) searchNumLess(num int64) int { + return sort.Search(len(tf), func(i int) bool { + return tf[i].fd.Num < num + }) +} + +// Searches smallest index of tables whose its smallest +// key is after the given key. +func (tf tFiles) searchMinUkey(icmp *iComparer, umin []byte) int { + return sort.Search(len(tf), func(i int) bool { + return icmp.ucmp.Compare(tf[i].imin.ukey(), umin) > 0 + }) +} + +// Searches smallest index of tables whose its largest +// key is after the given key. +func (tf tFiles) searchMaxUkey(icmp *iComparer, umax []byte) int { + return sort.Search(len(tf), func(i int) bool { + return icmp.ucmp.Compare(tf[i].imax.ukey(), umax) > 0 + }) +} + // Returns true if given key range overlaps with one or more // tables key range. If unsorted is true then binary search will not be used. func (tf tFiles) overlaps(icmp *iComparer, umin, umax []byte, unsorted bool) bool { @@ -181,6 +206,50 @@ func (tf tFiles) overlaps(icmp *iComparer, umin, umax []byte, unsorted bool) boo // expanded. // The dst content will be overwritten. func (tf tFiles) getOverlaps(dst tFiles, icmp *iComparer, umin, umax []byte, overlapped bool) tFiles { + // Short circuit if tf is empty + if len(tf) == 0 { + return nil + } + // For non-zero levels, there is no ukey hop across at all. + // And what's more, the files in these levels are strictly sorted, + // so use binary search instead of heavy traverse. + if !overlapped { + var begin, end int + // Determine the begin index of the overlapped file + if umin != nil { + index := tf.searchMinUkey(icmp, umin) + if index == 0 { + begin = 0 + } else if bytes.Compare(tf[index-1].imax.ukey(), umin) >= 0 { + // The min ukey overlaps with the index-1 file, expand it. + begin = index - 1 + } else { + begin = index + } + } + // Determine the end index of the overlapped file + if umax != nil { + index := tf.searchMaxUkey(icmp, umax) + if index == len(tf) { + end = len(tf) + } else if bytes.Compare(tf[index].imin.ukey(), umax) <= 0 { + // The max ukey overlaps with the index file, expand it. + end = index + 1 + } else { + end = index + } + } else { + end = len(tf) + } + // Ensure the overlapped file indexes are valid. + if begin >= end { + return nil + } + dst = make([]*tFile, end-begin) + copy(dst, tf[begin:end]) + return dst + } + dst = dst[:0] for i := 0; i < len(tf); { t := tf[i] @@ -193,11 +262,9 @@ func (tf tFiles) getOverlaps(dst tFiles, icmp *iComparer, umin, umax []byte, ove } else if umax != nil && icmp.uCompare(t.imax.ukey(), umax) > 0 { umax = t.imax.ukey() // Restart search if it is overlapped. - if overlapped { - dst = dst[:0] - i = 0 - continue - } + dst = dst[:0] + i = 0 + continue } dst = append(dst, t) @@ -290,16 +357,17 @@ func (x *tFilesSortByNum) Less(i, j int) bool { // Table operations. type tOps struct { - s *session - noSync bool - cache *cache.Cache - bcache *cache.Cache - bpool *util.BufferPool + s *session + noSync bool + evictRemoved bool + cache *cache.Cache + bcache *cache.Cache + bpool *util.BufferPool } // Creates an empty table and returns table writer. func (t *tOps) create() (*tWriter, error) { - fd := storage.FileDesc{storage.TypeTable, t.s.allocFileNum()} + fd := storage.FileDesc{Type: storage.TypeTable, Num: t.s.allocFileNum()} fw, err := t.s.stor.Create(fd) if err != nil { return nil, err @@ -415,15 +483,15 @@ func (t *tOps) newIterator(f *tFile, slice *util.Range, ro *opt.ReadOptions) ite // Removes table from persistent storage. It waits until // no one use the the table. -func (t *tOps) remove(f *tFile) { - t.cache.Delete(0, uint64(f.fd.Num), func() { - if err := t.s.stor.Remove(f.fd); err != nil { - t.s.logf("table@remove removing @%d %q", f.fd.Num, err) +func (t *tOps) remove(fd storage.FileDesc) { + t.cache.Delete(0, uint64(fd.Num), func() { + if err := t.s.stor.Remove(fd); err != nil { + t.s.logf("table@remove removing @%d %q", fd.Num, err) } else { - t.s.logf("table@remove removed @%d", f.fd.Num) + t.s.logf("table@remove removed @%d", fd.Num) } - if t.bcache != nil { - t.bcache.EvictNS(uint64(f.fd.Num)) + if t.evictRemoved && t.bcache != nil { + t.bcache.EvictNS(uint64(fd.Num)) } }) } @@ -451,7 +519,7 @@ func newTableOps(s *session) *tOps { if !s.o.GetDisableBlockCache() { var bcacher cache.Cacher if s.o.GetBlockCacheCapacity() > 0 { - bcacher = cache.NewLRU(s.o.GetBlockCacheCapacity()) + bcacher = s.o.GetBlockCacher().New(s.o.GetBlockCacheCapacity()) } bcache = cache.NewCache(bcacher) } @@ -459,11 +527,12 @@ func newTableOps(s *session) *tOps { bpool = util.NewBufferPool(s.o.GetBlockSize() + 5) } return &tOps{ - s: s, - noSync: s.o.GetNoSync(), - cache: cache.NewCache(cacher), - bcache: bcache, - bpool: bpool, + s: s, + noSync: s.o.GetNoSync(), + evictRemoved: s.o.GetBlockCacheEvictRemoved(), + cache: cache.NewCache(cacher), + bcache: bcache, + bpool: bpool, } } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/version.go b/vendor/github.com/syndtr/goleveldb/leveldb/version.go index 73f272af5ff4..2664560e1ce2 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/version.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/version.go @@ -9,6 +9,7 @@ package leveldb import ( "fmt" "sync/atomic" + "time" "unsafe" "github.com/syndtr/goleveldb/leveldb/iterator" @@ -22,7 +23,8 @@ type tSet struct { } type version struct { - s *session + id int64 // unique monotonous increasing version id + s *session levels []tFiles @@ -39,8 +41,11 @@ type version struct { released bool } +// newVersion creates a new version with an unique monotonous increasing id. func newVersion(s *session) *version { - return &version{s: s} + id := atomic.AddInt64(&s.ntVersionId, 1) + nv := &version{s: s, id: id - 1} + return nv } func (v *version) incref() { @@ -50,11 +55,11 @@ func (v *version) incref() { v.ref++ if v.ref == 1 { - // Incr file ref. - for _, tt := range v.levels { - for _, t := range tt { - v.s.addFileRef(t.fd, 1) - } + select { + case v.s.refCh <- &vTask{vid: v.id, files: v.levels, created: time.Now()}: + // We can use v.levels directly here since it is immutable. + case <-v.s.closeC: + v.s.log("reference loop already exist") } } } @@ -66,13 +71,11 @@ func (v *version) releaseNB() { } else if v.ref < 0 { panic("negative version ref") } - - for _, tt := range v.levels { - for _, t := range tt { - if v.s.addFileRef(t.fd, -1) == 0 { - v.s.tops.remove(t) - } - } + select { + case v.s.relCh <- &vTask{vid: v.id, files: v.levels, created: time.Now()}: + // We can use v.levels directly here since it is immutable. + case <-v.s.closeC: + v.s.log("reference loop already exist") } v.released = true @@ -273,10 +276,10 @@ func (v *version) newStaging() *versionStaging { } // Spawn a new version based on this version. -func (v *version) spawn(r *sessionRecord) *version { +func (v *version) spawn(r *sessionRecord, trivial bool) *version { staging := v.newStaging() staging.commit(r) - return staging.finish() + return staging.finish(trivial) } func (v *version) fillRecord(r *sessionRecord) { @@ -446,7 +449,7 @@ func (p *versionStaging) commit(r *sessionRecord) { } } -func (p *versionStaging) finish() *version { +func (p *versionStaging) finish(trivial bool) *version { // Build new version. nv := newVersion(p.base.s) numLevel := len(p.levels) @@ -463,6 +466,12 @@ func (p *versionStaging) finish() *version { if level < len(p.levels) { scratch := p.levels[level] + // Short circuit if there is no change at all. + if len(scratch.added) == 0 && len(scratch.deleted) == 0 { + nv.levels[level] = baseTabels + continue + } + var nt tFiles // Prealloc list if possible. if n := len(baseTabels) + len(scratch.added) - len(scratch.deleted); n > 0 { @@ -480,6 +489,41 @@ func (p *versionStaging) finish() *version { nt = append(nt, t) } + // Avoid resort if only files in this level are deleted + if len(scratch.added) == 0 { + nv.levels[level] = nt + continue + } + + // For normal table compaction, one compaction will only involve two levels + // of files. And the new files generated after merging the source level and + // source+1 level related files can be inserted as a whole into source+1 level + // without any overlap with the other source+1 files. + // + // When the amount of data maintained by leveldb is large, the number of files + // per level will be very large. While qsort is very inefficient for sorting + // already ordered arrays. Therefore, for the normal table compaction, we use + // binary search here to find the insert index to insert a batch of new added + // files directly instead of using qsort. + if trivial && len(scratch.added) > 0 { + added := make(tFiles, 0, len(scratch.added)) + for _, r := range scratch.added { + added = append(added, tableFileFromRecord(r)) + } + if level == 0 { + added.sortByNum() + index := nt.searchNumLess(added[len(added)-1].fd.Num) + nt = append(nt[:index], append(added, nt[index:]...)...) + } else { + added.sortByKey(p.base.s.icmp) + _, amax := added.getRange(p.base.s.icmp) + index := nt.searchMin(p.base.s.icmp, amax) + nt = append(nt[:index], append(added, nt[index:]...)...) + } + nv.levels[level] = nt + continue + } + // New tables. for _, r := range scratch.added { nt = append(nt, tableFileFromRecord(r)) diff --git a/vendor/github.com/tyler-smith/go-bip39/Gopkg.lock b/vendor/github.com/tyler-smith/go-bip39/Gopkg.lock new file mode 100644 index 000000000000..e15d33f31ca9 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/Gopkg.lock @@ -0,0 +1,15 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + branch = "master" + name = "golang.org/x/crypto" + packages = ["pbkdf2"] + revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "d7f1a7207c39125afcb9ca2365832cb83458edfc17f2f7e8d28fd56f19436856" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/tyler-smith/go-bip39/Gopkg.toml b/vendor/github.com/tyler-smith/go-bip39/Gopkg.toml new file mode 100644 index 000000000000..2f655b2c7b3f --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/Gopkg.toml @@ -0,0 +1,26 @@ + +# Gopkg.toml example +# +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" + + +[[constraint]] + branch = "master" + name = "golang.org/x/crypto" diff --git a/vendor/github.com/tyler-smith/go-bip39/LICENSE b/vendor/github.com/tyler-smith/go-bip39/LICENSE new file mode 100644 index 000000000000..4dae82d35b92 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Tyler Smith and contributors + +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. diff --git a/vendor/github.com/tyler-smith/go-bip39/Makefile b/vendor/github.com/tyler-smith/go-bip39/Makefile new file mode 100644 index 000000000000..f0f3fe88c7f9 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/Makefile @@ -0,0 +1,11 @@ +.DEFAULT_GOAL := help + +tests: ## Run tests with coverage + go test -v -cover ./... + +profile_tests: ## Run tests and output coverage profiling + go test -v -coverprofile=coverage.out . + go tool cover -html=coverage.out + +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/vendor/github.com/tyler-smith/go-bip39/README.md b/vendor/github.com/tyler-smith/go-bip39/README.md new file mode 100644 index 000000000000..933296fd839e --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/README.md @@ -0,0 +1,45 @@ +# go-bip39 +[![Build Status](https://travis-ci.org/tyler-smith/go-bip39.svg?branch=master)](https://travis-ci.org/tyler-smith/go-bip39) +[![license](https://img.shields.io/github/license/tyler-smith/go-bip39.svg?maxAge=2592000)](https://github.com/tyler-smith/go-bip39/blob/master/LICENSE) +[![Documentation](https://godoc.org/github.com/tyler-smith/go-bip39?status.svg)](http://godoc.org/github.com/tyler-smith/go-bip39) +[![Go Report Card](https://goreportcard.com/badge/github.com/tyler-smith/go-bip39)](https://goreportcard.com/report/github.com/tyler-smith/go-bip39) +[![GitHub issues](https://img.shields.io/github/issues/tyler-smith/go-bip39.svg)](https://github.com/tyler-smith/go-bip39/issues) + + +A golang implementation of the BIP0039 spec for mnemonic seeds + +## Example + +```go +package main + +import ( + "github.com/tyler-smith/go-bip39" + "github.com/tyler-smith/go-bip32" + "fmt" +) + +func main(){ + // Generate a mnemonic for memorization or user-friendly seeds + entropy, _ := bip39.NewEntropy(256) + mnemonic, _ := bip39.NewMnemonic(entropy) + + // Generate a Bip32 HD wallet for the mnemonic and a user supplied password + seed := bip39.NewSeed(mnemonic, "Secret Passphrase") + + masterKey, _ := bip32.NewMasterKey(seed) + publicKey := masterKey.PublicKey() + + // Display mnemonic and keys + fmt.Println("Mnemonic: ", mnemonic) + fmt.Println("Master private key: ", masterKey) + fmt.Println("Master public key: ", publicKey) +} +``` + +## Credits + +Wordlists are from the [bip39 spec](https://github.com/bitcoin/bips/tree/master/bip-0039). + +Test vectors are from the standard Python BIP0039 implementation from the +Trezor team: [https://github.com/trezor/python-mnemonic](https://github.com/trezor/python-mnemonic) diff --git a/vendor/github.com/tyler-smith/go-bip39/bip39.go b/vendor/github.com/tyler-smith/go-bip39/bip39.go new file mode 100644 index 000000000000..62503b0fd27c --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/bip39.go @@ -0,0 +1,377 @@ +// Package bip39 is the Golang implementation of the BIP39 spec. +// +// The official BIP39 spec can be found at +// https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki +package bip39 + +import ( + "crypto/rand" + "crypto/sha256" + "crypto/sha512" + "encoding/binary" + "errors" + "fmt" + "math/big" + "strings" + + "github.com/tyler-smith/go-bip39/wordlists" + "golang.org/x/crypto/pbkdf2" +) + +var ( + // Some bitwise operands for working with big.Ints + last11BitsMask = big.NewInt(2047) + shift11BitsMask = big.NewInt(2048) + bigOne = big.NewInt(1) + bigTwo = big.NewInt(2) + + // used to isolate the checksum bits from the entropy+checksum byte array + wordLengthChecksumMasksMapping = map[int]*big.Int{ + 12: big.NewInt(15), + 15: big.NewInt(31), + 18: big.NewInt(63), + 21: big.NewInt(127), + 24: big.NewInt(255), + } + // used to use only the desired x of 8 available checksum bits. + // 256 bit (word length 24) requires all 8 bits of the checksum, + // and thus no shifting is needed for it (we would get a divByZero crash if we did) + wordLengthChecksumShiftMapping = map[int]*big.Int{ + 12: big.NewInt(16), + 15: big.NewInt(8), + 18: big.NewInt(4), + 21: big.NewInt(2), + } + + // wordList is the set of words to use + wordList []string + + // wordMap is a reverse lookup map for wordList + wordMap map[string]int +) + +var ( + // ErrInvalidMnemonic is returned when trying to use a malformed mnemonic. + ErrInvalidMnemonic = errors.New("Invalid mnenomic") + + // ErrEntropyLengthInvalid is returned when trying to use an entropy set with + // an invalid size. + ErrEntropyLengthInvalid = errors.New("Entropy length must be [128, 256] and a multiple of 32") + + // ErrValidatedSeedLengthMismatch is returned when a validated seed is not the + // same size as the given seed. This should never happen is present only as a + // sanity assertion. + ErrValidatedSeedLengthMismatch = errors.New("Seed length does not match validated seed length") + + // ErrChecksumIncorrect is returned when entropy has the incorrect checksum. + ErrChecksumIncorrect = errors.New("Checksum incorrect") +) + +func init() { + SetWordList(wordlists.English) +} + +// SetWordList sets the list of words to use for mnemonics. Currently the list +// that is set is used package-wide. +func SetWordList(list []string) { + wordList = list + wordMap = map[string]int{} + for i, v := range wordList { + wordMap[v] = i + } +} + +// GetWordList gets the list of words to use for mnemonics. +func GetWordList() []string { + return wordList +} + +// GetWordIndex gets word index in wordMap. +func GetWordIndex(word string) (int, bool) { + idx, ok := wordMap[word] + return idx, ok +} + +// NewEntropy will create random entropy bytes +// so long as the requested size bitSize is an appropriate size. +// +// bitSize has to be a multiple 32 and be within the inclusive range of {128, 256} +func NewEntropy(bitSize int) ([]byte, error) { + err := validateEntropyBitSize(bitSize) + if err != nil { + return nil, err + } + + entropy := make([]byte, bitSize/8) + _, err = rand.Read(entropy) + return entropy, err +} + +// EntropyFromMnemonic takes a mnemonic generated by this library, +// and returns the input entropy used to generate the given mnemonic. +// An error is returned if the given mnemonic is invalid. +func EntropyFromMnemonic(mnemonic string) ([]byte, error) { + mnemonicSlice, isValid := splitMnemonicWords(mnemonic) + if !isValid { + return nil, ErrInvalidMnemonic + } + + // Decode the words into a big.Int. + b := big.NewInt(0) + for _, v := range mnemonicSlice { + index, found := wordMap[v] + if found == false { + return nil, fmt.Errorf("word `%v` not found in reverse map", v) + } + var wordBytes [2]byte + binary.BigEndian.PutUint16(wordBytes[:], uint16(index)) + b = b.Mul(b, shift11BitsMask) + b = b.Or(b, big.NewInt(0).SetBytes(wordBytes[:])) + } + + // Build and add the checksum to the big.Int. + checksum := big.NewInt(0) + checksumMask := wordLengthChecksumMasksMapping[len(mnemonicSlice)] + checksum = checksum.And(b, checksumMask) + + b.Div(b, big.NewInt(0).Add(checksumMask, bigOne)) + + // The entropy is the underlying bytes of the big.Int. Any upper bytes of + // all 0's are not returned so we pad the beginning of the slice with empty + // bytes if necessary. + entropy := b.Bytes() + entropy = padByteSlice(entropy, len(mnemonicSlice)/3*4) + + // Generate the checksum and compare with the one we got from the mneomnic. + entropyChecksumBytes := computeChecksum(entropy) + entropyChecksum := big.NewInt(int64(entropyChecksumBytes[0])) + if l := len(mnemonicSlice); l != 24 { + checksumShift := wordLengthChecksumShiftMapping[l] + entropyChecksum.Div(entropyChecksum, checksumShift) + } + + if checksum.Cmp(entropyChecksum) != 0 { + return nil, ErrChecksumIncorrect + } + + return entropy, nil +} + +// NewMnemonic will return a string consisting of the mnemonic words for +// the given entropy. +// If the provide entropy is invalid, an error will be returned. +func NewMnemonic(entropy []byte) (string, error) { + // Compute some lengths for convenience. + entropyBitLength := len(entropy) * 8 + checksumBitLength := entropyBitLength / 32 + sentenceLength := (entropyBitLength + checksumBitLength) / 11 + + // Validate that the requested size is supported. + err := validateEntropyBitSize(entropyBitLength) + if err != nil { + return "", err + } + + // Add checksum to entropy. + entropy = addChecksum(entropy) + + // Break entropy up into sentenceLength chunks of 11 bits. + // For each word AND mask the rightmost 11 bits and find the word at that index. + // Then bitshift entropy 11 bits right and repeat. + // Add to the last empty slot so we can work with LSBs instead of MSB. + + // Entropy as an int so we can bitmask without worrying about bytes slices. + entropyInt := new(big.Int).SetBytes(entropy) + + // Slice to hold words in. + words := make([]string, sentenceLength) + + // Throw away big.Int for AND masking. + word := big.NewInt(0) + + for i := sentenceLength - 1; i >= 0; i-- { + // Get 11 right most bits and bitshift 11 to the right for next time. + word.And(entropyInt, last11BitsMask) + entropyInt.Div(entropyInt, shift11BitsMask) + + // Get the bytes representing the 11 bits as a 2 byte slice. + wordBytes := padByteSlice(word.Bytes(), 2) + + // Convert bytes to an index and add that word to the list. + words[i] = wordList[binary.BigEndian.Uint16(wordBytes)] + } + + return strings.Join(words, " "), nil +} + +// MnemonicToByteArray takes a mnemonic string and turns it into a byte array +// suitable for creating another mnemonic. +// An error is returned if the mnemonic is invalid. +func MnemonicToByteArray(mnemonic string, raw ...bool) ([]byte, error) { + var ( + mnemonicSlice = strings.Split(mnemonic, " ") + entropyBitSize = len(mnemonicSlice) * 11 + checksumBitSize = entropyBitSize % 32 + fullByteSize = (entropyBitSize-checksumBitSize)/8 + 1 + checksumByteSize = fullByteSize - (fullByteSize % 4) + ) + + // Pre validate that the mnemonic is well formed and only contains words that + // are present in the word list. + if !IsMnemonicValid(mnemonic) { + return nil, ErrInvalidMnemonic + } + + // Convert word indices to a big.Int representing the entropy. + checksummedEntropy := big.NewInt(0) + modulo := big.NewInt(2048) + for _, v := range mnemonicSlice { + index := big.NewInt(int64(wordMap[v])) + checksummedEntropy.Mul(checksummedEntropy, modulo) + checksummedEntropy.Add(checksummedEntropy, index) + } + + // Calculate the unchecksummed entropy so we can validate that the checksum is + // correct. + checksumModulo := big.NewInt(0).Exp(bigTwo, big.NewInt(int64(checksumBitSize)), nil) + rawEntropy := big.NewInt(0).Div(checksummedEntropy, checksumModulo) + + // Convert big.Ints to byte padded byte slices. + rawEntropyBytes := padByteSlice(rawEntropy.Bytes(), checksumByteSize) + checksummedEntropyBytes := padByteSlice(checksummedEntropy.Bytes(), fullByteSize) + + // Validate that the checksum is correct. + newChecksummedEntropyBytes := padByteSlice(addChecksum(rawEntropyBytes), fullByteSize) + if !compareByteSlices(checksummedEntropyBytes, newChecksummedEntropyBytes) { + return nil, ErrChecksumIncorrect + } + + if len(raw) > 0 && raw[0] { + return rawEntropyBytes, nil + } + + return checksummedEntropyBytes, nil +} + +// NewSeedWithErrorChecking creates a hashed seed output given the mnemonic string and a password. +// An error is returned if the mnemonic is not convertible to a byte array. +func NewSeedWithErrorChecking(mnemonic string, password string) ([]byte, error) { + _, err := MnemonicToByteArray(mnemonic) + if err != nil { + return nil, err + } + return NewSeed(mnemonic, password), nil +} + +// NewSeed creates a hashed seed output given a provided string and password. +// No checking is performed to validate that the string provided is a valid mnemonic. +func NewSeed(mnemonic string, password string) []byte { + return pbkdf2.Key([]byte(mnemonic), []byte("mnemonic"+password), 2048, 64, sha512.New) +} + +// IsMnemonicValid attempts to verify that the provided mnemonic is valid. +// Validity is determined by both the number of words being appropriate, +// and that all the words in the mnemonic are present in the word list. +func IsMnemonicValid(mnemonic string) bool { + // Create a list of all the words in the mnemonic sentence + words := strings.Fields(mnemonic) + + // Get word count + wordCount := len(words) + + // The number of words should be 12, 15, 18, 21 or 24 + if wordCount%3 != 0 || wordCount < 12 || wordCount > 24 { + return false + } + + // Check if all words belong in the wordlist + for _, word := range words { + if _, ok := wordMap[word]; !ok { + return false + } + } + + return true +} + +// Appends to data the first (len(data) / 32)bits of the result of sha256(data) +// Currently only supports data up to 32 bytes +func addChecksum(data []byte) []byte { + // Get first byte of sha256 + hash := computeChecksum(data) + firstChecksumByte := hash[0] + + // len() is in bytes so we divide by 4 + checksumBitLength := uint(len(data) / 4) + + // For each bit of check sum we want we shift the data one the left + // and then set the (new) right most bit equal to checksum bit at that index + // staring from the left + dataBigInt := new(big.Int).SetBytes(data) + for i := uint(0); i < checksumBitLength; i++ { + // Bitshift 1 left + dataBigInt.Mul(dataBigInt, bigTwo) + + // Set rightmost bit if leftmost checksum bit is set + if uint8(firstChecksumByte&(1<<(7-i))) > 0 { + dataBigInt.Or(dataBigInt, bigOne) + } + } + + return dataBigInt.Bytes() +} + +func computeChecksum(data []byte) []byte { + hasher := sha256.New() + hasher.Write(data) + return hasher.Sum(nil) +} + +// validateEntropyBitSize ensures that entropy is the correct size for being a +// mnemonic. +func validateEntropyBitSize(bitSize int) error { + if (bitSize%32) != 0 || bitSize < 128 || bitSize > 256 { + return ErrEntropyLengthInvalid + } + return nil +} + +// padByteSlice returns a byte slice of the given size with contents of the +// given slice left padded and any empty spaces filled with 0's. +func padByteSlice(slice []byte, length int) []byte { + offset := length - len(slice) + if offset <= 0 { + return slice + } + newSlice := make([]byte, length) + copy(newSlice[offset:], slice) + return newSlice +} + +// compareByteSlices returns true of the byte slices have equal contents and +// returns false otherwise. +func compareByteSlices(a, b []byte) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + +func splitMnemonicWords(mnemonic string) ([]string, bool) { + // Create a list of all the words in the mnemonic sentence + words := strings.Fields(mnemonic) + + // Get num of words + numOfWords := len(words) + + // The number of words should be 12, 15, 18, 21 or 24 + if numOfWords%3 != 0 || numOfWords < 12 || numOfWords > 24 { + return nil, false + } + return words, true +} diff --git a/vendor/github.com/tyler-smith/go-bip39/wordlists/chinese_simplified.go b/vendor/github.com/tyler-smith/go-bip39/wordlists/chinese_simplified.go new file mode 100644 index 000000000000..0ee29727045d --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/wordlists/chinese_simplified.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt + // $ crc32 chinese_simplified.txt + // e3721bbf + checksum := crc32.ChecksumIEEE([]byte(chineseSimplified)) + if fmt.Sprintf("%x", checksum) != "e3721bbf" { + panic("chineseSimplified checksum invalid") + } +} + +// ChineseSimplified is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt +var ChineseSimplified = strings.Split(strings.TrimSpace(chineseSimplified), "\n") +var chineseSimplified = `的 +一 +是 +在 +不 +了 +有 +和 +人 +这 +中 +大 +为 +上 +个 +国 +我 +以 +要 +他 +时 +来 +用 +们 +生 +到 +作 +地 +于 +出 +就 +分 +对 +成 +会 +可 +主 +发 +年 +动 +同 +工 +也 +能 +下 +过 +子 +说 +产 +种 +面 +而 +方 +后 +多 +定 +行 +学 +法 +所 +民 +得 +经 +十 +三 +之 +进 +着 +等 +部 +度 +家 +电 +力 +里 +如 +水 +化 +高 +自 +二 +理 +起 +小 +物 +现 +实 +加 +量 +都 +两 +体 +制 +机 +当 +使 +点 +从 +业 +本 +去 +把 +性 +好 +应 +开 +它 +合 +还 +因 +由 +其 +些 +然 +前 +外 +天 +政 +四 +日 +那 +社 +义 +事 +平 +形 +相 +全 +表 +间 +样 +与 +关 +各 +重 +新 +线 +内 +数 +正 +心 +反 +你 +明 +看 +原 +又 +么 +利 +比 +或 +但 +质 +气 +第 +向 +道 +命 +此 +变 +条 +只 +没 +结 +解 +问 +意 +建 +月 +公 +无 +系 +军 +很 +情 +者 +最 +立 +代 +想 +已 +通 +并 +提 +直 +题 +党 +程 +展 +五 +果 +料 +象 +员 +革 +位 +入 +常 +文 +总 +次 +品 +式 +活 +设 +及 +管 +特 +件 +长 +求 +老 +头 +基 +资 +边 +流 +路 +级 +少 +图 +山 +统 +接 +知 +较 +将 +组 +见 +计 +别 +她 +手 +角 +期 +根 +论 +运 +农 +指 +几 +九 +区 +强 +放 +决 +西 +被 +干 +做 +必 +战 +先 +回 +则 +任 +取 +据 +处 +队 +南 +给 +色 +光 +门 +即 +保 +治 +北 +造 +百 +规 +热 +领 +七 +海 +口 +东 +导 +器 +压 +志 +世 +金 +增 +争 +济 +阶 +油 +思 +术 +极 +交 +受 +联 +什 +认 +六 +共 +权 +收 +证 +改 +清 +美 +再 +采 +转 +更 +单 +风 +切 +打 +白 +教 +速 +花 +带 +安 +场 +身 +车 +例 +真 +务 +具 +万 +每 +目 +至 +达 +走 +积 +示 +议 +声 +报 +斗 +完 +类 +八 +离 +华 +名 +确 +才 +科 +张 +信 +马 +节 +话 +米 +整 +空 +元 +况 +今 +集 +温 +传 +土 +许 +步 +群 +广 +石 +记 +需 +段 +研 +界 +拉 +林 +律 +叫 +且 +究 +观 +越 +织 +装 +影 +算 +低 +持 +音 +众 +书 +布 +复 +容 +儿 +须 +际 +商 +非 +验 +连 +断 +深 +难 +近 +矿 +千 +周 +委 +素 +技 +备 +半 +办 +青 +省 +列 +习 +响 +约 +支 +般 +史 +感 +劳 +便 +团 +往 +酸 +历 +市 +克 +何 +除 +消 +构 +府 +称 +太 +准 +精 +值 +号 +率 +族 +维 +划 +选 +标 +写 +存 +候 +毛 +亲 +快 +效 +斯 +院 +查 +江 +型 +眼 +王 +按 +格 +养 +易 +置 +派 +层 +片 +始 +却 +专 +状 +育 +厂 +京 +识 +适 +属 +圆 +包 +火 +住 +调 +满 +县 +局 +照 +参 +红 +细 +引 +听 +该 +铁 +价 +严 +首 +底 +液 +官 +德 +随 +病 +苏 +失 +尔 +死 +讲 +配 +女 +黄 +推 +显 +谈 +罪 +神 +艺 +呢 +席 +含 +企 +望 +密 +批 +营 +项 +防 +举 +球 +英 +氧 +势 +告 +李 +台 +落 +木 +帮 +轮 +破 +亚 +师 +围 +注 +远 +字 +材 +排 +供 +河 +态 +封 +另 +施 +减 +树 +溶 +怎 +止 +案 +言 +士 +均 +武 +固 +叶 +鱼 +波 +视 +仅 +费 +紧 +爱 +左 +章 +早 +朝 +害 +续 +轻 +服 +试 +食 +充 +兵 +源 +判 +护 +司 +足 +某 +练 +差 +致 +板 +田 +降 +黑 +犯 +负 +击 +范 +继 +兴 +似 +余 +坚 +曲 +输 +修 +故 +城 +夫 +够 +送 +笔 +船 +占 +右 +财 +吃 +富 +春 +职 +觉 +汉 +画 +功 +巴 +跟 +虽 +杂 +飞 +检 +吸 +助 +升 +阳 +互 +初 +创 +抗 +考 +投 +坏 +策 +古 +径 +换 +未 +跑 +留 +钢 +曾 +端 +责 +站 +简 +述 +钱 +副 +尽 +帝 +射 +草 +冲 +承 +独 +令 +限 +阿 +宣 +环 +双 +请 +超 +微 +让 +控 +州 +良 +轴 +找 +否 +纪 +益 +依 +优 +顶 +础 +载 +倒 +房 +突 +坐 +粉 +敌 +略 +客 +袁 +冷 +胜 +绝 +析 +块 +剂 +测 +丝 +协 +诉 +念 +陈 +仍 +罗 +盐 +友 +洋 +错 +苦 +夜 +刑 +移 +频 +逐 +靠 +混 +母 +短 +皮 +终 +聚 +汽 +村 +云 +哪 +既 +距 +卫 +停 +烈 +央 +察 +烧 +迅 +境 +若 +印 +洲 +刻 +括 +激 +孔 +搞 +甚 +室 +待 +核 +校 +散 +侵 +吧 +甲 +游 +久 +菜 +味 +旧 +模 +湖 +货 +损 +预 +阻 +毫 +普 +稳 +乙 +妈 +植 +息 +扩 +银 +语 +挥 +酒 +守 +拿 +序 +纸 +医 +缺 +雨 +吗 +针 +刘 +啊 +急 +唱 +误 +训 +愿 +审 +附 +获 +茶 +鲜 +粮 +斤 +孩 +脱 +硫 +肥 +善 +龙 +演 +父 +渐 +血 +欢 +械 +掌 +歌 +沙 +刚 +攻 +谓 +盾 +讨 +晚 +粒 +乱 +燃 +矛 +乎 +杀 +药 +宁 +鲁 +贵 +钟 +煤 +读 +班 +伯 +香 +介 +迫 +句 +丰 +培 +握 +兰 +担 +弦 +蛋 +沉 +假 +穿 +执 +答 +乐 +谁 +顺 +烟 +缩 +征 +脸 +喜 +松 +脚 +困 +异 +免 +背 +星 +福 +买 +染 +井 +概 +慢 +怕 +磁 +倍 +祖 +皇 +促 +静 +补 +评 +翻 +肉 +践 +尼 +衣 +宽 +扬 +棉 +希 +伤 +操 +垂 +秋 +宜 +氢 +套 +督 +振 +架 +亮 +末 +宪 +庆 +编 +牛 +触 +映 +雷 +销 +诗 +座 +居 +抓 +裂 +胞 +呼 +娘 +景 +威 +绿 +晶 +厚 +盟 +衡 +鸡 +孙 +延 +危 +胶 +屋 +乡 +临 +陆 +顾 +掉 +呀 +灯 +岁 +措 +束 +耐 +剧 +玉 +赵 +跳 +哥 +季 +课 +凯 +胡 +额 +款 +绍 +卷 +齐 +伟 +蒸 +殖 +永 +宗 +苗 +川 +炉 +岩 +弱 +零 +杨 +奏 +沿 +露 +杆 +探 +滑 +镇 +饭 +浓 +航 +怀 +赶 +库 +夺 +伊 +灵 +税 +途 +灭 +赛 +归 +召 +鼓 +播 +盘 +裁 +险 +康 +唯 +录 +菌 +纯 +借 +糖 +盖 +横 +符 +私 +努 +堂 +域 +枪 +润 +幅 +哈 +竟 +熟 +虫 +泽 +脑 +壤 +碳 +欧 +遍 +侧 +寨 +敢 +彻 +虑 +斜 +薄 +庭 +纳 +弹 +饲 +伸 +折 +麦 +湿 +暗 +荷 +瓦 +塞 +床 +筑 +恶 +户 +访 +塔 +奇 +透 +梁 +刀 +旋 +迹 +卡 +氯 +遇 +份 +毒 +泥 +退 +洗 +摆 +灰 +彩 +卖 +耗 +夏 +择 +忙 +铜 +献 +硬 +予 +繁 +圈 +雪 +函 +亦 +抽 +篇 +阵 +阴 +丁 +尺 +追 +堆 +雄 +迎 +泛 +爸 +楼 +避 +谋 +吨 +野 +猪 +旗 +累 +偏 +典 +馆 +索 +秦 +脂 +潮 +爷 +豆 +忽 +托 +惊 +塑 +遗 +愈 +朱 +替 +纤 +粗 +倾 +尚 +痛 +楚 +谢 +奋 +购 +磨 +君 +池 +旁 +碎 +骨 +监 +捕 +弟 +暴 +割 +贯 +殊 +释 +词 +亡 +壁 +顿 +宝 +午 +尘 +闻 +揭 +炮 +残 +冬 +桥 +妇 +警 +综 +招 +吴 +付 +浮 +遭 +徐 +您 +摇 +谷 +赞 +箱 +隔 +订 +男 +吹 +园 +纷 +唐 +败 +宋 +玻 +巨 +耕 +坦 +荣 +闭 +湾 +键 +凡 +驻 +锅 +救 +恩 +剥 +凝 +碱 +齿 +截 +炼 +麻 +纺 +禁 +废 +盛 +版 +缓 +净 +睛 +昌 +婚 +涉 +筒 +嘴 +插 +岸 +朗 +庄 +街 +藏 +姑 +贸 +腐 +奴 +啦 +惯 +乘 +伙 +恢 +匀 +纱 +扎 +辩 +耳 +彪 +臣 +亿 +璃 +抵 +脉 +秀 +萨 +俄 +网 +舞 +店 +喷 +纵 +寸 +汗 +挂 +洪 +贺 +闪 +柬 +爆 +烯 +津 +稻 +墙 +软 +勇 +像 +滚 +厘 +蒙 +芳 +肯 +坡 +柱 +荡 +腿 +仪 +旅 +尾 +轧 +冰 +贡 +登 +黎 +削 +钻 +勒 +逃 +障 +氨 +郭 +峰 +币 +港 +伏 +轨 +亩 +毕 +擦 +莫 +刺 +浪 +秘 +援 +株 +健 +售 +股 +岛 +甘 +泡 +睡 +童 +铸 +汤 +阀 +休 +汇 +舍 +牧 +绕 +炸 +哲 +磷 +绩 +朋 +淡 +尖 +启 +陷 +柴 +呈 +徒 +颜 +泪 +稍 +忘 +泵 +蓝 +拖 +洞 +授 +镜 +辛 +壮 +锋 +贫 +虚 +弯 +摩 +泰 +幼 +廷 +尊 +窗 +纲 +弄 +隶 +疑 +氏 +宫 +姐 +震 +瑞 +怪 +尤 +琴 +循 +描 +膜 +违 +夹 +腰 +缘 +珠 +穷 +森 +枝 +竹 +沟 +催 +绳 +忆 +邦 +剩 +幸 +浆 +栏 +拥 +牙 +贮 +礼 +滤 +钠 +纹 +罢 +拍 +咱 +喊 +袖 +埃 +勤 +罚 +焦 +潜 +伍 +墨 +欲 +缝 +姓 +刊 +饱 +仿 +奖 +铝 +鬼 +丽 +跨 +默 +挖 +链 +扫 +喝 +袋 +炭 +污 +幕 +诸 +弧 +励 +梅 +奶 +洁 +灾 +舟 +鉴 +苯 +讼 +抱 +毁 +懂 +寒 +智 +埔 +寄 +届 +跃 +渡 +挑 +丹 +艰 +贝 +碰 +拔 +爹 +戴 +码 +梦 +芽 +熔 +赤 +渔 +哭 +敬 +颗 +奔 +铅 +仲 +虎 +稀 +妹 +乏 +珍 +申 +桌 +遵 +允 +隆 +螺 +仓 +魏 +锐 +晓 +氮 +兼 +隐 +碍 +赫 +拨 +忠 +肃 +缸 +牵 +抢 +博 +巧 +壳 +兄 +杜 +讯 +诚 +碧 +祥 +柯 +页 +巡 +矩 +悲 +灌 +龄 +伦 +票 +寻 +桂 +铺 +圣 +恐 +恰 +郑 +趣 +抬 +荒 +腾 +贴 +柔 +滴 +猛 +阔 +辆 +妻 +填 +撤 +储 +签 +闹 +扰 +紫 +砂 +递 +戏 +吊 +陶 +伐 +喂 +疗 +瓶 +婆 +抚 +臂 +摸 +忍 +虾 +蜡 +邻 +胸 +巩 +挤 +偶 +弃 +槽 +劲 +乳 +邓 +吉 +仁 +烂 +砖 +租 +乌 +舰 +伴 +瓜 +浅 +丙 +暂 +燥 +橡 +柳 +迷 +暖 +牌 +秧 +胆 +详 +簧 +踏 +瓷 +谱 +呆 +宾 +糊 +洛 +辉 +愤 +竞 +隙 +怒 +粘 +乃 +绪 +肩 +籍 +敏 +涂 +熙 +皆 +侦 +悬 +掘 +享 +纠 +醒 +狂 +锁 +淀 +恨 +牲 +霸 +爬 +赏 +逆 +玩 +陵 +祝 +秒 +浙 +貌 +役 +彼 +悉 +鸭 +趋 +凤 +晨 +畜 +辈 +秩 +卵 +署 +梯 +炎 +滩 +棋 +驱 +筛 +峡 +冒 +啥 +寿 +译 +浸 +泉 +帽 +迟 +硅 +疆 +贷 +漏 +稿 +冠 +嫩 +胁 +芯 +牢 +叛 +蚀 +奥 +鸣 +岭 +羊 +凭 +串 +塘 +绘 +酵 +融 +盆 +锡 +庙 +筹 +冻 +辅 +摄 +袭 +筋 +拒 +僚 +旱 +钾 +鸟 +漆 +沈 +眉 +疏 +添 +棒 +穗 +硝 +韩 +逼 +扭 +侨 +凉 +挺 +碗 +栽 +炒 +杯 +患 +馏 +劝 +豪 +辽 +勃 +鸿 +旦 +吏 +拜 +狗 +埋 +辊 +掩 +饮 +搬 +骂 +辞 +勾 +扣 +估 +蒋 +绒 +雾 +丈 +朵 +姆 +拟 +宇 +辑 +陕 +雕 +偿 +蓄 +崇 +剪 +倡 +厅 +咬 +驶 +薯 +刷 +斥 +番 +赋 +奉 +佛 +浇 +漫 +曼 +扇 +钙 +桃 +扶 +仔 +返 +俗 +亏 +腔 +鞋 +棱 +覆 +框 +悄 +叔 +撞 +骗 +勘 +旺 +沸 +孤 +吐 +孟 +渠 +屈 +疾 +妙 +惜 +仰 +狠 +胀 +谐 +抛 +霉 +桑 +岗 +嘛 +衰 +盗 +渗 +脏 +赖 +涌 +甜 +曹 +阅 +肌 +哩 +厉 +烃 +纬 +毅 +昨 +伪 +症 +煮 +叹 +钉 +搭 +茎 +笼 +酷 +偷 +弓 +锥 +恒 +杰 +坑 +鼻 +翼 +纶 +叙 +狱 +逮 +罐 +络 +棚 +抑 +膨 +蔬 +寺 +骤 +穆 +冶 +枯 +册 +尸 +凸 +绅 +坯 +牺 +焰 +轰 +欣 +晋 +瘦 +御 +锭 +锦 +丧 +旬 +锻 +垄 +搜 +扑 +邀 +亭 +酯 +迈 +舒 +脆 +酶 +闲 +忧 +酚 +顽 +羽 +涨 +卸 +仗 +陪 +辟 +惩 +杭 +姚 +肚 +捉 +飘 +漂 +昆 +欺 +吾 +郎 +烷 +汁 +呵 +饰 +萧 +雅 +邮 +迁 +燕 +撒 +姻 +赴 +宴 +烦 +债 +帐 +斑 +铃 +旨 +醇 +董 +饼 +雏 +姿 +拌 +傅 +腹 +妥 +揉 +贤 +拆 +歪 +葡 +胺 +丢 +浩 +徽 +昂 +垫 +挡 +览 +贪 +慰 +缴 +汪 +慌 +冯 +诺 +姜 +谊 +凶 +劣 +诬 +耀 +昏 +躺 +盈 +骑 +乔 +溪 +丛 +卢 +抹 +闷 +咨 +刮 +驾 +缆 +悟 +摘 +铒 +掷 +颇 +幻 +柄 +惠 +惨 +佳 +仇 +腊 +窝 +涤 +剑 +瞧 +堡 +泼 +葱 +罩 +霍 +捞 +胎 +苍 +滨 +俩 +捅 +湘 +砍 +霞 +邵 +萄 +疯 +淮 +遂 +熊 +粪 +烘 +宿 +档 +戈 +驳 +嫂 +裕 +徙 +箭 +捐 +肠 +撑 +晒 +辨 +殿 +莲 +摊 +搅 +酱 +屏 +疫 +哀 +蔡 +堵 +沫 +皱 +畅 +叠 +阁 +莱 +敲 +辖 +钩 +痕 +坝 +巷 +饿 +祸 +丘 +玄 +溜 +曰 +逻 +彭 +尝 +卿 +妨 +艇 +吞 +韦 +怨 +矮 +歇 +` diff --git a/vendor/github.com/tyler-smith/go-bip39/wordlists/chinese_traditional.go b/vendor/github.com/tyler-smith/go-bip39/wordlists/chinese_traditional.go new file mode 100644 index 000000000000..83812cee5ff2 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/wordlists/chinese_traditional.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt + // $ crc32 chinese_traditional.txt + // 3c20b443 + checksum := crc32.ChecksumIEEE([]byte(chineseTraditional)) + if fmt.Sprintf("%x", checksum) != "3c20b443" { + panic("chineseTraditional checksum invalid") + } +} + +// ChineseTraditional is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt +var ChineseTraditional = strings.Split(strings.TrimSpace(chineseTraditional), "\n") +var chineseTraditional = `的 +一 +是 +在 +不 +了 +有 +和 +人 +這 +中 +大 +為 +上 +個 +國 +我 +以 +要 +他 +時 +來 +用 +們 +生 +到 +作 +地 +於 +出 +就 +分 +對 +成 +會 +可 +主 +發 +年 +動 +同 +工 +也 +能 +下 +過 +子 +說 +產 +種 +面 +而 +方 +後 +多 +定 +行 +學 +法 +所 +民 +得 +經 +十 +三 +之 +進 +著 +等 +部 +度 +家 +電 +力 +裡 +如 +水 +化 +高 +自 +二 +理 +起 +小 +物 +現 +實 +加 +量 +都 +兩 +體 +制 +機 +當 +使 +點 +從 +業 +本 +去 +把 +性 +好 +應 +開 +它 +合 +還 +因 +由 +其 +些 +然 +前 +外 +天 +政 +四 +日 +那 +社 +義 +事 +平 +形 +相 +全 +表 +間 +樣 +與 +關 +各 +重 +新 +線 +內 +數 +正 +心 +反 +你 +明 +看 +原 +又 +麼 +利 +比 +或 +但 +質 +氣 +第 +向 +道 +命 +此 +變 +條 +只 +沒 +結 +解 +問 +意 +建 +月 +公 +無 +系 +軍 +很 +情 +者 +最 +立 +代 +想 +已 +通 +並 +提 +直 +題 +黨 +程 +展 +五 +果 +料 +象 +員 +革 +位 +入 +常 +文 +總 +次 +品 +式 +活 +設 +及 +管 +特 +件 +長 +求 +老 +頭 +基 +資 +邊 +流 +路 +級 +少 +圖 +山 +統 +接 +知 +較 +將 +組 +見 +計 +別 +她 +手 +角 +期 +根 +論 +運 +農 +指 +幾 +九 +區 +強 +放 +決 +西 +被 +幹 +做 +必 +戰 +先 +回 +則 +任 +取 +據 +處 +隊 +南 +給 +色 +光 +門 +即 +保 +治 +北 +造 +百 +規 +熱 +領 +七 +海 +口 +東 +導 +器 +壓 +志 +世 +金 +增 +爭 +濟 +階 +油 +思 +術 +極 +交 +受 +聯 +什 +認 +六 +共 +權 +收 +證 +改 +清 +美 +再 +採 +轉 +更 +單 +風 +切 +打 +白 +教 +速 +花 +帶 +安 +場 +身 +車 +例 +真 +務 +具 +萬 +每 +目 +至 +達 +走 +積 +示 +議 +聲 +報 +鬥 +完 +類 +八 +離 +華 +名 +確 +才 +科 +張 +信 +馬 +節 +話 +米 +整 +空 +元 +況 +今 +集 +溫 +傳 +土 +許 +步 +群 +廣 +石 +記 +需 +段 +研 +界 +拉 +林 +律 +叫 +且 +究 +觀 +越 +織 +裝 +影 +算 +低 +持 +音 +眾 +書 +布 +复 +容 +兒 +須 +際 +商 +非 +驗 +連 +斷 +深 +難 +近 +礦 +千 +週 +委 +素 +技 +備 +半 +辦 +青 +省 +列 +習 +響 +約 +支 +般 +史 +感 +勞 +便 +團 +往 +酸 +歷 +市 +克 +何 +除 +消 +構 +府 +稱 +太 +準 +精 +值 +號 +率 +族 +維 +劃 +選 +標 +寫 +存 +候 +毛 +親 +快 +效 +斯 +院 +查 +江 +型 +眼 +王 +按 +格 +養 +易 +置 +派 +層 +片 +始 +卻 +專 +狀 +育 +廠 +京 +識 +適 +屬 +圓 +包 +火 +住 +調 +滿 +縣 +局 +照 +參 +紅 +細 +引 +聽 +該 +鐵 +價 +嚴 +首 +底 +液 +官 +德 +隨 +病 +蘇 +失 +爾 +死 +講 +配 +女 +黃 +推 +顯 +談 +罪 +神 +藝 +呢 +席 +含 +企 +望 +密 +批 +營 +項 +防 +舉 +球 +英 +氧 +勢 +告 +李 +台 +落 +木 +幫 +輪 +破 +亞 +師 +圍 +注 +遠 +字 +材 +排 +供 +河 +態 +封 +另 +施 +減 +樹 +溶 +怎 +止 +案 +言 +士 +均 +武 +固 +葉 +魚 +波 +視 +僅 +費 +緊 +愛 +左 +章 +早 +朝 +害 +續 +輕 +服 +試 +食 +充 +兵 +源 +判 +護 +司 +足 +某 +練 +差 +致 +板 +田 +降 +黑 +犯 +負 +擊 +范 +繼 +興 +似 +餘 +堅 +曲 +輸 +修 +故 +城 +夫 +夠 +送 +筆 +船 +佔 +右 +財 +吃 +富 +春 +職 +覺 +漢 +畫 +功 +巴 +跟 +雖 +雜 +飛 +檢 +吸 +助 +昇 +陽 +互 +初 +創 +抗 +考 +投 +壞 +策 +古 +徑 +換 +未 +跑 +留 +鋼 +曾 +端 +責 +站 +簡 +述 +錢 +副 +盡 +帝 +射 +草 +衝 +承 +獨 +令 +限 +阿 +宣 +環 +雙 +請 +超 +微 +讓 +控 +州 +良 +軸 +找 +否 +紀 +益 +依 +優 +頂 +礎 +載 +倒 +房 +突 +坐 +粉 +敵 +略 +客 +袁 +冷 +勝 +絕 +析 +塊 +劑 +測 +絲 +協 +訴 +念 +陳 +仍 +羅 +鹽 +友 +洋 +錯 +苦 +夜 +刑 +移 +頻 +逐 +靠 +混 +母 +短 +皮 +終 +聚 +汽 +村 +雲 +哪 +既 +距 +衛 +停 +烈 +央 +察 +燒 +迅 +境 +若 +印 +洲 +刻 +括 +激 +孔 +搞 +甚 +室 +待 +核 +校 +散 +侵 +吧 +甲 +遊 +久 +菜 +味 +舊 +模 +湖 +貨 +損 +預 +阻 +毫 +普 +穩 +乙 +媽 +植 +息 +擴 +銀 +語 +揮 +酒 +守 +拿 +序 +紙 +醫 +缺 +雨 +嗎 +針 +劉 +啊 +急 +唱 +誤 +訓 +願 +審 +附 +獲 +茶 +鮮 +糧 +斤 +孩 +脫 +硫 +肥 +善 +龍 +演 +父 +漸 +血 +歡 +械 +掌 +歌 +沙 +剛 +攻 +謂 +盾 +討 +晚 +粒 +亂 +燃 +矛 +乎 +殺 +藥 +寧 +魯 +貴 +鐘 +煤 +讀 +班 +伯 +香 +介 +迫 +句 +豐 +培 +握 +蘭 +擔 +弦 +蛋 +沉 +假 +穿 +執 +答 +樂 +誰 +順 +煙 +縮 +徵 +臉 +喜 +松 +腳 +困 +異 +免 +背 +星 +福 +買 +染 +井 +概 +慢 +怕 +磁 +倍 +祖 +皇 +促 +靜 +補 +評 +翻 +肉 +踐 +尼 +衣 +寬 +揚 +棉 +希 +傷 +操 +垂 +秋 +宜 +氫 +套 +督 +振 +架 +亮 +末 +憲 +慶 +編 +牛 +觸 +映 +雷 +銷 +詩 +座 +居 +抓 +裂 +胞 +呼 +娘 +景 +威 +綠 +晶 +厚 +盟 +衡 +雞 +孫 +延 +危 +膠 +屋 +鄉 +臨 +陸 +顧 +掉 +呀 +燈 +歲 +措 +束 +耐 +劇 +玉 +趙 +跳 +哥 +季 +課 +凱 +胡 +額 +款 +紹 +卷 +齊 +偉 +蒸 +殖 +永 +宗 +苗 +川 +爐 +岩 +弱 +零 +楊 +奏 +沿 +露 +桿 +探 +滑 +鎮 +飯 +濃 +航 +懷 +趕 +庫 +奪 +伊 +靈 +稅 +途 +滅 +賽 +歸 +召 +鼓 +播 +盤 +裁 +險 +康 +唯 +錄 +菌 +純 +借 +糖 +蓋 +橫 +符 +私 +努 +堂 +域 +槍 +潤 +幅 +哈 +竟 +熟 +蟲 +澤 +腦 +壤 +碳 +歐 +遍 +側 +寨 +敢 +徹 +慮 +斜 +薄 +庭 +納 +彈 +飼 +伸 +折 +麥 +濕 +暗 +荷 +瓦 +塞 +床 +築 +惡 +戶 +訪 +塔 +奇 +透 +梁 +刀 +旋 +跡 +卡 +氯 +遇 +份 +毒 +泥 +退 +洗 +擺 +灰 +彩 +賣 +耗 +夏 +擇 +忙 +銅 +獻 +硬 +予 +繁 +圈 +雪 +函 +亦 +抽 +篇 +陣 +陰 +丁 +尺 +追 +堆 +雄 +迎 +泛 +爸 +樓 +避 +謀 +噸 +野 +豬 +旗 +累 +偏 +典 +館 +索 +秦 +脂 +潮 +爺 +豆 +忽 +托 +驚 +塑 +遺 +愈 +朱 +替 +纖 +粗 +傾 +尚 +痛 +楚 +謝 +奮 +購 +磨 +君 +池 +旁 +碎 +骨 +監 +捕 +弟 +暴 +割 +貫 +殊 +釋 +詞 +亡 +壁 +頓 +寶 +午 +塵 +聞 +揭 +炮 +殘 +冬 +橋 +婦 +警 +綜 +招 +吳 +付 +浮 +遭 +徐 +您 +搖 +谷 +贊 +箱 +隔 +訂 +男 +吹 +園 +紛 +唐 +敗 +宋 +玻 +巨 +耕 +坦 +榮 +閉 +灣 +鍵 +凡 +駐 +鍋 +救 +恩 +剝 +凝 +鹼 +齒 +截 +煉 +麻 +紡 +禁 +廢 +盛 +版 +緩 +淨 +睛 +昌 +婚 +涉 +筒 +嘴 +插 +岸 +朗 +莊 +街 +藏 +姑 +貿 +腐 +奴 +啦 +慣 +乘 +夥 +恢 +勻 +紗 +扎 +辯 +耳 +彪 +臣 +億 +璃 +抵 +脈 +秀 +薩 +俄 +網 +舞 +店 +噴 +縱 +寸 +汗 +掛 +洪 +賀 +閃 +柬 +爆 +烯 +津 +稻 +牆 +軟 +勇 +像 +滾 +厘 +蒙 +芳 +肯 +坡 +柱 +盪 +腿 +儀 +旅 +尾 +軋 +冰 +貢 +登 +黎 +削 +鑽 +勒 +逃 +障 +氨 +郭 +峰 +幣 +港 +伏 +軌 +畝 +畢 +擦 +莫 +刺 +浪 +秘 +援 +株 +健 +售 +股 +島 +甘 +泡 +睡 +童 +鑄 +湯 +閥 +休 +匯 +舍 +牧 +繞 +炸 +哲 +磷 +績 +朋 +淡 +尖 +啟 +陷 +柴 +呈 +徒 +顏 +淚 +稍 +忘 +泵 +藍 +拖 +洞 +授 +鏡 +辛 +壯 +鋒 +貧 +虛 +彎 +摩 +泰 +幼 +廷 +尊 +窗 +綱 +弄 +隸 +疑 +氏 +宮 +姐 +震 +瑞 +怪 +尤 +琴 +循 +描 +膜 +違 +夾 +腰 +緣 +珠 +窮 +森 +枝 +竹 +溝 +催 +繩 +憶 +邦 +剩 +幸 +漿 +欄 +擁 +牙 +貯 +禮 +濾 +鈉 +紋 +罷 +拍 +咱 +喊 +袖 +埃 +勤 +罰 +焦 +潛 +伍 +墨 +欲 +縫 +姓 +刊 +飽 +仿 +獎 +鋁 +鬼 +麗 +跨 +默 +挖 +鏈 +掃 +喝 +袋 +炭 +污 +幕 +諸 +弧 +勵 +梅 +奶 +潔 +災 +舟 +鑑 +苯 +訟 +抱 +毀 +懂 +寒 +智 +埔 +寄 +屆 +躍 +渡 +挑 +丹 +艱 +貝 +碰 +拔 +爹 +戴 +碼 +夢 +芽 +熔 +赤 +漁 +哭 +敬 +顆 +奔 +鉛 +仲 +虎 +稀 +妹 +乏 +珍 +申 +桌 +遵 +允 +隆 +螺 +倉 +魏 +銳 +曉 +氮 +兼 +隱 +礙 +赫 +撥 +忠 +肅 +缸 +牽 +搶 +博 +巧 +殼 +兄 +杜 +訊 +誠 +碧 +祥 +柯 +頁 +巡 +矩 +悲 +灌 +齡 +倫 +票 +尋 +桂 +鋪 +聖 +恐 +恰 +鄭 +趣 +抬 +荒 +騰 +貼 +柔 +滴 +猛 +闊 +輛 +妻 +填 +撤 +儲 +簽 +鬧 +擾 +紫 +砂 +遞 +戲 +吊 +陶 +伐 +餵 +療 +瓶 +婆 +撫 +臂 +摸 +忍 +蝦 +蠟 +鄰 +胸 +鞏 +擠 +偶 +棄 +槽 +勁 +乳 +鄧 +吉 +仁 +爛 +磚 +租 +烏 +艦 +伴 +瓜 +淺 +丙 +暫 +燥 +橡 +柳 +迷 +暖 +牌 +秧 +膽 +詳 +簧 +踏 +瓷 +譜 +呆 +賓 +糊 +洛 +輝 +憤 +競 +隙 +怒 +粘 +乃 +緒 +肩 +籍 +敏 +塗 +熙 +皆 +偵 +懸 +掘 +享 +糾 +醒 +狂 +鎖 +淀 +恨 +牲 +霸 +爬 +賞 +逆 +玩 +陵 +祝 +秒 +浙 +貌 +役 +彼 +悉 +鴨 +趨 +鳳 +晨 +畜 +輩 +秩 +卵 +署 +梯 +炎 +灘 +棋 +驅 +篩 +峽 +冒 +啥 +壽 +譯 +浸 +泉 +帽 +遲 +矽 +疆 +貸 +漏 +稿 +冠 +嫩 +脅 +芯 +牢 +叛 +蝕 +奧 +鳴 +嶺 +羊 +憑 +串 +塘 +繪 +酵 +融 +盆 +錫 +廟 +籌 +凍 +輔 +攝 +襲 +筋 +拒 +僚 +旱 +鉀 +鳥 +漆 +沈 +眉 +疏 +添 +棒 +穗 +硝 +韓 +逼 +扭 +僑 +涼 +挺 +碗 +栽 +炒 +杯 +患 +餾 +勸 +豪 +遼 +勃 +鴻 +旦 +吏 +拜 +狗 +埋 +輥 +掩 +飲 +搬 +罵 +辭 +勾 +扣 +估 +蔣 +絨 +霧 +丈 +朵 +姆 +擬 +宇 +輯 +陝 +雕 +償 +蓄 +崇 +剪 +倡 +廳 +咬 +駛 +薯 +刷 +斥 +番 +賦 +奉 +佛 +澆 +漫 +曼 +扇 +鈣 +桃 +扶 +仔 +返 +俗 +虧 +腔 +鞋 +棱 +覆 +框 +悄 +叔 +撞 +騙 +勘 +旺 +沸 +孤 +吐 +孟 +渠 +屈 +疾 +妙 +惜 +仰 +狠 +脹 +諧 +拋 +黴 +桑 +崗 +嘛 +衰 +盜 +滲 +臟 +賴 +湧 +甜 +曹 +閱 +肌 +哩 +厲 +烴 +緯 +毅 +昨 +偽 +症 +煮 +嘆 +釘 +搭 +莖 +籠 +酷 +偷 +弓 +錐 +恆 +傑 +坑 +鼻 +翼 +綸 +敘 +獄 +逮 +罐 +絡 +棚 +抑 +膨 +蔬 +寺 +驟 +穆 +冶 +枯 +冊 +屍 +凸 +紳 +坯 +犧 +焰 +轟 +欣 +晉 +瘦 +禦 +錠 +錦 +喪 +旬 +鍛 +壟 +搜 +撲 +邀 +亭 +酯 +邁 +舒 +脆 +酶 +閒 +憂 +酚 +頑 +羽 +漲 +卸 +仗 +陪 +闢 +懲 +杭 +姚 +肚 +捉 +飄 +漂 +昆 +欺 +吾 +郎 +烷 +汁 +呵 +飾 +蕭 +雅 +郵 +遷 +燕 +撒 +姻 +赴 +宴 +煩 +債 +帳 +斑 +鈴 +旨 +醇 +董 +餅 +雛 +姿 +拌 +傅 +腹 +妥 +揉 +賢 +拆 +歪 +葡 +胺 +丟 +浩 +徽 +昂 +墊 +擋 +覽 +貪 +慰 +繳 +汪 +慌 +馮 +諾 +姜 +誼 +兇 +劣 +誣 +耀 +昏 +躺 +盈 +騎 +喬 +溪 +叢 +盧 +抹 +悶 +諮 +刮 +駕 +纜 +悟 +摘 +鉺 +擲 +頗 +幻 +柄 +惠 +慘 +佳 +仇 +臘 +窩 +滌 +劍 +瞧 +堡 +潑 +蔥 +罩 +霍 +撈 +胎 +蒼 +濱 +倆 +捅 +湘 +砍 +霞 +邵 +萄 +瘋 +淮 +遂 +熊 +糞 +烘 +宿 +檔 +戈 +駁 +嫂 +裕 +徙 +箭 +捐 +腸 +撐 +曬 +辨 +殿 +蓮 +攤 +攪 +醬 +屏 +疫 +哀 +蔡 +堵 +沫 +皺 +暢 +疊 +閣 +萊 +敲 +轄 +鉤 +痕 +壩 +巷 +餓 +禍 +丘 +玄 +溜 +曰 +邏 +彭 +嘗 +卿 +妨 +艇 +吞 +韋 +怨 +矮 +歇 +` diff --git a/vendor/github.com/tyler-smith/go-bip39/wordlists/english.go b/vendor/github.com/tyler-smith/go-bip39/wordlists/english.go new file mode 100644 index 000000000000..f69e8a473645 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/wordlists/english.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt + // $ crc32 english.txt + // c1dbd296 + checksum := crc32.ChecksumIEEE([]byte(english)) + if fmt.Sprintf("%x", checksum) != "c1dbd296" { + panic("english checksum invalid") + } +} + +// English is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt +var English = strings.Split(strings.TrimSpace(english), "\n") +var english = `abandon +ability +able +about +above +absent +absorb +abstract +absurd +abuse +access +accident +account +accuse +achieve +acid +acoustic +acquire +across +act +action +actor +actress +actual +adapt +add +addict +address +adjust +admit +adult +advance +advice +aerobic +affair +afford +afraid +again +age +agent +agree +ahead +aim +air +airport +aisle +alarm +album +alcohol +alert +alien +all +alley +allow +almost +alone +alpha +already +also +alter +always +amateur +amazing +among +amount +amused +analyst +anchor +ancient +anger +angle +angry +animal +ankle +announce +annual +another +answer +antenna +antique +anxiety +any +apart +apology +appear +apple +approve +april +arch +arctic +area +arena +argue +arm +armed +armor +army +around +arrange +arrest +arrive +arrow +art +artefact +artist +artwork +ask +aspect +assault +asset +assist +assume +asthma +athlete +atom +attack +attend +attitude +attract +auction +audit +august +aunt +author +auto +autumn +average +avocado +avoid +awake +aware +away +awesome +awful +awkward +axis +baby +bachelor +bacon +badge +bag +balance +balcony +ball +bamboo +banana +banner +bar +barely +bargain +barrel +base +basic +basket +battle +beach +bean +beauty +because +become +beef +before +begin +behave +behind +believe +below +belt +bench +benefit +best +betray +better +between +beyond +bicycle +bid +bike +bind +biology +bird +birth +bitter +black +blade +blame +blanket +blast +bleak +bless +blind +blood +blossom +blouse +blue +blur +blush +board +boat +body +boil +bomb +bone +bonus +book +boost +border +boring +borrow +boss +bottom +bounce +box +boy +bracket +brain +brand +brass +brave +bread +breeze +brick +bridge +brief +bright +bring +brisk +broccoli +broken +bronze +broom +brother +brown +brush +bubble +buddy +budget +buffalo +build +bulb +bulk +bullet +bundle +bunker +burden +burger +burst +bus +business +busy +butter +buyer +buzz +cabbage +cabin +cable +cactus +cage +cake +call +calm +camera +camp +can +canal +cancel +candy +cannon +canoe +canvas +canyon +capable +capital +captain +car +carbon +card +cargo +carpet +carry +cart +case +cash +casino +castle +casual +cat +catalog +catch +category +cattle +caught +cause +caution +cave +ceiling +celery +cement +census +century +cereal +certain +chair +chalk +champion +change +chaos +chapter +charge +chase +chat +cheap +check +cheese +chef +cherry +chest +chicken +chief +child +chimney +choice +choose +chronic +chuckle +chunk +churn +cigar +cinnamon +circle +citizen +city +civil +claim +clap +clarify +claw +clay +clean +clerk +clever +click +client +cliff +climb +clinic +clip +clock +clog +close +cloth +cloud +clown +club +clump +cluster +clutch +coach +coast +coconut +code +coffee +coil +coin +collect +color +column +combine +come +comfort +comic +common +company +concert +conduct +confirm +congress +connect +consider +control +convince +cook +cool +copper +copy +coral +core +corn +correct +cost +cotton +couch +country +couple +course +cousin +cover +coyote +crack +cradle +craft +cram +crane +crash +crater +crawl +crazy +cream +credit +creek +crew +cricket +crime +crisp +critic +crop +cross +crouch +crowd +crucial +cruel +cruise +crumble +crunch +crush +cry +crystal +cube +culture +cup +cupboard +curious +current +curtain +curve +cushion +custom +cute +cycle +dad +damage +damp +dance +danger +daring +dash +daughter +dawn +day +deal +debate +debris +decade +december +decide +decline +decorate +decrease +deer +defense +define +defy +degree +delay +deliver +demand +demise +denial +dentist +deny +depart +depend +deposit +depth +deputy +derive +describe +desert +design +desk +despair +destroy +detail +detect +develop +device +devote +diagram +dial +diamond +diary +dice +diesel +diet +differ +digital +dignity +dilemma +dinner +dinosaur +direct +dirt +disagree +discover +disease +dish +dismiss +disorder +display +distance +divert +divide +divorce +dizzy +doctor +document +dog +doll +dolphin +domain +donate +donkey +donor +door +dose +double +dove +draft +dragon +drama +drastic +draw +dream +dress +drift +drill +drink +drip +drive +drop +drum +dry +duck +dumb +dune +during +dust +dutch +duty +dwarf +dynamic +eager +eagle +early +earn +earth +easily +east +easy +echo +ecology +economy +edge +edit +educate +effort +egg +eight +either +elbow +elder +electric +elegant +element +elephant +elevator +elite +else +embark +embody +embrace +emerge +emotion +employ +empower +empty +enable +enact +end +endless +endorse +enemy +energy +enforce +engage +engine +enhance +enjoy +enlist +enough +enrich +enroll +ensure +enter +entire +entry +envelope +episode +equal +equip +era +erase +erode +erosion +error +erupt +escape +essay +essence +estate +eternal +ethics +evidence +evil +evoke +evolve +exact +example +excess +exchange +excite +exclude +excuse +execute +exercise +exhaust +exhibit +exile +exist +exit +exotic +expand +expect +expire +explain +expose +express +extend +extra +eye +eyebrow +fabric +face +faculty +fade +faint +faith +fall +false +fame +family +famous +fan +fancy +fantasy +farm +fashion +fat +fatal +father +fatigue +fault +favorite +feature +february +federal +fee +feed +feel +female +fence +festival +fetch +fever +few +fiber +fiction +field +figure +file +film +filter +final +find +fine +finger +finish +fire +firm +first +fiscal +fish +fit +fitness +fix +flag +flame +flash +flat +flavor +flee +flight +flip +float +flock +floor +flower +fluid +flush +fly +foam +focus +fog +foil +fold +follow +food +foot +force +forest +forget +fork +fortune +forum +forward +fossil +foster +found +fox +fragile +frame +frequent +fresh +friend +fringe +frog +front +frost +frown +frozen +fruit +fuel +fun +funny +furnace +fury +future +gadget +gain +galaxy +gallery +game +gap +garage +garbage +garden +garlic +garment +gas +gasp +gate +gather +gauge +gaze +general +genius +genre +gentle +genuine +gesture +ghost +giant +gift +giggle +ginger +giraffe +girl +give +glad +glance +glare +glass +glide +glimpse +globe +gloom +glory +glove +glow +glue +goat +goddess +gold +good +goose +gorilla +gospel +gossip +govern +gown +grab +grace +grain +grant +grape +grass +gravity +great +green +grid +grief +grit +grocery +group +grow +grunt +guard +guess +guide +guilt +guitar +gun +gym +habit +hair +half +hammer +hamster +hand +happy +harbor +hard +harsh +harvest +hat +have +hawk +hazard +head +health +heart +heavy +hedgehog +height +hello +helmet +help +hen +hero +hidden +high +hill +hint +hip +hire +history +hobby +hockey +hold +hole +holiday +hollow +home +honey +hood +hope +horn +horror +horse +hospital +host +hotel +hour +hover +hub +huge +human +humble +humor +hundred +hungry +hunt +hurdle +hurry +hurt +husband +hybrid +ice +icon +idea +identify +idle +ignore +ill +illegal +illness +image +imitate +immense +immune +impact +impose +improve +impulse +inch +include +income +increase +index +indicate +indoor +industry +infant +inflict +inform +inhale +inherit +initial +inject +injury +inmate +inner +innocent +input +inquiry +insane +insect +inside +inspire +install +intact +interest +into +invest +invite +involve +iron +island +isolate +issue +item +ivory +jacket +jaguar +jar +jazz +jealous +jeans +jelly +jewel +job +join +joke +journey +joy +judge +juice +jump +jungle +junior +junk +just +kangaroo +keen +keep +ketchup +key +kick +kid +kidney +kind +kingdom +kiss +kit +kitchen +kite +kitten +kiwi +knee +knife +knock +know +lab +label +labor +ladder +lady +lake +lamp +language +laptop +large +later +latin +laugh +laundry +lava +law +lawn +lawsuit +layer +lazy +leader +leaf +learn +leave +lecture +left +leg +legal +legend +leisure +lemon +lend +length +lens +leopard +lesson +letter +level +liar +liberty +library +license +life +lift +light +like +limb +limit +link +lion +liquid +list +little +live +lizard +load +loan +lobster +local +lock +logic +lonely +long +loop +lottery +loud +lounge +love +loyal +lucky +luggage +lumber +lunar +lunch +luxury +lyrics +machine +mad +magic +magnet +maid +mail +main +major +make +mammal +man +manage +mandate +mango +mansion +manual +maple +marble +march +margin +marine +market +marriage +mask +mass +master +match +material +math +matrix +matter +maximum +maze +meadow +mean +measure +meat +mechanic +medal +media +melody +melt +member +memory +mention +menu +mercy +merge +merit +merry +mesh +message +metal +method +middle +midnight +milk +million +mimic +mind +minimum +minor +minute +miracle +mirror +misery +miss +mistake +mix +mixed +mixture +mobile +model +modify +mom +moment +monitor +monkey +monster +month +moon +moral +more +morning +mosquito +mother +motion +motor +mountain +mouse +move +movie +much +muffin +mule +multiply +muscle +museum +mushroom +music +must +mutual +myself +mystery +myth +naive +name +napkin +narrow +nasty +nation +nature +near +neck +need +negative +neglect +neither +nephew +nerve +nest +net +network +neutral +never +news +next +nice +night +noble +noise +nominee +noodle +normal +north +nose +notable +note +nothing +notice +novel +now +nuclear +number +nurse +nut +oak +obey +object +oblige +obscure +observe +obtain +obvious +occur +ocean +october +odor +off +offer +office +often +oil +okay +old +olive +olympic +omit +once +one +onion +online +only +open +opera +opinion +oppose +option +orange +orbit +orchard +order +ordinary +organ +orient +original +orphan +ostrich +other +outdoor +outer +output +outside +oval +oven +over +own +owner +oxygen +oyster +ozone +pact +paddle +page +pair +palace +palm +panda +panel +panic +panther +paper +parade +parent +park +parrot +party +pass +patch +path +patient +patrol +pattern +pause +pave +payment +peace +peanut +pear +peasant +pelican +pen +penalty +pencil +people +pepper +perfect +permit +person +pet +phone +photo +phrase +physical +piano +picnic +picture +piece +pig +pigeon +pill +pilot +pink +pioneer +pipe +pistol +pitch +pizza +place +planet +plastic +plate +play +please +pledge +pluck +plug +plunge +poem +poet +point +polar +pole +police +pond +pony +pool +popular +portion +position +possible +post +potato +pottery +poverty +powder +power +practice +praise +predict +prefer +prepare +present +pretty +prevent +price +pride +primary +print +priority +prison +private +prize +problem +process +produce +profit +program +project +promote +proof +property +prosper +protect +proud +provide +public +pudding +pull +pulp +pulse +pumpkin +punch +pupil +puppy +purchase +purity +purpose +purse +push +put +puzzle +pyramid +quality +quantum +quarter +question +quick +quit +quiz +quote +rabbit +raccoon +race +rack +radar +radio +rail +rain +raise +rally +ramp +ranch +random +range +rapid +rare +rate +rather +raven +raw +razor +ready +real +reason +rebel +rebuild +recall +receive +recipe +record +recycle +reduce +reflect +reform +refuse +region +regret +regular +reject +relax +release +relief +rely +remain +remember +remind +remove +render +renew +rent +reopen +repair +repeat +replace +report +require +rescue +resemble +resist +resource +response +result +retire +retreat +return +reunion +reveal +review +reward +rhythm +rib +ribbon +rice +rich +ride +ridge +rifle +right +rigid +ring +riot +ripple +risk +ritual +rival +river +road +roast +robot +robust +rocket +romance +roof +rookie +room +rose +rotate +rough +round +route +royal +rubber +rude +rug +rule +run +runway +rural +sad +saddle +sadness +safe +sail +salad +salmon +salon +salt +salute +same +sample +sand +satisfy +satoshi +sauce +sausage +save +say +scale +scan +scare +scatter +scene +scheme +school +science +scissors +scorpion +scout +scrap +screen +script +scrub +sea +search +season +seat +second +secret +section +security +seed +seek +segment +select +sell +seminar +senior +sense +sentence +series +service +session +settle +setup +seven +shadow +shaft +shallow +share +shed +shell +sheriff +shield +shift +shine +ship +shiver +shock +shoe +shoot +shop +short +shoulder +shove +shrimp +shrug +shuffle +shy +sibling +sick +side +siege +sight +sign +silent +silk +silly +silver +similar +simple +since +sing +siren +sister +situate +six +size +skate +sketch +ski +skill +skin +skirt +skull +slab +slam +sleep +slender +slice +slide +slight +slim +slogan +slot +slow +slush +small +smart +smile +smoke +smooth +snack +snake +snap +sniff +snow +soap +soccer +social +sock +soda +soft +solar +soldier +solid +solution +solve +someone +song +soon +sorry +sort +soul +sound +soup +source +south +space +spare +spatial +spawn +speak +special +speed +spell +spend +sphere +spice +spider +spike +spin +spirit +split +spoil +sponsor +spoon +sport +spot +spray +spread +spring +spy +square +squeeze +squirrel +stable +stadium +staff +stage +stairs +stamp +stand +start +state +stay +steak +steel +stem +step +stereo +stick +still +sting +stock +stomach +stone +stool +story +stove +strategy +street +strike +strong +struggle +student +stuff +stumble +style +subject +submit +subway +success +such +sudden +suffer +sugar +suggest +suit +summer +sun +sunny +sunset +super +supply +supreme +sure +surface +surge +surprise +surround +survey +suspect +sustain +swallow +swamp +swap +swarm +swear +sweet +swift +swim +swing +switch +sword +symbol +symptom +syrup +system +table +tackle +tag +tail +talent +talk +tank +tape +target +task +taste +tattoo +taxi +teach +team +tell +ten +tenant +tennis +tent +term +test +text +thank +that +theme +then +theory +there +they +thing +this +thought +three +thrive +throw +thumb +thunder +ticket +tide +tiger +tilt +timber +time +tiny +tip +tired +tissue +title +toast +tobacco +today +toddler +toe +together +toilet +token +tomato +tomorrow +tone +tongue +tonight +tool +tooth +top +topic +topple +torch +tornado +tortoise +toss +total +tourist +toward +tower +town +toy +track +trade +traffic +tragic +train +transfer +trap +trash +travel +tray +treat +tree +trend +trial +tribe +trick +trigger +trim +trip +trophy +trouble +truck +true +truly +trumpet +trust +truth +try +tube +tuition +tumble +tuna +tunnel +turkey +turn +turtle +twelve +twenty +twice +twin +twist +two +type +typical +ugly +umbrella +unable +unaware +uncle +uncover +under +undo +unfair +unfold +unhappy +uniform +unique +unit +universe +unknown +unlock +until +unusual +unveil +update +upgrade +uphold +upon +upper +upset +urban +urge +usage +use +used +useful +useless +usual +utility +vacant +vacuum +vague +valid +valley +valve +van +vanish +vapor +various +vast +vault +vehicle +velvet +vendor +venture +venue +verb +verify +version +very +vessel +veteran +viable +vibrant +vicious +victory +video +view +village +vintage +violin +virtual +virus +visa +visit +visual +vital +vivid +vocal +voice +void +volcano +volume +vote +voyage +wage +wagon +wait +walk +wall +walnut +want +warfare +warm +warrior +wash +wasp +waste +water +wave +way +wealth +weapon +wear +weasel +weather +web +wedding +weekend +weird +welcome +west +wet +whale +what +wheat +wheel +when +where +whip +whisper +wide +width +wife +wild +will +win +window +wine +wing +wink +winner +winter +wire +wisdom +wise +wish +witness +wolf +woman +wonder +wood +wool +word +work +world +worry +worth +wrap +wreck +wrestle +wrist +write +wrong +yard +year +yellow +you +young +youth +zebra +zero +zone +zoo +` diff --git a/vendor/github.com/tyler-smith/go-bip39/wordlists/french.go b/vendor/github.com/tyler-smith/go-bip39/wordlists/french.go new file mode 100644 index 000000000000..1ae685d3ad61 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/wordlists/french.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt + // $ crc32 french.txt + // 3e56b216 + checksum := crc32.ChecksumIEEE([]byte(french)) + if fmt.Sprintf("%x", checksum) != "3e56b216" { + panic("french checksum invalid") + } +} + +// French is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt +var French = strings.Split(strings.TrimSpace(french), "\n") +var french = `abaisser +abandon +abdiquer +abeille +abolir +aborder +aboutir +aboyer +abrasif +abreuver +abriter +abroger +abrupt +absence +absolu +absurde +abusif +abyssal +académie +acajou +acarien +accabler +accepter +acclamer +accolade +accroche +accuser +acerbe +achat +acheter +aciduler +acier +acompte +acquérir +acronyme +acteur +actif +actuel +adepte +adéquat +adhésif +adjectif +adjuger +admettre +admirer +adopter +adorer +adoucir +adresse +adroit +adulte +adverbe +aérer +aéronef +affaire +affecter +affiche +affreux +affubler +agacer +agencer +agile +agiter +agrafer +agréable +agrume +aider +aiguille +ailier +aimable +aisance +ajouter +ajuster +alarmer +alchimie +alerte +algèbre +algue +aliéner +aliment +alléger +alliage +allouer +allumer +alourdir +alpaga +altesse +alvéole +amateur +ambigu +ambre +aménager +amertume +amidon +amiral +amorcer +amour +amovible +amphibie +ampleur +amusant +analyse +anaphore +anarchie +anatomie +ancien +anéantir +angle +angoisse +anguleux +animal +annexer +annonce +annuel +anodin +anomalie +anonyme +anormal +antenne +antidote +anxieux +apaiser +apéritif +aplanir +apologie +appareil +appeler +apporter +appuyer +aquarium +aqueduc +arbitre +arbuste +ardeur +ardoise +argent +arlequin +armature +armement +armoire +armure +arpenter +arracher +arriver +arroser +arsenic +artériel +article +aspect +asphalte +aspirer +assaut +asservir +assiette +associer +assurer +asticot +astre +astuce +atelier +atome +atrium +atroce +attaque +attentif +attirer +attraper +aubaine +auberge +audace +audible +augurer +aurore +automne +autruche +avaler +avancer +avarice +avenir +averse +aveugle +aviateur +avide +avion +aviser +avoine +avouer +avril +axial +axiome +badge +bafouer +bagage +baguette +baignade +balancer +balcon +baleine +balisage +bambin +bancaire +bandage +banlieue +bannière +banquier +barbier +baril +baron +barque +barrage +bassin +bastion +bataille +bateau +batterie +baudrier +bavarder +belette +bélier +belote +bénéfice +berceau +berger +berline +bermuda +besace +besogne +bétail +beurre +biberon +bicycle +bidule +bijou +bilan +bilingue +billard +binaire +biologie +biopsie +biotype +biscuit +bison +bistouri +bitume +bizarre +blafard +blague +blanchir +blessant +blinder +blond +bloquer +blouson +bobard +bobine +boire +boiser +bolide +bonbon +bondir +bonheur +bonifier +bonus +bordure +borne +botte +boucle +boueux +bougie +boulon +bouquin +bourse +boussole +boutique +boxeur +branche +brasier +brave +brebis +brèche +breuvage +bricoler +brigade +brillant +brioche +brique +brochure +broder +bronzer +brousse +broyeur +brume +brusque +brutal +bruyant +buffle +buisson +bulletin +bureau +burin +bustier +butiner +butoir +buvable +buvette +cabanon +cabine +cachette +cadeau +cadre +caféine +caillou +caisson +calculer +calepin +calibre +calmer +calomnie +calvaire +camarade +caméra +camion +campagne +canal +caneton +canon +cantine +canular +capable +caporal +caprice +capsule +capter +capuche +carabine +carbone +caresser +caribou +carnage +carotte +carreau +carton +cascade +casier +casque +cassure +causer +caution +cavalier +caverne +caviar +cédille +ceinture +céleste +cellule +cendrier +censurer +central +cercle +cérébral +cerise +cerner +cerveau +cesser +chagrin +chaise +chaleur +chambre +chance +chapitre +charbon +chasseur +chaton +chausson +chavirer +chemise +chenille +chéquier +chercher +cheval +chien +chiffre +chignon +chimère +chiot +chlorure +chocolat +choisir +chose +chouette +chrome +chute +cigare +cigogne +cimenter +cinéma +cintrer +circuler +cirer +cirque +citerne +citoyen +citron +civil +clairon +clameur +claquer +classe +clavier +client +cligner +climat +clivage +cloche +clonage +cloporte +cobalt +cobra +cocasse +cocotier +coder +codifier +coffre +cogner +cohésion +coiffer +coincer +colère +colibri +colline +colmater +colonel +combat +comédie +commande +compact +concert +conduire +confier +congeler +connoter +consonne +contact +convexe +copain +copie +corail +corbeau +cordage +corniche +corpus +correct +cortège +cosmique +costume +coton +coude +coupure +courage +couteau +couvrir +coyote +crabe +crainte +cravate +crayon +créature +créditer +crémeux +creuser +crevette +cribler +crier +cristal +critère +croire +croquer +crotale +crucial +cruel +crypter +cubique +cueillir +cuillère +cuisine +cuivre +culminer +cultiver +cumuler +cupide +curatif +curseur +cyanure +cycle +cylindre +cynique +daigner +damier +danger +danseur +dauphin +débattre +débiter +déborder +débrider +débutant +décaler +décembre +déchirer +décider +déclarer +décorer +décrire +décupler +dédale +déductif +déesse +défensif +défiler +défrayer +dégager +dégivrer +déglutir +dégrafer +déjeuner +délice +déloger +demander +demeurer +démolir +dénicher +dénouer +dentelle +dénuder +départ +dépenser +déphaser +déplacer +déposer +déranger +dérober +désastre +descente +désert +désigner +désobéir +dessiner +destrier +détacher +détester +détourer +détresse +devancer +devenir +deviner +devoir +diable +dialogue +diamant +dicter +différer +digérer +digital +digne +diluer +dimanche +diminuer +dioxyde +directif +diriger +discuter +disposer +dissiper +distance +divertir +diviser +docile +docteur +dogme +doigt +domaine +domicile +dompter +donateur +donjon +donner +dopamine +dortoir +dorure +dosage +doseur +dossier +dotation +douanier +double +douceur +douter +doyen +dragon +draper +dresser +dribbler +droiture +duperie +duplexe +durable +durcir +dynastie +éblouir +écarter +écharpe +échelle +éclairer +éclipse +éclore +écluse +école +économie +écorce +écouter +écraser +écrémer +écrivain +écrou +écume +écureuil +édifier +éduquer +effacer +effectif +effigie +effort +effrayer +effusion +égaliser +égarer +éjecter +élaborer +élargir +électron +élégant +éléphant +élève +éligible +élitisme +éloge +élucider +éluder +emballer +embellir +embryon +émeraude +émission +emmener +émotion +émouvoir +empereur +employer +emporter +emprise +émulsion +encadrer +enchère +enclave +encoche +endiguer +endosser +endroit +enduire +énergie +enfance +enfermer +enfouir +engager +engin +englober +énigme +enjamber +enjeu +enlever +ennemi +ennuyeux +enrichir +enrobage +enseigne +entasser +entendre +entier +entourer +entraver +énumérer +envahir +enviable +envoyer +enzyme +éolien +épaissir +épargne +épatant +épaule +épicerie +épidémie +épier +épilogue +épine +épisode +épitaphe +époque +épreuve +éprouver +épuisant +équerre +équipe +ériger +érosion +erreur +éruption +escalier +espadon +espèce +espiègle +espoir +esprit +esquiver +essayer +essence +essieu +essorer +estime +estomac +estrade +étagère +étaler +étanche +étatique +éteindre +étendoir +éternel +éthanol +éthique +ethnie +étirer +étoffer +étoile +étonnant +étourdir +étrange +étroit +étude +euphorie +évaluer +évasion +éventail +évidence +éviter +évolutif +évoquer +exact +exagérer +exaucer +exceller +excitant +exclusif +excuse +exécuter +exemple +exercer +exhaler +exhorter +exigence +exiler +exister +exotique +expédier +explorer +exposer +exprimer +exquis +extensif +extraire +exulter +fable +fabuleux +facette +facile +facture +faiblir +falaise +fameux +famille +farceur +farfelu +farine +farouche +fasciner +fatal +fatigue +faucon +fautif +faveur +favori +fébrile +féconder +fédérer +félin +femme +fémur +fendoir +féodal +fermer +féroce +ferveur +festival +feuille +feutre +février +fiasco +ficeler +fictif +fidèle +figure +filature +filetage +filière +filleul +filmer +filou +filtrer +financer +finir +fiole +firme +fissure +fixer +flairer +flamme +flasque +flatteur +fléau +flèche +fleur +flexion +flocon +flore +fluctuer +fluide +fluvial +folie +fonderie +fongible +fontaine +forcer +forgeron +formuler +fortune +fossile +foudre +fougère +fouiller +foulure +fourmi +fragile +fraise +franchir +frapper +frayeur +frégate +freiner +frelon +frémir +frénésie +frère +friable +friction +frisson +frivole +froid +fromage +frontal +frotter +fruit +fugitif +fuite +fureur +furieux +furtif +fusion +futur +gagner +galaxie +galerie +gambader +garantir +gardien +garnir +garrigue +gazelle +gazon +géant +gélatine +gélule +gendarme +général +génie +genou +gentil +géologie +géomètre +géranium +germe +gestuel +geyser +gibier +gicler +girafe +givre +glace +glaive +glisser +globe +gloire +glorieux +golfeur +gomme +gonfler +gorge +gorille +goudron +gouffre +goulot +goupille +gourmand +goutte +graduel +graffiti +graine +grand +grappin +gratuit +gravir +grenat +griffure +griller +grimper +grogner +gronder +grotte +groupe +gruger +grutier +gruyère +guépard +guerrier +guide +guimauve +guitare +gustatif +gymnaste +gyrostat +habitude +hachoir +halte +hameau +hangar +hanneton +haricot +harmonie +harpon +hasard +hélium +hématome +herbe +hérisson +hermine +héron +hésiter +heureux +hiberner +hibou +hilarant +histoire +hiver +homard +hommage +homogène +honneur +honorer +honteux +horde +horizon +horloge +hormone +horrible +houleux +housse +hublot +huileux +humain +humble +humide +humour +hurler +hydromel +hygiène +hymne +hypnose +idylle +ignorer +iguane +illicite +illusion +image +imbiber +imiter +immense +immobile +immuable +impact +impérial +implorer +imposer +imprimer +imputer +incarner +incendie +incident +incliner +incolore +indexer +indice +inductif +inédit +ineptie +inexact +infini +infliger +informer +infusion +ingérer +inhaler +inhiber +injecter +injure +innocent +inoculer +inonder +inscrire +insecte +insigne +insolite +inspirer +instinct +insulter +intact +intense +intime +intrigue +intuitif +inutile +invasion +inventer +inviter +invoquer +ironique +irradier +irréel +irriter +isoler +ivoire +ivresse +jaguar +jaillir +jambe +janvier +jardin +jauger +jaune +javelot +jetable +jeton +jeudi +jeunesse +joindre +joncher +jongler +joueur +jouissif +journal +jovial +joyau +joyeux +jubiler +jugement +junior +jupon +juriste +justice +juteux +juvénile +kayak +kimono +kiosque +label +labial +labourer +lacérer +lactose +lagune +laine +laisser +laitier +lambeau +lamelle +lampe +lanceur +langage +lanterne +lapin +largeur +larme +laurier +lavabo +lavoir +lecture +légal +léger +légume +lessive +lettre +levier +lexique +lézard +liasse +libérer +libre +licence +licorne +liège +lièvre +ligature +ligoter +ligue +limer +limite +limonade +limpide +linéaire +lingot +lionceau +liquide +lisière +lister +lithium +litige +littoral +livreur +logique +lointain +loisir +lombric +loterie +louer +lourd +loutre +louve +loyal +lubie +lucide +lucratif +lueur +lugubre +luisant +lumière +lunaire +lundi +luron +lutter +luxueux +machine +magasin +magenta +magique +maigre +maillon +maintien +mairie +maison +majorer +malaxer +maléfice +malheur +malice +mallette +mammouth +mandater +maniable +manquant +manteau +manuel +marathon +marbre +marchand +mardi +maritime +marqueur +marron +marteler +mascotte +massif +matériel +matière +matraque +maudire +maussade +mauve +maximal +méchant +méconnu +médaille +médecin +méditer +méduse +meilleur +mélange +mélodie +membre +mémoire +menacer +mener +menhir +mensonge +mentor +mercredi +mérite +merle +messager +mesure +métal +météore +méthode +métier +meuble +miauler +microbe +miette +mignon +migrer +milieu +million +mimique +mince +minéral +minimal +minorer +minute +miracle +miroiter +missile +mixte +mobile +moderne +moelleux +mondial +moniteur +monnaie +monotone +monstre +montagne +monument +moqueur +morceau +morsure +mortier +moteur +motif +mouche +moufle +moulin +mousson +mouton +mouvant +multiple +munition +muraille +murène +murmure +muscle +muséum +musicien +mutation +muter +mutuel +myriade +myrtille +mystère +mythique +nageur +nappe +narquois +narrer +natation +nation +nature +naufrage +nautique +navire +nébuleux +nectar +néfaste +négation +négliger +négocier +neige +nerveux +nettoyer +neurone +neutron +neveu +niche +nickel +nitrate +niveau +noble +nocif +nocturne +noirceur +noisette +nomade +nombreux +nommer +normatif +notable +notifier +notoire +nourrir +nouveau +novateur +novembre +novice +nuage +nuancer +nuire +nuisible +numéro +nuptial +nuque +nutritif +obéir +objectif +obliger +obscur +observer +obstacle +obtenir +obturer +occasion +occuper +océan +octobre +octroyer +octupler +oculaire +odeur +odorant +offenser +officier +offrir +ogive +oiseau +oisillon +olfactif +olivier +ombrage +omettre +onctueux +onduler +onéreux +onirique +opale +opaque +opérer +opinion +opportun +opprimer +opter +optique +orageux +orange +orbite +ordonner +oreille +organe +orgueil +orifice +ornement +orque +ortie +osciller +osmose +ossature +otarie +ouragan +ourson +outil +outrager +ouvrage +ovation +oxyde +oxygène +ozone +paisible +palace +palmarès +palourde +palper +panache +panda +pangolin +paniquer +panneau +panorama +pantalon +papaye +papier +papoter +papyrus +paradoxe +parcelle +paresse +parfumer +parler +parole +parrain +parsemer +partager +parure +parvenir +passion +pastèque +paternel +patience +patron +pavillon +pavoiser +payer +paysage +peigne +peintre +pelage +pélican +pelle +pelouse +peluche +pendule +pénétrer +pénible +pensif +pénurie +pépite +péplum +perdrix +perforer +période +permuter +perplexe +persil +perte +peser +pétale +petit +pétrir +peuple +pharaon +phobie +phoque +photon +phrase +physique +piano +pictural +pièce +pierre +pieuvre +pilote +pinceau +pipette +piquer +pirogue +piscine +piston +pivoter +pixel +pizza +placard +plafond +plaisir +planer +plaque +plastron +plateau +pleurer +plexus +pliage +plomb +plonger +pluie +plumage +pochette +poésie +poète +pointe +poirier +poisson +poivre +polaire +policier +pollen +polygone +pommade +pompier +ponctuel +pondérer +poney +portique +position +posséder +posture +potager +poteau +potion +pouce +poulain +poumon +pourpre +poussin +pouvoir +prairie +pratique +précieux +prédire +préfixe +prélude +prénom +présence +prétexte +prévoir +primitif +prince +prison +priver +problème +procéder +prodige +profond +progrès +proie +projeter +prologue +promener +propre +prospère +protéger +prouesse +proverbe +prudence +pruneau +psychose +public +puceron +puiser +pulpe +pulsar +punaise +punitif +pupitre +purifier +puzzle +pyramide +quasar +querelle +question +quiétude +quitter +quotient +racine +raconter +radieux +ragondin +raideur +raisin +ralentir +rallonge +ramasser +rapide +rasage +ratisser +ravager +ravin +rayonner +réactif +réagir +réaliser +réanimer +recevoir +réciter +réclamer +récolter +recruter +reculer +recycler +rédiger +redouter +refaire +réflexe +réformer +refrain +refuge +régalien +région +réglage +régulier +réitérer +rejeter +rejouer +relatif +relever +relief +remarque +remède +remise +remonter +remplir +remuer +renard +renfort +renifler +renoncer +rentrer +renvoi +replier +reporter +reprise +reptile +requin +réserve +résineux +résoudre +respect +rester +résultat +rétablir +retenir +réticule +retomber +retracer +réunion +réussir +revanche +revivre +révolte +révulsif +richesse +rideau +rieur +rigide +rigoler +rincer +riposter +risible +risque +rituel +rival +rivière +rocheux +romance +rompre +ronce +rondin +roseau +rosier +rotatif +rotor +rotule +rouge +rouille +rouleau +routine +royaume +ruban +rubis +ruche +ruelle +rugueux +ruiner +ruisseau +ruser +rustique +rythme +sabler +saboter +sabre +sacoche +safari +sagesse +saisir +salade +salive +salon +saluer +samedi +sanction +sanglier +sarcasme +sardine +saturer +saugrenu +saumon +sauter +sauvage +savant +savonner +scalpel +scandale +scélérat +scénario +sceptre +schéma +science +scinder +score +scrutin +sculpter +séance +sécable +sécher +secouer +sécréter +sédatif +séduire +seigneur +séjour +sélectif +semaine +sembler +semence +séminal +sénateur +sensible +sentence +séparer +séquence +serein +sergent +sérieux +serrure +sérum +service +sésame +sévir +sevrage +sextuple +sidéral +siècle +siéger +siffler +sigle +signal +silence +silicium +simple +sincère +sinistre +siphon +sirop +sismique +situer +skier +social +socle +sodium +soigneux +soldat +soleil +solitude +soluble +sombre +sommeil +somnoler +sonde +songeur +sonnette +sonore +sorcier +sortir +sosie +sottise +soucieux +soudure +souffle +soulever +soupape +source +soutirer +souvenir +spacieux +spatial +spécial +sphère +spiral +stable +station +sternum +stimulus +stipuler +strict +studieux +stupeur +styliste +sublime +substrat +subtil +subvenir +succès +sucre +suffixe +suggérer +suiveur +sulfate +superbe +supplier +surface +suricate +surmener +surprise +sursaut +survie +suspect +syllabe +symbole +symétrie +synapse +syntaxe +système +tabac +tablier +tactile +tailler +talent +talisman +talonner +tambour +tamiser +tangible +tapis +taquiner +tarder +tarif +tartine +tasse +tatami +tatouage +taupe +taureau +taxer +témoin +temporel +tenaille +tendre +teneur +tenir +tension +terminer +terne +terrible +tétine +texte +thème +théorie +thérapie +thorax +tibia +tiède +timide +tirelire +tiroir +tissu +titane +titre +tituber +toboggan +tolérant +tomate +tonique +tonneau +toponyme +torche +tordre +tornade +torpille +torrent +torse +tortue +totem +toucher +tournage +tousser +toxine +traction +trafic +tragique +trahir +train +trancher +travail +trèfle +tremper +trésor +treuil +triage +tribunal +tricoter +trilogie +triomphe +tripler +triturer +trivial +trombone +tronc +tropical +troupeau +tuile +tulipe +tumulte +tunnel +turbine +tuteur +tutoyer +tuyau +tympan +typhon +typique +tyran +ubuesque +ultime +ultrason +unanime +unifier +union +unique +unitaire +univers +uranium +urbain +urticant +usage +usine +usuel +usure +utile +utopie +vacarme +vaccin +vagabond +vague +vaillant +vaincre +vaisseau +valable +valise +vallon +valve +vampire +vanille +vapeur +varier +vaseux +vassal +vaste +vecteur +vedette +végétal +véhicule +veinard +véloce +vendredi +vénérer +venger +venimeux +ventouse +verdure +vérin +vernir +verrou +verser +vertu +veston +vétéran +vétuste +vexant +vexer +viaduc +viande +victoire +vidange +vidéo +vignette +vigueur +vilain +village +vinaigre +violon +vipère +virement +virtuose +virus +visage +viseur +vision +visqueux +visuel +vital +vitesse +viticole +vitrine +vivace +vivipare +vocation +voguer +voile +voisin +voiture +volaille +volcan +voltiger +volume +vorace +vortex +voter +vouloir +voyage +voyelle +wagon +xénon +yacht +zèbre +zénith +zeste +zoologie +` diff --git a/vendor/github.com/tyler-smith/go-bip39/wordlists/italian.go b/vendor/github.com/tyler-smith/go-bip39/wordlists/italian.go new file mode 100644 index 000000000000..32cd2cf6d8e8 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/wordlists/italian.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt + // $ crc32 italian.txt + // 2fc7d07e + checksum := crc32.ChecksumIEEE([]byte(italian)) + if fmt.Sprintf("%x", checksum) != "2fc7d07e" { + panic("italian checksum invalid") + } +} + +// Italian is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt +var Italian = strings.Split(strings.TrimSpace(italian), "\n") +var italian = `abaco +abbaglio +abbinato +abete +abisso +abolire +abrasivo +abrogato +accadere +accenno +accusato +acetone +achille +acido +acqua +acre +acrilico +acrobata +acuto +adagio +addebito +addome +adeguato +aderire +adipe +adottare +adulare +affabile +affetto +affisso +affranto +aforisma +afoso +africano +agave +agente +agevole +aggancio +agire +agitare +agonismo +agricolo +agrumeto +aguzzo +alabarda +alato +albatro +alberato +albo +albume +alce +alcolico +alettone +alfa +algebra +aliante +alibi +alimento +allagato +allegro +allievo +allodola +allusivo +almeno +alogeno +alpaca +alpestre +altalena +alterno +alticcio +altrove +alunno +alveolo +alzare +amalgama +amanita +amarena +ambito +ambrato +ameba +america +ametista +amico +ammasso +ammenda +ammirare +ammonito +amore +ampio +ampliare +amuleto +anacardo +anagrafe +analista +anarchia +anatra +anca +ancella +ancora +andare +andrea +anello +angelo +angolare +angusto +anima +annegare +annidato +anno +annuncio +anonimo +anticipo +anzi +apatico +apertura +apode +apparire +appetito +appoggio +approdo +appunto +aprile +arabica +arachide +aragosta +araldica +arancio +aratura +arazzo +arbitro +archivio +ardito +arenile +argento +argine +arguto +aria +armonia +arnese +arredato +arringa +arrosto +arsenico +arso +artefice +arzillo +asciutto +ascolto +asepsi +asettico +asfalto +asino +asola +aspirato +aspro +assaggio +asse +assoluto +assurdo +asta +astenuto +astice +astratto +atavico +ateismo +atomico +atono +attesa +attivare +attorno +attrito +attuale +ausilio +austria +autista +autonomo +autunno +avanzato +avere +avvenire +avviso +avvolgere +azione +azoto +azzimo +azzurro +babele +baccano +bacino +baco +badessa +badilata +bagnato +baita +balcone +baldo +balena +ballata +balzano +bambino +bandire +baraonda +barbaro +barca +baritono +barlume +barocco +basilico +basso +batosta +battuto +baule +bava +bavosa +becco +beffa +belgio +belva +benda +benevole +benigno +benzina +bere +berlina +beta +bibita +bici +bidone +bifido +biga +bilancia +bimbo +binocolo +biologo +bipede +bipolare +birbante +birra +biscotto +bisesto +bisnonno +bisonte +bisturi +bizzarro +blando +blatta +bollito +bonifico +bordo +bosco +botanico +bottino +bozzolo +braccio +bradipo +brama +branca +bravura +bretella +brevetto +brezza +briglia +brillante +brindare +broccolo +brodo +bronzina +brullo +bruno +bubbone +buca +budino +buffone +buio +bulbo +buono +burlone +burrasca +bussola +busta +cadetto +caduco +calamaro +calcolo +calesse +calibro +calmo +caloria +cambusa +camerata +camicia +cammino +camola +campale +canapa +candela +cane +canino +canotto +cantina +capace +capello +capitolo +capogiro +cappero +capra +capsula +carapace +carcassa +cardo +carisma +carovana +carretto +cartolina +casaccio +cascata +caserma +caso +cassone +castello +casuale +catasta +catena +catrame +cauto +cavillo +cedibile +cedrata +cefalo +celebre +cellulare +cena +cenone +centesimo +ceramica +cercare +certo +cerume +cervello +cesoia +cespo +ceto +chela +chiaro +chicca +chiedere +chimera +china +chirurgo +chitarra +ciao +ciclismo +cifrare +cigno +cilindro +ciottolo +circa +cirrosi +citrico +cittadino +ciuffo +civetta +civile +classico +clinica +cloro +cocco +codardo +codice +coerente +cognome +collare +colmato +colore +colposo +coltivato +colza +coma +cometa +commando +comodo +computer +comune +conciso +condurre +conferma +congelare +coniuge +connesso +conoscere +consumo +continuo +convegno +coperto +copione +coppia +copricapo +corazza +cordata +coricato +cornice +corolla +corpo +corredo +corsia +cortese +cosmico +costante +cottura +covato +cratere +cravatta +creato +credere +cremoso +crescita +creta +criceto +crinale +crisi +critico +croce +cronaca +crostata +cruciale +crusca +cucire +cuculo +cugino +cullato +cupola +curatore +cursore +curvo +cuscino +custode +dado +daino +dalmata +damerino +daniela +dannoso +danzare +datato +davanti +davvero +debutto +decennio +deciso +declino +decollo +decreto +dedicato +definito +deforme +degno +delegare +delfino +delirio +delta +demenza +denotato +dentro +deposito +derapata +derivare +deroga +descritto +deserto +desiderio +desumere +detersivo +devoto +diametro +dicembre +diedro +difeso +diffuso +digerire +digitale +diluvio +dinamico +dinnanzi +dipinto +diploma +dipolo +diradare +dire +dirotto +dirupo +disagio +discreto +disfare +disgelo +disposto +distanza +disumano +dito +divano +divelto +dividere +divorato +doblone +docente +doganale +dogma +dolce +domato +domenica +dominare +dondolo +dono +dormire +dote +dottore +dovuto +dozzina +drago +druido +dubbio +dubitare +ducale +duna +duomo +duplice +duraturo +ebano +eccesso +ecco +eclissi +economia +edera +edicola +edile +editoria +educare +egemonia +egli +egoismo +egregio +elaborato +elargire +elegante +elencato +eletto +elevare +elfico +elica +elmo +elsa +eluso +emanato +emblema +emesso +emiro +emotivo +emozione +empirico +emulo +endemico +enduro +energia +enfasi +enoteca +entrare +enzima +epatite +epilogo +episodio +epocale +eppure +equatore +erario +erba +erboso +erede +eremita +erigere +ermetico +eroe +erosivo +errante +esagono +esame +esanime +esaudire +esca +esempio +esercito +esibito +esigente +esistere +esito +esofago +esortato +esoso +espanso +espresso +essenza +esso +esteso +estimare +estonia +estroso +esultare +etilico +etnico +etrusco +etto +euclideo +europa +evaso +evidenza +evitato +evoluto +evviva +fabbrica +faccenda +fachiro +falco +famiglia +fanale +fanfara +fango +fantasma +fare +farfalla +farinoso +farmaco +fascia +fastoso +fasullo +faticare +fato +favoloso +febbre +fecola +fede +fegato +felpa +feltro +femmina +fendere +fenomeno +fermento +ferro +fertile +fessura +festivo +fetta +feudo +fiaba +fiducia +fifa +figurato +filo +finanza +finestra +finire +fiore +fiscale +fisico +fiume +flacone +flamenco +flebo +flemma +florido +fluente +fluoro +fobico +focaccia +focoso +foderato +foglio +folata +folclore +folgore +fondente +fonetico +fonia +fontana +forbito +forchetta +foresta +formica +fornaio +foro +fortezza +forzare +fosfato +fosso +fracasso +frana +frassino +fratello +freccetta +frenata +fresco +frigo +frollino +fronde +frugale +frutta +fucilata +fucsia +fuggente +fulmine +fulvo +fumante +fumetto +fumoso +fune +funzione +fuoco +furbo +furgone +furore +fuso +futile +gabbiano +gaffe +galateo +gallina +galoppo +gambero +gamma +garanzia +garbo +garofano +garzone +gasdotto +gasolio +gastrico +gatto +gaudio +gazebo +gazzella +geco +gelatina +gelso +gemello +gemmato +gene +genitore +gennaio +genotipo +gergo +ghepardo +ghiaccio +ghisa +giallo +gilda +ginepro +giocare +gioiello +giorno +giove +girato +girone +gittata +giudizio +giurato +giusto +globulo +glutine +gnomo +gobba +golf +gomito +gommone +gonfio +gonna +governo +gracile +grado +grafico +grammo +grande +grattare +gravoso +grazia +greca +gregge +grifone +grigio +grinza +grotta +gruppo +guadagno +guaio +guanto +guardare +gufo +guidare +ibernato +icona +identico +idillio +idolo +idra +idrico +idrogeno +igiene +ignaro +ignorato +ilare +illeso +illogico +illudere +imballo +imbevuto +imbocco +imbuto +immane +immerso +immolato +impacco +impeto +impiego +importo +impronta +inalare +inarcare +inattivo +incanto +incendio +inchino +incisivo +incluso +incontro +incrocio +incubo +indagine +india +indole +inedito +infatti +infilare +inflitto +ingaggio +ingegno +inglese +ingordo +ingrosso +innesco +inodore +inoltrare +inondato +insano +insetto +insieme +insonnia +insulina +intasato +intero +intonaco +intuito +inumidire +invalido +invece +invito +iperbole +ipnotico +ipotesi +ippica +iride +irlanda +ironico +irrigato +irrorare +isolato +isotopo +isterico +istituto +istrice +italia +iterare +labbro +labirinto +lacca +lacerato +lacrima +lacuna +laddove +lago +lampo +lancetta +lanterna +lardoso +larga +laringe +lastra +latenza +latino +lattuga +lavagna +lavoro +legale +leggero +lembo +lentezza +lenza +leone +lepre +lesivo +lessato +lesto +letterale +leva +levigato +libero +lido +lievito +lilla +limatura +limitare +limpido +lineare +lingua +liquido +lira +lirica +lisca +lite +litigio +livrea +locanda +lode +logica +lombare +londra +longevo +loquace +lorenzo +loto +lotteria +luce +lucidato +lumaca +luminoso +lungo +lupo +luppolo +lusinga +lusso +lutto +macabro +macchina +macero +macinato +madama +magico +maglia +magnete +magro +maiolica +malafede +malgrado +malinteso +malsano +malto +malumore +mana +mancia +mandorla +mangiare +manifesto +mannaro +manovra +mansarda +mantide +manubrio +mappa +maratona +marcire +maretta +marmo +marsupio +maschera +massaia +mastino +materasso +matricola +mattone +maturo +mazurca +meandro +meccanico +mecenate +medesimo +meditare +mega +melassa +melis +melodia +meninge +meno +mensola +mercurio +merenda +merlo +meschino +mese +messere +mestolo +metallo +metodo +mettere +miagolare +mica +micelio +michele +microbo +midollo +miele +migliore +milano +milite +mimosa +minerale +mini +minore +mirino +mirtillo +miscela +missiva +misto +misurare +mitezza +mitigare +mitra +mittente +mnemonico +modello +modifica +modulo +mogano +mogio +mole +molosso +monastero +monco +mondina +monetario +monile +monotono +monsone +montato +monviso +mora +mordere +morsicato +mostro +motivato +motosega +motto +movenza +movimento +mozzo +mucca +mucosa +muffa +mughetto +mugnaio +mulatto +mulinello +multiplo +mummia +munto +muovere +murale +musa +muscolo +musica +mutevole +muto +nababbo +nafta +nanometro +narciso +narice +narrato +nascere +nastrare +naturale +nautica +naviglio +nebulosa +necrosi +negativo +negozio +nemmeno +neofita +neretto +nervo +nessuno +nettuno +neutrale +neve +nevrotico +nicchia +ninfa +nitido +nobile +nocivo +nodo +nome +nomina +nordico +normale +norvegese +nostrano +notare +notizia +notturno +novella +nucleo +nulla +numero +nuovo +nutrire +nuvola +nuziale +oasi +obbedire +obbligo +obelisco +oblio +obolo +obsoleto +occasione +occhio +occidente +occorrere +occultare +ocra +oculato +odierno +odorare +offerta +offrire +offuscato +oggetto +oggi +ognuno +olandese +olfatto +oliato +oliva +ologramma +oltre +omaggio +ombelico +ombra +omega +omissione +ondoso +onere +onice +onnivoro +onorevole +onta +operato +opinione +opposto +oracolo +orafo +ordine +orecchino +orefice +orfano +organico +origine +orizzonte +orma +ormeggio +ornativo +orologio +orrendo +orribile +ortensia +ortica +orzata +orzo +osare +oscurare +osmosi +ospedale +ospite +ossa +ossidare +ostacolo +oste +otite +otre +ottagono +ottimo +ottobre +ovale +ovest +ovino +oviparo +ovocito +ovunque +ovviare +ozio +pacchetto +pace +pacifico +padella +padrone +paese +paga +pagina +palazzina +palesare +pallido +palo +palude +pandoro +pannello +paolo +paonazzo +paprica +parabola +parcella +parere +pargolo +pari +parlato +parola +partire +parvenza +parziale +passivo +pasticca +patacca +patologia +pattume +pavone +peccato +pedalare +pedonale +peggio +peloso +penare +pendice +penisola +pennuto +penombra +pensare +pentola +pepe +pepita +perbene +percorso +perdonato +perforare +pergamena +periodo +permesso +perno +perplesso +persuaso +pertugio +pervaso +pesatore +pesista +peso +pestifero +petalo +pettine +petulante +pezzo +piacere +pianta +piattino +piccino +picozza +piega +pietra +piffero +pigiama +pigolio +pigro +pila +pilifero +pillola +pilota +pimpante +pineta +pinna +pinolo +pioggia +piombo +piramide +piretico +pirite +pirolisi +pitone +pizzico +placebo +planare +plasma +platano +plenario +pochezza +poderoso +podismo +poesia +poggiare +polenta +poligono +pollice +polmonite +polpetta +polso +poltrona +polvere +pomice +pomodoro +ponte +popoloso +porfido +poroso +porpora +porre +portata +posa +positivo +possesso +postulato +potassio +potere +pranzo +prassi +pratica +precluso +predica +prefisso +pregiato +prelievo +premere +prenotare +preparato +presenza +pretesto +prevalso +prima +principe +privato +problema +procura +produrre +profumo +progetto +prolunga +promessa +pronome +proposta +proroga +proteso +prova +prudente +prugna +prurito +psiche +pubblico +pudica +pugilato +pugno +pulce +pulito +pulsante +puntare +pupazzo +pupilla +puro +quadro +qualcosa +quasi +querela +quota +raccolto +raddoppio +radicale +radunato +raffica +ragazzo +ragione +ragno +ramarro +ramingo +ramo +randagio +rantolare +rapato +rapina +rappreso +rasatura +raschiato +rasente +rassegna +rastrello +rata +ravveduto +reale +recepire +recinto +recluta +recondito +recupero +reddito +redimere +regalato +registro +regola +regresso +relazione +remare +remoto +renna +replica +reprimere +reputare +resa +residente +responso +restauro +rete +retina +retorica +rettifica +revocato +riassunto +ribadire +ribelle +ribrezzo +ricarica +ricco +ricevere +riciclato +ricordo +ricreduto +ridicolo +ridurre +rifasare +riflesso +riforma +rifugio +rigare +rigettato +righello +rilassato +rilevato +rimanere +rimbalzo +rimedio +rimorchio +rinascita +rincaro +rinforzo +rinnovo +rinomato +rinsavito +rintocco +rinuncia +rinvenire +riparato +ripetuto +ripieno +riportare +ripresa +ripulire +risata +rischio +riserva +risibile +riso +rispetto +ristoro +risultato +risvolto +ritardo +ritegno +ritmico +ritrovo +riunione +riva +riverso +rivincita +rivolto +rizoma +roba +robotico +robusto +roccia +roco +rodaggio +rodere +roditore +rogito +rollio +romantico +rompere +ronzio +rosolare +rospo +rotante +rotondo +rotula +rovescio +rubizzo +rubrica +ruga +rullino +rumine +rumoroso +ruolo +rupe +russare +rustico +sabato +sabbiare +sabotato +sagoma +salasso +saldatura +salgemma +salivare +salmone +salone +saltare +saluto +salvo +sapere +sapido +saporito +saraceno +sarcasmo +sarto +sassoso +satellite +satira +satollo +saturno +savana +savio +saziato +sbadiglio +sbalzo +sbancato +sbarra +sbattere +sbavare +sbendare +sbirciare +sbloccato +sbocciato +sbrinare +sbruffone +sbuffare +scabroso +scadenza +scala +scambiare +scandalo +scapola +scarso +scatenare +scavato +scelto +scenico +scettro +scheda +schiena +sciarpa +scienza +scindere +scippo +sciroppo +scivolo +sclerare +scodella +scolpito +scomparto +sconforto +scoprire +scorta +scossone +scozzese +scriba +scrollare +scrutinio +scuderia +scultore +scuola +scuro +scusare +sdebitare +sdoganare +seccatura +secondo +sedano +seggiola +segnalato +segregato +seguito +selciato +selettivo +sella +selvaggio +semaforo +sembrare +seme +seminato +sempre +senso +sentire +sepolto +sequenza +serata +serbato +sereno +serio +serpente +serraglio +servire +sestina +setola +settimana +sfacelo +sfaldare +sfamato +sfarzoso +sfaticato +sfera +sfida +sfilato +sfinge +sfocato +sfoderare +sfogo +sfoltire +sforzato +sfratto +sfruttato +sfuggito +sfumare +sfuso +sgabello +sgarbato +sgonfiare +sgorbio +sgrassato +sguardo +sibilo +siccome +sierra +sigla +signore +silenzio +sillaba +simbolo +simpatico +simulato +sinfonia +singolo +sinistro +sino +sintesi +sinusoide +sipario +sisma +sistole +situato +slitta +slogatura +sloveno +smarrito +smemorato +smentito +smeraldo +smilzo +smontare +smottato +smussato +snellire +snervato +snodo +sobbalzo +sobrio +soccorso +sociale +sodale +soffitto +sogno +soldato +solenne +solido +sollazzo +solo +solubile +solvente +somatico +somma +sonda +sonetto +sonnifero +sopire +soppeso +sopra +sorgere +sorpasso +sorriso +sorso +sorteggio +sorvolato +sospiro +sosta +sottile +spada +spalla +spargere +spatola +spavento +spazzola +specie +spedire +spegnere +spelatura +speranza +spessore +spettrale +spezzato +spia +spigoloso +spillato +spinoso +spirale +splendido +sportivo +sposo +spranga +sprecare +spronato +spruzzo +spuntino +squillo +sradicare +srotolato +stabile +stacco +staffa +stagnare +stampato +stantio +starnuto +stasera +statuto +stelo +steppa +sterzo +stiletto +stima +stirpe +stivale +stizzoso +stonato +storico +strappo +stregato +stridulo +strozzare +strutto +stuccare +stufo +stupendo +subentro +succoso +sudore +suggerito +sugo +sultano +suonare +superbo +supporto +surgelato +surrogato +sussurro +sutura +svagare +svedese +sveglio +svelare +svenuto +svezia +sviluppo +svista +svizzera +svolta +svuotare +tabacco +tabulato +tacciare +taciturno +tale +talismano +tampone +tannino +tara +tardivo +targato +tariffa +tarpare +tartaruga +tasto +tattico +taverna +tavolata +tazza +teca +tecnico +telefono +temerario +tempo +temuto +tendone +tenero +tensione +tentacolo +teorema +terme +terrazzo +terzetto +tesi +tesserato +testato +tetro +tettoia +tifare +tigella +timbro +tinto +tipico +tipografo +tiraggio +tiro +titanio +titolo +titubante +tizio +tizzone +toccare +tollerare +tolto +tombola +tomo +tonfo +tonsilla +topazio +topologia +toppa +torba +tornare +torrone +tortora +toscano +tossire +tostatura +totano +trabocco +trachea +trafila +tragedia +tralcio +tramonto +transito +trapano +trarre +trasloco +trattato +trave +treccia +tremolio +trespolo +tributo +tricheco +trifoglio +trillo +trincea +trio +tristezza +triturato +trivella +tromba +trono +troppo +trottola +trovare +truccato +tubatura +tuffato +tulipano +tumulto +tunisia +turbare +turchino +tuta +tutela +ubicato +uccello +uccisore +udire +uditivo +uffa +ufficio +uguale +ulisse +ultimato +umano +umile +umorismo +uncinetto +ungere +ungherese +unicorno +unificato +unisono +unitario +unte +uovo +upupa +uragano +urgenza +urlo +usanza +usato +uscito +usignolo +usuraio +utensile +utilizzo +utopia +vacante +vaccinato +vagabondo +vagliato +valanga +valgo +valico +valletta +valoroso +valutare +valvola +vampata +vangare +vanitoso +vano +vantaggio +vanvera +vapore +varano +varcato +variante +vasca +vedetta +vedova +veduto +vegetale +veicolo +velcro +velina +velluto +veloce +venato +vendemmia +vento +verace +verbale +vergogna +verifica +vero +verruca +verticale +vescica +vessillo +vestale +veterano +vetrina +vetusto +viandante +vibrante +vicenda +vichingo +vicinanza +vidimare +vigilia +vigneto +vigore +vile +villano +vimini +vincitore +viola +vipera +virgola +virologo +virulento +viscoso +visione +vispo +vissuto +visura +vita +vitello +vittima +vivanda +vivido +viziare +voce +voga +volatile +volere +volpe +voragine +vulcano +zampogna +zanna +zappato +zattera +zavorra +zefiro +zelante +zelo +zenzero +zerbino +zibetto +zinco +zircone +zitto +zolla +zotico +zucchero +zufolo +zulu +zuppa +` diff --git a/vendor/github.com/tyler-smith/go-bip39/wordlists/japanese.go b/vendor/github.com/tyler-smith/go-bip39/wordlists/japanese.go new file mode 100644 index 000000000000..23a76a343123 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/wordlists/japanese.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt + // $ crc32 japanese.txt + // 0acc1419 + checksum := crc32.ChecksumIEEE([]byte(japanese)) + if fmt.Sprintf("%x", checksum) != "acc1419" { + panic(fmt.Sprintf("japanese checksum invalid: %x", checksum)) + } +} + +// Japanese is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt +var Japanese = strings.Split(strings.TrimSpace(japanese), "\n") +var japanese = `あいこくしん +あいさつ +あいだ +あおぞら +あかちゃん +あきる +あけがた +あける +あこがれる +あさい +あさひ +あしあと +あじわう +あずかる +あずき +あそぶ +あたえる +あたためる +あたりまえ +あたる +あつい +あつかう +あっしゅく +あつまり +あつめる +あてな +あてはまる +あひる +あぶら +あぶる +あふれる +あまい +あまど +あまやかす +あまり +あみもの +あめりか +あやまる +あゆむ +あらいぐま +あらし +あらすじ +あらためる +あらゆる +あらわす +ありがとう +あわせる +あわてる +あんい +あんがい +あんこ +あんぜん +あんてい +あんない +あんまり +いいだす +いおん +いがい +いがく +いきおい +いきなり +いきもの +いきる +いくじ +いくぶん +いけばな +いけん +いこう +いこく +いこつ +いさましい +いさん +いしき +いじゅう +いじょう +いじわる +いずみ +いずれ +いせい +いせえび +いせかい +いせき +いぜん +いそうろう +いそがしい +いだい +いだく +いたずら +いたみ +いたりあ +いちおう +いちじ +いちど +いちば +いちぶ +いちりゅう +いつか +いっしゅん +いっせい +いっそう +いったん +いっち +いってい +いっぽう +いてざ +いてん +いどう +いとこ +いない +いなか +いねむり +いのち +いのる +いはつ +いばる +いはん +いびき +いひん +いふく +いへん +いほう +いみん +いもうと +いもたれ +いもり +いやがる +いやす +いよかん +いよく +いらい +いらすと +いりぐち +いりょう +いれい +いれもの +いれる +いろえんぴつ +いわい +いわう +いわかん +いわば +いわゆる +いんげんまめ +いんさつ +いんしょう +いんよう +うえき +うえる +うおざ +うがい +うかぶ +うかべる +うきわ +うくらいな +うくれれ +うけたまわる +うけつけ +うけとる +うけもつ +うける +うごかす +うごく +うこん +うさぎ +うしなう +うしろがみ +うすい +うすぎ +うすぐらい +うすめる +うせつ +うちあわせ +うちがわ +うちき +うちゅう +うっかり +うつくしい +うったえる +うつる +うどん +うなぎ +うなじ +うなずく +うなる +うねる +うのう +うぶげ +うぶごえ +うまれる +うめる +うもう +うやまう +うよく +うらがえす +うらぐち +うらない +うりあげ +うりきれ +うるさい +うれしい +うれゆき +うれる +うろこ +うわき +うわさ +うんこう +うんちん +うんてん +うんどう +えいえん +えいが +えいきょう +えいご +えいせい +えいぶん +えいよう +えいわ +えおり +えがお +えがく +えきたい +えくせる +えしゃく +えすて +えつらん +えのぐ +えほうまき +えほん +えまき +えもじ +えもの +えらい +えらぶ +えりあ +えんえん +えんかい +えんぎ +えんげき +えんしゅう +えんぜつ +えんそく +えんちょう +えんとつ +おいかける +おいこす +おいしい +おいつく +おうえん +おうさま +おうじ +おうせつ +おうたい +おうふく +おうべい +おうよう +おえる +おおい +おおう +おおどおり +おおや +おおよそ +おかえり +おかず +おがむ +おかわり +おぎなう +おきる +おくさま +おくじょう +おくりがな +おくる +おくれる +おこす +おこなう +おこる +おさえる +おさない +おさめる +おしいれ +おしえる +おじぎ +おじさん +おしゃれ +おそらく +おそわる +おたがい +おたく +おだやか +おちつく +おっと +おつり +おでかけ +おとしもの +おとなしい +おどり +おどろかす +おばさん +おまいり +おめでとう +おもいで +おもう +おもたい +おもちゃ +おやつ +おやゆび +およぼす +おらんだ +おろす +おんがく +おんけい +おんしゃ +おんせん +おんだん +おんちゅう +おんどけい +かあつ +かいが +がいき +がいけん +がいこう +かいさつ +かいしゃ +かいすいよく +かいぜん +かいぞうど +かいつう +かいてん +かいとう +かいふく +がいへき +かいほう +かいよう +がいらい +かいわ +かえる +かおり +かかえる +かがく +かがし +かがみ +かくご +かくとく +かざる +がぞう +かたい +かたち +がちょう +がっきゅう +がっこう +がっさん +がっしょう +かなざわし +かのう +がはく +かぶか +かほう +かほご +かまう +かまぼこ +かめれおん +かゆい +かようび +からい +かるい +かろう +かわく +かわら +がんか +かんけい +かんこう +かんしゃ +かんそう +かんたん +かんち +がんばる +きあい +きあつ +きいろ +ぎいん +きうい +きうん +きえる +きおう +きおく +きおち +きおん +きかい +きかく +きかんしゃ +ききて +きくばり +きくらげ +きけんせい +きこう +きこえる +きこく +きさい +きさく +きさま +きさらぎ +ぎじかがく +ぎしき +ぎじたいけん +ぎじにってい +ぎじゅつしゃ +きすう +きせい +きせき +きせつ +きそう +きぞく +きぞん +きたえる +きちょう +きつえん +ぎっちり +きつつき +きつね +きてい +きどう +きどく +きない +きなが +きなこ +きぬごし +きねん +きのう +きのした +きはく +きびしい +きひん +きふく +きぶん +きぼう +きほん +きまる +きみつ +きむずかしい +きめる +きもだめし +きもち +きもの +きゃく +きやく +ぎゅうにく +きよう +きょうりゅう +きらい +きらく +きりん +きれい +きれつ +きろく +ぎろん +きわめる +ぎんいろ +きんかくじ +きんじょ +きんようび +ぐあい +くいず +くうかん +くうき +くうぐん +くうこう +ぐうせい +くうそう +ぐうたら +くうふく +くうぼ +くかん +くきょう +くげん +ぐこう +くさい +くさき +くさばな +くさる +くしゃみ +くしょう +くすのき +くすりゆび +くせげ +くせん +ぐたいてき +くださる +くたびれる +くちこみ +くちさき +くつした +ぐっすり +くつろぐ +くとうてん +くどく +くなん +くねくね +くのう +くふう +くみあわせ +くみたてる +くめる +くやくしょ +くらす +くらべる +くるま +くれる +くろう +くわしい +ぐんかん +ぐんしょく +ぐんたい +ぐんて +けあな +けいかく +けいけん +けいこ +けいさつ +げいじゅつ +けいたい +げいのうじん +けいれき +けいろ +けおとす +けおりもの +げきか +げきげん +げきだん +げきちん +げきとつ +げきは +げきやく +げこう +げこくじょう +げざい +けさき +げざん +けしき +けしごむ +けしょう +げすと +けたば +けちゃっぷ +けちらす +けつあつ +けつい +けつえき +けっこん +けつじょ +けっせき +けってい +けつまつ +げつようび +げつれい +けつろん +げどく +けとばす +けとる +けなげ +けなす +けなみ +けぬき +げねつ +けねん +けはい +げひん +けぶかい +げぼく +けまり +けみかる +けむし +けむり +けもの +けらい +けろけろ +けわしい +けんい +けんえつ +けんお +けんか +げんき +けんげん +けんこう +けんさく +けんしゅう +けんすう +げんそう +けんちく +けんてい +けんとう +けんない +けんにん +げんぶつ +けんま +けんみん +けんめい +けんらん +けんり +こあくま +こいぬ +こいびと +ごうい +こうえん +こうおん +こうかん +ごうきゅう +ごうけい +こうこう +こうさい +こうじ +こうすい +ごうせい +こうそく +こうたい +こうちゃ +こうつう +こうてい +こうどう +こうない +こうはい +ごうほう +ごうまん +こうもく +こうりつ +こえる +こおり +ごかい +ごがつ +ごかん +こくご +こくさい +こくとう +こくない +こくはく +こぐま +こけい +こける +ここのか +こころ +こさめ +こしつ +こすう +こせい +こせき +こぜん +こそだて +こたい +こたえる +こたつ +こちょう +こっか +こつこつ +こつばん +こつぶ +こてい +こてん +ことがら +ことし +ことば +ことり +こなごな +こねこね +このまま +このみ +このよ +ごはん +こひつじ +こふう +こふん +こぼれる +ごまあぶら +こまかい +ごますり +こまつな +こまる +こむぎこ +こもじ +こもち +こもの +こもん +こやく +こやま +こゆう +こゆび +こよい +こよう +こりる +これくしょん +ころっけ +こわもて +こわれる +こんいん +こんかい +こんき +こんしゅう +こんすい +こんだて +こんとん +こんなん +こんびに +こんぽん +こんまけ +こんや +こんれい +こんわく +ざいえき +さいかい +さいきん +ざいげん +ざいこ +さいしょ +さいせい +ざいたく +ざいちゅう +さいてき +ざいりょう +さうな +さかいし +さがす +さかな +さかみち +さがる +さぎょう +さくし +さくひん +さくら +さこく +さこつ +さずかる +ざせき +さたん +さつえい +ざつおん +ざっか +ざつがく +さっきょく +ざっし +さつじん +ざっそう +さつたば +さつまいも +さてい +さといも +さとう +さとおや +さとし +さとる +さのう +さばく +さびしい +さべつ +さほう +さほど +さます +さみしい +さみだれ +さむけ +さめる +さやえんどう +さゆう +さよう +さよく +さらだ +ざるそば +さわやか +さわる +さんいん +さんか +さんきゃく +さんこう +さんさい +ざんしょ +さんすう +さんせい +さんそ +さんち +さんま +さんみ +さんらん +しあい +しあげ +しあさって +しあわせ +しいく +しいん +しうち +しえい +しおけ +しかい +しかく +じかん +しごと +しすう +じだい +したうけ +したぎ +したて +したみ +しちょう +しちりん +しっかり +しつじ +しつもん +してい +してき +してつ +じてん +じどう +しなぎれ +しなもの +しなん +しねま +しねん +しのぐ +しのぶ +しはい +しばかり +しはつ +しはらい +しはん +しひょう +しふく +じぶん +しへい +しほう +しほん +しまう +しまる +しみん +しむける +じむしょ +しめい +しめる +しもん +しゃいん +しゃうん +しゃおん +じゃがいも +しやくしょ +しゃくほう +しゃけん +しゃこ +しゃざい +しゃしん +しゃせん +しゃそう +しゃたい +しゃちょう +しゃっきん +じゃま +しゃりん +しゃれい +じゆう +じゅうしょ +しゅくはく +じゅしん +しゅっせき +しゅみ +しゅらば +じゅんばん +しょうかい +しょくたく +しょっけん +しょどう +しょもつ +しらせる +しらべる +しんか +しんこう +じんじゃ +しんせいじ +しんちく +しんりん +すあげ +すあし +すあな +ずあん +すいえい +すいか +すいとう +ずいぶん +すいようび +すうがく +すうじつ +すうせん +すおどり +すきま +すくう +すくない +すける +すごい +すこし +ずさん +すずしい +すすむ +すすめる +すっかり +ずっしり +ずっと +すてき +すてる +すねる +すのこ +すはだ +すばらしい +ずひょう +ずぶぬれ +すぶり +すふれ +すべて +すべる +ずほう +すぼん +すまい +すめし +すもう +すやき +すらすら +するめ +すれちがう +すろっと +すわる +すんぜん +すんぽう +せあぶら +せいかつ +せいげん +せいじ +せいよう +せおう +せかいかん +せきにん +せきむ +せきゆ +せきらんうん +せけん +せこう +せすじ +せたい +せたけ +せっかく +せっきゃく +ぜっく +せっけん +せっこつ +せっさたくま +せつぞく +せつだん +せつでん +せっぱん +せつび +せつぶん +せつめい +せつりつ +せなか +せのび +せはば +せびろ +せぼね +せまい +せまる +せめる +せもたれ +せりふ +ぜんあく +せんい +せんえい +せんか +せんきょ +せんく +せんげん +ぜんご +せんさい +せんしゅ +せんすい +せんせい +せんぞ +せんたく +せんちょう +せんてい +せんとう +せんぬき +せんねん +せんぱい +ぜんぶ +ぜんぽう +せんむ +せんめんじょ +せんもん +せんやく +せんゆう +せんよう +ぜんら +ぜんりゃく +せんれい +せんろ +そあく +そいとげる +そいね +そうがんきょう +そうき +そうご +そうしん +そうだん +そうなん +そうび +そうめん +そうり +そえもの +そえん +そがい +そげき +そこう +そこそこ +そざい +そしな +そせい +そせん +そそぐ +そだてる +そつう +そつえん +そっかん +そつぎょう +そっけつ +そっこう +そっせん +そっと +そとがわ +そとづら +そなえる +そなた +そふぼ +そぼく +そぼろ +そまつ +そまる +そむく +そむりえ +そめる +そもそも +そよかぜ +そらまめ +そろう +そんかい +そんけい +そんざい +そんしつ +そんぞく +そんちょう +ぞんび +ぞんぶん +そんみん +たあい +たいいん +たいうん +たいえき +たいおう +だいがく +たいき +たいぐう +たいけん +たいこ +たいざい +だいじょうぶ +だいすき +たいせつ +たいそう +だいたい +たいちょう +たいてい +だいどころ +たいない +たいねつ +たいのう +たいはん +だいひょう +たいふう +たいへん +たいほ +たいまつばな +たいみんぐ +たいむ +たいめん +たいやき +たいよう +たいら +たいりょく +たいる +たいわん +たうえ +たえる +たおす +たおる +たおれる +たかい +たかね +たきび +たくさん +たこく +たこやき +たさい +たしざん +だじゃれ +たすける +たずさわる +たそがれ +たたかう +たたく +ただしい +たたみ +たちばな +だっかい +だっきゃく +だっこ +だっしゅつ +だったい +たてる +たとえる +たなばた +たにん +たぬき +たのしみ +たはつ +たぶん +たべる +たぼう +たまご +たまる +だむる +ためいき +ためす +ためる +たもつ +たやすい +たよる +たらす +たりきほんがん +たりょう +たりる +たると +たれる +たれんと +たろっと +たわむれる +だんあつ +たんい +たんおん +たんか +たんき +たんけん +たんご +たんさん +たんじょうび +だんせい +たんそく +たんたい +だんち +たんてい +たんとう +だんな +たんにん +だんねつ +たんのう +たんぴん +だんぼう +たんまつ +たんめい +だんれつ +だんろ +だんわ +ちあい +ちあん +ちいき +ちいさい +ちえん +ちかい +ちから +ちきゅう +ちきん +ちけいず +ちけん +ちこく +ちさい +ちしき +ちしりょう +ちせい +ちそう +ちたい +ちたん +ちちおや +ちつじょ +ちてき +ちてん +ちぬき +ちぬり +ちのう +ちひょう +ちへいせん +ちほう +ちまた +ちみつ +ちみどろ +ちめいど +ちゃんこなべ +ちゅうい +ちゆりょく +ちょうし +ちょさくけん +ちらし +ちらみ +ちりがみ +ちりょう +ちるど +ちわわ +ちんたい +ちんもく +ついか +ついたち +つうか +つうじょう +つうはん +つうわ +つかう +つかれる +つくね +つくる +つけね +つける +つごう +つたえる +つづく +つつじ +つつむ +つとめる +つながる +つなみ +つねづね +つのる +つぶす +つまらない +つまる +つみき +つめたい +つもり +つもる +つよい +つるぼ +つるみく +つわもの +つわり +てあし +てあて +てあみ +ていおん +ていか +ていき +ていけい +ていこく +ていさつ +ていし +ていせい +ていたい +ていど +ていねい +ていひょう +ていへん +ていぼう +てうち +ておくれ +てきとう +てくび +でこぼこ +てさぎょう +てさげ +てすり +てそう +てちがい +てちょう +てつがく +てつづき +でっぱ +てつぼう +てつや +でぬかえ +てぬき +てぬぐい +てのひら +てはい +てぶくろ +てふだ +てほどき +てほん +てまえ +てまきずし +てみじか +てみやげ +てらす +てれび +てわけ +てわたし +でんあつ +てんいん +てんかい +てんき +てんぐ +てんけん +てんごく +てんさい +てんし +てんすう +でんち +てんてき +てんとう +てんない +てんぷら +てんぼうだい +てんめつ +てんらんかい +でんりょく +でんわ +どあい +といれ +どうかん +とうきゅう +どうぐ +とうし +とうむぎ +とおい +とおか +とおく +とおす +とおる +とかい +とかす +ときおり +ときどき +とくい +とくしゅう +とくてん +とくに +とくべつ +とけい +とける +とこや +とさか +としょかん +とそう +とたん +とちゅう +とっきゅう +とっくん +とつぜん +とつにゅう +とどける +ととのえる +とない +となえる +となり +とのさま +とばす +どぶがわ +とほう +とまる +とめる +ともだち +ともる +どようび +とらえる +とんかつ +どんぶり +ないかく +ないこう +ないしょ +ないす +ないせん +ないそう +なおす +ながい +なくす +なげる +なこうど +なさけ +なたでここ +なっとう +なつやすみ +ななおし +なにごと +なにもの +なにわ +なのか +なふだ +なまいき +なまえ +なまみ +なみだ +なめらか +なめる +なやむ +ならう +ならび +ならぶ +なれる +なわとび +なわばり +にあう +にいがた +にうけ +におい +にかい +にがて +にきび +にくしみ +にくまん +にげる +にさんかたんそ +にしき +にせもの +にちじょう +にちようび +にっか +にっき +にっけい +にっこう +にっさん +にっしょく +にっすう +にっせき +にってい +になう +にほん +にまめ +にもつ +にやり +にゅういん +にりんしゃ +にわとり +にんい +にんか +にんき +にんげん +にんしき +にんずう +にんそう +にんたい +にんち +にんてい +にんにく +にんぷ +にんまり +にんむ +にんめい +にんよう +ぬいくぎ +ぬかす +ぬぐいとる +ぬぐう +ぬくもり +ぬすむ +ぬまえび +ぬめり +ぬらす +ぬんちゃく +ねあげ +ねいき +ねいる +ねいろ +ねぐせ +ねくたい +ねくら +ねこぜ +ねこむ +ねさげ +ねすごす +ねそべる +ねだん +ねつい +ねっしん +ねつぞう +ねったいぎょ +ねぶそく +ねふだ +ねぼう +ねほりはほり +ねまき +ねまわし +ねみみ +ねむい +ねむたい +ねもと +ねらう +ねわざ +ねんいり +ねんおし +ねんかん +ねんきん +ねんぐ +ねんざ +ねんし +ねんちゃく +ねんど +ねんぴ +ねんぶつ +ねんまつ +ねんりょう +ねんれい +のいず +のおづま +のがす +のきなみ +のこぎり +のこす +のこる +のせる +のぞく +のぞむ +のたまう +のちほど +のっく +のばす +のはら +のべる +のぼる +のみもの +のやま +のらいぬ +のらねこ +のりもの +のりゆき +のれん +のんき +ばあい +はあく +ばあさん +ばいか +ばいく +はいけん +はいご +はいしん +はいすい +はいせん +はいそう +はいち +ばいばい +はいれつ +はえる +はおる +はかい +ばかり +はかる +はくしゅ +はけん +はこぶ +はさみ +はさん +はしご +ばしょ +はしる +はせる +ぱそこん +はそん +はたん +はちみつ +はつおん +はっかく +はづき +はっきり +はっくつ +はっけん +はっこう +はっさん +はっしん +はったつ +はっちゅう +はってん +はっぴょう +はっぽう +はなす +はなび +はにかむ +はぶらし +はみがき +はむかう +はめつ +はやい +はやし +はらう +はろうぃん +はわい +はんい +はんえい +はんおん +はんかく +はんきょう +ばんぐみ +はんこ +はんしゃ +はんすう +はんだん +ぱんち +ぱんつ +はんてい +はんとし +はんのう +はんぱ +はんぶん +はんぺん +はんぼうき +はんめい +はんらん +はんろん +ひいき +ひうん +ひえる +ひかく +ひかり +ひかる +ひかん +ひくい +ひけつ +ひこうき +ひこく +ひさい +ひさしぶり +ひさん +びじゅつかん +ひしょ +ひそか +ひそむ +ひたむき +ひだり +ひたる +ひつぎ +ひっこし +ひっし +ひつじゅひん +ひっす +ひつぜん +ぴったり +ぴっちり +ひつよう +ひてい +ひとごみ +ひなまつり +ひなん +ひねる +ひはん +ひびく +ひひょう +ひほう +ひまわり +ひまん +ひみつ +ひめい +ひめじし +ひやけ +ひやす +ひよう +びょうき +ひらがな +ひらく +ひりつ +ひりょう +ひるま +ひるやすみ +ひれい +ひろい +ひろう +ひろき +ひろゆき +ひんかく +ひんけつ +ひんこん +ひんしゅ +ひんそう +ぴんち +ひんぱん +びんぼう +ふあん +ふいうち +ふうけい +ふうせん +ぷうたろう +ふうとう +ふうふ +ふえる +ふおん +ふかい +ふきん +ふくざつ +ふくぶくろ +ふこう +ふさい +ふしぎ +ふじみ +ふすま +ふせい +ふせぐ +ふそく +ぶたにく +ふたん +ふちょう +ふつう +ふつか +ふっかつ +ふっき +ふっこく +ぶどう +ふとる +ふとん +ふのう +ふはい +ふひょう +ふへん +ふまん +ふみん +ふめつ +ふめん +ふよう +ふりこ +ふりる +ふるい +ふんいき +ぶんがく +ぶんぐ +ふんしつ +ぶんせき +ふんそう +ぶんぽう +へいあん +へいおん +へいがい +へいき +へいげん +へいこう +へいさ +へいしゃ +へいせつ +へいそ +へいたく +へいてん +へいねつ +へいわ +へきが +へこむ +べにいろ +べにしょうが +へらす +へんかん +べんきょう +べんごし +へんさい +へんたい +べんり +ほあん +ほいく +ぼうぎょ +ほうこく +ほうそう +ほうほう +ほうもん +ほうりつ +ほえる +ほおん +ほかん +ほきょう +ぼきん +ほくろ +ほけつ +ほけん +ほこう +ほこる +ほしい +ほしつ +ほしゅ +ほしょう +ほせい +ほそい +ほそく +ほたて +ほたる +ぽちぶくろ +ほっきょく +ほっさ +ほったん +ほとんど +ほめる +ほんい +ほんき +ほんけ +ほんしつ +ほんやく +まいにち +まかい +まかせる +まがる +まける +まこと +まさつ +まじめ +ますく +まぜる +まつり +まとめ +まなぶ +まぬけ +まねく +まほう +まもる +まゆげ +まよう +まろやか +まわす +まわり +まわる +まんが +まんきつ +まんぞく +まんなか +みいら +みうち +みえる +みがく +みかた +みかん +みけん +みこん +みじかい +みすい +みすえる +みせる +みっか +みつかる +みつける +みてい +みとめる +みなと +みなみかさい +みねらる +みのう +みのがす +みほん +みもと +みやげ +みらい +みりょく +みわく +みんか +みんぞく +むいか +むえき +むえん +むかい +むかう +むかえ +むかし +むぎちゃ +むける +むげん +むさぼる +むしあつい +むしば +むじゅん +むしろ +むすう +むすこ +むすぶ +むすめ +むせる +むせん +むちゅう +むなしい +むのう +むやみ +むよう +むらさき +むりょう +むろん +めいあん +めいうん +めいえん +めいかく +めいきょく +めいさい +めいし +めいそう +めいぶつ +めいれい +めいわく +めぐまれる +めざす +めした +めずらしい +めだつ +めまい +めやす +めんきょ +めんせき +めんどう +もうしあげる +もうどうけん +もえる +もくし +もくてき +もくようび +もちろん +もどる +もらう +もんく +もんだい +やおや +やける +やさい +やさしい +やすい +やすたろう +やすみ +やせる +やそう +やたい +やちん +やっと +やっぱり +やぶる +やめる +ややこしい +やよい +やわらかい +ゆうき +ゆうびんきょく +ゆうべ +ゆうめい +ゆけつ +ゆしゅつ +ゆせん +ゆそう +ゆたか +ゆちゃく +ゆでる +ゆにゅう +ゆびわ +ゆらい +ゆれる +ようい +ようか +ようきゅう +ようじ +ようす +ようちえん +よかぜ +よかん +よきん +よくせい +よくぼう +よけい +よごれる +よさん +よしゅう +よそう +よそく +よっか +よてい +よどがわく +よねつ +よやく +よゆう +よろこぶ +よろしい +らいう +らくがき +らくご +らくさつ +らくだ +らしんばん +らせん +らぞく +らたい +らっか +られつ +りえき +りかい +りきさく +りきせつ +りくぐん +りくつ +りけん +りこう +りせい +りそう +りそく +りてん +りねん +りゆう +りゅうがく +りよう +りょうり +りょかん +りょくちゃ +りょこう +りりく +りれき +りろん +りんご +るいけい +るいさい +るいじ +るいせき +るすばん +るりがわら +れいかん +れいぎ +れいせい +れいぞうこ +れいとう +れいぼう +れきし +れきだい +れんあい +れんけい +れんこん +れんさい +れんしゅう +れんぞく +れんらく +ろうか +ろうご +ろうじん +ろうそく +ろくが +ろこつ +ろじうら +ろしゅつ +ろせん +ろてん +ろめん +ろれつ +ろんぎ +ろんぱ +ろんぶん +ろんり +わかす +わかめ +わかやま +わかれる +わしつ +わじまし +わすれもの +わらう +われる +` diff --git a/vendor/github.com/tyler-smith/go-bip39/wordlists/korean.go b/vendor/github.com/tyler-smith/go-bip39/wordlists/korean.go new file mode 100644 index 000000000000..1d3177563370 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/wordlists/korean.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt + // $ crc32 korean.txt + // 4ef461eb + checksum := crc32.ChecksumIEEE([]byte(korean)) + if fmt.Sprintf("%x", checksum) != "4ef461eb" { + panic("korean checksum invalid") + } +} + +// Korean is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt +var Korean = strings.Split(strings.TrimSpace(korean), "\n") +var korean = `가격 +가끔 +가난 +가능 +가득 +가르침 +가뭄 +가방 +가상 +가슴 +가운데 +가을 +가이드 +가입 +가장 +가정 +가족 +가죽 +각오 +각자 +간격 +간부 +간섭 +간장 +간접 +간판 +갈등 +갈비 +갈색 +갈증 +감각 +감기 +감소 +감수성 +감자 +감정 +갑자기 +강남 +강당 +강도 +강력히 +강변 +강북 +강사 +강수량 +강아지 +강원도 +강의 +강제 +강조 +같이 +개구리 +개나리 +개방 +개별 +개선 +개성 +개인 +객관적 +거실 +거액 +거울 +거짓 +거품 +걱정 +건강 +건물 +건설 +건조 +건축 +걸음 +검사 +검토 +게시판 +게임 +겨울 +견해 +결과 +결국 +결론 +결석 +결승 +결심 +결정 +결혼 +경계 +경고 +경기 +경력 +경복궁 +경비 +경상도 +경영 +경우 +경쟁 +경제 +경주 +경찰 +경치 +경향 +경험 +계곡 +계단 +계란 +계산 +계속 +계약 +계절 +계층 +계획 +고객 +고구려 +고궁 +고급 +고등학생 +고무신 +고민 +고양이 +고장 +고전 +고집 +고춧가루 +고통 +고향 +곡식 +골목 +골짜기 +골프 +공간 +공개 +공격 +공군 +공급 +공기 +공동 +공무원 +공부 +공사 +공식 +공업 +공연 +공원 +공장 +공짜 +공책 +공통 +공포 +공항 +공휴일 +과목 +과일 +과장 +과정 +과학 +관객 +관계 +관광 +관념 +관람 +관련 +관리 +관습 +관심 +관점 +관찰 +광경 +광고 +광장 +광주 +괴로움 +굉장히 +교과서 +교문 +교복 +교실 +교양 +교육 +교장 +교직 +교통 +교환 +교훈 +구경 +구름 +구멍 +구별 +구분 +구석 +구성 +구속 +구역 +구입 +구청 +구체적 +국가 +국기 +국내 +국립 +국물 +국민 +국수 +국어 +국왕 +국적 +국제 +국회 +군대 +군사 +군인 +궁극적 +권리 +권위 +권투 +귀국 +귀신 +규정 +규칙 +균형 +그날 +그냥 +그늘 +그러나 +그룹 +그릇 +그림 +그제서야 +그토록 +극복 +극히 +근거 +근교 +근래 +근로 +근무 +근본 +근원 +근육 +근처 +글씨 +글자 +금강산 +금고 +금년 +금메달 +금액 +금연 +금요일 +금지 +긍정적 +기간 +기관 +기념 +기능 +기독교 +기둥 +기록 +기름 +기법 +기본 +기분 +기쁨 +기숙사 +기술 +기억 +기업 +기온 +기운 +기원 +기적 +기준 +기침 +기혼 +기획 +긴급 +긴장 +길이 +김밥 +김치 +김포공항 +깍두기 +깜빡 +깨달음 +깨소금 +껍질 +꼭대기 +꽃잎 +나들이 +나란히 +나머지 +나물 +나침반 +나흘 +낙엽 +난방 +날개 +날씨 +날짜 +남녀 +남대문 +남매 +남산 +남자 +남편 +남학생 +낭비 +낱말 +내년 +내용 +내일 +냄비 +냄새 +냇물 +냉동 +냉면 +냉방 +냉장고 +넥타이 +넷째 +노동 +노란색 +노력 +노인 +녹음 +녹차 +녹화 +논리 +논문 +논쟁 +놀이 +농구 +농담 +농민 +농부 +농업 +농장 +농촌 +높이 +눈동자 +눈물 +눈썹 +뉴욕 +느낌 +늑대 +능동적 +능력 +다방 +다양성 +다음 +다이어트 +다행 +단계 +단골 +단독 +단맛 +단순 +단어 +단위 +단점 +단체 +단추 +단편 +단풍 +달걀 +달러 +달력 +달리 +닭고기 +담당 +담배 +담요 +담임 +답변 +답장 +당근 +당분간 +당연히 +당장 +대규모 +대낮 +대단히 +대답 +대도시 +대략 +대량 +대륙 +대문 +대부분 +대신 +대응 +대장 +대전 +대접 +대중 +대책 +대출 +대충 +대통령 +대학 +대한민국 +대합실 +대형 +덩어리 +데이트 +도대체 +도덕 +도둑 +도망 +도서관 +도심 +도움 +도입 +도자기 +도저히 +도전 +도중 +도착 +독감 +독립 +독서 +독일 +독창적 +동화책 +뒷모습 +뒷산 +딸아이 +마누라 +마늘 +마당 +마라톤 +마련 +마무리 +마사지 +마약 +마요네즈 +마을 +마음 +마이크 +마중 +마지막 +마찬가지 +마찰 +마흔 +막걸리 +막내 +막상 +만남 +만두 +만세 +만약 +만일 +만점 +만족 +만화 +많이 +말기 +말씀 +말투 +맘대로 +망원경 +매년 +매달 +매력 +매번 +매스컴 +매일 +매장 +맥주 +먹이 +먼저 +먼지 +멀리 +메일 +며느리 +며칠 +면담 +멸치 +명단 +명령 +명예 +명의 +명절 +명칭 +명함 +모금 +모니터 +모델 +모든 +모범 +모습 +모양 +모임 +모조리 +모집 +모퉁이 +목걸이 +목록 +목사 +목소리 +목숨 +목적 +목표 +몰래 +몸매 +몸무게 +몸살 +몸속 +몸짓 +몸통 +몹시 +무관심 +무궁화 +무더위 +무덤 +무릎 +무슨 +무엇 +무역 +무용 +무조건 +무지개 +무척 +문구 +문득 +문법 +문서 +문제 +문학 +문화 +물가 +물건 +물결 +물고기 +물론 +물리학 +물음 +물질 +물체 +미국 +미디어 +미사일 +미술 +미역 +미용실 +미움 +미인 +미팅 +미혼 +민간 +민족 +민주 +믿음 +밀가루 +밀리미터 +밑바닥 +바가지 +바구니 +바나나 +바늘 +바닥 +바닷가 +바람 +바이러스 +바탕 +박물관 +박사 +박수 +반대 +반드시 +반말 +반발 +반성 +반응 +반장 +반죽 +반지 +반찬 +받침 +발가락 +발걸음 +발견 +발달 +발레 +발목 +발바닥 +발생 +발음 +발자국 +발전 +발톱 +발표 +밤하늘 +밥그릇 +밥맛 +밥상 +밥솥 +방금 +방면 +방문 +방바닥 +방법 +방송 +방식 +방안 +방울 +방지 +방학 +방해 +방향 +배경 +배꼽 +배달 +배드민턴 +백두산 +백색 +백성 +백인 +백제 +백화점 +버릇 +버섯 +버튼 +번개 +번역 +번지 +번호 +벌금 +벌레 +벌써 +범위 +범인 +범죄 +법률 +법원 +법적 +법칙 +베이징 +벨트 +변경 +변동 +변명 +변신 +변호사 +변화 +별도 +별명 +별일 +병실 +병아리 +병원 +보관 +보너스 +보라색 +보람 +보름 +보상 +보안 +보자기 +보장 +보전 +보존 +보통 +보편적 +보험 +복도 +복사 +복숭아 +복습 +볶음 +본격적 +본래 +본부 +본사 +본성 +본인 +본질 +볼펜 +봉사 +봉지 +봉투 +부근 +부끄러움 +부담 +부동산 +부문 +부분 +부산 +부상 +부엌 +부인 +부작용 +부장 +부정 +부족 +부지런히 +부친 +부탁 +부품 +부회장 +북부 +북한 +분노 +분량 +분리 +분명 +분석 +분야 +분위기 +분필 +분홍색 +불고기 +불과 +불교 +불꽃 +불만 +불법 +불빛 +불안 +불이익 +불행 +브랜드 +비극 +비난 +비닐 +비둘기 +비디오 +비로소 +비만 +비명 +비밀 +비바람 +비빔밥 +비상 +비용 +비율 +비중 +비타민 +비판 +빌딩 +빗물 +빗방울 +빗줄기 +빛깔 +빨간색 +빨래 +빨리 +사건 +사계절 +사나이 +사냥 +사람 +사랑 +사립 +사모님 +사물 +사방 +사상 +사생활 +사설 +사슴 +사실 +사업 +사용 +사월 +사장 +사전 +사진 +사촌 +사춘기 +사탕 +사투리 +사흘 +산길 +산부인과 +산업 +산책 +살림 +살인 +살짝 +삼계탕 +삼국 +삼십 +삼월 +삼촌 +상관 +상금 +상대 +상류 +상반기 +상상 +상식 +상업 +상인 +상자 +상점 +상처 +상추 +상태 +상표 +상품 +상황 +새벽 +색깔 +색연필 +생각 +생명 +생물 +생방송 +생산 +생선 +생신 +생일 +생활 +서랍 +서른 +서명 +서민 +서비스 +서양 +서울 +서적 +서점 +서쪽 +서클 +석사 +석유 +선거 +선물 +선배 +선생 +선수 +선원 +선장 +선전 +선택 +선풍기 +설거지 +설날 +설렁탕 +설명 +설문 +설사 +설악산 +설치 +설탕 +섭씨 +성공 +성당 +성명 +성별 +성인 +성장 +성적 +성질 +성함 +세금 +세미나 +세상 +세월 +세종대왕 +세탁 +센터 +센티미터 +셋째 +소규모 +소극적 +소금 +소나기 +소년 +소득 +소망 +소문 +소설 +소속 +소아과 +소용 +소원 +소음 +소중히 +소지품 +소질 +소풍 +소형 +속담 +속도 +속옷 +손가락 +손길 +손녀 +손님 +손등 +손목 +손뼉 +손실 +손질 +손톱 +손해 +솔직히 +솜씨 +송아지 +송이 +송편 +쇠고기 +쇼핑 +수건 +수년 +수단 +수돗물 +수동적 +수면 +수명 +수박 +수상 +수석 +수술 +수시로 +수업 +수염 +수영 +수입 +수준 +수집 +수출 +수컷 +수필 +수학 +수험생 +수화기 +숙녀 +숙소 +숙제 +순간 +순서 +순수 +순식간 +순위 +숟가락 +술병 +술집 +숫자 +스님 +스물 +스스로 +스승 +스웨터 +스위치 +스케이트 +스튜디오 +스트레스 +스포츠 +슬쩍 +슬픔 +습관 +습기 +승객 +승리 +승부 +승용차 +승진 +시각 +시간 +시골 +시금치 +시나리오 +시댁 +시리즈 +시멘트 +시민 +시부모 +시선 +시설 +시스템 +시아버지 +시어머니 +시월 +시인 +시일 +시작 +시장 +시절 +시점 +시중 +시즌 +시집 +시청 +시합 +시험 +식구 +식기 +식당 +식량 +식료품 +식물 +식빵 +식사 +식생활 +식초 +식탁 +식품 +신고 +신규 +신념 +신문 +신발 +신비 +신사 +신세 +신용 +신제품 +신청 +신체 +신화 +실감 +실내 +실력 +실례 +실망 +실수 +실습 +실시 +실장 +실정 +실질적 +실천 +실체 +실컷 +실태 +실패 +실험 +실현 +심리 +심부름 +심사 +심장 +심정 +심판 +쌍둥이 +씨름 +씨앗 +아가씨 +아나운서 +아드님 +아들 +아쉬움 +아스팔트 +아시아 +아울러 +아저씨 +아줌마 +아직 +아침 +아파트 +아프리카 +아픔 +아홉 +아흔 +악기 +악몽 +악수 +안개 +안경 +안과 +안내 +안녕 +안동 +안방 +안부 +안주 +알루미늄 +알코올 +암시 +암컷 +압력 +앞날 +앞문 +애인 +애정 +액수 +앨범 +야간 +야단 +야옹 +약간 +약국 +약속 +약수 +약점 +약품 +약혼녀 +양념 +양력 +양말 +양배추 +양주 +양파 +어둠 +어려움 +어른 +어젯밤 +어쨌든 +어쩌다가 +어쩐지 +언니 +언덕 +언론 +언어 +얼굴 +얼른 +얼음 +얼핏 +엄마 +업무 +업종 +업체 +엉덩이 +엉망 +엉터리 +엊그제 +에너지 +에어컨 +엔진 +여건 +여고생 +여관 +여군 +여권 +여대생 +여덟 +여동생 +여든 +여론 +여름 +여섯 +여성 +여왕 +여인 +여전히 +여직원 +여학생 +여행 +역사 +역시 +역할 +연결 +연구 +연극 +연기 +연락 +연설 +연세 +연속 +연습 +연애 +연예인 +연인 +연장 +연주 +연출 +연필 +연합 +연휴 +열기 +열매 +열쇠 +열심히 +열정 +열차 +열흘 +염려 +엽서 +영국 +영남 +영상 +영양 +영역 +영웅 +영원히 +영하 +영향 +영혼 +영화 +옆구리 +옆방 +옆집 +예감 +예금 +예방 +예산 +예상 +예선 +예술 +예습 +예식장 +예약 +예전 +예절 +예정 +예컨대 +옛날 +오늘 +오락 +오랫동안 +오렌지 +오로지 +오른발 +오븐 +오십 +오염 +오월 +오전 +오직 +오징어 +오페라 +오피스텔 +오히려 +옥상 +옥수수 +온갖 +온라인 +온몸 +온종일 +온통 +올가을 +올림픽 +올해 +옷차림 +와이셔츠 +와인 +완성 +완전 +왕비 +왕자 +왜냐하면 +왠지 +외갓집 +외국 +외로움 +외삼촌 +외출 +외침 +외할머니 +왼발 +왼손 +왼쪽 +요금 +요일 +요즘 +요청 +용기 +용서 +용어 +우산 +우선 +우승 +우연히 +우정 +우체국 +우편 +운동 +운명 +운반 +운전 +운행 +울산 +울음 +움직임 +웃어른 +웃음 +워낙 +원고 +원래 +원서 +원숭이 +원인 +원장 +원피스 +월급 +월드컵 +월세 +월요일 +웨이터 +위반 +위법 +위성 +위원 +위험 +위협 +윗사람 +유난히 +유럽 +유명 +유물 +유산 +유적 +유치원 +유학 +유행 +유형 +육군 +육상 +육십 +육체 +은행 +음력 +음료 +음반 +음성 +음식 +음악 +음주 +의견 +의논 +의문 +의복 +의식 +의심 +의외로 +의욕 +의원 +의학 +이것 +이곳 +이념 +이놈 +이달 +이대로 +이동 +이렇게 +이력서 +이론적 +이름 +이민 +이발소 +이별 +이불 +이빨 +이상 +이성 +이슬 +이야기 +이용 +이웃 +이월 +이윽고 +이익 +이전 +이중 +이튿날 +이틀 +이혼 +인간 +인격 +인공 +인구 +인근 +인기 +인도 +인류 +인물 +인생 +인쇄 +인연 +인원 +인재 +인종 +인천 +인체 +인터넷 +인하 +인형 +일곱 +일기 +일단 +일대 +일등 +일반 +일본 +일부 +일상 +일생 +일손 +일요일 +일월 +일정 +일종 +일주일 +일찍 +일체 +일치 +일행 +일회용 +임금 +임무 +입대 +입력 +입맛 +입사 +입술 +입시 +입원 +입장 +입학 +자가용 +자격 +자극 +자동 +자랑 +자부심 +자식 +자신 +자연 +자원 +자율 +자전거 +자정 +자존심 +자판 +작가 +작년 +작성 +작업 +작용 +작은딸 +작품 +잔디 +잔뜩 +잔치 +잘못 +잠깐 +잠수함 +잠시 +잠옷 +잠자리 +잡지 +장관 +장군 +장기간 +장래 +장례 +장르 +장마 +장면 +장모 +장미 +장비 +장사 +장소 +장식 +장애인 +장인 +장점 +장차 +장학금 +재능 +재빨리 +재산 +재생 +재작년 +재정 +재채기 +재판 +재학 +재활용 +저것 +저고리 +저곳 +저녁 +저런 +저렇게 +저번 +저울 +저절로 +저축 +적극 +적당히 +적성 +적용 +적응 +전개 +전공 +전기 +전달 +전라도 +전망 +전문 +전반 +전부 +전세 +전시 +전용 +전자 +전쟁 +전주 +전철 +전체 +전통 +전혀 +전후 +절대 +절망 +절반 +절약 +절차 +점검 +점수 +점심 +점원 +점점 +점차 +접근 +접시 +접촉 +젓가락 +정거장 +정도 +정류장 +정리 +정말 +정면 +정문 +정반대 +정보 +정부 +정비 +정상 +정성 +정오 +정원 +정장 +정지 +정치 +정확히 +제공 +제과점 +제대로 +제목 +제발 +제법 +제삿날 +제안 +제일 +제작 +제주도 +제출 +제품 +제한 +조각 +조건 +조금 +조깅 +조명 +조미료 +조상 +조선 +조용히 +조절 +조정 +조직 +존댓말 +존재 +졸업 +졸음 +종교 +종로 +종류 +종소리 +종업원 +종종 +종합 +좌석 +죄인 +주관적 +주름 +주말 +주머니 +주먹 +주문 +주민 +주방 +주변 +주식 +주인 +주일 +주장 +주전자 +주택 +준비 +줄거리 +줄기 +줄무늬 +중간 +중계방송 +중국 +중년 +중단 +중독 +중반 +중부 +중세 +중소기업 +중순 +중앙 +중요 +중학교 +즉석 +즉시 +즐거움 +증가 +증거 +증권 +증상 +증세 +지각 +지갑 +지경 +지극히 +지금 +지급 +지능 +지름길 +지리산 +지방 +지붕 +지식 +지역 +지우개 +지원 +지적 +지점 +지진 +지출 +직선 +직업 +직원 +직장 +진급 +진동 +진로 +진료 +진리 +진짜 +진찰 +진출 +진통 +진행 +질문 +질병 +질서 +짐작 +집단 +집안 +집중 +짜증 +찌꺼기 +차남 +차라리 +차량 +차림 +차별 +차선 +차츰 +착각 +찬물 +찬성 +참가 +참기름 +참새 +참석 +참여 +참외 +참조 +찻잔 +창가 +창고 +창구 +창문 +창밖 +창작 +창조 +채널 +채점 +책가방 +책방 +책상 +책임 +챔피언 +처벌 +처음 +천국 +천둥 +천장 +천재 +천천히 +철도 +철저히 +철학 +첫날 +첫째 +청년 +청바지 +청소 +청춘 +체계 +체력 +체온 +체육 +체중 +체험 +초등학생 +초반 +초밥 +초상화 +초순 +초여름 +초원 +초저녁 +초점 +초청 +초콜릿 +촛불 +총각 +총리 +총장 +촬영 +최근 +최상 +최선 +최신 +최악 +최종 +추석 +추억 +추진 +추천 +추측 +축구 +축소 +축제 +축하 +출근 +출발 +출산 +출신 +출연 +출입 +출장 +출판 +충격 +충고 +충돌 +충분히 +충청도 +취업 +취직 +취향 +치약 +친구 +친척 +칠십 +칠월 +칠판 +침대 +침묵 +침실 +칫솔 +칭찬 +카메라 +카운터 +칼국수 +캐릭터 +캠퍼스 +캠페인 +커튼 +컨디션 +컬러 +컴퓨터 +코끼리 +코미디 +콘서트 +콜라 +콤플렉스 +콩나물 +쾌감 +쿠데타 +크림 +큰길 +큰딸 +큰소리 +큰아들 +큰어머니 +큰일 +큰절 +클래식 +클럽 +킬로 +타입 +타자기 +탁구 +탁자 +탄생 +태권도 +태양 +태풍 +택시 +탤런트 +터널 +터미널 +테니스 +테스트 +테이블 +텔레비전 +토론 +토마토 +토요일 +통계 +통과 +통로 +통신 +통역 +통일 +통장 +통제 +통증 +통합 +통화 +퇴근 +퇴원 +퇴직금 +튀김 +트럭 +특급 +특별 +특성 +특수 +특징 +특히 +튼튼히 +티셔츠 +파란색 +파일 +파출소 +판결 +판단 +판매 +판사 +팔십 +팔월 +팝송 +패션 +팩스 +팩시밀리 +팬티 +퍼센트 +페인트 +편견 +편의 +편지 +편히 +평가 +평균 +평생 +평소 +평양 +평일 +평화 +포스터 +포인트 +포장 +포함 +표면 +표정 +표준 +표현 +품목 +품질 +풍경 +풍속 +풍습 +프랑스 +프린터 +플라스틱 +피곤 +피망 +피아노 +필름 +필수 +필요 +필자 +필통 +핑계 +하느님 +하늘 +하드웨어 +하룻밤 +하반기 +하숙집 +하순 +하여튼 +하지만 +하천 +하품 +하필 +학과 +학교 +학급 +학기 +학년 +학력 +학번 +학부모 +학비 +학생 +학술 +학습 +학용품 +학원 +학위 +학자 +학점 +한계 +한글 +한꺼번에 +한낮 +한눈 +한동안 +한때 +한라산 +한마디 +한문 +한번 +한복 +한식 +한여름 +한쪽 +할머니 +할아버지 +할인 +함께 +함부로 +합격 +합리적 +항공 +항구 +항상 +항의 +해결 +해군 +해답 +해당 +해물 +해석 +해설 +해수욕장 +해안 +핵심 +핸드백 +햄버거 +햇볕 +햇살 +행동 +행복 +행사 +행운 +행위 +향기 +향상 +향수 +허락 +허용 +헬기 +현관 +현금 +현대 +현상 +현실 +현장 +현재 +현지 +혈액 +협력 +형부 +형사 +형수 +형식 +형제 +형태 +형편 +혜택 +호기심 +호남 +호랑이 +호박 +호텔 +호흡 +혹시 +홀로 +홈페이지 +홍보 +홍수 +홍차 +화면 +화분 +화살 +화요일 +화장 +화학 +확보 +확인 +확장 +확정 +환갑 +환경 +환영 +환율 +환자 +활기 +활동 +활발히 +활용 +활짝 +회견 +회관 +회복 +회색 +회원 +회장 +회전 +횟수 +횡단보도 +효율적 +후반 +후춧가루 +훈련 +훨씬 +휴식 +휴일 +흉내 +흐름 +흑백 +흑인 +흔적 +흔히 +흥미 +흥분 +희곡 +희망 +희생 +흰색 +힘껏 +` diff --git a/vendor/github.com/tyler-smith/go-bip39/wordlists/spanish.go b/vendor/github.com/tyler-smith/go-bip39/wordlists/spanish.go new file mode 100644 index 000000000000..ad76da976cf4 --- /dev/null +++ b/vendor/github.com/tyler-smith/go-bip39/wordlists/spanish.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt + // $ crc32 spanish.txt + // 266e4f3d + checksum := crc32.ChecksumIEEE([]byte(spanish)) + if fmt.Sprintf("%x", checksum) != "266e4f3d" { + panic("spanish checksum invalid") + } +} + +// Spanish is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt +var Spanish = strings.Split(strings.TrimSpace(spanish), "\n") +var spanish = `ábaco +abdomen +abeja +abierto +abogado +abono +aborto +abrazo +abrir +abuelo +abuso +acabar +academia +acceso +acción +aceite +acelga +acento +aceptar +ácido +aclarar +acné +acoger +acoso +activo +acto +actriz +actuar +acudir +acuerdo +acusar +adicto +admitir +adoptar +adorno +aduana +adulto +aéreo +afectar +afición +afinar +afirmar +ágil +agitar +agonía +agosto +agotar +agregar +agrio +agua +agudo +águila +aguja +ahogo +ahorro +aire +aislar +ajedrez +ajeno +ajuste +alacrán +alambre +alarma +alba +álbum +alcalde +aldea +alegre +alejar +alerta +aleta +alfiler +alga +algodón +aliado +aliento +alivio +alma +almeja +almíbar +altar +alteza +altivo +alto +altura +alumno +alzar +amable +amante +amapola +amargo +amasar +ámbar +ámbito +ameno +amigo +amistad +amor +amparo +amplio +ancho +anciano +ancla +andar +andén +anemia +ángulo +anillo +ánimo +anís +anotar +antena +antiguo +antojo +anual +anular +anuncio +añadir +añejo +año +apagar +aparato +apetito +apio +aplicar +apodo +aporte +apoyo +aprender +aprobar +apuesta +apuro +arado +araña +arar +árbitro +árbol +arbusto +archivo +arco +arder +ardilla +arduo +área +árido +aries +armonía +arnés +aroma +arpa +arpón +arreglo +arroz +arruga +arte +artista +asa +asado +asalto +ascenso +asegurar +aseo +asesor +asiento +asilo +asistir +asno +asombro +áspero +astilla +astro +astuto +asumir +asunto +atajo +ataque +atar +atento +ateo +ático +atleta +átomo +atraer +atroz +atún +audaz +audio +auge +aula +aumento +ausente +autor +aval +avance +avaro +ave +avellana +avena +avestruz +avión +aviso +ayer +ayuda +ayuno +azafrán +azar +azote +azúcar +azufre +azul +baba +babor +bache +bahía +baile +bajar +balanza +balcón +balde +bambú +banco +banda +baño +barba +barco +barniz +barro +báscula +bastón +basura +batalla +batería +batir +batuta +baúl +bazar +bebé +bebida +bello +besar +beso +bestia +bicho +bien +bingo +blanco +bloque +blusa +boa +bobina +bobo +boca +bocina +boda +bodega +boina +bola +bolero +bolsa +bomba +bondad +bonito +bono +bonsái +borde +borrar +bosque +bote +botín +bóveda +bozal +bravo +brazo +brecha +breve +brillo +brinco +brisa +broca +broma +bronce +brote +bruja +brusco +bruto +buceo +bucle +bueno +buey +bufanda +bufón +búho +buitre +bulto +burbuja +burla +burro +buscar +butaca +buzón +caballo +cabeza +cabina +cabra +cacao +cadáver +cadena +caer +café +caída +caimán +caja +cajón +cal +calamar +calcio +caldo +calidad +calle +calma +calor +calvo +cama +cambio +camello +camino +campo +cáncer +candil +canela +canguro +canica +canto +caña +cañón +caoba +caos +capaz +capitán +capote +captar +capucha +cara +carbón +cárcel +careta +carga +cariño +carne +carpeta +carro +carta +casa +casco +casero +caspa +castor +catorce +catre +caudal +causa +cazo +cebolla +ceder +cedro +celda +célebre +celoso +célula +cemento +ceniza +centro +cerca +cerdo +cereza +cero +cerrar +certeza +césped +cetro +chacal +chaleco +champú +chancla +chapa +charla +chico +chiste +chivo +choque +choza +chuleta +chupar +ciclón +ciego +cielo +cien +cierto +cifra +cigarro +cima +cinco +cine +cinta +ciprés +circo +ciruela +cisne +cita +ciudad +clamor +clan +claro +clase +clave +cliente +clima +clínica +cobre +cocción +cochino +cocina +coco +código +codo +cofre +coger +cohete +cojín +cojo +cola +colcha +colegio +colgar +colina +collar +colmo +columna +combate +comer +comida +cómodo +compra +conde +conejo +conga +conocer +consejo +contar +copa +copia +corazón +corbata +corcho +cordón +corona +correr +coser +cosmos +costa +cráneo +cráter +crear +crecer +creído +crema +cría +crimen +cripta +crisis +cromo +crónica +croqueta +crudo +cruz +cuadro +cuarto +cuatro +cubo +cubrir +cuchara +cuello +cuento +cuerda +cuesta +cueva +cuidar +culebra +culpa +culto +cumbre +cumplir +cuna +cuneta +cuota +cupón +cúpula +curar +curioso +curso +curva +cutis +dama +danza +dar +dardo +dátil +deber +débil +década +decir +dedo +defensa +definir +dejar +delfín +delgado +delito +demora +denso +dental +deporte +derecho +derrota +desayuno +deseo +desfile +desnudo +destino +desvío +detalle +detener +deuda +día +diablo +diadema +diamante +diana +diario +dibujo +dictar +diente +dieta +diez +difícil +digno +dilema +diluir +dinero +directo +dirigir +disco +diseño +disfraz +diva +divino +doble +doce +dolor +domingo +don +donar +dorado +dormir +dorso +dos +dosis +dragón +droga +ducha +duda +duelo +dueño +dulce +dúo +duque +durar +dureza +duro +ébano +ebrio +echar +eco +ecuador +edad +edición +edificio +editor +educar +efecto +eficaz +eje +ejemplo +elefante +elegir +elemento +elevar +elipse +élite +elixir +elogio +eludir +embudo +emitir +emoción +empate +empeño +empleo +empresa +enano +encargo +enchufe +encía +enemigo +enero +enfado +enfermo +engaño +enigma +enlace +enorme +enredo +ensayo +enseñar +entero +entrar +envase +envío +época +equipo +erizo +escala +escena +escolar +escribir +escudo +esencia +esfera +esfuerzo +espada +espejo +espía +esposa +espuma +esquí +estar +este +estilo +estufa +etapa +eterno +ética +etnia +evadir +evaluar +evento +evitar +exacto +examen +exceso +excusa +exento +exigir +exilio +existir +éxito +experto +explicar +exponer +extremo +fábrica +fábula +fachada +fácil +factor +faena +faja +falda +fallo +falso +faltar +fama +familia +famoso +faraón +farmacia +farol +farsa +fase +fatiga +fauna +favor +fax +febrero +fecha +feliz +feo +feria +feroz +fértil +fervor +festín +fiable +fianza +fiar +fibra +ficción +ficha +fideo +fiebre +fiel +fiera +fiesta +figura +fijar +fijo +fila +filete +filial +filtro +fin +finca +fingir +finito +firma +flaco +flauta +flecha +flor +flota +fluir +flujo +flúor +fobia +foca +fogata +fogón +folio +folleto +fondo +forma +forro +fortuna +forzar +fosa +foto +fracaso +frágil +franja +frase +fraude +freír +freno +fresa +frío +frito +fruta +fuego +fuente +fuerza +fuga +fumar +función +funda +furgón +furia +fusil +fútbol +futuro +gacela +gafas +gaita +gajo +gala +galería +gallo +gamba +ganar +gancho +ganga +ganso +garaje +garza +gasolina +gastar +gato +gavilán +gemelo +gemir +gen +género +genio +gente +geranio +gerente +germen +gesto +gigante +gimnasio +girar +giro +glaciar +globo +gloria +gol +golfo +goloso +golpe +goma +gordo +gorila +gorra +gota +goteo +gozar +grada +gráfico +grano +grasa +gratis +grave +grieta +grillo +gripe +gris +grito +grosor +grúa +grueso +grumo +grupo +guante +guapo +guardia +guerra +guía +guiño +guion +guiso +guitarra +gusano +gustar +haber +hábil +hablar +hacer +hacha +hada +hallar +hamaca +harina +haz +hazaña +hebilla +hebra +hecho +helado +helio +hembra +herir +hermano +héroe +hervir +hielo +hierro +hígado +higiene +hijo +himno +historia +hocico +hogar +hoguera +hoja +hombre +hongo +honor +honra +hora +hormiga +horno +hostil +hoyo +hueco +huelga +huerta +hueso +huevo +huida +huir +humano +húmedo +humilde +humo +hundir +huracán +hurto +icono +ideal +idioma +ídolo +iglesia +iglú +igual +ilegal +ilusión +imagen +imán +imitar +impar +imperio +imponer +impulso +incapaz +índice +inerte +infiel +informe +ingenio +inicio +inmenso +inmune +innato +insecto +instante +interés +íntimo +intuir +inútil +invierno +ira +iris +ironía +isla +islote +jabalí +jabón +jamón +jarabe +jardín +jarra +jaula +jazmín +jefe +jeringa +jinete +jornada +joroba +joven +joya +juerga +jueves +juez +jugador +jugo +juguete +juicio +junco +jungla +junio +juntar +júpiter +jurar +justo +juvenil +juzgar +kilo +koala +labio +lacio +lacra +lado +ladrón +lagarto +lágrima +laguna +laico +lamer +lámina +lámpara +lana +lancha +langosta +lanza +lápiz +largo +larva +lástima +lata +látex +latir +laurel +lavar +lazo +leal +lección +leche +lector +leer +legión +legumbre +lejano +lengua +lento +leña +león +leopardo +lesión +letal +letra +leve +leyenda +libertad +libro +licor +líder +lidiar +lienzo +liga +ligero +lima +límite +limón +limpio +lince +lindo +línea +lingote +lino +linterna +líquido +liso +lista +litera +litio +litro +llaga +llama +llanto +llave +llegar +llenar +llevar +llorar +llover +lluvia +lobo +loción +loco +locura +lógica +logro +lombriz +lomo +lonja +lote +lucha +lucir +lugar +lujo +luna +lunes +lupa +lustro +luto +luz +maceta +macho +madera +madre +maduro +maestro +mafia +magia +mago +maíz +maldad +maleta +malla +malo +mamá +mambo +mamut +manco +mando +manejar +manga +maniquí +manjar +mano +manso +manta +mañana +mapa +máquina +mar +marco +marea +marfil +margen +marido +mármol +marrón +martes +marzo +masa +máscara +masivo +matar +materia +matiz +matriz +máximo +mayor +mazorca +mecha +medalla +medio +médula +mejilla +mejor +melena +melón +memoria +menor +mensaje +mente +menú +mercado +merengue +mérito +mes +mesón +meta +meter +método +metro +mezcla +miedo +miel +miembro +miga +mil +milagro +militar +millón +mimo +mina +minero +mínimo +minuto +miope +mirar +misa +miseria +misil +mismo +mitad +mito +mochila +moción +moda +modelo +moho +mojar +molde +moler +molino +momento +momia +monarca +moneda +monja +monto +moño +morada +morder +moreno +morir +morro +morsa +mortal +mosca +mostrar +motivo +mover +móvil +mozo +mucho +mudar +mueble +muela +muerte +muestra +mugre +mujer +mula +muleta +multa +mundo +muñeca +mural +muro +músculo +museo +musgo +música +muslo +nácar +nación +nadar +naipe +naranja +nariz +narrar +nasal +natal +nativo +natural +náusea +naval +nave +navidad +necio +néctar +negar +negocio +negro +neón +nervio +neto +neutro +nevar +nevera +nicho +nido +niebla +nieto +niñez +niño +nítido +nivel +nobleza +noche +nómina +noria +norma +norte +nota +noticia +novato +novela +novio +nube +nuca +núcleo +nudillo +nudo +nuera +nueve +nuez +nulo +número +nutria +oasis +obeso +obispo +objeto +obra +obrero +observar +obtener +obvio +oca +ocaso +océano +ochenta +ocho +ocio +ocre +octavo +octubre +oculto +ocupar +ocurrir +odiar +odio +odisea +oeste +ofensa +oferta +oficio +ofrecer +ogro +oído +oír +ojo +ola +oleada +olfato +olivo +olla +olmo +olor +olvido +ombligo +onda +onza +opaco +opción +ópera +opinar +oponer +optar +óptica +opuesto +oración +orador +oral +órbita +orca +orden +oreja +órgano +orgía +orgullo +oriente +origen +orilla +oro +orquesta +oruga +osadía +oscuro +osezno +oso +ostra +otoño +otro +oveja +óvulo +óxido +oxígeno +oyente +ozono +pacto +padre +paella +página +pago +país +pájaro +palabra +palco +paleta +pálido +palma +paloma +palpar +pan +panal +pánico +pantera +pañuelo +papá +papel +papilla +paquete +parar +parcela +pared +parir +paro +párpado +parque +párrafo +parte +pasar +paseo +pasión +paso +pasta +pata +patio +patria +pausa +pauta +pavo +payaso +peatón +pecado +pecera +pecho +pedal +pedir +pegar +peine +pelar +peldaño +pelea +peligro +pellejo +pelo +peluca +pena +pensar +peñón +peón +peor +pepino +pequeño +pera +percha +perder +pereza +perfil +perico +perla +permiso +perro +persona +pesa +pesca +pésimo +pestaña +pétalo +petróleo +pez +pezuña +picar +pichón +pie +piedra +pierna +pieza +pijama +pilar +piloto +pimienta +pino +pintor +pinza +piña +piojo +pipa +pirata +pisar +piscina +piso +pista +pitón +pizca +placa +plan +plata +playa +plaza +pleito +pleno +plomo +pluma +plural +pobre +poco +poder +podio +poema +poesía +poeta +polen +policía +pollo +polvo +pomada +pomelo +pomo +pompa +poner +porción +portal +posada +poseer +posible +poste +potencia +potro +pozo +prado +precoz +pregunta +premio +prensa +preso +previo +primo +príncipe +prisión +privar +proa +probar +proceso +producto +proeza +profesor +programa +prole +promesa +pronto +propio +próximo +prueba +público +puchero +pudor +pueblo +puerta +puesto +pulga +pulir +pulmón +pulpo +pulso +puma +punto +puñal +puño +pupa +pupila +puré +quedar +queja +quemar +querer +queso +quieto +química +quince +quitar +rábano +rabia +rabo +ración +radical +raíz +rama +rampa +rancho +rango +rapaz +rápido +rapto +rasgo +raspa +rato +rayo +raza +razón +reacción +realidad +rebaño +rebote +recaer +receta +rechazo +recoger +recreo +recto +recurso +red +redondo +reducir +reflejo +reforma +refrán +refugio +regalo +regir +regla +regreso +rehén +reino +reír +reja +relato +relevo +relieve +relleno +reloj +remar +remedio +remo +rencor +rendir +renta +reparto +repetir +reposo +reptil +res +rescate +resina +respeto +resto +resumen +retiro +retorno +retrato +reunir +revés +revista +rey +rezar +rico +riego +rienda +riesgo +rifa +rígido +rigor +rincón +riñón +río +riqueza +risa +ritmo +rito +rizo +roble +roce +rociar +rodar +rodeo +rodilla +roer +rojizo +rojo +romero +romper +ron +ronco +ronda +ropa +ropero +rosa +rosca +rostro +rotar +rubí +rubor +rudo +rueda +rugir +ruido +ruina +ruleta +rulo +rumbo +rumor +ruptura +ruta +rutina +sábado +saber +sabio +sable +sacar +sagaz +sagrado +sala +saldo +salero +salir +salmón +salón +salsa +salto +salud +salvar +samba +sanción +sandía +sanear +sangre +sanidad +sano +santo +sapo +saque +sardina +sartén +sastre +satán +sauna +saxofón +sección +seco +secreto +secta +sed +seguir +seis +sello +selva +semana +semilla +senda +sensor +señal +señor +separar +sepia +sequía +ser +serie +sermón +servir +sesenta +sesión +seta +setenta +severo +sexo +sexto +sidra +siesta +siete +siglo +signo +sílaba +silbar +silencio +silla +símbolo +simio +sirena +sistema +sitio +situar +sobre +socio +sodio +sol +solapa +soldado +soledad +sólido +soltar +solución +sombra +sondeo +sonido +sonoro +sonrisa +sopa +soplar +soporte +sordo +sorpresa +sorteo +sostén +sótano +suave +subir +suceso +sudor +suegra +suelo +sueño +suerte +sufrir +sujeto +sultán +sumar +superar +suplir +suponer +supremo +sur +surco +sureño +surgir +susto +sutil +tabaco +tabique +tabla +tabú +taco +tacto +tajo +talar +talco +talento +talla +talón +tamaño +tambor +tango +tanque +tapa +tapete +tapia +tapón +taquilla +tarde +tarea +tarifa +tarjeta +tarot +tarro +tarta +tatuaje +tauro +taza +tazón +teatro +techo +tecla +técnica +tejado +tejer +tejido +tela +teléfono +tema +temor +templo +tenaz +tender +tener +tenis +tenso +teoría +terapia +terco +término +ternura +terror +tesis +tesoro +testigo +tetera +texto +tez +tibio +tiburón +tiempo +tienda +tierra +tieso +tigre +tijera +tilde +timbre +tímido +timo +tinta +tío +típico +tipo +tira +tirón +titán +títere +título +tiza +toalla +tobillo +tocar +tocino +todo +toga +toldo +tomar +tono +tonto +topar +tope +toque +tórax +torero +tormenta +torneo +toro +torpedo +torre +torso +tortuga +tos +tosco +toser +tóxico +trabajo +tractor +traer +tráfico +trago +traje +tramo +trance +trato +trauma +trazar +trébol +tregua +treinta +tren +trepar +tres +tribu +trigo +tripa +triste +triunfo +trofeo +trompa +tronco +tropa +trote +trozo +truco +trueno +trufa +tubería +tubo +tuerto +tumba +tumor +túnel +túnica +turbina +turismo +turno +tutor +ubicar +úlcera +umbral +unidad +unir +universo +uno +untar +uña +urbano +urbe +urgente +urna +usar +usuario +útil +utopía +uva +vaca +vacío +vacuna +vagar +vago +vaina +vajilla +vale +válido +valle +valor +válvula +vampiro +vara +variar +varón +vaso +vecino +vector +vehículo +veinte +vejez +vela +velero +veloz +vena +vencer +venda +veneno +vengar +venir +venta +venus +ver +verano +verbo +verde +vereda +verja +verso +verter +vía +viaje +vibrar +vicio +víctima +vida +vídeo +vidrio +viejo +viernes +vigor +vil +villa +vinagre +vino +viñedo +violín +viral +virgo +virtud +visor +víspera +vista +vitamina +viudo +vivaz +vivero +vivir +vivo +volcán +volumen +volver +voraz +votar +voto +voz +vuelo +vulgar +yacer +yate +yegua +yema +yerno +yeso +yodo +yoga +yogur +zafiro +zanja +zapato +zarza +zona +zorro +zumo +zurdo +` diff --git a/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md b/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md deleted file mode 100644 index 28e2c242558b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md +++ /dev/null @@ -1,186 +0,0 @@ -Changes by Version -================== - -2.15.0 (unreleased) -------------------- - -- nothing yet - - -2.14.0 (2018-04-30) -------------------- - -- Support throttling for debug traces (#274) -- Remove dependency on Apache Thrift (#303) -- Remove dependency on tchannel (#295) (#294) -- Test with Go 1.9 (#298) - - -2.13.0 (2018-04-15) -------------------- - -- Use value receiver for config.NewTracer() (#283) -- Lock span during jaeger thrift conversion (#273) -- Fix the RemotelyControlledSampler so that it terminates go-routine on Close() (#260) -- Added support for client configuration via env vars (#275) -- Allow overriding sampler in the Config (#270) - - -2.12.0 (2018-03-14) -------------------- - -- Use lock when retrieving span.Context() (#268) -- Add Configuration support for custom Injector and Extractor (#263) - - -2.11.2 (2018-01-12) -------------------- - -- Add Gopkg.toml to allow using the lib with `dep` - - -2.11.1 (2018-01-03) -------------------- - -- Do not enqueue spans after Reporter is closed (#235, #245) -- Change default flush interval to 1sec (#243) - - -2.11.0 (2017-11-27) -------------------- - -- Normalize metric names and tags to be compatible with Prometheus (#222) - - -2.10.0 (2017-11-14) -------------------- - -- Support custom tracing headers (#176) -- Add BaggageRestrictionManager (#178) and RemoteBaggageRestrictionManager (#182) -- Do not coerce baggage keys to lower case (#196) -- Log span name when span cannot be reported (#198) -- Add option to enable gen128Bit for tracer (#193) and allow custom generator for high bits of trace ID (#219) - - -2.9.0 (2017-07-29) ------------------- - -- Pin thrift <= 0.10 (#179) -- Introduce a parallel interface ContribObserver (#159) - - -2.8.0 (2017-07-05) ------------------- - -- Drop `jaeger.` prefix from `jaeger.hostname` process-level tag -- Add options to set tracer tags - - -2.7.0 (2017-06-21) ------------------- - -- Fix rate limiter balance [#135](https://github.com/uber/jaeger-client-go/pull/135) [#140](https://github.com/uber/jaeger-client-go/pull/140) -- Default client to send Jaeger.thrift [#147](https://github.com/uber/jaeger-client-go/pull/147) -- Save baggage in span [#153](https://github.com/uber/jaeger-client-go/pull/153) -- Move reporter.queueLength to the top of the struct to guarantee 64bit alignment [#158](https://github.com/uber/jaeger-client-go/pull/158) -- Support HTTP transport with jaeger.thrift [#161](https://github.com/uber/jaeger-client-go/pull/161) - - -2.6.0 (2017-03-28) ------------------- - -- Add config option to initialize RPC Metrics feature - - -2.5.0 (2017-03-23) ------------------- - -- Split request latency metric by success/failure [#123](https://github.com/uber/jaeger-client-go/pull/123) -- Add mutex to adaptive sampler and fix race condition [#124](https://github.com/uber/jaeger-client-go/pull/124) -- Fix rate limiter panic [#125](https://github.com/uber/jaeger-client-go/pull/125) - - -2.4.0 (2017-03-21) ------------------- - -- Remove `_ms` suffix from request latency metric name [#121](https://github.com/uber/jaeger-client-go/pull/121) -- Rename all metrics to "request" and "http_request" and use tags for other dimensions [#121](https://github.com/uber/jaeger-client-go/pull/121) - - -2.3.0 (2017-03-20) ------------------- - -- Make Span type public to allow access to non-std methods for testing [#117](https://github.com/uber/jaeger-client-go/pull/117) -- Add a structured way to extract traces for logging with zap [#118](https://github.com/uber/jaeger-client-go/pull/118) - - -2.2.1 (2017-03-14) ------------------- - -- Fix panic caused by updating the remote sampler from adaptive sampler to any other sampler type (https://github.com/uber/jaeger-client-go/pull/111) - - -2.2.0 (2017-03-10) ------------------- - -- Introduce Observer and SpanObserver (https://github.com/uber/jaeger-client-go/pull/94) -- Add RPC metrics emitter as Observer/SpanObserver (https://github.com/uber/jaeger-client-go/pull/103) - - -2.1.2 (2017-02-27) -------------------- - -- Fix leaky bucket bug (https://github.com/uber/jaeger-client-go/pull/99) -- Fix zap logger Infof (https://github.com/uber/jaeger-client-go/pull/100) -- Add tracer initialization godoc examples - - -2.1.1 (2017-02-21) -------------------- - -- Fix inefficient usage of zap.Logger - - -2.1.0 (2017-02-17) -------------------- - -- Add adapter for zap.Logger (https://github.com/uber-go/zap) -- Move logging API to ./log/ package - - -2.0.0 (2017-02-08) -------------------- - -- Support Adaptive Sampling -- Support 128bit Trace IDs -- Change trace/span IDs from uint64 to strong types TraceID and SpanID -- Add Zipkin HTTP B3 Propagation format support #72 -- Rip out existing metrics and use github.com/uber/jaeger-lib/metrics -- Change API for tracer, reporter, sampler initialization - - -1.6.0 (2016-10-14) -------------------- - -- Add Zipkin HTTP transport -- Support external baggage via jaeger-baggage header -- Unpin Thrift version, keep to master - - -1.5.1 (2016-09-27) -------------------- - -- Relax dependency on opentracing to ^1 - - -1.5.0 (2016-09-27) -------------------- - -- Upgrade to opentracing-go 1.0 -- Support KV logging for Spans - - -1.4.0 (2016-09-14) -------------------- - -- Support debug traces via HTTP header "jaeger-debug-id" diff --git a/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md b/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md deleted file mode 100644 index 7cf014a51edb..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md +++ /dev/null @@ -1,170 +0,0 @@ -# How to Contribute to Jaeger - -We'd love your help! - -Jaeger is [Apache 2.0 licensed](LICENSE) and accepts contributions via GitHub -pull requests. This document outlines some of the conventions on development -workflow, commit message formatting, contact points and other resources to make -it easier to get your contribution accepted. - -We gratefully welcome improvements to documentation as well as to code. - -# Certificate of Origin - -By contributing to this project you agree to the [Developer Certificate of -Origin](https://developercertificate.org/) (DCO). This document was created -by the Linux Kernel community and is a simple statement that you, as a -contributor, have the legal right to make the contribution. See the [DCO](DCO) -file for details. - -## Getting Started - -This library uses [glide](https://github.com/Masterminds/glide) to manage dependencies. - -To get started, make sure you clone the Git repository into the correct location -`github.com/uber/jaeger-client-go` relative to `$GOPATH`: - -``` -mkdir -p $GOPATH/src/github.com/uber -cd $GOPATH/src/github.com/uber -git clone git@github.com:jaegertracing/jaeger-client-go.git jaeger-client-go -cd jaeger-client-go -``` - -Then install dependencies and run the tests: - -``` -git submodule update --init --recursive -glide install -make test -``` - -## Imports grouping - -This projects follows the following pattern for grouping imports in Go files: - * imports from standard library - * imports from other projects - * imports from `jaeger-client-go` project - -For example: - -```go -import ( - "fmt" - - "github.com/uber/jaeger-lib/metrics" - "go.uber.org/zap" - - "github.com/uber/jaeger-client-go/config" -) -``` - -## Making A Change - -*Before making any significant changes, please [open an -issue](https://github.com/jaegertracing/jaeger-client-go/issues).* Discussing your proposed -changes ahead of time will make the contribution process smooth for everyone. - -Once we've discussed your changes and you've got your code ready, make sure -that tests are passing (`make test` or `make cover`) and open your PR. Your -pull request is most likely to be accepted if it: - -* Includes tests for new functionality. -* Follows the guidelines in [Effective - Go](https://golang.org/doc/effective_go.html) and the [Go team's common code - review comments](https://github.com/golang/go/wiki/CodeReviewComments). -* Has a [good commit message](https://chris.beams.io/posts/git-commit/): - * Separate subject from body with a blank line - * Limit the subject line to 50 characters - * Capitalize the subject line - * Do not end the subject line with a period - * Use the imperative mood in the subject line - * Wrap the body at 72 characters - * Use the body to explain _what_ and _why_ instead of _how_ -* Each commit must be signed by the author ([see below](#sign-your-work)). - -## License - -By contributing your code, you agree to license your contribution under the terms -of the [Apache License](LICENSE). - -If you are adding a new file it should have a header like below. The easiest -way to add such header is to run `make fmt`. - -``` -// Copyright (c) 2017 The Jaeger Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -``` - -## Sign your work - -The sign-off is a simple line at the end of the explanation for the -patch, which certifies that you wrote it or otherwise have the right to -pass it on as an open-source patch. The rules are pretty simple: if you -can certify the below (from -[developercertificate.org](http://developercertificate.org/)): - -``` -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` - -then you just add a line to every git commit message: - - Signed-off-by: Joe Smith - -using your real name (sorry, no pseudonyms or anonymous contributions.) - -You can add the sign off when creating the git commit via `git commit -s`. - -If you want this to be automatic you can set up some aliases: - -``` -git config --add alias.amend "commit -s --amend" -git config --add alias.c "commit -s" -``` diff --git a/vendor/github.com/uber/jaeger-client-go/DCO b/vendor/github.com/uber/jaeger-client-go/DCO deleted file mode 100644 index 068953d4bd98..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/DCO +++ /dev/null @@ -1,37 +0,0 @@ -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. - diff --git a/vendor/github.com/uber/jaeger-client-go/Gopkg.lock b/vendor/github.com/uber/jaeger-client-go/Gopkg.lock deleted file mode 100644 index ec054c6ed62a..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/Gopkg.lock +++ /dev/null @@ -1,164 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - name = "github.com/beorn7/perks" - packages = ["quantile"] - revision = "3a771d992973f24aa725d07868b467d1ddfceafb" - -[[projects]] - branch = "master" - name = "github.com/codahale/hdrhistogram" - packages = ["."] - revision = "3a0bb77429bd3a61596f5e8a3172445844342120" - -[[projects]] - branch = "master" - name = "github.com/crossdock/crossdock-go" - packages = [ - ".", - "assert", - "require" - ] - revision = "049aabb0122b03bc9bd30cab8f3f91fb60166361" - -[[projects]] - name = "github.com/davecgh/go-spew" - packages = ["spew"] - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" - -[[projects]] - name = "github.com/golang/protobuf" - packages = ["proto"] - revision = "925541529c1fa6821df4e44ce2723319eb2be768" - version = "v1.0.0" - -[[projects]] - name = "github.com/matttproud/golang_protobuf_extensions" - packages = ["pbutil"] - revision = "3247c84500bff8d9fb6d579d800f20b3e091582c" - version = "v1.0.0" - -[[projects]] - name = "github.com/opentracing/opentracing-go" - packages = [ - ".", - "ext", - "log" - ] - revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38" - version = "v1.0.2" - -[[projects]] - name = "github.com/pkg/errors" - packages = ["."] - revision = "645ef00459ed84a119197bfb8d8205042c6df63d" - version = "v0.8.0" - -[[projects]] - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - revision = "792786c7400a136282c1664665ae0a8db921c6c2" - version = "v1.0.0" - -[[projects]] - name = "github.com/prometheus/client_golang" - packages = ["prometheus"] - revision = "c5b7fccd204277076155f10851dad72b76a49317" - version = "v0.8.0" - -[[projects]] - branch = "master" - name = "github.com/prometheus/client_model" - packages = ["go"] - revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c" - -[[projects]] - branch = "master" - name = "github.com/prometheus/common" - packages = [ - "expfmt", - "internal/bitbucket.org/ww/goautoneg", - "model" - ] - revision = "d811d2e9bf898806ecfb6ef6296774b13ffc314c" - -[[projects]] - branch = "master" - name = "github.com/prometheus/procfs" - packages = [ - ".", - "internal/util", - "nfs", - "xfs" - ] - revision = "8b1c2da0d56deffdbb9e48d4414b4e674bd8083e" - -[[projects]] - name = "github.com/stretchr/testify" - packages = [ - "assert", - "require", - "suite" - ] - revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" - version = "v1.2.1" - -[[projects]] - name = "github.com/uber-go/atomic" - packages = ["."] - revision = "8474b86a5a6f79c443ce4b2992817ff32cf208b8" - version = "v1.3.1" - -[[projects]] - name = "github.com/uber/jaeger-lib" - packages = [ - "metrics", - "metrics/prometheus", - "metrics/testutils" - ] - revision = "4267858c0679cd4e47cefed8d7f70fd386cfb567" - version = "v1.4.0" - -[[projects]] - name = "go.uber.org/atomic" - packages = ["."] - revision = "54f72d32435d760d5604f17a82e2435b28dc4ba5" - version = "v1.3.0" - -[[projects]] - name = "go.uber.org/multierr" - packages = ["."] - revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" - version = "v1.1.0" - -[[projects]] - name = "go.uber.org/zap" - packages = [ - ".", - "buffer", - "internal/bufferpool", - "internal/color", - "internal/exit", - "zapcore" - ] - revision = "eeedf312bc6c57391d84767a4cd413f02a917974" - version = "v1.8.0" - -[[projects]] - branch = "master" - name = "golang.org/x/net" - packages = [ - "context", - "context/ctxhttp" - ] - revision = "5f9ae10d9af5b1c89ae6904293b14b064d4ada23" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "f9dcfaf37a785c5dac1e20c29605eda29a83ba9c6f8842e92960dc94c8c4ff80" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/uber/jaeger-client-go/Gopkg.toml b/vendor/github.com/uber/jaeger-client-go/Gopkg.toml deleted file mode 100644 index baf7a6bdf7ae..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/Gopkg.toml +++ /dev/null @@ -1,27 +0,0 @@ -[[constraint]] - name = "github.com/crossdock/crossdock-go" - branch = "master" - -[[constraint]] - name = "github.com/opentracing/opentracing-go" - version = "^1" - -[[constraint]] - name = "github.com/prometheus/client_golang" - version = "0.8.0" - -[[constraint]] - name = "github.com/stretchr/testify" - version = "^1.1.3" - -[[constraint]] - name = "github.com/uber-go/atomic" - version = "^1" - -[[constraint]] - name = "github.com/uber/jaeger-lib" - version = "^1.3" - -[[constraint]] - name = "go.uber.org/zap" - version = "^1" diff --git a/vendor/github.com/uber/jaeger-client-go/LICENSE b/vendor/github.com/uber/jaeger-client-go/LICENSE deleted file mode 100644 index 261eeb9e9f8b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/uber/jaeger-client-go/Makefile b/vendor/github.com/uber/jaeger-client-go/Makefile deleted file mode 100644 index 601cc65148e2..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/Makefile +++ /dev/null @@ -1,117 +0,0 @@ -PROJECT_ROOT=github.com/uber/jaeger-client-go -PACKAGES := $(shell glide novendor | grep -v -e ./thrift-gen/... -e ./thrift/...) -# all .go files that don't exist in hidden directories -ALL_SRC := $(shell find . -name "*.go" | grep -v -e vendor -e thrift-gen -e ./thrift/ \ - -e ".*/\..*" \ - -e ".*/_.*" \ - -e ".*/mocks.*") - --include crossdock/rules.mk - -export GO15VENDOREXPERIMENT=1 - -RACE=-race -GOTEST=go test -v $(RACE) -GOLINT=golint -GOVET=go vet -GOFMT=gofmt -FMT_LOG=fmt.log -LINT_LOG=lint.log - -THRIFT_VER=0.9.3 -THRIFT_IMG=thrift:$(THRIFT_VER) -THRIFT=docker run -v "${PWD}:/data" $(THRIFT_IMG) thrift -THRIFT_GO_ARGS=thrift_import="github.com/apache/thrift/lib/go/thrift" -THRIFT_GEN_DIR=thrift-gen - -PASS=$(shell printf "\033[32mPASS\033[0m") -FAIL=$(shell printf "\033[31mFAIL\033[0m") -COLORIZE=sed ''/PASS/s//$(PASS)/'' | sed ''/FAIL/s//$(FAIL)/'' - -.DEFAULT_GOAL := test-and-lint - -.PHONY: test-and-lint -test-and-lint: test fmt lint - -.PHONY: test -test: - bash -c "set -e; set -o pipefail; $(GOTEST) $(PACKAGES) | $(COLORIZE)" - -.PHONY: fmt -fmt: - $(GOFMT) -e -s -l -w $(ALL_SRC) - ./scripts/updateLicenses.sh - -.PHONY: lint -lint: - $(GOVET) $(PACKAGES) - @cat /dev/null > $(LINT_LOG) - @$(foreach pkg, $(PACKAGES), $(GOLINT) $(pkg) | grep -v crossdock/thrift >> $(LINT_LOG) || true;) - @[ ! -s "$(LINT_LOG)" ] || (echo "Lint Failures" | cat - $(LINT_LOG) && false) - @$(GOFMT) -e -s -l $(ALL_SRC) > $(FMT_LOG) - ./scripts/updateLicenses.sh >> $(FMT_LOG) - @[ ! -s "$(FMT_LOG)" ] || (echo "go fmt or license check failures, run 'make fmt'" | cat - $(FMT_LOG) && false) - - -.PHONY: install -install: - glide --version || go get github.com/Masterminds/glide -ifeq ($(USE_DEP),true) - dep ensure -else - glide install -endif - - -.PHONY: cover -cover: - ./scripts/cover.sh $(shell go list $(PACKAGES)) - go tool cover -html=cover.out -o cover.html - - -# This is not part of the regular test target because we don't want to slow it -# down. -.PHONY: test-examples -test-examples: - make -C examples - -# TODO at the moment we're not generating tchan_*.go files -thrift: idl-submodule thrift-image - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/agent.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/sampling.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/jaeger.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/zipkincore.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/baggage.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/crossdock/thrift/ /data/idl/thrift/crossdock/tracetest.thrift - sed -i '' 's|"zipkincore"|"$(PROJECT_ROOT)/thrift-gen/zipkincore"|g' $(THRIFT_GEN_DIR)/agent/*.go - sed -i '' 's|"jaeger"|"$(PROJECT_ROOT)/thrift-gen/jaeger"|g' $(THRIFT_GEN_DIR)/agent/*.go - sed -i '' 's|"github.com/apache/thrift/lib/go/thrift"|"github.com/uber/jaeger-client-go/thrift"|g' \ - $(THRIFT_GEN_DIR)/*/*.go crossdock/thrift/tracetest/*.go - rm -rf thrift-gen/*/*-remote - rm -rf crossdock/thrift/*/*-remote - rm -rf thrift-gen/jaeger/collector.go - -idl-submodule: - git submodule init - git submodule update - -thrift-image: - $(THRIFT) -version - -.PHONY: install-dep-ci -install-dep-ci: - - curl -L -s https://github.com/golang/dep/releases/download/v0.3.2/dep-linux-amd64 -o $$GOPATH/bin/dep - - chmod +x $$GOPATH/bin/dep - -.PHONY: install-ci -install-ci: install-dep-ci install - go get github.com/wadey/gocovmerge - go get github.com/mattn/goveralls - go get golang.org/x/tools/cmd/cover - go get github.com/golang/lint/golint - -.PHONY: test-ci -test-ci: - @./scripts/cover.sh $(shell go list $(PACKAGES)) - make lint - diff --git a/vendor/github.com/uber/jaeger-client-go/README.md b/vendor/github.com/uber/jaeger-client-go/README.md deleted file mode 100644 index 16b04454e168..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/README.md +++ /dev/null @@ -1,260 +0,0 @@ -[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![OpenTracing 1.0 Enabled][ot-img]][ot-url] - -# Jaeger Bindings for Go OpenTracing API - -Instrumentation library that implements an -[OpenTracing](http://opentracing.io) Tracer for Jaeger (https://jaegertracing.io). - -**IMPORTANT**: The library's import path is based on its original location under `github.com/uber`. Do not try to import it as `github.com/jaegertracing`, it will not compile. We might revisit this in the next major release. - * :white_check_mark: `import "github.com/uber/jaeger-client-go"` - * :x: `import "github.com/jaegertracing/jaeger-client-go"` - -## How to Contribute - -Please see [CONTRIBUTING.md](CONTRIBUTING.md). - -## Installation - -We recommended using a dependency manager like [glide](https://github.com/Masterminds/glide) -and [semantic versioning](http://semver.org/) when including this library into an application. -For example, Jaeger backend imports this library like this: - -```yaml -- package: github.com/uber/jaeger-client-go - version: ^2.7.0 -``` - -If you instead want to use the latest version in `master`, you can pull it via `go get`. -Note that during `go get` you may see build errors due to incompatible dependencies, which is why -we recommend using semantic versions for dependencies. The error may be fixed by running -`make install` (it will install `glide` if you don't have it): - -```shell -go get -u github.com/uber/jaeger-client-go/ -cd $GOPATH/src/github.com/uber/jaeger-client-go/ -git submodule update --init --recursive -make install -``` - -## Initialization - -See tracer initialization examples in [godoc](https://godoc.org/github.com/uber/jaeger-client-go/config#pkg-examples) -and [config/example_test.go](./config/example_test.go). - -### Environment variables - -The tracer can be initialized with values coming from environment variables. None of the env vars are required -and all of them can be overriden via direct setting of the property on the configuration object. - -Property| Description ---- | --- -JAEGER_SERVICE_NAME | The service name -JAEGER_AGENT_HOST | The hostname for communicating with agent via UDP -JAEGER_AGENT_PORT | The port for communicating with agent via UDP -JAEGER_REPORTER_LOG_SPANS | Whether the reporter should also log the spans -JAEGER_REPORTER_MAX_QUEUE_SIZE | The reporter's maximum queue size -JAEGER_REPORTER_FLUSH_INTERVAL | The reporter's flush interval (ms) -JAEGER_SAMPLER_TYPE | The sampler type -JAEGER_SAMPLER_PARAM | The sampler parameter (number) -JAEGER_SAMPLER_MANAGER_HOST_PORT | The host name and port when using the remote controlled sampler -JAEGER_SAMPLER_MAX_OPERATIONS | The maximum number of operations that the sampler will keep track of -JAEGER_SAMPLER_REFRESH_INTERVAL | How often the remotely controlled sampler will poll jaeger-agent for the appropriate sampling strategy -JAEGER_TAGS | A comma separated list of `name = value` tracer level tags, which get added to all reported spans. The value can also refer to an environment variable using the format `${envVarName:default}`, where the `:default` is optional, and identifies a value to be used if the environment variable cannot be found -JAEGER_DISABLED | Whether the tracer is disabled or not. If true, the default `opentracing.NoopTracer` is used. -JAEGER_RPC_METRICS | Whether to store RPC metrics - -### Closing the tracer via `io.Closer` - -The constructor function for Jaeger Tracer returns the tracer itself and an `io.Closer` instance. -It is recommended to structure your `main()` so that it calls the `Close()` function on the closer -before exiting, e.g. - -```go -tracer, closer, err := cfg.NewTracer(...) -defer closer.Close() -``` - -This is especially useful for command-line tools that enable tracing, as well as -for the long-running apps that support graceful shutdown. For example, if your deployment -system sends SIGTERM instead of killing the process and you trap that signal to do a graceful -exit, then having `defer closer.Closer()` ensures that all buffered spans are flushed. - -### Metrics & Monitoring - -The tracer emits a number of different metrics, defined in -[metrics.go](metrics.go). The monitoring backend is expected to support -tag-based metric names, e.g. instead of `statsd`-style string names -like `counters.my-service.jaeger.spans.started.sampled`, the metrics -are defined by a short name and a collection of key/value tags, for -example: `name:jaeger.traces, state:started, sampled:y`. See [metrics.go](./metrics.go) -file for the full list and descriptions of emitted metrics. - -The monitoring backend is represented by the `metrics.Factory` interface from package -[`"github.com/uber/jaeger-lib/metrics"`](https://github.com/jaegertracing/jaeger-lib/tree/master/metrics). An implementation -of that interface can be passed as an option to either the Configuration object or the Tracer -constructor, for example: - -```go -import ( - "github.com/uber/jaeger-client-go/config" - "github.com/uber/jaeger-lib/metrics/prometheus" -) - - metricsFactory := prometheus.New() - tracer, closer, err := config.Configuration{ - ServiceName: "your-service-name", - }.NewTracer( - config.Metrics(metricsFactory), - ) -``` - -By default, a no-op `metrics.NullFactory` is used. - -### Logging - -The tracer can be configured with an optional logger, which will be -used to log communication errors, or log spans if a logging reporter -option is specified in the configuration. The logging API is abstracted -by the [Logger](logger.go) interface. A logger instance implementing -this interface can be set on the `Config` object before calling the -`New` method. - -Besides the [zap](https://github.com/uber-go/zap) implementation -bundled with this package there is also a [go-kit](https://github.com/go-kit/kit) -one in the [jaeger-lib](https://github.com/jaegertracing/jaeger-lib) repository. - -## Instrumentation for Tracing - -Since this tracer is fully compliant with OpenTracing API 1.0, -all code instrumentation should only use the API itself, as described -in the [opentracing-go](https://github.com/opentracing/opentracing-go) documentation. - -## Features - -### Reporters - -A "reporter" is a component that receives the finished spans and reports -them to somewhere. Under normal circumstances, the Tracer -should use the default `RemoteReporter`, which sends the spans out of -process via configurable "transport". For testing purposes, one can -use an `InMemoryReporter` that accumulates spans in a buffer and -allows to retrieve them for later verification. Also available are -`NullReporter`, a no-op reporter that does nothing, a `LoggingReporter` -which logs all finished spans using their `String()` method, and a -`CompositeReporter` that can be used to combine more than one reporter -into one, e.g. to attach a logging reporter to the main remote reporter. - -### Span Reporting Transports - -The remote reporter uses "transports" to actually send the spans out -of process. Currently the supported transports include: - * [Jaeger Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/agent.thrift) over UDP or HTTP, - * [Zipkin Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/zipkincore.thrift) over HTTP. - -### Sampling - -The tracer does not record all spans, but only those that have the -sampling bit set in the `flags`. When a new trace is started and a new -unique ID is generated, a sampling decision is made whether this trace -should be sampled. The sampling decision is propagated to all downstream -calls via the `flags` field of the trace context. The following samplers -are available: - 1. `RemotelyControlledSampler` uses one of the other simpler samplers - and periodically updates it by polling an external server. This - allows dynamic control of the sampling strategies. - 1. `ConstSampler` always makes the same sampling decision for all - trace IDs. it can be configured to either sample all traces, or - to sample none. - 1. `ProbabilisticSampler` uses a fixed sampling rate as a probability - for a given trace to be sampled. The actual decision is made by - comparing the trace ID with a random number multiplied by the - sampling rate. - 1. `RateLimitingSampler` can be used to allow only a certain fixed - number of traces to be sampled per second. - -### Baggage Injection - -The OpenTracing spec allows for [baggage][baggage], which are key value pairs that are added -to the span context and propagated throughout the trace. An external process can inject baggage -by setting the special HTTP Header `jaeger-baggage` on a request: - -```sh -curl -H "jaeger-baggage: key1=value1, key2=value2" http://myhost.com -``` - -Baggage can also be programatically set inside your service: - -```go -if span := opentracing.SpanFromContext(ctx); span != nil { - span.SetBaggageItem("key", "value") -} -``` - -Another service downstream of that can retrieve the baggage in a similar way: - -```go -if span := opentracing.SpanFromContext(ctx); span != nil { - val := span.BaggageItem("key") - println(val) -} -``` - -### Debug Traces (Forced Sampling) - -#### Programmatically - -The OpenTracing API defines a `sampling.priority` standard tag that -can be used to affect the sampling of a span and its children: - -```go -import ( - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" -) - -span := opentracing.SpanFromContext(ctx) -ext.SamplingPriority.Set(span, 1) -``` - -#### Via HTTP Headers - -Jaeger Tracer also understands a special HTTP Header `jaeger-debug-id`, -which can be set in the incoming request, e.g. - -```sh -curl -H "jaeger-debug-id: some-correlation-id" http://myhost.com -``` - -When Jaeger sees this header in the request that otherwise has no -tracing context, it ensures that the new trace started for this -request will be sampled in the "debug" mode (meaning it should survive -all downsampling that might happen in the collection pipeline), and the -root span will have a tag as if this statement was executed: - -```go -span.SetTag("jaeger-debug-id", "some-correlation-id") -``` - -This allows using Jaeger UI to find the trace by this tag. - -### Zipkin HTTP B3 compatible header propagation - -Jaeger Tracer supports Zipkin B3 Propagation HTTP headers, which are used -by a lot of Zipkin tracers. This means that you can use Jaeger in conjunction with e.g. [these OpenZipkin tracers](https://github.com/openzipkin). - -However it is not the default propagation format, see [here](zipkin/README.md#NewZipkinB3HTTPHeaderPropagator) how to set it up. - -## License - -[Apache 2.0 License](LICENSE). - - -[doc-img]: https://godoc.org/github.com/uber/jaeger-client-go?status.svg -[doc]: https://godoc.org/github.com/uber/jaeger-client-go -[ci-img]: https://travis-ci.org/jaegertracing/jaeger-client-go.svg?branch=master -[ci]: https://travis-ci.org/jaegertracing/jaeger-client-go -[cov-img]: https://codecov.io/gh/jaegertracing/jaeger-client-go/branch/master/graph/badge.svg -[cov]: https://codecov.io/gh/jaegertracing/jaeger-client-go -[ot-img]: https://img.shields.io/badge/OpenTracing--1.0-enabled-blue.svg -[ot-url]: http://opentracing.io -[baggage]: https://github.com/opentracing/specification/blob/master/specification.md#set-a-baggage-item diff --git a/vendor/github.com/uber/jaeger-client-go/RELEASE.md b/vendor/github.com/uber/jaeger-client-go/RELEASE.md deleted file mode 100644 index 115e49ab8ad3..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/RELEASE.md +++ /dev/null @@ -1,11 +0,0 @@ -# Release Process - -1. Create a PR "Preparing for release X.Y.Z" against master branch - * Alter CHANGELOG.md from ` (unreleased)` to ` (YYYY-MM-DD)` - * Update `JaegerClientVersion` in constants.go to `Go-X.Y.Z` -2. Create a release "Release X.Y.Z" on Github - * Create Tag `vX.Y.Z` - * Copy CHANGELOG.md into the release notes -3. Create a PR "Back to development" against master branch - * Add ` (unreleased)` to CHANGELOG.md - * Update `JaegerClientVersion` in constants.go to `Go-dev` diff --git a/vendor/github.com/uber/jaeger-client-go/baggage_setter.go b/vendor/github.com/uber/jaeger-client-go/baggage_setter.go deleted file mode 100644 index 1037ca0e861d..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/baggage_setter.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "github.com/opentracing/opentracing-go/log" - - "github.com/uber/jaeger-client-go/internal/baggage" -) - -// baggageSetter is an actor that can set a baggage value on a Span given certain -// restrictions (eg. maxValueLength). -type baggageSetter struct { - restrictionManager baggage.RestrictionManager - metrics *Metrics -} - -func newBaggageSetter(restrictionManager baggage.RestrictionManager, metrics *Metrics) *baggageSetter { - return &baggageSetter{ - restrictionManager: restrictionManager, - metrics: metrics, - } -} - -// (NB) span should hold the lock before making this call -func (s *baggageSetter) setBaggage(span *Span, key, value string) { - var truncated bool - var prevItem string - restriction := s.restrictionManager.GetRestriction(span.serviceName(), key) - if !restriction.KeyAllowed() { - s.logFields(span, key, value, prevItem, truncated, restriction.KeyAllowed()) - s.metrics.BaggageUpdateFailure.Inc(1) - return - } - if len(value) > restriction.MaxValueLength() { - truncated = true - value = value[:restriction.MaxValueLength()] - s.metrics.BaggageTruncate.Inc(1) - } - prevItem = span.context.baggage[key] - s.logFields(span, key, value, prevItem, truncated, restriction.KeyAllowed()) - span.context = span.context.WithBaggageItem(key, value) - s.metrics.BaggageUpdateSuccess.Inc(1) -} - -func (s *baggageSetter) logFields(span *Span, key, value, prevItem string, truncated, valid bool) { - if !span.context.IsSampled() { - return - } - fields := []log.Field{ - log.String("event", "baggage"), - log.String("key", key), - log.String("value", value), - } - if prevItem != "" { - fields = append(fields, log.String("override", "true")) - } - if truncated { - fields = append(fields, log.String("truncated", "true")) - } - if !valid { - fields = append(fields, log.String("invalid", "true")) - } - span.logFieldsNoLocking(fields...) -} diff --git a/vendor/github.com/uber/jaeger-client-go/config/config.go b/vendor/github.com/uber/jaeger-client-go/config/config.go deleted file mode 100644 index 1eb29677854e..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/config/config.go +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright (c) 2017-2018 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package config - -import ( - "errors" - "fmt" - "io" - "strings" - "time" - - "github.com/opentracing/opentracing-go" - - "github.com/uber/jaeger-client-go" - "github.com/uber/jaeger-client-go/internal/baggage/remote" - throttler "github.com/uber/jaeger-client-go/internal/throttler/remote" - "github.com/uber/jaeger-client-go/rpcmetrics" -) - -const defaultSamplingProbability = 0.001 - -// Configuration configures and creates Jaeger Tracer -type Configuration struct { - // ServiceName specifies the service name to use on the tracer. - // Can be provided via environment variable named JAEGER_SERVICE_NAME - ServiceName string `yaml:"serviceName"` - - // Disabled can be provided via environment variable named JAEGER_DISABLED - Disabled bool `yaml:"disabled"` - - // RPCMetrics can be provided via environment variable named JAEGER_RPC_METRICS - RPCMetrics bool `yaml:"rpc_metrics"` - - // Tags can be provided via environment variable named JAEGER_TAGS - Tags []opentracing.Tag `yaml:"tags"` - - Sampler *SamplerConfig `yaml:"sampler"` - Reporter *ReporterConfig `yaml:"reporter"` - Headers *jaeger.HeadersConfig `yaml:"headers"` - BaggageRestrictions *BaggageRestrictionsConfig `yaml:"baggage_restrictions"` - Throttler *ThrottlerConfig `yaml:"throttler"` -} - -// SamplerConfig allows initializing a non-default sampler. All fields are optional. -type SamplerConfig struct { - // Type specifies the type of the sampler: const, probabilistic, rateLimiting, or remote - // Can be set by exporting an environment variable named JAEGER_SAMPLER_TYPE - Type string `yaml:"type"` - - // Param is a value passed to the sampler. - // Valid values for Param field are: - // - for "const" sampler, 0 or 1 for always false/true respectively - // - for "probabilistic" sampler, a probability between 0 and 1 - // - for "rateLimiting" sampler, the number of spans per second - // - for "remote" sampler, param is the same as for "probabilistic" - // and indicates the initial sampling rate before the actual one - // is received from the mothership. - // Can be set by exporting an environment variable named JAEGER_SAMPLER_PARAM - Param float64 `yaml:"param"` - - // SamplingServerURL is the address of jaeger-agent's HTTP sampling server - // Can be set by exporting an environment variable named JAEGER_SAMPLER_MANAGER_HOST_PORT - SamplingServerURL string `yaml:"samplingServerURL"` - - // MaxOperations is the maximum number of operations that the sampler - // will keep track of. If an operation is not tracked, a default probabilistic - // sampler will be used rather than the per operation specific sampler. - // Can be set by exporting an environment variable named JAEGER_SAMPLER_MAX_OPERATIONS - MaxOperations int `yaml:"maxOperations"` - - // SamplingRefreshInterval controls how often the remotely controlled sampler will poll - // jaeger-agent for the appropriate sampling strategy. - // Can be set by exporting an environment variable named JAEGER_SAMPLER_REFRESH_INTERVAL - SamplingRefreshInterval time.Duration `yaml:"samplingRefreshInterval"` -} - -// ReporterConfig configures the reporter. All fields are optional. -type ReporterConfig struct { - // QueueSize controls how many spans the reporter can keep in memory before it starts dropping - // new spans. The queue is continuously drained by a background go-routine, as fast as spans - // can be sent out of process. - // Can be set by exporting an environment variable named JAEGER_REPORTER_MAX_QUEUE_SIZE - QueueSize int `yaml:"queueSize"` - - // BufferFlushInterval controls how often the buffer is force-flushed, even if it's not full. - // It is generally not useful, as it only matters for very low traffic services. - // Can be set by exporting an environment variable named JAEGER_REPORTER_FLUSH_INTERVAL - BufferFlushInterval time.Duration - - // LogSpans, when true, enables LoggingReporter that runs in parallel with the main reporter - // and logs all submitted spans. Main Configuration.Logger must be initialized in the code - // for this option to have any effect. - // Can be set by exporting an environment variable named JAEGER_REPORTER_LOG_SPANS - LogSpans bool `yaml:"logSpans"` - - // LocalAgentHostPort instructs reporter to send spans to jaeger-agent at this address - // Can be set by exporting an environment variable named JAEGER_AGENT_HOST / JAEGER_AGENT_PORT - LocalAgentHostPort string `yaml:"localAgentHostPort"` -} - -// BaggageRestrictionsConfig configures the baggage restrictions manager which can be used to whitelist -// certain baggage keys. All fields are optional. -type BaggageRestrictionsConfig struct { - // DenyBaggageOnInitializationFailure controls the startup failure mode of the baggage restriction - // manager. If true, the manager will not allow any baggage to be written until baggage restrictions have - // been retrieved from jaeger-agent. If false, the manager wil allow any baggage to be written until baggage - // restrictions have been retrieved from jaeger-agent. - DenyBaggageOnInitializationFailure bool `yaml:"denyBaggageOnInitializationFailure"` - - // HostPort is the hostPort of jaeger-agent's baggage restrictions server - HostPort string `yaml:"hostPort"` - - // RefreshInterval controls how often the baggage restriction manager will poll - // jaeger-agent for the most recent baggage restrictions. - RefreshInterval time.Duration `yaml:"refreshInterval"` -} - -// ThrottlerConfig configures the throttler which can be used to throttle the -// rate at which the client may send debug requests. -type ThrottlerConfig struct { - // HostPort of jaeger-agent's credit server. - HostPort string `yaml:"hostPort"` - - // RefreshInterval controls how often the throttler will poll jaeger-agent - // for more throttling credits. - RefreshInterval time.Duration `yaml:"refreshInterval"` - - // SynchronousInitialization determines whether or not the throttler should - // synchronously fetch credits from the agent when an operation is seen for - // the first time. This should be set to true if the client will be used by - // a short lived service that needs to ensure that credits are fetched - // upfront such that sampling or throttling occurs. - SynchronousInitialization bool `yaml:"synchronousInitialization"` -} - -type nullCloser struct{} - -func (*nullCloser) Close() error { return nil } - -// New creates a new Jaeger Tracer, and a closer func that can be used to flush buffers -// before shutdown. -// -// Deprecated: use NewTracer() function -func (c Configuration) New( - serviceName string, - options ...Option, -) (opentracing.Tracer, io.Closer, error) { - if serviceName != "" { - c.ServiceName = serviceName - } - - return c.NewTracer(options...) -} - -// NewTracer returns a new tracer based on the current configuration, using the given options, -// and a closer func that can be used to flush buffers before shutdown. -func (c Configuration) NewTracer(options ...Option) (opentracing.Tracer, io.Closer, error) { - if c.ServiceName == "" { - return nil, nil, errors.New("no service name provided") - } - - if c.Disabled { - return &opentracing.NoopTracer{}, &nullCloser{}, nil - } - opts := applyOptions(options...) - tracerMetrics := jaeger.NewMetrics(opts.metrics, nil) - if c.RPCMetrics { - Observer( - rpcmetrics.NewObserver( - opts.metrics.Namespace("jaeger-rpc", map[string]string{"component": "jaeger"}), - rpcmetrics.DefaultNameNormalizer, - ), - )(&opts) // adds to c.observers - } - if c.Sampler == nil { - c.Sampler = &SamplerConfig{ - Type: jaeger.SamplerTypeRemote, - Param: defaultSamplingProbability, - } - } - if c.Reporter == nil { - c.Reporter = &ReporterConfig{} - } - - sampler := opts.sampler - if sampler == nil { - s, err := c.Sampler.NewSampler(c.ServiceName, tracerMetrics) - if err != nil { - return nil, nil, err - } - sampler = s - } - - reporter := opts.reporter - if reporter == nil { - r, err := c.Reporter.NewReporter(c.ServiceName, tracerMetrics, opts.logger) - if err != nil { - return nil, nil, err - } - reporter = r - } - - tracerOptions := []jaeger.TracerOption{ - jaeger.TracerOptions.Metrics(tracerMetrics), - jaeger.TracerOptions.Logger(opts.logger), - jaeger.TracerOptions.CustomHeaderKeys(c.Headers), - jaeger.TracerOptions.Gen128Bit(opts.gen128Bit), - jaeger.TracerOptions.ZipkinSharedRPCSpan(opts.zipkinSharedRPCSpan), - jaeger.TracerOptions.MaxTagValueLength(opts.maxTagValueLength), - } - - for _, tag := range opts.tags { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Tag(tag.Key, tag.Value)) - } - - for _, tag := range c.Tags { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Tag(tag.Key, tag.Value)) - } - - for _, obs := range opts.observers { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Observer(obs)) - } - - for _, cobs := range opts.contribObservers { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.ContribObserver(cobs)) - } - - for format, injector := range opts.injectors { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Injector(format, injector)) - } - - for format, extractor := range opts.extractors { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Extractor(format, extractor)) - } - - if c.BaggageRestrictions != nil { - mgr := remote.NewRestrictionManager( - c.ServiceName, - remote.Options.Metrics(tracerMetrics), - remote.Options.Logger(opts.logger), - remote.Options.HostPort(c.BaggageRestrictions.HostPort), - remote.Options.RefreshInterval(c.BaggageRestrictions.RefreshInterval), - remote.Options.DenyBaggageOnInitializationFailure( - c.BaggageRestrictions.DenyBaggageOnInitializationFailure, - ), - ) - tracerOptions = append(tracerOptions, jaeger.TracerOptions.BaggageRestrictionManager(mgr)) - } - - if c.Throttler != nil { - debugThrottler := throttler.NewThrottler( - c.ServiceName, - throttler.Options.Metrics(tracerMetrics), - throttler.Options.Logger(opts.logger), - throttler.Options.HostPort(c.Throttler.HostPort), - throttler.Options.RefreshInterval(c.Throttler.RefreshInterval), - throttler.Options.SynchronousInitialization( - c.Throttler.SynchronousInitialization, - ), - ) - - tracerOptions = append(tracerOptions, jaeger.TracerOptions.DebugThrottler(debugThrottler)) - } - - tracer, closer := jaeger.NewTracer( - c.ServiceName, - sampler, - reporter, - tracerOptions..., - ) - - return tracer, closer, nil -} - -// InitGlobalTracer creates a new Jaeger Tracer, and sets it as global OpenTracing Tracer. -// It returns a closer func that can be used to flush buffers before shutdown. -func (c Configuration) InitGlobalTracer( - serviceName string, - options ...Option, -) (io.Closer, error) { - if c.Disabled { - return &nullCloser{}, nil - } - tracer, closer, err := c.New(serviceName, options...) - if err != nil { - return nil, err - } - opentracing.SetGlobalTracer(tracer) - return closer, nil -} - -// NewSampler creates a new sampler based on the configuration -func (sc *SamplerConfig) NewSampler( - serviceName string, - metrics *jaeger.Metrics, -) (jaeger.Sampler, error) { - samplerType := strings.ToLower(sc.Type) - if samplerType == jaeger.SamplerTypeConst { - return jaeger.NewConstSampler(sc.Param != 0), nil - } - if samplerType == jaeger.SamplerTypeProbabilistic { - if sc.Param >= 0 && sc.Param <= 1.0 { - return jaeger.NewProbabilisticSampler(sc.Param) - } - return nil, fmt.Errorf( - "Invalid Param for probabilistic sampler: %v. Expecting value between 0 and 1", - sc.Param, - ) - } - if samplerType == jaeger.SamplerTypeRateLimiting { - return jaeger.NewRateLimitingSampler(sc.Param), nil - } - if samplerType == jaeger.SamplerTypeRemote || sc.Type == "" { - sc2 := *sc - sc2.Type = jaeger.SamplerTypeProbabilistic - initSampler, err := sc2.NewSampler(serviceName, nil) - if err != nil { - return nil, err - } - options := []jaeger.SamplerOption{ - jaeger.SamplerOptions.Metrics(metrics), - jaeger.SamplerOptions.InitialSampler(initSampler), - jaeger.SamplerOptions.SamplingServerURL(sc.SamplingServerURL), - } - if sc.MaxOperations != 0 { - options = append(options, jaeger.SamplerOptions.MaxOperations(sc.MaxOperations)) - } - if sc.SamplingRefreshInterval != 0 { - options = append(options, jaeger.SamplerOptions.SamplingRefreshInterval(sc.SamplingRefreshInterval)) - } - return jaeger.NewRemotelyControlledSampler(serviceName, options...), nil - } - return nil, fmt.Errorf("Unknown sampler type %v", sc.Type) -} - -// NewReporter instantiates a new reporter that submits spans to tcollector -func (rc *ReporterConfig) NewReporter( - serviceName string, - metrics *jaeger.Metrics, - logger jaeger.Logger, -) (jaeger.Reporter, error) { - sender, err := rc.newTransport() - if err != nil { - return nil, err - } - reporter := jaeger.NewRemoteReporter( - sender, - jaeger.ReporterOptions.QueueSize(rc.QueueSize), - jaeger.ReporterOptions.BufferFlushInterval(rc.BufferFlushInterval), - jaeger.ReporterOptions.Logger(logger), - jaeger.ReporterOptions.Metrics(metrics)) - if rc.LogSpans && logger != nil { - logger.Infof("Initializing logging reporter\n") - reporter = jaeger.NewCompositeReporter(jaeger.NewLoggingReporter(logger), reporter) - } - return reporter, err -} - -func (rc *ReporterConfig) newTransport() (jaeger.Transport, error) { - return jaeger.NewUDPTransport(rc.LocalAgentHostPort, 0) -} diff --git a/vendor/github.com/uber/jaeger-client-go/config/config_env.go b/vendor/github.com/uber/jaeger-client-go/config/config_env.go deleted file mode 100644 index 96f170c539d9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/config/config_env.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright (c) 2018 The Jaeger Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package config - -import ( - "fmt" - "os" - "strconv" - "strings" - "time" - - opentracing "github.com/opentracing/opentracing-go" - "github.com/pkg/errors" - - "github.com/uber/jaeger-client-go" -) - -const ( - // environment variable names - envServiceName = "JAEGER_SERVICE_NAME" - envDisabled = "JAEGER_DISABLED" - envRPCMetrics = "JAEGER_RPC_METRICS" - envTags = "JAEGER_TAGS" - envSamplerType = "JAEGER_SAMPLER_TYPE" - envSamplerParam = "JAEGER_SAMPLER_PARAM" - envSamplerManagerHostPort = "JAEGER_SAMPLER_MANAGER_HOST_PORT" - envSamplerMaxOperations = "JAEGER_SAMPLER_MAX_OPERATIONS" - envSamplerRefreshInterval = "JAEGER_SAMPLER_REFRESH_INTERVAL" - envReporterMaxQueueSize = "JAEGER_REPORTER_MAX_QUEUE_SIZE" - envReporterFlushInterval = "JAEGER_REPORTER_FLUSH_INTERVAL" - envReporterLogSpans = "JAEGER_REPORTER_LOG_SPANS" - envAgentHost = "JAEGER_AGENT_HOST" - envAgentPort = "JAEGER_AGENT_PORT" -) - -// FromEnv uses environment variables to set the tracer's Configuration -func FromEnv() (*Configuration, error) { - c := &Configuration{} - - if e := os.Getenv(envServiceName); e != "" { - c.ServiceName = e - } - - if e := os.Getenv(envRPCMetrics); e != "" { - if value, err := strconv.ParseBool(e); err == nil { - c.RPCMetrics = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envRPCMetrics, e) - } - } - - if e := os.Getenv(envDisabled); e != "" { - if value, err := strconv.ParseBool(e); err == nil { - c.Disabled = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envDisabled, e) - } - } - - if e := os.Getenv(envTags); e != "" { - c.Tags = parseTags(e) - } - - if s, err := samplerConfigFromEnv(); err == nil { - c.Sampler = s - } else { - return nil, errors.Wrap(err, "cannot obtain sampler config from env") - } - - if r, err := reporterConfigFromEnv(); err == nil { - c.Reporter = r - } else { - return nil, errors.Wrap(err, "cannot obtain reporter config from env") - } - - return c, nil -} - -// samplerConfigFromEnv creates a new SamplerConfig based on the environment variables -func samplerConfigFromEnv() (*SamplerConfig, error) { - sc := &SamplerConfig{} - - if e := os.Getenv(envSamplerType); e != "" { - sc.Type = e - } - - if e := os.Getenv(envSamplerParam); e != "" { - if value, err := strconv.ParseFloat(e, 64); err == nil { - sc.Param = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envSamplerParam, e) - } - } - - if e := os.Getenv(envSamplerManagerHostPort); e != "" { - sc.SamplingServerURL = e - } - - if e := os.Getenv(envSamplerMaxOperations); e != "" { - if value, err := strconv.ParseInt(e, 10, 0); err == nil { - sc.MaxOperations = int(value) - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envSamplerMaxOperations, e) - } - } - - if e := os.Getenv(envSamplerRefreshInterval); e != "" { - if value, err := time.ParseDuration(e); err == nil { - sc.SamplingRefreshInterval = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envSamplerRefreshInterval, e) - } - } - - return sc, nil -} - -// reporterConfigFromEnv creates a new ReporterConfig based on the environment variables -func reporterConfigFromEnv() (*ReporterConfig, error) { - rc := &ReporterConfig{} - - if e := os.Getenv(envReporterMaxQueueSize); e != "" { - if value, err := strconv.ParseInt(e, 10, 0); err == nil { - rc.QueueSize = int(value) - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterMaxQueueSize, e) - } - } - - if e := os.Getenv(envReporterFlushInterval); e != "" { - if value, err := time.ParseDuration(e); err == nil { - rc.BufferFlushInterval = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterFlushInterval, e) - } - } - - if e := os.Getenv(envReporterLogSpans); e != "" { - if value, err := strconv.ParseBool(e); err == nil { - rc.LogSpans = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterLogSpans, e) - } - } - - host := jaeger.DefaultUDPSpanServerHost - if e := os.Getenv(envAgentHost); e != "" { - host = e - } - - port := jaeger.DefaultUDPSpanServerPort - if e := os.Getenv(envAgentPort); e != "" { - if value, err := strconv.ParseInt(e, 10, 0); err == nil { - port = int(value) - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envAgentPort, e) - } - } - - // the side effect of this is that we are building the default value, even if none of the env vars - // were not explicitly passed - rc.LocalAgentHostPort = fmt.Sprintf("%s:%d", host, port) - - return rc, nil -} - -// parseTags parses the given string into a collection of Tags. -// Spec for this value: -// - comma separated list of key=value -// - value can be specified using the notation ${envVar:defaultValue}, where `envVar` -// is an environment variable and `defaultValue` is the value to use in case the env var is not set -func parseTags(sTags string) []opentracing.Tag { - pairs := strings.Split(sTags, ",") - tags := make([]opentracing.Tag, 0) - for _, p := range pairs { - kv := strings.SplitN(p, "=", 2) - k, v := strings.TrimSpace(kv[0]), strings.TrimSpace(kv[1]) - - if strings.HasPrefix(v, "${") && strings.HasSuffix(v, "}") { - ed := strings.SplitN(v[2:len(v)-1], ":", 2) - e, d := ed[0], ed[1] - v = os.Getenv(e) - if v == "" && d != "" { - v = d - } - } - - tag := opentracing.Tag{Key: k, Value: v} - tags = append(tags, tag) - } - - return tags -} diff --git a/vendor/github.com/uber/jaeger-client-go/config/options.go b/vendor/github.com/uber/jaeger-client-go/config/options.go deleted file mode 100644 index d14f1f8a9b2b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/config/options.go +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package config - -import ( - opentracing "github.com/opentracing/opentracing-go" - "github.com/uber/jaeger-lib/metrics" - - "github.com/uber/jaeger-client-go" -) - -// Option is a function that sets some option on the client. -type Option func(c *Options) - -// Options control behavior of the client. -type Options struct { - metrics metrics.Factory - logger jaeger.Logger - reporter jaeger.Reporter - sampler jaeger.Sampler - contribObservers []jaeger.ContribObserver - observers []jaeger.Observer - gen128Bit bool - zipkinSharedRPCSpan bool - maxTagValueLength int - tags []opentracing.Tag - injectors map[interface{}]jaeger.Injector - extractors map[interface{}]jaeger.Extractor -} - -// Metrics creates an Option that initializes Metrics in the tracer, -// which is used to emit statistics about spans. -func Metrics(factory metrics.Factory) Option { - return func(c *Options) { - c.metrics = factory - } -} - -// Logger can be provided to log Reporter errors, as well as to log spans -// if Reporter.LogSpans is set to true. -func Logger(logger jaeger.Logger) Option { - return func(c *Options) { - c.logger = logger - } -} - -// Reporter can be provided explicitly to override the configuration. -// Useful for testing, e.g. by passing InMemoryReporter. -func Reporter(reporter jaeger.Reporter) Option { - return func(c *Options) { - c.reporter = reporter - } -} - -// Sampler can be provided explicitly to override the configuration. -func Sampler(sampler jaeger.Sampler) Option { - return func(c *Options) { - c.sampler = sampler - } -} - -// Observer can be registered with the Tracer to receive notifications about new Spans. -func Observer(observer jaeger.Observer) Option { - return func(c *Options) { - c.observers = append(c.observers, observer) - } -} - -// ContribObserver can be registered with the Tracer to recieve notifications -// about new spans. -func ContribObserver(observer jaeger.ContribObserver) Option { - return func(c *Options) { - c.contribObservers = append(c.contribObservers, observer) - } -} - -// Gen128Bit specifies whether to generate 128bit trace IDs. -func Gen128Bit(gen128Bit bool) Option { - return func(c *Options) { - c.gen128Bit = gen128Bit - } -} - -// ZipkinSharedRPCSpan creates an option that enables sharing span ID between client -// and server spans a la zipkin. If false, client and server spans will be assigned -// different IDs. -func ZipkinSharedRPCSpan(zipkinSharedRPCSpan bool) Option { - return func(c *Options) { - c.zipkinSharedRPCSpan = zipkinSharedRPCSpan - } -} - -// MaxTagValueLength can be provided to override the default max tag value length. -func MaxTagValueLength(maxTagValueLength int) Option { - return func(c *Options) { - c.maxTagValueLength = maxTagValueLength - } -} - -// Tag creates an option that adds a tracer-level tag. -func Tag(key string, value interface{}) Option { - return func(c *Options) { - c.tags = append(c.tags, opentracing.Tag{Key: key, Value: value}) - } -} - -// Injector registers an Injector with the given format. -func Injector(format interface{}, injector jaeger.Injector) Option { - return func(c *Options) { - c.injectors[format] = injector - } -} - -// Extractor registers an Extractor with the given format. -func Extractor(format interface{}, extractor jaeger.Extractor) Option { - return func(c *Options) { - c.extractors[format] = extractor - } -} - -func applyOptions(options ...Option) Options { - opts := Options{ - injectors: make(map[interface{}]jaeger.Injector), - extractors: make(map[interface{}]jaeger.Extractor), - } - for _, option := range options { - option(&opts) - } - if opts.metrics == nil { - opts.metrics = metrics.NullFactory - } - if opts.logger == nil { - opts.logger = jaeger.NullLogger - } - return opts -} diff --git a/vendor/github.com/uber/jaeger-client-go/constants.go b/vendor/github.com/uber/jaeger-client-go/constants.go deleted file mode 100644 index b5368ff3815b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/constants.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -const ( - // JaegerClientVersion is the version of the client library reported as Span tag. - JaegerClientVersion = "Go-2.15.0-dev" - - // JaegerClientVersionTagKey is the name of the tag used to report client version. - JaegerClientVersionTagKey = "jaeger.version" - - // JaegerDebugHeader is the name of HTTP header or a TextMap carrier key which, - // if found in the carrier, forces the trace to be sampled as "debug" trace. - // The value of the header is recorded as the tag on the root span, so that the - // trace can be found in the UI using this value as a correlation ID. - JaegerDebugHeader = "jaeger-debug-id" - - // JaegerBaggageHeader is the name of the HTTP header that is used to submit baggage. - // It differs from TraceBaggageHeaderPrefix in that it can be used only in cases where - // a root span does not exist. - JaegerBaggageHeader = "jaeger-baggage" - - // TracerHostnameTagKey used to report host name of the process. - TracerHostnameTagKey = "hostname" - - // TracerIPTagKey used to report ip of the process. - TracerIPTagKey = "ip" - - // TracerUUIDTagKey used to report UUID of the client process. - TracerUUIDTagKey = "client-uuid" - - // SamplerTypeTagKey reports which sampler was used on the root span. - SamplerTypeTagKey = "sampler.type" - - // SamplerParamTagKey reports the parameter of the sampler, like sampling probability. - SamplerParamTagKey = "sampler.param" - - // TraceContextHeaderName is the http header name used to propagate tracing context. - // This must be in lower-case to avoid mismatches when decoding incoming headers. - TraceContextHeaderName = "uber-trace-id" - - // TracerStateHeaderName is deprecated. - // Deprecated: use TraceContextHeaderName - TracerStateHeaderName = TraceContextHeaderName - - // TraceBaggageHeaderPrefix is the prefix for http headers used to propagate baggage. - // This must be in lower-case to avoid mismatches when decoding incoming headers. - TraceBaggageHeaderPrefix = "uberctx-" - - // SamplerTypeConst is the type of sampler that always makes the same decision. - SamplerTypeConst = "const" - - // SamplerTypeRemote is the type of sampler that polls Jaeger agent for sampling strategy. - SamplerTypeRemote = "remote" - - // SamplerTypeProbabilistic is the type of sampler that samples traces - // with a certain fixed probability. - SamplerTypeProbabilistic = "probabilistic" - - // SamplerTypeRateLimiting is the type of sampler that samples - // only up to a fixed number of traces per second. - SamplerTypeRateLimiting = "ratelimiting" - - // SamplerTypeLowerBound is the type of sampler that samples - // at least a fixed number of traces per second. - SamplerTypeLowerBound = "lowerbound" - - // DefaultUDPSpanServerHost is the default host to send the spans to, via UDP - DefaultUDPSpanServerHost = "localhost" - - // DefaultUDPSpanServerPort is the default port to send the spans to, via UDP - DefaultUDPSpanServerPort = 6831 - - // DefaultMaxTagValueLength is the default max length of byte array or string allowed in the tag value. - DefaultMaxTagValueLength = 256 -) diff --git a/vendor/github.com/uber/jaeger-client-go/context.go b/vendor/github.com/uber/jaeger-client-go/context.go deleted file mode 100644 index 8b06173d9835..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/context.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "errors" - "fmt" - "strconv" - "strings" -) - -const ( - flagSampled = byte(1) - flagDebug = byte(2) -) - -var ( - errEmptyTracerStateString = errors.New("Cannot convert empty string to tracer state") - errMalformedTracerStateString = errors.New("String does not match tracer state format") - - emptyContext = SpanContext{} -) - -// TraceID represents unique 128bit identifier of a trace -type TraceID struct { - High, Low uint64 -} - -// SpanID represents unique 64bit identifier of a span -type SpanID uint64 - -// SpanContext represents propagated span identity and state -type SpanContext struct { - // traceID represents globally unique ID of the trace. - // Usually generated as a random number. - traceID TraceID - - // spanID represents span ID that must be unique within its trace, - // but does not have to be globally unique. - spanID SpanID - - // parentID refers to the ID of the parent span. - // Should be 0 if the current span is a root span. - parentID SpanID - - // flags is a bitmap containing such bits as 'sampled' and 'debug'. - flags byte - - // Distributed Context baggage. The is a snapshot in time. - baggage map[string]string - - // debugID can be set to some correlation ID when the context is being - // extracted from a TextMap carrier. - // - // See JaegerDebugHeader in constants.go - debugID string -} - -// ForeachBaggageItem implements ForeachBaggageItem() of opentracing.SpanContext -func (c SpanContext) ForeachBaggageItem(handler func(k, v string) bool) { - for k, v := range c.baggage { - if !handler(k, v) { - break - } - } -} - -// IsSampled returns whether this trace was chosen for permanent storage -// by the sampling mechanism of the tracer. -func (c SpanContext) IsSampled() bool { - return (c.flags & flagSampled) == flagSampled -} - -// IsDebug indicates whether sampling was explicitly requested by the service. -func (c SpanContext) IsDebug() bool { - return (c.flags & flagDebug) == flagDebug -} - -// IsValid indicates whether this context actually represents a valid trace. -func (c SpanContext) IsValid() bool { - return c.traceID.IsValid() && c.spanID != 0 -} - -func (c SpanContext) String() string { - if c.traceID.High == 0 { - return fmt.Sprintf("%x:%x:%x:%x", c.traceID.Low, uint64(c.spanID), uint64(c.parentID), c.flags) - } - return fmt.Sprintf("%x%016x:%x:%x:%x", c.traceID.High, c.traceID.Low, uint64(c.spanID), uint64(c.parentID), c.flags) -} - -// ContextFromString reconstructs the Context encoded in a string -func ContextFromString(value string) (SpanContext, error) { - var context SpanContext - if value == "" { - return emptyContext, errEmptyTracerStateString - } - parts := strings.Split(value, ":") - if len(parts) != 4 { - return emptyContext, errMalformedTracerStateString - } - var err error - if context.traceID, err = TraceIDFromString(parts[0]); err != nil { - return emptyContext, err - } - if context.spanID, err = SpanIDFromString(parts[1]); err != nil { - return emptyContext, err - } - if context.parentID, err = SpanIDFromString(parts[2]); err != nil { - return emptyContext, err - } - flags, err := strconv.ParseUint(parts[3], 10, 8) - if err != nil { - return emptyContext, err - } - context.flags = byte(flags) - return context, nil -} - -// TraceID returns the trace ID of this span context -func (c SpanContext) TraceID() TraceID { - return c.traceID -} - -// SpanID returns the span ID of this span context -func (c SpanContext) SpanID() SpanID { - return c.spanID -} - -// ParentID returns the parent span ID of this span context -func (c SpanContext) ParentID() SpanID { - return c.parentID -} - -// NewSpanContext creates a new instance of SpanContext -func NewSpanContext(traceID TraceID, spanID, parentID SpanID, sampled bool, baggage map[string]string) SpanContext { - flags := byte(0) - if sampled { - flags = flagSampled - } - return SpanContext{ - traceID: traceID, - spanID: spanID, - parentID: parentID, - flags: flags, - baggage: baggage} -} - -// CopyFrom copies data from ctx into this context, including span identity and baggage. -// TODO This is only used by interop.go. Remove once TChannel Go supports OpenTracing. -func (c *SpanContext) CopyFrom(ctx *SpanContext) { - c.traceID = ctx.traceID - c.spanID = ctx.spanID - c.parentID = ctx.parentID - c.flags = ctx.flags - if l := len(ctx.baggage); l > 0 { - c.baggage = make(map[string]string, l) - for k, v := range ctx.baggage { - c.baggage[k] = v - } - } else { - c.baggage = nil - } -} - -// WithBaggageItem creates a new context with an extra baggage item. -func (c SpanContext) WithBaggageItem(key, value string) SpanContext { - var newBaggage map[string]string - if c.baggage == nil { - newBaggage = map[string]string{key: value} - } else { - newBaggage = make(map[string]string, len(c.baggage)+1) - for k, v := range c.baggage { - newBaggage[k] = v - } - newBaggage[key] = value - } - // Use positional parameters so the compiler will help catch new fields. - return SpanContext{c.traceID, c.spanID, c.parentID, c.flags, newBaggage, ""} -} - -// isDebugIDContainerOnly returns true when the instance of the context is only -// used to return the debug/correlation ID from extract() method. This happens -// in the situation when "jaeger-debug-id" header is passed in the carrier to -// the extract() method, but the request otherwise has no span context in it. -// Previously this would've returned opentracing.ErrSpanContextNotFound from the -// extract method, but now it returns a dummy context with only debugID filled in. -// -// See JaegerDebugHeader in constants.go -// See textMapPropagator#Extract -func (c *SpanContext) isDebugIDContainerOnly() bool { - return !c.traceID.IsValid() && c.debugID != "" -} - -// ------- TraceID ------- - -func (t TraceID) String() string { - if t.High == 0 { - return fmt.Sprintf("%x", t.Low) - } - return fmt.Sprintf("%x%016x", t.High, t.Low) -} - -// TraceIDFromString creates a TraceID from a hexadecimal string -func TraceIDFromString(s string) (TraceID, error) { - var hi, lo uint64 - var err error - if len(s) > 32 { - return TraceID{}, fmt.Errorf("TraceID cannot be longer than 32 hex characters: %s", s) - } else if len(s) > 16 { - hiLen := len(s) - 16 - if hi, err = strconv.ParseUint(s[0:hiLen], 16, 64); err != nil { - return TraceID{}, err - } - if lo, err = strconv.ParseUint(s[hiLen:], 16, 64); err != nil { - return TraceID{}, err - } - } else { - if lo, err = strconv.ParseUint(s, 16, 64); err != nil { - return TraceID{}, err - } - } - return TraceID{High: hi, Low: lo}, nil -} - -// IsValid checks if the trace ID is valid, i.e. not zero. -func (t TraceID) IsValid() bool { - return t.High != 0 || t.Low != 0 -} - -// ------- SpanID ------- - -func (s SpanID) String() string { - return fmt.Sprintf("%x", uint64(s)) -} - -// SpanIDFromString creates a SpanID from a hexadecimal string -func SpanIDFromString(s string) (SpanID, error) { - if len(s) > 16 { - return SpanID(0), fmt.Errorf("SpanID cannot be longer than 16 hex characters: %s", s) - } - id, err := strconv.ParseUint(s, 16, 64) - if err != nil { - return SpanID(0), err - } - return SpanID(id), nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/contrib_observer.go b/vendor/github.com/uber/jaeger-client-go/contrib_observer.go deleted file mode 100644 index 4ce1881f3b83..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/contrib_observer.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - opentracing "github.com/opentracing/opentracing-go" -) - -// ContribObserver can be registered with the Tracer to receive notifications -// about new Spans. Modelled after github.com/opentracing-contrib/go-observer. -type ContribObserver interface { - // Create and return a span observer. Called when a span starts. - // If the Observer is not interested in the given span, it must return (nil, false). - // E.g : - // func StartSpan(opName string, opts ...opentracing.StartSpanOption) { - // var sp opentracing.Span - // sso := opentracing.StartSpanOptions{} - // if spanObserver, ok := Observer.OnStartSpan(span, opName, sso); ok { - // // we have a valid SpanObserver - // } - // ... - // } - OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) (ContribSpanObserver, bool) -} - -// ContribSpanObserver is created by the Observer and receives notifications -// about other Span events. This interface is meant to match -// github.com/opentracing-contrib/go-observer, via duck typing, without -// directly importing the go-observer package. -type ContribSpanObserver interface { - OnSetOperationName(operationName string) - OnSetTag(key string, value interface{}) - OnFinish(options opentracing.FinishOptions) -} - -// wrapper observer for the old observers (see observer.go) -type oldObserver struct { - obs Observer -} - -func (o *oldObserver) OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) (ContribSpanObserver, bool) { - spanObserver := o.obs.OnStartSpan(operationName, options) - return spanObserver, spanObserver != nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/doc.go b/vendor/github.com/uber/jaeger-client-go/doc.go deleted file mode 100644 index 4f5549033d5d..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/doc.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* -Package jaeger implements an OpenTracing (http://opentracing.io) Tracer. -It is currently using Zipkin-compatible data model and can be directly -itegrated with Zipkin backend (http://zipkin.io). - -For integration instructions please refer to the README: - -https://github.com/uber/jaeger-client-go/blob/master/README.md -*/ -package jaeger diff --git a/vendor/github.com/uber/jaeger-client-go/glide.lock b/vendor/github.com/uber/jaeger-client-go/glide.lock deleted file mode 100644 index d76b1536171f..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/glide.lock +++ /dev/null @@ -1,89 +0,0 @@ -hash: 3accf84f97bff4a91162736104c0e9b9790820712bd86db6fec5e665f7196a82 -updated: 2018-04-30T11:46:43.804556-04:00 -imports: -- name: github.com/beorn7/perks - version: 3a771d992973f24aa725d07868b467d1ddfceafb - subpackages: - - quantile -- name: github.com/codahale/hdrhistogram - version: 3a0bb77429bd3a61596f5e8a3172445844342120 -- name: github.com/crossdock/crossdock-go - version: 049aabb0122b03bc9bd30cab8f3f91fb60166361 - subpackages: - - assert - - require -- name: github.com/davecgh/go-spew - version: 8991bc29aa16c548c550c7ff78260e27b9ab7c73 - subpackages: - - spew -- name: github.com/golang/protobuf - version: bbd03ef6da3a115852eaf24c8a1c46aeb39aa175 - subpackages: - - proto -- name: github.com/matttproud/golang_protobuf_extensions - version: c12348ce28de40eed0136aa2b644d0ee0650e56c - subpackages: - - pbutil -- name: github.com/opentracing/opentracing-go - version: 1949ddbfd147afd4d964a9f00b24eb291e0e7c38 - subpackages: - - ext - - log -- name: github.com/pkg/errors - version: 645ef00459ed84a119197bfb8d8205042c6df63d -- name: github.com/pmezard/go-difflib - version: 792786c7400a136282c1664665ae0a8db921c6c2 - subpackages: - - difflib -- name: github.com/prometheus/client_golang - version: c5b7fccd204277076155f10851dad72b76a49317 - subpackages: - - prometheus -- name: github.com/prometheus/client_model - version: 99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c - subpackages: - - go -- name: github.com/prometheus/common - version: 38c53a9f4bfcd932d1b00bfc65e256a7fba6b37a - subpackages: - - expfmt - - internal/bitbucket.org/ww/goautoneg - - model -- name: github.com/prometheus/procfs - version: 780932d4fbbe0e69b84c34c20f5c8d0981e109ea - subpackages: - - internal/util - - nfs - - xfs -- name: github.com/stretchr/testify - version: 12b6f73e6084dad08a7c6e575284b177ecafbc71 - subpackages: - - assert - - require - - suite -- name: github.com/uber/jaeger-lib - version: 4267858c0679cd4e47cefed8d7f70fd386cfb567 - subpackages: - - metrics - - metrics/prometheus - - metrics/testutils -- name: go.uber.org/atomic - version: 8474b86a5a6f79c443ce4b2992817ff32cf208b8 -- name: go.uber.org/multierr - version: 3c4937480c32f4c13a875a1829af76c98ca3d40a -- name: go.uber.org/zap - version: eeedf312bc6c57391d84767a4cd413f02a917974 - subpackages: - - buffer - - internal/bufferpool - - internal/color - - internal/exit - - zapcore -- name: golang.org/x/net - version: 6078986fec03a1dcc236c34816c71b0e05018fda - subpackages: - - context - - context/ctxhttp -testImports: -- name: github.com/uber-go/atomic - version: 8474b86a5a6f79c443ce4b2992817ff32cf208b8 diff --git a/vendor/github.com/uber/jaeger-client-go/glide.yaml b/vendor/github.com/uber/jaeger-client-go/glide.yaml deleted file mode 100644 index 6637da215264..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/glide.yaml +++ /dev/null @@ -1,22 +0,0 @@ -package: github.com/uber/jaeger-client-go -import: -- package: github.com/opentracing/opentracing-go - version: ^1 - subpackages: - - ext - - log -- package: github.com/crossdock/crossdock-go -- package: github.com/uber/jaeger-lib - version: ^1.2.1 - subpackages: - - metrics -- package: github.com/pkg/errors - version: ~0.8.0 -testImport: -- package: github.com/stretchr/testify - subpackages: - - assert - - require - - suite -- package: github.com/prometheus/client_golang - version: v0.8.0 diff --git a/vendor/github.com/uber/jaeger-client-go/header.go b/vendor/github.com/uber/jaeger-client-go/header.go deleted file mode 100644 index 19c2c055b813..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/header.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -// HeadersConfig contains the values for the header keys that Jaeger will use. -// These values may be either custom or default depending on whether custom -// values were provided via a configuration. -type HeadersConfig struct { - // JaegerDebugHeader is the name of HTTP header or a TextMap carrier key which, - // if found in the carrier, forces the trace to be sampled as "debug" trace. - // The value of the header is recorded as the tag on the root span, so that the - // trace can be found in the UI using this value as a correlation ID. - JaegerDebugHeader string `yaml:"jaegerDebugHeader"` - - // JaegerBaggageHeader is the name of the HTTP header that is used to submit baggage. - // It differs from TraceBaggageHeaderPrefix in that it can be used only in cases where - // a root span does not exist. - JaegerBaggageHeader string `yaml:"jaegerBaggageHeader"` - - // TraceContextHeaderName is the http header name used to propagate tracing context. - // This must be in lower-case to avoid mismatches when decoding incoming headers. - TraceContextHeaderName string `yaml:"TraceContextHeaderName"` - - // TraceBaggageHeaderPrefix is the prefix for http headers used to propagate baggage. - // This must be in lower-case to avoid mismatches when decoding incoming headers. - TraceBaggageHeaderPrefix string `yaml:"traceBaggageHeaderPrefix"` -} - -func (c *HeadersConfig) applyDefaults() *HeadersConfig { - if c.JaegerBaggageHeader == "" { - c.JaegerBaggageHeader = JaegerBaggageHeader - } - if c.JaegerDebugHeader == "" { - c.JaegerDebugHeader = JaegerDebugHeader - } - if c.TraceBaggageHeaderPrefix == "" { - c.TraceBaggageHeaderPrefix = TraceBaggageHeaderPrefix - } - if c.TraceContextHeaderName == "" { - c.TraceContextHeaderName = TraceContextHeaderName - } - return c -} - -func getDefaultHeadersConfig() *HeadersConfig { - return &HeadersConfig{ - JaegerDebugHeader: JaegerDebugHeader, - JaegerBaggageHeader: JaegerBaggageHeader, - TraceContextHeaderName: TraceContextHeaderName, - TraceBaggageHeaderPrefix: TraceBaggageHeaderPrefix, - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go b/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go deleted file mode 100644 index 745729319ff0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package remote - -import ( - "time" - - "github.com/uber/jaeger-client-go" -) - -const ( - defaultMaxValueLength = 2048 - defaultRefreshInterval = time.Minute - defaultHostPort = "localhost:5778" -) - -// Option is a function that sets some option on the RestrictionManager -type Option func(options *options) - -// Options is a factory for all available options -var Options options - -type options struct { - denyBaggageOnInitializationFailure bool - metrics *jaeger.Metrics - logger jaeger.Logger - hostPort string - refreshInterval time.Duration -} - -// DenyBaggageOnInitializationFailure creates an Option that determines the startup failure mode of RestrictionManager. -// If DenyBaggageOnInitializationFailure is true, RestrictionManager will not allow any baggage to be written until baggage -// restrictions have been retrieved from agent. -// If DenyBaggageOnInitializationFailure is false, RestrictionManager will allow any baggage to be written until baggage -// restrictions have been retrieved from agent. -func (options) DenyBaggageOnInitializationFailure(b bool) Option { - return func(o *options) { - o.denyBaggageOnInitializationFailure = b - } -} - -// Metrics creates an Option that initializes Metrics on the RestrictionManager, which is used to emit statistics. -func (options) Metrics(m *jaeger.Metrics) Option { - return func(o *options) { - o.metrics = m - } -} - -// Logger creates an Option that sets the logger used by the RestrictionManager. -func (options) Logger(logger jaeger.Logger) Option { - return func(o *options) { - o.logger = logger - } -} - -// HostPort creates an Option that sets the hostPort of the local agent that contains the baggage restrictions. -func (options) HostPort(hostPort string) Option { - return func(o *options) { - o.hostPort = hostPort - } -} - -// RefreshInterval creates an Option that sets how often the RestrictionManager will poll local agent for -// the baggage restrictions. -func (options) RefreshInterval(refreshInterval time.Duration) Option { - return func(o *options) { - o.refreshInterval = refreshInterval - } -} - -func applyOptions(o ...Option) options { - opts := options{} - for _, option := range o { - option(&opts) - } - if opts.metrics == nil { - opts.metrics = jaeger.NewNullMetrics() - } - if opts.logger == nil { - opts.logger = jaeger.NullLogger - } - if opts.hostPort == "" { - opts.hostPort = defaultHostPort - } - if opts.refreshInterval == 0 { - opts.refreshInterval = defaultRefreshInterval - } - return opts -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go b/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go deleted file mode 100644 index a56515acab86..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package remote - -import ( - "fmt" - "net/url" - "sync" - "time" - - "github.com/uber/jaeger-client-go/internal/baggage" - thrift "github.com/uber/jaeger-client-go/thrift-gen/baggage" - "github.com/uber/jaeger-client-go/utils" -) - -type httpBaggageRestrictionManagerProxy struct { - url string -} - -func newHTTPBaggageRestrictionManagerProxy(hostPort, serviceName string) *httpBaggageRestrictionManagerProxy { - v := url.Values{} - v.Set("service", serviceName) - return &httpBaggageRestrictionManagerProxy{ - url: fmt.Sprintf("http://%s/baggageRestrictions?%s", hostPort, v.Encode()), - } -} - -func (s *httpBaggageRestrictionManagerProxy) GetBaggageRestrictions(serviceName string) ([]*thrift.BaggageRestriction, error) { - var out []*thrift.BaggageRestriction - if err := utils.GetJSON(s.url, &out); err != nil { - return nil, err - } - return out, nil -} - -// RestrictionManager manages baggage restrictions by retrieving baggage restrictions from agent -type RestrictionManager struct { - options - - mux sync.RWMutex - serviceName string - restrictions map[string]*baggage.Restriction - thriftProxy thrift.BaggageRestrictionManager - pollStopped sync.WaitGroup - stopPoll chan struct{} - invalidRestriction *baggage.Restriction - validRestriction *baggage.Restriction - - // Determines if the manager has successfully retrieved baggage restrictions from agent - initialized bool -} - -// NewRestrictionManager returns a BaggageRestrictionManager that polls the agent for the latest -// baggage restrictions. -func NewRestrictionManager(serviceName string, options ...Option) *RestrictionManager { - // TODO there is a developing use case where a single tracer can generate traces on behalf of many services. - // restrictionsMap will need to exist per service - opts := applyOptions(options...) - m := &RestrictionManager{ - serviceName: serviceName, - options: opts, - restrictions: make(map[string]*baggage.Restriction), - thriftProxy: newHTTPBaggageRestrictionManagerProxy(opts.hostPort, serviceName), - stopPoll: make(chan struct{}), - invalidRestriction: baggage.NewRestriction(false, 0), - validRestriction: baggage.NewRestriction(true, defaultMaxValueLength), - } - m.pollStopped.Add(1) - go m.pollManager() - return m -} - -// isReady returns true if the manager has retrieved baggage restrictions from the remote source. -func (m *RestrictionManager) isReady() bool { - m.mux.RLock() - defer m.mux.RUnlock() - return m.initialized -} - -// GetRestriction implements RestrictionManager#GetRestriction. -func (m *RestrictionManager) GetRestriction(service, key string) *baggage.Restriction { - m.mux.RLock() - defer m.mux.RUnlock() - if !m.initialized { - if m.denyBaggageOnInitializationFailure { - return m.invalidRestriction - } - return m.validRestriction - } - if restriction, ok := m.restrictions[key]; ok { - return restriction - } - return m.invalidRestriction -} - -// Close stops remote polling and closes the RemoteRestrictionManager. -func (m *RestrictionManager) Close() error { - close(m.stopPoll) - m.pollStopped.Wait() - return nil -} - -func (m *RestrictionManager) pollManager() { - defer m.pollStopped.Done() - // attempt to initialize baggage restrictions - if err := m.updateRestrictions(); err != nil { - m.logger.Error(fmt.Sprintf("Failed to initialize baggage restrictions: %s", err.Error())) - } - ticker := time.NewTicker(m.refreshInterval) - defer ticker.Stop() - - for { - select { - case <-ticker.C: - if err := m.updateRestrictions(); err != nil { - m.logger.Error(fmt.Sprintf("Failed to update baggage restrictions: %s", err.Error())) - } - case <-m.stopPoll: - return - } - } -} - -func (m *RestrictionManager) updateRestrictions() error { - restrictions, err := m.thriftProxy.GetBaggageRestrictions(m.serviceName) - if err != nil { - m.metrics.BaggageRestrictionsUpdateFailure.Inc(1) - return err - } - newRestrictions := m.parseRestrictions(restrictions) - m.metrics.BaggageRestrictionsUpdateSuccess.Inc(1) - m.mux.Lock() - defer m.mux.Unlock() - m.initialized = true - m.restrictions = newRestrictions - return nil -} - -func (m *RestrictionManager) parseRestrictions(restrictions []*thrift.BaggageRestriction) map[string]*baggage.Restriction { - setters := make(map[string]*baggage.Restriction, len(restrictions)) - for _, restriction := range restrictions { - setters[restriction.BaggageKey] = baggage.NewRestriction(true, int(restriction.MaxValueLength)) - } - return setters -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go b/vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go deleted file mode 100644 index c16a5c566291..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package baggage - -const ( - defaultMaxValueLength = 2048 -) - -// Restriction determines whether a baggage key is allowed and contains any restrictions on the baggage value. -type Restriction struct { - keyAllowed bool - maxValueLength int -} - -// NewRestriction returns a new Restriction. -func NewRestriction(keyAllowed bool, maxValueLength int) *Restriction { - return &Restriction{ - keyAllowed: keyAllowed, - maxValueLength: maxValueLength, - } -} - -// KeyAllowed returns whether the baggage key for this restriction is allowed. -func (r *Restriction) KeyAllowed() bool { - return r.keyAllowed -} - -// MaxValueLength returns the max length for the baggage value. -func (r *Restriction) MaxValueLength() int { - return r.maxValueLength -} - -// RestrictionManager keeps track of valid baggage keys and their restrictions. The manager -// will return a Restriction for a specific baggage key which will determine whether the baggage -// key is allowed for the current service and any other applicable restrictions on the baggage -// value. -type RestrictionManager interface { - GetRestriction(service, key string) *Restriction -} - -// DefaultRestrictionManager allows any baggage key. -type DefaultRestrictionManager struct { - defaultRestriction *Restriction -} - -// NewDefaultRestrictionManager returns a DefaultRestrictionManager. -func NewDefaultRestrictionManager(maxValueLength int) *DefaultRestrictionManager { - if maxValueLength == 0 { - maxValueLength = defaultMaxValueLength - } - return &DefaultRestrictionManager{ - defaultRestriction: &Restriction{keyAllowed: true, maxValueLength: maxValueLength}, - } -} - -// GetRestriction implements RestrictionManager#GetRestriction. -func (m *DefaultRestrictionManager) GetRestriction(service, key string) *Restriction { - return m.defaultRestriction -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go b/vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go deleted file mode 100644 index 0e10b8a5aa8e..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanlog - -import ( - "encoding/json" - "fmt" - - "github.com/opentracing/opentracing-go/log" -) - -type fieldsAsMap map[string]string - -// MaterializeWithJSON converts log Fields into JSON string -// TODO refactor into pluggable materializer -func MaterializeWithJSON(logFields []log.Field) ([]byte, error) { - fields := fieldsAsMap(make(map[string]string, len(logFields))) - for _, field := range logFields { - field.Marshal(fields) - } - if event, ok := fields["event"]; ok && len(fields) == 1 { - return []byte(event), nil - } - return json.Marshal(fields) -} - -func (ml fieldsAsMap) EmitString(key, value string) { - ml[key] = value -} - -func (ml fieldsAsMap) EmitBool(key string, value bool) { - ml[key] = fmt.Sprintf("%t", value) -} - -func (ml fieldsAsMap) EmitInt(key string, value int) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitInt32(key string, value int32) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitInt64(key string, value int64) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitUint32(key string, value uint32) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitUint64(key string, value uint64) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitFloat32(key string, value float32) { - ml[key] = fmt.Sprintf("%f", value) -} - -func (ml fieldsAsMap) EmitFloat64(key string, value float64) { - ml[key] = fmt.Sprintf("%f", value) -} - -func (ml fieldsAsMap) EmitObject(key string, value interface{}) { - ml[key] = fmt.Sprintf("%+v", value) -} - -func (ml fieldsAsMap) EmitLazyLogger(value log.LazyLogger) { - value(ml) -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go b/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go deleted file mode 100644 index f52c322fb69a..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2018 The Jaeger Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package remote - -import ( - "time" - - "github.com/uber/jaeger-client-go" -) - -const ( - defaultHostPort = "localhost:5778" - defaultRefreshInterval = time.Second * 5 -) - -// Option is a function that sets some option on the Throttler -type Option func(options *options) - -// Options is a factory for all available options -var Options options - -type options struct { - metrics *jaeger.Metrics - logger jaeger.Logger - hostPort string - refreshInterval time.Duration - synchronousInitialization bool -} - -// Metrics creates an Option that initializes Metrics on the Throttler, which is used to emit statistics. -func (options) Metrics(m *jaeger.Metrics) Option { - return func(o *options) { - o.metrics = m - } -} - -// Logger creates an Option that sets the logger used by the Throttler. -func (options) Logger(logger jaeger.Logger) Option { - return func(o *options) { - o.logger = logger - } -} - -// HostPort creates an Option that sets the hostPort of the local agent that keeps track of credits. -func (options) HostPort(hostPort string) Option { - return func(o *options) { - o.hostPort = hostPort - } -} - -// RefreshInterval creates an Option that sets how often the Throttler will poll local agent for -// credits. -func (options) RefreshInterval(refreshInterval time.Duration) Option { - return func(o *options) { - o.refreshInterval = refreshInterval - } -} - -// SynchronousInitialization creates an Option that determines whether the throttler should synchronously -// fetch credits from the agent when an operation is seen for the first time. This should be set to true -// if the client will be used by a short lived service that needs to ensure that credits are fetched upfront -// such that sampling or throttling occurs. -func (options) SynchronousInitialization(b bool) Option { - return func(o *options) { - o.synchronousInitialization = b - } -} - -func applyOptions(o ...Option) options { - opts := options{} - for _, option := range o { - option(&opts) - } - if opts.metrics == nil { - opts.metrics = jaeger.NewNullMetrics() - } - if opts.logger == nil { - opts.logger = jaeger.NullLogger - } - if opts.hostPort == "" { - opts.hostPort = defaultHostPort - } - if opts.refreshInterval == 0 { - opts.refreshInterval = defaultRefreshInterval - } - return opts -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go b/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go deleted file mode 100644 index 20f434fe4956..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright (c) 2018 The Jaeger Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package remote - -import ( - "fmt" - "net/url" - "sync" - "sync/atomic" - "time" - - "github.com/pkg/errors" - - "github.com/uber/jaeger-client-go" - "github.com/uber/jaeger-client-go/utils" -) - -const ( - // minimumCredits is the minimum amount of credits necessary to not be throttled. - // i.e. if currentCredits > minimumCredits, then the operation will not be throttled. - minimumCredits = 1.0 -) - -var ( - errorUUIDNotSet = errors.New("Throttler UUID must be set") -) - -type operationBalance struct { - Operation string `json:"operation"` - Balance float64 `json:"balance"` -} - -type creditResponse struct { - Balances []operationBalance `json:"balances"` -} - -type httpCreditManagerProxy struct { - hostPort string -} - -func newHTTPCreditManagerProxy(hostPort string) *httpCreditManagerProxy { - return &httpCreditManagerProxy{ - hostPort: hostPort, - } -} - -// N.B. Operations list must not be empty. -func (m *httpCreditManagerProxy) FetchCredits(uuid, serviceName string, operations []string) (*creditResponse, error) { - params := url.Values{} - params.Set("service", serviceName) - params.Set("uuid", uuid) - for _, op := range operations { - params.Add("operations", op) - } - var resp creditResponse - if err := utils.GetJSON(fmt.Sprintf("http://%s/credits?%s", m.hostPort, params.Encode()), &resp); err != nil { - return nil, errors.Wrap(err, "Failed to receive credits from agent") - } - return &resp, nil -} - -// Throttler retrieves credits from agent and uses it to throttle operations. -type Throttler struct { - options - - mux sync.RWMutex - service string - uuid atomic.Value - creditManager *httpCreditManagerProxy - credits map[string]float64 // map of operation->credits - close chan struct{} - stopped sync.WaitGroup -} - -// NewThrottler returns a Throttler that polls agent for credits and uses them to throttle -// the service. -func NewThrottler(service string, options ...Option) *Throttler { - opts := applyOptions(options...) - creditManager := newHTTPCreditManagerProxy(opts.hostPort) - t := &Throttler{ - options: opts, - creditManager: creditManager, - service: service, - credits: make(map[string]float64), - close: make(chan struct{}), - } - t.stopped.Add(1) - go t.pollManager() - return t -} - -// IsAllowed implements Throttler#IsAllowed. -func (t *Throttler) IsAllowed(operation string) bool { - t.mux.Lock() - defer t.mux.Unlock() - value, ok := t.credits[operation] - if !ok || value == 0 { - if !ok { - // NOTE: This appears to be a no-op at first glance, but it stores - // the operation key in the map. Necessary for functionality of - // Throttler#operations method. - t.credits[operation] = 0 - } - if !t.synchronousInitialization { - t.metrics.ThrottledDebugSpans.Inc(1) - return false - } - // If it is the first time this operation is being checked, synchronously fetch - // the credits. - credits, err := t.fetchCredits([]string{operation}) - if err != nil { - // Failed to receive credits from agent, try again next time - t.logger.Error("Failed to fetch credits: " + err.Error()) - return false - } - if len(credits.Balances) == 0 { - // This shouldn't happen but just in case - return false - } - for _, opBalance := range credits.Balances { - t.credits[opBalance.Operation] += opBalance.Balance - } - } - return t.isAllowed(operation) -} - -// Close stops the throttler from fetching credits from remote. -func (t *Throttler) Close() error { - close(t.close) - t.stopped.Wait() - return nil -} - -// SetProcess implements ProcessSetter#SetProcess. It's imperative that the UUID is set before any remote -// requests are made. -func (t *Throttler) SetProcess(process jaeger.Process) { - if process.UUID != "" { - t.uuid.Store(process.UUID) - } -} - -// N.B. This function must be called with the Write Lock -func (t *Throttler) isAllowed(operation string) bool { - credits := t.credits[operation] - if credits < minimumCredits { - t.metrics.ThrottledDebugSpans.Inc(1) - return false - } - t.credits[operation] = credits - minimumCredits - return true -} - -func (t *Throttler) pollManager() { - defer t.stopped.Done() - ticker := time.NewTicker(t.refreshInterval) - defer ticker.Stop() - for { - select { - case <-ticker.C: - t.refreshCredits() - case <-t.close: - return - } - } -} - -func (t *Throttler) operations() []string { - t.mux.RLock() - defer t.mux.RUnlock() - operations := make([]string, 0, len(t.credits)) - for op := range t.credits { - operations = append(operations, op) - } - return operations -} - -func (t *Throttler) refreshCredits() { - operations := t.operations() - if len(operations) == 0 { - return - } - newCredits, err := t.fetchCredits(operations) - if err != nil { - t.metrics.ThrottlerUpdateFailure.Inc(1) - t.logger.Error("Failed to fetch credits: " + err.Error()) - return - } - t.metrics.ThrottlerUpdateSuccess.Inc(1) - - t.mux.Lock() - defer t.mux.Unlock() - for _, opBalance := range newCredits.Balances { - t.credits[opBalance.Operation] += opBalance.Balance - } -} - -func (t *Throttler) fetchCredits(operations []string) (*creditResponse, error) { - uuid := t.uuid.Load() - uuidStr, _ := uuid.(string) - if uuid == nil || uuidStr == "" { - return nil, errorUUIDNotSet - } - return t.creditManager.FetchCredits(uuidStr, t.service, operations) -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go b/vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go deleted file mode 100644 index 196ed69cacae..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2018 The Jaeger Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package throttler - -// Throttler is used to rate limits operations. For example, given how debug spans -// are always sampled, a throttler can be enabled per client to rate limit the amount -// of debug spans a client can start. -type Throttler interface { - // IsAllowed determines whether the operation should be allowed and not be - // throttled. - IsAllowed(operation string) bool -} - -// DefaultThrottler doesn't throttle at all. -type DefaultThrottler struct{} - -// IsAllowed implements Throttler#IsAllowed. -func (t DefaultThrottler) IsAllowed(operation string) bool { - return true -} diff --git a/vendor/github.com/uber/jaeger-client-go/interop.go b/vendor/github.com/uber/jaeger-client-go/interop.go deleted file mode 100644 index 8402d087c29f..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/interop.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "github.com/opentracing/opentracing-go" -) - -// TODO this file should not be needed after TChannel PR. - -type formatKey int - -// SpanContextFormat is a constant used as OpenTracing Format. -// Requires *SpanContext as carrier. -// This format is intended for interop with TChannel or other Zipkin-like tracers. -const SpanContextFormat formatKey = iota - -type jaegerTraceContextPropagator struct { - tracer *Tracer -} - -func (p *jaegerTraceContextPropagator) Inject( - ctx SpanContext, - abstractCarrier interface{}, -) error { - carrier, ok := abstractCarrier.(*SpanContext) - if !ok { - return opentracing.ErrInvalidCarrier - } - - carrier.CopyFrom(&ctx) - return nil -} - -func (p *jaegerTraceContextPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { - carrier, ok := abstractCarrier.(*SpanContext) - if !ok { - return emptyContext, opentracing.ErrInvalidCarrier - } - ctx := new(SpanContext) - ctx.CopyFrom(carrier) - return *ctx, nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/jaeger_tag.go b/vendor/github.com/uber/jaeger-client-go/jaeger_tag.go deleted file mode 100644 index 868b2a5b5465..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/jaeger_tag.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "fmt" - - "github.com/opentracing/opentracing-go/log" - - j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" -) - -type tags []*j.Tag - -// ConvertLogsToJaegerTags converts log Fields into jaeger tags. -func ConvertLogsToJaegerTags(logFields []log.Field) []*j.Tag { - fields := tags(make([]*j.Tag, 0, len(logFields))) - for _, field := range logFields { - field.Marshal(&fields) - } - return fields -} - -func (t *tags) EmitString(key, value string) { - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_STRING, VStr: &value}) -} - -func (t *tags) EmitBool(key string, value bool) { - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_BOOL, VBool: &value}) -} - -func (t *tags) EmitInt(key string, value int) { - vLong := int64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) -} - -func (t *tags) EmitInt32(key string, value int32) { - vLong := int64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) -} - -func (t *tags) EmitInt64(key string, value int64) { - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &value}) -} - -func (t *tags) EmitUint32(key string, value uint32) { - vLong := int64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) -} - -func (t *tags) EmitUint64(key string, value uint64) { - vLong := int64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) -} - -func (t *tags) EmitFloat32(key string, value float32) { - vDouble := float64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_DOUBLE, VDouble: &vDouble}) -} - -func (t *tags) EmitFloat64(key string, value float64) { - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_DOUBLE, VDouble: &value}) -} - -func (t *tags) EmitObject(key string, value interface{}) { - vStr := fmt.Sprintf("%+v", value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_STRING, VStr: &vStr}) -} - -func (t *tags) EmitLazyLogger(value log.LazyLogger) { - value(t) -} diff --git a/vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go b/vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go deleted file mode 100644 index 6ce1caf873d9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "time" - - "github.com/opentracing/opentracing-go" - - j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/utils" -) - -// BuildJaegerThrift builds jaeger span based on internal span. -func BuildJaegerThrift(span *Span) *j.Span { - span.Lock() - defer span.Unlock() - startTime := utils.TimeToMicrosecondsSinceEpochInt64(span.startTime) - duration := span.duration.Nanoseconds() / int64(time.Microsecond) - jaegerSpan := &j.Span{ - TraceIdLow: int64(span.context.traceID.Low), - TraceIdHigh: int64(span.context.traceID.High), - SpanId: int64(span.context.spanID), - ParentSpanId: int64(span.context.parentID), - OperationName: span.operationName, - Flags: int32(span.context.flags), - StartTime: startTime, - Duration: duration, - Tags: buildTags(span.tags, span.tracer.options.maxTagValueLength), - Logs: buildLogs(span.logs), - References: buildReferences(span.references), - } - return jaegerSpan -} - -// BuildJaegerProcessThrift creates a thrift Process type. -func BuildJaegerProcessThrift(span *Span) *j.Process { - span.Lock() - defer span.Unlock() - return buildJaegerProcessThrift(span.tracer) -} - -func buildJaegerProcessThrift(tracer *Tracer) *j.Process { - process := &j.Process{ - ServiceName: tracer.serviceName, - Tags: buildTags(tracer.tags, tracer.options.maxTagValueLength), - } - if tracer.process.UUID != "" { - process.Tags = append(process.Tags, &j.Tag{Key: TracerUUIDTagKey, VStr: &tracer.process.UUID, VType: j.TagType_STRING}) - } - return process -} - -func buildTags(tags []Tag, maxTagValueLength int) []*j.Tag { - jTags := make([]*j.Tag, 0, len(tags)) - for _, tag := range tags { - jTag := buildTag(&tag, maxTagValueLength) - jTags = append(jTags, jTag) - } - return jTags -} - -func buildLogs(logs []opentracing.LogRecord) []*j.Log { - jLogs := make([]*j.Log, 0, len(logs)) - for _, log := range logs { - jLog := &j.Log{ - Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(log.Timestamp), - Fields: ConvertLogsToJaegerTags(log.Fields), - } - jLogs = append(jLogs, jLog) - } - return jLogs -} - -func buildTag(tag *Tag, maxTagValueLength int) *j.Tag { - jTag := &j.Tag{Key: tag.key} - switch value := tag.value.(type) { - case string: - vStr := truncateString(value, maxTagValueLength) - jTag.VStr = &vStr - jTag.VType = j.TagType_STRING - case []byte: - if len(value) > maxTagValueLength { - value = value[:maxTagValueLength] - } - jTag.VBinary = value - jTag.VType = j.TagType_BINARY - case int: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case int8: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint8: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case int16: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint16: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case int32: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint32: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case int64: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint64: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case float32: - vDouble := float64(value) - jTag.VDouble = &vDouble - jTag.VType = j.TagType_DOUBLE - case float64: - vDouble := float64(value) - jTag.VDouble = &vDouble - jTag.VType = j.TagType_DOUBLE - case bool: - vBool := value - jTag.VBool = &vBool - jTag.VType = j.TagType_BOOL - default: - vStr := truncateString(stringify(value), maxTagValueLength) - jTag.VStr = &vStr - jTag.VType = j.TagType_STRING - } - return jTag -} - -func buildReferences(references []Reference) []*j.SpanRef { - retMe := make([]*j.SpanRef, 0, len(references)) - for _, ref := range references { - if ref.Type == opentracing.ChildOfRef { - retMe = append(retMe, spanRef(ref.Context, j.SpanRefType_CHILD_OF)) - } else if ref.Type == opentracing.FollowsFromRef { - retMe = append(retMe, spanRef(ref.Context, j.SpanRefType_FOLLOWS_FROM)) - } - } - return retMe -} - -func spanRef(ctx SpanContext, refType j.SpanRefType) *j.SpanRef { - return &j.SpanRef{ - RefType: refType, - TraceIdLow: int64(ctx.traceID.Low), - TraceIdHigh: int64(ctx.traceID.High), - SpanId: int64(ctx.spanID), - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/log/logger.go b/vendor/github.com/uber/jaeger-client-go/log/logger.go deleted file mode 100644 index 894bb3dbf712..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/log/logger.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package log - -import ( - "bytes" - "fmt" - "log" - "sync" -) - -// Logger provides an abstract interface for logging from Reporters. -// Applications can provide their own implementation of this interface to adapt -// reporters logging to whatever logging library they prefer (stdlib log, -// logrus, go-logging, etc). -type Logger interface { - // Error logs a message at error priority - Error(msg string) - - // Infof logs a message at info priority - Infof(msg string, args ...interface{}) -} - -// StdLogger is implementation of the Logger interface that delegates to default `log` package -var StdLogger = &stdLogger{} - -type stdLogger struct{} - -func (l *stdLogger) Error(msg string) { - log.Printf("ERROR: %s", msg) -} - -// Infof logs a message at info priority -func (l *stdLogger) Infof(msg string, args ...interface{}) { - log.Printf(msg, args...) -} - -// NullLogger is implementation of the Logger interface that is no-op -var NullLogger = &nullLogger{} - -type nullLogger struct{} - -func (l *nullLogger) Error(msg string) {} -func (l *nullLogger) Infof(msg string, args ...interface{}) {} - -// BytesBufferLogger implements Logger backed by a bytes.Buffer. -type BytesBufferLogger struct { - mux sync.Mutex - buf bytes.Buffer -} - -// Error implements Logger. -func (l *BytesBufferLogger) Error(msg string) { - l.mux.Lock() - l.buf.WriteString(fmt.Sprintf("ERROR: %s\n", msg)) - l.mux.Unlock() -} - -// Infof implements Logger. -func (l *BytesBufferLogger) Infof(msg string, args ...interface{}) { - l.mux.Lock() - l.buf.WriteString("INFO: " + fmt.Sprintf(msg, args...) + "\n") - l.mux.Unlock() -} - -// String returns string representation of the underlying buffer. -func (l *BytesBufferLogger) String() string { - l.mux.Lock() - defer l.mux.Unlock() - return l.buf.String() -} - -// Flush empties the underlying buffer. -func (l *BytesBufferLogger) Flush() { - l.mux.Lock() - defer l.mux.Unlock() - l.buf.Reset() -} diff --git a/vendor/github.com/uber/jaeger-client-go/logger.go b/vendor/github.com/uber/jaeger-client-go/logger.go deleted file mode 100644 index d4f0b501923d..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/logger.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import "log" - -// NB This will be deprecated in 3.0.0, please use jaeger-client-go/log/logger instead. - -// Logger provides an abstract interface for logging from Reporters. -// Applications can provide their own implementation of this interface to adapt -// reporters logging to whatever logging library they prefer (stdlib log, -// logrus, go-logging, etc). -type Logger interface { - // Error logs a message at error priority - Error(msg string) - - // Infof logs a message at info priority - Infof(msg string, args ...interface{}) -} - -// StdLogger is implementation of the Logger interface that delegates to default `log` package -var StdLogger = &stdLogger{} - -type stdLogger struct{} - -func (l *stdLogger) Error(msg string) { - log.Printf("ERROR: %s", msg) -} - -// Infof logs a message at info priority -func (l *stdLogger) Infof(msg string, args ...interface{}) { - log.Printf(msg, args...) -} - -// NullLogger is implementation of the Logger interface that delegates to default `log` package -var NullLogger = &nullLogger{} - -type nullLogger struct{} - -func (l *nullLogger) Error(msg string) {} -func (l *nullLogger) Infof(msg string, args ...interface{}) {} diff --git a/vendor/github.com/uber/jaeger-client-go/metrics.go b/vendor/github.com/uber/jaeger-client-go/metrics.go deleted file mode 100644 index cadb2b9c0fb0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/metrics.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2017-2018 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "github.com/uber/jaeger-lib/metrics" -) - -// Metrics is a container of all stats emitted by Jaeger tracer. -type Metrics struct { - // Number of traces started by this tracer as sampled - TracesStartedSampled metrics.Counter `metric:"traces" tags:"state=started,sampled=y"` - - // Number of traces started by this tracer as not sampled - TracesStartedNotSampled metrics.Counter `metric:"traces" tags:"state=started,sampled=n"` - - // Number of externally started sampled traces this tracer joined - TracesJoinedSampled metrics.Counter `metric:"traces" tags:"state=joined,sampled=y"` - - // Number of externally started not-sampled traces this tracer joined - TracesJoinedNotSampled metrics.Counter `metric:"traces" tags:"state=joined,sampled=n"` - - // Number of sampled spans started by this tracer - SpansStartedSampled metrics.Counter `metric:"started_spans" tags:"sampled=y"` - - // Number of unsampled spans started by this tracer - SpansStartedNotSampled metrics.Counter `metric:"started_spans" tags:"sampled=n"` - - // Number of spans finished by this tracer - SpansFinished metrics.Counter `metric:"finished_spans"` - - // Number of errors decoding tracing context - DecodingErrors metrics.Counter `metric:"span_context_decoding_errors"` - - // Number of spans successfully reported - ReporterSuccess metrics.Counter `metric:"reporter_spans" tags:"result=ok"` - - // Number of spans not reported due to a Sender failure - ReporterFailure metrics.Counter `metric:"reporter_spans" tags:"result=err"` - - // Number of spans dropped due to internal queue overflow - ReporterDropped metrics.Counter `metric:"reporter_spans" tags:"result=dropped"` - - // Current number of spans in the reporter queue - ReporterQueueLength metrics.Gauge `metric:"reporter_queue_length"` - - // Number of times the Sampler succeeded to retrieve sampling strategy - SamplerRetrieved metrics.Counter `metric:"sampler_queries" tags:"result=ok"` - - // Number of times the Sampler failed to retrieve sampling strategy - SamplerQueryFailure metrics.Counter `metric:"sampler_queries" tags:"result=err"` - - // Number of times the Sampler succeeded to retrieve and update sampling strategy - SamplerUpdated metrics.Counter `metric:"sampler_updates" tags:"result=ok"` - - // Number of times the Sampler failed to update sampling strategy - SamplerUpdateFailure metrics.Counter `metric:"sampler_updates" tags:"result=err"` - - // Number of times baggage was successfully written or updated on spans. - BaggageUpdateSuccess metrics.Counter `metric:"baggage_updates" tags:"result=ok"` - - // Number of times baggage failed to write or update on spans. - BaggageUpdateFailure metrics.Counter `metric:"baggage_updates" tags:"result=err"` - - // Number of times baggage was truncated as per baggage restrictions. - BaggageTruncate metrics.Counter `metric:"baggage_truncations"` - - // Number of times baggage restrictions were successfully updated. - BaggageRestrictionsUpdateSuccess metrics.Counter `metric:"baggage_restrictions_updates" tags:"result=ok"` - - // Number of times baggage restrictions failed to update. - BaggageRestrictionsUpdateFailure metrics.Counter `metric:"baggage_restrictions_updates" tags:"result=err"` - - // Number of times debug spans were throttled. - ThrottledDebugSpans metrics.Counter `metric:"throttled_debug_spans"` - - // Number of times throttler successfully updated. - ThrottlerUpdateSuccess metrics.Counter `metric:"throttler_updates" tags:"result=ok"` - - // Number of times throttler failed to update. - ThrottlerUpdateFailure metrics.Counter `metric:"throttler_updates" tags:"result=err"` -} - -// NewMetrics creates a new Metrics struct and initializes it. -func NewMetrics(factory metrics.Factory, globalTags map[string]string) *Metrics { - m := &Metrics{} - // TODO the namespace "jaeger" should be configurable (e.g. in all-in-one "jaeger-client" would make more sense) - metrics.Init(m, factory.Namespace("jaeger", nil), globalTags) - return m -} - -// NewNullMetrics creates a new Metrics struct that won't report any metrics. -func NewNullMetrics() *Metrics { - return NewMetrics(metrics.NullFactory, nil) -} diff --git a/vendor/github.com/uber/jaeger-client-go/observer.go b/vendor/github.com/uber/jaeger-client-go/observer.go deleted file mode 100644 index 7bbd028897a9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/observer.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import opentracing "github.com/opentracing/opentracing-go" - -// Observer can be registered with the Tracer to receive notifications about -// new Spans. -// -// Deprecated: use jaeger.ContribObserver instead. -type Observer interface { - OnStartSpan(operationName string, options opentracing.StartSpanOptions) SpanObserver -} - -// SpanObserver is created by the Observer and receives notifications about -// other Span events. -// -// Deprecated: use jaeger.ContribSpanObserver instead. -type SpanObserver interface { - OnSetOperationName(operationName string) - OnSetTag(key string, value interface{}) - OnFinish(options opentracing.FinishOptions) -} - -// compositeObserver is a dispatcher to other observers -type compositeObserver struct { - observers []ContribObserver -} - -// compositeSpanObserver is a dispatcher to other span observers -type compositeSpanObserver struct { - observers []ContribSpanObserver -} - -// noopSpanObserver is used when there are no observers registered -// on the Tracer or none of them returns span observers from OnStartSpan. -var noopSpanObserver = &compositeSpanObserver{} - -func (o *compositeObserver) append(contribObserver ContribObserver) { - o.observers = append(o.observers, contribObserver) -} - -func (o *compositeObserver) OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) ContribSpanObserver { - var spanObservers []ContribSpanObserver - for _, obs := range o.observers { - spanObs, ok := obs.OnStartSpan(sp, operationName, options) - if ok { - if spanObservers == nil { - spanObservers = make([]ContribSpanObserver, 0, len(o.observers)) - } - spanObservers = append(spanObservers, spanObs) - } - } - if len(spanObservers) == 0 { - return noopSpanObserver - } - return &compositeSpanObserver{observers: spanObservers} -} - -func (o *compositeSpanObserver) OnSetOperationName(operationName string) { - for _, obs := range o.observers { - obs.OnSetOperationName(operationName) - } -} - -func (o *compositeSpanObserver) OnSetTag(key string, value interface{}) { - for _, obs := range o.observers { - obs.OnSetTag(key, value) - } -} - -func (o *compositeSpanObserver) OnFinish(options opentracing.FinishOptions) { - for _, obs := range o.observers { - obs.OnFinish(options) - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/process.go b/vendor/github.com/uber/jaeger-client-go/process.go deleted file mode 100644 index 30cbf99624c9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/process.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2018 The Jaeger Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -// Process holds process specific metadata that's relevant to this client. -type Process struct { - Service string - UUID string - Tags []Tag -} - -// ProcessSetter sets a process. This can be used by any class that requires -// the process to be set as part of initialization. -// See internal/throttler/remote/throttler.go for an example. -type ProcessSetter interface { - SetProcess(process Process) -} diff --git a/vendor/github.com/uber/jaeger-client-go/propagation.go b/vendor/github.com/uber/jaeger-client-go/propagation.go deleted file mode 100644 index abca67a3c9b9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/propagation.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "log" - "net/url" - "strings" - "sync" - - opentracing "github.com/opentracing/opentracing-go" -) - -// Injector is responsible for injecting SpanContext instances in a manner suitable -// for propagation via a format-specific "carrier" object. Typically the -// injection will take place across an RPC boundary, but message queues and -// other IPC mechanisms are also reasonable places to use an Injector. -type Injector interface { - // Inject takes `SpanContext` and injects it into `carrier`. The actual type - // of `carrier` depends on the `format` passed to `Tracer.Inject()`. - // - // Implementations may return opentracing.ErrInvalidCarrier or any other - // implementation-specific error if injection fails. - Inject(ctx SpanContext, carrier interface{}) error -} - -// Extractor is responsible for extracting SpanContext instances from a -// format-specific "carrier" object. Typically the extraction will take place -// on the server side of an RPC boundary, but message queues and other IPC -// mechanisms are also reasonable places to use an Extractor. -type Extractor interface { - // Extract decodes a SpanContext instance from the given `carrier`, - // or (nil, opentracing.ErrSpanContextNotFound) if no context could - // be found in the `carrier`. - Extract(carrier interface{}) (SpanContext, error) -} - -type textMapPropagator struct { - headerKeys *HeadersConfig - metrics Metrics - encodeValue func(string) string - decodeValue func(string) string -} - -func newTextMapPropagator(headerKeys *HeadersConfig, metrics Metrics) *textMapPropagator { - return &textMapPropagator{ - headerKeys: headerKeys, - metrics: metrics, - encodeValue: func(val string) string { - return val - }, - decodeValue: func(val string) string { - return val - }, - } -} - -func newHTTPHeaderPropagator(headerKeys *HeadersConfig, metrics Metrics) *textMapPropagator { - return &textMapPropagator{ - headerKeys: headerKeys, - metrics: metrics, - encodeValue: func(val string) string { - return url.QueryEscape(val) - }, - decodeValue: func(val string) string { - // ignore decoding errors, cannot do anything about them - if v, err := url.QueryUnescape(val); err == nil { - return v - } - return val - }, - } -} - -type binaryPropagator struct { - tracer *Tracer - buffers sync.Pool -} - -func newBinaryPropagator(tracer *Tracer) *binaryPropagator { - return &binaryPropagator{ - tracer: tracer, - buffers: sync.Pool{New: func() interface{} { return &bytes.Buffer{} }}, - } -} - -func (p *textMapPropagator) Inject( - sc SpanContext, - abstractCarrier interface{}, -) error { - textMapWriter, ok := abstractCarrier.(opentracing.TextMapWriter) - if !ok { - return opentracing.ErrInvalidCarrier - } - - // Do not encode the string with trace context to avoid accidental double-encoding - // if people are using opentracing < 0.10.0. Our colon-separated representation - // of the trace context is already safe for HTTP headers. - textMapWriter.Set(p.headerKeys.TraceContextHeaderName, sc.String()) - for k, v := range sc.baggage { - safeKey := p.addBaggageKeyPrefix(k) - safeVal := p.encodeValue(v) - textMapWriter.Set(safeKey, safeVal) - } - return nil -} - -func (p *textMapPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { - textMapReader, ok := abstractCarrier.(opentracing.TextMapReader) - if !ok { - return emptyContext, opentracing.ErrInvalidCarrier - } - var ctx SpanContext - var baggage map[string]string - err := textMapReader.ForeachKey(func(rawKey, value string) error { - key := strings.ToLower(rawKey) // TODO not necessary for plain TextMap - if key == p.headerKeys.TraceContextHeaderName { - var err error - safeVal := p.decodeValue(value) - if ctx, err = ContextFromString(safeVal); err != nil { - return err - } - } else if key == p.headerKeys.JaegerDebugHeader { - ctx.debugID = p.decodeValue(value) - } else if key == p.headerKeys.JaegerBaggageHeader { - if baggage == nil { - baggage = make(map[string]string) - } - for k, v := range p.parseCommaSeparatedMap(value) { - baggage[k] = v - } - } else if strings.HasPrefix(key, p.headerKeys.TraceBaggageHeaderPrefix) { - if baggage == nil { - baggage = make(map[string]string) - } - safeKey := p.removeBaggageKeyPrefix(key) - safeVal := p.decodeValue(value) - baggage[safeKey] = safeVal - } - return nil - }) - if err != nil { - p.metrics.DecodingErrors.Inc(1) - return emptyContext, err - } - if !ctx.traceID.IsValid() && ctx.debugID == "" && len(baggage) == 0 { - return emptyContext, opentracing.ErrSpanContextNotFound - } - ctx.baggage = baggage - return ctx, nil -} - -func (p *binaryPropagator) Inject( - sc SpanContext, - abstractCarrier interface{}, -) error { - carrier, ok := abstractCarrier.(io.Writer) - if !ok { - return opentracing.ErrInvalidCarrier - } - - // Handle the tracer context - if err := binary.Write(carrier, binary.BigEndian, sc.traceID); err != nil { - return err - } - if err := binary.Write(carrier, binary.BigEndian, sc.spanID); err != nil { - return err - } - if err := binary.Write(carrier, binary.BigEndian, sc.parentID); err != nil { - return err - } - if err := binary.Write(carrier, binary.BigEndian, sc.flags); err != nil { - return err - } - - // Handle the baggage items - if err := binary.Write(carrier, binary.BigEndian, int32(len(sc.baggage))); err != nil { - return err - } - for k, v := range sc.baggage { - if err := binary.Write(carrier, binary.BigEndian, int32(len(k))); err != nil { - return err - } - io.WriteString(carrier, k) - if err := binary.Write(carrier, binary.BigEndian, int32(len(v))); err != nil { - return err - } - io.WriteString(carrier, v) - } - - return nil -} - -func (p *binaryPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { - carrier, ok := abstractCarrier.(io.Reader) - if !ok { - return emptyContext, opentracing.ErrInvalidCarrier - } - var ctx SpanContext - - if err := binary.Read(carrier, binary.BigEndian, &ctx.traceID); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - if err := binary.Read(carrier, binary.BigEndian, &ctx.spanID); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - if err := binary.Read(carrier, binary.BigEndian, &ctx.parentID); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - if err := binary.Read(carrier, binary.BigEndian, &ctx.flags); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - - // Handle the baggage items - var numBaggage int32 - if err := binary.Read(carrier, binary.BigEndian, &numBaggage); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - if iNumBaggage := int(numBaggage); iNumBaggage > 0 { - ctx.baggage = make(map[string]string, iNumBaggage) - buf := p.buffers.Get().(*bytes.Buffer) - defer p.buffers.Put(buf) - - var keyLen, valLen int32 - for i := 0; i < iNumBaggage; i++ { - if err := binary.Read(carrier, binary.BigEndian, &keyLen); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - buf.Reset() - buf.Grow(int(keyLen)) - if n, err := io.CopyN(buf, carrier, int64(keyLen)); err != nil || int32(n) != keyLen { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - key := buf.String() - - if err := binary.Read(carrier, binary.BigEndian, &valLen); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - buf.Reset() - buf.Grow(int(valLen)) - if n, err := io.CopyN(buf, carrier, int64(valLen)); err != nil || int32(n) != valLen { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - ctx.baggage[key] = buf.String() - } - } - - return ctx, nil -} - -// Converts a comma separated key value pair list into a map -// e.g. key1=value1, key2=value2, key3 = value3 -// is converted to map[string]string { "key1" : "value1", -// "key2" : "value2", -// "key3" : "value3" } -func (p *textMapPropagator) parseCommaSeparatedMap(value string) map[string]string { - baggage := make(map[string]string) - value, err := url.QueryUnescape(value) - if err != nil { - log.Printf("Unable to unescape %s, %v", value, err) - return baggage - } - for _, kvpair := range strings.Split(value, ",") { - kv := strings.Split(strings.TrimSpace(kvpair), "=") - if len(kv) == 2 { - baggage[kv[0]] = kv[1] - } else { - log.Printf("Malformed value passed in for %s", p.headerKeys.JaegerBaggageHeader) - } - } - return baggage -} - -// Converts a baggage item key into an http header format, -// by prepending TraceBaggageHeaderPrefix and encoding the key string -func (p *textMapPropagator) addBaggageKeyPrefix(key string) string { - // TODO encodeBaggageKeyAsHeader add caching and escaping - return fmt.Sprintf("%v%v", p.headerKeys.TraceBaggageHeaderPrefix, key) -} - -func (p *textMapPropagator) removeBaggageKeyPrefix(key string) string { - // TODO decodeBaggageHeaderKey add caching and escaping - return key[len(p.headerKeys.TraceBaggageHeaderPrefix):] -} diff --git a/vendor/github.com/uber/jaeger-client-go/reference.go b/vendor/github.com/uber/jaeger-client-go/reference.go deleted file mode 100644 index 5646e78bb2a8..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/reference.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import "github.com/opentracing/opentracing-go" - -// Reference represents a causal reference to other Spans (via their SpanContext). -type Reference struct { - Type opentracing.SpanReferenceType - Context SpanContext -} diff --git a/vendor/github.com/uber/jaeger-client-go/reporter.go b/vendor/github.com/uber/jaeger-client-go/reporter.go deleted file mode 100644 index fe6288c4b9e5..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/reporter.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "fmt" - "sync" - "sync/atomic" - "time" - - "github.com/opentracing/opentracing-go" - - "github.com/uber/jaeger-client-go/log" -) - -// Reporter is called by the tracer when a span is completed to report the span to the tracing collector. -type Reporter interface { - // Report submits a new span to collectors, possibly asynchronously and/or with buffering. - Report(span *Span) - - // Close does a clean shutdown of the reporter, flushing any traces that may be buffered in memory. - Close() -} - -// ------------------------------ - -type nullReporter struct{} - -// NewNullReporter creates a no-op reporter that ignores all reported spans. -func NewNullReporter() Reporter { - return &nullReporter{} -} - -// Report implements Report() method of Reporter by doing nothing. -func (r *nullReporter) Report(span *Span) { - // no-op -} - -// Close implements Close() method of Reporter by doing nothing. -func (r *nullReporter) Close() { - // no-op -} - -// ------------------------------ - -type loggingReporter struct { - logger Logger -} - -// NewLoggingReporter creates a reporter that logs all reported spans to provided logger. -func NewLoggingReporter(logger Logger) Reporter { - return &loggingReporter{logger} -} - -// Report implements Report() method of Reporter by logging the span to the logger. -func (r *loggingReporter) Report(span *Span) { - r.logger.Infof("Reporting span %+v", span) -} - -// Close implements Close() method of Reporter by doing nothing. -func (r *loggingReporter) Close() { - // no-op -} - -// ------------------------------ - -// InMemoryReporter is used for testing, and simply collects spans in memory. -type InMemoryReporter struct { - spans []opentracing.Span - lock sync.Mutex -} - -// NewInMemoryReporter creates a reporter that stores spans in memory. -// NOTE: the Tracer should be created with options.PoolSpans = false. -func NewInMemoryReporter() *InMemoryReporter { - return &InMemoryReporter{ - spans: make([]opentracing.Span, 0, 10), - } -} - -// Report implements Report() method of Reporter by storing the span in the buffer. -func (r *InMemoryReporter) Report(span *Span) { - r.lock.Lock() - r.spans = append(r.spans, span) - r.lock.Unlock() -} - -// Close implements Close() method of Reporter by doing nothing. -func (r *InMemoryReporter) Close() { - // no-op -} - -// SpansSubmitted returns the number of spans accumulated in the buffer. -func (r *InMemoryReporter) SpansSubmitted() int { - r.lock.Lock() - defer r.lock.Unlock() - return len(r.spans) -} - -// GetSpans returns accumulated spans as a copy of the buffer. -func (r *InMemoryReporter) GetSpans() []opentracing.Span { - r.lock.Lock() - defer r.lock.Unlock() - copied := make([]opentracing.Span, len(r.spans)) - copy(copied, r.spans) - return copied -} - -// Reset clears all accumulated spans. -func (r *InMemoryReporter) Reset() { - r.lock.Lock() - defer r.lock.Unlock() - r.spans = nil -} - -// ------------------------------ - -type compositeReporter struct { - reporters []Reporter -} - -// NewCompositeReporter creates a reporter that ignores all reported spans. -func NewCompositeReporter(reporters ...Reporter) Reporter { - return &compositeReporter{reporters: reporters} -} - -// Report implements Report() method of Reporter by delegating to each underlying reporter. -func (r *compositeReporter) Report(span *Span) { - for _, reporter := range r.reporters { - reporter.Report(span) - } -} - -// Close implements Close() method of Reporter by closing each underlying reporter. -func (r *compositeReporter) Close() { - for _, reporter := range r.reporters { - reporter.Close() - } -} - -// ------------- REMOTE REPORTER ----------------- - -type reporterQueueItemType int - -const ( - defaultQueueSize = 100 - defaultBufferFlushInterval = 1 * time.Second - - reporterQueueItemSpan reporterQueueItemType = iota - reporterQueueItemClose -) - -type reporterQueueItem struct { - itemType reporterQueueItemType - span *Span - close *sync.WaitGroup -} - -type remoteReporter struct { - // These fields must be first in the struct because `sync/atomic` expects 64-bit alignment. - // Cf. https://github.com/uber/jaeger-client-go/issues/155, https://goo.gl/zW7dgq - queueLength int64 - closed int64 // 0 - not closed, 1 - closed - - reporterOptions - - sender Transport - queue chan reporterQueueItem -} - -// NewRemoteReporter creates a new reporter that sends spans out of process by means of Sender. -// Calls to Report(Span) return immediately (side effect: if internal buffer is full the span is dropped). -// Periodically the transport buffer is flushed even if it hasn't reached max packet size. -// Calls to Close() block until all spans reported prior to the call to Close are flushed. -func NewRemoteReporter(sender Transport, opts ...ReporterOption) Reporter { - options := reporterOptions{} - for _, option := range opts { - option(&options) - } - if options.bufferFlushInterval <= 0 { - options.bufferFlushInterval = defaultBufferFlushInterval - } - if options.logger == nil { - options.logger = log.NullLogger - } - if options.metrics == nil { - options.metrics = NewNullMetrics() - } - if options.queueSize <= 0 { - options.queueSize = defaultQueueSize - } - reporter := &remoteReporter{ - reporterOptions: options, - sender: sender, - queue: make(chan reporterQueueItem, options.queueSize), - } - go reporter.processQueue() - return reporter -} - -// Report implements Report() method of Reporter. -// It passes the span to a background go-routine for submission to Jaeger backend. -// If the internal queue is full, the span is dropped and metrics.ReporterDropped counter is incremented. -// If Report() is called after the reporter has been Close()-ed, the additional spans will not be -// sent to the backend, but the metrics.ReporterDropped counter may not reflect them correctly, -// because some of them may still be successfully added to the queue. -func (r *remoteReporter) Report(span *Span) { - select { - case r.queue <- reporterQueueItem{itemType: reporterQueueItemSpan, span: span}: - atomic.AddInt64(&r.queueLength, 1) - default: - r.metrics.ReporterDropped.Inc(1) - } -} - -// Close implements Close() method of Reporter by waiting for the queue to be drained. -func (r *remoteReporter) Close() { - if swapped := atomic.CompareAndSwapInt64(&r.closed, 0, 1); !swapped { - r.logger.Error("Repeated attempt to close the reporter is ignored") - return - } - r.sendCloseEvent() - r.sender.Close() -} - -func (r *remoteReporter) sendCloseEvent() { - wg := &sync.WaitGroup{} - wg.Add(1) - item := reporterQueueItem{itemType: reporterQueueItemClose, close: wg} - - r.queue <- item // if the queue is full we will block until there is space - atomic.AddInt64(&r.queueLength, 1) - wg.Wait() -} - -// processQueue reads spans from the queue, converts them to Thrift, and stores them in an internal buffer. -// When the buffer length reaches batchSize, it is flushed by submitting the accumulated spans to Jaeger. -// Buffer also gets flushed automatically every batchFlushInterval seconds, just in case the tracer stopped -// reporting new spans. -func (r *remoteReporter) processQueue() { - // flush causes the Sender to flush its accumulated spans and clear the buffer - flush := func() { - if flushed, err := r.sender.Flush(); err != nil { - r.metrics.ReporterFailure.Inc(int64(flushed)) - r.logger.Error(fmt.Sprintf("error when flushing the buffer: %s", err.Error())) - } else if flushed > 0 { - r.metrics.ReporterSuccess.Inc(int64(flushed)) - } - } - - timer := time.NewTicker(r.bufferFlushInterval) - for { - select { - case <-timer.C: - flush() - case item := <-r.queue: - atomic.AddInt64(&r.queueLength, -1) - switch item.itemType { - case reporterQueueItemSpan: - span := item.span - if flushed, err := r.sender.Append(span); err != nil { - r.metrics.ReporterFailure.Inc(int64(flushed)) - r.logger.Error(fmt.Sprintf("error reporting span %q: %s", span.OperationName(), err.Error())) - } else if flushed > 0 { - r.metrics.ReporterSuccess.Inc(int64(flushed)) - // to reduce the number of gauge stats, we only emit queue length on flush - r.metrics.ReporterQueueLength.Update(atomic.LoadInt64(&r.queueLength)) - } - case reporterQueueItemClose: - timer.Stop() - flush() - item.close.Done() - return - } - } - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/reporter_options.go b/vendor/github.com/uber/jaeger-client-go/reporter_options.go deleted file mode 100644 index 65012d7015dc..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/reporter_options.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "time" -) - -// ReporterOption is a function that sets some option on the reporter. -type ReporterOption func(c *reporterOptions) - -// ReporterOptions is a factory for all available ReporterOption's -var ReporterOptions reporterOptions - -// reporterOptions control behavior of the reporter. -type reporterOptions struct { - // queueSize is the size of internal queue where reported spans are stored before they are processed in the background - queueSize int - // bufferFlushInterval is how often the buffer is force-flushed, even if it's not full - bufferFlushInterval time.Duration - // logger is used to log errors of span submissions - logger Logger - // metrics is used to record runtime stats - metrics *Metrics -} - -// QueueSize creates a ReporterOption that sets the size of the internal queue where -// spans are stored before they are processed. -func (reporterOptions) QueueSize(queueSize int) ReporterOption { - return func(r *reporterOptions) { - r.queueSize = queueSize - } -} - -// Metrics creates a ReporterOption that initializes Metrics in the reporter, -// which is used to record runtime statistics. -func (reporterOptions) Metrics(metrics *Metrics) ReporterOption { - return func(r *reporterOptions) { - r.metrics = metrics - } -} - -// BufferFlushInterval creates a ReporterOption that sets how often the queue -// is force-flushed. -func (reporterOptions) BufferFlushInterval(bufferFlushInterval time.Duration) ReporterOption { - return func(r *reporterOptions) { - r.bufferFlushInterval = bufferFlushInterval - } -} - -// Logger creates a ReporterOption that initializes the logger used to log -// errors of span submissions. -func (reporterOptions) Logger(logger Logger) ReporterOption { - return func(r *reporterOptions) { - r.logger = logger - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md deleted file mode 100644 index 879948e9c9cd..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md +++ /dev/null @@ -1,5 +0,0 @@ -An Observer that can be used to emit RPC metrics -================================================ - -It can be attached to the tracer during tracer construction. -See `ExampleObserver` function in [observer_test.go](./observer_test.go). diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go deleted file mode 100644 index 51aa11b350e5..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package rpcmetrics implements an Observer that can be used to emit RPC metrics. -package rpcmetrics diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go deleted file mode 100644 index 30555243d0c0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rpcmetrics - -import "sync" - -// normalizedEndpoints is a cache for endpointName -> safeName mappings. -type normalizedEndpoints struct { - names map[string]string - maxSize int - defaultName string - normalizer NameNormalizer - mux sync.RWMutex -} - -func newNormalizedEndpoints(maxSize int, normalizer NameNormalizer) *normalizedEndpoints { - return &normalizedEndpoints{ - maxSize: maxSize, - normalizer: normalizer, - names: make(map[string]string, maxSize), - } -} - -// normalize looks up the name in the cache, if not found it uses normalizer -// to convert the name to a safe name. If called with more than maxSize unique -// names it returns "" for all other names beyond those already cached. -func (n *normalizedEndpoints) normalize(name string) string { - n.mux.RLock() - norm, ok := n.names[name] - l := len(n.names) - n.mux.RUnlock() - if ok { - return norm - } - if l >= n.maxSize { - return "" - } - return n.normalizeWithLock(name) -} - -func (n *normalizedEndpoints) normalizeWithLock(name string) string { - norm := n.normalizer.Normalize(name) - n.mux.Lock() - defer n.mux.Unlock() - // cache may have grown while we were not holding the lock - if len(n.names) >= n.maxSize { - return "" - } - n.names[name] = norm - return norm -} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go deleted file mode 100644 index ab8d74c29185..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rpcmetrics - -import ( - "sync" - - "github.com/uber/jaeger-lib/metrics" -) - -const ( - otherEndpointsPlaceholder = "other" - endpointNameMetricTag = "endpoint" -) - -// Metrics is a collection of metrics for an endpoint describing -// throughput, success, errors, and performance. -type Metrics struct { - // RequestCountSuccess is a counter of the total number of successes. - RequestCountSuccess metrics.Counter `metric:"requests" tags:"error=false"` - - // RequestCountFailures is a counter of the number of times any failure has been observed. - RequestCountFailures metrics.Counter `metric:"requests" tags:"error=true"` - - // RequestLatencySuccess is a latency histogram of succesful requests. - RequestLatencySuccess metrics.Timer `metric:"request_latency" tags:"error=false"` - - // RequestLatencyFailures is a latency histogram of failed requests. - RequestLatencyFailures metrics.Timer `metric:"request_latency" tags:"error=true"` - - // HTTPStatusCode2xx is a counter of the total number of requests with HTTP status code 200-299 - HTTPStatusCode2xx metrics.Counter `metric:"http_requests" tags:"status_code=2xx"` - - // HTTPStatusCode3xx is a counter of the total number of requests with HTTP status code 300-399 - HTTPStatusCode3xx metrics.Counter `metric:"http_requests" tags:"status_code=3xx"` - - // HTTPStatusCode4xx is a counter of the total number of requests with HTTP status code 400-499 - HTTPStatusCode4xx metrics.Counter `metric:"http_requests" tags:"status_code=4xx"` - - // HTTPStatusCode5xx is a counter of the total number of requests with HTTP status code 500-599 - HTTPStatusCode5xx metrics.Counter `metric:"http_requests" tags:"status_code=5xx"` -} - -func (m *Metrics) recordHTTPStatusCode(statusCode uint16) { - if statusCode >= 200 && statusCode < 300 { - m.HTTPStatusCode2xx.Inc(1) - } else if statusCode >= 300 && statusCode < 400 { - m.HTTPStatusCode3xx.Inc(1) - } else if statusCode >= 400 && statusCode < 500 { - m.HTTPStatusCode4xx.Inc(1) - } else if statusCode >= 500 && statusCode < 600 { - m.HTTPStatusCode5xx.Inc(1) - } -} - -// MetricsByEndpoint is a registry/cache of metrics for each unique endpoint name. -// Only maxNumberOfEndpoints Metrics are stored, all other endpoint names are mapped -// to a generic endpoint name "other". -type MetricsByEndpoint struct { - metricsFactory metrics.Factory - endpoints *normalizedEndpoints - metricsByEndpoint map[string]*Metrics - mux sync.RWMutex -} - -func newMetricsByEndpoint( - metricsFactory metrics.Factory, - normalizer NameNormalizer, - maxNumberOfEndpoints int, -) *MetricsByEndpoint { - return &MetricsByEndpoint{ - metricsFactory: metricsFactory, - endpoints: newNormalizedEndpoints(maxNumberOfEndpoints, normalizer), - metricsByEndpoint: make(map[string]*Metrics, maxNumberOfEndpoints+1), // +1 for "other" - } -} - -func (m *MetricsByEndpoint) get(endpoint string) *Metrics { - safeName := m.endpoints.normalize(endpoint) - if safeName == "" { - safeName = otherEndpointsPlaceholder - } - m.mux.RLock() - met := m.metricsByEndpoint[safeName] - m.mux.RUnlock() - if met != nil { - return met - } - - return m.getWithWriteLock(safeName) -} - -// split to make easier to test -func (m *MetricsByEndpoint) getWithWriteLock(safeName string) *Metrics { - m.mux.Lock() - defer m.mux.Unlock() - - // it is possible that the name has been already registered after we released - // the read lock and before we grabbed the write lock, so check for that. - if met, ok := m.metricsByEndpoint[safeName]; ok { - return met - } - - // it would be nice to create the struct before locking, since Init() is somewhat - // expensive, however some metrics backends (e.g. expvar) may not like duplicate metrics. - met := &Metrics{} - tags := map[string]string{endpointNameMetricTag: safeName} - metrics.Init(met, m.metricsFactory, tags) - - m.metricsByEndpoint[safeName] = met - return met -} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go deleted file mode 100644 index 148d84b3a1a6..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rpcmetrics - -// NameNormalizer is used to convert the endpoint names to strings -// that can be safely used as tags in the metrics. -type NameNormalizer interface { - Normalize(name string) string -} - -// DefaultNameNormalizer converts endpoint names so that they contain only characters -// from the safe charset [a-zA-Z0-9-./_]. All other characters are replaced with '-'. -var DefaultNameNormalizer = &SimpleNameNormalizer{ - SafeSets: []SafeCharacterSet{ - &Range{From: 'a', To: 'z'}, - &Range{From: 'A', To: 'Z'}, - &Range{From: '0', To: '9'}, - &Char{'-'}, - &Char{'_'}, - &Char{'/'}, - &Char{'.'}, - }, - Replacement: '-', -} - -// SimpleNameNormalizer uses a set of safe character sets. -type SimpleNameNormalizer struct { - SafeSets []SafeCharacterSet - Replacement byte -} - -// SafeCharacterSet determines if the given character is "safe" -type SafeCharacterSet interface { - IsSafe(c byte) bool -} - -// Range implements SafeCharacterSet -type Range struct { - From, To byte -} - -// IsSafe implements SafeCharacterSet -func (r *Range) IsSafe(c byte) bool { - return c >= r.From && c <= r.To -} - -// Char implements SafeCharacterSet -type Char struct { - Val byte -} - -// IsSafe implements SafeCharacterSet -func (ch *Char) IsSafe(c byte) bool { - return c == ch.Val -} - -// Normalize checks each character in the string against SafeSets, -// and if it's not safe substitutes it with Replacement. -func (n *SimpleNameNormalizer) Normalize(name string) string { - var retMe []byte - nameBytes := []byte(name) - for i, b := range nameBytes { - if n.safeByte(b) { - if retMe != nil { - retMe[i] = b - } - } else { - if retMe == nil { - retMe = make([]byte, len(nameBytes)) - copy(retMe[0:i], nameBytes[0:i]) - } - retMe[i] = n.Replacement - } - } - if retMe == nil { - return name - } - return string(retMe) -} - -// safeByte checks if b against all safe charsets. -func (n *SimpleNameNormalizer) safeByte(b byte) bool { - for i := range n.SafeSets { - if n.SafeSets[i].IsSafe(b) { - return true - } - } - return false -} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go deleted file mode 100644 index eca5ff6f3b98..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package rpcmetrics - -import ( - "strconv" - "sync" - "time" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - "github.com/uber/jaeger-lib/metrics" - - jaeger "github.com/uber/jaeger-client-go" -) - -const defaultMaxNumberOfEndpoints = 200 - -// Observer is an observer that can emit RPC metrics. -type Observer struct { - metricsByEndpoint *MetricsByEndpoint -} - -// NewObserver creates a new observer that can emit RPC metrics. -func NewObserver(metricsFactory metrics.Factory, normalizer NameNormalizer) *Observer { - return &Observer{ - metricsByEndpoint: newMetricsByEndpoint( - metricsFactory, - normalizer, - defaultMaxNumberOfEndpoints, - ), - } -} - -// OnStartSpan creates a new Observer for the span. -func (o *Observer) OnStartSpan( - operationName string, - options opentracing.StartSpanOptions, -) jaeger.SpanObserver { - return NewSpanObserver(o.metricsByEndpoint, operationName, options) -} - -// SpanKind identifies the span as inboud, outbound, or internal -type SpanKind int - -const ( - // Local span kind - Local SpanKind = iota - // Inbound span kind - Inbound - // Outbound span kind - Outbound -) - -// SpanObserver collects RPC metrics -type SpanObserver struct { - metricsByEndpoint *MetricsByEndpoint - operationName string - startTime time.Time - mux sync.Mutex - kind SpanKind - httpStatusCode uint16 - err bool -} - -// NewSpanObserver creates a new SpanObserver that can emit RPC metrics. -func NewSpanObserver( - metricsByEndpoint *MetricsByEndpoint, - operationName string, - options opentracing.StartSpanOptions, -) *SpanObserver { - so := &SpanObserver{ - metricsByEndpoint: metricsByEndpoint, - operationName: operationName, - startTime: options.StartTime, - } - for k, v := range options.Tags { - so.handleTagInLock(k, v) - } - return so -} - -// handleTags watches for special tags -// - SpanKind -// - HttpStatusCode -// - Error -func (so *SpanObserver) handleTagInLock(key string, value interface{}) { - if key == string(ext.SpanKind) { - if v, ok := value.(ext.SpanKindEnum); ok { - value = string(v) - } - if v, ok := value.(string); ok { - if v == string(ext.SpanKindRPCClientEnum) { - so.kind = Outbound - } else if v == string(ext.SpanKindRPCServerEnum) { - so.kind = Inbound - } - } - return - } - if key == string(ext.HTTPStatusCode) { - if v, ok := value.(uint16); ok { - so.httpStatusCode = v - } else if v, ok := value.(int); ok { - so.httpStatusCode = uint16(v) - } else if v, ok := value.(string); ok { - if vv, err := strconv.Atoi(v); err == nil { - so.httpStatusCode = uint16(vv) - } - } - return - } - if key == string(ext.Error) { - if v, ok := value.(bool); ok { - so.err = v - } else if v, ok := value.(string); ok { - if vv, err := strconv.ParseBool(v); err == nil { - so.err = vv - } - } - return - } -} - -// OnFinish emits the RPC metrics. It only has an effect when operation name -// is not blank, and the span kind is an RPC server. -func (so *SpanObserver) OnFinish(options opentracing.FinishOptions) { - so.mux.Lock() - defer so.mux.Unlock() - - if so.operationName == "" || so.kind != Inbound { - return - } - - mets := so.metricsByEndpoint.get(so.operationName) - latency := options.FinishTime.Sub(so.startTime) - if so.err { - mets.RequestCountFailures.Inc(1) - mets.RequestLatencyFailures.Record(latency) - } else { - mets.RequestCountSuccess.Inc(1) - mets.RequestLatencySuccess.Record(latency) - } - mets.recordHTTPStatusCode(so.httpStatusCode) -} - -// OnSetOperationName records new operation name. -func (so *SpanObserver) OnSetOperationName(operationName string) { - so.mux.Lock() - so.operationName = operationName - so.mux.Unlock() -} - -// OnSetTag implements SpanObserver -func (so *SpanObserver) OnSetTag(key string, value interface{}) { - so.mux.Lock() - so.handleTagInLock(key, value) - so.mux.Unlock() -} diff --git a/vendor/github.com/uber/jaeger-client-go/sampler.go b/vendor/github.com/uber/jaeger-client-go/sampler.go deleted file mode 100644 index e6a32b3837a6..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/sampler.go +++ /dev/null @@ -1,556 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "fmt" - "math" - "net/url" - "sync" - "sync/atomic" - "time" - - "github.com/uber/jaeger-client-go/log" - "github.com/uber/jaeger-client-go/thrift-gen/sampling" - "github.com/uber/jaeger-client-go/utils" -) - -const ( - defaultSamplingServerURL = "http://localhost:5778/sampling" - defaultSamplingRefreshInterval = time.Minute - defaultMaxOperations = 2000 -) - -// Sampler decides whether a new trace should be sampled or not. -type Sampler interface { - // IsSampled decides whether a trace with given `id` and `operation` - // should be sampled. This function will also return the tags that - // can be used to identify the type of sampling that was applied to - // the root span. Most simple samplers would return two tags, - // sampler.type and sampler.param, similar to those used in the Configuration - IsSampled(id TraceID, operation string) (sampled bool, tags []Tag) - - // Close does a clean shutdown of the sampler, stopping any background - // go-routines it may have started. - Close() - - // Equal checks if the `other` sampler is functionally equivalent - // to this sampler. - // TODO remove this function. This function is used to determine if 2 samplers are equivalent - // which does not bode well with the adaptive sampler which has to create all the composite samplers - // for the comparison to occur. This is expensive to do if only one sampler has changed. - Equal(other Sampler) bool -} - -// ----------------------- - -// ConstSampler is a sampler that always makes the same decision. -type ConstSampler struct { - Decision bool - tags []Tag -} - -// NewConstSampler creates a ConstSampler. -func NewConstSampler(sample bool) Sampler { - tags := []Tag{ - {key: SamplerTypeTagKey, value: SamplerTypeConst}, - {key: SamplerParamTagKey, value: sample}, - } - return &ConstSampler{Decision: sample, tags: tags} -} - -// IsSampled implements IsSampled() of Sampler. -func (s *ConstSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - return s.Decision, s.tags -} - -// Close implements Close() of Sampler. -func (s *ConstSampler) Close() { - // nothing to do -} - -// Equal implements Equal() of Sampler. -func (s *ConstSampler) Equal(other Sampler) bool { - if o, ok := other.(*ConstSampler); ok { - return s.Decision == o.Decision - } - return false -} - -// ----------------------- - -// ProbabilisticSampler is a sampler that randomly samples a certain percentage -// of traces. -type ProbabilisticSampler struct { - samplingRate float64 - samplingBoundary uint64 - tags []Tag -} - -const maxRandomNumber = ^(uint64(1) << 63) // i.e. 0x7fffffffffffffff - -// NewProbabilisticSampler creates a sampler that randomly samples a certain percentage of traces specified by the -// samplingRate, in the range between 0.0 and 1.0. -// -// It relies on the fact that new trace IDs are 63bit random numbers themselves, thus making the sampling decision -// without generating a new random number, but simply calculating if traceID < (samplingRate * 2^63). -// TODO remove the error from this function for next major release -func NewProbabilisticSampler(samplingRate float64) (*ProbabilisticSampler, error) { - if samplingRate < 0.0 || samplingRate > 1.0 { - return nil, fmt.Errorf("Sampling Rate must be between 0.0 and 1.0, received %f", samplingRate) - } - return newProbabilisticSampler(samplingRate), nil -} - -func newProbabilisticSampler(samplingRate float64) *ProbabilisticSampler { - samplingRate = math.Max(0.0, math.Min(samplingRate, 1.0)) - tags := []Tag{ - {key: SamplerTypeTagKey, value: SamplerTypeProbabilistic}, - {key: SamplerParamTagKey, value: samplingRate}, - } - return &ProbabilisticSampler{ - samplingRate: samplingRate, - samplingBoundary: uint64(float64(maxRandomNumber) * samplingRate), - tags: tags, - } -} - -// SamplingRate returns the sampling probability this sampled was constructed with. -func (s *ProbabilisticSampler) SamplingRate() float64 { - return s.samplingRate -} - -// IsSampled implements IsSampled() of Sampler. -func (s *ProbabilisticSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - return s.samplingBoundary >= id.Low, s.tags -} - -// Close implements Close() of Sampler. -func (s *ProbabilisticSampler) Close() { - // nothing to do -} - -// Equal implements Equal() of Sampler. -func (s *ProbabilisticSampler) Equal(other Sampler) bool { - if o, ok := other.(*ProbabilisticSampler); ok { - return s.samplingBoundary == o.samplingBoundary - } - return false -} - -// ----------------------- - -type rateLimitingSampler struct { - maxTracesPerSecond float64 - rateLimiter utils.RateLimiter - tags []Tag -} - -// NewRateLimitingSampler creates a sampler that samples at most maxTracesPerSecond. The distribution of sampled -// traces follows burstiness of the service, i.e. a service with uniformly distributed requests will have those -// requests sampled uniformly as well, but if requests are bursty, especially sub-second, then a number of -// sequential requests can be sampled each second. -func NewRateLimitingSampler(maxTracesPerSecond float64) Sampler { - tags := []Tag{ - {key: SamplerTypeTagKey, value: SamplerTypeRateLimiting}, - {key: SamplerParamTagKey, value: maxTracesPerSecond}, - } - return &rateLimitingSampler{ - maxTracesPerSecond: maxTracesPerSecond, - rateLimiter: utils.NewRateLimiter(maxTracesPerSecond, math.Max(maxTracesPerSecond, 1.0)), - tags: tags, - } -} - -// IsSampled implements IsSampled() of Sampler. -func (s *rateLimitingSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - return s.rateLimiter.CheckCredit(1.0), s.tags -} - -func (s *rateLimitingSampler) Close() { - // nothing to do -} - -func (s *rateLimitingSampler) Equal(other Sampler) bool { - if o, ok := other.(*rateLimitingSampler); ok { - return s.maxTracesPerSecond == o.maxTracesPerSecond - } - return false -} - -// ----------------------- - -// GuaranteedThroughputProbabilisticSampler is a sampler that leverages both probabilisticSampler and -// rateLimitingSampler. The rateLimitingSampler is used as a guaranteed lower bound sampler such that -// every operation is sampled at least once in a time interval defined by the lowerBound. ie a lowerBound -// of 1.0 / (60 * 10) will sample an operation at least once every 10 minutes. -// -// The probabilisticSampler is given higher priority when tags are emitted, ie. if IsSampled() for both -// samplers return true, the tags for probabilisticSampler will be used. -type GuaranteedThroughputProbabilisticSampler struct { - probabilisticSampler *ProbabilisticSampler - lowerBoundSampler Sampler - tags []Tag - samplingRate float64 - lowerBound float64 -} - -// NewGuaranteedThroughputProbabilisticSampler returns a delegating sampler that applies both -// probabilisticSampler and rateLimitingSampler. -func NewGuaranteedThroughputProbabilisticSampler( - lowerBound, samplingRate float64, -) (*GuaranteedThroughputProbabilisticSampler, error) { - return newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate), nil -} - -func newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate float64) *GuaranteedThroughputProbabilisticSampler { - s := &GuaranteedThroughputProbabilisticSampler{ - lowerBoundSampler: NewRateLimitingSampler(lowerBound), - lowerBound: lowerBound, - } - s.setProbabilisticSampler(samplingRate) - return s -} - -func (s *GuaranteedThroughputProbabilisticSampler) setProbabilisticSampler(samplingRate float64) { - if s.probabilisticSampler == nil || s.samplingRate != samplingRate { - s.probabilisticSampler = newProbabilisticSampler(samplingRate) - s.samplingRate = s.probabilisticSampler.SamplingRate() - s.tags = []Tag{ - {key: SamplerTypeTagKey, value: SamplerTypeLowerBound}, - {key: SamplerParamTagKey, value: s.samplingRate}, - } - } -} - -// IsSampled implements IsSampled() of Sampler. -func (s *GuaranteedThroughputProbabilisticSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - if sampled, tags := s.probabilisticSampler.IsSampled(id, operation); sampled { - s.lowerBoundSampler.IsSampled(id, operation) - return true, tags - } - sampled, _ := s.lowerBoundSampler.IsSampled(id, operation) - return sampled, s.tags -} - -// Close implements Close() of Sampler. -func (s *GuaranteedThroughputProbabilisticSampler) Close() { - s.probabilisticSampler.Close() - s.lowerBoundSampler.Close() -} - -// Equal implements Equal() of Sampler. -func (s *GuaranteedThroughputProbabilisticSampler) Equal(other Sampler) bool { - // NB The Equal() function is expensive and will be removed. See adaptiveSampler.Equal() for - // more information. - return false -} - -// this function should only be called while holding a Write lock -func (s *GuaranteedThroughputProbabilisticSampler) update(lowerBound, samplingRate float64) { - s.setProbabilisticSampler(samplingRate) - if s.lowerBound != lowerBound { - s.lowerBoundSampler = NewRateLimitingSampler(lowerBound) - s.lowerBound = lowerBound - } -} - -// ----------------------- - -type adaptiveSampler struct { - sync.RWMutex - - samplers map[string]*GuaranteedThroughputProbabilisticSampler - defaultSampler *ProbabilisticSampler - lowerBound float64 - maxOperations int -} - -// NewAdaptiveSampler returns a delegating sampler that applies both probabilisticSampler and -// rateLimitingSampler via the guaranteedThroughputProbabilisticSampler. This sampler keeps track of all -// operations and delegates calls to the respective guaranteedThroughputProbabilisticSampler. -func NewAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies, maxOperations int) (Sampler, error) { - return newAdaptiveSampler(strategies, maxOperations), nil -} - -func newAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies, maxOperations int) Sampler { - samplers := make(map[string]*GuaranteedThroughputProbabilisticSampler) - for _, strategy := range strategies.PerOperationStrategies { - sampler := newGuaranteedThroughputProbabilisticSampler( - strategies.DefaultLowerBoundTracesPerSecond, - strategy.ProbabilisticSampling.SamplingRate, - ) - samplers[strategy.Operation] = sampler - } - return &adaptiveSampler{ - samplers: samplers, - defaultSampler: newProbabilisticSampler(strategies.DefaultSamplingProbability), - lowerBound: strategies.DefaultLowerBoundTracesPerSecond, - maxOperations: maxOperations, - } -} - -func (s *adaptiveSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - s.RLock() - sampler, ok := s.samplers[operation] - if ok { - defer s.RUnlock() - return sampler.IsSampled(id, operation) - } - s.RUnlock() - s.Lock() - defer s.Unlock() - - // Check if sampler has already been created - sampler, ok = s.samplers[operation] - if ok { - return sampler.IsSampled(id, operation) - } - // Store only up to maxOperations of unique ops. - if len(s.samplers) >= s.maxOperations { - return s.defaultSampler.IsSampled(id, operation) - } - newSampler := newGuaranteedThroughputProbabilisticSampler(s.lowerBound, s.defaultSampler.SamplingRate()) - s.samplers[operation] = newSampler - return newSampler.IsSampled(id, operation) -} - -func (s *adaptiveSampler) Close() { - s.Lock() - defer s.Unlock() - for _, sampler := range s.samplers { - sampler.Close() - } - s.defaultSampler.Close() -} - -func (s *adaptiveSampler) Equal(other Sampler) bool { - // NB The Equal() function is overly expensive for adaptiveSampler since it's composed of multiple - // samplers which all need to be initialized before this function can be called for a comparison. - // Therefore, adaptiveSampler uses the update() function to only alter the samplers that need - // changing. Hence this function always returns false so that the update function can be called. - // Once the Equal() function is removed from the Sampler API, this will no longer be needed. - return false -} - -func (s *adaptiveSampler) update(strategies *sampling.PerOperationSamplingStrategies) { - s.Lock() - defer s.Unlock() - for _, strategy := range strategies.PerOperationStrategies { - operation := strategy.Operation - samplingRate := strategy.ProbabilisticSampling.SamplingRate - lowerBound := strategies.DefaultLowerBoundTracesPerSecond - if sampler, ok := s.samplers[operation]; ok { - sampler.update(lowerBound, samplingRate) - } else { - sampler := newGuaranteedThroughputProbabilisticSampler( - lowerBound, - samplingRate, - ) - s.samplers[operation] = sampler - } - } - s.lowerBound = strategies.DefaultLowerBoundTracesPerSecond - if s.defaultSampler.SamplingRate() != strategies.DefaultSamplingProbability { - s.defaultSampler = newProbabilisticSampler(strategies.DefaultSamplingProbability) - } -} - -// ----------------------- - -// RemotelyControlledSampler is a delegating sampler that polls a remote server -// for the appropriate sampling strategy, constructs a corresponding sampler and -// delegates to it for sampling decisions. -type RemotelyControlledSampler struct { - // These fields must be first in the struct because `sync/atomic` expects 64-bit alignment. - // Cf. https://github.com/uber/jaeger-client-go/issues/155, https://goo.gl/zW7dgq - closed int64 // 0 - not closed, 1 - closed - - sync.RWMutex - samplerOptions - - serviceName string - manager sampling.SamplingManager - doneChan chan *sync.WaitGroup -} - -type httpSamplingManager struct { - serverURL string -} - -func (s *httpSamplingManager) GetSamplingStrategy(serviceName string) (*sampling.SamplingStrategyResponse, error) { - var out sampling.SamplingStrategyResponse - v := url.Values{} - v.Set("service", serviceName) - if err := utils.GetJSON(s.serverURL+"?"+v.Encode(), &out); err != nil { - return nil, err - } - return &out, nil -} - -// NewRemotelyControlledSampler creates a sampler that periodically pulls -// the sampling strategy from an HTTP sampling server (e.g. jaeger-agent). -func NewRemotelyControlledSampler( - serviceName string, - opts ...SamplerOption, -) *RemotelyControlledSampler { - options := applySamplerOptions(opts...) - sampler := &RemotelyControlledSampler{ - samplerOptions: options, - serviceName: serviceName, - manager: &httpSamplingManager{serverURL: options.samplingServerURL}, - doneChan: make(chan *sync.WaitGroup), - } - go sampler.pollController() - return sampler -} - -func applySamplerOptions(opts ...SamplerOption) samplerOptions { - options := samplerOptions{} - for _, option := range opts { - option(&options) - } - if options.sampler == nil { - options.sampler = newProbabilisticSampler(0.001) - } - if options.logger == nil { - options.logger = log.NullLogger - } - if options.maxOperations <= 0 { - options.maxOperations = defaultMaxOperations - } - if options.samplingServerURL == "" { - options.samplingServerURL = defaultSamplingServerURL - } - if options.metrics == nil { - options.metrics = NewNullMetrics() - } - if options.samplingRefreshInterval <= 0 { - options.samplingRefreshInterval = defaultSamplingRefreshInterval - } - return options -} - -// IsSampled implements IsSampled() of Sampler. -func (s *RemotelyControlledSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - s.RLock() - defer s.RUnlock() - return s.sampler.IsSampled(id, operation) -} - -// Close implements Close() of Sampler. -func (s *RemotelyControlledSampler) Close() { - if swapped := atomic.CompareAndSwapInt64(&s.closed, 0, 1); !swapped { - s.logger.Error("Repeated attempt to close the sampler is ignored") - return - } - - var wg sync.WaitGroup - wg.Add(1) - s.doneChan <- &wg - wg.Wait() -} - -// Equal implements Equal() of Sampler. -func (s *RemotelyControlledSampler) Equal(other Sampler) bool { - // NB The Equal() function is expensive and will be removed. See adaptiveSampler.Equal() for - // more information. - if o, ok := other.(*RemotelyControlledSampler); ok { - s.RLock() - o.RLock() - defer s.RUnlock() - defer o.RUnlock() - return s.sampler.Equal(o.sampler) - } - return false -} - -func (s *RemotelyControlledSampler) pollController() { - ticker := time.NewTicker(s.samplingRefreshInterval) - defer ticker.Stop() - s.pollControllerWithTicker(ticker) -} - -func (s *RemotelyControlledSampler) pollControllerWithTicker(ticker *time.Ticker) { - for { - select { - case <-ticker.C: - s.updateSampler() - case wg := <-s.doneChan: - wg.Done() - return - } - } -} - -func (s *RemotelyControlledSampler) getSampler() Sampler { - s.Lock() - defer s.Unlock() - return s.sampler -} - -func (s *RemotelyControlledSampler) setSampler(sampler Sampler) { - s.Lock() - defer s.Unlock() - s.sampler = sampler -} - -func (s *RemotelyControlledSampler) updateSampler() { - res, err := s.manager.GetSamplingStrategy(s.serviceName) - if err != nil { - s.metrics.SamplerQueryFailure.Inc(1) - return - } - s.Lock() - defer s.Unlock() - - s.metrics.SamplerRetrieved.Inc(1) - if strategies := res.GetOperationSampling(); strategies != nil { - s.updateAdaptiveSampler(strategies) - } else { - err = s.updateRateLimitingOrProbabilisticSampler(res) - } - if err != nil { - s.metrics.SamplerUpdateFailure.Inc(1) - s.logger.Infof("Unable to handle sampling strategy response %+v. Got error: %v", res, err) - return - } - s.metrics.SamplerUpdated.Inc(1) -} - -// NB: this function should only be called while holding a Write lock -func (s *RemotelyControlledSampler) updateAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies) { - if adaptiveSampler, ok := s.sampler.(*adaptiveSampler); ok { - adaptiveSampler.update(strategies) - } else { - s.sampler = newAdaptiveSampler(strategies, s.maxOperations) - } -} - -// NB: this function should only be called while holding a Write lock -func (s *RemotelyControlledSampler) updateRateLimitingOrProbabilisticSampler(res *sampling.SamplingStrategyResponse) error { - var newSampler Sampler - if probabilistic := res.GetProbabilisticSampling(); probabilistic != nil { - newSampler = newProbabilisticSampler(probabilistic.SamplingRate) - } else if rateLimiting := res.GetRateLimitingSampling(); rateLimiting != nil { - newSampler = NewRateLimitingSampler(float64(rateLimiting.MaxTracesPerSecond)) - } else { - return fmt.Errorf("Unsupported sampling strategy type %v", res.GetStrategyType()) - } - if !s.sampler.Equal(newSampler) { - s.sampler = newSampler - } - return nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/sampler_options.go b/vendor/github.com/uber/jaeger-client-go/sampler_options.go deleted file mode 100644 index 75d28a561190..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/sampler_options.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "time" -) - -// SamplerOption is a function that sets some option on the sampler -type SamplerOption func(options *samplerOptions) - -// SamplerOptions is a factory for all available SamplerOption's -var SamplerOptions samplerOptions - -type samplerOptions struct { - metrics *Metrics - maxOperations int - sampler Sampler - logger Logger - samplingServerURL string - samplingRefreshInterval time.Duration -} - -// Metrics creates a SamplerOption that initializes Metrics on the sampler, -// which is used to emit statistics. -func (samplerOptions) Metrics(m *Metrics) SamplerOption { - return func(o *samplerOptions) { - o.metrics = m - } -} - -// MaxOperations creates a SamplerOption that sets the maximum number of -// operations the sampler will keep track of. -func (samplerOptions) MaxOperations(maxOperations int) SamplerOption { - return func(o *samplerOptions) { - o.maxOperations = maxOperations - } -} - -// InitialSampler creates a SamplerOption that sets the initial sampler -// to use before a remote sampler is created and used. -func (samplerOptions) InitialSampler(sampler Sampler) SamplerOption { - return func(o *samplerOptions) { - o.sampler = sampler - } -} - -// Logger creates a SamplerOption that sets the logger used by the sampler. -func (samplerOptions) Logger(logger Logger) SamplerOption { - return func(o *samplerOptions) { - o.logger = logger - } -} - -// SamplingServerURL creates a SamplerOption that sets the sampling server url -// of the local agent that contains the sampling strategies. -func (samplerOptions) SamplingServerURL(samplingServerURL string) SamplerOption { - return func(o *samplerOptions) { - o.samplingServerURL = samplingServerURL - } -} - -// SamplingRefreshInterval creates a SamplerOption that sets how often the -// sampler will poll local agent for the appropriate sampling strategy. -func (samplerOptions) SamplingRefreshInterval(samplingRefreshInterval time.Duration) SamplerOption { - return func(o *samplerOptions) { - o.samplingRefreshInterval = samplingRefreshInterval - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/span.go b/vendor/github.com/uber/jaeger-client-go/span.go deleted file mode 100644 index f0b497a90a4d..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/span.go +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright (c) 2017-2018 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "sync" - "time" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - "github.com/opentracing/opentracing-go/log" -) - -// Span implements opentracing.Span -type Span struct { - sync.RWMutex - - tracer *Tracer - - context SpanContext - - // The name of the "operation" this span is an instance of. - // Known as a "span name" in some implementations. - operationName string - - // firstInProcess, if true, indicates that this span is the root of the (sub)tree - // of spans in the current process. In other words it's true for the root spans, - // and the ingress spans when the process joins another trace. - firstInProcess bool - - // startTime is the timestamp indicating when the span began, with microseconds precision. - startTime time.Time - - // duration returns duration of the span with microseconds precision. - // Zero value means duration is unknown. - duration time.Duration - - // tags attached to this span - tags []Tag - - // The span's "micro-log" - logs []opentracing.LogRecord - - // references for this span - references []Reference - - observer ContribSpanObserver -} - -// Tag is a simple key value wrapper. -// TODO deprecate in the next major release, use opentracing.Tag instead. -type Tag struct { - key string - value interface{} -} - -// SetOperationName sets or changes the operation name. -func (s *Span) SetOperationName(operationName string) opentracing.Span { - s.Lock() - defer s.Unlock() - if s.context.IsSampled() { - s.operationName = operationName - } - s.observer.OnSetOperationName(operationName) - return s -} - -// SetTag implements SetTag() of opentracing.Span -func (s *Span) SetTag(key string, value interface{}) opentracing.Span { - s.observer.OnSetTag(key, value) - if key == string(ext.SamplingPriority) && !setSamplingPriority(s, value) { - return s - } - s.Lock() - defer s.Unlock() - if s.context.IsSampled() { - s.setTagNoLocking(key, value) - } - return s -} - -func (s *Span) setTagNoLocking(key string, value interface{}) { - s.tags = append(s.tags, Tag{key: key, value: value}) -} - -// LogFields implements opentracing.Span API -func (s *Span) LogFields(fields ...log.Field) { - s.Lock() - defer s.Unlock() - if !s.context.IsSampled() { - return - } - s.logFieldsNoLocking(fields...) -} - -// this function should only be called while holding a Write lock -func (s *Span) logFieldsNoLocking(fields ...log.Field) { - lr := opentracing.LogRecord{ - Fields: fields, - Timestamp: time.Now(), - } - s.appendLog(lr) -} - -// LogKV implements opentracing.Span API -func (s *Span) LogKV(alternatingKeyValues ...interface{}) { - s.RLock() - sampled := s.context.IsSampled() - s.RUnlock() - if !sampled { - return - } - fields, err := log.InterleavedKVToFields(alternatingKeyValues...) - if err != nil { - s.LogFields(log.Error(err), log.String("function", "LogKV")) - return - } - s.LogFields(fields...) -} - -// LogEvent implements opentracing.Span API -func (s *Span) LogEvent(event string) { - s.Log(opentracing.LogData{Event: event}) -} - -// LogEventWithPayload implements opentracing.Span API -func (s *Span) LogEventWithPayload(event string, payload interface{}) { - s.Log(opentracing.LogData{Event: event, Payload: payload}) -} - -// Log implements opentracing.Span API -func (s *Span) Log(ld opentracing.LogData) { - s.Lock() - defer s.Unlock() - if s.context.IsSampled() { - if ld.Timestamp.IsZero() { - ld.Timestamp = s.tracer.timeNow() - } - s.appendLog(ld.ToLogRecord()) - } -} - -// this function should only be called while holding a Write lock -func (s *Span) appendLog(lr opentracing.LogRecord) { - // TODO add logic to limit number of logs per span (issue #46) - s.logs = append(s.logs, lr) -} - -// SetBaggageItem implements SetBaggageItem() of opentracing.SpanContext -func (s *Span) SetBaggageItem(key, value string) opentracing.Span { - s.Lock() - defer s.Unlock() - s.tracer.setBaggage(s, key, value) - return s -} - -// BaggageItem implements BaggageItem() of opentracing.SpanContext -func (s *Span) BaggageItem(key string) string { - s.RLock() - defer s.RUnlock() - return s.context.baggage[key] -} - -// Finish implements opentracing.Span API -func (s *Span) Finish() { - s.FinishWithOptions(opentracing.FinishOptions{}) -} - -// FinishWithOptions implements opentracing.Span API -func (s *Span) FinishWithOptions(options opentracing.FinishOptions) { - if options.FinishTime.IsZero() { - options.FinishTime = s.tracer.timeNow() - } - s.observer.OnFinish(options) - s.Lock() - if s.context.IsSampled() { - s.duration = options.FinishTime.Sub(s.startTime) - // Note: bulk logs are not subject to maxLogsPerSpan limit - if options.LogRecords != nil { - s.logs = append(s.logs, options.LogRecords...) - } - for _, ld := range options.BulkLogData { - s.logs = append(s.logs, ld.ToLogRecord()) - } - } - s.Unlock() - // call reportSpan even for non-sampled traces, to return span to the pool - s.tracer.reportSpan(s) -} - -// Context implements opentracing.Span API -func (s *Span) Context() opentracing.SpanContext { - s.Lock() - defer s.Unlock() - return s.context -} - -// Tracer implements opentracing.Span API -func (s *Span) Tracer() opentracing.Tracer { - return s.tracer -} - -func (s *Span) String() string { - s.RLock() - defer s.RUnlock() - return s.context.String() -} - -// OperationName allows retrieving current operation name. -func (s *Span) OperationName() string { - s.RLock() - defer s.RUnlock() - return s.operationName -} - -func (s *Span) serviceName() string { - return s.tracer.serviceName -} - -// setSamplingPriority returns true if the flag was updated successfully, false otherwise. -func setSamplingPriority(s *Span, value interface{}) bool { - s.Lock() - defer s.Unlock() - val, ok := value.(uint16) - if !ok { - return false - } - if val == 0 { - s.context.flags = s.context.flags & (^flagSampled) - return true - } - if s.tracer.isDebugAllowed(s.operationName) { - s.context.flags = s.context.flags | flagDebug | flagSampled - return true - } - return false -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go deleted file mode 100644 index e48811c500af..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go +++ /dev/null @@ -1,411 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package agent - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" - "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var _ = jaeger.GoUnusedProtection__ -var _ = zipkincore.GoUnusedProtection__ - -type Agent interface { - // Parameters: - // - Spans - EmitZipkinBatch(spans []*zipkincore.Span) (err error) - // Parameters: - // - Batch - EmitBatch(batch *jaeger.Batch) (err error) -} - -type AgentClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewAgentClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *AgentClient { - return &AgentClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewAgentClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *AgentClient { - return &AgentClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// Parameters: -// - Spans -func (p *AgentClient) EmitZipkinBatch(spans []*zipkincore.Span) (err error) { - if err = p.sendEmitZipkinBatch(spans); err != nil { - return - } - return -} - -func (p *AgentClient) sendEmitZipkinBatch(spans []*zipkincore.Span) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("emitZipkinBatch", thrift.ONEWAY, p.SeqId); err != nil { - return - } - args := AgentEmitZipkinBatchArgs{ - Spans: spans, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -// Parameters: -// - Batch -func (p *AgentClient) EmitBatch(batch *jaeger.Batch) (err error) { - if err = p.sendEmitBatch(batch); err != nil { - return - } - return -} - -func (p *AgentClient) sendEmitBatch(batch *jaeger.Batch) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("emitBatch", thrift.ONEWAY, p.SeqId); err != nil { - return - } - args := AgentEmitBatchArgs{ - Batch: batch, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -type AgentProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler Agent -} - -func (p *AgentProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *AgentProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *AgentProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewAgentProcessor(handler Agent) *AgentProcessor { - - self0 := &AgentProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self0.processorMap["emitZipkinBatch"] = &agentProcessorEmitZipkinBatch{handler: handler} - self0.processorMap["emitBatch"] = &agentProcessorEmitBatch{handler: handler} - return self0 -} - -func (p *AgentProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x1 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x1.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x1 - -} - -type agentProcessorEmitZipkinBatch struct { - handler Agent -} - -func (p *agentProcessorEmitZipkinBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := AgentEmitZipkinBatchArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - return false, err - } - - iprot.ReadMessageEnd() - var err2 error - if err2 = p.handler.EmitZipkinBatch(args.Spans); err2 != nil { - return true, err2 - } - return true, nil -} - -type agentProcessorEmitBatch struct { - handler Agent -} - -func (p *agentProcessorEmitBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := AgentEmitBatchArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - return false, err - } - - iprot.ReadMessageEnd() - var err2 error - if err2 = p.handler.EmitBatch(args.Batch); err2 != nil { - return true, err2 - } - return true, nil -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - Spans -type AgentEmitZipkinBatchArgs struct { - Spans []*zipkincore.Span `thrift:"spans,1" json:"spans"` -} - -func NewAgentEmitZipkinBatchArgs() *AgentEmitZipkinBatchArgs { - return &AgentEmitZipkinBatchArgs{} -} - -func (p *AgentEmitZipkinBatchArgs) GetSpans() []*zipkincore.Span { - return p.Spans -} -func (p *AgentEmitZipkinBatchArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AgentEmitZipkinBatchArgs) readField1(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*zipkincore.Span, 0, size) - p.Spans = tSlice - for i := 0; i < size; i++ { - _elem2 := &zipkincore.Span{} - if err := _elem2.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem2), err) - } - p.Spans = append(p.Spans, _elem2) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *AgentEmitZipkinBatchArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("emitZipkinBatch_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *AgentEmitZipkinBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spans", thrift.LIST, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:spans: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Spans { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:spans: ", p), err) - } - return err -} - -func (p *AgentEmitZipkinBatchArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AgentEmitZipkinBatchArgs(%+v)", *p) -} - -// Attributes: -// - Batch -type AgentEmitBatchArgs struct { - Batch *jaeger.Batch `thrift:"batch,1" json:"batch"` -} - -func NewAgentEmitBatchArgs() *AgentEmitBatchArgs { - return &AgentEmitBatchArgs{} -} - -var AgentEmitBatchArgs_Batch_DEFAULT *jaeger.Batch - -func (p *AgentEmitBatchArgs) GetBatch() *jaeger.Batch { - if !p.IsSetBatch() { - return AgentEmitBatchArgs_Batch_DEFAULT - } - return p.Batch -} -func (p *AgentEmitBatchArgs) IsSetBatch() bool { - return p.Batch != nil -} - -func (p *AgentEmitBatchArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AgentEmitBatchArgs) readField1(iprot thrift.TProtocol) error { - p.Batch = &jaeger.Batch{} - if err := p.Batch.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Batch), err) - } - return nil -} - -func (p *AgentEmitBatchArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("emitBatch_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *AgentEmitBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("batch", thrift.STRUCT, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:batch: ", p), err) - } - if err := p.Batch.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Batch), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:batch: ", p), err) - } - return err -} - -func (p *AgentEmitBatchArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AgentEmitBatchArgs(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go deleted file mode 100644 index aa9857bb82ac..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go +++ /dev/null @@ -1,23 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package agent - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" - "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var _ = jaeger.GoUnusedProtection__ -var _ = zipkincore.GoUnusedProtection__ - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go deleted file mode 100644 index 9c28f11c1ac7..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go +++ /dev/null @@ -1,21 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package agent - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" - "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var _ = jaeger.GoUnusedProtection__ -var _ = zipkincore.GoUnusedProtection__ -var GoUnusedProtection__ int diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go deleted file mode 100644 index 1f79c1255cb1..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go +++ /dev/null @@ -1,435 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package baggage - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -type BaggageRestrictionManager interface { - // getBaggageRestrictions retrieves the baggage restrictions for a specific service. - // Usually, baggageRestrictions apply to all services however there may be situations - // where a baggageKey might only be allowed to be set by a specific service. - // - // Parameters: - // - ServiceName - GetBaggageRestrictions(serviceName string) (r []*BaggageRestriction, err error) -} - -type BaggageRestrictionManagerClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewBaggageRestrictionManagerClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *BaggageRestrictionManagerClient { - return &BaggageRestrictionManagerClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewBaggageRestrictionManagerClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *BaggageRestrictionManagerClient { - return &BaggageRestrictionManagerClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// getBaggageRestrictions retrieves the baggage restrictions for a specific service. -// Usually, baggageRestrictions apply to all services however there may be situations -// where a baggageKey might only be allowed to be set by a specific service. -// -// Parameters: -// - ServiceName -func (p *BaggageRestrictionManagerClient) GetBaggageRestrictions(serviceName string) (r []*BaggageRestriction, err error) { - if err = p.sendGetBaggageRestrictions(serviceName); err != nil { - return - } - return p.recvGetBaggageRestrictions() -} - -func (p *BaggageRestrictionManagerClient) sendGetBaggageRestrictions(serviceName string) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("getBaggageRestrictions", thrift.CALL, p.SeqId); err != nil { - return - } - args := BaggageRestrictionManagerGetBaggageRestrictionsArgs{ - ServiceName: serviceName, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -func (p *BaggageRestrictionManagerClient) recvGetBaggageRestrictions() (value []*BaggageRestriction, err error) { - iprot := p.InputProtocol - if iprot == nil { - iprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.InputProtocol = iprot - } - method, mTypeId, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return - } - if method != "getBaggageRestrictions" { - err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getBaggageRestrictions failed: wrong method name") - return - } - if p.SeqId != seqId { - err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getBaggageRestrictions failed: out of sequence response") - return - } - if mTypeId == thrift.EXCEPTION { - error0 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error1 error - error1, err = error0.Read(iprot) - if err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - err = error1 - return - } - if mTypeId != thrift.REPLY { - err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getBaggageRestrictions failed: invalid message type") - return - } - result := BaggageRestrictionManagerGetBaggageRestrictionsResult{} - if err = result.Read(iprot); err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - value = result.GetSuccess() - return -} - -type BaggageRestrictionManagerProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler BaggageRestrictionManager -} - -func (p *BaggageRestrictionManagerProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *BaggageRestrictionManagerProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *BaggageRestrictionManagerProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewBaggageRestrictionManagerProcessor(handler BaggageRestrictionManager) *BaggageRestrictionManagerProcessor { - - self2 := &BaggageRestrictionManagerProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self2.processorMap["getBaggageRestrictions"] = &baggageRestrictionManagerProcessorGetBaggageRestrictions{handler: handler} - return self2 -} - -func (p *BaggageRestrictionManagerProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x3 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x3.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x3 - -} - -type baggageRestrictionManagerProcessorGetBaggageRestrictions struct { - handler BaggageRestrictionManager -} - -func (p *baggageRestrictionManagerProcessorGetBaggageRestrictions) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := BaggageRestrictionManagerGetBaggageRestrictionsArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) - oprot.WriteMessageBegin("getBaggageRestrictions", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, err - } - - iprot.ReadMessageEnd() - result := BaggageRestrictionManagerGetBaggageRestrictionsResult{} - var retval []*BaggageRestriction - var err2 error - if retval, err2 = p.handler.GetBaggageRestrictions(args.ServiceName); err2 != nil { - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getBaggageRestrictions: "+err2.Error()) - oprot.WriteMessageBegin("getBaggageRestrictions", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return true, err2 - } else { - result.Success = retval - } - if err2 = oprot.WriteMessageBegin("getBaggageRestrictions", thrift.REPLY, seqId); err2 != nil { - err = err2 - } - if err2 = result.Write(oprot); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.Flush(); err == nil && err2 != nil { - err = err2 - } - if err != nil { - return - } - return true, err -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - ServiceName -type BaggageRestrictionManagerGetBaggageRestrictionsArgs struct { - ServiceName string `thrift:"serviceName,1" json:"serviceName"` -} - -func NewBaggageRestrictionManagerGetBaggageRestrictionsArgs() *BaggageRestrictionManagerGetBaggageRestrictionsArgs { - return &BaggageRestrictionManagerGetBaggageRestrictionsArgs{} -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) GetServiceName() string { - return p.ServiceName -} -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.ServiceName = v - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("getBaggageRestrictions_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("serviceName", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:serviceName: ", p), err) - } - if err := oprot.WriteString(string(p.ServiceName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.serviceName (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:serviceName: ", p), err) - } - return err -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BaggageRestrictionManagerGetBaggageRestrictionsArgs(%+v)", *p) -} - -// Attributes: -// - Success -type BaggageRestrictionManagerGetBaggageRestrictionsResult struct { - Success []*BaggageRestriction `thrift:"success,0" json:"success,omitempty"` -} - -func NewBaggageRestrictionManagerGetBaggageRestrictionsResult() *BaggageRestrictionManagerGetBaggageRestrictionsResult { - return &BaggageRestrictionManagerGetBaggageRestrictionsResult{} -} - -var BaggageRestrictionManagerGetBaggageRestrictionsResult_Success_DEFAULT []*BaggageRestriction - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) GetSuccess() []*BaggageRestriction { - return p.Success -} -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) IsSetSuccess() bool { - return p.Success != nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 0: - if err := p.readField0(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) readField0(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*BaggageRestriction, 0, size) - p.Success = tSlice - for i := 0; i < size; i++ { - _elem4 := &BaggageRestriction{} - if err := _elem4.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem4), err) - } - p.Success = append(p.Success, _elem4) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("getBaggageRestrictions_result"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField0(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) writeField0(oprot thrift.TProtocol) (err error) { - if p.IsSetSuccess() { - if err := oprot.WriteFieldBegin("success", thrift.LIST, 0); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Success)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Success { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) - } - } - return err -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BaggageRestrictionManagerGetBaggageRestrictionsResult(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go deleted file mode 100644 index ed35ce9ab514..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go +++ /dev/null @@ -1,18 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package baggage - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go deleted file mode 100644 index 7888892f633f..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go +++ /dev/null @@ -1,154 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package baggage - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var GoUnusedProtection__ int - -// Attributes: -// - BaggageKey -// - MaxValueLength -type BaggageRestriction struct { - BaggageKey string `thrift:"baggageKey,1,required" json:"baggageKey"` - MaxValueLength int32 `thrift:"maxValueLength,2,required" json:"maxValueLength"` -} - -func NewBaggageRestriction() *BaggageRestriction { - return &BaggageRestriction{} -} - -func (p *BaggageRestriction) GetBaggageKey() string { - return p.BaggageKey -} - -func (p *BaggageRestriction) GetMaxValueLength() int32 { - return p.MaxValueLength -} -func (p *BaggageRestriction) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetBaggageKey bool = false - var issetMaxValueLength bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetBaggageKey = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetMaxValueLength = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetBaggageKey { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field BaggageKey is not set")) - } - if !issetMaxValueLength { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MaxValueLength is not set")) - } - return nil -} - -func (p *BaggageRestriction) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.BaggageKey = v - } - return nil -} - -func (p *BaggageRestriction) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.MaxValueLength = v - } - return nil -} - -func (p *BaggageRestriction) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("BaggageRestriction"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BaggageRestriction) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("baggageKey", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:baggageKey: ", p), err) - } - if err := oprot.WriteString(string(p.BaggageKey)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.baggageKey (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:baggageKey: ", p), err) - } - return err -} - -func (p *BaggageRestriction) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("maxValueLength", thrift.I32, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:maxValueLength: ", p), err) - } - if err := oprot.WriteI32(int32(p.MaxValueLength)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.maxValueLength (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:maxValueLength: ", p), err) - } - return err -} - -func (p *BaggageRestriction) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BaggageRestriction(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go deleted file mode 100644 index b32c37dd2615..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go +++ /dev/null @@ -1,242 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package jaeger - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -type Agent interface { - // Parameters: - // - Batch - EmitBatch(batch *Batch) (err error) -} - -type AgentClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewAgentClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *AgentClient { - return &AgentClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewAgentClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *AgentClient { - return &AgentClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// Parameters: -// - Batch -func (p *AgentClient) EmitBatch(batch *Batch) (err error) { - if err = p.sendEmitBatch(batch); err != nil { - return - } - return -} - -func (p *AgentClient) sendEmitBatch(batch *Batch) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("emitBatch", thrift.ONEWAY, p.SeqId); err != nil { - return - } - args := AgentEmitBatchArgs{ - Batch: batch, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -type AgentProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler Agent -} - -func (p *AgentProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *AgentProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *AgentProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewAgentProcessor(handler Agent) *AgentProcessor { - - self6 := &AgentProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self6.processorMap["emitBatch"] = &agentProcessorEmitBatch{handler: handler} - return self6 -} - -func (p *AgentProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x7 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x7.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x7 - -} - -type agentProcessorEmitBatch struct { - handler Agent -} - -func (p *agentProcessorEmitBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := AgentEmitBatchArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - return false, err - } - - iprot.ReadMessageEnd() - var err2 error - if err2 = p.handler.EmitBatch(args.Batch); err2 != nil { - return true, err2 - } - return true, nil -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - Batch -type AgentEmitBatchArgs struct { - Batch *Batch `thrift:"batch,1" json:"batch"` -} - -func NewAgentEmitBatchArgs() *AgentEmitBatchArgs { - return &AgentEmitBatchArgs{} -} - -var AgentEmitBatchArgs_Batch_DEFAULT *Batch - -func (p *AgentEmitBatchArgs) GetBatch() *Batch { - if !p.IsSetBatch() { - return AgentEmitBatchArgs_Batch_DEFAULT - } - return p.Batch -} -func (p *AgentEmitBatchArgs) IsSetBatch() bool { - return p.Batch != nil -} - -func (p *AgentEmitBatchArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AgentEmitBatchArgs) readField1(iprot thrift.TProtocol) error { - p.Batch = &Batch{} - if err := p.Batch.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Batch), err) - } - return nil -} - -func (p *AgentEmitBatchArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("emitBatch_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *AgentEmitBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("batch", thrift.STRUCT, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:batch: ", p), err) - } - if err := p.Batch.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Batch), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:batch: ", p), err) - } - return err -} - -func (p *AgentEmitBatchArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AgentEmitBatchArgs(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go deleted file mode 100644 index 621b8b1c20f4..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go +++ /dev/null @@ -1,18 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package jaeger - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go deleted file mode 100644 index d23ed2fc2839..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go +++ /dev/null @@ -1,1838 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package jaeger - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var GoUnusedProtection__ int - -type TagType int64 - -const ( - TagType_STRING TagType = 0 - TagType_DOUBLE TagType = 1 - TagType_BOOL TagType = 2 - TagType_LONG TagType = 3 - TagType_BINARY TagType = 4 -) - -func (p TagType) String() string { - switch p { - case TagType_STRING: - return "STRING" - case TagType_DOUBLE: - return "DOUBLE" - case TagType_BOOL: - return "BOOL" - case TagType_LONG: - return "LONG" - case TagType_BINARY: - return "BINARY" - } - return "" -} - -func TagTypeFromString(s string) (TagType, error) { - switch s { - case "STRING": - return TagType_STRING, nil - case "DOUBLE": - return TagType_DOUBLE, nil - case "BOOL": - return TagType_BOOL, nil - case "LONG": - return TagType_LONG, nil - case "BINARY": - return TagType_BINARY, nil - } - return TagType(0), fmt.Errorf("not a valid TagType string") -} - -func TagTypePtr(v TagType) *TagType { return &v } - -func (p TagType) MarshalText() ([]byte, error) { - return []byte(p.String()), nil -} - -func (p *TagType) UnmarshalText(text []byte) error { - q, err := TagTypeFromString(string(text)) - if err != nil { - return err - } - *p = q - return nil -} - -type SpanRefType int64 - -const ( - SpanRefType_CHILD_OF SpanRefType = 0 - SpanRefType_FOLLOWS_FROM SpanRefType = 1 -) - -func (p SpanRefType) String() string { - switch p { - case SpanRefType_CHILD_OF: - return "CHILD_OF" - case SpanRefType_FOLLOWS_FROM: - return "FOLLOWS_FROM" - } - return "" -} - -func SpanRefTypeFromString(s string) (SpanRefType, error) { - switch s { - case "CHILD_OF": - return SpanRefType_CHILD_OF, nil - case "FOLLOWS_FROM": - return SpanRefType_FOLLOWS_FROM, nil - } - return SpanRefType(0), fmt.Errorf("not a valid SpanRefType string") -} - -func SpanRefTypePtr(v SpanRefType) *SpanRefType { return &v } - -func (p SpanRefType) MarshalText() ([]byte, error) { - return []byte(p.String()), nil -} - -func (p *SpanRefType) UnmarshalText(text []byte) error { - q, err := SpanRefTypeFromString(string(text)) - if err != nil { - return err - } - *p = q - return nil -} - -// Attributes: -// - Key -// - VType -// - VStr -// - VDouble -// - VBool -// - VLong -// - VBinary -type Tag struct { - Key string `thrift:"key,1,required" json:"key"` - VType TagType `thrift:"vType,2,required" json:"vType"` - VStr *string `thrift:"vStr,3" json:"vStr,omitempty"` - VDouble *float64 `thrift:"vDouble,4" json:"vDouble,omitempty"` - VBool *bool `thrift:"vBool,5" json:"vBool,omitempty"` - VLong *int64 `thrift:"vLong,6" json:"vLong,omitempty"` - VBinary []byte `thrift:"vBinary,7" json:"vBinary,omitempty"` -} - -func NewTag() *Tag { - return &Tag{} -} - -func (p *Tag) GetKey() string { - return p.Key -} - -func (p *Tag) GetVType() TagType { - return p.VType -} - -var Tag_VStr_DEFAULT string - -func (p *Tag) GetVStr() string { - if !p.IsSetVStr() { - return Tag_VStr_DEFAULT - } - return *p.VStr -} - -var Tag_VDouble_DEFAULT float64 - -func (p *Tag) GetVDouble() float64 { - if !p.IsSetVDouble() { - return Tag_VDouble_DEFAULT - } - return *p.VDouble -} - -var Tag_VBool_DEFAULT bool - -func (p *Tag) GetVBool() bool { - if !p.IsSetVBool() { - return Tag_VBool_DEFAULT - } - return *p.VBool -} - -var Tag_VLong_DEFAULT int64 - -func (p *Tag) GetVLong() int64 { - if !p.IsSetVLong() { - return Tag_VLong_DEFAULT - } - return *p.VLong -} - -var Tag_VBinary_DEFAULT []byte - -func (p *Tag) GetVBinary() []byte { - return p.VBinary -} -func (p *Tag) IsSetVStr() bool { - return p.VStr != nil -} - -func (p *Tag) IsSetVDouble() bool { - return p.VDouble != nil -} - -func (p *Tag) IsSetVBool() bool { - return p.VBool != nil -} - -func (p *Tag) IsSetVLong() bool { - return p.VLong != nil -} - -func (p *Tag) IsSetVBinary() bool { - return p.VBinary != nil -} - -func (p *Tag) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetKey bool = false - var issetVType bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetKey = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetVType = true - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - case 5: - if err := p.readField5(iprot); err != nil { - return err - } - case 6: - if err := p.readField6(iprot); err != nil { - return err - } - case 7: - if err := p.readField7(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetKey { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Key is not set")) - } - if !issetVType { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field VType is not set")) - } - return nil -} - -func (p *Tag) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Key = v - } - return nil -} - -func (p *Tag) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - temp := TagType(v) - p.VType = temp - } - return nil -} - -func (p *Tag) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.VStr = &v - } - return nil -} - -func (p *Tag) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.VDouble = &v - } - return nil -} - -func (p *Tag) readField5(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 5: ", err) - } else { - p.VBool = &v - } - return nil -} - -func (p *Tag) readField6(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 6: ", err) - } else { - p.VLong = &v - } - return nil -} - -func (p *Tag) readField7(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBinary(); err != nil { - return thrift.PrependError("error reading field 7: ", err) - } else { - p.VBinary = v - } - return nil -} - -func (p *Tag) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Tag"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := p.writeField5(oprot); err != nil { - return err - } - if err := p.writeField6(oprot); err != nil { - return err - } - if err := p.writeField7(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Tag) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("key", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:key: ", p), err) - } - if err := oprot.WriteString(string(p.Key)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.key (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:key: ", p), err) - } - return err -} - -func (p *Tag) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("vType", thrift.I32, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:vType: ", p), err) - } - if err := oprot.WriteI32(int32(p.VType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vType (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:vType: ", p), err) - } - return err -} - -func (p *Tag) writeField3(oprot thrift.TProtocol) (err error) { - if p.IsSetVStr() { - if err := oprot.WriteFieldBegin("vStr", thrift.STRING, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:vStr: ", p), err) - } - if err := oprot.WriteString(string(*p.VStr)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vStr (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:vStr: ", p), err) - } - } - return err -} - -func (p *Tag) writeField4(oprot thrift.TProtocol) (err error) { - if p.IsSetVDouble() { - if err := oprot.WriteFieldBegin("vDouble", thrift.DOUBLE, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:vDouble: ", p), err) - } - if err := oprot.WriteDouble(float64(*p.VDouble)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vDouble (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:vDouble: ", p), err) - } - } - return err -} - -func (p *Tag) writeField5(oprot thrift.TProtocol) (err error) { - if p.IsSetVBool() { - if err := oprot.WriteFieldBegin("vBool", thrift.BOOL, 5); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:vBool: ", p), err) - } - if err := oprot.WriteBool(bool(*p.VBool)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vBool (5) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 5:vBool: ", p), err) - } - } - return err -} - -func (p *Tag) writeField6(oprot thrift.TProtocol) (err error) { - if p.IsSetVLong() { - if err := oprot.WriteFieldBegin("vLong", thrift.I64, 6); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:vLong: ", p), err) - } - if err := oprot.WriteI64(int64(*p.VLong)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vLong (6) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 6:vLong: ", p), err) - } - } - return err -} - -func (p *Tag) writeField7(oprot thrift.TProtocol) (err error) { - if p.IsSetVBinary() { - if err := oprot.WriteFieldBegin("vBinary", thrift.STRING, 7); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:vBinary: ", p), err) - } - if err := oprot.WriteBinary(p.VBinary); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vBinary (7) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 7:vBinary: ", p), err) - } - } - return err -} - -func (p *Tag) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Tag(%+v)", *p) -} - -// Attributes: -// - Timestamp -// - Fields -type Log struct { - Timestamp int64 `thrift:"timestamp,1,required" json:"timestamp"` - Fields []*Tag `thrift:"fields,2,required" json:"fields"` -} - -func NewLog() *Log { - return &Log{} -} - -func (p *Log) GetTimestamp() int64 { - return p.Timestamp -} - -func (p *Log) GetFields() []*Tag { - return p.Fields -} -func (p *Log) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetTimestamp bool = false - var issetFields bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetTimestamp = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetFields = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetTimestamp { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamp is not set")) - } - if !issetFields { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Fields is not set")) - } - return nil -} - -func (p *Log) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Timestamp = v - } - return nil -} - -func (p *Log) readField2(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Tag, 0, size) - p.Fields = tSlice - for i := 0; i < size; i++ { - _elem0 := &Tag{} - if err := _elem0.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) - } - p.Fields = append(p.Fields, _elem0) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Log) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Log"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Log) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:timestamp: ", p), err) - } - if err := oprot.WriteI64(int64(p.Timestamp)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.timestamp (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:timestamp: ", p), err) - } - return err -} - -func (p *Log) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("fields", thrift.LIST, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:fields: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Fields)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Fields { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:fields: ", p), err) - } - return err -} - -func (p *Log) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Log(%+v)", *p) -} - -// Attributes: -// - RefType -// - TraceIdLow -// - TraceIdHigh -// - SpanId -type SpanRef struct { - RefType SpanRefType `thrift:"refType,1,required" json:"refType"` - TraceIdLow int64 `thrift:"traceIdLow,2,required" json:"traceIdLow"` - TraceIdHigh int64 `thrift:"traceIdHigh,3,required" json:"traceIdHigh"` - SpanId int64 `thrift:"spanId,4,required" json:"spanId"` -} - -func NewSpanRef() *SpanRef { - return &SpanRef{} -} - -func (p *SpanRef) GetRefType() SpanRefType { - return p.RefType -} - -func (p *SpanRef) GetTraceIdLow() int64 { - return p.TraceIdLow -} - -func (p *SpanRef) GetTraceIdHigh() int64 { - return p.TraceIdHigh -} - -func (p *SpanRef) GetSpanId() int64 { - return p.SpanId -} -func (p *SpanRef) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetRefType bool = false - var issetTraceIdLow bool = false - var issetTraceIdHigh bool = false - var issetSpanId bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetRefType = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetTraceIdLow = true - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - issetTraceIdHigh = true - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - issetSpanId = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetRefType { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RefType is not set")) - } - if !issetTraceIdLow { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdLow is not set")) - } - if !issetTraceIdHigh { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdHigh is not set")) - } - if !issetSpanId { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SpanId is not set")) - } - return nil -} - -func (p *SpanRef) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - temp := SpanRefType(v) - p.RefType = temp - } - return nil -} - -func (p *SpanRef) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.TraceIdLow = v - } - return nil -} - -func (p *SpanRef) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.TraceIdHigh = v - } - return nil -} - -func (p *SpanRef) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.SpanId = v - } - return nil -} - -func (p *SpanRef) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("SpanRef"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *SpanRef) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("refType", thrift.I32, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:refType: ", p), err) - } - if err := oprot.WriteI32(int32(p.RefType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.refType (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:refType: ", p), err) - } - return err -} - -func (p *SpanRef) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("traceIdLow", thrift.I64, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:traceIdLow: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceIdLow)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.traceIdLow (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:traceIdLow: ", p), err) - } - return err -} - -func (p *SpanRef) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("traceIdHigh", thrift.I64, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:traceIdHigh: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceIdHigh)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.traceIdHigh (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:traceIdHigh: ", p), err) - } - return err -} - -func (p *SpanRef) writeField4(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spanId", thrift.I64, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:spanId: ", p), err) - } - if err := oprot.WriteI64(int64(p.SpanId)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.spanId (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:spanId: ", p), err) - } - return err -} - -func (p *SpanRef) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("SpanRef(%+v)", *p) -} - -// Attributes: -// - TraceIdLow -// - TraceIdHigh -// - SpanId -// - ParentSpanId -// - OperationName -// - References -// - Flags -// - StartTime -// - Duration -// - Tags -// - Logs -type Span struct { - TraceIdLow int64 `thrift:"traceIdLow,1,required" json:"traceIdLow"` - TraceIdHigh int64 `thrift:"traceIdHigh,2,required" json:"traceIdHigh"` - SpanId int64 `thrift:"spanId,3,required" json:"spanId"` - ParentSpanId int64 `thrift:"parentSpanId,4,required" json:"parentSpanId"` - OperationName string `thrift:"operationName,5,required" json:"operationName"` - References []*SpanRef `thrift:"references,6" json:"references,omitempty"` - Flags int32 `thrift:"flags,7,required" json:"flags"` - StartTime int64 `thrift:"startTime,8,required" json:"startTime"` - Duration int64 `thrift:"duration,9,required" json:"duration"` - Tags []*Tag `thrift:"tags,10" json:"tags,omitempty"` - Logs []*Log `thrift:"logs,11" json:"logs,omitempty"` -} - -func NewSpan() *Span { - return &Span{} -} - -func (p *Span) GetTraceIdLow() int64 { - return p.TraceIdLow -} - -func (p *Span) GetTraceIdHigh() int64 { - return p.TraceIdHigh -} - -func (p *Span) GetSpanId() int64 { - return p.SpanId -} - -func (p *Span) GetParentSpanId() int64 { - return p.ParentSpanId -} - -func (p *Span) GetOperationName() string { - return p.OperationName -} - -var Span_References_DEFAULT []*SpanRef - -func (p *Span) GetReferences() []*SpanRef { - return p.References -} - -func (p *Span) GetFlags() int32 { - return p.Flags -} - -func (p *Span) GetStartTime() int64 { - return p.StartTime -} - -func (p *Span) GetDuration() int64 { - return p.Duration -} - -var Span_Tags_DEFAULT []*Tag - -func (p *Span) GetTags() []*Tag { - return p.Tags -} - -var Span_Logs_DEFAULT []*Log - -func (p *Span) GetLogs() []*Log { - return p.Logs -} -func (p *Span) IsSetReferences() bool { - return p.References != nil -} - -func (p *Span) IsSetTags() bool { - return p.Tags != nil -} - -func (p *Span) IsSetLogs() bool { - return p.Logs != nil -} - -func (p *Span) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetTraceIdLow bool = false - var issetTraceIdHigh bool = false - var issetSpanId bool = false - var issetParentSpanId bool = false - var issetOperationName bool = false - var issetFlags bool = false - var issetStartTime bool = false - var issetDuration bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetTraceIdLow = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetTraceIdHigh = true - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - issetSpanId = true - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - issetParentSpanId = true - case 5: - if err := p.readField5(iprot); err != nil { - return err - } - issetOperationName = true - case 6: - if err := p.readField6(iprot); err != nil { - return err - } - case 7: - if err := p.readField7(iprot); err != nil { - return err - } - issetFlags = true - case 8: - if err := p.readField8(iprot); err != nil { - return err - } - issetStartTime = true - case 9: - if err := p.readField9(iprot); err != nil { - return err - } - issetDuration = true - case 10: - if err := p.readField10(iprot); err != nil { - return err - } - case 11: - if err := p.readField11(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetTraceIdLow { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdLow is not set")) - } - if !issetTraceIdHigh { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdHigh is not set")) - } - if !issetSpanId { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SpanId is not set")) - } - if !issetParentSpanId { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ParentSpanId is not set")) - } - if !issetOperationName { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field OperationName is not set")) - } - if !issetFlags { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Flags is not set")) - } - if !issetStartTime { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StartTime is not set")) - } - if !issetDuration { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Duration is not set")) - } - return nil -} - -func (p *Span) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.TraceIdLow = v - } - return nil -} - -func (p *Span) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.TraceIdHigh = v - } - return nil -} - -func (p *Span) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.SpanId = v - } - return nil -} - -func (p *Span) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.ParentSpanId = v - } - return nil -} - -func (p *Span) readField5(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 5: ", err) - } else { - p.OperationName = v - } - return nil -} - -func (p *Span) readField6(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*SpanRef, 0, size) - p.References = tSlice - for i := 0; i < size; i++ { - _elem1 := &SpanRef{} - if err := _elem1.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem1), err) - } - p.References = append(p.References, _elem1) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) readField7(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 7: ", err) - } else { - p.Flags = v - } - return nil -} - -func (p *Span) readField8(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 8: ", err) - } else { - p.StartTime = v - } - return nil -} - -func (p *Span) readField9(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 9: ", err) - } else { - p.Duration = v - } - return nil -} - -func (p *Span) readField10(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Tag, 0, size) - p.Tags = tSlice - for i := 0; i < size; i++ { - _elem2 := &Tag{} - if err := _elem2.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem2), err) - } - p.Tags = append(p.Tags, _elem2) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) readField11(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Log, 0, size) - p.Logs = tSlice - for i := 0; i < size; i++ { - _elem3 := &Log{} - if err := _elem3.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem3), err) - } - p.Logs = append(p.Logs, _elem3) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Span"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := p.writeField5(oprot); err != nil { - return err - } - if err := p.writeField6(oprot); err != nil { - return err - } - if err := p.writeField7(oprot); err != nil { - return err - } - if err := p.writeField8(oprot); err != nil { - return err - } - if err := p.writeField9(oprot); err != nil { - return err - } - if err := p.writeField10(oprot); err != nil { - return err - } - if err := p.writeField11(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Span) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("traceIdLow", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:traceIdLow: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceIdLow)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.traceIdLow (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:traceIdLow: ", p), err) - } - return err -} - -func (p *Span) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("traceIdHigh", thrift.I64, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:traceIdHigh: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceIdHigh)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.traceIdHigh (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:traceIdHigh: ", p), err) - } - return err -} - -func (p *Span) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spanId", thrift.I64, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:spanId: ", p), err) - } - if err := oprot.WriteI64(int64(p.SpanId)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.spanId (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:spanId: ", p), err) - } - return err -} - -func (p *Span) writeField4(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("parentSpanId", thrift.I64, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:parentSpanId: ", p), err) - } - if err := oprot.WriteI64(int64(p.ParentSpanId)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.parentSpanId (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:parentSpanId: ", p), err) - } - return err -} - -func (p *Span) writeField5(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("operationName", thrift.STRING, 5); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:operationName: ", p), err) - } - if err := oprot.WriteString(string(p.OperationName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.operationName (5) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 5:operationName: ", p), err) - } - return err -} - -func (p *Span) writeField6(oprot thrift.TProtocol) (err error) { - if p.IsSetReferences() { - if err := oprot.WriteFieldBegin("references", thrift.LIST, 6); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:references: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.References)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.References { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 6:references: ", p), err) - } - } - return err -} - -func (p *Span) writeField7(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("flags", thrift.I32, 7); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:flags: ", p), err) - } - if err := oprot.WriteI32(int32(p.Flags)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.flags (7) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 7:flags: ", p), err) - } - return err -} - -func (p *Span) writeField8(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("startTime", thrift.I64, 8); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:startTime: ", p), err) - } - if err := oprot.WriteI64(int64(p.StartTime)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.startTime (8) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 8:startTime: ", p), err) - } - return err -} - -func (p *Span) writeField9(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("duration", thrift.I64, 9); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:duration: ", p), err) - } - if err := oprot.WriteI64(int64(p.Duration)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.duration (9) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 9:duration: ", p), err) - } - return err -} - -func (p *Span) writeField10(oprot thrift.TProtocol) (err error) { - if p.IsSetTags() { - if err := oprot.WriteFieldBegin("tags", thrift.LIST, 10); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 10:tags: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Tags { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 10:tags: ", p), err) - } - } - return err -} - -func (p *Span) writeField11(oprot thrift.TProtocol) (err error) { - if p.IsSetLogs() { - if err := oprot.WriteFieldBegin("logs", thrift.LIST, 11); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 11:logs: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Logs)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Logs { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 11:logs: ", p), err) - } - } - return err -} - -func (p *Span) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Span(%+v)", *p) -} - -// Attributes: -// - ServiceName -// - Tags -type Process struct { - ServiceName string `thrift:"serviceName,1,required" json:"serviceName"` - Tags []*Tag `thrift:"tags,2" json:"tags,omitempty"` -} - -func NewProcess() *Process { - return &Process{} -} - -func (p *Process) GetServiceName() string { - return p.ServiceName -} - -var Process_Tags_DEFAULT []*Tag - -func (p *Process) GetTags() []*Tag { - return p.Tags -} -func (p *Process) IsSetTags() bool { - return p.Tags != nil -} - -func (p *Process) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetServiceName bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetServiceName = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetServiceName { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ServiceName is not set")) - } - return nil -} - -func (p *Process) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.ServiceName = v - } - return nil -} - -func (p *Process) readField2(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Tag, 0, size) - p.Tags = tSlice - for i := 0; i < size; i++ { - _elem4 := &Tag{} - if err := _elem4.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem4), err) - } - p.Tags = append(p.Tags, _elem4) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Process) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Process"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Process) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("serviceName", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:serviceName: ", p), err) - } - if err := oprot.WriteString(string(p.ServiceName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.serviceName (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:serviceName: ", p), err) - } - return err -} - -func (p *Process) writeField2(oprot thrift.TProtocol) (err error) { - if p.IsSetTags() { - if err := oprot.WriteFieldBegin("tags", thrift.LIST, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:tags: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Tags { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:tags: ", p), err) - } - } - return err -} - -func (p *Process) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Process(%+v)", *p) -} - -// Attributes: -// - Process -// - Spans -type Batch struct { - Process *Process `thrift:"process,1,required" json:"process"` - Spans []*Span `thrift:"spans,2,required" json:"spans"` -} - -func NewBatch() *Batch { - return &Batch{} -} - -var Batch_Process_DEFAULT *Process - -func (p *Batch) GetProcess() *Process { - if !p.IsSetProcess() { - return Batch_Process_DEFAULT - } - return p.Process -} - -func (p *Batch) GetSpans() []*Span { - return p.Spans -} -func (p *Batch) IsSetProcess() bool { - return p.Process != nil -} - -func (p *Batch) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetProcess bool = false - var issetSpans bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetProcess = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetSpans = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetProcess { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Process is not set")) - } - if !issetSpans { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Spans is not set")) - } - return nil -} - -func (p *Batch) readField1(iprot thrift.TProtocol) error { - p.Process = &Process{} - if err := p.Process.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Process), err) - } - return nil -} - -func (p *Batch) readField2(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Span, 0, size) - p.Spans = tSlice - for i := 0; i < size; i++ { - _elem5 := &Span{} - if err := _elem5.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem5), err) - } - p.Spans = append(p.Spans, _elem5) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Batch) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Batch"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Batch) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("process", thrift.STRUCT, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:process: ", p), err) - } - if err := p.Process.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Process), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:process: ", p), err) - } - return err -} - -func (p *Batch) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spans", thrift.LIST, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:spans: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Spans { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:spans: ", p), err) - } - return err -} - -func (p *Batch) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Batch(%+v)", *p) -} - -// Attributes: -// - Ok -type BatchSubmitResponse struct { - Ok bool `thrift:"ok,1,required" json:"ok"` -} - -func NewBatchSubmitResponse() *BatchSubmitResponse { - return &BatchSubmitResponse{} -} - -func (p *BatchSubmitResponse) GetOk() bool { - return p.Ok -} -func (p *BatchSubmitResponse) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetOk bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetOk = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetOk { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ok is not set")) - } - return nil -} - -func (p *BatchSubmitResponse) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Ok = v - } - return nil -} - -func (p *BatchSubmitResponse) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("BatchSubmitResponse"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BatchSubmitResponse) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("ok", thrift.BOOL, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ok: ", p), err) - } - if err := oprot.WriteBool(bool(p.Ok)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.ok (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ok: ", p), err) - } - return err -} - -func (p *BatchSubmitResponse) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BatchSubmitResponse(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go deleted file mode 100644 index 0f6e3a884d95..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go +++ /dev/null @@ -1,18 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package sampling - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go deleted file mode 100644 index 33179cfeb3b9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go +++ /dev/null @@ -1,410 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package sampling - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -type SamplingManager interface { - // Parameters: - // - ServiceName - GetSamplingStrategy(serviceName string) (r *SamplingStrategyResponse, err error) -} - -type SamplingManagerClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewSamplingManagerClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *SamplingManagerClient { - return &SamplingManagerClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewSamplingManagerClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *SamplingManagerClient { - return &SamplingManagerClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// Parameters: -// - ServiceName -func (p *SamplingManagerClient) GetSamplingStrategy(serviceName string) (r *SamplingStrategyResponse, err error) { - if err = p.sendGetSamplingStrategy(serviceName); err != nil { - return - } - return p.recvGetSamplingStrategy() -} - -func (p *SamplingManagerClient) sendGetSamplingStrategy(serviceName string) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("getSamplingStrategy", thrift.CALL, p.SeqId); err != nil { - return - } - args := SamplingManagerGetSamplingStrategyArgs{ - ServiceName: serviceName, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -func (p *SamplingManagerClient) recvGetSamplingStrategy() (value *SamplingStrategyResponse, err error) { - iprot := p.InputProtocol - if iprot == nil { - iprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.InputProtocol = iprot - } - method, mTypeId, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return - } - if method != "getSamplingStrategy" { - err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getSamplingStrategy failed: wrong method name") - return - } - if p.SeqId != seqId { - err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getSamplingStrategy failed: out of sequence response") - return - } - if mTypeId == thrift.EXCEPTION { - error1 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error2 error - error2, err = error1.Read(iprot) - if err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - err = error2 - return - } - if mTypeId != thrift.REPLY { - err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getSamplingStrategy failed: invalid message type") - return - } - result := SamplingManagerGetSamplingStrategyResult{} - if err = result.Read(iprot); err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - value = result.GetSuccess() - return -} - -type SamplingManagerProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler SamplingManager -} - -func (p *SamplingManagerProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *SamplingManagerProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *SamplingManagerProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewSamplingManagerProcessor(handler SamplingManager) *SamplingManagerProcessor { - - self3 := &SamplingManagerProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self3.processorMap["getSamplingStrategy"] = &samplingManagerProcessorGetSamplingStrategy{handler: handler} - return self3 -} - -func (p *SamplingManagerProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x4 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x4.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x4 - -} - -type samplingManagerProcessorGetSamplingStrategy struct { - handler SamplingManager -} - -func (p *samplingManagerProcessorGetSamplingStrategy) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := SamplingManagerGetSamplingStrategyArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) - oprot.WriteMessageBegin("getSamplingStrategy", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, err - } - - iprot.ReadMessageEnd() - result := SamplingManagerGetSamplingStrategyResult{} - var retval *SamplingStrategyResponse - var err2 error - if retval, err2 = p.handler.GetSamplingStrategy(args.ServiceName); err2 != nil { - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getSamplingStrategy: "+err2.Error()) - oprot.WriteMessageBegin("getSamplingStrategy", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return true, err2 - } else { - result.Success = retval - } - if err2 = oprot.WriteMessageBegin("getSamplingStrategy", thrift.REPLY, seqId); err2 != nil { - err = err2 - } - if err2 = result.Write(oprot); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.Flush(); err == nil && err2 != nil { - err = err2 - } - if err != nil { - return - } - return true, err -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - ServiceName -type SamplingManagerGetSamplingStrategyArgs struct { - ServiceName string `thrift:"serviceName,1" json:"serviceName"` -} - -func NewSamplingManagerGetSamplingStrategyArgs() *SamplingManagerGetSamplingStrategyArgs { - return &SamplingManagerGetSamplingStrategyArgs{} -} - -func (p *SamplingManagerGetSamplingStrategyArgs) GetServiceName() string { - return p.ServiceName -} -func (p *SamplingManagerGetSamplingStrategyArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyArgs) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.ServiceName = v - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("getSamplingStrategy_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("serviceName", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:serviceName: ", p), err) - } - if err := oprot.WriteString(string(p.ServiceName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.serviceName (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:serviceName: ", p), err) - } - return err -} - -func (p *SamplingManagerGetSamplingStrategyArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("SamplingManagerGetSamplingStrategyArgs(%+v)", *p) -} - -// Attributes: -// - Success -type SamplingManagerGetSamplingStrategyResult struct { - Success *SamplingStrategyResponse `thrift:"success,0" json:"success,omitempty"` -} - -func NewSamplingManagerGetSamplingStrategyResult() *SamplingManagerGetSamplingStrategyResult { - return &SamplingManagerGetSamplingStrategyResult{} -} - -var SamplingManagerGetSamplingStrategyResult_Success_DEFAULT *SamplingStrategyResponse - -func (p *SamplingManagerGetSamplingStrategyResult) GetSuccess() *SamplingStrategyResponse { - if !p.IsSetSuccess() { - return SamplingManagerGetSamplingStrategyResult_Success_DEFAULT - } - return p.Success -} -func (p *SamplingManagerGetSamplingStrategyResult) IsSetSuccess() bool { - return p.Success != nil -} - -func (p *SamplingManagerGetSamplingStrategyResult) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 0: - if err := p.readField0(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyResult) readField0(iprot thrift.TProtocol) error { - p.Success = &SamplingStrategyResponse{} - if err := p.Success.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyResult) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("getSamplingStrategy_result"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField0(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyResult) writeField0(oprot thrift.TProtocol) (err error) { - if p.IsSetSuccess() { - if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) - } - if err := p.Success.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) - } - } - return err -} - -func (p *SamplingManagerGetSamplingStrategyResult) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("SamplingManagerGetSamplingStrategyResult(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go deleted file mode 100644 index 9abaf0542d40..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go +++ /dev/null @@ -1,873 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package sampling - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var GoUnusedProtection__ int - -type SamplingStrategyType int64 - -const ( - SamplingStrategyType_PROBABILISTIC SamplingStrategyType = 0 - SamplingStrategyType_RATE_LIMITING SamplingStrategyType = 1 -) - -func (p SamplingStrategyType) String() string { - switch p { - case SamplingStrategyType_PROBABILISTIC: - return "PROBABILISTIC" - case SamplingStrategyType_RATE_LIMITING: - return "RATE_LIMITING" - } - return "" -} - -func SamplingStrategyTypeFromString(s string) (SamplingStrategyType, error) { - switch s { - case "PROBABILISTIC": - return SamplingStrategyType_PROBABILISTIC, nil - case "RATE_LIMITING": - return SamplingStrategyType_RATE_LIMITING, nil - } - return SamplingStrategyType(0), fmt.Errorf("not a valid SamplingStrategyType string") -} - -func SamplingStrategyTypePtr(v SamplingStrategyType) *SamplingStrategyType { return &v } - -func (p SamplingStrategyType) MarshalText() ([]byte, error) { - return []byte(p.String()), nil -} - -func (p *SamplingStrategyType) UnmarshalText(text []byte) error { - q, err := SamplingStrategyTypeFromString(string(text)) - if err != nil { - return err - } - *p = q - return nil -} - -// Attributes: -// - SamplingRate -type ProbabilisticSamplingStrategy struct { - SamplingRate float64 `thrift:"samplingRate,1,required" json:"samplingRate"` -} - -func NewProbabilisticSamplingStrategy() *ProbabilisticSamplingStrategy { - return &ProbabilisticSamplingStrategy{} -} - -func (p *ProbabilisticSamplingStrategy) GetSamplingRate() float64 { - return p.SamplingRate -} -func (p *ProbabilisticSamplingStrategy) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetSamplingRate bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetSamplingRate = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetSamplingRate { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SamplingRate is not set")) - } - return nil -} - -func (p *ProbabilisticSamplingStrategy) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.SamplingRate = v - } - return nil -} - -func (p *ProbabilisticSamplingStrategy) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("ProbabilisticSamplingStrategy"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *ProbabilisticSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("samplingRate", thrift.DOUBLE, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:samplingRate: ", p), err) - } - if err := oprot.WriteDouble(float64(p.SamplingRate)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.samplingRate (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:samplingRate: ", p), err) - } - return err -} - -func (p *ProbabilisticSamplingStrategy) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("ProbabilisticSamplingStrategy(%+v)", *p) -} - -// Attributes: -// - MaxTracesPerSecond -type RateLimitingSamplingStrategy struct { - MaxTracesPerSecond int16 `thrift:"maxTracesPerSecond,1,required" json:"maxTracesPerSecond"` -} - -func NewRateLimitingSamplingStrategy() *RateLimitingSamplingStrategy { - return &RateLimitingSamplingStrategy{} -} - -func (p *RateLimitingSamplingStrategy) GetMaxTracesPerSecond() int16 { - return p.MaxTracesPerSecond -} -func (p *RateLimitingSamplingStrategy) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetMaxTracesPerSecond bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetMaxTracesPerSecond = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetMaxTracesPerSecond { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MaxTracesPerSecond is not set")) - } - return nil -} - -func (p *RateLimitingSamplingStrategy) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI16(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.MaxTracesPerSecond = v - } - return nil -} - -func (p *RateLimitingSamplingStrategy) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("RateLimitingSamplingStrategy"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *RateLimitingSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("maxTracesPerSecond", thrift.I16, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:maxTracesPerSecond: ", p), err) - } - if err := oprot.WriteI16(int16(p.MaxTracesPerSecond)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.maxTracesPerSecond (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:maxTracesPerSecond: ", p), err) - } - return err -} - -func (p *RateLimitingSamplingStrategy) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("RateLimitingSamplingStrategy(%+v)", *p) -} - -// Attributes: -// - Operation -// - ProbabilisticSampling -type OperationSamplingStrategy struct { - Operation string `thrift:"operation,1,required" json:"operation"` - ProbabilisticSampling *ProbabilisticSamplingStrategy `thrift:"probabilisticSampling,2,required" json:"probabilisticSampling"` -} - -func NewOperationSamplingStrategy() *OperationSamplingStrategy { - return &OperationSamplingStrategy{} -} - -func (p *OperationSamplingStrategy) GetOperation() string { - return p.Operation -} - -var OperationSamplingStrategy_ProbabilisticSampling_DEFAULT *ProbabilisticSamplingStrategy - -func (p *OperationSamplingStrategy) GetProbabilisticSampling() *ProbabilisticSamplingStrategy { - if !p.IsSetProbabilisticSampling() { - return OperationSamplingStrategy_ProbabilisticSampling_DEFAULT - } - return p.ProbabilisticSampling -} -func (p *OperationSamplingStrategy) IsSetProbabilisticSampling() bool { - return p.ProbabilisticSampling != nil -} - -func (p *OperationSamplingStrategy) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetOperation bool = false - var issetProbabilisticSampling bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetOperation = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetProbabilisticSampling = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetOperation { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Operation is not set")) - } - if !issetProbabilisticSampling { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ProbabilisticSampling is not set")) - } - return nil -} - -func (p *OperationSamplingStrategy) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Operation = v - } - return nil -} - -func (p *OperationSamplingStrategy) readField2(iprot thrift.TProtocol) error { - p.ProbabilisticSampling = &ProbabilisticSamplingStrategy{} - if err := p.ProbabilisticSampling.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.ProbabilisticSampling), err) - } - return nil -} - -func (p *OperationSamplingStrategy) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("OperationSamplingStrategy"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *OperationSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("operation", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:operation: ", p), err) - } - if err := oprot.WriteString(string(p.Operation)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.operation (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:operation: ", p), err) - } - return err -} - -func (p *OperationSamplingStrategy) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("probabilisticSampling", thrift.STRUCT, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:probabilisticSampling: ", p), err) - } - if err := p.ProbabilisticSampling.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.ProbabilisticSampling), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:probabilisticSampling: ", p), err) - } - return err -} - -func (p *OperationSamplingStrategy) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("OperationSamplingStrategy(%+v)", *p) -} - -// Attributes: -// - DefaultSamplingProbability -// - DefaultLowerBoundTracesPerSecond -// - PerOperationStrategies -// - DefaultUpperBoundTracesPerSecond -type PerOperationSamplingStrategies struct { - DefaultSamplingProbability float64 `thrift:"defaultSamplingProbability,1,required" json:"defaultSamplingProbability"` - DefaultLowerBoundTracesPerSecond float64 `thrift:"defaultLowerBoundTracesPerSecond,2,required" json:"defaultLowerBoundTracesPerSecond"` - PerOperationStrategies []*OperationSamplingStrategy `thrift:"perOperationStrategies,3,required" json:"perOperationStrategies"` - DefaultUpperBoundTracesPerSecond *float64 `thrift:"defaultUpperBoundTracesPerSecond,4" json:"defaultUpperBoundTracesPerSecond,omitempty"` -} - -func NewPerOperationSamplingStrategies() *PerOperationSamplingStrategies { - return &PerOperationSamplingStrategies{} -} - -func (p *PerOperationSamplingStrategies) GetDefaultSamplingProbability() float64 { - return p.DefaultSamplingProbability -} - -func (p *PerOperationSamplingStrategies) GetDefaultLowerBoundTracesPerSecond() float64 { - return p.DefaultLowerBoundTracesPerSecond -} - -func (p *PerOperationSamplingStrategies) GetPerOperationStrategies() []*OperationSamplingStrategy { - return p.PerOperationStrategies -} - -var PerOperationSamplingStrategies_DefaultUpperBoundTracesPerSecond_DEFAULT float64 - -func (p *PerOperationSamplingStrategies) GetDefaultUpperBoundTracesPerSecond() float64 { - if !p.IsSetDefaultUpperBoundTracesPerSecond() { - return PerOperationSamplingStrategies_DefaultUpperBoundTracesPerSecond_DEFAULT - } - return *p.DefaultUpperBoundTracesPerSecond -} -func (p *PerOperationSamplingStrategies) IsSetDefaultUpperBoundTracesPerSecond() bool { - return p.DefaultUpperBoundTracesPerSecond != nil -} - -func (p *PerOperationSamplingStrategies) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetDefaultSamplingProbability bool = false - var issetDefaultLowerBoundTracesPerSecond bool = false - var issetPerOperationStrategies bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetDefaultSamplingProbability = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetDefaultLowerBoundTracesPerSecond = true - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - issetPerOperationStrategies = true - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetDefaultSamplingProbability { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DefaultSamplingProbability is not set")) - } - if !issetDefaultLowerBoundTracesPerSecond { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DefaultLowerBoundTracesPerSecond is not set")) - } - if !issetPerOperationStrategies { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field PerOperationStrategies is not set")) - } - return nil -} - -func (p *PerOperationSamplingStrategies) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.DefaultSamplingProbability = v - } - return nil -} - -func (p *PerOperationSamplingStrategies) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.DefaultLowerBoundTracesPerSecond = v - } - return nil -} - -func (p *PerOperationSamplingStrategies) readField3(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*OperationSamplingStrategy, 0, size) - p.PerOperationStrategies = tSlice - for i := 0; i < size; i++ { - _elem0 := &OperationSamplingStrategy{} - if err := _elem0.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) - } - p.PerOperationStrategies = append(p.PerOperationStrategies, _elem0) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *PerOperationSamplingStrategies) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.DefaultUpperBoundTracesPerSecond = &v - } - return nil -} - -func (p *PerOperationSamplingStrategies) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("PerOperationSamplingStrategies"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *PerOperationSamplingStrategies) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("defaultSamplingProbability", thrift.DOUBLE, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:defaultSamplingProbability: ", p), err) - } - if err := oprot.WriteDouble(float64(p.DefaultSamplingProbability)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.defaultSamplingProbability (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:defaultSamplingProbability: ", p), err) - } - return err -} - -func (p *PerOperationSamplingStrategies) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("defaultLowerBoundTracesPerSecond", thrift.DOUBLE, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:defaultLowerBoundTracesPerSecond: ", p), err) - } - if err := oprot.WriteDouble(float64(p.DefaultLowerBoundTracesPerSecond)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.defaultLowerBoundTracesPerSecond (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:defaultLowerBoundTracesPerSecond: ", p), err) - } - return err -} - -func (p *PerOperationSamplingStrategies) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("perOperationStrategies", thrift.LIST, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:perOperationStrategies: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.PerOperationStrategies)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.PerOperationStrategies { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:perOperationStrategies: ", p), err) - } - return err -} - -func (p *PerOperationSamplingStrategies) writeField4(oprot thrift.TProtocol) (err error) { - if p.IsSetDefaultUpperBoundTracesPerSecond() { - if err := oprot.WriteFieldBegin("defaultUpperBoundTracesPerSecond", thrift.DOUBLE, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:defaultUpperBoundTracesPerSecond: ", p), err) - } - if err := oprot.WriteDouble(float64(*p.DefaultUpperBoundTracesPerSecond)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.defaultUpperBoundTracesPerSecond (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:defaultUpperBoundTracesPerSecond: ", p), err) - } - } - return err -} - -func (p *PerOperationSamplingStrategies) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("PerOperationSamplingStrategies(%+v)", *p) -} - -// Attributes: -// - StrategyType -// - ProbabilisticSampling -// - RateLimitingSampling -// - OperationSampling -type SamplingStrategyResponse struct { - StrategyType SamplingStrategyType `thrift:"strategyType,1,required" json:"strategyType"` - ProbabilisticSampling *ProbabilisticSamplingStrategy `thrift:"probabilisticSampling,2" json:"probabilisticSampling,omitempty"` - RateLimitingSampling *RateLimitingSamplingStrategy `thrift:"rateLimitingSampling,3" json:"rateLimitingSampling,omitempty"` - OperationSampling *PerOperationSamplingStrategies `thrift:"operationSampling,4" json:"operationSampling,omitempty"` -} - -func NewSamplingStrategyResponse() *SamplingStrategyResponse { - return &SamplingStrategyResponse{} -} - -func (p *SamplingStrategyResponse) GetStrategyType() SamplingStrategyType { - return p.StrategyType -} - -var SamplingStrategyResponse_ProbabilisticSampling_DEFAULT *ProbabilisticSamplingStrategy - -func (p *SamplingStrategyResponse) GetProbabilisticSampling() *ProbabilisticSamplingStrategy { - if !p.IsSetProbabilisticSampling() { - return SamplingStrategyResponse_ProbabilisticSampling_DEFAULT - } - return p.ProbabilisticSampling -} - -var SamplingStrategyResponse_RateLimitingSampling_DEFAULT *RateLimitingSamplingStrategy - -func (p *SamplingStrategyResponse) GetRateLimitingSampling() *RateLimitingSamplingStrategy { - if !p.IsSetRateLimitingSampling() { - return SamplingStrategyResponse_RateLimitingSampling_DEFAULT - } - return p.RateLimitingSampling -} - -var SamplingStrategyResponse_OperationSampling_DEFAULT *PerOperationSamplingStrategies - -func (p *SamplingStrategyResponse) GetOperationSampling() *PerOperationSamplingStrategies { - if !p.IsSetOperationSampling() { - return SamplingStrategyResponse_OperationSampling_DEFAULT - } - return p.OperationSampling -} -func (p *SamplingStrategyResponse) IsSetProbabilisticSampling() bool { - return p.ProbabilisticSampling != nil -} - -func (p *SamplingStrategyResponse) IsSetRateLimitingSampling() bool { - return p.RateLimitingSampling != nil -} - -func (p *SamplingStrategyResponse) IsSetOperationSampling() bool { - return p.OperationSampling != nil -} - -func (p *SamplingStrategyResponse) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetStrategyType bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetStrategyType = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetStrategyType { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StrategyType is not set")) - } - return nil -} - -func (p *SamplingStrategyResponse) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - temp := SamplingStrategyType(v) - p.StrategyType = temp - } - return nil -} - -func (p *SamplingStrategyResponse) readField2(iprot thrift.TProtocol) error { - p.ProbabilisticSampling = &ProbabilisticSamplingStrategy{} - if err := p.ProbabilisticSampling.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.ProbabilisticSampling), err) - } - return nil -} - -func (p *SamplingStrategyResponse) readField3(iprot thrift.TProtocol) error { - p.RateLimitingSampling = &RateLimitingSamplingStrategy{} - if err := p.RateLimitingSampling.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.RateLimitingSampling), err) - } - return nil -} - -func (p *SamplingStrategyResponse) readField4(iprot thrift.TProtocol) error { - p.OperationSampling = &PerOperationSamplingStrategies{} - if err := p.OperationSampling.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.OperationSampling), err) - } - return nil -} - -func (p *SamplingStrategyResponse) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("SamplingStrategyResponse"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *SamplingStrategyResponse) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("strategyType", thrift.I32, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:strategyType: ", p), err) - } - if err := oprot.WriteI32(int32(p.StrategyType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.strategyType (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:strategyType: ", p), err) - } - return err -} - -func (p *SamplingStrategyResponse) writeField2(oprot thrift.TProtocol) (err error) { - if p.IsSetProbabilisticSampling() { - if err := oprot.WriteFieldBegin("probabilisticSampling", thrift.STRUCT, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:probabilisticSampling: ", p), err) - } - if err := p.ProbabilisticSampling.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.ProbabilisticSampling), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:probabilisticSampling: ", p), err) - } - } - return err -} - -func (p *SamplingStrategyResponse) writeField3(oprot thrift.TProtocol) (err error) { - if p.IsSetRateLimitingSampling() { - if err := oprot.WriteFieldBegin("rateLimitingSampling", thrift.STRUCT, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rateLimitingSampling: ", p), err) - } - if err := p.RateLimitingSampling.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.RateLimitingSampling), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rateLimitingSampling: ", p), err) - } - } - return err -} - -func (p *SamplingStrategyResponse) writeField4(oprot thrift.TProtocol) (err error) { - if p.IsSetOperationSampling() { - if err := oprot.WriteFieldBegin("operationSampling", thrift.STRUCT, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:operationSampling: ", p), err) - } - if err := p.OperationSampling.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.OperationSampling), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:operationSampling: ", p), err) - } - } - return err -} - -func (p *SamplingStrategyResponse) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("SamplingStrategyResponse(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go deleted file mode 100644 index f05144bfc694..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go +++ /dev/null @@ -1,32 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package zipkincore - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -const CLIENT_SEND = "cs" -const CLIENT_RECV = "cr" -const SERVER_SEND = "ss" -const SERVER_RECV = "sr" -const WIRE_SEND = "ws" -const WIRE_RECV = "wr" -const CLIENT_SEND_FRAGMENT = "csf" -const CLIENT_RECV_FRAGMENT = "crf" -const SERVER_SEND_FRAGMENT = "ssf" -const SERVER_RECV_FRAGMENT = "srf" -const LOCAL_COMPONENT = "lc" -const CLIENT_ADDR = "ca" -const SERVER_ADDR = "sa" - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go deleted file mode 100644 index 34b2b267eb52..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go +++ /dev/null @@ -1,1247 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package zipkincore - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var GoUnusedProtection__ int - -type AnnotationType int64 - -const ( - AnnotationType_BOOL AnnotationType = 0 - AnnotationType_BYTES AnnotationType = 1 - AnnotationType_I16 AnnotationType = 2 - AnnotationType_I32 AnnotationType = 3 - AnnotationType_I64 AnnotationType = 4 - AnnotationType_DOUBLE AnnotationType = 5 - AnnotationType_STRING AnnotationType = 6 -) - -func (p AnnotationType) String() string { - switch p { - case AnnotationType_BOOL: - return "BOOL" - case AnnotationType_BYTES: - return "BYTES" - case AnnotationType_I16: - return "I16" - case AnnotationType_I32: - return "I32" - case AnnotationType_I64: - return "I64" - case AnnotationType_DOUBLE: - return "DOUBLE" - case AnnotationType_STRING: - return "STRING" - } - return "" -} - -func AnnotationTypeFromString(s string) (AnnotationType, error) { - switch s { - case "BOOL": - return AnnotationType_BOOL, nil - case "BYTES": - return AnnotationType_BYTES, nil - case "I16": - return AnnotationType_I16, nil - case "I32": - return AnnotationType_I32, nil - case "I64": - return AnnotationType_I64, nil - case "DOUBLE": - return AnnotationType_DOUBLE, nil - case "STRING": - return AnnotationType_STRING, nil - } - return AnnotationType(0), fmt.Errorf("not a valid AnnotationType string") -} - -func AnnotationTypePtr(v AnnotationType) *AnnotationType { return &v } - -func (p AnnotationType) MarshalText() ([]byte, error) { - return []byte(p.String()), nil -} - -func (p *AnnotationType) UnmarshalText(text []byte) error { - q, err := AnnotationTypeFromString(string(text)) - if err != nil { - return err - } - *p = q - return nil -} - -// Indicates the network context of a service recording an annotation with two -// exceptions. -// -// When a BinaryAnnotation, and key is CLIENT_ADDR or SERVER_ADDR, -// the endpoint indicates the source or destination of an RPC. This exception -// allows zipkin to display network context of uninstrumented services, or -// clients such as web browsers. -// -// Attributes: -// - Ipv4: IPv4 host address packed into 4 bytes. -// -// Ex for the ip 1.2.3.4, it would be (1 << 24) | (2 << 16) | (3 << 8) | 4 -// - Port: IPv4 port -// -// Note: this is to be treated as an unsigned integer, so watch for negatives. -// -// Conventionally, when the port isn't known, port = 0. -// - ServiceName: Service name in lowercase, such as "memcache" or "zipkin-web" -// -// Conventionally, when the service name isn't known, service_name = "unknown". -type Endpoint struct { - Ipv4 int32 `thrift:"ipv4,1" json:"ipv4"` - Port int16 `thrift:"port,2" json:"port"` - ServiceName string `thrift:"service_name,3" json:"service_name"` -} - -func NewEndpoint() *Endpoint { - return &Endpoint{} -} - -func (p *Endpoint) GetIpv4() int32 { - return p.Ipv4 -} - -func (p *Endpoint) GetPort() int16 { - return p.Port -} - -func (p *Endpoint) GetServiceName() string { - return p.ServiceName -} -func (p *Endpoint) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *Endpoint) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Ipv4 = v - } - return nil -} - -func (p *Endpoint) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI16(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.Port = v - } - return nil -} - -func (p *Endpoint) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.ServiceName = v - } - return nil -} - -func (p *Endpoint) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Endpoint"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Endpoint) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("ipv4", thrift.I32, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ipv4: ", p), err) - } - if err := oprot.WriteI32(int32(p.Ipv4)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.ipv4 (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ipv4: ", p), err) - } - return err -} - -func (p *Endpoint) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("port", thrift.I16, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:port: ", p), err) - } - if err := oprot.WriteI16(int16(p.Port)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.port (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:port: ", p), err) - } - return err -} - -func (p *Endpoint) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("service_name", thrift.STRING, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:service_name: ", p), err) - } - if err := oprot.WriteString(string(p.ServiceName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.service_name (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:service_name: ", p), err) - } - return err -} - -func (p *Endpoint) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Endpoint(%+v)", *p) -} - -// An annotation is similar to a log statement. It includes a host field which -// allows these events to be attributed properly, and also aggregatable. -// -// Attributes: -// - Timestamp: Microseconds from epoch. -// -// This value should use the most precise value possible. For example, -// gettimeofday or syncing nanoTime against a tick of currentTimeMillis. -// - Value -// - Host: Always the host that recorded the event. By specifying the host you allow -// rollup of all events (such as client requests to a service) by IP address. -type Annotation struct { - Timestamp int64 `thrift:"timestamp,1" json:"timestamp"` - Value string `thrift:"value,2" json:"value"` - Host *Endpoint `thrift:"host,3" json:"host,omitempty"` -} - -func NewAnnotation() *Annotation { - return &Annotation{} -} - -func (p *Annotation) GetTimestamp() int64 { - return p.Timestamp -} - -func (p *Annotation) GetValue() string { - return p.Value -} - -var Annotation_Host_DEFAULT *Endpoint - -func (p *Annotation) GetHost() *Endpoint { - if !p.IsSetHost() { - return Annotation_Host_DEFAULT - } - return p.Host -} -func (p *Annotation) IsSetHost() bool { - return p.Host != nil -} - -func (p *Annotation) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *Annotation) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Timestamp = v - } - return nil -} - -func (p *Annotation) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.Value = v - } - return nil -} - -func (p *Annotation) readField3(iprot thrift.TProtocol) error { - p.Host = &Endpoint{} - if err := p.Host.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Host), err) - } - return nil -} - -func (p *Annotation) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Annotation"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Annotation) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:timestamp: ", p), err) - } - if err := oprot.WriteI64(int64(p.Timestamp)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.timestamp (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:timestamp: ", p), err) - } - return err -} - -func (p *Annotation) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("value", thrift.STRING, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:value: ", p), err) - } - if err := oprot.WriteString(string(p.Value)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.value (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:value: ", p), err) - } - return err -} - -func (p *Annotation) writeField3(oprot thrift.TProtocol) (err error) { - if p.IsSetHost() { - if err := oprot.WriteFieldBegin("host", thrift.STRUCT, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:host: ", p), err) - } - if err := p.Host.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Host), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:host: ", p), err) - } - } - return err -} - -func (p *Annotation) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Annotation(%+v)", *p) -} - -// Binary annotations are tags applied to a Span to give it context. For -// example, a binary annotation of "http.uri" could the path to a resource in a -// RPC call. -// -// Binary annotations of type STRING are always queryable, though more a -// historical implementation detail than a structural concern. -// -// Binary annotations can repeat, and vary on the host. Similar to Annotation, -// the host indicates who logged the event. This allows you to tell the -// difference between the client and server side of the same key. For example, -// the key "http.uri" might be different on the client and server side due to -// rewriting, like "/api/v1/myresource" vs "/myresource. Via the host field, -// you can see the different points of view, which often help in debugging. -// -// Attributes: -// - Key -// - Value -// - AnnotationType -// - Host: The host that recorded tag, which allows you to differentiate between -// multiple tags with the same key. There are two exceptions to this. -// -// When the key is CLIENT_ADDR or SERVER_ADDR, host indicates the source or -// destination of an RPC. This exception allows zipkin to display network -// context of uninstrumented services, or clients such as web browsers. -type BinaryAnnotation struct { - Key string `thrift:"key,1" json:"key"` - Value []byte `thrift:"value,2" json:"value"` - AnnotationType AnnotationType `thrift:"annotation_type,3" json:"annotation_type"` - Host *Endpoint `thrift:"host,4" json:"host,omitempty"` -} - -func NewBinaryAnnotation() *BinaryAnnotation { - return &BinaryAnnotation{} -} - -func (p *BinaryAnnotation) GetKey() string { - return p.Key -} - -func (p *BinaryAnnotation) GetValue() []byte { - return p.Value -} - -func (p *BinaryAnnotation) GetAnnotationType() AnnotationType { - return p.AnnotationType -} - -var BinaryAnnotation_Host_DEFAULT *Endpoint - -func (p *BinaryAnnotation) GetHost() *Endpoint { - if !p.IsSetHost() { - return BinaryAnnotation_Host_DEFAULT - } - return p.Host -} -func (p *BinaryAnnotation) IsSetHost() bool { - return p.Host != nil -} - -func (p *BinaryAnnotation) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *BinaryAnnotation) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Key = v - } - return nil -} - -func (p *BinaryAnnotation) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBinary(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.Value = v - } - return nil -} - -func (p *BinaryAnnotation) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - temp := AnnotationType(v) - p.AnnotationType = temp - } - return nil -} - -func (p *BinaryAnnotation) readField4(iprot thrift.TProtocol) error { - p.Host = &Endpoint{} - if err := p.Host.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Host), err) - } - return nil -} - -func (p *BinaryAnnotation) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("BinaryAnnotation"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BinaryAnnotation) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("key", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:key: ", p), err) - } - if err := oprot.WriteString(string(p.Key)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.key (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:key: ", p), err) - } - return err -} - -func (p *BinaryAnnotation) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("value", thrift.STRING, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:value: ", p), err) - } - if err := oprot.WriteBinary(p.Value); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.value (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:value: ", p), err) - } - return err -} - -func (p *BinaryAnnotation) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("annotation_type", thrift.I32, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:annotation_type: ", p), err) - } - if err := oprot.WriteI32(int32(p.AnnotationType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.annotation_type (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:annotation_type: ", p), err) - } - return err -} - -func (p *BinaryAnnotation) writeField4(oprot thrift.TProtocol) (err error) { - if p.IsSetHost() { - if err := oprot.WriteFieldBegin("host", thrift.STRUCT, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:host: ", p), err) - } - if err := p.Host.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Host), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:host: ", p), err) - } - } - return err -} - -func (p *BinaryAnnotation) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BinaryAnnotation(%+v)", *p) -} - -// A trace is a series of spans (often RPC calls) which form a latency tree. -// -// The root span is where trace_id = id and parent_id = Nil. The root span is -// usually the longest interval in the trace, starting with a SERVER_RECV -// annotation and ending with a SERVER_SEND. -// -// Attributes: -// - TraceID -// - Name: Span name in lowercase, rpc method for example -// -// Conventionally, when the span name isn't known, name = "unknown". -// - ID -// - ParentID -// - Annotations -// - BinaryAnnotations -// - Debug -// - Timestamp: Microseconds from epoch of the creation of this span. -// -// This value should be set directly by instrumentation, using the most -// precise value possible. For example, gettimeofday or syncing nanoTime -// against a tick of currentTimeMillis. -// -// For compatibilty with instrumentation that precede this field, collectors -// or span stores can derive this via Annotation.timestamp. -// For example, SERVER_RECV.timestamp or CLIENT_SEND.timestamp. -// -// This field is optional for compatibility with old data: first-party span -// stores are expected to support this at time of introduction. -// - Duration: Measurement of duration in microseconds, used to support queries. -// -// This value should be set directly, where possible. Doing so encourages -// precise measurement decoupled from problems of clocks, such as skew or NTP -// updates causing time to move backwards. -// -// For compatibilty with instrumentation that precede this field, collectors -// or span stores can derive this by subtracting Annotation.timestamp. -// For example, SERVER_SEND.timestamp - SERVER_RECV.timestamp. -// -// If this field is persisted as unset, zipkin will continue to work, except -// duration query support will be implementation-specific. Similarly, setting -// this field non-atomically is implementation-specific. -// -// This field is i64 vs i32 to support spans longer than 35 minutes. -type Span struct { - TraceID int64 `thrift:"trace_id,1" json:"trace_id"` - // unused field # 2 - Name string `thrift:"name,3" json:"name"` - ID int64 `thrift:"id,4" json:"id"` - ParentID *int64 `thrift:"parent_id,5" json:"parent_id,omitempty"` - Annotations []*Annotation `thrift:"annotations,6" json:"annotations"` - // unused field # 7 - BinaryAnnotations []*BinaryAnnotation `thrift:"binary_annotations,8" json:"binary_annotations"` - Debug bool `thrift:"debug,9" json:"debug,omitempty"` - Timestamp *int64 `thrift:"timestamp,10" json:"timestamp,omitempty"` - Duration *int64 `thrift:"duration,11" json:"duration,omitempty"` -} - -func NewSpan() *Span { - return &Span{} -} - -func (p *Span) GetTraceID() int64 { - return p.TraceID -} - -func (p *Span) GetName() string { - return p.Name -} - -func (p *Span) GetID() int64 { - return p.ID -} - -var Span_ParentID_DEFAULT int64 - -func (p *Span) GetParentID() int64 { - if !p.IsSetParentID() { - return Span_ParentID_DEFAULT - } - return *p.ParentID -} - -func (p *Span) GetAnnotations() []*Annotation { - return p.Annotations -} - -func (p *Span) GetBinaryAnnotations() []*BinaryAnnotation { - return p.BinaryAnnotations -} - -var Span_Debug_DEFAULT bool = false - -func (p *Span) GetDebug() bool { - return p.Debug -} - -var Span_Timestamp_DEFAULT int64 - -func (p *Span) GetTimestamp() int64 { - if !p.IsSetTimestamp() { - return Span_Timestamp_DEFAULT - } - return *p.Timestamp -} - -var Span_Duration_DEFAULT int64 - -func (p *Span) GetDuration() int64 { - if !p.IsSetDuration() { - return Span_Duration_DEFAULT - } - return *p.Duration -} -func (p *Span) IsSetParentID() bool { - return p.ParentID != nil -} - -func (p *Span) IsSetDebug() bool { - return p.Debug != Span_Debug_DEFAULT -} - -func (p *Span) IsSetTimestamp() bool { - return p.Timestamp != nil -} - -func (p *Span) IsSetDuration() bool { - return p.Duration != nil -} - -func (p *Span) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - case 5: - if err := p.readField5(iprot); err != nil { - return err - } - case 6: - if err := p.readField6(iprot); err != nil { - return err - } - case 8: - if err := p.readField8(iprot); err != nil { - return err - } - case 9: - if err := p.readField9(iprot); err != nil { - return err - } - case 10: - if err := p.readField10(iprot); err != nil { - return err - } - case 11: - if err := p.readField11(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *Span) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.TraceID = v - } - return nil -} - -func (p *Span) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.Name = v - } - return nil -} - -func (p *Span) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.ID = v - } - return nil -} - -func (p *Span) readField5(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 5: ", err) - } else { - p.ParentID = &v - } - return nil -} - -func (p *Span) readField6(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Annotation, 0, size) - p.Annotations = tSlice - for i := 0; i < size; i++ { - _elem0 := &Annotation{} - if err := _elem0.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) - } - p.Annotations = append(p.Annotations, _elem0) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) readField8(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*BinaryAnnotation, 0, size) - p.BinaryAnnotations = tSlice - for i := 0; i < size; i++ { - _elem1 := &BinaryAnnotation{} - if err := _elem1.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem1), err) - } - p.BinaryAnnotations = append(p.BinaryAnnotations, _elem1) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) readField9(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 9: ", err) - } else { - p.Debug = v - } - return nil -} - -func (p *Span) readField10(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 10: ", err) - } else { - p.Timestamp = &v - } - return nil -} - -func (p *Span) readField11(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 11: ", err) - } else { - p.Duration = &v - } - return nil -} - -func (p *Span) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Span"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := p.writeField5(oprot); err != nil { - return err - } - if err := p.writeField6(oprot); err != nil { - return err - } - if err := p.writeField8(oprot); err != nil { - return err - } - if err := p.writeField9(oprot); err != nil { - return err - } - if err := p.writeField10(oprot); err != nil { - return err - } - if err := p.writeField11(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Span) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("trace_id", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:trace_id: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceID)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.trace_id (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:trace_id: ", p), err) - } - return err -} - -func (p *Span) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("name", thrift.STRING, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:name: ", p), err) - } - if err := oprot.WriteString(string(p.Name)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.name (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:name: ", p), err) - } - return err -} - -func (p *Span) writeField4(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("id", thrift.I64, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:id: ", p), err) - } - if err := oprot.WriteI64(int64(p.ID)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.id (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:id: ", p), err) - } - return err -} - -func (p *Span) writeField5(oprot thrift.TProtocol) (err error) { - if p.IsSetParentID() { - if err := oprot.WriteFieldBegin("parent_id", thrift.I64, 5); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:parent_id: ", p), err) - } - if err := oprot.WriteI64(int64(*p.ParentID)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.parent_id (5) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 5:parent_id: ", p), err) - } - } - return err -} - -func (p *Span) writeField6(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("annotations", thrift.LIST, 6); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:annotations: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Annotations)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Annotations { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 6:annotations: ", p), err) - } - return err -} - -func (p *Span) writeField8(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("binary_annotations", thrift.LIST, 8); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:binary_annotations: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.BinaryAnnotations)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.BinaryAnnotations { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 8:binary_annotations: ", p), err) - } - return err -} - -func (p *Span) writeField9(oprot thrift.TProtocol) (err error) { - if p.IsSetDebug() { - if err := oprot.WriteFieldBegin("debug", thrift.BOOL, 9); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:debug: ", p), err) - } - if err := oprot.WriteBool(bool(p.Debug)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.debug (9) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 9:debug: ", p), err) - } - } - return err -} - -func (p *Span) writeField10(oprot thrift.TProtocol) (err error) { - if p.IsSetTimestamp() { - if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 10); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 10:timestamp: ", p), err) - } - if err := oprot.WriteI64(int64(*p.Timestamp)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.timestamp (10) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 10:timestamp: ", p), err) - } - } - return err -} - -func (p *Span) writeField11(oprot thrift.TProtocol) (err error) { - if p.IsSetDuration() { - if err := oprot.WriteFieldBegin("duration", thrift.I64, 11); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 11:duration: ", p), err) - } - if err := oprot.WriteI64(int64(*p.Duration)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.duration (11) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 11:duration: ", p), err) - } - } - return err -} - -func (p *Span) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Span(%+v)", *p) -} - -// Attributes: -// - Ok -type Response struct { - Ok bool `thrift:"ok,1,required" json:"ok"` -} - -func NewResponse() *Response { - return &Response{} -} - -func (p *Response) GetOk() bool { - return p.Ok -} -func (p *Response) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetOk bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetOk = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetOk { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ok is not set")) - } - return nil -} - -func (p *Response) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Ok = v - } - return nil -} - -func (p *Response) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Response"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Response) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("ok", thrift.BOOL, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ok: ", p), err) - } - if err := oprot.WriteBool(bool(p.Ok)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.ok (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ok: ", p), err) - } - return err -} - -func (p *Response) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Response(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go deleted file mode 100644 index 417e883d0e31..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go +++ /dev/null @@ -1,446 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package zipkincore - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -type ZipkinCollector interface { - // Parameters: - // - Spans - SubmitZipkinBatch(spans []*Span) (r []*Response, err error) -} - -type ZipkinCollectorClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewZipkinCollectorClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *ZipkinCollectorClient { - return &ZipkinCollectorClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewZipkinCollectorClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *ZipkinCollectorClient { - return &ZipkinCollectorClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// Parameters: -// - Spans -func (p *ZipkinCollectorClient) SubmitZipkinBatch(spans []*Span) (r []*Response, err error) { - if err = p.sendSubmitZipkinBatch(spans); err != nil { - return - } - return p.recvSubmitZipkinBatch() -} - -func (p *ZipkinCollectorClient) sendSubmitZipkinBatch(spans []*Span) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("submitZipkinBatch", thrift.CALL, p.SeqId); err != nil { - return - } - args := ZipkinCollectorSubmitZipkinBatchArgs{ - Spans: spans, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -func (p *ZipkinCollectorClient) recvSubmitZipkinBatch() (value []*Response, err error) { - iprot := p.InputProtocol - if iprot == nil { - iprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.InputProtocol = iprot - } - method, mTypeId, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return - } - if method != "submitZipkinBatch" { - err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "submitZipkinBatch failed: wrong method name") - return - } - if p.SeqId != seqId { - err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "submitZipkinBatch failed: out of sequence response") - return - } - if mTypeId == thrift.EXCEPTION { - error2 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error3 error - error3, err = error2.Read(iprot) - if err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - err = error3 - return - } - if mTypeId != thrift.REPLY { - err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "submitZipkinBatch failed: invalid message type") - return - } - result := ZipkinCollectorSubmitZipkinBatchResult{} - if err = result.Read(iprot); err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - value = result.GetSuccess() - return -} - -type ZipkinCollectorProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler ZipkinCollector -} - -func (p *ZipkinCollectorProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *ZipkinCollectorProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *ZipkinCollectorProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewZipkinCollectorProcessor(handler ZipkinCollector) *ZipkinCollectorProcessor { - - self4 := &ZipkinCollectorProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self4.processorMap["submitZipkinBatch"] = &zipkinCollectorProcessorSubmitZipkinBatch{handler: handler} - return self4 -} - -func (p *ZipkinCollectorProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x5 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x5.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x5 - -} - -type zipkinCollectorProcessorSubmitZipkinBatch struct { - handler ZipkinCollector -} - -func (p *zipkinCollectorProcessorSubmitZipkinBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := ZipkinCollectorSubmitZipkinBatchArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) - oprot.WriteMessageBegin("submitZipkinBatch", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, err - } - - iprot.ReadMessageEnd() - result := ZipkinCollectorSubmitZipkinBatchResult{} - var retval []*Response - var err2 error - if retval, err2 = p.handler.SubmitZipkinBatch(args.Spans); err2 != nil { - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing submitZipkinBatch: "+err2.Error()) - oprot.WriteMessageBegin("submitZipkinBatch", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return true, err2 - } else { - result.Success = retval - } - if err2 = oprot.WriteMessageBegin("submitZipkinBatch", thrift.REPLY, seqId); err2 != nil { - err = err2 - } - if err2 = result.Write(oprot); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.Flush(); err == nil && err2 != nil { - err = err2 - } - if err != nil { - return - } - return true, err -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - Spans -type ZipkinCollectorSubmitZipkinBatchArgs struct { - Spans []*Span `thrift:"spans,1" json:"spans"` -} - -func NewZipkinCollectorSubmitZipkinBatchArgs() *ZipkinCollectorSubmitZipkinBatchArgs { - return &ZipkinCollectorSubmitZipkinBatchArgs{} -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) GetSpans() []*Span { - return p.Spans -} -func (p *ZipkinCollectorSubmitZipkinBatchArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) readField1(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Span, 0, size) - p.Spans = tSlice - for i := 0; i < size; i++ { - _elem6 := &Span{} - if err := _elem6.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem6), err) - } - p.Spans = append(p.Spans, _elem6) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("submitZipkinBatch_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spans", thrift.LIST, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:spans: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Spans { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:spans: ", p), err) - } - return err -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("ZipkinCollectorSubmitZipkinBatchArgs(%+v)", *p) -} - -// Attributes: -// - Success -type ZipkinCollectorSubmitZipkinBatchResult struct { - Success []*Response `thrift:"success,0" json:"success,omitempty"` -} - -func NewZipkinCollectorSubmitZipkinBatchResult() *ZipkinCollectorSubmitZipkinBatchResult { - return &ZipkinCollectorSubmitZipkinBatchResult{} -} - -var ZipkinCollectorSubmitZipkinBatchResult_Success_DEFAULT []*Response - -func (p *ZipkinCollectorSubmitZipkinBatchResult) GetSuccess() []*Response { - return p.Success -} -func (p *ZipkinCollectorSubmitZipkinBatchResult) IsSetSuccess() bool { - return p.Success != nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 0: - if err := p.readField0(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) readField0(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Response, 0, size) - p.Success = tSlice - for i := 0; i < size; i++ { - _elem7 := &Response{} - if err := _elem7.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem7), err) - } - p.Success = append(p.Success, _elem7) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("submitZipkinBatch_result"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField0(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) writeField0(oprot thrift.TProtocol) (err error) { - if p.IsSetSuccess() { - if err := oprot.WriteFieldBegin("success", thrift.LIST, 0); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Success)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Success { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) - } - } - return err -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("ZipkinCollectorSubmitZipkinBatchResult(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/README.md b/vendor/github.com/uber/jaeger-client-go/thrift/README.md deleted file mode 100644 index 1d8e642e028b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Apache Thrift - -This is a partial copy of Apache Thrift v0.10 (https://github.com/apache/thrift/commit/b2a4d4ae21c789b689dd162deb819665567f481c). - -It is vendored code to avoid compatibility issues introduced in Thrift v0.11. - -See https://github.com/jaegertracing/jaeger-client-go/pull/303. diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go deleted file mode 100644 index 6655cc5a9720..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -const ( - UNKNOWN_APPLICATION_EXCEPTION = 0 - UNKNOWN_METHOD = 1 - INVALID_MESSAGE_TYPE_EXCEPTION = 2 - WRONG_METHOD_NAME = 3 - BAD_SEQUENCE_ID = 4 - MISSING_RESULT = 5 - INTERNAL_ERROR = 6 - PROTOCOL_ERROR = 7 -) - -// Application level Thrift exception -type TApplicationException interface { - TException - TypeId() int32 - Read(iprot TProtocol) (TApplicationException, error) - Write(oprot TProtocol) error -} - -type tApplicationException struct { - message string - type_ int32 -} - -func (e tApplicationException) Error() string { - return e.message -} - -func NewTApplicationException(type_ int32, message string) TApplicationException { - return &tApplicationException{message, type_} -} - -func (p *tApplicationException) TypeId() int32 { - return p.type_ -} - -func (p *tApplicationException) Read(iprot TProtocol) (TApplicationException, error) { - _, err := iprot.ReadStructBegin() - if err != nil { - return nil, err - } - - message := "" - type_ := int32(UNKNOWN_APPLICATION_EXCEPTION) - - for { - _, ttype, id, err := iprot.ReadFieldBegin() - if err != nil { - return nil, err - } - if ttype == STOP { - break - } - switch id { - case 1: - if ttype == STRING { - if message, err = iprot.ReadString(); err != nil { - return nil, err - } - } else { - if err = SkipDefaultDepth(iprot, ttype); err != nil { - return nil, err - } - } - case 2: - if ttype == I32 { - if type_, err = iprot.ReadI32(); err != nil { - return nil, err - } - } else { - if err = SkipDefaultDepth(iprot, ttype); err != nil { - return nil, err - } - } - default: - if err = SkipDefaultDepth(iprot, ttype); err != nil { - return nil, err - } - } - if err = iprot.ReadFieldEnd(); err != nil { - return nil, err - } - } - return NewTApplicationException(type_, message), iprot.ReadStructEnd() -} - -func (p *tApplicationException) Write(oprot TProtocol) (err error) { - err = oprot.WriteStructBegin("TApplicationException") - if len(p.Error()) > 0 { - err = oprot.WriteFieldBegin("message", STRING, 1) - if err != nil { - return - } - err = oprot.WriteString(p.Error()) - if err != nil { - return - } - err = oprot.WriteFieldEnd() - if err != nil { - return - } - } - err = oprot.WriteFieldBegin("type", I32, 2) - if err != nil { - return - } - err = oprot.WriteI32(p.type_) - if err != nil { - return - } - err = oprot.WriteFieldEnd() - if err != nil { - return - } - err = oprot.WriteFieldStop() - if err != nil { - return - } - err = oprot.WriteStructEnd() - return -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go deleted file mode 100644 index 690d341111b5..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go +++ /dev/null @@ -1,514 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" - "math" -) - -type TBinaryProtocol struct { - trans TRichTransport - origTransport TTransport - reader io.Reader - writer io.Writer - strictRead bool - strictWrite bool - buffer [64]byte -} - -type TBinaryProtocolFactory struct { - strictRead bool - strictWrite bool -} - -func NewTBinaryProtocolTransport(t TTransport) *TBinaryProtocol { - return NewTBinaryProtocol(t, false, true) -} - -func NewTBinaryProtocol(t TTransport, strictRead, strictWrite bool) *TBinaryProtocol { - p := &TBinaryProtocol{origTransport: t, strictRead: strictRead, strictWrite: strictWrite} - if et, ok := t.(TRichTransport); ok { - p.trans = et - } else { - p.trans = NewTRichTransport(t) - } - p.reader = p.trans - p.writer = p.trans - return p -} - -func NewTBinaryProtocolFactoryDefault() *TBinaryProtocolFactory { - return NewTBinaryProtocolFactory(false, true) -} - -func NewTBinaryProtocolFactory(strictRead, strictWrite bool) *TBinaryProtocolFactory { - return &TBinaryProtocolFactory{strictRead: strictRead, strictWrite: strictWrite} -} - -func (p *TBinaryProtocolFactory) GetProtocol(t TTransport) TProtocol { - return NewTBinaryProtocol(t, p.strictRead, p.strictWrite) -} - -/** - * Writing Methods - */ - -func (p *TBinaryProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { - if p.strictWrite { - version := uint32(VERSION_1) | uint32(typeId) - e := p.WriteI32(int32(version)) - if e != nil { - return e - } - e = p.WriteString(name) - if e != nil { - return e - } - e = p.WriteI32(seqId) - return e - } else { - e := p.WriteString(name) - if e != nil { - return e - } - e = p.WriteByte(int8(typeId)) - if e != nil { - return e - } - e = p.WriteI32(seqId) - return e - } - return nil -} - -func (p *TBinaryProtocol) WriteMessageEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteStructBegin(name string) error { - return nil -} - -func (p *TBinaryProtocol) WriteStructEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { - e := p.WriteByte(int8(typeId)) - if e != nil { - return e - } - e = p.WriteI16(id) - return e -} - -func (p *TBinaryProtocol) WriteFieldEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteFieldStop() error { - e := p.WriteByte(STOP) - return e -} - -func (p *TBinaryProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { - e := p.WriteByte(int8(keyType)) - if e != nil { - return e - } - e = p.WriteByte(int8(valueType)) - if e != nil { - return e - } - e = p.WriteI32(int32(size)) - return e -} - -func (p *TBinaryProtocol) WriteMapEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteListBegin(elemType TType, size int) error { - e := p.WriteByte(int8(elemType)) - if e != nil { - return e - } - e = p.WriteI32(int32(size)) - return e -} - -func (p *TBinaryProtocol) WriteListEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteSetBegin(elemType TType, size int) error { - e := p.WriteByte(int8(elemType)) - if e != nil { - return e - } - e = p.WriteI32(int32(size)) - return e -} - -func (p *TBinaryProtocol) WriteSetEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteBool(value bool) error { - if value { - return p.WriteByte(1) - } - return p.WriteByte(0) -} - -func (p *TBinaryProtocol) WriteByte(value int8) error { - e := p.trans.WriteByte(byte(value)) - return NewTProtocolException(e) -} - -func (p *TBinaryProtocol) WriteI16(value int16) error { - v := p.buffer[0:2] - binary.BigEndian.PutUint16(v, uint16(value)) - _, e := p.writer.Write(v) - return NewTProtocolException(e) -} - -func (p *TBinaryProtocol) WriteI32(value int32) error { - v := p.buffer[0:4] - binary.BigEndian.PutUint32(v, uint32(value)) - _, e := p.writer.Write(v) - return NewTProtocolException(e) -} - -func (p *TBinaryProtocol) WriteI64(value int64) error { - v := p.buffer[0:8] - binary.BigEndian.PutUint64(v, uint64(value)) - _, err := p.writer.Write(v) - return NewTProtocolException(err) -} - -func (p *TBinaryProtocol) WriteDouble(value float64) error { - return p.WriteI64(int64(math.Float64bits(value))) -} - -func (p *TBinaryProtocol) WriteString(value string) error { - e := p.WriteI32(int32(len(value))) - if e != nil { - return e - } - _, err := p.trans.WriteString(value) - return NewTProtocolException(err) -} - -func (p *TBinaryProtocol) WriteBinary(value []byte) error { - e := p.WriteI32(int32(len(value))) - if e != nil { - return e - } - _, err := p.writer.Write(value) - return NewTProtocolException(err) -} - -/** - * Reading methods - */ - -func (p *TBinaryProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { - size, e := p.ReadI32() - if e != nil { - return "", typeId, 0, NewTProtocolException(e) - } - if size < 0 { - typeId = TMessageType(size & 0x0ff) - version := int64(int64(size) & VERSION_MASK) - if version != VERSION_1 { - return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Bad version in ReadMessageBegin")) - } - name, e = p.ReadString() - if e != nil { - return name, typeId, seqId, NewTProtocolException(e) - } - seqId, e = p.ReadI32() - if e != nil { - return name, typeId, seqId, NewTProtocolException(e) - } - return name, typeId, seqId, nil - } - if p.strictRead { - return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Missing version in ReadMessageBegin")) - } - name, e2 := p.readStringBody(size) - if e2 != nil { - return name, typeId, seqId, e2 - } - b, e3 := p.ReadByte() - if e3 != nil { - return name, typeId, seqId, e3 - } - typeId = TMessageType(b) - seqId, e4 := p.ReadI32() - if e4 != nil { - return name, typeId, seqId, e4 - } - return name, typeId, seqId, nil -} - -func (p *TBinaryProtocol) ReadMessageEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadStructBegin() (name string, err error) { - return -} - -func (p *TBinaryProtocol) ReadStructEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadFieldBegin() (name string, typeId TType, seqId int16, err error) { - t, err := p.ReadByte() - typeId = TType(t) - if err != nil { - return name, typeId, seqId, err - } - if t != STOP { - seqId, err = p.ReadI16() - } - return name, typeId, seqId, err -} - -func (p *TBinaryProtocol) ReadFieldEnd() error { - return nil -} - -var invalidDataLength = NewTProtocolExceptionWithType(INVALID_DATA, errors.New("Invalid data length")) - -func (p *TBinaryProtocol) ReadMapBegin() (kType, vType TType, size int, err error) { - k, e := p.ReadByte() - if e != nil { - err = NewTProtocolException(e) - return - } - kType = TType(k) - v, e := p.ReadByte() - if e != nil { - err = NewTProtocolException(e) - return - } - vType = TType(v) - size32, e := p.ReadI32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size32 < 0 { - err = invalidDataLength - return - } - size = int(size32) - return kType, vType, size, nil -} - -func (p *TBinaryProtocol) ReadMapEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadListBegin() (elemType TType, size int, err error) { - b, e := p.ReadByte() - if e != nil { - err = NewTProtocolException(e) - return - } - elemType = TType(b) - size32, e := p.ReadI32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size32 < 0 { - err = invalidDataLength - return - } - size = int(size32) - - return -} - -func (p *TBinaryProtocol) ReadListEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadSetBegin() (elemType TType, size int, err error) { - b, e := p.ReadByte() - if e != nil { - err = NewTProtocolException(e) - return - } - elemType = TType(b) - size32, e := p.ReadI32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size32 < 0 { - err = invalidDataLength - return - } - size = int(size32) - return elemType, size, nil -} - -func (p *TBinaryProtocol) ReadSetEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadBool() (bool, error) { - b, e := p.ReadByte() - v := true - if b != 1 { - v = false - } - return v, e -} - -func (p *TBinaryProtocol) ReadByte() (int8, error) { - v, err := p.trans.ReadByte() - return int8(v), err -} - -func (p *TBinaryProtocol) ReadI16() (value int16, err error) { - buf := p.buffer[0:2] - err = p.readAll(buf) - value = int16(binary.BigEndian.Uint16(buf)) - return value, err -} - -func (p *TBinaryProtocol) ReadI32() (value int32, err error) { - buf := p.buffer[0:4] - err = p.readAll(buf) - value = int32(binary.BigEndian.Uint32(buf)) - return value, err -} - -func (p *TBinaryProtocol) ReadI64() (value int64, err error) { - buf := p.buffer[0:8] - err = p.readAll(buf) - value = int64(binary.BigEndian.Uint64(buf)) - return value, err -} - -func (p *TBinaryProtocol) ReadDouble() (value float64, err error) { - buf := p.buffer[0:8] - err = p.readAll(buf) - value = math.Float64frombits(binary.BigEndian.Uint64(buf)) - return value, err -} - -func (p *TBinaryProtocol) ReadString() (value string, err error) { - size, e := p.ReadI32() - if e != nil { - return "", e - } - if size < 0 { - err = invalidDataLength - return - } - - return p.readStringBody(size) -} - -func (p *TBinaryProtocol) ReadBinary() ([]byte, error) { - size, e := p.ReadI32() - if e != nil { - return nil, e - } - if size < 0 { - return nil, invalidDataLength - } - if uint64(size) > p.trans.RemainingBytes() { - return nil, invalidDataLength - } - - isize := int(size) - buf := make([]byte, isize) - _, err := io.ReadFull(p.trans, buf) - return buf, NewTProtocolException(err) -} - -func (p *TBinaryProtocol) Flush() (err error) { - return NewTProtocolException(p.trans.Flush()) -} - -func (p *TBinaryProtocol) Skip(fieldType TType) (err error) { - return SkipDefaultDepth(p, fieldType) -} - -func (p *TBinaryProtocol) Transport() TTransport { - return p.origTransport -} - -func (p *TBinaryProtocol) readAll(buf []byte) error { - _, err := io.ReadFull(p.reader, buf) - return NewTProtocolException(err) -} - -const readLimit = 32768 - -func (p *TBinaryProtocol) readStringBody(size int32) (value string, err error) { - if size < 0 { - return "", nil - } - if uint64(size) > p.trans.RemainingBytes() { - return "", invalidDataLength - } - - var ( - buf bytes.Buffer - e error - b []byte - ) - - switch { - case int(size) <= len(p.buffer): - b = p.buffer[:size] // avoids allocation for small reads - case int(size) < readLimit: - b = make([]byte, size) - default: - b = make([]byte, readLimit) - } - - for size > 0 { - _, e = io.ReadFull(p.trans, b) - buf.Write(b) - if e != nil { - break - } - size -= readLimit - if size < readLimit && size > 0 { - b = b[:size] - } - } - return buf.String(), NewTProtocolException(e) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go deleted file mode 100644 index b9299f2fa13c..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go +++ /dev/null @@ -1,815 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "encoding/binary" - "fmt" - "io" - "math" -) - -const ( - COMPACT_PROTOCOL_ID = 0x082 - COMPACT_VERSION = 1 - COMPACT_VERSION_MASK = 0x1f - COMPACT_TYPE_MASK = 0x0E0 - COMPACT_TYPE_BITS = 0x07 - COMPACT_TYPE_SHIFT_AMOUNT = 5 -) - -type tCompactType byte - -const ( - COMPACT_BOOLEAN_TRUE = 0x01 - COMPACT_BOOLEAN_FALSE = 0x02 - COMPACT_BYTE = 0x03 - COMPACT_I16 = 0x04 - COMPACT_I32 = 0x05 - COMPACT_I64 = 0x06 - COMPACT_DOUBLE = 0x07 - COMPACT_BINARY = 0x08 - COMPACT_LIST = 0x09 - COMPACT_SET = 0x0A - COMPACT_MAP = 0x0B - COMPACT_STRUCT = 0x0C -) - -var ( - ttypeToCompactType map[TType]tCompactType -) - -func init() { - ttypeToCompactType = map[TType]tCompactType{ - STOP: STOP, - BOOL: COMPACT_BOOLEAN_TRUE, - BYTE: COMPACT_BYTE, - I16: COMPACT_I16, - I32: COMPACT_I32, - I64: COMPACT_I64, - DOUBLE: COMPACT_DOUBLE, - STRING: COMPACT_BINARY, - LIST: COMPACT_LIST, - SET: COMPACT_SET, - MAP: COMPACT_MAP, - STRUCT: COMPACT_STRUCT, - } -} - -type TCompactProtocolFactory struct{} - -func NewTCompactProtocolFactory() *TCompactProtocolFactory { - return &TCompactProtocolFactory{} -} - -func (p *TCompactProtocolFactory) GetProtocol(trans TTransport) TProtocol { - return NewTCompactProtocol(trans) -} - -type TCompactProtocol struct { - trans TRichTransport - origTransport TTransport - - // Used to keep track of the last field for the current and previous structs, - // so we can do the delta stuff. - lastField []int - lastFieldId int - - // If we encounter a boolean field begin, save the TField here so it can - // have the value incorporated. - booleanFieldName string - booleanFieldId int16 - booleanFieldPending bool - - // If we read a field header, and it's a boolean field, save the boolean - // value here so that readBool can use it. - boolValue bool - boolValueIsNotNull bool - buffer [64]byte -} - -// Create a TCompactProtocol given a TTransport -func NewTCompactProtocol(trans TTransport) *TCompactProtocol { - p := &TCompactProtocol{origTransport: trans, lastField: []int{}} - if et, ok := trans.(TRichTransport); ok { - p.trans = et - } else { - p.trans = NewTRichTransport(trans) - } - - return p - -} - -// -// Public Writing methods. -// - -// Write a message header to the wire. Compact Protocol messages contain the -// protocol version so we can migrate forwards in the future if need be. -func (p *TCompactProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error { - err := p.writeByteDirect(COMPACT_PROTOCOL_ID) - if err != nil { - return NewTProtocolException(err) - } - err = p.writeByteDirect((COMPACT_VERSION & COMPACT_VERSION_MASK) | ((byte(typeId) << COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_MASK)) - if err != nil { - return NewTProtocolException(err) - } - _, err = p.writeVarint32(seqid) - if err != nil { - return NewTProtocolException(err) - } - e := p.WriteString(name) - return e - -} - -func (p *TCompactProtocol) WriteMessageEnd() error { return nil } - -// Write a struct begin. This doesn't actually put anything on the wire. We -// use it as an opportunity to put special placeholder markers on the field -// stack so we can get the field id deltas correct. -func (p *TCompactProtocol) WriteStructBegin(name string) error { - p.lastField = append(p.lastField, p.lastFieldId) - p.lastFieldId = 0 - return nil -} - -// Write a struct end. This doesn't actually put anything on the wire. We use -// this as an opportunity to pop the last field from the current struct off -// of the field stack. -func (p *TCompactProtocol) WriteStructEnd() error { - p.lastFieldId = p.lastField[len(p.lastField)-1] - p.lastField = p.lastField[:len(p.lastField)-1] - return nil -} - -func (p *TCompactProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { - if typeId == BOOL { - // we want to possibly include the value, so we'll wait. - p.booleanFieldName, p.booleanFieldId, p.booleanFieldPending = name, id, true - return nil - } - _, err := p.writeFieldBeginInternal(name, typeId, id, 0xFF) - return NewTProtocolException(err) -} - -// The workhorse of writeFieldBegin. It has the option of doing a -// 'type override' of the type header. This is used specifically in the -// boolean field case. -func (p *TCompactProtocol) writeFieldBeginInternal(name string, typeId TType, id int16, typeOverride byte) (int, error) { - // short lastField = lastField_.pop(); - - // if there's a type override, use that. - var typeToWrite byte - if typeOverride == 0xFF { - typeToWrite = byte(p.getCompactType(typeId)) - } else { - typeToWrite = typeOverride - } - // check if we can use delta encoding for the field id - fieldId := int(id) - written := 0 - if fieldId > p.lastFieldId && fieldId-p.lastFieldId <= 15 { - // write them together - err := p.writeByteDirect(byte((fieldId-p.lastFieldId)<<4) | typeToWrite) - if err != nil { - return 0, err - } - } else { - // write them separate - err := p.writeByteDirect(typeToWrite) - if err != nil { - return 0, err - } - err = p.WriteI16(id) - written = 1 + 2 - if err != nil { - return 0, err - } - } - - p.lastFieldId = fieldId - // p.lastField.Push(field.id); - return written, nil -} - -func (p *TCompactProtocol) WriteFieldEnd() error { return nil } - -func (p *TCompactProtocol) WriteFieldStop() error { - err := p.writeByteDirect(STOP) - return NewTProtocolException(err) -} - -func (p *TCompactProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { - if size == 0 { - err := p.writeByteDirect(0) - return NewTProtocolException(err) - } - _, err := p.writeVarint32(int32(size)) - if err != nil { - return NewTProtocolException(err) - } - err = p.writeByteDirect(byte(p.getCompactType(keyType))<<4 | byte(p.getCompactType(valueType))) - return NewTProtocolException(err) -} - -func (p *TCompactProtocol) WriteMapEnd() error { return nil } - -// Write a list header. -func (p *TCompactProtocol) WriteListBegin(elemType TType, size int) error { - _, err := p.writeCollectionBegin(elemType, size) - return NewTProtocolException(err) -} - -func (p *TCompactProtocol) WriteListEnd() error { return nil } - -// Write a set header. -func (p *TCompactProtocol) WriteSetBegin(elemType TType, size int) error { - _, err := p.writeCollectionBegin(elemType, size) - return NewTProtocolException(err) -} - -func (p *TCompactProtocol) WriteSetEnd() error { return nil } - -func (p *TCompactProtocol) WriteBool(value bool) error { - v := byte(COMPACT_BOOLEAN_FALSE) - if value { - v = byte(COMPACT_BOOLEAN_TRUE) - } - if p.booleanFieldPending { - // we haven't written the field header yet - _, err := p.writeFieldBeginInternal(p.booleanFieldName, BOOL, p.booleanFieldId, v) - p.booleanFieldPending = false - return NewTProtocolException(err) - } - // we're not part of a field, so just write the value. - err := p.writeByteDirect(v) - return NewTProtocolException(err) -} - -// Write a byte. Nothing to see here! -func (p *TCompactProtocol) WriteByte(value int8) error { - err := p.writeByteDirect(byte(value)) - return NewTProtocolException(err) -} - -// Write an I16 as a zigzag varint. -func (p *TCompactProtocol) WriteI16(value int16) error { - _, err := p.writeVarint32(p.int32ToZigzag(int32(value))) - return NewTProtocolException(err) -} - -// Write an i32 as a zigzag varint. -func (p *TCompactProtocol) WriteI32(value int32) error { - _, err := p.writeVarint32(p.int32ToZigzag(value)) - return NewTProtocolException(err) -} - -// Write an i64 as a zigzag varint. -func (p *TCompactProtocol) WriteI64(value int64) error { - _, err := p.writeVarint64(p.int64ToZigzag(value)) - return NewTProtocolException(err) -} - -// Write a double to the wire as 8 bytes. -func (p *TCompactProtocol) WriteDouble(value float64) error { - buf := p.buffer[0:8] - binary.LittleEndian.PutUint64(buf, math.Float64bits(value)) - _, err := p.trans.Write(buf) - return NewTProtocolException(err) -} - -// Write a string to the wire with a varint size preceding. -func (p *TCompactProtocol) WriteString(value string) error { - _, e := p.writeVarint32(int32(len(value))) - if e != nil { - return NewTProtocolException(e) - } - if len(value) > 0 { - } - _, e = p.trans.WriteString(value) - return e -} - -// Write a byte array, using a varint for the size. -func (p *TCompactProtocol) WriteBinary(bin []byte) error { - _, e := p.writeVarint32(int32(len(bin))) - if e != nil { - return NewTProtocolException(e) - } - if len(bin) > 0 { - _, e = p.trans.Write(bin) - return NewTProtocolException(e) - } - return nil -} - -// -// Reading methods. -// - -// Read a message header. -func (p *TCompactProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { - - protocolId, err := p.readByteDirect() - if err != nil { - return - } - - if protocolId != COMPACT_PROTOCOL_ID { - e := fmt.Errorf("Expected protocol id %02x but got %02x", COMPACT_PROTOCOL_ID, protocolId) - return "", typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, e) - } - - versionAndType, err := p.readByteDirect() - if err != nil { - return - } - - version := versionAndType & COMPACT_VERSION_MASK - typeId = TMessageType((versionAndType >> COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_BITS) - if version != COMPACT_VERSION { - e := fmt.Errorf("Expected version %02x but got %02x", COMPACT_VERSION, version) - err = NewTProtocolExceptionWithType(BAD_VERSION, e) - return - } - seqId, e := p.readVarint32() - if e != nil { - err = NewTProtocolException(e) - return - } - name, err = p.ReadString() - return -} - -func (p *TCompactProtocol) ReadMessageEnd() error { return nil } - -// Read a struct begin. There's nothing on the wire for this, but it is our -// opportunity to push a new struct begin marker onto the field stack. -func (p *TCompactProtocol) ReadStructBegin() (name string, err error) { - p.lastField = append(p.lastField, p.lastFieldId) - p.lastFieldId = 0 - return -} - -// Doesn't actually consume any wire data, just removes the last field for -// this struct from the field stack. -func (p *TCompactProtocol) ReadStructEnd() error { - // consume the last field we read off the wire. - p.lastFieldId = p.lastField[len(p.lastField)-1] - p.lastField = p.lastField[:len(p.lastField)-1] - return nil -} - -// Read a field header off the wire. -func (p *TCompactProtocol) ReadFieldBegin() (name string, typeId TType, id int16, err error) { - t, err := p.readByteDirect() - if err != nil { - return - } - - // if it's a stop, then we can return immediately, as the struct is over. - if (t & 0x0f) == STOP { - return "", STOP, 0, nil - } - - // mask off the 4 MSB of the type header. it could contain a field id delta. - modifier := int16((t & 0xf0) >> 4) - if modifier == 0 { - // not a delta. look ahead for the zigzag varint field id. - id, err = p.ReadI16() - if err != nil { - return - } - } else { - // has a delta. add the delta to the last read field id. - id = int16(p.lastFieldId) + modifier - } - typeId, e := p.getTType(tCompactType(t & 0x0f)) - if e != nil { - err = NewTProtocolException(e) - return - } - - // if this happens to be a boolean field, the value is encoded in the type - if p.isBoolType(t) { - // save the boolean value in a special instance variable. - p.boolValue = (byte(t)&0x0f == COMPACT_BOOLEAN_TRUE) - p.boolValueIsNotNull = true - } - - // push the new field onto the field stack so we can keep the deltas going. - p.lastFieldId = int(id) - return -} - -func (p *TCompactProtocol) ReadFieldEnd() error { return nil } - -// Read a map header off the wire. If the size is zero, skip reading the key -// and value type. This means that 0-length maps will yield TMaps without the -// "correct" types. -func (p *TCompactProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, err error) { - size32, e := p.readVarint32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size32 < 0 { - err = invalidDataLength - return - } - size = int(size32) - - keyAndValueType := byte(STOP) - if size != 0 { - keyAndValueType, err = p.readByteDirect() - if err != nil { - return - } - } - keyType, _ = p.getTType(tCompactType(keyAndValueType >> 4)) - valueType, _ = p.getTType(tCompactType(keyAndValueType & 0xf)) - return -} - -func (p *TCompactProtocol) ReadMapEnd() error { return nil } - -// Read a list header off the wire. If the list size is 0-14, the size will -// be packed into the element type header. If it's a longer list, the 4 MSB -// of the element type header will be 0xF, and a varint will follow with the -// true size. -func (p *TCompactProtocol) ReadListBegin() (elemType TType, size int, err error) { - size_and_type, err := p.readByteDirect() - if err != nil { - return - } - size = int((size_and_type >> 4) & 0x0f) - if size == 15 { - size2, e := p.readVarint32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size2 < 0 { - err = invalidDataLength - return - } - size = int(size2) - } - elemType, e := p.getTType(tCompactType(size_and_type)) - if e != nil { - err = NewTProtocolException(e) - return - } - return -} - -func (p *TCompactProtocol) ReadListEnd() error { return nil } - -// Read a set header off the wire. If the set size is 0-14, the size will -// be packed into the element type header. If it's a longer set, the 4 MSB -// of the element type header will be 0xF, and a varint will follow with the -// true size. -func (p *TCompactProtocol) ReadSetBegin() (elemType TType, size int, err error) { - return p.ReadListBegin() -} - -func (p *TCompactProtocol) ReadSetEnd() error { return nil } - -// Read a boolean off the wire. If this is a boolean field, the value should -// already have been read during readFieldBegin, so we'll just consume the -// pre-stored value. Otherwise, read a byte. -func (p *TCompactProtocol) ReadBool() (value bool, err error) { - if p.boolValueIsNotNull { - p.boolValueIsNotNull = false - return p.boolValue, nil - } - v, err := p.readByteDirect() - return v == COMPACT_BOOLEAN_TRUE, err -} - -// Read a single byte off the wire. Nothing interesting here. -func (p *TCompactProtocol) ReadByte() (int8, error) { - v, err := p.readByteDirect() - if err != nil { - return 0, NewTProtocolException(err) - } - return int8(v), err -} - -// Read an i16 from the wire as a zigzag varint. -func (p *TCompactProtocol) ReadI16() (value int16, err error) { - v, err := p.ReadI32() - return int16(v), err -} - -// Read an i32 from the wire as a zigzag varint. -func (p *TCompactProtocol) ReadI32() (value int32, err error) { - v, e := p.readVarint32() - if e != nil { - return 0, NewTProtocolException(e) - } - value = p.zigzagToInt32(v) - return value, nil -} - -// Read an i64 from the wire as a zigzag varint. -func (p *TCompactProtocol) ReadI64() (value int64, err error) { - v, e := p.readVarint64() - if e != nil { - return 0, NewTProtocolException(e) - } - value = p.zigzagToInt64(v) - return value, nil -} - -// No magic here - just read a double off the wire. -func (p *TCompactProtocol) ReadDouble() (value float64, err error) { - longBits := p.buffer[0:8] - _, e := io.ReadFull(p.trans, longBits) - if e != nil { - return 0.0, NewTProtocolException(e) - } - return math.Float64frombits(p.bytesToUint64(longBits)), nil -} - -// Reads a []byte (via readBinary), and then UTF-8 decodes it. -func (p *TCompactProtocol) ReadString() (value string, err error) { - length, e := p.readVarint32() - if e != nil { - return "", NewTProtocolException(e) - } - if length < 0 { - return "", invalidDataLength - } - if uint64(length) > p.trans.RemainingBytes() { - return "", invalidDataLength - } - - if length == 0 { - return "", nil - } - var buf []byte - if length <= int32(len(p.buffer)) { - buf = p.buffer[0:length] - } else { - buf = make([]byte, length) - } - _, e = io.ReadFull(p.trans, buf) - return string(buf), NewTProtocolException(e) -} - -// Read a []byte from the wire. -func (p *TCompactProtocol) ReadBinary() (value []byte, err error) { - length, e := p.readVarint32() - if e != nil { - return nil, NewTProtocolException(e) - } - if length == 0 { - return []byte{}, nil - } - if length < 0 { - return nil, invalidDataLength - } - if uint64(length) > p.trans.RemainingBytes() { - return nil, invalidDataLength - } - - buf := make([]byte, length) - _, e = io.ReadFull(p.trans, buf) - return buf, NewTProtocolException(e) -} - -func (p *TCompactProtocol) Flush() (err error) { - return NewTProtocolException(p.trans.Flush()) -} - -func (p *TCompactProtocol) Skip(fieldType TType) (err error) { - return SkipDefaultDepth(p, fieldType) -} - -func (p *TCompactProtocol) Transport() TTransport { - return p.origTransport -} - -// -// Internal writing methods -// - -// Abstract method for writing the start of lists and sets. List and sets on -// the wire differ only by the type indicator. -func (p *TCompactProtocol) writeCollectionBegin(elemType TType, size int) (int, error) { - if size <= 14 { - return 1, p.writeByteDirect(byte(int32(size<<4) | int32(p.getCompactType(elemType)))) - } - err := p.writeByteDirect(0xf0 | byte(p.getCompactType(elemType))) - if err != nil { - return 0, err - } - m, err := p.writeVarint32(int32(size)) - return 1 + m, err -} - -// Write an i32 as a varint. Results in 1-5 bytes on the wire. -// TODO(pomack): make a permanent buffer like writeVarint64? -func (p *TCompactProtocol) writeVarint32(n int32) (int, error) { - i32buf := p.buffer[0:5] - idx := 0 - for { - if (n & ^0x7F) == 0 { - i32buf[idx] = byte(n) - idx++ - // p.writeByteDirect(byte(n)); - break - // return; - } else { - i32buf[idx] = byte((n & 0x7F) | 0x80) - idx++ - // p.writeByteDirect(byte(((n & 0x7F) | 0x80))); - u := uint32(n) - n = int32(u >> 7) - } - } - return p.trans.Write(i32buf[0:idx]) -} - -// Write an i64 as a varint. Results in 1-10 bytes on the wire. -func (p *TCompactProtocol) writeVarint64(n int64) (int, error) { - varint64out := p.buffer[0:10] - idx := 0 - for { - if (n & ^0x7F) == 0 { - varint64out[idx] = byte(n) - idx++ - break - } else { - varint64out[idx] = byte((n & 0x7F) | 0x80) - idx++ - u := uint64(n) - n = int64(u >> 7) - } - } - return p.trans.Write(varint64out[0:idx]) -} - -// Convert l into a zigzag long. This allows negative numbers to be -// represented compactly as a varint. -func (p *TCompactProtocol) int64ToZigzag(l int64) int64 { - return (l << 1) ^ (l >> 63) -} - -// Convert l into a zigzag long. This allows negative numbers to be -// represented compactly as a varint. -func (p *TCompactProtocol) int32ToZigzag(n int32) int32 { - return (n << 1) ^ (n >> 31) -} - -func (p *TCompactProtocol) fixedUint64ToBytes(n uint64, buf []byte) { - binary.LittleEndian.PutUint64(buf, n) -} - -func (p *TCompactProtocol) fixedInt64ToBytes(n int64, buf []byte) { - binary.LittleEndian.PutUint64(buf, uint64(n)) -} - -// Writes a byte without any possibility of all that field header nonsense. -// Used internally by other writing methods that know they need to write a byte. -func (p *TCompactProtocol) writeByteDirect(b byte) error { - return p.trans.WriteByte(b) -} - -// Writes a byte without any possibility of all that field header nonsense. -func (p *TCompactProtocol) writeIntAsByteDirect(n int) (int, error) { - return 1, p.writeByteDirect(byte(n)) -} - -// -// Internal reading methods -// - -// Read an i32 from the wire as a varint. The MSB of each byte is set -// if there is another byte to follow. This can read up to 5 bytes. -func (p *TCompactProtocol) readVarint32() (int32, error) { - // if the wire contains the right stuff, this will just truncate the i64 we - // read and get us the right sign. - v, err := p.readVarint64() - return int32(v), err -} - -// Read an i64 from the wire as a proper varint. The MSB of each byte is set -// if there is another byte to follow. This can read up to 10 bytes. -func (p *TCompactProtocol) readVarint64() (int64, error) { - shift := uint(0) - result := int64(0) - for { - b, err := p.readByteDirect() - if err != nil { - return 0, err - } - result |= int64(b&0x7f) << shift - if (b & 0x80) != 0x80 { - break - } - shift += 7 - } - return result, nil -} - -// Read a byte, unlike ReadByte that reads Thrift-byte that is i8. -func (p *TCompactProtocol) readByteDirect() (byte, error) { - return p.trans.ReadByte() -} - -// -// encoding helpers -// - -// Convert from zigzag int to int. -func (p *TCompactProtocol) zigzagToInt32(n int32) int32 { - u := uint32(n) - return int32(u>>1) ^ -(n & 1) -} - -// Convert from zigzag long to long. -func (p *TCompactProtocol) zigzagToInt64(n int64) int64 { - u := uint64(n) - return int64(u>>1) ^ -(n & 1) -} - -// Note that it's important that the mask bytes are long literals, -// otherwise they'll default to ints, and when you shift an int left 56 bits, -// you just get a messed up int. -func (p *TCompactProtocol) bytesToInt64(b []byte) int64 { - return int64(binary.LittleEndian.Uint64(b)) -} - -// Note that it's important that the mask bytes are long literals, -// otherwise they'll default to ints, and when you shift an int left 56 bits, -// you just get a messed up int. -func (p *TCompactProtocol) bytesToUint64(b []byte) uint64 { - return binary.LittleEndian.Uint64(b) -} - -// -// type testing and converting -// - -func (p *TCompactProtocol) isBoolType(b byte) bool { - return (b&0x0f) == COMPACT_BOOLEAN_TRUE || (b&0x0f) == COMPACT_BOOLEAN_FALSE -} - -// Given a tCompactType constant, convert it to its corresponding -// TType value. -func (p *TCompactProtocol) getTType(t tCompactType) (TType, error) { - switch byte(t) & 0x0f { - case STOP: - return STOP, nil - case COMPACT_BOOLEAN_FALSE, COMPACT_BOOLEAN_TRUE: - return BOOL, nil - case COMPACT_BYTE: - return BYTE, nil - case COMPACT_I16: - return I16, nil - case COMPACT_I32: - return I32, nil - case COMPACT_I64: - return I64, nil - case COMPACT_DOUBLE: - return DOUBLE, nil - case COMPACT_BINARY: - return STRING, nil - case COMPACT_LIST: - return LIST, nil - case COMPACT_SET: - return SET, nil - case COMPACT_MAP: - return MAP, nil - case COMPACT_STRUCT: - return STRUCT, nil - } - return STOP, TException(fmt.Errorf("don't know what type: %d", t&0x0f)) -} - -// Given a TType value, find the appropriate TCompactProtocol.Types constant. -func (p *TCompactProtocol) getCompactType(t TType) tCompactType { - return ttypeToCompactType[t] -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/exception.go deleted file mode 100644 index ea8d6f66114c..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/exception.go +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "errors" -) - -// Generic Thrift exception -type TException interface { - error -} - -// Prepends additional information to an error without losing the Thrift exception interface -func PrependError(prepend string, err error) error { - if t, ok := err.(TTransportException); ok { - return NewTTransportException(t.TypeId(), prepend+t.Error()) - } - if t, ok := err.(TProtocolException); ok { - return NewTProtocolExceptionWithType(t.TypeId(), errors.New(prepend+err.Error())) - } - if t, ok := err.(TApplicationException); ok { - return NewTApplicationException(t.TypeId(), prepend+t.Error()) - } - - return errors.New(prepend + err.Error()) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go b/vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go deleted file mode 100644 index b62fd56f0634..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "bytes" -) - -// Memory buffer-based implementation of the TTransport interface. -type TMemoryBuffer struct { - *bytes.Buffer - size int -} - -type TMemoryBufferTransportFactory struct { - size int -} - -func (p *TMemoryBufferTransportFactory) GetTransport(trans TTransport) TTransport { - if trans != nil { - t, ok := trans.(*TMemoryBuffer) - if ok && t.size > 0 { - return NewTMemoryBufferLen(t.size) - } - } - return NewTMemoryBufferLen(p.size) -} - -func NewTMemoryBufferTransportFactory(size int) *TMemoryBufferTransportFactory { - return &TMemoryBufferTransportFactory{size: size} -} - -func NewTMemoryBuffer() *TMemoryBuffer { - return &TMemoryBuffer{Buffer: &bytes.Buffer{}, size: 0} -} - -func NewTMemoryBufferLen(size int) *TMemoryBuffer { - buf := make([]byte, 0, size) - return &TMemoryBuffer{Buffer: bytes.NewBuffer(buf), size: size} -} - -func (p *TMemoryBuffer) IsOpen() bool { - return true -} - -func (p *TMemoryBuffer) Open() error { - return nil -} - -func (p *TMemoryBuffer) Close() error { - p.Buffer.Reset() - return nil -} - -// Flushing a memory buffer is a no-op -func (p *TMemoryBuffer) Flush() error { - return nil -} - -func (p *TMemoryBuffer) RemainingBytes() (num_bytes uint64) { - return uint64(p.Buffer.Len()) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go b/vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go deleted file mode 100644 index 25ab2e98a256..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -// Message type constants in the Thrift protocol. -type TMessageType int32 - -const ( - INVALID_TMESSAGE_TYPE TMessageType = 0 - CALL TMessageType = 1 - REPLY TMessageType = 2 - EXCEPTION TMessageType = 3 - ONEWAY TMessageType = 4 -) diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/numeric.go b/vendor/github.com/uber/jaeger-client-go/thrift/numeric.go deleted file mode 100644 index aa8daa9b54f9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/numeric.go +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "math" - "strconv" -) - -type Numeric interface { - Int64() int64 - Int32() int32 - Int16() int16 - Byte() byte - Int() int - Float64() float64 - Float32() float32 - String() string - isNull() bool -} - -type numeric struct { - iValue int64 - dValue float64 - sValue string - isNil bool -} - -var ( - INFINITY Numeric - NEGATIVE_INFINITY Numeric - NAN Numeric - ZERO Numeric - NUMERIC_NULL Numeric -) - -func NewNumericFromDouble(dValue float64) Numeric { - if math.IsInf(dValue, 1) { - return INFINITY - } - if math.IsInf(dValue, -1) { - return NEGATIVE_INFINITY - } - if math.IsNaN(dValue) { - return NAN - } - iValue := int64(dValue) - sValue := strconv.FormatFloat(dValue, 'g', 10, 64) - isNil := false - return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} -} - -func NewNumericFromI64(iValue int64) Numeric { - dValue := float64(iValue) - sValue := string(iValue) - isNil := false - return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} -} - -func NewNumericFromI32(iValue int32) Numeric { - dValue := float64(iValue) - sValue := string(iValue) - isNil := false - return &numeric{iValue: int64(iValue), dValue: dValue, sValue: sValue, isNil: isNil} -} - -func NewNumericFromString(sValue string) Numeric { - if sValue == INFINITY.String() { - return INFINITY - } - if sValue == NEGATIVE_INFINITY.String() { - return NEGATIVE_INFINITY - } - if sValue == NAN.String() { - return NAN - } - iValue, _ := strconv.ParseInt(sValue, 10, 64) - dValue, _ := strconv.ParseFloat(sValue, 64) - isNil := len(sValue) == 0 - return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} -} - -func NewNumericFromJSONString(sValue string, isNull bool) Numeric { - if isNull { - return NewNullNumeric() - } - if sValue == JSON_INFINITY { - return INFINITY - } - if sValue == JSON_NEGATIVE_INFINITY { - return NEGATIVE_INFINITY - } - if sValue == JSON_NAN { - return NAN - } - iValue, _ := strconv.ParseInt(sValue, 10, 64) - dValue, _ := strconv.ParseFloat(sValue, 64) - return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNull} -} - -func NewNullNumeric() Numeric { - return &numeric{iValue: 0, dValue: 0.0, sValue: "", isNil: true} -} - -func (p *numeric) Int64() int64 { - return p.iValue -} - -func (p *numeric) Int32() int32 { - return int32(p.iValue) -} - -func (p *numeric) Int16() int16 { - return int16(p.iValue) -} - -func (p *numeric) Byte() byte { - return byte(p.iValue) -} - -func (p *numeric) Int() int { - return int(p.iValue) -} - -func (p *numeric) Float64() float64 { - return p.dValue -} - -func (p *numeric) Float32() float32 { - return float32(p.dValue) -} - -func (p *numeric) String() string { - return p.sValue -} - -func (p *numeric) isNull() bool { - return p.isNil -} - -func init() { - INFINITY = &numeric{iValue: 0, dValue: math.Inf(1), sValue: "Infinity", isNil: false} - NEGATIVE_INFINITY = &numeric{iValue: 0, dValue: math.Inf(-1), sValue: "-Infinity", isNil: false} - NAN = &numeric{iValue: 0, dValue: math.NaN(), sValue: "NaN", isNil: false} - ZERO = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: false} - NUMERIC_NULL = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: true} -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/processor.go b/vendor/github.com/uber/jaeger-client-go/thrift/processor.go deleted file mode 100644 index ca0d3faf20ee..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/processor.go +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -// A processor is a generic object which operates upon an input stream and -// writes to some output stream. -type TProcessor interface { - Process(in, out TProtocol) (bool, TException) -} - -type TProcessorFunction interface { - Process(seqId int32, in, out TProtocol) (bool, TException) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/protocol.go deleted file mode 100644 index 45fa202e741c..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/protocol.go +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "errors" -) - -const ( - VERSION_MASK = 0xffff0000 - VERSION_1 = 0x80010000 -) - -type TProtocol interface { - WriteMessageBegin(name string, typeId TMessageType, seqid int32) error - WriteMessageEnd() error - WriteStructBegin(name string) error - WriteStructEnd() error - WriteFieldBegin(name string, typeId TType, id int16) error - WriteFieldEnd() error - WriteFieldStop() error - WriteMapBegin(keyType TType, valueType TType, size int) error - WriteMapEnd() error - WriteListBegin(elemType TType, size int) error - WriteListEnd() error - WriteSetBegin(elemType TType, size int) error - WriteSetEnd() error - WriteBool(value bool) error - WriteByte(value int8) error - WriteI16(value int16) error - WriteI32(value int32) error - WriteI64(value int64) error - WriteDouble(value float64) error - WriteString(value string) error - WriteBinary(value []byte) error - - ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error) - ReadMessageEnd() error - ReadStructBegin() (name string, err error) - ReadStructEnd() error - ReadFieldBegin() (name string, typeId TType, id int16, err error) - ReadFieldEnd() error - ReadMapBegin() (keyType TType, valueType TType, size int, err error) - ReadMapEnd() error - ReadListBegin() (elemType TType, size int, err error) - ReadListEnd() error - ReadSetBegin() (elemType TType, size int, err error) - ReadSetEnd() error - ReadBool() (value bool, err error) - ReadByte() (value int8, err error) - ReadI16() (value int16, err error) - ReadI32() (value int32, err error) - ReadI64() (value int64, err error) - ReadDouble() (value float64, err error) - ReadString() (value string, err error) - ReadBinary() (value []byte, err error) - - Skip(fieldType TType) (err error) - Flush() (err error) - - Transport() TTransport -} - -// The maximum recursive depth the skip() function will traverse -const DEFAULT_RECURSION_DEPTH = 64 - -// Skips over the next data element from the provided input TProtocol object. -func SkipDefaultDepth(prot TProtocol, typeId TType) (err error) { - return Skip(prot, typeId, DEFAULT_RECURSION_DEPTH) -} - -// Skips over the next data element from the provided input TProtocol object. -func Skip(self TProtocol, fieldType TType, maxDepth int) (err error) { - - if maxDepth <= 0 { - return NewTProtocolExceptionWithType( DEPTH_LIMIT, errors.New("Depth limit exceeded")) - } - - switch fieldType { - case STOP: - return - case BOOL: - _, err = self.ReadBool() - return - case BYTE: - _, err = self.ReadByte() - return - case I16: - _, err = self.ReadI16() - return - case I32: - _, err = self.ReadI32() - return - case I64: - _, err = self.ReadI64() - return - case DOUBLE: - _, err = self.ReadDouble() - return - case STRING: - _, err = self.ReadString() - return - case STRUCT: - if _, err = self.ReadStructBegin(); err != nil { - return err - } - for { - _, typeId, _, _ := self.ReadFieldBegin() - if typeId == STOP { - break - } - err := Skip(self, typeId, maxDepth-1) - if err != nil { - return err - } - self.ReadFieldEnd() - } - return self.ReadStructEnd() - case MAP: - keyType, valueType, size, err := self.ReadMapBegin() - if err != nil { - return err - } - for i := 0; i < size; i++ { - err := Skip(self, keyType, maxDepth-1) - if err != nil { - return err - } - self.Skip(valueType) - } - return self.ReadMapEnd() - case SET: - elemType, size, err := self.ReadSetBegin() - if err != nil { - return err - } - for i := 0; i < size; i++ { - err := Skip(self, elemType, maxDepth-1) - if err != nil { - return err - } - } - return self.ReadSetEnd() - case LIST: - elemType, size, err := self.ReadListBegin() - if err != nil { - return err - } - for i := 0; i < size; i++ { - err := Skip(self, elemType, maxDepth-1) - if err != nil { - return err - } - } - return self.ReadListEnd() - } - return nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go deleted file mode 100644 index 6e357ee890df..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "encoding/base64" -) - -// Thrift Protocol exception -type TProtocolException interface { - TException - TypeId() int -} - -const ( - UNKNOWN_PROTOCOL_EXCEPTION = 0 - INVALID_DATA = 1 - NEGATIVE_SIZE = 2 - SIZE_LIMIT = 3 - BAD_VERSION = 4 - NOT_IMPLEMENTED = 5 - DEPTH_LIMIT = 6 -) - -type tProtocolException struct { - typeId int - message string -} - -func (p *tProtocolException) TypeId() int { - return p.typeId -} - -func (p *tProtocolException) String() string { - return p.message -} - -func (p *tProtocolException) Error() string { - return p.message -} - -func NewTProtocolException(err error) TProtocolException { - if err == nil { - return nil - } - if e,ok := err.(TProtocolException); ok { - return e - } - if _, ok := err.(base64.CorruptInputError); ok { - return &tProtocolException{INVALID_DATA, err.Error()} - } - return &tProtocolException{UNKNOWN_PROTOCOL_EXCEPTION, err.Error()} -} - -func NewTProtocolExceptionWithType(errType int, err error) TProtocolException { - if err == nil { - return nil - } - return &tProtocolException{errType, err.Error()} -} - diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go b/vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go deleted file mode 100644 index c40f796d886a..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -// Factory interface for constructing protocol instances. -type TProtocolFactory interface { - GetProtocol(trans TTransport) TProtocol -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go b/vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go deleted file mode 100644 index 8e296a99b5f9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import "io" - -type RichTransport struct { - TTransport -} - -// Wraps Transport to provide TRichTransport interface -func NewTRichTransport(trans TTransport) *RichTransport { - return &RichTransport{trans} -} - -func (r *RichTransport) ReadByte() (c byte, err error) { - return readByte(r.TTransport) -} - -func (r *RichTransport) WriteByte(c byte) error { - return writeByte(r.TTransport, c) -} - -func (r *RichTransport) WriteString(s string) (n int, err error) { - return r.Write([]byte(s)) -} - -func (r *RichTransport) RemainingBytes() (num_bytes uint64) { - return r.TTransport.RemainingBytes() -} - -func readByte(r io.Reader) (c byte, err error) { - v := [1]byte{0} - n, err := r.Read(v[0:1]) - if n > 0 && (err == nil || err == io.EOF) { - return v[0], nil - } - if n > 0 && err != nil { - return v[0], err - } - if err != nil { - return 0, err - } - return v[0], nil -} - -func writeByte(w io.Writer, c byte) error { - v := [1]byte{c} - _, err := w.Write(v[0:1]) - return err -} - diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/serializer.go b/vendor/github.com/uber/jaeger-client-go/thrift/serializer.go deleted file mode 100644 index 771222999091..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/serializer.go +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -type TSerializer struct { - Transport *TMemoryBuffer - Protocol TProtocol -} - -type TStruct interface { - Write(p TProtocol) error - Read(p TProtocol) error -} - -func NewTSerializer() *TSerializer { - transport := NewTMemoryBufferLen(1024) - protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport) - - return &TSerializer{ - transport, - protocol} -} - -func (t *TSerializer) WriteString(msg TStruct) (s string, err error) { - t.Transport.Reset() - - if err = msg.Write(t.Protocol); err != nil { - return - } - - if err = t.Protocol.Flush(); err != nil { - return - } - if err = t.Transport.Flush(); err != nil { - return - } - - return t.Transport.String(), nil -} - -func (t *TSerializer) Write(msg TStruct) (b []byte, err error) { - t.Transport.Reset() - - if err = msg.Write(t.Protocol); err != nil { - return - } - - if err = t.Protocol.Flush(); err != nil { - return - } - - if err = t.Transport.Flush(); err != nil { - return - } - - b = append(b, t.Transport.Bytes()...) - return -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go deleted file mode 100644 index 412a482d055a..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go +++ /dev/null @@ -1,1337 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "bufio" - "bytes" - "encoding/base64" - "encoding/json" - "fmt" - "io" - "math" - "strconv" -) - -type _ParseContext int - -const ( - _CONTEXT_IN_TOPLEVEL _ParseContext = 1 - _CONTEXT_IN_LIST_FIRST _ParseContext = 2 - _CONTEXT_IN_LIST _ParseContext = 3 - _CONTEXT_IN_OBJECT_FIRST _ParseContext = 4 - _CONTEXT_IN_OBJECT_NEXT_KEY _ParseContext = 5 - _CONTEXT_IN_OBJECT_NEXT_VALUE _ParseContext = 6 -) - -func (p _ParseContext) String() string { - switch p { - case _CONTEXT_IN_TOPLEVEL: - return "TOPLEVEL" - case _CONTEXT_IN_LIST_FIRST: - return "LIST-FIRST" - case _CONTEXT_IN_LIST: - return "LIST" - case _CONTEXT_IN_OBJECT_FIRST: - return "OBJECT-FIRST" - case _CONTEXT_IN_OBJECT_NEXT_KEY: - return "OBJECT-NEXT-KEY" - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - return "OBJECT-NEXT-VALUE" - } - return "UNKNOWN-PARSE-CONTEXT" -} - -// JSON protocol implementation for thrift. -// -// This protocol produces/consumes a simple output format -// suitable for parsing by scripting languages. It should not be -// confused with the full-featured TJSONProtocol. -// -type TSimpleJSONProtocol struct { - trans TTransport - - parseContextStack []int - dumpContext []int - - writer *bufio.Writer - reader *bufio.Reader -} - -// Constructor -func NewTSimpleJSONProtocol(t TTransport) *TSimpleJSONProtocol { - v := &TSimpleJSONProtocol{trans: t, - writer: bufio.NewWriter(t), - reader: bufio.NewReader(t), - } - v.parseContextStack = append(v.parseContextStack, int(_CONTEXT_IN_TOPLEVEL)) - v.dumpContext = append(v.dumpContext, int(_CONTEXT_IN_TOPLEVEL)) - return v -} - -// Factory -type TSimpleJSONProtocolFactory struct{} - -func (p *TSimpleJSONProtocolFactory) GetProtocol(trans TTransport) TProtocol { - return NewTSimpleJSONProtocol(trans) -} - -func NewTSimpleJSONProtocolFactory() *TSimpleJSONProtocolFactory { - return &TSimpleJSONProtocolFactory{} -} - -var ( - JSON_COMMA []byte - JSON_COLON []byte - JSON_LBRACE []byte - JSON_RBRACE []byte - JSON_LBRACKET []byte - JSON_RBRACKET []byte - JSON_QUOTE byte - JSON_QUOTE_BYTES []byte - JSON_NULL []byte - JSON_TRUE []byte - JSON_FALSE []byte - JSON_INFINITY string - JSON_NEGATIVE_INFINITY string - JSON_NAN string - JSON_INFINITY_BYTES []byte - JSON_NEGATIVE_INFINITY_BYTES []byte - JSON_NAN_BYTES []byte - json_nonbase_map_elem_bytes []byte -) - -func init() { - JSON_COMMA = []byte{','} - JSON_COLON = []byte{':'} - JSON_LBRACE = []byte{'{'} - JSON_RBRACE = []byte{'}'} - JSON_LBRACKET = []byte{'['} - JSON_RBRACKET = []byte{']'} - JSON_QUOTE = '"' - JSON_QUOTE_BYTES = []byte{'"'} - JSON_NULL = []byte{'n', 'u', 'l', 'l'} - JSON_TRUE = []byte{'t', 'r', 'u', 'e'} - JSON_FALSE = []byte{'f', 'a', 'l', 's', 'e'} - JSON_INFINITY = "Infinity" - JSON_NEGATIVE_INFINITY = "-Infinity" - JSON_NAN = "NaN" - JSON_INFINITY_BYTES = []byte{'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} - JSON_NEGATIVE_INFINITY_BYTES = []byte{'-', 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} - JSON_NAN_BYTES = []byte{'N', 'a', 'N'} - json_nonbase_map_elem_bytes = []byte{']', ',', '['} -} - -func jsonQuote(s string) string { - b, _ := json.Marshal(s) - s1 := string(b) - return s1 -} - -func jsonUnquote(s string) (string, bool) { - s1 := new(string) - err := json.Unmarshal([]byte(s), s1) - return *s1, err == nil -} - -func mismatch(expected, actual string) error { - return fmt.Errorf("Expected '%s' but found '%s' while parsing JSON.", expected, actual) -} - -func (p *TSimpleJSONProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { - p.resetContextStack() // THRIFT-3735 - if e := p.OutputListBegin(); e != nil { - return e - } - if e := p.WriteString(name); e != nil { - return e - } - if e := p.WriteByte(int8(typeId)); e != nil { - return e - } - if e := p.WriteI32(seqId); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) WriteMessageEnd() error { - return p.OutputListEnd() -} - -func (p *TSimpleJSONProtocol) WriteStructBegin(name string) error { - if e := p.OutputObjectBegin(); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) WriteStructEnd() error { - return p.OutputObjectEnd() -} - -func (p *TSimpleJSONProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { - if e := p.WriteString(name); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) WriteFieldEnd() error { - //return p.OutputListEnd() - return nil -} - -func (p *TSimpleJSONProtocol) WriteFieldStop() error { return nil } - -func (p *TSimpleJSONProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { - if e := p.OutputListBegin(); e != nil { - return e - } - if e := p.WriteByte(int8(keyType)); e != nil { - return e - } - if e := p.WriteByte(int8(valueType)); e != nil { - return e - } - return p.WriteI32(int32(size)) -} - -func (p *TSimpleJSONProtocol) WriteMapEnd() error { - return p.OutputListEnd() -} - -func (p *TSimpleJSONProtocol) WriteListBegin(elemType TType, size int) error { - return p.OutputElemListBegin(elemType, size) -} - -func (p *TSimpleJSONProtocol) WriteListEnd() error { - return p.OutputListEnd() -} - -func (p *TSimpleJSONProtocol) WriteSetBegin(elemType TType, size int) error { - return p.OutputElemListBegin(elemType, size) -} - -func (p *TSimpleJSONProtocol) WriteSetEnd() error { - return p.OutputListEnd() -} - -func (p *TSimpleJSONProtocol) WriteBool(b bool) error { - return p.OutputBool(b) -} - -func (p *TSimpleJSONProtocol) WriteByte(b int8) error { - return p.WriteI32(int32(b)) -} - -func (p *TSimpleJSONProtocol) WriteI16(v int16) error { - return p.WriteI32(int32(v)) -} - -func (p *TSimpleJSONProtocol) WriteI32(v int32) error { - return p.OutputI64(int64(v)) -} - -func (p *TSimpleJSONProtocol) WriteI64(v int64) error { - return p.OutputI64(int64(v)) -} - -func (p *TSimpleJSONProtocol) WriteDouble(v float64) error { - return p.OutputF64(v) -} - -func (p *TSimpleJSONProtocol) WriteString(v string) error { - return p.OutputString(v) -} - -func (p *TSimpleJSONProtocol) WriteBinary(v []byte) error { - // JSON library only takes in a string, - // not an arbitrary byte array, to ensure bytes are transmitted - // efficiently we must convert this into a valid JSON string - // therefore we use base64 encoding to avoid excessive escaping/quoting - if e := p.OutputPreValue(); e != nil { - return e - } - if _, e := p.write(JSON_QUOTE_BYTES); e != nil { - return NewTProtocolException(e) - } - writer := base64.NewEncoder(base64.StdEncoding, p.writer) - if _, e := writer.Write(v); e != nil { - p.writer.Reset(p.trans) // THRIFT-3735 - return NewTProtocolException(e) - } - if e := writer.Close(); e != nil { - return NewTProtocolException(e) - } - if _, e := p.write(JSON_QUOTE_BYTES); e != nil { - return NewTProtocolException(e) - } - return p.OutputPostValue() -} - -// Reading methods. -func (p *TSimpleJSONProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { - p.resetContextStack() // THRIFT-3735 - if isNull, err := p.ParseListBegin(); isNull || err != nil { - return name, typeId, seqId, err - } - if name, err = p.ReadString(); err != nil { - return name, typeId, seqId, err - } - bTypeId, err := p.ReadByte() - typeId = TMessageType(bTypeId) - if err != nil { - return name, typeId, seqId, err - } - if seqId, err = p.ReadI32(); err != nil { - return name, typeId, seqId, err - } - return name, typeId, seqId, nil -} - -func (p *TSimpleJSONProtocol) ReadMessageEnd() error { - return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadStructBegin() (name string, err error) { - _, err = p.ParseObjectStart() - return "", err -} - -func (p *TSimpleJSONProtocol) ReadStructEnd() error { - return p.ParseObjectEnd() -} - -func (p *TSimpleJSONProtocol) ReadFieldBegin() (string, TType, int16, error) { - if err := p.ParsePreValue(); err != nil { - return "", STOP, 0, err - } - b, _ := p.reader.Peek(1) - if len(b) > 0 { - switch b[0] { - case JSON_RBRACE[0]: - return "", STOP, 0, nil - case JSON_QUOTE: - p.reader.ReadByte() - name, err := p.ParseStringBody() - // simplejson is not meant to be read back into thrift - // - see http://wiki.apache.org/thrift/ThriftUsageJava - // - use JSON instead - if err != nil { - return name, STOP, 0, err - } - return name, STOP, -1, p.ParsePostValue() - /* - if err = p.ParsePostValue(); err != nil { - return name, STOP, 0, err - } - if isNull, err := p.ParseListBegin(); isNull || err != nil { - return name, STOP, 0, err - } - bType, err := p.ReadByte() - thetype := TType(bType) - if err != nil { - return name, thetype, 0, err - } - id, err := p.ReadI16() - return name, thetype, id, err - */ - } - e := fmt.Errorf("Expected \"}\" or '\"', but found: '%s'", string(b)) - return "", STOP, 0, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return "", STOP, 0, NewTProtocolException(io.EOF) -} - -func (p *TSimpleJSONProtocol) ReadFieldEnd() error { - return nil - //return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, e error) { - if isNull, e := p.ParseListBegin(); isNull || e != nil { - return VOID, VOID, 0, e - } - - // read keyType - bKeyType, e := p.ReadByte() - keyType = TType(bKeyType) - if e != nil { - return keyType, valueType, size, e - } - - // read valueType - bValueType, e := p.ReadByte() - valueType = TType(bValueType) - if e != nil { - return keyType, valueType, size, e - } - - // read size - iSize, err := p.ReadI64() - size = int(iSize) - return keyType, valueType, size, err -} - -func (p *TSimpleJSONProtocol) ReadMapEnd() error { - return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadListBegin() (elemType TType, size int, e error) { - return p.ParseElemListBegin() -} - -func (p *TSimpleJSONProtocol) ReadListEnd() error { - return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadSetBegin() (elemType TType, size int, e error) { - return p.ParseElemListBegin() -} - -func (p *TSimpleJSONProtocol) ReadSetEnd() error { - return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadBool() (bool, error) { - var value bool - - if err := p.ParsePreValue(); err != nil { - return value, err - } - f, _ := p.reader.Peek(1) - if len(f) > 0 { - switch f[0] { - case JSON_TRUE[0]: - b := make([]byte, len(JSON_TRUE)) - _, err := p.reader.Read(b) - if err != nil { - return false, NewTProtocolException(err) - } - if string(b) == string(JSON_TRUE) { - value = true - } else { - e := fmt.Errorf("Expected \"true\" but found: %s", string(b)) - return value, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - break - case JSON_FALSE[0]: - b := make([]byte, len(JSON_FALSE)) - _, err := p.reader.Read(b) - if err != nil { - return false, NewTProtocolException(err) - } - if string(b) == string(JSON_FALSE) { - value = false - } else { - e := fmt.Errorf("Expected \"false\" but found: %s", string(b)) - return value, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - break - case JSON_NULL[0]: - b := make([]byte, len(JSON_NULL)) - _, err := p.reader.Read(b) - if err != nil { - return false, NewTProtocolException(err) - } - if string(b) == string(JSON_NULL) { - value = false - } else { - e := fmt.Errorf("Expected \"null\" but found: %s", string(b)) - return value, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - default: - e := fmt.Errorf("Expected \"true\", \"false\", or \"null\" but found: %s", string(f)) - return value, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - return value, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ReadByte() (int8, error) { - v, err := p.ReadI64() - return int8(v), err -} - -func (p *TSimpleJSONProtocol) ReadI16() (int16, error) { - v, err := p.ReadI64() - return int16(v), err -} - -func (p *TSimpleJSONProtocol) ReadI32() (int32, error) { - v, err := p.ReadI64() - return int32(v), err -} - -func (p *TSimpleJSONProtocol) ReadI64() (int64, error) { - v, _, err := p.ParseI64() - return v, err -} - -func (p *TSimpleJSONProtocol) ReadDouble() (float64, error) { - v, _, err := p.ParseF64() - return v, err -} - -func (p *TSimpleJSONProtocol) ReadString() (string, error) { - var v string - if err := p.ParsePreValue(); err != nil { - return v, err - } - f, _ := p.reader.Peek(1) - if len(f) > 0 && f[0] == JSON_QUOTE { - p.reader.ReadByte() - value, err := p.ParseStringBody() - v = value - if err != nil { - return v, err - } - } else if len(f) > 0 && f[0] == JSON_NULL[0] { - b := make([]byte, len(JSON_NULL)) - _, err := p.reader.Read(b) - if err != nil { - return v, NewTProtocolException(err) - } - if string(b) != string(JSON_NULL) { - e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) - return v, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } else { - e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) - return v, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return v, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ReadBinary() ([]byte, error) { - var v []byte - if err := p.ParsePreValue(); err != nil { - return nil, err - } - f, _ := p.reader.Peek(1) - if len(f) > 0 && f[0] == JSON_QUOTE { - p.reader.ReadByte() - value, err := p.ParseBase64EncodedBody() - v = value - if err != nil { - return v, err - } - } else if len(f) > 0 && f[0] == JSON_NULL[0] { - b := make([]byte, len(JSON_NULL)) - _, err := p.reader.Read(b) - if err != nil { - return v, NewTProtocolException(err) - } - if string(b) != string(JSON_NULL) { - e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) - return v, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } else { - e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) - return v, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - - return v, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) Flush() (err error) { - return NewTProtocolException(p.writer.Flush()) -} - -func (p *TSimpleJSONProtocol) Skip(fieldType TType) (err error) { - return SkipDefaultDepth(p, fieldType) -} - -func (p *TSimpleJSONProtocol) Transport() TTransport { - return p.trans -} - -func (p *TSimpleJSONProtocol) OutputPreValue() error { - cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) - switch cxt { - case _CONTEXT_IN_LIST, _CONTEXT_IN_OBJECT_NEXT_KEY: - if _, e := p.write(JSON_COMMA); e != nil { - return NewTProtocolException(e) - } - break - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - if _, e := p.write(JSON_COLON); e != nil { - return NewTProtocolException(e) - } - break - } - return nil -} - -func (p *TSimpleJSONProtocol) OutputPostValue() error { - cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) - switch cxt { - case _CONTEXT_IN_LIST_FIRST: - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST)) - break - case _CONTEXT_IN_OBJECT_FIRST: - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) - break - case _CONTEXT_IN_OBJECT_NEXT_KEY: - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) - break - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) - break - } - return nil -} - -func (p *TSimpleJSONProtocol) OutputBool(value bool) error { - if e := p.OutputPreValue(); e != nil { - return e - } - var v string - if value { - v = string(JSON_TRUE) - } else { - v = string(JSON_FALSE) - } - switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { - case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: - v = jsonQuote(v) - default: - } - if e := p.OutputStringData(v); e != nil { - return e - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputNull() error { - if e := p.OutputPreValue(); e != nil { - return e - } - if _, e := p.write(JSON_NULL); e != nil { - return NewTProtocolException(e) - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputF64(value float64) error { - if e := p.OutputPreValue(); e != nil { - return e - } - var v string - if math.IsNaN(value) { - v = string(JSON_QUOTE) + JSON_NAN + string(JSON_QUOTE) - } else if math.IsInf(value, 1) { - v = string(JSON_QUOTE) + JSON_INFINITY + string(JSON_QUOTE) - } else if math.IsInf(value, -1) { - v = string(JSON_QUOTE) + JSON_NEGATIVE_INFINITY + string(JSON_QUOTE) - } else { - v = strconv.FormatFloat(value, 'g', -1, 64) - switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { - case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: - v = string(JSON_QUOTE) + v + string(JSON_QUOTE) - default: - } - } - if e := p.OutputStringData(v); e != nil { - return e - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputI64(value int64) error { - if e := p.OutputPreValue(); e != nil { - return e - } - v := strconv.FormatInt(value, 10) - switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { - case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: - v = jsonQuote(v) - default: - } - if e := p.OutputStringData(v); e != nil { - return e - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputString(s string) error { - if e := p.OutputPreValue(); e != nil { - return e - } - if e := p.OutputStringData(jsonQuote(s)); e != nil { - return e - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputStringData(s string) error { - _, e := p.write([]byte(s)) - return NewTProtocolException(e) -} - -func (p *TSimpleJSONProtocol) OutputObjectBegin() error { - if e := p.OutputPreValue(); e != nil { - return e - } - if _, e := p.write(JSON_LBRACE); e != nil { - return NewTProtocolException(e) - } - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_FIRST)) - return nil -} - -func (p *TSimpleJSONProtocol) OutputObjectEnd() error { - if _, e := p.write(JSON_RBRACE); e != nil { - return NewTProtocolException(e) - } - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - if e := p.OutputPostValue(); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) OutputListBegin() error { - if e := p.OutputPreValue(); e != nil { - return e - } - if _, e := p.write(JSON_LBRACKET); e != nil { - return NewTProtocolException(e) - } - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST_FIRST)) - return nil -} - -func (p *TSimpleJSONProtocol) OutputListEnd() error { - if _, e := p.write(JSON_RBRACKET); e != nil { - return NewTProtocolException(e) - } - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - if e := p.OutputPostValue(); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) OutputElemListBegin(elemType TType, size int) error { - if e := p.OutputListBegin(); e != nil { - return e - } - if e := p.WriteByte(int8(elemType)); e != nil { - return e - } - if e := p.WriteI64(int64(size)); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) ParsePreValue() error { - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) - b, _ := p.reader.Peek(1) - switch cxt { - case _CONTEXT_IN_LIST: - if len(b) > 0 { - switch b[0] { - case JSON_RBRACKET[0]: - return nil - case JSON_COMMA[0]: - p.reader.ReadByte() - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - return nil - default: - e := fmt.Errorf("Expected \"]\" or \",\" in list context, but found \"%s\"", string(b)) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - break - case _CONTEXT_IN_OBJECT_NEXT_KEY: - if len(b) > 0 { - switch b[0] { - case JSON_RBRACE[0]: - return nil - case JSON_COMMA[0]: - p.reader.ReadByte() - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - return nil - default: - e := fmt.Errorf("Expected \"}\" or \",\" in object context, but found \"%s\"", string(b)) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - break - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - if len(b) > 0 { - switch b[0] { - case JSON_COLON[0]: - p.reader.ReadByte() - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - return nil - default: - e := fmt.Errorf("Expected \":\" in object context, but found \"%s\"", string(b)) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - break - } - return nil -} - -func (p *TSimpleJSONProtocol) ParsePostValue() error { - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) - switch cxt { - case _CONTEXT_IN_LIST_FIRST: - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST)) - break - case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) - break - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) - break - } - return nil -} - -func (p *TSimpleJSONProtocol) readNonSignificantWhitespace() error { - for { - b, _ := p.reader.Peek(1) - if len(b) < 1 { - return nil - } - switch b[0] { - case ' ', '\r', '\n', '\t': - p.reader.ReadByte() - continue - default: - break - } - break - } - return nil -} - -func (p *TSimpleJSONProtocol) ParseStringBody() (string, error) { - line, err := p.reader.ReadString(JSON_QUOTE) - if err != nil { - return "", NewTProtocolException(err) - } - l := len(line) - // count number of escapes to see if we need to keep going - i := 1 - for ; i < l; i++ { - if line[l-i-1] != '\\' { - break - } - } - if i&0x01 == 1 { - v, ok := jsonUnquote(string(JSON_QUOTE) + line) - if !ok { - return "", NewTProtocolException(err) - } - return v, nil - } - s, err := p.ParseQuotedStringBody() - if err != nil { - return "", NewTProtocolException(err) - } - str := string(JSON_QUOTE) + line + s - v, ok := jsonUnquote(str) - if !ok { - e := fmt.Errorf("Unable to parse as JSON string %s", str) - return "", NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return v, nil -} - -func (p *TSimpleJSONProtocol) ParseQuotedStringBody() (string, error) { - line, err := p.reader.ReadString(JSON_QUOTE) - if err != nil { - return "", NewTProtocolException(err) - } - l := len(line) - // count number of escapes to see if we need to keep going - i := 1 - for ; i < l; i++ { - if line[l-i-1] != '\\' { - break - } - } - if i&0x01 == 1 { - return line, nil - } - s, err := p.ParseQuotedStringBody() - if err != nil { - return "", NewTProtocolException(err) - } - v := line + s - return v, nil -} - -func (p *TSimpleJSONProtocol) ParseBase64EncodedBody() ([]byte, error) { - line, err := p.reader.ReadBytes(JSON_QUOTE) - if err != nil { - return line, NewTProtocolException(err) - } - line2 := line[0 : len(line)-1] - l := len(line2) - if (l % 4) != 0 { - pad := 4 - (l % 4) - fill := [...]byte{'=', '=', '='} - line2 = append(line2, fill[:pad]...) - l = len(line2) - } - output := make([]byte, base64.StdEncoding.DecodedLen(l)) - n, err := base64.StdEncoding.Decode(output, line2) - return output[0:n], NewTProtocolException(err) -} - -func (p *TSimpleJSONProtocol) ParseI64() (int64, bool, error) { - if err := p.ParsePreValue(); err != nil { - return 0, false, err - } - var value int64 - var isnull bool - if p.safePeekContains(JSON_NULL) { - p.reader.Read(make([]byte, len(JSON_NULL))) - isnull = true - } else { - num, err := p.readNumeric() - isnull = (num == nil) - if !isnull { - value = num.Int64() - } - if err != nil { - return value, isnull, err - } - } - return value, isnull, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ParseF64() (float64, bool, error) { - if err := p.ParsePreValue(); err != nil { - return 0, false, err - } - var value float64 - var isnull bool - if p.safePeekContains(JSON_NULL) { - p.reader.Read(make([]byte, len(JSON_NULL))) - isnull = true - } else { - num, err := p.readNumeric() - isnull = (num == nil) - if !isnull { - value = num.Float64() - } - if err != nil { - return value, isnull, err - } - } - return value, isnull, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ParseObjectStart() (bool, error) { - if err := p.ParsePreValue(); err != nil { - return false, err - } - var b []byte - b, err := p.reader.Peek(1) - if err != nil { - return false, err - } - if len(b) > 0 && b[0] == JSON_LBRACE[0] { - p.reader.ReadByte() - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_FIRST)) - return false, nil - } else if p.safePeekContains(JSON_NULL) { - return true, nil - } - e := fmt.Errorf("Expected '{' or null, but found '%s'", string(b)) - return false, NewTProtocolExceptionWithType(INVALID_DATA, e) -} - -func (p *TSimpleJSONProtocol) ParseObjectEnd() error { - if isNull, err := p.readIfNull(); isNull || err != nil { - return err - } - cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) - if (cxt != _CONTEXT_IN_OBJECT_FIRST) && (cxt != _CONTEXT_IN_OBJECT_NEXT_KEY) { - e := fmt.Errorf("Expected to be in the Object Context, but not in Object Context (%d)", cxt) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - line, err := p.reader.ReadString(JSON_RBRACE[0]) - if err != nil { - return NewTProtocolException(err) - } - for _, char := range line { - switch char { - default: - e := fmt.Errorf("Expecting end of object \"}\", but found: \"%s\"", line) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - case ' ', '\n', '\r', '\t', '}': - break - } - } - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - return p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ParseListBegin() (isNull bool, err error) { - if e := p.ParsePreValue(); e != nil { - return false, e - } - var b []byte - b, err = p.reader.Peek(1) - if err != nil { - return false, err - } - if len(b) >= 1 && b[0] == JSON_LBRACKET[0] { - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST_FIRST)) - p.reader.ReadByte() - isNull = false - } else if p.safePeekContains(JSON_NULL) { - isNull = true - } else { - err = fmt.Errorf("Expected \"null\" or \"[\", received %q", b) - } - return isNull, NewTProtocolExceptionWithType(INVALID_DATA, err) -} - -func (p *TSimpleJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error) { - if isNull, e := p.ParseListBegin(); isNull || e != nil { - return VOID, 0, e - } - bElemType, err := p.ReadByte() - elemType = TType(bElemType) - if err != nil { - return elemType, size, err - } - nSize, err2 := p.ReadI64() - size = int(nSize) - return elemType, size, err2 -} - -func (p *TSimpleJSONProtocol) ParseListEnd() error { - if isNull, err := p.readIfNull(); isNull || err != nil { - return err - } - cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) - if cxt != _CONTEXT_IN_LIST { - e := fmt.Errorf("Expected to be in the List Context, but not in List Context (%d)", cxt) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - line, err := p.reader.ReadString(JSON_RBRACKET[0]) - if err != nil { - return NewTProtocolException(err) - } - for _, char := range line { - switch char { - default: - e := fmt.Errorf("Expecting end of list \"]\", but found: \"%s\"", line) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - case ' ', '\n', '\r', '\t', rune(JSON_RBRACKET[0]): - break - } - } - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - if _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) == _CONTEXT_IN_TOPLEVEL { - return nil - } - return p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) readSingleValue() (interface{}, TType, error) { - e := p.readNonSignificantWhitespace() - if e != nil { - return nil, VOID, NewTProtocolException(e) - } - b, e := p.reader.Peek(1) - if len(b) > 0 { - c := b[0] - switch c { - case JSON_NULL[0]: - buf := make([]byte, len(JSON_NULL)) - _, e := p.reader.Read(buf) - if e != nil { - return nil, VOID, NewTProtocolException(e) - } - if string(JSON_NULL) != string(buf) { - e = mismatch(string(JSON_NULL), string(buf)) - return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return nil, VOID, nil - case JSON_QUOTE: - p.reader.ReadByte() - v, e := p.ParseStringBody() - if e != nil { - return v, UTF8, NewTProtocolException(e) - } - if v == JSON_INFINITY { - return INFINITY, DOUBLE, nil - } else if v == JSON_NEGATIVE_INFINITY { - return NEGATIVE_INFINITY, DOUBLE, nil - } else if v == JSON_NAN { - return NAN, DOUBLE, nil - } - return v, UTF8, nil - case JSON_TRUE[0]: - buf := make([]byte, len(JSON_TRUE)) - _, e := p.reader.Read(buf) - if e != nil { - return true, BOOL, NewTProtocolException(e) - } - if string(JSON_TRUE) != string(buf) { - e := mismatch(string(JSON_TRUE), string(buf)) - return true, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return true, BOOL, nil - case JSON_FALSE[0]: - buf := make([]byte, len(JSON_FALSE)) - _, e := p.reader.Read(buf) - if e != nil { - return false, BOOL, NewTProtocolException(e) - } - if string(JSON_FALSE) != string(buf) { - e := mismatch(string(JSON_FALSE), string(buf)) - return false, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return false, BOOL, nil - case JSON_LBRACKET[0]: - _, e := p.reader.ReadByte() - return make([]interface{}, 0), LIST, NewTProtocolException(e) - case JSON_LBRACE[0]: - _, e := p.reader.ReadByte() - return make(map[string]interface{}), STRUCT, NewTProtocolException(e) - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'e', 'E', '.', '+', '-', JSON_INFINITY[0], JSON_NAN[0]: - // assume numeric - v, e := p.readNumeric() - return v, DOUBLE, e - default: - e := fmt.Errorf("Expected element in list but found '%s' while parsing JSON.", string(c)) - return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - e = fmt.Errorf("Cannot read a single element while parsing JSON.") - return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) - -} - -func (p *TSimpleJSONProtocol) readIfNull() (bool, error) { - cont := true - for cont { - b, _ := p.reader.Peek(1) - if len(b) < 1 { - return false, nil - } - switch b[0] { - default: - return false, nil - case JSON_NULL[0]: - cont = false - break - case ' ', '\n', '\r', '\t': - p.reader.ReadByte() - break - } - } - if p.safePeekContains(JSON_NULL) { - p.reader.Read(make([]byte, len(JSON_NULL))) - return true, nil - } - return false, nil -} - -func (p *TSimpleJSONProtocol) readQuoteIfNext() { - b, _ := p.reader.Peek(1) - if len(b) > 0 && b[0] == JSON_QUOTE { - p.reader.ReadByte() - } -} - -func (p *TSimpleJSONProtocol) readNumeric() (Numeric, error) { - isNull, err := p.readIfNull() - if isNull || err != nil { - return NUMERIC_NULL, err - } - hasDecimalPoint := false - nextCanBeSign := true - hasE := false - MAX_LEN := 40 - buf := bytes.NewBuffer(make([]byte, 0, MAX_LEN)) - continueFor := true - inQuotes := false - for continueFor { - c, err := p.reader.ReadByte() - if err != nil { - if err == io.EOF { - break - } - return NUMERIC_NULL, NewTProtocolException(err) - } - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - buf.WriteByte(c) - nextCanBeSign = false - case '.': - if hasDecimalPoint { - e := fmt.Errorf("Unable to parse number with multiple decimal points '%s.'", buf.String()) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - if hasE { - e := fmt.Errorf("Unable to parse number with decimal points in the exponent '%s.'", buf.String()) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - buf.WriteByte(c) - hasDecimalPoint, nextCanBeSign = true, false - case 'e', 'E': - if hasE { - e := fmt.Errorf("Unable to parse number with multiple exponents '%s%c'", buf.String(), c) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - buf.WriteByte(c) - hasE, nextCanBeSign = true, true - case '-', '+': - if !nextCanBeSign { - e := fmt.Errorf("Negative sign within number") - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - buf.WriteByte(c) - nextCanBeSign = false - case ' ', 0, '\t', '\n', '\r', JSON_RBRACE[0], JSON_RBRACKET[0], JSON_COMMA[0], JSON_COLON[0]: - p.reader.UnreadByte() - continueFor = false - case JSON_NAN[0]: - if buf.Len() == 0 { - buffer := make([]byte, len(JSON_NAN)) - buffer[0] = c - _, e := p.reader.Read(buffer[1:]) - if e != nil { - return NUMERIC_NULL, NewTProtocolException(e) - } - if JSON_NAN != string(buffer) { - e := mismatch(JSON_NAN, string(buffer)) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - if inQuotes { - p.readQuoteIfNext() - } - return NAN, nil - } else { - e := fmt.Errorf("Unable to parse number starting with character '%c'", c) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - case JSON_INFINITY[0]: - if buf.Len() == 0 || (buf.Len() == 1 && buf.Bytes()[0] == '+') { - buffer := make([]byte, len(JSON_INFINITY)) - buffer[0] = c - _, e := p.reader.Read(buffer[1:]) - if e != nil { - return NUMERIC_NULL, NewTProtocolException(e) - } - if JSON_INFINITY != string(buffer) { - e := mismatch(JSON_INFINITY, string(buffer)) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - if inQuotes { - p.readQuoteIfNext() - } - return INFINITY, nil - } else if buf.Len() == 1 && buf.Bytes()[0] == JSON_NEGATIVE_INFINITY[0] { - buffer := make([]byte, len(JSON_NEGATIVE_INFINITY)) - buffer[0] = JSON_NEGATIVE_INFINITY[0] - buffer[1] = c - _, e := p.reader.Read(buffer[2:]) - if e != nil { - return NUMERIC_NULL, NewTProtocolException(e) - } - if JSON_NEGATIVE_INFINITY != string(buffer) { - e := mismatch(JSON_NEGATIVE_INFINITY, string(buffer)) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - if inQuotes { - p.readQuoteIfNext() - } - return NEGATIVE_INFINITY, nil - } else { - e := fmt.Errorf("Unable to parse number starting with character '%c' due to existing buffer %s", c, buf.String()) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - case JSON_QUOTE: - if !inQuotes { - inQuotes = true - } else { - break - } - default: - e := fmt.Errorf("Unable to parse number starting with character '%c'", c) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - if buf.Len() == 0 { - e := fmt.Errorf("Unable to parse number from empty string ''") - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return NewNumericFromJSONString(buf.String(), false), nil -} - -// Safely peeks into the buffer, reading only what is necessary -func (p *TSimpleJSONProtocol) safePeekContains(b []byte) bool { - for i := 0; i < len(b); i++ { - a, _ := p.reader.Peek(i + 1) - if len(a) == 0 || a[i] != b[i] { - return false - } - } - return true -} - -// Reset the context stack to its initial state. -func (p *TSimpleJSONProtocol) resetContextStack() { - p.parseContextStack = []int{int(_CONTEXT_IN_TOPLEVEL)} - p.dumpContext = []int{int(_CONTEXT_IN_TOPLEVEL)} -} - -func (p *TSimpleJSONProtocol) write(b []byte) (int, error) { - n, err := p.writer.Write(b) - if err != nil { - p.writer.Reset(p.trans) // THRIFT-3735 - } - return n, err -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/transport.go b/vendor/github.com/uber/jaeger-client-go/thrift/transport.go deleted file mode 100644 index 453899651fc2..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/transport.go +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "errors" - "io" -) - -var errTransportInterrupted = errors.New("Transport Interrupted") - -type Flusher interface { - Flush() (err error) -} - -type ReadSizeProvider interface { - RemainingBytes() (num_bytes uint64) -} - - -// Encapsulates the I/O layer -type TTransport interface { - io.ReadWriteCloser - Flusher - ReadSizeProvider - - // Opens the transport for communication - Open() error - - // Returns true if the transport is open - IsOpen() bool -} - -type stringWriter interface { - WriteString(s string) (n int, err error) -} - - -// This is "enchanced" transport with extra capabilities. You need to use one of these -// to construct protocol. -// Notably, TSocket does not implement this interface, and it is always a mistake to use -// TSocket directly in protocol. -type TRichTransport interface { - io.ReadWriter - io.ByteReader - io.ByteWriter - stringWriter - Flusher - ReadSizeProvider -} - diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go deleted file mode 100644 index 9505b44612d0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -import ( - "errors" - "io" -) - -type timeoutable interface { - Timeout() bool -} - -// Thrift Transport exception -type TTransportException interface { - TException - TypeId() int - Err() error -} - -const ( - UNKNOWN_TRANSPORT_EXCEPTION = 0 - NOT_OPEN = 1 - ALREADY_OPEN = 2 - TIMED_OUT = 3 - END_OF_FILE = 4 -) - -type tTransportException struct { - typeId int - err error -} - -func (p *tTransportException) TypeId() int { - return p.typeId -} - -func (p *tTransportException) Error() string { - return p.err.Error() -} - -func (p *tTransportException) Err() error { - return p.err -} - -func NewTTransportException(t int, e string) TTransportException { - return &tTransportException{typeId: t, err: errors.New(e)} -} - -func NewTTransportExceptionFromError(e error) TTransportException { - if e == nil { - return nil - } - - if t, ok := e.(TTransportException); ok { - return t - } - - switch v := e.(type) { - case TTransportException: - return v - case timeoutable: - if v.Timeout() { - return &tTransportException{typeId: TIMED_OUT, err: e} - } - } - - if e == io.EOF { - return &tTransportException{typeId: END_OF_FILE, err: e} - } - - return &tTransportException{typeId: UNKNOWN_TRANSPORT_EXCEPTION, err: e} -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go b/vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go deleted file mode 100644 index 533d1b437533..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -// Factory class used to create wrapped instance of Transports. -// This is used primarily in servers, which get Transports from -// a ServerTransport and then may want to mutate them (i.e. create -// a BufferedTransport from the underlying base transport) -type TTransportFactory interface { - GetTransport(trans TTransport) TTransport -} - -type tTransportFactory struct{} - -// Return a wrapped instance of the base Transport. -func (p *tTransportFactory) GetTransport(trans TTransport) TTransport { - return trans -} - -func NewTTransportFactory() TTransportFactory { - return &tTransportFactory{} -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/type.go b/vendor/github.com/uber/jaeger-client-go/thrift/type.go deleted file mode 100644 index 4292ffcadb13..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/type.go +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package thrift - -// Type constants in the Thrift protocol -type TType byte - -const ( - STOP = 0 - VOID = 1 - BOOL = 2 - BYTE = 3 - I08 = 3 - DOUBLE = 4 - I16 = 6 - I32 = 8 - I64 = 10 - STRING = 11 - UTF7 = 11 - STRUCT = 12 - MAP = 13 - SET = 14 - LIST = 15 - UTF8 = 16 - UTF16 = 17 - //BINARY = 18 wrong and unusued -) - -var typeNames = map[int]string{ - STOP: "STOP", - VOID: "VOID", - BOOL: "BOOL", - BYTE: "BYTE", - DOUBLE: "DOUBLE", - I16: "I16", - I32: "I32", - I64: "I64", - STRING: "STRING", - STRUCT: "STRUCT", - MAP: "MAP", - SET: "SET", - LIST: "LIST", - UTF8: "UTF8", - UTF16: "UTF16", -} - -func (p TType) String() string { - if s, ok := typeNames[int(p)]; ok { - return s - } - return "Unknown" -} diff --git a/vendor/github.com/uber/jaeger-client-go/tracer.go b/vendor/github.com/uber/jaeger-client-go/tracer.go deleted file mode 100644 index 198c32eb4fde..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/tracer.go +++ /dev/null @@ -1,431 +0,0 @@ -// Copyright (c) 2017-2018 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "fmt" - "io" - "os" - "reflect" - "strconv" - "sync" - "time" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - - "github.com/uber/jaeger-client-go/internal/baggage" - "github.com/uber/jaeger-client-go/internal/throttler" - "github.com/uber/jaeger-client-go/log" - "github.com/uber/jaeger-client-go/utils" -) - -// Tracer implements opentracing.Tracer. -type Tracer struct { - serviceName string - hostIPv4 uint32 // this is for zipkin endpoint conversion - - sampler Sampler - reporter Reporter - metrics Metrics - logger log.Logger - - timeNow func() time.Time - randomNumber func() uint64 - - options struct { - poolSpans bool - gen128Bit bool // whether to generate 128bit trace IDs - zipkinSharedRPCSpan bool - highTraceIDGenerator func() uint64 // custom high trace ID generator - maxTagValueLength int - // more options to come - } - // pool for Span objects - spanPool sync.Pool - - injectors map[interface{}]Injector - extractors map[interface{}]Extractor - - observer compositeObserver - - tags []Tag - process Process - - baggageRestrictionManager baggage.RestrictionManager - baggageSetter *baggageSetter - - debugThrottler throttler.Throttler -} - -// NewTracer creates Tracer implementation that reports tracing to Jaeger. -// The returned io.Closer can be used in shutdown hooks to ensure that the internal -// queue of the Reporter is drained and all buffered spans are submitted to collectors. -func NewTracer( - serviceName string, - sampler Sampler, - reporter Reporter, - options ...TracerOption, -) (opentracing.Tracer, io.Closer) { - t := &Tracer{ - serviceName: serviceName, - sampler: sampler, - reporter: reporter, - injectors: make(map[interface{}]Injector), - extractors: make(map[interface{}]Extractor), - metrics: *NewNullMetrics(), - spanPool: sync.Pool{New: func() interface{} { - return &Span{} - }}, - } - - for _, option := range options { - option(t) - } - - // register default injectors/extractors unless they are already provided via options - textPropagator := newTextMapPropagator(getDefaultHeadersConfig(), t.metrics) - t.addCodec(opentracing.TextMap, textPropagator, textPropagator) - - httpHeaderPropagator := newHTTPHeaderPropagator(getDefaultHeadersConfig(), t.metrics) - t.addCodec(opentracing.HTTPHeaders, httpHeaderPropagator, httpHeaderPropagator) - - binaryPropagator := newBinaryPropagator(t) - t.addCodec(opentracing.Binary, binaryPropagator, binaryPropagator) - - // TODO remove after TChannel supports OpenTracing - interopPropagator := &jaegerTraceContextPropagator{tracer: t} - t.addCodec(SpanContextFormat, interopPropagator, interopPropagator) - - zipkinPropagator := &zipkinPropagator{tracer: t} - t.addCodec(ZipkinSpanFormat, zipkinPropagator, zipkinPropagator) - - if t.baggageRestrictionManager != nil { - t.baggageSetter = newBaggageSetter(t.baggageRestrictionManager, &t.metrics) - } else { - t.baggageSetter = newBaggageSetter(baggage.NewDefaultRestrictionManager(0), &t.metrics) - } - if t.debugThrottler == nil { - t.debugThrottler = throttler.DefaultThrottler{} - } - - if t.randomNumber == nil { - rng := utils.NewRand(time.Now().UnixNano()) - t.randomNumber = func() uint64 { - return uint64(rng.Int63()) - } - } - if t.timeNow == nil { - t.timeNow = time.Now - } - if t.logger == nil { - t.logger = log.NullLogger - } - // Set tracer-level tags - t.tags = append(t.tags, Tag{key: JaegerClientVersionTagKey, value: JaegerClientVersion}) - if hostname, err := os.Hostname(); err == nil { - t.tags = append(t.tags, Tag{key: TracerHostnameTagKey, value: hostname}) - } - if ip, err := utils.HostIP(); err == nil { - t.tags = append(t.tags, Tag{key: TracerIPTagKey, value: ip.String()}) - t.hostIPv4 = utils.PackIPAsUint32(ip) - } else { - t.logger.Error("Unable to determine this host's IP address: " + err.Error()) - } - - if t.options.gen128Bit { - if t.options.highTraceIDGenerator == nil { - t.options.highTraceIDGenerator = t.randomNumber - } - } else if t.options.highTraceIDGenerator != nil { - t.logger.Error("Overriding high trace ID generator but not generating " + - "128 bit trace IDs, consider enabling the \"Gen128Bit\" option") - } - if t.options.maxTagValueLength == 0 { - t.options.maxTagValueLength = DefaultMaxTagValueLength - } - t.process = Process{ - Service: serviceName, - UUID: strconv.FormatUint(t.randomNumber(), 16), - Tags: t.tags, - } - if throttler, ok := t.debugThrottler.(ProcessSetter); ok { - throttler.SetProcess(t.process) - } - - return t, t -} - -// addCodec adds registers injector and extractor for given propagation format if not already defined. -func (t *Tracer) addCodec(format interface{}, injector Injector, extractor Extractor) { - if _, ok := t.injectors[format]; !ok { - t.injectors[format] = injector - } - if _, ok := t.extractors[format]; !ok { - t.extractors[format] = extractor - } -} - -// StartSpan implements StartSpan() method of opentracing.Tracer. -func (t *Tracer) StartSpan( - operationName string, - options ...opentracing.StartSpanOption, -) opentracing.Span { - sso := opentracing.StartSpanOptions{} - for _, o := range options { - o.Apply(&sso) - } - return t.startSpanWithOptions(operationName, sso) -} - -func (t *Tracer) startSpanWithOptions( - operationName string, - options opentracing.StartSpanOptions, -) opentracing.Span { - if options.StartTime.IsZero() { - options.StartTime = t.timeNow() - } - - // Predicate whether the given span context is a valid reference - // which may be used as parent / debug ID / baggage items source - isValidReference := func(ctx SpanContext) bool { - return ctx.IsValid() || ctx.isDebugIDContainerOnly() || len(ctx.baggage) != 0 - } - - var references []Reference - var parent SpanContext - var hasParent bool // need this because `parent` is a value, not reference - for _, ref := range options.References { - ctx, ok := ref.ReferencedContext.(SpanContext) - if !ok { - t.logger.Error(fmt.Sprintf( - "Reference contains invalid type of SpanReference: %s", - reflect.ValueOf(ref.ReferencedContext))) - continue - } - if !isValidReference(ctx) { - continue - } - references = append(references, Reference{Type: ref.Type, Context: ctx}) - if !hasParent { - parent = ctx - hasParent = ref.Type == opentracing.ChildOfRef - } - } - if !hasParent && isValidReference(parent) { - // If ChildOfRef wasn't found but a FollowFromRef exists, use the context from - // the FollowFromRef as the parent - hasParent = true - } - - rpcServer := false - if v, ok := options.Tags[ext.SpanKindRPCServer.Key]; ok { - rpcServer = (v == ext.SpanKindRPCServerEnum || v == string(ext.SpanKindRPCServerEnum)) - } - - var samplerTags []Tag - var ctx SpanContext - newTrace := false - if !hasParent || !parent.IsValid() { - newTrace = true - ctx.traceID.Low = t.randomID() - if t.options.gen128Bit { - ctx.traceID.High = t.options.highTraceIDGenerator() - } - ctx.spanID = SpanID(ctx.traceID.Low) - ctx.parentID = 0 - ctx.flags = byte(0) - if hasParent && parent.isDebugIDContainerOnly() && t.isDebugAllowed(operationName) { - ctx.flags |= (flagSampled | flagDebug) - samplerTags = []Tag{{key: JaegerDebugHeader, value: parent.debugID}} - } else if sampled, tags := t.sampler.IsSampled(ctx.traceID, operationName); sampled { - ctx.flags |= flagSampled - samplerTags = tags - } - } else { - ctx.traceID = parent.traceID - if rpcServer && t.options.zipkinSharedRPCSpan { - // Support Zipkin's one-span-per-RPC model - ctx.spanID = parent.spanID - ctx.parentID = parent.parentID - } else { - ctx.spanID = SpanID(t.randomID()) - ctx.parentID = parent.spanID - } - ctx.flags = parent.flags - } - if hasParent { - // copy baggage items - if l := len(parent.baggage); l > 0 { - ctx.baggage = make(map[string]string, len(parent.baggage)) - for k, v := range parent.baggage { - ctx.baggage[k] = v - } - } - } - - sp := t.newSpan() - sp.context = ctx - sp.observer = t.observer.OnStartSpan(sp, operationName, options) - return t.startSpanInternal( - sp, - operationName, - options.StartTime, - samplerTags, - options.Tags, - newTrace, - rpcServer, - references, - ) -} - -// Inject implements Inject() method of opentracing.Tracer -func (t *Tracer) Inject(ctx opentracing.SpanContext, format interface{}, carrier interface{}) error { - c, ok := ctx.(SpanContext) - if !ok { - return opentracing.ErrInvalidSpanContext - } - if injector, ok := t.injectors[format]; ok { - return injector.Inject(c, carrier) - } - return opentracing.ErrUnsupportedFormat -} - -// Extract implements Extract() method of opentracing.Tracer -func (t *Tracer) Extract( - format interface{}, - carrier interface{}, -) (opentracing.SpanContext, error) { - if extractor, ok := t.extractors[format]; ok { - return extractor.Extract(carrier) - } - return nil, opentracing.ErrUnsupportedFormat -} - -// Close releases all resources used by the Tracer and flushes any remaining buffered spans. -func (t *Tracer) Close() error { - t.reporter.Close() - t.sampler.Close() - if mgr, ok := t.baggageRestrictionManager.(io.Closer); ok { - mgr.Close() - } - if throttler, ok := t.debugThrottler.(io.Closer); ok { - throttler.Close() - } - return nil -} - -// Tags returns a slice of tracer-level tags. -func (t *Tracer) Tags() []opentracing.Tag { - tags := make([]opentracing.Tag, len(t.tags)) - for i, tag := range t.tags { - tags[i] = opentracing.Tag{Key: tag.key, Value: tag.value} - } - return tags -} - -// newSpan returns an instance of a clean Span object. -// If options.PoolSpans is true, the spans are retrieved from an object pool. -func (t *Tracer) newSpan() *Span { - if !t.options.poolSpans { - return &Span{} - } - sp := t.spanPool.Get().(*Span) - sp.context = emptyContext - sp.tracer = nil - sp.tags = nil - sp.logs = nil - return sp -} - -func (t *Tracer) startSpanInternal( - sp *Span, - operationName string, - startTime time.Time, - internalTags []Tag, - tags opentracing.Tags, - newTrace bool, - rpcServer bool, - references []Reference, -) *Span { - sp.tracer = t - sp.operationName = operationName - sp.startTime = startTime - sp.duration = 0 - sp.references = references - sp.firstInProcess = rpcServer || sp.context.parentID == 0 - if len(tags) > 0 || len(internalTags) > 0 { - sp.tags = make([]Tag, len(internalTags), len(tags)+len(internalTags)) - copy(sp.tags, internalTags) - for k, v := range tags { - sp.observer.OnSetTag(k, v) - if k == string(ext.SamplingPriority) && !setSamplingPriority(sp, v) { - continue - } - sp.setTagNoLocking(k, v) - } - } - // emit metrics - if sp.context.IsSampled() { - t.metrics.SpansStartedSampled.Inc(1) - if newTrace { - // We cannot simply check for parentID==0 because in Zipkin model the - // server-side RPC span has the exact same trace/span/parent IDs as the - // calling client-side span, but obviously the server side span is - // no longer a root span of the trace. - t.metrics.TracesStartedSampled.Inc(1) - } else if sp.firstInProcess { - t.metrics.TracesJoinedSampled.Inc(1) - } - } else { - t.metrics.SpansStartedNotSampled.Inc(1) - if newTrace { - t.metrics.TracesStartedNotSampled.Inc(1) - } else if sp.firstInProcess { - t.metrics.TracesJoinedNotSampled.Inc(1) - } - } - return sp -} - -func (t *Tracer) reportSpan(sp *Span) { - t.metrics.SpansFinished.Inc(1) - if sp.context.IsSampled() { - t.reporter.Report(sp) - } - if t.options.poolSpans { - t.spanPool.Put(sp) - } -} - -// randomID generates a random trace/span ID, using tracer.random() generator. -// It never returns 0. -func (t *Tracer) randomID() uint64 { - val := t.randomNumber() - for val == 0 { - val = t.randomNumber() - } - return val -} - -// (NB) span must hold the lock before making this call -func (t *Tracer) setBaggage(sp *Span, key, value string) { - t.baggageSetter.setBaggage(sp, key, value) -} - -// (NB) span must hold the lock before making this call -func (t *Tracer) isDebugAllowed(operation string) bool { - return t.debugThrottler.IsAllowed(operation) -} diff --git a/vendor/github.com/uber/jaeger-client-go/tracer_options.go b/vendor/github.com/uber/jaeger-client-go/tracer_options.go deleted file mode 100644 index a90265f031cf..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/tracer_options.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "time" - - "github.com/opentracing/opentracing-go" - - "github.com/uber/jaeger-client-go/internal/baggage" - "github.com/uber/jaeger-client-go/internal/throttler" -) - -// TracerOption is a function that sets some option on the tracer -type TracerOption func(tracer *Tracer) - -// TracerOptions is a factory for all available TracerOption's -var TracerOptions tracerOptions - -type tracerOptions struct{} - -// Metrics creates a TracerOption that initializes Metrics on the tracer, -// which is used to emit statistics. -func (tracerOptions) Metrics(m *Metrics) TracerOption { - return func(tracer *Tracer) { - tracer.metrics = *m - } -} - -// Logger creates a TracerOption that gives the tracer a Logger. -func (tracerOptions) Logger(logger Logger) TracerOption { - return func(tracer *Tracer) { - tracer.logger = logger - } -} - -func (tracerOptions) CustomHeaderKeys(headerKeys *HeadersConfig) TracerOption { - return func(tracer *Tracer) { - if headerKeys == nil { - return - } - textPropagator := newTextMapPropagator(headerKeys.applyDefaults(), tracer.metrics) - tracer.addCodec(opentracing.TextMap, textPropagator, textPropagator) - - httpHeaderPropagator := newHTTPHeaderPropagator(headerKeys.applyDefaults(), tracer.metrics) - tracer.addCodec(opentracing.HTTPHeaders, httpHeaderPropagator, httpHeaderPropagator) - } -} - -// TimeNow creates a TracerOption that gives the tracer a function -// used to generate timestamps for spans. -func (tracerOptions) TimeNow(timeNow func() time.Time) TracerOption { - return func(tracer *Tracer) { - tracer.timeNow = timeNow - } -} - -// RandomNumber creates a TracerOption that gives the tracer -// a thread-safe random number generator function for generating trace IDs. -func (tracerOptions) RandomNumber(randomNumber func() uint64) TracerOption { - return func(tracer *Tracer) { - tracer.randomNumber = randomNumber - } -} - -// PoolSpans creates a TracerOption that tells the tracer whether it should use -// an object pool to minimize span allocations. -// This should be used with care, only if the service is not running any async tasks -// that can access parent spans after those spans have been finished. -func (tracerOptions) PoolSpans(poolSpans bool) TracerOption { - return func(tracer *Tracer) { - tracer.options.poolSpans = poolSpans - } -} - -// Deprecated: HostIPv4 creates a TracerOption that identifies the current service/process. -// If not set, the factory method will obtain the current IP address. -// The TracerOption is deprecated; the tracer will attempt to automatically detect the IP. -func (tracerOptions) HostIPv4(hostIPv4 uint32) TracerOption { - return func(tracer *Tracer) { - tracer.hostIPv4 = hostIPv4 - } -} - -func (tracerOptions) Injector(format interface{}, injector Injector) TracerOption { - return func(tracer *Tracer) { - tracer.injectors[format] = injector - } -} - -func (tracerOptions) Extractor(format interface{}, extractor Extractor) TracerOption { - return func(tracer *Tracer) { - tracer.extractors[format] = extractor - } -} - -func (t tracerOptions) Observer(observer Observer) TracerOption { - return t.ContribObserver(&oldObserver{obs: observer}) -} - -func (tracerOptions) ContribObserver(observer ContribObserver) TracerOption { - return func(tracer *Tracer) { - tracer.observer.append(observer) - } -} - -func (tracerOptions) Gen128Bit(gen128Bit bool) TracerOption { - return func(tracer *Tracer) { - tracer.options.gen128Bit = gen128Bit - } -} - -func (tracerOptions) HighTraceIDGenerator(highTraceIDGenerator func() uint64) TracerOption { - return func(tracer *Tracer) { - tracer.options.highTraceIDGenerator = highTraceIDGenerator - } -} - -func (tracerOptions) MaxTagValueLength(maxTagValueLength int) TracerOption { - return func(tracer *Tracer) { - tracer.options.maxTagValueLength = maxTagValueLength - } -} - -func (tracerOptions) ZipkinSharedRPCSpan(zipkinSharedRPCSpan bool) TracerOption { - return func(tracer *Tracer) { - tracer.options.zipkinSharedRPCSpan = zipkinSharedRPCSpan - } -} - -func (tracerOptions) Tag(key string, value interface{}) TracerOption { - return func(tracer *Tracer) { - tracer.tags = append(tracer.tags, Tag{key: key, value: value}) - } -} - -func (tracerOptions) BaggageRestrictionManager(mgr baggage.RestrictionManager) TracerOption { - return func(tracer *Tracer) { - tracer.baggageRestrictionManager = mgr - } -} - -func (tracerOptions) DebugThrottler(throttler throttler.Throttler) TracerOption { - return func(tracer *Tracer) { - tracer.debugThrottler = throttler - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/transport.go b/vendor/github.com/uber/jaeger-client-go/transport.go deleted file mode 100644 index c5f5b19551fe..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/transport.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "io" -) - -// Transport abstracts the method of sending spans out of process. -// Implementations are NOT required to be thread-safe; the RemoteReporter -// is expected to only call methods on the Transport from the same go-routine. -type Transport interface { - // Append converts the span to the wire representation and adds it - // to sender's internal buffer. If the buffer exceeds its designated - // size, the transport should call Flush() and return the number of spans - // flushed, otherwise return 0. If error is returned, the returned number - // of spans is treated as failed span, and reported to metrics accordingly. - Append(span *Span) (int, error) - - // Flush submits the internal buffer to the remote server. It returns the - // number of spans flushed. If error is returned, the returned number of - // spans is treated as failed span, and reported to metrics accordingly. - Flush() (int, error) - - io.Closer -} diff --git a/vendor/github.com/uber/jaeger-client-go/transport_udp.go b/vendor/github.com/uber/jaeger-client-go/transport_udp.go deleted file mode 100644 index 7b9ccf937449..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/transport_udp.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "errors" - "fmt" - - "github.com/uber/jaeger-client-go/thrift" - - j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/utils" -) - -// Empirically obtained constant for how many bytes in the message are used for envelope. -// The total datagram size is: -// sizeof(Span) * numSpans + processByteSize + emitBatchOverhead <= maxPacketSize -// There is a unit test `TestEmitBatchOverhead` that validates this number. -// Note that due to the use of Compact Thrift protocol, overhead grows with the number of spans -// in the batch, because the length of the list is encoded as varint32, as well as SeqId. -const emitBatchOverhead = 30 - -var errSpanTooLarge = errors.New("Span is too large") - -type udpSender struct { - client *utils.AgentClientUDP - maxPacketSize int // max size of datagram in bytes - maxSpanBytes int // max number of bytes to record spans (excluding envelope) in the datagram - byteBufferSize int // current number of span bytes accumulated in the buffer - spanBuffer []*j.Span // spans buffered before a flush - thriftBuffer *thrift.TMemoryBuffer // buffer used to calculate byte size of a span - thriftProtocol thrift.TProtocol - process *j.Process - processByteSize int -} - -// NewUDPTransport creates a reporter that submits spans to jaeger-agent -func NewUDPTransport(hostPort string, maxPacketSize int) (Transport, error) { - if len(hostPort) == 0 { - hostPort = fmt.Sprintf("%s:%d", DefaultUDPSpanServerHost, DefaultUDPSpanServerPort) - } - if maxPacketSize == 0 { - maxPacketSize = utils.UDPPacketMaxLength - } - - protocolFactory := thrift.NewTCompactProtocolFactory() - - // Each span is first written to thriftBuffer to determine its size in bytes. - thriftBuffer := thrift.NewTMemoryBufferLen(maxPacketSize) - thriftProtocol := protocolFactory.GetProtocol(thriftBuffer) - - client, err := utils.NewAgentClientUDP(hostPort, maxPacketSize) - if err != nil { - return nil, err - } - - sender := &udpSender{ - client: client, - maxSpanBytes: maxPacketSize - emitBatchOverhead, - thriftBuffer: thriftBuffer, - thriftProtocol: thriftProtocol} - return sender, nil -} - -func (s *udpSender) calcSizeOfSerializedThrift(thriftStruct thrift.TStruct) int { - s.thriftBuffer.Reset() - thriftStruct.Write(s.thriftProtocol) - return s.thriftBuffer.Len() -} - -func (s *udpSender) Append(span *Span) (int, error) { - if s.process == nil { - s.process = BuildJaegerProcessThrift(span) - s.processByteSize = s.calcSizeOfSerializedThrift(s.process) - s.byteBufferSize += s.processByteSize - } - jSpan := BuildJaegerThrift(span) - spanSize := s.calcSizeOfSerializedThrift(jSpan) - if spanSize > s.maxSpanBytes { - return 1, errSpanTooLarge - } - - s.byteBufferSize += spanSize - if s.byteBufferSize <= s.maxSpanBytes { - s.spanBuffer = append(s.spanBuffer, jSpan) - if s.byteBufferSize < s.maxSpanBytes { - return 0, nil - } - return s.Flush() - } - // the latest span did not fit in the buffer - n, err := s.Flush() - s.spanBuffer = append(s.spanBuffer, jSpan) - s.byteBufferSize = spanSize + s.processByteSize - return n, err -} - -func (s *udpSender) Flush() (int, error) { - n := len(s.spanBuffer) - if n == 0 { - return 0, nil - } - err := s.client.EmitBatch(&j.Batch{Process: s.process, Spans: s.spanBuffer}) - s.resetBuffers() - - return n, err -} - -func (s *udpSender) Close() error { - return s.client.Close() -} - -func (s *udpSender) resetBuffers() { - for i := range s.spanBuffer { - s.spanBuffer[i] = nil - } - s.spanBuffer = s.spanBuffer[:0] - s.byteBufferSize = s.processByteSize -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/http_json.go b/vendor/github.com/uber/jaeger-client-go/utils/http_json.go deleted file mode 100644 index 237211f8224b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/http_json.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package utils - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" -) - -// GetJSON makes an HTTP call to the specified URL and parses the returned JSON into `out`. -func GetJSON(url string, out interface{}) error { - resp, err := http.Get(url) - if err != nil { - return err - } - return ReadJSON(resp, out) -} - -// ReadJSON reads JSON from http.Response and parses it into `out` -func ReadJSON(resp *http.Response, out interface{}) error { - defer resp.Body.Close() - - if resp.StatusCode >= 400 { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - return fmt.Errorf("StatusCode: %d, Body: %s", resp.StatusCode, body) - } - - if out == nil { - io.Copy(ioutil.Discard, resp.Body) - return nil - } - - decoder := json.NewDecoder(resp.Body) - return decoder.Decode(out) -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/localip.go b/vendor/github.com/uber/jaeger-client-go/utils/localip.go deleted file mode 100644 index b51af7713f7c..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/localip.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package utils - -import ( - "errors" - "net" -) - -// This code is borrowed from https://github.com/uber/tchannel-go/blob/dev/localip.go - -// scoreAddr scores how likely the given addr is to be a remote address and returns the -// IP to use when listening. Any address which receives a negative score should not be used. -// Scores are calculated as: -// -1 for any unknown IP addresses. -// +300 for IPv4 addresses -// +100 for non-local addresses, extra +100 for "up" interaces. -func scoreAddr(iface net.Interface, addr net.Addr) (int, net.IP) { - var ip net.IP - if netAddr, ok := addr.(*net.IPNet); ok { - ip = netAddr.IP - } else if netIP, ok := addr.(*net.IPAddr); ok { - ip = netIP.IP - } else { - return -1, nil - } - - var score int - if ip.To4() != nil { - score += 300 - } - if iface.Flags&net.FlagLoopback == 0 && !ip.IsLoopback() { - score += 100 - if iface.Flags&net.FlagUp != 0 { - score += 100 - } - } - return score, ip -} - -// HostIP tries to find an IP that can be used by other machines to reach this machine. -func HostIP() (net.IP, error) { - interfaces, err := net.Interfaces() - if err != nil { - return nil, err - } - - bestScore := -1 - var bestIP net.IP - // Select the highest scoring IP as the best IP. - for _, iface := range interfaces { - addrs, err := iface.Addrs() - if err != nil { - // Skip this interface if there is an error. - continue - } - - for _, addr := range addrs { - score, ip := scoreAddr(iface, addr) - if score > bestScore { - bestScore = score - bestIP = ip - } - } - } - - if bestScore == -1 { - return nil, errors.New("no addresses to listen on") - } - - return bestIP, nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/rand.go b/vendor/github.com/uber/jaeger-client-go/utils/rand.go deleted file mode 100644 index 9875f7f55cbd..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/rand.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package utils - -import ( - "math/rand" - "sync" -) - -// lockedSource allows a random number generator to be used by multiple goroutines concurrently. -// The code is very similar to math/rand.lockedSource, which is unfortunately not exposed. -type lockedSource struct { - mut sync.Mutex - src rand.Source -} - -// NewRand returns a rand.Rand that is threadsafe. -func NewRand(seed int64) *rand.Rand { - return rand.New(&lockedSource{src: rand.NewSource(seed)}) -} - -func (r *lockedSource) Int63() (n int64) { - r.mut.Lock() - n = r.src.Int63() - r.mut.Unlock() - return -} - -// Seed implements Seed() of Source -func (r *lockedSource) Seed(seed int64) { - r.mut.Lock() - r.src.Seed(seed) - r.mut.Unlock() -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go b/vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go deleted file mode 100644 index 1b8db9758486..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package utils - -import ( - "sync" - "time" -) - -// RateLimiter is a filter used to check if a message that is worth itemCost units is within the rate limits. -type RateLimiter interface { - CheckCredit(itemCost float64) bool -} - -type rateLimiter struct { - sync.Mutex - - creditsPerSecond float64 - balance float64 - maxBalance float64 - lastTick time.Time - - timeNow func() time.Time -} - -// NewRateLimiter creates a new rate limiter based on leaky bucket algorithm, formulated in terms of a -// credits balance that is replenished every time CheckCredit() method is called (tick) by the amount proportional -// to the time elapsed since the last tick, up to max of creditsPerSecond. A call to CheckCredit() takes a cost -// of an item we want to pay with the balance. If the balance exceeds the cost of the item, the item is "purchased" -// and the balance reduced, indicated by returned value of true. Otherwise the balance is unchanged and return false. -// -// This can be used to limit a rate of messages emitted by a service by instantiating the Rate Limiter with the -// max number of messages a service is allowed to emit per second, and calling CheckCredit(1.0) for each message -// to determine if the message is within the rate limit. -// -// It can also be used to limit the rate of traffic in bytes, by setting creditsPerSecond to desired throughput -// as bytes/second, and calling CheckCredit() with the actual message size. -func NewRateLimiter(creditsPerSecond, maxBalance float64) RateLimiter { - return &rateLimiter{ - creditsPerSecond: creditsPerSecond, - balance: maxBalance, - maxBalance: maxBalance, - lastTick: time.Now(), - timeNow: time.Now} -} - -func (b *rateLimiter) CheckCredit(itemCost float64) bool { - b.Lock() - defer b.Unlock() - // calculate how much time passed since the last tick, and update current tick - currentTime := b.timeNow() - elapsedTime := currentTime.Sub(b.lastTick) - b.lastTick = currentTime - // calculate how much credit have we accumulated since the last tick - b.balance += elapsedTime.Seconds() * b.creditsPerSecond - if b.balance > b.maxBalance { - b.balance = b.maxBalance - } - // if we have enough credits to pay for current item, then reduce balance and allow - if b.balance >= itemCost { - b.balance -= itemCost - return true - } - return false -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/udp_client.go b/vendor/github.com/uber/jaeger-client-go/utils/udp_client.go deleted file mode 100644 index 6f042073d631..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/udp_client.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package utils - -import ( - "errors" - "fmt" - "io" - "net" - - "github.com/uber/jaeger-client-go/thrift" - - "github.com/uber/jaeger-client-go/thrift-gen/agent" - "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" -) - -// UDPPacketMaxLength is the max size of UDP packet we want to send, synced with jaeger-agent -const UDPPacketMaxLength = 65000 - -// AgentClientUDP is a UDP client to Jaeger agent that implements agent.Agent interface. -type AgentClientUDP struct { - agent.Agent - io.Closer - - connUDP *net.UDPConn - client *agent.AgentClient - maxPacketSize int // max size of datagram in bytes - thriftBuffer *thrift.TMemoryBuffer // buffer used to calculate byte size of a span -} - -// NewAgentClientUDP creates a client that sends spans to Jaeger Agent over UDP. -func NewAgentClientUDP(hostPort string, maxPacketSize int) (*AgentClientUDP, error) { - if maxPacketSize == 0 { - maxPacketSize = UDPPacketMaxLength - } - - thriftBuffer := thrift.NewTMemoryBufferLen(maxPacketSize) - protocolFactory := thrift.NewTCompactProtocolFactory() - client := agent.NewAgentClientFactory(thriftBuffer, protocolFactory) - - destAddr, err := net.ResolveUDPAddr("udp", hostPort) - if err != nil { - return nil, err - } - - connUDP, err := net.DialUDP(destAddr.Network(), nil, destAddr) - if err != nil { - return nil, err - } - if err := connUDP.SetWriteBuffer(maxPacketSize); err != nil { - return nil, err - } - - clientUDP := &AgentClientUDP{ - connUDP: connUDP, - client: client, - maxPacketSize: maxPacketSize, - thriftBuffer: thriftBuffer} - return clientUDP, nil -} - -// EmitZipkinBatch implements EmitZipkinBatch() of Agent interface -func (a *AgentClientUDP) EmitZipkinBatch(spans []*zipkincore.Span) error { - return errors.New("Not implemented") -} - -// EmitBatch implements EmitBatch() of Agent interface -func (a *AgentClientUDP) EmitBatch(batch *jaeger.Batch) error { - a.thriftBuffer.Reset() - a.client.SeqId = 0 // we have no need for distinct SeqIds for our one-way UDP messages - if err := a.client.EmitBatch(batch); err != nil { - return err - } - if a.thriftBuffer.Len() > a.maxPacketSize { - return fmt.Errorf("Data does not fit within one UDP packet; size %d, max %d, spans %d", - a.thriftBuffer.Len(), a.maxPacketSize, len(batch.Spans)) - } - _, err := a.connUDP.Write(a.thriftBuffer.Bytes()) - return err -} - -// Close implements Close() of io.Closer and closes the underlying UDP connection. -func (a *AgentClientUDP) Close() error { - return a.connUDP.Close() -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/utils.go b/vendor/github.com/uber/jaeger-client-go/utils/utils.go deleted file mode 100644 index ac3c325d1ede..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/utils.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package utils - -import ( - "encoding/binary" - "errors" - "net" - "strconv" - "strings" - "time" -) - -var ( - // ErrEmptyIP an error for empty ip strings - ErrEmptyIP = errors.New("empty string given for ip") - - // ErrNotHostColonPort an error for invalid host port string - ErrNotHostColonPort = errors.New("expecting host:port") - - // ErrNotFourOctets an error for the wrong number of octets after splitting a string - ErrNotFourOctets = errors.New("Wrong number of octets") -) - -// ParseIPToUint32 converts a string ip (e.g. "x.y.z.w") to an uint32 -func ParseIPToUint32(ip string) (uint32, error) { - if ip == "" { - return 0, ErrEmptyIP - } - - if ip == "localhost" { - return 127<<24 | 1, nil - } - - octets := strings.Split(ip, ".") - if len(octets) != 4 { - return 0, ErrNotFourOctets - } - - var intIP uint32 - for i := 0; i < 4; i++ { - octet, err := strconv.Atoi(octets[i]) - if err != nil { - return 0, err - } - intIP = (intIP << 8) | uint32(octet) - } - - return intIP, nil -} - -// ParsePort converts port number from string to uin16 -func ParsePort(portString string) (uint16, error) { - port, err := strconv.ParseUint(portString, 10, 16) - return uint16(port), err -} - -// PackIPAsUint32 packs an IPv4 as uint32 -func PackIPAsUint32(ip net.IP) uint32 { - if ipv4 := ip.To4(); ipv4 != nil { - return binary.BigEndian.Uint32(ipv4) - } - return 0 -} - -// TimeToMicrosecondsSinceEpochInt64 converts Go time.Time to a long -// representing time since epoch in microseconds, which is used expected -// in the Jaeger spans encoded as Thrift. -func TimeToMicrosecondsSinceEpochInt64(t time.Time) int64 { - // ^^^ Passing time.Time by value is faster than passing a pointer! - // BenchmarkTimeByValue-8 2000000000 1.37 ns/op - // BenchmarkTimeByPtr-8 2000000000 1.98 ns/op - - return t.UnixNano() / 1000 -} diff --git a/vendor/github.com/uber/jaeger-client-go/zipkin.go b/vendor/github.com/uber/jaeger-client-go/zipkin.go deleted file mode 100644 index 636952b7f1d0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/zipkin.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "github.com/opentracing/opentracing-go" -) - -// ZipkinSpanFormat is an OpenTracing carrier format constant -const ZipkinSpanFormat = "zipkin-span-format" - -// ExtractableZipkinSpan is a type of Carrier used for integration with Zipkin-aware -// RPC frameworks (like TChannel). It does not support baggage, only trace IDs. -type ExtractableZipkinSpan interface { - TraceID() uint64 - SpanID() uint64 - ParentID() uint64 - Flags() byte -} - -// InjectableZipkinSpan is a type of Carrier used for integration with Zipkin-aware -// RPC frameworks (like TChannel). It does not support baggage, only trace IDs. -type InjectableZipkinSpan interface { - SetTraceID(traceID uint64) - SetSpanID(spanID uint64) - SetParentID(parentID uint64) - SetFlags(flags byte) -} - -type zipkinPropagator struct { - tracer *Tracer -} - -func (p *zipkinPropagator) Inject( - ctx SpanContext, - abstractCarrier interface{}, -) error { - carrier, ok := abstractCarrier.(InjectableZipkinSpan) - if !ok { - return opentracing.ErrInvalidCarrier - } - - carrier.SetTraceID(ctx.TraceID().Low) // TODO this cannot work with 128bit IDs - carrier.SetSpanID(uint64(ctx.SpanID())) - carrier.SetParentID(uint64(ctx.ParentID())) - carrier.SetFlags(ctx.flags) - return nil -} - -func (p *zipkinPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { - carrier, ok := abstractCarrier.(ExtractableZipkinSpan) - if !ok { - return emptyContext, opentracing.ErrInvalidCarrier - } - if carrier.TraceID() == 0 { - return emptyContext, opentracing.ErrSpanContextNotFound - } - var ctx SpanContext - ctx.traceID.Low = carrier.TraceID() - ctx.spanID = SpanID(carrier.SpanID()) - ctx.parentID = SpanID(carrier.ParentID()) - ctx.flags = carrier.Flags() - return ctx, nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go b/vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go deleted file mode 100644 index dce58b4331c4..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go +++ /dev/null @@ -1,322 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jaeger - -import ( - "encoding/binary" - "fmt" - "time" - - "github.com/opentracing/opentracing-go/ext" - - "github.com/uber/jaeger-client-go/internal/spanlog" - z "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" - "github.com/uber/jaeger-client-go/utils" -) - -const ( - // Zipkin UI does not work well with non-string tag values - allowPackedNumbers = false -) - -var specialTagHandlers = map[string]func(*zipkinSpan, interface{}){ - string(ext.SpanKind): setSpanKind, - string(ext.PeerHostIPv4): setPeerIPv4, - string(ext.PeerPort): setPeerPort, - string(ext.PeerService): setPeerService, - TracerIPTagKey: removeTag, -} - -// BuildZipkinThrift builds thrift span based on internal span. -func BuildZipkinThrift(s *Span) *z.Span { - span := &zipkinSpan{Span: s} - span.handleSpecialTags() - parentID := int64(span.context.parentID) - var ptrParentID *int64 - if parentID != 0 { - ptrParentID = &parentID - } - timestamp := utils.TimeToMicrosecondsSinceEpochInt64(span.startTime) - duration := span.duration.Nanoseconds() / int64(time.Microsecond) - endpoint := &z.Endpoint{ - ServiceName: span.tracer.serviceName, - Ipv4: int32(span.tracer.hostIPv4)} - thriftSpan := &z.Span{ - TraceID: int64(span.context.traceID.Low), // TODO upgrade zipkin thrift and use TraceIdHigh - ID: int64(span.context.spanID), - ParentID: ptrParentID, - Name: span.operationName, - Timestamp: ×tamp, - Duration: &duration, - Debug: span.context.IsDebug(), - Annotations: buildAnnotations(span, endpoint), - BinaryAnnotations: buildBinaryAnnotations(span, endpoint)} - return thriftSpan -} - -func buildAnnotations(span *zipkinSpan, endpoint *z.Endpoint) []*z.Annotation { - // automatically adding 2 Zipkin CoreAnnotations - annotations := make([]*z.Annotation, 0, 2+len(span.logs)) - var startLabel, endLabel string - if span.spanKind == string(ext.SpanKindRPCClientEnum) { - startLabel, endLabel = z.CLIENT_SEND, z.CLIENT_RECV - } else if span.spanKind == string(ext.SpanKindRPCServerEnum) { - startLabel, endLabel = z.SERVER_RECV, z.SERVER_SEND - } - if !span.startTime.IsZero() && startLabel != "" { - start := &z.Annotation{ - Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(span.startTime), - Value: startLabel, - Host: endpoint} - annotations = append(annotations, start) - if span.duration != 0 { - endTs := span.startTime.Add(span.duration) - end := &z.Annotation{ - Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(endTs), - Value: endLabel, - Host: endpoint} - annotations = append(annotations, end) - } - } - for _, log := range span.logs { - anno := &z.Annotation{ - Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(log.Timestamp), - Host: endpoint} - if content, err := spanlog.MaterializeWithJSON(log.Fields); err == nil { - anno.Value = truncateString(string(content), span.tracer.options.maxTagValueLength) - } else { - anno.Value = err.Error() - } - annotations = append(annotations, anno) - } - return annotations -} - -func buildBinaryAnnotations(span *zipkinSpan, endpoint *z.Endpoint) []*z.BinaryAnnotation { - // automatically adding local component or server/client address tag, and client version - annotations := make([]*z.BinaryAnnotation, 0, 2+len(span.tags)) - - if span.peerDefined() && span.isRPC() { - peer := z.Endpoint{ - Ipv4: span.peer.Ipv4, - Port: span.peer.Port, - ServiceName: span.peer.ServiceName} - label := z.CLIENT_ADDR - if span.isRPCClient() { - label = z.SERVER_ADDR - } - anno := &z.BinaryAnnotation{ - Key: label, - Value: []byte{1}, - AnnotationType: z.AnnotationType_BOOL, - Host: &peer} - annotations = append(annotations, anno) - } - if !span.isRPC() { - componentName := endpoint.ServiceName - for _, tag := range span.tags { - if tag.key == string(ext.Component) { - componentName = stringify(tag.value) - break - } - } - local := &z.BinaryAnnotation{ - Key: z.LOCAL_COMPONENT, - Value: []byte(componentName), - AnnotationType: z.AnnotationType_STRING, - Host: endpoint} - annotations = append(annotations, local) - } - for _, tag := range span.tags { - // "Special tags" are already handled by this point, we'd be double reporting the - // tags if we don't skip here - if _, ok := specialTagHandlers[tag.key]; ok { - continue - } - if anno := buildBinaryAnnotation(tag.key, tag.value, span.tracer.options.maxTagValueLength, nil); anno != nil { - annotations = append(annotations, anno) - } - } - return annotations -} - -func buildBinaryAnnotation(key string, val interface{}, maxTagValueLength int, endpoint *z.Endpoint) *z.BinaryAnnotation { - bann := &z.BinaryAnnotation{Key: key, Host: endpoint} - if value, ok := val.(string); ok { - bann.Value = []byte(truncateString(value, maxTagValueLength)) - bann.AnnotationType = z.AnnotationType_STRING - } else if value, ok := val.([]byte); ok { - if len(value) > maxTagValueLength { - value = value[:maxTagValueLength] - } - bann.Value = value - bann.AnnotationType = z.AnnotationType_BYTES - } else if value, ok := val.(int32); ok && allowPackedNumbers { - bann.Value = int32ToBytes(value) - bann.AnnotationType = z.AnnotationType_I32 - } else if value, ok := val.(int64); ok && allowPackedNumbers { - bann.Value = int64ToBytes(value) - bann.AnnotationType = z.AnnotationType_I64 - } else if value, ok := val.(int); ok && allowPackedNumbers { - bann.Value = int64ToBytes(int64(value)) - bann.AnnotationType = z.AnnotationType_I64 - } else if value, ok := val.(bool); ok { - bann.Value = []byte{boolToByte(value)} - bann.AnnotationType = z.AnnotationType_BOOL - } else { - value := stringify(val) - bann.Value = []byte(truncateString(value, maxTagValueLength)) - bann.AnnotationType = z.AnnotationType_STRING - } - return bann -} - -func stringify(value interface{}) string { - if s, ok := value.(string); ok { - return s - } - return fmt.Sprintf("%+v", value) -} - -func truncateString(value string, maxLength int) string { - // we ignore the problem of utf8 runes possibly being sliced in the middle, - // as it is rather expensive to iterate through each tag just to find rune - // boundaries. - if len(value) > maxLength { - return value[:maxLength] - } - return value -} - -func boolToByte(b bool) byte { - if b { - return 1 - } - return 0 -} - -// int32ToBytes converts int32 to bytes. -func int32ToBytes(i int32) []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint32(buf, uint32(i)) - return buf -} - -// int64ToBytes converts int64 to bytes. -func int64ToBytes(i int64) []byte { - buf := make([]byte, 8) - binary.BigEndian.PutUint64(buf, uint64(i)) - return buf -} - -type zipkinSpan struct { - *Span - - // peer points to the peer service participating in this span, - // e.g. the Client if this span is a server span, - // or Server if this span is a client span - peer struct { - Ipv4 int32 - Port int16 - ServiceName string - } - - // used to distinguish local vs. RPC Server vs. RPC Client spans - spanKind string -} - -func (s *zipkinSpan) handleSpecialTags() { - s.Lock() - defer s.Unlock() - if s.firstInProcess { - // append the process tags - s.tags = append(s.tags, s.tracer.tags...) - } - filteredTags := make([]Tag, 0, len(s.tags)) - for _, tag := range s.tags { - if handler, ok := specialTagHandlers[tag.key]; ok { - handler(s, tag.value) - } else { - filteredTags = append(filteredTags, tag) - } - } - s.tags = filteredTags -} - -func setSpanKind(s *zipkinSpan, value interface{}) { - if val, ok := value.(string); ok { - s.spanKind = val - return - } - if val, ok := value.(ext.SpanKindEnum); ok { - s.spanKind = string(val) - } -} - -func setPeerIPv4(s *zipkinSpan, value interface{}) { - if val, ok := value.(string); ok { - if ip, err := utils.ParseIPToUint32(val); err == nil { - s.peer.Ipv4 = int32(ip) - return - } - } - if val, ok := value.(uint32); ok { - s.peer.Ipv4 = int32(val) - return - } - if val, ok := value.(int32); ok { - s.peer.Ipv4 = val - } -} - -func setPeerPort(s *zipkinSpan, value interface{}) { - if val, ok := value.(string); ok { - if port, err := utils.ParsePort(val); err == nil { - s.peer.Port = int16(port) - return - } - } - if val, ok := value.(uint16); ok { - s.peer.Port = int16(val) - return - } - if val, ok := value.(int); ok { - s.peer.Port = int16(val) - } -} - -func setPeerService(s *zipkinSpan, value interface{}) { - if val, ok := value.(string); ok { - s.peer.ServiceName = val - } -} - -func removeTag(s *zipkinSpan, value interface{}) {} - -func (s *zipkinSpan) peerDefined() bool { - return s.peer.ServiceName != "" || s.peer.Ipv4 != 0 || s.peer.Port != 0 -} - -func (s *zipkinSpan) isRPC() bool { - s.RLock() - defer s.RUnlock() - return s.spanKind == string(ext.SpanKindRPCClientEnum) || s.spanKind == string(ext.SpanKindRPCServerEnum) -} - -func (s *zipkinSpan) isRPCClient() bool { - s.RLock() - defer s.RUnlock() - return s.spanKind == string(ext.SpanKindRPCClientEnum) -} diff --git a/vendor/github.com/uber/jaeger-lib/LICENSE b/vendor/github.com/uber/jaeger-lib/LICENSE deleted file mode 100644 index 261eeb9e9f8b..000000000000 --- a/vendor/github.com/uber/jaeger-lib/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/uber/jaeger-lib/metrics/counter.go b/vendor/github.com/uber/jaeger-lib/metrics/counter.go deleted file mode 100644 index 2a6a43efdb45..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/counter.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metrics - -// Counter tracks the number of times an event has occurred -type Counter interface { - // Inc adds the given value to the counter. - Inc(int64) -} - -// NullCounter counter that does nothing -var NullCounter Counter = nullCounter{} - -type nullCounter struct{} - -func (nullCounter) Inc(int64) {} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/factory.go b/vendor/github.com/uber/jaeger-lib/metrics/factory.go deleted file mode 100644 index a744a890df3d..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/factory.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metrics - -// Factory creates new metrics -type Factory interface { - Counter(name string, tags map[string]string) Counter - Timer(name string, tags map[string]string) Timer - Gauge(name string, tags map[string]string) Gauge - - // Namespace returns a nested metrics factory. - Namespace(name string, tags map[string]string) Factory -} - -// NullFactory is a metrics factory that returns NullCounter, NullTimer, and NullGauge. -var NullFactory Factory = nullFactory{} - -type nullFactory struct{} - -func (nullFactory) Counter(name string, tags map[string]string) Counter { return NullCounter } -func (nullFactory) Timer(name string, tags map[string]string) Timer { return NullTimer } -func (nullFactory) Gauge(name string, tags map[string]string) Gauge { return NullGauge } -func (nullFactory) Namespace(name string, tags map[string]string) Factory { return NullFactory } diff --git a/vendor/github.com/uber/jaeger-lib/metrics/gauge.go b/vendor/github.com/uber/jaeger-lib/metrics/gauge.go deleted file mode 100644 index 3c606391a095..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/gauge.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metrics - -// Gauge returns instantaneous measurements of something as an int64 value -type Gauge interface { - // Update the gauge to the value passed in. - Update(int64) -} - -// NullGauge gauge that does nothing -var NullGauge Gauge = nullGauge{} - -type nullGauge struct{} - -func (nullGauge) Update(int64) {} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/local.go b/vendor/github.com/uber/jaeger-lib/metrics/local.go deleted file mode 100644 index 217d30600a0b..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/local.go +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metrics - -import ( - "sort" - "sync" - "sync/atomic" - "time" - - "github.com/codahale/hdrhistogram" -) - -// This is intentionally very similar to github.com/codahale/metrics, the -// main difference being that counters/gauges are scoped to the provider -// rather than being global (to facilitate testing). - -// A LocalBackend is a metrics provider which aggregates data in-vm, and -// allows exporting snapshots to shove the data into a remote collector -type LocalBackend struct { - cm sync.Mutex - gm sync.Mutex - tm sync.Mutex - counters map[string]*int64 - gauges map[string]*int64 - timers map[string]*localBackendTimer - stop chan struct{} - wg sync.WaitGroup - TagsSep string - TagKVSep string -} - -// NewLocalBackend returns a new LocalBackend. The collectionInterval is the histogram -// time window for each timer. -func NewLocalBackend(collectionInterval time.Duration) *LocalBackend { - b := &LocalBackend{ - counters: make(map[string]*int64), - gauges: make(map[string]*int64), - timers: make(map[string]*localBackendTimer), - stop: make(chan struct{}), - TagsSep: "|", - TagKVSep: "=", - } - if collectionInterval == 0 { - // Use one histogram time window for all timers - return b - } - b.wg.Add(1) - go b.runLoop(collectionInterval) - return b -} - -// Clear discards accumulated stats -func (b *LocalBackend) Clear() { - b.cm.Lock() - defer b.cm.Unlock() - b.gm.Lock() - defer b.gm.Unlock() - b.tm.Lock() - defer b.tm.Unlock() - b.counters = make(map[string]*int64) - b.gauges = make(map[string]*int64) - b.timers = make(map[string]*localBackendTimer) -} - -func (b *LocalBackend) runLoop(collectionInterval time.Duration) { - defer b.wg.Done() - ticker := time.NewTicker(collectionInterval) - for { - select { - case <-ticker.C: - b.tm.Lock() - timers := make(map[string]*localBackendTimer, len(b.timers)) - for timerName, timer := range b.timers { - timers[timerName] = timer - } - b.tm.Unlock() - - for _, t := range timers { - t.Lock() - t.hist.Rotate() - t.Unlock() - } - case <-b.stop: - ticker.Stop() - return - } - } -} - -// IncCounter increments a counter value -func (b *LocalBackend) IncCounter(name string, tags map[string]string, delta int64) { - name = GetKey(name, tags, b.TagsSep, b.TagKVSep) - b.cm.Lock() - defer b.cm.Unlock() - counter := b.counters[name] - if counter == nil { - b.counters[name] = new(int64) - *b.counters[name] = delta - return - } - atomic.AddInt64(counter, delta) -} - -// UpdateGauge updates the value of a gauge -func (b *LocalBackend) UpdateGauge(name string, tags map[string]string, value int64) { - name = GetKey(name, tags, b.TagsSep, b.TagKVSep) - b.gm.Lock() - defer b.gm.Unlock() - gauge := b.gauges[name] - if gauge == nil { - b.gauges[name] = new(int64) - *b.gauges[name] = value - return - } - atomic.StoreInt64(gauge, value) -} - -// RecordTimer records a timing duration -func (b *LocalBackend) RecordTimer(name string, tags map[string]string, d time.Duration) { - name = GetKey(name, tags, b.TagsSep, b.TagKVSep) - timer := b.findOrCreateTimer(name) - timer.Lock() - timer.hist.Current.RecordValue(int64(d / time.Millisecond)) - timer.Unlock() -} - -func (b *LocalBackend) findOrCreateTimer(name string) *localBackendTimer { - b.tm.Lock() - defer b.tm.Unlock() - if t, ok := b.timers[name]; ok { - return t - } - - t := &localBackendTimer{ - hist: hdrhistogram.NewWindowed(5, 0, int64((5*time.Minute)/time.Millisecond), 1), - } - b.timers[name] = t - return t -} - -type localBackendTimer struct { - sync.Mutex - hist *hdrhistogram.WindowedHistogram -} - -var ( - percentiles = map[string]float64{ - "P50": 50, - "P75": 75, - "P90": 90, - "P95": 95, - "P99": 99, - "P999": 99.9, - } -) - -// Snapshot captures a snapshot of the current counter and gauge values -func (b *LocalBackend) Snapshot() (counters, gauges map[string]int64) { - b.cm.Lock() - defer b.cm.Unlock() - - counters = make(map[string]int64, len(b.counters)) - for name, value := range b.counters { - counters[name] = atomic.LoadInt64(value) - } - - b.gm.Lock() - defer b.gm.Unlock() - - gauges = make(map[string]int64, len(b.gauges)) - for name, value := range b.gauges { - gauges[name] = atomic.LoadInt64(value) - } - - b.tm.Lock() - timers := make(map[string]*localBackendTimer) - for timerName, timer := range b.timers { - timers[timerName] = timer - } - b.tm.Unlock() - - for timerName, timer := range timers { - timer.Lock() - hist := timer.hist.Merge() - timer.Unlock() - for name, q := range percentiles { - gauges[timerName+"."+name] = hist.ValueAtQuantile(q) - } - } - - return -} - -// Stop cleanly closes the background goroutine spawned by NewLocalBackend. -func (b *LocalBackend) Stop() { - close(b.stop) - b.wg.Wait() -} - -// GetKey converts name+tags into a single string of the form -// "name|tag1=value1|...|tagN=valueN", where tag names are -// sorted alphabetically. -func GetKey(name string, tags map[string]string, tagsSep string, tagKVSep string) string { - keys := make([]string, 0, len(tags)) - for k := range tags { - keys = append(keys, k) - } - sort.Strings(keys) - key := name - for _, k := range keys { - key = key + tagsSep + k + tagKVSep + tags[k] - } - return key -} - -type stats struct { - name string - tags map[string]string - localBackend *LocalBackend -} - -type localTimer struct { - stats -} - -func (l *localTimer) Record(d time.Duration) { - l.localBackend.RecordTimer(l.name, l.tags, d) -} - -type localCounter struct { - stats -} - -func (l *localCounter) Inc(delta int64) { - l.localBackend.IncCounter(l.name, l.tags, delta) -} - -type localGauge struct { - stats -} - -func (l *localGauge) Update(value int64) { - l.localBackend.UpdateGauge(l.name, l.tags, value) -} - -// LocalFactory stats factory that creates metrics that are stored locally -type LocalFactory struct { - *LocalBackend - namespace string - tags map[string]string -} - -// NewLocalFactory returns a new LocalMetricsFactory -func NewLocalFactory(collectionInterval time.Duration) *LocalFactory { - return &LocalFactory{ - LocalBackend: NewLocalBackend(collectionInterval), - } -} - -// appendTags adds the tags to the namespace tags and returns a combined map. -func (l *LocalFactory) appendTags(tags map[string]string) map[string]string { - newTags := make(map[string]string) - for k, v := range l.tags { - newTags[k] = v - } - for k, v := range tags { - newTags[k] = v - } - return newTags -} - -func (l *LocalFactory) newNamespace(name string) string { - if l.namespace == "" { - return name - } - - if name == "" { - return l.namespace - } - - return l.namespace + "." + name -} - -// Counter returns a local stats counter -func (l *LocalFactory) Counter(name string, tags map[string]string) Counter { - return &localCounter{ - stats{ - name: l.newNamespace(name), - tags: l.appendTags(tags), - localBackend: l.LocalBackend, - }, - } -} - -// Timer returns a local stats timer. -func (l *LocalFactory) Timer(name string, tags map[string]string) Timer { - return &localTimer{ - stats{ - name: l.newNamespace(name), - tags: l.appendTags(tags), - localBackend: l.LocalBackend, - }, - } -} - -// Gauge returns a local stats gauge. -func (l *LocalFactory) Gauge(name string, tags map[string]string) Gauge { - return &localGauge{ - stats{ - name: l.newNamespace(name), - tags: l.appendTags(tags), - localBackend: l.LocalBackend, - }, - } -} - -// Namespace returns a new namespace. -func (l *LocalFactory) Namespace(name string, tags map[string]string) Factory { - return &LocalFactory{ - namespace: l.newNamespace(name), - tags: l.appendTags(tags), - LocalBackend: l.LocalBackend, - } -} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/metrics.go b/vendor/github.com/uber/jaeger-lib/metrics/metrics.go deleted file mode 100644 index 0b97707b075e..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/metrics.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metrics - -import ( - "fmt" - "reflect" - "strings" -) - -// Init initializes the passed in metrics and initializes its fields using the passed in factory. -func Init(metrics interface{}, factory Factory, globalTags map[string]string) { - if err := initMetrics(metrics, factory, globalTags); err != nil { - panic(err.Error()) - } -} - -// initMetrics uses reflection to initialize a struct containing metrics fields -// by assigning new Counter/Gauge/Timer values with the metric name retrieved -// from the `metric` tag and stats tags retrieved from the `tags` tag. -// -// Note: all fields of the struct must be exported, have a `metric` tag, and be -// of type Counter or Gauge or Timer. -func initMetrics(m interface{}, factory Factory, globalTags map[string]string) error { - // Allow user to opt out of reporting metrics by passing in nil. - if factory == nil { - factory = NullFactory - } - - counterPtrType := reflect.TypeOf((*Counter)(nil)).Elem() - gaugePtrType := reflect.TypeOf((*Gauge)(nil)).Elem() - timerPtrType := reflect.TypeOf((*Timer)(nil)).Elem() - - v := reflect.ValueOf(m).Elem() - t := v.Type() - for i := 0; i < t.NumField(); i++ { - tags := make(map[string]string) - for k, v := range globalTags { - tags[k] = v - } - field := t.Field(i) - metric := field.Tag.Get("metric") - if metric == "" { - return fmt.Errorf("Field %s is missing a tag 'metric'", field.Name) - } - if tagString := field.Tag.Get("tags"); tagString != "" { - tagPairs := strings.Split(tagString, ",") - for _, tagPair := range tagPairs { - tag := strings.Split(tagPair, "=") - if len(tag) != 2 { - return fmt.Errorf( - "Field [%s]: Tag [%s] is not of the form key=value in 'tags' string [%s]", - field.Name, tagPair, tagString) - } - tags[tag[0]] = tag[1] - } - } - var obj interface{} - if field.Type.AssignableTo(counterPtrType) { - obj = factory.Counter(metric, tags) - } else if field.Type.AssignableTo(gaugePtrType) { - obj = factory.Gauge(metric, tags) - } else if field.Type.AssignableTo(timerPtrType) { - obj = factory.Timer(metric, tags) - } else { - return fmt.Errorf( - "Field %s is not a pointer to timer, gauge, or counter", - field.Name) - } - v.Field(i).Set(reflect.ValueOf(obj)) - } - return nil -} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go b/vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go deleted file mode 100644 index 4a8abdb539f9..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metrics - -import ( - "time" -) - -// StartStopwatch begins recording the executing time of an event, returning -// a Stopwatch that should be used to stop the recording the time for -// that event. Multiple events can be occurring simultaneously each -// represented by different active Stopwatches -func StartStopwatch(timer Timer) Stopwatch { - return Stopwatch{t: timer, start: time.Now()} -} - -// A Stopwatch tracks the execution time of a specific event -type Stopwatch struct { - t Timer - start time.Time -} - -// Stop stops executing of the stopwatch and records the amount of elapsed time -func (s Stopwatch) Stop() { - s.t.Record(s.ElapsedTime()) -} - -// ElapsedTime returns the amount of elapsed time (in time.Duration) -func (s Stopwatch) ElapsedTime() time.Duration { - return time.Since(s.start) -} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/timer.go b/vendor/github.com/uber/jaeger-lib/metrics/timer.go deleted file mode 100644 index e18d222abb4a..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/timer.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metrics - -import ( - "time" -) - -// Timer accumulates observations about how long some operation took, -// and also maintains a historgam of percentiles. -type Timer interface { - // Records the time passed in. - Record(time.Duration) -} - -// NullTimer timer that does nothing -var NullTimer Timer = nullTimer{} - -type nullTimer struct{} - -func (nullTimer) Record(time.Duration) {} diff --git a/vendor/github.com/wsddn/go-ecdh/LICENSE b/vendor/github.com/wsddn/go-ecdh/LICENSE new file mode 100644 index 000000000000..c16b0acf7a19 --- /dev/null +++ b/vendor/github.com/wsddn/go-ecdh/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2014, tang0th +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of tang0th nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/wsddn/go-ecdh/Readme.md b/vendor/github.com/wsddn/go-ecdh/Readme.md new file mode 100644 index 000000000000..1445f68b16a5 --- /dev/null +++ b/vendor/github.com/wsddn/go-ecdh/Readme.md @@ -0,0 +1,19 @@ +# ECDH + +[![Build Status](https://travis-ci.org/wsddn/go-ecdh.svg?branch=master)](https://travis-ci.org/wsddn/go-ecdh) + +This is a go implementation of elliptical curve diffie-hellman key exchange method. +It supports the NIST curves (and any curves using the `elliptic.Curve` go interface) +as well as djb's curve25519. + +The library handles generating of keys, generating a shared secret, and the +(un)marshalling of the elliptical curve keys into slices of bytes. + +## Warning and Disclaimer +I am not a cryptographer, this was written as part of a personal project to learn about cryptographic systems and protocols. No claims as to the security of this library are made, I would not advise using it for anything that requires any level of security. Pull requests or issues about security flaws are however still welcome. + +## Compatibility +Works with go 1.2 onwards. + +## TODO + * Improve documentation diff --git a/vendor/github.com/wsddn/go-ecdh/curve25519.go b/vendor/github.com/wsddn/go-ecdh/curve25519.go new file mode 100644 index 000000000000..6426cbf8a25e --- /dev/null +++ b/vendor/github.com/wsddn/go-ecdh/curve25519.go @@ -0,0 +1,62 @@ +package ecdh + +import ( + "crypto" + "io" + + "golang.org/x/crypto/curve25519" +) + +type curve25519ECDH struct { + ECDH +} + +// NewCurve25519ECDH creates a new ECDH instance that uses djb's curve25519 +// elliptical curve. +func NewCurve25519ECDH() ECDH { + return &curve25519ECDH{} +} + +func (e *curve25519ECDH) GenerateKey(rand io.Reader) (crypto.PrivateKey, crypto.PublicKey, error) { + var pub, priv [32]byte + var err error + + _, err = io.ReadFull(rand, priv[:]) + if err != nil { + return nil, nil, err + } + + priv[0] &= 248 + priv[31] &= 127 + priv[31] |= 64 + + curve25519.ScalarBaseMult(&pub, &priv) + + return &priv, &pub, nil +} + +func (e *curve25519ECDH) Marshal(p crypto.PublicKey) []byte { + pub := p.(*[32]byte) + return pub[:] +} + +func (e *curve25519ECDH) Unmarshal(data []byte) (crypto.PublicKey, bool) { + var pub [32]byte + if len(data) != 32 { + return nil, false + } + + copy(pub[:], data) + return &pub, true +} + +func (e *curve25519ECDH) GenerateSharedSecret(privKey crypto.PrivateKey, pubKey crypto.PublicKey) ([]byte, error) { + var priv, pub, secret *[32]byte + + priv = privKey.(*[32]byte) + pub = pubKey.(*[32]byte) + secret = new([32]byte) + + curve25519.ScalarMult(secret, priv, pub) + return secret[:], nil +} diff --git a/vendor/github.com/wsddn/go-ecdh/ecdh.go b/vendor/github.com/wsddn/go-ecdh/ecdh.go new file mode 100644 index 000000000000..921754fdcc22 --- /dev/null +++ b/vendor/github.com/wsddn/go-ecdh/ecdh.go @@ -0,0 +1,14 @@ +package ecdh + +import ( + "crypto" + "io" +) + +// The main interface for ECDH key exchange. +type ECDH interface { + GenerateKey(io.Reader) (crypto.PrivateKey, crypto.PublicKey, error) + Marshal(crypto.PublicKey) []byte + Unmarshal([]byte) (crypto.PublicKey, bool) + GenerateSharedSecret(crypto.PrivateKey, crypto.PublicKey) ([]byte, error) +} diff --git a/vendor/github.com/wsddn/go-ecdh/elliptic.go b/vendor/github.com/wsddn/go-ecdh/elliptic.go new file mode 100644 index 000000000000..502563c40966 --- /dev/null +++ b/vendor/github.com/wsddn/go-ecdh/elliptic.go @@ -0,0 +1,87 @@ +package ecdh + +import ( + "crypto" + "crypto/elliptic" + "io" + "math/big" +) + +type ellipticECDH struct { + ECDH + curve elliptic.Curve +} + +type ellipticPublicKey struct { + elliptic.Curve + X, Y *big.Int +} + +type ellipticPrivateKey struct { + D []byte +} + +// NewEllipticECDH creates a new instance of ECDH with the given elliptic.Curve curve +// to use as the elliptical curve for elliptical curve diffie-hellman. +func NewEllipticECDH(curve elliptic.Curve) ECDH { + return &ellipticECDH{ + curve: curve, + } +} + +func (e *ellipticECDH) GenerateKey(rand io.Reader) (crypto.PrivateKey, crypto.PublicKey, error) { + var d []byte + var x, y *big.Int + var priv *ellipticPrivateKey + var pub *ellipticPublicKey + var err error + + d, x, y, err = elliptic.GenerateKey(e.curve, rand) + if err != nil { + return nil, nil, err + } + + priv = &ellipticPrivateKey{ + D: d, + } + pub = &ellipticPublicKey{ + Curve: e.curve, + X: x, + Y: y, + } + + return priv, pub, nil +} + +func (e *ellipticECDH) Marshal(p crypto.PublicKey) []byte { + pub := p.(*ellipticPublicKey) + return elliptic.Marshal(e.curve, pub.X, pub.Y) +} + +func (e *ellipticECDH) Unmarshal(data []byte) (crypto.PublicKey, bool) { + var key *ellipticPublicKey + var x, y *big.Int + + x, y = elliptic.Unmarshal(e.curve, data) + if x == nil || y == nil { + return key, false + } + key = &ellipticPublicKey{ + Curve: e.curve, + X: x, + Y: y, + } + return key, true +} + +// GenerateSharedSecret takes in a public key and a private key +// and generates a shared secret. +// +// RFC5903 Section 9 states we should only return x. +func (e *ellipticECDH) GenerateSharedSecret(privKey crypto.PrivateKey, pubKey crypto.PublicKey) ([]byte, error) { + priv := privKey.(*ellipticPrivateKey) + pub := pubKey.(*ellipticPublicKey) + + x, _ := e.curve.ScalarMult(pub.X, pub.Y, priv.D) + return x.Bytes(), nil +} diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go index 4f26b49b6a87..d6f683ba3f78 100644 --- a/vendor/golang.org/x/crypto/ed25519/ed25519.go +++ b/vendor/golang.org/x/crypto/ed25519/ed25519.go @@ -6,7 +6,10 @@ // https://ed25519.cr.yp.to/. // // These functions are also compatible with the “Ed25519” function defined in -// RFC 8032. +// RFC 8032. However, unlike RFC 8032's formulation, this package's private key +// representation includes a public key suffix to make multiple signing +// operations with the same key more efficient. This package refers to the RFC +// 8032 private key as the “seed”. package ed25519 // This code is a port of the public domain, “ref10” implementation of ed25519 @@ -31,6 +34,8 @@ const ( PrivateKeySize = 64 // SignatureSize is the size, in bytes, of signatures generated and verified by this package. SignatureSize = 64 + // SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032. + SeedSize = 32 ) // PublicKey is the type of Ed25519 public keys. @@ -46,6 +51,15 @@ func (priv PrivateKey) Public() crypto.PublicKey { return PublicKey(publicKey) } +// Seed returns the private key seed corresponding to priv. It is provided for +// interoperability with RFC 8032. RFC 8032's private keys correspond to seeds +// in this package. +func (priv PrivateKey) Seed() []byte { + seed := make([]byte, SeedSize) + copy(seed, priv[:32]) + return seed +} + // Sign signs the given message with priv. // Ed25519 performs two passes over messages to be signed and therefore cannot // handle pre-hashed messages. Thus opts.HashFunc() must return zero to @@ -61,19 +75,33 @@ func (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOp // GenerateKey generates a public/private key pair using entropy from rand. // If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, err error) { +func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) { if rand == nil { rand = cryptorand.Reader } - privateKey = make([]byte, PrivateKeySize) - publicKey = make([]byte, PublicKeySize) - _, err = io.ReadFull(rand, privateKey[:32]) - if err != nil { + seed := make([]byte, SeedSize) + if _, err := io.ReadFull(rand, seed); err != nil { return nil, nil, err } - digest := sha512.Sum512(privateKey[:32]) + privateKey := NewKeyFromSeed(seed) + publicKey := make([]byte, PublicKeySize) + copy(publicKey, privateKey[32:]) + + return publicKey, privateKey, nil +} + +// NewKeyFromSeed calculates a private key from a seed. It will panic if +// len(seed) is not SeedSize. This function is provided for interoperability +// with RFC 8032. RFC 8032's private keys correspond to seeds in this +// package. +func NewKeyFromSeed(seed []byte) PrivateKey { + if l := len(seed); l != SeedSize { + panic("ed25519: bad seed length: " + strconv.Itoa(l)) + } + + digest := sha512.Sum512(seed) digest[0] &= 248 digest[31] &= 127 digest[31] |= 64 @@ -85,10 +113,11 @@ func GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, er var publicKeyBytes [32]byte A.ToBytes(&publicKeyBytes) + privateKey := make([]byte, PrivateKeySize) + copy(privateKey, seed) copy(privateKey[32:], publicKeyBytes[:]) - copy(publicKey, publicKeyBytes[:]) - return publicKey, privateKey, nil + return privateKey } // Sign signs the message with privateKey and returns a signature. It will @@ -171,9 +200,16 @@ func Verify(publicKey PublicKey, message, sig []byte) bool { edwards25519.ScReduce(&hReduced, &digest) var R edwards25519.ProjectiveGroupElement - var b [32]byte - copy(b[:], sig[32:]) - edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &b) + var s [32]byte + copy(s[:], sig[32:]) + + // https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that s be in + // the range [0, order) in order to prevent signature malleability. + if !edwards25519.ScMinimal(&s) { + return false + } + + edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &s) var checkR [32]byte R.ToBytes(&checkR) diff --git a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go index 5f8b99478727..fd03c252af42 100644 --- a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go +++ b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go @@ -4,6 +4,8 @@ package edwards25519 +import "encoding/binary" + // This code is a port of the public domain, “ref10” implementation of ed25519 // from SUPERCOP. @@ -1769,3 +1771,23 @@ func ScReduce(out *[32]byte, s *[64]byte) { out[30] = byte(s11 >> 9) out[31] = byte(s11 >> 17) } + +// order is the order of Curve25519 in little-endian form. +var order = [4]uint64{0x5812631a5cf5d3ed, 0x14def9dea2f79cd6, 0, 0x1000000000000000} + +// ScMinimal returns true if the given scalar is less than the order of the +// curve. +func ScMinimal(scalar *[32]byte) bool { + for i := 3; ; i-- { + v := binary.LittleEndian.Uint64(scalar[i*8:]) + if v > order[i] { + return false + } else if v < order[i] { + break + } else if i == 0 { + return false + } + } + + return true +} diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go new file mode 100644 index 000000000000..6570847f5e07 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go @@ -0,0 +1,264 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package ChaCha20 implements the core ChaCha20 function as specified +// in https://tools.ietf.org/html/rfc7539#section-2.3. +package chacha20 + +import ( + "crypto/cipher" + "encoding/binary" + + "golang.org/x/crypto/internal/subtle" +) + +// assert that *Cipher implements cipher.Stream +var _ cipher.Stream = (*Cipher)(nil) + +// Cipher is a stateful instance of ChaCha20 using a particular key +// and nonce. A *Cipher implements the cipher.Stream interface. +type Cipher struct { + key [8]uint32 + counter uint32 // incremented after each block + nonce [3]uint32 + buf [bufSize]byte // buffer for unused keystream bytes + len int // number of unused keystream bytes at end of buf +} + +// New creates a new ChaCha20 stream cipher with the given key and nonce. +// The initial counter value is set to 0. +func New(key [8]uint32, nonce [3]uint32) *Cipher { + return &Cipher{key: key, nonce: nonce} +} + +// ChaCha20 constants spelling "expand 32-byte k" +const ( + j0 uint32 = 0x61707865 + j1 uint32 = 0x3320646e + j2 uint32 = 0x79622d32 + j3 uint32 = 0x6b206574 +) + +func quarterRound(a, b, c, d uint32) (uint32, uint32, uint32, uint32) { + a += b + d ^= a + d = (d << 16) | (d >> 16) + c += d + b ^= c + b = (b << 12) | (b >> 20) + a += b + d ^= a + d = (d << 8) | (d >> 24) + c += d + b ^= c + b = (b << 7) | (b >> 25) + return a, b, c, d +} + +// XORKeyStream XORs each byte in the given slice with a byte from the +// cipher's key stream. Dst and src must overlap entirely or not at all. +// +// If len(dst) < len(src), XORKeyStream will panic. It is acceptable +// to pass a dst bigger than src, and in that case, XORKeyStream will +// only update dst[:len(src)] and will not touch the rest of dst. +// +// Multiple calls to XORKeyStream behave as if the concatenation of +// the src buffers was passed in a single run. That is, Cipher +// maintains state and does not reset at each XORKeyStream call. +func (s *Cipher) XORKeyStream(dst, src []byte) { + if len(dst) < len(src) { + panic("chacha20: output smaller than input") + } + if subtle.InexactOverlap(dst[:len(src)], src) { + panic("chacha20: invalid buffer overlap") + } + + // xor src with buffered keystream first + if s.len != 0 { + buf := s.buf[len(s.buf)-s.len:] + if len(src) < len(buf) { + buf = buf[:len(src)] + } + td, ts := dst[:len(buf)], src[:len(buf)] // BCE hint + for i, b := range buf { + td[i] = ts[i] ^ b + } + s.len -= len(buf) + if s.len != 0 { + return + } + s.buf = [len(s.buf)]byte{} // zero the empty buffer + src = src[len(buf):] + dst = dst[len(buf):] + } + + if len(src) == 0 { + return + } + if haveAsm { + if uint64(len(src))+uint64(s.counter)*64 > (1<<38)-64 { + panic("chacha20: counter overflow") + } + s.xorKeyStreamAsm(dst, src) + return + } + + // set up a 64-byte buffer to pad out the final block if needed + // (hoisted out of the main loop to avoid spills) + rem := len(src) % 64 // length of final block + fin := len(src) - rem // index of final block + if rem > 0 { + copy(s.buf[len(s.buf)-64:], src[fin:]) + } + + // pre-calculate most of the first round + s1, s5, s9, s13 := quarterRound(j1, s.key[1], s.key[5], s.nonce[0]) + s2, s6, s10, s14 := quarterRound(j2, s.key[2], s.key[6], s.nonce[1]) + s3, s7, s11, s15 := quarterRound(j3, s.key[3], s.key[7], s.nonce[2]) + + n := len(src) + src, dst = src[:n:n], dst[:n:n] // BCE hint + for i := 0; i < n; i += 64 { + // calculate the remainder of the first round + s0, s4, s8, s12 := quarterRound(j0, s.key[0], s.key[4], s.counter) + + // execute the second round + x0, x5, x10, x15 := quarterRound(s0, s5, s10, s15) + x1, x6, x11, x12 := quarterRound(s1, s6, s11, s12) + x2, x7, x8, x13 := quarterRound(s2, s7, s8, s13) + x3, x4, x9, x14 := quarterRound(s3, s4, s9, s14) + + // execute the remaining 18 rounds + for i := 0; i < 9; i++ { + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) + } + + x0 += j0 + x1 += j1 + x2 += j2 + x3 += j3 + + x4 += s.key[0] + x5 += s.key[1] + x6 += s.key[2] + x7 += s.key[3] + x8 += s.key[4] + x9 += s.key[5] + x10 += s.key[6] + x11 += s.key[7] + + x12 += s.counter + x13 += s.nonce[0] + x14 += s.nonce[1] + x15 += s.nonce[2] + + // increment the counter + s.counter += 1 + if s.counter == 0 { + panic("chacha20: counter overflow") + } + + // pad to 64 bytes if needed + in, out := src[i:], dst[i:] + if i == fin { + // src[fin:] has already been copied into s.buf before + // the main loop + in, out = s.buf[len(s.buf)-64:], s.buf[len(s.buf)-64:] + } + in, out = in[:64], out[:64] // BCE hint + + // XOR the key stream with the source and write out the result + xor(out[0:], in[0:], x0) + xor(out[4:], in[4:], x1) + xor(out[8:], in[8:], x2) + xor(out[12:], in[12:], x3) + xor(out[16:], in[16:], x4) + xor(out[20:], in[20:], x5) + xor(out[24:], in[24:], x6) + xor(out[28:], in[28:], x7) + xor(out[32:], in[32:], x8) + xor(out[36:], in[36:], x9) + xor(out[40:], in[40:], x10) + xor(out[44:], in[44:], x11) + xor(out[48:], in[48:], x12) + xor(out[52:], in[52:], x13) + xor(out[56:], in[56:], x14) + xor(out[60:], in[60:], x15) + } + // copy any trailing bytes out of the buffer and into dst + if rem != 0 { + s.len = 64 - rem + copy(dst[fin:], s.buf[len(s.buf)-64:]) + } +} + +// Advance discards bytes in the key stream until the next 64 byte block +// boundary is reached and updates the counter accordingly. If the key +// stream is already at a block boundary no bytes will be discarded and +// the counter will be unchanged. +func (s *Cipher) Advance() { + s.len -= s.len % 64 + if s.len == 0 { + s.buf = [len(s.buf)]byte{} + } +} + +// XORKeyStream crypts bytes from in to out using the given key and counters. +// In and out must overlap entirely or not at all. Counter contains the raw +// ChaCha20 counter bytes (i.e. block counter followed by nonce). +func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { + s := Cipher{ + key: [8]uint32{ + binary.LittleEndian.Uint32(key[0:4]), + binary.LittleEndian.Uint32(key[4:8]), + binary.LittleEndian.Uint32(key[8:12]), + binary.LittleEndian.Uint32(key[12:16]), + binary.LittleEndian.Uint32(key[16:20]), + binary.LittleEndian.Uint32(key[20:24]), + binary.LittleEndian.Uint32(key[24:28]), + binary.LittleEndian.Uint32(key[28:32]), + }, + nonce: [3]uint32{ + binary.LittleEndian.Uint32(counter[4:8]), + binary.LittleEndian.Uint32(counter[8:12]), + binary.LittleEndian.Uint32(counter[12:16]), + }, + counter: binary.LittleEndian.Uint32(counter[0:4]), + } + s.XORKeyStream(out, in) +} + +// HChaCha20 uses the ChaCha20 core to generate a derived key from a key and a +// nonce. It should only be used as part of the XChaCha20 construction. +func HChaCha20(key *[8]uint32, nonce *[4]uint32) [8]uint32 { + x0, x1, x2, x3 := j0, j1, j2, j3 + x4, x5, x6, x7 := key[0], key[1], key[2], key[3] + x8, x9, x10, x11 := key[4], key[5], key[6], key[7] + x12, x13, x14, x15 := nonce[0], nonce[1], nonce[2], nonce[3] + + for i := 0; i < 10; i++ { + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) + } + + var out [8]uint32 + out[0], out[1], out[2], out[3] = x0, x1, x2, x3 + out[4], out[5], out[6], out[7] = x12, x13, x14, x15 + return out +} diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go new file mode 100644 index 000000000000..91520d1de079 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go @@ -0,0 +1,16 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !s390x gccgo appengine + +package chacha20 + +const ( + bufSize = 64 + haveAsm = false +) + +func (*Cipher) xorKeyStreamAsm(dst, src []byte) { + panic("not implemented") +} diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go new file mode 100644 index 000000000000..0c1c671c40b7 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go @@ -0,0 +1,30 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x,!gccgo,!appengine + +package chacha20 + +var haveAsm = hasVectorFacility() + +const bufSize = 256 + +// hasVectorFacility reports whether the machine supports the vector +// facility (vx). +// Implementation in asm_s390x.s. +func hasVectorFacility() bool + +// xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only +// be called when the vector facility is available. +// Implementation in asm_s390x.s. +//go:noescape +func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int) + +func (c *Cipher) xorKeyStreamAsm(dst, src []byte) { + xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter, &c.buf, &c.len) +} + +// EXRL targets, DO NOT CALL! +func mvcSrcToBuf() +func mvcBufToDst() diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s b/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s new file mode 100644 index 000000000000..98427c5e222a --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s @@ -0,0 +1,283 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x,!gccgo,!appengine + +#include "go_asm.h" +#include "textflag.h" + +// This is an implementation of the ChaCha20 encryption algorithm as +// specified in RFC 7539. It uses vector instructions to compute +// 4 keystream blocks in parallel (256 bytes) which are then XORed +// with the bytes in the input slice. + +GLOBL ·constants<>(SB), RODATA|NOPTR, $32 +// BSWAP: swap bytes in each 4-byte element +DATA ·constants<>+0x00(SB)/4, $0x03020100 +DATA ·constants<>+0x04(SB)/4, $0x07060504 +DATA ·constants<>+0x08(SB)/4, $0x0b0a0908 +DATA ·constants<>+0x0c(SB)/4, $0x0f0e0d0c +// J0: [j0, j1, j2, j3] +DATA ·constants<>+0x10(SB)/4, $0x61707865 +DATA ·constants<>+0x14(SB)/4, $0x3320646e +DATA ·constants<>+0x18(SB)/4, $0x79622d32 +DATA ·constants<>+0x1c(SB)/4, $0x6b206574 + +// EXRL targets: +TEXT ·mvcSrcToBuf(SB), NOFRAME|NOSPLIT, $0 + MVC $1, (R1), (R8) + RET + +TEXT ·mvcBufToDst(SB), NOFRAME|NOSPLIT, $0 + MVC $1, (R8), (R9) + RET + +#define BSWAP V5 +#define J0 V6 +#define KEY0 V7 +#define KEY1 V8 +#define NONCE V9 +#define CTR V10 +#define M0 V11 +#define M1 V12 +#define M2 V13 +#define M3 V14 +#define INC V15 +#define X0 V16 +#define X1 V17 +#define X2 V18 +#define X3 V19 +#define X4 V20 +#define X5 V21 +#define X6 V22 +#define X7 V23 +#define X8 V24 +#define X9 V25 +#define X10 V26 +#define X11 V27 +#define X12 V28 +#define X13 V29 +#define X14 V30 +#define X15 V31 + +#define NUM_ROUNDS 20 + +#define ROUND4(a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3) \ + VAF a1, a0, a0 \ + VAF b1, b0, b0 \ + VAF c1, c0, c0 \ + VAF d1, d0, d0 \ + VX a0, a2, a2 \ + VX b0, b2, b2 \ + VX c0, c2, c2 \ + VX d0, d2, d2 \ + VERLLF $16, a2, a2 \ + VERLLF $16, b2, b2 \ + VERLLF $16, c2, c2 \ + VERLLF $16, d2, d2 \ + VAF a2, a3, a3 \ + VAF b2, b3, b3 \ + VAF c2, c3, c3 \ + VAF d2, d3, d3 \ + VX a3, a1, a1 \ + VX b3, b1, b1 \ + VX c3, c1, c1 \ + VX d3, d1, d1 \ + VERLLF $12, a1, a1 \ + VERLLF $12, b1, b1 \ + VERLLF $12, c1, c1 \ + VERLLF $12, d1, d1 \ + VAF a1, a0, a0 \ + VAF b1, b0, b0 \ + VAF c1, c0, c0 \ + VAF d1, d0, d0 \ + VX a0, a2, a2 \ + VX b0, b2, b2 \ + VX c0, c2, c2 \ + VX d0, d2, d2 \ + VERLLF $8, a2, a2 \ + VERLLF $8, b2, b2 \ + VERLLF $8, c2, c2 \ + VERLLF $8, d2, d2 \ + VAF a2, a3, a3 \ + VAF b2, b3, b3 \ + VAF c2, c3, c3 \ + VAF d2, d3, d3 \ + VX a3, a1, a1 \ + VX b3, b1, b1 \ + VX c3, c1, c1 \ + VX d3, d1, d1 \ + VERLLF $7, a1, a1 \ + VERLLF $7, b1, b1 \ + VERLLF $7, c1, c1 \ + VERLLF $7, d1, d1 + +#define PERMUTE(mask, v0, v1, v2, v3) \ + VPERM v0, v0, mask, v0 \ + VPERM v1, v1, mask, v1 \ + VPERM v2, v2, mask, v2 \ + VPERM v3, v3, mask, v3 + +#define ADDV(x, v0, v1, v2, v3) \ + VAF x, v0, v0 \ + VAF x, v1, v1 \ + VAF x, v2, v2 \ + VAF x, v3, v3 + +#define XORV(off, dst, src, v0, v1, v2, v3) \ + VLM off(src), M0, M3 \ + PERMUTE(BSWAP, v0, v1, v2, v3) \ + VX v0, M0, M0 \ + VX v1, M1, M1 \ + VX v2, M2, M2 \ + VX v3, M3, M3 \ + VSTM M0, M3, off(dst) + +#define SHUFFLE(a, b, c, d, t, u, v, w) \ + VMRHF a, c, t \ // t = {a[0], c[0], a[1], c[1]} + VMRHF b, d, u \ // u = {b[0], d[0], b[1], d[1]} + VMRLF a, c, v \ // v = {a[2], c[2], a[3], c[3]} + VMRLF b, d, w \ // w = {b[2], d[2], b[3], d[3]} + VMRHF t, u, a \ // a = {a[0], b[0], c[0], d[0]} + VMRLF t, u, b \ // b = {a[1], b[1], c[1], d[1]} + VMRHF v, w, c \ // c = {a[2], b[2], c[2], d[2]} + VMRLF v, w, d // d = {a[3], b[3], c[3], d[3]} + +// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int) +TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 + MOVD $·constants<>(SB), R1 + MOVD dst+0(FP), R2 // R2=&dst[0] + LMG src+24(FP), R3, R4 // R3=&src[0] R4=len(src) + MOVD key+48(FP), R5 // R5=key + MOVD nonce+56(FP), R6 // R6=nonce + MOVD counter+64(FP), R7 // R7=counter + MOVD buf+72(FP), R8 // R8=buf + MOVD len+80(FP), R9 // R9=len + + // load BSWAP and J0 + VLM (R1), BSWAP, J0 + + // set up tail buffer + ADD $-1, R4, R12 + MOVBZ R12, R12 + CMPUBEQ R12, $255, aligned + MOVD R4, R1 + AND $~255, R1 + MOVD $(R3)(R1*1), R1 + EXRL $·mvcSrcToBuf(SB), R12 + MOVD $255, R0 + SUB R12, R0 + MOVD R0, (R9) // update len + +aligned: + // setup + MOVD $95, R0 + VLM (R5), KEY0, KEY1 + VLL R0, (R6), NONCE + VZERO M0 + VLEIB $7, $32, M0 + VSRLB M0, NONCE, NONCE + + // initialize counter values + VLREPF (R7), CTR + VZERO INC + VLEIF $1, $1, INC + VLEIF $2, $2, INC + VLEIF $3, $3, INC + VAF INC, CTR, CTR + VREPIF $4, INC + +chacha: + VREPF $0, J0, X0 + VREPF $1, J0, X1 + VREPF $2, J0, X2 + VREPF $3, J0, X3 + VREPF $0, KEY0, X4 + VREPF $1, KEY0, X5 + VREPF $2, KEY0, X6 + VREPF $3, KEY0, X7 + VREPF $0, KEY1, X8 + VREPF $1, KEY1, X9 + VREPF $2, KEY1, X10 + VREPF $3, KEY1, X11 + VLR CTR, X12 + VREPF $1, NONCE, X13 + VREPF $2, NONCE, X14 + VREPF $3, NONCE, X15 + + MOVD $(NUM_ROUNDS/2), R1 + +loop: + ROUND4(X0, X4, X12, X8, X1, X5, X13, X9, X2, X6, X14, X10, X3, X7, X15, X11) + ROUND4(X0, X5, X15, X10, X1, X6, X12, X11, X2, X7, X13, X8, X3, X4, X14, X9) + + ADD $-1, R1 + BNE loop + + // decrement length + ADD $-256, R4 + BLT tail + +continue: + // rearrange vectors + SHUFFLE(X0, X1, X2, X3, M0, M1, M2, M3) + ADDV(J0, X0, X1, X2, X3) + SHUFFLE(X4, X5, X6, X7, M0, M1, M2, M3) + ADDV(KEY0, X4, X5, X6, X7) + SHUFFLE(X8, X9, X10, X11, M0, M1, M2, M3) + ADDV(KEY1, X8, X9, X10, X11) + VAF CTR, X12, X12 + SHUFFLE(X12, X13, X14, X15, M0, M1, M2, M3) + ADDV(NONCE, X12, X13, X14, X15) + + // increment counters + VAF INC, CTR, CTR + + // xor keystream with plaintext + XORV(0*64, R2, R3, X0, X4, X8, X12) + XORV(1*64, R2, R3, X1, X5, X9, X13) + XORV(2*64, R2, R3, X2, X6, X10, X14) + XORV(3*64, R2, R3, X3, X7, X11, X15) + + // increment pointers + MOVD $256(R2), R2 + MOVD $256(R3), R3 + + CMPBNE R4, $0, chacha + CMPUBEQ R12, $255, return + EXRL $·mvcBufToDst(SB), R12 // len was updated during setup + +return: + VSTEF $0, CTR, (R7) + RET + +tail: + MOVD R2, R9 + MOVD R8, R2 + MOVD R8, R3 + MOVD $0, R4 + JMP continue + +// func hasVectorFacility() bool +TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1 + MOVD $x-24(SP), R1 + XC $24, 0(R1), 0(R1) // clear the storage + MOVD $2, R0 // R0 is the number of double words stored -1 + WORD $0xB2B01000 // STFLE 0(R1) + XOR R0, R0 // reset the value of R0 + MOVBZ z-8(SP), R1 + AND $0x40, R1 + BEQ novector + +vectorinstalled: + // check if the vector instruction has been enabled + VLEIB $0, $0xF, V16 + VLGVB $0, V16, R1 + CMPBNE R1, $0xF, novector + MOVB $1, ret+0(FP) // have vx + RET + +novector: + MOVB $0, ret+0(FP) // no vx + RET diff --git a/vendor/golang.org/x/crypto/internal/chacha20/xor.go b/vendor/golang.org/x/crypto/internal/chacha20/xor.go new file mode 100644 index 000000000000..9c5ba0b33ae3 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/chacha20/xor.go @@ -0,0 +1,43 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found src the LICENSE file. + +package chacha20 + +import ( + "runtime" +) + +// Platforms that have fast unaligned 32-bit little endian accesses. +const unaligned = runtime.GOARCH == "386" || + runtime.GOARCH == "amd64" || + runtime.GOARCH == "arm64" || + runtime.GOARCH == "ppc64le" || + runtime.GOARCH == "s390x" + +// xor reads a little endian uint32 from src, XORs it with u and +// places the result in little endian byte order in dst. +func xor(dst, src []byte, u uint32) { + _, _ = src[3], dst[3] // eliminate bounds checks + if unaligned { + // The compiler should optimize this code into + // 32-bit unaligned little endian loads and stores. + // TODO: delete once the compiler does a reliably + // good job with the generic code below. + // See issue #25111 for more details. + v := uint32(src[0]) + v |= uint32(src[1]) << 8 + v |= uint32(src[2]) << 16 + v |= uint32(src[3]) << 24 + v ^= u + dst[0] = byte(v) + dst[1] = byte(v >> 8) + dst[2] = byte(v >> 16) + dst[3] = byte(v >> 24) + } else { + dst[0] = src[0] ^ byte(u) + dst[1] = src[1] ^ byte(u>>8) + dst[2] = src[2] ^ byte(u>>16) + dst[3] = src[3] ^ byte(u>>24) + } +} diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing.go b/vendor/golang.org/x/crypto/internal/subtle/aliasing.go new file mode 100644 index 000000000000..f38797bfa1bf --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/subtle/aliasing.go @@ -0,0 +1,32 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine + +// Package subtle implements functions that are often useful in cryptographic +// code but require careful thought to use correctly. +package subtle // import "golang.org/x/crypto/internal/subtle" + +import "unsafe" + +// AnyOverlap reports whether x and y share memory at any (not necessarily +// corresponding) index. The memory beyond the slice length is ignored. +func AnyOverlap(x, y []byte) bool { + return len(x) > 0 && len(y) > 0 && + uintptr(unsafe.Pointer(&x[0])) <= uintptr(unsafe.Pointer(&y[len(y)-1])) && + uintptr(unsafe.Pointer(&y[0])) <= uintptr(unsafe.Pointer(&x[len(x)-1])) +} + +// InexactOverlap reports whether x and y share memory at any non-corresponding +// index. The memory beyond the slice length is ignored. Note that x and y can +// have different lengths and still not have any inexact overlap. +// +// InexactOverlap can be used to implement the requirements of the crypto/cipher +// AEAD, Block, BlockMode and Stream interfaces. +func InexactOverlap(x, y []byte) bool { + if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { + return false + } + return AnyOverlap(x, y) +} diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go b/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go new file mode 100644 index 000000000000..0cc4a8a642c9 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go @@ -0,0 +1,35 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build appengine + +// Package subtle implements functions that are often useful in cryptographic +// code but require careful thought to use correctly. +package subtle // import "golang.org/x/crypto/internal/subtle" + +// This is the Google App Engine standard variant based on reflect +// because the unsafe package and cgo are disallowed. + +import "reflect" + +// AnyOverlap reports whether x and y share memory at any (not necessarily +// corresponding) index. The memory beyond the slice length is ignored. +func AnyOverlap(x, y []byte) bool { + return len(x) > 0 && len(y) > 0 && + reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() && + reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer() +} + +// InexactOverlap reports whether x and y share memory at any non-corresponding +// index. The memory beyond the slice length is ignored. Note that x and y can +// have different lengths and still not have any inexact overlap. +// +// InexactOverlap can be used to implement the requirements of the crypto/cipher +// AEAD, Block, BlockMode and Stream interfaces. +func InexactOverlap(x, y []byte) bool { + if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { + return false + } + return AnyOverlap(x, y) +} diff --git a/vendor/golang.org/x/crypto/openpgp/keys.go b/vendor/golang.org/x/crypto/openpgp/keys.go index 68b14c6ae642..3e2518600e29 100644 --- a/vendor/golang.org/x/crypto/openpgp/keys.go +++ b/vendor/golang.org/x/crypto/openpgp/keys.go @@ -325,16 +325,14 @@ func ReadEntity(packets *packet.Reader) (*Entity, error) { if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok { packets.Unread(p) return nil, errors.StructuralError("first packet was not a public/private key") - } else { - e.PrimaryKey = &e.PrivateKey.PublicKey } + e.PrimaryKey = &e.PrivateKey.PublicKey } if !e.PrimaryKey.PubKeyAlgo.CanSign() { return nil, errors.StructuralError("primary key cannot be used for signatures") } - var current *Identity var revocations []*packet.Signature EachPacket: for { @@ -347,32 +345,8 @@ EachPacket: switch pkt := p.(type) { case *packet.UserId: - current = new(Identity) - current.Name = pkt.Id - current.UserId = pkt - e.Identities[pkt.Id] = current - - for { - p, err = packets.Next() - if err == io.EOF { - return nil, io.ErrUnexpectedEOF - } else if err != nil { - return nil, err - } - - sig, ok := p.(*packet.Signature) - if !ok { - return nil, errors.StructuralError("user ID packet not followed by self-signature") - } - - if (sig.SigType == packet.SigTypePositiveCert || sig.SigType == packet.SigTypeGenericCert) && sig.IssuerKeyId != nil && *sig.IssuerKeyId == e.PrimaryKey.KeyId { - if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { - return nil, errors.StructuralError("user ID self-signature invalid: " + err.Error()) - } - current.SelfSignature = sig - break - } - current.Signatures = append(current.Signatures, sig) + if err := addUserID(e, packets, pkt); err != nil { + return nil, err } case *packet.Signature: if pkt.SigType == packet.SigTypeKeyRevocation { @@ -381,11 +355,9 @@ EachPacket: // TODO: RFC4880 5.2.1 permits signatures // directly on keys (eg. to bind additional // revocation keys). - } else if current == nil { - return nil, errors.StructuralError("signature packet found before user id packet") - } else { - current.Signatures = append(current.Signatures, pkt) } + // Else, ignoring the signature as it does not follow anything + // we would know to attach it to. case *packet.PrivateKey: if pkt.IsSubkey == false { packets.Unread(p) @@ -426,33 +398,105 @@ EachPacket: return e, nil } +func addUserID(e *Entity, packets *packet.Reader, pkt *packet.UserId) error { + // Make a new Identity object, that we might wind up throwing away. + // We'll only add it if we get a valid self-signature over this + // userID. + identity := new(Identity) + identity.Name = pkt.Id + identity.UserId = pkt + + for { + p, err := packets.Next() + if err == io.EOF { + break + } else if err != nil { + return err + } + + sig, ok := p.(*packet.Signature) + if !ok { + packets.Unread(p) + break + } + + if (sig.SigType == packet.SigTypePositiveCert || sig.SigType == packet.SigTypeGenericCert) && sig.IssuerKeyId != nil && *sig.IssuerKeyId == e.PrimaryKey.KeyId { + if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { + return errors.StructuralError("user ID self-signature invalid: " + err.Error()) + } + identity.SelfSignature = sig + e.Identities[pkt.Id] = identity + } else { + identity.Signatures = append(identity.Signatures, sig) + } + } + + return nil +} + func addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error { var subKey Subkey subKey.PublicKey = pub subKey.PrivateKey = priv - p, err := packets.Next() - if err == io.EOF { - return io.ErrUnexpectedEOF - } - if err != nil { - return errors.StructuralError("subkey signature invalid: " + err.Error()) + + for { + p, err := packets.Next() + if err == io.EOF { + break + } else if err != nil { + return errors.StructuralError("subkey signature invalid: " + err.Error()) + } + + sig, ok := p.(*packet.Signature) + if !ok { + packets.Unread(p) + break + } + + if sig.SigType != packet.SigTypeSubkeyBinding && sig.SigType != packet.SigTypeSubkeyRevocation { + return errors.StructuralError("subkey signature with wrong type") + } + + if err := e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, sig); err != nil { + return errors.StructuralError("subkey signature invalid: " + err.Error()) + } + + switch sig.SigType { + case packet.SigTypeSubkeyRevocation: + subKey.Sig = sig + case packet.SigTypeSubkeyBinding: + + if shouldReplaceSubkeySig(subKey.Sig, sig) { + subKey.Sig = sig + } + } } - var ok bool - subKey.Sig, ok = p.(*packet.Signature) - if !ok { + + if subKey.Sig == nil { return errors.StructuralError("subkey packet not followed by signature") } - if subKey.Sig.SigType != packet.SigTypeSubkeyBinding && subKey.Sig.SigType != packet.SigTypeSubkeyRevocation { - return errors.StructuralError("subkey signature with wrong type") - } - err = e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, subKey.Sig) - if err != nil { - return errors.StructuralError("subkey signature invalid: " + err.Error()) - } + e.Subkeys = append(e.Subkeys, subKey) + return nil } +func shouldReplaceSubkeySig(existingSig, potentialNewSig *packet.Signature) bool { + if potentialNewSig == nil { + return false + } + + if existingSig == nil { + return true + } + + if existingSig.SigType == packet.SigTypeSubkeyRevocation { + return false // never override a revocation signature + } + + return potentialNewSig.CreationTime.After(existingSig.CreationTime) +} + const defaultRSAKeyBits = 2048 // NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a @@ -487,7 +531,7 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err } isPrimaryId := true e.Identities[uid.Id] = &Identity{ - Name: uid.Name, + Name: uid.Id, UserId: uid, SelfSignature: &packet.Signature{ CreationTime: currentTime, @@ -501,6 +545,10 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err IssuerKeyId: &e.PrimaryKey.KeyId, }, } + err = e.Identities[uid.Id].SelfSignature.SignUserId(uid.Id, e.PrimaryKey, e.PrivateKey, config) + if err != nil { + return nil, err + } // If the user passes in a DefaultHash via packet.Config, // set the PreferredHash for the SelfSignature. @@ -508,6 +556,11 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err e.Identities[uid.Id].SelfSignature.PreferredHash = []uint8{hashToHashId(config.DefaultHash)} } + // Likewise for DefaultCipher. + if config != nil && config.DefaultCipher != 0 { + e.Identities[uid.Id].SelfSignature.PreferredSymmetric = []uint8{uint8(config.DefaultCipher)} + } + e.Subkeys = make([]Subkey, 1) e.Subkeys[0] = Subkey{ PublicKey: packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey), @@ -525,13 +578,16 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err } e.Subkeys[0].PublicKey.IsSubkey = true e.Subkeys[0].PrivateKey.IsSubkey = true - + err = e.Subkeys[0].Sig.SignKey(e.Subkeys[0].PublicKey, e.PrivateKey, config) + if err != nil { + return nil, err + } return e, nil } -// SerializePrivate serializes an Entity, including private key material, to -// the given Writer. For now, it must only be used on an Entity returned from -// NewEntity. +// SerializePrivate serializes an Entity, including private key material, but +// excluding signatures from other entities, to the given Writer. +// Identities and subkeys are re-signed in case they changed since NewEntry. // If config is nil, sensible defaults will be used. func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) { err = e.PrivateKey.Serialize(w) @@ -569,8 +625,8 @@ func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error return nil } -// Serialize writes the public part of the given Entity to w. (No private -// key material will be output). +// Serialize writes the public part of the given Entity to w, including +// signatures from other entities. No private key material will be output. func (e *Entity) Serialize(w io.Writer) error { err := e.PrimaryKey.Serialize(w) if err != nil { diff --git a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go b/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go index 266840d05a36..02b372cf374e 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go @@ -42,12 +42,18 @@ func (e *EncryptedKey) parse(r io.Reader) (err error) { switch e.Algo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) + if err != nil { + return + } case PubKeyAlgoElGamal: e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) if err != nil { return } e.encryptedMPI2.bytes, e.encryptedMPI2.bitLength, err = readMPI(r) + if err != nil { + return + } } _, err = consumeAll(r) return @@ -72,7 +78,8 @@ func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error { // padding oracle attacks. switch priv.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - b, err = rsa.DecryptPKCS1v15(config.Random(), priv.PrivateKey.(*rsa.PrivateKey), e.encryptedMPI1.bytes) + k := priv.PrivateKey.(*rsa.PrivateKey) + b, err = rsa.DecryptPKCS1v15(config.Random(), k, padToKeySize(&k.PublicKey, e.encryptedMPI1.bytes)) case PubKeyAlgoElGamal: c1 := new(big.Int).SetBytes(e.encryptedMPI1.bytes) c2 := new(big.Int).SetBytes(e.encryptedMPI2.bytes) diff --git a/vendor/golang.org/x/crypto/openpgp/packet/packet.go b/vendor/golang.org/x/crypto/openpgp/packet/packet.go index 3eded93f042d..5af64c5421b6 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/packet.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/packet.go @@ -11,10 +11,12 @@ import ( "crypto/aes" "crypto/cipher" "crypto/des" - "golang.org/x/crypto/cast5" - "golang.org/x/crypto/openpgp/errors" + "crypto/rsa" "io" "math/big" + + "golang.org/x/crypto/cast5" + "golang.org/x/crypto/openpgp/errors" ) // readFull is the same as io.ReadFull except that reading zero bytes returns @@ -402,14 +404,16 @@ const ( type PublicKeyAlgorithm uint8 const ( - PubKeyAlgoRSA PublicKeyAlgorithm = 1 - PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 - PubKeyAlgoRSASignOnly PublicKeyAlgorithm = 3 - PubKeyAlgoElGamal PublicKeyAlgorithm = 16 - PubKeyAlgoDSA PublicKeyAlgorithm = 17 + PubKeyAlgoRSA PublicKeyAlgorithm = 1 + PubKeyAlgoElGamal PublicKeyAlgorithm = 16 + PubKeyAlgoDSA PublicKeyAlgorithm = 17 // RFC 6637, Section 5. PubKeyAlgoECDH PublicKeyAlgorithm = 18 PubKeyAlgoECDSA PublicKeyAlgorithm = 19 + + // Deprecated in RFC 4880, Section 13.5. Use key flags instead. + PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 + PubKeyAlgoRSASignOnly PublicKeyAlgorithm = 3 ) // CanEncrypt returns true if it's possible to encrypt a message to a public @@ -500,19 +504,17 @@ func readMPI(r io.Reader) (mpi []byte, bitLength uint16, err error) { numBytes := (int(bitLength) + 7) / 8 mpi = make([]byte, numBytes) _, err = readFull(r, mpi) - return -} - -// mpiLength returns the length of the given *big.Int when serialized as an -// MPI. -func mpiLength(n *big.Int) (mpiLengthInBytes int) { - mpiLengthInBytes = 2 /* MPI length */ - mpiLengthInBytes += (n.BitLen() + 7) / 8 + // According to RFC 4880 3.2. we should check that the MPI has no leading + // zeroes (at least when not an encrypted MPI?), but this implementation + // does generate leading zeroes, so we keep accepting them. return } // writeMPI serializes a big integer to w. func writeMPI(w io.Writer, bitLength uint16, mpiBytes []byte) (err error) { + // Note that we can produce leading zeroes, in violation of RFC 4880 3.2. + // Implementations seem to be tolerant of them, and stripping them would + // make it complex to guarantee matching re-serialization. _, err = w.Write([]byte{byte(bitLength >> 8), byte(bitLength)}) if err == nil { _, err = w.Write(mpiBytes) @@ -525,6 +527,18 @@ func writeBig(w io.Writer, i *big.Int) error { return writeMPI(w, uint16(i.BitLen()), i.Bytes()) } +// padToKeySize left-pads a MPI with zeroes to match the length of the +// specified RSA public. +func padToKeySize(pub *rsa.PublicKey, b []byte) []byte { + k := (pub.N.BitLen() + 7) / 8 + if len(b) >= k { + return b + } + bb := make([]byte, k) + copy(bb[len(bb)-len(b):], b) + return bb +} + // CompressionAlgo Represents the different compression algorithms // supported by OpenPGP (except for BZIP2, which is not currently // supported). See Section 9.3 of RFC 4880. diff --git a/vendor/golang.org/x/crypto/openpgp/packet/private_key.go b/vendor/golang.org/x/crypto/openpgp/packet/private_key.go index 34734cc63d14..bd31cceac62e 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/private_key.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/private_key.go @@ -64,14 +64,19 @@ func NewECDSAPrivateKey(currentTime time.Time, priv *ecdsa.PrivateKey) *PrivateK return pk } -// NewSignerPrivateKey creates a sign-only PrivateKey from a crypto.Signer that +// NewSignerPrivateKey creates a PrivateKey from a crypto.Signer that // implements RSA or ECDSA. func NewSignerPrivateKey(currentTime time.Time, signer crypto.Signer) *PrivateKey { pk := new(PrivateKey) + // In general, the public Keys should be used as pointers. We still + // type-switch on the values, for backwards-compatibility. switch pubkey := signer.Public().(type) { + case *rsa.PublicKey: + pk.PublicKey = *NewRSAPublicKey(currentTime, pubkey) case rsa.PublicKey: pk.PublicKey = *NewRSAPublicKey(currentTime, &pubkey) - pk.PubKeyAlgo = PubKeyAlgoRSASignOnly + case *ecdsa.PublicKey: + pk.PublicKey = *NewECDSAPublicKey(currentTime, pubkey) case ecdsa.PublicKey: pk.PublicKey = *NewECDSAPublicKey(currentTime, &pubkey) default: diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key.go index ead26233dda7..fcd5f5251963 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/public_key.go @@ -244,7 +244,12 @@ func NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey } pk.ec.p.bytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y) - pk.ec.p.bitLength = uint16(8 * len(pk.ec.p.bytes)) + + // The bit length is 3 (for the 0x04 specifying an uncompressed key) + // plus two field elements (for x and y), which are rounded up to the + // nearest byte. See https://tools.ietf.org/html/rfc6637#section-6 + fieldBytes := (pub.Curve.Params().BitSize + 7) & ^7 + pk.ec.p.bitLength = uint16(3 + fieldBytes + fieldBytes) pk.setFingerPrintAndKeyId() return pk @@ -515,7 +520,7 @@ func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err erro switch pk.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: rsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey) - err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes) + err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.bytes)) if err != nil { return errors.SignatureError("RSA verification failure") } @@ -566,7 +571,7 @@ func (pk *PublicKey) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err switch pk.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: rsaPublicKey := pk.PublicKey.(*rsa.PublicKey) - if err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes); err != nil { + if err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.bytes)); err != nil { return errors.SignatureError("RSA verification failure") } return diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature.go b/vendor/golang.org/x/crypto/openpgp/packet/signature.go index 6ce0cbedbeae..b2a24a532327 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/signature.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/signature.go @@ -542,7 +542,7 @@ func (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err e r, s, err = ecdsa.Sign(config.Random(), pk, digest) } else { var b []byte - b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, nil) + b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) if err == nil { r, s, err = unwrapECDSASig(b) } diff --git a/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go b/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go index 96a2b382a1de..d19ffbc78671 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go @@ -80,7 +80,7 @@ func (uat *UserAttribute) Serialize(w io.Writer) (err error) { // ImageData returns zero or more byte slices, each containing // JPEG File Interchange Format (JFIF), for each photo in the -// the user attribute packet. +// user attribute packet. func (uat *UserAttribute) ImageData() (imageData [][]byte) { for _, sp := range uat.Contents { if sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 { diff --git a/vendor/golang.org/x/crypto/openpgp/write.go b/vendor/golang.org/x/crypto/openpgp/write.go index 65a304cc8679..4ee71784ebe0 100644 --- a/vendor/golang.org/x/crypto/openpgp/write.go +++ b/vendor/golang.org/x/crypto/openpgp/write.go @@ -164,12 +164,12 @@ func hashToHashId(h crypto.Hash) uint8 { return v } -// Encrypt encrypts a message to a number of recipients and, optionally, signs -// it. hints contains optional information, that is also encrypted, that aids -// the recipients in processing the message. The resulting WriteCloser must -// be closed after the contents of the file have been written. -// If config is nil, sensible defaults will be used. -func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { +// writeAndSign writes the data as a payload package and, optionally, signs +// it. hints contains optional information, that is also encrypted, +// that aids the recipients in processing the message. The resulting +// WriteCloser must be closed after the contents of the file have been +// written. If config is nil, sensible defaults will be used. +func writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { var signer *packet.PrivateKey if signed != nil { signKey, ok := signed.signingKey(config.Now()) @@ -185,6 +185,83 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint } } + var hash crypto.Hash + for _, hashId := range candidateHashes { + if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { + hash = h + break + } + } + + // If the hash specified by config is a candidate, we'll use that. + if configuredHash := config.Hash(); configuredHash.Available() { + for _, hashId := range candidateHashes { + if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { + hash = h + break + } + } + } + + if hash == 0 { + hashId := candidateHashes[0] + name, ok := s2k.HashIdToString(hashId) + if !ok { + name = "#" + strconv.Itoa(int(hashId)) + } + return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") + } + + if signer != nil { + ops := &packet.OnePassSignature{ + SigType: packet.SigTypeBinary, + Hash: hash, + PubKeyAlgo: signer.PubKeyAlgo, + KeyId: signer.KeyId, + IsLast: true, + } + if err := ops.Serialize(payload); err != nil { + return nil, err + } + } + + if hints == nil { + hints = &FileHints{} + } + + w := payload + if signer != nil { + // If we need to write a signature packet after the literal + // data then we need to stop literalData from closing + // encryptedData. + w = noOpCloser{w} + + } + var epochSeconds uint32 + if !hints.ModTime.IsZero() { + epochSeconds = uint32(hints.ModTime.Unix()) + } + literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) + if err != nil { + return nil, err + } + + if signer != nil { + return signatureWriter{payload, literalData, hash, hash.New(), signer, config}, nil + } + return literalData, nil +} + +// Encrypt encrypts a message to a number of recipients and, optionally, signs +// it. hints contains optional information, that is also encrypted, that aids +// the recipients in processing the message. The resulting WriteCloser must +// be closed after the contents of the file have been written. +// If config is nil, sensible defaults will be used. +func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { + if len(to) == 0 { + return nil, errors.InvalidArgumentError("no encryption recipient provided") + } + // These are the possible ciphers that we'll use for the message. candidateCiphers := []uint8{ uint8(packet.CipherAES128), @@ -194,6 +271,7 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint // These are the possible hash functions that we'll use for the signature. candidateHashes := []uint8{ hashToHashId(crypto.SHA256), + hashToHashId(crypto.SHA384), hashToHashId(crypto.SHA512), hashToHashId(crypto.SHA1), hashToHashId(crypto.RIPEMD160), @@ -241,33 +319,6 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint } } - var hash crypto.Hash - for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { - hash = h - break - } - } - - // If the hash specified by config is a candidate, we'll use that. - if configuredHash := config.Hash(); configuredHash.Available() { - for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { - hash = h - break - } - } - } - - if hash == 0 { - hashId := candidateHashes[0] - name, ok := s2k.HashIdToString(hashId) - if !ok { - name = "#" + strconv.Itoa(int(hashId)) - } - return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") - } - symKey := make([]byte, cipher.KeySize()) if _, err := io.ReadFull(config.Random(), symKey); err != nil { return nil, err @@ -279,49 +330,38 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint } } - encryptedData, err := packet.SerializeSymmetricallyEncrypted(ciphertext, cipher, symKey, config) + payload, err := packet.SerializeSymmetricallyEncrypted(ciphertext, cipher, symKey, config) if err != nil { return } - if signer != nil { - ops := &packet.OnePassSignature{ - SigType: packet.SigTypeBinary, - Hash: hash, - PubKeyAlgo: signer.PubKeyAlgo, - KeyId: signer.KeyId, - IsLast: true, - } - if err := ops.Serialize(encryptedData); err != nil { - return nil, err - } - } + return writeAndSign(payload, candidateHashes, signed, hints, config) +} - if hints == nil { - hints = &FileHints{} +// Sign signs a message. The resulting WriteCloser must be closed after the +// contents of the file have been written. hints contains optional information +// that aids the recipients in processing the message. +// If config is nil, sensible defaults will be used. +func Sign(output io.Writer, signed *Entity, hints *FileHints, config *packet.Config) (input io.WriteCloser, err error) { + if signed == nil { + return nil, errors.InvalidArgumentError("no signer provided") } - w := encryptedData - if signer != nil { - // If we need to write a signature packet after the literal - // data then we need to stop literalData from closing - // encryptedData. - w = noOpCloser{encryptedData} - - } - var epochSeconds uint32 - if !hints.ModTime.IsZero() { - epochSeconds = uint32(hints.ModTime.Unix()) - } - literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) - if err != nil { - return nil, err + // These are the possible hash functions that we'll use for the signature. + candidateHashes := []uint8{ + hashToHashId(crypto.SHA256), + hashToHashId(crypto.SHA384), + hashToHashId(crypto.SHA512), + hashToHashId(crypto.SHA1), + hashToHashId(crypto.RIPEMD160), } - - if signer != nil { - return signatureWriter{encryptedData, literalData, hash, hash.New(), signer, config}, nil + defaultHashes := candidateHashes[len(candidateHashes)-1:] + preferredHashes := signed.primaryIdentity().SelfSignature.PreferredHash + if len(preferredHashes) == 0 { + preferredHashes = defaultHashes } - return literalData, nil + candidateHashes = intersectPreferences(candidateHashes, preferredHashes) + return writeAndSign(noOpCloser{output}, candidateHashes, signed, hints, config) } // signatureWriter hashes the contents of a message while passing it along to diff --git a/vendor/golang.org/x/crypto/poly1305/poly1305.go b/vendor/golang.org/x/crypto/poly1305/poly1305.go new file mode 100644 index 000000000000..f562fa5712ba --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/poly1305.go @@ -0,0 +1,33 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package poly1305 implements Poly1305 one-time message authentication code as +specified in https://cr.yp.to/mac/poly1305-20050329.pdf. + +Poly1305 is a fast, one-time authentication function. It is infeasible for an +attacker to generate an authenticator for a message without the key. However, a +key must only be used for a single message. Authenticating two different +messages with the same key allows an attacker to forge authenticators for other +messages with the same key. + +Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was +used with a fixed key in order to generate one-time keys from an nonce. +However, in this package AES isn't used and the one-time key is specified +directly. +*/ +package poly1305 // import "golang.org/x/crypto/poly1305" + +import "crypto/subtle" + +// TagSize is the size, in bytes, of a poly1305 authenticator. +const TagSize = 16 + +// Verify returns true if mac is a valid authenticator for m with the given +// key. +func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { + var tmp [16]byte + Sum(&tmp, m, key) + return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go b/vendor/golang.org/x/crypto/poly1305/sum_amd64.go new file mode 100644 index 000000000000..4dd72fe799b2 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_amd64.go @@ -0,0 +1,22 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,!gccgo,!appengine + +package poly1305 + +// This function is implemented in sum_amd64.s +//go:noescape +func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305(out, mPtr, uint64(len(m)), key) +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s new file mode 100644 index 000000000000..2edae63828a5 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s @@ -0,0 +1,125 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,!gccgo,!appengine + +#include "textflag.h" + +#define POLY1305_ADD(msg, h0, h1, h2) \ + ADDQ 0(msg), h0; \ + ADCQ 8(msg), h1; \ + ADCQ $1, h2; \ + LEAQ 16(msg), msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ + MOVQ r0, AX; \ + MULQ h0; \ + MOVQ AX, t0; \ + MOVQ DX, t1; \ + MOVQ r0, AX; \ + MULQ h1; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ r0, t2; \ + IMULQ h2, t2; \ + ADDQ DX, t2; \ + \ + MOVQ r1, AX; \ + MULQ h0; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ DX, h0; \ + MOVQ r1, t3; \ + IMULQ h2, t3; \ + MOVQ r1, AX; \ + MULQ h1; \ + ADDQ AX, t2; \ + ADCQ DX, t3; \ + ADDQ h0, t2; \ + ADCQ $0, t3; \ + \ + MOVQ t0, h0; \ + MOVQ t1, h1; \ + MOVQ t2, h2; \ + ANDQ $3, h2; \ + MOVQ t2, t0; \ + ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ + ADDQ t0, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2; \ + SHRQ $2, t3, t2; \ + SHRQ $2, t3; \ + ADDQ t2, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2 + +DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +GLOBL ·poly1305Mask<>(SB), RODATA, $16 + +// func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]key) +TEXT ·poly1305(SB), $0-32 + MOVQ out+0(FP), DI + MOVQ m+8(FP), SI + MOVQ mlen+16(FP), R15 + MOVQ key+24(FP), AX + + MOVQ 0(AX), R11 + MOVQ 8(AX), R12 + ANDQ ·poly1305Mask<>(SB), R11 // r0 + ANDQ ·poly1305Mask<>+8(SB), R12 // r1 + XORQ R8, R8 // h0 + XORQ R9, R9 // h1 + XORQ R10, R10 // h2 + + CMPQ R15, $16 + JB bytes_between_0_and_15 + +loop: + POLY1305_ADD(SI, R8, R9, R10) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) + SUBQ $16, R15 + CMPQ R15, $16 + JAE loop + +bytes_between_0_and_15: + TESTQ R15, R15 + JZ done + MOVQ $1, BX + XORQ CX, CX + XORQ R13, R13 + ADDQ R15, SI + +flush_buffer: + SHLQ $8, BX, CX + SHLQ $8, BX + MOVB -1(SI), R13 + XORQ R13, BX + DECQ SI + DECQ R15 + JNZ flush_buffer + + ADDQ BX, R8 + ADCQ CX, R9 + ADCQ $0, R10 + MOVQ $16, R15 + JMP multiply + +done: + MOVQ R8, AX + MOVQ R9, BX + SUBQ $0xFFFFFFFFFFFFFFFB, AX + SBBQ $0xFFFFFFFFFFFFFFFF, BX + SBBQ $3, R10 + CMOVQCS R8, AX + CMOVQCS R9, BX + MOVQ key+24(FP), R8 + ADDQ 16(R8), AX + ADCQ 24(R8), BX + + MOVQ AX, 0(DI) + MOVQ BX, 8(DI) + RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_arm.go b/vendor/golang.org/x/crypto/poly1305/sum_arm.go new file mode 100644 index 000000000000..5dc321c2f39e --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_arm.go @@ -0,0 +1,22 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,!gccgo,!appengine,!nacl + +package poly1305 + +// This function is implemented in sum_arm.s +//go:noescape +func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305_auth_armv6(out, mPtr, uint32(len(m)), key) +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_arm.s b/vendor/golang.org/x/crypto/poly1305/sum_arm.s new file mode 100644 index 000000000000..f70b4ac48451 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_arm.s @@ -0,0 +1,427 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,!gccgo,!appengine,!nacl + +#include "textflag.h" + +// This code was translated into a form compatible with 5a from the public +// domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305. + +DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff +DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03 +DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff +DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff +DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff +GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20 + +// Warning: the linker may use R11 to synthesize certain instructions. Please +// take care and verify that no synthetic instructions use it. + +TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0 + // Needs 16 bytes of stack and 64 bytes of space pointed to by R0. (It + // might look like it's only 60 bytes of space but the final four bytes + // will be written by another function.) We need to skip over four + // bytes of stack because that's saving the value of 'g'. + ADD $4, R13, R8 + MOVM.IB [R4-R7], (R8) + MOVM.IA.W (R1), [R2-R5] + MOVW $·poly1305_init_constants_armv6<>(SB), R7 + MOVW R2, R8 + MOVW R2>>26, R9 + MOVW R3>>20, g + MOVW R4>>14, R11 + MOVW R5>>8, R12 + ORR R3<<6, R9, R9 + ORR R4<<12, g, g + ORR R5<<18, R11, R11 + MOVM.IA (R7), [R2-R6] + AND R8, R2, R2 + AND R9, R3, R3 + AND g, R4, R4 + AND R11, R5, R5 + AND R12, R6, R6 + MOVM.IA.W [R2-R6], (R0) + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + MOVM.IA.W [R2-R6], (R0) + MOVM.IA.W (R1), [R2-R5] + MOVM.IA [R2-R6], (R0) + ADD $20, R13, R0 + MOVM.DA (R0), [R4-R7] + RET + +#define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \ + MOVBU (offset+0)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+0)(Rdst); \ + MOVBU (offset+1)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+1)(Rdst); \ + MOVBU (offset+2)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+2)(Rdst); \ + MOVBU (offset+3)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+3)(Rdst) + +TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0 + // Needs 24 bytes of stack for saved registers and then 88 bytes of + // scratch space after that. We assume that 24 bytes at (R13) have + // already been used: four bytes for the link register saved in the + // prelude of poly1305_auth_armv6, four bytes for saving the value of g + // in that function and 16 bytes of scratch space used around + // poly1305_finish_ext_armv6_skip1. + ADD $24, R13, R12 + MOVM.IB [R4-R8, R14], (R12) + MOVW R0, 88(R13) + MOVW R1, 92(R13) + MOVW R2, 96(R13) + MOVW R1, R14 + MOVW R2, R12 + MOVW 56(R0), R8 + WORD $0xe1180008 // TST R8, R8 not working see issue 5921 + EOR R6, R6, R6 + MOVW.EQ $(1<<24), R6 + MOVW R6, 84(R13) + ADD $116, R13, g + MOVM.IA (R0), [R0-R9] + MOVM.IA [R0-R4], (g) + CMP $16, R12 + BLO poly1305_blocks_armv6_done + +poly1305_blocks_armv6_mainloop: + WORD $0xe31e0003 // TST R14, #3 not working see issue 5921 + BEQ poly1305_blocks_armv6_mainloop_aligned + ADD $100, R13, g + MOVW_UNALIGNED(R14, g, R0, 0) + MOVW_UNALIGNED(R14, g, R0, 4) + MOVW_UNALIGNED(R14, g, R0, 8) + MOVW_UNALIGNED(R14, g, R0, 12) + MOVM.IA (g), [R0-R3] + ADD $16, R14 + B poly1305_blocks_armv6_mainloop_loaded + +poly1305_blocks_armv6_mainloop_aligned: + MOVM.IA.W (R14), [R0-R3] + +poly1305_blocks_armv6_mainloop_loaded: + MOVW R0>>26, g + MOVW R1>>20, R11 + MOVW R2>>14, R12 + MOVW R14, 92(R13) + MOVW R3>>8, R4 + ORR R1<<6, g, g + ORR R2<<12, R11, R11 + ORR R3<<18, R12, R12 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, g, g + MOVW 84(R13), R3 + BIC $0xfc000000, R11, R11 + BIC $0xfc000000, R12, R12 + ADD R0, R5, R5 + ADD g, R6, R6 + ORR R3, R4, R4 + ADD R11, R7, R7 + ADD $116, R13, R14 + ADD R12, R8, R8 + ADD R4, R9, R9 + MOVM.IA (R14), [R0-R4] + MULLU R4, R5, (R11, g) + MULLU R3, R5, (R14, R12) + MULALU R3, R6, (R11, g) + MULALU R2, R6, (R14, R12) + MULALU R2, R7, (R11, g) + MULALU R1, R7, (R14, R12) + ADD R4<<2, R4, R4 + ADD R3<<2, R3, R3 + MULALU R1, R8, (R11, g) + MULALU R0, R8, (R14, R12) + MULALU R0, R9, (R11, g) + MULALU R4, R9, (R14, R12) + MOVW g, 76(R13) + MOVW R11, 80(R13) + MOVW R12, 68(R13) + MOVW R14, 72(R13) + MULLU R2, R5, (R11, g) + MULLU R1, R5, (R14, R12) + MULALU R1, R6, (R11, g) + MULALU R0, R6, (R14, R12) + MULALU R0, R7, (R11, g) + MULALU R4, R7, (R14, R12) + ADD R2<<2, R2, R2 + ADD R1<<2, R1, R1 + MULALU R4, R8, (R11, g) + MULALU R3, R8, (R14, R12) + MULALU R3, R9, (R11, g) + MULALU R2, R9, (R14, R12) + MOVW g, 60(R13) + MOVW R11, 64(R13) + MOVW R12, 52(R13) + MOVW R14, 56(R13) + MULLU R0, R5, (R11, g) + MULALU R4, R6, (R11, g) + MULALU R3, R7, (R11, g) + MULALU R2, R8, (R11, g) + MULALU R1, R9, (R11, g) + ADD $52, R13, R0 + MOVM.IA (R0), [R0-R7] + MOVW g>>26, R12 + MOVW R4>>26, R14 + ORR R11<<6, R12, R12 + ORR R5<<6, R14, R14 + BIC $0xfc000000, g, g + BIC $0xfc000000, R4, R4 + ADD.S R12, R0, R0 + ADC $0, R1, R1 + ADD.S R14, R6, R6 + ADC $0, R7, R7 + MOVW R0>>26, R12 + MOVW R6>>26, R14 + ORR R1<<6, R12, R12 + ORR R7<<6, R14, R14 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, R6, R6 + ADD R14<<2, R14, R14 + ADD.S R12, R2, R2 + ADC $0, R3, R3 + ADD R14, g, g + MOVW R2>>26, R12 + MOVW g>>26, R14 + ORR R3<<6, R12, R12 + BIC $0xfc000000, g, R5 + BIC $0xfc000000, R2, R7 + ADD R12, R4, R4 + ADD R14, R0, R0 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R8 + ADD R12, R6, R9 + MOVW 96(R13), R12 + MOVW 92(R13), R14 + MOVW R0, R6 + CMP $32, R12 + SUB $16, R12, R12 + MOVW R12, 96(R13) + BHS poly1305_blocks_armv6_mainloop + +poly1305_blocks_armv6_done: + MOVW 88(R13), R12 + MOVW R5, 20(R12) + MOVW R6, 24(R12) + MOVW R7, 28(R12) + MOVW R8, 32(R12) + MOVW R9, 36(R12) + ADD $48, R13, R0 + MOVM.DA (R0), [R4-R8, R14] + RET + +#define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst); \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst) + +#define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) + +// func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key) +TEXT ·poly1305_auth_armv6(SB), $196-16 + // The value 196, just above, is the sum of 64 (the size of the context + // structure) and 132 (the amount of stack needed). + // + // At this point, the stack pointer (R13) has been moved down. It + // points to the saved link register and there's 196 bytes of free + // space above it. + // + // The stack for this function looks like: + // + // +--------------------- + // | + // | 64 bytes of context structure + // | + // +--------------------- + // | + // | 112 bytes for poly1305_blocks_armv6 + // | + // +--------------------- + // | 16 bytes of final block, constructed at + // | poly1305_finish_ext_armv6_skip8 + // +--------------------- + // | four bytes of saved 'g' + // +--------------------- + // | lr, saved by prelude <- R13 points here + // +--------------------- + MOVW g, 4(R13) + + MOVW out+0(FP), R4 + MOVW m+4(FP), R5 + MOVW mlen+8(FP), R6 + MOVW key+12(FP), R7 + + ADD $136, R13, R0 // 136 = 4 + 4 + 16 + 112 + MOVW R7, R1 + + // poly1305_init_ext_armv6 will write to the stack from R13+4, but + // that's ok because none of the other values have been written yet. + BL poly1305_init_ext_armv6<>(SB) + BIC.S $15, R6, R2 + BEQ poly1305_auth_armv6_noblocks + ADD $136, R13, R0 + MOVW R5, R1 + ADD R2, R5, R5 + SUB R2, R6, R6 + BL poly1305_blocks_armv6<>(SB) + +poly1305_auth_armv6_noblocks: + ADD $136, R13, R0 + MOVW R5, R1 + MOVW R6, R2 + MOVW R4, R3 + + MOVW R0, R5 + MOVW R1, R6 + MOVW R2, R7 + MOVW R3, R8 + AND.S R2, R2, R2 + BEQ poly1305_finish_ext_armv6_noremaining + EOR R0, R0 + ADD $8, R13, R9 // 8 = offset to 16 byte scratch space + MOVW R0, (R9) + MOVW R0, 4(R9) + MOVW R0, 8(R9) + MOVW R0, 12(R9) + WORD $0xe3110003 // TST R1, #3 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_aligned + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8 + MOVWP_UNALIGNED(R1, R9, g) + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip8: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4 + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip4: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHUP_UNALIGNED(R1, R9, g) + B poly1305_finish_ext_armv6_skip2 + +poly1305_finish_ext_armv6_aligned: + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8_aligned + MOVM.IA.W (R1), [g-R11] + MOVM.IA.W [g-R11], (R9) + +poly1305_finish_ext_armv6_skip8_aligned: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4_aligned + MOVW.P 4(R1), g + MOVW.P g, 4(R9) + +poly1305_finish_ext_armv6_skip4_aligned: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHU.P 2(R1), g + MOVH.P g, 2(R9) + +poly1305_finish_ext_armv6_skip2: + WORD $0xe3120001 // TST $1, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip1 + MOVBU.P 1(R1), g + MOVBU.P g, 1(R9) + +poly1305_finish_ext_armv6_skip1: + MOVW $1, R11 + MOVBU R11, 0(R9) + MOVW R11, 56(R5) + MOVW R5, R0 + ADD $8, R13, R1 + MOVW $16, R2 + BL poly1305_blocks_armv6<>(SB) + +poly1305_finish_ext_armv6_noremaining: + MOVW 20(R5), R0 + MOVW 24(R5), R1 + MOVW 28(R5), R2 + MOVW 32(R5), R3 + MOVW 36(R5), R4 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R4 + ADD R12<<2, R12, R12 + ADD R12, R0, R0 + MOVW R0>>26, R12 + BIC $0xfc000000, R0, R0 + ADD R12, R1, R1 + MOVW R1>>26, R12 + BIC $0xfc000000, R1, R1 + ADD R12, R2, R2 + MOVW R2>>26, R12 + BIC $0xfc000000, R2, R2 + ADD R12, R3, R3 + MOVW R3>>26, R12 + BIC $0xfc000000, R3, R3 + ADD R12, R4, R4 + ADD $5, R0, R6 + MOVW R6>>26, R12 + BIC $0xfc000000, R6, R6 + ADD R12, R1, R7 + MOVW R7>>26, R12 + BIC $0xfc000000, R7, R7 + ADD R12, R2, g + MOVW g>>26, R12 + BIC $0xfc000000, g, g + ADD R12, R3, R11 + MOVW $-(1<<26), R12 + ADD R11>>26, R12, R12 + BIC $0xfc000000, R11, R11 + ADD R12, R4, R9 + MOVW R9>>31, R12 + SUB $1, R12 + AND R12, R6, R6 + AND R12, R7, R7 + AND R12, g, g + AND R12, R11, R11 + AND R12, R9, R9 + MVN R12, R12 + AND R12, R0, R0 + AND R12, R1, R1 + AND R12, R2, R2 + AND R12, R3, R3 + AND R12, R4, R4 + ORR R6, R0, R0 + ORR R7, R1, R1 + ORR g, R2, R2 + ORR R11, R3, R3 + ORR R9, R4, R4 + ORR R1<<26, R0, R0 + MOVW R1>>6, R1 + ORR R2<<20, R1, R1 + MOVW R2>>12, R2 + ORR R3<<14, R2, R2 + MOVW R3>>18, R3 + ORR R4<<8, R3, R3 + MOVW 40(R5), R6 + MOVW 44(R5), R7 + MOVW 48(R5), g + MOVW 52(R5), R11 + ADD.S R6, R0, R0 + ADC.S R7, R1, R1 + ADC.S g, R2, R2 + ADC.S R11, R3, R3 + MOVM.IA [R0-R3], (R8) + MOVW R5, R12 + EOR R0, R0, R0 + EOR R1, R1, R1 + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + EOR R7, R7, R7 + MOVM.IA.W [R0-R7], (R12) + MOVM.IA [R0-R7], (R12) + MOVW 4(R13), g + RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_noasm.go b/vendor/golang.org/x/crypto/poly1305/sum_noasm.go new file mode 100644 index 000000000000..751eec52743c --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_noasm.go @@ -0,0 +1,14 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x,!go1.11 !arm,!amd64,!s390x gccgo appengine nacl + +package poly1305 + +// Sum generates an authenticator for msg using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { + sumGeneric(out, msg, key) +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ref.go b/vendor/golang.org/x/crypto/poly1305/sum_ref.go new file mode 100644 index 000000000000..c4d59bd09874 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_ref.go @@ -0,0 +1,139 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package poly1305 + +import "encoding/binary" + +// sumGeneric generates an authenticator for msg using a one-time key and +// puts the 16-byte result into out. This is the generic implementation of +// Sum and should be called if no assembly implementation is available. +func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) { + var ( + h0, h1, h2, h3, h4 uint32 // the hash accumulators + r0, r1, r2, r3, r4 uint64 // the r part of the key + ) + + r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) + r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) + r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) + r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) + r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) + + R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 + + for len(msg) >= TagSize { + // h += msg + h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + + msg = msg[TagSize:] + } + + if len(msg) > 0 { + var block [TagSize]byte + off := copy(block[:], msg) + block[off] = 0x01 + + // h += msg + h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + } + + // h %= p reduction + h2 += h1 >> 26 + h1 &= 0x3ffffff + h3 += h2 >> 26 + h2 &= 0x3ffffff + h4 += h3 >> 26 + h3 &= 0x3ffffff + h0 += 5 * (h4 >> 26) + h4 &= 0x3ffffff + h1 += h0 >> 26 + h0 &= 0x3ffffff + + // h - p + t0 := h0 + 5 + t1 := h1 + (t0 >> 26) + t2 := h2 + (t1 >> 26) + t3 := h3 + (t2 >> 26) + t4 := h4 + (t3 >> 26) - (1 << 26) + t0 &= 0x3ffffff + t1 &= 0x3ffffff + t2 &= 0x3ffffff + t3 &= 0x3ffffff + + // select h if h < p else h - p + t_mask := (t4 >> 31) - 1 + h_mask := ^t_mask + h0 = (h0 & h_mask) | (t0 & t_mask) + h1 = (h1 & h_mask) | (t1 & t_mask) + h2 = (h2 & h_mask) | (t2 & t_mask) + h3 = (h3 & h_mask) | (t3 & t_mask) + h4 = (h4 & h_mask) | (t4 & t_mask) + + // h %= 2^128 + h0 |= h1 << 26 + h1 = ((h1 >> 6) | (h2 << 20)) + h2 = ((h2 >> 12) | (h3 << 14)) + h3 = ((h3 >> 18) | (h4 << 8)) + + // s: the s part of the key + // tag = (h + s) % (2^128) + t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) + h0 = uint32(t) + t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) + h1 = uint32(t) + t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) + h2 = uint32(t) + t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) + h3 = uint32(t) + + binary.LittleEndian.PutUint32(out[0:], h0) + binary.LittleEndian.PutUint32(out[4:], h1) + binary.LittleEndian.PutUint32(out[8:], h2) + binary.LittleEndian.PutUint32(out[12:], h3) +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go b/vendor/golang.org/x/crypto/poly1305/sum_s390x.go new file mode 100644 index 000000000000..7a266cece46a --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_s390x.go @@ -0,0 +1,49 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x,go1.11,!gccgo,!appengine + +package poly1305 + +// hasVectorFacility reports whether the machine supports +// the vector facility (vx). +func hasVectorFacility() bool + +// hasVMSLFacility reports whether the machine supports +// Vector Multiply Sum Logical (VMSL). +func hasVMSLFacility() bool + +var hasVX = hasVectorFacility() +var hasVMSL = hasVMSLFacility() + +// poly1305vx is an assembly implementation of Poly1305 that uses vector +// instructions. It must only be called if the vector facility (vx) is +// available. +//go:noescape +func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]byte) + +// poly1305vmsl is an assembly implementation of Poly1305 that uses vector +// instructions, including VMSL. It must only be called if the vector facility (vx) is +// available and if VMSL is supported. +//go:noescape +func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + if hasVX { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + if hasVMSL && len(m) > 256 { + poly1305vmsl(out, mPtr, uint64(len(m)), key) + } else { + poly1305vx(out, mPtr, uint64(len(m)), key) + } + } else { + sumGeneric(out, m, key) + } +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s new file mode 100644 index 000000000000..356c07a6c2b1 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s @@ -0,0 +1,400 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x,go1.11,!gccgo,!appengine + +#include "textflag.h" + +// Implementation of Poly1305 using the vector facility (vx). + +// constants +#define MOD26 V0 +#define EX0 V1 +#define EX1 V2 +#define EX2 V3 + +// temporaries +#define T_0 V4 +#define T_1 V5 +#define T_2 V6 +#define T_3 V7 +#define T_4 V8 + +// key (r) +#define R_0 V9 +#define R_1 V10 +#define R_2 V11 +#define R_3 V12 +#define R_4 V13 +#define R5_1 V14 +#define R5_2 V15 +#define R5_3 V16 +#define R5_4 V17 +#define RSAVE_0 R5 +#define RSAVE_1 R6 +#define RSAVE_2 R7 +#define RSAVE_3 R8 +#define RSAVE_4 R9 +#define R5SAVE_1 V28 +#define R5SAVE_2 V29 +#define R5SAVE_3 V30 +#define R5SAVE_4 V31 + +// message block +#define F_0 V18 +#define F_1 V19 +#define F_2 V20 +#define F_3 V21 +#define F_4 V22 + +// accumulator +#define H_0 V23 +#define H_1 V24 +#define H_2 V25 +#define H_3 V26 +#define H_4 V27 + +GLOBL ·keyMask<>(SB), RODATA, $16 +DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f +DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f + +GLOBL ·bswapMask<>(SB), RODATA, $16 +DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908 +DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100 + +GLOBL ·constants<>(SB), RODATA, $64 +// MOD26 +DATA ·constants<>+0(SB)/8, $0x3ffffff +DATA ·constants<>+8(SB)/8, $0x3ffffff +// EX0 +DATA ·constants<>+16(SB)/8, $0x0006050403020100 +DATA ·constants<>+24(SB)/8, $0x1016151413121110 +// EX1 +DATA ·constants<>+32(SB)/8, $0x060c0b0a09080706 +DATA ·constants<>+40(SB)/8, $0x161c1b1a19181716 +// EX2 +DATA ·constants<>+48(SB)/8, $0x0d0d0d0d0d0f0e0d +DATA ·constants<>+56(SB)/8, $0x1d1d1d1d1d1f1e1d + +// h = (f*g) % (2**130-5) [partial reduction] +#define MULTIPLY(f0, f1, f2, f3, f4, g0, g1, g2, g3, g4, g51, g52, g53, g54, h0, h1, h2, h3, h4) \ + VMLOF f0, g0, h0 \ + VMLOF f0, g1, h1 \ + VMLOF f0, g2, h2 \ + VMLOF f0, g3, h3 \ + VMLOF f0, g4, h4 \ + VMLOF f1, g54, T_0 \ + VMLOF f1, g0, T_1 \ + VMLOF f1, g1, T_2 \ + VMLOF f1, g2, T_3 \ + VMLOF f1, g3, T_4 \ + VMALOF f2, g53, h0, h0 \ + VMALOF f2, g54, h1, h1 \ + VMALOF f2, g0, h2, h2 \ + VMALOF f2, g1, h3, h3 \ + VMALOF f2, g2, h4, h4 \ + VMALOF f3, g52, T_0, T_0 \ + VMALOF f3, g53, T_1, T_1 \ + VMALOF f3, g54, T_2, T_2 \ + VMALOF f3, g0, T_3, T_3 \ + VMALOF f3, g1, T_4, T_4 \ + VMALOF f4, g51, h0, h0 \ + VMALOF f4, g52, h1, h1 \ + VMALOF f4, g53, h2, h2 \ + VMALOF f4, g54, h3, h3 \ + VMALOF f4, g0, h4, h4 \ + VAG T_0, h0, h0 \ + VAG T_1, h1, h1 \ + VAG T_2, h2, h2 \ + VAG T_3, h3, h3 \ + VAG T_4, h4, h4 + +// carry h0->h1 h3->h4, h1->h2 h4->h0, h0->h1 h2->h3, h3->h4 +#define REDUCE(h0, h1, h2, h3, h4) \ + VESRLG $26, h0, T_0 \ + VESRLG $26, h3, T_1 \ + VN MOD26, h0, h0 \ + VN MOD26, h3, h3 \ + VAG T_0, h1, h1 \ + VAG T_1, h4, h4 \ + VESRLG $26, h1, T_2 \ + VESRLG $26, h4, T_3 \ + VN MOD26, h1, h1 \ + VN MOD26, h4, h4 \ + VESLG $2, T_3, T_4 \ + VAG T_3, T_4, T_4 \ + VAG T_2, h2, h2 \ + VAG T_4, h0, h0 \ + VESRLG $26, h2, T_0 \ + VESRLG $26, h0, T_1 \ + VN MOD26, h2, h2 \ + VN MOD26, h0, h0 \ + VAG T_0, h3, h3 \ + VAG T_1, h1, h1 \ + VESRLG $26, h3, T_2 \ + VN MOD26, h3, h3 \ + VAG T_2, h4, h4 + +// expand in0 into d[0] and in1 into d[1] +#define EXPAND(in0, in1, d0, d1, d2, d3, d4) \ + VGBM $0x0707, d1 \ // d1=tmp + VPERM in0, in1, EX2, d4 \ + VPERM in0, in1, EX0, d0 \ + VPERM in0, in1, EX1, d2 \ + VN d1, d4, d4 \ + VESRLG $26, d0, d1 \ + VESRLG $30, d2, d3 \ + VESRLG $4, d2, d2 \ + VN MOD26, d0, d0 \ + VN MOD26, d1, d1 \ + VN MOD26, d2, d2 \ + VN MOD26, d3, d3 + +// pack h4:h0 into h1:h0 (no carry) +#define PACK(h0, h1, h2, h3, h4) \ + VESLG $26, h1, h1 \ + VESLG $26, h3, h3 \ + VO h0, h1, h0 \ + VO h2, h3, h2 \ + VESLG $4, h2, h2 \ + VLEIB $7, $48, h1 \ + VSLB h1, h2, h2 \ + VO h0, h2, h0 \ + VLEIB $7, $104, h1 \ + VSLB h1, h4, h3 \ + VO h3, h0, h0 \ + VLEIB $7, $24, h1 \ + VSRLB h1, h4, h1 + +// if h > 2**130-5 then h -= 2**130-5 +#define MOD(h0, h1, t0, t1, t2) \ + VZERO t0 \ + VLEIG $1, $5, t0 \ + VACCQ h0, t0, t1 \ + VAQ h0, t0, t0 \ + VONE t2 \ + VLEIG $1, $-4, t2 \ + VAQ t2, t1, t1 \ + VACCQ h1, t1, t1 \ + VONE t2 \ + VAQ t2, t1, t1 \ + VN h0, t1, t2 \ + VNC t0, t1, t1 \ + VO t1, t2, h0 + +// func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]key) +TEXT ·poly1305vx(SB), $0-32 + // This code processes up to 2 blocks (32 bytes) per iteration + // using the algorithm described in: + // NEON crypto, Daniel J. Bernstein & Peter Schwabe + // https://cryptojedi.org/papers/neoncrypto-20120320.pdf + LMG out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key + + // load MOD26, EX0, EX1 and EX2 + MOVD $·constants<>(SB), R5 + VLM (R5), MOD26, EX2 + + // setup r + VL (R4), T_0 + MOVD $·keyMask<>(SB), R6 + VL (R6), T_1 + VN T_0, T_1, T_0 + EXPAND(T_0, T_0, R_0, R_1, R_2, R_3, R_4) + + // setup r*5 + VLEIG $0, $5, T_0 + VLEIG $1, $5, T_0 + + // store r (for final block) + VMLOF T_0, R_1, R5SAVE_1 + VMLOF T_0, R_2, R5SAVE_2 + VMLOF T_0, R_3, R5SAVE_3 + VMLOF T_0, R_4, R5SAVE_4 + VLGVG $0, R_0, RSAVE_0 + VLGVG $0, R_1, RSAVE_1 + VLGVG $0, R_2, RSAVE_2 + VLGVG $0, R_3, RSAVE_3 + VLGVG $0, R_4, RSAVE_4 + + // skip r**2 calculation + CMPBLE R3, $16, skip + + // calculate r**2 + MULTIPLY(R_0, R_1, R_2, R_3, R_4, R_0, R_1, R_2, R_3, R_4, R5SAVE_1, R5SAVE_2, R5SAVE_3, R5SAVE_4, H_0, H_1, H_2, H_3, H_4) + REDUCE(H_0, H_1, H_2, H_3, H_4) + VLEIG $0, $5, T_0 + VLEIG $1, $5, T_0 + VMLOF T_0, H_1, R5_1 + VMLOF T_0, H_2, R5_2 + VMLOF T_0, H_3, R5_3 + VMLOF T_0, H_4, R5_4 + VLR H_0, R_0 + VLR H_1, R_1 + VLR H_2, R_2 + VLR H_3, R_3 + VLR H_4, R_4 + + // initialize h + VZERO H_0 + VZERO H_1 + VZERO H_2 + VZERO H_3 + VZERO H_4 + +loop: + CMPBLE R3, $32, b2 + VLM (R2), T_0, T_1 + SUB $32, R3 + MOVD $32(R2), R2 + EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) + VLEIB $4, $1, F_4 + VLEIB $12, $1, F_4 + +multiply: + VAG H_0, F_0, F_0 + VAG H_1, F_1, F_1 + VAG H_2, F_2, F_2 + VAG H_3, F_3, F_3 + VAG H_4, F_4, F_4 + MULTIPLY(F_0, F_1, F_2, F_3, F_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, H_0, H_1, H_2, H_3, H_4) + REDUCE(H_0, H_1, H_2, H_3, H_4) + CMPBNE R3, $0, loop + +finish: + // sum vectors + VZERO T_0 + VSUMQG H_0, T_0, H_0 + VSUMQG H_1, T_0, H_1 + VSUMQG H_2, T_0, H_2 + VSUMQG H_3, T_0, H_3 + VSUMQG H_4, T_0, H_4 + + // h may be >= 2*(2**130-5) so we need to reduce it again + REDUCE(H_0, H_1, H_2, H_3, H_4) + + // carry h1->h4 + VESRLG $26, H_1, T_1 + VN MOD26, H_1, H_1 + VAQ T_1, H_2, H_2 + VESRLG $26, H_2, T_2 + VN MOD26, H_2, H_2 + VAQ T_2, H_3, H_3 + VESRLG $26, H_3, T_3 + VN MOD26, H_3, H_3 + VAQ T_3, H_4, H_4 + + // h is now < 2*(2**130-5) + // pack h into h1 (hi) and h0 (lo) + PACK(H_0, H_1, H_2, H_3, H_4) + + // if h > 2**130-5 then h -= 2**130-5 + MOD(H_0, H_1, T_0, T_1, T_2) + + // h += s + MOVD $·bswapMask<>(SB), R5 + VL (R5), T_1 + VL 16(R4), T_0 + VPERM T_0, T_0, T_1, T_0 // reverse bytes (to big) + VAQ T_0, H_0, H_0 + VPERM H_0, H_0, T_1, H_0 // reverse bytes (to little) + VST H_0, (R1) + + RET + +b2: + CMPBLE R3, $16, b1 + + // 2 blocks remaining + SUB $17, R3 + VL (R2), T_0 + VLL R3, 16(R2), T_1 + ADD $1, R3 + MOVBZ $1, R0 + CMPBEQ R3, $16, 2(PC) + VLVGB R3, R0, T_1 + EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) + CMPBNE R3, $16, 2(PC) + VLEIB $12, $1, F_4 + VLEIB $4, $1, F_4 + + // setup [r²,r] + VLVGG $1, RSAVE_0, R_0 + VLVGG $1, RSAVE_1, R_1 + VLVGG $1, RSAVE_2, R_2 + VLVGG $1, RSAVE_3, R_3 + VLVGG $1, RSAVE_4, R_4 + VPDI $0, R5_1, R5SAVE_1, R5_1 + VPDI $0, R5_2, R5SAVE_2, R5_2 + VPDI $0, R5_3, R5SAVE_3, R5_3 + VPDI $0, R5_4, R5SAVE_4, R5_4 + + MOVD $0, R3 + BR multiply + +skip: + VZERO H_0 + VZERO H_1 + VZERO H_2 + VZERO H_3 + VZERO H_4 + + CMPBEQ R3, $0, finish + +b1: + // 1 block remaining + SUB $1, R3 + VLL R3, (R2), T_0 + ADD $1, R3 + MOVBZ $1, R0 + CMPBEQ R3, $16, 2(PC) + VLVGB R3, R0, T_0 + VZERO T_1 + EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) + CMPBNE R3, $16, 2(PC) + VLEIB $4, $1, F_4 + VLEIG $1, $1, R_0 + VZERO R_1 + VZERO R_2 + VZERO R_3 + VZERO R_4 + VZERO R5_1 + VZERO R5_2 + VZERO R5_3 + VZERO R5_4 + + // setup [r, 1] + VLVGG $0, RSAVE_0, R_0 + VLVGG $0, RSAVE_1, R_1 + VLVGG $0, RSAVE_2, R_2 + VLVGG $0, RSAVE_3, R_3 + VLVGG $0, RSAVE_4, R_4 + VPDI $0, R5SAVE_1, R5_1, R5_1 + VPDI $0, R5SAVE_2, R5_2, R5_2 + VPDI $0, R5SAVE_3, R5_3, R5_3 + VPDI $0, R5SAVE_4, R5_4, R5_4 + + MOVD $0, R3 + BR multiply + +TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1 + MOVD $x-24(SP), R1 + XC $24, 0(R1), 0(R1) // clear the storage + MOVD $2, R0 // R0 is the number of double words stored -1 + WORD $0xB2B01000 // STFLE 0(R1) + XOR R0, R0 // reset the value of R0 + MOVBZ z-8(SP), R1 + AND $0x40, R1 + BEQ novector + +vectorinstalled: + // check if the vector instruction has been enabled + VLEIB $0, $0xF, V16 + VLGVB $0, V16, R1 + CMPBNE R1, $0xF, novector + MOVB $1, ret+0(FP) // have vx + RET + +novector: + MOVB $0, ret+0(FP) // no vx + RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s new file mode 100644 index 000000000000..e548020b14e1 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s @@ -0,0 +1,931 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x,go1.11,!gccgo,!appengine + +#include "textflag.h" + +// Implementation of Poly1305 using the vector facility (vx) and the VMSL instruction. + +// constants +#define EX0 V1 +#define EX1 V2 +#define EX2 V3 + +// temporaries +#define T_0 V4 +#define T_1 V5 +#define T_2 V6 +#define T_3 V7 +#define T_4 V8 +#define T_5 V9 +#define T_6 V10 +#define T_7 V11 +#define T_8 V12 +#define T_9 V13 +#define T_10 V14 + +// r**2 & r**4 +#define R_0 V15 +#define R_1 V16 +#define R_2 V17 +#define R5_1 V18 +#define R5_2 V19 +// key (r) +#define RSAVE_0 R7 +#define RSAVE_1 R8 +#define RSAVE_2 R9 +#define R5SAVE_1 R10 +#define R5SAVE_2 R11 + +// message block +#define M0 V20 +#define M1 V21 +#define M2 V22 +#define M3 V23 +#define M4 V24 +#define M5 V25 + +// accumulator +#define H0_0 V26 +#define H1_0 V27 +#define H2_0 V28 +#define H0_1 V29 +#define H1_1 V30 +#define H2_1 V31 + +GLOBL ·keyMask<>(SB), RODATA, $16 +DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f +DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f + +GLOBL ·bswapMask<>(SB), RODATA, $16 +DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908 +DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100 + +GLOBL ·constants<>(SB), RODATA, $48 +// EX0 +DATA ·constants<>+0(SB)/8, $0x18191a1b1c1d1e1f +DATA ·constants<>+8(SB)/8, $0x0000050403020100 +// EX1 +DATA ·constants<>+16(SB)/8, $0x18191a1b1c1d1e1f +DATA ·constants<>+24(SB)/8, $0x00000a0908070605 +// EX2 +DATA ·constants<>+32(SB)/8, $0x18191a1b1c1d1e1f +DATA ·constants<>+40(SB)/8, $0x0000000f0e0d0c0b + +GLOBL ·c<>(SB), RODATA, $48 +// EX0 +DATA ·c<>+0(SB)/8, $0x0000050403020100 +DATA ·c<>+8(SB)/8, $0x0000151413121110 +// EX1 +DATA ·c<>+16(SB)/8, $0x00000a0908070605 +DATA ·c<>+24(SB)/8, $0x00001a1918171615 +// EX2 +DATA ·c<>+32(SB)/8, $0x0000000f0e0d0c0b +DATA ·c<>+40(SB)/8, $0x0000001f1e1d1c1b + +GLOBL ·reduce<>(SB), RODATA, $32 +// 44 bit +DATA ·reduce<>+0(SB)/8, $0x0 +DATA ·reduce<>+8(SB)/8, $0xfffffffffff +// 42 bit +DATA ·reduce<>+16(SB)/8, $0x0 +DATA ·reduce<>+24(SB)/8, $0x3ffffffffff + +// h = (f*g) % (2**130-5) [partial reduction] +// uses T_0...T_9 temporary registers +// input: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2 +// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9 +// output: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2 +#define MULTIPLY(m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ + \ // Eliminate the dependency for the last 2 VMSLs + VMSLG m02_0, r_2, m4_2, m4_2 \ + VMSLG m13_0, r_2, m5_2, m5_2 \ // 8 VMSLs pipelined + VMSLG m02_0, r_0, m4_0, m4_0 \ + VMSLG m02_1, r5_2, V0, T_0 \ + VMSLG m02_0, r_1, m4_1, m4_1 \ + VMSLG m02_1, r_0, V0, T_1 \ + VMSLG m02_1, r_1, V0, T_2 \ + VMSLG m02_2, r5_1, V0, T_3 \ + VMSLG m02_2, r5_2, V0, T_4 \ + VMSLG m13_0, r_0, m5_0, m5_0 \ + VMSLG m13_1, r5_2, V0, T_5 \ + VMSLG m13_0, r_1, m5_1, m5_1 \ + VMSLG m13_1, r_0, V0, T_6 \ + VMSLG m13_1, r_1, V0, T_7 \ + VMSLG m13_2, r5_1, V0, T_8 \ + VMSLG m13_2, r5_2, V0, T_9 \ + VMSLG m02_2, r_0, m4_2, m4_2 \ + VMSLG m13_2, r_0, m5_2, m5_2 \ + VAQ m4_0, T_0, m02_0 \ + VAQ m4_1, T_1, m02_1 \ + VAQ m5_0, T_5, m13_0 \ + VAQ m5_1, T_6, m13_1 \ + VAQ m02_0, T_3, m02_0 \ + VAQ m02_1, T_4, m02_1 \ + VAQ m13_0, T_8, m13_0 \ + VAQ m13_1, T_9, m13_1 \ + VAQ m4_2, T_2, m02_2 \ + VAQ m5_2, T_7, m13_2 \ + +// SQUARE uses three limbs of r and r_2*5 to output square of r +// uses T_1, T_5 and T_7 temporary registers +// input: r_0, r_1, r_2, r5_2 +// temp: TEMP0, TEMP1, TEMP2 +// output: p0, p1, p2 +#define SQUARE(r_0, r_1, r_2, r5_2, p0, p1, p2, TEMP0, TEMP1, TEMP2) \ + VMSLG r_0, r_0, p0, p0 \ + VMSLG r_1, r5_2, V0, TEMP0 \ + VMSLG r_2, r5_2, p1, p1 \ + VMSLG r_0, r_1, V0, TEMP1 \ + VMSLG r_1, r_1, p2, p2 \ + VMSLG r_0, r_2, V0, TEMP2 \ + VAQ TEMP0, p0, p0 \ + VAQ TEMP1, p1, p1 \ + VAQ TEMP2, p2, p2 \ + VAQ TEMP0, p0, p0 \ + VAQ TEMP1, p1, p1 \ + VAQ TEMP2, p2, p2 \ + +// carry h0->h1->h2->h0 || h3->h4->h5->h3 +// uses T_2, T_4, T_5, T_7, T_8, T_9 +// t6, t7, t8, t9, t10, t11 +// input: h0, h1, h2, h3, h4, h5 +// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 +// output: h0, h1, h2, h3, h4, h5 +#define REDUCE(h0, h1, h2, h3, h4, h5, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) \ + VLM (R12), t6, t7 \ // 44 and 42 bit clear mask + VLEIB $7, $0x28, t10 \ // 5 byte shift mask + VREPIB $4, t8 \ // 4 bit shift mask + VREPIB $2, t11 \ // 2 bit shift mask + VSRLB t10, h0, t0 \ // h0 byte shift + VSRLB t10, h1, t1 \ // h1 byte shift + VSRLB t10, h2, t2 \ // h2 byte shift + VSRLB t10, h3, t3 \ // h3 byte shift + VSRLB t10, h4, t4 \ // h4 byte shift + VSRLB t10, h5, t5 \ // h5 byte shift + VSRL t8, t0, t0 \ // h0 bit shift + VSRL t8, t1, t1 \ // h2 bit shift + VSRL t11, t2, t2 \ // h2 bit shift + VSRL t8, t3, t3 \ // h3 bit shift + VSRL t8, t4, t4 \ // h4 bit shift + VESLG $2, t2, t9 \ // h2 carry x5 + VSRL t11, t5, t5 \ // h5 bit shift + VN t6, h0, h0 \ // h0 clear carry + VAQ t2, t9, t2 \ // h2 carry x5 + VESLG $2, t5, t9 \ // h5 carry x5 + VN t6, h1, h1 \ // h1 clear carry + VN t7, h2, h2 \ // h2 clear carry + VAQ t5, t9, t5 \ // h5 carry x5 + VN t6, h3, h3 \ // h3 clear carry + VN t6, h4, h4 \ // h4 clear carry + VN t7, h5, h5 \ // h5 clear carry + VAQ t0, h1, h1 \ // h0->h1 + VAQ t3, h4, h4 \ // h3->h4 + VAQ t1, h2, h2 \ // h1->h2 + VAQ t4, h5, h5 \ // h4->h5 + VAQ t2, h0, h0 \ // h2->h0 + VAQ t5, h3, h3 \ // h5->h3 + VREPG $1, t6, t6 \ // 44 and 42 bit masks across both halves + VREPG $1, t7, t7 \ + VSLDB $8, h0, h0, h0 \ // set up [h0/1/2, h3/4/5] + VSLDB $8, h1, h1, h1 \ + VSLDB $8, h2, h2, h2 \ + VO h0, h3, h3 \ + VO h1, h4, h4 \ + VO h2, h5, h5 \ + VESRLG $44, h3, t0 \ // 44 bit shift right + VESRLG $44, h4, t1 \ + VESRLG $42, h5, t2 \ + VN t6, h3, h3 \ // clear carry bits + VN t6, h4, h4 \ + VN t7, h5, h5 \ + VESLG $2, t2, t9 \ // multiply carry by 5 + VAQ t9, t2, t2 \ + VAQ t0, h4, h4 \ + VAQ t1, h5, h5 \ + VAQ t2, h3, h3 \ + +// carry h0->h1->h2->h0 +// input: h0, h1, h2 +// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8 +// output: h0, h1, h2 +#define REDUCE2(h0, h1, h2, t0, t1, t2, t3, t4, t5, t6, t7, t8) \ + VLEIB $7, $0x28, t3 \ // 5 byte shift mask + VREPIB $4, t4 \ // 4 bit shift mask + VREPIB $2, t7 \ // 2 bit shift mask + VGBM $0x003F, t5 \ // mask to clear carry bits + VSRLB t3, h0, t0 \ + VSRLB t3, h1, t1 \ + VSRLB t3, h2, t2 \ + VESRLG $4, t5, t5 \ // 44 bit clear mask + VSRL t4, t0, t0 \ + VSRL t4, t1, t1 \ + VSRL t7, t2, t2 \ + VESRLG $2, t5, t6 \ // 42 bit clear mask + VESLG $2, t2, t8 \ + VAQ t8, t2, t2 \ + VN t5, h0, h0 \ + VN t5, h1, h1 \ + VN t6, h2, h2 \ + VAQ t0, h1, h1 \ + VAQ t1, h2, h2 \ + VAQ t2, h0, h0 \ + VSRLB t3, h0, t0 \ + VSRLB t3, h1, t1 \ + VSRLB t3, h2, t2 \ + VSRL t4, t0, t0 \ + VSRL t4, t1, t1 \ + VSRL t7, t2, t2 \ + VN t5, h0, h0 \ + VN t5, h1, h1 \ + VESLG $2, t2, t8 \ + VN t6, h2, h2 \ + VAQ t0, h1, h1 \ + VAQ t8, t2, t2 \ + VAQ t1, h2, h2 \ + VAQ t2, h0, h0 \ + +// expands two message blocks into the lower halfs of the d registers +// moves the contents of the d registers into upper halfs +// input: in1, in2, d0, d1, d2, d3, d4, d5 +// temp: TEMP0, TEMP1, TEMP2, TEMP3 +// output: d0, d1, d2, d3, d4, d5 +#define EXPACC(in1, in2, d0, d1, d2, d3, d4, d5, TEMP0, TEMP1, TEMP2, TEMP3) \ + VGBM $0xff3f, TEMP0 \ + VGBM $0xff1f, TEMP1 \ + VESLG $4, d1, TEMP2 \ + VESLG $4, d4, TEMP3 \ + VESRLG $4, TEMP0, TEMP0 \ + VPERM in1, d0, EX0, d0 \ + VPERM in2, d3, EX0, d3 \ + VPERM in1, d2, EX2, d2 \ + VPERM in2, d5, EX2, d5 \ + VPERM in1, TEMP2, EX1, d1 \ + VPERM in2, TEMP3, EX1, d4 \ + VN TEMP0, d0, d0 \ + VN TEMP0, d3, d3 \ + VESRLG $4, d1, d1 \ + VESRLG $4, d4, d4 \ + VN TEMP1, d2, d2 \ + VN TEMP1, d5, d5 \ + VN TEMP0, d1, d1 \ + VN TEMP0, d4, d4 \ + +// expands one message block into the lower halfs of the d registers +// moves the contents of the d registers into upper halfs +// input: in, d0, d1, d2 +// temp: TEMP0, TEMP1, TEMP2 +// output: d0, d1, d2 +#define EXPACC2(in, d0, d1, d2, TEMP0, TEMP1, TEMP2) \ + VGBM $0xff3f, TEMP0 \ + VESLG $4, d1, TEMP2 \ + VGBM $0xff1f, TEMP1 \ + VPERM in, d0, EX0, d0 \ + VESRLG $4, TEMP0, TEMP0 \ + VPERM in, d2, EX2, d2 \ + VPERM in, TEMP2, EX1, d1 \ + VN TEMP0, d0, d0 \ + VN TEMP1, d2, d2 \ + VESRLG $4, d1, d1 \ + VN TEMP0, d1, d1 \ + +// pack h2:h0 into h1:h0 (no carry) +// input: h0, h1, h2 +// output: h0, h1, h2 +#define PACK(h0, h1, h2) \ + VMRLG h1, h2, h2 \ // copy h1 to upper half h2 + VESLG $44, h1, h1 \ // shift limb 1 44 bits, leaving 20 + VO h0, h1, h0 \ // combine h0 with 20 bits from limb 1 + VESRLG $20, h2, h1 \ // put top 24 bits of limb 1 into h1 + VLEIG $1, $0, h1 \ // clear h2 stuff from lower half of h1 + VO h0, h1, h0 \ // h0 now has 88 bits (limb 0 and 1) + VLEIG $0, $0, h2 \ // clear upper half of h2 + VESRLG $40, h2, h1 \ // h1 now has upper two bits of result + VLEIB $7, $88, h1 \ // for byte shift (11 bytes) + VSLB h1, h2, h2 \ // shift h2 11 bytes to the left + VO h0, h2, h0 \ // combine h0 with 20 bits from limb 1 + VLEIG $0, $0, h1 \ // clear upper half of h1 + +// if h > 2**130-5 then h -= 2**130-5 +// input: h0, h1 +// temp: t0, t1, t2 +// output: h0 +#define MOD(h0, h1, t0, t1, t2) \ + VZERO t0 \ + VLEIG $1, $5, t0 \ + VACCQ h0, t0, t1 \ + VAQ h0, t0, t0 \ + VONE t2 \ + VLEIG $1, $-4, t2 \ + VAQ t2, t1, t1 \ + VACCQ h1, t1, t1 \ + VONE t2 \ + VAQ t2, t1, t1 \ + VN h0, t1, t2 \ + VNC t0, t1, t1 \ + VO t1, t2, h0 \ + +// func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]key) +TEXT ·poly1305vmsl(SB), $0-32 + // This code processes 6 + up to 4 blocks (32 bytes) per iteration + // using the algorithm described in: + // NEON crypto, Daniel J. Bernstein & Peter Schwabe + // https://cryptojedi.org/papers/neoncrypto-20120320.pdf + // And as moddified for VMSL as described in + // Accelerating Poly1305 Cryptographic Message Authentication on the z14 + // O'Farrell et al, CASCON 2017, p48-55 + // https://ibm.ent.box.com/s/jf9gedj0e9d2vjctfyh186shaztavnht + + LMG out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key + VZERO V0 // c + + // load EX0, EX1 and EX2 + MOVD $·constants<>(SB), R5 + VLM (R5), EX0, EX2 // c + + // setup r + VL (R4), T_0 + MOVD $·keyMask<>(SB), R6 + VL (R6), T_1 + VN T_0, T_1, T_0 + VZERO T_2 // limbs for r + VZERO T_3 + VZERO T_4 + EXPACC2(T_0, T_2, T_3, T_4, T_1, T_5, T_7) + + // T_2, T_3, T_4: [0, r] + + // setup r*20 + VLEIG $0, $0, T_0 + VLEIG $1, $20, T_0 // T_0: [0, 20] + VZERO T_5 + VZERO T_6 + VMSLG T_0, T_3, T_5, T_5 + VMSLG T_0, T_4, T_6, T_6 + + // store r for final block in GR + VLGVG $1, T_2, RSAVE_0 // c + VLGVG $1, T_3, RSAVE_1 // c + VLGVG $1, T_4, RSAVE_2 // c + VLGVG $1, T_5, R5SAVE_1 // c + VLGVG $1, T_6, R5SAVE_2 // c + + // initialize h + VZERO H0_0 + VZERO H1_0 + VZERO H2_0 + VZERO H0_1 + VZERO H1_1 + VZERO H2_1 + + // initialize pointer for reduce constants + MOVD $·reduce<>(SB), R12 + + // calculate r**2 and 20*(r**2) + VZERO R_0 + VZERO R_1 + VZERO R_2 + SQUARE(T_2, T_3, T_4, T_6, R_0, R_1, R_2, T_1, T_5, T_7) + REDUCE2(R_0, R_1, R_2, M0, M1, M2, M3, M4, R5_1, R5_2, M5, T_1) + VZERO R5_1 + VZERO R5_2 + VMSLG T_0, R_1, R5_1, R5_1 + VMSLG T_0, R_2, R5_2, R5_2 + + // skip r**4 calculation if 3 blocks or less + CMPBLE R3, $48, b4 + + // calculate r**4 and 20*(r**4) + VZERO T_8 + VZERO T_9 + VZERO T_10 + SQUARE(R_0, R_1, R_2, R5_2, T_8, T_9, T_10, T_1, T_5, T_7) + REDUCE2(T_8, T_9, T_10, M0, M1, M2, M3, M4, T_2, T_3, M5, T_1) + VZERO T_2 + VZERO T_3 + VMSLG T_0, T_9, T_2, T_2 + VMSLG T_0, T_10, T_3, T_3 + + // put r**2 to the right and r**4 to the left of R_0, R_1, R_2 + VSLDB $8, T_8, T_8, T_8 + VSLDB $8, T_9, T_9, T_9 + VSLDB $8, T_10, T_10, T_10 + VSLDB $8, T_2, T_2, T_2 + VSLDB $8, T_3, T_3, T_3 + + VO T_8, R_0, R_0 + VO T_9, R_1, R_1 + VO T_10, R_2, R_2 + VO T_2, R5_1, R5_1 + VO T_3, R5_2, R5_2 + + CMPBLE R3, $80, load // less than or equal to 5 blocks in message + + // 6(or 5+1) blocks + SUB $81, R3 + VLM (R2), M0, M4 + VLL R3, 80(R2), M5 + ADD $1, R3 + MOVBZ $1, R0 + CMPBGE R3, $16, 2(PC) + VLVGB R3, R0, M5 + MOVD $96(R2), R2 + EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) + EXPACC(M2, M3, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) + VLEIB $2, $1, H2_0 + VLEIB $2, $1, H2_1 + VLEIB $10, $1, H2_0 + VLEIB $10, $1, H2_1 + + VZERO M0 + VZERO M1 + VZERO M2 + VZERO M3 + VZERO T_4 + VZERO T_10 + EXPACC(M4, M5, M0, M1, M2, M3, T_4, T_10, T_0, T_1, T_2, T_3) + VLR T_4, M4 + VLEIB $10, $1, M2 + CMPBLT R3, $16, 2(PC) + VLEIB $10, $1, T_10 + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9) + VMRHG V0, H0_1, H0_0 + VMRHG V0, H1_1, H1_0 + VMRHG V0, H2_1, H2_0 + VMRLG V0, H0_1, H0_1 + VMRLG V0, H1_1, H1_1 + VMRLG V0, H2_1, H2_1 + + SUB $16, R3 + CMPBLE R3, $0, square + +load: + // load EX0, EX1 and EX2 + MOVD $·c<>(SB), R5 + VLM (R5), EX0, EX2 + +loop: + CMPBLE R3, $64, add // b4 // last 4 or less blocks left + + // next 4 full blocks + VLM (R2), M2, M5 + SUB $64, R3 + MOVD $64(R2), R2 + REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, T_0, T_1, T_3, T_4, T_5, T_2, T_7, T_8, T_9) + + // expacc in-lined to create [m2, m3] limbs + VGBM $0x3f3f, T_0 // 44 bit clear mask + VGBM $0x1f1f, T_1 // 40 bit clear mask + VPERM M2, M3, EX0, T_3 + VESRLG $4, T_0, T_0 // 44 bit clear mask ready + VPERM M2, M3, EX1, T_4 + VPERM M2, M3, EX2, T_5 + VN T_0, T_3, T_3 + VESRLG $4, T_4, T_4 + VN T_1, T_5, T_5 + VN T_0, T_4, T_4 + VMRHG H0_1, T_3, H0_0 + VMRHG H1_1, T_4, H1_0 + VMRHG H2_1, T_5, H2_0 + VMRLG H0_1, T_3, H0_1 + VMRLG H1_1, T_4, H1_1 + VMRLG H2_1, T_5, H2_1 + VLEIB $10, $1, H2_0 + VLEIB $10, $1, H2_1 + VPERM M4, M5, EX0, T_3 + VPERM M4, M5, EX1, T_4 + VPERM M4, M5, EX2, T_5 + VN T_0, T_3, T_3 + VESRLG $4, T_4, T_4 + VN T_1, T_5, T_5 + VN T_0, T_4, T_4 + VMRHG V0, T_3, M0 + VMRHG V0, T_4, M1 + VMRHG V0, T_5, M2 + VMRLG V0, T_3, M3 + VMRLG V0, T_4, M4 + VMRLG V0, T_5, M5 + VLEIB $10, $1, M2 + VLEIB $10, $1, M5 + + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + CMPBNE R3, $0, loop + REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) + VMRHG V0, H0_1, H0_0 + VMRHG V0, H1_1, H1_0 + VMRHG V0, H2_1, H2_0 + VMRLG V0, H0_1, H0_1 + VMRLG V0, H1_1, H1_1 + VMRLG V0, H2_1, H2_1 + + // load EX0, EX1, EX2 + MOVD $·constants<>(SB), R5 + VLM (R5), EX0, EX2 + + // sum vectors + VAQ H0_0, H0_1, H0_0 + VAQ H1_0, H1_1, H1_0 + VAQ H2_0, H2_1, H2_0 + + // h may be >= 2*(2**130-5) so we need to reduce it again + // M0...M4 are used as temps here + REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) + +next: // carry h1->h2 + VLEIB $7, $0x28, T_1 + VREPIB $4, T_2 + VGBM $0x003F, T_3 + VESRLG $4, T_3 + + // byte shift + VSRLB T_1, H1_0, T_4 + + // bit shift + VSRL T_2, T_4, T_4 + + // clear h1 carry bits + VN T_3, H1_0, H1_0 + + // add carry + VAQ T_4, H2_0, H2_0 + + // h is now < 2*(2**130-5) + // pack h into h1 (hi) and h0 (lo) + PACK(H0_0, H1_0, H2_0) + + // if h > 2**130-5 then h -= 2**130-5 + MOD(H0_0, H1_0, T_0, T_1, T_2) + + // h += s + MOVD $·bswapMask<>(SB), R5 + VL (R5), T_1 + VL 16(R4), T_0 + VPERM T_0, T_0, T_1, T_0 // reverse bytes (to big) + VAQ T_0, H0_0, H0_0 + VPERM H0_0, H0_0, T_1, H0_0 // reverse bytes (to little) + VST H0_0, (R1) + RET + +add: + // load EX0, EX1, EX2 + MOVD $·constants<>(SB), R5 + VLM (R5), EX0, EX2 + + REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) + VMRHG V0, H0_1, H0_0 + VMRHG V0, H1_1, H1_0 + VMRHG V0, H2_1, H2_0 + VMRLG V0, H0_1, H0_1 + VMRLG V0, H1_1, H1_1 + VMRLG V0, H2_1, H2_1 + CMPBLE R3, $64, b4 + +b4: + CMPBLE R3, $48, b3 // 3 blocks or less + + // 4(3+1) blocks remaining + SUB $49, R3 + VLM (R2), M0, M2 + VLL R3, 48(R2), M3 + ADD $1, R3 + MOVBZ $1, R0 + CMPBEQ R3, $16, 2(PC) + VLVGB R3, R0, M3 + MOVD $64(R2), R2 + EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) + VLEIB $10, $1, H2_0 + VLEIB $10, $1, H2_1 + VZERO M0 + VZERO M1 + VZERO M4 + VZERO M5 + VZERO T_4 + VZERO T_10 + EXPACC(M2, M3, M0, M1, M4, M5, T_4, T_10, T_0, T_1, T_2, T_3) + VLR T_4, M2 + VLEIB $10, $1, M4 + CMPBNE R3, $16, 2(PC) + VLEIB $10, $1, T_10 + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M4, M5, M2, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) + VMRHG V0, H0_1, H0_0 + VMRHG V0, H1_1, H1_0 + VMRHG V0, H2_1, H2_0 + VMRLG V0, H0_1, H0_1 + VMRLG V0, H1_1, H1_1 + VMRLG V0, H2_1, H2_1 + SUB $16, R3 + CMPBLE R3, $0, square // this condition must always hold true! + +b3: + CMPBLE R3, $32, b2 + + // 3 blocks remaining + + // setup [r²,r] + VSLDB $8, R_0, R_0, R_0 + VSLDB $8, R_1, R_1, R_1 + VSLDB $8, R_2, R_2, R_2 + VSLDB $8, R5_1, R5_1, R5_1 + VSLDB $8, R5_2, R5_2, R5_2 + + VLVGG $1, RSAVE_0, R_0 + VLVGG $1, RSAVE_1, R_1 + VLVGG $1, RSAVE_2, R_2 + VLVGG $1, R5SAVE_1, R5_1 + VLVGG $1, R5SAVE_2, R5_2 + + // setup [h0, h1] + VSLDB $8, H0_0, H0_0, H0_0 + VSLDB $8, H1_0, H1_0, H1_0 + VSLDB $8, H2_0, H2_0, H2_0 + VO H0_1, H0_0, H0_0 + VO H1_1, H1_0, H1_0 + VO H2_1, H2_0, H2_0 + VZERO H0_1 + VZERO H1_1 + VZERO H2_1 + + VZERO M0 + VZERO M1 + VZERO M2 + VZERO M3 + VZERO M4 + VZERO M5 + + // H*[r**2, r] + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, T_10, M5) + + SUB $33, R3 + VLM (R2), M0, M1 + VLL R3, 32(R2), M2 + ADD $1, R3 + MOVBZ $1, R0 + CMPBEQ R3, $16, 2(PC) + VLVGB R3, R0, M2 + + // H += m0 + VZERO T_1 + VZERO T_2 + VZERO T_3 + EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6) + VLEIB $10, $1, T_3 + VAG H0_0, T_1, H0_0 + VAG H1_0, T_2, H1_0 + VAG H2_0, T_3, H2_0 + + VZERO M0 + VZERO M3 + VZERO M4 + VZERO M5 + VZERO T_10 + + // (H+m0)*r + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M3, M4, M5, V0, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_10, H0_1, H1_1, H2_1, T_9) + + // H += m1 + VZERO V0 + VZERO T_1 + VZERO T_2 + VZERO T_3 + EXPACC2(M1, T_1, T_2, T_3, T_4, T_5, T_6) + VLEIB $10, $1, T_3 + VAQ H0_0, T_1, H0_0 + VAQ H1_0, T_2, H1_0 + VAQ H2_0, T_3, H2_0 + REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10) + + // [H, m2] * [r**2, r] + EXPACC2(M2, H0_0, H1_0, H2_0, T_1, T_2, T_3) + CMPBNE R3, $16, 2(PC) + VLEIB $10, $1, H2_0 + VZERO M0 + VZERO M1 + VZERO M2 + VZERO M3 + VZERO M4 + VZERO M5 + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, M5, T_10) + SUB $16, R3 + CMPBLE R3, $0, next // this condition must always hold true! + +b2: + CMPBLE R3, $16, b1 + + // 2 blocks remaining + + // setup [r²,r] + VSLDB $8, R_0, R_0, R_0 + VSLDB $8, R_1, R_1, R_1 + VSLDB $8, R_2, R_2, R_2 + VSLDB $8, R5_1, R5_1, R5_1 + VSLDB $8, R5_2, R5_2, R5_2 + + VLVGG $1, RSAVE_0, R_0 + VLVGG $1, RSAVE_1, R_1 + VLVGG $1, RSAVE_2, R_2 + VLVGG $1, R5SAVE_1, R5_1 + VLVGG $1, R5SAVE_2, R5_2 + + // setup [h0, h1] + VSLDB $8, H0_0, H0_0, H0_0 + VSLDB $8, H1_0, H1_0, H1_0 + VSLDB $8, H2_0, H2_0, H2_0 + VO H0_1, H0_0, H0_0 + VO H1_1, H1_0, H1_0 + VO H2_1, H2_0, H2_0 + VZERO H0_1 + VZERO H1_1 + VZERO H2_1 + + VZERO M0 + VZERO M1 + VZERO M2 + VZERO M3 + VZERO M4 + VZERO M5 + + // H*[r**2, r] + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9) + VMRHG V0, H0_1, H0_0 + VMRHG V0, H1_1, H1_0 + VMRHG V0, H2_1, H2_0 + VMRLG V0, H0_1, H0_1 + VMRLG V0, H1_1, H1_1 + VMRLG V0, H2_1, H2_1 + + // move h to the left and 0s at the right + VSLDB $8, H0_0, H0_0, H0_0 + VSLDB $8, H1_0, H1_0, H1_0 + VSLDB $8, H2_0, H2_0, H2_0 + + // get message blocks and append 1 to start + SUB $17, R3 + VL (R2), M0 + VLL R3, 16(R2), M1 + ADD $1, R3 + MOVBZ $1, R0 + CMPBEQ R3, $16, 2(PC) + VLVGB R3, R0, M1 + VZERO T_6 + VZERO T_7 + VZERO T_8 + EXPACC2(M0, T_6, T_7, T_8, T_1, T_2, T_3) + EXPACC2(M1, T_6, T_7, T_8, T_1, T_2, T_3) + VLEIB $2, $1, T_8 + CMPBNE R3, $16, 2(PC) + VLEIB $10, $1, T_8 + + // add [m0, m1] to h + VAG H0_0, T_6, H0_0 + VAG H1_0, T_7, H1_0 + VAG H2_0, T_8, H2_0 + + VZERO M2 + VZERO M3 + VZERO M4 + VZERO M5 + VZERO T_10 + VZERO M0 + + // at this point R_0 .. R5_2 look like [r**2, r] + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M2, M3, M4, M5, T_10, M0, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE2(H0_0, H1_0, H2_0, M2, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10) + SUB $16, R3, R3 + CMPBLE R3, $0, next + +b1: + CMPBLE R3, $0, next + + // 1 block remaining + + // setup [r²,r] + VSLDB $8, R_0, R_0, R_0 + VSLDB $8, R_1, R_1, R_1 + VSLDB $8, R_2, R_2, R_2 + VSLDB $8, R5_1, R5_1, R5_1 + VSLDB $8, R5_2, R5_2, R5_2 + + VLVGG $1, RSAVE_0, R_0 + VLVGG $1, RSAVE_1, R_1 + VLVGG $1, RSAVE_2, R_2 + VLVGG $1, R5SAVE_1, R5_1 + VLVGG $1, R5SAVE_2, R5_2 + + // setup [h0, h1] + VSLDB $8, H0_0, H0_0, H0_0 + VSLDB $8, H1_0, H1_0, H1_0 + VSLDB $8, H2_0, H2_0, H2_0 + VO H0_1, H0_0, H0_0 + VO H1_1, H1_0, H1_0 + VO H2_1, H2_0, H2_0 + VZERO H0_1 + VZERO H1_1 + VZERO H2_1 + + VZERO M0 + VZERO M1 + VZERO M2 + VZERO M3 + VZERO M4 + VZERO M5 + + // H*[r**2, r] + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) + + // set up [0, m0] limbs + SUB $1, R3 + VLL R3, (R2), M0 + ADD $1, R3 + MOVBZ $1, R0 + CMPBEQ R3, $16, 2(PC) + VLVGB R3, R0, M0 + VZERO T_1 + VZERO T_2 + VZERO T_3 + EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6)// limbs: [0, m] + CMPBNE R3, $16, 2(PC) + VLEIB $10, $1, T_3 + + // h+m0 + VAQ H0_0, T_1, H0_0 + VAQ H1_0, T_2, H1_0 + VAQ H2_0, T_3, H2_0 + + VZERO M0 + VZERO M1 + VZERO M2 + VZERO M3 + VZERO M4 + VZERO M5 + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) + + BR next + +square: + // setup [r²,r] + VSLDB $8, R_0, R_0, R_0 + VSLDB $8, R_1, R_1, R_1 + VSLDB $8, R_2, R_2, R_2 + VSLDB $8, R5_1, R5_1, R5_1 + VSLDB $8, R5_2, R5_2, R5_2 + + VLVGG $1, RSAVE_0, R_0 + VLVGG $1, RSAVE_1, R_1 + VLVGG $1, RSAVE_2, R_2 + VLVGG $1, R5SAVE_1, R5_1 + VLVGG $1, R5SAVE_2, R5_2 + + // setup [h0, h1] + VSLDB $8, H0_0, H0_0, H0_0 + VSLDB $8, H1_0, H1_0, H1_0 + VSLDB $8, H2_0, H2_0, H2_0 + VO H0_1, H0_0, H0_0 + VO H1_1, H1_0, H1_0 + VO H2_1, H2_0, H2_0 + VZERO H0_1 + VZERO H1_1 + VZERO H2_1 + + VZERO M0 + VZERO M1 + VZERO M2 + VZERO M3 + VZERO M4 + VZERO M5 + + // (h0*r**2) + (h1*r) + MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) + REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) + BR next + +TEXT ·hasVMSLFacility(SB), NOSPLIT, $24-1 + MOVD $x-24(SP), R1 + XC $24, 0(R1), 0(R1) // clear the storage + MOVD $2, R0 // R0 is the number of double words stored -1 + WORD $0xB2B01000 // STFLE 0(R1) + XOR R0, R0 // reset the value of R0 + MOVBZ z-8(SP), R1 + AND $0x01, R1 + BEQ novmsl + +vectorinstalled: + // check if the vector instruction has been enabled + VLEIB $0, $0xF, V16 + VLGVB $0, V16, R1 + CMPBNE R1, $0xF, novmsl + MOVB $1, ret+0(FP) // have vx + RET + +novmsl: + MOVB $0, ret+0(FP) // no vx + RET diff --git a/vendor/golang.org/x/crypto/ripemd160/ripemd160.go b/vendor/golang.org/x/crypto/ripemd160/ripemd160.go index 6c6e84236ab7..fd97ba1b06b2 100644 --- a/vendor/golang.org/x/crypto/ripemd160/ripemd160.go +++ b/vendor/golang.org/x/crypto/ripemd160/ripemd160.go @@ -5,7 +5,7 @@ // Package ripemd160 implements the RIPEMD-160 hash algorithm. package ripemd160 // import "golang.org/x/crypto/ripemd160" -// RIPEMD-160 is designed by by Hans Dobbertin, Antoon Bosselaers, and Bart +// RIPEMD-160 is designed by Hans Dobbertin, Antoon Bosselaers, and Bart // Preneel with specifications available at: // http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf. diff --git a/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go b/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go index 7bc8e6c485e5..e0edc02f0f30 100644 --- a/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go +++ b/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go @@ -8,6 +8,10 @@ package ripemd160 +import ( + "math/bits" +) + // work buffer indices and roll amounts for one line var _n = [80]uint{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, @@ -59,16 +63,16 @@ func _Block(md *digest, p []byte) int { i := 0 for i < 16 { alpha = a + (b ^ c ^ d) + x[_n[i]] - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 + s := int(_r[i]) + alpha = bits.RotateLeft32(alpha, s) + e + beta = bits.RotateLeft32(c, 10) a, b, c, d, e = e, alpha, b, beta, d // parallel line alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 + s = int(r_[i]) + alpha = bits.RotateLeft32(alpha, s) + ee + beta = bits.RotateLeft32(cc, 10) aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd i++ @@ -77,16 +81,16 @@ func _Block(md *digest, p []byte) int { // round 2 for i < 32 { alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 + s := int(_r[i]) + alpha = bits.RotateLeft32(alpha, s) + e + beta = bits.RotateLeft32(c, 10) a, b, c, d, e = e, alpha, b, beta, d // parallel line alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 + s = int(r_[i]) + alpha = bits.RotateLeft32(alpha, s) + ee + beta = bits.RotateLeft32(cc, 10) aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd i++ @@ -95,16 +99,16 @@ func _Block(md *digest, p []byte) int { // round 3 for i < 48 { alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 + s := int(_r[i]) + alpha = bits.RotateLeft32(alpha, s) + e + beta = bits.RotateLeft32(c, 10) a, b, c, d, e = e, alpha, b, beta, d // parallel line alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 + s = int(r_[i]) + alpha = bits.RotateLeft32(alpha, s) + ee + beta = bits.RotateLeft32(cc, 10) aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd i++ @@ -113,16 +117,16 @@ func _Block(md *digest, p []byte) int { // round 4 for i < 64 { alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 + s := int(_r[i]) + alpha = bits.RotateLeft32(alpha, s) + e + beta = bits.RotateLeft32(c, 10) a, b, c, d, e = e, alpha, b, beta, d // parallel line alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 + s = int(r_[i]) + alpha = bits.RotateLeft32(alpha, s) + ee + beta = bits.RotateLeft32(cc, 10) aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd i++ @@ -131,16 +135,16 @@ func _Block(md *digest, p []byte) int { // round 5 for i < 80 { alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e - s := _r[i] - alpha = (alpha<>(32-s)) + e - beta = c<<10 | c>>22 + s := int(_r[i]) + alpha = bits.RotateLeft32(alpha, s) + e + beta = bits.RotateLeft32(c, 10) a, b, c, d, e = e, alpha, b, beta, d // parallel line alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] - s = r_[i] - alpha = (alpha<>(32-s)) + ee - beta = cc<<10 | cc>>22 + s = int(r_[i]) + alpha = bits.RotateLeft32(alpha, s) + ee + beta = bits.RotateLeft32(cc, 10) aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd i++ diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt.go b/vendor/golang.org/x/crypto/scrypt/scrypt.go index ff28aaef6ff2..3362afd118bc 100644 --- a/vendor/golang.org/x/crypto/scrypt/scrypt.go +++ b/vendor/golang.org/x/crypto/scrypt/scrypt.go @@ -29,7 +29,7 @@ func blockXOR(dst, src []uint32, n int) { } // salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in, -// and puts the result into both both tmp and out. +// and puts the result into both tmp and out. func salsaXOR(tmp *[16]uint32, in, out []uint32) { w0 := tmp[0] ^ in[0] w1 := tmp[1] ^ in[1] @@ -218,7 +218,7 @@ func smix(b []byte, r, N int, v, xy []uint32) { // For example, you can get a derived key for e.g. AES-256 (which needs a // 32-byte key) by doing: // -// dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32) +// dk, err := scrypt.Key([]byte("some password"), salt, 32768, 8, 1, 32) // // The recommended parameters for interactive logins as of 2017 are N=32768, r=8 // and p=1. The parameters N, r, and p should be increased as memory latency and diff --git a/vendor/golang.org/x/crypto/sha3/doc.go b/vendor/golang.org/x/crypto/sha3/doc.go new file mode 100644 index 000000000000..c2fef30afff3 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/doc.go @@ -0,0 +1,66 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package sha3 implements the SHA-3 fixed-output-length hash functions and +// the SHAKE variable-output-length hash functions defined by FIPS-202. +// +// Both types of hash function use the "sponge" construction and the Keccak +// permutation. For a detailed specification see http://keccak.noekeon.org/ +// +// +// Guidance +// +// If you aren't sure what function you need, use SHAKE256 with at least 64 +// bytes of output. The SHAKE instances are faster than the SHA3 instances; +// the latter have to allocate memory to conform to the hash.Hash interface. +// +// If you need a secret-key MAC (message authentication code), prepend the +// secret key to the input, hash with SHAKE256 and read at least 32 bytes of +// output. +// +// +// Security strengths +// +// The SHA3-x (x equals 224, 256, 384, or 512) functions have a security +// strength against preimage attacks of x bits. Since they only produce "x" +// bits of output, their collision-resistance is only "x/2" bits. +// +// The SHAKE-256 and -128 functions have a generic security strength of 256 and +// 128 bits against all attacks, provided that at least 2x bits of their output +// is used. Requesting more than 64 or 32 bytes of output, respectively, does +// not increase the collision-resistance of the SHAKE functions. +// +// +// The sponge construction +// +// A sponge builds a pseudo-random function from a public pseudo-random +// permutation, by applying the permutation to a state of "rate + capacity" +// bytes, but hiding "capacity" of the bytes. +// +// A sponge starts out with a zero state. To hash an input using a sponge, up +// to "rate" bytes of the input are XORed into the sponge's state. The sponge +// is then "full" and the permutation is applied to "empty" it. This process is +// repeated until all the input has been "absorbed". The input is then padded. +// The digest is "squeezed" from the sponge in the same way, except that output +// is copied out instead of input being XORed in. +// +// A sponge is parameterized by its generic security strength, which is equal +// to half its capacity; capacity + rate is equal to the permutation's width. +// Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means +// that the security strength of a sponge instance is equal to (1600 - bitrate) / 2. +// +// +// Recommendations +// +// The SHAKE functions are recommended for most new uses. They can produce +// output of arbitrary length. SHAKE256, with an output length of at least +// 64 bytes, provides 256-bit security against all attacks. The Keccak team +// recommends it for most applications upgrading from SHA2-512. (NIST chose a +// much stronger, but much slower, sponge instance for SHA3-512.) +// +// The SHA-3 functions are "drop-in" replacements for the SHA-2 functions. +// They produce output of the same length, with the same security strengths +// against all attacks. This means, in particular, that SHA3-256 only has +// 128-bit collision resistance, because its output length is 32 bytes. +package sha3 // import "golang.org/x/crypto/sha3" diff --git a/vendor/golang.org/x/crypto/sha3/hashes.go b/vendor/golang.org/x/crypto/sha3/hashes.go new file mode 100644 index 000000000000..0d8043fd2a17 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/hashes.go @@ -0,0 +1,97 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sha3 + +// This file provides functions for creating instances of the SHA-3 +// and SHAKE hash functions, as well as utility functions for hashing +// bytes. + +import ( + "hash" +) + +// New224 creates a new SHA3-224 hash. +// Its generic security strength is 224 bits against preimage attacks, +// and 112 bits against collision attacks. +func New224() hash.Hash { + if h := new224Asm(); h != nil { + return h + } + return &state{rate: 144, outputLen: 28, dsbyte: 0x06} +} + +// New256 creates a new SHA3-256 hash. +// Its generic security strength is 256 bits against preimage attacks, +// and 128 bits against collision attacks. +func New256() hash.Hash { + if h := new256Asm(); h != nil { + return h + } + return &state{rate: 136, outputLen: 32, dsbyte: 0x06} +} + +// New384 creates a new SHA3-384 hash. +// Its generic security strength is 384 bits against preimage attacks, +// and 192 bits against collision attacks. +func New384() hash.Hash { + if h := new384Asm(); h != nil { + return h + } + return &state{rate: 104, outputLen: 48, dsbyte: 0x06} +} + +// New512 creates a new SHA3-512 hash. +// Its generic security strength is 512 bits against preimage attacks, +// and 256 bits against collision attacks. +func New512() hash.Hash { + if h := new512Asm(); h != nil { + return h + } + return &state{rate: 72, outputLen: 64, dsbyte: 0x06} +} + +// NewLegacyKeccak256 creates a new Keccak-256 hash. +// +// Only use this function if you require compatibility with an existing cryptosystem +// that uses non-standard padding. All other users should use New256 instead. +func NewLegacyKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} } + +// NewLegacyKeccak512 creates a new Keccak-512 hash. +// +// Only use this function if you require compatibility with an existing cryptosystem +// that uses non-standard padding. All other users should use New512 instead. +func NewLegacyKeccak512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x01} } + +// Sum224 returns the SHA3-224 digest of the data. +func Sum224(data []byte) (digest [28]byte) { + h := New224() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum256 returns the SHA3-256 digest of the data. +func Sum256(data []byte) (digest [32]byte) { + h := New256() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum384 returns the SHA3-384 digest of the data. +func Sum384(data []byte) (digest [48]byte) { + h := New384() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum512 returns the SHA3-512 digest of the data. +func Sum512(data []byte) (digest [64]byte) { + h := New512() + h.Write(data) + h.Sum(digest[:0]) + return +} diff --git a/vendor/golang.org/x/crypto/sha3/hashes_generic.go b/vendor/golang.org/x/crypto/sha3/hashes_generic.go new file mode 100644 index 000000000000..c4ff3f6e66da --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/hashes_generic.go @@ -0,0 +1,27 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//+build gccgo appengine !s390x + +package sha3 + +import ( + "hash" +) + +// new224Asm returns an assembly implementation of SHA3-224 if available, +// otherwise it returns nil. +func new224Asm() hash.Hash { return nil } + +// new256Asm returns an assembly implementation of SHA3-256 if available, +// otherwise it returns nil. +func new256Asm() hash.Hash { return nil } + +// new384Asm returns an assembly implementation of SHA3-384 if available, +// otherwise it returns nil. +func new384Asm() hash.Hash { return nil } + +// new512Asm returns an assembly implementation of SHA3-512 if available, +// otherwise it returns nil. +func new512Asm() hash.Hash { return nil } diff --git a/crypto/sha3/keccakf.go b/vendor/golang.org/x/crypto/sha3/keccakf.go similarity index 100% rename from crypto/sha3/keccakf.go rename to vendor/golang.org/x/crypto/sha3/keccakf.go diff --git a/crypto/sha3/keccakf_amd64.go b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go similarity index 88% rename from crypto/sha3/keccakf_amd64.go rename to vendor/golang.org/x/crypto/sha3/keccakf_amd64.go index de035c550f40..788679585027 100644 --- a/crypto/sha3/keccakf_amd64.go +++ b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go @@ -10,4 +10,4 @@ package sha3 //go:noescape -func keccakF1600(state *[25]uint64) +func keccakF1600(a *[25]uint64) diff --git a/crypto/sha3/keccakf_amd64.s b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s similarity index 100% rename from crypto/sha3/keccakf_amd64.s rename to vendor/golang.org/x/crypto/sha3/keccakf_amd64.s diff --git a/crypto/sha3/register.go b/vendor/golang.org/x/crypto/sha3/register.go similarity index 100% rename from crypto/sha3/register.go rename to vendor/golang.org/x/crypto/sha3/register.go diff --git a/crypto/sha3/sha3.go b/vendor/golang.org/x/crypto/sha3/sha3.go similarity index 100% rename from crypto/sha3/sha3.go rename to vendor/golang.org/x/crypto/sha3/sha3.go diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.go b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go new file mode 100644 index 000000000000..f1fb79cc391e --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go @@ -0,0 +1,289 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//+build !gccgo,!appengine + +package sha3 + +// This file contains code for using the 'compute intermediate +// message digest' (KIMD) and 'compute last message digest' (KLMD) +// instructions to compute SHA-3 and SHAKE hashes on IBM Z. + +import ( + "hash" +) + +// codes represent 7-bit KIMD/KLMD function codes as defined in +// the Principles of Operation. +type code uint64 + +const ( + // function codes for KIMD/KLMD + sha3_224 code = 32 + sha3_256 = 33 + sha3_384 = 34 + sha3_512 = 35 + shake_128 = 36 + shake_256 = 37 + nopad = 0x100 +) + +// hasMSA6 reports whether the machine supports the SHA-3 and SHAKE function +// codes, as defined in message-security-assist extension 6. +func hasMSA6() bool + +// hasAsm caches the result of hasMSA6 (which might be expensive to call). +var hasAsm = hasMSA6() + +// kimd is a wrapper for the 'compute intermediate message digest' instruction. +// src must be a multiple of the rate for the given function code. +//go:noescape +func kimd(function code, chain *[200]byte, src []byte) + +// klmd is a wrapper for the 'compute last message digest' instruction. +// src padding is handled by the instruction. +//go:noescape +func klmd(function code, chain *[200]byte, dst, src []byte) + +type asmState struct { + a [200]byte // 1600 bit state + buf []byte // care must be taken to ensure cap(buf) is a multiple of rate + rate int // equivalent to block size + storage [3072]byte // underlying storage for buf + outputLen int // output length if fixed, 0 if not + function code // KIMD/KLMD function code + state spongeDirection // whether the sponge is absorbing or squeezing +} + +func newAsmState(function code) *asmState { + var s asmState + s.function = function + switch function { + case sha3_224: + s.rate = 144 + s.outputLen = 28 + case sha3_256: + s.rate = 136 + s.outputLen = 32 + case sha3_384: + s.rate = 104 + s.outputLen = 48 + case sha3_512: + s.rate = 72 + s.outputLen = 64 + case shake_128: + s.rate = 168 + case shake_256: + s.rate = 136 + default: + panic("sha3: unrecognized function code") + } + + // limit s.buf size to a multiple of s.rate + s.resetBuf() + return &s +} + +func (s *asmState) clone() *asmState { + c := *s + c.buf = c.storage[:len(s.buf):cap(s.buf)] + return &c +} + +// copyIntoBuf copies b into buf. It will panic if there is not enough space to +// store all of b. +func (s *asmState) copyIntoBuf(b []byte) { + bufLen := len(s.buf) + s.buf = s.buf[:len(s.buf)+len(b)] + copy(s.buf[bufLen:], b) +} + +// resetBuf points buf at storage, sets the length to 0 and sets cap to be a +// multiple of the rate. +func (s *asmState) resetBuf() { + max := (cap(s.storage) / s.rate) * s.rate + s.buf = s.storage[:0:max] +} + +// Write (via the embedded io.Writer interface) adds more data to the running hash. +// It never returns an error. +func (s *asmState) Write(b []byte) (int, error) { + if s.state != spongeAbsorbing { + panic("sha3: write to sponge after read") + } + length := len(b) + for len(b) > 0 { + if len(s.buf) == 0 && len(b) >= cap(s.buf) { + // Hash the data directly and push any remaining bytes + // into the buffer. + remainder := len(s.buf) % s.rate + kimd(s.function, &s.a, b[:len(b)-remainder]) + if remainder != 0 { + s.copyIntoBuf(b[len(b)-remainder:]) + } + return length, nil + } + + if len(s.buf) == cap(s.buf) { + // flush the buffer + kimd(s.function, &s.a, s.buf) + s.buf = s.buf[:0] + } + + // copy as much as we can into the buffer + n := len(b) + if len(b) > cap(s.buf)-len(s.buf) { + n = cap(s.buf) - len(s.buf) + } + s.copyIntoBuf(b[:n]) + b = b[n:] + } + return length, nil +} + +// Read squeezes an arbitrary number of bytes from the sponge. +func (s *asmState) Read(out []byte) (n int, err error) { + n = len(out) + + // need to pad if we were absorbing + if s.state == spongeAbsorbing { + s.state = spongeSqueezing + + // write hash directly into out if possible + if len(out)%s.rate == 0 { + klmd(s.function, &s.a, out, s.buf) // len(out) may be 0 + s.buf = s.buf[:0] + return + } + + // write hash into buffer + max := cap(s.buf) + if max > len(out) { + max = (len(out)/s.rate)*s.rate + s.rate + } + klmd(s.function, &s.a, s.buf[:max], s.buf) + s.buf = s.buf[:max] + } + + for len(out) > 0 { + // flush the buffer + if len(s.buf) != 0 { + c := copy(out, s.buf) + out = out[c:] + s.buf = s.buf[c:] + continue + } + + // write hash directly into out if possible + if len(out)%s.rate == 0 { + klmd(s.function|nopad, &s.a, out, nil) + return + } + + // write hash into buffer + s.resetBuf() + if cap(s.buf) > len(out) { + s.buf = s.buf[:(len(out)/s.rate)*s.rate+s.rate] + } + klmd(s.function|nopad, &s.a, s.buf, nil) + } + return +} + +// Sum appends the current hash to b and returns the resulting slice. +// It does not change the underlying hash state. +func (s *asmState) Sum(b []byte) []byte { + if s.outputLen == 0 { + panic("sha3: cannot call Sum on SHAKE functions") + } + + // Copy the state to preserve the original. + a := s.a + + // Hash the buffer. Note that we don't clear it because we + // aren't updating the state. + klmd(s.function, &a, nil, s.buf) + return append(b, a[:s.outputLen]...) +} + +// Reset resets the Hash to its initial state. +func (s *asmState) Reset() { + for i := range s.a { + s.a[i] = 0 + } + s.resetBuf() + s.state = spongeAbsorbing +} + +// Size returns the number of bytes Sum will return. +func (s *asmState) Size() int { + return s.outputLen +} + +// BlockSize returns the hash's underlying block size. +// The Write method must be able to accept any amount +// of data, but it may operate more efficiently if all writes +// are a multiple of the block size. +func (s *asmState) BlockSize() int { + return s.rate +} + +// Clone returns a copy of the ShakeHash in its current state. +func (s *asmState) Clone() ShakeHash { + return s.clone() +} + +// new224Asm returns an assembly implementation of SHA3-224 if available, +// otherwise it returns nil. +func new224Asm() hash.Hash { + if hasAsm { + return newAsmState(sha3_224) + } + return nil +} + +// new256Asm returns an assembly implementation of SHA3-256 if available, +// otherwise it returns nil. +func new256Asm() hash.Hash { + if hasAsm { + return newAsmState(sha3_256) + } + return nil +} + +// new384Asm returns an assembly implementation of SHA3-384 if available, +// otherwise it returns nil. +func new384Asm() hash.Hash { + if hasAsm { + return newAsmState(sha3_384) + } + return nil +} + +// new512Asm returns an assembly implementation of SHA3-512 if available, +// otherwise it returns nil. +func new512Asm() hash.Hash { + if hasAsm { + return newAsmState(sha3_512) + } + return nil +} + +// newShake128Asm returns an assembly implementation of SHAKE-128 if available, +// otherwise it returns nil. +func newShake128Asm() ShakeHash { + if hasAsm { + return newAsmState(shake_128) + } + return nil +} + +// newShake256Asm returns an assembly implementation of SHAKE-256 if available, +// otherwise it returns nil. +func newShake256Asm() ShakeHash { + if hasAsm { + return newAsmState(shake_256) + } + return nil +} diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.s b/vendor/golang.org/x/crypto/sha3/sha3_s390x.s new file mode 100644 index 000000000000..20978fc7138e --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/sha3_s390x.s @@ -0,0 +1,49 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//+build !gccgo,!appengine + +#include "textflag.h" + +TEXT ·hasMSA6(SB), NOSPLIT, $16-1 + MOVD $0, R0 // KIMD-Query function code + MOVD $tmp-16(SP), R1 // parameter block + XC $16, (R1), (R1) // clear the parameter block + WORD $0xB93E0002 // KIMD --, -- + WORD $0x91FC1004 // TM 4(R1), 0xFC (test bits [32-37]) + BVS yes + +no: + MOVB $0, ret+0(FP) + RET + +yes: + MOVB $1, ret+0(FP) + RET + +// func kimd(function code, params *[200]byte, src []byte) +TEXT ·kimd(SB), NOFRAME|NOSPLIT, $0-40 + MOVD function+0(FP), R0 + MOVD params+8(FP), R1 + LMG src+16(FP), R2, R3 // R2=base, R3=len + +continue: + WORD $0xB93E0002 // KIMD --, R2 + BVS continue // continue if interrupted + MOVD $0, R0 // reset R0 for pre-go1.8 compilers + RET + +// func klmd(function code, params *[200]byte, dst, src []byte) +TEXT ·klmd(SB), NOFRAME|NOSPLIT, $0-64 + // TODO: SHAKE support + MOVD function+0(FP), R0 + MOVD params+8(FP), R1 + LMG dst+16(FP), R2, R3 // R2=base, R3=len + LMG src+40(FP), R4, R5 // R4=base, R5=len + +continue: + WORD $0xB93F0024 // KLMD R2, R4 + BVS continue // continue if interrupted + MOVD $0, R0 // reset R0 for pre-go1.8 compilers + RET diff --git a/crypto/sha3/shake.go b/vendor/golang.org/x/crypto/sha3/shake.go similarity index 83% rename from crypto/sha3/shake.go rename to vendor/golang.org/x/crypto/sha3/shake.go index 841f9860f031..97c9b0624a34 100644 --- a/crypto/sha3/shake.go +++ b/vendor/golang.org/x/crypto/sha3/shake.go @@ -38,12 +38,22 @@ func (d *state) Clone() ShakeHash { // NewShake128 creates a new SHAKE128 variable-output-length ShakeHash. // Its generic security strength is 128 bits against all attacks if at // least 32 bytes of its output are used. -func NewShake128() ShakeHash { return &state{rate: 168, dsbyte: 0x1f} } +func NewShake128() ShakeHash { + if h := newShake128Asm(); h != nil { + return h + } + return &state{rate: 168, dsbyte: 0x1f} +} -// NewShake256 creates a new SHAKE128 variable-output-length ShakeHash. +// NewShake256 creates a new SHAKE256 variable-output-length ShakeHash. // Its generic security strength is 256 bits against all attacks if // at least 64 bytes of its output are used. -func NewShake256() ShakeHash { return &state{rate: 136, dsbyte: 0x1f} } +func NewShake256() ShakeHash { + if h := newShake256Asm(); h != nil { + return h + } + return &state{rate: 136, dsbyte: 0x1f} +} // ShakeSum128 writes an arbitrary-length digest of data into hash. func ShakeSum128(hash, data []byte) { diff --git a/vendor/golang.org/x/crypto/sha3/shake_generic.go b/vendor/golang.org/x/crypto/sha3/shake_generic.go new file mode 100644 index 000000000000..73d0c90bf53c --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/shake_generic.go @@ -0,0 +1,19 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//+build gccgo appengine !s390x + +package sha3 + +// newShake128Asm returns an assembly implementation of SHAKE-128 if available, +// otherwise it returns nil. +func newShake128Asm() ShakeHash { + return nil +} + +// newShake256Asm returns an assembly implementation of SHAKE-256 if available, +// otherwise it returns nil. +func newShake256Asm() ShakeHash { + return nil +} diff --git a/crypto/sha3/xor.go b/vendor/golang.org/x/crypto/sha3/xor.go similarity index 100% rename from crypto/sha3/xor.go rename to vendor/golang.org/x/crypto/sha3/xor.go diff --git a/crypto/sha3/xor_generic.go b/vendor/golang.org/x/crypto/sha3/xor_generic.go similarity index 100% rename from crypto/sha3/xor_generic.go rename to vendor/golang.org/x/crypto/sha3/xor_generic.go diff --git a/crypto/sha3/xor_unaligned.go b/vendor/golang.org/x/crypto/sha3/xor_unaligned.go similarity index 100% rename from crypto/sha3/xor_unaligned.go rename to vendor/golang.org/x/crypto/sha3/xor_unaligned.go diff --git a/vendor/golang.org/x/crypto/ssh/certs.go b/vendor/golang.org/x/crypto/ssh/certs.go index b1f02207819f..00ed9923e784 100644 --- a/vendor/golang.org/x/crypto/ssh/certs.go +++ b/vendor/golang.org/x/crypto/ssh/certs.go @@ -44,7 +44,9 @@ type Signature struct { const CertTimeInfinity = 1<<64 - 1 // An Certificate represents an OpenSSH certificate as defined in -// [PROTOCOL.certkeys]?rev=1.8. +// [PROTOCOL.certkeys]?rev=1.8. The Certificate type implements the +// PublicKey interface, so it can be unmarshaled using +// ParsePublicKey. type Certificate struct { Nonce []byte Key PublicKey @@ -220,6 +222,11 @@ type openSSHCertSigner struct { signer Signer } +type algorithmOpenSSHCertSigner struct { + *openSSHCertSigner + algorithmSigner AlgorithmSigner +} + // NewCertSigner returns a Signer that signs with the given Certificate, whose // private key is held by signer. It returns an error if the public key in cert // doesn't match the key used by signer. @@ -228,7 +235,12 @@ func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) { return nil, errors.New("ssh: signer and cert have different public key") } - return &openSSHCertSigner{cert, signer}, nil + if algorithmSigner, ok := signer.(AlgorithmSigner); ok { + return &algorithmOpenSSHCertSigner{ + &openSSHCertSigner{cert, signer}, algorithmSigner}, nil + } else { + return &openSSHCertSigner{cert, signer}, nil + } } func (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { @@ -239,6 +251,10 @@ func (s *openSSHCertSigner) PublicKey() PublicKey { return s.pub } +func (s *algorithmOpenSSHCertSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { + return s.algorithmSigner.SignWithAlgorithm(rand, data, algorithm) +} + const sourceAddressCriticalOption = "source-address" // CertChecker does the work of verifying a certificate. Its methods @@ -340,10 +356,10 @@ func (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permis // the signature of the certificate. func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { if c.IsRevoked != nil && c.IsRevoked(cert) { - return fmt.Errorf("ssh: certicate serial %d revoked", cert.Serial) + return fmt.Errorf("ssh: certificate serial %d revoked", cert.Serial) } - for opt, _ := range cert.CriticalOptions { + for opt := range cert.CriticalOptions { // sourceAddressCriticalOption will be enforced by // serverAuthenticate if opt == sourceAddressCriticalOption { diff --git a/vendor/golang.org/x/crypto/ssh/channel.go b/vendor/golang.org/x/crypto/ssh/channel.go index 195530ea0da2..c0834c00dfee 100644 --- a/vendor/golang.org/x/crypto/ssh/channel.go +++ b/vendor/golang.org/x/crypto/ssh/channel.go @@ -205,32 +205,32 @@ type channel struct { // writePacket sends a packet. If the packet is a channel close, it updates // sentClose. This method takes the lock c.writeMu. -func (c *channel) writePacket(packet []byte) error { - c.writeMu.Lock() - if c.sentClose { - c.writeMu.Unlock() +func (ch *channel) writePacket(packet []byte) error { + ch.writeMu.Lock() + if ch.sentClose { + ch.writeMu.Unlock() return io.EOF } - c.sentClose = (packet[0] == msgChannelClose) - err := c.mux.conn.writePacket(packet) - c.writeMu.Unlock() + ch.sentClose = (packet[0] == msgChannelClose) + err := ch.mux.conn.writePacket(packet) + ch.writeMu.Unlock() return err } -func (c *channel) sendMessage(msg interface{}) error { +func (ch *channel) sendMessage(msg interface{}) error { if debugMux { - log.Printf("send(%d): %#v", c.mux.chanList.offset, msg) + log.Printf("send(%d): %#v", ch.mux.chanList.offset, msg) } p := Marshal(msg) - binary.BigEndian.PutUint32(p[1:], c.remoteId) - return c.writePacket(p) + binary.BigEndian.PutUint32(p[1:], ch.remoteId) + return ch.writePacket(p) } // WriteExtended writes data to a specific extended stream. These streams are // used, for example, for stderr. -func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { - if c.sentEOF { +func (ch *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { + if ch.sentEOF { return 0, io.EOF } // 1 byte message type, 4 bytes remoteId, 4 bytes data length @@ -241,16 +241,16 @@ func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err er opCode = msgChannelExtendedData } - c.writeMu.Lock() - packet := c.packetPool[extendedCode] + ch.writeMu.Lock() + packet := ch.packetPool[extendedCode] // We don't remove the buffer from packetPool, so // WriteExtended calls from different goroutines will be // flagged as errors by the race detector. - c.writeMu.Unlock() + ch.writeMu.Unlock() for len(data) > 0 { - space := min(c.maxRemotePayload, len(data)) - if space, err = c.remoteWin.reserve(space); err != nil { + space := min(ch.maxRemotePayload, len(data)) + if space, err = ch.remoteWin.reserve(space); err != nil { return n, err } if want := headerLength + space; uint32(cap(packet)) < want { @@ -262,13 +262,13 @@ func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err er todo := data[:space] packet[0] = opCode - binary.BigEndian.PutUint32(packet[1:], c.remoteId) + binary.BigEndian.PutUint32(packet[1:], ch.remoteId) if extendedCode > 0 { binary.BigEndian.PutUint32(packet[5:], uint32(extendedCode)) } binary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo))) copy(packet[headerLength:], todo) - if err = c.writePacket(packet); err != nil { + if err = ch.writePacket(packet); err != nil { return n, err } @@ -276,14 +276,14 @@ func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err er data = data[len(todo):] } - c.writeMu.Lock() - c.packetPool[extendedCode] = packet - c.writeMu.Unlock() + ch.writeMu.Lock() + ch.packetPool[extendedCode] = packet + ch.writeMu.Unlock() return n, err } -func (c *channel) handleData(packet []byte) error { +func (ch *channel) handleData(packet []byte) error { headerLen := 9 isExtendedData := packet[0] == msgChannelExtendedData if isExtendedData { @@ -303,7 +303,7 @@ func (c *channel) handleData(packet []byte) error { if length == 0 { return nil } - if length > c.maxIncomingPayload { + if length > ch.maxIncomingPayload { // TODO(hanwen): should send Disconnect? return errors.New("ssh: incoming packet exceeds maximum payload size") } @@ -313,21 +313,21 @@ func (c *channel) handleData(packet []byte) error { return errors.New("ssh: wrong packet length") } - c.windowMu.Lock() - if c.myWindow < length { - c.windowMu.Unlock() + ch.windowMu.Lock() + if ch.myWindow < length { + ch.windowMu.Unlock() // TODO(hanwen): should send Disconnect with reason? return errors.New("ssh: remote side wrote too much") } - c.myWindow -= length - c.windowMu.Unlock() + ch.myWindow -= length + ch.windowMu.Unlock() if extended == 1 { - c.extPending.write(data) + ch.extPending.write(data) } else if extended > 0 { // discard other extended data. } else { - c.pending.write(data) + ch.pending.write(data) } return nil } @@ -384,31 +384,31 @@ func (c *channel) close() { // responseMessageReceived is called when a success or failure message is // received on a channel to check that such a message is reasonable for the // given channel. -func (c *channel) responseMessageReceived() error { - if c.direction == channelInbound { +func (ch *channel) responseMessageReceived() error { + if ch.direction == channelInbound { return errors.New("ssh: channel response message received on inbound channel") } - if c.decided { + if ch.decided { return errors.New("ssh: duplicate response received for channel") } - c.decided = true + ch.decided = true return nil } -func (c *channel) handlePacket(packet []byte) error { +func (ch *channel) handlePacket(packet []byte) error { switch packet[0] { case msgChannelData, msgChannelExtendedData: - return c.handleData(packet) + return ch.handleData(packet) case msgChannelClose: - c.sendMessage(channelCloseMsg{PeersId: c.remoteId}) - c.mux.chanList.remove(c.localId) - c.close() + ch.sendMessage(channelCloseMsg{PeersID: ch.remoteId}) + ch.mux.chanList.remove(ch.localId) + ch.close() return nil case msgChannelEOF: // RFC 4254 is mute on how EOF affects dataExt messages but // it is logical to signal EOF at the same time. - c.extPending.eof() - c.pending.eof() + ch.extPending.eof() + ch.pending.eof() return nil } @@ -419,24 +419,24 @@ func (c *channel) handlePacket(packet []byte) error { switch msg := decoded.(type) { case *channelOpenFailureMsg: - if err := c.responseMessageReceived(); err != nil { + if err := ch.responseMessageReceived(); err != nil { return err } - c.mux.chanList.remove(msg.PeersId) - c.msg <- msg + ch.mux.chanList.remove(msg.PeersID) + ch.msg <- msg case *channelOpenConfirmMsg: - if err := c.responseMessageReceived(); err != nil { + if err := ch.responseMessageReceived(); err != nil { return err } if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { return fmt.Errorf("ssh: invalid MaxPacketSize %d from peer", msg.MaxPacketSize) } - c.remoteId = msg.MyId - c.maxRemotePayload = msg.MaxPacketSize - c.remoteWin.add(msg.MyWindow) - c.msg <- msg + ch.remoteId = msg.MyID + ch.maxRemotePayload = msg.MaxPacketSize + ch.remoteWin.add(msg.MyWindow) + ch.msg <- msg case *windowAdjustMsg: - if !c.remoteWin.add(msg.AdditionalBytes) { + if !ch.remoteWin.add(msg.AdditionalBytes) { return fmt.Errorf("ssh: invalid window update for %d bytes", msg.AdditionalBytes) } case *channelRequestMsg: @@ -444,12 +444,12 @@ func (c *channel) handlePacket(packet []byte) error { Type: msg.Request, WantReply: msg.WantReply, Payload: msg.RequestSpecificData, - ch: c, + ch: ch, } - c.incomingRequests <- &req + ch.incomingRequests <- &req default: - c.msg <- msg + ch.msg <- msg } return nil } @@ -488,23 +488,23 @@ func (e *extChannel) Read(data []byte) (n int, err error) { return e.ch.ReadExtended(data, e.code) } -func (c *channel) Accept() (Channel, <-chan *Request, error) { - if c.decided { +func (ch *channel) Accept() (Channel, <-chan *Request, error) { + if ch.decided { return nil, nil, errDecidedAlready } - c.maxIncomingPayload = channelMaxPacket + ch.maxIncomingPayload = channelMaxPacket confirm := channelOpenConfirmMsg{ - PeersId: c.remoteId, - MyId: c.localId, - MyWindow: c.myWindow, - MaxPacketSize: c.maxIncomingPayload, + PeersID: ch.remoteId, + MyID: ch.localId, + MyWindow: ch.myWindow, + MaxPacketSize: ch.maxIncomingPayload, } - c.decided = true - if err := c.sendMessage(confirm); err != nil { + ch.decided = true + if err := ch.sendMessage(confirm); err != nil { return nil, nil, err } - return c, c.incomingRequests, nil + return ch, ch.incomingRequests, nil } func (ch *channel) Reject(reason RejectionReason, message string) error { @@ -512,7 +512,7 @@ func (ch *channel) Reject(reason RejectionReason, message string) error { return errDecidedAlready } reject := channelOpenFailureMsg{ - PeersId: ch.remoteId, + PeersID: ch.remoteId, Reason: reason, Message: message, Language: "en", @@ -541,7 +541,7 @@ func (ch *channel) CloseWrite() error { } ch.sentEOF = true return ch.sendMessage(channelEOFMsg{ - PeersId: ch.remoteId}) + PeersID: ch.remoteId}) } func (ch *channel) Close() error { @@ -550,7 +550,7 @@ func (ch *channel) Close() error { } return ch.sendMessage(channelCloseMsg{ - PeersId: ch.remoteId}) + PeersID: ch.remoteId}) } // Extended returns an io.ReadWriter that sends and receives data on the given, @@ -577,7 +577,7 @@ func (ch *channel) SendRequest(name string, wantReply bool, payload []byte) (boo } msg := channelRequestMsg{ - PeersId: ch.remoteId, + PeersID: ch.remoteId, Request: name, WantReply: wantReply, RequestSpecificData: payload, @@ -614,11 +614,11 @@ func (ch *channel) ackRequest(ok bool) error { var msg interface{} if !ok { msg = channelRequestFailureMsg{ - PeersId: ch.remoteId, + PeersID: ch.remoteId, } } else { msg = channelRequestSuccessMsg{ - PeersId: ch.remoteId, + PeersID: ch.remoteId, } } return ch.sendMessage(msg) diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go index aed2b1f017fb..67b012610594 100644 --- a/vendor/golang.org/x/crypto/ssh/cipher.go +++ b/vendor/golang.org/x/crypto/ssh/cipher.go @@ -16,6 +16,10 @@ import ( "hash" "io" "io/ioutil" + "math/bits" + + "golang.org/x/crypto/internal/chacha20" + "golang.org/x/crypto/poly1305" ) const ( @@ -53,78 +57,78 @@ func newRC4(key, iv []byte) (cipher.Stream, error) { return rc4.NewCipher(key) } -type streamCipherMode struct { - keySize int - ivSize int - skip int - createFunc func(key, iv []byte) (cipher.Stream, error) +type cipherMode struct { + keySize int + ivSize int + create func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) } -func (c *streamCipherMode) createStream(key, iv []byte) (cipher.Stream, error) { - if len(key) < c.keySize { - panic("ssh: key length too small for cipher") - } - if len(iv) < c.ivSize { - panic("ssh: iv too small for cipher") - } - - stream, err := c.createFunc(key[:c.keySize], iv[:c.ivSize]) - if err != nil { - return nil, err - } +func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream, error)) func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + return func(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + stream, err := createFunc(key, iv) + if err != nil { + return nil, err + } - var streamDump []byte - if c.skip > 0 { - streamDump = make([]byte, 512) - } + var streamDump []byte + if skip > 0 { + streamDump = make([]byte, 512) + } - for remainingToDump := c.skip; remainingToDump > 0; { - dumpThisTime := remainingToDump - if dumpThisTime > len(streamDump) { - dumpThisTime = len(streamDump) + for remainingToDump := skip; remainingToDump > 0; { + dumpThisTime := remainingToDump + if dumpThisTime > len(streamDump) { + dumpThisTime = len(streamDump) + } + stream.XORKeyStream(streamDump[:dumpThisTime], streamDump[:dumpThisTime]) + remainingToDump -= dumpThisTime } - stream.XORKeyStream(streamDump[:dumpThisTime], streamDump[:dumpThisTime]) - remainingToDump -= dumpThisTime - } - return stream, nil + mac := macModes[algs.MAC].new(macKey) + return &streamPacketCipher{ + mac: mac, + etm: macModes[algs.MAC].etm, + macResult: make([]byte, mac.Size()), + cipher: stream, + }, nil + } } // cipherModes documents properties of supported ciphers. Ciphers not included // are not supported and will not be negotiated, even if explicitly requested in // ClientConfig.Crypto.Ciphers. -var cipherModes = map[string]*streamCipherMode{ +var cipherModes = map[string]*cipherMode{ // Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms // are defined in the order specified in the RFC. - "aes128-ctr": {16, aes.BlockSize, 0, newAESCTR}, - "aes192-ctr": {24, aes.BlockSize, 0, newAESCTR}, - "aes256-ctr": {32, aes.BlockSize, 0, newAESCTR}, + "aes128-ctr": {16, aes.BlockSize, streamCipherMode(0, newAESCTR)}, + "aes192-ctr": {24, aes.BlockSize, streamCipherMode(0, newAESCTR)}, + "aes256-ctr": {32, aes.BlockSize, streamCipherMode(0, newAESCTR)}, // Ciphers from RFC4345, which introduces security-improved arcfour ciphers. // They are defined in the order specified in the RFC. - "arcfour128": {16, 0, 1536, newRC4}, - "arcfour256": {32, 0, 1536, newRC4}, + "arcfour128": {16, 0, streamCipherMode(1536, newRC4)}, + "arcfour256": {32, 0, streamCipherMode(1536, newRC4)}, // Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol. // Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and // RC4) has problems with weak keys, and should be used with caution." // RFC4345 introduces improved versions of Arcfour. - "arcfour": {16, 0, 0, newRC4}, + "arcfour": {16, 0, streamCipherMode(0, newRC4)}, - // AES-GCM is not a stream cipher, so it is constructed with a - // special case. If we add any more non-stream ciphers, we - // should invest a cleaner way to do this. - gcmCipherID: {16, 12, 0, nil}, + // AEAD ciphers + gcmCipherID: {16, 12, newGCMCipher}, + chacha20Poly1305ID: {64, 0, newChaCha20Cipher}, // CBC mode is insecure and so is not included in the default config. // (See http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf). If absolutely // needed, it's possible to specify a custom Config to enable it. // You should expect that an active attacker can recover plaintext if // you do. - aes128cbcID: {16, aes.BlockSize, 0, nil}, + aes128cbcID: {16, aes.BlockSize, newAESCBCCipher}, - // 3des-cbc is insecure and is disabled by default. - tripledescbcID: {24, des.BlockSize, 0, nil}, + // 3des-cbc is insecure and is not included in the default + // config. + tripledescbcID: {24, des.BlockSize, newTripleDESCBCCipher}, } // prefixLen is the length of the packet prefix that contains the packet length @@ -304,7 +308,7 @@ type gcmCipher struct { buf []byte } -func newGCMCipher(iv, key []byte) (packetCipher, error) { +func newGCMCipher(key, iv, unusedMacKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { c, err := aes.NewCipher(key) if err != nil { return nil, err @@ -372,7 +376,7 @@ func (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { } length := binary.BigEndian.Uint32(c.prefix[:]) if length > maxPacket { - return nil, errors.New("ssh: max packet length exceeded.") + return nil, errors.New("ssh: max packet length exceeded") } if cap(c.buf) < int(length+gcmTagSize) { @@ -422,7 +426,7 @@ type cbcCipher struct { oracleCamouflage uint32 } -func newCBCCipher(c cipher.Block, iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) { +func newCBCCipher(c cipher.Block, key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { cbc := &cbcCipher{ mac: macModes[algs.MAC].new(macKey), decrypter: cipher.NewCBCDecrypter(c, iv), @@ -436,13 +440,13 @@ func newCBCCipher(c cipher.Block, iv, key, macKey []byte, algs directionAlgorith return cbc, nil } -func newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) { +func newAESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { c, err := aes.NewCipher(key) if err != nil { return nil, err } - cbc, err := newCBCCipher(c, iv, key, macKey, algs) + cbc, err := newCBCCipher(c, key, iv, macKey, algs) if err != nil { return nil, err } @@ -450,13 +454,13 @@ func newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCi return cbc, nil } -func newTripleDESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) { +func newTripleDESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { c, err := des.NewTripleDESCipher(key) if err != nil { return nil, err } - cbc, err := newCBCCipher(c, iv, key, macKey, algs) + cbc, err := newCBCCipher(c, key, iv, macKey, algs) if err != nil { return nil, err } @@ -548,11 +552,11 @@ func (c *cbcCipher) readPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) c.packetData = c.packetData[:entirePacketSize] } - if n, err := io.ReadFull(r, c.packetData[firstBlockLength:]); err != nil { + n, err := io.ReadFull(r, c.packetData[firstBlockLength:]) + if err != nil { return nil, err - } else { - c.oracleCamouflage -= uint32(n) } + c.oracleCamouflage -= uint32(n) remainingCrypted := c.packetData[firstBlockLength:macStart] c.decrypter.CryptBlocks(remainingCrypted, remainingCrypted) @@ -627,3 +631,140 @@ func (c *cbcCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, pack return nil } + +const chacha20Poly1305ID = "chacha20-poly1305@openssh.com" + +// chacha20Poly1305Cipher implements the chacha20-poly1305@openssh.com +// AEAD, which is described here: +// +// https://tools.ietf.org/html/draft-josefsson-ssh-chacha20-poly1305-openssh-00 +// +// the methods here also implement padding, which RFC4253 Section 6 +// also requires of stream ciphers. +type chacha20Poly1305Cipher struct { + lengthKey [8]uint32 + contentKey [8]uint32 + buf []byte +} + +func newChaCha20Cipher(key, unusedIV, unusedMACKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { + if len(key) != 64 { + panic(len(key)) + } + + c := &chacha20Poly1305Cipher{ + buf: make([]byte, 256), + } + + for i := range c.contentKey { + c.contentKey[i] = binary.LittleEndian.Uint32(key[i*4 : (i+1)*4]) + } + for i := range c.lengthKey { + c.lengthKey[i] = binary.LittleEndian.Uint32(key[(i+8)*4 : (i+9)*4]) + } + return c, nil +} + +func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { + nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} + s := chacha20.New(c.contentKey, nonce) + var polyKey [32]byte + s.XORKeyStream(polyKey[:], polyKey[:]) + s.Advance() // skip next 32 bytes + + encryptedLength := c.buf[:4] + if _, err := io.ReadFull(r, encryptedLength); err != nil { + return nil, err + } + + var lenBytes [4]byte + chacha20.New(c.lengthKey, nonce).XORKeyStream(lenBytes[:], encryptedLength) + + length := binary.BigEndian.Uint32(lenBytes[:]) + if length > maxPacket { + return nil, errors.New("ssh: invalid packet length, packet too large") + } + + contentEnd := 4 + length + packetEnd := contentEnd + poly1305.TagSize + if uint32(cap(c.buf)) < packetEnd { + c.buf = make([]byte, packetEnd) + copy(c.buf[:], encryptedLength) + } else { + c.buf = c.buf[:packetEnd] + } + + if _, err := io.ReadFull(r, c.buf[4:packetEnd]); err != nil { + return nil, err + } + + var mac [poly1305.TagSize]byte + copy(mac[:], c.buf[contentEnd:packetEnd]) + if !poly1305.Verify(&mac, c.buf[:contentEnd], &polyKey) { + return nil, errors.New("ssh: MAC failure") + } + + plain := c.buf[4:contentEnd] + s.XORKeyStream(plain, plain) + + padding := plain[0] + if padding < 4 { + // padding is a byte, so it automatically satisfies + // the maximum size, which is 255. + return nil, fmt.Errorf("ssh: illegal padding %d", padding) + } + + if int(padding)+1 >= len(plain) { + return nil, fmt.Errorf("ssh: padding %d too large", padding) + } + + plain = plain[1 : len(plain)-int(padding)] + + return plain, nil +} + +func (c *chacha20Poly1305Cipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, payload []byte) error { + nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} + s := chacha20.New(c.contentKey, nonce) + var polyKey [32]byte + s.XORKeyStream(polyKey[:], polyKey[:]) + s.Advance() // skip next 32 bytes + + // There is no blocksize, so fall back to multiple of 8 byte + // padding, as described in RFC 4253, Sec 6. + const packetSizeMultiple = 8 + + padding := packetSizeMultiple - (1+len(payload))%packetSizeMultiple + if padding < 4 { + padding += packetSizeMultiple + } + + // size (4 bytes), padding (1), payload, padding, tag. + totalLength := 4 + 1 + len(payload) + padding + poly1305.TagSize + if cap(c.buf) < totalLength { + c.buf = make([]byte, totalLength) + } else { + c.buf = c.buf[:totalLength] + } + + binary.BigEndian.PutUint32(c.buf, uint32(1+len(payload)+padding)) + chacha20.New(c.lengthKey, nonce).XORKeyStream(c.buf, c.buf[:4]) + c.buf[4] = byte(padding) + copy(c.buf[5:], payload) + packetEnd := 5 + len(payload) + padding + if _, err := io.ReadFull(rand, c.buf[5+len(payload):packetEnd]); err != nil { + return err + } + + s.XORKeyStream(c.buf[4:], c.buf[4:packetEnd]) + + var mac [poly1305.TagSize]byte + poly1305.Sum(&mac, c.buf[:packetEnd], &polyKey) + + copy(c.buf[packetEnd:], mac[:]) + + if _, err := w.Write(c.buf); err != nil { + return err + } + return nil +} diff --git a/vendor/golang.org/x/crypto/ssh/client.go b/vendor/golang.org/x/crypto/ssh/client.go index a7e3263bcab2..7b00bff1caa5 100644 --- a/vendor/golang.org/x/crypto/ssh/client.go +++ b/vendor/golang.org/x/crypto/ssh/client.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "net" + "os" "sync" "time" ) @@ -18,6 +19,8 @@ import ( type Client struct { Conn + handleForwardsOnce sync.Once // guards calling (*Client).handleForwards + forwards forwardList // forwarded tcpip connections from the remote side mu sync.Mutex channelHandlers map[string]chan NewChannel @@ -59,8 +62,6 @@ func NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client { conn.Wait() conn.forwards.closeAll() }() - go conn.forwards.handleChannels(conn.HandleChannelOpen("forwarded-tcpip")) - go conn.forwards.handleChannels(conn.HandleChannelOpen("forwarded-streamlocal@openssh.com")) return conn } @@ -184,9 +185,13 @@ func Dial(network, addr string, config *ClientConfig) (*Client, error) { // keys. A HostKeyCallback must return nil if the host key is OK, or // an error to reject it. It receives the hostname as passed to Dial // or NewClientConn. The remote address is the RemoteAddr of the -// net.Conn underlying the the SSH connection. +// net.Conn underlying the SSH connection. type HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error +// BannerCallback is the function type used for treat the banner sent by +// the server. A BannerCallback receives the message sent by the remote server. +type BannerCallback func(message string) error + // A ClientConfig structure is used to configure a Client. It must not be // modified after having been passed to an SSH function. type ClientConfig struct { @@ -209,6 +214,12 @@ type ClientConfig struct { // FixedHostKey can be used for simplistic host key checks. HostKeyCallback HostKeyCallback + // BannerCallback is called during the SSH dance to display a custom + // server's message. The client configuration can supply this callback to + // handle it as wished. The function BannerDisplayStderr can be used for + // simplistic display on Stderr. + BannerCallback BannerCallback + // ClientVersion contains the version identification string that will // be used for the connection. If empty, a reasonable default is used. ClientVersion string @@ -255,3 +266,13 @@ func FixedHostKey(key PublicKey) HostKeyCallback { hk := &fixedHostKey{key} return hk.check } + +// BannerDisplayStderr returns a function that can be used for +// ClientConfig.BannerCallback to display banners on os.Stderr. +func BannerDisplayStderr() BannerCallback { + return func(banner string) error { + _, err := os.Stderr.WriteString(banner) + + return err + } +} diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go index 3acd8d49886e..5f44b77403e8 100644 --- a/vendor/golang.org/x/crypto/ssh/client_auth.go +++ b/vendor/golang.org/x/crypto/ssh/client_auth.go @@ -11,6 +11,14 @@ import ( "io" ) +type authResult int + +const ( + authFailure authResult = iota + authPartialSuccess + authSuccess +) + // clientAuthenticate authenticates with the remote server. See RFC 4252. func (c *connection) clientAuthenticate(config *ClientConfig) error { // initiate user auth session @@ -37,11 +45,12 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { if err != nil { return err } - if ok { + if ok == authSuccess { // success return nil + } else if ok == authFailure { + tried[auth.method()] = true } - tried[auth.method()] = true if methods == nil { methods = lastMethods } @@ -82,7 +91,7 @@ type AuthMethod interface { // If authentication is not successful, a []string of alternative // method names is returned. If the slice is nil, it will be ignored // and the previous set of possible methods will be reused. - auth(session []byte, user string, p packetConn, rand io.Reader) (bool, []string, error) + auth(session []byte, user string, p packetConn, rand io.Reader) (authResult, []string, error) // method returns the RFC 4252 method name. method() string @@ -91,13 +100,13 @@ type AuthMethod interface { // "none" authentication, RFC 4252 section 5.2. type noneAuth int -func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { +func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { if err := c.writePacket(Marshal(&userAuthRequestMsg{ User: user, Service: serviceSSH, Method: "none", })); err != nil { - return false, nil, err + return authFailure, nil, err } return handleAuthResponse(c) @@ -111,7 +120,7 @@ func (n *noneAuth) method() string { // a function call, e.g. by prompting the user. type passwordCallback func() (password string, err error) -func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { +func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { type passwordAuthMsg struct { User string `sshtype:"50"` Service string @@ -125,7 +134,7 @@ func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand // The program may only find out that the user doesn't have a password // when prompting. if err != nil { - return false, nil, err + return authFailure, nil, err } if err := c.writePacket(Marshal(&passwordAuthMsg{ @@ -135,7 +144,7 @@ func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand Reply: false, Password: pw, })); err != nil { - return false, nil, err + return authFailure, nil, err } return handleAuthResponse(c) @@ -178,7 +187,7 @@ func (cb publicKeyCallback) method() string { return "publickey" } -func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { +func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { // Authentication is performed by sending an enquiry to test if a key is // acceptable to the remote. If the key is acceptable, the client will // attempt to authenticate with the valid key. If not the client will repeat @@ -186,13 +195,13 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand signers, err := cb() if err != nil { - return false, nil, err + return authFailure, nil, err } var methods []string for _, signer := range signers { ok, err := validateKey(signer.PublicKey(), user, c) if err != nil { - return false, nil, err + return authFailure, nil, err } if !ok { continue @@ -206,7 +215,7 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand Method: cb.method(), }, []byte(pub.Type()), pubKey)) if err != nil { - return false, nil, err + return authFailure, nil, err } // manually wrap the serialized signature in a string @@ -224,24 +233,24 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand } p := Marshal(&msg) if err := c.writePacket(p); err != nil { - return false, nil, err + return authFailure, nil, err } - var success bool + var success authResult success, methods, err = handleAuthResponse(c) if err != nil { - return false, nil, err + return authFailure, nil, err } // If authentication succeeds or the list of available methods does not // contain the "publickey" method, do not attempt to authenticate with any // other keys. According to RFC 4252 Section 7, the latter can occur when // additional authentication methods are required. - if success || !containsMethod(methods, cb.method()) { + if success == authSuccess || !containsMethod(methods, cb.method()) { return success, methods, err } } - return false, methods, nil + return authFailure, methods, nil } func containsMethod(methods []string, method string) bool { @@ -283,7 +292,9 @@ func confirmKeyAck(key PublicKey, c packetConn) (bool, error) { } switch packet[0] { case msgUserAuthBanner: - // TODO(gpaul): add callback to present the banner to the user + if err := handleBannerResponse(c, packet); err != nil { + return false, err + } case msgUserAuthPubKeyOk: var msg userAuthPubKeyOkMsg if err := Unmarshal(packet, &msg); err != nil { @@ -316,30 +327,53 @@ func PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMet // handleAuthResponse returns whether the preceding authentication request succeeded // along with a list of remaining authentication methods to try next and // an error if an unexpected response was received. -func handleAuthResponse(c packetConn) (bool, []string, error) { +func handleAuthResponse(c packetConn) (authResult, []string, error) { for { packet, err := c.readPacket() if err != nil { - return false, nil, err + return authFailure, nil, err } switch packet[0] { case msgUserAuthBanner: - // TODO: add callback to present the banner to the user + if err := handleBannerResponse(c, packet); err != nil { + return authFailure, nil, err + } case msgUserAuthFailure: var msg userAuthFailureMsg if err := Unmarshal(packet, &msg); err != nil { - return false, nil, err + return authFailure, nil, err + } + if msg.PartialSuccess { + return authPartialSuccess, msg.Methods, nil } - return false, msg.Methods, nil + return authFailure, msg.Methods, nil case msgUserAuthSuccess: - return true, nil, nil + return authSuccess, nil, nil default: - return false, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0]) + return authFailure, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0]) } } } +func handleBannerResponse(c packetConn, packet []byte) error { + var msg userAuthBannerMsg + if err := Unmarshal(packet, &msg); err != nil { + return err + } + + transport, ok := c.(*handshakeTransport) + if !ok { + return nil + } + + if transport.bannerCallback != nil { + return transport.bannerCallback(msg.Message) + } + + return nil +} + // KeyboardInteractiveChallenge should print questions, optionally // disabling echoing (e.g. for passwords), and return all the answers. // Challenge may be called multiple times in a single session. After @@ -359,7 +393,7 @@ func (cb KeyboardInteractiveChallenge) method() string { return "keyboard-interactive" } -func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { +func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { type initiateMsg struct { User string `sshtype:"50"` Service string @@ -373,37 +407,42 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe Service: serviceSSH, Method: "keyboard-interactive", })); err != nil { - return false, nil, err + return authFailure, nil, err } for { packet, err := c.readPacket() if err != nil { - return false, nil, err + return authFailure, nil, err } // like handleAuthResponse, but with less options. switch packet[0] { case msgUserAuthBanner: - // TODO: Print banners during userauth. + if err := handleBannerResponse(c, packet); err != nil { + return authFailure, nil, err + } continue case msgUserAuthInfoRequest: // OK case msgUserAuthFailure: var msg userAuthFailureMsg if err := Unmarshal(packet, &msg); err != nil { - return false, nil, err + return authFailure, nil, err + } + if msg.PartialSuccess { + return authPartialSuccess, msg.Methods, nil } - return false, msg.Methods, nil + return authFailure, msg.Methods, nil case msgUserAuthSuccess: - return true, nil, nil + return authSuccess, nil, nil default: - return false, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) + return authFailure, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) } var msg userAuthInfoRequestMsg if err := Unmarshal(packet, &msg); err != nil { - return false, nil, err + return authFailure, nil, err } // Manually unpack the prompt/echo pairs. @@ -413,7 +452,7 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe for i := 0; i < int(msg.NumPrompts); i++ { prompt, r, ok := parseString(rest) if !ok || len(r) == 0 { - return false, nil, errors.New("ssh: prompt format error") + return authFailure, nil, errors.New("ssh: prompt format error") } prompts = append(prompts, string(prompt)) echos = append(echos, r[0] != 0) @@ -421,16 +460,16 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe } if len(rest) != 0 { - return false, nil, errors.New("ssh: extra data following keyboard-interactive pairs") + return authFailure, nil, errors.New("ssh: extra data following keyboard-interactive pairs") } answers, err := cb(msg.User, msg.Instruction, prompts, echos) if err != nil { - return false, nil, err + return authFailure, nil, err } if len(answers) != len(prompts) { - return false, nil, errors.New("ssh: not enough answers from keyboard-interactive callback") + return authFailure, nil, errors.New("ssh: not enough answers from keyboard-interactive callback") } responseLength := 1 + 4 for _, a := range answers { @@ -446,7 +485,7 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe } if err := c.writePacket(serialized); err != nil { - return false, nil, err + return authFailure, nil, err } } } @@ -456,10 +495,10 @@ type retryableAuthMethod struct { maxTries int } -func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok bool, methods []string, err error) { +func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok authResult, methods []string, err error) { for i := 0; r.maxTries <= 0 || i < r.maxTries; i++ { ok, methods, err = r.authMethod.auth(session, user, c, rand) - if ok || err != nil { // either success or error terminate + if ok != authFailure || err != nil { // either success, partial success or error terminate return ok, methods, err } } diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go index dc39e4d23182..04f3620b3d5e 100644 --- a/vendor/golang.org/x/crypto/ssh/common.go +++ b/vendor/golang.org/x/crypto/ssh/common.go @@ -24,11 +24,21 @@ const ( serviceSSH = "ssh-connection" ) -// supportedCiphers specifies the supported ciphers in preference order. +// supportedCiphers lists ciphers we support but might not recommend. var supportedCiphers = []string{ "aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", - "arcfour256", "arcfour128", + chacha20Poly1305ID, + "arcfour256", "arcfour128", "arcfour", + aes128cbcID, + tripledescbcID, +} + +// preferredCiphers specifies the default preference for ciphers. +var preferredCiphers = []string{ + "aes128-gcm@openssh.com", + chacha20Poly1305ID, + "aes128-ctr", "aes192-ctr", "aes256-ctr", } // supportedKexAlgos specifies the supported key-exchange algorithms in @@ -211,7 +221,7 @@ func (c *Config) SetDefaults() { c.Rand = rand.Reader } if c.Ciphers == nil { - c.Ciphers = supportedCiphers + c.Ciphers = preferredCiphers } var ciphers []string for _, c := range c.Ciphers { @@ -242,7 +252,7 @@ func (c *Config) SetDefaults() { // buildDataSignedForAuth returns the data that is signed in order to prove // possession of a private key. See RFC 4252, section 7. -func buildDataSignedForAuth(sessionId []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte { +func buildDataSignedForAuth(sessionID []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte { data := struct { Session []byte Type byte @@ -253,7 +263,7 @@ func buildDataSignedForAuth(sessionId []byte, req userAuthRequestMsg, algo, pubK Algo []byte PubKey []byte }{ - sessionId, + sessionID, msgUserAuthRequest, req.User, req.Service, diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go index 932ce8393ea8..4f7912ecd656 100644 --- a/vendor/golang.org/x/crypto/ssh/handshake.go +++ b/vendor/golang.org/x/crypto/ssh/handshake.go @@ -78,6 +78,11 @@ type handshakeTransport struct { dialAddress string remoteAddr net.Addr + // bannerCallback is non-empty if we are the client and it has been set in + // ClientConfig. In that case it is called during the user authentication + // dance to handle a custom server's message. + bannerCallback BannerCallback + // Algorithms agreed in the last key exchange. algorithms *algorithms @@ -120,6 +125,7 @@ func newClientTransport(conn keyingTransport, clientVersion, serverVersion []byt t.dialAddress = dialAddr t.remoteAddr = addr t.hostKeyCallback = config.HostKeyCallback + t.bannerCallback = config.BannerCallback if config.HostKeyAlgorithms != nil { t.hostKeyAlgorithms = config.HostKeyAlgorithms } else { diff --git a/vendor/golang.org/x/crypto/ssh/kex.go b/vendor/golang.org/x/crypto/ssh/kex.go index f91c2770edc2..f34bcc013325 100644 --- a/vendor/golang.org/x/crypto/ssh/kex.go +++ b/vendor/golang.org/x/crypto/ssh/kex.go @@ -119,7 +119,7 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha return nil, err } - kInt, err := group.diffieHellman(kexDHReply.Y, x) + ki, err := group.diffieHellman(kexDHReply.Y, x) if err != nil { return nil, err } @@ -129,8 +129,8 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha writeString(h, kexDHReply.HostKey) writeInt(h, X) writeInt(h, kexDHReply.Y) - K := make([]byte, intLength(kInt)) - marshalInt(K, kInt) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) h.Write(K) return &kexResult{ @@ -164,7 +164,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha } Y := new(big.Int).Exp(group.g, y, group.p) - kInt, err := group.diffieHellman(kexDHInit.X, y) + ki, err := group.diffieHellman(kexDHInit.X, y) if err != nil { return nil, err } @@ -177,8 +177,8 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha writeInt(h, kexDHInit.X) writeInt(h, Y) - K := make([]byte, intLength(kInt)) - marshalInt(K, kInt) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) h.Write(K) H := h.Sum(nil) @@ -462,9 +462,9 @@ func (kex *curve25519sha256) Client(c packetConn, rand io.Reader, magics *handsh writeString(h, kp.pub[:]) writeString(h, reply.EphemeralPubKey) - kInt := new(big.Int).SetBytes(secret[:]) - K := make([]byte, intLength(kInt)) - marshalInt(K, kInt) + ki := new(big.Int).SetBytes(secret[:]) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) h.Write(K) return &kexResult{ @@ -510,9 +510,9 @@ func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handsh writeString(h, kexInit.ClientPubKey) writeString(h, kp.pub[:]) - kInt := new(big.Int).SetBytes(secret[:]) - K := make([]byte, intLength(kInt)) - marshalInt(K, kInt) + ki := new(big.Int).SetBytes(secret[:]) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) h.Write(K) H := h.Sum(nil) diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go index b682c1741b73..969804794fb8 100644 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -38,6 +38,16 @@ const ( KeyAlgoED25519 = "ssh-ed25519" ) +// These constants represent non-default signature algorithms that are supported +// as algorithm parameters to AlgorithmSigner.SignWithAlgorithm methods. See +// [PROTOCOL.agent] section 4.5.1 and +// https://tools.ietf.org/html/draft-ietf-curdle-rsa-sha2-10 +const ( + SigAlgoRSA = "ssh-rsa" + SigAlgoRSASHA2256 = "rsa-sha2-256" + SigAlgoRSASHA2512 = "rsa-sha2-512" +) + // parsePubKey parses a public key of the given algorithm. // Use ParsePublicKey for keys with prepended algorithm. func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) { @@ -276,7 +286,8 @@ type PublicKey interface { Type() string // Marshal returns the serialized key data in SSH wire format, - // with the name prefix. + // with the name prefix. To unmarshal the returned data, use + // the ParsePublicKey function. Marshal() []byte // Verify that sig is a signature on the given data using this @@ -300,6 +311,19 @@ type Signer interface { Sign(rand io.Reader, data []byte) (*Signature, error) } +// A AlgorithmSigner is a Signer that also supports specifying a specific +// algorithm to use for signing. +type AlgorithmSigner interface { + Signer + + // SignWithAlgorithm is like Signer.Sign, but allows specification of a + // non-default signing algorithm. See the SigAlgo* constants in this + // package for signature algorithms supported by this package. Callers may + // pass an empty string for the algorithm in which case the AlgorithmSigner + // will use its default algorithm. + SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) +} + type rsaPublicKey rsa.PublicKey func (r *rsaPublicKey) Type() string { @@ -348,13 +372,21 @@ func (r *rsaPublicKey) Marshal() []byte { } func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { - if sig.Format != r.Type() { + var hash crypto.Hash + switch sig.Format { + case SigAlgoRSA: + hash = crypto.SHA1 + case SigAlgoRSASHA2256: + hash = crypto.SHA256 + case SigAlgoRSASHA2512: + hash = crypto.SHA512 + default: return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type()) } - h := crypto.SHA1.New() + h := hash.New() h.Write(data) digest := h.Sum(nil) - return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), crypto.SHA1, digest, sig.Blob) + return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), hash, digest, sig.Blob) } func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { @@ -363,7 +395,7 @@ func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { type dsaPublicKey dsa.PublicKey -func (r *dsaPublicKey) Type() string { +func (k *dsaPublicKey) Type() string { return "ssh-dss" } @@ -458,6 +490,14 @@ func (k *dsaPrivateKey) PublicKey() PublicKey { } func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { + return k.SignWithAlgorithm(rand, data, "") +} + +func (k *dsaPrivateKey) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { + if algorithm != "" && algorithm != k.PublicKey().Type() { + return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) + } + h := crypto.SHA1.New() h.Write(data) digest := h.Sum(nil) @@ -481,12 +521,12 @@ func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { type ecdsaPublicKey ecdsa.PublicKey -func (key *ecdsaPublicKey) Type() string { - return "ecdsa-sha2-" + key.nistID() +func (k *ecdsaPublicKey) Type() string { + return "ecdsa-sha2-" + k.nistID() } -func (key *ecdsaPublicKey) nistID() string { - switch key.Params().BitSize { +func (k *ecdsaPublicKey) nistID() string { + switch k.Params().BitSize { case 256: return "nistp256" case 384: @@ -499,7 +539,7 @@ func (key *ecdsaPublicKey) nistID() string { type ed25519PublicKey ed25519.PublicKey -func (key ed25519PublicKey) Type() string { +func (k ed25519PublicKey) Type() string { return KeyAlgoED25519 } @@ -518,23 +558,23 @@ func parseED25519(in []byte) (out PublicKey, rest []byte, err error) { return (ed25519PublicKey)(key), w.Rest, nil } -func (key ed25519PublicKey) Marshal() []byte { +func (k ed25519PublicKey) Marshal() []byte { w := struct { Name string KeyBytes []byte }{ KeyAlgoED25519, - []byte(key), + []byte(k), } return Marshal(&w) } -func (key ed25519PublicKey) Verify(b []byte, sig *Signature) error { - if sig.Format != key.Type() { - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, key.Type()) +func (k ed25519PublicKey) Verify(b []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) } - edKey := (ed25519.PublicKey)(key) + edKey := (ed25519.PublicKey)(k) if ok := ed25519.Verify(edKey, b, sig.Blob); !ok { return errors.New("ssh: signature did not verify") } @@ -595,9 +635,9 @@ func parseECDSA(in []byte) (out PublicKey, rest []byte, err error) { return (*ecdsaPublicKey)(key), w.Rest, nil } -func (key *ecdsaPublicKey) Marshal() []byte { +func (k *ecdsaPublicKey) Marshal() []byte { // See RFC 5656, section 3.1. - keyBytes := elliptic.Marshal(key.Curve, key.X, key.Y) + keyBytes := elliptic.Marshal(k.Curve, k.X, k.Y) // ECDSA publickey struct layout should match the struct used by // parseECDSACert in the x/crypto/ssh/agent package. w := struct { @@ -605,20 +645,20 @@ func (key *ecdsaPublicKey) Marshal() []byte { ID string Key []byte }{ - key.Type(), - key.nistID(), + k.Type(), + k.nistID(), keyBytes, } return Marshal(&w) } -func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { - if sig.Format != key.Type() { - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, key.Type()) +func (k *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) } - h := ecHash(key.Curve).New() + h := ecHash(k.Curve).New() h.Write(data) digest := h.Sum(nil) @@ -635,7 +675,7 @@ func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { return err } - if ecdsa.Verify((*ecdsa.PublicKey)(key), digest, ecSig.R, ecSig.S) { + if ecdsa.Verify((*ecdsa.PublicKey)(k), digest, ecSig.R, ecSig.S) { return nil } return errors.New("ssh: signature did not verify") @@ -690,16 +730,42 @@ func (s *wrappedSigner) PublicKey() PublicKey { } func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { + return s.SignWithAlgorithm(rand, data, "") +} + +func (s *wrappedSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { var hashFunc crypto.Hash - switch key := s.pubKey.(type) { - case *rsaPublicKey, *dsaPublicKey: - hashFunc = crypto.SHA1 - case *ecdsaPublicKey: - hashFunc = ecHash(key.Curve) - case ed25519PublicKey: - default: - return nil, fmt.Errorf("ssh: unsupported key type %T", key) + if _, ok := s.pubKey.(*rsaPublicKey); ok { + // RSA keys support a few hash functions determined by the requested signature algorithm + switch algorithm { + case "", SigAlgoRSA: + algorithm = SigAlgoRSA + hashFunc = crypto.SHA1 + case SigAlgoRSASHA2256: + hashFunc = crypto.SHA256 + case SigAlgoRSASHA2512: + hashFunc = crypto.SHA512 + default: + return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) + } + } else { + // The only supported algorithm for all other key types is the same as the type of the key + if algorithm == "" { + algorithm = s.pubKey.Type() + } else if algorithm != s.pubKey.Type() { + return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) + } + + switch key := s.pubKey.(type) { + case *dsaPublicKey: + hashFunc = crypto.SHA1 + case *ecdsaPublicKey: + hashFunc = ecHash(key.Curve) + case ed25519PublicKey: + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } } var digest []byte @@ -744,7 +810,7 @@ func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { } return &Signature{ - Format: s.pubKey.Type(), + Format: algorithm, Blob: signature, }, nil } @@ -758,7 +824,7 @@ func NewPublicKey(key interface{}) (PublicKey, error) { return (*rsaPublicKey)(key), nil case *ecdsa.PublicKey: if !supportedEllipticCurve(key.Curve) { - return nil, errors.New("ssh: only P-256, P-384 and P-521 EC keys are supported.") + return nil, errors.New("ssh: only P-256, P-384 and P-521 EC keys are supported") } return (*ecdsaPublicKey)(key), nil case *dsa.PublicKey: @@ -802,7 +868,7 @@ func encryptedBlock(block *pem.Block) bool { } // ParseRawPrivateKey returns a private key from a PEM encoded private key. It -// supports RSA (PKCS#1), DSA (OpenSSL), and ECDSA private keys. +// supports RSA (PKCS#1), PKCS#8, DSA (OpenSSL), and ECDSA private keys. func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { block, _ := pem.Decode(pemBytes) if block == nil { @@ -816,6 +882,9 @@ func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { switch block.Type { case "RSA PRIVATE KEY": return x509.ParsePKCS1PrivateKey(block.Bytes) + // RFC5208 - https://tools.ietf.org/html/rfc5208 + case "PRIVATE KEY": + return x509.ParsePKCS8PrivateKey(block.Bytes) case "EC PRIVATE KEY": return x509.ParseECPrivateKey(block.Bytes) case "DSA PRIVATE KEY": @@ -899,8 +968,8 @@ func ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) { // Implemented based on the documentation at // https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { - magic := append([]byte("openssh-key-v1"), 0) - if !bytes.Equal(magic, key[0:len(magic)]) { + const magic = "openssh-key-v1\x00" + if len(key) < len(magic) || string(key[:len(magic)]) != magic { return nil, errors.New("ssh: invalid openssh private key format") } remaining := key[len(magic):] diff --git a/vendor/golang.org/x/crypto/ssh/messages.go b/vendor/golang.org/x/crypto/ssh/messages.go index e6ecd3afa5ad..08d28117305d 100644 --- a/vendor/golang.org/x/crypto/ssh/messages.go +++ b/vendor/golang.org/x/crypto/ssh/messages.go @@ -23,10 +23,6 @@ const ( msgUnimplemented = 3 msgDebug = 4 msgNewKeys = 21 - - // Standard authentication messages - msgUserAuthSuccess = 52 - msgUserAuthBanner = 53 ) // SSH messages: @@ -137,6 +133,18 @@ type userAuthFailureMsg struct { PartialSuccess bool } +// See RFC 4252, section 5.1 +const msgUserAuthSuccess = 52 + +// See RFC 4252, section 5.4 +const msgUserAuthBanner = 53 + +type userAuthBannerMsg struct { + Message string `sshtype:"53"` + // unused, but required to allow message parsing + Language string +} + // See RFC 4256, section 3.2 const msgUserAuthInfoRequest = 60 const msgUserAuthInfoResponse = 61 @@ -154,7 +162,7 @@ const msgChannelOpen = 90 type channelOpenMsg struct { ChanType string `sshtype:"90"` - PeersId uint32 + PeersID uint32 PeersWindow uint32 MaxPacketSize uint32 TypeSpecificData []byte `ssh:"rest"` @@ -165,7 +173,7 @@ const msgChannelData = 94 // Used for debug print outs of packets. type channelDataMsg struct { - PeersId uint32 `sshtype:"94"` + PeersID uint32 `sshtype:"94"` Length uint32 Rest []byte `ssh:"rest"` } @@ -174,8 +182,8 @@ type channelDataMsg struct { const msgChannelOpenConfirm = 91 type channelOpenConfirmMsg struct { - PeersId uint32 `sshtype:"91"` - MyId uint32 + PeersID uint32 `sshtype:"91"` + MyID uint32 MyWindow uint32 MaxPacketSize uint32 TypeSpecificData []byte `ssh:"rest"` @@ -185,7 +193,7 @@ type channelOpenConfirmMsg struct { const msgChannelOpenFailure = 92 type channelOpenFailureMsg struct { - PeersId uint32 `sshtype:"92"` + PeersID uint32 `sshtype:"92"` Reason RejectionReason Message string Language string @@ -194,7 +202,7 @@ type channelOpenFailureMsg struct { const msgChannelRequest = 98 type channelRequestMsg struct { - PeersId uint32 `sshtype:"98"` + PeersID uint32 `sshtype:"98"` Request string WantReply bool RequestSpecificData []byte `ssh:"rest"` @@ -204,28 +212,28 @@ type channelRequestMsg struct { const msgChannelSuccess = 99 type channelRequestSuccessMsg struct { - PeersId uint32 `sshtype:"99"` + PeersID uint32 `sshtype:"99"` } // See RFC 4254, section 5.4. const msgChannelFailure = 100 type channelRequestFailureMsg struct { - PeersId uint32 `sshtype:"100"` + PeersID uint32 `sshtype:"100"` } // See RFC 4254, section 5.3 const msgChannelClose = 97 type channelCloseMsg struct { - PeersId uint32 `sshtype:"97"` + PeersID uint32 `sshtype:"97"` } // See RFC 4254, section 5.3 const msgChannelEOF = 96 type channelEOFMsg struct { - PeersId uint32 `sshtype:"96"` + PeersID uint32 `sshtype:"96"` } // See RFC 4254, section 4 @@ -255,7 +263,7 @@ type globalRequestFailureMsg struct { const msgChannelWindowAdjust = 93 type windowAdjustMsg struct { - PeersId uint32 `sshtype:"93"` + PeersID uint32 `sshtype:"93"` AdditionalBytes uint32 } diff --git a/vendor/golang.org/x/crypto/ssh/mux.go b/vendor/golang.org/x/crypto/ssh/mux.go index 27a527c106bf..f19016270e8f 100644 --- a/vendor/golang.org/x/crypto/ssh/mux.go +++ b/vendor/golang.org/x/crypto/ssh/mux.go @@ -278,7 +278,7 @@ func (m *mux) handleChannelOpen(packet []byte) error { if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { failMsg := channelOpenFailureMsg{ - PeersId: msg.PeersId, + PeersID: msg.PeersID, Reason: ConnectionFailed, Message: "invalid request", Language: "en_US.UTF-8", @@ -287,7 +287,7 @@ func (m *mux) handleChannelOpen(packet []byte) error { } c := m.newChannel(msg.ChanType, channelInbound, msg.TypeSpecificData) - c.remoteId = msg.PeersId + c.remoteId = msg.PeersID c.maxRemotePayload = msg.MaxPacketSize c.remoteWin.add(msg.PeersWindow) m.incomingChannels <- c @@ -313,7 +313,7 @@ func (m *mux) openChannel(chanType string, extra []byte) (*channel, error) { PeersWindow: ch.myWindow, MaxPacketSize: ch.maxIncomingPayload, TypeSpecificData: extra, - PeersId: ch.localId, + PeersID: ch.localId, } if err := m.sendMessage(open); err != nil { return nil, err diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index 8a78b7ca0f1d..e86e89661a06 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -95,6 +95,10 @@ type ServerConfig struct { // Note that RFC 4253 section 4.2 requires that this string start with // "SSH-2.0-". ServerVersion string + + // BannerCallback, if present, is called and the return string is sent to + // the client after key exchange completed but before authentication. + BannerCallback func(conn ConnMetadata) string } // AddHostKey adds a private key as a host key. If an existing host @@ -162,6 +166,9 @@ type ServerConn struct { // unsuccessful, it closes the connection and returns an error. The // Request and NewChannel channels must be serviced, or the connection // will hang. +// +// The returned error may be of type *ServerAuthError for +// authentication errors. func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) { fullConf := *config fullConf.SetDefaults() @@ -252,7 +259,7 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) func isAcceptableAlgo(algo string) bool { switch algo { case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoED25519, - CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01: + CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: return true } return false @@ -288,12 +295,13 @@ func checkSourceAddress(addr net.Addr, sourceAddrs string) error { return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) } -// ServerAuthError implements the error interface. It appends any authentication -// errors that may occur, and is returned if all of the authentication methods -// provided by the user failed to authenticate. +// ServerAuthError represents server authentication errors and is +// sometimes returned by NewServerConn. It appends any authentication +// errors that may occur, and is returned if all of the authentication +// methods provided by the user failed to authenticate. type ServerAuthError struct { // Errors contains authentication errors returned by the authentication - // callback methods. + // callback methods. The first entry is typically ErrNoAuth. Errors []error } @@ -305,6 +313,13 @@ func (l ServerAuthError) Error() string { return "[" + strings.Join(errs, ", ") + "]" } +// ErrNoAuth is the error value returned if no +// authentication method has been passed yet. This happens as a normal +// part of the authentication loop, since the client first tries +// 'none' authentication to discover available methods. +// It is returned in ServerAuthError.Errors from NewServerConn. +var ErrNoAuth = errors.New("ssh: no auth passed yet") + func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) { sessionID := s.transport.getSessionID() var cache pubKeyCache @@ -312,6 +327,7 @@ func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, err authFailures := 0 var authErrs []error + var displayedBanner bool userAuthLoop: for { @@ -343,8 +359,22 @@ userAuthLoop: } s.user = userAuthReq.User + + if !displayedBanner && config.BannerCallback != nil { + displayedBanner = true + msg := config.BannerCallback(s) + if msg != "" { + bannerMsg := &userAuthBannerMsg{ + Message: msg, + } + if err := s.transport.writePacket(Marshal(bannerMsg)); err != nil { + return nil, err + } + } + } + perms = nil - authErr := errors.New("no auth passed yet") + authErr := ErrNoAuth switch userAuthReq.Method { case "none": @@ -374,7 +404,7 @@ userAuthLoop: perms, authErr = config.PasswordCallback(s, password) case "keyboard-interactive": if config.KeyboardInteractiveCallback == nil { - authErr = errors.New("ssh: keyboard-interactive auth not configubred") + authErr = errors.New("ssh: keyboard-interactive auth not configured") break } @@ -454,6 +484,7 @@ userAuthLoop: // sig.Format. This is usually the same, but // for certs, the names differ. if !isAcceptableAlgo(sig.Format) { + authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format) break } signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) diff --git a/vendor/golang.org/x/crypto/ssh/session.go b/vendor/golang.org/x/crypto/ssh/session.go index cc06e03f5c1a..d3321f6b784b 100644 --- a/vendor/golang.org/x/crypto/ssh/session.go +++ b/vendor/golang.org/x/crypto/ssh/session.go @@ -406,7 +406,7 @@ func (s *Session) Wait() error { s.stdinPipeWriter.Close() } var copyError error - for _ = range s.copyFuncs { + for range s.copyFuncs { if err := <-s.errors; err != nil && copyError == nil { copyError = err } diff --git a/vendor/golang.org/x/crypto/ssh/streamlocal.go b/vendor/golang.org/x/crypto/ssh/streamlocal.go index a2dccc64c7ef..b171b330bc38 100644 --- a/vendor/golang.org/x/crypto/ssh/streamlocal.go +++ b/vendor/golang.org/x/crypto/ssh/streamlocal.go @@ -32,6 +32,7 @@ type streamLocalChannelForwardMsg struct { // ListenUnix is similar to ListenTCP but uses a Unix domain socket. func (c *Client) ListenUnix(socketPath string) (net.Listener, error) { + c.handleForwardsOnce.Do(c.handleForwards) m := streamLocalChannelForwardMsg{ socketPath, } diff --git a/vendor/golang.org/x/crypto/ssh/tcpip.go b/vendor/golang.org/x/crypto/ssh/tcpip.go index acf17175dffb..80d35f5ec187 100644 --- a/vendor/golang.org/x/crypto/ssh/tcpip.go +++ b/vendor/golang.org/x/crypto/ssh/tcpip.go @@ -90,10 +90,19 @@ type channelForwardMsg struct { rport uint32 } +// handleForwards starts goroutines handling forwarded connections. +// It's called on first use by (*Client).ListenTCP to not launch +// goroutines until needed. +func (c *Client) handleForwards() { + go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-tcpip")) + go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-streamlocal@openssh.com")) +} + // ListenTCP requests the remote peer open a listening socket // on laddr. Incoming connections will be available by calling // Accept on the returned net.Listener. func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) { + c.handleForwardsOnce.Do(c.handleForwards) if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) { return c.autoPortListenWorkaround(laddr) } diff --git a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go index 18379a935bf0..9a887598ff40 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go @@ -617,7 +617,7 @@ func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { if _, err = w.Write(crlf); err != nil { return n, err } - n += 1 + n++ buf = buf[1:] } } diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go index 02dad484e5cf..391104084097 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd +// +build aix darwin dragonfly freebsd linux,!appengine netbsd openbsd // Package terminal provides support functions for dealing with terminals, as // commonly found on UNIX systems. @@ -25,7 +25,7 @@ type State struct { termios unix.Termios } -// IsTerminal returns true if the given file descriptor is a terminal. +// IsTerminal returns whether the given file descriptor is a terminal. func IsTerminal(fd int) bool { _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) return err == nil @@ -108,9 +108,7 @@ func ReadPassword(fd int) ([]byte, error) { return nil, err } - defer func() { - unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) - }() + defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) return readPasswordLine(passwordReader(fd)) } diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go b/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go new file mode 100644 index 000000000000..dfcd62785926 --- /dev/null +++ b/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go @@ -0,0 +1,12 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix + +package terminal + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETS +const ioctlWriteTermios = unix.TCSETS diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go index 799f049f04ea..9317ac7ede64 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go @@ -21,7 +21,7 @@ import ( type State struct{} -// IsTerminal returns true if the given file descriptor is a terminal. +// IsTerminal returns whether the given file descriptor is a terminal. func IsTerminal(fd int) bool { return false } diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go index a2e1b57dc148..3d5f06a9f049 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go @@ -14,10 +14,10 @@ import ( // State contains the state of a terminal. type State struct { - state *unix.Termios + termios unix.Termios } -// IsTerminal returns true if the given file descriptor is a terminal. +// IsTerminal returns whether the given file descriptor is a terminal. func IsTerminal(fd int) bool { _, err := unix.IoctlGetTermio(fd, unix.TCGETA) return err == nil @@ -75,47 +75,43 @@ func ReadPassword(fd int) ([]byte, error) { // restored. // see http://cr.illumos.org/~webrev/andy_js/1060/ func MakeRaw(fd int) (*State, error) { - oldTermiosPtr, err := unix.IoctlGetTermios(fd, unix.TCGETS) + termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) if err != nil { return nil, err } - oldTermios := *oldTermiosPtr - - newTermios := oldTermios - newTermios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON - newTermios.Oflag &^= syscall.OPOST - newTermios.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN - newTermios.Cflag &^= syscall.CSIZE | syscall.PARENB - newTermios.Cflag |= syscall.CS8 - newTermios.Cc[unix.VMIN] = 1 - newTermios.Cc[unix.VTIME] = 0 - - if err := unix.IoctlSetTermios(fd, unix.TCSETS, &newTermios); err != nil { + + oldState := State{termios: *termios} + + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + + if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil { return nil, err } - return &State{ - state: oldTermiosPtr, - }, nil + return &oldState, nil } // Restore restores the terminal connected to the given file descriptor to a // previous state. func Restore(fd int, oldState *State) error { - return unix.IoctlSetTermios(fd, unix.TCSETS, oldState.state) + return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios) } // GetState returns the current state of a terminal which may be useful to // restore the terminal after a signal. func GetState(fd int) (*State, error) { - oldTermiosPtr, err := unix.IoctlGetTermios(fd, unix.TCGETS) + termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) if err != nil { return nil, err } - return &State{ - state: oldTermiosPtr, - }, nil + return &State{termios: *termios}, nil } // GetSize returns the dimensions of the given terminal. diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go index 60979ccd005f..6cb8a95038c9 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go @@ -17,6 +17,8 @@ package terminal import ( + "os" + "golang.org/x/sys/windows" ) @@ -24,7 +26,7 @@ type State struct { mode uint32 } -// IsTerminal returns true if the given file descriptor is a terminal. +// IsTerminal returns whether the given file descriptor is a terminal. func IsTerminal(fd int) bool { var st uint32 err := windows.GetConsoleMode(windows.Handle(fd), &st) @@ -71,13 +73,6 @@ func GetSize(fd int) (width, height int, err error) { return int(info.Size.X), int(info.Size.Y), nil } -// passwordReader is an io.Reader that reads from a specific Windows HANDLE. -type passwordReader int - -func (r passwordReader) Read(buf []byte) (int, error) { - return windows.Read(windows.Handle(r), buf) -} - // ReadPassword reads a line of input from a terminal without local echo. This // is commonly used for inputting passwords and other sensitive data. The slice // returned does not include the \n. @@ -94,9 +89,15 @@ func ReadPassword(fd int) ([]byte, error) { return nil, err } - defer func() { - windows.SetConsoleMode(windows.Handle(fd), old) - }() + defer windows.SetConsoleMode(windows.Handle(fd), old) + + var h windows.Handle + p, _ := windows.GetCurrentProcess() + if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil { + return nil, err + } - return readPasswordLine(passwordReader(fd)) + f := os.NewFile(uintptr(h), "stdin") + defer f.Close() + return readPasswordLine(f) } diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go index ab2b88765a8a..f6fae1db4604 100644 --- a/vendor/golang.org/x/crypto/ssh/transport.go +++ b/vendor/golang.org/x/crypto/ssh/transport.go @@ -6,6 +6,7 @@ package ssh import ( "bufio" + "bytes" "errors" "io" "log" @@ -76,17 +77,17 @@ type connectionState struct { // both directions are triggered by reading and writing a msgNewKey packet // respectively. func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error { - if ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult); err != nil { + ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult) + if err != nil { return err - } else { - t.reader.pendingKeyChange <- ciph } + t.reader.pendingKeyChange <- ciph - if ciph, err := newPacketCipher(t.writer.dir, algs.w, kexResult); err != nil { + ciph, err = newPacketCipher(t.writer.dir, algs.w, kexResult) + if err != nil { return err - } else { - t.writer.pendingKeyChange <- ciph } + t.writer.pendingKeyChange <- ciph return nil } @@ -139,7 +140,7 @@ func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { case cipher := <-s.pendingKeyChange: s.packetCipher = cipher default: - return nil, errors.New("ssh: got bogus newkeys message.") + return nil, errors.New("ssh: got bogus newkeys message") } case msgDisconnect: @@ -232,52 +233,22 @@ var ( clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}} ) -// generateKeys generates key material for IV, MAC and encryption. -func generateKeys(d direction, algs directionAlgorithms, kex *kexResult) (iv, key, macKey []byte) { +// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as +// described in RFC 4253, section 6.4. direction should either be serverKeys +// (to setup server->client keys) or clientKeys (for client->server keys). +func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) { cipherMode := cipherModes[algs.Cipher] macMode := macModes[algs.MAC] - iv = make([]byte, cipherMode.ivSize) - key = make([]byte, cipherMode.keySize) - macKey = make([]byte, macMode.keySize) + iv := make([]byte, cipherMode.ivSize) + key := make([]byte, cipherMode.keySize) + macKey := make([]byte, macMode.keySize) generateKeyMaterial(iv, d.ivTag, kex) generateKeyMaterial(key, d.keyTag, kex) generateKeyMaterial(macKey, d.macKeyTag, kex) - return -} - -// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as -// described in RFC 4253, section 6.4. direction should either be serverKeys -// (to setup server->client keys) or clientKeys (for client->server keys). -func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) { - iv, key, macKey := generateKeys(d, algs, kex) - - if algs.Cipher == gcmCipherID { - return newGCMCipher(iv, key) - } - - if algs.Cipher == aes128cbcID { - return newAESCBCCipher(iv, key, macKey, algs) - } - - if algs.Cipher == tripledescbcID { - return newTripleDESCBCCipher(iv, key, macKey, algs) - } - c := &streamPacketCipher{ - mac: macModes[algs.MAC].new(macKey), - etm: macModes[algs.MAC].etm, - } - c.macResult = make([]byte, c.mac.Size()) - - var err error - c.cipher, err = cipherModes[algs.Cipher].createStream(key, iv) - if err != nil { - return nil, err - } - - return c, nil + return cipherModes[algs.Cipher].create(key, iv, macKey, algs) } // generateKeyMaterial fills out with key material generated from tag, K, H @@ -342,7 +313,7 @@ func readVersion(r io.Reader) ([]byte, error) { var ok bool var buf [1]byte - for len(versionString) < maxVersionStringBytes { + for length := 0; length < maxVersionStringBytes; length++ { _, err := io.ReadFull(r, buf[:]) if err != nil { return nil, err @@ -350,6 +321,13 @@ func readVersion(r io.Reader) ([]byte, error) { // The RFC says that the version should be terminated with \r\n // but several SSH servers actually only send a \n. if buf[0] == '\n' { + if !bytes.HasPrefix(versionString, []byte("SSH-")) { + // RFC 4253 says we need to ignore all version string lines + // except the one containing the SSH version (provided that + // all the lines do not exceed 255 bytes in total). + versionString = versionString[:0] + continue + } ok = true break } diff --git a/vendor/golang.org/x/net/.gitattributes b/vendor/golang.org/x/net/.gitattributes deleted file mode 100644 index d2f212e5da80..000000000000 --- a/vendor/golang.org/x/net/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -# Treat all files in this repo as binary, with no git magic updating -# line endings. Windows users contributing to Go will need to use a -# modern version of git and editors capable of LF line endings. -# -# We'll prevent accidental CRLF line endings from entering the repo -# via the git-review gofmt checks. -# -# See golang.org/issue/9281 - -* -text diff --git a/vendor/golang.org/x/net/.gitignore b/vendor/golang.org/x/net/.gitignore deleted file mode 100644 index 8339fd61d3f4..000000000000 --- a/vendor/golang.org/x/net/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Add no patterns to .hgignore except for files generated by the build. -last-change diff --git a/vendor/golang.org/x/net/AUTHORS b/vendor/golang.org/x/net/AUTHORS deleted file mode 100644 index 15167cd746c5..000000000000 --- a/vendor/golang.org/x/net/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/net/CONTRIBUTING.md b/vendor/golang.org/x/net/CONTRIBUTING.md deleted file mode 100644 index 88dff59bc7d2..000000000000 --- a/vendor/golang.org/x/net/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# Contributing to Go - -Go is an open source project. - -It is the work of hundreds of contributors. We appreciate your help! - - -## Filing issues - -When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. -The gophers there will answer or ask you to file an issue if you've tripped over a bug. - -## Contributing code - -Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) -before sending patches. - -**We do not accept GitHub pull requests** -(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). - -Unless otherwise noted, the Go source files are distributed under -the BSD-style license found in the LICENSE file. - diff --git a/vendor/golang.org/x/net/CONTRIBUTORS b/vendor/golang.org/x/net/CONTRIBUTORS deleted file mode 100644 index 1c4577e96806..000000000000 --- a/vendor/golang.org/x/net/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/net/README b/vendor/golang.org/x/net/README deleted file mode 100644 index 6b13d8e50502..000000000000 --- a/vendor/golang.org/x/net/README +++ /dev/null @@ -1,3 +0,0 @@ -This repository holds supplementary Go networking libraries. - -To submit changes to this repository, see http://golang.org/doc/contribute.html. diff --git a/vendor/golang.org/x/net/codereview.cfg b/vendor/golang.org/x/net/codereview.cfg deleted file mode 100644 index 3f8b14b64e83..000000000000 --- a/vendor/golang.org/x/net/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go index f143ed6a1eb0..a3c021d3f88e 100644 --- a/vendor/golang.org/x/net/context/context.go +++ b/vendor/golang.org/x/net/context/context.go @@ -5,6 +5,8 @@ // Package context defines the Context type, which carries deadlines, // cancelation signals, and other request-scoped values across API boundaries // and between processes. +// As of Go 1.7 this package is available in the standard library under the +// name context. https://golang.org/pkg/context. // // Incoming requests to a server should create a Context, and outgoing calls to // servers should accept a Context. The chain of function calls between must @@ -36,103 +38,6 @@ // Contexts. package context // import "golang.org/x/net/context" -import "time" - -// A Context carries a deadline, a cancelation signal, and other values across -// API boundaries. -// -// Context's methods may be called by multiple goroutines simultaneously. -type Context interface { - // Deadline returns the time when work done on behalf of this context - // should be canceled. Deadline returns ok==false when no deadline is - // set. Successive calls to Deadline return the same results. - Deadline() (deadline time.Time, ok bool) - - // Done returns a channel that's closed when work done on behalf of this - // context should be canceled. Done may return nil if this context can - // never be canceled. Successive calls to Done return the same value. - // - // WithCancel arranges for Done to be closed when cancel is called; - // WithDeadline arranges for Done to be closed when the deadline - // expires; WithTimeout arranges for Done to be closed when the timeout - // elapses. - // - // Done is provided for use in select statements: - // - // // Stream generates values with DoSomething and sends them to out - // // until DoSomething returns an error or ctx.Done is closed. - // func Stream(ctx context.Context, out chan<- Value) error { - // for { - // v, err := DoSomething(ctx) - // if err != nil { - // return err - // } - // select { - // case <-ctx.Done(): - // return ctx.Err() - // case out <- v: - // } - // } - // } - // - // See http://blog.golang.org/pipelines for more examples of how to use - // a Done channel for cancelation. - Done() <-chan struct{} - - // Err returns a non-nil error value after Done is closed. Err returns - // Canceled if the context was canceled or DeadlineExceeded if the - // context's deadline passed. No other values for Err are defined. - // After Done is closed, successive calls to Err return the same value. - Err() error - - // Value returns the value associated with this context for key, or nil - // if no value is associated with key. Successive calls to Value with - // the same key returns the same result. - // - // Use context values only for request-scoped data that transits - // processes and API boundaries, not for passing optional parameters to - // functions. - // - // A key identifies a specific value in a Context. Functions that wish - // to store values in Context typically allocate a key in a global - // variable then use that key as the argument to context.WithValue and - // Context.Value. A key can be any type that supports equality; - // packages should define keys as an unexported type to avoid - // collisions. - // - // Packages that define a Context key should provide type-safe accessors - // for the values stores using that key: - // - // // Package user defines a User type that's stored in Contexts. - // package user - // - // import "golang.org/x/net/context" - // - // // User is the type of value stored in the Contexts. - // type User struct {...} - // - // // key is an unexported type for keys defined in this package. - // // This prevents collisions with keys defined in other packages. - // type key int - // - // // userKey is the key for user.User values in Contexts. It is - // // unexported; clients use user.NewContext and user.FromContext - // // instead of using this key directly. - // var userKey key = 0 - // - // // NewContext returns a new Context that carries value u. - // func NewContext(ctx context.Context, u *User) context.Context { - // return context.WithValue(ctx, userKey, u) - // } - // - // // FromContext returns the User value stored in ctx, if any. - // func FromContext(ctx context.Context) (*User, bool) { - // u, ok := ctx.Value(userKey).(*User) - // return u, ok - // } - Value(key interface{}) interface{} -} - // Background returns a non-nil, empty Context. It is never canceled, has no // values, and has no deadline. It is typically used by the main function, // initialization, and tests, and as the top-level Context for incoming @@ -149,8 +54,3 @@ func Background() Context { func TODO() Context { return todo } - -// A CancelFunc tells an operation to abandon its work. -// A CancelFunc does not wait for the work to stop. -// After the first call, subsequent calls to a CancelFunc do nothing. -type CancelFunc func() diff --git a/vendor/golang.org/x/net/context/go19.go b/vendor/golang.org/x/net/context/go19.go new file mode 100644 index 000000000000..d88bd1db127d --- /dev/null +++ b/vendor/golang.org/x/net/context/go19.go @@ -0,0 +1,20 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.9 + +package context + +import "context" // standard library's context, as of Go 1.7 + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context = context.Context + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc = context.CancelFunc diff --git a/vendor/golang.org/x/net/context/pre_go19.go b/vendor/golang.org/x/net/context/pre_go19.go new file mode 100644 index 000000000000..b105f80be4fe --- /dev/null +++ b/vendor/golang.org/x/net/context/pre_go19.go @@ -0,0 +1,109 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.9 + +package context + +import "time" + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context interface { + // Deadline returns the time when work done on behalf of this context + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. + Deadline() (deadline time.Time, ok bool) + + // Done returns a channel that's closed when work done on behalf of this + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. + // + // WithCancel arranges for Done to be closed when cancel is called; + // WithDeadline arranges for Done to be closed when the deadline + // expires; WithTimeout arranges for Done to be closed when the timeout + // elapses. + // + // Done is provided for use in select statements: + // + // // Stream generates values with DoSomething and sends them to out + // // until DoSomething returns an error or ctx.Done is closed. + // func Stream(ctx context.Context, out chan<- Value) error { + // for { + // v, err := DoSomething(ctx) + // if err != nil { + // return err + // } + // select { + // case <-ctx.Done(): + // return ctx.Err() + // case out <- v: + // } + // } + // } + // + // See http://blog.golang.org/pipelines for more examples of how to use + // a Done channel for cancelation. + Done() <-chan struct{} + + // Err returns a non-nil error value after Done is closed. Err returns + // Canceled if the context was canceled or DeadlineExceeded if the + // context's deadline passed. No other values for Err are defined. + // After Done is closed, successive calls to Err return the same value. + Err() error + + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. Successive calls to Value with + // the same key returns the same result. + // + // Use context values only for request-scoped data that transits + // processes and API boundaries, not for passing optional parameters to + // functions. + // + // A key identifies a specific value in a Context. Functions that wish + // to store values in Context typically allocate a key in a global + // variable then use that key as the argument to context.WithValue and + // Context.Value. A key can be any type that supports equality; + // packages should define keys as an unexported type to avoid + // collisions. + // + // Packages that define a Context key should provide type-safe accessors + // for the values stores using that key: + // + // // Package user defines a User type that's stored in Contexts. + // package user + // + // import "golang.org/x/net/context" + // + // // User is the type of value stored in the Contexts. + // type User struct {...} + // + // // key is an unexported type for keys defined in this package. + // // This prevents collisions with keys defined in other packages. + // type key int + // + // // userKey is the key for user.User values in Contexts. It is + // // unexported; clients use user.NewContext and user.FromContext + // // instead of using this key directly. + // var userKey key = 0 + // + // // NewContext returns a new Context that carries value u. + // func NewContext(ctx context.Context, u *User) context.Context { + // return context.WithValue(ctx, userKey, u) + // } + // + // // FromContext returns the User value stored in ctx, if any. + // func FromContext(ctx context.Context) (*User, bool) { + // u, ok := ctx.Value(userKey).(*User) + // return u, ok + // } + Value(key interface{}) interface{} +} + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc func() diff --git a/vendor/golang.org/x/net/html/atom/gen.go b/vendor/golang.org/x/net/html/atom/gen.go deleted file mode 100644 index 6bfa86601987..000000000000 --- a/vendor/golang.org/x/net/html/atom/gen.go +++ /dev/null @@ -1,648 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This program generates table.go and table_test.go. -// Invoke as -// -// go run gen.go |gofmt >table.go -// go run gen.go -test |gofmt >table_test.go - -import ( - "flag" - "fmt" - "math/rand" - "os" - "sort" - "strings" -) - -// identifier converts s to a Go exported identifier. -// It converts "div" to "Div" and "accept-charset" to "AcceptCharset". -func identifier(s string) string { - b := make([]byte, 0, len(s)) - cap := true - for _, c := range s { - if c == '-' { - cap = true - continue - } - if cap && 'a' <= c && c <= 'z' { - c -= 'a' - 'A' - } - cap = false - b = append(b, byte(c)) - } - return string(b) -} - -var test = flag.Bool("test", false, "generate table_test.go") - -func main() { - flag.Parse() - - var all []string - all = append(all, elements...) - all = append(all, attributes...) - all = append(all, eventHandlers...) - all = append(all, extra...) - sort.Strings(all) - - if *test { - fmt.Printf("// generated by go run gen.go -test; DO NOT EDIT\n\n") - fmt.Printf("package atom\n\n") - fmt.Printf("var testAtomList = []string{\n") - for _, s := range all { - fmt.Printf("\t%q,\n", s) - } - fmt.Printf("}\n") - return - } - - // uniq - lists have dups - // compute max len too - maxLen := 0 - w := 0 - for _, s := range all { - if w == 0 || all[w-1] != s { - if maxLen < len(s) { - maxLen = len(s) - } - all[w] = s - w++ - } - } - all = all[:w] - - // Find hash that minimizes table size. - var best *table - for i := 0; i < 1000000; i++ { - if best != nil && 1<<(best.k-1) < len(all) { - break - } - h := rand.Uint32() - for k := uint(0); k <= 16; k++ { - if best != nil && k >= best.k { - break - } - var t table - if t.init(h, k, all) { - best = &t - break - } - } - } - if best == nil { - fmt.Fprintf(os.Stderr, "failed to construct string table\n") - os.Exit(1) - } - - // Lay out strings, using overlaps when possible. - layout := append([]string{}, all...) - - // Remove strings that are substrings of other strings - for changed := true; changed; { - changed = false - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i != j && t != "" && strings.Contains(s, t) { - changed = true - layout[j] = "" - } - } - } - } - - // Join strings where one suffix matches another prefix. - for { - // Find best i, j, k such that layout[i][len-k:] == layout[j][:k], - // maximizing overlap length k. - besti := -1 - bestj := -1 - bestk := 0 - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i == j { - continue - } - for k := bestk + 1; k <= len(s) && k <= len(t); k++ { - if s[len(s)-k:] == t[:k] { - besti = i - bestj = j - bestk = k - } - } - } - } - if bestk > 0 { - layout[besti] += layout[bestj][bestk:] - layout[bestj] = "" - continue - } - break - } - - text := strings.Join(layout, "") - - atom := map[string]uint32{} - for _, s := range all { - off := strings.Index(text, s) - if off < 0 { - panic("lost string " + s) - } - atom[s] = uint32(off<<8 | len(s)) - } - - // Generate the Go code. - fmt.Printf("// generated by go run gen.go; DO NOT EDIT\n\n") - fmt.Printf("package atom\n\nconst (\n") - for _, s := range all { - fmt.Printf("\t%s Atom = %#x\n", identifier(s), atom[s]) - } - fmt.Printf(")\n\n") - - fmt.Printf("const hash0 = %#x\n\n", best.h0) - fmt.Printf("const maxAtomLen = %d\n\n", maxLen) - - fmt.Printf("var table = [1<<%d]Atom{\n", best.k) - for i, s := range best.tab { - if s == "" { - continue - } - fmt.Printf("\t%#x: %#x, // %s\n", i, atom[s], s) - } - fmt.Printf("}\n") - datasize := (1 << best.k) * 4 - - fmt.Printf("const atomText =\n") - textsize := len(text) - for len(text) > 60 { - fmt.Printf("\t%q +\n", text[:60]) - text = text[60:] - } - fmt.Printf("\t%q\n\n", text) - - fmt.Fprintf(os.Stderr, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) -} - -type byLen []string - -func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } -func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x byLen) Len() int { return len(x) } - -// fnv computes the FNV hash with an arbitrary starting value h. -func fnv(h uint32, s string) uint32 { - for i := 0; i < len(s); i++ { - h ^= uint32(s[i]) - h *= 16777619 - } - return h -} - -// A table represents an attempt at constructing the lookup table. -// The lookup table uses cuckoo hashing, meaning that each string -// can be found in one of two positions. -type table struct { - h0 uint32 - k uint - mask uint32 - tab []string -} - -// hash returns the two hashes for s. -func (t *table) hash(s string) (h1, h2 uint32) { - h := fnv(t.h0, s) - h1 = h & t.mask - h2 = (h >> 16) & t.mask - return -} - -// init initializes the table with the given parameters. -// h0 is the initial hash value, -// k is the number of bits of hash value to use, and -// x is the list of strings to store in the table. -// init returns false if the table cannot be constructed. -func (t *table) init(h0 uint32, k uint, x []string) bool { - t.h0 = h0 - t.k = k - t.tab = make([]string, 1< len(t.tab) { - return false - } - s := t.tab[i] - h1, h2 := t.hash(s) - j := h1 + h2 - i - if t.tab[j] != "" && !t.push(j, depth+1) { - return false - } - t.tab[j] = s - return true -} - -// The lists of element names and attribute keys were taken from -// https://html.spec.whatwg.org/multipage/indices.html#index -// as of the "HTML Living Standard - Last Updated 21 February 2015" version. - -var elements = []string{ - "a", - "abbr", - "address", - "area", - "article", - "aside", - "audio", - "b", - "base", - "bdi", - "bdo", - "blockquote", - "body", - "br", - "button", - "canvas", - "caption", - "cite", - "code", - "col", - "colgroup", - "command", - "data", - "datalist", - "dd", - "del", - "details", - "dfn", - "dialog", - "div", - "dl", - "dt", - "em", - "embed", - "fieldset", - "figcaption", - "figure", - "footer", - "form", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "head", - "header", - "hgroup", - "hr", - "html", - "i", - "iframe", - "img", - "input", - "ins", - "kbd", - "keygen", - "label", - "legend", - "li", - "link", - "map", - "mark", - "menu", - "menuitem", - "meta", - "meter", - "nav", - "noscript", - "object", - "ol", - "optgroup", - "option", - "output", - "p", - "param", - "pre", - "progress", - "q", - "rp", - "rt", - "ruby", - "s", - "samp", - "script", - "section", - "select", - "small", - "source", - "span", - "strong", - "style", - "sub", - "summary", - "sup", - "table", - "tbody", - "td", - "template", - "textarea", - "tfoot", - "th", - "thead", - "time", - "title", - "tr", - "track", - "u", - "ul", - "var", - "video", - "wbr", -} - -// https://html.spec.whatwg.org/multipage/indices.html#attributes-3 - -var attributes = []string{ - "abbr", - "accept", - "accept-charset", - "accesskey", - "action", - "alt", - "async", - "autocomplete", - "autofocus", - "autoplay", - "challenge", - "charset", - "checked", - "cite", - "class", - "cols", - "colspan", - "command", - "content", - "contenteditable", - "contextmenu", - "controls", - "coords", - "crossorigin", - "data", - "datetime", - "default", - "defer", - "dir", - "dirname", - "disabled", - "download", - "draggable", - "dropzone", - "enctype", - "for", - "form", - "formaction", - "formenctype", - "formmethod", - "formnovalidate", - "formtarget", - "headers", - "height", - "hidden", - "high", - "href", - "hreflang", - "http-equiv", - "icon", - "id", - "inputmode", - "ismap", - "itemid", - "itemprop", - "itemref", - "itemscope", - "itemtype", - "keytype", - "kind", - "label", - "lang", - "list", - "loop", - "low", - "manifest", - "max", - "maxlength", - "media", - "mediagroup", - "method", - "min", - "minlength", - "multiple", - "muted", - "name", - "novalidate", - "open", - "optimum", - "pattern", - "ping", - "placeholder", - "poster", - "preload", - "radiogroup", - "readonly", - "rel", - "required", - "reversed", - "rows", - "rowspan", - "sandbox", - "spellcheck", - "scope", - "scoped", - "seamless", - "selected", - "shape", - "size", - "sizes", - "sortable", - "sorted", - "span", - "src", - "srcdoc", - "srclang", - "start", - "step", - "style", - "tabindex", - "target", - "title", - "translate", - "type", - "typemustmatch", - "usemap", - "value", - "width", - "wrap", -} - -var eventHandlers = []string{ - "onabort", - "onautocomplete", - "onautocompleteerror", - "onafterprint", - "onbeforeprint", - "onbeforeunload", - "onblur", - "oncancel", - "oncanplay", - "oncanplaythrough", - "onchange", - "onclick", - "onclose", - "oncontextmenu", - "oncuechange", - "ondblclick", - "ondrag", - "ondragend", - "ondragenter", - "ondragleave", - "ondragover", - "ondragstart", - "ondrop", - "ondurationchange", - "onemptied", - "onended", - "onerror", - "onfocus", - "onhashchange", - "oninput", - "oninvalid", - "onkeydown", - "onkeypress", - "onkeyup", - "onlanguagechange", - "onload", - "onloadeddata", - "onloadedmetadata", - "onloadstart", - "onmessage", - "onmousedown", - "onmousemove", - "onmouseout", - "onmouseover", - "onmouseup", - "onmousewheel", - "onoffline", - "ononline", - "onpagehide", - "onpageshow", - "onpause", - "onplay", - "onplaying", - "onpopstate", - "onprogress", - "onratechange", - "onreset", - "onresize", - "onscroll", - "onseeked", - "onseeking", - "onselect", - "onshow", - "onsort", - "onstalled", - "onstorage", - "onsubmit", - "onsuspend", - "ontimeupdate", - "ontoggle", - "onunload", - "onvolumechange", - "onwaiting", -} - -// extra are ad-hoc values not covered by any of the lists above. -var extra = []string{ - "align", - "annotation", - "annotation-xml", - "applet", - "basefont", - "bgsound", - "big", - "blink", - "center", - "color", - "desc", - "face", - "font", - "foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive. - "foreignobject", - "frame", - "frameset", - "image", - "isindex", - "listing", - "malignmark", - "marquee", - "math", - "mglyph", - "mi", - "mn", - "mo", - "ms", - "mtext", - "nobr", - "noembed", - "noframes", - "plaintext", - "prompt", - "public", - "spacer", - "strike", - "svg", - "system", - "tt", - "xmp", -} diff --git a/vendor/golang.org/x/net/html/atom/table.go b/vendor/golang.org/x/net/html/atom/table.go index 2605ba3102f6..2a938864cb9d 100644 --- a/vendor/golang.org/x/net/html/atom/table.go +++ b/vendor/golang.org/x/net/html/atom/table.go @@ -1,713 +1,783 @@ -// generated by go run gen.go; DO NOT EDIT +// Code generated by go generate gen.go; DO NOT EDIT. + +//go:generate go run gen.go package atom const ( - A Atom = 0x1 - Abbr Atom = 0x4 - Accept Atom = 0x2106 - AcceptCharset Atom = 0x210e - Accesskey Atom = 0x3309 - Action Atom = 0x1f606 - Address Atom = 0x4f307 - Align Atom = 0x1105 - Alt Atom = 0x4503 - Annotation Atom = 0x1670a - AnnotationXml Atom = 0x1670e - Applet Atom = 0x2b306 - Area Atom = 0x2fa04 - Article Atom = 0x38807 - Aside Atom = 0x8305 - Async Atom = 0x7b05 - Audio Atom = 0xa605 - Autocomplete Atom = 0x1fc0c - Autofocus Atom = 0xb309 - Autoplay Atom = 0xce08 - B Atom = 0x101 - Base Atom = 0xd604 - Basefont Atom = 0xd608 - Bdi Atom = 0x1a03 - Bdo Atom = 0xe703 - Bgsound Atom = 0x11807 - Big Atom = 0x12403 - Blink Atom = 0x12705 - Blockquote Atom = 0x12c0a - Body Atom = 0x2f04 - Br Atom = 0x202 - Button Atom = 0x13606 - Canvas Atom = 0x7f06 - Caption Atom = 0x1bb07 - Center Atom = 0x5b506 - Challenge Atom = 0x21f09 - Charset Atom = 0x2807 - Checked Atom = 0x32807 - Cite Atom = 0x3c804 - Class Atom = 0x4de05 - Code Atom = 0x14904 - Col Atom = 0x15003 - Colgroup Atom = 0x15008 - Color Atom = 0x15d05 - Cols Atom = 0x16204 - Colspan Atom = 0x16207 - Command Atom = 0x17507 - Content Atom = 0x42307 - Contenteditable Atom = 0x4230f - Contextmenu Atom = 0x3310b - Controls Atom = 0x18808 - Coords Atom = 0x19406 - Crossorigin Atom = 0x19f0b - Data Atom = 0x44a04 - Datalist Atom = 0x44a08 - Datetime Atom = 0x23c08 - Dd Atom = 0x26702 - Default Atom = 0x8607 - Defer Atom = 0x14b05 - Del Atom = 0x3ef03 - Desc Atom = 0x4db04 - Details Atom = 0x4807 - Dfn Atom = 0x6103 - Dialog Atom = 0x1b06 - Dir Atom = 0x6903 - Dirname Atom = 0x6907 - Disabled Atom = 0x10c08 - Div Atom = 0x11303 - Dl Atom = 0x11e02 - Download Atom = 0x40008 - Draggable Atom = 0x17b09 - Dropzone Atom = 0x39108 - Dt Atom = 0x50902 - Em Atom = 0x6502 - Embed Atom = 0x6505 - Enctype Atom = 0x21107 - Face Atom = 0x5b304 - Fieldset Atom = 0x1b008 - Figcaption Atom = 0x1b80a - Figure Atom = 0x1cc06 - Font Atom = 0xda04 - Footer Atom = 0x8d06 - For Atom = 0x1d803 - ForeignObject Atom = 0x1d80d - Foreignobject Atom = 0x1e50d - Form Atom = 0x1f204 - Formaction Atom = 0x1f20a - Formenctype Atom = 0x20d0b - Formmethod Atom = 0x2280a - Formnovalidate Atom = 0x2320e - Formtarget Atom = 0x2470a - Frame Atom = 0x9a05 - Frameset Atom = 0x9a08 - H1 Atom = 0x26e02 - H2 Atom = 0x29402 - H3 Atom = 0x2a702 - H4 Atom = 0x2e902 - H5 Atom = 0x2f302 - H6 Atom = 0x50b02 - Head Atom = 0x2d504 - Header Atom = 0x2d506 - Headers Atom = 0x2d507 - Height Atom = 0x25106 - Hgroup Atom = 0x25906 - Hidden Atom = 0x26506 - High Atom = 0x26b04 - Hr Atom = 0x27002 - Href Atom = 0x27004 - Hreflang Atom = 0x27008 - Html Atom = 0x25504 - HttpEquiv Atom = 0x2780a - I Atom = 0x601 - Icon Atom = 0x42204 - Id Atom = 0x8502 - Iframe Atom = 0x29606 - Image Atom = 0x29c05 - Img Atom = 0x2a103 - Input Atom = 0x3e805 - Inputmode Atom = 0x3e809 - Ins Atom = 0x1a803 - Isindex Atom = 0x2a907 - Ismap Atom = 0x2b005 - Itemid Atom = 0x33c06 - Itemprop Atom = 0x3c908 - Itemref Atom = 0x5ad07 - Itemscope Atom = 0x2b909 - Itemtype Atom = 0x2c308 - Kbd Atom = 0x1903 - Keygen Atom = 0x3906 - Keytype Atom = 0x53707 - Kind Atom = 0x10904 - Label Atom = 0xf005 - Lang Atom = 0x27404 - Legend Atom = 0x18206 - Li Atom = 0x1202 - Link Atom = 0x12804 - List Atom = 0x44e04 - Listing Atom = 0x44e07 - Loop Atom = 0xf404 - Low Atom = 0x11f03 - Malignmark Atom = 0x100a - Manifest Atom = 0x5f108 - Map Atom = 0x2b203 - Mark Atom = 0x1604 - Marquee Atom = 0x2cb07 - Math Atom = 0x2d204 - Max Atom = 0x2e103 - Maxlength Atom = 0x2e109 - Media Atom = 0x6e05 - Mediagroup Atom = 0x6e0a - Menu Atom = 0x33804 - Menuitem Atom = 0x33808 - Meta Atom = 0x45d04 - Meter Atom = 0x24205 - Method Atom = 0x22c06 - Mglyph Atom = 0x2a206 - Mi Atom = 0x2eb02 - Min Atom = 0x2eb03 - Minlength Atom = 0x2eb09 - Mn Atom = 0x23502 - Mo Atom = 0x3ed02 - Ms Atom = 0x2bc02 - Mtext Atom = 0x2f505 - Multiple Atom = 0x30308 - Muted Atom = 0x30b05 - Name Atom = 0x6c04 - Nav Atom = 0x3e03 - Nobr Atom = 0x5704 - Noembed Atom = 0x6307 - Noframes Atom = 0x9808 - Noscript Atom = 0x3d208 - Novalidate Atom = 0x2360a - Object Atom = 0x1ec06 - Ol Atom = 0xc902 - Onabort Atom = 0x13a07 - Onafterprint Atom = 0x1c00c - Onautocomplete Atom = 0x1fa0e - Onautocompleteerror Atom = 0x1fa13 - Onbeforeprint Atom = 0x6040d - Onbeforeunload Atom = 0x4e70e - Onblur Atom = 0xaa06 - Oncancel Atom = 0xe908 - Oncanplay Atom = 0x28509 - Oncanplaythrough Atom = 0x28510 - Onchange Atom = 0x3a708 - Onclick Atom = 0x31007 - Onclose Atom = 0x31707 - Oncontextmenu Atom = 0x32f0d - Oncuechange Atom = 0x3420b - Ondblclick Atom = 0x34d0a - Ondrag Atom = 0x35706 - Ondragend Atom = 0x35709 - Ondragenter Atom = 0x3600b - Ondragleave Atom = 0x36b0b - Ondragover Atom = 0x3760a - Ondragstart Atom = 0x3800b - Ondrop Atom = 0x38f06 - Ondurationchange Atom = 0x39f10 - Onemptied Atom = 0x39609 - Onended Atom = 0x3af07 - Onerror Atom = 0x3b607 - Onfocus Atom = 0x3bd07 - Onhashchange Atom = 0x3da0c - Oninput Atom = 0x3e607 - Oninvalid Atom = 0x3f209 - Onkeydown Atom = 0x3fb09 - Onkeypress Atom = 0x4080a - Onkeyup Atom = 0x41807 - Onlanguagechange Atom = 0x43210 - Onload Atom = 0x44206 - Onloadeddata Atom = 0x4420c - Onloadedmetadata Atom = 0x45510 - Onloadstart Atom = 0x46b0b - Onmessage Atom = 0x47609 - Onmousedown Atom = 0x47f0b - Onmousemove Atom = 0x48a0b - Onmouseout Atom = 0x4950a - Onmouseover Atom = 0x4a20b - Onmouseup Atom = 0x4ad09 - Onmousewheel Atom = 0x4b60c - Onoffline Atom = 0x4c209 - Ononline Atom = 0x4cb08 - Onpagehide Atom = 0x4d30a - Onpageshow Atom = 0x4fe0a - Onpause Atom = 0x50d07 - Onplay Atom = 0x51706 - Onplaying Atom = 0x51709 - Onpopstate Atom = 0x5200a - Onprogress Atom = 0x52a0a - Onratechange Atom = 0x53e0c - Onreset Atom = 0x54a07 - Onresize Atom = 0x55108 - Onscroll Atom = 0x55f08 - Onseeked Atom = 0x56708 - Onseeking Atom = 0x56f09 - Onselect Atom = 0x57808 - Onshow Atom = 0x58206 - Onsort Atom = 0x58b06 - Onstalled Atom = 0x59509 - Onstorage Atom = 0x59e09 - Onsubmit Atom = 0x5a708 - Onsuspend Atom = 0x5bb09 - Ontimeupdate Atom = 0xdb0c - Ontoggle Atom = 0x5c408 - Onunload Atom = 0x5cc08 - Onvolumechange Atom = 0x5d40e - Onwaiting Atom = 0x5e209 - Open Atom = 0x3cf04 - Optgroup Atom = 0xf608 - Optimum Atom = 0x5eb07 - Option Atom = 0x60006 - Output Atom = 0x49c06 - P Atom = 0xc01 - Param Atom = 0xc05 - Pattern Atom = 0x5107 - Ping Atom = 0x7704 - Placeholder Atom = 0xc30b - Plaintext Atom = 0xfd09 - Poster Atom = 0x15706 - Pre Atom = 0x25e03 - Preload Atom = 0x25e07 - Progress Atom = 0x52c08 - Prompt Atom = 0x5fa06 - Public Atom = 0x41e06 - Q Atom = 0x13101 - Radiogroup Atom = 0x30a - Readonly Atom = 0x2fb08 - Rel Atom = 0x25f03 - Required Atom = 0x1d008 - Reversed Atom = 0x5a08 - Rows Atom = 0x9204 - Rowspan Atom = 0x9207 - Rp Atom = 0x1c602 - Rt Atom = 0x13f02 - Ruby Atom = 0xaf04 - S Atom = 0x2c01 - Samp Atom = 0x4e04 - Sandbox Atom = 0xbb07 - Scope Atom = 0x2bd05 - Scoped Atom = 0x2bd06 - Script Atom = 0x3d406 - Seamless Atom = 0x31c08 - Section Atom = 0x4e207 - Select Atom = 0x57a06 - Selected Atom = 0x57a08 - Shape Atom = 0x4f905 - Size Atom = 0x55504 - Sizes Atom = 0x55505 - Small Atom = 0x18f05 - Sortable Atom = 0x58d08 - Sorted Atom = 0x19906 - Source Atom = 0x1aa06 - Spacer Atom = 0x2db06 - Span Atom = 0x9504 - Spellcheck Atom = 0x3230a - Src Atom = 0x3c303 - Srcdoc Atom = 0x3c306 - Srclang Atom = 0x41107 - Start Atom = 0x38605 - Step Atom = 0x5f704 - Strike Atom = 0x53306 - Strong Atom = 0x55906 - Style Atom = 0x61105 - Sub Atom = 0x5a903 - Summary Atom = 0x61607 - Sup Atom = 0x61d03 - Svg Atom = 0x62003 - System Atom = 0x62306 - Tabindex Atom = 0x46308 - Table Atom = 0x42d05 - Target Atom = 0x24b06 - Tbody Atom = 0x2e05 - Td Atom = 0x4702 - Template Atom = 0x62608 - Textarea Atom = 0x2f608 - Tfoot Atom = 0x8c05 - Th Atom = 0x22e02 - Thead Atom = 0x2d405 - Time Atom = 0xdd04 - Title Atom = 0xa105 - Tr Atom = 0x10502 - Track Atom = 0x10505 - Translate Atom = 0x14009 - Tt Atom = 0x5302 - Type Atom = 0x21404 - Typemustmatch Atom = 0x2140d - U Atom = 0xb01 - Ul Atom = 0x8a02 - Usemap Atom = 0x51106 - Value Atom = 0x4005 - Var Atom = 0x11503 - Video Atom = 0x28105 - Wbr Atom = 0x12103 - Width Atom = 0x50705 - Wrap Atom = 0x58704 - Xmp Atom = 0xc103 + A Atom = 0x1 + Abbr Atom = 0x4 + Accept Atom = 0x1a06 + AcceptCharset Atom = 0x1a0e + Accesskey Atom = 0x2c09 + Acronym Atom = 0xaa07 + Action Atom = 0x27206 + Address Atom = 0x6f307 + Align Atom = 0xb105 + Allowfullscreen Atom = 0x2080f + Allowpaymentrequest Atom = 0xc113 + Allowusermedia Atom = 0xdd0e + Alt Atom = 0xf303 + Annotation Atom = 0x1c90a + AnnotationXml Atom = 0x1c90e + Applet Atom = 0x31906 + Area Atom = 0x35604 + Article Atom = 0x3fc07 + As Atom = 0x3c02 + Aside Atom = 0x10705 + Async Atom = 0xff05 + Audio Atom = 0x11505 + Autocomplete Atom = 0x2780c + Autofocus Atom = 0x12109 + Autoplay Atom = 0x13c08 + B Atom = 0x101 + Base Atom = 0x3b04 + Basefont Atom = 0x3b08 + Bdi Atom = 0xba03 + Bdo Atom = 0x14b03 + Bgsound Atom = 0x15e07 + Big Atom = 0x17003 + Blink Atom = 0x17305 + Blockquote Atom = 0x1870a + Body Atom = 0x2804 + Br Atom = 0x202 + Button Atom = 0x19106 + Canvas Atom = 0x10306 + Caption Atom = 0x23107 + Center Atom = 0x22006 + Challenge Atom = 0x29b09 + Charset Atom = 0x2107 + Checked Atom = 0x47907 + Cite Atom = 0x19c04 + Class Atom = 0x56405 + Code Atom = 0x5c504 + Col Atom = 0x1ab03 + Colgroup Atom = 0x1ab08 + Color Atom = 0x1bf05 + Cols Atom = 0x1c404 + Colspan Atom = 0x1c407 + Command Atom = 0x1d707 + Content Atom = 0x58b07 + Contenteditable Atom = 0x58b0f + Contextmenu Atom = 0x3800b + Controls Atom = 0x1de08 + Coords Atom = 0x1ea06 + Crossorigin Atom = 0x1fb0b + Data Atom = 0x4a504 + Datalist Atom = 0x4a508 + Datetime Atom = 0x2b808 + Dd Atom = 0x2d702 + Default Atom = 0x10a07 + Defer Atom = 0x5c705 + Del Atom = 0x45203 + Desc Atom = 0x56104 + Details Atom = 0x7207 + Dfn Atom = 0x8703 + Dialog Atom = 0xbb06 + Dir Atom = 0x9303 + Dirname Atom = 0x9307 + Disabled Atom = 0x16408 + Div Atom = 0x16b03 + Dl Atom = 0x5e602 + Download Atom = 0x46308 + Draggable Atom = 0x17a09 + Dropzone Atom = 0x40508 + Dt Atom = 0x64b02 + Em Atom = 0x6e02 + Embed Atom = 0x6e05 + Enctype Atom = 0x28d07 + Face Atom = 0x21e04 + Fieldset Atom = 0x22608 + Figcaption Atom = 0x22e0a + Figure Atom = 0x24806 + Font Atom = 0x3f04 + Footer Atom = 0xf606 + For Atom = 0x25403 + ForeignObject Atom = 0x2540d + Foreignobject Atom = 0x2610d + Form Atom = 0x26e04 + Formaction Atom = 0x26e0a + Formenctype Atom = 0x2890b + Formmethod Atom = 0x2a40a + Formnovalidate Atom = 0x2ae0e + Formtarget Atom = 0x2c00a + Frame Atom = 0x8b05 + Frameset Atom = 0x8b08 + H1 Atom = 0x15c02 + H2 Atom = 0x2de02 + H3 Atom = 0x30d02 + H4 Atom = 0x34502 + H5 Atom = 0x34f02 + H6 Atom = 0x64d02 + Head Atom = 0x33104 + Header Atom = 0x33106 + Headers Atom = 0x33107 + Height Atom = 0x5206 + Hgroup Atom = 0x2ca06 + Hidden Atom = 0x2d506 + High Atom = 0x2db04 + Hr Atom = 0x15702 + Href Atom = 0x2e004 + Hreflang Atom = 0x2e008 + Html Atom = 0x5604 + HttpEquiv Atom = 0x2e80a + I Atom = 0x601 + Icon Atom = 0x58a04 + Id Atom = 0x10902 + Iframe Atom = 0x2fc06 + Image Atom = 0x30205 + Img Atom = 0x30703 + Input Atom = 0x44b05 + Inputmode Atom = 0x44b09 + Ins Atom = 0x20403 + Integrity Atom = 0x23f09 + Is Atom = 0x16502 + Isindex Atom = 0x30f07 + Ismap Atom = 0x31605 + Itemid Atom = 0x38b06 + Itemprop Atom = 0x19d08 + Itemref Atom = 0x3cd07 + Itemscope Atom = 0x67109 + Itemtype Atom = 0x31f08 + Kbd Atom = 0xb903 + Keygen Atom = 0x3206 + Keytype Atom = 0xd607 + Kind Atom = 0x17704 + Label Atom = 0x5905 + Lang Atom = 0x2e404 + Legend Atom = 0x18106 + Li Atom = 0xb202 + Link Atom = 0x17404 + List Atom = 0x4a904 + Listing Atom = 0x4a907 + Loop Atom = 0x5d04 + Low Atom = 0xc303 + Main Atom = 0x1004 + Malignmark Atom = 0xb00a + Manifest Atom = 0x6d708 + Map Atom = 0x31803 + Mark Atom = 0xb604 + Marquee Atom = 0x32707 + Math Atom = 0x32e04 + Max Atom = 0x33d03 + Maxlength Atom = 0x33d09 + Media Atom = 0xe605 + Mediagroup Atom = 0xe60a + Menu Atom = 0x38704 + Menuitem Atom = 0x38708 + Meta Atom = 0x4b804 + Meter Atom = 0x9805 + Method Atom = 0x2a806 + Mglyph Atom = 0x30806 + Mi Atom = 0x34702 + Min Atom = 0x34703 + Minlength Atom = 0x34709 + Mn Atom = 0x2b102 + Mo Atom = 0xa402 + Ms Atom = 0x67402 + Mtext Atom = 0x35105 + Multiple Atom = 0x35f08 + Muted Atom = 0x36705 + Name Atom = 0x9604 + Nav Atom = 0x1303 + Nobr Atom = 0x3704 + Noembed Atom = 0x6c07 + Noframes Atom = 0x8908 + Nomodule Atom = 0xa208 + Nonce Atom = 0x1a605 + Noscript Atom = 0x21608 + Novalidate Atom = 0x2b20a + Object Atom = 0x26806 + Ol Atom = 0x13702 + Onabort Atom = 0x19507 + Onafterprint Atom = 0x2360c + Onautocomplete Atom = 0x2760e + Onautocompleteerror Atom = 0x27613 + Onauxclick Atom = 0x61f0a + Onbeforeprint Atom = 0x69e0d + Onbeforeunload Atom = 0x6e70e + Onblur Atom = 0x56d06 + Oncancel Atom = 0x11908 + Oncanplay Atom = 0x14d09 + Oncanplaythrough Atom = 0x14d10 + Onchange Atom = 0x41b08 + Onclick Atom = 0x2f507 + Onclose Atom = 0x36c07 + Oncontextmenu Atom = 0x37e0d + Oncopy Atom = 0x39106 + Oncuechange Atom = 0x3970b + Oncut Atom = 0x3a205 + Ondblclick Atom = 0x3a70a + Ondrag Atom = 0x3b106 + Ondragend Atom = 0x3b109 + Ondragenter Atom = 0x3ba0b + Ondragexit Atom = 0x3c50a + Ondragleave Atom = 0x3df0b + Ondragover Atom = 0x3ea0a + Ondragstart Atom = 0x3f40b + Ondrop Atom = 0x40306 + Ondurationchange Atom = 0x41310 + Onemptied Atom = 0x40a09 + Onended Atom = 0x42307 + Onerror Atom = 0x42a07 + Onfocus Atom = 0x43107 + Onhashchange Atom = 0x43d0c + Oninput Atom = 0x44907 + Oninvalid Atom = 0x45509 + Onkeydown Atom = 0x45e09 + Onkeypress Atom = 0x46b0a + Onkeyup Atom = 0x48007 + Onlanguagechange Atom = 0x48d10 + Onload Atom = 0x49d06 + Onloadeddata Atom = 0x49d0c + Onloadedmetadata Atom = 0x4b010 + Onloadend Atom = 0x4c609 + Onloadstart Atom = 0x4cf0b + Onmessage Atom = 0x4da09 + Onmessageerror Atom = 0x4da0e + Onmousedown Atom = 0x4e80b + Onmouseenter Atom = 0x4f30c + Onmouseleave Atom = 0x4ff0c + Onmousemove Atom = 0x50b0b + Onmouseout Atom = 0x5160a + Onmouseover Atom = 0x5230b + Onmouseup Atom = 0x52e09 + Onmousewheel Atom = 0x53c0c + Onoffline Atom = 0x54809 + Ononline Atom = 0x55108 + Onpagehide Atom = 0x5590a + Onpageshow Atom = 0x5730a + Onpaste Atom = 0x57f07 + Onpause Atom = 0x59a07 + Onplay Atom = 0x5a406 + Onplaying Atom = 0x5a409 + Onpopstate Atom = 0x5ad0a + Onprogress Atom = 0x5b70a + Onratechange Atom = 0x5cc0c + Onrejectionhandled Atom = 0x5d812 + Onreset Atom = 0x5ea07 + Onresize Atom = 0x5f108 + Onscroll Atom = 0x60008 + Onsecuritypolicyviolation Atom = 0x60819 + Onseeked Atom = 0x62908 + Onseeking Atom = 0x63109 + Onselect Atom = 0x63a08 + Onshow Atom = 0x64406 + Onsort Atom = 0x64f06 + Onstalled Atom = 0x65909 + Onstorage Atom = 0x66209 + Onsubmit Atom = 0x66b08 + Onsuspend Atom = 0x67b09 + Ontimeupdate Atom = 0x400c + Ontoggle Atom = 0x68408 + Onunhandledrejection Atom = 0x68c14 + Onunload Atom = 0x6ab08 + Onvolumechange Atom = 0x6b30e + Onwaiting Atom = 0x6c109 + Onwheel Atom = 0x6ca07 + Open Atom = 0x1a304 + Optgroup Atom = 0x5f08 + Optimum Atom = 0x6d107 + Option Atom = 0x6e306 + Output Atom = 0x51d06 + P Atom = 0xc01 + Param Atom = 0xc05 + Pattern Atom = 0x6607 + Picture Atom = 0x7b07 + Ping Atom = 0xef04 + Placeholder Atom = 0x1310b + Plaintext Atom = 0x1b209 + Playsinline Atom = 0x1400b + Poster Atom = 0x2cf06 + Pre Atom = 0x47003 + Preload Atom = 0x48607 + Progress Atom = 0x5b908 + Prompt Atom = 0x53606 + Public Atom = 0x58606 + Q Atom = 0xcf01 + Radiogroup Atom = 0x30a + Rb Atom = 0x3a02 + Readonly Atom = 0x35708 + Referrerpolicy Atom = 0x3d10e + Rel Atom = 0x48703 + Required Atom = 0x24c08 + Reversed Atom = 0x8008 + Rows Atom = 0x9c04 + Rowspan Atom = 0x9c07 + Rp Atom = 0x23c02 + Rt Atom = 0x19a02 + Rtc Atom = 0x19a03 + Ruby Atom = 0xfb04 + S Atom = 0x2501 + Samp Atom = 0x7804 + Sandbox Atom = 0x12907 + Scope Atom = 0x67505 + Scoped Atom = 0x67506 + Script Atom = 0x21806 + Seamless Atom = 0x37108 + Section Atom = 0x56807 + Select Atom = 0x63c06 + Selected Atom = 0x63c08 + Shape Atom = 0x1e505 + Size Atom = 0x5f504 + Sizes Atom = 0x5f505 + Slot Atom = 0x1ef04 + Small Atom = 0x20605 + Sortable Atom = 0x65108 + Sorted Atom = 0x33706 + Source Atom = 0x37806 + Spacer Atom = 0x43706 + Span Atom = 0x9f04 + Spellcheck Atom = 0x4740a + Src Atom = 0x5c003 + Srcdoc Atom = 0x5c006 + Srclang Atom = 0x5f907 + Srcset Atom = 0x6f906 + Start Atom = 0x3fa05 + Step Atom = 0x58304 + Strike Atom = 0xd206 + Strong Atom = 0x6dd06 + Style Atom = 0x6ff05 + Sub Atom = 0x66d03 + Summary Atom = 0x70407 + Sup Atom = 0x70b03 + Svg Atom = 0x70e03 + System Atom = 0x71106 + Tabindex Atom = 0x4be08 + Table Atom = 0x59505 + Target Atom = 0x2c406 + Tbody Atom = 0x2705 + Td Atom = 0x9202 + Template Atom = 0x71408 + Textarea Atom = 0x35208 + Tfoot Atom = 0xf505 + Th Atom = 0x15602 + Thead Atom = 0x33005 + Time Atom = 0x4204 + Title Atom = 0x11005 + Tr Atom = 0xcc02 + Track Atom = 0x1ba05 + Translate Atom = 0x1f209 + Tt Atom = 0x6802 + Type Atom = 0xd904 + Typemustmatch Atom = 0x2900d + U Atom = 0xb01 + Ul Atom = 0xa702 + Updateviacache Atom = 0x460e + Usemap Atom = 0x59e06 + Value Atom = 0x1505 + Var Atom = 0x16d03 + Video Atom = 0x2f105 + Wbr Atom = 0x57c03 + Width Atom = 0x64905 + Workertype Atom = 0x71c0a + Wrap Atom = 0x72604 + Xmp Atom = 0x12f03 ) -const hash0 = 0xc17da63e +const hash0 = 0x81cdf10e -const maxAtomLen = 19 +const maxAtomLen = 25 var table = [1 << 9]Atom{ - 0x1: 0x48a0b, // onmousemove - 0x2: 0x5e209, // onwaiting - 0x3: 0x1fa13, // onautocompleteerror - 0x4: 0x5fa06, // prompt - 0x7: 0x5eb07, // optimum - 0x8: 0x1604, // mark - 0xa: 0x5ad07, // itemref - 0xb: 0x4fe0a, // onpageshow - 0xc: 0x57a06, // select - 0xd: 0x17b09, // draggable - 0xe: 0x3e03, // nav - 0xf: 0x17507, // command - 0x11: 0xb01, // u - 0x14: 0x2d507, // headers - 0x15: 0x44a08, // datalist - 0x17: 0x4e04, // samp - 0x1a: 0x3fb09, // onkeydown - 0x1b: 0x55f08, // onscroll - 0x1c: 0x15003, // col - 0x20: 0x3c908, // itemprop - 0x21: 0x2780a, // http-equiv - 0x22: 0x61d03, // sup - 0x24: 0x1d008, // required - 0x2b: 0x25e07, // preload - 0x2c: 0x6040d, // onbeforeprint - 0x2d: 0x3600b, // ondragenter - 0x2e: 0x50902, // dt - 0x2f: 0x5a708, // onsubmit - 0x30: 0x27002, // hr - 0x31: 0x32f0d, // oncontextmenu - 0x33: 0x29c05, // image - 0x34: 0x50d07, // onpause - 0x35: 0x25906, // hgroup - 0x36: 0x7704, // ping - 0x37: 0x57808, // onselect - 0x3a: 0x11303, // div - 0x3b: 0x1fa0e, // onautocomplete - 0x40: 0x2eb02, // mi - 0x41: 0x31c08, // seamless - 0x42: 0x2807, // charset - 0x43: 0x8502, // id - 0x44: 0x5200a, // onpopstate - 0x45: 0x3ef03, // del - 0x46: 0x2cb07, // marquee - 0x47: 0x3309, // accesskey - 0x49: 0x8d06, // footer - 0x4a: 0x44e04, // list - 0x4b: 0x2b005, // ismap - 0x51: 0x33804, // menu - 0x52: 0x2f04, // body - 0x55: 0x9a08, // frameset - 0x56: 0x54a07, // onreset - 0x57: 0x12705, // blink - 0x58: 0xa105, // title - 0x59: 0x38807, // article - 0x5b: 0x22e02, // th - 0x5d: 0x13101, // q - 0x5e: 0x3cf04, // open - 0x5f: 0x2fa04, // area - 0x61: 0x44206, // onload - 0x62: 0xda04, // font - 0x63: 0xd604, // base - 0x64: 0x16207, // colspan - 0x65: 0x53707, // keytype - 0x66: 0x11e02, // dl - 0x68: 0x1b008, // fieldset - 0x6a: 0x2eb03, // min - 0x6b: 0x11503, // var - 0x6f: 0x2d506, // header - 0x70: 0x13f02, // rt - 0x71: 0x15008, // colgroup - 0x72: 0x23502, // mn - 0x74: 0x13a07, // onabort - 0x75: 0x3906, // keygen - 0x76: 0x4c209, // onoffline - 0x77: 0x21f09, // challenge - 0x78: 0x2b203, // map - 0x7a: 0x2e902, // h4 - 0x7b: 0x3b607, // onerror - 0x7c: 0x2e109, // maxlength - 0x7d: 0x2f505, // mtext - 0x7e: 0xbb07, // sandbox - 0x7f: 0x58b06, // onsort - 0x80: 0x100a, // malignmark - 0x81: 0x45d04, // meta - 0x82: 0x7b05, // async - 0x83: 0x2a702, // h3 - 0x84: 0x26702, // dd - 0x85: 0x27004, // href - 0x86: 0x6e0a, // mediagroup - 0x87: 0x19406, // coords - 0x88: 0x41107, // srclang - 0x89: 0x34d0a, // ondblclick - 0x8a: 0x4005, // value - 0x8c: 0xe908, // oncancel - 0x8e: 0x3230a, // spellcheck - 0x8f: 0x9a05, // frame - 0x91: 0x12403, // big - 0x94: 0x1f606, // action - 0x95: 0x6903, // dir - 0x97: 0x2fb08, // readonly - 0x99: 0x42d05, // table - 0x9a: 0x61607, // summary - 0x9b: 0x12103, // wbr - 0x9c: 0x30a, // radiogroup - 0x9d: 0x6c04, // name - 0x9f: 0x62306, // system - 0xa1: 0x15d05, // color - 0xa2: 0x7f06, // canvas - 0xa3: 0x25504, // html - 0xa5: 0x56f09, // onseeking - 0xac: 0x4f905, // shape - 0xad: 0x25f03, // rel - 0xae: 0x28510, // oncanplaythrough - 0xaf: 0x3760a, // ondragover - 0xb0: 0x62608, // template - 0xb1: 0x1d80d, // foreignObject - 0xb3: 0x9204, // rows - 0xb6: 0x44e07, // listing - 0xb7: 0x49c06, // output - 0xb9: 0x3310b, // contextmenu - 0xbb: 0x11f03, // low - 0xbc: 0x1c602, // rp - 0xbd: 0x5bb09, // onsuspend - 0xbe: 0x13606, // button - 0xbf: 0x4db04, // desc - 0xc1: 0x4e207, // section - 0xc2: 0x52a0a, // onprogress - 0xc3: 0x59e09, // onstorage - 0xc4: 0x2d204, // math - 0xc5: 0x4503, // alt - 0xc7: 0x8a02, // ul - 0xc8: 0x5107, // pattern - 0xc9: 0x4b60c, // onmousewheel - 0xca: 0x35709, // ondragend - 0xcb: 0xaf04, // ruby - 0xcc: 0xc01, // p - 0xcd: 0x31707, // onclose - 0xce: 0x24205, // meter - 0xcf: 0x11807, // bgsound - 0xd2: 0x25106, // height - 0xd4: 0x101, // b - 0xd5: 0x2c308, // itemtype - 0xd8: 0x1bb07, // caption - 0xd9: 0x10c08, // disabled - 0xdb: 0x33808, // menuitem - 0xdc: 0x62003, // svg - 0xdd: 0x18f05, // small - 0xde: 0x44a04, // data - 0xe0: 0x4cb08, // ononline - 0xe1: 0x2a206, // mglyph - 0xe3: 0x6505, // embed - 0xe4: 0x10502, // tr - 0xe5: 0x46b0b, // onloadstart - 0xe7: 0x3c306, // srcdoc - 0xeb: 0x5c408, // ontoggle - 0xed: 0xe703, // bdo - 0xee: 0x4702, // td - 0xef: 0x8305, // aside - 0xf0: 0x29402, // h2 - 0xf1: 0x52c08, // progress - 0xf2: 0x12c0a, // blockquote - 0xf4: 0xf005, // label - 0xf5: 0x601, // i - 0xf7: 0x9207, // rowspan - 0xfb: 0x51709, // onplaying - 0xfd: 0x2a103, // img - 0xfe: 0xf608, // optgroup - 0xff: 0x42307, // content - 0x101: 0x53e0c, // onratechange - 0x103: 0x3da0c, // onhashchange - 0x104: 0x4807, // details - 0x106: 0x40008, // download - 0x109: 0x14009, // translate - 0x10b: 0x4230f, // contenteditable - 0x10d: 0x36b0b, // ondragleave - 0x10e: 0x2106, // accept - 0x10f: 0x57a08, // selected - 0x112: 0x1f20a, // formaction - 0x113: 0x5b506, // center - 0x115: 0x45510, // onloadedmetadata - 0x116: 0x12804, // link - 0x117: 0xdd04, // time - 0x118: 0x19f0b, // crossorigin - 0x119: 0x3bd07, // onfocus - 0x11a: 0x58704, // wrap - 0x11b: 0x42204, // icon - 0x11d: 0x28105, // video - 0x11e: 0x4de05, // class - 0x121: 0x5d40e, // onvolumechange - 0x122: 0xaa06, // onblur - 0x123: 0x2b909, // itemscope - 0x124: 0x61105, // style - 0x127: 0x41e06, // public - 0x129: 0x2320e, // formnovalidate - 0x12a: 0x58206, // onshow - 0x12c: 0x51706, // onplay - 0x12d: 0x3c804, // cite - 0x12e: 0x2bc02, // ms - 0x12f: 0xdb0c, // ontimeupdate - 0x130: 0x10904, // kind - 0x131: 0x2470a, // formtarget - 0x135: 0x3af07, // onended - 0x136: 0x26506, // hidden - 0x137: 0x2c01, // s - 0x139: 0x2280a, // formmethod - 0x13a: 0x3e805, // input - 0x13c: 0x50b02, // h6 - 0x13d: 0xc902, // ol - 0x13e: 0x3420b, // oncuechange - 0x13f: 0x1e50d, // foreignobject - 0x143: 0x4e70e, // onbeforeunload - 0x144: 0x2bd05, // scope - 0x145: 0x39609, // onemptied - 0x146: 0x14b05, // defer - 0x147: 0xc103, // xmp - 0x148: 0x39f10, // ondurationchange - 0x149: 0x1903, // kbd - 0x14c: 0x47609, // onmessage - 0x14d: 0x60006, // option - 0x14e: 0x2eb09, // minlength - 0x14f: 0x32807, // checked - 0x150: 0xce08, // autoplay - 0x152: 0x202, // br - 0x153: 0x2360a, // novalidate - 0x156: 0x6307, // noembed - 0x159: 0x31007, // onclick - 0x15a: 0x47f0b, // onmousedown - 0x15b: 0x3a708, // onchange - 0x15e: 0x3f209, // oninvalid - 0x15f: 0x2bd06, // scoped - 0x160: 0x18808, // controls - 0x161: 0x30b05, // muted - 0x162: 0x58d08, // sortable - 0x163: 0x51106, // usemap - 0x164: 0x1b80a, // figcaption - 0x165: 0x35706, // ondrag - 0x166: 0x26b04, // high - 0x168: 0x3c303, // src - 0x169: 0x15706, // poster - 0x16b: 0x1670e, // annotation-xml - 0x16c: 0x5f704, // step - 0x16d: 0x4, // abbr - 0x16e: 0x1b06, // dialog - 0x170: 0x1202, // li - 0x172: 0x3ed02, // mo - 0x175: 0x1d803, // for - 0x176: 0x1a803, // ins - 0x178: 0x55504, // size - 0x179: 0x43210, // onlanguagechange - 0x17a: 0x8607, // default - 0x17b: 0x1a03, // bdi - 0x17c: 0x4d30a, // onpagehide - 0x17d: 0x6907, // dirname - 0x17e: 0x21404, // type - 0x17f: 0x1f204, // form - 0x181: 0x28509, // oncanplay - 0x182: 0x6103, // dfn - 0x183: 0x46308, // tabindex - 0x186: 0x6502, // em - 0x187: 0x27404, // lang - 0x189: 0x39108, // dropzone - 0x18a: 0x4080a, // onkeypress - 0x18b: 0x23c08, // datetime - 0x18c: 0x16204, // cols - 0x18d: 0x1, // a - 0x18e: 0x4420c, // onloadeddata - 0x190: 0xa605, // audio - 0x192: 0x2e05, // tbody - 0x193: 0x22c06, // method - 0x195: 0xf404, // loop - 0x196: 0x29606, // iframe - 0x198: 0x2d504, // head - 0x19e: 0x5f108, // manifest - 0x19f: 0xb309, // autofocus - 0x1a0: 0x14904, // code - 0x1a1: 0x55906, // strong - 0x1a2: 0x30308, // multiple - 0x1a3: 0xc05, // param - 0x1a6: 0x21107, // enctype - 0x1a7: 0x5b304, // face - 0x1a8: 0xfd09, // plaintext - 0x1a9: 0x26e02, // h1 - 0x1aa: 0x59509, // onstalled - 0x1ad: 0x3d406, // script - 0x1ae: 0x2db06, // spacer - 0x1af: 0x55108, // onresize - 0x1b0: 0x4a20b, // onmouseover - 0x1b1: 0x5cc08, // onunload - 0x1b2: 0x56708, // onseeked - 0x1b4: 0x2140d, // typemustmatch - 0x1b5: 0x1cc06, // figure - 0x1b6: 0x4950a, // onmouseout - 0x1b7: 0x25e03, // pre - 0x1b8: 0x50705, // width - 0x1b9: 0x19906, // sorted - 0x1bb: 0x5704, // nobr - 0x1be: 0x5302, // tt - 0x1bf: 0x1105, // align - 0x1c0: 0x3e607, // oninput - 0x1c3: 0x41807, // onkeyup - 0x1c6: 0x1c00c, // onafterprint - 0x1c7: 0x210e, // accept-charset - 0x1c8: 0x33c06, // itemid - 0x1c9: 0x3e809, // inputmode - 0x1cb: 0x53306, // strike - 0x1cc: 0x5a903, // sub - 0x1cd: 0x10505, // track - 0x1ce: 0x38605, // start - 0x1d0: 0xd608, // basefont - 0x1d6: 0x1aa06, // source - 0x1d7: 0x18206, // legend - 0x1d8: 0x2d405, // thead - 0x1da: 0x8c05, // tfoot - 0x1dd: 0x1ec06, // object - 0x1de: 0x6e05, // media - 0x1df: 0x1670a, // annotation - 0x1e0: 0x20d0b, // formenctype - 0x1e2: 0x3d208, // noscript - 0x1e4: 0x55505, // sizes - 0x1e5: 0x1fc0c, // autocomplete - 0x1e6: 0x9504, // span - 0x1e7: 0x9808, // noframes - 0x1e8: 0x24b06, // target - 0x1e9: 0x38f06, // ondrop - 0x1ea: 0x2b306, // applet - 0x1ec: 0x5a08, // reversed - 0x1f0: 0x2a907, // isindex - 0x1f3: 0x27008, // hreflang - 0x1f5: 0x2f302, // h5 - 0x1f6: 0x4f307, // address - 0x1fa: 0x2e103, // max - 0x1fb: 0xc30b, // placeholder - 0x1fc: 0x2f608, // textarea - 0x1fe: 0x4ad09, // onmouseup - 0x1ff: 0x3800b, // ondragstart + 0x1: 0xe60a, // mediagroup + 0x2: 0x2e404, // lang + 0x4: 0x2c09, // accesskey + 0x5: 0x8b08, // frameset + 0x7: 0x63a08, // onselect + 0x8: 0x71106, // system + 0xa: 0x64905, // width + 0xc: 0x2890b, // formenctype + 0xd: 0x13702, // ol + 0xe: 0x3970b, // oncuechange + 0x10: 0x14b03, // bdo + 0x11: 0x11505, // audio + 0x12: 0x17a09, // draggable + 0x14: 0x2f105, // video + 0x15: 0x2b102, // mn + 0x16: 0x38704, // menu + 0x17: 0x2cf06, // poster + 0x19: 0xf606, // footer + 0x1a: 0x2a806, // method + 0x1b: 0x2b808, // datetime + 0x1c: 0x19507, // onabort + 0x1d: 0x460e, // updateviacache + 0x1e: 0xff05, // async + 0x1f: 0x49d06, // onload + 0x21: 0x11908, // oncancel + 0x22: 0x62908, // onseeked + 0x23: 0x30205, // image + 0x24: 0x5d812, // onrejectionhandled + 0x26: 0x17404, // link + 0x27: 0x51d06, // output + 0x28: 0x33104, // head + 0x29: 0x4ff0c, // onmouseleave + 0x2a: 0x57f07, // onpaste + 0x2b: 0x5a409, // onplaying + 0x2c: 0x1c407, // colspan + 0x2f: 0x1bf05, // color + 0x30: 0x5f504, // size + 0x31: 0x2e80a, // http-equiv + 0x33: 0x601, // i + 0x34: 0x5590a, // onpagehide + 0x35: 0x68c14, // onunhandledrejection + 0x37: 0x42a07, // onerror + 0x3a: 0x3b08, // basefont + 0x3f: 0x1303, // nav + 0x40: 0x17704, // kind + 0x41: 0x35708, // readonly + 0x42: 0x30806, // mglyph + 0x44: 0xb202, // li + 0x46: 0x2d506, // hidden + 0x47: 0x70e03, // svg + 0x48: 0x58304, // step + 0x49: 0x23f09, // integrity + 0x4a: 0x58606, // public + 0x4c: 0x1ab03, // col + 0x4d: 0x1870a, // blockquote + 0x4e: 0x34f02, // h5 + 0x50: 0x5b908, // progress + 0x51: 0x5f505, // sizes + 0x52: 0x34502, // h4 + 0x56: 0x33005, // thead + 0x57: 0xd607, // keytype + 0x58: 0x5b70a, // onprogress + 0x59: 0x44b09, // inputmode + 0x5a: 0x3b109, // ondragend + 0x5d: 0x3a205, // oncut + 0x5e: 0x43706, // spacer + 0x5f: 0x1ab08, // colgroup + 0x62: 0x16502, // is + 0x65: 0x3c02, // as + 0x66: 0x54809, // onoffline + 0x67: 0x33706, // sorted + 0x69: 0x48d10, // onlanguagechange + 0x6c: 0x43d0c, // onhashchange + 0x6d: 0x9604, // name + 0x6e: 0xf505, // tfoot + 0x6f: 0x56104, // desc + 0x70: 0x33d03, // max + 0x72: 0x1ea06, // coords + 0x73: 0x30d02, // h3 + 0x74: 0x6e70e, // onbeforeunload + 0x75: 0x9c04, // rows + 0x76: 0x63c06, // select + 0x77: 0x9805, // meter + 0x78: 0x38b06, // itemid + 0x79: 0x53c0c, // onmousewheel + 0x7a: 0x5c006, // srcdoc + 0x7d: 0x1ba05, // track + 0x7f: 0x31f08, // itemtype + 0x82: 0xa402, // mo + 0x83: 0x41b08, // onchange + 0x84: 0x33107, // headers + 0x85: 0x5cc0c, // onratechange + 0x86: 0x60819, // onsecuritypolicyviolation + 0x88: 0x4a508, // datalist + 0x89: 0x4e80b, // onmousedown + 0x8a: 0x1ef04, // slot + 0x8b: 0x4b010, // onloadedmetadata + 0x8c: 0x1a06, // accept + 0x8d: 0x26806, // object + 0x91: 0x6b30e, // onvolumechange + 0x92: 0x2107, // charset + 0x93: 0x27613, // onautocompleteerror + 0x94: 0xc113, // allowpaymentrequest + 0x95: 0x2804, // body + 0x96: 0x10a07, // default + 0x97: 0x63c08, // selected + 0x98: 0x21e04, // face + 0x99: 0x1e505, // shape + 0x9b: 0x68408, // ontoggle + 0x9e: 0x64b02, // dt + 0x9f: 0xb604, // mark + 0xa1: 0xb01, // u + 0xa4: 0x6ab08, // onunload + 0xa5: 0x5d04, // loop + 0xa6: 0x16408, // disabled + 0xaa: 0x42307, // onended + 0xab: 0xb00a, // malignmark + 0xad: 0x67b09, // onsuspend + 0xae: 0x35105, // mtext + 0xaf: 0x64f06, // onsort + 0xb0: 0x19d08, // itemprop + 0xb3: 0x67109, // itemscope + 0xb4: 0x17305, // blink + 0xb6: 0x3b106, // ondrag + 0xb7: 0xa702, // ul + 0xb8: 0x26e04, // form + 0xb9: 0x12907, // sandbox + 0xba: 0x8b05, // frame + 0xbb: 0x1505, // value + 0xbc: 0x66209, // onstorage + 0xbf: 0xaa07, // acronym + 0xc0: 0x19a02, // rt + 0xc2: 0x202, // br + 0xc3: 0x22608, // fieldset + 0xc4: 0x2900d, // typemustmatch + 0xc5: 0xa208, // nomodule + 0xc6: 0x6c07, // noembed + 0xc7: 0x69e0d, // onbeforeprint + 0xc8: 0x19106, // button + 0xc9: 0x2f507, // onclick + 0xca: 0x70407, // summary + 0xcd: 0xfb04, // ruby + 0xce: 0x56405, // class + 0xcf: 0x3f40b, // ondragstart + 0xd0: 0x23107, // caption + 0xd4: 0xdd0e, // allowusermedia + 0xd5: 0x4cf0b, // onloadstart + 0xd9: 0x16b03, // div + 0xda: 0x4a904, // list + 0xdb: 0x32e04, // math + 0xdc: 0x44b05, // input + 0xdf: 0x3ea0a, // ondragover + 0xe0: 0x2de02, // h2 + 0xe2: 0x1b209, // plaintext + 0xe4: 0x4f30c, // onmouseenter + 0xe7: 0x47907, // checked + 0xe8: 0x47003, // pre + 0xea: 0x35f08, // multiple + 0xeb: 0xba03, // bdi + 0xec: 0x33d09, // maxlength + 0xed: 0xcf01, // q + 0xee: 0x61f0a, // onauxclick + 0xf0: 0x57c03, // wbr + 0xf2: 0x3b04, // base + 0xf3: 0x6e306, // option + 0xf5: 0x41310, // ondurationchange + 0xf7: 0x8908, // noframes + 0xf9: 0x40508, // dropzone + 0xfb: 0x67505, // scope + 0xfc: 0x8008, // reversed + 0xfd: 0x3ba0b, // ondragenter + 0xfe: 0x3fa05, // start + 0xff: 0x12f03, // xmp + 0x100: 0x5f907, // srclang + 0x101: 0x30703, // img + 0x104: 0x101, // b + 0x105: 0x25403, // for + 0x106: 0x10705, // aside + 0x107: 0x44907, // oninput + 0x108: 0x35604, // area + 0x109: 0x2a40a, // formmethod + 0x10a: 0x72604, // wrap + 0x10c: 0x23c02, // rp + 0x10d: 0x46b0a, // onkeypress + 0x10e: 0x6802, // tt + 0x110: 0x34702, // mi + 0x111: 0x36705, // muted + 0x112: 0xf303, // alt + 0x113: 0x5c504, // code + 0x114: 0x6e02, // em + 0x115: 0x3c50a, // ondragexit + 0x117: 0x9f04, // span + 0x119: 0x6d708, // manifest + 0x11a: 0x38708, // menuitem + 0x11b: 0x58b07, // content + 0x11d: 0x6c109, // onwaiting + 0x11f: 0x4c609, // onloadend + 0x121: 0x37e0d, // oncontextmenu + 0x123: 0x56d06, // onblur + 0x124: 0x3fc07, // article + 0x125: 0x9303, // dir + 0x126: 0xef04, // ping + 0x127: 0x24c08, // required + 0x128: 0x45509, // oninvalid + 0x129: 0xb105, // align + 0x12b: 0x58a04, // icon + 0x12c: 0x64d02, // h6 + 0x12d: 0x1c404, // cols + 0x12e: 0x22e0a, // figcaption + 0x12f: 0x45e09, // onkeydown + 0x130: 0x66b08, // onsubmit + 0x131: 0x14d09, // oncanplay + 0x132: 0x70b03, // sup + 0x133: 0xc01, // p + 0x135: 0x40a09, // onemptied + 0x136: 0x39106, // oncopy + 0x137: 0x19c04, // cite + 0x138: 0x3a70a, // ondblclick + 0x13a: 0x50b0b, // onmousemove + 0x13c: 0x66d03, // sub + 0x13d: 0x48703, // rel + 0x13e: 0x5f08, // optgroup + 0x142: 0x9c07, // rowspan + 0x143: 0x37806, // source + 0x144: 0x21608, // noscript + 0x145: 0x1a304, // open + 0x146: 0x20403, // ins + 0x147: 0x2540d, // foreignObject + 0x148: 0x5ad0a, // onpopstate + 0x14a: 0x28d07, // enctype + 0x14b: 0x2760e, // onautocomplete + 0x14c: 0x35208, // textarea + 0x14e: 0x2780c, // autocomplete + 0x14f: 0x15702, // hr + 0x150: 0x1de08, // controls + 0x151: 0x10902, // id + 0x153: 0x2360c, // onafterprint + 0x155: 0x2610d, // foreignobject + 0x156: 0x32707, // marquee + 0x157: 0x59a07, // onpause + 0x158: 0x5e602, // dl + 0x159: 0x5206, // height + 0x15a: 0x34703, // min + 0x15b: 0x9307, // dirname + 0x15c: 0x1f209, // translate + 0x15d: 0x5604, // html + 0x15e: 0x34709, // minlength + 0x15f: 0x48607, // preload + 0x160: 0x71408, // template + 0x161: 0x3df0b, // ondragleave + 0x162: 0x3a02, // rb + 0x164: 0x5c003, // src + 0x165: 0x6dd06, // strong + 0x167: 0x7804, // samp + 0x168: 0x6f307, // address + 0x169: 0x55108, // ononline + 0x16b: 0x1310b, // placeholder + 0x16c: 0x2c406, // target + 0x16d: 0x20605, // small + 0x16e: 0x6ca07, // onwheel + 0x16f: 0x1c90a, // annotation + 0x170: 0x4740a, // spellcheck + 0x171: 0x7207, // details + 0x172: 0x10306, // canvas + 0x173: 0x12109, // autofocus + 0x174: 0xc05, // param + 0x176: 0x46308, // download + 0x177: 0x45203, // del + 0x178: 0x36c07, // onclose + 0x179: 0xb903, // kbd + 0x17a: 0x31906, // applet + 0x17b: 0x2e004, // href + 0x17c: 0x5f108, // onresize + 0x17e: 0x49d0c, // onloadeddata + 0x180: 0xcc02, // tr + 0x181: 0x2c00a, // formtarget + 0x182: 0x11005, // title + 0x183: 0x6ff05, // style + 0x184: 0xd206, // strike + 0x185: 0x59e06, // usemap + 0x186: 0x2fc06, // iframe + 0x187: 0x1004, // main + 0x189: 0x7b07, // picture + 0x18c: 0x31605, // ismap + 0x18e: 0x4a504, // data + 0x18f: 0x5905, // label + 0x191: 0x3d10e, // referrerpolicy + 0x192: 0x15602, // th + 0x194: 0x53606, // prompt + 0x195: 0x56807, // section + 0x197: 0x6d107, // optimum + 0x198: 0x2db04, // high + 0x199: 0x15c02, // h1 + 0x19a: 0x65909, // onstalled + 0x19b: 0x16d03, // var + 0x19c: 0x4204, // time + 0x19e: 0x67402, // ms + 0x19f: 0x33106, // header + 0x1a0: 0x4da09, // onmessage + 0x1a1: 0x1a605, // nonce + 0x1a2: 0x26e0a, // formaction + 0x1a3: 0x22006, // center + 0x1a4: 0x3704, // nobr + 0x1a5: 0x59505, // table + 0x1a6: 0x4a907, // listing + 0x1a7: 0x18106, // legend + 0x1a9: 0x29b09, // challenge + 0x1aa: 0x24806, // figure + 0x1ab: 0xe605, // media + 0x1ae: 0xd904, // type + 0x1af: 0x3f04, // font + 0x1b0: 0x4da0e, // onmessageerror + 0x1b1: 0x37108, // seamless + 0x1b2: 0x8703, // dfn + 0x1b3: 0x5c705, // defer + 0x1b4: 0xc303, // low + 0x1b5: 0x19a03, // rtc + 0x1b6: 0x5230b, // onmouseover + 0x1b7: 0x2b20a, // novalidate + 0x1b8: 0x71c0a, // workertype + 0x1ba: 0x3cd07, // itemref + 0x1bd: 0x1, // a + 0x1be: 0x31803, // map + 0x1bf: 0x400c, // ontimeupdate + 0x1c0: 0x15e07, // bgsound + 0x1c1: 0x3206, // keygen + 0x1c2: 0x2705, // tbody + 0x1c5: 0x64406, // onshow + 0x1c7: 0x2501, // s + 0x1c8: 0x6607, // pattern + 0x1cc: 0x14d10, // oncanplaythrough + 0x1ce: 0x2d702, // dd + 0x1cf: 0x6f906, // srcset + 0x1d0: 0x17003, // big + 0x1d2: 0x65108, // sortable + 0x1d3: 0x48007, // onkeyup + 0x1d5: 0x5a406, // onplay + 0x1d7: 0x4b804, // meta + 0x1d8: 0x40306, // ondrop + 0x1da: 0x60008, // onscroll + 0x1db: 0x1fb0b, // crossorigin + 0x1dc: 0x5730a, // onpageshow + 0x1dd: 0x4, // abbr + 0x1de: 0x9202, // td + 0x1df: 0x58b0f, // contenteditable + 0x1e0: 0x27206, // action + 0x1e1: 0x1400b, // playsinline + 0x1e2: 0x43107, // onfocus + 0x1e3: 0x2e008, // hreflang + 0x1e5: 0x5160a, // onmouseout + 0x1e6: 0x5ea07, // onreset + 0x1e7: 0x13c08, // autoplay + 0x1e8: 0x63109, // onseeking + 0x1ea: 0x67506, // scoped + 0x1ec: 0x30a, // radiogroup + 0x1ee: 0x3800b, // contextmenu + 0x1ef: 0x52e09, // onmouseup + 0x1f1: 0x2ca06, // hgroup + 0x1f2: 0x2080f, // allowfullscreen + 0x1f3: 0x4be08, // tabindex + 0x1f6: 0x30f07, // isindex + 0x1f7: 0x1a0e, // accept-charset + 0x1f8: 0x2ae0e, // formnovalidate + 0x1fb: 0x1c90e, // annotation-xml + 0x1fc: 0x6e05, // embed + 0x1fd: 0x21806, // script + 0x1fe: 0xbb06, // dialog + 0x1ff: 0x1d707, // command } -const atomText = "abbradiogrouparamalignmarkbdialogaccept-charsetbodyaccesskey" + - "genavaluealtdetailsampatternobreversedfnoembedirnamediagroup" + - "ingasyncanvasidefaultfooterowspanoframesetitleaudionblurubya" + - "utofocusandboxmplaceholderautoplaybasefontimeupdatebdoncance" + - "labelooptgrouplaintextrackindisabledivarbgsoundlowbrbigblink" + - "blockquotebuttonabortranslatecodefercolgroupostercolorcolspa" + - "nnotation-xmlcommandraggablegendcontrolsmallcoordsortedcross" + - "originsourcefieldsetfigcaptionafterprintfigurequiredforeignO" + - "bjectforeignobjectformactionautocompleteerrorformenctypemust" + - "matchallengeformmethodformnovalidatetimeterformtargetheightm" + - "lhgroupreloadhiddenhigh1hreflanghttp-equivideoncanplaythroug" + - "h2iframeimageimglyph3isindexismappletitemscopeditemtypemarqu" + - "eematheaderspacermaxlength4minlength5mtextareadonlymultiplem" + - "utedonclickoncloseamlesspellcheckedoncontextmenuitemidoncuec" + - "hangeondblclickondragendondragenterondragleaveondragoverondr" + - "agstarticleondropzonemptiedondurationchangeonendedonerroronf" + - "ocusrcdocitempropenoscriptonhashchangeoninputmodeloninvalido" + - "nkeydownloadonkeypressrclangonkeyupublicontenteditableonlang" + - "uagechangeonloadeddatalistingonloadedmetadatabindexonloadsta" + - "rtonmessageonmousedownonmousemoveonmouseoutputonmouseoveronm" + - "ouseuponmousewheelonofflineononlineonpagehidesclassectionbef" + - "oreunloaddresshapeonpageshowidth6onpausemaponplayingonpopsta" + - "teonprogresstrikeytypeonratechangeonresetonresizestrongonscr" + - "ollonseekedonseekingonselectedonshowraponsortableonstalledon" + - "storageonsubmitemrefacenteronsuspendontoggleonunloadonvolume" + - "changeonwaitingoptimumanifestepromptoptionbeforeprintstylesu" + - "mmarysupsvgsystemplate" +const atomText = "abbradiogrouparamainavalueaccept-charsetbodyaccesskeygenobrb" + + "asefontimeupdateviacacheightmlabelooptgroupatternoembedetail" + + "sampictureversedfnoframesetdirnameterowspanomoduleacronymali" + + "gnmarkbdialogallowpaymentrequestrikeytypeallowusermediagroup" + + "ingaltfooterubyasyncanvasidefaultitleaudioncancelautofocusan" + + "dboxmplaceholderautoplaysinlinebdoncanplaythrough1bgsoundisa" + + "bledivarbigblinkindraggablegendblockquotebuttonabortcitempro" + + "penoncecolgrouplaintextrackcolorcolspannotation-xmlcommandco" + + "ntrolshapecoordslotranslatecrossoriginsmallowfullscreenoscri" + + "ptfacenterfieldsetfigcaptionafterprintegrityfigurequiredfore" + + "ignObjectforeignobjectformactionautocompleteerrorformenctype" + + "mustmatchallengeformmethodformnovalidatetimeformtargethgroup" + + "osterhiddenhigh2hreflanghttp-equivideonclickiframeimageimgly" + + "ph3isindexismappletitemtypemarqueematheadersortedmaxlength4m" + + "inlength5mtextareadonlymultiplemutedoncloseamlessourceoncont" + + "extmenuitemidoncopyoncuechangeoncutondblclickondragendondrag" + + "enterondragexitemreferrerpolicyondragleaveondragoverondragst" + + "articleondropzonemptiedondurationchangeonendedonerroronfocus" + + "paceronhashchangeoninputmodeloninvalidonkeydownloadonkeypres" + + "spellcheckedonkeyupreloadonlanguagechangeonloadeddatalisting" + + "onloadedmetadatabindexonloadendonloadstartonmessageerroronmo" + + "usedownonmouseenteronmouseleaveonmousemoveonmouseoutputonmou" + + "seoveronmouseupromptonmousewheelonofflineononlineonpagehides" + + "classectionbluronpageshowbronpastepublicontenteditableonpaus" + + "emaponplayingonpopstateonprogressrcdocodeferonratechangeonre" + + "jectionhandledonresetonresizesrclangonscrollonsecuritypolicy" + + "violationauxclickonseekedonseekingonselectedonshowidth6onsor" + + "tableonstalledonstorageonsubmitemscopedonsuspendontoggleonun" + + "handledrejectionbeforeprintonunloadonvolumechangeonwaitingon" + + "wheeloptimumanifestrongoptionbeforeunloaddressrcsetstylesumm" + + "arysupsvgsystemplateworkertypewrap" diff --git a/vendor/golang.org/x/net/html/const.go b/vendor/golang.org/x/net/html/const.go index 52f651ff6db8..a3a918f0b381 100644 --- a/vendor/golang.org/x/net/html/const.go +++ b/vendor/golang.org/x/net/html/const.go @@ -4,7 +4,7 @@ package html -// Section 12.2.3.2 of the HTML5 specification says "The following elements +// Section 12.2.4.2 of the HTML5 specification says "The following elements // have varying levels of special parsing rules". // https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements var isSpecialElementMap = map[string]bool{ @@ -52,10 +52,12 @@ var isSpecialElementMap = map[string]bool{ "iframe": true, "img": true, "input": true, - "isindex": true, + "isindex": true, // The 'isindex' element has been removed, but keep it for backwards compatibility. + "keygen": true, "li": true, "link": true, "listing": true, + "main": true, "marquee": true, "menu": true, "meta": true, @@ -95,8 +97,16 @@ func isSpecialElement(element *Node) bool { switch element.Namespace { case "", "html": return isSpecialElementMap[element.Data] + case "math": + switch element.Data { + case "mi", "mo", "mn", "ms", "mtext", "annotation-xml": + return true + } case "svg": - return element.Data == "foreignObject" + switch element.Data { + case "foreignObject", "desc", "title": + return true + } } return false } diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go index 94f496874aba..822ed42a04c1 100644 --- a/vendor/golang.org/x/net/html/doc.go +++ b/vendor/golang.org/x/net/html/doc.go @@ -49,18 +49,18 @@ call to Next. For example, to extract an HTML page's anchor text: for { tt := z.Next() switch tt { - case ErrorToken: + case html.ErrorToken: return z.Err() - case TextToken: + case html.TextToken: if depth > 0 { // emitBytes should copy the []byte it receives, // if it doesn't process it immediately. emitBytes(z.Text()) } - case StartTagToken, EndTagToken: + case html.StartTagToken, html.EndTagToken: tn, _ := z.TagName() if len(tn) == 1 && tn[0] == 'a' { - if tt == StartTagToken { + if tt == html.StartTagToken { depth++ } else { depth-- diff --git a/vendor/golang.org/x/net/html/entity.go b/vendor/golang.org/x/net/html/entity.go index a50c04c60e95..b628880a014d 100644 --- a/vendor/golang.org/x/net/html/entity.go +++ b/vendor/golang.org/x/net/html/entity.go @@ -75,2083 +75,2083 @@ var entity = map[string]rune{ "Copf;": '\U00002102', "Coproduct;": '\U00002210', "CounterClockwiseContourIntegral;": '\U00002233', - "Cross;": '\U00002A2F', - "Cscr;": '\U0001D49E', - "Cup;": '\U000022D3', - "CupCap;": '\U0000224D', - "DD;": '\U00002145', - "DDotrahd;": '\U00002911', - "DJcy;": '\U00000402', - "DScy;": '\U00000405', - "DZcy;": '\U0000040F', - "Dagger;": '\U00002021', - "Darr;": '\U000021A1', - "Dashv;": '\U00002AE4', - "Dcaron;": '\U0000010E', - "Dcy;": '\U00000414', - "Del;": '\U00002207', - "Delta;": '\U00000394', - "Dfr;": '\U0001D507', - "DiacriticalAcute;": '\U000000B4', - "DiacriticalDot;": '\U000002D9', - "DiacriticalDoubleAcute;": '\U000002DD', - "DiacriticalGrave;": '\U00000060', - "DiacriticalTilde;": '\U000002DC', - "Diamond;": '\U000022C4', - "DifferentialD;": '\U00002146', - "Dopf;": '\U0001D53B', - "Dot;": '\U000000A8', - "DotDot;": '\U000020DC', - "DotEqual;": '\U00002250', - "DoubleContourIntegral;": '\U0000222F', - "DoubleDot;": '\U000000A8', - "DoubleDownArrow;": '\U000021D3', - "DoubleLeftArrow;": '\U000021D0', - "DoubleLeftRightArrow;": '\U000021D4', - "DoubleLeftTee;": '\U00002AE4', - "DoubleLongLeftArrow;": '\U000027F8', - "DoubleLongLeftRightArrow;": '\U000027FA', - "DoubleLongRightArrow;": '\U000027F9', - "DoubleRightArrow;": '\U000021D2', - "DoubleRightTee;": '\U000022A8', - "DoubleUpArrow;": '\U000021D1', - "DoubleUpDownArrow;": '\U000021D5', - "DoubleVerticalBar;": '\U00002225', - "DownArrow;": '\U00002193', - "DownArrowBar;": '\U00002913', - "DownArrowUpArrow;": '\U000021F5', - "DownBreve;": '\U00000311', - "DownLeftRightVector;": '\U00002950', - "DownLeftTeeVector;": '\U0000295E', - "DownLeftVector;": '\U000021BD', - "DownLeftVectorBar;": '\U00002956', - "DownRightTeeVector;": '\U0000295F', - "DownRightVector;": '\U000021C1', - "DownRightVectorBar;": '\U00002957', - "DownTee;": '\U000022A4', - "DownTeeArrow;": '\U000021A7', - "Downarrow;": '\U000021D3', - "Dscr;": '\U0001D49F', - "Dstrok;": '\U00000110', - "ENG;": '\U0000014A', - "ETH;": '\U000000D0', - "Eacute;": '\U000000C9', - "Ecaron;": '\U0000011A', - "Ecirc;": '\U000000CA', - "Ecy;": '\U0000042D', - "Edot;": '\U00000116', - "Efr;": '\U0001D508', - "Egrave;": '\U000000C8', - "Element;": '\U00002208', - "Emacr;": '\U00000112', - "EmptySmallSquare;": '\U000025FB', - "EmptyVerySmallSquare;": '\U000025AB', - "Eogon;": '\U00000118', - "Eopf;": '\U0001D53C', - "Epsilon;": '\U00000395', - "Equal;": '\U00002A75', - "EqualTilde;": '\U00002242', - "Equilibrium;": '\U000021CC', - "Escr;": '\U00002130', - "Esim;": '\U00002A73', - "Eta;": '\U00000397', - "Euml;": '\U000000CB', - "Exists;": '\U00002203', - "ExponentialE;": '\U00002147', - "Fcy;": '\U00000424', - "Ffr;": '\U0001D509', - "FilledSmallSquare;": '\U000025FC', - "FilledVerySmallSquare;": '\U000025AA', - "Fopf;": '\U0001D53D', - "ForAll;": '\U00002200', - "Fouriertrf;": '\U00002131', - "Fscr;": '\U00002131', - "GJcy;": '\U00000403', - "GT;": '\U0000003E', - "Gamma;": '\U00000393', - "Gammad;": '\U000003DC', - "Gbreve;": '\U0000011E', - "Gcedil;": '\U00000122', - "Gcirc;": '\U0000011C', - "Gcy;": '\U00000413', - "Gdot;": '\U00000120', - "Gfr;": '\U0001D50A', - "Gg;": '\U000022D9', - "Gopf;": '\U0001D53E', - "GreaterEqual;": '\U00002265', - "GreaterEqualLess;": '\U000022DB', - "GreaterFullEqual;": '\U00002267', - "GreaterGreater;": '\U00002AA2', - "GreaterLess;": '\U00002277', - "GreaterSlantEqual;": '\U00002A7E', - "GreaterTilde;": '\U00002273', - "Gscr;": '\U0001D4A2', - "Gt;": '\U0000226B', - "HARDcy;": '\U0000042A', - "Hacek;": '\U000002C7', - "Hat;": '\U0000005E', - "Hcirc;": '\U00000124', - "Hfr;": '\U0000210C', - "HilbertSpace;": '\U0000210B', - "Hopf;": '\U0000210D', - "HorizontalLine;": '\U00002500', - "Hscr;": '\U0000210B', - "Hstrok;": '\U00000126', - "HumpDownHump;": '\U0000224E', - "HumpEqual;": '\U0000224F', - "IEcy;": '\U00000415', - "IJlig;": '\U00000132', - "IOcy;": '\U00000401', - "Iacute;": '\U000000CD', - "Icirc;": '\U000000CE', - "Icy;": '\U00000418', - "Idot;": '\U00000130', - "Ifr;": '\U00002111', - "Igrave;": '\U000000CC', - "Im;": '\U00002111', - "Imacr;": '\U0000012A', - "ImaginaryI;": '\U00002148', - "Implies;": '\U000021D2', - "Int;": '\U0000222C', - "Integral;": '\U0000222B', - "Intersection;": '\U000022C2', - "InvisibleComma;": '\U00002063', - "InvisibleTimes;": '\U00002062', - "Iogon;": '\U0000012E', - "Iopf;": '\U0001D540', - "Iota;": '\U00000399', - "Iscr;": '\U00002110', - "Itilde;": '\U00000128', - "Iukcy;": '\U00000406', - "Iuml;": '\U000000CF', - "Jcirc;": '\U00000134', - "Jcy;": '\U00000419', - "Jfr;": '\U0001D50D', - "Jopf;": '\U0001D541', - "Jscr;": '\U0001D4A5', - "Jsercy;": '\U00000408', - "Jukcy;": '\U00000404', - "KHcy;": '\U00000425', - "KJcy;": '\U0000040C', - "Kappa;": '\U0000039A', - "Kcedil;": '\U00000136', - "Kcy;": '\U0000041A', - "Kfr;": '\U0001D50E', - "Kopf;": '\U0001D542', - "Kscr;": '\U0001D4A6', - "LJcy;": '\U00000409', - "LT;": '\U0000003C', - "Lacute;": '\U00000139', - "Lambda;": '\U0000039B', - "Lang;": '\U000027EA', - "Laplacetrf;": '\U00002112', - "Larr;": '\U0000219E', - "Lcaron;": '\U0000013D', - "Lcedil;": '\U0000013B', - "Lcy;": '\U0000041B', - "LeftAngleBracket;": '\U000027E8', - "LeftArrow;": '\U00002190', - "LeftArrowBar;": '\U000021E4', - "LeftArrowRightArrow;": '\U000021C6', - "LeftCeiling;": '\U00002308', - "LeftDoubleBracket;": '\U000027E6', - "LeftDownTeeVector;": '\U00002961', - "LeftDownVector;": '\U000021C3', - "LeftDownVectorBar;": '\U00002959', - "LeftFloor;": '\U0000230A', - "LeftRightArrow;": '\U00002194', - "LeftRightVector;": '\U0000294E', - "LeftTee;": '\U000022A3', - "LeftTeeArrow;": '\U000021A4', - "LeftTeeVector;": '\U0000295A', - "LeftTriangle;": '\U000022B2', - "LeftTriangleBar;": '\U000029CF', - "LeftTriangleEqual;": '\U000022B4', - "LeftUpDownVector;": '\U00002951', - "LeftUpTeeVector;": '\U00002960', - "LeftUpVector;": '\U000021BF', - "LeftUpVectorBar;": '\U00002958', - "LeftVector;": '\U000021BC', - "LeftVectorBar;": '\U00002952', - "Leftarrow;": '\U000021D0', - "Leftrightarrow;": '\U000021D4', - "LessEqualGreater;": '\U000022DA', - "LessFullEqual;": '\U00002266', - "LessGreater;": '\U00002276', - "LessLess;": '\U00002AA1', - "LessSlantEqual;": '\U00002A7D', - "LessTilde;": '\U00002272', - "Lfr;": '\U0001D50F', - "Ll;": '\U000022D8', - "Lleftarrow;": '\U000021DA', - "Lmidot;": '\U0000013F', - "LongLeftArrow;": '\U000027F5', - "LongLeftRightArrow;": '\U000027F7', - "LongRightArrow;": '\U000027F6', - "Longleftarrow;": '\U000027F8', - "Longleftrightarrow;": '\U000027FA', - "Longrightarrow;": '\U000027F9', - "Lopf;": '\U0001D543', - "LowerLeftArrow;": '\U00002199', - "LowerRightArrow;": '\U00002198', - "Lscr;": '\U00002112', - "Lsh;": '\U000021B0', - "Lstrok;": '\U00000141', - "Lt;": '\U0000226A', - "Map;": '\U00002905', - "Mcy;": '\U0000041C', - "MediumSpace;": '\U0000205F', - "Mellintrf;": '\U00002133', - "Mfr;": '\U0001D510', - "MinusPlus;": '\U00002213', - "Mopf;": '\U0001D544', - "Mscr;": '\U00002133', - "Mu;": '\U0000039C', - "NJcy;": '\U0000040A', - "Nacute;": '\U00000143', - "Ncaron;": '\U00000147', - "Ncedil;": '\U00000145', - "Ncy;": '\U0000041D', - "NegativeMediumSpace;": '\U0000200B', - "NegativeThickSpace;": '\U0000200B', - "NegativeThinSpace;": '\U0000200B', - "NegativeVeryThinSpace;": '\U0000200B', - "NestedGreaterGreater;": '\U0000226B', - "NestedLessLess;": '\U0000226A', - "NewLine;": '\U0000000A', - "Nfr;": '\U0001D511', - "NoBreak;": '\U00002060', - "NonBreakingSpace;": '\U000000A0', - "Nopf;": '\U00002115', - "Not;": '\U00002AEC', - "NotCongruent;": '\U00002262', - "NotCupCap;": '\U0000226D', - "NotDoubleVerticalBar;": '\U00002226', - "NotElement;": '\U00002209', - "NotEqual;": '\U00002260', - "NotExists;": '\U00002204', - "NotGreater;": '\U0000226F', - "NotGreaterEqual;": '\U00002271', - "NotGreaterLess;": '\U00002279', - "NotGreaterTilde;": '\U00002275', - "NotLeftTriangle;": '\U000022EA', - "NotLeftTriangleEqual;": '\U000022EC', - "NotLess;": '\U0000226E', - "NotLessEqual;": '\U00002270', - "NotLessGreater;": '\U00002278', - "NotLessTilde;": '\U00002274', - "NotPrecedes;": '\U00002280', - "NotPrecedesSlantEqual;": '\U000022E0', - "NotReverseElement;": '\U0000220C', - "NotRightTriangle;": '\U000022EB', - "NotRightTriangleEqual;": '\U000022ED', - "NotSquareSubsetEqual;": '\U000022E2', - "NotSquareSupersetEqual;": '\U000022E3', - "NotSubsetEqual;": '\U00002288', - "NotSucceeds;": '\U00002281', - "NotSucceedsSlantEqual;": '\U000022E1', - "NotSupersetEqual;": '\U00002289', - "NotTilde;": '\U00002241', - "NotTildeEqual;": '\U00002244', - "NotTildeFullEqual;": '\U00002247', - "NotTildeTilde;": '\U00002249', - "NotVerticalBar;": '\U00002224', - "Nscr;": '\U0001D4A9', - "Ntilde;": '\U000000D1', - "Nu;": '\U0000039D', - "OElig;": '\U00000152', - "Oacute;": '\U000000D3', - "Ocirc;": '\U000000D4', - "Ocy;": '\U0000041E', - "Odblac;": '\U00000150', - "Ofr;": '\U0001D512', - "Ograve;": '\U000000D2', - "Omacr;": '\U0000014C', - "Omega;": '\U000003A9', - "Omicron;": '\U0000039F', - "Oopf;": '\U0001D546', - "OpenCurlyDoubleQuote;": '\U0000201C', - "OpenCurlyQuote;": '\U00002018', - "Or;": '\U00002A54', - "Oscr;": '\U0001D4AA', - "Oslash;": '\U000000D8', - "Otilde;": '\U000000D5', - "Otimes;": '\U00002A37', - "Ouml;": '\U000000D6', - "OverBar;": '\U0000203E', - "OverBrace;": '\U000023DE', - "OverBracket;": '\U000023B4', - "OverParenthesis;": '\U000023DC', - "PartialD;": '\U00002202', - "Pcy;": '\U0000041F', - "Pfr;": '\U0001D513', - "Phi;": '\U000003A6', - "Pi;": '\U000003A0', - "PlusMinus;": '\U000000B1', - "Poincareplane;": '\U0000210C', - "Popf;": '\U00002119', - "Pr;": '\U00002ABB', - "Precedes;": '\U0000227A', - "PrecedesEqual;": '\U00002AAF', - "PrecedesSlantEqual;": '\U0000227C', - "PrecedesTilde;": '\U0000227E', - "Prime;": '\U00002033', - "Product;": '\U0000220F', - "Proportion;": '\U00002237', - "Proportional;": '\U0000221D', - "Pscr;": '\U0001D4AB', - "Psi;": '\U000003A8', - "QUOT;": '\U00000022', - "Qfr;": '\U0001D514', - "Qopf;": '\U0000211A', - "Qscr;": '\U0001D4AC', - "RBarr;": '\U00002910', - "REG;": '\U000000AE', - "Racute;": '\U00000154', - "Rang;": '\U000027EB', - "Rarr;": '\U000021A0', - "Rarrtl;": '\U00002916', - "Rcaron;": '\U00000158', - "Rcedil;": '\U00000156', - "Rcy;": '\U00000420', - "Re;": '\U0000211C', - "ReverseElement;": '\U0000220B', - "ReverseEquilibrium;": '\U000021CB', - "ReverseUpEquilibrium;": '\U0000296F', - "Rfr;": '\U0000211C', - "Rho;": '\U000003A1', - "RightAngleBracket;": '\U000027E9', - "RightArrow;": '\U00002192', - "RightArrowBar;": '\U000021E5', - "RightArrowLeftArrow;": '\U000021C4', - "RightCeiling;": '\U00002309', - "RightDoubleBracket;": '\U000027E7', - "RightDownTeeVector;": '\U0000295D', - "RightDownVector;": '\U000021C2', - "RightDownVectorBar;": '\U00002955', - "RightFloor;": '\U0000230B', - "RightTee;": '\U000022A2', - "RightTeeArrow;": '\U000021A6', - "RightTeeVector;": '\U0000295B', - "RightTriangle;": '\U000022B3', - "RightTriangleBar;": '\U000029D0', - "RightTriangleEqual;": '\U000022B5', - "RightUpDownVector;": '\U0000294F', - "RightUpTeeVector;": '\U0000295C', - "RightUpVector;": '\U000021BE', - "RightUpVectorBar;": '\U00002954', - "RightVector;": '\U000021C0', - "RightVectorBar;": '\U00002953', - "Rightarrow;": '\U000021D2', - "Ropf;": '\U0000211D', - "RoundImplies;": '\U00002970', - "Rrightarrow;": '\U000021DB', - "Rscr;": '\U0000211B', - "Rsh;": '\U000021B1', - "RuleDelayed;": '\U000029F4', - "SHCHcy;": '\U00000429', - "SHcy;": '\U00000428', - "SOFTcy;": '\U0000042C', - "Sacute;": '\U0000015A', - "Sc;": '\U00002ABC', - "Scaron;": '\U00000160', - "Scedil;": '\U0000015E', - "Scirc;": '\U0000015C', - "Scy;": '\U00000421', - "Sfr;": '\U0001D516', - "ShortDownArrow;": '\U00002193', - "ShortLeftArrow;": '\U00002190', - "ShortRightArrow;": '\U00002192', - "ShortUpArrow;": '\U00002191', - "Sigma;": '\U000003A3', - "SmallCircle;": '\U00002218', - "Sopf;": '\U0001D54A', - "Sqrt;": '\U0000221A', - "Square;": '\U000025A1', - "SquareIntersection;": '\U00002293', - "SquareSubset;": '\U0000228F', - "SquareSubsetEqual;": '\U00002291', - "SquareSuperset;": '\U00002290', - "SquareSupersetEqual;": '\U00002292', - "SquareUnion;": '\U00002294', - "Sscr;": '\U0001D4AE', - "Star;": '\U000022C6', - "Sub;": '\U000022D0', - "Subset;": '\U000022D0', - "SubsetEqual;": '\U00002286', - "Succeeds;": '\U0000227B', - "SucceedsEqual;": '\U00002AB0', - "SucceedsSlantEqual;": '\U0000227D', - "SucceedsTilde;": '\U0000227F', - "SuchThat;": '\U0000220B', - "Sum;": '\U00002211', - "Sup;": '\U000022D1', - "Superset;": '\U00002283', - "SupersetEqual;": '\U00002287', - "Supset;": '\U000022D1', - "THORN;": '\U000000DE', - "TRADE;": '\U00002122', - "TSHcy;": '\U0000040B', - "TScy;": '\U00000426', - "Tab;": '\U00000009', - "Tau;": '\U000003A4', - "Tcaron;": '\U00000164', - "Tcedil;": '\U00000162', - "Tcy;": '\U00000422', - "Tfr;": '\U0001D517', - "Therefore;": '\U00002234', - "Theta;": '\U00000398', - "ThinSpace;": '\U00002009', - "Tilde;": '\U0000223C', - "TildeEqual;": '\U00002243', - "TildeFullEqual;": '\U00002245', - "TildeTilde;": '\U00002248', - "Topf;": '\U0001D54B', - "TripleDot;": '\U000020DB', - "Tscr;": '\U0001D4AF', - "Tstrok;": '\U00000166', - "Uacute;": '\U000000DA', - "Uarr;": '\U0000219F', - "Uarrocir;": '\U00002949', - "Ubrcy;": '\U0000040E', - "Ubreve;": '\U0000016C', - "Ucirc;": '\U000000DB', - "Ucy;": '\U00000423', - "Udblac;": '\U00000170', - "Ufr;": '\U0001D518', - "Ugrave;": '\U000000D9', - "Umacr;": '\U0000016A', - "UnderBar;": '\U0000005F', - "UnderBrace;": '\U000023DF', - "UnderBracket;": '\U000023B5', - "UnderParenthesis;": '\U000023DD', - "Union;": '\U000022C3', - "UnionPlus;": '\U0000228E', - "Uogon;": '\U00000172', - "Uopf;": '\U0001D54C', - "UpArrow;": '\U00002191', - "UpArrowBar;": '\U00002912', - "UpArrowDownArrow;": '\U000021C5', - "UpDownArrow;": '\U00002195', - "UpEquilibrium;": '\U0000296E', - "UpTee;": '\U000022A5', - "UpTeeArrow;": '\U000021A5', - "Uparrow;": '\U000021D1', - "Updownarrow;": '\U000021D5', - "UpperLeftArrow;": '\U00002196', - "UpperRightArrow;": '\U00002197', - "Upsi;": '\U000003D2', - "Upsilon;": '\U000003A5', - "Uring;": '\U0000016E', - "Uscr;": '\U0001D4B0', - "Utilde;": '\U00000168', - "Uuml;": '\U000000DC', - "VDash;": '\U000022AB', - "Vbar;": '\U00002AEB', - "Vcy;": '\U00000412', - "Vdash;": '\U000022A9', - "Vdashl;": '\U00002AE6', - "Vee;": '\U000022C1', - "Verbar;": '\U00002016', - "Vert;": '\U00002016', - "VerticalBar;": '\U00002223', - "VerticalLine;": '\U0000007C', - "VerticalSeparator;": '\U00002758', - "VerticalTilde;": '\U00002240', - "VeryThinSpace;": '\U0000200A', - "Vfr;": '\U0001D519', - "Vopf;": '\U0001D54D', - "Vscr;": '\U0001D4B1', - "Vvdash;": '\U000022AA', - "Wcirc;": '\U00000174', - "Wedge;": '\U000022C0', - "Wfr;": '\U0001D51A', - "Wopf;": '\U0001D54E', - "Wscr;": '\U0001D4B2', - "Xfr;": '\U0001D51B', - "Xi;": '\U0000039E', - "Xopf;": '\U0001D54F', - "Xscr;": '\U0001D4B3', - "YAcy;": '\U0000042F', - "YIcy;": '\U00000407', - "YUcy;": '\U0000042E', - "Yacute;": '\U000000DD', - "Ycirc;": '\U00000176', - "Ycy;": '\U0000042B', - "Yfr;": '\U0001D51C', - "Yopf;": '\U0001D550', - "Yscr;": '\U0001D4B4', - "Yuml;": '\U00000178', - "ZHcy;": '\U00000416', - "Zacute;": '\U00000179', - "Zcaron;": '\U0000017D', - "Zcy;": '\U00000417', - "Zdot;": '\U0000017B', - "ZeroWidthSpace;": '\U0000200B', - "Zeta;": '\U00000396', - "Zfr;": '\U00002128', - "Zopf;": '\U00002124', - "Zscr;": '\U0001D4B5', - "aacute;": '\U000000E1', - "abreve;": '\U00000103', - "ac;": '\U0000223E', - "acd;": '\U0000223F', - "acirc;": '\U000000E2', - "acute;": '\U000000B4', - "acy;": '\U00000430', - "aelig;": '\U000000E6', - "af;": '\U00002061', - "afr;": '\U0001D51E', - "agrave;": '\U000000E0', - "alefsym;": '\U00002135', - "aleph;": '\U00002135', - "alpha;": '\U000003B1', - "amacr;": '\U00000101', - "amalg;": '\U00002A3F', - "amp;": '\U00000026', - "and;": '\U00002227', - "andand;": '\U00002A55', - "andd;": '\U00002A5C', - "andslope;": '\U00002A58', - "andv;": '\U00002A5A', - "ang;": '\U00002220', - "ange;": '\U000029A4', - "angle;": '\U00002220', - "angmsd;": '\U00002221', - "angmsdaa;": '\U000029A8', - "angmsdab;": '\U000029A9', - "angmsdac;": '\U000029AA', - "angmsdad;": '\U000029AB', - "angmsdae;": '\U000029AC', - "angmsdaf;": '\U000029AD', - "angmsdag;": '\U000029AE', - "angmsdah;": '\U000029AF', - "angrt;": '\U0000221F', - "angrtvb;": '\U000022BE', - "angrtvbd;": '\U0000299D', - "angsph;": '\U00002222', - "angst;": '\U000000C5', - "angzarr;": '\U0000237C', - "aogon;": '\U00000105', - "aopf;": '\U0001D552', - "ap;": '\U00002248', - "apE;": '\U00002A70', - "apacir;": '\U00002A6F', - "ape;": '\U0000224A', - "apid;": '\U0000224B', - "apos;": '\U00000027', - "approx;": '\U00002248', - "approxeq;": '\U0000224A', - "aring;": '\U000000E5', - "ascr;": '\U0001D4B6', - "ast;": '\U0000002A', - "asymp;": '\U00002248', - "asympeq;": '\U0000224D', - "atilde;": '\U000000E3', - "auml;": '\U000000E4', - "awconint;": '\U00002233', - "awint;": '\U00002A11', - "bNot;": '\U00002AED', - "backcong;": '\U0000224C', - "backepsilon;": '\U000003F6', - "backprime;": '\U00002035', - "backsim;": '\U0000223D', - "backsimeq;": '\U000022CD', - "barvee;": '\U000022BD', - "barwed;": '\U00002305', - "barwedge;": '\U00002305', - "bbrk;": '\U000023B5', - "bbrktbrk;": '\U000023B6', - "bcong;": '\U0000224C', - "bcy;": '\U00000431', - "bdquo;": '\U0000201E', - "becaus;": '\U00002235', - "because;": '\U00002235', - "bemptyv;": '\U000029B0', - "bepsi;": '\U000003F6', - "bernou;": '\U0000212C', - "beta;": '\U000003B2', - "beth;": '\U00002136', - "between;": '\U0000226C', - "bfr;": '\U0001D51F', - "bigcap;": '\U000022C2', - "bigcirc;": '\U000025EF', - "bigcup;": '\U000022C3', - "bigodot;": '\U00002A00', - "bigoplus;": '\U00002A01', - "bigotimes;": '\U00002A02', - "bigsqcup;": '\U00002A06', - "bigstar;": '\U00002605', - "bigtriangledown;": '\U000025BD', - "bigtriangleup;": '\U000025B3', - "biguplus;": '\U00002A04', - "bigvee;": '\U000022C1', - "bigwedge;": '\U000022C0', - "bkarow;": '\U0000290D', - "blacklozenge;": '\U000029EB', - "blacksquare;": '\U000025AA', - "blacktriangle;": '\U000025B4', - "blacktriangledown;": '\U000025BE', - "blacktriangleleft;": '\U000025C2', - "blacktriangleright;": '\U000025B8', - "blank;": '\U00002423', - "blk12;": '\U00002592', - "blk14;": '\U00002591', - "blk34;": '\U00002593', - "block;": '\U00002588', - "bnot;": '\U00002310', - "bopf;": '\U0001D553', - "bot;": '\U000022A5', - "bottom;": '\U000022A5', - "bowtie;": '\U000022C8', - "boxDL;": '\U00002557', - "boxDR;": '\U00002554', - "boxDl;": '\U00002556', - "boxDr;": '\U00002553', - "boxH;": '\U00002550', - "boxHD;": '\U00002566', - "boxHU;": '\U00002569', - "boxHd;": '\U00002564', - "boxHu;": '\U00002567', - "boxUL;": '\U0000255D', - "boxUR;": '\U0000255A', - "boxUl;": '\U0000255C', - "boxUr;": '\U00002559', - "boxV;": '\U00002551', - "boxVH;": '\U0000256C', - "boxVL;": '\U00002563', - "boxVR;": '\U00002560', - "boxVh;": '\U0000256B', - "boxVl;": '\U00002562', - "boxVr;": '\U0000255F', - "boxbox;": '\U000029C9', - "boxdL;": '\U00002555', - "boxdR;": '\U00002552', - "boxdl;": '\U00002510', - "boxdr;": '\U0000250C', - "boxh;": '\U00002500', - "boxhD;": '\U00002565', - "boxhU;": '\U00002568', - "boxhd;": '\U0000252C', - "boxhu;": '\U00002534', - "boxminus;": '\U0000229F', - "boxplus;": '\U0000229E', - "boxtimes;": '\U000022A0', - "boxuL;": '\U0000255B', - "boxuR;": '\U00002558', - "boxul;": '\U00002518', - "boxur;": '\U00002514', - "boxv;": '\U00002502', - "boxvH;": '\U0000256A', - "boxvL;": '\U00002561', - "boxvR;": '\U0000255E', - "boxvh;": '\U0000253C', - "boxvl;": '\U00002524', - "boxvr;": '\U0000251C', - "bprime;": '\U00002035', - "breve;": '\U000002D8', - "brvbar;": '\U000000A6', - "bscr;": '\U0001D4B7', - "bsemi;": '\U0000204F', - "bsim;": '\U0000223D', - "bsime;": '\U000022CD', - "bsol;": '\U0000005C', - "bsolb;": '\U000029C5', - "bsolhsub;": '\U000027C8', - "bull;": '\U00002022', - "bullet;": '\U00002022', - "bump;": '\U0000224E', - "bumpE;": '\U00002AAE', - "bumpe;": '\U0000224F', - "bumpeq;": '\U0000224F', - "cacute;": '\U00000107', - "cap;": '\U00002229', - "capand;": '\U00002A44', - "capbrcup;": '\U00002A49', - "capcap;": '\U00002A4B', - "capcup;": '\U00002A47', - "capdot;": '\U00002A40', - "caret;": '\U00002041', - "caron;": '\U000002C7', - "ccaps;": '\U00002A4D', - "ccaron;": '\U0000010D', - "ccedil;": '\U000000E7', - "ccirc;": '\U00000109', - "ccups;": '\U00002A4C', - "ccupssm;": '\U00002A50', - "cdot;": '\U0000010B', - "cedil;": '\U000000B8', - "cemptyv;": '\U000029B2', - "cent;": '\U000000A2', - "centerdot;": '\U000000B7', - "cfr;": '\U0001D520', - "chcy;": '\U00000447', - "check;": '\U00002713', - "checkmark;": '\U00002713', - "chi;": '\U000003C7', - "cir;": '\U000025CB', - "cirE;": '\U000029C3', - "circ;": '\U000002C6', - "circeq;": '\U00002257', - "circlearrowleft;": '\U000021BA', - "circlearrowright;": '\U000021BB', - "circledR;": '\U000000AE', - "circledS;": '\U000024C8', - "circledast;": '\U0000229B', - "circledcirc;": '\U0000229A', - "circleddash;": '\U0000229D', - "cire;": '\U00002257', - "cirfnint;": '\U00002A10', - "cirmid;": '\U00002AEF', - "cirscir;": '\U000029C2', - "clubs;": '\U00002663', - "clubsuit;": '\U00002663', - "colon;": '\U0000003A', - "colone;": '\U00002254', - "coloneq;": '\U00002254', - "comma;": '\U0000002C', - "commat;": '\U00000040', - "comp;": '\U00002201', - "compfn;": '\U00002218', - "complement;": '\U00002201', - "complexes;": '\U00002102', - "cong;": '\U00002245', - "congdot;": '\U00002A6D', - "conint;": '\U0000222E', - "copf;": '\U0001D554', - "coprod;": '\U00002210', - "copy;": '\U000000A9', - "copysr;": '\U00002117', - "crarr;": '\U000021B5', - "cross;": '\U00002717', - "cscr;": '\U0001D4B8', - "csub;": '\U00002ACF', - "csube;": '\U00002AD1', - "csup;": '\U00002AD0', - "csupe;": '\U00002AD2', - "ctdot;": '\U000022EF', - "cudarrl;": '\U00002938', - "cudarrr;": '\U00002935', - "cuepr;": '\U000022DE', - "cuesc;": '\U000022DF', - "cularr;": '\U000021B6', - "cularrp;": '\U0000293D', - "cup;": '\U0000222A', - "cupbrcap;": '\U00002A48', - "cupcap;": '\U00002A46', - "cupcup;": '\U00002A4A', - "cupdot;": '\U0000228D', - "cupor;": '\U00002A45', - "curarr;": '\U000021B7', - "curarrm;": '\U0000293C', - "curlyeqprec;": '\U000022DE', - "curlyeqsucc;": '\U000022DF', - "curlyvee;": '\U000022CE', - "curlywedge;": '\U000022CF', - "curren;": '\U000000A4', - "curvearrowleft;": '\U000021B6', - "curvearrowright;": '\U000021B7', - "cuvee;": '\U000022CE', - "cuwed;": '\U000022CF', - "cwconint;": '\U00002232', - "cwint;": '\U00002231', - "cylcty;": '\U0000232D', - "dArr;": '\U000021D3', - "dHar;": '\U00002965', - "dagger;": '\U00002020', - "daleth;": '\U00002138', - "darr;": '\U00002193', - "dash;": '\U00002010', - "dashv;": '\U000022A3', - "dbkarow;": '\U0000290F', - "dblac;": '\U000002DD', - "dcaron;": '\U0000010F', - "dcy;": '\U00000434', - "dd;": '\U00002146', - "ddagger;": '\U00002021', - "ddarr;": '\U000021CA', - "ddotseq;": '\U00002A77', - "deg;": '\U000000B0', - "delta;": '\U000003B4', - "demptyv;": '\U000029B1', - "dfisht;": '\U0000297F', - "dfr;": '\U0001D521', - "dharl;": '\U000021C3', - "dharr;": '\U000021C2', - "diam;": '\U000022C4', - "diamond;": '\U000022C4', - "diamondsuit;": '\U00002666', - "diams;": '\U00002666', - "die;": '\U000000A8', - "digamma;": '\U000003DD', - "disin;": '\U000022F2', - "div;": '\U000000F7', - "divide;": '\U000000F7', - "divideontimes;": '\U000022C7', - "divonx;": '\U000022C7', - "djcy;": '\U00000452', - "dlcorn;": '\U0000231E', - "dlcrop;": '\U0000230D', - "dollar;": '\U00000024', - "dopf;": '\U0001D555', - "dot;": '\U000002D9', - "doteq;": '\U00002250', - "doteqdot;": '\U00002251', - "dotminus;": '\U00002238', - "dotplus;": '\U00002214', - "dotsquare;": '\U000022A1', - "doublebarwedge;": '\U00002306', - "downarrow;": '\U00002193', - "downdownarrows;": '\U000021CA', - "downharpoonleft;": '\U000021C3', - "downharpoonright;": '\U000021C2', - "drbkarow;": '\U00002910', - "drcorn;": '\U0000231F', - "drcrop;": '\U0000230C', - "dscr;": '\U0001D4B9', - "dscy;": '\U00000455', - "dsol;": '\U000029F6', - "dstrok;": '\U00000111', - "dtdot;": '\U000022F1', - "dtri;": '\U000025BF', - "dtrif;": '\U000025BE', - "duarr;": '\U000021F5', - "duhar;": '\U0000296F', - "dwangle;": '\U000029A6', - "dzcy;": '\U0000045F', - "dzigrarr;": '\U000027FF', - "eDDot;": '\U00002A77', - "eDot;": '\U00002251', - "eacute;": '\U000000E9', - "easter;": '\U00002A6E', - "ecaron;": '\U0000011B', - "ecir;": '\U00002256', - "ecirc;": '\U000000EA', - "ecolon;": '\U00002255', - "ecy;": '\U0000044D', - "edot;": '\U00000117', - "ee;": '\U00002147', - "efDot;": '\U00002252', - "efr;": '\U0001D522', - "eg;": '\U00002A9A', - "egrave;": '\U000000E8', - "egs;": '\U00002A96', - "egsdot;": '\U00002A98', - "el;": '\U00002A99', - "elinters;": '\U000023E7', - "ell;": '\U00002113', - "els;": '\U00002A95', - "elsdot;": '\U00002A97', - "emacr;": '\U00000113', - "empty;": '\U00002205', - "emptyset;": '\U00002205', - "emptyv;": '\U00002205', - "emsp;": '\U00002003', - "emsp13;": '\U00002004', - "emsp14;": '\U00002005', - "eng;": '\U0000014B', - "ensp;": '\U00002002', - "eogon;": '\U00000119', - "eopf;": '\U0001D556', - "epar;": '\U000022D5', - "eparsl;": '\U000029E3', - "eplus;": '\U00002A71', - "epsi;": '\U000003B5', - "epsilon;": '\U000003B5', - "epsiv;": '\U000003F5', - "eqcirc;": '\U00002256', - "eqcolon;": '\U00002255', - "eqsim;": '\U00002242', - "eqslantgtr;": '\U00002A96', - "eqslantless;": '\U00002A95', - "equals;": '\U0000003D', - "equest;": '\U0000225F', - "equiv;": '\U00002261', - "equivDD;": '\U00002A78', - "eqvparsl;": '\U000029E5', - "erDot;": '\U00002253', - "erarr;": '\U00002971', - "escr;": '\U0000212F', - "esdot;": '\U00002250', - "esim;": '\U00002242', - "eta;": '\U000003B7', - "eth;": '\U000000F0', - "euml;": '\U000000EB', - "euro;": '\U000020AC', - "excl;": '\U00000021', - "exist;": '\U00002203', - "expectation;": '\U00002130', - "exponentiale;": '\U00002147', - "fallingdotseq;": '\U00002252', - "fcy;": '\U00000444', - "female;": '\U00002640', - "ffilig;": '\U0000FB03', - "fflig;": '\U0000FB00', - "ffllig;": '\U0000FB04', - "ffr;": '\U0001D523', - "filig;": '\U0000FB01', - "flat;": '\U0000266D', - "fllig;": '\U0000FB02', - "fltns;": '\U000025B1', - "fnof;": '\U00000192', - "fopf;": '\U0001D557', - "forall;": '\U00002200', - "fork;": '\U000022D4', - "forkv;": '\U00002AD9', - "fpartint;": '\U00002A0D', - "frac12;": '\U000000BD', - "frac13;": '\U00002153', - "frac14;": '\U000000BC', - "frac15;": '\U00002155', - "frac16;": '\U00002159', - "frac18;": '\U0000215B', - "frac23;": '\U00002154', - "frac25;": '\U00002156', - "frac34;": '\U000000BE', - "frac35;": '\U00002157', - "frac38;": '\U0000215C', - "frac45;": '\U00002158', - "frac56;": '\U0000215A', - "frac58;": '\U0000215D', - "frac78;": '\U0000215E', - "frasl;": '\U00002044', - "frown;": '\U00002322', - "fscr;": '\U0001D4BB', - "gE;": '\U00002267', - "gEl;": '\U00002A8C', - "gacute;": '\U000001F5', - "gamma;": '\U000003B3', - "gammad;": '\U000003DD', - "gap;": '\U00002A86', - "gbreve;": '\U0000011F', - "gcirc;": '\U0000011D', - "gcy;": '\U00000433', - "gdot;": '\U00000121', - "ge;": '\U00002265', - "gel;": '\U000022DB', - "geq;": '\U00002265', - "geqq;": '\U00002267', - "geqslant;": '\U00002A7E', - "ges;": '\U00002A7E', - "gescc;": '\U00002AA9', - "gesdot;": '\U00002A80', - "gesdoto;": '\U00002A82', - "gesdotol;": '\U00002A84', - "gesles;": '\U00002A94', - "gfr;": '\U0001D524', - "gg;": '\U0000226B', - "ggg;": '\U000022D9', - "gimel;": '\U00002137', - "gjcy;": '\U00000453', - "gl;": '\U00002277', - "glE;": '\U00002A92', - "gla;": '\U00002AA5', - "glj;": '\U00002AA4', - "gnE;": '\U00002269', - "gnap;": '\U00002A8A', - "gnapprox;": '\U00002A8A', - "gne;": '\U00002A88', - "gneq;": '\U00002A88', - "gneqq;": '\U00002269', - "gnsim;": '\U000022E7', - "gopf;": '\U0001D558', - "grave;": '\U00000060', - "gscr;": '\U0000210A', - "gsim;": '\U00002273', - "gsime;": '\U00002A8E', - "gsiml;": '\U00002A90', - "gt;": '\U0000003E', - "gtcc;": '\U00002AA7', - "gtcir;": '\U00002A7A', - "gtdot;": '\U000022D7', - "gtlPar;": '\U00002995', - "gtquest;": '\U00002A7C', - "gtrapprox;": '\U00002A86', - "gtrarr;": '\U00002978', - "gtrdot;": '\U000022D7', - "gtreqless;": '\U000022DB', - "gtreqqless;": '\U00002A8C', - "gtrless;": '\U00002277', - "gtrsim;": '\U00002273', - "hArr;": '\U000021D4', - "hairsp;": '\U0000200A', - "half;": '\U000000BD', - "hamilt;": '\U0000210B', - "hardcy;": '\U0000044A', - "harr;": '\U00002194', - "harrcir;": '\U00002948', - "harrw;": '\U000021AD', - "hbar;": '\U0000210F', - "hcirc;": '\U00000125', - "hearts;": '\U00002665', - "heartsuit;": '\U00002665', - "hellip;": '\U00002026', - "hercon;": '\U000022B9', - "hfr;": '\U0001D525', - "hksearow;": '\U00002925', - "hkswarow;": '\U00002926', - "hoarr;": '\U000021FF', - "homtht;": '\U0000223B', - "hookleftarrow;": '\U000021A9', - "hookrightarrow;": '\U000021AA', - "hopf;": '\U0001D559', - "horbar;": '\U00002015', - "hscr;": '\U0001D4BD', - "hslash;": '\U0000210F', - "hstrok;": '\U00000127', - "hybull;": '\U00002043', - "hyphen;": '\U00002010', - "iacute;": '\U000000ED', - "ic;": '\U00002063', - "icirc;": '\U000000EE', - "icy;": '\U00000438', - "iecy;": '\U00000435', - "iexcl;": '\U000000A1', - "iff;": '\U000021D4', - "ifr;": '\U0001D526', - "igrave;": '\U000000EC', - "ii;": '\U00002148', - "iiiint;": '\U00002A0C', - "iiint;": '\U0000222D', - "iinfin;": '\U000029DC', - "iiota;": '\U00002129', - "ijlig;": '\U00000133', - "imacr;": '\U0000012B', - "image;": '\U00002111', - "imagline;": '\U00002110', - "imagpart;": '\U00002111', - "imath;": '\U00000131', - "imof;": '\U000022B7', - "imped;": '\U000001B5', - "in;": '\U00002208', - "incare;": '\U00002105', - "infin;": '\U0000221E', - "infintie;": '\U000029DD', - "inodot;": '\U00000131', - "int;": '\U0000222B', - "intcal;": '\U000022BA', - "integers;": '\U00002124', - "intercal;": '\U000022BA', - "intlarhk;": '\U00002A17', - "intprod;": '\U00002A3C', - "iocy;": '\U00000451', - "iogon;": '\U0000012F', - "iopf;": '\U0001D55A', - "iota;": '\U000003B9', - "iprod;": '\U00002A3C', - "iquest;": '\U000000BF', - "iscr;": '\U0001D4BE', - "isin;": '\U00002208', - "isinE;": '\U000022F9', - "isindot;": '\U000022F5', - "isins;": '\U000022F4', - "isinsv;": '\U000022F3', - "isinv;": '\U00002208', - "it;": '\U00002062', - "itilde;": '\U00000129', - "iukcy;": '\U00000456', - "iuml;": '\U000000EF', - "jcirc;": '\U00000135', - "jcy;": '\U00000439', - "jfr;": '\U0001D527', - "jmath;": '\U00000237', - "jopf;": '\U0001D55B', - "jscr;": '\U0001D4BF', - "jsercy;": '\U00000458', - "jukcy;": '\U00000454', - "kappa;": '\U000003BA', - "kappav;": '\U000003F0', - "kcedil;": '\U00000137', - "kcy;": '\U0000043A', - "kfr;": '\U0001D528', - "kgreen;": '\U00000138', - "khcy;": '\U00000445', - "kjcy;": '\U0000045C', - "kopf;": '\U0001D55C', - "kscr;": '\U0001D4C0', - "lAarr;": '\U000021DA', - "lArr;": '\U000021D0', - "lAtail;": '\U0000291B', - "lBarr;": '\U0000290E', - "lE;": '\U00002266', - "lEg;": '\U00002A8B', - "lHar;": '\U00002962', - "lacute;": '\U0000013A', - "laemptyv;": '\U000029B4', - "lagran;": '\U00002112', - "lambda;": '\U000003BB', - "lang;": '\U000027E8', - "langd;": '\U00002991', - "langle;": '\U000027E8', - "lap;": '\U00002A85', - "laquo;": '\U000000AB', - "larr;": '\U00002190', - "larrb;": '\U000021E4', - "larrbfs;": '\U0000291F', - "larrfs;": '\U0000291D', - "larrhk;": '\U000021A9', - "larrlp;": '\U000021AB', - "larrpl;": '\U00002939', - "larrsim;": '\U00002973', - "larrtl;": '\U000021A2', - "lat;": '\U00002AAB', - "latail;": '\U00002919', - "late;": '\U00002AAD', - "lbarr;": '\U0000290C', - "lbbrk;": '\U00002772', - "lbrace;": '\U0000007B', - "lbrack;": '\U0000005B', - "lbrke;": '\U0000298B', - "lbrksld;": '\U0000298F', - "lbrkslu;": '\U0000298D', - "lcaron;": '\U0000013E', - "lcedil;": '\U0000013C', - "lceil;": '\U00002308', - "lcub;": '\U0000007B', - "lcy;": '\U0000043B', - "ldca;": '\U00002936', - "ldquo;": '\U0000201C', - "ldquor;": '\U0000201E', - "ldrdhar;": '\U00002967', - "ldrushar;": '\U0000294B', - "ldsh;": '\U000021B2', - "le;": '\U00002264', - "leftarrow;": '\U00002190', - "leftarrowtail;": '\U000021A2', - "leftharpoondown;": '\U000021BD', - "leftharpoonup;": '\U000021BC', - "leftleftarrows;": '\U000021C7', - "leftrightarrow;": '\U00002194', - "leftrightarrows;": '\U000021C6', - "leftrightharpoons;": '\U000021CB', - "leftrightsquigarrow;": '\U000021AD', - "leftthreetimes;": '\U000022CB', - "leg;": '\U000022DA', - "leq;": '\U00002264', - "leqq;": '\U00002266', - "leqslant;": '\U00002A7D', - "les;": '\U00002A7D', - "lescc;": '\U00002AA8', - "lesdot;": '\U00002A7F', - "lesdoto;": '\U00002A81', - "lesdotor;": '\U00002A83', - "lesges;": '\U00002A93', - "lessapprox;": '\U00002A85', - "lessdot;": '\U000022D6', - "lesseqgtr;": '\U000022DA', - "lesseqqgtr;": '\U00002A8B', - "lessgtr;": '\U00002276', - "lesssim;": '\U00002272', - "lfisht;": '\U0000297C', - "lfloor;": '\U0000230A', - "lfr;": '\U0001D529', - "lg;": '\U00002276', - "lgE;": '\U00002A91', - "lhard;": '\U000021BD', - "lharu;": '\U000021BC', - "lharul;": '\U0000296A', - "lhblk;": '\U00002584', - "ljcy;": '\U00000459', - "ll;": '\U0000226A', - "llarr;": '\U000021C7', - "llcorner;": '\U0000231E', - "llhard;": '\U0000296B', - "lltri;": '\U000025FA', - "lmidot;": '\U00000140', - "lmoust;": '\U000023B0', - "lmoustache;": '\U000023B0', - "lnE;": '\U00002268', - "lnap;": '\U00002A89', - "lnapprox;": '\U00002A89', - "lne;": '\U00002A87', - "lneq;": '\U00002A87', - "lneqq;": '\U00002268', - "lnsim;": '\U000022E6', - "loang;": '\U000027EC', - "loarr;": '\U000021FD', - "lobrk;": '\U000027E6', - "longleftarrow;": '\U000027F5', - "longleftrightarrow;": '\U000027F7', - "longmapsto;": '\U000027FC', - "longrightarrow;": '\U000027F6', - "looparrowleft;": '\U000021AB', - "looparrowright;": '\U000021AC', - "lopar;": '\U00002985', - "lopf;": '\U0001D55D', - "loplus;": '\U00002A2D', - "lotimes;": '\U00002A34', - "lowast;": '\U00002217', - "lowbar;": '\U0000005F', - "loz;": '\U000025CA', - "lozenge;": '\U000025CA', - "lozf;": '\U000029EB', - "lpar;": '\U00000028', - "lparlt;": '\U00002993', - "lrarr;": '\U000021C6', - "lrcorner;": '\U0000231F', - "lrhar;": '\U000021CB', - "lrhard;": '\U0000296D', - "lrm;": '\U0000200E', - "lrtri;": '\U000022BF', - "lsaquo;": '\U00002039', - "lscr;": '\U0001D4C1', - "lsh;": '\U000021B0', - "lsim;": '\U00002272', - "lsime;": '\U00002A8D', - "lsimg;": '\U00002A8F', - "lsqb;": '\U0000005B', - "lsquo;": '\U00002018', - "lsquor;": '\U0000201A', - "lstrok;": '\U00000142', - "lt;": '\U0000003C', - "ltcc;": '\U00002AA6', - "ltcir;": '\U00002A79', - "ltdot;": '\U000022D6', - "lthree;": '\U000022CB', - "ltimes;": '\U000022C9', - "ltlarr;": '\U00002976', - "ltquest;": '\U00002A7B', - "ltrPar;": '\U00002996', - "ltri;": '\U000025C3', - "ltrie;": '\U000022B4', - "ltrif;": '\U000025C2', - "lurdshar;": '\U0000294A', - "luruhar;": '\U00002966', - "mDDot;": '\U0000223A', - "macr;": '\U000000AF', - "male;": '\U00002642', - "malt;": '\U00002720', - "maltese;": '\U00002720', - "map;": '\U000021A6', - "mapsto;": '\U000021A6', - "mapstodown;": '\U000021A7', - "mapstoleft;": '\U000021A4', - "mapstoup;": '\U000021A5', - "marker;": '\U000025AE', - "mcomma;": '\U00002A29', - "mcy;": '\U0000043C', - "mdash;": '\U00002014', - "measuredangle;": '\U00002221', - "mfr;": '\U0001D52A', - "mho;": '\U00002127', - "micro;": '\U000000B5', - "mid;": '\U00002223', - "midast;": '\U0000002A', - "midcir;": '\U00002AF0', - "middot;": '\U000000B7', - "minus;": '\U00002212', - "minusb;": '\U0000229F', - "minusd;": '\U00002238', - "minusdu;": '\U00002A2A', - "mlcp;": '\U00002ADB', - "mldr;": '\U00002026', - "mnplus;": '\U00002213', - "models;": '\U000022A7', - "mopf;": '\U0001D55E', - "mp;": '\U00002213', - "mscr;": '\U0001D4C2', - "mstpos;": '\U0000223E', - "mu;": '\U000003BC', - "multimap;": '\U000022B8', - "mumap;": '\U000022B8', - "nLeftarrow;": '\U000021CD', - "nLeftrightarrow;": '\U000021CE', - "nRightarrow;": '\U000021CF', - "nVDash;": '\U000022AF', - "nVdash;": '\U000022AE', - "nabla;": '\U00002207', - "nacute;": '\U00000144', - "nap;": '\U00002249', - "napos;": '\U00000149', - "napprox;": '\U00002249', - "natur;": '\U0000266E', - "natural;": '\U0000266E', - "naturals;": '\U00002115', - "nbsp;": '\U000000A0', - "ncap;": '\U00002A43', - "ncaron;": '\U00000148', - "ncedil;": '\U00000146', - "ncong;": '\U00002247', - "ncup;": '\U00002A42', - "ncy;": '\U0000043D', - "ndash;": '\U00002013', - "ne;": '\U00002260', - "neArr;": '\U000021D7', - "nearhk;": '\U00002924', - "nearr;": '\U00002197', - "nearrow;": '\U00002197', - "nequiv;": '\U00002262', - "nesear;": '\U00002928', - "nexist;": '\U00002204', - "nexists;": '\U00002204', - "nfr;": '\U0001D52B', - "nge;": '\U00002271', - "ngeq;": '\U00002271', - "ngsim;": '\U00002275', - "ngt;": '\U0000226F', - "ngtr;": '\U0000226F', - "nhArr;": '\U000021CE', - "nharr;": '\U000021AE', - "nhpar;": '\U00002AF2', - "ni;": '\U0000220B', - "nis;": '\U000022FC', - "nisd;": '\U000022FA', - "niv;": '\U0000220B', - "njcy;": '\U0000045A', - "nlArr;": '\U000021CD', - "nlarr;": '\U0000219A', - "nldr;": '\U00002025', - "nle;": '\U00002270', - "nleftarrow;": '\U0000219A', - "nleftrightarrow;": '\U000021AE', - "nleq;": '\U00002270', - "nless;": '\U0000226E', - "nlsim;": '\U00002274', - "nlt;": '\U0000226E', - "nltri;": '\U000022EA', - "nltrie;": '\U000022EC', - "nmid;": '\U00002224', - "nopf;": '\U0001D55F', - "not;": '\U000000AC', - "notin;": '\U00002209', - "notinva;": '\U00002209', - "notinvb;": '\U000022F7', - "notinvc;": '\U000022F6', - "notni;": '\U0000220C', - "notniva;": '\U0000220C', - "notnivb;": '\U000022FE', - "notnivc;": '\U000022FD', - "npar;": '\U00002226', - "nparallel;": '\U00002226', - "npolint;": '\U00002A14', - "npr;": '\U00002280', - "nprcue;": '\U000022E0', - "nprec;": '\U00002280', - "nrArr;": '\U000021CF', - "nrarr;": '\U0000219B', - "nrightarrow;": '\U0000219B', - "nrtri;": '\U000022EB', - "nrtrie;": '\U000022ED', - "nsc;": '\U00002281', - "nsccue;": '\U000022E1', - "nscr;": '\U0001D4C3', - "nshortmid;": '\U00002224', - "nshortparallel;": '\U00002226', - "nsim;": '\U00002241', - "nsime;": '\U00002244', - "nsimeq;": '\U00002244', - "nsmid;": '\U00002224', - "nspar;": '\U00002226', - "nsqsube;": '\U000022E2', - "nsqsupe;": '\U000022E3', - "nsub;": '\U00002284', - "nsube;": '\U00002288', - "nsubseteq;": '\U00002288', - "nsucc;": '\U00002281', - "nsup;": '\U00002285', - "nsupe;": '\U00002289', - "nsupseteq;": '\U00002289', - "ntgl;": '\U00002279', - "ntilde;": '\U000000F1', - "ntlg;": '\U00002278', - "ntriangleleft;": '\U000022EA', - "ntrianglelefteq;": '\U000022EC', - "ntriangleright;": '\U000022EB', - "ntrianglerighteq;": '\U000022ED', - "nu;": '\U000003BD', - "num;": '\U00000023', - "numero;": '\U00002116', - "numsp;": '\U00002007', - "nvDash;": '\U000022AD', - "nvHarr;": '\U00002904', - "nvdash;": '\U000022AC', - "nvinfin;": '\U000029DE', - "nvlArr;": '\U00002902', - "nvrArr;": '\U00002903', - "nwArr;": '\U000021D6', - "nwarhk;": '\U00002923', - "nwarr;": '\U00002196', - "nwarrow;": '\U00002196', - "nwnear;": '\U00002927', - "oS;": '\U000024C8', - "oacute;": '\U000000F3', - "oast;": '\U0000229B', - "ocir;": '\U0000229A', - "ocirc;": '\U000000F4', - "ocy;": '\U0000043E', - "odash;": '\U0000229D', - "odblac;": '\U00000151', - "odiv;": '\U00002A38', - "odot;": '\U00002299', - "odsold;": '\U000029BC', - "oelig;": '\U00000153', - "ofcir;": '\U000029BF', - "ofr;": '\U0001D52C', - "ogon;": '\U000002DB', - "ograve;": '\U000000F2', - "ogt;": '\U000029C1', - "ohbar;": '\U000029B5', - "ohm;": '\U000003A9', - "oint;": '\U0000222E', - "olarr;": '\U000021BA', - "olcir;": '\U000029BE', - "olcross;": '\U000029BB', - "oline;": '\U0000203E', - "olt;": '\U000029C0', - "omacr;": '\U0000014D', - "omega;": '\U000003C9', - "omicron;": '\U000003BF', - "omid;": '\U000029B6', - "ominus;": '\U00002296', - "oopf;": '\U0001D560', - "opar;": '\U000029B7', - "operp;": '\U000029B9', - "oplus;": '\U00002295', - "or;": '\U00002228', - "orarr;": '\U000021BB', - "ord;": '\U00002A5D', - "order;": '\U00002134', - "orderof;": '\U00002134', - "ordf;": '\U000000AA', - "ordm;": '\U000000BA', - "origof;": '\U000022B6', - "oror;": '\U00002A56', - "orslope;": '\U00002A57', - "orv;": '\U00002A5B', - "oscr;": '\U00002134', - "oslash;": '\U000000F8', - "osol;": '\U00002298', - "otilde;": '\U000000F5', - "otimes;": '\U00002297', - "otimesas;": '\U00002A36', - "ouml;": '\U000000F6', - "ovbar;": '\U0000233D', - "par;": '\U00002225', - "para;": '\U000000B6', - "parallel;": '\U00002225', - "parsim;": '\U00002AF3', - "parsl;": '\U00002AFD', - "part;": '\U00002202', - "pcy;": '\U0000043F', - "percnt;": '\U00000025', - "period;": '\U0000002E', - "permil;": '\U00002030', - "perp;": '\U000022A5', - "pertenk;": '\U00002031', - "pfr;": '\U0001D52D', - "phi;": '\U000003C6', - "phiv;": '\U000003D5', - "phmmat;": '\U00002133', - "phone;": '\U0000260E', - "pi;": '\U000003C0', - "pitchfork;": '\U000022D4', - "piv;": '\U000003D6', - "planck;": '\U0000210F', - "planckh;": '\U0000210E', - "plankv;": '\U0000210F', - "plus;": '\U0000002B', - "plusacir;": '\U00002A23', - "plusb;": '\U0000229E', - "pluscir;": '\U00002A22', - "plusdo;": '\U00002214', - "plusdu;": '\U00002A25', - "pluse;": '\U00002A72', - "plusmn;": '\U000000B1', - "plussim;": '\U00002A26', - "plustwo;": '\U00002A27', - "pm;": '\U000000B1', - "pointint;": '\U00002A15', - "popf;": '\U0001D561', - "pound;": '\U000000A3', - "pr;": '\U0000227A', - "prE;": '\U00002AB3', - "prap;": '\U00002AB7', - "prcue;": '\U0000227C', - "pre;": '\U00002AAF', - "prec;": '\U0000227A', - "precapprox;": '\U00002AB7', - "preccurlyeq;": '\U0000227C', - "preceq;": '\U00002AAF', - "precnapprox;": '\U00002AB9', - "precneqq;": '\U00002AB5', - "precnsim;": '\U000022E8', - "precsim;": '\U0000227E', - "prime;": '\U00002032', - "primes;": '\U00002119', - "prnE;": '\U00002AB5', - "prnap;": '\U00002AB9', - "prnsim;": '\U000022E8', - "prod;": '\U0000220F', - "profalar;": '\U0000232E', - "profline;": '\U00002312', - "profsurf;": '\U00002313', - "prop;": '\U0000221D', - "propto;": '\U0000221D', - "prsim;": '\U0000227E', - "prurel;": '\U000022B0', - "pscr;": '\U0001D4C5', - "psi;": '\U000003C8', - "puncsp;": '\U00002008', - "qfr;": '\U0001D52E', - "qint;": '\U00002A0C', - "qopf;": '\U0001D562', - "qprime;": '\U00002057', - "qscr;": '\U0001D4C6', - "quaternions;": '\U0000210D', - "quatint;": '\U00002A16', - "quest;": '\U0000003F', - "questeq;": '\U0000225F', - "quot;": '\U00000022', - "rAarr;": '\U000021DB', - "rArr;": '\U000021D2', - "rAtail;": '\U0000291C', - "rBarr;": '\U0000290F', - "rHar;": '\U00002964', - "racute;": '\U00000155', - "radic;": '\U0000221A', - "raemptyv;": '\U000029B3', - "rang;": '\U000027E9', - "rangd;": '\U00002992', - "range;": '\U000029A5', - "rangle;": '\U000027E9', - "raquo;": '\U000000BB', - "rarr;": '\U00002192', - "rarrap;": '\U00002975', - "rarrb;": '\U000021E5', - "rarrbfs;": '\U00002920', - "rarrc;": '\U00002933', - "rarrfs;": '\U0000291E', - "rarrhk;": '\U000021AA', - "rarrlp;": '\U000021AC', - "rarrpl;": '\U00002945', - "rarrsim;": '\U00002974', - "rarrtl;": '\U000021A3', - "rarrw;": '\U0000219D', - "ratail;": '\U0000291A', - "ratio;": '\U00002236', - "rationals;": '\U0000211A', - "rbarr;": '\U0000290D', - "rbbrk;": '\U00002773', - "rbrace;": '\U0000007D', - "rbrack;": '\U0000005D', - "rbrke;": '\U0000298C', - "rbrksld;": '\U0000298E', - "rbrkslu;": '\U00002990', - "rcaron;": '\U00000159', - "rcedil;": '\U00000157', - "rceil;": '\U00002309', - "rcub;": '\U0000007D', - "rcy;": '\U00000440', - "rdca;": '\U00002937', - "rdldhar;": '\U00002969', - "rdquo;": '\U0000201D', - "rdquor;": '\U0000201D', - "rdsh;": '\U000021B3', - "real;": '\U0000211C', - "realine;": '\U0000211B', - "realpart;": '\U0000211C', - "reals;": '\U0000211D', - "rect;": '\U000025AD', - "reg;": '\U000000AE', - "rfisht;": '\U0000297D', - "rfloor;": '\U0000230B', - "rfr;": '\U0001D52F', - "rhard;": '\U000021C1', - "rharu;": '\U000021C0', - "rharul;": '\U0000296C', - "rho;": '\U000003C1', - "rhov;": '\U000003F1', - "rightarrow;": '\U00002192', - "rightarrowtail;": '\U000021A3', - "rightharpoondown;": '\U000021C1', - "rightharpoonup;": '\U000021C0', - "rightleftarrows;": '\U000021C4', - "rightleftharpoons;": '\U000021CC', - "rightrightarrows;": '\U000021C9', - "rightsquigarrow;": '\U0000219D', - "rightthreetimes;": '\U000022CC', - "ring;": '\U000002DA', - "risingdotseq;": '\U00002253', - "rlarr;": '\U000021C4', - "rlhar;": '\U000021CC', - "rlm;": '\U0000200F', - "rmoust;": '\U000023B1', - "rmoustache;": '\U000023B1', - "rnmid;": '\U00002AEE', - "roang;": '\U000027ED', - "roarr;": '\U000021FE', - "robrk;": '\U000027E7', - "ropar;": '\U00002986', - "ropf;": '\U0001D563', - "roplus;": '\U00002A2E', - "rotimes;": '\U00002A35', - "rpar;": '\U00000029', - "rpargt;": '\U00002994', - "rppolint;": '\U00002A12', - "rrarr;": '\U000021C9', - "rsaquo;": '\U0000203A', - "rscr;": '\U0001D4C7', - "rsh;": '\U000021B1', - "rsqb;": '\U0000005D', - "rsquo;": '\U00002019', - "rsquor;": '\U00002019', - "rthree;": '\U000022CC', - "rtimes;": '\U000022CA', - "rtri;": '\U000025B9', - "rtrie;": '\U000022B5', - "rtrif;": '\U000025B8', - "rtriltri;": '\U000029CE', - "ruluhar;": '\U00002968', - "rx;": '\U0000211E', - "sacute;": '\U0000015B', - "sbquo;": '\U0000201A', - "sc;": '\U0000227B', - "scE;": '\U00002AB4', - "scap;": '\U00002AB8', - "scaron;": '\U00000161', - "sccue;": '\U0000227D', - "sce;": '\U00002AB0', - "scedil;": '\U0000015F', - "scirc;": '\U0000015D', - "scnE;": '\U00002AB6', - "scnap;": '\U00002ABA', - "scnsim;": '\U000022E9', - "scpolint;": '\U00002A13', - "scsim;": '\U0000227F', - "scy;": '\U00000441', - "sdot;": '\U000022C5', - "sdotb;": '\U000022A1', - "sdote;": '\U00002A66', - "seArr;": '\U000021D8', - "searhk;": '\U00002925', - "searr;": '\U00002198', - "searrow;": '\U00002198', - "sect;": '\U000000A7', - "semi;": '\U0000003B', - "seswar;": '\U00002929', - "setminus;": '\U00002216', - "setmn;": '\U00002216', - "sext;": '\U00002736', - "sfr;": '\U0001D530', - "sfrown;": '\U00002322', - "sharp;": '\U0000266F', - "shchcy;": '\U00000449', - "shcy;": '\U00000448', - "shortmid;": '\U00002223', - "shortparallel;": '\U00002225', - "shy;": '\U000000AD', - "sigma;": '\U000003C3', - "sigmaf;": '\U000003C2', - "sigmav;": '\U000003C2', - "sim;": '\U0000223C', - "simdot;": '\U00002A6A', - "sime;": '\U00002243', - "simeq;": '\U00002243', - "simg;": '\U00002A9E', - "simgE;": '\U00002AA0', - "siml;": '\U00002A9D', - "simlE;": '\U00002A9F', - "simne;": '\U00002246', - "simplus;": '\U00002A24', - "simrarr;": '\U00002972', - "slarr;": '\U00002190', - "smallsetminus;": '\U00002216', - "smashp;": '\U00002A33', - "smeparsl;": '\U000029E4', - "smid;": '\U00002223', - "smile;": '\U00002323', - "smt;": '\U00002AAA', - "smte;": '\U00002AAC', - "softcy;": '\U0000044C', - "sol;": '\U0000002F', - "solb;": '\U000029C4', - "solbar;": '\U0000233F', - "sopf;": '\U0001D564', - "spades;": '\U00002660', - "spadesuit;": '\U00002660', - "spar;": '\U00002225', - "sqcap;": '\U00002293', - "sqcup;": '\U00002294', - "sqsub;": '\U0000228F', - "sqsube;": '\U00002291', - "sqsubset;": '\U0000228F', - "sqsubseteq;": '\U00002291', - "sqsup;": '\U00002290', - "sqsupe;": '\U00002292', - "sqsupset;": '\U00002290', - "sqsupseteq;": '\U00002292', - "squ;": '\U000025A1', - "square;": '\U000025A1', - "squarf;": '\U000025AA', - "squf;": '\U000025AA', - "srarr;": '\U00002192', - "sscr;": '\U0001D4C8', - "ssetmn;": '\U00002216', - "ssmile;": '\U00002323', - "sstarf;": '\U000022C6', - "star;": '\U00002606', - "starf;": '\U00002605', - "straightepsilon;": '\U000003F5', - "straightphi;": '\U000003D5', - "strns;": '\U000000AF', - "sub;": '\U00002282', - "subE;": '\U00002AC5', - "subdot;": '\U00002ABD', - "sube;": '\U00002286', - "subedot;": '\U00002AC3', - "submult;": '\U00002AC1', - "subnE;": '\U00002ACB', - "subne;": '\U0000228A', - "subplus;": '\U00002ABF', - "subrarr;": '\U00002979', - "subset;": '\U00002282', - "subseteq;": '\U00002286', - "subseteqq;": '\U00002AC5', - "subsetneq;": '\U0000228A', - "subsetneqq;": '\U00002ACB', - "subsim;": '\U00002AC7', - "subsub;": '\U00002AD5', - "subsup;": '\U00002AD3', - "succ;": '\U0000227B', - "succapprox;": '\U00002AB8', - "succcurlyeq;": '\U0000227D', - "succeq;": '\U00002AB0', - "succnapprox;": '\U00002ABA', - "succneqq;": '\U00002AB6', - "succnsim;": '\U000022E9', - "succsim;": '\U0000227F', - "sum;": '\U00002211', - "sung;": '\U0000266A', - "sup;": '\U00002283', - "sup1;": '\U000000B9', - "sup2;": '\U000000B2', - "sup3;": '\U000000B3', - "supE;": '\U00002AC6', - "supdot;": '\U00002ABE', - "supdsub;": '\U00002AD8', - "supe;": '\U00002287', - "supedot;": '\U00002AC4', - "suphsol;": '\U000027C9', - "suphsub;": '\U00002AD7', - "suplarr;": '\U0000297B', - "supmult;": '\U00002AC2', - "supnE;": '\U00002ACC', - "supne;": '\U0000228B', - "supplus;": '\U00002AC0', - "supset;": '\U00002283', - "supseteq;": '\U00002287', - "supseteqq;": '\U00002AC6', - "supsetneq;": '\U0000228B', - "supsetneqq;": '\U00002ACC', - "supsim;": '\U00002AC8', - "supsub;": '\U00002AD4', - "supsup;": '\U00002AD6', - "swArr;": '\U000021D9', - "swarhk;": '\U00002926', - "swarr;": '\U00002199', - "swarrow;": '\U00002199', - "swnwar;": '\U0000292A', - "szlig;": '\U000000DF', - "target;": '\U00002316', - "tau;": '\U000003C4', - "tbrk;": '\U000023B4', - "tcaron;": '\U00000165', - "tcedil;": '\U00000163', - "tcy;": '\U00000442', - "tdot;": '\U000020DB', - "telrec;": '\U00002315', - "tfr;": '\U0001D531', - "there4;": '\U00002234', - "therefore;": '\U00002234', - "theta;": '\U000003B8', - "thetasym;": '\U000003D1', - "thetav;": '\U000003D1', - "thickapprox;": '\U00002248', - "thicksim;": '\U0000223C', - "thinsp;": '\U00002009', - "thkap;": '\U00002248', - "thksim;": '\U0000223C', - "thorn;": '\U000000FE', - "tilde;": '\U000002DC', - "times;": '\U000000D7', - "timesb;": '\U000022A0', - "timesbar;": '\U00002A31', - "timesd;": '\U00002A30', - "tint;": '\U0000222D', - "toea;": '\U00002928', - "top;": '\U000022A4', - "topbot;": '\U00002336', - "topcir;": '\U00002AF1', - "topf;": '\U0001D565', - "topfork;": '\U00002ADA', - "tosa;": '\U00002929', - "tprime;": '\U00002034', - "trade;": '\U00002122', - "triangle;": '\U000025B5', - "triangledown;": '\U000025BF', - "triangleleft;": '\U000025C3', - "trianglelefteq;": '\U000022B4', - "triangleq;": '\U0000225C', - "triangleright;": '\U000025B9', - "trianglerighteq;": '\U000022B5', - "tridot;": '\U000025EC', - "trie;": '\U0000225C', - "triminus;": '\U00002A3A', - "triplus;": '\U00002A39', - "trisb;": '\U000029CD', - "tritime;": '\U00002A3B', - "trpezium;": '\U000023E2', - "tscr;": '\U0001D4C9', - "tscy;": '\U00000446', - "tshcy;": '\U0000045B', - "tstrok;": '\U00000167', - "twixt;": '\U0000226C', - "twoheadleftarrow;": '\U0000219E', - "twoheadrightarrow;": '\U000021A0', - "uArr;": '\U000021D1', - "uHar;": '\U00002963', - "uacute;": '\U000000FA', - "uarr;": '\U00002191', - "ubrcy;": '\U0000045E', - "ubreve;": '\U0000016D', - "ucirc;": '\U000000FB', - "ucy;": '\U00000443', - "udarr;": '\U000021C5', - "udblac;": '\U00000171', - "udhar;": '\U0000296E', - "ufisht;": '\U0000297E', - "ufr;": '\U0001D532', - "ugrave;": '\U000000F9', - "uharl;": '\U000021BF', - "uharr;": '\U000021BE', - "uhblk;": '\U00002580', - "ulcorn;": '\U0000231C', - "ulcorner;": '\U0000231C', - "ulcrop;": '\U0000230F', - "ultri;": '\U000025F8', - "umacr;": '\U0000016B', - "uml;": '\U000000A8', - "uogon;": '\U00000173', - "uopf;": '\U0001D566', - "uparrow;": '\U00002191', - "updownarrow;": '\U00002195', - "upharpoonleft;": '\U000021BF', - "upharpoonright;": '\U000021BE', - "uplus;": '\U0000228E', - "upsi;": '\U000003C5', - "upsih;": '\U000003D2', - "upsilon;": '\U000003C5', - "upuparrows;": '\U000021C8', - "urcorn;": '\U0000231D', - "urcorner;": '\U0000231D', - "urcrop;": '\U0000230E', - "uring;": '\U0000016F', - "urtri;": '\U000025F9', - "uscr;": '\U0001D4CA', - "utdot;": '\U000022F0', - "utilde;": '\U00000169', - "utri;": '\U000025B5', - "utrif;": '\U000025B4', - "uuarr;": '\U000021C8', - "uuml;": '\U000000FC', - "uwangle;": '\U000029A7', - "vArr;": '\U000021D5', - "vBar;": '\U00002AE8', - "vBarv;": '\U00002AE9', - "vDash;": '\U000022A8', - "vangrt;": '\U0000299C', - "varepsilon;": '\U000003F5', - "varkappa;": '\U000003F0', - "varnothing;": '\U00002205', - "varphi;": '\U000003D5', - "varpi;": '\U000003D6', - "varpropto;": '\U0000221D', - "varr;": '\U00002195', - "varrho;": '\U000003F1', - "varsigma;": '\U000003C2', - "vartheta;": '\U000003D1', - "vartriangleleft;": '\U000022B2', - "vartriangleright;": '\U000022B3', - "vcy;": '\U00000432', - "vdash;": '\U000022A2', - "vee;": '\U00002228', - "veebar;": '\U000022BB', - "veeeq;": '\U0000225A', - "vellip;": '\U000022EE', - "verbar;": '\U0000007C', - "vert;": '\U0000007C', - "vfr;": '\U0001D533', - "vltri;": '\U000022B2', - "vopf;": '\U0001D567', - "vprop;": '\U0000221D', - "vrtri;": '\U000022B3', - "vscr;": '\U0001D4CB', - "vzigzag;": '\U0000299A', - "wcirc;": '\U00000175', - "wedbar;": '\U00002A5F', - "wedge;": '\U00002227', - "wedgeq;": '\U00002259', - "weierp;": '\U00002118', - "wfr;": '\U0001D534', - "wopf;": '\U0001D568', - "wp;": '\U00002118', - "wr;": '\U00002240', - "wreath;": '\U00002240', - "wscr;": '\U0001D4CC', - "xcap;": '\U000022C2', - "xcirc;": '\U000025EF', - "xcup;": '\U000022C3', - "xdtri;": '\U000025BD', - "xfr;": '\U0001D535', - "xhArr;": '\U000027FA', - "xharr;": '\U000027F7', - "xi;": '\U000003BE', - "xlArr;": '\U000027F8', - "xlarr;": '\U000027F5', - "xmap;": '\U000027FC', - "xnis;": '\U000022FB', - "xodot;": '\U00002A00', - "xopf;": '\U0001D569', - "xoplus;": '\U00002A01', - "xotime;": '\U00002A02', - "xrArr;": '\U000027F9', - "xrarr;": '\U000027F6', - "xscr;": '\U0001D4CD', - "xsqcup;": '\U00002A06', - "xuplus;": '\U00002A04', - "xutri;": '\U000025B3', - "xvee;": '\U000022C1', - "xwedge;": '\U000022C0', - "yacute;": '\U000000FD', - "yacy;": '\U0000044F', - "ycirc;": '\U00000177', - "ycy;": '\U0000044B', - "yen;": '\U000000A5', - "yfr;": '\U0001D536', - "yicy;": '\U00000457', - "yopf;": '\U0001D56A', - "yscr;": '\U0001D4CE', - "yucy;": '\U0000044E', - "yuml;": '\U000000FF', - "zacute;": '\U0000017A', - "zcaron;": '\U0000017E', - "zcy;": '\U00000437', - "zdot;": '\U0000017C', - "zeetrf;": '\U00002128', - "zeta;": '\U000003B6', - "zfr;": '\U0001D537', - "zhcy;": '\U00000436', - "zigrarr;": '\U000021DD', - "zopf;": '\U0001D56B', - "zscr;": '\U0001D4CF', - "zwj;": '\U0000200D', - "zwnj;": '\U0000200C', - "AElig": '\U000000C6', - "AMP": '\U00000026', - "Aacute": '\U000000C1', - "Acirc": '\U000000C2', - "Agrave": '\U000000C0', - "Aring": '\U000000C5', - "Atilde": '\U000000C3', - "Auml": '\U000000C4', - "COPY": '\U000000A9', - "Ccedil": '\U000000C7', - "ETH": '\U000000D0', - "Eacute": '\U000000C9', - "Ecirc": '\U000000CA', - "Egrave": '\U000000C8', - "Euml": '\U000000CB', - "GT": '\U0000003E', - "Iacute": '\U000000CD', - "Icirc": '\U000000CE', - "Igrave": '\U000000CC', - "Iuml": '\U000000CF', - "LT": '\U0000003C', - "Ntilde": '\U000000D1', - "Oacute": '\U000000D3', - "Ocirc": '\U000000D4', - "Ograve": '\U000000D2', - "Oslash": '\U000000D8', - "Otilde": '\U000000D5', - "Ouml": '\U000000D6', - "QUOT": '\U00000022', - "REG": '\U000000AE', - "THORN": '\U000000DE', - "Uacute": '\U000000DA', - "Ucirc": '\U000000DB', - "Ugrave": '\U000000D9', - "Uuml": '\U000000DC', - "Yacute": '\U000000DD', - "aacute": '\U000000E1', - "acirc": '\U000000E2', - "acute": '\U000000B4', - "aelig": '\U000000E6', - "agrave": '\U000000E0', - "amp": '\U00000026', - "aring": '\U000000E5', - "atilde": '\U000000E3', - "auml": '\U000000E4', - "brvbar": '\U000000A6', - "ccedil": '\U000000E7', - "cedil": '\U000000B8', - "cent": '\U000000A2', - "copy": '\U000000A9', - "curren": '\U000000A4', - "deg": '\U000000B0', - "divide": '\U000000F7', - "eacute": '\U000000E9', - "ecirc": '\U000000EA', - "egrave": '\U000000E8', - "eth": '\U000000F0', - "euml": '\U000000EB', - "frac12": '\U000000BD', - "frac14": '\U000000BC', - "frac34": '\U000000BE', - "gt": '\U0000003E', - "iacute": '\U000000ED', - "icirc": '\U000000EE', - "iexcl": '\U000000A1', - "igrave": '\U000000EC', - "iquest": '\U000000BF', - "iuml": '\U000000EF', - "laquo": '\U000000AB', - "lt": '\U0000003C', - "macr": '\U000000AF', - "micro": '\U000000B5', - "middot": '\U000000B7', - "nbsp": '\U000000A0', - "not": '\U000000AC', - "ntilde": '\U000000F1', - "oacute": '\U000000F3', - "ocirc": '\U000000F4', - "ograve": '\U000000F2', - "ordf": '\U000000AA', - "ordm": '\U000000BA', - "oslash": '\U000000F8', - "otilde": '\U000000F5', - "ouml": '\U000000F6', - "para": '\U000000B6', - "plusmn": '\U000000B1', - "pound": '\U000000A3', - "quot": '\U00000022', - "raquo": '\U000000BB', - "reg": '\U000000AE', - "sect": '\U000000A7', - "shy": '\U000000AD', - "sup1": '\U000000B9', - "sup2": '\U000000B2', - "sup3": '\U000000B3', - "szlig": '\U000000DF', - "thorn": '\U000000FE', - "times": '\U000000D7', - "uacute": '\U000000FA', - "ucirc": '\U000000FB', - "ugrave": '\U000000F9', - "uml": '\U000000A8', - "uuml": '\U000000FC', - "yacute": '\U000000FD', - "yen": '\U000000A5', - "yuml": '\U000000FF', + "Cross;": '\U00002A2F', + "Cscr;": '\U0001D49E', + "Cup;": '\U000022D3', + "CupCap;": '\U0000224D', + "DD;": '\U00002145', + "DDotrahd;": '\U00002911', + "DJcy;": '\U00000402', + "DScy;": '\U00000405', + "DZcy;": '\U0000040F', + "Dagger;": '\U00002021', + "Darr;": '\U000021A1', + "Dashv;": '\U00002AE4', + "Dcaron;": '\U0000010E', + "Dcy;": '\U00000414', + "Del;": '\U00002207', + "Delta;": '\U00000394', + "Dfr;": '\U0001D507', + "DiacriticalAcute;": '\U000000B4', + "DiacriticalDot;": '\U000002D9', + "DiacriticalDoubleAcute;": '\U000002DD', + "DiacriticalGrave;": '\U00000060', + "DiacriticalTilde;": '\U000002DC', + "Diamond;": '\U000022C4', + "DifferentialD;": '\U00002146', + "Dopf;": '\U0001D53B', + "Dot;": '\U000000A8', + "DotDot;": '\U000020DC', + "DotEqual;": '\U00002250', + "DoubleContourIntegral;": '\U0000222F', + "DoubleDot;": '\U000000A8', + "DoubleDownArrow;": '\U000021D3', + "DoubleLeftArrow;": '\U000021D0', + "DoubleLeftRightArrow;": '\U000021D4', + "DoubleLeftTee;": '\U00002AE4', + "DoubleLongLeftArrow;": '\U000027F8', + "DoubleLongLeftRightArrow;": '\U000027FA', + "DoubleLongRightArrow;": '\U000027F9', + "DoubleRightArrow;": '\U000021D2', + "DoubleRightTee;": '\U000022A8', + "DoubleUpArrow;": '\U000021D1', + "DoubleUpDownArrow;": '\U000021D5', + "DoubleVerticalBar;": '\U00002225', + "DownArrow;": '\U00002193', + "DownArrowBar;": '\U00002913', + "DownArrowUpArrow;": '\U000021F5', + "DownBreve;": '\U00000311', + "DownLeftRightVector;": '\U00002950', + "DownLeftTeeVector;": '\U0000295E', + "DownLeftVector;": '\U000021BD', + "DownLeftVectorBar;": '\U00002956', + "DownRightTeeVector;": '\U0000295F', + "DownRightVector;": '\U000021C1', + "DownRightVectorBar;": '\U00002957', + "DownTee;": '\U000022A4', + "DownTeeArrow;": '\U000021A7', + "Downarrow;": '\U000021D3', + "Dscr;": '\U0001D49F', + "Dstrok;": '\U00000110', + "ENG;": '\U0000014A', + "ETH;": '\U000000D0', + "Eacute;": '\U000000C9', + "Ecaron;": '\U0000011A', + "Ecirc;": '\U000000CA', + "Ecy;": '\U0000042D', + "Edot;": '\U00000116', + "Efr;": '\U0001D508', + "Egrave;": '\U000000C8', + "Element;": '\U00002208', + "Emacr;": '\U00000112', + "EmptySmallSquare;": '\U000025FB', + "EmptyVerySmallSquare;": '\U000025AB', + "Eogon;": '\U00000118', + "Eopf;": '\U0001D53C', + "Epsilon;": '\U00000395', + "Equal;": '\U00002A75', + "EqualTilde;": '\U00002242', + "Equilibrium;": '\U000021CC', + "Escr;": '\U00002130', + "Esim;": '\U00002A73', + "Eta;": '\U00000397', + "Euml;": '\U000000CB', + "Exists;": '\U00002203', + "ExponentialE;": '\U00002147', + "Fcy;": '\U00000424', + "Ffr;": '\U0001D509', + "FilledSmallSquare;": '\U000025FC', + "FilledVerySmallSquare;": '\U000025AA', + "Fopf;": '\U0001D53D', + "ForAll;": '\U00002200', + "Fouriertrf;": '\U00002131', + "Fscr;": '\U00002131', + "GJcy;": '\U00000403', + "GT;": '\U0000003E', + "Gamma;": '\U00000393', + "Gammad;": '\U000003DC', + "Gbreve;": '\U0000011E', + "Gcedil;": '\U00000122', + "Gcirc;": '\U0000011C', + "Gcy;": '\U00000413', + "Gdot;": '\U00000120', + "Gfr;": '\U0001D50A', + "Gg;": '\U000022D9', + "Gopf;": '\U0001D53E', + "GreaterEqual;": '\U00002265', + "GreaterEqualLess;": '\U000022DB', + "GreaterFullEqual;": '\U00002267', + "GreaterGreater;": '\U00002AA2', + "GreaterLess;": '\U00002277', + "GreaterSlantEqual;": '\U00002A7E', + "GreaterTilde;": '\U00002273', + "Gscr;": '\U0001D4A2', + "Gt;": '\U0000226B', + "HARDcy;": '\U0000042A', + "Hacek;": '\U000002C7', + "Hat;": '\U0000005E', + "Hcirc;": '\U00000124', + "Hfr;": '\U0000210C', + "HilbertSpace;": '\U0000210B', + "Hopf;": '\U0000210D', + "HorizontalLine;": '\U00002500', + "Hscr;": '\U0000210B', + "Hstrok;": '\U00000126', + "HumpDownHump;": '\U0000224E', + "HumpEqual;": '\U0000224F', + "IEcy;": '\U00000415', + "IJlig;": '\U00000132', + "IOcy;": '\U00000401', + "Iacute;": '\U000000CD', + "Icirc;": '\U000000CE', + "Icy;": '\U00000418', + "Idot;": '\U00000130', + "Ifr;": '\U00002111', + "Igrave;": '\U000000CC', + "Im;": '\U00002111', + "Imacr;": '\U0000012A', + "ImaginaryI;": '\U00002148', + "Implies;": '\U000021D2', + "Int;": '\U0000222C', + "Integral;": '\U0000222B', + "Intersection;": '\U000022C2', + "InvisibleComma;": '\U00002063', + "InvisibleTimes;": '\U00002062', + "Iogon;": '\U0000012E', + "Iopf;": '\U0001D540', + "Iota;": '\U00000399', + "Iscr;": '\U00002110', + "Itilde;": '\U00000128', + "Iukcy;": '\U00000406', + "Iuml;": '\U000000CF', + "Jcirc;": '\U00000134', + "Jcy;": '\U00000419', + "Jfr;": '\U0001D50D', + "Jopf;": '\U0001D541', + "Jscr;": '\U0001D4A5', + "Jsercy;": '\U00000408', + "Jukcy;": '\U00000404', + "KHcy;": '\U00000425', + "KJcy;": '\U0000040C', + "Kappa;": '\U0000039A', + "Kcedil;": '\U00000136', + "Kcy;": '\U0000041A', + "Kfr;": '\U0001D50E', + "Kopf;": '\U0001D542', + "Kscr;": '\U0001D4A6', + "LJcy;": '\U00000409', + "LT;": '\U0000003C', + "Lacute;": '\U00000139', + "Lambda;": '\U0000039B', + "Lang;": '\U000027EA', + "Laplacetrf;": '\U00002112', + "Larr;": '\U0000219E', + "Lcaron;": '\U0000013D', + "Lcedil;": '\U0000013B', + "Lcy;": '\U0000041B', + "LeftAngleBracket;": '\U000027E8', + "LeftArrow;": '\U00002190', + "LeftArrowBar;": '\U000021E4', + "LeftArrowRightArrow;": '\U000021C6', + "LeftCeiling;": '\U00002308', + "LeftDoubleBracket;": '\U000027E6', + "LeftDownTeeVector;": '\U00002961', + "LeftDownVector;": '\U000021C3', + "LeftDownVectorBar;": '\U00002959', + "LeftFloor;": '\U0000230A', + "LeftRightArrow;": '\U00002194', + "LeftRightVector;": '\U0000294E', + "LeftTee;": '\U000022A3', + "LeftTeeArrow;": '\U000021A4', + "LeftTeeVector;": '\U0000295A', + "LeftTriangle;": '\U000022B2', + "LeftTriangleBar;": '\U000029CF', + "LeftTriangleEqual;": '\U000022B4', + "LeftUpDownVector;": '\U00002951', + "LeftUpTeeVector;": '\U00002960', + "LeftUpVector;": '\U000021BF', + "LeftUpVectorBar;": '\U00002958', + "LeftVector;": '\U000021BC', + "LeftVectorBar;": '\U00002952', + "Leftarrow;": '\U000021D0', + "Leftrightarrow;": '\U000021D4', + "LessEqualGreater;": '\U000022DA', + "LessFullEqual;": '\U00002266', + "LessGreater;": '\U00002276', + "LessLess;": '\U00002AA1', + "LessSlantEqual;": '\U00002A7D', + "LessTilde;": '\U00002272', + "Lfr;": '\U0001D50F', + "Ll;": '\U000022D8', + "Lleftarrow;": '\U000021DA', + "Lmidot;": '\U0000013F', + "LongLeftArrow;": '\U000027F5', + "LongLeftRightArrow;": '\U000027F7', + "LongRightArrow;": '\U000027F6', + "Longleftarrow;": '\U000027F8', + "Longleftrightarrow;": '\U000027FA', + "Longrightarrow;": '\U000027F9', + "Lopf;": '\U0001D543', + "LowerLeftArrow;": '\U00002199', + "LowerRightArrow;": '\U00002198', + "Lscr;": '\U00002112', + "Lsh;": '\U000021B0', + "Lstrok;": '\U00000141', + "Lt;": '\U0000226A', + "Map;": '\U00002905', + "Mcy;": '\U0000041C', + "MediumSpace;": '\U0000205F', + "Mellintrf;": '\U00002133', + "Mfr;": '\U0001D510', + "MinusPlus;": '\U00002213', + "Mopf;": '\U0001D544', + "Mscr;": '\U00002133', + "Mu;": '\U0000039C', + "NJcy;": '\U0000040A', + "Nacute;": '\U00000143', + "Ncaron;": '\U00000147', + "Ncedil;": '\U00000145', + "Ncy;": '\U0000041D', + "NegativeMediumSpace;": '\U0000200B', + "NegativeThickSpace;": '\U0000200B', + "NegativeThinSpace;": '\U0000200B', + "NegativeVeryThinSpace;": '\U0000200B', + "NestedGreaterGreater;": '\U0000226B', + "NestedLessLess;": '\U0000226A', + "NewLine;": '\U0000000A', + "Nfr;": '\U0001D511', + "NoBreak;": '\U00002060', + "NonBreakingSpace;": '\U000000A0', + "Nopf;": '\U00002115', + "Not;": '\U00002AEC', + "NotCongruent;": '\U00002262', + "NotCupCap;": '\U0000226D', + "NotDoubleVerticalBar;": '\U00002226', + "NotElement;": '\U00002209', + "NotEqual;": '\U00002260', + "NotExists;": '\U00002204', + "NotGreater;": '\U0000226F', + "NotGreaterEqual;": '\U00002271', + "NotGreaterLess;": '\U00002279', + "NotGreaterTilde;": '\U00002275', + "NotLeftTriangle;": '\U000022EA', + "NotLeftTriangleEqual;": '\U000022EC', + "NotLess;": '\U0000226E', + "NotLessEqual;": '\U00002270', + "NotLessGreater;": '\U00002278', + "NotLessTilde;": '\U00002274', + "NotPrecedes;": '\U00002280', + "NotPrecedesSlantEqual;": '\U000022E0', + "NotReverseElement;": '\U0000220C', + "NotRightTriangle;": '\U000022EB', + "NotRightTriangleEqual;": '\U000022ED', + "NotSquareSubsetEqual;": '\U000022E2', + "NotSquareSupersetEqual;": '\U000022E3', + "NotSubsetEqual;": '\U00002288', + "NotSucceeds;": '\U00002281', + "NotSucceedsSlantEqual;": '\U000022E1', + "NotSupersetEqual;": '\U00002289', + "NotTilde;": '\U00002241', + "NotTildeEqual;": '\U00002244', + "NotTildeFullEqual;": '\U00002247', + "NotTildeTilde;": '\U00002249', + "NotVerticalBar;": '\U00002224', + "Nscr;": '\U0001D4A9', + "Ntilde;": '\U000000D1', + "Nu;": '\U0000039D', + "OElig;": '\U00000152', + "Oacute;": '\U000000D3', + "Ocirc;": '\U000000D4', + "Ocy;": '\U0000041E', + "Odblac;": '\U00000150', + "Ofr;": '\U0001D512', + "Ograve;": '\U000000D2', + "Omacr;": '\U0000014C', + "Omega;": '\U000003A9', + "Omicron;": '\U0000039F', + "Oopf;": '\U0001D546', + "OpenCurlyDoubleQuote;": '\U0000201C', + "OpenCurlyQuote;": '\U00002018', + "Or;": '\U00002A54', + "Oscr;": '\U0001D4AA', + "Oslash;": '\U000000D8', + "Otilde;": '\U000000D5', + "Otimes;": '\U00002A37', + "Ouml;": '\U000000D6', + "OverBar;": '\U0000203E', + "OverBrace;": '\U000023DE', + "OverBracket;": '\U000023B4', + "OverParenthesis;": '\U000023DC', + "PartialD;": '\U00002202', + "Pcy;": '\U0000041F', + "Pfr;": '\U0001D513', + "Phi;": '\U000003A6', + "Pi;": '\U000003A0', + "PlusMinus;": '\U000000B1', + "Poincareplane;": '\U0000210C', + "Popf;": '\U00002119', + "Pr;": '\U00002ABB', + "Precedes;": '\U0000227A', + "PrecedesEqual;": '\U00002AAF', + "PrecedesSlantEqual;": '\U0000227C', + "PrecedesTilde;": '\U0000227E', + "Prime;": '\U00002033', + "Product;": '\U0000220F', + "Proportion;": '\U00002237', + "Proportional;": '\U0000221D', + "Pscr;": '\U0001D4AB', + "Psi;": '\U000003A8', + "QUOT;": '\U00000022', + "Qfr;": '\U0001D514', + "Qopf;": '\U0000211A', + "Qscr;": '\U0001D4AC', + "RBarr;": '\U00002910', + "REG;": '\U000000AE', + "Racute;": '\U00000154', + "Rang;": '\U000027EB', + "Rarr;": '\U000021A0', + "Rarrtl;": '\U00002916', + "Rcaron;": '\U00000158', + "Rcedil;": '\U00000156', + "Rcy;": '\U00000420', + "Re;": '\U0000211C', + "ReverseElement;": '\U0000220B', + "ReverseEquilibrium;": '\U000021CB', + "ReverseUpEquilibrium;": '\U0000296F', + "Rfr;": '\U0000211C', + "Rho;": '\U000003A1', + "RightAngleBracket;": '\U000027E9', + "RightArrow;": '\U00002192', + "RightArrowBar;": '\U000021E5', + "RightArrowLeftArrow;": '\U000021C4', + "RightCeiling;": '\U00002309', + "RightDoubleBracket;": '\U000027E7', + "RightDownTeeVector;": '\U0000295D', + "RightDownVector;": '\U000021C2', + "RightDownVectorBar;": '\U00002955', + "RightFloor;": '\U0000230B', + "RightTee;": '\U000022A2', + "RightTeeArrow;": '\U000021A6', + "RightTeeVector;": '\U0000295B', + "RightTriangle;": '\U000022B3', + "RightTriangleBar;": '\U000029D0', + "RightTriangleEqual;": '\U000022B5', + "RightUpDownVector;": '\U0000294F', + "RightUpTeeVector;": '\U0000295C', + "RightUpVector;": '\U000021BE', + "RightUpVectorBar;": '\U00002954', + "RightVector;": '\U000021C0', + "RightVectorBar;": '\U00002953', + "Rightarrow;": '\U000021D2', + "Ropf;": '\U0000211D', + "RoundImplies;": '\U00002970', + "Rrightarrow;": '\U000021DB', + "Rscr;": '\U0000211B', + "Rsh;": '\U000021B1', + "RuleDelayed;": '\U000029F4', + "SHCHcy;": '\U00000429', + "SHcy;": '\U00000428', + "SOFTcy;": '\U0000042C', + "Sacute;": '\U0000015A', + "Sc;": '\U00002ABC', + "Scaron;": '\U00000160', + "Scedil;": '\U0000015E', + "Scirc;": '\U0000015C', + "Scy;": '\U00000421', + "Sfr;": '\U0001D516', + "ShortDownArrow;": '\U00002193', + "ShortLeftArrow;": '\U00002190', + "ShortRightArrow;": '\U00002192', + "ShortUpArrow;": '\U00002191', + "Sigma;": '\U000003A3', + "SmallCircle;": '\U00002218', + "Sopf;": '\U0001D54A', + "Sqrt;": '\U0000221A', + "Square;": '\U000025A1', + "SquareIntersection;": '\U00002293', + "SquareSubset;": '\U0000228F', + "SquareSubsetEqual;": '\U00002291', + "SquareSuperset;": '\U00002290', + "SquareSupersetEqual;": '\U00002292', + "SquareUnion;": '\U00002294', + "Sscr;": '\U0001D4AE', + "Star;": '\U000022C6', + "Sub;": '\U000022D0', + "Subset;": '\U000022D0', + "SubsetEqual;": '\U00002286', + "Succeeds;": '\U0000227B', + "SucceedsEqual;": '\U00002AB0', + "SucceedsSlantEqual;": '\U0000227D', + "SucceedsTilde;": '\U0000227F', + "SuchThat;": '\U0000220B', + "Sum;": '\U00002211', + "Sup;": '\U000022D1', + "Superset;": '\U00002283', + "SupersetEqual;": '\U00002287', + "Supset;": '\U000022D1', + "THORN;": '\U000000DE', + "TRADE;": '\U00002122', + "TSHcy;": '\U0000040B', + "TScy;": '\U00000426', + "Tab;": '\U00000009', + "Tau;": '\U000003A4', + "Tcaron;": '\U00000164', + "Tcedil;": '\U00000162', + "Tcy;": '\U00000422', + "Tfr;": '\U0001D517', + "Therefore;": '\U00002234', + "Theta;": '\U00000398', + "ThinSpace;": '\U00002009', + "Tilde;": '\U0000223C', + "TildeEqual;": '\U00002243', + "TildeFullEqual;": '\U00002245', + "TildeTilde;": '\U00002248', + "Topf;": '\U0001D54B', + "TripleDot;": '\U000020DB', + "Tscr;": '\U0001D4AF', + "Tstrok;": '\U00000166', + "Uacute;": '\U000000DA', + "Uarr;": '\U0000219F', + "Uarrocir;": '\U00002949', + "Ubrcy;": '\U0000040E', + "Ubreve;": '\U0000016C', + "Ucirc;": '\U000000DB', + "Ucy;": '\U00000423', + "Udblac;": '\U00000170', + "Ufr;": '\U0001D518', + "Ugrave;": '\U000000D9', + "Umacr;": '\U0000016A', + "UnderBar;": '\U0000005F', + "UnderBrace;": '\U000023DF', + "UnderBracket;": '\U000023B5', + "UnderParenthesis;": '\U000023DD', + "Union;": '\U000022C3', + "UnionPlus;": '\U0000228E', + "Uogon;": '\U00000172', + "Uopf;": '\U0001D54C', + "UpArrow;": '\U00002191', + "UpArrowBar;": '\U00002912', + "UpArrowDownArrow;": '\U000021C5', + "UpDownArrow;": '\U00002195', + "UpEquilibrium;": '\U0000296E', + "UpTee;": '\U000022A5', + "UpTeeArrow;": '\U000021A5', + "Uparrow;": '\U000021D1', + "Updownarrow;": '\U000021D5', + "UpperLeftArrow;": '\U00002196', + "UpperRightArrow;": '\U00002197', + "Upsi;": '\U000003D2', + "Upsilon;": '\U000003A5', + "Uring;": '\U0000016E', + "Uscr;": '\U0001D4B0', + "Utilde;": '\U00000168', + "Uuml;": '\U000000DC', + "VDash;": '\U000022AB', + "Vbar;": '\U00002AEB', + "Vcy;": '\U00000412', + "Vdash;": '\U000022A9', + "Vdashl;": '\U00002AE6', + "Vee;": '\U000022C1', + "Verbar;": '\U00002016', + "Vert;": '\U00002016', + "VerticalBar;": '\U00002223', + "VerticalLine;": '\U0000007C', + "VerticalSeparator;": '\U00002758', + "VerticalTilde;": '\U00002240', + "VeryThinSpace;": '\U0000200A', + "Vfr;": '\U0001D519', + "Vopf;": '\U0001D54D', + "Vscr;": '\U0001D4B1', + "Vvdash;": '\U000022AA', + "Wcirc;": '\U00000174', + "Wedge;": '\U000022C0', + "Wfr;": '\U0001D51A', + "Wopf;": '\U0001D54E', + "Wscr;": '\U0001D4B2', + "Xfr;": '\U0001D51B', + "Xi;": '\U0000039E', + "Xopf;": '\U0001D54F', + "Xscr;": '\U0001D4B3', + "YAcy;": '\U0000042F', + "YIcy;": '\U00000407', + "YUcy;": '\U0000042E', + "Yacute;": '\U000000DD', + "Ycirc;": '\U00000176', + "Ycy;": '\U0000042B', + "Yfr;": '\U0001D51C', + "Yopf;": '\U0001D550', + "Yscr;": '\U0001D4B4', + "Yuml;": '\U00000178', + "ZHcy;": '\U00000416', + "Zacute;": '\U00000179', + "Zcaron;": '\U0000017D', + "Zcy;": '\U00000417', + "Zdot;": '\U0000017B', + "ZeroWidthSpace;": '\U0000200B', + "Zeta;": '\U00000396', + "Zfr;": '\U00002128', + "Zopf;": '\U00002124', + "Zscr;": '\U0001D4B5', + "aacute;": '\U000000E1', + "abreve;": '\U00000103', + "ac;": '\U0000223E', + "acd;": '\U0000223F', + "acirc;": '\U000000E2', + "acute;": '\U000000B4', + "acy;": '\U00000430', + "aelig;": '\U000000E6', + "af;": '\U00002061', + "afr;": '\U0001D51E', + "agrave;": '\U000000E0', + "alefsym;": '\U00002135', + "aleph;": '\U00002135', + "alpha;": '\U000003B1', + "amacr;": '\U00000101', + "amalg;": '\U00002A3F', + "amp;": '\U00000026', + "and;": '\U00002227', + "andand;": '\U00002A55', + "andd;": '\U00002A5C', + "andslope;": '\U00002A58', + "andv;": '\U00002A5A', + "ang;": '\U00002220', + "ange;": '\U000029A4', + "angle;": '\U00002220', + "angmsd;": '\U00002221', + "angmsdaa;": '\U000029A8', + "angmsdab;": '\U000029A9', + "angmsdac;": '\U000029AA', + "angmsdad;": '\U000029AB', + "angmsdae;": '\U000029AC', + "angmsdaf;": '\U000029AD', + "angmsdag;": '\U000029AE', + "angmsdah;": '\U000029AF', + "angrt;": '\U0000221F', + "angrtvb;": '\U000022BE', + "angrtvbd;": '\U0000299D', + "angsph;": '\U00002222', + "angst;": '\U000000C5', + "angzarr;": '\U0000237C', + "aogon;": '\U00000105', + "aopf;": '\U0001D552', + "ap;": '\U00002248', + "apE;": '\U00002A70', + "apacir;": '\U00002A6F', + "ape;": '\U0000224A', + "apid;": '\U0000224B', + "apos;": '\U00000027', + "approx;": '\U00002248', + "approxeq;": '\U0000224A', + "aring;": '\U000000E5', + "ascr;": '\U0001D4B6', + "ast;": '\U0000002A', + "asymp;": '\U00002248', + "asympeq;": '\U0000224D', + "atilde;": '\U000000E3', + "auml;": '\U000000E4', + "awconint;": '\U00002233', + "awint;": '\U00002A11', + "bNot;": '\U00002AED', + "backcong;": '\U0000224C', + "backepsilon;": '\U000003F6', + "backprime;": '\U00002035', + "backsim;": '\U0000223D', + "backsimeq;": '\U000022CD', + "barvee;": '\U000022BD', + "barwed;": '\U00002305', + "barwedge;": '\U00002305', + "bbrk;": '\U000023B5', + "bbrktbrk;": '\U000023B6', + "bcong;": '\U0000224C', + "bcy;": '\U00000431', + "bdquo;": '\U0000201E', + "becaus;": '\U00002235', + "because;": '\U00002235', + "bemptyv;": '\U000029B0', + "bepsi;": '\U000003F6', + "bernou;": '\U0000212C', + "beta;": '\U000003B2', + "beth;": '\U00002136', + "between;": '\U0000226C', + "bfr;": '\U0001D51F', + "bigcap;": '\U000022C2', + "bigcirc;": '\U000025EF', + "bigcup;": '\U000022C3', + "bigodot;": '\U00002A00', + "bigoplus;": '\U00002A01', + "bigotimes;": '\U00002A02', + "bigsqcup;": '\U00002A06', + "bigstar;": '\U00002605', + "bigtriangledown;": '\U000025BD', + "bigtriangleup;": '\U000025B3', + "biguplus;": '\U00002A04', + "bigvee;": '\U000022C1', + "bigwedge;": '\U000022C0', + "bkarow;": '\U0000290D', + "blacklozenge;": '\U000029EB', + "blacksquare;": '\U000025AA', + "blacktriangle;": '\U000025B4', + "blacktriangledown;": '\U000025BE', + "blacktriangleleft;": '\U000025C2', + "blacktriangleright;": '\U000025B8', + "blank;": '\U00002423', + "blk12;": '\U00002592', + "blk14;": '\U00002591', + "blk34;": '\U00002593', + "block;": '\U00002588', + "bnot;": '\U00002310', + "bopf;": '\U0001D553', + "bot;": '\U000022A5', + "bottom;": '\U000022A5', + "bowtie;": '\U000022C8', + "boxDL;": '\U00002557', + "boxDR;": '\U00002554', + "boxDl;": '\U00002556', + "boxDr;": '\U00002553', + "boxH;": '\U00002550', + "boxHD;": '\U00002566', + "boxHU;": '\U00002569', + "boxHd;": '\U00002564', + "boxHu;": '\U00002567', + "boxUL;": '\U0000255D', + "boxUR;": '\U0000255A', + "boxUl;": '\U0000255C', + "boxUr;": '\U00002559', + "boxV;": '\U00002551', + "boxVH;": '\U0000256C', + "boxVL;": '\U00002563', + "boxVR;": '\U00002560', + "boxVh;": '\U0000256B', + "boxVl;": '\U00002562', + "boxVr;": '\U0000255F', + "boxbox;": '\U000029C9', + "boxdL;": '\U00002555', + "boxdR;": '\U00002552', + "boxdl;": '\U00002510', + "boxdr;": '\U0000250C', + "boxh;": '\U00002500', + "boxhD;": '\U00002565', + "boxhU;": '\U00002568', + "boxhd;": '\U0000252C', + "boxhu;": '\U00002534', + "boxminus;": '\U0000229F', + "boxplus;": '\U0000229E', + "boxtimes;": '\U000022A0', + "boxuL;": '\U0000255B', + "boxuR;": '\U00002558', + "boxul;": '\U00002518', + "boxur;": '\U00002514', + "boxv;": '\U00002502', + "boxvH;": '\U0000256A', + "boxvL;": '\U00002561', + "boxvR;": '\U0000255E', + "boxvh;": '\U0000253C', + "boxvl;": '\U00002524', + "boxvr;": '\U0000251C', + "bprime;": '\U00002035', + "breve;": '\U000002D8', + "brvbar;": '\U000000A6', + "bscr;": '\U0001D4B7', + "bsemi;": '\U0000204F', + "bsim;": '\U0000223D', + "bsime;": '\U000022CD', + "bsol;": '\U0000005C', + "bsolb;": '\U000029C5', + "bsolhsub;": '\U000027C8', + "bull;": '\U00002022', + "bullet;": '\U00002022', + "bump;": '\U0000224E', + "bumpE;": '\U00002AAE', + "bumpe;": '\U0000224F', + "bumpeq;": '\U0000224F', + "cacute;": '\U00000107', + "cap;": '\U00002229', + "capand;": '\U00002A44', + "capbrcup;": '\U00002A49', + "capcap;": '\U00002A4B', + "capcup;": '\U00002A47', + "capdot;": '\U00002A40', + "caret;": '\U00002041', + "caron;": '\U000002C7', + "ccaps;": '\U00002A4D', + "ccaron;": '\U0000010D', + "ccedil;": '\U000000E7', + "ccirc;": '\U00000109', + "ccups;": '\U00002A4C', + "ccupssm;": '\U00002A50', + "cdot;": '\U0000010B', + "cedil;": '\U000000B8', + "cemptyv;": '\U000029B2', + "cent;": '\U000000A2', + "centerdot;": '\U000000B7', + "cfr;": '\U0001D520', + "chcy;": '\U00000447', + "check;": '\U00002713', + "checkmark;": '\U00002713', + "chi;": '\U000003C7', + "cir;": '\U000025CB', + "cirE;": '\U000029C3', + "circ;": '\U000002C6', + "circeq;": '\U00002257', + "circlearrowleft;": '\U000021BA', + "circlearrowright;": '\U000021BB', + "circledR;": '\U000000AE', + "circledS;": '\U000024C8', + "circledast;": '\U0000229B', + "circledcirc;": '\U0000229A', + "circleddash;": '\U0000229D', + "cire;": '\U00002257', + "cirfnint;": '\U00002A10', + "cirmid;": '\U00002AEF', + "cirscir;": '\U000029C2', + "clubs;": '\U00002663', + "clubsuit;": '\U00002663', + "colon;": '\U0000003A', + "colone;": '\U00002254', + "coloneq;": '\U00002254', + "comma;": '\U0000002C', + "commat;": '\U00000040', + "comp;": '\U00002201', + "compfn;": '\U00002218', + "complement;": '\U00002201', + "complexes;": '\U00002102', + "cong;": '\U00002245', + "congdot;": '\U00002A6D', + "conint;": '\U0000222E', + "copf;": '\U0001D554', + "coprod;": '\U00002210', + "copy;": '\U000000A9', + "copysr;": '\U00002117', + "crarr;": '\U000021B5', + "cross;": '\U00002717', + "cscr;": '\U0001D4B8', + "csub;": '\U00002ACF', + "csube;": '\U00002AD1', + "csup;": '\U00002AD0', + "csupe;": '\U00002AD2', + "ctdot;": '\U000022EF', + "cudarrl;": '\U00002938', + "cudarrr;": '\U00002935', + "cuepr;": '\U000022DE', + "cuesc;": '\U000022DF', + "cularr;": '\U000021B6', + "cularrp;": '\U0000293D', + "cup;": '\U0000222A', + "cupbrcap;": '\U00002A48', + "cupcap;": '\U00002A46', + "cupcup;": '\U00002A4A', + "cupdot;": '\U0000228D', + "cupor;": '\U00002A45', + "curarr;": '\U000021B7', + "curarrm;": '\U0000293C', + "curlyeqprec;": '\U000022DE', + "curlyeqsucc;": '\U000022DF', + "curlyvee;": '\U000022CE', + "curlywedge;": '\U000022CF', + "curren;": '\U000000A4', + "curvearrowleft;": '\U000021B6', + "curvearrowright;": '\U000021B7', + "cuvee;": '\U000022CE', + "cuwed;": '\U000022CF', + "cwconint;": '\U00002232', + "cwint;": '\U00002231', + "cylcty;": '\U0000232D', + "dArr;": '\U000021D3', + "dHar;": '\U00002965', + "dagger;": '\U00002020', + "daleth;": '\U00002138', + "darr;": '\U00002193', + "dash;": '\U00002010', + "dashv;": '\U000022A3', + "dbkarow;": '\U0000290F', + "dblac;": '\U000002DD', + "dcaron;": '\U0000010F', + "dcy;": '\U00000434', + "dd;": '\U00002146', + "ddagger;": '\U00002021', + "ddarr;": '\U000021CA', + "ddotseq;": '\U00002A77', + "deg;": '\U000000B0', + "delta;": '\U000003B4', + "demptyv;": '\U000029B1', + "dfisht;": '\U0000297F', + "dfr;": '\U0001D521', + "dharl;": '\U000021C3', + "dharr;": '\U000021C2', + "diam;": '\U000022C4', + "diamond;": '\U000022C4', + "diamondsuit;": '\U00002666', + "diams;": '\U00002666', + "die;": '\U000000A8', + "digamma;": '\U000003DD', + "disin;": '\U000022F2', + "div;": '\U000000F7', + "divide;": '\U000000F7', + "divideontimes;": '\U000022C7', + "divonx;": '\U000022C7', + "djcy;": '\U00000452', + "dlcorn;": '\U0000231E', + "dlcrop;": '\U0000230D', + "dollar;": '\U00000024', + "dopf;": '\U0001D555', + "dot;": '\U000002D9', + "doteq;": '\U00002250', + "doteqdot;": '\U00002251', + "dotminus;": '\U00002238', + "dotplus;": '\U00002214', + "dotsquare;": '\U000022A1', + "doublebarwedge;": '\U00002306', + "downarrow;": '\U00002193', + "downdownarrows;": '\U000021CA', + "downharpoonleft;": '\U000021C3', + "downharpoonright;": '\U000021C2', + "drbkarow;": '\U00002910', + "drcorn;": '\U0000231F', + "drcrop;": '\U0000230C', + "dscr;": '\U0001D4B9', + "dscy;": '\U00000455', + "dsol;": '\U000029F6', + "dstrok;": '\U00000111', + "dtdot;": '\U000022F1', + "dtri;": '\U000025BF', + "dtrif;": '\U000025BE', + "duarr;": '\U000021F5', + "duhar;": '\U0000296F', + "dwangle;": '\U000029A6', + "dzcy;": '\U0000045F', + "dzigrarr;": '\U000027FF', + "eDDot;": '\U00002A77', + "eDot;": '\U00002251', + "eacute;": '\U000000E9', + "easter;": '\U00002A6E', + "ecaron;": '\U0000011B', + "ecir;": '\U00002256', + "ecirc;": '\U000000EA', + "ecolon;": '\U00002255', + "ecy;": '\U0000044D', + "edot;": '\U00000117', + "ee;": '\U00002147', + "efDot;": '\U00002252', + "efr;": '\U0001D522', + "eg;": '\U00002A9A', + "egrave;": '\U000000E8', + "egs;": '\U00002A96', + "egsdot;": '\U00002A98', + "el;": '\U00002A99', + "elinters;": '\U000023E7', + "ell;": '\U00002113', + "els;": '\U00002A95', + "elsdot;": '\U00002A97', + "emacr;": '\U00000113', + "empty;": '\U00002205', + "emptyset;": '\U00002205', + "emptyv;": '\U00002205', + "emsp;": '\U00002003', + "emsp13;": '\U00002004', + "emsp14;": '\U00002005', + "eng;": '\U0000014B', + "ensp;": '\U00002002', + "eogon;": '\U00000119', + "eopf;": '\U0001D556', + "epar;": '\U000022D5', + "eparsl;": '\U000029E3', + "eplus;": '\U00002A71', + "epsi;": '\U000003B5', + "epsilon;": '\U000003B5', + "epsiv;": '\U000003F5', + "eqcirc;": '\U00002256', + "eqcolon;": '\U00002255', + "eqsim;": '\U00002242', + "eqslantgtr;": '\U00002A96', + "eqslantless;": '\U00002A95', + "equals;": '\U0000003D', + "equest;": '\U0000225F', + "equiv;": '\U00002261', + "equivDD;": '\U00002A78', + "eqvparsl;": '\U000029E5', + "erDot;": '\U00002253', + "erarr;": '\U00002971', + "escr;": '\U0000212F', + "esdot;": '\U00002250', + "esim;": '\U00002242', + "eta;": '\U000003B7', + "eth;": '\U000000F0', + "euml;": '\U000000EB', + "euro;": '\U000020AC', + "excl;": '\U00000021', + "exist;": '\U00002203', + "expectation;": '\U00002130', + "exponentiale;": '\U00002147', + "fallingdotseq;": '\U00002252', + "fcy;": '\U00000444', + "female;": '\U00002640', + "ffilig;": '\U0000FB03', + "fflig;": '\U0000FB00', + "ffllig;": '\U0000FB04', + "ffr;": '\U0001D523', + "filig;": '\U0000FB01', + "flat;": '\U0000266D', + "fllig;": '\U0000FB02', + "fltns;": '\U000025B1', + "fnof;": '\U00000192', + "fopf;": '\U0001D557', + "forall;": '\U00002200', + "fork;": '\U000022D4', + "forkv;": '\U00002AD9', + "fpartint;": '\U00002A0D', + "frac12;": '\U000000BD', + "frac13;": '\U00002153', + "frac14;": '\U000000BC', + "frac15;": '\U00002155', + "frac16;": '\U00002159', + "frac18;": '\U0000215B', + "frac23;": '\U00002154', + "frac25;": '\U00002156', + "frac34;": '\U000000BE', + "frac35;": '\U00002157', + "frac38;": '\U0000215C', + "frac45;": '\U00002158', + "frac56;": '\U0000215A', + "frac58;": '\U0000215D', + "frac78;": '\U0000215E', + "frasl;": '\U00002044', + "frown;": '\U00002322', + "fscr;": '\U0001D4BB', + "gE;": '\U00002267', + "gEl;": '\U00002A8C', + "gacute;": '\U000001F5', + "gamma;": '\U000003B3', + "gammad;": '\U000003DD', + "gap;": '\U00002A86', + "gbreve;": '\U0000011F', + "gcirc;": '\U0000011D', + "gcy;": '\U00000433', + "gdot;": '\U00000121', + "ge;": '\U00002265', + "gel;": '\U000022DB', + "geq;": '\U00002265', + "geqq;": '\U00002267', + "geqslant;": '\U00002A7E', + "ges;": '\U00002A7E', + "gescc;": '\U00002AA9', + "gesdot;": '\U00002A80', + "gesdoto;": '\U00002A82', + "gesdotol;": '\U00002A84', + "gesles;": '\U00002A94', + "gfr;": '\U0001D524', + "gg;": '\U0000226B', + "ggg;": '\U000022D9', + "gimel;": '\U00002137', + "gjcy;": '\U00000453', + "gl;": '\U00002277', + "glE;": '\U00002A92', + "gla;": '\U00002AA5', + "glj;": '\U00002AA4', + "gnE;": '\U00002269', + "gnap;": '\U00002A8A', + "gnapprox;": '\U00002A8A', + "gne;": '\U00002A88', + "gneq;": '\U00002A88', + "gneqq;": '\U00002269', + "gnsim;": '\U000022E7', + "gopf;": '\U0001D558', + "grave;": '\U00000060', + "gscr;": '\U0000210A', + "gsim;": '\U00002273', + "gsime;": '\U00002A8E', + "gsiml;": '\U00002A90', + "gt;": '\U0000003E', + "gtcc;": '\U00002AA7', + "gtcir;": '\U00002A7A', + "gtdot;": '\U000022D7', + "gtlPar;": '\U00002995', + "gtquest;": '\U00002A7C', + "gtrapprox;": '\U00002A86', + "gtrarr;": '\U00002978', + "gtrdot;": '\U000022D7', + "gtreqless;": '\U000022DB', + "gtreqqless;": '\U00002A8C', + "gtrless;": '\U00002277', + "gtrsim;": '\U00002273', + "hArr;": '\U000021D4', + "hairsp;": '\U0000200A', + "half;": '\U000000BD', + "hamilt;": '\U0000210B', + "hardcy;": '\U0000044A', + "harr;": '\U00002194', + "harrcir;": '\U00002948', + "harrw;": '\U000021AD', + "hbar;": '\U0000210F', + "hcirc;": '\U00000125', + "hearts;": '\U00002665', + "heartsuit;": '\U00002665', + "hellip;": '\U00002026', + "hercon;": '\U000022B9', + "hfr;": '\U0001D525', + "hksearow;": '\U00002925', + "hkswarow;": '\U00002926', + "hoarr;": '\U000021FF', + "homtht;": '\U0000223B', + "hookleftarrow;": '\U000021A9', + "hookrightarrow;": '\U000021AA', + "hopf;": '\U0001D559', + "horbar;": '\U00002015', + "hscr;": '\U0001D4BD', + "hslash;": '\U0000210F', + "hstrok;": '\U00000127', + "hybull;": '\U00002043', + "hyphen;": '\U00002010', + "iacute;": '\U000000ED', + "ic;": '\U00002063', + "icirc;": '\U000000EE', + "icy;": '\U00000438', + "iecy;": '\U00000435', + "iexcl;": '\U000000A1', + "iff;": '\U000021D4', + "ifr;": '\U0001D526', + "igrave;": '\U000000EC', + "ii;": '\U00002148', + "iiiint;": '\U00002A0C', + "iiint;": '\U0000222D', + "iinfin;": '\U000029DC', + "iiota;": '\U00002129', + "ijlig;": '\U00000133', + "imacr;": '\U0000012B', + "image;": '\U00002111', + "imagline;": '\U00002110', + "imagpart;": '\U00002111', + "imath;": '\U00000131', + "imof;": '\U000022B7', + "imped;": '\U000001B5', + "in;": '\U00002208', + "incare;": '\U00002105', + "infin;": '\U0000221E', + "infintie;": '\U000029DD', + "inodot;": '\U00000131', + "int;": '\U0000222B', + "intcal;": '\U000022BA', + "integers;": '\U00002124', + "intercal;": '\U000022BA', + "intlarhk;": '\U00002A17', + "intprod;": '\U00002A3C', + "iocy;": '\U00000451', + "iogon;": '\U0000012F', + "iopf;": '\U0001D55A', + "iota;": '\U000003B9', + "iprod;": '\U00002A3C', + "iquest;": '\U000000BF', + "iscr;": '\U0001D4BE', + "isin;": '\U00002208', + "isinE;": '\U000022F9', + "isindot;": '\U000022F5', + "isins;": '\U000022F4', + "isinsv;": '\U000022F3', + "isinv;": '\U00002208', + "it;": '\U00002062', + "itilde;": '\U00000129', + "iukcy;": '\U00000456', + "iuml;": '\U000000EF', + "jcirc;": '\U00000135', + "jcy;": '\U00000439', + "jfr;": '\U0001D527', + "jmath;": '\U00000237', + "jopf;": '\U0001D55B', + "jscr;": '\U0001D4BF', + "jsercy;": '\U00000458', + "jukcy;": '\U00000454', + "kappa;": '\U000003BA', + "kappav;": '\U000003F0', + "kcedil;": '\U00000137', + "kcy;": '\U0000043A', + "kfr;": '\U0001D528', + "kgreen;": '\U00000138', + "khcy;": '\U00000445', + "kjcy;": '\U0000045C', + "kopf;": '\U0001D55C', + "kscr;": '\U0001D4C0', + "lAarr;": '\U000021DA', + "lArr;": '\U000021D0', + "lAtail;": '\U0000291B', + "lBarr;": '\U0000290E', + "lE;": '\U00002266', + "lEg;": '\U00002A8B', + "lHar;": '\U00002962', + "lacute;": '\U0000013A', + "laemptyv;": '\U000029B4', + "lagran;": '\U00002112', + "lambda;": '\U000003BB', + "lang;": '\U000027E8', + "langd;": '\U00002991', + "langle;": '\U000027E8', + "lap;": '\U00002A85', + "laquo;": '\U000000AB', + "larr;": '\U00002190', + "larrb;": '\U000021E4', + "larrbfs;": '\U0000291F', + "larrfs;": '\U0000291D', + "larrhk;": '\U000021A9', + "larrlp;": '\U000021AB', + "larrpl;": '\U00002939', + "larrsim;": '\U00002973', + "larrtl;": '\U000021A2', + "lat;": '\U00002AAB', + "latail;": '\U00002919', + "late;": '\U00002AAD', + "lbarr;": '\U0000290C', + "lbbrk;": '\U00002772', + "lbrace;": '\U0000007B', + "lbrack;": '\U0000005B', + "lbrke;": '\U0000298B', + "lbrksld;": '\U0000298F', + "lbrkslu;": '\U0000298D', + "lcaron;": '\U0000013E', + "lcedil;": '\U0000013C', + "lceil;": '\U00002308', + "lcub;": '\U0000007B', + "lcy;": '\U0000043B', + "ldca;": '\U00002936', + "ldquo;": '\U0000201C', + "ldquor;": '\U0000201E', + "ldrdhar;": '\U00002967', + "ldrushar;": '\U0000294B', + "ldsh;": '\U000021B2', + "le;": '\U00002264', + "leftarrow;": '\U00002190', + "leftarrowtail;": '\U000021A2', + "leftharpoondown;": '\U000021BD', + "leftharpoonup;": '\U000021BC', + "leftleftarrows;": '\U000021C7', + "leftrightarrow;": '\U00002194', + "leftrightarrows;": '\U000021C6', + "leftrightharpoons;": '\U000021CB', + "leftrightsquigarrow;": '\U000021AD', + "leftthreetimes;": '\U000022CB', + "leg;": '\U000022DA', + "leq;": '\U00002264', + "leqq;": '\U00002266', + "leqslant;": '\U00002A7D', + "les;": '\U00002A7D', + "lescc;": '\U00002AA8', + "lesdot;": '\U00002A7F', + "lesdoto;": '\U00002A81', + "lesdotor;": '\U00002A83', + "lesges;": '\U00002A93', + "lessapprox;": '\U00002A85', + "lessdot;": '\U000022D6', + "lesseqgtr;": '\U000022DA', + "lesseqqgtr;": '\U00002A8B', + "lessgtr;": '\U00002276', + "lesssim;": '\U00002272', + "lfisht;": '\U0000297C', + "lfloor;": '\U0000230A', + "lfr;": '\U0001D529', + "lg;": '\U00002276', + "lgE;": '\U00002A91', + "lhard;": '\U000021BD', + "lharu;": '\U000021BC', + "lharul;": '\U0000296A', + "lhblk;": '\U00002584', + "ljcy;": '\U00000459', + "ll;": '\U0000226A', + "llarr;": '\U000021C7', + "llcorner;": '\U0000231E', + "llhard;": '\U0000296B', + "lltri;": '\U000025FA', + "lmidot;": '\U00000140', + "lmoust;": '\U000023B0', + "lmoustache;": '\U000023B0', + "lnE;": '\U00002268', + "lnap;": '\U00002A89', + "lnapprox;": '\U00002A89', + "lne;": '\U00002A87', + "lneq;": '\U00002A87', + "lneqq;": '\U00002268', + "lnsim;": '\U000022E6', + "loang;": '\U000027EC', + "loarr;": '\U000021FD', + "lobrk;": '\U000027E6', + "longleftarrow;": '\U000027F5', + "longleftrightarrow;": '\U000027F7', + "longmapsto;": '\U000027FC', + "longrightarrow;": '\U000027F6', + "looparrowleft;": '\U000021AB', + "looparrowright;": '\U000021AC', + "lopar;": '\U00002985', + "lopf;": '\U0001D55D', + "loplus;": '\U00002A2D', + "lotimes;": '\U00002A34', + "lowast;": '\U00002217', + "lowbar;": '\U0000005F', + "loz;": '\U000025CA', + "lozenge;": '\U000025CA', + "lozf;": '\U000029EB', + "lpar;": '\U00000028', + "lparlt;": '\U00002993', + "lrarr;": '\U000021C6', + "lrcorner;": '\U0000231F', + "lrhar;": '\U000021CB', + "lrhard;": '\U0000296D', + "lrm;": '\U0000200E', + "lrtri;": '\U000022BF', + "lsaquo;": '\U00002039', + "lscr;": '\U0001D4C1', + "lsh;": '\U000021B0', + "lsim;": '\U00002272', + "lsime;": '\U00002A8D', + "lsimg;": '\U00002A8F', + "lsqb;": '\U0000005B', + "lsquo;": '\U00002018', + "lsquor;": '\U0000201A', + "lstrok;": '\U00000142', + "lt;": '\U0000003C', + "ltcc;": '\U00002AA6', + "ltcir;": '\U00002A79', + "ltdot;": '\U000022D6', + "lthree;": '\U000022CB', + "ltimes;": '\U000022C9', + "ltlarr;": '\U00002976', + "ltquest;": '\U00002A7B', + "ltrPar;": '\U00002996', + "ltri;": '\U000025C3', + "ltrie;": '\U000022B4', + "ltrif;": '\U000025C2', + "lurdshar;": '\U0000294A', + "luruhar;": '\U00002966', + "mDDot;": '\U0000223A', + "macr;": '\U000000AF', + "male;": '\U00002642', + "malt;": '\U00002720', + "maltese;": '\U00002720', + "map;": '\U000021A6', + "mapsto;": '\U000021A6', + "mapstodown;": '\U000021A7', + "mapstoleft;": '\U000021A4', + "mapstoup;": '\U000021A5', + "marker;": '\U000025AE', + "mcomma;": '\U00002A29', + "mcy;": '\U0000043C', + "mdash;": '\U00002014', + "measuredangle;": '\U00002221', + "mfr;": '\U0001D52A', + "mho;": '\U00002127', + "micro;": '\U000000B5', + "mid;": '\U00002223', + "midast;": '\U0000002A', + "midcir;": '\U00002AF0', + "middot;": '\U000000B7', + "minus;": '\U00002212', + "minusb;": '\U0000229F', + "minusd;": '\U00002238', + "minusdu;": '\U00002A2A', + "mlcp;": '\U00002ADB', + "mldr;": '\U00002026', + "mnplus;": '\U00002213', + "models;": '\U000022A7', + "mopf;": '\U0001D55E', + "mp;": '\U00002213', + "mscr;": '\U0001D4C2', + "mstpos;": '\U0000223E', + "mu;": '\U000003BC', + "multimap;": '\U000022B8', + "mumap;": '\U000022B8', + "nLeftarrow;": '\U000021CD', + "nLeftrightarrow;": '\U000021CE', + "nRightarrow;": '\U000021CF', + "nVDash;": '\U000022AF', + "nVdash;": '\U000022AE', + "nabla;": '\U00002207', + "nacute;": '\U00000144', + "nap;": '\U00002249', + "napos;": '\U00000149', + "napprox;": '\U00002249', + "natur;": '\U0000266E', + "natural;": '\U0000266E', + "naturals;": '\U00002115', + "nbsp;": '\U000000A0', + "ncap;": '\U00002A43', + "ncaron;": '\U00000148', + "ncedil;": '\U00000146', + "ncong;": '\U00002247', + "ncup;": '\U00002A42', + "ncy;": '\U0000043D', + "ndash;": '\U00002013', + "ne;": '\U00002260', + "neArr;": '\U000021D7', + "nearhk;": '\U00002924', + "nearr;": '\U00002197', + "nearrow;": '\U00002197', + "nequiv;": '\U00002262', + "nesear;": '\U00002928', + "nexist;": '\U00002204', + "nexists;": '\U00002204', + "nfr;": '\U0001D52B', + "nge;": '\U00002271', + "ngeq;": '\U00002271', + "ngsim;": '\U00002275', + "ngt;": '\U0000226F', + "ngtr;": '\U0000226F', + "nhArr;": '\U000021CE', + "nharr;": '\U000021AE', + "nhpar;": '\U00002AF2', + "ni;": '\U0000220B', + "nis;": '\U000022FC', + "nisd;": '\U000022FA', + "niv;": '\U0000220B', + "njcy;": '\U0000045A', + "nlArr;": '\U000021CD', + "nlarr;": '\U0000219A', + "nldr;": '\U00002025', + "nle;": '\U00002270', + "nleftarrow;": '\U0000219A', + "nleftrightarrow;": '\U000021AE', + "nleq;": '\U00002270', + "nless;": '\U0000226E', + "nlsim;": '\U00002274', + "nlt;": '\U0000226E', + "nltri;": '\U000022EA', + "nltrie;": '\U000022EC', + "nmid;": '\U00002224', + "nopf;": '\U0001D55F', + "not;": '\U000000AC', + "notin;": '\U00002209', + "notinva;": '\U00002209', + "notinvb;": '\U000022F7', + "notinvc;": '\U000022F6', + "notni;": '\U0000220C', + "notniva;": '\U0000220C', + "notnivb;": '\U000022FE', + "notnivc;": '\U000022FD', + "npar;": '\U00002226', + "nparallel;": '\U00002226', + "npolint;": '\U00002A14', + "npr;": '\U00002280', + "nprcue;": '\U000022E0', + "nprec;": '\U00002280', + "nrArr;": '\U000021CF', + "nrarr;": '\U0000219B', + "nrightarrow;": '\U0000219B', + "nrtri;": '\U000022EB', + "nrtrie;": '\U000022ED', + "nsc;": '\U00002281', + "nsccue;": '\U000022E1', + "nscr;": '\U0001D4C3', + "nshortmid;": '\U00002224', + "nshortparallel;": '\U00002226', + "nsim;": '\U00002241', + "nsime;": '\U00002244', + "nsimeq;": '\U00002244', + "nsmid;": '\U00002224', + "nspar;": '\U00002226', + "nsqsube;": '\U000022E2', + "nsqsupe;": '\U000022E3', + "nsub;": '\U00002284', + "nsube;": '\U00002288', + "nsubseteq;": '\U00002288', + "nsucc;": '\U00002281', + "nsup;": '\U00002285', + "nsupe;": '\U00002289', + "nsupseteq;": '\U00002289', + "ntgl;": '\U00002279', + "ntilde;": '\U000000F1', + "ntlg;": '\U00002278', + "ntriangleleft;": '\U000022EA', + "ntrianglelefteq;": '\U000022EC', + "ntriangleright;": '\U000022EB', + "ntrianglerighteq;": '\U000022ED', + "nu;": '\U000003BD', + "num;": '\U00000023', + "numero;": '\U00002116', + "numsp;": '\U00002007', + "nvDash;": '\U000022AD', + "nvHarr;": '\U00002904', + "nvdash;": '\U000022AC', + "nvinfin;": '\U000029DE', + "nvlArr;": '\U00002902', + "nvrArr;": '\U00002903', + "nwArr;": '\U000021D6', + "nwarhk;": '\U00002923', + "nwarr;": '\U00002196', + "nwarrow;": '\U00002196', + "nwnear;": '\U00002927', + "oS;": '\U000024C8', + "oacute;": '\U000000F3', + "oast;": '\U0000229B', + "ocir;": '\U0000229A', + "ocirc;": '\U000000F4', + "ocy;": '\U0000043E', + "odash;": '\U0000229D', + "odblac;": '\U00000151', + "odiv;": '\U00002A38', + "odot;": '\U00002299', + "odsold;": '\U000029BC', + "oelig;": '\U00000153', + "ofcir;": '\U000029BF', + "ofr;": '\U0001D52C', + "ogon;": '\U000002DB', + "ograve;": '\U000000F2', + "ogt;": '\U000029C1', + "ohbar;": '\U000029B5', + "ohm;": '\U000003A9', + "oint;": '\U0000222E', + "olarr;": '\U000021BA', + "olcir;": '\U000029BE', + "olcross;": '\U000029BB', + "oline;": '\U0000203E', + "olt;": '\U000029C0', + "omacr;": '\U0000014D', + "omega;": '\U000003C9', + "omicron;": '\U000003BF', + "omid;": '\U000029B6', + "ominus;": '\U00002296', + "oopf;": '\U0001D560', + "opar;": '\U000029B7', + "operp;": '\U000029B9', + "oplus;": '\U00002295', + "or;": '\U00002228', + "orarr;": '\U000021BB', + "ord;": '\U00002A5D', + "order;": '\U00002134', + "orderof;": '\U00002134', + "ordf;": '\U000000AA', + "ordm;": '\U000000BA', + "origof;": '\U000022B6', + "oror;": '\U00002A56', + "orslope;": '\U00002A57', + "orv;": '\U00002A5B', + "oscr;": '\U00002134', + "oslash;": '\U000000F8', + "osol;": '\U00002298', + "otilde;": '\U000000F5', + "otimes;": '\U00002297', + "otimesas;": '\U00002A36', + "ouml;": '\U000000F6', + "ovbar;": '\U0000233D', + "par;": '\U00002225', + "para;": '\U000000B6', + "parallel;": '\U00002225', + "parsim;": '\U00002AF3', + "parsl;": '\U00002AFD', + "part;": '\U00002202', + "pcy;": '\U0000043F', + "percnt;": '\U00000025', + "period;": '\U0000002E', + "permil;": '\U00002030', + "perp;": '\U000022A5', + "pertenk;": '\U00002031', + "pfr;": '\U0001D52D', + "phi;": '\U000003C6', + "phiv;": '\U000003D5', + "phmmat;": '\U00002133', + "phone;": '\U0000260E', + "pi;": '\U000003C0', + "pitchfork;": '\U000022D4', + "piv;": '\U000003D6', + "planck;": '\U0000210F', + "planckh;": '\U0000210E', + "plankv;": '\U0000210F', + "plus;": '\U0000002B', + "plusacir;": '\U00002A23', + "plusb;": '\U0000229E', + "pluscir;": '\U00002A22', + "plusdo;": '\U00002214', + "plusdu;": '\U00002A25', + "pluse;": '\U00002A72', + "plusmn;": '\U000000B1', + "plussim;": '\U00002A26', + "plustwo;": '\U00002A27', + "pm;": '\U000000B1', + "pointint;": '\U00002A15', + "popf;": '\U0001D561', + "pound;": '\U000000A3', + "pr;": '\U0000227A', + "prE;": '\U00002AB3', + "prap;": '\U00002AB7', + "prcue;": '\U0000227C', + "pre;": '\U00002AAF', + "prec;": '\U0000227A', + "precapprox;": '\U00002AB7', + "preccurlyeq;": '\U0000227C', + "preceq;": '\U00002AAF', + "precnapprox;": '\U00002AB9', + "precneqq;": '\U00002AB5', + "precnsim;": '\U000022E8', + "precsim;": '\U0000227E', + "prime;": '\U00002032', + "primes;": '\U00002119', + "prnE;": '\U00002AB5', + "prnap;": '\U00002AB9', + "prnsim;": '\U000022E8', + "prod;": '\U0000220F', + "profalar;": '\U0000232E', + "profline;": '\U00002312', + "profsurf;": '\U00002313', + "prop;": '\U0000221D', + "propto;": '\U0000221D', + "prsim;": '\U0000227E', + "prurel;": '\U000022B0', + "pscr;": '\U0001D4C5', + "psi;": '\U000003C8', + "puncsp;": '\U00002008', + "qfr;": '\U0001D52E', + "qint;": '\U00002A0C', + "qopf;": '\U0001D562', + "qprime;": '\U00002057', + "qscr;": '\U0001D4C6', + "quaternions;": '\U0000210D', + "quatint;": '\U00002A16', + "quest;": '\U0000003F', + "questeq;": '\U0000225F', + "quot;": '\U00000022', + "rAarr;": '\U000021DB', + "rArr;": '\U000021D2', + "rAtail;": '\U0000291C', + "rBarr;": '\U0000290F', + "rHar;": '\U00002964', + "racute;": '\U00000155', + "radic;": '\U0000221A', + "raemptyv;": '\U000029B3', + "rang;": '\U000027E9', + "rangd;": '\U00002992', + "range;": '\U000029A5', + "rangle;": '\U000027E9', + "raquo;": '\U000000BB', + "rarr;": '\U00002192', + "rarrap;": '\U00002975', + "rarrb;": '\U000021E5', + "rarrbfs;": '\U00002920', + "rarrc;": '\U00002933', + "rarrfs;": '\U0000291E', + "rarrhk;": '\U000021AA', + "rarrlp;": '\U000021AC', + "rarrpl;": '\U00002945', + "rarrsim;": '\U00002974', + "rarrtl;": '\U000021A3', + "rarrw;": '\U0000219D', + "ratail;": '\U0000291A', + "ratio;": '\U00002236', + "rationals;": '\U0000211A', + "rbarr;": '\U0000290D', + "rbbrk;": '\U00002773', + "rbrace;": '\U0000007D', + "rbrack;": '\U0000005D', + "rbrke;": '\U0000298C', + "rbrksld;": '\U0000298E', + "rbrkslu;": '\U00002990', + "rcaron;": '\U00000159', + "rcedil;": '\U00000157', + "rceil;": '\U00002309', + "rcub;": '\U0000007D', + "rcy;": '\U00000440', + "rdca;": '\U00002937', + "rdldhar;": '\U00002969', + "rdquo;": '\U0000201D', + "rdquor;": '\U0000201D', + "rdsh;": '\U000021B3', + "real;": '\U0000211C', + "realine;": '\U0000211B', + "realpart;": '\U0000211C', + "reals;": '\U0000211D', + "rect;": '\U000025AD', + "reg;": '\U000000AE', + "rfisht;": '\U0000297D', + "rfloor;": '\U0000230B', + "rfr;": '\U0001D52F', + "rhard;": '\U000021C1', + "rharu;": '\U000021C0', + "rharul;": '\U0000296C', + "rho;": '\U000003C1', + "rhov;": '\U000003F1', + "rightarrow;": '\U00002192', + "rightarrowtail;": '\U000021A3', + "rightharpoondown;": '\U000021C1', + "rightharpoonup;": '\U000021C0', + "rightleftarrows;": '\U000021C4', + "rightleftharpoons;": '\U000021CC', + "rightrightarrows;": '\U000021C9', + "rightsquigarrow;": '\U0000219D', + "rightthreetimes;": '\U000022CC', + "ring;": '\U000002DA', + "risingdotseq;": '\U00002253', + "rlarr;": '\U000021C4', + "rlhar;": '\U000021CC', + "rlm;": '\U0000200F', + "rmoust;": '\U000023B1', + "rmoustache;": '\U000023B1', + "rnmid;": '\U00002AEE', + "roang;": '\U000027ED', + "roarr;": '\U000021FE', + "robrk;": '\U000027E7', + "ropar;": '\U00002986', + "ropf;": '\U0001D563', + "roplus;": '\U00002A2E', + "rotimes;": '\U00002A35', + "rpar;": '\U00000029', + "rpargt;": '\U00002994', + "rppolint;": '\U00002A12', + "rrarr;": '\U000021C9', + "rsaquo;": '\U0000203A', + "rscr;": '\U0001D4C7', + "rsh;": '\U000021B1', + "rsqb;": '\U0000005D', + "rsquo;": '\U00002019', + "rsquor;": '\U00002019', + "rthree;": '\U000022CC', + "rtimes;": '\U000022CA', + "rtri;": '\U000025B9', + "rtrie;": '\U000022B5', + "rtrif;": '\U000025B8', + "rtriltri;": '\U000029CE', + "ruluhar;": '\U00002968', + "rx;": '\U0000211E', + "sacute;": '\U0000015B', + "sbquo;": '\U0000201A', + "sc;": '\U0000227B', + "scE;": '\U00002AB4', + "scap;": '\U00002AB8', + "scaron;": '\U00000161', + "sccue;": '\U0000227D', + "sce;": '\U00002AB0', + "scedil;": '\U0000015F', + "scirc;": '\U0000015D', + "scnE;": '\U00002AB6', + "scnap;": '\U00002ABA', + "scnsim;": '\U000022E9', + "scpolint;": '\U00002A13', + "scsim;": '\U0000227F', + "scy;": '\U00000441', + "sdot;": '\U000022C5', + "sdotb;": '\U000022A1', + "sdote;": '\U00002A66', + "seArr;": '\U000021D8', + "searhk;": '\U00002925', + "searr;": '\U00002198', + "searrow;": '\U00002198', + "sect;": '\U000000A7', + "semi;": '\U0000003B', + "seswar;": '\U00002929', + "setminus;": '\U00002216', + "setmn;": '\U00002216', + "sext;": '\U00002736', + "sfr;": '\U0001D530', + "sfrown;": '\U00002322', + "sharp;": '\U0000266F', + "shchcy;": '\U00000449', + "shcy;": '\U00000448', + "shortmid;": '\U00002223', + "shortparallel;": '\U00002225', + "shy;": '\U000000AD', + "sigma;": '\U000003C3', + "sigmaf;": '\U000003C2', + "sigmav;": '\U000003C2', + "sim;": '\U0000223C', + "simdot;": '\U00002A6A', + "sime;": '\U00002243', + "simeq;": '\U00002243', + "simg;": '\U00002A9E', + "simgE;": '\U00002AA0', + "siml;": '\U00002A9D', + "simlE;": '\U00002A9F', + "simne;": '\U00002246', + "simplus;": '\U00002A24', + "simrarr;": '\U00002972', + "slarr;": '\U00002190', + "smallsetminus;": '\U00002216', + "smashp;": '\U00002A33', + "smeparsl;": '\U000029E4', + "smid;": '\U00002223', + "smile;": '\U00002323', + "smt;": '\U00002AAA', + "smte;": '\U00002AAC', + "softcy;": '\U0000044C', + "sol;": '\U0000002F', + "solb;": '\U000029C4', + "solbar;": '\U0000233F', + "sopf;": '\U0001D564', + "spades;": '\U00002660', + "spadesuit;": '\U00002660', + "spar;": '\U00002225', + "sqcap;": '\U00002293', + "sqcup;": '\U00002294', + "sqsub;": '\U0000228F', + "sqsube;": '\U00002291', + "sqsubset;": '\U0000228F', + "sqsubseteq;": '\U00002291', + "sqsup;": '\U00002290', + "sqsupe;": '\U00002292', + "sqsupset;": '\U00002290', + "sqsupseteq;": '\U00002292', + "squ;": '\U000025A1', + "square;": '\U000025A1', + "squarf;": '\U000025AA', + "squf;": '\U000025AA', + "srarr;": '\U00002192', + "sscr;": '\U0001D4C8', + "ssetmn;": '\U00002216', + "ssmile;": '\U00002323', + "sstarf;": '\U000022C6', + "star;": '\U00002606', + "starf;": '\U00002605', + "straightepsilon;": '\U000003F5', + "straightphi;": '\U000003D5', + "strns;": '\U000000AF', + "sub;": '\U00002282', + "subE;": '\U00002AC5', + "subdot;": '\U00002ABD', + "sube;": '\U00002286', + "subedot;": '\U00002AC3', + "submult;": '\U00002AC1', + "subnE;": '\U00002ACB', + "subne;": '\U0000228A', + "subplus;": '\U00002ABF', + "subrarr;": '\U00002979', + "subset;": '\U00002282', + "subseteq;": '\U00002286', + "subseteqq;": '\U00002AC5', + "subsetneq;": '\U0000228A', + "subsetneqq;": '\U00002ACB', + "subsim;": '\U00002AC7', + "subsub;": '\U00002AD5', + "subsup;": '\U00002AD3', + "succ;": '\U0000227B', + "succapprox;": '\U00002AB8', + "succcurlyeq;": '\U0000227D', + "succeq;": '\U00002AB0', + "succnapprox;": '\U00002ABA', + "succneqq;": '\U00002AB6', + "succnsim;": '\U000022E9', + "succsim;": '\U0000227F', + "sum;": '\U00002211', + "sung;": '\U0000266A', + "sup;": '\U00002283', + "sup1;": '\U000000B9', + "sup2;": '\U000000B2', + "sup3;": '\U000000B3', + "supE;": '\U00002AC6', + "supdot;": '\U00002ABE', + "supdsub;": '\U00002AD8', + "supe;": '\U00002287', + "supedot;": '\U00002AC4', + "suphsol;": '\U000027C9', + "suphsub;": '\U00002AD7', + "suplarr;": '\U0000297B', + "supmult;": '\U00002AC2', + "supnE;": '\U00002ACC', + "supne;": '\U0000228B', + "supplus;": '\U00002AC0', + "supset;": '\U00002283', + "supseteq;": '\U00002287', + "supseteqq;": '\U00002AC6', + "supsetneq;": '\U0000228B', + "supsetneqq;": '\U00002ACC', + "supsim;": '\U00002AC8', + "supsub;": '\U00002AD4', + "supsup;": '\U00002AD6', + "swArr;": '\U000021D9', + "swarhk;": '\U00002926', + "swarr;": '\U00002199', + "swarrow;": '\U00002199', + "swnwar;": '\U0000292A', + "szlig;": '\U000000DF', + "target;": '\U00002316', + "tau;": '\U000003C4', + "tbrk;": '\U000023B4', + "tcaron;": '\U00000165', + "tcedil;": '\U00000163', + "tcy;": '\U00000442', + "tdot;": '\U000020DB', + "telrec;": '\U00002315', + "tfr;": '\U0001D531', + "there4;": '\U00002234', + "therefore;": '\U00002234', + "theta;": '\U000003B8', + "thetasym;": '\U000003D1', + "thetav;": '\U000003D1', + "thickapprox;": '\U00002248', + "thicksim;": '\U0000223C', + "thinsp;": '\U00002009', + "thkap;": '\U00002248', + "thksim;": '\U0000223C', + "thorn;": '\U000000FE', + "tilde;": '\U000002DC', + "times;": '\U000000D7', + "timesb;": '\U000022A0', + "timesbar;": '\U00002A31', + "timesd;": '\U00002A30', + "tint;": '\U0000222D', + "toea;": '\U00002928', + "top;": '\U000022A4', + "topbot;": '\U00002336', + "topcir;": '\U00002AF1', + "topf;": '\U0001D565', + "topfork;": '\U00002ADA', + "tosa;": '\U00002929', + "tprime;": '\U00002034', + "trade;": '\U00002122', + "triangle;": '\U000025B5', + "triangledown;": '\U000025BF', + "triangleleft;": '\U000025C3', + "trianglelefteq;": '\U000022B4', + "triangleq;": '\U0000225C', + "triangleright;": '\U000025B9', + "trianglerighteq;": '\U000022B5', + "tridot;": '\U000025EC', + "trie;": '\U0000225C', + "triminus;": '\U00002A3A', + "triplus;": '\U00002A39', + "trisb;": '\U000029CD', + "tritime;": '\U00002A3B', + "trpezium;": '\U000023E2', + "tscr;": '\U0001D4C9', + "tscy;": '\U00000446', + "tshcy;": '\U0000045B', + "tstrok;": '\U00000167', + "twixt;": '\U0000226C', + "twoheadleftarrow;": '\U0000219E', + "twoheadrightarrow;": '\U000021A0', + "uArr;": '\U000021D1', + "uHar;": '\U00002963', + "uacute;": '\U000000FA', + "uarr;": '\U00002191', + "ubrcy;": '\U0000045E', + "ubreve;": '\U0000016D', + "ucirc;": '\U000000FB', + "ucy;": '\U00000443', + "udarr;": '\U000021C5', + "udblac;": '\U00000171', + "udhar;": '\U0000296E', + "ufisht;": '\U0000297E', + "ufr;": '\U0001D532', + "ugrave;": '\U000000F9', + "uharl;": '\U000021BF', + "uharr;": '\U000021BE', + "uhblk;": '\U00002580', + "ulcorn;": '\U0000231C', + "ulcorner;": '\U0000231C', + "ulcrop;": '\U0000230F', + "ultri;": '\U000025F8', + "umacr;": '\U0000016B', + "uml;": '\U000000A8', + "uogon;": '\U00000173', + "uopf;": '\U0001D566', + "uparrow;": '\U00002191', + "updownarrow;": '\U00002195', + "upharpoonleft;": '\U000021BF', + "upharpoonright;": '\U000021BE', + "uplus;": '\U0000228E', + "upsi;": '\U000003C5', + "upsih;": '\U000003D2', + "upsilon;": '\U000003C5', + "upuparrows;": '\U000021C8', + "urcorn;": '\U0000231D', + "urcorner;": '\U0000231D', + "urcrop;": '\U0000230E', + "uring;": '\U0000016F', + "urtri;": '\U000025F9', + "uscr;": '\U0001D4CA', + "utdot;": '\U000022F0', + "utilde;": '\U00000169', + "utri;": '\U000025B5', + "utrif;": '\U000025B4', + "uuarr;": '\U000021C8', + "uuml;": '\U000000FC', + "uwangle;": '\U000029A7', + "vArr;": '\U000021D5', + "vBar;": '\U00002AE8', + "vBarv;": '\U00002AE9', + "vDash;": '\U000022A8', + "vangrt;": '\U0000299C', + "varepsilon;": '\U000003F5', + "varkappa;": '\U000003F0', + "varnothing;": '\U00002205', + "varphi;": '\U000003D5', + "varpi;": '\U000003D6', + "varpropto;": '\U0000221D', + "varr;": '\U00002195', + "varrho;": '\U000003F1', + "varsigma;": '\U000003C2', + "vartheta;": '\U000003D1', + "vartriangleleft;": '\U000022B2', + "vartriangleright;": '\U000022B3', + "vcy;": '\U00000432', + "vdash;": '\U000022A2', + "vee;": '\U00002228', + "veebar;": '\U000022BB', + "veeeq;": '\U0000225A', + "vellip;": '\U000022EE', + "verbar;": '\U0000007C', + "vert;": '\U0000007C', + "vfr;": '\U0001D533', + "vltri;": '\U000022B2', + "vopf;": '\U0001D567', + "vprop;": '\U0000221D', + "vrtri;": '\U000022B3', + "vscr;": '\U0001D4CB', + "vzigzag;": '\U0000299A', + "wcirc;": '\U00000175', + "wedbar;": '\U00002A5F', + "wedge;": '\U00002227', + "wedgeq;": '\U00002259', + "weierp;": '\U00002118', + "wfr;": '\U0001D534', + "wopf;": '\U0001D568', + "wp;": '\U00002118', + "wr;": '\U00002240', + "wreath;": '\U00002240', + "wscr;": '\U0001D4CC', + "xcap;": '\U000022C2', + "xcirc;": '\U000025EF', + "xcup;": '\U000022C3', + "xdtri;": '\U000025BD', + "xfr;": '\U0001D535', + "xhArr;": '\U000027FA', + "xharr;": '\U000027F7', + "xi;": '\U000003BE', + "xlArr;": '\U000027F8', + "xlarr;": '\U000027F5', + "xmap;": '\U000027FC', + "xnis;": '\U000022FB', + "xodot;": '\U00002A00', + "xopf;": '\U0001D569', + "xoplus;": '\U00002A01', + "xotime;": '\U00002A02', + "xrArr;": '\U000027F9', + "xrarr;": '\U000027F6', + "xscr;": '\U0001D4CD', + "xsqcup;": '\U00002A06', + "xuplus;": '\U00002A04', + "xutri;": '\U000025B3', + "xvee;": '\U000022C1', + "xwedge;": '\U000022C0', + "yacute;": '\U000000FD', + "yacy;": '\U0000044F', + "ycirc;": '\U00000177', + "ycy;": '\U0000044B', + "yen;": '\U000000A5', + "yfr;": '\U0001D536', + "yicy;": '\U00000457', + "yopf;": '\U0001D56A', + "yscr;": '\U0001D4CE', + "yucy;": '\U0000044E', + "yuml;": '\U000000FF', + "zacute;": '\U0000017A', + "zcaron;": '\U0000017E', + "zcy;": '\U00000437', + "zdot;": '\U0000017C', + "zeetrf;": '\U00002128', + "zeta;": '\U000003B6', + "zfr;": '\U0001D537', + "zhcy;": '\U00000436', + "zigrarr;": '\U000021DD', + "zopf;": '\U0001D56B', + "zscr;": '\U0001D4CF', + "zwj;": '\U0000200D', + "zwnj;": '\U0000200C', + "AElig": '\U000000C6', + "AMP": '\U00000026', + "Aacute": '\U000000C1', + "Acirc": '\U000000C2', + "Agrave": '\U000000C0', + "Aring": '\U000000C5', + "Atilde": '\U000000C3', + "Auml": '\U000000C4', + "COPY": '\U000000A9', + "Ccedil": '\U000000C7', + "ETH": '\U000000D0', + "Eacute": '\U000000C9', + "Ecirc": '\U000000CA', + "Egrave": '\U000000C8', + "Euml": '\U000000CB', + "GT": '\U0000003E', + "Iacute": '\U000000CD', + "Icirc": '\U000000CE', + "Igrave": '\U000000CC', + "Iuml": '\U000000CF', + "LT": '\U0000003C', + "Ntilde": '\U000000D1', + "Oacute": '\U000000D3', + "Ocirc": '\U000000D4', + "Ograve": '\U000000D2', + "Oslash": '\U000000D8', + "Otilde": '\U000000D5', + "Ouml": '\U000000D6', + "QUOT": '\U00000022', + "REG": '\U000000AE', + "THORN": '\U000000DE', + "Uacute": '\U000000DA', + "Ucirc": '\U000000DB', + "Ugrave": '\U000000D9', + "Uuml": '\U000000DC', + "Yacute": '\U000000DD', + "aacute": '\U000000E1', + "acirc": '\U000000E2', + "acute": '\U000000B4', + "aelig": '\U000000E6', + "agrave": '\U000000E0', + "amp": '\U00000026', + "aring": '\U000000E5', + "atilde": '\U000000E3', + "auml": '\U000000E4', + "brvbar": '\U000000A6', + "ccedil": '\U000000E7', + "cedil": '\U000000B8', + "cent": '\U000000A2', + "copy": '\U000000A9', + "curren": '\U000000A4', + "deg": '\U000000B0', + "divide": '\U000000F7', + "eacute": '\U000000E9', + "ecirc": '\U000000EA', + "egrave": '\U000000E8', + "eth": '\U000000F0', + "euml": '\U000000EB', + "frac12": '\U000000BD', + "frac14": '\U000000BC', + "frac34": '\U000000BE', + "gt": '\U0000003E', + "iacute": '\U000000ED', + "icirc": '\U000000EE', + "iexcl": '\U000000A1', + "igrave": '\U000000EC', + "iquest": '\U000000BF', + "iuml": '\U000000EF', + "laquo": '\U000000AB', + "lt": '\U0000003C', + "macr": '\U000000AF', + "micro": '\U000000B5', + "middot": '\U000000B7', + "nbsp": '\U000000A0', + "not": '\U000000AC', + "ntilde": '\U000000F1', + "oacute": '\U000000F3', + "ocirc": '\U000000F4', + "ograve": '\U000000F2', + "ordf": '\U000000AA', + "ordm": '\U000000BA', + "oslash": '\U000000F8', + "otilde": '\U000000F5', + "ouml": '\U000000F6', + "para": '\U000000B6', + "plusmn": '\U000000B1', + "pound": '\U000000A3', + "quot": '\U00000022', + "raquo": '\U000000BB', + "reg": '\U000000AE', + "sect": '\U000000A7', + "shy": '\U000000AD', + "sup1": '\U000000B9', + "sup2": '\U000000B2', + "sup3": '\U000000B3', + "szlig": '\U000000DF', + "thorn": '\U000000FE', + "times": '\U000000D7', + "uacute": '\U000000FA', + "ucirc": '\U000000FB', + "ugrave": '\U000000F9', + "uml": '\U000000A8', + "uuml": '\U000000FC', + "yacute": '\U000000FD', + "yen": '\U000000A5', + "yuml": '\U000000FF', } // HTML entities that are two unicode codepoints. diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go index d3b3844099bf..01477a96397c 100644 --- a/vendor/golang.org/x/net/html/foreign.go +++ b/vendor/golang.org/x/net/html/foreign.go @@ -67,7 +67,7 @@ func mathMLTextIntegrationPoint(n *Node) bool { return false } -// Section 12.2.5.5. +// Section 12.2.6.5. var breakout = map[string]bool{ "b": true, "big": true, @@ -115,7 +115,7 @@ var breakout = map[string]bool{ "var": true, } -// Section 12.2.5.5. +// Section 12.2.6.5. var svgTagNameAdjustments = map[string]string{ "altglyph": "altGlyph", "altglyphdef": "altGlyphDef", @@ -155,7 +155,7 @@ var svgTagNameAdjustments = map[string]string{ "textpath": "textPath", } -// Section 12.2.5.1 +// Section 12.2.6.1 var mathMLAttributeAdjustments = map[string]string{ "definitionurl": "definitionURL", } diff --git a/vendor/golang.org/x/net/html/node.go b/vendor/golang.org/x/net/html/node.go index 26b657aec83b..633ee15dc55b 100644 --- a/vendor/golang.org/x/net/html/node.go +++ b/vendor/golang.org/x/net/html/node.go @@ -21,9 +21,10 @@ const ( scopeMarkerNode ) -// Section 12.2.3.3 says "scope markers are inserted when entering applet -// elements, buttons, object elements, marquees, table cells, and table -// captions, and are used to prevent formatting from 'leaking'". +// Section 12.2.4.3 says "The markers are inserted when entering applet, +// object, marquee, template, td, th, and caption elements, and are used +// to prevent formatting from "leaking" into applet, object, marquee, +// template, td, th, and caption elements". var scopeMarker = Node{Type: scopeMarkerNode} // A Node consists of a NodeType and some Data (tag name for element nodes, @@ -173,6 +174,16 @@ func (s *nodeStack) index(n *Node) int { return -1 } +// contains returns whether a is within s. +func (s *nodeStack) contains(a atom.Atom) bool { + for _, n := range *s { + if n.DataAtom == a && n.Namespace == "" { + return true + } + } + return false +} + // insert inserts a node at the given index. func (s *nodeStack) insert(i int, n *Node) { (*s) = append(*s, nil) @@ -191,3 +202,19 @@ func (s *nodeStack) remove(n *Node) { (*s)[j] = nil *s = (*s)[:j] } + +type insertionModeStack []insertionMode + +func (s *insertionModeStack) pop() (im insertionMode) { + i := len(*s) + im = (*s)[i-1] + *s = (*s)[:i-1] + return im +} + +func (s *insertionModeStack) top() insertionMode { + if i := len(*s); i > 0 { + return (*s)[i-1] + } + return nil +} diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go index be4b2bf5aa9e..1d3c198ae7d2 100644 --- a/vendor/golang.org/x/net/html/parse.go +++ b/vendor/golang.org/x/net/html/parse.go @@ -25,20 +25,22 @@ type parser struct { hasSelfClosingToken bool // doc is the document root element. doc *Node - // The stack of open elements (section 12.2.3.2) and active formatting - // elements (section 12.2.3.3). + // The stack of open elements (section 12.2.4.2) and active formatting + // elements (section 12.2.4.3). oe, afe nodeStack - // Element pointers (section 12.2.3.4). + // Element pointers (section 12.2.4.4). head, form *Node - // Other parsing state flags (section 12.2.3.5). + // Other parsing state flags (section 12.2.4.5). scripting, framesetOK bool + // The stack of template insertion modes + templateStack insertionModeStack // im is the current insertion mode. im insertionMode // originalIM is the insertion mode to go back to after completing a text // or inTableText insertion mode. originalIM insertionMode // fosterParenting is whether new elements should be inserted according to - // the foster parenting rules (section 12.2.5.3). + // the foster parenting rules (section 12.2.6.1). fosterParenting bool // quirks is whether the parser is operating in "quirks mode." quirks bool @@ -56,7 +58,7 @@ func (p *parser) top() *Node { return p.doc } -// Stop tags for use in popUntil. These come from section 12.2.3.2. +// Stop tags for use in popUntil. These come from section 12.2.4.2. var ( defaultScopeStopTags = map[string][]a.Atom{ "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template}, @@ -79,7 +81,7 @@ const ( // popUntil pops the stack of open elements at the highest element whose tag // is in matchTags, provided there is no higher element in the scope's stop -// tags (as defined in section 12.2.3.2). It returns whether or not there was +// tags (as defined in section 12.2.4.2). It returns whether or not there was // such an element. If there was not, popUntil leaves the stack unchanged. // // For example, the set of stop tags for table scope is: "html", "table". If @@ -126,7 +128,7 @@ func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { return -1 } case tableScope: - if tagAtom == a.Html || tagAtom == a.Table { + if tagAtom == a.Html || tagAtom == a.Table || tagAtom == a.Template { return -1 } case selectScope: @@ -162,17 +164,17 @@ func (p *parser) clearStackToContext(s scope) { tagAtom := p.oe[i].DataAtom switch s { case tableScope: - if tagAtom == a.Html || tagAtom == a.Table { + if tagAtom == a.Html || tagAtom == a.Table || tagAtom == a.Template { p.oe = p.oe[:i+1] return } case tableRowScope: - if tagAtom == a.Html || tagAtom == a.Tr { + if tagAtom == a.Html || tagAtom == a.Tr || tagAtom == a.Template { p.oe = p.oe[:i+1] return } case tableBodyScope: - if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead { + if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead || tagAtom == a.Template { p.oe = p.oe[:i+1] return } @@ -183,7 +185,7 @@ func (p *parser) clearStackToContext(s scope) { } // generateImpliedEndTags pops nodes off the stack of open elements as long as -// the top node has a tag name of dd, dt, li, option, optgroup, p, rp, or rt. +// the top node has a tag name of dd, dt, li, optgroup, option, p, rb, rp, rt or rtc. // If exceptions are specified, nodes with that name will not be popped off. func (p *parser) generateImpliedEndTags(exceptions ...string) { var i int @@ -192,7 +194,7 @@ loop: n := p.oe[i] if n.Type == ElementNode { switch n.DataAtom { - case a.Dd, a.Dt, a.Li, a.Option, a.Optgroup, a.P, a.Rp, a.Rt: + case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc: for _, except := range exceptions { if n.Data == except { break loop @@ -234,9 +236,9 @@ func (p *parser) shouldFosterParent() bool { } // fosterParent adds a child node according to the foster parenting rules. -// Section 12.2.5.3, "foster parenting". +// Section 12.2.6.1, "foster parenting". func (p *parser) fosterParent(n *Node) { - var table, parent, prev *Node + var table, parent, prev, template *Node var i int for i = len(p.oe) - 1; i >= 0; i-- { if p.oe[i].DataAtom == a.Table { @@ -245,6 +247,19 @@ func (p *parser) fosterParent(n *Node) { } } + var j int + for j = len(p.oe) - 1; j >= 0; j-- { + if p.oe[j].DataAtom == a.Template { + template = p.oe[j] + break + } + } + + if template != nil && (table == nil || j > i) { + template.AppendChild(n) + return + } + if table == nil { // The foster parent is the html element. parent = p.oe[0] @@ -304,7 +319,7 @@ func (p *parser) addElement() { }) } -// Section 12.2.3.3. +// Section 12.2.4.3. func (p *parser) addFormattingElement() { tagAtom, attr := p.tok.DataAtom, p.tok.Attr p.addElement() @@ -351,7 +366,7 @@ findIdenticalElements: p.afe = append(p.afe, p.top()) } -// Section 12.2.3.3. +// Section 12.2.4.3. func (p *parser) clearActiveFormattingElements() { for { n := p.afe.pop() @@ -361,7 +376,7 @@ func (p *parser) clearActiveFormattingElements() { } } -// Section 12.2.3.3. +// Section 12.2.4.3. func (p *parser) reconstructActiveFormattingElements() { n := p.afe.top() if n == nil { @@ -390,12 +405,12 @@ func (p *parser) reconstructActiveFormattingElements() { } } -// Section 12.2.4. +// Section 12.2.5. func (p *parser) acknowledgeSelfClosingTag() { p.hasSelfClosingToken = false } -// An insertion mode (section 12.2.3.1) is the state transition function from +// An insertion mode (section 12.2.4.1) is the state transition function from // a particular state in the HTML5 parser's state machine. It updates the // parser's fields depending on parser.tok (where ErrorToken means EOF). // It returns whether the token was consumed. @@ -403,7 +418,7 @@ type insertionMode func(*parser) bool // setOriginalIM sets the insertion mode to return to after completing a text or // inTableText insertion mode. -// Section 12.2.3.1, "using the rules for". +// Section 12.2.4.1, "using the rules for". func (p *parser) setOriginalIM() { if p.originalIM != nil { panic("html: bad parser state: originalIM was set twice") @@ -411,18 +426,35 @@ func (p *parser) setOriginalIM() { p.originalIM = p.im } -// Section 12.2.3.1, "reset the insertion mode". +// Section 12.2.4.1, "reset the insertion mode". func (p *parser) resetInsertionMode() { for i := len(p.oe) - 1; i >= 0; i-- { n := p.oe[i] - if i == 0 && p.context != nil { + last := i == 0 + if last && p.context != nil { n = p.context } switch n.DataAtom { case a.Select: + if !last { + for ancestor, first := n, p.oe[0]; ancestor != first; { + ancestor = p.oe[p.oe.index(ancestor)-1] + switch ancestor.DataAtom { + case a.Template: + p.im = inSelectIM + return + case a.Table: + p.im = inSelectInTableIM + return + } + } + } p.im = inSelectIM case a.Td, a.Th: + // TODO: remove this divergence from the HTML5 spec. + // + // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668 p.im = inCellIM case a.Tr: p.im = inRowIM @@ -434,25 +466,41 @@ func (p *parser) resetInsertionMode() { p.im = inColumnGroupIM case a.Table: p.im = inTableIM + case a.Template: + // TODO: remove this divergence from the HTML5 spec. + if n.Namespace != "" { + continue + } + p.im = p.templateStack.top() case a.Head: - p.im = inBodyIM + // TODO: remove this divergence from the HTML5 spec. + // + // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668 + p.im = inHeadIM case a.Body: p.im = inBodyIM case a.Frameset: p.im = inFramesetIM case a.Html: - p.im = beforeHeadIM + if p.head == nil { + p.im = beforeHeadIM + } else { + p.im = afterHeadIM + } default: + if last { + p.im = inBodyIM + return + } continue } return } - p.im = inBodyIM } const whitespace = " \t\r\n\f" -// Section 12.2.5.4.1. +// Section 12.2.6.4.1. func initialIM(p *parser) bool { switch p.tok.Type { case TextToken: @@ -479,7 +527,7 @@ func initialIM(p *parser) bool { return false } -// Section 12.2.5.4.2. +// Section 12.2.6.4.2. func beforeHTMLIM(p *parser) bool { switch p.tok.Type { case DoctypeToken: @@ -517,7 +565,7 @@ func beforeHTMLIM(p *parser) bool { return false } -// Section 12.2.5.4.3. +// Section 12.2.6.4.3. func beforeHeadIM(p *parser) bool { switch p.tok.Type { case TextToken: @@ -560,7 +608,7 @@ func beforeHeadIM(p *parser) bool { return false } -// Section 12.2.5.4.4. +// Section 12.2.6.4.4. func inHeadIM(p *parser) bool { switch p.tok.Type { case TextToken: @@ -590,19 +638,41 @@ func inHeadIM(p *parser) bool { case a.Head: // Ignore the token. return true + case a.Template: + p.addElement() + p.afe = append(p.afe, &scopeMarker) + p.framesetOK = false + p.im = inTemplateIM + p.templateStack = append(p.templateStack, inTemplateIM) + return true } case EndTagToken: switch p.tok.DataAtom { case a.Head: - n := p.oe.pop() - if n.DataAtom != a.Head { - panic("html: bad parser state: element not found, in the in-head insertion mode") - } + p.oe.pop() p.im = afterHeadIM return true case a.Body, a.Html, a.Br: p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) return false + case a.Template: + if !p.oe.contains(a.Template) { + return true + } + // TODO: remove this divergence from the HTML5 spec. + // + // See https://bugs.chromium.org/p/chromium/issues/detail?id=829668 + p.generateImpliedEndTags() + for i := len(p.oe) - 1; i >= 0; i-- { + if n := p.oe[i]; n.Namespace == "" && n.DataAtom == a.Template { + p.oe = p.oe[:i] + break + } + } + p.clearActiveFormattingElements() + p.templateStack.pop() + p.resetInsertionMode() + return true default: // Ignore the token. return true @@ -622,7 +692,7 @@ func inHeadIM(p *parser) bool { return false } -// Section 12.2.5.4.6. +// Section 12.2.6.4.6. func afterHeadIM(p *parser) bool { switch p.tok.Type { case TextToken: @@ -648,7 +718,7 @@ func afterHeadIM(p *parser) bool { p.addElement() p.im = inFramesetIM return true - case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title: + case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title: p.oe = append(p.oe, p.head) defer p.oe.remove(p.head) return inHeadIM(p) @@ -660,6 +730,8 @@ func afterHeadIM(p *parser) bool { switch p.tok.DataAtom { case a.Body, a.Html, a.Br: // Drop down to creating an implied tag. + case a.Template: + return inHeadIM(p) default: // Ignore the token. return true @@ -697,7 +769,7 @@ func copyAttributes(dst *Node, src Token) { } } -// Section 12.2.5.4.7. +// Section 12.2.6.4.7. func inBodyIM(p *parser) bool { switch p.tok.Type { case TextToken: @@ -727,10 +799,16 @@ func inBodyIM(p *parser) bool { case StartTagToken: switch p.tok.DataAtom { case a.Html: + if p.oe.contains(a.Template) { + return true + } copyAttributes(p.oe[0], p.tok) - case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title: + case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title: return inHeadIM(p) case a.Body: + if p.oe.contains(a.Template) { + return true + } if len(p.oe) >= 2 { body := p.oe[1] if body.Type == ElementNode && body.DataAtom == a.Body { @@ -767,9 +845,13 @@ func inBodyIM(p *parser) bool { // The newline, if any, will be dealt with by the TextToken case. p.framesetOK = false case a.Form: - if p.form == nil { - p.popUntil(buttonScope, a.P) - p.addElement() + if p.form != nil && !p.oe.contains(a.Template) { + // Ignore the token + return true + } + p.popUntil(buttonScope, a.P) + p.addElement() + if !p.oe.contains(a.Template) { p.form = p.top() } case a.Li: @@ -819,7 +901,7 @@ func inBodyIM(p *parser) bool { case a.A: for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- { if n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A { - p.inBodyEndTagFormatting(a.A) + p.inBodyEndTagFormatting(a.A, "a") p.oe.remove(n) p.afe.remove(n) break @@ -833,7 +915,7 @@ func inBodyIM(p *parser) bool { case a.Nobr: p.reconstructActiveFormattingElements() if p.elementInScope(defaultScope, a.Nobr) { - p.inBodyEndTagFormatting(a.Nobr) + p.inBodyEndTagFormatting(a.Nobr, "nobr") p.reconstructActiveFormattingElements() } p.addFormattingElement() @@ -903,6 +985,14 @@ func inBodyIM(p *parser) bool { p.acknowledgeSelfClosingTag() p.popUntil(buttonScope, a.P) p.parseImpliedToken(StartTagToken, a.Form, a.Form.String()) + if p.form == nil { + // NOTE: The 'isindex' element has been removed, + // and the 'template' element has not been designed to be + // collaborative with the index element. + // + // Ignore the token. + return true + } if action != "" { p.form.Attr = []Attribute{{Key: "action", Val: action}} } @@ -952,11 +1042,16 @@ func inBodyIM(p *parser) bool { } p.reconstructActiveFormattingElements() p.addElement() - case a.Rp, a.Rt: + case a.Rb, a.Rtc: if p.elementInScope(defaultScope, a.Ruby) { p.generateImpliedEndTags() } p.addElement() + case a.Rp, a.Rt: + if p.elementInScope(defaultScope, a.Ruby) { + p.generateImpliedEndTags("rtc") + } + p.addElement() case a.Math, a.Svg: p.reconstructActiveFormattingElements() if p.tok.DataAtom == a.Math { @@ -993,15 +1088,29 @@ func inBodyIM(p *parser) bool { case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul: p.popUntil(defaultScope, p.tok.DataAtom) case a.Form: - node := p.form - p.form = nil - i := p.indexOfElementInScope(defaultScope, a.Form) - if node == nil || i == -1 || p.oe[i] != node { - // Ignore the token. - return true + if p.oe.contains(a.Template) { + i := p.indexOfElementInScope(defaultScope, a.Form) + if i == -1 { + // Ignore the token. + return true + } + p.generateImpliedEndTags() + if p.oe[i].DataAtom != a.Form { + // Ignore the token. + return true + } + p.popUntil(defaultScope, a.Form) + } else { + node := p.form + p.form = nil + i := p.indexOfElementInScope(defaultScope, a.Form) + if node == nil || i == -1 || p.oe[i] != node { + // Ignore the token. + return true + } + p.generateImpliedEndTags() + p.oe.remove(node) } - p.generateImpliedEndTags() - p.oe.remove(node) case a.P: if !p.elementInScope(buttonScope, a.P) { p.parseImpliedToken(StartTagToken, a.P, a.P.String()) @@ -1014,7 +1123,7 @@ func inBodyIM(p *parser) bool { case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6: p.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6) case a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U: - p.inBodyEndTagFormatting(p.tok.DataAtom) + p.inBodyEndTagFormatting(p.tok.DataAtom, p.tok.Data) case a.Applet, a.Marquee, a.Object: if p.popUntil(defaultScope, p.tok.DataAtom) { p.clearActiveFormattingElements() @@ -1022,20 +1131,37 @@ func inBodyIM(p *parser) bool { case a.Br: p.tok.Type = StartTagToken return false + case a.Template: + return inHeadIM(p) default: - p.inBodyEndTagOther(p.tok.DataAtom) + p.inBodyEndTagOther(p.tok.DataAtom, p.tok.Data) } case CommentToken: p.addChild(&Node{ Type: CommentNode, Data: p.tok.Data, }) + case ErrorToken: + // TODO: remove this divergence from the HTML5 spec. + if len(p.templateStack) > 0 { + p.im = inTemplateIM + return false + } else { + for _, e := range p.oe { + switch e.DataAtom { + case a.Dd, a.Dt, a.Li, a.Optgroup, a.Option, a.P, a.Rb, a.Rp, a.Rt, a.Rtc, a.Tbody, a.Td, a.Tfoot, a.Th, + a.Thead, a.Tr, a.Body, a.Html: + default: + return true + } + } + } } return true } -func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { +func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom, tagName string) { // This is the "adoption agency" algorithm, described at // https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency @@ -1057,7 +1183,7 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { } } if formattingElement == nil { - p.inBodyEndTagOther(tagAtom) + p.inBodyEndTagOther(tagAtom, tagName) return } feIndex := p.oe.index(formattingElement) @@ -1160,11 +1286,19 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { } // inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM. -// "Any other end tag" handling from 12.2.5.5 The rules for parsing tokens in foreign content +// "Any other end tag" handling from 12.2.6.5 The rules for parsing tokens in foreign content // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign -func (p *parser) inBodyEndTagOther(tagAtom a.Atom) { +func (p *parser) inBodyEndTagOther(tagAtom a.Atom, tagName string) { for i := len(p.oe) - 1; i >= 0; i-- { - if p.oe[i].DataAtom == tagAtom { + // Two element nodes have the same tag if they have the same Data (a + // string-typed field). As an optimization, for common HTML tags, each + // Data string is assigned a unique, non-zero DataAtom (a uint32-typed + // field), since integer comparison is faster than string comparison. + // Uncommon (custom) tags get a zero DataAtom. + // + // The if condition here is equivalent to (p.oe[i].Data == tagName). + if (p.oe[i].DataAtom == tagAtom) && + ((tagAtom != 0) || (p.oe[i].Data == tagName)) { p.oe = p.oe[:i] break } @@ -1174,7 +1308,7 @@ func (p *parser) inBodyEndTagOther(tagAtom a.Atom) { } } -// Section 12.2.5.4.8. +// Section 12.2.6.4.8. func textIM(p *parser) bool { switch p.tok.Type { case ErrorToken: @@ -1203,12 +1337,9 @@ func textIM(p *parser) bool { return p.tok.Type == EndTagToken } -// Section 12.2.5.4.9. +// Section 12.2.6.4.9. func inTableIM(p *parser) bool { switch p.tok.Type { - case ErrorToken: - // Stop parsing. - return true case TextToken: p.tok.Data = strings.Replace(p.tok.Data, "\x00", "", -1) switch p.oe.top().DataAtom { @@ -1249,7 +1380,7 @@ func inTableIM(p *parser) bool { } // Ignore the token. return true - case a.Style, a.Script: + case a.Style, a.Script, a.Template: return inHeadIM(p) case a.Input: for _, t := range p.tok.Attr { @@ -1261,7 +1392,7 @@ func inTableIM(p *parser) bool { } // Otherwise drop down to the default action. case a.Form: - if p.form != nil { + if p.oe.contains(a.Template) || p.form != nil { // Ignore the token. return true } @@ -1291,6 +1422,8 @@ func inTableIM(p *parser) bool { case a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr: // Ignore the token. return true + case a.Template: + return inHeadIM(p) } case CommentToken: p.addChild(&Node{ @@ -1301,6 +1434,8 @@ func inTableIM(p *parser) bool { case DoctypeToken: // Ignore the token. return true + case ErrorToken: + return inBodyIM(p) } p.fosterParenting = true @@ -1309,7 +1444,7 @@ func inTableIM(p *parser) bool { return inBodyIM(p) } -// Section 12.2.5.4.11. +// Section 12.2.6.4.11. func inCaptionIM(p *parser) bool { switch p.tok.Type { case StartTagToken: @@ -1355,7 +1490,7 @@ func inCaptionIM(p *parser) bool { return inBodyIM(p) } -// Section 12.2.5.4.12. +// Section 12.2.6.4.12. func inColumnGroupIM(p *parser) bool { switch p.tok.Type { case TextToken: @@ -1386,11 +1521,13 @@ func inColumnGroupIM(p *parser) bool { p.oe.pop() p.acknowledgeSelfClosingTag() return true + case a.Template: + return inHeadIM(p) } case EndTagToken: switch p.tok.DataAtom { case a.Colgroup: - if p.oe.top().DataAtom != a.Html { + if p.oe.top().DataAtom == a.Colgroup { p.oe.pop() p.im = inTableIM } @@ -1398,17 +1535,21 @@ func inColumnGroupIM(p *parser) bool { case a.Col: // Ignore the token. return true + case a.Template: + return inHeadIM(p) } + case ErrorToken: + return inBodyIM(p) } - if p.oe.top().DataAtom != a.Html { - p.oe.pop() - p.im = inTableIM - return false + if p.oe.top().DataAtom != a.Colgroup { + return true } - return true + p.oe.pop() + p.im = inTableIM + return false } -// Section 12.2.5.4.13. +// Section 12.2.6.4.13. func inTableBodyIM(p *parser) bool { switch p.tok.Type { case StartTagToken: @@ -1460,7 +1601,7 @@ func inTableBodyIM(p *parser) bool { return inTableIM(p) } -// Section 12.2.5.4.14. +// Section 12.2.6.4.14. func inRowIM(p *parser) bool { switch p.tok.Type { case StartTagToken: @@ -1511,7 +1652,7 @@ func inRowIM(p *parser) bool { return inTableIM(p) } -// Section 12.2.5.4.15. +// Section 12.2.6.4.15. func inCellIM(p *parser) bool { switch p.tok.Type { case StartTagToken: @@ -1560,12 +1701,9 @@ func inCellIM(p *parser) bool { return inBodyIM(p) } -// Section 12.2.5.4.16. +// Section 12.2.6.4.16. func inSelectIM(p *parser) bool { switch p.tok.Type { - case ErrorToken: - // Stop parsing. - return true case TextToken: p.addText(strings.Replace(p.tok.Data, "\x00", "", -1)) case StartTagToken: @@ -1586,8 +1724,12 @@ func inSelectIM(p *parser) bool { } p.addElement() case a.Select: - p.tok.Type = EndTagToken - return false + if p.popUntil(selectScope, a.Select) { + p.resetInsertionMode() + } else { + // Ignore the token. + return true + } case a.Input, a.Keygen, a.Textarea: if p.elementInScope(selectScope, a.Select) { p.parseImpliedToken(EndTagToken, a.Select, a.Select.String()) @@ -1597,7 +1739,7 @@ func inSelectIM(p *parser) bool { p.tokenizer.NextIsNotRawText() // Ignore the token. return true - case a.Script: + case a.Script, a.Template: return inHeadIM(p) } case EndTagToken: @@ -1617,7 +1759,12 @@ func inSelectIM(p *parser) bool { case a.Select: if p.popUntil(selectScope, a.Select) { p.resetInsertionMode() + } else { + // Ignore the token. + return true } + case a.Template: + return inHeadIM(p) } case CommentToken: p.addChild(&Node{ @@ -1627,30 +1774,107 @@ func inSelectIM(p *parser) bool { case DoctypeToken: // Ignore the token. return true + case ErrorToken: + return inBodyIM(p) } return true } -// Section 12.2.5.4.17. +// Section 12.2.6.4.17. func inSelectInTableIM(p *parser) bool { switch p.tok.Type { case StartTagToken, EndTagToken: switch p.tok.DataAtom { case a.Caption, a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr, a.Td, a.Th: - if p.tok.Type == StartTagToken || p.elementInScope(tableScope, p.tok.DataAtom) { - p.parseImpliedToken(EndTagToken, a.Select, a.Select.String()) - return false - } else { + if p.tok.Type == EndTagToken && !p.elementInScope(tableScope, p.tok.DataAtom) { // Ignore the token. return true } + // This is like p.popUntil(selectScope, a.Select), but it also + // matches , not just